ZGlmZiAtLWdpdCBhL0RlbW8vZW1iZWQvZGVtby5jIGIvRGVtby9lbWJlZC9kZW1vLmMKaW5kZXggNjAwNWYxMy4uNTViYzgwOCAxMDA2NDQKLS0tIGEvRGVtby9lbWJlZC9kZW1vLmMKKysrIGIvRGVtby9lbWJlZC9kZW1vLmMKQEAgLTYsNDAgKzYsNDAgQEAKIAogbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JLyogUGFzcyBhcmd2WzBdIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgKi8KLQlQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsKKyAgICAvKiBQYXNzIGFyZ3ZbMF0gdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlciAqLworICAgIFB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgUmVxdWlyZWQuICovCi0JUHlfSW5pdGlhbGl6ZSgpOworICAgIC8qIEluaXRpYWxpemUgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4gIFJlcXVpcmVkLiAqLworICAgIFB5X0luaXRpYWxpemUoKTsKIAotCS8qIEFkZCBhIHN0YXRpYyBtb2R1bGUgKi8KLQlpbml0eHl6enkoKTsKKyAgICAvKiBBZGQgYSBzdGF0aWMgbW9kdWxlICovCisgICAgaW5pdHh5enp5KCk7CiAKLQkvKiBEZWZpbmUgc3lzLmFyZ3YuICBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gaWYgeW91Ci0JICAgd2FudCB0aGlzOyB5b3UgY2FuIGFsc28gbGV0IGl0IHVuZGVmaW5lZCAoc2luY2UgdGhlIFB5dGhvbiAKLQkgICBjb2RlIGlzIGdlbmVyYWxseSBub3QgYSBtYWluIHByb2dyYW0gaXQgaGFzIG5vIGJ1c2luZXNzCi0JICAgdG91Y2hpbmcgc3lzLmFyZ3YuLi4pICovCi0JUHlTeXNfU2V0QXJndihhcmdjLCBhcmd2KTsKKyAgICAvKiBEZWZpbmUgc3lzLmFyZ3YuICBJdCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gaWYgeW91CisgICAgICAgd2FudCB0aGlzOyB5b3UgY2FuIGFsc28gbGV0IGl0IHVuZGVmaW5lZCAoc2luY2UgdGhlIFB5dGhvbgorICAgICAgIGNvZGUgaXMgZ2VuZXJhbGx5IG5vdCBhIG1haW4gcHJvZ3JhbSBpdCBoYXMgbm8gYnVzaW5lc3MKKyAgICAgICB0b3VjaGluZyBzeXMuYXJndi4uLikgKi8KKyAgICBQeVN5c19TZXRBcmd2KGFyZ2MsIGFyZ3YpOwogCi0JLyogRG8gc29tZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBjb2RlICovCi0JcHJpbnRmKCJIZWxsbywgYnJhdmUgbmV3IHdvcmxkXG5cbiIpOworICAgIC8qIERvIHNvbWUgYXBwbGljYXRpb24gc3BlY2lmaWMgY29kZSAqLworICAgIHByaW50ZigiSGVsbG8sIGJyYXZlIG5ldyB3b3JsZFxuXG4iKTsKIAotCS8qIEV4ZWN1dGUgc29tZSBQeXRob24gc3RhdGVtZW50cyAoaW4gbW9kdWxlIF9fbWFpbl9fKSAqLwotCVB5UnVuX1NpbXBsZVN0cmluZygiaW1wb3J0IHN5c1xuIik7Ci0JUHlSdW5fU2ltcGxlU3RyaW5nKCJwcmludCBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXNcbiIpOwotCVB5UnVuX1NpbXBsZVN0cmluZygicHJpbnQgc3lzLm1vZHVsZXMua2V5cygpXG4iKTsKLQlQeVJ1bl9TaW1wbGVTdHJpbmcoInByaW50IHN5cy5leGVjdXRhYmxlXG4iKTsKLQlQeVJ1bl9TaW1wbGVTdHJpbmcoInByaW50IHN5cy5hcmd2XG4iKTsKKyAgICAvKiBFeGVjdXRlIHNvbWUgUHl0aG9uIHN0YXRlbWVudHMgKGluIG1vZHVsZSBfX21haW5fXykgKi8KKyAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoImltcG9ydCBzeXNcbiIpOworICAgIFB5UnVuX1NpbXBsZVN0cmluZygicHJpbnQgc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzXG4iKTsKKyAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoInByaW50IHN5cy5tb2R1bGVzLmtleXMoKVxuIik7CisgICAgUHlSdW5fU2ltcGxlU3RyaW5nKCJwcmludCBzeXMuZXhlY3V0YWJsZVxuIik7CisgICAgUHlSdW5fU2ltcGxlU3RyaW5nKCJwcmludCBzeXMuYXJndlxuIik7CiAKLQkvKiBOb3RlIHRoYXQgeW91IGNhbiBjYWxsIGFueSBwdWJsaWMgZnVuY3Rpb24gb2YgdGhlIFB5dGhvbgotCSAgIGludGVycHJldGVyIGhlcmUsIGUuZy4gY2FsbF9vYmplY3QoKS4gKi8KKyAgICAvKiBOb3RlIHRoYXQgeW91IGNhbiBjYWxsIGFueSBwdWJsaWMgZnVuY3Rpb24gb2YgdGhlIFB5dGhvbgorICAgICAgIGludGVycHJldGVyIGhlcmUsIGUuZy4gY2FsbF9vYmplY3QoKS4gKi8KIAotCS8qIFNvbWUgbW9yZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBjb2RlICovCi0JcHJpbnRmKCJcbkdvb2RieWUsIGNydWVsIHdvcmxkXG4iKTsKKyAgICAvKiBTb21lIG1vcmUgYXBwbGljYXRpb24gc3BlY2lmaWMgY29kZSAqLworICAgIHByaW50ZigiXG5Hb29kYnllLCBjcnVlbCB3b3JsZFxuIik7CiAKLQkvKiBFeGl0LCBjbGVhbmluZyB1cCB0aGUgaW50ZXJwcmV0ZXIgKi8KLQlQeV9FeGl0KDApOwotCS8qTk9UUkVBQ0hFRCovCisgICAgLyogRXhpdCwgY2xlYW5pbmcgdXAgdGhlIGludGVycHJldGVyICovCisgICAgUHlfRXhpdCgwKTsKKyAgICAvKk5PVFJFQUNIRUQqLwogfQogCiAvKiBBIHN0YXRpYyBtb2R1bGUgKi8KQEAgLTQ4LDE4ICs0OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHh5enp5X2ZvbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKDQyTCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDQyTCk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB4eXp6eV9tZXRob2RzW10gPSB7Ci0JeyJmb28iLAkJeHl6enlfZm9vLAlNRVRIX05PQVJHUywKLQkgIlJldHVybiB0aGUgbWVhbmluZyBvZiBldmVyeXRoaW5nLiJ9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJmb28iLCAgICAgICAgICAgICB4eXp6eV9mb28sICAgICAgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm4gdGhlIG1lYW5pbmcgb2YgZXZlcnl0aGluZy4ifSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogdm9pZAogaW5pdHh5enp5KHZvaWQpCiB7Ci0JUHlJbXBvcnRfQWRkTW9kdWxlKCJ4eXp6eSIpOwotCVB5X0luaXRNb2R1bGUoInh5enp5IiwgeHl6enlfbWV0aG9kcyk7CisgICAgUHlJbXBvcnRfQWRkTW9kdWxlKCJ4eXp6eSIpOworICAgIFB5X0luaXRNb2R1bGUoInh5enp5IiwgeHl6enlfbWV0aG9kcyk7CiB9CmRpZmYgLS1naXQgYS9EZW1vL2VtYmVkL2xvb3AuYyBiL0RlbW8vZW1iZWQvbG9vcC5jCmluZGV4IGQ1YWY4MjkuLjJmN2ZlNjIgMTAwNjQ0Ci0tLSBhL0RlbW8vZW1iZWQvbG9vcC5jCisrKyBiL0RlbW8vZW1iZWQvbG9vcC5jCkBAIC02LDI4ICs2LDI4IEBACiAKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWludCBjb3VudCA9IC0xOwotCWNoYXIgKmNvbW1hbmQ7CisgICAgaW50IGNvdW50ID0gLTE7CisgICAgY2hhciAqY29tbWFuZDsKIAotCWlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgewotCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBsb29wIDxweXRob24tY29tbWFuZD4gW2NvdW50XVxuIik7Ci0JCWV4aXQoMik7Ci0JfQotCWNvbW1hbmQgPSBhcmd2WzFdOworICAgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBsb29wIDxweXRob24tY29tbWFuZD4gW2NvdW50XVxuIik7CisgICAgICAgIGV4aXQoMik7CisgICAgfQorICAgIGNvbW1hbmQgPSBhcmd2WzFdOwogCi0JaWYgKGFyZ2MgPT0gMykgewotCQljb3VudCA9IGF0b2koYXJndlsyXSk7Ci0JfQorICAgIGlmIChhcmdjID09IDMpIHsKKyAgICAgICAgY291bnQgPSBhdG9pKGFyZ3ZbMl0pOworICAgIH0KIAotCVB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOworICAgIFB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOwogCi0JLyogdW5jb21tZW50IHRoaXMgaWYgeW91IGRvbid0IHdhbnQgdG8gbG9hZCBzaXRlLnB5ICovCi0JLyogUHlfTm9TaXRlRmxhZyA9IDE7ICovCisgICAgLyogdW5jb21tZW50IHRoaXMgaWYgeW91IGRvbid0IHdhbnQgdG8gbG9hZCBzaXRlLnB5ICovCisgICAgLyogUHlfTm9TaXRlRmxhZyA9IDE7ICovCiAKLQl3aGlsZSAoY291bnQgPT0gLTEgfHwgLS1jb3VudCA+PSAwICkgewotCQlQeV9Jbml0aWFsaXplKCk7Ci0JCVB5UnVuX1NpbXBsZVN0cmluZyhjb21tYW5kKTsKLQkJUHlfRmluYWxpemUoKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgd2hpbGUgKGNvdW50ID09IC0xIHx8IC0tY291bnQgPj0gMCApIHsKKyAgICAgICAgUHlfSW5pdGlhbGl6ZSgpOworICAgICAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoY29tbWFuZCk7CisgICAgICAgIFB5X0ZpbmFsaXplKCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvRGVtby9weXN2ci9weXN2ci5jIGIvRGVtby9weXN2ci9weXN2ci5jCmluZGV4IGNjZWQ2ZGEuLjcwNmNkMmEgMTAwNjQ0Ci0tLSBhL0RlbW8vcHlzdnIvcHlzdnIuYworKysgYi9EZW1vL3B5c3ZyL3B5c3ZyLmMKQEAgLTM0LDggKzM0LDggQEAKICNlbmRpZgogCiBzdHJ1Y3Qgd29ya29yZGVyIHsKLQlpbnQgY29ubjsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgICBpbnQgY29ubjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKIH07CiAKIC8qIEZvcndhcmQgKi8KQEAgLTU1LDQwICs1NSw0MCBAQAogCiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlpbnQgcG9ydCA9IFBPUlQ7Ci0JaW50IGM7CisgICAgaW50IHBvcnQgPSBQT1JUOworICAgIGludCBjOwogCi0JaWYgKGFyZ2MgPiAwICYmIGFyZ3ZbMF0gIT0gTlVMTCAmJiBhcmd2WzBdWzBdICE9ICdcMCcpCi0JCXByb2duYW1lID0gYXJndlswXTsKKyAgICBpZiAoYXJnYyA+IDAgJiYgYXJndlswXSAhPSBOVUxMICYmIGFyZ3ZbMF1bMF0gIT0gJ1wwJykKKyAgICAgICAgcHJvZ25hbWUgPSBhcmd2WzBdOwogCi0Jd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ2IikpICE9IEVPRikgewotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAndic6Ci0JCQlQeV9WZXJib3NlRmxhZysrOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl1c2FnZSgpOwotCQl9Ci0JfQorICAgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAidiIpKSAhPSBFT0YpIHsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJ3YnOgorICAgICAgICAgICAgUHlfVmVyYm9zZUZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChvcHRpbmQgPCBhcmdjKSB7Ci0JCWlmIChvcHRpbmQrMSA8IGFyZ2MpIHsKLQkJCW9wcm9nbmFtZSgpOwotCQkJZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOwotCQkJdXNhZ2UoKTsKLQkJfQotCQlwb3J0ID0gYXRvaShhcmd2W29wdGluZF0pOwotCQlpZiAocG9ydCA8PSAwKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImJhZCBwb3J0ICglcylcbiIsIGFyZ3Zbb3B0aW5kXSk7Ci0JCQl1c2FnZSgpOwotCQl9Ci0JfQorICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGlmIChvcHRpbmQrMSA8IGFyZ2MpIHsKKyAgICAgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJ0b28gbWFueSBhcmd1bWVudHNcbiIpOworICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBwb3J0ID0gYXRvaShhcmd2W29wdGluZF0pOworICAgICAgICBpZiAocG9ydCA8PSAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBwb3J0ICglcylcbiIsIGFyZ3Zbb3B0aW5kXSk7CisgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgfQogCi0JbWFpbl90aHJlYWQocG9ydCk7CisgICAgbWFpbl90aHJlYWQocG9ydCk7CiAKLQlmcHJpbnRmKHN0ZGVyciwgIkJ5ZS5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiQnllLlxuIik7CiAKLQlleGl0KDApOworICAgIGV4aXQoMCk7CiB9CiAKIHN0YXRpYyBjaGFyIHVzYWdlX2xpbmVbXSA9ICJ1c2FnZTogJXMgW3BvcnRdXG4iOwpAQCAtOTYsMTIwICs5NiwxMjAgQEAKIHN0YXRpYyB2b2lkCiB1c2FnZSh2b2lkKQogewotCWZwcmludGYoc3RkZXJyLCB1c2FnZV9saW5lLCBwcm9nbmFtZSk7Ci0JZXhpdCgyKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgdXNhZ2VfbGluZSwgcHJvZ25hbWUpOworICAgIGV4aXQoMik7CiB9CiAKIHN0YXRpYyB2b2lkCiBtYWluX3RocmVhZChpbnQgcG9ydCkKIHsKLQlpbnQgc29jaywgY29ubiwgc2l6ZSwgaTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciwgY2xpZW50YWRkcjsKKyAgICBpbnQgc29jaywgY29ubiwgc2l6ZSwgaTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciwgY2xpZW50YWRkcjsKIAotCXNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOwotCWlmIChzb2NrIDwgMCkgewotCQlvcHJvZ25hbWUoKTsKLQkJcGVycm9yKCJjYW4ndCBjcmVhdGUgc29ja2V0Iik7Ci0JCWV4aXQoMSk7Ci0JfQorICAgIHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOworICAgIGlmIChzb2NrIDwgMCkgeworICAgICAgICBvcHJvZ25hbWUoKTsKKyAgICAgICAgcGVycm9yKCJjYW4ndCBjcmVhdGUgc29ja2V0Iik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQogCiAjaWZkZWYgU09fUkVVU0VBRERSCi0JaSA9IDE7Ci0Jc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopICZpLCBzaXplb2YgaSk7CisgICAgaSA9IDE7CisgICAgc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopICZpLCBzaXplb2YgaSk7CiAjZW5kaWYKIAotCW1lbXNldCgoY2hhciAqKSZhZGRyLCAnXDAnLCBzaXplb2YgYWRkcik7Ci0JYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0JYWRkci5zaW5fYWRkci5zX2FkZHIgPSAwTDsKLQlpZiAoYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZiBhZGRyKSA8IDApIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgYmluZCBzb2NrZXQgdG8gYWRkcmVzcyIpOwotCQlleGl0KDEpOwotCX0KKyAgICBtZW1zZXQoKGNoYXIgKikmYWRkciwgJ1wwJywgc2l6ZW9mIGFkZHIpOworICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gMEw7CisgICAgaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YgYWRkcikgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGJpbmQgc29ja2V0IHRvIGFkZHJlc3MiKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CiAKLQlpZiAobGlzdGVuKHNvY2ssIDUpIDwgMCkgewotCQlvcHJvZ25hbWUoKTsKLQkJcGVycm9yKCJjYW4ndCBsaXN0ZW4gb24gc29ja2V0Iik7Ci0JCWV4aXQoMSk7Ci0JfQorICAgIGlmIChsaXN0ZW4oc29jaywgNSkgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGxpc3RlbiBvbiBzb2NrZXQiKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CiAKLQlmcHJpbnRmKHN0ZGVyciwgIkxpc3RlbmluZyBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3RlbmluZyBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKIAotCWZvciAoaSA9IDA7IDsgaSsrKSB7Ci0JCXNpemUgPSBzaXplb2YgY2xpZW50YWRkcjsKLQkJbWVtc2V0KChjaGFyICopICZjbGllbnRhZGRyLCAnXDAnLCBzaXplKTsKLQkJY29ubiA9IGFjY2VwdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZjbGllbnRhZGRyLCAmc2l6ZSk7Ci0JCWlmIChjb25uIDwgMCkgewotCQkJb3Byb2duYW1lKCk7Ci0JCQlwZXJyb3IoImNhbid0IGFjY2VwdCBjb25uZWN0aW9uIGZyb20gc29ja2V0Iik7Ci0JCQlleGl0KDEpOwotCQl9CisgICAgZm9yIChpID0gMDsgOyBpKyspIHsKKyAgICAgICAgc2l6ZSA9IHNpemVvZiBjbGllbnRhZGRyOworICAgICAgICBtZW1zZXQoKGNoYXIgKikgJmNsaWVudGFkZHIsICdcMCcsIHNpemUpOworICAgICAgICBjb25uID0gYWNjZXB0KHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNsaWVudGFkZHIsICZzaXplKTsKKyAgICAgICAgaWYgKGNvbm4gPCAwKSB7CisgICAgICAgICAgICBvcHJvZ25hbWUoKTsKKyAgICAgICAgICAgIHBlcnJvcigiY2FuJ3QgYWNjZXB0IGNvbm5lY3Rpb24gZnJvbSBzb2NrZXQiKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KIAotCQlzaXplID0gc2l6ZW9mIGFkZHI7Ci0JCW1lbXNldCgoY2hhciAqKSAmYWRkciwgJ1wwJywgc2l6ZSk7Ci0JCWlmIChnZXRzb2NrbmFtZShjb25uLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsICZzaXplKSA8IDApIHsKLQkJCW9wcm9nbmFtZSgpOwotCQkJcGVycm9yKCJjYW4ndCBnZXQgc29ja2V0IG5hbWUgb2YgY29ubmVjdGlvbiIpOwotCQkJZXhpdCgxKTsKLQkJfQotCQlpZiAoY2xpZW50YWRkci5zaW5fYWRkci5zX2FkZHIgIT0gYWRkci5zaW5fYWRkci5zX2FkZHIpIHsKLQkJCW9wcm9nbmFtZSgpOwotCQkJcGVycm9yKCJjb25uZWN0aW9uIGZyb20gbm9uLWxvY2FsIGhvc3QgcmVmdXNlZCIpOwotCQkJZnByaW50ZihzdGRlcnIsICIoYWRkcj0lbHgsIGNsaWVudGFkZHI9JWx4KVxuIiwKLQkJCQludG9obChhZGRyLnNpbl9hZGRyLnNfYWRkciksCi0JCQkJbnRvaGwoY2xpZW50YWRkci5zaW5fYWRkci5zX2FkZHIpKTsKLQkJCWNsb3NlKGNvbm4pOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKGkgPT0gNCkgewotCQkJY2xvc2UoY29ubik7Ci0JCQlicmVhazsKLQkJfQotCQljcmVhdGVfdGhyZWFkKGNvbm4sICZjbGllbnRhZGRyKTsKLQl9CisgICAgICAgIHNpemUgPSBzaXplb2YgYWRkcjsKKyAgICAgICAgbWVtc2V0KChjaGFyICopICZhZGRyLCAnXDAnLCBzaXplKTsKKyAgICAgICAgaWYgKGdldHNvY2tuYW1lKGNvbm4sIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgJnNpemUpIDwgMCkgeworICAgICAgICAgICAgb3Byb2duYW1lKCk7CisgICAgICAgICAgICBwZXJyb3IoImNhbid0IGdldCBzb2NrZXQgbmFtZSBvZiBjb25uZWN0aW9uIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnRhZGRyLnNpbl9hZGRyLnNfYWRkciAhPSBhZGRyLnNpbl9hZGRyLnNfYWRkcikgeworICAgICAgICAgICAgb3Byb2duYW1lKCk7CisgICAgICAgICAgICBwZXJyb3IoImNvbm5lY3Rpb24gZnJvbSBub24tbG9jYWwgaG9zdCByZWZ1c2VkIik7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIihhZGRyPSVseCwgY2xpZW50YWRkcj0lbHgpXG4iLAorICAgICAgICAgICAgICAgIG50b2hsKGFkZHIuc2luX2FkZHIuc19hZGRyKSwKKyAgICAgICAgICAgICAgICBudG9obChjbGllbnRhZGRyLnNpbl9hZGRyLnNfYWRkcikpOworICAgICAgICAgICAgY2xvc2UoY29ubik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSA0KSB7CisgICAgICAgICAgICBjbG9zZShjb25uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNyZWF0ZV90aHJlYWQoY29ubiwgJmNsaWVudGFkZHIpOworICAgIH0KIAotCWNsb3NlKHNvY2spOworICAgIGNsb3NlKHNvY2spOwogCi0JaWYgKGd0c3RhdGUpIHsKLQkJUHlFdmFsX0FjcXVpcmVUaHJlYWQoZ3RzdGF0ZSk7Ci0JCWd0c3RhdGUgPSBOVUxMOwotCQlQeV9GaW5hbGl6ZSgpOwotCQkvKiBBbmQgYSBzZWNvbmQgdGltZSwganVzdCBiZWNhdXNlIHdlIGNhbi4gKi8KLQkJUHlfRmluYWxpemUoKTsgLyogVGhpcyBzaG91bGQgYmUgaGFybWxlc3MuICovCi0JfQotCWV4aXQoMCk7CisgICAgaWYgKGd0c3RhdGUpIHsKKyAgICAgICAgUHlFdmFsX0FjcXVpcmVUaHJlYWQoZ3RzdGF0ZSk7CisgICAgICAgIGd0c3RhdGUgPSBOVUxMOworICAgICAgICBQeV9GaW5hbGl6ZSgpOworICAgICAgICAvKiBBbmQgYSBzZWNvbmQgdGltZSwganVzdCBiZWNhdXNlIHdlIGNhbi4gKi8KKyAgICAgICAgUHlfRmluYWxpemUoKTsgLyogVGhpcyBzaG91bGQgYmUgaGFybWxlc3MuICovCisgICAgfQorICAgIGV4aXQoMCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBjcmVhdGVfdGhyZWFkKGludCBjb25uLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIpCiB7Ci0Jc3RydWN0IHdvcmtvcmRlciAqd29yazsKLQlwdGhyZWFkX3QgdGRhdGE7CisgICAgc3RydWN0IHdvcmtvcmRlciAqd29yazsKKyAgICBwdGhyZWFkX3QgdGRhdGE7CiAKLQl3b3JrID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd29ya29yZGVyKSk7Ci0JaWYgKHdvcmsgPT0gTlVMTCkgewotCQlvcHJvZ25hbWUoKTsKLQkJZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5IGZvciB0aHJlYWQuXG4iKTsKLQkJY2xvc2UoY29ubik7Ci0JCXJldHVybjsKLQl9Ci0Jd29yay0+Y29ubiA9IGNvbm47Ci0Jd29yay0+YWRkciA9ICphZGRyOworICAgIHdvcmsgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB3b3Jrb3JkZXIpKTsKKyAgICBpZiAod29yayA9PSBOVUxMKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnkgZm9yIHRocmVhZC5cbiIpOworICAgICAgICBjbG9zZShjb25uKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3b3JrLT5jb25uID0gY29ubjsKKyAgICB3b3JrLT5hZGRyID0gKmFkZHI7CiAKLQlpbml0X3B5dGhvbigpOworICAgIGluaXRfcHl0aG9uKCk7CiAKLQlpZiAocHRocmVhZF9jcmVhdGUoJnRkYXRhLCBOVUxMLCAodm9pZCAqKXNlcnZpY2VfdGhyZWFkLCB3b3JrKSA8IDApIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgY3JlYXRlIG5ldyB0aHJlYWQiKTsKLQkJY2xvc2UoY29ubik7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0ZGF0YSwgTlVMTCwgKHZvaWQgKilzZXJ2aWNlX3RocmVhZCwgd29yaykgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGNyZWF0ZSBuZXcgdGhyZWFkIik7CisgICAgICAgIGNsb3NlKGNvbm4pOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JaWYgKHB0aHJlYWRfZGV0YWNoKHRkYXRhKSA8IDApIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgZGV0YWNoIGZyb20gdGhyZWFkIik7Ci0JfQorICAgIGlmIChwdGhyZWFkX2RldGFjaCh0ZGF0YSkgPCAwKSB7CisgICAgICAgIG9wcm9nbmFtZSgpOworICAgICAgICBwZXJyb3IoImNhbid0IGRldGFjaCBmcm9tIHRocmVhZCIpOworICAgIH0KIH0KIAogc3RhdGljIFB5VGhyZWFkU3RhdGUgKnRoZV90c3RhdGU7CkBAIC0yMTksMTUyICsyMTksMTUyIEBACiBzdGF0aWMgdm9pZAogaW5pdF9weXRob24odm9pZCkKIHsKLQlpZiAoZ3RzdGF0ZSkKLQkJcmV0dXJuOwotCVB5X0luaXRpYWxpemUoKTsgLyogSW5pdGlhbGl6ZSB0aGUgaW50ZXJwcmV0ZXIgKi8KLQlQeUV2YWxfSW5pdFRocmVhZHMoKTsgLyogQ3JlYXRlIChhbmQgYWNxdWlyZSkgdGhlIGludGVycHJldGVyIGxvY2sgKi8KLQlndHN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsgLyogUmVsZWFzZSB0aGUgdGhyZWFkIHN0YXRlICovCisgICAgaWYgKGd0c3RhdGUpCisgICAgICAgIHJldHVybjsKKyAgICBQeV9Jbml0aWFsaXplKCk7IC8qIEluaXRpYWxpemUgdGhlIGludGVycHJldGVyICovCisgICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7IC8qIENyZWF0ZSAoYW5kIGFjcXVpcmUpIHRoZSBpbnRlcnByZXRlciBsb2NrICovCisgICAgZ3RzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7IC8qIFJlbGVhc2UgdGhlIHRocmVhZCBzdGF0ZSAqLwogfQogCiBzdGF0aWMgdm9pZCAqCiBzZXJ2aWNlX3RocmVhZChzdHJ1Y3Qgd29ya29yZGVyICp3b3JrKQogewotCUZJTEUgKmlucHV0LCAqb3V0cHV0OworICAgIEZJTEUgKmlucHV0LCAqb3V0cHV0OwogCi0JZnByaW50ZihzdGRlcnIsICJTdGFydCB0aHJlYWQgZm9yIGNvbm5lY3Rpb24gJWQuXG4iLCB3b3JrLT5jb25uKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlN0YXJ0IHRocmVhZCBmb3IgY29ubmVjdGlvbiAlZC5cbiIsIHdvcmstPmNvbm4pOwogCi0JcHMoKTsKKyAgICBwcygpOwogCi0JaW5wdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInIiKTsKLQlpZiAoaW5wdXQgPT0gTlVMTCkgewotCQlvcHJvZ25hbWUoKTsKLQkJcGVycm9yKCJjYW4ndCBjcmVhdGUgaW5wdXQgc3RyZWFtIik7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgaW5wdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInIiKTsKKyAgICBpZiAoaW5wdXQgPT0gTlVMTCkgeworICAgICAgICBvcHJvZ25hbWUoKTsKKyAgICAgICAgcGVycm9yKCJjYW4ndCBjcmVhdGUgaW5wdXQgc3RyZWFtIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQlvdXRwdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInciKTsKLQlpZiAob3V0cHV0ID09IE5VTEwpIHsKLQkJb3Byb2duYW1lKCk7Ci0JCXBlcnJvcigiY2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0iKTsKLQkJZmNsb3NlKGlucHV0KTsKLQkJZ290byBkb25lOwotCX0KKyAgICBvdXRwdXQgPSBmZG9wZW4od29yay0+Y29ubiwgInciKTsKKyAgICBpZiAob3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgb3Byb2duYW1lKCk7CisgICAgICAgIHBlcnJvcigiY2FuJ3QgY3JlYXRlIG91dHB1dCBzdHJlYW0iKTsKKyAgICAgICAgZmNsb3NlKGlucHV0KTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KIAotCXNldHZidWYoaW5wdXQsIE5VTEwsIF9JT05CRiwgMCk7Ci0Jc2V0dmJ1ZihvdXRwdXQsIE5VTEwsIF9JT05CRiwgMCk7CisgICAgc2V0dmJ1ZihpbnB1dCwgTlVMTCwgX0lPTkJGLCAwKTsKKyAgICBzZXR2YnVmKG91dHB1dCwgTlVMTCwgX0lPTkJGLCAwKTsKIAotCXJ1bl9pbnRlcnByZXRlcihpbnB1dCwgb3V0cHV0KTsKKyAgICBydW5faW50ZXJwcmV0ZXIoaW5wdXQsIG91dHB1dCk7CiAKLQlmY2xvc2UoaW5wdXQpOwotCWZjbG9zZShvdXRwdXQpOworICAgIGZjbG9zZShpbnB1dCk7CisgICAgZmNsb3NlKG91dHB1dCk7CiAKICAgZG9uZToKLQlmcHJpbnRmKHN0ZGVyciwgIkVuZCB0aHJlYWQgZm9yIGNvbm5lY3Rpb24gJWQuXG4iLCB3b3JrLT5jb25uKTsKLQljbG9zZSh3b3JrLT5jb25uKTsKLQlmcmVlKHdvcmspOworICAgIGZwcmludGYoc3RkZXJyLCAiRW5kIHRocmVhZCBmb3IgY29ubmVjdGlvbiAlZC5cbiIsIHdvcmstPmNvbm4pOworICAgIGNsb3NlKHdvcmstPmNvbm4pOworICAgIGZyZWUod29yayk7CiB9CiAKIHN0YXRpYyB2b2lkCiBvcHJvZ25hbWUodm9pZCkKIHsKLQlpbnQgc2F2ZSA9IGVycm5vOwotCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2duYW1lKTsKLQllcnJubyA9IHNhdmU7CisgICAgaW50IHNhdmUgPSBlcnJubzsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSk7CisgICAgZXJybm8gPSBzYXZlOwogfQogCiBzdGF0aWMgdm9pZAogcnVuX2ludGVycHJldGVyKEZJTEUgKmlucHV0LCBGSUxFICpvdXRwdXQpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwotCVB5T2JqZWN0ICpuZXdfc3RkaW4sICpuZXdfc3Rkb3V0OwotCVB5T2JqZWN0ICptYWlubW9kLCAqZ2xvYmFsczsKLQljaGFyIGJ1ZmZlclsxMDAwXTsKLQljaGFyICpwLCAqcTsKLQlpbnQgbiwgZW5kOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeU9iamVjdCAqbmV3X3N0ZGluLCAqbmV3X3N0ZG91dDsKKyAgICBQeU9iamVjdCAqbWFpbm1vZCwgKmdsb2JhbHM7CisgICAgY2hhciBidWZmZXJbMTAwMF07CisgICAgY2hhciAqcCwgKnE7CisgICAgaW50IG4sIGVuZDsKIAotCVB5RXZhbF9BY3F1aXJlTG9jaygpOwotCXRzdGF0ZSA9IFB5X05ld0ludGVycHJldGVyKCk7Ci0JaWYgKHRzdGF0ZSA9PSBOVUxMKSB7Ci0JCWZwcmludGYob3V0cHV0LCAiU29ycnkgLS0gY2FuJ3QgY3JlYXRlIGFuIGludGVycHJldGVyXG4iKTsKLQkJcmV0dXJuOwotCX0KKyAgICBQeUV2YWxfQWNxdWlyZUxvY2soKTsKKyAgICB0c3RhdGUgPSBQeV9OZXdJbnRlcnByZXRlcigpOworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKG91dHB1dCwgIlNvcnJ5IC0tIGNhbid0IGNyZWF0ZSBhbiBpbnRlcnByZXRlclxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQltYWlubW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwotCWdsb2JhbHMgPSBQeU1vZHVsZV9HZXREaWN0KG1haW5tb2QpOwotCVB5X0lOQ1JFRihnbG9iYWxzKTsKKyAgICBtYWlubW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOworICAgIGdsb2JhbHMgPSBQeU1vZHVsZV9HZXREaWN0KG1haW5tb2QpOworICAgIFB5X0lOQ1JFRihnbG9iYWxzKTsKIAotCW5ld19zdGRpbiA9IFB5RmlsZV9Gcm9tRmlsZShpbnB1dCwgIjxzb2NrZXQtaW4+IiwgInIiLCBOVUxMKTsKLQluZXdfc3Rkb3V0ID0gUHlGaWxlX0Zyb21GaWxlKG91dHB1dCwgIjxzb2NrZXQtb3V0PiIsICJ3IiwgTlVMTCk7CisgICAgbmV3X3N0ZGluID0gUHlGaWxlX0Zyb21GaWxlKGlucHV0LCAiPHNvY2tldC1pbj4iLCAiciIsIE5VTEwpOworICAgIG5ld19zdGRvdXQgPSBQeUZpbGVfRnJvbUZpbGUob3V0cHV0LCAiPHNvY2tldC1vdXQ+IiwgInciLCBOVUxMKTsKIAotCVB5U3lzX1NldE9iamVjdCgic3RkaW4iLCBuZXdfc3RkaW4pOwotCVB5U3lzX1NldE9iamVjdCgic3Rkb3V0IiwgbmV3X3N0ZG91dCk7Ci0JUHlTeXNfU2V0T2JqZWN0KCJzdGRlcnIiLCBuZXdfc3Rkb3V0KTsKKyAgICBQeVN5c19TZXRPYmplY3QoInN0ZGluIiwgbmV3X3N0ZGluKTsKKyAgICBQeVN5c19TZXRPYmplY3QoInN0ZG91dCIsIG5ld19zdGRvdXQpOworICAgIFB5U3lzX1NldE9iamVjdCgic3RkZXJyIiwgbmV3X3N0ZG91dCk7CiAKLQlmb3IgKG4gPSAxOyAhUHlFcnJfT2NjdXJyZWQoKTsgbisrKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnByaW50ZihvdXRwdXQsICIlZD4gIiwgbik7Ci0JCXAgPSBmZ2V0cyhidWZmZXIsIHNpemVvZiBidWZmZXIsIGlucHV0KTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBmb3IgKG4gPSAxOyAhUHlFcnJfT2NjdXJyZWQoKTsgbisrKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZnByaW50ZihvdXRwdXQsICIlZD4gIiwgbik7CisgICAgICAgIHAgPSBmZ2V0cyhidWZmZXIsIHNpemVvZiBidWZmZXIsIGlucHV0KTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCQlpZiAocCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWlmIChwWzBdID09ICdcMzc3JyAmJiBwWzFdID09ICdcMzU0JykKLQkJCWJyZWFrOworICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChwWzBdID09ICdcMzc3JyAmJiBwWzFdID09ICdcMzU0JykKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCXEgPSBzdHJyY2hyKHAsICdccicpOwotCQlpZiAocSAmJiBxWzFdID09ICdcbicgJiYgcVsyXSA9PSAnXDAnKSB7Ci0JCQkqcSsrID0gJ1xuJzsKLQkJCSpxKysgPSAnXDAnOwotCQl9CisgICAgICAgIHEgPSBzdHJyY2hyKHAsICdccicpOworICAgICAgICBpZiAocSAmJiBxWzFdID09ICdcbicgJiYgcVsyXSA9PSAnXDAnKSB7CisgICAgICAgICAgICAqcSsrID0gJ1xuJzsKKyAgICAgICAgICAgICpxKysgPSAnXDAnOworICAgICAgICB9CiAKLQkJd2hpbGUgKCpwICYmIGlzc3BhY2UoKnApKQotCQkJcCsrOwotCQlpZiAocFswXSA9PSAnIycgfHwgcFswXSA9PSAnXDAnKQotCQkJY29udGludWU7CisgICAgICAgIHdoaWxlICgqcCAmJiBpc3NwYWNlKCpwKSkKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgaWYgKHBbMF0gPT0gJyMnIHx8IHBbMF0gPT0gJ1wwJykKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWVuZCA9IHJ1bl9jb21tYW5kKGJ1ZmZlciwgZ2xvYmFscyk7Ci0JCWlmIChlbmQgPCAwKQotCQkJUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgZW5kID0gcnVuX2NvbW1hbmQoYnVmZmVyLCBnbG9iYWxzKTsKKyAgICAgICAgaWYgKGVuZCA8IDApCisgICAgICAgICAgICBQeUVycl9QcmludCgpOwogCi0JCWlmIChlbmQpCi0JCQlicmVhazsKLQl9CisgICAgICAgIGlmIChlbmQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlQeV9YREVDUkVGKGdsb2JhbHMpOwotCVB5X1hERUNSRUYobmV3X3N0ZGluKTsKLQlQeV9YREVDUkVGKG5ld19zdGRvdXQpOworICAgIFB5X1hERUNSRUYoZ2xvYmFscyk7CisgICAgUHlfWERFQ1JFRihuZXdfc3RkaW4pOworICAgIFB5X1hERUNSRUYobmV3X3N0ZG91dCk7CiAKLQlQeV9FbmRJbnRlcnByZXRlcih0c3RhdGUpOwotCVB5RXZhbF9SZWxlYXNlTG9jaygpOworICAgIFB5X0VuZEludGVycHJldGVyKHRzdGF0ZSk7CisgICAgUHlFdmFsX1JlbGVhc2VMb2NrKCk7CiAKLQlmcHJpbnRmKG91dHB1dCwgIkdvb2RieWUhXG4iKTsKKyAgICBmcHJpbnRmKG91dHB1dCwgIkdvb2RieWUhXG4iKTsKIH0KIAogc3RhdGljIGludAogcnVuX2NvbW1hbmQoY2hhciAqYnVmZmVyLCBQeU9iamVjdCAqZ2xvYmFscykKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp2OwotCWZwcmludGYoc3RkZXJyLCAicnVuX2NvbW1hbmQ6ICVzIiwgYnVmZmVyKTsKLQlpZiAoc3RyY2hyKGJ1ZmZlciwgJ1xuJykgPT0gTlVMTCkKLQkJZnByaW50ZihzdGRlcnIsICJcbiIpOwotCXYgPSBQeVJ1bl9TdHJpbmcoYnVmZmVyLCBQeV9zaW5nbGVfaW5wdXQsIGdsb2JhbHMsIGdsb2JhbHMpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkgPT0gUHlFeGNfU3lzdGVtRXhpdCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiAwOwotCX0KLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKm0sICpkLCAqdjsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInJ1bl9jb21tYW5kOiAlcyIsIGJ1ZmZlcik7CisgICAgaWYgKHN0cmNocihidWZmZXIsICdcbicpID09IE5VTEwpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICB2ID0gUHlSdW5fU3RyaW5nKGJ1ZmZlciwgUHlfc2luZ2xlX2lucHV0LCBnbG9iYWxzLCBnbG9iYWxzKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpID09IFB5RXhjX1N5c3RlbUV4aXQpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogcHModm9pZCkKIHsKLQljaGFyIGJ1ZmZlclsxMDBdOwotCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJICAgICAgInBzIC1sIC1wICVkIDwvZGV2L251bGwgfCBzZWQgMWRcbiIsIGdldHBpZCgpKTsKLQlzeXN0ZW0oYnVmZmVyKTsKKyAgICBjaGFyIGJ1ZmZlclsxMDBdOworICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICJwcyAtbCAtcCAlZCA8L2Rldi9udWxsIHwgc2VkIDFkXG4iLCBnZXRwaWQoKSk7CisgICAgc3lzdGVtKGJ1ZmZlcik7CiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL2Fic3RyYWN0LmggYi9JbmNsdWRlL2Fic3RyYWN0LmgKaW5kZXggYzg0NDZlYi4uYzc4YWIwMCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9hYnN0cmFjdC5oCisrKyBiL0luY2x1ZGUvYWJzdHJhY3QuaApAQCAtMzIsNyArMzIsNyBAQAogCiAgIElmIHRoZSBwcm9ncmFtbWVyIHdhbnRzIHRvIGdldCBhbiBpdGVtIGZyb20gYW5vdGhlciB0eXBlIG9mIG9iamVjdAogICB0aGF0IHByb3ZpZGVzIHNlcXVlbmNlIGJlaGF2aW9yLCB0aGVyZSBpcyBubyBjbGVhciB3YXkgdG8gZG8gaXQKLSAgY29ycmVjdGx5LiAgCisgIGNvcnJlY3RseS4KIAogICBUaGUgcGVyc2lzdGVudCBwcm9ncmFtbWVyIG1heSBwZXJ1c2Ugb2JqZWN0LmggYW5kIGZpbmQgdGhhdCB0aGUKICAgX3R5cGVvYmplY3Qgc3RydWN0dXJlIHByb3ZpZGVzIGEgbWVhbnMgb2YgaW52b2tpbmcgdXAgdG8gKGN1cnJlbnRseQpAQCAtNDQsNyArNDQsNyBAQAogICBBbHNvLCBjZXJ0YWluIHNlbWFudGljcywgZXNwZWNpYWxseSBtZW1vcnkgbWFuYWdlbWVudCBzZW1hbnRpY3MsIG1heQogICBkaWZmZXIgYnkgdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHVzZWQuICBVbmZvcnR1bmF0ZWx5LCB0aGVzZQogICBzZW1hbnRpY3MgYXJlIG5vdCBjbGVhcmx5IGRlc2NyaWJlZCBpbiB0aGUgY3VycmVudCBpbmNsdWRlIGZpbGVzLgotICBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgcHJvdmlkaW5nIG1vcmUgY29uc2lzdGVudCBzZW1hbnRpY3MgaXMgbmVlZGVkLiAKKyAgQW4gYWJzdHJhY3QgaW50ZXJmYWNlIHByb3ZpZGluZyBtb3JlIGNvbnNpc3RlbnQgc2VtYW50aWNzIGlzIG5lZWRlZC4KIAogUHJvcG9zYWwKIApAQCAtNzcsNyArNzcsNyBAQAogICAgIFB5dGhvbiBkaXN0cmlidXRpb25zLgogCiAgIEZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgUHl0aG9uIGFjY2Vzc2luZyBzZXJ2aWNlcyBwcm92aWRlZCBieSBDCi0gIG1vZHVsZXM6IAorICBtb2R1bGVzOgogCiAgIC0gIlB5dGhvbiBtb2R1bGUgaW50ZXJmYWNlIjogdGhpcyBpbnRlcmZhY2UgY29uc2lzdCBvZiB0aGUgYmFzaWMKICAgICByb3V0aW5lcyB1c2VkIHRvIGRlZmluZSBtb2R1bGVzIGFuZCB0aGVpciBtZW1iZXJzLiAgTW9zdCBvZiB0aGUKQEAgLTEzMywxMSArMTMzLDExIEBACiAKICAgICAgaW50IFB5T2JqZWN0X1ByaW50KFB5T2JqZWN0ICpvLCBGSUxFICpmcCwgaW50IGZsYWdzKTsKIAotICAgICAgICAgUHJpbnQgYW4gb2JqZWN0LCBvLCBvbiBmaWxlLCBmcC4gIFJldHVybnMgLTEgb24KLQkgZXJyb3IuICBUaGUgZmxhZ3MgYXJndW1lbnQgaXMgdXNlZCB0byBlbmFibGUgY2VydGFpbiBwcmludGluZwotCSBvcHRpb25zLiBUaGUgb25seSBvcHRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBpcyBQeV9QcmludF9SQVcuIAorICAgICBQcmludCBhbiBvYmplY3QsIG8sIG9uIGZpbGUsIGZwLiAgUmV0dXJucyAtMSBvbgorICAgICBlcnJvci4gIFRoZSBmbGFncyBhcmd1bWVudCBpcyB1c2VkIHRvIGVuYWJsZSBjZXJ0YWluIHByaW50aW5nCisgICAgIG9wdGlvbnMuIFRoZSBvbmx5IG9wdGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIFB5X1ByaW50X1JBVy4KIAotICAgICAgICAgKFdoYXQgc2hvdWxkIGJlIHNhaWQgYWJvdXQgUHlfUHJpbnRfUkFXPykJCisgICAgIChXaGF0IHNob3VsZCBiZSBzYWlkIGFib3V0IFB5X1ByaW50X1JBVz8pCiAKICAgICAgICAqLwogCkBAIC0xNDUsMTEgKzE0NSwxMSBAQAogCiAgICAgIGludCBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUpOwogCi0gICAgICAgICBSZXR1cm5zIDEgaWYgbyBoYXMgdGhlIGF0dHJpYnV0ZSBhdHRyX25hbWUsIGFuZCAwIG90aGVyd2lzZS4KLQkgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgaGFzYXR0cihvLGF0dHJfbmFtZSkuIAorICAgICBSZXR1cm5zIDEgaWYgbyBoYXMgdGhlIGF0dHJpYnV0ZSBhdHRyX25hbWUsIGFuZCAwIG90aGVyd2lzZS4KKyAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgaGFzYXR0cihvLGF0dHJfbmFtZSkuCiAKLQkgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgogCiAgICAgICAgKi8KIApAQCAtMTU3LDkgKzE1Nyw5IEBACiAKICAgICAgUHlPYmplY3QqIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmF0dHJfbmFtZSk7CiAKLQkgUmV0cmlldmUgYW4gYXR0cmlidXRlZCBuYW1lZCBhdHRyX25hbWUgZm9ybSBvYmplY3Qgby4KLQkgUmV0dXJucyB0aGUgYXR0cmlidXRlIHZhbHVlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8uYXR0cl9uYW1lLgorICAgICBSZXRyaWV2ZSBhbiBhdHRyaWJ1dGVkIG5hbWVkIGF0dHJfbmFtZSBmb3JtIG9iamVjdCBvLgorICAgICBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogby5hdHRyX25hbWUuCiAKICAgICAgICAqLwogCkBAIC0xNjcsMTEgKzE2NywxMSBAQAogCiAgICAgIGludCBQeU9iamVjdF9IYXNBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKIAotICAgICAgICAgUmV0dXJucyAxIGlmIG8gaGFzIHRoZSBhdHRyaWJ1dGUgYXR0cl9uYW1lLCBhbmQgMCBvdGhlcndpc2UuCi0JIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIGhhc2F0dHIobyxhdHRyX25hbWUpLiAKKyAgICAgUmV0dXJucyAxIGlmIG8gaGFzIHRoZSBhdHRyaWJ1dGUgYXR0cl9uYW1lLCBhbmQgMCBvdGhlcndpc2UuCisgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIGhhc2F0dHIobyxhdHRyX25hbWUpLgogCi0JIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KIAogICAgICAgICovCiAKQEAgLTE3OSw5ICsxNzksOSBAQAogCiAgICAgIFB5T2JqZWN0KiBQeU9iamVjdF9HZXRBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKIAotCSBSZXRyaWV2ZSBhbiBhdHRyaWJ1dGVkIG5hbWVkIGF0dHJfbmFtZSBmb3JtIG9iamVjdCBvLgotCSBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgotCSBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogby5hdHRyX25hbWUuCisgICAgIFJldHJpZXZlIGFuIGF0dHJpYnV0ZWQgbmFtZWQgYXR0cl9uYW1lIGZvcm0gb2JqZWN0IG8uCisgICAgIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvLmF0dHJfbmFtZS4KIAogICAgICAgICovCiAKQEAgLTE5MCw5ICsxOTAsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUsIFB5T2JqZWN0ICp2KTsKIAotCSBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8sCi0JIHRvIHRoZSB2YWx1ZSwgdi4gUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcwotCSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogby5hdHRyX25hbWU9di4KKyAgICAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG5hbWVkIGF0dHJfbmFtZSwgZm9yIG9iamVjdCBvLAorICAgICB0byB0aGUgdmFsdWUsIHYuIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IG8uYXR0cl9uYW1lPXYuCiAKICAgICAgICAqLwogCkBAIC0yMDAsOSArMjAwLDkgQEAKIAogICAgICBpbnQgUHlPYmplY3RfU2V0QXR0cihQeU9iamVjdCAqbywgUHlPYmplY3QgKmF0dHJfbmFtZSwgUHlPYmplY3QgKnYpOwogCi0JIFNldCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lZCBhdHRyX25hbWUsIGZvciBvYmplY3QgbywKLQkgdG8gdGhlIHZhbHVlLCB2LiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50OiBvLmF0dHJfbmFtZT12LgorICAgICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8sCisgICAgIHRvIHRoZSB2YWx1ZSwgdi4gUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogby5hdHRyX25hbWU9di4KIAogICAgICAgICovCiAKQEAgLTIxMCw5ICsyMTAsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9EZWxBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUpOwogCi0JIERlbGV0ZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8uIFJldHVybnMKLQkgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IGRlbCBvLmF0dHJfbmFtZS4KKyAgICAgRGVsZXRlIGF0dHJpYnV0ZSBuYW1lZCBhdHRyX25hbWUsIGZvciBvYmplY3Qgby4gUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogZGVsIG8uYXR0cl9uYW1lLgogCiAgICAgICAgKi8KICNkZWZpbmUgIFB5T2JqZWN0X0RlbEF0dHJTdHJpbmcoTyxBKSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKChPKSwoQSksTlVMTCkKQEAgLTIyMSw5ICsyMjEsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9EZWxBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKIAotCSBEZWxldGUgYXR0cmlidXRlIG5hbWVkIGF0dHJfbmFtZSwgZm9yIG9iamVjdCBvLiBSZXR1cm5zIC0xCi0JIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBkZWwgby5hdHRyX25hbWUuCisgICAgIERlbGV0ZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8uIFJldHVybnMgLTEKKyAgICAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IGRlbCBvLmF0dHJfbmFtZS4KIAogICAgICAgICovCiAjZGVmaW5lICBQeU9iamVjdF9EZWxBdHRyKE8sQSkgUHlPYmplY3RfU2V0QXR0cigoTyksKEEpLE5VTEwpCkBAIC0yMzEsMTEgKzIzMSwxMSBAQAogICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQ21wKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yLCBpbnQgKnJlc3VsdCk7CiAKICAgICAgICAvKgotCSBDb21wYXJlIHRoZSB2YWx1ZXMgb2YgbzEgYW5kIG8yIHVzaW5nIGEgcm91dGluZSBwcm92aWRlZCBieQotCSBvMSwgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIHdpdGggYSByb3V0aW5lIHByb3ZpZGVkIGJ5IG8yLgotCSBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIHJldHVybmVkIGluIHJlc3VsdC4gIFJldHVybnMKLQkgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IHJlc3VsdD1jbXAobzEsbzIpLgorICAgICBDb21wYXJlIHRoZSB2YWx1ZXMgb2YgbzEgYW5kIG8yIHVzaW5nIGEgcm91dGluZSBwcm92aWRlZCBieQorICAgICBvMSwgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIHdpdGggYSByb3V0aW5lIHByb3ZpZGVkIGJ5IG8yLgorICAgICBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIHJldHVybmVkIGluIHJlc3VsdC4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IHJlc3VsdD1jbXAobzEsbzIpLgogCiAgICAgICAgKi8KIApAQCAtMjQzLDExICsyNDMsMTEgQEAKIAogICAgICBpbnQgUHlPYmplY3RfQ29tcGFyZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKLQkgQ29tcGFyZSB0aGUgdmFsdWVzIG9mIG8xIGFuZCBvMiB1c2luZyBhIHJvdXRpbmUgcHJvdmlkZWQgYnkKLQkgbzEsIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSB3aXRoIGEgcm91dGluZSBwcm92aWRlZCBieSBvMi4KLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwKLQkgdGhlIHZhbHVlIHJldHVybmVkIGlzIHVuZGVmaW5lZC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQotCSBQeXRob24gZXhwcmVzc2lvbjogY21wKG8xLG8yKS4KKyAgICAgQ29tcGFyZSB0aGUgdmFsdWVzIG9mIG8xIGFuZCBvMiB1c2luZyBhIHJvdXRpbmUgcHJvdmlkZWQgYnkKKyAgICAgbzEsIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSB3aXRoIGEgcm91dGluZSBwcm92aWRlZCBieSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwKKyAgICAgdGhlIHZhbHVlIHJldHVybmVkIGlzIHVuZGVmaW5lZC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQorICAgICBQeXRob24gZXhwcmVzc2lvbjogY21wKG8xLG8yKS4KIAogICAgICAgICovCiAKQEAgLTI1NSwxMSArMjU1LDExIEBACiAKICAgICAgUHlPYmplY3QgKlB5T2JqZWN0X1JlcHIoUHlPYmplY3QgKm8pOwogCi0JIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQotCSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcwotCSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHJlcHIobykuCisgICAgIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHJlcHIobykuCiAKLQkgQ2FsbGVkIGJ5IHRoZSByZXByKCkgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHJldmVyc2UgcXVvdGVzLgorICAgICBDYWxsZWQgYnkgdGhlIHJlcHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgcmV2ZXJzZSBxdW90ZXMuCiAKICAgICAgICAqLwogCkBAIC0yNjcsMTIgKzI2NywxMiBAQAogCiAgICAgIFB5T2JqZWN0ICpQeU9iamVjdF9TdHIoUHlPYmplY3QgKm8pOwogCi0JIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQotCSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcwotCSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHN0cihvKS4pCisgICAgIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHN0cihvKS4pCiAKLQkgQ2FsbGVkIGJ5IHRoZSBzdHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIHByaW50Ci0JIHN0YXRlbWVudC4KKyAgICAgQ2FsbGVkIGJ5IHRoZSBzdHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIHByaW50CisgICAgIHN0YXRlbWVudC4KIAogICAgICAgICovCiAKQEAgLTI4MCwxMSArMjgwLDExIEBACiAKICAgICAgUHlPYmplY3QgKlB5T2JqZWN0X1VuaWNvZGUoUHlPYmplY3QgKm8pOwogCi0JIENvbXB1dGUgdGhlIHVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0LCBvLiAgUmV0dXJucyB0aGUKLQkgdW5pY29kZSByZXByZXNlbnRhdGlvbiBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdW5pc3RyKG8pLikKKyAgICAgQ29tcHV0ZSB0aGUgdW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICB1bmljb2RlIHJlcHJlc2VudGF0aW9uIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiB1bmlzdHIobykuKQogCi0JIENhbGxlZCBieSB0aGUgdW5pc3RyKCkgYnVpbHQtaW4gZnVuY3Rpb24uCisgICAgIENhbGxlZCBieSB0aGUgdW5pc3RyKCkgYnVpbHQtaW4gZnVuY3Rpb24uCiAKICAgICAgICAqLwogCkBAIC0yOTIsMzQgKzI5MiwzNCBAQAogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUNhbGxhYmxlX0NoZWNrKFB5T2JqZWN0ICpvKTsKIAotCSBEZXRlcm1pbmUgaWYgdGhlIG9iamVjdCwgbywgaXMgY2FsbGFibGUuICBSZXR1cm4gMSBpZiB0aGUKLQkgb2JqZWN0IGlzIGNhbGxhYmxlIGFuZCAwIG90aGVyd2lzZS4KKyAgICAgRGV0ZXJtaW5lIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNhbGxhYmxlLiAgUmV0dXJuIDEgaWYgdGhlCisgICAgIG9iamVjdCBpcyBjYWxsYWJsZSBhbmQgMCBvdGhlcndpc2UuCiAKLQkgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgogCiAgICAgICAgKi8KIAogCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9DYWxsKFB5T2JqZWN0ICpjYWxsYWJsZV9vYmplY3QsCi0JCQkJCSBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdyk7CiAKICAgICAgICAvKgotCSBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoCi0JIGFyZ3VtZW50cyBhbmQga2V5d29yZHMgYXJndW1lbnRzLiAgVGhlICdhcmdzJyBhcmd1bWVudCBjYW4gbm90IGJlCi0JIE5VTEwsIGJ1dCB0aGUgJ2t3JyBhcmd1bWVudCBjYW4gYmUgTlVMTC4KKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAorICAgICBhcmd1bWVudHMgYW5kIGtleXdvcmRzIGFyZ3VtZW50cy4gIFRoZSAnYXJncycgYXJndW1lbnQgY2FuIG5vdCBiZQorICAgICBOVUxMLCBidXQgdGhlICdrdycgYXJndW1lbnQgY2FuIGJlIE5VTEwuCiAKICAgICAgICAqLwotICAgICAKKwogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGxPYmplY3QoUHlPYmplY3QgKmNhbGxhYmxlX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpOwogCiAgICAgICAgLyoKLQkgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAotCSBhcmd1bWVudHMgZ2l2ZW4gYnkgdGhlIHR1cGxlLCBhcmdzLiAgSWYgbm8gYXJndW1lbnRzIGFyZQotCSBuZWVkZWQsIHRoZW4gYXJncyBtYXkgYmUgTlVMTC4gIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUKLQkgY2FsbCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50Ci0JIG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYXBwbHkobyxhcmdzKS4KKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAorICAgICBhcmd1bWVudHMgZ2l2ZW4gYnkgdGhlIHR1cGxlLCBhcmdzLiAgSWYgbm8gYXJndW1lbnRzIGFyZQorICAgICBuZWVkZWQsIHRoZW4gYXJncyBtYXkgYmUgTlVMTC4gIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAgY2FsbCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50CisgICAgIG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYXBwbHkobyxhcmdzKS4KIAogICAgICAgICovCiAKQEAgLTMyNywxMiArMzI3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZm9ybWF0LCAuLi4pOwogCiAgICAgICAgLyoKLQkgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aCBhCi0JIHZhcmlhYmxlIG51bWJlciBvZiBDIGFyZ3VtZW50cy4gVGhlIEMgYXJndW1lbnRzIGFyZSBkZXNjcmliZWQKLQkgdXNpbmcgYSBta3ZhbHVlLXN0eWxlIGZvcm1hdCBzdHJpbmcuIFRoZSBmb3JtYXQgbWF5IGJlIE5VTEwsCi0JIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLiAgUmV0dXJucyB0aGUKLQkgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKLQkgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBhcHBseShvLGFyZ3MpLgorICAgICBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoIGEKKyAgICAgdmFyaWFibGUgbnVtYmVyIG9mIEMgYXJndW1lbnRzLiBUaGUgQyBhcmd1bWVudHMgYXJlIGRlc2NyaWJlZAorICAgICB1c2luZyBhIG1rdmFsdWUtc3R5bGUgZm9ybWF0IHN0cmluZy4gVGhlIGZvcm1hdCBtYXkgYmUgTlVMTCwKKyAgICAgaW5kaWNhdGluZyB0aGF0IG5vIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuICBSZXR1cm5zIHRoZQorICAgICByZXN1bHQgb2YgdGhlIGNhbGwgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGFwcGx5KG8sYXJncykuCiAKICAgICAgICAqLwogCkBAIC0zNDEsMjkgKzM0MSwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CiAKICAgICAgICAvKgotCSBDYWxsIHRoZSBtZXRob2QgbmFtZWQgbSBvZiBvYmplY3QgbyB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0JIEMgYXJndW1lbnRzLiAgVGhlIEMgYXJndW1lbnRzIGFyZSBkZXNjcmliZWQgYnkgYSBta3ZhbHVlCi0JIGZvcm1hdCBzdHJpbmcuICBUaGUgZm9ybWF0IG1heSBiZSBOVUxMLCBpbmRpY2F0aW5nIHRoYXQgbm8KLQkgYXJndW1lbnRzIGFyZSBwcm92aWRlZC4gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIG9uCi0JIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlCi0JIFB5dGhvbiBleHByZXNzaW9uOiBvLm1ldGhvZChhcmdzKS4KKyAgICAgQ2FsbCB0aGUgbWV0aG9kIG5hbWVkIG0gb2Ygb2JqZWN0IG8gd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgorICAgICBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkIGJ5IGEgbWt2YWx1ZQorICAgICBmb3JtYXQgc3RyaW5nLiAgVGhlIGZvcm1hdCBtYXkgYmUgTlVMTCwgaW5kaWNhdGluZyB0aGF0IG5vCisgICAgIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBvbgorICAgICBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZQorICAgICBQeXRob24gZXhwcmVzc2lvbjogby5tZXRob2QoYXJncykuCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQoUHlPYmplY3QgKmNhbGxhYmxlLAotCQkJCQkJCSBjaGFyICpmb3JtYXQsIC4uLik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQoUHlPYmplY3QgKm8sCi0JCQkJCQkgICAgICAgY2hhciAqbmFtZSwKLQkJCQkJCSAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmb3JtYXQsIC4uLik7CiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKTsKIAogICAgICAgIC8qCi0JIENhbGwgYSBjYWxsYWJsZSBQeXRob24gb2JqZWN0LCBjYWxsYWJsZV9vYmplY3QsIHdpdGggYQotCSB2YXJpYWJsZSBudW1iZXIgb2YgQyBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkCi0JIGFzIFB5T2JqZWN0ICogdmFsdWVzLCB0ZXJtaW5hdGVkIGJ5IGEgTlVMTC4gIFJldHVybnMgdGhlCi0JIHJlc3VsdCBvZiB0aGUgY2FsbCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYXBwbHkobyxhcmdzKS4KKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aCBhCisgICAgIHZhcmlhYmxlIG51bWJlciBvZiBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQKKyAgICAgYXMgUHlPYmplY3QgKiB2YWx1ZXMsIHRlcm1pbmF0ZWQgYnkgYSBOVUxMLiAgUmV0dXJucyB0aGUKKyAgICAgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBhcHBseShvLGFyZ3MpLgogICAgICAgICovCiAKIApAQCAtMzcxLDExICszNzEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICptLCAuLi4pOwogCiAgICAgICAgLyoKLQkgQ2FsbCB0aGUgbWV0aG9kIG5hbWVkIG0gb2Ygb2JqZWN0IG8gd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgotCSBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgYXMgUHlPYmplY3QgKgotCSB2YWx1ZXMsIHRlcm1pbmF0ZWQgYnkgTlVMTC4gIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbAotCSBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mCi0JIHRoZSBQeXRob24gZXhwcmVzc2lvbjogby5tZXRob2QoYXJncykuCisgICAgIENhbGwgdGhlIG1ldGhvZCBuYW1lZCBtIG9mIG9iamVjdCBvIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YKKyAgICAgQyBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIGFzIFB5T2JqZWN0ICoKKyAgICAgdmFsdWVzLCB0ZXJtaW5hdGVkIGJ5IE5VTEwuICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwKKyAgICAgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZgorICAgICB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8ubWV0aG9kKGFyZ3MpLgogICAgICAgICovCiAKIApAQCAtMzgzLDkgKzM4Myw5IEBACiAKICAgICAgbG9uZyBQeU9iamVjdF9IYXNoKFB5T2JqZWN0ICpvKTsKIAotICAgICAgICAgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBoYXNoLCBoYXNoX3ZhbHVlLCBvZiBhbiBvYmplY3QsIG8uICBPbgotCSBmYWlsdXJlLCByZXR1cm4gLTEuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogaGFzaChvKS4KKyAgICAgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBoYXNoLCBoYXNoX3ZhbHVlLCBvZiBhbiBvYmplY3QsIG8uICBPbgorICAgICBmYWlsdXJlLCByZXR1cm4gLTEuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogaGFzaChvKS4KIAogICAgICAgICovCiAKQEAgLTM5NCw5ICszOTQsOSBAQAogCiAgICAgIGludCBQeU9iamVjdF9Jc1RydWUoUHlPYmplY3QgKm8pOwogCi0JIFJldHVybnMgMSBpZiB0aGUgb2JqZWN0LCBvLCBpcyBjb25zaWRlcmVkIHRvIGJlIHRydWUsIDAgaWYgbyBpcwotCSBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGFuZCAtMSBvbiBmYWlsdXJlLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0JIFB5dGhvbiBleHByZXNzaW9uOiBub3Qgbm90IG8KKyAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSwgMCBpZiBvIGlzCisgICAgIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgYW5kIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgUHl0aG9uIGV4cHJlc3Npb246IG5vdCBub3QgbwogCiAgICAgICAgKi8KIApAQCAtNDA0LDI3ICs0MDQsMjcgQEAKIAogICAgICBpbnQgUHlPYmplY3RfTm90KFB5T2JqZWN0ICpvKTsKIAotCSBSZXR1cm5zIDAgaWYgdGhlIG9iamVjdCwgbywgaXMgY29uc2lkZXJlZCB0byBiZSB0cnVlLCAxIGlmIG8gaXMKLQkgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBhbmQgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQotCSBQeXRob24gZXhwcmVzc2lvbjogbm90IG8KKyAgICAgUmV0dXJucyAwIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSwgMSBpZiBvIGlzCisgICAgIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgYW5kIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgUHl0aG9uIGV4cHJlc3Npb246IG5vdCBvCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfVHlwZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBPbiBzdWNjZXNzLCByZXR1cm5zIGEgdHlwZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0Ci0JIHR5cGUgb2Ygb2JqZWN0IG8uIE9uIGZhaWx1cmUsIHJldHVybnMgTlVMTC4gIFRoaXMgaXMKLQkgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHR5cGUobykuCisgICAgIE9uIHN1Y2Nlc3MsIHJldHVybnMgYSB0eXBlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QKKyAgICAgdHlwZSBvZiBvYmplY3Qgby4gT24gZmFpbHVyZSwgcmV0dXJucyBOVUxMLiAgVGhpcyBpcworICAgICBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdHlwZShvKS4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlPYmplY3RfU2l6ZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJuIHRoZSBzaXplIG9mIG9iamVjdCBvLiAgSWYgdGhlIG9iamVjdCwgbywgcHJvdmlkZXMKLQkgYm90aCBzZXF1ZW5jZSBhbmQgbWFwcGluZyBwcm90b2NvbHMsIHRoZSBzZXF1ZW5jZSBzaXplIGlzCi0JIHJldHVybmVkLiBPbiBlcnJvciwgLTEgaXMgcmV0dXJuZWQuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50Ci0JIHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbGVuKG8pLgorICAgICBSZXR1cm4gdGhlIHNpemUgb2Ygb2JqZWN0IG8uICBJZiB0aGUgb2JqZWN0LCBvLCBwcm92aWRlcworICAgICBib3RoIHNlcXVlbmNlIGFuZCBtYXBwaW5nIHByb3RvY29scywgdGhlIHNlcXVlbmNlIHNpemUgaXMKKyAgICAgcmV0dXJuZWQuIE9uIGVycm9yLCAtMSBpcyByZXR1cm5lZC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKKyAgICAgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOiBsZW4obykuCiAKICAgICAgICAqLwogCkBAIC00MzYsMjAzICs0MzYsMjAzIEBACiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5T2JqZWN0X0xlbmd0aEhpbnQoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QpOwogCiAgICAgICAgLyoKLSAgICAgICAgIEd1ZXNzIHRoZSBzaXplIG9mIG9iamVjdCBvIHVzaW5nIGxlbihvKSBvciBvLl9fbGVuZ3RoX2hpbnRfXygpLgotICAgICAgICAgSWYgbmVpdGhlciBvZiB0aG9zZSByZXR1cm4gYSBub24tbmVnYXRpdmUgdmFsdWUsIHRoZW4gcmV0dXJuIHRoZQotICAgICAgICAgZGVmYXVsdCB2YWx1ZS4gIElmIG9uZSBvZiB0aGUgY2FsbHMgZmFpbHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMS4KKyAgICAgR3Vlc3MgdGhlIHNpemUgb2Ygb2JqZWN0IG8gdXNpbmcgbGVuKG8pIG9yIG8uX19sZW5ndGhfaGludF9fKCkuCisgICAgIElmIG5laXRoZXIgb2YgdGhvc2UgcmV0dXJuIGEgbm9uLW5lZ2F0aXZlIHZhbHVlLCB0aGVuIHJldHVybiB0aGUKKyAgICAgZGVmYXVsdCB2YWx1ZS4gIElmIG9uZSBvZiB0aGUgY2FsbHMgZmFpbHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAtMS4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfR2V0SXRlbShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSk7CiAKICAgICAgICAvKgotCSBSZXR1cm4gZWxlbWVudCBvZiBvIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCwga2V5LCBvciBOVUxMCi0JIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvW2tleV0uCisgICAgIFJldHVybiBlbGVtZW50IG9mIG8gY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0LCBrZXksIG9yIE5VTEwKKyAgICAgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG9ba2V5XS4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X1NldEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2KTsKIAogICAgICAgIC8qCi0JIE1hcCB0aGUgb2JqZWN0LCBrZXksIHRvIHRoZSB2YWx1ZSwgdi4gIFJldHVybnMKLQkgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IG9ba2V5XT12LgorICAgICBNYXAgdGhlIG9iamVjdCwga2V5LCB0byB0aGUgdmFsdWUsIHYuICBSZXR1cm5zCisgICAgIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgc3RhdGVtZW50OiBvW2tleV09di4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9EZWxJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KLSAgICAgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgICAgICAgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IGRlbCBvW2tleV0uCisgICAgIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KKyAgICAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAgIHRoZSBQeXRob24gc3RhdGVtZW50OiBkZWwgb1trZXldLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpOwogCiAgICAgICAgLyoKLQkgRGVsZXRlIHRoZSBtYXBwaW5nIGZvciBrZXkgZnJvbSAqby4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KKyAgICAgRGVsZXRlIHRoZSBtYXBwaW5nIGZvciBrZXkgZnJvbSAqby4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Bc0NoYXJCdWZmZXIoUHlPYmplY3QgKm9iaiwKLQkJCQkJICBjb25zdCBjaGFyICoqYnVmZmVyLAotCQkJCQkgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOwogCi0gICAgICAgLyogCi0JICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKGNoYXJhY3RlciwKLQkgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCi0JICByZWFkLW9ubHkgbWVtb3J5IGxvY2F0aW9uIHVzZWFibGUgYXMgY2hhcmFjdGVyIGJhc2VkIGlucHV0Ci0JICBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nLgorICAgICAgIC8qCisgICAgICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKGNoYXJhY3RlciwKKyAgICAgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCisgICAgICByZWFkLW9ubHkgbWVtb3J5IGxvY2F0aW9uIHVzZWFibGUgYXMgY2hhcmFjdGVyIGJhc2VkIGlucHV0CisgICAgICBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nLgogCi0JICAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBidWZmZXIgYW5kIGJ1ZmZlcl9sZW4gYXJlIG9ubHkKLQkgIHNldCBpbiBjYXNlIG5vIGVycm9yIG9jY3Vycy4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKLQkgIGFuIGV4Y2VwdGlvbiBzZXQuCisgICAgICAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBidWZmZXIgYW5kIGJ1ZmZlcl9sZW4gYXJlIG9ubHkKKyAgICAgIHNldCBpbiBjYXNlIG5vIGVycm9yIG9jY3Vycy4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKKyAgICAgIGFuIGV4Y2VwdGlvbiBzZXQuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaik7CiAKLSAgICAgIC8qICAKLQkgIENoZWNrcyB3aGV0aGVyIGFuIGFyYml0cmFyeSBvYmplY3Qgc3VwcG9ydHMgdGhlIChjaGFyYWN0ZXIsCi0JICBzaW5nbGUgc2VnbWVudCkgYnVmZmVyIGludGVyZmFjZS4gIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwCi0JICBvbiBmYWlsdXJlLgorICAgICAgLyoKKyAgICAgIENoZWNrcyB3aGV0aGVyIGFuIGFyYml0cmFyeSBvYmplY3Qgc3VwcG9ydHMgdGhlIChjaGFyYWN0ZXIsCisgICAgICBzaW5nbGUgc2VnbWVudCkgYnVmZmVyIGludGVyZmFjZS4gIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwCisgICAgICBvbiBmYWlsdXJlLgogCiAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Bc1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaiwKLQkJCQkJICBjb25zdCB2b2lkICoqYnVmZmVyLAotCQkJCQkgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOwogCi0gICAgICAgLyogCi0JICBTYW1lIGFzIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcigpIGV4Y2VwdCB0aGF0IHRoaXMgQVBJIGV4cGVjdHMKLQkgIChyZWFkYWJsZSwgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHJldHVybnMgYQotCSAgcG9pbnRlciB0byBhIHJlYWQtb25seSBtZW1vcnkgbG9jYXRpb24gd2hpY2ggY2FuIGNvbnRhaW4KLQkgIGFyYml0cmFyeSBkYXRhLgorICAgICAgIC8qCisgICAgICBTYW1lIGFzIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcigpIGV4Y2VwdCB0aGF0IHRoaXMgQVBJIGV4cGVjdHMKKyAgICAgIChyZWFkYWJsZSwgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHJldHVybnMgYQorICAgICAgcG9pbnRlciB0byBhIHJlYWQtb25seSBtZW1vcnkgbG9jYXRpb24gd2hpY2ggY2FuIGNvbnRhaW4KKyAgICAgIGFyYml0cmFyeSBkYXRhLgogCi0JICAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBidWZmZXIgYW5kIGJ1ZmZlcl9sZW4gYXJlIG9ubHkKLQkgIHNldCBpbiBjYXNlIG5vIGVycm9yIG9jY3VycnMuICBPdGhlcndpc2UsIC0xIGlzIHJldHVybmVkIGFuZAotCSAgYW4gZXhjZXB0aW9uIHNldC4KKyAgICAgIDAgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4gIGJ1ZmZlciBhbmQgYnVmZmVyX2xlbiBhcmUgb25seQorICAgICAgc2V0IGluIGNhc2Ugbm8gZXJyb3Igb2NjdXJycy4gIE90aGVyd2lzZSwgLTEgaXMgcmV0dXJuZWQgYW5kCisgICAgICBhbiBleGNlcHRpb24gc2V0LgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihQeU9iamVjdCAqb2JqLAotCQkJCQkgICB2b2lkICoqYnVmZmVyLAotCQkJCQkgICBQeV9zc2l6ZV90ICpidWZmZXJfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOwogCi0gICAgICAgLyogCi0JICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKHdyaXRlYWJsZSwKLQkgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCi0JICB3cml0ZWFibGUgbWVtb3J5IGxvY2F0aW9uIGluIGJ1ZmZlciBvZiBzaXplIGJ1ZmZlcl9sZW4uCisgICAgICAgLyoKKyAgICAgIFRha2VzIGFuIGFyYml0cmFyeSBvYmplY3Qgd2hpY2ggbXVzdCBzdXBwb3J0IHRoZSAod3JpdGVhYmxlLAorICAgICAgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGEKKyAgICAgIHdyaXRlYWJsZSBtZW1vcnkgbG9jYXRpb24gaW4gYnVmZmVyIG9mIHNpemUgYnVmZmVyX2xlbi4KIAotCSAgMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLiAgYnVmZmVyIGFuZCBidWZmZXJfbGVuIGFyZSBvbmx5Ci0JICBzZXQgaW4gY2FzZSBubyBlcnJvciBvY2N1cnJzLiBPdGhlcndpc2UsIC0xIGlzIHJldHVybmVkIGFuZAotCSAgYW4gZXhjZXB0aW9uIHNldC4KKyAgICAgIDAgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4gIGJ1ZmZlciBhbmQgYnVmZmVyX2xlbiBhcmUgb25seQorICAgICAgc2V0IGluIGNhc2Ugbm8gZXJyb3Igb2NjdXJycy4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKKyAgICAgIGFuIGV4Y2VwdGlvbiBzZXQuCiAKICAgICAgICAqLwogCi0JLyogbmV3IGJ1ZmZlciBBUEkgKi8KKyAgICAvKiBuZXcgYnVmZmVyIEFQSSAqLwogCiAjZGVmaW5lIFB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iaikgXAotCSgoKG9iaiktPm9iX3R5cGUtPnRwX2FzX2J1ZmZlciAhPSBOVUxMKSAmJgkJCVwKLQkgKFB5VHlwZV9IYXNGZWF0dXJlKChvYmopLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSKSkgJiYgXAotCSAoKG9iaiktPm9iX3R5cGUtPnRwX2FzX2J1ZmZlci0+YmZfZ2V0YnVmZmVyICE9IE5VTEwpKQotCQkJICAgIAotCS8qIFJldHVybiAxIGlmIHRoZSBnZXRidWZmZXIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBvdGhlcndpc2UgCi0JICAgcmV0dXJuIDAgKi8KKyAgICAoKChvYmopLT5vYl90eXBlLT50cF9hc19idWZmZXIgIT0gTlVMTCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgKFB5VHlwZV9IYXNGZWF0dXJlKChvYmopLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSKSkgJiYgXAorICAgICAoKG9iaiktPm9iX3R5cGUtPnRwX2FzX2J1ZmZlci0+YmZfZ2V0YnVmZmVyICE9IE5VTEwpKQogCi0gICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9HZXRCdWZmZXIoUHlPYmplY3QgKm9iaiwgUHlfYnVmZmVyICp2aWV3LCAKLQkJCQkJaW50IGZsYWdzKTsKKyAgICAvKiBSZXR1cm4gMSBpZiB0aGUgZ2V0YnVmZmVyIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlCisgICAgICAgcmV0dXJuIDAgKi8KIAotCS8qIFRoaXMgaXMgYSBDLUFQSSB2ZXJzaW9uIG9mIHRoZSBnZXRidWZmZXIgZnVuY3Rpb24gY2FsbC4gIEl0IGNoZWNrcwotICAgICAgIAkgICB0byBtYWtlIHN1cmUgb2JqZWN0IGhhcyB0aGUgcmVxdWlyZWQgZnVuY3Rpb24gcG9pbnRlciBhbmQgaXNzdWVzIHRoZQotCSAgIGNhbGwuICBSZXR1cm5zIC0xIGFuZCByYWlzZXMgYW4gZXJyb3Igb24gZmFpbHVyZSBhbmQgcmV0dXJucyAwIG9uIAotCSAgIHN1Y2Nlc3MKLSAgICAgICAgKi8KKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0dldEJ1ZmZlcihQeU9iamVjdCAqb2JqLCBQeV9idWZmZXIgKnZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKworICAgIC8qIFRoaXMgaXMgYSBDLUFQSSB2ZXJzaW9uIG9mIHRoZSBnZXRidWZmZXIgZnVuY3Rpb24gY2FsbC4gIEl0IGNoZWNrcworICAgICAgIHRvIG1ha2Ugc3VyZSBvYmplY3QgaGFzIHRoZSByZXF1aXJlZCBmdW5jdGlvbiBwb2ludGVyIGFuZCBpc3N1ZXMgdGhlCisgICAgICAgY2FsbC4gIFJldHVybnMgLTEgYW5kIHJhaXNlcyBhbiBlcnJvciBvbiBmYWlsdXJlIGFuZCByZXR1cm5zIDAgb24KKyAgICAgICBzdWNjZXNzCisgICAgKi8KIAogCiAgICAgIFB5QVBJX0ZVTkModm9pZCAqKSBQeUJ1ZmZlcl9HZXRQb2ludGVyKFB5X2J1ZmZlciAqdmlldywgUHlfc3NpemVfdCAqaW5kaWNlcyk7Ci0gICAgICAgIAotICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSBhcmVhIHBvaW50ZWQgdG8gYnkgdGhlIGluZGljZXMgZm9yIHRoZSBidWZmZXIgZ2l2ZW4uIAotICAgICAgICAgICBOb3RlIHRoYXQgdmlldy0+bmRpbSBpcyB0aGUgYXNzdW1lZCBzaXplIG9mIGluZGljZXMgCi0gICAgICAgICovCisKKyAgICAvKiBHZXQgdGhlIG1lbW9yeSBhcmVhIHBvaW50ZWQgdG8gYnkgdGhlIGluZGljZXMgZm9yIHRoZSBidWZmZXIgZ2l2ZW4uCisgICAgICAgTm90ZSB0aGF0IHZpZXctPm5kaW0gaXMgdGhlIGFzc3VtZWQgc2l6ZSBvZiBpbmRpY2VzCisgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlCdWZmZXJfU2l6ZUZyb21Gb3JtYXQoY29uc3QgY2hhciAqKTsKLQkJCi0JLyogUmV0dXJuIHRoZSBpbXBsaWVkIGl0ZW1zaXplIG9mIHRoZSBkYXRhLWZvcm1hdCBhcmVhIGZyb20gYSAKLQkgICBzdHJ1Y3Qtc3R5bGUgZGVzY3JpcHRpb24gKi8KLSAgICAKIAotCQorICAgIC8qIFJldHVybiB0aGUgaW1wbGllZCBpdGVtc2l6ZSBvZiB0aGUgZGF0YS1mb3JtYXQgYXJlYSBmcm9tIGEKKyAgICAgICBzdHJ1Y3Qtc3R5bGUgZGVzY3JpcHRpb24gKi8KKworCisKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5QnVmZmVyX1RvQ29udGlndW91cyh2b2lkICpidWYsIFB5X2J1ZmZlciAqdmlldywKLSAgICAJCQkJCSAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOwogCi0gICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9Gcm9tQ29udGlndW91cyhQeV9idWZmZXIgKnZpZXcsIHZvaWQgKmJ1ZiwgCi0gICAgCQkJCQkgICAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOworICAgICBQeUFQSV9GVU5DKGludCkgUHlCdWZmZXJfRnJvbUNvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3LCB2b2lkICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgY2hhciBmb3J0KTsKIAogCi0JLyogQ29weSBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeQotCSAgIHBvaW50ZWQgdG8gYnkgYnVmIGludG8gdGhlIGJ1ZmZlciBleHBvcnRlZCBieSBvYmouICBSZXR1cm4KLQkgICAwIG9uIHN1Y2Nlc3MgYW5kIHJldHVybiAtMSBhbmQgcmFpc2UgYSBQeUJ1ZmZlcl9FcnJvciBvbgotCSAgIGVycm9yIChpLmUuIHRoZSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIGJ1ZmZlciBpbnRlcmZhY2Ugb3IKLQkgICBpdCBpcyBub3Qgd29ya2luZykuCisgICAgLyogQ29weSBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeQorICAgICAgIHBvaW50ZWQgdG8gYnkgYnVmIGludG8gdGhlIGJ1ZmZlciBleHBvcnRlZCBieSBvYmouICBSZXR1cm4KKyAgICAgICAwIG9uIHN1Y2Nlc3MgYW5kIHJldHVybiAtMSBhbmQgcmFpc2UgYSBQeUJ1ZmZlcl9FcnJvciBvbgorICAgICAgIGVycm9yIChpLmUuIHRoZSBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIGJ1ZmZlciBpbnRlcmZhY2Ugb3IKKyAgICAgICBpdCBpcyBub3Qgd29ya2luZykuCiAKLQkgICBJZiBmb3J0IGlzICdGJyBhbmQgdGhlIG9iamVjdCBpcyBtdWx0aS1kaW1lbnNpb25hbCwKLQkgICB0aGVuIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gdGhlIGFycmF5IGluCi0JICAgRm9ydHJhbi1zdHlsZSAoZmlyc3QgZGltZW5zaW9uIHZhcmllcyB0aGUgZmFzdGVzdCkuICBJZgotCSAgIGZvcnQgaXMgJ0MnLCB0aGVuIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gdGhlIGFycmF5Ci0JICAgaW4gQy1zdHlsZSAobGFzdCBkaW1lbnNpb24gdmFyaWVzIHRoZSBmYXN0ZXN0KS4gIElmIGZvcnQKLQkgICBpcyAnQScsIHRoZW4gaXQgZG9lcyBub3QgbWF0dGVyIGFuZCB0aGUgY29weSB3aWxsIGJlIG1hZGUKLQkgICBpbiB3aGF0ZXZlciB3YXkgaXMgbW9yZSBlZmZpY2llbnQuCisgICAgICAgSWYgZm9ydCBpcyAnRicgYW5kIHRoZSBvYmplY3QgaXMgbXVsdGktZGltZW5zaW9uYWwsCisgICAgICAgdGhlbiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBhcnJheSBpbgorICAgICAgIEZvcnRyYW4tc3R5bGUgKGZpcnN0IGRpbWVuc2lvbiB2YXJpZXMgdGhlIGZhc3Rlc3QpLiAgSWYKKyAgICAgICBmb3J0IGlzICdDJywgdGhlbiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBhcnJheQorICAgICAgIGluIEMtc3R5bGUgKGxhc3QgZGltZW5zaW9uIHZhcmllcyB0aGUgZmFzdGVzdCkuICBJZiBmb3J0CisgICAgICAgaXMgJ0EnLCB0aGVuIGl0IGRvZXMgbm90IG1hdHRlciBhbmQgdGhlIGNvcHkgd2lsbCBiZSBtYWRlCisgICAgICAgaW4gd2hhdGV2ZXIgd2F5IGlzIG1vcmUgZWZmaWNpZW50LgogCi0gICAgICAgICovCisgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQ29weURhdGEoUHlPYmplY3QgKmRlc3QsIFB5T2JqZWN0ICpzcmMpOwotICAgICAgICAKLSAgICAgICAgLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBzcmMgYnVmZmVyIHRvIHRoZSBidWZmZXIgb2YgZGVzdGluYXRpb24KLSAgICAgICAgICovCisKKyAgICAvKiBDb3B5IHRoZSBkYXRhIGZyb20gdGhlIHNyYyBidWZmZXIgdG8gdGhlIGJ1ZmZlciBvZiBkZXN0aW5hdGlvbgorICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3LCBjaGFyIGZvcnQpOwogCiAKLSAgICAgUHlBUElfRlVOQyh2b2lkKSBQeUJ1ZmZlcl9GaWxsQ29udGlndW91c1N0cmlkZXMoaW50IG5kaW1zLCAKLQkgIAkJCQkJICAgIFB5X3NzaXplX3QgKnNoYXBlLCAKLQkJCQkJCSAgICBQeV9zc2l6ZV90ICpzdHJpZGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZW1zaXplLAotCSAgICAgCQkJCQkgICAgY2hhciBmb3J0KTsKKyAgICAgUHlBUElfRlVOQyh2b2lkKSBQeUJ1ZmZlcl9GaWxsQ29udGlndW91c1N0cmlkZXMoaW50IG5kaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnNoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0cmlkZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZm9ydCk7CiAKLSAgICAgICAJLyogIEZpbGwgdGhlIHN0cmlkZXMgYXJyYXkgd2l0aCBieXRlLXN0cmlkZXMgb2YgYSBjb250aWd1b3VzCi0gICAgICAgICAgICAoRm9ydHJhbi1zdHlsZSBpZiBmb3J0IGlzICdGJyBvciBDLXN0eWxlIG90aGVyd2lzZSkKLSAgICAgICAgICAgIGFycmF5IG9mIHRoZSBnaXZlbiBzaGFwZSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgIHBlciBlbGVtZW50LgotICAgICAgICAqLworICAgIC8qICBGaWxsIHRoZSBzdHJpZGVzIGFycmF5IHdpdGggYnl0ZS1zdHJpZGVzIG9mIGEgY29udGlndW91cworICAgICAgICAoRm9ydHJhbi1zdHlsZSBpZiBmb3J0IGlzICdGJyBvciBDLXN0eWxlIG90aGVyd2lzZSkKKyAgICAgICAgYXJyYXkgb2YgdGhlIGdpdmVuIHNoYXBlIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcworICAgICAgICBwZXIgZWxlbWVudC4KKyAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9GaWxsSW5mbyhQeV9idWZmZXIgKnZpZXcsIFB5T2JqZWN0ICpvLCB2b2lkICpidWYsCi0JCSAgICAgICAgICAgICAJICAgICAgIFB5X3NzaXplX3QgbGVuLCBpbnQgcmVhZG9ubHksCi0JCQkJICAgICAgIGludCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgaW50IHJlYWRvbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKIAotICAgICAgICAvKiBGaWxscyBpbiBhIGJ1ZmZlci1pbmZvIHN0cnVjdHVyZSBjb3JyZWN0bHkgZm9yIGFuIGV4cG9ydGVyCi0gICAgICAgICAgIHRoYXQgY2FuIG9ubHkgc2hhcmUgYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSBvZgotICAgICAgICAgICAidW5zaWduZWQgYnl0ZXMiIG9mIHRoZSBnaXZlbiBsZW5ndGguIFJldHVybnMgMCBvbiBzdWNjZXNzCi0gICAgICAgICAgIGFuZCAtMSAod2l0aCByYWlzaW5nIGFuIGVycm9yKSBvbiBlcnJvci4KLSAgICAgICAgICovCisgICAgLyogRmlsbHMgaW4gYSBidWZmZXItaW5mbyBzdHJ1Y3R1cmUgY29ycmVjdGx5IGZvciBhbiBleHBvcnRlcgorICAgICAgIHRoYXQgY2FuIG9ubHkgc2hhcmUgYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSBvZgorICAgICAgICJ1bnNpZ25lZCBieXRlcyIgb2YgdGhlIGdpdmVuIGxlbmd0aC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgICAgICBhbmQgLTEgKHdpdGggcmFpc2luZyBhbiBlcnJvcikgb24gZXJyb3IuCisgICAgICovCiAKICAgICAgUHlBUElfRlVOQyh2b2lkKSBQeUJ1ZmZlcl9SZWxlYXNlKFB5X2J1ZmZlciAqdmlldyk7CiAKICAgICAgICAvKiBSZWxlYXNlcyBhIFB5X2J1ZmZlciBvYnRhaW5lZCBmcm9tIGdldGJ1ZmZlciBQYXJzZVR1cGxlJ3MgcyouCi0gICAgICAgICovCisgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0Zvcm1hdChQeU9iamVjdCogb2JqLAotCQkJCQkgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjKTsKICAgICAgICAvKgotCSBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKLQkgY2FsbGluZyBvYmouX19mb3JtYXRfXyhmb3JtYXRfc3BlYykuCisgICAgIFRha2VzIGFuIGFyYml0cmFyeSBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZgorICAgICBjYWxsaW5nIG9iai5fX2Zvcm1hdF9fKGZvcm1hdF9zcGVjKS4KICAgICAgICAqLwogCiAvKiBJdGVyYXRvcnMgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0dldEl0ZXIoUHlPYmplY3QgKik7CiAgICAgIC8qIFRha2VzIGFuIG9iamVjdCBhbmQgcmV0dXJucyBhbiBpdGVyYXRvciBmb3IgaXQuCi0gICAgICAgIFRoaXMgaXMgdHlwaWNhbGx5IGEgbmV3IGl0ZXJhdG9yIGJ1dCBpZiB0aGUgYXJndW1lbnQKLQlpcyBhbiBpdGVyYXRvciwgdGhpcyByZXR1cm5zIGl0c2VsZi4gKi8KKyAgICBUaGlzIGlzIHR5cGljYWxseSBhIG5ldyBpdGVyYXRvciBidXQgaWYgdGhlIGFyZ3VtZW50CisgICAgaXMgYW4gaXRlcmF0b3IsIHRoaXMgcmV0dXJucyBpdHNlbGYuICovCiAKICNkZWZpbmUgUHlJdGVyX0NoZWNrKG9iaikgXAogICAgIChQeVR5cGVfSGFzRmVhdHVyZSgob2JqKS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lURVIpICYmIFwKQEAgLTY0MCwyNyArNjQwLDI3IEBACiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUl0ZXJfTmV4dChQeU9iamVjdCAqKTsKICAgICAgLyogVGFrZXMgYW4gaXRlcmF0b3Igb2JqZWN0IGFuZCBjYWxscyBpdHMgdHBfaXRlcm5leHQgc2xvdCwKLQlyZXR1cm5pbmcgdGhlIG5leHQgdmFsdWUuICBJZiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkLAotCXRoaXMgcmV0dXJucyBOVUxMIHdpdGhvdXQgc2V0dGluZyBhbiBleGNlcHRpb24uCi0JTlVMTCB3aXRoIGFuIGV4Y2VwdGlvbiBtZWFucyBhbiBlcnJvciBvY2N1cnJlZC4gKi8KKyAgICByZXR1cm5pbmcgdGhlIG5leHQgdmFsdWUuICBJZiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkLAorICAgIHRoaXMgcmV0dXJucyBOVUxMIHdpdGhvdXQgc2V0dGluZyBhbiBleGNlcHRpb24uCisgICAgTlVMTCB3aXRoIGFuIGV4Y2VwdGlvbiBtZWFucyBhbiBlcnJvciBvY2N1cnJlZC4gKi8KIAogLyogIE51bWJlciBQcm90b2NvbDoqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU51bWJlcl9DaGVjayhQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIHByb3ZpZGVzIG51bWVyaWMgcHJvdG9jb2xzLCBhbmQKLQkgZmFsc2Ugb3RoZXJ3aXNlLiAKKyAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIHByb3ZpZGVzIG51bWVyaWMgcHJvdG9jb2xzLCBhbmQKKyAgICAgZmFsc2Ugb3RoZXJ3aXNlLgogCi0JIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BZGQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFkZGluZyBvMSBhbmQgbzIsIG9yIG51bGwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xK28yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8xIGFuZCBvMiwgb3IgbnVsbCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzErbzIuCiAKIAogICAgICAgICovCkBAIC02NjgsMTggKzY2OCwxOCBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1N1YnRyYWN0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyBvMiBmcm9tIG8xLCBvciBudWxsIG9uCi0JIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEtbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBzdWJ0cmFjdGluZyBvMiBmcm9tIG8xLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEtbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTXVsdGlwbHkoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIG8xIGFuZCBvMiwgb3IgbnVsbCBvbgotCSBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xKm8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgbzEgYW5kIG8yLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEqbzIuCiAKIAogICAgICAgICovCkBAIC02ODcsOCArNjg3LDggQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9EaXZpZGUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS9vMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS9vMi4KIAogCiAgICAgICAgKi8KQEAgLTY5Niw5ICs2OTYsOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0Zsb29yRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYW4gaW50ZWdyYWwgcmVzdWx0LAotCSBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS8vbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYW4gaW50ZWdyYWwgcmVzdWx0LAorICAgICBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS8vbzIuCiAKIAogICAgICAgICovCkBAIC03MDYsOSArNzA2LDkgQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9UcnVlRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYSBmbG9hdCByZXN1bHQsCi0JIG9yIG51bGwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xL28yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgbzEgYnkgbzIgZ2l2aW5nIGEgZmxvYXQgcmVzdWx0LAorICAgICBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS9vMi4KIAogCiAgICAgICAgKi8KQEAgLTcxNiw5ICs3MTYsOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1JlbWFpbmRlcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgbzEgYnkgbzIsIG9yIG51bGwgb24KLQkgZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSVvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzElbzIuCiAKIAogICAgICAgICovCkBAIC03MjYsOSArNzI2LDkgQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9EaXZtb2QoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgU2VlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBkaXZtb2QuICBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIGRpdm1vZChvMSxvMikuCisgICAgIFNlZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gZGl2bW9kLiAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBkaXZtb2QobzEsbzIpLgogCiAKICAgICAgICAqLwpAQCAtNzM3LDQyICs3MzcsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvMyk7CiAKICAgICAgICAvKgotCSBTZWUgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIHBvdy4gIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLgotCSBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgcG93KG8xLG8yLG8zKSwgd2hlcmUgbzMgaXMgb3B0aW9uYWwuCisgICAgIFNlZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gcG93LiAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBwb3cobzEsbzIsbzMpLCB3aGVyZSBvMyBpcyBvcHRpb25hbC4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9OZWdhdGl2ZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBvIG9uIHN1Y2Nlc3MsIG9yIG51bGwgb24gZmFpbHVyZS4KLQkgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IC1vLgorICAgICBSZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBvIG9uIHN1Y2Nlc3MsIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IC1vLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1Bvc2l0aXZlKFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0gICAgICAgICBSZXR1cm5zIHRoZSAod2hhdD8pIG9mIG8gb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgotCSBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogK28uCisgICAgIFJldHVybnMgdGhlICh3aGF0Pykgb2YgbyBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiArby4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BYnNvbHV0ZShQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBvLCBvciBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzCi0JIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYWJzKG8pLgorICAgICBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBvLCBvciBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzCisgICAgIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYWJzKG8pLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0ludmVydChQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBiaXR3aXNlIG5lZ2F0aW9uIG9mIG8gb24gc3VjY2Vzcywgb3IgTlVMTCBvbgotCSBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIH5vLgorICAgICBSZXR1cm5zIHRoZSBiaXR3aXNlIG5lZ2F0aW9uIG9mIG8gb24gc3VjY2Vzcywgb3IgTlVMTCBvbgorICAgICBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIH5vLgogCiAKICAgICAgICAqLwpAQCAtNzgwLDkgKzc4MCw5IEBACiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTHNoaWZ0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBsZWZ0IHNoaWZ0aW5nIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSA8PCBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGxlZnQgc2hpZnRpbmcgbzEgYnkgbzIgb24gc3VjY2Vzcywgb3IKKyAgICAgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xIDw8IG8yLgogCiAKICAgICAgICAqLwpAQCAtNzkwLDE4ICs3OTAsMTggQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9Sc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJpZ2h0IHNoaWZ0aW5nIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSA+PiBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJpZ2h0IHNoaWZ0aW5nIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSA+PiBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BbmQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgotCSBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSZvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSZvMi4KIAogCiAgICAgICAgKi8KQEAgLTgwOSw5ICs4MDksOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1hvcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBiaXR3aXNlIGV4Y2x1c2l2ZSBvciBvZiBvMSBieSBvMiBvbiBzdWNjZXNzLCBvcgotCSBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzFebzIuCisgICAgIFJldHVybnMgdGhlIGJpdHdpc2UgZXhjbHVzaXZlIG9yIG9mIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMV5vMi4KIAogCiAgICAgICAgKi8KQEAgLTgxOSw5ICs4MTksOSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX09yKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9uIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgotCSBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzF8bzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9uIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzF8bzIuCiAKICAgICAgICAqLwogCkBAIC04MjksMTggKzgyOSwxOCBAQAogCiAgICAgIGludCBQeU51bWJlcl9Db2VyY2UoUHlPYmplY3QgKipwMSwgUHlPYmplY3QgKipwMik7CiAKLQkgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgYWRkcmVzc2VzIG9mIHR3byB2YXJpYWJsZXMgb2YgdHlwZQotCSBQeU9iamVjdCouCisgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIGFkZHJlc3NlcyBvZiB0d28gdmFyaWFibGVzIG9mIHR5cGUKKyAgICAgUHlPYmplY3QqLgogCi0JIElmIHRoZSBvYmplY3RzIHBvaW50ZWQgdG8gYnkgKnAxIGFuZCAqcDIgaGF2ZSB0aGUgc2FtZSB0eXBlLAotCSBpbmNyZW1lbnQgdGhlaXIgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm4gMCAoc3VjY2VzcykuCi0JIElmIHRoZSBvYmplY3RzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gbnVtZXJpYyB0eXBlLAotCSByZXBsYWNlICpwMSBhbmQgKnAyIGJ5IHRoZWlyIGNvbnZlcnRlZCB2YWx1ZSAod2l0aCAnbmV3JwotCSByZWZlcmVuY2UgY291bnRzKSwgYW5kIHJldHVybiAwLgotCSBJZiBubyBjb252ZXJzaW9uIGlzIHBvc3NpYmxlLCBvciBpZiBzb21lIG90aGVyIGVycm9yIG9jY3VycywKLQkgcmV0dXJuIC0xIChmYWlsdXJlKSBhbmQgZG9uJ3QgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnRzLgotCSBUaGUgY2FsbCBQeU51bWJlcl9Db2VyY2UoJm8xLCAmbzIpIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQgbzEsIG8yID0gY29lcmNlKG8xLCBvMikuCisgICAgIElmIHRoZSBvYmplY3RzIHBvaW50ZWQgdG8gYnkgKnAxIGFuZCAqcDIgaGF2ZSB0aGUgc2FtZSB0eXBlLAorICAgICBpbmNyZW1lbnQgdGhlaXIgcmVmZXJlbmNlIGNvdW50IGFuZCByZXR1cm4gMCAoc3VjY2VzcykuCisgICAgIElmIHRoZSBvYmplY3RzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gbnVtZXJpYyB0eXBlLAorICAgICByZXBsYWNlICpwMSBhbmQgKnAyIGJ5IHRoZWlyIGNvbnZlcnRlZCB2YWx1ZSAod2l0aCAnbmV3JworICAgICByZWZlcmVuY2UgY291bnRzKSwgYW5kIHJldHVybiAwLgorICAgICBJZiBubyBjb252ZXJzaW9uIGlzIHBvc3NpYmxlLCBvciBpZiBzb21lIG90aGVyIGVycm9yIG9jY3VycywKKyAgICAgcmV0dXJuIC0xIChmYWlsdXJlKSBhbmQgZG9uJ3QgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnRzLgorICAgICBUaGUgY2FsbCBQeU51bWJlcl9Db2VyY2UoJm8xLCAmbzIpIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQgbzEsIG8yID0gY29lcmNlKG8xLCBvMikuCiAKICAgICAgICAqLwogCkBAIC04NDgsMTg0ICs4NDgsMTg0IEBACiAgICAoKG9iaiktPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmIFwKICAgICBQeVR5cGVfSGFzRmVhdHVyZSgob2JqKS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lOREVYKSAmJiBcCiAgICAgKG9iaiktPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW5kZXggIT0gTlVMTCkKLSAgICAgICAgCisKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JbmRleChQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBvYmplY3QgY29udmVydGVkIHRvIGEgUHl0aG9uIGxvbmcgb3IgaW50Ci0JIG9yIE5VTEwgd2l0aCBhbiBlcnJvciByYWlzZWQgb24gZmFpbHVyZS4KKyAgICAgUmV0dXJucyB0aGUgb2JqZWN0IGNvbnZlcnRlZCB0byBhIFB5dGhvbiBsb25nIG9yIGludAorICAgICBvciBOVUxMIHdpdGggYW4gZXJyb3IgcmFpc2VkIG9uIGZhaWx1cmUuCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5TnVtYmVyX0FzU3NpemVfdChQeU9iamVjdCAqbywgUHlPYmplY3QgKmV4Yyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJucyB0aGUgSW50ZWdyYWwgaW5zdGFuY2UgY29udmVydGVkIHRvIGFuIGludC4gVGhlCi0gICAgICAgICBpbnN0YW5jZSBpcyBleHBlY3RlZCB0byBiZSBpbnQgb3IgbG9uZyBvciBoYXZlIGFuIF9faW50X18KLSAgICAgICAgIG1ldGhvZC4gU3RlYWxzIGludGVncmFsJ3MgcmVmZXJlbmNlLiBlcnJvcl9mb3JtYXQgd2lsbCBiZQotICAgICAgICAgdXNlZCB0byBjcmVhdGUgdGhlIFR5cGVFcnJvciBpZiBpbnRlZ3JhbCBpc24ndCBhY3R1YWxseSBhbgotICAgICAgICAgSW50ZWdyYWwgaW5zdGFuY2UuIGVycm9yX2Zvcm1hdCBzaG91bGQgYmUgYSBmb3JtYXQgc3RyaW5nCi0gICAgICAgICB0aGF0IGNhbiBhY2NlcHQgYSBjaGFyKiBuYW1pbmcgaW50ZWdyYWwncyB0eXBlLgorICAgICBSZXR1cm5zIHRoZSBJbnRlZ3JhbCBpbnN0YW5jZSBjb252ZXJ0ZWQgdG8gYW4gaW50LiBUaGUKKyAgICAgaW5zdGFuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgaW50IG9yIGxvbmcgb3IgaGF2ZSBhbiBfX2ludF9fCisgICAgIG1ldGhvZC4gU3RlYWxzIGludGVncmFsJ3MgcmVmZXJlbmNlLiBlcnJvcl9mb3JtYXQgd2lsbCBiZQorICAgICB1c2VkIHRvIGNyZWF0ZSB0aGUgVHlwZUVycm9yIGlmIGludGVncmFsIGlzbid0IGFjdHVhbGx5IGFuCisgICAgIEludGVncmFsIGluc3RhbmNlLiBlcnJvcl9mb3JtYXQgc2hvdWxkIGJlIGEgZm9ybWF0IHN0cmluZworICAgICB0aGF0IGNhbiBhY2NlcHQgYSBjaGFyKiBuYW1pbmcgaW50ZWdyYWwncyB0eXBlLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCi0gICAgICAgICAgICAgUHlPYmplY3QgKmludGVncmFsLAotICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yX2Zvcm1hdCk7CisgICAgICAgICBQeU9iamVjdCAqaW50ZWdyYWwsCisgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9mb3JtYXQpOwogCiAgICAgICAgLyoKLSAgICAgICAgUmV0dXJucyB0aGUgb2JqZWN0IGNvbnZlcnRlZCB0byBQeV9zc2l6ZV90IGJ5IGdvaW5nIHRocm91Z2gKLSAgICAgICAgUHlOdW1iZXJfSW5kZXggZmlyc3QuICBJZiBhbiBvdmVyZmxvdyBlcnJvciBvY2N1cnMgd2hpbGUKLSAgICAgICAgY29udmVydGluZyB0aGUgaW50LW9yLWxvbmcgdG8gUHlfc3NpemVfdCwgdGhlbiB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgICAgIGlzIHRoZSBlcnJvci10eXBlIHRvIHJldHVybi4gIElmIGl0IGlzIE5VTEwsIHRoZW4gdGhlIG92ZXJmbG93IGVycm9yCi0gICAgICAgIGlzIGNsZWFyZWQgYW5kIHRoZSB2YWx1ZSBpcyBjbGlwcGVkLiAKKyAgICBSZXR1cm5zIHRoZSBvYmplY3QgY29udmVydGVkIHRvIFB5X3NzaXplX3QgYnkgZ29pbmcgdGhyb3VnaAorICAgIFB5TnVtYmVyX0luZGV4IGZpcnN0LiAgSWYgYW4gb3ZlcmZsb3cgZXJyb3Igb2NjdXJzIHdoaWxlCisgICAgY29udmVydGluZyB0aGUgaW50LW9yLWxvbmcgdG8gUHlfc3NpemVfdCwgdGhlbiB0aGUgc2Vjb25kIGFyZ3VtZW50CisgICAgaXMgdGhlIGVycm9yLXR5cGUgdG8gcmV0dXJuLiAgSWYgaXQgaXMgTlVMTCwgdGhlbiB0aGUgb3ZlcmZsb3cgZXJyb3IKKyAgICBpcyBjbGVhcmVkIGFuZCB0aGUgdmFsdWUgaXMgY2xpcHBlZC4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW50KFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGFuIGludGVnZXIgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBpbnQobykuCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGFuIGludGVnZXIgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBpbnQobykuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTG9uZyhQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBvIGNvbnZlcnRlZCB0byBhIGxvbmcgaW50ZWdlciBvYmplY3Qgb24gc3VjY2VzcywKLQkgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IGxvbmcobykuCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGEgbG9uZyBpbnRlZ2VyIG9iamVjdCBvbiBzdWNjZXNzLAorICAgICBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbG9uZyhvKS4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9GbG9hdChQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBvIGNvbnZlcnRlZCB0byBhIGZsb2F0IG9iamVjdCBvbiBzdWNjZXNzLCBvciBOVUxMCi0JIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgZmxvYXQobykuCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGEgZmxvYXQgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yIE5VTEwKKyAgICAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBmbG9hdChvKS4KICAgICAgICAqLwotCSAKKwogLyogIEluLXBsYWNlIHZhcmlhbnRzIG9mIChzb21lIG9mKSB0aGUgYWJvdmUgbnVtYmVyIHByb3RvY29sIGZ1bmN0aW9ucyAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZUFkZChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8yIHRvIG8xLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAotCSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xICs9IG8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8yIHRvIG8xLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAorICAgICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xICs9IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgbzIgZnJvbSBvMSwgcG9zc2libHkgaW4tcGxhY2Ugb3IKLQkgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xIC09IG8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgbzIgZnJvbSBvMSwgcG9zc2libHkgaW4tcGxhY2Ugb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC09IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgotCSBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEgKj0gbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSAqPSBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yIG51bGwKLQkgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSAvPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAorICAgICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC89IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZShQeU9iamVjdCAqbzEsCi0JCQkJCQkgICAgICAgUHlPYmplY3QgKm8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhbiBpbnRlZ3JhbCByZXN1bHQsCi0JIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSAvPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhbiBpbnRlZ3JhbCByZXN1bHQsCisgICAgIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSAvPSBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZShQeU9iamVjdCAqbzEsCi0JCQkJCQkgICAgICBQeU9iamVjdCAqbzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYSBmbG9hdCByZXN1bHQsCi0JIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSAvPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhIGZsb2F0IHJlc3VsdCwKKyAgICAgcG9zc2libHkgaW4tcGxhY2UsIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC89IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXIoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IKLQkgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246Ci0JIG8xICU9IG8yLgorICAgICBSZXR1cm5zIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgorICAgICBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEgJT0gbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZVBvd2VyKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yLAotICAgICAJCQkJCQkgUHlPYmplY3QgKm8zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzMpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJhaXNpbmcgbzEgdG8gdGhlIHBvd2VyIG9mIG8yLCBwb3NzaWJseQotCSBpbi1wbGFjZSwgb3IgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IG8xICoqPSBvMiwgb3IgcG93KG8xLCBvMiwgbzMpIGlmIG8zIGlzIHByZXNlbnQuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByYWlzaW5nIG8xIHRvIHRoZSBwb3dlciBvZiBvMiwgcG9zc2libHkKKyAgICAgaW4tcGxhY2UsIG9yIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSAqKj0gbzIsIG9yIHBvdyhvMSwgbzIsIG8zKSBpZiBvMyBpcyBwcmVzZW50LgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VMc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGxlZnQgc2hpZnRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgotCSBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEgPDw9IG8yLgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbGVmdCBzaGlmdGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSA8PD0gbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZVJzaGlmdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgcmlnaHQgc2hpZnRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlIG9yCi0JIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvMSA+Pj0gbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByaWdodCBzaGlmdGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2Ugb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xID4+PSBvMi4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlQW5kKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIGFuZCBvZiBvMSBhbmQgbzIsIHBvc3NpYmx5IGluLXBsYWNlLAotCSBvciBudWxsIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvMSAmPSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiwgcG9zc2libHkgaW4tcGxhY2UsCisgICAgIG9yIG51bGwgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xICY9IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VYb3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgUmV0dXJucyB0aGUgYml0d2lzZSBleGNsdXNpdmUgb3Igb2YgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgotCSBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgbzEgXj0gbzIuCisgICAgIFJldHVybnMgdGhlIGJpdHdpc2UgZXhjbHVzaXZlIG9yIG9mIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIF49IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VPcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYml0d2lzZSBvciBvZiBvMSBhbmQgbzIsIHBvc3NpYmx5IGluLXBsYWNlLAotCSBvciBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzEgfD0gbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9mIG8xIGFuZCBvMiwgcG9zc2libHkgaW4tcGxhY2UsCisgICAgIG9yIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSB8PSBvMi4KIAogICAgICAgICovCiAKQEAgLTEwMzMsOSArMTAzMyw5IEBACiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfVG9CYXNlKFB5T2JqZWN0ICpuLCBpbnQgYmFzZSk7CiAKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBpbnRlZ2VyIG4gY29udmVydGVkIHRvIGEgc3RyaW5nIHdpdGggYSBiYXNlLCB3aXRoIGEgYmFzZQotCSBtYXJrZXIgb2YgMGIsIDBvIG9yIDB4IHByZWZpeGVkIGlmIGFwcGxpY2FibGUuCi0JIElmIG4gaXMgbm90IGFuIGludCBvYmplY3QsIGl0IGlzIGNvbnZlcnRlZCB3aXRoIFB5TnVtYmVyX0luZGV4IGZpcnN0LgorICAgICBSZXR1cm5zIHRoZSBpbnRlZ2VyIG4gY29udmVydGVkIHRvIGEgc3RyaW5nIHdpdGggYSBiYXNlLCB3aXRoIGEgYmFzZQorICAgICBtYXJrZXIgb2YgMGIsIDBvIG9yIDB4IHByZWZpeGVkIGlmIGFwcGxpY2FibGUuCisgICAgIElmIG4gaXMgbm90IGFuIGludCBvYmplY3QsIGl0IGlzIGNvbnZlcnRlZCB3aXRoIFB5TnVtYmVyX0luZGV4IGZpcnN0LgogICAgICAgICovCiAKIApAQCAtMTA0NCwxNyArMTA0NCwxNyBAQAogICAgICBQeUFQSV9GVU5DKGludCkgUHlTZXF1ZW5jZV9DaGVjayhQeU9iamVjdCAqbyk7CiAKICAgICAgICAvKgotICAgICAgICAgUmV0dXJuIDEgaWYgdGhlIG9iamVjdCBwcm92aWRlcyBzZXF1ZW5jZSBwcm90b2NvbCwgYW5kIHplcm8KLQkgb3RoZXJ3aXNlLiAgCisgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgc2VxdWVuY2UgcHJvdG9jb2wsIGFuZCB6ZXJvCisgICAgIG90aGVyd2lzZS4KIAotCSBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTZXF1ZW5jZV9TaXplKFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0gICAgICAgICBSZXR1cm4gdGhlIHNpemUgb2Ygc2VxdWVuY2Ugb2JqZWN0IG8sIG9yIC0xIG9uIGZhaWx1cmUuCisgICAgIFJldHVybiB0aGUgc2l6ZSBvZiBzZXF1ZW5jZSBvYmplY3Qgbywgb3IgLTEgb24gZmFpbHVyZS4KIAogICAgICAgICovCiAKQEAgLTEwNjcsMTUxICsxMDY3LDE1MSBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfQ29uY2F0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBvMSBhbmQgbzIgb24gc3VjY2VzcywgYW5kIE5VTEwgb24KLQkgZmFpbHVyZS4gICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzErbzIuCisgICAgIFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBvMSBhbmQgbzIgb24gc3VjY2VzcywgYW5kIE5VTEwgb24KKyAgICAgZmFpbHVyZS4gICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzErbzIuCiAKICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9SZXBlYXQoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgY291bnQpOwogCiAgICAgICAgLyoKLQkgUmV0dXJuIHRoZSByZXN1bHQgb2YgcmVwZWF0aW5nIHNlcXVlbmNlIG9iamVjdCBvIGNvdW50IHRpbWVzLAotCSBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogbzEqY291bnQuCisgICAgIFJldHVybiB0aGUgcmVzdWx0IG9mIHJlcGVhdGluZyBzZXF1ZW5jZSBvYmplY3QgbyBjb3VudCB0aW1lcywKKyAgICAgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xKmNvdW50LgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfR2V0SXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2Ygbywgb3IgTlVMTCBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZQotCSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogb1tpXS4KKyAgICAgUmV0dXJuIHRoZSBpdGggZWxlbWVudCBvZiBvLCBvciBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlCisgICAgIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvW2ldLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0dldFNsaWNlKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgc2xpY2Ugb2Ygc2VxdWVuY2Ugb2JqZWN0IG8gYmV0d2VlbiBpMSBhbmQgaTIsIG9yCi0JIE5VTEwgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IG9baTE6aTJdLgorICAgICBSZXR1cm4gdGhlIHNsaWNlIG9mIHNlcXVlbmNlIG9iamVjdCBvIGJldHdlZW4gaTEgYW5kIGkyLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvW2kxOmkyXS4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfU2V0SXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdik7CiAKICAgICAgICAvKgotCSBBc3NpZ24gb2JqZWN0IHYgdG8gdGhlIGl0aCBlbGVtZW50IG9mIG8uICBSZXR1cm5zCi0JIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBvW2ldPXYuCisgICAgIEFzc2lnbiBvYmplY3QgdiB0byB0aGUgaXRoIGVsZW1lbnQgb2Ygby4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IG9baV09di4KIAogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfRGVsSXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpKTsKIAogICAgICAgIC8qCi0JIERlbGV0ZSB0aGUgaXRoIGVsZW1lbnQgb2Ygb2JqZWN0IHYuICBSZXR1cm5zCi0JIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBkZWwgb1tpXS4KKyAgICAgRGVsZXRlIHRoZSBpdGggZWxlbWVudCBvZiBvYmplY3Qgdi4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IGRlbCBvW2ldLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfU2V0U2xpY2UoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnYpOwogCiAgICAgICAgLyoKLSAgICAgICAgIEFzc2lnbiB0aGUgc2VxdWVuY2Ugb2JqZWN0LCB2LCB0byB0aGUgc2xpY2UgaW4gc2VxdWVuY2UKLQkgb2JqZWN0LCBvLCBmcm9tIGkxIHRvIGkyLiAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZQotCSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50OiBvW2kxOmkyXT12LgorICAgICBBc3NpZ24gdGhlIHNlcXVlbmNlIG9iamVjdCwgdiwgdG8gdGhlIHNsaWNlIGluIHNlcXVlbmNlCisgICAgIG9iamVjdCwgbywgZnJvbSBpMSB0byBpMi4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUKKyAgICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogb1tpMTppMl09di4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeVNlcXVlbmNlX0RlbFNsaWNlKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKTsKIAogICAgICAgIC8qCi0JIERlbGV0ZSB0aGUgc2xpY2UgaW4gc2VxdWVuY2Ugb2JqZWN0LCBvLCBmcm9tIGkxIHRvIGkyLgotCSBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgotCSBzdGF0ZW1lbnQ6IGRlbCBvW2kxOmkyXS4KKyAgICAgRGVsZXRlIHRoZSBzbGljZSBpbiBzZXF1ZW5jZSBvYmplY3QsIG8sIGZyb20gaTEgdG8gaTIuCisgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogZGVsIG9baTE6aTJdLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX1R1cGxlKFB5T2JqZWN0ICpvKTsKIAogICAgICAgIC8qCi0JIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlIG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHR1cGxlKG8pCisgICAgIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlIG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHR1cGxlKG8pCiAgICAgICAgKi8KIAogCiAgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9MaXN0KFB5T2JqZWN0ICpvKTsKICAgICAgICAvKgotCSBSZXR1cm5zIHRoZSBzZXF1ZW5jZSwgbywgYXMgYSBsaXN0IG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uIGZhaWx1cmUuCi0JIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGxpc3QobykKKyAgICAgUmV0dXJucyB0aGUgc2VxdWVuY2UsIG8sIGFzIGEgbGlzdCBvbiBzdWNjZXNzLCBhbmQgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOiBsaXN0KG8pCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfRmFzdChQeU9iamVjdCAqbywgY29uc3QgY2hhciogbSk7CiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlLCB1bmxlc3MgaXQncyBhbHJlYWR5IGEKLSAgICAgICAgIHR1cGxlIG9yIGxpc3QuICBVc2UgUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNIHRvIGFjY2VzcyB0aGUKLSAgICAgICAgIG1lbWJlcnMgb2YgdGhpcyBsaXN0LCBhbmQgUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFIHRvIGdldCBpdHMgbGVuZ3RoLgorICAgICBSZXR1cm5zIHRoZSBzZXF1ZW5jZSwgbywgYXMgYSB0dXBsZSwgdW5sZXNzIGl0J3MgYWxyZWFkeSBhCisgICAgIHR1cGxlIG9yIGxpc3QuICBVc2UgUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNIHRvIGFjY2VzcyB0aGUKKyAgICAgbWVtYmVycyBvZiB0aGlzIGxpc3QsIGFuZCBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUgdG8gZ2V0IGl0cyBsZW5ndGguCiAKLSAgICAgICAgIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAgSWYgdGhlIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZXJhdGlvbiwKLSAgICAgICAgIHJhaXNlcyBhIFR5cGVFcnJvciBleGNlcHRpb24gd2l0aCBtIGFzIHRoZSBtZXNzYWdlIHRleHQuCisgICAgIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAgSWYgdGhlIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZXJhdGlvbiwKKyAgICAgcmFpc2VzIGEgVHlwZUVycm9yIGV4Y2VwdGlvbiB3aXRoIG0gYXMgdGhlIG1lc3NhZ2UgdGV4dC4KICAgICAgICAqLwogCiAjZGVmaW5lIFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShvKSBcCi0JKFB5TGlzdF9DaGVjayhvKSA/IFB5TGlzdF9HRVRfU0laRShvKSA6IFB5VHVwbGVfR0VUX1NJWkUobykpCisgICAgKFB5TGlzdF9DaGVjayhvKSA/IFB5TGlzdF9HRVRfU0laRShvKSA6IFB5VHVwbGVfR0VUX1NJWkUobykpCiAgICAgICAgLyoKLQkgUmV0dXJuIHRoZSBzaXplIG9mIG8sIGFzc3VtaW5nIHRoYXQgbyB3YXMgcmV0dXJuZWQgYnkKLSAgICAgICAgIFB5U2VxdWVuY2VfRmFzdCBhbmQgaXMgbm90IE5VTEwuCisgICAgIFJldHVybiB0aGUgc2l6ZSBvZiBvLCBhc3N1bWluZyB0aGF0IG8gd2FzIHJldHVybmVkIGJ5CisgICAgIFB5U2VxdWVuY2VfRmFzdCBhbmQgaXMgbm90IE5VTEwuCiAgICAgICAgKi8KIAogI2RlZmluZSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0obywgaSlcCiAgICAgIChQeUxpc3RfQ2hlY2sobykgPyBQeUxpc3RfR0VUX0lURU0obywgaSkgOiBQeVR1cGxlX0dFVF9JVEVNKG8sIGkpKQogICAgICAgIC8qCi0JIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2YgbywgYXNzdW1pbmcgdGhhdCBvIHdhcyByZXR1cm5lZCBieQotICAgICAgICAgUHlTZXF1ZW5jZV9GYXN0LCBhbmQgdGhhdCBpIGlzIHdpdGhpbiBib3VuZHMuCisgICAgIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2YgbywgYXNzdW1pbmcgdGhhdCBvIHdhcyByZXR1cm5lZCBieQorICAgICBQeVNlcXVlbmNlX0Zhc3QsIGFuZCB0aGF0IGkgaXMgd2l0aGluIGJvdW5kcy4KICAgICAgICAqLwogCiAjZGVmaW5lIFB5U2VxdWVuY2VfSVRFTShvLCBpKVwKLQkoIFB5X1RZUEUobyktPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKG8sIGkpICkKKyAgICAoIFB5X1RZUEUobyktPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKG8sIGkpICkKICAgICAgICAvKiBBc3N1bWUgdHBfYXNfc2VxdWVuY2UgYW5kIHNxX2l0ZW0gZXhpc3QgYW5kIHRoYXQgaSBkb2VzIG5vdAotCSAgbmVlZCB0byBiZSBjb3JyZWN0ZWQgZm9yIGEgbmVnYXRpdmUgaW5kZXgKLSAgICAgICAqLyAgICAgCisgICAgICBuZWVkIHRvIGJlIGNvcnJlY3RlZCBmb3IgYSBuZWdhdGl2ZSBpbmRleAorICAgICAgICovCiAKICNkZWZpbmUgUHlTZXF1ZW5jZV9GYXN0X0lURU1TKHNmKSBcCi0JKFB5TGlzdF9DaGVjayhzZikgPyAoKFB5TGlzdE9iamVjdCAqKShzZikpLT5vYl9pdGVtIFwKLQkJCSAgOiAoKFB5VHVwbGVPYmplY3QgKikoc2YpKS0+b2JfaXRlbSkKLQkvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIGl0ZW0gYXJyYXkgZm9yCi0gICAgICAgICAgIGFuIG9iamVjdCByZXR1cmVkIGJ5IFB5U2VxdWVuY2VfRmFzdCAqLworICAgIChQeUxpc3RfQ2hlY2soc2YpID8gKChQeUxpc3RPYmplY3QgKikoc2YpKS0+b2JfaXRlbSBcCisgICAgICAgICAgICAgICAgICAgICAgOiAoKFB5VHVwbGVPYmplY3QgKikoc2YpKS0+b2JfaXRlbSkKKyAgICAvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIGl0ZW0gYXJyYXkgZm9yCisgICAgICAgYW4gb2JqZWN0IHJldHVyZWQgYnkgUHlTZXF1ZW5jZV9GYXN0ICovCiAKICAgICAgUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVNlcXVlbmNlX0NvdW50KFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqdmFsdWUpOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9uIHZhbHVlIG9uIG8sIHRoYXQgaXMsCi0JIHJldHVybiB0aGUgbnVtYmVyIG9mIGtleXMgZm9yIHdoaWNoIG9ba2V5XT09dmFsdWUuICBPbgotCSBmYWlsdXJlLCByZXR1cm4gLTEuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvLmNvdW50KHZhbHVlKS4KKyAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb24gdmFsdWUgb24gbywgdGhhdCBpcywKKyAgICAgcmV0dXJuIHRoZSBudW1iZXIgb2Yga2V5cyBmb3Igd2hpY2ggb1trZXldPT12YWx1ZS4gIE9uCisgICAgIGZhaWx1cmUsIHJldHVybiAtMS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8uY291bnQodmFsdWUpLgogICAgICAgICovCiAKICAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfQ29udGFpbnMoUHlPYmplY3QgKnNlcSwgUHlPYmplY3QgKm9iKTsKICAgICAgICAvKgotICAgICAgICAgUmV0dXJuIC0xIGlmIGVycm9yOyAxIGlmIG9iIGluIHNlcTsgMCBpZiBvYiBub3QgaW4gc2VxLgotICAgICAgICAgVXNlIF9fY29udGFpbnNfXyBpZiBwb3NzaWJsZSwgZWxzZSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKCkuCisgICAgIFJldHVybiAtMSBpZiBlcnJvcjsgMSBpZiBvYiBpbiBzZXE7IDAgaWYgb2Igbm90IGluIHNlcS4KKyAgICAgVXNlIF9fY29udGFpbnNfXyBpZiBwb3NzaWJsZSwgZWxzZSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKCkuCiAgICAgICAgKi8KIAogI2RlZmluZSBQWV9JVEVSU0VBUkNIX0NPVU5UICAgIDEKICNkZWZpbmUgUFlfSVRFUlNFQVJDSF9JTkRFWCAgICAyCiAjZGVmaW5lIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMgMwogICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goUHlPYmplY3QgKnNlcSwKLSAgICAgCQkJCQlQeU9iamVjdCAqb2JqLCBpbnQgb3BlcmF0aW9uKTsKLQkvKgotCSAgSXRlcmF0ZSBvdmVyIHNlcS4gIFJlc3VsdCBkZXBlbmRzIG9uIHRoZSBvcGVyYXRpb246Ci0JICBQWV9JVEVSU0VBUkNIX0NPVU5UOiAgcmV0dXJuICMgb2YgdGltZXMgb2JqIGFwcGVhcnMgaW4gc2VxOyAtMSBpZgotCSAgCWVycm9yLgotCSAgUFlfSVRFUlNFQVJDSF9JTkRFWDogIHJldHVybiAwLWJhc2VkIGluZGV4IG9mIGZpcnN0IG9jY3VycmVuY2Ugb2YKLQkgIAlvYmogaW4gc2VxOyBzZXQgVmFsdWVFcnJvciBhbmQgcmV0dXJuIC0xIGlmIG5vbmUgZm91bmQ7Ci0JICAJYWxzbyByZXR1cm4gLTEgb24gZXJyb3IuCi0JICBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TOiAgcmV0dXJuIDEgaWYgb2JqIGluIHNlcSwgZWxzZSAwOyAtMSBvbgotCSAgCWVycm9yLgotCSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9iaiwgaW50IG9wZXJhdGlvbik7CisgICAgLyoKKyAgICAgIEl0ZXJhdGUgb3ZlciBzZXEuICBSZXN1bHQgZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW9uOgorICAgICAgUFlfSVRFUlNFQVJDSF9DT1VOVDogIHJldHVybiAjIG9mIHRpbWVzIG9iaiBhcHBlYXJzIGluIHNlcTsgLTEgaWYKKyAgICAgICAgZXJyb3IuCisgICAgICBQWV9JVEVSU0VBUkNIX0lOREVYOiAgcmV0dXJuIDAtYmFzZWQgaW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZSBvZgorICAgICAgICBvYmogaW4gc2VxOyBzZXQgVmFsdWVFcnJvciBhbmQgcmV0dXJuIC0xIGlmIG5vbmUgZm91bmQ7CisgICAgICAgIGFsc28gcmV0dXJuIC0xIG9uIGVycm9yLgorICAgICAgUFlfSVRFUlNFQVJDSF9DT05UQUlOUzogIHJldHVybiAxIGlmIG9iaiBpbiBzZXEsIGVsc2UgMDsgLTEgb24KKyAgICAgICAgZXJyb3IuCisgICAgKi8KIAogLyogRm9yIERMTC1sZXZlbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwogI3VuZGVmIFB5U2VxdWVuY2VfSW4KQEAgLTEyMjEsMTcgKzEyMjEsMTcgQEAKICNkZWZpbmUgUHlTZXF1ZW5jZV9JbiBQeVNlcXVlbmNlX0NvbnRhaW5zCiAKICAgICAgICAvKgotCSBEZXRlcm1pbmUgaWYgbyBjb250YWlucyB2YWx1ZS4gIElmIGFuIGl0ZW0gaW4gbyBpcyBlcXVhbCB0bwotCSBYLCByZXR1cm4gMSwgb3RoZXJ3aXNlIHJldHVybiAwLiAgT24gZXJyb3IsIHJldHVybiAtMS4gIFRoaXMKLQkgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHZhbHVlIGluIG8uCisgICAgIERldGVybWluZSBpZiBvIGNvbnRhaW5zIHZhbHVlLiAgSWYgYW4gaXRlbSBpbiBvIGlzIGVxdWFsIHRvCisgICAgIFgsIHJldHVybiAxLCBvdGhlcndpc2UgcmV0dXJuIDAuICBPbiBlcnJvciwgcmV0dXJuIC0xLiAgVGhpcworICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdmFsdWUgaW4gby4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTZXF1ZW5jZV9JbmRleChQeU9iamVjdCAqbywgUHlPYmplY3QgKnZhbHVlKTsKIAogICAgICAgIC8qCi0JIFJldHVybiB0aGUgZmlyc3QgaW5kZXggZm9yIHdoaWNoIG9baV09dmFsdWUuICBPbiBlcnJvciwKLQkgcmV0dXJuIC0xLiAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvLmluZGV4KHZhbHVlKS4KKyAgICAgUmV0dXJuIHRoZSBmaXJzdCBpbmRleCBmb3Igd2hpY2ggb1tpXT12YWx1ZS4gIE9uIGVycm9yLAorICAgICByZXR1cm4gLTEuICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8uaW5kZXgodmFsdWUpLgogICAgICAgICovCiAKIC8qIEluLXBsYWNlIHZlcnNpb25zIG9mIHNvbWUgb2YgdGhlIGFib3ZlIFNlcXVlbmNlIGZ1bmN0aW9ucy4gKi8KQEAgLTEyMzksMTggKzEyMzksMTggQEAKICAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOwogCiAgICAgICAgLyoKLQkgQXBwZW5kIG8yIHRvIG8xLCBpbi1wbGFjZSB3aGVuIHBvc3NpYmxlLiBSZXR1cm4gdGhlIHJlc3VsdGluZwotCSBvYmplY3QsIHdoaWNoIGNvdWxkIGJlIG8xLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZQotCSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzEgKz0gbzIuCisgICAgIEFwcGVuZCBvMiB0byBvMSwgaW4tcGxhY2Ugd2hlbiBwb3NzaWJsZS4gUmV0dXJuIHRoZSByZXN1bHRpbmcKKyAgICAgb2JqZWN0LCB3aGljaCBjb3VsZCBiZSBvMSwgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUKKyAgICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xICs9IG8yLgogCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudCk7CiAKICAgICAgICAvKgotCSBSZXBlYXQgbzEgYnkgY291bnQsIGluLXBsYWNlIHdoZW4gcG9zc2libGUuIFJldHVybiB0aGUgcmVzdWx0aW5nCi0JIG9iamVjdCwgd2hpY2ggY291bGQgYmUgbzEsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlCi0JIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMSAqPSBjb3VudC4KKyAgICAgUmVwZWF0IG8xIGJ5IGNvdW50LCBpbi1wbGFjZSB3aGVuIHBvc3NpYmxlLiBSZXR1cm4gdGhlIHJlc3VsdGluZworICAgICBvYmplY3QsIHdoaWNoIGNvdWxkIGJlIG8xLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZQorICAgICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzEgKj0gY291bnQuCiAKICAgICAgICAqLwogCkBAIC0xMjU5LDE4ICsxMjU5LDE4IEBACiAgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU1hcHBpbmdfQ2hlY2soUHlPYmplY3QgKm8pOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgbWFwcGluZyBwcm90b2NvbCwgYW5kIHplcm8KLQkgb3RoZXJ3aXNlLiAgCisgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgbWFwcGluZyBwcm90b2NvbCwgYW5kIHplcm8KKyAgICAgb3RoZXJ3aXNlLgogCi0JIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KICAgICAgICAqLwogCiAgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlNYXBwaW5nX1NpemUoUHlPYmplY3QgKm8pOwogCiAgICAgICAgLyoKLSAgICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXlzIGluIG9iamVjdCBvIG9uIHN1Y2Nlc3MsIGFuZCAtMSBvbgotCSBmYWlsdXJlLiAgRm9yIG9iamVjdHMgdGhhdCBkbyBub3QgcHJvdmlkZSBzZXF1ZW5jZSBwcm90b2NvbCwKLQkgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbGVuKG8pLgorICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBpbiBvYmplY3QgbyBvbiBzdWNjZXNzLCBhbmQgLTEgb24KKyAgICAgZmFpbHVyZS4gIEZvciBvYmplY3RzIHRoYXQgZG8gbm90IHByb3ZpZGUgc2VxdWVuY2UgcHJvdG9jb2wsCisgICAgIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGxlbihvKS4KICAgICAgICAqLwogCiAgICAgICAgLyogRm9yIERMTCBjb21wYXRpYmlsaXR5ICovCkBAIC0xMjgzLDkgKzEyODMsOSBAQAogCiAgICAgIGludCBQeU1hcHBpbmdfRGVsSXRlbVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KTsKIAotCSBSZW1vdmUgdGhlIG1hcHBpbmcgZm9yIG9iamVjdCwga2V5LCBmcm9tIHRoZSBvYmplY3QgKm8uCi0JIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotCSB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KKyAgICAgUmVtb3ZlIHRoZSBtYXBwaW5nIGZvciBvYmplY3QsIGtleSwgZnJvbSB0aGUgb2JqZWN0ICpvLgorICAgICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IGRlbCBvW2tleV0uCiAgICAgICAgKi8KICNkZWZpbmUgUHlNYXBwaW5nX0RlbEl0ZW1TdHJpbmcoTyxLKSBQeU9iamVjdF9EZWxJdGVtU3RyaW5nKChPKSwoSykpCiAKQEAgLTEyOTMsMzAgKzEyOTMsMzAgQEAKIAogICAgICBpbnQgUHlNYXBwaW5nX0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpOwogCi0JIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KLQkgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCi0JIHRoZSBQeXRob24gc3RhdGVtZW50OiBkZWwgb1trZXldLgorICAgICBSZW1vdmUgdGhlIG1hcHBpbmcgZm9yIG9iamVjdCwga2V5LCBmcm9tIHRoZSBvYmplY3QgKm8uCisgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bworICAgICB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KICAgICAgICAqLwogI2RlZmluZSBQeU1hcHBpbmdfRGVsSXRlbShPLEspIFB5T2JqZWN0X0RlbEl0ZW0oKE8pLChLKSkKIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX0hhc0tleVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KTsKIAogICAgICAgIC8qCi0JIE9uIHN1Y2Nlc3MsIHJldHVybiAxIGlmIHRoZSBtYXBwaW5nIG9iamVjdCBoYXMgdGhlIGtleSwga2V5LAotCSBhbmQgMCBvdGhlcndpc2UuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOgotCSBvLmhhc19rZXkoa2V5KS4gCisgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiAxIGlmIHRoZSBtYXBwaW5nIG9iamVjdCBoYXMgdGhlIGtleSwga2V5LAorICAgICBhbmQgMCBvdGhlcndpc2UuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvLmhhc19rZXkoa2V5KS4KIAotCSBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKyAgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX0hhc0tleShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSk7CiAKICAgICAgICAvKgotCSBSZXR1cm4gMSBpZiB0aGUgbWFwcGluZyBvYmplY3QgaGFzIHRoZSBrZXksIGtleSwKLQkgYW5kIDAgb3RoZXJ3aXNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgby5oYXNfa2V5KGtleSkuIAorICAgICBSZXR1cm4gMSBpZiB0aGUgbWFwcGluZyBvYmplY3QgaGFzIHRoZSBrZXksIGtleSwKKyAgICAgYW5kIDAgb3RoZXJ3aXNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgby5oYXNfa2V5KGtleSkuCiAKLQkgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgogCiAgICAgICAgKi8KIApAQCAtMTMyNCw5ICsxMzI0LDkgQEAKIAogICAgICBQeU9iamVjdCAqUHlNYXBwaW5nX0tleXMoUHlPYmplY3QgKm8pOwogCi0gICAgICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBrZXlzIGluIG9iamVjdCBvLiAgT24KLQkgZmFpbHVyZSwgcmV0dXJuIE5VTEwuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCi0JIGV4cHJlc3Npb246IG8ua2V5cygpLgorICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBrZXlzIGluIG9iamVjdCBvLiAgT24KKyAgICAgZmFpbHVyZSwgcmV0dXJuIE5VTEwuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8ua2V5cygpLgogICAgICAgICovCiAjZGVmaW5lIFB5TWFwcGluZ19LZXlzKE8pIFB5T2JqZWN0X0NhbGxNZXRob2QoTywia2V5cyIsTlVMTCkKIApAQCAtMTMzNCw5ICsxMzM0LDkgQEAKIAogICAgICBQeU9iamVjdCAqUHlNYXBwaW5nX1ZhbHVlcyhQeU9iamVjdCAqbyk7CiAKLSAgICAgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIHZhbHVlcyBpbiBvYmplY3Qgby4gIE9uCi0JIGZhaWx1cmUsIHJldHVybiBOVUxMLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgotCSBleHByZXNzaW9uOiBvLnZhbHVlcygpLgorICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSB2YWx1ZXMgaW4gb2JqZWN0IG8uICBPbgorICAgICBmYWlsdXJlLCByZXR1cm4gTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogby52YWx1ZXMoKS4KICAgICAgICAqLwogI2RlZmluZSBQeU1hcHBpbmdfVmFsdWVzKE8pIFB5T2JqZWN0X0NhbGxNZXRob2QoTywidmFsdWVzIixOVUxMKQogCkBAIC0xMzQ0LDEwICsxMzQ0LDEwIEBACiAKICAgICAgUHlPYmplY3QgKlB5TWFwcGluZ19JdGVtcyhQeU9iamVjdCAqbyk7CiAKLSAgICAgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIGl0ZW1zIGluIG9iamVjdCBvLCB3aGVyZQotCSBlYWNoIGl0ZW0gaXMgYSB0dXBsZSBjb250YWluaW5nIGEga2V5LXZhbHVlIHBhaXIuICBPbgotCSBmYWlsdXJlLCByZXR1cm4gTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KLQkgZXhwcmVzc2lvbjogby5pdGVtcygpLgorICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSBpdGVtcyBpbiBvYmplY3Qgbywgd2hlcmUKKyAgICAgZWFjaCBpdGVtIGlzIGEgdHVwbGUgY29udGFpbmluZyBhIGtleS12YWx1ZSBwYWlyLiAgT24KKyAgICAgZmFpbHVyZSwgcmV0dXJuIE5VTEwuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8uaXRlbXMoKS4KIAogICAgICAgICovCiAjZGVmaW5lIFB5TWFwcGluZ19JdGVtcyhPKSBQeU9iamVjdF9DYWxsTWV0aG9kKE8sIml0ZW1zIixOVUxMKQpAQCAtMTM1NSwxOCArMTM1NSwxOCBAQAogICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpOwogCiAgICAgICAgLyoKLQkgUmV0dXJuIGVsZW1lbnQgb2YgbyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QsIGtleSwgb3IgTlVMTAotCSBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKLQkgb1trZXldLgorICAgICBSZXR1cm4gZWxlbWVudCBvZiBvIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCwga2V5LCBvciBOVUxMCisgICAgIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvW2tleV0uCiAgICAgICAgKi8KIAogICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnZhbHVlKTsKIAogICAgICAgIC8qCi0JIE1hcCB0aGUgb2JqZWN0LCBrZXksIHRvIHRoZSB2YWx1ZSwgdi4gIFJldHVybnMgCi0JIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KLQkgc3RhdGVtZW50OiBvW2tleV09di4KKyAgICAgTWFwIHRoZSBvYmplY3QsIGtleSwgdG8gdGhlIHZhbHVlLCB2LiAgUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogb1trZXldPXYuCiAgICAgICAqLwogCiAKZGlmZiAtLWdpdCBhL0luY2x1ZGUvY2V2YWwuaCBiL0luY2x1ZGUvY2V2YWwuaAppbmRleCBmNDQxMTk3Li40MGY3Yjk0IDEwMDY0NAotLS0gYS9JbmNsdWRlL2NldmFsLmgKKysrIGIvSW5jbHVkZS9jZXZhbC5oCkBAIC04LDcgKzgsNyBAQAogLyogSW50ZXJmYWNlIHRvIHJhbmRvbSBwYXJ0cyBpbiBjZXZhbC5jICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoCi0JUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIC8qIERMTC1sZXZlbCBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogKi8KICN1bmRlZiBQeUV2YWxfQ2FsbE9iamVjdApAQCAtMTYsNyArMTYsNyBAQAogCiAvKiBJbmxpbmUgdGhpcyAqLwogI2RlZmluZSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLGFyZykgXAotICAgICAgICBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmcsIChQeU9iamVjdCAqKU5VTEwpCisgICAgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJnLCAoUHlPYmplY3QgKilOVUxMKQogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9DYWxsRnVuY3Rpb24oUHlPYmplY3QgKm9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CkBAIC01MCwxMCArNTAsMTAgQEAKIFB5QVBJX0ZVTkMoaW50KSBQeV9HZXRSZWN1cnNpb25MaW1pdCh2b2lkKTsKIAogI2RlZmluZSBQeV9FbnRlclJlY3Vyc2l2ZUNhbGwod2hlcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAoX1B5X01ha2VSZWNDaGVjayhQeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fZGVwdGgpICYmICBcCi0JICAgICBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsKHdoZXJlKSkKLSNkZWZpbmUgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCkJCQkJXAotCSAgICAoLS1QeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fZGVwdGgpCisgICAgICAgICAgICAoX1B5X01ha2VSZWNDaGVjayhQeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fZGVwdGgpICYmICBcCisgICAgICAgICAgICAgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbCh3aGVyZSkpCisjZGVmaW5lIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgtLVB5VGhyZWFkU3RhdGVfR0VUKCktPnJlY3Vyc2lvbl9kZXB0aCkKIFB5QVBJX0ZVTkMoaW50KSBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsKGNoYXIgKndoZXJlKTsKIFB5QVBJX0RBVEEoaW50KSBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdDsKICNpZmRlZiBVU0VfU1RBQ0tDSEVDSwpAQCAtNzksMzEgKzc5LDMxIEBACiAgICB0aGF0IGxhc3RzIGEgbG9uZyB0aW1lIGFuZCBkb2Vzbid0IHRvdWNoIFB5dGhvbiBkYXRhKSBjYW4gYWxsb3cgb3RoZXIKICAgIHRocmVhZHMgdG8gcnVuIGFzIGZvbGxvd3M6CiAKLQkuLi5wcmVwYXJhdGlvbnMgaGVyZS4uLgotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkuLi5ibG9ja2luZyBzeXN0ZW0gY2FsbCBoZXJlLi4uCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkuLi5pbnRlcnByZXQgcmVzdWx0IGhlcmUuLi4KKyAgICAuLi5wcmVwYXJhdGlvbnMgaGVyZS4uLgorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAuLi5ibG9ja2luZyBzeXN0ZW0gY2FsbCBoZXJlLi4uCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAuLi5pbnRlcnByZXQgcmVzdWx0IGhlcmUuLi4KIAogICAgVGhlIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMvUHlfRU5EX0FMTE9XX1RIUkVBRFMgcGFpciBleHBhbmRzIHRvIGEKICAgIHt9LXN1cnJvdW5kZWQgYmxvY2suCiAgICBUbyBsZWF2ZSB0aGUgYmxvY2sgaW4gdGhlIG1pZGRsZSAoZS5nLiwgd2l0aCByZXR1cm4pLCB5b3UgbXVzdCBpbnNlcnQKICAgIGEgbGluZSBjb250YWluaW5nIFB5X0JMT0NLX1RIUkVBRFMgYmVmb3JlIHRoZSByZXR1cm4sIGUuZy4KIAotCWlmICguLi5wcmVtYXR1cmVfZXhpdC4uLikgewotCQlQeV9CTE9DS19USFJFQURTCi0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICguLi5wcmVtYXR1cmVfZXhpdC4uLikgeworICAgICAgICBQeV9CTE9DS19USFJFQURTCisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICBBbiBhbHRlcm5hdGl2ZSBpczoKIAotCVB5X0JMT0NLX1RIUkVBRFMKLQlpZiAoLi4ucHJlbWF0dXJlX2V4aXQuLi4pIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfVU5CTE9DS19USFJFQURTCisgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgIGlmICguLi5wcmVtYXR1cmVfZXhpdC4uLikgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9VTkJMT0NLX1RIUkVBRFMKIAogICAgRm9yIGNvbnZlbmllbmNlLCB0aGF0IHRoZSB2YWx1ZSBvZiAnZXJybm8nIGlzIHJlc3RvcmVkIGFjcm9zcwogICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMgYW5kIFB5X0JMT0NLX1RIUkVBRFMuCkBAIC0xMzIsMTIgKzEzMiwxMiBAQAogUHlBUElfRlVOQyh2b2lkKSBQeUV2YWxfUmVJbml0VGhyZWFkcyh2b2lkKTsKIAogI2RlZmluZSBQeV9CRUdJTl9BTExPV19USFJFQURTIHsgXAotCQkJUHlUaHJlYWRTdGF0ZSAqX3NhdmU7IFwKLQkJCV9zYXZlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKLSNkZWZpbmUgUHlfQkxPQ0tfVEhSRUFEUwlQeUV2YWxfUmVzdG9yZVRocmVhZChfc2F2ZSk7Ci0jZGVmaW5lIFB5X1VOQkxPQ0tfVEhSRUFEUwlfc2F2ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7Ci0jZGVmaW5lIFB5X0VORF9BTExPV19USFJFQURTCVB5RXZhbF9SZXN0b3JlVGhyZWFkKF9zYXZlKTsgXAotCQkgfQorICAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqX3NhdmU7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zYXZlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKKyNkZWZpbmUgUHlfQkxPQ0tfVEhSRUFEUyAgICAgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoX3NhdmUpOworI2RlZmluZSBQeV9VTkJMT0NLX1RIUkVBRFMgICAgICBfc2F2ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisjZGVmaW5lIFB5X0VORF9BTExPV19USFJFQURTICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKF9zYXZlKTsgXAorICAgICAgICAgICAgICAgICB9CiAKICNlbHNlIC8qICFXSVRIX1RIUkVBRCAqLwogCmRpZmYgLS1naXQgYS9JbmNsdWRlL2RhdGV0aW1lLmggYi9JbmNsdWRlL2RhdGV0aW1lLmgKaW5kZXggMGQzMTBiNC4uMjgzMThlYSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9kYXRldGltZS5oCisrKyBiL0luY2x1ZGUvZGF0ZXRpbWUuaApAQCAtMTEsMTMgKzExLDEzIEBACiAgKiBiaWctZW5kaWFuLCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkOgogICoKICAqIGJ5dGUgb2Zmc2V0Ci0gKiAgMCAJCXllYXIgICAgIDIgYnl0ZXMsIDEtOTk5OQotICogIDIJCW1vbnRoICAgIDEgYnl0ZSwgMS0xMgotICogIDMgCQlkYXkgICAgICAxIGJ5dGUsIDEtMzEKLSAqICA0CQlob3VyICAgICAxIGJ5dGUsIDAtMjMKLSAqICA1IAkJbWludXRlICAgMSBieXRlLCAwLTU5Ci0gKiAgNiAJCXNlY29uZCAgIDEgYnl0ZSwgMC01OQotICogIDcgCQl1c2Vjb25kICAzIGJ5dGVzLCAwLTk5OTk5OQorICogIDAgICAgICAgICAgIHllYXIgICAgIDIgYnl0ZXMsIDEtOTk5OQorICogIDIgICAgICAgICAgIG1vbnRoICAgIDEgYnl0ZSwgMS0xMgorICogIDMgICAgICAgICAgIGRheSAgICAgIDEgYnl0ZSwgMS0zMQorICogIDQgICAgICAgICAgIGhvdXIgICAgIDEgYnl0ZSwgMC0yMworICogIDUgICAgICAgICAgIG1pbnV0ZSAgIDEgYnl0ZSwgMC01OQorICogIDYgICAgICAgICAgIHNlY29uZCAgIDEgYnl0ZSwgMC01OQorICogIDcgICAgICAgICAgIHVzZWNvbmQgIDMgYnl0ZXMsIDAtOTk5OTk5CiAgKiAxMAogICovCiAKQEAgLTMzLDI2ICszMywyNiBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotCVB5T2JqZWN0X0hFQUQKLQlsb25nIGhhc2hjb2RlOwkJLyogLTEgd2hlbiB1bmtub3duICovCi0JaW50IGRheXM7CQkvKiAtTUFYX0RFTFRBX0RBWVMgPD0gZGF5cyA8PSBNQVhfREVMVEFfREFZUyAqLwotCWludCBzZWNvbmRzOwkJLyogMCA8PSBzZWNvbmRzIDwgMjQqMzYwMCBpcyBpbnZhcmlhbnQgKi8KLQlpbnQgbWljcm9zZWNvbmRzOwkvKiAwIDw9IG1pY3Jvc2Vjb25kcyA8IDEwMDAwMDAgaXMgaW52YXJpYW50ICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgaGFzaGNvZGU7ICAgICAgICAgICAgICAvKiAtMSB3aGVuIHVua25vd24gKi8KKyAgICBpbnQgZGF5czsgICAgICAgICAgICAgICAgICAgLyogLU1BWF9ERUxUQV9EQVlTIDw9IGRheXMgPD0gTUFYX0RFTFRBX0RBWVMgKi8KKyAgICBpbnQgc2Vjb25kczsgICAgICAgICAgICAgICAgLyogMCA8PSBzZWNvbmRzIDwgMjQqMzYwMCBpcyBpbnZhcmlhbnQgKi8KKyAgICBpbnQgbWljcm9zZWNvbmRzOyAgICAgICAgICAgLyogMCA8PSBtaWNyb3NlY29uZHMgPCAxMDAwMDAwIGlzIGludmFyaWFudCAqLwogfSBQeURhdGVUaW1lX0RlbHRhOwogCiB0eXBlZGVmIHN0cnVjdAogewotCVB5T2JqZWN0X0hFQUQJCS8qIGEgcHVyZSBhYnN0cmFjdCBiYXNlIGNsYXNlICovCisgICAgUHlPYmplY3RfSEVBRCAgICAgICAgICAgICAgIC8qIGEgcHVyZSBhYnN0cmFjdCBiYXNlIGNsYXNlICovCiB9IFB5RGF0ZVRpbWVfVFpJbmZvOwogCiAKIC8qIFRoZSBkYXRldGltZSBhbmQgdGltZSB0eXBlcyBoYXZlIGhhc2hjb2RlcywgYW5kIGFuIG9wdGlvbmFsIHR6aW5mbyBtZW1iZXIsCiAgKiBwcmVzZW50IGlmIGFuZCBvbmx5IGlmIGhhc3R6aW5mbyBpcyB0cnVlLgogICovCi0jZGVmaW5lIF9QeVRaSU5GT19IRUFECQlcCi0JUHlPYmplY3RfSEVBRAkJXAotCWxvbmcgaGFzaGNvZGU7CQlcCi0JY2hhciBoYXN0emluZm87CQkvKiBib29sZWFuIGZsYWcgKi8KKyNkZWZpbmUgX1B5VFpJTkZPX0hFQUQgICAgICAgICAgXAorICAgIFB5T2JqZWN0X0hFQUQgICAgICAgICAgICAgICBcCisgICAgbG9uZyBoYXNoY29kZTsgICAgICAgICAgICAgIFwKKyAgICBjaGFyIGhhc3R6aW5mbzsgICAgICAgICAgICAgLyogYm9vbGVhbiBmbGFnICovCiAKIC8qIE5vIF9QeURhdGVUaW1lX0Jhc2VUWkluZm8gaXMgYWxsb2NhdGVkOyBpdCdzIGp1c3QgdG8gaGF2ZSBzb21ldGhpbmcKICAqIGNvbnZlbmllbnQgdG8gY2FzdCB0bywgd2hlbiBnZXR0aW5nIGF0IHRoZSBoYXN0emluZm8gbWVtYmVyIG9mIG9iamVjdHMKQEAgLTYwLDcgKzYwLDcgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlfUHlUWklORk9fSEVBRAorICAgIF9QeVRaSU5GT19IRUFECiB9IF9QeURhdGVUaW1lX0Jhc2VUWkluZm87CiAKIC8qIEFsbCB0aW1lIG9iamVjdHMgYXJlIG9mIFB5RGF0ZVRpbWVfVGltZVR5cGUsIGJ1dCB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQKQEAgLTY5LDIwICs2OSwyMCBAQAogICogaW50ZXJuYWwgc3RydWN0IHVzZWQgdG8gYWxsb2NhdGUgdGhlIHJpZ2h0IGFtb3VudCBvZiBzcGFjZSBmb3IgdGhlCiAgKiAid2l0aG91dCIgY2FzZS4KICAqLwotI2RlZmluZSBfUHlEYXRlVGltZV9USU1FSEVBRAlcCi0JX1B5VFpJTkZPX0hFQUQJCVwKLQl1bnNpZ25lZCBjaGFyIGRhdGFbX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRV07CisjZGVmaW5lIF9QeURhdGVUaW1lX1RJTUVIRUFEICAgIFwKKyAgICBfUHlUWklORk9fSEVBRCAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGNoYXIgZGF0YVtfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFXTsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlfUHlEYXRlVGltZV9USU1FSEVBRAotfSBfUHlEYXRlVGltZV9CYXNlVGltZTsJCS8qIGhhc3R6aW5mbyBmYWxzZSAqLworICAgIF9QeURhdGVUaW1lX1RJTUVIRUFECit9IF9QeURhdGVUaW1lX0Jhc2VUaW1lOyAgICAgICAgIC8qIGhhc3R6aW5mbyBmYWxzZSAqLwogCiB0eXBlZGVmIHN0cnVjdAogewotCV9QeURhdGVUaW1lX1RJTUVIRUFECi0JUHlPYmplY3QgKnR6aW5mbzsKLX0gUHlEYXRlVGltZV9UaW1lOwkJLyogaGFzdHppbmZvIHRydWUgKi8KKyAgICBfUHlEYXRlVGltZV9USU1FSEVBRAorICAgIFB5T2JqZWN0ICp0emluZm87Cit9IFB5RGF0ZVRpbWVfVGltZTsgICAgICAgICAgICAgIC8qIGhhc3R6aW5mbyB0cnVlICovCiAKIAogLyogQWxsIGRhdGV0aW1lIG9iamVjdHMgYXJlIG9mIFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlLCBidXQgdGhhdCBjYW4gYmUKQEAgLTkyLDQ4ICs5Miw0OCBAQAogICovCiB0eXBlZGVmIHN0cnVjdAogewotCV9QeVRaSU5GT19IRUFECi0JdW5zaWduZWQgY2hhciBkYXRhW19QeURhdGVUaW1lX0RBVEVfREFUQVNJWkVdOworICAgIF9QeVRaSU5GT19IRUFECisgICAgdW5zaWduZWQgY2hhciBkYXRhW19QeURhdGVUaW1lX0RBVEVfREFUQVNJWkVdOwogfSBQeURhdGVUaW1lX0RhdGU7CiAKLSNkZWZpbmUgX1B5RGF0ZVRpbWVfREFURVRJTUVIRUFECVwKLQlfUHlUWklORk9fSEVBRAkJCVwKLQl1bnNpZ25lZCBjaGFyIGRhdGFbX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkVdOworI2RlZmluZSBfUHlEYXRlVGltZV9EQVRFVElNRUhFQUQgICAgICAgIFwKKyAgICBfUHlUWklORk9fSEVBRCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgY2hhciBkYXRhW19QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFXTsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLQlfUHlEYXRlVGltZV9EQVRFVElNRUhFQUQKLX0gX1B5RGF0ZVRpbWVfQmFzZURhdGVUaW1lOwkvKiBoYXN0emluZm8gZmFsc2UgKi8KKyAgICBfUHlEYXRlVGltZV9EQVRFVElNRUhFQUQKK30gX1B5RGF0ZVRpbWVfQmFzZURhdGVUaW1lOyAgICAgLyogaGFzdHppbmZvIGZhbHNlICovCiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0JX1B5RGF0ZVRpbWVfREFURVRJTUVIRUFECi0JUHlPYmplY3QgKnR6aW5mbzsKLX0gUHlEYXRlVGltZV9EYXRlVGltZTsJCS8qIGhhc3R6aW5mbyB0cnVlICovCisgICAgX1B5RGF0ZVRpbWVfREFURVRJTUVIRUFECisgICAgUHlPYmplY3QgKnR6aW5mbzsKK30gUHlEYXRlVGltZV9EYXRlVGltZTsgICAgICAgICAgLyogaGFzdHppbmZvIHRydWUgKi8KIAogCiAvKiBBcHBseSBmb3IgZGF0ZSBhbmQgZGF0ZXRpbWUgaW5zdGFuY2VzLiAqLwogI2RlZmluZSBQeURhdGVUaW1lX0dFVF9ZRUFSKG8pICAgICAoKCgoUHlEYXRlVGltZV9EYXRlKilvKS0+ZGF0YVswXSA8PCA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFB5RGF0ZVRpbWVfRGF0ZSopbyktPmRhdGFbMV0pCisgICAgICAgICAgICAgICAgICAgICAoKFB5RGF0ZVRpbWVfRGF0ZSopbyktPmRhdGFbMV0pCiAjZGVmaW5lIFB5RGF0ZVRpbWVfR0VUX01PTlRIKG8pICAgICgoKFB5RGF0ZVRpbWVfRGF0ZSopbyktPmRhdGFbMl0pCiAjZGVmaW5lIFB5RGF0ZVRpbWVfR0VUX0RBWShvKSAgICAgICgoKFB5RGF0ZVRpbWVfRGF0ZSopbyktPmRhdGFbM10pCiAKICNkZWZpbmUgUHlEYXRlVGltZV9EQVRFX0dFVF9IT1VSKG8pICAgICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs0XSkKICNkZWZpbmUgUHlEYXRlVGltZV9EQVRFX0dFVF9NSU5VVEUobykgICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs1XSkKICNkZWZpbmUgUHlEYXRlVGltZV9EQVRFX0dFVF9TRUNPTkQobykgICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs2XSkKLSNkZWZpbmUgUHlEYXRlVGltZV9EQVRFX0dFVF9NSUNST1NFQ09ORChvKSAJCVwKLQkoKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbN10gPDwgMTYpIHwJXAotICAgICAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbOF0gPDwgOCkgIHwJXAotICAgICAgICAgICgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbOV0pCisjZGVmaW5lIFB5RGF0ZVRpbWVfREFURV9HRVRfTUlDUk9TRUNPTkQobykgICAgICAgICAgICAgIFwKKyAgICAoKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbN10gPDwgMTYpIHwgICAgICAgXAorICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs4XSA8PCA4KSAgfCAgICAgICBcCisgICAgICAoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzldKQogCiAvKiBBcHBseSBmb3IgdGltZSBpbnN0YW5jZXMuICovCiAjZGVmaW5lIFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUihvKSAgICAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVswXSkKICNkZWZpbmUgUHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEUobykgICAgICAoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzFdKQogI2RlZmluZSBQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORChvKSAgICAgICgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbMl0pCi0jZGVmaW5lIFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlDUk9TRUNPTkQobykgCQlcCi0JKCgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbM10gPDwgMTYpIHwJXAotICAgICAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVs0XSA8PCA4KSAgfAlcCi0gICAgICAgICAgKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzVdKQorI2RlZmluZSBQeURhdGVUaW1lX1RJTUVfR0VUX01JQ1JPU0VDT05EKG8pICAgICAgICAgICAgICBcCisgICAgKCgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbM10gPDwgMTYpIHwgICAgICAgICAgIFwKKyAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVs0XSA8PCA4KSAgfCAgICAgICAgICAgXAorICAgICAgKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzVdKQogCiAKIC8qIERlZmluZSBzdHJ1Y3R1cmUgZm9yIEMgQVBJLiAqLwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgLyogY29uc3RydWN0b3JzICovCiAgICAgUHlPYmplY3QgKigqRGF0ZV9Gcm9tRGF0ZSkoaW50LCBpbnQsIGludCwgUHlUeXBlT2JqZWN0Kik7CiAgICAgUHlPYmplY3QgKigqRGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lKShpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsCi0gICAgICAgICAgICBQeU9iamVjdCosIFB5VHlwZU9iamVjdCopOworICAgICAgICBQeU9iamVjdCosIFB5VHlwZU9iamVjdCopOwogICAgIFB5T2JqZWN0ICooKlRpbWVfRnJvbVRpbWUpKGludCwgaW50LCBpbnQsIGludCwgUHlPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKICAgICBQeU9iamVjdCAqKCpEZWx0YV9Gcm9tRGVsdGEpKGludCwgaW50LCBpbnQsIGludCwgUHlUeXBlT2JqZWN0Kik7CiAKQEAgLTE4NiwxNCArMTg2LDE0IEBACiBzdGF0aWMgUHlEYXRlVGltZV9DQVBJICpQeURhdGVUaW1lQVBJOwogCiAjZGVmaW5lIFB5RGF0ZVRpbWVfSU1QT1JUIFwKLSAgICAgICAgUHlEYXRlVGltZUFQSSA9IChQeURhdGVUaW1lX0NBUEkqKSBQeUNPYmplY3RfSW1wb3J0KCJkYXRldGltZSIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRldGltZV9DQVBJIikKKyAgICBQeURhdGVUaW1lQVBJID0gKFB5RGF0ZVRpbWVfQ0FQSSopIFB5Q09iamVjdF9JbXBvcnQoImRhdGV0aW1lIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZXRpbWVfQ0FQSSIpCiAKIC8qIFRoaXMgbWFjcm8gd291bGQgYmUgdXNlZCBpZiBQeUNPYmplY3RfSW1wb3J0RXgoKSB3YXMgY3JlYXRlZC4KICNkZWZpbmUgUHlEYXRlVGltZV9JTVBPUlQgXAotICAgICAgICBQeURhdGVUaW1lQVBJID0gKFB5RGF0ZVRpbWVfQ0FQSSopIFB5Q09iamVjdF9JbXBvcnRFeCgiZGF0ZXRpbWUiLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZXRpbWVfQ0FQSSIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVUSU1FX0FQSV9NQUdJQykKKyAgICBQeURhdGVUaW1lQVBJID0gKFB5RGF0ZVRpbWVfQ0FQSSopIFB5Q09iamVjdF9JbXBvcnRFeCgiZGF0ZXRpbWUiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRldGltZV9DQVBJIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFVElNRV9BUElfTUFHSUMpCiAqLwogCiAvKiBNYWNyb3MgZm9yIHR5cGUgY2hlY2tpbmcgd2hlbiBub3QgYnVpbGRpbmcgdGhlIFB5dGhvbiBjb3JlLiAqLwpAQCAtMjE0LDMwICsyMTQsMzAgQEAKIAogLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgY29uc3RydWN0b3JzIGluIGEgc2ltcGxpZmllZCBmYXNoaW9uLiAqLwogI2RlZmluZSBQeURhdGVfRnJvbURhdGUoeWVhciwgbW9udGgsIGRheSkgXAotCVB5RGF0ZVRpbWVBUEktPkRhdGVfRnJvbURhdGUoeWVhciwgbW9udGgsIGRheSwgUHlEYXRlVGltZUFQSS0+RGF0ZVR5cGUpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZV9Gcm9tRGF0ZSh5ZWFyLCBtb250aCwgZGF5LCBQeURhdGVUaW1lQVBJLT5EYXRlVHlwZSkKIAogI2RlZmluZSBQeURhdGVUaW1lX0Zyb21EYXRlQW5kVGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW4sIHNlYywgdXNlYykgXAotCVB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lX0Zyb21EYXRlQW5kVGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBcCi0JCW1pbiwgc2VjLCB1c2VjLCBQeV9Ob25lLCBQeURhdGVUaW1lQVBJLT5EYXRlVGltZVR5cGUpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIFwKKyAgICAgICAgbWluLCBzZWMsIHVzZWMsIFB5X05vbmUsIFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lVHlwZSkKIAogI2RlZmluZSBQeVRpbWVfRnJvbVRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIFwKLQlQeURhdGVUaW1lQVBJLT5UaW1lX0Zyb21UaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCBcCi0JCVB5X05vbmUsIFB5RGF0ZVRpbWVBUEktPlRpbWVUeXBlKQorICAgIFB5RGF0ZVRpbWVBUEktPlRpbWVfRnJvbVRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIFwKKyAgICAgICAgUHlfTm9uZSwgUHlEYXRlVGltZUFQSS0+VGltZVR5cGUpCiAKICNkZWZpbmUgUHlEZWx0YV9Gcm9tRFNVKGRheXMsIHNlY29uZHMsIHVzZWNvbmRzKSBcCi0JUHlEYXRlVGltZUFQSS0+RGVsdGFfRnJvbURlbHRhKGRheXMsIHNlY29uZHMsIHVzZWNvbmRzLCAxLCBcCi0JCVB5RGF0ZVRpbWVBUEktPkRlbHRhVHlwZSkKKyAgICBQeURhdGVUaW1lQVBJLT5EZWx0YV9Gcm9tRGVsdGEoZGF5cywgc2Vjb25kcywgdXNlY29uZHMsIDEsIFwKKyAgICAgICAgUHlEYXRlVGltZUFQSS0+RGVsdGFUeXBlKQogCiAvKiBNYWNyb3Mgc3VwcG9ydGluZyB0aGUgREIgQVBJLiAqLwogI2RlZmluZSBQeURhdGVUaW1lX0Zyb21UaW1lc3RhbXAoYXJncykgXAotCVB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lX0Zyb21UaW1lc3RhbXAoIFwKLQkJKFB5T2JqZWN0KikgKFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lVHlwZSksIGFyZ3MsIE5VTEwpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVfRnJvbVRpbWVzdGFtcCggXAorICAgICAgICAoUHlPYmplY3QqKSAoUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVUeXBlKSwgYXJncywgTlVMTCkKIAogI2RlZmluZSBQeURhdGVfRnJvbVRpbWVzdGFtcChhcmdzKSBcCi0JUHlEYXRlVGltZUFQSS0+RGF0ZV9Gcm9tVGltZXN0YW1wKCBcCi0JCShQeU9iamVjdCopIChQeURhdGVUaW1lQVBJLT5EYXRlVHlwZSksIGFyZ3MpCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZV9Gcm9tVGltZXN0YW1wKCBcCisgICAgICAgIChQeU9iamVjdCopIChQeURhdGVUaW1lQVBJLT5EYXRlVHlwZSksIGFyZ3MpCiAKLSNlbmRpZgkvKiBQeV9CVUlMRF9DT1JFICovCisjZW5kaWYgIC8qIFB5X0JVSUxEX0NPUkUgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL2Rlc2Nyb2JqZWN0LmggYi9JbmNsdWRlL2Rlc2Nyb2JqZWN0LmgKaW5kZXggNzE4ZjlkNS4uYjU0MjczMiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9kZXNjcm9iamVjdC5oCisrKyBiL0luY2x1ZGUvZGVzY3JvYmplY3QuaApAQCAtOSwyNyArOSwyNyBAQAogdHlwZWRlZiBpbnQgKCpzZXR0ZXIpKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIHZvaWQgKik7CiAKIHR5cGVkZWYgc3RydWN0IFB5R2V0U2V0RGVmIHsKLQljaGFyICpuYW1lOwotCWdldHRlciBnZXQ7Ci0Jc2V0dGVyIHNldDsKLQljaGFyICpkb2M7Ci0Jdm9pZCAqY2xvc3VyZTsKKyAgICBjaGFyICpuYW1lOworICAgIGdldHRlciBnZXQ7CisgICAgc2V0dGVyIHNldDsKKyAgICBjaGFyICpkb2M7CisgICAgdm9pZCAqY2xvc3VyZTsKIH0gUHlHZXRTZXREZWY7CiAKIHR5cGVkZWYgUHlPYmplY3QgKigqd3JhcHBlcmZ1bmMpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywKLQkJCQkgdm9pZCAqd3JhcHBlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp3cmFwcGVkKTsKIAogdHlwZWRlZiBQeU9iamVjdCAqKCp3cmFwcGVyZnVuY19rd2RzKShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsCi0JCQkJICAgICAgdm9pZCAqd3JhcHBlZCwgUHlPYmplY3QgKmt3ZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp3cmFwcGVkLCBQeU9iamVjdCAqa3dkcyk7CiAKIHN0cnVjdCB3cmFwcGVyYmFzZSB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgb2Zmc2V0OwotCXZvaWQgKmZ1bmN0aW9uOwotCXdyYXBwZXJmdW5jIHdyYXBwZXI7Ci0JY2hhciAqZG9jOwotCWludCBmbGFnczsKLQlQeU9iamVjdCAqbmFtZV9zdHJvYmo7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgb2Zmc2V0OworICAgIHZvaWQgKmZ1bmN0aW9uOworICAgIHdyYXBwZXJmdW5jIHdyYXBwZXI7CisgICAgY2hhciAqZG9jOworICAgIGludCBmbGFnczsKKyAgICBQeU9iamVjdCAqbmFtZV9zdHJvYmo7CiB9OwogCiAvKiBGbGFncyBmb3IgYWJvdmUgc3RydWN0ICovCkBAIC0zOCwzMyArMzgsMzMgQEAKIC8qIFZhcmlvdXMga2luZHMgb2YgZGVzY3JpcHRvciBvYmplY3RzICovCiAKICNkZWZpbmUgUHlEZXNjcl9DT01NT04gXAotCVB5T2JqZWN0X0hFQUQgXAotCVB5VHlwZU9iamVjdCAqZF90eXBlOyBcCi0JUHlPYmplY3QgKmRfbmFtZQorICAgIFB5T2JqZWN0X0hFQUQgXAorICAgIFB5VHlwZU9iamVjdCAqZF90eXBlOyBcCisgICAgUHlPYmplY3QgKmRfbmFtZQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEZXNjcl9DT01NT047CisgICAgUHlEZXNjcl9DT01NT047CiB9IFB5RGVzY3JPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeURlc2NyX0NPTU1PTjsKLQlQeU1ldGhvZERlZiAqZF9tZXRob2Q7CisgICAgUHlEZXNjcl9DT01NT047CisgICAgUHlNZXRob2REZWYgKmRfbWV0aG9kOwogfSBQeU1ldGhvZERlc2NyT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEZXNjcl9DT01NT047Ci0Jc3RydWN0IFB5TWVtYmVyRGVmICpkX21lbWJlcjsKKyAgICBQeURlc2NyX0NPTU1PTjsKKyAgICBzdHJ1Y3QgUHlNZW1iZXJEZWYgKmRfbWVtYmVyOwogfSBQeU1lbWJlckRlc2NyT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEZXNjcl9DT01NT047Ci0JUHlHZXRTZXREZWYgKmRfZ2V0c2V0OworICAgIFB5RGVzY3JfQ09NTU9OOworICAgIFB5R2V0U2V0RGVmICpkX2dldHNldDsKIH0gUHlHZXRTZXREZXNjck9iamVjdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5RGVzY3JfQ09NTU9OOwotCXN0cnVjdCB3cmFwcGVyYmFzZSAqZF9iYXNlOwotCXZvaWQgKmRfd3JhcHBlZDsgLyogVGhpcyBjYW4gYmUgYW55IGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICBQeURlc2NyX0NPTU1PTjsKKyAgICBzdHJ1Y3Qgd3JhcHBlcmJhc2UgKmRfYmFzZTsKKyAgICB2b2lkICpkX3dyYXBwZWQ7IC8qIFRoaXMgY2FuIGJlIGFueSBmdW5jdGlvbiBwb2ludGVyICovCiB9IFB5V3JhcHBlckRlc2NyT2JqZWN0OwogCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlXcmFwcGVyRGVzY3JfVHlwZTsKQEAgLTc1LDExICs3NSwxMSBAQAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld01ldGhvZChQeVR5cGVPYmplY3QgKiwgUHlNZXRob2REZWYgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QoUHlUeXBlT2JqZWN0ICosIFB5TWV0aG9kRGVmICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld01lbWJlcihQeVR5cGVPYmplY3QgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBQeU1lbWJlckRlZiAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFB5TWVtYmVyRGVmICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld0dldFNldChQeVR5cGVPYmplY3QgKiwKLQkJCQkJICAgICAgIHN0cnVjdCBQeUdldFNldERlZiAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFB5R2V0U2V0RGVmICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld1dyYXBwZXIoUHlUeXBlT2JqZWN0ICosCi0JCQkJCQlzdHJ1Y3Qgd3JhcHBlcmJhc2UgKiwgdm9pZCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3cmFwcGVyYmFzZSAqLCB2b2lkICopOwogI2RlZmluZSBQeURlc2NyX0lzRGF0YShkKSAoUHlfVFlQRShkKS0+dHBfZGVzY3Jfc2V0ICE9IE5VTEwpCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0UHJveHlfTmV3KFB5T2JqZWN0ICopOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9kaWN0b2JqZWN0LmggYi9JbmNsdWRlL2RpY3RvYmplY3QuaAppbmRleCBiODNjZDBlLi5iMDQ2ZmM3IDEwMDY0NAotLS0gYS9JbmNsdWRlL2RpY3RvYmplY3QuaAorKysgYi9JbmNsdWRlL2RpY3RvYmplY3QuaApAQCAtNDgsMTMgKzQ4LDEzIEBACiAjZGVmaW5lIFB5RGljdF9NSU5TSVpFIDgKIAogdHlwZWRlZiBzdHJ1Y3QgewotCS8qIENhY2hlZCBoYXNoIGNvZGUgb2YgbWVfa2V5LiAgTm90ZSB0aGF0IGhhc2ggY29kZXMgYXJlIEMgbG9uZ3MuCi0JICogV2UgaGF2ZSB0byB1c2UgUHlfc3NpemVfdCBpbnN0ZWFkIGJlY2F1c2UgZGljdF9wb3BpdGVtKCkgYWJ1c2VzCi0JICogbWVfaGFzaCB0byBob2xkIGEgc2VhcmNoIGZpbmdlci4KLQkgKi8KLQlQeV9zc2l6ZV90IG1lX2hhc2g7Ci0JUHlPYmplY3QgKm1lX2tleTsKLQlQeU9iamVjdCAqbWVfdmFsdWU7CisgICAgLyogQ2FjaGVkIGhhc2ggY29kZSBvZiBtZV9rZXkuICBOb3RlIHRoYXQgaGFzaCBjb2RlcyBhcmUgQyBsb25ncy4KKyAgICAgKiBXZSBoYXZlIHRvIHVzZSBQeV9zc2l6ZV90IGluc3RlYWQgYmVjYXVzZSBkaWN0X3BvcGl0ZW0oKSBhYnVzZXMKKyAgICAgKiBtZV9oYXNoIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyLgorICAgICAqLworICAgIFB5X3NzaXplX3QgbWVfaGFzaDsKKyAgICBQeU9iamVjdCAqbWVfa2V5OworICAgIFB5T2JqZWN0ICptZV92YWx1ZTsKIH0gUHlEaWN0RW50cnk7CiAKIC8qCkBAIC02OCwyNCArNjgsMjQgQEAKICovCiB0eXBlZGVmIHN0cnVjdCBfZGljdG9iamVjdCBQeURpY3RPYmplY3Q7CiBzdHJ1Y3QgX2RpY3RvYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90IG1hX2ZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KLQlQeV9zc2l6ZV90IG1hX3VzZWQ7ICAvKiAjIEFjdGl2ZSAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IG1hX2ZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KKyAgICBQeV9zc2l6ZV90IG1hX3VzZWQ7ICAvKiAjIEFjdGl2ZSAqLwogCi0JLyogVGhlIHRhYmxlIGNvbnRhaW5zIG1hX21hc2sgKyAxIHNsb3RzLCBhbmQgdGhhdCdzIGEgcG93ZXIgb2YgMi4KLQkgKiBXZSBzdG9yZSB0aGUgbWFzayBpbnN0ZWFkIG9mIHRoZSBzaXplIGJlY2F1c2UgdGhlIG1hc2sgaXMgbW9yZQotCSAqIGZyZXF1ZW50bHkgbmVlZGVkLgotCSAqLwotCVB5X3NzaXplX3QgbWFfbWFzazsKKyAgICAvKiBUaGUgdGFibGUgY29udGFpbnMgbWFfbWFzayArIDEgc2xvdHMsIGFuZCB0aGF0J3MgYSBwb3dlciBvZiAyLgorICAgICAqIFdlIHN0b3JlIHRoZSBtYXNrIGluc3RlYWQgb2YgdGhlIHNpemUgYmVjYXVzZSB0aGUgbWFzayBpcyBtb3JlCisgICAgICogZnJlcXVlbnRseSBuZWVkZWQuCisgICAgICovCisgICAgUHlfc3NpemVfdCBtYV9tYXNrOwogCi0JLyogbWFfdGFibGUgcG9pbnRzIHRvIG1hX3NtYWxsdGFibGUgZm9yIHNtYWxsIHRhYmxlcywgZWxzZSB0bwotCSAqIGFkZGl0aW9uYWwgbWFsbG9jJ2VkIG1lbW9yeS4gIG1hX3RhYmxlIGlzIG5ldmVyIE5VTEwhICBUaGlzIHJ1bGUKLQkgKiBzYXZlcyByZXBlYXRlZCBydW50aW1lIG51bGwtdGVzdHMgaW4gdGhlIHdvcmtob3JzZSBnZXRpdGVtIGFuZAotCSAqIHNldGl0ZW0gY2FsbHMuCi0JICovCi0JUHlEaWN0RW50cnkgKm1hX3RhYmxlOwotCVB5RGljdEVudHJ5ICooKm1hX2xvb2t1cCkoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoKTsKLQlQeURpY3RFbnRyeSBtYV9zbWFsbHRhYmxlW1B5RGljdF9NSU5TSVpFXTsKKyAgICAvKiBtYV90YWJsZSBwb2ludHMgdG8gbWFfc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCisgICAgICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgbWFfdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQorICAgICAqIHNhdmVzIHJlcGVhdGVkIHJ1bnRpbWUgbnVsbC10ZXN0cyBpbiB0aGUgd29ya2hvcnNlIGdldGl0ZW0gYW5kCisgICAgICogc2V0aXRlbSBjYWxscy4KKyAgICAgKi8KKyAgICBQeURpY3RFbnRyeSAqbWFfdGFibGU7CisgICAgUHlEaWN0RW50cnkgKigqbWFfbG9va3VwKShQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOworICAgIFB5RGljdEVudHJ5IG1hX3NtYWxsdGFibGVbUHlEaWN0X01JTlNJWkVdOwogfTsKIAogUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdF9UeXBlOwpAQCAtMTAwLDkgKzEwMCw5IEBACiBQeUFQSV9GVU5DKGludCkgUHlEaWN0X0RlbEl0ZW0oUHlPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5KTsKIFB5QVBJX0ZVTkModm9pZCkgUHlEaWN0X0NsZWFyKFB5T2JqZWN0ICptcCk7CiBQeUFQSV9GVU5DKGludCkgUHlEaWN0X05leHQoCi0JUHlPYmplY3QgKm1wLCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqa2V5LCBQeU9iamVjdCAqKnZhbHVlKTsKKyAgICBQeU9iamVjdCAqbXAsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXksIFB5T2JqZWN0ICoqdmFsdWUpOwogUHlBUElfRlVOQyhpbnQpIF9QeURpY3RfTmV4dCgKLQlQeU9iamVjdCAqbXAsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXksIFB5T2JqZWN0ICoqdmFsdWUsIGxvbmcgKmhhc2gpOworICAgIFB5T2JqZWN0ICptcCwgUHlfc3NpemVfdCAqcG9zLCBQeU9iamVjdCAqKmtleSwgUHlPYmplY3QgKip2YWx1ZSwgbG9uZyAqaGFzaCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9LZXlzKFB5T2JqZWN0ICptcCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9WYWx1ZXMoUHlPYmplY3QgKm1wKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0X0l0ZW1zKFB5T2JqZWN0ICptcCk7CkBAIC0xMjEsOCArMTIxLDggQEAKICAgIGRpY3QudXBkYXRlKG90aGVyKSBpcyBlcXVpdmFsZW50IHRvIFB5RGljdF9NZXJnZShkaWN0LCBvdGhlciwgMSkuCiAqLwogUHlBUElfRlVOQyhpbnQpIFB5RGljdF9NZXJnZShQeU9iamVjdCAqbXAsCi0JCQkJICAgUHlPYmplY3QgKm90aGVyLAotCQkJCSAgIGludCBvdmVycmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJyaWRlKTsKIAogLyogUHlEaWN0X01lcmdlRnJvbVNlcTIgdXBkYXRlcy9tZXJnZXMgZnJvbSBhbiBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nCiAgICBpdGVyYWJsZSBvYmplY3RzIG9mIGxlbmd0aCAyLiAgSWYgb3ZlcnJpZGUgaXMgdHJ1ZSwgdGhlIGxhc3Qgb2NjdXJyZW5jZQpAQCAtMTMwLDggKzEzMCw4IEBACiAgICBpcyBlcXVpdmFsZW50IHRvIGRpY3Q9e307IFB5RGljdF9NZXJnZUZyb21TZXEoZGljdCwgc2VxMiwgMSkuCiAqLwogUHlBUElfRlVOQyhpbnQpIFB5RGljdF9NZXJnZUZyb21TZXEyKFB5T2JqZWN0ICpkLAotCQkJCQkgICBQeU9iamVjdCAqc2VxMiwKLQkJCQkJICAgaW50IG92ZXJyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc2VxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcnJpZGUpOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpkcCwgY29uc3QgY2hhciAqa2V5KTsKIFB5QVBJX0ZVTkMoaW50KSBQeURpY3RfU2V0SXRlbVN0cmluZyhQeU9iamVjdCAqZHAsIGNvbnN0IGNoYXIgKmtleSwgUHlPYmplY3QgKml0ZW0pOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9maWxlb2JqZWN0LmggYi9JbmNsdWRlL2ZpbGVvYmplY3QuaAppbmRleCA5NmMxZTU3Li5jMjMzNGIyIDEwMDY0NAotLS0gYS9JbmNsdWRlL2ZpbGVvYmplY3QuaAorKysgYi9JbmNsdWRlL2ZpbGVvYmplY3QuaApAQCAtOCwyOCArOCwyOCBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRklMRSAqZl9mcDsKLQlQeU9iamVjdCAqZl9uYW1lOwotCVB5T2JqZWN0ICpmX21vZGU7Ci0JaW50ICgqZl9jbG9zZSkoRklMRSAqKTsKLQlpbnQgZl9zb2Z0c3BhY2U7CS8qIEZsYWcgdXNlZCBieSAncHJpbnQnIGNvbW1hbmQgKi8KLQlpbnQgZl9iaW5hcnk7CQkvKiBGbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlIGlzIAotCQkJCSAgIG9wZW4gaW4gYmluYXJ5ICgxKSBvciB0ZXh0ICgwKSBtb2RlICovCi0JY2hhciogZl9idWY7CQkvKiBBbGxvY2F0ZWQgcmVhZGFoZWFkIGJ1ZmZlciAqLwotCWNoYXIqIGZfYnVmZW5kOwkJLyogUG9pbnRzIGFmdGVyIGxhc3Qgb2NjdXBpZWQgcG9zaXRpb24gKi8KLQljaGFyKiBmX2J1ZnB0cjsJCS8qIEN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uICovCi0JY2hhciAqZl9zZXRidWY7CQkvKiBCdWZmZXIgZm9yIHNldGJ1ZigzKSBhbmQgc2V0dmJ1ZigzKSAqLwotCWludCBmX3VuaXZfbmV3bGluZTsJLyogSGFuZGxlIGFueSBuZXdsaW5lIGNvbnZlbnRpb24gKi8KLQlpbnQgZl9uZXdsaW5ldHlwZXM7CS8qIFR5cGVzIG9mIG5ld2xpbmVzIHNlZW4gKi8KLQlpbnQgZl9za2lwbmV4dGxmOwkvKiBTa2lwIG5leHQgXG4gKi8KLQlQeU9iamVjdCAqZl9lbmNvZGluZzsKLQlQeU9iamVjdCAqZl9lcnJvcnM7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwotCWludCB1bmxvY2tlZF9jb3VudDsJLyogTnVtLiBjdXJyZW50bHkgcnVubmluZyBzZWN0aW9ucyBvZiBjb2RlCi0JCQkJICAgdXNpbmcgZl9mcCB3aXRoIHRoZSBHSUwgcmVsZWFzZWQuICovCi0JaW50IHJlYWRhYmxlOwotCWludCB3cml0YWJsZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRklMRSAqZl9mcDsKKyAgICBQeU9iamVjdCAqZl9uYW1lOworICAgIFB5T2JqZWN0ICpmX21vZGU7CisgICAgaW50ICgqZl9jbG9zZSkoRklMRSAqKTsKKyAgICBpbnQgZl9zb2Z0c3BhY2U7ICAgICAgICAgICAgLyogRmxhZyB1c2VkIGJ5ICdwcmludCcgY29tbWFuZCAqLworICAgIGludCBmX2JpbmFyeTsgICAgICAgICAgICAgICAvKiBGbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbiBpbiBiaW5hcnkgKDEpIG9yIHRleHQgKDApIG1vZGUgKi8KKyAgICBjaGFyKiBmX2J1ZjsgICAgICAgICAgICAgICAgLyogQWxsb2NhdGVkIHJlYWRhaGVhZCBidWZmZXIgKi8KKyAgICBjaGFyKiBmX2J1ZmVuZDsgICAgICAgICAgICAgLyogUG9pbnRzIGFmdGVyIGxhc3Qgb2NjdXBpZWQgcG9zaXRpb24gKi8KKyAgICBjaGFyKiBmX2J1ZnB0cjsgICAgICAgICAgICAgLyogQ3VycmVudCBidWZmZXIgcG9zaXRpb24gKi8KKyAgICBjaGFyICpmX3NldGJ1ZjsgICAgICAgICAgICAgLyogQnVmZmVyIGZvciBzZXRidWYoMykgYW5kIHNldHZidWYoMykgKi8KKyAgICBpbnQgZl91bml2X25ld2xpbmU7ICAgICAgICAgLyogSGFuZGxlIGFueSBuZXdsaW5lIGNvbnZlbnRpb24gKi8KKyAgICBpbnQgZl9uZXdsaW5ldHlwZXM7ICAgICAgICAgLyogVHlwZXMgb2YgbmV3bGluZXMgc2VlbiAqLworICAgIGludCBmX3NraXBuZXh0bGY7ICAgICAgICAgICAvKiBTa2lwIG5leHQgXG4gKi8KKyAgICBQeU9iamVjdCAqZl9lbmNvZGluZzsKKyAgICBQeU9iamVjdCAqZl9lcnJvcnM7CisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworICAgIGludCB1bmxvY2tlZF9jb3VudDsgICAgICAgICAvKiBOdW0uIGN1cnJlbnRseSBydW5uaW5nIHNlY3Rpb25zIG9mIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBmX2ZwIHdpdGggdGhlIEdJTCByZWxlYXNlZC4gKi8KKyAgICBpbnQgcmVhZGFibGU7CisgICAgaW50IHdyaXRhYmxlOwogfSBQeUZpbGVPYmplY3Q7CiAKIFB5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUZpbGVfVHlwZTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb2JqZWN0LmggYi9JbmNsdWRlL29iamVjdC5oCmluZGV4IGIwMjY4OWMuLjFiYjRkNzggMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9vYmplY3QuaApAQCAtNjMsOSArNjMsOSBAQAogCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwogLyogRGVmaW5lIHBvaW50ZXJzIHRvIHN1cHBvcnQgYSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsIGxpdmUgaGVhcCBvYmplY3RzLiAqLwotI2RlZmluZSBfUHlPYmplY3RfSEVBRF9FWFRSQQkJXAotCXN0cnVjdCBfb2JqZWN0ICpfb2JfbmV4dDsJXAotCXN0cnVjdCBfb2JqZWN0ICpfb2JfcHJldjsKKyNkZWZpbmUgX1B5T2JqZWN0X0hFQURfRVhUUkEgICAgICAgICAgICBcCisgICAgc3RydWN0IF9vYmplY3QgKl9vYl9uZXh0OyAgICAgICAgICAgXAorICAgIHN0cnVjdCBfb2JqZWN0ICpfb2JfcHJldjsKIAogI2RlZmluZSBfUHlPYmplY3RfRVhUUkFfSU5JVCAwLCAwLAogCkBAIC03NSwxNyArNzUsMTcgQEAKICNlbmRpZgogCiAvKiBQeU9iamVjdF9IRUFEIGRlZmluZXMgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBldmVyeSBQeU9iamVjdC4gKi8KLSNkZWZpbmUgUHlPYmplY3RfSEVBRAkJCVwKLQlfUHlPYmplY3RfSEVBRF9FWFRSQQkJXAotCVB5X3NzaXplX3Qgb2JfcmVmY250OwkJXAotCXN0cnVjdCBfdHlwZW9iamVjdCAqb2JfdHlwZTsKKyNkZWZpbmUgUHlPYmplY3RfSEVBRCAgICAgICAgICAgICAgICAgICBcCisgICAgX1B5T2JqZWN0X0hFQURfRVhUUkEgICAgICAgICAgICAgICAgXAorICAgIFB5X3NzaXplX3Qgb2JfcmVmY250OyAgICAgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKm9iX3R5cGU7CiAKLSNkZWZpbmUgUHlPYmplY3RfSEVBRF9JTklUKHR5cGUpCVwKLQlfUHlPYmplY3RfRVhUUkFfSU5JVAkJXAotCTEsIHR5cGUsCisjZGVmaW5lIFB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSAgICAgICAgXAorICAgIF9QeU9iamVjdF9FWFRSQV9JTklUICAgICAgICAgICAgICAgIFwKKyAgICAxLCB0eXBlLAogCi0jZGVmaW5lIFB5VmFyT2JqZWN0X0hFQURfSU5JVCh0eXBlLCBzaXplKQlcCi0JUHlPYmplY3RfSEVBRF9JTklUKHR5cGUpIHNpemUsCisjZGVmaW5lIFB5VmFyT2JqZWN0X0hFQURfSU5JVCh0eXBlLCBzaXplKSAgICAgICBcCisgICAgUHlPYmplY3RfSEVBRF9JTklUKHR5cGUpIHNpemUsCiAKIC8qIFB5T2JqZWN0X1ZBUl9IRUFEIGRlZmluZXMgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBhbGwgdmFyaWFibGUtc2l6ZQogICogY29udGFpbmVyIG9iamVjdHMuICBUaGVzZSBlbmQgd2l0aCBhIGRlY2xhcmF0aW9uIG9mIGFuIGFycmF5IHdpdGggMQpAQCAtOTMsOSArOTMsOSBAQAogICogaGFzIHJvb20gZm9yIG9iX3NpemUgZWxlbWVudHMuICBOb3RlIHRoYXQgb2Jfc2l6ZSBpcyBhbiBlbGVtZW50IGNvdW50LAogICogbm90IG5lY2Vzc2FyaWx5IGEgYnl0ZSBjb3VudC4KICAqLwotI2RlZmluZSBQeU9iamVjdF9WQVJfSEVBRAkJXAotCVB5T2JqZWN0X0hFQUQJCQlcCi0JUHlfc3NpemVfdCBvYl9zaXplOyAvKiBOdW1iZXIgb2YgaXRlbXMgaW4gdmFyaWFibGUgcGFydCAqLworI2RlZmluZSBQeU9iamVjdF9WQVJfSEVBRCAgICAgICAgICAgICAgIFwKKyAgICBQeU9iamVjdF9IRUFEICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUHlfc3NpemVfdCBvYl9zaXplOyAvKiBOdW1iZXIgb2YgaXRlbXMgaW4gdmFyaWFibGUgcGFydCAqLwogI2RlZmluZSBQeV9JTlZBTElEX1NJWkUgKFB5X3NzaXplX3QpLTEKIAogLyogTm90aGluZyBpcyBhY3R1YWxseSBkZWNsYXJlZCB0byBiZSBhIFB5T2JqZWN0LCBidXQgZXZlcnkgcG9pbnRlciB0bwpAQCAtMTA0LDE2ICsxMDQsMTYgQEAKICAqIGluIGFkZGl0aW9uLCBiZSBjYXN0IHRvIFB5VmFyT2JqZWN0Ki4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgX29iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0X0hFQUQKIH0gUHlPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9WQVJfSEVBRAorICAgIFB5T2JqZWN0X1ZBUl9IRUFECiB9IFB5VmFyT2JqZWN0OwogCi0jZGVmaW5lIFB5X1JFRkNOVChvYikJCSgoKFB5T2JqZWN0Kikob2IpKS0+b2JfcmVmY250KQotI2RlZmluZSBQeV9UWVBFKG9iKQkJKCgoUHlPYmplY3QqKShvYikpLT5vYl90eXBlKQotI2RlZmluZSBQeV9TSVpFKG9iKQkJKCgoUHlWYXJPYmplY3QqKShvYikpLT5vYl9zaXplKQorI2RlZmluZSBQeV9SRUZDTlQob2IpICAgICAgICAgICAoKChQeU9iamVjdCopKG9iKSktPm9iX3JlZmNudCkKKyNkZWZpbmUgUHlfVFlQRShvYikgICAgICAgICAgICAgKCgoUHlPYmplY3QqKShvYikpLT5vYl90eXBlKQorI2RlZmluZSBQeV9TSVpFKG9iKSAgICAgICAgICAgICAoKChQeVZhck9iamVjdCopKG9iKSktPm9iX3NpemUpCiAKIC8qCiBUeXBlIG9iamVjdHMgY29udGFpbiBhIHN0cmluZyBjb250YWluaW5nIHRoZSB0eXBlIG5hbWUgKHRvIGhlbHAgc29tZXdoYXQKQEAgLTE2MiwyNCArMTYyLDI0IEBACiAvKiBQeTNrIGJ1ZmZlciBpbnRlcmZhY2UgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgYnVmZmVyaW5mbyB7Ci0Jdm9pZCAqYnVmOwotCVB5T2JqZWN0ICpvYmo7ICAgICAgICAvKiBib3Jyb3dlZCByZWZlcmVuY2UgKi8KLSAgICAgICAgUHlfc3NpemVfdCBsZW47Ci0gICAgICAgIFB5X3NzaXplX3QgaXRlbXNpemU7ICAvKiBUaGlzIGlzIFB5X3NzaXplX3Qgc28gaXQgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIHRvIGJ5IHN0cmlkZXMgaW4gc2ltcGxlIGNhc2UuKi8KLSAgICAgICAgaW50IHJlYWRvbmx5OwotICAgICAgICBpbnQgbmRpbTsKLSAgICAgICAgY2hhciAqZm9ybWF0OwotICAgICAgICBQeV9zc2l6ZV90ICpzaGFwZTsKLSAgICAgICAgUHlfc3NpemVfdCAqc3RyaWRlczsKLSAgICAgICAgUHlfc3NpemVfdCAqc3Vib2Zmc2V0czsKLSAgICAgICAgdm9pZCAqaW50ZXJuYWw7CisgICAgdm9pZCAqYnVmOworICAgIFB5T2JqZWN0ICpvYmo7ICAgICAgICAvKiBib3Jyb3dlZCByZWZlcmVuY2UgKi8KKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBQeV9zc2l6ZV90IGl0ZW1zaXplOyAgLyogVGhpcyBpcyBQeV9zc2l6ZV90IHNvIGl0IGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVkIHRvIGJ5IHN0cmlkZXMgaW4gc2ltcGxlIGNhc2UuKi8KKyAgICBpbnQgcmVhZG9ubHk7CisgICAgaW50IG5kaW07CisgICAgY2hhciAqZm9ybWF0OworICAgIFB5X3NzaXplX3QgKnNoYXBlOworICAgIFB5X3NzaXplX3QgKnN0cmlkZXM7CisgICAgUHlfc3NpemVfdCAqc3Vib2Zmc2V0czsKKyAgICB2b2lkICppbnRlcm5hbDsKIH0gUHlfYnVmZmVyOwogCiB0eXBlZGVmIGludCAoKmdldGJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqLCBpbnQpOwogdHlwZWRlZiB2b2lkICgqcmVsZWFzZWJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqKTsKIAotICAgICAgICAvKiBGbGFncyBmb3IgZ2V0dGluZyBidWZmZXJzICovCisgICAgLyogRmxhZ3MgZm9yIGdldHRpbmcgYnVmZmVycyAqLwogI2RlZmluZSBQeUJVRl9TSU1QTEUgMAogI2RlZmluZSBQeUJVRl9XUklUQUJMRSAweDAwMDEKIC8qICB3ZSB1c2VkIHRvIGluY2x1ZGUgYW4gRSwgYmFja3dhcmRzIGNvbXBhdGlibGUgYWxpYXMgICovCkBAIC0yMTUsODggKzIxNSw4OCBAQAogdHlwZWRlZiBpbnQgKCp0cmF2ZXJzZXByb2MpKFB5T2JqZWN0ICosIHZpc2l0cHJvYywgdm9pZCAqKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCS8qIEZvciBudW1iZXJzIHdpdGhvdXQgZmxhZyBiaXQgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHNldCwgYWxsCi0JICAgYXJndW1lbnRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9mIHRoZSBvYmplY3QncyB0eXBlIChtb2R1bG8KLQkgICBjb2VyY2lvbiBoYWNrcyAtLSBpLmUuIGlmIHRoZSB0eXBlJ3MgY29lcmNpb24gZnVuY3Rpb24KLQkgICByZXR1cm5zIG90aGVyIHR5cGVzLCB0aGVuIHRoZXNlIGFyZSBhbGxvd2VkIGFzIHdlbGwpLiAgTnVtYmVycyB0aGF0Ci0JICAgaGF2ZSB0aGUgUHlfVFBGTEFHU19DSEVDS1RZUEVTIGZsYWcgYml0IHNldCBzaG91bGQgY2hlY2sgKmJvdGgqCi0JICAgYXJndW1lbnRzIGZvciBwcm9wZXIgdHlwZSBhbmQgaW1wbGVtZW50IHRoZSBuZWNlc3NhcnkgY29udmVyc2lvbnMKLQkgICBpbiB0aGUgc2xvdCBmdW5jdGlvbnMgdGhlbXNlbHZlcy4gKi8KKyAgICAvKiBGb3IgbnVtYmVycyB3aXRob3V0IGZsYWcgYml0IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyBzZXQsIGFsbAorICAgICAgIGFyZ3VtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBvZiB0aGUgb2JqZWN0J3MgdHlwZSAobW9kdWxvCisgICAgICAgY29lcmNpb24gaGFja3MgLS0gaS5lLiBpZiB0aGUgdHlwZSdzIGNvZXJjaW9uIGZ1bmN0aW9uCisgICAgICAgcmV0dXJucyBvdGhlciB0eXBlcywgdGhlbiB0aGVzZSBhcmUgYWxsb3dlZCBhcyB3ZWxsKS4gIE51bWJlcnMgdGhhdAorICAgICAgIGhhdmUgdGhlIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyBmbGFnIGJpdCBzZXQgc2hvdWxkIGNoZWNrICpib3RoKgorICAgICAgIGFyZ3VtZW50cyBmb3IgcHJvcGVyIHR5cGUgYW5kIGltcGxlbWVudCB0aGUgbmVjZXNzYXJ5IGNvbnZlcnNpb25zCisgICAgICAgaW4gdGhlIHNsb3QgZnVuY3Rpb25zIHRoZW1zZWx2ZXMuICovCiAKLQliaW5hcnlmdW5jIG5iX2FkZDsKLQliaW5hcnlmdW5jIG5iX3N1YnRyYWN0OwotCWJpbmFyeWZ1bmMgbmJfbXVsdGlwbHk7Ci0JYmluYXJ5ZnVuYyBuYl9kaXZpZGU7Ci0JYmluYXJ5ZnVuYyBuYl9yZW1haW5kZXI7Ci0JYmluYXJ5ZnVuYyBuYl9kaXZtb2Q7Ci0JdGVybmFyeWZ1bmMgbmJfcG93ZXI7Ci0JdW5hcnlmdW5jIG5iX25lZ2F0aXZlOwotCXVuYXJ5ZnVuYyBuYl9wb3NpdGl2ZTsKLQl1bmFyeWZ1bmMgbmJfYWJzb2x1dGU7Ci0JaW5xdWlyeSBuYl9ub256ZXJvOwotCXVuYXJ5ZnVuYyBuYl9pbnZlcnQ7Ci0JYmluYXJ5ZnVuYyBuYl9sc2hpZnQ7Ci0JYmluYXJ5ZnVuYyBuYl9yc2hpZnQ7Ci0JYmluYXJ5ZnVuYyBuYl9hbmQ7Ci0JYmluYXJ5ZnVuYyBuYl94b3I7Ci0JYmluYXJ5ZnVuYyBuYl9vcjsKLQljb2VyY2lvbiBuYl9jb2VyY2U7Ci0JdW5hcnlmdW5jIG5iX2ludDsKLQl1bmFyeWZ1bmMgbmJfbG9uZzsKLQl1bmFyeWZ1bmMgbmJfZmxvYXQ7Ci0JdW5hcnlmdW5jIG5iX29jdDsKLQl1bmFyeWZ1bmMgbmJfaGV4OwotCS8qIEFkZGVkIGluIHJlbGVhc2UgMi4wICovCi0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2FkZDsKLQliaW5hcnlmdW5jIG5iX2lucGxhY2Vfc3VidHJhY3Q7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX211bHRpcGx5OwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9kaXZpZGU7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3JlbWFpbmRlcjsKLQl0ZXJuYXJ5ZnVuYyBuYl9pbnBsYWNlX3Bvd2VyOwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9sc2hpZnQ7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3JzaGlmdDsKLQliaW5hcnlmdW5jIG5iX2lucGxhY2VfYW5kOwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV94b3I7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX29yOworICAgIGJpbmFyeWZ1bmMgbmJfYWRkOworICAgIGJpbmFyeWZ1bmMgbmJfc3VidHJhY3Q7CisgICAgYmluYXJ5ZnVuYyBuYl9tdWx0aXBseTsKKyAgICBiaW5hcnlmdW5jIG5iX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX3JlbWFpbmRlcjsKKyAgICBiaW5hcnlmdW5jIG5iX2Rpdm1vZDsKKyAgICB0ZXJuYXJ5ZnVuYyBuYl9wb3dlcjsKKyAgICB1bmFyeWZ1bmMgbmJfbmVnYXRpdmU7CisgICAgdW5hcnlmdW5jIG5iX3Bvc2l0aXZlOworICAgIHVuYXJ5ZnVuYyBuYl9hYnNvbHV0ZTsKKyAgICBpbnF1aXJ5IG5iX25vbnplcm87CisgICAgdW5hcnlmdW5jIG5iX2ludmVydDsKKyAgICBiaW5hcnlmdW5jIG5iX2xzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX3JzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX2FuZDsKKyAgICBiaW5hcnlmdW5jIG5iX3hvcjsKKyAgICBiaW5hcnlmdW5jIG5iX29yOworICAgIGNvZXJjaW9uIG5iX2NvZXJjZTsKKyAgICB1bmFyeWZ1bmMgbmJfaW50OworICAgIHVuYXJ5ZnVuYyBuYl9sb25nOworICAgIHVuYXJ5ZnVuYyBuYl9mbG9hdDsKKyAgICB1bmFyeWZ1bmMgbmJfb2N0OworICAgIHVuYXJ5ZnVuYyBuYl9oZXg7CisgICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfYWRkOworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9zdWJ0cmFjdDsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfbXVsdGlwbHk7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfcmVtYWluZGVyOworICAgIHRlcm5hcnlmdW5jIG5iX2lucGxhY2VfcG93ZXI7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2xzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfcnNoaWZ0OworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9hbmQ7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3hvcjsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2Vfb3I7CiAKLQkvKiBBZGRlZCBpbiByZWxlYXNlIDIuMiAqLwotCS8qIFRoZSBmb2xsb3dpbmcgcmVxdWlyZSB0aGUgUHlfVFBGTEFHU19IQVZFX0NMQVNTIGZsYWcgKi8KLQliaW5hcnlmdW5jIG5iX2Zsb29yX2RpdmlkZTsKLQliaW5hcnlmdW5jIG5iX3RydWVfZGl2aWRlOwotCWJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGU7Ci0JYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3RydWVfZGl2aWRlOworICAgIC8qIEFkZGVkIGluIHJlbGVhc2UgMi4yICovCisgICAgLyogVGhlIGZvbGxvd2luZyByZXF1aXJlIHRoZSBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MgZmxhZyAqLworICAgIGJpbmFyeWZ1bmMgbmJfZmxvb3JfZGl2aWRlOworICAgIGJpbmFyeWZ1bmMgbmJfdHJ1ZV9kaXZpZGU7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGU7CiAKLQkvKiBBZGRlZCBpbiByZWxlYXNlIDIuNSAqLwotCXVuYXJ5ZnVuYyBuYl9pbmRleDsKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuNSAqLworICAgIHVuYXJ5ZnVuYyBuYl9pbmRleDsKIH0gUHlOdW1iZXJNZXRob2RzOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JbGVuZnVuYyBzcV9sZW5ndGg7Ci0JYmluYXJ5ZnVuYyBzcV9jb25jYXQ7Ci0Jc3NpemVhcmdmdW5jIHNxX3JlcGVhdDsKLQlzc2l6ZWFyZ2Z1bmMgc3FfaXRlbTsKLQlzc2l6ZXNzaXplYXJnZnVuYyBzcV9zbGljZTsKLQlzc2l6ZW9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07Ci0Jc3NpemVzc2l6ZW9iamFyZ3Byb2Mgc3FfYXNzX3NsaWNlOwotCW9iam9ianByb2Mgc3FfY29udGFpbnM7Ci0JLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KLQliaW5hcnlmdW5jIHNxX2lucGxhY2VfY29uY2F0OwotCXNzaXplYXJnZnVuYyBzcV9pbnBsYWNlX3JlcGVhdDsKKyAgICBsZW5mdW5jIHNxX2xlbmd0aDsKKyAgICBiaW5hcnlmdW5jIHNxX2NvbmNhdDsKKyAgICBzc2l6ZWFyZ2Z1bmMgc3FfcmVwZWF0OworICAgIHNzaXplYXJnZnVuYyBzcV9pdGVtOworICAgIHNzaXplc3NpemVhcmdmdW5jIHNxX3NsaWNlOworICAgIHNzaXplb2JqYXJncHJvYyBzcV9hc3NfaXRlbTsKKyAgICBzc2l6ZXNzaXplb2JqYXJncHJvYyBzcV9hc3Nfc2xpY2U7CisgICAgb2Jqb2JqcHJvYyBzcV9jb250YWluczsKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuMCAqLworICAgIGJpbmFyeWZ1bmMgc3FfaW5wbGFjZV9jb25jYXQ7CisgICAgc3NpemVhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OwogfSBQeVNlcXVlbmNlTWV0aG9kczsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWxlbmZ1bmMgbXBfbGVuZ3RoOwotCWJpbmFyeWZ1bmMgbXBfc3Vic2NyaXB0OwotCW9iam9iamFyZ3Byb2MgbXBfYXNzX3N1YnNjcmlwdDsKKyAgICBsZW5mdW5jIG1wX2xlbmd0aDsKKyAgICBiaW5hcnlmdW5jIG1wX3N1YnNjcmlwdDsKKyAgICBvYmpvYmphcmdwcm9jIG1wX2Fzc19zdWJzY3JpcHQ7CiB9IFB5TWFwcGluZ01ldGhvZHM7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlyZWFkYnVmZmVycHJvYyBiZl9nZXRyZWFkYnVmZmVyOwotCXdyaXRlYnVmZmVycHJvYyBiZl9nZXR3cml0ZWJ1ZmZlcjsKLQlzZWdjb3VudHByb2MgYmZfZ2V0c2VnY291bnQ7Ci0JY2hhcmJ1ZmZlcnByb2MgYmZfZ2V0Y2hhcmJ1ZmZlcjsKLSAgICAgICAgZ2V0YnVmZmVycHJvYyBiZl9nZXRidWZmZXI7Ci0JcmVsZWFzZWJ1ZmZlcnByb2MgYmZfcmVsZWFzZWJ1ZmZlcjsKKyAgICByZWFkYnVmZmVycHJvYyBiZl9nZXRyZWFkYnVmZmVyOworICAgIHdyaXRlYnVmZmVycHJvYyBiZl9nZXR3cml0ZWJ1ZmZlcjsKKyAgICBzZWdjb3VudHByb2MgYmZfZ2V0c2VnY291bnQ7CisgICAgY2hhcmJ1ZmZlcnByb2MgYmZfZ2V0Y2hhcmJ1ZmZlcjsKKyAgICBnZXRidWZmZXJwcm9jIGJmX2dldGJ1ZmZlcjsKKyAgICByZWxlYXNlYnVmZmVycHJvYyBiZl9yZWxlYXNlYnVmZmVyOwogfSBQeUJ1ZmZlclByb2NzOwogCiAKQEAgLTMyMCwxMTAgKzMyMCwxMTAgQEAKIHR5cGVkZWYgUHlPYmplY3QgKigqYWxsb2NmdW5jKShzdHJ1Y3QgX3R5cGVvYmplY3QgKiwgUHlfc3NpemVfdCk7CiAKIHR5cGVkZWYgc3RydWN0IF90eXBlb2JqZWN0IHsKLQlQeU9iamVjdF9WQVJfSEVBRAotCWNvbnN0IGNoYXIgKnRwX25hbWU7IC8qIEZvciBwcmludGluZywgaW4gZm9ybWF0ICI8bW9kdWxlPi48bmFtZT4iICovCi0JUHlfc3NpemVfdCB0cF9iYXNpY3NpemUsIHRwX2l0ZW1zaXplOyAvKiBGb3IgYWxsb2NhdGlvbiAqLworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgY29uc3QgY2hhciAqdHBfbmFtZTsgLyogRm9yIHByaW50aW5nLCBpbiBmb3JtYXQgIjxtb2R1bGU+LjxuYW1lPiIgKi8KKyAgICBQeV9zc2l6ZV90IHRwX2Jhc2ljc2l6ZSwgdHBfaXRlbXNpemU7IC8qIEZvciBhbGxvY2F0aW9uICovCiAKLQkvKiBNZXRob2RzIHRvIGltcGxlbWVudCBzdGFuZGFyZCBvcGVyYXRpb25zICovCisgICAgLyogTWV0aG9kcyB0byBpbXBsZW1lbnQgc3RhbmRhcmQgb3BlcmF0aW9ucyAqLwogCi0JZGVzdHJ1Y3RvciB0cF9kZWFsbG9jOwotCXByaW50ZnVuYyB0cF9wcmludDsKLQlnZXRhdHRyZnVuYyB0cF9nZXRhdHRyOwotCXNldGF0dHJmdW5jIHRwX3NldGF0dHI7Ci0JY21wZnVuYyB0cF9jb21wYXJlOwotCXJlcHJmdW5jIHRwX3JlcHI7CisgICAgZGVzdHJ1Y3RvciB0cF9kZWFsbG9jOworICAgIHByaW50ZnVuYyB0cF9wcmludDsKKyAgICBnZXRhdHRyZnVuYyB0cF9nZXRhdHRyOworICAgIHNldGF0dHJmdW5jIHRwX3NldGF0dHI7CisgICAgY21wZnVuYyB0cF9jb21wYXJlOworICAgIHJlcHJmdW5jIHRwX3JlcHI7CiAKLQkvKiBNZXRob2Qgc3VpdGVzIGZvciBzdGFuZGFyZCBjbGFzc2VzICovCisgICAgLyogTWV0aG9kIHN1aXRlcyBmb3Igc3RhbmRhcmQgY2xhc3NlcyAqLwogCi0JUHlOdW1iZXJNZXRob2RzICp0cF9hc19udW1iZXI7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKnRwX2FzX3NlcXVlbmNlOwotCVB5TWFwcGluZ01ldGhvZHMgKnRwX2FzX21hcHBpbmc7CisgICAgUHlOdW1iZXJNZXRob2RzICp0cF9hc19udW1iZXI7CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKnRwX2FzX3NlcXVlbmNlOworICAgIFB5TWFwcGluZ01ldGhvZHMgKnRwX2FzX21hcHBpbmc7CiAKLQkvKiBNb3JlIHN0YW5kYXJkIG9wZXJhdGlvbnMgKGhlcmUgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5KSAqLworICAgIC8qIE1vcmUgc3RhbmRhcmQgb3BlcmF0aW9ucyAoaGVyZSBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkpICovCiAKLQloYXNoZnVuYyB0cF9oYXNoOwotCXRlcm5hcnlmdW5jIHRwX2NhbGw7Ci0JcmVwcmZ1bmMgdHBfc3RyOwotCWdldGF0dHJvZnVuYyB0cF9nZXRhdHRybzsKLQlzZXRhdHRyb2Z1bmMgdHBfc2V0YXR0cm87CisgICAgaGFzaGZ1bmMgdHBfaGFzaDsKKyAgICB0ZXJuYXJ5ZnVuYyB0cF9jYWxsOworICAgIHJlcHJmdW5jIHRwX3N0cjsKKyAgICBnZXRhdHRyb2Z1bmMgdHBfZ2V0YXR0cm87CisgICAgc2V0YXR0cm9mdW5jIHRwX3NldGF0dHJvOwogCi0JLyogRnVuY3Rpb25zIHRvIGFjY2VzcyBvYmplY3QgYXMgaW5wdXQvb3V0cHV0IGJ1ZmZlciAqLwotCVB5QnVmZmVyUHJvY3MgKnRwX2FzX2J1ZmZlcjsKKyAgICAvKiBGdW5jdGlvbnMgdG8gYWNjZXNzIG9iamVjdCBhcyBpbnB1dC9vdXRwdXQgYnVmZmVyICovCisgICAgUHlCdWZmZXJQcm9jcyAqdHBfYXNfYnVmZmVyOwogCi0JLyogRmxhZ3MgdG8gZGVmaW5lIHByZXNlbmNlIG9mIG9wdGlvbmFsL2V4cGFuZGVkIGZlYXR1cmVzICovCi0JbG9uZyB0cF9mbGFnczsKKyAgICAvKiBGbGFncyB0byBkZWZpbmUgcHJlc2VuY2Ugb2Ygb3B0aW9uYWwvZXhwYW5kZWQgZmVhdHVyZXMgKi8KKyAgICBsb25nIHRwX2ZsYWdzOwogCi0JY29uc3QgY2hhciAqdHBfZG9jOyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKnRwX2RvYzsgLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KIAotCS8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjAgKi8KLQkvKiBjYWxsIGZ1bmN0aW9uIGZvciBhbGwgYWNjZXNzaWJsZSBvYmplY3RzICovCi0JdHJhdmVyc2Vwcm9jIHRwX3RyYXZlcnNlOworICAgIC8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICAvKiBjYWxsIGZ1bmN0aW9uIGZvciBhbGwgYWNjZXNzaWJsZSBvYmplY3RzICovCisgICAgdHJhdmVyc2Vwcm9jIHRwX3RyYXZlcnNlOwogCi0JLyogZGVsZXRlIHJlZmVyZW5jZXMgdG8gY29udGFpbmVkIG9iamVjdHMgKi8KLQlpbnF1aXJ5IHRwX2NsZWFyOworICAgIC8qIGRlbGV0ZSByZWZlcmVuY2VzIHRvIGNvbnRhaW5lZCBvYmplY3RzICovCisgICAgaW5xdWlyeSB0cF9jbGVhcjsKIAotCS8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjEgKi8KLQkvKiByaWNoIGNvbXBhcmlzb25zICovCi0JcmljaGNtcGZ1bmMgdHBfcmljaGNvbXBhcmU7CisgICAgLyogQXNzaWduZWQgbWVhbmluZyBpbiByZWxlYXNlIDIuMSAqLworICAgIC8qIHJpY2ggY29tcGFyaXNvbnMgKi8KKyAgICByaWNoY21wZnVuYyB0cF9yaWNoY29tcGFyZTsKIAotCS8qIHdlYWsgcmVmZXJlbmNlIGVuYWJsZXIgKi8KLQlQeV9zc2l6ZV90IHRwX3dlYWtsaXN0b2Zmc2V0OworICAgIC8qIHdlYWsgcmVmZXJlbmNlIGVuYWJsZXIgKi8KKyAgICBQeV9zc2l6ZV90IHRwX3dlYWtsaXN0b2Zmc2V0OwogCi0JLyogQWRkZWQgaW4gcmVsZWFzZSAyLjIgKi8KLQkvKiBJdGVyYXRvcnMgKi8KLQlnZXRpdGVyZnVuYyB0cF9pdGVyOwotCWl0ZXJuZXh0ZnVuYyB0cF9pdGVybmV4dDsKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuMiAqLworICAgIC8qIEl0ZXJhdG9ycyAqLworICAgIGdldGl0ZXJmdW5jIHRwX2l0ZXI7CisgICAgaXRlcm5leHRmdW5jIHRwX2l0ZXJuZXh0OwogCi0JLyogQXR0cmlidXRlIGRlc2NyaXB0b3IgYW5kIHN1YmNsYXNzaW5nIHN0dWZmICovCi0Jc3RydWN0IFB5TWV0aG9kRGVmICp0cF9tZXRob2RzOwotCXN0cnVjdCBQeU1lbWJlckRlZiAqdHBfbWVtYmVyczsKLQlzdHJ1Y3QgUHlHZXRTZXREZWYgKnRwX2dldHNldDsKLQlzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX2Jhc2U7Ci0JUHlPYmplY3QgKnRwX2RpY3Q7Ci0JZGVzY3JnZXRmdW5jIHRwX2Rlc2NyX2dldDsKLQlkZXNjcnNldGZ1bmMgdHBfZGVzY3Jfc2V0OwotCVB5X3NzaXplX3QgdHBfZGljdG9mZnNldDsKLQlpbml0cHJvYyB0cF9pbml0OwotCWFsbG9jZnVuYyB0cF9hbGxvYzsKLQluZXdmdW5jIHRwX25ldzsKLQlmcmVlZnVuYyB0cF9mcmVlOyAvKiBMb3ctbGV2ZWwgZnJlZS1tZW1vcnkgcm91dGluZSAqLwotCWlucXVpcnkgdHBfaXNfZ2M7IC8qIEZvciBQeU9iamVjdF9JU19HQyAqLwotCVB5T2JqZWN0ICp0cF9iYXNlczsKLQlQeU9iamVjdCAqdHBfbXJvOyAvKiBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciAqLwotCVB5T2JqZWN0ICp0cF9jYWNoZTsKLQlQeU9iamVjdCAqdHBfc3ViY2xhc3NlczsKLQlQeU9iamVjdCAqdHBfd2Vha2xpc3Q7Ci0JZGVzdHJ1Y3RvciB0cF9kZWw7CisgICAgLyogQXR0cmlidXRlIGRlc2NyaXB0b3IgYW5kIHN1YmNsYXNzaW5nIHN0dWZmICovCisgICAgc3RydWN0IFB5TWV0aG9kRGVmICp0cF9tZXRob2RzOworICAgIHN0cnVjdCBQeU1lbWJlckRlZiAqdHBfbWVtYmVyczsKKyAgICBzdHJ1Y3QgUHlHZXRTZXREZWYgKnRwX2dldHNldDsKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX2Jhc2U7CisgICAgUHlPYmplY3QgKnRwX2RpY3Q7CisgICAgZGVzY3JnZXRmdW5jIHRwX2Rlc2NyX2dldDsKKyAgICBkZXNjcnNldGZ1bmMgdHBfZGVzY3Jfc2V0OworICAgIFB5X3NzaXplX3QgdHBfZGljdG9mZnNldDsKKyAgICBpbml0cHJvYyB0cF9pbml0OworICAgIGFsbG9jZnVuYyB0cF9hbGxvYzsKKyAgICBuZXdmdW5jIHRwX25ldzsKKyAgICBmcmVlZnVuYyB0cF9mcmVlOyAvKiBMb3ctbGV2ZWwgZnJlZS1tZW1vcnkgcm91dGluZSAqLworICAgIGlucXVpcnkgdHBfaXNfZ2M7IC8qIEZvciBQeU9iamVjdF9JU19HQyAqLworICAgIFB5T2JqZWN0ICp0cF9iYXNlczsKKyAgICBQeU9iamVjdCAqdHBfbXJvOyAvKiBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciAqLworICAgIFB5T2JqZWN0ICp0cF9jYWNoZTsKKyAgICBQeU9iamVjdCAqdHBfc3ViY2xhc3NlczsKKyAgICBQeU9iamVjdCAqdHBfd2Vha2xpc3Q7CisgICAgZGVzdHJ1Y3RvciB0cF9kZWw7CiAKLQkvKiBUeXBlIGF0dHJpYnV0ZSBjYWNoZSB2ZXJzaW9uIHRhZy4gQWRkZWQgaW4gdmVyc2lvbiAyLjYgKi8KLQl1bnNpZ25lZCBpbnQgdHBfdmVyc2lvbl90YWc7CisgICAgLyogVHlwZSBhdHRyaWJ1dGUgY2FjaGUgdmVyc2lvbiB0YWcuIEFkZGVkIGluIHZlcnNpb24gMi42ICovCisgICAgdW5zaWduZWQgaW50IHRwX3ZlcnNpb25fdGFnOwogCiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JLyogdGhlc2UgbXVzdCBiZSBsYXN0IGFuZCBuZXZlciBleHBsaWNpdGx5IGluaXRpYWxpemVkICovCi0JUHlfc3NpemVfdCB0cF9hbGxvY3M7Ci0JUHlfc3NpemVfdCB0cF9mcmVlczsKLQlQeV9zc2l6ZV90IHRwX21heGFsbG9jOwotCXN0cnVjdCBfdHlwZW9iamVjdCAqdHBfcHJldjsKLQlzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX25leHQ7CisgICAgLyogdGhlc2UgbXVzdCBiZSBsYXN0IGFuZCBuZXZlciBleHBsaWNpdGx5IGluaXRpYWxpemVkICovCisgICAgUHlfc3NpemVfdCB0cF9hbGxvY3M7CisgICAgUHlfc3NpemVfdCB0cF9mcmVlczsKKyAgICBQeV9zc2l6ZV90IHRwX21heGFsbG9jOworICAgIHN0cnVjdCBfdHlwZW9iamVjdCAqdHBfcHJldjsKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX25leHQ7CiAjZW5kaWYKIH0gUHlUeXBlT2JqZWN0OwogCiAKIC8qIFRoZSAqcmVhbCogbGF5b3V0IG9mIGEgdHlwZSBvYmplY3Qgd2hlbiBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgKi8KIHR5cGVkZWYgc3RydWN0IF9oZWFwdHlwZW9iamVjdCB7Ci0JLyogTm90ZTogdGhlcmUncyBhIGRlcGVuZGVuY3kgb24gdGhlIG9yZGVyIG9mIHRoZXNlIG1lbWJlcnMKLQkgICBpbiBzbG90cHRyKCkgaW4gdHlwZW9iamVjdC5jIC4gKi8KLQlQeVR5cGVPYmplY3QgaHRfdHlwZTsKLQlQeU51bWJlck1ldGhvZHMgYXNfbnVtYmVyOwotCVB5TWFwcGluZ01ldGhvZHMgYXNfbWFwcGluZzsKLQlQeVNlcXVlbmNlTWV0aG9kcyBhc19zZXF1ZW5jZTsgLyogYXNfc2VxdWVuY2UgY29tZXMgYWZ0ZXIgYXNfbWFwcGluZywKLQkJCQkJICBzbyB0aGF0IHRoZSBtYXBwaW5nIHdpbnMgd2hlbiBib3RoCi0JCQkJCSAgdGhlIG1hcHBpbmcgYW5kIHRoZSBzZXF1ZW5jZSBkZWZpbmUKLQkJCQkJICBhIGdpdmVuIG9wZXJhdG9yIChlLmcuIF9fZ2V0aXRlbV9fKS4KLQkJCQkJICBzZWUgYWRkX29wZXJhdG9ycygpIGluIHR5cGVvYmplY3QuYyAuICovCi0JUHlCdWZmZXJQcm9jcyBhc19idWZmZXI7Ci0JUHlPYmplY3QgKmh0X25hbWUsICpodF9zbG90czsKLQkvKiBoZXJlIGFyZSBvcHRpb25hbCB1c2VyIHNsb3RzLCBmb2xsb3dlZCBieSB0aGUgbWVtYmVycy4gKi8KKyAgICAvKiBOb3RlOiB0aGVyZSdzIGEgZGVwZW5kZW5jeSBvbiB0aGUgb3JkZXIgb2YgdGhlc2UgbWVtYmVycworICAgICAgIGluIHNsb3RwdHIoKSBpbiB0eXBlb2JqZWN0LmMgLiAqLworICAgIFB5VHlwZU9iamVjdCBodF90eXBlOworICAgIFB5TnVtYmVyTWV0aG9kcyBhc19udW1iZXI7CisgICAgUHlNYXBwaW5nTWV0aG9kcyBhc19tYXBwaW5nOworICAgIFB5U2VxdWVuY2VNZXRob2RzIGFzX3NlcXVlbmNlOyAvKiBhc19zZXF1ZW5jZSBjb21lcyBhZnRlciBhc19tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHRoZSBtYXBwaW5nIHdpbnMgd2hlbiBib3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXBwaW5nIGFuZCB0aGUgc2VxdWVuY2UgZGVmaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgZ2l2ZW4gb3BlcmF0b3IgKGUuZy4gX19nZXRpdGVtX18pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgYWRkX29wZXJhdG9ycygpIGluIHR5cGVvYmplY3QuYyAuICovCisgICAgUHlCdWZmZXJQcm9jcyBhc19idWZmZXI7CisgICAgUHlPYmplY3QgKmh0X25hbWUsICpodF9zbG90czsKKyAgICAvKiBoZXJlIGFyZSBvcHRpb25hbCB1c2VyIHNsb3RzLCBmb2xsb3dlZCBieSB0aGUgbWVtYmVycy4gKi8KIH0gUHlIZWFwVHlwZU9iamVjdDsKIAogLyogYWNjZXNzIG1hY3JvIHRvIHRoZSBtZW1iZXJzIHdoaWNoIGFyZSBmbG9hdGluZyAiYmVoaW5kIiB0aGUgb2JqZWN0ICovCkBAIC00MzQsMjAgKzQzNCwyMCBAQAogLyogR2VuZXJpYyB0eXBlIGNoZWNrICovCiBQeUFQSV9GVU5DKGludCkgUHlUeXBlX0lzU3VidHlwZShQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwogI2RlZmluZSBQeU9iamVjdF9UeXBlQ2hlY2sob2IsIHRwKSBcCi0JKFB5X1RZUEUob2IpID09ICh0cCkgfHwgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgKHRwKSkpCisgICAgKFB5X1RZUEUob2IpID09ICh0cCkgfHwgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgKHRwKSkpCiAKIFB5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVR5cGVfVHlwZTsgLyogYnVpbHQtaW4gJ3R5cGUnICovCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlCYXNlT2JqZWN0X1R5cGU7IC8qIGJ1aWx0LWluICdvYmplY3QnICovCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTdXBlcl9UeXBlOyAvKiBidWlsdC1pbiAnc3VwZXInICovCiAKICNkZWZpbmUgUHlUeXBlX0NoZWNrKG9wKSBcCi0JUHlUeXBlX0Zhc3RTdWJjbGFzcyhQeV9UWVBFKG9wKSwgUHlfVFBGTEFHU19UWVBFX1NVQkNMQVNTKQorICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfVFlQRV9TVUJDTEFTUykKICNkZWZpbmUgUHlUeXBlX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlUeXBlX1R5cGUpCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVR5cGVfUmVhZHkoUHlUeXBlT2JqZWN0ICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVR5cGVfR2VuZXJpY0FsbG9jKFB5VHlwZU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlUeXBlX0dlbmVyaWNOZXcoUHlUeXBlT2JqZWN0ICosCi0JCQkJCSAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVR5cGVfTG9va3VwKFB5VHlwZU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkModW5zaWduZWQgaW50KSBQeVR5cGVfQ2xlYXJDYWNoZSh2b2lkKTsKIFB5QVBJX0ZVTkModm9pZCkgUHlUeXBlX01vZGlmaWVkKFB5VHlwZU9iamVjdCAqKTsKQEAgLTQ3NSw3ICs0NzUsNyBAQAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9TZWxmSXRlcihQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoUHlPYmplY3QgKiwKLQkJCQkJICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKGxvbmcpIFB5T2JqZWN0X0hhc2goUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKGxvbmcpIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZChQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Jc1RydWUoUHlPYmplY3QgKik7CkBAIC01MTAsNyArNTEwLDcgQEAKICNkZWZpbmUgUHlPYmplY3RfUkVQUihvYmopIFB5U3RyaW5nX0FTX1NUUklORyhQeU9iamVjdF9SZXByKG9iaikpCiAKIC8qIEZsYWcgYml0cyBmb3IgcHJpbnRpbmc6ICovCi0jZGVmaW5lIFB5X1BSSU5UX1JBVwkxCS8qIE5vIHN0cmluZyBxdW90ZXMgZXRjLiAqLworI2RlZmluZSBQeV9QUklOVF9SQVcgICAgMSAgICAgICAvKiBObyBzdHJpbmcgcXVvdGVzIGV0Yy4gKi8KIAogLyoKIGBUeXBlIGZsYWdzICh0cF9mbGFncykKQEAgLTYwMywyOSArNjAzLDI5IEBACiAjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgKDFMPDwyMSkKIAogLyogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgdHlwZSBpcyBhIHN1YmNsYXNzLiAqLwotI2RlZmluZSBQeV9UUEZMQUdTX0lOVF9TVUJDTEFTUwkJKDFMPDwyMykKLSNkZWZpbmUgUHlfVFBGTEFHU19MT05HX1NVQkNMQVNTCSgxTDw8MjQpCi0jZGVmaW5lIFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUwkoMUw8PDI1KQotI2RlZmluZSBQeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTCSgxTDw8MjYpCi0jZGVmaW5lIFB5X1RQRkxBR1NfU1RSSU5HX1NVQkNMQVNTCSgxTDw8MjcpCi0jZGVmaW5lIFB5X1RQRkxBR1NfVU5JQ09ERV9TVUJDTEFTUwkoMUw8PDI4KQotI2RlZmluZSBQeV9UUEZMQUdTX0RJQ1RfU1VCQ0xBU1MJKDFMPDwyOSkKLSNkZWZpbmUgUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUwkoMUw8PDMwKQotI2RlZmluZSBQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1MJKDFMPDwzMSkKKyNkZWZpbmUgUHlfVFBGTEFHU19JTlRfU1VCQ0xBU1MgICAgICAgICAoMUw8PDIzKQorI2RlZmluZSBQeV9UUEZMQUdTX0xPTkdfU1VCQ0xBU1MgICAgICAgICgxTDw8MjQpCisjZGVmaW5lIFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUyAgICAgICAgKDFMPDwyNSkKKyNkZWZpbmUgUHlfVFBGTEFHU19UVVBMRV9TVUJDTEFTUyAgICAgICAoMUw8PDI2KQorI2RlZmluZSBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUyAgICAgICgxTDw8MjcpCisjZGVmaW5lIFB5X1RQRkxBR1NfVU5JQ09ERV9TVUJDTEFTUyAgICAgKDFMPDwyOCkKKyNkZWZpbmUgUHlfVFBGTEFHU19ESUNUX1NVQkNMQVNTICAgICAgICAoMUw8PDI5KQorI2RlZmluZSBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTICAgICgxTDw8MzApCisjZGVmaW5lIFB5X1RQRkxBR1NfVFlQRV9TVUJDTEFTUyAgICAgICAgKDFMPDwzMSkKIAogI2RlZmluZSBQeV9UUEZMQUdTX0RFRkFVTFRfRVhURVJOQUwgKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfU0VRVUVOQ0VfSU4gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0lURVIgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9DTEFTUyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1NUQUNLTEVTU19FWFRFTlNJT04gfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9JTkRFWCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTiB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRSB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfSVRFUiB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0NMQVNTIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfU1RBQ0tMRVNTX0VYVEVOU0lPTiB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0lOREVYIHwgXAorICAgICAgICAgICAgICAgICAwKQogI2RlZmluZSBQeV9UUEZMQUdTX0RFRkFVTFRfQ09SRSAoUHlfVFBGTEFHU19ERUZBVUxUX0VYVEVSTkFMIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKQorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcpCiAKICNpZmRlZiBQeV9CVUlMRF9DT1JFCiAjZGVmaW5lIFB5X1RQRkxBR1NfREVGQVVMVCBQeV9UUEZMQUdTX0RFRkFVTFRfQ09SRQpAQCAtNjgzLDMyICs2ODMsMzIgQEAKICNpZmRlZiBQeV9SRUZfREVCVUcKIFB5QVBJX0RBVEEoUHlfc3NpemVfdCkgX1B5X1JlZlRvdGFsOwogUHlBUElfRlVOQyh2b2lkKSBfUHlfTmVnYXRpdmVSZWZjb3VudChjb25zdCBjaGFyICpmbmFtZSwKLQkJCQkJICAgIGludCBsaW5lbm8sIFB5T2JqZWN0ICpvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lbm8sIFB5T2JqZWN0ICpvcCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeURpY3RfRHVtbXkodm9pZCk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVNldF9EdW1teSh2b2lkKTsKIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5X0dldFJlZlRvdGFsKHZvaWQpOwotI2RlZmluZSBfUHlfSU5DX1JFRlRPVEFMCV9QeV9SZWZUb3RhbCsrCi0jZGVmaW5lIF9QeV9ERUNfUkVGVE9UQUwJX1B5X1JlZlRvdGFsLS0KLSNkZWZpbmUgX1B5X1JFRl9ERUJVR19DT01NQQksCi0jZGVmaW5lIF9QeV9DSEVDS19SRUZDTlQoT1ApCQkJCQlcCi17CWlmICgoKFB5T2JqZWN0KilPUCktPm9iX3JlZmNudCA8IDApCQkJCVwKLQkJX1B5X05lZ2F0aXZlUmVmY291bnQoX19GSUxFX18sIF9fTElORV9fLAlcCi0JCQkJICAgICAoUHlPYmplY3QgKikoT1ApKTsJCVwKKyNkZWZpbmUgX1B5X0lOQ19SRUZUT1RBTCAgICAgICAgX1B5X1JlZlRvdGFsKysKKyNkZWZpbmUgX1B5X0RFQ19SRUZUT1RBTCAgICAgICAgX1B5X1JlZlRvdGFsLS0KKyNkZWZpbmUgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgLAorI2RlZmluZSBfUHlfQ0hFQ0tfUkVGQ05UKE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgaWYgKCgoUHlPYmplY3QqKU9QKS0+b2JfcmVmY250IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfUHlfTmVnYXRpdmVSZWZjb3VudChfX0ZJTEVfXywgX19MSU5FX18sICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopKE9QKSk7ICAgICAgICAgXAogfQogI2Vsc2UKICNkZWZpbmUgX1B5X0lOQ19SRUZUT1RBTAogI2RlZmluZSBfUHlfREVDX1JFRlRPVEFMCiAjZGVmaW5lIF9QeV9SRUZfREVCVUdfQ09NTUEKLSNkZWZpbmUgX1B5X0NIRUNLX1JFRkNOVChPUCkJLyogYSBzZW1pY29sb24gKi87CisjZGVmaW5lIF9QeV9DSEVDS19SRUZDTlQoT1ApICAgIC8qIGEgc2VtaWNvbG9uICovOwogI2VuZGlmIC8qIFB5X1JFRl9ERUJVRyAqLwogCiAjaWZkZWYgQ09VTlRfQUxMT0NTCiBQeUFQSV9GVU5DKHZvaWQpIGluY19jb3VudChQeVR5cGVPYmplY3QgKik7CiBQeUFQSV9GVU5DKHZvaWQpIGRlY19jb3VudChQeVR5cGVPYmplY3QgKik7Ci0jZGVmaW5lIF9QeV9JTkNfVFBBTExPQ1MoT1ApCWluY19jb3VudChQeV9UWVBFKE9QKSkKLSNkZWZpbmUgX1B5X0lOQ19UUEZSRUVTKE9QKQlkZWNfY291bnQoUHlfVFlQRShPUCkpCi0jZGVmaW5lIF9QeV9ERUNfVFBGUkVFUyhPUCkJUHlfVFlQRShPUCktPnRwX2ZyZWVzLS0KLSNkZWZpbmUgX1B5X0NPVU5UX0FMTE9DU19DT01NQQksCisjZGVmaW5lIF9QeV9JTkNfVFBBTExPQ1MoT1ApICAgIGluY19jb3VudChQeV9UWVBFKE9QKSkKKyNkZWZpbmUgX1B5X0lOQ19UUEZSRUVTKE9QKSAgICAgZGVjX2NvdW50KFB5X1RZUEUoT1ApKQorI2RlZmluZSBfUHlfREVDX1RQRlJFRVMoT1ApICAgICBQeV9UWVBFKE9QKS0+dHBfZnJlZXMtLQorI2RlZmluZSBfUHlfQ09VTlRfQUxMT0NTX0NPTU1BICAsCiAjZWxzZQogI2RlZmluZSBfUHlfSU5DX1RQQUxMT0NTKE9QKQogI2RlZmluZSBfUHlfSU5DX1RQRlJFRVMoT1ApCkBAIC03MjksMjggKzcyOSwyOCBAQAogLyogV2l0aG91dCBQeV9UUkFDRV9SRUZTLCB0aGVyZSdzIGxpdHRsZSBlbm91Z2ggdG8gZG8gdGhhdCB3ZSBleHBhbmQgY29kZQogICogaW5saW5lLgogICovCi0jZGVmaW5lIF9QeV9OZXdSZWZlcmVuY2Uob3ApICgJCQkJXAotCV9QeV9JTkNfVFBBTExPQ1Mob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEJXAotCV9QeV9JTkNfUkVGVE9UQUwgIF9QeV9SRUZfREVCVUdfQ09NTUEJCVwKLQlQeV9SRUZDTlQob3ApID0gMSkKKyNkZWZpbmUgX1B5X05ld1JlZmVyZW5jZShvcCkgKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9QeV9JTkNfVFBBTExPQ1Mob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEgICAgICAgICBcCisgICAgX1B5X0lOQ19SRUZUT1RBTCAgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgICAgICAgICAgIFwKKyAgICBQeV9SRUZDTlQob3ApID0gMSkKIAogI2RlZmluZSBfUHlfRm9yZ2V0UmVmZXJlbmNlKG9wKSBfUHlfSU5DX1RQRlJFRVMob3ApCiAKLSNkZWZpbmUgX1B5X0RlYWxsb2Mob3ApICgJCQkJXAotCV9QeV9JTkNfVFBGUkVFUyhvcCkgX1B5X0NPVU5UX0FMTE9DU19DT01NQQlcCi0JKCpQeV9UWVBFKG9wKS0+dHBfZGVhbGxvYykoKFB5T2JqZWN0ICopKG9wKSkpCisjZGVmaW5lIF9QeV9EZWFsbG9jKG9wKSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfUHlfSU5DX1RQRlJFRVMob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEgICAgICAgICAgXAorICAgICgqUHlfVFlQRShvcCktPnRwX2RlYWxsb2MpKChQeU9iamVjdCAqKShvcCkpKQogI2VuZGlmIC8qICFQeV9UUkFDRV9SRUZTICovCiAKLSNkZWZpbmUgUHlfSU5DUkVGKG9wKSAoCQkJCVwKLQlfUHlfSU5DX1JFRlRPVEFMICBfUHlfUkVGX0RFQlVHX0NPTU1BCVwKLQkoKFB5T2JqZWN0Kikob3ApKS0+b2JfcmVmY250KyspCisjZGVmaW5lIFB5X0lOQ1JFRihvcCkgKCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX1B5X0lOQ19SRUZUT1RBTCAgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgICBcCisgICAgKChQeU9iamVjdCopKG9wKSktPm9iX3JlZmNudCsrKQogCi0jZGVmaW5lIFB5X0RFQ1JFRihvcCkJCQkJCVwKLQlpZiAoX1B5X0RFQ19SRUZUT1RBTCAgX1B5X1JFRl9ERUJVR19DT01NQQlcCi0JICAgIC0tKChQeU9iamVjdCopKG9wKSktPm9iX3JlZmNudCAhPSAwKQkJXAotCQlfUHlfQ0hFQ0tfUkVGQ05UKG9wKQkJCVwKLQllbHNlCQkJCQkJXAotCQlfUHlfRGVhbGxvYygoUHlPYmplY3QgKikob3ApKQorI2RlZmluZSBQeV9ERUNSRUYob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9QeV9ERUNfUkVGVE9UQUwgIF9QeV9SRUZfREVCVUdfQ09NTUEgICAgICAgICAgIFwKKyAgICAgICAgLS0oKFB5T2JqZWN0Kikob3ApKS0+b2JfcmVmY250ICE9IDApICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9QeV9DSEVDS19SRUZDTlQob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfUHlfRGVhbGxvYygoUHlPYmplY3QgKikob3ApKQogCiAvKiBTYWZlbHkgZGVjcmVmIGBvcGAgYW5kIHNldCBgb3BgIHRvIE5VTEwsIGVzcGVjaWFsbHkgdXNlZnVsIGluIHRwX2NsZWFyCiAgKiBhbmQgdHBfZGVhbGxvYyBpbXBsZW1lbnRhdG9ucy4KQEAgLTc4NiwxNCArNzg2LDE0IEBACiAgKiBQeXRob24gaW50ZWdlcnMgYXJlbid0IGN1cnJlbnRseSB3ZWFrbHkgcmVmZXJlbmNhYmxlLiAgQmVzdCBwcmFjdGljZSBpcwogICogdG8gdXNlIFB5X0NMRUFSKCkgZXZlbiBpZiB5b3UgY2FuJ3QgdGhpbmsgb2YgYSByZWFzb24gZm9yIHdoeSB5b3UgbmVlZCB0by4KICAqLwotI2RlZmluZSBQeV9DTEVBUihvcCkJCQkJXAotICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0gICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKl9weV90bXAgPSAoUHlPYmplY3QgKikob3ApOwlcCi0gICAgICAgICAgICAgICAgICAgICAgICAob3ApID0gTlVMTDsJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihfcHlfdG1wKTsJXAotICAgICAgICAgICAgICAgIH0JCQkJXAotICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9DTEVBUihvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUHlPYmplY3QgKl9weV90bXAgPSAoUHlPYmplY3QgKikob3ApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChvcCkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRihfcHlfdG1wKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQogCiAvKiBNYWNyb3MgdG8gdXNlIGluIGNhc2UgdGhlIG9iamVjdCBwb2ludGVyIG1heSBiZSBOVUxMOiAqLwogI2RlZmluZSBQeV9YSU5DUkVGKG9wKSBpZiAoKG9wKSA9PSBOVUxMKSA7IGVsc2UgUHlfSU5DUkVGKG9wKQpAQCAtOTIwLDEzICs5MjAsMTMgQEAKIHN0YXRpYyB2b2lkCiBteXR5cGVfZGVhbGxvYyhteXR5cGUgKnApCiB7Ci0gICAgICAgIC4uLiBkZWNsYXJhdGlvbnMgZ28gaGVyZSAuLi4KKyAgICAuLi4gZGVjbGFyYXRpb25zIGdvIGhlcmUgLi4uCiAKLSAJUHlPYmplY3RfR0NfVW5UcmFjayhwKTsJICAgLy8gbXVzdCB1bnRyYWNrIGZpcnN0Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihwKQotCS4uLiBUaGUgYm9keSBvZiB0aGUgZGVhbGxvY2F0b3IgZ29lcyBoZXJlLCBpbmNsdWRpbmcgYWxsIGNhbGxzIC4uLgotCS4uLiB0byBQeV9ERUNSRUYgb24gY29udGFpbmVkIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKHApCisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhwKTsgICAgICAgIC8vIG11c3QgdW50cmFjayBmaXJzdAorICAgIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ocCkKKyAgICAuLi4gVGhlIGJvZHkgb2YgdGhlIGRlYWxsb2NhdG9yIGdvZXMgaGVyZSwgaW5jbHVkaW5nIGFsbCBjYWxscyAuLi4KKyAgICAuLi4gdG8gUHlfREVDUkVGIG9uIGNvbnRhaW5lZCBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgICBQeV9UUkFTSENBTl9TQUZFX0VORChwKQogfQogCiBDQVVUSU9OOiAgTmV2ZXIgcmV0dXJuIGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgYm9keSEgIElmIHRoZSBib2R5IG5lZWRzIHRvCkBAIC05NTYsMTYgKzk1NiwxNiBAQAogI2RlZmluZSBQeVRyYXNoX1VOV0lORF9MRVZFTCA1MAogCiAjZGVmaW5lIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ob3ApIFwKLQlpZiAoX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgPCBQeVRyYXNoX1VOV0lORF9MRVZFTCkgeyBcCi0JCSsrX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7Ci0JCS8qIFRoZSBib2R5IG9mIHRoZSBkZWFsbG9jYXRvciBpcyBoZXJlLiAqLworICAgIGlmIChfUHlUcmFzaF9kZWxldGVfbmVzdGluZyA8IFB5VHJhc2hfVU5XSU5EX0xFVkVMKSB7IFwKKyAgICAgICAgKytfUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKKyAgICAgICAgLyogVGhlIGJvZHkgb2YgdGhlIGRlYWxsb2NhdG9yIGlzIGhlcmUuICovCiAjZGVmaW5lIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKG9wKSBcCi0JCS0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7IFwKLQkJaWYgKF9QeVRyYXNoX2RlbGV0ZV9sYXRlciAmJiBfUHlUcmFzaF9kZWxldGVfbmVzdGluZyA8PSAwKSBcCi0JCQlfUHlUcmFzaF9kZXN0cm95X2NoYWluKCk7IFwKLQl9IFwKLQllbHNlIFwKLQkJX1B5VHJhc2hfZGVwb3NpdF9vYmplY3QoKFB5T2JqZWN0KilvcCk7CisgICAgICAgIC0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7IFwKKyAgICAgICAgaWYgKF9QeVRyYXNoX2RlbGV0ZV9sYXRlciAmJiBfUHlUcmFzaF9kZWxldGVfbmVzdGluZyA8PSAwKSBcCisgICAgICAgICAgICBfUHlUcmFzaF9kZXN0cm95X2NoYWluKCk7IFwKKyAgICB9IFwKKyAgICBlbHNlIFwKKyAgICAgICAgX1B5VHJhc2hfZGVwb3NpdF9vYmplY3QoKFB5T2JqZWN0KilvcCk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vYmppbXBsLmggYi9JbmNsdWRlL29iamltcGwuaAppbmRleCBlZjQ3MjE4Li4xOWJlYjc2IDEwMDY0NAotLS0gYS9JbmNsdWRlL29iamltcGwuaAorKysgYi9JbmNsdWRlL29iamltcGwuaApAQCAtMTAxLDM4ICsxMDEsMzggQEAKIAogLyogTWFjcm9zICovCiAjaWZkZWYgV0lUSF9QWU1BTExPQwotI2lmZGVmIFBZTUFMTE9DX0RFQlVHCS8qIFdJVEhfUFlNQUxMT0MgJiYgUFlNQUxMT0NfREVCVUcgKi8KKyNpZmRlZiBQWU1BTExPQ19ERUJVRyAgIC8qIFdJVEhfUFlNQUxMT0MgJiYgUFlNQUxMT0NfREVCVUcgKi8KIFB5QVBJX0ZVTkModm9pZCAqKSBfUHlPYmplY3RfRGVidWdNYWxsb2Moc2l6ZV90IG5ieXRlcyk7CiBQeUFQSV9GVU5DKHZvaWQgKikgX1B5T2JqZWN0X0RlYnVnUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbmJ5dGVzKTsKIFB5QVBJX0ZVTkModm9pZCkgX1B5T2JqZWN0X0RlYnVnRnJlZSh2b2lkICpwKTsKIFB5QVBJX0ZVTkModm9pZCkgX1B5T2JqZWN0X0RlYnVnRHVtcEFkZHJlc3MoY29uc3Qgdm9pZCAqcCk7CiBQeUFQSV9GVU5DKHZvaWQpIF9QeU9iamVjdF9EZWJ1Z0NoZWNrQWRkcmVzcyhjb25zdCB2b2lkICpwKTsKIFB5QVBJX0ZVTkModm9pZCkgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHModm9pZCk7Ci0jZGVmaW5lIFB5T2JqZWN0X01BTExPQwkJX1B5T2JqZWN0X0RlYnVnTWFsbG9jCi0jZGVmaW5lIFB5T2JqZWN0X01hbGxvYwkJX1B5T2JqZWN0X0RlYnVnTWFsbG9jCi0jZGVmaW5lIFB5T2JqZWN0X1JFQUxMT0MJX1B5T2JqZWN0X0RlYnVnUmVhbGxvYwotI2RlZmluZSBQeU9iamVjdF9SZWFsbG9jCV9QeU9iamVjdF9EZWJ1Z1JlYWxsb2MKLSNkZWZpbmUgUHlPYmplY3RfRlJFRQkJX1B5T2JqZWN0X0RlYnVnRnJlZQotI2RlZmluZSBQeU9iamVjdF9GcmVlCQlfUHlPYmplY3RfRGVidWdGcmVlCisjZGVmaW5lIFB5T2JqZWN0X01BTExPQyAgICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvYworI2RlZmluZSBQeU9iamVjdF9NYWxsb2MgICAgICAgICBfUHlPYmplY3RfRGVidWdNYWxsb2MKKyNkZWZpbmUgUHlPYmplY3RfUkVBTExPQyAgICAgICAgX1B5T2JqZWN0X0RlYnVnUmVhbGxvYworI2RlZmluZSBQeU9iamVjdF9SZWFsbG9jICAgICAgICBfUHlPYmplY3RfRGVidWdSZWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X0ZSRUUgICAgICAgICAgIF9QeU9iamVjdF9EZWJ1Z0ZyZWUKKyNkZWZpbmUgUHlPYmplY3RfRnJlZSAgICAgICAgICAgX1B5T2JqZWN0X0RlYnVnRnJlZQogCi0jZWxzZQkvKiBXSVRIX1BZTUFMTE9DICYmICEgUFlNQUxMT0NfREVCVUcgKi8KLSNkZWZpbmUgUHlPYmplY3RfTUFMTE9DCQlQeU9iamVjdF9NYWxsb2MKLSNkZWZpbmUgUHlPYmplY3RfUkVBTExPQwlQeU9iamVjdF9SZWFsbG9jCi0jZGVmaW5lIFB5T2JqZWN0X0ZSRUUJCVB5T2JqZWN0X0ZyZWUKKyNlbHNlICAgLyogV0lUSF9QWU1BTExPQyAmJiAhIFBZTUFMTE9DX0RFQlVHICovCisjZGVmaW5lIFB5T2JqZWN0X01BTExPQyAgICAgICAgIFB5T2JqZWN0X01hbGxvYworI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DICAgICAgICBQeU9iamVjdF9SZWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X0ZSRUUgICAgICAgICAgIFB5T2JqZWN0X0ZyZWUKICNlbmRpZgogCi0jZWxzZQkvKiAhIFdJVEhfUFlNQUxMT0MgKi8KLSNkZWZpbmUgUHlPYmplY3RfTUFMTE9DCQlQeU1lbV9NQUxMT0MKLSNkZWZpbmUgUHlPYmplY3RfUkVBTExPQwlQeU1lbV9SRUFMTE9DCi0jZGVmaW5lIFB5T2JqZWN0X0ZSRUUJCVB5TWVtX0ZSRUUKKyNlbHNlICAgLyogISBXSVRIX1BZTUFMTE9DICovCisjZGVmaW5lIFB5T2JqZWN0X01BTExPQyAgICAgICAgIFB5TWVtX01BTExPQworI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DICAgICAgICBQeU1lbV9SRUFMTE9DCisjZGVmaW5lIFB5T2JqZWN0X0ZSRUUgICAgICAgICAgIFB5TWVtX0ZSRUUKIAotI2VuZGlmCS8qIFdJVEhfUFlNQUxMT0MgKi8KKyNlbmRpZiAgLyogV0lUSF9QWU1BTExPQyAqLwogCi0jZGVmaW5lIFB5T2JqZWN0X0RlbAkJUHlPYmplY3RfRnJlZQotI2RlZmluZSBQeU9iamVjdF9ERUwJCVB5T2JqZWN0X0ZSRUUKKyNkZWZpbmUgUHlPYmplY3RfRGVsICAgICAgICAgICAgUHlPYmplY3RfRnJlZQorI2RlZmluZSBQeU9iamVjdF9ERUwgICAgICAgICAgICBQeU9iamVjdF9GUkVFCiAKIC8qIGZvciBzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLwotI2RlZmluZSBfUHlPYmplY3RfRGVsCQlQeU9iamVjdF9GcmVlCisjZGVmaW5lIF9QeU9iamVjdF9EZWwgICAgICAgICAgIFB5T2JqZWN0X0ZyZWUKIAogLyoKICAqIEdlbmVyaWMgb2JqZWN0IGFsbG9jYXRvciBpbnRlcmZhY2UKQEAgLTE0NywxNiArMTQ3LDE2IEBACiBQeUFQSV9GVU5DKFB5VmFyT2JqZWN0ICopIF9QeU9iamVjdF9OZXdWYXIoUHlUeXBlT2JqZWN0ICosIFB5X3NzaXplX3QpOwogCiAjZGVmaW5lIFB5T2JqZWN0X05ldyh0eXBlLCB0eXBlb2JqKSBcCi0JCSggKHR5cGUgKikgX1B5T2JqZWN0X05ldyh0eXBlb2JqKSApCisgICAgICAgICAgICAgICAgKCAodHlwZSAqKSBfUHlPYmplY3RfTmV3KHR5cGVvYmopICkKICNkZWZpbmUgUHlPYmplY3RfTmV3VmFyKHR5cGUsIHR5cGVvYmosIG4pIFwKLQkJKCAodHlwZSAqKSBfUHlPYmplY3RfTmV3VmFyKCh0eXBlb2JqKSwgKG4pKSApCisgICAgICAgICAgICAgICAgKCAodHlwZSAqKSBfUHlPYmplY3RfTmV3VmFyKCh0eXBlb2JqKSwgKG4pKSApCiAKIC8qIE1hY3JvcyB0cmFkaW5nIGJpbmFyeSBjb21wYXRpYmlsaXR5IGZvciBzcGVlZC4gU2VlIGFsc28gcHltZW0uaC4KICAgIE5vdGUgdGhhdCB0aGVzZSBtYWNyb3MgZXhwZWN0IG5vbi1OVUxMIG9iamVjdCBwb2ludGVycy4qLwogI2RlZmluZSBQeU9iamVjdF9JTklUKG9wLCB0eXBlb2JqKSBcCi0JKCBQeV9UWVBFKG9wKSA9ICh0eXBlb2JqKSwgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKikob3ApKSwgKG9wKSApCisgICAgKCBQeV9UWVBFKG9wKSA9ICh0eXBlb2JqKSwgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKikob3ApKSwgKG9wKSApCiAjZGVmaW5lIFB5T2JqZWN0X0lOSVRfVkFSKG9wLCB0eXBlb2JqLCBzaXplKSBcCi0JKCBQeV9TSVpFKG9wKSA9IChzaXplKSwgUHlPYmplY3RfSU5JVCgob3ApLCAodHlwZW9iaikpICkKKyAgICAoIFB5X1NJWkUob3ApID0gKHNpemUpLCBQeU9iamVjdF9JTklUKChvcCksICh0eXBlb2JqKSkgKQogCiAjZGVmaW5lIF9QeU9iamVjdF9TSVpFKHR5cGVvYmopICggKHR5cGVvYmopLT50cF9iYXNpY3NpemUgKQogCkBAIC0xNzQsMTcgKzE3NCwxNyBAQAogIyAgIGVycm9yICJfUHlPYmplY3RfVkFSX1NJWkUgcmVxdWlyZXMgU0laRU9GX1ZPSURfUCBiZSBhIHBvd2VyIG9mIDIiCiAjZW5kaWYKIAotI2RlZmluZSBfUHlPYmplY3RfVkFSX1NJWkUodHlwZW9iaiwgbml0ZW1zKQlcCi0JKHNpemVfdCkJCQkJXAotCSggKCAodHlwZW9iaiktPnRwX2Jhc2ljc2l6ZSArCQlcCi0JICAgIChuaXRlbXMpKih0eXBlb2JqKS0+dHBfaXRlbXNpemUgKwlcCi0JICAgIChTSVpFT0ZfVk9JRF9QIC0gMSkJCQlcCi0JICApICYgfihTSVpFT0ZfVk9JRF9QIC0gMSkJCVwKLQkpCisjZGVmaW5lIF9QeU9iamVjdF9WQVJfU0laRSh0eXBlb2JqLCBuaXRlbXMpICAgICBcCisgICAgKHNpemVfdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAoICh0eXBlb2JqKS0+dHBfYmFzaWNzaXplICsgICAgICAgICAgICAgICBcCisgICAgICAgIChuaXRlbXMpKih0eXBlb2JqKS0+dHBfaXRlbXNpemUgKyAgICAgICBcCisgICAgICAgIChTSVpFT0ZfVk9JRF9QIC0gMSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICYgfihTSVpFT0ZfVk9JRF9QIC0gMSkgICAgICAgICAgICAgICAgICBcCisgICAgKQogCiAjZGVmaW5lIFB5T2JqZWN0X05FVyh0eXBlLCB0eXBlb2JqKSBcCiAoICh0eXBlICopIFB5T2JqZWN0X0luaXQoIFwKLQkoUHlPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKCBfUHlPYmplY3RfU0laRSh0eXBlb2JqKSApLCAodHlwZW9iaikpICkKKyAgICAoUHlPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKCBfUHlPYmplY3RfU0laRSh0eXBlb2JqKSApLCAodHlwZW9iaikpICkKIAogI2RlZmluZSBQeU9iamVjdF9ORVdfVkFSKHR5cGUsIHR5cGVvYmosIG4pIFwKICggKHR5cGUgKikgUHlPYmplY3RfSW5pdFZhciggXApAQCAtMTk2LDcgKzE5Niw3IEBACiAgICBkaXN0aW5jdGlvbiBiZXR3ZWVuIHR3byBzdGVwcyAoYXQgbGVhc3QpOgogICAgICAgIDEpIHRoZSBhY3R1YWwgYWxsb2NhdGlvbiBvZiB0aGUgb2JqZWN0IHN0b3JhZ2U7CiAgICAgICAgMikgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBQeXRob24gc3BlY2lmaWMgZmllbGRzCi0gICAgICAgICAgaW4gdGhpcyBzdG9yYWdlIHdpdGggUHlPYmplY3Rfe0luaXQsIEluaXRWYXJ9LgorICAgICAgaW4gdGhpcyBzdG9yYWdlIHdpdGggUHlPYmplY3Rfe0luaXQsIEluaXRWYXJ9LgogCiAgICBQeU9iamVjdCAqCiAgICBZb3VyT2JqZWN0X05ldyguLi4pCkBAIC0yMDUsNyArMjA1LDcgQEAKIAogICAgICAgIG9wID0gKFB5T2JqZWN0ICopIFlvdXJfQWxsb2NhdG9yKF9QeU9iamVjdF9TSVpFKFlvdXJUeXBlU3RydWN0KSk7CiAgICAgICAgaWYgKG9wID09IE5VTEwpCi0gICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgICAgUHlPYmplY3RfSW5pdChvcCwgJllvdXJUeXBlU3RydWN0KTsKIApAQCAtMjMyLDQ0ICsyMzIsNDQgQEAKIAogLyogVGVzdCBpZiBhbiBvYmplY3QgaGFzIGEgR0MgaGVhZCAqLwogI2RlZmluZSBQeU9iamVjdF9JU19HQyhvKSAoUHlUeXBlX0lTX0dDKFB5X1RZUEUobykpICYmIFwKLQkoUHlfVFlQRShvKS0+dHBfaXNfZ2MgPT0gTlVMTCB8fCBQeV9UWVBFKG8pLT50cF9pc19nYyhvKSkpCisgICAgKFB5X1RZUEUobyktPnRwX2lzX2djID09IE5VTEwgfHwgUHlfVFlQRShvKS0+dHBfaXNfZ2MobykpKQogCiBQeUFQSV9GVU5DKFB5VmFyT2JqZWN0ICopIF9QeU9iamVjdF9HQ19SZXNpemUoUHlWYXJPYmplY3QgKiwgUHlfc3NpemVfdCk7CiAjZGVmaW5lIFB5T2JqZWN0X0dDX1Jlc2l6ZSh0eXBlLCBvcCwgbikgXAotCQkoICh0eXBlICopIF9QeU9iamVjdF9HQ19SZXNpemUoKFB5VmFyT2JqZWN0ICopKG9wKSwgKG4pKSApCisgICAgICAgICAgICAgICAgKCAodHlwZSAqKSBfUHlPYmplY3RfR0NfUmVzaXplKChQeVZhck9iamVjdCAqKShvcCksIChuKSkgKQogCiAvKiBmb3Igc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCAyLjIgKi8KICNkZWZpbmUgX1B5T2JqZWN0X0dDX0RlbCBQeU9iamVjdF9HQ19EZWwKIAogLyogR0MgaW5mb3JtYXRpb24gaXMgc3RvcmVkIEJFRk9SRSB0aGUgb2JqZWN0IHN0cnVjdHVyZS4gKi8KIHR5cGVkZWYgdW5pb24gX2djX2hlYWQgewotCXN0cnVjdCB7Ci0JCXVuaW9uIF9nY19oZWFkICpnY19uZXh0OwotCQl1bmlvbiBfZ2NfaGVhZCAqZ2NfcHJldjsKLQkJUHlfc3NpemVfdCBnY19yZWZzOwotCX0gZ2M7Ci0JbG9uZyBkb3VibGUgZHVtbXk7ICAvKiBmb3JjZSB3b3JzdC1jYXNlIGFsaWdubWVudCAqLworICAgIHN0cnVjdCB7CisgICAgICAgIHVuaW9uIF9nY19oZWFkICpnY19uZXh0OworICAgICAgICB1bmlvbiBfZ2NfaGVhZCAqZ2NfcHJldjsKKyAgICAgICAgUHlfc3NpemVfdCBnY19yZWZzOworICAgIH0gZ2M7CisgICAgbG9uZyBkb3VibGUgZHVtbXk7ICAvKiBmb3JjZSB3b3JzdC1jYXNlIGFsaWdubWVudCAqLwogfSBQeUdDX0hlYWQ7CiAKIGV4dGVybiBQeUdDX0hlYWQgKl9QeUdDX2dlbmVyYXRpb24wOwogCiAjZGVmaW5lIF9QeV9BU19HQyhvKSAoKFB5R0NfSGVhZCAqKShvKS0xKQogCi0jZGVmaW5lIF9QeUdDX1JFRlNfVU5UUkFDS0VECQkJKC0yKQotI2RlZmluZSBfUHlHQ19SRUZTX1JFQUNIQUJMRQkJCSgtMykKLSNkZWZpbmUgX1B5R0NfUkVGU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRQkoLTQpCisjZGVmaW5lIF9QeUdDX1JFRlNfVU5UUkFDS0VEICAgICAgICAgICAgICAgICAgICAoLTIpCisjZGVmaW5lIF9QeUdDX1JFRlNfUkVBQ0hBQkxFICAgICAgICAgICAgICAgICAgICAoLTMpCisjZGVmaW5lIF9QeUdDX1JFRlNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUgICAgICAoLTQpCiAKIC8qIFRlbGwgdGhlIEdDIHRvIHRyYWNrIHRoaXMgb2JqZWN0LiAgTkI6IFdoaWxlIHRoZSBvYmplY3QgaXMgdHJhY2tlZCB0aGUKICAqIGNvbGxlY3RvciBpdCBtdXN0IGJlIHNhZmUgdG8gY2FsbCB0aGUgb2JfdHJhdmVyc2UgbWV0aG9kLiAqLwogI2RlZmluZSBfUHlPYmplY3RfR0NfVFJBQ0sobykgZG8geyBcCi0JUHlHQ19IZWFkICpnID0gX1B5X0FTX0dDKG8pOyBcCi0JaWYgKGctPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpIFwKLQkJUHlfRmF0YWxFcnJvcigiR0Mgb2JqZWN0IGFscmVhZHkgdHJhY2tlZCIpOyBcCi0JZy0+Z2MuZ2NfcmVmcyA9IF9QeUdDX1JFRlNfUkVBQ0hBQkxFOyBcCi0JZy0+Z2MuZ2NfbmV4dCA9IF9QeUdDX2dlbmVyYXRpb24wOyBcCi0JZy0+Z2MuZ2NfcHJldiA9IF9QeUdDX2dlbmVyYXRpb24wLT5nYy5nY19wcmV2OyBcCi0JZy0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IGc7IFwKLQlfUHlHQ19nZW5lcmF0aW9uMC0+Z2MuZ2NfcHJldiA9IGc7IFwKKyAgICBQeUdDX0hlYWQgKmcgPSBfUHlfQVNfR0Mobyk7IFwKKyAgICBpZiAoZy0+Z2MuZ2NfcmVmcyAhPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCkgXAorICAgICAgICBQeV9GYXRhbEVycm9yKCJHQyBvYmplY3QgYWxyZWFkeSB0cmFja2VkIik7IFwKKyAgICBnLT5nYy5nY19yZWZzID0gX1B5R0NfUkVGU19SRUFDSEFCTEU7IFwKKyAgICBnLT5nYy5nY19uZXh0ID0gX1B5R0NfZ2VuZXJhdGlvbjA7IFwKKyAgICBnLT5nYy5nY19wcmV2ID0gX1B5R0NfZ2VuZXJhdGlvbjAtPmdjLmdjX3ByZXY7IFwKKyAgICBnLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gZzsgXAorICAgIF9QeUdDX2dlbmVyYXRpb24wLT5nYy5nY19wcmV2ID0gZzsgXAogICAgIH0gd2hpbGUgKDApOwogCiAvKiBUZWxsIHRoZSBHQyB0byBzdG9wIHRyYWNraW5nIHRoaXMgb2JqZWN0LgpAQCAtMjc3LDEyICsyNzcsMTIgQEAKICAqIHdheSB0byBwcm92b2tlIG1lbW9yeSBlcnJvcnMgaWYgY2FsbGluZyBjb2RlIGlzIGNvbmZ1c2VkLgogICovCiAjZGVmaW5lIF9QeU9iamVjdF9HQ19VTlRSQUNLKG8pIGRvIHsgXAotCVB5R0NfSGVhZCAqZyA9IF9QeV9BU19HQyhvKTsgXAotCWFzc2VydChnLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsgXAotCWctPmdjLmdjX3JlZnMgPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRDsgXAotCWctPmdjLmdjX3ByZXYtPmdjLmdjX25leHQgPSBnLT5nYy5nY19uZXh0OyBcCi0JZy0+Z2MuZ2NfbmV4dC0+Z2MuZ2NfcHJldiA9IGctPmdjLmdjX3ByZXY7IFwKLQlnLT5nYy5nY19uZXh0ID0gTlVMTDsgXAorICAgIFB5R0NfSGVhZCAqZyA9IF9QeV9BU19HQyhvKTsgXAorICAgIGFzc2VydChnLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsgXAorICAgIGctPmdjLmdjX3JlZnMgPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRDsgXAorICAgIGctPmdjLmdjX3ByZXYtPmdjLmdjX25leHQgPSBnLT5nYy5nY19uZXh0OyBcCisgICAgZy0+Z2MuZ2NfbmV4dC0+Z2MuZ2NfcHJldiA9IGctPmdjLmdjX3ByZXY7IFwKKyAgICBnLT5nYy5nY19uZXh0ID0gTlVMTDsgXAogICAgIH0gd2hpbGUgKDApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9HQ19NYWxsb2Moc2l6ZV90KTsKQEAgLTI5Myw5ICsyOTMsOSBAQAogUHlBUElfRlVOQyh2b2lkKSBQeU9iamVjdF9HQ19EZWwodm9pZCAqKTsKIAogI2RlZmluZSBQeU9iamVjdF9HQ19OZXcodHlwZSwgdHlwZW9iaikgXAotCQkoICh0eXBlICopIF9QeU9iamVjdF9HQ19OZXcodHlwZW9iaikgKQorICAgICAgICAgICAgICAgICggKHR5cGUgKikgX1B5T2JqZWN0X0dDX05ldyh0eXBlb2JqKSApCiAjZGVmaW5lIFB5T2JqZWN0X0dDX05ld1Zhcih0eXBlLCB0eXBlb2JqLCBuKSBcCi0JCSggKHR5cGUgKikgX1B5T2JqZWN0X0dDX05ld1ZhcigodHlwZW9iaiksIChuKSkgKQorICAgICAgICAgICAgICAgICggKHR5cGUgKikgX1B5T2JqZWN0X0dDX05ld1ZhcigodHlwZW9iaiksIChuKSkgKQogCiAKIC8qIFV0aWxpdHkgbWFjcm8gdG8gaGVscCB3cml0ZSB0cF90cmF2ZXJzZSBmdW5jdGlvbnMuCkBAIC0zMDMsMTQgKzMwMywxNCBAQAogICogInZpc2l0IiBhbmQgImFyZyIuICBUaGlzIGlzIGludGVuZGVkIHRvIGtlZXAgdHBfdHJhdmVyc2UgZnVuY3Rpb25zCiAgKiBsb29raW5nIGFzIG11Y2ggYWxpa2UgYXMgcG9zc2libGUuCiAgKi8KLSNkZWZpbmUgUHlfVklTSVQob3ApCQkJCQkJCVwKLSAgICAgICAgZG8geyAJCQkJCQkJCVwKLSAgICAgICAgICAgICAgICBpZiAob3ApIHsJCQkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnJldCA9IHZpc2l0KChQeU9iamVjdCAqKShvcCksIGFyZyk7CVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cmV0KQkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsJCQkJXAotICAgICAgICAgICAgICAgIH0JCQkJCQkJXAotICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9WSVNJVChvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IHZyZXQgPSB2aXNpdCgoUHlPYmplY3QgKikob3ApLCBhcmcpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHZyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiB2cmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAKIC8qIFRoaXMgaXMgaGVyZSBmb3IgdGhlIHNha2Ugb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBFeHRlbnNpb25zIHRoYXQKICAqIHVzZSB0aGUgb2xkIEdDIEFQSSB3aWxsIHN0aWxsIGNvbXBpbGUgYnV0IHRoZSBvYmplY3RzIHdpbGwgbm90IGJlCkBAIC0zMjQsMTEgKzMyNCwxMSBAQAogCiAvKiBUZXN0IGlmIGEgdHlwZSBzdXBwb3J0cyB3ZWFrIHJlZmVyZW5jZXMgKi8KICNkZWZpbmUgUHlUeXBlX1NVUFBPUlRTX1dFQUtSRUZTKHQpIFwKLSAgICAgICAgKFB5VHlwZV9IYXNGZWF0dXJlKCh0KSwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTKSBcCi0gICAgICAgICAmJiAoKHQpLT50cF93ZWFrbGlzdG9mZnNldCA+IDApKQorICAgIChQeVR5cGVfSGFzRmVhdHVyZSgodCksIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUykgXAorICAgICAmJiAoKHQpLT50cF93ZWFrbGlzdG9mZnNldCA+IDApKQogCiAjZGVmaW5lIFB5T2JqZWN0X0dFVF9XRUFLUkVGU19MSVNUUFRSKG8pIFwKLQkoKFB5T2JqZWN0ICoqKSAoKChjaGFyICopIChvKSkgKyBQeV9UWVBFKG8pLT50cF93ZWFrbGlzdG9mZnNldCkpCisgICAgKChQeU9iamVjdCAqKikgKCgoY2hhciAqKSAobykpICsgUHlfVFlQRShvKS0+dHBfd2Vha2xpc3RvZmZzZXQpKQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHllcnJvcnMuaCBiL0luY2x1ZGUvcHllcnJvcnMuaAppbmRleCBhNDIzM2M5Li5lNGY1ZGY2IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5ZXJyb3JzLmgKKysrIGIvSW5jbHVkZS9weWVycm9ycy5oCkBAIC05NCwyNSArOTQsMjUgQEAKIAogLyogKi8KIAotI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHgpCQkJCQlcCi0JKFB5Q2xhc3NfQ2hlY2soKHgpKSB8fCAoUHlUeXBlX0NoZWNrKCh4KSkgJiYJCQlcCi0JICBQeVR5cGVfRmFzdFN1YmNsYXNzKChQeVR5cGVPYmplY3QqKSh4KSwgUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUykpKQorI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChQeUNsYXNzX0NoZWNrKCh4KSkgfHwgKFB5VHlwZV9DaGVjaygoeCkpICYmICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUHlUeXBlX0Zhc3RTdWJjbGFzcygoUHlUeXBlT2JqZWN0KikoeCksIFB5X1RQRkxBR1NfQkFTRV9FWENfU1VCQ0xBU1MpKSkKIAotI2RlZmluZSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHgpCQkJXAotCShQeUluc3RhbmNlX0NoZWNrKCh4KSkgfHwJCQlcCi0JIFB5VHlwZV9GYXN0U3ViY2xhc3MoKHgpLT5vYl90eXBlLCBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTKSkKKyNkZWZpbmUgUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh4KSAgICAgICAgICAgICAgICAgICAgXAorICAgIChQeUluc3RhbmNlX0NoZWNrKCh4KSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoKHgpLT5vYl90eXBlLCBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTKSkKIAotI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUoeCkJCQkJICAgXAotCShQeUNsYXNzX0NoZWNrKCh4KSkJCQkJCSAgIFwKLQkgPyBQeVN0cmluZ19BU19TVFJJTkcoKChQeUNsYXNzT2JqZWN0KikoeCkpLT5jbF9uYW1lKQkgICBcCi0JIDogKGNoYXIgKikoKChQeVR5cGVPYmplY3QqKSh4KSktPnRwX25hbWUpKQorI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoUHlDbGFzc19DaGVjaygoeCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgID8gUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlDbGFzc09iamVjdCopKHgpKS0+Y2xfbmFtZSkgICAgICAgICAgXAorICAgICA6IChjaGFyICopKCgoUHlUeXBlT2JqZWN0KikoeCkpLT50cF9uYW1lKSkKIAotI2RlZmluZSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHgpCQkJCQlcCi0JKChQeUluc3RhbmNlX0NoZWNrKCh4KSkJCQkJCQlcCi0JICA/IChQeU9iamVjdCopKChQeUluc3RhbmNlT2JqZWN0KikoeCkpLT5pbl9jbGFzcwkJXAotCSAgOiAoUHlPYmplY3QqKSgoeCktPm9iX3R5cGUpKSkKKyNkZWZpbmUgUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKFB5SW5zdGFuY2VfQ2hlY2soKHgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgID8gKFB5T2JqZWN0KikoKFB5SW5zdGFuY2VPYmplY3QqKSh4KSktPmluX2NsYXNzICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogKFB5T2JqZWN0KikoKHgpLT5vYl90eXBlKSkpCiAKLQkKKwogLyogUHJlZGVmaW5lZCBleGNlcHRpb25zICovCiAKIFB5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfQmFzZUV4Y2VwdGlvbjsKQEAgLTE4NCwzMyArMTg0LDMzIEBACiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX05vTWVtb3J5KHZvaWQpOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tRXJybm8oUHlPYmplY3QgKik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdCgKLQlQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5T2JqZWN0ICosIGNoYXIgKik7CiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21FcnJub1dpdGhVbmljb2RlRmlsZW5hbWUoCi0JUHlPYmplY3QgKiwgUHlfVU5JQ09ERSAqKTsKKyAgICBQeU9iamVjdCAqLCBQeV9VTklDT0RFICopOwogI2VuZGlmIC8qIFB5X1dJTl9XSURFX0ZJTEVOQU1FUyAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX0Zvcm1hdChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLikKLQkJCVB5X0dDQ19BVFRSSUJVVEUoKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOwogCiAjaWZkZWYgTVNfV0lORE9XUwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdCgKLQlpbnQsIGNvbnN0IGNoYXIgKik7CisgICAgaW50LCBjb25zdCBjaGFyICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgKLQlpbnQsIGNvbnN0IGNoYXIgKik7CisgICAgaW50LCBjb25zdCBjaGFyICopOwogI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhVbmljb2RlRmlsZW5hbWUoCi0JaW50LCBjb25zdCBQeV9VTklDT0RFICopOworICAgIGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKICNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoaW50KTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoCi0JUHlPYmplY3QgKixpbnQsIFB5T2JqZWN0ICopOworICAgIFB5T2JqZWN0ICosaW50LCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoCi0JUHlPYmplY3QgKixpbnQsIGNvbnN0IGNoYXIgKik7CisgICAgUHlPYmplY3QgKixpbnQsIGNvbnN0IGNoYXIgKik7CiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aFVuaWNvZGVGaWxlbmFtZSgKLQlQeU9iamVjdCAqLGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKKyAgICBQeU9iamVjdCAqLGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKICNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoUHlPYmplY3QgKiwgaW50KTsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCkBAIC0yNDQsMTUgKzI0NCwxNSBAQAogCiAvKiBjcmVhdGUgYSBVbmljb2RlRGVjb2RlRXJyb3Igb2JqZWN0ICovCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZSgKLQljb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKKyAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKIAogLyogY3JlYXRlIGEgVW5pY29kZUVuY29kZUVycm9yIG9iamVjdCAqLwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9DcmVhdGUoCi0JY29uc3QgY2hhciAqLCBjb25zdCBQeV9VTklDT0RFICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKik7CisgICAgY29uc3QgY2hhciAqLCBjb25zdCBQeV9VTklDT0RFICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKik7CiAKIC8qIGNyZWF0ZSBhIFVuaWNvZGVUcmFuc2xhdGVFcnJvciBvYmplY3QgKi8KIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfQ3JlYXRlKAotCWNvbnN0IFB5X1VOSUNPREUgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKKyAgICBjb25zdCBQeV9VTklDT0RFICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKik7CiAKIC8qIGdldCB0aGUgZW5jb2RpbmcgYXR0cmlidXRlICovCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nKFB5T2JqZWN0ICopOwpAQCAtMjk1LDExICsyOTUsMTEgQEAKIC8qIGFzc2lnbiBhIG5ldyB2YWx1ZSB0byB0aGUgcmVhc29uIGF0dHJpYnV0ZQogICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAqLwogUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbigKLQlQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworICAgIFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CiBQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uKAotCVB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CisgICAgUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb24oCi0JUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKKyAgICBQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOwogI2VuZGlmCiAKIApAQCAtMzE5LDkgKzMxOSw5IEBACiAKICNpbmNsdWRlIDxzdGRhcmcuaD4KIFB5QVBJX0ZVTkMoaW50KSBQeU9TX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgICpmb3JtYXQsIC4uLikKLQkJCVB5X0dDQ19BVFRSSUJVVEUoKGZvcm1hdChwcmludGYsIDMsIDQpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOwogUHlBUElfRlVOQyhpbnQpIFB5T1NfdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgICpmb3JtYXQsIHZhX2xpc3QgdmEpCi0JCQlQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAzLCAwKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMywgMCkpKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5bWFjY29uZmlnLmggYi9JbmNsdWRlL3B5bWFjY29uZmlnLmgKaW5kZXggYjJjYzBiNy4uZmUzYTZkZSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weW1hY2NvbmZpZy5oCisrKyBiL0luY2x1ZGUvcHltYWNjb25maWcuaApAQCAtNCw3ICs0LDcgQEAKICAgICAgICogVGhpcyBmaWxlIG1vdmVzIHNvbWUgb2YgdGhlIGF1dG9jb25mIG1hZ2ljIHRvIGNvbXBpbGUtdGltZQogICAgICAgKiB3aGVuIGJ1aWxkaW5nIG9uIE1hY09TWC4gVGhpcyBpcyBuZWVkZWQgZm9yIGJ1aWxkaW5nIDQtd2F5CiAgICAgICAqIHVuaXZlcnNhbCBiaW5hcmllcyBhbmQgZm9yIDY0LWJpdCB1bml2ZXJzYWwgYmluYXJpZXMgYmVjYXVzZQotICAgICAgKiB0aGUgdmFsdWVzIHJlZGVmaW5lZCBiZWxvdyBhcmVuJ3QgY29uZmlndXJlLXRpbWUgY29uc3RhbnQgYnV0IAorICAgICAgKiB0aGUgdmFsdWVzIHJlZGVmaW5lZCBiZWxvdyBhcmVuJ3QgY29uZmlndXJlLXRpbWUgY29uc3RhbnQgYnV0CiAgICAgICAqIG9ubHkgY29tcGlsZS10aW1lIGNvbnN0YW50IGluIHRoZXNlIHNjZW5hcmlvcy4KICAgICAgICovCiAKQEAgLTMwLDM2ICszMCwzNiBAQAogCiAjICAgIHVuZGVmIFNJWkVPRl9MT05HCiAjICAgIGlmZGVmIF9fTFA2NF9fCi0jCSBkZWZpbmUgU0laRU9GX19CT09MCQkxCi0jICAgICAgICBkZWZpbmUgU0laRU9GX19CT09MCQkxCi0jICAgICAgICBkZWZpbmUgU0laRU9GX0xPTkcgCQk4Ci0jICAgICAgICBkZWZpbmUgU0laRU9GX1BUSFJFQURfVCAJOAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9TSVpFX1QgCQk4Ci0jICAgICAgICBkZWZpbmUgU0laRU9GX1RJTUVfVCAJCTgKLSMgICAgICAgIGRlZmluZSBTSVpFT0ZfVk9JRF9QIAkJOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9fQk9PTCAgICAgICAgICAgIDEKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfX0JPT0wgICAgICAgICAgICAxCisjICAgICAgICBkZWZpbmUgU0laRU9GX0xPTkcgICAgICAgICAgICAgOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgICAgICAgIDgKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfU0laRV9UICAgICAgICAgICA4CisjICAgICAgICBkZWZpbmUgU0laRU9GX1RJTUVfVCAgICAgICAgICAgOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9WT0lEX1AgICAgICAgICAgIDgKICMgICAgZWxzZQogIyAgICAgICAgaWZkZWYgX19wcGNfXwotIwkgICAgZGVmaW5lIFNJWkVPRl9fQk9PTAkJNAorIyAgICAgICAgICAgZGVmaW5lIFNJWkVPRl9fQk9PTCAgICAgICAgIDQKICMgICAgICAgIGVsc2UKLSMJICAgIGRlZmluZSBTSVpFT0ZfX0JPT0wJCTEKKyMgICAgICAgICAgIGRlZmluZSBTSVpFT0ZfX0JPT0wgICAgICAgICAxCiAjICAgICAgICBlbmRpZgotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9MT05HIAkJNAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgCTQKLSMgICAgICAgIGRlZmluZSBTSVpFT0ZfU0laRV9UIAkJNAotIyAgICAgICAgZGVmaW5lIFNJWkVPRl9USU1FX1QgCQk0Ci0jICAgICAgICBkZWZpbmUgU0laRU9GX1ZPSURfUCAJCTQKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfTE9ORyAgICAgICAgICAgICA0CisjICAgICAgICBkZWZpbmUgU0laRU9GX1BUSFJFQURfVCAgICAgICAgNAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9TSVpFX1QgICAgICAgICAgIDQKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfVElNRV9UICAgICAgICAgICA0CisjICAgICAgICBkZWZpbmUgU0laRU9GX1ZPSURfUCAgICAgICAgICAgNAogIyAgICBlbmRpZgogCiAjICAgIGlmIGRlZmluZWQoX19MUDY0X18pCi0JIC8qIE1hY09TWCAxMC40ICh0aGUgZmlyc3QgcmVsZWFzZSB0byBzdXBwcG9ydCA2NC1iaXQgY29kZQotCSAgKiBhdCBhbGwpIG9ubHkgc3VwcG9ydHMgNjQtYml0IGluIHRoZSBVTklYIGxheWVyLiAKLQkgICogVGhlcmVmb3JlIHN1cnByZXNzIHRoZSB0b29sYm94LWdsdWUgaW4gNjQtYml0IG1vZGUuCi0JICAqLworICAgICAvKiBNYWNPU1ggMTAuNCAodGhlIGZpcnN0IHJlbGVhc2UgdG8gc3VwcHBvcnQgNjQtYml0IGNvZGUKKyAgICAgICogYXQgYWxsKSBvbmx5IHN1cHBvcnRzIDY0LWJpdCBpbiB0aGUgVU5JWCBsYXllci4KKyAgICAgICogVGhlcmVmb3JlIHN1cnByZXNzIHRoZSB0b29sYm94LWdsdWUgaW4gNjQtYml0IG1vZGUuCisgICAgICAqLwogCi0JLyogSW4gNjQtYml0IG1vZGUgc2V0cGdycCBhbHdheXMgaGFzIG5vIGFyZ21lbnRzLCBpbiAzMi1iaXQKLQkgKiBtb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQKLQkgKi8KLSMJdW5kZWYgU0VUUEdSUF9IQVZFX0FSRworICAgIC8qIEluIDY0LWJpdCBtb2RlIHNldHBncnAgYWx3YXlzIGhhcyBubyBhcmdtZW50cywgaW4gMzItYml0CisgICAgICogbW9kZSB0aGF0IGRlcGVuZHMgb24gdGhlIGNvbXBpbGF0aW9uIGVudmlyb25tZW50CisgICAgICovCisjICAgICAgIHVuZGVmIFNFVFBHUlBfSEFWRV9BUkcKIAogIyAgICBlbmRpZgogCkBAIC02NywxNyArNjcsMTcgQEAKICNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKICNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KIAotCS8qIAotCSAqIFRoZSBkZWZpbml0aW9uIGluIHB5Y29uZmlnLmggaXMgb25seSB2YWxpZCBvbiB0aGUgT1MgcmVsZWFzZQotCSAqIHdoZXJlIGNvbmZpZ3VyZSByYW4gb24gYW5kIG5vdCBuZWNlc3NhcmlseSBmb3IgYWxsIHN5c3RlbXMgd2hlcmUKLQkgKiB0aGUgZXhlY3V0YWJsZSBjYW4gYmUgdXNlZCBvbi4gCi0JICogCi0JICogU3BlY2lmaWNhbGx5OiBPU1ggMTAuNCBoYXMgbGltaXRlZCBzdXBwb3J0ZWQgZm9yICclemQnLCB3aGlsZQotCSAqIDEwLjUgaGFzIGZ1bGwgc3VwcG9ydCBmb3IgJyV6ZCcuIEEgYmluYXJ5IGJ1aWx0IG9uIDEwLjUgd29uJ3QKLQkgKiB3b3JrIHByb3Blcmx5IG9uIDEwLjQgdW5sZXNzIHdlIHN1cnByZXNzIHRoZSBkZWZpbml0aW9uCi0JICogb2YgUFlfRk9STUFUX1NJWkVfVAotCSAqLwotI3VuZGVmCVBZX0ZPUk1BVF9TSVpFX1QKKyAgICAvKgorICAgICAqIFRoZSBkZWZpbml0aW9uIGluIHB5Y29uZmlnLmggaXMgb25seSB2YWxpZCBvbiB0aGUgT1MgcmVsZWFzZQorICAgICAqIHdoZXJlIGNvbmZpZ3VyZSByYW4gb24gYW5kIG5vdCBuZWNlc3NhcmlseSBmb3IgYWxsIHN5c3RlbXMgd2hlcmUKKyAgICAgKiB0aGUgZXhlY3V0YWJsZSBjYW4gYmUgdXNlZCBvbi4KKyAgICAgKgorICAgICAqIFNwZWNpZmljYWxseTogT1NYIDEwLjQgaGFzIGxpbWl0ZWQgc3VwcG9ydGVkIGZvciAnJXpkJywgd2hpbGUKKyAgICAgKiAxMC41IGhhcyBmdWxsIHN1cHBvcnQgZm9yICclemQnLiBBIGJpbmFyeSBidWlsdCBvbiAxMC41IHdvbid0CisgICAgICogd29yayBwcm9wZXJseSBvbiAxMC40IHVubGVzcyB3ZSBzdXJwcmVzcyB0aGUgZGVmaW5pdGlvbgorICAgICAqIG9mIFBZX0ZPUk1BVF9TSVpFX1QKKyAgICAgKi8KKyN1bmRlZiAgUFlfRk9STUFUX1NJWkVfVAogCiAKICNlbmRpZiAvKiBkZWZpbmVkKF9BUFBMRV9fKSAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXBvcnQuaCBiL0luY2x1ZGUvcHlwb3J0LmgKaW5kZXggNjRiYmIwMy4uZWQ1ZmM1NiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXBvcnQuaAorKysgYi9JbmNsdWRlL3B5cG9ydC5oCkBAIC04NiwyMCArODYsMjAgQEAKICAqIGludGVncmFsIHR5cGUuCiAgKi8KICNpZmRlZiBIQVZFX1VJTlRQVFJfVAotdHlwZWRlZiB1aW50cHRyX3QJUHlfdWludHB0cl90OwotdHlwZWRlZiBpbnRwdHJfdAlQeV9pbnRwdHJfdDsKK3R5cGVkZWYgdWludHB0cl90ICAgICAgIFB5X3VpbnRwdHJfdDsKK3R5cGVkZWYgaW50cHRyX3QgICAgICAgIFB5X2ludHB0cl90OwogCiAjZWxpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9JTlQKLXR5cGVkZWYgdW5zaWduZWQgaW50CVB5X3VpbnRwdHJfdDsKLXR5cGVkZWYgaW50CQlQeV9pbnRwdHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIFB5X3VpbnRwdHJfdDsKK3R5cGVkZWYgaW50ICAgICAgICAgICAgIFB5X2ludHB0cl90OwogCiAjZWxpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcJUHlfdWludHB0cl90OwotdHlwZWRlZiBsb25nCQlQeV9pbnRwdHJfdDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIFB5X3VpbnRwdHJfdDsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgIFB5X2ludHB0cl90OwogCiAjZWxpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKSAmJiAoU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9OR19MT05HKQotdHlwZWRlZiB1bnNpZ25lZCBQWV9MT05HX0xPTkcJUHlfdWludHB0cl90OwotdHlwZWRlZiBQWV9MT05HX0xPTkcJCVB5X2ludHB0cl90OwordHlwZWRlZiB1bnNpZ25lZCBQWV9MT05HX0xPTkcgICBQeV91aW50cHRyX3Q7Cit0eXBlZGVmIFBZX0xPTkdfTE9ORyAgICAgICAgICAgIFB5X2ludHB0cl90OwogCiAjZWxzZQogIyAgIGVycm9yICJQeXRob24gbmVlZHMgYSB0eXBlZGVmIGZvciBQeV91aW50cHRyX3QgaW4gcHlwb3J0LmguIgpAQCAtMTEwLDkgKzExMCw5IEBACiAgKiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlKS4gIFNlZSBQRVAgMzUzIGZvciBkZXRhaWxzLgogICovCiAjaWZkZWYgSEFWRV9TU0laRV9UCi10eXBlZGVmIHNzaXplX3QJCVB5X3NzaXplX3Q7Cit0eXBlZGVmIHNzaXplX3QgICAgICAgICBQeV9zc2l6ZV90OwogI2VsaWYgU0laRU9GX1ZPSURfUCA9PSBTSVpFT0ZfU0laRV9UCi10eXBlZGVmIFB5X2ludHB0cl90CVB5X3NzaXplX3Q7Cit0eXBlZGVmIFB5X2ludHB0cl90ICAgICBQeV9zc2l6ZV90OwogI2Vsc2UKICMgICBlcnJvciAiUHl0aG9uIG5lZWRzIGEgdHlwZWRlZiBmb3IgUHlfc3NpemVfdCBpbiBweXBvcnQuaC4iCiAjZW5kaWYKQEAgLTEyMCw3ICsxMjAsNyBAQAogLyogTGFyZ2VzdCBwb3NzaWJsZSB2YWx1ZSBvZiBzaXplX3QuCiAgICBTSVpFX01BWCBpcyBwYXJ0IG9mIEM5OSwgc28gaXQgbWlnaHQgYmUgZGVmaW5lZCBvbiBzb21lCiAgICBwbGF0Zm9ybXMuIElmIGl0IGlzIG5vdCBkZWZpbmVkLCAoc2l6ZV90KS0xIGlzIGEgcG9ydGFibGUKLSAgIGRlZmluaXRpb24gZm9yIEM4OSwgZHVlIHRvIHRoZSB3YXkgc2lnbmVkLT51bnNpZ25lZCAKKyAgIGRlZmluaXRpb24gZm9yIEM4OSwgZHVlIHRvIHRoZSB3YXkgc2lnbmVkLT51bnNpZ25lZAogICAgY29udmVyc2lvbiBpcyBkZWZpbmVkLiAqLwogI2lmZGVmIFNJWkVfTUFYCiAjZGVmaW5lIFBZX1NJWkVfTUFYIFNJWkVfTUFYCkBAIC0xOTYsNyArMTk2LDcgQEAKIC8qIGVuYWJsZSBtb3JlIGFnZ3Jlc3NpdmUgb3B0aW1pemF0aW9uIGZvciB2aXN1YWwgc3R1ZGlvICovCiAjcHJhZ21hIG9wdGltaXplKCJhZ3R3Iiwgb24pCiAjZW5kaWYKLS8qIGlnbm9yZSB3YXJuaW5ncyBpZiB0aGUgY29tcGlsZXIgZGVjaWRlcyBub3QgdG8gaW5saW5lIGEgZnVuY3Rpb24gKi8gCisvKiBpZ25vcmUgd2FybmluZ3MgaWYgdGhlIGNvbXBpbGVyIGRlY2lkZXMgbm90IHRvIGlubGluZSBhIGZ1bmN0aW9uICovCiAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDcxMCkKIC8qIGZhc3Rlc3QgcG9zc2libGUgbG9jYWwgY2FsbCB1bmRlciBNU1ZDICovCiAjZGVmaW5lIFB5X0xPQ0FMKHR5cGUpIHN0YXRpYyB0eXBlIF9fZmFzdGNhbGwKQEAgLTIxNiwxNiArMjE2LDE2IEBACiAgKi8KIAogI2lmIGRlZmluZWQoX01TQ19WRVIpCi0jZGVmaW5lIFB5X01FTUNQWSh0YXJnZXQsIHNvdXJjZSwgbGVuZ3RoKSBkbyB7CQkJCVwKLQkJc2l6ZV90IGlfLCBuXyA9IChsZW5ndGgpOwkJCQlcCi0JCWNoYXIgKnRfID0gKHZvaWQqKSAodGFyZ2V0KTsJCQkJXAotCQljb25zdCBjaGFyICpzXyA9ICh2b2lkKikgKHNvdXJjZSk7CQkJXAotCQlpZiAobl8gPj0gMTYpCQkJCQkJXAotCQkJbWVtY3B5KHRfLCBzXywgbl8pOwkJCQlcCi0JCWVsc2UJCQkJCQkJXAotCQkJZm9yIChpXyA9IDA7IGlfIDwgbl87IGlfKyspCQkJXAotCQkJCXRfW2lfXSA9IHNfW2lfXTsJCQlcCi0JfSB3aGlsZSAoMCkKKyNkZWZpbmUgUHlfTUVNQ1BZKHRhcmdldCwgc291cmNlLCBsZW5ndGgpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2l6ZV90IGlfLCBuXyA9IChsZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2hhciAqdF8gPSAodm9pZCopICh0YXJnZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgY2hhciAqc18gPSAodm9pZCopIChzb3VyY2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG5fID49IDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1lbWNweSh0Xywgc18sIG5fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoaV8gPSAwOyBpXyA8IG5fOyBpXysrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0X1tpX10gPSBzX1tpX107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQogI2Vsc2UKICNkZWZpbmUgUHlfTUVNQ1BZIG1lbWNweQogI2VuZGlmCkBAIC0zMzksNyArMzM5LDcgQEAKICAqLwogI2lmZGVmIFNJR05FRF9SSUdIVF9TSElGVF9aRVJPX0ZJTExTCiAjZGVmaW5lIFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQoVFlQRSwgSSwgSikgXAotCSgoSSkgPCAwID8gfigofih1bnNpZ25lZCBUWVBFKShJKSkgPj4gKEopKSA6IChJKSA+PiAoSikpCisgICAgKChJKSA8IDAgPyB+KCh+KHVuc2lnbmVkIFRZUEUpKEkpKSA+PiAoSikpIDogKEkpID4+IChKKSkKICNlbHNlCiAjZGVmaW5lIFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQoVFlQRSwgSSwgSikgKChJKSA+PiAoSikpCiAjZW5kaWYKQEAgLTM1OSw3ICszNTksNyBAQAogICovCiAjaWZkZWYgUHlfREVCVUcKICNkZWZpbmUgUHlfU0FGRV9ET1dOQ0FTVChWQUxVRSwgV0lERSwgTkFSUk9XKSBcCi0JKGFzc2VydCgoV0lERSkoTkFSUk9XKShWQUxVRSkgPT0gKFZBTFVFKSksIChOQVJST1cpKFZBTFVFKSkKKyAgICAoYXNzZXJ0KChXSURFKShOQVJST1cpKFZBTFVFKSA9PSAoVkFMVUUpKSwgKE5BUlJPVykoVkFMVUUpKQogI2Vsc2UKICNkZWZpbmUgUHlfU0FGRV9ET1dOQ0FTVChWQUxVRSwgV0lERSwgTkFSUk9XKSAoTkFSUk9XKShWQUxVRSkKICNlbmRpZgpAQCAtMzc5LDEzICszNzksMTMgQEAKICNkZWZpbmUgX1B5X1NFVF9FRE9NX0ZPUl9OQU4oWCkgOwogI2VuZGlmCiAjZGVmaW5lIFB5X1NFVF9FUlJOT19PTl9NQVRIX0VSUk9SKFgpIFwKLQlkbyB7IFwKLQkJaWYgKGVycm5vID09IDApIHsgXAotCQkJaWYgKChYKSA9PSBQeV9IVUdFX1ZBTCB8fCAoWCkgPT0gLVB5X0hVR0VfVkFMKSBcCi0JCQkJZXJybm8gPSBFUkFOR0U7IFwKLQkJCWVsc2UgX1B5X1NFVF9FRE9NX0ZPUl9OQU4oWCkgXAotCQl9IFwKLQl9IHdoaWxlKDApCisgICAgZG8geyBcCisgICAgICAgIGlmIChlcnJubyA9PSAwKSB7IFwKKyAgICAgICAgICAgIGlmICgoWCkgPT0gUHlfSFVHRV9WQUwgfHwgKFgpID09IC1QeV9IVUdFX1ZBTCkgXAorICAgICAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOyBcCisgICAgICAgICAgICBlbHNlIF9QeV9TRVRfRURPTV9GT1JfTkFOKFgpIFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSgwKQogCiAvKiBQeV9TRVRfRVJBTkdFX09OX09WRVJGTE9XKHgpCiAgKiBBbiBhbGlhcyBvZiBQeV9TRVRfRVJSTk9fT05fTUFUSF9FUlJPUiBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eS4KQEAgLTQwNiwyNiArNDA2LDI2IEBACiAgKiAgICBUaGlzIGlzbid0IHJlbGlhYmxlLiAgU2VlIFB5X09WRVJGTE9XRUQgY29tbWVudHMuCiAgKiAgICBYIGFuZCBZIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCiAgKi8KLSNkZWZpbmUgUHlfQURKVVNUX0VSQU5HRTEoWCkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoZXJybm8gPT0gMCkgewkJCQkJXAotCQkJaWYgKChYKSA9PSBQeV9IVUdFX1ZBTCB8fCAoWCkgPT0gLVB5X0hVR0VfVkFMKQlcCi0JCQkJZXJybm8gPSBFUkFOR0U7CQkJCVwKLQkJfQkJCQkJCQlcCi0JCWVsc2UgaWYgKGVycm5vID09IEVSQU5HRSAmJiAoWCkgPT0gMC4wKQkJCVwKLQkJCWVycm5vID0gMDsJCQkJCVwKLQl9IHdoaWxlKDApCisjZGVmaW5lIFB5X0FESlVTVF9FUkFOR0UxKFgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChlcnJubyA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoKFgpID09IFB5X0hVR0VfVkFMIHx8IChYKSA9PSAtUHlfSFVHRV9WQUwpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSAmJiAoWCkgPT0gMC4wKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQogCi0jZGVmaW5lIFB5X0FESlVTVF9FUkFOR0UyKFgsIFkpCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKChYKSA9PSBQeV9IVUdFX1ZBTCB8fCAoWCkgPT0gLVB5X0hVR0VfVkFMIHx8CVwKLQkJICAgIChZKSA9PSBQeV9IVUdFX1ZBTCB8fCAoWSkgPT0gLVB5X0hVR0VfVkFMKSB7CVwKLQkJCQlpZiAoZXJybm8gPT0gMCkJCQkJXAotCQkJCQllcnJubyA9IEVSQU5HRTsJCQlcCi0JCX0JCQkJCQkJXAotCQllbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpCQkJCVwKLQkJCWVycm5vID0gMDsJCQkJCVwKLQl9IHdoaWxlKDApCisjZGVmaW5lIFB5X0FESlVTVF9FUkFOR0UyKFgsIFkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoWCkgPT0gUHlfSFVHRV9WQUwgfHwgKFgpID09IC1QeV9IVUdFX1ZBTCB8fCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoWSkgPT0gUHlfSFVHRV9WQUwgfHwgKFkpID09IC1QeV9IVUdFX1ZBTCkgeyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQogCiAvKiBQeV9ERVBSRUNBVEVEKHZlcnNpb24pCiAgKiBEZWNsYXJlIGEgdmFyaWFibGUsIHR5cGUsIG9yIGZ1bmN0aW9uIGRlcHJlY2F0ZWQuCkBAIC00MzUsNyArNDM1LDcgQEAKICAqICAgIGV4dGVybiBpbnQgeCgpIFB5X0RFUFJFQ0FURUQoMi41KTsKICAqLwogI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gPj0gNCkgfHwgXAotCQkJICAoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDEpKQorICAgICAgICAgICAgICAoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDEpKQogI2RlZmluZSBQeV9ERVBSRUNBVEVEKFZFUlNJT05fVU5VU0VEKSBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXykpCiAjZWxzZQogI2RlZmluZSBQeV9ERVBSRUNBVEVEKFZFUlNJT05fVU5VU0VEKQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfX0dFVFBUWQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJLyogd2UgbmVlZCB0byBpbXBvcnQgbW9kZV90ICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgICAgIC8qIHdlIG5lZWQgdG8gaW1wb3J0IG1vZGVfdCAqLwogZXh0ZXJuIGNoYXIgKiBfZ2V0cHR5KGludCAqLCBpbnQsIG1vZGVfdCwgaW50KTsKICNlbmRpZgogCkBAIC01NjEsNzEgKzU2MSw3MSBAQAogICBsaW5rYWdlIGhhbmRsaW5nIGFuZCBib3RoIG9mIHRoZXNlIHVzZSBfX2RlY2xzcGVjKCkuCiAqLwogI2lmIGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX0JFT1NfXykKLSMJZGVmaW5lIEhBVkVfREVDTFNQRUNfRExMCisjICAgICAgIGRlZmluZSBIQVZFX0RFQ0xTUEVDX0RMTAogI2VuZGlmCiAKIC8qIG9ubHkgZ2V0IHNwZWNpYWwgbGlua2FnZSBpZiBidWlsdCBhcyBzaGFyZWQgb3IgcGxhdGZvcm0gaXMgQ3lnd2luICovCiAjaWYgZGVmaW5lZChQeV9FTkFCTEVfU0hBUkVEKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jCWlmIGRlZmluZWQoSEFWRV9ERUNMU1BFQ19ETEwpCi0jCQlpZmRlZiBQeV9CVUlMRF9DT1JFCi0jCQkJZGVmaW5lIFB5QVBJX0ZVTkMoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQotIwkJCWRlZmluZSBQeUFQSV9EQVRBKFJUWVBFKSBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCi0JCQkvKiBtb2R1bGUgaW5pdCBmdW5jdGlvbnMgaW5zaWRlIHRoZSBjb3JlIG5lZWQgbm8gZXh0ZXJuYWwgbGlua2FnZSAqLwotCQkJLyogZXhjZXB0IGZvciBDeWd3aW4gdG8gaGFuZGxlIGVtYmVkZGluZyAoRklYTUU6IEJlT1MgdG9vPykgKi8KLSMJCQlpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCi0jCQkJCWRlZmluZSBQeU1PRElOSVRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZAotIwkJCWVsc2UgLyogX19DWUdXSU5fXyAqLwotIwkJCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAotIwkJCWVuZGlmIC8qIF9fQ1lHV0lOX18gKi8KLSMJCWVsc2UgLyogUHlfQlVJTERfQ09SRSAqLwotCQkJLyogQnVpbGRpbmcgYW4gZXh0ZW5zaW9uIG1vZHVsZSwgb3IgYW4gZW1iZWRkZWQgc2l0dWF0aW9uICovCi0JCQkvKiBwdWJsaWMgUHl0aG9uIGZ1bmN0aW9ucyBhbmQgZGF0YSBhcmUgaW1wb3J0ZWQgKi8KLQkJCS8qIFVuZGVyIEN5Z3dpbiwgYXV0by1pbXBvcnQgZnVuY3Rpb25zIHRvIHByZXZlbnQgY29tcGlsYXRpb24gKi8KLQkJCS8qIGZhaWx1cmVzIHNpbWlsYXIgdG8gaHR0cDovL3B5dGhvbi5vcmcvZG9jL0ZBUS5odG1sIzMuMjQgKi8KLSMJCQlpZiAhZGVmaW5lZChfX0NZR1dJTl9fKQotIwkJCQlkZWZpbmUgUHlBUElfRlVOQyhSVFlQRSkgX19kZWNsc3BlYyhkbGxpbXBvcnQpIFJUWVBFCi0jCQkJZW5kaWYgLyogIV9fQ1lHV0lOX18gKi8KLSMJCQlkZWZpbmUgUHlBUElfREFUQShSVFlQRSkgZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQotCQkJLyogbW9kdWxlIGluaXQgZnVuY3Rpb25zIG91dHNpZGUgdGhlIGNvcmUgbXVzdCBiZSBleHBvcnRlZCAqLwotIwkJCWlmIGRlZmluZWQoX19jcGx1c3BsdXMpCi0jCQkJCWRlZmluZSBQeU1PRElOSVRfRlVOQyBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkCi0jCQkJZWxzZSAvKiBfX2NwbHVzcGx1cyAqLwotIwkJCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQKLSMJCQllbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotIwkJZW5kaWYgLyogUHlfQlVJTERfQ09SRSAqLwotIwllbmRpZiAvKiBIQVZFX0RFQ0xTUEVDICovCisjICAgICAgIGlmIGRlZmluZWQoSEFWRV9ERUNMU1BFQ19ETEwpCisjICAgICAgICAgICAgICAgaWZkZWYgUHlfQlVJTERfQ09SRQorIyAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5QVBJX0ZVTkMoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQorIyAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5QVBJX0RBVEEoUlRZUEUpIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKKyAgICAgICAgICAgIC8qIG1vZHVsZSBpbml0IGZ1bmN0aW9ucyBpbnNpZGUgdGhlIGNvcmUgbmVlZCBubyBleHRlcm5hbCBsaW5rYWdlICovCisgICAgICAgICAgICAvKiBleGNlcHQgZm9yIEN5Z3dpbiB0byBoYW5kbGUgZW1iZWRkaW5nIChGSVhNRTogQmVPUyB0b28/KSAqLworIyAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlNT0RJTklUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQKKyMgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogX19DWUdXSU5fXyAqLworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAorIyAgICAgICAgICAgICAgICAgICAgICAgZW5kaWYgLyogX19DWUdXSU5fXyAqLworIyAgICAgICAgICAgICAgIGVsc2UgLyogUHlfQlVJTERfQ09SRSAqLworICAgICAgICAgICAgLyogQnVpbGRpbmcgYW4gZXh0ZW5zaW9uIG1vZHVsZSwgb3IgYW4gZW1iZWRkZWQgc2l0dWF0aW9uICovCisgICAgICAgICAgICAvKiBwdWJsaWMgUHl0aG9uIGZ1bmN0aW9ucyBhbmQgZGF0YSBhcmUgaW1wb3J0ZWQgKi8KKyAgICAgICAgICAgIC8qIFVuZGVyIEN5Z3dpbiwgYXV0by1pbXBvcnQgZnVuY3Rpb25zIHRvIHByZXZlbnQgY29tcGlsYXRpb24gKi8KKyAgICAgICAgICAgIC8qIGZhaWx1cmVzIHNpbWlsYXIgdG8gaHR0cDovL3B5dGhvbi5vcmcvZG9jL0ZBUS5odG1sIzMuMjQgKi8KKyMgICAgICAgICAgICAgICAgICAgICAgIGlmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeUFQSV9GVU5DKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgUlRZUEUKKyMgICAgICAgICAgICAgICAgICAgICAgIGVuZGlmIC8qICFfX0NZR1dJTl9fICovCisjICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlBUElfREFUQShSVFlQRSkgZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQorICAgICAgICAgICAgLyogbW9kdWxlIGluaXQgZnVuY3Rpb25zIG91dHNpZGUgdGhlIGNvcmUgbXVzdCBiZSBleHBvcnRlZCAqLworIyAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5TU9ESU5JVF9GVU5DIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQKKyMgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogX19jcGx1c3BsdXMgKi8KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5TU9ESU5JVF9GVU5DIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkCisjICAgICAgICAgICAgICAgICAgICAgICBlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICAgICAgICAgIGVuZGlmIC8qIFB5X0JVSUxEX0NPUkUgKi8KKyMgICAgICAgZW5kaWYgLyogSEFWRV9ERUNMU1BFQyAqLwogI2VuZGlmIC8qIFB5X0VOQUJMRV9TSEFSRUQgKi8KIAogLyogSWYgbm8gZXh0ZXJuYWwgbGlua2FnZSBtYWNyb3MgZGVmaW5lZCBieSBub3csIGNyZWF0ZSBkZWZhdWx0cyAqLwogI2lmbmRlZiBQeUFQSV9GVU5DCi0jCWRlZmluZSBQeUFQSV9GVU5DKFJUWVBFKSBSVFlQRQorIyAgICAgICBkZWZpbmUgUHlBUElfRlVOQyhSVFlQRSkgUlRZUEUKICNlbmRpZgogI2lmbmRlZiBQeUFQSV9EQVRBCi0jCWRlZmluZSBQeUFQSV9EQVRBKFJUWVBFKSBleHRlcm4gUlRZUEUKKyMgICAgICAgZGVmaW5lIFB5QVBJX0RBVEEoUlRZUEUpIGV4dGVybiBSVFlQRQogI2VuZGlmCiAjaWZuZGVmIFB5TU9ESU5JVF9GVU5DCi0jCWlmIGRlZmluZWQoX19jcGx1c3BsdXMpCi0jCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgZXh0ZXJuICJDIiB2b2lkCi0jCWVsc2UgLyogX19jcGx1c3BsdXMgKi8KLSMJCWRlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCi0jCWVuZGlmIC8qIF9fY3BsdXNwbHVzICovCisjICAgICAgIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICAgICAgICAgICAgICAgZGVmaW5lIFB5TU9ESU5JVF9GVU5DIGV4dGVybiAiQyIgdm9pZAorIyAgICAgICBlbHNlIC8qIF9fY3BsdXNwbHVzICovCisjICAgICAgICAgICAgICAgZGVmaW5lIFB5TU9ESU5JVF9GVU5DIHZvaWQKKyMgICAgICAgZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KICNlbmRpZgogCiAvKiBEZXByZWNhdGVkIERMX0lNUE9SVCBhbmQgRExfRVhQT1JUIG1hY3JvcyAqLwogI2lmIGRlZmluZWQoUHlfRU5BQkxFX1NIQVJFRCkgJiYgZGVmaW5lZCAoSEFWRV9ERUNMU1BFQ19ETEwpCi0jCWlmIGRlZmluZWQoUHlfQlVJTERfQ09SRSkKLSMJCWRlZmluZSBETF9JTVBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQotIwkJZGVmaW5lIERMX0VYUE9SVChSVFlQRSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCi0jCWVsc2UKLSMJCWRlZmluZSBETF9JTVBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQotIwkJZGVmaW5lIERMX0VYUE9SVChSVFlQRSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCi0jCWVuZGlmCisjICAgICAgIGlmIGRlZmluZWQoUHlfQlVJTERfQ09SRSkKKyMgICAgICAgICAgICAgICBkZWZpbmUgRExfSU1QT1JUKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKKyMgICAgICAgICAgICAgICBkZWZpbmUgRExfRVhQT1JUKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKKyMgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgIGRlZmluZSBETF9JTVBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQorIyAgICAgICAgICAgICAgIGRlZmluZSBETF9FWFBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQorIyAgICAgICBlbmRpZgogI2VuZGlmCiAjaWZuZGVmIERMX0VYUE9SVAotIwlkZWZpbmUgRExfRVhQT1JUKFJUWVBFKSBSVFlQRQorIyAgICAgICBkZWZpbmUgRExfRVhQT1JUKFJUWVBFKSBSVFlQRQogI2VuZGlmCiAjaWZuZGVmIERMX0lNUE9SVAotIwlkZWZpbmUgRExfSU1QT1JUKFJUWVBFKSBSVFlQRQorIyAgICAgICBkZWZpbmUgRExfSU1QT1JUKFJUWVBFKSBSVFlQRQogI2VuZGlmCiAvKiBFbmQgb2YgZGVwcmVjYXRlZCBETF8qIG1hY3JvcyAqLwogCkBAIC02MzQsMjcgKzYzNCwyNyBAQAogCiAjaWYgMCAvKiBkaXNhYmxlZCBhbmQgcHJvYmFibHkgb2Jzb2xldGUgKi8KIAotI2lmbmRlZglGRF9TRVRTSVpFCi0jZGVmaW5lCUZEX1NFVFNJWkUJMjU2CisjaWZuZGVmIEZEX1NFVFNJWkUKKyNkZWZpbmUgRkRfU0VUU0laRSAgICAgIDI1NgogI2VuZGlmCiAKICNpZm5kZWYgRkRfU0VUCiAKIHR5cGVkZWYgbG9uZyBmZF9tYXNrOwogCi0jZGVmaW5lIE5GREJJVFMJKHNpemVvZihmZF9tYXNrKSAqIE5CQlkpCS8qIGJpdHMgcGVyIG1hc2sgKi8KKyNkZWZpbmUgTkZEQklUUyAoc2l6ZW9mKGZkX21hc2spICogTkJCWSkgICAgICAgIC8qIGJpdHMgcGVyIG1hc2sgKi8KICNpZm5kZWYgaG93bWFueQotI2RlZmluZQlob3dtYW55KHgsIHkpCSgoKHgpKygoeSktMSkpLyh5KSkKKyNkZWZpbmUgaG93bWFueSh4LCB5KSAgICgoKHgpKygoeSktMSkpLyh5KSkKICNlbmRpZiAvKiBob3dtYW55ICovCiAKLXR5cGVkZWYJc3RydWN0IGZkX3NldCB7Ci0JZmRfbWFzawlmZHNfYml0c1tob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpXTsKK3R5cGVkZWYgc3RydWN0IGZkX3NldCB7CisgICAgZmRfbWFzayAgICAgZmRzX2JpdHNbaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKV07CiB9IGZkX3NldDsKIAotI2RlZmluZQlGRF9TRVQobiwgcCkJKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCi0jZGVmaW5lCUZEX0NMUihuLCBwKQkoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJj0gfigxIDw8ICgobikgJSBORkRCSVRTKSkpCi0jZGVmaW5lCUZEX0lTU0VUKG4sIHApCSgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmICgxIDw8ICgobikgJSBORkRCSVRTKSkpCi0jZGVmaW5lIEZEX1pFUk8ocCkJbWVtc2V0KChjaGFyICopKHApLCAnXDAnLCBzaXplb2YoKihwKSkpCisjZGVmaW5lIEZEX1NFVChuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gfD0gKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyNkZWZpbmUgRkRfQ0xSKG4sIHApICAgICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmPSB+KDEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyNkZWZpbmUgRkRfSVNTRVQobiwgcCkgICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX1pFUk8ocCkgICAgICBtZW1zZXQoKGNoYXIgKikocCksICdcMCcsIHNpemVvZigqKHApKSkKIAogI2VuZGlmIC8qIEZEX1NFVCAqLwogCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5dGhvbnJ1bi5oIGIvSW5jbHVkZS9weXRob25ydW4uaAppbmRleCBiMmIzYWZkLi4wMzliNDk4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5dGhvbnJ1bi5oCisrKyBiL0luY2x1ZGUvcHl0aG9ucnVuLmgKQEAgLTE2LDcgKzE2LDcgQEAKICNkZWZpbmUgUHlDRl9PTkxZX0FTVCAweDA0MDAKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWludCBjZl9mbGFnczsgIC8qIGJpdG1hc2sgb2YgQ09feHh4IGZsYWdzIHJlbGV2YW50IHRvIGZ1dHVyZSAqLworICAgIGludCBjZl9mbGFnczsgIC8qIGJpdG1hc2sgb2YgQ09feHh4IGZsYWdzIHJlbGV2YW50IHRvIGZ1dHVyZSAqLwogfSBQeUNvbXBpbGVyRmxhZ3M7CiAKIFB5QVBJX0ZVTkModm9pZCkgUHlfU2V0UHJvZ3JhbU5hbWUoY2hhciAqKTsKQEAgLTM5LDMyICszOSwzMiBAQAogUHlBUElfRlVOQyhpbnQpIFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIFB5Q29tcGlsZXJGbGFncyAqKTsKIFB5QVBJX0ZVTkMoaW50KSBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwgUHlDb21waWxlckZsYWdzICopOwogCi1QeUFQSV9GVU5DKHN0cnVjdCBfbW9kICopIFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIAotCQkJCQkJIGludCwgUHlDb21waWxlckZsYWdzICpmbGFncywKK1B5QVBJX0ZVTkMoc3RydWN0IF9tb2QgKikgUHlQYXJzZXJfQVNURnJvbVN0cmluZyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqKTsKLVB5QVBJX0ZVTkMoc3RydWN0IF9tb2QgKikgUHlQYXJzZXJfQVNURnJvbUZpbGUoRklMRSAqLCBjb25zdCBjaGFyICosIGludCwgCi0JCQkJCSAgICAgICBjaGFyICosIGNoYXIgKiwKK1B5QVBJX0ZVTkMoc3RydWN0IF9tb2QgKikgUHlQYXJzZXJfQVNURnJvbUZpbGUoRklMRSAqLCBjb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBjaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqLCBpbnQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqKTsKICNkZWZpbmUgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmcoUywgQikgXAotICAgICAgICBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzKFMsIEIsIDApCisgICAgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhTLCBCLCAwKQogI2RlZmluZSBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGUoRlAsIFMsIEIpIFwKLSAgICAgICAgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoRlAsIFMsIEIsIDApCi1QeUFQSV9GVU5DKHN0cnVjdCBfbm9kZSAqKSBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKiwgaW50LCAKLQkJCQkJCQkgIGludCk7CisgICAgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoRlAsIFMsIEIsIDApCitQeUFQSV9GVU5DKHN0cnVjdCBfbm9kZSAqKSBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCk7CiBQeUFQSV9GVU5DKHN0cnVjdCBfbm9kZSAqKSBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJCQlpbnQsIGludCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgaW50KTsKIAotUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVJ1bl9TdHJpbmdGbGFncyhjb25zdCBjaGFyICosIGludCwgUHlPYmplY3QgKiwgCi0JCQkJCSBQeU9iamVjdCAqLCBQeUNvbXBpbGVyRmxhZ3MgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5UnVuX1N0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKiwgaW50LCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeUNvbXBpbGVyRmxhZ3MgKik7CiAKLVB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlSdW5fRmlsZUV4RmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIGludCwgCi0JCQkJCSBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBpbnQsIAotCQkJCQkgUHlDb21waWxlckZsYWdzICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVJ1bl9GaWxlRXhGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqKTsKIAogI2RlZmluZSBQeV9Db21waWxlU3RyaW5nKHN0ciwgcCwgcykgUHlfQ29tcGlsZVN0cmluZ0ZsYWdzKHN0ciwgcCwgcywgTlVMTCkKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlfQ29tcGlsZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQsCi0JCQkJCSAgICAgUHlDb21waWxlckZsYWdzICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICopOwogUHlBUElfRlVOQyhzdHJ1Y3Qgc3ltdGFibGUgKikgUHlfU3ltdGFibGVTdHJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CiAKIFB5QVBJX0ZVTkModm9pZCkgUHlFcnJfUHJpbnQodm9pZCk7CkBAIC04NCwyMCArODQsMjAgQEAKICNkZWZpbmUgUHlSdW5fU3RyaW5nKHN0ciwgcywgZywgbCkgUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBzLCBnLCBsLCBOVUxMKQogI2RlZmluZSBQeVJ1bl9BbnlGaWxlKGZwLCBuYW1lKSBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgTlVMTCkKICNkZWZpbmUgUHlSdW5fQW55RmlsZUV4KGZwLCBuYW1lLCBjbG9zZWl0KSBcCi0JUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIGNsb3NlaXQsIE5VTEwpCisgICAgUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIGNsb3NlaXQsIE5VTEwpCiAjZGVmaW5lIFB5UnVuX0FueUZpbGVGbGFncyhmcCwgbmFtZSwgZmxhZ3MpIFwKLQlQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgZmxhZ3MpCisgICAgUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIGZsYWdzKQogI2RlZmluZSBQeVJ1bl9TaW1wbGVTdHJpbmcocykgUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MocywgTlVMTCkKICNkZWZpbmUgUHlSdW5fU2ltcGxlRmlsZShmLCBwKSBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmLCBwLCAwLCBOVUxMKQogI2RlZmluZSBQeVJ1bl9TaW1wbGVGaWxlRXgoZiwgcCwgYykgUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgYywgTlVMTCkKICNkZWZpbmUgUHlSdW5fSW50ZXJhY3RpdmVPbmUoZiwgcCkgUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhmLCBwLCBOVUxMKQogI2RlZmluZSBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3AoZiwgcCkgUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoZiwgcCwgTlVMTCkKICNkZWZpbmUgUHlSdW5fRmlsZShmcCwgcCwgcywgZywgbCkgXAotICAgICAgICBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgTlVMTCkKKyAgICBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgTlVMTCkKICNkZWZpbmUgUHlSdW5fRmlsZUV4KGZwLCBwLCBzLCBnLCBsLCBjKSBcCi0gICAgICAgIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCBjLCBOVUxMKQorICAgIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCBjLCBOVUxMKQogI2RlZmluZSBQeVJ1bl9GaWxlRmxhZ3MoZnAsIHAsIHMsIGcsIGwsIGZsYWdzKSBcCi0gICAgICAgIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCAwLCBmbGFncykKKyAgICBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgZmxhZ3MpCiAKIC8qIEluIGdldHBhdGguYyAqLwogUHlBUElfRlVOQyhjaGFyICopIFB5X0dldFByb2dyYW1GdWxsUGF0aCh2b2lkKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvc2V0b2JqZWN0LmggYi9JbmNsdWRlL3NldG9iamVjdC5oCmluZGV4IDkyYWRmNTIuLjUyYjA3ZDUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvc2V0b2JqZWN0LmgKKysrIGIvSW5jbHVkZS9zZXRvYmplY3QuaApAQCAtMjIsOCArMjIsOCBAQAogI2RlZmluZSBQeVNldF9NSU5TSVpFIDgKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcgaGFzaDsgICAgICAvKiBjYWNoZWQgaGFzaCBjb2RlIGZvciB0aGUgZW50cnkga2V5ICovCi0JUHlPYmplY3QgKmtleTsKKyAgICBsb25nIGhhc2g7ICAgICAgLyogY2FjaGVkIGhhc2ggY29kZSBmb3IgdGhlIGVudHJ5IGtleSAqLworICAgIFB5T2JqZWN0ICprZXk7CiB9IHNldGVudHJ5OwogCiAKQEAgLTMzLDI3ICszMywyNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBfc2V0b2JqZWN0IFB5U2V0T2JqZWN0Owogc3RydWN0IF9zZXRvYmplY3QgewotCVB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdF9IRUFECiAKLQlQeV9zc2l6ZV90IGZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KLQlQeV9zc2l6ZV90IHVzZWQ7ICAvKiAjIEFjdGl2ZSAqLworICAgIFB5X3NzaXplX3QgZmlsbDsgIC8qICMgQWN0aXZlICsgIyBEdW1teSAqLworICAgIFB5X3NzaXplX3QgdXNlZDsgIC8qICMgQWN0aXZlICovCiAKLQkvKiBUaGUgdGFibGUgY29udGFpbnMgbWFzayArIDEgc2xvdHMsIGFuZCB0aGF0J3MgYSBwb3dlciBvZiAyLgotCSAqIFdlIHN0b3JlIHRoZSBtYXNrIGluc3RlYWQgb2YgdGhlIHNpemUgYmVjYXVzZSB0aGUgbWFzayBpcyBtb3JlCi0JICogZnJlcXVlbnRseSBuZWVkZWQuCi0JICovCi0JUHlfc3NpemVfdCBtYXNrOworICAgIC8qIFRoZSB0YWJsZSBjb250YWlucyBtYXNrICsgMSBzbG90cywgYW5kIHRoYXQncyBhIHBvd2VyIG9mIDIuCisgICAgICogV2Ugc3RvcmUgdGhlIG1hc2sgaW5zdGVhZCBvZiB0aGUgc2l6ZSBiZWNhdXNlIHRoZSBtYXNrIGlzIG1vcmUKKyAgICAgKiBmcmVxdWVudGx5IG5lZWRlZC4KKyAgICAgKi8KKyAgICBQeV9zc2l6ZV90IG1hc2s7CiAKLQkvKiB0YWJsZSBwb2ludHMgdG8gc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCi0JICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQotCSAqIHNhdmVzIHJlcGVhdGVkIHJ1bnRpbWUgbnVsbC10ZXN0cy4KLQkgKi8KLQlzZXRlbnRyeSAqdGFibGU7Ci0Jc2V0ZW50cnkgKigqbG9va3VwKShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCk7Ci0Jc2V0ZW50cnkgc21hbGx0YWJsZVtQeVNldF9NSU5TSVpFXTsKKyAgICAvKiB0YWJsZSBwb2ludHMgdG8gc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCisgICAgICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQorICAgICAqIHNhdmVzIHJlcGVhdGVkIHJ1bnRpbWUgbnVsbC10ZXN0cy4KKyAgICAgKi8KKyAgICBzZXRlbnRyeSAqdGFibGU7CisgICAgc2V0ZW50cnkgKigqbG9va3VwKShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCk7CisgICAgc2V0ZW50cnkgc21hbGx0YWJsZVtQeVNldF9NSU5TSVpFXTsKIAotCWxvbmcgaGFzaDsJCS8qIG9ubHkgdXNlZCBieSBmcm96ZW5zZXQgb2JqZWN0cyAqLwotCVB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsJLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KKyAgICBsb25nIGhhc2g7ICAgICAgICAgICAgICAgICAgLyogb25seSB1c2VkIGJ5IGZyb3plbnNldCBvYmplY3RzICovCisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAgICAgIC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCiB9OwogCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTZXRfVHlwZTsKQEAgLTY4LDE3ICs2OCwxNyBAQAogCiAjZGVmaW5lIFB5RnJvemVuU2V0X0NoZWNrRXhhY3Qob2IpIChQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSkKICNkZWZpbmUgUHlBbnlTZXRfQ2hlY2tFeGFjdChvYikgXAotCShQeV9UWVBFKG9iKSA9PSAmUHlTZXRfVHlwZSB8fCBQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSkKKyAgICAoUHlfVFlQRShvYikgPT0gJlB5U2V0X1R5cGUgfHwgUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUpCiAjZGVmaW5lIFB5QW55U2V0X0NoZWNrKG9iKSBcCi0JKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFB5X1RZUEUob2IpID09ICZQeUZyb3plblNldF9UeXBlIHx8IFwKLQkgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYiksICZQeVNldF9UeXBlKSB8fCBcCi0JICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlGcm96ZW5TZXRfVHlwZSkpCisgICAgKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFB5X1RZUEUob2IpID09ICZQeUZyb3plblNldF9UeXBlIHx8IFwKKyAgICAgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYiksICZQeVNldF9UeXBlKSB8fCBcCisgICAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlGcm96ZW5TZXRfVHlwZSkpCiAjZGVmaW5lIFB5U2V0X0NoZWNrKG9iKSBcCi0JKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFwKLQlQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlTZXRfVHlwZSkpCisgICAgKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFwKKyAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlTZXRfVHlwZSkpCiAjZGVmaW5lICAgUHlGcm96ZW5TZXRfQ2hlY2sob2IpIFwKLQkoUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUgfHwgXAotCSAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgJlB5RnJvemVuU2V0X1R5cGUpKQorICAgIChQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSB8fCBcCisgICAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlGcm96ZW5TZXRfVHlwZSkpCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXRfTmV3KFB5T2JqZWN0ICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZyb3plblNldF9OZXcoUHlPYmplY3QgKik7CmRpZmYgLS1naXQgYS9JbmNsdWRlL3N0cmluZ29iamVjdC5oIGIvSW5jbHVkZS9zdHJpbmdvYmplY3QuaAppbmRleCBkOWYxODQwLi5jMGExZmNhIDEwMDY0NAotLS0gYS9JbmNsdWRlL3N0cmluZ29iamVjdC5oCisrKyBiL0luY2x1ZGUvc3RyaW5nb2JqZWN0LmgKQEAgLTYyLDkgKzYyLDkgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90KTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRnJvbVN0cmluZyhjb25zdCBjaGFyICopOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19Gcm9tRm9ybWF0Vihjb25zdCBjaGFyKiwgdmFfbGlzdCkKLQkJCQlQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAxLCAwKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAxLCAwKSkpOwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19Gcm9tRm9ybWF0KGNvbnN0IGNoYXIqLCAuLi4pCi0JCQkJUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTdHJpbmdfU2l6ZShQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoY2hhciAqKSBQeVN0cmluZ19Bc1N0cmluZyhQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfUmVwcihQeU9iamVjdCAqLCBpbnQpOwpAQCAtNzQsMTAgKzc0LDEwIEBACiBQeUFQSV9GVU5DKGludCkgX1B5U3RyaW5nX0VxKFB5T2JqZWN0ICosIFB5T2JqZWN0Kik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U3RyaW5nX0Zvcm1hdChQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5U3RyaW5nX0Zvcm1hdExvbmcoUHlPYmplY3QqLCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBjaGFyKiosIGludCopOwotUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LCAKLQkJCQkJCSAgIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwKLQkJCQkJCSAgIGNvbnN0IGNoYXIgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgY2hhcioqLCBpbnQqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRGVjb2RlRXNjYXBlKGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKik7CiAKIFB5QVBJX0ZVTkModm9pZCkgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZShQeU9iamVjdCAqKik7CiBQeUFQSV9GVU5DKHZvaWQpIFB5U3RyaW5nX0ludGVybkltbW9ydGFsKFB5T2JqZWN0ICoqKTsKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKLS8qIEVuY29kZXMgYSBjaGFyIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSBhbmQgcmV0dXJucyBhIAorLyogRW5jb2RlcyBhIGNoYXIgYnVmZmVyIG9mIHRoZSBnaXZlbiBzaXplIGFuZCByZXR1cm5zIGEKICAgIFB5dGhvbiBvYmplY3QuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVN0cmluZ19FbmNvZGUoCkBAIC0xMTcsNTAgKzExNyw1MCBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKLS8qIEVuY29kZXMgYSBzdHJpbmcgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgUHl0aG9uIAorLyogRW5jb2RlcyBhIHN0cmluZyBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBQeXRob24KICAgIG9iamVjdC4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5U3RyaW5nX0FzRW5jb2RlZE9iamVjdCgKLSAgICBQeU9iamVjdCAqc3RyLAkgCS8qIHN0cmluZyBvYmplY3QgKi8KLSAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIHN0cmluZyBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAvKiBFbmNvZGVzIGEgc3RyaW5nIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiBzdHJpbmcKLSAgIG9iamVjdC4gICAKLSAgIAorICAgb2JqZWN0LgorCiAgICBJZiB0aGUgY29kZWMgcmV0dXJucyBhbiBVbmljb2RlIG9iamVjdCwgdGhlIG9iamVjdCBpcyBjb252ZXJ0ZWQKICAgIGJhY2sgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcuCiAKICAgIERFUFJFQ0FURUQgLSB1c2UgUHlTdHJpbmdfQXNFbmNvZGVkT2JqZWN0KCkgaW5zdGVhZC4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5U3RyaW5nX0FzRW5jb2RlZFN0cmluZygKLSAgICBQeU9iamVjdCAqc3RyLAkgCS8qIHN0cmluZyBvYmplY3QgKi8KLSAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIHN0cmluZyBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCi0vKiBEZWNvZGVzIGEgc3RyaW5nIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiAKKy8qIERlY29kZXMgYSBzdHJpbmcgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgUHl0aG9uCiAgICBvYmplY3QuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVN0cmluZ19Bc0RlY29kZWRPYmplY3QoCi0gICAgUHlPYmplY3QgKnN0ciwJIAkvKiBzdHJpbmcgb2JqZWN0ICovCi0gICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCS8qIGVuY29kaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIFB5T2JqZWN0ICpzdHIsICAgICAgICAgICAgICAvKiBzdHJpbmcgb2JqZWN0ICovCisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICAgICAgIC8qIGVuY29kaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogLyogRGVjb2RlcyBhIHN0cmluZyBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nCi0gICBvYmplY3QuICAKLSAgIAorICAgb2JqZWN0LgorCiAgICBJZiB0aGUgY29kZWMgcmV0dXJucyBhbiBVbmljb2RlIG9iamVjdCwgdGhlIG9iamVjdCBpcyBjb252ZXJ0ZWQKICAgIGJhY2sgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcuCiAKICAgIERFUFJFQ0FURUQgLSB1c2UgUHlTdHJpbmdfQXNEZWNvZGVkT2JqZWN0KCkgaW5zdGVhZC4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5U3RyaW5nX0FzRGVjb2RlZFN0cmluZygKLSAgICBQeU9iamVjdCAqc3RyLAkgCS8qIHN0cmluZyBvYmplY3QgKi8KLSAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIHN0cmluZyBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAvKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFsIGRhdGEgYnVmZmVyIGFuZCBzaXplIG9mIGEgc3RyaW5nCkBAIC0xNzAsMTEgKzE3MCwxMSBAQAogICAgY2F1c2UgYW4gZXhjZXB0aW9uKS4gICovCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoCi0gICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiwJLyogc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0ICovCi0gICAgcmVnaXN0ZXIgY2hhciAqKnMsCQkvKiBwb2ludGVyIHRvIGJ1ZmZlciB2YXJpYWJsZSAqLwotICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgKmxlbgkvKiBwb2ludGVyIHRvIGxlbmd0aCB2YXJpYWJsZSBvciBOVUxMCi0JCQkJICAgKG9ubHkgcG9zc2libGUgZm9yIDAtdGVybWluYXRlZAotCQkJCSAgIHN0cmluZ3MpICovCisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiwgICAgIC8qIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCAqLworICAgIHJlZ2lzdGVyIGNoYXIgKipzLCAgICAgICAgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciB2YXJpYWJsZSAqLworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgKmxlbiAgICAvKiBwb2ludGVyIHRvIGxlbmd0aCB2YXJpYWJsZSBvciBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IHBvc3NpYmxlIGZvciAwLXRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncykgKi8KICAgICApOwogCiAvKiBVc2luZyB0aGUgY3VycmVudCBsb2NhbGUsIGluc2VydCB0aGUgdGhvdXNhbmRzIGdyb3VwaW5nCkBAIC0xODIsMTcgKzE4MiwxNyBAQAogICAgc2VlIE9iamVjdHMvc3RyaW5nbGliL2xvY2FsZXV0aWwuaCAqLwogCiBQeUFQSV9GVU5DKGludCkgX1B5U3RyaW5nX0luc2VydFRob3VzYW5kc0dyb3VwaW5nKGNoYXIgKmJ1ZmZlciwKLQkJCQkJCSAgUHlfc3NpemVfdCBuX2J1ZmZlciwKLQkJCQkJCSAgUHlfc3NpemVfdCBuX2RpZ2l0cywKLQkJCQkJCSAgUHlfc3NpemVfdCBidWZfc2l6ZSwKLQkJCQkJCSAgUHlfc3NpemVfdCAqY291bnQsCi0JCQkJCQkgIGludCBhcHBlbmRfemVyb19jaGFyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuX2RpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcHBlbmRfemVyb19jaGFyKTsKIAogLyogRm9ybWF0IHRoZSBvYmplY3QgYmFzZWQgb24gdGhlIGZvcm1hdF9zcGVjLCBhcyBkZWZpbmVkIGluIFBFUCAzMTAxCiAgICAoQWR2YW5jZWQgU3RyaW5nIEZvcm1hdHRpbmcpLiAqLwogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlCeXRlc19Gb3JtYXRBZHZhbmNlZChQeU9iamVjdCAqb2JqLAotCQkJCQkgICAgICAgY2hhciAqZm9ybWF0X3NwZWMsCi0JCQkJCSAgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9zdHJ1Y3RtZW1iZXIuaCBiL0luY2x1ZGUvc3RydWN0bWVtYmVyLmgKaW5kZXggMWYyNmI0Mi4uZmU1YjQ0ZSAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zdHJ1Y3RtZW1iZXIuaAorKysgYi9JbmNsdWRlL3N0cnVjdG1lbWJlci5oCkBAIC0yNiw1MCArMjYsNTAgQEAKICAgIHBvaW50ZXIgaXMgTlVMTC4gKi8KIAogc3RydWN0IG1lbWJlcmxpc3QgewotCS8qIE9ic29sZXRlIHZlcnNpb24sIGZvciBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KLQljaGFyICpuYW1lOwotCWludCB0eXBlOwotCWludCBvZmZzZXQ7Ci0JaW50IGZsYWdzOworICAgIC8qIE9ic29sZXRlIHZlcnNpb24sIGZvciBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyAgICBjaGFyICpuYW1lOworICAgIGludCB0eXBlOworICAgIGludCBvZmZzZXQ7CisgICAgaW50IGZsYWdzOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgUHlNZW1iZXJEZWYgewotCS8qIEN1cnJlbnQgdmVyc2lvbiwgdXNlIHRoaXMgKi8KLQljaGFyICpuYW1lOwotCWludCB0eXBlOwotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCWludCBmbGFnczsKLQljaGFyICpkb2M7CisgICAgLyogQ3VycmVudCB2ZXJzaW9uLCB1c2UgdGhpcyAqLworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IHR5cGU7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgaW50IGZsYWdzOworICAgIGNoYXIgKmRvYzsKIH0gUHlNZW1iZXJEZWY7CiAKIC8qIFR5cGVzICovCi0jZGVmaW5lIFRfU0hPUlQJCTAKLSNkZWZpbmUgVF9JTlQJCTEKLSNkZWZpbmUgVF9MT05HCQkyCi0jZGVmaW5lIFRfRkxPQVQJCTMKLSNkZWZpbmUgVF9ET1VCTEUJNAotI2RlZmluZSBUX1NUUklORwk1Ci0jZGVmaW5lIFRfT0JKRUNUCTYKKyNkZWZpbmUgVF9TSE9SVCAgICAgICAgIDAKKyNkZWZpbmUgVF9JTlQgICAgICAgICAgIDEKKyNkZWZpbmUgVF9MT05HICAgICAgICAgIDIKKyNkZWZpbmUgVF9GTE9BVCAgICAgICAgIDMKKyNkZWZpbmUgVF9ET1VCTEUgICAgICAgIDQKKyNkZWZpbmUgVF9TVFJJTkcgICAgICAgIDUKKyNkZWZpbmUgVF9PQkpFQ1QgICAgICAgIDYKIC8qIFhYWCB0aGUgb3JkZXJpbmcgaGVyZSBpcyB3ZWlyZCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgKi8KLSNkZWZpbmUgVF9DSEFSCQk3CS8qIDEtY2hhcmFjdGVyIHN0cmluZyAqLwotI2RlZmluZSBUX0JZVEUJCTgJLyogOC1iaXQgc2lnbmVkIGludCAqLworI2RlZmluZSBUX0NIQVIgICAgICAgICAgNyAgICAgICAvKiAxLWNoYXJhY3RlciBzdHJpbmcgKi8KKyNkZWZpbmUgVF9CWVRFICAgICAgICAgIDggICAgICAgLyogOC1iaXQgc2lnbmVkIGludCAqLwogLyogdW5zaWduZWQgdmFyaWFudHM6ICovCi0jZGVmaW5lIFRfVUJZVEUJCTkKLSNkZWZpbmUgVF9VU0hPUlQJMTAKLSNkZWZpbmUgVF9VSU5UCQkxMQotI2RlZmluZSBUX1VMT05HCQkxMgorI2RlZmluZSBUX1VCWVRFICAgICAgICAgOQorI2RlZmluZSBUX1VTSE9SVCAgICAgICAgMTAKKyNkZWZpbmUgVF9VSU5UICAgICAgICAgIDExCisjZGVmaW5lIFRfVUxPTkcgICAgICAgICAxMgogCiAvKiBBZGRlZCBieSBKYWNrOiBzdHJpbmdzIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlICovCi0jZGVmaW5lIFRfU1RSSU5HX0lOUExBQ0UJMTMKKyNkZWZpbmUgVF9TVFJJTkdfSU5QTEFDRSAgICAgICAgMTMKIAogLyogQWRkZWQgYnkgTGlsbG86IGJvb2xzIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlIChhc3N1bWVkIGNoYXIpICovCi0jZGVmaW5lIFRfQk9PTAkJMTQKKyNkZWZpbmUgVF9CT09MICAgICAgICAgIDE0CiAKLSNkZWZpbmUgVF9PQkpFQ1RfRVgJMTYJLyogTGlrZSBUX09CSkVDVCwgYnV0IHJhaXNlcyBBdHRyaWJ1dGVFcnJvcgotCQkJCSAgIHdoZW4gdGhlIHZhbHVlIGlzIE5VTEwsIGluc3RlYWQgb2YKLQkJCQkgICBjb252ZXJ0aW5nIHRvIE5vbmUuICovCisjZGVmaW5lIFRfT0JKRUNUX0VYICAgICAxNiAgICAgIC8qIExpa2UgVF9PQkpFQ1QsIGJ1dCByYWlzZXMgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB2YWx1ZSBpcyBOVUxMLCBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgY29udmVydGluZyB0byBOb25lLiAqLwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0jZGVmaW5lIFRfTE9OR0xPTkcgICAgICAxNyAgCisjZGVmaW5lIFRfTE9OR0xPTkcgICAgICAxNwogI2RlZmluZSBUX1VMT05HTE9ORyAgICAgIDE4CiAjZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KIApAQCAtNzcsMTEgKzc3LDExIEBACiAKIAogLyogRmxhZ3MgKi8KLSNkZWZpbmUgUkVBRE9OTFkJMQotI2RlZmluZSBSTwkJUkVBRE9OTFkJCS8qIFNob3J0aGFuZCAqLwotI2RlZmluZSBSRUFEX1JFU1RSSUNURUQJMgorI2RlZmluZSBSRUFET05MWSAgICAgICAgMQorI2RlZmluZSBSTyAgICAgICAgICAgICAgUkVBRE9OTFkgICAgICAgICAgICAgICAgLyogU2hvcnRoYW5kICovCisjZGVmaW5lIFJFQURfUkVTVFJJQ1RFRCAyCiAjZGVmaW5lIFBZX1dSSVRFX1JFU1RSSUNURUQgNAotI2RlZmluZSBSRVNUUklDVEVECShSRUFEX1JFU1RSSUNURUQgfCBQWV9XUklURV9SRVNUUklDVEVEKQorI2RlZmluZSBSRVNUUklDVEVEICAgICAgKFJFQURfUkVTVFJJQ1RFRCB8IFBZX1dSSVRFX1JFU1RSSUNURUQpCiAKIAogLyogT2Jzb2xldGUgQVBJLCBmb3IgYmluYXJ5IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3N5bXRhYmxlLmggYi9JbmNsdWRlL3N5bXRhYmxlLmgKaW5kZXggMzJiNGViZi4uNjU3NzViMCAxMDA2NDQKLS0tIGEvSW5jbHVkZS9zeW10YWJsZS5oCisrKyBiL0luY2x1ZGUvc3ltdGFibGUuaApAQCAtMTEsNDAgKzExLDQwIEBACiBzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5OwogCiBzdHJ1Y3Qgc3ltdGFibGUgewotCWNvbnN0IGNoYXIgKnN0X2ZpbGVuYW1lOyAvKiBuYW1lIG9mIGZpbGUgYmVpbmcgY29tcGlsZWQgKi8KLQlzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5ICpzdF9jdXI7IC8qIGN1cnJlbnQgc3ltYm9sIHRhYmxlIGVudHJ5ICovCi0Jc3RydWN0IF9zeW10YWJsZV9lbnRyeSAqc3RfdG9wOyAvKiBtb2R1bGUgZW50cnkgKi8KLQlQeU9iamVjdCAqc3Rfc3ltYm9sczsgICAgLyogZGljdGlvbmFyeSBvZiBzeW1ib2wgdGFibGUgZW50cmllcyAqLwotICAgICAgICBQeU9iamVjdCAqc3Rfc3RhY2s7ICAgICAgLyogc3RhY2sgb2YgbmFtZXNwYWNlIGluZm8gKi8KLQlQeU9iamVjdCAqc3RfZ2xvYmFsOyAgICAgLyogYm9ycm93ZWQgcmVmIHRvIE1PRFVMRSBpbiBzdF9zeW1ib2xzICovCi0JaW50IHN0X25ibG9ja3M7ICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KLQlQeU9iamVjdCAqc3RfcHJpdmF0ZTsgICAgICAgIC8qIG5hbWUgb2YgY3VycmVudCBjbGFzcyBvciBOVUxMICovCi0gICAgICAgIGludCBzdF90bXBuYW1lOyAgICAgICAgICAvKiB0ZW1wb3JhcnkgbmFtZSBjb3VudGVyICovCi0JUHlGdXR1cmVGZWF0dXJlcyAqc3RfZnV0dXJlOyAvKiBtb2R1bGUncyBmdXR1cmUgZmVhdHVyZXMgKi8KKyAgICBjb25zdCBjaGFyICpzdF9maWxlbmFtZTsgLyogbmFtZSBvZiBmaWxlIGJlaW5nIGNvbXBpbGVkICovCisgICAgc3RydWN0IF9zeW10YWJsZV9lbnRyeSAqc3RfY3VyOyAvKiBjdXJyZW50IHN5bWJvbCB0YWJsZSBlbnRyeSAqLworICAgIHN0cnVjdCBfc3ltdGFibGVfZW50cnkgKnN0X3RvcDsgLyogbW9kdWxlIGVudHJ5ICovCisgICAgUHlPYmplY3QgKnN0X3N5bWJvbHM7ICAgIC8qIGRpY3Rpb25hcnkgb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMgKi8KKyAgICBQeU9iamVjdCAqc3Rfc3RhY2s7ICAgICAgLyogc3RhY2sgb2YgbmFtZXNwYWNlIGluZm8gKi8KKyAgICBQeU9iamVjdCAqc3RfZ2xvYmFsOyAgICAgLyogYm9ycm93ZWQgcmVmIHRvIE1PRFVMRSBpbiBzdF9zeW1ib2xzICovCisgICAgaW50IHN0X25ibG9ja3M7ICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICBQeU9iamVjdCAqc3RfcHJpdmF0ZTsgICAgICAgIC8qIG5hbWUgb2YgY3VycmVudCBjbGFzcyBvciBOVUxMICovCisgICAgaW50IHN0X3RtcG5hbWU7ICAgICAgICAgIC8qIHRlbXBvcmFyeSBuYW1lIGNvdW50ZXIgKi8KKyAgICBQeUZ1dHVyZUZlYXR1cmVzICpzdF9mdXR1cmU7IC8qIG1vZHVsZSdzIGZ1dHVyZSBmZWF0dXJlcyAqLwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKnN0ZV9pZDsgICAgICAgIC8qIGludDoga2V5IGluIHN0X3N5bWJvbHMgKi8KLQlQeU9iamVjdCAqc3RlX3N5bWJvbHM7ICAgLyogZGljdDogbmFtZSB0byBmbGFncyAqLwotCVB5T2JqZWN0ICpzdGVfbmFtZTsgICAgICAvKiBzdHJpbmc6IG5hbWUgb2YgYmxvY2sgKi8KLQlQeU9iamVjdCAqc3RlX3Zhcm5hbWVzOyAgLyogbGlzdCBvZiB2YXJpYWJsZSBuYW1lcyAqLwotCVB5T2JqZWN0ICpzdGVfY2hpbGRyZW47ICAvKiBsaXN0IG9mIGNoaWxkIGlkcyAqLwotCV9QeV9ibG9ja190eSBzdGVfdHlwZTsgICAvKiBtb2R1bGUsIGNsYXNzLCBvciBmdW5jdGlvbiAqLwotCWludCBzdGVfdW5vcHRpbWl6ZWQ7ICAgICAvKiBmYWxzZSBpZiBuYW1lc3BhY2UgaXMgb3B0aW1pemVkICovCi0JaW50IHN0ZV9uZXN0ZWQ7ICAgICAgLyogdHJ1ZSBpZiBibG9jayBpcyBuZXN0ZWQgKi8KLQl1bnNpZ25lZCBzdGVfZnJlZSA6IDE7ICAgICAgICAvKiB0cnVlIGlmIGJsb2NrIGhhcyBmcmVlIHZhcmlhYmxlcyAqLwotCXVuc2lnbmVkIHN0ZV9jaGlsZF9mcmVlIDogMTsgIC8qIHRydWUgaWYgYSBjaGlsZCBibG9jayBoYXMgZnJlZSB2YXJzLAotCQkJCSAgICAgICAgIGluY2x1ZGluZyBmcmVlIHJlZnMgdG8gZ2xvYmFscyAqLwotCXVuc2lnbmVkIHN0ZV9nZW5lcmF0b3IgOiAxOyAgIC8qIHRydWUgaWYgbmFtZXNwYWNlIGlzIGEgZ2VuZXJhdG9yICovCi0JdW5zaWduZWQgc3RlX3ZhcmFyZ3MgOiAxOyAgICAgLyogdHJ1ZSBpZiBibG9jayBoYXMgdmFyYXJncyAqLwotCXVuc2lnbmVkIHN0ZV92YXJrZXl3b3JkcyA6IDE7IC8qIHRydWUgaWYgYmxvY2sgaGFzIHZhcmtleXdvcmRzICovCi0JdW5zaWduZWQgc3RlX3JldHVybnNfdmFsdWUgOiAxOyAgLyogdHJ1ZSBpZiBuYW1lc3BhY2UgdXNlcyByZXR1cm4gd2l0aAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGFyZ3VtZW50ICovCi0JaW50IHN0ZV9saW5lbm87ICAgICAgICAgIC8qIGZpcnN0IGxpbmUgb2YgYmxvY2sgKi8KLQlpbnQgc3RlX29wdF9saW5lbm87ICAgICAgLyogbGluZW5vIG9mIGxhc3QgZXhlYyBvciBpbXBvcnQgKiAqLwotCWludCBzdGVfdG1wbmFtZTsgICAgICAgICAvKiBjb3VudGVyIGZvciBsaXN0Y29tcCB0ZW1wIHZhcnMgKi8KLQlzdHJ1Y3Qgc3ltdGFibGUgKnN0ZV90YWJsZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnN0ZV9pZDsgICAgICAgIC8qIGludDoga2V5IGluIHN0X3N5bWJvbHMgKi8KKyAgICBQeU9iamVjdCAqc3RlX3N5bWJvbHM7ICAgLyogZGljdDogbmFtZSB0byBmbGFncyAqLworICAgIFB5T2JqZWN0ICpzdGVfbmFtZTsgICAgICAvKiBzdHJpbmc6IG5hbWUgb2YgYmxvY2sgKi8KKyAgICBQeU9iamVjdCAqc3RlX3Zhcm5hbWVzOyAgLyogbGlzdCBvZiB2YXJpYWJsZSBuYW1lcyAqLworICAgIFB5T2JqZWN0ICpzdGVfY2hpbGRyZW47ICAvKiBsaXN0IG9mIGNoaWxkIGlkcyAqLworICAgIF9QeV9ibG9ja190eSBzdGVfdHlwZTsgICAvKiBtb2R1bGUsIGNsYXNzLCBvciBmdW5jdGlvbiAqLworICAgIGludCBzdGVfdW5vcHRpbWl6ZWQ7ICAgICAvKiBmYWxzZSBpZiBuYW1lc3BhY2UgaXMgb3B0aW1pemVkICovCisgICAgaW50IHN0ZV9uZXN0ZWQ7ICAgICAgLyogdHJ1ZSBpZiBibG9jayBpcyBuZXN0ZWQgKi8KKyAgICB1bnNpZ25lZCBzdGVfZnJlZSA6IDE7ICAgICAgICAvKiB0cnVlIGlmIGJsb2NrIGhhcyBmcmVlIHZhcmlhYmxlcyAqLworICAgIHVuc2lnbmVkIHN0ZV9jaGlsZF9mcmVlIDogMTsgIC8qIHRydWUgaWYgYSBjaGlsZCBibG9jayBoYXMgZnJlZSB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyBmcmVlIHJlZnMgdG8gZ2xvYmFscyAqLworICAgIHVuc2lnbmVkIHN0ZV9nZW5lcmF0b3IgOiAxOyAgIC8qIHRydWUgaWYgbmFtZXNwYWNlIGlzIGEgZ2VuZXJhdG9yICovCisgICAgdW5zaWduZWQgc3RlX3ZhcmFyZ3MgOiAxOyAgICAgLyogdHJ1ZSBpZiBibG9jayBoYXMgdmFyYXJncyAqLworICAgIHVuc2lnbmVkIHN0ZV92YXJrZXl3b3JkcyA6IDE7IC8qIHRydWUgaWYgYmxvY2sgaGFzIHZhcmtleXdvcmRzICovCisgICAgdW5zaWduZWQgc3RlX3JldHVybnNfdmFsdWUgOiAxOyAgLyogdHJ1ZSBpZiBuYW1lc3BhY2UgdXNlcyByZXR1cm4gd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGFyZ3VtZW50ICovCisgICAgaW50IHN0ZV9saW5lbm87ICAgICAgICAgIC8qIGZpcnN0IGxpbmUgb2YgYmxvY2sgKi8KKyAgICBpbnQgc3RlX29wdF9saW5lbm87ICAgICAgLyogbGluZW5vIG9mIGxhc3QgZXhlYyBvciBpbXBvcnQgKiAqLworICAgIGludCBzdGVfdG1wbmFtZTsgICAgICAgICAvKiBjb3VudGVyIGZvciBsaXN0Y29tcCB0ZW1wIHZhcnMgKi8KKyAgICBzdHJ1Y3Qgc3ltdGFibGUgKnN0ZV90YWJsZTsKIH0gUHlTVEVudHJ5T2JqZWN0OwogCiBQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTVEVudHJ5X1R5cGU7CkBAIC01Myw4ICs1Myw4IEBACiAKIFB5QVBJX0ZVTkMoaW50KSBQeVNUX0dldFNjb3BlKFB5U1RFbnRyeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIAotUHlBUElfRlVOQyhzdHJ1Y3Qgc3ltdGFibGUgKikgUHlTeW10YWJsZV9CdWlsZChtb2RfdHksIGNvbnN0IGNoYXIgKiwgCi0JCQkJCSAgICAgIFB5RnV0dXJlRmVhdHVyZXMgKik7CitQeUFQSV9GVU5DKHN0cnVjdCBzeW10YWJsZSAqKSBQeVN5bXRhYmxlX0J1aWxkKG1vZF90eSwgY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnV0dXJlRmVhdHVyZXMgKik7CiBQeUFQSV9GVU5DKFB5U1RFbnRyeU9iamVjdCAqKSBQeVN5bXRhYmxlX0xvb2t1cChzdHJ1Y3Qgc3ltdGFibGUgKiwgdm9pZCAqKTsKIAogUHlBUElfRlVOQyh2b2lkKSBQeVN5bXRhYmxlX0ZyZWUoc3RydWN0IHN5bXRhYmxlICopOwpAQCAtNzYsNyArNzYsNyBAQAogI2RlZmluZSBERUZfQk9VTkQgKERFRl9MT0NBTCB8IERFRl9QQVJBTSB8IERFRl9JTVBPUlQpCiAKIC8qIEdMT0JBTF9FWFBMSUNJVCBhbmQgR0xPQkFMX0lNUExJQ0lUIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIHN5bWJvbAotICAgdGFibGUuICBHTE9CQUwgaXMgcmV0dXJuZWQgZnJvbSBQeVNUX0dldFNjb3BlKCkgZm9yIGVpdGhlciBvZiB0aGVtLiAKKyAgIHRhYmxlLiAgR0xPQkFMIGlzIHJldHVybmVkIGZyb20gUHlTVF9HZXRTY29wZSgpIGZvciBlaXRoZXIgb2YgdGhlbS4KICAgIEl0IGlzIHN0b3JlZCBpbiBzdGVfc3ltYm9scyBhdCBiaXRzIDEyLTE0LgogKi8KICNkZWZpbmUgU0NPUEVfT0ZGIDExCmRpZmYgLS1naXQgYS9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaCBiL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCmluZGV4IDJlMzk5YTAuLmMwYTFjYTEgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCisrKyBiL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oCkBAIC0yOCwxNCArMjgsMTQgQEAKICAqCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogVGhpcyBVbmljb2RlIFN0cmluZyBUeXBlIGlzCi0gKiAKKyAqCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTkgYnkgU2VjcmV0IExhYnMgQUIKICAqIENvcHlyaWdodCAoYykgMTk5OSBieSBGcmVkcmlrIEx1bmRoCi0gKiAKKyAqCiAgKiBCeSBvYnRhaW5pbmcsIHVzaW5nLCBhbmQvb3IgY29weWluZyB0aGlzIHNvZnR3YXJlIGFuZC9vciBpdHMKICAqIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiwgeW91IGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwKICAqIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnM6Ci0gKiAKKyAqCiAgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICAqIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieQogICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbApAQCAtNDQsNyArNDQsNyBAQAogICogQUIgb3IgdGhlIGF1dGhvciBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bwogICogZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yCiAgKiBwZXJtaXNzaW9uLgotICogCisgKgogICogU0VDUkVUIExBQlMgQUIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCiAgKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECiAgKiBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0VDUkVUIExBQlMgQUIgT1IgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogICogVXNlIHRoaXMgdHlwZWRlZiB3aGVuIHlvdSBuZWVkIHRvIHJlcHJlc2VudCBhIFVURi0xNiBzdXJyb2dhdGUgcGFpcgogICogYXMgc2luZ2xlIHVuc2lnbmVkIGludGVnZXIuCiAgKi8KLSNpZiBTSVpFT0ZfSU5UID49IDQgCi10eXBlZGVmIHVuc2lnbmVkIGludCBQeV9VQ1M0OyAKKyNpZiBTSVpFT0ZfSU5UID49IDQKK3R5cGVkZWYgdW5zaWduZWQgaW50IFB5X1VDUzQ7CiAjZWxpZiBTSVpFT0ZfTE9ORyA+PSA0Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgUHlfVUNTNDsgCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgUHlfVUNTNDsKICNlbmRpZgogCiAvKiBQeV9VTklDT0RFIGlzIHRoZSBuYXRpdmUgVW5pY29kZSBzdG9yYWdlIGZvcm1hdCAoY29kZSB1bml0KSB1c2VkIGJ5CkBAIC0zNjEsNyArMzYxLDcgQEAKIAogICovCiAjZGVmaW5lIFB5X1VOSUNPREVfSVNTUEFDRShjaCkgXAotCSgoY2gpIDwgMTI4VSA/IF9QeV9hc2NpaV93aGl0ZXNwYWNlWyhjaCldIDogX1B5VW5pY29kZV9Jc1doaXRlc3BhY2UoY2gpKQorICAgICgoY2gpIDwgMTI4VSA/IF9QeV9hc2NpaV93aGl0ZXNwYWNlWyhjaCldIDogX1B5VW5pY29kZV9Jc1doaXRlc3BhY2UoY2gpKQogCiAjZGVmaW5lIFB5X1VOSUNPREVfSVNMT1dFUihjaCkgX1B5VW5pY29kZV9Jc0xvd2VyY2FzZShjaCkKICNkZWZpbmUgUHlfVU5JQ09ERV9JU1VQUEVSKGNoKSBfUHlVbmljb2RlX0lzVXBwZXJjYXNlKGNoKQpAQCAtMzg2LDE2ICszODYsMTYgQEAKIAogI2RlZmluZSBQeV9VTklDT0RFX0lTQUxOVU0oY2gpIFwKICAgICAgICAoUHlfVU5JQ09ERV9JU0FMUEhBKGNoKSB8fCBcCi0gICAgICAgIFB5X1VOSUNPREVfSVNERUNJTUFMKGNoKSB8fCBcCi0gICAgICAgIFB5X1VOSUNPREVfSVNESUdJVChjaCkgfHwgXAotICAgICAgICBQeV9VTklDT0RFX0lTTlVNRVJJQyhjaCkpCisgICAgUHlfVU5JQ09ERV9JU0RFQ0lNQUwoY2gpIHx8IFwKKyAgICBQeV9VTklDT0RFX0lTRElHSVQoY2gpIHx8IFwKKyAgICBQeV9VTklDT0RFX0lTTlVNRVJJQyhjaCkpCiAKLSNkZWZpbmUgUHlfVU5JQ09ERV9DT1BZKHRhcmdldCwgc291cmNlLCBsZW5ndGgpCQkJCVwKLQlQeV9NRU1DUFkoKHRhcmdldCksIChzb3VyY2UpLCAobGVuZ3RoKSpzaXplb2YoUHlfVU5JQ09ERSkpCisjZGVmaW5lIFB5X1VOSUNPREVfQ09QWSh0YXJnZXQsIHNvdXJjZSwgbGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUHlfTUVNQ1BZKCh0YXJnZXQpLCAoc291cmNlKSwgKGxlbmd0aCkqc2l6ZW9mKFB5X1VOSUNPREUpKQogCiAjZGVmaW5lIFB5X1VOSUNPREVfRklMTCh0YXJnZXQsIHZhbHVlLCBsZW5ndGgpIFwKICAgICBkbyB7UHlfc3NpemVfdCBpXzsgUHlfVU5JQ09ERSAqdF8gPSAodGFyZ2V0KTsgUHlfVU5JQ09ERSB2XyA9ICh2YWx1ZSk7XAotICAgICAgICBmb3IgKGlfID0gMDsgaV8gPCAobGVuZ3RoKTsgaV8rKykgdF9baV9dID0gdl87XAorICAgIGZvciAoaV8gPSAwOyBpXyA8IChsZW5ndGgpOyBpXysrKSB0X1tpX10gPSB2XztcCiAgICAgfSB3aGlsZSAoMCkKIAogLyogQ2hlY2sgaWYgc3Vic3RyaW5nIG1hdGNoZXMgYXQgZ2l2ZW4gb2Zmc2V0LiAgdGhlIG9mZnNldCBtdXN0IGJlCkBAIC00MTQsMTIgKzQxNCwxMiBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFB5X3NzaXplX3QgbGVuZ3RoOwkJLyogTGVuZ3RoIG9mIHJhdyBVbmljb2RlIGRhdGEgaW4gYnVmZmVyICovCi0gICAgUHlfVU5JQ09ERSAqc3RyOwkJLyogUmF3IFVuaWNvZGUgYnVmZmVyICovCi0gICAgbG9uZyBoYXNoOwkJCS8qIEhhc2ggdmFsdWU7IC0xIGlmIG5vdCBzZXQgKi8KLSAgICBQeU9iamVjdCAqZGVmZW5jOwkJLyogKERlZmF1bHQpIEVuY29kZWQgdmVyc2lvbiBhcyBQeXRob24KLQkJCQkgICBzdHJpbmcsIG9yIE5VTEw7IHRoaXMgaXMgdXNlZCBmb3IKLQkJCQkgICBpbXBsZW1lbnRpbmcgdGhlIGJ1ZmZlciBwcm90b2NvbCAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoOyAgICAgICAgICAvKiBMZW5ndGggb2YgcmF3IFVuaWNvZGUgZGF0YSBpbiBidWZmZXIgKi8KKyAgICBQeV9VTklDT0RFICpzdHI7ICAgICAgICAgICAgLyogUmF3IFVuaWNvZGUgYnVmZmVyICovCisgICAgbG9uZyBoYXNoOyAgICAgICAgICAgICAgICAgIC8qIEhhc2ggdmFsdWU7IC0xIGlmIG5vdCBzZXQgKi8KKyAgICBQeU9iamVjdCAqZGVmZW5jOyAgICAgICAgICAgLyogKERlZmF1bHQpIEVuY29kZWQgdmVyc2lvbiBhcyBQeXRob24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLCBvciBOVUxMOyB0aGlzIGlzIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGluZyB0aGUgYnVmZmVyIHByb3RvY29sICovCiB9IFB5VW5pY29kZU9iamVjdDsKIAogUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5VW5pY29kZV9UeXBlOwpAQCAtNDMwLDEzICs0MzAsMTMgQEAKIAogLyogRmFzdCBhY2Nlc3MgbWFjcm9zICovCiAjZGVmaW5lIFB5VW5pY29kZV9HRVRfU0laRShvcCkgXAotICAgICAgICAoKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+bGVuZ3RoKQorICAgICgoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5sZW5ndGgpCiAjZGVmaW5lIFB5VW5pY29kZV9HRVRfREFUQV9TSVpFKG9wKSBcCi0gICAgICAgICgoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5sZW5ndGggKiBzaXplb2YoUHlfVU5JQ09ERSkpCisgICAgKCgoUHlVbmljb2RlT2JqZWN0ICopKG9wKSktPmxlbmd0aCAqIHNpemVvZihQeV9VTklDT0RFKSkKICNkZWZpbmUgUHlVbmljb2RlX0FTX1VOSUNPREUob3ApIFwKLSAgICAgICAgKCgoUHlVbmljb2RlT2JqZWN0ICopKG9wKSktPnN0cikKKyAgICAoKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+c3RyKQogI2RlZmluZSBQeVVuaWNvZGVfQVNfREFUQShvcCkgXAotICAgICAgICAoKGNvbnN0IGNoYXIgKikoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5zdHIpCisgICAgKChjb25zdCBjaGFyICopKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+c3RyKQogCiAvKiAtLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNDUyLDcgKzQ1Miw3IEBACiAvKiAtLS0gUGxhaW4gUHlfVU5JQ09ERSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogQ3JlYXRlIGEgVW5pY29kZSBPYmplY3QgZnJvbSB0aGUgUHlfVU5JQ09ERSBidWZmZXIgdSBvZiB0aGUgZ2l2ZW4KLSAgIHNpemUuIAorICAgc2l6ZS4KIAogICAgdSBtYXkgYmUgTlVMTCB3aGljaCBjYXVzZXMgdGhlIGNvbnRlbnRzIHRvIGJlIHVuZGVmaW5lZC4gSXQgaXMgdGhlCiAgICB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZmlsbCBpbiB0aGUgbmVlZGVkIGRhdGEgYWZ0ZXJ3YXJkcy4gTm90ZQpAQCAtNDgyLDEzICs0ODIsMTMgQEAKICAgIFB5X1VOSUNPREUgYnVmZmVyLiAqLwogCiBQeUFQSV9GVU5DKFB5X1VOSUNPREUgKikgUHlVbmljb2RlX0FzVW5pY29kZSgKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIFVuaWNvZGUgb2JqZWN0LiAqLwogCiBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5VW5pY29kZV9HZXRTaXplKAotICAgIFB5T2JqZWN0ICp1bmljb2RlCSAJLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KICAgICApOwogCiAvKiBHZXQgdGhlIG1heGltdW0gb3JkaW5hbCBmb3IgYSBVbmljb2RlIGNoYXJhY3Rlci4gKi8KQEAgLTUwOSw4ICs1MDksOCBAQAogKi8KIAogUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZV9SZXNpemUoCi0gICAgUHlPYmplY3QgKip1bmljb2RlLAkJLyogUG9pbnRlciB0byB0aGUgVW5pY29kZSBvYmplY3QgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aAkJLyogTmV3IGxlbmd0aCAqLworICAgIFB5T2JqZWN0ICoqdW5pY29kZSwgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBVbmljb2RlIG9iamVjdCAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoICAgICAgICAgICAvKiBOZXcgbGVuZ3RoICovCiAgICAgKTsKIAogLyogQ29lcmNlIG9iaiB0byBhbiBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHdpdGgKQEAgLTUzMSwxNCArNTMxLDE0IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KAotICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpvYmosIAkvKiBPYmplY3QgKi8KKyAgICByZWdpc3RlciBQeU9iamVjdCAqb2JqLCAgICAgLyogT2JqZWN0ICovCiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICAgICAgIC8qIGVuY29kaW5nICovCiAgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogLyogQ29lcmNlIG9iaiB0byBhbiBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHdpdGgKICAgICppbmNyZW1lbnRlZCogcmVmY291bnQuCi0gICAKKwogICAgVW5pY29kZSBvYmplY3RzIGFyZSBwYXNzZWQgYmFjayBhcy1pcyAoc3ViY2xhc3NlcyBhcmUgY29udmVydGVkIHRvCiAgICB0cnVlIFVuaWNvZGUgb2JqZWN0cyksIGFsbCBvdGhlciBvYmplY3RzIGFyZSBkZWxlZ2F0ZWQgdG8KICAgIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdChvYmosIE5VTEwsICJzdHJpY3QiKSB3aGljaCByZXN1bHRzIGluCkBAIC01NTAsNyArNTUwLDcgQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRnJvbU9iamVjdCgKLSAgICByZWdpc3RlciBQeU9iamVjdCAqb2JqIAkvKiBPYmplY3QgKi8KKyAgICByZWdpc3RlciBQeU9iamVjdCAqb2JqICAgICAgLyogT2JqZWN0ICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfRnJvbUZvcm1hdFYoY29uc3QgY2hhciosIHZhX2xpc3QpOwpAQCAtNTU5LDggKzU1OSw4IEBACiAvKiBGb3JtYXQgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgZm9ybWF0X3NwZWMsIGFzIGRlZmluZWQgaW4gUEVQIDMxMDEKICAgIChBZHZhbmNlZCBTdHJpbmcgRm9ybWF0dGluZykuICovCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVVuaWNvZGVfRm9ybWF0QWR2YW5jZWQoUHlPYmplY3QgKm9iaiwKLQkJCQkJCSBQeV9VTklDT0RFICpmb3JtYXRfc3BlYywKLQkJCQkJCSBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVU5JQ09ERSAqZm9ybWF0X3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pOwogCiAvKiAtLS0gd2NoYXJfdCBzdXBwb3J0IGZvciBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBpdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtNTk4LDggKzU5OCw4IEBACiAKIC8qIC0tLSBVbmljb2RlIG9yZGluYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKiBDcmVhdGUgYSBVbmljb2RlIE9iamVjdCBmcm9tIHRoZSBnaXZlbiBVbmljb2RlIGNvZGUgcG9pbnQgb3JkaW5hbC4gCi0gCisvKiBDcmVhdGUgYSBVbmljb2RlIE9iamVjdCBmcm9tIHRoZSBnaXZlbiBVbmljb2RlIGNvZGUgcG9pbnQgb3JkaW5hbC4KKwogICAgVGhlIG9yZGluYWwgbXVzdCBiZSBpbiByYW5nZSgweDEwMDAwKSBvbiBuYXJyb3cgUHl0aG9uIGJ1aWxkcwogICAgKFVDUzIpLCBhbmQgcmFuZ2UoMHgxMTAwMDApIG9uIHdpZGUgYnVpbGRzIChVQ1M0KS4gQSBWYWx1ZUVycm9yIGlzCiAgICByYWlzZWQgaW4gY2FzZSBpdCBpcyBub3QuCkBAIC02MTksMTEgKzYxOSwxMSBAQAogCiBQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX0NsZWFyRnJlZUxpc3Qodm9pZCk7CiAKLS8qID09PSBCdWlsdGluIENvZGVjcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKKy8qID09PSBCdWlsdGluIENvZGVjcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAgICBNYW55IG9mIHRoZXNlIEFQSXMgdGFrZSB0d28gYXJndW1lbnRzIGVuY29kaW5nIGFuZCBlcnJvcnMuIFRoZXNlCiAgICBwYXJhbWV0ZXJzIGVuY29kaW5nIGFuZCBlcnJvcnMgaGF2ZSB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIG9uZXMKLSAgIG9mIHRoZSBidWlsdGluIHVuaWNvZGUoKSBBUEkuIAorICAgb2YgdGhlIGJ1aWx0aW4gdW5pY29kZSgpIEFQSS4KIAogICAgU2V0dGluZyBlbmNvZGluZyB0byBOVUxMIGNhdXNlcyB0aGUgZGVmYXVsdCBlbmNvZGluZyB0byBiZSB1c2VkLgogCkBAIC02NDAsNyArNjQwLDcgQEAKIC8qIC0tLSBNYW5hZ2UgdGhlIGRlZmF1bHQgZW5jb2RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBSZXR1cm4gYSBQeXRob24gc3RyaW5nIGhvbGRpbmcgdGhlIGRlZmF1bHQgZW5jb2RlZCB2YWx1ZSBvZiB0aGUKLSAgIFVuaWNvZGUgb2JqZWN0LiAKKyAgIFVuaWNvZGUgb2JqZWN0LgogCiAgICBUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyBjYWNoZWQgaW4gdGhlIFVuaWNvZGUgb2JqZWN0IGZvciBzdWJzZXF1ZW50CiAgICB1c2FnZSBieSB0aGlzIGZ1bmN0aW9uLiBUaGUgY2FjaGVkIHZlcnNpb24gaXMgbmVlZGVkIHRvIGltcGxlbWVudApAQCAtNjYyLDcgKzY2Miw3IEBACiAgICBwcm9jZXNzIGdsb2JhbC4gIFRoaXMgbWF5IGNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlCiAgICBpbnRlcnByZXRlciB0byBiZWNvbWUgYSBwYXJhbWV0ZXIgd2hpY2ggaXMgbWFuYWdlZCBvbiBhIHBlci10aHJlYWQKICAgIGJhc2lzLgotICAgCisKICAqLwogCiBQeUFQSV9GVU5DKGNvbnN0IGNoYXIqKSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKHZvaWQpOwpAQCAtNjcwLDExICs2NzAsMTEgQEAKIC8qIFNldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgZGVmYXVsdCBlbmNvZGluZy4KIAogICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIGluIGNhc2Ugb2YgYW4gZXJyb3IuCi0gICAKKwogICovCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nKAotICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nCS8qIEVuY29kaW5nIG5hbWUgaW4gc3RhbmRhcmQgZm9ybSAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nICAgICAgICAvKiBFbmNvZGluZyBuYW1lIGluIHN0YW5kYXJkIGZvcm0gKi8KICAgICApOwogCiAvKiAtLS0gR2VuZXJpYyBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTY4OSw3ICs2ODksNyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKLS8qIEVuY29kZXMgYSBQeV9VTklDT0RFIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSBhbmQgcmV0dXJucyBhIAorLyogRW5jb2RlcyBhIFB5X1VOSUNPREUgYnVmZmVyIG9mIHRoZSBnaXZlbiBzaXplIGFuZCByZXR1cm5zIGEKICAgIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZSgKQEAgLTcwMywxOCArNzAzLDE4IEBACiAgICBvYmplY3QuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0KAotICAgIFB5T2JqZWN0ICp1bmljb2RlLAkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCi0gICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCS8qIGVuY29kaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlLCAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIC8qIEVuY29kZXMgYSBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiBzdHJpbmcKICAgIG9iamVjdC4gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCi0gICAgUHlPYmplY3QgKnVuaWNvZGUsCSAJLyogVW5pY29kZSBvYmplY3QgKi8KLSAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUsICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICAgICAgIC8qIGVuY29kaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwKApAQCAtNzI1LDUxICs3MjUsNTEgQEAKIC8qIC0tLSBVVEYtNyBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjcoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTcgZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTcgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bCgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBVVEYtNyBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzLAkJLyogZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBQeV9zc2l6ZV90ICpjb25zdW1lZAkvKiBieXRlcyBjb25zdW1lZCAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtNyBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycywgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkICAgICAgICAvKiBieXRlcyBjb25zdW1lZCAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlVVRGNygKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCQkvKiBudW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLwogICAgIGludCBlbmNvZGVTZXRPLCAgICAgICAgICAgICAvKiBmb3JjZSB0aGUgZW5jb2RlciB0byBlbmNvZGUgY2hhcmFjdGVycyBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgTywgYXMgZGVzY3JpYmVkIGluIFJGQzIxNTIgKi8KICAgICBpbnQgZW5jb2RlV2hpdGVTcGFjZSwgICAgICAgLyogZm9yY2UgdGhlIGVuY29kZXIgdG8gZW5jb2RlIHNwYWNlLCB0YWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcnJpYWdlIHJldHVybiBhbmQgbGluZWZlZWQgY2hhcmFjdGVycyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAvKiAtLS0gVVRGLTggQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEY4KAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIFVURi04IGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi04IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTggZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycywJCS8qIGVycm9yIGhhbmRsaW5nICovCi0gICAgUHlfc3NpemVfdCAqY29uc3VtZWQJCS8qIGJ5dGVzIGNvbnN1bWVkICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi04IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlfc3NpemVfdCAqY29uc3VtZWQgICAgICAgICAgICAgICAgLyogYnl0ZXMgY29uc3VtZWQgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzVVRGOFN0cmluZygKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVVVEY4KAotICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsIAkvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJCS8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIC8qIC0tLSBVVEYtMzIgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzc4LDE0ICs3NzgsMTQgQEAKICAgIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgb2JqZWN0LgogCiAgICBlcnJvcnMgKGlmIG5vbi1OVUxMKSBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZy4gSXQgZGVmYXVsdHMKLSAgIHRvICJzdHJpY3QiLiAKKyAgIHRvICJzdHJpY3QiLgogCiAgICBJZiBieXRlb3JkZXIgaXMgbm9uLU5VTEwsIHRoZSBkZWNvZGVyIHN0YXJ0cyBkZWNvZGluZyB1c2luZyB0aGUKICAgIGdpdmVuIGJ5dGUgb3JkZXI6CiAKLQkqYnl0ZW9yZGVyID09IC0xOiBsaXR0bGUgZW5kaWFuCi0JKmJ5dGVvcmRlciA9PSAwOiAgbmF0aXZlIG9yZGVyCi0JKmJ5dGVvcmRlciA9PSAxOiAgYmlnIGVuZGlhbgorICAgICpieXRlb3JkZXIgPT0gLTE6IGxpdHRsZSBlbmRpYW4KKyAgICAqYnl0ZW9yZGVyID09IDA6ICBuYXRpdmUgb3JkZXIKKyAgICAqYnl0ZW9yZGVyID09IDE6ICBiaWcgZW5kaWFuCiAKICAgIEluIG5hdGl2ZSBtb2RlLCB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgc3RyZWFtIGFyZSBjaGVja2VkIGZvciBhCiAgICBCT00gbWFyay4gSWYgZm91bmQsIHRoZSBCT00gbWFyayBpcyBhbmFseXNlZCwgdGhlIGJ5dGUgb3JkZXIKQEAgLTc5OCwyOSArNzk4LDI5IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjMyKAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIFVURi0zMiBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzLAkJLyogZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBpbnQgKmJ5dGVvcmRlcgkJLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCi0JCQkJICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgotCQkJCSAgIGV4aXQgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTMyIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50ICpieXRlb3JkZXIgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYnl0ZW9yZGVyIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTMyIGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMsCQkvKiBlcnJvciBoYW5kbGluZyAqLwotICAgIGludCAqYnl0ZW9yZGVyLAkJLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCi0JCQkJICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgotCQkJCSAgIGV4aXQgKi8KLSAgICBQeV9zc2l6ZV90ICpjb25zdW1lZAkvKiBieXRlcyBjb25zdW1lZCAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtMzIgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgKmJ5dGVvcmRlciwgICAgICAgICAgICAgLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9bmF0aXZlOy0xPUxFLDE9QkU7IHVwZGF0ZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAqLworICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkICAgICAgICAvKiBieXRlcyBjb25zdW1lZCAqLwogICAgICk7CiAKIC8qIFJldHVybnMgYSBQeXRob24gc3RyaW5nIHVzaW5nIHRoZSBVVEYtMzIgZW5jb2RpbmcgaW4gbmF0aXZlIGJ5dGUKICAgIG9yZGVyLiBUaGUgc3RyaW5nIGFsd2F5cyBzdGFydHMgd2l0aCBhIEJPTSBtYXJrLiAgKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1VURjMyU3RyaW5nKAotICAgIFB5T2JqZWN0ICp1bmljb2RlCSAJLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KICAgICApOwogCiAvKiBSZXR1cm5zIGEgUHl0aG9uIHN0cmluZyBvYmplY3QgaG9sZGluZyB0aGUgVVRGLTMyIGVuY29kZWQgdmFsdWUgb2YKQEAgLTg0MCwxMCArODQwLDEwIEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZVVURjMyKAotICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsIAkvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzLAkJLyogZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBpbnQgYnl0ZW9yZGVyCQkvKiBieXRlb3JkZXIgdG8gdXNlIDA9Qk9NK25hdGl2ZTstMT1MRSwxPUJFICovCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50IGJ5dGVvcmRlciAgICAgICAgICAgICAgIC8qIGJ5dGVvcmRlciB0byB1c2UgMD1CT00rbmF0aXZlOy0xPUxFLDE9QkUgKi8KICAgICApOwogCiAvKiAtLS0gVVRGLTE2IENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTg1MiwxNCArODUyLDE0IEBACiAgICB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlIG9iamVjdC4KIAogICAgZXJyb3JzIChpZiBub24tTlVMTCkgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcuIEl0IGRlZmF1bHRzCi0gICB0byAic3RyaWN0Ii4gCisgICB0byAic3RyaWN0Ii4KIAogICAgSWYgYnl0ZW9yZGVyIGlzIG5vbi1OVUxMLCB0aGUgZGVjb2RlciBzdGFydHMgZGVjb2RpbmcgdXNpbmcgdGhlCiAgICBnaXZlbiBieXRlIG9yZGVyOgogCi0JKmJ5dGVvcmRlciA9PSAtMTogbGl0dGxlIGVuZGlhbgotCSpieXRlb3JkZXIgPT0gMDogIG5hdGl2ZSBvcmRlcgotCSpieXRlb3JkZXIgPT0gMTogIGJpZyBlbmRpYW4KKyAgICAqYnl0ZW9yZGVyID09IC0xOiBsaXR0bGUgZW5kaWFuCisgICAgKmJ5dGVvcmRlciA9PSAwOiAgbmF0aXZlIG9yZGVyCisgICAgKmJ5dGVvcmRlciA9PSAxOiAgYmlnIGVuZGlhbgogCiAgICBJbiBuYXRpdmUgbW9kZSwgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgc3RyZWFtIGFyZSBjaGVja2VkIGZvciBhCiAgICBCT00gbWFyay4gSWYgZm91bmQsIHRoZSBCT00gbWFyayBpcyBhbmFseXNlZCwgdGhlIGJ5dGUgb3JkZXIKQEAgLTg3MiwyOSArODcyLDI5IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjE2KAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIFVURi0xNiBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzLAkJLyogZXJyb3IgaGFuZGxpbmcgKi8KLSAgICBpbnQgKmJ5dGVvcmRlcgkJLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCi0JCQkJICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgotCQkJCSAgIGV4aXQgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTE2IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50ICpieXRlb3JkZXIgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYnl0ZW9yZGVyIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogVVRGLTE2IGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMsCQkvKiBlcnJvciBoYW5kbGluZyAqLwotICAgIGludCAqYnl0ZW9yZGVyLAkJLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCi0JCQkJICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgotCQkJCSAgIGV4aXQgKi8KLSAgICBQeV9zc2l6ZV90ICpjb25zdW1lZAkJLyogYnl0ZXMgY29uc3VtZWQgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTE2IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50ICpieXRlb3JkZXIsICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYnl0ZW9yZGVyIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKi8KKyAgICBQeV9zc2l6ZV90ICpjb25zdW1lZCAgICAgICAgICAgICAgICAvKiBieXRlcyBjb25zdW1lZCAqLwogICAgICk7CiAKIC8qIFJldHVybnMgYSBQeXRob24gc3RyaW5nIHVzaW5nIHRoZSBVVEYtMTYgZW5jb2RpbmcgaW4gbmF0aXZlIGJ5dGUKICAgIG9yZGVyLiBUaGUgc3RyaW5nIGFsd2F5cyBzdGFydHMgd2l0aCBhIEJPTSBtYXJrLiAgKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1VURjE2U3RyaW5nKAotICAgIFB5T2JqZWN0ICp1bmljb2RlCSAJLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KICAgICApOwogCiAvKiBSZXR1cm5zIGEgUHl0aG9uIHN0cmluZyBvYmplY3QgaG9sZGluZyB0aGUgVVRGLTE2IGVuY29kZWQgdmFsdWUgb2YKQEAgLTkxOCw0NCArOTE4LDQ0IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZVVURjE2KAotICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsIAkvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJCS8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycywJCS8qIGVycm9yIGhhbmRsaW5nICovCi0gICAgaW50IGJ5dGVvcmRlcgkJLyogYnl0ZW9yZGVyIHRvIHVzZSAwPUJPTStuYXRpdmU7LTE9TEUsMT1CRSAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50IGJ5dGVvcmRlciAgICAgICAgICAgICAgIC8qIGJ5dGVvcmRlciB0byB1c2UgMD1CT00rbmF0aXZlOy0xPUxFLDE9QkUgKi8KICAgICApOwogCiAvKiAtLS0gVW5pY29kZS1Fc2NhcGUgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlKAotICAgIGNvbnN0IGNoYXIgKnN0cmluZywgCS8qIFVuaWNvZGUtRXNjYXBlIGVuY29kZWQgc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBsZW5ndGgsCSAJLyogc2l6ZSBvZiBzdHJpbmcgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVuaWNvZGUtRXNjYXBlIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoCi0gICAgUHlPYmplY3QgKnVuaWNvZGUJIAkvKiBVbmljb2RlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlVW5pY29kZUVzY2FwZSgKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoCSAJCS8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGggICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCiAgICAgKTsKIAogLyogLS0tIFJhdy1Vbmljb2RlLUVzY2FwZSBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZSgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBSYXctVW5pY29kZS1Fc2NhcGUgZW5jb2RlZCBzdHJpbmcgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBzaXplIG9mIHN0cmluZyAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogUmF3LVVuaWNvZGUtRXNjYXBlIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcoCi0gICAgUHlPYmplY3QgKnVuaWNvZGUJIAkvKiBVbmljb2RlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlUmF3VW5pY29kZUVzY2FwZSgKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoCSAJCS8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGggICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCiAgICAgKTsKIAogLyogLS0tIFVuaWNvZGUgSW50ZXJuYWwgQ29kZWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05NjgsNTMgKzk2OCw1MyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycwogICAgICk7CiAKLS8qIC0tLSBMYXRpbi0xIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKy8qIC0tLSBMYXRpbi0xIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICBOb3RlOiBMYXRpbi0xIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCAyNTYgVW5pY29kZSBvcmRpbmFscy4KIAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVMYXRpbjEoCi0gICAgY29uc3QgY2hhciAqc3RyaW5nLCAJLyogTGF0aW4tMSBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBMYXRpbi0xIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc0xhdGluMVN0cmluZygKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVMYXRpbjEoCi0gICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgCS8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkJLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAotLyogLS0tIEFTQ0lJIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorLyogLS0tIEFTQ0lJIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgIE9ubHkgNy1iaXQgQVNDSUkgZGF0YSBpcyBleGNlcHRlZC4gQWxsIG90aGVyIGNvZGVzIGdlbmVyYXRlIGVycm9ycy4KIAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVBU0NJSSgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBBU0NJSSBlbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBBU0NJSSBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNBU0NJSVN0cmluZygKLSAgICBQeU9iamVjdCAqdW5pY29kZQkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVBU0NJSSgKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCQkvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCi0vKiAtLS0gQ2hhcmFjdGVyIE1hcCBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvKiAtLS0gQ2hhcmFjdGVyIE1hcCBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgVGhpcyBjb2RlYyB1c2VzIG1hcHBpbmdzIHRvIGVuY29kZSBhbmQgZGVjb2RlIGNoYXJhY3RlcnMuIAorICAgVGhpcyBjb2RlYyB1c2VzIG1hcHBpbmdzIHRvIGVuY29kZSBhbmQgZGVjb2RlIGNoYXJhY3RlcnMuCiAKICAgIERlY29kaW5nIG1hcHBpbmdzIG11c3QgbWFwIHNpbmdsZSBzdHJpbmcgY2hhcmFjdGVycyB0byBzaW5nbGUKICAgIFVuaWNvZGUgY2hhcmFjdGVycywgaW50ZWdlcnMgKHdoaWNoIGFyZSB0aGVuIGludGVycHJldGVkIGFzIFVuaWNvZGUKQEAgLTEwMzUsMjUgKzEwMzUsMjUgQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcCgKLSAgICBjb25zdCBjaGFyICpzdHJpbmcsIAkvKiBFbmNvZGVkIHN0cmluZyAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCS8qIHNpemUgb2Ygc3RyaW5nICovCi0gICAgUHlPYmplY3QgKm1hcHBpbmcsCQkvKiBjaGFyYWN0ZXIgbWFwcGluZyAKLQkJCQkgICAoY2hhciBvcmRpbmFsIC0+IHVuaWNvZGUgb3JkaW5hbCkgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIEVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgUHlPYmplY3QgKm1hcHBpbmcsICAgICAgICAgIC8qIGNoYXJhY3RlciBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyIG9yZGluYWwgLT4gdW5pY29kZSBvcmRpbmFsKSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nKAotICAgIFB5T2JqZWN0ICp1bmljb2RlLAkgCS8qIFVuaWNvZGUgb2JqZWN0ICovCi0gICAgUHlPYmplY3QgKm1hcHBpbmcJCS8qIGNoYXJhY3RlciBtYXBwaW5nIAotCQkJCSAgICh1bmljb2RlIG9yZGluYWwgLT4gY2hhciBvcmRpbmFsKSAqLworICAgIFB5T2JqZWN0ICp1bmljb2RlLCAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICptYXBwaW5nICAgICAgICAgICAvKiBjaGFyYWN0ZXIgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pY29kZSBvcmRpbmFsIC0+IGNoYXIgb3JkaW5hbCkgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZUNoYXJtYXAoCi0gICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgCS8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJIAkvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KLSAgICBQeU9iamVjdCAqbWFwcGluZywJCS8qIGNoYXJhY3RlciBtYXBwaW5nIAotCQkJCSAgICh1bmljb2RlIG9yZGluYWwgLT4gY2hhciBvcmRpbmFsKSAqLwotICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBQeU9iamVjdCAqbWFwcGluZywgICAgICAgICAgLyogY2hhcmFjdGVyIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaWNvZGUgb3JkaW5hbCAtPiBjaGFyIG9yZGluYWwpICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogLyogVHJhbnNsYXRlIGEgUHlfVU5JQ09ERSBidWZmZXIgb2YgdGhlIGdpdmVuIGxlbmd0aCBieSBhcHBseWluZyBhCkBAIC0xMDYxLDcgKzEwNjEsNyBAQAogICAgb2JqZWN0LgogCiAgICBUaGUgbWFwcGluZyB0YWJsZSBtdXN0IG1hcCBVbmljb2RlIG9yZGluYWwgaW50ZWdlcnMgdG8gVW5pY29kZQotICAgb3JkaW5hbCBpbnRlZ2VycyBvciBOb25lIChjYXVzaW5nIGRlbGV0aW9uIG9mIHRoZSBjaGFyYWN0ZXIpLiAKKyAgIG9yZGluYWwgaW50ZWdlcnMgb3IgTm9uZSAoY2F1c2luZyBkZWxldGlvbiBvZiB0aGUgY2hhcmFjdGVyKS4KIAogICAgTWFwcGluZyB0YWJsZXMgbWF5IGJlIGRpY3Rpb25hcmllcyBvciBzZXF1ZW5jZXMuIFVubWFwcGVkIGNoYXJhY3RlcgogICAgb3JkaW5hbHMgKG9uZXMgd2hpY2ggY2F1c2UgYSBMb29rdXBFcnJvcikgYXJlIGxlZnQgdW50b3VjaGVkIGFuZApAQCAtMTA3MCwxMCArMTA3MCwxMCBAQAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcCgKLSAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAJLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLwotICAgIFB5X3NzaXplX3QgbGVuZ3RoLAkgCQkvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KLSAgICBQeU9iamVjdCAqdGFibGUsCQkvKiBUcmFuc2xhdGUgdGFibGUgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBQeU9iamVjdCAqdGFibGUsICAgICAgICAgICAgLyogVHJhbnNsYXRlIHRhYmxlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCiAgICAgKTsKIAogI2lmZGVmIE1TX1dJTjMyCkBAIC0xMTIyLDcgKzExMjIsNyBAQAogCiAgICAgICBOVUxMIG9yICJzdHJpY3QiOiByYWlzZSBhIFZhbHVlRXJyb3IKICAgICAgICJpZ25vcmUiOiBpZ25vcmUgdGhlIHdyb25nIGNoYXJhY3RlcnMgKHRoZXNlIGFyZSBub3QgY29waWVkIHRvIHRoZQotCQlvdXRwdXQgYnVmZmVyKQorICAgICAgICAgICAgICAgIG91dHB1dCBidWZmZXIpCiAgICAgICAicmVwbGFjZSI6IHJlcGxhY2VzIGlsbGVnYWwgY2hhcmFjdGVycyB3aXRoICc/JwogCiAgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KQEAgLTExMzAsMTAgKzExMzAsMTAgQEAKICovCiAKIFB5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbCgKLSAgICBQeV9VTklDT0RFICpzLAkJLyogVW5pY29kZSBidWZmZXIgKi8KLSAgICBQeV9zc2l6ZV90IGxlbmd0aCwJCQkvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KLSAgICBjaGFyICpvdXRwdXQsCQkvKiBPdXRwdXQgYnVmZmVyOyBtdXN0IGhhdmUgc2l6ZSA+PSBsZW5ndGggKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlfVU5JQ09ERSAqcywgICAgICAgICAgICAgIC8qIFVuaWNvZGUgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY2hhciAqb3V0cHV0LCAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXI7IG11c3QgaGF2ZSBzaXplID49IGxlbmd0aCAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKIC8qIC0tLSBNZXRob2RzICYgU2xvdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTE0NSw4ICsxMTQ1LDggQEAKIC8qIENvbmNhdCB0d28gc3RyaW5ncyBnaXZpbmcgYSBuZXcgVW5pY29kZSBzdHJpbmcuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQ29uY2F0KAotICAgIFB5T2JqZWN0ICpsZWZ0LAkgCS8qIExlZnQgc3RyaW5nICovCi0gICAgUHlPYmplY3QgKnJpZ2h0CSAJLyogUmlnaHQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKmxlZnQsICAgICAgICAgICAgIC8qIExlZnQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKnJpZ2h0ICAgICAgICAgICAgIC8qIFJpZ2h0IHN0cmluZyAqLwogICAgICk7CiAKIC8qIFNwbGl0IGEgc3RyaW5nIGdpdmluZyBhIGxpc3Qgb2YgVW5pY29kZSBzdHJpbmdzLgpAQCAtMTE2MSwzNSArMTE2MSwzNSBAQAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9TcGxpdCgKLSAgICBQeU9iamVjdCAqcywJCS8qIFN0cmluZyB0byBzcGxpdCAqLwotICAgIFB5T2JqZWN0ICpzZXAsCQkvKiBTdHJpbmcgc2VwYXJhdG9yICovCi0gICAgUHlfc3NpemVfdCBtYXhzcGxpdAkJLyogTWF4c3BsaXQgY291bnQgKi8KLSAgICApOwkJCisgICAgUHlPYmplY3QgKnMsICAgICAgICAgICAgICAgIC8qIFN0cmluZyB0byBzcGxpdCAqLworICAgIFB5T2JqZWN0ICpzZXAsICAgICAgICAgICAgICAvKiBTdHJpbmcgc2VwYXJhdG9yICovCisgICAgUHlfc3NpemVfdCBtYXhzcGxpdCAgICAgICAgIC8qIE1heHNwbGl0IGNvdW50ICovCisgICAgKTsKIAogLyogRGl0bywgYnV0IHNwbGl0IGF0IGxpbmUgYnJlYWtzLgogCiAgICBDUkxGIGlzIGNvbnNpZGVyZWQgdG8gYmUgb25lIGxpbmUgYnJlYWsuIExpbmUgYnJlYWtzIGFyZSBub3QKICAgIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdC4gKi8KLSAgICAKKwogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9TcGxpdGxpbmVzKAotICAgIFB5T2JqZWN0ICpzLAkJLyogU3RyaW5nIHRvIHNwbGl0ICovCi0gICAgaW50IGtlZXBlbmRzCQkvKiBJZiB0cnVlLCBsaW5lIGVuZCBtYXJrZXJzIGFyZSBpbmNsdWRlZCAqLwotICAgICk7CQkKKyAgICBQeU9iamVjdCAqcywgICAgICAgICAgICAgICAgLyogU3RyaW5nIHRvIHNwbGl0ICovCisgICAgaW50IGtlZXBlbmRzICAgICAgICAgICAgICAgIC8qIElmIHRydWUsIGxpbmUgZW5kIG1hcmtlcnMgYXJlIGluY2x1ZGVkICovCisgICAgKTsKIAogLyogUGFydGl0aW9uIGEgc3RyaW5nIHVzaW5nIGEgZ2l2ZW4gc2VwYXJhdG9yLiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX1BhcnRpdGlvbigKLSAgICBQeU9iamVjdCAqcywJCS8qIFN0cmluZyB0byBwYXJ0aXRpb24gKi8KLSAgICBQeU9iamVjdCAqc2VwCQkvKiBTdHJpbmcgc2VwYXJhdG9yICovCi0gICAgKTsJCQorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gcGFydGl0aW9uICovCisgICAgUHlPYmplY3QgKnNlcCAgICAgICAgICAgICAgIC8qIFN0cmluZyBzZXBhcmF0b3IgKi8KKyAgICApOwogCiAvKiBQYXJ0aXRpb24gYSBzdHJpbmcgdXNpbmcgYSBnaXZlbiBzZXBhcmF0b3IsIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlCiAgICBzdHJpbmcuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfUlBhcnRpdGlvbigKLSAgICBQeU9iamVjdCAqcywJCS8qIFN0cmluZyB0byBwYXJ0aXRpb24gKi8KLSAgICBQeU9iamVjdCAqc2VwCQkvKiBTdHJpbmcgc2VwYXJhdG9yICovCi0gICAgKTsJCQorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gcGFydGl0aW9uICovCisgICAgUHlPYmplY3QgKnNlcCAgICAgICAgICAgICAgIC8qIFN0cmluZyBzZXBhcmF0b3IgKi8KKyAgICApOwogCiAvKiBTcGxpdCBhIHN0cmluZyBnaXZpbmcgYSBsaXN0IG9mIFVuaWNvZGUgc3RyaW5ncy4KIApAQCAtMTIwNSwxNiArMTIwNSwxNiBAQAogKi8KIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9SU3BsaXQoCi0gICAgUHlPYmplY3QgKnMsCQkvKiBTdHJpbmcgdG8gc3BsaXQgKi8KLSAgICBQeU9iamVjdCAqc2VwLAkJLyogU3RyaW5nIHNlcGFyYXRvciAqLwotICAgIFB5X3NzaXplX3QgbWF4c3BsaXQJCS8qIE1heHNwbGl0IGNvdW50ICovCi0gICAgKTsJCQorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gc3BsaXQgKi8KKyAgICBQeU9iamVjdCAqc2VwLCAgICAgICAgICAgICAgLyogU3RyaW5nIHNlcGFyYXRvciAqLworICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgICAgICAgICAvKiBNYXhzcGxpdCBjb3VudCAqLworICAgICk7CiAKIC8qIFRyYW5zbGF0ZSBhIHN0cmluZyBieSBhcHBseWluZyBhIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIHRvIGl0IGFuZAogICAgcmV0dXJuIHRoZSByZXN1bHRpbmcgVW5pY29kZSBvYmplY3QuCiAKICAgIFRoZSBtYXBwaW5nIHRhYmxlIG11c3QgbWFwIFVuaWNvZGUgb3JkaW5hbCBpbnRlZ2VycyB0byBVbmljb2RlCi0gICBvcmRpbmFsIGludGVnZXJzIG9yIE5vbmUgKGNhdXNpbmcgZGVsZXRpb24gb2YgdGhlIGNoYXJhY3RlcikuIAorICAgb3JkaW5hbCBpbnRlZ2VycyBvciBOb25lIChjYXVzaW5nIGRlbGV0aW9uIG9mIHRoZSBjaGFyYWN0ZXIpLgogCiAgICBNYXBwaW5nIHRhYmxlcyBtYXkgYmUgZGljdGlvbmFyaWVzIG9yIHNlcXVlbmNlcy4gVW5tYXBwZWQgY2hhcmFjdGVyCiAgICBvcmRpbmFscyAob25lcyB3aGljaCBjYXVzZSBhIExvb2t1cEVycm9yKSBhcmUgbGVmdCB1bnRvdWNoZWQgYW5kCkBAIC0xMjIzLDI4ICsxMjIzLDI4IEBACiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9UcmFuc2xhdGUoCi0gICAgUHlPYmplY3QgKnN0ciwJCS8qIFN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqdGFibGUsCQkvKiBUcmFuc2xhdGUgdGFibGUgKi8KLSAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIFN0cmluZyAqLworICAgIFB5T2JqZWN0ICp0YWJsZSwgICAgICAgICAgICAvKiBUcmFuc2xhdGUgdGFibGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KICAgICApOwogCiAvKiBKb2luIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yIGFuZCByZXR1cm4KICAgIHRoZSByZXN1bHRpbmcgVW5pY29kZSBzdHJpbmcuICovCi0gICAgCisKIFB5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfSm9pbigKLSAgICBQeU9iamVjdCAqc2VwYXJhdG9yLCAJLyogU2VwYXJhdG9yIHN0cmluZyAqLwotICAgIFB5T2JqZWN0ICpzZXEJIAkvKiBTZXF1ZW5jZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqc2VwYXJhdG9yLCAgICAgICAgLyogU2VwYXJhdG9yIHN0cmluZyAqLworICAgIFB5T2JqZWN0ICpzZXEgICAgICAgICAgICAgICAvKiBTZXF1ZW5jZSBvYmplY3QgKi8KICAgICApOwogCiAvKiBSZXR1cm4gMSBpZiBzdWJzdHIgbWF0Y2hlcyBzdHJbc3RhcnQ6ZW5kXSBhdCB0aGUgZ2l2ZW4gdGFpbCBlbmQsIDAKICAgIG90aGVyd2lzZS4gKi8KIAogUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVVuaWNvZGVfVGFpbG1hdGNoKAotICAgIFB5T2JqZWN0ICpzdHIsCQkvKiBTdHJpbmcgKi8gCi0gICAgUHlPYmplY3QgKnN1YnN0ciwJCS8qIFByZWZpeCBvciBTdWZmaXggc3RyaW5nICovCi0gICAgUHlfc3NpemVfdCBzdGFydCwJCS8qIFN0YXJ0IGluZGV4ICovCi0gICAgUHlfc3NpemVfdCBlbmQsCQkvKiBTdG9wIGluZGV4ICovCi0gICAgaW50IGRpcmVjdGlvbgkJLyogVGFpbCBlbmQ6IC0xIHByZWZpeCwgKzEgc3VmZml4ICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIFN0cmluZyAqLworICAgIFB5T2JqZWN0ICpzdWJzdHIsICAgICAgICAgICAvKiBQcmVmaXggb3IgU3VmZml4IHN0cmluZyAqLworICAgIFB5X3NzaXplX3Qgc3RhcnQsICAgICAgICAgICAvKiBTdGFydCBpbmRleCAqLworICAgIFB5X3NzaXplX3QgZW5kLCAgICAgICAgICAgICAvKiBTdG9wIGluZGV4ICovCisgICAgaW50IGRpcmVjdGlvbiAgICAgICAgICAgICAgIC8qIFRhaWwgZW5kOiAtMSBwcmVmaXgsICsxIHN1ZmZpeCAqLwogICAgICk7CiAKIC8qIFJldHVybiB0aGUgZmlyc3QgcG9zaXRpb24gb2Ygc3Vic3RyIGluIHN0cltzdGFydDplbmRdIHVzaW5nIHRoZQpAQCAtMTI1MiwzOSArMTI1MiwzOSBAQAogICAgYW4gZXJyb3Igb2NjdXJyZWQgYW5kIGFuIGV4Y2VwdGlvbiBpcyBzZXQuICovCiAKIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlVbmljb2RlX0ZpbmQoCi0gICAgUHlPYmplY3QgKnN0ciwJCS8qIFN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqc3Vic3RyLAkJLyogU3Vic3RyaW5nIHRvIGZpbmQgKi8KLSAgICBQeV9zc2l6ZV90IHN0YXJ0LAkJLyogU3RhcnQgaW5kZXggKi8KLSAgICBQeV9zc2l6ZV90IGVuZCwJCS8qIFN0b3AgaW5kZXggKi8KLSAgICBpbnQgZGlyZWN0aW9uCQkvKiBGaW5kIGRpcmVjdGlvbjogKzEgZm9yd2FyZCwgLTEgYmFja3dhcmQgKi8KKyAgICBQeU9iamVjdCAqc3RyLCAgICAgICAgICAgICAgLyogU3RyaW5nICovCisgICAgUHlPYmplY3QgKnN1YnN0ciwgICAgICAgICAgIC8qIFN1YnN0cmluZyB0byBmaW5kICovCisgICAgUHlfc3NpemVfdCBzdGFydCwgICAgICAgICAgIC8qIFN0YXJ0IGluZGV4ICovCisgICAgUHlfc3NpemVfdCBlbmQsICAgICAgICAgICAgIC8qIFN0b3AgaW5kZXggKi8KKyAgICBpbnQgZGlyZWN0aW9uICAgICAgICAgICAgICAgLyogRmluZCBkaXJlY3Rpb246ICsxIGZvcndhcmQsIC0xIGJhY2t3YXJkICovCiAgICAgKTsKIAogLyogQ291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBzdWJzdHIgaW4gc3RyW3N0YXJ0OmVuZF0uICovCiAKIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlVbmljb2RlX0NvdW50KAotICAgIFB5T2JqZWN0ICpzdHIsCQkvKiBTdHJpbmcgKi8gCi0gICAgUHlPYmplY3QgKnN1YnN0ciwJCS8qIFN1YnN0cmluZyB0byBjb3VudCAqLwotICAgIFB5X3NzaXplX3Qgc3RhcnQsCQkvKiBTdGFydCBpbmRleCAqLwotICAgIFB5X3NzaXplX3QgZW5kCQkvKiBTdG9wIGluZGV4ICovCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIFN0cmluZyAqLworICAgIFB5T2JqZWN0ICpzdWJzdHIsICAgICAgICAgICAvKiBTdWJzdHJpbmcgdG8gY291bnQgKi8KKyAgICBQeV9zc2l6ZV90IHN0YXJ0LCAgICAgICAgICAgLyogU3RhcnQgaW5kZXggKi8KKyAgICBQeV9zc2l6ZV90IGVuZCAgICAgICAgICAgICAgLyogU3RvcCBpbmRleCAqLwogICAgICk7CiAKIC8qIFJlcGxhY2UgYXQgbW9zdCBtYXhjb3VudCBvY2N1cnJlbmNlcyBvZiBzdWJzdHIgaW4gc3RyIHdpdGggcmVwbHN0cgogICAgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIFVuaWNvZGUgb2JqZWN0LiAqLwogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9SZXBsYWNlKAotICAgIFB5T2JqZWN0ICpzdHIsCQkvKiBTdHJpbmcgKi8gCi0gICAgUHlPYmplY3QgKnN1YnN0ciwJCS8qIFN1YnN0cmluZyB0byBmaW5kICovCi0gICAgUHlPYmplY3QgKnJlcGxzdHIsCQkvKiBTdWJzdHJpbmcgdG8gcmVwbGFjZSAqLwotICAgIFB5X3NzaXplX3QgbWF4Y291bnQJCS8qIE1heC4gbnVtYmVyIG9mIHJlcGxhY2VtZW50cyB0byBhcHBseTsKLQkJCQkgICAtMSA9IGFsbCAqLworICAgIFB5T2JqZWN0ICpzdHIsICAgICAgICAgICAgICAvKiBTdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqc3Vic3RyLCAgICAgICAgICAgLyogU3Vic3RyaW5nIHRvIGZpbmQgKi8KKyAgICBQeU9iamVjdCAqcmVwbHN0ciwgICAgICAgICAgLyogU3Vic3RyaW5nIHRvIHJlcGxhY2UgKi8KKyAgICBQeV9zc2l6ZV90IG1heGNvdW50ICAgICAgICAgLyogTWF4LiBudW1iZXIgb2YgcmVwbGFjZW1lbnRzIHRvIGFwcGx5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA9IGFsbCAqLwogICAgICk7CiAKIC8qIENvbXBhcmUgdHdvIHN0cmluZ3MgYW5kIHJldHVybiAtMSwgMCwgMSBmb3IgbGVzcyB0aGFuLCBlcXVhbCwKICAgIGdyZWF0ZXIgdGhhbiByZXNwLiAqLwogCiBQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX0NvbXBhcmUoCi0gICAgUHlPYmplY3QgKmxlZnQsCQkvKiBMZWZ0IHN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqcmlnaHQJCS8qIFJpZ2h0IHN0cmluZyAqLworICAgIFB5T2JqZWN0ICpsZWZ0LCAgICAgICAgICAgICAvKiBMZWZ0IHN0cmluZyAqLworICAgIFB5T2JqZWN0ICpyaWdodCAgICAgICAgICAgICAvKiBSaWdodCBzdHJpbmcgKi8KICAgICApOwogCiAvKiBSaWNoIGNvbXBhcmUgdHdvIHN0cmluZ3MgYW5kIHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZzoKQEAgLTEzMDQsMTcgKzEzMDQsMTcgQEAKICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlX1JpY2hDb21wYXJlKAotICAgIFB5T2JqZWN0ICpsZWZ0LAkJLyogTGVmdCBzdHJpbmcgKi8gCi0gICAgUHlPYmplY3QgKnJpZ2h0LAkJLyogUmlnaHQgc3RyaW5nICovCi0gICAgaW50IG9wCQkJLyogT3BlcmF0aW9uOiBQeV9FUSwgUHlfTkUsIFB5X0dULCBldGMuICovCisgICAgUHlPYmplY3QgKmxlZnQsICAgICAgICAgICAgIC8qIExlZnQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKnJpZ2h0LCAgICAgICAgICAgIC8qIFJpZ2h0IHN0cmluZyAqLworICAgIGludCBvcCAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVyYXRpb246IFB5X0VRLCBQeV9ORSwgUHlfR1QsIGV0Yy4gKi8KICAgICApOwogCiAvKiBBcHBseSBhIGFyZ3VtZW50IHR1cGxlIG9yIGRpY3Rpb25hcnkgdG8gYSBmb3JtYXQgc3RyaW5nIGFuZCByZXR1cm4KICAgIHRoZSByZXN1bHRpbmcgVW5pY29kZSBzdHJpbmcuICovCiAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlX0Zvcm1hdCgKLSAgICBQeU9iamVjdCAqZm9ybWF0LAkJLyogRm9ybWF0IHN0cmluZyAqLyAKLSAgICBQeU9iamVjdCAqYXJncwkJLyogQXJndW1lbnQgdHVwbGUgb3IgZGljdGlvbmFyeSAqLworICAgIFB5T2JqZWN0ICpmb3JtYXQsICAgICAgICAgICAvKiBGb3JtYXQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKmFyZ3MgICAgICAgICAgICAgIC8qIEFyZ3VtZW50IHR1cGxlIG9yIGRpY3Rpb25hcnkgKi8KICAgICApOwogCiAvKiBDaGVja3Mgd2hldGhlciBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiBjb250YWluZXIgYW5kIHJldHVybiAxLzAKQEAgLTEzMjQsOCArMTMyNCw4IEBACiAgICByZXR1cm5lZCBpbiBjYXNlIG9mIGFuIGVycm9yLiAqLwogCiBQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX0NvbnRhaW5zKAotICAgIFB5T2JqZWN0ICpjb250YWluZXIsCS8qIENvbnRhaW5lciBzdHJpbmcgKi8gCi0gICAgUHlPYmplY3QgKmVsZW1lbnQJCS8qIEVsZW1lbnQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKmNvbnRhaW5lciwgICAgICAgIC8qIENvbnRhaW5lciBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqZWxlbWVudCAgICAgICAgICAgLyogRWxlbWVudCBzdHJpbmcgKi8KICAgICApOwogCiAvKiBFeHRlcm5hbGx5IHZpc2libGUgZm9yIHN0ci5zdHJpcCh1bmljb2RlKSAqLwpAQCAtMTM0Miw3MCArMTM0Miw3MCBAQAogUHlBUElfREFUQShjb25zdCB1bnNpZ25lZCBjaGFyKSBfUHlfYXNjaWlfd2hpdGVzcGFjZVtdOwogCiAvKiBUaGVzZSBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuIFVzZSB0aGUgUHlfVU5JQ09ERV9JUyogYW5kCi0gICBQeV9VTklDT0RFX1RPKiBtYWNyb3MgaW5zdGVhZC4gCisgICBQeV9VTklDT0RFX1RPKiBtYWNyb3MgaW5zdGVhZC4KIAogICAgVGhlc2UgQVBJcyBhcmUgaW1wbGVtZW50ZWQgaW4gT2JqZWN0cy91bmljb2RlY3R5cGUuYy4KIAogKi8KIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNMb3dlcmNhc2UoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNVcHBlcmNhc2UoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNUaXRsZWNhc2UoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNXaGl0ZXNwYWNlKAotICAgIGNvbnN0IFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgY29uc3QgUHlfVU5JQ09ERSBjaCAgICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNMaW5lYnJlYWsoCi0gICAgY29uc3QgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBjb25zdCBQeV9VTklDT0RFIGNoICAgICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKFB5X1VOSUNPREUpIF9QeVVuaWNvZGVfVG9Mb3dlcmNhc2UoCi0gICAgUHlfVU5JQ09ERSBjaCAJLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCiAgICAgKTsKIAogUHlBUElfRlVOQyhQeV9VTklDT0RFKSBfUHlVbmljb2RlX1RvVXBwZXJjYXNlKAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoUHlfVU5JQ09ERSkgX1B5VW5pY29kZV9Ub1RpdGxlY2FzZSgKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Ub0RlY2ltYWxEaWdpdCgKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Ub0RpZ2l0KAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoZG91YmxlKSBfUHlVbmljb2RlX1RvTnVtZXJpYygKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0RlY2ltYWxEaWdpdCgKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0RpZ2l0KAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKIFB5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzTnVtZXJpYygKLSAgICBQeV9VTklDT0RFIGNoIAkvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KICAgICApOwogCiBQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0FscGhhKAotICAgIFB5X1VOSUNPREUgY2ggCS8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLwogICAgICk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvQ29sb3JQaWNrZXJtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL0NvbG9yUGlja2VybW9kdWxlLmMKaW5kZXggNDQwNjQyNi4uODI0ZDRkMyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvQ29sb3JQaWNrZXJtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9Db2xvclBpY2tlcm1vZHVsZS5jCkBAIC03LDE1ICs3LDE1IEBACiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CiBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSnVzdCB2YW4gUm9zc3VtIG5vdCBiZSAKLXVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSAKK3N1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgSnVzdCB2YW4gUm9zc3VtIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCiBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCiAKLUpVU1QgVkFOIFJPU1NVTSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgCi1JTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIAotRVZFTlQgU0hBTEwgSlVTVCBWQU4gUk9TU1VNIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIAotQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiAKLVVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiAKK0pVU1QgVkFOIFJPU1NVTSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKK0lOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KK0VWRU5UIFNIQUxMIEpVU1QgVkFOIFJPU1NVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRgorVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogCkBAIC0zNywxNyArMzcsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjcF9HZXRDb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUkdCQ29sb3IgaW5Db2xvciwgb3V0Q29sb3I7Ci0JQm9vbGVhbiBvazsKLQlQb2ludCB3aGVyZSA9IHswLCAwfTsKLQlTdHIyNTUgcHJvbXB0OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJiIsIFB5TWFjX0dldFN0cjI1NSwgcHJvbXB0LCBRZFJHQl9Db252ZXJ0LCAmaW5Db2xvcikpCi0JCXJldHVybiBOVUxMOwotCQotCW9rID0gR2V0Q29sb3Iod2hlcmUsIHByb21wdCwgJmluQ29sb3IsICZvdXRDb2xvcik7Ci0JCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8maCIsIFFkUkdCX05ldywgJm91dENvbG9yLCBvayk7CisgICAgUkdCQ29sb3IgaW5Db2xvciwgb3V0Q29sb3I7CisgICAgQm9vbGVhbiBvazsKKyAgICBQb2ludCB3aGVyZSA9IHswLCAwfTsKKyAgICBTdHIyNTUgcHJvbXB0OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mIiwgUHlNYWNfR2V0U3RyMjU1LCBwcm9tcHQsIFFkUkdCX0NvbnZlcnQsICZpbkNvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBvayA9IEdldENvbG9yKHdoZXJlLCBwcm9tcHQsICZpbkNvbG9yLCAmb3V0Q29sb3IpOworCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8maCIsIFFkUkdCX05ldywgJm91dENvbG9yLCBvayk7CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIApAQCAtNTUsMzYgKzU1LDM2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgY3BfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0Q29sb3IiLAkoUHlDRnVuY3Rpb24pY3BfR2V0Q29sb3IsCU1FVEhfVkFSQVJHUywJY3BfR2V0Q29sb3JfX2RvY19ffSwKKyAgICB7IkdldENvbG9yIiwgICAgICAgIChQeUNGdW5jdGlvbiljcF9HZXRDb2xvciwgICAgICAgTUVUSF9WQVJBUkdTLCAgIGNwX0dldENvbG9yX19kb2NfX30sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwJIAkJKFB5Q0Z1bmN0aW9uKU5VTEwsIAkJCTAsIAkJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKU5VTEwsICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIC8qIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlICgqbXVzdCogYmUgY2FsbGVkIGluaXRDb2xvclBpY2tlcikgKi8KIAotc3RhdGljIGNoYXIgY3BfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9IAorc3RhdGljIGNoYXIgY3BfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9CiAiIgogOwogCiB2b2lkIGluaXRDb2xvclBpY2tlcih2b2lkKQogewotCVB5T2JqZWN0ICptOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBDb2xvclBpY2tlciBpcyByZW1vdmVkLiIsIDEpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJDb2xvclBpY2tlciIsIGNwX21ldGhvZHMsCi0JCWNwX21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgQ29sb3JQaWNrZXIgaXMgcmVtb3ZlZC4iLCAxKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSBoZXJlICovCi0JCi0JLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KLQkKLQkvKiBDaGVjayBmb3IgZXJyb3JzICovCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIENvbG9yUGlja2VyIik7CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJDb2xvclBpY2tlciIsIGNwX21ldGhvZHMsCisgICAgICAgIGNwX21vZHVsZV9kb2N1bWVudGF0aW9uLAorICAgICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKworICAgIC8qIEFkZCBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSBoZXJlICovCisKKyAgICAvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLworCisgICAgLyogQ2hlY2sgZm9yIGVycm9ycyAqLworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIG1vZHVsZSBDb2xvclBpY2tlciIpOwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9NYWNPUy5jIGIvTWFjL01vZHVsZXMvTWFjT1MuYwppbmRleCAyNzJmZThkLi43OWIyNzY0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9NYWNPUy5jCisrKyBiL01hYy9Nb2R1bGVzL01hY09TLmMKQEAgLTQsMTAgKzQsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAogCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIFN0aWNodGluZyBNYXRoZW1hdGlzY2gKIENlbnRydW0gb3IgQ1dJIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCiBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KIAogI2lmbmRlZiBIQVZFX09TWDEwNV9TREsKLXR5cGVkZWYgU0ludDE2CUZTSU9SZWZOdW07Cit0eXBlZGVmIFNJbnQxNiAgRlNJT1JlZk51bTsKICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKk1hY09TX0Vycm9yOyAvKiBFeGNlcHRpb24gTWFjT1MuRXJyb3IgKi8KQEAgLTQzLDkgKzQzLDkgQEAKIC8qIERlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBvZiB0eXBlIFJlc291cmNlIGZvcmsgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlGU0lPUmVmTnVtIGZSZWZOdW07Ci0JaW50IGlzY2xvc2VkOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGU0lPUmVmTnVtIGZSZWZOdW07CisgICAgaW50IGlzY2xvc2VkOwogfSByZm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBSZnR5cGU7CkBAIC01NywxNjYgKzU3LDE2NiBAQAogc3RhdGljIHZvaWQKIGRvX2Nsb3NlKHJmb2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5pc2Nsb3NlZCApIHJldHVybjsKLQkodm9pZClGU0Nsb3NlRm9yayhzZWxmLT5mUmVmTnVtKTsKLQlzZWxmLT5pc2Nsb3NlZCA9IDE7CisgICAgaWYgKHNlbGYtPmlzY2xvc2VkICkgcmV0dXJuOworICAgICh2b2lkKUZTQ2xvc2VGb3JrKHNlbGYtPmZSZWZOdW0pOworICAgIHNlbGYtPmlzY2xvc2VkID0gMTsKIH0KIAotc3RhdGljIGNoYXIgcmZfcmVhZF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgcmZfcmVhZF9fZG9jX19bXSA9CiAiUmVhZCBkYXRhIGZyb20gcmVzb3VyY2UgZm9yayIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJmX3JlYWQocmZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgbjsKLQlQeU9iamVjdCAqdjsKLQlPU0VyciBlcnI7Ci0JQnl0ZUNvdW50IG4yOwotCQotCWlmIChzZWxmLT5pc2Nsb3NlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQkJCi0JdiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkJCi0JZXJyID0gRlNSZWFkRm9yayhzZWxmLT5mUmVmTnVtLCBmc0F0TWFyaywgMCwgbiwgUHlTdHJpbmdfQXNTdHJpbmcodiksICZuMik7Ci0JaWYgKGVyciAmJiBlcnIgIT0gZW9mRXJyKSB7Ci0JCVB5TWFjX0Vycm9yKGVycik7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCV9QeVN0cmluZ19SZXNpemUoJnYsIG4yKTsKLQlyZXR1cm4gdjsKKyAgICBsb25nIG47CisgICAgUHlPYmplY3QgKnY7CisgICAgT1NFcnIgZXJyOworICAgIEJ5dGVDb3VudCBuMjsKKworICAgIGlmIChzZWxmLT5pc2Nsb3NlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgdiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGVyciA9IEZTUmVhZEZvcmsoc2VsZi0+ZlJlZk51bSwgZnNBdE1hcmssIDAsIG4sIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCAmbjIpOworICAgIGlmIChlcnIgJiYgZXJyICE9IGVvZkVycikgeworICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfUHlTdHJpbmdfUmVzaXplKCZ2LCBuMik7CisgICAgcmV0dXJuIHY7CiB9CiAKIAotc3RhdGljIGNoYXIgcmZfd3JpdGVfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIHJmX3dyaXRlX19kb2NfX1tdID0KICJXcml0ZSB0byByZXNvdXJjZSBmb3JrIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcmZfd3JpdGUocmZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmJ1ZmZlcjsKLQlsb25nIHNpemU7Ci0JT1NFcnIgZXJyOwotCQotCWlmIChzZWxmLT5pc2Nsb3NlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIyIsICZidWZmZXIsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gRlNXcml0ZUZvcmsoc2VsZi0+ZlJlZk51bSwgZnNBdE1hcmssIDAsIHNpemUsIGJ1ZmZlciwgTlVMTCk7Ci0JaWYgKGVycikgewotCQlQeU1hY19FcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBsb25nIHNpemU7CisgICAgT1NFcnIgZXJyOworCisgICAgaWYgKHNlbGYtPmlzY2xvc2VkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiT3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjIiwgJmJ1ZmZlciwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBGU1dyaXRlRm9yayhzZWxmLT5mUmVmTnVtLCBmc0F0TWFyaywgMCwgc2l6ZSwgYnVmZmVyLCBOVUxMKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIGNoYXIgcmZfc2Vla19fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgcmZfc2Vla19fZG9jX19bXSA9CiAiU2V0IGZpbGUgcG9zaXRpb24iCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZl9zZWVrKHJmb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFtb3VudDsKLQlpbnQgd2hlbmNlID0gU0VFS19TRVQ7Ci0JaW50IG1vZGU7Ci0JT1NFcnIgZXJyOwotCQotCWlmIChzZWxmLT5pc2Nsb3NlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsfGkiLCAmYW1vdW50LCAmd2hlbmNlKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0Jc3dpdGNoICh3aGVuY2UpIHsKLQljYXNlIFNFRUtfQ1VSOgotCQltb2RlID0gZnNGcm9tTWFyazsKLQkJYnJlYWs7Ci0JY2FzZSBTRUVLX0VORDoKLQkJbW9kZSA9IGZzRnJvbUxFT0Y7Ci0JCWJyZWFrOwotCWNhc2UgU0VFS19TRVQ6Ci0JCW1vZGUgPSBmc0Zyb21TdGFydDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGxvbmcgYW1vdW50OworICAgIGludCB3aGVuY2UgPSBTRUVLX1NFVDsKKyAgICBpbnQgbW9kZTsKKyAgICBPU0VyciBlcnI7CiAKLQllcnIgPSBGU1NldEZvcmtQb3NpdGlvbihzZWxmLT5mUmVmTnVtLCBtb2RlLCBhbW91bnQpOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJUHlNYWNfRXJyb3IoZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoc2VsZi0+aXNjbG9zZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJPcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibHxpIiwgJmFtb3VudCwgJndoZW5jZSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3dpdGNoICh3aGVuY2UpIHsKKyAgICBjYXNlIFNFRUtfQ1VSOgorICAgICAgICBtb2RlID0gZnNGcm9tTWFyazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUVLX0VORDoKKyAgICAgICAgbW9kZSA9IGZzRnJvbUxFT0Y7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VFS19TRVQ6CisgICAgICAgIG1vZGUgPSBmc0Zyb21TdGFydDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZXJyID0gRlNTZXRGb3JrUG9zaXRpb24oc2VsZi0+ZlJlZk51bSwgbW9kZSwgYW1vdW50KTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIGNoYXIgcmZfdGVsbF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgcmZfdGVsbF9fZG9jX19bXSA9CiAiR2V0IGZpbGUgcG9zaXRpb24iCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZl90ZWxsKHJmb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGxvbmcgd2hlcmU7Ci0JT1NFcnIgZXJyOwotCQotCWlmIChzZWxmLT5pc2Nsb3NlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgbG9uZyBsb25nIHdoZXJlOworICAgIE9TRXJyIGVycjsKIAotCWVyciA9IEZTR2V0Rm9ya1Bvc2l0aW9uKHNlbGYtPmZSZWZOdW0sICZ3aGVyZSk7Ci0JaWYgKGVyciAhPSBub0VycikgewotCQlQeU1hY19FcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcod2hlcmUpOworICAgIGlmIChzZWxmLT5pc2Nsb3NlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBlcnIgPSBGU0dldEZvcmtQb3NpdGlvbihzZWxmLT5mUmVmTnVtLCAmd2hlcmUpOworICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHdoZXJlKTsKIH0KIAotc3RhdGljIGNoYXIgcmZfY2xvc2VfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIHJmX2Nsb3NlX19kb2NfX1tdID0KICJDbG9zZSByZXNvdXJjZSBmb3JrIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcmZfY2xvc2UocmZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWRvX2Nsb3NlKHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkb19jbG9zZShzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiByZl9tZXRob2RzW10gPSB7Ci0geyJyZWFkIiwJKFB5Q0Z1bmN0aW9uKXJmX3JlYWQsCTEsCXJmX3JlYWRfX2RvY19ffSwKLSB7IndyaXRlIiwJKFB5Q0Z1bmN0aW9uKXJmX3dyaXRlLAkxLAlyZl93cml0ZV9fZG9jX199LAotIHsic2VlayIsCShQeUNGdW5jdGlvbilyZl9zZWVrLAkxLAlyZl9zZWVrX19kb2NfX30sCi0geyJ0ZWxsIiwJKFB5Q0Z1bmN0aW9uKXJmX3RlbGwsCTEsCXJmX3RlbGxfX2RvY19ffSwKLSB7ImNsb3NlIiwJKFB5Q0Z1bmN0aW9uKXJmX2Nsb3NlLAkxLAlyZl9jbG9zZV9fZG9jX199LAotIAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgeyJyZWFkIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXJmX3JlYWQsICAgMSwgICAgICByZl9yZWFkX19kb2NfX30sCisgeyJ3cml0ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXJmX3dyaXRlLCAgMSwgICAgICByZl93cml0ZV9fZG9jX199LAorIHsic2VlayIsICAgICAgIChQeUNGdW5jdGlvbilyZl9zZWVrLCAgIDEsICAgICAgcmZfc2Vla19fZG9jX199LAorIHsidGVsbCIsICAgICAgIChQeUNGdW5jdGlvbilyZl90ZWxsLCAgIDEsICAgICAgcmZfdGVsbF9fZG9jX199LAorIHsiY2xvc2UiLCAgICAgIChQeUNGdW5jdGlvbilyZl9jbG9zZSwgIDEsICAgICAgcmZfY2xvc2VfX2RvY19ffSwKKworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiAtLS0tLS0tLS0tICovCkBAIC0yMjUsNTYgKzIyNSw1NiBAQAogc3RhdGljIHJmb2JqZWN0ICoKIG5ld3Jmb2JqZWN0KHZvaWQpCiB7Ci0JcmZvYmplY3QgKnNlbGY7Ci0JCi0Jc2VsZiA9IFB5T2JqZWN0X05FVyhyZm9iamVjdCwgJlJmdHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+aXNjbG9zZWQgPSAxOwotCXJldHVybiBzZWxmOworICAgIHJmb2JqZWN0ICpzZWxmOworCisgICAgc2VsZiA9IFB5T2JqZWN0X05FVyhyZm9iamVjdCwgJlJmdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+aXNjbG9zZWQgPSAxOworICAgIHJldHVybiBzZWxmOwogfQogCiAKIHN0YXRpYyB2b2lkCiByZl9kZWFsbG9jKHJmb2JqZWN0ICpzZWxmKQogewotCWRvX2Nsb3NlKHNlbGYpOwotCVB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICBkb19jbG9zZShzZWxmKTsKKyAgICBQeU9iamVjdF9ERUwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZl9nZXRhdHRyKHJmb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKHJmX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKHJmX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCi1zdGF0aWMgY2hhciBSZnR5cGVfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIFJmdHlwZV9fZG9jX19bXSA9CiAiUmVzb3VyY2UgZm9yayBmaWxlIG9iamVjdCIKIDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBSZnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJNYWNPUy5SZXNvdXJjZUZvcmsiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YocmZvYmplY3QpLAkJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilyZl9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylyZl9nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLAkvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKTAsCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykwLAkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCS8qdHBfYXNfbWFwcGluZyovCi0JKGhhc2hmdW5jKTAsCQkvKnRwX2hhc2gqLwotCSh0ZXJuYXJ5ZnVuYykwLAkJLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgIk1hY09TLlJlc291cmNlRm9yayIsICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YocmZvYmplY3QpLCAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXJmX2RlYWxsb2MsICAgICAvKnRwX2RlYWxsb2MqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpcmZfZ2V0YXR0ciwgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAKLQkvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCTBMLDBMLDBMLDBMLAotCVJmdHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KKyAgICAvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAgIDBMLDBMLDBMLDBMLAorICAgIFJmdHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KIH07CiAKIApAQCAtMjg5LDY1ICsyODksNjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19HZXRDcmVhdG9yQW5kVHlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmNyZWF0b3IsICp0eXBlLCAqcmVzOwotCU9TRXJyIGVycjsKLQlGU1JlZiByZWY7Ci0JRlNDYXRhbG9nSW5mbwljYXRhbG9naW5mbzsKLQlGaWxlSW5mbyogZmluZm87CisgICAgUHlPYmplY3QgKmNyZWF0b3IsICp0eXBlLCAqcmVzOworICAgIE9TRXJyIGVycjsKKyAgICBGU1JlZiByZWY7CisgICAgRlNDYXRhbG9nSW5mbyAgICAgICBjYXRhbG9naW5mbzsKKyAgICBGaWxlSW5mbyogZmluZm87CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0RlNSZWYsICZyZWYpKSB7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldEZTUmVmLCAmcmVmKSkgewogI2lmbmRlZiBfX0xQNjRfXwotCQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGRvY3VtZW50ZWQgdG8gdGFrZSBhbiBGU1NwZWMgYXMgd2VsbCwKLQkJICogd2hpY2ggb25seSB3b3JrcyBpbiAzMi1iaXQgbW9kZS4KLQkJICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCUZTU3BlYyBmc3M7Ci0JCUZJbmZvIGluZm87CisgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgZG9jdW1lbnRlZCB0byB0YWtlIGFuIEZTU3BlYyBhcyB3ZWxsLAorICAgICAgICAgKiB3aGljaCBvbmx5IHdvcmtzIGluIDMyLWJpdCBtb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgRlNTcGVjIGZzczsKKyAgICAgICAgRkluZm8gaW5mbzsKIAotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0RlNTcGVjLCAmZnNzKSkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0RlNTcGVjLCAmZnNzKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCWlmICgoZXJyID0gRlNwR2V0RkluZm8oJmZzcywgJmluZm8pKSAhPSBub0VycikgewotCQkJcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKLQkJfQotCQljcmVhdG9yID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0JCQkJKGNoYXIgKikmaW5mby5mZENyZWF0b3IsIDQpOwotCQl0eXBlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmaW5mby5mZFR5cGUsIDQpOwotCQlyZXMgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIGNyZWF0b3IsIHR5cGUpOwotCQlQeV9ERUNSRUYoY3JlYXRvcik7Ci0JCVB5X0RFQ1JFRih0eXBlKTsKLQkJcmV0dXJuIHJlczsKLSNlbHNlCS8qIF9fTFA2NF9fICovCi0JCXJldHVybiBOVUxMOwotI2VuZGlmCS8qIF9fTFA2NF9fICovCi0JfQorICAgICAgICBpZiAoKGVyciA9IEZTcEdldEZJbmZvKCZmc3MsICZpbmZvKSkgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGVycik7CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRvciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmaW5mby5mZENyZWF0b3IsIDQpOworICAgICAgICB0eXBlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmaW5mby5mZFR5cGUsIDQpOworICAgICAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIGNyZWF0b3IsIHR5cGUpOworICAgICAgICBQeV9ERUNSRUYoY3JlYXRvcik7CisgICAgICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyNlbHNlICAgLyogX19MUDY0X18gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYgIC8qIF9fTFA2NF9fICovCisgICAgfQogCi0JZXJyID0gRlNHZXRDYXRhbG9nSW5mbygmcmVmLCAKLQkJCWtGU0NhdEluZm9GaW5kZXJJbmZvfGtGU0NhdEluZm9Ob2RlRmxhZ3MsICZjYXRhbG9naW5mbywgCi0JCQlOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCVB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJnJlZiwKKyAgICAgICAgICAgICAgICAgICAga0ZTQ2F0SW5mb0ZpbmRlckluZm98a0ZTQ2F0SW5mb05vZGVGbGFncywgJmNhdGFsb2dpbmZvLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKChjYXRhbG9naW5mby5ub2RlRmxhZ3MgJiBrRlNOb2RlSXNEaXJlY3RvcnlNYXNrKSAhPSAwKSB7Ci0JCS8qIERpcmVjdG9yeTogZG9lc24ndCBoYXZlIHR5cGUvY3JlYXRvciBpbmZvLgotCQkgKgotCQkgKiBUaGUgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCi0JCSAqIGVhcmxpZXIgdmVyc2lvbnMuCi0JCSAqLwotCQlQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGZuZkVycik7Ci0JCXJldHVybiBOVUxMOworICAgIGlmICgoY2F0YWxvZ2luZm8ubm9kZUZsYWdzICYga0ZTTm9kZUlzRGlyZWN0b3J5TWFzaykgIT0gMCkgeworICAgICAgICAvKiBEaXJlY3Rvcnk6IGRvZXNuJ3QgaGF2ZSB0eXBlL2NyZWF0b3IgaW5mby4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHNwZWNpZmljIGVycm9yIGNvZGUgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAorICAgICAgICAgKiBlYXJsaWVyIHZlcnNpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBmbmZFcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKIAotCX0gCi0JZmluZm8gPSAoRmlsZUluZm8qKSYoY2F0YWxvZ2luZm8uZmluZGVySW5mbyk7Ci0JY3JlYXRvciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKikmKGZpbmZvLT5maWxlQ3JlYXRvciksIDQpOwotCXR5cGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopJihmaW5mby0+ZmlsZVR5cGUpLCA0KTsKKyAgICB9CisgICAgZmluZm8gPSAoRmlsZUluZm8qKSYoY2F0YWxvZ2luZm8uZmluZGVySW5mbyk7CisgICAgY3JlYXRvciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKikmKGZpbmZvLT5maWxlQ3JlYXRvciksIDQpOworICAgIHR5cGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopJihmaW5mby0+ZmlsZVR5cGUpLCA0KTsKIAotCXJlcyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgY3JlYXRvciwgdHlwZSk7Ci0JUHlfREVDUkVGKGNyZWF0b3IpOwotCVB5X0RFQ1JFRih0eXBlKTsKLQlyZXR1cm4gcmVzOworICAgIHJlcyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgY3JlYXRvciwgdHlwZSk7CisgICAgUHlfREVDUkVGKGNyZWF0b3IpOworICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgY2hhciBzZXRjcnRwX2RvY1tdID0gIlNldCBNYWNPUyA0LWNoYXIgY3JlYXRvciBhbmQgdHlwZSBmb3IgYSBmaWxlIjsKQEAgLTM1NSw2OCArMzU1LDY4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfU2V0Q3JlYXRvckFuZFR5cGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVJlc1R5cGUgY3JlYXRvciwgdHlwZTsKLQlGU1JlZiByZWY7Ci0JRmlsZUluZm8qIGZpbmZvOwotCU9TRXJyIGVycjsKLQlGU0NhdGFsb2dJbmZvCWNhdGFsb2dpbmZvOworICAgIFJlc1R5cGUgY3JlYXRvciwgdHlwZTsKKyAgICBGU1JlZiByZWY7CisgICAgRmlsZUluZm8qIGZpbmZvOworICAgIE9TRXJyIGVycjsKKyAgICBGU0NhdGFsb2dJbmZvICAgICAgIGNhdGFsb2dpbmZvOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyYiLAotCQkJUHlNYWNfR2V0RlNSZWYsICZyZWYsIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsIFB5TWFjX0dldE9TVHlwZSwgJnR5cGUpKSB7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlZiwgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZSkpIHsKICNpZm5kZWYgX19MUDY0X18KLQkJLyogVHJ5IHRvIGhhbmRsZSBGU1NwZWMgYXJndW1lbnRzLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCQlGU1NwZWMgZnNzOwotCQlGSW5mbyBpbmZvOworICAgICAgICAvKiBUcnkgdG8gaGFuZGxlIEZTU3BlYyBhcmd1bWVudHMsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisgICAgICAgIEZTU3BlYyBmc3M7CisgICAgICAgIEZJbmZvIGluZm87CiAKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyYiLAotCQkJUHlNYWNfR2V0RlNTcGVjLCAmZnNzLCBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLCBQeU1hY19HZXRPU1R5cGUsICZ0eXBlKSkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsIFB5TWFjX0dldE9TVHlwZSwgJnR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKChlcnIgPSBGU3BHZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQotCQkJcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgaWYgKChlcnIgPSBGU3BHZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKIAotCQlpbmZvLmZkQ3JlYXRvciA9IGNyZWF0b3I7Ci0JCWluZm8uZmRUeXBlID0gdHlwZTsKKyAgICAgICAgaW5mby5mZENyZWF0b3IgPSBjcmVhdG9yOworICAgICAgICBpbmZvLmZkVHlwZSA9IHR5cGU7CiAKLQkJaWYgKChlcnIgPSBGU3BTZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQotCQkJcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgaWYgKChlcnIgPSBGU3BTZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKICNlbHNlIC8qIF9fTFA2NF9fICovCi0JCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCX0KLQkKLQllcnIgPSBGU0dldENhdGFsb2dJbmZvKCZyZWYsIAotCQkJa0ZTQ2F0SW5mb0ZpbmRlckluZm98a0ZTQ2F0SW5mb05vZGVGbGFncywgJmNhdGFsb2dpbmZvLCAKLQkJCU5VTEwsIE5VTEwsIE5VTEwpOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfQogCi0JaWYgKChjYXRhbG9naW5mby5ub2RlRmxhZ3MgJiBrRlNOb2RlSXNEaXJlY3RvcnlNYXNrKSAhPSAwKSB7Ci0JCS8qIERpcmVjdG9yeTogZG9lc24ndCBoYXZlIHR5cGUvY3JlYXRvciBpbmZvLgotCQkgKgotCQkgKiBUaGUgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCi0JCSAqIGVhcmxpZXIgdmVyc2lvbnMuCi0JCSAqLwotCQlQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGZuZkVycik7Ci0JCXJldHVybiBOVUxMOworICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJnJlZiwKKyAgICAgICAgICAgICAgICAgICAga0ZTQ2F0SW5mb0ZpbmRlckluZm98a0ZTQ2F0SW5mb05vZGVGbGFncywgJmNhdGFsb2dpbmZvLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JfSAKLQlmaW5mbyA9IChGaWxlSW5mbyopJihjYXRhbG9naW5mby5maW5kZXJJbmZvKTsKLQlmaW5mby0+ZmlsZUNyZWF0b3IgPSBjcmVhdG9yOwotCWZpbmZvLT5maWxlVHlwZSA9IHR5cGU7CisgICAgaWYgKChjYXRhbG9naW5mby5ub2RlRmxhZ3MgJiBrRlNOb2RlSXNEaXJlY3RvcnlNYXNrKSAhPSAwKSB7CisgICAgICAgIC8qIERpcmVjdG9yeTogZG9lc24ndCBoYXZlIHR5cGUvY3JlYXRvciBpbmZvLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgICAgICAqIGVhcmxpZXIgdmVyc2lvbnMuCisgICAgICAgICAqLworICAgICAgICBQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGZuZkVycik7CisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyID0gRlNTZXRDYXRhbG9nSW5mbygmcmVmLCBrRlNDYXRJbmZvRmluZGVySW5mbywgJmNhdGFsb2dpbmZvKTsKLQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCVB5RXJyX01hYyhNYWNPU19FcnJvciwgZm5mRXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIH0KKyAgICBmaW5mbyA9IChGaWxlSW5mbyopJihjYXRhbG9naW5mby5maW5kZXJJbmZvKTsKKyAgICBmaW5mby0+ZmlsZUNyZWF0b3IgPSBjcmVhdG9yOworICAgIGZpbmZvLT5maWxlVHlwZSA9IHR5cGU7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZXJyID0gRlNTZXRDYXRhbG9nSW5mbygmcmVmLCBrRlNDYXRJbmZvRmluZGVySW5mbywgJmNhdGFsb2dpbmZvKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZm5mRXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTQyNSw2NSArNDI1LDY1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfR2V0RXJyb3JTdHJpbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBlcnI7Ci0JY2hhciBidWZbMjU2XTsKLQlIYW5kbGUgaDsKLQljaGFyICpzdHI7Ci0Jc3RhdGljIGludCBlcnJvcnNfbG9hZGVkOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZlcnIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgZXJyOworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgSGFuZGxlIGg7CisgICAgY2hhciAqc3RyOworICAgIHN0YXRpYyBpbnQgZXJyb3JzX2xvYWRlZDsKIAotCWggPSBHZXRSZXNvdXJjZSgnRXN0cicsIGVycik7Ci0JaWYgKCFoICYmICFlcnJvcnNfbG9hZGVkKSB7Ci0JCS8qCi0JCSoqIEF0dGVtcHQgdG8gb3BlbiB0aGUgcmVzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZQotCQkqKiBFc3RyIHJlc291cmNlcy4gV2UgaWdub3JlIGFsbCBlcnJvcnMuIFdlIGFsc28gdHJ5Ci0JCSoqIHRoaXMgb25seSBvbmNlLgotCQkqLwotCQlQeU9iamVjdCAqbSwgKnJ2OwotCQllcnJvcnNfbG9hZGVkID0gMTsKLQkJCi0JCW0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJtYWNyZXNvdXJjZSIpOwotCQlpZiAoIW0pIHsKLQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQlQeUVycl9QcmludCgpOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJ2ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChtLCAib3Blbl9lcnJvcl9yZXNvdXJjZSIsICIiKTsKLQkJCWlmICghcnYpIHsKLQkJCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQkJCVB5RXJyX1ByaW50KCk7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJLyogQW5kIHRyeSBhZ2Fpbi4uLiAqLwotCQkJCWggPSBHZXRSZXNvdXJjZSgnRXN0cicsIGVycik7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYobSk7Ci0JCX0KLQl9Ci0JLyoKLQkqKiBXaGV0aGVyIHRoZSBjb2RlIGFib3ZlIHN1Y2NlZWRlZCBvciBub3QsIHdlIHdvbid0IHRyeQotCSoqIGFnYWluLgotCSovCi0JZXJyb3JzX2xvYWRlZCA9IDE7Ci0JCQotCWlmIChoKSB7Ci0JCUhMb2NrKGgpOwotCQlzdHIgPSAoY2hhciAqKSpoOwotCQltZW1jcHkoYnVmLCBzdHIrMSwgKHVuc2lnbmVkIGNoYXIpc3RyWzBdKTsKLQkJYnVmWyh1bnNpZ25lZCBjaGFyKXN0clswXV0gPSAnXDAnOwotCQlIVW5sb2NrKGgpOwotCQlSZWxlYXNlUmVzb3VyY2UoaCk7Ci0JfQotCWVsc2UgewotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJNYWMgT1MgZXJyb3IgY29kZSAlZCIsIGVycik7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZlcnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJzIiwgYnVmKTsKKyAgICBoID0gR2V0UmVzb3VyY2UoJ0VzdHInLCBlcnIpOworICAgIGlmICghaCAmJiAhZXJyb3JzX2xvYWRlZCkgeworICAgICAgICAvKgorICAgICAgICAqKiBBdHRlbXB0IHRvIG9wZW4gdGhlIHJlc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICAgICAgKiogRXN0ciByZXNvdXJjZXMuIFdlIGlnbm9yZSBhbGwgZXJyb3JzLiBXZSBhbHNvIHRyeQorICAgICAgICAqKiB0aGlzIG9ubHkgb25jZS4KKyAgICAgICAgKi8KKyAgICAgICAgUHlPYmplY3QgKm0sICpydjsKKyAgICAgICAgZXJyb3JzX2xvYWRlZCA9IDE7CisKKyAgICAgICAgbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIm1hY3Jlc291cmNlIik7CisgICAgICAgIGlmICghbSkgeworICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcnYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG0sICJvcGVuX2Vycm9yX3Jlc291cmNlIiwgIiIpOworICAgICAgICAgICAgaWYgKCFydikgeworICAgICAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICAvKiBBbmQgdHJ5IGFnYWluLi4uICovCisgICAgICAgICAgICAgICAgaCA9IEdldFJlc291cmNlKCdFc3RyJywgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICoqIFdoZXRoZXIgdGhlIGNvZGUgYWJvdmUgc3VjY2VlZGVkIG9yIG5vdCwgd2Ugd29uJ3QgdHJ5CisgICAgKiogYWdhaW4uCisgICAgKi8KKyAgICBlcnJvcnNfbG9hZGVkID0gMTsKKworICAgIGlmIChoKSB7CisgICAgICAgIEhMb2NrKGgpOworICAgICAgICBzdHIgPSAoY2hhciAqKSpoOworICAgICAgICBtZW1jcHkoYnVmLCBzdHIrMSwgKHVuc2lnbmVkIGNoYXIpc3RyWzBdKTsKKyAgICAgICAgYnVmWyh1bnNpZ25lZCBjaGFyKXN0clswXV0gPSAnXDAnOworICAgICAgICBIVW5sb2NrKGgpOworICAgICAgICBSZWxlYXNlUmVzb3VyY2UoaCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJNYWMgT1MgZXJyb3IgY29kZSAlZCIsIGVycik7CisgICAgfQorCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBidWYpOwogfQogCiAKQEAgLTQ5NCw0MiArNDk0LDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1Nfc3BsYXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzaWQgPSAtMTsKLQlzdGF0aWMgRGlhbG9nUHRyIGN1cmRpYWxvZyA9IE5VTEw7Ci0JRGlhbG9nUHRyIG9sZGRpYWxvZzsKLQlXaW5kb3dSZWYgdGhlV2luZG93OwotCUNHcmFmUHRyIHRoZVBvcnQ7CisgICAgaW50IHJlc2lkID0gLTE7CisgICAgc3RhdGljIERpYWxvZ1B0ciBjdXJkaWFsb2cgPSBOVUxMOworICAgIERpYWxvZ1B0ciBvbGRkaWFsb2c7CisgICAgV2luZG93UmVmIHRoZVdpbmRvdzsKKyAgICBDR3JhZlB0ciB0aGVQb3J0OwogI2lmIDAKLQlzaG9ydCB4cG9zLCB5cG9zLCB3aWR0aCwgaGVpZ2h0LCBzd2lkdGgsIHNoZWlnaHQ7CisgICAgc2hvcnQgeHBvcywgeXBvcywgd2lkdGgsIGhlaWdodCwgc3dpZHRoLCBzaGVpZ2h0OwogI2VuZGlmCi0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aSIsICZyZXNpZCkpCi0JCXJldHVybiBOVUxMOwotCW9sZGRpYWxvZyA9IGN1cmRpYWxvZzsKLQljdXJkaWFsb2cgPSBOVUxMOwogCi0JaWYgKCByZXNpZCAhPSAtMSApIHsKLQkJY3VyZGlhbG9nID0gR2V0TmV3RGlhbG9nKHJlc2lkLCBOVUxMLCAoV2luZG93UHRyKS0xKTsKLQkJaWYgKCBjdXJkaWFsb2cgKSB7Ci0JCQl0aGVXaW5kb3cgPSBHZXREaWFsb2dXaW5kb3coY3VyZGlhbG9nKTsKLQkJCXRoZVBvcnQgPSBHZXRXaW5kb3dQb3J0KHRoZVdpbmRvdyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aSIsICZyZXNpZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9sZGRpYWxvZyA9IGN1cmRpYWxvZzsKKyAgICBjdXJkaWFsb2cgPSBOVUxMOworCisgICAgaWYgKCByZXNpZCAhPSAtMSApIHsKKyAgICAgICAgY3VyZGlhbG9nID0gR2V0TmV3RGlhbG9nKHJlc2lkLCBOVUxMLCAoV2luZG93UHRyKS0xKTsKKyAgICAgICAgaWYgKCBjdXJkaWFsb2cgKSB7CisgICAgICAgICAgICB0aGVXaW5kb3cgPSBHZXREaWFsb2dXaW5kb3coY3VyZGlhbG9nKTsKKyAgICAgICAgICAgIHRoZVBvcnQgPSBHZXRXaW5kb3dQb3J0KHRoZVdpbmRvdyk7CiAjaWYgMAotCQkJd2lkdGggPSB0aGVQb3J0LT5wb3J0UmVjdC5yaWdodCAtIHRoZVBvcnQtPnBvcnRSZWN0LmxlZnQ7Ci0JCQloZWlnaHQgPSB0aGVQb3J0LT5wb3J0UmVjdC5ib3R0b20gLSB0aGVQb3J0LT5wb3J0UmVjdC50b3A7Ci0JCQlzd2lkdGggPSBxZC5zY3JlZW5CaXRzLmJvdW5kcy5yaWdodCAtIHFkLnNjcmVlbkJpdHMuYm91bmRzLmxlZnQ7Ci0JCQlzaGVpZ2h0ID0gcWQuc2NyZWVuQml0cy5ib3VuZHMuYm90dG9tIC0gcWQuc2NyZWVuQml0cy5ib3VuZHMudG9wIC0gTE1HZXRNQmFySGVpZ2h0KCk7Ci0JCQl4cG9zID0gKHN3aWR0aC13aWR0aCkvMjsKLQkJCXlwb3MgPSAoc2hlaWdodC1oZWlnaHQpLzUgKyBMTUdldE1CYXJIZWlnaHQoKTsKLQkJCU1vdmVXaW5kb3codGhlV2luZG93LCB4cG9zLCB5cG9zLCAwKTsKLQkJCVNob3dXaW5kb3codGhlV2luZG93KTsKKyAgICAgICAgICAgIHdpZHRoID0gdGhlUG9ydC0+cG9ydFJlY3QucmlnaHQgLSB0aGVQb3J0LT5wb3J0UmVjdC5sZWZ0OworICAgICAgICAgICAgaGVpZ2h0ID0gdGhlUG9ydC0+cG9ydFJlY3QuYm90dG9tIC0gdGhlUG9ydC0+cG9ydFJlY3QudG9wOworICAgICAgICAgICAgc3dpZHRoID0gcWQuc2NyZWVuQml0cy5ib3VuZHMucmlnaHQgLSBxZC5zY3JlZW5CaXRzLmJvdW5kcy5sZWZ0OworICAgICAgICAgICAgc2hlaWdodCA9IHFkLnNjcmVlbkJpdHMuYm91bmRzLmJvdHRvbSAtIHFkLnNjcmVlbkJpdHMuYm91bmRzLnRvcCAtIExNR2V0TUJhckhlaWdodCgpOworICAgICAgICAgICAgeHBvcyA9IChzd2lkdGgtd2lkdGgpLzI7CisgICAgICAgICAgICB5cG9zID0gKHNoZWlnaHQtaGVpZ2h0KS81ICsgTE1HZXRNQmFySGVpZ2h0KCk7CisgICAgICAgICAgICBNb3ZlV2luZG93KHRoZVdpbmRvdywgeHBvcywgeXBvcywgMCk7CisgICAgICAgICAgICBTaG93V2luZG93KHRoZVdpbmRvdyk7CiAjZW5kaWYKLQkJCURyYXdEaWFsb2coY3VyZGlhbG9nKTsKLQkJfQotCX0KLQlpZiAob2xkZGlhbG9nKQotCQlEaXNwb3NlRGlhbG9nKG9sZGRpYWxvZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgICAgICAgICAgRHJhd0RpYWxvZyhjdXJkaWFsb2cpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvbGRkaWFsb2cpCisgICAgICAgIERpc3Bvc2VEaWFsb2cob2xkZGlhbG9nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBjaGFyIERlYnVnU3RyX2RvY1tdID0gIlN3aXRjaCB0byBsb3ctbGV2ZWwgZGVidWdnZXIgd2l0aCBhIG1lc3NhZ2UiOwpAQCAtNTM3LDE1ICs1MzcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19EZWJ1Z1N0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU3RyMjU1IG1lc3NhZ2U7Ci0JUHlPYmplY3QgKm9iamVjdCA9IDA7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxPIiwgUHlNYWNfR2V0U3RyMjU1LCBtZXNzYWdlLCAmb2JqZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JRGVidWdTdHIobWVzc2FnZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFN0cjI1NSBtZXNzYWdlOworICAgIFB5T2JqZWN0ICpvYmplY3QgPSAwOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxPIiwgUHlNYWNfR2V0U3RyMjU1LCBtZXNzYWdlLCAmb2JqZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBEZWJ1Z1N0cihtZXNzYWdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtNTU0LDU5ICs1NTQsNTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19TeXNCZWVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZHVyYXRpb24gPSA2OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGkiLCAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTeXNCZWVwKGR1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IGR1cmF0aW9uID0gNjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGkiLCAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTeXNCZWVwKGR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi1zdGF0aWMgY2hhciBXTUF2YWlsYWJsZV9kb2NbXSA9IAotCSJUcnVlIGlmIHRoaXMgcHJvY2VzcyBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgZGlzcGxheS4iCi0JIldpbGwgZm9yZWdyb3VuZCB0aGUgYXBwbGljYXRpb24gb24gdGhlIGZpcnN0IGNhbGwgYXMgYSBzaWRlLWVmZmVjdC4iCi0JOworc3RhdGljIGNoYXIgV01BdmFpbGFibGVfZG9jW10gPQorICAgICJUcnVlIGlmIHRoaXMgcHJvY2VzcyBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgZGlzcGxheS4iCisgICAgIldpbGwgZm9yZWdyb3VuZCB0aGUgYXBwbGljYXRpb24gb24gdGhlIGZpcnN0IGNhbGwgYXMgYSBzaWRlLWVmZmVjdC4iCisgICAgOwogCiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfV01BdmFpbGFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YXRpYyBQeU9iamVjdCAqcnYgPSBOVUxMOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICghcnYpIHsKLQkJUHJvY2Vzc1NlcmlhbE51bWJlciBwc247Ci0JCQotCQkvKgotCQkqKiBUaGlzIGlzIGEgZmFpcmx5IGlubm9jdW91cyBjYWxsIHRvIG1ha2UgaWYgd2UgZG9uJ3QgaGF2ZSBhIHdpbmRvdwotCQkqKiBtYW5hZ2VyLCBvciBpZiB3ZSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gdGFsayB0byBpdC4gSXQgd2lsbCBwcmludAotCQkqKiBhIG1lc3NhZ2Ugb24gc3RkZXJyLCBidXQgYXQgbGVhc3QgaXQgd29uJ3QgYWJvcnQgdGhlIHByb2Nlc3MuCi0JCSoqIEl0IGFwcGVhcnMgdGhlIGZ1bmN0aW9uIGNhY2hlcyB0aGUgcmVzdWx0IGl0c2VsZiwgYW5kIGl0J3MgY2hlYXAsIHNvCi0JCSoqIG5vIG5lZWQgZm9yIHVzIHRvIGNhY2hlLgotCQkqLworICAgIHN0YXRpYyBQeU9iamVjdCAqcnYgPSBOVUxMOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFydikgeworICAgICAgICBQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbjsKKworICAgICAgICAvKgorICAgICAgICAqKiBUaGlzIGlzIGEgZmFpcmx5IGlubm9jdW91cyBjYWxsIHRvIG1ha2UgaWYgd2UgZG9uJ3QgaGF2ZSBhIHdpbmRvdworICAgICAgICAqKiBtYW5hZ2VyLCBvciBpZiB3ZSBoYXZlIG5vIHBlcm1pc3Npb24gdG8gdGFsayB0byBpdC4gSXQgd2lsbCBwcmludAorICAgICAgICAqKiBhIG1lc3NhZ2Ugb24gc3RkZXJyLCBidXQgYXQgbGVhc3QgaXQgd29uJ3QgYWJvcnQgdGhlIHByb2Nlc3MuCisgICAgICAgICoqIEl0IGFwcGVhcnMgdGhlIGZ1bmN0aW9uIGNhY2hlcyB0aGUgcmVzdWx0IGl0c2VsZiwgYW5kIGl0J3MgY2hlYXAsIHNvCisgICAgICAgICoqIG5vIG5lZWQgZm9yIHVzIHRvIGNhY2hlLgorICAgICAgICAqLwogI2lmZGVmIGtDR051bGxEaXJlY3REaXNwbGF5Ci0JCS8qIE9uIDEwLjEgQ0dNYWluRGlzcGxheUlEKCkgaXNuJ3QgYXZhaWxhYmxlLCBhbmQKLQkJKioga0NHTnVsbERpcmVjdERpc3BsYXkgaXNuJ3QgZGVmaW5lZC4KLQkJKi8KLQkJaWYgKENHTWFpbkRpc3BsYXlJRCgpID09IDApIHsKLQkJCXJ2ID0gUHlfRmFsc2U7Ci0JCX0gZWxzZSB7CisgICAgICAgIC8qIE9uIDEwLjEgQ0dNYWluRGlzcGxheUlEKCkgaXNuJ3QgYXZhaWxhYmxlLCBhbmQKKyAgICAgICAgKioga0NHTnVsbERpcmVjdERpc3BsYXkgaXNuJ3QgZGVmaW5lZC4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKENHTWFpbkRpc3BsYXlJRCgpID09IDApIHsKKyAgICAgICAgICAgIHJ2ID0gUHlfRmFsc2U7CisgICAgICAgIH0gZWxzZSB7CiAjZWxzZQotCQl7CisgICAgICAgIHsKICNlbmRpZgotCQkJaWYgKEdldEN1cnJlbnRQcm9jZXNzKCZwc24pIDwgMCB8fAotCQkJCVNldEZyb250UHJvY2VzcygmcHNuKSA8IDApIHsKLQkJCQlydiA9IFB5X0ZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlydiA9IFB5X1RydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0JUHlfSU5DUkVGKHJ2KTsKLQlyZXR1cm4gcnY7CisgICAgICAgICAgICBpZiAoR2V0Q3VycmVudFByb2Nlc3MoJnBzbikgPCAwIHx8CisgICAgICAgICAgICAgICAgU2V0RnJvbnRQcm9jZXNzKCZwc24pIDwgMCkgeworICAgICAgICAgICAgICAgIHJ2ID0gUHlfRmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ2ID0gUHlfVHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYocnYpOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIGNoYXIgR2V0VGlja3NfZG9jW10gPSAiUmV0dXJuIG51bWJlciBvZiB0aWNrcyBzaW5jZSBib290dXAiOwpAQCAtNjE0LDcgKzYxNCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfR2V0VGlja3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgKGludClUaWNrQ291bnQoKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KVRpY2tDb3VudCgpKTsKIH0KIAogc3RhdGljIGNoYXIgb3BlbnJmX2RvY1tdID0gIk9wZW4gcmVzb3VyY2UgZm9yayBvZiBhIGZpbGUiOwpAQCAtNjIyLDEwMCArNjIyLDEwMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIE1hY09TX29wZW5yZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NFcnIgZXJyOwotCWNoYXIgKm1vZGUgPSAiciI7Ci0JRlNSZWYgcmVmOwotCVNJbnQ4IHBlcm1pc3Npb24gPSBmc1JkUGVybTsKLQlyZm9iamVjdCAqZnA7Ci0JSEZTVW5pU3RyMjU1IG5hbWU7Ci0JCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ8cyIsIFB5TWFjX0dldEZTUmVmLCAmcmVmLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgqbW9kZSkgewotCQlzd2l0Y2ggKCptb2RlKyspIHsKLQkJY2FzZSAnKic6IGJyZWFrOwotCQljYXNlICdyJzogcGVybWlzc2lvbiA9IGZzUmRQZXJtOyBicmVhazsKLQkJY2FzZSAndyc6IHBlcm1pc3Npb24gPSBmc1dyUGVybTsgYnJlYWs7Ci0JCWNhc2UgJ2InOiBicmVhazsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBPU0VyciBlcnI7CisgICAgY2hhciAqbW9kZSA9ICJyIjsKKyAgICBGU1JlZiByZWY7CisgICAgU0ludDggcGVybWlzc2lvbiA9IGZzUmRQZXJtOworICAgIHJmb2JqZWN0ICpmcDsKKyAgICBIRlNVbmlTdHIyNTUgbmFtZTsKIAotCWVyciA9IEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgmbmFtZSk7Ci0JaWYgKGVyciAhPSBub0VycikgewotCQlQeU1hY19FcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKCAoZnAgPSBuZXdyZm9iamVjdCgpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxzIiwgUHlNYWNfR2V0RlNSZWYsICZyZWYsICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2hpbGUgKCptb2RlKSB7CisgICAgICAgIHN3aXRjaCAoKm1vZGUrKykgeworICAgICAgICBjYXNlICcqJzogYnJlYWs7CisgICAgICAgIGNhc2UgJ3InOiBwZXJtaXNzaW9uID0gZnNSZFBlcm07IGJyZWFrOworICAgICAgICBjYXNlICd3JzogcGVybWlzc2lvbiA9IGZzV3JQZXJtOyBicmVhazsKKyAgICAgICAgY2FzZSAnYic6IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JCi0JZXJyID0gRlNPcGVuRm9yaygmcmVmLCBuYW1lLmxlbmd0aCwgbmFtZS51bmljb2RlLCBwZXJtaXNzaW9uLCAmZnAtPmZSZWZOdW0pOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJUHlfREVDUkVGKGZwKTsKLQkJUHlNYWNfRXJyb3IoZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZwLT5pc2Nsb3NlZCA9IDA7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWZwOworICAgIGVyciA9IEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgmbmFtZSk7CisgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIChmcCA9IG5ld3Jmb2JqZWN0KCkpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKworCisgICAgZXJyID0gRlNPcGVuRm9yaygmcmVmLCBuYW1lLmxlbmd0aCwgbmFtZS51bmljb2RlLCBwZXJtaXNzaW9uLCAmZnAtPmZSZWZOdW0pOworICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgUHlfREVDUkVGKGZwKTsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZwLT5pc2Nsb3NlZCA9IDA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWZwOwogfQogCiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIE1hY09TX01ldGhvZHNbXSA9IHsKLQl7IkdldENyZWF0b3JBbmRUeXBlIiwJCU1hY09TX0dldENyZWF0b3JBbmRUeXBlLCAxLAlnZXRjcnRwX2RvY30sCi0JeyJTZXRDcmVhdG9yQW5kVHlwZSIsCQlNYWNPU19TZXRDcmVhdG9yQW5kVHlwZSwgMSwJc2V0Y3J0cF9kb2N9LAotCXsiR2V0RXJyb3JTdHJpbmciLAkJTWFjT1NfR2V0RXJyb3JTdHJpbmcsCTEsCWdldGVycl9kb2N9LAotCXsib3BlbnJmIiwJCQlNYWNPU19vcGVucmYsIAkJMSwgCW9wZW5yZl9kb2N9LAorICAgIHsiR2V0Q3JlYXRvckFuZFR5cGUiLCAgICAgICAgICAgICAgIE1hY09TX0dldENyZWF0b3JBbmRUeXBlLCAxLCAgICAgZ2V0Y3J0cF9kb2N9LAorICAgIHsiU2V0Q3JlYXRvckFuZFR5cGUiLCAgICAgICAgICAgICAgIE1hY09TX1NldENyZWF0b3JBbmRUeXBlLCAxLCAgICAgc2V0Y3J0cF9kb2N9LAorICAgIHsiR2V0RXJyb3JTdHJpbmciLCAgICAgICAgICAgICAgICAgIE1hY09TX0dldEVycm9yU3RyaW5nLCAgIDEsICAgICAgZ2V0ZXJyX2RvY30sCisgICAgeyJvcGVucmYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1Nfb3BlbnJmLCAgICAgICAgICAgMSwgICAgICBvcGVucmZfZG9jfSwKICNpZm5kZWYgX19MUDY0X18KLQl7InNwbGFzaCIsCQkJTWFjT1Nfc3BsYXNoLAkJMSwgCXNwbGFzaF9kb2N9LAotCXsiRGVidWdTdHIiLAkJCU1hY09TX0RlYnVnU3RyLAkJMSwJRGVidWdTdHJfZG9jfSwKLQl7IlN5c0JlZXAiLAkJCU1hY09TX1N5c0JlZXAsCQkxLAlTeXNCZWVwX2RvY30sCisgICAgeyJzcGxhc2giLCAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1Nfc3BsYXNoLCAgICAgICAgICAgMSwgICAgICBzcGxhc2hfZG9jfSwKKyAgICB7IkRlYnVnU3RyIiwgICAgICAgICAgICAgICAgICAgICAgICBNYWNPU19EZWJ1Z1N0ciwgICAgICAgICAxLCAgICAgIERlYnVnU3RyX2RvY30sCisgICAgeyJTeXNCZWVwIiwgICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1NfU3lzQmVlcCwgICAgICAgICAgMSwgICAgICBTeXNCZWVwX2RvY30sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7IkdldFRpY2tzIiwJCQlNYWNPU19HZXRUaWNrcywJCTEsCUdldFRpY2tzX2RvY30sCi0JeyJXTUF2YWlsYWJsZSIsCQkJTWFjT1NfV01BdmFpbGFibGUsCQkxLAlXTUF2YWlsYWJsZV9kb2N9LAotCXtOVUxMLAkJCQlOVUxMfQkJIC8qIFNlbnRpbmVsICovCisgICAgeyJHZXRUaWNrcyIsICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1NfR2V0VGlja3MsICAgICAgICAgMSwgICAgICBHZXRUaWNrc19kb2N9LAorICAgIHsiV01BdmFpbGFibGUiLCAgICAgICAgICAgICAgICAgICAgIE1hY09TX1dNQXZhaWxhYmxlLCAgICAgICAgICAgICAgMSwgICAgICBXTUF2YWlsYWJsZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIAogdm9pZAogaW5pdE1hY09TKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBNYWNPUyBpcyByZW1vdmVkLiIsIDEpKQotCQlyZXR1cm47Ci0JCi0JbSA9IFB5X0luaXRNb2R1bGUoIk1hY09TIiwgTWFjT1NfTWV0aG9kcyk7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JCi0JLyogSW5pdGlhbGl6ZSBNYWNPUy5FcnJvciBleGNlcHRpb24gKi8KLQlNYWNPU19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKE1hY09TX0Vycm9yID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTWFjT1NfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlSZnR5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlQeV9JTkNSRUYoJlJmdHlwZSk7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSZXNvdXJjZUZvcmtUeXBlIiwgKFB5T2JqZWN0ICopJlJmdHlwZSkgIT0gMCkKLQkJcmV0dXJuOwotCS8qCi0JKiogVGhpcyBpcyBhIGhhY2s6IHRoZSBmb2xsb3dpbmcgY29uc3RhbnQgYWRkZWQgdG8gdGhlIGlkKCkgb2YgYSBzdHJpbmcKLQkqKiBvYmplY3QgZ2l2ZXMgeW91IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhLiBVbmZvcnR1bmF0ZWx5LCBpdCBpcyBuZWVkZWQgZm9yCi0JKiogc29tZSBvZiB0aGUgaW1hZ2UgYW5kIHNvdW5kIHByb2Nlc3NpbmcgaW50ZXJmYWNlcyBvbiB0aGUgbWFjOi0oCi0JKi8KLQl7Ci0JCVB5U3RyaW5nT2JqZWN0ICpwID0gMDsKLQkJbG9uZyBvZmYgPSAobG9uZykmKHAtPm9iX3N2YWxbMF0pOwotCQkKLQkJaWYoIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJzdHJpbmdfaWRfdG9fYnVmZmVyIiwgUHlfQnVpbGRWYWx1ZSgiaSIsIG9mZikpICE9IDApCi0JCQlyZXR1cm47Ci0JfQorICAgIFB5T2JqZWN0ICptLCAqZDsKKworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBNYWNPUyBpcyByZW1vdmVkLiIsIDEpKQorICAgICAgICByZXR1cm47CisKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiTWFjT1MiLCBNYWNPU19NZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKworICAgIC8qIEluaXRpYWxpemUgTWFjT1MuRXJyb3IgZXhjZXB0aW9uICovCisgICAgTWFjT1NfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChNYWNPU19FcnJvciA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIE1hY09TX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgUmZ0eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZSZnR5cGUpOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUmVzb3VyY2VGb3JrVHlwZSIsIChQeU9iamVjdCAqKSZSZnR5cGUpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICAvKgorICAgICoqIFRoaXMgaXMgYSBoYWNrOiB0aGUgZm9sbG93aW5nIGNvbnN0YW50IGFkZGVkIHRvIHRoZSBpZCgpIG9mIGEgc3RyaW5nCisgICAgKiogb2JqZWN0IGdpdmVzIHlvdSB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YS4gVW5mb3J0dW5hdGVseSwgaXQgaXMgbmVlZGVkIGZvcgorICAgICoqIHNvbWUgb2YgdGhlIGltYWdlIGFuZCBzb3VuZCBwcm9jZXNzaW5nIGludGVyZmFjZXMgb24gdGhlIG1hYzotKAorICAgICovCisgICAgeworICAgICAgICBQeVN0cmluZ09iamVjdCAqcCA9IDA7CisgICAgICAgIGxvbmcgb2ZmID0gKGxvbmcpJihwLT5vYl9zdmFsWzBdKTsKKworICAgICAgICBpZiggUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInN0cmluZ19pZF90b19idWZmZXIiLCBQeV9CdWlsZFZhbHVlKCJpIiwgb2ZmKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CiAjZGVmaW5lIFBZX1JVTlRJTUVNT0RFTCAibWFjaG8iCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJydW50aW1lbW9kZWwiLCAKLQkJCQlQeV9CdWlsZFZhbHVlKCJzIiwgUFlfUlVOVElNRU1PREVMKSkgIT0gMCkKLQkJcmV0dXJuOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicnVudGltZW1vZGVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJzIiwgUFlfUlVOVElNRU1PREVMKSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogI2lmIGRlZmluZWQoV0lUSF9ORVhUX0ZSQU1FV09SSykKICNkZWZpbmUgUFlfTElOS01PREVMICJmcmFtZXdvcmsiCiAjZWxpZiBkZWZpbmVkKFB5X0VOQUJMRV9TSEFSRUQpCkBAIC03MjMsOCArNzIzLDggQEAKICNlbHNlCiAjZGVmaW5lIFBZX0xJTktNT0RFTCAic3RhdGljIgogI2VuZGlmCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJsaW5rbW9kZWwiLCAKLQkJCQlQeV9CdWlsZFZhbHVlKCJzIiwgUFlfTElOS01PREVMKSkgIT0gMCkKLQkJcmV0dXJuOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibGlua21vZGVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJzIiwgUFlfTElOS01PREVMKSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogCiB9CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9OYXYuYyBiL01hYy9Nb2R1bGVzL05hdi5jCmluZGV4IDFjMTc3NzYuLmJkMTUzY2YgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL05hdi5jCisrKyBiL01hYy9Nb2R1bGVzL05hdi5jCkBAIC00NCwxNzIgKzQ0LDE3MiBAQAogLyogQ2FsbGJhY2sgZnVuY3Rpb25zICovCiBzdGF0aWMgcGFzY2FsIHZvaWQKIG15X2V2ZW50UHJvYyhOYXZFdmVudENhbGxiYWNrTWVzc2FnZSBjYWxsQmFja1NlbGVjdG9yLAotCQkJIE5hdkNCUmVjUHRyIGNhbGxCYWNrUGFybXMsCi0JCQkgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQorICAgICAgICAgICAgICAgICAgICAgICAgIE5hdkNCUmVjUHRyIGNhbGxCYWNrUGFybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQogewotCVB5T2JqZWN0ICpkaWN0ID0gKFB5T2JqZWN0ICopY2FsbGJhY2tVRDsKLQlQeU9iamVjdCAqcHlmdW5jOwotCVB5T2JqZWN0ICpydjsKLQkKLQlpZiAoIWRpY3QpIHJldHVybjsKLQlpZiAoIChweWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiZXZlbnRQcm9jIikpID09IE5VTEwgKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCBweWZ1bmMgPT0gUHlfTm9uZSApIHsKLQkJcmV0dXJuOwotCX0KLQlydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJscyMiLCAobG9uZyljYWxsQmFja1NlbGVjdG9yLAotCQkJKHZvaWQgKiljYWxsQmFja1Bhcm1zLCBzaXplb2YoTmF2Q0JSZWMpKTsKLQlpZiAoIHJ2ICkKLQkJUHlfREVDUkVGKHJ2KTsKLQllbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIk5hdjogZXhjZXB0aW9uIGluIGV2ZW50UHJvYyBjYWxsYmFja1xuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQorICAgIFB5T2JqZWN0ICpkaWN0ID0gKFB5T2JqZWN0ICopY2FsbGJhY2tVRDsKKyAgICBQeU9iamVjdCAqcHlmdW5jOworICAgIFB5T2JqZWN0ICpydjsKKworICAgIGlmICghZGljdCkgcmV0dXJuOworICAgIGlmICggKHB5ZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJldmVudFByb2MiKSkgPT0gTlVMTCApIHsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIHB5ZnVuYyA9PSBQeV9Ob25lICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJ2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHB5ZnVuYywgImxzIyIsIChsb25nKWNhbGxCYWNrU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2FsbEJhY2tQYXJtcywgc2l6ZW9mKE5hdkNCUmVjKSk7CisgICAgaWYgKCBydiApCisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgZWxzZSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJOYXY6IGV4Y2VwdGlvbiBpbiBldmVudFByb2MgY2FsbGJhY2tcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KIH0KIAogc3RhdGljIHBhc2NhbCBCb29sZWFuCiBteV9wcmV2aWV3UHJvYyhOYXZDQlJlY1B0ciBjYWxsQmFja1Bhcm1zLAotCQkJICAgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQogewotCVB5T2JqZWN0ICpkaWN0ID0gKFB5T2JqZWN0ICopY2FsbGJhY2tVRDsKLQlQeU9iamVjdCAqcHlmdW5jOwotCVB5T2JqZWN0ICpydjsKLQlCb29sZWFuIGNfcnYgPSBmYWxzZTsKLQkKLQlpZiAoIWRpY3QpIHJldHVybiBmYWxzZTsKLQlpZiAoIChweWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAicHJldmlld1Byb2MiKSkgPT0gTlVMTCApIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJzIyIsICh2b2lkICopY2FsbEJhY2tQYXJtcywgc2l6ZW9mKE5hdkNCUmVjKSk7Ci0JaWYgKCBydiApIHsKLQkJY19ydiA9IFB5T2JqZWN0X0lzVHJ1ZShydik7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfSBlbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIk5hdjogZXhjZXB0aW9uIGluIHByZXZpZXdQcm9jIGNhbGxiYWNrXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQl9Ci0JcmV0dXJuIGNfcnY7CisgICAgUHlPYmplY3QgKmRpY3QgPSAoUHlPYmplY3QgKiljYWxsYmFja1VEOworICAgIFB5T2JqZWN0ICpweWZ1bmM7CisgICAgUHlPYmplY3QgKnJ2OworICAgIEJvb2xlYW4gY19ydiA9IGZhbHNlOworCisgICAgaWYgKCFkaWN0KSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCAocHlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgInByZXZpZXdQcm9jIikpID09IE5VTEwgKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcnYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24ocHlmdW5jLCAicyMiLCAodm9pZCAqKWNhbGxCYWNrUGFybXMsIHNpemVvZihOYXZDQlJlYykpOworICAgIGlmICggcnYgKSB7CisgICAgICAgIGNfcnYgPSBQeU9iamVjdF9Jc1RydWUocnYpOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJOYXY6IGV4Y2VwdGlvbiBpbiBwcmV2aWV3UHJvYyBjYWxsYmFja1xuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIHJldHVybiBjX3J2OwogfQogCiBzdGF0aWMgcGFzY2FsIEJvb2xlYW4KIG15X2ZpbHRlclByb2MoQUVEZXNjICp0aGVJdGVtLCB2b2lkICppbmZvLAotCQkJICBOYXZDYWxsQmFja1VzZXJEYXRhIGNhbGxiYWNrVUQsCi0JCQkgIE5hdkZpbHRlck1vZGVzIGZpbHRlck1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdkNhbGxCYWNrVXNlckRhdGEgY2FsbGJhY2tVRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2RmlsdGVyTW9kZXMgZmlsdGVyTW9kZSkKIHsKLQlQeU9iamVjdCAqZGljdCA9IChQeU9iamVjdCAqKWNhbGxiYWNrVUQ7Ci0JUHlPYmplY3QgKnB5ZnVuYzsKLQlQeU9iamVjdCAqcnY7Ci0JQm9vbGVhbiBjX3J2ID0gZmFsc2U7Ci0JCi0JaWYgKCFkaWN0KSByZXR1cm4gZmFsc2U7Ci0JaWYgKCAocHlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgImZpbHRlclByb2MiKSkgPT0gTlVMTCApIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJPJnMjaCIsCi0JCUFFRGVzY19OZXdCb3Jyb3dlZCwgdGhlSXRlbSwgaW5mbywgc2l6ZW9mKE5hdkZpbGVPckZvbGRlckluZm8pLCAoc2hvcnQpZmlsdGVyTW9kZSk7Ci0JaWYgKCBydiApIHsKLQkJY19ydiA9IFB5T2JqZWN0X0lzVHJ1ZShydik7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfSBlbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIk5hdjogZXhjZXB0aW9uIGluIGZpbHRlclByb2MgY2FsbGJhY2tcbiIpOwotCQlQeUVycl9QcmludCgpOwotCX0KLQlyZXR1cm4gY19ydjsKKyAgICBQeU9iamVjdCAqZGljdCA9IChQeU9iamVjdCAqKWNhbGxiYWNrVUQ7CisgICAgUHlPYmplY3QgKnB5ZnVuYzsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgQm9vbGVhbiBjX3J2ID0gZmFsc2U7CisKKyAgICBpZiAoIWRpY3QpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIChweWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiZmlsdGVyUHJvYyIpKSA9PSBOVUxMICkgeworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJ2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHB5ZnVuYywgIk8mcyNoIiwKKyAgICAgICAgQUVEZXNjX05ld0JvcnJvd2VkLCB0aGVJdGVtLCBpbmZvLCBzaXplb2YoTmF2RmlsZU9yRm9sZGVySW5mbyksIChzaG9ydClmaWx0ZXJNb2RlKTsKKyAgICBpZiAoIHJ2ICkgeworICAgICAgICBjX3J2ID0gUHlPYmplY3RfSXNUcnVlKHJ2KTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiTmF2OiBleGNlcHRpb24gaW4gZmlsdGVyUHJvYyBjYWxsYmFja1xuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIHJldHVybiBjX3J2OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGludAogZmlsbGRpYWxvZ29wdGlvbnMoUHlPYmplY3QgKmQsCi0JCUFFRGVzYyAqKmRlZmF1bHRMb2NhdGlvblAsCi0JCU5hdkRpYWxvZ09wdGlvbnMgKm9wdCwKLQkJTmF2RXZlbnRVUFAgKmV2ZW50UHJvY1AsCi0JCU5hdlByZXZpZXdVUFAgKnByZXZpZXdQcm9jUCwKLQkJTmF2T2JqZWN0RmlsdGVyVVBQICpmaWx0ZXJQcm9jUCwKLQkJTmF2VHlwZUxpc3RIYW5kbGUgKnR5cGVMaXN0UCwKLQkJT1NUeXBlICpmaWxlVHlwZVAsCi0JCU9TVHlwZSAqZmlsZUNyZWF0b3JQKQorICAgICAgICAgICAgICAgIEFFRGVzYyAqKmRlZmF1bHRMb2NhdGlvblAsCisgICAgICAgICAgICAgICAgTmF2RGlhbG9nT3B0aW9ucyAqb3B0LAorICAgICAgICAgICAgICAgIE5hdkV2ZW50VVBQICpldmVudFByb2NQLAorICAgICAgICAgICAgICAgIE5hdlByZXZpZXdVUFAgKnByZXZpZXdQcm9jUCwKKyAgICAgICAgICAgICAgICBOYXZPYmplY3RGaWx0ZXJVUFAgKmZpbHRlclByb2NQLAorICAgICAgICAgICAgICAgIE5hdlR5cGVMaXN0SGFuZGxlICp0eXBlTGlzdFAsCisgICAgICAgICAgICAgICAgT1NUeXBlICpmaWxlVHlwZVAsCisgICAgICAgICAgICAgICAgT1NUeXBlICpmaWxlQ3JlYXRvclApCiB7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOwotCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLQljaGFyICprZXlzdHI7Ci0JQUVEZXNjICpkZWZhdWx0TG9jYXRpb25fc3RvcmFnZTsKLQkKLQlOYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucyhvcHQpOworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgY2hhciAqa2V5c3RyOworICAgIEFFRGVzYyAqZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2U7CiAKLQl3aGlsZSAoIFB5RGljdF9OZXh0KGQsICZwb3MsICZrZXksICZ2YWx1ZSkgKSB7Ci0JCWlmICggIWtleSB8fCAhdmFsdWUgfHwgIVB5U3RyaW5nX0NoZWNrKGtleSkgKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJEaWFsb2dPcHRpb24gaGFzIG5vbi1zdHJpbmcga2V5Iik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlrZXlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOwotCQlpZiggc3RyY21wKGtleXN0ciwgImRlZmF1bHRMb2NhdGlvbiIpID09IDAgKSB7Ci0JCQlpZiAoIChkZWZhdWx0TG9jYXRpb25fc3RvcmFnZSA9IFB5TWVtX05FVyhBRURlc2MsIDEpKSA9PSBOVUxMICkgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgQUVEZXNjX0NvbnZlcnQsIGRlZmF1bHRMb2NhdGlvbl9zdG9yYWdlKSApIHsKLQkJCQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2UpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJKmRlZmF1bHRMb2NhdGlvblAgPSBkZWZhdWx0TG9jYXRpb25fc3RvcmFnZTsKLQkJfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAidmVyc2lvbiIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIkgiLCAmb3B0LT52ZXJzaW9uKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImRpYWxvZ09wdGlvbkZsYWdzIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiayIsICZvcHQtPmRpYWxvZ09wdGlvbkZsYWdzKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImxvY2F0aW9uIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJm9wdC0+bG9jYXRpb24pICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAiY2xpZW50TmFtZSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5jbGllbnROYW1lKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgIndpbmRvd1RpdGxlIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPndpbmRvd1RpdGxlKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImFjdGlvbkJ1dHRvbkxhYmVsIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPmFjdGlvbkJ1dHRvbkxhYmVsKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImNhbmNlbEJ1dHRvbkxhYmVsIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPmNhbmNlbEJ1dHRvbkxhYmVsKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInNhdmVkRmlsZU5hbWUiKSA9PSAwICkgewotCQkJaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+c2F2ZWRGaWxlTmFtZSkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJtZXNzYWdlIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPm1lc3NhZ2UpICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAicHJlZmVyZW5jZUtleSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmb3B0LT5wcmVmZXJlbmNlS2V5KSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInBvcHVwRXh0ZW5zaW9uIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBSZXNPYmpfQ29udmVydCwgJm9wdC0+cG9wdXBFeHRlbnNpb24pICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBldmVudFByb2NQICYmIHN0cmNtcChrZXlzdHIsICJldmVudFByb2MiKSA9PSAwICkgewotCQkJKmV2ZW50UHJvY1AgPSBteV9ldmVudFByb2NVUFA7Ci0JCX0gZWxzZSBpZiggcHJldmlld1Byb2NQICYmIHN0cmNtcChrZXlzdHIsICJwcmV2aWV3UHJvYyIpID09IDAgKSB7Ci0JCQkqcHJldmlld1Byb2NQID0gbXlfcHJldmlld1Byb2NVUFA7Ci0JCX0gZWxzZSBpZiggZmlsdGVyUHJvY1AgJiYgc3RyY21wKGtleXN0ciwgImZpbHRlclByb2MiKSA9PSAwICkgewotCQkJKmZpbHRlclByb2NQID0gbXlfZmlsdGVyUHJvY1VQUDsKLQkJfSBlbHNlIGlmKCB0eXBlTGlzdFAgJiYgc3RyY21wKGtleXN0ciwgInR5cGVMaXN0IikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBSZXNPYmpfQ29udmVydCwgdHlwZUxpc3RQKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggZmlsZVR5cGVQICYmIHN0cmNtcChrZXlzdHIsICJmaWxlVHlwZSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCBmaWxlVHlwZVApICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBmaWxlQ3JlYXRvclAgJiYgc3RyY21wKGtleXN0ciwgImZpbGVDcmVhdG9yIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsIGZpbGVDcmVhdG9yUCkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgewotCQkJUHlFcnJfRm9ybWF0KEVycm9yT2JqZWN0LCAiVW5rbm93biBEaWFsb2dPcHRpb24ga2V5OiAlcyIsIGtleXN0cik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICBOYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucyhvcHQpOworCisgICAgd2hpbGUgKCBQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpICkgeworICAgICAgICBpZiAoICFrZXkgfHwgIXZhbHVlIHx8ICFQeVN0cmluZ19DaGVjayhrZXkpICkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiRGlhbG9nT3B0aW9uIGhhcyBub24tc3RyaW5nIGtleSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAga2V5c3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKKyAgICAgICAgaWYoIHN0cmNtcChrZXlzdHIsICJkZWZhdWx0TG9jYXRpb24iKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAoZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2UgPSBQeU1lbV9ORVcoQUVEZXNjLCAxKSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIEFFRGVzY19Db252ZXJ0LCBkZWZhdWx0TG9jYXRpb25fc3RvcmFnZSkgKSB7CisgICAgICAgICAgICAgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbl9zdG9yYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZWZhdWx0TG9jYXRpb25QID0gZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2U7CisgICAgICAgIH0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInZlcnNpb24iKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJIIiwgJm9wdC0+dmVyc2lvbikgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJkaWFsb2dPcHRpb25GbGFncyIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgImsiLCAmb3B0LT5kaWFsb2dPcHRpb25GbGFncykgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJsb2NhdGlvbiIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICZvcHQtPmxvY2F0aW9uKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImNsaWVudE5hbWUiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+Y2xpZW50TmFtZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJ3aW5kb3dUaXRsZSIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT53aW5kb3dUaXRsZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJhY3Rpb25CdXR0b25MYWJlbCIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5hY3Rpb25CdXR0b25MYWJlbCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJjYW5jZWxCdXR0b25MYWJlbCIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5jYW5jZWxCdXR0b25MYWJlbCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJzYXZlZEZpbGVOYW1lIikgPT0gMCApIHsKKyAgICAgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPnNhdmVkRmlsZU5hbWUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAibWVzc2FnZSIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5tZXNzYWdlKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInByZWZlcmVuY2VLZXkiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJm9wdC0+cHJlZmVyZW5jZUtleSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJwb3B1cEV4dGVuc2lvbiIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUmVzT2JqX0NvbnZlcnQsICZvcHQtPnBvcHVwRXh0ZW5zaW9uKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggZXZlbnRQcm9jUCAmJiBzdHJjbXAoa2V5c3RyLCAiZXZlbnRQcm9jIikgPT0gMCApIHsKKyAgICAgICAgICAgICpldmVudFByb2NQID0gbXlfZXZlbnRQcm9jVVBQOworICAgICAgICB9IGVsc2UgaWYoIHByZXZpZXdQcm9jUCAmJiBzdHJjbXAoa2V5c3RyLCAicHJldmlld1Byb2MiKSA9PSAwICkgeworICAgICAgICAgICAgKnByZXZpZXdQcm9jUCA9IG15X3ByZXZpZXdQcm9jVVBQOworICAgICAgICB9IGVsc2UgaWYoIGZpbHRlclByb2NQICYmIHN0cmNtcChrZXlzdHIsICJmaWx0ZXJQcm9jIikgPT0gMCApIHsKKyAgICAgICAgICAgICpmaWx0ZXJQcm9jUCA9IG15X2ZpbHRlclByb2NVUFA7CisgICAgICAgIH0gZWxzZSBpZiggdHlwZUxpc3RQICYmIHN0cmNtcChrZXlzdHIsICJ0eXBlTGlzdCIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUmVzT2JqX0NvbnZlcnQsIHR5cGVMaXN0UCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIGZpbGVUeXBlUCAmJiBzdHJjbXAoa2V5c3RyLCAiZmlsZVR5cGUiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgZmlsZVR5cGVQKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggZmlsZUNyZWF0b3JQICYmIHN0cmNtcChrZXlzdHIsICJmaWxlQ3JlYXRvciIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCBmaWxlQ3JlYXRvclApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChFcnJvck9iamVjdCwgIlVua25vd24gRGlhbG9nT3B0aW9uIGtleTogJXMiLCBrZXlzdHIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMTcsOCArMjE3LDggQEAKIC8qIERlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBvZiB0eXBlIE5hdlJlcGx5UmVjb3JkICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTmF2UmVwbHlSZWNvcmQgaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBOYXZSZXBseVJlY29yZCBpdHNlbGY7CiB9IG5hdnJyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE5hdnJydHlwZTsKQEAgLTIzNCwxOCArMjM0LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdlRyYW5zbGF0ZUZpbGUobmF2cnJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU5hdlRyYW5zbGF0aW9uT3B0aW9ucyBob3dUb1RyYW5zbGF0ZTsKLQlPU0VyciBlcnI7CisgICAgTmF2VHJhbnNsYXRpb25PcHRpb25zIGhvd1RvVHJhbnNsYXRlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZob3dUb1RyYW5zbGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdlRyYW5zbGF0ZUZpbGUoJnNlbGYtPml0c2VsZiwgaG93VG9UcmFuc2xhdGUpOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJmhvd1RvVHJhbnNsYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2VHJhbnNsYXRlRmlsZSgmc2VsZi0+aXRzZWxmLCBob3dUb1RyYW5zbGF0ZSk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkNvbXBsZXRlU2F2ZV9fZG9jX19bXSA9CkBAIC0yNTUsMjYgKzI1NSwyNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZDb21wbGV0ZVNhdmUobmF2cnJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU5hdlRyYW5zbGF0aW9uT3B0aW9ucyBob3dUb1RyYW5zbGF0ZTsKLQlPU0VyciBlcnI7CisgICAgTmF2VHJhbnNsYXRpb25PcHRpb25zIGhvd1RvVHJhbnNsYXRlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZob3dUb1RyYW5zbGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkNvbXBsZXRlU2F2ZSgmc2VsZi0+aXRzZWxmLCBob3dUb1RyYW5zbGF0ZSk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImsiLCAmaG93VG9UcmFuc2xhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZDb21wbGV0ZVNhdmUoJnNlbGYtPml0c2VsZiwgaG93VG9UcmFuc2xhdGUpOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBuYXZycl9tZXRob2RzW10gPSB7Ci0geyJOYXZUcmFuc2xhdGVGaWxlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZUcmFuc2xhdGVGaWxlLAlNRVRIX1ZBUkFSR1MsCW5hdl9OYXZUcmFuc2xhdGVGaWxlX19kb2NfX30sCi0geyJOYXZDb21wbGV0ZVNhdmUiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkNvbXBsZXRlU2F2ZSwJTUVUSF9WQVJBUkdTLAluYXZfTmF2Q29tcGxldGVTYXZlX19kb2NfX30sCi0JCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyB7Ik5hdlRyYW5zbGF0ZUZpbGUiLCAgIChQeUNGdW5jdGlvbiluYXZfTmF2VHJhbnNsYXRlRmlsZSwgICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdlRyYW5zbGF0ZUZpbGVfX2RvY19ffSwKKyB7Ik5hdkNvbXBsZXRlU2F2ZSIsICAgIChQeUNGdW5jdGlvbiluYXZfTmF2Q29tcGxldGVTYXZlLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdkNvbXBsZXRlU2F2ZV9fZG9jX199LAorCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0gKi8KQEAgLTI4MywxNjEgKzI4MywxNjEgQEAKIHN0YXRpYyBuYXZycm9iamVjdCAqCiBuZXduYXZycm9iamVjdChOYXZSZXBseVJlY29yZCAqaXRzZWxmKQogewotCW5hdnJyb2JqZWN0ICpzZWxmOwotCQotCXNlbGYgPSBQeU9iamVjdF9ORVcobmF2cnJvYmplY3QsICZOYXZycnR5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPml0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIHNlbGY7CisgICAgbmF2cnJvYmplY3QgKnNlbGY7CisKKyAgICBzZWxmID0gUHlPYmplY3RfTkVXKG5hdnJyb2JqZWN0LCAmTmF2cnJ0eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5pdHNlbGYgPSAqaXRzZWxmOworICAgIHJldHVybiBzZWxmOwogfQogCiAKIHN0YXRpYyB2b2lkCiBuYXZycl9kZWFsbG9jKG5hdnJyb2JqZWN0ICpzZWxmKQogewotCU5hdkRpc3Bvc2VSZXBseSgmc2VsZi0+aXRzZWxmKTsKLQlQeU9iamVjdF9ERUwoc2VsZik7CisgICAgTmF2RGlzcG9zZVJlcGx5KCZzZWxmLT5pdHNlbGYpOworICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdnJyX2dldGF0dHIobmF2cnJvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JRlNSZWYgZnNyOwotCUZTU3BlYyBmc3M7Ci0JCi0JaWYoIHN0cmNtcChuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoCi0JCQkJInNzc3Nzc3Nzc3MiLCAKLQkJCQkidmVyc2lvbiIsICJ2YWxpZFJlY29yZCIsICJyZXBsYWNpbmciLAotCQkJImlzU3RhdGlvbmVyeSIsICJ0cmFuc2xhdGlvbk5lZWRlZCIsIAotCQkJInNlbGVjdGlvbiIsIAotCQkJInNlbGVjdGlvbl9mc3IiLAotCQkJImZpbGVUcmFuc2xhdGlvbiIsICJrZXlTY3JpcHQiLCAic2F2ZUZpbGVOYW1lIik7CisgICAgRlNSZWYgZnNyOworICAgIEZTU3BlYyBmc3M7CiAKLQlpZiggc3RyY21wKG5hbWUsICJ2ZXJzaW9uIikgPT0gMCApCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+aXRzZWxmLnZlcnNpb24pOwotCWlmKCBzdHJjbXAobmFtZSwgInZhbGlkUmVjb3JkIikgPT0gMCApCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpc2VsZi0+aXRzZWxmLnZhbGlkUmVjb3JkKTsKLQlpZiggc3RyY21wKG5hbWUsICJyZXBsYWNpbmciKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYucmVwbGFjaW5nKTsKLQlpZiggc3RyY21wKG5hbWUsICJpc1N0YXRpb25lcnkiKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYuaXNTdGF0aW9uZXJ5KTsKLQlpZiggc3RyY21wKG5hbWUsICJ0cmFuc2xhdGlvbk5lZWRlZCIpID09IDAgKQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXNlbGYtPml0c2VsZi50cmFuc2xhdGlvbk5lZWRlZCk7Ci0JaWYoIHN0cmNtcChuYW1lLCAic2VsZWN0aW9uIikgPT0gMCApIHsKLQkJU0ludDMyIGk7Ci0JCWxvbmcgY291bnQ7Ci0JCU9TRXJyIGVycjsKLQkJUHlPYmplY3QgKnJ2LCAqcnZpdGVtOwotCQlBRURlc2MgZGVzYzsKLQkJCi0JCWlmICgoZXJyPUFFQ291bnRJdGVtcygmc2VsZi0+aXRzZWxmLnNlbGVjdGlvbiwgJmNvdW50KSkpIHsKLQkJCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmICggKHJ2PVB5TGlzdF9OZXcoY291bnQpKSA9PSBOVUxMICkKLQkJCXJldHVybiBOVUxMOwotCQlmb3IoaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJCWRlc2MuZGF0YUhhbmRsZSA9IE5VTEw7Ci0JCQlpZiAoKGVycj1BRUdldE50aERlc2MoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sIGkrMSwgdHlwZUZTUywgTlVMTCwgJmRlc2MpKSkgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKChlcnI9QUVHZXREZXNjRGF0YSgmZGVzYywgJmZzcywgc2l6ZW9mKEZTU3BlYykpKSkgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJcnZpdGVtID0gUHlNYWNfQnVpbGRGU1NwZWMoJmZzcyk7Ci0JCQlQeUxpc3RfU2V0SXRlbShydiwgaSwgcnZpdGVtKTsKLQkJCUFFRGlzcG9zZURlc2MoJmRlc2MpOwotCQl9Ci0JCXJldHVybiBydjsKLQl9Ci0JaWYoIHN0cmNtcChuYW1lLCAic2VsZWN0aW9uX2ZzciIpID09IDAgKSB7Ci0JCVNJbnQzMiBpOwotCQlsb25nIGNvdW50OwotCQlPU0VyciBlcnI7Ci0JCVB5T2JqZWN0ICpydiwgKnJ2aXRlbTsKLQkJQUVEZXNjIGRlc2M7Ci0JCQotCQlpZiAoKGVycj1BRUNvdW50SXRlbXMoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sICZjb3VudCkpKSB7Ci0JCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIChydj1QeUxpc3RfTmV3KGNvdW50KSkgPT0gTlVMTCApCi0JCQlyZXR1cm4gTlVMTDsKLQkJZm9yKGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCQlkZXNjLmRhdGFIYW5kbGUgPSBOVUxMOwotCQkJaWYgKChlcnI9QUVHZXROdGhEZXNjKCZzZWxmLT5pdHNlbGYuc2VsZWN0aW9uLCBpKzEsIHR5cGVGU1JlZiwgTlVMTCwgJmRlc2MpKSkgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKChlcnI9QUVHZXREZXNjRGF0YSgmZGVzYywgJmZzciwgc2l6ZW9mKEZTUmVmKSkpKSB7Ci0JCQkJUHlfREVDUkVGKHJ2KTsKLQkJCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlydml0ZW0gPSBQeU1hY19CdWlsZEZTUmVmKCZmc3IpOwotCQkJUHlMaXN0X1NldEl0ZW0ocnYsIGksIHJ2aXRlbSk7Ci0JCQlBRURpc3Bvc2VEZXNjKCZkZXNjKTsKLQkJfQotCQlyZXR1cm4gcnY7Ci0JfQotCWlmKCBzdHJjbXAobmFtZSwgImZpbGVUcmFuc2xhdGlvbiIpID09IDAgKQotCQlyZXR1cm4gUmVzT2JqX05ldygoSGFuZGxlKXNlbGYtPml0c2VsZi5maWxlVHJhbnNsYXRpb24pOwotCWlmKCBzdHJjbXAobmFtZSwgImtleVNjcmlwdCIpID09IDAgKQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIChzaG9ydClzZWxmLT5pdHNlbGYua2V5U2NyaXB0KTsKLQlpZiggc3RyY21wKG5hbWUsICJzYXZlRmlsZU5hbWUiKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBzZWxmLT5pdHNlbGYuc2F2ZUZpbGVOYW1lKTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJfX21lbWJlcnNfXyIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJzc3Nzc3Nzc3NzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIiwgInZhbGlkUmVjb3JkIiwgInJlcGxhY2luZyIsCisgICAgICAgICAgICAiaXNTdGF0aW9uZXJ5IiwgInRyYW5zbGF0aW9uTmVlZGVkIiwKKyAgICAgICAgICAgICJzZWxlY3Rpb24iLAorICAgICAgICAgICAgInNlbGVjdGlvbl9mc3IiLAorICAgICAgICAgICAgImZpbGVUcmFuc2xhdGlvbiIsICJrZXlTY3JpcHQiLCAic2F2ZUZpbGVOYW1lIik7CisKKyAgICBpZiggc3RyY21wKG5hbWUsICJ2ZXJzaW9uIikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+aXRzZWxmLnZlcnNpb24pOworICAgIGlmKCBzdHJjbXAobmFtZSwgInZhbGlkUmVjb3JkIikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpc2VsZi0+aXRzZWxmLnZhbGlkUmVjb3JkKTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJyZXBsYWNpbmciKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYucmVwbGFjaW5nKTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJpc1N0YXRpb25lcnkiKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYuaXNTdGF0aW9uZXJ5KTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJ0cmFuc2xhdGlvbk5lZWRlZCIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXNlbGYtPml0c2VsZi50cmFuc2xhdGlvbk5lZWRlZCk7CisgICAgaWYoIHN0cmNtcChuYW1lLCAic2VsZWN0aW9uIikgPT0gMCApIHsKKyAgICAgICAgU0ludDMyIGk7CisgICAgICAgIGxvbmcgY291bnQ7CisgICAgICAgIE9TRXJyIGVycjsKKyAgICAgICAgUHlPYmplY3QgKnJ2LCAqcnZpdGVtOworICAgICAgICBBRURlc2MgZGVzYzsKKworICAgICAgICBpZiAoKGVycj1BRUNvdW50SXRlbXMoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sICZjb3VudCkpKSB7CisgICAgICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChydj1QeUxpc3RfTmV3KGNvdW50KSkgPT0gTlVMTCApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yKGk9MDsgaTxjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBkZXNjLmRhdGFIYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaWYgKChlcnI9QUVHZXROdGhEZXNjKCZzZWxmLT5pdHNlbGYuc2VsZWN0aW9uLCBpKzEsIHR5cGVGU1MsIE5VTEwsICZkZXNjKSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZXJyPUFFR2V0RGVzY0RhdGEoJmRlc2MsICZmc3MsIHNpemVvZihGU1NwZWMpKSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ2aXRlbSA9IFB5TWFjX0J1aWxkRlNTcGVjKCZmc3MpOworICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0ocnYsIGksIHJ2aXRlbSk7CisgICAgICAgICAgICBBRURpc3Bvc2VEZXNjKCZkZXNjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CisgICAgfQorICAgIGlmKCBzdHJjbXAobmFtZSwgInNlbGVjdGlvbl9mc3IiKSA9PSAwICkgeworICAgICAgICBTSW50MzIgaTsKKyAgICAgICAgbG9uZyBjb3VudDsKKyAgICAgICAgT1NFcnIgZXJyOworICAgICAgICBQeU9iamVjdCAqcnYsICpydml0ZW07CisgICAgICAgIEFFRGVzYyBkZXNjOworCisgICAgICAgIGlmICgoZXJyPUFFQ291bnRJdGVtcygmc2VsZi0+aXRzZWxmLnNlbGVjdGlvbiwgJmNvdW50KSkpIHsKKyAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICggKHJ2PVB5TGlzdF9OZXcoY291bnQpKSA9PSBOVUxMICkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IoaT0wOyBpPGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGRlc2MuZGF0YUhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoKGVycj1BRUdldE50aERlc2MoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sIGkrMSwgdHlwZUZTUmVmLCBOVUxMLCAmZGVzYykpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGVycj1BRUdldERlc2NEYXRhKCZkZXNjLCAmZnNyLCBzaXplb2YoRlNSZWYpKSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ2aXRlbSA9IFB5TWFjX0J1aWxkRlNSZWYoJmZzcik7CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShydiwgaSwgcnZpdGVtKTsKKyAgICAgICAgICAgIEFFRGlzcG9zZURlc2MoJmRlc2MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKKyAgICB9CisgICAgaWYoIHN0cmNtcChuYW1lLCAiZmlsZVRyYW5zbGF0aW9uIikgPT0gMCApCisgICAgICAgIHJldHVybiBSZXNPYmpfTmV3KChIYW5kbGUpc2VsZi0+aXRzZWxmLmZpbGVUcmFuc2xhdGlvbik7CisgICAgaWYoIHN0cmNtcChuYW1lLCAia2V5U2NyaXB0IikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKHNob3J0KXNlbGYtPml0c2VsZi5rZXlTY3JpcHQpOworICAgIGlmKCBzdHJjbXAobmFtZSwgInNhdmVGaWxlTmFtZSIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlN0cmluZ1JlZk9ial9OZXcsIHNlbGYtPml0c2VsZi5zYXZlRmlsZU5hbWUpOwogCiAKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChuYXZycl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChuYXZycl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIGludAogbmF2cnJfc2V0YXR0cihuYXZycm9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JLyogU2V0IGF0dHJpYnV0ZSAnbmFtZScgdG8gdmFsdWUgJ3YnLiB2PT1OVUxMIG1lYW5zIGRlbGV0ZSAqLwotCQotCS8qIFhYWFggQWRkIHlvdXIgb3duIHNldGF0dHIgY29kZSBoZXJlICovCi0JcmV0dXJuIC0xOworICAgIC8qIFNldCBhdHRyaWJ1dGUgJ25hbWUnIHRvIHZhbHVlICd2Jy4gdj09TlVMTCBtZWFucyBkZWxldGUgKi8KKworICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIHNldGF0dHIgY29kZSBoZXJlICovCisgICAgcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgY2hhciBOYXZycnR5cGVfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIE5hdnJydHlwZV9fZG9jX19bXSA9CiAiUmVjb3JkIGNvbnRhaW5pbmcgcmVzdWx0IG9mIGEgTmF2IGZpbGUgc2VsZWN0aW9uIGNhbGwuIFVzZSBkaXIoKSBmb3IgbWVtYmVyIG5hbWVzLiIKIDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBOYXZycnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJOYXYuTmF2UmVwbHlSZWNvcmQiLAkJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKG5hdnJyb2JqZWN0KSwJCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbmF2cnJfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkocHJpbnRmdW5jKTAsCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpbmF2cnJfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpbmF2cnJfc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3N0ciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJOYXYuTmF2UmVwbHlSZWNvcmQiLCAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YobmF2cnJvYmplY3QpLCAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKW5hdnJyX2RlYWxsb2MsICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYyluYXZycl9nZXRhdHRyLCAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKW5hdnJyX3NldGF0dHIsICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAKLQkvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCTBMLDBMLDBMLDBMLAotCU5hdnJydHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KKyAgICAvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAgIDBMLDBMLDBMLDBMLAorICAgIE5hdnJydHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KIH07CiAKIC8qIEVuZCBvZiBjb2RlIGZvciBOYXZSZXBseVJlY29yZCBvYmplY3RzICovCi0JCQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgY2hhciBuYXZfTmF2R2V0RmlsZV9fZG9jX19bXSA9CkBAIC00NDcsMzIgKzQ0NywzMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZHZXRGaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZQcmV2aWV3VVBQIHByZXZpZXdQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JTmF2VHlwZUxpc3RIYW5kbGUgdHlwZUxpc3QgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBBRURlc2MgICAgICAqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKKyAgICBOYXZSZXBseVJlY29yZCByZXBseTsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBOYXZQcmV2aWV3VVBQIHByZXZpZXdQcm9jID0gTlVMTDsKKyAgICBOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7CisgICAgTmF2VHlwZUxpc3RIYW5kbGUgdHlwZUxpc3QgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgJnByZXZpZXdQcm9jLCAmZmlsdGVyUHJvYywgJnR5cGVMaXN0LCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2R2V0RmlsZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCi0JCQlldmVudFByb2MsIHByZXZpZXdQcm9jLCBmaWx0ZXJQcm9jLCB0eXBlTGlzdCwgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCAmcHJldmlld1Byb2MsICZmaWx0ZXJQcm9jLCAmdHlwZUxpc3QsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZHZXRGaWxlKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRQcm9jLCBwcmV2aWV3UHJvYywgZmlsdGVyUHJvYywgdHlwZUxpc3QsICh2b2lkICopZGljdCk7CisgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2UHV0RmlsZV9fZG9jX19bXSA9CkBAIC00ODIsMzEgKzQ4MiwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZQdXRGaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBBRURlc2MgICAgICAqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKKyAgICBOYXZSZXBseVJlY29yZCByZXBseTsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgT1NUeXBlIGZpbGVDcmVhdG9yOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgJmZpbGVUeXBlLCAmZmlsZUNyZWF0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZQdXRGaWxlKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsZVR5cGUsIGZpbGVDcmVhdG9yLCAodm9pZCAqKWRpY3QpOwotCVB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsICZmaWxlVHlwZSwgJmZpbGVDcmVhdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2UHV0RmlsZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsZVR5cGUsIGZpbGVDcmVhdG9yLCAodm9pZCAqKWRpY3QpOworICAgIFB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkFza1NhdmVDaGFuZ2VzX19kb2NfX1tdID0KQEAgLTUxNywyNyArNTE3LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkFza1NhdmVDaGFuZ2VzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlOYXZBc2tTYXZlQ2hhbmdlc0FjdGlvbiBhY3Rpb247Ci0JTmF2QXNrU2F2ZUNoYW5nZXNSZXN1bHQgcmVwbHk7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE5hdkFza1NhdmVDaGFuZ2VzQWN0aW9uIGFjdGlvbjsKKyAgICBOYXZBc2tTYXZlQ2hhbmdlc1Jlc3VsdCByZXBseTsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJmFjdGlvbikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxPISIsICZhY3Rpb24sICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsIE5VTEwsICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2QXNrU2F2ZUNoYW5nZXMoJmRpYWxvZ09wdGlvbnMsIGFjdGlvbiwgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJmFjdGlvbikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxPISIsICZhY3Rpb24sICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsIE5VTEwsICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2QXNrU2F2ZUNoYW5nZXMoJmRpYWxvZ09wdGlvbnMsIGFjdGlvbiwgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXNfX2RvY19fW10gPQpAQCAtNTQ3LDI2ICs1NDcsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOwotCU5hdkFza1NhdmVDaGFuZ2VzUmVzdWx0IHJlcGx5OwotCU5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZBc2tTYXZlQ2hhbmdlc1Jlc3VsdCByZXBseTsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCBOVUxMLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkN1c3RvbUFza1NhdmVDaGFuZ2VzKCZkaWFsb2dPcHRpb25zLCAmcmVwbHksIGV2ZW50UHJvYywgKHZvaWQgKilkaWN0KTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsIE5VTEwsICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMoJmRpYWxvZ09wdGlvbnMsICZyZXBseSwgZXZlbnRQcm9jLCAodm9pZCAqKWRpY3QpOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXJlcGx5KTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzX19kb2NfX1tdID0KQEAgLTU3NiwyNiArNTc2LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlOYXZBc2tTYXZlQ2hhbmdlc1Jlc3VsdCByZXBseTsKLQlOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2QXNrU2F2ZUNoYW5nZXNSZXN1bHQgcmVwbHk7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgTlVMTCwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZBc2tEaXNjYXJkQ2hhbmdlcygmZGlhbG9nT3B0aW9ucywgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBkaWN0ID0ga3c7CisgICAgfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCBOVUxMLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkFza0Rpc2NhcmRDaGFuZ2VzKCZkaWFsb2dPcHRpb25zLCAmcmVwbHksIGV2ZW50UHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VGaWxlX19kb2NfX1tdID0KQEAgLTYwNSwzMiArNjA1LDMyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkNob29zZUZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JQUVEZXNjCSpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOwotCU5hdlJlcGx5UmVjb3JkIHJlcGx5OwotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOwotCU5hdlByZXZpZXdVUFAgcHJldmlld1Byb2MgPSBOVUxMOwotCU5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKLQlOYXZUeXBlTGlzdEhhbmRsZSB0eXBlTGlzdCA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdlByZXZpZXdVUFAgcHJldmlld1Byb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBOYXZUeXBlTGlzdEhhbmRsZSB0eXBlTGlzdCA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCAmcHJldmlld1Byb2MsICZmaWx0ZXJQcm9jLCAmdHlwZUxpc3QsIE5VTEwsIE5VTEwpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZDaG9vc2VGaWxlKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgcHJldmlld1Byb2MsIGZpbHRlclByb2MsIHR5cGVMaXN0LCAodm9pZCAqKWRpY3QpOwotCVB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsICZwcmV2aWV3UHJvYywgJmZpbHRlclByb2MsICZ0eXBlTGlzdCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZUZpbGUoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBldmVudFByb2MsIHByZXZpZXdQcm9jLCBmaWx0ZXJQcm9jLCB0eXBlTGlzdCwgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VGb2xkZXJfX2RvY19fW10gPQpAQCAtNjQwLDMwICs2NDAsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q2hvb3NlRm9sZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsICZmaWx0ZXJQcm9jLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2Q2hvb3NlRm9sZGVyKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZUZvbGRlcihkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VWb2x1bWVfX2RvY19fW10gPQpAQCAtNjczLDMwICs2NzMsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q2hvb3NlVm9sdW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsICZmaWx0ZXJQcm9jLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2Q2hvb3NlVm9sdW1lKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZVZvbHVtZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VPYmplY3RfX2RvY19fW10gPQpAQCAtNzA2LDMwICs3MDYsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q2hvb3NlT2JqZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsICZmaWx0ZXJQcm9jLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2Q2hvb3NlT2JqZWN0KGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZU9iamVjdChkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZOZXdGb2xkZXJfX2RvY19fW10gPQpAQCAtNzM5LDI4ICs3MzksMjggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2TmV3Rm9sZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgQUVEZXNjICAgICAgKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7CisgICAgTmF2UmVwbHlSZWNvcmQgcmVwbHk7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2TmV3Rm9sZGVyKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywgZXZlbnRQcm9jLCAodm9pZCAqKWRpY3QpOwotCVB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZOZXdGb2xkZXIoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLCBldmVudFByb2MsICh2b2lkICopZGljdCk7CisgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOwogfQogCiAjaWYgMApAQCAtNzc0LDEwICs3NzQsMTAgQEAKIG5hdl9OYXZDdXN0b21Db250cm9sKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYKIApAQCAtNzg4LDExICs3ODgsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2U2VydmljZXNDYW5SdW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUJvb2xlYW4gcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnYgPSBOYXZTZXJ2aWNlc0NhblJ1bigpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOworICAgIEJvb2xlYW4gcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBOYXZTZXJ2aWNlc0NhblJ1bigpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2U2VydmljZXNBdmFpbGFibGVfX2RvY19fW10gPQpAQCAtODAyLDEyICs4MDIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2U2VydmljZXNBdmFpbGFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUJvb2xlYW4gcnY7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnYgPSBOYXZTZXJ2aWNlc0F2YWlsYWJsZSgpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOworICAgIEJvb2xlYW4gcnY7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IE5hdlNlcnZpY2VzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylydik7CiB9CiAvKiBYWCAqLwogc3RhdGljIGNoYXIgbmF2X05hdkxvYWRfX2RvY19fW10gPQpAQCAtODE4LDExICs4MTgsMTEgQEAKIG5hdl9OYXZMb2FkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU5hdkxvYWQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTmF2TG9hZCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdlVubG9hZF9fZG9jX19bXSA9CkBAIC04MzMsMTEgKzgzMywxMSBAQAogbmF2X05hdlVubG9hZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlOYXZVbmxvYWQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTmF2VW5sb2FkKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2TGlicmFyeVZlcnNpb25fX2RvY19fW10gPQpAQCAtODQ3LDEyICs4NDcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2TGlicmFyeVZlcnNpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVVJbnQzMiBydjsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlydiA9IE5hdkxpYnJhcnlWZXJzaW9uKCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylydik7CisgICAgVUludDMyIHJ2OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBOYXZMaWJyYXJ5VmVyc2lvbigpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnNfX2RvY19fW10gPQpAQCAtODYyLDU5ICs4NjIsNTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlPU0VyciBlcnI7Ci0JCi0JZXJyID0gTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMoJmRpYWxvZ09wdGlvbnMpOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgKLQkJCSJ7czpoLHM6bCxzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJn0iLAotCQkidmVyc2lvbiIsIGRpYWxvZ09wdGlvbnMudmVyc2lvbiwKLQkJImRpYWxvZ09wdGlvbkZsYWdzIiwgZGlhbG9nT3B0aW9ucy5kaWFsb2dPcHRpb25GbGFncywKLQkJImxvY2F0aW9uIiwgUHlNYWNfQnVpbGRQb2ludCwgZGlhbG9nT3B0aW9ucy5sb2NhdGlvbiwKLQkJImNsaWVudE5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuY2xpZW50TmFtZSwKLQkJIndpbmRvd1RpdGxlIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLndpbmRvd1RpdGxlLAotCQkiYWN0aW9uQnV0dG9uTGFiZWwiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuYWN0aW9uQnV0dG9uTGFiZWwsCi0JCSJjYW5jZWxCdXR0b25MYWJlbCIsIFB5TWFjX0J1aWxkU3RyMjU1LCAmZGlhbG9nT3B0aW9ucy5jYW5jZWxCdXR0b25MYWJlbCwKLQkJInNhdmVkRmlsZU5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuc2F2ZWRGaWxlTmFtZSwKLQkJIm1lc3NhZ2UiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMubWVzc2FnZSwKLQkJInByZWZlcmVuY2VLZXkiLCBQeU1hY19CdWlsZE9TVHlwZSwgZGlhbG9nT3B0aW9ucy5wcmVmZXJlbmNlS2V5Ci0JCSwicG9wdXBFeHRlbnNpb24iLCBPcHRSZXNPYmpfTmV3LCBkaWFsb2dPcHRpb25zLnBvcHVwRXh0ZW5zaW9uCi0JCSk7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE9TRXJyIGVycjsKKworICAgIGVyciA9IE5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zKCZkaWFsb2dPcHRpb25zKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICJ7czpoLHM6bCxzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJn0iLAorICAgICAgICAidmVyc2lvbiIsIGRpYWxvZ09wdGlvbnMudmVyc2lvbiwKKyAgICAgICAgImRpYWxvZ09wdGlvbkZsYWdzIiwgZGlhbG9nT3B0aW9ucy5kaWFsb2dPcHRpb25GbGFncywKKyAgICAgICAgImxvY2F0aW9uIiwgUHlNYWNfQnVpbGRQb2ludCwgZGlhbG9nT3B0aW9ucy5sb2NhdGlvbiwKKyAgICAgICAgImNsaWVudE5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuY2xpZW50TmFtZSwKKyAgICAgICAgIndpbmRvd1RpdGxlIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLndpbmRvd1RpdGxlLAorICAgICAgICAiYWN0aW9uQnV0dG9uTGFiZWwiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuYWN0aW9uQnV0dG9uTGFiZWwsCisgICAgICAgICJjYW5jZWxCdXR0b25MYWJlbCIsIFB5TWFjX0J1aWxkU3RyMjU1LCAmZGlhbG9nT3B0aW9ucy5jYW5jZWxCdXR0b25MYWJlbCwKKyAgICAgICAgInNhdmVkRmlsZU5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuc2F2ZWRGaWxlTmFtZSwKKyAgICAgICAgIm1lc3NhZ2UiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMubWVzc2FnZSwKKyAgICAgICAgInByZWZlcmVuY2VLZXkiLCBQeU1hY19CdWlsZE9TVHlwZSwgZGlhbG9nT3B0aW9ucy5wcmVmZXJlbmNlS2V5CisgICAgICAgICwicG9wdXBFeHRlbnNpb24iLCBPcHRSZXNPYmpfTmV3LCBkaWFsb2dPcHRpb25zLnBvcHVwRXh0ZW5zaW9uCisgICAgICAgICk7CiB9CiAKIC8qIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBuYXZfbWV0aG9kc1tdID0gewotCXsiTmF2R2V0RmlsZSIsCShQeUNGdW5jdGlvbiluYXZfTmF2R2V0RmlsZSwJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZHZXRGaWxlX19kb2NfX30sCi0geyJOYXZQdXRGaWxlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZQdXRGaWxlLAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdlB1dEZpbGVfX2RvY19ffSwKLSB7Ik5hdkFza1NhdmVDaGFuZ2VzIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZBc2tTYXZlQ2hhbmdlcywJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZBc2tTYXZlQ2hhbmdlc19fZG9jX199LAotIHsiTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzLAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzX19kb2NfX30sCi0geyJOYXZBc2tEaXNjYXJkQ2hhbmdlcyIsCShQeUNGdW5jdGlvbiluYXZfTmF2QXNrRGlzY2FyZENoYW5nZXMsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2QXNrRGlzY2FyZENoYW5nZXNfX2RvY19ffSwKLSB7Ik5hdkNob29zZUZpbGUiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkNob29zZUZpbGUsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2Q2hvb3NlRmlsZV9fZG9jX199LAotIHsiTmF2Q2hvb3NlRm9sZGVyIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VGb2xkZXIsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2Q2hvb3NlRm9sZGVyX19kb2NfX30sCi0geyJOYXZDaG9vc2VWb2x1bWUiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkNob29zZVZvbHVtZSwJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZDaG9vc2VWb2x1bWVfX2RvY19ffSwKLSB7Ik5hdkNob29zZU9iamVjdCIsCShQeUNGdW5jdGlvbiluYXZfTmF2Q2hvb3NlT2JqZWN0LAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdkNob29zZU9iamVjdF9fZG9jX199LAotIHsiTmF2TmV3Rm9sZGVyIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZOZXdGb2xkZXIsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2TmV3Rm9sZGVyX19kb2NfX30sCisgICAgeyJOYXZHZXRGaWxlIiwgICAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkdldEZpbGUsICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkdldEZpbGVfX2RvY19ffSwKKyB7Ik5hdlB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pbmF2X05hdlB1dEZpbGUsICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdlB1dEZpbGVfX2RvY19ffSwKKyB7Ik5hdkFza1NhdmVDaGFuZ2VzIiwgIChQeUNGdW5jdGlvbiluYXZfTmF2QXNrU2F2ZUNoYW5nZXMsICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZBc2tTYXZlQ2hhbmdlc19fZG9jX199LAorIHsiTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMiLCAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzLCAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZDdXN0b21Bc2tTYXZlQ2hhbmdlc19fZG9jX199LAorIHsiTmF2QXNrRGlzY2FyZENoYW5nZXMiLCAgICAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICBuYXZfTmF2QXNrRGlzY2FyZENoYW5nZXNfX2RvY19ffSwKKyB7Ik5hdkNob29zZUZpbGUiLCAgICAgIChQeUNGdW5jdGlvbiluYXZfTmF2Q2hvb3NlRmlsZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICBuYXZfTmF2Q2hvb3NlRmlsZV9fZG9jX199LAorIHsiTmF2Q2hvb3NlRm9sZGVyIiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VGb2xkZXIsICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkNob29zZUZvbGRlcl9fZG9jX199LAorIHsiTmF2Q2hvb3NlVm9sdW1lIiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VWb2x1bWUsICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkNob29zZVZvbHVtZV9fZG9jX199LAorIHsiTmF2Q2hvb3NlT2JqZWN0IiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VPYmplY3QsICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkNob29zZU9iamVjdF9fZG9jX199LAorIHsiTmF2TmV3Rm9sZGVyIiwgICAgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZOZXdGb2xkZXIsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZOZXdGb2xkZXJfX2RvY19ffSwKICNpZiAwCi0geyJOYXZDdXN0b21Db250cm9sIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDdXN0b21Db250cm9sLAlNRVRIX1ZBUkFSR1MsCW5hdl9OYXZDdXN0b21Db250cm9sX19kb2NfX30sCisgeyJOYXZDdXN0b21Db250cm9sIiwgICAoUHlDRnVuY3Rpb24pbmF2X05hdkN1c3RvbUNvbnRyb2wsICAgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZDdXN0b21Db250cm9sX19kb2NfX30sCiAjZW5kaWYKLSB7Ik5hdlNlcnZpY2VzQ2FuUnVuIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZTZXJ2aWNlc0NhblJ1biwJTUVUSF9WQVJBUkdTLAluYXZfTmF2U2VydmljZXNDYW5SdW5fX2RvY19ffSwKLSB7Ik5hdlNlcnZpY2VzQXZhaWxhYmxlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZTZXJ2aWNlc0F2YWlsYWJsZSwJTUVUSF9WQVJBUkdTLAluYXZfTmF2U2VydmljZXNBdmFpbGFibGVfX2RvY19ffSwKLSB7Ik5hdkxvYWQiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkxvYWQsCU1FVEhfVkFSQVJHUywJbmF2X05hdkxvYWRfX2RvY19ffSwKLSB7Ik5hdlVubG9hZCIsCShQeUNGdW5jdGlvbiluYXZfTmF2VW5sb2FkLAlNRVRIX1ZBUkFSR1MsCW5hdl9OYXZVbmxvYWRfX2RvY19ffSwKLSB7Ik5hdkxpYnJhcnlWZXJzaW9uIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZMaWJyYXJ5VmVyc2lvbiwJTUVUSF9WQVJBUkdTLAluYXZfTmF2TGlicmFyeVZlcnNpb25fX2RvY19ffSwKLSB7Ik5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucywJTUVUSF9WQVJBUkdTLAluYXZfTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnNfX2RvY19ffSwKLQl7TlVMTCwJIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyB7Ik5hdlNlcnZpY2VzQ2FuUnVuIiwgIChQeUNGdW5jdGlvbiluYXZfTmF2U2VydmljZXNDYW5SdW4sICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdlNlcnZpY2VzQ2FuUnVuX19kb2NfX30sCisgeyJOYXZTZXJ2aWNlc0F2YWlsYWJsZSIsICAgICAgIChQeUNGdW5jdGlvbiluYXZfTmF2U2VydmljZXNBdmFpbGFibGUsICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdlNlcnZpY2VzQXZhaWxhYmxlX19kb2NfX30sCisgeyJOYXZMb2FkIiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZMb2FkLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdkxvYWRfX2RvY19ffSwKKyB7Ik5hdlVubG9hZCIsICAoUHlDRnVuY3Rpb24pbmF2X05hdlVubG9hZCwgICAgIE1FVEhfVkFSQVJHUywgICBuYXZfTmF2VW5sb2FkX19kb2NfX30sCisgeyJOYXZMaWJyYXJ5VmVyc2lvbiIsICAoUHlDRnVuY3Rpb24pbmF2X05hdkxpYnJhcnlWZXJzaW9uLCAgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZMaWJyYXJ5VmVyc2lvbl9fZG9jX199LAorIHsiTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMiLCAoUHlDRnVuY3Rpb24pbmF2X05hdkdldERlZmF1bHREaWFsb2dPcHRpb25zLCAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdkdldERlZmF1bHREaWFsb2dPcHRpb25zX19kb2NfX30sCisgICAge05VTEwsICAgICAgIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfSAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIC8qIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlICgqbXVzdCogYmUgY2FsbGVkIGluaXROYXYpICovCiAKLXN0YXRpYyBjaGFyIE5hdl9tb2R1bGVfZG9jdW1lbnRhdGlvbltdID0gCitzdGF0aWMgY2hhciBOYXZfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9CiAiSW50ZXJmYWNlIHRvIE5hdmlnYXRpb24gU2VydmljZXNcbiIKICJNb3N0IGNhbGxzIGFjY2VwdCBhIE5hdkRpYWxvZ09wdGlvbnMgZGljdGlvbmFyeSBvciBrZXl3b3JkcyB3aXRoIHRoZSBzYW1lIG5hbWVzLCBwYXNzIHt9XG4iCiAiaWYgeW91IHdhbnQgdGhlIGRlZmF1bHQgb3B0aW9ucy5cbiIKQEAgLTkzMCwzOSArOTMwLDM5IEBACiB2b2lkCiBpbml0TmF2KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBOYXYgaXMgcmVtb3ZlZC4iLCAxKSkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZDsKKworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBOYXYgaXMgcmVtb3ZlZC4iLCAxKSkKKyAgICAgICAgcmV0dXJuOwogCiAjaWZkZWYgX19MUDY0X18KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJOYXZpZ2F0aW9uIFNlcnZpY2VzIG5vdCBhdmFpbGFibGUgaW4gNjQtYml0IG1vZGUiKTsKLQlyZXR1cm47CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiTmF2aWdhdGlvbiBTZXJ2aWNlcyBub3QgYXZhaWxhYmxlIGluIDY0LWJpdCBtb2RlIik7CisgICAgcmV0dXJuOwogCi0jZWxzZQkvKiAhX19MUDY0X18gKi8KKyNlbHNlICAgLyogIV9fTFA2NF9fICovCiAKLQkvKiBUZXN0IHRoYXQgd2UgaGF2ZSBOYXZTZXJ2aWNlcyAqLwotCWlmICggIU5hdlNlcnZpY2VzQXZhaWxhYmxlKCkgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIk5hdmlnYXRpb24gU2VydmljZXMgbm90IGF2YWlsYWJsZSIpOwotCQlyZXR1cm47Ci0JfQotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlNCgiTmF2IiwgbmF2X21ldGhvZHMsCi0JCU5hdl9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKLQkJKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgLyogVGVzdCB0aGF0IHdlIGhhdmUgTmF2U2VydmljZXMgKi8KKyAgICBpZiAoICFOYXZTZXJ2aWNlc0F2YWlsYWJsZSgpICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJOYXZpZ2F0aW9uIFNlcnZpY2VzIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoIk5hdiIsIG5hdl9tZXRob2RzLAorICAgICAgICBOYXZfbW9kdWxlX2RvY3VtZW50YXRpb24sCisgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlFcnJvck9iamVjdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIk5hdi5lcnJvciIpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEVycm9yT2JqZWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiTmF2LmVycm9yIik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpOwogCi0JLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KLQkKLQkvKiBTZXQgVVBQcyAqLwotCW15X2V2ZW50UHJvY1VQUCA9IE5ld05hdkV2ZW50VVBQKG15X2V2ZW50UHJvYyk7Ci0JbXlfcHJldmlld1Byb2NVUFAgPSBOZXdOYXZQcmV2aWV3VVBQKG15X3ByZXZpZXdQcm9jKTsKLQlteV9maWx0ZXJQcm9jVVBQID0gTmV3TmF2T2JqZWN0RmlsdGVyVVBQKG15X2ZpbHRlclByb2MpOworICAgIC8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCisKKyAgICAvKiBTZXQgVVBQcyAqLworICAgIG15X2V2ZW50UHJvY1VQUCA9IE5ld05hdkV2ZW50VVBQKG15X2V2ZW50UHJvYyk7CisgICAgbXlfcHJldmlld1Byb2NVUFAgPSBOZXdOYXZQcmV2aWV3VVBQKG15X3ByZXZpZXdQcm9jKTsKKyAgICBteV9maWx0ZXJQcm9jVVBQID0gTmV3TmF2T2JqZWN0RmlsdGVyVVBQKG15X2ZpbHRlclByb2MpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCQorCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL09TQVRlcm1pbm9sb2d5LmMgYi9NYWMvTW9kdWxlcy9PU0FUZXJtaW5vbG9neS5jCmluZGV4IGU1NmEwZGIuLjBiNzZiM2UgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL09TQVRlcm1pbm9sb2d5LmMKKysrIGIvTWFjL01vZHVsZXMvT1NBVGVybWlub2xvZ3kuYwpAQCAtMTUsODQgKzE1LDg0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlPU0FfR2V0QXBwVGVybWlub2xvZ3koUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUFFRGVzYyB0aGVEZXNjID0gezAsMH07Ci0JRlNTcGVjIGZzczsKLQlDb21wb25lbnRJbnN0YW5jZSBkZWZhdWx0Q29tcG9uZW50ID0gTlVMTDsKLQlTSW50MTYgZGVmYXVsdFRlcm1pbm9sb2d5ID0gMDsKLQlCb29sZWFuIGRpZExhdW5jaCA9IDA7Ci0JT1NBRXJyb3IgZXJyOwotCWxvbmcgbW9kZUZsYWdzID0gMDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfGkiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MsICZtb2RlRmxhZ3MpKQotCQkgcmV0dXJuIE5VTEw7Ci0JCi0JZGVmYXVsdENvbXBvbmVudCA9IE9wZW5EZWZhdWx0Q29tcG9uZW50IChrT1NBQ29tcG9uZW50VHlwZSwgJ2FzY3InKTsKLQllcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIChkZWZhdWx0Q29tcG9uZW50KTsKLQlpZiAoZXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQllcnIgPSBPU0FHZXRBcHBUZXJtaW5vbG9neSAoCi0gICAgCWRlZmF1bHRDb21wb25lbnQsIAotICAgIAltb2RlRmxhZ3MsCi0gICAgCSZmc3MsIAotICAgIAlkZWZhdWx0VGVybWlub2xvZ3ksIAotICAgIAkmZGlkTGF1bmNoLCAKLSAgICAJJnRoZURlc2MKLQkpOwotCWlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmkiLCBBRURlc2NfTmV3LCAmdGhlRGVzYywgZGlkTGF1bmNoKTsKKyAgICBBRURlc2MgdGhlRGVzYyA9IHswLDB9OworICAgIEZTU3BlYyBmc3M7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgZGVmYXVsdENvbXBvbmVudCA9IE5VTEw7CisgICAgU0ludDE2IGRlZmF1bHRUZXJtaW5vbG9neSA9IDA7CisgICAgQm9vbGVhbiBkaWRMYXVuY2ggPSAwOworICAgIE9TQUVycm9yIGVycjsKKyAgICBsb25nIG1vZGVGbGFncyA9IDA7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfGkiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MsICZtb2RlRmxhZ3MpKQorICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZGVmYXVsdENvbXBvbmVudCA9IE9wZW5EZWZhdWx0Q29tcG9uZW50IChrT1NBQ29tcG9uZW50VHlwZSwgJ2FzY3InKTsKKyAgICBlcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIChkZWZhdWx0Q29tcG9uZW50KTsKKyAgICBpZiAoZXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBlcnIgPSBPU0FHZXRBcHBUZXJtaW5vbG9neSAoCisgICAgZGVmYXVsdENvbXBvbmVudCwKKyAgICBtb2RlRmxhZ3MsCisgICAgJmZzcywKKyAgICBkZWZhdWx0VGVybWlub2xvZ3ksCisgICAgJmRpZExhdW5jaCwKKyAgICAmdGhlRGVzYworICAgICk7CisgICAgaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8maSIsIEFFRGVzY19OZXcsICZ0aGVEZXNjLCBkaWRMYXVuY2gpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlPU0FfR2V0U3lzVGVybWlub2xvZ3koUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUFFRGVzYyB0aGVEZXNjID0gezAsMH07Ci0JRlNTcGVjIGZzczsKLQlDb21wb25lbnRJbnN0YW5jZSBkZWZhdWx0Q29tcG9uZW50ID0gTlVMTDsKLQlTSW50MTYgZGVmYXVsdFRlcm1pbm9sb2d5ID0gMDsKLQlCb29sZWFuIGRpZExhdW5jaCA9IDA7Ci0JT1NBRXJyb3IgZXJyOwotCWxvbmcgbW9kZUZsYWdzID0gMDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfGkiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MsICZtb2RlRmxhZ3MpKQotCQkgcmV0dXJuIE5VTEw7Ci0JCi0JZGVmYXVsdENvbXBvbmVudCA9IE9wZW5EZWZhdWx0Q29tcG9uZW50IChrT1NBQ29tcG9uZW50VHlwZSwgJ2FzY3InKTsKLQllcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIChkZWZhdWx0Q29tcG9uZW50KTsKLQlpZiAoZXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQllcnIgPSBPU0FHZXRBcHBUZXJtaW5vbG9neSAoCi0gICAgCWRlZmF1bHRDb21wb25lbnQsIAotICAgIAltb2RlRmxhZ3MsCi0gICAgCSZmc3MsIAotICAgIAlkZWZhdWx0VGVybWlub2xvZ3ksIAotICAgIAkmZGlkTGF1bmNoLCAKLSAgICAJJnRoZURlc2MKLQkpOwotCWlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmkiLCBBRURlc2NfTmV3LCAmdGhlRGVzYywgZGlkTGF1bmNoKTsKKyAgICBBRURlc2MgdGhlRGVzYyA9IHswLDB9OworICAgIEZTU3BlYyBmc3M7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgZGVmYXVsdENvbXBvbmVudCA9IE5VTEw7CisgICAgU0ludDE2IGRlZmF1bHRUZXJtaW5vbG9neSA9IDA7CisgICAgQm9vbGVhbiBkaWRMYXVuY2ggPSAwOworICAgIE9TQUVycm9yIGVycjsKKyAgICBsb25nIG1vZGVGbGFncyA9IDA7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfGkiLCBQeU1hY19HZXRGU1NwZWMsICZmc3MsICZtb2RlRmxhZ3MpKQorICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZGVmYXVsdENvbXBvbmVudCA9IE9wZW5EZWZhdWx0Q29tcG9uZW50IChrT1NBQ29tcG9uZW50VHlwZSwgJ2FzY3InKTsKKyAgICBlcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIChkZWZhdWx0Q29tcG9uZW50KTsKKyAgICBpZiAoZXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBlcnIgPSBPU0FHZXRBcHBUZXJtaW5vbG9neSAoCisgICAgZGVmYXVsdENvbXBvbmVudCwKKyAgICBtb2RlRmxhZ3MsCisgICAgJmZzcywKKyAgICBkZWZhdWx0VGVybWlub2xvZ3ksCisgICAgJmRpZExhdW5jaCwKKyAgICAmdGhlRGVzYworICAgICk7CisgICAgaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8maSIsIEFFRGVzY19OZXcsICZ0aGVEZXNjLCBkaWRMYXVuY2gpOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0vKiAKKy8qCiAgKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgT1NBVGVybWlub2xvZ3lfbWV0aG9kc1tdID0KIHsKICNpZm5kZWYgX19MUDY0X18KLSAgCXsiR2V0QXBwVGVybWlub2xvZ3kiLCAKLQkJKFB5Q0Z1bmN0aW9uKSBQeU9TQV9HZXRBcHBUZXJtaW5vbG9neSwKLQkJTUVUSF9WQVJBUkdTLAotCQkiR2V0IGFuIGFwcGxpY2F0aW9ucyB0ZXJtaW5vbG9neSwgYXMgYW4gQUVEZXNjIG9iamVjdC4ifSwKLSAgCXsiR2V0U3lzVGVybWlub2xvZ3kiLCAKLQkJKFB5Q0Z1bmN0aW9uKSBQeU9TQV9HZXRTeXNUZXJtaW5vbG9neSwKLQkJTUVUSF9WQVJBUkdTLAotCQkiR2V0IGFuIGFwcGxpY2F0aW9ucyBzeXN0ZW0gdGVybWlub2xvZ3ksIGFzIGFuIEFFRGVzYyBvYmplY3QuIn0sCisgICAgeyJHZXRBcHBUZXJtaW5vbG9neSIsCisgICAgICAgIChQeUNGdW5jdGlvbikgUHlPU0FfR2V0QXBwVGVybWlub2xvZ3ksCisgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgIkdldCBhbiBhcHBsaWNhdGlvbnMgdGVybWlub2xvZ3ksIGFzIGFuIEFFRGVzYyBvYmplY3QuIn0sCisgICAgeyJHZXRTeXNUZXJtaW5vbG9neSIsCisgICAgICAgIChQeUNGdW5jdGlvbikgUHlPU0FfR2V0U3lzVGVybWlub2xvZ3ksCisgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgIkdldCBhbiBhcHBsaWNhdGlvbnMgc3lzdGVtIHRlcm1pbm9sb2d5LCBhcyBhbiBBRURlc2Mgb2JqZWN0LiJ9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXtOVUxMLCAoUHlDRnVuY3Rpb24pIE5VTEwsIDAsIE5VTEx9CisgICAge05VTEwsIChQeUNGdW5jdGlvbikgTlVMTCwgMCwgTlVMTH0KIH07CiAKIHZvaWQKIGluaXRPU0FUZXJtaW5vbG9neSh2b2lkKQogewotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBPU0FUZXJtaW5vbG9neSBpcyByZW1vdmVkLiIsIDEpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0luaXRNb2R1bGUoIk9TQVRlcm1pbm9sb2d5IiwgT1NBVGVybWlub2xvZ3lfbWV0aG9kcyk7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIE9TQVRlcm1pbm9sb2d5IGlzIHJlbW92ZWQuIiwgMSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSW5pdE1vZHVsZSgiT1NBVGVybWlub2xvZ3kiLCBPU0FUZXJtaW5vbG9neV9tZXRob2RzKTsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL19zY3Byb3h5LmMgYi9NYWMvTW9kdWxlcy9fc2Nwcm94eS5jCmluZGV4IDlmNGMxYTQuLmRkNWEyOTMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL19zY3Byb3h5LmMKKysrIGIvTWFjL01vZHVsZXMvX3NjcHJveHkuYwpAQCAtNSwxNjIgKzUsMTYyIEBACiAjaW5jbHVkZSA8UHl0aG9uLmg+CiAjaW5jbHVkZSA8U3lzdGVtQ29uZmlndXJhdGlvbi9TeXN0ZW1Db25maWd1cmF0aW9uLmg+CiAKLXN0YXRpYyBpbnQzMl90IAorc3RhdGljIGludDMyX3QKIGNmbnVtX3RvX2ludDMyKENGTnVtYmVyUmVmIG51bSkKIHsKLQlpbnQzMl90IHJlc3VsdDsKKyAgICBpbnQzMl90IHJlc3VsdDsKIAotCUNGTnVtYmVyR2V0VmFsdWUobnVtLCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmcmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIENGTnVtYmVyR2V0VmFsdWUobnVtLCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBjZnN0cmluZ190b19weXN0cmluZyhDRlN0cmluZ1JlZiByZWYpCiB7Ci0JY29uc3QgY2hhciogczsgCisgICAgY29uc3QgY2hhciogczsKIAotCXMgPSBDRlN0cmluZ0dldENTdHJpbmdQdHIocmVmLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwotCWlmIChzKSB7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgIHMgPSBDRlN0cmluZ0dldENTdHJpbmdQdHIocmVmLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOworICAgIGlmIChzKSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOwogCi0JfSBlbHNlIHsKLQkJQ0ZJbmRleCBsZW4gPSBDRlN0cmluZ0dldExlbmd0aChyZWYpOwotCQlCb29sZWFuIG9rOwotCQlQeU9iamVjdCogcmVzdWx0OwotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQ0ZJbmRleCBsZW4gPSBDRlN0cmluZ0dldExlbmd0aChyZWYpOworICAgICAgICBCb29sZWFuIG9rOworICAgICAgICBQeU9iamVjdCogcmVzdWx0OworICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qNCk7CiAKLQkJb2sgPSBDRlN0cmluZ0dldENTdHJpbmcocmVmLCAKLQkJCQlQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwKLQkJCQlQeVN0cmluZ19HRVRfU0laRShyZXN1bHQpLAotCQkJCWtDRlN0cmluZ0VuY29kaW5nVVRGOCk7Ci0JCWlmICghb2spIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIAotCQkJCXN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgICAgICBvayA9IENGU3RyaW5nR2V0Q1N0cmluZyhyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOworICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LAorICAgICAgICAgICAgICAgIHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQogCiAKIHN0YXRpYyBQeU9iamVjdCoKIGdldF9wcm94eV9zZXR0aW5ncyhQeU9iamVjdCogbW9kIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSkKIHsKLQlDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0ID0gTlVMTDsKLQlDRk51bWJlclJlZiBhTnVtID0gTlVMTDsKLQlDRkFycmF5UmVmIGFuQXJyYXkgPSBOVUxMOwotCVB5T2JqZWN0KiByZXN1bHQgPSBOVUxMOwotCVB5T2JqZWN0KiB2OwotCWludCByOworICAgIENGRGljdGlvbmFyeVJlZiBwcm94eURpY3QgPSBOVUxMOworICAgIENGTnVtYmVyUmVmIGFOdW0gPSBOVUxMOworICAgIENGQXJyYXlSZWYgYW5BcnJheSA9IE5VTEw7CisgICAgUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QqIHY7CisgICAgaW50IHI7CiAKLQlwcm94eURpY3QgPSBTQ0R5bmFtaWNTdG9yZUNvcHlQcm94aWVzKE5VTEwpOwotCWlmICghcHJveHlEaWN0KSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIHByb3h5RGljdCA9IFNDRHluYW1pY1N0b3JlQ29weVByb3hpZXMoTlVMTCk7CisgICAgaWYgKCFwcm94eURpY3QpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiAKLQlyZXN1bHQgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIHJlc3VsdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIGdvdG8gZXJyb3I7CiAKLQlpZiAoJmtTQ1Byb3BOZXRQcm94aWVzRXhjbHVkZVNpbXBsZUhvc3RuYW1lcyAhPSBOVUxMKSB7Ci0JCWFOdW0gPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIAotCQkJa1NDUHJvcE5ldFByb3hpZXNFeGNsdWRlU2ltcGxlSG9zdG5hbWVzKTsKLQkJaWYgKGFOdW0gPT0gTlVMTCkgewotCQkJdiA9IFB5Qm9vbF9Gcm9tTG9uZygxKTsKLQkJfSBlbHNlIHsKLQkJCXYgPSBQeUJvb2xfRnJvbUxvbmcoY2ZudW1fdG9faW50MzIoYU51bSkpOwotCQl9Ci0JfSAgZWxzZSB7Ci0JCXYgPSBQeUJvb2xfRnJvbUxvbmcoMSk7Ci0JfQorICAgIGlmICgma1NDUHJvcE5ldFByb3hpZXNFeGNsdWRlU2ltcGxlSG9zdG5hbWVzICE9IE5VTEwpIHsKKyAgICAgICAgYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwKKyAgICAgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzRXhjbHVkZVNpbXBsZUhvc3RuYW1lcyk7CisgICAgICAgIGlmIChhTnVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIHYgPSBQeUJvb2xfRnJvbUxvbmcoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ID0gUHlCb29sX0Zyb21Mb25nKGNmbnVtX3RvX2ludDMyKGFOdW0pKTsKKyAgICAgICAgfQorICAgIH0gIGVsc2UgeworICAgICAgICB2ID0gUHlCb29sX0Zyb21Mb25nKDEpOworICAgIH0KIAotCWlmICh2ID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgaWYgKHYgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCXIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsICJleGNsdWRlX3NpbXBsZSIsIHYpOwotCVB5X0RFQ1JFRih2KTsgdiA9IE5VTEw7Ci0JaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CisgICAgciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwgImV4Y2x1ZGVfc2ltcGxlIiwgdik7CisgICAgUHlfREVDUkVGKHYpOyB2ID0gTlVMTDsKKyAgICBpZiAociA9PSAtMSkgZ290byBlcnJvcjsKIAotCWFuQXJyYXkgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIAotCQkJa1NDUHJvcE5ldFByb3hpZXNFeGNlcHRpb25zTGlzdCk7Ci0JaWYgKGFuQXJyYXkgIT0gTlVMTCkgewotCQlDRkluZGV4IGxlbiA9IENGQXJyYXlHZXRDb3VudChhbkFycmF5KTsKLQkJQ0ZJbmRleCBpOwotCQl2ID0gUHlUdXBsZV9OZXcobGVuKTsKLQkJaWYgKHYgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICBhbkFycmF5ID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LAorICAgICAgICAgICAgICAgICAgICBrU0NQcm9wTmV0UHJveGllc0V4Y2VwdGlvbnNMaXN0KTsKKyAgICBpZiAoYW5BcnJheSAhPSBOVUxMKSB7CisgICAgICAgIENGSW5kZXggbGVuID0gQ0ZBcnJheUdldENvdW50KGFuQXJyYXkpOworICAgICAgICBDRkluZGV4IGk7CisgICAgICAgIHYgPSBQeVR1cGxlX05ldyhsZW4pOworICAgICAgICBpZiAodiA9PSBOVUxMKSBnb3RvIGVycm9yOwogCi0JCXIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsICJleGNlcHRpb25zIiwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CisgICAgICAgIHIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsICJleGNlcHRpb25zIiwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CiAKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlDRlN0cmluZ1JlZiBhU3RyaW5nID0gTlVMTDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBDRlN0cmluZ1JlZiBhU3RyaW5nID0gTlVMTDsKIAotCQkJYVN0cmluZyA9IENGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoYW5BcnJheSwgaSk7Ci0JCQlpZiAoYVN0cmluZyA9PSBOVUxMKSB7Ci0JCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIFB5X05vbmUpOwotCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUHlPYmplY3QqIHQgPSBjZnN0cmluZ190b19weXN0cmluZyhhU3RyaW5nKTsKLQkJCQlpZiAoIXQpIHsKLQkJCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIFB5X05vbmUpOwotCQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIGFTdHJpbmcgPSBDRkFycmF5R2V0VmFsdWVBdEluZGV4KGFuQXJyYXksIGkpOworICAgICAgICAgICAgaWYgKGFTdHJpbmcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0KiB0ID0gY2ZzdHJpbmdfdG9fcHlzdHJpbmcoYVN0cmluZyk7CisgICAgICAgICAgICAgICAgaWYgKCF0KSB7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlDRlJlbGVhc2UocHJveHlEaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIENGUmVsZWFzZShwcm94eURpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiAKIGVycm9yOgotCWlmIChwcm94eURpY3QpICBDRlJlbGVhc2UocHJveHlEaWN0KTsKLQlQeV9YREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKHByb3h5RGljdCkgIENGUmVsZWFzZShwcm94eURpY3QpOworICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogc2V0X3Byb3h5KFB5T2JqZWN0KiBwcm94aWVzLCBjaGFyKiBwcm90bywgQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCwKLQkJQ0ZTdHJpbmdSZWYgZW5hYmxlZEtleSwgCi0JCUNGU3RyaW5nUmVmIGhvc3RLZXksIENGU3RyaW5nUmVmIHBvcnRLZXkpCisgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgZW5hYmxlZEtleSwKKyAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBob3N0S2V5LCBDRlN0cmluZ1JlZiBwb3J0S2V5KQogewotCUNGTnVtYmVyUmVmIGFOdW07CisgICAgQ0ZOdW1iZXJSZWYgYU51bTsKIAotCWFOdW0gPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIGVuYWJsZWRLZXkpOwotCWlmIChhTnVtICYmIGNmbnVtX3RvX2ludDMyKGFOdW0pKSB7Ci0JCUNGU3RyaW5nUmVmIGhvc3RTdHJpbmc7CisgICAgYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwgZW5hYmxlZEtleSk7CisgICAgaWYgKGFOdW0gJiYgY2ZudW1fdG9faW50MzIoYU51bSkpIHsKKyAgICAgICAgQ0ZTdHJpbmdSZWYgaG9zdFN0cmluZzsKIAotCQlob3N0U3RyaW5nID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LCBob3N0S2V5KTsKLQkJYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwgcG9ydEtleSk7CisgICAgICAgIGhvc3RTdHJpbmcgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIGhvc3RLZXkpOworICAgICAgICBhTnVtID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LCBwb3J0S2V5KTsKIAotCQlpZiAoaG9zdFN0cmluZykgewotCQkJaW50IHI7Ci0JCQlQeU9iamVjdCogaCA9IGNmc3RyaW5nX3RvX3B5c3RyaW5nKGhvc3RTdHJpbmcpOwotCQkJUHlPYmplY3QqIHY7Ci0JCQlpZiAoaCkgewotCQkJCWlmIChhTnVtKSB7Ci0JCQkJCWludDMyX3QgcG9ydCA9IGNmbnVtX3RvX2ludDMyKGFOdW0pOwotCQkJCQl2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzOiVsZCIsCi0JCQkJCQlQeVN0cmluZ19BU19TVFJJTkcoaCksCi0JCQkJCQkobG9uZylwb3J0KTsKLQkJCQl9IGVsc2UgewotCQkJCQl2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzIiwKLQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORyhoKSk7Ci0JCQkJfQotCQkJCVB5X0RFQ1JFRihoKTsKLQkJCQlpZiAoIXYpIHJldHVybiAtMTsKLQkJCQlyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcocHJveGllcywgcHJvdG8sCi0JCQkJCXYpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoaG9zdFN0cmluZykgeworICAgICAgICAgICAgaW50IHI7CisgICAgICAgICAgICBQeU9iamVjdCogaCA9IGNmc3RyaW5nX3RvX3B5c3RyaW5nKGhvc3RTdHJpbmcpOworICAgICAgICAgICAgUHlPYmplY3QqIHY7CisgICAgICAgICAgICBpZiAoaCkgeworICAgICAgICAgICAgICAgIGlmIChhTnVtKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcG9ydCA9IGNmbnVtX3RvX2ludDMyKGFOdW0pOworICAgICAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzOiVsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoaCksCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZylwb3J0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiaHR0cDovLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXYpIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcocHJveGllcywgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgIHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JfQotCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xNjgsNjQgKzE2OCw2NCBAQAogc3RhdGljIFB5T2JqZWN0KgogZ2V0X3Byb3hpZXMoUHlPYmplY3QqIG1vZCBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSkpCiB7Ci0JUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7Ci0JaW50IHI7Ci0JQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCA9IE5VTEw7CisgICAgUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7CisgICAgaW50IHI7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCA9IE5VTEw7CiAKLQlwcm94eURpY3QgPSBTQ0R5bmFtaWNTdG9yZUNvcHlQcm94aWVzKE5VTEwpOwotCWlmIChwcm94eURpY3QgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlEaWN0X05ldygpOwotCX0KKyAgICBwcm94eURpY3QgPSBTQ0R5bmFtaWNTdG9yZUNvcHlQcm94aWVzKE5VTEwpOworICAgIGlmIChwcm94eURpY3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlEaWN0X05ldygpOworICAgIH0KIAotCXJlc3VsdCA9IFB5RGljdF9OZXcoKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgcmVzdWx0ID0gUHlEaWN0X05ldygpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCXIgPSBzZXRfcHJveHkocmVzdWx0LCAiaHR0cCIsIHByb3h5RGljdCwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQRW5hYmxlLAotCQlrU0NQcm9wTmV0UHJveGllc0hUVFBQcm94eSwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQUG9ydCk7Ci0JaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7Ci0JciA9IHNldF9wcm94eShyZXN1bHQsICJodHRwcyIsIHByb3h5RGljdCwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQU0VuYWJsZSwKLQkJa1NDUHJvcE5ldFByb3hpZXNIVFRQU1Byb3h5LAotCQlrU0NQcm9wTmV0UHJveGllc0hUVFBTUG9ydCk7Ci0JaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7Ci0JciA9IHNldF9wcm94eShyZXN1bHQsICJmdHAiLCBwcm94eURpY3QsCi0JCWtTQ1Byb3BOZXRQcm94aWVzRlRQRW5hYmxlLAotCQlrU0NQcm9wTmV0UHJveGllc0ZUUFByb3h5LAotCQlrU0NQcm9wTmV0UHJveGllc0ZUUFBvcnQpOwotCWlmIChyID09IC0xKSBnb3RvIGVycm9yOwotCXIgPSBzZXRfcHJveHkocmVzdWx0LCAiZ29waGVyIiwgcHJveHlEaWN0LAotCQlrU0NQcm9wTmV0UHJveGllc0dvcGhlckVuYWJsZSwKLQkJa1NDUHJvcE5ldFByb3hpZXNHb3BoZXJQcm94eSwKLQkJa1NDUHJvcE5ldFByb3hpZXNHb3BoZXJQb3J0KTsKLQlpZiAociA9PSAtMSkgZ290byBlcnJvcjsKKyAgICByID0gc2V0X3Byb3h5KHJlc3VsdCwgImh0dHAiLCBwcm94eURpY3QsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUEVuYWJsZSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNIVFRQUHJveHksCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUFBvcnQpOworICAgIGlmIChyID09IC0xKSBnb3RvIGVycm9yOworICAgIHIgPSBzZXRfcHJveHkocmVzdWx0LCAiaHR0cHMiLCBwcm94eURpY3QsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUFNFbmFibGUsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzSFRUUFNQcm94eSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNIVFRQU1BvcnQpOworICAgIGlmIChyID09IC0xKSBnb3RvIGVycm9yOworICAgIHIgPSBzZXRfcHJveHkocmVzdWx0LCAiZnRwIiwgcHJveHlEaWN0LAorICAgICAgICBrU0NQcm9wTmV0UHJveGllc0ZUUEVuYWJsZSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNGVFBQcm94eSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNGVFBQb3J0KTsKKyAgICBpZiAociA9PSAtMSkgZ290byBlcnJvcjsKKyAgICByID0gc2V0X3Byb3h5KHJlc3VsdCwgImdvcGhlciIsIHByb3h5RGljdCwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNHb3BoZXJFbmFibGUsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzR29waGVyUHJveHksCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzR29waGVyUG9ydCk7CisgICAgaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CiAKLQlDRlJlbGVhc2UocHJveHlEaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIENGUmVsZWFzZShwcm94eURpY3QpOworICAgIHJldHVybiByZXN1bHQ7CiBlcnJvcjoKLQlpZiAocHJveHlEaWN0KSAgQ0ZSZWxlYXNlKHByb3h5RGljdCk7Ci0JUHlfWERFQ1JFRihyZXN1bHQpOwotCXJldHVybiBOVUxMOworICAgIGlmIChwcm94eURpY3QpICBDRlJlbGVhc2UocHJveHlEaWN0KTsKKyAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2RfbWV0aG9kc1tdID0gewotCXsKLQkJIl9nZXRfcHJveHlfc2V0dGluZ3MiLAotCQkoUHlDRnVuY3Rpb24pZ2V0X3Byb3h5X3NldHRpbmdzLAotCQlNRVRIX05PQVJHUywKLQkJTlVMTCwKLQl9LAotCXsKLQkJIl9nZXRfcHJveGllcyIsCi0JCShQeUNGdW5jdGlvbilnZXRfcHJveGllcywKLQkJTUVUSF9OT0FSR1MsCi0JCU5VTEwsCi0JfSwKLQl7IDAsIDAsIDAsIDAgfQorICAgIHsKKyAgICAgICAgIl9nZXRfcHJveHlfc2V0dGluZ3MiLAorICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X3Byb3h5X3NldHRpbmdzLAorICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgICAgTlVMTCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgIl9nZXRfcHJveGllcyIsCisgICAgICAgIChQeUNGdW5jdGlvbilnZXRfcHJveGllcywKKyAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgICAgIE5VTEwsCisgICAgfSwKKyAgICB7IDAsIDAsIDAsIDAgfQogfTsKIAogdm9pZCBpbml0X3NjcHJveHkodm9pZCkKIHsKLQkodm9pZClQeV9Jbml0TW9kdWxlNCgiX3NjcHJveHkiLCBtb2RfbWV0aG9kcywgTlVMTCwgTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAodm9pZClQeV9Jbml0TW9kdWxlNCgiX3NjcHJveHkiLCBtb2RfbWV0aG9kcywgTlVMTCwgTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2FlL19BRW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKaW5kZXggMDkxMDVhNS4uMjFhMmQ0MCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKQEAgLTEzLDkgKzEzLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM4LDkgKzM4LDkgQEAKIAogc3RhdGljIHBhc2NhbCBCb29sZWFuIEFFSWRsZVByb2MoRXZlbnRSZWNvcmQgKnRoZUV2ZW50LCBsb25nICpzbGVlcFRpbWUsIFJnbkhhbmRsZSAqbW91c2VSZ24pCiB7Ci0gICAgICAgIGlmICggUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBQeU9TX0ludGVycnVwdE9jY3VycmVkKCkgKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogQUVJZGxlVVBQIHVwcF9BRUlkbGVQcm9jOwpAQCAtNTQsODA3ICs1NCw4MDcgQEAKICNkZWZpbmUgQUVEZXNjX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkFFRGVzY19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZBRURlc2NfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEFFRGVzY09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUFFRGVzYyBvYl9pdHNlbGY7Ci0JaW50IG9iX293bmVkOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBBRURlc2Mgb2JfaXRzZWxmOworICAgIGludCBvYl9vd25lZDsKIH0gQUVEZXNjT2JqZWN0OwogCiBQeU9iamVjdCAqQUVEZXNjX05ldyhBRURlc2MgKml0c2VsZikKIHsKLQlBRURlc2NPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEFFRGVzY09iamVjdCwgJkFFRGVzY19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JaXQtPm9iX293bmVkID0gMTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQUVEZXNjT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhBRURlc2NPYmplY3QsICZBRURlc2NfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSAqaXRzZWxmOworICAgIGl0LT5vYl9vd25lZCA9IDE7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQUVEZXNjX0NvbnZlcnQoUHlPYmplY3QgKnYsIEFFRGVzYyAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFBRURlc2NfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQUVEZXNjIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEFFRGVzY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFBRURlc2NfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQUVEZXNjIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEFFRGVzY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEFFRGVzY19kZWFsbG9jKEFFRGVzY09iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2Jfb3duZWQpIEFFRGlzcG9zZURlc2MoJnNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2Jfb3duZWQpIEFFRGlzcG9zZURlc2MoJnNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVDb2VyY2VEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEZXNjVHlwZSB0b1R5cGU7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSB0b1R5cGU7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVDb2VyY2VEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVDb2VyY2VEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNvZXJjZURlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0b1R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVDb2VyY2VEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdG9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdG9UeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFQ29lcmNlRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVEdXBsaWNhdGVEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRURlc2MgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFRGVzYyByZXN1bHQ7CiAjaWZuZGVmIEFFRHVwbGljYXRlRGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFRHVwbGljYXRlRGVzYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVEdXBsaWNhdGVEZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVEdXBsaWNhdGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVEdXBsaWNhdGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUNvdW50SXRlbXMoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgdGhlQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyB0aGVDb3VudDsKICNpZm5kZWYgQUVDb3VudEl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soQUVDb3VudEl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNvdW50SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUNvdW50SXRlbXMoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmdGhlQ291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFQ291bnRJdGVtcygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVB1dFB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpbmRleDsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQljaGFyICpkYXRhUHRyX19pbl9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKICNpZm5kZWYgQUVQdXRQdHIKLQlQeU1hY19QUkVDSEVDSyhBRVB1dFB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVQdXRQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVQdXRQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFUHV0UHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVQdXREZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OwotCUFFRGVzYyB0aGVBRURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpbmRleDsKKyAgICBBRURlc2MgdGhlQUVEZXNjOwogI2lmbmRlZiBBRVB1dERlc2MKLQlQeU1hY19QUkVDSEVDSyhBRVB1dERlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUHV0RGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQUVEZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUHV0RGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgJnRoZUFFRGVzYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVB1dERlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVBRURlc2MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUdldE50aFB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpbmRleDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX291dF9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19vdXRfXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKICNpZm5kZWYgQUVHZXROdGhQdHIKLQlQeU1hY19QUkVDSEVDSyhBRUdldE50aFB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXROdGhQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8maSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRUdldE50aFB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCBkYXRhUHRyX19sZW5fXywgJmRhdGFQdHJfX2xlbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKLQlmcmVlKGRhdGFQdHJfX291dF9fKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGRhdGFQdHJfX2Vycm9yX187CisgICAgfQorICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFR2V0TnRoUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIGRhdGFQdHJfX2xlbl9fLCAmZGF0YVB0cl9fbGVuX18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXROdGhEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluZGV4OworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVHZXROdGhEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXROdGhEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldE50aERlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldE50aERlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUdldE50aERlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFU2l6ZU9mTnRoSXRlbShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpbmRleDsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQlTaXplIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgU2l6ZSBkYXRhU2l6ZTsKICNpZm5kZWYgQUVTaXplT2ZOdGhJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soQUVTaXplT2ZOdGhJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVNpemVPZk50aEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNpemVPZk50aEl0ZW0oJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVTaXplT2ZOdGhJdGVtKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVEZWxldGVJdGVtKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIEFFRGVsZXRlSXRlbQotCVB5TWFjX1BSRUNIRUNLKEFFRGVsZXRlSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVEZWxldGVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVEZWxldGVJdGVtKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVEZWxldGVJdGVtKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVB1dFBhcmFtUHRyKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRVB1dFBhcmFtUHRyCi0JUHlNYWNfUFJFQ0hFQ0soQUVQdXRQYXJhbVB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVQdXRQYXJhbVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVQdXRQYXJhbVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRVB1dFBhcmFtUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUHV0UGFyYW1EZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCUFFRGVzYyB0aGVBRURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBBRURlc2MgdGhlQUVEZXNjOwogI2lmbmRlZiBBRVB1dFBhcmFtRGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFUHV0UGFyYW1EZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVB1dFBhcmFtRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVB1dFBhcmFtRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVB1dFBhcmFtRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXRQYXJhbVB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQljaGFyICpkYXRhUHRyX19vdXRfXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRUdldFBhcmFtUHRyCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRQYXJhbVB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXRQYXJhbVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maSIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRUdldFBhcmFtUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIGRhdGFQdHJfX2xlbl9fLCAmZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgKGludClkYXRhUHRyX19sZW5fXyk7Ci0JZnJlZShkYXRhUHRyX19vdXRfXyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGRhdGFQdHJfX291dF9fID0gbWFsbG9jKGRhdGFQdHJfX2luX2xlbl9fKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZGF0YVB0cl9fZXJyb3JfXzsKKyAgICB9CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVHZXRQYXJhbVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCBkYXRhUHRyX19sZW5fXywgJmRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXRQYXJhbURlc2MoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JRGVzY1R5cGUgZGVzaXJlZFR5cGU7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIEFFRGVzYyByZXN1bHQ7CiAjaWZuZGVmIEFFR2V0UGFyYW1EZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRQYXJhbURlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFR2V0UGFyYW1EZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFR2V0UGFyYW1EZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVHZXRQYXJhbURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVTaXplT2ZQYXJhbShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQlTaXplIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgU2l6ZSBkYXRhU2l6ZTsKICNpZm5kZWYgQUVTaXplT2ZQYXJhbQotCVB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mUGFyYW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mUGFyYW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVTaXplT2ZQYXJhbSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU2l6ZU9mUGFyYW0oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVEZWxldGVQYXJhbShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwogI2lmbmRlZiBBRURlbGV0ZVBhcmFtCi0JUHlNYWNfUFJFQ0hFQ0soQUVEZWxldGVQYXJhbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVEZWxldGVQYXJhbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRURlbGV0ZVBhcmFtKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVEZWxldGVQYXJhbSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUdldEF0dHJpYnV0ZVB0cihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlEZXNjVHlwZSB0eXBlQ29kZTsKLQljaGFyICpkYXRhUHRyX19vdXRfXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRUdldEF0dHJpYnV0ZVB0cgotCVB5TWFjX1BSRUNIRUNLKEFFR2V0QXR0cmlidXRlUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldEF0dHJpYnV0ZVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maSIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRUdldEF0dHJpYnV0ZVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgZGF0YVB0cl9fbGVuX18sICZkYXRhUHRyX19sZW5fXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKLQlmcmVlKGRhdGFQdHJfX291dF9fKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBkYXRhUHRyX19lcnJvcl9fOworICAgIH0KKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRUdldEF0dHJpYnV0ZVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgZGF0YVB0cl9fbGVuX18sICZkYXRhUHRyX19sZW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKKyAgICBmcmVlKGRhdGFQdHJfX291dF9fKTsKICBkYXRhUHRyX19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFR2V0QXR0cmlidXRlRGVzYyhBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlBRURlc2MgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVHZXRBdHRyaWJ1dGVEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRBdHRyaWJ1dGVEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldEF0dHJpYnV0ZURlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVHZXRBdHRyaWJ1dGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVHZXRBdHRyaWJ1dGVEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFU2l6ZU9mQXR0cmlidXRlKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCVNpemUgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBTaXplIGRhdGFTaXplOwogI2lmbmRlZiBBRVNpemVPZkF0dHJpYnV0ZQotCVB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mQXR0cmlidXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVNpemVPZkF0dHJpYnV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNpemVPZkF0dHJpYnV0ZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU2l6ZU9mQXR0cmlidXRlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUHV0QXR0cmlidXRlUHRyKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRVB1dEF0dHJpYnV0ZVB0cgotCVB5TWFjX1BSRUNIRUNLKEFFUHV0QXR0cmlidXRlUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVB1dEF0dHJpYnV0ZVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVQdXRBdHRyaWJ1dGVQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVQdXRBdHRyaWJ1dGVQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVQdXRBdHRyaWJ1dGVEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCUFFRGVzYyB0aGVBRURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBBRURlc2MgdGhlQUVEZXNjOwogI2lmbmRlZiBBRVB1dEF0dHJpYnV0ZURlc2MKLQlQeU1hY19QUkVDSEVDSyhBRVB1dEF0dHJpYnV0ZURlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUHV0QXR0cmlidXRlRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVB1dEF0dHJpYnV0ZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFFRGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVB1dEF0dHJpYnV0ZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXREZXNjRGF0YVNpemUoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTaXplIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU2l6ZSBfcnY7CiAjaWZuZGVmIEFFR2V0RGVzY0RhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXREZXNjRGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFR2V0RGVzY0RhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBBRUdldERlc2NEYXRhU2l6ZSgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEFFR2V0RGVzY0RhdGFTaXplKCZfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVTZW5kKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBcHBsZUV2ZW50IHJlcGx5OwotCUFFU2VuZE1vZGUgc2VuZE1vZGU7Ci0JQUVTZW5kUHJpb3JpdHkgc2VuZFByaW9yaXR5OwotCWxvbmcgdGltZU91dEluVGlja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQXBwbGVFdmVudCByZXBseTsKKyAgICBBRVNlbmRNb2RlIHNlbmRNb2RlOworICAgIEFFU2VuZFByaW9yaXR5IHNlbmRQcmlvcml0eTsKKyAgICBsb25nIHRpbWVPdXRJblRpY2tzOwogI2lmbmRlZiBBRVNlbmQKLQlQeU1hY19QUkVDSEVDSyhBRVNlbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU2VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VuZE1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZW5kUHJpb3JpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lT3V0SW5UaWNrcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNlbmQoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAmcmVwbHksCi0JICAgICAgICAgICAgICBzZW5kTW9kZSwKLQkgICAgICAgICAgICAgIHNlbmRQcmlvcml0eSwKLQkgICAgICAgICAgICAgIHRpbWVPdXRJblRpY2tzLAotCSAgICAgICAgICAgICAgdXBwX0FFSWRsZVByb2MsCi0JICAgICAgICAgICAgICAoQUVGaWx0ZXJVUFApMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXBseSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbmRNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VuZFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZU91dEluVGlja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVTZW5kKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgJnJlcGx5LAorICAgICAgICAgICAgICAgICAgc2VuZE1vZGUsCisgICAgICAgICAgICAgICAgICBzZW5kUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICB0aW1lT3V0SW5UaWNrcywKKyAgICAgICAgICAgICAgICAgIHVwcF9BRUlkbGVQcm9jLAorICAgICAgICAgICAgICAgICAgKEFFRmlsdGVyVVBQKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVwbHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVJlc2V0VGltZXIoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBRVJlc2V0VGltZXIKLQlQeU1hY19QUkVDSEVDSyhBRVJlc2V0VGltZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUmVzZXRUaW1lcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUmVzZXRUaW1lcigmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVJlc2V0VGltZXIoJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQoJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVJlc3VtZVRoZUN1cnJlbnRFdmVudChBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQXBwbGVFdmVudCByZXBseTsKLQlBRUV2ZW50SGFuZGxlclVQUCBkaXNwYXRjaGVyX19wcm9jX18gPSB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlcjsKLQlQeU9iamVjdCAqZGlzcGF0Y2hlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBcHBsZUV2ZW50IHJlcGx5OworICAgIEFFRXZlbnRIYW5kbGVyVVBQIGRpc3BhdGNoZXJfX3Byb2NfXyA9IHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyOworICAgIFB5T2JqZWN0ICpkaXNwYXRjaGVyOwogI2lmbmRlZiBBRVJlc3VtZVRoZUN1cnJlbnRFdmVudAotCVB5TWFjX1BSRUNIRUNLKEFFUmVzdW1lVGhlQ3VycmVudEV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVJlc3VtZVRoZUN1cnJlbnRFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8iLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnJlcGx5LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVJlc3VtZVRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVyX19wcm9jX18sIAotCQkJCSAgICAgICAoU1JlZkNvbilkaXNwYXRjaGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYoZGlzcGF0Y2hlcik7IC8qIFhYWCBsZWFrLCBidXQgbmVlZGVkICovCi0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BhdGNoZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVSZXN1bWVUaGVDdXJyZW50RXZlbnQoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcl9fcHJvY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1JlZkNvbilkaXNwYXRjaGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoZGlzcGF0Y2hlcik7IC8qIFhYWCBsZWFrLCBidXQgbmVlZGVkICovCisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFR2V0VGhlQ3VycmVudEV2ZW50KEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQUVHZXRUaGVDdXJyZW50RXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRUdldFRoZUN1cnJlbnRFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXRUaGVDdXJyZW50RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUdldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFU2V0VGhlQ3VycmVudEV2ZW50KEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQUVTZXRUaGVDdXJyZW50RXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRVNldFRoZUN1cnJlbnRFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVTZXRUaGVDdXJyZW50RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVNldFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUmVzb2x2ZShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgY2FsbGJhY2tGbGFnczsKLQlBRURlc2MgdGhlVG9rZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgY2FsbGJhY2tGbGFnczsKKyAgICBBRURlc2MgdGhlVG9rZW47CiAjaWZuZGVmIEFFUmVzb2x2ZQotCVB5TWFjX1BSRUNIRUNLKEFFUmVzb2x2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVSZXNvbHZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2tGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVJlc29sdmUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBjYWxsYmFja0ZsYWdzLAotCSAgICAgICAgICAgICAgICAgJnRoZVRva2VuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRoZVRva2VuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVSZXNvbHZlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVUb2tlbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVUb2tlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0F1dG9EaXNwb3NlKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IG9ub2ZmLCBvbGQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZvbm9mZikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlvbGQgPSBfc2VsZi0+b2Jfb3duZWQ7Ci0JX3NlbGYtPm9iX293bmVkID0gb25vZmY7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOwotCXJldHVybiBfcmVzOworICAgIGludCBvbm9mZiwgb2xkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmb25vZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvbGQgPSBfc2VsZi0+b2Jfb3duZWQ7CisgICAgX3NlbGYtPm9iX293bmVkID0gb25vZmY7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBBRURlc2NfbWV0aG9kc1tdID0gewotCXsiQUVDb2VyY2VEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUNvZXJjZURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIHRvVHlwZSkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVEdXBsaWNhdGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUR1cGxpY2F0ZURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVDb3VudEl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUNvdW50SXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgdGhlQ291bnQpIil9LAotCXsiQUVQdXRQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0UHRyLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IE5vbmUiKX0sCi0JeyJBRVB1dERlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0RGVzYywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgQUVEZXNjIHRoZUFFRGVzYykgLT4gTm9uZSIpfSwKLQl7IkFFR2V0TnRoUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldE50aFB0ciwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSIpfSwKLQl7IkFFR2V0TnRoRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXROdGhEZXNjLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVTaXplT2ZOdGhJdGVtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNpemVPZk50aEl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCi0JeyJBRURlbGV0ZUl0ZW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFRGVsZXRlSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkFFUHV0UGFyYW1QdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0UGFyYW1QdHIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKLQl7IkFFUHV0UGFyYW1EZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVB1dFBhcmFtRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgQUVEZXNjIHRoZUFFRGVzYykgLT4gTm9uZSIpfSwKLQl7IkFFR2V0UGFyYW1QdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0UGFyYW1QdHIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBCdWZmZXIgZGF0YVB0cikgLT4gKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikiKX0sCi0JeyJBRUdldFBhcmFtRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRQYXJhbURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCi0JeyJBRVNpemVPZlBhcmFtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNpemVPZlBhcmFtLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIFNpemUgZGF0YVNpemUpIil9LAotCXsiQUVEZWxldGVQYXJhbSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVEZWxldGVQYXJhbSwgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCkgLT4gTm9uZSIpfSwKLQl7IkFFR2V0QXR0cmlidXRlUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldEF0dHJpYnV0ZVB0ciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSIpfSwKLQl7IkFFR2V0QXR0cmlidXRlRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRBdHRyaWJ1dGVEZXNjLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVTaXplT2ZBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mQXR0cmlidXRlLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIFNpemUgZGF0YVNpemUpIil9LAotCXsiQUVQdXRBdHRyaWJ1dGVQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0QXR0cmlidXRlUHRyLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IE5vbmUiKX0sCi0JeyJBRVB1dEF0dHJpYnV0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0QXR0cmlidXRlRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgQUVEZXNjIHRoZUFFRGVzYykgLT4gTm9uZSIpfSwKLQl7IkFFR2V0RGVzY0RhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldERlc2NEYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU2l6ZSBfcnYpIil9LAotCXsiQUVTZW5kIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNlbmQsIDEsCi0JIFB5RG9jX1NUUigiKEFFU2VuZE1vZGUgc2VuZE1vZGUsIEFFU2VuZFByaW9yaXR5IHNlbmRQcmlvcml0eSwgbG9uZyB0aW1lT3V0SW5UaWNrcykgLT4gKEFwcGxlRXZlbnQgcmVwbHkpIil9LAotCXsiQUVSZXNldFRpbWVyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc2V0VGltZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTdXNwZW5kVGhlQ3VycmVudEV2ZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBRVJlc3VtZVRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVSZXN1bWVUaGVDdXJyZW50RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEFwcGxlRXZlbnQgcmVwbHksIEV2ZW50SGFuZGxlciBkaXNwYXRjaGVyKSAtPiBOb25lIil9LAotCXsiQUVHZXRUaGVDdXJyZW50RXZlbnQiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0VGhlQ3VycmVudEV2ZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBRVNldFRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTZXRUaGVDdXJyZW50RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFFUmVzb2x2ZSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVSZXNvbHZlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjYWxsYmFja0ZsYWdzKSAtPiAoQUVEZXNjIHRoZVRva2VuKSIpfSwKLQl7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BdXRvRGlzcG9zZSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IEFFRGlzcG9zZURlc2MgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJBRUNvZXJjZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFQ29lcmNlRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGVzY1R5cGUgdG9UeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRUR1cGxpY2F0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFRHVwbGljYXRlRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRUNvdW50SXRlbXMiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFQ291bnRJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyB0aGVDb3VudCkiKX0sCisgICAgeyJBRVB1dFB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKKyAgICB7IkFFUHV0RGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXREZXNjLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4LCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXROdGhQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0TnRoUHRyLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4LCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIil9LAorICAgIHsiQUVHZXROdGhEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldE50aERlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRVNpemVPZk50aEl0ZW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mTnRoSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKERlc2NUeXBlIHR5cGVDb2RlLCBTaXplIGRhdGFTaXplKSIpfSwKKyAgICB7IkFFRGVsZXRlSXRlbSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVEZWxldGVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiQUVQdXRQYXJhbVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRQYXJhbVB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiBOb25lIil9LAorICAgIHsiQUVQdXRQYXJhbURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0UGFyYW1EZXNjLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXRQYXJhbVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRQYXJhbVB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSIpfSwKKyAgICB7IkFFR2V0UGFyYW1EZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldFBhcmFtRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7IkFFU2l6ZU9mUGFyYW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mUGFyYW0sIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJBRURlbGV0ZVBhcmFtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRURlbGV0ZVBhcmFtLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXRBdHRyaWJ1dGVQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0QXR0cmlidXRlUHRyLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIil9LAorICAgIHsiQUVHZXRBdHRyaWJ1dGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldEF0dHJpYnV0ZURlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRVNpemVPZkF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTaXplT2ZBdHRyaWJ1dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJBRVB1dEF0dHJpYnV0ZVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRBdHRyaWJ1dGVQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKKyAgICB7IkFFUHV0QXR0cmlidXRlRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRBdHRyaWJ1dGVEZXNjLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAorICAgIHsiQUVHZXREZXNjRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0RGVzY0RhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTaXplIF9ydikiKX0sCisgICAgeyJBRVNlbmQiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2VuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVTZW5kTW9kZSBzZW5kTW9kZSwgQUVTZW5kUHJpb3JpdHkgc2VuZFByaW9yaXR5LCBsb25nIHRpbWVPdXRJblRpY2tzKSAtPiAoQXBwbGVFdmVudCByZXBseSkiKX0sCisgICAgeyJBRVJlc2V0VGltZXIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUmVzZXRUaW1lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVTdXNwZW5kVGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFFUmVzdW1lVGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc3VtZVRoZUN1cnJlbnRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQXBwbGVFdmVudCByZXBseSwgRXZlbnRIYW5kbGVyIGRpc3BhdGNoZXIpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldFRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRUaGVDdXJyZW50RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFFU2V0VGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNldFRoZUN1cnJlbnRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVSZXNvbHZlIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc29sdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGNhbGxiYWNrRmxhZ3MpIC0+IChBRURlc2MgdGhlVG9rZW4pIil9LAorICAgIHsiQXV0b0Rpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0F1dG9EaXNwb3NlLCAxLAorICAgICBQeURvY19TVFIoIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgQUVEaXNwb3NlRGVzYyB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX2dldF90eXBlKEFFRGVzY09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlNYWNfQnVpbGRPU1R5cGUoc2VsZi0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlKTsKKyAgICByZXR1cm4gUHlNYWNfQnVpbGRPU1R5cGUoc2VsZi0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlKTsKIH0KIAogI2RlZmluZSBBRURlc2Nfc2V0X3R5cGUgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19nZXRfZGF0YShBRURlc2NPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlTaXplIHNpemU7Ci0JY2hhciAqcHRyOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFNpemUgc2l6ZTsKKyAgICBjaGFyICpwdHI7CisgICAgT1NFcnIgZXJyOwogCi0Jc2l6ZSA9IEFFR2V0RGVzY0RhdGFTaXplKCZzZWxmLT5vYl9pdHNlbGYpOwotCWlmICggKHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCAocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCWlmICggKGVycj1BRUdldERlc2NEYXRhKCZzZWxmLT5vYl9pdHNlbGYsIHB0ciwgc2l6ZSkpIDwgMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiByZXM7CisgICAgc2l6ZSA9IEFFR2V0RGVzY0RhdGFTaXplKCZzZWxmLT5vYl9pdHNlbGYpOworICAgIGlmICggKHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCAocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggKGVycj1BRUdldERlc2NEYXRhKCZzZWxmLT5vYl9pdHNlbGYsIHB0ciwgc2l6ZSkpIDwgMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiByZXM7CiB9CiAKICNkZWZpbmUgQUVEZXNjX3NldF9kYXRhIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEFFRGVzY19nZXRzZXRsaXN0W10gPSB7Ci0JeyJ0eXBlIiwgKGdldHRlcilBRURlc2NfZ2V0X3R5cGUsIChzZXR0ZXIpQUVEZXNjX3NldF90eXBlLCAiVHlwZSBvZiB0aGlzIEFFRGVzYyJ9LAotCXsiZGF0YSIsIChnZXR0ZXIpQUVEZXNjX2dldF9kYXRhLCAoc2V0dGVyKUFFRGVzY19zZXRfZGF0YSwgIlRoZSByYXcgZGF0YSBpbiB0aGlzIEFFRGVzYyJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7InR5cGUiLCAoZ2V0dGVyKUFFRGVzY19nZXRfdHlwZSwgKHNldHRlcilBRURlc2Nfc2V0X3R5cGUsICJUeXBlIG9mIHRoaXMgQUVEZXNjIn0sCisgICAgeyJkYXRhIiwgKGdldHRlcilBRURlc2NfZ2V0X2RhdGEsIChzZXR0ZXIpQUVEZXNjX3NldF9kYXRhLCAiVGhlIHJhdyBkYXRhIGluIHRoaXMgQUVEZXNjIn0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC04NjksNjEgKzg2OSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQUVEZXNjIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQUVEZXNjIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEFFRGVzY19Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEFFRGVzY09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBBRURlc2NfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChBRURlc2NPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQUVEZXNjX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEFFRGVzY19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9BRS5BRURlc2MiLCAvKnRwX25hbWUqLwotCXNpemVvZihBRURlc2NPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBBRURlc2NfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQUVEZXNjX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBBRURlc2NfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEFFRGVzY19oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlBRURlc2NfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQUVEZXNjX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUFFRGVzY190cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQUVEZXNjX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUFFRGVzY190cF9uZXcsIC8qIHRwX25ldyAqLwotCUFFRGVzY190cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0FFLkFFRGVzYyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEFFRGVzY09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEFFRGVzY19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBBRURlc2NfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEFFRGVzY19yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQUVEZXNjX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEFFRGVzY19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBBRURlc2NfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQUVEZXNjX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBBRURlc2NfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQUVEZXNjX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQUVEZXNjX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQUVEZXNjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtOTMxLDQ1NSArOTMxLDQ1NSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFQ29lcmNlUHRyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JRGVzY1R5cGUgdG9UeXBlOwotCUFFRGVzYyByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBEZXNjVHlwZSB0b1R5cGU7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVDb2VyY2VQdHIKLQlQeU1hY19QUkVDSEVDSyhBRUNvZXJjZVB0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDb2VyY2VQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzI08mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRvVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFQ29lcmNlUHRyKHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgdG9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzI08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRvVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFQ29lcmNlUHRyKHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgdG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVDcmVhdGVEZXNjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIEFFRGVzYyByZXN1bHQ7CiAjaWZuZGVmIEFFQ3JlYXRlRGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFQ3JlYXRlRGVzYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVEZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFQ3JlYXRlRGVzYyh0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFQ3JlYXRlRGVzYyh0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFQ3JlYXRlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQljaGFyICpmYWN0b3JpbmdQdHJfX2luX187Ci0JbG9uZyBmYWN0b3JpbmdQdHJfX2xlbl9fOwotCWludCBmYWN0b3JpbmdQdHJfX2luX2xlbl9fOwotCUJvb2xlYW4gaXNSZWNvcmQ7Ci0JQUVEZXNjTGlzdCByZXN1bHRMaXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGNoYXIgKmZhY3RvcmluZ1B0cl9faW5fXzsKKyAgICBsb25nIGZhY3RvcmluZ1B0cl9fbGVuX187CisgICAgaW50IGZhY3RvcmluZ1B0cl9faW5fbGVuX187CisgICAgQm9vbGVhbiBpc1JlY29yZDsKKyAgICBBRURlc2NMaXN0IHJlc3VsdExpc3Q7CiAjaWZuZGVmIEFFQ3JlYXRlTGlzdAotCVB5TWFjX1BSRUNIRUNLKEFFQ3JlYXRlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYWN0b3JpbmdQdHJfX2luX18sICZmYWN0b3JpbmdQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNSZWNvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlmYWN0b3JpbmdQdHJfX2xlbl9fID0gZmFjdG9yaW5nUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVDcmVhdGVMaXN0KGZhY3RvcmluZ1B0cl9faW5fXywgZmFjdG9yaW5nUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgIGlzUmVjb3JkLAotCSAgICAgICAgICAgICAgICAgICAgJnJlc3VsdExpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0TGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY3RvcmluZ1B0cl9faW5fXywgJmZhY3RvcmluZ1B0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1JlY29yZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZhY3RvcmluZ1B0cl9fbGVuX18gPSBmYWN0b3JpbmdQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRUNyZWF0ZUxpc3QoZmFjdG9yaW5nUHRyX19pbl9fLCBmYWN0b3JpbmdQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0TGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRMaXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUNyZWF0ZUFwcGxlRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKLQlBRUV2ZW50SUQgdGhlQUVFdmVudElEOwotCUFFQWRkcmVzc0Rlc2MgdGFyZ2V0OwotCUFFUmV0dXJuSUQgcmV0dXJuSUQ7Ci0JQUVUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uSUQ7Ci0JQXBwbGVFdmVudCByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKKyAgICBBRUV2ZW50SUQgdGhlQUVFdmVudElEOworICAgIEFFQWRkcmVzc0Rlc2MgdGFyZ2V0OworICAgIEFFUmV0dXJuSUQgcmV0dXJuSUQ7CisgICAgQUVUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uSUQ7CisgICAgQXBwbGVFdmVudCByZXN1bHQ7CiAjaWZuZGVmIEFFQ3JlYXRlQXBwbGVFdmVudAotCVB5TWFjX1BSRUNIRUNLKEFFQ3JlYXRlQXBwbGVFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVBcHBsZUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmV0dXJuSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2FjdGlvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFQ3JlYXRlQXBwbGVFdmVudCh0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dXJuSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2FjdGlvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFQ3JlYXRlQXBwbGVFdmVudCh0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFUmVwbGFjZURlc2NEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JQUVEZXNjIHRoZUFFRGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIEFFRGVzYyB0aGVBRURlc2M7CiAjaWZuZGVmIEFFUmVwbGFjZURlc2NEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soQUVSZXBsYWNlRGVzY0RhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUmVwbGFjZURlc2NEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFUmVwbGFjZURlc2NEYXRhKHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFFRGVzYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVBRURlc2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFUmVwbGFjZURlc2NEYXRhKHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFFRGVzYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVBRURlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFUHJvY2Vzc0FwcGxlRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnRSZWNvcmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnRSZWNvcmQ7CiAjaWZuZGVmIEFFUHJvY2Vzc0FwcGxlRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhBRVByb2Nlc3NBcHBsZUV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVByb2Nlc3NBcHBsZUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZ0aGVFdmVudFJlY29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVByb2Nlc3NBcHBsZUV2ZW50KCZ0aGVFdmVudFJlY29yZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50UmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFUHJvY2Vzc0FwcGxlRXZlbnQoJnRoZUV2ZW50UmVjb3JkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUdldEludGVyYWN0aW9uQWxsb3dlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUludGVyYWN0QWxsb3dlZCBsZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUludGVyYWN0QWxsb3dlZCBsZXZlbDsKICNpZm5kZWYgQUVHZXRJbnRlcmFjdGlvbkFsbG93ZWQKLQlQeU1hY19QUkVDSEVDSyhBRUdldEludGVyYWN0aW9uQWxsb3dlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXRJbnRlcmFjdGlvbkFsbG93ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldEludGVyYWN0aW9uQWxsb3dlZCgmbGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFR2V0SW50ZXJhY3Rpb25BbGxvd2VkKCZsZXZlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFSW50ZXJhY3RBbGxvd2VkIGxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFSW50ZXJhY3RBbGxvd2VkIGxldmVsOwogI2lmbmRlZiBBRVNldEludGVyYWN0aW9uQWxsb3dlZAotCVB5TWFjX1BSRUNIRUNLKEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVNldEludGVyYWN0aW9uQWxsb3dlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKGxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKGxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUludGVyYWN0V2l0aFVzZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyB0aW1lT3V0SW5UaWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIHRpbWVPdXRJblRpY2tzOwogI2lmbmRlZiBBRUludGVyYWN0V2l0aFVzZXIKLQlQeU1hY19QUkVDSEVDSyhBRUludGVyYWN0V2l0aFVzZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFSW50ZXJhY3RXaXRoVXNlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWVPdXRJblRpY2tzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFSW50ZXJhY3RXaXRoVXNlcih0aW1lT3V0SW5UaWNrcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIChOTVJlY1B0cikwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0FFSWRsZVByb2MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZU91dEluVGlja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVJbnRlcmFjdFdpdGhVc2VyKHRpbWVPdXRJblRpY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5NUmVjUHRyKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBfQUVJZGxlUHJvYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVJbnN0YWxsRXZlbnRIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3M7Ci0JQUVFdmVudElEIHRoZUFFRXZlbnRJRDsKLQlBRUV2ZW50SGFuZGxlclVQUCBoYW5kbGVyX19wcm9jX18gPSB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlcjsKLQlQeU9iamVjdCAqaGFuZGxlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOworICAgIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7CisgICAgQUVFdmVudEhhbmRsZXJVUFAgaGFuZGxlcl9fcHJvY19fID0gdXBwX0dlbmVyaWNFdmVudEhhbmRsZXI7CisgICAgUHlPYmplY3QgKmhhbmRsZXI7CiAjaWZuZGVmIEFFSW5zdGFsbEV2ZW50SGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFSW5zdGFsbEV2ZW50SGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVJbnN0YWxsRXZlbnRIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFSW5zdGFsbEV2ZW50SGFuZGxlcih0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyX19wcm9jX18sIChTUmVmQ29uKWhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYoaGFuZGxlcik7IC8qIFhYWCBsZWFrLCBidXQgbmVlZGVkICovCi0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKHRoZUFFRXZlbnRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFRXZlbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfX3Byb2NfXywgKFNSZWZDb24paGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihoYW5kbGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRVJlbW92ZUV2ZW50SGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOwotCUFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKKyAgICBBRUV2ZW50SUQgdGhlQUVFdmVudElEOwogI2lmbmRlZiBBRVJlbW92ZUV2ZW50SGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFUmVtb3ZlRXZlbnRIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVJlbW92ZUV2ZW50SGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVSZW1vdmVFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVSZW1vdmVFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUdldEV2ZW50SGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOwotCUFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7Ci0JQUVFdmVudEhhbmRsZXJVUFAgaGFuZGxlcl9fcHJvY19fID0gdXBwX0dlbmVyaWNFdmVudEhhbmRsZXI7Ci0JUHlPYmplY3QgKmhhbmRsZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKKyAgICBBRUV2ZW50SUQgdGhlQUVFdmVudElEOworICAgIEFFRXZlbnRIYW5kbGVyVVBQIGhhbmRsZXJfX3Byb2NfXyA9IHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyOworICAgIFB5T2JqZWN0ICpoYW5kbGVyOwogI2lmbmRlZiBBRUdldEV2ZW50SGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFR2V0RXZlbnRIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldEV2ZW50SGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVHZXRFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVyX19wcm9jX18sIChTUmVmQ29uICopJmhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLAotCSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIpOwotCVB5X0lOQ1JFRihoYW5kbGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVHZXRFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUV2ZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVyX19wcm9jX18sIChTUmVmQ29uICopJmhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIpOworICAgIFB5X0lOQ1JFRihoYW5kbGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUluc3RhbGxTcGVjaWFsSGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgZnVuY3Rpb25DbGFzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgZnVuY3Rpb25DbGFzczsKICNpZm5kZWYgQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhBRUluc3RhbGxTcGVjaWFsSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmdW5jdGlvbkNsYXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFSW5zdGFsbFNwZWNpYWxIYW5kbGVyKGZ1bmN0aW9uQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZ1bmN0aW9uQ2xhc3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIoZnVuY3Rpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFUmVtb3ZlU3BlY2lhbEhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIGZ1bmN0aW9uQ2xhc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIGZ1bmN0aW9uQ2xhc3M7CiAjaWZuZGVmIEFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhBRVJlbW92ZVNwZWNpYWxIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVJlbW92ZVNwZWNpYWxIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZnVuY3Rpb25DbGFzcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVJlbW92ZVNwZWNpYWxIYW5kbGVyKGZ1bmN0aW9uQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmdW5jdGlvbkNsYXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIoZnVuY3Rpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRU1hbmFnZXJJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCBrZXlXb3JkOwotCWxvbmcgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCBrZXlXb3JkOworICAgIGxvbmcgcmVzdWx0OwogI2lmbmRlZiBBRU1hbmFnZXJJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soQUVNYW5hZ2VySW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVNYW5hZ2VySW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmtleVdvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVNYW5hZ2VySW5mbyhrZXlXb3JkLAotCSAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZrZXlXb3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFTWFuYWdlckluZm8oa2V5V29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFT2JqZWN0SW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQUVPYmplY3RJbml0Ci0JUHlNYWNfUFJFQ0hFQ0soQUVPYmplY3RJbml0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRU9iamVjdEluaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRU9iamVjdEluaXQoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFT2JqZWN0SW5pdCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFRGlzcG9zZVRva2VuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRGVzYyB0aGVUb2tlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRURlc2MgdGhlVG9rZW47CiAjaWZuZGVmIEFFRGlzcG9zZVRva2VuCi0JUHlNYWNfUFJFQ0hFQ0soQUVEaXNwb3NlVG9rZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEFFRGlzcG9zZVRva2VuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVEaXNwb3NlVG9rZW4oJnRoZVRva2VuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRoZVRva2VuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFRGlzcG9zZVRva2VuKCZ0aGVUb2tlbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0aGVUb2tlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVDYWxsT2JqZWN0QWNjZXNzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGVzY1R5cGUgZGVzaXJlZENsYXNzOwotCUFFRGVzYyBjb250YWluZXJUb2tlbjsKLQlEZXNjVHlwZSBjb250YWluZXJDbGFzczsKLQlEZXNjVHlwZSBrZXlGb3JtOwotCUFFRGVzYyBrZXlEYXRhOwotCUFFRGVzYyB0b2tlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSBkZXNpcmVkQ2xhc3M7CisgICAgQUVEZXNjIGNvbnRhaW5lclRva2VuOworICAgIERlc2NUeXBlIGNvbnRhaW5lckNsYXNzOworICAgIERlc2NUeXBlIGtleUZvcm07CisgICAgQUVEZXNjIGtleURhdGE7CisgICAgQUVEZXNjIHRva2VuOwogI2lmbmRlZiBBRUNhbGxPYmplY3RBY2Nlc3NvcgotCVB5TWFjX1BSRUNIRUNLKEFFQ2FsbE9iamVjdEFjY2Vzc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNhbGxPYmplY3RBY2Nlc3Nvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJmNvbnRhaW5lclRva2VuLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb250YWluZXJDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2V5Rm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZrZXlEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFQ2FsbE9iamVjdEFjY2Vzc29yKGRlc2lyZWRDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lclRva2VuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Rm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleURhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b2tlbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0b2tlbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZjb250YWluZXJUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29udGFpbmVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmtleUZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAma2V5RGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUNhbGxPYmplY3RBY2Nlc3NvcihkZXNpcmVkQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXJUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9rZW4pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmdG9rZW4pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQUVfbWV0aG9kc1tdID0gewotCXsiQUVDb2VyY2VQdHIiLCAoUHlDRnVuY3Rpb24pQUVfQUVDb2VyY2VQdHIsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0ciwgRGVzY1R5cGUgdG9UeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCi0JeyJBRUNyZWF0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVfQUVDcmVhdGVEZXNjLCAxLAotCSBQeURvY19TVFIoIihEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKLQl7IkFFQ3JlYXRlTGlzdCIsIChQeUNGdW5jdGlvbilBRV9BRUNyZWF0ZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBmYWN0b3JpbmdQdHIsIEJvb2xlYW4gaXNSZWNvcmQpIC0+IChBRURlc2NMaXN0IHJlc3VsdExpc3QpIil9LAotCXsiQUVDcmVhdGVBcHBsZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ3JlYXRlQXBwbGVFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCwgQUVBZGRyZXNzRGVzYyB0YXJnZXQsIEFFUmV0dXJuSUQgcmV0dXJuSUQsIEFFVHJhbnNhY3Rpb25JRCB0cmFuc2FjdGlvbklEKSAtPiAoQXBwbGVFdmVudCByZXN1bHQpIil9LAotCXsiQUVSZXBsYWNlRGVzY0RhdGEiLCAoUHlDRnVuY3Rpb24pQUVfQUVSZXBsYWNlRGVzY0RhdGEsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gKEFFRGVzYyB0aGVBRURlc2MpIil9LAotCXsiQUVQcm9jZXNzQXBwbGVFdmVudCIsIChQeUNGdW5jdGlvbilBRV9BRVByb2Nlc3NBcHBsZUV2ZW50LCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCB0aGVFdmVudFJlY29yZCkgLT4gTm9uZSIpfSwKLQl7IkFFR2V0SW50ZXJhY3Rpb25BbGxvd2VkIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFR2V0SW50ZXJhY3Rpb25BbGxvd2VkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBRUludGVyYWN0QWxsb3dlZCBsZXZlbCkiKX0sCi0JeyJBRVNldEludGVyYWN0aW9uQWxsb3dlZCIsIChQeUNGdW5jdGlvbilBRV9BRVNldEludGVyYWN0aW9uQWxsb3dlZCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVJbnRlcmFjdEFsbG93ZWQgbGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJBRUludGVyYWN0V2l0aFVzZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVJbnRlcmFjdFdpdGhVc2VyLCAxLAotCSBQeURvY19TVFIoIihsb25nIHRpbWVPdXRJblRpY2tzKSAtPiBOb25lIil9LAotCXsiQUVJbnN0YWxsRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFSW5zdGFsbEV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCwgRXZlbnRIYW5kbGVyIGhhbmRsZXIpIC0+IE5vbmUiKX0sCi0JeyJBRVJlbW92ZUV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRVJlbW92ZUV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCkgLT4gTm9uZSIpfSwKLQl7IkFFR2V0RXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFR2V0RXZlbnRIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzLCBBRUV2ZW50SUQgdGhlQUVFdmVudElEKSAtPiAoRXZlbnRIYW5kbGVyIGhhbmRsZXIpIil9LAotCXsiQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCBmdW5jdGlvbkNsYXNzKSAtPiBOb25lIil9LAotCXsiQUVSZW1vdmVTcGVjaWFsSGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRVJlbW92ZVNwZWNpYWxIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgZnVuY3Rpb25DbGFzcykgLT4gTm9uZSIpfSwKLQl7IkFFTWFuYWdlckluZm8iLCAoUHlDRnVuY3Rpb24pQUVfQUVNYW5hZ2VySW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIGtleVdvcmQpIC0+IChsb25nIHJlc3VsdCkiKX0sCi0JeyJBRU9iamVjdEluaXQiLCAoUHlDRnVuY3Rpb24pQUVfQUVPYmplY3RJbml0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBRURpc3Bvc2VUb2tlbiIsIChQeUNGdW5jdGlvbilBRV9BRURpc3Bvc2VUb2tlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHRoZVRva2VuKSIpfSwKLQl7IkFFQ2FsbE9iamVjdEFjY2Vzc29yIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ2FsbE9iamVjdEFjY2Vzc29yLCAxLAotCSBQeURvY19TVFIoIihEZXNjVHlwZSBkZXNpcmVkQ2xhc3MsIEFFRGVzYyBjb250YWluZXJUb2tlbiwgRGVzY1R5cGUgY29udGFpbmVyQ2xhc3MsIERlc2NUeXBlIGtleUZvcm0sIEFFRGVzYyBrZXlEYXRhKSAtPiAoQUVEZXNjIHRva2VuKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkFFQ29lcmNlUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ29lcmNlUHRyLCAxLAorICAgICBQeURvY19TVFIoIihEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIsIERlc2NUeXBlIHRvVHlwZSkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAorICAgIHsiQUVDcmVhdGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ3JlYXRlRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRUNyZWF0ZUxpc3QiLCAoUHlDRnVuY3Rpb24pQUVfQUVDcmVhdGVMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgZmFjdG9yaW5nUHRyLCBCb29sZWFuIGlzUmVjb3JkKSAtPiAoQUVEZXNjTGlzdCByZXN1bHRMaXN0KSIpfSwKKyAgICB7IkFFQ3JlYXRlQXBwbGVFdmVudCIsIChQeUNGdW5jdGlvbilBRV9BRUNyZWF0ZUFwcGxlRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3MsIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQsIEFFQWRkcmVzc0Rlc2MgdGFyZ2V0LCBBRVJldHVybklEIHJldHVybklELCBBRVRyYW5zYWN0aW9uSUQgdHJhbnNhY3Rpb25JRCkgLT4gKEFwcGxlRXZlbnQgcmVzdWx0KSIpfSwKKyAgICB7IkFFUmVwbGFjZURlc2NEYXRhIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFUmVwbGFjZURlc2NEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRURlc2MgdGhlQUVEZXNjKSIpfSwKKyAgICB7IkFFUHJvY2Vzc0FwcGxlRXZlbnQiLCAoUHlDRnVuY3Rpb24pQUVfQUVQcm9jZXNzQXBwbGVFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnRSZWNvcmQpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldEludGVyYWN0aW9uQWxsb3dlZCIsIChQeUNGdW5jdGlvbilBRV9BRUdldEludGVyYWN0aW9uQWxsb3dlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVJbnRlcmFjdEFsbG93ZWQgbGV2ZWwpIil9LAorICAgIHsiQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQiLCAoUHlDRnVuY3Rpb24pQUVfQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFSW50ZXJhY3RBbGxvd2VkIGxldmVsKSAtPiBOb25lIil9LAorICAgIHsiQUVJbnRlcmFjdFdpdGhVc2VyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFSW50ZXJhY3RXaXRoVXNlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyB0aW1lT3V0SW5UaWNrcykgLT4gTm9uZSIpfSwKKyAgICB7IkFFSW5zdGFsbEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRUluc3RhbGxFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3MsIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQsIEV2ZW50SGFuZGxlciBoYW5kbGVyKSAtPiBOb25lIil9LAorICAgIHsiQUVSZW1vdmVFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVSZW1vdmVFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3MsIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRUdldEV2ZW50SGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCkgLT4gKEV2ZW50SGFuZGxlciBoYW5kbGVyKSIpfSwKKyAgICB7IkFFSW5zdGFsbFNwZWNpYWxIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFSW5zdGFsbFNwZWNpYWxIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgZnVuY3Rpb25DbGFzcykgLT4gTm9uZSIpfSwKKyAgICB7IkFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVSZW1vdmVTcGVjaWFsSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIGZ1bmN0aW9uQ2xhc3MpIC0+IE5vbmUiKX0sCisgICAgeyJBRU1hbmFnZXJJbmZvIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFTWFuYWdlckluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCBrZXlXb3JkKSAtPiAobG9uZyByZXN1bHQpIil9LAorICAgIHsiQUVPYmplY3RJbml0IiwgKFB5Q0Z1bmN0aW9uKUFFX0FFT2JqZWN0SW5pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVEaXNwb3NlVG9rZW4iLCAoUHlDRnVuY3Rpb24pQUVfQUVEaXNwb3NlVG9rZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyB0aGVUb2tlbikiKX0sCisgICAgeyJBRUNhbGxPYmplY3RBY2Nlc3NvciIsIChQeUNGdW5jdGlvbilBRV9BRUNhbGxPYmplY3RBY2Nlc3NvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGVzY1R5cGUgZGVzaXJlZENsYXNzLCBBRURlc2MgY29udGFpbmVyVG9rZW4sIERlc2NUeXBlIGNvbnRhaW5lckNsYXNzLCBEZXNjVHlwZSBrZXlGb3JtLCBBRURlc2Mga2V5RGF0YSkgLT4gKEFFRGVzYyB0b2tlbikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTEzODcsNzIgKzEzODcsNzIgQEAKIHN0YXRpYyBwYXNjYWwgT1NFcnIKIEdlbmVyaWNFdmVudEhhbmRsZXIoY29uc3QgQXBwbGVFdmVudCAqcmVxdWVzdCwgQXBwbGVFdmVudCAqcmVwbHksIHJlZmNvbnR5cGUgcmVmY29uKQogewotICAgICAgICBQeU9iamVjdCAqaGFuZGxlciA9IChQeU9iamVjdCAqKXJlZmNvbjsKLSAgICAgICAgQUVEZXNjT2JqZWN0ICpyZXF1ZXN0T2JqZWN0LCAqcmVwbHlPYmplY3Q7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwotICAgICAgICBpZiAoKHJlcXVlc3RPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldygoQXBwbGVFdmVudCAqKXJlcXVlc3QpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgocmVwbHlPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldyhyZXBseSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVxdWVzdE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoYXJncyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgcmVxdWVzdE9iamVjdCwgcmVwbHlPYmplY3QpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcXVlc3RPYmplY3QpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXBseU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGhhbmRsZXIsIGFyZ3MpOwotICAgICAgICByZXF1ZXN0T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7Ci0gICAgICAgIHJlcXVlc3RPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKLSAgICAgICAgcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kZXNjcmlwdG9yVHlwZSA9ICdudWxsJzsKLSAgICAgICAgcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIEFFIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiIpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gbm9FcnI7CisgICAgUHlPYmplY3QgKmhhbmRsZXIgPSAoUHlPYmplY3QgKilyZWZjb247CisgICAgQUVEZXNjT2JqZWN0ICpyZXF1ZXN0T2JqZWN0LCAqcmVwbHlPYmplY3Q7CisgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgaWYgKChyZXF1ZXN0T2JqZWN0ID0gKEFFRGVzY09iamVjdCAqKUFFRGVzY19OZXcoKEFwcGxlRXZlbnQgKilyZXF1ZXN0KSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgocmVwbHlPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldyhyZXBseSkpID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcXVlc3RPYmplY3QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoYXJncyA9IFB5X0J1aWxkVmFsdWUoIk9PIiwgcmVxdWVzdE9iamVjdCwgcmVwbHlPYmplY3QpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXF1ZXN0T2JqZWN0KTsKKyAgICAgICAgUHlfREVDUkVGKHJlcGx5T2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChoYW5kbGVyLCBhcmdzKTsKKyAgICByZXF1ZXN0T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7CisgICAgcmVxdWVzdE9iamVjdC0+b2JfaXRzZWxmLmRhdGFIYW5kbGUgPSBOVUxMOworICAgIHJlcGx5T2JqZWN0LT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUgPSAnbnVsbCc7CisgICAgcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gQUUgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIG5vRXJyOwogfQogCiBQeU9iamVjdCAqQUVEZXNjX05ld0JvcnJvd2VkKEFFRGVzYyAqaXRzZWxmKQogewotICAgICAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKml0OwogCi0gICAgICAgIGl0ID0gQUVEZXNjX05ldyhpdHNlbGYpOwotICAgICAgICBpZiAoaXQpCi0gICAgICAgICAgICAgICAgKChBRURlc2NPYmplY3QgKilpdCktPm9iX293bmVkID0gMDsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gQUVEZXNjX05ldyhpdHNlbGYpOworICAgIGlmIChpdCkKKyAgICAgICAgKChBRURlc2NPYmplY3QgKilpdCktPm9iX293bmVkID0gMDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIAogCiB2b2lkIGluaXRfQUUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAotICAgICAgICB1cHBfQUVJZGxlUHJvYyA9IE5ld0FFSWRsZVVQUChBRUlkbGVQcm9jKTsKLSAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIgPSBOZXdBRUV2ZW50SGFuZGxlclVQUChHZW5lcmljRXZlbnRIYW5kbGVyKTsKLSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXcpOwotICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhBRURlc2MgKiwgQUVEZXNjX05ld0JvcnJvd2VkKTsKLSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEFFRGVzYywgQUVEZXNjX0NvbnZlcnQpOworICAgIHVwcF9BRUlkbGVQcm9jID0gTmV3QUVJZGxlVVBQKEFFSWRsZVByb2MpOworICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyID0gTmV3QUVFdmVudEhhbmRsZXJVUFAoR2VuZXJpY0V2ZW50SGFuZGxlcik7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEFFRGVzYyAqLCBBRURlc2NfTmV3Qm9ycm93ZWQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChBRURlc2MsIEFFRGVzY19Db252ZXJ0KTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQUUiLCBBRV9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlBRV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEFFX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQUVfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlBRURlc2NfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkFFRGVzY19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkFFRGVzY19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFFRGVzYyIsIChQeU9iamVjdCAqKSZBRURlc2NfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZBRURlc2NfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBRURlc2NUeXBlIiwgKFB5T2JqZWN0ICopJkFFRGVzY19UeXBlKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0FFIiwgQUVfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQUVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChBRV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEFFX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgQUVEZXNjX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZBRURlc2NfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZBRURlc2NfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBRURlc2MiLCAoUHlPYmplY3QgKikmQUVEZXNjX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQUVEZXNjX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQUVEZXNjVHlwZSIsIChQeU9iamVjdCAqKSZBRURlc2NfVHlwZSk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQUUgPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYWgvX0FIbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9haC9fQUhtb2R1bGUuYwppbmRleCAxNjBhODQ1Li43M2FiNDM3IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9haC9fQUhtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9haC9fQUhtb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDEwMyArMjIsMTAzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQWhfQUhTZWFyY2goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgYm9va25hbWU7Ci0JQ0ZTdHJpbmdSZWYgcXVlcnk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnF1ZXJ5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFIU2VhcmNoKGJvb2tuYW1lLAotCSAgICAgICAgICAgICAgICBxdWVyeSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgYm9va25hbWU7CisgICAgQ0ZTdHJpbmdSZWYgcXVlcnk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnF1ZXJ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFIU2VhcmNoKGJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICBxdWVyeSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWhfQUhHb3RvTWFpblRPQyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlBSFRPQ1R5cGUgdG9jdHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvY3R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUhHb3RvTWFpblRPQyh0b2N0eXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBBSFRPQ1R5cGUgdG9jdHlwZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvY3R5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUhHb3RvTWFpblRPQyh0b2N0eXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSEdvdG9QYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGJvb2tuYW1lOwotCUNGU3RyaW5nUmVmIHBhdGg7Ci0JQ0ZTdHJpbmdSZWYgYW5jaG9yOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhbmNob3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUhHb3RvUGFnZShib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICBwYXRoLAotCSAgICAgICAgICAgICAgICAgIGFuY2hvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgYm9va25hbWU7CisgICAgQ0ZTdHJpbmdSZWYgcGF0aDsKKyAgICBDRlN0cmluZ1JlZiBhbmNob3I7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFuY2hvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBSEdvdG9QYWdlKGJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSExvb2t1cEFuY2hvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBib29rbmFtZTsKLQlDRlN0cmluZ1JlZiBhbmNob3I7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFuY2hvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBSExvb2t1cEFuY2hvcihib29rbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBib29rbmFtZTsKKyAgICBDRlN0cmluZ1JlZiBhbmNob3I7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZib29rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFuY2hvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBSExvb2t1cEFuY2hvcihib29rbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSFJlZ2lzdGVySGVscEJvb2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNSZWYgYXBwQnVuZGxlUmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZhcHBCdW5kbGVSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUhSZWdpc3RlckhlbHBCb29rKCZhcHBCdW5kbGVSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGFwcEJ1bmRsZVJlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmYXBwQnVuZGxlUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFIUmVnaXN0ZXJIZWxwQm9vaygmYXBwQnVuZGxlUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEFoX21ldGhvZHNbXSA9IHsKLQl7IkFIU2VhcmNoIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIU2VhcmNoLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgcXVlcnkpIC0+IE5vbmUiKX0sCi0JeyJBSEdvdG9NYWluVE9DIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIR290b01haW5UT0MsIDEsCi0JIFB5RG9jX1NUUigiKEFIVE9DVHlwZSB0b2N0eXBlKSAtPiBOb25lIil9LAotCXsiQUhHb3RvUGFnZSIsIChQeUNGdW5jdGlvbilBaF9BSEdvdG9QYWdlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgcGF0aCwgQ0ZTdHJpbmdSZWYgYW5jaG9yKSAtPiBOb25lIil9LAotCXsiQUhMb29rdXBBbmNob3IiLCAoUHlDRnVuY3Rpb24pQWhfQUhMb29rdXBBbmNob3IsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGJvb2tuYW1lLCBDRlN0cmluZ1JlZiBhbmNob3IpIC0+IE5vbmUiKX0sCi0JeyJBSFJlZ2lzdGVySGVscEJvb2siLCAoUHlDRnVuY3Rpb24pQWhfQUhSZWdpc3RlckhlbHBCb29rLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBhcHBCdW5kbGVSZWYpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJBSFNlYXJjaCIsIChQeUNGdW5jdGlvbilBaF9BSFNlYXJjaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYm9va25hbWUsIENGU3RyaW5nUmVmIHF1ZXJ5KSAtPiBOb25lIil9LAorICAgIHsiQUhHb3RvTWFpblRPQyIsIChQeUNGdW5jdGlvbilBaF9BSEdvdG9NYWluVE9DLCAxLAorICAgICBQeURvY19TVFIoIihBSFRPQ1R5cGUgdG9jdHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkFIR290b1BhZ2UiLCAoUHlDRnVuY3Rpb24pQWhfQUhHb3RvUGFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYm9va25hbWUsIENGU3RyaW5nUmVmIHBhdGgsIENGU3RyaW5nUmVmIGFuY2hvcikgLT4gTm9uZSIpfSwKKyAgICB7IkFITG9va3VwQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKUFoX0FITG9va3VwQW5jaG9yLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgYW5jaG9yKSAtPiBOb25lIil9LAorICAgIHsiQUhSZWdpc3RlckhlbHBCb29rIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIUmVnaXN0ZXJIZWxwQm9vaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgYXBwQnVuZGxlUmVmKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xMjYsMTggKzEyNiwxOCBAQAogCiB2b2lkIGluaXRfQUgodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQUgiLCBBaF9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlBaF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEFoX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQWhfRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0FIIiwgQWhfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQWhfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChBaF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEFoX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQUggPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYXBwL19BcHBtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2FwcC9fQXBwbW9kdWxlLmMKaW5kZXggNTJkMTdmNS4uYzc5MTgwNyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYXBwL19BcHBtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9hcHAvX0FwcG1vZHVsZS5jCkBAIC00LDE2ICs0LDE2IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKICNpZm5kZWYgX19MUDY0X18KLQkvKiBDYXJib24gR1VJIHN0dWZmLCBub3QgYXZhaWxhYmxlIGluIDY0LWJpdCBtb2RlICovCisgICAgLyogQ2FyYm9uIEdVSSBzdHVmZiwgbm90IGF2YWlsYWJsZSBpbiA2NC1iaXQgbW9kZSAqLwogCiAKICNpbmNsdWRlICJweW1hY3Rvb2xib3guaCIKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDcgKzIyLDcgQEAKIAogc3RhdGljIGludCBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRoZW1lQnV0dG9uRHJhd0luZm8gKnBfaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihpSEgpIiwgJnBfaXRzZWxmLT5zdGF0ZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5hZG9ybm1lbnQpOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGlISCkiLCAmcF9pdHNlbGYtPnN0YXRlLCAmcF9pdHNlbGYtPnZhbHVlLCAmcF9pdHNlbGYtPmFkb3JubWVudCk7CiB9CiAKIApAQCAtMzUsNzUgKzM1LDc1IEBACiAjZGVmaW5lIFRoZW1lRHJhd2luZ1N0YXRlT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVRoZW1lRHJhd2luZ1N0YXRlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgVGhlbWVEcmF3aW5nU3RhdGUgb2JfaXRzZWxmOwogfSBUaGVtZURyYXdpbmdTdGF0ZU9iamVjdDsKIAogUHlPYmplY3QgKlRoZW1lRHJhd2luZ1N0YXRlT2JqX05ldyhUaGVtZURyYXdpbmdTdGF0ZSBpdHNlbGYpCiB7Ci0JVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0LCAmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCwgJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IFRoZW1lRHJhd2luZ1N0YXRlT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRoZW1lRHJhd2luZ1N0YXRlICpwX2l0c2VsZikKIHsKLQlpZiAoIVRoZW1lRHJhd2luZ1N0YXRlT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRoZW1lRHJhd2luZ1N0YXRlIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIVRoZW1lRHJhd2luZ1N0YXRlT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRoZW1lRHJhd2luZ1N0YXRlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgVGhlbWVEcmF3aW5nU3RhdGVPYmpfZGVhbGxvYyhUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGhlbWVEcmF3aW5nU3RhdGVPYmpfU2V0VGhlbWVEcmF3aW5nU3RhdGUoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9ydjsKLQlCb29sZWFuIGluRGlzcG9zZU5vdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX3J2OworICAgIEJvb2xlYW4gaW5EaXNwb3NlTm93OwogI2lmbmRlZiBTZXRUaGVtZURyYXdpbmdTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFNldFRoZW1lRHJhd2luZ1N0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZURyYXdpbmdTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGlzcG9zZU5vdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNldFRoZW1lRHJhd2luZ1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EaXNwb3NlTm93KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGlzcG9zZU5vdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNldFRoZW1lRHJhd2luZ1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EaXNwb3NlTm93KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaGVtZURyYXdpbmdTdGF0ZU9ial9EaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX3J2OwogI2lmbmRlZiBEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUaGVtZURyYXdpbmdTdGF0ZU9ial9tZXRob2RzW10gPSB7Ci0JeyJTZXRUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilUaGVtZURyYXdpbmdTdGF0ZU9ial9TZXRUaGVtZURyYXdpbmdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbkRpc3Bvc2VOb3cpIC0+IChPU1N0YXR1cyBfcnYpIil9LAotCXsiRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKVRoZW1lRHJhd2luZ1N0YXRlT2JqX0Rpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoT1NTdGF0dXMgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlNldFRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKVRoZW1lRHJhd2luZ1N0YXRlT2JqX1NldFRoZW1lRHJhd2luZ1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluRGlzcG9zZU5vdykgLT4gKE9TU3RhdHVzIF9ydikiKX0sCisgICAgeyJEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUiLCAoUHlDRnVuY3Rpb24pVGhlbWVEcmF3aW5nU3RhdGVPYmpfRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChPU1N0YXR1cyBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBUaGVtZURyYXdpbmdTdGF0ZU9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTEyMCw2MSArMTIwLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVRoZW1lRHJhd2luZ1N0YXRlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVGhlbWVEcmF3aW5nU3RhdGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVGhlbWVEcmF3aW5nU3RhdGVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUaGVtZURyYXdpbmdTdGF0ZU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFRoZW1lRHJhd2luZ1N0YXRlX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0FwcC5UaGVtZURyYXdpbmdTdGF0ZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgVGhlbWVEcmF3aW5nU3RhdGVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgVGhlbWVEcmF3aW5nU3RhdGVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBUaGVtZURyYXdpbmdTdGF0ZU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0FwcC5UaGVtZURyYXdpbmdTdGF0ZSIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVGhlbWVEcmF3aW5nU3RhdGVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVGhlbWVEcmF3aW5nU3RhdGVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUaGVtZURyYXdpbmdTdGF0ZU9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRoZW1lRHJhd2luZ1N0YXRlIC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE4MiwxNjIyICsxODIsMTYyMiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9SZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudAotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50Ci0JUHlNYWNfUFJFQ0hFQ0soVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lUGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lQnJ1c2ggaW5CcnVzaDsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluSXNDb2xvckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUJydXNoIGluQnJ1c2g7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CiAjaWZuZGVmIFNldFRoZW1lUGVuCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVQZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRoZW1lUGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUaGVtZVBlbihpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUaGVtZVBlbihpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9TZXRUaGVtZUJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVCcnVzaCBpbkJydXNoOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lQnJ1c2ggaW5CcnVzaDsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluSXNDb2xvckRldmljZTsKICNpZm5kZWYgU2V0VGhlbWVCYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVCYWNrZ3JvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZUJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRoZW1lQmFja2dyb3VuZChpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lQmFja2dyb3VuZChpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lVGV4dENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lVGV4dENvbG9yIGluQ29sb3I7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVUZXh0Q29sb3IgaW5Db2xvcjsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluSXNDb2xvckRldmljZTsKICNpZm5kZWYgU2V0VGhlbWVUZXh0Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVRleHRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVUZXh0Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRoZW1lVGV4dENvbG9yKGluQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lVGV4dENvbG9yKGluQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lV2luZG93QmFja2dyb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JVGhlbWVCcnVzaCBpbkJydXNoOwotCUJvb2xlYW4gaW5VcGRhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFRoZW1lQnJ1c2ggaW5CcnVzaDsKKyAgICBCb29sZWFuIGluVXBkYXRlOwogI2lmbmRlZiBTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQKLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRoZW1lV2luZG93QmFja2dyb3VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblVwZGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQoaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5VcGRhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CcnVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXBkYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lV2luZG93QmFja2dyb3VuZChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblVwZGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVdpbmRvd0hlYWRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVdpbmRvd0hlYWRlcgotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVdpbmRvd0hlYWRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lV2luZG93SGVhZGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVdpbmRvd0hlYWRlcigmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lV2luZG93SGVhZGVyKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lV2luZG93TGlzdFZpZXdIZWFkZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcgotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcigmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcigmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lUGxhY2FyZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVBsYWNhcmQKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVQbGFjYXJkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVQbGFjYXJkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVBsYWNhcmQoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVQbGFjYXJkKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZUVkaXRUZXh0RnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVFZGl0VGV4dEZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lRWRpdFRleHRGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lRWRpdFRleHRGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVFZGl0VGV4dEZyYW1lKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lRWRpdFRleHRGcmFtZSgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVMaXN0Qm94RnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVMaXN0Qm94RnJhbWUKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVMaXN0Qm94RnJhbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUxpc3RCb3hGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVMaXN0Qm94RnJhbWUoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZUxpc3RCb3hGcmFtZSgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZUZvY3VzUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlCb29sZWFuIGluSGFzRm9jdXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgQm9vbGVhbiBpbkhhc0ZvY3VzOwogI2lmbmRlZiBEcmF3VGhlbWVGb2N1c1JlY3QKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVGb2N1c1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUZvY3VzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IYXNGb2N1cykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVGb2N1c1JlY3QoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGFzRm9jdXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhhc0ZvY3VzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZUZvY3VzUmVjdCgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IYXNGb2N1cyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVByaW1hcnlHcm91cChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVByaW1hcnlHcm91cAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVByaW1hcnlHcm91cCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lUHJpbWFyeUdyb3VwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVByaW1hcnlHcm91cCgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lUHJpbWFyeUdyb3VwKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU2Vjb25kYXJ5R3JvdXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVTZWNvbmRhcnlHcm91cAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNlY29uZGFyeUdyb3VwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU2VwYXJhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lU2VwYXJhdG9yCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU2VwYXJhdG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTZXBhcmF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lU2VwYXJhdG9yKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVTZXBhcmF0b3IoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZQotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lR2VuZXJpY1dlbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKLQlCb29sZWFuIGluRmlsbENlbnRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIEJvb2xlYW4gaW5GaWxsQ2VudGVyOwogI2lmbmRlZiBEcmF3VGhlbWVHZW5lcmljV2VsbAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUdlbmVyaWNXZWxsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVHZW5lcmljV2VsbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZpbGxDZW50ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lR2VuZXJpY1dlbGwoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaWxsQ2VudGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZpbGxDZW50ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lR2VuZXJpY1dlbGwoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaWxsQ2VudGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lRm9jdXNSZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBpbkhhc0ZvY3VzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5IYXNGb2N1czsKICNpZm5kZWYgRHJhd1RoZW1lRm9jdXNSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVGb2N1c1JlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lRm9jdXNSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhhc0ZvY3VzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZUZvY3VzUmVnaW9uKChSZ25IYW5kbGUpMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IYXNGb2N1cyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhhc0ZvY3VzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZUZvY3VzUmVnaW9uKChSZ25IYW5kbGUpMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IYXNGb2N1cyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0lzVGhlbWVJbkNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluSXNDb2xvckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CiAjaWZuZGVmIElzVGhlbWVJbkNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soSXNUaGVtZUluQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKElzVGhlbWVJbkNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1RoZW1lSW5Db2xvcihpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVGhlbWVJbkNvbG9yKGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVBY2NlbnRDb2xvcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ1RhYkhhbmRsZSBvdXRDb2xvcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ1RhYkhhbmRsZSBvdXRDb2xvcnM7CiAjaWZuZGVmIEdldFRoZW1lQWNjZW50Q29sb3JzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVBY2NlbnRDb2xvcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQWNjZW50Q29sb3JzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVBY2NlbnRDb2xvcnMoJm91dENvbG9ycyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dENvbG9ycyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZUFjY2VudENvbG9ycygmb3V0Q29sb3JzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0Q29sb3JzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbkJvdW5kczsKLQlUaGVtZU1lbnVCYXJTdGF0ZSBpblN0YXRlOwotCVVJbnQzMiBpbkF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbkJvdW5kczsKKyAgICBUaGVtZU1lbnVCYXJTdGF0ZSBpblN0YXRlOworICAgIFVJbnQzMiBpbkF0dHJpYnV0ZXM7CiAjaWZuZGVmIERyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kKCZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVNZW51QmFyQmFja2dyb3VuZCgmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lTWVudUJhckhlaWdodChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0SGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBvdXRIZWlnaHQ7CiAjaWZuZGVmIEdldFRoZW1lTWVudUJhckhlaWdodAotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWVudUJhckhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51QmFySGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVNZW51QmFySGVpZ2h0KCZvdXRIZWlnaHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZU1lbnVCYXJIZWlnaHQoJm91dEhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lTWVudUJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbk1lbnVSZWN0OwotCVRoZW1lTWVudVR5cGUgaW5NZW51VHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluTWVudVJlY3Q7CisgICAgVGhlbWVNZW51VHlwZSBpbk1lbnVUeXBlOwogI2lmbmRlZiBEcmF3VGhlbWVNZW51QmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVNZW51QmFja2dyb3VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5NZW51UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWVudVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lTWVudUJhY2tncm91bmQoJmluTWVudVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVudVR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbk1lbnVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NZW51VHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVNZW51QmFja2dyb3VuZCgmaW5NZW51UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZW51VHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbk1lbnVSZWN0OwotCVRoZW1lTWVudVR5cGUgbWVudVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbk1lbnVSZWN0OworICAgIFRoZW1lTWVudVR5cGUgbWVudVR5cGU7CiAjaWZuZGVmIEdldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbk1lbnVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVNZW51QmFja2dyb3VuZFJlZ2lvbigmaW5NZW51UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbk1lbnVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVNZW51QmFja2dyb3VuZFJlZ2lvbigmaW5NZW51UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVNZW51U2VwYXJhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5JdGVtUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluSXRlbVJlY3Q7CiAjaWZuZGVmIERyYXdUaGVtZU1lbnVTZXBhcmF0b3IKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVNZW51U2VwYXJhdG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVNZW51U2VwYXJhdG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluSXRlbVJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lTWVudVNlcGFyYXRvcigmaW5JdGVtUmVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5JdGVtUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVNZW51U2VwYXJhdG9yKCZpbkl0ZW1SZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNJbnQxNiBvdXRIZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IG91dEhlaWdodDsKICNpZm5kZWYgR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQoJm91dEhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCgmb3V0SGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZU1lbnVJdGVtRXh0cmEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVNZW51SXRlbVR5cGUgaW5JdGVtVHlwZTsKLQlTSW50MTYgb3V0SGVpZ2h0OwotCVNJbnQxNiBvdXRXaWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZU1lbnVJdGVtVHlwZSBpbkl0ZW1UeXBlOworICAgIFNJbnQxNiBvdXRIZWlnaHQ7CisgICAgU0ludDE2IG91dFdpZHRoOwogI2lmbmRlZiBHZXRUaGVtZU1lbnVJdGVtRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVJdGVtRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWVudUl0ZW1FeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVNZW51SXRlbUV4dHJhKGluSXRlbVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpZHRoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVNZW51SXRlbUV4dHJhKGluSXRlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpZHRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVNZW51VGl0bGVFeHRyYShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0V2lkdGg7Ci0JQm9vbGVhbiBpbklzU3F1aXNoZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IG91dFdpZHRoOworICAgIEJvb2xlYW4gaW5Jc1NxdWlzaGVkOwogI2lmbmRlZiBHZXRUaGVtZU1lbnVUaXRsZUV4dHJhCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51VGl0bGVFeHRyYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51VGl0bGVFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXNTcXVpc2hlZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1lbnVUaXRsZUV4dHJhKCZvdXRXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzU3F1aXNoZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNTcXVpc2hlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZU1lbnVUaXRsZUV4dHJhKCZvdXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzU3F1aXNoZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lVGFiUGFuZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVRhYlBhbmUKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVUYWJQYW5lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVUYWJQYW5lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVRhYlBhbmUoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVUYWJQYW5lKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lVGFiUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lVGFiU3R5bGUgaW5TdHlsZTsKLQlUaGVtZVRhYkRpcmVjdGlvbiBpbkRpcmVjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZVRhYlN0eWxlIGluU3R5bGU7CisgICAgVGhlbWVUYWJEaXJlY3Rpb24gaW5EaXJlY3Rpb247CiAjaWZuZGVmIEdldFRoZW1lVGFiUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUYWJSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGFiUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSEgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGlyZWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lVGFiUmVnaW9uKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGlyZWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lVGFiUmVnaW9uKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9TZXRUaGVtZUN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUN1cnNvciBpbkN1cnNvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUN1cnNvciBpbkN1cnNvcjsKICNpZm5kZWYgU2V0VGhlbWVDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZUN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkN1cnNvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUaGVtZUN1cnNvcihpbkN1cnNvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkN1cnNvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUaGVtZUN1cnNvcihpbkN1cnNvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldEFuaW1hdGVkVGhlbWVDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVDdXJzb3IgaW5DdXJzb3I7Ci0JVUludDMyIGluQW5pbWF0aW9uU3RlcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUN1cnNvciBpbkN1cnNvcjsKKyAgICBVSW50MzIgaW5BbmltYXRpb25TdGVwOwogI2lmbmRlZiBTZXRBbmltYXRlZFRoZW1lQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QW5pbWF0ZWRUaGVtZUN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0QW5pbWF0ZWRUaGVtZUN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkN1cnNvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQW5pbWF0aW9uU3RlcCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRBbmltYXRlZFRoZW1lQ3Vyc29yKGluQ3Vyc29yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQW5pbWF0aW9uU3RlcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5DdXJzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFuaW1hdGlvblN0ZXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QW5pbWF0ZWRUaGVtZUN1cnNvcihpbkN1cnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFuaW1hdGlvblN0ZXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlIG91dFN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSBvdXRTdHlsZTsKICNpZm5kZWYgR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUoJm91dFN0eWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUoJm91dFN0eWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVNjcm9sbEJhckFycm93U3R5bGUgb3V0U3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlIG91dFN0eWxlOwogI2lmbmRlZiBHZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSgmb3V0U3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSgmb3V0U3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0eWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVDaGVja0JveFN0eWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lQ2hlY2tCb3hTdHlsZSBvdXRTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUNoZWNrQm94U3R5bGUgb3V0U3R5bGU7CiAjaWZuZGVmIEdldFRoZW1lQ2hlY2tCb3hTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQ2hlY2tCb3hTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVDaGVja0JveFN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVDaGVja0JveFN0eWxlKCZvdXRTdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVDaGVja0JveFN0eWxlKCZvdXRTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9Vc2VUaGVtZUZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVGb250SUQgaW5Gb250SUQ7Ci0JU2NyaXB0Q29kZSBpblNjcmlwdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUZvbnRJRCBpbkZvbnRJRDsKKyAgICBTY3JpcHRDb2RlIGluU2NyaXB0OwogI2lmbmRlZiBVc2VUaGVtZUZvbnQKLQlQeU1hY19QUkVDSEVDSyhVc2VUaGVtZUZvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVzZVRoZW1lRm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU2NyaXB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVzZVRoZW1lRm9udChpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgIGluU2NyaXB0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2NyaXB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVzZVRoZW1lRm9udChpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluU2NyaXB0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lVGV4dEJveChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCUJvb2xlYW4gaW5XcmFwVG9XaWR0aDsKLQlSZWN0IGluQm91bmRpbmdCb3g7Ci0JU0ludDE2IGluSnVzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBUaGVtZUZvbnRJRCBpbkZvbnRJRDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIEJvb2xlYW4gaW5XcmFwVG9XaWR0aDsKKyAgICBSZWN0IGluQm91bmRpbmdCb3g7CisgICAgU0ludDE2IGluSnVzdDsKICNpZm5kZWYgRHJhd1RoZW1lVGV4dEJveAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRleHRCb3gpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRleHRCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldyYXBUb1dpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZGluZ0JveCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSnVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVUZXh0Qm94KGluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwVG9XaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZGluZ0JveCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkp1c3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldyYXBUb1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZGluZ0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSnVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVUZXh0Qm94KGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwVG9XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZGluZ0JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkp1c3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1RydW5jYXRlVGhlbWVUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGTXV0YWJsZVN0cmluZ1JlZiBpblN0cmluZzsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCVNJbnQxNiBpblBpeGVsV2lkdGhMaW1pdDsKLQlUcnVuY0NvZGUgaW5UcnVuY1doZXJlOwotCUJvb2xlYW4gb3V0VHJ1bmNhdGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGTXV0YWJsZVN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBUaGVtZUZvbnRJRCBpbkZvbnRJRDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFNJbnQxNiBpblBpeGVsV2lkdGhMaW1pdDsKKyAgICBUcnVuY0NvZGUgaW5UcnVuY1doZXJlOworICAgIEJvb2xlYW4gb3V0VHJ1bmNhdGVkOwogI2lmbmRlZiBUcnVuY2F0ZVRoZW1lVGV4dAotCVB5TWFjX1BSRUNIRUNLKFRydW5jYXRlVGhlbWVUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcnVuY2F0ZVRoZW1lVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhsaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QaXhlbFdpZHRoTGltaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRydW5jV2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJ1bmNhdGVUaGVtZVRleHQoaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblBpeGVsV2lkdGhMaW1pdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcnVuY1doZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VHJ1bmNhdGVkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRUcnVuY2F0ZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGxoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBpeGVsV2lkdGhMaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVHJ1bmNXaGVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcnVuY2F0ZVRoZW1lVGV4dChpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGl4ZWxXaWR0aExpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRydW5jV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcnVuY2F0ZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFRydW5jYXRlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lVGV4dERpbWVuc2lvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7Ci0JVGhlbWVGb250SUQgaW5Gb250SUQ7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKLQlCb29sZWFuIGluV3JhcFRvV2lkdGg7Ci0JUG9pbnQgaW9Cb3VuZHM7Ci0JU0ludDE2IG91dEJhc2VsaW5lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluU3RyaW5nOworICAgIFRoZW1lRm9udElEIGluRm9udElEOworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgQm9vbGVhbiBpbldyYXBUb1dpZHRoOworICAgIFBvaW50IGlvQm91bmRzOworICAgIFNJbnQxNiBvdXRCYXNlbGluZTsKICNpZm5kZWYgR2V0VGhlbWVUZXh0RGltZW5zaW9ucwotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGV4dERpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGV4dERpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV3JhcFRvV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW9Cb3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVUZXh0RGltZW5zaW9ucyhpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV3JhcFRvV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCYXNlbGluZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBpb0JvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICBvdXRCYXNlbGluZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV3JhcFRvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW9Cb3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVUZXh0RGltZW5zaW9ucyhpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV3JhcFRvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlvQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCYXNlbGluZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBpb0JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCYXNlbGluZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lVGV4dFNoYWRvd091dHNldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCVJlY3Qgb3V0T3V0c2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lRm9udElEIGluRm9udElEOworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUmVjdCBvdXRPdXRzZXQ7CiAjaWZuZGVmIEdldFRoZW1lVGV4dFNoYWRvd091dHNldAotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGV4dFNoYWRvd091dHNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVRleHRTaGFkb3dPdXRzZXQoaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE91dHNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dE91dHNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lVGV4dFNoYWRvd091dHNldChpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0T3V0c2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0T3V0c2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgYm91bmRzOwotCVRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZTsKLQlUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlOwotCUJvb2xlYW4gaXNIb3JpejsKLQlSZWN0IHRyYWNrQm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgYm91bmRzOworICAgIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZTsKKyAgICBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlOworICAgIEJvb2xlYW4gaXNIb3JpejsKKyAgICBSZWN0IHRyYWNrQm91bmRzOwogI2lmbmRlZiBEcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNjcm9sbEJhckFycm93cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZXNzU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0hvcml6KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVNjcm9sbEJhckFycm93cygmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzc1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0hvcml6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVNjcm9sbEJhckFycm93cygmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzc1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBib3VuZHM7Ci0JVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOwotCVRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7Ci0JQm9vbGVhbiBpc0hvcml6OwotCVJlY3QgdHJhY2tCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOworICAgIFRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7CisgICAgQm9vbGVhbiBpc0hvcml6OworICAgIFJlY3QgdHJhY2tCb3VuZHM7CiAjaWZuZGVmIEdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZVN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlc3NTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzSG9yaXopKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QoJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0hvcml6KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0KCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzc1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tCb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0cmFja0JvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0hpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCBzY3JvbGxCYXJCb3VuZHM7Ci0JVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOwotCVRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7Ci0JQm9vbGVhbiBpc0hvcml6OwotCVBvaW50IHB0SGl0OwotCVJlY3QgdHJhY2tCb3VuZHM7Ci0JQ29udHJvbFBhcnRDb2RlIHBhcnRjb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHNjcm9sbEJhckJvdW5kczsKKyAgICBUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGU7CisgICAgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZTsKKyAgICBCb29sZWFuIGlzSG9yaXo7CisgICAgUG9pbnQgcHRIaXQ7CisgICAgUmVjdCB0cmFja0JvdW5kczsKKyAgICBDb250cm9sUGFydENvZGUgcGFydGNvZGU7CiAjaWZuZGVmIEhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cwotCVB5TWFjX1BSRUNIRUNLKEhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc2Nyb2xsQmFyQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVzc1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNIb3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdEhpdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cygmc2Nyb2xsQmFyQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3NTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRIaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRjb2RlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgIHBhcnRjb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNjcm9sbEJhckJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc3NTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzSG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHRIaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBIaXRUZXN0VGhlbWVTY3JvbGxCYXJBcnJvd3MoJnNjcm9sbEJhckJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0SGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tCb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0Y29kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0cmFja0JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0Y29kZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVXaW5kb3dUeXBlIGZsYXZvcjsKLQlSZWN0IGluQ29udFJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7Ci0JVGhlbWVXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVXaW5kb3dUeXBlIGZsYXZvcjsKKyAgICBSZWN0IGluQ29udFJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgVGhlbWVXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CiAjaWZuZGVmIERyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQ29udFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycyhmbGF2b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSE8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhdm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Db250UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzKGZsYXZvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lQnV0dG9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5Cb3VuZHM7Ci0JVUludDE2IGluS2luZDsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbzsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluUHJldkluZm87Ci0JVUludDMyIGluVXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbkJvdW5kczsKKyAgICBVSW50MTYgaW5LaW5kOworICAgIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5OZXdJbmZvOworICAgIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5QcmV2SW5mbzsKKyAgICBVSW50MzIgaW5Vc2VyRGF0YTsKICNpZm5kZWYgRHJhd1RoZW1lQnV0dG9uCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lQnV0dG9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVCdXR0b24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluTmV3SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5QcmV2SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVXNlckRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lQnV0dG9uKCZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZpbk5ld0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAmaW5QcmV2SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5Vc2VyRGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluTmV3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5QcmV2SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXNlckRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lQnV0dG9uKCZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5ld0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QcmV2SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Vc2VyRGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lQnV0dG9uUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5Cb3VuZHM7Ci0JVUludDE2IGluS2luZDsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluQm91bmRzOworICAgIFVJbnQxNiBpbktpbmQ7CisgICAgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm87CiAjaWZuZGVmIEdldFRoZW1lQnV0dG9uUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25SZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQnV0dG9uUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpbk5ld0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVCdXR0b25SZWdpb24oJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5ld0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZ25IYW5kbGUpMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluTmV3SW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZUJ1dHRvblJlZ2lvbigmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTmV3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJnbkhhbmRsZSkwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5Cb3VuZHM7Ci0JVUludDE2IGluS2luZDsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm87Ci0JUmVjdCBvdXRCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbkJvdW5kczsKKyAgICBVSW50MTYgaW5LaW5kOworICAgIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbzsKKyAgICBSZWN0IG91dEJvdW5kczsKICNpZm5kZWYgR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluRHJhd0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKCZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluRHJhd0luZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzKCZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluQm91bmRzOwotCVVJbnQxNiBpbktpbmQ7Ci0JVGhlbWVCdXR0b25EcmF3SW5mbyBpbkRyYXdJbmZvOwotCVJlY3Qgb3V0Qm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5Cb3VuZHM7CisgICAgVUludDE2IGluS2luZDsKKyAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm87CisgICAgUmVjdCBvdXRCb3VuZHM7CiAjaWZuZGVmIEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpbkRyYXdJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcygmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EcmF3SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpbkRyYXdJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcygmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EcmF3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRCb3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9QbGF5VGhlbWVTb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVNvdW5kS2luZCBraW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lU291bmRLaW5kIGtpbmQ7CiAjaWZuZGVmIFBsYXlUaGVtZVNvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soUGxheVRoZW1lU291bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBsYXlUaGVtZVNvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2luZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbGF5VGhlbWVTb3VuZChraW5kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmtpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxheVRoZW1lU291bmQoa2luZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0JlZ2luVGhlbWVEcmFnU291bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVEcmFnU291bmRLaW5kIGtpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVEcmFnU291bmRLaW5kIGtpbmQ7CiAjaWZuZGVmIEJlZ2luVGhlbWVEcmFnU291bmQKLQlQeU1hY19QUkVDSEVDSyhCZWdpblRoZW1lRHJhZ1NvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCZWdpblRoZW1lRHJhZ1NvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2luZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBCZWdpblRoZW1lRHJhZ1NvdW5kKGtpbmQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2luZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCZWdpblRoZW1lRHJhZ1NvdW5kKGtpbmQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9FbmRUaGVtZURyYWdTb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRW5kVGhlbWVEcmFnU291bmQKLQlQeU1hY19QUkVDSEVDSyhFbmRUaGVtZURyYWdTb3VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5kVGhlbWVEcmFnU291bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmRUaGVtZURyYWdTb3VuZCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW5kVGhlbWVEcmFnU291bmQoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lVGlja01hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBib3VuZHM7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVEcmF3U3RhdGUgc3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVRpY2tNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lVGlja01hcmspOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRpY2tNYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVUaWNrTWFyaygmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVRpY2tNYXJrKCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lQ2hhc2luZ0Fycm93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKLQlVSW50MzIgaW5kZXg7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7Ci0JVUludDMyIGVyYXNlRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBVSW50MzIgaW5kZXg7CisgICAgVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgVUludDMyIGVyYXNlRGF0YTsKICNpZm5kZWYgRHJhd1RoZW1lQ2hhc2luZ0Fycm93cwotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUNoYXNpbmdBcnJvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUNoYXNpbmdBcnJvd3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVyYXNlRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVDaGFzaW5nQXJyb3dzKCZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZURhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcmFzZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lQ2hhc2luZ0Fycm93cygmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2VEYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lUG9wdXBBcnJvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKLQlUaGVtZUFycm93T3JpZW50YXRpb24gb3JpZW50YXRpb247Ci0JVGhlbWVQb3B1cEFycm93U2l6ZSBzaXplOwotCVRoZW1lRHJhd1N0YXRlIHN0YXRlOwotCVVJbnQzMiBlcmFzZURhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVBcnJvd09yaWVudGF0aW9uIG9yaWVudGF0aW9uOworICAgIFRoZW1lUG9wdXBBcnJvd1NpemUgc2l6ZTsKKyAgICBUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKKyAgICBVSW50MzIgZXJhc2VEYXRhOwogI2lmbmRlZiBEcmF3VGhlbWVQb3B1cEFycm93Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lUG9wdXBBcnJvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lUG9wdXBBcnJvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhIbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZlcmFzZURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lUG9wdXBBcnJvdygmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZURhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSEhsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyYXNlRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVQb3B1cEFycm93KCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyYXNlRGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVHcm93Qm94KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IG9yaWdpbjsKLQlUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbjsKLQlCb29sZWFuIGlzU21hbGw7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgb3JpZ2luOworICAgIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uOworICAgIEJvb2xlYW4gaXNTbWFsbDsKKyAgICBUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm9yaWdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyb3dEaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpc1NtYWxsLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gob3JpZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NtYWxsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3dEaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gob3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgb3JpZ2luOwotCVRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uOwotCUJvb2xlYW4gaXNTbWFsbDsKLQlUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBvcmlnaW47CisgICAgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb247CisgICAgQm9vbGVhbiBpc1NtYWxsOworICAgIFRoZW1lRHJhd1N0YXRlIHN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU3RhbmRhbG9uZU5vR3Jvd0JveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU3RhbmRhbG9uZU5vR3Jvd0JveCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb3JpZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3Jvd0RpcmVjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94KG9yaWdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZncm93RGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNTbWFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3gob3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3dEaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTbWFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lU3RhbmRhbG9uZUdyb3dCb3hCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgb3JpZ2luOwotCVRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uOwotCUJvb2xlYW4gaXNTbWFsbDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBvcmlnaW47CisgICAgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb247CisgICAgQm9vbGVhbiBpc1NtYWxsOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvcmlnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNTbWFsbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzKG9yaWdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3Jvd0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzU21hbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyhvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvd0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9Ob3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVEcmF3aW5nU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVEcmF3aW5nU3RhdGUgb3V0U3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVEcmF3aW5nU3RhdGUgb3V0U3RhdGU7CiAjaWZuZGVmIEdldFRoZW1lRHJhd2luZ1N0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVEcmF3aW5nU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lRHJhd2luZ1N0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVEcmF3aW5nU3RhdGUoJm91dFN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGhlbWVEcmF3aW5nU3RhdGVPYmpfTmV3LCBvdXRTdGF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZURyYXdpbmdTdGF0ZSgmb3V0U3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial9OZXcsIG91dFN0YXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfQXBwbHlUaGVtZUJhY2tncm91bmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVCYWNrZ3JvdW5kS2luZCBpbktpbmQ7Ci0JUmVjdCBib3VuZHM7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluQ29sb3JEZXY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVCYWNrZ3JvdW5kS2luZCBpbktpbmQ7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluQ29sb3JEZXY7CiAjaWZuZGVmIEFwcGx5VGhlbWVCYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soQXBwbHlUaGVtZUJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGx5VGhlbWVCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmxoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3JEZXYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXBwbHlUaGVtZUJhY2tncm91bmQoaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbG9yRGV2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFwcGx5VGhlbWVCYWNrZ3JvdW5kKGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db2xvckRldik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lVGV4dENvbG9yRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JQm9vbGVhbiBpc0FjdGl2ZTsKLQlTSW50MTYgZGVwdGg7Ci0JQm9vbGVhbiBpc0NvbG9yRGV2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgQm9vbGVhbiBpc0FjdGl2ZTsKKyAgICBTSW50MTYgZGVwdGg7CisgICAgQm9vbGVhbiBpc0NvbG9yRGV2OwogI2lmbmRlZiBTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFNldFRoZW1lVGV4dENvbG9yRm9yV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNBY3RpdmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzQ29sb3JEZXYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3cod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29sb3JEZXYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0FjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNDb2xvckRldikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb2xvckRldik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0lzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU9TVHlwZSBmaWxlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBJc1ZhbGlkQXBwZWFyYW5jZUZpbGVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZShmaWxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUoZmlsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZUJydXNoQXNDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUJydXNoIGluQnJ1c2g7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbkNvbG9yRGV2OwotCVJHQkNvbG9yIG91dENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lQnJ1c2ggaW5CcnVzaDsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluQ29sb3JEZXY7CisgICAgUkdCQ29sb3Igb3V0Q29sb3I7CiAjaWZuZGVmIEdldFRoZW1lQnJ1c2hBc0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCcnVzaEFzQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQnJ1c2hBc0NvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3JEZXYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVCcnVzaEFzQ29sb3IoaW5CcnVzaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db2xvckRldiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3V0Q29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3JEZXYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVCcnVzaEFzQ29sb3IoaW5CcnVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db2xvckRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3V0Q29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZVRleHRDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVRleHRDb2xvciBpbkNvbG9yOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Db2xvckRldjsKLQlSR0JDb2xvciBvdXRDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZVRleHRDb2xvciBpbkNvbG9yOworICAgIFNJbnQxNiBpbkRlcHRoOworICAgIEJvb2xlYW4gaW5Db2xvckRldjsKKyAgICBSR0JDb2xvciBvdXRDb2xvcjsKICNpZm5kZWYgR2V0VGhlbWVUZXh0Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVRleHRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUZXh0Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvckRldikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVRleHRDb2xvcihpbkNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29sb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvdXRDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvckRldikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZVRleHRDb2xvcihpbkNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29sb3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvdXRDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lTWV0cmljKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lTWV0cmljIGluTWV0cmljOwotCVNJbnQzMiBvdXRNZXRyaWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVNZXRyaWMgaW5NZXRyaWM7CisgICAgU0ludDMyIG91dE1ldHJpYzsKICNpZm5kZWYgR2V0VGhlbWVNZXRyaWMKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1ldHJpYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZXRyaWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1ldHJpYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1ldHJpYyhpbk1ldHJpYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm91dE1ldHJpYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0TWV0cmljKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWV0cmljKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lTWV0cmljKGluTWV0cmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWV0cmljKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNZXRyaWMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQXBwX21ldGhvZHNbXSA9IHsKLQl7IlJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCIsIChQeUNGdW5jdGlvbilBcHBfUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJVbnJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCIsIChQeUNGdW5jdGlvbilBcHBfVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldFRoZW1lUGVuIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVBlbiwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCcnVzaCBpbkJydXNoLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRUaGVtZUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCcnVzaCBpbkJydXNoLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRUaGVtZVRleHRDb2xvciIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVUZXh0Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lVGV4dENvbG9yIGluQ29sb3IsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKLQl7IlNldFRoZW1lV2luZG93QmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFRoZW1lQnJ1c2ggaW5CcnVzaCwgQm9vbGVhbiBpblVwZGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVdpbmRvd0hlYWRlciIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lV2luZG93SGVhZGVyLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVQbGFjYXJkIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVQbGFjYXJkLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUVkaXRUZXh0RnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lTGlzdEJveEZyYW1lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVMaXN0Qm94RnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lRm9jdXNSZWN0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVGb2N1c1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBCb29sZWFuIGluSGFzRm9jdXMpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVQcmltYXJ5R3JvdXAiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVByaW1hcnlHcm91cCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVTZWNvbmRhcnlHcm91cCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU2Vjb25kYXJ5R3JvdXAsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lU2VwYXJhdG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTZXBhcmF0b3IsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVHZW5lcmljV2VsbCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lR2VuZXJpY1dlbGwsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBCb29sZWFuIGluRmlsbENlbnRlcikgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZUZvY3VzUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVGb2N1c1JlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbkhhc0ZvY3VzKSAtPiBOb25lIil9LAotCXsiSXNUaGVtZUluQ29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX0lzVGhlbWVJbkNvbG9yLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRUaGVtZUFjY2VudENvbG9ycyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVBY2NlbnRDb2xvcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENUYWJIYW5kbGUgb3V0Q29sb3JzKSIpfSwKLQl7IkRyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNZW51QmFyQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVGhlbWVNZW51QmFyU3RhdGUgaW5TdGF0ZSwgVUludDMyIGluQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lTWVudUJhckhlaWdodCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51QmFySGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0SGVpZ2h0KSIpfSwKLQl7IkRyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNZW51QmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbk1lbnVSZWN0LCBUaGVtZU1lbnVUeXBlIGluTWVudVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluTWVudVJlY3QsIFRoZW1lTWVudVR5cGUgbWVudVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVNZW51U2VwYXJhdG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNZW51U2VwYXJhdG9yLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluSXRlbVJlY3QpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEhlaWdodCkiKX0sCi0JeyJHZXRUaGVtZU1lbnVJdGVtRXh0cmEiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudUl0ZW1FeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVNZW51SXRlbVR5cGUgaW5JdGVtVHlwZSkgLT4gKFNJbnQxNiBvdXRIZWlnaHQsIFNJbnQxNiBvdXRXaWR0aCkiKX0sCi0JeyJHZXRUaGVtZU1lbnVUaXRsZUV4dHJhIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVUaXRsZUV4dHJhLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluSXNTcXVpc2hlZCkgLT4gKFNJbnQxNiBvdXRXaWR0aCkiKX0sCi0JeyJEcmF3VGhlbWVUYWJQYW5lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVUYWJQYW5lLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lVGFiUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRhYlJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lVGFiU3R5bGUgaW5TdHlsZSwgVGhlbWVUYWJEaXJlY3Rpb24gaW5EaXJlY3Rpb24pIC0+IE5vbmUiKX0sCi0JeyJTZXRUaGVtZUN1cnNvciIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lQ3Vyc29yIGluQ3Vyc29yKSAtPiBOb25lIil9LAotCXsiU2V0QW5pbWF0ZWRUaGVtZUN1cnNvciIsIChQeUNGdW5jdGlvbilBcHBfU2V0QW5pbWF0ZWRUaGVtZUN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVDdXJzb3IgaW5DdXJzb3IsIFVJbnQzMiBpbkFuaW1hdGlvblN0ZXApIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlIG91dFN0eWxlKSIpfSwKLQl7IkdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaGVtZVNjcm9sbEJhckFycm93U3R5bGUgb3V0U3R5bGUpIil9LAotCXsiR2V0VGhlbWVDaGVja0JveFN0eWxlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUNoZWNrQm94U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lQ2hlY2tCb3hTdHlsZSBvdXRTdHlsZSkiKX0sCi0JeyJVc2VUaGVtZUZvbnQiLCAoUHlDRnVuY3Rpb24pQXBwX1VzZVRoZW1lRm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVGb250SUQgaW5Gb250SUQsIFNjcmlwdENvZGUgaW5TY3JpcHQpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVUZXh0Qm94IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVUZXh0Qm94LCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIEJvb2xlYW4gaW5XcmFwVG9XaWR0aCwgUmVjdCBpbkJvdW5kaW5nQm94LCBTSW50MTYgaW5KdXN0KSAtPiBOb25lIil9LAotCXsiVHJ1bmNhdGVUaGVtZVRleHQiLCAoUHlDRnVuY3Rpb24pQXBwX1RydW5jYXRlVGhlbWVUZXh0LCAxLAotCSBQeURvY19TVFIoIihDRk11dGFibGVTdHJpbmdSZWYgaW5TdHJpbmcsIFRoZW1lRm9udElEIGluRm9udElELCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBTSW50MTYgaW5QaXhlbFdpZHRoTGltaXQsIFRydW5jQ29kZSBpblRydW5jV2hlcmUpIC0+IChCb29sZWFuIG91dFRydW5jYXRlZCkiKX0sCi0JeyJHZXRUaGVtZVRleHREaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRleHREaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIEJvb2xlYW4gaW5XcmFwVG9XaWR0aCwgUG9pbnQgaW9Cb3VuZHMpIC0+IChQb2ludCBpb0JvdW5kcywgU0ludDE2IG91dEJhc2VsaW5lKSIpfSwKLQl7IkdldFRoZW1lVGV4dFNoYWRvd091dHNldCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0LCAxLAotCSBQeURvY19TVFIoIihUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gKFJlY3Qgb3V0T3V0c2V0KSIpfSwKLQl7IkRyYXdUaGVtZVNjcm9sbEJhckFycm93cyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXopIC0+IChSZWN0IHRyYWNrQm91bmRzKSIpfSwKLQl7IkdldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVNjcm9sbEJhclRyYWNrUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMsIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZSwgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZSwgQm9vbGVhbiBpc0hvcml6KSAtPiAoUmVjdCB0cmFja0JvdW5kcykiKX0sCi0JeyJIaXRUZXN0VGhlbWVTY3JvbGxCYXJBcnJvd3MiLCAoUHlDRnVuY3Rpb24pQXBwX0hpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBzY3JvbGxCYXJCb3VuZHMsIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZSwgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZSwgQm9vbGVhbiBpc0hvcml6LCBQb2ludCBwdEhpdCkgLT4gKEJvb2xlYW4gX3J2LCBSZWN0IHRyYWNrQm91bmRzLCBDb250cm9sUGFydENvZGUgcGFydGNvZGUpIil9LAotCXsiRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycywgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVXaW5kb3dUeXBlIGZsYXZvciwgUmVjdCBpbkNvbnRSZWN0LCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSwgVGhlbWVXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVCdXR0b24iLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUJ1dHRvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm8sIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5QcmV2SW5mbywgVUludDMyIGluVXNlckRhdGEpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZUJ1dHRvblJlZ2lvbiIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVCdXR0b25SZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5OZXdJbmZvKSAtPiBOb25lIil9LAotCXsiR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbykgLT4gKFJlY3Qgb3V0Qm91bmRzKSIpfSwKLQl7IkdldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBVSW50MTYgaW5LaW5kLCBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm8pIC0+IChSZWN0IG91dEJvdW5kcykiKX0sCi0JeyJQbGF5VGhlbWVTb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfUGxheVRoZW1lU291bmQsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lU291bmRLaW5kIGtpbmQpIC0+IE5vbmUiKX0sCi0JeyJCZWdpblRoZW1lRHJhZ1NvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9CZWdpblRoZW1lRHJhZ1NvdW5kLCAxLAotCSBQeURvY19TVFIoIihUaGVtZURyYWdTb3VuZEtpbmQga2luZCkgLT4gTm9uZSIpfSwKLQl7IkVuZFRoZW1lRHJhZ1NvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9FbmRUaGVtZURyYWdTb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lVGlja01hcmsiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRpY2tNYXJrLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVEcmF3U3RhdGUgc3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVDaGFzaW5nQXJyb3dzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVDaGFzaW5nQXJyb3dzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVUludDMyIGluZGV4LCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSwgVUludDMyIGVyYXNlRGF0YSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVBvcHVwQXJyb3ciLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVBvcHVwQXJyb3csIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZUFycm93T3JpZW50YXRpb24gb3JpZW50YXRpb24sIFRoZW1lUG9wdXBBcnJvd1NpemUgc2l6ZSwgVGhlbWVEcmF3U3RhdGUgc3RhdGUsIFVJbnQzMiBlcmFzZURhdGEpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3gsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IG9yaWdpbiwgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb24sIEJvb2xlYW4gaXNTbWFsbCwgVGhlbWVEcmF3U3RhdGUgc3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBvcmlnaW4sIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uLCBCb29sZWFuIGlzU21hbGwsIFRoZW1lRHJhd1N0YXRlIHN0YXRlKSAtPiBOb25lIil9LAotCXsiR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgb3JpZ2luLCBUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbiwgQm9vbGVhbiBpc1NtYWxsKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUiLCAoUHlDRnVuY3Rpb24pQXBwX05vcm1hbGl6ZVRoZW1lRHJhd2luZ1N0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVEcmF3aW5nU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lRHJhd2luZ1N0YXRlIG91dFN0YXRlKSIpfSwKLQl7IkFwcGx5VGhlbWVCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9BcHBseVRoZW1lQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCYWNrZ3JvdW5kS2luZCBpbktpbmQsIFJlY3QgYm91bmRzLCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbkNvbG9yRGV2KSAtPiBOb25lIil9LAotCXsiU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lVGV4dENvbG9yRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBCb29sZWFuIGlzQWN0aXZlLCBTSW50MTYgZGVwdGgsIEJvb2xlYW4gaXNDb2xvckRldikgLT4gTm9uZSIpfSwKLQl7IklzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pQXBwX0lzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFRoZW1lQnJ1c2hBc0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJydXNoQXNDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVCcnVzaCBpbkJydXNoLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbkNvbG9yRGV2KSAtPiAoUkdCQ29sb3Igb3V0Q29sb3IpIil9LAotCXsiR2V0VGhlbWVUZXh0Q29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGV4dENvbG9yLCAxLAotCSBQeURvY19TVFIoIihUaGVtZVRleHRDb2xvciBpbkNvbG9yLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbkNvbG9yRGV2KSAtPiAoUkdCQ29sb3Igb3V0Q29sb3IpIil9LAotCXsiR2V0VGhlbWVNZXRyaWMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWV0cmljLCAxLAotCSBQeURvY19TVFIoIihUaGVtZU1ldHJpYyBpbk1ldHJpYykgLT4gKFNJbnQzMiBvdXRNZXRyaWMpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50IiwgKFB5Q0Z1bmN0aW9uKUFwcF9SZWdpc3RlckFwcGVhcmFuY2VDbGllbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50IiwgKFB5Q0Z1bmN0aW9uKUFwcF9VbnJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0VGhlbWVQZW4iLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lUGVuLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRoZW1lQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRoZW1lVGV4dENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVRleHRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVUZXh0Q29sb3IgaW5Db2xvciwgU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVdpbmRvd0JhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgVGhlbWVCcnVzaCBpbkJydXNoLCBCb29sZWFuIGluVXBkYXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lV2luZG93SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVXaW5kb3dIZWFkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lV2luZG93TGlzdFZpZXdIZWFkZXIiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVBsYWNhcmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVBsYWNhcmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lRWRpdFRleHRGcmFtZSIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lRWRpdFRleHRGcmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVMaXN0Qm94RnJhbWUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUxpc3RCb3hGcmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVGb2N1c1JlY3QiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUZvY3VzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIEJvb2xlYW4gaW5IYXNGb2N1cykgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVByaW1hcnlHcm91cCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lUHJpbWFyeUdyb3VwLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVNlY29uZGFyeUdyb3VwIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTZWNvbmRhcnlHcm91cCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVTZXBhcmF0b3IiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVNlcGFyYXRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUdlbmVyaWNXZWxsIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVHZW5lcmljV2VsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIEJvb2xlYW4gaW5GaWxsQ2VudGVyKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lRm9jdXNSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUZvY3VzUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluSGFzRm9jdXMpIC0+IE5vbmUiKX0sCisgICAgeyJJc1RoZW1lSW5Db2xvciIsIChQeUNGdW5jdGlvbilBcHBfSXNUaGVtZUluQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldFRoZW1lQWNjZW50Q29sb3JzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUFjY2VudENvbG9ycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ1RhYkhhbmRsZSBvdXRDb2xvcnMpIil9LAorICAgIHsiRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBUaGVtZU1lbnVCYXJTdGF0ZSBpblN0YXRlLCBVSW50MzIgaW5BdHRyaWJ1dGVzKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVNZW51QmFySGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVCYXJIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRIZWlnaHQpIil9LAorICAgIHsiRHJhd1RoZW1lTWVudUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluTWVudVJlY3QsIFRoZW1lTWVudVR5cGUgaW5NZW51VHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5NZW51UmVjdCwgVGhlbWVNZW51VHlwZSBtZW51VHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZU1lbnVTZXBhcmF0b3IiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVTZXBhcmF0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5JdGVtUmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0SGVpZ2h0KSIpfSwKKyAgICB7IkdldFRoZW1lTWVudUl0ZW1FeHRyYSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51SXRlbUV4dHJhLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZU1lbnVJdGVtVHlwZSBpbkl0ZW1UeXBlKSAtPiAoU0ludDE2IG91dEhlaWdodCwgU0ludDE2IG91dFdpZHRoKSIpfSwKKyAgICB7IkdldFRoZW1lTWVudVRpdGxlRXh0cmEiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudVRpdGxlRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5Jc1NxdWlzaGVkKSAtPiAoU0ludDE2IG91dFdpZHRoKSIpfSwKKyAgICB7IkRyYXdUaGVtZVRhYlBhbmUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRhYlBhbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVUYWJSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGFiUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVUYWJTdHlsZSBpblN0eWxlLCBUaGVtZVRhYkRpcmVjdGlvbiBpbkRpcmVjdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRoZW1lQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZUN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVDdXJzb3IgaW5DdXJzb3IpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRBbmltYXRlZFRoZW1lQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRBbmltYXRlZFRoZW1lQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUN1cnNvciBpbkN1cnNvciwgVUludDMyIGluQW5pbWF0aW9uU3RlcCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUgb3V0U3R5bGUpIil9LAorICAgIHsiR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSBvdXRTdHlsZSkiKX0sCisgICAgeyJHZXRUaGVtZUNoZWNrQm94U3R5bGUiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQ2hlY2tCb3hTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVDaGVja0JveFN0eWxlIG91dFN0eWxlKSIpfSwKKyAgICB7IlVzZVRoZW1lRm9udCIsIChQeUNGdW5jdGlvbilBcHBfVXNlVGhlbWVGb250LCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUZvbnRJRCBpbkZvbnRJRCwgU2NyaXB0Q29kZSBpblNjcmlwdCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVRleHRCb3giLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRleHRCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nLCBUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgQm9vbGVhbiBpbldyYXBUb1dpZHRoLCBSZWN0IGluQm91bmRpbmdCb3gsIFNJbnQxNiBpbkp1c3QpIC0+IE5vbmUiKX0sCisgICAgeyJUcnVuY2F0ZVRoZW1lVGV4dCIsIChQeUNGdW5jdGlvbilBcHBfVHJ1bmNhdGVUaGVtZVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGTXV0YWJsZVN0cmluZ1JlZiBpblN0cmluZywgVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIFNJbnQxNiBpblBpeGVsV2lkdGhMaW1pdCwgVHJ1bmNDb2RlIGluVHJ1bmNXaGVyZSkgLT4gKEJvb2xlYW4gb3V0VHJ1bmNhdGVkKSIpfSwKKyAgICB7IkdldFRoZW1lVGV4dERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGV4dERpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nLCBUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgQm9vbGVhbiBpbldyYXBUb1dpZHRoLCBQb2ludCBpb0JvdW5kcykgLT4gKFBvaW50IGlvQm91bmRzLCBTSW50MTYgb3V0QmFzZWxpbmUpIil9LAorICAgIHsiR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRleHRTaGFkb3dPdXRzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lRm9udElEIGluRm9udElELCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiAoUmVjdCBvdXRPdXRzZXQpIil9LAorICAgIHsiRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGUsIFRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGUsIEJvb2xlYW4gaXNIb3JpeikgLT4gKFJlY3QgdHJhY2tCb3VuZHMpIil9LAorICAgIHsiR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXopIC0+IChSZWN0IHRyYWNrQm91bmRzKSIpfSwKKyAgICB7IkhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cyIsIChQeUNGdW5jdGlvbilBcHBfSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNjcm9sbEJhckJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXosIFBvaW50IHB0SGl0KSAtPiAoQm9vbGVhbiBfcnYsIFJlY3QgdHJhY2tCb3VuZHMsIENvbnRyb2xQYXJ0Q29kZSBwYXJ0Y29kZSkiKX0sCisgICAgeyJEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZVdpbmRvd1R5cGUgZmxhdm9yLCBSZWN0IGluQ29udFJlY3QsIFRoZW1lRHJhd1N0YXRlIHN0YXRlLCBUaGVtZVdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUJ1dHRvbiIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lQnV0dG9uLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBVSW50MTYgaW5LaW5kLCBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbywgVGhlbWVCdXR0b25EcmF3SW5mbyBpblByZXZJbmZvLCBVSW50MzIgaW5Vc2VyRGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lQnV0dG9uUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvblJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm8pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbkRyYXdJbmZvKSAtPiAoUmVjdCBvdXRCb3VuZHMpIil9LAorICAgIHsiR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvbkJhY2tncm91bmRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbykgLT4gKFJlY3Qgb3V0Qm91bmRzKSIpfSwKKyAgICB7IlBsYXlUaGVtZVNvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9QbGF5VGhlbWVTb3VuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVTb3VuZEtpbmQga2luZCkgLT4gTm9uZSIpfSwKKyAgICB7IkJlZ2luVGhlbWVEcmFnU291bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0JlZ2luVGhlbWVEcmFnU291bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lRHJhZ1NvdW5kS2luZCBraW5kKSAtPiBOb25lIil9LAorICAgIHsiRW5kVGhlbWVEcmFnU291bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0VuZFRoZW1lRHJhZ1NvdW5kLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVUaWNrTWFyayIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lVGlja01hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUNoYXNpbmdBcnJvd3MiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUNoYXNpbmdBcnJvd3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBVSW50MzIgaW5kZXgsIFRoZW1lRHJhd1N0YXRlIHN0YXRlLCBVSW50MzIgZXJhc2VEYXRhKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lUG9wdXBBcnJvdyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lUG9wdXBBcnJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMsIFRoZW1lQXJyb3dPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgVGhlbWVQb3B1cEFycm93U2l6ZSBzaXplLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSwgVUludDMyIGVyYXNlRGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVN0YW5kYWxvbmVHcm93Qm94IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgb3JpZ2luLCBUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbiwgQm9vbGVhbiBpc1NtYWxsLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3giLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IG9yaWdpbiwgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb24sIEJvb2xlYW4gaXNTbWFsbCwgVGhlbWVEcmF3U3RhdGUgc3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBvcmlnaW4sIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uLCBCb29sZWFuIGlzU21hbGwpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilBcHBfTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZURyYXdpbmdTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVEcmF3aW5nU3RhdGUgb3V0U3RhdGUpIil9LAorICAgIHsiQXBwbHlUaGVtZUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0FwcGx5VGhlbWVCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJhY2tncm91bmRLaW5kIGluS2luZCwgUmVjdCBib3VuZHMsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIEJvb2xlYW4gaXNBY3RpdmUsIFNJbnQxNiBkZXB0aCwgQm9vbGVhbiBpc0NvbG9yRGV2KSAtPiBOb25lIil9LAorICAgIHsiSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilBcHBfSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVUeXBlKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0VGhlbWVCcnVzaEFzQ29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQnJ1c2hBc0NvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IChSR0JDb2xvciBvdXRDb2xvcikiKX0sCisgICAgeyJHZXRUaGVtZVRleHRDb2xvciIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVUZXh0Q29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lVGV4dENvbG9yIGluQ29sb3IsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IChSR0JDb2xvciBvdXRDb2xvcikiKX0sCisgICAgeyJHZXRUaGVtZU1ldHJpYyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZXRyaWMsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lTWV0cmljIGluTWV0cmljKSAtPiAoU0ludDMyIG91dE1ldHJpYykiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKLSNlbHNlICAJLyogX19MUDY0X18gKi8KKyNlbHNlICAgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIEFwcF9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KQEAgLTE4MDUsMjYgKzE4MDUsMjYgQEAKIAogdm9pZCBpbml0X0FwcCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0FwcCIsIEFwcF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0FwcCIsIEFwcF9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlBcHBfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChBcHBfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBBcHBfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlUaGVtZURyYXdpbmdTdGF0ZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5T2JqZWN0ICopJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaGVtZURyYXdpbmdTdGF0ZVR5cGUiLCAoUHlPYmplY3QgKikmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQXBwX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoQXBwX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQXBwX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgVGhlbWVEcmF3aW5nU3RhdGVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaGVtZURyYXdpbmdTdGF0ZSIsIChQeU9iamVjdCAqKSZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVGhlbWVEcmF3aW5nU3RhdGVUeXBlIiwgKFB5T2JqZWN0ICopJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2F1dG9HSUwuYyBiL01hYy9Nb2R1bGVzL2F1dG9HSUwuYwppbmRleCBhZjJlNjk5Li4zYmMxNTkzIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9hdXRvR0lMLmMKKysrIGIvTWFjL01vZHVsZXMvYXV0b0dJTC5jCkBAIC0xNiw5MyArMTYsOTMgQEAKIAogCiBzdGF0aWMgdm9pZCBhdXRvR0lMQ2FsbGJhY2soQ0ZSdW5Mb29wT2JzZXJ2ZXJSZWYgb2JzZXJ2ZXIsCi0JCQkgICAgQ0ZSdW5Mb29wQWN0aXZpdHkgYWN0aXZpdHksCi0JCQkgICAgdm9pZCAqaW5mbykgewotCVB5VGhyZWFkU3RhdGUgKipwX3RzdGF0ZSA9IChQeVRocmVhZFN0YXRlICoqKWluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSdW5Mb29wQWN0aXZpdHkgYWN0aXZpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaW5mbykgeworICAgIFB5VGhyZWFkU3RhdGUgKipwX3RzdGF0ZSA9IChQeVRocmVhZFN0YXRlICoqKWluZm87CiAKLQlzd2l0Y2ggKGFjdGl2aXR5KSB7Ci0JY2FzZSBrQ0ZSdW5Mb29wQmVmb3JlV2FpdGluZzoKLQkJLyogZ29pbmcgdG8gc2xlZXAsIHJlbGVhc2UgR0lMICovCisgICAgc3dpdGNoIChhY3Rpdml0eSkgeworICAgIGNhc2Uga0NGUnVuTG9vcEJlZm9yZVdhaXRpbmc6CisgICAgICAgIC8qIGdvaW5nIHRvIHNsZWVwLCByZWxlYXNlIEdJTCAqLwogI2lmZGVmIEFVVE9HSUxfREVCVUcKLQkJZnByaW50ZihzdGRlcnIsICJnb2luZyB0byBzbGVlcCwgcmVsZWFzZSBHSUxcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdvaW5nIHRvIHNsZWVwLCByZWxlYXNlIEdJTFxuIik7CiAjZW5kaWYKLQkJKnBfdHN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKLQkJYnJlYWs7Ci0JY2FzZSBrQ0ZSdW5Mb29wQWZ0ZXJXYWl0aW5nOgotCQkvKiB3YWtpbmcgdXAsIGFjcXVpcmUgR0lMICovCisgICAgICAgICpwX3RzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NGUnVuTG9vcEFmdGVyV2FpdGluZzoKKyAgICAgICAgLyogd2FraW5nIHVwLCBhY3F1aXJlIEdJTCAqLwogI2lmZGVmIEFVVE9HSUxfREVCVUcKLQkJZnByaW50ZihzdGRlcnIsICJ3YWtpbmcgdXAsIGFjcXVpcmUgR0lMXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ3YWtpbmcgdXAsIGFjcXVpcmUgR0lMXG4iKTsKICNlbmRpZgotCQlQeUV2YWxfUmVzdG9yZVRocmVhZCgqcF90c3RhdGUpOwotCQkqcF90c3RhdGUgPSBOVUxMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisgICAgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKCpwX3RzdGF0ZSk7CisgICAgICAgICpwX3RzdGF0ZSA9IE5VTEw7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaW5mb1JlbGVhc2UoY29uc3Qgdm9pZCAqaW5mbykgewotCS8qIFhYWCBUaGlzIHNob3VsZCBnZXQgY2FsbGVkIHdoZW4gdGhlIHJ1biBsb29wIGlzIGRlYWxsb2NhdGVkLAotCSAgIGJ1dCB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4uIFNvIGZvciBub3c6IGxlYWsuICovCi0JUHlNZW1fRnJlZSgodm9pZCAqKWluZm8pOworICAgIC8qIFhYWCBUaGlzIHNob3VsZCBnZXQgY2FsbGVkIHdoZW4gdGhlIHJ1biBsb29wIGlzIGRlYWxsb2NhdGVkLAorICAgICAgIGJ1dCB0aGlzIGRvZXNuJ3Qgc2VlbSB0byBoYXBwZW4uIFNvIGZvciBub3c6IGxlYWsuICovCisgICAgUHlNZW1fRnJlZSgodm9pZCAqKWluZm8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXV0b0dJTF9pbnN0YWxsQXV0b0dJTChQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdHN0YXRlX2RpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKLQlQeU9iamVjdCAqdjsKLQlDRlJ1bkxvb3BSZWYgcmw7Ci0JUHlUaHJlYWRTdGF0ZSAqKnBfdHN0YXRlOyAgLyogZm9yIHVzZSBpbiB0aGUgaW5mbyBmaWVsZCAqLwotCUNGUnVuTG9vcE9ic2VydmVyQ29udGV4dCBjb250ZXh0ID0gezAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEx9OwotCUNGUnVuTG9vcE9ic2VydmVyUmVmIG9ic2VydmVyOworICAgIFB5T2JqZWN0ICp0c3RhdGVfZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIFB5T2JqZWN0ICp2OworICAgIENGUnVuTG9vcFJlZiBybDsKKyAgICBQeVRocmVhZFN0YXRlICoqcF90c3RhdGU7ICAvKiBmb3IgdXNlIGluIHRoZSBpbmZvIGZpZWxkICovCisgICAgQ0ZSdW5Mb29wT2JzZXJ2ZXJDb250ZXh0IGNvbnRleHQgPSB7MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07CisgICAgQ0ZSdW5Mb29wT2JzZXJ2ZXJSZWYgb2JzZXJ2ZXI7CiAKLQlpZiAodHN0YXRlX2RpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHRzdGF0ZV9kaWN0LCAiYXV0b0dJTC5JbnN0YWxsZWRBdXRvR0lMIik7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQkvKiB3ZSd2ZSBhbHJlYWR5IGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICBpZiAodHN0YXRlX2RpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHRzdGF0ZV9kaWN0LCAiYXV0b0dJTC5JbnN0YWxsZWRBdXRvR0lMIik7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICAvKiB3ZSd2ZSBhbHJlYWR5IGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAotCXJsID0gQ0ZSdW5Mb29wR2V0Q3VycmVudCgpOwotCWlmIChybCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhBdXRvR0lMRXJyb3IsCi0JCQkJImNhbid0IGdldCBydW4gbG9vcCBmb3IgY3VycmVudCB0aHJlYWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJsID0gQ0ZSdW5Mb29wR2V0Q3VycmVudCgpOworICAgIGlmIChybCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdXRvR0lMRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZ2V0IHJ1biBsb29wIGZvciBjdXJyZW50IHRocmVhZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwX3RzdGF0ZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlUaHJlYWRTdGF0ZSAqKSk7Ci0JaWYgKHBfdHN0YXRlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJCSJub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSAiCi0JCQkJInRzdGF0ZSBwb2ludGVyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkqcF90c3RhdGUgPSBOVUxMOwotCWNvbnRleHQuaW5mbyA9ICh2b2lkICopcF90c3RhdGU7Ci0JY29udGV4dC5yZWxlYXNlID0gaW5mb1JlbGVhc2U7CisgICAgcF90c3RhdGUgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5VGhyZWFkU3RhdGUgKikpOworICAgIGlmIChwX3RzdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAidHN0YXRlIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICpwX3RzdGF0ZSA9IE5VTEw7CisgICAgY29udGV4dC5pbmZvID0gKHZvaWQgKilwX3RzdGF0ZTsKKyAgICBjb250ZXh0LnJlbGVhc2UgPSBpbmZvUmVsZWFzZTsKIAotCW9ic2VydmVyID0gQ0ZSdW5Mb29wT2JzZXJ2ZXJDcmVhdGUoCi0JCU5VTEwsCi0JCWtDRlJ1bkxvb3BCZWZvcmVXYWl0aW5nIHwga0NGUnVuTG9vcEFmdGVyV2FpdGluZywKLQkJMSwgMCwgYXV0b0dJTENhbGxiYWNrLCAmY29udGV4dCk7Ci0JaWYgKG9ic2VydmVyID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1dG9HSUxFcnJvciwKLQkJCQkiY2FuJ3QgY3JlYXRlIGV2ZW50IGxvb3Agb2JzZXJ2ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUNGUnVuTG9vcEFkZE9ic2VydmVyKHJsLCBvYnNlcnZlciwga0NGUnVuTG9vcERlZmF1bHRNb2RlKTsKLQkvKiBYWFggaG93IHRvIGNoZWNrIGZvciBlcnJvcnM/ICovCisgICAgb2JzZXJ2ZXIgPSBDRlJ1bkxvb3BPYnNlcnZlckNyZWF0ZSgKKyAgICAgICAgTlVMTCwKKyAgICAgICAga0NGUnVuTG9vcEJlZm9yZVdhaXRpbmcgfCBrQ0ZSdW5Mb29wQWZ0ZXJXYWl0aW5nLAorICAgICAgICAxLCAwLCBhdXRvR0lMQ2FsbGJhY2ssICZjb250ZXh0KTsKKyAgICBpZiAob2JzZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXV0b0dJTEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGNyZWF0ZSBldmVudCBsb29wIG9ic2VydmVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBDRlJ1bkxvb3BBZGRPYnNlcnZlcihybCwgb2JzZXJ2ZXIsIGtDRlJ1bkxvb3BEZWZhdWx0TW9kZSk7CisgICAgLyogWFhYIGhvdyB0byBjaGVjayBmb3IgZXJyb3JzPyAqLwogCi0JLyogcmVnaXN0ZXIgdGhhdCB3ZSBoYXZlIGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0c3RhdGVfZGljdCwgImF1dG9HSUwuSW5zdGFsbGVkQXV0b0dJTCIsCi0JCQkJIFB5X05vbmUpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogcmVnaXN0ZXIgdGhhdCB3ZSBoYXZlIGluc3RhbGxlZCBhIGNhbGxiYWNrIGZvciB0aGlzIHRocmVhZCAqLworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0c3RhdGVfZGljdCwgImF1dG9HSUwuSW5zdGFsbGVkQXV0b0dJTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoYXV0b0dJTF9pbnN0YWxsQXV0b0dJTF9kb2MsCkBAIC0xMTQsMTMgKzExNCwxMyBAQAogKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGF1dG9HSUxfbWV0aG9kc1tdID0gewotCXsKLQkJImluc3RhbGxBdXRvR0lMIiwKLQkJKFB5Q0Z1bmN0aW9uKWF1dG9HSUxfaW5zdGFsbEF1dG9HSUwsCi0JCU1FVEhfTk9BUkdTLAotCQlhdXRvR0lMX2luc3RhbGxBdXRvR0lMX2RvYwotCX0sCi0JeyAwLCAwLCAwLCAwIH0gLyogc2VudGluZWwgKi8KKyAgICB7CisgICAgICAgICJpbnN0YWxsQXV0b0dJTCIsCisgICAgICAgIChQeUNGdW5jdGlvbilhdXRvR0lMX2luc3RhbGxBdXRvR0lMLAorICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgICAgYXV0b0dJTF9pbnN0YWxsQXV0b0dJTF9kb2MKKyAgICB9LAorICAgIHsgMCwgMCwgMCwgMCB9IC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoYXV0b0dJTF9kb2NzLApAQCAtMTMyLDIxICsxMzIsMjEgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0YXV0b0dJTCh2b2lkKQogewotCVB5T2JqZWN0ICptb2Q7CisgICAgUHlPYmplY3QgKm1vZDsKIAotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCB0aGUgYXV0b0dJTCBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgdGhlIGF1dG9HSUwgbW9kdWxlIGlzIHJlbW92ZWQuIiwgMSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltb2QgPSBQeV9Jbml0TW9kdWxlNCgiYXV0b0dJTCIsIGF1dG9HSUxfbWV0aG9kcywgYXV0b0dJTF9kb2NzLAotCQkJICAgICBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtb2QgPT0gTlVMTCkKLQkJcmV0dXJuOwotCUF1dG9HSUxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYXV0b0dJTC5BdXRvR0lMRXJyb3IiLAotCQkJCQkgIFB5RXhjX0V4Y2VwdGlvbiwgTlVMTCk7Ci0JaWYgKEF1dG9HSUxFcnJvciA9PSBOVUxMKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKEF1dG9HSUxFcnJvcik7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2QsICJBdXRvR0lMRXJyb3IiLAotCQkJICAgICAgIEF1dG9HSUxFcnJvcikgPCAwKQotCQlyZXR1cm47CisgICAgbW9kID0gUHlfSW5pdE1vZHVsZTQoImF1dG9HSUwiLCBhdXRvR0lMX21ldGhvZHMsIGF1dG9HSUxfZG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIEF1dG9HSUxFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYXV0b0dJTC5BdXRvR0lMRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19FeGNlcHRpb24sIE5VTEwpOworICAgIGlmIChBdXRvR0lMRXJyb3IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRihBdXRvR0lMRXJyb3IpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kLCAiQXV0b0dJTEVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9HSUxFcnJvcikgPCAwKQorICAgICAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYwppbmRleCA2NmU0ZTI3Li40OWU5NDhhIDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2NhcmJvbmV2dC9fQ2FyYm9uRXZ0bW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zMCwxNyArMzAsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCoKIEV2ZW50VHlwZVNwZWNfTmV3KEV2ZW50VHlwZVNwZWMgKmluKQogewotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCBpbi0+ZXZlbnRDbGFzcywgaW4tPmV2ZW50S2luZCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgaW4tPmV2ZW50Q2xhc3MsIGluLT5ldmVudEtpbmQpOwogfQogCiBzdGF0aWMgaW50CiBFdmVudFR5cGVTcGVjX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50VHlwZVNwZWMgKm91dCkKIHsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICYob3V0LT5ldmVudENsYXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICYob3V0LT5ldmVudEtpbmQpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJihvdXQtPmV2ZW50Q2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAmKG91dC0+ZXZlbnRLaW5kKSkpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOwogfQogCiAvKioqKioqKioqKiBlbmQgRXZlbnRUeXBlU3BlYyAqKioqKioqLwpAQCAtNTEsMTUgKzUxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QqCiBISVBvaW50X05ldyhISVBvaW50ICppbikKIHsKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImZmIiwgaW4tPngsIGluLT55KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZmYiLCBpbi0+eCwgaW4tPnkpOwogfQogCiBzdGF0aWMgaW50CiBISVBvaW50X0NvbnZlcnQoUHlPYmplY3QgKnYsIEhJUG9pbnQgKm91dCkKIHsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImZmIiwgJihvdXQtPngpLCAmKG91dC0+eSkpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAiZmYiLCAmKG91dC0+eCksICYob3V0LT55KSkpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiBOVUxMOwogfQogI2VuZGlmCiAKQEAgLTcwLDE1ICs3MCwxNSBAQAogc3RhdGljIFB5T2JqZWN0KgogRXZlbnRIb3RLZXlJRF9OZXcoRXZlbnRIb3RLZXlJRCAqaW4pCiB7Ci0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIGluLT5zaWduYXR1cmUsIGluLT5pZCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgaW4tPnNpZ25hdHVyZSwgaW4tPmlkKTsKIH0KIAogc3RhdGljIGludAogRXZlbnRIb3RLZXlJRF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudEhvdEtleUlEICpvdXQpCiB7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJsbCIsICZvdXQtPnNpZ25hdHVyZSwgJm91dC0+aWQpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAibGwiLCAmb3V0LT5zaWduYXR1cmUsICZvdXQtPmlkKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqIGVuZCBFdmVudEhvdEtleUlEICoqKioqKiovCkBAIC04OSwyNyArODksMjcgQEAKIAogc3RhdGljIHBhc2NhbCBPU1N0YXR1cwogbXlFdmVudEhhbmRsZXIoRXZlbnRIYW5kbGVyQ2FsbFJlZiBoYW5kbGVyUmVmLCBFdmVudFJlZiBldmVudCwgdm9pZCAqb3V0UHlPYmplY3QpIHsKLSAgICAgICAgUHlPYmplY3QgKnJldFZhbHVlOwotICAgICAgICBpbnQgc3RhdHVzOworICAgIFB5T2JqZWN0ICpyZXRWYWx1ZTsKKyAgICBpbnQgc3RhdHVzOwogCi0gICAgICAgIHJldFZhbHVlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKW91dFB5T2JqZWN0LCAiTyZPJiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlckNhbGxSZWZfTmV3LCBoYW5kbGVyUmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9OZXcsIGV2ZW50KTsKLSAgICAgICAgaWYgKHJldFZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXJyb3IgaW4gZXZlbnQgaGFuZGxlciBjYWxsYmFjazpcbiIpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7ICAvKiB0aGlzIGFsc28gY2xlYXJzIHRoZSBlcnJvciAqLwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG5vRXJyOyAvKiBjb21wbGFpbj8gaG93PyAqLwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChyZXRWYWx1ZSA9PSBQeV9Ob25lKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbm9FcnI7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2socmV0VmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQeUludF9Bc0xvbmcocmV0VmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gbm9FcnI7IC8qIHdyb25nIG9iamVjdCB0eXBlLCBjb21wbGFpbj8gKi8KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmV0VmFsdWUpOwotICAgICAgICB9CisgICAgcmV0VmFsdWUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopb3V0UHlPYmplY3QsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhhbmRsZXJDYWxsUmVmX05ldywgaGFuZGxlclJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9OZXcsIGV2ZW50KTsKKyAgICBpZiAocmV0VmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXJyb3IgaW4gZXZlbnQgaGFuZGxlciBjYWxsYmFjazpcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOyAgLyogdGhpcyBhbHNvIGNsZWFycyB0aGUgZXJyb3IgKi8KKyAgICAgICAgc3RhdHVzID0gbm9FcnI7IC8qIGNvbXBsYWluPyBob3c/ICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJldFZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICBzdGF0dXMgPSBub0VycjsKKyAgICAgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2socmV0VmFsdWUpKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBQeUludF9Bc0xvbmcocmV0VmFsdWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHN0YXR1cyA9IG5vRXJyOyAvKiB3cm9uZyBvYmplY3QgdHlwZSwgY29tcGxhaW4/ICovCisgICAgICAgIFB5X0RFQ1JFRihyZXRWYWx1ZSk7CisgICAgfQogCi0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqKioqKioqIGVuZCBteUV2ZW50SGFuZGxlciAqKioqKioqKioqKi8KQEAgLTEyNCwyNjggKzEyNCwyNjggQEAKICNkZWZpbmUgRXZlbnRSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRXZlbnRSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBFdmVudFJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRSZWZfTmV3KEV2ZW50UmVmIGl0c2VsZikKIHsKLQlFdmVudFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRSZWZPYmplY3QsICZFdmVudFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50UmVmT2JqZWN0LCAmRXZlbnRSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRSZWYgKnBfaXRzZWxmKQogewotCWlmICghRXZlbnRSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRXZlbnRSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBFdmVudFJlZl9kZWFsbG9jKEV2ZW50UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9SZXRhaW5FdmVudChFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZXRhaW5FdmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZXRhaW5FdmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9HZXRFdmVudFJldGFpbkNvdW50KEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRFdmVudFJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRFdmVudFJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX1JlbGVhc2VFdmVudChFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVJlbGVhc2VFdmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZWxlYXNlRXZlbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX1NldEV2ZW50UGFyYW1ldGVyKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBpbk5hbWU7Ci0JT1NUeXBlIGluVHlwZTsKLQljaGFyICppbkRhdGFQdHJfX2luX187Ci0JbG9uZyBpbkRhdGFQdHJfX2xlbl9fOwotCWludCBpbkRhdGFQdHJfX2luX2xlbl9fOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EYXRhUHRyX19pbl9fLCAmaW5EYXRhUHRyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWluRGF0YVB0cl9fbGVuX18gPSBpbkRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBTZXRFdmVudFBhcmFtZXRlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5EYXRhUHRyX19sZW5fXywgaW5EYXRhUHRyX19pbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgaW5OYW1lOworICAgIE9TVHlwZSBpblR5cGU7CisgICAgY2hhciAqaW5EYXRhUHRyX19pbl9fOworICAgIGxvbmcgaW5EYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgaW5EYXRhUHRyX19pbl9sZW5fXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGF0YVB0cl9faW5fXywgJmluRGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbkRhdGFQdHJfX2xlbl9fID0gaW5EYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gU2V0RXZlbnRQYXJhbWV0ZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGF0YVB0cl9fbGVuX18sIGluRGF0YVB0cl9faW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfR2V0RXZlbnRDbGFzcyhFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RXZlbnRDbGFzcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RXZlbnRDbGFzcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9HZXRFdmVudEtpbmQoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEV2ZW50S2luZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RXZlbnRLaW5kKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0dldEV2ZW50VGltZShFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZG91YmxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RXZlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBkb3VibGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRFdmVudFRpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfU2V0RXZlbnRUaW1lKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWRvdWJsZSBpblRpbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RXZlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpblRpbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGRvdWJsZSBpblRpbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RXZlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpblRpbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0lzVXNlckNhbmNlbEV2ZW50UmVmKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNVc2VyQ2FuY2VsRXZlbnRSZWYoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1VzZXJDYW5jZWxFdmVudFJlZihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9Db252ZXJ0RXZlbnRSZWZUb0V2ZW50UmVjb3JkKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCBvdXRFdmVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJm91dEV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWNvcmQgb3V0RXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZvdXRFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfSXNFdmVudEluTWFzayhFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JVUludDE2IGluTWFzazsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzRXZlbnRJbk1hc2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGluTWFzayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFVJbnQxNiBpbk1hc2s7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0V2ZW50SW5NYXNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbk1hc2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX1NlbmRFdmVudFRvRXZlbnRUYXJnZXQoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9Db252ZXJ0LCAmaW5UYXJnZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2VuZEV2ZW50VG9FdmVudFRhcmdldChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFyZ2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBFdmVudFRhcmdldFJlZiBpblRhcmdldDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpblRhcmdldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZW5kRXZlbnRUb0V2ZW50VGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYXJnZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0dldEV2ZW50UGFyYW1ldGVyKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlVSW50MzIgYnVmZmVyU2l6ZTsKLQlFdmVudFBhcmFtTmFtZSBpbk5hbWU7Ci0JRXZlbnRQYXJhbVR5cGUgaW5UeXBlOwotCU9TRXJyIF9lcnI7Ci0Jdm9pZCAqIGJ1ZmZlcjsKKyAgICBVSW50MzIgYnVmZmVyU2l6ZTsKKyAgICBFdmVudFBhcmFtTmFtZSBpbk5hbWU7CisgICAgRXZlbnRQYXJhbVR5cGUgaW5UeXBlOworICAgIE9TRXJyIF9lcnI7CisgICAgdm9pZCAqIGJ1ZmZlcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLCBQeU1hY19HZXRPU1R5cGUsICZpbk5hbWUsIFB5TWFjX0dldE9TVHlwZSwgJmluVHlwZSkpCi0JICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsIFB5TWFjX0dldE9TVHlwZSwgJmluTmFtZSwgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlKSkKKyAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEZpZ3VyZSBvdXQgdGhlIHNpemUgYnkgcGFzc2luZyBhIG51bGwgYnVmZmVyIHRvIEdldEV2ZW50UGFyYW1ldGVyICovCi0JX2VyciA9IEdldEV2ZW50UGFyYW1ldGVyKF9zZWxmLT5vYl9pdHNlbGYsIGluTmFtZSwgaW5UeXBlLCBOVUxMLCAwLCAmYnVmZmVyU2l6ZSwgTlVMTCk7CisgICAgLyogRmlndXJlIG91dCB0aGUgc2l6ZSBieSBwYXNzaW5nIGEgbnVsbCBidWZmZXIgdG8gR2V0RXZlbnRQYXJhbWV0ZXIgKi8KKyAgICBfZXJyID0gR2V0RXZlbnRQYXJhbWV0ZXIoX3NlbGYtPm9iX2l0c2VsZiwgaW5OYW1lLCBpblR5cGUsIE5VTEwsIDAsICZidWZmZXJTaXplLCBOVUxMKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgYnVmZmVyU2l6ZSk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKQotCSAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JX2VyciA9IEdldEV2ZW50UGFyYW1ldGVyKF9zZWxmLT5vYl9pdHNlbGYsIGluTmFtZSwgaW5UeXBlLCBOVUxMLCBidWZmZXJTaXplLCBOVUxMLCBidWZmZXIpOworICAgIF9lcnIgPSBHZXRFdmVudFBhcmFtZXRlcihfc2VsZi0+b2JfaXRzZWxmLCBpbk5hbWUsIGluVHlwZSwgTlVMTCwgYnVmZmVyU2l6ZSwgTlVMTCwgYnVmZmVyKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JICAgICAgUHlNZW1fREVMKGJ1ZmZlcik7Ci0JICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIGJ1ZmZlclNpemUpOwotCVB5TWVtX0RFTChidWZmZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgUHlNZW1fREVMKGJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIGJ1ZmZlclNpemUpOworICAgIFB5TWVtX0RFTChidWZmZXIpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudFJlZl9tZXRob2RzW10gPSB7Ci0JeyJSZXRhaW5FdmVudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9SZXRhaW5FdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRSZWYgX3J2KSIpfSwKLQl7IkdldEV2ZW50UmV0YWluQ291bnQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRSZXRhaW5Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJSZWxlYXNlRXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfUmVsZWFzZUV2ZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTZXRFdmVudFBhcmFtZXRlciIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9TZXRFdmVudFBhcmFtZXRlciwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGluTmFtZSwgT1NUeXBlIGluVHlwZSwgQnVmZmVyIGluRGF0YVB0cikgLT4gTm9uZSIpfSwKLQl7IkdldEV2ZW50Q2xhc3MiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJHZXRFdmVudEtpbmQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRLaW5kLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKLQl7IkdldEV2ZW50VGltZSIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAotCXsiU2V0RXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1NldEV2ZW50VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoZG91YmxlIGluVGltZSkgLT4gTm9uZSIpfSwKLQl7IklzVXNlckNhbmNlbEV2ZW50UmVmIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0lzVXNlckNhbmNlbEV2ZW50UmVmLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDb252ZXJ0RXZlbnRSZWZUb0V2ZW50UmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0NvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCBvdXRFdmVudCkiKX0sCi0JeyJJc0V2ZW50SW5NYXNrIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0lzRXZlbnRJbk1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQxNiBpbk1hc2spIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZW5kRXZlbnRUb0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1NlbmRFdmVudFRvRXZlbnRUYXJnZXQsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0KSAtPiBOb25lIil9LAotCXsiR2V0RXZlbnRQYXJhbWV0ZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRQYXJhbWV0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UGFyYW1OYW1lIGV2ZW50TmFtZSwgRXZlbnRQYXJhbVR5cGUgZXZlbnRUeXBlKSAtPiAoU3RyaW5nIGV2ZW50UGFyYW1EYXRhKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlJldGFpbkV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1JldGFpbkV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudFJlZiBfcnYpIil9LAorICAgIHsiR2V0RXZlbnRSZXRhaW5Db3VudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFJldGFpbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IlJlbGVhc2VFdmVudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9SZWxlYXNlRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEV2ZW50UGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1NldEV2ZW50UGFyYW1ldGVyLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgaW5OYW1lLCBPU1R5cGUgaW5UeXBlLCBCdWZmZXIgaW5EYXRhUHRyKSAtPiBOb25lIil9LAorICAgIHsiR2V0RXZlbnRDbGFzcyIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudENsYXNzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IkdldEV2ZW50S2luZCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudEtpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiR2V0RXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0dldEV2ZW50VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCisgICAgeyJTZXRFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfU2V0RXZlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihkb3VibGUgaW5UaW1lKSAtPiBOb25lIil9LAorICAgIHsiSXNVc2VyQ2FuY2VsRXZlbnRSZWYiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfSXNVc2VyQ2FuY2VsRXZlbnRSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIG91dEV2ZW50KSIpfSwKKyAgICB7IklzRXZlbnRJbk1hc2siLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfSXNFdmVudEluTWFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDE2IGluTWFzaykgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNlbmRFdmVudFRvRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfU2VuZEV2ZW50VG9FdmVudFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRFdmVudFBhcmFtZXRlciIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFBhcmFtZXRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRQYXJhbU5hbWUgZXZlbnROYW1lLCBFdmVudFBhcmFtVHlwZSBldmVudFR5cGUpIC0+IChTdHJpbmcgZXZlbnRQYXJhbURhdGEpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudFJlZl9nZXRzZXRsaXN0IE5VTEwKQEAgLTQwMiw2MSArNDAyLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUV2ZW50UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChFdmVudFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEV2ZW50UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIEV2ZW50UmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50UmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NhcmJvbkV2dC5FdmVudFJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEV2ZW50UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRXZlbnRSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEV2ZW50UmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudFJlZl9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlFdmVudFJlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlFdmVudFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRXZlbnRSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRXZlbnRSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NhcmJvbkV2dC5FdmVudFJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEV2ZW50UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRXZlbnRSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEV2ZW50UmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudFJlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBFdmVudFJlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBFdmVudFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRXZlbnRSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRXZlbnRSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ2OSwxNDQgKzQ2OSwxNDQgQEAKICNkZWZpbmUgRXZlbnRRdWV1ZVJlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZFdmVudFF1ZXVlUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50UXVldWVSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50UXVldWVSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlFdmVudFF1ZXVlUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRXZlbnRRdWV1ZVJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50UXVldWVSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX05ldyhFdmVudFF1ZXVlUmVmIGl0c2VsZikKIHsKLQlFdmVudFF1ZXVlUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudFF1ZXVlUmVmT2JqZWN0LCAmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRRdWV1ZVJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRRdWV1ZVJlZk9iamVjdCwgJkV2ZW50UXVldWVSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRRdWV1ZVJlZl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudFF1ZXVlUmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50UXVldWVSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRRdWV1ZVJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChFdmVudFF1ZXVlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50UXVldWVSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRRdWV1ZVJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChFdmVudFF1ZXVlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRRdWV1ZVJlZl9kZWFsbG9jKEV2ZW50UXVldWVSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfUG9zdEV2ZW50VG9RdWV1ZShFdmVudFF1ZXVlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUV2ZW50UmVmIGluRXZlbnQ7Ci0JU0ludDE2IGluUHJpb3JpdHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfQ29udmVydCwgJmluRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblByaW9yaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBvc3RFdmVudFRvUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUHJpb3JpdHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgU0ludDE2IGluUHJpb3JpdHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfQ29udmVydCwgJmluRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblByaW9yaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBvc3RFdmVudFRvUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJpb3JpdHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5OdW1UeXBlczsKLQlFdmVudFR5cGVTcGVjIGluTGlzdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZsdXNoRXZlbnRzTWF0Y2hpbmdMaXN0RnJvbVF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbk51bVR5cGVzOworICAgIEV2ZW50VHlwZVNwZWMgaW5MaXN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpbkxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRRdWV1ZVJlZl9GbHVzaEV2ZW50UXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZsdXNoRXZlbnRRdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZsdXNoRXZlbnRRdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX0dldE51bUV2ZW50c0luUXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TnVtRXZlbnRzSW5RdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TnVtRXZlbnRzSW5RdWV1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX1JlbW92ZUV2ZW50RnJvbVF1ZXVlKEV2ZW50UXVldWVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRSZWYgaW5FdmVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX0NvbnZlcnQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUV2ZW50RnJvbVF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXZlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVFdmVudEZyb21RdWV1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX0lzRXZlbnRJblF1ZXVlKEV2ZW50UXVldWVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVmIGluRXZlbnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzRXZlbnRJblF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5FdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzRXZlbnRJblF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5FdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudFF1ZXVlUmVmX21ldGhvZHNbXSA9IHsKLQl7IlBvc3RFdmVudFRvUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9Qb3N0RXZlbnRUb1F1ZXVlLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlZiBpbkV2ZW50LCBTSW50MTYgaW5Qcmlvcml0eSkgLT4gTm9uZSIpfSwKLQl7IkZsdXNoRXZlbnRzTWF0Y2hpbmdMaXN0RnJvbVF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCkgLT4gTm9uZSIpfSwKLQl7IkZsdXNoRXZlbnRRdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0ZsdXNoRXZlbnRRdWV1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0TnVtRXZlbnRzSW5RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0dldE51bUV2ZW50c0luUXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiUmVtb3ZlRXZlbnRGcm9tUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9SZW1vdmVFdmVudEZyb21RdWV1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCkgLT4gTm9uZSIpfSwKLQl7IklzRXZlbnRJblF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfSXNFdmVudEluUXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJQb3N0RXZlbnRUb1F1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfUG9zdEV2ZW50VG9RdWV1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCwgU0ludDE2IGluUHJpb3JpdHkpIC0+IE5vbmUiKX0sCisgICAgeyJGbHVzaEV2ZW50c01hdGNoaW5nTGlzdEZyb21RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0ZsdXNoRXZlbnRzTWF0Y2hpbmdMaXN0RnJvbVF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaW5OdW1UeXBlcywgRXZlbnRUeXBlU3BlYyBpbkxpc3QpIC0+IE5vbmUiKX0sCisgICAgeyJGbHVzaEV2ZW50UXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9GbHVzaEV2ZW50UXVldWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE51bUV2ZW50c0luUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9HZXROdW1FdmVudHNJblF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IlJlbW92ZUV2ZW50RnJvbVF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfUmVtb3ZlRXZlbnRGcm9tUXVldWUsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJJc0V2ZW50SW5RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0lzRXZlbnRJblF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlZiBpbkV2ZW50KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudFF1ZXVlUmVmX2dldHNldGxpc3QgTlVMTApAQCAtNjIzLDYxICs2MjMsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudFF1ZXVlUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRRdWV1ZVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFF1ZXVlUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRRdWV1ZVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFF1ZXVlUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRRdWV1ZVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudFF1ZXVlUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50UXVldWVSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50UXVldWVSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudFF1ZXVlUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRRdWV1ZVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudFF1ZXVlUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudFF1ZXVlUmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudFF1ZXVlUmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50UXVldWVSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRRdWV1ZVJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudFF1ZXVlUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudFF1ZXVlUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50UXVldWVSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudFF1ZXVlUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50UXVldWVSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudFF1ZXVlUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRRdWV1ZVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudFF1ZXVlUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudFF1ZXVlUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudFF1ZXVlUmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50UXVldWVSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRRdWV1ZVJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudFF1ZXVlUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudFF1ZXVlUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50UXVldWVSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudFF1ZXVlUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudFF1ZXVlUmVmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNjkwLDUzICs2OTAsNTMgQEAKICNkZWZpbmUgRXZlbnRMb29wUmVmX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkV2ZW50TG9vcFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudExvb3BSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50TG9vcFJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUV2ZW50TG9vcFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50TG9vcFJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50TG9vcFJlZk9iamVjdDsKIAogUHlPYmplY3QgKkV2ZW50TG9vcFJlZl9OZXcoRXZlbnRMb29wUmVmIGl0c2VsZikKIHsKLQlFdmVudExvb3BSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEV2ZW50TG9vcFJlZk9iamVjdCwgJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRMb29wUmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudExvb3BSZWZPYmplY3QsICZFdmVudExvb3BSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRMb29wUmVmX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50TG9vcFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudExvb3BSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRMb29wUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEV2ZW50TG9vcFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudExvb3BSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRMb29wUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEV2ZW50TG9vcFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50TG9vcFJlZl9kZWFsbG9jKEV2ZW50TG9vcFJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRMb29wUmVmX1F1aXRFdmVudExvb3AoRXZlbnRMb29wUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUXVpdEV2ZW50TG9vcChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFF1aXRFdmVudExvb3AoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudExvb3BSZWZfbWV0aG9kc1tdID0gewotCXsiUXVpdEV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilFdmVudExvb3BSZWZfUXVpdEV2ZW50TG9vcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUXVpdEV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilFdmVudExvb3BSZWZfUXVpdEV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudExvb3BSZWZfZ2V0c2V0bGlzdCBOVUxMCkBAIC03NTMsNjEgKzc1Myw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50TG9vcFJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRMb29wUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRMb29wUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50TG9vcFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50TG9vcFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudExvb3BSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudExvb3BSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRMb29wUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50TG9vcFJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRMb29wUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRMb29wUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRMb29wUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50TG9vcFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRMb29wUmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudExvb3BSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRMb29wUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50TG9vcFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudExvb3BSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50TG9vcFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudExvb3BSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudExvb3BSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRMb29wUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRMb29wUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRMb29wUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50TG9vcFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRMb29wUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudExvb3BSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRMb29wUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50TG9vcFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudExvb3BSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50TG9vcFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudExvb3BSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudExvb3BSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudExvb3BSZWYgLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MjAsNzEgKzgyMCw3MSBAQAogI2RlZmluZSBFdmVudExvb3BUaW1lclJlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZFdmVudExvb3BUaW1lclJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudExvb3BUaW1lclJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRXZlbnRMb29wVGltZXJSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlFdmVudExvb3BUaW1lclJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50TG9vcFRpbWVyUmVmIG9iX2l0c2VsZjsKIH0gRXZlbnRMb29wVGltZXJSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudExvb3BUaW1lclJlZl9OZXcoRXZlbnRMb29wVGltZXJSZWYgaXRzZWxmKQogewotCUV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudExvb3BUaW1lclJlZk9iamVjdCwgJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBFdmVudExvb3BUaW1lclJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRMb29wVGltZXJSZWZPYmplY3QsICZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBFdmVudExvb3BUaW1lclJlZl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudExvb3BUaW1lclJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudExvb3BUaW1lclJlZl9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudExvb3BUaW1lclJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChFdmVudExvb3BUaW1lclJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudExvb3BUaW1lclJlZl9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudExvb3BUaW1lclJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChFdmVudExvb3BUaW1lclJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50TG9vcFRpbWVyUmVmX2RlYWxsb2MoRXZlbnRMb29wVGltZXJSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50TG9vcFRpbWVyUmVmX1JlbW92ZUV2ZW50TG9vcFRpbWVyKEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRXZlbnRMb29wVGltZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVFdmVudExvb3BUaW1lcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudExvb3BUaW1lclJlZl9TZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZShFdmVudExvb3BUaW1lclJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlkb3VibGUgaW5OZXh0RmlyZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTmV4dEZpcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RXZlbnRMb29wVGltZXJOZXh0RmlyZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OZXh0RmlyZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgZG91YmxlIGluTmV4dEZpcmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5leHRGaXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmV4dEZpcmUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZlbnRMb29wVGltZXJSZWZfbWV0aG9kc1tdID0gewotCXsiUmVtb3ZlRXZlbnRMb29wVGltZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRMb29wVGltZXJSZWZfUmVtb3ZlRXZlbnRMb29wVGltZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50TG9vcFRpbWVyUmVmX1NldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lLCAxLAotCSBQeURvY19TVFIoIihkb3VibGUgaW5OZXh0RmlyZSkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlJlbW92ZUV2ZW50TG9vcFRpbWVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50TG9vcFRpbWVyUmVmX1JlbW92ZUV2ZW50TG9vcFRpbWVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZSIsIChQeUNGdW5jdGlvbilFdmVudExvb3BUaW1lclJlZl9TZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZG91YmxlIGluTmV4dEZpcmUpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50TG9vcFRpbWVyUmVmX2dldHNldGxpc3QgTlVMTApAQCAtOTAxLDYxICs5MDEsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudExvb3BUaW1lclJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRMb29wVGltZXJSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBFdmVudExvb3BUaW1lclJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudExvb3BUaW1lclJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50TG9vcFRpbWVyUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRMb29wVGltZXJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRMb29wVGltZXJSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRXZlbnRMb29wVGltZXJSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50TG9vcFRpbWVyUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRMb29wVGltZXJSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBFdmVudExvb3BUaW1lclJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudExvb3BUaW1lclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRMb29wVGltZXJSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEV2ZW50TG9vcFRpbWVyUmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50TG9vcFRpbWVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50TG9vcFRpbWVyUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUV2ZW50TG9vcFRpbWVyUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudExvb3BUaW1lclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudExvb3BUaW1lclJlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUV2ZW50TG9vcFRpbWVyUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50TG9vcFRpbWVyUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRMb29wVGltZXJSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBFdmVudExvb3BUaW1lclJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudExvb3BUaW1lclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRMb29wVGltZXJSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEV2ZW50TG9vcFRpbWVyUmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudExvb3BUaW1lclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudExvb3BUaW1lclJlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRMb29wVGltZXJSZWYgLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtOTY4LDExNiArOTY4LDExNiBAQAogI2RlZmluZSBFdmVudEhhbmRsZXJSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRIYW5kbGVyUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50SGFuZGxlclJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRXZlbnRIYW5kbGVyUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRIYW5kbGVyUmVmIG9iX2l0c2VsZjsKLQlQeU9iamVjdCAqb2JfY2FsbGJhY2s7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50SGFuZGxlclJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3QgKm9iX2NhbGxiYWNrOwogfSBFdmVudEhhbmRsZXJSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJSZWZfTmV3KEV2ZW50SGFuZGxlclJlZiBpdHNlbGYpCiB7Ci0JRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudEhhbmRsZXJSZWZPYmplY3QsICZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudEhhbmRsZXJSZWZPYmplY3QsICZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBFdmVudEhhbmRsZXJSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRIYW5kbGVyUmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50SGFuZGxlclJlZl9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudEhhbmRsZXJSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50SGFuZGxlclJlZl9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudEhhbmRsZXJSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRIYW5kbGVyUmVmX2RlYWxsb2MoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9pdHNlbGYgIT0gTlVMTCkgewotCQlSZW1vdmVFdmVudEhhbmRsZXIoc2VsZi0+b2JfaXRzZWxmKTsKLQkJUHlfREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrKTsKLQl9Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfaXRzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgUmVtb3ZlRXZlbnRIYW5kbGVyKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5vYl9jYWxsYmFjayk7CisgICAgfQorICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIYW5kbGVyUmVmX0FkZEV2ZW50VHlwZXNUb0hhbmRsZXIoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpbk51bVR5cGVzOwotCUV2ZW50VHlwZVNwZWMgaW5MaXN0OwotCWlmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRFdmVudFR5cGVzVG9IYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5OdW1UeXBlczsKKyAgICBFdmVudFR5cGVTcGVjIGluTGlzdDsKKyAgICBpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDYXJib25FdmVudHNfRXJyb3IsICJIYW5kbGVyIGhhcyBiZWVuIHJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpbkxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkRXZlbnRUeXBlc1RvSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTGlzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIYW5kbGVyUmVmX1JlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlcihFdmVudEhhbmRsZXJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluTnVtVHlwZXM7Ci0JRXZlbnRUeXBlU3BlYyBpbkxpc3Q7Ci0JaWYgKF9zZWxmLT5vYl9pdHNlbGYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbk51bVR5cGVzOworICAgIEV2ZW50VHlwZVNwZWMgaW5MaXN0OworICAgIGlmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVFdmVudFR5cGVzRnJvbUhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJSZWZfUmVtb3ZlRXZlbnRIYW5kbGVyKEV2ZW50SGFuZGxlclJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NTdGF0dXMgX2VycjsKLQlpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JUHlfREVDUkVGKF9zZWxmLT5vYl9jYWxsYmFjayk7Ci0JX3NlbGYtPm9iX2NhbGxiYWNrID0gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDYXJib25FdmVudHNfRXJyb3IsICJIYW5kbGVyIGhhcyBiZWVuIHJlbW92ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgUHlfREVDUkVGKF9zZWxmLT5vYl9jYWxsYmFjayk7CisgICAgX3NlbGYtPm9iX2NhbGxiYWNrID0gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudEhhbmRsZXJSZWZfbWV0aG9kc1tdID0gewotCXsiQWRkRXZlbnRUeXBlc1RvSGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudEhhbmRsZXJSZWZfQWRkRXZlbnRUeXBlc1RvSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0KSAtPiBOb25lIil9LAotCXsiUmVtb3ZlRXZlbnRUeXBlc0Zyb21IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9SZW1vdmVFdmVudFR5cGVzRnJvbUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCkgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZUV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudEhhbmRsZXJSZWZfUmVtb3ZlRXZlbnRIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJBZGRFdmVudFR5cGVzVG9IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9BZGRFdmVudFR5cGVzVG9IYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaW5OdW1UeXBlcywgRXZlbnRUeXBlU3BlYyBpbkxpc3QpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVFdmVudFR5cGVzRnJvbUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRIYW5kbGVyUmVmX1JlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0KSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9SZW1vdmVFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgRXZlbnRIYW5kbGVyUmVmX2dldHNldGxpc3QgTlVMTApAQCAtMTA5NCw2MSArMTA5NCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50SGFuZGxlclJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRIYW5kbGVyUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRIYW5kbGVyUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50SGFuZGxlclJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50SGFuZGxlclJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudEhhbmRsZXJSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudEhhbmRsZXJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRIYW5kbGVyUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50SGFuZGxlclJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRIYW5kbGVyUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRIYW5kbGVyUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRIYW5kbGVyUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50SGFuZGxlclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRIYW5kbGVyUmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudEhhbmRsZXJSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRIYW5kbGVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50SGFuZGxlclJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudEhhbmRsZXJSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50SGFuZGxlclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudEhhbmRsZXJSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudEhhbmRsZXJSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRIYW5kbGVyUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRIYW5kbGVyUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRIYW5kbGVyUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50SGFuZGxlclJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRIYW5kbGVyUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudEhhbmRsZXJSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRIYW5kbGVyUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50SGFuZGxlclJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudEhhbmRsZXJSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50SGFuZGxlclJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudEhhbmRsZXJSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudEhhbmRsZXJSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRIYW5kbGVyUmVmIC0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMTYxLDU2ICsxMTYxLDU2IEBACiAjZGVmaW5lIEV2ZW50SGFuZGxlckNhbGxSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRIYW5kbGVyQ2FsbFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50SGFuZGxlckNhbGxSZWYgb2JfaXRzZWxmOwogfSBFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRIYW5kbGVyQ2FsbFJlZl9OZXcoRXZlbnRIYW5kbGVyQ2FsbFJlZiBpdHNlbGYpCiB7Ci0JRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCwgJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QsICZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEV2ZW50SGFuZGxlckNhbGxSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRIYW5kbGVyQ2FsbFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudEhhbmRsZXJDYWxsUmVmX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SGFuZGxlckNhbGxSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudEhhbmRsZXJDYWxsUmVmX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SGFuZGxlckNhbGxSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50SGFuZGxlckNhbGxSZWZfZGVhbGxvYyhFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJDYWxsUmVmX0NhbGxOZXh0RXZlbnRIYW5kbGVyKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRSZWYgaW5FdmVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX0NvbnZlcnQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENhbGxOZXh0RXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXZlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50UmVmIGluRXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDYWxsTmV4dEV2ZW50SGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEV2ZW50SGFuZGxlckNhbGxSZWZfbWV0aG9kc1tdID0gewotCXsiQ2FsbE5leHRFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRIYW5kbGVyQ2FsbFJlZl9DYWxsTmV4dEV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNhbGxOZXh0RXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlckNhbGxSZWZfQ2FsbE5leHRFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50SGFuZGxlckNhbGxSZWZfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMjI3LDYxICsxMjI3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRIYW5kbGVyQ2FsbFJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEV2ZW50SGFuZGxlckNhbGxSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRIYW5kbGVyQ2FsbFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRIYW5kbGVyQ2FsbFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NhcmJvbkV2dC5FdmVudEhhbmRsZXJDYWxsUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEV2ZW50SGFuZGxlckNhbGxSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlFdmVudEhhbmRsZXJDYWxsUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50SGFuZGxlckNhbGxSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudEhhbmRsZXJDYWxsUmVmX3RwX25ldywgLyogdHBfbmV3ICovCi0JRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NhcmJvbkV2dC5FdmVudEhhbmRsZXJDYWxsUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEV2ZW50SGFuZGxlckNhbGxSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgRXZlbnRIYW5kbGVyQ2FsbFJlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBFdmVudEhhbmRsZXJDYWxsUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50SGFuZGxlckNhbGxSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudEhhbmRsZXJDYWxsUmVmX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRIYW5kbGVyQ2FsbFJlZiAtLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEyOTQsNzggKzEyOTQsNzggQEAKICNkZWZpbmUgRXZlbnRUYXJnZXRSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRUYXJnZXRSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRXZlbnRUYXJnZXRSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50VGFyZ2V0UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRUYXJnZXRSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBFdmVudFRhcmdldFJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50VGFyZ2V0UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRUYXJnZXRSZWZfTmV3KEV2ZW50VGFyZ2V0UmVmIGl0c2VsZikKIHsKLQlFdmVudFRhcmdldFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRUYXJnZXRSZWZPYmplY3QsICZFdmVudFRhcmdldFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRUYXJnZXRSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50VGFyZ2V0UmVmT2JqZWN0LCAmRXZlbnRUYXJnZXRSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRUYXJnZXRSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRUYXJnZXRSZWYgKnBfaXRzZWxmKQogewotCWlmICghRXZlbnRUYXJnZXRSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRUYXJnZXRSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRUYXJnZXRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRXZlbnRUYXJnZXRSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRUYXJnZXRSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRUYXJnZXRSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBFdmVudFRhcmdldFJlZl9kZWFsbG9jKEV2ZW50VGFyZ2V0UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFRhcmdldFJlZl9JbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIoRXZlbnRUYXJnZXRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRUYXJnZXRSZWZfSW5zdGFsbEV2ZW50SGFuZGxlcihFdmVudFRhcmdldFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JRXZlbnRUeXBlU3BlYyBpblNwZWM7Ci0JUHlPYmplY3QgKmNhbGxiYWNrOwotCUV2ZW50SGFuZGxlclJlZiBvdXRSZWY7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBFdmVudFR5cGVTcGVjIGluU3BlYzsKKyAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisgICAgRXZlbnRIYW5kbGVyUmVmIG91dFJlZjsKKyAgICBPU1N0YXR1cyBfZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPIiwgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5TcGVjLCAmY2FsbGJhY2spKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPIiwgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5TcGVjLCAmY2FsbGJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCV9lcnIgPSBJbnN0YWxsRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsIG15RXZlbnRIYW5kbGVyVVBQLCAxLCAmaW5TcGVjLCAodm9pZCAqKWNhbGxiYWNrLCAmb3V0UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9lcnIgPSBJbnN0YWxsRXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsIG15RXZlbnRIYW5kbGVyVVBQLCAxLCAmaW5TcGVjLCAodm9pZCAqKWNhbGxiYWNrLCAmb3V0UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogCi0JX3JlcyA9IEV2ZW50SGFuZGxlclJlZl9OZXcob3V0UmVmKTsKLQlpZiAoX3JlcyAhPSBOVUxMKSB7Ci0JICAgICAgICAoKEV2ZW50SGFuZGxlclJlZk9iamVjdCopX3JlcyktPm9iX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci0JICAgICAgICBQeV9JTkNSRUYoY2FsbGJhY2spOwotCX0KLQlyZXR1cm4gX3JlczsKKyAgICBfcmVzID0gRXZlbnRIYW5kbGVyUmVmX05ldyhvdXRSZWYpOworICAgIGlmIChfcmVzICE9IE5VTEwpIHsKKyAgICAgICAgKChFdmVudEhhbmRsZXJSZWZPYmplY3QqKV9yZXMpLT5vYl9jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBQeV9JTkNSRUYoY2FsbGJhY2spOworICAgIH0KKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEV2ZW50VGFyZ2V0UmVmX21ldGhvZHNbXSA9IHsKLQl7Ikluc3RhbGxTdGFuZGFyZEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudFRhcmdldFJlZl9JbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ikluc3RhbGxFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRUYXJnZXRSZWZfSW5zdGFsbEV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRUeXBlU3BlYyBpblNwZWMsIE1ldGhvZCBjYWxsYmFjaykgLT4gKEV2ZW50SGFuZGxlclJlZiBvdXRSZWYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiSW5zdGFsbFN0YW5kYXJkRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50VGFyZ2V0UmVmX0luc3RhbGxTdGFuZGFyZEV2ZW50SGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSW5zdGFsbEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudFRhcmdldFJlZl9JbnN0YWxsRXZlbnRIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFR5cGVTcGVjIGluU3BlYywgTWV0aG9kIGNhbGxiYWNrKSAtPiAoRXZlbnRIYW5kbGVyUmVmIG91dFJlZikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50VGFyZ2V0UmVmX2dldHNldGxpc3QgTlVMTApAQCAtMTM4Miw2MSArMTM4Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50VGFyZ2V0UmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudFRhcmdldFJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEV2ZW50VGFyZ2V0UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRUYXJnZXRSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRUYXJnZXRSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudFRhcmdldFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudFRhcmdldFJlZl90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBFdmVudFRhcmdldFJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRUYXJnZXRSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudFRhcmdldFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEV2ZW50VGFyZ2V0UmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50VGFyZ2V0UmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudFRhcmdldFJlZl9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRXZlbnRUYXJnZXRSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRUYXJnZXRSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRUYXJnZXRSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRXZlbnRUYXJnZXRSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50VGFyZ2V0UmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50VGFyZ2V0UmVmX3RwX25ldywgLyogdHBfbmV3ICovCi0JRXZlbnRUYXJnZXRSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRUYXJnZXRSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudFRhcmdldFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEV2ZW50VGFyZ2V0UmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50VGFyZ2V0UmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudFRhcmdldFJlZl9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgRXZlbnRUYXJnZXRSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRUYXJnZXRSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRUYXJnZXRSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgRXZlbnRUYXJnZXRSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50VGFyZ2V0UmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50VGFyZ2V0UmVmX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgRXZlbnRUYXJnZXRSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEV2ZW50VGFyZ2V0UmVmIC0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNDQ5LDUzICsxNDQ5LDUzIEBACiAjZGVmaW5lIEV2ZW50SG90S2V5UmVmX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkV2ZW50SG90S2V5UmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50SG90S2V5UmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBFdmVudEhvdEtleVJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUV2ZW50SG90S2V5UmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRXZlbnRIb3RLZXlSZWYgb2JfaXRzZWxmOwogfSBFdmVudEhvdEtleVJlZk9iamVjdDsKIAogUHlPYmplY3QgKkV2ZW50SG90S2V5UmVmX05ldyhFdmVudEhvdEtleVJlZiBpdHNlbGYpCiB7Ci0JRXZlbnRIb3RLZXlSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEV2ZW50SG90S2V5UmVmT2JqZWN0LCAmRXZlbnRIb3RLZXlSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEV2ZW50SG90S2V5UmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudEhvdEtleVJlZk9iamVjdCwgJkV2ZW50SG90S2V5UmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEV2ZW50SG90S2V5UmVmX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50SG90S2V5UmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50SG90S2V5UmVmX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SG90S2V5UmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEV2ZW50SG90S2V5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50SG90S2V5UmVmX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SG90S2V5UmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEV2ZW50SG90S2V5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRIb3RLZXlSZWZfZGVhbGxvYyhFdmVudEhvdEtleVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIb3RLZXlSZWZfVW5yZWdpc3RlckV2ZW50SG90S2V5KEV2ZW50SG90S2V5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3RlckV2ZW50SG90S2V5KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVW5yZWdpc3RlckV2ZW50SG90S2V5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZlbnRIb3RLZXlSZWZfbWV0aG9kc1tdID0gewotCXsiVW5yZWdpc3RlckV2ZW50SG90S2V5IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SG90S2V5UmVmX1VucmVnaXN0ZXJFdmVudEhvdEtleSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiVW5yZWdpc3RlckV2ZW50SG90S2V5IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SG90S2V5UmVmX1VucmVnaXN0ZXJFdmVudEhvdEtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudEhvdEtleVJlZl9nZXRzZXRsaXN0IE5VTEwKQEAgLTE1MTIsNjEgKzE1MTIsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhvdEtleVJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRIb3RLZXlSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBFdmVudEhvdEtleVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudEhvdEtleVJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50SG90S2V5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50SG90S2V5UmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRIb3RLZXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRIb3RLZXlSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRXZlbnRIb3RLZXlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50SG90S2V5UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRIb3RLZXlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBFdmVudEhvdEtleVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudEhvdEtleVJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRIb3RLZXlSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEV2ZW50SG90S2V5UmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50SG90S2V5UmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50SG90S2V5UmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUV2ZW50SG90S2V5UmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudEhvdEtleVJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudEhvdEtleVJlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUV2ZW50SG90S2V5UmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50SG90S2V5UmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRIb3RLZXlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBFdmVudEhvdEtleVJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudEhvdEtleVJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRIb3RLZXlSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEV2ZW50SG90S2V5UmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50SG90S2V5UmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50SG90S2V5UmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEV2ZW50SG90S2V5UmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudEhvdEtleVJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudEhvdEtleVJlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEV2ZW50SG90S2V5UmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudEhvdEtleVJlZiAtLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTU3NCw1NzcgKzE1NzQsNTc3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50TG9vcFJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnJlbnRFdmVudExvb3AoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50TG9vcFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEN1cnJlbnRFdmVudExvb3AoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldE1haW5FdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50TG9vcFJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1haW5FdmVudExvb3AoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50TG9vcFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1haW5FdmVudExvb3AoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9vcFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1J1bkN1cnJlbnRFdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JZG91YmxlIGluVGltZW91dDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSdW5DdXJyZW50RXZlbnRMb29wKGluVGltZW91dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgZG91YmxlIGluVGltZW91dDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSdW5DdXJyZW50RXZlbnRMb29wKGluVGltZW91dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1JlY2VpdmVOZXh0RXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluTnVtVHlwZXM7Ci0JRXZlbnRUeXBlU3BlYyBpbkxpc3Q7Ci0JZG91YmxlIGluVGltZW91dDsKLQlCb29sZWFuIGluUHVsbEV2ZW50OwotCUV2ZW50UmVmIG91dEV2ZW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmRiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUHVsbEV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlY2VpdmVOZXh0RXZlbnQoaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluVGltZW91dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblB1bGxFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RXZlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9OZXcsIG91dEV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5OdW1UeXBlczsKKyAgICBFdmVudFR5cGVTcGVjIGluTGlzdDsKKyAgICBkb3VibGUgaW5UaW1lb3V0OworICAgIEJvb2xlYW4gaW5QdWxsRXZlbnQ7CisgICAgRXZlbnRSZWYgb3V0RXZlbnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QdWxsRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVjZWl2ZU5leHRFdmVudChpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHVsbEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRFdmVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgb3V0RXZlbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRRdWV1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRRdWV1ZVJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnJlbnRFdmVudFF1ZXVlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlUmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRRdWV1ZVJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEN1cnJlbnRFdmVudFF1ZXVlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlUmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50UXVldWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50UXVldWVSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNYWluRXZlbnRRdWV1ZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZVJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50UXVldWVSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNYWluRXZlbnRRdWV1ZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZVJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWRvdWJsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnJlbnRFdmVudFRpbWUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZG91YmxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q3VycmVudEV2ZW50VGltZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JR3JhZlB0ciBpblBvcnQ7Ci0JUG9pbnQgb3V0UHQ7Ci0JVUludDE2IG91dFJlc3VsdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmluUG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja01vdXNlTG9jYXRpb24oaW5Qb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFB0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBvdXRQdCwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEdyYWZQdHIgaW5Qb3J0OworICAgIFBvaW50IG91dFB0OworICAgIFVJbnQxNiBvdXRSZXN1bHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZpblBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVHJhY2tNb3VzZUxvY2F0aW9uKGluUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgb3V0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JR3JhZlB0ciBpblBvcnQ7Ci0JT3B0aW9uQml0cyBpbk9wdGlvbnM7Ci0JZG91YmxlIGluVGltZW91dDsKLQlQb2ludCBvdXRQdDsKLQlVSW50MzIgb3V0TW9kaWZpZXJzOwotCVVJbnQxNiBvdXRSZXN1bHQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsZCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmluUG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucyhpblBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaW1lb3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbEgiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIG91dFB0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEdyYWZQdHIgaW5Qb3J0OworICAgIE9wdGlvbkJpdHMgaW5PcHRpb25zOworICAgIGRvdWJsZSBpblRpbWVvdXQ7CisgICAgUG9pbnQgb3V0UHQ7CisgICAgVUludDMyIG91dE1vZGlmaWVyczsKKyAgICBVSW50MTYgb3V0UmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZpblBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRpbWVvdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMoaW5Qb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBvdXRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfVHJhY2tNb3VzZVJlZ2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlHcmFmUHRyIGluUG9ydDsKLQlSZ25IYW5kbGUgaW5SZWdpb247Ci0JQm9vbGVhbiBpb1dhc0luUmduOwotCVVJbnQxNiBvdXRSZXN1bHQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZpblBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5SZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpb1dhc0luUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRyYWNrTW91c2VSZWdpb24oaW5Qb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpb1dhc0luUmduLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBpb1dhc0luUmduLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgR3JhZlB0ciBpblBvcnQ7CisgICAgUmduSGFuZGxlIGluUmVnaW9uOworICAgIEJvb2xlYW4gaW9XYXNJblJnbjsKKyAgICBVSW50MTYgb3V0UmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmaW5Qb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9XYXNJblJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja01vdXNlUmVnaW9uKGluUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9XYXNJblJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9XYXNJblJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRMYXN0VXNlckV2ZW50VGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZG91YmxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGFzdFVzZXJFdmVudFRpbWUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZG91YmxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGFzdFVzZXJFdmVudFRpbWUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc01vdXNlQ29hbGVzY2luZ0VuYWJsZWQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGluTmV3U3RhdGU7Ci0JQm9vbGVhbiBvdXRPbGRTdGF0ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTmV3U3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZChpbk5ld1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRPbGRTdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0T2xkU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5OZXdTdGF0ZTsKKyAgICBCb29sZWFuIG91dE9sZFN0YXRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5OZXdTdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkKGluTmV3U3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE9sZFN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRPbGRTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0V2ZW50VGFyZ2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFRhcmdldFJlZiBfcnY7Ci0JV2luZG93UHRyIGluV2luZG93OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd0V2ZW50VGFyZ2V0KGluV2luZG93KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXaW5kb3dFdmVudFRhcmdldChpbldpbmRvdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldENvbnRyb2xFdmVudFRhcmdldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRUYXJnZXRSZWYgX3J2OwotCUNvbnRyb2xIYW5kbGUgaW5Db250cm9sOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRyb2wpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sRXZlbnRUYXJnZXQoaW5Db250cm9sKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIENvbnRyb2xIYW5kbGUgaW5Db250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRyb2wpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sRXZlbnRUYXJnZXQoaW5Db250cm9sKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0TWVudUV2ZW50VGFyZ2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFRhcmdldFJlZiBfcnY7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51RXZlbnRUYXJnZXQoaW5NZW51KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5NZW51KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudUV2ZW50VGFyZ2V0KGluTWVudSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudFRhcmdldFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRVc2VyRm9jdXNFdmVudFRhcmdldCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRFdmVudERpc3BhdGNoZXJUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50VGFyZ2V0UmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1J1bkFwcGxpY2F0aW9uRXZlbnRMb29wKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUnVuQXBwbGljYXRpb25FdmVudExvb3AoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSdW5BcHBsaWNhdGlvbkV2ZW50TG9vcCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19SdW5BcHBNb2RhbExvb3BGb3JXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSdW5BcHBNb2RhbExvb3BGb3JXaW5kb3coaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUnVuQXBwTW9kYWxMb29wRm9yV2luZG93KGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfUXVpdEFwcE1vZGFsTG9vcEZvcldpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFF1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3coaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUXVpdEFwcE1vZGFsTG9vcEZvcldpbmRvdyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0JlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEJlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyhpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCZWdpbkFwcE1vZGFsU3RhdGVGb3JXaW5kb3coaW5XaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19FbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW5kQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyhpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93KGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfU2V0VXNlckZvY3VzV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VXNlckZvY3VzV2luZG93KGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFVzZXJGb2N1c1dpbmRvdyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldFVzZXJGb2N1c1dpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VXNlckZvY3VzV2luZG93KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRVc2VyRm9jdXNXaW5kb3coKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0RlZmF1bHRCdXR0b24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgaW5Db250cm9sOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dEZWZhdWx0QnV0dG9uKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgaW5Db250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dEZWZhdWx0QnV0dG9uKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0NhbmNlbEJ1dHRvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBpbkNvbnRyb2w7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250cm9sKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0NhbmNlbEJ1dHRvbihpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgaW5Db250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dDYW5jZWxCdXR0b24oaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRXaW5kb3dEZWZhdWx0QnV0dG9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0RlZmF1bHRCdXR0b24oaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dEZWZhdWx0QnV0dG9uKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0NhbmNlbEJ1dHRvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dDYW5jZWxCdXR0b24oaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd0NhbmNlbEJ1dHRvbihpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1JlZ2lzdGVyRXZlbnRIb3RLZXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluSG90S2V5Q29kZTsKLQlVSW50MzIgaW5Ib3RLZXlNb2RpZmllcnM7Ci0JRXZlbnRIb3RLZXlJRCBpbkhvdEtleUlEOwotCUV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0OwotCU9wdGlvbkJpdHMgaW5PcHRpb25zOwotCUV2ZW50SG90S2V5UmVmIG91dFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG90S2V5Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG90S2V5TW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudEhvdEtleUlEX0NvbnZlcnQsICZpbkhvdEtleUlELAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9Db252ZXJ0LCAmaW5UYXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVnaXN0ZXJFdmVudEhvdEtleShpbkhvdEtleUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Ib3RLZXlNb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Ib3RLZXlJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50SG90S2V5UmVmX05ldywgb3V0UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5Ib3RLZXlDb2RlOworICAgIFVJbnQzMiBpbkhvdEtleU1vZGlmaWVyczsKKyAgICBFdmVudEhvdEtleUlEIGluSG90S2V5SUQ7CisgICAgRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQ7CisgICAgT3B0aW9uQml0cyBpbk9wdGlvbnM7CisgICAgRXZlbnRIb3RLZXlSZWYgb3V0UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3RLZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3RLZXlNb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SG90S2V5SURfQ29udmVydCwgJmluSG90S2V5SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpblRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWdpc3RlckV2ZW50SG90S2V5KGluSG90S2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhvdEtleU1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhvdEtleUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIb3RLZXlSZWZfTmV3LCBvdXRSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ2FyYm9uRXZlbnRzX21ldGhvZHNbXSA9IHsKLQl7IkdldEN1cnJlbnRFdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudExvb3AsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TG9vcFJlZiBfcnYpIil9LAotCXsiR2V0TWFpbkV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50TG9vcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRMb29wUmVmIF9ydikiKX0sCi0JeyJSdW5DdXJyZW50RXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5DdXJyZW50RXZlbnRMb29wLCAxLAotCSBQeURvY19TVFIoIihkb3VibGUgaW5UaW1lb3V0KSAtPiBOb25lIil9LAotCXsiUmVjZWl2ZU5leHRFdmVudCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUmVjZWl2ZU5leHRFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0LCBkb3VibGUgaW5UaW1lb3V0LCBCb29sZWFuIGluUHVsbEV2ZW50KSAtPiAoRXZlbnRSZWYgb3V0RXZlbnQpIil9LAotCXsiR2V0Q3VycmVudEV2ZW50UXVldWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFF1ZXVlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChFdmVudFF1ZXVlUmVmIF9ydikiKX0sCi0JeyJHZXRNYWluRXZlbnRRdWV1ZSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50UXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50UXVldWVSZWYgX3J2KSIpfSwKLQl7IkdldEN1cnJlbnRFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAotCXsiVHJhY2tNb3VzZUxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYWZQdHIgaW5Qb3J0KSAtPiAoUG9pbnQgb3V0UHQsIFVJbnQxNiBvdXRSZXN1bHQpIil9LAotCXsiVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zLCAxLAotCSBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCwgT3B0aW9uQml0cyBpbk9wdGlvbnMsIGRvdWJsZSBpblRpbWVvdXQpIC0+IChQb2ludCBvdXRQdCwgVUludDMyIG91dE1vZGlmaWVycywgVUludDE2IG91dFJlc3VsdCkiKX0sCi0JeyJUcmFja01vdXNlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCwgUmduSGFuZGxlIGluUmVnaW9uLCBCb29sZWFuIGlvV2FzSW5SZ24pIC0+IChCb29sZWFuIGlvV2FzSW5SZ24sIFVJbnQxNiBvdXRSZXN1bHQpIil9LAotCXsiR2V0TGFzdFVzZXJFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldExhc3RVc2VyRXZlbnRUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChkb3VibGUgX3J2KSIpfSwKLQl7IklzTW91c2VDb2FsZXNjaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19TZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluTmV3U3RhdGUpIC0+IChCb29sZWFuIG91dE9sZFN0YXRlKSIpfSwKLQl7IkdldFdpbmRvd0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRXaW5kb3dFdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKLQl7IkdldENvbnRyb2xFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0Q29udHJvbEV2ZW50VGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIihDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCi0JeyJHZXRNZW51RXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldE1lbnVFdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAotCXsiR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKLQl7IkdldFVzZXJGb2N1c0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRVc2VyRm9jdXNFdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKLQl7IkdldEV2ZW50RGlzcGF0Y2hlclRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAotCXsiUnVuQXBwbGljYXRpb25FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1J1bkFwcGxpY2F0aW9uRXZlbnRMb29wLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJRdWl0QXBwbGljYXRpb25FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1F1aXRBcHBsaWNhdGlvbkV2ZW50TG9vcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUnVuQXBwTW9kYWxMb29wRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5BcHBNb2RhbExvb3BGb3JXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlF1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1F1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkJlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfQmVnaW5BcHBNb2RhbFN0YXRlRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJFbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19FbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJTZXRVc2VyRm9jdXNXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldFVzZXJGb2N1c1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiR2V0VXNlckZvY3VzV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRVc2VyRm9jdXNXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiU2V0V2luZG93RGVmYXVsdEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0V2luZG93RGVmYXVsdEJ1dHRvbiwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gTm9uZSIpfSwKLQl7IlNldFdpbmRvd0NhbmNlbEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0V2luZG93Q2FuY2VsQnV0dG9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xIYW5kbGUgaW5Db250cm9sKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93RGVmYXVsdEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93RGVmYXVsdEJ1dHRvbiwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkdldFdpbmRvd0NhbmNlbEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93Q2FuY2VsQnV0dG9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiUmVnaXN0ZXJFdmVudEhvdEtleSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUmVnaXN0ZXJFdmVudEhvdEtleSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluSG90S2V5Q29kZSwgVUludDMyIGluSG90S2V5TW9kaWZpZXJzLCBFdmVudEhvdEtleUlEIGluSG90S2V5SUQsIEV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0LCBPcHRpb25CaXRzIGluT3B0aW9ucykgLT4gKEV2ZW50SG90S2V5UmVmIG91dFJlZikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJHZXRDdXJyZW50RXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRMb29wLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudExvb3BSZWYgX3J2KSIpfSwKKyAgICB7IkdldE1haW5FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldE1haW5FdmVudExvb3AsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TG9vcFJlZiBfcnYpIil9LAorICAgIHsiUnVuQ3VycmVudEV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUnVuQ3VycmVudEV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZG91YmxlIGluVGltZW91dCkgLT4gTm9uZSIpfSwKKyAgICB7IlJlY2VpdmVOZXh0RXZlbnQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1JlY2VpdmVOZXh0RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCwgZG91YmxlIGluVGltZW91dCwgQm9vbGVhbiBpblB1bGxFdmVudCkgLT4gKEV2ZW50UmVmIG91dEV2ZW50KSIpfSwKKyAgICB7IkdldEN1cnJlbnRFdmVudFF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRRdWV1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRRdWV1ZVJlZiBfcnYpIil9LAorICAgIHsiR2V0TWFpbkV2ZW50UXVldWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldE1haW5FdmVudFF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudFF1ZXVlUmVmIF9ydikiKX0sCisgICAgeyJHZXRDdXJyZW50RXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRDdXJyZW50RXZlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChkb3VibGUgX3J2KSIpfSwKKyAgICB7IlRyYWNrTW91c2VMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfVHJhY2tNb3VzZUxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCkgLT4gKFBvaW50IG91dFB0LCBVSW50MTYgb3V0UmVzdWx0KSIpfSwKKyAgICB7IlRyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhZlB0ciBpblBvcnQsIE9wdGlvbkJpdHMgaW5PcHRpb25zLCBkb3VibGUgaW5UaW1lb3V0KSAtPiAoUG9pbnQgb3V0UHQsIFVJbnQzMiBvdXRNb2RpZmllcnMsIFVJbnQxNiBvdXRSZXN1bHQpIil9LAorICAgIHsiVHJhY2tNb3VzZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfVHJhY2tNb3VzZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhZlB0ciBpblBvcnQsIFJnbkhhbmRsZSBpblJlZ2lvbiwgQm9vbGVhbiBpb1dhc0luUmduKSAtPiAoQm9vbGVhbiBpb1dhc0luUmduLCBVSW50MTYgb3V0UmVzdWx0KSIpfSwKKyAgICB7IkdldExhc3RVc2VyRXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRMYXN0VXNlckV2ZW50VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCisgICAgeyJJc01vdXNlQ29hbGVzY2luZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0lzTW91c2VDb2FsZXNjaW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0TW91c2VDb2FsZXNjaW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbk5ld1N0YXRlKSAtPiAoQm9vbGVhbiBvdXRPbGRTdGF0ZSkiKX0sCisgICAgeyJHZXRXaW5kb3dFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93RXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldENvbnRyb2xFdmVudFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEhhbmRsZSBpbkNvbnRyb2wpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAorICAgIHsiR2V0TWVudUV2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRNZW51RXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51KSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKKyAgICB7IkdldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEFwcGxpY2F0aW9uRXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCisgICAgeyJHZXRVc2VyRm9jdXNFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCisgICAgeyJHZXRFdmVudERpc3BhdGNoZXJUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEV2ZW50RGlzcGF0Y2hlclRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKKyAgICB7IlJ1bkFwcGxpY2F0aW9uRXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5BcHBsaWNhdGlvbkV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19RdWl0QXBwbGljYXRpb25FdmVudExvb3AsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlJ1bkFwcE1vZGFsTG9vcEZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUnVuQXBwTW9kYWxMb29wRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJRdWl0QXBwTW9kYWxMb29wRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19RdWl0QXBwTW9kYWxMb29wRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJCZWdpbkFwcE1vZGFsU3RhdGVGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0JlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiRW5kQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfRW5kQXBwTW9kYWxTdGF0ZUZvcldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiU2V0VXNlckZvY3VzV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19TZXRVc2VyRm9jdXNXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFVzZXJGb2N1c1dpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0VXNlckZvY3VzV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IlNldFdpbmRvd0RlZmF1bHRCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0RlZmF1bHRCdXR0b24sIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgQ29udHJvbEhhbmRsZSBpbkNvbnRyb2wpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRXaW5kb3dDYW5jZWxCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldFdpbmRvd0NhbmNlbEJ1dHRvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd0RlZmF1bHRCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0RlZmF1bHRCdXR0b24sIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJHZXRXaW5kb3dDYW5jZWxCdXR0b24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0NhbmNlbEJ1dHRvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IlJlZ2lzdGVyRXZlbnRIb3RLZXkiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1JlZ2lzdGVyRXZlbnRIb3RLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbkhvdEtleUNvZGUsIFVJbnQzMiBpbkhvdEtleU1vZGlmaWVycywgRXZlbnRIb3RLZXlJRCBpbkhvdEtleUlELCBFdmVudFRhcmdldFJlZiBpblRhcmdldCwgT3B0aW9uQml0cyBpbk9wdGlvbnMpIC0+IChFdmVudEhvdEtleVJlZiBvdXRSZWYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2Vsc2UgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIENhcmJvbkV2ZW50c19tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KQEAgLTIxNTMsNzcgKzIxNTMsNzcgQEAKIAogdm9pZCBpbml0X0NhcmJvbkV2dCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0NhcmJvbkV2dCIsIENhcmJvbkV2ZW50c19tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0NhcmJvbkV2dCIsIENhcmJvbkV2ZW50c19tZXRob2RzKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCW15RXZlbnRIYW5kbGVyVVBQID0gTmV3RXZlbnRIYW5kbGVyVVBQKG15RXZlbnRIYW5kbGVyKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDYXJib25FdmVudHNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChDYXJib25FdmVudHNfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDYXJib25FdmVudHNfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlFdmVudFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRSZWZfVHlwZSk7Ci0JRXZlbnRRdWV1ZVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRRdWV1ZVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50UXVldWVSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFF1ZXVlUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UXVldWVSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudFF1ZXVlUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRRdWV1ZVJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKLQlFdmVudExvb3BSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkV2ZW50TG9vcFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFJlZiIsIChQeU9iamVjdCAqKSZFdmVudExvb3BSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudExvb3BSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQlFdmVudExvb3BUaW1lclJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRMb29wVGltZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFRpbWVyUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BUaW1lclJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7Ci0JRXZlbnRIYW5kbGVyUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZFdmVudEhhbmRsZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJDYWxsUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyQ2FsbFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKLQlFdmVudFRhcmdldFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRUYXJnZXRSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudFRhcmdldFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50VGFyZ2V0UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50VGFyZ2V0UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRUYXJnZXRSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFRhcmdldFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRUYXJnZXRSZWZfVHlwZSk7Ci0JRXZlbnRIb3RLZXlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkV2ZW50SG90S2V5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRXZlbnRIb3RLZXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhvdEtleVJlZiIsIChQeU9iamVjdCAqKSZFdmVudEhvdEtleVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkV2ZW50SG90S2V5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIb3RLZXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50SG90S2V5UmVmX1R5cGUpOworICAgIG15RXZlbnRIYW5kbGVyVVBQID0gTmV3RXZlbnRIYW5kbGVyVVBQKG15RXZlbnRIYW5kbGVyKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBDYXJib25FdmVudHNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChDYXJib25FdmVudHNfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDYXJib25FdmVudHNfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBFdmVudFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRSZWZfVHlwZSk7CisgICAgRXZlbnRRdWV1ZVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRRdWV1ZVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50UXVldWVSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFF1ZXVlUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50UXVldWVSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudFF1ZXVlUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRRdWV1ZVJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKKyAgICBFdmVudExvb3BSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkV2ZW50TG9vcFJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50TG9vcFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFJlZiIsIChQeU9iamVjdCAqKSZFdmVudExvb3BSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudExvb3BSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFJlZl9UeXBlKTsKKyAgICBFdmVudExvb3BUaW1lclJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRMb29wVGltZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFRpbWVyUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudExvb3BUaW1lclJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7CisgICAgRXZlbnRIYW5kbGVyUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZFdmVudEhhbmRsZXJSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRIYW5kbGVyUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJDYWxsUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIYW5kbGVyQ2FsbFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKKyAgICBFdmVudFRhcmdldFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRUYXJnZXRSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudFRhcmdldFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50VGFyZ2V0UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50VGFyZ2V0UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRUYXJnZXRSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFRhcmdldFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRUYXJnZXRSZWZfVHlwZSk7CisgICAgRXZlbnRIb3RLZXlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkV2ZW50SG90S2V5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRXZlbnRIb3RLZXlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhvdEtleVJlZiIsIChQeU9iamVjdCAqKSZFdmVudEhvdEtleVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkV2ZW50SG90S2V5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRIb3RLZXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50SG90S2V5UmVmX1R5cGUpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZi9fQ0Ztb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jCmluZGV4IDA5MDRhZTEuLmVlNjdjNzAgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtODQsMTkgKzg0LDE5IEBACiBQeU9iamVjdCAqQ0ZSYW5nZV9OZXcoQ0ZSYW5nZSAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIChsb25nKWl0c2VsZi0+bG9jYXRpb24sIChsb25nKWl0c2VsZi0+bGVuZ3RoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCAobG9uZylpdHNlbGYtPmxvY2F0aW9uLCAobG9uZylpdHNlbGYtPmxlbmd0aCk7CiB9CiAKIGludAogQ0ZSYW5nZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlJhbmdlICpwX2l0c2VsZikKIHsKLSAgICAgICAgbG9uZyBsb2NhdGlvbiwgbGVuZ3RoOworICAgIGxvbmcgbG9jYXRpb24sIGxlbmd0aDsKIAotICAgICAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJmxvY2F0aW9uLCAmbGVuZ3RoKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHBfaXRzZWxmLT5sb2NhdGlvbiA9IChDRkluZGV4KWxvY2F0aW9uOwotICAgICAgICBwX2l0c2VsZi0+bGVuZ3RoID0gKENGSW5kZXgpbGVuZ3RoOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJmxvY2F0aW9uLCAmbGVuZ3RoKSApCisgICAgICAgIHJldHVybiAwOworICAgIHBfaXRzZWxmLT5sb2NhdGlvbiA9IChDRkluZGV4KWxvY2F0aW9uOworICAgIHBfaXRzZWxmLT5sZW5ndGggPSAoQ0ZJbmRleClsZW5ndGg7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIE9wdGlvbmFsIENGVVJMIGFyZ3VtZW50IG9yIE5vbmUgKHBhc3NlZCBhcyBOVUxMKSAqLwpAQCAtMTA0LDggKzEwNCw4IEBACiBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGVVJMUmVmICpwX2l0c2VsZikKIHsKICAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKLSAgICAgICAgcF9pdHNlbGYgPSBOVUxMOwotICAgICAgICByZXR1cm4gMTsKKyAgICBwX2l0c2VsZiA9IE5VTEw7CisgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIHJldHVybiBDRlVSTFJlZk9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKIH0KQEAgLTExOSwyNjIgKzExOSwyNjIgQEAKICNkZWZpbmUgQ0ZUeXBlUmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGVHlwZVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRlR5cGVSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGVHlwZVJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGVHlwZVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGVHlwZVJlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGVHlwZVJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGVHlwZVJlZk9ial9OZXcoQ0ZUeXBlUmVmIGl0c2VsZikKIHsKLQlDRlR5cGVSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRlR5cGVSZWZPYmplY3QsICZDRlR5cGVSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZUeXBlUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZUeXBlUmVmT2JqZWN0LCAmQ0ZUeXBlUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGVHlwZVJlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCiAKLQlpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlR5cGVSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlR5cGVSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZUeXBlUmVmT2JqX2RlYWxsb2MoQ0ZUeXBlUmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGR2V0VHlwZUlEKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGR2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkdldFR5cGVJRChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZHZXRUeXBlSUQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGUmV0YWluKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZUeXBlUmVmIF9ydjsKICNpZm5kZWYgQ0ZSZXRhaW4KLQlQeU1hY19QUkVDSEVDSyhDRlJldGFpbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZSZXRhaW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUmV0YWluKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZSZXRhaW4oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlJlbGVhc2UoQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGUmVsZWFzZQotCVB5TWFjX1BSRUNIRUNLKENGUmVsZWFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZSZWxlYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlJlbGVhc2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlJlbGVhc2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRkdldFJldGFpbkNvdW50KENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZJbmRleCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OwogI2lmbmRlZiBDRkdldFJldGFpbkNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZHZXRSZXRhaW5Db3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZHZXRSZXRhaW5Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZHZXRSZXRhaW5Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZHZXRSZXRhaW5Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZFcXVhbChDRlR5cGVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGVHlwZVJlZiBjZjI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGVHlwZVJlZiBjZjI7CiAjaWZuZGVmIENGRXF1YWwKLQlQeU1hY19QUkVDSEVDSyhDRkVxdWFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkVxdWFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZjZjIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkVxdWFsKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBjZjIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZjZjIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkVxdWFsKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBjZjIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRkhhc2goQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkhhc2hDb2RlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZIYXNoQ29kZSBfcnY7CiAjaWZuZGVmIENGSGFzaAotCVB5TWFjX1BSRUNIRUNLKENGSGFzaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZIYXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkhhc2goX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGSGFzaChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZDb3B5RGVzY3JpcHRpb24oQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZDb3B5RGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhDRkNvcHlEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZDb3B5RGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQ29weURlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkNvcHlEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZEYXRhUmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJvcGVydHlMaXN0Q3JlYXRlWE1MRGF0YSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlByb3BlcnR5TGlzdENyZWF0ZURlZXBDb3B5KENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlUmVmIF9ydjsKLQlDRk9wdGlvbkZsYWdzIG11dGFiaWxpdHlPcHRpb247Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdXRhYmlsaXR5T3B0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVEZWVwQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmlsaXR5T3B0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZVJlZiBfcnY7CisgICAgQ0ZPcHRpb25GbGFncyBtdXRhYmlsaXR5T3B0aW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbXV0YWJpbGl0eU9wdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJpbGl0eU9wdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlNob3coQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGU2hvdwotCVB5TWFjX1BSRUNIRUNLKENGU2hvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTaG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlNob3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlNob3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQ0ZUeXBlUmVmIF9ydjsKLQlDRk9wdGlvbkZsYWdzIG11dGFiaWxpdHlPcHRpb247Ci0JQ0ZTdHJpbmdSZWYgZXJyb3JTdHJpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdXRhYmlsaXR5T3B0aW9uKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9ydiA9IENGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJpbGl0eU9wdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvclN0cmluZyk7Ci0JaWYgKGVycm9yU3RyaW5nKQotCSAgICAgICAgQ0ZSZWxlYXNlKGVycm9yU3RyaW5nKTsKLQlpZiAoX3J2ID09IE5VTEwpIHsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJQYXJzZSBlcnJvciBpbiBYTUwgZGF0YSIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBDRlR5cGVSZWYgX3J2OworICAgIENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbjsKKyAgICBDRlN0cmluZ1JlZiBlcnJvclN0cmluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm11dGFiaWxpdHlPcHRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFiaWxpdHlPcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JTdHJpbmcpOworICAgIGlmIChlcnJvclN0cmluZykKKyAgICAgICAgQ0ZSZWxlYXNlKGVycm9yU3RyaW5nKTsKKyAgICBpZiAoX3J2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIlBhcnNlIGVycm9yIGluIFhNTCBkYXRhIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfdG9QeXRob24oQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlfcmVzID0gUHlDRl9DRjJQeXRob24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IFB5Q0ZfQ0YyUHl0aG9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRlR5cGVSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZSZXRhaW4iLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUmV0YWluLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVSZWYgX3J2KSIpfSwKLQl7IkNGUmVsZWFzZSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZSZWxlYXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDRkdldFJldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkdldFJldGFpbkNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCi0JeyJDRkVxdWFsIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkVxdWFsLCAxLAotCSBQeURvY19TVFIoIihDRlR5cGVSZWYgY2YyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZIYXNoIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkhhc2gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSGFzaENvZGUgX3J2KSIpfSwKLQl7IkNGQ29weURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkNvcHlEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGUHJvcGVydHlMaXN0Q3JlYXRlWE1MRGF0YSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKLQl7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHksIDEsCi0JIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZiBfcnYpIil9LAotCXsiQ0ZTaG93IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRlNob3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEsIDEsCi0JIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZk9iaikiKX0sCi0JeyJ0b1B5dGhvbiIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfdG9QeXRob24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHB5dGhvbl9vYmplY3QpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGR2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZSZXRhaW4iLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUmV0YWluLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVSZWYgX3J2KSIpfSwKKyAgICB7IkNGUmVsZWFzZSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZSZWxlYXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDRkdldFJldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkdldFJldGFpbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRkVxdWFsIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkVxdWFsLCAxLAorICAgICBQeURvY19TVFIoIihDRlR5cGVSZWYgY2YyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZIYXNoIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkhhc2gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSGFzaENvZGUgX3J2KSIpfSwKKyAgICB7IkNGQ29weURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRkNvcHlEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGUHJvcGVydHlMaXN0Q3JlYXRlWE1MRGF0YSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZiBfcnYpIil9LAorICAgIHsiQ0ZTaG93IiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRlNob3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKENGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbikgLT4gKENGVHlwZVJlZk9iaikiKX0sCisgICAgeyJ0b1B5dGhvbiIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfdG9QeXRob24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHB5dGhvbl9vYmplY3QpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRlR5cGVSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zODIsOTMgKzM4Miw5MyBAQAogCiBzdGF0aWMgaW50IENGVHlwZVJlZk9ial9jb21wYXJlKENGVHlwZVJlZk9iamVjdCAqc2VsZiwgQ0ZUeXBlUmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGVHlwZVJlZk9ial9yZXByKENGVHlwZVJlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGVHlwZVJlZiB0eXBlLSVkIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsIChpbnQpQ0ZHZXRUeXBlSUQoc2VsZi0+b2JfaXRzZWxmKSwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRlR5cGVSZWYgdHlwZS0lZCBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAoaW50KUNGR2V0VHlwZUlEKHNlbGYtPm9iX2l0c2VsZiksICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGVHlwZVJlZk9ial9oYXNoKENGVHlwZVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRlR5cGVSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGVHlwZVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZUeXBlUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRlR5cGVSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZUeXBlUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZUeXBlUmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZUeXBlUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRlR5cGVSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGVHlwZVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZUeXBlUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRlR5cGVSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZUeXBlUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGVHlwZVJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGVHlwZVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGVHlwZVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRlR5cGVSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGVHlwZVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZUeXBlUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGVHlwZVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRlR5cGVSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZUeXBlUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRlR5cGVSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZUeXBlUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZUeXBlUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZUeXBlUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZUeXBlUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZUeXBlUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGVHlwZVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZUeXBlUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRlR5cGVSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZUeXBlUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGVHlwZVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRlR5cGVSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGVHlwZVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRlR5cGVSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRlR5cGVSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZUeXBlUmVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00ODEsMTA0ICs0ODEsMTA0IEBACiAjZGVmaW5lIENGQXJyYXlSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZBcnJheVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRkFycmF5UmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRkFycmF5UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZBcnJheVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGQXJyYXlSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRkFycmF5UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZBcnJheVJlZk9ial9OZXcoQ0ZBcnJheVJlZiBpdHNlbGYpCiB7Ci0JQ0ZBcnJheVJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGQXJyYXlSZWZPYmplY3QsICZDRkFycmF5UmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRkFycmF5UmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZBcnJheVJlZk9iamVjdCwgJkNGQXJyYXlSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZBcnJheVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRkFycmF5UmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZBcnJheVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkFycmF5UmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENGQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZBcnJheVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkFycmF5UmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRkFycmF5UmVmT2JqX2RlYWxsb2MoQ0ZBcnJheVJlZk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKLQl7Ci0JCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7Ci0JCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JfQotCUNGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGQXJyYXlSZWZPYmpfQ0ZBcnJheUNyZWF0ZUNvcHkoQ0ZBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZBcnJheVJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQXJyYXlDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQXJyYXlSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkFycmF5Q3JlYXRlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGQXJyYXlSZWZPYmpfQ0ZBcnJheUdldENvdW50KENGQXJyYXlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKICNpZm5kZWYgQ0ZBcnJheUdldENvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUdldENvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5R2V0Q291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQXJyYXlHZXRDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZBcnJheUdldENvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGQXJyYXlSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MoQ0ZBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUNGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzZXBhcmF0b3JTdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUJ5Q29tYmluaW5nU3RyaW5ncygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvclN0cmluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBzZXBhcmF0b3JTdHJpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc2VwYXJhdG9yU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JTdHJpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZBcnJheVJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRkFycmF5Q3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRkFycmF5UmVmT2JqX0NGQXJyYXlDcmVhdGVDb3B5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkFycmF5UmVmIF9ydikiKX0sCi0JeyJDRkFycmF5R2V0Q291bnQiLCAoUHlDRnVuY3Rpb24pQ0ZBcnJheVJlZk9ial9DRkFycmF5R2V0Q291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlQnlDb21iaW5pbmdTdHJpbmdzIiwgKFB5Q0Z1bmN0aW9uKUNGQXJyYXlSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkFycmF5Q3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRkFycmF5UmVmT2JqX0NGQXJyYXlDcmVhdGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkFycmF5UmVmIF9ydikiKX0sCisgICAgeyJDRkFycmF5R2V0Q291bnQiLCAoUHlDRnVuY3Rpb24pQ0ZBcnJheVJlZk9ial9DRkFycmF5R2V0Q291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlQnlDb21iaW5pbmdTdHJpbmdzIiwgKFB5Q0Z1bmN0aW9uKUNGQXJyYXlSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGQXJyYXlSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC01ODYsMTAwICs1ODYsMTAwIEBACiAKIHN0YXRpYyBpbnQgQ0ZBcnJheVJlZk9ial9jb21wYXJlKENGQXJyYXlSZWZPYmplY3QgKnNlbGYsIENGQXJyYXlSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZBcnJheVJlZk9ial9yZXByKENGQXJyYXlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRkFycmF5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8Q0ZBcnJheVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRkFycmF5UmVmT2JqX2hhc2goQ0ZBcnJheVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRkFycmF5UmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRkFycmF5UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRkFycmF5UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRkFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRkFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGQXJyYXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRkFycmF5UmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRkFycmF5UmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGQXJyYXlSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZBcnJheVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRkFycmF5UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZBcnJheVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGQXJyYXlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZBcnJheVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZBcnJheVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZBcnJheVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRkFycmF5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGQXJyYXlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZBcnJheVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZBcnJheVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRkFycmF5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZBcnJheVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGQXJyYXlSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRkFycmF5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZBcnJheVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRkFycmF5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRkFycmF5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRkFycmF5UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGQXJyYXlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZBcnJheVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRkFycmF5UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRkFycmF5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGQXJyYXlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRkFycmF5UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGQXJyYXlSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNjkyLDEzMyArNjkyLDEzMyBAQAogI2RlZmluZSBDRk11dGFibGVBcnJheVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRk11dGFibGVBcnJheVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRk11dGFibGVBcnJheVJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRk11dGFibGVBcnJheVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGTXV0YWJsZUFycmF5UmVmIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKIH0gQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9OZXcoQ0ZNdXRhYmxlQXJyYXlSZWYgaXRzZWxmKQogewotCUNGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QsICZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVBcnJheVJlZk9iamVjdCwgJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENGTXV0YWJsZUFycmF5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGTXV0YWJsZUFycmF5UmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0ZNdXRhYmxlQXJyYXlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0ZNdXRhYmxlQXJyYXlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRk11dGFibGVBcnJheVJlZk9ial9kZWFsbG9jKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZBcnJheVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRkFycmF5UmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGlkeDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBpZHg7CiAjaWZuZGVmIENGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWR4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZBcnJheVJlbW92ZVZhbHVlQXRJbmRleChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZHgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5UmVtb3ZlQWxsVmFsdWVzKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGQXJyYXlSZW1vdmVBbGxWYWx1ZXMKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlQWxsVmFsdWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5UmVtb3ZlQWxsVmFsdWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkFycmF5UmVtb3ZlQWxsVmFsdWVzKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZBcnJheVJlbW92ZUFsbFZhbHVlcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheUV4Y2hhbmdlVmFsdWVzQXRJbmRpY2VzKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGlkeDE7Ci0JQ0ZJbmRleCBpZHgyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGlkeDE7CisgICAgQ0ZJbmRleCBpZHgyOwogI2lmbmRlZiBDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZHgxLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWR4MikpCi0JCXJldHVybiBOVUxMOwotCUNGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkeDIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4Mik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlBcHBlbmRBcnJheShDRk11dGFibGVBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZBcnJheVJlZiBvdGhlckFycmF5OwotCUNGUmFuZ2Ugb3RoZXJSYW5nZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBvdGhlckFycmF5OworICAgIENGUmFuZ2Ugb3RoZXJSYW5nZTsKICNpZm5kZWYgQ0ZBcnJheUFwcGVuZEFycmF5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUFwcGVuZEFycmF5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5QXBwZW5kQXJyYXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJm90aGVyQXJyYXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJm90aGVyUmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkFycmF5QXBwZW5kQXJyYXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgb3RoZXJBcnJheSwKLQkgICAgICAgICAgICAgICAgICAgb3RoZXJSYW5nZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZvdGhlckFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZvdGhlclJhbmdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZBcnJheUFwcGVuZEFycmF5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIG90aGVyQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgIG90aGVyUmFuZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGTXV0YWJsZUFycmF5UmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheVJlbW92ZVZhbHVlQXRJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBpZHgpIC0+IE5vbmUiKX0sCi0JeyJDRkFycmF5UmVtb3ZlQWxsVmFsdWVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlSZW1vdmVBbGxWYWx1ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggaWR4MSwgQ0ZJbmRleCBpZHgyKSAtPiBOb25lIil9LAotCXsiQ0ZBcnJheUFwcGVuZEFycmF5IiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlBcHBlbmRBcnJheSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZBcnJheVJlZiBvdGhlckFycmF5LCBDRlJhbmdlIG90aGVyUmFuZ2UpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4IiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggaWR4KSAtPiBOb25lIil9LAorICAgIHsiQ0ZBcnJheVJlbW92ZUFsbFZhbHVlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5UmVtb3ZlQWxsVmFsdWVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheUV4Y2hhbmdlVmFsdWVzQXRJbmRpY2VzLCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGlkeDEsIENGSW5kZXggaWR4MikgLT4gTm9uZSIpfSwKKyAgICB7IkNGQXJyYXlBcHBlbmRBcnJheSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5QXBwZW5kQXJyYXksIDEsCisgICAgIFB5RG9jX1NUUigiKENGQXJyYXlSZWYgb3RoZXJBcnJheSwgQ0ZSYW5nZSBvdGhlclJhbmdlKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRk11dGFibGVBcnJheVJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTgyNiwxMDAgKzgyNiwxMDAgQEAKIAogc3RhdGljIGludCBDRk11dGFibGVBcnJheVJlZk9ial9jb21wYXJlKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmLCBDRk11dGFibGVBcnJheVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRk11dGFibGVBcnJheVJlZk9ial9yZXByKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlQXJyYXlSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVBcnJheVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRk11dGFibGVBcnJheVJlZk9ial9oYXNoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRk11dGFibGVBcnJheVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVBcnJheVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZNdXRhYmxlQXJyYXlSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRk11dGFibGVBcnJheVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGTXV0YWJsZUFycmF5UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGTXV0YWJsZUFycmF5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRk11dGFibGVBcnJheVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGTXV0YWJsZUFycmF5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRk11dGFibGVBcnJheVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGTXV0YWJsZUFycmF5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRk11dGFibGVBcnJheVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGTXV0YWJsZUFycmF5UmVmIC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTkzMiw4NiArOTMyLDg2IEBACiAjZGVmaW5lIENGRGljdGlvbmFyeVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRkRpY3Rpb25hcnlSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRkRpY3Rpb25hcnlSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRkRpY3Rpb25hcnlSZWYgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDRkRpY3Rpb25hcnlSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRkRpY3Rpb25hcnlSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KENGRGljdGlvbmFyeVJlZiBpdHNlbGYpCiB7Ci0JQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0LCAmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRkRpY3Rpb25hcnlSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRkRpY3Rpb25hcnlSZWZPYmplY3QsICZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGRGljdGlvbmFyeVJlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCiAKLQlpZiAoIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2RlYWxsb2MoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NGRGljdGlvbmFyeUNyZWF0ZUNvcHkoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRpY3Rpb25hcnlSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRpY3Rpb25hcnlSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlHZXRDb3VudChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKICNpZm5kZWYgQ0ZEaWN0aW9uYXJ5R2V0Q291bnQKLQlQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlHZXRDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5R2V0Q291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGljdGlvbmFyeUdldENvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlHZXRDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGRGljdGlvbmFyeVJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRkRpY3Rpb25hcnlDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlDcmVhdGVDb3B5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkRpY3Rpb25hcnlSZWYgX3J2KSIpfSwKLQl7IkNGRGljdGlvbmFyeUdldENvdW50IiwgKFB5Q0Z1bmN0aW9uKUNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlHZXRDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZEaWN0aW9uYXJ5Q3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRkRpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5Q3JlYXRlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCisgICAgeyJDRkRpY3Rpb25hcnlHZXRDb3VudCIsIChQeUNGdW5jdGlvbilDRkRpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5R2V0Q291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTAxOSwxMDAgKzEwMTksMTAwIEBACiAKIHN0YXRpYyBpbnQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2NvbXBhcmUoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmLCBDRkRpY3Rpb25hcnlSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZEaWN0aW9uYXJ5UmVmT2JqX3JlcHIoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZEaWN0aW9uYXJ5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8Q0ZEaWN0aW9uYXJ5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGRGljdGlvbmFyeVJlZk9ial9oYXNoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRkRpY3Rpb25hcnlSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGRGljdGlvbmFyeVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRkRpY3Rpb25hcnlSZWZPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGljdGlvbmFyeVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGRGljdGlvbmFyeVJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDRkRpY3Rpb25hcnlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZEaWN0aW9uYXJ5UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGRGljdGlvbmFyeVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZEaWN0aW9uYXJ5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDRkRpY3Rpb25hcnlSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZEaWN0aW9uYXJ5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGRGljdGlvbmFyeVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDRkRpY3Rpb25hcnlSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRkRpY3Rpb25hcnlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDRkRpY3Rpb25hcnlSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRkRpY3Rpb25hcnlSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRkRpY3Rpb25hcnlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDRkRpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRkRpY3Rpb25hcnlSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENGRGljdGlvbmFyeVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRkRpY3Rpb25hcnlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENGRGljdGlvbmFyeVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGRGljdGlvbmFyeVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENGRGljdGlvbmFyeVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRkRpY3Rpb25hcnlSZWYgLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTExMjUsNzAgKzExMjUsNzAgQEAKICNkZWZpbmUgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX05ldyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGl0c2VsZikKIHsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCwgJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0LCAmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGRGljdGlvbmFyeVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMKLQlQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGljdGlvbmFyeVJlbW92ZUFsbFZhbHVlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTExOTYsMTAwICsxMTk2LDEwMCBAQAogCiBzdGF0aWMgaW50IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfY29tcGFyZShDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfcmVwcihDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNwcmludGYoYnVmLCAiPENGTXV0YWJsZURpY3Rpb25hcnlSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9oYXNoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCi0JcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLworICAgIHJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKIH0KIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRk11dGFibGVEaWN0aW9uYXJ5UmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIC0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzMDIsMTI0ICsxMzAyLDEyNCBAQAogI2RlZmluZSBDRkRhdGFSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZEYXRhUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGRGF0YVJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0ZEYXRhUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZEYXRhUmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZEYXRhUmVmIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKIH0gQ0ZEYXRhUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX05ldyhDRkRhdGFSZWYgaXRzZWxmKQogewotCUNGRGF0YVJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGRGF0YVJlZk9iamVjdCwgJkNGRGF0YVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZEYXRhUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZEYXRhUmVmT2JqZWN0LCAmQ0ZEYXRhUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENGRGF0YVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRkRhdGFSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCWlmIChQeVN0cmluZ19DaGVjayh2KSkgewotCSAgICBjaGFyICpjU3RyOwotCSAgICBQeV9zc2l6ZV90IGNMZW47Ci0JICAgIGlmKCBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgJmNTdHIsICZjTGVuKSA8IDAgKSByZXR1cm4gMDsKLQkgICAgKnBfaXRzZWxmID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLCAodW5zaWduZWQgY2hhciAqKWNTdHIsIGNMZW4pOwotCSAgICByZXR1cm4gMTsKLQl9CisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICBjaGFyICpjU3RyOworICAgICAgICBQeV9zc2l6ZV90IGNMZW47CisgICAgICAgIGlmKCBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodiwgJmNTdHIsICZjTGVuKSA8IDAgKSByZXR1cm4gMDsKKyAgICAgICAgKnBfaXRzZWxmID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLCAodW5zaWduZWQgY2hhciAqKWNTdHIsIGNMZW4pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQlpZiAoIUNGRGF0YVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRhdGFSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZEYXRhUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGRGF0YVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRkRhdGFSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZEYXRhUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZEYXRhUmVmT2JqX2RlYWxsb2MoQ0ZEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX0NGRGF0YUNyZWF0ZUNvcHkoQ0ZEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRhdGFSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRhdGFDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGF0YVJlZk9ial9DRkRhdGFHZXRMZW5ndGgoQ0ZEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBfcnY7CiAjaWZuZGVmIENGRGF0YUdldExlbmd0aAotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUdldExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhR2V0TGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFHZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGF0YUdldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRkRhdGFSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVGcm9tRXh0ZXJuYWxSZXByZXNlbnRhdGlvbihDRkRhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUZyb21FeHRlcm5hbFJlcHJlc2VudGF0aW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGF0YVJlZk9ial9DRkRhdGFHZXREYXRhKENGRGF0YVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IHNpemUgPSBDRkRhdGFHZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JY2hhciAqZGF0YSA9IChjaGFyICopQ0ZEYXRhR2V0Qnl0ZVB0cihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpbnQgc2l6ZSA9IENGRGF0YUdldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBjaGFyICpkYXRhID0gKGNoYXIgKilDRkRhdGFHZXRCeXRlUHRyKF9zZWxmLT5vYl9pdHNlbGYpOwogCi0JX3JlcyA9IChQeU9iamVjdCAqKVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIF9yZXMgPSAoUHlPYmplY3QgKilQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBzaXplKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZEYXRhUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGRGF0YUNyZWF0ZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGRGF0YUNyZWF0ZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZEYXRhR2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRkRhdGFHZXRMZW5ndGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZEYXRhR2V0RGF0YSIsIChQeUNGdW5jdGlvbilDRkRhdGFSZWZPYmpfQ0ZEYXRhR2V0RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc3RyaW5nIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkRhdGFDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRkRhdGFDcmVhdGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUdldExlbmd0aCIsIChQeUNGdW5jdGlvbilDRkRhdGFSZWZPYmpfQ0ZEYXRhR2V0TGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZUZyb21FeHRlcm5hbFJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRlN0cmluZ0NyZWF0ZUZyb21FeHRlcm5hbFJlcHJlc2VudGF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUdldERhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGRGF0YUdldERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHN0cmluZyBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRkRhdGFSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xNDI3LDEwMCArMTQyNywxMDAgQEAKIAogc3RhdGljIGludCBDRkRhdGFSZWZPYmpfY29tcGFyZShDRkRhdGFSZWZPYmplY3QgKnNlbGYsIENGRGF0YVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRkRhdGFSZWZPYmpfcmVwcihDRkRhdGFSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRkRhdGFSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRkRhdGFSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZEYXRhUmVmT2JqX2hhc2goQ0ZEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGRGF0YVJlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZEYXRhUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRkRhdGFSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkRhdGFSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkRhdGFSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZEYXRhUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGRGF0YVJlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZEYXRhUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRkRhdGFSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZEYXRhUmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGRGF0YVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRkRhdGFSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRkRhdGFSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRkRhdGFSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZEYXRhUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRkRhdGFSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGRGF0YVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRkRhdGFSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZEYXRhUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGRGF0YVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZEYXRhUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGRGF0YVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGRGF0YVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGRGF0YVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGRGF0YVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGRGF0YVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRkRhdGFSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGRGF0YVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZEYXRhUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGRGF0YVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRkRhdGFSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZEYXRhUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRkRhdGFSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZEYXRhUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZEYXRhUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGRGF0YVJlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTUzMywxNTggKzE1MzMsMTU4IEBACiAjZGVmaW5lIENGTXV0YWJsZURhdGFSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRk11dGFibGVEYXRhUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRk11dGFibGVEYXRhUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZNdXRhYmxlRGF0YVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGTXV0YWJsZURhdGFSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRk11dGFibGVEYXRhUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9OZXcoQ0ZNdXRhYmxlRGF0YVJlZiBpdHNlbGYpCiB7Ci0JQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGTXV0YWJsZURhdGFSZWZPYmplY3QsICZDRk11dGFibGVEYXRhUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRk11dGFibGVEYXRhUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCwgJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZNdXRhYmxlRGF0YVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRk11dGFibGVEYXRhUmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRk11dGFibGVEYXRhUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRk11dGFibGVEYXRhUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRk11dGFibGVEYXRhUmVmT2JqX2RlYWxsb2MoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKLQl7Ci0JCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7Ci0JCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JfQotCUNGRGF0YVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRkRhdGFSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhU2V0TGVuZ3RoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggbGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGxlbmd0aDsKICNpZm5kZWYgQ0ZEYXRhU2V0TGVuZ3RoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhU2V0TGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFTZXRMZW5ndGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkRhdGFTZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkRhdGFTZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFJbmNyZWFzZUxlbmd0aChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGV4dHJhTGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGV4dHJhTGVuZ3RoOwogI2lmbmRlZiBDRkRhdGFJbmNyZWFzZUxlbmd0aAotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUluY3JlYXNlTGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFJbmNyZWFzZUxlbmd0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhTGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZEYXRhSW5jcmVhc2VMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBleHRyYUxlbmd0aCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFMZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkRhdGFJbmNyZWFzZUxlbmd0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhTGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFBcHBlbmRCeXRlcyhDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyICpieXRlc19faW5fXzsKLQlsb25nIGJ5dGVzX19sZW5fXzsKLQlpbnQgYnl0ZXNfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjaGFyICpieXRlc19faW5fXzsKKyAgICBsb25nIGJ5dGVzX19sZW5fXzsKKyAgICBpbnQgYnl0ZXNfX2luX2xlbl9fOwogI2lmbmRlZiBDRkRhdGFBcHBlbmRCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUFwcGVuZEJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFBcHBlbmRCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZieXRlc19faW5fXywgJmJ5dGVzX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKLQlDRkRhdGFBcHBlbmRCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGJ5dGVzX19pbl9fLCBieXRlc19fbGVuX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc19faW5fXywgJmJ5dGVzX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBDRkRhdGFBcHBlbmRCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX19pbl9fLCBieXRlc19fbGVuX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YVJlcGxhY2VCeXRlcyhDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOwotCXVuc2lnbmVkIGNoYXIgKm5ld0J5dGVzX19pbl9fOwotCWxvbmcgbmV3Qnl0ZXNfX2xlbl9fOwotCWludCBuZXdCeXRlc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgcmFuZ2U7CisgICAgdW5zaWduZWQgY2hhciAqbmV3Qnl0ZXNfX2luX187CisgICAgbG9uZyBuZXdCeXRlc19fbGVuX187CisgICAgaW50IG5ld0J5dGVzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZEYXRhUmVwbGFjZUJ5dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhUmVwbGFjZUJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFSZXBsYWNlQnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3Qnl0ZXNfX2luX18sICZuZXdCeXRlc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQluZXdCeXRlc19fbGVuX18gPSBuZXdCeXRlc19faW5fbGVuX187Ci0JQ0ZEYXRhUmVwbGFjZUJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICAgICBuZXdCeXRlc19faW5fXywgbmV3Qnl0ZXNfX2xlbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3Qnl0ZXNfX2luX18sICZuZXdCeXRlc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXdCeXRlc19fbGVuX18gPSBuZXdCeXRlc19faW5fbGVuX187CisgICAgQ0ZEYXRhUmVwbGFjZUJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdCeXRlc19faW5fXywgbmV3Qnl0ZXNfX2xlbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFEZWxldGVCeXRlcyhDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlJhbmdlIHJhbmdlOwogI2lmbmRlZiBDRkRhdGFEZWxldGVCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGRGF0YURlbGV0ZUJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFEZWxldGVCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZEYXRhRGVsZXRlQnl0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICByYW5nZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkRhdGFEZWxldGVCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHJhbmdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRk11dGFibGVEYXRhUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGRGF0YVNldExlbmd0aCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YVNldExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsZW5ndGgpIC0+IE5vbmUiKX0sCi0JeyJDRkRhdGFJbmNyZWFzZUxlbmd0aCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YUluY3JlYXNlTGVuZ3RoLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGV4dHJhTGVuZ3RoKSAtPiBOb25lIil9LAotCXsiQ0ZEYXRhQXBwZW5kQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFBcHBlbmRCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzKSAtPiBOb25lIil9LAotCXsiQ0ZEYXRhUmVwbGFjZUJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhUmVwbGFjZUJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlLCBCdWZmZXIgbmV3Qnl0ZXMpIC0+IE5vbmUiKX0sCi0JeyJDRkRhdGFEZWxldGVCeXRlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YURlbGV0ZUJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZEYXRhU2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhU2V0TGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGxlbmd0aCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGRGF0YUluY3JlYXNlTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhSW5jcmVhc2VMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggZXh0cmFMZW5ndGgpIC0+IE5vbmUiKX0sCisgICAgeyJDRkRhdGFBcHBlbmRCeXRlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YUFwcGVuZEJ5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMpIC0+IE5vbmUiKX0sCisgICAgeyJDRkRhdGFSZXBsYWNlQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFSZXBsYWNlQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UsIEJ1ZmZlciBuZXdCeXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkNGRGF0YURlbGV0ZUJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhRGVsZXRlQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGTXV0YWJsZURhdGFSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xNjkyLDEwMCArMTY5MiwxMDAgQEAKIAogc3RhdGljIGludCBDRk11dGFibGVEYXRhUmVmT2JqX2NvbXBhcmUoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqc2VsZiwgQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRk11dGFibGVEYXRhUmVmT2JqX3JlcHIoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGTXV0YWJsZURhdGFSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVEYXRhUmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGTXV0YWJsZURhdGFSZWZPYmpfaGFzaChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGTXV0YWJsZURhdGFSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGTXV0YWJsZURhdGFSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIENGTXV0YWJsZURhdGFSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVEYXRhUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGTXV0YWJsZURhdGFSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZURhdGFSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDRk11dGFibGVEYXRhUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGTXV0YWJsZURhdGFSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRk11dGFibGVEYXRhUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ0ZNdXRhYmxlRGF0YVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRk11dGFibGVEYXRhUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRk11dGFibGVEYXRhUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDRk11dGFibGVEYXRhUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGTXV0YWJsZURhdGFSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZNdXRhYmxlRGF0YVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDRk11dGFibGVEYXRhUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRk11dGFibGVEYXRhUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGTXV0YWJsZURhdGFSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDRk11dGFibGVEYXRhUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZNdXRhYmxlRGF0YVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGTXV0YWJsZURhdGFSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDRk11dGFibGVEYXRhUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRk11dGFibGVEYXRhUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENGTXV0YWJsZURhdGFSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZNdXRhYmxlRGF0YVJlZiAtLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNzk4LDYzNiArMTc5OCw2MzYgQEAKICNkZWZpbmUgQ0ZTdHJpbmdSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZTdHJpbmdSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ0ZTdHJpbmdSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGU3RyaW5nUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZTdHJpbmdSZWYgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDRlN0cmluZ1JlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGU3RyaW5nUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfTmV3KENGU3RyaW5nUmVmIGl0c2VsZikKIHsKLQlDRlN0cmluZ1JlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGU3RyaW5nUmVmT2JqZWN0LCAmQ0ZTdHJpbmdSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGU3RyaW5nUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZTdHJpbmdSZWZPYmplY3QsICZDRlN0cmluZ1JlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlN0cmluZ1JlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JICAgIGNoYXIgKmNTdHI7Ci0JICAgIGlmICghUHlBcmdfUGFyc2UodiwgImVzIiwgImFzY2lpIiwgJmNTdHIpKQotCSAgICAgICAgcmV0dXJuIDA7Ci0JICAgICAgICAqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLCBjU3RyLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKTsKLQkJUHlNZW1fRnJlZShjU3RyKTsKLQkgICAgICAgIHJldHVybiAxOwotCX0KLQlpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JICAgICAgICAvKiBXZSB1c2UgdGhlIENGIHR5cGVzIGhlcmUsIGlmIFB5dGhvbiB3YXMgY29uZmlndXJlZCBkaWZmZXJlbnRseSB0aGF0IHdpbGwgZ2l2ZSBhbiBlcnJvciAqLwotCSAgICAgICAgQ0ZJbmRleCBzaXplID0gUHlVbmljb2RlX0dldFNpemUodik7Ci0JICAgICAgICBVbmlDaGFyICp1bmljaGFycyA9IFB5VW5pY29kZV9Bc1VuaWNvZGUodik7Ci0JICAgICAgICBpZiAoIXVuaWNoYXJzKSByZXR1cm4gMDsKLQkgICAgICAgICpwX2l0c2VsZiA9IENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoKENGQWxsb2NhdG9yUmVmKU5VTEwsIHVuaWNoYXJzLCBzaXplKTsKLQkgICAgICAgIHJldHVybiAxOwotCX0KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgIGNoYXIgKmNTdHI7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UodiwgImVzIiwgImFzY2lpIiwgJmNTdHIpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgKnBfaXRzZWxmID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgY1N0ciwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSk7CisgICAgICAgIFB5TWVtX0ZyZWUoY1N0cik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIC8qIFdlIHVzZSB0aGUgQ0YgdHlwZXMgaGVyZSwgaWYgUHl0aG9uIHdhcyBjb25maWd1cmVkIGRpZmZlcmVudGx5IHRoYXQgd2lsbCBnaXZlIGFuIGVycm9yICovCisgICAgICAgIENGSW5kZXggc2l6ZSA9IFB5VW5pY29kZV9HZXRTaXplKHYpOworICAgICAgICBVbmlDaGFyICp1bmljaGFycyA9IFB5VW5pY29kZV9Bc1VuaWNvZGUodik7CisgICAgICAgIGlmICghdW5pY2hhcnMpIHJldHVybiAwOworICAgICAgICAqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLCB1bmljaGFycywgc2l6ZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAogCi0JaWYgKCFDRlN0cmluZ1JlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlN0cmluZ1JlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRlN0cmluZ1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRlN0cmluZ1JlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlN0cmluZ1JlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRlN0cmluZ1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGU3RyaW5nUmVmT2JqX2RlYWxsb2MoQ0ZTdHJpbmdSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICB9CisgICAgQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZVdpdGhTdWJzdHJpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlJhbmdlIHJhbmdlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhTdWJzdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGUmFuZ2UgcmFuZ2U7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQ29weShDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMZW5ndGgoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRMZW5ndGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEJ5dGVzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IF9ydjsKLQlDRlJhbmdlIHJhbmdlOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7Ci0JVUludDggbG9zc0J5dGU7Ci0JQm9vbGVhbiBpc0V4dGVybmFsUmVwcmVzZW50YXRpb247Ci0JVUludDggYnVmZmVyOwotCUNGSW5kZXggbWF4QnVmTGVuOwotCUNGSW5kZXggdXNlZEJ1ZkxlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBfcnY7CisgICAgQ0ZSYW5nZSByYW5nZTsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFVJbnQ4IGxvc3NCeXRlOworICAgIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uOworICAgIFVJbnQ4IGJ1ZmZlcjsKKyAgICBDRkluZGV4IG1heEJ1ZkxlbjsKKyAgICBDRkluZGV4IHVzZWRCdWZMZW47CiAjaWZuZGVmIENGU3RyaW5nR2V0Qnl0ZXMKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldEJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldEJ5dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb3NzQnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heEJ1ZkxlbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0Qnl0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICBsb3NzQnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZMZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAmdXNlZEJ1Zkxlbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKLQkgICAgICAgICAgICAgICAgICAgICB1c2VkQnVmTGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9zc0J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0V4dGVybmFsUmVwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhCdWZMZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldEJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc0J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsUmVwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZWRCdWZMZW4pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZEJ1Zkxlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7Ci0JVUludDggbG9zc0J5dGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb3NzQnl0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlRXh0ZXJuYWxSZXByZXNlbnRhdGlvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc3NCeXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBVSW50OCBsb3NzQnl0ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvc3NCeXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc0J5dGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nRW5jb2RpbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CiAjaWZuZGVmIENGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0dldEZhc3Rlc3RFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDb21wYXJlV2l0aE9wdGlvbnMoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGQ29tcGFyaXNvblJlc3VsdCBfcnY7Ci0JQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMjsKLQlDRlJhbmdlIHJhbmdlVG9Db21wYXJlOwotCUNGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQ29tcGFyaXNvblJlc3VsdCBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMjsKKyAgICBDRlJhbmdlIHJhbmdlVG9Db21wYXJlOworICAgIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CiAjaWZuZGVmIENGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb21wYXJlV2l0aE9wdGlvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRoZVN0cmluZzIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9Db21wYXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb0NvbXBhcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRoZVN0cmluZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9Db21wYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb0NvbXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29tcGFyZShDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZDb21wYXJpc29uUmVzdWx0IF9ydjsKLQlDRlN0cmluZ1JlZiB0aGVTdHJpbmcyOwotCUNGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQ29tcGFyaXNvblJlc3VsdCBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMjsKKyAgICBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zOwogI2lmbmRlZiBDRlN0cmluZ0NvbXBhcmUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbXBhcmUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29tcGFyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nMiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDb21wYXJlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCi0JICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDb21wYXJlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyhDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kOwotCUNGUmFuZ2UgcmFuZ2VUb1NlYXJjaDsKLQlDRk9wdGlvbkZsYWdzIHNlYXJjaE9wdGlvbnM7Ci0JQ0ZSYW5nZSByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZDsKKyAgICBDRlJhbmdlIHJhbmdlVG9TZWFyY2g7CisgICAgQ0ZPcHRpb25GbGFncyBzZWFyY2hPcHRpb25zOworICAgIENGUmFuZ2UgcmVzdWx0OwogI2lmbmRlZiBDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRmluZFdpdGhPcHRpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9TZWFyY2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hPcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb1NlYXJjaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgcmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9TZWFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb1NlYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQ7Ci0JQ0ZSYW5nZSByYW5nZVRvU2VhcmNoOwotCUNGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc3RyaW5nVG9GaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZVRvU2VhcmNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvRmluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlVG9TZWFyY2gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlT3B0aW9ucyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kOworICAgIENGUmFuZ2UgcmFuZ2VUb1NlYXJjaDsKKyAgICBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN0cmluZ1RvRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2VUb1NlYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVBcnJheVdpdGhGaW5kUmVzdWx0cygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVRvU2VhcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdGaW5kKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIF9ydjsKLQlDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQ7Ci0JQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZSYW5nZSBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kOworICAgIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CiAjaWZuZGVmIENGU3RyaW5nRmluZAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRmluZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdGaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wYXJlT3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nRmluZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wYXJlT3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nRmluZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdUb0ZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzUHJlZml4KENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlDRlN0cmluZ1JlZiBwcmVmaXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIHByZWZpeDsKICNpZm5kZWYgQ0ZTdHJpbmdIYXNQcmVmaXgKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0hhc1ByZWZpeCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdIYXNQcmVmaXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcHJlZml4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdIYXNQcmVmaXgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnByZWZpeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nSGFzUHJlZml4KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0hhc1N1ZmZpeChDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgc3VmZml4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBzdWZmaXg7CiAjaWZuZGVmIENGU3RyaW5nSGFzU3VmZml4Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdIYXNTdWZmaXgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nSGFzU3VmZml4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN1ZmZpeCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nSGFzU3VmZml4KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdWZmaXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0hhc1N1ZmZpeChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMaW5lQm91bmRzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOwotCUNGSW5kZXggbGluZUJlZ2luSW5kZXg7Ci0JQ0ZJbmRleCBsaW5lRW5kSW5kZXg7Ci0JQ0ZJbmRleCBjb250ZW50c0VuZEluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlJhbmdlIHJhbmdlOworICAgIENGSW5kZXggbGluZUJlZ2luSW5kZXg7CisgICAgQ0ZJbmRleCBsaW5lRW5kSW5kZXg7CisgICAgQ0ZJbmRleCBjb250ZW50c0VuZEluZGV4OwogI2lmbmRlZiBDRlN0cmluZ0dldExpbmVCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldExpbmVCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TGluZUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdHZXRMaW5lQm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGluZUJlZ2luSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaW5lRW5kSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50c0VuZEluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBsaW5lQmVnaW5JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgY29udGVudHNFbmRJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nR2V0TGluZUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbmVCZWdpbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGluZUVuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudHNFbmRJbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUJlZ2luSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzRW5kSW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQXJyYXlCeVNlcGFyYXRpbmdTdHJpbmdzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBzZXBhcmF0b3JTdHJpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc2VwYXJhdG9yU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVBcnJheUJ5U2VwYXJhdGluZ1N0cmluZ3MoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGQXJyYXlSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzZXBhcmF0b3JTdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvclN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEludFZhbHVlKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldEludFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRJbnRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRJbnRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRJbnRWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRJbnRWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldERvdWJsZVZhbHVlKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlkb3VibGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBkb3VibGUgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldERvdWJsZVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU2hvd1N0cihDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDRlNob3dTdHIKLQlQeU1hY19QUkVDSEVDSyhDRlNob3dTdHIpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU2hvd1N0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTaG93U3RyKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTaG93U3RyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhTdHJpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlVSTFJlZiBiYXNlVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlV2l0aFN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBDRlVSTFJlZiBiYXNlVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlV2l0aFN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXRoU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZTsKKyAgICBCb29sZWFuIGlzRGlyZWN0b3J5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoUmVsYXRpdmVUb0Jhc2UoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlDRlVSTFJlZiBiYXNlVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0aFN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmJhc2VVUkwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7CisgICAgQm9vbGVhbiBpc0RpcmVjdG9yeTsKKyAgICBDRlVSTFJlZiBiYXNlVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmJhc2VVUkwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlU3RyaW5nQnlSZXBsYWNpbmdQZXJjZW50RXNjYXBlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVN0cmluZ0J5UmVwbGFjaW5nUGVyY2VudEVzY2FwZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQ7Ci0JQ0ZTdHJpbmdSZWYgbGVnYWxVUkxDaGFyYWN0ZXJzVG9CZUVzY2FwZWQ7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZVVuZXNjYXBlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQ7CisgICAgQ0ZTdHJpbmdSZWYgbGVnYWxVUkxDaGFyYWN0ZXJzVG9CZUVzY2FwZWQ7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZVVuZXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U3RyaW5nKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpbnQgc2l6ZSA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpKzE7Ci0JY2hhciAqZGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICBpbnQgc2l6ZSA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpKzE7CisgICAgY2hhciAqZGF0YSA9IG1hbGxvYyhzaXplKTsKIAotCWlmKCBkYXRhID09IE5VTEwgKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIENGU3RyaW5nR2V0Q1N0cmluZyhfc2VsZi0+b2JfaXRzZWxmLCBkYXRhLCBzaXplLCAwKSApIHsKLQkgICAgICAgIF9yZXMgPSAoUHlPYmplY3QgKilQeVN0cmluZ19Gcm9tU3RyaW5nKGRhdGEpOwotCX0gZWxzZSB7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ0ZTdHJpbmdHZXRDU3RyaW5nIGNvdWxkIG5vdCBmaXQgdGhlIHN0cmluZyIpOwotCSAgICAgICAgX3JlcyA9IE5VTEw7Ci0JfQotCWZyZWUoZGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYoIGRhdGEgPT0gTlVMTCApIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICggQ0ZTdHJpbmdHZXRDU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUsIDApICkgeworICAgICAgICBfcmVzID0gKFB5T2JqZWN0ICopUHlTdHJpbmdfRnJvbVN0cmluZyhkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ0ZTdHJpbmdHZXRDU3RyaW5nIGNvdWxkIG5vdCBmaXQgdGhlIHN0cmluZyIpOworICAgICAgICBfcmVzID0gTlVMTDsKKyAgICB9CisgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0VW5pY29kZShDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKSsxOwotCVB5X1VOSUNPREUgKmRhdGEgPSBtYWxsb2Moc2l6ZSpzaXplb2YoUHlfVU5JQ09ERSkpOwotCUNGUmFuZ2UgcmFuZ2U7CisgICAgaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKSsxOworICAgIFB5X1VOSUNPREUgKmRhdGEgPSBtYWxsb2Moc2l6ZSpzaXplb2YoUHlfVU5JQ09ERSkpOworICAgIENGUmFuZ2UgcmFuZ2U7CiAKLQlyYW5nZS5sb2NhdGlvbiA9IDA7Ci0JcmFuZ2UubGVuZ3RoID0gc2l6ZTsKLQlpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKF9zZWxmLT5vYl9pdHNlbGYsIHJhbmdlLCBkYXRhKTsKLQlfcmVzID0gKFB5T2JqZWN0ICopUHlVbmljb2RlX0Zyb21Vbmljb2RlKGRhdGEsIHNpemUtMSk7Ci0JZnJlZShkYXRhKTsKLQlyZXR1cm4gX3JlczsKKyAgICByYW5nZS5sb2NhdGlvbiA9IDA7CisgICAgcmFuZ2UubGVuZ3RoID0gc2l6ZTsKKyAgICBpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKF9zZWxmLT5vYl9pdHNlbGYsIHJhbmdlLCBkYXRhKTsKKyAgICBfcmVzID0gKFB5T2JqZWN0ICopUHlVbmljb2RlX0Zyb21Vbmljb2RlKGRhdGEsIHNpemUtMSk7CisgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZTdHJpbmdSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoU3Vic3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVDb3B5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMZW5ndGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgVUludDggbG9zc0J5dGUsIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uLCBDRkluZGV4IG1heEJ1ZkxlbikgLT4gKENGSW5kZXggX3J2LCBVSW50OCBidWZmZXIsIENGSW5kZXggdXNlZEJ1ZkxlbikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUV4dGVybmFsUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBVSW50OCBsb3NzQnl0ZSkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0aGVTdHJpbmcyLCBDRlJhbmdlIHJhbmdlVG9Db21wYXJlLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZDb21wYXJpc29uUmVzdWx0IF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbXBhcmUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDb21wYXJlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0aGVTdHJpbmcyLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZDb21wYXJpc29uUmVzdWx0IF9ydikiKX0sCi0JeyJDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kLCBDRlJhbmdlIHJhbmdlVG9TZWFyY2gsIENGT3B0aW9uRmxhZ3Mgc2VhcmNoT3B0aW9ucykgLT4gKEJvb2xlYW4gX3J2LCBDRlJhbmdlIHJlc3VsdCkiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQXJyYXlXaXRoRmluZFJlc3VsdHMsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZCwgQ0ZSYW5nZSByYW5nZVRvU2VhcmNoLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdGaW5kIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nRmluZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZSYW5nZSBfcnYpIil9LAotCXsiQ0ZTdHJpbmdIYXNQcmVmaXgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdIYXNQcmVmaXgsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHByZWZpeCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGU3RyaW5nSGFzU3VmZml4IiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzU3VmZml4LCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBzdWZmaXgpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldExpbmVCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMaW5lQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiAoQ0ZJbmRleCBsaW5lQmVnaW5JbmRleCwgQ0ZJbmRleCBsaW5lRW5kSW5kZXgsIENGSW5kZXggY29udGVudHNFbmRJbmRleCkiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc2VwYXJhdG9yU3RyaW5nKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRJbnRWYWx1ZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEludFZhbHVlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0RG91YmxlVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU2hvd1N0ciIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlNob3dTdHIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNGVVJMQ3JlYXRlV2l0aFN0cmluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoUmVsYXRpdmVUb0Jhc2UsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSwgQm9vbGVhbiBpc0RpcmVjdG9yeSwgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZVN0cmluZ0J5UmVwbGFjaW5nUGVyY2VudEVzY2FwZXMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlU3RyaW5nQnlBZGRpbmdQZXJjZW50RXNjYXBlcywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQsIENGU3RyaW5nUmVmIGxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U3RyaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzdHJpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0VW5pY29kZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFVuaWNvZGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuaWNvZGUgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZVdpdGhTdWJzdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0TGVuZ3RoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0Qnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIFVJbnQ4IGxvc3NCeXRlLCBCb29sZWFuIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwgQ0ZJbmRleCBtYXhCdWZMZW4pIC0+IChDRkluZGV4IF9ydiwgVUludDggYnVmZmVyLCBDRkluZGV4IHVzZWRCdWZMZW4pIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgVUludDggbG9zc0J5dGUpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMiwgQ0ZSYW5nZSByYW5nZVRvQ29tcGFyZSwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGQ29tcGFyaXNvblJlc3VsdCBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb21wYXJlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29tcGFyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nMiwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGQ29tcGFyaXNvblJlc3VsdCBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZCwgQ0ZSYW5nZSByYW5nZVRvU2VhcmNoLCBDRk9wdGlvbkZsYWdzIHNlYXJjaE9wdGlvbnMpIC0+IChCb29sZWFuIF9ydiwgQ0ZSYW5nZSByZXN1bHQpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVBcnJheVdpdGhGaW5kUmVzdWx0cyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQsIENGUmFuZ2UgcmFuZ2VUb1NlYXJjaCwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nRmluZCIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZCwgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9ucykgLT4gKENGUmFuZ2UgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nSGFzUHJlZml4IiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzUHJlZml4LCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBwcmVmaXgpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0hhc1N1ZmZpeCIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0hhc1N1ZmZpeCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3VmZml4KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRMaW5lQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0TGluZUJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSkgLT4gKENGSW5kZXggbGluZUJlZ2luSW5kZXgsIENGSW5kZXggbGluZUVuZEluZGV4LCBDRkluZGV4IGNvbnRlbnRzRW5kSW5kZXgpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVBcnJheUJ5U2VwYXJhdGluZ1N0cmluZ3MiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVBcnJheUJ5U2VwYXJhdGluZ1N0cmluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZykgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0SW50VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRJbnRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldERvdWJsZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0RG91YmxlVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb252ZXJ0SUFOQUNoYXJTZXROYW1lVG9FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCisgICAgeyJDRlNob3dTdHIiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTaG93U3RyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDRlVSTENyZWF0ZVdpdGhTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBiYXNlVVJMKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGUsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhSZWxhdGl2ZVRvQmFzZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGUsIEJvb2xlYW4gaXNEaXJlY3RvcnksIENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlU3RyaW5nQnlSZXBsYWNpbmdQZXJjZW50RXNjYXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlU3RyaW5nQnlBZGRpbmdQZXJjZW50RXNjYXBlcyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLCBDRlN0cmluZ1JlZiBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZCwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldFN0cmluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc3RyaW5nIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldFVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRVbmljb2RlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bmljb2RlIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGU3RyaW5nUmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMjQzNSwxMDAgKzI0MzUsMTAwIEBACiAKIHN0YXRpYyBpbnQgQ0ZTdHJpbmdSZWZPYmpfY29tcGFyZShDRlN0cmluZ1JlZk9iamVjdCAqc2VsZiwgQ0ZTdHJpbmdSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZTdHJpbmdSZWZPYmpfcmVwcihDRlN0cmluZ1JlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGU3RyaW5nUmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8Q0ZTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZTdHJpbmdSZWZPYmpfaGFzaChDRlN0cmluZ1JlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRlN0cmluZ1JlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZTdHJpbmdSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIENGU3RyaW5nUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGU3RyaW5nUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRlN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZTdHJpbmdSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZTdHJpbmdSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRlN0cmluZ1JlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGU3RyaW5nUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRlN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGU3RyaW5nUmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGU3RyaW5nUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGU3RyaW5nUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZTdHJpbmdSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRlN0cmluZ1JlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRlN0cmluZ1JlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZTdHJpbmdSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGU3RyaW5nUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGU3RyaW5nUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGU3RyaW5nUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGU3RyaW5nUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRlN0cmluZ1JlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRlN0cmluZ1JlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGU3RyaW5nUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZTdHJpbmdSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRlN0cmluZ1JlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGU3RyaW5nUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGU3RyaW5nUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRlN0cmluZ1JlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZTdHJpbmdSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZTdHJpbmdSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZTdHJpbmdSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGU3RyaW5nUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGU3RyaW5nUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZTdHJpbmdSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRlN0cmluZ1JlZiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNTQxLDI4MSArMjU0MSwyODEgQEAKICNkZWZpbmUgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGTXV0YWJsZVN0cmluZ1JlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGTXV0YWJsZVN0cmluZ1JlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcoQ0ZNdXRhYmxlU3RyaW5nUmVmIGl0c2VsZikKIHsKLQlDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVTdHJpbmdSZWZPYmplY3QsICZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCwgJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZNdXRhYmxlU3RyaW5nUmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZVN0cmluZ1JlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZVN0cmluZ1JlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRk11dGFibGVTdHJpbmdSZWZPYmpfZGVhbGxvYyhDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlN0cmluZ1JlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRlN0cmluZ1JlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgYXBwZW5kZWRTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIGFwcGVuZGVkU3RyaW5nOwogI2lmbmRlZiBDRlN0cmluZ0FwcGVuZAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0FwcGVuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBlbmRlZFN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nQXBwZW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgYXBwZW5kZWRTdHJpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBlbmRlZFN0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nQXBwZW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgYXBwZW5kZWRTdHJpbmcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVW5pQ2hhciAqY2hhcnNfX2luX187Ci0JVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKLQlpbnQgY2hhcnNfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVbmlDaGFyICpjaGFyc19faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgY2hhcnNfX2xlbl9fOworICAgIGludCBjaGFyc19faW5fbGVuX187CiAjaWZuZGVmIENGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzX19pbl9fLCAmY2hhcnNfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2hhcnNfX2xlbl9fID0gY2hhcnNfX2luX2xlbl9fOwotCUNGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc19faW5fXywgY2hhcnNfX2xlbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187CisgICAgQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmcoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgcFN0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgcFN0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBTdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kQ1N0cmluZyhDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIqIGNTdHI7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciogY1N0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0FwcGVuZENTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0FwcGVuZENTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kQ1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ0FwcGVuZENTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ0FwcGVuZENTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdJbnNlcnQoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IGlkeDsKLQlDRlN0cmluZ1JlZiBpbnNlcnRlZFN0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBpZHg7CisgICAgQ0ZTdHJpbmdSZWYgaW5zZXJ0ZWRTdHI7CiAjaWZuZGVmIENGU3RyaW5nSW5zZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdJbnNlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nSW5zZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZHgsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbnNlcnRlZFN0cikpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nSW5zZXJ0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgaWR4LAotCSAgICAgICAgICAgICAgIGluc2VydGVkU3RyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluc2VydGVkU3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdJbnNlcnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpZHgsCisgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRTdHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdEZWxldGUoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIHJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlJhbmdlIHJhbmdlOwogI2lmbmRlZiBDRlN0cmluZ0RlbGV0ZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRGVsZXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0RlbGV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdEZWxldGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICByYW5nZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ0RlbGV0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHJhbmdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZShDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGUmFuZ2UgcmFuZ2U7Ci0JQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgcmFuZ2U7CisgICAgQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQ7CiAjaWZuZGVmIENGU3RyaW5nUmVwbGFjZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nUmVwbGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdSZXBsYWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnJlcGxhY2VtZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdSZXBsYWNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIHJhbmdlLAotCSAgICAgICAgICAgICAgICByZXBsYWNlbWVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnJlcGxhY2VtZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdSZXBsYWNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1JlcGxhY2VBbGwoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiByZXBsYWNlbWVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQ7CiAjaWZuZGVmIENGU3RyaW5nUmVwbGFjZUFsbAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nUmVwbGFjZUFsbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdSZXBsYWNlQWxsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnJlcGxhY2VtZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdSZXBsYWNlQWxsKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcmVwbGFjZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ1JlcGxhY2VBbGwoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdQYWQoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBwYWRTdHJpbmc7Ci0JQ0ZJbmRleCBsZW5ndGg7Ci0JQ0ZJbmRleCBpbmRleEludG9QYWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIHBhZFN0cmluZzsKKyAgICBDRkluZGV4IGxlbmd0aDsKKyAgICBDRkluZGV4IGluZGV4SW50b1BhZDsKICNpZm5kZWYgQ0ZTdHJpbmdQYWQKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ1BhZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdQYWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYWRTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleEludG9QYWQpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ1BhZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIHBhZFN0cmluZywKLQkgICAgICAgICAgICBsZW5ndGgsCi0JICAgICAgICAgICAgaW5kZXhJbnRvUGFkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYWRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleEludG9QYWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ1BhZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIHBhZFN0cmluZywKKyAgICAgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgaW5kZXhJbnRvUGFkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nVHJpbShDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIHRyaW1TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIHRyaW1TdHJpbmc7CiAjaWZuZGVmIENGU3RyaW5nVHJpbQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nVHJpbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdUcmltKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRyaW1TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ1RyaW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgdHJpbVN0cmluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRyaW1TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ1RyaW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgdHJpbVN0cmluZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW1XaGl0ZXNwYWNlKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nVHJpbVdoaXRlc3BhY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGU3RyaW5nQXBwZW5kIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwZW5kZWRTdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ0FwcGVuZENoYXJhY3RlcnMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiBOb25lIil9LAotCXsiQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcFN0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gTm9uZSIpfSwKLQl7IkNGU3RyaW5nQXBwZW5kQ1N0cmluZyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRDU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiBOb25lIil9LAotCXsiQ0ZTdHJpbmdJbnNlcnQiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nSW5zZXJ0LCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGlkeCwgQ0ZTdHJpbmdSZWYgaW5zZXJ0ZWRTdHIpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ0RlbGV0ZSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1JlcGxhY2UiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSwgQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1JlcGxhY2VBbGwiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZUFsbCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1BhZCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdQYWQsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHBhZFN0cmluZywgQ0ZJbmRleCBsZW5ndGgsIENGSW5kZXggaW5kZXhJbnRvUGFkKSAtPiBOb25lIil9LAotCXsiQ0ZTdHJpbmdUcmltIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW0sIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHRyaW1TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW1XaGl0ZXNwYWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRlN0cmluZ0FwcGVuZCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGVuZGVkU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZENoYXJhY3RlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBjaGFycykgLT4gTm9uZSIpfSwKKyAgICB7IkNGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHBTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDRlN0cmluZ0FwcGVuZENTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kQ1N0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2hhciogY1N0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gTm9uZSIpfSwKKyAgICB7IkNGU3RyaW5nSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0luc2VydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBpZHgsIENGU3RyaW5nUmVmIGluc2VydGVkU3RyKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdEZWxldGUiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nRGVsZXRlLCAxLAorICAgICBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdSZXBsYWNlIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1JlcGxhY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UsIENGU3RyaW5nUmVmIHJlcGxhY2VtZW50KSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdSZXBsYWNlQWxsIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1JlcGxhY2VBbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHJlcGxhY2VtZW50KSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdQYWQiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUGFkLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBwYWRTdHJpbmcsIENGSW5kZXggbGVuZ3RoLCBDRkluZGV4IGluZGV4SW50b1BhZCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGU3RyaW5nVHJpbSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdUcmltLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0cmltU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRk11dGFibGVTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0yODIzLDEwMCArMjgyMywxMDAgQEAKIAogc3RhdGljIGludCBDRk11dGFibGVTdHJpbmdSZWZPYmpfY29tcGFyZShDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKnNlbGYsIENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRk11dGFibGVTdHJpbmdSZWZPYmpfcmVwcihDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2hhc2goQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZNdXRhYmxlU3RyaW5nUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRk11dGFibGVTdHJpbmdSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGTXV0YWJsZVN0cmluZ1JlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRk11dGFibGVTdHJpbmdSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRk11dGFibGVTdHJpbmdSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRk11dGFibGVTdHJpbmdSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGTXV0YWJsZVN0cmluZ1JlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZNdXRhYmxlU3RyaW5nUmVmIC0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjkyOSw1NDUgKzI5MjksNTQ1IEBACiAjZGVmaW5lIENGVVJMUmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGVVJMUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGVVJMUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRlVSTFJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGVVJMUmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZVUkxSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRlVSTFJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGVVJMUmVmT2JqX05ldyhDRlVSTFJlZiBpdHNlbGYpCiB7Ci0JQ0ZVUkxSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRlVSTFJlZk9iamVjdCwgJkNGVVJMUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRlVSTFJlZk9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENGVVJMUmVmT2JqZWN0LCAmQ0ZVUkxSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZVUkxSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZVUkxSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRlVSTFJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlVSTFJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRlVSTFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRlVSTFJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRlVSTFJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRlVSTFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGVVJMUmVmT2JqX2RlYWxsb2MoQ0ZVUkxSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICB9CisgICAgQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENyZWF0ZURhdGEoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGF0YVJlZiBfcnY7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKLQlCb29sZWFuIGVzY2FwZVdoaXRlc3BhY2U7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZlc2NhcGVXaGl0ZXNwYWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlV2hpdGVzcGFjZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRhdGFSZWYgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgQm9vbGVhbiBlc2NhcGVXaGl0ZXNwYWNlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXNjYXBlV2hpdGVzcGFjZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlRGF0YSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZVdoaXRlc3BhY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQm9vbGVhbiByZXNvbHZlQWdhaW5zdEJhc2U7Ci0JVUludDggYnVmZmVyOwotCUNGSW5kZXggbWF4QnVmTGVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBCb29sZWFuIHJlc29sdmVBZ2FpbnN0QmFzZTsKKyAgICBVSW50OCBidWZmZXI7CisgICAgQ0ZJbmRleCBtYXhCdWZMZW47CiAjaWZuZGVmIENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBZ2FpbnN0QmFzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heEJ1ZkxlbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFnYWluc3RCYXNlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmTGVuKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBZ2FpbnN0QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heEJ1ZkxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFnYWluc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmTGVuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUFic29sdXRlVVJMKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5QWJzb2x1dGVVUkwKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlBYnNvbHV0ZVVSTCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5QWJzb2x1dGVVUkwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUFic29sdXRlVVJMKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlBYnNvbHV0ZVVSTChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEdldFN0cmluZyhDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CiAjaWZuZGVmIENGVVJMR2V0U3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0U3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTEdldFN0cmluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxHZXRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRCYXNlVVJMKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxHZXRCYXNlVVJMCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRCYXNlVVJMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTEdldEJhc2VVUkwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0QmFzZVVSTChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxHZXRCYXNlVVJMKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ2FuQmVEZWNvbXBvc2VkKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIENGVVJMQ2FuQmVEZWNvbXBvc2VkCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDYW5CZURlY29tcG9zZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ2FuQmVEZWNvbXBvc2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENhbkJlRGVjb21wb3NlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDYW5CZURlY29tcG9zZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U2NoZW1lKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5U2NoZW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5U2NoZW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlTY2hlbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVNjaGVtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5U2NoZW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weU5ldExvY2F0aW9uKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5TmV0TG9jYXRpb24KLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlOZXRMb2NhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5TmV0TG9jYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weU5ldExvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlOZXRMb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlQYXRoKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UGF0aAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U3RyaWN0UGF0aChDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUJvb2xlYW4gaXNBYnNvbHV0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIEJvb2xlYW4gaXNBYnNvbHV0ZTsKICNpZm5kZWYgQ0ZVUkxDb3B5U3RyaWN0UGF0aAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVN0cmljdFBhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVN0cmljdFBhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVN0cmljdFBhdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0Fic29sdXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpc0Fic29sdXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5U3RyaWN0UGF0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzQWJzb2x1dGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZVUkxQYXRoU3R5bGUgcGF0aFN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZVUkxQYXRoU3R5bGUgcGF0aFN0eWxlOwogI2lmbmRlZiBDRlVSTENvcHlGaWxlU3lzdGVtUGF0aAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlGaWxlU3lzdGVtUGF0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhdGhTdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhTdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEhhc0RpcmVjdG9yeVBhdGgoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTEhhc0RpcmVjdG9yeVBhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMSGFzRGlyZWN0b3J5UGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVJlc291cmNlU3BlY2lmaWVyKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVJlc291cmNlU3BlY2lmaWVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlIb3N0TmFtZShDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CiAjaWZuZGVmIENGVVJMQ29weUhvc3ROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5SG9zdE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUhvc3ROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENvcHlIb3N0TmFtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5SG9zdE5hbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRQb3J0TnVtYmVyKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBDRlVSTEdldFBvcnROdW1iZXIKLQlQeU1hY19QUkVDSEVDSyhDRlVSTEdldFBvcnROdW1iZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0UG9ydE51bWJlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxHZXRQb3J0TnVtYmVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTEdldFBvcnROdW1iZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5VXNlck5hbWUoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlVc2VyTmFtZQotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVVzZXJOYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlVc2VyTmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5VXNlck5hbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVVzZXJOYW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVBhc3N3b3JkKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UGFzc3dvcmQKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlQYXNzd29yZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGFzc3dvcmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhc3N3b3JkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlQYXNzd29yZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlQYXJhbWV0ZXJTdHJpbmcoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7CiAjaWZuZGVmIENGVVJMQ29weVBhcmFtZXRlclN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhcmFtZXRlclN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhcmFtZXRlclN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVBhcmFtZXRlclN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVF1ZXJ5U3RyaW5nKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOwogI2lmbmRlZiBDRlVSTENvcHlRdWVyeVN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVF1ZXJ5U3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlRdWVyeVN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENvcHlRdWVyeVN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5UXVlcnlTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUZyYWdtZW50KENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOwogI2lmbmRlZiBDRlVSTENvcHlGcmFnbWVudAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUZyYWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlGcmFnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENvcHlGcmFnbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5RnJhZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50KENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlQYXRoRXh0ZW5zaW9uKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGhFeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhdGhFeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVBhdGhFeHRlbnNpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVBhdGhFeHRlbnNpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudChDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCUNGU3RyaW5nUmVmIHBhdGhDb21wb25lbnQ7Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcGF0aENvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudCgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoQ29tcG9uZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgcGF0aENvbXBvbmVudDsKKyAgICBCb29sZWFuIGlzRGlyZWN0b3J5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYXRoQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudChDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24oQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBleHRlbnNpb247Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmZXh0ZW5zaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aEV4dGVuc2lvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgZXh0ZW5zaW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmV4dGVuc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24oQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdQYXRoRXh0ZW5zaW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMR2V0RlNSZWYoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUZTUmVmIGZzUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBGU1JlZiBmc1JlZjsKICNpZm5kZWYgQ0ZVUkxHZXRGU1JlZgotCVB5TWFjX1BSRUNIRUNLKENGVVJMR2V0RlNSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0RlNSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0RlNSZWYoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZmc1JlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZmc1JlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMR2V0RlNSZWYoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmc1JlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZmc1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRlVSTFJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRlVSTENyZWF0ZURhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVEYXRhLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBCb29sZWFuIGVzY2FwZVdoaXRlc3BhY2UpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKLQl7IkNGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIHJlc29sdmVBZ2FpbnN0QmFzZSwgQ0ZJbmRleCBtYXhCdWZMZW4pIC0+IChCb29sZWFuIF9ydiwgVUludDggYnVmZmVyKSIpfSwKLQl7IkNGVVJMQ29weUFic29sdXRlVVJMIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUFic29sdXRlVVJMLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxHZXRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTEdldEJhc2VVUkwiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRCYXNlVVJMLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxDYW5CZURlY29tcG9zZWQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDYW5CZURlY29tcG9zZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGVVJMQ29weVNjaGVtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlTY2hlbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTENvcHlOZXRMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlOZXRMb2NhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVN0cmljdFBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U3RyaWN0UGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2LCBCb29sZWFuIGlzQWJzb2x1dGUpIil9LAotCXsiQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTEhhc0RpcmVjdG9yeVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllciIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weUhvc3ROYW1lIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUhvc3ROYW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxHZXRQb3J0TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0UG9ydE51bWJlciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJDRlVSTENvcHlVc2VyTmFtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlVc2VyTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVBhc3N3b3JkIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhc3N3b3JkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhcmFtZXRlclN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVF1ZXJ5U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVF1ZXJ5U3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5RnJhZ21lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5RnJhZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVBhdGhFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgcGF0aENvbXBvbmVudCwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGV4dGVuc2lvbikgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdQYXRoRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxHZXRGU1JlZiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldEZTUmVmLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgRlNSZWYgZnNSZWYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZVUkxDcmVhdGVEYXRhIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgQm9vbGVhbiBlc2NhcGVXaGl0ZXNwYWNlKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiByZXNvbHZlQWdhaW5zdEJhc2UsIENGSW5kZXggbWF4QnVmTGVuKSAtPiAoQm9vbGVhbiBfcnYsIFVJbnQ4IGJ1ZmZlcikiKX0sCisgICAgeyJDRlVSTENvcHlBYnNvbHV0ZVVSTCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlBYnNvbHV0ZVVSTCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxHZXRCYXNlVVJMIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0QmFzZVVSTCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ2FuQmVEZWNvbXBvc2VkIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ2FuQmVEZWNvbXBvc2VkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlTY2hlbWUiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U2NoZW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5TmV0TG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5TmV0TG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlTdHJpY3RQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVN0cmljdFBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydiwgQm9vbGVhbiBpc0Fic29sdXRlKSIpfSwKKyAgICB7IkNGVVJMQ29weUZpbGVTeXN0ZW1QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUZpbGVTeXN0ZW1QYXRoLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGUpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMSGFzRGlyZWN0b3J5UGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlIb3N0TmFtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlIb3N0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0UG9ydE51bWJlciIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldFBvcnROdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5VXNlck5hbWUiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5VXNlck5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlQYXNzd29yZCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlQYXNzd29yZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weVBhcmFtZXRlclN0cmluZyIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlQYXJhbWV0ZXJTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlRdWVyeVN0cmluZyIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlRdWVyeVN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weUZyYWdtZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUZyYWdtZW50LCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlQYXRoRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhdGhFeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHBhdGhDb21wb25lbnQsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aEV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBleHRlbnNpb24pIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdQYXRoRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nUGF0aEV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0RlNSZWYiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRGU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEZTUmVmIGZzUmVmKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZVUkxSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zNDc1LDEwMCArMzQ3NSwxMDAgQEAKIAogc3RhdGljIGludCBDRlVSTFJlZk9ial9jb21wYXJlKENGVVJMUmVmT2JqZWN0ICpzZWxmLCBDRlVSTFJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRlVSTFJlZk9ial9yZXByKENGVVJMUmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZVUkwgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRlVSTCBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRlVSTFJlZk9ial9oYXNoKENGVVJMUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGVVJMUmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRlVSTFJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZVUkxSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZVUkxSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGVVJMUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRlVSTFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRlVSTFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGVVJMUmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRlVSTFJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZVUkxSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGVVJMUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRlVSTFJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZVUkxSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZVUkxSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZVUkxSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRlVSTFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGVVJMUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGVVJMUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRlVSTFJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZVUkxSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZVUkxSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZVUkxSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZVUkxSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGVVJMUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGVVJMUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZVUkxSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRlVSTFJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGVVJMUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZVUkxSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZVUkxSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGVVJMUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRlVSTFJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRlVSTFJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRlVSTFJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRlVSTFJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZVUkxSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZVUkxSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRlVSTFJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZVUkxSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTM1NzYsMTI1MCArMzU3NiwxMjUwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfX19DRlJhbmdlTWFrZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZSYW5nZSBfcnY7Ci0JQ0ZJbmRleCBsb2M7Ci0JQ0ZJbmRleCBsZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgX3J2OworICAgIENGSW5kZXggbG9jOworICAgIENGSW5kZXggbGVuOwogI2lmbmRlZiBfX0NGUmFuZ2VNYWtlCi0JUHlNYWNfUFJFQ0hFQ0soX19DRlJhbmdlTWFrZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soX19DRlJhbmdlTWFrZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBfX0NGUmFuZ2VNYWtlKGxvYywKLQkgICAgICAgICAgICAgICAgICAgIGxlbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBfX0NGUmFuZ2VNYWtlKGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkFsbG9jYXRvckdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGQWxsb2NhdG9yR2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZBbGxvY2F0b3JHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQWxsb2NhdG9yR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkFsbG9jYXRvckdldFR5cGVJRCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkFsbG9jYXRvckdldFR5cGVJRCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OwotCUNGSW5kZXggc2l6ZTsKLQlDRk9wdGlvbkZsYWdzIGhpbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OworICAgIENGSW5kZXggc2l6ZTsKKyAgICBDRk9wdGlvbkZsYWdzIGhpbnQ7CiAjaWZuZGVmIENGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUKLQlQeU1hY19QUkVDSEVDSyhDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZBbGxvY2F0b3JHZXRQcmVmZXJyZWRTaXplRm9yU2l6ZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlR5cGVJRCB0eXBlX2lkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZUeXBlSUQgdHlwZV9pZDsKICNpZm5kZWYgQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhDRkNvcHlUeXBlSUREZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2lkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24odHlwZV9pZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlX2lkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24odHlwZV9pZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZBcnJheUdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGQXJyYXlHZXRUeXBlSUQKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5R2V0VHlwZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5R2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkFycmF5R2V0VHlwZUlEKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQXJyYXlHZXRUeXBlSUQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkFycmF5Q3JlYXRlTXV0YWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZUFycmF5UmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OwogI2lmbmRlZiBDRkFycmF5Q3JlYXRlTXV0YWJsZQotCVB5TWFjX1BSRUNIRUNLKENGQXJyYXlDcmVhdGVNdXRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5Q3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZBcnJheUNyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVBcnJheVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQXJyYXlDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7Ci0JQ0ZBcnJheVJlZiB0aGVBcnJheTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2OworICAgIENGSW5kZXggY2FwYWNpdHk7CisgICAgQ0ZBcnJheVJlZiB0aGVBcnJheTsKICNpZm5kZWYgQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZ0aGVBcnJheSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFycmF5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZUFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJnRoZUFycmF5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXJyYXkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGRGF0YUdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGRGF0YUdldFR5cGVJRAotCVB5TWFjX1BSRUNIRUNLKENGRGF0YUdldFR5cGVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFHZXRUeXBlSUQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZEYXRhR2V0VHlwZUlEKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEYXRhQ3JlYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCXVuc2lnbmVkIGNoYXIgKmJ5dGVzX19pbl9fOwotCWxvbmcgYnl0ZXNfX2xlbl9fOwotCWludCBieXRlc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187CisgICAgbG9uZyBieXRlc19fbGVuX187CisgICAgaW50IGJ5dGVzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZEYXRhQ3JlYXRlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZEYXRhQ3JlYXRlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCXVuc2lnbmVkIGNoYXIgKmJ5dGVzX19pbl9fOwotCWxvbmcgYnl0ZXNfX2xlbl9fOwotCWludCBieXRlc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187CisgICAgbG9uZyBieXRlc19fbGVuX187CisgICAgaW50IGJ5dGVzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX19pbl9fLCAmYnl0ZXNfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnl0ZXNfX2xlbl9fID0gYnl0ZXNfX2luX2xlbl9fOworICAgIF9ydiA9IENGRGF0YUNyZWF0ZVdpdGhCeXRlc05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfX2luX18sIGJ5dGVzX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGQWxsb2NhdG9yUmVmKU5VTEwpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkRhdGFDcmVhdGVNdXRhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVEYXRhUmVmIF9ydjsKLQlDRkluZGV4IGNhcGFjaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVEYXRhUmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OwogI2lmbmRlZiBDRkRhdGFDcmVhdGVNdXRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlTXV0YWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZURhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRhdGFDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGTXV0YWJsZURhdGFSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7Ci0JQ0ZEYXRhUmVmIHRoZURhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZURhdGFSZWYgX3J2OworICAgIENGSW5kZXggY2FwYWNpdHk7CisgICAgQ0ZEYXRhUmVmIHRoZURhdGE7CiAjaWZuZGVmIENGRGF0YUNyZWF0ZU11dGFibGVDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGF0YUNyZWF0ZU11dGFibGVDb3B5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX0NvbnZlcnQsICZ0aGVEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVEYXRhUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9Db252ZXJ0LCAmdGhlRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGF0YUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGljdGlvbmFyeUdldFR5cGVJRCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKLQlDRkluZGV4IGNhcGFjaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OwogI2lmbmRlZiBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKLQlDRkluZGV4IGNhcGFjaXR5OwotCUNGRGljdGlvbmFyeVJlZiB0aGVEaWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydjsKKyAgICBDRkluZGV4IGNhcGFjaXR5OworICAgIENGRGljdGlvbmFyeVJlZiB0aGVEaWN0OwogI2lmbmRlZiBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weQotCVB5TWFjX1BSRUNIRUNLKENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0LCAmdGhlRGljdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURpY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCwgJnRoZURpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEaWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVHlwZVJlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYga2V5OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nUmVmIGtleTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIEJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OwotCUNGU3RyaW5nUmVmIGtleTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIEJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGVHlwZVJlZiB2YWx1ZTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBrZXk7CisgICAgQ0ZUeXBlUmVmIHZhbHVlOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlKGtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfQ29udmVydCwgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZShrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiBzdWl0ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHN1aXRlSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN1aXRlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwKGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc3VpdGVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAoYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7Ci0JQ0ZTdHJpbmdSZWYgc3VpdGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBDRlN0cmluZ1JlZiBzdWl0ZUlEOwogI2lmbmRlZiBDRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHApOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdWl0ZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwKGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdWl0ZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwKGFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUoYXBwbGljYXRpb25JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZShhcHBsaWNhdGlvbklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzQ29weVZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVSZWYgX3J2OwotCUNGU3RyaW5nUmVmIGtleTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUNGU3RyaW5nUmVmIHVzZXJOYW1lOwotCUNGU3RyaW5nUmVmIGhvc3ROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHVzZXJOYW1lOworICAgIENGU3RyaW5nUmVmIGhvc3ROYW1lOwogI2lmbmRlZiBDRlByZWZlcmVuY2VzQ29weVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5VmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5VmFsdWUoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzQ29weU11bHRpcGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRpY3Rpb25hcnlSZWYgX3J2OwotCUNGQXJyYXlSZWYga2V5c1RvRmV0Y2g7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIF9ydjsKKyAgICBDRkFycmF5UmVmIGtleXNUb0ZldGNoOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weU11bHRpcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weU11bHRpcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAma2V5c1RvRmV0Y2gsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUoa2V5c1RvRmV0Y2gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAma2V5c1RvRmV0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUoa2V5c1RvRmV0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNTZXRWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGVHlwZVJlZiB2YWx1ZTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUNGU3RyaW5nUmVmIHVzZXJOYW1lOwotCUNGU3RyaW5nUmVmIGhvc3ROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBrZXk7CisgICAgQ0ZUeXBlUmVmIHZhbHVlOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNTZXRWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTZXRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1NldFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAma2V5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfQ29udmVydCwgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaG9zdE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlByZWZlcmVuY2VzU2V0VmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGUHJlZmVyZW5jZXNTZXRWYWx1ZShrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGljdGlvbmFyeVJlZiBrZXlzVG9TZXQ7Ci0JQ0ZBcnJheVJlZiBrZXlzVG9SZW1vdmU7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIGtleXNUb1NldDsKKyAgICBDRkFycmF5UmVmIGtleXNUb1JlbW92ZTsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHVzZXJOYW1lOworICAgIENGU3RyaW5nUmVmIGhvc3ROYW1lOwogI2lmbmRlZiBDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZrZXlzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJmtleXNUb1JlbW92ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlKGtleXNUb1NldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1RvUmVtb3ZlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZrZXlzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJmtleXNUb1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlKGtleXNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c1RvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzU3luY2hyb25pemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7Ci0JQ0ZTdHJpbmdSZWYgdXNlck5hbWU7Ci0JQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZShhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZShhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0KHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZBcnJheVJlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBDRlN0cmluZ1JlZiB1c2VyTmFtZTsKKyAgICBDRlN0cmluZ1JlZiBob3N0TmFtZTsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUtleUxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0KGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaG9zdE5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlByZWZlcmVuY2VzQ29weUtleUxpc3QoYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nR2V0VHlwZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRUeXBlSUQKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldFR5cGVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0VHlwZUlEKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nR2V0VHlwZUlEKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JU3RyMjU1IHBTdHI7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIFN0cjI1NSBwU3RyOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JY2hhciogY1N0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgY2hhciogY1N0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JVW5pQ2hhciAqY2hhcnNfX2luX187Ci0JVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKLQlpbnQgY2hhcnNfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgVW5pQ2hhciAqY2hhcnNfX2luX187CisgICAgVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKKyAgICBpbnQgY2hhcnNfX2luX2xlbl9fOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaGFyc19faW5fXywgJmNoYXJzX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWNoYXJzX19sZW5fXyA9IGNoYXJzX19pbl9sZW5fXzsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNfX2luX18sIGNoYXJzX19sZW5fXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCVN0cjI1NSBwU3RyOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBTdHIyNTUgcFN0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmdOb0NvcHkKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmdOb0NvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBTdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRkFsbG9jYXRvclJlZilOVUxMKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRkFsbG9jYXRvclJlZilOVUxMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JY2hhciogY1N0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgY2hhciogY1N0cjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1N0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGQWxsb2NhdG9yUmVmKU5VTEwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCVVuaUNoYXIgKmNoYXJzX19pbl9fOwotCVVuaUNoYXJDb3VudCBjaGFyc19fbGVuX187Ci0JaW50IGNoYXJzX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIFVuaUNoYXIgKmNoYXJzX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBjaGFyc19fbGVuX187CisgICAgaW50IGNoYXJzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQljaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVTdHJpbmdSZWYgX3J2OwotCUNGSW5kZXggbWF4TGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVTdHJpbmdSZWYgX3J2OworICAgIENGSW5kZXggbWF4TGVuZ3RoOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZU11dGFibGUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZU11dGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlTXV0YWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heExlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhMZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGTXV0YWJsZVN0cmluZ1JlZiBfcnY7Ci0JQ0ZJbmRleCBtYXhMZW5ndGg7Ci0JQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVTdHJpbmdSZWYgX3J2OworICAgIENGSW5kZXggbWF4TGVuZ3RoOworICAgIENGU3RyaW5nUmVmIHRoZVN0cmluZzsKICNpZm5kZWYgQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heExlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRoZVN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187Ci0JbG9uZyBieXRlc19fbGVuX187Ci0JaW50IGJ5dGVzX19pbl9sZW5fXzsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCUJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187CisgICAgbG9uZyBieXRlc19fbGVuX187CisgICAgaW50IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX19pbl9fLCAmYnl0ZXNfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0V4dGVybmFsUmVwcmVzZW50YXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfX2luX18sIGJ5dGVzX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsUmVwcmVzZW50YXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nRW5jb2RpbmcgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IF9ydjsKLQlDRkluZGV4IGxlbmd0aDsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKKyAgICBDRkluZGV4IGxlbmd0aDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyhsZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyhsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUoZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldE5hbWVPZkVuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb05TU3RyaW5nRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZyhlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBfcnY7Ci0JVUludDMyIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBVSW50MzIgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyhlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKLQlVSW50MzIgY29kZXBhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nRW5jb2RpbmcgX3J2OworICAgIFVJbnQzMiBjb2RlcGFnZTsKICNpZm5kZWYgQ0ZTdHJpbmdDb252ZXJ0V2luZG93c0NvZGVwYWdlVG9FbmNvZGluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2RlcGFnZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcoY29kZXBhZ2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZXBhZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nKGNvZGVwYWdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZShlbmNvZGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TW9zdENvbXBhdGlibGVNYWNTdHJpbmdFbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nKGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9fX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JY2hhciogY1N0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIGNoYXIqIGNTdHI7CiAjaWZuZGVmIF9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhfX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhfX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY1N0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IF9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcoY1N0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjU3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZyhjU3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlVSTEdldFR5cGVJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlSUQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVJRCBfcnY7CiAjaWZuZGVmIENGVVJMR2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0VHlwZUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTEdldFR5cGVJRCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTEdldFR5cGVJRCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqVVJMQnl0ZXNfX2luX187Ci0JbG9uZyBVUkxCeXRlc19fbGVuX187Ci0JaW50IFVSTEJ5dGVzX19pbl9sZW5fXzsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCUNGVVJMUmVmIGJhc2VVUkw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpVUkxCeXRlc19faW5fXzsKKyAgICBsb25nIFVSTEJ5dGVzX19sZW5fXzsKKyAgICBpbnQgVVJMQnl0ZXNfX2luX2xlbl9fOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgQ0ZVUkxSZWYgYmFzZVVSTDsKICNpZm5kZWYgQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENyZWF0ZVdpdGhCeXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmVVJMQnl0ZXNfX2luX18sICZVUkxCeXRlc19faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCi0JCXJldHVybiBOVUxMOwotCVVSTEJ5dGVzX19sZW5fXyA9IFVSTEJ5dGVzX19pbl9sZW5fXzsKLQlfcnYgPSBDRlVSTENyZWF0ZVdpdGhCeXRlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxCeXRlc19faW5fXywgVVJMQnl0ZXNfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlVSTEJ5dGVzX19pbl9fLCAmVVJMQnl0ZXNfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmJhc2VVUkwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVUkxCeXRlc19fbGVuX18gPSBVUkxCeXRlc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMQnl0ZXNfX2luX18sIFVSTEJ5dGVzX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXJfX2luX187Ci0JbG9uZyBidWZmZXJfX2xlbl9fOwotCWludCBidWZmZXJfX2luX2xlbl9fOwotCUJvb2xlYW4gaXNEaXJlY3Rvcnk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXJfX2luX187CisgICAgbG9uZyBidWZmZXJfX2xlbl9fOworICAgIGludCBidWZmZXJfX2luX2xlbl9fOworICAgIEJvb2xlYW4gaXNEaXJlY3Rvcnk7CiAjaWZuZGVmIENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbgotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJfX2luX18sICZidWZmZXJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlidWZmZXJfX2xlbl9fID0gYnVmZmVyX19pbl9sZW5fXzsKLQlfcnYgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9faW5fXywgYnVmZmVyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJfX2luX18sICZidWZmZXJfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWZmZXJfX2xlbl9fID0gYnVmZmVyX19pbl9sZW5fXzsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9faW5fXywgYnVmZmVyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyX19pbl9fOwotCWxvbmcgYnVmZmVyX19sZW5fXzsKLQlpbnQgYnVmZmVyX19pbl9sZW5fXzsKLQlCb29sZWFuIGlzRGlyZWN0b3J5OwotCUNGVVJMUmVmIGJhc2VVUkw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmZXJfX2luX187CisgICAgbG9uZyBidWZmZXJfX2xlbl9fOworICAgIGludCBidWZmZXJfX2luX2xlbl9fOworICAgIEJvb2xlYW4gaXNEaXJlY3Rvcnk7CisgICAgQ0ZVUkxSZWYgYmFzZVVSTDsKICNpZm5kZWYgQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyX19pbl9fLCAmYnVmZmVyX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQsICZiYXNlVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVmZmVyX19sZW5fXyA9IGJ1ZmZlcl9faW5fbGVuX187Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX19pbl9fLCBidWZmZXJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcl9faW5fXywgJmJ1ZmZlcl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ1ZmZlcl9fbGVuX18gPSBidWZmZXJfX2luX2xlbl9fOworICAgIF9ydiA9IENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9faW5fXywgYnVmZmVyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlVSTENyZWF0ZUZyb21GU1JlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCUZTUmVmIGZzUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgRlNSZWYgZnNSZWY7CiAjaWZuZGVmIENGVVJMQ3JlYXRlRnJvbUZTUmVmCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRlNSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ3JlYXRlRnJvbUZTUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZmc1JlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlRnJvbUZTUmVmKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc1JlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmZzUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVGcm9tRlNSZWYoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl90b0NGKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlDRlR5cGVSZWYgcnY7Ci0JQ0ZUeXBlSUQgdHlwZWlkOworICAgIENGVHlwZVJlZiBydjsKKyAgICBDRlR5cGVJRCB0eXBlaWQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsIFB5Q0ZfUHl0aG9uMkNGLCAmcnYpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JdHlwZWlkID0gQ0ZHZXRUeXBlSUQocnYpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgUHlDRl9QeXRob24yQ0YsICZydikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHR5cGVpZCA9IENGR2V0VHlwZUlEKHJ2KTsKIAotCWlmICh0eXBlaWQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkKLQkgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGU3RyaW5nUmVmT2JqX05ldywgcnYpOwotCWlmICh0eXBlaWQgPT0gQ0ZBcnJheUdldFR5cGVJRCgpKQotCSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZBcnJheVJlZk9ial9OZXcsIHJ2KTsKLQlpZiAodHlwZWlkID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKQotCSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldywgcnYpOwotCWlmICh0eXBlaWQgPT0gQ0ZVUkxHZXRUeXBlSUQoKSkKLQkgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGVVJMUmVmT2JqX05ldywgcnYpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBydik7CisgICAgaWYgKHR5cGVpZCA9PSBDRkFycmF5R2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGQXJyYXlSZWZPYmpfTmV3LCBydik7CisgICAgaWYgKHR5cGVpZCA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldywgcnYpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZVUkxHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZVUkxSZWZPYmpfTmV3LCBydik7CiAKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlR5cGVSZWZPYmpfTmV3LCBydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZUeXBlUmVmT2JqX05ldywgcnYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRl9tZXRob2RzW10gPSB7Ci0JeyJfX0NGUmFuZ2VNYWtlIiwgKFB5Q0Z1bmN0aW9uKUNGX19fQ0ZSYW5nZU1ha2UsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggbG9jLCBDRkluZGV4IGxlbikgLT4gKENGUmFuZ2UgX3J2KSIpfSwKLQl7IkNGQWxsb2NhdG9yR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQWxsb2NhdG9yR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZBbGxvY2F0b3JHZXRQcmVmZXJyZWRTaXplRm9yU2l6ZSIsIChQeUNGdW5jdGlvbilDRl9DRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IHNpemUsIENGT3B0aW9uRmxhZ3MgaGludCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGQ29weVR5cGVJRERlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQ29weVR5cGVJRERlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihDRlR5cGVJRCB0eXBlX2lkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGQXJyYXlHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBcnJheUdldFR5cGVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKLQl7IkNGQXJyYXlDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5KSAtPiAoQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2KSIpfSwKLQl7IkNGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHksIENGQXJyYXlSZWYgdGhlQXJyYXkpIC0+IChDRk11dGFibGVBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZEYXRhR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUdldFR5cGVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKLQl7IkNGRGF0YUNyZWF0ZSIsIChQeUNGdW5jdGlvbilDRl9DRkRhdGFDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBieXRlcykgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZVdpdGhCeXRlc05vQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRhdGFDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZU11dGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRhdGFDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkRhdGFDcmVhdGVNdXRhYmxlQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZEYXRhUmVmIHRoZURhdGEpIC0+IChDRk11dGFibGVEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRpY3Rpb25hcnlHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5KSAtPiAoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBfcnYpIil9LAotCXsiQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHksIENGRGljdGlvbmFyeVJlZiB0aGVEaWN0KSAtPiAoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChDRlR5cGVSZWYgX3J2KSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiAoQm9vbGVhbiBfcnYsIEJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0dldEFwcEludGVnZXJWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChDRkluZGV4IF9ydiwgQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCkiKX0sCi0JeyJDRlByZWZlcmVuY2VzU2V0QXBwVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGVHlwZVJlZiB2YWx1ZSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gTm9uZSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgc3VpdGVJRCkgLT4gTm9uZSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHN1aXRlSUQpIC0+IE5vbmUiKX0sCi0JeyJDRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weVZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGVHlwZVJlZiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlNdWx0aXBsZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weU11bHRpcGxlLCAxLAotCSBQeURvY19TVFIoIihDRkFycmF5UmVmIGtleXNUb0ZldGNoLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IChDRkRpY3Rpb25hcnlSZWYgX3J2KSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNTZXRWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZUeXBlUmVmIHZhbHVlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IE5vbmUiKX0sCi0JeyJDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlLCAxLAotCSBQeURvY19TVFIoIihDRkRpY3Rpb25hcnlSZWYga2V5c1RvU2V0LCBDRkFycmF5UmVmIGtleXNUb1JlbW92ZSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiBOb25lIil9LAotCXsiQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weUtleUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHBTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmdOb0NvcHksIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBwU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoY2hhciogY1N0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHksIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBjaGFycykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IG1heExlbmd0aCkgLT4gKENGTXV0YWJsZVN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZU11dGFibGVDb3B5LCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IG1heExlbmd0aCwgQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nKSAtPiAoQ0ZNdXRhYmxlU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBCb29sZWFuIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbikgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggbGVuZ3RoLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAotCXsiQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBlbmNvZGluZykgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDb252ZXJ0V2luZG93c0NvZGVwYWdlVG9FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29kZXBhZ2UpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0TW9zdENvbXBhdGlibGVNYWNTdHJpbmdFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7Il9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoY2hhciogY1N0cikgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTEdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRlVSTEdldFR5cGVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlV2l0aEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlV2l0aEJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgVVJMQnl0ZXMsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ1ZmZlciwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSIsIChQeUNGdW5jdGlvbilDRl9DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ1ZmZlciwgQm9vbGVhbiBpc0RpcmVjdG9yeSwgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUZyb21GU1JlZiIsIChQeUNGdW5jdGlvbilDRl9DRlVSTENyZWF0ZUZyb21GU1JlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgZnNSZWYpIC0+IChDRlVSTFJlZiBfcnYpIil9LAotCXsidG9DRiIsIChQeUNGdW5jdGlvbilDRl90b0NGLCAxLAotCSBQeURvY19TVFIoIihweXRob25fb2JqZWN0KSAtPiAoQ0Zfb2JqZWN0KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Il9fQ0ZSYW5nZU1ha2UiLCAoUHlDRnVuY3Rpb24pQ0ZfX19DRlJhbmdlTWFrZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsb2MsIENGSW5kZXggbGVuKSAtPiAoQ0ZSYW5nZSBfcnYpIil9LAorICAgIHsiQ0ZBbGxvY2F0b3JHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBbGxvY2F0b3JHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggc2l6ZSwgQ0ZPcHRpb25GbGFncyBoaW50KSAtPiAoQ0ZJbmRleCBfcnYpIil9LAorICAgIHsiQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKENGVHlwZUlEIHR5cGVfaWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZBcnJheUdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRkFycmF5R2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZBcnJheUNyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBcnJheUNyZWF0ZU11dGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZBcnJheVJlZiB0aGVBcnJheSkgLT4gKENGTXV0YWJsZUFycmF5UmVmIF9ydikiKX0sCisgICAgeyJDRkRhdGFHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhR2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZEYXRhQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCisgICAgeyJDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5LCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUNyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhQ3JlYXRlTXV0YWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSkgLT4gKENGTXV0YWJsZURhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUNyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZU11dGFibGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5LCBDRkRhdGFSZWYgdGhlRGF0YSkgLT4gKENGTXV0YWJsZURhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGljdGlvbmFyeUdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCisgICAgeyJDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZEaWN0aW9uYXJ5UmVmIHRoZURpY3QpIC0+IChDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gKENGVHlwZVJlZiBfcnYpIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCkiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gKENGSW5kZXggX3J2LCBCb29sZWFuIGtleUV4aXN0c0FuZEhhc1ZhbGlkRm9ybWF0KSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0QXBwVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZUeXBlUmVmIHZhbHVlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiBOb25lIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiBzdWl0ZUlEKSAtPiBOb25lIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgc3VpdGVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5VmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZUeXBlUmVmIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weU11bHRpcGxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGQXJyYXlSZWYga2V5c1RvRmV0Y2gsIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGRGljdGlvbmFyeVJlZiBfcnYpIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc1NldFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNTZXRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlR5cGVSZWYgdmFsdWUsIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGRGljdGlvbmFyeVJlZiBrZXlzVG9TZXQsIENGQXJyYXlSZWYga2V5c1RvUmVtb3ZlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzU3luY2hyb25pemUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weUFwcGxpY2F0aW9uTGlzdCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weUFwcGxpY2F0aW9uTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgcFN0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGNoYXIqIGNTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgY2hhcnMpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHBTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5LCAxLAorICAgICBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlTXV0YWJsZSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZU11dGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggbWF4TGVuZ3RoKSAtPiAoQ0ZNdXRhYmxlU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggbWF4TGVuZ3RoLCBDRlN0cmluZ1JlZiB0aGVTdHJpbmcpIC0+IChDRk11dGFibGVTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsZW5ndGgsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0dldE5hbWVPZkVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2RlcGFnZSkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZyIsIChQeUNGdW5jdGlvbilDRl9fX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihjaGFyKiBjU3RyKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMR2V0VHlwZUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBVUkxCeXRlcywgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnVmZmVyLCBCb29sZWFuIGlzRGlyZWN0b3J5KSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnVmZmVyLCBCb29sZWFuIGlzRGlyZWN0b3J5LCBDRlVSTFJlZiBiYXNlVVJMKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZTUmVmLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBmc1JlZikgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJ0b0NGIiwgKFB5Q0Z1bmN0aW9uKUNGX3RvQ0YsIDEsCisgICAgIFB5RG9jX1NUUigiKHB5dGhvbl9vYmplY3QpIC0+IChDRl9vYmplY3QpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC00ODI4LDE2NSArNDgyOCwxNjUgQEAKIC8qIFJvdXRpbmVzIHRvIGNvbnZlcnQgYW55IENGIHR5cGUgdG8vZnJvbSB0aGUgY29ycmVzcG9uZGluZyBDRnh4eE9iaiAqLwogUHlPYmplY3QgKkNGT2JqX05ldyhDRlR5cGVSZWYgaXRzZWxmKQogewotICAgICAgICBpZiAoaXRzZWxmID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGQXJyYXlHZXRUeXBlSUQoKSkgcmV0dXJuIENGQXJyYXlSZWZPYmpfTmV3KChDRkFycmF5UmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldygoQ0ZEaWN0aW9uYXJ5UmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGF0YUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEYXRhUmVmT2JqX05ldygoQ0ZEYXRhUmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGU3RyaW5nR2V0VHlwZUlEKCkpIHJldHVybiBDRlN0cmluZ1JlZk9ial9OZXcoKENGU3RyaW5nUmVmKWl0c2VsZik7Ci0gICAgICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGVVJMR2V0VHlwZUlEKCkpIHJldHVybiBDRlVSTFJlZk9ial9OZXcoKENGVVJMUmVmKWl0c2VsZik7Ci0gICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBQeUNGX0NGMlB5dGhvbiBoZXJlPz8gKi8KLSAgICAgICAgcmV0dXJuIENGVHlwZVJlZk9ial9OZXcoaXRzZWxmKTsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZBcnJheUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZBcnJheVJlZk9ial9OZXcoKENGQXJyYXlSZWYpaXRzZWxmKTsKKyAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkgcmV0dXJuIENGRGljdGlvbmFyeVJlZk9ial9OZXcoKENGRGljdGlvbmFyeVJlZilpdHNlbGYpOworICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGF0YUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEYXRhUmVmT2JqX05ldygoQ0ZEYXRhUmVmKWl0c2VsZik7CisgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldygoQ0ZTdHJpbmdSZWYpaXRzZWxmKTsKKyAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRlVSTEdldFR5cGVJRCgpKSByZXR1cm4gQ0ZVUkxSZWZPYmpfTmV3KChDRlVSTFJlZilpdHNlbGYpOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBQeUNGX0NGMlB5dGhvbiBoZXJlPz8gKi8KKyAgICByZXR1cm4gQ0ZUeXBlUmVmT2JqX05ldyhpdHNlbGYpOwogfQogaW50IENGT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGVHlwZVJlZiAqcF9pdHNlbGYpCiB7CiAKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotICAgICAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotICAgICAgICBpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRkFycmF5UmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGTXV0YWJsZUFycmF5UmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGRGF0YVJlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRk11dGFibGVEYXRhUmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGU3RyaW5nUmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DaGVjayh2KSAmJgotICAgICAgICAgICAgICAgICFDRlVSTFJlZk9ial9DaGVjayh2KSApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgUHlDRl9QeXRob24yQ0YgaGVyZT8/ICovCi0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGIG9iamVjdCByZXF1aXJlZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgICpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKCFDRlR5cGVSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGQXJyYXlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGTXV0YWJsZUFycmF5UmVmT2JqX0NoZWNrKHYpICYmCisgICAgICAgICFDRkRpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGRGF0YVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZTdHJpbmdSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZVUkxSZWZPYmpfQ2hlY2sodikgKQorICAgIHsKKyAgICAgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFB5Q0ZfUHl0aG9uMkNGIGhlcmU/PyAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0Ygb2JqZWN0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGVHlwZVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIAogdm9pZCBpbml0X0NGKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZUeXBlUmVmLCBDRk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlR5cGVSZWYsIENGT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGU3RyaW5nUmVmLCBDRlN0cmluZ1JlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlN0cmluZ1JlZiwgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZBcnJheVJlZiwgQ0ZBcnJheVJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRkFycmF5UmVmLCBDRkFycmF5UmVmT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGTXV0YWJsZUFycmF5UmVmLCBDRk11dGFibGVBcnJheVJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVBcnJheVJlZiwgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiwgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVEaWN0aW9uYXJ5UmVmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVVJMUmVmLCBDRlVSTFJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlVSTFJlZiwgQ0ZVUkxSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZUeXBlUmVmLCBDRk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlR5cGVSZWYsIENGT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGVHlwZVJlZiwgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGU3RyaW5nUmVmLCBDRlN0cmluZ1JlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlN0cmluZ1JlZiwgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZNdXRhYmxlU3RyaW5nUmVmLCBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZBcnJheVJlZiwgQ0ZBcnJheVJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRkFycmF5UmVmLCBDRkFycmF5UmVmT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGTXV0YWJsZUFycmF5UmVmLCBDRk11dGFibGVBcnJheVJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVBcnJheVJlZiwgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZEaWN0aW9uYXJ5UmVmLCBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiwgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVEaWN0aW9uYXJ5UmVmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENGVVJMUmVmLCBDRlVSTFJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRlVSTFJlZiwgQ0ZVUkxSZWZPYmpfQ29udmVydCk7CiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQ0YiLCBDRl9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDRl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKENGX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ0ZfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlDRlR5cGVSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGVHlwZVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGVHlwZVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVHlwZVJlZiIsIChQeU9iamVjdCAqKSZDRlR5cGVSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRlR5cGVSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlR5cGVSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGVHlwZVJlZl9UeXBlKTsKLQlDRkFycmF5UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlDRkFycmF5UmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRkFycmF5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZBcnJheVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGQXJyYXlSZWYiLCAoUHlPYmplY3QgKikmQ0ZBcnJheVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGQXJyYXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkFycmF5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRkFycmF5UmVmX1R5cGUpOwotCUNGTXV0YWJsZUFycmF5UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlDRk11dGFibGVBcnJheVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZBcnJheVJlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVBcnJheVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlQXJyYXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOwotCUNGRGljdGlvbmFyeVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRkRpY3Rpb25hcnlSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkRpY3Rpb25hcnlSZWYiLCAoUHlPYmplY3QgKikmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEaWN0aW9uYXJ5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVEaWN0aW9uYXJ5UmVmIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKLQlDRkRhdGFSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGRGF0YVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ0ZEYXRhUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZEYXRhUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEYXRhUmVmIiwgKFB5T2JqZWN0ICopJkNGRGF0YVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGRGF0YVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGF0YVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZEYXRhUmVmX1R5cGUpOwotCUNGTXV0YWJsZURhdGFSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGTXV0YWJsZURhdGFSZWZfVHlwZS50cF9iYXNlID0gJkNGRGF0YVJlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZURhdGFSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRk11dGFibGVEYXRhUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGF0YVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEYXRhUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURhdGFSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7Ci0JQ0ZTdHJpbmdSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGU3RyaW5nUmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRlN0cmluZ1JlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGU3RyaW5nUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZTdHJpbmdSZWYiLCAoUHlPYmplY3QgKikmQ0ZTdHJpbmdSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRlN0cmluZ1JlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGU3RyaW5nUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlN0cmluZ1JlZl9UeXBlKTsKLQlDRk11dGFibGVTdHJpbmdSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZTdHJpbmdSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVTdHJpbmdSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JQ0ZVUkxSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGVVJMUmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRlVSTFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGVVJMUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZVUkxSZWYiLCAoUHlPYmplY3QgKikmQ0ZVUkxSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRlVSTFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVVJMUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlVSTFJlZl9UeXBlKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0NGIiwgQ0ZfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQ0ZfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChDRl9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENGX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgQ0ZUeXBlUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRlR5cGVSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRlR5cGVSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlR5cGVSZWYiLCAoUHlPYmplY3QgKikmQ0ZUeXBlUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZUeXBlUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZUeXBlUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlR5cGVSZWZfVHlwZSk7CisgICAgQ0ZBcnJheVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgQ0ZBcnJheVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZBcnJheVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGQXJyYXlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkFycmF5UmVmIiwgKFB5T2JqZWN0ICopJkNGQXJyYXlSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRkFycmF5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZBcnJheVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZBcnJheVJlZl9UeXBlKTsKKyAgICBDRk11dGFibGVBcnJheVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZS50cF9iYXNlID0gJkNGQXJyYXlSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVBcnJheVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlQXJyYXlSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZUFycmF5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKKyAgICBDRkRpY3Rpb25hcnlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGRGljdGlvbmFyeVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEaWN0aW9uYXJ5UmVmIiwgKFB5T2JqZWN0ICopJkNGRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGljdGlvbmFyeVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZS50cF9iYXNlID0gJkNGRGljdGlvbmFyeVJlZl9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7CisgICAgQ0ZEYXRhUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRkRhdGFSZWZfVHlwZS50cF9iYXNlID0gJkNGVHlwZVJlZl9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGRGF0YVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGRGF0YVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGF0YVJlZiIsIChQeU9iamVjdCAqKSZDRkRhdGFSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRkRhdGFSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkRhdGFSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGRGF0YVJlZl9UeXBlKTsKKyAgICBDRk11dGFibGVEYXRhUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRk11dGFibGVEYXRhUmVmX1R5cGUudHBfYmFzZSA9ICZDRkRhdGFSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVEYXRhUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURhdGFSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVEYXRhUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEYXRhUmVmX1R5cGUpOworICAgIENGU3RyaW5nUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRlN0cmluZ1JlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZTdHJpbmdSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRlN0cmluZ1JlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGU3RyaW5nUmVmIiwgKFB5T2JqZWN0ICopJkNGU3RyaW5nUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZTdHJpbmdSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlN0cmluZ1JlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZTdHJpbmdSZWZfVHlwZSk7CisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRk11dGFibGVTdHJpbmdSZWZfVHlwZS50cF9iYXNlID0gJkNGU3RyaW5nUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZVN0cmluZ1JlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOworICAgIENGVVJMUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRlVSTFJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZVUkxSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRlVSTFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVVJMUmVmIiwgKFB5T2JqZWN0ICopJkNGVVJMUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZVUkxSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlVSTFJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZVUkxSZWZfVHlwZSk7CiAKICNkZWZpbmUgX1NUUklOR0NPTlNUKG5hbWUpIFB5TW9kdWxlX0FkZE9iamVjdChtLCAjbmFtZSwgQ0ZTdHJpbmdSZWZPYmpfTmV3KG5hbWUpKQotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0FueUFwcGxpY2F0aW9uKTsKLQlfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNDdXJyZW50QXBwbGljYXRpb24pOwotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0FueUhvc3QpOwotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRIb3N0KTsKLQlfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNBbnlVc2VyKTsKLQlfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNDdXJyZW50VXNlcik7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQW55QXBwbGljYXRpb24pOworICAgIF9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlvbik7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQW55SG9zdCk7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQ3VycmVudEhvc3QpOworICAgIF9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0FueVVzZXIpOworICAgIF9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRVc2VyKTsKIAogCiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NmL3B5Y2ZicmlkZ2UuYyBiL01hYy9Nb2R1bGVzL2NmL3B5Y2ZicmlkZ2UuYwppbmRleCAwNjcwMGIzLi43MDhjMWU2IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jZi9weWNmYnJpZGdlLmMKKysrIGIvTWFjL01vZHVsZXMvY2YvcHljZmJyaWRnZS5jCkBAIC0xNSwxMjggKzE1LDEyOCBAQAogCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbihDRlR5cGVSZWYgc3JjKSB7Ci0JQ0ZUeXBlSUQgdHlwZWlkOwotCQotCWlmKCBzcmMgPT0gTlVMTCApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JdHlwZWlkID0gQ0ZHZXRUeXBlSUQoc3JjKTsKLQlpZiAodHlwZWlkID09IENGQXJyYXlHZXRUeXBlSUQoKSkKLQkJcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX3NlcXVlbmNlKChDRkFycmF5UmVmKXNyYyk7Ci0JaWYgKHR5cGVpZCA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkKLQkJcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX21hcHBpbmcoKENGRGljdGlvbmFyeVJlZilzcmMpOwotCXJldHVybiBQeUNGX0NGMlB5dGhvbl9zaW1wbGUoc3JjKTsKKyAgICBDRlR5cGVJRCB0eXBlaWQ7CisKKyAgICBpZiggc3JjID09IE5VTEwgKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHR5cGVpZCA9IENGR2V0VHlwZUlEKHNyYyk7CisgICAgaWYgKHR5cGVpZCA9PSBDRkFycmF5R2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeUNGX0NGMlB5dGhvbl9zZXF1ZW5jZSgoQ0ZBcnJheVJlZilzcmMpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeUNGX0NGMlB5dGhvbl9tYXBwaW5nKChDRkRpY3Rpb25hcnlSZWYpc3JjKTsKKyAgICByZXR1cm4gUHlDRl9DRjJQeXRob25fc2ltcGxlKHNyYyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5Q0ZfQ0YyUHl0aG9uX3NlcXVlbmNlKENGQXJyYXlSZWYgc3JjKSB7Ci0JaW50IHNpemUgPSBDRkFycmF5R2V0Q291bnQoc3JjKTsKLQlQeU9iamVjdCAqcnY7Ci0JQ0ZUeXBlUmVmIGl0ZW1fY2Y7Ci0JUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMOwotCWludCBpOwotCQotCWlmICggKHJ2PVB5TGlzdF9OZXcoc2l6ZSkpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IoaT0wOyBpPHNpemU7IGkrKykgewotCQlpdGVtX2NmID0gQ0ZBcnJheUdldFZhbHVlQXRJbmRleChzcmMsIGkpOwotCQlpZiAoaXRlbV9jZiA9PSBOVUxMICkgZ290byBlcnI7Ci0JCWl0ZW1fcHkgPSBQeUNGX0NGMlB5dGhvbihpdGVtX2NmKTsKLQkJaWYgKGl0ZW1fcHkgPT0gTlVMTCApIGdvdG8gZXJyOwotCQlpZiAoUHlMaXN0X1NldEl0ZW0ocnYsIGksIGl0ZW1fcHkpIDwgMCkgZ290byBlcnI7Ci0JCWl0ZW1fcHkgPSBOVUxMOwotCX0KLQlyZXR1cm4gcnY7CisgICAgaW50IHNpemUgPSBDRkFycmF5R2V0Q291bnQoc3JjKTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgQ0ZUeXBlUmVmIGl0ZW1fY2Y7CisgICAgUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMOworICAgIGludCBpOworCisgICAgaWYgKCAocnY9UHlMaXN0X05ldyhzaXplKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvcihpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgIGl0ZW1fY2YgPSBDRkFycmF5R2V0VmFsdWVBdEluZGV4KHNyYywgaSk7CisgICAgICAgIGlmIChpdGVtX2NmID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICAgICAgaXRlbV9weSA9IFB5Q0ZfQ0YyUHl0aG9uKGl0ZW1fY2YpOworICAgICAgICBpZiAoaXRlbV9weSA9PSBOVUxMICkgZ290byBlcnI7CisgICAgICAgIGlmIChQeUxpc3RfU2V0SXRlbShydiwgaSwgaXRlbV9weSkgPCAwKSBnb3RvIGVycjsKKyAgICAgICAgaXRlbV9weSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBydjsKIGVycjoKLQlQeV9YREVDUkVGKGl0ZW1fcHkpOwotCVB5X0RFQ1JFRihydik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihpdGVtX3B5KTsKKyAgICBQeV9ERUNSRUYocnYpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbl9tYXBwaW5nKENGVHlwZVJlZiBzcmMpIHsKLQlpbnQgc2l6ZSA9IENGRGljdGlvbmFyeUdldENvdW50KHNyYyk7Ci0JUHlPYmplY3QgKnJ2ID0gTlVMTDsKLQlDRlR5cGVSZWYgKmFsbGtleXMgPSBOVUxMLCAqYWxsdmFsdWVzID0gTlVMTDsKLQlDRlR5cGVSZWYga2V5X2NmLCB2YWx1ZV9jZjsKLQlQeU9iamVjdCAqa2V5X3B5ID0gTlVMTCwgKnZhbHVlX3B5ID0gTlVMTDsKLQlpbnQgaTsKLQkKLQlhbGxrZXlzID0gbWFsbG9jKHNpemUqc2l6ZW9mKENGVHlwZVJlZiAqKSk7Ci0JaWYgKGFsbGtleXMgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGVycjsKLQl9Ci0JYWxsdmFsdWVzID0gbWFsbG9jKHNpemUqc2l6ZW9mKENGVHlwZVJlZiAqKSk7Ci0JaWYgKGFsbHZhbHVlcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAoIChydj1QeURpY3RfTmV3KCkpID09IE5VTEwgKSBnb3RvIGVycjsKLQlDRkRpY3Rpb25hcnlHZXRLZXlzQW5kVmFsdWVzKHNyYywgYWxsa2V5cywgYWxsdmFsdWVzKTsKLQlmb3IoaT0wOyBpPHNpemU7IGkrKykgewotCQlrZXlfY2YgPSBhbGxrZXlzW2ldOwotCQl2YWx1ZV9jZiA9IGFsbHZhbHVlc1tpXTsKLQkJa2V5X3B5ID0gUHlDRl9DRjJQeXRob24oa2V5X2NmKTsKLQkJaWYgKGtleV9weSA9PSBOVUxMICkgZ290byBlcnI7Ci0JCXZhbHVlX3B5ID0gUHlDRl9DRjJQeXRob24odmFsdWVfY2YpOwotCQlpZiAodmFsdWVfcHkgPT0gTlVMTCApIGdvdG8gZXJyOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0ocnYsIGtleV9weSwgdmFsdWVfcHkpIDwgMCkgZ290byBlcnI7Ci0JCWtleV9weSA9IE5VTEw7Ci0JCXZhbHVlX3B5ID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHJ2OworICAgIGludCBzaXplID0gQ0ZEaWN0aW9uYXJ5R2V0Q291bnQoc3JjKTsKKyAgICBQeU9iamVjdCAqcnYgPSBOVUxMOworICAgIENGVHlwZVJlZiAqYWxsa2V5cyA9IE5VTEwsICphbGx2YWx1ZXMgPSBOVUxMOworICAgIENGVHlwZVJlZiBrZXlfY2YsIHZhbHVlX2NmOworICAgIFB5T2JqZWN0ICprZXlfcHkgPSBOVUxMLCAqdmFsdWVfcHkgPSBOVUxMOworICAgIGludCBpOworCisgICAgYWxsa2V5cyA9IG1hbGxvYyhzaXplKnNpemVvZihDRlR5cGVSZWYgKikpOworICAgIGlmIChhbGxrZXlzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGFsbHZhbHVlcyA9IG1hbGxvYyhzaXplKnNpemVvZihDRlR5cGVSZWYgKikpOworICAgIGlmIChhbGx2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKCAocnY9UHlEaWN0X05ldygpKSA9PSBOVUxMICkgZ290byBlcnI7CisgICAgQ0ZEaWN0aW9uYXJ5R2V0S2V5c0FuZFZhbHVlcyhzcmMsIGFsbGtleXMsIGFsbHZhbHVlcyk7CisgICAgZm9yKGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgICAga2V5X2NmID0gYWxsa2V5c1tpXTsKKyAgICAgICAgdmFsdWVfY2YgPSBhbGx2YWx1ZXNbaV07CisgICAgICAgIGtleV9weSA9IFB5Q0ZfQ0YyUHl0aG9uKGtleV9jZik7CisgICAgICAgIGlmIChrZXlfcHkgPT0gTlVMTCApIGdvdG8gZXJyOworICAgICAgICB2YWx1ZV9weSA9IFB5Q0ZfQ0YyUHl0aG9uKHZhbHVlX2NmKTsKKyAgICAgICAgaWYgKHZhbHVlX3B5ID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHJ2LCBrZXlfcHksIHZhbHVlX3B5KSA8IDApIGdvdG8gZXJyOworICAgICAgICBrZXlfcHkgPSBOVUxMOworICAgICAgICB2YWx1ZV9weSA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiBydjsKIGVycjoKLQlQeV9YREVDUkVGKGtleV9weSk7Ci0JUHlfWERFQ1JFRih2YWx1ZV9weSk7Ci0JUHlfWERFQ1JFRihydik7Ci0JZnJlZShhbGxrZXlzKTsKLQlmcmVlKGFsbHZhbHVlcyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihrZXlfcHkpOworICAgIFB5X1hERUNSRUYodmFsdWVfcHkpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIGZyZWUoYWxsa2V5cyk7CisgICAgZnJlZShhbGx2YWx1ZXMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbl9zaW1wbGUoQ0ZUeXBlUmVmIHNyYykgewotCUNGVHlwZUlEIHR5cGVpZDsKLQkKLQl0eXBlaWQgPSBDRkdldFR5cGVJRChzcmMpOwotCWlmICh0eXBlaWQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkKLQkJcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX3N0cmluZygoQ0ZTdHJpbmdSZWYpc3JjKTsKLQlpZiAodHlwZWlkID09IENGQm9vbGVhbkdldFR5cGVJRCgpKQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKUNGQm9vbGVhbkdldFZhbHVlKHNyYykpOwotCWlmICh0eXBlaWQgPT0gQ0ZOdW1iZXJHZXRUeXBlSUQoKSkgewotCQlpZiAoQ0ZOdW1iZXJJc0Zsb2F0VHlwZShzcmMpKSB7Ci0JCQlkb3VibGUgZDsKLQkJCUNGTnVtYmVyR2V0VmFsdWUoc3JjLCBrQ0ZOdW1iZXJEb3VibGVUeXBlLCAmZCk7Ci0JCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGQpOwotCQl9IGVsc2UgewotCQkJbG9uZyBsOwotCQkJaWYgKCFDRk51bWJlckdldFZhbHVlKHNyYywga0NGTnVtYmVyTG9uZ1R5cGUsICZsKSkKLQkJCQkvKiBYWFhYIE91dCBvZiByYW5nZSEgKi87Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobCk7Ci0JCX0KLQl9Ci0JLyogWFhYWCBTaG91bGQgcmV0dXJuIGFzIENGVHlwZVJlZiwgcmVhbGx5Li4uICovCi0JUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCXJldHVybiBOVUxMOworICAgIENGVHlwZUlEIHR5cGVpZDsKKworICAgIHR5cGVpZCA9IENGR2V0VHlwZUlEKHNyYyk7CisgICAgaWYgKHR5cGVpZCA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKQorICAgICAgICByZXR1cm4gUHlDRl9DRjJQeXRob25fc3RyaW5nKChDRlN0cmluZ1JlZilzcmMpOworICAgIGlmICh0eXBlaWQgPT0gQ0ZCb29sZWFuR2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpQ0ZCb29sZWFuR2V0VmFsdWUoc3JjKSk7CisgICAgaWYgKHR5cGVpZCA9PSBDRk51bWJlckdldFR5cGVJRCgpKSB7CisgICAgICAgIGlmIChDRk51bWJlcklzRmxvYXRUeXBlKHNyYykpIHsKKyAgICAgICAgICAgIGRvdWJsZSBkOworICAgICAgICAgICAgQ0ZOdW1iZXJHZXRWYWx1ZShzcmMsIGtDRk51bWJlckRvdWJsZVR5cGUsICZkKTsKKyAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb25nIGw7CisgICAgICAgICAgICBpZiAoIUNGTnVtYmVyR2V0VmFsdWUoc3JjLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJmwpKQorICAgICAgICAgICAgICAgIC8qIFhYWFggT3V0IG9mIHJhbmdlISAqLzsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBYWFhYIFNob3VsZCByZXR1cm4gYXMgQ0ZUeXBlUmVmLCByZWFsbHkuLi4gKi8KKyAgICBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFVuc3VyZSAtIFJldHVybiB1bmljb2RlIG9yIDggYml0IHN0cmluZ3M/ICovCiBQeU9iamVjdCAqCiBQeUNGX0NGMlB5dGhvbl9zdHJpbmcoQ0ZTdHJpbmdSZWYgc3JjKSB7Ci0JaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChzcmMpKzE7Ci0JUHlfVU5JQ09ERSAqZGF0YSA9IG1hbGxvYyhzaXplKnNpemVvZihQeV9VTklDT0RFKSk7Ci0JQ0ZSYW5nZSByYW5nZTsKLQlQeU9iamVjdCAqcnY7CisgICAgaW50IHNpemUgPSBDRlN0cmluZ0dldExlbmd0aChzcmMpKzE7CisgICAgUHlfVU5JQ09ERSAqZGF0YSA9IG1hbGxvYyhzaXplKnNpemVvZihQeV9VTklDT0RFKSk7CisgICAgQ0ZSYW5nZSByYW5nZTsKKyAgICBQeU9iamVjdCAqcnY7CiAKLQlyYW5nZS5sb2NhdGlvbiA9IDA7Ci0JcmFuZ2UubGVuZ3RoID0gc2l6ZTsKLQlpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKHNyYywgcmFuZ2UsIGRhdGEpOwotCXJ2ID0gKFB5T2JqZWN0ICopUHlVbmljb2RlX0Zyb21Vbmljb2RlKGRhdGEsIHNpemUtMSk7Ci0JZnJlZShkYXRhKTsKLQlyZXR1cm4gcnY7CisgICAgcmFuZ2UubG9jYXRpb24gPSAwOworICAgIHJhbmdlLmxlbmd0aCA9IHNpemU7CisgICAgaWYoIGRhdGEgPT0gTlVMTCApIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIENGU3RyaW5nR2V0Q2hhcmFjdGVycyhzcmMsIHJhbmdlLCBkYXRhKTsKKyAgICBydiA9IChQeU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tVW5pY29kZShkYXRhLCBzaXplLTEpOworICAgIGZyZWUoZGF0YSk7CisgICAgcmV0dXJuIHJ2OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNDYsMTU4ICsxNDYsMTU4IEBACiBpbnQKIFB5Q0ZfUHl0aG9uMkNGKFB5T2JqZWN0ICpzcmMsIENGVHlwZVJlZiAqZHN0KSB7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSB8fCBQeVVuaWNvZGVfQ2hlY2soc3JjKSkKLQkJcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NpbXBsZShzcmMsIGRzdCk7Ci0JaWYgKFB5U2VxdWVuY2VfQ2hlY2soc3JjKSkKLQkJcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NlcXVlbmNlKHNyYywgKENGQXJyYXlSZWYgKilkc3QpOwotCWlmIChQeU1hcHBpbmdfQ2hlY2soc3JjKSkKLQkJcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX21hcHBpbmcoc3JjLCAoQ0ZEaWN0aW9uYXJ5UmVmICopZHN0KTsKLQlyZXR1cm4gUHlDRl9QeXRob24yQ0Zfc2ltcGxlKHNyYywgZHN0KTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSB8fCBQeVVuaWNvZGVfQ2hlY2soc3JjKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NpbXBsZShzcmMsIGRzdCk7CisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2soc3JjKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3NlcXVlbmNlKHNyYywgKENGQXJyYXlSZWYgKilkc3QpOworICAgIGlmIChQeU1hcHBpbmdfQ2hlY2soc3JjKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX21hcHBpbmcoc3JjLCAoQ0ZEaWN0aW9uYXJ5UmVmICopZHN0KTsKKyAgICByZXR1cm4gUHlDRl9QeXRob24yQ0Zfc2ltcGxlKHNyYywgZHN0KTsKIH0KIAogaW50CiBQeUNGX1B5dGhvbjJDRl9zZXF1ZW5jZShQeU9iamVjdCAqc3JjLCBDRkFycmF5UmVmICpkc3QpIHsKLQlDRk11dGFibGVBcnJheVJlZiBydiA9IE5VTEw7Ci0JQ0ZUeXBlUmVmIGl0ZW1fY2YgPSBOVUxMOwotCVB5T2JqZWN0ICppdGVtX3B5ID0gTlVMTDsKLQlpbnQgc2l6ZSwgaTsKLQkKLQlpZiggIVB5U2VxdWVuY2VfQ2hlY2soc3JjKSApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkFycmF5IiwKLQkJCXNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQlzaXplID0gUHlTZXF1ZW5jZV9TaXplKHNyYyk7Ci0JcnYgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7Ci0JaWYgKHJ2ID09IE5VTEwpIHsKLQkJUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyAKLQkJZ290byBlcnI7Ci0JfQorICAgIENGTXV0YWJsZUFycmF5UmVmIHJ2ID0gTlVMTDsKKyAgICBDRlR5cGVSZWYgaXRlbV9jZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMOworICAgIGludCBzaXplLCBpOwogCi0JZm9yKCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0JCWl0ZW1fcHkgPSBQeVNlcXVlbmNlX0dldEl0ZW0oc3JjLCBpKTsKLQkJaWYgKGl0ZW1fcHkgPT0gTlVMTCkgZ290byBlcnI7Ci0JCWlmICggIVB5Q0ZfUHl0aG9uMkNGKGl0ZW1fcHksICZpdGVtX2NmKSkgZ290byBlcnI7Ci0JCVB5X0RFQ1JFRihpdGVtX3B5KTsKLQkJQ0ZBcnJheVNldFZhbHVlQXRJbmRleChydiwgaSwgaXRlbV9jZik7Ci0JCUNGUmVsZWFzZShpdGVtX2NmKTsKLQkJaXRlbV9jZiA9IE5VTEw7Ci0JfQotCSpkc3QgPSBydjsKLQlyZXR1cm4gMTsKKyAgICBpZiggIVB5U2VxdWVuY2VfQ2hlY2soc3JjKSApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkFycmF5IiwKKyAgICAgICAgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaXplID0gUHlTZXF1ZW5jZV9TaXplKHNyYyk7CisgICAgcnYgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7CisgICAgaWYgKHJ2ID09IE5VTEwpIHsKKyAgICAgICAgUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBmb3IoIGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgICAgaXRlbV9weSA9IFB5U2VxdWVuY2VfR2V0SXRlbShzcmMsIGkpOworICAgICAgICBpZiAoaXRlbV9weSA9PSBOVUxMKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKCAhUHlDRl9QeXRob24yQ0YoaXRlbV9weSwgJml0ZW1fY2YpKSBnb3RvIGVycjsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW1fcHkpOworICAgICAgICBDRkFycmF5U2V0VmFsdWVBdEluZGV4KHJ2LCBpLCBpdGVtX2NmKTsKKyAgICAgICAgQ0ZSZWxlYXNlKGl0ZW1fY2YpOworICAgICAgICBpdGVtX2NmID0gTlVMTDsKKyAgICB9CisgICAgKmRzdCA9IHJ2OworICAgIHJldHVybiAxOwogZXJyOgotCVB5X1hERUNSRUYoaXRlbV9weSk7Ci0JaWYgKHJ2KSBDRlJlbGVhc2UocnYpOwotCWlmIChpdGVtX2NmKSBDRlJlbGVhc2UoaXRlbV9jZik7Ci0JcmV0dXJuIDA7CQkKKyAgICBQeV9YREVDUkVGKGl0ZW1fcHkpOworICAgIGlmIChydikgQ0ZSZWxlYXNlKHJ2KTsKKyAgICBpZiAoaXRlbV9jZikgQ0ZSZWxlYXNlKGl0ZW1fY2YpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5Q0ZfUHl0aG9uMkNGX21hcHBpbmcoUHlPYmplY3QgKnNyYywgQ0ZEaWN0aW9uYXJ5UmVmICpkc3QpIHsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIHJ2ID0gTlVMTDsKLQlQeU9iamVjdCAqYXNsaXN0ID0gTlVMTDsKLQlDRlR5cGVSZWYga2V5X2NmID0gTlVMTCwgdmFsdWVfY2YgPSBOVUxMOwotCVB5T2JqZWN0ICppdGVtX3B5ID0gTlVMTCwgKmtleV9weSA9IE5VTEwsICp2YWx1ZV9weSA9IE5VTEw7Ci0JaW50IHNpemUsIGk7Ci0JCi0JaWYoICFQeU1hcHBpbmdfQ2hlY2soc3JjKSApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkRpY3Rpb25hcnkiLAotCQkJc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNpemUgPSBQeU1hcHBpbmdfU2l6ZShzcmMpOwotCXJ2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwKLQkJCQkJJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwotCWlmIChydiA9PSBOVUxMKSB7Ci0JCVB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsgCi0JCWdvdG8gZXJyOwotCX0KLQlpZiAoIChhc2xpc3QgPSBQeU1hcHBpbmdfSXRlbXMoc3JjKSkgPT0gTlVMTCApIGdvdG8gZXJyOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgcnYgPSBOVUxMOworICAgIFB5T2JqZWN0ICphc2xpc3QgPSBOVUxMOworICAgIENGVHlwZVJlZiBrZXlfY2YgPSBOVUxMLCB2YWx1ZV9jZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMLCAqa2V5X3B5ID0gTlVMTCwgKnZhbHVlX3B5ID0gTlVMTDsKKyAgICBpbnQgc2l6ZSwgaTsKIAotCWZvciggaT0wOyBpPHNpemU7IGkrKykgewotCQlpdGVtX3B5ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFzbGlzdCwgaSk7Ci0JCWlmIChpdGVtX3B5ID09IE5VTEwpIGdvdG8gZXJyOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoaXRlbV9weSwgIk9PIiwgJmtleV9weSwgJnZhbHVlX3B5KSkgZ290byBlcnI7Ci0JCWlmICggIVB5Q0ZfUHl0aG9uMkNGKGtleV9weSwgJmtleV9jZikgKSBnb3RvIGVycjsKLQkJaWYgKCAhUHlDRl9QeXRob24yQ0YodmFsdWVfcHksICZ2YWx1ZV9jZikgKSBnb3RvIGVycjsKLQkJQ0ZEaWN0aW9uYXJ5QWRkVmFsdWUocnYsIGtleV9jZiwgdmFsdWVfY2YpOwotCQlDRlJlbGVhc2Uoa2V5X2NmKTsKLQkJa2V5X2NmID0gTlVMTDsKLQkJQ0ZSZWxlYXNlKHZhbHVlX2NmKTsKLQkJdmFsdWVfY2YgPSBOVUxMOwotCX0KLQkqZHN0ID0gcnY7Ci0JcmV0dXJuIDE7CisgICAgaWYoICFQeU1hcHBpbmdfQ2hlY2soc3JjKSApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRkRpY3Rpb25hcnkiLAorICAgICAgICAgICAgc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNpemUgPSBQeU1hcHBpbmdfU2l6ZShzcmMpOworICAgIHJ2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKyAgICBpZiAocnYgPT0gTlVMTCkgeworICAgICAgICBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIChhc2xpc3QgPSBQeU1hcHBpbmdfSXRlbXMoc3JjKSkgPT0gTlVMTCApIGdvdG8gZXJyOworCisgICAgZm9yKCBpPTA7IGk8c2l6ZTsgaSsrKSB7CisgICAgICAgIGl0ZW1fcHkgPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXNsaXN0LCBpKTsKKyAgICAgICAgaWYgKGl0ZW1fcHkgPT0gTlVMTCkgZ290byBlcnI7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtX3B5LCAiT08iLCAma2V5X3B5LCAmdmFsdWVfcHkpKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKCAhUHlDRl9QeXRob24yQ0Yoa2V5X3B5LCAma2V5X2NmKSApIGdvdG8gZXJyOworICAgICAgICBpZiAoICFQeUNGX1B5dGhvbjJDRih2YWx1ZV9weSwgJnZhbHVlX2NmKSApIGdvdG8gZXJyOworICAgICAgICBDRkRpY3Rpb25hcnlBZGRWYWx1ZShydiwga2V5X2NmLCB2YWx1ZV9jZik7CisgICAgICAgIENGUmVsZWFzZShrZXlfY2YpOworICAgICAgICBrZXlfY2YgPSBOVUxMOworICAgICAgICBDRlJlbGVhc2UodmFsdWVfY2YpOworICAgICAgICB2YWx1ZV9jZiA9IE5VTEw7CisgICAgfQorICAgICpkc3QgPSBydjsKKyAgICByZXR1cm4gMTsKIGVycjoKLQlQeV9YREVDUkVGKGl0ZW1fcHkpOwotCVB5X1hERUNSRUYoYXNsaXN0KTsKLQlpZiAocnYpIENGUmVsZWFzZShydik7Ci0JaWYgKGtleV9jZikgQ0ZSZWxlYXNlKGtleV9jZik7Ci0JaWYgKHZhbHVlX2NmKSBDRlJlbGVhc2UodmFsdWVfY2YpOwotCXJldHVybiAwOwkJCisgICAgUHlfWERFQ1JFRihpdGVtX3B5KTsKKyAgICBQeV9YREVDUkVGKGFzbGlzdCk7CisgICAgaWYgKHJ2KSBDRlJlbGVhc2UocnYpOworICAgIGlmIChrZXlfY2YpIENGUmVsZWFzZShrZXlfY2YpOworICAgIGlmICh2YWx1ZV9jZikgQ0ZSZWxlYXNlKHZhbHVlX2NmKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeUNGX1B5dGhvbjJDRl9zaW1wbGUoUHlPYmplY3QgKnNyYywgQ0ZUeXBlUmVmICpkc3QpIHsKLQkKKwogI2lmIDAKLQlpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhzcmMsICJDRlR5cGUiKSkgewotCQkqZHN0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzcmMsICJDRlR5cGUiLCAiIik7Ci0JCXJldHVybiAoKmRzdCAhPSBOVUxMKTsKLQl9CisgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoc3JjLCAiQ0ZUeXBlIikpIHsKKyAgICAgICAgKmRzdCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3JjLCAiQ0ZUeXBlIiwgIiIpOworICAgICAgICByZXR1cm4gKCpkc3QgIT0gTlVMTCk7CisgICAgfQogI2VuZGlmCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHNyYykgfHwgUHlVbmljb2RlX0NoZWNrKHNyYykpIAotCQlyZXR1cm4gUHlDRl9QeXRob24yQ0Zfc3RyaW5nKHNyYywgKENGU3RyaW5nUmVmICopZHN0KTsKLQlpZiAoUHlCb29sX0NoZWNrKHNyYykpIHsKLQkJaWYgKHNyYyA9PSBQeV9UcnVlKQotCQkJKmRzdCA9IGtDRkJvb2xlYW5UcnVlOwotCQllbHNlCi0JCQkqZHN0ID0ga0NGQm9vbGVhbkZhbHNlOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5SW50X0NoZWNrKHNyYykpIHsKLQkJbG9uZyB2ID0gUHlJbnRfQXNMb25nKHNyYyk7Ci0JCSpkc3QgPSBDRk51bWJlckNyZWF0ZShOVUxMLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJnYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5RmxvYXRfQ2hlY2soc3JjKSkgewotCQlkb3VibGUgZCA9IFB5RmxvYXRfQXNEb3VibGUoc3JjKTsKLQkJKmRzdCA9IENGTnVtYmVyQ3JlYXRlKE5VTEwsIGtDRk51bWJlckRvdWJsZVR5cGUsICZkKTsKLQkJcmV0dXJuIDE7Ci0JfQotCQkJCi0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAiQ2Fubm90IGNvbnZlcnQgJS41MDBzIG9iamVjdHMgdG8gQ0ZUeXBlIiwKLQkJCQkgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHNyYykgfHwgUHlVbmljb2RlX0NoZWNrKHNyYykpCisgICAgICAgIHJldHVybiBQeUNGX1B5dGhvbjJDRl9zdHJpbmcoc3JjLCAoQ0ZTdHJpbmdSZWYgKilkc3QpOworICAgIGlmIChQeUJvb2xfQ2hlY2soc3JjKSkgeworICAgICAgICBpZiAoc3JjID09IFB5X1RydWUpCisgICAgICAgICAgICAqZHN0ID0ga0NGQm9vbGVhblRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QgPSBrQ0ZCb29sZWFuRmFsc2U7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlJbnRfQ2hlY2soc3JjKSkgeworICAgICAgICBsb25nIHYgPSBQeUludF9Bc0xvbmcoc3JjKTsKKyAgICAgICAgKmRzdCA9IENGTnVtYmVyQ3JlYXRlKE5VTEwsIGtDRk51bWJlckxvbmdUeXBlLCAmdik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlGbG9hdF9DaGVjayhzcmMpKSB7CisgICAgICAgIGRvdWJsZSBkID0gUHlGbG9hdF9Bc0RvdWJsZShzcmMpOworICAgICAgICAqZHN0ID0gQ0ZOdW1iZXJDcmVhdGUoTlVMTCwga0NGTnVtYmVyRG91YmxlVHlwZSwgJmQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgJS41MDBzIG9iamVjdHMgdG8gQ0ZUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlDRl9QeXRob24yQ0Zfc3RyaW5nKFB5T2JqZWN0ICpzcmMsIENGU3RyaW5nUmVmICpkc3QpIHsKLQljaGFyICpjaGFyczsKLQlDRkluZGV4IHNpemU7Ci0JVW5pQ2hhciAqdW5pY2hhcnM7Ci0JCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHNyYykpIHsKLQkJaWYgKCFQeUFyZ19QYXJzZShzcmMsICJlcyIsICJhc2NpaSIsICZjaGFycykpCi0JCQlyZXR1cm4gMDsgLyogVGhpcyBlcnJvciBpcyBtb3JlIGRlc2NyaXB0aXZlIHRoYW4gdGhlIGdlbmVyYWwgb25lIGJlbG93ICovCi0JCSpkc3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLCBjaGFycywga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSk7Ci0JCVB5TWVtX0ZyZWUoY2hhcnMpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKFB5VW5pY29kZV9DaGVjayhzcmMpKSB7Ci0JCS8qIFdlIHVzZSB0aGUgQ0YgdHlwZXMgaGVyZSwgaWYgUHl0aG9uIHdhcyBjb25maWd1cmVkIGRpZmZlcmVudGx5IHRoYXQgd2lsbCBnaXZlIGFuIGVycm9yICovCi0JCXNpemUgPSBQeVVuaWNvZGVfR2V0U2l6ZShzcmMpOwotCQlpZiAoKHVuaWNoYXJzID0gUHlVbmljb2RlX0FzVW5pY29kZShzcmMpKSA9PSBOVUxMICkgZ290byBlcnI7Ci0JCSpkc3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLCB1bmljaGFycywgc2l6ZSk7Ci0JCXJldHVybiAxOwotCX0KKyAgICBjaGFyICpjaGFyczsKKyAgICBDRkluZGV4IHNpemU7CisgICAgVW5pQ2hhciAqdW5pY2hhcnM7CisKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHNyYywgImVzIiwgImFzY2lpIiwgJmNoYXJzKSkKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBUaGlzIGVycm9yIGlzIG1vcmUgZGVzY3JpcHRpdmUgdGhhbiB0aGUgZ2VuZXJhbCBvbmUgYmVsb3cgKi8KKyAgICAgICAgKmRzdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsIGNoYXJzLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKTsKKyAgICAgICAgUHlNZW1fRnJlZShjaGFycyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHNyYykpIHsKKyAgICAgICAgLyogV2UgdXNlIHRoZSBDRiB0eXBlcyBoZXJlLCBpZiBQeXRob24gd2FzIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkgdGhhdCB3aWxsIGdpdmUgYW4gZXJyb3IgKi8KKyAgICAgICAgc2l6ZSA9IFB5VW5pY29kZV9HZXRTaXplKHNyYyk7CisgICAgICAgIGlmICgodW5pY2hhcnMgPSBQeVVuaWNvZGVfQXNVbmljb2RlKHNyYykpID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICAgICAgKmRzdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoKENGQWxsb2NhdG9yUmVmKU5VTEwsIHVuaWNoYXJzLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogZXJyOgotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgIkNhbm5vdCBjb252ZXJ0ICUuNTAwcyBvYmplY3RzIHRvIENGU3RyaW5nIiwKLQkJCQkgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgIkNhbm5vdCBjb252ZXJ0ICUuNTAwcyBvYmplY3RzIHRvIENGU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmMgYi9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmMKaW5kZXggYmMyOTc2ZS4uOTU1YWNmYiAxMDA3NTUKLS0tIGEvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5jCisrKyBiL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuYwpAQCAtMSw0NSArMSw0NSBAQAogLyoKLQlGaWxlOgkJQ0ZNTGF0ZUltcG9ydC5jCisgICAgRmlsZTogICAgICAgICAgICAgICBDRk1MYXRlSW1wb3J0LmMKIAotCUNvbnRhaW5zOglJbXBsZW1lbnRhdGlvbiBvZiBDRk0gbGF0ZSBpbXBvcnQgbGlicmFyeS4KKyAgICBDb250YWluczogICAgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIENGTSBsYXRlIGltcG9ydCBsaWJyYXJ5LgogCi0JV3JpdHRlbiBieToJUXVpbm4KKyAgICBXcml0dGVuIGJ5OiAgICAgICAgIFF1aW5uCiAKLQlDb3B5cmlnaHQ6CUNvcHlyaWdodCCpIDE5OTkgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAgQ29weXJpZ2h0OiAgICAgICAgICBDb3B5cmlnaHQgqSAxOTk5IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgogCi0JCQkJWW91IG1heSBpbmNvcnBvcmF0ZSB0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBpbnRvIHlvdXIgcHJvZ3JhbShzKSB3aXRob3V0Ci0JCQkJcmVzdHJpY3Rpb24uIFRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGhhcyBiZWVuIHByb3ZpZGVkICJBUyBJUyIgYW5kIHRoZQotCQkJCXJlc3BvbnNpYmlsaXR5IGZvciBpdHMgb3BlcmF0aW9uIGlzIHlvdXJzLiBZb3UgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gcmVkaXN0cmlidXRlCi0JCQkJdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgYXMgIkFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSIgYWZ0ZXIgaGF2aW5nIG1hZGUKLQkJCQljaGFuZ2VzLiBJZiB5b3UncmUgZ29pbmcgdG8gcmUtZGlzdHJpYnV0ZSB0aGUgc291cmNlLCB3ZSByZXF1aXJlIHRoYXQgeW91IG1ha2UKLQkJCQlpdCBjbGVhciBpbiB0aGUgc291cmNlIHRoYXQgdGhlIGNvZGUgd2FzIGRlc2NlbmRlZCBmcm9tIEFwcGxlIHNhbXBsZSBzb3VyY2UKLQkJCQljb2RlLCBidXQgdGhhdCB5b3UndmUgbWFkZSBjaGFuZ2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgaW5jb3Jwb3JhdGUgdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaW50byB5b3VyIHByb2dyYW0ocykgd2l0aG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uLiBUaGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBoYXMgYmVlbiBwcm92aWRlZCAiQVMgSVMiIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zaWJpbGl0eSBmb3IgaXRzIG9wZXJhdGlvbiBpcyB5b3Vycy4gWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHJlZGlzdHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGFzICJBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUiIGFmdGVyIGhhdmluZyBtYWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy4gSWYgeW91J3JlIGdvaW5nIHRvIHJlLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSwgd2UgcmVxdWlyZSB0aGF0IHlvdSBtYWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgY2xlYXIgaW4gdGhlIHNvdXJjZSB0aGF0IHRoZSBjb2RlIHdhcyBkZXNjZW5kZWQgZnJvbSBBcHBsZSBzYW1wbGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSwgYnV0IHRoYXQgeW91J3ZlIG1hZGUgY2hhbmdlcy4KIAotCUNoYW5nZSBIaXN0b3J5IChtb3N0IHJlY2VudCBmaXJzdCk6CisgICAgQ2hhbmdlIEhpc3RvcnkgKG1vc3QgcmVjZW50IGZpcnN0KToKIAotICAgICAgICA8MTM+ICAgICAyNC85LzAxICAgIFF1aW5uICAgRml4ZXMgdG8gY29tcGlsZSB3aXRoIEMrKyBhY3RpdmF0ZWQuCi0gICAgICAgIDwxMj4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBbMjcxMDQ4OV0gRml4IHR5cG8gaW4gdGhlIGNvbW1lbnRzIGZvciBGcmFnbWVudExvb2t1cC4KLSAgICAgICAgPDExPiAgICAgMjEvOS8wMSAgICBRdWlubiAgIENoYW5nZXMgZm9yIENXUHJvNyBNYWNoLU8gYnVpbGQuCi0gICAgICAgIDwxMD4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDb3JyZWN0ZWQgaW1wbGVtZW50YXRpb24gb2Yga1BFRlJlbG9jU21CeVNlY3Rpb24uIEFkZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnMgb2Yga1BFRlJlbG9jU2V0UG9zaXRpb24gYW5kIGtQRUZSZWxvY0xnQnlJbXBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIGNvZGUgY29udHJpYnV0ZWQgYnkgRXJpYyBHcmFudCwgTmVkIEhvbGJyb29rLCBhbmQgU3RldmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEthbGt3YXJmKSwgYWx0aG91Z2ggSSBjYW4ndCB0ZXN0IHRoZW0geWV0LgotICAgICAgICAgPDk+ICAgICAxOS85LzAxICAgIFF1aW5uICAgV2Ugbm93IGhhbmRsZSB1bnBhY2tlZCBkYXRhIHNlY3Rpb25zLCBjb3VydGVzeSBvZiBzb21lIGNvZGUgZnJvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVkIEhvbGJyb29rLgotICAgICAgICAgPDg+ICAgICAxOS85LzAxICAgIFF1aW5uICAgTWlub3IgZml4ZXMgZm9yIHRoZSBwcmV2aW91cyBjaGVja2luLiBVcGRhdGVkIHNvbWUgY29tbWVudHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraWxsZWQgc29tZSBkZWFkIGNvZGUuCi0gICAgICAgICA8Nz4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBTaW1wbGlmaWVkIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gYWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEVyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW50LiBZb3Ugbm8gbG9uZ2VyIGhhdmUgdG8gQ0ZNIGV4cG9ydCBhIGR1bW15IGZ1bmN0aW9uOyB5b3UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBqdXN0IHBhc3MgaW4gdGhlIGFkZHJlc3Mgb2YgeW91ciBmcmFnbWVudCdzIGluaXQgcm91dGluZS4KLSAgICAgICAgIDw2PiAgICAgMTUvMi8wMSAgICBRdWlubiAgIE1vZGlmeSBjb21waWxlLXRpbWUgd2FybmluZ3MgdG8gY29tcGxhaW4gaWYgeW91IHRyeSB0byBidWlsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtb2R1bGUgaW50byBhIE1hY2gtTyBiaW5hcnkuCi0gICAgICAgICA8NT4gICAgICA1LzIvMDEgICAgUXVpbm4gICBSZW1vdmVkIHJlZHVuZGFudCBhc3NpZ25tZW50IGluIENGTUxhdGVJbXBvcnRDb3JlLgotICAgICAgICAgPDQ+ICAgIDMwLzExLzAwICAgIFF1aW5uICAgQWRkZWQgY29tbWVudCBhYm91dCBmdXR1cmUgb2YgZGF0YSBzeW1ib2xzIGluIENGLgotICAgICAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZCdW5kbGUgc3VwcG9ydC4KLSAgICAgICAgIDwyPiAgICAxOC8xMC85OSAgICBRdWlubiAgIFJlbmFtZWQgQ0ZNTGF0ZUltcG9ydCB0byBDRk1MYXRlSW1wb3J0TGlicmFyeSB0byBhbGxvdyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgotICAgICAgICAgPDE+ICAgICAxNS82Lzk5ICAgIFF1aW5uICAgRmlyc3QgY2hlY2tlZCBpbi4KKyAgICA8MTM+ICAgICAyNC85LzAxICAgIFF1aW5uICAgRml4ZXMgdG8gY29tcGlsZSB3aXRoIEMrKyBhY3RpdmF0ZWQuCisgICAgPDEyPiAgICAgMjEvOS8wMSAgICBRdWlubiAgIFsyNzEwNDg5XSBGaXggdHlwbyBpbiB0aGUgY29tbWVudHMgZm9yIEZyYWdtZW50TG9va3VwLgorICAgIDwxMT4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBDaGFuZ2VzIGZvciBDV1BybzcgTWFjaC1PIGJ1aWxkLgorICAgIDwxMD4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDb3JyZWN0ZWQgaW1wbGVtZW50YXRpb24gb2Yga1BFRlJlbG9jU21CeVNlY3Rpb24uIEFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBvZiBrUEVGUmVsb2NTZXRQb3NpdGlvbiBhbmQga1BFRlJlbG9jTGdCeUltcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbSBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEVyaWMgR3JhbnQsIE5lZCBIb2xicm9vaywgYW5kIFN0ZXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEthbGt3YXJmKSwgYWx0aG91Z2ggSSBjYW4ndCB0ZXN0IHRoZW0geWV0LgorICAgICA8OT4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBXZSBub3cgaGFuZGxlIHVucGFja2VkIGRhdGEgc2VjdGlvbnMsIGNvdXJ0ZXN5IG9mIHNvbWUgY29kZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZCBIb2xicm9vay4KKyAgICAgPDg+ICAgICAxOS85LzAxICAgIFF1aW5uICAgTWlub3IgZml4ZXMgZm9yIHRoZSBwcmV2aW91cyBjaGVja2luLiBVcGRhdGVkIHNvbWUgY29tbWVudHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxlZCBzb21lIGRlYWQgY29kZS4KKyAgICAgPDc+ICAgICAxOS85LzAxICAgIFF1aW5uICAgU2ltcGxpZmllZCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGFmdGVyIGEgc3VnZ2VzdGlvbiBieSBFcmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW50LiBZb3Ugbm8gbG9uZ2VyIGhhdmUgdG8gQ0ZNIGV4cG9ydCBhIGR1bW15IGZ1bmN0aW9uOyB5b3UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGp1c3QgcGFzcyBpbiB0aGUgYWRkcmVzcyBvZiB5b3VyIGZyYWdtZW50J3MgaW5pdCByb3V0aW5lLgorICAgICA8Nj4gICAgIDE1LzIvMDEgICAgUXVpbm4gICBNb2RpZnkgY29tcGlsZS10aW1lIHdhcm5pbmdzIHRvIGNvbXBsYWluIGlmIHlvdSB0cnkgdG8gYnVpbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtb2R1bGUgaW50byBhIE1hY2gtTyBiaW5hcnkuCisgICAgIDw1PiAgICAgIDUvMi8wMSAgICBRdWlubiAgIFJlbW92ZWQgcmVkdW5kYW50IGFzc2lnbm1lbnQgaW4gQ0ZNTGF0ZUltcG9ydENvcmUuCisgICAgIDw0PiAgICAzMC8xMS8wMCAgICBRdWlubiAgIEFkZGVkIGNvbW1lbnQgYWJvdXQgZnV0dXJlIG9mIGRhdGEgc3ltYm9scyBpbiBDRi4KKyAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZSBzdXBwb3J0LgorICAgICA8Mj4gICAgMTgvMTAvOTkgICAgUXVpbm4gICBSZW5hbWVkIENGTUxhdGVJbXBvcnQgdG8gQ0ZNTGF0ZUltcG9ydExpYnJhcnkgdG8gYWxsb3cgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgorICAgICA8MT4gICAgIDE1LzYvOTkgICAgUXVpbm4gICBGaXJzdCBjaGVja2VkIGluLgogKi8KIAogLy8gVG8gRG8gTGlzdDoKQEAgLTY2LDggKzY2LDggQEAKIC8vIE1hYyBPUyBJbnRlcmZhY2VzCiAKICNpZiAhIE1PUkVfRlJBTUVXT1JLX0lOQ0xVREVTCi0JI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KLQkjaW5jbHVkZSA8UEVGQmluYXJ5Rm9ybWF0Lmg+CisgICAgI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KKyAgICAjaW5jbHVkZSA8UEVGQmluYXJ5Rm9ybWF0Lmg+CiAjZW5kaWYKIAogLy8gU3RhbmRhcmQgQyBJbnRlcmZhY2VzCkBAIC04NiwzMiArODYsMzIgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKICNpZiBUQVJHRVRfUlRfTUFDX01BQ0hPCi0JI2Vycm9yIENGTUxhdGVJbXBvcnQgaXMgbm90IHN1aXRhYmxlIGZvciB1c2UgaW4gYSBNYWNoLU8gcHJvamVjdC4KKyAgICAjZXJyb3IgQ0ZNTGF0ZUltcG9ydCBpcyBub3Qgc3VpdGFibGUgZm9yIHVzZSBpbiBhIE1hY2gtTyBwcm9qZWN0LgogI2VsaWYgIVRBUkdFVF9SVF9NQUNfQ0ZNIHx8ICFUQVJHRVRfQ1BVX1BQQwotCSNlcnJvciBDRk1MYXRlSW1wb3J0IGhhcyBub3QgYmVlbiBxdWFsaWZpZWQgZm9yIDY4SyBvciBDRk0tNjhLIHVzZS4KKyAgICAjZXJyb3IgQ0ZNTGF0ZUltcG9ydCBoYXMgbm90IGJlZW4gcXVhbGlmaWVkIGZvciA2OEsgb3IgQ0ZNLTY4SyB1c2UuCiAjZW5kaWYKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICNwcmFnbWEgbWFyayAtLS0tLSBVdGlsaXR5IFJvdXRpbmVzIC0tLS0tCiAKIHN0YXRpYyBPU1N0YXR1cyBGU1JlYWRBdE9mZnNldChTSW50MTYgcmVmTnVtLCBTSW50MzIgb2Zmc2V0LCBTSW50MzIgY291bnQsIHZvaWQgKmJ1ZmZlcikKLQkvLyBBIGNvbnZlbmllbnQgd3JhcHBlciBhcm91bmQgUEJSZWFkIHdoaWNoIGhhcyB0d28gYWR2YW50YWdlcwotCS8vIG92ZXIgRlNSZWFkLiAgRmlyc3QsIGl0IHRha2VzIGNvdW50IGFzIGEgdmFsdWUgcGFyYW1ldGVyLgotCS8vIFNlY29uZCwgaXQgcmVhZHMgZnJvbSBhbiBhcmJpdHJhcnkgb2Zmc2V0IGludG8gdGhlIGZpbGUsCi0JLy8gd2hpY2ggYXZvaWRzIGEgYnVuY2ggb2YgU2V0RlBvcyBjYWxscy4KLQkvLwotCS8vIEkgZ3Vlc3MgdGhpcyBzaG91bGQgZ28gaW50byAiTW9yZUZpbGVzLmgiLCBidXQgSSdtIG5vdCBzdXJlCi0JLy8gaG93IHdlJ3JlIGdvaW5nIHRvIGludGVncmF0ZSBzdWNoIGEgY29uY2VwdCBpbnRvIE1JQiB5ZXQuCisgICAgLy8gQSBjb252ZW5pZW50IHdyYXBwZXIgYXJvdW5kIFBCUmVhZCB3aGljaCBoYXMgdHdvIGFkdmFudGFnZXMKKyAgICAvLyBvdmVyIEZTUmVhZC4gIEZpcnN0LCBpdCB0YWtlcyBjb3VudCBhcyBhIHZhbHVlIHBhcmFtZXRlci4KKyAgICAvLyBTZWNvbmQsIGl0IHJlYWRzIGZyb20gYW4gYXJiaXRyYXJ5IG9mZnNldCBpbnRvIHRoZSBmaWxlLAorICAgIC8vIHdoaWNoIGF2b2lkcyBhIGJ1bmNoIG9mIFNldEZQb3MgY2FsbHMuCisgICAgLy8KKyAgICAvLyBJIGd1ZXNzIHRoaXMgc2hvdWxkIGdvIGludG8gIk1vcmVGaWxlcy5oIiwgYnV0IEknbSBub3Qgc3VyZQorICAgIC8vIGhvdyB3ZSdyZSBnb2luZyB0byBpbnRlZ3JhdGUgc3VjaCBhIGNvbmNlcHQgaW50byBNSUIgeWV0LgogewotCVBhcmFtQmxvY2tSZWMgcGI7Ci0JCi0JcGIuaW9QYXJhbS5pb1JlZk51bSAgICAgPSByZWZOdW07Ci0JcGIuaW9QYXJhbS5pb0J1ZmZlciAgICAgPSAoUHRyKSBidWZmZXI7Ci0JcGIuaW9QYXJhbS5pb1JlcUNvdW50ICAgPSBjb3VudDsKLQlwYi5pb1BhcmFtLmlvUG9zTW9kZSAgICA9IGZzRnJvbVN0YXJ0OwotCXBiLmlvUGFyYW0uaW9Qb3NPZmZzZXQgID0gb2Zmc2V0OwotCQotCXJldHVybiBQQlJlYWRTeW5jKCZwYik7CisgICAgUGFyYW1CbG9ja1JlYyBwYjsKKworICAgIHBiLmlvUGFyYW0uaW9SZWZOdW0gICAgID0gcmVmTnVtOworICAgIHBiLmlvUGFyYW0uaW9CdWZmZXIgICAgID0gKFB0cikgYnVmZmVyOworICAgIHBiLmlvUGFyYW0uaW9SZXFDb3VudCAgID0gY291bnQ7CisgICAgcGIuaW9QYXJhbS5pb1Bvc01vZGUgICAgPSBmc0Zyb21TdGFydDsKKyAgICBwYi5pb1BhcmFtLmlvUG9zT2Zmc2V0ICA9IG9mZnNldDsKKworICAgIHJldHVybiBQQlJlYWRTeW5jKCZwYik7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0xMjQsMTYgKzEyNCwxNiBAQAogLy8gd2UgZmlsbCBvdXQgbW9yZSBmaWVsZHMuCiAKIHN0cnVjdCBGcmFnVG9GaXhJbmZvIHsKLQlDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IJbG9jYXRvcjsJCQkJLy8gSG93IHRvIGZpbmQgdGhlIGZyYWdtZW50J3MgY29udGFpbmVyLgotCUNGcmFnQ29ubmVjdGlvbklEIAkJCWNvbm5JRDsJCQkJCS8vIENGTSBjb25uZWN0aW9uIHRvIHRoZSBmcmFnbWVudC4KLQlDRnJhZ0luaXRGdW5jdGlvbiAJCQlpbml0Um91dGluZTsJCQkvLyBUaGUgQ0ZNIGluaXQgcm91dGluZSBmb3IgdGhlIGZyYWdtZW50LgotCVBFRkNvbnRhaW5lckhlYWRlciAJCQljb250YWluZXJIZWFkZXI7CQkvLyBUaGUgQ0ZNIGhlYWRlciwgcmVhZCBpbiBmcm9tIHRoZSBjb250YWluZXIuCi0JUEVGU2VjdGlvbkhlYWRlcgkJCSpzZWN0aW9uSGVhZGVyczsJCS8vIFRoZSBDRk0gc2VjdGlvbiBoZWFkZXJzLiAgQSBwb2ludGVyIGJsb2NrIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgY29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCBlbGVtZW50cy4KLQlQRUZMb2FkZXJJbmZvSGVhZGVyCQkJKmxvYWRlclNlY3Rpb247CQkJLy8gVGhlIGVudGlyZSBDRk0gbG9hZGVyIHNlY3Rpb24gaW4gYSBwb2ludGVyIGJsb2NrLgotCVNJbnQxNgkJCQkJCWZpbGVSZWY7CQkJCS8vIEEgcmVhZC1vbmx5IHBhdGggdG8gdGhlIENGTSBjb250YWluZXIuICBXZSBrZWVwIHRoaXMgaGVyZSBiZWNhdXNlIG9uZSB0aGF0IG9uZSByb3V0aW5lIG5lZWRzIHRvIHJlYWQgZnJvbSB0aGUgY29udGFpbmVyLgotCXZvaWQgCQkJCQkJKnNlY3Rpb24wQmFzZTsJCQkvLyBUaGUgYmFzZSBhZGRyZXNzIG9mIHNlY3Rpb24gMCwgd2hpY2ggd2UgZ28gdGhyb3VnaCBob29wcyB0byBjYWxjdWxhdGUuCi0Jdm9pZCAJCQkJCQkqc2VjdGlvbjFCYXNlOwkJCS8vIFRoZSBiYXNlIGFkZHJlc3Mgb2Ygc2VjdGlvbiAxLCB3aGljaCB3ZSBnbyB0aHJvdWdoIGhvb3BzIHRvIGNhbGN1bGF0ZS4KLQlCb29sZWFuCQkJCQkJZGlzcG9zZVNlY3Rpb25Qb2ludGVyczsJLy8gU2VlIGJlbG93LgorICAgIENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciAgICAgICAgIGxvY2F0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3cgdG8gZmluZCB0aGUgZnJhZ21lbnQncyBjb250YWluZXIuCisgICAgQ0ZyYWdDb25uZWN0aW9uSUQgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGZyYWdtZW50LgorICAgIENGcmFnSW5pdEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFJvdXRpbmU7ICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQ0ZNIGluaXQgcm91dGluZSBmb3IgdGhlIGZyYWdtZW50LgorICAgIFBFRkNvbnRhaW5lckhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVySGVhZGVyOyAgICAgICAgICAgICAgICAvLyBUaGUgQ0ZNIGhlYWRlciwgcmVhZCBpbiBmcm9tIHRoZSBjb250YWluZXIuCisgICAgUEVGU2VjdGlvbkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VjdGlvbkhlYWRlcnM7ICAgICAgICAgICAgICAgIC8vIFRoZSBDRk0gc2VjdGlvbiBoZWFkZXJzLiAgQSBwb2ludGVyIGJsb2NrIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgY29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCBlbGVtZW50cy4KKyAgICBQRUZMb2FkZXJJbmZvSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICpsb2FkZXJTZWN0aW9uOyAgICAgICAgICAgICAgICAgLy8gVGhlIGVudGlyZSBDRk0gbG9hZGVyIHNlY3Rpb24gaW4gYSBwb2ludGVyIGJsb2NrLgorICAgIFNJbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUmVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSByZWFkLW9ubHkgcGF0aCB0byB0aGUgQ0ZNIGNvbnRhaW5lci4gIFdlIGtlZXAgdGhpcyBoZXJlIGJlY2F1c2Ugb25lIHRoYXQgb25lIHJvdXRpbmUgbmVlZHMgdG8gcmVhZCBmcm9tIHRoZSBjb250YWluZXIuCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWN0aW9uMEJhc2U7ICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhc2UgYWRkcmVzcyBvZiBzZWN0aW9uIDAsIHdoaWNoIHdlIGdvIHRocm91Z2ggaG9vcHMgdG8gY2FsY3VsYXRlLgorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VjdGlvbjFCYXNlOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlIGFkZHJlc3Mgb2Ygc2VjdGlvbiAxLCB3aGljaCB3ZSBnbyB0aHJvdWdoIGhvb3BzIHRvIGNhbGN1bGF0ZS4KKyAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZVNlY3Rpb25Qb2ludGVyczsgLy8gU2VlIGJlbG93LgogfTsKIHR5cGVkZWYgc3RydWN0IEZyYWdUb0ZpeEluZm8gRnJhZ1RvRml4SW5mbzsKIApAQCAtMTUxLDYxNCArMTUxLDYxNCBAQAogLy8gZGlzcG9zZVNlY3Rpb25Qb2ludGVycyByZW1haW5zIGFzIHZlc3RpZ2lhbCBzdXBwb3J0IGZvciB0aGUgY29uY2VwdC4KIAogc3RhdGljIE9TU3RhdHVzIFJlYWRDb250YWluZXJCYXNpY3MoRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4KQotCS8vIFJlYWRzIHNvbWUgYmFzaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29udGFpbmVyIG9mIHRoZQotCS8vIGZyYWdtZW50IHRvIGZpeCBhbmQgc3RvcmVzIGl0IGluIHZhcmlvdXMgZmllbGRzIG9mCi0JLy8gZnJhZ1RvRml4LiAgVGhpcyBpbmNsdWRlczoKLQkvLwotCS8vIG8gY29udGFpbmVySGVhZGVyIC0tIFRoZSBjb250YWluIGhlYWRlciBpdHNlbGYuCi0JLy8gbyBzZWN0aW9uSGVhZGVycyAgLS0gVGhlIGFycmF5IG9mIHNlY3Rpb24gaGVhZGVycyAoaW4gYSBuZXdseSBhbGxvY2F0ZWQgcG9pbnRlciBibG9jaykuCi0JLy8gbyBsb2FkZXJTZWN0aW9uICAgLS0gVGhlIGVudGlyZSBsb2FkZXIgc2VjdGlvbiAoaW4gYSBuZXdseSBhbGxvY2F0ZWQgcG9pbnRlciBibG9jaykuCi0JLy8KLQkvLyBBbHNvIHNldHMgZGlzcG9zZVNlY3Rpb25Qb2ludGVycyB0byBpbmRpY2F0ZSB3aGV0aGVyCi0JLy8gdGhlIGxhc3QgdHdvIHBvaW50ZXJzIHNob3VsZCBiZSBkaXNwb3NlZCBvZi4KLQkvLwotCS8vIEZpbmFsbHksIGl0IGxlYXZlcyB0aGUgY29udGFpbmVyIGZpbGUgb3BlbiBmb3IgbGF0ZXIKLQkvLyBmb2xrcyB3aG8gd2FudCB0byByZWFkIGRhdGEgZnJvbSBpdC4KKyAgICAvLyBSZWFkcyBzb21lIGJhc2ljIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbnRhaW5lciBvZiB0aGUKKyAgICAvLyBmcmFnbWVudCB0byBmaXggYW5kIHN0b3JlcyBpdCBpbiB2YXJpb3VzIGZpZWxkcyBvZgorICAgIC8vIGZyYWdUb0ZpeC4gIFRoaXMgaW5jbHVkZXM6CisgICAgLy8KKyAgICAvLyBvIGNvbnRhaW5lckhlYWRlciAtLSBUaGUgY29udGFpbiBoZWFkZXIgaXRzZWxmLgorICAgIC8vIG8gc2VjdGlvbkhlYWRlcnMgIC0tIFRoZSBhcnJheSBvZiBzZWN0aW9uIGhlYWRlcnMgKGluIGEgbmV3bHkgYWxsb2NhdGVkIHBvaW50ZXIgYmxvY2spLgorICAgIC8vIG8gbG9hZGVyU2VjdGlvbiAgIC0tIFRoZSBlbnRpcmUgbG9hZGVyIHNlY3Rpb24gKGluIGEgbmV3bHkgYWxsb2NhdGVkIHBvaW50ZXIgYmxvY2spLgorICAgIC8vCisgICAgLy8gQWxzbyBzZXRzIGRpc3Bvc2VTZWN0aW9uUG9pbnRlcnMgdG8gaW5kaWNhdGUgd2hldGhlcgorICAgIC8vIHRoZSBsYXN0IHR3byBwb2ludGVycyBzaG91bGQgYmUgZGlzcG9zZWQgb2YuCisgICAgLy8KKyAgICAvLyBGaW5hbGx5LCBpdCBsZWF2ZXMgdGhlIGNvbnRhaW5lciBmaWxlIG9wZW4gZm9yIGxhdGVyCisgICAgLy8gZm9sa3Mgd2hvIHdhbnQgdG8gcmVhZCBkYXRhIGZyb20gaXQuCiB7Ci0JT1NTdGF0dXMgCWVycjsKLQlVSW50MTYgCQlzZWN0aW9uSW5kZXg7Ci0JQm9vbGVhbiAJZm91bmQ7CisgICAgT1NTdGF0dXMgICAgICAgICAgICBlcnI7CisgICAgVUludDE2ICAgICAgICAgICAgICBzZWN0aW9uSW5kZXg7CisgICAgQm9vbGVhbiAgICAgICAgICAgICBmb3VuZDsKIAotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9jYXRvci5maWxlU3BlYyAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+Y29ubklEICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uID09IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyA9PSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+ZmlsZVJlZiA9PSAwKTsKLQkKLQlmcmFnVG9GaXgtPmRpc3Bvc2VTZWN0aW9uUG9pbnRlcnMgPSB0cnVlOwotCQotCS8vIE9wZW4gdXAgdGhlIGZpbGUsIHJlYWQgdGhlIGNvbnRhaW5lciBoZWFkLCB0aGVuIHJlYWQgaW4KLQkvLyBhbGwgdGhlIHNlY3Rpb24gaGVhZGVycywgdGhlbiBnbyBsb29raW5nIHRocm91Z2ggdGhlCi0JLy8gc2VjdGlvbiBoZWFkZXJzIGZvciB0aGUgbG9hZGVyIHNlY3Rpb24gKFBFRiBkZWZpbmVzCi0JLy8gdGhhdCB0aGVyZSBjYW4gYmUgb25seSBvbmUpLgotCQotCWVyciA9IEZTcE9wZW5ERihmcmFnVG9GaXgtPmxvY2F0b3IuZmlsZVNwZWMsIGZzUmRQZXJtLCAmZnJhZ1RvRml4LT5maWxlUmVmKTsKLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCWVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwKLQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCwKLQkJCQkJCQkJc2l6ZW9mKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyKSwKLQkJCQkJCQkJJmZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyKTsKLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJaWYgKCAgIGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzEgIT0ga1BFRlRhZzEKLQkJCQl8fCBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcyICE9IGtQRUZUYWcyCi0JCQkJfHwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuYXJjaGl0ZWN0dXJlICE9IGtDb21waWxlZENGcmFnQXJjaAotCQkJCXx8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLmZvcm1hdFZlcnNpb24gIT0ga1BFRlZlcnNpb24pIHsKLQkJCQllcnIgPSBjZnJhZ0ZyYWdtZW50Rm9ybWF0RXJyOwotCQkJfQotCQl9Ci0JCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJCWZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnMgPSAoUEVGU2VjdGlvbkhlYWRlciAqKSBOZXdQdHIoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICogc2l6ZW9mKFBFRlNlY3Rpb25IZWFkZXIpKTsKLQkJCWVyciA9IE1lbUVycm9yKCk7Ci0JCX0KLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLAotCQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCArIHNpemVvZihmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlciksCi0JCQkJCQkJCQlmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5zZWN0aW9uQ291bnQgKiBzaXplb2YoUEVGU2VjdGlvbkhlYWRlciksIAotCQkJCQkJCQkJZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyk7Ci0JCX0KLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJc2VjdGlvbkluZGV4ID0gMDsKLQkJCWZvdW5kID0gZmFsc2U7Ci0JCQl3aGlsZSAoIHNlY3Rpb25JbmRleCA8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAmJiAhIGZvdW5kICkgewotCQkJCWZvdW5kID0gKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5zZWN0aW9uS2luZCA9PSBrUEVGTG9hZGVyU2VjdGlvbik7Ci0JCQkJaWYgKCAhIGZvdW5kICkgewotCQkJCQlzZWN0aW9uSW5kZXggKz0gMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGVyciA9PSBub0VyciAmJiAhIGZvdW5kKSB7Ci0JCQllcnIgPSBjZnJhZ05vU2VjdGlvbkVycjsKLQkJfQotCQkKLQkJLy8gTm93IHJlYWQgYWxsb2NhdGUgYSBwb2ludGVyIGJsb2NrIGFuZCByZWFkIHRoZSBsb2FkZXIgc2VjdGlvbiBpbnRvIGl0LgotCQkKLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uID0gKFBFRkxvYWRlckluZm9IZWFkZXIgKikgTmV3UHRyKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5jb250YWluZXJMZW5ndGgpOwotCQkJZXJyID0gTWVtRXJyb3IoKTsKLQkJfQotCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQllcnIgPSBGU1JlYWRBdE9mZnNldChmcmFnVG9GaXgtPmZpbGVSZWYsIAotCQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCArIGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5jb250YWluZXJPZmZzZXQsCi0JCQkJCQkJCQlmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW3NlY3Rpb25JbmRleF0uY29udGFpbmVyTGVuZ3RoLCAKLQkJCQkJCQkJCWZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbik7Ci0JCX0JCQkJCi0JfQotCQotCS8vIE5vIGNsZWFuIHVwLiAgVGhlIGNsaWVudCBtdXN0IGluaXQgZnJhZ1RvRml4IHRvIHplcm9zIGFuZCB0aGVuCi0JLy8gY2xlYW4gdXAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIHJldHVybiBhbiBlcnJvci4KLQkJCi0JcmV0dXJuIGVycjsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmxvY2F0b3IuZmlsZVNwZWMgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmNvbm5JRCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiA9PSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnMgPT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmZpbGVSZWYgPT0gMCk7CisKKyAgICBmcmFnVG9GaXgtPmRpc3Bvc2VTZWN0aW9uUG9pbnRlcnMgPSB0cnVlOworCisgICAgLy8gT3BlbiB1cCB0aGUgZmlsZSwgcmVhZCB0aGUgY29udGFpbmVyIGhlYWQsIHRoZW4gcmVhZCBpbgorICAgIC8vIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzLCB0aGVuIGdvIGxvb2tpbmcgdGhyb3VnaCB0aGUKKyAgICAvLyBzZWN0aW9uIGhlYWRlcnMgZm9yIHRoZSBsb2FkZXIgc2VjdGlvbiAoUEVGIGRlZmluZXMKKyAgICAvLyB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSkuCisKKyAgICBlcnIgPSBGU3BPcGVuREYoZnJhZ1RvRml4LT5sb2NhdG9yLmZpbGVTcGVjLCBmc1JkUGVybSwgJmZyYWdUb0ZpeC0+ZmlsZVJlZik7CisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBlcnIgPSBGU1JlYWRBdE9mZnNldChmcmFnVG9GaXgtPmZpbGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlcik7CisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGlmICggICBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcxICE9IGtQRUZUYWcxCisgICAgICAgICAgICAgICAgfHwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMiAhPSBrUEVGVGFnMgorICAgICAgICAgICAgICAgIHx8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLmFyY2hpdGVjdHVyZSAhPSBrQ29tcGlsZWRDRnJhZ0FyY2gKKyAgICAgICAgICAgICAgICB8fCBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5mb3JtYXRWZXJzaW9uICE9IGtQRUZWZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgZXJyID0gY2ZyYWdGcmFnbWVudEZvcm1hdEVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzID0gKFBFRlNlY3Rpb25IZWFkZXIgKikgTmV3UHRyKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAqIHNpemVvZihQRUZTZWN0aW9uSGVhZGVyKSk7CisgICAgICAgICAgICBlcnIgPSBNZW1FcnJvcigpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQgKyBzaXplb2YoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICogc2l6ZW9mKFBFRlNlY3Rpb25IZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAgICAgc2VjdGlvbkluZGV4ID0gMDsKKyAgICAgICAgICAgIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAoIHNlY3Rpb25JbmRleCA8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAmJiAhIGZvdW5kICkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5zZWN0aW9uS2luZCA9PSBrUEVGTG9hZGVyU2VjdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKCAhIGZvdW5kICkgeworICAgICAgICAgICAgICAgICAgICBzZWN0aW9uSW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBub0VyciAmJiAhIGZvdW5kKSB7CisgICAgICAgICAgICBlcnIgPSBjZnJhZ05vU2VjdGlvbkVycjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyByZWFkIGFsbG9jYXRlIGEgcG9pbnRlciBibG9jayBhbmQgcmVhZCB0aGUgbG9hZGVyIHNlY3Rpb24gaW50byBpdC4KKworICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gPSAoUEVGTG9hZGVySW5mb0hlYWRlciAqKSBOZXdQdHIoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLmNvbnRhaW5lckxlbmd0aCk7CisgICAgICAgICAgICBlcnIgPSBNZW1FcnJvcigpOworICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQgKyBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW3NlY3Rpb25JbmRleF0uY29udGFpbmVyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLmNvbnRhaW5lckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBObyBjbGVhbiB1cC4gIFRoZSBjbGllbnQgbXVzdCBpbml0IGZyYWdUb0ZpeCB0byB6ZXJvcyBhbmQgdGhlbgorICAgIC8vIGNsZWFuIHVwIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSByZXR1cm4gYW4gZXJyb3IuCisKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgVUludDMyIERlY29kZVZDb3VudFZhbHVlKGNvbnN0IFVJbnQ4ICpzdGFydCwgVUludDMyICpvdXRDb3VudCkKLQkvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgbGVuZ3RoIFBFRiB2YWx1ZSwgCi0JLy8gd29yayBvdXQgdGhlIHZhbHVlIChpbiAqb3V0Q291bnQpLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIAotCS8vIGNvbnN1bWVkIGJ5IHRoZSB2YWx1ZS4KKyAgICAvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgbGVuZ3RoIFBFRiB2YWx1ZSwKKyAgICAvLyB3b3JrIG91dCB0aGUgdmFsdWUgKGluICpvdXRDb3VudCkuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAgICAvLyBjb25zdW1lZCBieSB0aGUgdmFsdWUuCiB7Ci0JVUludDggKgkJCWJ5dGVQdHI7Ci0JVUludDgJCQlieXRlOwotCVVJbnQzMgkJCWNvdW50OwotCQotCWJ5dGVQdHIgPSAoVUludDggKilzdGFydDsKLQkKLQkvLyBDb2RlIHRha2VuIGZyb20gIlBFRkJpbmFyeUZvcm1hdC5oIi4KLQljb3VudCA9IDA7Ci0JZG8gewotCQlieXRlID0gKmJ5dGVQdHIrKzsKLQkJY291bnQgPSAoY291bnQgPDwga1BFRlBrRGF0YVZDb3VudFNoaWZ0KSB8IChieXRlICYga1BFRlBrRGF0YVZDb3VudE1hc2spOwotCX0gd2hpbGUgKChieXRlICYga1BFRlBrRGF0YVZDb3VudEVuZE1hc2spICE9IDApOwotCQotCSpvdXRDb3VudCA9IGNvdW50OwotCXJldHVybiBieXRlUHRyIC0gc3RhcnQ7CisgICAgVUludDggKiAgICAgICAgICAgICAgICAgICAgIGJ5dGVQdHI7CisgICAgVUludDggICAgICAgICAgICAgICAgICAgICAgIGJ5dGU7CisgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIGNvdW50OworCisgICAgYnl0ZVB0ciA9IChVSW50OCAqKXN0YXJ0OworCisgICAgLy8gQ29kZSB0YWtlbiBmcm9tICJQRUZCaW5hcnlGb3JtYXQuaCIuCisgICAgY291bnQgPSAwOworICAgIGRvIHsKKyAgICAgICAgYnl0ZSA9ICpieXRlUHRyKys7CisgICAgICAgIGNvdW50ID0gKGNvdW50IDw8IGtQRUZQa0RhdGFWQ291bnRTaGlmdCkgfCAoYnl0ZSAmIGtQRUZQa0RhdGFWQ291bnRNYXNrKTsKKyAgICB9IHdoaWxlICgoYnl0ZSAmIGtQRUZQa0RhdGFWQ291bnRFbmRNYXNrKSAhPSAwKTsKKworICAgICpvdXRDb3VudCA9IGNvdW50OworICAgIHJldHVybiBieXRlUHRyIC0gc3RhcnQ7CiB9CiAKIHN0YXRpYyBVSW50MzIgRGVjb2RlSW5zdHJDb3VudFZhbHVlKGNvbnN0IFVJbnQ4ICppbk9wU3RhcnQsIFVJbnQzMiAqb3V0Q291bnQpCi0JLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhbiBvcGNvZGUgKGluT3BTdGFydCksIHdvcmsgb3V0IHRoZSAKLQkvLyBjb3VudCBhcmd1bWVudCBmb3IgdGhhdCBvcGNvZGUgKCpvdXRDb3VudCkuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgCi0JLy8gYnl0ZXMgY29uc3VtZWQgYnkgdGhlIG9wY29kZSBhbmQgY291bnQgY29tYmluYXRpb24uCisgICAgLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBhbiBvcGNvZGUgKGluT3BTdGFydCksIHdvcmsgb3V0IHRoZQorICAgIC8vIGNvdW50IGFyZ3VtZW50IGZvciB0aGF0IG9wY29kZSAoKm91dENvdW50KS4gIFJldHVybnMgdGhlIG51bWJlciBvZgorICAgIC8vIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSBvcGNvZGUgYW5kIGNvdW50IGNvbWJpbmF0aW9uLgogewotCU1vcmVBc3NlcnRRKGluT3BTdGFydCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKG91dENvdW50ICAhPSBuaWwpOwotCQotCWlmIChQRUZQa0RhdGFDb3VudDUoKmluT3BTdGFydCkgIT0gMCkKLQl7Ci0JCS8vIFNpbXBsZSBjYXNlLCBjb3VudCBlbmNvZGVkIGluIG9wY29kZS4KLQkJKm91dENvdW50ID0gUEVGUGtEYXRhQ291bnQ1KCppbk9wU3RhcnQpOwotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gVmFyaWFibGUtbGVuZ3RoIGNhc2UuCi0JCXJldHVybiAxICsgRGVjb2RlVkNvdW50VmFsdWUoaW5PcFN0YXJ0ICsgMSwgb3V0Q291bnQpOwotCX0KKyAgICBNb3JlQXNzZXJ0UShpbk9wU3RhcnQgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShvdXRDb3VudCAgIT0gbmlsKTsKKworICAgIGlmIChQRUZQa0RhdGFDb3VudDUoKmluT3BTdGFydCkgIT0gMCkKKyAgICB7CisgICAgICAgIC8vIFNpbXBsZSBjYXNlLCBjb3VudCBlbmNvZGVkIGluIG9wY29kZS4KKyAgICAgICAgKm91dENvdW50ID0gUEVGUGtEYXRhQ291bnQ1KCppbk9wU3RhcnQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gVmFyaWFibGUtbGVuZ3RoIGNhc2UuCisgICAgICAgIHJldHVybiAxICsgRGVjb2RlVkNvdW50VmFsdWUoaW5PcFN0YXJ0ICsgMSwgb3V0Q291bnQpOworICAgIH0KIH0KIAogc3RhdGljIE9TU3RhdHVzIFVucGFja1BFRkRhdGFTZWN0aW9uKGNvbnN0IFVJbnQ4ICogY29uc3QgcGFja2VkRGF0YSwgICBVSW50MzIgcGFja2VkU2l6ZSwKLQkJCQkJCQkJICAgICAgICAgICBVSW50OCAqIGNvbnN0IHVucGFja2VkRGF0YSwgVUludDMyIHVucGFja2VkU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQ4ICogY29uc3QgdW5wYWNrZWREYXRhLCBVSW50MzIgdW5wYWNrZWRTaXplKQogewotCU9TRXJyCQkJZXJyOwotCVVJbnQzMgkJCW9mZnNldDsKLQlVSW50OAkJCW9wQ29kZTsKLQlVSW50OCAqCQkJdW5wYWNrQ3Vyc29yOwotCQotCU1vcmVBc3NlcnRRKHBhY2tlZERhdGEgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0USh1bnBhY2tlZERhdGEgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0USh1bnBhY2tlZFNpemUgPj0gcGFja2VkU2l6ZSk7CisgICAgT1NFcnIgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKyAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OworICAgIFVJbnQ4ICAgICAgICAgICAgICAgICAgICAgICBvcENvZGU7CisgICAgVUludDggKiAgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvcjsKIAotCS8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0cyBhc3N1bWUgdGhhdCB0aGUgY2xpZW50IGFsbG9jYXRlZCB0aGUgbWVtb3J5IHdpdGggTmV3UHRyLCAKLQkvLyB3aGljaCBtYXkgbm90IGFsd2F5cyBiZSB0cnVlLiAgSG93ZXZlciwgdGhlIGFzc2VydHMnIHZhbHVlIGluIHByZXZlbnRpbmcgYWNjaWRlbnRhbCAKLQkvLyBtZW1vcnkgYmxvY2sgb3ZlcnJ1bnMgb3V0d2VpZ2hzIHRoZSBwb3NzaWJsZSBtYWludGVuYW5jZSBlZmZvcnQuCi0JCi0JTW9yZUFzc2VydFEoIHBhY2tlZFNpemUgICA9PSBHZXRQdHJTaXplKCAoUHRyKSBwYWNrZWREYXRhICApICk7Ci0JTW9yZUFzc2VydFEoIHVucGFja2VkU2l6ZSA9PSBHZXRQdHJTaXplKCAoUHRyKSB1bnBhY2tlZERhdGEpICk7Ci0JCi0JZXJyICAgICAgICAgID0gbm9FcnI7Ci0Jb2Zmc2V0ICAgICAgID0gMDsKLQl1bnBhY2tDdXJzb3IgPSB1bnBhY2tlZERhdGE7Ci0Jd2hpbGUgKG9mZnNldCA8IHBhY2tlZFNpemUpIHsKLQkJTW9yZUFzc2VydFEodW5wYWNrQ3Vyc29yIDwgJnVucGFja2VkRGF0YVt1bnBhY2tlZFNpemVdKTsKLQkJCi0JCW9wQ29kZSA9IHBhY2tlZERhdGFbb2Zmc2V0XTsKLQkJCi0JCXN3aXRjaCAoUEVGUGtEYXRhT3Bjb2RlKG9wQ29kZSkpIHsKLQkJCWNhc2Uga1BFRlBrRGF0YVplcm86Ci0JCQkJewotCQkJCQlVSW50MzIJY291bnQ7Ci0JCQkJCQotCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjb3VudCk7Ci0JCQkJCQotCQkJCQlNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY291bnQpOwotCQkJCQl1bnBhY2tDdXJzb3IgKz0gY291bnQ7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIGtQRUZQa0RhdGFCbG9jazoKLQkJCQl7Ci0JCQkJCVVJbnQzMglibG9ja1NpemU7Ci0JCQkJCQotCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOwotCQkJCQkKLQkJCQkJQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7Ci0JCQkJCXVucGFja0N1cnNvciArPSBibG9ja1NpemU7Ci0JCQkJCW9mZnNldCArPSBibG9ja1NpemU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIGtQRUZQa0RhdGFSZXBlYXQ6Ci0JCQkJewotCQkJCQlVSW50MzIJYmxvY2tTaXplOwotCQkJCQlVSW50MzIJcmVwZWF0Q291bnQ7Ci0JCQkJCVVJbnQzMiAgbG9vcENvdW50ZXI7Ci0JCQkJCQotCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOwotCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKLQkJCQkJcmVwZWF0Q291bnQgKz0gMTsJLy8gc3RvcmVkIHZhbHVlIGlzIChyZXBlYXRDb3VudCAtIDEpCi0JCQkJCQotCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgewotCQkJCQkJQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gYmxvY2tTaXplOwotCQkJCQl9Ci0JCQkJCW9mZnNldCArPSBibG9ja1NpemU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIGtQRUZQa0RhdGFSZXBlYXRCbG9jazoKLQkJCQl7Ci0JCQkJCVVJbnQzMgljb21tb25TaXplOwotCQkJCQlVSW50MzIJY3VzdG9tU2l6ZTsKLQkJCQkJVUludDMyCXJlcGVhdENvdW50OwotCQkJCQljb25zdCBVSW50OCAqY29tbW9uRGF0YTsKLQkJCQkJY29uc3QgVUludDggKmN1c3RvbURhdGE7Ci0JCQkJCVVJbnQzMiBsb29wQ291bnRlcjsKLQkJCQkJCi0JCQkJCW9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvbW1vblNpemUpOwotCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmN1c3RvbVNpemUpOwotCQkJCQlvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKLQkJCQkJCi0JCQkJCWNvbW1vbkRhdGEgPSAmcGFja2VkRGF0YVtvZmZzZXRdOwotCQkJCQljdXN0b21EYXRhID0gJnBhY2tlZERhdGFbb2Zmc2V0ICsgY29tbW9uU2l6ZV07Ci0JCQkJCQotCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgewotCQkJCQkJQmxvY2tNb3ZlRGF0YShjb21tb25EYXRhLCB1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOwotCQkJCQkJdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7Ci0JCQkJCQlCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJCWN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJfQotCQkJCQlCbG9ja01vdmVEYXRhKGNvbW1vbkRhdGEsIHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7Ci0JCQkJCXVucGFja0N1cnNvciArPSBjb21tb25TaXplOwotCQkJCQlvZmZzZXQgKz0gKHJlcGVhdENvdW50ICogKGNvbW1vblNpemUgKyBjdXN0b21TaXplKSkgKyBjb21tb25TaXplOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQotCQkJY2FzZSBrUEVGUGtEYXRhUmVwZWF0WmVybzoKLQkJCQl7Ci0JCQkJCVVJbnQzMgljb21tb25TaXplOwotCQkJCQlVSW50MzIJY3VzdG9tU2l6ZTsKLQkJCQkJVUludDMyCXJlcGVhdENvdW50OwotCQkJCQljb25zdCBVSW50OCAqY3VzdG9tRGF0YTsKLQkJCQkJVUludDMyIGxvb3BDb3VudGVyOwotCQkJCQkKLQkJCQkJb2Zmc2V0ICs9IERlY29kZUluc3RyQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY29tbW9uU2l6ZSk7Ci0JCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY3VzdG9tU2l6ZSk7Ci0JCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmcmVwZWF0Q291bnQpOwotCQkJCQkKLQkJCQkJY3VzdG9tRGF0YSA9ICZwYWNrZWREYXRhW29mZnNldF07Ci0JCQkJCQotCQkJCQlmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgewotCQkJCQkJTW9yZUJsb2NrWmVybyh1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOwotCQkJCQkJdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7Ci0JCQkJCQlCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJCWN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKLQkJCQkJfQotCQkJCQlNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7Ci0JCQkJCXVucGFja0N1cnNvciArPSBjb21tb25TaXplOwotCQkJCQlvZmZzZXQgKz0gcmVwZWF0Q291bnQgKiBjdXN0b21TaXplOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQotCQkJZGVmYXVsdDoKLQkJCQkjaWYgTU9SRV9ERUJVRwotCQkJCQlEZWJ1Z1N0cigiXHBVbnBhY2tQRUZEYXRhU2VjdGlvbjogVW5leHBlY3RlZCBkYXRhIG9wY29kZSIpOwotCQkJCSNlbmRpZgotCQkJCWVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOwotCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCisgICAgTW9yZUFzc2VydFEocGFja2VkRGF0YSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHVucGFja2VkRGF0YSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHVucGFja2VkU2l6ZSA+PSBwYWNrZWRTaXplKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgYXNzZXJ0cyBhc3N1bWUgdGhhdCB0aGUgY2xpZW50IGFsbG9jYXRlZCB0aGUgbWVtb3J5IHdpdGggTmV3UHRyLAorICAgIC8vIHdoaWNoIG1heSBub3QgYWx3YXlzIGJlIHRydWUuICBIb3dldmVyLCB0aGUgYXNzZXJ0cycgdmFsdWUgaW4gcHJldmVudGluZyBhY2NpZGVudGFsCisgICAgLy8gbWVtb3J5IGJsb2NrIG92ZXJydW5zIG91dHdlaWdocyB0aGUgcG9zc2libGUgbWFpbnRlbmFuY2UgZWZmb3J0LgorCisgICAgTW9yZUFzc2VydFEoIHBhY2tlZFNpemUgICA9PSBHZXRQdHJTaXplKCAoUHRyKSBwYWNrZWREYXRhICApICk7CisgICAgTW9yZUFzc2VydFEoIHVucGFja2VkU2l6ZSA9PSBHZXRQdHJTaXplKCAoUHRyKSB1bnBhY2tlZERhdGEpICk7CisKKyAgICBlcnIgICAgICAgICAgPSBub0VycjsKKyAgICBvZmZzZXQgICAgICAgPSAwOworICAgIHVucGFja0N1cnNvciA9IHVucGFja2VkRGF0YTsKKyAgICB3aGlsZSAob2Zmc2V0IDwgcGFja2VkU2l6ZSkgeworICAgICAgICBNb3JlQXNzZXJ0USh1bnBhY2tDdXJzb3IgPCAmdW5wYWNrZWREYXRhW3VucGFja2VkU2l6ZV0pOworCisgICAgICAgIG9wQ29kZSA9IHBhY2tlZERhdGFbb2Zmc2V0XTsKKworICAgICAgICBzd2l0Y2ggKFBFRlBrRGF0YU9wY29kZShvcENvZGUpKSB7CisgICAgICAgICAgICBjYXNlIGtQRUZQa0RhdGFaZXJvOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIGNvdW50OworCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvdW50KTsKKworICAgICAgICAgICAgICAgICAgICBNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY291bnQpOworICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGtQRUZQa0RhdGFCbG9jazoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBibG9ja1NpemU7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZUluc3RyQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmYmxvY2tTaXplKTsKKworICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKCZwYWNrZWREYXRhW29mZnNldF0sIHVucGFja0N1cnNvciwgYmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga1BFRlBrRGF0YVJlcGVhdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBibG9ja1NpemU7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICByZXBlYXRDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICBsb29wQ291bnRlcjsKKworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgcmVwZWF0Q291bnQgKz0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZWQgdmFsdWUgaXMgKHJlcGVhdENvdW50IC0gMSkKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tNb3ZlRGF0YSgmcGFja2VkRGF0YVtvZmZzZXRdLCB1bnBhY2tDdXJzb3IsIGJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gYmxvY2tTaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBibG9ja1NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGtQRUZQa0RhdGFSZXBlYXRCbG9jazoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdENvdW50OworICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCAqY29tbW9uRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVUludDggKmN1c3RvbURhdGE7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBsb29wQ291bnRlcjsKKworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjb21tb25TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZVZDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjdXN0b21TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZVZDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZyZXBlYXRDb3VudCk7CisKKyAgICAgICAgICAgICAgICAgICAgY29tbW9uRGF0YSA9ICZwYWNrZWREYXRhW29mZnNldF07CisgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgPSAmcGFja2VkRGF0YVtvZmZzZXQgKyBjb21tb25TaXplXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tNb3ZlRGF0YShjb21tb25EYXRhLCB1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKGNvbW1vbkRhdGEsIHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvciArPSBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKHJlcGVhdENvdW50ICogKGNvbW1vblNpemUgKyBjdXN0b21TaXplKSkgKyBjb21tb25TaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBrUEVGUGtEYXRhUmVwZWF0WmVybzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdENvdW50OworICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCAqY3VzdG9tRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyIGxvb3BDb3VudGVyOworCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvbW1vblNpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmN1c3RvbVNpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKKworICAgICAgICAgICAgICAgICAgICBjdXN0b21EYXRhID0gJnBhY2tlZERhdGFbb2Zmc2V0XTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGxvb3BDb3VudGVyID0gMDsgbG9vcENvdW50ZXIgPCByZXBlYXRDb3VudDsgbG9vcENvdW50ZXIrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgTW9yZUJsb2NrWmVybyh1bnBhY2tDdXJzb3IsIGNvbW1vblNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKGN1c3RvbURhdGEsIHVucGFja0N1cnNvciwgY3VzdG9tU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgKz0gY3VzdG9tU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvciArPSBjb21tb25TaXplOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gcmVwZWF0Q291bnQgKiBjdXN0b21TaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgICAgICAgICBEZWJ1Z1N0cigiXHBVbnBhY2tQRUZEYXRhU2VjdGlvbjogVW5leHBlY3RlZCBkYXRhIG9wY29kZSIpOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOworICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKIGxlYXZlTm93OgotCXJldHVybiBlcnI7CisgICAgcmV0dXJuIGVycjsKIH0KIAotLyoJU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyBSYXRpb25hbGUKLQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCU9LLCBoZXJlJ3Mgd2hlcmUgdGhpbmdzIGdldCB3ZWlyZC4gIEluIG9yZGVyIHRvIHJ1biB0aGUgcmVsb2NhdGlvbgotCWVuZ2luZSwgSSBuZWVkIHRvIGJlIGFibGUgdG8gZmluZCB0aGUgYmFzZSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZAotCXNlY3Rpb24gb2YgdGhlIGZyYWdtZW50IHdlJ3JlIGZpeGluZyB1cCBnaXZlbiBvbmx5IGl0cyBzZWN0aW9uIG51bWJlci4KLQlUaGlzIGlzbid0IGhhcmQgZm9yIENGTSB0byBkbyBiZWNhdXNlIGl0J3MgdGhlIG9uZSB0aGF0IGluc3RhbnRpYXRlZCB0aGUKLQlzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGxhY2UuICBJdCdzIHN1cnByaXNpbmdseSBkaWZmaWN1bHQgdG8gZG8gaWYKLQl5b3UncmUgbm90IENGTS4gIFtBbmQgeW91IGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBwcml2YXRlIENGTSBBUGlzIGZvciAKLQlkb2luZyBpdC5dCi0JCi0JW0FsYW4gTGlsbGljaCBpcyBnb2luZyB0byBraWxsIG1lIHdoZW4gaGUgcmVhZHMgdGhpcyEgIEkgc2hvdWxkIHBvaW50IG91dAotCSB0aGF0IFRWZWN0b3IncyBkb24ndCBoYXZlIHRvIGNvbnRhaW4gdHdvIHdvcmRzLCB0aGV5IGNhbiBiZSBsb25nZXIsCi0JIGFuZCB0aGF0IHRoZSBzZWNvbmQgd29yZCBpc24ndCBuZWNlc3NhcmlseSBhIFRPQyBwb2ludGVyLCBpdCdzCi0JIGp1c3QgdGhhdCB0aGUgY2FsbGluZyBjb252ZW50aW9ucyByZXF1aXJlIHRoYXQgaXQgYmUgcHV0IGluIHRoZQotCSBUT0MgcmVnaXN0ZXIgd2hlbiB0aGUgY29kZSBpcyBjYWxsZWQuCi0JIAotCSBGdXJ0aGVybW9yZSwgdGhlIGNvZGUgc2VjdGlvbiBpc24ndCBhbHdheXMgc2VjdGlvbiAwLCBhbmQgdGhlIGRhdGEKLQkgc2VjdGlvbiBpc24ndCBhbHdheXMgc2VjdGlvbiAxLCBhbmQgdGhlcmUgY2FuIGJlIHplcm8gdG8gbWFueSBzZWN0aW9ucwotCSBvZiBlYWNoIHR5cGUuCi0JIAotCSBCdXQgdGhlc2UgbmljZXRpZXMgYXJlIGJlc2lkZXMgdGhlIHBvaW50OiBJJ20gZG9pbmcgc29tZXRoaW5nIHRyaWNreSAKLQkgYmVjYXVzZSBJIGRvbid0IGhhdmUgYSBuaWNlIEFQSSBmb3IgZ2V0dGluZyBzZWN0aW9uIGJhc2UgYWRkcmVzc2VzLiAgCi0JIElmIEkgaGFkIGEgbmljZSBBUEkgZm9yIGRvaW5nIHRoYXQsIG5vbmUgb2YgdGhpcyBjb2RlIHdvdWxkIGV4aXN0LgotCV0KKy8qICAgICAgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyBSYXRpb25hbGUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0JVGhlIHRlY2huaXF1ZSBpcyB2ZXJ5IHNuZWFreSAodGhhbmtzIHRvIEVyaWMgR3JhbnQpLiAgVGhlIGZyYWdtZW50IHRvIAotCWZpeCBuZWNlc3NhcmlseSBoYXMgYSBDRk0gaW5pdCByb3V0aW5lIChiZWNhdXNlIGl0IG5lZWRzIHRoYXQgcm91dGluZSAKLQlpbiBvcmRlciB0byBjYXB0dXJlIHRoZSBmcmFnbWVudCBsb2NhdGlvbiBhbmQgY29ubmVjdGlvbiBJRCkuICBUaHVzIHRoZSAKLQlmcmFnbWVudCB0byBmaXggbXVzdCBoYXZlIGEgVFZlY3RvciBpbiBpdHMgZGF0YSBzZWN0aW9uLiAgVFZlY3RvcnMgYXJlIAotCWludGVyZXN0aW5nIGJlY2F1c2UgdGhleSdyZSBtYWRlIHVwIG9mIHR3byB3b3Jkcy4gIFRoZSBmaXJzdCBpcyBhIHBvaW50ZXIgCi0JdG8gdGhlIGNvZGUgdGhhdCBpbXBsZW1lbnRzIHRoZSByb3V0aW5lOyB0aGUgc2Vjb25kIGlzIGEgcG9pbnRlciB0byB0aGUgVE9DCi0JZm9yIHRoZSBmcmFnbWVudCB0aGF0J3MgZXhwb3J0aW5nIHRoZSBUVmVjdG9yLiAgSG93IFRWZWN0b3JzIGFyZQotCWNyZWF0ZWQgaXMgaW50ZXJlc3RpbmcgdG9vLiAgT24gZGlzaywgYSBUVmVjdG9yIGNvbnNpc3RzIG9mIHR3byB3b3JkcywKLQl0aGUgZmlyc3QgYmVpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgY29kZSBzZWN0aW9uIHRvIHRoZQotCXJvdXRpbmUsIHRoZSBzZWNvbmQgYmVpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWN0aW9uCi0JdG8gdGhlIFRPQyBiYXNlLiAgV2hlbiBDRk0gcHJlcGFyZXMgYSBUVmVjdG9yLCBpdCBhcHBsaWVzIHRoZSBmb2xsb3dpbmcKLQl0cmFuc2Zvcm06Ci0JCi0JCXR2ZWN0b3IuY29kZVB0ciA9IHR2ZWN0b3IuY29kZU9mZnNldCArIGJhc2Ugb2YgY29kZSBzZWN0aW9uCi0JCXR2ZWN0b3IudG9jUHRyICA9IHR2ZWN0b3IudG9jT2Zmc2V0ICArIGJhc2Ugb2YgZGF0YSBzZWN0aW9uCi0JCQotCU5vdywgeW91IGNhbiByZXZlcnNlIHRoZXNlIHF1ZXN0aW9ucyB0byBtYWtlIHRoZW06Ci0JCi0JCWJhc2Ugb2YgY29kZSBzZWN0aW9uID0gdHZlY3Rvci5jb2RlUHRyIC0gdHZlY3Rvci5jb2RlT2Zmc2V0Ci0JCWJhc2Ugb2YgZGF0YSBzZWN0aW9uID0gdHZlY3Rvci5kYXRhUHRyIC0gdHZlY3Rvci5kYXRhT2Zmc2V0Ci0JCi0JU28gaWYgeW91IGNhbiBmaW5kIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgYW5kCi0JZmluZCB0aGUgb3JpZ2luYWwgb2Zmc2V0cyB0aGF0IG1hZGUgdXAgdGhlIFRWZWN0b3IsIHlvdSBjYW4gdGhlbgotCWNhbGN1bGF0ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGJvdGggdGhlIGNvZGUgYW5kIGRhdGEgc2VjdGlvbnMuCi0JCi0JRmluZGluZyB0aGUgcmVsb2NhdGVkIGNvbnRlbnRzIG9mIHRoZSBUVmVjdG9yIGlzIGVhc3k7IEkgc2ltcGx5IAotCXJlcXVpcmUgdGhlIGNsaWVudCB0byBwYXNzIGluIGEgcG9pbnRlciB0byBpdHMgaW5pdCByb3V0aW5lLiAKLQlBIHJvdXRpbmUgcG9pbnRlciBpcyBhIFRWZWN0b3IgcG9pbnRlciwgc28geW91IGNhbiBqdXN0IGNhc3QgaXQgCi0JYW5kIGV4dHJhY3QgdGhlIHBhaXIgb2Ygd29yZHMuCisgICAgT0ssIGhlcmUncyB3aGVyZSB0aGluZ3MgZ2V0IHdlaXJkLiAgSW4gb3JkZXIgdG8gcnVuIHRoZSByZWxvY2F0aW9uCisgICAgZW5naW5lLCBJIG5lZWQgdG8gYmUgYWJsZSB0byBmaW5kIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkCisgICAgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgd2UncmUgZml4aW5nIHVwIGdpdmVuIG9ubHkgaXRzIHNlY3Rpb24gbnVtYmVyLgorICAgIFRoaXMgaXNuJ3QgaGFyZCBmb3IgQ0ZNIHRvIGRvIGJlY2F1c2UgaXQncyB0aGUgb25lIHRoYXQgaW5zdGFudGlhdGVkIHRoZQorICAgIHNlY3Rpb25zIGluIHRoZSBmaXJzdCBwbGFjZS4gIEl0J3Mgc3VycHJpc2luZ2x5IGRpZmZpY3VsdCB0byBkbyBpZgorICAgIHlvdSdyZSBub3QgQ0ZNLiAgW0FuZCB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgQ0ZNIEFQaXMgZm9yCisgICAgZG9pbmcgaXQuXQogCi0JRmluZGluZyB0aGUgb3JpZ2luYWwgb2Zmc2V0cyBpcyBhIHRyaWNraWVyLiAgTXkgdGVjaG5pcXVlIGlzIHRvCi0JbG9vayB1cCB0aGUgaW5pdCByb3V0aW5lIGluIHRoZSBmcmFnbWVudCdzIGxvYWRlciBpbmZvIGhlYWRlci4gIFRoaXMKLQl5aWVsZHMgdGhlIHNlY3Rpb24gbnVtYmVyIGFuZCBvZmZzZXQgd2hlcmUgdGhlIGluaXQgcm91dGluZSdzIHVucmVsb2NhdGVkIAotCVRWZWN0b3IgZXhpc3RzLiAgT25jZSBJIGhhdmUgdGhhdCwgSSBjYW4ganVzdCByZWFkIHRoZSB1bnJlbG9jYXRlZCBUVmVjdG9yCi0Jb3V0IG9mIHRoZSBmaWxlIGFuZCBleHRyYWN0IHRoZSBvZmZzZXRzLgorICAgIFtBbGFuIExpbGxpY2ggaXMgZ29pbmcgdG8ga2lsbCBtZSB3aGVuIGhlIHJlYWRzIHRoaXMhICBJIHNob3VsZCBwb2ludCBvdXQKKyAgICAgdGhhdCBUVmVjdG9yJ3MgZG9uJ3QgaGF2ZSB0byBjb250YWluIHR3byB3b3JkcywgdGhleSBjYW4gYmUgbG9uZ2VyLAorICAgICBhbmQgdGhhdCB0aGUgc2Vjb25kIHdvcmQgaXNuJ3QgbmVjZXNzYXJpbHkgYSBUT0MgcG9pbnRlciwgaXQncworICAgICBqdXN0IHRoYXQgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgcmVxdWlyZSB0aGF0IGl0IGJlIHB1dCBpbiB0aGUKKyAgICAgVE9DIHJlZ2lzdGVyIHdoZW4gdGhlIGNvZGUgaXMgY2FsbGVkLgorCisgICAgIEZ1cnRoZXJtb3JlLCB0aGUgY29kZSBzZWN0aW9uIGlzbid0IGFsd2F5cyBzZWN0aW9uIDAsIGFuZCB0aGUgZGF0YQorICAgICBzZWN0aW9uIGlzbid0IGFsd2F5cyBzZWN0aW9uIDEsIGFuZCB0aGVyZSBjYW4gYmUgemVybyB0byBtYW55IHNlY3Rpb25zCisgICAgIG9mIGVhY2ggdHlwZS4KKworICAgICBCdXQgdGhlc2UgbmljZXRpZXMgYXJlIGJlc2lkZXMgdGhlIHBvaW50OiBJJ20gZG9pbmcgc29tZXRoaW5nIHRyaWNreQorICAgICBiZWNhdXNlIEkgZG9uJ3QgaGF2ZSBhIG5pY2UgQVBJIGZvciBnZXR0aW5nIHNlY3Rpb24gYmFzZSBhZGRyZXNzZXMuCisgICAgIElmIEkgaGFkIGEgbmljZSBBUEkgZm9yIGRvaW5nIHRoYXQsIG5vbmUgb2YgdGhpcyBjb2RlIHdvdWxkIGV4aXN0LgorICAgIF0KKworICAgIFRoZSB0ZWNobmlxdWUgaXMgdmVyeSBzbmVha3kgKHRoYW5rcyB0byBFcmljIEdyYW50KS4gIFRoZSBmcmFnbWVudCB0bworICAgIGZpeCBuZWNlc3NhcmlseSBoYXMgYSBDRk0gaW5pdCByb3V0aW5lIChiZWNhdXNlIGl0IG5lZWRzIHRoYXQgcm91dGluZQorICAgIGluIG9yZGVyIHRvIGNhcHR1cmUgdGhlIGZyYWdtZW50IGxvY2F0aW9uIGFuZCBjb25uZWN0aW9uIElEKS4gIFRodXMgdGhlCisgICAgZnJhZ21lbnQgdG8gZml4IG11c3QgaGF2ZSBhIFRWZWN0b3IgaW4gaXRzIGRhdGEgc2VjdGlvbi4gIFRWZWN0b3JzIGFyZQorICAgIGludGVyZXN0aW5nIGJlY2F1c2UgdGhleSdyZSBtYWRlIHVwIG9mIHR3byB3b3Jkcy4gIFRoZSBmaXJzdCBpcyBhIHBvaW50ZXIKKyAgICB0byB0aGUgY29kZSB0aGF0IGltcGxlbWVudHMgdGhlIHJvdXRpbmU7IHRoZSBzZWNvbmQgaXMgYSBwb2ludGVyIHRvIHRoZSBUT0MKKyAgICBmb3IgdGhlIGZyYWdtZW50IHRoYXQncyBleHBvcnRpbmcgdGhlIFRWZWN0b3IuICBIb3cgVFZlY3RvcnMgYXJlCisgICAgY3JlYXRlZCBpcyBpbnRlcmVzdGluZyB0b28uICBPbiBkaXNrLCBhIFRWZWN0b3IgY29uc2lzdHMgb2YgdHdvIHdvcmRzLAorICAgIHRoZSBmaXJzdCBiZWluZyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjb2RlIHNlY3Rpb24gdG8gdGhlCisgICAgcm91dGluZSwgdGhlIHNlY29uZCBiZWluZyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24KKyAgICB0byB0aGUgVE9DIGJhc2UuICBXaGVuIENGTSBwcmVwYXJlcyBhIFRWZWN0b3IsIGl0IGFwcGxpZXMgdGhlIGZvbGxvd2luZworICAgIHRyYW5zZm9ybToKKworICAgICAgICB0dmVjdG9yLmNvZGVQdHIgPSB0dmVjdG9yLmNvZGVPZmZzZXQgKyBiYXNlIG9mIGNvZGUgc2VjdGlvbgorICAgICAgICB0dmVjdG9yLnRvY1B0ciAgPSB0dmVjdG9yLnRvY09mZnNldCAgKyBiYXNlIG9mIGRhdGEgc2VjdGlvbgorCisgICAgTm93LCB5b3UgY2FuIHJldmVyc2UgdGhlc2UgcXVlc3Rpb25zIHRvIG1ha2UgdGhlbToKKworICAgICAgICBiYXNlIG9mIGNvZGUgc2VjdGlvbiA9IHR2ZWN0b3IuY29kZVB0ciAtIHR2ZWN0b3IuY29kZU9mZnNldAorICAgICAgICBiYXNlIG9mIGRhdGEgc2VjdGlvbiA9IHR2ZWN0b3IuZGF0YVB0ciAtIHR2ZWN0b3IuZGF0YU9mZnNldAorCisgICAgU28gaWYgeW91IGNhbiBmaW5kIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgYW5kCisgICAgZmluZCB0aGUgb3JpZ2luYWwgb2Zmc2V0cyB0aGF0IG1hZGUgdXAgdGhlIFRWZWN0b3IsIHlvdSBjYW4gdGhlbgorICAgIGNhbGN1bGF0ZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGJvdGggdGhlIGNvZGUgYW5kIGRhdGEgc2VjdGlvbnMuCisKKyAgICBGaW5kaW5nIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgaXMgZWFzeTsgSSBzaW1wbHkKKyAgICByZXF1aXJlIHRoZSBjbGllbnQgdG8gcGFzcyBpbiBhIHBvaW50ZXIgdG8gaXRzIGluaXQgcm91dGluZS4KKyAgICBBIHJvdXRpbmUgcG9pbnRlciBpcyBhIFRWZWN0b3IgcG9pbnRlciwgc28geW91IGNhbiBqdXN0IGNhc3QgaXQKKyAgICBhbmQgZXh0cmFjdCB0aGUgcGFpciBvZiB3b3Jkcy4KKworICAgIEZpbmRpbmcgdGhlIG9yaWdpbmFsIG9mZnNldHMgaXMgYSB0cmlja2llci4gIE15IHRlY2huaXF1ZSBpcyB0bworICAgIGxvb2sgdXAgdGhlIGluaXQgcm91dGluZSBpbiB0aGUgZnJhZ21lbnQncyBsb2FkZXIgaW5mbyBoZWFkZXIuICBUaGlzCisgICAgeWllbGRzIHRoZSBzZWN0aW9uIG51bWJlciBhbmQgb2Zmc2V0IHdoZXJlIHRoZSBpbml0IHJvdXRpbmUncyB1bnJlbG9jYXRlZAorICAgIFRWZWN0b3IgZXhpc3RzLiAgT25jZSBJIGhhdmUgdGhhdCwgSSBjYW4ganVzdCByZWFkIHRoZSB1bnJlbG9jYXRlZCBUVmVjdG9yCisgICAgb3V0IG9mIHRoZSBmaWxlIGFuZCBleHRyYWN0IHRoZSBvZmZzZXRzLgogKi8KIAogc3RydWN0IFRWZWN0b3IgewotCXZvaWQgKmNvZGVQdHI7Ci0Jdm9pZCAqdG9jUHRyOworICAgIHZvaWQgKmNvZGVQdHI7CisgICAgdm9pZCAqdG9jUHRyOwogfTsKIHR5cGVkZWYgc3RydWN0IFRWZWN0b3IgVFZlY3RvcjsKIAogc3RhdGljIE9TU3RhdHVzIFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMoRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4KQotCS8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgc2VjdGlvbjBCYXNlIGFuZCBzZWN0aW9uMUJhc2UKLQkvLyBiYXNlIGZpZWxkcyBvZiBmcmFnVG9GaXggdG8gdGhlIGJhc2UgYWRkcmVzc2VzIG9mIHRoZQotCS8vIGluc3RhbnRpYXRlZCBmcmFnbWVudCByZXByZXNlbnRlZCBieSB0aGUgb3RoZXIgZmllbGRzCi0JLy8gb2YgZnJhZ1RvRml4LiAgVGhlIHByb2Nlc3Mgd29ya3MgaW4gdGhyZWUgc3RhdGVzOgotCS8vCi0JLy8gMS4gCUZpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWxvY2F0ZWQgVFZlY3RvciBvZiB0aGUgCi0JLy8gICAgICBmcmFnbWVudCdzIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUsIHByb3ZpZGVkIHRvIHVzIGJ5IAotCS8vICAgICAgdGhlIGNhbGxlci4KLQkvLwotCS8vIDIuCUZpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBub24tcmVsb2NhdGVkIFRWZWN0b3IgYnkgCi0JLy8gICAgICBsb29raW5nIGl0IHVwIGluIHRoZSBQRUYgbG9hZGVyIGluZm8gaGVhZGVyIGFuZCB0aGVuIAotCS8vICAgICAgdXNpbmcgdGhhdCB0byByZWFkIHRoZSBUVmVjdG9yIGNvbnRlbnRzIGZyb20gZGlzay4KLQkvLyAgICAgIFRoaXMgeWllbGRzIHRoZSBvZmZzZXRzIGZyb20gdGhlIHNlY3Rpb24gYmFzZXMgZm9yIAotCS8vICAgICAgdGhlIGluaXQgcm91dGluZS4KLQkvLwotCS8vIDMuCVN1YnRyYWN0IDIgZnJvbSAzLgorICAgIC8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgc2VjdGlvbjBCYXNlIGFuZCBzZWN0aW9uMUJhc2UKKyAgICAvLyBiYXNlIGZpZWxkcyBvZiBmcmFnVG9GaXggdG8gdGhlIGJhc2UgYWRkcmVzc2VzIG9mIHRoZQorICAgIC8vIGluc3RhbnRpYXRlZCBmcmFnbWVudCByZXByZXNlbnRlZCBieSB0aGUgb3RoZXIgZmllbGRzCisgICAgLy8gb2YgZnJhZ1RvRml4LiAgVGhlIHByb2Nlc3Mgd29ya3MgaW4gdGhyZWUgc3RhdGVzOgorICAgIC8vCisgICAgLy8gMS4gICAgICAgRmluZCB0aGUgY29udGVudHMgb2YgdGhlIHJlbG9jYXRlZCBUVmVjdG9yIG9mIHRoZQorICAgIC8vICAgICAgZnJhZ21lbnQncyBpbml0aWFsaXNhdGlvbiByb3V0aW5lLCBwcm92aWRlZCB0byB1cyBieQorICAgIC8vICAgICAgdGhlIGNhbGxlci4KKyAgICAvLworICAgIC8vIDIuICAgICAgIEZpbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBub24tcmVsb2NhdGVkIFRWZWN0b3IgYnkKKyAgICAvLyAgICAgIGxvb2tpbmcgaXQgdXAgaW4gdGhlIFBFRiBsb2FkZXIgaW5mbyBoZWFkZXIgYW5kIHRoZW4KKyAgICAvLyAgICAgIHVzaW5nIHRoYXQgdG8gcmVhZCB0aGUgVFZlY3RvciBjb250ZW50cyBmcm9tIGRpc2suCisgICAgLy8gICAgICBUaGlzIHlpZWxkcyB0aGUgb2Zmc2V0cyBmcm9tIHRoZSBzZWN0aW9uIGJhc2VzIGZvcgorICAgIC8vICAgICAgdGhlIGluaXQgcm91dGluZS4KKyAgICAvLworICAgIC8vIDMuICAgICAgIFN1YnRyYWN0IDIgZnJvbSAzLgogewotCU9TU3RhdHVzIAkJCWVycjsKLQlUVmVjdG9yICoJCQlyZWxvY2F0ZWRFeHBvcnQ7Ci0JU0ludDMyCQkJCWluaXRTZWN0aW9uOwotCVVJbnQzMgkJCQlpbml0T2Zmc2V0OwotCVBFRlNlY3Rpb25IZWFkZXIgKglpbml0U2VjdGlvbkhlYWRlcjsKLQlQdHIJCQkJCXBhY2tlZERhdGFTZWN0aW9uOwotCVB0cgkJCQkJdW5wYWNrZWREYXRhU2VjdGlvbjsKLQlUVmVjdG9yIAkJCW9yaWdpbmFsT2Zmc2V0czsKKyAgICBPU1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI7CisgICAgVFZlY3RvciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGVkRXhwb3J0OworICAgIFNJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTZWN0aW9uOworICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRPZmZzZXQ7CisgICAgUEVGU2VjdGlvbkhlYWRlciAqICAgICAgICAgIGluaXRTZWN0aW9uSGVhZGVyOworICAgIFB0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2VkRGF0YVNlY3Rpb247CisgICAgUHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tlZERhdGFTZWN0aW9uOworICAgIFRWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsT2Zmc2V0czsKIAotCXBhY2tlZERhdGFTZWN0aW9uICAgPSBuaWw7Ci0JdW5wYWNrZWREYXRhU2VjdGlvbiA9IG5pbDsKLQkKLQkvLyBTdGVwIDEuCisgICAgcGFja2VkRGF0YVNlY3Rpb24gICA9IG5pbDsKKyAgICB1bnBhY2tlZERhdGFTZWN0aW9uID0gbmlsOwogCi0JLy8gRmlyc3QgZmluZCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3Rvciwgd2hpY2ggZ2l2ZXMgdXMgdGhlIHJlbG9jYXRlZCAKLQkvLyBvZmZzZXRzIG9mIHRoZSBpbml0IHJvdXRpbmUgaW50byB0aGUgZGF0YSBhbmQgY29kZSBzZWN0aW9ucy4KKyAgICAvLyBTdGVwIDEuCiAKLQlyZWxvY2F0ZWRFeHBvcnQgPSAoVFZlY3RvciAqKSBmcmFnVG9GaXgtPmluaXRSb3V0aW5lOwotCQkKLQkvLyBTdGVwIDIuCi0JCi0JLy8gTm93IGZpbmQgdGhlIGluaXQgcm91dGluZSdzIFRWZWN0b3IncyBvZmZzZXRzIGluIHRoZSBkYXRhIHNlY3Rpb24gb24gCi0JLy8gZGlzay4gIFRoaXMgZ2l2ZXMgdXMgdGhlIHJhdyBvZmZzZXRzIGZyb20gdGhlIGRhdGEgYW5kIGNvZGUgc2VjdGlvbiAKLQkvLyBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbml0IHJvdXRpbmUuCi0JCi0JZXJyID0gbm9FcnI7Ci0JaW5pdFNlY3Rpb24gPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmluaXRTZWN0aW9uOwotCWluaXRPZmZzZXQgID0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5pbml0T2Zmc2V0OwotCWlmIChpbml0U2VjdGlvbiA9PSAtMSkgewotCQllcnIgPSBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnI7Ci0JfQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uID49IDAgKTsJCS8vIE5lZ2F0aXZlIGluZGV4ZXMgYXJlIHBzZXVkby1zZWN0aW9ucyB3aGljaCBhcmUganVzdCBub3QgYWxsb3dlZCEKLQkJTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uIDwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICk7CisgICAgLy8gRmlyc3QgZmluZCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3Rvciwgd2hpY2ggZ2l2ZXMgdXMgdGhlIHJlbG9jYXRlZAorICAgIC8vIG9mZnNldHMgb2YgdGhlIGluaXQgcm91dGluZSBpbnRvIHRoZSBkYXRhIGFuZCBjb2RlIHNlY3Rpb25zLgogCi0JCWluaXRTZWN0aW9uSGVhZGVyID0gJmZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbaW5pdFNlY3Rpb25dOwotCQkKLQkJLy8gSWYgdGhlIGRhdGEgc2VjdGlvbiBpcyBwYWNrZWQsIHVucGFjayBpdCB0byBhIHRlbXBvcmFyeSBidWZmZXIgYW5kIHRoZW4gZ2V0IHRoZSAKLQkJLy8gb3JpZ2luYWwgb2Zmc2V0cyBmcm9tIHRoYXQgYnVmZmVyLiAgSWYgdGhlIGRhdGEgc2VjdGlvbiBpcyB1bnBhY2tlZCwganVzdCByZWFkIAotCQkvLyB0aGUgb3JpZ2luYWwgb2Zmc2V0cyBkaXJlY3RseSBvZmYgdGhlIGRpc2suCi0JCQotCQlpZiAoIGluaXRTZWN0aW9uSGVhZGVyLT5zZWN0aW9uS2luZCA9PSBrUEVGUGFja2VkRGF0YVNlY3Rpb24gKSB7CisgICAgcmVsb2NhdGVkRXhwb3J0ID0gKFRWZWN0b3IgKikgZnJhZ1RvRml4LT5pbml0Um91dGluZTsKIAotCQkJLy8gQWxsb2NhdGUgc3BhY2UgZm9yIHBhY2tlZCBhbmQgdW5wYWNrZWQgY29waWVzIG9mIHRoZSBzZWN0aW9uLgotCQkJCi0JCQlwYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoKTsKLQkJCWVyciA9IE1lbUVycm9yKCk7CisgICAgLy8gU3RlcCAyLgogCi0JCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQkJdW5wYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+dW5wYWNrZWRMZW5ndGgpOwotCQkJCWVyciA9IE1lbUVycm9yKCk7Ci0JCQl9CisgICAgLy8gTm93IGZpbmQgdGhlIGluaXQgcm91dGluZSdzIFRWZWN0b3IncyBvZmZzZXRzIGluIHRoZSBkYXRhIHNlY3Rpb24gb24KKyAgICAvLyBkaXNrLiAgVGhpcyBnaXZlcyB1cyB0aGUgcmF3IG9mZnNldHMgZnJvbSB0aGUgZGF0YSBhbmQgY29kZSBzZWN0aW9uCisgICAgLy8gb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5pdCByb3V0aW5lLgogCi0JCQkvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgcGFja2VkIHNlY3Rpb24uCi0JCQkKLQkJCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJCQllcnIgPSBGU1JlYWRBdE9mZnNldCgJZnJhZ1RvRml4LT5maWxlUmVmLAotCQkJCQkJCQkJCWZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQKLQkJCQkJCQkJCQkrIGluaXRTZWN0aW9uSGVhZGVyLT5jb250YWluZXJPZmZzZXQsCi0JCQkJCQkJCQkJaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lckxlbmd0aCwKLQkJCQkJCQkJCQlwYWNrZWREYXRhU2VjdGlvbik7Ci0JCQl9Ci0JCQkKLQkJCS8vIFVucGFjayB0aGUgZGF0YSBpbnRvIHRoZSB1bnBhY2tlZCBzZWN0aW9uLgotCQkJCi0JCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQkJZXJyID0gVW5wYWNrUEVGRGF0YVNlY3Rpb24oIChVSW50OCAqKSBwYWNrZWREYXRhU2VjdGlvbiwgICBpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoLAotCQkJCQkJCQkgICAgICAgICAgICAoVUludDggKikgdW5wYWNrZWREYXRhU2VjdGlvbiwgaW5pdFNlY3Rpb25IZWFkZXItPnVucGFja2VkTGVuZ3RoKTsKLQkJCX0KLQkJCQotCQkJLy8gRXh0cmFjdCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3RvciBmcm9tIHRoZSB1bnBhY2tlZCBzZWN0aW9uLgotCQkJCi0JCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQkJQmxvY2tNb3ZlRGF0YSh1bnBhY2tlZERhdGFTZWN0aW9uICsgaW5pdE9mZnNldCwgJm9yaWdpbmFsT2Zmc2V0cywgc2l6ZW9mKFRWZWN0b3IpKTsKLQkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl0uc2VjdGlvbktpbmQgPT0ga1BFRlVucGFja2VkRGF0YVNlY3Rpb24pOwotCQkJZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLCAKLQkJCQkJCQkJCWZyYWdUb0ZpeC0+bG9jYXRvci5vZmZzZXQKLQkJCQkJCQkJCSsgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl0uY29udGFpbmVyT2Zmc2V0Ci0JCQkJCQkJCQkrIGluaXRPZmZzZXQsCi0JCQkJCQkJCQlzaXplb2YoVFZlY3RvciksIAotCQkJCQkJCQkJJm9yaWdpbmFsT2Zmc2V0cyk7Ci0JCX0KLQl9CisgICAgZXJyID0gbm9FcnI7CisgICAgaW5pdFNlY3Rpb24gPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmluaXRTZWN0aW9uOworICAgIGluaXRPZmZzZXQgID0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5pbml0T2Zmc2V0OworICAgIGlmIChpbml0U2VjdGlvbiA9PSAtMSkgeworICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnI7CisgICAgfQorICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uID49IDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBpbmRleGVzIGFyZSBwc2V1ZG8tc2VjdGlvbnMgd2hpY2ggYXJlIGp1c3Qgbm90IGFsbG93ZWQhCisgICAgICAgIE1vcmVBc3NlcnRRKCBpbml0U2VjdGlvbiA8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCApOwogCi0JLy8gU3RlcCAzLgotCQkKLQkvLyBEbyB0aGUgbWF0aHMgdG8gc3VidHJhY3QgdGhlIHVucmVsb2NhdGVkIG9mZnNldHMgZnJvbSB0aGUgY3VycmVudCBhZGRyZXNzIAotCS8vIHRvIGdldCB0aGUgYmFzZSBhZGRyZXNzLgotCQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2UgPSAoKGNoYXIgKikgcmVsb2NhdGVkRXhwb3J0LT5jb2RlUHRyKSAtIChVSW50MzIpIG9yaWdpbmFsT2Zmc2V0cy5jb2RlUHRyOwotCQlmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSA9ICgoY2hhciAqKSByZWxvY2F0ZWRFeHBvcnQtPnRvY1B0cikgIC0gKFVJbnQzMikgb3JpZ2luYWxPZmZzZXRzLnRvY1B0cjsKLQl9Ci0JCi0JLy8gQ2xlYW4gdXAuCi0JCi0JaWYgKHBhY2tlZERhdGFTZWN0aW9uICE9IG5pbCkgewotCQlEaXNwb3NlUHRyKHBhY2tlZERhdGFTZWN0aW9uKTsKLQkJTW9yZUFzc2VydFEoIE1lbUVycm9yKCkgPT0gbm9FcnIgKTsKLQl9Ci0JaWYgKHVucGFja2VkRGF0YVNlY3Rpb24gIT0gbmlsKSB7Ci0JCURpc3Bvc2VQdHIodW5wYWNrZWREYXRhU2VjdGlvbik7Ci0JCU1vcmVBc3NlcnRRKCBNZW1FcnJvcigpID09IG5vRXJyICk7Ci0JfQotCXJldHVybiBlcnI7CisgICAgICAgIGluaXRTZWN0aW9uSGVhZGVyID0gJmZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbaW5pdFNlY3Rpb25dOworCisgICAgICAgIC8vIElmIHRoZSBkYXRhIHNlY3Rpb24gaXMgcGFja2VkLCB1bnBhY2sgaXQgdG8gYSB0ZW1wb3JhcnkgYnVmZmVyIGFuZCB0aGVuIGdldCB0aGUKKyAgICAgICAgLy8gb3JpZ2luYWwgb2Zmc2V0cyBmcm9tIHRoYXQgYnVmZmVyLiAgSWYgdGhlIGRhdGEgc2VjdGlvbiBpcyB1bnBhY2tlZCwganVzdCByZWFkCisgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBvZmZzZXRzIGRpcmVjdGx5IG9mZiB0aGUgZGlzay4KKworICAgICAgICBpZiAoIGluaXRTZWN0aW9uSGVhZGVyLT5zZWN0aW9uS2luZCA9PSBrUEVGUGFja2VkRGF0YVNlY3Rpb24gKSB7CisKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBwYWNrZWQgYW5kIHVucGFja2VkIGNvcGllcyBvZiB0aGUgc2VjdGlvbi4KKworICAgICAgICAgICAgcGFja2VkRGF0YVNlY3Rpb24gPSBOZXdQdHIoaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lckxlbmd0aCk7CisgICAgICAgICAgICBlcnIgPSBNZW1FcnJvcigpOworCisgICAgICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgdW5wYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+dW5wYWNrZWRMZW5ndGgpOworICAgICAgICAgICAgICAgIGVyciA9IE1lbUVycm9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZWQgc2VjdGlvbi4KKworICAgICAgICAgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAgICAgICAgIGVyciA9IEZTUmVhZEF0T2Zmc2V0KCAgICAgICAgICAgICAgICAgICBmcmFnVG9GaXgtPmZpbGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lck9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tlZERhdGFTZWN0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVW5wYWNrIHRoZSBkYXRhIGludG8gdGhlIHVucGFja2VkIHNlY3Rpb24uCisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBVbnBhY2tQRUZEYXRhU2VjdGlvbiggKFVJbnQ4ICopIHBhY2tlZERhdGFTZWN0aW9uLCAgIGluaXRTZWN0aW9uSGVhZGVyLT5jb250YWluZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUludDggKikgdW5wYWNrZWREYXRhU2VjdGlvbiwgaW5pdFNlY3Rpb25IZWFkZXItPnVucGFja2VkTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3RvciBmcm9tIHRoZSB1bnBhY2tlZCBzZWN0aW9uLgorCisgICAgICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgQmxvY2tNb3ZlRGF0YSh1bnBhY2tlZERhdGFTZWN0aW9uICsgaW5pdE9mZnNldCwgJm9yaWdpbmFsT2Zmc2V0cywgc2l6ZW9mKFRWZWN0b3IpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl0uc2VjdGlvbktpbmQgPT0ga1BFRlVucGFja2VkRGF0YVNlY3Rpb24pOworICAgICAgICAgICAgZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW2luaXRTZWN0aW9uXS5jb250YWluZXJPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5pdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihUVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmlnaW5hbE9mZnNldHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RlcCAzLgorCisgICAgLy8gRG8gdGhlIG1hdGhzIHRvIHN1YnRyYWN0IHRoZSB1bnJlbG9jYXRlZCBvZmZzZXRzIGZyb20gdGhlIGN1cnJlbnQgYWRkcmVzcworICAgIC8vIHRvIGdldCB0aGUgYmFzZSBhZGRyZXNzLgorCisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBmcmFnVG9GaXgtPnNlY3Rpb24wQmFzZSA9ICgoY2hhciAqKSByZWxvY2F0ZWRFeHBvcnQtPmNvZGVQdHIpIC0gKFVJbnQzMikgb3JpZ2luYWxPZmZzZXRzLmNvZGVQdHI7CisgICAgICAgIGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlID0gKChjaGFyICopIHJlbG9jYXRlZEV4cG9ydC0+dG9jUHRyKSAgLSAoVUludDMyKSBvcmlnaW5hbE9mZnNldHMudG9jUHRyOworICAgIH0KKworICAgIC8vIENsZWFuIHVwLgorCisgICAgaWYgKHBhY2tlZERhdGFTZWN0aW9uICE9IG5pbCkgeworICAgICAgICBEaXNwb3NlUHRyKHBhY2tlZERhdGFTZWN0aW9uKTsKKyAgICAgICAgTW9yZUFzc2VydFEoIE1lbUVycm9yKCkgPT0gbm9FcnIgKTsKKyAgICB9CisgICAgaWYgKHVucGFja2VkRGF0YVNlY3Rpb24gIT0gbmlsKSB7CisgICAgICAgIERpc3Bvc2VQdHIodW5wYWNrZWREYXRhU2VjdGlvbik7CisgICAgICAgIE1vcmVBc3NlcnRRKCBNZW1FcnJvcigpID09IG5vRXJyICk7CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkICpHZXRTZWN0aW9uQmFzZUFkZHJlc3MoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LCBVSW50MTYgc2VjdGlvbkluZGV4KQotCS8vIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBiYXNlIG9mIHRoZSBpbnN0YW50aWF0ZWQgc2VjdGlvbgotCS8vIHdob3NlIGluZGV4IGlzIHNlY3Rpb25JbmRleC4gIFRoaXMgcm91dGluZSBpcyB0aGUgZXZpbCB0d2luCi0JLy8gb2YgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3Nlcy4gIEl0IHNpbXBseSByZXR1cm5zIHRoZSB2YWx1ZXMKLQkvLyBmb3Igc2VjdGlvbiAwIGFuZCAxIHRoYXQgd2UgZGVyaXZlZCBpbiBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzLgotCS8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyByb3V0aW5lIHdvdWxkIGNhbGwgQ0ZNIEFQSQotCS8vIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uLCBhbmQgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyB3b3VsZAotCS8vIG5vdCBleGlzdCwgYnV0IENGTSBkb2VzIG5vdCBleHBvcnQgdGhlIG5lY2Vzc2FyeSBBUElzIHRvCi0JLy8gdGhpcmQgcGFydGllcy4KKyAgICAvLyBUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgYmFzZSBvZiB0aGUgaW5zdGFudGlhdGVkIHNlY3Rpb24KKyAgICAvLyB3aG9zZSBpbmRleCBpcyBzZWN0aW9uSW5kZXguICBUaGlzIHJvdXRpbmUgaXMgdGhlIGV2aWwgdHdpbgorICAgIC8vIG9mIFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMuICBJdCBzaW1wbHkgcmV0dXJucyB0aGUgdmFsdWVzCisgICAgLy8gZm9yIHNlY3Rpb24gMCBhbmQgMSB0aGF0IHdlIGRlcml2ZWQgaW4gU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3Nlcy4KKyAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgcm91dGluZSB3b3VsZCBjYWxsIENGTSBBUEkKKyAgICAvLyB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbiwgYW5kIFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMgd291bGQKKyAgICAvLyBub3QgZXhpc3QsIGJ1dCBDRk0gZG9lcyBub3QgZXhwb3J0IHRoZSBuZWNlc3NhcnkgQVBJcyB0bworICAgIC8vIHRoaXJkIHBhcnRpZXMuCiB7Ci0Jdm9pZCAqcmVzdWx0OwotCQotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzEgPT0ga1BFRlRhZzEpOwotCQotCXN3aXRjaCAoc2VjdGlvbkluZGV4KSB7Ci0JCWNhc2UgMDoKLQkJCXJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXN1bHQgPSBuaWw7Ci0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB2b2lkICpyZXN1bHQ7CisKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcxID09IGtQRUZUYWcxKTsKKworICAgIHN3aXRjaCAoc2VjdGlvbkluZGV4KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXN1bHQgPSBuaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCiBzdGF0aWMgT1NTdGF0dXMgRmluZEltcG9ydExpYnJhcnkoUEVGTG9hZGVySW5mb0hlYWRlciAqbG9hZGVyU2VjdGlvbiwgY29uc3QgY2hhciAqbGlicmFyeU5hbWUsIFBFRkltcG9ydGVkTGlicmFyeSAqKmltcG9ydExpYnJhcnkpCi0JLy8gVGhpcyByb3V0aW5lIGZpbmRzIHRoZSBpbXBvcnQgbGlicmFyeSBkZXNjcmlwdGlvbiAoUEVGSW1wb3J0ZWRMaWJyYXJ5KQotCS8vIGZvciB0aGUgaW1wb3J0IGxpYnJhcnkgbGlicmFyeU5hbWUgaW4gdGhlIFBFRiBsb2FkZXIgc2VjdGlvbi4KLQkvLyBJdCBzZXRzICppbXBvcnRMaWJyYXJ5IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXNjcmlwdGlvbi4KKyAgICAvLyBUaGlzIHJvdXRpbmUgZmluZHMgdGhlIGltcG9ydCBsaWJyYXJ5IGRlc2NyaXB0aW9uIChQRUZJbXBvcnRlZExpYnJhcnkpCisgICAgLy8gZm9yIHRoZSBpbXBvcnQgbGlicmFyeSBsaWJyYXJ5TmFtZSBpbiB0aGUgUEVGIGxvYWRlciBzZWN0aW9uLgorICAgIC8vIEl0IHNldHMgKmltcG9ydExpYnJhcnkgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0aW9uLgogewotCU9TU3RhdHVzIAkJCWVycjsKLQlVSW50MzIgCQkJCWxpYnJhcmllc1JlbWFpbmluZzsKLQlQRUZJbXBvcnRlZExpYnJhcnkgCSp0aGlzSW1wb3J0TGlicmFyeTsKLQlCb29sZWFuIAkJCWZvdW5kOwotCQotCU1vcmVBc3NlcnRRKGxvYWRlclNlY3Rpb24gIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShsaWJyYXJ5TmFtZSAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGltcG9ydExpYnJhcnkgIT0gbmlsKTsKLQkKLQkvLyBMb29wIHRocm91Z2ggZWFjaCBpbXBvcnQgbGlicmFyeSBsb29raW5nIGZvciBhIG1hdGNoaW5nIG5hbWUuCi0JCi0JLy8gSW5pdGlhbGlzZSB0aGlzSW1wb3J0TGlicmFyeSB0byBwb2ludCB0byB0aGUgYnl0ZSBhZnRlciB0aGUKLQkvLyBlbmQgb2YgdGhlIGxvYWRlciBzZWN0aW9uJ3MgaGVhZGVyLgotCQotCXRoaXNJbXBvcnRMaWJyYXJ5ID0gKFBFRkltcG9ydGVkTGlicmFyeSAqKSAobG9hZGVyU2VjdGlvbiArIDEpOwotCWxpYnJhcmllc1JlbWFpbmluZyA9IGxvYWRlclNlY3Rpb24tPmltcG9ydGVkTGlicmFyeUNvdW50OwotCWZvdW5kID0gZmFsc2U7Ci0Jd2hpbGUgKCBsaWJyYXJpZXNSZW1haW5pbmcgPiAwICYmICEgZm91bmQgKSB7Ci0JCS8vIFBFRiBkZWZpbmVzIHRoYXQgaW1wb3J0IGxpYnJhcnkgbmFtZXMgd2lsbCBoYXZlCi0JCS8vIGEgbnVsbCB0ZXJtaW5hdG9yLCBzbyB3ZSBjYW4ganVzdCB1c2Ugc3RyY21wLgotCQlmb3VuZCA9IChzdHJjbXAoIGxpYnJhcnlOYW1lLAotCQkJCQkJKChjaGFyICopbG9hZGVyU2VjdGlvbikKLQkJCQkJCSsgbG9hZGVyU2VjdGlvbi0+bG9hZGVyU3RyaW5nc09mZnNldCAKLQkJCQkJCSsgdGhpc0ltcG9ydExpYnJhcnktPm5hbWVPZmZzZXQpID09IDApOwotCQkvLyAqKiogUmVtb3ZlIEFOU0kgc3RyY21wIGV2ZW50dWFsbHkuCi0JCWlmICggISBmb3VuZCApIHsKLQkJCXRoaXNJbXBvcnRMaWJyYXJ5ICs9IDE7Ci0JCQlsaWJyYXJpZXNSZW1haW5pbmcgLT0gMTsKLQkJfQotCX0KLQkKLQlpZiAoZm91bmQpIHsKLQkJKmltcG9ydExpYnJhcnkgPSB0aGlzSW1wb3J0TGlicmFyeTsKLQkJZXJyID0gbm9FcnI7Ci0JfSBlbHNlIHsKLQkJKmltcG9ydExpYnJhcnkgPSBuaWw7Ci0JCWVyciA9IGNmcmFnTm9MaWJyYXJ5RXJyOwotCX0KLQlyZXR1cm4gZXJyOworICAgIE9TU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKyAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXNSZW1haW5pbmc7CisgICAgUEVGSW1wb3J0ZWRMaWJyYXJ5ICAgICAgICAgICp0aGlzSW1wb3J0TGlicmFyeTsKKyAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZDsKKworICAgIE1vcmVBc3NlcnRRKGxvYWRlclNlY3Rpb24gIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShsaWJyYXJ5TmFtZSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGltcG9ydExpYnJhcnkgIT0gbmlsKTsKKworICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGltcG9ydCBsaWJyYXJ5IGxvb2tpbmcgZm9yIGEgbWF0Y2hpbmcgbmFtZS4KKworICAgIC8vIEluaXRpYWxpc2UgdGhpc0ltcG9ydExpYnJhcnkgdG8gcG9pbnQgdG8gdGhlIGJ5dGUgYWZ0ZXIgdGhlCisgICAgLy8gZW5kIG9mIHRoZSBsb2FkZXIgc2VjdGlvbidzIGhlYWRlci4KKworICAgIHRoaXNJbXBvcnRMaWJyYXJ5ID0gKFBFRkltcG9ydGVkTGlicmFyeSAqKSAobG9hZGVyU2VjdGlvbiArIDEpOworICAgIGxpYnJhcmllc1JlbWFpbmluZyA9IGxvYWRlclNlY3Rpb24tPmltcG9ydGVkTGlicmFyeUNvdW50OworICAgIGZvdW5kID0gZmFsc2U7CisgICAgd2hpbGUgKCBsaWJyYXJpZXNSZW1haW5pbmcgPiAwICYmICEgZm91bmQgKSB7CisgICAgICAgIC8vIFBFRiBkZWZpbmVzIHRoYXQgaW1wb3J0IGxpYnJhcnkgbmFtZXMgd2lsbCBoYXZlCisgICAgICAgIC8vIGEgbnVsbCB0ZXJtaW5hdG9yLCBzbyB3ZSBjYW4ganVzdCB1c2Ugc3RyY21wLgorICAgICAgICBmb3VuZCA9IChzdHJjbXAoIGxpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciAqKWxvYWRlclNlY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsb2FkZXJTZWN0aW9uLT5sb2FkZXJTdHJpbmdzT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzSW1wb3J0TGlicmFyeS0+bmFtZU9mZnNldCkgPT0gMCk7CisgICAgICAgIC8vICoqKiBSZW1vdmUgQU5TSSBzdHJjbXAgZXZlbnR1YWxseS4KKyAgICAgICAgaWYgKCAhIGZvdW5kICkgeworICAgICAgICAgICAgdGhpc0ltcG9ydExpYnJhcnkgKz0gMTsKKyAgICAgICAgICAgIGxpYnJhcmllc1JlbWFpbmluZyAtPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICppbXBvcnRMaWJyYXJ5ID0gdGhpc0ltcG9ydExpYnJhcnk7CisgICAgICAgIGVyciA9IG5vRXJyOworICAgIH0gZWxzZSB7CisgICAgICAgICppbXBvcnRMaWJyYXJ5ID0gbmlsOworICAgICAgICBlcnIgPSBjZnJhZ05vTGlicmFyeUVycjsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIE9TU3RhdHVzIExvb2t1cFN5bWJvbChDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBsb29rdXAsIHZvaWQgKnJlZkNvbiwKLQkJCQkJCQlQRUZMb2FkZXJJbmZvSGVhZGVyICpsb2FkZXJTZWN0aW9uLAotCQkJCQkJCVVJbnQzMiBzeW1ib2xJbmRleCwKLQkJCQkJCQlVSW50MzIgKnN5bWJvbFZhbHVlKQotCS8vIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGxvb2sgdXAgYSBzeW1ib2wgZHVyaW5nIHJlbG9jYXRpb24uCi0JLy8gImxvb2t1cCIgaXMgYSBjbGllbnQgY2FsbGJhY2sgYW5kIHJlZkNvbiBpcyBpdHMgYXJndW1lbnQuCi0JLy8gVHlwaWNhbGx5IHJlZkNvbiBpcyB0aGUgQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGxpYnJhcnkgdGhhdCBpcwotCS8vIHN1YnN0aXR1dGluZyBmb3IgdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkuICBsb2FkZXJTZWN0aW9uCi0JLy8gaXMgYSBwb2ludGVyIHRvIHRoZSBsb2FkZXIgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgdG8gZml4IHVwLgotCS8vIHN5bWJvbEluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIGluIHRoZSBsb2FkZXIgc2VjdGlvbi4KLQkvLyBUaGUgcm91dGluZSBzZXRzIHRoZSB3b3JkIHBvaW50ZWQgdG8gYnkgc3ltYm9sVmFsdWUgdG8gdGhlCi0JLy8gdmFsdWUgb2YgdGhlIHN5bWJvbC4KLQkvLwotCS8vIFRoZSByb3V0aW5lIHdvcmtzIGJ5IHVzaW5nIHN5bWJvbEluZGV4IHRvIGluZGV4IGludG8gdGhlIGltcG9ydGVkCi0JLy8gc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIG9mZnNldCBvZiB0aGUgc3ltYm9sJ3MgbmFtZSBpbiB0aGUgc3RyaW5nCi0JLy8gdGFibGUuICBJdCB0aGVuIGxvb2tzIHVwIHRoZSBzeW1ib2wgYnkgY2FsbGluZyB0aGUgY2xpZW50J3MgImxvb2t1cCIKLQkvLyBmdW5jdGlvbiBhbmQgcGFzc2VzIHRoZSByZXN1bHRpbmcgc3ltYm9sIGFkZHJlc3MgYmFjayBpbiBzeW1ib2xWYWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVGTG9hZGVySW5mb0hlYWRlciAqbG9hZGVyU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIHN5bWJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgKnN5bWJvbFZhbHVlKQorICAgIC8vIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGxvb2sgdXAgYSBzeW1ib2wgZHVyaW5nIHJlbG9jYXRpb24uCisgICAgLy8gImxvb2t1cCIgaXMgYSBjbGllbnQgY2FsbGJhY2sgYW5kIHJlZkNvbiBpcyBpdHMgYXJndW1lbnQuCisgICAgLy8gVHlwaWNhbGx5IHJlZkNvbiBpcyB0aGUgQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGxpYnJhcnkgdGhhdCBpcworICAgIC8vIHN1YnN0aXR1dGluZyBmb3IgdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkuICBsb2FkZXJTZWN0aW9uCisgICAgLy8gaXMgYSBwb2ludGVyIHRvIHRoZSBsb2FkZXIgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgdG8gZml4IHVwLgorICAgIC8vIHN5bWJvbEluZGV4IGlzIHRoZSBpbmRleCBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIGluIHRoZSBsb2FkZXIgc2VjdGlvbi4KKyAgICAvLyBUaGUgcm91dGluZSBzZXRzIHRoZSB3b3JkIHBvaW50ZWQgdG8gYnkgc3ltYm9sVmFsdWUgdG8gdGhlCisgICAgLy8gdmFsdWUgb2YgdGhlIHN5bWJvbC4KKyAgICAvLworICAgIC8vIFRoZSByb3V0aW5lIHdvcmtzIGJ5IHVzaW5nIHN5bWJvbEluZGV4IHRvIGluZGV4IGludG8gdGhlIGltcG9ydGVkCisgICAgLy8gc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIG9mZnNldCBvZiB0aGUgc3ltYm9sJ3MgbmFtZSBpbiB0aGUgc3RyaW5nCisgICAgLy8gdGFibGUuICBJdCB0aGVuIGxvb2tzIHVwIHRoZSBzeW1ib2wgYnkgY2FsbGluZyB0aGUgY2xpZW50J3MgImxvb2t1cCIKKyAgICAvLyBmdW5jdGlvbiBhbmQgcGFzc2VzIHRoZSByZXN1bHRpbmcgc3ltYm9sIGFkZHJlc3MgYmFjayBpbiBzeW1ib2xWYWx1ZS4KIHsKLQlPU1N0YXR1cyAJCQllcnI7Ci0JVUludDMyIAkJCQkqaW1wb3J0U3ltYm9sVGFibGU7Ci0JVUludDMyIAkJCQlzeW1ib2xTdHJpbmdPZmZzZXQ7Ci0JQm9vbGVhbiAJCQlzeW1ib2xJc1dlYWs7Ci0JQ0ZyYWdTeW1ib2xDbGFzcyAJc3ltYm9sQ2xhc3M7Ci0JY2hhciAJCQkJKnN5bWJvbFN0cmluZ0FkZHJlc3M7Ci0JU3RyMjU1IAkJCQlzeW1ib2xTdHJpbmc7Ci0JCi0JTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEobG9hZGVyU2VjdGlvbiAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHN5bWJvbEluZGV4IDwgbG9hZGVyU2VjdGlvbi0+dG90YWxJbXBvcnRlZFN5bWJvbENvdW50KTsKLQlNb3JlQXNzZXJ0UShzeW1ib2xWYWx1ZSAhPSBuaWwpOwotCQotCS8vIEZpbmQgdGhlIGJhc2Ugb2YgdGhlIGltcG9ydGVkIHN5bWJvbCB0YWJsZS4KLQkKLQlpbXBvcnRTeW1ib2xUYWJsZSA9IChVSW50MzIgKikoKChjaGFyICopKGxvYWRlclNlY3Rpb24gKyAxKSkgKyAobG9hZGVyU2VjdGlvbi0+aW1wb3J0ZWRMaWJyYXJ5Q291bnQgKiBzaXplb2YoUEVGSW1wb3J0ZWRMaWJyYXJ5KSkpOwotCQotCS8vIEdyYWIgdGhlIGFwcHJvcHJpYXRlIGVudHJ5IG91dCBvZiB0aGUgdGFibGUgYW5kCi0JLy8gZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGF0IGVudHJ5LgotCQotCXN5bWJvbFN0cmluZ09mZnNldCA9IGltcG9ydFN5bWJvbFRhYmxlW3N5bWJvbEluZGV4XTsKLQlzeW1ib2xDbGFzcyA9IFBFRkltcG9ydGVkU3ltYm9sQ2xhc3Moc3ltYm9sU3RyaW5nT2Zmc2V0KTsKLQlzeW1ib2xJc1dlYWsgPSAoKHN5bWJvbENsYXNzICYga1BFRldlYWtJbXBvcnRTeW1NYXNrKSAhPSAwKTsKLQlzeW1ib2xDbGFzcyA9IHN5bWJvbENsYXNzICYgfmtQRUZXZWFrSW1wb3J0U3ltTWFzazsKLQlzeW1ib2xTdHJpbmdPZmZzZXQgPSBQRUZJbXBvcnRlZFN5bWJvbE5hbWVPZmZzZXQoc3ltYm9sU3RyaW5nT2Zmc2V0KTsKLQkKLQkvLyBGaW5kIHRoZSBzdHJpbmcgZm9yIHRoZSBzeW1ib2wgaW4gdGhlIHN0cmluZ3MgdGFibGUgYW5kCi0JLy8gZXh0cmFjdCBpdCBmcm9tIHRoZSB0YWJsZSBpbnRvIGEgUGFzY2FsIHN0cmluZyBvbiB0aGUgc3RhY2suCi0JCi0Jc3ltYm9sU3RyaW5nQWRkcmVzcyA9ICgoY2hhciAqKWxvYWRlclNlY3Rpb24pICsgbG9hZGVyU2VjdGlvbi0+bG9hZGVyU3RyaW5nc09mZnNldCArIHN5bWJvbFN0cmluZ09mZnNldDsKLQlzeW1ib2xTdHJpbmdbMF0gPSBzdHJsZW4oc3ltYm9sU3RyaW5nQWRkcmVzcyk7CQkvLyAqKiogcmVtb3ZlIEFOU0kgc3RybGVuCi0JQmxvY2tNb3ZlRGF0YShzeW1ib2xTdHJpbmdBZGRyZXNzLCAmc3ltYm9sU3RyaW5nWzFdLCBzeW1ib2xTdHJpbmdbMF0pOwotCQotCS8vIExvb2sgdXAgdGhlIHN5bWJvbCBpbiBzdWJzdGl0dXRlIGxpYnJhcnkuICBJZiBpdCBmYWlscywgcmV0dXJuCi0JLy8gYSAwIHZhbHVlIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBlcnJvciBpcyBmYXRhbCAoYSBzdHJvbmcgbGlua2VkCi0JLy8gc3ltYm9sKSBvciBiZW5pZ24gKGEgd2VhayBsaW5rZWQgc3ltYm9sKS4KLQkKLQllcnIgPSBsb29rdXAoc3ltYm9sU3RyaW5nLCBzeW1ib2xDbGFzcywgKHZvaWQgKiopIHN5bWJvbFZhbHVlLCByZWZDb24pOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJKnN5bWJvbFZhbHVlID0gMDsKLQkJaWYgKHN5bWJvbElzV2VhaykgewotCQkJZXJyID0gbm9FcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBPU1N0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI7CisgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmltcG9ydFN5bWJvbFRhYmxlOworICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbFN0cmluZ09mZnNldDsKKyAgICBCb29sZWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xJc1dlYWs7CisgICAgQ0ZyYWdTeW1ib2xDbGFzcyAgICAgICAgICAgIHN5bWJvbENsYXNzOworICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzeW1ib2xTdHJpbmdBZGRyZXNzOworICAgIFN0cjI1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbFN0cmluZzsKKworICAgIE1vcmVBc3NlcnRRKGxvb2t1cCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGxvYWRlclNlY3Rpb24gIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShzeW1ib2xJbmRleCA8IGxvYWRlclNlY3Rpb24tPnRvdGFsSW1wb3J0ZWRTeW1ib2xDb3VudCk7CisgICAgTW9yZUFzc2VydFEoc3ltYm9sVmFsdWUgIT0gbmlsKTsKKworICAgIC8vIEZpbmQgdGhlIGJhc2Ugb2YgdGhlIGltcG9ydGVkIHN5bWJvbCB0YWJsZS4KKworICAgIGltcG9ydFN5bWJvbFRhYmxlID0gKFVJbnQzMiAqKSgoKGNoYXIgKikobG9hZGVyU2VjdGlvbiArIDEpKSArIChsb2FkZXJTZWN0aW9uLT5pbXBvcnRlZExpYnJhcnlDb3VudCAqIHNpemVvZihQRUZJbXBvcnRlZExpYnJhcnkpKSk7CisKKyAgICAvLyBHcmFiIHRoZSBhcHByb3ByaWF0ZSBlbnRyeSBvdXQgb2YgdGhlIHRhYmxlIGFuZAorICAgIC8vIGV4dHJhY3QgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhhdCBlbnRyeS4KKworICAgIHN5bWJvbFN0cmluZ09mZnNldCA9IGltcG9ydFN5bWJvbFRhYmxlW3N5bWJvbEluZGV4XTsKKyAgICBzeW1ib2xDbGFzcyA9IFBFRkltcG9ydGVkU3ltYm9sQ2xhc3Moc3ltYm9sU3RyaW5nT2Zmc2V0KTsKKyAgICBzeW1ib2xJc1dlYWsgPSAoKHN5bWJvbENsYXNzICYga1BFRldlYWtJbXBvcnRTeW1NYXNrKSAhPSAwKTsKKyAgICBzeW1ib2xDbGFzcyA9IHN5bWJvbENsYXNzICYgfmtQRUZXZWFrSW1wb3J0U3ltTWFzazsKKyAgICBzeW1ib2xTdHJpbmdPZmZzZXQgPSBQRUZJbXBvcnRlZFN5bWJvbE5hbWVPZmZzZXQoc3ltYm9sU3RyaW5nT2Zmc2V0KTsKKworICAgIC8vIEZpbmQgdGhlIHN0cmluZyBmb3IgdGhlIHN5bWJvbCBpbiB0aGUgc3RyaW5ncyB0YWJsZSBhbmQKKyAgICAvLyBleHRyYWN0IGl0IGZyb20gdGhlIHRhYmxlIGludG8gYSBQYXNjYWwgc3RyaW5nIG9uIHRoZSBzdGFjay4KKworICAgIHN5bWJvbFN0cmluZ0FkZHJlc3MgPSAoKGNoYXIgKilsb2FkZXJTZWN0aW9uKSArIGxvYWRlclNlY3Rpb24tPmxvYWRlclN0cmluZ3NPZmZzZXQgKyBzeW1ib2xTdHJpbmdPZmZzZXQ7CisgICAgc3ltYm9sU3RyaW5nWzBdID0gc3RybGVuKHN5bWJvbFN0cmluZ0FkZHJlc3MpOyAgICAgICAgICAgICAgLy8gKioqIHJlbW92ZSBBTlNJIHN0cmxlbgorICAgIEJsb2NrTW92ZURhdGEoc3ltYm9sU3RyaW5nQWRkcmVzcywgJnN5bWJvbFN0cmluZ1sxXSwgc3ltYm9sU3RyaW5nWzBdKTsKKworICAgIC8vIExvb2sgdXAgdGhlIHN5bWJvbCBpbiBzdWJzdGl0dXRlIGxpYnJhcnkuICBJZiBpdCBmYWlscywgcmV0dXJuCisgICAgLy8gYSAwIHZhbHVlIGFuZCBjaGVjayB3aGV0aGVyIHRoZSBlcnJvciBpcyBmYXRhbCAoYSBzdHJvbmcgbGlua2VkCisgICAgLy8gc3ltYm9sKSBvciBiZW5pZ24gKGEgd2VhayBsaW5rZWQgc3ltYm9sKS4KKworICAgIGVyciA9IGxvb2t1cChzeW1ib2xTdHJpbmcsIHN5bWJvbENsYXNzLCAodm9pZCAqKikgc3ltYm9sVmFsdWUsIHJlZkNvbik7CisgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICAqc3ltYm9sVmFsdWUgPSAwOworICAgICAgICBpZiAoc3ltYm9sSXNXZWFrKSB7CisgICAgICAgICAgICBlcnIgPSBub0VycjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiAvLyBUaGUgRW5naW5lU3RhdGUgc3RydWN0dXJlIGVuY2Fwc3VsYXRlcyBhbGwgb2YgdGhlIHBlcnNpc3RlbnQgc3RhdGUKQEAgLTc3MSwxMyArNzcxLDEzIEBACiAvLyBpbnN0cnVjdGlvbmFsIGRlc2lnbi4KIAogc3RydWN0IEVuZ2luZVN0YXRlIHsKLQlVSW50MzIgY3VycmVudFJlbG9jOwkJLy8gSW5kZXggb2YgY3VycmVudCByZWxvY2F0aW9uIG9wY29kZXMKLQlVSW50MzIgdGVybWluYXRpbmdSZWxvYzsJLy8gSW5kZXggb2YgcmVsb2NhdGlvbiBvcGNvZGVzIHdoaWNoIHRlcm1pbmF0ZXMgcmVsb2NhdGlvbgotCVVJbnQzMiAqc2VjdGlvbkJhc2U7CQkvLyBTdGFydCBvZiB0aGUgc2VjdGlvbgotCVVJbnQzMiAqcmVsb2NBZGRyZXNzOwkJLy8gQWRkcmVzcyB3aXRoaW4gdGhlIHNlY3Rpb24gd2hlcmUgdGhlIHJlbG9jYXRpb25zIGFyZSB0byBiZSBwZXJmb3JtZWQKLQlVSW50MzIgaW1wb3J0SW5kZXg7CQkJLy8gU3ltYm9sIGluZGV4LCB3aGljaCBpcyB1c2VkIHRvIGFjY2VzcyBhbiBpbXBvcnRlZCBzeW1ib2wncyBhZGRyZXNzCi0Jdm9pZCAgKnNlY3Rpb25DOwkJCS8vIE1lbW9yeSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZCBzZWN0aW9uIHdpdGhpbiB0aGUgUEVGIGNvbnRhaW5lcjsgdGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IHJlbG9jYXRpb24gb3Bjb2RlcyB0aGF0IHJlbG9jYXRlIHNlY3Rpb24gYWRkcmVzc2VzCi0Jdm9pZCAgKnNlY3Rpb25EOwkJCS8vIE1lbW9yeSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZCBzZWN0aW9uIHdpdGhpbiB0aGUgUEVGIGNvbnRhaW5lcjsgdGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IHJlbG9jYXRpb24gb3Bjb2RlcyB0aGF0IHJlbG9jYXRlIHNlY3Rpb24gYWRkcmVzc2VzCisgICAgVUludDMyIGN1cnJlbnRSZWxvYzsgICAgICAgICAgICAgICAgLy8gSW5kZXggb2YgY3VycmVudCByZWxvY2F0aW9uIG9wY29kZXMKKyAgICBVSW50MzIgdGVybWluYXRpbmdSZWxvYzsgICAgICAgICAgICAvLyBJbmRleCBvZiByZWxvY2F0aW9uIG9wY29kZXMgd2hpY2ggdGVybWluYXRlcyByZWxvY2F0aW9uCisgICAgVUludDMyICpzZWN0aW9uQmFzZTsgICAgICAgICAgICAgICAgLy8gU3RhcnQgb2YgdGhlIHNlY3Rpb24KKyAgICBVSW50MzIgKnJlbG9jQWRkcmVzczsgICAgICAgICAgICAgICAvLyBBZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbiB3aGVyZSB0aGUgcmVsb2NhdGlvbnMgYXJlIHRvIGJlIHBlcmZvcm1lZAorICAgIFVJbnQzMiBpbXBvcnRJbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3ltYm9sIGluZGV4LCB3aGljaCBpcyB1c2VkIHRvIGFjY2VzcyBhbiBpbXBvcnRlZCBzeW1ib2wncyBhZGRyZXNzCisgICAgdm9pZCAgKnNlY3Rpb25DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1vcnkgYWRkcmVzcyBvZiBhbiBpbnN0YW50aWF0ZWQgc2VjdGlvbiB3aXRoaW4gdGhlIFBFRiBjb250YWluZXI7IHRoaXMgdmFyaWFibGUgaXMgdXNlZCBieSByZWxvY2F0aW9uIG9wY29kZXMgdGhhdCByZWxvY2F0ZSBzZWN0aW9uIGFkZHJlc3NlcworICAgIHZvaWQgICpzZWN0aW9uRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gd2l0aGluIHRoZSBQRUYgY29udGFpbmVyOyB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgcmVsb2NhdGlvbiBvcGNvZGVzIHRoYXQgcmVsb2NhdGUgc2VjdGlvbiBhZGRyZXNzZXMKIH07CiB0eXBlZGVmIHN0cnVjdCBFbmdpbmVTdGF0ZSBFbmdpbmVTdGF0ZTsKIApAQCAtNzg2LDgzICs3ODYsODMgQEAKIC8vIGhhdmUgdG8gYWRkIGEgcmVwZWF0IGNvdW50ZXIgdG8gRW5naW5lU3RhdGUuCiAKIHN0YXRpYyBPU1N0YXR1cyBJbml0RW5naW5lU3RhdGUoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LAotCQkJCQkJCQlVSW50MTYgcmVsb2NIZWFkZXJJbmRleCwKLQkJCQkJCQkJRW5naW5lU3RhdGUgKnN0YXRlKQotCS8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgZW5naW5lIHN0YXRlIHN1aXRhYmx5IGZvcgotCS8vIHJ1bm5pbmcgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcyBmb3IgdGhlIHNlY3Rpb24gd2hvc2UKLQkvLyBpbmRleCBpcyByZWxvY0hlYWRlckluZGV4LiAgcmVsb2NIZWFkZXJJbmRleCBpcyBub3QgYQotCS8vIGEgc2VjdGlvbiBudW1iZXIuICBTZWUgdGhlIGNvbW1lbnQgd2hlcmUgaXQncyB1c2VkIGJlbG93Ci0JLy8gZm9yIGRldGFpbHMuICBUaGUgcm91dGluZSBiYXNpY2FsbHkgZmlsbHMgb3V0IGFsbCB0aGUgZmllbGRzCi0JLy8gaW4gdGhlIEVuZ2luZVN0YXRlIHN0cnVjdHVyZSBhcyBkZXNjcmliZWQgYnkKLQkvLyAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDE2IHJlbG9jSGVhZGVySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lU3RhdGUgKnN0YXRlKQorICAgIC8vIFRoaXMgcm91dGluZSBpbml0aWFsaXNlcyB0aGUgZW5naW5lIHN0YXRlIHN1aXRhYmx5IGZvcgorICAgIC8vIHJ1bm5pbmcgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcyBmb3IgdGhlIHNlY3Rpb24gd2hvc2UKKyAgICAvLyBpbmRleCBpcyByZWxvY0hlYWRlckluZGV4LiAgcmVsb2NIZWFkZXJJbmRleCBpcyBub3QgYQorICAgIC8vIGEgc2VjdGlvbiBudW1iZXIuICBTZWUgdGhlIGNvbW1lbnQgd2hlcmUgaXQncyB1c2VkIGJlbG93CisgICAgLy8gZm9yIGRldGFpbHMuICBUaGUgcm91dGluZSBiYXNpY2FsbHkgZmlsbHMgb3V0IGFsbCB0aGUgZmllbGRzCisgICAgLy8gaW4gdGhlIEVuZ2luZVN0YXRlIHN0cnVjdHVyZSBhcyBkZXNjcmliZWQgYnkKKyAgICAvLyAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyIuCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIgKnJlbG9jSGVhZGVyOwotCQotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHN0YXRlICE9IG5pbCk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIgKnJlbG9jSGVhZGVyOwogCi0JLy8gVGhpcyBiaXQgaXMgdHJpY2t5LiAgcmVsb2NIZWFkZXJJbmRleCBpcyBhbiBpbmRleCBpbnRvIHRoZSByZWxvY2F0aW9uCi0JLy8gaGVhZGVyIHRhYmxlLCBzdGFydGluZyBhdCByZWxvY1NlY3Rpb25Db3VudCAod2hpY2ggaXMgaW4gdGhlIGxvYWRlcgotCS8vIHNlY3Rpb24gaGVhZGVyKSBmb3IgdGhlIGZpcnN0IHJlbG9jYXRlZCBzZWN0aW9uIGFuZCBkZWNyZW1lbnRpbmcKLQkvLyBkb3duIHRvIDEgZm9yIHRoZSBsYXN0IHJlbG9jYXRlZCBzZWN0aW9uLiAgSSBmaW5kIHRoZSByZWxvY2F0aW9uCi0JLy8gaGVhZGVyIGJ5IHVzaW5nIHJlbG9jSGVhZGVySW5kZXggYXMgYSBpbmRleCBiYWNrd2FyZHMgZnJvbSB0aGUKLQkvLyBzdGFydCBvZiB0aGUgcmVsb2NhdGlvbiBvcGNvZGVzIChpZSByZWxvY0luc3RyT2Zmc2V0KS4gIElmIHlvdQotCS8vIGxvb2sgYXQgdGhlIGRpYWdyYW0gb2YgdGhlIGxheW91dCBvZiB0aGUgY29udGFpbmVyIGluCi0JLy8gIlBFRkJpbmFyeUZvcm1hdC5oIiwgeW91J2xsIHNlZSB0aGF0IHRoZSByZWxvY2F0aW9uIG9wY29kZXMKLQkvLyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIHJlbG9jYXRpb24gaGVhZGVycy4KLQkvLwotCS8vIEkgZGlkIHRoaXMgYmVjYXVzZSB0aGUgYWx0ZXJuYXRpdmUgKHN0YXJ0aW5nIGF0IHRoZSBsb2FkZXIKLQkvLyBoZWFkZXIgYW5kIHN0ZXBwaW5nIHBhc3QgdGhlIGltcG9ydCBsaWJyYXJ5IHRhYmxlIGFuZCB0aGUKLQkvLyBpbXBvcnQgc3ltYm9sIHRhYmxlKSB3YXMgYSBwYWluLgorICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHN0YXRlICE9IG5pbCk7CiAKLQlyZWxvY0hlYWRlciA9IChQRUZMb2FkZXJSZWxvY2F0aW9uSGVhZGVyICopICgoKGNoYXIgKikgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uKSArIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NJbnN0ck9mZnNldCAtIHJlbG9jSGVhZGVySW5kZXggKiBzaXplb2YoUEVGTG9hZGVyUmVsb2NhdGlvbkhlYWRlcikpOwotCQotCU1vcmVBc3NlcnRRKHJlbG9jSGVhZGVyLT5yZXNlcnZlZEEgPT0gMCk7CQkvLyBQRUYgc3BlYyBzYXlzIGl0IG11c3QgYmU7IHdlIGNoZWNrIHRvIHRyeSB0byBjYXRjaCBidWdzIGluIGNhbGN1bGF0aW9uIG9mIHJlbG9jSGVhZGVyCi0JCi0Jc3RhdGUtPmN1cnJlbnRSZWxvYyA9IHJlbG9jSGVhZGVyLT5maXJzdFJlbG9jT2Zmc2V0OwotCXN0YXRlLT50ZXJtaW5hdGluZ1JlbG9jID0gcmVsb2NIZWFkZXItPmZpcnN0UmVsb2NPZmZzZXQgKyByZWxvY0hlYWRlci0+cmVsb2NDb3VudDsKLQlzdGF0ZS0+c2VjdGlvbkJhc2UgPSAoVUludDMyICopIEdldFNlY3Rpb25CYXNlQWRkcmVzcyhmcmFnVG9GaXgsIHJlbG9jSGVhZGVyLT5zZWN0aW9uSW5kZXgpOwotCXN0YXRlLT5yZWxvY0FkZHJlc3MgPSBzdGF0ZS0+c2VjdGlvbkJhc2U7Ci0Jc3RhdGUtPmltcG9ydEluZGV4ID0gMDsKKyAgICAvLyBUaGlzIGJpdCBpcyB0cmlja3kuICByZWxvY0hlYWRlckluZGV4IGlzIGFuIGluZGV4IGludG8gdGhlIHJlbG9jYXRpb24KKyAgICAvLyBoZWFkZXIgdGFibGUsIHN0YXJ0aW5nIGF0IHJlbG9jU2VjdGlvbkNvdW50ICh3aGljaCBpcyBpbiB0aGUgbG9hZGVyCisgICAgLy8gc2VjdGlvbiBoZWFkZXIpIGZvciB0aGUgZmlyc3QgcmVsb2NhdGVkIHNlY3Rpb24gYW5kIGRlY3JlbWVudGluZworICAgIC8vIGRvd24gdG8gMSBmb3IgdGhlIGxhc3QgcmVsb2NhdGVkIHNlY3Rpb24uICBJIGZpbmQgdGhlIHJlbG9jYXRpb24KKyAgICAvLyBoZWFkZXIgYnkgdXNpbmcgcmVsb2NIZWFkZXJJbmRleCBhcyBhIGluZGV4IGJhY2t3YXJkcyBmcm9tIHRoZQorICAgIC8vIHN0YXJ0IG9mIHRoZSByZWxvY2F0aW9uIG9wY29kZXMgKGllIHJlbG9jSW5zdHJPZmZzZXQpLiAgSWYgeW91CisgICAgLy8gbG9vayBhdCB0aGUgZGlhZ3JhbSBvZiB0aGUgbGF5b3V0IG9mIHRoZSBjb250YWluZXIgaW4KKyAgICAvLyAiUEVGQmluYXJ5Rm9ybWF0LmgiLCB5b3UnbGwgc2VlIHRoYXQgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcworICAgIC8vIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgcmVsb2NhdGlvbiBoZWFkZXJzLgorICAgIC8vCisgICAgLy8gSSBkaWQgdGhpcyBiZWNhdXNlIHRoZSBhbHRlcm5hdGl2ZSAoc3RhcnRpbmcgYXQgdGhlIGxvYWRlcgorICAgIC8vIGhlYWRlciBhbmQgc3RlcHBpbmcgcGFzdCB0aGUgaW1wb3J0IGxpYnJhcnkgdGFibGUgYW5kIHRoZQorICAgIC8vIGltcG9ydCBzeW1ib2wgdGFibGUpIHdhcyBhIHBhaW4uCiAKLQkvLyBGcm9tICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIjoKLQkvLwotCS8vIFRoZSBzZWN0aW9uQyBhbmQgc2VjdGlvbkQgdmFyaWFibGVzIGFjdHVhbGx5IGNvbnRhaW4gdGhlCi0JLy8gbWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gbWludXMgdGhlCi0JLy8gZGVmYXVsdCBhZGRyZXNzIGZvciB0aGF0IHNlY3Rpb24uIFRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIGEKLQkvLyBzZWN0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgZGVmYXVsdEFkZHJlc3MgZmllbGQgb2YgdGhlCi0JLy8gc2VjdGlvbiBoZWFkZXIuIEhvd2V2ZXIsIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIGRlZmF1bHQKLQkvLyBhZGRyZXNzIHNob3VsZCBiZSAwLCBzbyB0aGUgc2ltcGxpZmllZCBkZWZpbml0aW9uIHN1ZmZpY2VzLgotCS8vIAotCS8vIEluIHRoZSBkZWJ1ZyB2ZXJzaW9uLCB3ZSBkcm9wIGludG8gTWFjc0J1ZyBpZiB0aGlzIHdlaXJkIGNhc2UKLQkvLyBldmVyIGV4ZWN1dGVzIGJlY2F1c2UgaXQncyBtb3JlIGxpa2VseSB3ZSBtYWRlIGEgbWlzdGFrZSB0aGFuCi0JLy8gd2UgZW5jb3VudGVyZWQgYSBzZWN0aW9uIHdpdGggYSBkZWZhdWx0IGFkZHJlc3MuCisgICAgcmVsb2NIZWFkZXIgPSAoUEVGTG9hZGVyUmVsb2NhdGlvbkhlYWRlciAqKSAoKChjaGFyICopIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbikgKyBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQgLSByZWxvY0hlYWRlckluZGV4ICogc2l6ZW9mKFBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIpKTsKIAotCXN0YXRlLT5zZWN0aW9uQyA9IEdldFNlY3Rpb25CYXNlQWRkcmVzcyhmcmFnVG9GaXgsIDApOwotCWlmIChzdGF0ZS0+c2VjdGlvbkMgIT0gbmlsKSB7Ci0JCSNpZiBNT1JFX0RFQlVHCi0JCQlpZiAoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1swXS5kZWZhdWx0QWRkcmVzcyAhPSAwKSB7Ci0JCQkJRGVidWdTdHIoIlxwSW5pdEVuZ2luZVN0YXRlOiBFeGVjdXRpbmcgd2VpcmQgY2FzZS4iKTsKLQkJCX0KLQkJI2VuZGlmCi0JCShjaGFyICopIHN0YXRlLT5zZWN0aW9uQyAtPSBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzWzBdLmRlZmF1bHRBZGRyZXNzOwotCX0KLQlzdGF0ZS0+c2VjdGlvbkQgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCAxKTsKLQlpZiAoc3RhdGUtPnNlY3Rpb25EICE9IG5pbCkgewotCQkjaWYgTU9SRV9ERUJVRwotCQkJaWYgKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMV0uZGVmYXVsdEFkZHJlc3MgIT0gMCkgewotCQkJCURlYnVnU3RyKCJccEluaXRFbmdpbmVTdGF0ZTogRXhlY3V0aW5nIHdlaXJkIGNhc2UuIik7Ci0JCQl9Ci0JCSNlbmRpZgotCQkoY2hhciAqKSBzdGF0ZS0+c2VjdGlvbkQgLT0gZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1sxXS5kZWZhdWx0QWRkcmVzczsKLQl9CisgICAgTW9yZUFzc2VydFEocmVsb2NIZWFkZXItPnJlc2VydmVkQSA9PSAwKTsgICAgICAgICAgICAgICAgICAgLy8gUEVGIHNwZWMgc2F5cyBpdCBtdXN0IGJlOyB3ZSBjaGVjayB0byB0cnkgdG8gY2F0Y2ggYnVncyBpbiBjYWxjdWxhdGlvbiBvZiByZWxvY0hlYWRlcgogCi0JZXJyID0gbm9FcnI7Ci0JaWYgKHN0YXRlLT5yZWxvY0FkZHJlc3MgPT0gbmlsKSB7Ci0JCWVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBzdGF0ZS0+Y3VycmVudFJlbG9jID0gcmVsb2NIZWFkZXItPmZpcnN0UmVsb2NPZmZzZXQ7CisgICAgc3RhdGUtPnRlcm1pbmF0aW5nUmVsb2MgPSByZWxvY0hlYWRlci0+Zmlyc3RSZWxvY09mZnNldCArIHJlbG9jSGVhZGVyLT5yZWxvY0NvdW50OworICAgIHN0YXRlLT5zZWN0aW9uQmFzZSA9IChVSW50MzIgKikgR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgcmVsb2NIZWFkZXItPnNlY3Rpb25JbmRleCk7CisgICAgc3RhdGUtPnJlbG9jQWRkcmVzcyA9IHN0YXRlLT5zZWN0aW9uQmFzZTsKKyAgICBzdGF0ZS0+aW1wb3J0SW5kZXggPSAwOworCisgICAgLy8gRnJvbSAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyI6CisgICAgLy8KKyAgICAvLyBUaGUgc2VjdGlvbkMgYW5kIHNlY3Rpb25EIHZhcmlhYmxlcyBhY3R1YWxseSBjb250YWluIHRoZQorICAgIC8vIG1lbW9yeSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZCBzZWN0aW9uIG1pbnVzIHRoZQorICAgIC8vIGRlZmF1bHQgYWRkcmVzcyBmb3IgdGhhdCBzZWN0aW9uLiBUaGUgZGVmYXVsdCBhZGRyZXNzIGZvciBhCisgICAgLy8gc2VjdGlvbiBpcyBjb250YWluZWQgaW4gdGhlIGRlZmF1bHRBZGRyZXNzIGZpZWxkIG9mIHRoZQorICAgIC8vIHNlY3Rpb24gaGVhZGVyLiBIb3dldmVyLCBpbiBhbG1vc3QgYWxsIGNhc2VzIHRoZSBkZWZhdWx0CisgICAgLy8gYWRkcmVzcyBzaG91bGQgYmUgMCwgc28gdGhlIHNpbXBsaWZpZWQgZGVmaW5pdGlvbiBzdWZmaWNlcy4KKyAgICAvLworICAgIC8vIEluIHRoZSBkZWJ1ZyB2ZXJzaW9uLCB3ZSBkcm9wIGludG8gTWFjc0J1ZyBpZiB0aGlzIHdlaXJkIGNhc2UKKyAgICAvLyBldmVyIGV4ZWN1dGVzIGJlY2F1c2UgaXQncyBtb3JlIGxpa2VseSB3ZSBtYWRlIGEgbWlzdGFrZSB0aGFuCisgICAgLy8gd2UgZW5jb3VudGVyZWQgYSBzZWN0aW9uIHdpdGggYSBkZWZhdWx0IGFkZHJlc3MuCisKKyAgICBzdGF0ZS0+c2VjdGlvbkMgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCAwKTsKKyAgICBpZiAoc3RhdGUtPnNlY3Rpb25DICE9IG5pbCkgeworICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgaWYgKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMF0uZGVmYXVsdEFkZHJlc3MgIT0gMCkgeworICAgICAgICAgICAgICAgIERlYnVnU3RyKCJccEluaXRFbmdpbmVTdGF0ZTogRXhlY3V0aW5nIHdlaXJkIGNhc2UuIik7CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICAoY2hhciAqKSBzdGF0ZS0+c2VjdGlvbkMgLT0gZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1swXS5kZWZhdWx0QWRkcmVzczsKKyAgICB9CisgICAgc3RhdGUtPnNlY3Rpb25EID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgMSk7CisgICAgaWYgKHN0YXRlLT5zZWN0aW9uRCAhPSBuaWwpIHsKKyAgICAgICAgI2lmIE1PUkVfREVCVUcKKyAgICAgICAgICAgIGlmIChmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzWzFdLmRlZmF1bHRBZGRyZXNzICE9IDApIHsKKyAgICAgICAgICAgICAgICBEZWJ1Z1N0cigiXHBJbml0RW5naW5lU3RhdGU6IEV4ZWN1dGluZyB3ZWlyZCBjYXNlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAgICAgKGNoYXIgKikgc3RhdGUtPnNlY3Rpb25EIC09IGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMV0uZGVmYXVsdEFkZHJlc3M7CisgICAgfQorCisgICAgZXJyID0gbm9FcnI7CisgICAgaWYgKHN0YXRlLT5yZWxvY0FkZHJlc3MgPT0gbmlsKSB7CisgICAgICAgIGVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogLy8ga1BFRlJlbG9jQmFzaWNPcGNvZGVzIGlzIGEgdGFibGUgdGhhdCBtYXBzIHRoZSB0b3AgNyBiaXRzIG9mIHRoZSBvcGNvZGUKQEAgLTg3MSw0OTAgKzg3MSw0OTAgQEAKIAogc3RhdGljIFVJbnQ4IGtQRUZSZWxvY0Jhc2ljT3Bjb2Rlc1trUEVGUmVsb2NCYXNpY09wY29kZVJhbmdlXSA9IHsgUEVGTWFza2VkQmFzaWNPcGNvZGVzIH07CiAKLXN0YXRpYyBPU1N0YXR1cyBSdW5SZWxvY2F0aW9uRW5naW5lKGNvbnN0IEZyYWdUb0ZpeEluZm8gKmZyYWdUb0ZpeCwgCi0JCQkJCQkJCQkJUEVGSW1wb3J0ZWRMaWJyYXJ5ICAqaW1wb3J0TGlicmFyeSwgCi0JCQkJCQkJCQkJQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgbG9va3VwLCB2b2lkICpyZWZDb24pCi0JLy8gVGhpcyBpcyB3aGVyZSB0aGUgcnViYmVyIHJlYWxseSBoaXRzIHRoZS4gIEdpdmVuIGEgZnVsbHkKLQkvLyBwb3B1bGF0ZWQgZnJhZ1RvRml4IHN0cnVjdHVyZSwgdGhlIGltcG9ydCBsaWJyYXJ5IGRlc2NyaXB0aW9uCi0JLy8gb2YgdGhlIHdlYWsgaW1wb3J0ZWQgbGlicmFyeSB3ZSdyZSByZXNvbHZpbmcsIGFuZCBhIGNvbm5lY3Rpb24KLQkvLyB0byB0aGUgbGlicmFyeSB3ZSdyZSBnb2luZyB0byBzdWJzdGl0dXRlIGl0LCByZS1leGVjdXRlIHRoZQotCS8vIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb25zIChDRk0gaGFzIGFscmVhZHkgZXhlY3V0ZWQgdGhlbSBvbmNlKQotCS8vIGJ1dCBvbmx5ICpkbyogaW5zdHJ1Y3Rpb25zIChpZSBzdG9yZSB0aGUgY2hhbmdlIHRvIHRoZSBkYXRhIHNlY3Rpb24pCi0JLy8gdGhhdCBDRk0gc2tpcHBlZCBiZWNhdXNlIHRoZSB3ZWFrIHN5bWJvbHMgd2VyZSBtaXNzaW5nLgorc3RhdGljIE9TU3RhdHVzIFJ1blJlbG9jYXRpb25FbmdpbmUoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUZJbXBvcnRlZExpYnJhcnkgICppbXBvcnRMaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBsb29rdXAsIHZvaWQgKnJlZkNvbikKKyAgICAvLyBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgcmVhbGx5IGhpdHMgdGhlLiAgR2l2ZW4gYSBmdWxseQorICAgIC8vIHBvcHVsYXRlZCBmcmFnVG9GaXggc3RydWN0dXJlLCB0aGUgaW1wb3J0IGxpYnJhcnkgZGVzY3JpcHRpb24KKyAgICAvLyBvZiB0aGUgd2VhayBpbXBvcnRlZCBsaWJyYXJ5IHdlJ3JlIHJlc29sdmluZywgYW5kIGEgY29ubmVjdGlvbgorICAgIC8vIHRvIHRoZSBsaWJyYXJ5IHdlJ3JlIGdvaW5nIHRvIHN1YnN0aXR1dGUgaXQsIHJlLWV4ZWN1dGUgdGhlCisgICAgLy8gcmVsb2NhdGlvbiBpbnN0cnVjdGlvbnMgKENGTSBoYXMgYWxyZWFkeSBleGVjdXRlZCB0aGVtIG9uY2UpCisgICAgLy8gYnV0IG9ubHkgKmRvKiBpbnN0cnVjdGlvbnMgKGllIHN0b3JlIHRoZSBjaGFuZ2UgdG8gdGhlIGRhdGEgc2VjdGlvbikKKyAgICAvLyB0aGF0IENGTSBza2lwcGVkIGJlY2F1c2UgdGhlIHdlYWsgc3ltYm9scyB3ZXJlIG1pc3NpbmcuCiB7Ci0JT1NTdGF0dXMgCWVycjsKLQlFbmdpbmVTdGF0ZQlzdGF0ZTsKLQlVSW50MTYgCQlzZWN0aW9uc0xlZnRUb1JlbG9jYXRlOwotCVVJbnQzMiAJCXRvdGFsUmVsb2NzOwotCVVJbnQxNgkJKnJlbG9jSW5zdHJUYWJsZTsKLQlVSW50MTYgCQlvcENvZGU7Ci0JCi0JTW9yZUFzc2VydFEoZnJhZ1RvRml4ICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMSA9PSBrUEVGVGFnMSk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlICE9IG5pbCk7CS8vIFRlY2huaWNhbGx5LCBoYXZpbmcgYSBuaWwgZm9yIHRoZXNlIHR3byBpcyBub3QgYSBwcm9ibGVtLCAuLi4KLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSAhPSBuaWwpOwkvLyBidXQgaW4gcHJhY3Rpc2UgaXQgYSB3aWxkbHkgZGV2aWFudCBjYXNlIGFuZCB3ZSBzaG91bGQga25vdyBhYm91dCBpdC4KLQlNb3JlQXNzZXJ0UShpbXBvcnRMaWJyYXJ5ICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7CisgICAgT1NTdGF0dXMgICAgICAgICAgICBlcnI7CisgICAgRW5naW5lU3RhdGUgICAgICAgICBzdGF0ZTsKKyAgICBVSW50MTYgICAgICAgICAgICAgIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGU7CisgICAgVUludDMyICAgICAgICAgICAgICB0b3RhbFJlbG9jczsKKyAgICBVSW50MTYgICAgICAgICAgICAgICpyZWxvY0luc3RyVGFibGU7CisgICAgVUludDE2ICAgICAgICAgICAgICBvcENvZGU7CiAKLQkvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGxvb3AsIHdvcmsgb3V0IHNvbWUgaW5mb3JtYXRpb24gaW4gYWR2YW5jZS4KKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcxID09IGtQRUZUYWcxKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2UgIT0gbmlsKTsgICAgICAgIC8vIFRlY2huaWNhbGx5LCBoYXZpbmcgYSBuaWwgZm9yIHRoZXNlIHR3byBpcyBub3QgYSBwcm9ibGVtLCAuLi4KKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb24xQmFzZSAhPSBuaWwpOyAgICAgICAgLy8gYnV0IGluIHByYWN0aXNlIGl0IGEgd2lsZGx5IGRldmlhbnQgY2FzZSBhbmQgd2Ugc2hvdWxkIGtub3cgYWJvdXQgaXQuCisgICAgTW9yZUFzc2VydFEoaW1wb3J0TGlicmFyeSAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGxvb2t1cCAhPSBuaWwpOwogCi0JLy8gdG90YWxSZWxvY3MgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHRvIG1ha2Ugc3VyZSBvdXIKLQkvLyByZWxvY2F0aW9uIFBDIChzdGF0ZS5jdXJyZW50UmVsb2MpIGRvZXNuJ3QgcnVuIHdpbGQuCi0JCi0JdG90YWxSZWxvY3MgPSAoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5sb2FkZXJTdHJpbmdzT2Zmc2V0IC0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY0luc3RyT2Zmc2V0KSAvIHNpemVvZihVSW50MTYpOwotCQotCS8vIHJlbG9jSW5zdHJUYWJsZSBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSB0YWJsZSBvZiByZWxvY2F0aW9uCi0JLy8gaW5zdHJ1Y3Rpb25zIGluIHRoZSBmcmFnbWVudCB0byBmaXguCi0JCi0JcmVsb2NJbnN0clRhYmxlID0gKFVJbnQxNiAqKSgoY2hhciAqKSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gKyBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQpOwotCQotCS8vIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgaXMgdGhlIGxvb3AgY291bnRlciBmb3IgdGhlIG91dGVyIGxvb3AuCi0JCi0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY1NlY3Rpb25Db3VudCA8PSAweDBGRkZGKTsKLQlzZWN0aW9uc0xlZnRUb1JlbG9jYXRlID0gZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY1NlY3Rpb25Db3VudDsKKyAgICAvLyBCZWZvcmUgZW50ZXJpbmcgdGhlIGxvb3AsIHdvcmsgb3V0IHNvbWUgaW5mb3JtYXRpb24gaW4gYWR2YW5jZS4KIAotCS8vIE5vdyBsZXQncyBydW4gdGhlIHJlbG9jYXRpb24gZW5naW5lLiAgV2UgcnVuIGl0IG9uY2UgcGVyCi0JLy8gc2VjdGlvbiBpbiB0aGUgdGFibGUuICBFYWNoIHRpbWUgYXJvdW5kLCB3ZSBpbml0IHRoZSBlbmdpbmUKLQkvLyBhbmQgdGhlbiBsb29wIGFnYWluLCB0aGlzIHRpbWUgZXhlY3V0aW5nIGluZGl2aWR1YWwgb3Bjb2Rlcy4KLQkvLyBUaGUgb3Bjb2RlIGxvb3AgdGVybWluYXRlcyB3aGVuIHRoZSByZWxvY2F0aW9uIFBDCi0JLy8gKHN0YXRlLmN1cnJlbnRSZWxvYykgaGl0cyB0aGUgZmluYWwgb3Bjb2RlIChzdGF0ZS50ZXJtaW5hdGluZ1JlbG9jKS4KLQkKLQkvLyBOb3RlOgotCS8vIE9uZSBkZXNpZ24gZGVjaXNpb24gSSBtYWRlIHdhcyB0byB0b3RhbGx5IHJlLWluaXQgdGhlIGVuZ2luZSBzdGF0ZQotCS8vIGZvciBlYWNoIHNlY3Rpb24uICBUaGUgQ0ZNIHNwZWMgaXMgdW5jbGVhciBhcyB0byB3aGV0aGVyIHlvdSdyZSBzdXBwb3NlZAotCS8vIHRvIHRvdGFsbHkgcmUtaW5pdCB0aGUgZW5naW5lIHN0YXRlLCBvciBqdXN0IHJlLWluaXQgdGhlIHNlY3Rpb24tc3BlY2lmaWMKLQkvLyBzdGF0ZSAoaWUgY3VycmVudFJlbG9jLCB0ZXJtaW5hdGluZ1JlbG9jLCBhbmQgcmVsb2NBZGRyZXNzKS4gIEkgaG9wZSB0aGlzCi0JLy8gaXMgY29ycmVjdCwgYnV0IGl0J3MgaGFyZCB0byB0ZXN0IHdpdGhvdXQgaGF2aW5nIGEgZnJhZ21lbnQgd2l0aCBtdWx0aXBsZQotCS8vIHJlbG9jYXRlZCBzZWN0aW9ucywgd2hpY2ggaXMgZGlmZmljdWx0IHRvIGNyZWF0ZS4KLQkKLQkvLyBIb3cgZG8gSSBkZWNpZGUgd2hpY2ggb3Bjb2RlcyBzaG91bGQgYmUgZWZmZWN0aXZlIChpZSBtYWtlIGNoYW5nZXMgdG8KLQkvLyB0aGUgc2VjdGlvbiBiZWluZyByZWxvY2F0ZWQpIGFuZCB3aGljaCBvcGNvZGVzIHNob3VsZCBqdXN0IGJlIGV4ZWN1dGVkCi0JLy8gZm9yIHRoZWlyIHNpZGUgZWZmZWN0cyAoaWUgdXBkYXRlZCBzdGF0ZS5yZWxvY0FkZHJlc3Mgb3Igc3RhdGUuaW1wb3J0SW5kZXgpPwotCS8vIFRoZSBhbnN3ZXIgaXMgYm90aCBzaW1wbGUgYW5kIHN1YnRsZS4gIE9wY29kZXMgd2hvc2UgYWN0aW9ucyBhcmUgZGVwZW5kZW50Ci0JLy8gb24gYSBzeW1ib2wgdGhhdCB3YXMgaW4gdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkgYXJlIGVmZmVjdGl2ZSwgdGhvc2UgdGhhdAotCS8vIGFuIGluZGVwZW5kZW50IG9mIHRob3NlIHN5bWJvbHMgYXJlIG5vdC4gIFRoZSBvbmx5IG9wY29kZXMgdGhhdCB1c2UKLQkvLyBzeW1ib2xpYyB2YWx1ZXMgYXJlIGtQRUZSZWxvY0ltcG9ydFJ1biBhbmQga1BFRlJlbG9jU21CeUltcG9ydCwgYW5kCi0JLy8gdGhlc2UgYXJlIG9ubHkgaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeS4KLQkvLyBBbGwgb3RoZXIgY2FzZXMgYXJlIGV4ZWN1dGVkIGZvciB0aGVpciBzaWRlIGVmZmVjdHMgb25seS4KLQkvLwotCS8vIEhvdyBkbyBJIGRldGVybWluZSBpZiBhIHN5bWJvbCBpcyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeT8KLQkvLyBXZWxsIEkga25vdyB0aGUgc3ltYm9sJ3MgaW5kZXggYW5kIEkga25vdyB0aGUgbG93ZXIgYm91bmQgYW5kIGNvdW50Ci0JLy8gb2YgdGhlIHN5bWJvbHMgaW4gdGhlIHdlYWsgbGlua2VkIGxpYnJhcnksIHNvIEkganVzdCBkbyBhIHNpbXBsZQotCS8vIGJvdW5kcyB0ZXN0LCBpZSAKLQkvLwotCS8vICAgZmlyc3RJbXBvcnRlZFN5bWJvbCA8PSBpbXBvcnRJbmRleCA8IGZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRlZFN5bWJvbENvdW50CisgICAgLy8gdG90YWxSZWxvY3MgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHRvIG1ha2Ugc3VyZSBvdXIKKyAgICAvLyByZWxvY2F0aW9uIFBDIChzdGF0ZS5jdXJyZW50UmVsb2MpIGRvZXNuJ3QgcnVuIHdpbGQuCiAKLQkvLyBGcm9tIHRoaXMgY29kZSwgaXQncyByZWxhdGl2ZWx5IGVhc3kgdG8gc2VlIHdoaWNoIHJlbG9jYXRpb24gb3Bjb2RlcwotCS8vIGFyZW4ndCBpbXBsZW1lbnRlZC4gIElmIHlvdSBldmVyIGVuY291bnRlciBvbmUsIHlvdSdsbCBmaW5kIHlvdXJzZWxmCi0JLy8gaW4gTWFjc0J1ZyB3aXRoIGEgbWVzc2FnZSB0ZWxsaW5nIHlvdSB3aGljaCBvcGNvZGUgd2FzIGZvdW5kLiAgVGhlCi0JLy8gdHdvIGJpZyBncm91cHMgb2Ygb3Bjb2RlcyBJIHNraXBwZWQgd2VyZSB0aGUgbGFyZ2UgZm9ybWF0IG9wY29kZXMKLQkvLyBhbmQgdGhlIHJlcGVhdGluZyBvcGNvZGVzLiAgSSBza2lwcGVkIHRoZW0gYmVjYXVzZToKLQkvLwotCS8vIGEpIEkgaGF2ZW4ndCBnb3QgYSB3YXkgdG8gZ2VuZXJhdGUgdGhlbSBpbiBhIFBFRiBjb250YWluZXIgdGhhdCBJIGNhbiAKLQkvLyAgICB0ZXN0IGFnYWluc3QuIFdpdGhvdXQgdGhhdCwgdGhlcmUncyBubyB3YXkgSSBjb3VsZCBiZSBhc3N1cmVkIHRoYXQKLQkvLyAgICB0aGUgY29kZSB3b3JrZWQuCi0JLy8KLQkvLyBiKSBJJ20gbGF6eS4KKyAgICB0b3RhbFJlbG9jcyA9IChmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmxvYWRlclN0cmluZ3NPZmZzZXQgLSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQpIC8gc2l6ZW9mKFVJbnQxNik7CiAKLQllcnIgPSBub0VycjsKLQl3aGlsZSAoIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgPiAwICkgewotCQllcnIgPSBJbml0RW5naW5lU3RhdGUoZnJhZ1RvRml4LCBzZWN0aW9uc0xlZnRUb1JlbG9jYXRlLCAmc3RhdGUpOwotCQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCQlnb3RvIGxlYXZlTm93OwotCQl9Ci0JCQotCQl3aGlsZSAoIHN0YXRlLmN1cnJlbnRSZWxvYyAhPSBzdGF0ZS50ZXJtaW5hdGluZ1JlbG9jICkgewotCQkJCi0JCQlNb3JlQXNzZXJ0USggc3RhdGUuY3VycmVudFJlbG9jIDwgdG90YWxSZWxvY3MgKTsKKyAgICAvLyByZWxvY0luc3RyVGFibGUgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgdGFibGUgb2YgcmVsb2NhdGlvbgorICAgIC8vIGluc3RydWN0aW9ucyBpbiB0aGUgZnJhZ21lbnQgdG8gZml4LgogCi0JCQlvcENvZGUgPSByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXTsKLQkJCXN3aXRjaCAoIFBFRlJlbG9jQmFzaWNPcGNvZGUob3BDb2RlKSApIHsKLQkJCQljYXNlIGtQRUZSZWxvY0J5U2VjdERXaXRoU2tpcDoKLQkJCQkJewotCQkJCQkJVUludDE2IHNraXBDb3VudDsKLQkJCQkJCVVJbnQxNiByZWxvY0NvdW50OwotCQkJCQkJCi0JCQkJCQlza2lwQ291bnQgPSAoKG9wQ29kZSA+PiA2KSAmIDB4MDBGRik7Ci0JCQkJCQlyZWxvY0NvdW50ID0gKG9wQ29kZSAmIDB4MDAzRik7Ci0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gc2tpcENvdW50OwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IHJlbG9jQ291bnQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NCeVNlY3RDOgotCQkJCWNhc2Uga1BFRlJlbG9jQnlTZWN0RDoKLQkJCQkJewotCQkJCQkJVUludDE2IHJ1bkxlbmd0aDsKKyAgICByZWxvY0luc3RyVGFibGUgPSAoVUludDE2ICopKChjaGFyICopIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiArIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NJbnN0ck9mZnNldCk7CiAKLQkJCQkJCXJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKLQkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSBydW5MZW5ndGg7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NUVmVjdG9yMTI6Ci0JCQkJCXsKLQkJCQkJCVVJbnQxNiBydW5MZW5ndGg7CisgICAgLy8gc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSBpcyB0aGUgbG9vcCBjb3VudGVyIGZvciB0aGUgb3V0ZXIgbG9vcC4KIAotCQkJCQkJcnVuTGVuZ3RoID0gKG9wQ29kZSAmIDB4MDFGRikgKyAxOwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IChydW5MZW5ndGggKiAzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY1RWZWN0b3I4OgotCQkJCWNhc2Uga1BFRlJlbG9jVlRhYmxlODoKLQkJCQkJewotCQkJCQkJVUludDE2IHJ1bkxlbmd0aDsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jU2VjdGlvbkNvdW50IDw9IDB4MEZGRkYpOworICAgIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jU2VjdGlvbkNvdW50OwogCi0JCQkJCQlydW5MZW5ndGggPSAob3BDb2RlICYgMHgwMUZGKSArIDE7Ci0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gKHJ1bkxlbmd0aCAqIDIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jSW1wb3J0UnVuOgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgc3ltYm9sVmFsdWU7Ci0JCQkJCQlVSW50MTYgcnVuTGVuZ3RoOwotCQkJCQkJCi0JCQkJCQlydW5MZW5ndGggPSAob3BDb2RlICYgMHgwMUZGKSArIDE7Ci0JCQkJCQl3aGlsZSAocnVuTGVuZ3RoID4gMCkgewotCQkJCQkJCWlmICggc3RhdGUuaW1wb3J0SW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBzdGF0ZS5pbXBvcnRJbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7Ci0JCQkJCQkJCWVyciA9IExvb2t1cFN5bWJvbChsb29rdXAsIHJlZkNvbiwgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLCBzdGF0ZS5pbXBvcnRJbmRleCwgJnN5bWJvbFZhbHVlKTsKLQkJCQkJCQkJaWYgKGVyciAhPSBub0VycikgewotCQkJCQkJCQkJZ290byBsZWF2ZU5vdzsKLQkJCQkJCQkJfQotCQkJCQkJCQkqKHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gc3ltYm9sVmFsdWU7Ci0JCQkJCQkJfQotCQkJCQkJCXN0YXRlLmltcG9ydEluZGV4ICs9IDE7Ci0JCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IDE7Ci0JCQkJCQkJcnVuTGVuZ3RoIC09IDE7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NTbUJ5SW1wb3J0OgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgc3ltYm9sVmFsdWU7Ci0JCQkJCQlVSW50MzIgaW5kZXg7CisgICAgLy8gTm93IGxldCdzIHJ1biB0aGUgcmVsb2NhdGlvbiBlbmdpbmUuICBXZSBydW4gaXQgb25jZSBwZXIKKyAgICAvLyBzZWN0aW9uIGluIHRoZSB0YWJsZS4gIEVhY2ggdGltZSBhcm91bmQsIHdlIGluaXQgdGhlIGVuZ2luZQorICAgIC8vIGFuZCB0aGVuIGxvb3AgYWdhaW4sIHRoaXMgdGltZSBleGVjdXRpbmcgaW5kaXZpZHVhbCBvcGNvZGVzLgorICAgIC8vIFRoZSBvcGNvZGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4gdGhlIHJlbG9jYXRpb24gUEMKKyAgICAvLyAoc3RhdGUuY3VycmVudFJlbG9jKSBoaXRzIHRoZSBmaW5hbCBvcGNvZGUgKHN0YXRlLnRlcm1pbmF0aW5nUmVsb2MpLgogCi0JCQkJCQlpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOwotCQkJCQkJaWYgKCBpbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIGluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKLQkJCQkJCQllcnIgPSBMb29rdXBTeW1ib2wobG9va3VwLCByZWZDb24sIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiwgaW5kZXgsICZzeW1ib2xWYWx1ZSk7Ci0JCQkJCQkJaWYgKGVyciAhPSBub0VycikgewotCQkJCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQkJCX0KLQkJCQkJCQkqKHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gc3ltYm9sVmFsdWU7Ci0JCQkJCQl9Ci0JCQkJCQlzdGF0ZS5pbXBvcnRJbmRleCA9IGluZGV4ICsgMTsKLQkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21TZXRTZWN0QzoKLQkJCQkJewotCQkJCQkJVUludDMyIGluZGV4OworICAgIC8vIE5vdGU6CisgICAgLy8gT25lIGRlc2lnbiBkZWNpc2lvbiBJIG1hZGUgd2FzIHRvIHRvdGFsbHkgcmUtaW5pdCB0aGUgZW5naW5lIHN0YXRlCisgICAgLy8gZm9yIGVhY2ggc2VjdGlvbi4gIFRoZSBDRk0gc3BlYyBpcyB1bmNsZWFyIGFzIHRvIHdoZXRoZXIgeW91J3JlIHN1cHBvc2VkCisgICAgLy8gdG8gdG90YWxseSByZS1pbml0IHRoZSBlbmdpbmUgc3RhdGUsIG9yIGp1c3QgcmUtaW5pdCB0aGUgc2VjdGlvbi1zcGVjaWZpYworICAgIC8vIHN0YXRlIChpZSBjdXJyZW50UmVsb2MsIHRlcm1pbmF0aW5nUmVsb2MsIGFuZCByZWxvY0FkZHJlc3MpLiAgSSBob3BlIHRoaXMKKyAgICAvLyBpcyBjb3JyZWN0LCBidXQgaXQncyBoYXJkIHRvIHRlc3Qgd2l0aG91dCBoYXZpbmcgYSBmcmFnbWVudCB3aXRoIG11bHRpcGxlCisgICAgLy8gcmVsb2NhdGVkIHNlY3Rpb25zLCB3aGljaCBpcyBkaWZmaWN1bHQgdG8gY3JlYXRlLgogCi0JCQkJCQlpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOwotCQkJCQkJc3RhdGUuc2VjdGlvbkMgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCBpbmRleCk7Ci0JCQkJCQlNb3JlQXNzZXJ0UShzdGF0ZS5zZWN0aW9uQyAhPSBuaWwpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21TZXRTZWN0RDoKLQkJCQkJewotCQkJCQkJVUludDMyIGluZGV4OworICAgIC8vIEhvdyBkbyBJIGRlY2lkZSB3aGljaCBvcGNvZGVzIHNob3VsZCBiZSBlZmZlY3RpdmUgKGllIG1ha2UgY2hhbmdlcyB0bworICAgIC8vIHRoZSBzZWN0aW9uIGJlaW5nIHJlbG9jYXRlZCkgYW5kIHdoaWNoIG9wY29kZXMgc2hvdWxkIGp1c3QgYmUgZXhlY3V0ZWQKKyAgICAvLyBmb3IgdGhlaXIgc2lkZSBlZmZlY3RzIChpZSB1cGRhdGVkIHN0YXRlLnJlbG9jQWRkcmVzcyBvciBzdGF0ZS5pbXBvcnRJbmRleCk/CisgICAgLy8gVGhlIGFuc3dlciBpcyBib3RoIHNpbXBsZSBhbmQgc3VidGxlLiAgT3Bjb2RlcyB3aG9zZSBhY3Rpb25zIGFyZSBkZXBlbmRlbnQKKyAgICAvLyBvbiBhIHN5bWJvbCB0aGF0IHdhcyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeSBhcmUgZWZmZWN0aXZlLCB0aG9zZSB0aGF0CisgICAgLy8gYW4gaW5kZXBlbmRlbnQgb2YgdGhvc2Ugc3ltYm9scyBhcmUgbm90LiAgVGhlIG9ubHkgb3Bjb2RlcyB0aGF0IHVzZQorICAgIC8vIHN5bWJvbGljIHZhbHVlcyBhcmUga1BFRlJlbG9jSW1wb3J0UnVuIGFuZCBrUEVGUmVsb2NTbUJ5SW1wb3J0LCBhbmQKKyAgICAvLyB0aGVzZSBhcmUgb25seSBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5LgorICAgIC8vIEFsbCBvdGhlciBjYXNlcyBhcmUgZXhlY3V0ZWQgZm9yIHRoZWlyIHNpZGUgZWZmZWN0cyBvbmx5LgorICAgIC8vCisgICAgLy8gSG93IGRvIEkgZGV0ZXJtaW5lIGlmIGEgc3ltYm9sIGlzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5PworICAgIC8vIFdlbGwgSSBrbm93IHRoZSBzeW1ib2wncyBpbmRleCBhbmQgSSBrbm93IHRoZSBsb3dlciBib3VuZCBhbmQgY291bnQKKyAgICAvLyBvZiB0aGUgc3ltYm9scyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeSwgc28gSSBqdXN0IGRvIGEgc2ltcGxlCisgICAgLy8gYm91bmRzIHRlc3QsIGllCisgICAgLy8KKyAgICAvLyAgIGZpcnN0SW1wb3J0ZWRTeW1ib2wgPD0gaW1wb3J0SW5kZXggPCBmaXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0ZWRTeW1ib2xDb3VudAogCi0JCQkJCQlpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOwotCQkJCQkJc3RhdGUuc2VjdGlvbkQgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCBpbmRleCk7Ci0JCQkJCQlNb3JlQXNzZXJ0UShzdGF0ZS5zZWN0aW9uRCAhPSBuaWwpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21CeVNlY3Rpb246Ci0JCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY0luY3JQb3NpdGlvbjoKLQkJCQkJewotCQkJCQkJVUludDE2IG9mZnNldDsKLQkJCQkJCQotCQkJCQkJb2Zmc2V0ID0gKG9wQ29kZSAmIDB4MEZGRikgKyAxOwotCQkJCQkJKChjaGFyICopIHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gb2Zmc2V0OwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jU21SZXBlYXQ6Ci0JCQkJCSNpZiBNT1JFX0RFQlVHCi0JCQkJCQlEZWJ1Z1N0cigiXHBSdW5SZWxvY2F0aW9uRW5naW5lOiBrUEVGUmVsb2NTbVJlcGVhdCBub3QgeWV0IGltcGxlbWVudGVkIik7Ci0JCQkJCSNlbmRpZgotCQkJCQllcnIgPSB1bmltcEVycjsKLQkJCQkJZ290byBsZWF2ZU5vdzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NTZXRQb3NpdGlvbjoKLQkJCQkJewotCQkJCQkJVUludDMyIG9mZnNldDsKKyAgICAvLyBGcm9tIHRoaXMgY29kZSwgaXQncyByZWxhdGl2ZWx5IGVhc3kgdG8gc2VlIHdoaWNoIHJlbG9jYXRpb24gb3Bjb2RlcworICAgIC8vIGFyZW4ndCBpbXBsZW1lbnRlZC4gIElmIHlvdSBldmVyIGVuY291bnRlciBvbmUsIHlvdSdsbCBmaW5kIHlvdXJzZWxmCisgICAgLy8gaW4gTWFjc0J1ZyB3aXRoIGEgbWVzc2FnZSB0ZWxsaW5nIHlvdSB3aGljaCBvcGNvZGUgd2FzIGZvdW5kLiAgVGhlCisgICAgLy8gdHdvIGJpZyBncm91cHMgb2Ygb3Bjb2RlcyBJIHNraXBwZWQgd2VyZSB0aGUgbGFyZ2UgZm9ybWF0IG9wY29kZXMKKyAgICAvLyBhbmQgdGhlIHJlcGVhdGluZyBvcGNvZGVzLiAgSSBza2lwcGVkIHRoZW0gYmVjYXVzZToKKyAgICAvLworICAgIC8vIGEpIEkgaGF2ZW4ndCBnb3QgYSB3YXkgdG8gZ2VuZXJhdGUgdGhlbSBpbiBhIFBFRiBjb250YWluZXIgdGhhdCBJIGNhbgorICAgIC8vICAgIHRlc3QgYWdhaW5zdC4gV2l0aG91dCB0aGF0LCB0aGVyZSdzIG5vIHdheSBJIGNvdWxkIGJlIGFzc3VyZWQgdGhhdAorICAgIC8vICAgIHRoZSBjb2RlIHdvcmtlZC4KKyAgICAvLworICAgIC8vIGIpIEknbSBsYXp5LgogCi0JCQkJCQkvLyBMb3QncyBvZiBmb2xrcyBoYXZlIHRyaWVkIHZhcmlvdXMgaW50ZXJwcmV0YXRpb25zIG9mIHRoZSBkZXNjcmlwdGlvbiBvZiAKLQkJCQkJCS8vIHRoaXMgb3BDb2RlIGluICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIiAod2hpY2ggc3RhdGVzICJUaGlzIGluc3RydWN0aW9uIAotCQkJCQkJLy8gc2V0cyByZWxvY0FkZHJlc3MgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gb2Zmc2V0IG9mZnNldC4iICAqc21pbGUqKS4KLQkJCQkJCS8vIEkgZXZlbnR1YWxseSBkdWcgaW50byB0aGUgQ0ZNIHNvdXJjZSBjb2RlIHRvIGZpbmQgbXkgaW50ZXJwcmV0YXRpb24sIHdoaWNoIAotCQkJCQkJLy8gSSBiZWxpZXZlIGlzIGNvcnJlY3QuICBUaGUga2V5IHBvaW50IGlzIHRodCB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIAotCQkJCQkJLy8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGZvciB3aGljaCB0aGVzZSByZWxvY2F0aW9ucyBhcmUgYmVpbmcgcGVyZm9ybWVkLgotCQkJCQkJCi0JCQkJCQkvLyBTa2lwIHRvIG5leHQgcmVsb2Mgd29yZCwgd2hpY2ggaXMgdGhlIHNlY29uZCBjaHVuayBvZiB0aGUgb2Zmc2V0LgotCQkJCQkJCi0JCQkJCQlzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKLQkJCQkJCQotCQkJCQkJLy8gRXh0cmFjdCBvZmZzZXQgYmFzZWQgb24gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMTAgYml0cyBpbiBvcENvZGUgYW5kIAotCQkJCQkJLy8gdGhlIG5leHQgc2lnbmlmaWNhbnQgMTYgYml0cyBpbiB0aGUgbmV4dCByZWxvYyB3b3JkLgotCQkJCQkJCi0JCQkJCQlvZmZzZXQgPSBQRUZSZWxvY1NldFBvc0Z1bGxPZmZzZXQob3BDb2RlLCByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXSk7CisgICAgZXJyID0gbm9FcnI7CisgICAgd2hpbGUgKCBzZWN0aW9uc0xlZnRUb1JlbG9jYXRlID4gMCApIHsKKyAgICAgICAgZXJyID0gSW5pdEVuZ2luZVN0YXRlKGZyYWdUb0ZpeCwgc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSwgJnN0YXRlKTsKKyAgICAgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgfQogCi0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgPSAoVUludDMyICopICggKChjaGFyICopIHN0YXRlLnNlY3Rpb25CYXNlKSArIG9mZnNldCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NMZ0J5SW1wb3J0OgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgc3ltYm9sVmFsdWU7Ci0JCQkJCQlVSW50MzIgaW5kZXg7CisgICAgICAgIHdoaWxlICggc3RhdGUuY3VycmVudFJlbG9jICE9IHN0YXRlLnRlcm1pbmF0aW5nUmVsb2MgKSB7CiAKLQkJCQkJCS8vIEdldCB0aGUgMjYgYml0IHN5bWJvbCBpbmRleCBmcm9tIHRoZSBjdXJyZW50IGFuZCBuZXh0IHJlbG9jIHdvcmRzLgotCQkJCQkJCi0JCQkJCQlzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKLQkJCQkJCWluZGV4ID0gUEVGUmVsb2NMZ0J5SW1wb3J0RnVsbEluZGV4KG9wQ29kZSwgcmVsb2NJbnN0clRhYmxlW3N0YXRlLmN1cnJlbnRSZWxvY10pOwotCQkJCQkJCi0JCQkJCQlpZiAoIGluZGV4ID49IGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgJiYgaW5kZXggPCAoaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCArIGltcG9ydExpYnJhcnktPmltcG9ydGVkU3ltYm9sQ291bnQpICkgewotCQkJCQkJCWVyciA9IExvb2t1cFN5bWJvbChsb29rdXAsIHJlZkNvbiwgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLCBpbmRleCwgJnN5bWJvbFZhbHVlKTsKLQkJCQkJCQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCQkJCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCQkJfQotCQkJCQkJCSooc3RhdGUucmVsb2NBZGRyZXNzKSArPSBzeW1ib2xWYWx1ZTsKLQkJCQkJCX0KLQkJCQkJCXN0YXRlLmltcG9ydEluZGV4ID0gaW5kZXggKyAxOwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IDE7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NMZ1JlcGVhdDoKLQkJCQkJI2lmIE1PUkVfREVCVUcKLQkJCQkJCURlYnVnU3RyKCJccFJ1blJlbG9jYXRpb25FbmdpbmU6IGtQRUZSZWxvY0xnUmVwZWF0IG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLQkJCQkJI2VuZGlmCi0JCQkJCWVyciA9IHVuaW1wRXJyOwotCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY0xnU2V0T3JCeVNlY3Rpb246Ci0JCQkJCSNpZiBNT1JFX0RFQlVHCi0JCQkJCQlEZWJ1Z1N0cigiXHBSdW5SZWxvY2F0aW9uRW5naW5lOiBrUEVGUmVsb2NMZ1NldE9yQnlTZWN0aW9uIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLQkJCQkJI2VuZGlmCi0JCQkJCWVyciA9IHVuaW1wRXJyOwotCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY1VuZGVmaW5lZE9wY29kZToKLQkJCQkJZXJyID0gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnI7Ci0JCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCU1vcmVBc3NlcnRRKGZhbHNlKTsKLQkJCQkJZXJyID0gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnI7Ci0JCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJc3RhdGUuY3VycmVudFJlbG9jICs9IDE7Ci0JCX0KLQkJCi0JCXNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgLT0gMTsKLQl9CisgICAgICAgICAgICBNb3JlQXNzZXJ0USggc3RhdGUuY3VycmVudFJlbG9jIDwgdG90YWxSZWxvY3MgKTsKKworICAgICAgICAgICAgb3BDb2RlID0gcmVsb2NJbnN0clRhYmxlW3N0YXRlLmN1cnJlbnRSZWxvY107CisgICAgICAgICAgICBzd2l0Y2ggKCBQRUZSZWxvY0Jhc2ljT3Bjb2RlKG9wQ29kZSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NCeVNlY3REV2l0aFNraXA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBza2lwQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBVSW50MTYgcmVsb2NDb3VudDsKKworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcENvdW50ID0gKChvcENvZGUgPj4gNikgJiAweDAwRkYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NDb3VudCA9IChvcENvZGUgJiAweDAwM0YpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucmVsb2NBZGRyZXNzICs9IHNraXBDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSByZWxvY0NvdW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jQnlTZWN0QzoKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0J5U2VjdEQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSBydW5MZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NUVmVjdG9yMTI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSAocnVuTGVuZ3RoICogMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NUVmVjdG9yODoKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1ZUYWJsZTg6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSAocnVuTGVuZ3RoICogMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NJbXBvcnRSdW46CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBydW5MZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW5MZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5pbXBvcnRJbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIHN0YXRlLmltcG9ydEluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIHN0YXRlLmltcG9ydEluZGV4LCAmc3ltYm9sVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlTm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooc3RhdGUucmVsb2NBZGRyZXNzKSArPSBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0SW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5MZW5ndGggLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtQnlJbXBvcnQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBpbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIGluZGV4LCAmc3ltYm9sVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IHN5bWJvbFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0SW5kZXggPSBpbmRleCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtU2V0U2VjdEM6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlY3Rpb25DID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgTW9yZUFzc2VydFEoc3RhdGUuc2VjdGlvbkMgIT0gbmlsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtU2V0U2VjdEQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAob3BDb2RlICYgMHgwMUZGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnNlY3Rpb25EID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgTW9yZUFzc2VydFEoc3RhdGUuc2VjdGlvbkQgIT0gbmlsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtQnlTZWN0aW9uOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NJbmNyUG9zaXRpb246CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiBvZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IChvcENvZGUgJiAweDBGRkYpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoY2hhciAqKSBzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1NtUmVwZWF0OgorICAgICAgICAgICAgICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdTdHIoIlxwUnVuUmVsb2NhdGlvbkVuZ2luZToga1BFRlJlbG9jU21SZXBlYXQgbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdW5pbXBFcnI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jU2V0UG9zaXRpb246CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBvZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvdCdzIG9mIGZvbGtzIGhhdmUgdHJpZWQgdmFyaW91cyBpbnRlcnByZXRhdGlvbnMgb2YgdGhlIGRlc2NyaXB0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG9wQ29kZSBpbiAiTWFjIE9TIFJ1bnRpbWUgQXJjaGl0ZWN0dXJlcyIgKHdoaWNoIHN0YXRlcyAiVGhpcyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0cyByZWxvY0FkZHJlc3MgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gb2Zmc2V0IG9mZnNldC4iICAqc21pbGUqKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEkgZXZlbnR1YWxseSBkdWcgaW50byB0aGUgQ0ZNIHNvdXJjZSBjb2RlIHRvIGZpbmQgbXkgaW50ZXJwcmV0YXRpb24sIHdoaWNoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJIGJlbGlldmUgaXMgY29ycmVjdC4gIFRoZSBrZXkgcG9pbnQgaXMgdGh0IHRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiBmb3Igd2hpY2ggdGhlc2UgcmVsb2NhdGlvbnMgYXJlIGJlaW5nIHBlcmZvcm1lZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB0byBuZXh0IHJlbG9jIHdvcmQsIHdoaWNoIGlzIHRoZSBzZWNvbmQgY2h1bmsgb2YgdGhlIG9mZnNldC4KKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuY3VycmVudFJlbG9jICs9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgb2Zmc2V0IGJhc2VkIG9uIHRoZSBtb3N0IHNpZ25pZmljYW50IDEwIGJpdHMgaW4gb3BDb2RlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgc2lnbmlmaWNhbnQgMTYgYml0cyBpbiB0aGUgbmV4dCByZWxvYyB3b3JkLgorCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBQRUZSZWxvY1NldFBvc0Z1bGxPZmZzZXQob3BDb2RlLCByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyA9IChVSW50MzIgKikgKCAoKGNoYXIgKikgc3RhdGUuc2VjdGlvbkJhc2UpICsgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0xnQnlJbXBvcnQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBzeW1ib2xWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiBpbmRleDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSAyNiBiaXQgc3ltYm9sIGluZGV4IGZyb20gdGhlIGN1cnJlbnQgYW5kIG5leHQgcmVsb2Mgd29yZHMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRSZWxvYyArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBQRUZSZWxvY0xnQnlJbXBvcnRGdWxsSW5kZXgob3BDb2RlLCByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBpbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIGluZGV4LCAmc3ltYm9sVmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IHN5bWJvbFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW1wb3J0SW5kZXggPSBpbmRleCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0xnUmVwZWF0OgorICAgICAgICAgICAgICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdTdHIoIlxwUnVuUmVsb2NhdGlvbkVuZ2luZToga1BFRlJlbG9jTGdSZXBlYXQgbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdW5pbXBFcnI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jTGdTZXRPckJ5U2VjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgI2lmIE1PUkVfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnU3RyKCJccFJ1blJlbG9jYXRpb25FbmdpbmU6IGtQRUZSZWxvY0xnU2V0T3JCeVNlY3Rpb24gbm90IHlldCBpbXBsZW1lbnRlZCIpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdW5pbXBFcnI7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jVW5kZWZpbmVkT3Bjb2RlOgorICAgICAgICAgICAgICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50Q29ycnVwdEVycjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTW9yZUFzc2VydFEoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50Q29ycnVwdEVycjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgLT0gMTsKKyAgICB9CiAKIGxlYXZlTm93OgotCXJldHVybiBlcnI7CisgICAgcmV0dXJuIGVycjsKIH0KIAogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0Q29yZShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCi0JCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAotCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAotCQkJCQkJCQkJCUNGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKLQkJCQkJCQkJCQl2b2lkICpyZWZDb24pCi0JLy8gU2VlIGNvbW1lbnRzIGluIGludGVyZmFjZSBwYXJ0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgbG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWZDb24pCisgICAgLy8gU2VlIGNvbW1lbnRzIGluIGludGVyZmFjZSBwYXJ0LgogewotCU9TU3RhdHVzIGVycjsKLQlPU1N0YXR1cyBqdW5rOwotCUZyYWdUb0ZpeEluZm8gZnJhZ1RvRml4OwotCVBFRkltcG9ydGVkTGlicmFyeSAqaW1wb3J0TGlicmFyeTsKLQljaGFyIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmdbMjU2XTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgT1NTdGF0dXMganVuazsKKyAgICBGcmFnVG9GaXhJbmZvIGZyYWdUb0ZpeDsKKyAgICBQRUZJbXBvcnRlZExpYnJhcnkgKmltcG9ydExpYnJhcnk7CisgICAgY2hhciB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nWzI1Nl07CiAKLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXhMb2NhdG9yICE9IG5pbCk7CQotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeENvbm5JRCAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeEluaXRSb3V0aW5lICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEod2Vha0xpbmtlZExpYnJhcnlOYW1lICE9IG5pbCk7CQotCU1vcmVBc3NlcnRRKGxvb2t1cCAhPSBuaWwpOwkKLQkKLQkvLyBGaWxsIG91dCB0aGUgYml0cyBvZiBmcmFnVG9GaXggd2hpY2ggYXJlIHBhc3NlZCBpbgotCS8vIGJ5IHRoZSBjbGllbnQuCi0JCi0JTW9yZUJsb2NrWmVybygmZnJhZ1RvRml4LCBzaXplb2YoZnJhZ1RvRml4KSk7Ci0JZnJhZ1RvRml4LmxvY2F0b3IgPSAqZnJhZ1RvRml4TG9jYXRvcjsKLQlmcmFnVG9GaXguY29ubklEICA9IGZyYWdUb0ZpeENvbm5JRDsKLQlmcmFnVG9GaXguaW5pdFJvdXRpbmUgPSBmcmFnVG9GaXhJbml0Um91dGluZTsKLQkKLQkvLyBNYWtlIGEgQyBzdHJpbmcgZnJvbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCi0JCi0JQmxvY2tNb3ZlRGF0YSh3ZWFrTGlua2VkTGlicmFyeU5hbWUgKyAxLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVbMF0pOwotCXdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmdbd2Vha0xpbmtlZExpYnJhcnlOYW1lWzBdXSA9IDA7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4TG9jYXRvciAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeENvbm5JRCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeEluaXRSb3V0aW5lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEod2Vha0xpbmtlZExpYnJhcnlOYW1lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7CiAKLQkvLyBHZXQgdGhlIGJhc2ljIGluZm9ybWF0aW9uIGZyb20gdGhlIGZyYWdtZW50LgotCS8vIEZpbGxzIG91dCB0aGUgY29udGFpbmVySGVhZGVyLCBzZWN0aW9uSGVhZGVycywgbG9hZGVyU2VjdGlvbiBhbmQgZmlsZVJlZiBmaWVsZHMKLQkvLyBvZiBmcmFnVG9GaXguCi0JCi0JZXJyID0gUmVhZENvbnRhaW5lckJhc2ljcygmZnJhZ1RvRml4KTsKKyAgICAvLyBGaWxsIG91dCB0aGUgYml0cyBvZiBmcmFnVG9GaXggd2hpY2ggYXJlIHBhc3NlZCBpbgorICAgIC8vIGJ5IHRoZSBjbGllbnQuCiAKLQkvLyBTZXQgdXAgdGhlIGJhc2UgYWRkcmVzcyBmaWVsZHMgaW4gZnJhZ1RvRml4IChpZSBzZWN0aW9uMEJhc2UgYW5kIHNlY3Rpb24xQmFzZSkKLQkvLyBieSBsb29raW5nIHVwIG91ciBpbml0IHJvdXRpbmUgKGZyYWdUb0ZpeC5pbml0Um91dGluZSkgYW5kIHN1YnRyYWN0aW5nCi0JLy8gYXdheSB0aGUgc2VjdGlvbiBvZmZzZXRzICh3aGljaCB3ZSBnZXQgZnJvbSB0aGUgZGlzayBjb3B5IG9mIHRoZSBzZWN0aW9uKQotCS8vIHRvIGRlcml2ZSB0aGUgYmFzZXMgb2YgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMuCi0JCi0JaWYgKGVyciA9PSBub0VycikgewotCQllcnIgPSBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzKCZmcmFnVG9GaXgpOwotCX0KLQkKLQkvLyBMb29rIGluc2lkZSB0aGUgbG9hZGVyIHNlY3Rpb24gZm9yIHRoZSBpbXBvcnQgbGlicmFyeSBkZXNjcmlwdGlvbgotCS8vIG9mIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4gIFdlIG5lZWQgdGhpcyB0byBrbm93IHRoZSByYW5nZSBvZiBzeW1ib2wKLQkvLyBpbmRleGVzIHdlJ3JlIGdvaW5nIHRvIGZpeCB1cC4KLQkKLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCWVyciA9IEZpbmRJbXBvcnRMaWJyYXJ5KGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nLCAmaW1wb3J0TGlicmFyeSk7Ci0JfQotCQotCS8vIERvIGEgcXVpY2sgY2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGxpYnJhcnkgd2FzIGFjdHVhbGx5IGltcG9ydGVkIHdlYWsuCi0JLy8gSWYgaXQgd2Fzbid0LCBpdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byByZXNvbHZlIGl0cyB3ZWFrIGltcG9ydHMKLQkvLyBsYXRlciBvbi4gIFJlc29sdmluZyB0aGVtIGFnYWluIGlzIGxpa2VseSB0byBiZSBiYWQuCi0JCi0JaWYgKGVyciA9PSBub0VycikgewotCQlpZiAoKGltcG9ydExpYnJhcnktPm9wdGlvbnMgJiBrUEVGV2Vha0ltcG9ydExpYk1hc2spID09IDApIHsKLQkJCWVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKLQkJfQotCX0KLQkKLQkvLyBOb3cgcnVuIHRoZSBtYWluIHJlbG9jYXRpb24gZW5naW5lLgotCQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJZXJyID0gUnVuUmVsb2NhdGlvbkVuZ2luZSgmZnJhZ1RvRml4LCBpbXBvcnRMaWJyYXJ5LCBsb29rdXAsIHJlZkNvbik7Ci0JfQotCQotCS8vIENsZWFuIHVwLgotCQotCWlmIChmcmFnVG9GaXguZGlzcG9zZVNlY3Rpb25Qb2ludGVycykgewotCQlpZiAoZnJhZ1RvRml4LmZpbGVSZWYgIT0gMCkgewotCQkJanVuayA9IEZTQ2xvc2UoZnJhZ1RvRml4LmZpbGVSZWYpOwotCQkJTW9yZUFzc2VydFEoanVuayA9PSBub0Vycik7Ci0JCX0KLQkJaWYgKGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uICE9IG5pbCkgewotCQkJRGlzcG9zZVB0ciggKFB0cikgZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24pOwotCQkJTW9yZUFzc2VydFEoTWVtRXJyb3IoKSA9PSBub0Vycik7Ci0JCX0KLQkJaWYgKGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyAhPSBuaWwpIHsKLQkJCURpc3Bvc2VQdHIoIChQdHIpIGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyk7Ci0JCQlNb3JlQXNzZXJ0UShNZW1FcnJvcigpID09IG5vRXJyKTsKLQkJfQotCX0KLQlyZXR1cm4gZXJyOworICAgIE1vcmVCbG9ja1plcm8oJmZyYWdUb0ZpeCwgc2l6ZW9mKGZyYWdUb0ZpeCkpOworICAgIGZyYWdUb0ZpeC5sb2NhdG9yID0gKmZyYWdUb0ZpeExvY2F0b3I7CisgICAgZnJhZ1RvRml4LmNvbm5JRCAgPSBmcmFnVG9GaXhDb25uSUQ7CisgICAgZnJhZ1RvRml4LmluaXRSb3V0aW5lID0gZnJhZ1RvRml4SW5pdFJvdXRpbmU7CisKKyAgICAvLyBNYWtlIGEgQyBzdHJpbmcgZnJvbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCisKKyAgICBCbG9ja01vdmVEYXRhKHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSArIDEsIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmcsIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZVswXSk7CisgICAgd2Vha0xpbmtlZExpYnJhcnlOYW1lQ1N0cmluZ1t3ZWFrTGlua2VkTGlicmFyeU5hbWVbMF1dID0gMDsKKworICAgIC8vIEdldCB0aGUgYmFzaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgZnJhZ21lbnQuCisgICAgLy8gRmlsbHMgb3V0IHRoZSBjb250YWluZXJIZWFkZXIsIHNlY3Rpb25IZWFkZXJzLCBsb2FkZXJTZWN0aW9uIGFuZCBmaWxlUmVmIGZpZWxkcworICAgIC8vIG9mIGZyYWdUb0ZpeC4KKworICAgIGVyciA9IFJlYWRDb250YWluZXJCYXNpY3MoJmZyYWdUb0ZpeCk7CisKKyAgICAvLyBTZXQgdXAgdGhlIGJhc2UgYWRkcmVzcyBmaWVsZHMgaW4gZnJhZ1RvRml4IChpZSBzZWN0aW9uMEJhc2UgYW5kIHNlY3Rpb24xQmFzZSkKKyAgICAvLyBieSBsb29raW5nIHVwIG91ciBpbml0IHJvdXRpbmUgKGZyYWdUb0ZpeC5pbml0Um91dGluZSkgYW5kIHN1YnRyYWN0aW5nCisgICAgLy8gYXdheSB0aGUgc2VjdGlvbiBvZmZzZXRzICh3aGljaCB3ZSBnZXQgZnJvbSB0aGUgZGlzayBjb3B5IG9mIHRoZSBzZWN0aW9uKQorICAgIC8vIHRvIGRlcml2ZSB0aGUgYmFzZXMgb2YgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMuCisKKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIGVyciA9IFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMoJmZyYWdUb0ZpeCk7CisgICAgfQorCisgICAgLy8gTG9vayBpbnNpZGUgdGhlIGxvYWRlciBzZWN0aW9uIGZvciB0aGUgaW1wb3J0IGxpYnJhcnkgZGVzY3JpcHRpb24KKyAgICAvLyBvZiB3ZWFrTGlua2VkTGlicmFyeU5hbWUuICBXZSBuZWVkIHRoaXMgdG8ga25vdyB0aGUgcmFuZ2Ugb2Ygc3ltYm9sCisgICAgLy8gaW5kZXhlcyB3ZSdyZSBnb2luZyB0byBmaXggdXAuCisKKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIGVyciA9IEZpbmRJbXBvcnRMaWJyYXJ5KGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uLCB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nLCAmaW1wb3J0TGlicmFyeSk7CisgICAgfQorCisgICAgLy8gRG8gYSBxdWljayBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgbGlicmFyeSB3YXMgYWN0dWFsbHkgaW1wb3J0ZWQgd2Vhay4KKyAgICAvLyBJZiBpdCB3YXNuJ3QsIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHJlc29sdmUgaXRzIHdlYWsgaW1wb3J0cworICAgIC8vIGxhdGVyIG9uLiAgUmVzb2x2aW5nIHRoZW0gYWdhaW4gaXMgbGlrZWx5IHRvIGJlIGJhZC4KKworICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgaWYgKChpbXBvcnRMaWJyYXJ5LT5vcHRpb25zICYga1BFRldlYWtJbXBvcnRMaWJNYXNrKSA9PSAwKSB7CisgICAgICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3cgcnVuIHRoZSBtYWluIHJlbG9jYXRpb24gZW5naW5lLgorCisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBlcnIgPSBSdW5SZWxvY2F0aW9uRW5naW5lKCZmcmFnVG9GaXgsIGltcG9ydExpYnJhcnksIGxvb2t1cCwgcmVmQ29uKTsKKyAgICB9CisKKyAgICAvLyBDbGVhbiB1cC4KKworICAgIGlmIChmcmFnVG9GaXguZGlzcG9zZVNlY3Rpb25Qb2ludGVycykgeworICAgICAgICBpZiAoZnJhZ1RvRml4LmZpbGVSZWYgIT0gMCkgeworICAgICAgICAgICAganVuayA9IEZTQ2xvc2UoZnJhZ1RvRml4LmZpbGVSZWYpOworICAgICAgICAgICAgTW9yZUFzc2VydFEoanVuayA9PSBub0Vycik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdUb0ZpeC5sb2FkZXJTZWN0aW9uICE9IG5pbCkgeworICAgICAgICAgICAgRGlzcG9zZVB0ciggKFB0cikgZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24pOworICAgICAgICAgICAgTW9yZUFzc2VydFEoTWVtRXJyb3IoKSA9PSBub0Vycik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyAhPSBuaWwpIHsKKyAgICAgICAgICAgIERpc3Bvc2VQdHIoIChQdHIpIGZyYWdUb0ZpeC5zZWN0aW9uSGVhZGVycyk7CisgICAgICAgICAgICBNb3JlQXNzZXJ0UShNZW1FcnJvcigpID09IG5vRXJyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TU3RhdHVzIEZyYWdtZW50TG9va3VwKENvbnN0U3RyMjU1UGFyYW0gc3ltTmFtZSwgQ0ZyYWdTeW1ib2xDbGFzcyBzeW1DbGFzcywKLQkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCi0JLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuIAotCS8vIGxhdGUgaW1wb3J0aW5nIGZyb20gYSBDRk0gc2hhcmVkIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqc3ltQWRkciwgdm9pZCAqcmVmQ29uKQorICAgIC8vIFRoaXMgaXMgdGhlIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGNhbGxiYWNrIHVzZWQgd2hlbgorICAgIC8vIGxhdGUgaW1wb3J0aW5nIGZyb20gYSBDRk0gc2hhcmVkIGxpYnJhcnkuCiB7Ci0JT1NTdGF0dXMgZXJyOwotCUNGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0OwotCUNGcmFnU3ltYm9sQ2xhc3MgIGZvdW5kU3ltQ2xhc3M7Ci0JCi0JTW9yZUFzc2VydFEoc3ltTmFtZSAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHN5bUFkZHIgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShyZWZDb24gICE9IG5pbCk7Ci0JCi0JY29ubklEVG9JbXBvcnQgPSAoQ0ZyYWdDb25uZWN0aW9uSUQpIHJlZkNvbjsKLQkKLQkvLyBTaGFtZSB0aGVyZSdzIG5vIHdheSB0byB2YWxpZGF0ZSB0aGF0IGNvbm5JRFRvSW1wb3J0IGlzIHZhbGlkLgorICAgIE9TU3RhdHVzIGVycjsKKyAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydDsKKyAgICBDRnJhZ1N5bWJvbENsYXNzICBmb3VuZFN5bUNsYXNzOwogCi0JZXJyID0gRmluZFN5bWJvbChjb25uSURUb0ltcG9ydCwgc3ltTmFtZSwgKFB0ciAqKSBzeW1BZGRyLCAmZm91bmRTeW1DbGFzcyk7Ci0JaWYgKGVyciA9PSBub0VycikgewotCQkvLyBJZiB0aGUgc3ltYm9sIGlzbid0IG9mIHRoZSByaWdodCBjbGFzcywgd2UgYWN0IGxpa2Ugd2UgZGlkbid0IAotCQkvLyBmaW5kIGl0LCBidXQgYWxzbyBhc3NlcnQgaW4gdGhlIGRlYnVnIGJ1aWxkIGJlY2F1c2Ugd2VpcmQgdGhpbmdzIAotCQkvLyBhcmUgYWZvb3QuCi0JCWlmIChmb3VuZFN5bUNsYXNzICE9IHN5bUNsYXNzKSB7Ci0JCQlNb3JlQXNzZXJ0UShmYWxzZSk7Ci0JCQkqc3ltQWRkciA9IG5pbDsKLQkJCWVyciA9IGNmcmFnTm9TeW1ib2xFcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKKworICAgIGNvbm5JRFRvSW1wb3J0ID0gKENGcmFnQ29ubmVjdGlvbklEKSByZWZDb247CisKKyAgICAvLyBTaGFtZSB0aGVyZSdzIG5vIHdheSB0byB2YWxpZGF0ZSB0aGF0IGNvbm5JRFRvSW1wb3J0IGlzIHZhbGlkLgorCisgICAgZXJyID0gRmluZFN5bWJvbChjb25uSURUb0ltcG9ydCwgc3ltTmFtZSwgKFB0ciAqKSBzeW1BZGRyLCAmZm91bmRTeW1DbGFzcyk7CisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAvLyBJZiB0aGUgc3ltYm9sIGlzbid0IG9mIHRoZSByaWdodCBjbGFzcywgd2UgYWN0IGxpa2Ugd2UgZGlkbid0CisgICAgICAgIC8vIGZpbmQgaXQsIGJ1dCBhbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB3ZWlyZCB0aGluZ3MKKyAgICAgICAgLy8gYXJlIGFmb290LgorICAgICAgICBpZiAoZm91bmRTeW1DbGFzcyAhPSBzeW1DbGFzcykgeworICAgICAgICAgICAgTW9yZUFzc2VydFEoZmFsc2UpOworICAgICAgICAgICAgKnN5bUFkZHIgPSBuaWw7CisgICAgICAgICAgICBlcnIgPSBjZnJhZ05vU3ltYm9sRXJyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIGV4dGVybiBwYXNjYWwgT1NTdGF0dXMgQ0ZNTGF0ZUltcG9ydExpYnJhcnkoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKLQkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCkKLQkvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCkKKyAgICAvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCiB7Ci0JTW9yZUFzc2VydFEoY29ubklEVG9JbXBvcnQgIT0gbmlsKTsKLQlyZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQl3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEZyYWdtZW50TG9va3VwLCBjb25uSURUb0ltcG9ydCk7CisgICAgTW9yZUFzc2VydFEoY29ubklEVG9JbXBvcnQgIT0gbmlsKTsKKyAgICByZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEZyYWdtZW50TG9va3VwLCBjb25uSURUb0ltcG9ydCk7CiB9CiAKIHN0YXRpYyBwYXNjYWwgT1NTdGF0dXMgQnVuZGxlTG9va3VwKENvbnN0U3RyMjU1UGFyYW0gc3ltTmFtZSwgQ0ZyYWdTeW1ib2xDbGFzcyBzeW1DbGFzcywKLQkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCi0JLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuIAotCS8vIGxhdGUgaW1wb3J0aW5nIGZyb20gYSBDRkJ1bmRsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCisgICAgLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuCisgICAgLy8gbGF0ZSBpbXBvcnRpbmcgZnJvbSBhIENGQnVuZGxlLgogewotCU9TU3RhdHVzIAllcnI7Ci0JQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQ7Ci0JQ0ZTdHJpbmdSZWYgc3ltTmFtZVN0cjsKLQkKLQlNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKLQkKLQlzeW1OYW1lU3RyID0gbmlsOwotCQotCWJ1bmRsZVRvSW1wb3J0ID0gKENGQnVuZGxlUmVmKSByZWZDb247Ci0JCi0JLy8gU2hhbWUgdGhlcmUncyBubyB3YXkgdG8gdmFsaWRhdGUgdGhhdCBidW5kbGVUb0ltcG9ydCBpcyByZWFsbHkgYSBidW5kbGUuCi0JCi0JLy8gV2UgY2FuIG9ubHkgZmluZCBmdW5jdGlvbiBwb2ludGVycyBiZWNhdXNlIENGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZSAKLQkvLyBvbmx5IHdvcmtzIGZvciBmdW5jdGlvbiBwb2ludGVycy4gIFNvIGlmIHRoZSBjbGllbnQgaXMgYXNraW5nIGZvciBzb21ldGhpbmcgCi0JLy8gb3RoZXIgdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgKGllIFRWZWN0b3Igc3ltYm9sKSB0aGVuIHdlIGRvbid0IGV2ZW4gdHJ1ZS4KLQkvLyBBbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB0aGlzIHNob3dzIGEgY2VydGFpbiBsYWNrIG9mIAotCS8vIHVuZGVyc3RhbmRpbmcgb24gdGhlIHBhcnQgb2YgdGhlIGNsaWVudC4KLQkvLwotCS8vIENGIGlzIGJlaW5nIHJldmlzZSB0byBzdXBwb3J0IGFjY2Vzc2luZyBkYXRhIHN5bWJvbHMgdXNpbmcgYSBuZXcgQVBJCi0JLy8gKGN1cnJlbnRseSB0aGlzIGlzIGF2YWlsYWJsZSB0byBBcHBsZSBpbnRlcm5hbCBkZXZlbG9wZXJzIGFzIAotCS8vIENGQnVuZGxlR2V0RGF0YVBvaW50ZXJGb3JOYW1lKS4gIFdoZW4gdGhlIG5ldyBBUEkgaXMgYXZhaWxhYmxlIGluIGEgCi0JLy8gcHVibGljIGhlYWRlciBmaWxlIEkgc2hvdWxkIHJldmlzZSB0aGlzIGNvZGUgdG8gbGlmdCB0aGlzIHJlc3RyaWN0aW9uLgotCQotCWVyciA9IG5vRXJyOwotCWlmIChzeW1DbGFzcyAhPSBrVFZlY3RvckNGcmFnU3ltYm9sKSB7Ci0JCU1vcmVBc3NlcnRRKGZhbHNlKTsKLQkJZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKLQl9Ci0JaWYgKGVyciA9PSBub0VycikgewotCQlzeW1OYW1lU3RyID0gQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKGtDRkFsbG9jYXRvclN5c3RlbURlZmF1bHQsIAotCQkJCQkJCQkJCQkJCXN5bU5hbWUsIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pOwotCQlpZiAoc3ltTmFtZVN0ciA9PSBuaWwpIHsKLQkJCWVyciA9IGNvcmVGb3VuZGF0aW9uVW5rbm93bkVycjsKLQkJfQotCX0KLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCSpzeW1BZGRyID0gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lKGJ1bmRsZVRvSW1wb3J0LCBzeW1OYW1lU3RyKTsKLQkJaWYgKCpzeW1BZGRyID09IG5pbCkgewotCQkJZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKLQkJfQotCX0KLQlpZiAoc3ltTmFtZVN0ciAhPSBuaWwpIHsKLQkJQ0ZSZWxlYXNlKHN5bU5hbWVTdHIpOwotCX0KLQlyZXR1cm4gZXJyOworICAgIE9TU3RhdHVzICAgICAgICAgICAgZXJyOworICAgIENGQnVuZGxlUmVmIGJ1bmRsZVRvSW1wb3J0OworICAgIENGU3RyaW5nUmVmIHN5bU5hbWVTdHI7CisKKyAgICBNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKKworICAgIHN5bU5hbWVTdHIgPSBuaWw7CisKKyAgICBidW5kbGVUb0ltcG9ydCA9IChDRkJ1bmRsZVJlZikgcmVmQ29uOworCisgICAgLy8gU2hhbWUgdGhlcmUncyBubyB3YXkgdG8gdmFsaWRhdGUgdGhhdCBidW5kbGVUb0ltcG9ydCBpcyByZWFsbHkgYSBidW5kbGUuCisKKyAgICAvLyBXZSBjYW4gb25seSBmaW5kIGZ1bmN0aW9uIHBvaW50ZXJzIGJlY2F1c2UgQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lCisgICAgLy8gb25seSB3b3JrcyBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuICBTbyBpZiB0aGUgY2xpZW50IGlzIGFza2luZyBmb3Igc29tZXRoaW5nCisgICAgLy8gb3RoZXIgdGhhbiBhIGZ1bmN0aW9uIHBvaW50ZXIgKGllIFRWZWN0b3Igc3ltYm9sKSB0aGVuIHdlIGRvbid0IGV2ZW4gdHJ1ZS4KKyAgICAvLyBBbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB0aGlzIHNob3dzIGEgY2VydGFpbiBsYWNrIG9mCisgICAgLy8gdW5kZXJzdGFuZGluZyBvbiB0aGUgcGFydCBvZiB0aGUgY2xpZW50LgorICAgIC8vCisgICAgLy8gQ0YgaXMgYmVpbmcgcmV2aXNlIHRvIHN1cHBvcnQgYWNjZXNzaW5nIGRhdGEgc3ltYm9scyB1c2luZyBhIG5ldyBBUEkKKyAgICAvLyAoY3VycmVudGx5IHRoaXMgaXMgYXZhaWxhYmxlIHRvIEFwcGxlIGludGVybmFsIGRldmVsb3BlcnMgYXMKKyAgICAvLyBDRkJ1bmRsZUdldERhdGFQb2ludGVyRm9yTmFtZSkuICBXaGVuIHRoZSBuZXcgQVBJIGlzIGF2YWlsYWJsZSBpbiBhCisgICAgLy8gcHVibGljIGhlYWRlciBmaWxlIEkgc2hvdWxkIHJldmlzZSB0aGlzIGNvZGUgdG8gbGlmdCB0aGlzIHJlc3RyaWN0aW9uLgorCisgICAgZXJyID0gbm9FcnI7CisgICAgaWYgKHN5bUNsYXNzICE9IGtUVmVjdG9yQ0ZyYWdTeW1ib2wpIHsKKyAgICAgICAgTW9yZUFzc2VydFEoZmFsc2UpOworICAgICAgICBlcnIgPSBjZnJhZ05vU3ltYm9sRXJyOworICAgIH0KKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIHN5bU5hbWVTdHIgPSBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcoa0NGQWxsb2NhdG9yU3lzdGVtRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bU5hbWUsIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pOworICAgICAgICBpZiAoc3ltTmFtZVN0ciA9PSBuaWwpIHsKKyAgICAgICAgICAgIGVyciA9IGNvcmVGb3VuZGF0aW9uVW5rbm93bkVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICpzeW1BZGRyID0gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lKGJ1bmRsZVRvSW1wb3J0LCBzeW1OYW1lU3RyKTsKKyAgICAgICAgaWYgKCpzeW1BZGRyID09IG5pbCkgeworICAgICAgICAgICAgZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3ltTmFtZVN0ciAhPSBuaWwpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKHN5bU5hbWVTdHIpOworICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBleHRlcm4gcGFzY2FsIE9TU3RhdHVzIENGTUxhdGVJbXBvcnRCdW5kbGUoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKLQkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKLQkJCQkJCQkJCQlDRkJ1bmRsZVJlZiBidW5kbGVUb0ltcG9ydCkKLQkvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZVJlZiBidW5kbGVUb0ltcG9ydCkKKyAgICAvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCiB7Ci0JTW9yZUFzc2VydFEoYnVuZGxlVG9JbXBvcnQgIT0gbmlsKTsKLQlyZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQl3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEJ1bmRsZUxvb2t1cCwgYnVuZGxlVG9JbXBvcnQpOworICAgIE1vcmVBc3NlcnRRKGJ1bmRsZVRvSW1wb3J0ICE9IG5pbCk7CisgICAgcmV0dXJuIENGTUxhdGVJbXBvcnRDb3JlKGZyYWdUb0ZpeExvY2F0b3IsIGZyYWdUb0ZpeENvbm5JRCwgZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vha0xpbmtlZExpYnJhcnlOYW1lLCBCdW5kbGVMb29rdXAsIGJ1bmRsZVRvSW1wb3J0KTsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuaCBiL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuaAppbmRleCBmM2E4OWJjLi4wODc4OTYwIDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmgKKysrIGIvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5oCkBAIC0xLDMzICsxLDMzIEBACiAvKgotCUZpbGU6CQlDRk1MYXRlSW1wb3J0LmgKKyAgICBGaWxlOiAgICAgICAgICAgICAgIENGTUxhdGVJbXBvcnQuaAogCi0JQ29udGFpbnM6CUludGVyZmFjZSB0byBDRk0gbGF0ZSBpbXBvcnQgbGlicmFyeS4KKyAgICBDb250YWluczogICAgICAgICAgIEludGVyZmFjZSB0byBDRk0gbGF0ZSBpbXBvcnQgbGlicmFyeS4KIAotCVdyaXR0ZW4gYnk6CVF1aW5uCisgICAgV3JpdHRlbiBieTogICAgICAgICBRdWlubgogCi0JQ29weXJpZ2h0OglDb3B5cmlnaHQgqSAxOTk5IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorICAgIENvcHlyaWdodDogICAgICAgICAgQ29weXJpZ2h0IKkgMTk5OSBieSBBcHBsZSBDb21wdXRlciwgSW5jLiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KIAotCQkJCVlvdSBtYXkgaW5jb3Jwb3JhdGUgdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaW50byB5b3VyIHByb2dyYW0ocykgd2l0aG91dAotCQkJCXJlc3RyaWN0aW9uLiBUaGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBoYXMgYmVlbiBwcm92aWRlZCAiQVMgSVMiIGFuZCB0aGUKLQkJCQlyZXNwb25zaWJpbGl0eSBmb3IgaXRzIG9wZXJhdGlvbiBpcyB5b3Vycy4gWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHJlZGlzdHJpYnV0ZQotCQkJCXRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGFzICJBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUiIGFmdGVyIGhhdmluZyBtYWRlCi0JCQkJY2hhbmdlcy4gSWYgeW91J3JlIGdvaW5nIHRvIHJlLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSwgd2UgcmVxdWlyZSB0aGF0IHlvdSBtYWtlCi0JCQkJaXQgY2xlYXIgaW4gdGhlIHNvdXJjZSB0aGF0IHRoZSBjb2RlIHdhcyBkZXNjZW5kZWQgZnJvbSBBcHBsZSBzYW1wbGUgc291cmNlCi0JCQkJY29kZSwgYnV0IHRoYXQgeW91J3ZlIG1hZGUgY2hhbmdlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IGluY29ycG9yYXRlIHRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGludG8geW91ciBwcm9ncmFtKHMpIHdpdGhvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvbi4gVGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaGFzIGJlZW4gcHJvdmlkZWQgIkFTIElTIiBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvcGVyYXRpb24gaXMgeW91cnMuIFlvdSBhcmUgbm90IHBlcm1pdHRlZCB0byByZWRpc3RyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBhcyAiQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIiBhZnRlciBoYXZpbmcgbWFkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuIElmIHlvdSdyZSBnb2luZyB0byByZS1kaXN0cmlidXRlIHRoZSBzb3VyY2UsIHdlIHJlcXVpcmUgdGhhdCB5b3UgbWFrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNsZWFyIGluIHRoZSBzb3VyY2UgdGhhdCB0aGUgY29kZSB3YXMgZGVzY2VuZGVkIGZyb20gQXBwbGUgc2FtcGxlIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsIGJ1dCB0aGF0IHlvdSd2ZSBtYWRlIGNoYW5nZXMuCiAKLQlDaGFuZ2UgSGlzdG9yeSAobW9zdCByZWNlbnQgZmlyc3QpOgorICAgIENoYW5nZSBIaXN0b3J5IChtb3N0IHJlY2VudCBmaXJzdCk6CiAKLSAgICAgICAgIDw2PiAgICAgMjEvOS8wMSAgICBRdWlubiAgIENoYW5nZXMgZm9yIENXUHJvNyBNYWNoLU8gYnVpbGQuCi0gICAgICAgICA8NT4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDaGFuZ2UgY29tbWVudHMgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGFuIHVucGFja2VkIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgotICAgICAgICAgPDQ+ICAgICAxOS85LzAxICAgIFF1aW5uICAgU2ltcGxpZmllZCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGFmdGVyIGEgc3VnZ2VzdGlvbiBieSBFcmljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFudC4gWW91IG5vIGxvbmdlciBoYXZlIHRvIENGTSBleHBvcnQgYSBkdW1teSBmdW5jdGlvbjsgeW91Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4ganVzdCBwYXNzIGluIHRoZSBhZGRyZXNzIG9mIHlvdXIgZnJhZ21lbnQncyBpbml0IHJvdXRpbmUuCi0gICAgICAgICA8Mz4gICAgMTYvMTEvMDAgICAgUXVpbm4gICBBbGxvdyBzeW1ib2wgZmluZGluZyB2aWEgYSBjYWxsYmFjayBhbmQgdXNlIHRoYXQgdG8gaW1wbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZSBzdXBwb3J0LgotICAgICAgICAgPDI+ICAgIDE4LzEwLzk5ICAgIFF1aW5uICAgUmVuYW1lZCBDRk1MYXRlSW1wb3J0IHRvIENGTUxhdGVJbXBvcnRMaWJyYXJ5IHRvIGFsbG93IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZnV0dXJlIEFQSSBleHBhbnNpb24uCi0gICAgICAgICA8MT4gICAgIDE1LzYvOTkgICAgUXVpbm4gICBGaXJzdCBjaGVja2VkIGluLgorICAgICA8Nj4gICAgIDIxLzkvMDEgICAgUXVpbm4gICBDaGFuZ2VzIGZvciBDV1BybzcgTWFjaC1PIGJ1aWxkLgorICAgICA8NT4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBDaGFuZ2UgY29tbWVudHMgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IGFuIHVucGFja2VkIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpcyBubyBsb25nZXIgcmVxdWlyZWQuCisgICAgIDw0PiAgICAgMTkvOS8wMSAgICBRdWlubiAgIFNpbXBsaWZpZWQgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBhZnRlciBhIHN1Z2dlc3Rpb24gYnkgRXJpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFudC4gWW91IG5vIGxvbmdlciBoYXZlIHRvIENGTSBleHBvcnQgYSBkdW1teSBmdW5jdGlvbjsgeW91CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBqdXN0IHBhc3MgaW4gdGhlIGFkZHJlc3Mgb2YgeW91ciBmcmFnbWVudCdzIGluaXQgcm91dGluZS4KKyAgICAgPDM+ICAgIDE2LzExLzAwICAgIFF1aW5uICAgQWxsb3cgc3ltYm9sIGZpbmRpbmcgdmlhIGEgY2FsbGJhY2sgYW5kIHVzZSB0aGF0IHRvIGltcGxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZSBzdXBwb3J0LgorICAgICA8Mj4gICAgMTgvMTAvOTkgICAgUXVpbm4gICBSZW5hbWVkIENGTUxhdGVJbXBvcnQgdG8gQ0ZNTGF0ZUltcG9ydExpYnJhcnkgdG8gYWxsb3cgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGZ1dHVyZSBBUEkgZXhwYW5zaW9uLgorICAgICA8MT4gICAgIDE1LzYvOTkgICAgUXVpbm4gICBGaXJzdCBjaGVja2VkIGluLgogKi8KIAogI3ByYWdtYSBvbmNlCkBAIC00MSwxMCArNDEsMTAgQEAKIC8vIE1hYyBPUyBJbnRlcmZhY2VzCiAKICNpZiAhIE1PUkVfRlJBTUVXT1JLX0lOQ0xVREVTCi0JI2luY2x1ZGUgPE1hY1R5cGVzLmg+Ci0JI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KLQkjaW5jbHVkZSA8RGV2aWNlcy5oPgotCSNpbmNsdWRlIDxDRkJ1bmRsZS5oPgorICAgICNpbmNsdWRlIDxNYWNUeXBlcy5oPgorICAgICNpbmNsdWRlIDxDb2RlRnJhZ21lbnRzLmg+CisgICAgI2luY2x1ZGUgPERldmljZXMuaD4KKyAgICAjaW5jbHVkZSA8Q0ZCdW5kbGUuaD4KICNlbmRpZgogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTMsMjE5ICs1MywyMTkgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLS8qCUZBUQotCS0tLQotCQotCVE6CVdoYXQgZG9lcyB0aGlzIGxpYnJhcnkgZG8/Ci0JQToJSXQgYWxsb3dzIHlvdSB0byByZXNvbHZlIGEgd2VhayBsaW5rZWQgbGlicmFyeSBhdCBydW50aW1lLAotCSAgIAlieSBzdXBwbHkgYSBDRk0gY29ubmVjdGlvbiB0byB0aGUgbGlicmFyeSB0aGF0IHNob3VsZCBzdWJzdGl0dXRlCi0JICAgCWZvciB0aGUgd2VhayBsaW5rZWQgb25lLgotCQotCVE6CURvZXMgdGhlIHN1YnN0aXR1dGVkIGxpYnJhcnkgaGF2ZSB0byBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgdGhlCi0JCXdlYWsgbGlua2VkIGxpYnJhcnkuCi0JQToJTm8uCi0JCi0JUToJV2hhdCdzIHRoaXMgdXNlZnVsIGZvcj8KLQlBOglUaGUgbW9zdCBvYnZpb3VzIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBpcyB1c2VmdWwgaXMgd2hlbgotCQl5b3UgcmVseSBvbiBzaGFyZWQgbGlicmFyaWVzIHRoYXQgdGhlIHVzZXIgbWlnaHQgZGVsZXRlCi0JCW9yIG1vdmUuICBUbyBjYW4gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkgKHBvc3NpYmx5IGV2ZW4KLQkJdXNpbmcgQ2F0U2VhcmNoKSwgY2FsbCBHZXREaXNrRnJhZ21lbnQgdG8gb3BlbiBhIGNvbm5lY3Rpb24KLQkJdG8gaXQsIGxhdGUgaW1wb3J0IGl0IHVzaW5nIHRoaXMgbGlicmFyeSwgYW5kIHRoZW4gdGhlCi0JCXJlc3Qgb2YgeW91ciBjb2RlIGNhbiBjb250aW51ZSB0byB1c2UgdGhlIHNoYXJlZCBsaWJyYXJ5Ci0JCWFzIGlmIG5vdGhpbmcgaGFkIGhhcHBlbmVkLiAgTm8gbW9yZSBkZWZpbmluZyB0aG91c2FuZHMKLQkJb2Ygc3R1YiByb3V0aW5lcyB3aGljaCBjYWxsIHRocm91Z2ggcm91dGluZSBwb2ludGVycy4KLQkJCi0JCVRoZXJlIGFyZSwgaG93ZXZlciwgbnVtZXJvdXMgbGVzcyBvYnZpb3VzIHVzZXMuICBZb3UgY2FuCi0JCXVzZSB0aGlzIGNvZGUgdG8gbWFrZSBhICdzZWxmIHJlcGFpcmluZycgYXBwbGljYXRpb24uICBJZgotCQl0aGUgdXNlciByZW1vdmVzIHlvdXIgc2hhcmVkIGxpYnJhcnkgZnJvbSB0aGUgRXh0ZW5zaW9ucwotCQlmb2xkZXIsIHRoZSBzdGFydHVwIGNvZGUgZm9yIHlvdXIgYXBwbGljYXRpb24gY2FuIG9mZmVyCi0JCXRvciByZS1pbnN0YWxsIGl0LiAgSWYgdGhlIHVzZXIgYWdyZWVzLCB5b3UgY2FuIHRoZW4KLQkJcmUtaW5zdGFsbCB5b3VyIHNoYXJlZCBsaWJyYXJ5LCBsYXRlIGltcG9ydCBpdCwgYW5kIHRoZW4KLQkJY29udGludWUgcnVubmluZyB5b3VyIGFwcGxpY2F0aW9uIGlmIG5vdGhpbmcgaGFwcGVuZWQuCi0JCQotCQlZb3UgY2FuIGV2ZW4gdXNlIHRoaXMgY29kZSB0byBmcmVlIHlvdXJzZWxmIGZyb20gdGhlCi0JCUV4dGVuc2lvbnMgZm9sZGVyIGVudGlyZWx5LiAgU2F5IHlvdSBoYXZlIGEgc3VpdGUgb2YKLQkJYXBwbGljYXRpb25zIHRoYXQgY3VycmVudGx5IGluc3RhbGxzIGEgZG96ZW4gc2hhcmVkIAotCQlsaWJyYXJpZXMgaW4gdGhlIEV4dGVuc2lvbnMgZm9sZGVyLiAgWW91IGNhbiBtb3ZlIHRob3NlCi0JCWxpYnJhcmllcyB0byBhbm90aGVyIGZvbGRlciBlbnRpcmVseSBhbmQgZWFjaCBhcHBsaWNhdGlvbidzCi0JCXN0YXJ0dXAgY29kZSBjYW4gdHJhY2sgZG93biB0aGUgbGlicmFyeSAodXNpbmcgYW4gYWxpYXMKLQkJaW4gdGhlIFByZWZlcmVuY2VzIGZpbGUpIGFuZCBsYXRlIGltcG9ydCBpdC4KLQkJCi0JCUFuIGV2ZW4gY29vbGVyIHVzZSBpcyB0byBwcm92aWRlIGVhc3kgYWJzdHJhY3Rpb24gbGF5ZXJzLgotCQlTYXkgeW91IGhhdmUgYSBuZXR3b3JrIGNvZGUgZm9yIGJvdGggdGhlIE1hY1RDUAotCQlBUEkgYW5kIHRoZSBPcGVuIFRyYW5zcG9ydCBBUEkuICBUeXBpY2FsbHksIHlvdSB3b3VsZCBiZQotCQlmb3JjZSB0byBkbyB0aGlzIGJ5IGhhdmluZyBhbiBhYnN0cmFjdGlvbiBsYXllciB3aGVyZSBldmVyeQotCQlyb3V0aW5lIGNvbnRhaW5zIGEgc3dpdGNoIGJldHdlZW4gTWFjVENQIGFuZCBPVC4gIFlvdXIKLQkJT3BlblNvY2tldCByb3V0aW5lIG1pZ2h0IGxvb2sgbGlrZToKKy8qICAgICAgRkFRCisgICAgLS0tCiAKLQkJCXN0YXRpYyBpbnQgT3BlblNvY2tldCh2b2lkKQotCQkJewotCQkJICAgIGlmIChnT1RBdmFpbGFibGUpIHsKLQkJCSAgICAgICAgcmV0dXJuIE9wZW5Tb2NrZXRPVCgpOwotCQkJICAgIH0gZWxzZSB7Ci0JCQkgICAgICAgIHJldHVybiBPcGVuU29ja2V0TWFjVENQKCk7Ci0JCQkgICAgfQotCQkJfQotCQkKLQkJV2l0aCB0aGlzIGNvZGUsIHlvdSBjYW4gYXZvaWQgdGhhdCBlbnRpcmVseS4gIFNpbXBseQotCQl3ZWFrIGxpbmsgdG8gYSBzaGFyZWQgbGlicmFyeSB0aGF0IHlvdSBrbm93IGlzIG5ldmVyCi0JCWdvaW5nIHRvIGJlIGltcGxlbWVudGVkICgiY3JlYTtNeVNvY2tldHNEdW1teSIpIGFuZCB0aGVuLCAKLQkJYXQgcnVudGltZSwgZGVjaWRlIHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMgTWFjVENQIG9yIE9UCi0JCWFuZCBsYXRlIGltcG9ydCB0aGUgcmVsZXZhbnQgcmVhbCBpbXBsZW1lbnRhdGlvbgotCQkoImNyZWE7TXlTb2NrZXRzTWFjVENQIiBvciAiY3JlYTtNeVNvY2tldHNPVCIpLgotCQlPbmUgYmVuZWZpdCBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgb25seSB0aGUgTWFjVENQIG9yCi0JCXRoZSBPVCBjb2RlIGlzIHJlc2lkZW50IGluIG1lbW9yeSBvbiBhbnkgZ2l2ZW4gc3lzdGVtLgorICAgIFE6ICAgICAgICAgIFdoYXQgZG9lcyB0aGlzIGxpYnJhcnkgZG8/CisgICAgQTogICAgICAgICAgSXQgYWxsb3dzIHlvdSB0byByZXNvbHZlIGEgd2VhayBsaW5rZWQgbGlicmFyeSBhdCBydW50aW1lLAorICAgICAgICBieSBzdXBwbHkgYSBDRk0gY29ubmVjdGlvbiB0byB0aGUgbGlicmFyeSB0aGF0IHNob3VsZCBzdWJzdGl0dXRlCisgICAgICAgIGZvciB0aGUgd2VhayBsaW5rZWQgb25lLgorCisgICAgUTogICAgICAgICAgRG9lcyB0aGUgc3Vic3RpdHV0ZWQgbGlicmFyeSBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUKKyAgICAgICAgd2VhayBsaW5rZWQgbGlicmFyeS4KKyAgICBBOiAgICAgICAgICBOby4KKworICAgIFE6ICAgICAgICAgIFdoYXQncyB0aGlzIHVzZWZ1bCBmb3I/CisgICAgQTogICAgICAgICAgVGhlIG1vc3Qgb2J2aW91cyBleGFtcGxlIG9mIHdoZXJlIHRoaXMgaXMgdXNlZnVsIGlzIHdoZW4KKyAgICAgICAgeW91IHJlbHkgb24gc2hhcmVkIGxpYnJhcmllcyB0aGF0IHRoZSB1c2VyIG1pZ2h0IGRlbGV0ZQorICAgICAgICBvciBtb3ZlLiAgVG8gY2FuIGZpbmQgdGhlIHNoYXJlZCBsaWJyYXJ5IChwb3NzaWJseSBldmVuCisgICAgICAgIHVzaW5nIENhdFNlYXJjaCksIGNhbGwgR2V0RGlza0ZyYWdtZW50IHRvIG9wZW4gYSBjb25uZWN0aW9uCisgICAgICAgIHRvIGl0LCBsYXRlIGltcG9ydCBpdCB1c2luZyB0aGlzIGxpYnJhcnksIGFuZCB0aGVuIHRoZQorICAgICAgICByZXN0IG9mIHlvdXIgY29kZSBjYW4gY29udGludWUgdG8gdXNlIHRoZSBzaGFyZWQgbGlicmFyeQorICAgICAgICBhcyBpZiBub3RoaW5nIGhhZCBoYXBwZW5lZC4gIE5vIG1vcmUgZGVmaW5pbmcgdGhvdXNhbmRzCisgICAgICAgIG9mIHN0dWIgcm91dGluZXMgd2hpY2ggY2FsbCB0aHJvdWdoIHJvdXRpbmUgcG9pbnRlcnMuCisKKyAgICAgICAgVGhlcmUgYXJlLCBob3dldmVyLCBudW1lcm91cyBsZXNzIG9idmlvdXMgdXNlcy4gIFlvdSBjYW4KKyAgICAgICAgdXNlIHRoaXMgY29kZSB0byBtYWtlIGEgJ3NlbGYgcmVwYWlyaW5nJyBhcHBsaWNhdGlvbi4gIElmCisgICAgICAgIHRoZSB1c2VyIHJlbW92ZXMgeW91ciBzaGFyZWQgbGlicmFyeSBmcm9tIHRoZSBFeHRlbnNpb25zCisgICAgICAgIGZvbGRlciwgdGhlIHN0YXJ0dXAgY29kZSBmb3IgeW91ciBhcHBsaWNhdGlvbiBjYW4gb2ZmZXIKKyAgICAgICAgdG9yIHJlLWluc3RhbGwgaXQuICBJZiB0aGUgdXNlciBhZ3JlZXMsIHlvdSBjYW4gdGhlbgorICAgICAgICByZS1pbnN0YWxsIHlvdXIgc2hhcmVkIGxpYnJhcnksIGxhdGUgaW1wb3J0IGl0LCBhbmQgdGhlbgorICAgICAgICBjb250aW51ZSBydW5uaW5nIHlvdXIgYXBwbGljYXRpb24gaWYgbm90aGluZyBoYXBwZW5lZC4KKworICAgICAgICBZb3UgY2FuIGV2ZW4gdXNlIHRoaXMgY29kZSB0byBmcmVlIHlvdXJzZWxmIGZyb20gdGhlCisgICAgICAgIEV4dGVuc2lvbnMgZm9sZGVyIGVudGlyZWx5LiAgU2F5IHlvdSBoYXZlIGEgc3VpdGUgb2YKKyAgICAgICAgYXBwbGljYXRpb25zIHRoYXQgY3VycmVudGx5IGluc3RhbGxzIGEgZG96ZW4gc2hhcmVkCisgICAgICAgIGxpYnJhcmllcyBpbiB0aGUgRXh0ZW5zaW9ucyBmb2xkZXIuICBZb3UgY2FuIG1vdmUgdGhvc2UKKyAgICAgICAgbGlicmFyaWVzIHRvIGFub3RoZXIgZm9sZGVyIGVudGlyZWx5IGFuZCBlYWNoIGFwcGxpY2F0aW9uJ3MKKyAgICAgICAgc3RhcnR1cCBjb2RlIGNhbiB0cmFjayBkb3duIHRoZSBsaWJyYXJ5ICh1c2luZyBhbiBhbGlhcworICAgICAgICBpbiB0aGUgUHJlZmVyZW5jZXMgZmlsZSkgYW5kIGxhdGUgaW1wb3J0IGl0LgorCisgICAgICAgIEFuIGV2ZW4gY29vbGVyIHVzZSBpcyB0byBwcm92aWRlIGVhc3kgYWJzdHJhY3Rpb24gbGF5ZXJzLgorICAgICAgICBTYXkgeW91IGhhdmUgYSBuZXR3b3JrIGNvZGUgZm9yIGJvdGggdGhlIE1hY1RDUAorICAgICAgICBBUEkgYW5kIHRoZSBPcGVuIFRyYW5zcG9ydCBBUEkuICBUeXBpY2FsbHksIHlvdSB3b3VsZCBiZQorICAgICAgICBmb3JjZSB0byBkbyB0aGlzIGJ5IGhhdmluZyBhbiBhYnN0cmFjdGlvbiBsYXllciB3aGVyZSBldmVyeQorICAgICAgICByb3V0aW5lIGNvbnRhaW5zIGEgc3dpdGNoIGJldHdlZW4gTWFjVENQIGFuZCBPVC4gIFlvdXIKKyAgICAgICAgT3BlblNvY2tldCByb3V0aW5lIG1pZ2h0IGxvb2sgbGlrZToKKworICAgICAgICAgICAgc3RhdGljIGludCBPcGVuU29ja2V0KHZvaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGdPVEF2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPcGVuU29ja2V0T1QoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBPcGVuU29ja2V0TWFjVENQKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIFdpdGggdGhpcyBjb2RlLCB5b3UgY2FuIGF2b2lkIHRoYXQgZW50aXJlbHkuICBTaW1wbHkKKyAgICAgICAgd2VhayBsaW5rIHRvIGEgc2hhcmVkIGxpYnJhcnkgdGhhdCB5b3Uga25vdyBpcyBuZXZlcgorICAgICAgICBnb2luZyB0byBiZSBpbXBsZW1lbnRlZCAoImNyZWE7TXlTb2NrZXRzRHVtbXkiKSBhbmQgdGhlbiwKKyAgICAgICAgYXQgcnVudGltZSwgZGVjaWRlIHdoZXRoZXIgdGhlIHN5c3RlbSBoYXMgTWFjVENQIG9yIE9UCisgICAgICAgIGFuZCBsYXRlIGltcG9ydCB0aGUgcmVsZXZhbnQgcmVhbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAoImNyZWE7TXlTb2NrZXRzTWFjVENQIiBvciAiY3JlYTtNeVNvY2tldHNPVCIpLgorICAgICAgICBPbmUgYmVuZWZpdCBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgb25seSB0aGUgTWFjVENQIG9yCisgICAgICAgIHRoZSBPVCBjb2RlIGlzIHJlc2lkZW50IGluIG1lbW9yeSBvbiBhbnkgZ2l2ZW4gc3lzdGVtLgogKi8KIAogdHlwZWRlZiBwYXNjYWwgT1NTdGF0dXMgKCpDRk1MYXRlSW1wb3J0TG9va3VwUHJvYykoQ29uc3RTdHIyNTVQYXJhbSBzeW1OYW1lLCBDRnJhZ1N5bWJvbENsYXNzIHN5bUNsYXNzLAotCQkJCQkJCQkJCQkJCXZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pOwotCS8vIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGRlZmluZXMgYSBjYWxsYmFjayBmb3IgQ0ZNTGF0ZUltcG9ydENvcmUuCi0JLy8gVGhlIHJvdXRpbmUgaXMgZXhwZWN0ZWQgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIG5hbWVkIAotCS8vIHN5bU5hbWUgYW5kIHJldHVybiBpdCBpbiAqc3ltQWRkci4gIFRoZSBzeW1ib2wgc2hvdWxkIGJlIG9mIGNsYXNzIAotCS8vIHN5bUNsYXNzLCBhbHRob3VnaCB0aGUgY2FsbGJhY2sgZGVjaWRlcyB3aGV0aGVyIGEgY2xhc3MgbWlzbWF0Y2ggaXMgCi0JLy8gYW4gZXJyb3IuICByZWZDb24gaXMgYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBvcmlnaW5hbGx5IAotCS8vIHBhc3NlZCBpbiB0byBDRk1MYXRlSW1wb3J0Q29yZS4KLQkvLwotCS8vIElmIHRoaXMgcm91dGluZSByZXR1cm5zIGFuIGVycm9yLCBhIHN5bWJvbCBhZGRyZXNzIG9mIDAgaXMgYXNzdW1lZC4gCi0JLy8gSWYgdGhlIHN5bWJvbCBpcyBtYXJrZWQgYXMgYSB3ZWFrIGltcG9ydCwgdGhlIENGTUxhdGVJbXBvcnRDb3JlIHdpbGwgCi0JLy8gY29udGludWUsIG90aGVyd2lzZSB0aGUgQ0ZNTGF0ZUltcG9ydENvcmUgcm91dGluZSB3aWxsIGZhaWwgd2l0aCB0aGUgCi0JLy8gZXJyb3IuCi0JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pOworICAgIC8vIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGRlZmluZXMgYSBjYWxsYmFjayBmb3IgQ0ZNTGF0ZUltcG9ydENvcmUuCisgICAgLy8gVGhlIHJvdXRpbmUgaXMgZXhwZWN0ZWQgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIG5hbWVkCisgICAgLy8gc3ltTmFtZSBhbmQgcmV0dXJuIGl0IGluICpzeW1BZGRyLiAgVGhlIHN5bWJvbCBzaG91bGQgYmUgb2YgY2xhc3MKKyAgICAvLyBzeW1DbGFzcywgYWx0aG91Z2ggdGhlIGNhbGxiYWNrIGRlY2lkZXMgd2hldGhlciBhIGNsYXNzIG1pc21hdGNoIGlzCisgICAgLy8gYW4gZXJyb3IuICByZWZDb24gaXMgYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBvcmlnaW5hbGx5CisgICAgLy8gcGFzc2VkIGluIHRvIENGTUxhdGVJbXBvcnRDb3JlLgorICAgIC8vCisgICAgLy8gSWYgdGhpcyByb3V0aW5lIHJldHVybnMgYW4gZXJyb3IsIGEgc3ltYm9sIGFkZHJlc3Mgb2YgMCBpcyBhc3N1bWVkLgorICAgIC8vIElmIHRoZSBzeW1ib2wgaXMgbWFya2VkIGFzIGEgd2VhayBpbXBvcnQsIHRoZSBDRk1MYXRlSW1wb3J0Q29yZSB3aWxsCisgICAgLy8gY29udGludWUsIG90aGVyd2lzZSB0aGUgQ0ZNTGF0ZUltcG9ydENvcmUgcm91dGluZSB3aWxsIGZhaWwgd2l0aCB0aGUKKyAgICAvLyBlcnJvci4KKwogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0Q29yZShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCi0JCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAotCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAotCQkJCQkJCQkJCUNGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKLQkJCQkJCQkJCQl2b2lkICpyZWZDb24pOwotCS8vIFRoaXMgcm91dGluZSB3aWxsIGxpbmsgeW91LCBhdCBydW50aW1lLCB0byBzb21lIGxpYnJhcnkgCi0JLy8gdGhhdCB5b3Ugd2VyZSB3ZWFrIGxpbmtlZCB0byBhbmQgd2Fzbid0IHByZXNlbnQgd2hlbiB5b3VyCi0JLy8gZnJhZ21lbnQgd2FzIHByZXBhcmVkLiAgQXMgd2VsbCBhcyB0aGUgb2J2aW91cyBmdW5jdGlvbmFsaXR5Ci0JLy8gb2YgYmVpbmcgYWJsZSB0byByZXNvbHZlIHdlYWsgbGlua3MgYWZ0ZXIgcHJlcGFyZSB0aW1lLAotCS8vIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgcHV0IHRvIGEgbnVtYmVyIG9mIGxlc3Mgb2J2aW91cyB1c2VzLAotCS8vIHNvbWUgb2Ygd2hpY2ggYXJlIGRpc2N1c3NlZCBhdCB0aGUgdG9wIG9mIHRoaXMgaGVhZGVyIGZpbGUuCi0JLy8KLQkvLyBUbyBjYWxsIHRoaXMgcm91dGluZSwgeW91IG5lZWQgYSBudW1iZXIgb2YgcGllY2VzIG9mIGluZm9ybWF0aW9uOgotCS8vCi0JLy8gMS4gZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklEOiAgVGhlIGxvY2F0aW9uIG9mIHlvdXIgb3duCi0JLy8gICAgY29kZSBmcmFnbWVudCBvbiBkaXNrIGFuZCB0aGUgQ0ZNIGNvbm5lY3Rpb24gSUQgdG8geW91ciBvd24KLQkvLyAgICBjb2RlIGZyYWdtZW50LiAgVHlwaWNhbGx5IHlvdSBnZXQgdGhpcyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgCi0JLy8gICAgZnJhZ21lbnQncyBDRk0gaW5pdCByb3V0aW5lLiAgWW91IG11c3QgZW5zdXJlIHRoYXQKLQkvLyAgICBmcmFnVG9GaXhMb2NhdG9yLT5maWxlU3BlYyBwb2ludHMgdG8gYW4gRlNTcGVjIG9mIHRoZQotCS8vICAgIGZpbGUgd2hpY2ggaG9sZHMgeW91ciBjb2RlIGZyYWdtZW50LgotCS8vCi0JLy8gICAgSU1QT1JUQU5UOgotCS8vICAgIFRoZSBmYWN0IHRoYXQgeW91IHBhc3MgaW4gYSBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgYXMgdGhlCi0JLy8gICAgZnJhZ1RvRml4TG9jYXRvciBpbXBsaWVzIHRoYXQgdGhlIGZyYWdtZW50IHRvIGJlIGZpeGVkIHVwIG11c3QKLQkvLyAgICBiZSBpbiB0aGUgZGF0YSBmb3JrIG9mIGEgZmlsZS4gIFRoZSBjb2RlIGNvdWxkIGJlIG1vZGlmaWVkCi0JLy8gICAgdG8gcmVtb3ZlIHRoaXMgcmVxdWlyZW1lbnQsIGJ1dCBvbiBkaXNrIGNvZGUgZnJhZ21lbnRzIGFyZSB0aGUgbW9zdAotCS8vICAgIGNvbW1vbiBjYXNlLgotCS8vCi0JLy8gICAgSU1QT1JUQU5UOgotCS8vICAgIFRoZSBmcmFnbWVudCB0byBmaXggbWF5IGhhdmUgYSBwYWNrZWQgZGF0YSBzZWN0aW9uLiAgUGFja2luZyB0aGUgCi0JLy8gICAgZGF0YSBzZWN0aW9uIHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIHlvdXIgZnJhZ21lbnQgb24gZGlzaywgYnV0IGl0IAotCS8vICAgIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgbWVtb3J5IG5lZWRlZCBieSB0aGlzIHJvdXRpbmUgCi0JLy8gICAgKGl0IGluY3JlYXNlcyBtZW1vcnkgdXNhZ2UgYnkgdGhlIHN1bSBvZiB0aGUgc2l6ZXMgb2YgdGhlIHBhY2tlZCAKLQkvLyAgICBhbmQgdW5wYWNrZWQgZGF0YSBzZWN0aW9uKS4gIFNlZSBiZWxvdyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byAKLQkvLyAgICBjcmVhdGUgYW4gdW5wYWNrZWQgZGF0YSBzZWN0aW9uLgotCS8vCi0JLy8gMi4gZnJhZ1RvRml4SW5pdFJvdXRpbmU6ICBBIHBvaW50ZXIgdG8geW91ciBvd24gY29kZSBmcmFnbWVudCdzCi0JLy8gICAgZnJhZ21lbnQgaW5pdGlhbGlzZXIgcm91dGluZS4gIFlvdSBuZWNlc3NhcmlseSBoYXZlIG9uZSBvZiB0aGVzZSAKLQkvLyAgICBiZWNhdXNlIHlvdSBuZWVkIGl0IHRvIGdldCB2YWx1ZXMgZm9yIHRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCAKLQkvLyAgICBmcmFnVG9GaXhDb25uSUQgcGFyYW1ldGVycy4gIEp1c3QgcGFzcyBpdHMgYWRkcmVzcyBpbiBhcyBhIHBhcmFtZXRlciAKLQkvLyAgICBhcyB3ZWxsLiAKLQkvLwotCS8vIDMuIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZTogIFRoZSBuYW1lIG9mIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IHdoaWNoCi0JLy8gICAgZmFpbGVkIHRvIGxpbmsuICBZb3UgbXVzdCBoYXZlIHdlYWsgbGlua2VkIHRvIHRoaXMgbGlicmFyeS4KLQkvLyAgICBJdCBpcyBveHltb3JpYyBmb3IgeW91IHRvIHBhc3MgYSBzdHJvbmcgbGlua2VkIGxpYnJhcnkgaGVyZSwKLQkvLyAgICBiZWNhdXNlIHlvdXIgY29kZSB3b3VsZCBub3QgaGF2ZSBwcmVwYXJlZCBpZiBhIHN0cm9uZyBsaW5rZWQKLQkvLyAgICBsaWJyYXJ5IGZhaWxlZCB0byBwcmVwYXJlLCBhbmQgc28geW91IGNvdWxkbid0IHN1cHBseSBhIHZhbGlkCi0JLy8vICAgZnJhZ1RvRml4LgotCS8vCi0JLy8gNC4gbG9va3VwLCByZWZDb246ICBBIHBvaW50ZXIgdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHRoZSAKLQkvLwkgIHJvdXRpbmUgY2FsbHMgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiBhIHN5bWJvbCwgYW5kIGEgcmVmQ29uIAotCS8vICAgIGZvciB0aGF0IGNhbGxiYWNrIHJvdXRpbmUuCi0JLy8KLQkvLyBOb3RlOgotCS8vIFRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCBmcmFnVG9GaXhJbml0Um91dGluZSBwYXJhbWV0ZXJzCi0JLy8gYXJlIGFydGlmYWN0cyBvZiB0aGUgd2F5IGluIHdoaWNoIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZC4KLQkvLyBJbiBhbiBpZGVhbCB3b3JsZCwgd2hlcmUgQ0ZNIGV4cG9ydGVkIGRlY2VudCBpbnRyb3NwZWN0aW9uIEFQSXMKLQkvLyB0byB0aGlyZCBwYXJ0eSBkZXZlbG9wZXJzLCB0aGVzZSBwYXJhbWV0ZXJzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCi0JLy8gSWYgeW91J3JlIHVzaW5nIHRoaXMgY29kZSBpbnNpZGUgQXBwbGUsIHlvdSBwcm9iYWJseSBzaG91bGQgaW52ZXN0aWdhdGUKLQkvLyB1c2luZyB0aGUgQ0ZNIHByaXZhdGUgQVBJcyBmb3IgZ2V0dGluZyBhdCB0aGUgaW5mb3JtYXRpb24gdGhlc2UKLQkvLyBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQgZm9yLiAgU2VlIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uCi0JLy8gZm9yIG1vcmUgZGV0YWlscy4KLQkvLwotCS8vIE5vdGU6Ci0JLy8gVGhlIGV4dHJhIG1lbW9yeSB0YWtlbiB3aGVuIHlvdSB1c2UgYSBwYWNrZWQgZGF0YSBzZWN0aW9uIGlzIGFsc28gYW4gCi0JLy8gYXJ0aWZhY3Qgb2YgbXkgd29ya2Fyb3VuZCBmb3IgdGhlIGxhY2sgb2YgQ0ZNIGludHJvc3BlY3Rpb24gQVBJcy4gIEluIAotCS8vIG15IG9waW5pb24gaXQncyBiZXR0ZXIgdG8gdXNlIGFuIHVucGFja2VkIGRhdGEgc2VjdGlvbiBhbmQgY29uc3VtZSBtb3JlIAotCS8vIHNwYWNlIG9uIGRpc2sgd2hpbGUgc2F2aW5nIG1lbW9yeS4gIEluIENvZGVXYXJyaW9yIHlvdSBjYW4gc3dpdGNoIHRvIGFuIAotCS8vIHVucGFja2VkIGRhdGEgc2VjdGlvbiBieSBjaGVja2luZyB0aGUgIkV4cGFuZCBVbmluaXRpYWxpemVkIERhdGEiIAotCS8vIGNoZWNrYm94IGluIHRoZSAiUFBDIFBFRiIgc2V0dGluZ3MgcGFuZWwuICBJbiBNUFcsIHNwZWNpZmllZCB0aGUKLQkvLyAiLXBhY2tkYXRhIG9mZiIgb3B0aW9uIHRvIFBQQ0xpbmsuCi0JLy8KLQkvLyBXaGVuIHRoZSByb3V0aW5lIHJldHVybnMsIGFueSBzeW1ib2xzIHRoYXQgeW91IGltcG9ydGVkIGZyb20gdGhlCi0JLy8gbGlicmFyeSBuYW1lZCB3ZWFrTGlua2VkTGlicmFyeU5hbWUgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgYWRkcmVzcwotCS8vIG9mIHRoZSBzeW1ib2wgcHJvdmlkZWQgYnkgdGhlICJsb29rdXAiIGNhbGxiYWNrIHJvdXRpbmUuCi0JLy8KLQkvLyBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gdW5yZXNvbHZlZCBpbXBvcnQgdG8gcmVtYWluIHVucmVzb2x2ZWQgYWZ0ZXIKLQkvLyB0aGlzIHJvdXRpbmUgcmV0dXJucy4gIElmIHRoZSBzeW1ib2wgaW1wb3J0IGlzIG1hcmtlZCBhcyB3ZWFrIChhcwotCS8vIG9wcG9zZWQgdG8gdGhlIGxpYnJhcnksIHdoaWNoICptdXN0KiBiZSBtYXJrZWQgYXMgd2VhaykgYW5kIHRoZSBzeW1ib2wKLQkvLyBpcyBub3QgZm91bmQgYnkgdGhlICJsb29rdXAiIGNhbGxiYWNrLCB0aGUgcm91dGluZSB3aWxsIHNpbXBsZSBza2lwIAotCS8vIHRoYXQgc3ltYm9sLiAgSWYgdGhlIHN5bWJvbCBpc24ndCBtYXJrZWQgYXMgd2VhaywgdGhlIHJvdXRpbmUgd2lsbCBmYWlsIAotCS8vIGluIHRoYXQgY2FzZS4KLQkvLwotCS8vIE1vc3Qgb2YgdGhlIHBvc3NpYmxlIGVycm9yIHJlc3VsdHMgYXJlIGNvLW9wdGVkIENGTSBlcnJvcnMuICBUaGVzZQotCS8vIGluY2x1ZGU6Ci0JLy8KLQkvLyBjZnJhZ0ZyYWdtZW50Rm9ybWF0RXJyICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGlzIGlzIGFuIHVua25vd24gZm9ybWF0LgotCS8vIGNmcmFnTm9TZWN0aW9uRXJyICAgICAgIC0tIENvdWxkIG5vdCBmaW5kIHRoZSBsb2FkZXIgc2VjdGlvbiBpbiB0aGUgZnJhZ21lbnQgdG8gZml4LgotCS8vIGNmcmFnTm9MaWJyYXJ5RXJyICAgICAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgbm90IHdlYWsgbGlua2VkIHRvIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4KLQkvLyBjZnJhZ0ZyYWdtZW50VXNhZ2VFcnIgICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGRvZXNuJ3QgaGF2ZSBhIGRhdGEgc2VjdGlvbi4KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGlzIHN0cm9uZyBsaW5rZWQgdG8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgotCS8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFRoZSBmcmFnbWVudCBkb2Vzbid0IGhhdmUgYW4gaW5pdCByb3V0aW5lLgotCS8vIGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyIC0tIEVuY291bnRlcmVkIGFuIHVuZGVmaW5lZCByZWxvY2F0aW9uIG9wY29kZS4KLQkvLyB1bmltcEVyciAgICAgICAgICAgICAgICAtLSBFbmNvdW50ZXJlZCBhbiB1bmltcGxlbWVudCByZWxvY2F0aW9uIG9wY29kZS4gIFRoZQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gZW5naW5lIG9ubHkgaW1wbGVtZW50cyBhIHN1YnNldCBvZiB0aGUgQ0ZNCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBvcGNvZGVzLCB0aGUgc3Vic2V0IG1vc3QgY29tbW9ubHkgdXNlZCBieQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QVyBhbmQgQ29kZVdhcnJpb3IgUEVGIGNvbnRhaW5lcnMuICBJZiB5b3UgZW5jb3VudGVyCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlcnJvciwgeW91J2xsIHByb2JhYmx5IGhhdmUgdG8gYWRkIHRoZSB3ZWlyZAotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gb3Bjb2RlIHRvIHRoZSBlbmdpbmUsIHdoaWNoIHNob3VsZG4ndCBiZQotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHRvbyBoYXJkLgotCS8vIG1lbUZ1bGxFcnIJCQkgICAtLSBJdCdzIGxpa2VseSB0aGF0IHRoaXMgZXJyb3IgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBtZW1vcnkgCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIHVucGFjayB5b3VyIGRhdGEgc2VjdGlvbi4gIEVpdGhlciBtYWtlIHlvdXIgCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBzZWN0aW9uIHNtYWxsZXIsIG9yIHVucGFjayBpdCAoc2VlIGFib3ZlKS4KLQkvLyBlcnJvcnMgcmV0dXJuZWQgYnkgRmluZFN5bWJvbAotCS8vIGVycm9ycyByZXR1cm5lZCBieSBNZW1vcnkgTWFuYWdlcgotCS8vCi0JLy8gVGhlIHJvdXRpbmUgbmVlZHMgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBsb2FkZXIgc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQKLQkvLyB0byBmaXggaW4gbWVtb3J5LiAgSXQgYWxsb2NhdGVzIHRoYXQgbWVtb3J5IHVzaW5nIE5ld1B0ciBhbmQgZGlzcHNvc2VzIG9mIAotCS8vIGl0IGJlZm9yZSBpdCByZXR1cm5zLiAgWW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRvciwgd2hpY2gKLQkvLyBpcyB2ZXJ5IHNpbXBsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVmQ29uKTsKKyAgICAvLyBUaGlzIHJvdXRpbmUgd2lsbCBsaW5rIHlvdSwgYXQgcnVudGltZSwgdG8gc29tZSBsaWJyYXJ5CisgICAgLy8gdGhhdCB5b3Ugd2VyZSB3ZWFrIGxpbmtlZCB0byBhbmQgd2Fzbid0IHByZXNlbnQgd2hlbiB5b3VyCisgICAgLy8gZnJhZ21lbnQgd2FzIHByZXBhcmVkLiAgQXMgd2VsbCBhcyB0aGUgb2J2aW91cyBmdW5jdGlvbmFsaXR5CisgICAgLy8gb2YgYmVpbmcgYWJsZSB0byByZXNvbHZlIHdlYWsgbGlua3MgYWZ0ZXIgcHJlcGFyZSB0aW1lLAorICAgIC8vIHRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgcHV0IHRvIGEgbnVtYmVyIG9mIGxlc3Mgb2J2aW91cyB1c2VzLAorICAgIC8vIHNvbWUgb2Ygd2hpY2ggYXJlIGRpc2N1c3NlZCBhdCB0aGUgdG9wIG9mIHRoaXMgaGVhZGVyIGZpbGUuCisgICAgLy8KKyAgICAvLyBUbyBjYWxsIHRoaXMgcm91dGluZSwgeW91IG5lZWQgYSBudW1iZXIgb2YgcGllY2VzIG9mIGluZm9ybWF0aW9uOgorICAgIC8vCisgICAgLy8gMS4gZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklEOiAgVGhlIGxvY2F0aW9uIG9mIHlvdXIgb3duCisgICAgLy8gICAgY29kZSBmcmFnbWVudCBvbiBkaXNrIGFuZCB0aGUgQ0ZNIGNvbm5lY3Rpb24gSUQgdG8geW91ciBvd24KKyAgICAvLyAgICBjb2RlIGZyYWdtZW50LiAgVHlwaWNhbGx5IHlvdSBnZXQgdGhpcyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIKKyAgICAvLyAgICBmcmFnbWVudCdzIENGTSBpbml0IHJvdXRpbmUuICBZb3UgbXVzdCBlbnN1cmUgdGhhdAorICAgIC8vICAgIGZyYWdUb0ZpeExvY2F0b3ItPmZpbGVTcGVjIHBvaW50cyB0byBhbiBGU1NwZWMgb2YgdGhlCisgICAgLy8gICAgZmlsZSB3aGljaCBob2xkcyB5b3VyIGNvZGUgZnJhZ21lbnQuCisgICAgLy8KKyAgICAvLyAgICBJTVBPUlRBTlQ6CisgICAgLy8gICAgVGhlIGZhY3QgdGhhdCB5b3UgcGFzcyBpbiBhIENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciBhcyB0aGUKKyAgICAvLyAgICBmcmFnVG9GaXhMb2NhdG9yIGltcGxpZXMgdGhhdCB0aGUgZnJhZ21lbnQgdG8gYmUgZml4ZWQgdXAgbXVzdAorICAgIC8vICAgIGJlIGluIHRoZSBkYXRhIGZvcmsgb2YgYSBmaWxlLiAgVGhlIGNvZGUgY291bGQgYmUgbW9kaWZpZWQKKyAgICAvLyAgICB0byByZW1vdmUgdGhpcyByZXF1aXJlbWVudCwgYnV0IG9uIGRpc2sgY29kZSBmcmFnbWVudHMgYXJlIHRoZSBtb3N0CisgICAgLy8gICAgY29tbW9uIGNhc2UuCisgICAgLy8KKyAgICAvLyAgICBJTVBPUlRBTlQ6CisgICAgLy8gICAgVGhlIGZyYWdtZW50IHRvIGZpeCBtYXkgaGF2ZSBhIHBhY2tlZCBkYXRhIHNlY3Rpb24uICBQYWNraW5nIHRoZQorICAgIC8vICAgIGRhdGEgc2VjdGlvbiB3aWxsIHJlZHVjZSB0aGUgc2l6ZSBvZiB5b3VyIGZyYWdtZW50IG9uIGRpc2ssIGJ1dCBpdAorICAgIC8vICAgIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgbWVtb3J5IG5lZWRlZCBieSB0aGlzIHJvdXRpbmUKKyAgICAvLyAgICAoaXQgaW5jcmVhc2VzIG1lbW9yeSB1c2FnZSBieSB0aGUgc3VtIG9mIHRoZSBzaXplcyBvZiB0aGUgcGFja2VkCisgICAgLy8gICAgYW5kIHVucGFja2VkIGRhdGEgc2VjdGlvbikuICBTZWUgYmVsb3cgZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8KKyAgICAvLyAgICBjcmVhdGUgYW4gdW5wYWNrZWQgZGF0YSBzZWN0aW9uLgorICAgIC8vCisgICAgLy8gMi4gZnJhZ1RvRml4SW5pdFJvdXRpbmU6ICBBIHBvaW50ZXIgdG8geW91ciBvd24gY29kZSBmcmFnbWVudCdzCisgICAgLy8gICAgZnJhZ21lbnQgaW5pdGlhbGlzZXIgcm91dGluZS4gIFlvdSBuZWNlc3NhcmlseSBoYXZlIG9uZSBvZiB0aGVzZQorICAgIC8vICAgIGJlY2F1c2UgeW91IG5lZWQgaXQgdG8gZ2V0IHZhbHVlcyBmb3IgdGhlIGZyYWdUb0ZpeExvY2F0b3IgYW5kCisgICAgLy8gICAgZnJhZ1RvRml4Q29ubklEIHBhcmFtZXRlcnMuICBKdXN0IHBhc3MgaXRzIGFkZHJlc3MgaW4gYXMgYSBwYXJhbWV0ZXIKKyAgICAvLyAgICBhcyB3ZWxsLgorICAgIC8vCisgICAgLy8gMy4gd2Vha0xpbmtlZExpYnJhcnlOYW1lOiAgVGhlIG5hbWUgb2YgdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkgd2hpY2gKKyAgICAvLyAgICBmYWlsZWQgdG8gbGluay4gIFlvdSBtdXN0IGhhdmUgd2VhayBsaW5rZWQgdG8gdGhpcyBsaWJyYXJ5LgorICAgIC8vICAgIEl0IGlzIG94eW1vcmljIGZvciB5b3UgdG8gcGFzcyBhIHN0cm9uZyBsaW5rZWQgbGlicmFyeSBoZXJlLAorICAgIC8vICAgIGJlY2F1c2UgeW91ciBjb2RlIHdvdWxkIG5vdCBoYXZlIHByZXBhcmVkIGlmIGEgc3Ryb25nIGxpbmtlZAorICAgIC8vICAgIGxpYnJhcnkgZmFpbGVkIHRvIHByZXBhcmUsIGFuZCBzbyB5b3UgY291bGRuJ3Qgc3VwcGx5IGEgdmFsaWQKKyAgICAvLy8gICBmcmFnVG9GaXguCisgICAgLy8KKyAgICAvLyA0LiBsb29rdXAsIHJlZkNvbjogIEEgcG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdGhlCisgICAgLy8gICAgICAgICAgICByb3V0aW5lIGNhbGxzIHRvIGxvb2sgdXAgdGhlIGFkZHJlc3Mgb2YgYSBzeW1ib2wsIGFuZCBhIHJlZkNvbgorICAgIC8vICAgIGZvciB0aGF0IGNhbGxiYWNrIHJvdXRpbmUuCisgICAgLy8KKyAgICAvLyBOb3RlOgorICAgIC8vIFRoZSBmcmFnVG9GaXhMb2NhdG9yIGFuZCBmcmFnVG9GaXhJbml0Um91dGluZSBwYXJhbWV0ZXJzCisgICAgLy8gYXJlIGFydGlmYWN0cyBvZiB0aGUgd2F5IGluIHdoaWNoIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBpbXBsZW1lbnRlZC4KKyAgICAvLyBJbiBhbiBpZGVhbCB3b3JsZCwgd2hlcmUgQ0ZNIGV4cG9ydGVkIGRlY2VudCBpbnRyb3NwZWN0aW9uIEFQSXMKKyAgICAvLyB0byB0aGlyZCBwYXJ0eSBkZXZlbG9wZXJzLCB0aGVzZSBwYXJhbWV0ZXJzIHdvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCisgICAgLy8gSWYgeW91J3JlIHVzaW5nIHRoaXMgY29kZSBpbnNpZGUgQXBwbGUsIHlvdSBwcm9iYWJseSBzaG91bGQgaW52ZXN0aWdhdGUKKyAgICAvLyB1c2luZyB0aGUgQ0ZNIHByaXZhdGUgQVBJcyBmb3IgZ2V0dGluZyBhdCB0aGUgaW5mb3JtYXRpb24gdGhlc2UKKyAgICAvLyBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQgZm9yLiAgU2VlIHRoZSBjb21tZW50cyBpbnNpZGUgdGhlIGltcGxlbWVudGF0aW9uCisgICAgLy8gZm9yIG1vcmUgZGV0YWlscy4KKyAgICAvLworICAgIC8vIE5vdGU6CisgICAgLy8gVGhlIGV4dHJhIG1lbW9yeSB0YWtlbiB3aGVuIHlvdSB1c2UgYSBwYWNrZWQgZGF0YSBzZWN0aW9uIGlzIGFsc28gYW4KKyAgICAvLyBhcnRpZmFjdCBvZiBteSB3b3JrYXJvdW5kIGZvciB0aGUgbGFjayBvZiBDRk0gaW50cm9zcGVjdGlvbiBBUElzLiAgSW4KKyAgICAvLyBteSBvcGluaW9uIGl0J3MgYmV0dGVyIHRvIHVzZSBhbiB1bnBhY2tlZCBkYXRhIHNlY3Rpb24gYW5kIGNvbnN1bWUgbW9yZQorICAgIC8vIHNwYWNlIG9uIGRpc2sgd2hpbGUgc2F2aW5nIG1lbW9yeS4gIEluIENvZGVXYXJyaW9yIHlvdSBjYW4gc3dpdGNoIHRvIGFuCisgICAgLy8gdW5wYWNrZWQgZGF0YSBzZWN0aW9uIGJ5IGNoZWNraW5nIHRoZSAiRXhwYW5kIFVuaW5pdGlhbGl6ZWQgRGF0YSIKKyAgICAvLyBjaGVja2JveCBpbiB0aGUgIlBQQyBQRUYiIHNldHRpbmdzIHBhbmVsLiAgSW4gTVBXLCBzcGVjaWZpZWQgdGhlCisgICAgLy8gIi1wYWNrZGF0YSBvZmYiIG9wdGlvbiB0byBQUENMaW5rLgorICAgIC8vCisgICAgLy8gV2hlbiB0aGUgcm91dGluZSByZXR1cm5zLCBhbnkgc3ltYm9scyB0aGF0IHlvdSBpbXBvcnRlZCBmcm9tIHRoZQorICAgIC8vIGxpYnJhcnkgbmFtZWQgd2Vha0xpbmtlZExpYnJhcnlOYW1lIHdpbGwgYmUgcmVzb2x2ZWQgdG8gdGhlIGFkZHJlc3MKKyAgICAvLyBvZiB0aGUgc3ltYm9sIHByb3ZpZGVkIGJ5IHRoZSAibG9va3VwIiBjYWxsYmFjayByb3V0aW5lLgorICAgIC8vCisgICAgLy8gSXQgaXMgcG9zc2libGUgZm9yIGFuIHVucmVzb2x2ZWQgaW1wb3J0IHRvIHJlbWFpbiB1bnJlc29sdmVkIGFmdGVyCisgICAgLy8gdGhpcyByb3V0aW5lIHJldHVybnMuICBJZiB0aGUgc3ltYm9sIGltcG9ydCBpcyBtYXJrZWQgYXMgd2VhayAoYXMKKyAgICAvLyBvcHBvc2VkIHRvIHRoZSBsaWJyYXJ5LCB3aGljaCAqbXVzdCogYmUgbWFya2VkIGFzIHdlYWspIGFuZCB0aGUgc3ltYm9sCisgICAgLy8gaXMgbm90IGZvdW5kIGJ5IHRoZSAibG9va3VwIiBjYWxsYmFjaywgdGhlIHJvdXRpbmUgd2lsbCBzaW1wbGUgc2tpcAorICAgIC8vIHRoYXQgc3ltYm9sLiAgSWYgdGhlIHN5bWJvbCBpc24ndCBtYXJrZWQgYXMgd2VhaywgdGhlIHJvdXRpbmUgd2lsbCBmYWlsCisgICAgLy8gaW4gdGhhdCBjYXNlLgorICAgIC8vCisgICAgLy8gTW9zdCBvZiB0aGUgcG9zc2libGUgZXJyb3IgcmVzdWx0cyBhcmUgY28tb3B0ZWQgQ0ZNIGVycm9ycy4gIFRoZXNlCisgICAgLy8gaW5jbHVkZToKKyAgICAvLworICAgIC8vIGNmcmFnRnJhZ21lbnRGb3JtYXRFcnIgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgaXMgYW4gdW5rbm93biBmb3JtYXQuCisgICAgLy8gY2ZyYWdOb1NlY3Rpb25FcnIgICAgICAgLS0gQ291bGQgbm90IGZpbmQgdGhlIGxvYWRlciBzZWN0aW9uIGluIHRoZSBmcmFnbWVudCB0byBmaXguCisgICAgLy8gY2ZyYWdOb0xpYnJhcnlFcnIgICAgICAgLS0gVGhlIGZyYWdtZW50IHRvIGZpeCBpcyBub3Qgd2VhayBsaW5rZWQgdG8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgorICAgIC8vIGNmcmFnRnJhZ21lbnRVc2FnZUVyciAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggZG9lc24ndCBoYXZlIGEgZGF0YSBzZWN0aW9uLgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgc3Ryb25nIGxpbmtlZCB0byB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgLS0gVGhlIGZyYWdtZW50IGRvZXNuJ3QgaGF2ZSBhbiBpbml0IHJvdXRpbmUuCisgICAgLy8gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnIgLS0gRW5jb3VudGVyZWQgYW4gdW5kZWZpbmVkIHJlbG9jYXRpb24gb3Bjb2RlLgorICAgIC8vIHVuaW1wRXJyICAgICAgICAgICAgICAgIC0tIEVuY291bnRlcmVkIGFuIHVuaW1wbGVtZW50IHJlbG9jYXRpb24gb3Bjb2RlLiAgVGhlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBlbmdpbmUgb25seSBpbXBsZW1lbnRzIGEgc3Vic2V0IG9mIHRoZSBDRk0KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIG9wY29kZXMsIHRoZSBzdWJzZXQgbW9zdCBjb21tb25seSB1c2VkIGJ5CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBXIGFuZCBDb2RlV2FycmlvciBQRUYgY29udGFpbmVycy4gIElmIHlvdSBlbmNvdW50ZXIKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVycm9yLCB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byBhZGQgdGhlIHdlaXJkCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBvcGNvZGUgdG8gdGhlIGVuZ2luZSwgd2hpY2ggc2hvdWxkbid0IGJlCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdG9vIGhhcmQuCisgICAgLy8gbWVtRnVsbEVyciAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gSXQncyBsaWtlbHkgdGhhdCB0aGlzIGVycm9yIGlzIHRyaWdnZXJlZCBieSB0aGUgbWVtb3J5CisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIHVucGFjayB5b3VyIGRhdGEgc2VjdGlvbi4gIEVpdGhlciBtYWtlIHlvdXIKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHNlY3Rpb24gc21hbGxlciwgb3IgdW5wYWNrIGl0IChzZWUgYWJvdmUpLgorICAgIC8vIGVycm9ycyByZXR1cm5lZCBieSBGaW5kU3ltYm9sCisgICAgLy8gZXJyb3JzIHJldHVybmVkIGJ5IE1lbW9yeSBNYW5hZ2VyCisgICAgLy8KKyAgICAvLyBUaGUgcm91dGluZSBuZWVkcyBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIGxvYWRlciBzZWN0aW9uIG9mIHRoZSBmcmFnbWVudAorICAgIC8vIHRvIGZpeCBpbiBtZW1vcnkuICBJdCBhbGxvY2F0ZXMgdGhhdCBtZW1vcnkgdXNpbmcgTmV3UHRyIGFuZCBkaXNwc29zZXMgb2YKKyAgICAvLyBpdCBiZWZvcmUgaXQgcmV0dXJucy4gIFlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIG1lbW9yeSBhbGxvY2F0b3IsIHdoaWNoCisgICAgLy8gaXMgdmVyeSBzaW1wbGUuCiAKIGV4dGVybiBwYXNjYWwgT1NTdGF0dXMgQ0ZNTGF0ZUltcG9ydExpYnJhcnkoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKLQkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCk7Ci0JLy8gQSB3cmFwcGVyIGFyb3VuZCBDRk1MYXRlSW1wb3J0Q29yZSB0aGF0IGxvb2tzIHVwIHN5bWJvbHMgYnkgY2FsbGluZyAKLQkvLyBGaW5kU3ltYm9sIG9uIGEgY29ubmVjdGlvbiB0byBhIENGTSBsaWJyYXJ5IChjb25uSURUb0ltcG9ydCkuCi0JLy8gWW91IGNhbiBnZXQgdGhpcyBjb25uZWN0aW9uIElEIHRocm91Z2ggYW55IHN0YW5kYXJkIENGTSBBUEksIGZvciBleGFtcGxlCi0JLy8gR2V0U2hhcmVkTGlicmFyeSwgR2V0RGlza0ZyYWdtZW50LCBvciBHZXRNZW1GcmFnbWVudC4KLQkvLwotCS8vIElNUE9SVEFOVDoKLQkvLyBUaGUgZnJhZ21lbnQgbmFtZSBmb3IgY29ubklEVG9JbXBvcnQgKmRvZXMgbm90KiBoYXZlIHRvIG1hdGNoCi0JLy8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLiAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBwb3dlciBvZiB0aGlzIGxpYnJhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBjb25uSURUb0ltcG9ydCk7CisgICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBDRk1MYXRlSW1wb3J0Q29yZSB0aGF0IGxvb2tzIHVwIHN5bWJvbHMgYnkgY2FsbGluZworICAgIC8vIEZpbmRTeW1ib2wgb24gYSBjb25uZWN0aW9uIHRvIGEgQ0ZNIGxpYnJhcnkgKGNvbm5JRFRvSW1wb3J0KS4KKyAgICAvLyBZb3UgY2FuIGdldCB0aGlzIGNvbm5lY3Rpb24gSUQgdGhyb3VnaCBhbnkgc3RhbmRhcmQgQ0ZNIEFQSSwgZm9yIGV4YW1wbGUKKyAgICAvLyBHZXRTaGFyZWRMaWJyYXJ5LCBHZXREaXNrRnJhZ21lbnQsIG9yIEdldE1lbUZyYWdtZW50LgorICAgIC8vCisgICAgLy8gSU1QT1JUQU5UOgorICAgIC8vIFRoZSBmcmFnbWVudCBuYW1lIGZvciBjb25uSURUb0ltcG9ydCAqZG9lcyBub3QqIGhhdmUgdG8gbWF0Y2gKKyAgICAvLyB3ZWFrTGlua2VkTGlicmFyeU5hbWUuICBUaGlzIGlzIHBhcnQgb2YgdGhlIHBvd2VyIG9mIHRoaXMgbGlicmFyeS4KIAogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0QnVuZGxlKGNvbnN0IENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciAqZnJhZ1RvRml4TG9jYXRvciwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCi0JCQkJCQkJCQkJQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCi0JCQkJCQkJCQkJQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCi0JCQkJCQkJCQkJQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQpOwotCS8vIEEgd3JhcHBlciBhcm91bmQgQ0ZNTGF0ZUltcG9ydENvcmUgdGhhdCBsb29rcyB1cCBzeW1ib2xzIGJ5IGNhbGxpbmcgCi0JLy8gQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lIG9uIGEgcmVmZXJlbmNlIHRvIGEgQ29yZSBGb3VuZGF0aW9uIAotCS8vIGJ1bmRsZSAoYnVuZGxlVG9JbXBvcnQpLiAgWW91IGNhbiBnZXQgdGhpcyByZWZlcmVuY2UgdGhyb3VnaCBhbnkgCi0JLy8gQ29yZSBGb3VuZGF0aW9uIGJ1bmRsZSBBUEksIGZvciBleGFtcGxlIENGQnVuZGxlQ3JlYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQpOworICAgIC8vIEEgd3JhcHBlciBhcm91bmQgQ0ZNTGF0ZUltcG9ydENvcmUgdGhhdCBsb29rcyB1cCBzeW1ib2xzIGJ5IGNhbGxpbmcKKyAgICAvLyBDRkJ1bmRsZUdldEZ1bmN0aW9uUG9pbnRlckZvck5hbWUgb24gYSByZWZlcmVuY2UgdG8gYSBDb3JlIEZvdW5kYXRpb24KKyAgICAvLyBidW5kbGUgKGJ1bmRsZVRvSW1wb3J0KS4gIFlvdSBjYW4gZ2V0IHRoaXMgcmVmZXJlbmNlIHRocm91Z2ggYW55CisgICAgLy8gQ29yZSBGb3VuZGF0aW9uIGJ1bmRsZSBBUEksIGZvciBleGFtcGxlIENGQnVuZGxlQ3JlYXRlLgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL19DR21vZHVsZS5jIGIvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMKaW5kZXggZTM2ZmNlOS4uNzE2OTEwMSAxMDA3NTUKLS0tIGEvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yNiw2NyArMjYsNjcgQEAKIFB5T2JqZWN0ICpDR1BvaW50X05ldyhDR1BvaW50ICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT55KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+eCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT55KTsKIH0KIAogaW50CiBDR1BvaW50X0NvbnZlcnQoUHlPYmplY3QgKnYsIENHUG9pbnQgKnBfaXRzZWxmKQogewotICAgICAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+eSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT54LAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnkpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIFB5T2JqZWN0ICpDR1JlY3RfTmV3KENHUmVjdCAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+b3JpZ2luLnksCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUuaGVpZ2h0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueSwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5zaXplLndpZHRoLAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUuaGVpZ2h0KTsKIH0KIAogaW50CiBDR1JlY3RfQ29udmVydChQeU9iamVjdCAqdiwgQ0dSZWN0ICpwX2l0c2VsZikKIHsKLSAgICAgICAgaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmZmYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+b3JpZ2luLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi55LAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5zaXplLndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5zaXplLmhlaWdodCkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZikiLAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi54LAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi55LAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnNpemUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+c2l6ZS5oZWlnaHQpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIFB5T2JqZWN0ICpDR0FmZmluZVRyYW5zZm9ybV9OZXcoQ0dBZmZpbmVUcmFuc2Zvcm0gKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmZmZmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5hLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5iLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5jLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5kLAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+dHkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+YSwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5iLAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmMsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+ZCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eCwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eSk7CiB9CiAKIGludAogQ0dBZmZpbmVUcmFuc2Zvcm1fQ29udmVydChQeU9iamVjdCAqdiwgQ0dBZmZpbmVUcmFuc2Zvcm0gKnBfaXRzZWxmKQogewotICAgICAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZmZmKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnR4LAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT50eSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+YSwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5iLAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmMsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+ZCwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT50eCwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT50eSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR19FcnJvcjsKQEAgLTk4LDEwOTAgKzk4LDEwOTAgQEAKICNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNHQ29udGV4dFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDR0NvbnRleHRSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENHQ29udGV4dFJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNHQ29udGV4dFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENHQ29udGV4dFJlZiBvYl9pdHNlbGY7CiB9IENHQ29udGV4dFJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9OZXcoQ0dDb250ZXh0UmVmIGl0c2VsZikKIHsKLQlDR0NvbnRleHRSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKENHQ29udGV4dFJlZk9iamVjdCwgJkNHQ29udGV4dFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0dDb250ZXh0UmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDR0NvbnRleHRSZWZPYmplY3QsICZDR0NvbnRleHRSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0dDb250ZXh0UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENHQ29udGV4dFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFDR0NvbnRleHRSZWZPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0dDb250ZXh0UmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENHQ29udGV4dFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDR0NvbnRleHRSZWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0dDb250ZXh0UmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENHQ29udGV4dFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENHQ29udGV4dFJlZk9ial9kZWFsbG9jKENHQ29udGV4dFJlZk9iamVjdCAqc2VsZikKIHsKLQlDR0NvbnRleHRSZWxlYXNlKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBDR0NvbnRleHRSZWxlYXNlKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2F2ZUdTdGF0ZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTYXZlR1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSZXN0b3JlR1N0YXRlKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFJlc3RvcmVHU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNjYWxlQ1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgc3g7Ci0JZmxvYXQgc3k7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3gsCi0JICAgICAgICAgICAgICAgICAgICAgICZzeSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNjYWxlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc3gsCi0JICAgICAgICAgICAgICAgICAgc3kpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgc3g7CisgICAgZmxvYXQgc3k7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNjYWxlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgc3gsCisgICAgICAgICAgICAgICAgICAgICAgc3kpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgdHg7Ci0JZmxvYXQgdHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFRyYW5zbGF0ZUNUTShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICB0eCwKLQkgICAgICAgICAgICAgICAgICAgICAgdHkpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgdHg7CisgICAgZmxvYXQgdHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFRyYW5zbGF0ZUNUTShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Um90YXRlQ1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgYW5nbGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbmdsZSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFJvdGF0ZUNUTShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBhbmdsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBhbmdsZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0Um90YXRlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENvbmNhdENUTShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX0NvbnZlcnQsICZ0cmFuc2Zvcm0pKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRDb25jYXRDVE0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX0NvbnZlcnQsICZ0cmFuc2Zvcm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRDb25jYXRDVE0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldENUTShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHQWZmaW5lVHJhbnNmb3JtIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0R2V0Q1RNKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1fTmV3LCAmX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDR0NvbnRleHRHZXRDVE0oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lV2lkdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB3aWR0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0TGluZVdpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHdpZHRoOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRMaW5lV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TGluZUNhcChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWludCBjYXA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYXApKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRMaW5lQ2FwKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBjYXApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaW50IGNhcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldExpbmVDYXAoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lSm9pbihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWludCBqb2luOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmam9pbikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldExpbmVKb2luKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgam9pbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgam9pbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmpvaW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRMaW5lSm9pbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TWl0ZXJMaW1pdChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGxpbWl0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRNaXRlckxpbWl0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBsaW1pdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0TWl0ZXJMaW1pdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0RmxhdG5lc3MoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBmbGF0bmVzczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXRuZXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0RmxhdG5lc3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGF0bmVzcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBmbGF0bmVzczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXRuZXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0RmxhdG5lc3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0bmVzcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRBbHBoYShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRBbHBoYShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGFscGhhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRBbHBoYShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEJlZ2luUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRCZWdpblBhdGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QmVnaW5QYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0TW92ZVRvUG9pbnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRNb3ZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHgsCi0JICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCB4OworICAgIGZsb2F0IHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRNb3ZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgeSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRMaW5lVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHg7Ci0JZmxvYXQgeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEFkZExpbmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICB5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEFkZExpbmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEN1cnZlVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGNwMXg7Ci0JZmxvYXQgY3AxeTsKLQlmbG9hdCBjcDJ4OwotCWZsb2F0IGNwMnk7Ci0JZmxvYXQgeDsKLQlmbG9hdCB5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcDF4LAotCSAgICAgICAgICAgICAgICAgICAgICAmY3AxeSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNwMngsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcDJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRDdXJ2ZVRvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AxeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AxeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AyeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3AyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBjcDF4OworICAgIGZsb2F0IGNwMXk7CisgICAgZmxvYXQgY3AyeDsKKyAgICBmbG9hdCBjcDJ5OworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AxeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwMXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcDJ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGNweDsKLQlmbG9hdCBjcHk7Ci0JZmxvYXQgeDsKLQlmbG9hdCB5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3B4LAotCSAgICAgICAgICAgICAgICAgICAgICAmY3B5LAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRRdWFkQ3VydmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBjcHg7CisgICAgZmxvYXQgY3B5OworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNweCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNweSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xvc2VQYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENsb3NlUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRDbG9zZVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRSZWN0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dSZWN0IHJlY3Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICByZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUmVjdCByZWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgcmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRBcmMoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JZmxvYXQgcmFkaXVzOwotCWZsb2F0IHN0YXJ0QW5nbGU7Ci0JZmxvYXQgZW5kQW5nbGU7Ci0JaW50IGNsb2Nrd2lzZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZmkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnksCi0JICAgICAgICAgICAgICAgICAgICAgICZyYWRpdXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5kQW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbG9ja3dpc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRBZGRBcmMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgeSwKLQkgICAgICAgICAgICAgICAgcmFkaXVzLAotCSAgICAgICAgICAgICAgICBzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICBlbmRBbmdsZSwKLQkgICAgICAgICAgICAgICAgY2xvY2t3aXNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBmbG9hdCByYWRpdXM7CisgICAgZmxvYXQgc3RhcnRBbmdsZTsKKyAgICBmbG9hdCBlbmRBbmdsZTsKKyAgICBpbnQgY2xvY2t3aXNlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2Nrd2lzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEFkZEFyYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICByYWRpdXMsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgIGVuZEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICBjbG9ja3dpc2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQXJjVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHgxOwotCWZsb2F0IHkxOwotCWZsb2F0IHgyOwotCWZsb2F0IHkyOwotCWZsb2F0IHJhZGl1czsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4MSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkxLAotCSAgICAgICAgICAgICAgICAgICAgICAmeDIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ5MiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cykpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEFkZEFyY1RvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHgxLAotCSAgICAgICAgICAgICAgICAgICAgICAgeTEsCi0JICAgICAgICAgICAgICAgICAgICAgICB4MiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHkyLAotCSAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHgxOworICAgIGZsb2F0IHkxOworICAgIGZsb2F0IHgyOworICAgIGZsb2F0IHkyOworICAgIGZsb2F0IHJhZGl1czsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEFkZEFyY1RvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dElzUGF0aEVtcHR5KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0SXNQYXRoRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENHQ29udGV4dElzUGF0aEVtcHR5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQ3VycmVudFBvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dQb2ludCBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENHQ29udGV4dEdldFBhdGhDdXJyZW50UG9pbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR1BvaW50X05ldywgJl9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUG9pbnQgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDR0NvbnRleHRHZXRQYXRoQ3VycmVudFBvaW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludF9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3goQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3goX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfTmV3LCAmX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X05ldywgJl9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IG1vZGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RHJhd1BhdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBtb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBtb2RlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dERyYXdQYXRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRGaWxsUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRGaWxsUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEVPRmlsbFBhdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RU9GaWxsUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRFT0ZpbGxQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTdHJva2VQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFN0cm9rZVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUmVjdChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHUmVjdCByZWN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RmlsbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICByZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUmVjdCByZWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0RmlsbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICByZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFN0cm9rZVJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTdHJva2VSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlmbG9hdCB3aWR0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR1JlY3QgcmVjdDsKKyAgICBmbG9hdCB3aWR0aDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFN0cm9rZVJlY3RXaXRoV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGVhclJlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENsZWFyUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICByZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUmVjdCByZWN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0Q2xlYXJSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRDbGlwKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dENsaXAoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0NsaXAoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RU9DbGlwKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEVPQ2xpcChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsaXBUb1JlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENsaXBUb1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRDbGlwVG9SZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBncmF5OwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBncmF5OworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldEdyYXlGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBncmF5OwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmF5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBncmF5OworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCByZWQ7Ci0JZmxvYXQgZ3JlZW47Ci0JZmxvYXQgYmx1ZTsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyZWVuLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHJlZDsKKyAgICBmbG9hdCBncmVlbjsKKyAgICBmbG9hdCBibHVlOworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCByZWQ7Ci0JZmxvYXQgZ3JlZW47Ci0JZmxvYXQgYmx1ZTsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyZWVuLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCByZWQ7CisgICAgZmxvYXQgZ3JlZW47CisgICAgZmxvYXQgYmx1ZTsKKyAgICBmbG9hdCBhbHBoYTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgY3lhbjsKLQlmbG9hdCBtYWdlbnRhOwotCWZsb2F0IHllbGxvdzsKLQlmbG9hdCBibGFjazsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjeWFuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHllbGxvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgY3lhbjsKKyAgICBmbG9hdCBtYWdlbnRhOworICAgIGZsb2F0IHllbGxvdzsKKyAgICBmbG9hdCBibGFjazsKKyAgICBmbG9hdCBhbHBoYTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS1N0cm9rZUNvbG9yKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgY3lhbjsKLQlmbG9hdCBtYWdlbnRhOwotCWZsb2F0IHllbGxvdzsKLQlmbG9hdCBibGFjazsKLQlmbG9hdCBhbHBoYTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lhbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVsbG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgY3lhbjsKKyAgICBmbG9hdCBtYWdlbnRhOworICAgIGZsb2F0IHllbGxvdzsKKyAgICBmbG9hdCBibGFjazsKKyAgICBmbG9hdCBhbHBoYTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjeWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnllbGxvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnZW50YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVsbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaW50IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IHF1YWxpdHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBxdWFsaXR5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRDaGFyYWN0ZXJTcGFjaW5nKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgc3BhY2luZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwYWNpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRDaGFyYWN0ZXJTcGFjaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHNwYWNpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0Q2hhcmFjdGVyU3BhY2luZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2luZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCB4OworICAgIGZsb2F0IHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0UG9zaXRpb24oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1BvaW50IF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludF9OZXcsICZfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR1BvaW50IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0dQb2ludF9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0TWF0cml4KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1fQ29udmVydCwgJnRyYW5zZm9ybSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldFRleHRNYXRyaXgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9Db252ZXJ0LCAmdHJhbnNmb3JtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0VGV4dE1hdHJpeChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFRleHRNYXRyaXgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR0FmZmluZVRyYW5zZm9ybSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENHQ29udGV4dEdldFRleHRNYXRyaXgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9OZXcsICZfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENHQ29udGV4dEdldFRleHRNYXRyaXgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9OZXcsICZfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgbW9kZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgbW9kZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRGb250U2l6ZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHNpemU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0Rm9udFNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHNpemU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNlbGVjdEZvbnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICogbmFtZTsKLQlmbG9hdCBzaXplOwotCWludCB0ZXh0RW5jb2Rpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2ZpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2VsZWN0Rm9udChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2RpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqIG5hbWU7CisgICAgZmxvYXQgc2l6ZTsKKyAgICBpbnQgdGV4dEVuY29kaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNmaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRFbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNlbGVjdEZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVuY29kaW5nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNob3dUZXh0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqY3N0cmluZ19faW5fXzsKLQlsb25nIGNzdHJpbmdfX2xlbl9fOwotCWludCBjc3RyaW5nX19pbl9sZW5fXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjc3RyaW5nX19pbl9fLCAmY3N0cmluZ19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQljc3RyaW5nX19sZW5fXyA9IGNzdHJpbmdfX2luX2xlbl9fOwotCUNHQ29udGV4dFNob3dUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgY3N0cmluZ19faW5fXywgY3N0cmluZ19fbGVuX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqY3N0cmluZ19faW5fXzsKKyAgICBsb25nIGNzdHJpbmdfX2xlbl9fOworICAgIGludCBjc3RyaW5nX19pbl9sZW5fXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjc3RyaW5nX19pbl9fLCAmY3N0cmluZ19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjc3RyaW5nX19sZW5fXyA9IGNzdHJpbmdfX2luX2xlbl9fOworICAgIENHQ29udGV4dFNob3dUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgY3N0cmluZ19faW5fXywgY3N0cmluZ19fbGVuX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgeDsKLQlmbG9hdCB5OwotCWNoYXIgKmNzdHJpbmdfX2luX187Ci0JbG9uZyBjc3RyaW5nX19sZW5fXzsKLQlpbnQgY3N0cmluZ19faW5fbGVuX187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNzdHJpbmdfX2luX18sICZjc3RyaW5nX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWNzdHJpbmdfX2xlbl9fID0gY3N0cmluZ19faW5fbGVuX187Ci0JQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJpbmdfX2luX18sIGNzdHJpbmdfX2xlbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBjaGFyICpjc3RyaW5nX19pbl9fOworICAgIGxvbmcgY3N0cmluZ19fbGVuX187CisgICAgaW50IGNzdHJpbmdfX2luX2xlbl9fOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjc3RyaW5nX19pbl9fLCAmY3N0cmluZ19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjc3RyaW5nX19sZW5fXyA9IGNzdHJpbmdfX2luX2xlbl9fOworICAgIENHQ29udGV4dFNob3dUZXh0QXRQb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyaW5nX19pbl9fLCBjc3RyaW5nX19sZW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFbmRQYWdlKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEVuZFBhZ2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0RW5kUGFnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZsdXNoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEZsdXNoKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEZsdXNoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3luY2hyb25pemUoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U3luY2hyb25pemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U3luY2hyb25pemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXMoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgc2hvdWxkQW50aWFsaWFzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2hvdWxkQW50aWFsaWFzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFudGlhbGlhcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgc2hvdWxkQW50aWFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hvdWxkQW50aWFsaWFzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEFudGlhbGlhcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9TeW5jQ0dDb250ZXh0T3JpZ2luV2l0aFBvcnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBwb3J0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCi0JCXJldHVybiBOVUxMOwotCVN5bmNDR0NvbnRleHRPcmlnaW5XaXRoUG9ydChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ2xpcENHQ29udGV4dFRvUmVnaW9uKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBwb3J0UmVjdDsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcG9ydFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xpcENHQ29udGV4dFRvUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3J0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcG9ydFJlY3Q7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnBvcnRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsaXBDR0NvbnRleHRUb1JlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDR0NvbnRleHRSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0dDb250ZXh0U2F2ZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2F2ZUdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2NhbGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNjYWxlQ1RNLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBzeCwgZmxvYXQgc3kpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRUcmFuc2xhdGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFRyYW5zbGF0ZUNUTSwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgdHgsIGZsb2F0IHR5KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Um90YXRlQ1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSb3RhdGVDVE0sIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IGFuZ2xlKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Q29uY2F0Q1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDb25jYXRDVE0sIDEsCi0JIFB5RG9jX1NUUigiKENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEdldENUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0Q1RNLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAotCXsiQ0dDb250ZXh0U2V0TGluZVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lV2lkdGgsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0TGluZUNhcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TGluZUNhcCwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IGNhcCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldExpbmVKb2luIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lSm9pbiwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IGpvaW4pIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRNaXRlckxpbWl0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRNaXRlckxpbWl0LCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBsaW1pdCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldEZsYXRuZXNzIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRGbGF0bmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgZmxhdG5lc3MpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRBbHBoYSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0QWxwaGEsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QmVnaW5QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRCZWdpblBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dE1vdmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRNb3ZlVG9Qb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEFkZExpbmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRMaW5lVG9Qb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEFkZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50LCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBjcDF4LCBmbG9hdCBjcDF5LCBmbG9hdCBjcDJ4LCBmbG9hdCBjcDJ5LCBmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgY3B4LCBmbG9hdCBjcHksIGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRDbG9zZVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsb3NlUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QWRkUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRBZGRBcmMiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyYywgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBlbmRBbmdsZSwgaW50IGNsb2Nrd2lzZSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEFkZEFyY1RvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyY1RvUG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCByYWRpdXMpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRJc1BhdGhFbXB0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0SXNQYXRoRW1wdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAotCXsiQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dQb2ludCBfcnYpIil9LAotCXsiQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHUmVjdCBfcnYpIil9LAotCXsiQ0dDb250ZXh0RHJhd1BhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoLCAxLAotCSBQeURvY19TVFIoIihpbnQgbW9kZSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEZpbGxQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RU9GaWxsUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RU9GaWxsUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U3Ryb2tlUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RmlsbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxSZWN0LCAxLAotCSBQeURvY19TVFIoIihDR1JlY3QgcmVjdCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFN0cm9rZVJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QsIGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Q2xlYXJSZWN0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGVhclJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Q2xpcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RU9DbGlwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0NsaXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dENsaXBUb1JlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsaXBUb1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENNWUtTdHJva2VDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAotCXsiQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihpbnQgcXVhbGl0eSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmciLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHNwYWNpbmcpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEdldFRleHRQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR1BvaW50IF9ydikiKX0sCi0JeyJDR0NvbnRleHRTZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0TWF0cml4LCAxLAotCSBQeURvY19TVFIoIihDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0pIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRHZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0TWF0cml4LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAotCXsiQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKGludCBtb2RlKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0Rm9udFNpemUiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZvbnRTaXplLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBzaXplKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2VsZWN0Rm9udCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2VsZWN0Rm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoY2hhciAqIG5hbWUsIGZsb2F0IHNpemUsIGludCB0ZXh0RW5jb2RpbmcpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTaG93VGV4dCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2hvd1RleHQsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHgsIGZsb2F0IHksIEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RW5kUGFnZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RW5kUGFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Rmx1c2giLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZsdXNoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3luY2hyb25pemUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzLCAxLAotCSBQeURvY19TVFIoIihpbnQgc2hvdWxkQW50aWFsaWFzKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2F2ZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2F2ZUdTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2NhbGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNjYWxlQ1RNLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBzeCwgZmxvYXQgc3kpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRUcmFuc2xhdGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFRyYW5zbGF0ZUNUTSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgdHgsIGZsb2F0IHR5KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Um90YXRlQ1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSb3RhdGVDVE0sIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IGFuZ2xlKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Q29uY2F0Q1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDb25jYXRDVE0sIDEsCisgICAgIFB5RG9jX1NUUigiKENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEdldENUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0Q1RNLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0U2V0TGluZVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lV2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0TGluZUNhcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0TGluZUNhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50IGNhcCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldExpbmVKb2luIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lSm9pbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50IGpvaW4pIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRNaXRlckxpbWl0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRNaXRlckxpbWl0LCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBsaW1pdCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldEZsYXRuZXNzIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRGbGF0bmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgZmxhdG5lc3MpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRBbHBoYSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0QWxwaGEsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QmVnaW5QYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRCZWdpblBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dE1vdmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRNb3ZlVG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEFkZExpbmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRMaW5lVG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEFkZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50LCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBjcDF4LCBmbG9hdCBjcDF5LCBmbG9hdCBjcDJ4LCBmbG9hdCBjcDJ5LCBmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUXVhZEN1cnZlVG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgY3B4LCBmbG9hdCBjcHksIGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRDbG9zZVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsb3NlUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QWRkUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRBZGRBcmMiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgcmFkaXVzLCBmbG9hdCBzdGFydEFuZ2xlLCBmbG9hdCBlbmRBbmdsZSwgaW50IGNsb2Nrd2lzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEFkZEFyY1RvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyY1RvUG9pbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyLCBmbG9hdCByYWRpdXMpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRJc1BhdGhFbXB0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0SXNQYXRoRW1wdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dQb2ludCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHUmVjdCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0RHJhd1BhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dERyYXdQYXRoLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgbW9kZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEZpbGxQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRGaWxsUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RU9GaWxsUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RU9GaWxsUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U3Ryb2tlUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RmlsbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihDR1JlY3QgcmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFN0cm9rZVJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFN0cm9rZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QsIGZsb2F0IHdpZHRoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Q2xlYXJSZWN0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGVhclJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Q2xpcCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RU9DbGlwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0NsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dENsaXBUb1JlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsaXBUb1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRHcmF5U3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgZ3JheSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCU3Ryb2tlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHJlZCwgZmxvYXQgZ3JlZW4sIGZsb2F0IGJsdWUsIGZsb2F0IGFscGhhKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS0ZpbGxDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENNWUtTdHJva2VDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgY3lhbiwgZmxvYXQgbWFnZW50YSwgZmxvYXQgeWVsbG93LCBmbG9hdCBibGFjaywgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0SW50ZXJwb2xhdGlvblF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGludCBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEludGVycG9sYXRpb25RdWFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIihpbnQgcXVhbGl0eSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmciLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHNwYWNpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRUZXh0UG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEdldFRleHRQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR1BvaW50IF9ydikiKX0sCisgICAgeyJDR0NvbnRleHRTZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0TWF0cml4LCAxLAorICAgICBQeURvY19TVFIoIihDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm0pIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRHZXRUZXh0TWF0cml4IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0TWF0cml4LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR0FmZmluZVRyYW5zZm9ybSBfcnYpIil9LAorICAgIHsiQ0dDb250ZXh0U2V0VGV4dERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKGludCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0Rm9udFNpemUiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZvbnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBzaXplKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2VsZWN0Rm9udCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2VsZWN0Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2hhciAqIG5hbWUsIGZsb2F0IHNpemUsIGludCB0ZXh0RW5jb2RpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTaG93VGV4dCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2hvd1RleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHgsIGZsb2F0IHksIEJ1ZmZlciBjc3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RW5kUGFnZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RW5kUGFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Rmx1c2giLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZsdXNoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3luY2hyb25pemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgc2hvdWxkQW50aWFsaWFzKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9TeW5jQ0dDb250ZXh0T3JpZ2luV2l0aFBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQpIC0+IE5vbmUiKX0sCi0JeyJDbGlwQ0dDb250ZXh0VG9SZWdpb24iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NsaXBDR0NvbnRleHRUb1JlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBwb3J0UmVjdCwgUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IlN5bmNDR0NvbnRleHRPcmlnaW5XaXRoUG9ydCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0LCAxLAorICAgICBQeURvY19TVFIoIihDR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAorICAgIHsiQ2xpcENHQ29udGV4dFRvUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DbGlwQ0dDb250ZXh0VG9SZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcG9ydFJlY3QsIFJnbkhhbmRsZSByZWdpb24pIC0+IE5vbmUiKX0sCiAjZW5kaWYKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTE5OCw2MSArMTE5OCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ0dDb250ZXh0UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQ0dDb250ZXh0UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENHQ29udGV4dFJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENHQ29udGV4dFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDR0NvbnRleHRSZWZPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDR0NvbnRleHRSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQ0dDb250ZXh0UmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENHQ29udGV4dFJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRy5DR0NvbnRleHRSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDR0NvbnRleHRSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDR0NvbnRleHRSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0dDb250ZXh0UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDR0NvbnRleHRSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENHQ29udGV4dFJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDR0NvbnRleHRSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0dDb250ZXh0UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNHQ29udGV4dFJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0dDb250ZXh0UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNHQ29udGV4dFJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNHQ29udGV4dFJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NHLkNHQ29udGV4dFJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENHQ29udGV4dFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENHQ29udGV4dFJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDR0NvbnRleHRSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENHQ29udGV4dFJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0dDb250ZXh0UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENHQ29udGV4dFJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDR0NvbnRleHRSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0dDb250ZXh0UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDR0NvbnRleHRSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0dDb250ZXh0UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0dDb250ZXh0UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0dDb250ZXh0UmVmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTI2MSwyOSArMTI2MSwyOSBAQAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpDR19DcmVhdGVDR0NvbnRleHRGb3JQb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIHBvcnQ7Ci0JQ0dDb250ZXh0UmVmIGN0eDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHcmFmUHRyIHBvcnQ7CisgICAgQ0dDb250ZXh0UmVmIGN0eDsKKyAgICBPU1N0YXR1cyBfZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLCBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JX2VyciA9IENyZWF0ZUNHQ29udGV4dEZvclBvcnQocG9ydCwgJmN0eCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIENHQ29udGV4dFJlZk9ial9OZXcsIGN0eCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgX2VyciA9IENyZWF0ZUNHQ29udGV4dEZvclBvcnQocG9ydCwgJmN0eCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpCisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0dDb250ZXh0UmVmT2JqX05ldywgY3R4KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDR19tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJDcmVhdGVDR0NvbnRleHRGb3JQb3J0IiwgKFB5Q0Z1bmN0aW9uKUNHX0NyZWF0ZUNHQ29udGV4dEZvclBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyKSAtPiBDR0NvbnRleHRSZWYiKX0sCisgICAgeyJDcmVhdGVDR0NvbnRleHRGb3JQb3J0IiwgKFB5Q0Z1bmN0aW9uKUNHX0NyZWF0ZUNHQ29udGV4dEZvclBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyKSAtPiBDR0NvbnRleHRSZWYiKX0sCiAjZW5kaWYKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTI5MSwyNSArMTI5MSwyNSBAQAogCiB2b2lkIGluaXRfQ0codm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQ0ciLCBDR19tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDR19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKENHX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ0dfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlDR0NvbnRleHRSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNHQ29udGV4dFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNHQ29udGV4dFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNHQ29udGV4dFJlZiIsIChQeU9iamVjdCAqKSZDR0NvbnRleHRSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDR0NvbnRleHRSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDR0NvbnRleHRSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNHQ29udGV4dFJlZl9UeXBlKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0NHIiwgQ0dfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQ0dfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChDR19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENHX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgQ0dDb250ZXh0UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDR0NvbnRleHRSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDR0NvbnRleHRSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDR0NvbnRleHRSZWYiLCAoUHlPYmplY3QgKikmQ0dDb250ZXh0UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0dDb250ZXh0UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0dDb250ZXh0UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDR0NvbnRleHRSZWZfVHlwZSk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQ0cgPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY20vX0NtbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9jbS9fQ21tb2R1bGUuYwppbmRleCAwM2EyNWRkLi5mMDdmMTIxIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jbS9fQ21tb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9jbS9fQ21tb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM2LDIxICszNiwyMSBAQAogQ21wRGVzY19OZXcoQ29tcG9uZW50RGVzY3JpcHRpb24gKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZPJk8mbGwiLAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFR5cGUsCi0gICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKLSAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5jb21wb25lbnRNYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgICAgaXRzZWxmLT5jb21wb25lbnRGbGFncywgaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJk8mTyZsbCIsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFN1YlR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudE1hbnVmYWN0dXJlciwKKyAgICAgICAgaXRzZWxmLT5jb21wb25lbnRGbGFncywgaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOwogfQogCiBzdGF0aWMgaW50CiBDbXBEZXNjX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbXBvbmVudERlc2NyaXB0aW9uICpwX2l0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIk8mTyZPJmxsIiwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50VHlwZSwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50TWFudWZhY3R1cmVyLAotICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3MsICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3NNYXNrKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mbGwiLAorICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50VHlwZSwKKyAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcF9pdHNlbGYtPmNvbXBvbmVudFN1YlR5cGUsCisgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRNYW51ZmFjdHVyZXIsCisgICAgICAgICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3MsICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3NNYXNrKTsKIH0KIAogCkBAIC02MywxOTQgKzYzLDE5NCBAQAogI2RlZmluZSBDbXBJbnN0T2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNvbXBvbmVudEluc3RhbmNlX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDb21wb25lbnRJbnN0YW5jZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNvbXBvbmVudEluc3RhbmNlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ29tcG9uZW50SW5zdGFuY2Ugb2JfaXRzZWxmOwogfSBDb21wb25lbnRJbnN0YW5jZU9iamVjdDsKIAogUHlPYmplY3QgKkNtcEluc3RPYmpfTmV3KENvbXBvbmVudEluc3RhbmNlIGl0c2VsZikKIHsKLQlDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhDb21wb25lbnRJbnN0YW5jZU9iamVjdCwgJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDb21wb25lbnRJbnN0YW5jZU9iamVjdCwgJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENtcEluc3RPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ29tcG9uZW50SW5zdGFuY2UgKnBfaXRzZWxmKQogewotCWlmICghQ21wSW5zdE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb21wb25lbnRJbnN0YW5jZSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDbXBJbnN0T2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvbXBvbmVudEluc3RhbmNlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ21wSW5zdE9ial9kZWFsbG9jKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0Nsb3NlQ29tcG9uZW50KENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBDbG9zZUNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKENsb3NlQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZUNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENsb3NlQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2xvc2VDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial9HZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXBvbmVudEluc3RhbmNlRXJyb3IoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcEluc3RPYmpfU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcihDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgdGhlRXJyb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIHRoZUVycm9yOwogI2lmbmRlZiBTZXRDb21wb25lbnRJbnN0YW5jZUVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUVycm9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRXJyb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUVycm9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRXJyb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0dldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial9TZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB0aGVTdG9yYWdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgdGhlU3RvcmFnZTsKICNpZm5kZWYgU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN0b3JhZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RvcmFnZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTdG9yYWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0b3JhZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0NvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCXNob3J0IGZ0bk51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgc2hvcnQgZnRuTnVtYmVyOwogI2lmbmRlZiBDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZ0bk51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0bk51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdG5OdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdG5OdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcEluc3RPYmpfR2V0Q29tcG9uZW50VmVyc2lvbihDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRDb21wb25lbnRWZXJzaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50VmVyc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50VmVyc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29tcG9uZW50VmVyc2lvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29tcG9uZW50VmVyc2lvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0NvbXBvbmVudFNldFRhcmdldChDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB0YXJnZXQ7CiAjaWZuZGVmIENvbXBvbmVudFNldFRhcmdldAotCVB5TWFjX1BSRUNIRUNLKENvbXBvbmVudFNldFRhcmdldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcG9uZW50U2V0VGFyZ2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdGFyZ2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ29tcG9uZW50U2V0VGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wb25lbnRTZXRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18qLwogCiBzdGF0aWMgUHlNZXRob2REZWYgQ21wSW5zdE9ial9tZXRob2RzW10gPSB7Ci0JeyJDbG9zZUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0Nsb3NlQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlRXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKE9TRXJyIHRoZUVycm9yKSAtPiBOb25lIil9LAotCXsiR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlNldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZVN0b3JhZ2UpIC0+IE5vbmUiKX0sCisgICAgeyJDbG9zZUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0Nsb3NlQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlRXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TRXJyIHRoZUVycm9yKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZVN0b3JhZ2UpIC0+IE5vbmUiKX0sCiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZnRuTnVtYmVyKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0Q29tcG9uZW50VmVyc2lvbiIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0dldENvbXBvbmVudFZlcnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkNvbXBvbmVudFNldFRhcmdldCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0NvbXBvbmVudFNldFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgdGFyZ2V0KSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0NvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGZ0bk51bWJlcikgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldENvbXBvbmVudFZlcnNpb24iLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9HZXRDb21wb25lbnRWZXJzaW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJDb21wb25lbnRTZXRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9Db21wb25lbnRTZXRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHRhcmdldCkgLT4gKGxvbmcgX3J2KSIpfSwKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ21wSW5zdE9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTI2Nyw2MSArMjY3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIENtcEluc3RPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ29tcG9uZW50SW5zdGFuY2VfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ20uQ29tcG9uZW50SW5zdGFuY2UiLCAvKnRwX25hbWUqLwotCXNpemVvZihDb21wb25lbnRJbnN0YW5jZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENtcEluc3RPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ21wSW5zdE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ21wSW5zdE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ21wSW5zdE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDbXBJbnN0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNtcEluc3RPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ21wSW5zdE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ21wSW5zdE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDbXBJbnN0T2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ21wSW5zdE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NtLkNvbXBvbmVudEluc3RhbmNlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDbXBJbnN0T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENtcEluc3RPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENtcEluc3RPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENtcEluc3RPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ21wSW5zdE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDbXBJbnN0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENtcEluc3RPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENtcEluc3RPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ21wSW5zdE9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENtcEluc3RPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDb21wb25lbnRJbnN0YW5jZSAtLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMzQsMzYxICszMzQsMzYxIEBACiAjZGVmaW5lIENtcE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDb21wb25lbnRfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ29tcG9uZW50X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDb21wb25lbnRPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDb21wb25lbnQgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDb21wb25lbnQgb2JfaXRzZWxmOwogfSBDb21wb25lbnRPYmplY3Q7CiAKIFB5T2JqZWN0ICpDbXBPYmpfTmV3KENvbXBvbmVudCBpdHNlbGYpCiB7Ci0JQ29tcG9uZW50T2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHJldHVybiBOb25lPyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENtX0Vycm9yLCJObyBzdWNoIGNvbXBvbmVudCIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKENvbXBvbmVudE9iamVjdCwgJkNvbXBvbmVudF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ29tcG9uZW50T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHJldHVybiBOb25lPyAqLworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5vIHN1Y2ggY29tcG9uZW50Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDb21wb25lbnRPYmplY3QsICZDb21wb25lbnRfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ21wT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbXBvbmVudCAqcF9pdHNlbGYpCiB7Ci0JaWYgKCB2ID09IFB5X05vbmUgKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAwOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0JICAgICAgICB9Ci0JaWYgKCFDbXBPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ29tcG9uZW50IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENvbXBvbmVudE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICBpZiAoIUNtcE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb21wb25lbnQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ29tcG9uZW50T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ21wT2JqX2RlYWxsb2MoQ29tcG9uZW50T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfVW5yZWdpc3RlckNvbXBvbmVudChDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFVucmVnaXN0ZXJDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVyQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVyQ29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3RlckNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVucmVnaXN0ZXJDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX0dldENvbXBvbmVudEluZm8oQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbXBvbmVudERlc2NyaXB0aW9uIGNkOwotCUhhbmRsZSBjb21wb25lbnROYW1lOwotCUhhbmRsZSBjb21wb25lbnRJbmZvOwotCUhhbmRsZSBjb21wb25lbnRJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbXBvbmVudERlc2NyaXB0aW9uIGNkOworICAgIEhhbmRsZSBjb21wb25lbnROYW1lOworICAgIEhhbmRsZSBjb21wb25lbnRJbmZvOworICAgIEhhbmRsZSBjb21wb25lbnRJY29uOwogI2lmbmRlZiBHZXRDb21wb25lbnRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXBvbmVudE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9uZW50SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb25lbnRJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXBvbmVudEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmY2QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEljb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX05ldywgJmNkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9uZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb25lbnRJY29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXBvbmVudEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX05ldywgJmNkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfT3BlbkNvbXBvbmVudChDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudEluc3RhbmNlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgX3J2OwogI2lmbmRlZiBPcGVuQ29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soT3BlbkNvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlbkNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gT3BlbkNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBPcGVuQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX1Jlc29sdmVDb21wb25lbnRBbGlhcyhDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBfcnY7CiAjaWZuZGVmIFJlc29sdmVDb21wb25lbnRBbGlhcwotCVB5TWFjX1BSRUNIRUNLKFJlc29sdmVDb21wb25lbnRBbGlhcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVzb2x2ZUNvbXBvbmVudEFsaWFzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZXNvbHZlQ29tcG9uZW50QWxpYXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZXNvbHZlQ29tcG9uZW50QWxpYXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9HZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSB0aGVTdHJpbmc7Ci0Jc2hvcnQgc3RyTGlzdElEOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjI1NSB0aGVTdHJpbmc7CisgICAgc2hvcnQgc3RyTGlzdElEOworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFB1YmxpY0luZFN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdHJMaXN0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckxpc3RJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJMaXN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckxpc3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50UmVmY29uKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRDb21wb25lbnRSZWZjb24KLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRSZWZjb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFJlZmNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29tcG9uZW50UmVmY29uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb21wb25lbnRSZWZjb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX1NldENvbXBvbmVudFJlZmNvbihDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgdGhlUmVmY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIHRoZVJlZmNvbjsKICNpZm5kZWYgU2V0Q29tcG9uZW50UmVmY29uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29tcG9uZW50UmVmY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb21wb25lbnRSZWZjb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZWZjb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb21wb25lbnRSZWZjb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgdGhlUmVmY29uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZWZjb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb21wb25lbnRSZWZjb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlUmVmY29uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX09wZW5Db21wb25lbnRSZXNGaWxlKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIE9wZW5Db21wb25lbnRSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soT3BlbkNvbXBvbmVudFJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5Db21wb25lbnRSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBPcGVuQ29tcG9uZW50UmVzRmlsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT3BlbkNvbXBvbmVudFJlc0ZpbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX0dldENvbXBvbmVudFJlc291cmNlKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgcmVzVHlwZTsKLQlzaG9ydCByZXNJRDsKLQlIYW5kbGUgdGhlUmVzb3VyY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHJlc1R5cGU7CisgICAgc2hvcnQgcmVzSUQ7CisgICAgSGFuZGxlIHRoZVJlc291cmNlOwogI2lmbmRlZiBHZXRDb21wb25lbnRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZXNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50UmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNvdXJjZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVJlc291cmNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZXNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcG9uZW50UmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNvdXJjZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVJlc291cmNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50SW5kU3RyaW5nKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHIyNTUgdGhlU3RyaW5nOwotCXNob3J0IHN0ckxpc3RJRDsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHIyNTUgdGhlU3RyaW5nOworICAgIHNob3J0IHN0ckxpc3RJRDsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0Q29tcG9uZW50SW5kU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SW5kU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbmRTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGhlU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RyTGlzdElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50SW5kU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJMaXN0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGhlU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyTGlzdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcG9uZW50SW5kU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJMaXN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX0NvdW50Q29tcG9uZW50SW5zdGFuY2VzKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBDb3VudENvbXBvbmVudEluc3RhbmNlcwotCVB5TWFjX1BSRUNIRUNLKENvdW50Q29tcG9uZW50SW5zdGFuY2VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudENvbXBvbmVudEluc3RhbmNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRDb21wb25lbnRJbnN0YW5jZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50Q29tcG9uZW50SW5zdGFuY2VzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9TZXREZWZhdWx0Q29tcG9uZW50KENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBmbGFnczsKICNpZm5kZWYgU2V0RGVmYXVsdENvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNldERlZmF1bHRDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERlZmF1bHRDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREZWZhdWx0Q29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGVmYXVsdENvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfQ2FwdHVyZUNvbXBvbmVudChDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7Ci0JQ29tcG9uZW50IGNhcHR1cmluZ0NvbXBvbmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50IF9ydjsKKyAgICBDb21wb25lbnQgY2FwdHVyaW5nQ29tcG9uZW50OwogI2lmbmRlZiBDYXB0dXJlQ29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ2FwdHVyZUNvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FwdHVyZUNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2FwdHVyaW5nQ29tcG9uZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2FwdHVyZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyaW5nQ29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNhcHR1cmluZ0NvbXBvbmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENhcHR1cmVDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmluZ0NvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9VbmNhcHR1cmVDb21wb25lbnQoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBVbmNhcHR1cmVDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhVbmNhcHR1cmVDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVuY2FwdHVyZUNvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVuY2FwdHVyZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVuY2FwdHVyZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50SWNvblN1aXRlKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgaWNvblN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBpY29uU3VpdGU7CiAjaWZuZGVmIEdldENvbXBvbmVudEljb25TdWl0ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudEljb25TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50SWNvblN1aXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblN1aXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvblN1aXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXBvbmVudEljb25TdWl0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TdWl0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25TdWl0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDbXBPYmpfbWV0aG9kc1tdID0gewotCXsiVW5yZWdpc3RlckNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfVW5yZWdpc3RlckNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0Q29tcG9uZW50SW5mbyIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGNvbXBvbmVudE5hbWUsIEhhbmRsZSBjb21wb25lbnRJbmZvLCBIYW5kbGUgY29tcG9uZW50SWNvbikgLT4gKENvbXBvbmVudERlc2NyaXB0aW9uIGNkKSIpfSwKLQl7Ik9wZW5Db21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX09wZW5Db21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCi0JeyJSZXNvbHZlQ29tcG9uZW50QWxpYXMiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1Jlc29sdmVDb21wb25lbnRBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudFB1YmxpY0luZFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkdldENvbXBvbmVudFJlZmNvbiIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVmY29uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRDb21wb25lbnRSZWZjb24iLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1NldENvbXBvbmVudFJlZmNvbiwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyB0aGVSZWZjb24pIC0+IE5vbmUiKX0sCi0JeyJPcGVuQ29tcG9uZW50UmVzRmlsZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfT3BlbkNvbXBvbmVudFJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRDb21wb25lbnRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZXNUeXBlLCBzaG9ydCByZXNJRCkgLT4gKEhhbmRsZSB0aGVSZXNvdXJjZSkiKX0sCi0JeyJHZXRDb21wb25lbnRJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudEluZFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50Q29tcG9uZW50SW5zdGFuY2VzIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9Db3VudENvbXBvbmVudEluc3RhbmNlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU2V0RGVmYXVsdENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfU2V0RGVmYXVsdENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJDYXB0dXJlQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9DYXB0dXJlQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnQgY2FwdHVyaW5nQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJVbmNhcHR1cmVDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1VuY2FwdHVyZUNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVW5yZWdpc3RlckNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfVW5yZWdpc3RlckNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29tcG9uZW50SW5mbyIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGNvbXBvbmVudE5hbWUsIEhhbmRsZSBjb21wb25lbnRJbmZvLCBIYW5kbGUgY29tcG9uZW50SWNvbikgLT4gKENvbXBvbmVudERlc2NyaXB0aW9uIGNkKSIpfSwKKyAgICB7Ik9wZW5Db21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX09wZW5Db21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCisgICAgeyJSZXNvbHZlQ29tcG9uZW50QWxpYXMiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1Jlc29sdmVDb21wb25lbnRBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJHZXRDb21wb25lbnRQdWJsaWNJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudFB1YmxpY0luZFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbXBvbmVudFJlZmNvbiIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVmY29uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJTZXRDb21wb25lbnRSZWZjb24iLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1NldENvbXBvbmVudFJlZmNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyB0aGVSZWZjb24pIC0+IE5vbmUiKX0sCisgICAgeyJPcGVuQ29tcG9uZW50UmVzRmlsZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfT3BlbkNvbXBvbmVudFJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRDb21wb25lbnRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZXNUeXBlLCBzaG9ydCByZXNJRCkgLT4gKEhhbmRsZSB0aGVSZXNvdXJjZSkiKX0sCisgICAgeyJHZXRDb21wb25lbnRJbmRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudEluZFN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHRoZVN0cmluZywgc2hvcnQgc3RyTGlzdElELCBzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvdW50Q29tcG9uZW50SW5zdGFuY2VzIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9Db3VudENvbXBvbmVudEluc3RhbmNlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0RGVmYXVsdENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfU2V0RGVmYXVsdENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJDYXB0dXJlQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9DYXB0dXJlQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnQgY2FwdHVyaW5nQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJVbmNhcHR1cmVDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX1VuY2FwdHVyZUNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0Q29tcG9uZW50SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBpY29uU3VpdGUpIil9LAorICAgIHsiR2V0Q29tcG9uZW50SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBpY29uU3VpdGUpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDbXBPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC03MDUsNjEgKzcwNSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ29tcG9uZW50IGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQ29tcG9uZW50IGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENtcE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENvbXBvbmVudE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDbXBPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDb21wb25lbnRPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQ21wT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENvbXBvbmVudF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DbS5Db21wb25lbnQiLCAvKnRwX25hbWUqLwotCXNpemVvZihDb21wb25lbnRPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDbXBPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ21wT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDbXBPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENtcE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDbXBPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ21wT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNtcE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ21wT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNtcE9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNtcE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NtLkNvbXBvbmVudCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENvbXBvbmVudE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENtcE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDbXBPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENtcE9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ21wT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENtcE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDbXBPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ21wT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDbXBPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ21wT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ21wT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENvbXBvbmVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzY3LDE1MCArNzY3LDE1MCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkNtX1JlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7Ci0JQ29tcG9uZW50UmVzb3VyY2VIYW5kbGUgY3I7Ci0Jc2hvcnQgZ2xvYmFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnQgX3J2OworICAgIENvbXBvbmVudFJlc291cmNlSGFuZGxlIGNyOworICAgIHNob3J0IGdsb2JhbDsKICNpZm5kZWYgUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UoY3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZShjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0ZpbmROZXh0Q29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnQgX3J2OwotCUNvbXBvbmVudCBhQ29tcG9uZW50OwotCUNvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBfcnY7CisgICAgQ29tcG9uZW50IGFDb21wb25lbnQ7CisgICAgQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZzsKICNpZm5kZWYgRmluZE5leHRDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhGaW5kTmV4dENvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZE5leHRDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmYUNvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wRGVzY19Db252ZXJ0LCAmbG9va2luZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZpbmROZXh0Q29tcG9uZW50KGFDb21wb25lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmxvb2tpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZhQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX0NvbnZlcnQsICZsb29raW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmluZE5leHRDb21wb25lbnQoYUNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9va2luZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0NvdW50Q29tcG9uZW50cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZzsKICNpZm5kZWYgQ291bnRDb21wb25lbnRzCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRDb21wb25lbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudENvbXBvbmVudHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX0NvbnZlcnQsICZsb29raW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRDb21wb25lbnRzKCZsb29raW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcERlc2NfQ29udmVydCwgJmxvb2tpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudENvbXBvbmVudHMoJmxvb2tpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0dldENvbXBvbmVudExpc3RNb2RTZWVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldENvbXBvbmVudExpc3RNb2RTZWVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudExpc3RNb2RTZWVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb21wb25lbnRMaXN0TW9kU2VlZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb21wb25lbnRMaXN0TW9kU2VlZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX0Nsb3NlQ29tcG9uZW50UmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZudW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmbnVtOwogI2lmbmRlZiBDbG9zZUNvbXBvbmVudFJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhDbG9zZUNvbXBvbmVudFJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlQ29tcG9uZW50UmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZm51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDbG9zZUNvbXBvbmVudFJlc0ZpbGUocmVmbnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZm51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9zZUNvbXBvbmVudFJlc0ZpbGUocmVmbnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbV9PcGVuRGVmYXVsdENvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50SW5zdGFuY2UgX3J2OwotCU9TVHlwZSBjb21wb25lbnRUeXBlOwotCU9TVHlwZSBjb21wb25lbnRTdWJUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBfcnY7CisgICAgT1NUeXBlIGNvbXBvbmVudFR5cGU7CisgICAgT1NUeXBlIGNvbXBvbmVudFN1YlR5cGU7CiAjaWZuZGVmIE9wZW5EZWZhdWx0Q29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soT3BlbkRlZmF1bHRDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5EZWZhdWx0Q29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRTdWJUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gT3BlbkRlZmF1bHRDb21wb25lbnQoY29tcG9uZW50VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdWJUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wb25lbnRTdWJUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT3BlbkRlZmF1bHRDb21wb25lbnQoY29tcG9uZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdWJUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX1JlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgZ2xvYmFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgc2hvcnQgZ2xvYmFsOwogI2lmbmRlZiBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZQotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZShyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZShyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENtX21ldGhvZHNbXSA9IHsKLQl7IlJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pQ21fUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50UmVzb3VyY2VIYW5kbGUgY3IsIHNob3J0IGdsb2JhbCkgLT4gKENvbXBvbmVudCBfcnYpIil9LAotCXsiRmluZE5leHRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21fRmluZE5leHRDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudCBhQ29tcG9uZW50LCBDb21wb25lbnREZXNjcmlwdGlvbiBsb29raW5nKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJDb3VudENvbXBvbmVudHMiLCAoUHlDRnVuY3Rpb24pQ21fQ291bnRDb21wb25lbnRzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnREZXNjcmlwdGlvbiBsb29raW5nKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQiLCAoUHlDRnVuY3Rpb24pQ21fR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkNsb3NlQ29tcG9uZW50UmVzRmlsZSIsIChQeUNGdW5jdGlvbilDbV9DbG9zZUNvbXBvbmVudFJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZm51bSkgLT4gTm9uZSIpfSwKLQl7Ik9wZW5EZWZhdWx0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtX09wZW5EZWZhdWx0Q29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgY29tcG9uZW50VHlwZSwgT1NUeXBlIGNvbXBvbmVudFN1YlR5cGUpIC0+IChDb21wb25lbnRJbnN0YW5jZSBfcnYpIil9LAotCXsiUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pQ21fUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgc2hvcnQgZ2xvYmFsKSAtPiAobG9uZyBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDbV9SZWdpc3RlckNvbXBvbmVudFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRSZXNvdXJjZUhhbmRsZSBjciwgc2hvcnQgZ2xvYmFsKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJGaW5kTmV4dENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbV9GaW5kTmV4dENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGFDb21wb25lbnQsIENvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmcpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKKyAgICB7IkNvdW50Q29tcG9uZW50cyIsIChQeUNGdW5jdGlvbilDbV9Db3VudENvbXBvbmVudHMsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmcpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRDb21wb25lbnRMaXN0TW9kU2VlZCIsIChQeUNGdW5jdGlvbilDbV9HZXRDb21wb25lbnRMaXN0TW9kU2VlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiQ2xvc2VDb21wb25lbnRSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUNtX0Nsb3NlQ29tcG9uZW50UmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmbnVtKSAtPiBOb25lIil9LAorICAgIHsiT3BlbkRlZmF1bHRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21fT3BlbkRlZmF1bHRDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjb21wb25lbnRUeXBlLCBPU1R5cGUgY29tcG9uZW50U3ViVHlwZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCisgICAgeyJSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilDbV9SZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCBnbG9iYWwpIC0+IChsb25nIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTkxOCwzNyArOTE4LDM3IEBACiAKIHZvaWQgaW5pdF9DbSh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50LCBDbXBPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnQsIENtcE9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudEluc3RhbmNlLCBDbXBJbnN0T2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudCwgQ21wT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnQsIENtcE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudEluc3RhbmNlLCBDbXBJbnN0T2JqX0NvbnZlcnQpOwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0NtIiwgQ21fbWV0aG9kcyk7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JQ21fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChDbV9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENtX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JQ29tcG9uZW50SW5zdGFuY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnRJbnN0YW5jZSIsIChQeU9iamVjdCAqKSZDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50SW5zdGFuY2VUeXBlIiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCUNvbXBvbmVudF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ29tcG9uZW50X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29tcG9uZW50X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50IiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNvbXBvbmVudF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbXBvbmVudFR5cGUiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50X1R5cGUpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfQ20iLCBDbV9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBDbV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKENtX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ21fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBDb21wb25lbnRJbnN0YW5jZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbXBvbmVudEluc3RhbmNlIiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnRJbnN0YW5jZVR5cGUiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgQ29tcG9uZW50X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDb21wb25lbnRfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDb21wb25lbnRfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnQiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ29tcG9uZW50X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50VHlwZSIsIChQeU9iamVjdCAqKSZDb21wb25lbnRfVHlwZSk7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfQ20gPT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY3RsL19DdGxtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2N0bC9fQ3RsbW9kdWxlLmMKaW5kZXggZDdkNGQwYS4uMjJlMGJkNSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY3RsL19DdGxtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9jdGwvX0N0bG1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC00MSwxOSArNDEsMTkgQEAKIENvbnRyb2xGb250U3R5bGVfTmV3KENvbnRyb2xGb250U3R5bGVSZWMgKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaGhoTyZPJiIsIGl0c2VsZi0+ZmxhZ3MsIGl0c2VsZi0+Zm9udCwKLSAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUsIGl0c2VsZi0+c3R5bGUsIGl0c2VsZi0+bW9kZSwgaXRzZWxmLT5qdXN0LAotICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJml0c2VsZi0+Zm9yZUNvbG9yLCBRZFJHQl9OZXcsICZpdHNlbGYtPmJhY2tDb2xvcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhoaGhoaE8mTyYiLCBpdHNlbGYtPmZsYWdzLCBpdHNlbGYtPmZvbnQsCisgICAgICAgIGl0c2VsZi0+c2l6ZSwgaXRzZWxmLT5zdHlsZSwgaXRzZWxmLT5tb2RlLCBpdHNlbGYtPmp1c3QsCisgICAgICAgIFFkUkdCX05ldywgJml0c2VsZi0+Zm9yZUNvbG9yLCBRZFJHQl9OZXcsICZpdHNlbGYtPmJhY2tDb2xvcik7CiB9CiAjZW5kaWYKIAogc3RhdGljIGludAogQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sRm9udFN0eWxlUmVjICppdHNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGhoaGhoaE8mTyYpIiwgJml0c2VsZi0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgJml0c2VsZi0+Zm9udCwgJml0c2VsZi0+c2l6ZSwgJml0c2VsZi0+c3R5bGUsICZpdHNlbGYtPm1vZGUsCi0gICAgICAgICAgICAgICAgJml0c2VsZi0+anVzdCwgUWRSR0JfQ29udmVydCwgJml0c2VsZi0+Zm9yZUNvbG9yLAotICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZpdHNlbGYtPmJhY2tDb2xvcik7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaGhoaGhoTyZPJikiLCAmaXRzZWxmLT5mbGFncywKKyAgICAgICAgJml0c2VsZi0+Zm9udCwgJml0c2VsZi0+c2l6ZSwgJml0c2VsZi0+c3R5bGUsICZpdHNlbGYtPm1vZGUsCisgICAgICAgICZpdHNlbGYtPmp1c3QsIFFkUkdCX0NvbnZlcnQsICZpdHNlbGYtPmZvcmVDb2xvciwKKyAgICAgICAgUWRSR0JfQ29udmVydCwgJml0c2VsZi0+YmFja0NvbG9yKTsKIH0KIAogLyoKQEAgLTYzLDEzICs2MywxMyBAQAogUHlDb250cm9sSURfTmV3KENvbnRyb2xJRCAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5zaWduYXR1cmUsIGl0c2VsZi0+aWQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5zaWduYXR1cmUsIGl0c2VsZi0+aWQpOwogfQogCiBzdGF0aWMgaW50CiBQeUNvbnRyb2xJRF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sSUQgKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+c2lnbmF0dXJlLCAmaXRzZWxmLT5pZCk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+c2lnbmF0dXJlLCAmaXRzZWxmLT5pZCk7CiB9CiAKIC8qCkBAIC03OCw0MCArNzgsNDAgQEAKIHN0YXRpYyBpbnQKIERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uRGVzY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2MgKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIobE8mbCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+cHJvcGVydHlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlGbGFncyk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIobE8mbCkiLAorICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5wcm9wZXJ0eUlELAorICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpdHNlbGYtPnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlGbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaE8mKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5jb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaXRzZWxmLT51Lmljb25TdWl0ZSk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaE8mKSIsCisgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPmNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJml0c2VsZi0+dS5pY29uU3VpdGUpOwogfQogCiBzdGF0aWMgaW50CiBEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzYyAqaXRzZWxmKQogewotICAgICAgICBpdHNlbGYtPnZlcnNpb24gPSBrRGF0YUJyb3dzZXJMaXN0Vmlld0xhdGVzdEhlYWRlckRlc2M7Ci0gICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKEhIaE8mSE8mTyYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1pbmltdW1XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1heGltdW1XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnRpdGxlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZi0+dGl0bGVTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5pbml0aWFsT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkZvbnRTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaXRzZWxmLT5idG5Db250ZW50SW5mbyk7CisgICAgaXRzZWxmLT52ZXJzaW9uID0ga0RhdGFCcm93c2VyTGlzdFZpZXdMYXRlc3RIZWFkZXJEZXNjOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKEhIaE8mSE8mTyYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+bWluaW11bVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5tYXhpbXVtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnRpdGxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaXRzZWxmLT50aXRsZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+aW5pdGlhbE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkZvbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkNvbnRlbnRJbmZvKTsKIH0KIAogc3RhdGljIGludAogRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfQ29udmVydChQeU9iamVjdCAqdiwgRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZPJikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZpdHNlbGYtPnByb3BlcnR5RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX0NvbnZlcnQsICZpdHNlbGYtPmhlYWRlckJ0bkRlc2MpOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKE8mTyYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZpdHNlbGYtPnByb3BlcnR5RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfQ29udmVydCwgJml0c2VsZi0+aGVhZGVyQnRuRGVzYyk7CiB9CiAKIC8qIFRyYWNrQ29udHJvbCBhbmQgSGFuZGxlQ29udHJvbENsaWNrIGNhbGxiYWNrIHN1cHBvcnQgKi8KQEAgLTEzOSwzNjgzICsxMzksMzY4MyBAQAogI2RlZmluZSBDdGxPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ29udHJvbF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDb250cm9sX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDb250cm9sT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ29udHJvbEhhbmRsZSBvYl9pdHNlbGY7Ci0JUHlPYmplY3QgKm9iX2NhbGxiYWNrZGljdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ29udHJvbEhhbmRsZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3QgKm9iX2NhbGxiYWNrZGljdDsKIH0gQ29udHJvbE9iamVjdDsKIAogUHlPYmplY3QgKkN0bE9ial9OZXcoQ29udHJvbEhhbmRsZSBpdHNlbGYpCiB7Ci0JQ29udHJvbE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCVNldENvbnRyb2xSZWZlcmVuY2UoaXRzZWxmLCAobG9uZylpdCk7Ci0JaXQtPm9iX2NhbGxiYWNrZGljdCA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENvbnRyb2xPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDb250cm9sT2JqZWN0LCAmQ29udHJvbF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBTZXRDb250cm9sUmVmZXJlbmNlKGl0c2VsZiwgKGxvbmcpaXQpOworICAgIGl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEN0bE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sSGFuZGxlICpwX2l0c2VsZikKIHsKLQlpZiAoIUN0bE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb250cm9sIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENvbnRyb2xPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ3RsT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvbnRyb2wgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ29udHJvbE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEN0bE9ial9kZWFsbG9jKENvbnRyb2xPYmplY3QgKnNlbGYpCiB7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFja2RpY3QpOwotCWlmIChzZWxmLT5vYl9pdHNlbGYpU2V0Q29udHJvbFJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFja2RpY3QpOworICAgIGlmIChzZWxmLT5vYl9pdHNlbGYpU2V0Q29udHJvbFJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0hpbGl0ZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbFBhcnRDb2RlIGhpbGl0ZVN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sUGFydENvZGUgaGlsaXRlU3RhdGU7CiAjaWZuZGVmIEhpbGl0ZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWxpdGVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWxpdGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBoaWxpdGVTdGF0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWxpdGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBoaWxpdGVTdGF0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TaG93Q29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNob3dDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93Q29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGlkZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBIaWRlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEhpZGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWRlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzQ29udHJvbEFjdGl2ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzQ29udHJvbEFjdGl2ZQotCVB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEFjdGl2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNDb250cm9sQWN0aXZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0NvbnRyb2xBY3RpdmUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzQ29udHJvbEFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSXNDb250cm9sVmlzaWJsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzQ29udHJvbFZpc2libGUKLQlQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xWaXNpYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xWaXNpYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0NvbnRyb2xWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0NvbnRyb2xWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9BY3RpdmF0ZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQWN0aXZhdGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQWN0aXZhdGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBY3RpdmF0ZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBY3RpdmF0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBY3RpdmF0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0RlYWN0aXZhdGVDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIERlYWN0aXZhdGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soRGVhY3RpdmF0ZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKERlYWN0aXZhdGVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVhY3RpdmF0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWFjdGl2YXRlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFZpc2liaWxpdHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlCb29sZWFuIGluSXNWaXNpYmxlOwotCUJvb2xlYW4gaW5Eb0RyYXc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQm9vbGVhbiBpbklzVmlzaWJsZTsKKyAgICBCb29sZWFuIGluRG9EcmF3OwogI2lmbmRlZiBTZXRDb250cm9sVmlzaWJpbGl0eQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xWaXNpYmlsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVmlzaWJpbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzVmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRG9EcmF3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldENvbnRyb2xWaXNpYmlsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNWaXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRvRHJhdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc1Zpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRvRHJhdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sVmlzaWJpbGl0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Eb0RyYXcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Jc0NvbnRyb2xFbmFibGVkKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNDb250cm9sRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzQ29udHJvbEVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzQ29udHJvbEVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0VuYWJsZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRW5hYmxlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmFibGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW5hYmxlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfRGlzYWJsZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgRGlzYWJsZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEaXNhYmxlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERpc2FibGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9EcmF3MUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEcmF3MUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhEcmF3MUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXcxQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRHJhdzFDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhdzFDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0QmVzdENvbnRyb2xSZWN0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmVjdCBvdXRSZWN0OwotCVNJbnQxNiBvdXRCYXNlTGluZU9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZWN0IG91dFJlY3Q7CisgICAgU0ludDE2IG91dEJhc2VMaW5lT2Zmc2V0OwogI2lmbmRlZiBHZXRCZXN0Q29udHJvbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhHZXRCZXN0Q29udHJvbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEJlc3RDb250cm9sUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEJlc3RDb250cm9sUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QmFzZUxpbmVPZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRCYXNlTGluZU9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRCZXN0Q29udHJvbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJhc2VMaW5lT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QmFzZUxpbmVPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sRm9udFN0eWxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbEZvbnRTdHlsZVJlYyBpblN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xGb250U3R5bGVSZWMgaW5TdHlsZTsKICNpZm5kZWYgU2V0Q29udHJvbEZvbnRTdHlsZQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xGb250U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xGb250U3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpblN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldENvbnRyb2xGb250U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpblN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xGb250U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0RyYXdDb250cm9sSW5DdXJyZW50UG9ydChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERyYXdDb250cm9sSW5DdXJyZW50UG9ydAotCVB5TWFjX1BSRUNIRUNLKERyYXdDb250cm9sSW5DdXJyZW50UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmF3Q29udHJvbEluQ3VycmVudFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3Q29udHJvbEluQ3VycmVudFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRVcENvbnRyb2xCYWNrZ3JvdW5kKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CiAjaWZuZGVmIFNldFVwQ29udHJvbEJhY2tncm91bmQKLQlQeU1hY19QUkVDSEVDSyhTZXRVcENvbnRyb2xCYWNrZ3JvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRVcENvbnRyb2xCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VXBDb250cm9sQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFVwQ29udHJvbEJhY2tncm91bmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldFVwQ29udHJvbFRleHRDb2xvcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkRlcHRoOworICAgIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOwogI2lmbmRlZiBTZXRVcENvbnRyb2xUZXh0Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRVcENvbnRyb2xUZXh0Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFVwQ29udHJvbFRleHRDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFVwQ29udHJvbFRleHRDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRVcENvbnRyb2xUZXh0Q29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9EcmFnQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBzdGFydFBvaW50OwotCVJlY3QgbGltaXRSZWN0OwotCVJlY3Qgc2xvcFJlY3Q7Ci0JRHJhZ0NvbnN0cmFpbnQgYXhpczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgc3RhcnRQb2ludDsKKyAgICBSZWN0IGxpbWl0UmVjdDsKKyAgICBSZWN0IHNsb3BSZWN0OworICAgIERyYWdDb25zdHJhaW50IGF4aXM7CiAjaWZuZGVmIERyYWdDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soRHJhZ0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYWdDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZsaW1pdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzbG9wUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF4aXMpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmFnQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIHN0YXJ0UG9pbnQsCi0JICAgICAgICAgICAgJmxpbWl0UmVjdCwKLQkgICAgICAgICAgICAmc2xvcFJlY3QsCi0JICAgICAgICAgICAgYXhpcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZsaW1pdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzbG9wUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF4aXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmFnQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgJmxpbWl0UmVjdCwKKyAgICAgICAgICAgICAgICAmc2xvcFJlY3QsCisgICAgICAgICAgICAgICAgYXhpcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9UZXN0Q29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sUGFydENvZGUgX3J2OwotCVBvaW50IHRlc3RQb2ludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbFBhcnRDb2RlIF9ydjsKKyAgICBQb2ludCB0ZXN0UG9pbnQ7CiAjaWZuZGVmIFRlc3RDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soVGVzdENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKFRlc3RDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXN0Q29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHRlc3RQb2ludCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQb2ludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRlc3RDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGVzdFBvaW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2soQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBpbldoZXJlOwotCUJvb2xlYW4gbWVudURpc3BsYXllZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBpbldoZXJlOworICAgIEJvb2xlYW4gbWVudURpc3BsYXllZDsKICNpZm5kZWYgSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2sKLQlQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluV2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVEaXNwbGF5ZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG1lbnVEaXNwbGF5ZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbldoZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhhbmRsZUNvbnRyb2xDb250ZXh0dWFsTWVudUNsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51RGlzcGxheWVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZW51RGlzcGxheWVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IGluV2hlcmU7Ci0JRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnM7Ci0JQ2xpY2tBY3RpdmF0aW9uUmVzdWx0IG91dFJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBpbldoZXJlOworICAgIEV2ZW50TW9kaWZpZXJzIGluTW9kaWZpZXJzOworICAgIENsaWNrQWN0aXZhdGlvblJlc3VsdCBvdXRSZXN1bHQ7CiAjaWZuZGVmIEdldENvbnRyb2xDbGlja0FjdGl2YXRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQ2xpY2tBY3RpdmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQ2xpY2tBY3RpdmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5XaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbnRyb2xDbGlja0FjdGl2YXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbldoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Nb2RpZmllcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGFuZGxlQ29udHJvbEtleShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sUGFydENvZGUgX3J2OwotCVNJbnQxNiBpbktleUNvZGU7Ci0JU0ludDE2IGluQ2hhckNvZGU7Ci0JRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xQYXJ0Q29kZSBfcnY7CisgICAgU0ludDE2IGluS2V5Q29kZTsKKyAgICBTSW50MTYgaW5DaGFyQ29kZTsKKyAgICBFdmVudE1vZGlmaWVycyBpbk1vZGlmaWVyczsKICNpZm5kZWYgSGFuZGxlQ29udHJvbEtleQotCVB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xLZXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluS2V5Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhckNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGlmaWVycykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEhhbmRsZUNvbnRyb2xLZXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluS2V5Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhckNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhhbmRsZUNvbnRyb2xLZXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGlmaWVycyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0hhbmRsZUNvbnRyb2xTZXRDdXJzb3IoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBsb2NhbFBvaW50OwotCUV2ZW50TW9kaWZpZXJzIG1vZGlmaWVyczsKLQlCb29sZWFuIGN1cnNvcldhc1NldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBsb2NhbFBvaW50OworICAgIEV2ZW50TW9kaWZpZXJzIG1vZGlmaWVyczsKKyAgICBCb29sZWFuIGN1cnNvcldhc1NldDsKICNpZm5kZWYgSGFuZGxlQ29udHJvbFNldEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xTZXRDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xTZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2NhbFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhhbmRsZUNvbnRyb2xTZXRDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29yV2FzU2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBjdXJzb3JXYXNTZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jYWxQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIYW5kbGVDb250cm9sU2V0Q3Vyc29yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnNvcldhc1NldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yV2FzU2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfTW92ZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IGg7Ci0JU0ludDE2IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBoOworICAgIFNJbnQxNiB2OwogI2lmbmRlZiBNb3ZlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKE1vdmVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCU1vdmVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgaCwKLQkgICAgICAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIGgsCisgICAgICAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TaXplQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgdzsKLQlTSW50MTYgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHc7CisgICAgU0ludDE2IGg7CiAjaWZuZGVmIFNpemVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soU2l6ZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKFNpemVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJncsCi0JICAgICAgICAgICAgICAgICAgICAgICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2l6ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICB3LAotCSAgICAgICAgICAgIGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNpemVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICBoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xUaXRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgdGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSB0aXRsZTsKICNpZm5kZWYgU2V0Q29udHJvbFRpdGxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFRpdGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVGl0bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIHRpdGxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbFRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHRpdGxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xUaXRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgdGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSB0aXRsZTsKICNpZm5kZWYgR2V0Q29udHJvbFRpdGxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFRpdGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sVGl0bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldENvbnRyb2xUaXRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aXRsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgdGl0bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRDb250cm9sVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdGl0bGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIHRpdGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CiAjaWZuZGVmIFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIG91dFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CiAjaWZuZGVmIENvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sVmFsdWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgbmV3VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBuZXdWYWx1ZTsKICNpZm5kZWYgU2V0Q29udHJvbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sVmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbE1pbmltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbE1pbmltdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sTWluaW11bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbE1pbmltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sTWluaW11bShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbE1pbmltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IG5ld01pbmltdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBuZXdNaW5pbXVtOwogI2lmbmRlZiBTZXRDb250cm9sTWluaW11bQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xNaW5pbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sTWluaW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01pbmltdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sTWluaW11bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIG5ld01pbmltdW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01pbmltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sTWluaW11bShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIG5ld01pbmltdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbE1heGltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbE1heGltdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sTWF4aW11bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbE1heGltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sTWF4aW11bShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbE1heGltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IG5ld01heGltdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBuZXdNYXhpbXVtOwogI2lmbmRlZiBTZXRDb250cm9sTWF4aW11bQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xNYXhpbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sTWF4aW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01heGltdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sTWF4aW11bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIG5ld01heGltdW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01heGltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sTWF4aW11bShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIG5ld01heGltdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFZpZXdTaXplKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xWaWV3U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xWaWV3U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFZpZXdTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sVmlld1NpemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xWaWV3U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFZpZXdTaXplKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBuZXdWaWV3U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIG5ld1ZpZXdTaXplOwogI2lmbmRlZiBTZXRDb250cm9sVmlld1NpemUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVmlld1NpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xWaWV3U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1ZpZXdTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFZpZXdTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIG5ld1ZpZXdTaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdWaWV3U2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xWaWV3U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3U2l6ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sMzJCaXRWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sMzJCaXRWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2wzMkJpdFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbDMyQml0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2wzMkJpdFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sMzJCaXRWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgbmV3VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBuZXdWYWx1ZTsKICNpZm5kZWYgU2V0Q29udHJvbDMyQml0VmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sMzJCaXRWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbDMyQml0VmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2wzMkJpdFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgbmV3VmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1ZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbDMyQml0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sMzJCaXRNYXhpbXVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2wzMkJpdE1heGltdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRNYXhpbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRNYXhpbXVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sMzJCaXRNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sMzJCaXRNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sMzJCaXRNYXhpbXVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBuZXdNYXhpbXVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgbmV3TWF4aW11bTsKICNpZm5kZWYgU2V0Q29udHJvbDMyQml0TWF4aW11bQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2wzMkJpdE1heGltdW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2wzMkJpdE1heGltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNYXhpbXVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbDMyQml0TWF4aW11bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgbmV3TWF4aW11bSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TWF4aW11bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2wzMkJpdE1heGltdW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01heGltdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbDMyQml0TWluaW11bShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sMzJCaXRNaW5pbXVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbDMyQml0TWluaW11bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbDMyQml0TWluaW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbDMyQml0TWluaW11bShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbDMyQml0TWluaW11bShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbDMyQml0TWluaW11bShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgbmV3TWluaW11bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIG5ld01pbmltdW07CiAjaWZuZGVmIFNldENvbnRyb2wzMkJpdE1pbmltdW0KLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sMzJCaXRNaW5pbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sMzJCaXRNaW5pbXVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TWluaW11bSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2wzMkJpdE1pbmltdW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIG5ld01pbmltdW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01pbmltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sMzJCaXRNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNaW5pbXVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzVmFsaWRDb250cm9sSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNWYWxpZENvbnRyb2xIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhJc1ZhbGlkQ29udHJvbEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZENvbnRyb2xIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzVmFsaWRDb250cm9sSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1ZhbGlkQ29udHJvbEhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbElEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ29udHJvbElEIGluSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ29udHJvbElEIGluSUQ7CiAjaWZuZGVmIFNldENvbnRyb2xJRAotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlDb250cm9sSURfQ29udmVydCwgJmluSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmaW5JRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRyb2xJRF9Db252ZXJ0LCAmaW5JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpbklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbElEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ29udHJvbElEIG91dElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENvbnRyb2xJRCBvdXRJRDsKICNpZm5kZWYgR2V0Q29udHJvbElECi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZvdXRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5Q29udHJvbElEX05ldywgJm91dElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJm91dElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb250cm9sSURfTmV3LCAmb3V0SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sQ29tbWFuZElEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbkNvbW1hbmRJRDsKICNpZm5kZWYgU2V0Q29udHJvbENvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xDb21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRDb250cm9sQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q29udHJvbENvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbENvbW1hbmRJRChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBvdXRDb21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIG91dENvbW1hbmRJRDsKICNpZm5kZWYgR2V0Q29udHJvbENvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xDb21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbW1hbmRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q29tbWFuZElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xDb21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29tbWFuZElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDb21tYW5kSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9SZW1vdmVDb250cm9sUHJvcGVydHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKICNpZm5kZWYgUmVtb3ZlQ29udHJvbFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlQ29udHJvbFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVDb250cm9sUHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlQ29udHJvbFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlQ29udHJvbFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBVSW50MzIgYXR0cmlidXRlczsKICNpZm5kZWYgR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0NoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlc1RvU2V0OwotCVVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBVSW50MzIgYXR0cmlidXRlc1RvU2V0OworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKICNpZm5kZWYgQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKENoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb1NldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb0NsZWFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb0NsZWFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvQ2xlYXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvQ2xlYXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sUmVnaW9uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZ25IYW5kbGUgb3V0UmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmduSGFuZGxlIG91dFJlZ2lvbjsKICNpZm5kZWYgR2V0Q29udHJvbFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZWdpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0UmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UmVnaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFZhcmlhbnQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbFZhcmlhbnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sVmFyaWFudCBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xWYXJpYW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFZhcmlhbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xWYXJpYW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sVmFyaWFudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbFZhcmlhbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xBY3Rpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUHlPYmplY3QqIGFjdGlvblByb2M7Ci0JVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCogYWN0aW9uUHJvYzsKKyAgICBVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7CiAjaWZuZGVmIFNldENvbnRyb2xBY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sQWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sQWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uUHJvYykpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xBY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlzZXRjYWxsYmFjaygoUHlPYmplY3QqKV9zZWxmLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYWN0aW9uUHJvYywgJmNfY2FsbGJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uUHJvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xBY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICBzZXRjYWxsYmFjaygoUHlPYmplY3QqKV9zZWxmLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYWN0aW9uUHJvYywgJmNfY2FsbGJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sUmVmZXJlbmNlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgZGF0YTsKICNpZm5kZWYgU2V0Q29udHJvbFJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFJlZmVyZW5jZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfRW1iZWRDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbEhhbmRsZSBpbkNvbnRhaW5lcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBDb250cm9sSGFuZGxlIGluQ29udGFpbmVyOwogI2lmbmRlZiBFbWJlZENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhFbWJlZENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEVtYmVkQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW1iZWRDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbkNvbnRhaW5lcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udGFpbmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVtYmVkQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5Db250YWluZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9BdXRvRW1iZWRDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKICNpZm5kZWYgQXV0b0VtYmVkQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEF1dG9FbWJlZENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEF1dG9FbWJlZENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEF1dG9FbWJlZENvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEF1dG9FbWJlZENvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldFN1cGVyQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xIYW5kbGUgb3V0UGFyZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xIYW5kbGUgb3V0UGFyZW50OwogI2lmbmRlZiBHZXRTdXBlckNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhHZXRTdXBlckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFN1cGVyQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFN1cGVyQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcmVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dFBhcmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTdXBlckNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQYXJlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRQYXJlbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Db3VudFN1YkNvbnRyb2xzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDE2IG91dE51bUNoaWxkcmVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQxNiBvdXROdW1DaGlsZHJlbjsKICNpZm5kZWYgQ291bnRTdWJDb250cm9scwotCVB5TWFjX1BSRUNIRUNLKENvdW50U3ViQ29udHJvbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50U3ViQ29udHJvbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3VudFN1YkNvbnRyb2xzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dE51bUNoaWxkcmVuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXROdW1DaGlsZHJlbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3VudFN1YkNvbnRyb2xzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE51bUNoaWxkcmVuKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXROdW1DaGlsZHJlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldEluZGV4ZWRTdWJDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDE2IGluSW5kZXg7Ci0JQ29udHJvbEhhbmRsZSBvdXRTdWJDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQxNiBpbkluZGV4OworICAgIENvbnRyb2xIYW5kbGUgb3V0U3ViQ29udHJvbDsKICNpZm5kZWYgR2V0SW5kZXhlZFN1YkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhHZXRJbmRleGVkU3ViQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SW5kZXhlZFN1YkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEluZGV4ZWRTdWJDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdWJDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0U3ViQ29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEluZGV4ZWRTdWJDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdWJDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0U3ViQ29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xTdXBlcnZpc29yKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbEhhbmRsZSBpbkJvc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbEhhbmRsZSBpbkJvc3M7CiAjaWZuZGVmIFNldENvbnRyb2xTdXBlcnZpc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFN1cGVydmlzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xTdXBlcnZpc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkJvc3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbFN1cGVydmlzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Cb3NzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Cb3NzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xTdXBlcnZpc29yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQm9zcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xGZWF0dXJlcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVJbnQzMiBvdXRGZWF0dXJlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVSW50MzIgb3V0RmVhdHVyZXM7CiAjaWZuZGVmIEdldENvbnRyb2xGZWF0dXJlcwotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xGZWF0dXJlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbEZlYXR1cmVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbEZlYXR1cmVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmVhdHVyZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZlYXR1cmVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xGZWF0dXJlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZlYXR1cmVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGZWF0dXJlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xEYXRhU2l6ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7Ci0JUmVzVHlwZSBpblRhZ05hbWU7Ci0JU2l6ZSBvdXRNYXhTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgU2l6ZSBvdXRNYXhTaXplOwogI2lmbmRlZiBHZXRDb250cm9sRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sRGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xEYXRhU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWF4U2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0TWF4U2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1heFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1heFNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRHJhZ1RyYWNraW5nTWVzc2FnZSBpbk1lc3NhZ2U7Ci0JRHJhZ1JlZmVyZW5jZSBpbkRyYWc7Ci0JQm9vbGVhbiBvdXRMaWtlc0RyYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRHJhZ1RyYWNraW5nTWVzc2FnZSBpbk1lc3NhZ2U7CisgICAgRHJhZ1JlZmVyZW5jZSBpbkRyYWc7CisgICAgQm9vbGVhbiBvdXRMaWtlc0RyYWc7CiAjaWZuZGVmIEhhbmRsZUNvbnRyb2xEcmFnVHJhY2tpbmcKLQlQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmluRHJhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TGlrZXNEcmFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRMaWtlc0RyYWcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmluRHJhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TGlrZXNEcmFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRMaWtlc0RyYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEcmFnUmVmZXJlbmNlIGluRHJhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEcmFnUmVmZXJlbmNlIGluRHJhZzsKICNpZm5kZWYgSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlCi0JUHlNYWNfUFJFQ0hFQ0soSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX0NvbnZlcnQsICZpbkRyYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRyYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaW5EcmFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhhbmRsZUNvbnRyb2xEcmFnUmVjZWl2ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EcmFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGluVHJhY2tzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5UcmFja3M7CiAjaWZuZGVmIFNldENvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UcmFja3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UcmFja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Jc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBvdXRUcmFja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBvdXRUcmFja3M7CiAjaWZuZGVmIElzQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSXNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFRyYWNrcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRyYWNrcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHJhY2tzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbEJvdW5kcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIEdldENvbnRyb2xCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRDb250cm9sQm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldENvbnRyb2xCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSXNDb250cm9sSGlsaXRlZChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzQ29udHJvbEhpbGl0ZWQKLQlQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xIaWxpdGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xIaWxpdGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0NvbnRyb2xIaWxpdGVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0NvbnRyb2xIaWxpdGVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sSGlsaXRlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQxNiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xIaWxpdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sSGlsaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sSGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sSGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sSGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sT3duZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbE93bmVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbE93bmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sT3duZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xPd25lcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xPd25lcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xEYXRhSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xEYXRhSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbERhdGFIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xEYXRhSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sRGF0YUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xEYXRhSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFBvcHVwTWVudUlEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sUG9wdXBNZW51SUQKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUG9wdXBNZW51SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQb3B1cE1lbnVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbFBvcHVwTWVudUlEKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sUG9wdXBNZW51SUQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xEYXRhSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBkYXRhSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgZGF0YUhhbmRsZTsKICNpZm5kZWYgU2V0Q29udHJvbERhdGFIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sRGF0YUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbERhdGFIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFIYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sRGF0YUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFIYW5kbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xEYXRhSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sQm91bmRzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgU2V0Q29udHJvbEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIHBvcHVwTWVudTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBwb3B1cE1lbnU7CiAjaWZuZGVmIFNldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmcG9wdXBNZW51KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdXBNZW51KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZwb3B1cE1lbnUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cE1lbnUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFBvcHVwTWVudUlEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IG1lbnVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbWVudUlEOwogI2lmbmRlZiBTZXRDb250cm9sUG9wdXBNZW51SUQKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sUG9wdXBNZW51SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xQb3B1cE1lbnVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xQb3B1cE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xQb3B1cE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgb3V0VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IG91dFZhbHVlOwogI2lmbmRlZiBHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKEdldEJldmVsQnV0dG9uTWVudVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEJldmVsQnV0dG9uTWVudVZhbHVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRWYWx1ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0VmFsdWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFZhbHVlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRWYWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldEJldmVsQnV0dG9uTWVudVZhbHVlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluVmFsdWU7CiAjaWZuZGVmIFNldEJldmVsQnV0dG9uTWVudVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEJldmVsQnV0dG9uTWVudVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZhbHVlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WYWx1ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldEJldmVsQnV0dG9uTWVudUhhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1lbnVIYW5kbGUgb3V0SGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1lbnVIYW5kbGUgb3V0SGFuZGxlOwogI2lmbmRlZiBHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEJldmVsQnV0dG9uTWVudUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEJldmVsQnV0dG9uTWVudUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QmV2ZWxCdXR0b25NZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGFuZGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dEhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldEJldmVsQnV0dG9uQ29udGVudEluZm8oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQ7CiAjaWZuZGVmIFNldEJldmVsQnV0dG9uQ29udGVudEluZm8KLQlQeU1hY19QUkVDSEVDSyhTZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkNvbnRlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRlbnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkNvbnRlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRCZXZlbEJ1dHRvblRyYW5zZm9ybShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CiAjaWZuZGVmIFNldEJldmVsQnV0dG9uVHJhbnNmb3JtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEJldmVsQnV0dG9uVHJhbnNmb3JtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEJldmVsQnV0dG9uVHJhbnNmb3JtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluVmFsdWU7CiAjaWZuZGVmIFNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRUYWJDb250ZW50UmVjdChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3Qgb3V0Q29udGVudFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCBvdXRDb250ZW50UmVjdDsKICNpZm5kZWYgR2V0VGFiQ29udGVudFJlY3QKLQlQeU1hY19QUkVDSEVDSyhHZXRUYWJDb250ZW50UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGFiQ29udGVudFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUYWJDb250ZW50UmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udGVudFJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRDb250ZW50UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUYWJDb250ZW50UmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udGVudFJlY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRDb250ZW50UmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldFRhYkVuYWJsZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5UYWJUb0hpbGl0ZTsKLQlCb29sZWFuIGluRW5hYmxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5UYWJUb0hpbGl0ZTsKKyAgICBCb29sZWFuIGluRW5hYmxlZDsKICNpZm5kZWYgU2V0VGFiRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKFNldFRhYkVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRhYkVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UYWJUb0hpbGl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRW5hYmxlZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUYWJFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5UYWJUb0hpbGl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICBpbkVuYWJsZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGFiVG9IaWxpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkVuYWJsZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0VGFiRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFiVG9IaWxpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5FbmFibGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0SW1hZ2VXZWxsQ29udGVudEluZm8oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQ7CiAjaWZuZGVmIFNldEltYWdlV2VsbENvbnRlbnRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VXZWxsQ29udGVudEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEltYWdlV2VsbENvbnRlbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkNvbnRlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0SW1hZ2VXZWxsQ29udGVudEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udGVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmluQ29udGVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRJbWFnZVdlbGxDb250ZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250ZW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0SW1hZ2VXZWxsVHJhbnNmb3JtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblRyYW5zZm9ybVR5cGUgaW5UcmFuc2Zvcm07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblRyYW5zZm9ybVR5cGUgaW5UcmFuc2Zvcm07CiAjaWZuZGVmIFNldEltYWdlV2VsbFRyYW5zZm9ybQotCVB5TWFjX1BSRUNIRUNLKFNldEltYWdlV2VsbFRyYW5zZm9ybSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VXZWxsVHJhbnNmb3JtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UcmFuc2Zvcm0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0SW1hZ2VXZWxsVHJhbnNmb3JtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRyYW5zZm9ybSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRyYW5zZm9ybSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRJbWFnZVdlbGxUcmFuc2Zvcm0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVHJhbnNmb3JtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgc3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHN0eWxlOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclZpZXdTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVmlld1N0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclZpZXdTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVmlld1N0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBzdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclZpZXdTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgc3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclZpZXdTdHlsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBzdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgc3R5bGU7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVmlld1N0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVmlld1N0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9FbmFibGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVVJbnQzMiBjb21tYW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBVSW50MzIgY29tbWFuZDsKICNpZm5kZWYgRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZAotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0V4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbW1hbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbW1hbmQ7CiAjaWZuZGVmIEV4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kCi0JUHlNYWNfUFJFQ0hFQ0soRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEV4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFeGVjdXRlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGZpcnN0OwotCVVJbnQzMiBsYXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBmaXJzdDsKKyAgICBVSW50MzIgbGFzdDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgZmlyc3QsCi0JICAgICAgICAgICAgICAgICAgICAgbGFzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX01vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBkaXJlY3Rpb247Ci0JQm9vbGVhbiBleHRlbmRTZWxlY3Rpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGRpcmVjdGlvbjsKKyAgICBCb29sZWFuIGV4dGVuZFNlbGVjdGlvbjsKICNpZm5kZWYgTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yCi0JUHlNYWNfUFJFQ0hFQ0soTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5kU2VsZWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE1vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kU2VsZWN0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbmRTZWxlY3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRTZWxlY3Rpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9PcGVuRGF0YUJyb3dzZXJDb250YWluZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29udGFpbmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb250YWluZXI7CiAjaWZuZGVmIE9wZW5EYXRhQnJvd3NlckNvbnRhaW5lcgotCVB5TWFjX1BSRUNIRUNLKE9wZW5EYXRhQnJvd3NlckNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9wZW5EYXRhQnJvd3NlckNvbnRhaW5lcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPcGVuRGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0Nsb3NlRGF0YUJyb3dzZXJDb250YWluZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29udGFpbmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb250YWluZXI7CiAjaWZuZGVmIENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIKLQlQeU1hY19QUkVDSEVDSyhDbG9zZURhdGFCcm93c2VyQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZURhdGFCcm93c2VyQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Tb3J0RGF0YUJyb3dzZXJDb250YWluZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29udGFpbmVyOwotCUJvb2xlYW4gc29ydENoaWxkcmVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb250YWluZXI7CisgICAgQm9vbGVhbiBzb3J0Q2hpbGRyZW47CiAjaWZuZGVmIFNvcnREYXRhQnJvd3NlckNvbnRhaW5lcgotCVB5TWFjX1BSRUNIRUNLKFNvcnREYXRhQnJvd3NlckNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU29ydERhdGFCcm93c2VyQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNvcnRDaGlsZHJlbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTb3J0RGF0YUJyb3dzZXJDb250YWluZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRDaGlsZHJlbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc29ydENoaWxkcmVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNvcnREYXRhQnJvd3NlckNvbnRhaW5lcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydENoaWxkcmVuKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb250YWluZXI7Ci0JQm9vbGVhbiByZWN1cnNlOwotCVVJbnQzMiBzdGF0ZTsKLQlIYW5kbGUgaXRlbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbnRhaW5lcjsKKyAgICBCb29sZWFuIHJlY3Vyc2U7CisgICAgVUludDMyIHN0YXRlOworICAgIEhhbmRsZSBpdGVtczsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJJdGVtcwotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VySXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbUNvdW50KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbnRhaW5lcjsKLQlCb29sZWFuIHJlY3Vyc2U7Ci0JVUludDMyIHN0YXRlOwotCVVJbnQzMiBudW1JdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29udGFpbmVyOworICAgIEJvb2xlYW4gcmVjdXJzZTsKKyAgICBVSW50MzIgc3RhdGU7CisgICAgVUludDMyIG51bUl0ZW1zOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckl0ZW1Db3VudAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbUNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckl0ZW1Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VySXRlbUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1JdGVtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtSXRlbXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN1cnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUl0ZW1zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1JdGVtcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JVUludDMyIGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFVJbnQzMiBpdGVtOwogI2lmbmRlZiBJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkCi0JUHlNYWNfUFJFQ0hFQ0soSXNEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHN0YXRlOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbVN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySXRlbVN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9SZXZlYWxEYXRhQnJvd3Nlckl0ZW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcHJvcGVydHlJRDsKLQlVSW50OCBvcHRpb25zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiBwcm9wZXJ0eUlEOworICAgIFVJbnQ4IG9wdGlvbnM7CiAjaWZuZGVmIFJldmVhbERhdGFCcm93c2VySXRlbQotCVB5TWFjX1BSRUNIRUNLKFJldmVhbERhdGFCcm93c2VySXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmV2ZWFsRGF0YUJyb3dzZXJJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV2ZWFsRGF0YUJyb3dzZXJJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmV2ZWFsRGF0YUJyb3dzZXJJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBhY3RpdmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBhY3RpdmU7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBhY3RpdmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBhY3RpdmU7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyQWN0aXZlSXRlbXMKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5zZXRSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5zZXRSZWN0OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5zZXRSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5zZXRSZWN0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zZXRSZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmaW5zZXRSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYXJnZXQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiB0YXJnZXQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFyZ2V0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYXJnZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFyZ2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYXJnZXQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiB0YXJnZXQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFyZ2V0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYXJnZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFyZ2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyU29ydE9yZGVyKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IG9yZGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBvcmRlcjsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNvcnRPcmRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvcmRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclNvcnRPcmRlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclNvcnRPcmRlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyU29ydE9yZGVyKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IG9yZGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBvcmRlcjsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNvcnRPcmRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclNvcnRPcmRlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JkZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG9yZGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyU29ydE9yZGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHRvcDsKLQlVSW50MzIgbGVmdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgdG9wOworICAgIFVJbnQzMiBsZWZ0OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHRvcDsKLQlVSW50MzIgbGVmdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgdG9wOworICAgIFVJbnQzMiBsZWZ0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgdG9wLAotCSAgICAgICAgICAgICAgICAgICAgIGxlZnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaG9yaXo7Ci0JQm9vbGVhbiB2ZXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaG9yaXo7CisgICAgQm9vbGVhbiB2ZXJ0OwogI2lmbmRlZiBTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZob3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZlcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaG9yaXo7Ci0JQm9vbGVhbiB2ZXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaG9yaXo7CisgICAgQm9vbGVhbiB2ZXJ0OwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBob3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICB2ZXJ0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBob3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHByb3BlcnR5OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHByb3BlcnR5OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU29ydFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU29ydFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgc2VsZWN0aW9uRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHNlbGVjdGlvbkZsYWdzOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3Rpb25GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHNlbGVjdGlvbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBzZWxlY3Rpb25GbGFnczsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncwotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBwcm9wZXJ0eTsKLQlVSW50MzIgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHByb3BlcnR5OworICAgIFVJbnQzMiBmbGFnczsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHksCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHByb3BlcnR5OwotCVVJbnQzMiBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgcHJvcGVydHk7CisgICAgVUludDMyIGZsYWdzOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJFZGl0VGV4dChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIHRleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgdGV4dDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJFZGl0VGV4dAotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdFRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdFRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0NvcHlEYXRhQnJvd3NlckVkaXRUZXh0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgdGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiB0ZXh0OwogI2lmbmRlZiBDb3B5RGF0YUJyb3dzZXJFZGl0VGV4dAotCVB5TWFjX1BSRUNIRUNLKENvcHlEYXRhQnJvd3NlckVkaXRUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5RGF0YUJyb3dzZXJFZGl0VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvcHlEYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCB0ZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlEYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCB0ZXh0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJFZGl0VGV4dChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGTXV0YWJsZVN0cmluZ1JlZiB0ZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGTXV0YWJsZVN0cmluZ1JlZiB0ZXh0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlckVkaXRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRleHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJFZGl0VGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlckVkaXRJdGVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDMyIHByb3BlcnR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiBwcm9wZXJ0eTsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJFZGl0SXRlbQotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyRWRpdEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyRWRpdEl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJFZGl0SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRJdGVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDMyIHByb3BlcnR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiBwcm9wZXJ0eTsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJFZGl0SXRlbQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyRWRpdEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyRWRpdEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckVkaXRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckVkaXRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcHJvcGVydHk7Ci0JT1NUeXBlIHBhcnQ7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHByb3BlcnR5OworICAgIE9TVHlwZSBwYXJ0OworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcGFydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOwogI2lmbmRlZiBSZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbgotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgbnVtQ29sdW1uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgbnVtQ29sdW1uczsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUNvbHVtbnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG51bUNvbHVtbnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1Db2x1bW5zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1Db2x1bW5zKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBoaWxpdGVTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaGlsaXRlU3R5bGU7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0eWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaGlsaXRlU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGhpbGl0ZVN0eWxlOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0eWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgd2lkdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDE2IHdpZHRoOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IHdpZHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiB3aWR0aDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpdGVtOwotCVVJbnQxNiBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDE2IGhlaWdodDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibEgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDE2IGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaXRlbTsKKyAgICBVSW50MTYgaGVpZ2h0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKLQlVSW50MTYgd2lkdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbHVtbjsKKyAgICBVSW50MTYgd2lkdGg7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aAotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQxNiB3aWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQxNiB3aWR0aDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1uczsKLQlCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIHZhcmlhYmxlV2lkdGhDb2x1bW5zOworICAgIEJvb2xlYW4gdmFyaWFibGVIZWlnaHRSb3dzOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoQ29sdW1ucywKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSGVpZ2h0Um93cykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aENvbHVtbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVIZWlnaHRSb3dzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSGVpZ2h0Um93cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVIZWlnaHRSb3dzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gdmFyaWFibGVXaWR0aENvbHVtbnM7Ci0JQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1uczsKKyAgICBCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93czsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlV2lkdGhDb2x1bW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUhlaWdodFJvd3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoQ29sdW1ucywKLQkgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUhlaWdodFJvd3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVIZWlnaHRSb3dzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aENvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVIZWlnaHRSb3dzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgcm93OwotCVVJbnQzMiBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiByb3c7CisgICAgVUludDMyIGl0ZW07CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlECi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcm93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3coQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcm93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQzMiByb3c7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdwotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZyb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpdGVtOwotCVVJbnQzMiByb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHJvdzsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHJvdyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQzMiBwb3NpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQzMiBwb3NpdGlvbjsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQzMiBwb3NpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQzMiBwb3NpdGlvbjsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbHVtbjsKKyAgICBVSW50MzIgcHJvcGVydHk7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zCi0JUHlNYWNfUFJFQ0hFQ0soQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEF1dG9TaXplRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbnMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgY29sdW1uRGVzYzsKLQlVSW50MzIgcG9zaXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgY29sdW1uRGVzYzsKKyAgICBVSW50MzIgcG9zaXRpb247CiAjaWZuZGVmIEFkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4KLQlQeU1hY19QUkVDSEVDSyhBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZjb2x1bW5EZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW5EZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19Db252ZXJ0LCAmY29sdW1uRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDE2IGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MTYgaGVpZ2h0OwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VQbGFpbkJhY2tncm91bmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBsYWluQmFja2dyb3VuZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VQbGFpbkJhY2tncm91bmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBsYWluQmFja2dyb3VuZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZVBsYWluQmFja2dyb3VuZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgdXNlUGxhaW5CYWNrZ3JvdW5kKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlUGxhaW5CYWNrZ3JvdW5kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQbGFpbkJhY2tncm91bmQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb2x1bW47Ci0JQm9vbGVhbiBleHBhbmRhYmxlUm93czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3M7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV4cGFuZGFibGVSb3dzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVJvd3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4cGFuZGFibGVSb3dzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVJvd3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb2x1bW47Ci0JQm9vbGVhbiBleHBhbmRhYmxlUm93czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3M7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4cGFuZGFibGVSb3dzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGVSb3dzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHBhbmRhYmxlUm93cyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlUm93cyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlIYW5kbGUgcGF0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBIYW5kbGUgcGF0aDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBhdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwYXRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBwYXRoTGVuZ3RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBwYXRoTGVuZ3RoOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aExlbmd0aCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aExlbmd0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhMZW5ndGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhMZW5ndGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBwcm9wZXJ0eVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHByb3BlcnR5VHlwZTsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBwcm9wZXJ0eVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHByb3BlcnR5VHlwZTsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHByb3BlcnR5VHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHByb3BlcnR5VHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX2FzX1Jlc291cmNlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIGFzX1Jlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soYXNfUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKGFzX1Jlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19SZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFJlY3QoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIEdldENvbnRyb2xSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRDb250cm9sUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICZyZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRDb250cm9sUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICZyZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9EaXNwb3NlQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQkgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgIGlmICggX3NlbGYtPm9iX2l0c2VsZiApIHsKLQkgICAgICAgICAgICAgICAgU2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsgLyogTWFrZSBpdCBmb3JnZXQgYWJvdXQgdXMgKi8KLQkgICAgICAgICAgICAgICAgRGlzcG9zZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCSAgICAgICAgfQotCSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotCSAgICAgICAgX3JlcyA9IFB5X05vbmU7Ci0JICAgICAgICByZXR1cm4gX3JlczsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCBfc2VsZi0+b2JfaXRzZWxmICkgeworICAgICAgICAgICAgU2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsgLyogTWFrZSBpdCBmb3JnZXQgYWJvdXQgdXMgKi8KKyAgICAgICAgICAgIERpc3Bvc2VDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfVHJhY2tDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCUNvbnRyb2xQYXJ0Q29kZSBfcnY7Ci0JUG9pbnQgc3RhcnRQb2ludDsKLQlDb250cm9sQWN0aW9uVVBQIHVwcCA9IDA7Ci0JUHlPYmplY3QgKmNhbGxiYWNrID0gMDsKKyAgICBDb250cm9sUGFydENvZGUgX3J2OworICAgIFBvaW50IHN0YXJ0UG9pbnQ7CisgICAgQ29udHJvbEFjdGlvblVQUCB1cHAgPSAwOworICAgIFB5T2JqZWN0ICpjYWxsYmFjayA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnxPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFBvaW50LCAmY2FsbGJhY2spKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKGNhbGxiYWNrICYmIGNhbGxiYWNrICE9IFB5X05vbmUpIHsKLQkgICAgICAgIGlmIChQeUludF9DaGVjayhjYWxsYmFjaykgJiYgUHlJbnRfQVNfTE9ORyhjYWxsYmFjaykgPT0gLTEpCi0JICAgICAgICAgICAgICAgIHVwcCA9IChDb250cm9sQWN0aW9uVVBQKS0xOwotCSAgICAgICAgZWxzZSB7Ci0JICAgICAgICAgICAgICAgIHNldHRyYWNrZnVuYyhjYWxsYmFjayk7Ci0JICAgICAgICAgICAgICAgIHVwcCA9IG15dHJhY2tlcl91cHA7Ci0JICAgICAgICB9Ci0JfQotCV9ydiA9IFRyYWNrQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBzdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICB1cHApOwotCWNscnRyYWNrZnVuYygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mfE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsICZjYWxsYmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjYWxsYmFjayAmJiBjYWxsYmFjayAhPSBQeV9Ob25lKSB7CisgICAgICAgIGlmIChQeUludF9DaGVjayhjYWxsYmFjaykgJiYgUHlJbnRfQVNfTE9ORyhjYWxsYmFjaykgPT0gLTEpCisgICAgICAgICAgICB1cHAgPSAoQ29udHJvbEFjdGlvblVQUCktMTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZXR0cmFja2Z1bmMoY2FsbGJhY2spOworICAgICAgICAgICAgdXBwID0gbXl0cmFja2VyX3VwcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBfcnYgPSBUcmFja0NvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgdXBwKTsKKyAgICBjbHJ0cmFja2Z1bmMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sQ2xpY2soQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQ29udHJvbFBhcnRDb2RlIF9ydjsKLQlQb2ludCBzdGFydFBvaW50OwotCVNJbnQxNiBtb2RpZmllcnM7Ci0JQ29udHJvbEFjdGlvblVQUCB1cHAgPSAwOwotCVB5T2JqZWN0ICpjYWxsYmFjayA9IDA7CisgICAgQ29udHJvbFBhcnRDb2RlIF9ydjsKKyAgICBQb2ludCBzdGFydFBvaW50OworICAgIFNJbnQxNiBtb2RpZmllcnM7CisgICAgQ29udHJvbEFjdGlvblVQUCB1cHAgPSAwOworICAgIFB5T2JqZWN0ICpjYWxsYmFjayA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmh8TyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQb2ludCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWlmIChjYWxsYmFjayAmJiBjYWxsYmFjayAhPSBQeV9Ob25lKSB7Ci0JICAgICAgICBpZiAoUHlJbnRfQ2hlY2soY2FsbGJhY2spICYmIFB5SW50X0FTX0xPTkcoY2FsbGJhY2spID09IC0xKQotCSAgICAgICAgICAgICAgICB1cHAgPSAoQ29udHJvbEFjdGlvblVQUCktMTsKLQkgICAgICAgIGVsc2UgewotCSAgICAgICAgICAgICAgICBzZXR0cmFja2Z1bmMoY2FsbGJhY2spOwotCSAgICAgICAgICAgICAgICB1cHAgPSBteXRyYWNrZXJfdXBwOwotCSAgICAgICAgfQotCX0KLQlfcnYgPSBIYW5kbGVDb250cm9sQ2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgc3RhcnRQb2ludCwKLQkgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICB1cHApOwotCWNscnRyYWNrZnVuYygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maHxPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoY2FsbGJhY2sgJiYgY2FsbGJhY2sgIT0gUHlfTm9uZSkgeworICAgICAgICBpZiAoUHlJbnRfQ2hlY2soY2FsbGJhY2spICYmIFB5SW50X0FTX0xPTkcoY2FsbGJhY2spID09IC0xKQorICAgICAgICAgICAgdXBwID0gKENvbnRyb2xBY3Rpb25VUFApLTE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2V0dHJhY2tmdW5jKGNhbGxiYWNrKTsKKyAgICAgICAgICAgIHVwcCA9IG15dHJhY2tlcl91cHA7CisgICAgICAgIH0KKyAgICB9CisgICAgX3J2ID0gSGFuZGxlQ29udHJvbENsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgdXBwKTsKKyAgICBjbHJ0cmFja2Z1bmMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sRGF0YShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7Ci0JUmVzVHlwZSBpblRhZ05hbWU7Ci0JU2l6ZSBidWZmZXJTaXplOwotCVB0ciBidWZmZXI7CisgICAgT1NFcnIgX2VycjsKKyAgICBDb250cm9sUGFydENvZGUgaW5QYXJ0OworICAgIFJlc1R5cGUgaW5UYWdOYW1lOworICAgIFNpemUgYnVmZmVyU2l6ZTsKKyAgICBQdHIgYnVmZmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsICZidWZmZXJTaXplKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLCAmYnVmZmVyU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIF9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbERhdGEoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NFcnIgX2VycjsKLQlDb250cm9sUGFydENvZGUgaW5QYXJ0OwotCVJlc1R5cGUgaW5UYWdOYW1lOwotCVNpemUgYnVmZmVyU2l6ZTsKLQlQdHIgYnVmZmVyOwotCVNpemUgb3V0U2l6ZTsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgU2l6ZSBidWZmZXJTaXplOworICAgIFB0ciBidWZmZXI7CisgICAgU2l6ZSBvdXRTaXplOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogYWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBkYXRhICovCi0JX2VyciA9IEdldENvbnRyb2xEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCWJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBidWZmZXJTaXplKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpCi0JICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAvKiBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGRhdGEgKi8KKyAgICBfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCV9lcnIgPSBHZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0U2l6ZSk7CisgICAgX2VyciA9IEdldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKLQkgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwgYnVmZmVyLCBvdXRTaXplKTsKLQlQeU1lbV9ERUwoYnVmZmVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoX2VyciAhPSBub0VycikgeworICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIG91dFNpemUpOworICAgIFB5TWVtX0RFTChidWZmZXIpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xEYXRhX0hhbmRsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7Ci0JUmVzVHlwZSBpblRhZ05hbWU7Ci0JSGFuZGxlIGJ1ZmZlcjsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgSGFuZGxlIGJ1ZmZlcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmJ1ZmZlcikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZidWZmZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCV9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZmZlciksCi0JICAgICAgICAgICAgICAgICAgICAgIChQdHIpJmJ1ZmZlcik7CisgICAgX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFB0cikmYnVmZmVyKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZXNUeXBlIGluVGFnTmFtZTsKLQlTaXplIGJ1ZmZlclNpemU7Ci0JSGFuZGxlIGhkbDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgU2l6ZSBidWZmZXJTaXplOworICAgIEhhbmRsZSBoZGw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBDaGVjayBpdCBpcyBoYW5kbGUtc2l6ZWQgKi8KLQlfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JaWYgKGJ1ZmZlclNpemUgIT0gc2l6ZW9mKEhhbmRsZSkpIHsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJHZXRDb250cm9sRGF0YVNpemUoKSAhPSBzaXplb2YoSGFuZGxlKSIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENoZWNrIGl0IGlzIGhhbmRsZS1zaXplZCAqLworICAgIF9lcnIgPSBHZXRDb250cm9sRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIGlmIChidWZmZXJTaXplICE9IHNpemVvZihIYW5kbGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJHZXRDb250cm9sRGF0YVNpemUoKSAhPSBzaXplb2YoSGFuZGxlKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlfZXJyID0gR2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIYW5kbGUpLAotCSAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZoZGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKKyAgICBfZXJyID0gR2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIYW5kbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZoZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIE9wdFJlc09ial9OZXcsIGhkbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBPcHRSZXNPYmpfTmV3LCBoZGwpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xEYXRhX0NhbGxiYWNrKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZXNUeXBlIGluVGFnTmFtZTsKLQlQeU9iamVjdCAqY2FsbGJhY2s7Ci0JVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbFBhcnRDb2RlIGluUGFydDsKKyAgICBSZXNUeXBlIGluVGFnTmFtZTsKKyAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisgICAgVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCBzZXRjYWxsYmFjaygoUHlPYmplY3QgKilfc2VsZiwgaW5UYWdOYW1lLCBjYWxsYmFjaywgJmNfY2FsbGJhY2spIDwgMCApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX2NhbGxiYWNrKSwKLQkgICAgICAgICAgICAgICAgICAgICAgKFB0cikmY19jYWxsYmFjayk7CisgICAgaWYgKCBzZXRjYWxsYmFjaygoUHlPYmplY3QgKilfc2VsZiwgaW5UYWdOYW1lLCBjYWxsYmFjaywgJmNfY2FsbGJhY2spIDwgMCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNfY2FsbGJhY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZjX2NhbGxiYWNrKTsKIAotCWlmIChfZXJyICE9IG5vRXJyKQotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEN0bE9ial9tZXRob2RzW10gPSB7Ci0JeyJIaWxpdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IaWxpdGVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihDb250cm9sUGFydENvZGUgaGlsaXRlU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJTaG93Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2hvd0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkhpZGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IaWRlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSXNDb250cm9sQWN0aXZlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzQ29udHJvbFZpc2libGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbFZpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkFjdGl2YXRlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfQWN0aXZhdGVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEZWFjdGl2YXRlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRGVhY3RpdmF0ZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xWaXNpYmlsaXR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sVmlzaWJpbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbklzVmlzaWJsZSwgQm9vbGVhbiBpbkRvRHJhdykgLT4gTm9uZSIpfSwKLQl7IklzQ29udHJvbEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbEVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkVuYWJsZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0VuYWJsZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EaXNhYmxlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRHJhdzFDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EcmF3MUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldEJlc3RDb250cm9sUmVjdCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0QmVzdENvbnRyb2xSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dFJlY3QsIFNJbnQxNiBvdXRCYXNlTGluZU9mZnNldCkiKX0sCi0JeyJTZXRDb250cm9sRm9udFN0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRm9udFN0eWxlLCAxLAotCSBQeURvY19TVFIoIihDb250cm9sRm9udFN0eWxlUmVjIGluU3R5bGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3Q29udHJvbEluQ3VycmVudFBvcnQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYXdDb250cm9sSW5DdXJyZW50UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0VXBDb250cm9sQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0VXBDb250cm9sQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAotCXsiU2V0VXBDb250cm9sVGV4dENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRVcENvbnRyb2xUZXh0Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKLQl7IkRyYWdDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EcmFnQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQb2ludCwgUmVjdCBsaW1pdFJlY3QsIFJlY3Qgc2xvcFJlY3QsIERyYWdDb25zdHJhaW50IGF4aXMpIC0+IE5vbmUiKX0sCi0JeyJUZXN0Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfVGVzdENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQb2ludCkgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAotCXsiSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2siLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xDb250ZXh0dWFsTWVudUNsaWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpbldoZXJlKSAtPiAoQm9vbGVhbiBtZW51RGlzcGxheWVkKSIpfSwKLQl7IkdldENvbnRyb2xDbGlja0FjdGl2YXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xDbGlja0FjdGl2YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGluV2hlcmUsIEV2ZW50TW9kaWZpZXJzIGluTW9kaWZpZXJzKSAtPiAoQ2xpY2tBY3RpdmF0aW9uUmVzdWx0IG91dFJlc3VsdCkiKX0sCi0JeyJIYW5kbGVDb250cm9sS2V5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sS2V5LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5LZXlDb2RlLCBTSW50MTYgaW5DaGFyQ29kZSwgRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnMpIC0+IChDb250cm9sUGFydENvZGUgX3J2KSIpfSwKLQl7IkhhbmRsZUNvbnRyb2xTZXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xTZXRDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGxvY2FsUG9pbnQsIEV2ZW50TW9kaWZpZXJzIG1vZGlmaWVycykgLT4gKEJvb2xlYW4gY3Vyc29yV2FzU2V0KSIpfSwKLQl7Ik1vdmVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Nb3ZlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGgsIFNJbnQxNiB2KSAtPiBOb25lIil9LAotCXsiU2l6ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NpemVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdywgU0ludDE2IGgpIC0+IE5vbmUiKX0sCi0JeyJTZXRDb250cm9sVGl0bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xUaXRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHRpdGxlKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbFRpdGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVGl0bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFN0cjI1NSB0aXRsZSkiKX0sCi0JeyJTZXRDb250cm9sVGl0bGVXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDb3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZyIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFN0cmluZykiKX0sCi0JeyJHZXRDb250cm9sVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJTZXRDb250cm9sVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IG5ld1ZhbHVlKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xNaW5pbXVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlNldENvbnRyb2xNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sTWluaW11bSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IG5ld01pbmltdW0pIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sTWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE1heGltdW0sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiU2V0Q29udHJvbE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xNYXhpbXVtLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgbmV3TWF4aW11bSkgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xWaWV3U2l6ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFZpZXdTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IlNldENvbnRyb2xWaWV3U2l6ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFZpZXdTaXplLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgbmV3Vmlld1NpemUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sMzJCaXRWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbDMyQml0VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAotCXsiU2V0Q29udHJvbDMyQml0VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2wzMkJpdFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgbmV3VmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sMzJCaXRNYXhpbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRNYXhpbXVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IlNldENvbnRyb2wzMkJpdE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2wzMkJpdE1heGltdW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdNYXhpbXVtKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbDMyQml0TWluaW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbDMyQml0TWluaW11bSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJTZXRDb250cm9sMzJCaXRNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sMzJCaXRNaW5pbXVtLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgbmV3TWluaW11bSkgLT4gTm9uZSIpfSwKLQl7IklzVmFsaWRDb250cm9sSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc1ZhbGlkQ29udHJvbEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0Q29udHJvbElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sSUQsIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xJRCBpbklEKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xJRCBvdXRJRCkiKX0sCi0JeyJTZXRDb250cm9sQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgb3V0Q29tbWFuZElEKSIpfSwKLQl7IlJlbW92ZUNvbnRyb2xQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfUmVtb3ZlQ29udHJvbFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IChVSW50MzIgYXR0cmlidXRlcykiKX0sCi0JeyJDaGFuZ2VDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9DaGFuZ2VDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcsIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQsIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcikgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xSZWdpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xQYXJ0Q29kZSBpblBhcnQsIFJnbkhhbmRsZSBvdXRSZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sVmFyaWFudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFZhcmlhbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xWYXJpYW50IF9ydikiKX0sCi0JeyJTZXRDb250cm9sQWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sQWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihQeU9iamVjdCogYWN0aW9uUHJvYykgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBkYXRhKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbFJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJFbWJlZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0VtYmVkQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbEhhbmRsZSBpbkNvbnRhaW5lcikgLT4gTm9uZSIpfSwKLQl7IkF1dG9FbWJlZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0F1dG9FbWJlZENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkdldFN1cGVyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0U3VwZXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb250cm9sSGFuZGxlIG91dFBhcmVudCkiKX0sCi0JeyJDb3VudFN1YkNvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3VudFN1YkNvbnRyb2xzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgb3V0TnVtQ2hpbGRyZW4pIil9LAotCXsiR2V0SW5kZXhlZFN1YkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldEluZGV4ZWRTdWJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihVSW50MTYgaW5JbmRleCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0U3ViQ29udHJvbCkiKX0sCi0JeyJTZXRDb250cm9sU3VwZXJ2aXNvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFN1cGVydmlzb3IsIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xIYW5kbGUgaW5Cb3NzKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbEZlYXR1cmVzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRmVhdHVyZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRGZWF0dXJlcykiKX0sCi0JeyJHZXRDb250cm9sRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xEYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbFBhcnRDb2RlIGluUGFydCwgUmVzVHlwZSBpblRhZ05hbWUpIC0+IChTaXplIG91dE1heFNpemUpIil9LAotCXsiSGFuZGxlQ29udHJvbERyYWdUcmFja2luZyIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbERyYWdUcmFja2luZywgMSwKLQkgUHlEb2NfU1RSKCIoRHJhZ1RyYWNraW5nTWVzc2FnZSBpbk1lc3NhZ2UsIERyYWdSZWZlcmVuY2UgaW5EcmFnKSAtPiAoQm9vbGVhbiBvdXRMaWtlc0RyYWcpIil9LAotCXsiSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUsIDEsCi0JIFB5RG9jX1NUUigiKERyYWdSZWZlcmVuY2UgaW5EcmFnKSAtPiBOb25lIil9LAotCXsiU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluVHJhY2tzKSAtPiBOb25lIil9LAotCXsiSXNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBvdXRUcmFja3MpIil9LAotCXsiR2V0Q29udHJvbEJvdW5kcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiSXNDb250cm9sSGlsaXRlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sSGlsaXRlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0Q29udHJvbEhpbGl0ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbEhpbGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IF9ydikiKX0sCi0JeyJHZXRDb250cm9sT3duZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xPd25lciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJHZXRDb250cm9sRGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGFIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q29udHJvbFBvcHVwTWVudUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUG9wdXBNZW51SUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTZXRDb250cm9sRGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGFIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhSGFuZGxlKSAtPiBOb25lIil9LAotCXsiU2V0Q29udHJvbEJvdW5kcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sUG9wdXBNZW51SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIHBvcHVwTWVudSkgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xQb3B1cE1lbnVJRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFBvcHVwTWVudUlELCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtZW51SUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRWYWx1ZSkiKX0sCi0JeyJTZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpblZhbHVlKSAtPiBOb25lIil9LAotCXsiR2V0QmV2ZWxCdXR0b25NZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgb3V0SGFuZGxlKSIpfSwKLQl7IlNldEJldmVsQnV0dG9uQ29udGVudEluZm8iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldEJldmVsQnV0dG9uQ29udGVudEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQpIC0+IE5vbmUiKX0sCi0JeyJTZXRCZXZlbEJ1dHRvblRyYW5zZm9ybSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0sIDEsCi0JIFB5RG9jX1NUUigiKEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKLQl7IlNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5WYWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkdldFRhYkNvbnRlbnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRUYWJDb250ZW50UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvdXRDb250ZW50UmVjdCkiKX0sCi0JeyJTZXRUYWJFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRUYWJFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5UYWJUb0hpbGl0ZSwgQm9vbGVhbiBpbkVuYWJsZWQpIC0+IE5vbmUiKX0sCi0JeyJTZXRJbWFnZVdlbGxDb250ZW50SW5mbyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0SW1hZ2VXZWxsQ29udGVudEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQpIC0+IE5vbmUiKX0sCi0JeyJTZXRJbWFnZVdlbGxUcmFuc2Zvcm0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldEltYWdlV2VsbFRyYW5zZm9ybSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblRyYW5zZm9ybVR5cGUgaW5UcmFuc2Zvcm0pIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclZpZXdTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9TVHlwZSBzdHlsZSkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclZpZXdTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBzdHlsZSkgLT4gTm9uZSIpfSwKLQl7IkVuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0VuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb21tYW5kKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0V4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29tbWFuZCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGZpcnN0LCBVSW50MzIgbGFzdCkiKX0sCi0JeyJNb3ZlRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX01vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGRpcmVjdGlvbiwgQm9vbGVhbiBleHRlbmRTZWxlY3Rpb24pIC0+IE5vbmUiKX0sCi0JeyJPcGVuRGF0YUJyb3dzZXJDb250YWluZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX09wZW5EYXRhQnJvd3NlckNvbnRhaW5lciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lcikgLT4gTm9uZSIpfSwKLQl7IkNsb3NlRGF0YUJyb3dzZXJDb250YWluZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Nsb3NlRGF0YUJyb3dzZXJDb250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIpIC0+IE5vbmUiKX0sCi0JeyJTb3J0RGF0YUJyb3dzZXJDb250YWluZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NvcnREYXRhQnJvd3NlckNvbnRhaW5lciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lciwgQm9vbGVhbiBzb3J0Q2hpbGRyZW4pIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1zLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyLCBCb29sZWFuIHJlY3Vyc2UsIFVJbnQzMiBzdGF0ZSwgSGFuZGxlIGl0ZW1zKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbUNvdW50LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyLCBCb29sZWFuIHJlY3Vyc2UsIFVJbnQzMiBzdGF0ZSkgLT4gKFVJbnQzMiBudW1JdGVtcykiKX0sCi0JeyJJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldERhdGFCcm93c2VySXRlbVN0YXRlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0pIC0+IChVSW50MzIgc3RhdGUpIil9LAotCXsiUmV2ZWFsRGF0YUJyb3dzZXJJdGVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9SZXZlYWxEYXRhQnJvd3Nlckl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHlJRCwgVUludDggb3B0aW9ucykgLT4gTm9uZSIpfSwKLQl7IlNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyQWN0aXZlSXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0aXZlKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBhY3RpdmUpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBpbnNldFJlY3QpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBpbnNldFJlY3QpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgdGFyZ2V0KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgdGFyZ2V0KSIpfSwKLQl7IlNldERhdGFCcm93c2VyU29ydE9yZGVyIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNvcnRPcmRlciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IG9yZGVyKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU29ydE9yZGVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgb3JkZXIpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHRvcCwgVUludDMyIGxlZnQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgdG9wLCBVSW50MzIgbGVmdCkiKX0sCi0JeyJTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBob3JpeiwgQm9vbGVhbiB2ZXJ0KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gaG9yaXosIEJvb2xlYW4gdmVydCkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBwcm9wZXJ0eSkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyU29ydFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIHByb3BlcnR5KSIpfSwKLQl7IlNldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBzZWxlY3Rpb25GbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBzZWxlY3Rpb25GbGFncykiKX0sCi0JeyJTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyUHJvcGVydHlGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHByb3BlcnR5LCBVSW50MzIgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyUHJvcGVydHlGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHByb3BlcnR5KSAtPiAoVUludDMyIGZsYWdzKSIpfSwKLQl7IlNldERhdGFCcm93c2VyRWRpdFRleHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyRWRpdFRleHQsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHRleHQpIC0+IE5vbmUiKX0sCi0JeyJDb3B5RGF0YUJyb3dzZXJFZGl0VGV4dCIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ29weURhdGFCcm93c2VyRWRpdFRleHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIHRleHQpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZNdXRhYmxlU3RyaW5nUmVmIHRleHQpIC0+IE5vbmUiKX0sCi0JeyJTZXREYXRhQnJvd3NlckVkaXRJdGVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlckVkaXRJdGVtLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJFZGl0SXRlbSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJFZGl0SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGl0ZW0sIFVJbnQzMiBwcm9wZXJ0eSkiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5LCBPU1R5cGUgcGFydCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IlJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9SZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbikgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBudW1Db2x1bW5zKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBoaWxpdGVTdHlsZSkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBoaWxpdGVTdHlsZSkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQxNiBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBoZWlnaHQpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IHdpZHRoKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IHdpZHRoKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKFVJbnQxNiBoZWlnaHQpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4sIFVJbnQxNiB3aWR0aCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiAoVUludDE2IHdpZHRoKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnksIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gdmFyaWFibGVXaWR0aENvbHVtbnMsIEJvb2xlYW4gdmFyaWFibGVIZWlnaHRSb3dzKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1ucywgQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3MpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlELCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgcm93KSAtPiAoVUludDMyIGl0ZW0pIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3csIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcm93KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3csIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoVUludDMyIHJvdykiKX0sCi0JeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29sdW1uLCBVSW50MzIgcG9zaXRpb24pIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiAoVUludDMyIHBvc2l0aW9uKSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MzIgcHJvcGVydHkpIil9LAotCXsiQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyIsIChQeUNGdW5jdGlvbilDdGxPYmpfQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MgY29sdW1uRGVzYywgVUludDMyIHBvc2l0aW9uKSAtPiBOb25lIil9LAotCXsiU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBoZWlnaHQpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiB1c2VQbGFpbkJhY2tncm91bmQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZCkiKX0sCi0JeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4sIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3MpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBjb2x1bW4sIEJvb2xlYW4gZXhwYW5kYWJsZVJvd3MpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHBhdGgpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgcGF0aExlbmd0aCkiKX0sCi0JeyJTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9TVHlwZSBwcm9wZXJ0eVR5cGUpIil9LAotCXsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX2FzX1Jlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldENvbnRyb2xSZWN0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKLQl7IkRpc3Bvc2VDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EaXNwb3NlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVHJhY2tDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9UcmFja0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UG9pbnQgWyx0cmFja2VyY2FsbGJhY2tdKSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCi0JeyJIYW5kbGVDb250cm9sQ2xpY2siLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xDbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQb2ludCwgSW50ZWdlciBtb2RpZmllcnMsIFssdHJhY2tlcmNhbGxiYWNrXSkgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAotCXsiU2V0Q29udHJvbERhdGEiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEYXRhLCAxLAotCSBQeURvY19TVFIoIihzdHVmZikgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xEYXRhIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIocGFydCwgdHlwZSkgLT4gU3RyaW5nIil9LAotCXsiU2V0Q29udHJvbERhdGFfSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YV9IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlc09iaikgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xEYXRhX0hhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGFfSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihwYXJ0LCB0eXBlKSAtPiBSZXNPYmoiKX0sCi0JeyJTZXRDb250cm9sRGF0YV9DYWxsYmFjayIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGFfQ2FsbGJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKGNhbGxiYWNrZnVuYykgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkhpbGl0ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hpbGl0ZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbnRyb2xQYXJ0Q29kZSBoaWxpdGVTdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TaG93Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlkZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hpZGVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJc0NvbnRyb2xBY3RpdmUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbEFjdGl2ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNDb250cm9sVmlzaWJsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sVmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQWN0aXZhdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BY3RpdmF0ZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRlYWN0aXZhdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EZWFjdGl2YXRlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFZpc2liaWxpdHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xWaXNpYmlsaXR5LCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluSXNWaXNpYmxlLCBCb29sZWFuIGluRG9EcmF3KSAtPiBOb25lIil9LAorICAgIHsiSXNDb250cm9sRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRW5hYmxlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW5hYmxlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Rpc2FibGVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3MUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYXcxQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0QmVzdENvbnRyb2xSZWN0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXN0Q29udHJvbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3Qgb3V0UmVjdCwgU0ludDE2IG91dEJhc2VMaW5lT2Zmc2V0KSIpfSwKKyAgICB7IlNldENvbnRyb2xGb250U3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xGb250U3R5bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbnRyb2xGb250U3R5bGVSZWMgaW5TdHlsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdDb250cm9sSW5DdXJyZW50UG9ydCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRVcENvbnRyb2xCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRVcENvbnRyb2xCYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRVcENvbnRyb2xUZXh0Q29sb3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldFVwQ29udHJvbFRleHRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiRHJhZ0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYWdDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFBvaW50LCBSZWN0IGxpbWl0UmVjdCwgUmVjdCBzbG9wUmVjdCwgRHJhZ0NvbnN0cmFpbnQgYXhpcykgLT4gTm9uZSIpfSwKKyAgICB7IlRlc3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9UZXN0Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFBvaW50KSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCisgICAgeyJIYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGluV2hlcmUpIC0+IChCb29sZWFuIG1lbnVEaXNwbGF5ZWQpIil9LAorICAgIHsiR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaW5XaGVyZSwgRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnMpIC0+IChDbGlja0FjdGl2YXRpb25SZXN1bHQgb3V0UmVzdWx0KSIpfSwKKyAgICB7IkhhbmRsZUNvbnRyb2xLZXkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbktleUNvZGUsIFNJbnQxNiBpbkNoYXJDb2RlLCBFdmVudE1vZGlmaWVycyBpbk1vZGlmaWVycykgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAorICAgIHsiSGFuZGxlQ29udHJvbFNldEN1cnNvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbFNldEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgbG9jYWxQb2ludCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzKSAtPiAoQm9vbGVhbiBjdXJzb3JXYXNTZXQpIil9LAorICAgIHsiTW92ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX01vdmVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaCwgU0ludDE2IHYpIC0+IE5vbmUiKX0sCisgICAgeyJTaXplQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2l6ZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB3LCBTSW50MTYgaCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldENvbnRyb2xUaXRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFRpdGxlLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgdGl0bGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sVGl0bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3RyMjU1IHRpdGxlKSIpfSwKKyAgICB7IlNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nKSIpfSwKKyAgICB7IkdldENvbnRyb2xWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgbmV3VmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sTWluaW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE1pbmltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xNaW5pbXVtLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgbmV3TWluaW11bSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xNYXhpbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sTWF4aW11bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sTWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbE1heGltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBuZXdNYXhpbXVtKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbFZpZXdTaXplIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVmlld1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbFZpZXdTaXplIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sVmlld1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdWaWV3U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2wzMkJpdFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sMzJCaXRWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbDMyQml0VmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdWYWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2wzMkJpdE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2wzMkJpdE1heGltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbDMyQml0TWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbDMyQml0TWF4aW11bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIG5ld01heGltdW0pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sMzJCaXRNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRNaW5pbXVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2wzMkJpdE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2wzMkJpdE1pbmltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdNaW5pbXVtKSAtPiBOb25lIil9LAorICAgIHsiSXNWYWxpZENvbnRyb2xIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzVmFsaWRDb250cm9sSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbElEIGluSUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbElEIG91dElEKSIpfSwKKyAgICB7IlNldENvbnRyb2xDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xDb21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xDb21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRDb21tYW5kSUQpIil9LAorICAgIHsiUmVtb3ZlQ29udHJvbFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9SZW1vdmVDb250cm9sUHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gKFVJbnQzMiBhdHRyaWJ1dGVzKSIpfSwKKyAgICB7IkNoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0NoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZywgVUludDMyIGF0dHJpYnV0ZXNUb1NldCwgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbFJlZ2lvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbFBhcnRDb2RlIGluUGFydCwgUmduSGFuZGxlIG91dFJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xWYXJpYW50IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVmFyaWFudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbFZhcmlhbnQgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xBY3Rpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xBY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFB5T2JqZWN0KiBhY3Rpb25Qcm9jKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIGRhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkVtYmVkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW1iZWRDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sSGFuZGxlIGluQ29udGFpbmVyKSAtPiBOb25lIil9LAorICAgIHsiQXV0b0VtYmVkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfQXV0b0VtYmVkQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiR2V0U3VwZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRTdXBlckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0UGFyZW50KSIpfSwKKyAgICB7IkNvdW50U3ViQ29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0NvdW50U3ViQ29udHJvbHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvdXROdW1DaGlsZHJlbikiKX0sCisgICAgeyJHZXRJbmRleGVkU3ViQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0SW5kZXhlZFN1YkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBpbkluZGV4KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRTdWJDb250cm9sKSIpfSwKKyAgICB7IlNldENvbnRyb2xTdXBlcnZpc29yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sU3VwZXJ2aXNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEhhbmRsZSBpbkJvc3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sRmVhdHVyZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xGZWF0dXJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dEZlYXR1cmVzKSIpfSwKKyAgICB7IkdldENvbnRyb2xEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sUGFydENvZGUgaW5QYXJ0LCBSZXNUeXBlIGluVGFnTmFtZSkgLT4gKFNpemUgb3V0TWF4U2l6ZSkiKX0sCisgICAgeyJIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nLCAxLAorICAgICBQeURvY19TVFIoIihEcmFnVHJhY2tpbmdNZXNzYWdlIGluTWVzc2FnZSwgRHJhZ1JlZmVyZW5jZSBpbkRyYWcpIC0+IChCb29sZWFuIG91dExpa2VzRHJhZykiKX0sCisgICAgeyJIYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xEcmFnUmVjZWl2ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRHJhZ1JlZmVyZW5jZSBpbkRyYWcpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5UcmFja3MpIC0+IE5vbmUiKX0sCisgICAgeyJJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIG91dFRyYWNrcykiKX0sCisgICAgeyJHZXRDb250cm9sQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJJc0NvbnRyb2xIaWxpdGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xIaWxpdGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sSGlsaXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgX3J2KSIpfSwKKyAgICB7IkdldENvbnRyb2xPd25lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE93bmVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkdldENvbnRyb2xEYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUG9wdXBNZW51SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sUG9wdXBNZW51SUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xQb3B1cE1lbnVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xEYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFIYW5kbGUpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDb250cm9sQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcykgLT4gTm9uZSIpfSwKKyAgICB7IlNldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgcG9wdXBNZW51KSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFBvcHVwTWVudUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sUG9wdXBNZW51SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IG1lbnVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEJldmVsQnV0dG9uTWVudVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dFZhbHVlKSIpfSwKKyAgICB7IlNldEJldmVsQnV0dG9uTWVudVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluVmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldEJldmVsQnV0dG9uTWVudUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBvdXRIYW5kbGUpIil9LAorICAgIHsiU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEJldmVsQnV0dG9uVHJhbnNmb3JtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRCZXZlbEJ1dHRvblRyYW5zZm9ybSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtKSAtPiBOb25lIil9LAorICAgIHsiU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpblZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGFiQ29udGVudFJlY3QiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldFRhYkNvbnRlbnRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dENvbnRlbnRSZWN0KSIpfSwKKyAgICB7IlNldFRhYkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldFRhYkVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpblRhYlRvSGlsaXRlLCBCb29sZWFuIGluRW5hYmxlZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEltYWdlV2VsbENvbnRlbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRJbWFnZVdlbGxDb250ZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEltYWdlV2VsbFRyYW5zZm9ybSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0SW1hZ2VXZWxsVHJhbnNmb3JtLCAxLAorICAgICBQeURvY19TVFIoIihJY29uVHJhbnNmb3JtVHlwZSBpblRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVmlld1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclZpZXdTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoT1NUeXBlIHN0eWxlKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVmlld1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclZpZXdTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHN0eWxlKSAtPiBOb25lIil9LAorICAgIHsiRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbW1hbmQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJFeGVjdXRlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb21tYW5kKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgZmlyc3QsIFVJbnQzMiBsYXN0KSIpfSwKKyAgICB7Ik1vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgZGlyZWN0aW9uLCBCb29sZWFuIGV4dGVuZFNlbGVjdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7Ik9wZW5EYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyKSAtPiBOb25lIil9LAorICAgIHsiQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lcikgLT4gTm9uZSIpfSwKKyAgICB7IlNvcnREYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfU29ydERhdGFCcm93c2VyQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyLCBCb29sZWFuIHNvcnRDaGlsZHJlbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VySXRlbXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIsIEJvb2xlYW4gcmVjdXJzZSwgVUludDMyIHN0YXRlLCBIYW5kbGUgaXRlbXMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3Nlckl0ZW1Db3VudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIsIEJvb2xlYW4gcmVjdXJzZSwgVUludDMyIHN0YXRlKSAtPiAoVUludDMyIG51bUl0ZW1zKSIpfSwKKyAgICB7IklzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKFVJbnQzMiBzdGF0ZSkiKX0sCisgICAgeyJSZXZlYWxEYXRhQnJvd3Nlckl0ZW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1JldmVhbERhdGFCcm93c2VySXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQzMiBwcm9wZXJ0eUlELCBVSW50OCBvcHRpb25zKSAtPiBOb25lIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBhY3RpdmUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFjdGl2ZSkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGluc2V0UmVjdCkiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGluc2V0UmVjdCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhcmdldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiB0YXJnZXQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhcmdldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiB0YXJnZXQpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyU29ydE9yZGVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgb3JkZXIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclNvcnRPcmRlciIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvcmRlcikiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgdG9wLCBVSW50MzIgbGVmdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiB0b3AsIFVJbnQzMiBsZWZ0KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGhvcml6LCBCb29sZWFuIHZlcnQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBob3JpeiwgQm9vbGVhbiB2ZXJ0KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyU29ydFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIHByb3BlcnR5KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU29ydFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgcHJvcGVydHkpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIHNlbGVjdGlvbkZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIHNlbGVjdGlvbkZsYWdzKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgcHJvcGVydHksIFVJbnQzMiBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgcHJvcGVydHkpIC0+IChVSW50MzIgZmxhZ3MpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJFZGl0VGV4dCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdGV4dCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlEYXRhQnJvd3NlckVkaXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3B5RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgdGV4dCkiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckVkaXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihDRk11dGFibGVTdHJpbmdSZWYgdGV4dCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyRWRpdEl0ZW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyRWRpdEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHkpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckVkaXRJdGVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRJdGVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5KSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHksIE9TVHlwZSBwYXJ0KSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHsiUmVtb3ZlRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW4iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG51bUNvbHVtbnMpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGhpbGl0ZVN0eWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGhpbGl0ZVN0eWxlKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgd2lkdGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgd2lkdGgpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MTYgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbiwgVUludDE2IHdpZHRoKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MTYgd2lkdGgpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1ucywgQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIHZhcmlhYmxlV2lkdGhDb2x1bW5zLCBCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93cykiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1JRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiByb3cpIC0+IChVSW50MzIgaXRlbSkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3ciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQzMiByb3cpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3ciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0pIC0+IChVSW50MzIgcm93KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4sIFVJbnQzMiBwb3NpdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MzIgcG9zaXRpb24pIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbikgLT4gKFVJbnQzMiBwcm9wZXJ0eSkiKX0sCisgICAgeyJBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyBjb2x1bW5EZXNjLCBVSW50MzIgcG9zaXRpb24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gdXNlUGxhaW5CYWNrZ3JvdW5kKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbiwgQm9vbGVhbiBleHBhbmRhYmxlUm93cykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGNvbHVtbiwgQm9vbGVhbiBleHBhbmRhYmxlUm93cykiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgcGF0aCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBwYXRoTGVuZ3RoKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5VHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoT1NUeXBlIHByb3BlcnR5VHlwZSkiKX0sCisgICAgeyJhc19SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfYXNfUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0Q29udHJvbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAorICAgIHsiRGlzcG9zZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Rpc3Bvc2VDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFja0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1RyYWNrQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQb2ludCBbLHRyYWNrZXJjYWxsYmFja10pIC0+IChDb250cm9sUGFydENvZGUgX3J2KSIpfSwKKyAgICB7IkhhbmRsZUNvbnRyb2xDbGljayIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFBvaW50LCBJbnRlZ2VyIG1vZGlmaWVycywgWyx0cmFja2VyY2FsbGJhY2tdKSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sRGF0YSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKHN0dWZmKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbERhdGEiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihwYXJ0LCB0eXBlKSAtPiBTdHJpbmciKX0sCisgICAgeyJTZXRDb250cm9sRGF0YV9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEYXRhX0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzT2JqKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbERhdGFfSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YV9IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHBhcnQsIHR5cGUpIC0+IFJlc09iaiIpfSwKKyAgICB7IlNldENvbnRyb2xEYXRhX0NhbGxiYWNrIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YV9DYWxsYmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2FsbGJhY2tmdW5jKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDdGxPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zODIzLDI4ICszODIzLDI4IEBACiAKIHN0YXRpYyBpbnQgQ3RsT2JqX2NvbXBhcmUoQ29udHJvbE9iamVjdCAqc2VsZiwgQ29udHJvbE9iamVjdCAqb3RoZXIpCiB7Ci0JdW5zaWduZWQgbG9uZyB2LCB3OworICAgIHVuc2lnbmVkIGxvbmcgdiwgdzsKIAotCWlmICghQ3RsT2JqX0NoZWNrKChQeU9iamVjdCAqKW90aGVyKSkKLQl7Ci0JCXY9KHVuc2lnbmVkIGxvbmcpc2VsZjsKLQkJdz0odW5zaWduZWQgbG9uZylvdGhlcjsKLQl9Ci0JZWxzZQotCXsKLQkJdj0odW5zaWduZWQgbG9uZylzZWxmLT5vYl9pdHNlbGY7Ci0JCXc9KHVuc2lnbmVkIGxvbmcpb3RoZXItPm9iX2l0c2VsZjsKLQl9Ci0JaWYoIHYgPCB3ICkgcmV0dXJuIC0xOwotCWlmKCB2ID4gdyApIHJldHVybiAxOwotCXJldHVybiAwOworICAgIGlmICghQ3RsT2JqX0NoZWNrKChQeU9iamVjdCAqKW90aGVyKSkKKyAgICB7CisgICAgICAgIHY9KHVuc2lnbmVkIGxvbmcpc2VsZjsKKyAgICAgICAgdz0odW5zaWduZWQgbG9uZylvdGhlcjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdj0odW5zaWduZWQgbG9uZylzZWxmLT5vYl9pdHNlbGY7CisgICAgICAgIHc9KHVuc2lnbmVkIGxvbmcpb3RoZXItPm9iX2l0c2VsZjsKKyAgICB9CisgICAgaWYoIHYgPCB3ICkgcmV0dXJuIC0xOworICAgIGlmKCB2ID4gdyApIHJldHVybiAxOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIEN0bE9ial9yZXByIE5VTEwKIAogc3RhdGljIGxvbmcgQ3RsT2JqX2hhc2goQ29udHJvbE9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKGxvbmcpc2VsZi0+b2JfaXRzZWxmOworICAgIHJldHVybiAobG9uZylzZWxmLT5vYl9pdHNlbGY7CiB9CiAjZGVmaW5lIEN0bE9ial90cF9pbml0IDAKIApAQCAtMzg1Miw2MSArMzg1Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JQ29udHJvbEhhbmRsZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIENvbnRyb2xIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ3RsT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ29udHJvbE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDdGxPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDb250cm9sT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIEN0bE9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDb250cm9sX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0N0bC5Db250cm9sIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ29udHJvbE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEN0bE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDdGxPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEN0bE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ3RsT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUN0bE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDdGxPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ3RsT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDdGxPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ3RsT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ3RsT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ3RsLkNvbnRyb2wiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDb250cm9sT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ3RsT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEN0bE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ3RsT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDdGxPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ3RsT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEN0bE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDdGxPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEN0bE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDdGxPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDdGxPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENvbnRyb2wgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zOTE0LDE2MTYgKzM5MTQsMTYxNiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9OZXdDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sSGFuZGxlIF9ydjsKLQlXaW5kb3dQdHIgb3duaW5nV2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTdHIyNTUgY29udHJvbFRpdGxlOwotCUJvb2xlYW4gaW5pdGlhbGx5VmlzaWJsZTsKLQlTSW50MTYgaW5pdGlhbFZhbHVlOwotCVNJbnQxNiBtaW5pbXVtVmFsdWU7Ci0JU0ludDE2IG1heGltdW1WYWx1ZTsKLQlTSW50MTYgcHJvY0lEOwotCVNJbnQzMiBjb250cm9sUmVmZXJlbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sSGFuZGxlIF9ydjsKKyAgICBXaW5kb3dQdHIgb3duaW5nV2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTdHIyNTUgY29udHJvbFRpdGxlOworICAgIEJvb2xlYW4gaW5pdGlhbGx5VmlzaWJsZTsKKyAgICBTSW50MTYgaW5pdGlhbFZhbHVlOworICAgIFNJbnQxNiBtaW5pbXVtVmFsdWU7CisgICAgU0ludDE2IG1heGltdW1WYWx1ZTsKKyAgICBTSW50MTYgcHJvY0lEOworICAgIFNJbnQzMiBjb250cm9sUmVmZXJlbmNlOwogI2lmbmRlZiBOZXdDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soTmV3Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiaGhoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJm93bmluZ1dpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY29udHJvbFRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbGx5VmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xSZWZlcmVuY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdDb250cm9sKG93bmluZ1dpbmRvdywKLQkgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgY29udHJvbFRpdGxlLAotCSAgICAgICAgICAgICAgICAgaW5pdGlhbGx5VmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgIG1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgIG1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgIHByb2NJRCwKLQkgICAgICAgICAgICAgICAgIGNvbnRyb2xSZWZlcmVuY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiaGhoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJm93bmluZ1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY29udHJvbFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbGx5VmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xSZWZlcmVuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdDb250cm9sKG93bmluZ1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgY29udHJvbFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGx5VmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIG1heGltdW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIHByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xSZWZlcmVuY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfR2V0TmV3Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbEhhbmRsZSBfcnY7Ci0JU0ludDE2IHJlc291cmNlSUQ7Ci0JV2luZG93UHRyIG93bmluZ1dpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbEhhbmRsZSBfcnY7CisgICAgU0ludDE2IHJlc291cmNlSUQ7CisgICAgV2luZG93UHRyIG93bmluZ1dpbmRvdzsKICNpZm5kZWYgR2V0TmV3Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEdldE5ld0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5ld0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmb3duaW5nV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV3Q29udHJvbChyZXNvdXJjZUlELAotCSAgICAgICAgICAgICAgICAgICAgb3duaW5nV2luZG93KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmb3duaW5nV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV3Q29udHJvbChyZXNvdXJjZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgb3duaW5nV2luZG93KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0RyYXdDb250cm9scyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIHRoZVdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKICNpZm5kZWYgRHJhd0NvbnRyb2xzCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd0NvbnRyb2xzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3Q29udHJvbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCURyYXdDb250cm9scyh0aGVXaW5kb3cpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhd0NvbnRyb2xzKHRoZVdpbmRvdyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9VcGRhdGVDb250cm9scyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJnbkhhbmRsZSBpblVwZGF0ZVJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFJnbkhhbmRsZSBpblVwZGF0ZVJlZ2lvbjsKICNpZm5kZWYgVXBkYXRlQ29udHJvbHMKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVDb250cm9scyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlQ29udHJvbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5VcGRhdGVSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlVcGRhdGVDb250cm9scyhpbldpbmRvdywKLQkgICAgICAgICAgICAgICBpblVwZGF0ZVJlZ2lvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluVXBkYXRlUmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVXBkYXRlQ29udHJvbHMoaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgaW5VcGRhdGVSZWdpb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfRmluZENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xQYXJ0Q29kZSBfcnY7Ci0JUG9pbnQgdGVzdFBvaW50OwotCVdpbmRvd1B0ciB0aGVXaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSB0aGVDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sUGFydENvZGUgX3J2OworICAgIFBvaW50IHRlc3RQb2ludDsKKyAgICBXaW5kb3dQdHIgdGhlV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgdGhlQ29udHJvbDsKICNpZm5kZWYgRmluZENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhGaW5kQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGVzdFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZpbmRDb250cm9sKHRlc3RQb2ludCwKLQkgICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgJnRoZUNvbnRyb2wpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCB0aGVDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmluZENvbnRyb2wodGVzdFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAmdGhlQ29udHJvbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIHRoZUNvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9JZGxlQ29udHJvbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBJZGxlQ29udHJvbHMKLQlQeU1hY19QUkVDSEVDSyhJZGxlQ29udHJvbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKElkbGVDb250cm9scyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlJZGxlQ29udHJvbHMoaW5XaW5kb3cpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJZGxlQ29udHJvbHMoaW5XaW5kb3cpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfR2V0Q29udHJvbEJ5SUQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xJRCBpbklEOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbElEIGluSUQ7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBHZXRDb250cm9sQnlJRAotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xCeUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sQnlJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlDb250cm9sSURfQ29udmVydCwgJmluSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbEJ5SUQoaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklELAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRyb2xJRF9Db252ZXJ0LCAmaW5JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb250cm9sQnlJRChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0R1bXBDb250cm9sSGllcmFyY2h5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlGU1NwZWMgaW5EdW1wRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgRlNTcGVjIGluRHVtcEZpbGU7CiAjaWZuZGVmIER1bXBDb250cm9sSGllcmFyY2h5Ci0JUHlNYWNfUFJFQ0hFQ0soRHVtcENvbnRyb2xIaWVyYXJjaHkpOworICAgIFB5TWFjX1BSRUNIRUNLKER1bXBDb250cm9sSGllcmFyY2h5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZpbkR1bXBGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IER1bXBDb250cm9sSGllcmFyY2h5KGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EdW1wRmlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmluRHVtcEZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHVtcENvbnRyb2xIaWVyYXJjaHkoaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkR1bXBGaWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUm9vdENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVSb290Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJvb3RDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVSb290Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUm9vdENvbnRyb2woaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVJvb3RDb250cm9sKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9HZXRSb290Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIEdldFJvb3RDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Um9vdENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJvb3RDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRSb290Q29udHJvbChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Um9vdENvbnRyb2woaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0dldEtleWJvYXJkRm9jdXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBHZXRLZXlib2FyZEZvY3VzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0S2V5Ym9hcmRGb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0S2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0S2V5Ym9hcmRGb2N1cyhpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRLZXlib2FyZEZvY3VzKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX1NldEtleWJvYXJkRm9jdXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgaW5Db250cm9sOwotCUNvbnRyb2xGb2N1c1BhcnQgaW5QYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIGluQ29udHJvbDsKKyAgICBDb250cm9sRm9jdXNQYXJ0IGluUGFydDsKICNpZm5kZWYgU2V0S2V5Ym9hcmRGb2N1cwotCVB5TWFjX1BSRUNIRUNLKFNldEtleWJvYXJkRm9jdXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEtleWJvYXJkRm9jdXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRLZXlib2FyZEZvY3VzKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0S2V5Ym9hcmRGb2N1cyhpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQWR2YW5jZUtleWJvYXJkRm9jdXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKICNpZm5kZWYgQWR2YW5jZUtleWJvYXJkRm9jdXMKLQlQeU1hY19QUkVDSEVDSyhBZHZhbmNlS2V5Ym9hcmRGb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWR2YW5jZUtleWJvYXJkRm9jdXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkdmFuY2VLZXlib2FyZEZvY3VzKGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWR2YW5jZUtleWJvYXJkRm9jdXMoaW5XaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9SZXZlcnNlS2V5Ym9hcmRGb2N1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBSZXZlcnNlS2V5Ym9hcmRGb2N1cwotCVB5TWFjX1BSRUNIRUNLKFJldmVyc2VLZXlib2FyZEZvY3VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXZlcnNlS2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV2ZXJzZUtleWJvYXJkRm9jdXMoaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXZlcnNlS2V5Ym9hcmRGb2N1cyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NsZWFyS2V5Ym9hcmRGb2N1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBDbGVhcktleWJvYXJkRm9jdXMKLQlQeU1hY19QUkVDSEVDSyhDbGVhcktleWJvYXJkRm9jdXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENsZWFyS2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xlYXJLZXlib2FyZEZvY3VzKGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2xlYXJLZXlib2FyZEZvY3VzKGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUJvb2xlYW4gaW5UcmFja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIEJvb2xlYW4gaW5UcmFja3M7CiAjaWZuZGVmIFNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRyYWNrcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyhpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRyYWNrcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyhpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFja3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9Jc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlCb29sZWFuIG91dFRyYWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQm9vbGVhbiBvdXRUcmFja3M7CiAjaWZuZGVmIElzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFRyYWNrcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3coaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRyYWNrcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHJhY2tzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCVVJbnQxNiB0aGlja25lc3M7Ci0JVUludDE2IGJlaGF2aW9yOwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbmZvOwotCVNJbnQxNiBtZW51SUQ7Ci0JVUludDE2IG1lbnVCZWhhdmlvcjsKLQlVSW50MTYgbWVudVBsYWNlbWVudDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgVUludDE2IHRoaWNrbmVzczsKKyAgICBVSW50MTYgYmVoYXZpb3I7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm87CisgICAgU0ludDE2IG1lbnVJRDsKKyAgICBVSW50MTYgbWVudUJlaGF2aW9yOworICAgIFVJbnQxNiBtZW51UGxhY2VtZW50OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mSEhPJmhISCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhpY2tuZXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmVoYXZpb3IsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVCZWhhdmlvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVQbGFjZW1lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUJlaGF2aW9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudVBsYWNlbWVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mSEhPJmhISCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhpY2tuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmVoYXZpb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVCZWhhdmlvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVQbGFjZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlja25lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUJlaGF2aW9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudVBsYWNlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVNsaWRlckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCVVJbnQxNiBvcmllbnRhdGlvbjsKLQlVSW50MTYgbnVtVGlja01hcmtzOwotCUJvb2xlYW4gbGl2ZVRyYWNraW5nOwotCVB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jOwotCVVuaXZlcnNhbFByb2NQdHIgY19jYWxsYmFjazsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIFVJbnQxNiBvcmllbnRhdGlvbjsKKyAgICBVSW50MTYgbnVtVGlja01hcmtzOworICAgIEJvb2xlYW4gbGl2ZVRyYWNraW5nOworICAgIFB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jOworICAgIFVuaXZlcnNhbFByb2NQdHIgY19jYWxsYmFjazsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVNsaWRlckNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVTbGlkZXJDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVTbGlkZXJDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxISGJPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9yaWVudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtVGlja01hcmtzLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nUHJvYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTbGlkZXJDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGlja01hcmtzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVUcmFja2luZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBteWFjdGlvbnByb2NfdXBwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0Jc2V0Y2FsbGJhY2soX3Jlcywga015Q29udHJvbEFjdGlvblByb2NUYWcsIGxpdmVUcmFja2luZ1Byb2MsICZjX2NhbGxiYWNrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsSEhiTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bVRpY2tNYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZ1Byb2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU2xpZGVyQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRpY2tNYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlVHJhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlhY3Rpb25wcm9jX3VwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHNldGNhbGxiYWNrKF9yZXMsIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBsaXZlVHJhY2tpbmdQcm9jLCAmY19jYWxsYmFjayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCVVJbnQxNiBpbk9yaWVudGF0aW9uOwotCUNGU3RyaW5nUmVmIGluVGl0bGU7Ci0JU0ludDMyIGluSW5pdGlhbFZhbHVlOwotCUJvb2xlYW4gaW5EcmF3VGl0bGU7Ci0JQm9vbGVhbiBpbkF1dG9Ub2dnbGVzOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUmVjdCBpbkJvdW5kc1JlY3Q7CisgICAgVUludDE2IGluT3JpZW50YXRpb247CisgICAgQ0ZTdHJpbmdSZWYgaW5UaXRsZTsKKyAgICBTSW50MzIgaW5Jbml0aWFsVmFsdWU7CisgICAgQm9vbGVhbiBpbkRyYXdUaXRsZTsKKyAgICBCb29sZWFuIGluQXV0b1RvZ2dsZXM7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVEaXNjbG9zdXJlVHJpYW5nbGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSE8mbGJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jbml0aWFsVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdUaXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQXV0b1RvZ2dsZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRyYXdUaXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF1dG9Ub2dnbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhPJmxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5UaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EcmF3VGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF1dG9Ub2dnbGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2woaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EcmF3VGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdXRvVG9nZ2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQcm9ncmVzc0JhckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCUJvb2xlYW4gaW5kZXRlcm1pbmF0ZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIEJvb2xlYW4gaW5kZXRlcm1pbmF0ZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVByb2dyZXNzQmFyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVByb2dyZXNzQmFyQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV0ZXJtaW5hdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV0ZXJtaW5hdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV0ZXJtaW5hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVSZWxldmFuY2VCYXJDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVNJbnQzMiB2YWx1ZTsKLQlTSW50MzIgbWluaW11bTsKLQlTSW50MzIgbWF4aW11bTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCVNJbnQzMiBpbmNyZW1lbnQ7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFNJbnQzMiB2YWx1ZTsKKyAgICBTSW50MzIgbWluaW11bTsKKyAgICBTSW50MzIgbWF4aW11bTsKKyAgICBTSW50MzIgaW5jcmVtZW50OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5jcmVtZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmNyZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVTZXBhcmF0b3JDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVNlcGFyYXRvckNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVTZXBhcmF0b3JDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVTZXBhcmF0b3JDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlU2VwYXJhdG9yQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVNlcGFyYXRvckNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUdyb3VwQm94Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlCb29sZWFuIHByaW1hcnk7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENGU3RyaW5nUmVmIHRpdGxlOworICAgIEJvb2xlYW4gcHJpbWFyeTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUdyb3VwQm94Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUdyb3VwQm94Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlR3JvdXBCb3hDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByaW1hcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlR3JvdXBCb3hDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUdyb3VwQm94Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUNoZWNrR3JvdXBCb3hDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCVNJbnQzMiBpbml0aWFsVmFsdWU7Ci0JQm9vbGVhbiBwcmltYXJ5OwotCUJvb2xlYW4gYXV0b1RvZ2dsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgU0ludDMyIGluaXRpYWxWYWx1ZTsKKyAgICBCb29sZWFuIHByaW1hcnk7CisgICAgQm9vbGVhbiBhdXRvVG9nZ2xlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1RvZ2dsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvVG9nZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dG9Ub2dnbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGl0bGU7Ci0JQm9vbGVhbiBwcmltYXJ5OwotCVNJbnQxNiBtZW51SUQ7Ci0JQm9vbGVhbiB2YXJpYWJsZVdpZHRoOwotCVNJbnQxNiB0aXRsZVdpZHRoOwotCVNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb247Ci0JU3R5bGUgdGl0bGVTdHlsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgQm9vbGVhbiBwcmltYXJ5OworICAgIFNJbnQxNiBtZW51SUQ7CisgICAgQm9vbGVhbiB2YXJpYWJsZVdpZHRoOworICAgIFNJbnQxNiB0aXRsZVdpZHRoOworICAgIFNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb247CisgICAgU3R5bGUgdGl0bGVTdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmJoYmhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJpbWFyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGl0bGVKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGl0bGVTdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVQb3B1cEdyb3VwQm94Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYmhiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZUp1c3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm87CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVJbWFnZVdlbGxDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVJbWFnZVdlbGxDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUltYWdlV2VsbENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVVJbnQxNiBvcmllbnRhdGlvbjsKLQlVSW50MTYgc2l6ZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgVUludDE2IG9yaWVudGF0aW9uOworICAgIFVJbnQxNiBzaXplOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQb3B1cEFycm93Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVBvcHVwQXJyb3dDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZISCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVQb3B1cEFycm93Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUGxhY2FyZENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUGxhY2FyZENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQbGFjYXJkQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUGxhY2FyZENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVQbGFjYXJkQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUGxhY2FyZENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlQ2xvY2tDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVVJbnQxNiBjbG9ja1R5cGU7Ci0JVUludDMyIGNsb2NrRmxhZ3M7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFVJbnQxNiBjbG9ja1R5cGU7CisgICAgVUludDMyIGNsb2NrRmxhZ3M7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVDbG9ja0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVDbG9ja0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUNsb2NrQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbG9ja1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZjbG9ja0ZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUNsb2NrQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZIbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlQ2xvY2tDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVVzZXJQYW5lQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlVSW50MzIgZmVhdHVyZXM7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFVJbnQzMiBmZWF0dXJlczsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVVzZXJQYW5lQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVVzZXJQYW5lQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlVXNlclBhbmVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlVXNlclBhbmVDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlVXNlclBhbmVDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVFZGl0VGV4dENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGV4dDsKLQlCb29sZWFuIGlzUGFzc3dvcmQ7Ci0JQm9vbGVhbiB1c2VJbmxpbmVJbnB1dDsKLQlDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0ZXh0OworICAgIEJvb2xlYW4gaXNQYXNzd29yZDsKKyAgICBCb29sZWFuIHVzZUlubGluZUlucHV0OworICAgIENvbnRyb2xGb250U3R5bGVSZWMgc3R5bGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVFZGl0VGV4dENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVFZGl0VGV4dENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUVkaXRUZXh0Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzUGFzc3dvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VJbmxpbmVJbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlRWRpdFRleHRDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFzc3dvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VJbmxpbmVJbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYmJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlSW5saW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJnN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUVkaXRUZXh0Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSW5saW5lSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVTdGF0aWNUZXh0Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0ZXh0OwotCUNvbnRyb2xGb250U3R5bGVSZWMgc3R5bGU7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENGU3RyaW5nUmVmIHRleHQ7CisgICAgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVN0YXRpY1RleHRDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVN0YXRpY1RleHRDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQaWN0dXJlQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gY29udGVudDsKLQlCb29sZWFuIGRvbnRUcmFjazsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGNvbnRlbnQ7CisgICAgQm9vbGVhbiBkb250VHJhY2s7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVQaWN0dXJlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVBpY3R1cmVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVQaWN0dXJlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmNvbnRlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkb250VHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUGljdHVyZUNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkb250VHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUGljdHVyZUNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlSWNvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkljb25Db250ZW50OwotCUJvb2xlYW4gaW5Eb250VHJhY2s7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBSZWN0IGluQm91bmRzUmVjdDsKKyAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5JY29uQ29udGVudDsKKyAgICBCb29sZWFuIGluRG9udFRyYWNrOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlSWNvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVJY29uQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlSWNvbkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5JY29uQ29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRG9udFRyYWNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUljb25Db250cm9sKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JY29uQ29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Eb250VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5JY29uQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRG9udFRyYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUljb25Db250cm9sKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JY29uQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Eb250VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQm9vbGVhbiBpc0xpc3RIZWFkZXI7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIEJvb2xlYW4gaXNMaXN0SGVhZGVyOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0xpc3RIZWFkZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMaXN0SGVhZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0xpc3RIZWFkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMaXN0SGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVB1c2hCdXR0b25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVB1c2hCdXR0b25Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVB1c2hCdXR0b25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVB1c2hCdXR0b25Db250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVB1c2hCdXR0b25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpY29uOwotCVVJbnQxNiBpY29uQWxpZ25tZW50OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaWNvbjsKKyAgICBVSW50MTYgaWNvbkFsaWdubWVudDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmljb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uQWxpZ25tZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25BbGlnbm1lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkFsaWdubWVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlTSW50MzIgaW5pdGlhbFZhbHVlOwotCUJvb2xlYW4gYXV0b1RvZ2dsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgU0ludDMyIGluaXRpYWxWYWx1ZTsKKyAgICBCb29sZWFuIGF1dG9Ub2dnbGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1RvZ2dsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Ub2dnbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRvVG9nZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUNoZWNrQm94Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlTSW50MzIgaW5pdGlhbFZhbHVlOwotCUJvb2xlYW4gYXV0b1RvZ2dsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgU0ludDMyIGluaXRpYWxWYWx1ZTsKKyAgICBCb29sZWFuIGF1dG9Ub2dnbGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVDaGVja0JveENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVDaGVja0JveENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUNoZWNrQm94Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1RvZ2dsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVDaGVja0JveENvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Ub2dnbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRvVG9nZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUNoZWNrQm94Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCVNJbnQzMiB2aWV3U2l6ZTsKLQlCb29sZWFuIGxpdmVUcmFja2luZzsKLQlQeU9iamVjdCogbGl2ZVRyYWNraW5nUHJvYzsKLQlVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFNJbnQzMiB2YWx1ZTsKKyAgICBTSW50MzIgbWluaW11bTsKKyAgICBTSW50MzIgbWF4aW11bTsKKyAgICBTSW50MzIgdmlld1NpemU7CisgICAgQm9vbGVhbiBsaXZlVHJhY2tpbmc7CisgICAgUHlPYmplY3QqIGxpdmVUcmFja2luZ1Byb2M7CisgICAgVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVNjcm9sbEJhckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNjcm9sbEJhckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbGxiTyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZ2aWV3U2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpdmVUcmFja2luZ1Byb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVUcmFja2luZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteWFjdGlvbnByb2NfdXBwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0Jc2V0Y2FsbGJhY2soX3Jlcywga015Q29udHJvbEFjdGlvblByb2NUYWcsIGxpdmVUcmFja2luZ1Byb2MsICZjX2NhbGxiYWNrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsbGJPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpZXdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nUHJvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTY3JvbGxCYXJDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZVRyYWNraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICBzZXRjYWxsYmFjayhfcmVzLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgbGl2ZVRyYWNraW5nUHJvYywgJmNfY2FsbGJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGl0bGU7Ci0JU0ludDE2IG1lbnVJRDsKLQlCb29sZWFuIHZhcmlhYmxlV2lkdGg7Ci0JU0ludDE2IHRpdGxlV2lkdGg7Ci0JU0ludDE2IHRpdGxlSnVzdGlmaWNhdGlvbjsKLQlTdHlsZSB0aXRsZVN0eWxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBTSW50MTYgbWVudUlEOworICAgIEJvb2xlYW4gdmFyaWFibGVXaWR0aDsKKyAgICBTSW50MTYgdGl0bGVXaWR0aDsKKyAgICBTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uOworICAgIFN0eWxlIHRpdGxlU3R5bGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoYmhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZUp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoYmhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZUp1c3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUp1c3RpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDE2IGNvbnRlbnRSZXNJRDsKLQlCb29sZWFuIGF1dG9TY3JvbGw7Ci0JVUludDMyIGRlbGF5QmVmb3JlQXV0b1Njcm9sbDsKLQlVSW50MzIgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbDsKLQlVSW50MTYgYXV0b1Njcm9sbEFtb3VudDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDE2IGNvbnRlbnRSZXNJRDsKKyAgICBCb29sZWFuIGF1dG9TY3JvbGw7CisgICAgVUludDMyIGRlbGF5QmVmb3JlQXV0b1Njcm9sbDsKKyAgICBVSW50MzIgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbDsKKyAgICBVSW50MTYgYXV0b1Njcm9sbEFtb3VudDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoYmxsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRSZXNJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF1dG9TY3JvbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWxheUJlZm9yZUF1dG9TY3JvbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWxheUJldHdlZW5BdXRvU2Nyb2xsLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1Njcm9sbEFtb3VudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9TY3JvbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5QmVmb3JlQXV0b1Njcm9sbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1Njcm9sbEFtb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGJsbEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50UmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXRvU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsYXlCZWZvcmVBdXRvU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dG9TY3JvbGxBbW91bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheUJlZm9yZUF1dG9TY3JvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5QmV0d2VlbkF1dG9TY3JvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9TY3JvbGxBbW91bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlSZWN0IGluQm91bmRzUmVjdDsKLQlTSW50MzIgaW5WYWx1ZTsKLQlCb29sZWFuIGluQXV0b1RvZ2dsZXM7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBSZWN0IGluQm91bmRzUmVjdDsKKyAgICBTSW50MzIgaW5WYWx1ZTsKKyAgICBCb29sZWFuIGluQXV0b1RvZ2dsZXM7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQXV0b1RvZ2dsZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2woaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXV0b1RvZ2dsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF1dG9Ub2dnbGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF1dG9Ub2dnbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCVNJbnQxNiBpblNpemU7Ci0JQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFJlY3QgaW5Cb3VuZHNSZWN0OworICAgIFNJbnQxNiBpblNpemU7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUm91bmRCdXR0b25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmluQ29udGVudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2woaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5Db250ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCU9TVHlwZSBzdHlsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgT1NUeXBlIHN0eWxlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGV4dDsKLQlCb29sZWFuIGlzUGFzc3dvcmQ7Ci0JQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGV4dDsKKyAgICBCb29sZWFuIGlzUGFzc3dvcmQ7CisgICAgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc1Bhc3N3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZzdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFzc3dvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJnN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfRmluZENvbnRyb2xVbmRlck1vdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sSGFuZGxlIF9ydjsKLQlQb2ludCBpbldoZXJlOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlTSW50MTYgb3V0UGFydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbEhhbmRsZSBfcnY7CisgICAgUG9pbnQgaW5XaGVyZTsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgU0ludDE2IG91dFBhcnQ7CiAjaWZuZGVmIEZpbmRDb250cm9sVW5kZXJNb3VzZQotCVB5TWFjX1BSRUNIRUNLKEZpbmRDb250cm9sVW5kZXJNb3VzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZENvbnRyb2xVbmRlck1vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluV2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaW5kQ29udHJvbFVuZGVyTW91c2UoaW5XaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQYXJ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UGFydCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5XaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZpbmRDb250cm9sVW5kZXJNb3VzZShpbldoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQYXJ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfYXNfQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbEhhbmRsZSBfcnY7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xIYW5kbGUgX3J2OworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBhc19Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soYXNfQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soYXNfQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX0NvbnRyb2woaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfQ29udHJvbChoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVRhYnNDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVVJbnQxNiBzaXplOwotCVVJbnQxNiBkaXJlY3Rpb247Ci0JaW50IGk7Ci0JVUludDE2IG51bVRhYnM7Ci0JQ29udHJvbFRhYkVudHJ5IHRhYkFycmF5W01BWFRBQlNdOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKLQlQeU9iamVjdCAqdGFiQXJyYXlPYmosICp0YWJFbnRyeTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBVSW50MTYgc2l6ZTsKKyAgICBVSW50MTYgZGlyZWN0aW9uOworICAgIGludCBpOworICAgIFVJbnQxNiBudW1UYWJzOworICAgIENvbnRyb2xUYWJFbnRyeSB0YWJBcnJheVtNQVhUQUJTXTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKnRhYkFycmF5T2JqLCAqdGFiRW50cnk7CiAKICNpZm5kZWYgQ3JlYXRlVGFic0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVUYWJzQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlVGFic0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhITyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YWJBcnJheU9iaikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSEhPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYkFycmF5T2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gUHlTZXF1ZW5jZV9MZW5ndGgodGFiQXJyYXlPYmopOwotCWlmIChpID09IC0xKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKGkgPiBNQVhUQUJTKSB7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ3RsX0Vycm9yLCAiVG9vIG1hbnkgdGFicyIpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCW51bVRhYnMgPSBpOwotCWZvciAoaT0wOyBpPG51bVRhYnM7IGkrKykgewotCSAgICAgICAgdGFiRW50cnkgPSBQeVNlcXVlbmNlX0dldEl0ZW0odGFiQXJyYXlPYmosIGkpOwotCSAgICAgICAgaWYgKHRhYkVudHJ5ID09IE5VTEwpCi0JICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh0YWJFbnRyeSwgIihPJk8mQikiLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJnRhYkFycmF5W2ldLmljb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0YWJBcnJheVtpXS5uYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdGFiQXJyYXlbaV0uZW5hYmxlZAotCSAgICAgICAgICAgICAgICAgICAgICAgICApKQotCSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQl9CisgICAgaSA9IFB5U2VxdWVuY2VfTGVuZ3RoKHRhYkFycmF5T2JqKTsKKyAgICBpZiAoaSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGkgPiBNQVhUQUJTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJUb28gbWFueSB0YWJzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBudW1UYWJzID0gaTsKKyAgICBmb3IgKGk9MDsgaTxudW1UYWJzOyBpKyspIHsKKyAgICAgICAgdGFiRW50cnkgPSBQeVNlcXVlbmNlX0dldEl0ZW0odGFiQXJyYXlPYmosIGkpOworICAgICAgICBpZiAodGFiRW50cnkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHRhYkVudHJ5LCAiKE8mTyZCKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZ0YWJBcnJheVtpXS5pY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0YWJBcnJheVtpXS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJBcnJheVtpXS5lbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCV9lcnIgPSBDcmVhdGVUYWJzQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRhYnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkFycmF5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIF9lcnIgPSBDcmVhdGVUYWJzQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRhYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ3RsX21ldGhvZHNbXSA9IHsKLQl7Ik5ld0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX05ld0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBvd25pbmdXaW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU3RyMjU1IGNvbnRyb2xUaXRsZSwgQm9vbGVhbiBpbml0aWFsbHlWaXNpYmxlLCBTSW50MTYgaW5pdGlhbFZhbHVlLCBTSW50MTYgbWluaW11bVZhbHVlLCBTSW50MTYgbWF4aW11bVZhbHVlLCBTSW50MTYgcHJvY0lELCBTSW50MzIgY29udHJvbFJlZmVyZW5jZSkgLT4gKENvbnRyb2xIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE5ld0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldE5ld0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiByZXNvdXJjZUlELCBXaW5kb3dQdHIgb3duaW5nV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiRHJhd0NvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9EcmF3Q29udHJvbHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB0aGVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVDb250cm9scyIsIChQeUNGdW5jdGlvbilDdGxfVXBkYXRlQ29udHJvbHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmduSGFuZGxlIGluVXBkYXRlUmVnaW9uKSAtPiBOb25lIil9LAotCXsiRmluZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0ZpbmRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0ZXN0UG9pbnQsIFdpbmRvd1B0ciB0aGVXaW5kb3cpIC0+IChDb250cm9sUGFydENvZGUgX3J2LCBDb250cm9sSGFuZGxlIHRoZUNvbnRyb2wpIil9LAotCXsiSWRsZUNvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9JZGxlQ29udHJvbHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xCeUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXRDb250cm9sQnlJRCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSUQgaW5JRCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJEdW1wQ29udHJvbEhpZXJhcmNoeSIsIChQeUNGdW5jdGlvbilDdGxfRHVtcENvbnRyb2xIaWVyYXJjaHksIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgRlNTcGVjIGluRHVtcEZpbGUpIC0+IE5vbmUiKX0sCi0JeyJDcmVhdGVSb290Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUm9vdENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJHZXRSb290Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfR2V0Um9vdENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJHZXRLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXRLZXlib2FyZEZvY3VzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiU2V0S2V5Ym9hcmRGb2N1cyIsIChQeUNGdW5jdGlvbilDdGxfU2V0S2V5Ym9hcmRGb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSGFuZGxlIGluQ29udHJvbCwgQ29udHJvbEZvY3VzUGFydCBpblBhcnQpIC0+IE5vbmUiKX0sCi0JeyJBZHZhbmNlS2V5Ym9hcmRGb2N1cyIsIChQeUNGdW5jdGlvbilDdGxfQWR2YW5jZUtleWJvYXJkRm9jdXMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlJldmVyc2VLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9SZXZlcnNlS2V5Ym9hcmRGb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiQ2xlYXJLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DbGVhcktleWJvYXJkRm9jdXMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUN0bF9TZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBCb29sZWFuIGluVHJhY2tzKSAtPiBOb25lIil9LAotCXsiSXNBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDdGxfSXNBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQm9vbGVhbiBvdXRUcmFja3MpIil9LAotCXsiQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFVJbnQxNiB0aGlja25lc3MsIFVJbnQxNiBiZWhhdmlvciwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm8sIFNJbnQxNiBtZW51SUQsIFVJbnQxNiBtZW51QmVoYXZpb3IsIFVJbnQxNiBtZW51UGxhY2VtZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVNsaWRlckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNsaWRlckNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0sIFVJbnQxNiBvcmllbnRhdGlvbiwgVUludDE2IG51bVRpY2tNYXJrcywgQm9vbGVhbiBsaXZlVHJhY2tpbmcsIFB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFVJbnQxNiBpbk9yaWVudGF0aW9uLCBDRlN0cmluZ1JlZiBpblRpdGxlLCBTSW50MzIgaW5Jbml0aWFsVmFsdWUsIEJvb2xlYW4gaW5EcmF3VGl0bGUsIEJvb2xlYW4gaW5BdXRvVG9nZ2xlcykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQcm9ncmVzc0JhckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVByb2dyZXNzQmFyQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgQm9vbGVhbiBpbmRldGVybWluYXRlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0pIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgU0ludDMyIGluY3JlbWVudCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlQ2hhc2luZ0Fycm93c0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTZXBhcmF0b3JDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTZXBhcmF0b3JDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlR3JvdXBCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVHcm91cEJveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIEJvb2xlYW4gcHJpbWFyeSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQzMiBpbml0aWFsVmFsdWUsIEJvb2xlYW4gcHJpbWFyeSwgQm9vbGVhbiBhdXRvVG9nZ2xlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQb3B1cEdyb3VwQm94Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgQm9vbGVhbiBwcmltYXJ5LCBTSW50MTYgbWVudUlELCBCb29sZWFuIHZhcmlhYmxlV2lkdGgsIFNJbnQxNiB0aXRsZVdpZHRoLCBTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uLCBTdHlsZSB0aXRsZVN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUltYWdlV2VsbENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUltYWdlV2VsbENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm8pIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBvcHVwQXJyb3dDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFVJbnQxNiBvcmllbnRhdGlvbiwgVUludDE2IHNpemUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUGxhY2FyZENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBsYWNhcmRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlQ2xvY2tDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDbG9ja0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IGNsb2NrVHlwZSwgVUludDMyIGNsb2NrRmxhZ3MpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlVXNlclBhbmVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVVc2VyUGFuZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDMyIGZlYXR1cmVzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUVkaXRUZXh0Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRWRpdFRleHRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRleHQsIEJvb2xlYW4gaXNQYXNzd29yZCwgQm9vbGVhbiB1c2VJbmxpbmVJbnB1dCwgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTdGF0aWNUZXh0Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQaWN0dXJlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUGljdHVyZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGNvbnRlbnQsIEJvb2xlYW4gZG9udFRyYWNrKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUljb25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVJY29uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZWN0IGluQm91bmRzUmVjdCwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluSWNvbkNvbnRlbnQsIEJvb2xlYW4gaW5Eb250VHJhY2spIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBCb29sZWFuIGlzTGlzdEhlYWRlcikgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQdXNoQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGljb24sIFVJbnQxNiBpY29uQWxpZ25tZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUmFkaW9CdXR0b25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBTSW50MzIgaW5pdGlhbFZhbHVlLCBCb29sZWFuIGF1dG9Ub2dnbGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlQ2hlY2tCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGVja0JveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQzMiBpbml0aWFsVmFsdWUsIEJvb2xlYW4gYXV0b1RvZ2dsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTY3JvbGxCYXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTY3JvbGxCYXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBTSW50MzIgdmlld1NpemUsIEJvb2xlYW4gbGl2ZVRyYWNraW5nLCBQeU9iamVjdCogbGl2ZVRyYWNraW5nUHJvYykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDE2IG1lbnVJRCwgQm9vbGVhbiB2YXJpYWJsZVdpZHRoLCBTSW50MTYgdGl0bGVXaWR0aCwgU0ludDE2IHRpdGxlSnVzdGlmaWNhdGlvbiwgU3R5bGUgdGl0bGVTdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDE2IGNvbnRlbnRSZXNJRCwgQm9vbGVhbiBhdXRvU2Nyb2xsLCBVSW50MzIgZGVsYXlCZWZvcmVBdXRvU2Nyb2xsLCBVSW50MzIgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbCwgVUludDE2IGF1dG9TY3JvbGxBbW91bnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBTSW50MzIgaW5WYWx1ZSwgQm9vbGVhbiBpbkF1dG9Ub2dnbGVzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUm91bmRCdXR0b25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBTSW50MTYgaW5TaXplLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZURhdGFCcm93c2VyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIE9TVHlwZSBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVFZGl0VW5pY29kZVRleHRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRleHQsIEJvb2xlYW4gaXNQYXNzd29yZCwgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJGaW5kQ29udHJvbFVuZGVyTW91c2UiLCAoUHlDRnVuY3Rpb24pQ3RsX0ZpbmRDb250cm9sVW5kZXJNb3VzZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgaW5XaGVyZSwgV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBfcnYsIFNJbnQxNiBvdXRQYXJ0KSIpfSwKLQl7ImFzX0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX2FzX0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiQ3JlYXRlVGFic0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVRhYnNDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFVJbnQxNiBzaXplLCBVSW50MTYgZGlyZWN0aW9uLCBDb250cm9sVGFiRW50cnkgdGFiQXJyYXkpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTmV3Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfTmV3Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIG93bmluZ1dpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgY29udHJvbFRpdGxlLCBCb29sZWFuIGluaXRpYWxseVZpc2libGUsIFNJbnQxNiBpbml0aWFsVmFsdWUsIFNJbnQxNiBtaW5pbXVtVmFsdWUsIFNJbnQxNiBtYXhpbXVtVmFsdWUsIFNJbnQxNiBwcm9jSUQsIFNJbnQzMiBjb250cm9sUmVmZXJlbmNlKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TmV3Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfR2V0TmV3Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHJlc291cmNlSUQsIFdpbmRvd1B0ciBvd25pbmdXaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIF9ydikiKX0sCisgICAgeyJEcmF3Q29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsX0RyYXdDb250cm9scywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHRoZVdpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IlVwZGF0ZUNvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9VcGRhdGVDb250cm9scywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZ25IYW5kbGUgaW5VcGRhdGVSZWdpb24pIC0+IE5vbmUiKX0sCisgICAgeyJGaW5kQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfRmluZENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQb2ludCwgV2luZG93UHRyIHRoZVdpbmRvdykgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYsIENvbnRyb2xIYW5kbGUgdGhlQ29udHJvbCkiKX0sCisgICAgeyJJZGxlQ29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsX0lkbGVDb250cm9scywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbEJ5SUQiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldENvbnRyb2xCeUlELCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xJRCBpbklEKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkR1bXBDb250cm9sSGllcmFyY2h5IiwgKFB5Q0Z1bmN0aW9uKUN0bF9EdW1wQ29udHJvbEhpZXJhcmNoeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBGU1NwZWMgaW5EdW1wRmlsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNyZWF0ZVJvb3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSb290Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkdldFJvb3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXRSb290Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkdldEtleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldEtleWJvYXJkRm9jdXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJTZXRLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9TZXRLZXlib2FyZEZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xIYW5kbGUgaW5Db250cm9sLCBDb250cm9sRm9jdXNQYXJ0IGluUGFydCkgLT4gTm9uZSIpfSwKKyAgICB7IkFkdmFuY2VLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9BZHZhbmNlS2V5Ym9hcmRGb2N1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiUmV2ZXJzZUtleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX1JldmVyc2VLZXlib2FyZEZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJDbGVhcktleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX0NsZWFyS2V5Ym9hcmRGb2N1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ3RsX1NldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIEJvb2xlYW4gaW5UcmFja3MpIC0+IE5vbmUiKX0sCisgICAgeyJJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUN0bF9Jc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChCb29sZWFuIG91dFRyYWNrcykiKX0sCisgICAgeyJDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgVUludDE2IHRoaWNrbmVzcywgVUludDE2IGJlaGF2aW9yLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbywgU0ludDE2IG1lbnVJRCwgVUludDE2IG1lbnVCZWhhdmlvciwgVUludDE2IG1lbnVQbGFjZW1lbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlU2xpZGVyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU2xpZGVyQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgVUludDE2IG9yaWVudGF0aW9uLCBVSW50MTYgbnVtVGlja01hcmtzLCBCb29sZWFuIGxpdmVUcmFja2luZywgUHlPYmplY3QqIGxpdmVUcmFja2luZ1Byb2MpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZWN0IGluQm91bmRzUmVjdCwgVUludDE2IGluT3JpZW50YXRpb24sIENGU3RyaW5nUmVmIGluVGl0bGUsIFNJbnQzMiBpbkluaXRpYWxWYWx1ZSwgQm9vbGVhbiBpbkRyYXdUaXRsZSwgQm9vbGVhbiBpbkF1dG9Ub2dnbGVzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVByb2dyZXNzQmFyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBCb29sZWFuIGluZGV0ZXJtaW5hdGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBTSW50MzIgaW5jcmVtZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVNlcGFyYXRvckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNlcGFyYXRvckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVHcm91cEJveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUdyb3VwQm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgQm9vbGVhbiBwcmltYXJ5KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUNoZWNrR3JvdXBCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDMyIGluaXRpYWxWYWx1ZSwgQm9vbGVhbiBwcmltYXJ5LCBCb29sZWFuIGF1dG9Ub2dnbGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBCb29sZWFuIHByaW1hcnksIFNJbnQxNiBtZW51SUQsIEJvb2xlYW4gdmFyaWFibGVXaWR0aCwgU0ludDE2IHRpdGxlV2lkdGgsIFNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb24sIFN0eWxlIHRpdGxlU3R5bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVQb3B1cEFycm93Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IG9yaWVudGF0aW9uLCBVSW50MTYgc2l6ZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVQbGFjYXJkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUGxhY2FyZENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVDbG9ja0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUNsb2NrQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBVSW50MTYgY2xvY2tUeXBlLCBVSW50MzIgY2xvY2tGbGFncykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVVc2VyUGFuZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVVzZXJQYW5lQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBVSW50MzIgZmVhdHVyZXMpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlRWRpdFRleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVFZGl0VGV4dENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQm9vbGVhbiBpc1Bhc3N3b3JkLCBCb29sZWFuIHVzZUlubGluZUlucHV0LCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVN0YXRpY1RleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTdGF0aWNUZXh0Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0ZXh0LCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVBpY3R1cmVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQaWN0dXJlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gY29udGVudCwgQm9vbGVhbiBkb250VHJhY2spIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlSWNvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUljb25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5JY29uQ29udGVudCwgQm9vbGVhbiBpbkRvbnRUcmFjaykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIEJvb2xlYW4gaXNMaXN0SGVhZGVyKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVB1c2hCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQdXNoQnV0dG9uQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaWNvbiwgVUludDE2IGljb25BbGlnbm1lbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUmFkaW9CdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQzMiBpbml0aWFsVmFsdWUsIEJvb2xlYW4gYXV0b1RvZ2dsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVDaGVja0JveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUNoZWNrQm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDMyIGluaXRpYWxWYWx1ZSwgQm9vbGVhbiBhdXRvVG9nZ2xlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVNjcm9sbEJhckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0sIFNJbnQzMiB2aWV3U2l6ZSwgQm9vbGVhbiBsaXZlVHJhY2tpbmcsIFB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBTSW50MTYgbWVudUlELCBCb29sZWFuIHZhcmlhYmxlV2lkdGgsIFNJbnQxNiB0aXRsZVdpZHRoLCBTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uLCBTdHlsZSB0aXRsZVN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVJhZGlvR3JvdXBDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSYWRpb0dyb3VwQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MTYgY29udGVudFJlc0lELCBCb29sZWFuIGF1dG9TY3JvbGwsIFVJbnQzMiBkZWxheUJlZm9yZUF1dG9TY3JvbGwsIFVJbnQzMiBkZWxheUJldHdlZW5BdXRvU2Nyb2xsLCBVSW50MTYgYXV0b1Njcm9sbEFtb3VudCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFNJbnQzMiBpblZhbHVlLCBCb29sZWFuIGluQXV0b1RvZ2dsZXMpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUm91bmRCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFNJbnQxNiBpblNpemUsIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgT1NUeXBlIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQm9vbGVhbiBpc1Bhc3N3b3JkLCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkZpbmRDb250cm9sVW5kZXJNb3VzZSIsIChQeUNGdW5jdGlvbilDdGxfRmluZENvbnRyb2xVbmRlck1vdXNlLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBpbldoZXJlLCBXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIF9ydiwgU0ludDE2IG91dFBhcnQpIil9LAorICAgIHsiYXNfQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfYXNfQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IChDb250cm9sSGFuZGxlIF9ydikiKX0sCisgICAgeyJDcmVhdGVUYWJzQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlVGFic0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IHNpemUsIFVJbnQxNiBkaXJlY3Rpb24sIENvbnRyb2xUYWJFbnRyeSB0YWJBcnJheSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTU1MzEsMjgzICs1NTMxLDI4MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEN0bE9ial9OZXdVbm1hbmFnZWQoQ29udHJvbEhhbmRsZSBpdHNlbGYpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKml0OwotICAgICAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0gICAgICAgIGl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOwotICAgICAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0gICAgICAgIGl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ29udHJvbE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEN0bE9ial9XaGljaENvbnRyb2woQ29udHJvbEhhbmRsZSBjKQogewotICAgICAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKml0OwogCi0gICAgICAgIGlmIChjID09IE5VTEwpCi0gICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpdCA9IChQeU9iamVjdCAqKSBHZXRDb250cm9sUmVmZXJlbmNlKGMpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgKiogSWYgdGhlIHJlZmNvbiBpcyB6ZXJvIG9yIGRvZXNuJ3QgcG9pbnQgYmFjayB0byB0aGUgUHl0aG9uIG9iamVjdAotICAgICAgICAgICAgICAgICoqIHRoZSBjb250cm9sIGlzIG5vdCBvdXJzLiBSZXR1cm4gYSB0ZW1wb3Jhcnkgb2JqZWN0LgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgKChDb250cm9sT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gYykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDdGxPYmpfTmV3VW5tYW5hZ2VkKGMpOwotICAgICAgICB9Ci0gICAgICAgIFB5X0lOQ1JFRihpdCk7Ci0gICAgICAgIHJldHVybiBpdDsKKyAgICBpZiAoYyA9PSBOVUxMKQorICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgZWxzZSB7CisgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldENvbnRyb2xSZWZlcmVuY2UoYyk7CisgICAgICAgIC8qCisgICAgICAgICoqIElmIHRoZSByZWZjb24gaXMgemVybyBvciBkb2Vzbid0IHBvaW50IGJhY2sgdG8gdGhlIFB5dGhvbiBvYmplY3QKKyAgICAgICAgKiogdGhlIGNvbnRyb2wgaXMgbm90IG91cnMuIFJldHVybiBhIHRlbXBvcmFyeSBvYmplY3QuCisgICAgICAgICovCisgICAgICAgIGlmIChpdCA9PSBOVUxMIHx8ICgoQ29udHJvbE9iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IGMpCisgICAgICAgICAgICByZXR1cm4gQ3RsT2JqX05ld1VubWFuYWdlZChjKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0KTsKKyAgICByZXR1cm4gaXQ7CiB9CiAKIHN0YXRpYyBpbnQKIHNldHRyYWNrZnVuYyhQeU9iamVjdCAqb2JqKQogewotICAgICAgICBpZiAodHJhY2tlcikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJUcmFja2VyIGZ1bmN0aW9uIGluIHVzZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrZXIgPSBvYmo7Ci0gICAgICAgIFB5X0lOQ1JFRih0cmFja2VyKTsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHRyYWNrZXIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIlRyYWNrZXIgZnVuY3Rpb24gaW4gdXNlIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB0cmFja2VyID0gb2JqOworICAgIFB5X0lOQ1JFRih0cmFja2VyKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQKIGNscnRyYWNrZnVuYyh2b2lkKQogewotICAgICAgICBQeV9YREVDUkVGKHRyYWNrZXIpOwotICAgICAgICB0cmFja2VyID0gMDsKKyAgICBQeV9YREVDUkVGKHRyYWNrZXIpOworICAgIHRyYWNrZXIgPSAwOwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIG15dHJhY2tlcihDb250cm9sSGFuZGxlIGN0bCwgc2hvcnQgcGFydCkKIHsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpydj0wOworICAgIFB5T2JqZWN0ICphcmdzLCAqcnY9MDsKIAotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8maSkiLCBDdGxPYmpfV2hpY2hDb250cm9sLCBjdGwsIChpbnQpcGFydCk7Ci0gICAgICAgIGlmIChhcmdzICYmIHRyYWNrZXIpIHsKLSAgICAgICAgICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KHRyYWNrZXIsIGFyZ3MpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnYpCi0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlRyYWNrQ29udHJvbCBvciBIYW5kbGVDb250cm9sQ2xpY2s6IGV4Y2VwdGlvbiBpbiB0cmFja2VyIGZ1bmN0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICB9CisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIihPJmkpIiwgQ3RsT2JqX1doaWNoQ29udHJvbCwgY3RsLCAoaW50KXBhcnQpOworICAgIGlmIChhcmdzICYmIHRyYWNrZXIpIHsKKyAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCh0cmFja2VyLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICBpZiAocnYpCisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgZWxzZSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJUcmFja0NvbnRyb2wgb3IgSGFuZGxlQ29udHJvbENsaWNrOiBleGNlcHRpb24gaW4gdHJhY2tlciBmdW5jdGlvblxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBzZXRjYWxsYmFjayhQeU9iamVjdCAqbXlzZWxmLCBPU1R5cGUgd2hpY2gsIFB5T2JqZWN0ICpjYWxsYmFjaywgVW5pdmVyc2FsUHJvY1B0ciAqdXBwcCkKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqc2VsZiA9IChDb250cm9sT2JqZWN0ICopbXlzZWxmOwotICAgICAgICBjaGFyIGtleWJ1Zls5XTsKKyAgICBDb250cm9sT2JqZWN0ICpzZWxmID0gKENvbnRyb2xPYmplY3QgKilteXNlbGY7CisgICAgY2hhciBrZXlidWZbOV07CiAKLSAgICAgICAgaWYgKCB3aGljaCA9PSBrTXlDb250cm9sQWN0aW9uUHJvY1RhZyApCi0gICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWFjdGlvbnByb2NfdXBwOwotICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUtleURvd25Qcm9jVGFnICkKLSAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15a2V5ZG93bnByb2NfdXBwOwotICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUZvY3VzUHJvY1RhZyApCi0gICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWZvY3VzcHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlkcmF3cHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lSWRsZVByb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlpZGxlcHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lSGl0VGVzdFByb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXloaXR0ZXN0cHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdQcm9jVGFnICkKLSAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15dHJhY2tpbmdwcm9jX3VwcDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgLyogT25seSBub3cgZG8gd2UgdGVzdCBmb3IgY2xlYXJpbmcgb2YgdGhlIGNhbGxiYWNrOiAqLwotICAgICAgICBpZiAoIGNhbGxiYWNrID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgICp1cHBwID0gTlVMTDsKLSAgICAgICAgLyogQ3JlYXRlIHRoZSBkaWN0IGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0IChzbyB3ZSBkb24ndCBnZXQgc3VjaCBhIGRpY3QgZm9yIGV2ZXJ5IGNvbnRyb2wpICovCi0gICAgICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgKQotICAgICAgICAgICAgICAgIGlmICggKHNlbGYtPm9iX2NhbGxiYWNrZGljdCA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIC8qIEFuZCBzdG9yZSB0aGUgUHl0aG9uIGNhbGxiYWNrICovCi0gICAgICAgIHNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOwotICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoc2VsZi0+b2JfY2FsbGJhY2tkaWN0LCBrZXlidWYsIGNhbGxiYWNrKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHdoaWNoID09IGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnICkKKyAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWFjdGlvbnByb2NfdXBwOworICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lS2V5RG93blByb2NUYWcgKQorICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15a2V5ZG93bnByb2NfdXBwOworICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lRm9jdXNQcm9jVGFnICkKKyAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWZvY3VzcHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVEcmF3UHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlkcmF3cHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlpZGxlcHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVIaXRUZXN0UHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXloaXR0ZXN0cHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVUcmFja2luZ1Byb2NUYWcgKQorICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15dHJhY2tpbmdwcm9jX3VwcDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBPbmx5IG5vdyBkbyB3ZSB0ZXN0IGZvciBjbGVhcmluZyBvZiB0aGUgY2FsbGJhY2s6ICovCisgICAgaWYgKCBjYWxsYmFjayA9PSBQeV9Ob25lICkKKyAgICAgICAgKnVwcHAgPSBOVUxMOworICAgIC8qIENyZWF0ZSB0aGUgZGljdCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldCAoc28gd2UgZG9uJ3QgZ2V0IHN1Y2ggYSBkaWN0IGZvciBldmVyeSBjb250cm9sKSAqLworICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgKQorICAgICAgICBpZiAoIChzZWxmLT5vYl9jYWxsYmFja2RpY3QgPSBQeURpY3RfTmV3KCkpID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIEFuZCBzdG9yZSB0aGUgUHl0aG9uIGNhbGxiYWNrICovCisgICAgc3ByaW50ZihrZXlidWYsICIleCIsICh1bnNpZ25lZCl3aGljaCk7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHNlbGYtPm9iX2NhbGxiYWNrZGljdCwga2V5YnVmLCBjYWxsYmFjaykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsY2FsbGJhY2soQ29udHJvbE9iamVjdCAqc2VsZiwgT1NUeXBlIHdoaWNoLCBQeU9iamVjdCAqYXJnbGlzdCkKIHsKLSAgICAgICAgY2hhciBrZXlidWZbOV07Ci0gICAgICAgIFB5T2JqZWN0ICpmdW5jLCAqcnY7CisgICAgY2hhciBrZXlidWZbOV07CisgICAgUHlPYmplY3QgKmZ1bmMsICpydjsKIAotICAgICAgICBzcHJpbnRmKGtleWJ1ZiwgIiV4IiwgKHVuc2lnbmVkKXdoaWNoKTsKLSAgICAgICAgaWYgKCBzZWxmLT5vYl9jYWxsYmFja2RpY3QgPT0gTlVMTCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5vYl9jYWxsYmFja2RpY3QsIGtleWJ1ZikpID09IE5VTEwgKSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkNvbnRyb2wgY2FsbGJhY2sgJXggd2l0aG91dCBjYWxsYmFjayBvYmplY3RcbiIsICh1bnNpZ25lZCl3aGljaCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdsaXN0KTsKLSAgICAgICAgaWYgKCBydiA9PSBOVUxMICkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gY29udHJvbCBjYWxsYmFjayAleCBoYW5kbGVyXG4iLCAodW5zaWduZWQpd2hpY2gpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ2OworICAgIHNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOworICAgIGlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgKGZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5vYl9jYWxsYmFja2RpY3QsIGtleWJ1ZikpID09IE5VTEwgKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJDb250cm9sIGNhbGxiYWNrICV4IHdpdGhvdXQgY2FsbGJhY2sgb2JqZWN0XG4iLCAodW5zaWduZWQpd2hpY2gpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdsaXN0KTsKKyAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gY29udHJvbCBjYWxsYmFjayAleCBoYW5kbGVyXG4iLCAodW5zaWduZWQpd2hpY2gpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogbXlhY3Rpb25wcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgU0ludDE2IHBhcnQpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaCIsIGN0bF9vYmosIHBhcnQpOwotICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga015Q29udHJvbEFjdGlvblByb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihydik7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteWtleWRvd25wcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgU0ludDE2IGtleUNvZGUsIFNJbnQxNiBjaGFyQ29kZSwgU0ludDE2IG1vZGlmaWVycykKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKLSAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLSAgICAgICAgc2hvcnQgY19ydiA9IDA7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworICAgIHNob3J0IGNfcnYgPSAwOwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaGhoIiwgY3RsX29iaiwga2V5Q29kZSwgY2hhckNvZGUsIG1vZGlmaWVycyk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVLZXlEb3duUHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIGlmICggcnYgKQotICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2UocnYsICJoIiwgJmNfcnYpKQotICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlfWERFQ1JFRihydik7Ci0gICAgICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CisgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2hoaCIsIGN0bF9vYmosIGtleUNvZGUsIGNoYXJDb2RlLCBtb2RpZmllcnMpOworICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVLZXlEb3duUHJvY1RhZywgYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICBpZiAoIHJ2ICkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteWZvY3VzcHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIENvbnRyb2xQYXJ0Q29kZSBwYXJ0KQogewotICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwotICAgICAgICBzaG9ydCBjX3J2ID0ga0NvbnRyb2xGb2N1c05vUGFydDsKKyAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgc2hvcnQgY19ydiA9IGtDb250cm9sRm9jdXNOb1BhcnQ7CiAKLSAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLSAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVGb2N1c1Byb2NUYWcsIGFyZ2xpc3QpOwotICAgICAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOwotICAgICAgICBpZiAoIHJ2ICkKLSAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUZvY3VzUHJvY1RhZywgYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICBpZiAoIHJ2ICkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogbXlkcmF3cHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIFNJbnQxNiBwYXJ0KQogewotICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKIAotICAgICAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOwotICAgICAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKLSAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZURyYXdQcm9jVGFnLCBhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihydik7CisgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKKyAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihydik7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogbXlpZGxlcHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPIiwgY3RsX29iaik7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk8iLCBjdGxfb2JqKTsKKyAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lSWRsZVByb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihydik7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteWhpdHRlc3Rwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgUG9pbnQgd2hlcmUpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7Ci0gICAgICAgIHNob3J0IGNfcnYgPSAtMTsKKyAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgc2hvcnQgY19ydiA9IC0xOwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPTyYiLCBjdGxfb2JqLCBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVIaXRUZXN0UHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIC8qIElnbm9yZSBlcnJvcnMsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoZW0gKi8KLSAgICAgICAgaWYgKCBydiApCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCi0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBQeV9YREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPTyYiLCBjdGxfb2JqLCBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RQcm9jVGFnLCBhcmdsaXN0KTsKKyAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgIC8qIElnbm9yZSBlcnJvcnMsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoZW0gKi8KKyAgICBpZiAoIHJ2ICkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQ29udHJvbFBhcnRDb2RlCiBteXRyYWNraW5ncHJvYyhDb250cm9sSGFuZGxlIGNvbnRyb2wsIFBvaW50IHN0YXJ0UHQsIENvbnRyb2xBY3Rpb25VUFAgYWN0aW9uUHJvYykKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKLSAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLSAgICAgICAgc2hvcnQgY19ydiA9IC0xOworICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKyAgICBzaG9ydCBjX3J2ID0gLTE7CiAKLSAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLSAgICAgICAgLyogV2UgY2Fubm90IHBhc3MgdGhlIGFjdGlvblByb2Mgd2l0aG91dCBsb3RzIG9mIHdvcmsgKi8KLSAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHN0YXJ0UHQpOwotICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdQcm9jVGFnLCBhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKLSAgICAgICAgaWYgKCBydiApCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCi0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBQeV9YREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgIC8qIFdlIGNhbm5vdCBwYXNzIHRoZSBhY3Rpb25Qcm9jIHdpdGhvdXQgbG90cyBvZiB3b3JrICovCisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHN0YXJ0UHQpOworICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVUcmFja2luZ1Byb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgaWYgKCBydiApCisgICAgICAgIGlmICghUHlBcmdfUGFyc2UocnYsICJoIiwgJmNfcnYpKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9YREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OwogfQogCiAjZWxzZSAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgQ3RsX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiB2b2lkIGluaXRfQ3RsKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAotCW15dHJhY2tlcl91cHAgPSBOZXdDb250cm9sQWN0aW9uVVBQKG15dHJhY2tlcik7Ci0JbXlhY3Rpb25wcm9jX3VwcCA9IE5ld0NvbnRyb2xBY3Rpb25VUFAobXlhY3Rpb25wcm9jKTsKLQlteWtleWRvd25wcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUtleURvd25VUFAobXlrZXlkb3ducHJvYyk7Ci0JbXlmb2N1c3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRm9jdXNVUFAobXlmb2N1c3Byb2MpOwotCW15ZHJhd3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRHJhd1VQUChteWRyYXdwcm9jKTsKLQlteWlkbGVwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUlkbGVVUFAobXlpZGxlcHJvYyk7Ci0JbXloaXR0ZXN0cHJvY191cHAgPSBOZXdDb250cm9sVXNlclBhbmVIaXRUZXN0VVBQKG15aGl0dGVzdHByb2MpOwotCW15dHJhY2tpbmdwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nVVBQKG15dHJhY2tpbmdwcm9jKTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb250cm9sSGFuZGxlLCBDdGxPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29udHJvbEhhbmRsZSwgQ3RsT2JqX0NvbnZlcnQpOworICAgIG15dHJhY2tlcl91cHAgPSBOZXdDb250cm9sQWN0aW9uVVBQKG15dHJhY2tlcik7CisgICAgbXlhY3Rpb25wcm9jX3VwcCA9IE5ld0NvbnRyb2xBY3Rpb25VUFAobXlhY3Rpb25wcm9jKTsKKyAgICBteWtleWRvd25wcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUtleURvd25VUFAobXlrZXlkb3ducHJvYyk7CisgICAgbXlmb2N1c3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRm9jdXNVUFAobXlmb2N1c3Byb2MpOworICAgIG15ZHJhd3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lRHJhd1VQUChteWRyYXdwcm9jKTsKKyAgICBteWlkbGVwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUlkbGVVUFAobXlpZGxlcHJvYyk7CisgICAgbXloaXR0ZXN0cHJvY191cHAgPSBOZXdDb250cm9sVXNlclBhbmVIaXRUZXN0VVBQKG15aGl0dGVzdHByb2MpOworICAgIG15dHJhY2tpbmdwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nVVBQKG15dHJhY2tpbmdwcm9jKTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb250cm9sSGFuZGxlLCBDdGxPYmpfTmV3KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29udHJvbEhhbmRsZSwgQ3RsT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9DdGwiLCBDdGxfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9DdGwiLCBDdGxfbWV0aG9kcyk7CiAKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDdGxfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChDdGxfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDdGxfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlDb250cm9sX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDb250cm9sX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29udHJvbF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbnRyb2wiLCAoUHlPYmplY3QgKikmQ29udHJvbF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNvbnRyb2xfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb250cm9sVHlwZSIsIChQeU9iamVjdCAqKSZDb250cm9sX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEN0bF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEN0bF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEN0bF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIENvbnRyb2xfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNvbnRyb2xfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDb250cm9sX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29udHJvbCIsIChQeU9iamVjdCAqKSZDb250cm9sX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ29udHJvbF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbnRyb2xUeXBlIiwgKFB5T2JqZWN0ICopJkNvbnRyb2xfVHlwZSk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2RsZy9fRGxnbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9kbGcvX0RsZ21vZHVsZS5jCmluZGV4IDlhZmE0NzcuLmM0ZDY2YTkgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2RsZy9fRGxnbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZGxnL19EbGdtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzUsNTUgKzM1LDU1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVjb3JkICpldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgKml0ZW1IaXQpCiB7Ci0gICAgICAgIEJvb2xlYW4gcnY7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwotICAgICAgICBQeU9iamVjdCAqY2FsbGJhY2sgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKLSAgICAgICAgaWYgKGNhbGxiYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8qIERlZmF1bHQgYmVoYXZpb3IgKi8KLSAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOyAvKiBXZSdsbCByZXN0b3JlIGl0IHdoZW4gY2FsbCBzdWNjZXNzZnVsICovCi0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgRGxnT2JqX1doaWNoRGlhbG9nLCBkaWFsb2csIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsIGV2ZW50KTsKLSAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXMgPSBOVUxMOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChjYWxsYmFjaywgYXJncyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIEJvb2xlYW4gcnY7CisgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgUHlPYmplY3QgKmNhbGxiYWNrID0gRGxnX0ZpbHRlclByb2NfY2FsbGJhY2s7CisgICAgaWYgKGNhbGxiYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCisgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOyAvKiBXZSdsbCByZXN0b3JlIGl0IHdoZW4gY2FsbCBzdWNjZXNzZnVsICovCisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBEbGdPYmpfV2hpY2hEaWFsb2csIGRpYWxvZywgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgZXZlbnQpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJlcyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGNhbGxiYWNrLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgRmlsdGVyXG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgKml0ZW1IaXQgPSAtMTsgLyogRmFrZSByZXR1cm4gaXRlbSAqLworICAgICAgICByZXR1cm4gMTsgLyogV2UgaGFuZGxlZCBpdCAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgICppdGVtSGl0ID0gUHlJbnRfQXNMb25nKHJlcyk7CisgICAgICAgICAgICBydiA9IDE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgRmlsdGVyXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICAgICAgICAgICppdGVtSGl0ID0gLTE7IC8qIEZha2UgcmV0dXJuIGl0ZW0gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogV2UgaGFuZGxlZCBpdCAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICppdGVtSGl0ID0gUHlJbnRfQXNMb25nKHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydiA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHJlcyk7Ci0gICAgICAgIHJldHVybiBydjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcnYgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgTW9kYWxGaWx0ZXJVUFAKIERsZ19QYXNzRmlsdGVyUHJvYyhQeU9iamVjdCAqY2FsbGJhY2spCiB7Ci0gICAgICAgIFB5T2JqZWN0ICp0bXAgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKLSAgICAgICAgc3RhdGljIE1vZGFsRmlsdGVyVVBQIFVuaXZGaWx0ZXJVcHAgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0bXAgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKKyAgICBzdGF0aWMgTW9kYWxGaWx0ZXJVUFAgVW5pdkZpbHRlclVwcCA9IE5VTEw7CiAKLSAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOwotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodG1wKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBQeV9JTkNSRUYoY2FsbGJhY2spOwotICAgICAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IGNhbGxiYWNrOworICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsKKyAgICBpZiAoY2FsbGJhY2sgPT0gUHlfTm9uZSkgewogICAgICAgICBQeV9YREVDUkVGKHRtcCk7Ci0gICAgICAgIGlmICggVW5pdkZpbHRlclVwcCA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICBVbml2RmlsdGVyVXBwID0gTmV3TW9kYWxGaWx0ZXJVUFAoJkRsZ19Vbml2RmlsdGVyUHJvYyk7Ci0gICAgICAgIHJldHVybiBVbml2RmlsdGVyVXBwOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsKKyAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IGNhbGxiYWNrOworICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICBpZiAoIFVuaXZGaWx0ZXJVcHAgPT0gTlVMTCApCisgICAgICAgIFVuaXZGaWx0ZXJVcHAgPSBOZXdNb2RhbEZpbHRlclVQUCgmRGxnX1VuaXZGaWx0ZXJQcm9jKTsKKyAgICByZXR1cm4gVW5pdkZpbHRlclVwcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID0gTlVMTDsKQEAgLTkxLDI0ICs5MSwyNCBAQAogc3RhdGljIHBhc2NhbCB2b2lkIERsZ19Vbml2VXNlckl0ZW1Qcm9jKERpYWxvZ1B0ciBkaWFsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGl0ZW0pCiB7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOworICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwogCi0gICAgICAgIGlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCi0gICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsgLyogV2UnbGwgcmVzdG9yZSBpdCB3aGVuIGNhbGwgc3VjY2Vzc2Z1bCAqLwotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwgRGxnT2JqX1doaWNoRGlhbG9nLCBkaWFsb2csIGl0ZW0pOwotICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJlcyA9IE5VTEw7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2ssIGFyZ3MpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIERpYWxvZyBVc2VySXRlbSBwcm9jXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICB9Ci0gICAgICAgIFB5X1hERUNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybjsgLyogRGVmYXVsdCBiZWhhdmlvciAqLworICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsgLyogV2UnbGwgcmVzdG9yZSBpdCB3aGVuIGNhbGwgc3VjY2Vzc2Z1bCAqLworICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLCBEbGdPYmpfV2hpY2hEaWFsb2csIGRpYWxvZywgaXRlbSk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmVzID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjaywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gRGlhbG9nIFVzZXJJdGVtIHByb2NcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KKyAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgcmV0dXJuOwogfQogCiAjaWYgMApAQCAtMTMzLDgxMSArMTMzLDgxMSBAQAogI2RlZmluZSBEbGdPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRGlhbG9nX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkRpYWxvZ19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRGlhbG9nT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRGlhbG9nUHRyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRGlhbG9nUHRyIG9iX2l0c2VsZjsKIH0gRGlhbG9nT2JqZWN0OwogCiBQeU9iamVjdCAqRGxnT2JqX05ldyhEaWFsb2dQdHIgaXRzZWxmKQogewotCURpYWxvZ09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7IFB5X0lOQ1JFRihQeV9Ob25lKTsgcmV0dXJuIFB5X05vbmU7IH0KLQlpdCA9IFB5T2JqZWN0X05FVyhEaWFsb2dPYmplY3QsICZEaWFsb2dfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JU2V0V1JlZkNvbihHZXREaWFsb2dXaW5kb3coaXRzZWxmKSwgKGxvbmcpaXQpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBEaWFsb2dPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeyBQeV9JTkNSRUYoUHlfTm9uZSk7IHJldHVybiBQeV9Ob25lOyB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRGlhbG9nT2JqZWN0LCAmRGlhbG9nX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIFNldFdSZWZDb24oR2V0RGlhbG9nV2luZG93KGl0c2VsZiksIChsb25nKWl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBEbGdPYmpfQ29udmVydChQeU9iamVjdCAqdiwgRGlhbG9nUHRyICpwX2l0c2VsZikKIHsKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChEaWFsb2dQdHIpUHlJbnRfQXNMb25nKHYpOwotCSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsgfQotCWlmICghRGxnT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkRpYWxvZyByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChEaWFsb2dPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKERpYWxvZ1B0cilQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOyB9CisgICAgaWYgKCFEbGdPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRGlhbG9nIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKERpYWxvZ09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIERsZ09ial9kZWFsbG9jKERpYWxvZ09iamVjdCAqc2VsZikKIHsKLQlEaXNwb3NlRGlhbG9nKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBEaXNwb3NlRGlhbG9nKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRHJhd0RpYWxvZyhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRHJhd0RpYWxvZwotCVB5TWFjX1BSRUNIRUNLKERyYXdEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURyYXdEaWFsb2coX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3RGlhbG9nKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfVXBkYXRlRGlhbG9nKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHVwZGF0ZVJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHVwZGF0ZVJnbjsKICNpZm5kZWYgVXBkYXRlRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCi0JCXJldHVybiBOVUxMOwotCVVwZGF0ZURpYWxvZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICB1cGRhdGVSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXBkYXRlUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVXBkYXRlRGlhbG9nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIHVwZGF0ZVJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9IaWRlRGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CiAjaWZuZGVmIEhpZGVEaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZURpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVEaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZURpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpdGVtTm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpZGVEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaXRlbU5vKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1Nob3dEaWFsb2dJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKICNpZm5kZWYgU2hvd0RpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhTaG93RGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0RpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIGl0ZW1Obyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd0RpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpdGVtTm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRmluZERpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2OwotCVBvaW50IHRoZVB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2OworICAgIFBvaW50IHRoZVB0OwogI2lmbmRlZiBGaW5kRGlhbG9nSXRlbQotCVB5TWFjX1BSRUNIRUNLKEZpbmREaWFsb2dJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaW5kRGlhbG9nSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaW5kRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZVB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaW5kRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nQ3V0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaWFsb2dDdXQKLQlQeU1hY19QUkVDSEVDSyhEaWFsb2dDdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ0N1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlhbG9nQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlhbG9nQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nUGFzdGUoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERpYWxvZ1Bhc3RlCi0JUHlNYWNfUFJFQ0hFQ0soRGlhbG9nUGFzdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ1Bhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEaWFsb2dQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpYWxvZ1Bhc3RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nQ29weShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlhbG9nQ29weQotCVB5TWFjX1BSRUNIRUNLKERpYWxvZ0NvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpYWxvZ0NvcHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaWFsb2dDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfRGlhbG9nRGVsZXRlKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaWFsb2dEZWxldGUKLQlQeU1hY19QUkVDSEVDSyhEaWFsb2dEZWxldGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ0RlbGV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlhbG9nRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlhbG9nRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87Ci0JRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7Ci0JSGFuZGxlIGl0ZW07Ci0JUmVjdCBib3g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7CisgICAgSGFuZGxlIGl0ZW07CisgICAgUmVjdCBib3g7CiAjaWZuZGVmIEdldERpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgaXRlbU5vLAotCSAgICAgICAgICAgICAgJml0ZW1UeXBlLAotCSAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAmYm94KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm94KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGl0ZW1ObywKKyAgICAgICAgICAgICAgICAgICZpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgJmJveCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1NldERpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbU5vOwotCURpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlOwotCUhhbmRsZSBpdGVtOwotCVJlY3QgYm94OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbU5vOworICAgIERpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlOworICAgIEhhbmRsZSBpdGVtOworICAgIFJlY3QgYm94OwogI2lmbmRlZiBTZXREaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveCkpCi0JCXJldHVybiBOVUxMOwotCVNldERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGl0ZW1ObywKLQkgICAgICAgICAgICAgIGl0ZW1UeXBlLAotCSAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICZib3gpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGl0ZW1ObywKKyAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlLAorICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICZib3gpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2VsZWN0RGlhbG9nSXRlbVRleHQoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbU5vOwotCVNJbnQxNiBzdHJ0U2VsOwotCVNJbnQxNiBlbmRTZWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgU0ludDE2IHN0cnRTZWw7CisgICAgU0ludDE2IGVuZFNlbDsKICNpZm5kZWYgU2VsZWN0RGlhbG9nSXRlbVRleHQKLQlQeU1hY19QUkVDSEVDSyhTZWxlY3REaWFsb2dJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2VsZWN0RGlhbG9nSXRlbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0cnRTZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmRTZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlTZWxlY3REaWFsb2dJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICBzdHJ0U2VsLAotCSAgICAgICAgICAgICAgICAgICAgIGVuZFNlbCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ0U2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kU2VsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2VsZWN0RGlhbG9nSXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydFNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmRTZWwpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfQXBwZW5kRElUTChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB0aGVIYW5kbGU7Ci0JRElUTE1ldGhvZCBtZXRob2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSB0aGVIYW5kbGU7CisgICAgRElUTE1ldGhvZCBtZXRob2Q7CiAjaWZuZGVmIEFwcGVuZERJVEwKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRESVRMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBcHBlbmRESVRMKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQXBwZW5kRElUTChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgdGhlSGFuZGxlLAotCSAgICAgICAgICAgbWV0aG9kKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRob2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBcHBlbmRESVRMKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICB0aGVIYW5kbGUsCisgICAgICAgICAgICAgICBtZXRob2QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfQ291bnRESVRMKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IF9ydjsKICNpZm5kZWYgQ291bnRESVRMCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRESVRMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudERJVEwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50RElUTChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRESVRMKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TaG9ydGVuRElUTChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBudW1iZXJJdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IG51bWJlckl0ZW1zOwogI2lmbmRlZiBTaG9ydGVuRElUTAotCVB5TWFjX1BSRUNIRUNLKFNob3J0ZW5ESVRMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG9ydGVuRElUTCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bWJlckl0ZW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2hvcnRlbkRJVEwoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBudW1iZXJJdGVtcyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVySXRlbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaG9ydGVuRElUTChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIG51bWJlckl0ZW1zKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0luc2VydERpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURpYWxvZ0l0ZW1JbmRleCBhZnRlckl0ZW07Ci0JRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7Ci0JSGFuZGxlIGl0ZW1IYW5kbGU7Ci0JUmVjdCBib3g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRGlhbG9nSXRlbUluZGV4IGFmdGVySXRlbTsKKyAgICBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZTsKKyAgICBIYW5kbGUgaXRlbUhhbmRsZTsKKyAgICBSZWN0IGJveDsKICNpZm5kZWYgSW5zZXJ0RGlhbG9nSXRlbQotCVB5TWFjX1BSRUNIRUNLKEluc2VydERpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydERpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1IYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3gpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZib3gpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc2VydERpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm94KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfUmVtb3ZlRGlhbG9nSXRlbXMoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87Ci0JRGlhbG9nSXRlbUluZGV4IGFtb3VudFRvUmVtb3ZlOwotCUJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgRGlhbG9nSXRlbUluZGV4IGFtb3VudFRvUmVtb3ZlOworICAgIEJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhOwogI2lmbmRlZiBSZW1vdmVEaWFsb2dJdGVtcwotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZURpYWxvZ0l0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVEaWFsb2dJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmYW1vdW50VG9SZW1vdmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXNwb3NlSXRlbURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRGlhbG9nSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnRUb1JlbW92ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZUl0ZW1EYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYW1vdW50VG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwb3NlSXRlbURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRGlhbG9nSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnRUb1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZUl0ZW1EYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU3RkRmlsdGVyUHJvYyhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIGV2ZW50OwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBldmVudDsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKICNpZm5kZWYgU3RkRmlsdGVyUHJvYwotCVB5TWFjX1BSRUNIRUNLKFN0ZEZpbHRlclByb2MpOworICAgIFB5TWFjX1BSRUNIRUNLKFN0ZEZpbHRlclByb2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTdGRGaWx0ZXJQcm9jKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmZXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTdGRGaWx0ZXJQcm9jKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1NldERpYWxvZ0RlZmF1bHRJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEaWFsb2dJdGVtSW5kZXggbmV3SXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEaWFsb2dJdGVtSW5kZXggbmV3SXRlbTsKICNpZm5kZWYgU2V0RGlhbG9nRGVmYXVsdEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dEZWZhdWx0SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nRGVmYXVsdEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERpYWxvZ0RlZmF1bHRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3SXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREaWFsb2dEZWZhdWx0SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJdGVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nQ2FuY2VsSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW07CiAjaWZuZGVmIFNldERpYWxvZ0NhbmNlbEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dDYW5jZWxJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dDYW5jZWxJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3SXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREaWFsb2dDYW5jZWxJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SXRlbSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdJdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERpYWxvZ0NhbmNlbEl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJdGVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nVHJhY2tzQ3Vyc29yKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlCb29sZWFuIHRyYWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBCb29sZWFuIHRyYWNrczsKICNpZm5kZWYgU2V0RGlhbG9nVHJhY2tzQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nVHJhY2tzQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dUcmFja3NDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFja3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGlhbG9nVHJhY2tzQ3Vyc29yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERpYWxvZ1RyYWNrc0N1cnNvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfQXV0b1NpemVEaWFsb2coRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBdXRvU2l6ZURpYWxvZwotCVB5TWFjX1BSRUNIRUNLKEF1dG9TaXplRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBdXRvU2l6ZURpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEF1dG9TaXplRGlhbG9nKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQXV0b1NpemVEaWFsb2coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldERpYWxvZ0l0ZW1Bc0NvbnRyb2woRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW1ObzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbU5vOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgR2V0RGlhbG9nSXRlbUFzQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1ObykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREaWFsb2dJdGVtQXNDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1ObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9Nb3ZlRGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbU5vOwotCVNJbnQxNiBpbkhvcml6OwotCVNJbnQxNiBpblZlcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbU5vOworICAgIFNJbnQxNiBpbkhvcml6OworICAgIFNJbnQxNiBpblZlcnQ7CiAjaWZuZGVmIE1vdmVEaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soTW92ZURpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVEaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZlcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTW92ZURpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgIGluSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgIGluVmVydCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVmVydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBNb3ZlRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1ObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Ib3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WZXJ0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2l6ZURpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW1ObzsKLQlTSW50MTYgaW5XaWR0aDsKLQlTSW50MTYgaW5IZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbU5vOworICAgIFNJbnQxNiBpbldpZHRoOworICAgIFNJbnQxNiBpbkhlaWdodDsKICNpZm5kZWYgU2l6ZURpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhTaXplRGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2l6ZURpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5XaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNpemVEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGluSXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICBpbldpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBpbkhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNpemVEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0FwcGVuZERpYWxvZ0l0ZW1MaXN0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgZGl0bElEOwotCURJVExNZXRob2QgbWV0aG9kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBkaXRsSUQ7CisgICAgRElUTE1ldGhvZCBtZXRob2Q7CiAjaWZuZGVmIEFwcGVuZERpYWxvZ0l0ZW1MaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soQXBwZW5kRGlhbG9nSXRlbUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZERpYWxvZ0l0ZW1MaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpdGxJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1ldGhvZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBcHBlbmREaWFsb2dJdGVtTGlzdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXRsSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGl0bElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFwcGVuZERpYWxvZ0l0ZW1MaXN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdGxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nVGltZW91dChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IGluQnV0dG9uVG9QcmVzczsKLQlVSW50MzIgaW5TZWNvbmRzVG9XYWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBpbkJ1dHRvblRvUHJlc3M7CisgICAgVUludDMyIGluU2Vjb25kc1RvV2FpdDsKICNpZm5kZWYgU2V0RGlhbG9nVGltZW91dAotCVB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ1RpbWVvdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ1RpbWVvdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5CdXR0b25Ub1ByZXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TZWNvbmRzVG9XYWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERpYWxvZ1RpbWVvdXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkJ1dHRvblRvUHJlc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5TZWNvbmRzVG9XYWl0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1dHRvblRvUHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNlY29uZHNUb1dhaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGlhbG9nVGltZW91dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnV0dG9uVG9QcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNlY29uZHNUb1dhaXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dUaW1lb3V0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0QnV0dG9uVG9QcmVzczsKLQlVSW50MzIgb3V0U2Vjb25kc1RvV2FpdDsKLQlVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgb3V0QnV0dG9uVG9QcmVzczsKKyAgICBVSW50MzIgb3V0U2Vjb25kc1RvV2FpdDsKKyAgICBVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZzsKICNpZm5kZWYgR2V0RGlhbG9nVGltZW91dAotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1RpbWVvdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1RpbWVvdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREaWFsb2dUaW1lb3V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1dHRvblRvUHJlc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNlY29uZHNUb1dhaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNlY29uZHNSZW1haW5pbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0QnV0dG9uVG9QcmVzcywKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTZWNvbmRzVG9XYWl0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dFNlY29uZHNSZW1haW5pbmcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGlhbG9nVGltZW91dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCdXR0b25Ub1ByZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTZWNvbmRzVG9XYWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTZWNvbmRzUmVtYWluaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJobGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1dHRvblRvUHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2Vjb25kc1RvV2FpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTZWNvbmRzUmVtYWluaW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0TW9kYWxEaWFsb2dFdmVudE1hc2soRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUV2ZW50TWFzayBpbk1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRXZlbnRNYXNrIGluTWFzazsKICNpZm5kZWYgU2V0TW9kYWxEaWFsb2dFdmVudE1hc2sKLQlQeU1hY19QUkVDSEVDSyhTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW9kYWxEaWFsb2dFdmVudE1hc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TW9kYWxEaWFsb2dFdmVudE1hc2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NYXNrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hc2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXRNb2RhbERpYWxvZ0V2ZW50TWFzayhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRNYXNrIG91dE1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRXZlbnRNYXNrIG91dE1hc2s7CiAjaWZuZGVmIEdldE1vZGFsRGlhbG9nRXZlbnRNYXNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW9kYWxEaWFsb2dFdmVudE1hc2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vZGFsRGlhbG9nRXZlbnRNYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TW9kYWxEaWFsb2dFdmVudE1hc2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hc2spOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1hc2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW9kYWxEaWFsb2dFdmVudE1hc2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hc2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1hc2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dXaW5kb3coRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBHZXREaWFsb2dXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlURUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRFSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dUZXh0RWRpdEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldERpYWxvZ1RleHRFZGl0SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dEZWZhdWx0SXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIEdldERpYWxvZ0RlZmF1bHRJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nRGVmYXVsdEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0RlZmF1bHRJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREaWFsb2dEZWZhdWx0SXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nRGVmYXVsdEl0ZW0oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldERpYWxvZ0NhbmNlbEl0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXREaWFsb2dDYW5jZWxJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nQ2FuY2VsSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nQ2FuY2VsSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nQ2FuY2VsSXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nQ2FuY2VsSXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nS2V5Ym9hcmRGb2N1c0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbQotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nS2V5Ym9hcmRGb2N1c0l0ZW0oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TZXRQb3J0RGlhbG9nUG9ydChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2V0UG9ydERpYWxvZ1BvcnQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0RGlhbG9nUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydERpYWxvZ1BvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnREaWFsb2dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydERpYWxvZ1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dQb3J0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBfcnY7CiAjaWZuZGVmIEdldERpYWxvZ1BvcnQKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dQb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREaWFsb2dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERpYWxvZ1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIERsZ09ial9tZXRob2RzW10gPSB7Ci0JeyJEcmF3RGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EcmF3RGlhbG9nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1VwZGF0ZURpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKLQl7IkhpZGVEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9IaWRlRGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKLQl7IlNob3dEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TaG93RGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKLQl7IkZpbmREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9GaW5kRGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2KSIpfSwKLQl7IkRpYWxvZ0N1dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nQ3V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEaWFsb2dQYXN0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nUGFzdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRpYWxvZ0NvcHkiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0RpYWxvZ0NvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRpYWxvZ0RlbGV0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nRGVsZXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vKSAtPiAoRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGUsIEhhbmRsZSBpdGVtLCBSZWN0IGJveCkiKX0sCi0JeyJTZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW0sIFJlY3QgYm94KSAtPiBOb25lIil9LAotCXsiU2VsZWN0RGlhbG9nSXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NlbGVjdERpYWxvZ0l0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBTSW50MTYgc3RydFNlbCwgU0ludDE2IGVuZFNlbCkgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZERJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0FwcGVuZERJVEwsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSB0aGVIYW5kbGUsIERJVExNZXRob2QgbWV0aG9kKSAtPiBOb25lIil9LAotCXsiQ291bnRESVRMIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9Db3VudERJVEwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAotCXsiU2hvcnRlbkRJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1Nob3J0ZW5ESVRMLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggbnVtYmVySXRlbXMpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9JbnNlcnREaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggYWZ0ZXJJdGVtLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW1IYW5kbGUsIFJlY3QgYm94KSAtPiBOb25lIil9LAotCXsiUmVtb3ZlRGlhbG9nSXRlbXMiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1JlbW92ZURpYWxvZ0l0ZW1zLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtSW5kZXggYW1vdW50VG9SZW1vdmUsIEJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhKSAtPiBOb25lIil9LAotCXsiU3RkRmlsdGVyUHJvYyIsIChQeUNGdW5jdGlvbilEbGdPYmpfU3RkRmlsdGVyUHJvYywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQsIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0KSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIGV2ZW50LCBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdCkiKX0sCi0JeyJTZXREaWFsb2dEZWZhdWx0SXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nRGVmYXVsdEl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBuZXdJdGVtKSAtPiBOb25lIil9LAotCXsiU2V0RGlhbG9nQ2FuY2VsSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nQ2FuY2VsSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW0pIC0+IE5vbmUiKX0sCi0JeyJTZXREaWFsb2dUcmFja3NDdXJzb3IiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NldERpYWxvZ1RyYWNrc0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiB0cmFja3MpIC0+IE5vbmUiKX0sCi0JeyJBdXRvU2l6ZURpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdPYmpfQXV0b1NpemVEaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0l0ZW1Bc0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJNb3ZlRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfTW92ZURpYWxvZ0l0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluSG9yaXosIFNJbnQxNiBpblZlcnQpIC0+IE5vbmUiKX0sCi0JeyJTaXplRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2l6ZURpYWxvZ0l0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluV2lkdGgsIFNJbnQxNiBpbkhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZERpYWxvZ0l0ZW1MaXN0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9BcHBlbmREaWFsb2dJdGVtTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGRpdGxJRCwgRElUTE1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCi0JeyJTZXREaWFsb2dUaW1lb3V0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dUaW1lb3V0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5CdXR0b25Ub1ByZXNzLCBVSW50MzIgaW5TZWNvbmRzVG9XYWl0KSAtPiBOb25lIil9LAotCXsiR2V0RGlhbG9nVGltZW91dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nVGltZW91dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEJ1dHRvblRvUHJlc3MsIFVJbnQzMiBvdXRTZWNvbmRzVG9XYWl0LCBVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZykiKX0sCi0JeyJTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayBpbk1hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TWFzayBvdXRNYXNrKSIpfSwKLQl7IkdldERpYWxvZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkdldERpYWxvZ1RleHRFZGl0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dUZXh0RWRpdEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKLQl7IkdldERpYWxvZ0RlZmF1bHRJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dEZWZhdWx0SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJHZXREaWFsb2dDYW5jZWxJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dDYW5jZWxJdGVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJTZXRQb3J0RGlhbG9nUG9ydCIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0UG9ydERpYWxvZ1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldERpYWxvZ1BvcnQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJEcmF3RGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EcmF3RGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1VwZGF0ZURpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkhpZGVEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9IaWRlRGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TaG93RGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IGl0ZW1ObykgLT4gTm9uZSIpfSwKKyAgICB7IkZpbmREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9GaW5kRGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChEaWFsb2dJdGVtSW5kZXhaZXJvQmFzZWQgX3J2KSIpfSwKKyAgICB7IkRpYWxvZ0N1dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nQ3V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEaWFsb2dQYXN0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nUGFzdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpYWxvZ0NvcHkiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0RpYWxvZ0NvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpYWxvZ0RlbGV0ZSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nRGVsZXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vKSAtPiAoRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGUsIEhhbmRsZSBpdGVtLCBSZWN0IGJveCkiKX0sCisgICAgeyJTZXREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW0sIFJlY3QgYm94KSAtPiBOb25lIil9LAorICAgIHsiU2VsZWN0RGlhbG9nSXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NlbGVjdERpYWxvZ0l0ZW1UZXh0LCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBTSW50MTYgc3RydFNlbCwgU0ludDE2IGVuZFNlbCkgLT4gTm9uZSIpfSwKKyAgICB7IkFwcGVuZERJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0FwcGVuZERJVEwsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB0aGVIYW5kbGUsIERJVExNZXRob2QgbWV0aG9kKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRESVRMIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9Db3VudERJVEwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAorICAgIHsiU2hvcnRlbkRJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1Nob3J0ZW5ESVRMLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggbnVtYmVySXRlbXMpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnREaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9JbnNlcnREaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggYWZ0ZXJJdGVtLCBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW1IYW5kbGUsIFJlY3QgYm94KSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlRGlhbG9nSXRlbXMiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1JlbW92ZURpYWxvZ0l0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vLCBEaWFsb2dJdGVtSW5kZXggYW1vdW50VG9SZW1vdmUsIEJvb2xlYW4gZGlzcG9zZUl0ZW1EYXRhKSAtPiBOb25lIil9LAorICAgIHsiU3RkRmlsdGVyUHJvYyIsIChQeUNGdW5jdGlvbilEbGdPYmpfU3RkRmlsdGVyUHJvYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQsIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0KSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIGV2ZW50LCBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdCkiKX0sCisgICAgeyJTZXREaWFsb2dEZWZhdWx0SXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nRGVmYXVsdEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBuZXdJdGVtKSAtPiBOb25lIil9LAorICAgIHsiU2V0RGlhbG9nQ2FuY2VsSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nQ2FuY2VsSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJTZXREaWFsb2dUcmFja3NDdXJzb3IiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NldERpYWxvZ1RyYWNrc0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiB0cmFja3MpIC0+IE5vbmUiKX0sCisgICAgeyJBdXRvU2l6ZURpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdPYmpfQXV0b1NpemVEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0l0ZW1Bc0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJNb3ZlRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfTW92ZURpYWxvZ0l0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluSG9yaXosIFNJbnQxNiBpblZlcnQpIC0+IE5vbmUiKX0sCisgICAgeyJTaXplRGlhbG9nSXRlbSIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2l6ZURpYWxvZ0l0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW1ObywgU0ludDE2IGluV2lkdGgsIFNJbnQxNiBpbkhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IkFwcGVuZERpYWxvZ0l0ZW1MaXN0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9BcHBlbmREaWFsb2dJdGVtTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGRpdGxJRCwgRElUTE1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCisgICAgeyJTZXREaWFsb2dUaW1lb3V0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dUaW1lb3V0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5CdXR0b25Ub1ByZXNzLCBVSW50MzIgaW5TZWNvbmRzVG9XYWl0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGlhbG9nVGltZW91dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nVGltZW91dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEJ1dHRvblRvUHJlc3MsIFVJbnQzMiBvdXRTZWNvbmRzVG9XYWl0LCBVSW50MzIgb3V0U2Vjb25kc1JlbWFpbmluZykiKX0sCisgICAgeyJTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50TWFzayBpbk1hc2spIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb2RhbERpYWxvZ0V2ZW50TWFzayIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0TW9kYWxEaWFsb2dFdmVudE1hc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TWFzayBvdXRNYXNrKSIpfSwKKyAgICB7IkdldERpYWxvZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkdldERpYWxvZ1RleHRFZGl0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dUZXh0RWRpdEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldERpYWxvZ0RlZmF1bHRJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dEZWZhdWx0SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJHZXREaWFsb2dDYW5jZWxJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dDYW5jZWxJdGVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJTZXRQb3J0RGlhbG9nUG9ydCIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0UG9ydERpYWxvZ1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERpYWxvZ1BvcnQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIERsZ09ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTk0NSwxNiArOTQ1LDE2IEBACiAKIHN0YXRpYyBpbnQgRGxnT2JqX2NvbXBhcmUoRGlhbG9nT2JqZWN0ICpzZWxmLCBEaWFsb2dPYmplY3QgKm90aGVyKQogewotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgRGxnT2JqX3JlcHIgTlVMTAogCiBzdGF0aWMgaW50IERsZ09ial9oYXNoKERpYWxvZ09iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogI2RlZmluZSBEbGdPYmpfdHBfaW5pdCAwCiAKQEAgLTk2Miw2MSArOTYyLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlEaWFsb2dQdHIgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBEaWFsb2dQdHIgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRGxnT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRGlhbG9nT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIERsZ09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKERpYWxvZ09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBEbGdPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRGlhbG9nX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0RsZy5EaWFsb2ciLCAvKnRwX25hbWUqLwotCXNpemVvZihEaWFsb2dPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBEbGdPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRGxnT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBEbGdPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIERsZ09ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlEbGdPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRGxnT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCURsZ09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRGxnT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCURsZ09ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCURsZ09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0RsZy5EaWFsb2ciLCAvKnRwX25hbWUqLworICAgIHNpemVvZihEaWFsb2dPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBEbGdPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRGxnT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBEbGdPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIERsZ09ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBEbGdPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRGxnT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIERsZ09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRGxnT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIERsZ09ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIERsZ09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIERpYWxvZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEwMjQsNTAzICsxMDI0LDUwMyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19OZXdEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ1B0ciBfcnY7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVN0cjI1NSB0aXRsZTsKLQlCb29sZWFuIHZpc2libGU7Ci0JU0ludDE2IHByb2NJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOwotCUJvb2xlYW4gZ29Bd2F5RmxhZzsKLQlTSW50MzIgcmVmQ29uOwotCUhhbmRsZSBpdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nUHRyIF9ydjsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU3RyMjU1IHRpdGxlOworICAgIEJvb2xlYW4gdmlzaWJsZTsKKyAgICBTSW50MTYgcHJvY0lEOworICAgIFdpbmRvd1B0ciBiZWhpbmQ7CisgICAgQm9vbGVhbiBnb0F3YXlGbGFnOworICAgIFNJbnQzMiByZWZDb247CisgICAgSGFuZGxlIGl0ZW1zOwogI2lmbmRlZiBOZXdEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhOZXdEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld0RpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld0RpYWxvZygodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgdmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgcHJvY0lELAotCSAgICAgICAgICAgICAgICBiZWhpbmQsCi0JICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgIHJlZkNvbiwKLQkgICAgICAgICAgICAgICAgaXRlbXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld0RpYWxvZygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgcHJvY0lELAorICAgICAgICAgICAgICAgICAgICBiZWhpbmQsCisgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfR2V0TmV3RGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dQdHIgX3J2OwotCVNJbnQxNiBkaWFsb2dJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dQdHIgX3J2OworICAgIFNJbnQxNiBkaWFsb2dJRDsKKyAgICBXaW5kb3dQdHIgYmVoaW5kOwogI2lmbmRlZiBHZXROZXdEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhHZXROZXdEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5ld0RpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlhbG9nSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV3RGlhbG9nKGRpYWxvZ0lELAotCSAgICAgICAgICAgICAgICAgICAodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICAgIGJlaGluZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWFsb2dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXdEaWFsb2coZGlhbG9nSUQsCisgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX05ld0NvbG9yRGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dQdHIgX3J2OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTdHIyNTUgdGl0bGU7Ci0JQm9vbGVhbiB2aXNpYmxlOwotCVNJbnQxNiBwcm9jSUQ7Ci0JV2luZG93UHRyIGJlaGluZDsKLQlCb29sZWFuIGdvQXdheUZsYWc7Ci0JU0ludDMyIHJlZkNvbjsKLQlIYW5kbGUgaXRlbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ1B0ciBfcnY7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFN0cjI1NSB0aXRsZTsKKyAgICBCb29sZWFuIHZpc2libGU7CisgICAgU0ludDE2IHByb2NJRDsKKyAgICBXaW5kb3dQdHIgYmVoaW5kOworICAgIEJvb2xlYW4gZ29Bd2F5RmxhZzsKKyAgICBTSW50MzIgcmVmQ29uOworICAgIEhhbmRsZSBpdGVtczsKICNpZm5kZWYgTmV3Q29sb3JEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhOZXdDb2xvckRpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3Q29sb3JEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdDb2xvckRpYWxvZygodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICBwcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdDb2xvckRpYWxvZygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX01vZGFsRGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQeU9iamVjdCogbW9kYWxGaWx0ZXI7Ci0JRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKICNpZm5kZWYgTW9kYWxEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhNb2RhbERpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW9kYWxEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCU1vZGFsRGlhbG9nKERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlciksCi0JICAgICAgICAgICAgJml0ZW1IaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTW9kYWxEaWFsb2coRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSwKKyAgICAgICAgICAgICAgICAmaXRlbUhpdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1IaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19Jc0RpYWxvZ0V2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CiAjaWZuZGVmIElzRGlhbG9nRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhJc0RpYWxvZ0V2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0RpYWxvZ0V2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZ0aGVFdmVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzRGlhbG9nRXZlbnQoJnRoZUV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0RpYWxvZ0V2ZW50KCZ0aGVFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0RpYWxvZ1NlbGVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7Ci0JRGlhbG9nUHRyIHRoZURpYWxvZzsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgRGlhbG9nUHRyIHRoZURpYWxvZzsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKICNpZm5kZWYgRGlhbG9nU2VsZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRGlhbG9nU2VsZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaWFsb2dTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGlhbG9nU2VsZWN0KCZ0aGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgJnRoZURpYWxvZywKLQkgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX1doaWNoRGlhbG9nLCB0aGVEaWFsb2csCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGlhbG9nU2VsZWN0KCZ0aGVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnRoZURpYWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1IaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX1doaWNoRGlhbG9nLCB0aGVEaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0FsZXJ0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggX3J2OwotCVNJbnQxNiBhbGVydElEOwotCVB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IF9ydjsKKyAgICBTSW50MTYgYWxlcnRJRDsKKyAgICBQeU9iamVjdCogbW9kYWxGaWx0ZXI7CiAjaWZuZGVmIEFsZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soQWxlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFsZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFsZXJ0KGFsZXJ0SUQsCi0JICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQWxlcnQoYWxlcnRJRCwKKyAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfU3RvcEFsZXJ0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggX3J2OwotCVNJbnQxNiBhbGVydElEOwotCVB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IF9ydjsKKyAgICBTSW50MTYgYWxlcnRJRDsKKyAgICBQeU9iamVjdCogbW9kYWxGaWx0ZXI7CiAjaWZuZGVmIFN0b3BBbGVydAotCVB5TWFjX1BSRUNIRUNLKFN0b3BBbGVydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RvcEFsZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN0b3BBbGVydChhbGVydElELAotCSAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGVydElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kYWxGaWx0ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTdG9wQWxlcnQoYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX05vdGVBbGVydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IF9ydjsKLQlTSW50MTYgYWxlcnRJRDsKLQlQeU9iamVjdCogbW9kYWxGaWx0ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBfcnY7CisgICAgU0ludDE2IGFsZXJ0SUQ7CisgICAgUHlPYmplY3QqIG1vZGFsRmlsdGVyOwogI2lmbmRlZiBOb3RlQWxlcnQKLQlQeU1hY19QUkVDSEVDSyhOb3RlQWxlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE5vdGVBbGVydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGVydElELAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kYWxGaWx0ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOb3RlQWxlcnQoYWxlcnRJRCwKLQkgICAgICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTm90ZUFsZXJ0KGFsZXJ0SUQsCisgICAgICAgICAgICAgICAgICAgIERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlcikpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19DYXV0aW9uQWxlcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBfcnY7Ci0JU0ludDE2IGFsZXJ0SUQ7Ci0JUHlPYmplY3QqIG1vZGFsRmlsdGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggX3J2OworICAgIFNJbnQxNiBhbGVydElEOworICAgIFB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKICNpZm5kZWYgQ2F1dGlvbkFsZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soQ2F1dGlvbkFsZXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYXV0aW9uQWxlcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2F1dGlvbkFsZXJ0KGFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgICAgIERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlcikpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENhdXRpb25BbGVydChhbGVydElELAorICAgICAgICAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfUGFyYW1UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgcGFyYW0wOwotCVN0cjI1NSBwYXJhbTE7Ci0JU3RyMjU1IHBhcmFtMjsKLQlTdHIyNTUgcGFyYW0zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgcGFyYW0wOworICAgIFN0cjI1NSBwYXJhbTE7CisgICAgU3RyMjU1IHBhcmFtMjsKKyAgICBTdHIyNTUgcGFyYW0zOwogI2lmbmRlZiBQYXJhbVRleHQKLQlQeU1hY19QUkVDSEVDSyhQYXJhbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhcmFtVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0wLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFyYW1UZXh0KHBhcmFtMCwKLQkgICAgICAgICAgcGFyYW0xLAotCSAgICAgICAgICBwYXJhbTIsCi0JICAgICAgICAgIHBhcmFtMyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYXJhbVRleHQocGFyYW0wLAorICAgICAgICAgICAgICBwYXJhbTEsCisgICAgICAgICAgICAgIHBhcmFtMiwKKyAgICAgICAgICAgICAgcGFyYW0zKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0dldERpYWxvZ0l0ZW1UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgaXRlbTsKLQlTdHIyNTUgdGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIGl0ZW07CisgICAgU3RyMjU1IHRleHQ7CiAjaWZuZGVmIEdldERpYWxvZ0l0ZW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nSXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0RGlhbG9nSXRlbVRleHQoaXRlbSwKLQkgICAgICAgICAgICAgICAgICB0ZXh0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0ZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldERpYWxvZ0l0ZW1UZXh0KGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgdGV4dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX1NldERpYWxvZ0l0ZW1UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgaXRlbTsKLQlTdHIyNTUgdGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIGl0ZW07CisgICAgU3RyMjU1IHRleHQ7CiAjaWZuZGVmIFNldERpYWxvZ0l0ZW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nSXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0l0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGV4dCkpCi0JCXJldHVybiBOVUxMOwotCVNldERpYWxvZ0l0ZW1UZXh0KGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgdGV4dCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldERpYWxvZ0l0ZW1UZXh0KGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19HZXRBbGVydFN0YWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRBbGVydFN0YWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0QWxlcnRTdGFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0QWxlcnRTdGFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0QWxlcnRTdGFnZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRBbGVydFN0YWdlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX1NldERpYWxvZ0ZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBmb250TnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgZm9udE51bTsKICNpZm5kZWYgU2V0RGlhbG9nRm9udAotCVB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0ZvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0ZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0RGlhbG9nRm9udChmb250TnVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0RGlhbG9nRm9udChmb250TnVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX1Jlc2V0QWxlcnRTdGFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBSZXNldEFsZXJ0U3RhZ2UKLQlQeU1hY19QUkVDSEVDSyhSZXNldEFsZXJ0U3RhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlc2V0QWxlcnRTdGFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVzZXRBbGVydFN0YWdlKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZXNldEFsZXJ0U3RhZ2UoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0dldFBhcmFtVGV4dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IHBhcmFtMDsKLQlTdHIyNTUgcGFyYW0xOwotCVN0cjI1NSBwYXJhbTI7Ci0JU3RyMjU1IHBhcmFtMzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IHBhcmFtMDsKKyAgICBTdHIyNTUgcGFyYW0xOworICAgIFN0cjI1NSBwYXJhbTI7CisgICAgU3RyMjU1IHBhcmFtMzsKICNpZm5kZWYgR2V0UGFyYW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UGFyYW1UZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQYXJhbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMykpCi0JCXJldHVybiBOVUxMOwotCUdldFBhcmFtVGV4dChwYXJhbTAsCi0JICAgICAgICAgICAgIHBhcmFtMSwKLQkgICAgICAgICAgICAgcGFyYW0yLAotCSAgICAgICAgICAgICBwYXJhbTMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UGFyYW1UZXh0KHBhcmFtMCwKKyAgICAgICAgICAgICAgICAgcGFyYW0xLAorICAgICAgICAgICAgICAgICBwYXJhbTIsCisgICAgICAgICAgICAgICAgIHBhcmFtMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19OZXdGZWF0dXJlc0RpYWxvZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nUHRyIF9ydjsKLQlSZWN0IGluQm91bmRzUmVjdDsKLQlTdHIyNTUgaW5UaXRsZTsKLQlCb29sZWFuIGluSXNWaXNpYmxlOwotCVNJbnQxNiBpblByb2NJRDsKLQlXaW5kb3dQdHIgaW5CZWhpbmQ7Ci0JQm9vbGVhbiBpbkdvQXdheUZsYWc7Ci0JU0ludDMyIGluUmVmQ29uOwotCUhhbmRsZSBpbkl0ZW1MaXN0SGFuZGxlOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dQdHIgX3J2OworICAgIFJlY3QgaW5Cb3VuZHNSZWN0OworICAgIFN0cjI1NSBpblRpdGxlOworICAgIEJvb2xlYW4gaW5Jc1Zpc2libGU7CisgICAgU0ludDE2IGluUHJvY0lEOworICAgIFdpbmRvd1B0ciBpbkJlaGluZDsKKyAgICBCb29sZWFuIGluR29Bd2F5RmxhZzsKKyAgICBTSW50MzIgaW5SZWZDb247CisgICAgSGFuZGxlIGluSXRlbUxpc3RIYW5kbGU7CisgICAgVUludDMyIGluRmxhZ3M7CiAjaWZuZGVmIE5ld0ZlYXR1cmVzRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soTmV3RmVhdHVyZXNEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld0ZlYXR1cmVzRGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluVGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzVmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluQmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Hb0F3YXlGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5JdGVtTGlzdEhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdGZWF0dXJlc0RpYWxvZygodm9pZCAqKTAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmluQm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluSXNWaXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluQmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluR29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1MaXN0SGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpblRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc1Zpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbkJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluR29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSXRlbUxpc3RIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3RmVhdHVyZXNEaWFsb2coKHZvaWQgKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTGlzdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0dldERpYWxvZ0Zyb21XaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ1B0ciBfcnY7Ci0JV2luZG93UHRyIHdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nUHRyIF9ydjsKKyAgICBXaW5kb3dQdHIgd2luZG93OwogI2lmbmRlZiBHZXREaWFsb2dGcm9tV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nRnJvbVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nRnJvbVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nRnJvbVdpbmRvdyh3aW5kb3cpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nRnJvbVdpbmRvdyh3aW5kb3cpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfU2V0VXNlckl0ZW1IYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQkgICAgICAgIFB5T2JqZWN0ICpuZXcgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqbmV3ID0gTlVMTDsKIAogCi0JICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyIsICZuZXcpKQotCSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAifE8iLCAmbmV3KSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JICAgICAgICBpZiAoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayAmJiBuZXcgJiYgbmV3ICE9IFB5X05vbmUpIHsKLQkgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERsZ19FcnJvciwgIkFub3RoZXIgVXNlckl0ZW1Qcm9jIGlzIGFscmVhZHkgaW5zdGFsbGVkIik7Ci0JICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgfQorICAgICAgICBpZiAoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayAmJiBuZXcgJiYgbmV3ICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEbGdfRXJyb3IsICJBbm90aGVyIFVzZXJJdGVtUHJvYyBpcyBhbHJlYWR5IGluc3RhbGxlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCSAgICAgICAgaWYgKG5ldyA9PSBOVUxMIHx8IG5ldyA9PSBQeV9Ob25lKSB7Ci0JICAgICAgICAgICAgICAgIG5ldyA9IE5VTEw7Ci0JICAgICAgICAgICAgICAgIF9yZXMgPSBQeV9Ob25lOwotCSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICB9IGVsc2UgewotCSAgICAgICAgICAgICAgICBQeV9JTkNSRUYobmV3KTsKLQkgICAgICAgICAgICAgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlOZXdVc2VySXRlbVVQUChEbGdfVW5pdlVzZXJJdGVtUHJvYykpOwotCSAgICAgICAgfQorICAgICAgICBpZiAobmV3ID09IE5VTEwgfHwgbmV3ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIG5ldyA9IE5VTEw7CisgICAgICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihuZXcpOworICAgICAgICAgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlOZXdVc2VySXRlbVVQUChEbGdfVW5pdlVzZXJJdGVtUHJvYykpOworICAgICAgICB9CiAKLQkgICAgICAgIERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2sgPSBuZXc7Ci0JICAgICAgICByZXR1cm4gX3JlczsKKyAgICAgICAgRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayA9IG5ldzsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIERsZ19tZXRob2RzW10gPSB7Ci0JeyJOZXdEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnX05ld0RpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKLQl7IkdldE5ld0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfR2V0TmV3RGlhbG9nLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZGlhbG9nSUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKLQl7Ik5ld0NvbG9yRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19OZXdDb2xvckRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKLQl7Ik1vZGFsRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19Nb2RhbERpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAotCXsiSXNEaWFsb2dFdmVudCIsIChQeUNGdW5jdGlvbilEbGdfSXNEaWFsb2dFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJEaWFsb2dTZWxlY3QiLCAoUHlDRnVuY3Rpb24pRGxnX0RpYWxvZ1NlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydiwgRGlhbG9nUHRyIHRoZURpYWxvZywgRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAotCXsiQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX0FsZXJ0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCi0JeyJTdG9wQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX1N0b3BBbGVydCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGFsZXJ0SUQsIFB5T2JqZWN0KiBtb2RhbEZpbHRlcikgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAotCXsiTm90ZUFsZXJ0IiwgKFB5Q0Z1bmN0aW9uKURsZ19Ob3RlQWxlcnQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBhbGVydElELCBQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggX3J2KSIpfSwKLQl7IkNhdXRpb25BbGVydCIsIChQeUNGdW5jdGlvbilEbGdfQ2F1dGlvbkFsZXJ0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCi0JeyJQYXJhbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnX1BhcmFtVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHBhcmFtMCwgU3RyMjU1IHBhcmFtMSwgU3RyMjU1IHBhcmFtMiwgU3RyMjU1IHBhcmFtMykgLT4gTm9uZSIpfSwKLQl7IkdldERpYWxvZ0l0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXREaWFsb2dJdGVtVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGl0ZW0pIC0+IChTdHIyNTUgdGV4dCkiKX0sCi0JeyJTZXREaWFsb2dJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nSXRlbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBpdGVtLCBTdHIyNTUgdGV4dCkgLT4gTm9uZSIpfSwKLQl7IkdldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX0dldEFsZXJ0U3RhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiU2V0RGlhbG9nRm9udCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nRm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGZvbnROdW0pIC0+IE5vbmUiKX0sCi0JeyJSZXNldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX1Jlc2V0QWxlcnRTdGFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0UGFyYW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXRQYXJhbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBwYXJhbTAsIFN0cjI1NSBwYXJhbTEsIFN0cjI1NSBwYXJhbTIsIFN0cjI1NSBwYXJhbTMpIC0+IE5vbmUiKX0sCi0JeyJOZXdGZWF0dXJlc0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfTmV3RmVhdHVyZXNEaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHNSZWN0LCBTdHIyNTUgaW5UaXRsZSwgQm9vbGVhbiBpbklzVmlzaWJsZSwgU0ludDE2IGluUHJvY0lELCBXaW5kb3dQdHIgaW5CZWhpbmQsIEJvb2xlYW4gaW5Hb0F3YXlGbGFnLCBTSW50MzIgaW5SZWZDb24sIEhhbmRsZSBpbkl0ZW1MaXN0SGFuZGxlLCBVSW50MzIgaW5GbGFncykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAotCXsiR2V0RGlhbG9nRnJvbVdpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdfR2V0RGlhbG9nRnJvbVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAotCXsiU2V0VXNlckl0ZW1IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKURsZ19TZXRVc2VySXRlbUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJOZXdEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnX05ld0RpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKKyAgICB7IkdldE5ld0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfR2V0TmV3RGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZGlhbG9nSUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKKyAgICB7Ik5ld0NvbG9yRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19OZXdDb2xvckRpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgU0ludDE2IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBTSW50MzIgcmVmQ29uLCBIYW5kbGUgaXRlbXMpIC0+IChEaWFsb2dQdHIgX3J2KSIpfSwKKyAgICB7Ik1vZGFsRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19Nb2RhbERpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAorICAgIHsiSXNEaWFsb2dFdmVudCIsIChQeUNGdW5jdGlvbilEbGdfSXNEaWFsb2dFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJEaWFsb2dTZWxlY3QiLCAoUHlDRnVuY3Rpb24pRGxnX0RpYWxvZ1NlbGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChCb29sZWFuIF9ydiwgRGlhbG9nUHRyIHRoZURpYWxvZywgRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIil9LAorICAgIHsiQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX0FsZXJ0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCisgICAgeyJTdG9wQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX1N0b3BBbGVydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGFsZXJ0SUQsIFB5T2JqZWN0KiBtb2RhbEZpbHRlcikgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAorICAgIHsiTm90ZUFsZXJ0IiwgKFB5Q0Z1bmN0aW9uKURsZ19Ob3RlQWxlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBhbGVydElELCBQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggX3J2KSIpfSwKKyAgICB7IkNhdXRpb25BbGVydCIsIChQeUNGdW5jdGlvbilEbGdfQ2F1dGlvbkFsZXJ0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCisgICAgeyJQYXJhbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnX1BhcmFtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHBhcmFtMCwgU3RyMjU1IHBhcmFtMSwgU3RyMjU1IHBhcmFtMiwgU3RyMjU1IHBhcmFtMykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERpYWxvZ0l0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXREaWFsb2dJdGVtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGl0ZW0pIC0+IChTdHIyNTUgdGV4dCkiKX0sCisgICAgeyJTZXREaWFsb2dJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nSXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBpdGVtLCBTdHIyNTUgdGV4dCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX0dldEFsZXJ0U3RhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiU2V0RGlhbG9nRm9udCIsIChQeUNGdW5jdGlvbilEbGdfU2V0RGlhbG9nRm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGZvbnROdW0pIC0+IE5vbmUiKX0sCisgICAgeyJSZXNldEFsZXJ0U3RhZ2UiLCAoUHlDRnVuY3Rpb24pRGxnX1Jlc2V0QWxlcnRTdGFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGFyYW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXRQYXJhbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBwYXJhbTAsIFN0cjI1NSBwYXJhbTEsIFN0cjI1NSBwYXJhbTIsIFN0cjI1NSBwYXJhbTMpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdGZWF0dXJlc0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfTmV3RmVhdHVyZXNEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHNSZWN0LCBTdHIyNTUgaW5UaXRsZSwgQm9vbGVhbiBpbklzVmlzaWJsZSwgU0ludDE2IGluUHJvY0lELCBXaW5kb3dQdHIgaW5CZWhpbmQsIEJvb2xlYW4gaW5Hb0F3YXlGbGFnLCBTSW50MzIgaW5SZWZDb24sIEhhbmRsZSBpbkl0ZW1MaXN0SGFuZGxlLCBVSW50MzIgaW5GbGFncykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAorICAgIHsiR2V0RGlhbG9nRnJvbVdpbmRvdyIsIChQeUNGdW5jdGlvbilEbGdfR2V0RGlhbG9nRnJvbVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAorICAgIHsiU2V0VXNlckl0ZW1IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKURsZ19TZXRVc2VySXRlbUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE1MzAsOSArMTUzMCw5IEBACiBXaW5kb3dQdHIKIERsZ09ial9Db252ZXJ0VG9XaW5kb3coUHlPYmplY3QgKnNlbGYpCiB7Ci0gICAgICAgIGlmICggRGxnT2JqX0NoZWNrKHNlbGYpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0RGlhbG9nV2luZG93KCgoRGlhbG9nT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggRGxnT2JqX0NoZWNrKHNlbGYpICkKKyAgICAgICAgcmV0dXJuIEdldERpYWxvZ1dpbmRvdygoKERpYWxvZ09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBOVUxMOwogfQogI2VuZGlmCiAvKiBSZXR1cm4gdGhlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBkaWFsb2csIG9yIE5vbmUgKi8KQEAgLTE1NDAsMzUgKzE1NDAsMzUgQEAKIFB5T2JqZWN0ICoKIERsZ09ial9XaGljaERpYWxvZyhEaWFsb2dQdHIgZCkKIHsKLSAgICAgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdDsKIAotICAgICAgICBpZiAoZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOwotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgV2luZG93UHRyIHcgPSBHZXREaWFsb2dXaW5kb3coZCk7CisgICAgaWYgKGQgPT0gTlVMTCkgeworICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgV2luZG93UHRyIHcgPSBHZXREaWFsb2dXaW5kb3coZCk7CiAKLSAgICAgICAgICAgICAgICBpdCA9IChQeU9iamVjdCAqKSBHZXRXUmVmQ29uKHcpOwotICAgICAgICAgICAgICAgIGlmIChpdCA9PSBOVUxMIHx8ICgoRGlhbG9nT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gZCB8fCAhRGxnT2JqX0NoZWNrKGl0KSkgeworICAgICAgICBpdCA9IChQeU9iamVjdCAqKSBHZXRXUmVmQ29uKHcpOworICAgICAgICBpZiAoaXQgPT0gTlVMTCB8fCAoKERpYWxvZ09iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IGQgfHwgIURsZ09ial9DaGVjayhpdCkpIHsKICNpZiAwCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG91bGQgZG8gdGhpcywgYnV0IHdlIGRvbid0IGhhdmUgYW4gb2JfZnJlZWl0IGZvciBkaWFsb2dzIHlldC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gV2luT2JqX05ldyh3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9mcmVlaXQgPSBOVUxMOworICAgICAgICAgICAgLyogU2hvdWxkIGRvIHRoaXMsIGJ1dCB3ZSBkb24ndCBoYXZlIGFuIG9iX2ZyZWVpdCBmb3IgZGlhbG9ncyB5ZXQuICovCisgICAgICAgICAgICBpdCA9IFdpbk9ial9OZXcodyk7CisgICAgICAgICAgICAoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfZnJlZWl0ID0gTlVMTDsKICNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpdCA9IFB5X05vbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgICAgICAgICAgaXQgPSBQeV9Ob25lOworICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKICNlbmRpZgotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0OworICAgIH0KKyAgICByZXR1cm4gaXQ7CiB9CiAKICNlbHNlIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBEbGdfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCkBAIC0xNTc2LDMyICsxNTc2LDMyIEBACiAKIHZvaWQgaW5pdF9EbGcodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEaWFsb2dQdHIsIERsZ09ial9XaGljaERpYWxvZyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRGlhbG9nUHRyLCBEbGdPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX1doaWNoRGlhbG9nKTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKERpYWxvZ1B0ciwgRGxnT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9EbGciLCBEbGdfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9EbGciLCBEbGdfbWV0aG9kcyk7CiAKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlEbGdfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChEbGdfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBEbGdfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlEaWFsb2dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkRpYWxvZ19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkRpYWxvZ19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRpYWxvZyIsIChQeU9iamVjdCAqKSZEaWFsb2dfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZEaWFsb2dfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEaWFsb2dUeXBlIiwgKFB5T2JqZWN0ICopJkRpYWxvZ19UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBEbGdfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChEbGdfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBEbGdfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBEaWFsb2dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkRpYWxvZ19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkRpYWxvZ19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRpYWxvZyIsIChQeU9iamVjdCAqKSZEaWFsb2dfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZEaWFsb2dfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEaWFsb2dUeXBlIiwgKFB5T2JqZWN0ICopJkRpYWxvZ19UeXBlKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZHJhZy9fRHJhZ21vZHVsZS5jIGIvTWFjL01vZHVsZXMvZHJhZy9fRHJhZ21vZHVsZS5jCmluZGV4IDc5N2ZiMzIuLmFhODc2OTAgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2RyYWcvX0RyYWdtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9kcmFnL19EcmFnbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTQ0LDY5MyArNDQsNjkzIEBACiAjZGVmaW5lIERyYWdPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRHJhZ09ial9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZEcmFnT2JqX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBEcmFnT2JqT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRHJhZ1JlZiBvYl9pdHNlbGY7Ci0JUHlPYmplY3QgKnNlbmRwcm9jOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBEcmFnUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqc2VuZHByb2M7CiB9IERyYWdPYmpPYmplY3Q7CiAKIFB5T2JqZWN0ICpEcmFnT2JqX05ldyhEcmFnUmVmIGl0c2VsZikKIHsKLQlEcmFnT2JqT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEcmFnX0Vycm9yLCJDYW5ub3QgY3JlYXRlIG51bGwgRHJhZyIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKERyYWdPYmpPYmplY3QsICZEcmFnT2JqX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5zZW5kcHJvYyA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIERyYWdPYmpPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERyYWdfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBEcmFnIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRHJhZ09iak9iamVjdCwgJkRyYWdPYmpfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPnNlbmRwcm9jID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBEcmFnT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIERyYWdSZWYgKnBfaXRzZWxmKQogewotCWlmICghRHJhZ09ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJEcmFnT2JqIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKERyYWdPYmpPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRHJhZ09ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJEcmFnT2JqIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKERyYWdPYmpPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBEcmFnT2JqX2RlYWxsb2MoRHJhZ09iak9iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPnNlbmRwcm9jKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c2VuZHByb2MpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9EaXNwb3NlRHJhZyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBEaXNwb3NlRHJhZwotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VEcmFnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlRHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERpc3Bvc2VEcmFnKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlzcG9zZURyYWcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9BZGREcmFnSXRlbUZsYXZvcihEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKLQlGbGF2b3JGbGFncyB0aGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgRmxhdm9yVHlwZSB0aGVUeXBlOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgbG9uZyBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgRmxhdm9yRmxhZ3MgdGhlRmxhZ3M7CiAjaWZuZGVmIEFkZERyYWdJdGVtRmxhdm9yCi0JUHlNYWNfUFJFQ0hFQ0soQWRkRHJhZ0l0ZW1GbGF2b3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZERyYWdJdGVtRmxhdm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJnojbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBZGREcmFnSXRlbUZsYXZvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJnojbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBZGREcmFnSXRlbUZsYXZvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCUZsYXZvclR5cGUgdGhlVHlwZTsKLQljaGFyICpkYXRhUHRyX19pbl9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCVVJbnQzMiBkYXRhT2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKKyAgICBGbGF2b3JUeXBlIHRoZVR5cGU7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBVSW50MzIgZGF0YU9mZnNldDsKICNpZm5kZWYgU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcmFnSXRlbUZsYXZvckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8meiNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8meiNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gU2V0RHJhZ0l0ZW1GbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9TZXREcmFnSW1hZ2UoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgaW1hZ2VQaXhNYXA7Ci0JUmduSGFuZGxlIGltYWdlUmduOwotCVBvaW50IGltYWdlT2Zmc2V0UHQ7Ci0JRHJhZ0ltYWdlRmxhZ3MgdGhlSW1hZ2VGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgaW1hZ2VQaXhNYXA7CisgICAgUmduSGFuZGxlIGltYWdlUmduOworICAgIFBvaW50IGltYWdlT2Zmc2V0UHQ7CisgICAgRHJhZ0ltYWdlRmxhZ3MgdGhlSW1hZ2VGbGFnczsKICNpZm5kZWYgU2V0RHJhZ0ltYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ0ltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcmFnSW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VQaXhNYXAsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW1hZ2VPZmZzZXRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUltYWdlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RHJhZ0ltYWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbWFnZVBpeE1hcCwKLQkgICAgICAgICAgICAgICAgICAgIGltYWdlUmduLAotCSAgICAgICAgICAgICAgICAgICAgaW1hZ2VPZmZzZXRQdCwKLQkgICAgICAgICAgICAgICAgICAgIHRoZUltYWdlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmltYWdlUGl4TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmltYWdlUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmltYWdlT2Zmc2V0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJbWFnZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERyYWdJbWFnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQaXhNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlT2Zmc2V0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVJbWFnZUZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0NoYW5nZURyYWdCZWhhdmlvcnMoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEcmFnQmVoYXZpb3JzIGluQmVoYXZpb3JzVG9TZXQ7Ci0JRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvQ2xlYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvU2V0OworICAgIERyYWdCZWhhdmlvcnMgaW5CZWhhdmlvcnNUb0NsZWFyOwogI2lmbmRlZiBDaGFuZ2VEcmFnQmVoYXZpb3JzCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlRHJhZ0JlaGF2aW9ycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlRHJhZ0JlaGF2aW9ycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJlaGF2aW9yc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5CZWhhdmlvcnNUb0NsZWFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZURyYWdCZWhhdmlvcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJlaGF2aW9yc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQmVoYXZpb3JzVG9DbGVhcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CZWhhdmlvcnNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQmVoYXZpb3JzVG9DbGVhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDaGFuZ2VEcmFnQmVoYXZpb3JzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CZWhhdmlvcnNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJlaGF2aW9yc1RvQ2xlYXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfVHJhY2tEcmFnKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7Ci0JUmduSGFuZGxlIHRoZVJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBSZ25IYW5kbGUgdGhlUmVnaW9uOwogI2lmbmRlZiBUcmFja0RyYWcKLQlQeU1hY19QUkVDSEVDSyhUcmFja0RyYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYWNrRHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZ0aGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhY2tEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmdGhlRXZlbnQsCi0JICAgICAgICAgICAgICAgICB0aGVSZWdpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja0RyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgIHRoZVJlZ2lvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9Db3VudERyYWdJdGVtcyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVJbnQxNiBudW1JdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVSW50MTYgbnVtSXRlbXM7CiAjaWZuZGVmIENvdW50RHJhZ0l0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnREcmFnSXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50RHJhZ0l0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ291bnREcmFnSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bUl0ZW1zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBudW1JdGVtcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3VudERyYWdJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtSXRlbXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDE2IGluZGV4OwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVSW50MTYgaW5kZXg7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwogI2lmbmRlZiBHZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcgotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfQ291bnREcmFnSXRlbUZsYXZvcnMoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7Ci0JVUludDE2IG51bUZsYXZvcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIFVJbnQxNiBudW1GbGF2b3JzOwogI2lmbmRlZiBDb3VudERyYWdJdGVtRmxhdm9ycwotCVB5TWFjX1BSRUNIRUNLKENvdW50RHJhZ0l0ZW1GbGF2b3JzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudERyYWdJdGVtRmxhdm9ycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ291bnREcmFnSXRlbUZsYXZvcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUZsYXZvcnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG51bUZsYXZvcnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3VudERyYWdJdGVtRmxhdm9ycyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRmxhdm9ycyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRmxhdm9ycyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXRGbGF2b3JUeXBlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCVVJbnQxNiBpbmRleDsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIFVJbnQxNiBpbmRleDsKKyAgICBGbGF2b3JUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEdldEZsYXZvclR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRGbGF2b3JUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAmdGhlVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rmxhdm9yVHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXRGbGF2b3JGbGFncyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JRmxhdm9yRmxhZ3MgdGhlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIEZsYXZvclR5cGUgdGhlVHlwZTsKKyAgICBGbGF2b3JGbGFncyB0aGVGbGFnczsKICNpZm5kZWYgR2V0Rmxhdm9yRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rmxhdm9yRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rmxhdm9yRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rmxhdm9yRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXRGbGF2b3JEYXRhU2l6ZShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JU2l6ZSBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgRmxhdm9yVHlwZSB0aGVUeXBlOworICAgIFNpemUgZGF0YVNpemU7CiAjaWZuZGVmIEdldEZsYXZvckRhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Rmxhdm9yRGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZsYXZvckRhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEZsYXZvckRhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEZsYXZvckRhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfR2V0Rmxhdm9yRGF0YShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlGbGF2b3JUeXBlIHRoZVR5cGU7Ci0JY2hhciAqZGF0YVB0cl9fb3V0X187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JVUludDMyIGRhdGFPZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIEZsYXZvclR5cGUgdGhlVHlwZTsKKyAgICBjaGFyICpkYXRhUHRyX19vdXRfXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBVSW50MzIgZGF0YU9mZnNldDsKICNpZm5kZWYgR2V0Rmxhdm9yRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldEZsYXZvckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZsYXZvckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8maWwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBkYXRhUHRyX19lcnJvcl9fOwotCX0KLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBHZXRGbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAmZGF0YVB0cl9fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKLQlmcmVlKGRhdGFQdHJfX291dF9fKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZpbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGRhdGFQdHJfX2Vycm9yX187CisgICAgfQorICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEdldEZsYXZvckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sICZkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdJdGVtQm91bmRzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCVJlY3QgaXRlbUJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgUmVjdCBpdGVtQm91bmRzOwogI2lmbmRlZiBHZXREcmFnSXRlbUJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdJdGVtQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREcmFnSXRlbUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJhZ0l0ZW1Cb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1Cb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZpdGVtQm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RHJhZ0l0ZW1Cb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1Cb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZpdGVtQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX1NldERyYWdJdGVtQm91bmRzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCVJlY3QgaXRlbUJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgUmVjdCBpdGVtQm91bmRzOwogI2lmbmRlZiBTZXREcmFnSXRlbUJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldERyYWdJdGVtQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcmFnSXRlbUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJml0ZW1Cb3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RHJhZ0l0ZW1Cb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1Cb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaXRlbUJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREcmFnSXRlbUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXREcm9wTG9jYXRpb24oRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRURlc2MgZHJvcExvY2F0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFRGVzYyBkcm9wTG9jYXRpb247CiAjaWZuZGVmIEdldERyb3BMb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldERyb3BMb2NhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RHJvcExvY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJvcExvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZHJvcExvY2F0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJmRyb3BMb2NhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcm9wTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcm9wTG9jYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmZHJvcExvY2F0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX1NldERyb3BMb2NhdGlvbihEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRGVzYyBkcm9wTG9jYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVEZXNjIGRyb3BMb2NhdGlvbjsKICNpZm5kZWYgU2V0RHJvcExvY2F0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJvcExvY2F0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcm9wTG9jYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJmRyb3BMb2NhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREcm9wTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkcm9wTG9jYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZkcm9wTG9jYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RHJvcExvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJvcExvY2F0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdBdHRyaWJ1dGVzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRHJhZ0F0dHJpYnV0ZXMgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRHJhZ0F0dHJpYnV0ZXMgZmxhZ3M7CiAjaWZuZGVmIEdldERyYWdBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ0F0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJhZ0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdNb3VzZShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBvaW50IG1vdXNlOwotCVBvaW50IGdsb2JhbFBpbm5lZE1vdXNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBvaW50IG1vdXNlOworICAgIFBvaW50IGdsb2JhbFBpbm5lZE1vdXNlOwogI2lmbmRlZiBHZXREcmFnTW91c2UKLQlQeU1hY19QUkVDSEVDSyhHZXREcmFnTW91c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdNb3VzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERyYWdNb3VzZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJm1vdXNlLAotCSAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFBpbm5lZE1vdXNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBtb3VzZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBnbG9iYWxQaW5uZWRNb3VzZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnTW91c2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxQaW5uZWRNb3VzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgbW91c2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsUGlubmVkTW91c2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfU2V0RHJhZ01vdXNlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUG9pbnQgZ2xvYmFsUGlubmVkTW91c2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUG9pbnQgZ2xvYmFsUGlubmVkTW91c2U7CiAjaWZuZGVmIFNldERyYWdNb3VzZQotCVB5TWFjX1BSRUNIRUNLKFNldERyYWdNb3VzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ01vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZnbG9iYWxQaW5uZWRNb3VzZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREcmFnTW91c2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGdsb2JhbFBpbm5lZE1vdXNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmZ2xvYmFsUGlubmVkTW91c2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RHJhZ01vdXNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxQaW5uZWRNb3VzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXREcmFnT3JpZ2luKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUG9pbnQgZ2xvYmFsSW5pdGlhbE1vdXNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBvaW50IGdsb2JhbEluaXRpYWxNb3VzZTsKICNpZm5kZWYgR2V0RHJhZ09yaWdpbgotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdPcmlnaW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdPcmlnaW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnT3JpZ2luKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbEluaXRpYWxNb3VzZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGdsb2JhbEluaXRpYWxNb3VzZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnT3JpZ2luKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbEluaXRpYWxNb3VzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGdsb2JhbEluaXRpYWxNb3VzZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXREcmFnTW9kaWZpZXJzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IG1vZGlmaWVyczsKLQlTSW50MTYgbW91c2VEb3duTW9kaWZpZXJzOwotCVNJbnQxNiBtb3VzZVVwTW9kaWZpZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBtb2RpZmllcnM7CisgICAgU0ludDE2IG1vdXNlRG93bk1vZGlmaWVyczsKKyAgICBTSW50MTYgbW91c2VVcE1vZGlmaWVyczsKICNpZm5kZWYgR2V0RHJhZ01vZGlmaWVycwotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdNb2RpZmllcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdNb2RpZmllcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmbW91c2VEb3duTW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZVVwTW9kaWZpZXJzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICBtb3VzZURvd25Nb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgbW91c2VVcE1vZGlmaWVycyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW91c2VEb3duTW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZVVwTW9kaWZpZXJzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZURvd25Nb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VVcE1vZGlmaWVycyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9TaG93RHJhZ0hpbGl0ZShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJnbkhhbmRsZSBoaWxpdGVGcmFtZTsKLQlCb29sZWFuIGluc2lkZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgaGlsaXRlRnJhbWU7CisgICAgQm9vbGVhbiBpbnNpZGU7CiAjaWZuZGVmIFNob3dEcmFnSGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0RyYWdIaWxpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dEcmFnSGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaGlsaXRlRnJhbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnNpZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2hvd0RyYWdIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRnJhbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoaWxpdGVGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc2lkZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTaG93RHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0hpZGVEcmFnSGlsaXRlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEhpZGVEcmFnSGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZURyYWdIaWxpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVEcmFnSGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGlkZURyYWdIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWRlRHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0RyYWdQcmVTY3JvbGwoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgZEg7Ci0JU0ludDE2IGRWOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBkSDsKKyAgICBTSW50MTYgZFY7CiAjaWZuZGVmIERyYWdQcmVTY3JvbGwKLQlQeU1hY19QUkVDSEVDSyhEcmFnUHJlU2Nyb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmFnUHJlU2Nyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRILAotCSAgICAgICAgICAgICAgICAgICAgICAmZFYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhZ1ByZVNjcm9sbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGRILAotCSAgICAgICAgICAgICAgICAgICAgIGRWKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRWKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYWdQcmVTY3JvbGwoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkVik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9EcmFnUG9zdFNjcm9sbChEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBEcmFnUG9zdFNjcm9sbAotCVB5TWFjX1BSRUNIRUNLKERyYWdQb3N0U2Nyb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmFnUG9zdFNjcm9sbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYWdQb3N0U2Nyb2xsKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhZ1Bvc3RTY3JvbGwoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9VcGRhdGVEcmFnSGlsaXRlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIHVwZGF0ZVJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdXBkYXRlUmduOwogI2lmbmRlZiBVcGRhdGVEcmFnSGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlRHJhZ0hpbGl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlRHJhZ0hpbGl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXBkYXRlUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVwZGF0ZURyYWdIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZ24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ1cGRhdGVSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlRHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJnbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBEcmFnT2JqX21ldGhvZHNbXSA9IHsKLQl7IkRpc3Bvc2VEcmFnIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRGlzcG9zZURyYWcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFkZERyYWdJdGVtRmxhdm9yIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfQWRkRHJhZ0l0ZW1GbGF2b3IsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgRmxhdm9yRmxhZ3MgdGhlRmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJTZXREcmFnSXRlbUZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUZsYXZvckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IE5vbmUiKX0sCi0JeyJTZXREcmFnSW1hZ2UiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSW1hZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBpbWFnZVBpeE1hcCwgUmduSGFuZGxlIGltYWdlUmduLCBQb2ludCBpbWFnZU9mZnNldFB0LCBEcmFnSW1hZ2VGbGFncyB0aGVJbWFnZUZsYWdzKSAtPiBOb25lIil9LAotCXsiQ2hhbmdlRHJhZ0JlaGF2aW9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NoYW5nZURyYWdCZWhhdmlvcnMsIDEsCi0JIFB5RG9jX1NUUigiKERyYWdCZWhhdmlvcnMgaW5CZWhhdmlvcnNUb1NldCwgRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCi0JeyJUcmFja0RyYWciLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9UcmFja0RyYWcsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIHRoZUV2ZW50LCBSZ25IYW5kbGUgdGhlUmVnaW9uKSAtPiBOb25lIil9LAotCXsiQ291bnREcmFnSXRlbXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9Db3VudERyYWdJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IG51bUl0ZW1zKSIpfSwKLQl7IkdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQxNiBpbmRleCkgLT4gKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZikiKX0sCi0JeyJDb3VudERyYWdJdGVtRmxhdm9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NvdW50RHJhZ0l0ZW1GbGF2b3JzLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChVSW50MTYgbnVtRmxhdm9ycykiKX0sCi0JeyJHZXRGbGF2b3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0Rmxhdm9yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBVSW50MTYgaW5kZXgpIC0+IChGbGF2b3JUeXBlIHRoZVR5cGUpIil9LAotCXsiR2V0Rmxhdm9yRmxhZ3MiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXRGbGF2b3JGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUpIC0+IChGbGF2b3JGbGFncyB0aGVGbGFncykiKX0sCi0JeyJHZXRGbGF2b3JEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGFTaXplLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIEZsYXZvclR5cGUgdGhlVHlwZSkgLT4gKFNpemUgZGF0YVNpemUpIil9LAotCXsiR2V0Rmxhdm9yRGF0YSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IChCdWZmZXIgZGF0YVB0cikiKX0sCi0JeyJHZXREcmFnSXRlbUJvdW5kcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdJdGVtQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChSZWN0IGl0ZW1Cb3VuZHMpIil9LAotCXsiU2V0RHJhZ0l0ZW1Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBSZWN0IGl0ZW1Cb3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJHZXREcm9wTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcm9wTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyBkcm9wTG9jYXRpb24pIil9LAotCXsiU2V0RHJvcExvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJvcExvY2F0aW9uLCAxLAotCSBQeURvY19TVFIoIihBRURlc2MgZHJvcExvY2F0aW9uKSAtPiBOb25lIil9LAotCXsiR2V0RHJhZ0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnQXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRHJhZ0F0dHJpYnV0ZXMgZmxhZ3MpIil9LAotCXsiR2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ01vdXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQb2ludCBtb3VzZSwgUG9pbnQgZ2xvYmFsUGlubmVkTW91c2UpIil9LAotCXsiU2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJhZ01vdXNlLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBnbG9iYWxQaW5uZWRNb3VzZSkgLT4gTm9uZSIpfSwKLQl7IkdldERyYWdPcmlnaW4iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnT3JpZ2luLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQb2ludCBnbG9iYWxJbml0aWFsTW91c2UpIil9LAotCXsiR2V0RHJhZ01vZGlmaWVycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdNb2RpZmllcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBtb2RpZmllcnMsIFNJbnQxNiBtb3VzZURvd25Nb2RpZmllcnMsIFNJbnQxNiBtb3VzZVVwTW9kaWZpZXJzKSIpfSwKLQl7IlNob3dEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2hvd0RyYWdIaWxpdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBoaWxpdGVGcmFtZSwgQm9vbGVhbiBpbnNpZGUpIC0+IE5vbmUiKX0sCi0JeyJIaWRlRHJhZ0hpbGl0ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0hpZGVEcmFnSGlsaXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEcmFnUHJlU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRHJhZ1ByZVNjcm9sbCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGRILCBTSW50MTYgZFYpIC0+IE5vbmUiKX0sCi0JeyJEcmFnUG9zdFNjcm9sbCIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0RyYWdQb3N0U2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfVXBkYXRlRHJhZ0hpbGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkRpc3Bvc2VEcmFnIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRGlzcG9zZURyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFkZERyYWdJdGVtRmxhdm9yIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfQWRkRHJhZ0l0ZW1GbGF2b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgRmxhdm9yRmxhZ3MgdGhlRmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJTZXREcmFnSXRlbUZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUZsYXZvckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXREcmFnSW1hZ2UiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBpbWFnZVBpeE1hcCwgUmduSGFuZGxlIGltYWdlUmduLCBQb2ludCBpbWFnZU9mZnNldFB0LCBEcmFnSW1hZ2VGbGFncyB0aGVJbWFnZUZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiQ2hhbmdlRHJhZ0JlaGF2aW9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NoYW5nZURyYWdCZWhhdmlvcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKERyYWdCZWhhdmlvcnMgaW5CZWhhdmlvcnNUb1NldCwgRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFja0RyYWciLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9UcmFja0RyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIHRoZUV2ZW50LCBSZ25IYW5kbGUgdGhlUmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiQ291bnREcmFnSXRlbXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9Db3VudERyYWdJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IG51bUl0ZW1zKSIpfSwKKyAgICB7IkdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBpbmRleCkgLT4gKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZikiKX0sCisgICAgeyJDb3VudERyYWdJdGVtRmxhdm9ycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NvdW50RHJhZ0l0ZW1GbGF2b3JzLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChVSW50MTYgbnVtRmxhdm9ycykiKX0sCisgICAgeyJHZXRGbGF2b3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0Rmxhdm9yVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBVSW50MTYgaW5kZXgpIC0+IChGbGF2b3JUeXBlIHRoZVR5cGUpIil9LAorICAgIHsiR2V0Rmxhdm9yRmxhZ3MiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXRGbGF2b3JGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUpIC0+IChGbGF2b3JGbGFncyB0aGVGbGFncykiKX0sCisgICAgeyJHZXRGbGF2b3JEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIEZsYXZvclR5cGUgdGhlVHlwZSkgLT4gKFNpemUgZGF0YVNpemUpIil9LAorICAgIHsiR2V0Rmxhdm9yRGF0YSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlLCBCdWZmZXIgZGF0YVB0ciwgVUludDMyIGRhdGFPZmZzZXQpIC0+IChCdWZmZXIgZGF0YVB0cikiKX0sCisgICAgeyJHZXREcmFnSXRlbUJvdW5kcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdJdGVtQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYpIC0+IChSZWN0IGl0ZW1Cb3VuZHMpIil9LAorICAgIHsiU2V0RHJhZ0l0ZW1Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnSXRlbUJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBSZWN0IGl0ZW1Cb3VuZHMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREcm9wTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcm9wTG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyBkcm9wTG9jYXRpb24pIil9LAorICAgIHsiU2V0RHJvcExvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJvcExvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihBRURlc2MgZHJvcExvY2F0aW9uKSAtPiBOb25lIil9LAorICAgIHsiR2V0RHJhZ0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnQXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRHJhZ0F0dHJpYnV0ZXMgZmxhZ3MpIil9LAorICAgIHsiR2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ01vdXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBtb3VzZSwgUG9pbnQgZ2xvYmFsUGlubmVkTW91c2UpIil9LAorICAgIHsiU2V0RHJhZ01vdXNlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2V0RHJhZ01vdXNlLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBnbG9iYWxQaW5uZWRNb3VzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERyYWdPcmlnaW4iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnT3JpZ2luLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBnbG9iYWxJbml0aWFsTW91c2UpIil9LAorICAgIHsiR2V0RHJhZ01vZGlmaWVycyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdNb2RpZmllcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBtb2RpZmllcnMsIFNJbnQxNiBtb3VzZURvd25Nb2RpZmllcnMsIFNJbnQxNiBtb3VzZVVwTW9kaWZpZXJzKSIpfSwKKyAgICB7IlNob3dEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfU2hvd0RyYWdIaWxpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBoaWxpdGVGcmFtZSwgQm9vbGVhbiBpbnNpZGUpIC0+IE5vbmUiKX0sCisgICAgeyJIaWRlRHJhZ0hpbGl0ZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0hpZGVEcmFnSGlsaXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEcmFnUHJlU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRHJhZ1ByZVNjcm9sbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGRILCBTSW50MTYgZFYpIC0+IE5vbmUiKX0sCisgICAgeyJEcmFnUG9zdFNjcm9sbCIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0RyYWdQb3N0U2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfVXBkYXRlRHJhZ0hpbGl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgRHJhZ09ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTc0Nyw2MSArNzQ3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRHJhZ1JlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIERyYWdSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRHJhZ09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKERyYWdPYmpPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRHJhZ09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKERyYWdPYmpPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRHJhZ09ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBEcmFnT2JqX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0RyYWcuRHJhZ09iaiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKERyYWdPYmpPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBEcmFnT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIERyYWdPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIERyYWdPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIERyYWdPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRHJhZ09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlEcmFnT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCURyYWdPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCURyYWdPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRHJhZ09ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCURyYWdPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9EcmFnLkRyYWdPYmoiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihEcmFnT2JqT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRHJhZ09ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBEcmFnT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBEcmFnT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBEcmFnT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIERyYWdPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRHJhZ09ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBEcmFnT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBEcmFnT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIERyYWdPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBEcmFnT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBEcmFnT2JqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODA5LDIwNCArODA5LDIwNCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfTmV3RHJhZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEcmFnUmVmIHRoZURyYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRHJhZ1JlZiB0aGVEcmFnOwogI2lmbmRlZiBOZXdEcmFnCi0JUHlNYWNfUFJFQ0hFQ0soTmV3RHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3RHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld0RyYWcoJnRoZURyYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX05ldywgdGhlRHJhZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdEcmFnKCZ0aGVEcmFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9OZXcsIHRoZURyYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfR2V0RHJhZ0hpbGl0ZUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgR2V0RHJhZ0hpbGl0ZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ0hpbGl0ZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREcmFnSGlsaXRlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnSGlsaXRlQ29sb3Iod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RHJhZ0hpbGl0ZUNvbG9yKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX1dhaXRNb3VzZU1vdmVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBpbml0aWFsTW91c2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IGluaXRpYWxNb3VzZTsKICNpZm5kZWYgV2FpdE1vdXNlTW92ZWQKLQlQeU1hY19QUkVDSEVDSyhXYWl0TW91c2VNb3ZlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soV2FpdE1vdXNlTW92ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluaXRpYWxNb3VzZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFdhaXRNb3VzZU1vdmVkKGluaXRpYWxNb3VzZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluaXRpYWxNb3VzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFdhaXRNb3VzZU1vdmVkKGluaXRpYWxNb3VzZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ19ab29tUmVjdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmVjdCBmcm9tUmVjdDsKLQlSZWN0IHRvUmVjdDsKLQlTSW50MTYgem9vbVN0ZXBzOwotCVpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgZnJvbVJlY3Q7CisgICAgUmVjdCB0b1JlY3Q7CisgICAgU0ludDE2IHpvb21TdGVwczsKKyAgICBab29tQWNjZWxlcmF0aW9uIGFjY2VsZXJhdGlvbjsKICNpZm5kZWYgWm9vbVJlY3RzCi0JUHlNYWNfUFJFQ0hFQ0soWm9vbVJlY3RzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhab29tUmVjdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmZyb21SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdG9SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmem9vbVN0ZXBzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWNjZWxlcmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFpvb21SZWN0cygmZnJvbVJlY3QsCi0JICAgICAgICAgICAgICAgICAmdG9SZWN0LAotCSAgICAgICAgICAgICAgICAgem9vbVN0ZXBzLAotCSAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZnJvbVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0b1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ6b29tU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2NlbGVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gWm9vbVJlY3RzKCZmcm9tUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICZ0b1JlY3QsCisgICAgICAgICAgICAgICAgICAgICB6b29tU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfWm9vbVJlZ2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCVBvaW50IHpvb21EaXN0YW5jZTsKLQlTSW50MTYgem9vbVN0ZXBzOwotCVpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJnbkhhbmRsZSByZWdpb247CisgICAgUG9pbnQgem9vbURpc3RhbmNlOworICAgIFNJbnQxNiB6b29tU3RlcHM7CisgICAgWm9vbUFjY2VsZXJhdGlvbiBhY2NlbGVyYXRpb247CiAjaWZuZGVmIFpvb21SZWdpb24KLQlQeU1hY19QUkVDSEVDSyhab29tUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhab29tUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnpvb21EaXN0YW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnpvb21TdGVwcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjY2VsZXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBab29tUmVnaW9uKHJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgICB6b29tRGlzdGFuY2UsCi0JICAgICAgICAgICAgICAgICAgem9vbVN0ZXBzLAotCSAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmem9vbURpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmem9vbVN0ZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjZWxlcmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFpvb21SZWdpb24ocmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgIHpvb21EaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICB6b29tU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX0luc3RhbGxUcmFja2luZ0hhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCSAgICBQeU9iamVjdCAqY2FsbGJhY2s7Ci0JICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOwotCSAgICBPU0VyciBfZXJyOworICAgICAgICBQeU9iamVjdCAqY2FsbGJhY2s7CisgICAgICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOworICAgICAgICBPU0VyciBfZXJyOwogCi0JICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPfE8mIiwgJmNhbGxiYWNrLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7ICAgICAgICAvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCi0JICAgIF9lcnIgPSBJbnN0YWxsVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiT3xPJiIsICZjYWxsYmFjaywgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7ICAgICAgICAvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCisgICAgICAgIF9lcnIgPSBJbnN0YWxsVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX0luc3RhbGxSZWNlaXZlSGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKLQkgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7Ci0JICAgIE9TRXJyIF9lcnI7CisgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKKyAgICAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CisgICAgICAgIE9TRXJyIF9lcnI7CiAKLQkgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk98TyYiLCAmY2FsbGJhY2ssIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsgICAgICAgIC8qIENhbm5vdCBkZWNyZWYgbGF0ZXIsIHRvbyBiYWQgKi8KLQkgICAgX2VyciA9IEluc3RhbGxSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiT3xPJiIsICZjYWxsYmFjaywgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7ICAgICAgICAvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCisgICAgICAgIF9lcnIgPSBJbnN0YWxsUmVjZWl2ZUhhbmRsZXIoZHJhZ2dsdWVfUmVjZWl2ZUhhbmRsZXJVUFAsIHRoZVdpbmRvdywgKHZvaWQgKiljYWxsYmFjayk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgX3JlcyA9IFB5X05vbmU7CisgICAgICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ19SZW1vdmVUcmFja2luZ0hhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCSAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKLQkgICAgT1NFcnIgX2VycjsKKyAgICAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CisgICAgICAgIE9TRXJyIF9lcnI7CiAKLQkgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPJiIsIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgX2VyciA9IFJlbW92ZVRyYWNraW5nSGFuZGxlcihkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXJVUFAsIHRoZVdpbmRvdyk7Ci0JICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotCSAgICAgICAgX3JlcyA9IFB5X05vbmU7Ci0JICAgICAgICByZXR1cm4gX3JlczsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPJiIsIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBfZXJyID0gUmVtb3ZlVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93KTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX1JlbW92ZVJlY2VpdmVIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQkgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7Ci0JICAgIE9TRXJyIF9lcnI7CisgICAgICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOworICAgICAgICBPU0VyciBfZXJyOwogCi0JICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyYiLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIF9lcnIgPSBSZW1vdmVSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93KTsKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAifE8mIiwgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIF9lcnIgPSBSZW1vdmVSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93KTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIERyYWdfbWV0aG9kc1tdID0gewotCXsiTmV3RHJhZyIsIChQeUNGdW5jdGlvbilEcmFnX05ld0RyYWcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKERyYWdSZWYgdGhlRHJhZykiKX0sCi0JeyJHZXREcmFnSGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pRHJhZ19HZXREcmFnSGlsaXRlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3cpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCi0JeyJXYWl0TW91c2VNb3ZlZCIsIChQeUNGdW5jdGlvbilEcmFnX1dhaXRNb3VzZU1vdmVkLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpbml0aWFsTW91c2UpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJab29tUmVjdHMiLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVjdHMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgZnJvbVJlY3QsIFJlY3QgdG9SZWN0LCBTSW50MTYgem9vbVN0ZXBzLCBab29tQWNjZWxlcmF0aW9uIGFjY2VsZXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7Ilpvb21SZWdpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBQb2ludCB6b29tRGlzdGFuY2UsIFNJbnQxNiB6b29tU3RlcHMsIFpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uKSAtPiBOb25lIil9LAotCXsiSW5zdGFsbFRyYWNraW5nSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX0luc3RhbGxUcmFja2luZ0hhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0JeyJJbnN0YWxsUmVjZWl2ZUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19JbnN0YWxsUmVjZWl2ZUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0JeyJSZW1vdmVUcmFja2luZ0hhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19SZW1vdmVUcmFja2luZ0hhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0JeyJSZW1vdmVSZWNlaXZlSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX1JlbW92ZVJlY2VpdmVIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoTlVMTCl9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTmV3RHJhZyIsIChQeUNGdW5jdGlvbilEcmFnX05ld0RyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKERyYWdSZWYgdGhlRHJhZykiKX0sCisgICAgeyJHZXREcmFnSGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pRHJhZ19HZXREcmFnSGlsaXRlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3cpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCisgICAgeyJXYWl0TW91c2VNb3ZlZCIsIChQeUNGdW5jdGlvbilEcmFnX1dhaXRNb3VzZU1vdmVkLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBpbml0aWFsTW91c2UpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJab29tUmVjdHMiLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVjdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgZnJvbVJlY3QsIFJlY3QgdG9SZWN0LCBTSW50MTYgem9vbVN0ZXBzLCBab29tQWNjZWxlcmF0aW9uIGFjY2VsZXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7Ilpvb21SZWdpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ19ab29tUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBQb2ludCB6b29tRGlzdGFuY2UsIFNJbnQxNiB6b29tU3RlcHMsIFpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiSW5zdGFsbFRyYWNraW5nSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX0luc3RhbGxUcmFja2luZ0hhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJJbnN0YWxsUmVjZWl2ZUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19JbnN0YWxsUmVjZWl2ZUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJSZW1vdmVUcmFja2luZ0hhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ19SZW1vdmVUcmFja2luZ0hhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJSZW1vdmVSZWNlaXZlSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX1JlbW92ZVJlY2VpdmVIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoTlVMTCl9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xMDE1LDgxICsxMDE1LDgxIEBACiBkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXIoRHJhZ1RyYWNraW5nTWVzc2FnZSB0aGVNZXNzYWdlLCBXaW5kb3dQdHIgdGhlV2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmhhbmRsZXJSZWZDb24sIERyYWdSZWZlcmVuY2UgdGhlRHJhZykKIHsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpydjsKLSAgICAgICAgaW50IGk7CisgICAgUHlPYmplY3QgKmFyZ3MsICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLCB0aGVNZXNzYWdlLCBEcmFnT2JqX05ldywgdGhlRHJhZywgV2luT2JqX1doaWNoV2luZG93LCB0aGVXaW5kb3cpOwotICAgICAgICBpZiAoIGFyZ3MgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKWhhbmRsZXJSZWZDb24sIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmICggcnYgPT0gTlVMTCApIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFRyYWNraW5nSGFuZGxlclxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IC0xOwotICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gaTsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLCB0aGVNZXNzYWdlLCBEcmFnT2JqX05ldywgdGhlRHJhZywgV2luT2JqX1doaWNoV2luZG93LCB0aGVXaW5kb3cpOworICAgIGlmICggYXJncyA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QoKFB5T2JqZWN0ICopaGFuZGxlclJlZkNvbiwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmICggcnYgPT0gTlVMTCApIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBUcmFja2luZ0hhbmRsZXJcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGkgPSAtMTsKKyAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQorICAgICAgICBpID0gMDsKKyAgICBlbHNlCisgICAgICAgIFB5QXJnX1BhcnNlKHJ2LCAibCIsICZpKTsKKyAgICBQeV9ERUNSRUYocnYpOworICAgIHJldHVybiBpOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TRXJyCiBkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlcihXaW5kb3dQdHIgdGhlV2luZG93LCB2b2lkICpoYW5kbGVyUmVmQ29uLAogICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKQogewotICAgICAgICBQeU9iamVjdCAqYXJncywgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqYXJncywgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgRHJhZ09ial9OZXcsIHRoZURyYWcsIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKLSAgICAgICAgaWYgKCBhcmdzID09IE5VTEwgKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCgoUHlPYmplY3QgKiloYW5kbGVyUmVmQ29uLCBhcmdzKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAoIHJ2ID09IE5VTEwgKSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkRyYWc6IEV4Y2VwdGlvbiBpbiBSZWNlaXZlSGFuZGxlclxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IC0xOwotICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gaTsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsIERyYWdPYmpfTmV3LCB0aGVEcmFnLCBXaW5PYmpfV2hpY2hXaW5kb3csIHRoZVdpbmRvdyk7CisgICAgaWYgKCBhcmdzID09IE5VTEwgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCgoUHlPYmplY3QgKiloYW5kbGVyUmVmQ29uLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFJlY2VpdmVIYW5kbGVyXG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpID0gLTE7CisgICAgaWYgKCBydiA9PSBQeV9Ob25lICkKKyAgICAgICAgaSA9IDA7CisgICAgZWxzZQorICAgICAgICBQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7CisgICAgUHlfREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gaTsKIH0KIAogc3RhdGljIHBhc2NhbCBPU0VycgogZHJhZ2dsdWVfU2VuZERhdGEoRmxhdm9yVHlwZSB0aGVUeXBlLCB2b2lkICpkcmFnU2VuZFJlZkNvbiwKICAgICAgICAgICAgICAgICAgICAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW0sIERyYWdSZWZlcmVuY2UgdGhlRHJhZykKIHsKLSAgICAgICAgRHJhZ09iak9iamVjdCAqc2VsZiA9IChEcmFnT2JqT2JqZWN0ICopZHJhZ1NlbmRSZWZDb247Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIERyYWdPYmpPYmplY3QgKnNlbGYgPSAoRHJhZ09iak9iamVjdCAqKWRyYWdTZW5kUmVmQ29uOworICAgIFB5T2JqZWN0ICphcmdzLCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCBzZWxmLT5zZW5kcHJvYyA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSwgdGhlSXRlbSk7Ci0gICAgICAgIGlmICggYXJncyA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+c2VuZHByb2MsIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmICggcnYgPT0gTlVMTCApIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFNlbmREYXRhSGFuZGxlclxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IC0xOwotICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQotICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gaTsKKyAgICBpZiAoIHNlbGYtPnNlbmRwcm9jID09IE5VTEwgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLCB0aGVJdGVtKTsKKyAgICBpZiAoIGFyZ3MgPT0gTlVMTCApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KHNlbGYtPnNlbmRwcm9jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFNlbmREYXRhSGFuZGxlclxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaSA9IC0xOworICAgIGlmICggcnYgPT0gUHlfTm9uZSApCisgICAgICAgIGkgPSAwOworICAgIGVsc2UKKyAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOworICAgIFB5X0RFQ1JFRihydik7CisgICAgcmV0dXJuIGk7CiB9CiAKICNpZiAwCkBAIC0xMTA5LDQ1ICsxMTA5LDQ1IEBACiAjZW5kaWYKICNlbHNlIC8qIF9fTFA2NF9fICovCiBzdGF0aWMgUHlNZXRob2REZWYgRHJhZ19tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogdm9pZCBpbml0X0RyYWcodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERyYWdSZWYsIERyYWdPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChEcmFnUmVmLCBEcmFnT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEcmFnUmVmLCBEcmFnT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChEcmFnUmVmLCBEcmFnT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0RyYWciLCBEcmFnX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRHJhZyIsIERyYWdfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRHJhZ19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKERyYWdfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBEcmFnX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JRHJhZ09ial9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRHJhZ09ial9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkRyYWdPYmpfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEcmFnT2JqIiwgKFB5T2JqZWN0ICopJkRyYWdPYmpfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZEcmFnT2JqX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRHJhZ09ialR5cGUiLCAoUHlPYmplY3QgKikmRHJhZ09ial9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBEcmFnX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoRHJhZ19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIERyYWdfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBEcmFnT2JqX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZEcmFnT2JqX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRHJhZ09ial9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRyYWdPYmoiLCAoUHlPYmplY3QgKikmRHJhZ09ial9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkRyYWdPYmpfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEcmFnT2JqVHlwZSIsIChQeU9iamVjdCAqKSZEcmFnT2JqX1R5cGUpOwogCi0JZHJhZ2dsdWVfVHJhY2tpbmdIYW5kbGVyVVBQID0gTmV3RHJhZ1RyYWNraW5nSGFuZGxlclVQUChkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXIpOwotCWRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQID0gTmV3RHJhZ1JlY2VpdmVIYW5kbGVyVVBQKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyKTsKLQlkcmFnZ2x1ZV9TZW5kRGF0YVVQUCA9IE5ld0RyYWdTZW5kRGF0YVVQUChkcmFnZ2x1ZV9TZW5kRGF0YSk7CisgICAgZHJhZ2dsdWVfVHJhY2tpbmdIYW5kbGVyVVBQID0gTmV3RHJhZ1RyYWNraW5nSGFuZGxlclVQUChkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXIpOworICAgIGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQID0gTmV3RHJhZ1JlY2VpdmVIYW5kbGVyVVBQKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyKTsKKyAgICBkcmFnZ2x1ZV9TZW5kRGF0YVVQUCA9IE5ld0RyYWdTZW5kRGF0YVVQUChkcmFnZ2x1ZV9TZW5kRGF0YSk7CiAjaWYgMAotCWRyYWdnbHVlX0lucHV0VVBQID0gTmV3RHJhZ0lucHV0VVBQKGRyYWdnbHVlX0lucHV0KTsKLQlkcmFnZ2x1ZV9EcmF3aW5nVVBQID0gTmV3RHJhZ0RyYXdpbmdVUFAoZHJhZ2dsdWVfRHJhd2luZyk7CisgICAgZHJhZ2dsdWVfSW5wdXRVUFAgPSBOZXdEcmFnSW5wdXRVUFAoZHJhZ2dsdWVfSW5wdXQpOworICAgIGRyYWdnbHVlX0RyYXdpbmdVUFAgPSBOZXdEcmFnRHJhd2luZ1VQUChkcmFnZ2x1ZV9EcmF3aW5nKTsKICNlbmRpZgogCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9ldnQvX0V2dG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvZXZ0L19FdnRtb2R1bGUuYwppbmRleCAwNGYzYjIzLi5iZDYxZWZhIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9ldnQvX0V2dG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2V2dC9fRXZ0bW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIzLDUzNSArMjMsNTM1IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldE1vdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBtb3VzZUxvYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgbW91c2VMb2M7CiAjaWZuZGVmIEdldE1vdXNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW91c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNb3VzZSgmbW91c2VMb2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgbW91c2VMb2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3VzZSgmbW91c2VMb2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgbW91c2VMb2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9CdXR0b24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQnV0dG9uCi0JUHlNYWNfUFJFQ0hFQ0soQnV0dG9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCdXR0b24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEJ1dHRvbigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBCdXR0b24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfU3RpbGxEb3duKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFN0aWxsRG93bgotCVB5TWFjX1BSRUNIRUNLKFN0aWxsRG93bik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RpbGxEb3duKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTdGlsbERvd24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3RpbGxEb3duKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1dhaXRNb3VzZVVwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFdhaXRNb3VzZVVwCi0JUHlNYWNfUFJFQ0hFQ0soV2FpdE1vdXNlVXApOworICAgIFB5TWFjX1BSRUNIRUNLKFdhaXRNb3VzZVVwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBXYWl0TW91c2VVcCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBXYWl0TW91c2VVcCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9HZXRDYXJldFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENhcmV0VGltZQotCVB5TWFjX1BSRUNIRUNLKEdldENhcmV0VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q2FyZXRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDYXJldFRpbWUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q2FyZXRUaW1lKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldEtleXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUtleU1hcCB0aGVLZXlzX19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgS2V5TWFwIHRoZUtleXNfX291dF9fOwogI2lmbmRlZiBHZXRLZXlzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0S2V5cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0S2V5cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0S2V5cyh0aGVLZXlzX19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVLZXlzX19vdXRfXywgKGludClzaXplb2YoS2V5TWFwKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEtleXModGhlS2V5c19fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlS2V5c19fb3V0X18sIChpbnQpc2l6ZW9mKEtleU1hcCkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9HZXREYmxUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OwogI2lmbmRlZiBHZXREYmxUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGJsVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGJsVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGJsVGltZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREYmxUaW1lKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1NldEV2ZW50TWFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRNYXNrIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudE1hc2sgdmFsdWU7CiAjaWZuZGVmIFNldEV2ZW50TWFzawotCVB5TWFjX1BSRUNIRUNLKFNldEV2ZW50TWFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RXZlbnRNYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRFdmVudE1hc2sodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0RXZlbnRNYXNrKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldE5leHRFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRNYXNrIGV2ZW50TWFzazsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRNYXNrIGV2ZW50TWFzazsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKICNpZm5kZWYgR2V0TmV4dEV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dEV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0RXZlbnQoZXZlbnRNYXNrLAotCSAgICAgICAgICAgICAgICAgICAmdGhlRXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dEV2ZW50KGV2ZW50TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfRXZlbnRBdmFpbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRNYXNrIGV2ZW50TWFzazsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRNYXNrIGV2ZW50TWFzazsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKICNpZm5kZWYgRXZlbnRBdmFpbAotCVB5TWFjX1BSRUNIRUNLKEV2ZW50QXZhaWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEV2ZW50QXZhaWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBFdmVudEF2YWlsKGV2ZW50TWFzaywKLQkgICAgICAgICAgICAgICAgICZ0aGVFdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZ0aGVFdmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBFdmVudEF2YWlsKGV2ZW50TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICZ0aGVFdmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZ0aGVFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1Bvc3RFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlFdmVudEtpbmQgZXZlbnROdW07Ci0JVUludDMyIGV2ZW50TXNnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEV2ZW50S2luZCBldmVudE51bTsKKyAgICBVSW50MzIgZXZlbnRNc2c7CiAjaWZuZGVmIFBvc3RFdmVudAotCVB5TWFjX1BSRUNIRUNLKFBvc3RFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUG9zdEV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRNc2cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUG9zdEV2ZW50KGV2ZW50TnVtLAotCSAgICAgICAgICAgICAgICAgZXZlbnRNc2cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRNc2cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUG9zdEV2ZW50KGV2ZW50TnVtLAorICAgICAgICAgICAgICAgICAgICAgZXZlbnRNc2cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9GbHVzaEV2ZW50cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRNYXNrIHdoaWNoTWFzazsKLQlFdmVudE1hc2sgc3RvcE1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50TWFzayB3aGljaE1hc2s7CisgICAgRXZlbnRNYXNrIHN0b3BNYXNrOwogI2lmbmRlZiBGbHVzaEV2ZW50cwotCVB5TWFjX1BSRUNIRUNLKEZsdXNoRXZlbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbHVzaEV2ZW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJISCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaE1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzdG9wTWFzaykpCi0JCXJldHVybiBOVUxMOwotCUZsdXNoRXZlbnRzKHdoaWNoTWFzaywKLQkgICAgICAgICAgICBzdG9wTWFzayk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3BNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmx1c2hFdmVudHMod2hpY2hNYXNrLAorICAgICAgICAgICAgICAgIHN0b3BNYXNrKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldEdsb2JhbE1vdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBnbG9iYWxNb3VzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgZ2xvYmFsTW91c2U7CiAjaWZuZGVmIEdldEdsb2JhbE1vdXNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R2xvYmFsTW91c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdsb2JhbE1vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRHbG9iYWxNb3VzZSgmZ2xvYmFsTW91c2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsTW91c2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRHbG9iYWxNb3VzZSgmZ2xvYmFsTW91c2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsTW91c2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9HZXRDdXJyZW50S2V5TW9kaWZpZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OwogI2lmbmRlZiBHZXRDdXJyZW50S2V5TW9kaWZpZXJzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q3VycmVudEtleU1vZGlmaWVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q3VycmVudEtleU1vZGlmaWVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q3VycmVudEtleU1vZGlmaWVycygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDdXJyZW50S2V5TW9kaWZpZXJzKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0NoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbAotCVB5TWFjX1BSRUNIRUNLKENoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKENoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9LZXlTY3JpcHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGNvZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGNvZGU7CiAjaWZuZGVmIEtleVNjcmlwdAotCVB5TWFjX1BSRUNIRUNLKEtleVNjcmlwdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soS2V5U2NyaXB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29kZSkpCi0JCXJldHVybiBOVUxMOwotCUtleVNjcmlwdChjb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgS2V5U2NyaXB0KGNvZGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfSXNDbWRDaGFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCBldmVudDsKLQlzaG9ydCB0ZXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBldmVudDsKKyAgICBzaG9ydCB0ZXN0OwogI2lmbmRlZiBJc0NtZENoYXIKLQlQeU1hY19QUkVDSEVDSyhJc0NtZENoYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKElzQ21kQ2hhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzQ21kQ2hhcigmZXZlbnQsCi0JICAgICAgICAgICAgICAgIHRlc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNDbWRDaGFyKCZldmVudCwKKyAgICAgICAgICAgICAgICAgICAgdGVzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0xNR2V0S2V5VGhyZXNoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBMTUdldEtleVRocmVzaAotCVB5TWFjX1BSRUNIRUNLKExNR2V0S2V5VGhyZXNoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldEtleVRocmVzaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRLZXlUaHJlc2goKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRLZXlUaHJlc2goKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1TZXRLZXlUaHJlc2goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHZhbHVlOwogI2lmbmRlZiBMTVNldEtleVRocmVzaAotCVB5TWFjX1BSRUNIRUNLKExNU2V0S2V5VGhyZXNoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEtleVRocmVzaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRLZXlUaHJlc2godmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRLZXlUaHJlc2godmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1HZXRLZXlSZXBUaHJlc2goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIExNR2V0S2V5UmVwVGhyZXNoCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRLZXlSZXBUaHJlc2gpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0S2V5UmVwVGhyZXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldEtleVJlcFRocmVzaCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEtleVJlcFRocmVzaCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTVNldEtleVJlcFRocmVzaChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgdmFsdWU7CiAjaWZuZGVmIExNU2V0S2V5UmVwVGhyZXNoCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRLZXlSZXBUaHJlc2gpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0S2V5UmVwVGhyZXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEtleVJlcFRocmVzaCh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEtleVJlcFRocmVzaCh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTUdldEtiZExhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggX3J2OwogI2lmbmRlZiBMTUdldEtiZExhc3QKLQlQeU1hY19QUkVDSEVDSyhMTUdldEtiZExhc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0S2JkTGFzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRLYmRMYXN0KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0S2JkTGFzdCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTVNldEtiZExhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCB2YWx1ZTsKICNpZm5kZWYgTE1TZXRLYmRMYXN0Ci0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRLYmRMYXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEtiZExhc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0S2JkTGFzdCh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEtiZExhc3QodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1HZXRLYmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IF9ydjsKICNpZm5kZWYgTE1HZXRLYmRUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRLYmRUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldEtiZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0S2JkVHlwZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEtiZFR5cGUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1TZXRLYmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggdmFsdWU7CiAjaWZuZGVmIExNU2V0S2JkVHlwZQotCVB5TWFjX1BSRUNIRUNLKExNU2V0S2JkVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRLYmRUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEtiZFR5cGUodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRLYmRUeXBlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X1RpY2tDb3VudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKICNpZm5kZWYgVGlja0NvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soVGlja0NvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUaWNrQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRpY2tDb3VudCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUaWNrQ291bnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfV2FpdE5leHRFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRNYXNrIGV2ZW50TWFzazsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKLQlVSW50MzIgc2xlZXA7Ci0JSGFuZGxlIG1vdXNlcmVnaW9uID0gKEhhbmRsZSkwOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50TWFzayBldmVudE1hc2s7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgVUludDMyIHNsZWVwOworICAgIEhhbmRsZSBtb3VzZXJlZ2lvbiA9IChIYW5kbGUpMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsfE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNsZWVwLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1vdXNlcmVnaW9uKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9ydiA9IFdhaXROZXh0RXZlbnQoZXZlbnRNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgc2xlZXAsCi0JICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKW1vdXNlcmVnaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIbHxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGVlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtb3VzZXJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFdhaXROZXh0RXZlbnQoZXZlbnRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgc2xlZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKW1vdXNlcmVnaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZ0X21ldGhvZHNbXSA9IHsKLQl7IkdldE1vdXNlIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRNb3VzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9pbnQgbW91c2VMb2MpIil9LAotCXsiQnV0dG9uIiwgKFB5Q0Z1bmN0aW9uKUV2dF9CdXR0b24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlN0aWxsRG93biIsIChQeUNGdW5jdGlvbilFdnRfU3RpbGxEb3duLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJXYWl0TW91c2VVcCIsIChQeUNGdW5jdGlvbilFdnRfV2FpdE1vdXNlVXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldENhcmV0VGltZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0Q2FyZXRUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKLQl7IkdldEtleXMiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEtleXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEtleU1hcCB0aGVLZXlzKSIpfSwKLQl7IkdldERibFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldERibFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiU2V0RXZlbnRNYXNrIiwgKFB5Q0Z1bmN0aW9uKUV2dF9TZXRFdmVudE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkdldE5leHRFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfR2V0TmV4dEV2ZW50LCAxLAotCSBQeURvY19TVFIoIihFdmVudE1hc2sgZXZlbnRNYXNrKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKLQl7IkV2ZW50QXZhaWwiLCAoUHlDRnVuY3Rpb24pRXZ0X0V2ZW50QXZhaWwsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayBldmVudE1hc2spIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAotCXsiUG9zdEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2dF9Qb3N0RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50S2luZCBldmVudE51bSwgVUludDMyIGV2ZW50TXNnKSAtPiBOb25lIil9LAotCXsiRmx1c2hFdmVudHMiLCAoUHlDRnVuY3Rpb24pRXZ0X0ZsdXNoRXZlbnRzLCAxLAotCSBQeURvY19TVFIoIihFdmVudE1hc2sgd2hpY2hNYXNrLCBFdmVudE1hc2sgc3RvcE1hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRHbG9iYWxNb3VzZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0R2xvYmFsTW91c2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IGdsb2JhbE1vdXNlKSIpfSwKLQl7IkdldEN1cnJlbnRLZXlNb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEN1cnJlbnRLZXlNb2RpZmllcnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCIsIChQeUNGdW5jdGlvbilFdnRfQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiS2V5U2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKUV2dF9LZXlTY3JpcHQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvZGUpIC0+IE5vbmUiKX0sCi0JeyJJc0NtZENoYXIiLCAoUHlDRnVuY3Rpb24pRXZ0X0lzQ21kQ2hhciwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQsIHNob3J0IHRlc3QpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJMTUdldEtleVRocmVzaCIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLZXlUaHJlc2gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiTE1TZXRLZXlUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2V5VGhyZXNoLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEtleVJlcFRocmVzaCIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLZXlSZXBUaHJlc2gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiTE1TZXRLZXlSZXBUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2V5UmVwVGhyZXNoLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEtiZExhc3QiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2JkTGFzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKLQl7IkxNU2V0S2JkTGFzdCIsIChQeUNGdW5jdGlvbilFdnRfTE1TZXRLYmRMYXN0LCAxLAotCSBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0S2JkVHlwZSIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLYmRUeXBlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAotCXsiTE1TZXRLYmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtiZFR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiVGlja0NvdW50IiwgKFB5Q0Z1bmN0aW9uKUV2dF9UaWNrQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiV2FpdE5leHRFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfV2FpdE5leHRFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIGV2ZW50TWFzaywgVUludDMyIHNsZWVwIFssUmVnaW9uSGFuZGxlXSkgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCB0aGVFdmVudCkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJHZXRNb3VzZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0TW91c2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IG1vdXNlTG9jKSIpfSwKKyAgICB7IkJ1dHRvbiIsIChQeUNGdW5jdGlvbilFdnRfQnV0dG9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTdGlsbERvd24iLCAoUHlDRnVuY3Rpb24pRXZ0X1N0aWxsRG93biwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiV2FpdE1vdXNlVXAiLCAoUHlDRnVuY3Rpb24pRXZ0X1dhaXRNb3VzZVVwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRDYXJldFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldENhcmV0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJHZXRLZXlzIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRLZXlzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChLZXlNYXAgdGhlS2V5cykiKX0sCisgICAgeyJHZXREYmxUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXREYmxUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IlNldEV2ZW50TWFzayIsIChQeUNGdW5jdGlvbilFdnRfU2V0RXZlbnRNYXNrLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudE1hc2sgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXROZXh0RXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldE5leHRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIGV2ZW50TWFzaykgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCB0aGVFdmVudCkiKX0sCisgICAgeyJFdmVudEF2YWlsIiwgKFB5Q0Z1bmN0aW9uKUV2dF9FdmVudEF2YWlsLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudE1hc2sgZXZlbnRNYXNrKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKKyAgICB7IlBvc3RFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfUG9zdEV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudEtpbmQgZXZlbnROdW0sIFVJbnQzMiBldmVudE1zZykgLT4gTm9uZSIpfSwKKyAgICB7IkZsdXNoRXZlbnRzIiwgKFB5Q0Z1bmN0aW9uKUV2dF9GbHVzaEV2ZW50cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIHdoaWNoTWFzaywgRXZlbnRNYXNrIHN0b3BNYXNrKSAtPiBOb25lIil9LAorICAgIHsiR2V0R2xvYmFsTW91c2UiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEdsb2JhbE1vdXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBnbG9iYWxNb3VzZSkiKX0sCisgICAgeyJHZXRDdXJyZW50S2V5TW9kaWZpZXJzIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRDdXJyZW50S2V5TW9kaWZpZXJzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IkNoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwiLCAoUHlDRnVuY3Rpb24pRXZ0X0NoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IktleVNjcmlwdCIsIChQeUNGdW5jdGlvbilFdnRfS2V5U2NyaXB0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb2RlKSAtPiBOb25lIil9LAorICAgIHsiSXNDbWRDaGFyIiwgKFB5Q0Z1bmN0aW9uKUV2dF9Jc0NtZENoYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGV2ZW50LCBzaG9ydCB0ZXN0KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTE1HZXRLZXlUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2V5VGhyZXNoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkxNU2V0S2V5VGhyZXNoIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtleVRocmVzaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRLZXlSZXBUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2V5UmVwVGhyZXNoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkxNU2V0S2V5UmVwVGhyZXNoIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtleVJlcFRocmVzaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRLYmRMYXN0IiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTUdldEtiZExhc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCisgICAgeyJMTVNldEtiZExhc3QiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2JkTGFzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDggdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldEtiZFR5cGUiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2JkVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKKyAgICB7IkxNU2V0S2JkVHlwZSIsIChQeUNGdW5jdGlvbilFdnRfTE1TZXRLYmRUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlRpY2tDb3VudCIsIChQeUNGdW5jdGlvbilFdnRfVGlja0NvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IldhaXROZXh0RXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZ0X1dhaXROZXh0RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50TWFzayBldmVudE1hc2ssIFVJbnQzMiBzbGVlcCBbLFJlZ2lvbkhhbmRsZV0pIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCiAjZWxzZSAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZ0X21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiB2b2lkIGluaXRfRXZ0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfRXZ0IiwgRXZ0X21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRXZ0IiwgRXZ0X21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUV2dF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEV2dF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEV2dF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEV2dF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEV2dF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEV2dF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2ZpbGUvX0ZpbGVtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ZpbGUvX0ZpbGVtb2R1bGUuYwppbmRleCAyMmUxMmVjLi5lYjViMTZkIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9maWxlL19GaWxlbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZmlsZS9fRmlsZW1vZHVsZS5jCkBAIC04LDE0ICs4LDE0IEBACiAjaW5jbHVkZSAicHltYWN0b29sYm94LmgiCiAKICNpZm5kZWYgSEFWRV9PU1gxMDVfU0RLCi10eXBlZGVmIFNJbnQxNglGU0lPUmVmTnVtOwordHlwZWRlZiBTSW50MTYgIEZTSU9SZWZOdW07CiAjZW5kaWYKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgUHlNYWNfR2V0RlNTcGVjIF9QeU1hY19HZXRGU1NwZWMKICNkZWZpbmUgUHlNYWNfR2V0RlNSZWYgX1B5TWFjX0dldEZTUmVmCiAKLSNlbHNlCS8qICFVU0VfVE9PTEJPWF9PQkpFQ1RfR0xVRSAqLworI2Vsc2UgICAvKiAhVVNFX1RPT0xCT1hfT0JKRUNUX0dMVUUgKi8KIAogI2lmbmRlZiBfX0xQNjRfXwogZXh0ZXJuIGludCBQeU1hY19HZXRGU1NwZWMoUHlPYmplY3QgKnYsIEZTU3BlYyAqc3BlYyk7CkBAIC00NSw3ICs0NSw3IEBACiBleHRlcm4gaW50IFB5TWFjX0dldEZTUmVmKFB5T2JqZWN0ICp2LCBGU1JlZiAqZnNyKTsKIGV4dGVybiBQeU9iamVjdCAqUHlNYWNfQnVpbGRGU1JlZihGU1JlZiAqc3BlYyk7CiAKLSNlbmRpZgkvKiAhVVNFX1RPT0xCT1hfT0JKRUNUX0dMVUUgKi8KKyNlbmRpZiAgLyogIVVTRV9UT09MQk9YX09CSkVDVF9HTFVFICovCiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX05ldyhGU1JlZiAqaXRzZWxmKTsKQEAgLTY5LDEzICs2OSwxMyBAQAogc3RhdGljIGludAogVVRDRGF0ZVRpbWVfQ29udmVydChQeU9iamVjdCAqdiwgVVRDRGF0ZVRpbWUgKnB0cikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSGxIKSIsICZwdHItPmhpZ2hTZWNvbmRzLCAmcHRyLT5sb3dTZWNvbmRzLCAmcHRyLT5mcmFjdGlvbik7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSGxIKSIsICZwdHItPmhpZ2hTZWNvbmRzLCAmcHRyLT5sb3dTZWNvbmRzLCAmcHRyLT5mcmFjdGlvbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBVVENEYXRlVGltZV9OZXcoVVRDRGF0ZVRpbWUgKnB0cikKIHsKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihIbEgpIiwgcHRyLT5oaWdoU2Vjb25kcywgcHRyLT5sb3dTZWNvbmRzLCBwdHItPmZyYWN0aW9uKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKEhsSCkiLCBwdHItPmhpZ2hTZWNvbmRzLCBwdHItPmxvd1NlY29uZHMsIHB0ci0+ZnJhY3Rpb24pOwogfQogCiAvKgpAQCAtODUsMjIgKzg1LDIyIEBACiBzdGF0aWMgaW50CiBteVB5TWFjX0dldE9wdEZTU3BlY1B0cihQeU9iamVjdCAqdiwgRlNTcGVjICoqc3BlYykKIHsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgICpzcGVjID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlNYWNfR2V0RlNTcGVjKHYsICpzcGVjKTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICpzcGVjID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBQeU1hY19HZXRGU1NwZWModiwgKnNwZWMpOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgaW50CiBteVB5TWFjX0dldE9wdEZTUmVmUHRyKFB5T2JqZWN0ICp2LCBGU1JlZiAqKnJlZikKIHsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgICAgICpyZWYgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQeU1hY19HZXRGU1JlZih2LCAqcmVmKTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICpyZWYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIFB5TWFjX0dldEZTUmVmKHYsICpyZWYpOwogfQogCiAvKgpAQCAtMTEwLDUyICsxMTAsNTIgQEAKIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1KEhGU1VuaVN0cjI1NSAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ1IyIsIGl0c2VsZi0+dW5pY29kZSwgaXRzZWxmLT5sZW5ndGgpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ1IyIsIGl0c2VsZi0+dW5pY29kZSwgaXRzZWxmLT5sZW5ndGgpOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgT1NFcnIKIF9QeU1hY19HZXRGdWxsUGF0aG5hbWUoRlNTcGVjICpmc3MsIGNoYXIgKnBhdGgsIGludCBsZW4pCiB7Ci0JRlNSZWYgZnNyOwotCU9TRXJyIGVycjsKKyAgICBGU1JlZiBmc3I7CisgICAgT1NFcnIgZXJyOwogCi0JKnBhdGggPSAnXDAnOwotCWVyciA9IEZTcE1ha2VGU1JlZihmc3MsICZmc3IpOwotCWlmIChlcnIgPT0gZm5mRXJyKSB7Ci0JCS8qIEZTU3BlY3MgY2FuIHBvaW50IHRvIG5vbi1leGlzdGluZyBmaWxlcywgZnNyZWZzIGNhbid0LiAqLwotCQlGU1NwZWMgZnNzMjsKLQkJaW50IHRvY29weTsKKyAgICAqcGF0aCA9ICdcMCc7CisgICAgZXJyID0gRlNwTWFrZUZTUmVmKGZzcywgJmZzcik7CisgICAgaWYgKGVyciA9PSBmbmZFcnIpIHsKKyAgICAgICAgLyogRlNTcGVjcyBjYW4gcG9pbnQgdG8gbm9uLWV4aXN0aW5nIGZpbGVzLCBmc3JlZnMgY2FuJ3QuICovCisgICAgICAgIEZTU3BlYyBmc3MyOworICAgICAgICBpbnQgdG9jb3B5OwogCi0JCWVyciA9IEZTTWFrZUZTU3BlYyhmc3MtPnZSZWZOdW0sIGZzcy0+cGFySUQsCi0JCQkJICAgKHVuc2lnbmVkIGNoYXIqKSIiLCAmZnNzMik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQllcnIgPSBGU3BNYWtlRlNSZWYoJmZzczIsICZmc3IpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gKE9TRXJyKUZTUmVmTWFrZVBhdGgoJmZzciwgKHVuc2lnbmVkIGNoYXIqKXBhdGgsIGxlbi0xKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCS8qIFRoaXMgcGFydCBpcyBub3QgMTAwJSBzYWZlOiB3ZSBhcHBlbmQgdGhlIGZpbGVuYW1lIHBhcnQsIGJ1dAotCQkqKiBJJ20gbm90IHN1cmUgdGhhdCB3ZSBkb24ndCBydW4gYWZvdWwgb2YgdGhlIHZhcmlvdXMgOGJpdAotCQkqKiBlbmNvZGluZ3MgaGVyZS4gV2lsbCBoYXZlIHRvIGxvb2sgdGhpcyB1cCBhdCBzb21lIHBvaW50Li4uCi0JCSovCi0JCXN0cmNhdChwYXRoLCAiLyIpOwotCQl0b2NvcHkgPSBmc3MtPm5hbWVbMF07Ci0JCWlmICgoc3RybGVuKHBhdGgpICsgdG9jb3B5KSA+PSBsZW4pCi0JCQl0b2NvcHkgPSBsZW4gLSBzdHJsZW4ocGF0aCkgLSAxOwotCQlpZiAodG9jb3B5ID4gMCkKLQkJCXN0cm5jYXQocGF0aCwgKGNoYXIqKWZzcy0+bmFtZSsxLCB0b2NvcHkpOwotCX0KLQllbHNlIHsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWVyciA9IChPU0VycilGU1JlZk1ha2VQYXRoKCZmc3IsICh1bnNpZ25lZCBjaGFyKilwYXRoLCBsZW4pOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGVyciA9IEZTTWFrZUZTU3BlYyhmc3MtPnZSZWZOdW0sIGZzcy0+cGFySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciopIiIsICZmc3MyKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGVyciA9IEZTcE1ha2VGU1JlZigmZnNzMiwgJmZzcik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBlcnIgPSAoT1NFcnIpRlNSZWZNYWtlUGF0aCgmZnNyLCAodW5zaWduZWQgY2hhciopcGF0aCwgbGVuLTEpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgLyogVGhpcyBwYXJ0IGlzIG5vdCAxMDAlIHNhZmU6IHdlIGFwcGVuZCB0aGUgZmlsZW5hbWUgcGFydCwgYnV0CisgICAgICAgICoqIEknbSBub3Qgc3VyZSB0aGF0IHdlIGRvbid0IHJ1biBhZm91bCBvZiB0aGUgdmFyaW91cyA4Yml0CisgICAgICAgICoqIGVuY29kaW5ncyBoZXJlLiBXaWxsIGhhdmUgdG8gbG9vayB0aGlzIHVwIGF0IHNvbWUgcG9pbnQuLi4KKyAgICAgICAgKi8KKyAgICAgICAgc3RyY2F0KHBhdGgsICIvIik7CisgICAgICAgIHRvY29weSA9IGZzcy0+bmFtZVswXTsKKyAgICAgICAgaWYgKChzdHJsZW4ocGF0aCkgKyB0b2NvcHkpID49IGxlbikKKyAgICAgICAgICAgIHRvY29weSA9IGxlbiAtIHN0cmxlbihwYXRoKSAtIDE7CisgICAgICAgIGlmICh0b2NvcHkgPiAwKQorICAgICAgICAgICAgc3RybmNhdChwYXRoLCAoY2hhciopZnNzLT5uYW1lKzEsIHRvY29weSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgZXJyID0gKE9TRXJyKUZTUmVmTWFrZVBhdGgoJmZzciwgKHVuc2lnbmVkIGNoYXIqKXBhdGgsIGxlbik7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIApAQCAtMTY5LDI2MyArMTY5LDI2MyBAQAogI2RlZmluZSBGU0NhdGFsb2dJbmZvX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkZTQ2F0YWxvZ0luZm9fVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRlNDYXRhbG9nSW5mb19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRlNDYXRhbG9nSW5mb09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUZTQ2F0YWxvZ0luZm8gb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGU0NhdGFsb2dJbmZvIG9iX2l0c2VsZjsKIH0gRlNDYXRhbG9nSW5mb09iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX05ldyhGU0NhdGFsb2dJbmZvICppdHNlbGYpCiB7Ci0JRlNDYXRhbG9nSW5mb09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7IFB5X0lOQ1JFRihQeV9Ob25lKTsgcmV0dXJuIFB5X05vbmU7IH0KLQlpdCA9IFB5T2JqZWN0X05FVyhGU0NhdGFsb2dJbmZvT2JqZWN0LCAmRlNDYXRhbG9nSW5mb19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEZTQ2F0YWxvZ0luZm9PYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeyBQeV9JTkNSRUYoUHlfTm9uZSk7IHJldHVybiBQeV9Ob25lOyB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRlNDYXRhbG9nSW5mb09iamVjdCwgJkZTQ2F0YWxvZ0luZm9fVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSAqaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZTQ2F0YWxvZ0luZm8gKnBfaXRzZWxmKQogewotCWlmICghRlNDYXRhbG9nSW5mb19DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU0NhdGFsb2dJbmZvIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRlNDYXRhbG9nSW5mb19DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU0NhdGFsb2dJbmZvIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBGU0NhdGFsb2dJbmZvX2RlYWxsb2MoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGU0NhdGFsb2dJbmZvX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfbm9kZUZsYWdzKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIkgiLCBzZWxmLT5vYl9pdHNlbGYubm9kZUZsYWdzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSCIsIHNlbGYtPm9iX2l0c2VsZi5ub2RlRmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X25vZGVGbGFncyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF92b2x1bWUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNlbGYtPm9iX2l0c2VsZi52b2x1bWUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+b2JfaXRzZWxmLnZvbHVtZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfdm9sdW1lKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiaCIsICZzZWxmLT5vYl9pdHNlbGYudm9sdW1lKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiaCIsICZzZWxmLT5vYl9pdHNlbGYudm9sdW1lKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3BhcmVudERpcklEKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLnBhcmVudERpcklEKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9wYXJlbnREaXJJRChGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnBhcmVudERpcklEKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfbm9kZUlEKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYubm9kZUlEKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5ub2RlSUQpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X25vZGVJRChGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9jcmVhdGVEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5jcmVhdGVEYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9jcmVhdGVEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9jb250ZW50TW9kRGF0ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9jb250ZW50TW9kRGF0ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9hdHRyaWJ1dGVNb2REYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5hdHRyaWJ1dGVNb2REYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9hdHRyaWJ1dGVNb2REYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9hY2Nlc3NEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5hY2Nlc3NEYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9hY2Nlc3NEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9iYWNrdXBEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmJhY2t1cERhdGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5iYWNrdXBEYXRlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9iYWNrdXBEYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmJhY2t1cERhdGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9wZXJtaXNzaW9ucyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCUZTUGVybWlzc2lvbkluZm8qIGluZm8gPSAoRlNQZXJtaXNzaW9uSW5mbyopJihzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnMpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobGxsbCkiLCBpbmZvLT51c2VySUQsIGluZm8tPmdyb3VwSUQsIGluZm8tPnVzZXJBY2Nlc3MsIGluZm8tPm1vZGUpOworICAgIEZTUGVybWlzc2lvbkluZm8qIGluZm8gPSAoRlNQZXJtaXNzaW9uSW5mbyopJihzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnMpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIobGxsbCkiLCBpbmZvLT51c2VySUQsIGluZm8tPmdyb3VwSUQsIGluZm8tPnVzZXJBY2Nlc3MsIGluZm8tPm1vZGUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X3Blcm1pc3Npb25zKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCWxvbmcgdXNlcklEOwotCWxvbmcgZ3JvdXBJRDsKLQlsb25nIHVzZXJBY2Nlc3M7Ci0JbG9uZyBtb2RlOwotCWludCByOworICAgIGxvbmcgdXNlcklEOworICAgIGxvbmcgZ3JvdXBJRDsKKyAgICBsb25nIHVzZXJBY2Nlc3M7CisgICAgbG9uZyBtb2RlOworICAgIGludCByOwogCi0JRlNQZXJtaXNzaW9uSW5mbyogaW5mbyA9IChGU1Blcm1pc3Npb25JbmZvKikmKHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9ucyk7CisgICAgRlNQZXJtaXNzaW9uSW5mbyogaW5mbyA9IChGU1Blcm1pc3Npb25JbmZvKikmKHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9ucyk7CiAKLQlyID0gUHlBcmdfUGFyc2UodiwgIihsbGxsKSIsICZ1c2VySUQsICZncm91cElELCAmdXNlckFjY2VzcywgJm1vZGUpOwotCWlmICghcikgewotCQlyZXR1cm4gLTE7Ci0JfQotCWluZm8tPnVzZXJJRCA9IHVzZXJJRDsKLQlpbmZvLT5ncm91cElEID0gZ3JvdXBJRDsKLQlpbmZvLT51c2VyQWNjZXNzID0gdXNlckFjY2VzczsKLQlpbmZvLT5tb2RlID0gbW9kZTsKLQlyZXR1cm4gMDsKKyAgICByID0gUHlBcmdfUGFyc2UodiwgIihsbGxsKSIsICZ1c2VySUQsICZncm91cElELCAmdXNlckFjY2VzcywgJm1vZGUpOworICAgIGlmICghcikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGluZm8tPnVzZXJJRCA9IHVzZXJJRDsKKyAgICBpbmZvLT5ncm91cElEID0gZ3JvdXBJRDsKKyAgICBpbmZvLT51c2VyQWNjZXNzID0gdXNlckFjY2VzczsKKyAgICBpbmZvLT5tb2RlID0gbW9kZTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF92YWxlbmNlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYudmFsZW5jZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYudmFsZW5jZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfdmFsZW5jZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnZhbGVuY2UpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi52YWxlbmNlKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X2RhdGFMb2dpY2FsU2l6ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFMb2dpY2FsU2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9kYXRhTG9naWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfZGF0YVBoeXNpY2FsU2l6ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFQaHlzaWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9yc3JjTG9naWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLnJzcmNMb2dpY2FsU2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfcnNyY0xvZ2ljYWxTaXplKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNQaHlzaWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9yc3JjUGh5c2ljYWxTaXplKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY1BoeXNpY2FsU2l6ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfc2hhcmluZ0ZsYWdzKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYuc2hhcmluZ0ZsYWdzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X3NoYXJpbmdGbGFncyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncyktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncyktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF91c2VyUHJpdmlsZWdlcyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJiIiwgc2VsZi0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiYiIsIHNlbGYtPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfdXNlclByaXZpbGVnZXMoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJiIiwgJnNlbGYtPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImIiLCAmc2VsZi0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgRlNDYXRhbG9nSW5mb19nZXRzZXRsaXN0W10gPSB7Ci0JeyJub2RlRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlRmxhZ3MsIE5VTEx9LAotCXsidm9sdW1lIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF92b2x1bWUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfdm9sdW1lLCBOVUxMfSwKLQl7InBhcmVudERpcklEIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9wYXJlbnREaXJJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9wYXJlbnREaXJJRCwgTlVMTH0sCi0JeyJub2RlSUQiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlSUQsIE5VTEx9LAotCXsiY3JlYXRlRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfY3JlYXRlRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jcmVhdGVEYXRlLCBOVUxMfSwKLQl7ImNvbnRlbnRNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9jb250ZW50TW9kRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jb250ZW50TW9kRGF0ZSwgTlVMTH0sCi0JeyJhdHRyaWJ1dGVNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9hdHRyaWJ1dGVNb2REYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2F0dHJpYnV0ZU1vZERhdGUsIE5VTEx9LAotCXsiYWNjZXNzRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfYWNjZXNzRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9hY2Nlc3NEYXRlLCBOVUxMfSwKLQl7ImJhY2t1cERhdGUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2JhY2t1cERhdGUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfYmFja3VwRGF0ZSwgTlVMTH0sCi0JeyJwZXJtaXNzaW9ucyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfcGVybWlzc2lvbnMsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcGVybWlzc2lvbnMsIE5VTEx9LAotCXsidmFsZW5jZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfdmFsZW5jZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF92YWxlbmNlLCBOVUxMfSwKLQl7ImRhdGFMb2dpY2FsU2l6ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfZGF0YUxvZ2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFMb2dpY2FsU2l6ZSwgTlVMTH0sCi0JeyJkYXRhUGh5c2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9kYXRhUGh5c2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFQaHlzaWNhbFNpemUsIE5VTEx9LAotCXsicnNyY0xvZ2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9yc3JjTG9naWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY0xvZ2ljYWxTaXplLCBOVUxMfSwKLQl7InJzcmNQaHlzaWNhbFNpemUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNQaHlzaWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY1BoeXNpY2FsU2l6ZSwgTlVMTH0sCi0JeyJzaGFyaW5nRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3NoYXJpbmdGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9zaGFyaW5nRmxhZ3MsIE5VTEx9LAotCXsidXNlclByaXZpbGVnZXMiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3VzZXJQcml2aWxlZ2VzLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3VzZXJQcml2aWxlZ2VzLCBOVUxMfSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJub2RlRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlRmxhZ3MsIE5VTEx9LAorICAgIHsidm9sdW1lIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF92b2x1bWUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfdm9sdW1lLCBOVUxMfSwKKyAgICB7InBhcmVudERpcklEIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9wYXJlbnREaXJJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9wYXJlbnREaXJJRCwgTlVMTH0sCisgICAgeyJub2RlSUQiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X25vZGVJRCwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9ub2RlSUQsIE5VTEx9LAorICAgIHsiY3JlYXRlRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfY3JlYXRlRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jcmVhdGVEYXRlLCBOVUxMfSwKKyAgICB7ImNvbnRlbnRNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9jb250ZW50TW9kRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9jb250ZW50TW9kRGF0ZSwgTlVMTH0sCisgICAgeyJhdHRyaWJ1dGVNb2REYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9hdHRyaWJ1dGVNb2REYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2F0dHJpYnV0ZU1vZERhdGUsIE5VTEx9LAorICAgIHsiYWNjZXNzRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfYWNjZXNzRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9hY2Nlc3NEYXRlLCBOVUxMfSwKKyAgICB7ImJhY2t1cERhdGUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2JhY2t1cERhdGUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfYmFja3VwRGF0ZSwgTlVMTH0sCisgICAgeyJwZXJtaXNzaW9ucyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfcGVybWlzc2lvbnMsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcGVybWlzc2lvbnMsIE5VTEx9LAorICAgIHsidmFsZW5jZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfdmFsZW5jZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF92YWxlbmNlLCBOVUxMfSwKKyAgICB7ImRhdGFMb2dpY2FsU2l6ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfZGF0YUxvZ2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFMb2dpY2FsU2l6ZSwgTlVMTH0sCisgICAgeyJkYXRhUGh5c2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9kYXRhUGh5c2ljYWxTaXplLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFQaHlzaWNhbFNpemUsIE5VTEx9LAorICAgIHsicnNyY0xvZ2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9yc3JjTG9naWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY0xvZ2ljYWxTaXplLCBOVUxMfSwKKyAgICB7InJzcmNQaHlzaWNhbFNpemUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNQaHlzaWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfcnNyY1BoeXNpY2FsU2l6ZSwgTlVMTH0sCisgICAgeyJzaGFyaW5nRmxhZ3MiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3NoYXJpbmdGbGFncywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9zaGFyaW5nRmxhZ3MsIE5VTEx9LAorICAgIHsidXNlclByaXZpbGVnZXMiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3VzZXJQcml2aWxlZ2VzLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3VzZXJQcml2aWxlZ2VzLCBOVUxMfSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTQzNiwxMDMgKzQzNiwxMDMgQEAKICNkZWZpbmUgRlNDYXRhbG9nSW5mb19oYXNoIE5VTEwKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb190cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Ci0JICAgICAgICAgICAgIm5vZGVGbGFncyIsCi0JICAgICAgICAgICAgInZvbHVtZSIsCi0JICAgICAgICAgICAgInBhcmVudERpcklEIiwKLQkgICAgICAgICAgICAibm9kZUlEIiwKLQkgICAgICAgICAgICAiY3JlYXRlRGF0ZSIsCi0JICAgICAgICAgICAgImNvbnRlbnRNb2REYXRlIiwKLQkgICAgICAgICAgICAiYXRyaWJ1dGVNb2REYXRlIiwKLQkgICAgICAgICAgICAiYWNjZXNzRGF0ZSIsCi0JICAgICAgICAgICAgImJhY2t1cERhdGUiLAotCSAgICAgICAgICAgICJ2YWxlbmNlIiwKLQkgICAgICAgICAgICAiZGF0YUxvZ2ljYWxTaXplIiwKLQkgICAgICAgICAgICAiZGF0YVBoeXNpY2FsU2l6ZSIsCi0JICAgICAgICAgICAgInJzcmNMb2dpY2FsU2l6ZSIsCi0JICAgICAgICAgICAgInJzcmNQaHlzaWNhbFNpemUiLAotCSAgICAgICAgICAgICJzaGFyaW5nRmxhZ3MiLAotCSAgICAgICAgICAgICJ1c2VyUHJpdmlsZWdlcyIKLQkgICAgICAgICAgICAsIDB9OworICAgIHN0YXRpYyBjaGFyICprd1tdID0geworICAgICAgICAgICAgICAgICJub2RlRmxhZ3MiLAorICAgICAgICAgICAgICAgICJ2b2x1bWUiLAorICAgICAgICAgICAgICAgICJwYXJlbnREaXJJRCIsCisgICAgICAgICAgICAgICAgIm5vZGVJRCIsCisgICAgICAgICAgICAgICAgImNyZWF0ZURhdGUiLAorICAgICAgICAgICAgICAgICJjb250ZW50TW9kRGF0ZSIsCisgICAgICAgICAgICAgICAgImF0cmlidXRlTW9kRGF0ZSIsCisgICAgICAgICAgICAgICAgImFjY2Vzc0RhdGUiLAorICAgICAgICAgICAgICAgICJiYWNrdXBEYXRlIiwKKyAgICAgICAgICAgICAgICAidmFsZW5jZSIsCisgICAgICAgICAgICAgICAgImRhdGFMb2dpY2FsU2l6ZSIsCisgICAgICAgICAgICAgICAgImRhdGFQaHlzaWNhbFNpemUiLAorICAgICAgICAgICAgICAgICJyc3JjTG9naWNhbFNpemUiLAorICAgICAgICAgICAgICAgICJyc3JjUGh5c2ljYWxTaXplIiwKKyAgICAgICAgICAgICAgICAic2hhcmluZ0ZsYWdzIiwKKyAgICAgICAgICAgICAgICAidXNlclByaXZpbGVnZXMiCisgICAgICAgICAgICAgICAgLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxIaGxsTyZPJk8mTyZPJmxsbGxsbGIiLCBrdywgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLm5vZGVGbGFncywKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudm9sdW1lLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5wYXJlbnREaXJJRCwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYubm9kZUlELAotCSAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5jcmVhdGVEYXRlLAotCSAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSwKLQkgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSwKLQkgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSwKLQkgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudmFsZW5jZSwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUsCi0JICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUsCi0JICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncywKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMpKQotCXsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8SGhsbE8mTyZPJk8mTyZsbGxsbGxiIiwga3csICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5ub2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnZvbHVtZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYucGFyZW50RGlySUQsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLm5vZGVJRCwKKyAgICAgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSwKKyAgICAgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuY29udGVudE1vZERhdGUsCisgICAgICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUsCisgICAgICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUsCisgICAgICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmJhY2t1cERhdGUsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnZhbGVuY2UsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmRhdGFMb2dpY2FsU2l6ZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplLAorICAgICAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplLAorICAgICAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKSkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgRlNDYXRhbG9nSW5mb190cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQltZW1zZXQoJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU0NhdGFsb2dJbmZvKSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZTQ2F0YWxvZ0luZm8pKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBGU0NhdGFsb2dJbmZvX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGU0NhdGFsb2dJbmZvX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiQ2FyYm9uLkZpbGUuRlNDYXRhbG9nSW5mbyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEZTQ2F0YWxvZ0luZm9PYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBGU0NhdGFsb2dJbmZvX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEZTQ2F0YWxvZ0luZm9fY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEZTQ2F0YWxvZ0luZm9fcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEZTQ2F0YWxvZ0luZm9faGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRlNDYXRhbG9nSW5mb19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlGU0NhdGFsb2dJbmZvX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUZTQ2F0YWxvZ0luZm9fdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUZTQ2F0YWxvZ0luZm9fdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRlNDYXRhbG9nSW5mb190cF9uZXcsIC8qIHRwX25ldyAqLwotCUZTQ2F0YWxvZ0luZm9fdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIkNhcmJvbi5GaWxlLkZTQ2F0YWxvZ0luZm8iLCAvKnRwX25hbWUqLworICAgIHNpemVvZihGU0NhdGFsb2dJbmZvT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRlNDYXRhbG9nSW5mb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBGU0NhdGFsb2dJbmZvX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBGU0NhdGFsb2dJbmZvX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBGU0NhdGFsb2dJbmZvX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEZTQ2F0YWxvZ0luZm9fbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRlNDYXRhbG9nSW5mb19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBGU0NhdGFsb2dJbmZvX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBGU0NhdGFsb2dJbmZvX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEZTQ2F0YWxvZ0luZm9fdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBGU0NhdGFsb2dJbmZvX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBGU0NhdGFsb2dJbmZvIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTQ3LDEwMyArNTQ3LDEwMyBAQAogI2RlZmluZSBGSW5mb19DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZGSW5mb19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZGSW5mb19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRkluZm9PYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlGSW5mbyBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZJbmZvIG9iX2l0c2VsZjsKIH0gRkluZm9PYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fTmV3KEZJbmZvICppdHNlbGYpCiB7Ci0JRkluZm9PYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhGSW5mb09iamVjdCwgJkZJbmZvX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRkluZm9PYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhGSW5mb09iamVjdCwgJkZJbmZvX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBpbnQgRkluZm9fQ29udmVydChQeU9iamVjdCAqdiwgRkluZm8gKnBfaXRzZWxmKQogewotCWlmICghRkluZm9fQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRkluZm8gcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRkluZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRkluZm9fQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRkluZm8gcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRkluZm9PYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBGSW5mb19kZWFsbG9jKEZJbmZvT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEZJbmZvX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fZ2V0X1R5cGUoRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkT1NUeXBlLCBzZWxmLT5vYl9pdHNlbGYuZmRUeXBlKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfVHlwZShGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fZ2V0X0NyZWF0b3IoRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkT1NUeXBlLCBzZWxmLT5vYl9pdHNlbGYuZmRDcmVhdG9yKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfQ3JlYXRvcihGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fZ2V0X0ZsYWdzKEZJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJIIiwgc2VsZi0+b2JfaXRzZWxmLmZkRmxhZ3MpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJIIiwgc2VsZi0+b2JfaXRzZWxmLmZkRmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IEZJbmZvX3NldF9GbGFncyhGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJIIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsYWdzKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiSCIsICZzZWxmLT5vYl9pdHNlbGYuZmRGbGFncyktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGSW5mb19nZXRfTG9jYXRpb24oRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRQb2ludCwgc2VsZi0+b2JfaXRzZWxmLmZkTG9jYXRpb24pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsIHNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfTG9jYXRpb24oRkluZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJnNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJnNlbGYtPm9iX2l0c2VsZi5mZExvY2F0aW9uKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZJbmZvX2dldF9GbGRyKEZJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+b2JfaXRzZWxmLmZkRmxkcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzZWxmLT5vYl9pdHNlbGYuZmRGbGRyKTsKIH0KIAogc3RhdGljIGludCBGSW5mb19zZXRfRmxkcihGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJoIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsZHIpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJoIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsZHIpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBGSW5mb19nZXRzZXRsaXN0W10gPSB7Ci0JeyJUeXBlIiwgKGdldHRlcilGSW5mb19nZXRfVHlwZSwgKHNldHRlcilGSW5mb19zZXRfVHlwZSwgIjQtY2hhciBmaWxlIHR5cGUifSwKLQl7IkNyZWF0b3IiLCAoZ2V0dGVyKUZJbmZvX2dldF9DcmVhdG9yLCAoc2V0dGVyKUZJbmZvX3NldF9DcmVhdG9yLCAiNC1jaGFyIGZpbGUgY3JlYXRvciJ9LAotCXsiRmxhZ3MiLCAoZ2V0dGVyKUZJbmZvX2dldF9GbGFncywgKHNldHRlcilGSW5mb19zZXRfRmxhZ3MsICJGaW5kZXIgZmxhZyBiaXRzIn0sCi0JeyJMb2NhdGlvbiIsIChnZXR0ZXIpRkluZm9fZ2V0X0xvY2F0aW9uLCAoc2V0dGVyKUZJbmZvX3NldF9Mb2NhdGlvbiwgIih4LCB5KSBsb2NhdGlvbiBvZiB0aGUgZmlsZSdzIGljb24gaW4gaXRzIHBhcmVudCBmaW5kZXIgd2luZG93In0sCi0JeyJGbGRyIiwgKGdldHRlcilGSW5mb19nZXRfRmxkciwgKHNldHRlcilGSW5mb19zZXRfRmxkciwgIk9yaWdpbmFsIGZvbGRlciwgZm9yICdwdXQgYXdheScifSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJUeXBlIiwgKGdldHRlcilGSW5mb19nZXRfVHlwZSwgKHNldHRlcilGSW5mb19zZXRfVHlwZSwgIjQtY2hhciBmaWxlIHR5cGUifSwKKyAgICB7IkNyZWF0b3IiLCAoZ2V0dGVyKUZJbmZvX2dldF9DcmVhdG9yLCAoc2V0dGVyKUZJbmZvX3NldF9DcmVhdG9yLCAiNC1jaGFyIGZpbGUgY3JlYXRvciJ9LAorICAgIHsiRmxhZ3MiLCAoZ2V0dGVyKUZJbmZvX2dldF9GbGFncywgKHNldHRlcilGSW5mb19zZXRfRmxhZ3MsICJGaW5kZXIgZmxhZyBiaXRzIn0sCisgICAgeyJMb2NhdGlvbiIsIChnZXR0ZXIpRkluZm9fZ2V0X0xvY2F0aW9uLCAoc2V0dGVyKUZJbmZvX3NldF9Mb2NhdGlvbiwgIih4LCB5KSBsb2NhdGlvbiBvZiB0aGUgZmlsZSdzIGljb24gaW4gaXRzIHBhcmVudCBmaW5kZXIgd2luZG93In0sCisgICAgeyJGbGRyIiwgKGdldHRlcilGSW5mb19nZXRfRmxkciwgKHNldHRlcilGSW5mb19zZXRfRmxkciwgIk9yaWdpbmFsIGZvbGRlciwgZm9yICdwdXQgYXdheScifSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTY1NCw3MyArNjU0LDczIEBACiAjZGVmaW5lIEZJbmZvX2hhc2ggTlVMTAogc3RhdGljIGludCBGSW5mb190cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JRkluZm8gKml0c2VsZiA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIEZJbmZvICppdHNlbGYgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE8mIiwga3csIEZJbmZvX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJaWYgKGl0c2VsZikgbWVtY3B5KCYoKEZJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYsIGl0c2VsZiwgc2l6ZW9mKEZJbmZvKSk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8TyYiLCBrdywgRkluZm9fQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICBpZiAoaXRzZWxmKSBtZW1jcHkoJigoRkluZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiwgaXRzZWxmLCBzaXplb2YoRkluZm8pKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBGSW5mb190cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCYoKEZJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZJbmZvKSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmKChGSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGSW5mbykpOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIEZJbmZvX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGSW5mb19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIkNhcmJvbi5GaWxlLkZJbmZvIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRkluZm9PYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBGSW5mb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBGSW5mb19jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRkluZm9fcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEZJbmZvX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUZJbmZvX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUZJbmZvX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUZJbmZvX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlGSW5mb190cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlGSW5mb190cF9uZXcsIC8qIHRwX25ldyAqLwotCUZJbmZvX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJDYXJib24uRmlsZS5GSW5mbyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEZJbmZvT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRkluZm9fZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRkluZm9fY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEZJbmZvX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBGSW5mb19oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBGSW5mb19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBGSW5mb19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBGSW5mb190cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRkluZm9fdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRkluZm9fdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBGSW5mb190cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCkBAIC03MzQsMjQ0ICs3MzQsMjQ0IEBACiAjZGVmaW5lIEFsaWFzX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkFsaWFzX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkFsaWFzX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBBbGlhc09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUFsaWFzSGFuZGxlIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShBbGlhc0hhbmRsZSBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBBbGlhc0hhbmRsZSBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQWxpYXNIYW5kbGUgcHRyKTsKIH0gQWxpYXNPYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfTmV3KEFsaWFzSGFuZGxlIGl0c2VsZikKIHsKLQlBbGlhc09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEFsaWFzT2JqZWN0LCAmQWxpYXNfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEFsaWFzT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQWxpYXNPYmplY3QsICZBbGlhc19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBpbnQgQWxpYXNfQ29udmVydChQeU9iamVjdCAqdiwgQWxpYXNIYW5kbGUgKnBfaXRzZWxmKQogewotCWlmICghQWxpYXNfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQWxpYXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQWxpYXNPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQWxpYXNfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQWxpYXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQWxpYXNPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBBbGlhc19kZWFsbG9jKEFsaWFzT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7Ci0JfQotCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOworICAgIH0KKyAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfUmVzb2x2ZUFsaWFzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlc29sdmVBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXNvbHZlQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfR2V0QWxpYXNJbmZvKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFsaWFzSW5mb1R5cGUgaW5kZXg7Ci0JU3RyNjMgdGhlU3RyaW5nOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0QWxpYXNJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aGVTdHJpbmcpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFsaWFzSW5mb1R5cGUgaW5kZXg7CisgICAgU3RyNjMgdGhlU3RyaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QWxpYXNJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aGVTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjIHRhcmdldDsKKyAgICBCb29sZWFuIHdhc0NoYW5nZWQ7CisgICAgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKGZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX0ZvbGxvd0ZpbmRlckFsaWFzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JQm9vbGVhbiBsb2dvbjsKLQlGU1NwZWMgdGFyZ2V0OwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbG9nb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRm9sbG93RmluZGVyQWxpYXMoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgQm9vbGVhbiBsb2dvbjsKKyAgICBGU1NwZWMgdGFyZ2V0OworICAgIEJvb2xlYW4gd2FzQ2hhbmdlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9nb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRm9sbG93RmluZGVyQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX0ZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MoQWxpYXNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNSZWYgdGFyZ2V0OwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQl1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW91bnRGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBmcm9tRmlsZV9fYnVmX187CisgICAgRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50RmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX0ZTUmVzb2x2ZUFsaWFzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIGZyb21GaWxlX19idWZfXzsKLQlGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNSZXNvbHZlQWxpYXMoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBmcm9tRmlsZV9fYnVmX187CisgICAgRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVzb2x2ZUFsaWFzKGZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfRlNGb2xsb3dGaW5kZXJBbGlhcyhBbGlhc09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiBmcm9tRmlsZTsKLQlCb29sZWFuIGxvZ29uOwotCUZTUmVmIHRhcmdldDsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2dvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0ZvbGxvd0ZpbmRlckFsaWFzKCZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgZnJvbUZpbGU7CisgICAgQm9vbGVhbiBsb2dvbjsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9nb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNGb2xsb3dGaW5kZXJBbGlhcygmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQWxpYXNfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiUmVzb2x2ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX1Jlc29sdmVBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGZyb21GaWxlKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7IkdldEFsaWFzSW5mbyIsIChQeUNGdW5jdGlvbilBbGlhc19HZXRBbGlhc0luZm8sIDEsCi0JIFB5RG9jX1NUUigiKEFsaWFzSW5mb1R5cGUgaW5kZXgpIC0+IChTdHI2MyB0aGVTdHJpbmcpIil9LAotCXsiUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQWxpYXNfUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7IkZvbGxvd0ZpbmRlckFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZvbGxvd0ZpbmRlckFsaWFzLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEJvb2xlYW4gbG9nb24pIC0+IChGU1NwZWMgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAorICAgIHsiUmVzb2x2ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX1Jlc29sdmVBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZyb21GaWxlKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkdldEFsaWFzSW5mbyIsIChQeUNGdW5jdGlvbilBbGlhc19HZXRBbGlhc0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEFsaWFzSW5mb1R5cGUgaW5kZXgpIC0+IChTdHI2MyB0aGVTdHJpbmcpIil9LAorICAgIHsiUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQWxpYXNfUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkZvbGxvd0ZpbmRlckFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZvbGxvd0ZpbmRlckFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEJvb2xlYW4gbG9nb24pIC0+IChGU1NwZWMgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXsiRlNSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncyIsIChQeUNGdW5jdGlvbilBbGlhc19GU1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSwgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNSZWYgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiRlNSZXNvbHZlQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRlNSZXNvbHZlQWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlKSAtPiAoRlNSZWYgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiRlNGb2xsb3dGaW5kZXJBbGlhcyIsIChQeUNGdW5jdGlvbilBbGlhc19GU0ZvbGxvd0ZpbmRlckFsaWFzLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGxvZ29uKSAtPiAoRlNSZWYgZnJvbUZpbGUsIEZTUmVmIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRlNSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgZnJvbUZpbGUsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTUmVmIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkZTUmVzb2x2ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZTUmVzb2x2ZUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSkgLT4gKEZTUmVmIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IkZTRm9sbG93RmluZGVyQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRlNGb2xsb3dGaW5kZXJBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBsb2dvbikgLT4gKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX2dldF9kYXRhKEFsaWFzT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCWludCBzaXplOwotCSAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJ2OwogCi0JICAgICAgICAgICAgICAgICAgICBzaXplID0gR2V0SGFuZGxlU2l6ZSgoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgICAgICAgICBITG9jaygoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7Ci0JICAgICAgICAgICAgICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCooSGFuZGxlKXNlbGYtPm9iX2l0c2VsZiwgc2l6ZSk7Ci0JICAgICAgICAgICAgICAgICAgICBIVW5sb2NrKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBydjsKLQkgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBHZXRIYW5kbGVTaXplKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhMb2NrKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKihIYW5kbGUpc2VsZi0+b2JfaXRzZWxmLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhVbmxvY2soKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ2OworCiB9CiAKICNkZWZpbmUgQWxpYXNfc2V0X2RhdGEgTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgQWxpYXNfZ2V0c2V0bGlzdFtdID0gewotCXsiZGF0YSIsIChnZXR0ZXIpQWxpYXNfZ2V0X2RhdGEsIChzZXR0ZXIpQWxpYXNfc2V0X2RhdGEsICJSYXcgZGF0YSBvZiB0aGUgYWxpYXMgb2JqZWN0In0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGF0YSIsIChnZXR0ZXIpQWxpYXNfZ2V0X2RhdGEsIChzZXR0ZXIpQWxpYXNfc2V0X2RhdGEsICJSYXcgZGF0YSBvZiB0aGUgYWxpYXMgb2JqZWN0In0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC05ODIsOTcgKzk4Miw5NyBAQAogI2RlZmluZSBBbGlhc19oYXNoIE5VTEwKIHN0YXRpYyBpbnQgQWxpYXNfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUFsaWFzSGFuZGxlIGl0c2VsZiA9IE5VTEw7Ci0JY2hhciAqcmF3ZGF0YSA9IE5VTEw7Ci0JaW50IHJhd2RhdGFsZW4gPSAwOwotCUhhbmRsZSBoOwotCXN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAicmF3ZGF0YSIsIDB9OworICAgIEFsaWFzSGFuZGxlIGl0c2VsZiA9IE5VTEw7CisgICAgY2hhciAqcmF3ZGF0YSA9IE5VTEw7CisgICAgaW50IHJhd2RhdGFsZW4gPSAwOworICAgIEhhbmRsZSBoOworICAgIHN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAicmF3ZGF0YSIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE8mcyMiLCBrdywgQWxpYXNfQ29udmVydCwgJml0c2VsZiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkKLQlyZXR1cm4gLTE7Ci0JaWYgKGl0c2VsZiAmJiByYXdkYXRhKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWl0c2VsZiAmJiAhcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmF3ZGF0YSkKLQl7Ci0JCWlmICgoaCA9IE5ld0hhbmRsZShyYXdkYXRhbGVuKSkgPT0gTlVMTCkKLQkJewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlITG9jayhoKTsKLQkJbWVtY3B5KChjaGFyICopKmgsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOwotCQlIVW5sb2NrKGgpOwotCQkoKEFsaWFzT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSAoQWxpYXNIYW5kbGUpaDsKLQkJcmV0dXJuIDA7Ci0JfQotCSgoQWxpYXNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8TyZzIyIsIGt3LCBBbGlhc19Db252ZXJ0LCAmaXRzZWxmLCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKQorICAgIHJldHVybiAtMTsKKyAgICBpZiAoaXRzZWxmICYmIHJhd2RhdGEpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghaXRzZWxmICYmICFyYXdkYXRhKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyYXdkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKChoID0gTmV3SGFuZGxlKHJhd2RhdGFsZW4pKSA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIEhMb2NrKGgpOworICAgICAgICBtZW1jcHkoKGNoYXIgKikqaCwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7CisgICAgICAgIEhVbmxvY2soaCk7CisgICAgICAgICgoQWxpYXNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IChBbGlhc0hhbmRsZSloOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKChBbGlhc09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIEFsaWFzX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpBbGlhc190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEFsaWFzT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQWxpYXNPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBBbGlhc190cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQWxpYXNfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJDYXJib24uRmlsZS5BbGlhcyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEFsaWFzT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQWxpYXNfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQWxpYXNfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEFsaWFzX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBBbGlhc19oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlBbGlhc19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlBbGlhc19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlBbGlhc190cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQWxpYXNfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQWxpYXNfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlBbGlhc190cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiQ2FyYm9uLkZpbGUuQWxpYXMiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihBbGlhc09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEFsaWFzX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEFsaWFzX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBBbGlhc19yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQWxpYXNfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQWxpYXNfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQWxpYXNfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQWxpYXNfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEFsaWFzX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEFsaWFzX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQWxpYXNfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBBbGlhcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMDg2LDM0NyArMTA4NiwzNDcgQEAKICNkZWZpbmUgRlNTcGVjX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkZTU3BlY19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZGU1NwZWNfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEZTU3BlY09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUZTU3BlYyBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZTU3BlYyBvYl9pdHNlbGY7CiB9IEZTU3BlY09iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfTmV3KEZTU3BlYyAqaXRzZWxmKQogewotCUZTU3BlY09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEZTU3BlY09iamVjdCwgJkZTU3BlY19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEZTU3BlY09iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKEZTU3BlY09iamVjdCwgJkZTU3BlY19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgdm9pZCBGU1NwZWNfZGVhbGxvYyhGU1NwZWNPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BPcGVuREYoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQ4IHBlcm1pc3Npb247Ci0Jc2hvcnQgcmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BPcGVuREYoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAotCSAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50OCBwZXJtaXNzaW9uOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwT3BlbkRGKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcE9wZW5SRihGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDggcGVybWlzc2lvbjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcE9wZW5SRigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24sCi0JICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQ4IHBlcm1pc3Npb247CisgICAgc2hvcnQgcmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BPcGVuUkYoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwQ3JlYXRlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BDcmVhdGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcENyZWF0ZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcERpckNyZWF0ZShGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JbG9uZyBjcmVhdGVkRGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwRGlyQ3JlYXRlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZERpcklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBsb25nIGNyZWF0ZWREaXJJRDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BEaXJDcmVhdGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpcklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRGlySUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BEZWxldGUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwRGVsZXRlKCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcERlbGV0ZSgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcEdldEZJbmZvKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGSW5mbyBmbmRySW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcEdldEZJbmZvKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmZm5kckluZm8pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGSW5mb19OZXcsICZmbmRySW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRkluZm8gZm5kckluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BHZXRGSW5mbygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkluZm9fTmV3LCAmZm5kckluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BTZXRGSW5mbyhGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRkluZm8gZm5kckluZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBGSW5mb19Db252ZXJ0LCAmZm5kckluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwU2V0RkluZm8oJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZmbmRySW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRkluZm8gZm5kckluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSW5mb19Db252ZXJ0LCAmZm5kckluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwU2V0RkluZm8oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICZmbmRySW5mbyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcFNldEZMb2NrKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcFNldEZMb2NrKCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcFNldEZMb2NrKCZfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwUnN0RkxvY2soRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwUnN0RkxvY2soJl9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwUnN0RkxvY2soJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BSZW5hbWUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSBuZXdOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcFJlbmFtZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIG5ld05hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjI1NSBuZXdOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcFJlbmFtZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BDYXRNb3ZlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZGVzdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmZGVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BDYXRNb3ZlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICZkZXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZGVzdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmZGVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BDYXRNb3ZlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICZkZXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwRXhjaGFuZ2VGaWxlcyhGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGRlc3Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJmRlc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwRXhjaGFuZ2VGaWxlcygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGRlc3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJmRlc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwRXhjaGFuZ2VGaWxlcygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcE1ha2VGU1JlZihGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgbmV3UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwTWFrZUZTUmVmKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgbmV3UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwTWFrZUZTUmVmKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX05ld0FsaWFzTWluaW1hbChGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQWxpYXNIYW5kbGUgYWxpYXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdBbGlhc01pbmltYWwoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmYWxpYXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBbGlhc19OZXcsIGFsaWFzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld0FsaWFzTWluaW1hbCgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19Jc0FsaWFzRmlsZShGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQm9vbGVhbiBhbGlhc0ZpbGVGbGFnOwotCUJvb2xlYW4gZm9sZGVyRmxhZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IElzQWxpYXNGaWxlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmYWxpYXNGaWxlRmxhZywKLQkgICAgICAgICAgICAgICAgICAgJmZvbGRlckZsYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBhbGlhc0ZpbGVGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgIGZvbGRlckZsYWcpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEJvb2xlYW4gYWxpYXNGaWxlRmxhZzsKKyAgICBCb29sZWFuIGZvbGRlckZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJc0FsaWFzRmlsZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmFsaWFzRmlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICZmb2xkZXJGbGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNGaWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfYXNfcGF0aG5hbWUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQljaGFyIHN0cmJ1ZlsxMDI0XTsKLQlPU0VyciBlcnI7CisgICAgY2hhciBzdHJidWZbMTAyNF07CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQllcnIgPSBfUHlNYWNfR2V0RnVsbFBhdGhuYW1lKCZfc2VsZi0+b2JfaXRzZWxmLCBzdHJidWYsIHNpemVvZihzdHJidWYpKTsKLQlpZiAoIGVyciApIHsKLQkgICAgICAgIFB5TWFjX0Vycm9yKGVycik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyYnVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gX1B5TWFjX0dldEZ1bGxQYXRobmFtZSgmX3NlbGYtPm9iX2l0c2VsZiwgc3RyYnVmLCBzaXplb2Yoc3RyYnVmKSk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHJidWYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX2FzX3R1cGxlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiKGlpcyMpIiwgX3NlbGYtPm9iX2l0c2VsZi52UmVmTnVtLCBfc2VsZi0+b2JfaXRzZWxmLnBhcklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX3NlbGYtPm9iX2l0c2VsZi5uYW1lWzFdLCBfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiKGlpcyMpIiwgX3NlbGYtPm9iX2l0c2VsZi52UmVmTnVtLCBfc2VsZi0+b2JfaXRzZWxmLnBhcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX3NlbGYtPm9iX2l0c2VsZi5uYW1lWzFdLCBfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0pOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGU1NwZWNfbWV0aG9kc1tdID0gewotCXsiRlNwT3BlbkRGIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BPcGVuREYsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAotCXsiRlNwT3BlblJGIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BPcGVuUkYsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAotCXsiRlNwQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiBOb25lIil9LAotCXsiRlNwRGlyQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BEaXJDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAobG9uZyBjcmVhdGVkRGlySUQpIil9LAotCXsiRlNwRGVsZXRlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkZTcEdldEZJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BHZXRGSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRkluZm8gZm5kckluZm8pIil9LAotCXsiRlNwU2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFNldEZJbmZvLCAxLAotCSBQeURvY19TVFIoIihGSW5mbyBmbmRySW5mbykgLT4gTm9uZSIpfSwKLQl7IkZTcFNldEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BTZXRGTG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRlNwUnN0RkxvY2siLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFJzdEZMb2NrLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJGU3BSZW5hbWUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFJlbmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IG5ld05hbWUpIC0+IE5vbmUiKX0sCi0JeyJGU3BDYXRNb3ZlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BDYXRNb3ZlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZGVzdCkgLT4gTm9uZSIpfSwKLQl7IkZTcEV4Y2hhbmdlRmlsZXMiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcEV4Y2hhbmdlRmlsZXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBkZXN0KSAtPiBOb25lIil9LAotCXsiRlNwTWFrZUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BNYWtlRlNSZWYsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCi0JeyJOZXdBbGlhc01pbmltYWwiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX05ld0FsaWFzTWluaW1hbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAotCXsiSXNBbGlhc0ZpbGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0lzQWxpYXNGaWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFsaWFzRmlsZUZsYWcsIEJvb2xlYW4gZm9sZGVyRmxhZykiKX0sCi0JeyJhc19wYXRobmFtZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfYXNfcGF0aG5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAotCXsiYXNfdHVwbGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX2FzX3R1cGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh2UmVmTnVtLCBkaXJJRCwgbmFtZSkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJGU3BPcGVuREYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE9wZW5ERiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCisgICAgeyJGU3BPcGVuUkYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE9wZW5SRiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCisgICAgeyJGU3BDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcENyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BEaXJDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcERpckNyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChsb25nIGNyZWF0ZWREaXJJRCkiKX0sCisgICAgeyJGU3BEZWxldGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcERlbGV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRlNwR2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcEdldEZJbmZvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGSW5mbyBmbmRySW5mbykiKX0sCisgICAgeyJGU3BTZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwU2V0RkluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEZJbmZvIGZuZHJJbmZvKSAtPiBOb25lIil9LAorICAgIHsiRlNwU2V0RkxvY2siLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFNldEZMb2NrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BSc3RGTG9jayIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwUnN0RkxvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcFJlbmFtZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwUmVuYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgbmV3TmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcENhdE1vdmUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcENhdE1vdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBkZXN0KSAtPiBOb25lIil9LAorICAgIHsiRlNwRXhjaGFuZ2VGaWxlcyIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwRXhjaGFuZ2VGaWxlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGRlc3QpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BNYWtlRlNSZWYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE1ha2VGU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRlNSZWYgbmV3UmVmKSIpfSwKKyAgICB7Ik5ld0FsaWFzTWluaW1hbCIsIChQeUNGdW5jdGlvbilGU1NwZWNfTmV3QWxpYXNNaW5pbWFsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCisgICAgeyJJc0FsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfSXNBbGlhc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gYWxpYXNGaWxlRmxhZywgQm9vbGVhbiBmb2xkZXJGbGFnKSIpfSwKKyAgICB7ImFzX3BhdGhuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19hc19wYXRobmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBzdHJpbmciKX0sCisgICAgeyJhc190dXBsZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfYXNfdHVwbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHZSZWZOdW0sIGRpcklELCBuYW1lKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX2dldF9kYXRhKEZTU3BlY09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKHNlbGYtPm9iX2l0c2VsZikpOwogfQogCiAjZGVmaW5lIEZTU3BlY19zZXRfZGF0YSBOVUxMCiAKIHN0YXRpYyBQeUdldFNldERlZiBGU1NwZWNfZ2V0c2V0bGlzdFtdID0gewotCXsiZGF0YSIsIChnZXR0ZXIpRlNTcGVjX2dldF9kYXRhLCAoc2V0dGVyKUZTU3BlY19zZXRfZGF0YSwgIlJhdyBkYXRhIG9mIHRoZSBGU1NwZWMgb2JqZWN0In0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGF0YSIsIChnZXR0ZXIpRlNTcGVjX2dldF9kYXRhLCAoc2V0dGVyKUZTU3BlY19zZXRfZGF0YSwgIlJhdyBkYXRhIG9mIHRoZSBGU1NwZWMgb2JqZWN0In0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC0xNDM0LDEwNSArMTQzNCwxMDUgQEAKIAogc3RhdGljIFB5T2JqZWN0ICogRlNTcGVjX3JlcHIoRlNTcGVjT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzUxMl07Ci0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMoKCVkLCAlbGQsICclLipzJykpIiwKLQkgICAgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUsCi0JICAgICAgICBzZWxmLT5vYl9pdHNlbGYudlJlZk51bSwKLQkgICAgICAgIHNlbGYtPm9iX2l0c2VsZi5wYXJJRCwKLQkgICAgICAgIHNlbGYtPm9iX2l0c2VsZi5uYW1lWzBdLCBzZWxmLT5vYl9pdHNlbGYubmFtZSsxKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzUxMl07CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMoKCVkLCAlbGQsICclLipzJykpIiwKKyAgICAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmLnZSZWZOdW0sCisgICAgICAgIHNlbGYtPm9iX2l0c2VsZi5wYXJJRCwKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0sIHNlbGYtPm9iX2l0c2VsZi5uYW1lKzEpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKICNkZWZpbmUgRlNTcGVjX2hhc2ggTlVMTAogc3RhdGljIGludCBGU1NwZWNfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICp2ID0gTlVMTDsKLQljaGFyICpyYXdkYXRhID0gTlVMTDsKLQlpbnQgcmF3ZGF0YWxlbiA9IDA7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsICJyYXdkYXRhIiwgMH07CisgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgIGNoYXIgKnJhd2RhdGEgPSBOVUxMOworICAgIGludCByYXdkYXRhbGVuID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgInJhd2RhdGEiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxPcyMiLCBrdywgJnYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpCi0JcmV0dXJuIC0xOwotCWlmICh2ICYmIHJhd2RhdGEpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghdiAmJiAhcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmF3ZGF0YSkKLQl7Ci0JCWlmIChyYXdkYXRhbGVuICE9IHNpemVvZihGU1NwZWMpKQotCQl7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRlNTcGVjIHJhd2RhdGEgaW5jb3JyZWN0IHNpemUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQltZW1jcHkoJigoRlNTcGVjT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5TWFjX0dldEZTU3BlYyh2LCAmKChGU1NwZWNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOwotCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8T3MjIiwga3csICZ2LCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKQorICAgIHJldHVybiAtMTsKKyAgICBpZiAodiAmJiByYXdkYXRhKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXYgJiYgIXJhd2RhdGEpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG11c3QgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJhd2RhdGEpCisgICAgeworICAgICAgICBpZiAocmF3ZGF0YWxlbiAhPSBzaXplb2YoRlNTcGVjKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTU3BlYyByYXdkYXRhIGluY29ycmVjdCBzaXplIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KCYoKEZTU3BlY09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLCByYXdkYXRhLCByYXdkYXRhbGVuKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChQeU1hY19HZXRGU1NwZWModiwgJigoRlNTcGVjT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYpKSByZXR1cm4gMDsKKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgRlNTcGVjX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCYoKEZTU3BlY09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU1NwZWMpKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCYoKEZTU3BlY09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU1NwZWMpKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBGU1NwZWNfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZTU3BlY19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIkNhcmJvbi5GaWxlLkZTU3BlYyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEZTU3BlY09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEZTU3BlY19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBGU1NwZWNfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEZTU3BlY19yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRlNTcGVjX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUZTU3BlY19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlGU1NwZWNfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRlNTcGVjX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlGU1NwZWNfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRlNTcGVjX3RwX25ldywgLyogdHBfbmV3ICovCi0JRlNTcGVjX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJDYXJib24uRmlsZS5GU1NwZWMiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihGU1NwZWNPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBGU1NwZWNfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRlNTcGVjX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBGU1NwZWNfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEZTU3BlY19oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBGU1NwZWNfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRlNTcGVjX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEZTU3BlY190cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRlNTcGVjX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEZTU3BlY190cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEZTU3BlY190cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCkBAIC0xNTQ2LDQ4MyArMTU0Niw0ODMgQEAKICNkZWZpbmUgRlNSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRlNSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRlNSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEZTUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRlNSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBGU1JlZiBvYl9pdHNlbGY7CiB9IEZTUmVmT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX05ldyhGU1JlZiAqaXRzZWxmKQogewotCUZTUmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRlNSZWZPYmplY3QsICZGU1JlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEZTUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRlNSZWZPYmplY3QsICZGU1JlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgdm9pZCBGU1JlZl9kZWFsbG9jKEZTUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU01ha2VGU1JlZlVuaWNvZGUoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCVRleHRFbmNvZGluZyB0ZXh0RW5jb2RpbmdIaW50OwotCUZTUmVmIG5ld1JlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2wiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZUxlbmd0aF9faW5fXywgJm5hbWVMZW5ndGhfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEVuY29kaW5nSGludCkpCi0JCXJldHVybiBOVUxMOwotCW5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTTWFrZUZTUmVmVW5pY29kZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVuY29kaW5nSGludCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludDsKKyAgICBGU1JlZiBuZXdSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRFbmNvZGluZ0hpbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU01ha2VGU1JlZlVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGluZ0hpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0NvbXBhcmVGU1JlZnMoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgcmVmMjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZyZWYyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTQ29tcGFyZUZTUmVmcygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZWYyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiByZWYyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnJlZjIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNDb21wYXJlRlNSZWZzKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZjIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTQ3JlYXRlRmlsZVVuaWNvZGUoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCUZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOwotCUZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87Ci0JRlNSZWYgbmV3UmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKKyAgICBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOworICAgIEZTUmVmIG5ld1JlZjsKICNpZm5kZWYgX19MUDY0X18KLQlGU1NwZWMgbmV3U3BlYzsKKyAgICBGU1NwZWMgbmV3U3BlYzsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0NyZWF0ZUZpbGVVbmljb2RlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2F0YWxvZ0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2xPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTQ2F0YWxvZ0luZm9fQ29udmVydCwgJmNhdGFsb2dJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmFtZUxlbmd0aF9fbGVuX18gPSBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBfZXJyID0gRlNDcmVhdGVGaWxlVW5pY29kZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGFsb2dJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCiAjaWZuZGVmIF9fTFA2NF9fCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1NwZWMKLSNlbHNlCS8qIF9fTFA2NF9fICovCi0JCQkJICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjCisjZWxzZSAgIC8qIF9fTFA2NF9fICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAogI2VuZGlmIC8qIF9fTFA2NF9fKi8KLQkJCQkgICk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJm5ld1NwZWMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJm5ld1NwZWMpOwogI2Vsc2UgLyogX19MUDY0X18gKi8KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPIiwgRlNSZWZfTmV3LCAmbmV3UmVmLCBQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPIiwgRlNSZWZfTmV3LCAmbmV3UmVmLCBQeV9Ob25lKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNDcmVhdGVEaXJlY3RvcnlVbmljb2RlKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOwotCWludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKLQlGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOwotCUZTUmVmIG5ld1JlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpuYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBuYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm87CisgICAgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbzsKKyAgICBGU1JlZiBuZXdSZWY7CiAjaWZuZGVmIF9fTFA2NF9fCi0JRlNTcGVjIG5ld1NwZWM7CisgICAgRlNTcGVjIG5ld1NwZWM7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JVUludDMyIG5ld0RpcklEOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCisgICAgVUludDMyIG5ld0RpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCiAjaWZuZGVmIF9fTFA2NF9fCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjLAogI2Vsc2UgLyogIV9fTFA2NF9fICovCi0JCQkJCU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0RpcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0RpcklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJm5ld1NwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgbmV3RGlySUQpOwotI2Vsc2UJLyogX19MUDY0X18gKi8KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPbCIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsCi0JICAgICAgICAgICAgICAgICAgICAgbmV3RGlySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZuZXdTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RpcklEKTsKKyNlbHNlICAgLyogX19MUDY0X18gKi8KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGlySUQpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNEZWxldGVPYmplY3QoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0RlbGV0ZU9iamVjdCgmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0RlbGV0ZU9iamVjdCgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNNb3ZlT2JqZWN0KEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIGRlc3REaXJlY3Rvcnk7Ci0JRlNSZWYgbmV3UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJmRlc3REaXJlY3RvcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNNb3ZlT2JqZWN0KCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJmRlc3REaXJlY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBkZXN0RGlyZWN0b3J5OworICAgIEZTUmVmIG5ld1JlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZkZXN0RGlyZWN0b3J5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTTW92ZU9iamVjdCgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0RGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNFeGNoYW5nZU9iamVjdHMoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZGVzdFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZkZXN0UmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTRXhjaGFuZ2VPYmplY3RzKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdFJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgZGVzdFJlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZkZXN0UmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTRXhjaGFuZ2VPYmplY3RzKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNSZW5hbWVVbmljb2RlKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOwotCWludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludDsKLQlGU1JlZiBuZXdSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRFbmNvZGluZ0hpbnQpKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU1JlbmFtZVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGluZ0hpbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpuYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBuYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ0hpbnQ7CisgICAgRlNSZWYgbmV3UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RW5jb2RpbmdIaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmFtZUxlbmd0aF9fbGVuX18gPSBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBfZXJyID0gRlNSZW5hbWVVbmljb2RlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUxlbmd0aF9fbGVuX18sIG5hbWVMZW5ndGhfX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2RpbmdIaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNHZXRDYXRhbG9nSW5mbyhGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKLQlGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOwotCUhGU1VuaVN0cjI1NSBvdXROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOworICAgIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87CisgICAgSEZTVW5pU3RyMjU1IG91dE5hbWU7CiAjaWZuZGVmIF9fTFA2NF9fCi0JRlNTcGVjIGZzU3BlYzsKKyAgICBGU1NwZWMgZnNTcGVjOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCUZTUmVmIHBhcmVudFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0dldENhdGFsb2dJbmZvKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmY2F0YWxvZ0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dE5hbWUsCisgICAgRlNSZWYgcGFyZW50UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmFtZSwKICNpZm5kZWYgX19MUDY0X18KLQkgICAgICAgICAgICAgICAgICAgICAgICAmZnNTcGVjLAotI2Vsc2UJLyogX19MUDY0X18gKi8KLQkJCQlOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc1NwZWMsCisjZWxzZSAgIC8qIF9fTFA2NF9fICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCSAgICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19OZXcsICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJm91dE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJmZzU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZwYXJlbnRSZWYpOwotI2Vsc2UJLyogX19MUDY0X18gKi8KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJk9PJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19OZXcsICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJm91dE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZwYXJlbnRSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19OZXcsICZjYXRhbG9nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJm91dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJmZzU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZwYXJlbnRSZWYpOworI2Vsc2UgICAvKiBfX0xQNjRfXyAqLworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mT08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU0NhdGFsb2dJbmZvX05ldywgJmNhdGFsb2dJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmb3V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnBhcmVudFJlZik7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU1NldENhdGFsb2dJbmZvKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOwotCUZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNTZXRDYXRhbG9nSW5mbygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEluZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGFsb2dJbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKKyAgICBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTQ2F0YWxvZ0luZm9fQ29udmVydCwgJmNhdGFsb2dJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTU2V0Q2F0YWxvZ0luZm8oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNDcmVhdGVGb3JrKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOwotCVVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlfZXJyID0gRlNDcmVhdGVGb3JrKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fLCBmb3JrTmFtZUxlbmd0aF9faW5fXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKKyAgICBpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU0NyZWF0ZUZvcmsoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0RlbGV0ZUZvcmsoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0RlbGV0ZUZvcmsoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18gPSBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgX2VyciA9IEZTRGVsZXRlRm9yaygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTT3BlbkZvcmsoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCVNJbnQ4IHBlcm1pc3Npb25zOwotCUZTSU9SZWZOdW0gZm9ya1JlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2IiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9ucykpCi0JCXJldHVybiBOVUxMOwotCWZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlfZXJyID0gRlNPcGVuRm9yaygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLAotCSAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3JrUmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgU0ludDggcGVybWlzc2lvbnM7CisgICAgRlNJT1JlZk51bSBmb3JrUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU09wZW5Gb3JrKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZOTm90aWZ5KEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZOTWVzc2FnZSBtZXNzYWdlOwotCU9wdGlvbkJpdHMgZmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZOTm90aWZ5KCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBtZXNzYWdlLAotCSAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRk5NZXNzYWdlIG1lc3NhZ2U7CisgICAgT3B0aW9uQml0cyBmbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRk5Ob3RpZnkoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU05ld0FsaWFzTWluaW1hbChGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBbGlhc0hhbmRsZSBpbkFsaWFzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNOZXdBbGlhc01pbmltYWwoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFsaWFzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBpbkFsaWFzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBpbkFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNOZXdBbGlhc01pbmltYWwoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFsaWFzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBpbkFsaWFzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0lzQWxpYXNGaWxlKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUJvb2xlYW4gYWxpYXNGaWxlRmxhZzsKLQlCb29sZWFuIGZvbGRlckZsYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0lzQWxpYXNGaWxlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICZhbGlhc0ZpbGVGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICZmb2xkZXJGbGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgYWxpYXNGaWxlRmxhZywKLQkgICAgICAgICAgICAgICAgICAgICBmb2xkZXJGbGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBCb29sZWFuIGFsaWFzRmlsZUZsYWc7CisgICAgQm9vbGVhbiBmb2xkZXJGbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNJc0FsaWFzRmlsZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpYXNGaWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZm9sZGVyRmxhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzRmlsZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyRmxhZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNSZWZNYWtlUGF0aChGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NTdGF0dXMgX2VycjsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2RlZmluZSBNQVhQQVRITkFNRSAxMDI0Ci0JVUludDggcGF0aFtNQVhQQVRITkFNRV07Ci0JVUludDMyIG1heFBhdGhTaXplID0gTUFYUEFUSE5BTUU7CisgICAgVUludDggcGF0aFtNQVhQQVRITkFNRV07CisgICAgVUludDMyIG1heFBhdGhTaXplID0gTUFYUEFUSE5BTUU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9lcnIgPSBGU1JlZk1ha2VQYXRoKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhdGhTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIiwgcGF0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1JlZk1ha2VQYXRoKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFBhdGhTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIiwgcGF0aCk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9hc19wYXRobmFtZShGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfcmVzID0gRlNSZWZfRlNSZWZNYWtlUGF0aChfc2VsZiwgX2FyZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcmVzID0gRlNSZWZfRlNSZWZNYWtlUGF0aChfc2VsZiwgX2FyZ3MpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGU1JlZl9tZXRob2RzW10gPSB7Ci0JeyJGU01ha2VGU1JlZlVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNNYWtlRlNSZWZVbmljb2RlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ0hpbnQpIC0+IChGU1JlZiBuZXdSZWYpIil9LAotCXsiRlNDb21wYXJlRlNSZWZzIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTQ29tcGFyZUZTUmVmcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcmVmMikgLT4gTm9uZSIpfSwKLQl7IkZTQ3JlYXRlRmlsZVVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDcmVhdGVGaWxlVW5pY29kZSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIG5hbWVMZW5ndGgsIEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvLCBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCi0JeyJGU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDcmVhdGVEaXJlY3RvcnlVbmljb2RlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm8sIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8pIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjLCBVSW50MzIgbmV3RGlySUQpIil9LAotCXsiRlNEZWxldGVPYmplY3QiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNEZWxldGVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkZTTW92ZU9iamVjdCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU01vdmVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGRlc3REaXJlY3RvcnkpIC0+IChGU1JlZiBuZXdSZWYpIil9LAotCXsiRlNFeGNoYW5nZU9iamVjdHMiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNFeGNoYW5nZU9iamVjdHMsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGRlc3RSZWYpIC0+IE5vbmUiKX0sCi0JeyJGU1JlbmFtZVVuaWNvZGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNSZW5hbWVVbmljb2RlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ0hpbnQpIC0+IChGU1JlZiBuZXdSZWYpIil9LAotCXsiRlNHZXRDYXRhbG9nSW5mbyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0dldENhdGFsb2dJbmZvLCAxLAotCSBQeURvY19TVFIoIihGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbykgLT4gKEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8sIEhGU1VuaVN0cjI1NSBvdXROYW1lLCBGU1NwZWMgZnNTcGVjLCBGU1JlZiBwYXJlbnRSZWYpIil9LAotCXsiRlNTZXRDYXRhbG9nSW5mbyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU1NldENhdGFsb2dJbmZvLCAxLAotCSBQeURvY19TVFIoIihGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbywgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbykgLT4gTm9uZSIpfSwKLQl7IkZTQ3JlYXRlRm9yayIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCkgLT4gTm9uZSIpfSwKLQl7IkZTRGVsZXRlRm9yayIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0RlbGV0ZUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCkgLT4gTm9uZSIpfSwKLQl7IkZTT3BlbkZvcmsiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNPcGVuRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoLCBTSW50OCBwZXJtaXNzaW9ucykgLT4gKFNJbnQxNiBmb3JrUmVmTnVtKSIpfSwKLQl7IkZOTm90aWZ5IiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZOTm90aWZ5LCAxLAotCSBQeURvY19TVFIoIihGTk1lc3NhZ2UgbWVzc2FnZSwgT3B0aW9uQml0cyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkZTTmV3QWxpYXNNaW5pbWFsIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTTmV3QWxpYXNNaW5pbWFsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBbGlhc0hhbmRsZSBpbkFsaWFzKSIpfSwKLQl7IkZTSXNBbGlhc0ZpbGUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNJc0FsaWFzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBhbGlhc0ZpbGVGbGFnLCBCb29sZWFuIGZvbGRlckZsYWcpIil9LAotCXsiRlNSZWZNYWtlUGF0aCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU1JlZk1ha2VQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IHN0cmluZyIpfSwKLQl7ImFzX3BhdGhuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX2FzX3BhdGhuYW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IHN0cmluZyIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkZTTWFrZUZTUmVmVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU01ha2VGU1JlZlVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCisgICAgeyJGU0NvbXBhcmVGU1JlZnMiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDb21wYXJlRlNSZWZzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiByZWYyKSAtPiBOb25lIil9LAorICAgIHsiRlNDcmVhdGVGaWxlVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZUZpbGVVbmljb2RlLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm8sIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8pIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjKSIpfSwKKyAgICB7IkZTQ3JlYXRlRGlyZWN0b3J5VW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbywgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbykgLT4gKEZTUmVmIG5ld1JlZiwgRlNTcGVjIG5ld1NwZWMsIFVJbnQzMiBuZXdEaXJJRCkiKX0sCisgICAgeyJGU0RlbGV0ZU9iamVjdCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0RlbGV0ZU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRlNNb3ZlT2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTTW92ZU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgZGVzdERpcmVjdG9yeSkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCisgICAgeyJGU0V4Y2hhbmdlT2JqZWN0cyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0V4Y2hhbmdlT2JqZWN0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgZGVzdFJlZikgLT4gTm9uZSIpfSwKKyAgICB7IkZTUmVuYW1lVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU1JlbmFtZVVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCisgICAgeyJGU0dldENhdGFsb2dJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTR2V0Q2F0YWxvZ0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvKSAtPiAoRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbywgSEZTVW5pU3RyMjU1IG91dE5hbWUsIEZTU3BlYyBmc1NwZWMsIEZTUmVmIHBhcmVudFJlZikiKX0sCisgICAgeyJGU1NldENhdGFsb2dJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTU2V0Q2F0YWxvZ0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvLCBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvKSAtPiBOb25lIil9LAorICAgIHsiRlNDcmVhdGVGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTQ3JlYXRlRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiBOb25lIil9LAorICAgIHsiRlNEZWxldGVGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTRGVsZXRlRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiBOb25lIil9LAorICAgIHsiRlNPcGVuRm9yayIsIChQeUNGdW5jdGlvbilGU1JlZl9GU09wZW5Gb3JrLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgZm9ya05hbWVMZW5ndGgsIFNJbnQ4IHBlcm1pc3Npb25zKSAtPiAoU0ludDE2IGZvcmtSZWZOdW0pIil9LAorICAgIHsiRk5Ob3RpZnkiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRk5Ob3RpZnksIDEsCisgICAgIFB5RG9jX1NUUigiKEZOTWVzc2FnZSBtZXNzYWdlLCBPcHRpb25CaXRzIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiRlNOZXdBbGlhc01pbmltYWwiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNOZXdBbGlhc01pbmltYWwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFsaWFzSGFuZGxlIGluQWxpYXMpIil9LAorICAgIHsiRlNJc0FsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0lzQWxpYXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFsaWFzRmlsZUZsYWcsIEJvb2xlYW4gZm9sZGVyRmxhZykiKX0sCisgICAgeyJGU1JlZk1ha2VQYXRoIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTUmVmTWFrZVBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAorICAgIHsiYXNfcGF0aG5hbWUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfYXNfcGF0aG5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9nZXRfZGF0YShGU1JlZk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKHNlbGYtPm9iX2l0c2VsZikpOwogfQogCiAjZGVmaW5lIEZTUmVmX3NldF9kYXRhIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEZTUmVmX2dldHNldGxpc3RbXSA9IHsKLQl7ImRhdGEiLCAoZ2V0dGVyKUZTUmVmX2dldF9kYXRhLCAoc2V0dGVyKUZTUmVmX3NldF9kYXRhLCAiUmF3IGRhdGEgb2YgdGhlIEZTUmVmIG9iamVjdCJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7ImRhdGEiLCAoZ2V0dGVyKUZTUmVmX2dldF9kYXRhLCAoc2V0dGVyKUZTUmVmX3NldF9kYXRhLCAiUmF3IGRhdGEgb2YgdGhlIEZTUmVmIG9iamVjdCJ9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtMjAzMyw5MyArMjAzMyw5MyBAQAogI2RlZmluZSBGU1JlZl9oYXNoIE5VTEwKIHN0YXRpYyBpbnQgRlNSZWZfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICp2ID0gTlVMTDsKLQljaGFyICpyYXdkYXRhID0gTlVMTDsKLQlpbnQgcmF3ZGF0YWxlbiA9IDA7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsICJyYXdkYXRhIiwgMH07CisgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgIGNoYXIgKnJhd2RhdGEgPSBOVUxMOworICAgIGludCByYXdkYXRhbGVuID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgInJhd2RhdGEiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxPcyMiLCBrdywgJnYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpCi0JcmV0dXJuIC0xOwotCWlmICh2ICYmIHJhd2RhdGEpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghdiAmJiAhcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmF3ZGF0YSkKLQl7Ci0JCWlmIChyYXdkYXRhbGVuICE9IHNpemVvZihGU1JlZikpCi0JCXsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU1JlZiByYXdkYXRhIGluY29ycmVjdCBzaXplIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbWVtY3B5KCYoKEZTUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5TWFjX0dldEZTUmVmKHYsICYoKEZTUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYpKSByZXR1cm4gMDsKLQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE9zIyIsIGt3LCAmdiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkKKyAgICByZXR1cm4gLTE7CisgICAgaWYgKHYgJiYgcmF3ZGF0YSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmx5IG9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtYXkgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCF2ICYmICFyYXdkYXRhKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyYXdkYXRhKQorICAgIHsKKyAgICAgICAgaWYgKHJhd2RhdGFsZW4gIT0gc2l6ZW9mKEZTUmVmKSkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmIHJhd2RhdGEgaW5jb3JyZWN0IHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoJigoRlNSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoUHlNYWNfR2V0RlNSZWYodiwgJigoRlNSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOworICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBGU1JlZl90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCYoKEZTUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZTUmVmKSk7Ci0JcmV0dXJuIHNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmKChGU1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZihGU1JlZikpOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIEZTUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBGU1JlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIkNhcmJvbi5GaWxlLkZTUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRlNSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBGU1JlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBGU1JlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRlNSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEZTUmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUZTUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUZTUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUZTUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlGU1JlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlGU1JlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUZTUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJDYXJib24uRmlsZS5GU1JlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEZTUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRlNSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRlNSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEZTUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBGU1JlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBGU1JlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBGU1JlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBGU1JlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRlNSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRlNSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBGU1JlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEZTUmVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIxMjcsMTEyMyArMjEyNywxMTIzIEBACiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfVW5tb3VudFZvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHI2MyB2b2xOYW1lOwotCXNob3J0IHZSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB2b2xOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVbm1vdW50Vm9sKHZvbE5hbWUsCi0JICAgICAgICAgICAgICAgICAgdlJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyNjMgdm9sTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVW5tb3VudFZvbCh2b2xOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRmx1c2hWb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU3RyNjMgdm9sTmFtZTsKLQlzaG9ydCB2UmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hWb2wodm9sTmFtZSwKLQkgICAgICAgICAgICAgICAgdlJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyNjMgdm9sTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hWb2wodm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IU2V0Vm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjYzIHZvbE5hbWU7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHZvbE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSFNldFZvbCh2b2xOYW1lLAotCSAgICAgICAgICAgICAgIHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjYzIHZvbE5hbWU7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHZvbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSFNldFZvbCh2b2xOYW1lLAorICAgICAgICAgICAgICAgICAgIHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNDbG9zZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNDbG9zZShyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0Nsb3NlKHJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9BbGxvY2F0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JbG9uZyBjb3VudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBbGxvY2F0ZShyZWZOdW0sCi0JICAgICAgICAgICAgICAgICZjb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgY291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGNvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFsbG9jYXRlKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9HZXRFT0YoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVmTnVtOwotCWxvbmcgbG9nRU9GOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEVPRihyZWZOdW0sCi0JICAgICAgICAgICAgICAmbG9nRU9GKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBsb2dFT0YpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGxvZ0VPRjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRFT0YocmVmTnVtLAorICAgICAgICAgICAgICAgICAgJmxvZ0VPRik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRU9GKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX1NldEVPRihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JbG9uZyBsb2dFT0Y7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbG9nRU9GKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEVPRihyZWZOdW0sCi0JICAgICAgICAgICAgICBsb2dFT0YpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGxvZ0VPRjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2dFT0YpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RU9GKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgIGxvZ0VPRik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9HZXRGUG9zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlZk51bTsKLQlsb25nIGZpbGVQb3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RlBvcyhyZWZOdW0sCi0JICAgICAgICAgICAgICAgJmZpbGVQb3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGZpbGVQb3MpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGZpbGVQb3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RlBvcyhyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgJmZpbGVQb3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQb3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfU2V0RlBvcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0Jc2hvcnQgcG9zTW9kZTsKLQlsb25nIHBvc09mZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc09mZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRGUG9zKHJlZk51bSwKLQkgICAgICAgICAgICAgICBwb3NNb2RlLAotCSAgICAgICAgICAgICAgIHBvc09mZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmTnVtOworICAgIHNob3J0IHBvc01vZGU7CisgICAgbG9uZyBwb3NPZmY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NPZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RlBvcyhyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgcG9zTW9kZSwKKyAgICAgICAgICAgICAgICAgICBwb3NPZmYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfR2V0VlJlZk51bShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBmaWxlUmVmTnVtOwotCXNob3J0IHZSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmaWxlUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFZSZWZOdW0oZmlsZVJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAmdlJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgZmlsZVJlZk51bTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRWUmVmTnVtKGZpbGVSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSEdldFZvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHJpbmdQdHIgdm9sTmFtZTsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsICZ2b2xOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhHZXRWb2wodm9sTmFtZSwKLQkgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAmZGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIGRpcklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHJpbmdQdHIgdm9sTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsICZ2b2xOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhHZXRWb2wodm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAmZGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpcklEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hPcGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JU0ludDggcGVybWlzc2lvbjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIT3Blbih2UmVmTnVtLAotCSAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgZmlsZU5hbWUsCi0JICAgICAgICAgICAgIHBlcm1pc3Npb24sCi0JICAgICAgICAgICAgICZyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBTSW50OCBwZXJtaXNzaW9uOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhPcGVuKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hPcGVuREYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBmaWxlTmFtZTsKLQlTSW50OCBwZXJtaXNzaW9uOwotCXNob3J0IHJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhPcGVuREYodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAotCSAgICAgICAgICAgICAgICZyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBTSW50OCBwZXJtaXNzaW9uOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhPcGVuREYodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IT3BlblJGKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JU0ludDggcGVybWlzc2lvbjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIT3BlblJGKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKLQkgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgZmlsZU5hbWU7CisgICAgU0ludDggcGVybWlzc2lvbjsKKyAgICBzaG9ydCByZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIT3BlblJGKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfQWxsb2NDb250aWcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVmTnVtOwotCWxvbmcgY291bnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWxsb2NDb250aWcocmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAmY291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZWZOdW07CisgICAgbG9uZyBjb3VudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBbGxvY0NvbnRpZyhyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICZjb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSENyZWF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCU9TVHlwZSBjcmVhdG9yOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhDcmVhdGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgIGZpbGVUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhDcmVhdGUodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0RpckNyZWF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgcGFyZW50RGlySUQ7Ci0JU3RyMjU1IGRpcmVjdG9yeU5hbWU7Ci0JbG9uZyBjcmVhdGVkRGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50RGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZGlyZWN0b3J5TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEaXJDcmVhdGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgIHBhcmVudERpcklELAotCSAgICAgICAgICAgICAgICAgZGlyZWN0b3J5TmFtZSwKLQkgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWREaXJJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIHBhcmVudERpcklEOworICAgIFN0cjI1NSBkaXJlY3RvcnlOYW1lOworICAgIGxvbmcgY3JlYXRlZERpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudERpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRpcmVjdG9yeU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlyQ3JlYXRlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnREaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpcklEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRGlySUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSERlbGV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhEZWxldGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBmaWxlTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIRGVsZXRlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSEdldEZJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JRkluZm8gZm5kckluZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSEdldEZJbmZvKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRkluZm9fTmV3LCAmZm5kckluZm8pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgZmlsZU5hbWU7CisgICAgRkluZm8gZm5kckluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSEdldEZJbmZvKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRkluZm9fTmV3LCAmZm5kckluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSFNldEZJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JRkluZm8gZm5kckluZm87Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRkluZm9fQ29udmVydCwgJmZuZHJJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhTZXRGSW5mbyh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICZmbmRySW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBGSW5mbyBmbmRySW5mbzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSW5mb19Db252ZXJ0LCAmZm5kckluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSFNldEZJbmZvKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hTZXRGTG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhTZXRGTG9jayh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICBmaWxlTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIU2V0RkxvY2sodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSFJzdEZMb2NrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSFJzdEZMb2NrKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgIGZpbGVOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhSc3RGTG9jayh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IUmVuYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgb2xkTmFtZTsKLQlTdHIyNTUgbmV3TmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG9sZE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmV3TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIUmVuYW1lKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgb2xkTmFtZSwKLQkgICAgICAgICAgICAgICBuZXdOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IG9sZE5hbWU7CisgICAgU3RyMjU1IG5ld05hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5ld05hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSFJlbmFtZSh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgIG9sZE5hbWUsCisgICAgICAgICAgICAgICAgICAgbmV3TmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9DYXRNb3ZlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgb2xkTmFtZTsKLQlsb25nIG5ld0RpcklEOwotCVN0cjI1NSBuZXdOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG9sZE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdEaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENhdE1vdmUodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBvbGROYW1lLAotCSAgICAgICAgICAgICAgIG5ld0RpcklELAotCSAgICAgICAgICAgICAgIG5ld05hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgb2xkTmFtZTsKKyAgICBsb25nIG5ld0RpcklEOworICAgIFN0cjI1NSBuZXdOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG9sZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdEaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENhdE1vdmUodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBvbGROYW1lLAorICAgICAgICAgICAgICAgICAgIG5ld0RpcklELAorICAgICAgICAgICAgICAgICAgIG5ld05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNNYWtlRlNTcGVjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JRlNTcGVjIHNwZWM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNNYWtlRlNTcGVjKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgJnNwZWMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmc3BlYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBGU1NwZWMgc3BlYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU01ha2VGU1NwZWModlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmc3BlYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZzcGVjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTR2V0Rm9ya1Bvc2l0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCVNJbnQ2NCBwb3NpdGlvbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNHZXRGb3JrUG9zaXRpb24oZm9ya1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKLQkgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgU0ludDY0IHBvc2l0aW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0dldEZvcmtQb3NpdGlvbihmb3JrUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTU2V0Rm9ya1Bvc2l0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCVVJbnQxNiBwb3NpdGlvbk1vZGU7Ci0JU0ludDY0IHBvc2l0aW9uT2Zmc2V0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhITCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25PZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNTZXRGb3JrUG9zaXRpb24oZm9ya1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgVUludDE2IHBvc2l0aW9uTW9kZTsKKyAgICBTSW50NjQgcG9zaXRpb25PZmZzZXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEhMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1NldEZvcmtQb3NpdGlvbihmb3JrUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTR2V0Rm9ya1NpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JU0ludDY0IGZvcmtTaXplOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0dldEZvcmtTaXplKGZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgJmZvcmtTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3JrU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgU0ludDY0IGZvcmtTaXplOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0dldEZvcmtTaXplKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU1NldEZvcmtTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCVVJbnQxNiBwb3NpdGlvbk1vZGU7Ci0JU0ludDY0IHBvc2l0aW9uT2Zmc2V0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhITCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25PZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNTZXRGb3JrU2l6ZShmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgVUludDE2IHBvc2l0aW9uTW9kZTsKKyAgICBTSW50NjQgcG9zaXRpb25PZmZzZXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEhMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1NldEZvcmtTaXplKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTQWxsb2NhdGVGb3JrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCUZTQWxsb2NhdGlvbkZsYWdzIGZsYWdzOwotCVVJbnQxNiBwb3NpdGlvbk1vZGU7Ci0JU0ludDY0IHBvc2l0aW9uT2Zmc2V0OwotCVVJbnQ2NCByZXF1ZXN0Q291bnQ7Ci0JVUludDY0IGFjdHVhbENvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhISExMIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdENvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTQWxsb2NhdGVGb3JrKGZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxDb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTCIsCi0JICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBmb3JrUmVmTnVtOworICAgIEZTQWxsb2NhdGlvbkZsYWdzIGZsYWdzOworICAgIFVJbnQxNiBwb3NpdGlvbk1vZGU7CisgICAgU0ludDY0IHBvc2l0aW9uT2Zmc2V0OworICAgIFVJbnQ2NCByZXF1ZXN0Q291bnQ7CisgICAgVUludDY0IGFjdHVhbENvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhISExMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdENvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTQWxsb2NhdGVGb3JrKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNGbHVzaEZvcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTRmx1c2hGb3JrKGZvcmtSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBmb3JrUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0ZsdXNoRm9yayhmb3JrUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTQ2xvc2VGb3JrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBmb3JrUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0Nsb3NlRm9yayhmb3JrUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgZm9ya1JlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNDbG9zZUZvcmsoZm9ya1JlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU0dldERhdGFGb3JrTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIRlNVbmlTdHIyNTUgZGF0YUZvcmtOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNHZXREYXRhRm9ya05hbWUoJmRhdGFGb3JrTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmZGF0YUZvcmtOYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIRlNVbmlTdHIyNTUgZGF0YUZvcmtOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNHZXREYXRhRm9ya05hbWUoJmRhdGFGb3JrTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmZGF0YUZvcmtOYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTR2V0UmVzb3VyY2VGb3JrTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIRlNVbmlTdHIyNTUgcmVzb3VyY2VGb3JrTmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgmcmVzb3VyY2VGb3JrTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmcmVzb3VyY2VGb3JrTmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSEZTVW5pU3RyMjU1IHJlc291cmNlRm9ya05hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0dldFJlc291cmNlRm9ya05hbWUoJnJlc291cmNlRm9ya05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEhGU1VuaVN0cjI1NSwgJnJlc291cmNlRm9ya05hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNQYXRoTWFrZVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50OCAqIHBhdGg7Ci0JRlNSZWYgcmVmOwotCUJvb2xlYW4gaXNEaXJlY3Rvcnk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUGF0aE1ha2VSZWYocGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQ4ICogcGF0aDsKKyAgICBGU1JlZiByZWY7CisgICAgQm9vbGVhbiBpc0RpcmVjdG9yeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNQYXRoTWFrZVJlZihwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GTk5vdGlmeUJ5UGF0aChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50OCAqIHBhdGg7Ci0JRk5NZXNzYWdlIG1lc3NhZ2U7Ci0JT3B0aW9uQml0cyBmbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGTk5vdGlmeUJ5UGF0aChwYXRoLAotCSAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDggKiBwYXRoOworICAgIEZOTWVzc2FnZSBtZXNzYWdlOworICAgIE9wdGlvbkJpdHMgZmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRk5Ob3RpZnlCeVBhdGgocGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRk5Ob3RpZnlBbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRk5NZXNzYWdlIG1lc3NhZ2U7Ci0JT3B0aW9uQml0cyBmbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRk5Ob3RpZnlBbGwobWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZOTWVzc2FnZSBtZXNzYWdlOworICAgIE9wdGlvbkJpdHMgZmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZOTm90aWZ5QWxsKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpGaWxlX05ld0FsaWFzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0YXJnZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3QWxpYXMoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICZhbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjIHRhcmdldDsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3QWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfTmV3QWxpYXNNaW5pbWFsRnJvbUZ1bGxQYXRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWNoYXIgKmZ1bGxQYXRoX19pbl9fOwotCWludCBmdWxsUGF0aF9fbGVuX187Ci0JaW50IGZ1bGxQYXRoX19pbl9sZW5fXzsKLQlTdHIzMiB6b25lTmFtZTsKLQlTdHIzMSBzZXJ2ZXJOYW1lOwotCUFsaWFzSGFuZGxlIGFsaWFzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmdWxsUGF0aF9faW5fXywgJmZ1bGxQYXRoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB6b25lTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzZXJ2ZXJOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZnVsbFBhdGhfX2xlbl9fID0gZnVsbFBhdGhfX2luX2xlbl9fOwotCV9lcnIgPSBOZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgoZnVsbFBhdGhfX2xlbl9fLCBmdWxsUGF0aF9faW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGNoYXIgKmZ1bGxQYXRoX19pbl9fOworICAgIGludCBmdWxsUGF0aF9fbGVuX187CisgICAgaW50IGZ1bGxQYXRoX19pbl9sZW5fXzsKKyAgICBTdHIzMiB6b25lTmFtZTsKKyAgICBTdHIzMSBzZXJ2ZXJOYW1lOworICAgIEFsaWFzSGFuZGxlIGFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsUGF0aF9faW5fXywgJmZ1bGxQYXRoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB6b25lTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzZXJ2ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnVsbFBhdGhfX2xlbl9fID0gZnVsbFBhdGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBOZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgoZnVsbFBhdGhfX2xlbl9fLCBmdWxsUGF0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfUmVzb2x2ZUFsaWFzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgdGhlU3BlYzsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRoZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZSgmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWxpYXNDaGFpbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlU3BlYzsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZSgmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgdGhlU3BlYzsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQl1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlU3BlYzsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX1VwZGF0ZUFsaWFzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNTcGVjIHRhcmdldDsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX0NvbnZlcnQsICZhbGlhcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgYWxpYXMsCi0JICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTU3BlYyB0YXJnZXQ7CisgICAgQWxpYXNIYW5kbGUgYWxpYXM7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc19Db252ZXJ0LCAmYWxpYXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9SZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3NOb1VJKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyB0aGVTcGVjOwotCUJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zOwotCUJvb2xlYW4gdGFyZ2V0SXNGb2xkZXI7Ci0JQm9vbGVhbiB3YXNBbGlhc2VkOwotCXVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW91bnRGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3NOb1VJKCZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJnRoZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzQWxpYXNlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIHRoZVNwZWM7CisgICAgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnM7CisgICAgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlcjsKKyAgICBCb29sZWFuIHdhc0FsaWFzZWQ7CisgICAgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUkoJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTTmV3QWxpYXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNSZWYgdGFyZ2V0OwotCUFsaWFzSGFuZGxlIGluQWxpYXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRhcmdldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU05ld0FsaWFzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgJmluQWxpYXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBbGlhc19OZXcsIGluQWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIGZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTUmVmIHRhcmdldDsKKyAgICBBbGlhc0hhbmRsZSBpbkFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0YXJnZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNOZXdBbGlhcyhmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICZpbkFsaWFzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBpbkFsaWFzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIHRoZVJlZjsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQl1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0aGVSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGhlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIHRoZVJlZjsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0aGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKCZ0aGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGhlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIHRoZVJlZjsKLQlCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKLQlCb29sZWFuIHRhcmdldElzRm9sZGVyOwotCUJvb2xlYW4gd2FzQWxpYXNlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmdGhlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFsaWFzQ2hhaW5zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUmVzb2x2ZUFsaWFzRmlsZSgmdGhlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRoZVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiB0aGVSZWY7CisgICAgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnM7CisgICAgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlcjsKKyAgICBCb29sZWFuIHdhc0FsaWFzZWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRoZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1Jlc29sdmVBbGlhc0ZpbGUoJnRoZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0aGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXNGb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQWxpYXNlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU1VwZGF0ZUFsaWFzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIGZyb21GaWxlX19idWZfXzsKLQlGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmIHRhcmdldDsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlCb29sZWFuIHdhc0NoYW5nZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICBBbGlhc19Db252ZXJ0LCAmYWxpYXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNVcGRhdGVBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGFsaWFzLAotCSAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBmcm9tRmlsZV9fYnVmX187CisgICAgRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiB0YXJnZXQ7CisgICAgQWxpYXNIYW5kbGUgYWxpYXM7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfQ29udmVydCwgJmFsaWFzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTVXBkYXRlQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9wYXRobmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JUHlPYmplY3QgKm9iajsKKyAgICBQeU9iamVjdCAqb2JqOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyIsICZvYmopKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikpIHsKLQkgICAgICAgIFB5X0lOQ1JFRihvYmopOwotCSAgICAgICAgcmV0dXJuIG9iajsKLQl9Ci0JaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKQotCSAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob2JqLCAidXRmOCIsICJzdHJpY3QiKTsKLQlfcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvYmosICJhc19wYXRobmFtZSIsIE5VTEwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLCAmb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcob2JqLCAidXRmOCIsICJzdHJpY3QiKTsKKyAgICBfcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvYmosICJhc19wYXRobmFtZSIsIE5VTEwpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGaWxlX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IlVubW91bnRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9Vbm1vdW50Vm9sLCAxLAotCSBQeURvY19TVFIoIihTdHI2MyB2b2xOYW1lLCBzaG9ydCB2UmVmTnVtKSAtPiBOb25lIil9LAotCXsiRmx1c2hWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9GbHVzaFZvbCwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyNjMgdm9sTmFtZSwgc2hvcnQgdlJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkhTZXRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9IU2V0Vm9sLCAxLAotCSBQeURvY19TVFIoIihTdHI2MyB2b2xOYW1lLCBzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiBOb25lIil9LAotCXsiRlNDbG9zZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQ2xvc2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkFsbG9jYXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfQWxsb2NhdGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gKGxvbmcgY291bnQpIil9LAotCXsiR2V0RU9GIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfR2V0RU9GLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGxvZ0VPRikiKX0sCi0JeyJTZXRFT0YiLCAoUHlDRnVuY3Rpb24pRmlsZV9TZXRFT0YsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgbG9uZyBsb2dFT0YpIC0+IE5vbmUiKX0sCi0JeyJHZXRGUG9zIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfR2V0RlBvcywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBmaWxlUG9zKSIpfSwKLQl7IlNldEZQb3MiLCAoUHlDRnVuY3Rpb24pRmlsZV9TZXRGUG9zLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIHNob3J0IHBvc01vZGUsIGxvbmcgcG9zT2ZmKSAtPiBOb25lIil9LAotCXsiR2V0VlJlZk51bSIsIChQeUNGdW5jdGlvbilGaWxlX0dldFZSZWZOdW0sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZpbGVSZWZOdW0pIC0+IChzaG9ydCB2UmVmTnVtKSIpfSwKLQl7IkhHZXRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9IR2V0Vm9sLCAxLAotCSBQeURvY19TVFIoIihTdHJpbmdQdHIgdm9sTmFtZSkgLT4gKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQpIil9LAotCXsiSE9wZW4iLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVmTnVtKSIpfSwKLQl7IkhPcGVuREYiLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlbkRGLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAotCXsiSE9wZW5SRiIsIChQeUNGdW5jdGlvbilGaWxlX0hPcGVuUkYsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCi0JeyJBbGxvY0NvbnRpZyIsIChQeUNGdW5jdGlvbilGaWxlX0FsbG9jQ29udGlnLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGNvdW50KSIpfSwKLQl7IkhDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IQ3JlYXRlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUpIC0+IE5vbmUiKX0sCi0JeyJEaXJDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9EaXJDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgcGFyZW50RGlySUQsIFN0cjI1NSBkaXJlY3RvcnlOYW1lKSAtPiAobG9uZyBjcmVhdGVkRGlySUQpIil9LAotCXsiSERlbGV0ZSIsIChQeUNGdW5jdGlvbilGaWxlX0hEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IkhHZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGaWxlX0hHZXRGSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiAoRkluZm8gZm5kckluZm8pIil9LAotCXsiSFNldEZJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldEZJbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIEZJbmZvIGZuZHJJbmZvKSAtPiBOb25lIil9LAotCXsiSFNldEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldEZMb2NrLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCi0JeyJIUnN0RkxvY2siLCAoUHlDRnVuY3Rpb24pRmlsZV9IUnN0RkxvY2ssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IkhSZW5hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IUmVuYW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgb2xkTmFtZSwgU3RyMjU1IG5ld05hbWUpIC0+IE5vbmUiKX0sCi0JeyJDYXRNb3ZlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfQ2F0TW92ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IG9sZE5hbWUsIGxvbmcgbmV3RGlySUQsIFN0cjI1NSBuZXdOYW1lKSAtPiBOb25lIil9LAotCXsiRlNNYWtlRlNTcGVjIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNNYWtlRlNTcGVjLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IChGU1NwZWMgc3BlYykiKX0sCisgICAgeyJVbm1vdW50Vm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfVW5tb3VudFZvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyNjMgdm9sTmFtZSwgc2hvcnQgdlJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkZsdXNoVm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRmx1c2hWb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjYzIHZvbE5hbWUsIHNob3J0IHZSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJIU2V0Vm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldFZvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyNjMgdm9sTmFtZSwgc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkZTQ2xvc2UiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0Nsb3NlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJBbGxvY2F0ZSIsIChQeUNGdW5jdGlvbilGaWxlX0FsbG9jYXRlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGNvdW50KSIpfSwKKyAgICB7IkdldEVPRiIsIChQeUNGdW5jdGlvbilGaWxlX0dldEVPRiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBsb2dFT0YpIil9LAorICAgIHsiU2V0RU9GIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfU2V0RU9GLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIGxvbmcgbG9nRU9GKSAtPiBOb25lIil9LAorICAgIHsiR2V0RlBvcyIsIChQeUNGdW5jdGlvbilGaWxlX0dldEZQb3MsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gKGxvbmcgZmlsZVBvcykiKX0sCisgICAgeyJTZXRGUG9zIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfU2V0RlBvcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtLCBzaG9ydCBwb3NNb2RlLCBsb25nIHBvc09mZikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFZSZWZOdW0iLCAoUHlDRnVuY3Rpb24pRmlsZV9HZXRWUmVmTnVtLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmaWxlUmVmTnVtKSAtPiAoc2hvcnQgdlJlZk51bSkiKX0sCisgICAgeyJIR2V0Vm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSEdldFZvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyaW5nUHRyIHZvbE5hbWUpIC0+IChzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSIpfSwKKyAgICB7IkhPcGVuIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSE9wZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCisgICAgeyJIT3BlbkRGIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSE9wZW5ERiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVmTnVtKSIpfSwKKyAgICB7IkhPcGVuUkYiLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlblJGLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAorICAgIHsiQWxsb2NDb250aWciLCAoUHlDRnVuY3Rpb24pRmlsZV9BbGxvY0NvbnRpZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBjb3VudCkiKX0sCisgICAgeyJIQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSENyZWF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGZpbGVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiRGlyQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRGlyQ3JlYXRlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIHBhcmVudERpcklELCBTdHIyNTUgZGlyZWN0b3J5TmFtZSkgLT4gKGxvbmcgY3JlYXRlZERpcklEKSIpfSwKKyAgICB7IkhEZWxldGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IRGVsZXRlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJIR2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRmlsZV9IR2V0RkluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gKEZJbmZvIGZuZHJJbmZvKSIpfSwKKyAgICB7IkhTZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGaWxlX0hTZXRGSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBGSW5mbyBmbmRySW5mbykgLT4gTm9uZSIpfSwKKyAgICB7IkhTZXRGTG9jayIsIChQeUNGdW5jdGlvbilGaWxlX0hTZXRGTG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiBOb25lIil9LAorICAgIHsiSFJzdEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFJzdEZMb2NrLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJIUmVuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFJlbmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IG9sZE5hbWUsIFN0cjI1NSBuZXdOYW1lKSAtPiBOb25lIil9LAorICAgIHsiQ2F0TW92ZSIsIChQeUNGdW5jdGlvbilGaWxlX0NhdE1vdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBvbGROYW1lLCBsb25nIG5ld0RpcklELCBTdHIyNTUgbmV3TmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTTWFrZUZTU3BlYyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTTWFrZUZTU3BlYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiAoRlNTcGVjIHNwZWMpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyovCi0JeyJGU0dldEZvcmtQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilGaWxlX0ZTR2V0Rm9ya1Bvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gKFNJbnQ2NCBwb3NpdGlvbikiKX0sCi0JeyJGU1NldEZvcmtQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilGaWxlX0ZTU2V0Rm9ya1Bvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSwgVUludDE2IHBvc2l0aW9uTW9kZSwgU0ludDY0IHBvc2l0aW9uT2Zmc2V0KSAtPiBOb25lIil9LAotCXsiRlNHZXRGb3JrU2l6ZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTR2V0Rm9ya1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiAoU0ludDY0IGZvcmtTaXplKSIpfSwKLQl7IkZTU2V0Rm9ya1NpemUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1NldEZvcmtTaXplLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSwgVUludDE2IHBvc2l0aW9uTW9kZSwgU0ludDY0IHBvc2l0aW9uT2Zmc2V0KSAtPiBOb25lIil9LAotCXsiRlNBbGxvY2F0ZUZvcmsiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0FsbG9jYXRlRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0sIEZTQWxsb2NhdGlvbkZsYWdzIGZsYWdzLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQsIFVJbnQ2NCByZXF1ZXN0Q291bnQpIC0+IChVSW50NjQgYWN0dWFsQ291bnQpIil9LAotCXsiRlNGbHVzaEZvcmsiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0ZsdXNoRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJGU0Nsb3NlRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQ2xvc2VGb3JrLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkZTR2V0RGF0YUZvcmtOYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXREYXRhRm9ya05hbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhGU1VuaVN0cjI1NSBkYXRhRm9ya05hbWUpIil9LAotCXsiRlNHZXRSZXNvdXJjZUZvcmtOYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRSZXNvdXJjZUZvcmtOYW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIRlNVbmlTdHIyNTUgcmVzb3VyY2VGb3JrTmFtZSkiKX0sCi0JeyJGU1BhdGhNYWtlUmVmIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNQYXRoTWFrZVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDggKiBwYXRoKSAtPiAoRlNSZWYgcmVmLCBCb29sZWFuIGlzRGlyZWN0b3J5KSIpfSwKLQl7IkZOTm90aWZ5QnlQYXRoIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRk5Ob3RpZnlCeVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4ICogcGF0aCwgRk5NZXNzYWdlIG1lc3NhZ2UsIE9wdGlvbkJpdHMgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJGTk5vdGlmeUFsbCIsIChQeUNGdW5jdGlvbilGaWxlX0ZOTm90aWZ5QWxsLCAxLAotCSBQeURvY19TVFIoIihGTk1lc3NhZ2UgbWVzc2FnZSwgT3B0aW9uQml0cyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkZTR2V0Rm9ya1Bvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRGb3JrUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiAoU0ludDY0IHBvc2l0aW9uKSIpfSwKKyAgICB7IkZTU2V0Rm9ya1Bvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNTZXRGb3JrUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJGU0dldEZvcmtTaXplIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRGb3JrU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0pIC0+IChTSW50NjQgZm9ya1NpemUpIil9LAorICAgIHsiRlNTZXRGb3JrU2l6ZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTU2V0Rm9ya1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJGU0FsbG9jYXRlRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQWxsb2NhdGVGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSwgRlNBbGxvY2F0aW9uRmxhZ3MgZmxhZ3MsIFVJbnQxNiBwb3NpdGlvbk1vZGUsIFNJbnQ2NCBwb3NpdGlvbk9mZnNldCwgVUludDY0IHJlcXVlc3RDb3VudCkgLT4gKFVJbnQ2NCBhY3R1YWxDb3VudCkiKX0sCisgICAgeyJGU0ZsdXNoRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTRmx1c2hGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTQ2xvc2VGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNDbG9zZUZvcmssIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiRlNHZXREYXRhRm9ya05hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0dldERhdGFGb3JrTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSEZTVW5pU3RyMjU1IGRhdGFGb3JrTmFtZSkiKX0sCisgICAgeyJGU0dldFJlc291cmNlRm9ya05hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0dldFJlc291cmNlRm9ya05hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhGU1VuaVN0cjI1NSByZXNvdXJjZUZvcmtOYW1lKSIpfSwKKyAgICB7IkZTUGF0aE1ha2VSZWYiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1BhdGhNYWtlUmVmLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCAqIHBhdGgpIC0+IChGU1JlZiByZWYsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIil9LAorICAgIHsiRk5Ob3RpZnlCeVBhdGgiLCAoUHlDRnVuY3Rpb24pRmlsZV9GTk5vdGlmeUJ5UGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDggKiBwYXRoLCBGTk1lc3NhZ2UgbWVzc2FnZSwgT3B0aW9uQml0cyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkZOTm90aWZ5QWxsIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRk5Ob3RpZnlBbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKEZOTWVzc2FnZSBtZXNzYWdlLCBPcHRpb25CaXRzIGZsYWdzKSAtPiBOb25lIil9LAogI2lmbmRlZiAgX19MUDY0X18KLQl7Ik5ld0FsaWFzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfTmV3QWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgRlNTcGVjIHRhcmdldCkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKLQl7Ik5ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aCIsIChQeUNGdW5jdGlvbilGaWxlX05ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGZ1bGxQYXRoLCBTdHIzMiB6b25lTmFtZSwgU3RyMzEgc2VydmVyTmFtZSkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKLQl7IlJlc29sdmVBbGlhc0ZpbGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9SZXNvbHZlQWxpYXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMpIC0+IChGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IlJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncyIsIChQeUNGdW5jdGlvbilGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zLCB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3MpIC0+IChGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IlVwZGF0ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfVXBkYXRlQWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgRlNTcGVjIHRhcmdldCwgQWxpYXNIYW5kbGUgYWxpYXMpIC0+IChCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzTm9VSSIsIChQeUNGdW5jdGlvbilGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUksIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucywgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXIsIEJvb2xlYW4gd2FzQWxpYXNlZCkiKX0sCisgICAgeyJOZXdBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX05ld0FsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEZTU3BlYyB0YXJnZXQpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCisgICAgeyJOZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgiLCAoUHlDRnVuY3Rpb24pRmlsZV9OZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBmdWxsUGF0aCwgU3RyMzIgem9uZU5hbWUsIFN0cjMxIHNlcnZlck5hbWUpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCisgICAgeyJSZXNvbHZlQWxpYXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfUmVzb2x2ZUFsaWFzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zKSAtPiAoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXIsIEJvb2xlYW4gd2FzQWxpYXNlZCkiKX0sCisgICAgeyJSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pRmlsZV9SZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucywgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXIsIEJvb2xlYW4gd2FzQWxpYXNlZCkiKX0sCisgICAgeyJVcGRhdGVBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX1VwZGF0ZUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUsIEZTU3BlYyB0YXJnZXQsIEFsaWFzSGFuZGxlIGFsaWFzKSAtPiAoQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7IlJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUkiLCAoUHlDRnVuY3Rpb24pRmlsZV9SZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3NOb1VJLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHRhcmdldElzRm9sZGVyLCBCb29sZWFuIHdhc0FsaWFzZWQpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXsiRlNOZXdBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTTmV3QWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQpIC0+IChBbGlhc0hhbmRsZSBpbkFsaWFzKSIpfSwKLQl7IkZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IkZTUmVzb2x2ZUFsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTUmVzb2x2ZUFsaWFzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKLQl7IkZTVXBkYXRlQWxpYXMiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1VwZGF0ZUFsaWFzLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSwgRlNSZWYgdGFyZ2V0LCBBbGlhc0hhbmRsZSBhbGlhcykgLT4gKEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCi0JeyJwYXRobmFtZSIsIChQeUNGdW5jdGlvbilGaWxlX3BhdGhuYW1lLCAxLAotCSBQeURvY19TVFIoIihzdHJ8dW5pY29kZXxGU1NwZWN8RlNyZWYpIC0+IHBhdGhuYW1lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiRlNOZXdBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTTmV3QWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQpIC0+IChBbGlhc0hhbmRsZSBpbkFsaWFzKSIpfSwKKyAgICB7IkZTUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKKyAgICB7IkZTUmVzb2x2ZUFsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTUmVzb2x2ZUFsaWFzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucykgLT4gKEZTUmVmIHRoZVJlZiwgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKKyAgICB7IkZTVXBkYXRlQWxpYXMiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1VwZGF0ZUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSwgRlNSZWYgdGFyZ2V0LCBBbGlhc0hhbmRsZSBhbGlhcykgLT4gKEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCisgICAgeyJwYXRobmFtZSIsIChQeUNGdW5jdGlvbilGaWxlX3BhdGhuYW1lLCAxLAorICAgICBQeURvY19TVFIoIihzdHJ8dW5pY29kZXxGU1NwZWN8RlNyZWYpIC0+IHBhdGhuYW1lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0zMjUxLDE1OSArMzI1MSwxNTkgQEAKIGludAogUHlNYWNfR2V0RlNTcGVjKFB5T2JqZWN0ICp2LCBGU1NwZWMgKnNwZWMpCiB7Ci0gICAgICAgIFN0cjI1NSBwYXRoOwotICAgICAgICBzaG9ydCByZWZudW07Ci0gICAgICAgIGxvbmcgcGFyaWQ7Ci0gICAgICAgIE9TRXJyIGVycjsKLSAgICAgICAgRlNSZWYgZnNyOworICAgIFN0cjI1NSBwYXRoOworICAgIHNob3J0IHJlZm51bTsKKyAgICBsb25nIHBhcmlkOworICAgIE9TRXJyIGVycjsKKyAgICBGU1JlZiBmc3I7CiAKLSAgICAgICAgaWYgKEZTU3BlY19DaGVjayh2KSkgewotICAgICAgICAgICAgICAgICpzcGVjID0gKChGU1NwZWNPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9CisgICAgaWYgKEZTU3BlY19DaGVjayh2KSkgeworICAgICAgICAqc3BlYyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogCi0gICAgICAgIGlmIChQeUFyZ19QYXJzZSh2LCAiKGhsTyYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZudW0sICZwYXJpZCwgUHlNYWNfR2V0U3RyMjU1LCAmcGF0aCkpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBGU01ha2VGU1NwZWMocmVmbnVtLCBwYXJpZCwgcGF0aCwgc3BlYyk7Ci0gICAgICAgICAgICAgICAgaWYgKCBlcnIgJiYgZXJyICE9IGZuZkVyciApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKFB5QXJnX1BhcnNlKHYsICIoaGxPJikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmbnVtLCAmcGFyaWQsIFB5TWFjX0dldFN0cjI1NSwgJnBhdGgpKSB7CisgICAgICAgIGVyciA9IEZTTWFrZUZTU3BlYyhyZWZudW0sIHBhcmlkLCBwYXRoLCBzcGVjKTsKKyAgICAgICAgaWYgKCBlcnIgJiYgZXJyICE9IGZuZkVyciApIHsKKyAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAvKiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGdvIHZpYSBhbiBGU1JlZi4gT24gT1NYIHdlIGdvIGFsbCB0aGUgd2F5LAotICAgICAgICAqKiBvbiBPUzkgd2UgYWNjZXB0IG9ubHkgYSByZWFsIEZTUmVmIG9iamVjdAotICAgICAgICAqLwotICAgICAgICBpZiAoIFB5TWFjX0dldEZTUmVmKHYsICZmc3IpICkgewotICAgICAgICAgICAgICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJmZzciwga0ZTQ2F0SW5mb05vbmUsIE5VTEwsIE5VTEwsIHNwZWMsIE5VTEwpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIC8qIE90aGVyd2lzZSB3ZSB0cnkgdG8gZ28gdmlhIGFuIEZTUmVmLiBPbiBPU1ggd2UgZ28gYWxsIHRoZSB3YXksCisgICAgKiogb24gT1M5IHdlIGFjY2VwdCBvbmx5IGEgcmVhbCBGU1JlZiBvYmplY3QKKyAgICAqLworICAgIGlmICggUHlNYWNfR2V0RlNSZWYodiwgJmZzcikgKSB7CisgICAgICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJmZzciwga0ZTQ2F0SW5mb05vbmUsIE5VTEwsIE5VTEwsIHNwZWMsIE5VTEwpOworICAgICAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogaW50CiBQeU1hY19HZXRGU1JlZihQeU9iamVjdCAqdiwgRlNSZWYgKmZzcikKIHsKLSAgICAgICAgT1NTdGF0dXMgZXJyOworICAgIE9TU3RhdHVzIGVycjsKICNpZm5kZWYgX19MUDY0X18KLSAgICAgICAgRlNTcGVjIGZzczsKKyAgICBGU1NwZWMgZnNzOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0gICAgICAgIGlmIChGU1JlZl9DaGVjayh2KSkgewotICAgICAgICAgICAgICAgICpmc3IgPSAoKEZTUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQorICAgIGlmIChGU1JlZl9DaGVjayh2KSkgeworICAgICAgICAqZnNyID0gKChGU1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAotICAgICAgICAvKiBPbiBPU1ggd2Ugbm93IHRyeSBhIHBhdGhuYW1lICovCi0gICAgICAgIGlmICggUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqcGF0aCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiZXQiLCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBpZiAoIChlcnI9RlNQYXRoTWFrZVJlZigodW5zaWduZWQgY2hhciopcGF0aCwgZnNyLCBOVUxMKSkgKQotICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKLSAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKHBhdGgpOwotICAgICAgICAgICAgICAgIHJldHVybiAhZXJyOwotICAgICAgICB9Ci0gICAgICAgIC8qIFhYWFggU2hvdWxkIHRyeSB1bmljb2RlIGhlcmUgdG9vICovCisgICAgLyogT24gT1NYIHdlIG5vdyB0cnkgYSBwYXRobmFtZSAqLworICAgIGlmICggUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIGNoYXIgKnBhdGggPSBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJldCIsIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIChlcnI9RlNQYXRoTWFrZVJlZigodW5zaWduZWQgY2hhciopcGF0aCwgZnNyLCBOVUxMKSkgKQorICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgUHlNZW1fRnJlZShwYXRoKTsKKyAgICAgICAgcmV0dXJuICFlcnI7CisgICAgfQorICAgIC8qIFhYWFggU2hvdWxkIHRyeSB1bmljb2RlIGhlcmUgdG9vICovCiAKICNpZm5kZWYgX19MUDY0X18KLSAgICAgICAgLyogT3RoZXJ3aXNlIHdlIHRyeSB0byBnbyB2aWEgYW4gRlNTcGVjICovCi0gICAgICAgIGlmIChGU1NwZWNfQ2hlY2sodikpIHsKLSAgICAgICAgICAgICAgICBmc3MgPSAoKEZTU3BlY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0gICAgICAgICAgICAgICAgaWYgKChlcnI9RlNwTWFrZUZTUmVmKCZmc3MsIGZzcikpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0jZW5kaWYgLyogIV9fTFA2NF9fICovCi0KLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmLCBGU1NwZWMgb3IgcGF0aG5hbWUgcmVxdWlyZWQiKTsKKyAgICAvKiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGdvIHZpYSBhbiBGU1NwZWMgKi8KKyAgICBpZiAoRlNTcGVjX0NoZWNrKHYpKSB7CisgICAgICAgIGZzcyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgaWYgKChlcnI9RlNwTWFrZUZTUmVmKCZmc3MsIGZzcikpID09IDApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmLCBGU1NwZWMgb3IgcGF0aG5hbWUgcmVxdWlyZWQiKTsKKyAgICByZXR1cm4gMDsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogZXh0ZXJuIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkRlNTcGVjKEZTU3BlYyAqc3BlYykKIHsKLSAgICAgICAgcmV0dXJuIEZTU3BlY19OZXcoc3BlYyk7CisgICAgcmV0dXJuIEZTU3BlY19OZXcoc3BlYyk7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIGV4dGVybiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZEZTUmVmKEZTUmVmICpzcGVjKQogewotICAgICAgICByZXR1cm4gRlNSZWZfTmV3KHNwZWMpOworICAgIHJldHVybiBGU1JlZl9OZXcoc3BlYyk7CiB9CiAKIAogdm9pZCBpbml0X0ZpbGUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRlNTcGVjICosIFB5TWFjX0J1aWxkRlNTcGVjKTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRlNTcGVjLCBQeU1hY19HZXRGU1NwZWMpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEZTU3BlYyAqLCBQeU1hY19CdWlsZEZTU3BlYyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEZTU3BlYywgUHlNYWNfR2V0RlNTcGVjKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEZTUmVmICosIFB5TWFjX0J1aWxkRlNSZWYpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChGU1JlZiwgUHlNYWNfR2V0RlNSZWYpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEZTUmVmICosIFB5TWFjX0J1aWxkRlNSZWYpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChGU1JlZiwgUHlNYWNfR2V0RlNSZWYpOwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0ZpbGUiLCBGaWxlX21ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUZpbGVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChGaWxlX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRmlsZV9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUZTQ2F0YWxvZ0luZm9fVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkZTQ2F0YWxvZ0luZm9fVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZGU0NhdGFsb2dJbmZvX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNDYXRhbG9nSW5mbyIsIChQeU9iamVjdCAqKSZGU0NhdGFsb2dJbmZvX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRlNDYXRhbG9nSW5mb19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTQ2F0YWxvZ0luZm9UeXBlIiwgKFB5T2JqZWN0ICopJkZTQ2F0YWxvZ0luZm9fVHlwZSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9GaWxlIiwgRmlsZV9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBGaWxlX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoRmlsZV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEZpbGVfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBGU0NhdGFsb2dJbmZvX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGU0NhdGFsb2dJbmZvX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRlNDYXRhbG9nSW5mb19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTQ2F0YWxvZ0luZm8iLCAoUHlPYmplY3QgKikmRlNDYXRhbG9nSW5mb19UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkZTQ2F0YWxvZ0luZm9fVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU0NhdGFsb2dJbmZvVHlwZSIsIChQeU9iamVjdCAqKSZGU0NhdGFsb2dJbmZvX1R5cGUpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JRkluZm9fVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkZJbmZvX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRkluZm9fVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGSW5mbyIsIChQeU9iamVjdCAqKSZGSW5mb19UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkZJbmZvX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkluZm9UeXBlIiwgKFB5T2JqZWN0ICopJkZJbmZvX1R5cGUpOworICAgIEZJbmZvX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGSW5mb19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkZJbmZvX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkluZm8iLCAoUHlPYmplY3QgKikmRkluZm9fVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZGSW5mb19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZJbmZvVHlwZSIsIChQeU9iamVjdCAqKSZGSW5mb19UeXBlKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQlBbGlhc19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQWxpYXNfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZBbGlhc19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFsaWFzIiwgKFB5T2JqZWN0ICopJkFsaWFzX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQWxpYXNfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBbGlhc1R5cGUiLCAoUHlPYmplY3QgKikmQWxpYXNfVHlwZSk7CisgICAgQWxpYXNfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkFsaWFzX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQWxpYXNfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBbGlhcyIsIChQeU9iamVjdCAqKSZBbGlhc19UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkFsaWFzX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQWxpYXNUeXBlIiwgKFB5T2JqZWN0ICopJkFsaWFzX1R5cGUpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JRlNTcGVjX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZGU1NwZWNfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZGU1NwZWNfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1NwZWMiLCAoUHlPYmplY3QgKikmRlNTcGVjX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRlNTcGVjX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNTcGVjVHlwZSIsIChQeU9iamVjdCAqKSZGU1NwZWNfVHlwZSk7CisgICAgRlNTcGVjX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGU1NwZWNfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZGU1NwZWNfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1NwZWMiLCAoUHlPYmplY3QgKikmRlNTcGVjX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRlNTcGVjX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNTcGVjVHlwZSIsIChQeU9iamVjdCAqKSZGU1NwZWNfVHlwZSk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JRlNSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkZTUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRlNSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1JlZiIsIChQeU9iamVjdCAqKSZGU1JlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkZTUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkZTUmVmX1R5cGUpOworICAgIEZTUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZGU1JlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkZTUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNSZWYiLCAoUHlPYmplY3QgKikmRlNSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZGU1JlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTUmVmVHlwZSIsIChQeU9iamVjdCAqKSZGU1JlZl9UeXBlKTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09IEVuZCBtb2R1bGUgX0ZpbGUgPT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9mbS9fRm1tb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jCmluZGV4IGI5ODJjYzMuLmFkYzQ3YWEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yNiwxMiArMjYsMTIgQEAKIEZNUmVjX05ldyhGTWV0cmljUmVjICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mTyZPJk8mTyYiLAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+YXNjZW50LAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+ZGVzY2VudCwKLSAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPmxlYWRpbmcsCi0gICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT53aWRNYXgsCi0gICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaXRzZWxmLT53VGFiSGFuZGxlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZPJk8mTyZPJiIsCisgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+YXNjZW50LAorICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPmRlc2NlbnQsCisgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+bGVhZGluZywKKyAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT53aWRNYXgsCisgICAgICAgIFJlc09ial9OZXcsIGl0c2VsZi0+d1RhYkhhbmRsZSk7CiB9CiAKICNpZiAwCkBAIC0zOSwxMiArMzksMTIgQEAKIHN0YXRpYyBpbnQKIEZNUmVjX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZNZXRyaWNSZWMgKnBfaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mTyZPJiIsCi0gICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPmFzY2VudCwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+ZGVzY2VudCwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+bGVhZGluZywKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+d2lkTWF4LAotICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRzZWxmLT53VGFiSGFuZGxlKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mTyZPJiIsCisgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5hc2NlbnQsCisgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5kZXNjZW50LAorICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+bGVhZGluZywKKyAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPndpZE1heCwKKyAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdHNlbGYtPndUYWJIYW5kbGUpOwogfQogI2VuZGlmCiAKQEAgLTUzLDMxNCArNTMsMzE0IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0Rm9udE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGZhbWlseUlEOwotCVN0cjI1NSBuYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBmYW1pbHlJRDsKKyAgICBTdHIyNTUgbmFtZTsKICNpZm5kZWYgR2V0Rm9udE5hbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRGb250TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rm9udE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYW1pbHlJRCkpCi0JCXJldHVybiBOVUxMOwotCUdldEZvbnROYW1lKGZhbWlseUlELAotCSAgICAgICAgICAgIG5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIG5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFtaWx5SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRGb250TmFtZShmYW1pbHlJRCwKKyAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9HZXRGTnVtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgbmFtZTsKLQlzaG9ydCBmYW1pbHlJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IG5hbWU7CisgICAgc2hvcnQgZmFtaWx5SUQ7CiAjaWZuZGVmIEdldEZOdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRGTnVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGTnVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0Rk51bShuYW1lLAotCSAgICAgICAgJmZhbWlseUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgZmFtaWx5SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0Rk51bShuYW1lLAorICAgICAgICAmZmFtaWx5SUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHlJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fUmVhbEZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCXNob3J0IGZvbnROdW07Ci0Jc2hvcnQgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgc2hvcnQgZm9udE51bTsKKyAgICBzaG9ydCBzaXplOwogI2lmbmRlZiBSZWFsRm9udAotCVB5TWFjX1BSRUNIRUNLKFJlYWxGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWFsRm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlYWxGb250KGZvbnROdW0sCi0JICAgICAgICAgICAgICAgc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWFsRm9udChmb250TnVtLAorICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX1NldEZTY2FsZURpc2FibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZnNjYWxlRGlzYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBmc2NhbGVEaXNhYmxlOwogI2lmbmRlZiBTZXRGU2NhbGVEaXNhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RlNjYWxlRGlzYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RlNjYWxlRGlzYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZzY2FsZURpc2FibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRGU2NhbGVEaXNhYmxlKGZzY2FsZURpc2FibGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzY2FsZURpc2FibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRGU2NhbGVEaXNhYmxlKGZzY2FsZURpc2FibGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9Gb250TWV0cmljcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRk1ldHJpY1JlYyB0aGVNZXRyaWNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGTWV0cmljUmVjIHRoZU1ldHJpY3M7CiAjaWZuZGVmIEZvbnRNZXRyaWNzCi0JUHlNYWNfUFJFQ0hFQ0soRm9udE1ldHJpY3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEZvbnRNZXRyaWNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlGb250TWV0cmljcygmdGhlTWV0cmljcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGTVJlY19OZXcsICZ0aGVNZXRyaWNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRm9udE1ldHJpY3MoJnRoZU1ldHJpY3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRk1SZWNfTmV3LCAmdGhlTWV0cmljcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fU2V0RnJhY3RFbmFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZnJhY3RFbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gZnJhY3RFbmFibGU7CiAjaWZuZGVmIFNldEZyYWN0RW5hYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RnJhY3RFbmFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEZyYWN0RW5hYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJhY3RFbmFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRGcmFjdEVuYWJsZShmcmFjdEVuYWJsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhY3RFbmFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRGcmFjdEVuYWJsZShmcmFjdEVuYWJsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0dldERlZkZvbnRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0RGVmRm9udFNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXREZWZGb250U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGVmRm9udFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldERlZkZvbnRTaXplKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERlZkZvbnRTaXplKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fSXNPdXRsaW5lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBudW1lcjsKLQlQb2ludCBkZW5vbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgbnVtZXI7CisgICAgUG9pbnQgZGVub207CiAjaWZuZGVmIElzT3V0bGluZQotCVB5TWFjX1BSRUNIRUNLKElzT3V0bGluZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNPdXRsaW5lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm51bWVyLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRlbm9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNPdXRsaW5lKG51bWVyLAotCSAgICAgICAgICAgICAgICBkZW5vbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbnVtZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmZGVub20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc091dGxpbmUobnVtZXIsCisgICAgICAgICAgICAgICAgICAgIGRlbm9tKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9TZXRPdXRsaW5lUHJlZmVycmVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIG91dGxpbmVQcmVmZXJyZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gb3V0bGluZVByZWZlcnJlZDsKICNpZm5kZWYgU2V0T3V0bGluZVByZWZlcnJlZAotCVB5TWFjX1BSRUNIRUNLKFNldE91dGxpbmVQcmVmZXJyZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE91dGxpbmVQcmVmZXJyZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdXRsaW5lUHJlZmVycmVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0T3V0bGluZVByZWZlcnJlZChvdXRsaW5lUHJlZmVycmVkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRsaW5lUHJlZmVycmVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0T3V0bGluZVByZWZlcnJlZChvdXRsaW5lUHJlZmVycmVkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0T3V0bGluZVByZWZlcnJlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBHZXRPdXRsaW5lUHJlZmVycmVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0T3V0bGluZVByZWZlcnJlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0T3V0bGluZVByZWZlcnJlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0T3V0bGluZVByZWZlcnJlZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRPdXRsaW5lUHJlZmVycmVkKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fU2V0UHJlc2VydmVHbHlwaChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBwcmVzZXJ2ZUdseXBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIHByZXNlcnZlR2x5cGg7CiAjaWZuZGVmIFNldFByZXNlcnZlR2x5cGgKLQlQeU1hY19QUkVDSEVDSyhTZXRQcmVzZXJ2ZUdseXBoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQcmVzZXJ2ZUdseXBoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlc2VydmVHbHlwaCkpCi0JCXJldHVybiBOVUxMOwotCVNldFByZXNlcnZlR2x5cGgocHJlc2VydmVHbHlwaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc2VydmVHbHlwaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFByZXNlcnZlR2x5cGgocHJlc2VydmVHbHlwaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0dldFByZXNlcnZlR2x5cGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgR2V0UHJlc2VydmVHbHlwaAotCVB5TWFjX1BSRUNIRUNLKEdldFByZXNlcnZlR2x5cGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFByZXNlcnZlR2x5cGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFByZXNlcnZlR2x5cGgoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UHJlc2VydmVHbHlwaCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0dldFN5c0ZvbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRTeXNGb250Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0U3lzRm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0U3lzRm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0U3lzRm9udCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRTeXNGb250KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0QXBwRm9udChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldEFwcEZvbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRBcHBGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRBcHBGb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRBcHBGb250KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEFwcEZvbnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9RRFRleHRCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKmluVGV4dF9faW5fXzsKLQlpbnQgaW5UZXh0X19sZW5fXzsKLQlpbnQgaW5UZXh0X19pbl9sZW5fXzsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqaW5UZXh0X19pbl9fOworICAgIGludCBpblRleHRfX2xlbl9fOworICAgIGludCBpblRleHRfX2luX2xlbl9fOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBRRFRleHRCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhRRFRleHRCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFEVGV4dEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRleHRfX2luX18sICZpblRleHRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5UZXh0X19sZW5fXyA9IGluVGV4dF9faW5fbGVuX187Ci0JUURUZXh0Qm91bmRzKGluVGV4dF9fbGVuX18sIGluVGV4dF9faW5fXywKLQkgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGV4dF9faW5fXywgJmluVGV4dF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpblRleHRfX2xlbl9fID0gaW5UZXh0X19pbl9sZW5fXzsKKyAgICBRRFRleHRCb3VuZHMoaW5UZXh0X19sZW5fXywgaW5UZXh0X19pbl9fLAorICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGbV9tZXRob2RzW10gPSB7Ci0JeyJHZXRGb250TmFtZSIsIChQeUNGdW5jdGlvbilGbV9HZXRGb250TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZmFtaWx5SUQpIC0+IChTdHIyNTUgbmFtZSkiKX0sCi0JeyJHZXRGTnVtIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEZOdW0sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBuYW1lKSAtPiAoc2hvcnQgZmFtaWx5SUQpIil9LAotCXsiUmVhbEZvbnQiLCAoUHlDRnVuY3Rpb24pRm1fUmVhbEZvbnQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZvbnROdW0sIHNob3J0IHNpemUpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRGU2NhbGVEaXNhYmxlIiwgKFB5Q0Z1bmN0aW9uKUZtX1NldEZTY2FsZURpc2FibGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZnNjYWxlRGlzYWJsZSkgLT4gTm9uZSIpfSwKLQl7IkZvbnRNZXRyaWNzIiwgKFB5Q0Z1bmN0aW9uKUZtX0ZvbnRNZXRyaWNzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGTWV0cmljUmVjIHRoZU1ldHJpY3MpIil9LAotCXsiU2V0RnJhY3RFbmFibGUiLCAoUHlDRnVuY3Rpb24pRm1fU2V0RnJhY3RFbmFibGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZnJhY3RFbmFibGUpIC0+IE5vbmUiKX0sCi0JeyJHZXREZWZGb250U2l6ZSIsIChQeUNGdW5jdGlvbilGbV9HZXREZWZGb250U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IklzT3V0bGluZSIsIChQeUNGdW5jdGlvbilGbV9Jc091dGxpbmUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IG51bWVyLCBQb2ludCBkZW5vbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE91dGxpbmVQcmVmZXJyZWQiLCAoUHlDRnVuY3Rpb24pRm1fU2V0T3V0bGluZVByZWZlcnJlZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBvdXRsaW5lUHJlZmVycmVkKSAtPiBOb25lIil9LAotCXsiR2V0T3V0bGluZVByZWZlcnJlZCIsIChQeUNGdW5jdGlvbilGbV9HZXRPdXRsaW5lUHJlZmVycmVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRQcmVzZXJ2ZUdseXBoIiwgKFB5Q0Z1bmN0aW9uKUZtX1NldFByZXNlcnZlR2x5cGgsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gcHJlc2VydmVHbHlwaCkgLT4gTm9uZSIpfSwKLQl7IkdldFByZXNlcnZlR2x5cGgiLCAoUHlDRnVuY3Rpb24pRm1fR2V0UHJlc2VydmVHbHlwaCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0U3lzRm9udCIsIChQeUNGdW5jdGlvbilGbV9HZXRTeXNGb250LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0QXBwRm9udCIsIChQeUNGdW5jdGlvbilGbV9HZXRBcHBGb250LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiUURUZXh0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUZtX1FEVGV4dEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGluVGV4dCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldEZvbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEZvbnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmYW1pbHlJRCkgLT4gKFN0cjI1NSBuYW1lKSIpfSwKKyAgICB7IkdldEZOdW0iLCAoUHlDRnVuY3Rpb24pRm1fR2V0Rk51bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IG5hbWUpIC0+IChzaG9ydCBmYW1pbHlJRCkiKX0sCisgICAgeyJSZWFsRm9udCIsIChQeUNGdW5jdGlvbilGbV9SZWFsRm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZm9udE51bSwgc2hvcnQgc2l6ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldEZTY2FsZURpc2FibGUiLCAoUHlDRnVuY3Rpb24pRm1fU2V0RlNjYWxlRGlzYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBmc2NhbGVEaXNhYmxlKSAtPiBOb25lIil9LAorICAgIHsiRm9udE1ldHJpY3MiLCAoUHlDRnVuY3Rpb24pRm1fRm9udE1ldHJpY3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZNZXRyaWNSZWMgdGhlTWV0cmljcykiKX0sCisgICAgeyJTZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilGbV9TZXRGcmFjdEVuYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBmcmFjdEVuYWJsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERlZkZvbnRTaXplIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldERlZkZvbnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiSXNPdXRsaW5lIiwgKFB5Q0Z1bmN0aW9uKUZtX0lzT3V0bGluZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgbnVtZXIsIFBvaW50IGRlbm9tKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0T3V0bGluZVByZWZlcnJlZCIsIChQeUNGdW5jdGlvbilGbV9TZXRPdXRsaW5lUHJlZmVycmVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIG91dGxpbmVQcmVmZXJyZWQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRPdXRsaW5lUHJlZmVycmVkIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldE91dGxpbmVQcmVmZXJyZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldFByZXNlcnZlR2x5cGgiLCAoUHlDRnVuY3Rpb24pRm1fU2V0UHJlc2VydmVHbHlwaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBwcmVzZXJ2ZUdseXBoKSAtPiBOb25lIil9LAorICAgIHsiR2V0UHJlc2VydmVHbHlwaCIsIChQeUNGdW5jdGlvbilGbV9HZXRQcmVzZXJ2ZUdseXBoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRTeXNGb250IiwgKFB5Q0Z1bmN0aW9uKUZtX0dldFN5c0ZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRBcHBGb250IiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEFwcEZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJRRFRleHRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pRm1fUURUZXh0Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgaW5UZXh0KSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2Vsc2UgIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGbV9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZW5kaWYgIC8qIF9fTFA2NF9fICovCiAKIHZvaWQgaW5pdF9GbSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmICAvKiBfX0xQNjRfXyAqLwogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9GbSIsIEZtX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRm0iLCBGbV9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlGbV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEZtX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRm1fRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBGbV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEZtX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRm1fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKICNlbmRpZiAgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZm9sZGVyL19Gb2xkZXJtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ZvbGRlci9fRm9sZGVybW9kdWxlLmMKaW5kZXggMDM1ZGFiOC4uMTA1OTdmNSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZm9sZGVyL19Gb2xkZXJtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9mb2xkZXIvX0ZvbGRlcm1vZHVsZS5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMjIsMzAxICsyMiwzMDEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfRmluZEZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCU9TVHlwZSBmb2xkZXJUeXBlOwotCUJvb2xlYW4gY3JlYXRlRm9sZGVyOwotCUZTVm9sdW1lUmVmTnVtICBmb3VuZFZSZWZOdW07Ci0JU0ludDMyIGZvdW5kRGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkZXJUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlRm9sZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZpbmRGb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICBmb2xkZXJUeXBlLAotCSAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAmZm91bmRWUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICZmb3VuZERpcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgZm91bmRWUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIGZvdW5kRGlySUQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgT1NUeXBlIGZvbGRlclR5cGU7CisgICAgQm9vbGVhbiBjcmVhdGVGb2xkZXI7CisgICAgRlNWb2x1bWVSZWZOdW0gIGZvdW5kVlJlZk51bTsKKyAgICBTSW50MzIgZm91bmREaXJJRDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVGb2xkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmluZEZvbGRlcih2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgJmZvdW5kRGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmREaXJJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX1JlbGVhc2VGb2xkZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlPU1R5cGUgZm9sZGVyVHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZGVyVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWxlYXNlRm9sZGVyKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBPU1R5cGUgZm9sZGVyVHlwZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZGVyVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWxlYXNlRm9sZGVyKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0ZTRmluZEZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCU9TVHlwZSBmb2xkZXJUeXBlOwotCUJvb2xlYW4gY3JlYXRlRm9sZGVyOwotCUZTUmVmIGZvdW5kUmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZGVyVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZUZvbGRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0ZpbmRGb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgIGZvbGRlclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAmZm91bmRSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmZm91bmRSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgT1NUeXBlIGZvbGRlclR5cGU7CisgICAgQm9vbGVhbiBjcmVhdGVGb2xkZXI7CisgICAgRlNSZWYgZm91bmRSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlRm9sZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTRmluZEZvbGRlcih2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZmb3VuZFJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0FkZEZvbGRlckRlc2NyaXB0b3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRm9sZGVyVHlwZSBmb2xkVHlwZTsKLQlGb2xkZXJEZXNjRmxhZ3MgZmxhZ3M7Ci0JRm9sZGVyQ2xhc3MgZm9sZENsYXNzOwotCUZvbGRlckxvY2F0aW9uIGZvbGRMb2NhdGlvbjsKLQlPU1R5cGUgYmFkZ2VTaWduYXR1cmU7Ci0JT1NUeXBlIGJhZGdlVHlwZTsKLQlTdHIyNTUgbmFtZTsKLQlCb29sZWFuIHJlcGxhY2VGbGFnOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyZPJk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkTG9jYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmJhZGdlU2lnbmF0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZiYWRnZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlcGxhY2VGbGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZEZvbGRlckRlc2NyaXB0b3IoZm9sZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMb2NhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVNpZ25hdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmxhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRm9sZGVyVHlwZSBmb2xkVHlwZTsKKyAgICBGb2xkZXJEZXNjRmxhZ3MgZmxhZ3M7CisgICAgRm9sZGVyQ2xhc3MgZm9sZENsYXNzOworICAgIEZvbGRlckxvY2F0aW9uIGZvbGRMb2NhdGlvbjsKKyAgICBPU1R5cGUgYmFkZ2VTaWduYXR1cmU7CisgICAgT1NUeXBlIGJhZGdlVHlwZTsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBCb29sZWFuIHJlcGxhY2VGbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyZPJk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkTG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmJhZGdlU2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZiYWRnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGxhY2VGbGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZEZvbGRlckRlc2NyaXB0b3IoZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmxhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0dldEZvbGRlclR5cGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQ7Ci0JVUludDMyIHRvdGFsVHlwZUNvdW50OwotCUZvbGRlclR5cGUgdGhlVHlwZXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRUeXBlQ291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rm9sZGVyVHlwZXMocmVxdWVzdGVkVHlwZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmdG90YWxUeXBlQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVUeXBlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICB0b3RhbFR5cGVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQ7CisgICAgVUludDMyIHRvdGFsVHlwZUNvdW50OworICAgIEZvbGRlclR5cGUgdGhlVHlwZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRUeXBlQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rm9sZGVyVHlwZXMocmVxdWVzdGVkVHlwZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxUeXBlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVUeXBlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFR5cGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9SZW1vdmVGb2xkZXJEZXNjcmlwdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZvbGRlclR5cGUgZm9sZFR5cGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVGb2xkZXJEZXNjcmlwdG9yKGZvbGRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGb2xkZXJUeXBlIGZvbGRUeXBlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRm9sZGVyRGVzY3JpcHRvcihmb2xkVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0dldEZvbGRlck5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlPU1R5cGUgZm9sZFR5cGU7Ci0Jc2hvcnQgZm91bmRWUmVmTnVtOwotCVN0cjI1NSBuYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rm9sZGVyTmFtZSh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgIGZvbGRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICZmb3VuZFZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgZm91bmRWUmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIE9TVHlwZSBmb2xkVHlwZTsKKyAgICBzaG9ydCBmb3VuZFZSZWZOdW07CisgICAgU3RyMjU1IG5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRGb2xkZXJOYW1lKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmZvdW5kVlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFZSZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9BZGRGb2xkZXJSb3V0aW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlcjsKLQlGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXI7Ci0JUm91dGluZ0ZsYWdzIGZsYWdzOwotCUJvb2xlYW4gcmVwbGFjZUZsYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVGcm9tRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyb3V0ZVRvRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXBsYWNlRmxhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRGb2xkZXJSb3V0aW5nKGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlRnJvbUZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVRvRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VGbGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7CisgICAgRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyOworICAgIFJvdXRpbmdGbGFncyBmbGFnczsKKyAgICBCb29sZWFuIHJlcGxhY2VGbGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlRnJvbUZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVUb0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbGFjZUZsYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUZyb21Gb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVUb0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmxhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX1JlbW92ZUZvbGRlclJvdXRpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCUZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVGcm9tRm9sZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUZvbGRlclJvdXRpbmcoZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVGcm9tRm9sZGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyb3V0ZUZyb21Gb2xkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUZyb21Gb2xkZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9GaW5kRm9sZGVyUm91dGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7Ci0JRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyOwotCVJvdXRpbmdGbGFncyBmbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlRnJvbUZvbGRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGaW5kRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVGcm9tRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcm91dGVUb0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCByb3V0ZVRvRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7CisgICAgRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyOworICAgIFJvdXRpbmdGbGFncyBmbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlRnJvbUZvbGRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGaW5kRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVGcm9tRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcm91dGVUb0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCByb3V0ZVRvRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfSW52YWxpZGF0ZUZvbGRlckRlc2NyaXB0b3JDYWNoZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsaWRhdGVGb2xkZXJEZXNjcmlwdG9yQ2FjaGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9JZGVudGlmeUZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JRm9sZGVyVHlwZSBmb2xkVHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWRlbnRpZnlGb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb2xkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmb2xkVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIEZvbGRlclR5cGUgZm9sZFR5cGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElkZW50aWZ5Rm9sZGVyKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9sZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZm9sZFR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRm9sZGVyX21ldGhvZHNbXSA9IHsKLQl7IkZpbmRGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZpbmRGb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKHNob3J0IGZvdW5kVlJlZk51bSwgbG9uZyBmb3VuZERpcklEKSIpfSwKLQl7IlJlbGVhc2VGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX1JlbGVhc2VGb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlKSAtPiBOb25lIil9LAotCXsiRlNGaW5kRm9sZGVyIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9GU0ZpbmRGb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKEZTUmVmIGZvdW5kUmVmKSIpfSwKLQl7IkFkZEZvbGRlckRlc2NyaXB0b3IiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0FkZEZvbGRlckRlc2NyaXB0b3IsIDEsCi0JIFB5RG9jX1NUUigiKEZvbGRlclR5cGUgZm9sZFR5cGUsIEZvbGRlckRlc2NGbGFncyBmbGFncywgRm9sZGVyQ2xhc3MgZm9sZENsYXNzLCBGb2xkZXJMb2NhdGlvbiBmb2xkTG9jYXRpb24sIE9TVHlwZSBiYWRnZVNpZ25hdHVyZSwgT1NUeXBlIGJhZGdlVHlwZSwgU3RyMjU1IG5hbWUsIEJvb2xlYW4gcmVwbGFjZUZsYWcpIC0+IE5vbmUiKX0sCi0JeyJHZXRGb2xkZXJUeXBlcyIsIChQeUNGdW5jdGlvbilGb2xkZXJfR2V0Rm9sZGVyVHlwZXMsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQpIC0+IChVSW50MzIgdG90YWxUeXBlQ291bnQsIEZvbGRlclR5cGUgdGhlVHlwZXMpIil9LAotCXsiUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciIsIChQeUNGdW5jdGlvbilGb2xkZXJfUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciwgMSwKLQkgUHlEb2NfU1RSKCIoRm9sZGVyVHlwZSBmb2xkVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbmRGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZpbmRGb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKHNob3J0IGZvdW5kVlJlZk51bSwgbG9uZyBmb3VuZERpcklEKSIpfSwKKyAgICB7IlJlbGVhc2VGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX1JlbGVhc2VGb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlKSAtPiBOb25lIil9LAorICAgIHsiRlNGaW5kRm9sZGVyIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9GU0ZpbmRGb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkZXJUeXBlLCBCb29sZWFuIGNyZWF0ZUZvbGRlcikgLT4gKEZTUmVmIGZvdW5kUmVmKSIpfSwKKyAgICB7IkFkZEZvbGRlckRlc2NyaXB0b3IiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0FkZEZvbGRlckRlc2NyaXB0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEZvbGRlclR5cGUgZm9sZFR5cGUsIEZvbGRlckRlc2NGbGFncyBmbGFncywgRm9sZGVyQ2xhc3MgZm9sZENsYXNzLCBGb2xkZXJMb2NhdGlvbiBmb2xkTG9jYXRpb24sIE9TVHlwZSBiYWRnZVNpZ25hdHVyZSwgT1NUeXBlIGJhZGdlVHlwZSwgU3RyMjU1IG5hbWUsIEJvb2xlYW4gcmVwbGFjZUZsYWcpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRGb2xkZXJUeXBlcyIsIChQeUNGdW5jdGlvbilGb2xkZXJfR2V0Rm9sZGVyVHlwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiByZXF1ZXN0ZWRUeXBlQ291bnQpIC0+IChVSW50MzIgdG90YWxUeXBlQ291bnQsIEZvbGRlclR5cGUgdGhlVHlwZXMpIil9LAorICAgIHsiUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciIsIChQeUNGdW5jdGlvbilGb2xkZXJfUmVtb3ZlRm9sZGVyRGVzY3JpcHRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRm9sZGVyVHlwZSBmb2xkVHlwZSkgLT4gTm9uZSIpfSwKICNpZm5kZWYgX19MUDY0X18KLQl7IkdldEZvbGRlck5hbWUiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0dldEZvbGRlck5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIE9TVHlwZSBmb2xkVHlwZSwgU3RyMjU1IG5hbWUpIC0+IChzaG9ydCBmb3VuZFZSZWZOdW0pIil9LAotCXsiQWRkRm9sZGVyUm91dGluZyIsIChQeUNGdW5jdGlvbilGb2xkZXJfQWRkRm9sZGVyUm91dGluZywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVUeXBlLCBGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlciwgRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyLCBSb3V0aW5nRmxhZ3MgZmxhZ3MsIEJvb2xlYW4gcmVwbGFjZUZsYWcpIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVGb2xkZXJSb3V0aW5nIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9SZW1vdmVGb2xkZXJSb3V0aW5nLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUsIEZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyKSAtPiBOb25lIil9LAotCXsiRmluZEZvbGRlclJvdXRpbmciLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZpbmRGb2xkZXJSb3V0aW5nLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUsIEZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyKSAtPiAoRm9sZGVyVHlwZSByb3V0ZVRvRm9sZGVyLCBSb3V0aW5nRmxhZ3MgZmxhZ3MpIil9LAorICAgIHsiR2V0Rm9sZGVyTmFtZSIsIChQeUNGdW5jdGlvbilGb2xkZXJfR2V0Rm9sZGVyTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgT1NUeXBlIGZvbGRUeXBlLCBTdHIyNTUgbmFtZSkgLT4gKHNob3J0IGZvdW5kVlJlZk51bSkiKX0sCisgICAgeyJBZGRGb2xkZXJSb3V0aW5nIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9BZGRGb2xkZXJSb3V0aW5nLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUsIEZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyLCBGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXIsIFJvdXRpbmdGbGFncyBmbGFncywgQm9vbGVhbiByZXBsYWNlRmxhZykgLT4gTm9uZSIpfSwKKyAgICB7IlJlbW92ZUZvbGRlclJvdXRpbmciLCAoUHlDRnVuY3Rpb24pRm9sZGVyX1JlbW92ZUZvbGRlclJvdXRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSwgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXIpIC0+IE5vbmUiKX0sCisgICAgeyJGaW5kRm9sZGVyUm91dGluZyIsIChQeUNGdW5jdGlvbilGb2xkZXJfRmluZEZvbGRlclJvdXRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSwgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXIpIC0+IChGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXIsIFJvdXRpbmdGbGFncyBmbGFncykiKX0sCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JeyJJbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9JbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiBOb25lIil9LAotCXsiSWRlbnRpZnlGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0lkZW50aWZ5Rm9sZGVyLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiAoRm9sZGVyVHlwZSBmb2xkVHlwZSkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJJbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9JbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiBOb25lIil9LAorICAgIHsiSWRlbnRpZnlGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0lkZW50aWZ5Rm9sZGVyLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiAoRm9sZGVyVHlwZSBmb2xkVHlwZSkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTMyNCwxOCArMzI0LDE4IEBACiAKIHZvaWQgaW5pdF9Gb2xkZXIodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfRm9sZGVyIiwgRm9sZGVyX21ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUZvbGRlcl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEZvbGRlcl9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEZvbGRlcl9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfRm9sZGVyIiwgRm9sZGVyX21ldGhvZHMpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEZvbGRlcl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEZvbGRlcl9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEZvbGRlcl9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PSBFbmQgbW9kdWxlIF9Gb2xkZXIgPT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2dlc3RhbHRtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2dlc3RhbHRtb2R1bGUuYwppbmRleCBmYTFjOTNjLi41Njc1N2FiIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9nZXN0YWx0bW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZ2VzdGFsdG1vZHVsZS5jCkBAIC00LDEwICs0LDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKIAotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAotZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCAKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAotYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lcyBvZiBTdGljaHRpbmcgTWF0aGVtYXRpc2NoCiBDZW50cnVtIG9yIENXSSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bwogZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCkBAIC0zMiwyNCArMzIsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXN0YWx0X2dlc3RhbHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TRXJyIGlFcnI7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCVNJbnQzMiByZXNwb25zZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlpRXJyID0gR2VzdGFsdCAoIHNlbGVjdG9yLCAmcmVzcG9uc2UgKTsKLQlpZiAoaUVyciAhPSAwKSAKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGlFcnIpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXNwb25zZSk7CisgICAgT1NFcnIgaUVycjsKKyAgICBPU1R5cGUgc2VsZWN0b3I7CisgICAgU0ludDMyIHJlc3BvbnNlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlFcnIgPSBHZXN0YWx0ICggc2VsZWN0b3IsICZyZXNwb25zZSApOworICAgIGlmIChpRXJyICE9IDApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihpRXJyKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzcG9uc2UpOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGdlc3RhbHRfbWV0aG9kc1tdID0gewotCXsiZ2VzdGFsdCIsIGdlc3RhbHRfZ2VzdGFsdCwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwgTlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7Imdlc3RhbHQiLCBnZXN0YWx0X2dlc3RhbHQsIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsIE5VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogCiB2b2lkCiBpbml0Z2VzdGFsdCh2b2lkKQogewotCVB5X0luaXRNb2R1bGUoImdlc3RhbHQiLCBnZXN0YWx0X21ldGhvZHMpOworICAgIFB5X0luaXRNb2R1bGUoImdlc3RhbHQiLCBnZXN0YWx0X21ldGhvZHMpOwogfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaGVscC9fSGVscG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvaGVscC9fSGVscG1vZHVsZS5jCmluZGV4IGE2ZWNjZjMuLmVhYTJlOGEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2hlbHAvX0hlbHBtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9oZWxwL19IZWxwbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDE1MSArMjIsMTUxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqSGVscF9ITUdldEhlbHBNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVSZWYgb3V0SGVscE1lbnU7Ci0JTWVudUl0ZW1JbmRleCBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNR2V0SGVscE1lbnUoJm91dEhlbHBNZW51LAotCSAgICAgICAgICAgICAgICAgICAgICZvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0SGVscE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Rmlyc3RDdXN0b21JdGVtSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVSZWYgb3V0SGVscE1lbnU7CisgICAgTWVudUl0ZW1JbmRleCBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNR2V0SGVscE1lbnUoJm91dEhlbHBNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0SGVscE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Rmlyc3RDdXN0b21JdGVtSW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1BcmVIZWxwVGFnc0Rpc3BsYXllZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEhNQXJlSGVscFRhZ3NEaXNwbGF5ZWQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhNQXJlSGVscFRhZ3NEaXNwbGF5ZWQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNU2V0SGVscFRhZ3NEaXNwbGF5ZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBpbkRpc3BsYXlUYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EaXNwbGF5VGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBITVNldEhlbHBUYWdzRGlzcGxheWVkKGluRGlzcGxheVRhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gaW5EaXNwbGF5VGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGlzcGxheVRhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE1TZXRIZWxwVGFnc0Rpc3BsYXllZChpbkRpc3BsYXlUYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNU2V0VGFnRGVsYXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRHVyYXRpb24gaW5EZWxheTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVsYXkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSE1TZXRUYWdEZWxheShpbkRlbGF5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEdXJhdGlvbiBpbkRlbGF5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZWxheSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBITVNldFRhZ0RlbGF5KGluRGVsYXkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1HZXRUYWdEZWxheShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEdXJhdGlvbiBvdXREZWxheTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNR2V0VGFnRGVsYXkoJm91dERlbGF5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXREZWxheSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRHVyYXRpb24gb3V0RGVsYXk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBITUdldFRhZ0RlbGF5KCZvdXREZWxheSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RGVsYXkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1TZXRNZW51SGVscEZyb21CYWxsb29uUnNyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51UmVmIGluTWVudTsKLQlTSW50MTYgaW5IbW51UnNyY0lEOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSG1udVJzcmNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBITVNldE1lbnVIZWxwRnJvbUJhbGxvb25Sc3JjKGluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhtbnVSc3JjSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVSZWYgaW5NZW51OworICAgIFNJbnQxNiBpbkhtbnVSc3JjSUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IbW51UnNyY0lEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSG1udVJzcmNJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSGVscF9ITVNldERpYWxvZ0hlbHBGcm9tQmFsbG9vblJzcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRGlhbG9nUHRyIGluRGlhbG9nOwotCVNJbnQxNiBpbkhkbGdSc3JjSUQ7Ci0JU0ludDE2IGluSXRlbVN0YXJ0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmluRGlhbG9nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IZGxnUnNyY0lELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtU3RhcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjKGluRGlhbG9nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZGxnUnNyY0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtU3RhcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIERpYWxvZ1B0ciBpbkRpYWxvZzsKKyAgICBTSW50MTYgaW5IZGxnUnNyY0lEOworICAgIFNJbnQxNiBpbkl0ZW1TdGFydDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX0NvbnZlcnQsICZpbkRpYWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSGRsZ1JzcmNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbVN0YXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNU2V0RGlhbG9nSGVscEZyb21CYWxsb29uUnNyYyhpbkRpYWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGRsZ1JzcmNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbVN0YXJ0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNSGlkZVRhZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNSGlkZVRhZygpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE1IaWRlVGFnKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgSGVscF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJITUdldEhlbHBNZW51IiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1HZXRIZWxwTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVudVJlZiBvdXRIZWxwTWVudSwgTWVudUl0ZW1JbmRleCBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCkiKX0sCi0JeyJITUFyZUhlbHBUYWdzRGlzcGxheWVkIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1BcmVIZWxwVGFnc0Rpc3BsYXllZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSE1TZXRIZWxwVGFnc0Rpc3BsYXllZCIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0SGVscFRhZ3NEaXNwbGF5ZWQsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5EaXNwbGF5VGFncykgLT4gTm9uZSIpfSwKLQl7IkhNU2V0VGFnRGVsYXkiLCAoUHlDRnVuY3Rpb24pSGVscF9ITVNldFRhZ0RlbGF5LCAxLAotCSBQeURvY19TVFIoIihEdXJhdGlvbiBpbkRlbGF5KSAtPiBOb25lIil9LAotCXsiSE1HZXRUYWdEZWxheSIsIChQeUNGdW5jdGlvbilIZWxwX0hNR2V0VGFnRGVsYXksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKER1cmF0aW9uIG91dERlbGF5KSIpfSwKLQl7IkhNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMiLCAoUHlDRnVuY3Rpb24pSGVscF9ITVNldE1lbnVIZWxwRnJvbUJhbGxvb25Sc3JjLCAxLAotCSBQeURvY19TVFIoIihNZW51UmVmIGluTWVudSwgU0ludDE2IGluSG1udVJzcmNJRCkgLT4gTm9uZSIpfSwKLQl7IkhNU2V0RGlhbG9nSGVscEZyb21CYWxsb29uUnNyYyIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0RGlhbG9nSGVscEZyb21CYWxsb29uUnNyYywgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nUHRyIGluRGlhbG9nLCBTSW50MTYgaW5IZGxnUnNyY0lELCBTSW50MTYgaW5JdGVtU3RhcnQpIC0+IE5vbmUiKX0sCi0JeyJITUhpZGVUYWciLCAoUHlDRnVuY3Rpb24pSGVscF9ITUhpZGVUYWcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkhNR2V0SGVscE1lbnUiLCAoUHlDRnVuY3Rpb24pSGVscF9ITUdldEhlbHBNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51UmVmIG91dEhlbHBNZW51LCBNZW51SXRlbUluZGV4IG91dEZpcnN0Q3VzdG9tSXRlbUluZGV4KSIpfSwKKyAgICB7IkhNQXJlSGVscFRhZ3NEaXNwbGF5ZWQiLCAoUHlDRnVuY3Rpb24pSGVscF9ITUFyZUhlbHBUYWdzRGlzcGxheWVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJITVNldEhlbHBUYWdzRGlzcGxheWVkIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1TZXRIZWxwVGFnc0Rpc3BsYXllZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbkRpc3BsYXlUYWdzKSAtPiBOb25lIil9LAorICAgIHsiSE1TZXRUYWdEZWxheSIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0VGFnRGVsYXksIDEsCisgICAgIFB5RG9jX1NUUigiKER1cmF0aW9uIGluRGVsYXkpIC0+IE5vbmUiKX0sCisgICAgeyJITUdldFRhZ0RlbGF5IiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1HZXRUYWdEZWxheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRHVyYXRpb24gb3V0RGVsYXkpIil9LAorICAgIHsiSE1TZXRNZW51SGVscEZyb21CYWxsb29uUnNyYyIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVSZWYgaW5NZW51LCBTSW50MTYgaW5IbW51UnNyY0lEKSAtPiBOb25lIil9LAorICAgIHsiSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dQdHIgaW5EaWFsb2csIFNJbnQxNiBpbkhkbGdSc3JjSUQsIFNJbnQxNiBpbkl0ZW1TdGFydCkgLT4gTm9uZSIpfSwKKyAgICB7IkhNSGlkZVRhZyIsIChQeUNGdW5jdGlvbilIZWxwX0hNSGlkZVRhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE3NCwyMSArMTc0LDIxIEBACiAKIHZvaWQgaW5pdF9IZWxwKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfSGVscCIsIEhlbHBfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9IZWxwIiwgSGVscF9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlIZWxwX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoSGVscF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEhlbHBfRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBIZWxwX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoSGVscF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEhlbHBfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9pYmNhcmJvbi9fSUJDYXJib24uYyBiL01hYy9Nb2R1bGVzL2liY2FyYm9uL19JQkNhcmJvbi5jCmluZGV4IGM3YzgxOWMuLjJhNjVmNDIgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2liY2FyYm9uL19JQkNhcmJvbi5jCisrKyBiL01hYy9Nb2R1bGVzL2liY2FyYm9uL19JQkNhcmJvbi5jCkBAIC0yMywxMTYgKzIzLDExNiBAQAogI2RlZmluZSBJQk5pYlJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZJQk5pYlJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZJQk5pYlJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgSUJOaWJSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlJQk5pYlJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIElCTmliUmVmIG9iX2l0c2VsZjsKIH0gSUJOaWJSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpJQk5pYlJlZk9ial9OZXcoSUJOaWJSZWYgaXRzZWxmKQogewotCUlCTmliUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhJQk5pYlJlZk9iamVjdCwgJklCTmliUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBJQk5pYlJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoSUJOaWJSZWZPYmplY3QsICZJQk5pYlJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBJQk5pYlJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBJQk5pYlJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFJQk5pYlJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJQk5pYlJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChJQk5pYlJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFJQk5pYlJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJQk5pYlJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChJQk5pYlJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIElCTmliUmVmT2JqX2RlYWxsb2MoSUJOaWJSZWZPYmplY3QgKnNlbGYpCiB7Ci0JRGlzcG9zZU5pYlJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgRGlzcG9zZU5pYlJlZmVyZW5jZShzZWxmLT5vYl9pdHNlbGYpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSUJOaWJSZWZPYmpfQ3JlYXRlV2luZG93RnJvbU5pYihJQk5pYlJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpbk5hbWU7Ci0JV2luZG93UHRyIG91dFdpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlV2luZG93RnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpbk5hbWU7CisgICAgV2luZG93UHRyIG91dFdpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlV2luZG93RnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJQk5pYlJlZk9ial9DcmVhdGVNZW51RnJvbU5pYihJQk5pYlJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpbk5hbWU7Ci0JTWVudUhhbmRsZSBvdXRNZW51UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVNZW51RnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnVSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluTmFtZTsKKyAgICBNZW51SGFuZGxlIG91dE1lbnVSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU1lbnVGcm9tTmliKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSUJOaWJSZWZPYmpfQ3JlYXRlTWVudUJhckZyb21OaWIoSUJOaWJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5OYW1lOwotCUhhbmRsZSBvdXRNZW51QmFyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVNZW51QmFyRnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51QmFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0TWVudUJhcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5OYW1lOworICAgIEhhbmRsZSBvdXRNZW51QmFyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVNZW51QmFyRnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51QmFyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0TWVudUJhcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSUJOaWJSZWZPYmpfU2V0TWVudUJhckZyb21OaWIoSUJOaWJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5OYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51QmFyRnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluTmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUJhckZyb21OaWIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIElCTmliUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNyZWF0ZVdpbmRvd0Zyb21OaWIiLCAoUHlDRnVuY3Rpb24pSUJOaWJSZWZPYmpfQ3JlYXRlV2luZG93RnJvbU5pYiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiAoV2luZG93UHRyIG91dFdpbmRvdykiKX0sCi0JeyJDcmVhdGVNZW51RnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9DcmVhdGVNZW51RnJvbU5pYiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51UmVmKSIpfSwKLQl7IkNyZWF0ZU1lbnVCYXJGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX0NyZWF0ZU1lbnVCYXJGcm9tTmliLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChIYW5kbGUgb3V0TWVudUJhcikiKX0sCi0JeyJTZXRNZW51QmFyRnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9TZXRNZW51QmFyRnJvbU5pYiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ3JlYXRlV2luZG93RnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9DcmVhdGVXaW5kb3dGcm9tTmliLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKKyAgICB7IkNyZWF0ZU1lbnVGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX0NyZWF0ZU1lbnVGcm9tTmliLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChNZW51SGFuZGxlIG91dE1lbnVSZWYpIil9LAorICAgIHsiQ3JlYXRlTWVudUJhckZyb21OaWIiLCAoUHlDRnVuY3Rpb24pSUJOaWJSZWZPYmpfQ3JlYXRlTWVudUJhckZyb21OaWIsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluTmFtZSkgLT4gKEhhbmRsZSBvdXRNZW51QmFyKSIpfSwKKyAgICB7IlNldE1lbnVCYXJGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX1NldE1lbnVCYXJGcm9tTmliLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIElCTmliUmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTQ5LDYxICsxNDksNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpJQk5pYlJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JSUJOaWJSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBJQk5pYlJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBJQk5pYlJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKElCTmliUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIElCTmliUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoSUJOaWJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgSUJOaWJSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgSUJOaWJSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfSUJDYXJib24uSUJOaWJSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihJQk5pYlJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIElCTmliUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIElCTmliUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBJQk5pYlJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgSUJOaWJSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JSUJOaWJSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JSUJOaWJSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JSUJOaWJSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUlCTmliUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUlCTmliUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JSUJOaWJSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9JQkNhcmJvbi5JQk5pYlJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKElCTmliUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgSUJOaWJSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgSUJOaWJSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIElCTmliUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBJQk5pYlJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBJQk5pYlJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBJQk5pYlJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBJQk5pYlJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgSUJOaWJSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgSUJOaWJSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBJQk5pYlJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgSUJOaWJSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIxMSwyOCArMjExLDI4IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqSUJDYXJib25fQ3JlYXRlTmliUmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGluTmliTmFtZTsKLQlJQk5pYlJlZiBvdXROaWJSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OaWJOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZU5pYlJlZmVyZW5jZShpbk5pYk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmliUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgSUJOaWJSZWZPYmpfTmV3LCBvdXROaWJSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluTmliTmFtZTsKKyAgICBJQk5pYlJlZiBvdXROaWJSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OaWJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU5pYlJlZmVyZW5jZShpbk5pYk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmliUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgSUJOaWJSZWZPYmpfTmV3LCBvdXROaWJSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBJQkNhcmJvbl9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJDcmVhdGVOaWJSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pSUJDYXJib25fQ3JlYXRlTmliUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5pYk5hbWUpIC0+IChJQk5pYlJlZiBvdXROaWJSZWYpIil9LAorICAgIHsiQ3JlYXRlTmliUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKUlCQ2FyYm9uX0NyZWF0ZU5pYlJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OaWJOYW1lKSAtPiAoSUJOaWJSZWYgb3V0TmliUmVmKSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0yNDAsMjkgKzI0MCwyOSBAQAogCiB2b2lkIGluaXRfSUJDYXJib24odm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0lCQ2FyYm9uIiwgSUJDYXJib25fbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9JQkNhcmJvbiIsIElCQ2FyYm9uX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUlCQ2FyYm9uX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoSUJDYXJib25fRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBJQkNhcmJvbl9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUlCTmliUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZJQk5pYlJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJklCTmliUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSUJOaWJSZWYiLCAoUHlPYmplY3QgKikmSUJOaWJSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZJQk5pYlJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIklCTmliUmVmVHlwZSIsIChQeU9iamVjdCAqKSZJQk5pYlJlZl9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBJQkNhcmJvbl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKElCQ2FyYm9uX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgSUJDYXJib25fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBJQk5pYlJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmSUJOaWJSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZJQk5pYlJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIklCTmliUmVmIiwgKFB5T2JqZWN0ICopJklCTmliUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmSUJOaWJSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJQk5pYlJlZlR5cGUiLCAoUHlPYmplY3QgKikmSUJOaWJSZWZfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaWNnbHVlbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9pY2dsdWVtb2R1bGUuYwppbmRleCBkOTk1ZjE2Li5jNGQ1MDQ1IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9pY2dsdWVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9pY2dsdWVtb2R1bGUuYwpAQCAtNDMsOCArNDMsOCBAQAogLyogRGVjbGFyYXRpb25zIGZvciBvYmplY3RzIG9mIHR5cGUgaWNfaW5zdGFuY2UgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlJQ0luc3RhbmNlIGluc3Q7CisgICAgUHlPYmplY3RfSEVBRAorICAgIElDSW5zdGFuY2UgaW5zdDsKIH0gaWNpb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEljaXR5cGU7CkBAIC01NCwzMDMgKzU0LDMwMyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0dldFNlZWRfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0dldFNlZWRfX2RvY19fW10gPQogIigpLT5pbnQ7IFJldHVybnMgaW50IHRoYXQgY2hhbmdlcyB3aGVuIGNvbmZpZ3VyYXRpb24gZG9lcyIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0dldFNlZWQoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JbG9uZyBzZWVkOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDR2V0U2VlZChzZWxmLT5pbnN0LCAmc2VlZCkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpc2VlZCk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIGxvbmcgc2VlZDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDR2V0U2VlZChzZWxmLT5pbnN0LCAmc2VlZCkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpc2VlZCk7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDQmVnaW5fX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0JlZ2luX19kb2NfX1tdID0KICIocGVybSktPk5vbmU7IExvY2sgY29uZmlnIGZpbGUgZm9yIHJlYWQvd3JpdGUiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNCZWdpbihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlpbnQgcGVybTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmcGVybSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDQmVnaW4oc2VsZi0+aW5zdCwgKElDUGVybSlwZXJtKSkgIT0gMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgaW50IHBlcm07CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmcGVybSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDQmVnaW4oc2VsZi0+aW5zdCwgKElDUGVybSlwZXJtKSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCi1zdGF0aWMgY2hhciBpY2lfSUNGaW5kUHJlZkhhbmRsZV9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDRmluZFByZWZIYW5kbGVfX2RvY19fW10gPQogIihrZXksIGhhbmRsZSktPmF0dHJzOyBMb29rdXAga2V5LCBzdG9yZSByZXN1bHQgaW4gaGFuZGxlLCByZXR1cm4gYXR0cmlidXRlcyIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0ZpbmRQcmVmSGFuZGxlKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVN0cjI1NSBrZXk7Ci0JSUNBdHRyIGF0dHI7Ci0JSGFuZGxlIGg7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAma2V5LCBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ0ZpbmRQcmVmSGFuZGxlKHNlbGYtPmluc3QsIGtleSwgJmF0dHIsIGgpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KWF0dHIpOworICAgIE9TU3RhdHVzIGVycjsKKyAgICBTdHIyNTUga2V5OworICAgIElDQXR0ciBhdHRyOworICAgIEhhbmRsZSBoOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAma2V5LCBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ0ZpbmRQcmVmSGFuZGxlKHNlbGYtPmluc3QsIGtleSwgJmF0dHIsIGgpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KWF0dHIpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ1NldFByZWZfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ1NldFByZWZfX2RvY19fW10gPQogIihrZXksIGF0dHIsIGRhdGEpLT5Ob25lOyBTZXQgcHJlZmVyZW5jZSBrZXkgdG8gZGF0YSB3aXRoIGF0dHJpYnV0ZXMiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNTZXRQcmVmKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVN0cjI1NSBrZXk7Ci0JaW50IGF0dHI7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YWxlbjsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maXMjIiwgUHlNYWNfR2V0U3RyMjU1LCAma2V5LCAmYXR0ciwgCi0JCQkJCSZkYXRhLCAmZGF0YWxlbikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDU2V0UHJlZihzZWxmLT5pbnN0LCBrZXksIChJQ0F0dHIpYXR0ciwgKFB0cilkYXRhLCAKLQkJCShsb25nKWRhdGFsZW4pKSAhPSAwKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFN0cjI1NSBrZXk7CisgICAgaW50IGF0dHI7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgZGF0YWxlbjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpcyMiLCBQeU1hY19HZXRTdHIyNTUsICZrZXksICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsICZkYXRhbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNTZXRQcmVmKHNlbGYtPmluc3QsIGtleSwgKElDQXR0cilhdHRyLCAoUHRyKWRhdGEsCisgICAgICAgICAgICAgICAgICAgIChsb25nKWRhdGFsZW4pKSAhPSAwKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDQ291bnRQcmVmX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNDb3VudFByZWZfX2RvY19fW10gPQogIigpLT5pbnQ7IFJldHVybiBudW1iZXIgb2YgcHJlZmVyZW5jZXMiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNDb3VudFByZWYoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JbG9uZyBjb3VudDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ0NvdW50UHJlZihzZWxmLT5pbnN0LCAmY291bnQpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KWNvdW50KTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgbG9uZyBjb3VudDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDQ291bnRQcmVmKHNlbGYtPmluc3QsICZjb3VudCkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpY291bnQpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0dldEluZFByZWZfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0dldEluZFByZWZfX2RvY19fW10gPQogIihudW0pLT5rZXk7IFJldHVybiBrZXkgb2YgcHJlZmVyZW5jZSB3aXRoIGdpdmVuIGluZGV4IgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDR2V0SW5kUHJlZihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlsb25nIG51bTsKLQlTdHIyNTUga2V5OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZudW0pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ0dldEluZFByZWYoc2VsZi0+aW5zdCwgbnVtLCBrZXkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRTdHIyNTUsIGtleSk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIGxvbmcgbnVtOworICAgIFN0cjI1NSBrZXk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmbnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNHZXRJbmRQcmVmKHNlbGYtPmluc3QsIG51bSwga2V5KSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkU3RyMjU1LCBrZXkpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0RlbGV0ZVByZWZfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0RlbGV0ZVByZWZfX2RvY19fW10gPQogIihrZXkpLT5Ob25lOyBEZWxldGUgcHJlZmVyZW5jZSIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0RlbGV0ZVByZWYoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGtleTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGtleTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGtleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDRGVsZXRlUHJlZihzZWxmLT5pbnN0LCBrZXkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGtleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDRGVsZXRlUHJlZihzZWxmLT5pbnN0LCBrZXkpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0VuZF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDRW5kX19kb2NfX1tdID0KICIoKS0+Tm9uZTsgVW5sb2NrIGZpbGUgYWZ0ZXIgSUNCZWdpbiBjYWxsIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDRW5kKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDRW5kKHNlbGYtPmluc3QpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIE9TU3RhdHVzIGVycjsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDRW5kKHNlbGYtPmluc3QpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0VkaXRQcmVmZXJlbmNlc19fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDRWRpdFByZWZlcmVuY2VzX19kb2NfX1tdID0KICIoa2V5KS0+Tm9uZTsgQXNrIHVzZXIgdG8gZWRpdCBwcmVmZXJlbmNlcywgc3RhcmluZyB3aXRoIGtleSIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0VkaXRQcmVmZXJlbmNlcyhpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlTdHIyNTUga2V5OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGtleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDRWRpdFByZWZlcmVuY2VzKHNlbGYtPmluc3QsIGtleSkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFN0cjI1NSBrZXk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCBrZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ0VkaXRQcmVmZXJlbmNlcyhzZWxmLT5pbnN0LCBrZXkpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ1BhcnNlVVJMX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNQYXJzZVVSTF9fZG9jX19bXSA9CiAiKGhpbnQsIGRhdGEsIHNlbFN0YXJ0LCBzZWxFbmQsIGhhbmRsZSktPnNlbFN0YXJ0LCBzZWxFbmQ7IEZpbmQgYW4gVVJMLCByZXR1cm4gaW4gaGFuZGxlIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDUGFyc2VVUkwoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGhpbnQ7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YWxlbjsKLQlsb25nIHNlbFN0YXJ0LCBzZWxFbmQ7Ci0JSGFuZGxlIGg7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnMjbGxPJiIsIFB5TWFjX0dldFN0cjI1NSwgaGludCwgJmRhdGEsICZkYXRhbGVuLAotCQkJCSZzZWxTdGFydCwgJnNlbEVuZCwgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNQYXJzZVVSTChzZWxmLT5pbnN0LCBoaW50LCAoUHRyKWRhdGEsIChsb25nKWRhdGFsZW4sCi0JCQkJJnNlbFN0YXJ0LCAmc2VsRW5kLCBoKSkgIT0gMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIChpbnQpc2VsU3RhcnQsIChpbnQpc2VsRW5kKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGhpbnQ7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgZGF0YWxlbjsKKyAgICBsb25nIHNlbFN0YXJ0LCBzZWxFbmQ7CisgICAgSGFuZGxlIGg7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mcyNsbE8mIiwgUHlNYWNfR2V0U3RyMjU1LCBoaW50LCAmZGF0YSwgJmRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbFN0YXJ0LCAmc2VsRW5kLCBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ1BhcnNlVVJMKHNlbGYtPmluc3QsIGhpbnQsIChQdHIpZGF0YSwgKGxvbmcpZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsICZzZWxFbmQsIGgpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgKGludClzZWxTdGFydCwgKGludClzZWxFbmQpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0xhdW5jaFVSTF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDTGF1bmNoVVJMX19kb2NfX1tdID0KICIoaGludCwgZGF0YSwgc2VsU3RhcnQsIHNlbEVuZCktPk5vbmU7IEZpbmQgYW4gVVJMIGFuZCBsYXVuY2ggdGhlIGNvcnJlY3QgYXBwIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDTGF1bmNoVVJMKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVN0cjI1NSBoaW50OwotCWNoYXIgKmRhdGE7Ci0JaW50IGRhdGFsZW47Ci0JbG9uZyBzZWxTdGFydCwgc2VsRW5kOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZzI2xsIiwgUHlNYWNfR2V0U3RyMjU1LCBoaW50LCAmZGF0YSwgJmRhdGFsZW4sCi0JCQkJJnNlbFN0YXJ0LCAmc2VsRW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNMYXVuY2hVUkwoc2VsZi0+aW5zdCwgaGludCwgKFB0cilkYXRhLCAobG9uZylkYXRhbGVuLAotCQkJCSZzZWxTdGFydCwgJnNlbEVuZCkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCAoaW50KXNlbFN0YXJ0LCAoaW50KXNlbEVuZCk7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFN0cjI1NSBoaW50OworICAgIGNoYXIgKmRhdGE7CisgICAgaW50IGRhdGFsZW47CisgICAgbG9uZyBzZWxTdGFydCwgc2VsRW5kOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnMjbGwiLCBQeU1hY19HZXRTdHIyNTUsIGhpbnQsICZkYXRhLCAmZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsICZzZWxFbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ0xhdW5jaFVSTChzZWxmLT5pbnN0LCBoaW50LCAoUHRyKWRhdGEsIChsb25nKWRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbFN0YXJ0LCAmc2VsRW5kKSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIChpbnQpc2VsU3RhcnQsIChpbnQpc2VsRW5kKTsKIH0KIAogCi1zdGF0aWMgY2hhciBpY2lfSUNNYXBGaWxlbmFtZV9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDTWFwRmlsZW5hbWVfX2RvY19fW10gPQogIihmaWxlbmFtZSktPm1hcGluZm87IEdldCBmaWxlbWFwIGluZm8gZm9yIGdpdmVuIGZpbGVuYW1lIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDTWFwRmlsZW5hbWUoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGZpbGVuYW1lOwotCUlDTWFwRW50cnkgZW50cnk7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgZmlsZW5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ01hcEZpbGVuYW1lKHNlbGYtPmluc3QsIGZpbGVuYW1lLCAmZW50cnkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPJk8mTyZsTyZPJk8mTyZPJiIsIGVudHJ5LnZlcnNpb24sIAotCQlQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZVR5cGUsCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlQ3JlYXRvciwgCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5wb3N0Q3JlYXRvciwgCi0JCWVudHJ5LmZsYWdzLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZXh0ZW5zaW9uLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuY3JlYXRvckFwcE5hbWUsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5wb3N0QXBwTmFtZSwKLQkJUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5Lk1JTUVUeXBlLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZW50cnlOYW1lKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGZpbGVuYW1lOworICAgIElDTWFwRW50cnkgZW50cnk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCBmaWxlbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDTWFwRmlsZW5hbWUoc2VsZi0+aW5zdCwgZmlsZW5hbWUsICZlbnRyeSkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaE8mTyZPJmxPJk8mTyZPJk8mIiwgZW50cnkudmVyc2lvbiwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LmZpbGVUeXBlLAorICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZUNyZWF0b3IsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5wb3N0Q3JlYXRvciwKKyAgICAgICAgZW50cnkuZmxhZ3MsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5leHRlbnNpb24sCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5jcmVhdG9yQXBwTmFtZSwKKyAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5LnBvc3RBcHBOYW1lLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuTUlNRVR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5lbnRyeU5hbWUpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ01hcFR5cGVDcmVhdG9yX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNNYXBUeXBlQ3JlYXRvcl9fZG9jX19bXSA9CiAiKHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lKS0+bWFwaW5mbzsgR2V0IGZpbGVtYXAgaW5mbyBmb3IgZ2l2ZW4gdHAvY3IvZmlsZW5hbWUiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNNYXBUeXBlQ3JlYXRvcihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlPU1R5cGUgdHlwZSwgY3JlYXRvcjsKLQlTdHIyNTUgZmlsZW5hbWU7Ci0JSUNNYXBFbnRyeSBlbnRyeTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCi0JCQlQeU1hY19HZXRPU1R5cGUsICZ0eXBlLAotCQkJUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkJCVB5TWFjX0dldFN0cjI1NSwgZmlsZW5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ01hcFR5cGVDcmVhdG9yKHNlbGYtPmluc3QsIHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lLCAmZW50cnkpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPJk8mTyZsTyZPJk8mTyZPJiIsIGVudHJ5LnZlcnNpb24sIAotCQlQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZVR5cGUsCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlQ3JlYXRvciwgCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5wb3N0Q3JlYXRvciwgCi0JCWVudHJ5LmZsYWdzLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZXh0ZW5zaW9uLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuY3JlYXRvckFwcE5hbWUsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5wb3N0QXBwTmFtZSwKLQkJUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5Lk1JTUVUeXBlLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZW50cnlOYW1lKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgT1NUeXBlIHR5cGUsIGNyZWF0b3I7CisgICAgU3RyMjU1IGZpbGVuYW1lOworICAgIElDTWFwRW50cnkgZW50cnk7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGUsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZW5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ01hcFR5cGVDcmVhdG9yKHNlbGYtPmluc3QsIHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lLCAmZW50cnkpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPJk8mTyZsTyZPJk8mTyZPJiIsIGVudHJ5LnZlcnNpb24sCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlVHlwZSwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LmZpbGVDcmVhdG9yLAorICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkucG9zdENyZWF0b3IsCisgICAgICAgIGVudHJ5LmZsYWdzLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZXh0ZW5zaW9uLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuY3JlYXRvckFwcE5hbWUsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5wb3N0QXBwTmFtZSwKKyAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5Lk1JTUVUeXBlLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuZW50cnlOYW1lKTsKIH0KIAogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGljaV9tZXRob2RzW10gPSB7Ci0geyJJQ0dldFNlZWQiLAkoUHlDRnVuY3Rpb24paWNpX0lDR2V0U2VlZCwJTUVUSF9WQVJBUkdTLAlpY2lfSUNHZXRTZWVkX19kb2NfX30sCi0geyJJQ0JlZ2luIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ0JlZ2luLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ0JlZ2luX19kb2NfX30sCi0geyJJQ0ZpbmRQcmVmSGFuZGxlIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ0ZpbmRQcmVmSGFuZGxlLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ0ZpbmRQcmVmSGFuZGxlX19kb2NfX30sCi0geyJJQ1NldFByZWYiLAkoUHlDRnVuY3Rpb24paWNpX0lDU2V0UHJlZiwJTUVUSF9WQVJBUkdTLAlpY2lfSUNTZXRQcmVmX19kb2NfX30sCi0geyJJQ0NvdW50UHJlZiIsCShQeUNGdW5jdGlvbilpY2lfSUNDb3VudFByZWYsCU1FVEhfVkFSQVJHUywJaWNpX0lDQ291bnRQcmVmX19kb2NfX30sCi0geyJJQ0dldEluZFByZWYiLAkoUHlDRnVuY3Rpb24paWNpX0lDR2V0SW5kUHJlZiwJTUVUSF9WQVJBUkdTLAlpY2lfSUNHZXRJbmRQcmVmX19kb2NfX30sCi0geyJJQ0RlbGV0ZVByZWYiLAkoUHlDRnVuY3Rpb24paWNpX0lDRGVsZXRlUHJlZiwJTUVUSF9WQVJBUkdTLAlpY2lfSUNEZWxldGVQcmVmX19kb2NfX30sCi0geyJJQ0VuZCIsCShQeUNGdW5jdGlvbilpY2lfSUNFbmQsCU1FVEhfVkFSQVJHUywJaWNpX0lDRW5kX19kb2NfX30sCi0geyJJQ0VkaXRQcmVmZXJlbmNlcyIsCShQeUNGdW5jdGlvbilpY2lfSUNFZGl0UHJlZmVyZW5jZXMsCU1FVEhfVkFSQVJHUywJaWNpX0lDRWRpdFByZWZlcmVuY2VzX19kb2NfX30sCi0geyJJQ1BhcnNlVVJMIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ1BhcnNlVVJMLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ1BhcnNlVVJMX19kb2NfX30sCi0geyJJQ0xhdW5jaFVSTCIsCShQeUNGdW5jdGlvbilpY2lfSUNMYXVuY2hVUkwsCU1FVEhfVkFSQVJHUywJaWNpX0lDTGF1bmNoVVJMX19kb2NfX30sCi0geyJJQ01hcEZpbGVuYW1lIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ01hcEZpbGVuYW1lLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ01hcEZpbGVuYW1lX19kb2NfX30sCi0geyJJQ01hcFR5cGVDcmVhdG9yIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ01hcFR5cGVDcmVhdG9yLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ01hcFR5cGVDcmVhdG9yX19kb2NfX30sCi0gCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyB7IklDR2V0U2VlZCIsICAoUHlDRnVuY3Rpb24paWNpX0lDR2V0U2VlZCwgICAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNHZXRTZWVkX19kb2NfX30sCisgeyJJQ0JlZ2luIiwgICAgKFB5Q0Z1bmN0aW9uKWljaV9JQ0JlZ2luLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDQmVnaW5fX2RvY19ffSwKKyB7IklDRmluZFByZWZIYW5kbGUiLCAgIChQeUNGdW5jdGlvbilpY2lfSUNGaW5kUHJlZkhhbmRsZSwgICAgICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDRmluZFByZWZIYW5kbGVfX2RvY19ffSwKKyB7IklDU2V0UHJlZiIsICAoUHlDRnVuY3Rpb24paWNpX0lDU2V0UHJlZiwgICAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNTZXRQcmVmX19kb2NfX30sCisgeyJJQ0NvdW50UHJlZiIsICAgICAgICAoUHlDRnVuY3Rpb24paWNpX0lDQ291bnRQcmVmLCAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNDb3VudFByZWZfX2RvY19ffSwKKyB7IklDR2V0SW5kUHJlZiIsICAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNHZXRJbmRQcmVmLCAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0dldEluZFByZWZfX2RvY19ffSwKKyB7IklDRGVsZXRlUHJlZiIsICAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNEZWxldGVQcmVmLCAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0RlbGV0ZVByZWZfX2RvY19ffSwKKyB7IklDRW5kIiwgICAgICAoUHlDRnVuY3Rpb24paWNpX0lDRW5kLCBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDRW5kX19kb2NfX30sCisgeyJJQ0VkaXRQcmVmZXJlbmNlcyIsICAoUHlDRnVuY3Rpb24paWNpX0lDRWRpdFByZWZlcmVuY2VzLCAgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0VkaXRQcmVmZXJlbmNlc19fZG9jX199LAorIHsiSUNQYXJzZVVSTCIsIChQeUNGdW5jdGlvbilpY2lfSUNQYXJzZVVSTCwgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ1BhcnNlVVJMX19kb2NfX30sCisgeyJJQ0xhdW5jaFVSTCIsICAgICAgICAoUHlDRnVuY3Rpb24paWNpX0lDTGF1bmNoVVJMLCAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNMYXVuY2hVUkxfX2RvY19ffSwKKyB7IklDTWFwRmlsZW5hbWUiLCAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNNYXBGaWxlbmFtZSwgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ01hcEZpbGVuYW1lX19kb2NfX30sCisgeyJJQ01hcFR5cGVDcmVhdG9yIiwgICAoUHlDRnVuY3Rpb24paWNpX0lDTWFwVHlwZUNyZWF0b3IsICAgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ01hcFR5cGVDcmVhdG9yX19kb2NfX30sCisKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogLS0tLS0tLS0tLSAqLwpAQCAtMzU5LDYxICszNTksNjEgQEAKIHN0YXRpYyBpY2lvYmplY3QgKgogbmV3aWNpb2JqZWN0KE9TVHlwZSBjcmVhdG9yKQogewotCWljaW9iamVjdCAqc2VsZjsKLQlPU1N0YXR1cyBlcnI7Ci0JCi0Jc2VsZiA9IFB5T2JqZWN0X05FVyhpY2lvYmplY3QsICZJY2l0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ1N0YXJ0KCZzZWxmLT5pbnN0LCBjcmVhdG9yKSkgIT0gMCApIHsKLQkJKHZvaWQpUHlNYWNfRXJyb3IoZXJyKTsKLQkJUHlPYmplY3RfREVMKHNlbGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgaWNpb2JqZWN0ICpzZWxmOworICAgIE9TU3RhdHVzIGVycjsKKworICAgIHNlbGYgPSBQeU9iamVjdF9ORVcoaWNpb2JqZWN0LCAmSWNpdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNTdGFydCgmc2VsZi0+aW5zdCwgY3JlYXRvcikpICE9IDAgKSB7CisgICAgICAgICh2b2lkKVB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiAKIHN0YXRpYyB2b2lkCiBpY2lfZGVhbGxvYyhpY2lvYmplY3QgKnNlbGYpCiB7Ci0JKHZvaWQpSUNTdG9wKHNlbGYtPmluc3QpOwotCVB5T2JqZWN0X0RFTChzZWxmKTsKKyAgICAodm9pZClJQ1N0b3Aoc2VsZi0+aW5zdCk7CisgICAgUHlPYmplY3RfREVMKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX2dldGF0dHIoaWNpb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKGljaV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChpY2lfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKLXN0YXRpYyBjaGFyIEljaXR5cGVfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIEljaXR5cGVfX2RvY19fW10gPQogIkludGVybmV0IENvbmZpZyBpbnN0YW5jZSIKIDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBJY2l0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiaWNnbHVlLmljX2luc3RhbmNlIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGljaW9iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWljaV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylpY2lfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3N0ciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJpY2dsdWUuaWNfaW5zdGFuY2UiLCAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKGljaW9iamVjdCksICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpY2lfZGVhbGxvYywgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpaWNpX2dldGF0dHIsICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAKLQkvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCTBMLDBMLDBMLDBMLAotCUljaXR5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCisgICAgLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgICAwTCwwTCwwTCwwTCwKKyAgICBJY2l0eXBlX19kb2NfXyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLwogfTsKIAogLyogRW5kIG9mIGNvZGUgZm9yIGljX2luc3RhbmNlIG9iamVjdHMgKi8KQEAgLTQyNyw1MiArNDI3LDUyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaWNfSUNTdGFydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGNyZWF0b3I7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvcikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoUHlPYmplY3QgKiluZXdpY2lvYmplY3QoY3JlYXRvcik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3aWNpb2JqZWN0KGNyZWF0b3IpOwogfQogCiAvKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgaWNfbWV0aG9kc1tdID0gewotCXsiSUNTdGFydCIsCShQeUNGdW5jdGlvbilpY19JQ1N0YXJ0LAlNRVRIX1ZBUkFSR1MsCWljX0lDU3RhcnRfX2RvY19ffSwKLSAKLQl7TlVMTCwJIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7IklDU3RhcnQiLCAgICAgICAgIChQeUNGdW5jdGlvbilpY19JQ1N0YXJ0LCAgICAgICAgTUVUSF9WQVJBUkdTLCAgIGljX0lDU3RhcnRfX2RvY19ffSwKKworICAgIHtOVUxMLCAgICAgICAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0gICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZSAoKm11c3QqIGJlIGNhbGxlZCBpbml0aWNnbHVlKSAqLwogCi1zdGF0aWMgY2hhciBpY2dsdWVfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9IAorc3RhdGljIGNoYXIgaWNnbHVlX21vZHVsZV9kb2N1bWVudGF0aW9uW10gPQogIkltcGxlbWVudHMgbG93LWxldmVsIEludGVybmV0IENvbmZpZyBpbnRlcmZhY2UiCiA7CiAKIHZvaWQKIGluaXRpY2dsdWUodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIGljZ2x1ZSBpcyByZW1vdmVkLiIsIDEpKQotCQlyZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJpY2dsdWUiLCBpY19tZXRob2RzLAotCQlpY2dsdWVfbW9kdWxlX2RvY3VtZW50YXRpb24sCi0JCShQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCBpY2dsdWUgaXMgcmVtb3ZlZC4iLCAxKSkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlFcnJvck9iamVjdCA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEVycm9yT2JqZWN0ID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpICE9IDApCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoImljZ2x1ZSIsIGljX21ldGhvZHMsCisgICAgICAgIGljZ2x1ZV9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKKyAgICAgICAgKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CiAKLQkvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLwotCQotCS8qIENoZWNrIGZvciBlcnJvcnMgKi8KLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBtb2R1bGUgaWNnbHVlIik7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBFcnJvck9iamVjdCA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEVycm9yT2JqZWN0ID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpICE9IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCisKKyAgICAvKiBDaGVjayBmb3IgZXJyb3JzICovCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIGljZ2x1ZSIpOwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9pY24vX0ljbm1vZHVsZS5jIGIvTWFjL01vZHVsZXMvaWNuL19JY25tb2R1bGUuYwppbmRleCA4MDIwMWEyLi42OTY3YWU0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9pY24vX0ljbm1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2ljbi9fSWNubW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIzLDE1NjEgKzIzLDE1NjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0Q0ljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNJY29uSGFuZGxlIF9ydjsKLQlTSW50MTYgaWNvbklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDSWNvbkhhbmRsZSBfcnY7CisgICAgU0ludDE2IGljb25JRDsKICNpZm5kZWYgR2V0Q0ljb24KLQlQeU1hY19QUkVDSEVDSyhHZXRDSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q0ljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDSWNvbihpY29uSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENJY29uKGljb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90Q0ljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgdGhlUmVjdDsKLQlDSWNvbkhhbmRsZSB0aGVJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgQ0ljb25IYW5kbGUgdGhlSWNvbjsKICNpZm5kZWYgUGxvdENJY29uCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdENJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90Q0ljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb24pKQotCQlyZXR1cm4gTlVMTDsKLQlQbG90Q0ljb24oJnRoZVJlY3QsCi0JICAgICAgICAgIHRoZUljb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBsb3RDSWNvbigmdGhlUmVjdCwKKyAgICAgICAgICAgICAgdGhlSWNvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9EaXNwb3NlQ0ljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNJY29uSGFuZGxlIHRoZUljb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENJY29uSGFuZGxlIHRoZUljb247CiAjaWZuZGVmIERpc3Bvc2VDSWNvbgotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZUNJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzcG9zZUNJY29uKHRoZUljb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VDSWNvbih0aGVJY29uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBTSW50MTYgaWNvbklEOwogI2lmbmRlZiBHZXRJY29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEljb24oaWNvbklEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRJY29uKGljb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCB0aGVSZWN0OwotCUhhbmRsZSB0aGVJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgSGFuZGxlIHRoZUljb247CiAjaWZuZGVmIFBsb3RJY29uCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdEljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFBsb3RJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGxvdEljb24oJnRoZVJlY3QsCi0JICAgICAgICAgdGhlSWNvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGxvdEljb24oJnRoZVJlY3QsCisgICAgICAgICAgICAgdGhlSWNvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvbklEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JU0ludDE2IHRoZVJlc0lEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgdGhlUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CisgICAgU0ludDE2IHRoZVJlc0lEOwogI2lmbmRlZiBQbG90SWNvbklECi0JUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25JRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25JRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90SWNvbklEKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICB0aGVSZXNJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlUmVzSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25JRCgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgdGhlUmVzSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9OZXdJY29uU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOwogI2lmbmRlZiBOZXdJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhOZXdJY29uU3VpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld0ljb25TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld0ljb25TdWl0ZSgmdGhlSWNvblN1aXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblN1aXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld0ljb25TdWl0ZSgmdGhlSWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblN1aXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fQWRkSWNvblRvU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIHRoZUljb25EYXRhOwotCUljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKLQlSZXNUeXBlIHRoZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHRoZUljb25EYXRhOworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEFkZEljb25Ub1N1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soQWRkSWNvblRvU3VpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZEljb25Ub1N1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbkRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkSWNvblRvU3VpdGUodGhlSWNvbkRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIHRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZEljb25Ub1N1aXRlKHRoZUljb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25Gcm9tU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIHRoZUljb25EYXRhOwotCUljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKLQlSZXNUeXBlIHRoZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHRoZUljb25EYXRhOworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEdldEljb25Gcm9tU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uRnJvbVN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uRnJvbVN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25Gcm9tU3VpdGUoJnRoZUljb25EYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uRGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvbkZyb21TdWl0ZSgmdGhlSWNvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25EYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7Ci0JU0ludDE2IHRoZVJlc0lEOwotCUljb25TZWxlY3RvclZhbHVlIHNlbGVjdG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CisgICAgU0ludDE2IHRoZVJlc0lEOworICAgIEljb25TZWxlY3RvclZhbHVlIHNlbGVjdG9yOwogI2lmbmRlZiBHZXRJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uU3VpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25TdWl0ZSgmdGhlSWNvblN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgdGhlUmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25TdWl0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlUmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uU3VpdGUoJnRoZUljb25TdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZVJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uU3VpdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9EaXNwb3NlSWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7Ci0JQm9vbGVhbiBkaXNwb3NlRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOworICAgIEJvb2xlYW4gZGlzcG9zZURhdGE7CiAjaWZuZGVmIERpc3Bvc2VJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlSWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlSWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcG9zZURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGlzcG9zZUljb25TdWl0ZSh0aGVJY29uU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZURhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcG9zZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlzcG9zZUljb25TdWl0ZSh0aGVJY29uU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZURhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CiAjaWZuZGVmIFBsb3RJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhQbG90SWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90SWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBsb3RJY29uU3VpdGUoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TdWl0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25TdWl0ZSgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fTG9hZEljb25DYWNoZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUljb25DYWNoZVJlZiB0aGVJY29uQ2FjaGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBJY29uQ2FjaGVSZWYgdGhlSWNvbkNhY2hlOwogI2lmbmRlZiBMb2FkSWNvbkNhY2hlCi0JUHlNYWNfUFJFQ0hFQ0soTG9hZEljb25DYWNoZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTG9hZEljb25DYWNoZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25DYWNoZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkSWNvbkNhY2hlKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVJY29uQ2FjaGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbkNhY2hlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRJY29uQ2FjaGUoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25DYWNoZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldExhYmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBsYWJlbE51bWJlcjsKLQlSR0JDb2xvciBsYWJlbENvbG9yOwotCVN0cjI1NSBsYWJlbFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgbGFiZWxOdW1iZXI7CisgICAgUkdCQ29sb3IgbGFiZWxDb2xvcjsKKyAgICBTdHIyNTUgbGFiZWxTdHJpbmc7CiAjaWZuZGVmIEdldExhYmVsCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TGFiZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldExhYmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsYWJlbE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBsYWJlbFN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRMYWJlbChsYWJlbE51bWJlciwKLQkgICAgICAgICAgICAgICAgJmxhYmVsQ29sb3IsCi0JICAgICAgICAgICAgICAgIGxhYmVsU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbGFiZWxDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhYmVsTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGxhYmVsU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldExhYmVsKGxhYmVsTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAmbGFiZWxDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgbGFiZWxTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZsYWJlbENvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUHRJbkljb25JRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgdGVzdFB0OwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgdGVzdFB0OworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgU0ludDE2IGljb25JRDsKICNpZm5kZWYgUHRJbkljb25JRAotCVB5TWFjX1BSRUNIRUNLKFB0SW5JY29uSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5JY29uSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJbkljb25JRCh0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgIGljb25JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJbkljb25JRCh0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgIGljb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1B0SW5JY29uU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHRlc3RQdDsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHRlc3RQdDsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CiAjaWZuZGVmIFB0SW5JY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhQdEluSWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdEluSWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJbkljb25TdWl0ZSh0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgIHRoZUljb25TdWl0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGVzdFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBQdEluSWNvblN1aXRlKHRlc3RQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVjdEluSWNvbklEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZWN0IHRlc3RSZWN0OwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmVjdCB0ZXN0UmVjdDsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIFNJbnQxNiBpY29uSUQ7CiAjaWZuZGVmIFJlY3RJbkljb25JRAotCVB5TWFjX1BSRUNIRUNLKFJlY3RJbkljb25JRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvbklEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZWN0SW5JY29uSUQoJnRlc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICBpY29uSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWN0SW5JY29uSUQoJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICBpY29uSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWN0SW5JY29uU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJlY3QgdGVzdFJlY3Q7Ci0JUmVjdCBpY29uUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHRlc3RSZWN0OworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKICNpZm5kZWYgUmVjdEluSWNvblN1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWN0SW5JY29uU3VpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVjdEluSWNvblN1aXRlKCZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWN0SW5JY29uU3VpdGUoJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uU3VpdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uSURUb1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgdGhlUmduOwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdGhlUmduOworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgU0ludDE2IGljb25JRDsKICNpZm5kZWYgSWNvbklEVG9SZ24KLQlQeU1hY19QUkVDSEVDSyhJY29uSURUb1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvbklEVG9SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEljb25JRFRvUmduKHRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgaWNvbklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSWNvbklEVG9SZ24odGhlUmduLAorICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICBpY29uSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uU3VpdGVUb1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgdGhlUmduOwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdGhlUmduOworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKICNpZm5kZWYgSWNvblN1aXRlVG9SZ24KLQlQeU1hY19QUkVDSEVDSyhJY29uU3VpdGVUb1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvblN1aXRlVG9SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlUmduLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvblN1aXRlVG9SZ24odGhlUmduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uU3VpdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25TdWl0ZVRvUmduKHRoZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fU2V0U3VpdGVMYWJlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uU3VpdGVSZWYgdGhlU3VpdGU7Ci0JU0ludDE2IHRoZUxhYmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKKyAgICBTSW50MTYgdGhlTGFiZWw7CiAjaWZuZGVmIFNldFN1aXRlTGFiZWwKLQlQeU1hY19QUkVDSEVDSyhTZXRTdWl0ZUxhYmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRTdWl0ZUxhYmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRTdWl0ZUxhYmVsKHRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUxhYmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTGFiZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0U3VpdGVMYWJlbCh0aGVTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldFN1aXRlTGFiZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7Ci0JSWNvblN1aXRlUmVmIHRoZVN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKICNpZm5kZWYgR2V0U3VpdGVMYWJlbAotCVB5TWFjX1BSRUNIRUNLKEdldFN1aXRlTGFiZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFN1aXRlTGFiZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0U3VpdGVMYWJlbCh0aGVTdWl0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0U3VpdGVMYWJlbCh0aGVTdWl0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1Bsb3RJY29uSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JSGFuZGxlIHRoZUljb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBIYW5kbGUgdGhlSWNvbjsKICNpZm5kZWYgUGxvdEljb25IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhQbG90SWNvbkhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBsb3RJY29uSGFuZGxlKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25IYW5kbGUoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90U0lDTkhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUhhbmRsZSB0aGVTSUNOOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgdGhlUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CisgICAgSGFuZGxlIHRoZVNJQ047CiAjaWZuZGVmIFBsb3RTSUNOSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdFNJQ05IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBsb3RTSUNOSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU0lDTikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90U0lDTkhhbmRsZSgmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlU0lDTik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTSUNOKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBsb3RTSUNOSGFuZGxlKCZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTSUNOKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUGxvdENJY29uSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JQ0ljb25IYW5kbGUgdGhlQ0ljb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBDSWNvbkhhbmRsZSB0aGVDSWNvbjsKICNpZm5kZWYgUGxvdENJY29uSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdENJY29uSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90Q0ljb25IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDSWNvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90Q0ljb25IYW5kbGUoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZUNJY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNJY29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBsb3RDSWNvbkhhbmRsZSgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ0ljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uUmVmVG9JY29uRmFtaWx5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgdGhlSWNvblJlZjsKLQlJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zOwotCUljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CiAjaWZuZGVmIEljb25SZWZUb0ljb25GYW1pbHkKLQlQeU1hY19QUkVDSEVDSyhJY29uUmVmVG9JY29uRmFtaWx5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJY29uUmVmVG9JY29uRmFtaWx5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSWNvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvblJlZlRvSWNvbkZhbWlseSh0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSWNvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEljb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25SZWZUb0ljb25GYW1pbHkodGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmFtaWx5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvbkZhbWlseSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0ljb25GYW1pbHlUb0ljb25TdWl0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7Ci0JSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKLQlJY29uU3VpdGVSZWYgaWNvblN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zOworICAgIEljb25TdWl0ZVJlZiBpY29uU3VpdGU7CiAjaWZuZGVmIEljb25GYW1pbHlUb0ljb25TdWl0ZQotCVB5TWFjX1BSRUNIRUNLKEljb25GYW1pbHlUb0ljb25TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvbkZhbWlseVRvSWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSWNvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvbkZhbWlseVRvSWNvblN1aXRlKGljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TdWl0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25TdWl0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJY29ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJY29uRmFtaWx5VG9JY29uU3VpdGUoaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSWNvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvblN1aXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fSWNvblN1aXRlVG9JY29uRmFtaWx5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TdWl0ZVJlZiBpY29uU3VpdGU7Ci0JSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblN1aXRlUmVmIGljb25TdWl0ZTsKKyAgICBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKICNpZm5kZWYgSWNvblN1aXRlVG9JY29uRmFtaWx5Ci0JUHlNYWNfUFJFQ0hFQ0soSWNvblN1aXRlVG9JY29uRmFtaWx5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJY29uU3VpdGVUb0ljb25GYW1pbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEljb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEljb25TdWl0ZVRvSWNvbkZhbWlseShpY29uU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25TdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSWNvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSWNvblN1aXRlVG9JY29uRmFtaWx5KGljb25TdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSWNvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9TZXRJY29uRmFtaWx5RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7Ci0JT1NUeXBlIGljb25UeXBlOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIFNldEljb25GYW1pbHlEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SWNvbkZhbWlseURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEljb25GYW1pbHlEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRJY29uRmFtaWx5RGF0YShpY29uRmFtaWx5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldEljb25GYW1pbHlEYXRhKGljb25GYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvbkZhbWlseURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwotCU9TVHlwZSBpY29uVHlwZTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgT1NUeXBlIGljb25UeXBlOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBHZXRJY29uRmFtaWx5RGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldEljb25GYW1pbHlEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uRmFtaWx5RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvbkZhbWlseURhdGEoaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uRmFtaWx5RGF0YShpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWZPd25lcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOwotCVVJbnQxNiBvd25lcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOworICAgIFVJbnQxNiBvd25lcnM7CiAjaWZuZGVmIEdldEljb25SZWZPd25lcnMKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmT3duZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmT3duZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25SZWZPd25lcnModGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3duZXJzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvd25lcnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEljb25SZWZPd25lcnModGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3duZXJzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcnMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9BY3F1aXJlSWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBBY3F1aXJlSWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKEFjcXVpcmVJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBY3F1aXJlSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBY3F1aXJlSWNvblJlZih0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBY3F1aXJlSWNvblJlZih0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVsZWFzZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVsZWFzZUljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhSZWxlYXNlSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVsZWFzZUljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVsZWFzZUljb25SZWYodGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVsZWFzZUljb25SZWYodGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWZGcm9tRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgdGhlRmlsZTsKLQlJY29uUmVmIHRoZUljb25SZWY7Ci0JU0ludDE2IHRoZUxhYmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKKyAgICBTSW50MTYgdGhlTGFiZWw7CiAjaWZuZGVmIEdldEljb25SZWZGcm9tRmlsZQotCVB5TWFjX1BSRUNIRUNLKEdldEljb25SZWZGcm9tRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZkZyb21GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJY29uUmVmRnJvbUZpbGUoJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUxhYmVsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvblJlZkZyb21GaWxlKCZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTGFiZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IHZSZWZOdW07Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGljb25UeXBlOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBHZXRJY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJY29uUmVmKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEljb25SZWYodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWZGcm9tRm9sZGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiB2UmVmTnVtOwotCVNJbnQzMiBwYXJlbnRGb2xkZXJJRDsKLQlTSW50MzIgZm9sZGVySUQ7Ci0JU0ludDggYXR0cmlidXRlczsKLQlTSW50OCBhY2Nlc3NQcml2aWxlZ2VzOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKKyAgICBTSW50MzIgcGFyZW50Rm9sZGVySUQ7CisgICAgU0ludDMyIGZvbGRlcklEOworICAgIFNJbnQ4IGF0dHJpYnV0ZXM7CisgICAgU0ludDggYWNjZXNzUHJpdmlsZWdlczsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIEdldEljb25SZWZGcm9tRm9sZGVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZkZyb21Gb2xkZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25SZWZGcm9tRm9sZGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsbGJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRGb2xkZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbGRlcklELAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjY2Vzc1ByaXZpbGVnZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvblJlZkZyb21Gb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Rm9sZGVySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlcklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQcml2aWxlZ2VzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsbGJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRGb2xkZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbGRlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY2Vzc1ByaXZpbGVnZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvblJlZkZyb21Gb2xkZXIodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Rm9sZGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQcml2aWxlZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkKLQlQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseShjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmFtaWx5KGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGljb25UeXBlOwotCUZTU3BlYyByZXNvdXJjZUZpbGU7Ci0JU0ludDE2IHJlc291cmNlSUQ7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKKyAgICBGU1NwZWMgcmVzb3VyY2VGaWxlOworICAgIFNJbnQxNiByZXNvdXJjZUlEOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVnaXN0ZXJJY29uUmVmRnJvbVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZShjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZShjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlZ2lzdGVySWNvblJlZkZyb21GU1JlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7Ci0JRlNSZWYgaWNvbkZpbGU7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKKyAgICBGU1JlZiBpY29uRmlsZTsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZgotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmljb25GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZihjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmljb25GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZihjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9VbnJlZ2lzdGVySWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGljb25UeXBlOwogI2lmbmRlZiBVbnJlZ2lzdGVySWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKFVucmVnaXN0ZXJJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVySWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3Rlckljb25SZWYoY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVbnJlZ2lzdGVySWNvblJlZihjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1VwZGF0ZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgVXBkYXRlSWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZUljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXBkYXRlSWNvblJlZih0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVJY29uUmVmKHRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9PdmVycmlkZUljb25SZWZGcm9tUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOwotCUZTU3BlYyByZXNvdXJjZUZpbGU7Ci0JU0ludDE2IHJlc291cmNlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOworICAgIEZTU3BlYyByZXNvdXJjZUZpbGU7CisgICAgU0ludDE2IHJlc291cmNlSUQ7CiAjaWZuZGVmIE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3ZlcnJpZGVJY29uUmVmRnJvbVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSh0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSh0aGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9PdmVycmlkZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiBvbGRJY29uUmVmOwotCUljb25SZWYgbmV3SWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIG9sZEljb25SZWY7CisgICAgSWNvblJlZiBuZXdJY29uUmVmOwogI2lmbmRlZiBPdmVycmlkZUljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhPdmVycmlkZUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE92ZXJyaWRlSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvbGRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld0ljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT3ZlcnJpZGVJY29uUmVmKG9sZEljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICBuZXdJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvbGRJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld0ljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT3ZlcnJpZGVJY29uUmVmKG9sZEljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVtb3ZlSWNvblJlZk92ZXJyaWRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFJlbW92ZUljb25SZWZPdmVycmlkZQotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZUljb25SZWZPdmVycmlkZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlSWNvblJlZk92ZXJyaWRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUljb25SZWZPdmVycmlkZSh0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVJY29uUmVmT3ZlcnJpZGUodGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0NvbXBvc2l0ZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiBiYWNrZ3JvdW5kSWNvblJlZjsKLQlJY29uUmVmIGZvcmVncm91bmRJY29uUmVmOwotCUljb25SZWYgY29tcG9zaXRlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIGJhY2tncm91bmRJY29uUmVmOworICAgIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWY7CisgICAgSWNvblJlZiBjb21wb3NpdGVJY29uUmVmOwogI2lmbmRlZiBDb21wb3NpdGVJY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcG9zaXRlSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcG9zaXRlSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZiYWNrZ3JvdW5kSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZmb3JlZ3JvdW5kSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb21wb3NpdGVJY29uUmVmKGJhY2tncm91bmRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVncm91bmRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZjb21wb3NpdGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29tcG9zaXRlSWNvblJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja2dyb3VuZEljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZm9yZWdyb3VuZEljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29tcG9zaXRlSWNvblJlZihiYWNrZ3JvdW5kSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9zaXRlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGNvbXBvc2l0ZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9Jc0ljb25SZWZDb21wb3NpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiBjb21wb3NpdGVJY29uUmVmOwotCUljb25SZWYgYmFja2dyb3VuZEljb25SZWY7Ci0JSWNvblJlZiBmb3JlZ3JvdW5kSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIGNvbXBvc2l0ZUljb25SZWY7CisgICAgSWNvblJlZiBiYWNrZ3JvdW5kSWNvblJlZjsKKyAgICBJY29uUmVmIGZvcmVncm91bmRJY29uUmVmOwogI2lmbmRlZiBJc0ljb25SZWZDb21wb3NpdGUKLQlQeU1hY19QUkVDSEVDSyhJc0ljb25SZWZDb21wb3NpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzSWNvblJlZkNvbXBvc2l0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9zaXRlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJc0ljb25SZWZDb21wb3NpdGUoY29tcG9zaXRlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWNrZ3JvdW5kSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JlZ3JvdW5kSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYmFja2dyb3VuZEljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZm9yZWdyb3VuZEljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb3NpdGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElzSWNvblJlZkNvbXBvc2l0ZShjb21wb3NpdGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhY2tncm91bmRJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmVncm91bmRJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBiYWNrZ3JvdW5kSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBmb3JlZ3JvdW5kSWNvblJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0lzVmFsaWRJY29uUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgSXNWYWxpZEljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhJc1ZhbGlkSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZEljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1ZhbGlkSWNvblJlZih0aGVJY29uUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVmFsaWRJY29uUmVmKHRoZUljb25SZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBJY29uU2VydmljZXNVc2FnZUZsYWdzIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3M7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBQbG90SWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKFBsb3RJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90SWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90SWNvblJlZigmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25SZWYoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QdEluSWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgdGVzdFB0OwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgdGVzdFB0OworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUHRJbkljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhQdEluSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHRJbkljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQdEluSWNvblJlZigmdGVzdFB0LAotCSAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJbkljb25SZWYoJnRlc3RQdCwKKyAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVjdEluSWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCB0ZXN0UmVjdDsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgUmVjdCBpY29uUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3M7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBSZWN0SW5JY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZWN0SW5JY29uUmVmKCZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJlY3RJbkljb25SZWYoJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICBpY29uU2VydmljZXNVc2FnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0ljb25SZWZUb1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgdGhlUmduOwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblNlcnZpY2VzVXNhZ2VGbGFncyBpY29uU2VydmljZXNVc2FnZUZsYWdzOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdGhlUmduOworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyBpY29uU2VydmljZXNVc2FnZUZsYWdzOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgSWNvblJlZlRvUmduCi0JUHlNYWNfUFJFQ0hFQ0soSWNvblJlZlRvUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJY29uUmVmVG9SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvblJlZlRvUmduKHRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25SZWZUb1Jnbih0aGVSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvblNpemVzRnJvbUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQ7Ci0JSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQ7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyOworICAgIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIEdldEljb25TaXplc0Zyb21JY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblNpemVzRnJvbUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25TaXplc0Zyb21JY29uUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlbGVjdG9ySW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvblNpemVzRnJvbUljb25SZWYoaWNvblNlbGVjdG9ySW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VsZWN0b3JPdXRwdXRQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGljb25TZWxlY3Rvck91dHB1dFB0cik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VsZWN0b3JJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uU2l6ZXNGcm9tSWNvblJlZihpY29uU2VsZWN0b3JJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TZWxlY3Rvck91dHB1dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblNlbGVjdG9yT3V0cHV0UHRyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fRmx1c2hJY29uUmVmcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGljb25UeXBlOwogI2lmbmRlZiBGbHVzaEljb25SZWZzCi0JUHlNYWNfUFJFQ0hFQ0soRmx1c2hJY29uUmVmcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmx1c2hJY29uUmVmcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hJY29uUmVmcyhjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hJY29uUmVmcyhjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fRmx1c2hJY29uUmVmc0J5Vm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiB2UmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiB2UmVmTnVtOwogI2lmbmRlZiBGbHVzaEljb25SZWZzQnlWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhGbHVzaEljb25SZWZzQnlWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsdXNoSWNvblJlZnNCeVZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hJY29uUmVmc0J5Vm9sdW1lKHZSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGbHVzaEljb25SZWZzQnlWb2x1bWUodlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1NldEN1c3RvbUljb25zRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgdlJlZk51bTsKLQlCb29sZWFuIGVuYWJsZUN1c3RvbUljb25zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiB2UmVmTnVtOworICAgIEJvb2xlYW4gZW5hYmxlQ3VzdG9tSWNvbnM7CiAjaWZuZGVmIFNldEN1c3RvbUljb25zRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKFNldEN1c3RvbUljb25zRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q3VzdG9tSWNvbnNFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVDdXN0b21JY29ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRDdXN0b21JY29uc0VuYWJsZWQodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUN1c3RvbUljb25zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlQ3VzdG9tSWNvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q3VzdG9tSWNvbnNFbmFibGVkKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVDdXN0b21JY29ucyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEN1c3RvbUljb25zRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgdlJlZk51bTsKLQlCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKKyAgICBCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZDsKICNpZm5kZWYgR2V0Q3VzdG9tSWNvbnNFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q3VzdG9tSWNvbnNFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDdXN0b21JY29uc0VuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEN1c3RvbUljb25zRW5hYmxlZCh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1c3RvbUljb25zRW5hYmxlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgY3VzdG9tSWNvbnNFbmFibGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q3VzdG9tSWNvbnNFbmFibGVkKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VzdG9tSWNvbnNFbmFibGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21JY29uc0VuYWJsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9Jc0ljb25SZWZNYXNrRW1wdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUljb25SZWYgaWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgSWNvblJlZiBpY29uUmVmOwogI2lmbmRlZiBJc0ljb25SZWZNYXNrRW1wdHkKLQlQeU1hY19QUkVDSEVDSyhJc0ljb25SZWZNYXNrRW1wdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKElzSWNvblJlZk1hc2tFbXB0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzSWNvblJlZk1hc2tFbXB0eShpY29uUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzSWNvblJlZk1hc2tFbXB0eShpY29uUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvblJlZlZhcmlhbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUljb25SZWYgX3J2OwotCUljb25SZWYgaW5JY29uUmVmOwotCU9TVHlwZSBpblZhcmlhbnQ7Ci0JSWNvblRyYW5zZm9ybVR5cGUgb3V0VHJhbnNmb3JtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJY29uUmVmIF9ydjsKKyAgICBJY29uUmVmIGluSWNvblJlZjsKKyAgICBPU1R5cGUgaW5WYXJpYW50OworICAgIEljb25UcmFuc2Zvcm1UeXBlIG91dFRyYW5zZm9ybTsKICNpZm5kZWYgR2V0SWNvblJlZlZhcmlhbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmVmFyaWFudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZlZhcmlhbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5JY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblZhcmlhbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRJY29uUmVmVmFyaWFudChpbkljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5WYXJpYW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcmFuc2Zvcm0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRUcmFuc2Zvcm0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5WYXJpYW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0SWNvblJlZlZhcmlhbnQoaW5JY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VHJhbnNmb3JtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHJhbnNmb3JtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBjcmVhdG9yOwotCU9TVHlwZSBpY29uVHlwZTsKLQlGU1NwZWMgaWNvbkZpbGU7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKKyAgICBGU1NwZWMgaWNvbkZpbGU7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUKLQlQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmaWNvbkZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlKGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmlsZShjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWFkSWNvbkZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGljb25GaWxlOwotCUljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgaWNvbkZpbGU7CisgICAgSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwogI2lmbmRlZiBSZWFkSWNvbkZpbGUKLQlQeU1hY19QUkVDSEVDSyhSZWFkSWNvbkZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlYWRJY29uRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlYWRJY29uRmlsZSgmaWNvbkZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmaWNvbkZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVhZEljb25GaWxlKCZpY29uRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmFtaWx5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvbkZhbWlseSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlYWRJY29uRnJvbUZTUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIHJlZjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgcmVmOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKICNpZm5kZWYgUmVhZEljb25Gcm9tRlNSZWYKLQlQeU1hY19QUkVDSEVDSyhSZWFkSWNvbkZyb21GU1JlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVhZEljb25Gcm9tRlNSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWFkSWNvbkZyb21GU1JlZigmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVhZEljb25Gcm9tRlNSZWYoJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fV3JpdGVJY29uRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7Ci0JRlNTcGVjIGljb25GaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBGU1NwZWMgaWNvbkZpbGU7CiAjaWZuZGVmIFdyaXRlSWNvbkZpbGUKLQlQeU1hY19QUkVDSEVDSyhXcml0ZUljb25GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhXcml0ZUljb25GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFdyaXRlSWNvbkZpbGUoaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFdyaXRlSWNvbkZpbGUoaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBJY25fbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0Q0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldENJY29uLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaWNvbklEKSAtPiAoQ0ljb25IYW5kbGUgX3J2KSIpfSwKLQl7IlBsb3RDSWNvbiIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIENJY29uSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlQ0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VDSWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ljb25IYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKLQl7IkdldEljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb24sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpY29uSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlBsb3RJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKLQl7IlBsb3RJY29uSUQiLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RJY29uSUQsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgU0ludDE2IHRoZVJlc0lEKSAtPiBOb25lIil9LAotCXsiTmV3SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9OZXdJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIil9LAotCXsiQWRkSWNvblRvU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0FkZEljb25Ub1N1aXRlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdGhlSWNvbkRhdGEsIEljb25TdWl0ZVJlZiB0aGVTdWl0ZSwgUmVzVHlwZSB0aGVUeXBlKSAtPiBOb25lIil9LAotCXsiR2V0SWNvbkZyb21TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvbkZyb21TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBSZXNUeXBlIHRoZVR5cGUpIC0+IChIYW5kbGUgdGhlSWNvbkRhdGEpIil9LAotCXsiR2V0SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB0aGVSZXNJRCwgSWNvblNlbGVjdG9yVmFsdWUgc2VsZWN0b3IpIC0+IChJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSIpfSwKLQl7IkRpc3Bvc2VJY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUsIEJvb2xlYW4gZGlzcG9zZURhdGEpIC0+IE5vbmUiKX0sCi0JeyJQbG90SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIC0+IE5vbmUiKX0sCi0JeyJMb2FkSWNvbkNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Mb2FkSWNvbkNhY2hlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25DYWNoZVJlZiB0aGVJY29uQ2FjaGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fR2V0TGFiZWwsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBsYWJlbE51bWJlciwgU3RyMjU1IGxhYmVsU3RyaW5nKSAtPiAoUkdCQ29sb3IgbGFiZWxDb2xvcikiKX0sCi0JeyJQdEluSWNvbklEIiwgKFB5Q0Z1bmN0aW9uKUljbl9QdEluSWNvbklELCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0ZXN0UHQsIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBTSW50MTYgaWNvbklEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiUHRJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFB0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlJlY3RJbkljb25JRCIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvbklELCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgU0ludDE2IGljb25JRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlJlY3RJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ikljb25JRFRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uSURUb1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbiwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIFNJbnQxNiBpY29uSUQpIC0+IE5vbmUiKX0sCi0JeyJJY29uU3VpdGVUb1JnbiIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9SZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSAtPiBOb25lIil9LAotCXsiU2V0U3VpdGVMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fU2V0U3VpdGVMYWJlbCwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBTSW50MTYgdGhlTGFiZWwpIC0+IE5vbmUiKX0sCi0JeyJHZXRTdWl0ZUxhYmVsIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRTdWl0ZUxhYmVsLCAxLAotCSBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgdGhlU3VpdGUpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlBsb3RJY29uSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbkhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKLQl7IlBsb3RTSUNOSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90U0lDTkhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlU0lDTikgLT4gTm9uZSIpfSwKLQl7IlBsb3RDSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIENJY29uSGFuZGxlIHRoZUNJY29uKSAtPiBOb25lIil9LAotCXsiSWNvblJlZlRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblJlZlRvSWNvbkZhbWlseSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7Ikljb25GYW1pbHlUb0ljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fSWNvbkZhbWlseVRvSWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIEljb25TZWxlY3RvclZhbHVlIHdoaWNoSWNvbnMpIC0+IChJY29uU3VpdGVSZWYgaWNvblN1aXRlKSIpfSwKLQl7Ikljb25TdWl0ZVRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9JY29uRmFtaWx5LCAxLAotCSBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgaWNvblN1aXRlLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7IlNldEljb25GYW1pbHlEYXRhIiwgKFB5Q0Z1bmN0aW9uKUljbl9TZXRJY29uRmFtaWx5RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5LCBPU1R5cGUgaWNvblR5cGUsIEhhbmRsZSBoKSAtPiBOb25lIil9LAotCXsiR2V0SWNvbkZhbWlseURhdGEiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25GYW1pbHlEYXRhLCAxLAotCSBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIE9TVHlwZSBpY29uVHlwZSwgSGFuZGxlIGgpIC0+IE5vbmUiKX0sCi0JeyJHZXRJY29uUmVmT3duZXJzIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmT3duZXJzLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChVSW50MTYgb3duZXJzKSIpfSwKLQl7IkFjcXVpcmVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9BY3F1aXJlSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiBOb25lIil9LAotCXsiUmVsZWFzZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1JlbGVhc2VJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCi0JeyJHZXRJY29uUmVmRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZGcm9tRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUpIC0+IChJY29uUmVmIHRoZUljb25SZWYsIFNJbnQxNiB0aGVMYWJlbCkiKX0sCi0JeyJHZXRJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdlJlZk51bSwgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJHZXRJY29uUmVmRnJvbUZvbGRlciIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblJlZkZyb21Gb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtLCBTSW50MzIgcGFyZW50Rm9sZGVySUQsIFNJbnQzMiBmb2xkZXJJRCwgU0ludDggYXR0cmlidXRlcywgU0ludDggYWNjZXNzUHJpdmlsZWdlcykgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHksIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pSWNuX1JlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSwgRlNTcGVjIHJlc291cmNlRmlsZSwgU0ludDE2IHJlc291cmNlSUQpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAotCXsiUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tRlNSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTUmVmIGljb25GaWxlKSAtPiAoSWNvblJlZiB0aGVJY29uUmVmKSIpfSwKLQl7IlVucmVnaXN0ZXJJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9VbnJlZ2lzdGVySWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1VwZGF0ZUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKLQl7Ik92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilJY25fT3ZlcnJpZGVJY29uUmVmRnJvbVJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYsIEZTU3BlYyByZXNvdXJjZUZpbGUsIFNJbnQxNiByZXNvdXJjZUlEKSAtPiBOb25lIil9LAotCXsiT3ZlcnJpZGVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9PdmVycmlkZUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgb2xkSWNvblJlZiwgSWNvblJlZiBuZXdJY29uUmVmKSAtPiBOb25lIil9LAotCXsiUmVtb3ZlSWNvblJlZk92ZXJyaWRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZW1vdmVJY29uUmVmT3ZlcnJpZGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKLQl7IkNvbXBvc2l0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0NvbXBvc2l0ZUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIC0+IChJY29uUmVmIGNvbXBvc2l0ZUljb25SZWYpIil9LAotCXsiSXNJY29uUmVmQ29tcG9zaXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Jc0ljb25SZWZDb21wb3NpdGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgY29tcG9zaXRlSWNvblJlZikgLT4gKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIil9LAotCXsiSXNWYWxpZEljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0lzVmFsaWRJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJQbG90SWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLCBJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCi0JeyJQdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiUmVjdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0ZXN0UmVjdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSWNvblJlZlRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uUmVmVG9SZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKLQl7IkdldEljb25TaXplc0Zyb21JY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU2l6ZXNGcm9tSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQsIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyKSIpfSwKLQl7IkZsdXNoSWNvblJlZnMiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnMsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUpIC0+IE5vbmUiKX0sCi0JeyJGbHVzaEljb25SZWZzQnlWb2x1bWUiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnNCeVZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX1NldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0sIEJvb2xlYW4gZW5hYmxlQ3VzdG9tSWNvbnMpIC0+IE5vbmUiKX0sCi0JeyJHZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IChCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZCkiKX0sCi0JeyJJc0ljb25SZWZNYXNrRW1wdHkiLCAoUHlDRnVuY3Rpb24pSWNuX0lzSWNvblJlZk1hc2tFbXB0eSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiBpY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0SWNvblJlZlZhcmlhbnQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZWYXJpYW50LCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIGluSWNvblJlZiwgT1NUeXBlIGluVmFyaWFudCkgLT4gKEljb25SZWYgX3J2LCBJY29uVHJhbnNmb3JtVHlwZSBvdXRUcmFuc2Zvcm0pIil9LAotCXsiUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTU3BlYyBpY29uRmlsZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJSZWFkSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1JlYWRJY29uRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGljb25GaWxlKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7IlJlYWRJY29uRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWFkSWNvbkZyb21GU1JlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcmVmKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7IldyaXRlSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1dyaXRlSWNvbkZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSwgRlNTcGVjIGljb25GaWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldENJY29uLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaWNvbklEKSAtPiAoQ0ljb25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlBsb3RDSWNvbiIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIENJY29uSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCisgICAgeyJEaXNwb3NlQ0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VDSWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ljb25IYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldEljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpY29uSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlBsb3RJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKKyAgICB7IlBsb3RJY29uSUQiLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RJY29uSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgU0ludDE2IHRoZVJlc0lEKSAtPiBOb25lIil9LAorICAgIHsiTmV3SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9OZXdJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIil9LAorICAgIHsiQWRkSWNvblRvU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0FkZEljb25Ub1N1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgdGhlSWNvbkRhdGEsIEljb25TdWl0ZVJlZiB0aGVTdWl0ZSwgUmVzVHlwZSB0aGVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiR2V0SWNvbkZyb21TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvbkZyb21TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBSZXNUeXBlIHRoZVR5cGUpIC0+IChIYW5kbGUgdGhlSWNvbkRhdGEpIil9LAorICAgIHsiR2V0SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB0aGVSZXNJRCwgSWNvblNlbGVjdG9yVmFsdWUgc2VsZWN0b3IpIC0+IChJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSIpfSwKKyAgICB7IkRpc3Bvc2VJY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUsIEJvb2xlYW4gZGlzcG9zZURhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJQbG90SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIC0+IE5vbmUiKX0sCisgICAgeyJMb2FkSWNvbkNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Mb2FkSWNvbkNhY2hlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25DYWNoZVJlZiB0aGVJY29uQ2FjaGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fR2V0TGFiZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBsYWJlbE51bWJlciwgU3RyMjU1IGxhYmVsU3RyaW5nKSAtPiAoUkdCQ29sb3IgbGFiZWxDb2xvcikiKX0sCisgICAgeyJQdEluSWNvbklEIiwgKFB5Q0Z1bmN0aW9uKUljbl9QdEluSWNvbklELCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0ZXN0UHQsIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBTSW50MTYgaWNvbklEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUHRJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFB0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlJlY3RJbkljb25JRCIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvbklELCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgU0ludDE2IGljb25JRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlJlY3RJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ikljb25JRFRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uSURUb1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbiwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIFNJbnQxNiBpY29uSUQpIC0+IE5vbmUiKX0sCisgICAgeyJJY29uU3VpdGVUb1JnbiIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSAtPiBOb25lIil9LAorICAgIHsiU2V0U3VpdGVMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fU2V0U3VpdGVMYWJlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBTSW50MTYgdGhlTGFiZWwpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRTdWl0ZUxhYmVsIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRTdWl0ZUxhYmVsLCAxLAorICAgICBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgdGhlU3VpdGUpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IlBsb3RJY29uSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKKyAgICB7IlBsb3RTSUNOSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90U0lDTkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlU0lDTikgLT4gTm9uZSIpfSwKKyAgICB7IlBsb3RDSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIENJY29uSGFuZGxlIHRoZUNJY29uKSAtPiBOb25lIil9LAorICAgIHsiSWNvblJlZlRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblJlZlRvSWNvbkZhbWlseSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7Ikljb25GYW1pbHlUb0ljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fSWNvbkZhbWlseVRvSWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIEljb25TZWxlY3RvclZhbHVlIHdoaWNoSWNvbnMpIC0+IChJY29uU3VpdGVSZWYgaWNvblN1aXRlKSIpfSwKKyAgICB7Ikljb25TdWl0ZVRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9JY29uRmFtaWx5LCAxLAorICAgICBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgaWNvblN1aXRlLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7IlNldEljb25GYW1pbHlEYXRhIiwgKFB5Q0Z1bmN0aW9uKUljbl9TZXRJY29uRmFtaWx5RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5LCBPU1R5cGUgaWNvblR5cGUsIEhhbmRsZSBoKSAtPiBOb25lIil9LAorICAgIHsiR2V0SWNvbkZhbWlseURhdGEiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25GYW1pbHlEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIE9TVHlwZSBpY29uVHlwZSwgSGFuZGxlIGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRJY29uUmVmT3duZXJzIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmT3duZXJzLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChVSW50MTYgb3duZXJzKSIpfSwKKyAgICB7IkFjcXVpcmVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9BY3F1aXJlSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiBOb25lIil9LAorICAgIHsiUmVsZWFzZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1JlbGVhc2VJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRJY29uUmVmRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZGcm9tRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUpIC0+IChJY29uUmVmIHRoZUljb25SZWYsIFNJbnQxNiB0aGVMYWJlbCkiKX0sCisgICAgeyJHZXRJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdlJlZk51bSwgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJHZXRJY29uUmVmRnJvbUZvbGRlciIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblJlZkZyb21Gb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtLCBTSW50MzIgcGFyZW50Rm9sZGVySUQsIFNJbnQzMiBmb2xkZXJJRCwgU0ludDggYXR0cmlidXRlcywgU0ludDggYWNjZXNzUHJpdmlsZWdlcykgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHksIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pSWNuX1JlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSwgRlNTcGVjIHJlc291cmNlRmlsZSwgU0ludDE2IHJlc291cmNlSUQpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAorICAgIHsiUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tRlNSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTUmVmIGljb25GaWxlKSAtPiAoSWNvblJlZiB0aGVJY29uUmVmKSIpfSwKKyAgICB7IlVucmVnaXN0ZXJJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9VbnJlZ2lzdGVySWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IlVwZGF0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1VwZGF0ZUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7Ik92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilJY25fT3ZlcnJpZGVJY29uUmVmRnJvbVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYsIEZTU3BlYyByZXNvdXJjZUZpbGUsIFNJbnQxNiByZXNvdXJjZUlEKSAtPiBOb25lIil9LAorICAgIHsiT3ZlcnJpZGVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9PdmVycmlkZUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgb2xkSWNvblJlZiwgSWNvblJlZiBuZXdJY29uUmVmKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlSWNvblJlZk92ZXJyaWRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZW1vdmVJY29uUmVmT3ZlcnJpZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7IkNvbXBvc2l0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0NvbXBvc2l0ZUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIC0+IChJY29uUmVmIGNvbXBvc2l0ZUljb25SZWYpIil9LAorICAgIHsiSXNJY29uUmVmQ29tcG9zaXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Jc0ljb25SZWZDb21wb3NpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgY29tcG9zaXRlSWNvblJlZikgLT4gKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIil9LAorICAgIHsiSXNWYWxpZEljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0lzVmFsaWRJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJQbG90SWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLCBJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCisgICAgeyJQdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUmVjdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0ZXN0UmVjdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSWNvblJlZlRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uUmVmVG9SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7IkdldEljb25TaXplc0Zyb21JY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU2l6ZXNGcm9tSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQsIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyKSIpfSwKKyAgICB7IkZsdXNoSWNvblJlZnMiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJGbHVzaEljb25SZWZzQnlWb2x1bWUiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnNCeVZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX1NldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0sIEJvb2xlYW4gZW5hYmxlQ3VzdG9tSWNvbnMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IChCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZCkiKX0sCisgICAgeyJJc0ljb25SZWZNYXNrRW1wdHkiLCAoUHlDRnVuY3Rpb24pSWNuX0lzSWNvblJlZk1hc2tFbXB0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiBpY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0SWNvblJlZlZhcmlhbnQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZWYXJpYW50LCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIGluSWNvblJlZiwgT1NUeXBlIGluVmFyaWFudCkgLT4gKEljb25SZWYgX3J2LCBJY29uVHJhbnNmb3JtVHlwZSBvdXRUcmFuc2Zvcm0pIil9LAorICAgIHsiUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTU3BlYyBpY29uRmlsZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJSZWFkSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1JlYWRJY29uRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGljb25GaWxlKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7IlJlYWRJY29uRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWFkSWNvbkZyb21GU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcmVmKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7IldyaXRlSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1dyaXRlSWNvbkZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSwgRlNTcGVjIGljb25GaWxlKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE1ODUsMjEgKzE1ODUsMjEgQEAKIAogdm9pZCBpbml0X0ljbih2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0ljbiIsIEljbl9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0ljbiIsIEljbl9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlJY25fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChJY25fRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBJY25fRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBJY25fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChJY25fRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBJY25fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9sYXVuY2gvX0xhdW5jaG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvbGF1bmNoL19MYXVuY2htb2R1bGUuYwppbmRleCBmYTIxZWNlLi44ODkxMmIyIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9sYXVuY2gvX0xhdW5jaG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2xhdW5jaC9fTGF1bmNobW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yNywyMSArMjcsMjEgQEAKIHN0YXRpYyBpbnQKIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGU3RyaW5nUmVmICpzcGVjKQogewotICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICAgICAgKnNwZWMgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KHYsIHNwZWMpOworICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgKnNwZWMgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQodiwgc3BlYyk7CiB9CiAKIFB5T2JqZWN0ICoKIE9wdENGU3RyaW5nUmVmT2JqX05ldyhDRlN0cmluZ1JlZiBpdCkKIHsKLSAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldyhpdCk7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldyhpdCk7CiB9CiAKIC8qCkBAIC01MSwxOSArNTEsMTkgQEAKIExTSXRlbUluZm9SZWNvcmRfTmV3KExTSXRlbUluZm9SZWNvcmQgKml0KQogewogI2lmbmRlZiBfX0xQNjRfXwotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgie3M6aXM6TyZzOk8mczpPJnM6TyZzOml9IiwKLSAgICAgICAgICAgICAgICAiZmxhZ3MiLCBpdC0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgImZpbGV0eXBlIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5maWxldHlwZSwKLSAgICAgICAgICAgICAgICAiY3JlYXRvciIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+Y3JlYXRvciwKLSAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+ZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICJpY29uRmlsZU5hbWUiLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5pY29uRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgImtpbmRJRCIsIGl0LT5raW5kSUQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ7czppczpPJnM6TyZzOk8mczpPJnM6aX0iLAorICAgICAgICAiZmxhZ3MiLCBpdC0+ZmxhZ3MsCisgICAgICAgICJmaWxldHlwZSIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+ZmlsZXR5cGUsCisgICAgICAgICJjcmVhdG9yIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5jcmVhdG9yLAorICAgICAgICAiZXh0ZW5zaW9uIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+ZXh0ZW5zaW9uLAorICAgICAgICAiaWNvbkZpbGVOYW1lIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+aWNvbkZpbGVOYW1lLAorICAgICAgICAia2luZElEIiwgaXQtPmtpbmRJRCk7CiAjZWxzZQotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgie3M6aXM6TyZzOk8mczpPJn0iLAotICAgICAgICAgICAgICAgICJmbGFncyIsIGl0LT5mbGFncywKLSAgICAgICAgICAgICAgICAiZmlsZXR5cGUiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmZpbGV0eXBlLAotICAgICAgICAgICAgICAgICJjcmVhdG9yIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5jcmVhdG9yLAotICAgICAgICAgICAgICAgICJleHRlbnNpb24iLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5leHRlbnNpb24pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ7czppczpPJnM6TyZzOk8mfSIsCisgICAgICAgICJmbGFncyIsIGl0LT5mbGFncywKKyAgICAgICAgImZpbGV0eXBlIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5maWxldHlwZSwKKyAgICAgICAgImNyZWF0b3IiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmNyZWF0b3IsCisgICAgICAgICJleHRlbnNpb24iLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5leHRlbnNpb24pOwogI2VuZGlmCiB9CiAKQEAgLTcxLDM5MSArNzEsMzkxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIGluSXRlbVJlZjsKLQlMU1JlcXVlc3RlZEluZm8gaW5XaGljaEluZm87Ci0JTFNJdGVtSW5mb1JlY29yZCBvdXRJdGVtSW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV2hpY2hJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weUl0ZW1JbmZvRm9yUmVmKCZpbkl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hpY2hJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SXRlbUluZm8pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBMU0l0ZW1JbmZvUmVjb3JkX05ldywgJm91dEl0ZW1JbmZvKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpbkl0ZW1SZWY7CisgICAgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvOworICAgIExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpbkl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldoaWNoSW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0NvcHlJdGVtSW5mb0ZvclJlZigmaW5JdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEl0ZW1JbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFNJdGVtSW5mb1JlY29yZF9OZXcsICZvdXRJdGVtSW5mbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yVVJMKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUxTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbzsKLQlMU0l0ZW1JbmZvUmVjb3JkIG91dEl0ZW1JbmZvOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV2hpY2hJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weUl0ZW1JbmZvRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEl0ZW1JbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTFNJdGVtSW5mb1JlY29yZF9OZXcsICZvdXRJdGVtSW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5VUkw7CisgICAgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvOworICAgIExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaGljaEluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNDb3B5SXRlbUluZm9Gb3JVUkwoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SXRlbUluZm8pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMU0l0ZW1JbmZvUmVjb3JkX05ldywgJm91dEl0ZW1JbmZvKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNHZXRFeHRlbnNpb25JbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVuaUNoYXIgKmluTmFtZUxlbl9faW5fXzsKLQlVbmlDaGFyQ291bnQgaW5OYW1lTGVuX19sZW5fXzsKLQlpbnQgaW5OYW1lTGVuX19pbl9sZW5fXzsKLQlVbmlDaGFyQ291bnQgb3V0RXh0U3RhcnRJbmRleDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk5hbWVMZW5fX2luX18sICZpbk5hbWVMZW5fX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5OYW1lTGVuX19sZW5fXyA9IGluTmFtZUxlbl9faW5fbGVuX187Ci0JX2VyciA9IExTR2V0RXh0ZW5zaW9uSW5mbyhpbk5hbWVMZW5fX2xlbl9fLCBpbk5hbWVMZW5fX2luX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RXh0U3RhcnRJbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RXh0U3RhcnRJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVW5pQ2hhciAqaW5OYW1lTGVuX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBpbk5hbWVMZW5fX2xlbl9fOworICAgIGludCBpbk5hbWVMZW5fX2luX2xlbl9fOworICAgIFVuaUNoYXJDb3VudCBvdXRFeHRTdGFydEluZGV4OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTmFtZUxlbl9faW5fXywgJmluTmFtZUxlbl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbk5hbWVMZW5fX2xlbl9fID0gaW5OYW1lTGVuX19pbl9sZW5fXzsKKyAgICBfZXJyID0gTFNHZXRFeHRlbnNpb25JbmZvKGluTmFtZUxlbl9fbGVuX18sIGluTmFtZUxlbl9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRFeHRTdGFydEluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFeHRTdGFydEluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNSZWYgaW5SZWY7Ci0JQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weURpc3BsYXlOYW1lRm9yUmVmKCZpblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERpc3BsYXlOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXREaXNwbGF5TmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgaW5SZWY7CisgICAgQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ29weURpc3BsYXlOYW1lRm9yUmVmKCZpblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERpc3BsYXlOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXREaXNwbGF5TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weURpc3BsYXlOYW1lRm9yVVJMKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUNGU3RyaW5nUmVmIG91dERpc3BsYXlOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weURpc3BsYXlOYW1lRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGlzcGxheU5hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dERpc3BsYXlOYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlVSTFJlZiBpblVSTDsKKyAgICBDRlN0cmluZ1JlZiBvdXREaXNwbGF5TmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0NvcHlEaXNwbGF5TmFtZUZvclVSTChpblVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERpc3BsYXlOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXREaXNwbGF5TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIGluUmVmOwotCUJvb2xlYW4gaW5IaWRlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhpZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYoJmluUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGluUmVmOworICAgIEJvb2xlYW4gaW5IaWRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhpZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYoJmluUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU1NldEV4dGVuc2lvbkhpZGRlbkZvclVSTChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlVSTFJlZiBpblVSTDsKLQlCb29sZWFuIGluSGlkZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhpZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwoaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGlkZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5VUkw7CisgICAgQm9vbGVhbiBpbkhpZGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IaWRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yVVJMKGluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NvcHlLaW5kU3RyaW5nRm9yUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIGluRlNSZWY7Ci0JQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5GU1JlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0NvcHlLaW5kU3RyaW5nRm9yUmVmKCZpbkZTUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLaW5kU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRLaW5kU3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpbkZTUmVmOworICAgIENGU3RyaW5nUmVmIG91dEtpbmRTdHJpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluRlNSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNDb3B5S2luZFN0cmluZ0ZvclJlZigmaW5GU1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0S2luZFN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0S2luZFN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JVUkwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZVUkxSZWYgaW5VUkw7Ci0JQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0NvcHlLaW5kU3RyaW5nRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLaW5kU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRLaW5kU3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlVSTFJlZiBpblVSTDsKKyAgICBDRlN0cmluZ1JlZiBvdXRLaW5kU3RyaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ29weUtpbmRTdHJpbmdGb3JVUkwoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEtpbmRTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dEtpbmRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9ySXRlbShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpbkl0ZW1SZWY7Ci0JTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKLQlGU1JlZiBvdXRBcHBSZWY7Ci0JQ0ZVUkxSZWYgb3V0QXBwVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5JdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSgmaW5JdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpbkl0ZW1SZWY7CisgICAgTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKKyAgICBGU1JlZiBvdXRBcHBSZWY7CisgICAgQ0ZVUkxSZWYgb3V0QXBwVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5JdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSgmaW5JdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGluVHlwZTsKLQlPU1R5cGUgaW5DcmVhdG9yOwotCUNGU3RyaW5nUmVmIGluRXh0ZW5zaW9uOwotCUxTUm9sZXNNYXNrIGluUm9sZU1hc2s7Ci0JRlNSZWYgb3V0QXBwUmVmOwotCUNGVVJMUmVmIG91dEFwcFVSTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbkNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbkV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNHZXRBcHBsaWNhdGlvbkZvckluZm8oaW5UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgaW5UeXBlOworICAgIE9TVHlwZSBpbkNyZWF0b3I7CisgICAgQ0ZTdHJpbmdSZWYgaW5FeHRlbnNpb247CisgICAgTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKKyAgICBGU1JlZiBvdXRBcHBSZWY7CisgICAgQ0ZVUkxSZWYgb3V0QXBwVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0Q0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9ySW5mbyhpblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5FeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9yVVJMKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUxTUm9sZXNNYXNrIGluUm9sZU1hc2s7Ci0JRlNSZWYgb3V0QXBwUmVmOwotCUNGVVJMUmVmIG91dEFwcFVSTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJvbGVNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTR2V0QXBwbGljYXRpb25Gb3JVUkwoaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGVVJMUmVmIGluVVJMOworICAgIExTUm9sZXNNYXNrIGluUm9sZU1hc2s7CisgICAgRlNSZWYgb3V0QXBwUmVmOworICAgIENGVVJMUmVmIG91dEFwcFVSTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJvbGVNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTR2V0QXBwbGljYXRpb25Gb3JVUkwoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0ZpbmRBcHBsaWNhdGlvbkZvckluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGluQ3JlYXRvcjsKLQlDRlN0cmluZ1JlZiBpbkJ1bmRsZUlEOwotCUNGU3RyaW5nUmVmIGluTmFtZTsKLQlGU1JlZiBvdXRBcHBSZWY7Ci0JQ0ZVUkxSZWYgb3V0QXBwVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0Q0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluQnVuZGxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvKGluQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVuZGxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFVSTCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm91dEFwcFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dEFwcFVSTCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIGluQ3JlYXRvcjsKKyAgICBDRlN0cmluZ1JlZiBpbkJ1bmRsZUlEOworICAgIENGU3RyaW5nUmVmIGluTmFtZTsKKyAgICBGU1JlZiBvdXRBcHBSZWY7CisgICAgQ0ZVUkxSZWYgb3V0QXBwVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0Q0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluQnVuZGxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvKGluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVuZGxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFVSTCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm91dEFwcFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dEFwcFVSTCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ2FuUmVmQWNjZXB0SXRlbShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpbkl0ZW1GU1JlZjsKLQlGU1JlZiBpblRhcmdldFJlZjsKLQlMU1JvbGVzTWFzayBpblJvbGVNYXNrOwotCUxTQWNjZXB0YW5jZUZsYWdzIGluRmxhZ3M7Ci0JQm9vbGVhbiBvdXRBY2NlcHRzSXRlbTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluSXRlbUZTUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluVGFyZ2V0UmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNDYW5SZWZBY2NlcHRJdGVtKCZpbkl0ZW1GU1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRhcmdldFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFjY2VwdHNJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRBY2NlcHRzSXRlbSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgaW5JdGVtRlNSZWY7CisgICAgRlNSZWYgaW5UYXJnZXRSZWY7CisgICAgTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKKyAgICBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzOworICAgIEJvb2xlYW4gb3V0QWNjZXB0c0l0ZW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpbkl0ZW1GU1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpblRhcmdldFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ2FuUmVmQWNjZXB0SXRlbSgmaW5JdGVtRlNSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UYXJnZXRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBY2NlcHRzSXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QWNjZXB0c0l0ZW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NhblVSTEFjY2VwdFVSTChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlVSTFJlZiBpbkl0ZW1VUkw7Ci0JQ0ZVUkxSZWYgaW5UYXJnZXRVUkw7Ci0JTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKLQlMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzOwotCUJvb2xlYW4gb3V0QWNjZXB0c0l0ZW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluSXRlbVVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVGFyZ2V0VVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNDYW5VUkxBY2NlcHRVUkwoaW5JdGVtVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblRhcmdldFVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFjY2VwdHNJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRBY2NlcHRzSXRlbSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5JdGVtVVJMOworICAgIENGVVJMUmVmIGluVGFyZ2V0VVJMOworICAgIExTUm9sZXNNYXNrIGluUm9sZU1hc2s7CisgICAgTFNBY2NlcHRhbmNlRmxhZ3MgaW5GbGFnczsKKyAgICBCb29sZWFuIG91dEFjY2VwdHNJdGVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpbkl0ZW1VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblRhcmdldFVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ2FuVVJMQWNjZXB0VVJMKGluSXRlbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYXJnZXRVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBY2NlcHRzSXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QWNjZXB0c0l0ZW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU09wZW5GU1JlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpblJlZjsKLQlGU1JlZiBvdXRMYXVuY2hlZFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNPcGVuRlNSZWYoJmluUmVmLAotCSAgICAgICAgICAgICAgICAgICAmb3V0TGF1bmNoZWRSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0TGF1bmNoZWRSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGluUmVmOworICAgIEZTUmVmIG91dExhdW5jaGVkUmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU09wZW5GU1JlZigmaW5SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICZvdXRMYXVuY2hlZFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRMYXVuY2hlZFJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTT3BlbkNGVVJMUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUNGVVJMUmVmIG91dExhdW5jaGVkVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTT3BlbkNGVVJMUmVmKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0TGF1bmNoZWRVUkwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dExhdW5jaGVkVVJMKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlVSTFJlZiBpblVSTDsKKyAgICBDRlVSTFJlZiBvdXRMYXVuY2hlZFVSTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU09wZW5DRlVSTFJlZihpblVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dExhdW5jaGVkVVJMKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRMYXVuY2hlZFVSTCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBMYXVuY2hfbWV0aG9kc1tdID0gewotCXsiTFNDb3B5SXRlbUluZm9Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yUmVmLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBpbkl0ZW1SZWYsIExTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbykgLT4gKExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm8pIil9LAotCXsiTFNDb3B5SXRlbUluZm9Gb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yVVJMLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvKSAtPiAoTFNJdGVtSW5mb1JlY29yZCBvdXRJdGVtSW5mbykiKX0sCi0JeyJMU0dldEV4dGVuc2lvbkluZm8iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTR2V0RXh0ZW5zaW9uSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGluTmFtZUxlbikgLT4gKFVuaUNoYXJDb3VudCBvdXRFeHRTdGFydEluZGV4KSIpfSwKLQl7IkxTQ29weURpc3BsYXlOYW1lRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlEaXNwbGF5TmFtZUZvclJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChDRlN0cmluZ1JlZiBvdXREaXNwbGF5TmFtZSkiKX0sCi0JeyJMU0NvcHlEaXNwbGF5TmFtZUZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWUpIil9LAotCXsiTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBpblJlZiwgQm9vbGVhbiBpbkhpZGUpIC0+IE5vbmUiKX0sCi0JeyJMU1NldEV4dGVuc2lvbkhpZGRlbkZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMLCBCb29sZWFuIGluSGlkZSkgLT4gTm9uZSIpfSwKLQl7IkxTQ29weUtpbmRTdHJpbmdGb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JSZWYsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGluRlNSZWYpIC0+IChDRlN0cmluZ1JlZiBvdXRLaW5kU3RyaW5nKSIpfSwKLQl7IkxTQ29weUtpbmRTdHJpbmdGb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZykiKX0sCi0JeyJMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGluSXRlbVJlZiwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKLQl7IkxTR2V0QXBwbGljYXRpb25Gb3JJbmZvIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9ySW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGluVHlwZSwgT1NUeXBlIGluQ3JlYXRvciwgQ0ZTdHJpbmdSZWYgaW5FeHRlbnNpb24sIExTUm9sZXNNYXNrIGluUm9sZU1hc2spIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCi0JeyJMU0dldEFwcGxpY2F0aW9uRm9yVVJMIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9yVVJMLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKLQl7IkxTRmluZEFwcGxpY2F0aW9uRm9ySW5mbyIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgaW5DcmVhdG9yLCBDRlN0cmluZ1JlZiBpbkJ1bmRsZUlELCBDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCi0JeyJMU0NhblJlZkFjY2VwdEl0ZW0iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ2FuUmVmQWNjZXB0SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5JdGVtRlNSZWYsIEZTUmVmIGluVGFyZ2V0UmVmLCBMU1JvbGVzTWFzayBpblJvbGVNYXNrLCBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRBY2NlcHRzSXRlbSkiKX0sCi0JeyJMU0NhblVSTEFjY2VwdFVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDYW5VUkxBY2NlcHRVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluSXRlbVVSTCwgQ0ZVUkxSZWYgaW5UYXJnZXRVUkwsIExTUm9sZXNNYXNrIGluUm9sZU1hc2ssIExTQWNjZXB0YW5jZUZsYWdzIGluRmxhZ3MpIC0+IChCb29sZWFuIG91dEFjY2VwdHNJdGVtKSIpfSwKLQl7IkxTT3BlbkZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU09wZW5GU1JlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChGU1JlZiBvdXRMYXVuY2hlZFJlZikiKX0sCi0JeyJMU09wZW5DRlVSTFJlZiIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNPcGVuQ0ZVUkxSZWYsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZVUkxSZWYgb3V0TGF1bmNoZWRVUkwpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTFNDb3B5SXRlbUluZm9Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yUmVmLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBpbkl0ZW1SZWYsIExTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbykgLT4gKExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm8pIil9LAorICAgIHsiTFNDb3B5SXRlbUluZm9Gb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yVVJMLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvKSAtPiAoTFNJdGVtSW5mb1JlY29yZCBvdXRJdGVtSW5mbykiKX0sCisgICAgeyJMU0dldEV4dGVuc2lvbkluZm8iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTR2V0RXh0ZW5zaW9uSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGluTmFtZUxlbikgLT4gKFVuaUNoYXJDb3VudCBvdXRFeHRTdGFydEluZGV4KSIpfSwKKyAgICB7IkxTQ29weURpc3BsYXlOYW1lRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlEaXNwbGF5TmFtZUZvclJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChDRlN0cmluZ1JlZiBvdXREaXNwbGF5TmFtZSkiKX0sCisgICAgeyJMU0NvcHlEaXNwbGF5TmFtZUZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWUpIil9LAorICAgIHsiTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBpblJlZiwgQm9vbGVhbiBpbkhpZGUpIC0+IE5vbmUiKX0sCisgICAgeyJMU1NldEV4dGVuc2lvbkhpZGRlbkZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMLCBCb29sZWFuIGluSGlkZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxTQ29weUtpbmRTdHJpbmdGb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGluRlNSZWYpIC0+IChDRlN0cmluZ1JlZiBvdXRLaW5kU3RyaW5nKSIpfSwKKyAgICB7IkxTQ29weUtpbmRTdHJpbmdGb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZykiKX0sCisgICAgeyJMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGluSXRlbVJlZiwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKKyAgICB7IkxTR2V0QXBwbGljYXRpb25Gb3JJbmZvIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9ySW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGluVHlwZSwgT1NUeXBlIGluQ3JlYXRvciwgQ0ZTdHJpbmdSZWYgaW5FeHRlbnNpb24sIExTUm9sZXNNYXNrIGluUm9sZU1hc2spIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCisgICAgeyJMU0dldEFwcGxpY2F0aW9uRm9yVVJMIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9yVVJMLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKKyAgICB7IkxTRmluZEFwcGxpY2F0aW9uRm9ySW5mbyIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgaW5DcmVhdG9yLCBDRlN0cmluZ1JlZiBpbkJ1bmRsZUlELCBDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCisgICAgeyJMU0NhblJlZkFjY2VwdEl0ZW0iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ2FuUmVmQWNjZXB0SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5JdGVtRlNSZWYsIEZTUmVmIGluVGFyZ2V0UmVmLCBMU1JvbGVzTWFzayBpblJvbGVNYXNrLCBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRBY2NlcHRzSXRlbSkiKX0sCisgICAgeyJMU0NhblVSTEFjY2VwdFVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDYW5VUkxBY2NlcHRVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluSXRlbVVSTCwgQ0ZVUkxSZWYgaW5UYXJnZXRVUkwsIExTUm9sZXNNYXNrIGluUm9sZU1hc2ssIExTQWNjZXB0YW5jZUZsYWdzIGluRmxhZ3MpIC0+IChCb29sZWFuIG91dEFjY2VwdHNJdGVtKSIpfSwKKyAgICB7IkxTT3BlbkZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU09wZW5GU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChGU1JlZiBvdXRMYXVuY2hlZFJlZikiKX0sCisgICAgeyJMU09wZW5DRlVSTFJlZiIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNPcGVuQ0ZVUkxSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZVUkxSZWYgb3V0TGF1bmNoZWRVUkwpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC00NjMsMTggKzQ2MywxOCBAQAogCiB2b2lkIGluaXRfTGF1bmNoKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0xhdW5jaCIsIExhdW5jaF9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlMYXVuY2hfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChMYXVuY2hfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBMYXVuY2hfRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0xhdW5jaCIsIExhdW5jaF9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBMYXVuY2hfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChMYXVuY2hfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBMYXVuY2hfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfTGF1bmNoID09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9saXN0L19MaXN0bW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9saXN0L19MaXN0bW9kdWxlLmMKaW5kZXggMDc5NzQwNC4uM2Y0M2IwNiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbGlzdC9fTGlzdG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2xpc3QvX0xpc3Rtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtNDEsNjkzICs0MSw2OTMgQEAKICNkZWZpbmUgTGlzdE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZMaXN0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkxpc3RfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IExpc3RPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlMaXN0SGFuZGxlIG9iX2l0c2VsZjsKLQlQeU9iamVjdCAqb2JfbGRlZl9mdW5jOwotCWludCBvYl9tdXN0X2JlX2Rpc3Bvc2VkOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBMaXN0SGFuZGxlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqb2JfbGRlZl9mdW5jOworICAgIGludCBvYl9tdXN0X2JlX2Rpc3Bvc2VkOwogfSBMaXN0T2JqZWN0OwogCiBQeU9iamVjdCAqTGlzdE9ial9OZXcoTGlzdEhhbmRsZSBpdHNlbGYpCiB7Ci0JTGlzdE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTGlzdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIExpc3QiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhMaXN0T2JqZWN0LCAmTGlzdF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfbGRlZl9mdW5jID0gTlVMTDsKLQlpdC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDE7Ci0JU2V0TGlzdFJlZkNvbihpdHNlbGYsIChsb25nKWl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgTGlzdE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTGlzdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIExpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhMaXN0T2JqZWN0LCAmTGlzdF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfbGRlZl9mdW5jID0gTlVMTDsKKyAgICBpdC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDE7CisgICAgU2V0TGlzdFJlZkNvbihpdHNlbGYsIChsb25nKWl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBMaXN0T2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIExpc3RIYW5kbGUgKnBfaXRzZWxmKQogewotCWlmICghTGlzdE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJMaXN0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKExpc3RPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghTGlzdE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJMaXN0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKExpc3RPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBMaXN0T2JqX2RlYWxsb2MoTGlzdE9iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPm9iX2xkZWZfZnVuYyk7Ci0Jc2VsZi0+b2JfbGRlZl9mdW5jID0gTlVMTDsKLQlTZXRMaXN0UmVmQ29uKHNlbGYtPm9iX2l0c2VsZiwgKGxvbmcpMCk7Ci0JaWYgKHNlbGYtPm9iX211c3RfYmVfZGlzcG9zZWQgJiYgc2VsZi0+b2JfaXRzZWxmKSBMRGlzcG9zZShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9sZGVmX2Z1bmMpOworICAgIHNlbGYtPm9iX2xkZWZfZnVuYyA9IE5VTEw7CisgICAgU2V0TGlzdFJlZkNvbihzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOworICAgIGlmIChzZWxmLT5vYl9tdXN0X2JlX2Rpc3Bvc2VkICYmIHNlbGYtPm9iX2l0c2VsZikgTERpc3Bvc2Uoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEFkZENvbHVtbihMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0Jc2hvcnQgY291bnQ7Ci0Jc2hvcnQgY29sTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTEFkZENvbHVtbihjb3VudCwKLQkgICAgICAgICAgICAgICAgIGNvbE51bSwKLQkgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgY291bnQ7CisgICAgc2hvcnQgY29sTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTEFkZENvbHVtbihjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbE51bSwKKyAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEFkZFJvdyhMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0Jc2hvcnQgY291bnQ7Ci0Jc2hvcnQgcm93TnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmcm93TnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTEFkZFJvdyhjb3VudCwKLQkgICAgICAgICAgICAgIHJvd051bSwKLQkgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgY291bnQ7CisgICAgc2hvcnQgcm93TnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93TnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTEFkZFJvdyhjb3VudCwKKyAgICAgICAgICAgICAgICAgIHJvd051bSwKKyAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTERlbENvbHVtbihMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBjb3VudDsKLQlzaG9ydCBjb2xOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlMRGVsQ29sdW1uKGNvdW50LAotCSAgICAgICAgICAgY29sTnVtLAotCSAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBjb3VudDsKKyAgICBzaG9ydCBjb2xOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMRGVsQ29sdW1uKGNvdW50LAorICAgICAgICAgICAgICAgY29sTnVtLAorICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTERlbFJvdyhMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBjb3VudDsKLQlzaG9ydCByb3dOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZyb3dOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlMRGVsUm93KGNvdW50LAotCSAgICAgICAgcm93TnVtLAotCSAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBjb3VudDsKKyAgICBzaG9ydCByb3dOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3dOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMRGVsUm93KGNvdW50LAorICAgICAgICByb3dOdW0sCisgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xHZXRTZWxlY3QoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQm9vbGVhbiBuZXh0OwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5leHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExHZXRTZWxlY3QobmV4dCwKLQkgICAgICAgICAgICAgICAgICZ0aGVDZWxsLAotCSAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBCb29sZWFuIG5leHQ7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTEdldFNlbGVjdChuZXh0LAorICAgICAgICAgICAgICAgICAgICAgJnRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgdGhlQ2VsbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MTGFzdENsaWNrKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTExhc3RDbGljayhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTExhc3RDbGljayhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MTmV4dENlbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQm9vbGVhbiBoTmV4dDsKLQlCb29sZWFuIHZOZXh0OwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoTmV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZOZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTmV4dENlbGwoaE5leHQsCi0JICAgICAgICAgICAgICAgIHZOZXh0LAotCSAgICAgICAgICAgICAgICAmdGhlQ2VsbCwKLQkgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBCb29sZWFuIGhOZXh0OworICAgIEJvb2xlYW4gdk5leHQ7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhOZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdk5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExOZXh0Q2VsbChoTmV4dCwKKyAgICAgICAgICAgICAgICAgICAgdk5leHQsCisgICAgICAgICAgICAgICAgICAgICZ0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgdGhlQ2VsbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MU2l6ZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBsaXN0V2lkdGg7Ci0Jc2hvcnQgbGlzdEhlaWdodDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaXN0V2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaXN0SGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTFNpemUobGlzdFdpZHRoLAotCSAgICAgIGxpc3RIZWlnaHQsCi0JICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBsaXN0V2lkdGg7CisgICAgc2hvcnQgbGlzdEhlaWdodDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0SGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTFNpemUobGlzdFdpZHRoLAorICAgICAgICAgIGxpc3RIZWlnaHQsCisgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTFNldERyYXdpbmdNb2RlKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZHJhd0l0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHJhd0l0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTFNldERyYXdpbmdNb2RlKGRyYXdJdCwKLQkgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGRyYXdJdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyYXdJdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExTZXREcmF3aW5nTW9kZShkcmF3SXQsCisgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xTY3JvbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgZENvbHM7Ci0Jc2hvcnQgZFJvd3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZENvbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZkUm93cykpCi0JCXJldHVybiBOVUxMOwotCUxTY3JvbGwoZENvbHMsCi0JICAgICAgICBkUm93cywKLQkgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgZENvbHM7CisgICAgc2hvcnQgZFJvd3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZENvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkUm93cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExTY3JvbGwoZENvbHMsCisgICAgICAgIGRSb3dzLAorICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MQXV0b1Njcm9sbChMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTEF1dG9TY3JvbGwoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTEF1dG9TY3JvbGwoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTFVwZGF0ZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgdGhlUmduOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlMVXBkYXRlKHRoZVJnbiwKLQkgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHRoZVJnbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTFVwZGF0ZSh0aGVSZ24sCisgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xBY3RpdmF0ZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGFjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdCkpCi0JCXJldHVybiBOVUxMOwotCUxBY3RpdmF0ZShhY3QsCi0JICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBhY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMQWN0aXZhdGUoYWN0LAorICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MQ2VsbFNpemUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgY1NpemU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTENlbGxTaXplKGNTaXplLAotCSAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IGNTaXplOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZjU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExDZWxsU2l6ZShjU2l6ZSwKKyAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTENsaWNrKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0OwotCUV2ZW50TW9kaWZpZXJzIG1vZGlmaWVyczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTENsaWNrKHB0LAotCSAgICAgICAgICAgICBtb2RpZmllcnMsCi0JICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCBwdDsKKyAgICBFdmVudE1vZGlmaWVycyBtb2RpZmllcnM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExDbGljayhwdCwKKyAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xBZGRUb0NlbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlzaG9ydCBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JUG9pbnQgdGhlQ2VsbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI08mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlMQWRkVG9DZWxsKGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgdGhlQ2VsbCwKLQkgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBzaG9ydCBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBMQWRkVG9DZWxsKGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xDbHJDZWxsKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlMQ2xyQ2VsbCh0aGVDZWxsLAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExDbHJDZWxsKHRoZUNlbGwsCisgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEdldENlbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqZGF0YVB0cl9fb3V0X187Ci0Jc2hvcnQgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaU8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGRhdGFQdHJfX291dF9fID0gbWFsbG9jKGRhdGFQdHJfX2luX2xlbl9fKSkgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZGF0YVB0cl9fZXJyb3JfXzsKLQl9Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlMR2V0Q2VsbChkYXRhUHRyX19vdXRfXywgJmRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgIHRoZUNlbGwsCi0JICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgKGludClkYXRhUHRyX19sZW5fXyk7Ci0JZnJlZShkYXRhUHRyX19vdXRfXyk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIHNob3J0IGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQb2ludCB0aGVDZWxsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGRhdGFQdHJfX2Vycm9yX187CisgICAgfQorICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgTEdldENlbGwoZGF0YVB0cl9fb3V0X18sICZkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICB0aGVDZWxsLAorICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xSZWN0KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgY2VsbFJlY3Q7Ci0JUG9pbnQgdGhlQ2VsbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCUxSZWN0KCZjZWxsUmVjdCwKLQkgICAgICB0aGVDZWxsLAotCSAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmY2VsbFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGNlbGxSZWN0OworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMUmVjdCgmY2VsbFJlY3QsCisgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNlbGxSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xTZXRDZWxsKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0Jc2hvcnQgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JTFNldENlbGwoZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18sCi0JICAgICAgICAgdGhlQ2VsbCwKLQkgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgc2hvcnQgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgTFNldENlbGwoZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18sCisgICAgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MU2V0U2VsZWN0KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gc2V0SXQ7Ci0JUG9pbnQgdGhlQ2VsbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2V0SXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCUxTZXRTZWxlY3Qoc2V0SXQsCi0JICAgICAgICAgICB0aGVDZWxsLAotCSAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIHNldEl0OworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldEl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMU2V0U2VsZWN0KHNldEl0LAorICAgICAgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xEcmF3KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlMRHJhdyh0aGVDZWxsLAotCSAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExEcmF3KHRoZUNlbGwsCisgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEdldENlbGxEYXRhTG9jYXRpb24oTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgb2Zmc2V0OwotCXNob3J0IGxlbjsKLQlQb2ludCB0aGVDZWxsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTEdldENlbGxEYXRhTG9jYXRpb24oJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAmbGVuLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUNlbGwsCi0JICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgbGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgb2Zmc2V0OworICAgIHNob3J0IGxlbjsKKyAgICBQb2ludCB0aGVDZWxsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTEdldENlbGxEYXRhTG9jYXRpb24oJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RQb3J0KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0UG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdFZlcnRpY2FsU2Nyb2xsQmFyKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xIYW5kbGUgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0VmVydGljYWxTY3JvbGxCYXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdFZlcnRpY2FsU2Nyb2xsQmFyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RIb3Jpem9udGFsU2Nyb2xsQmFyKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xIYW5kbGUgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xIYW5kbGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0QWN0aXZlKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0QWN0aXZlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdEFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RDbGlja1RpbWUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdENsaWNrVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdENsaWNrVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RSZWZDb24oTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdFJlZkNvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdFJlZkNvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3REZWZpbml0aW9uKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3REZWZpbml0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdERlZmluaXRpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdFVzZXJIYW5kbGUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdFVzZXJIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0VXNlckhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0RGF0YUhhbmRsZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEYXRhSGFuZGxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdERhdGFIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEYXRhSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdERhdGFIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdEZsYWdzKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9wdGlvbkJpdHMgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0RmxhZ3MoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9wdGlvbkJpdHMgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0RmxhZ3MoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0U2VsZWN0aW9uRmxhZ3MoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT3B0aW9uQml0cyBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3RTZWxlY3Rpb25GbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT3B0aW9uQml0cyBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldExpc3RTZWxlY3Rpb25GbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX2FzX1Jlc291cmNlKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgTGlzdE9ial9tZXRob2RzW10gPSB7Ci0JeyJMQWRkQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZENvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJMQWRkUm93IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZFJvdywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IHJvd051bSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJMRGVsQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERlbENvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gTm9uZSIpfSwKLQl7IkxEZWxSb3ciLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MRGVsUm93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjb3VudCwgc2hvcnQgcm93TnVtKSAtPiBOb25lIil9LAotCXsiTEdldFNlbGVjdCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRTZWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gbmV4dCwgUG9pbnQgdGhlQ2VsbCkgLT4gKEJvb2xlYW4gX3J2LCBQb2ludCB0aGVDZWxsKSIpfSwKLQl7IkxMYXN0Q2xpY2siLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MTGFzdENsaWNrLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQb2ludCBfcnYpIil9LAotCXsiTE5leHRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTE5leHRDZWxsLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGhOZXh0LCBCb29sZWFuIHZOZXh0LCBQb2ludCB0aGVDZWxsKSAtPiAoQm9vbGVhbiBfcnYsIFBvaW50IHRoZUNlbGwpIil9LAotCXsiTFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbGlzdFdpZHRoLCBzaG9ydCBsaXN0SGVpZ2h0KSAtPiBOb25lIil9LAotCXsiTFNldERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldERyYXdpbmdNb2RlLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGRyYXdJdCkgLT4gTm9uZSIpfSwKLQl7IkxTY3JvbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkQ29scywgc2hvcnQgZFJvd3MpIC0+IE5vbmUiKX0sCi0JeyJMQXV0b1Njcm9sbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBdXRvU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJMVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFVwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbikgLT4gTm9uZSIpfSwKLQl7IkxBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBY3RpdmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBhY3QpIC0+IE5vbmUiKX0sCi0JeyJMQ2VsbFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2VsbFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGNTaXplKSAtPiBOb25lIil9LAotCXsiTENsaWNrIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTENsaWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTEFkZFRvQ2VsbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBZGRUb0NlbGwsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiBOb25lIil9LAotCXsiTENsckNlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2xyQ2VsbCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKLQl7IkxHZXRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEdldENlbGwsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiAoQnVmZmVyIGRhdGFQdHIpIil9LAotCXsiTFJlY3QiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gKFJlY3QgY2VsbFJlY3QpIil9LAotCXsiTFNldENlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2V0Q2VsbCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGRhdGFQdHIsIFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCi0JeyJMU2V0U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldFNlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBzZXRJdCwgUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKLQl7IkxEcmF3IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERyYXcsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCi0JeyJMR2V0Q2VsbERhdGFMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRDZWxsRGF0YUxvY2F0aW9uLCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0aGVDZWxsKSAtPiAoc2hvcnQgb2Zmc2V0LCBzaG9ydCBsZW4pIil9LAotCXsiR2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKLQl7IkdldExpc3RWZXJ0aWNhbFNjcm9sbEJhciIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RWZXJ0aWNhbFNjcm9sbEJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdEhvcml6b250YWxTY3JvbGxCYXIiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdEFjdGl2ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldExpc3RDbGlja1RpbWUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0Q2xpY2tUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkdldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkdldExpc3REZWZpbml0aW9uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdERlZmluaXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdFVzZXJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0VXNlckhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRMaXN0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3REYXRhSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChEYXRhSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRMaXN0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9wdGlvbkJpdHMgX3J2KSIpfSwKLQl7IkdldExpc3RTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RTZWxlY3Rpb25GbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoT3B0aW9uQml0cyBfcnYpIil9LAotCXsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9hc19SZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJMQWRkQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZENvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJMQWRkUm93IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZFJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IHJvd051bSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJMRGVsQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERlbENvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkxEZWxSb3ciLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MRGVsUm93LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb3VudCwgc2hvcnQgcm93TnVtKSAtPiBOb25lIil9LAorICAgIHsiTEdldFNlbGVjdCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gbmV4dCwgUG9pbnQgdGhlQ2VsbCkgLT4gKEJvb2xlYW4gX3J2LCBQb2ludCB0aGVDZWxsKSIpfSwKKyAgICB7IkxMYXN0Q2xpY2siLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MTGFzdENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBfcnYpIil9LAorICAgIHsiTE5leHRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTE5leHRDZWxsLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGhOZXh0LCBCb29sZWFuIHZOZXh0LCBQb2ludCB0aGVDZWxsKSAtPiAoQm9vbGVhbiBfcnYsIFBvaW50IHRoZUNlbGwpIil9LAorICAgIHsiTFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGlzdFdpZHRoLCBzaG9ydCBsaXN0SGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiTFNldERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldERyYXdpbmdNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGRyYXdJdCkgLT4gTm9uZSIpfSwKKyAgICB7IkxTY3JvbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkQ29scywgc2hvcnQgZFJvd3MpIC0+IE5vbmUiKX0sCisgICAgeyJMQXV0b1Njcm9sbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBdXRvU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJMVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkxBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBY3RpdmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBhY3QpIC0+IE5vbmUiKX0sCisgICAgeyJMQ2VsbFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2VsbFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGNTaXplKSAtPiBOb25lIil9LAorICAgIHsiTENsaWNrIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTEFkZFRvQ2VsbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBZGRUb0NlbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiBOb25lIil9LAorICAgIHsiTENsckNlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2xyQ2VsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKKyAgICB7IkxHZXRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEdldENlbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiAoQnVmZmVyIGRhdGFQdHIpIil9LAorICAgIHsiTFJlY3QiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gKFJlY3QgY2VsbFJlY3QpIil9LAorICAgIHsiTFNldENlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2V0Q2VsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGRhdGFQdHIsIFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCisgICAgeyJMU2V0U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldFNlbGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBzZXRJdCwgUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKKyAgICB7IkxEcmF3IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCisgICAgeyJMR2V0Q2VsbERhdGFMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRDZWxsRGF0YUxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0aGVDZWxsKSAtPiAoc2hvcnQgb2Zmc2V0LCBzaG9ydCBsZW4pIil9LAorICAgIHsiR2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IkdldExpc3RWZXJ0aWNhbFNjcm9sbEJhciIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RWZXJ0aWNhbFNjcm9sbEJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdEhvcml6b250YWxTY3JvbGxCYXIiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdEFjdGl2ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RBY3RpdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldExpc3RDbGlja1RpbWUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0Q2xpY2tUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkdldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkdldExpc3REZWZpbml0aW9uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdERlZmluaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdFVzZXJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0VXNlckhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRMaXN0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3REYXRhSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChEYXRhSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRMaXN0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE9wdGlvbkJpdHMgX3J2KSIpfSwKKyAgICB7IkdldExpc3RTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RTZWxlY3Rpb25GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoT3B0aW9uQml0cyBfcnYpIil9LAorICAgIHsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9hc19SZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfZ2V0X2xpc3RGbGFncyhMaXN0T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpR2V0TGlzdEZsYWdzKHNlbGYtPm9iX2l0c2VsZikgJiAweGZmKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RGbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7CiB9CiAKIHN0YXRpYyBpbnQgTGlzdE9ial9zZXRfbGlzdEZsYWdzKExpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCWlmICghUHlBcmdfUGFyc2UodiwgIkIiLCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5saXN0RmxhZ3MpKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiQiIsICYoKnNlbGYtPm9iX2l0c2VsZiktPmxpc3RGbGFncykpIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX2dldF9zZWxGbGFncyhMaXN0T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpR2V0TGlzdFNlbGVjdGlvbkZsYWdzKHNlbGYtPm9iX2l0c2VsZikgJiAweGZmKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RTZWxlY3Rpb25GbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7CiB9CiAKIHN0YXRpYyBpbnQgTGlzdE9ial9zZXRfc2VsRmxhZ3MoTGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiQiIsICYoKnNlbGYtPm9iX2l0c2VsZiktPnNlbEZsYWdzKSkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2UodiwgIkIiLCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxGbGFncykpIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX2dldF9jZWxsU2l6ZShMaXN0T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsICgqc2VsZi0+b2JfaXRzZWxmKS0+Y2VsbFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsICgqc2VsZi0+b2JfaXRzZWxmKS0+Y2VsbFNpemUpOwogfQogCiBzdGF0aWMgaW50IExpc3RPYmpfc2V0X2NlbGxTaXplKExpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCWlmICghUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICYoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKSkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICYoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKSkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgTGlzdE9ial9nZXRzZXRsaXN0W10gPSB7Ci0JeyJsaXN0RmxhZ3MiLCAoZ2V0dGVyKUxpc3RPYmpfZ2V0X2xpc3RGbGFncywgKHNldHRlcilMaXN0T2JqX3NldF9saXN0RmxhZ3MsIE5VTEx9LAotCXsic2VsRmxhZ3MiLCAoZ2V0dGVyKUxpc3RPYmpfZ2V0X3NlbEZsYWdzLCAoc2V0dGVyKUxpc3RPYmpfc2V0X3NlbEZsYWdzLCBOVUxMfSwKLQl7ImNlbGxTaXplIiwgKGdldHRlcilMaXN0T2JqX2dldF9jZWxsU2l6ZSwgKHNldHRlcilMaXN0T2JqX3NldF9jZWxsU2l6ZSwgTlVMTH0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsibGlzdEZsYWdzIiwgKGdldHRlcilMaXN0T2JqX2dldF9saXN0RmxhZ3MsIChzZXR0ZXIpTGlzdE9ial9zZXRfbGlzdEZsYWdzLCBOVUxMfSwKKyAgICB7InNlbEZsYWdzIiwgKGdldHRlcilMaXN0T2JqX2dldF9zZWxGbGFncywgKHNldHRlcilMaXN0T2JqX3NldF9zZWxGbGFncywgTlVMTH0sCisgICAgeyJjZWxsU2l6ZSIsIChnZXR0ZXIpTGlzdE9ial9nZXRfY2VsbFNpemUsIChzZXR0ZXIpTGlzdE9ial9zZXRfY2VsbFNpemUsIE5VTEx9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtNzQyLDYxICs3NDIsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlMaXN0SGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTGlzdEhhbmRsZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBMaXN0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTGlzdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBMaXN0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoTGlzdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBMaXN0T2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IExpc3RfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfTGlzdC5MaXN0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTGlzdE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIExpc3RPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgTGlzdE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTGlzdE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgTGlzdE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlMaXN0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUxpc3RPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JTGlzdE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JTGlzdE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlMaXN0T2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JTGlzdE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0xpc3QuTGlzdCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKExpc3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBMaXN0T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIExpc3RPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIExpc3RPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIExpc3RPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTGlzdE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBMaXN0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIExpc3RPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIExpc3RPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgTGlzdE9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIExpc3RPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgTGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MDQsMjYzICs4MDQsMjYzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9DcmVhdGVDdXN0b21MaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJWaWV3OwotCVJlY3QgZGF0YUJvdW5kczsKLQlQb2ludCBjZWxsU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByVmlldzsKKyAgICBSZWN0IGRhdGFCb3VuZHM7CisgICAgUG9pbnQgY2VsbFNpemU7CiAKLQlQeU9iamVjdCAqbGlzdERlZkZ1bmM7Ci0JTGlzdERlZlNwZWMgdGhlU3BlYzsKLQlXaW5kb3dQdHIgdGhlV2luZG93OwotCUJvb2xlYW4gZHJhd0l0OwotCUJvb2xlYW4gaGFzR3JvdzsKLQlCb29sZWFuIHNjcm9sbEhvcml6OwotCUJvb2xlYW4gc2Nyb2xsVmVydDsKLQlMaXN0SGFuZGxlIG91dExpc3Q7CisgICAgUHlPYmplY3QgKmxpc3REZWZGdW5jOworICAgIExpc3REZWZTcGVjIHRoZVNwZWM7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKKyAgICBCb29sZWFuIGRyYXdJdDsKKyAgICBCb29sZWFuIGhhc0dyb3c7CisgICAgQm9vbGVhbiBzY3JvbGxIb3JpejsKKyAgICBCb29sZWFuIHNjcm9sbFZlcnQ7CisgICAgTGlzdEhhbmRsZSBvdXRMaXN0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mKGlPKU8mYmJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyVmlldywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRhdGFCb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmY2VsbFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVTcGVjLmRlZlR5cGUsICZsaXN0RGVmRnVuYywKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZkcmF3SXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoYXNHcm93LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxWZXJ0KSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJihpTylPJmJiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmclZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkYXRhQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNlbGxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlU3BlYy5kZWZUeXBlLCAmbGlzdERlZkZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJhd0l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFzR3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbEhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsVmVydCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAKLQkvKiBDYXJib24gYXBwbGljYXRpb25zIHVzZSB0aGUgQ3JlYXRlQ3VzdG9tTGlzdCBBUEkgKi8KLQl0aGVTcGVjLnUudXNlclByb2MgPSBteUxpc3REZWZGdW5jdGlvblVQUDsKLQlDcmVhdGVDdXN0b21MaXN0KCZyVmlldywKLQkgICAgICAgICAgICAgICAgICZkYXRhQm91bmRzLAotCSAgICAgICAgICAgICAgICAgY2VsbFNpemUsCi0JICAgICAgICAgICAgICAgICAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgICAgICAgIGRyYXdJdCwKLQkgICAgICAgICAgICAgICAgIGhhc0dyb3csCi0JICAgICAgICAgICAgICAgICBzY3JvbGxIb3JpeiwKLQkgICAgICAgICAgICAgICAgIHNjcm9sbFZlcnQsCi0JICAgICAgICAgICAgICAgICAmb3V0TGlzdCk7CisgICAgLyogQ2FyYm9uIGFwcGxpY2F0aW9ucyB1c2UgdGhlIENyZWF0ZUN1c3RvbUxpc3QgQVBJICovCisgICAgdGhlU3BlYy51LnVzZXJQcm9jID0gbXlMaXN0RGVmRnVuY3Rpb25VUFA7CisgICAgQ3JlYXRlQ3VzdG9tTGlzdCgmclZpZXcsCisgICAgICAgICAgICAgICAgICAgICAmZGF0YUJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgIGNlbGxTaXplLAorICAgICAgICAgICAgICAgICAgICAgJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICBkcmF3SXQsCisgICAgICAgICAgICAgICAgICAgICBoYXNHcm93LAorICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsSG9yaXosCisgICAgICAgICAgICAgICAgICAgICBzY3JvbGxWZXJ0LAorICAgICAgICAgICAgICAgICAgICAgJm91dExpc3QpOwogCiAKLQlfcmVzID0gTGlzdE9ial9OZXcob3V0TGlzdCk7Ci0JaWYgKF9yZXMgPT0gTlVMTCkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihsaXN0RGVmRnVuYyk7Ci0JKChMaXN0T2JqZWN0KilfcmVzKS0+b2JfbGRlZl9mdW5jID0gbGlzdERlZkZ1bmM7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IExpc3RPYmpfTmV3KG91dExpc3QpOworICAgIGlmIChfcmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihsaXN0RGVmRnVuYyk7CisgICAgKChMaXN0T2JqZWN0KilfcmVzKS0+b2JfbGRlZl9mdW5jID0gbGlzdERlZkZ1bmM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9MTmV3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIF9ydjsKLQlSZWN0IHJWaWV3OwotCVJlY3QgZGF0YUJvdW5kczsKLQlQb2ludCBjU2l6ZTsKLQlzaG9ydCB0aGVQcm9jOwotCVdpbmRvd1B0ciB0aGVXaW5kb3c7Ci0JQm9vbGVhbiBkcmF3SXQ7Ci0JQm9vbGVhbiBoYXNHcm93OwotCUJvb2xlYW4gc2Nyb2xsSG9yaXo7Ci0JQm9vbGVhbiBzY3JvbGxWZXJ0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJmJiYmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmclZpZXcsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkYXRhQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlUHJvYywKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZkcmF3SXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoYXNHcm93LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxWZXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE5ldygmclZpZXcsCi0JICAgICAgICAgICAmZGF0YUJvdW5kcywKLQkgICAgICAgICAgIGNTaXplLAotCSAgICAgICAgICAgdGhlUHJvYywKLQkgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgIGRyYXdJdCwKLQkgICAgICAgICAgIGhhc0dyb3csCi0JICAgICAgICAgICBzY3JvbGxIb3JpeiwKLQkgICAgICAgICAgIHNjcm9sbFZlcnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIExpc3RIYW5kbGUgX3J2OworICAgIFJlY3QgclZpZXc7CisgICAgUmVjdCBkYXRhQm91bmRzOworICAgIFBvaW50IGNTaXplOworICAgIHNob3J0IHRoZVByb2M7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKKyAgICBCb29sZWFuIGRyYXdJdDsKKyAgICBCb29sZWFuIGhhc0dyb3c7CisgICAgQm9vbGVhbiBzY3JvbGxIb3JpejsKKyAgICBCb29sZWFuIHNjcm9sbFZlcnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maE8mYmJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRhdGFCb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyYXdJdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc0dyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxIb3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbFZlcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTmV3KCZyVmlldywKKyAgICAgICAgICAgICAgICZkYXRhQm91bmRzLAorICAgICAgICAgICAgICAgY1NpemUsCisgICAgICAgICAgICAgICB0aGVQcm9jLAorICAgICAgICAgICAgICAgdGhlV2luZG93LAorICAgICAgICAgICAgICAgZHJhd0l0LAorICAgICAgICAgICAgICAgaGFzR3JvdywKKyAgICAgICAgICAgICAgIHNjcm9sbEhvcml6LAorICAgICAgICAgICAgICAgc2Nyb2xsVmVydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RWaWV3Qm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JUmVjdCB2aWV3OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdmlldykpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RWaWV3Qm91bmRzKGxpc3QsCi0JICAgICAgICAgICAgICAgICAgJnZpZXcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIFJlY3QgdmlldzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0Vmlld0JvdW5kcyhsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICZ2aWV3KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0UG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCUNHcmFmUHRyIHBvcnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRMaXN0UG9ydChsaXN0LAotCSAgICAgICAgICAgIHBvcnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0UG9ydChsaXN0LAorICAgICAgICAgICAgICAgIHBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RDZWxsSW5kZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JUG9pbnQgaW5kZW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluZGVudCkpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RDZWxsSW5kZW50KGxpc3QsCi0JICAgICAgICAgICAgICAgICAgJmluZGVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgUG9pbnQgaW5kZW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluZGVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldExpc3RDZWxsSW5kZW50KGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgJmluZGVudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfU2V0TGlzdENsaWNrVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCVNJbnQzMiB0aW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TGlzdENsaWNrVGltZShsaXN0LAotCSAgICAgICAgICAgICAgICAgdGltZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgU0ludDMyIHRpbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0Q2xpY2tUaW1lKGxpc3QsCisgICAgICAgICAgICAgICAgICAgICB0aW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0UmVmQ29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JU0ludDMyIHJlZkNvbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TGlzdFJlZkNvbihsaXN0LAotCSAgICAgICAgICAgICAgcmVmQ29uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIExpc3RIYW5kbGUgbGlzdDsKKyAgICBTSW50MzIgcmVmQ29uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0UmVmQ29uKGxpc3QsCisgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RVc2VySGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JSGFuZGxlIHVzZXJIYW5kbGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXNlckhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RVc2VySGFuZGxlKGxpc3QsCi0JICAgICAgICAgICAgICAgICAgdXNlckhhbmRsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgSGFuZGxlIHVzZXJIYW5kbGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXNlckhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldExpc3RVc2VySGFuZGxlKGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgdXNlckhhbmRsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfU2V0TGlzdEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JT3B0aW9uQml0cyBsaXN0RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpc3RGbGFncykpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RGbGFncyhsaXN0LAotCSAgICAgICAgICAgICBsaXN0RmxhZ3MpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIE9wdGlvbkJpdHMgbGlzdEZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0RmxhZ3MobGlzdCwKKyAgICAgICAgICAgICAgICAgbGlzdEZsYWdzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0U2VsZWN0aW9uRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUxpc3RIYW5kbGUgbGlzdDsKLQlPcHRpb25CaXRzIHNlbGVjdGlvbkZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3Rpb25GbGFncykpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RTZWxlY3Rpb25GbGFncyhsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgT3B0aW9uQml0cyBzZWxlY3Rpb25GbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0U2VsZWN0aW9uRmxhZ3MobGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRmxhZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X2FzX0xpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCUhhbmRsZSBoOwotCUxpc3RPYmplY3QgKmw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLCBSZXNPYmpfQ29udmVydCwgJmgpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JbCA9IChMaXN0T2JqZWN0ICopTGlzdE9ial9OZXcoYXNfTGlzdChoKSk7Ci0JbC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDA7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLCBsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBIYW5kbGUgaDsKKyAgICBMaXN0T2JqZWN0ICpsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbCA9IChMaXN0T2JqZWN0ICopTGlzdE9ial9OZXcoYXNfTGlzdChoKSk7CisgICAgbC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDA7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLCBsKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBMaXN0X21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkNyZWF0ZUN1c3RvbUxpc3QiLCAoUHlDRnVuY3Rpb24pTGlzdF9DcmVhdGVDdXN0b21MaXN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHJWaWV3LCBSZWN0IGRhdGFCb3VuZHMsIFBvaW50IGNlbGxTaXplLCBMaXN0RGVmU3BlYyB0aGVTcGVjLCBXaW5kb3dQdHIgdGhlV2luZG93LCBCb29sZWFuIGRyYXdJdCwgQm9vbGVhbiBoYXNHcm93LCBCb29sZWFuIHNjcm9sbEhvcml6LCBCb29sZWFuIHNjcm9sbFZlcnQpIC0+IChMaXN0SGFuZGxlIG91dExpc3QpIil9LAotCXsiTE5ldyIsIChQeUNGdW5jdGlvbilMaXN0X0xOZXcsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgclZpZXcsIFJlY3QgZGF0YUJvdW5kcywgUG9pbnQgY1NpemUsIHNob3J0IHRoZVByb2MsIFdpbmRvd1B0ciB0aGVXaW5kb3csIEJvb2xlYW4gZHJhd0l0LCBCb29sZWFuIGhhc0dyb3csIEJvb2xlYW4gc2Nyb2xsSG9yaXosIEJvb2xlYW4gc2Nyb2xsVmVydCkgLT4gKExpc3RIYW5kbGUgX3J2KSIpfSwKLQl7IlNldExpc3RWaWV3Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFZpZXdCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgUmVjdCB2aWV3KSAtPiBOb25lIil9LAotCXsiU2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBDR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAotCXsiU2V0TGlzdENlbGxJbmRlbnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0Q2VsbEluZGVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBQb2ludCBpbmRlbnQpIC0+IE5vbmUiKX0sCi0JeyJTZXRMaXN0Q2xpY2tUaW1lIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdENsaWNrVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBTSW50MzIgdGltZSkgLT4gTm9uZSIpfSwKLQl7IlNldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIFNJbnQzMiByZWZDb24pIC0+IE5vbmUiKX0sCi0JeyJTZXRMaXN0VXNlckhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RVc2VySGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIEhhbmRsZSB1c2VySGFuZGxlKSAtPiBOb25lIil9LAotCXsiU2V0TGlzdEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgbGlzdEZsYWdzKSAtPiBOb25lIil9LAotCXsiU2V0TGlzdFNlbGVjdGlvbkZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFNlbGVjdGlvbkZsYWdzLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgc2VsZWN0aW9uRmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJhc19MaXN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfYXNfTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzb3VyY2UpLT5MaXN0LlxuUmV0dXJucyBMaXN0IG9iamVjdCAod2hpY2ggaXMgbm90IGF1dG8tZnJlZWQhKSIpfSwKKyAgICB7IkNyZWF0ZUN1c3RvbUxpc3QiLCAoUHlDRnVuY3Rpb24pTGlzdF9DcmVhdGVDdXN0b21MaXN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJWaWV3LCBSZWN0IGRhdGFCb3VuZHMsIFBvaW50IGNlbGxTaXplLCBMaXN0RGVmU3BlYyB0aGVTcGVjLCBXaW5kb3dQdHIgdGhlV2luZG93LCBCb29sZWFuIGRyYXdJdCwgQm9vbGVhbiBoYXNHcm93LCBCb29sZWFuIHNjcm9sbEhvcml6LCBCb29sZWFuIHNjcm9sbFZlcnQpIC0+IChMaXN0SGFuZGxlIG91dExpc3QpIil9LAorICAgIHsiTE5ldyIsIChQeUNGdW5jdGlvbilMaXN0X0xOZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgclZpZXcsIFJlY3QgZGF0YUJvdW5kcywgUG9pbnQgY1NpemUsIHNob3J0IHRoZVByb2MsIFdpbmRvd1B0ciB0aGVXaW5kb3csIEJvb2xlYW4gZHJhd0l0LCBCb29sZWFuIGhhc0dyb3csIEJvb2xlYW4gc2Nyb2xsSG9yaXosIEJvb2xlYW4gc2Nyb2xsVmVydCkgLT4gKExpc3RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldExpc3RWaWV3Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFZpZXdCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgUmVjdCB2aWV3KSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBDR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdENlbGxJbmRlbnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0Q2VsbEluZGVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBQb2ludCBpbmRlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRMaXN0Q2xpY2tUaW1lIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdENsaWNrVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBTSW50MzIgdGltZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIFNJbnQzMiByZWZDb24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRMaXN0VXNlckhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RVc2VySGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIEhhbmRsZSB1c2VySGFuZGxlKSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgbGlzdEZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdFNlbGVjdGlvbkZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFNlbGVjdGlvbkZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgc2VsZWN0aW9uRmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJhc19MaXN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfYXNfTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzb3VyY2UpLT5MaXN0LlxuUmV0dXJucyBMaXN0IG9iamVjdCAod2hpY2ggaXMgbm90IGF1dG8tZnJlZWQhKSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2lmbmRlZiBfX0xQNjRfXwpAQCAtMTA3NCw2NSArMTA3NCw2NSBAQAogICAgICAgICAgICAgICAgICAgICAgICBTSW50MTYgZGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgTGlzdEhhbmRsZSB0aGVMaXN0KQogewotICAgICAgICBQeU9iamVjdCAqbGlzdERlZkZ1bmMsICphcmdzLCAqcnY9TlVMTDsKLSAgICAgICAgTGlzdE9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqbGlzdERlZkZ1bmMsICphcmdzLCAqcnY9TlVMTDsKKyAgICBMaXN0T2JqZWN0ICpzZWxmOwogCi0gICAgICAgIHNlbGYgPSAoTGlzdE9iamVjdCopR2V0TGlzdFJlZkNvbih0aGVMaXN0KTsKLSAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5vYl9pdHNlbGYgIT0gdGhlTGlzdCkKLSAgICAgICAgICAgICAgICByZXR1cm47ICAvKiBub3RoaW5nIHdlIGNhbiBkbyAqLwotICAgICAgICBsaXN0RGVmRnVuYyA9IHNlbGYtPm9iX2xkZWZfZnVuYzsKLSAgICAgICAgaWYgKGxpc3REZWZGdW5jID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KLSAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoImhiTyZPJmhoTyIsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgY2VsbFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB0aGVDZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKLSAgICAgICAgaWYgKGFyZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QobGlzdERlZkZ1bmMsIGFyZ3MpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJlcnJvciBpbiBsaXN0IGRlZmluaXRpb24gY2FsbGJhY2s6XG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIH0KKyAgICBzZWxmID0gKExpc3RPYmplY3QqKUdldExpc3RSZWZDb24odGhlTGlzdCk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5vYl9pdHNlbGYgIT0gdGhlTGlzdCkKKyAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KKyAgICBsaXN0RGVmRnVuYyA9IHNlbGYtPm9iX2xkZWZfZnVuYzsKKyAgICBpZiAobGlzdERlZkZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaGJPJk8maGhPIiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgY2VsbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOworICAgIGlmIChhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChsaXN0RGVmRnVuYywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgaWYgKHJ2ID09IE5VTEwpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImVycm9yIGluIGxpc3QgZGVmaW5pdGlvbiBjYWxsYmFjazpcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgfQogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogdm9pZCBpbml0X0xpc3Qodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQlteUxpc3REZWZGdW5jdGlvblVQUCA9IE5ld0xpc3REZWZVUFAoKExpc3REZWZQcm9jUHRyKW15TGlzdERlZkZ1bmN0aW9uKTsKKyAgICBteUxpc3REZWZGdW5jdGlvblVQUCA9IE5ld0xpc3REZWZVUFAoKExpc3REZWZQcm9jUHRyKW15TGlzdERlZkZ1bmN0aW9uKTsKIAotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKExpc3RIYW5kbGUsIExpc3RPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTGlzdEhhbmRsZSwgTGlzdE9ial9Db252ZXJ0KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhMaXN0SGFuZGxlLCBMaXN0T2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKExpc3RIYW5kbGUsIExpc3RPYmpfQ29udmVydCk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9MaXN0IiwgTGlzdF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0xpc3QiLCBMaXN0X21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUxpc3RfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChMaXN0X0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTGlzdF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUxpc3RfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkxpc3RfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZMaXN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTGlzdCIsIChQeU9iamVjdCAqKSZMaXN0X1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmTGlzdF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxpc3RUeXBlIiwgKFB5T2JqZWN0ICopJkxpc3RfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgTGlzdF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKExpc3RfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBMaXN0X0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgTGlzdF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmTGlzdF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkxpc3RfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMaXN0IiwgKFB5T2JqZWN0ICopJkxpc3RfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZMaXN0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTGlzdFR5cGUiLCAoUHlPYmplY3QgKikmTGlzdF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9tZW51L19NZW51bW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9tZW51L19NZW51bW9kdWxlLmMKaW5kZXggNjZlYmY3OS4uZGJiMDc1YyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbWVudS9fTWVudW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL21lbnUvX01lbnVtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzUsMjEgKzM1LDIxIEBACiAvKiBBbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIE1lbnVPYmpfTmV3LCB3aGljaCByZXR1cm5zIE5vbmUgZm9yIE5VTEwgYXJndW1lbnQgKi8KIFB5T2JqZWN0ICpPcHRNZW51T2JqX05ldyhNZW51UmVmIGl0c2VsZikKIHsKLSAgICAgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZW51T2JqX05ldyhpdHNlbGYpOworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gTWVudU9ial9OZXcoaXRzZWxmKTsKIH0KIAogLyogQWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBNZW51T2JqX0NvbnZlcnQsIHdoaWNoIHJldHVybnMgTlVMTCBmb3IgYSBOb25lIGFyZ3VtZW50ICovCiBpbnQgT3B0TWVudU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBNZW51UmVmICpwX2l0c2VsZikKIHsKLSAgICAgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7Ci0gICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVudU9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKKyAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBNZW51T2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRXJyb3I7CkBAIC02MSwyNDY5ICs2MSwyNDY5IEBACiAjZGVmaW5lIE1lbnVPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmTWVudV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZNZW51X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBNZW51T2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTWVudUhhbmRsZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIE1lbnVIYW5kbGUgb2JfaXRzZWxmOwogfSBNZW51T2JqZWN0OwogCiBQeU9iamVjdCAqTWVudU9ial9OZXcoTWVudUhhbmRsZSBpdHNlbGYpCiB7Ci0JTWVudU9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoTWVudU9iamVjdCwgJk1lbnVfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE1lbnVPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKE1lbnVPYmplY3QsICZNZW51X1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IE1lbnVPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTWVudUhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFNZW51T2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1lbnUgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoTWVudU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFNZW51T2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1lbnUgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoTWVudU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIE1lbnVPYmpfZGVhbGxvYyhNZW51T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0Rpc3Bvc2VNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlzcG9zZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VNZW51KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZU1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ2FsY01lbnVTaXplKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2FsY01lbnVTaXplCi0JUHlNYWNfUFJFQ0hFQ0soQ2FsY01lbnVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYWxjTWVudVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNhbGNNZW51U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENhbGNNZW51U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Db3VudE1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MTYgX3J2OwogI2lmbmRlZiBDb3VudE1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKENvdW50TWVudUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50TWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUZvbnQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0Rm9udElEOwotCVVJbnQxNiBvdXRGb250U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgb3V0Rm9udElEOworICAgIFVJbnQxNiBvdXRGb250U2l6ZTsKICNpZm5kZWYgR2V0TWVudUZvbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51Rm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51Rm9udChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmb3V0Rm9udElELAotCSAgICAgICAgICAgICAgICAgICAmb3V0Rm9udFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRGb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Rm9udFNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJm91dEZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgJm91dEZvbnRTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Rm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVGb250KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IGluRm9udElEOwotCVVJbnQxNiBpbkZvbnRTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBpbkZvbnRJRDsKKyAgICBVSW50MTYgaW5Gb250U2l6ZTsKICNpZm5kZWYgU2V0TWVudUZvbnQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51Rm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVGb250KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICBpbkZvbnRTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgIGluRm9udFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEdldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4KLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gZXhjbHVkZXNNYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gZXhjbHVkZXNNYXJrOwogI2lmbmRlZiBTZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV4Y2x1ZGVzTWFyaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZXNNYXJrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4Y2x1ZGVzTWFyaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZXNNYXJrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0lzVmFsaWRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNWYWxpZE1lbnUKLQlQeU1hY19QUkVDSEVDSyhJc1ZhbGlkTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzVmFsaWRNZW51KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1ZhbGlkTWVudShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVSZXRhaW5Db3VudChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OwogI2lmbmRlZiBHZXRNZW51UmV0YWluQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51UmV0YWluQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVSZXRhaW5Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVudVJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51UmV0YWluQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9SZXRhaW5NZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJldGFpbk1lbnUKLQlQeU1hY19QUkVDSEVDSyhSZXRhaW5NZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXRhaW5NZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV0YWluTWVudShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJldGFpbk1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9SZWxlYXNlTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBSZWxlYXNlTWVudQotCVB5TWFjX1BSRUNIRUNLKFJlbGVhc2VNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWxlYXNlTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbGVhc2VNZW51KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVsZWFzZU1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EdXBsaWNhdGVNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBvdXRNZW51OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgb3V0TWVudTsKICNpZm5kZWYgRHVwbGljYXRlTWVudQotCVB5TWFjX1BSRUNIRUNLKER1cGxpY2F0ZU1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKER1cGxpY2F0ZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEdXBsaWNhdGVNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEdXBsaWNhdGVNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Db3B5TWVudVRpdGxlQXNDRlN0cmluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIG91dFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CiAjaWZuZGVmIENvcHlNZW51VGl0bGVBc0NGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlNZW51VGl0bGVBc0NGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlNZW51VGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKICNpZm5kZWYgU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnZhbGlkYXRlTWVudVNpemUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgSW52YWxpZGF0ZU1lbnVTaXplCi0JUHlNYWNfUFJFQ0hFQ0soSW52YWxpZGF0ZU1lbnVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnZhbGlkYXRlTWVudVNpemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnZhbGlkYXRlTWVudVNpemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVTaXplSW52YWxpZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzTWVudVNpemVJbnZhbGlkCi0JUHlNYWNfUFJFQ0hFQ0soSXNNZW51U2l6ZUludmFsaWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudVNpemVJbnZhbGlkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVTaXplSW52YWxpZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51U2l6ZUludmFsaWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNBcHBlbmRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgZGF0YTsKICNpZm5kZWYgTWFjQXBwZW5kTWVudQotCVB5TWFjX1BSRUNIRUNLKE1hY0FwcGVuZE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0FwcGVuZE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBkYXRhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRSZXNNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlc1R5cGUgdGhlVHlwZTsKLQlzaG9ydCBhZnRlckl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBhZnRlckl0ZW07CiAjaWZuZGVmIEluc2VydFJlc01lbnUKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRSZXNNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRSZXNNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlJbnNlcnRSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgYWZ0ZXJJdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0FwcGVuZFJlc01lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEFwcGVuZFJlc01lbnUKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRSZXNNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBcHBlbmRSZXNNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCUFwcGVuZFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIHRoZVR5cGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBcHBlbmRSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICB0aGVUeXBlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNJbnNlcnRNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgaXRlbVN0cmluZzsKLQlzaG9ydCBhZnRlckl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBpdGVtU3RyaW5nOworICAgIHNob3J0IGFmdGVySXRlbTsKICNpZm5kZWYgTWFjSW5zZXJ0TWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhNYWNJbnNlcnRNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXJ0TWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjSW5zZXJ0TWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0luc2VydE1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0RlbGV0ZU1lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CiAjaWZuZGVmIERlbGV0ZU1lbnVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKERlbGV0ZU1lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCURlbGV0ZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgaXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERlbGV0ZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0Rm9udFJlc01lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgYWZ0ZXJJdGVtOwotCXNob3J0IHNjcmlwdEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgYWZ0ZXJJdGVtOworICAgIHNob3J0IHNjcmlwdEZpbHRlcjsKICNpZm5kZWYgSW5zZXJ0Rm9udFJlc01lbnUKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRGb250UmVzTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0Rm9udFJlc01lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXJ0Rm9udFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCi0JICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsdGVyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5zZXJ0Rm9udFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsdGVyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRJbnRsUmVzTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgYWZ0ZXJJdGVtOwotCXNob3J0IHNjcmlwdEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIHNob3J0IGFmdGVySXRlbTsKKyAgICBzaG9ydCBzY3JpcHRGaWx0ZXI7CiAjaWZuZGVmIEluc2VydEludGxSZXNNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0SW50bFJlc01lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydEludGxSZXNNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXJ0SW50bFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICBzY3JpcHRGaWx0ZXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdEZpbHRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydEludGxSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsdGVyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9BcHBlbmRNZW51SXRlbVRleHQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTdHIyNTUgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU3RyMjU1IGluU3RyaW5nOwogI2lmbmRlZiBBcHBlbmRNZW51SXRlbVRleHQKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRNZW51SXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnVJdGVtVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXBwZW5kTWVudUl0ZW1UZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFwcGVuZE1lbnVJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0TWVudUl0ZW1UZXh0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU3RyMjU1IGluU3RyaW5nOwotCU1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFN0cjI1NSBpblN0cmluZzsKKyAgICBNZW51SXRlbUluZGV4IGFmdGVySXRlbTsKICNpZm5kZWYgSW5zZXJ0TWVudUl0ZW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVudUl0ZW1UZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51SXRlbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnNlcnRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc2VydE1lbnVJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ29weU1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW07Ci0JSXRlbUNvdW50IGluTnVtSXRlbXM7Ci0JTWVudUhhbmRsZSBpbkRlc3RNZW51OwotCU1lbnVJdGVtSW5kZXggaW5JbnNlcnRBZnRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtOworICAgIEl0ZW1Db3VudCBpbk51bUl0ZW1zOworICAgIE1lbnVIYW5kbGUgaW5EZXN0TWVudTsKKyAgICBNZW51SXRlbUluZGV4IGluSW5zZXJ0QWZ0ZXI7CiAjaWZuZGVmIENvcHlNZW51SXRlbXMKLQlQeU1hY19QUkVDSEVDSyhDb3B5TWVudUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TWVudUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1JdGVtcywKLQkgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5EZXN0TWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSW5zZXJ0QWZ0ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgIGluTnVtSXRlbXMsCi0JICAgICAgICAgICAgICAgICAgICAgaW5EZXN0TWVudSwKLQkgICAgICAgICAgICAgICAgICAgICBpbkluc2VydEFmdGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZpcnN0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtSXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmluRGVzdE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkluc2VydEFmdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbkZpcnN0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVzdE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbnNlcnRBZnRlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EZWxldGVNZW51SXRlbXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtOwotCUl0ZW1Db3VudCBpbk51bUl0ZW1zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW07CisgICAgSXRlbUNvdW50IGluTnVtSXRlbXM7CiAjaWZuZGVmIERlbGV0ZU1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTWVudUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1JdGVtcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEZWxldGVNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1JdGVtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaXJzdEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bUl0ZW1zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERlbGV0ZU1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaXJzdEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0FwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGluU3RyaW5nOwotCU1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXM7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JTWVudUl0ZW1JbmRleCBvdXROZXdJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluU3RyaW5nOworICAgIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXM7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgTWVudUl0ZW1JbmRleCBvdXROZXdJdGVtOwogI2lmbmRlZiBBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE5ld0l0ZW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE5ld0l0ZW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmV3SXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TmV3SXRlbSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKLQlNZW51SXRlbUluZGV4IGluQWZ0ZXJJdGVtOwotCU1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXM7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgTWVudUl0ZW1JbmRleCBpbkFmdGVySXRlbTsKKyAgICBNZW51SXRlbUF0dHJpYnV0ZXMgaW5BdHRyaWJ1dGVzOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5BZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Qb3BVcE1lbnVTZWxlY3QoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0Jc2hvcnQgdG9wOwotCXNob3J0IGxlZnQ7Ci0Jc2hvcnQgcG9wVXBJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBzaG9ydCB0b3A7CisgICAgc2hvcnQgbGVmdDsKKyAgICBzaG9ydCBwb3BVcEl0ZW07CiAjaWZuZGVmIFBvcFVwTWVudVNlbGVjdAotCVB5TWFjX1BSRUNIRUNLKFBvcFVwTWVudVNlbGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUG9wVXBNZW51U2VsZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9wVXBJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUG9wVXBNZW51U2VsZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgcG9wVXBJdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcFVwSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFBvcFVwTWVudVNlbGVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcFVwSXRlbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnZhbGlkYXRlTWVudUVuYWJsaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIEludmFsaWRhdGVNZW51RW5hYmxpbmcKLQlQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudUVuYWJsaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudUVuYWJsaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW52YWxpZGF0ZU1lbnVFbmFibGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEludmFsaWRhdGVNZW51RW5hYmxpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVCYXJJbnZhbGlkKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNNZW51QmFySW52YWxpZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUJhckludmFsaWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUJhckludmFsaWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUJhckludmFsaWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUJhckludmFsaWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNJbnNlcnRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBiZWZvcmVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUlEIGJlZm9yZUlEOwogI2lmbmRlZiBNYWNJbnNlcnRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXJ0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXJ0TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJlZm9yZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjSW5zZXJ0TWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgYmVmb3JlSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJlZm9yZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjSW5zZXJ0TWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgYmVmb3JlSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldFJvb3RNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFNldFJvb3RNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0Um9vdE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJvb3RNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Um9vdE1lbnUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRSb290TWVudShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX01hY0NoZWNrTWVudUl0ZW0oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaXRlbTsKLQlCb29sZWFuIGNoZWNrZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgQm9vbGVhbiBjaGVja2VkOwogI2lmbmRlZiBNYWNDaGVja01lbnVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soTWFjQ2hlY2tNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjQ2hlY2tNZW51SXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2hlY2tlZCkpCi0JCXJldHVybiBOVUxMOwotCU1hY0NoZWNrTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICBjaGVja2VkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoZWNrZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNDaGVja01lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JU3RyMjU1IGl0ZW1TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3RyMjU1IGl0ZW1TdHJpbmc7CiAjaWZuZGVmIFNldE1lbnVJdGVtVGV4dAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGl0ZW1TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgaXRlbVN0cmluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGl0ZW1TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1UZXh0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JU3RyMjU1IGl0ZW1TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3RyMjU1IGl0ZW1TdHJpbmc7CiAjaWZuZGVmIEdldE1lbnVJdGVtVGV4dAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUdldE1lbnVJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICBpdGVtU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBpdGVtU3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgaXRlbVN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRJdGVtTWFyayhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUNoYXJQYXJhbWV0ZXIgbWFya0NoYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgQ2hhclBhcmFtZXRlciBtYXJrQ2hhcjsKICNpZm5kZWYgU2V0SXRlbU1hcmsKLQlQeU1hY19QUkVDSEVDSyhTZXRJdGVtTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbU1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1hcmtDaGFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0SXRlbU1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgIG1hcmtDaGFyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcmtDaGFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0SXRlbU1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgIG1hcmtDaGFyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRJdGVtTWFyayhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUNoYXJQYXJhbWV0ZXIgbWFya0NoYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgQ2hhclBhcmFtZXRlciBtYXJrQ2hhcjsKICNpZm5kZWYgR2V0SXRlbU1hcmsKLQlQeU1hY19QUkVDSEVDSyhHZXRJdGVtTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbU1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbU1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICZtYXJrQ2hhcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG1hcmtDaGFyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRJdGVtTWFyayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgJm1hcmtDaGFyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFya0NoYXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0SXRlbUNtZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUNoYXJQYXJhbWV0ZXIgY21kQ2hhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaXRlbTsKKyAgICBDaGFyUGFyYW1ldGVyIGNtZENoYXI7CiAjaWZuZGVmIFNldEl0ZW1DbWQKLQlQeU1hY19QUkVDSEVDSyhTZXRJdGVtQ21kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRJdGVtQ21kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZjbWRDaGFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0SXRlbUNtZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgIGNtZENoYXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kQ2hhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEl0ZW1DbWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICBjbWRDaGFyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRJdGVtQ21kKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JQ2hhclBhcmFtZXRlciBjbWRDaGFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIENoYXJQYXJhbWV0ZXIgY21kQ2hhcjsKICNpZm5kZWYgR2V0SXRlbUNtZAotCVB5TWFjX1BSRUNIRUNLKEdldEl0ZW1DbWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEl0ZW1DbWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbUNtZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICZjbWRDaGFyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgY21kQ2hhcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0SXRlbUNtZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICZjbWRDaGFyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY21kQ2hhcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRJdGVtSWNvbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCXNob3J0IGljb25JbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaXRlbTsKKyAgICBzaG9ydCBpY29uSW5kZXg7CiAjaWZuZGVmIFNldEl0ZW1JY29uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbUljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEl0ZW1JY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRJdGVtSWNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgaWNvbkluZGV4KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25JbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICBpY29uSW5kZXgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEl0ZW1JY29uKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0Jc2hvcnQgaWNvbkluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIHNob3J0IGljb25JbmRleDsKICNpZm5kZWYgR2V0SXRlbUljb24KLQlQeU1hY19QUkVDSEVDSyhHZXRJdGVtSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbUljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICZpY29uSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBpY29uSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAmaWNvbkluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldEl0ZW1TdHlsZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCVN0eWxlUGFyYW1ldGVyIGNoU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3R5bGVQYXJhbWV0ZXIgY2hTdHlsZTsKICNpZm5kZWYgU2V0SXRlbVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRJdGVtU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoU3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRJdGVtU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgY2hTdHlsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaFN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0SXRlbVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgIGNoU3R5bGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEl0ZW1TdHlsZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCVN0eWxlIGNoU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3R5bGUgY2hTdHlsZTsKICNpZm5kZWYgR2V0SXRlbVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJdGVtU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICZjaFN0eWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgY2hTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0SXRlbVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICZjaFN0eWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hTdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgU2V0TWVudUl0ZW1Db21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUNvbW1hbmRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Db21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1Db21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1Db21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JTWVudUNvbW1hbmQgb3V0Q29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgTWVudUNvbW1hbmQgb3V0Q29tbWFuZElEOwogI2lmbmRlZiBHZXRNZW51SXRlbUNvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtQ29tbWFuZElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUNvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUNvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb21tYW5kSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENvbW1hbmRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1Db21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29tbWFuZElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDb21tYW5kSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1Nb2RpZmllcnMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQ4IGluTW9kaWZpZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgVUludDggaW5Nb2RpZmllcnM7CiAjaWZuZGVmIFNldE1lbnVJdGVtTW9kaWZpZXJzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Nb2RpZmllcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtTW9kaWZpZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RpZmllcnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RpZmllcnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1Nb2RpZmllcnMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQ4IG91dE1vZGlmaWVyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQ4IG91dE1vZGlmaWVyczsKICNpZm5kZWYgR2V0TWVudUl0ZW1Nb2RpZmllcnMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbU1vZGlmaWVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Nb2RpZmllcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1Nb2RpZmllcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TW9kaWZpZXJzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNb2RpZmllcnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1vZGlmaWVycyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TW9kaWZpZXJzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtSWNvbkhhbmRsZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVUludDggaW5JY29uVHlwZTsKLQlIYW5kbGUgaW5JY29uSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgVUludDggaW5JY29uVHlwZTsKKyAgICBIYW5kbGUgaW5JY29uSGFuZGxlOwogI2lmbmRlZiBTZXRNZW51SXRlbUljb25IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUljb25IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSWNvbkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5JY29uSGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtSWNvbkhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSWNvbkhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSWNvbkhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbUljb25IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkljb25IYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1JY29uSGFuZGxlKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlVSW50OCBvdXRJY29uVHlwZTsKLQlIYW5kbGUgb3V0SWNvbkhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQ4IG91dEljb25UeXBlOworICAgIEhhbmRsZSBvdXRJY29uSGFuZGxlOwogI2lmbmRlZiBHZXRNZW51SXRlbUljb25IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUljb25IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSWNvbkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUljb25IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uSGFuZGxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dEljb25IYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtSWNvbkhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEljb25IYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0SWNvbkhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbVRleHRFbmNvZGluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVGV4dEVuY29kaW5nIGluU2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBUZXh0RW5jb2RpbmcgaW5TY3JpcHRJRDsKICNpZm5kZWYgU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbVRleHRFbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TY3JpcHRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbVRleHRFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2NyaXB0SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2NyaXB0SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVJdGVtVGV4dEVuY29kaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlUZXh0RW5jb2Rpbmcgb3V0U2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBUZXh0RW5jb2Rpbmcgb3V0U2NyaXB0SUQ7CiAjaWZuZGVmIEdldE1lbnVJdGVtVGV4dEVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtVGV4dEVuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtVGV4dEVuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTY3JpcHRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2NyaXB0SUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFNjcmlwdElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCU1lbnVJRCBpbkhpZXJJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIE1lbnVJRCBpbkhpZXJJRDsKICNpZm5kZWYgU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IaWVySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IaWVySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZXJJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlNZW51SUQgb3V0SGllcklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgTWVudUlEIG91dEhpZXJJRDsKICNpZm5kZWYgR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGllcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRIaWVySUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhpZXJJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGllcklEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtRm9udElEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlTSW50MTYgaW5Gb250SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBTSW50MTYgaW5Gb250SUQ7CiAjaWZuZGVmIFNldE1lbnVJdGVtRm9udElECi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Gb250SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtRm9udElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtRm9udElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtRm9udElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1Gb250SUQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVNJbnQxNiBvdXRGb250SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBTSW50MTYgb3V0Rm9udElEOwogI2lmbmRlZiBHZXRNZW51SXRlbUZvbnRJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtRm9udElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUZvbnRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUZvbnRJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGb250SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1Gb250SUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Rm9udElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGb250SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1SZWZDb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQzMiBpblJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQzMiBpblJlZkNvbjsKICNpZm5kZWYgU2V0TWVudUl0ZW1SZWZDb24KLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbVJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1SZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1SZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZkNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1SZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZkNvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbVJlZkNvbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVUludDMyIG91dFJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQzMiBvdXRSZWZDb247CiAjaWZuZGVmIEdldE1lbnVJdGVtUmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1SZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtUmVmQ29uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlZkNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UmVmQ29uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbVJlZkNvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZWZDb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFJlZkNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUtleUdseXBoKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlTSW50MTYgaW5HbHlwaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFNJbnQxNiBpbkdseXBoOwogI2lmbmRlZiBTZXRNZW51SXRlbUtleUdseXBoCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1LZXlHbHlwaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1LZXlHbHlwaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkdseXBoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtS2V5R2x5cGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5HbHlwaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5HbHlwaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbUtleUdseXBoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluR2x5cGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1LZXlHbHlwaChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JU0ludDE2IG91dEdseXBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgU0ludDE2IG91dEdseXBoOwogI2lmbmRlZiBHZXRNZW51SXRlbUtleUdseXBoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1LZXlHbHlwaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1LZXlHbHlwaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUtleUdseXBoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHbHlwaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0R2x5cGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtS2V5R2x5cGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEdseXBoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRHbHlwaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNFbmFibGVNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SXRlbUluZGV4IGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJdGVtSW5kZXggaXRlbTsKICNpZm5kZWYgTWFjRW5hYmxlTWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhNYWNFbmFibGVNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRW5hYmxlTWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EaXNhYmxlTWVudUl0ZW0oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIERpc2FibGVNZW51SXRlbQotCVB5TWFjX1BSRUNIRUNLKERpc2FibGVNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZU1lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzYWJsZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0lzTWVudUl0ZW1FbmFibGVkKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU1lbnVJdGVtSW5kZXggaXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOwogI2lmbmRlZiBJc01lbnVJdGVtRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1FbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01lbnVJdGVtRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVJdGVtRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUl0ZW1FbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9FbmFibGVNZW51SXRlbUljb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIEVuYWJsZU1lbnVJdGVtSWNvbgotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVJdGVtSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUl0ZW1JY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUVuYWJsZU1lbnVJdGVtSWNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRW5hYmxlTWVudUl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0Rpc2FibGVNZW51SXRlbUljb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIERpc2FibGVNZW51SXRlbUljb24KLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUl0ZW1JY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUl0ZW1JY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVNZW51SXRlbUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGl0ZW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNhYmxlTWVudUl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVJdGVtSWNvbkVuYWJsZWQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIElzTWVudUl0ZW1JY29uRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1JY29uRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNNZW51SXRlbUljb25FbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUl0ZW1JY29uRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc01lbnVJdGVtSWNvbkVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlNZW51SGFuZGxlIGluSGllck1lbnU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgTWVudUhhbmRsZSBpbkhpZXJNZW51OwogI2lmbmRlZiBTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZpbkhpZXJNZW51KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IaWVyTWVudSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5IaWVyTWVudSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGllck1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JTWVudUhhbmRsZSBvdXRIaWVyTWVudTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBNZW51SGFuZGxlIG91dEhpZXJNZW51OwogI2lmbmRlZiBHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfTmV3LCBvdXRIaWVyTWVudSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGllck1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX05ldywgb3V0SGllck1lbnUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nOwogI2lmbmRlZiBDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CiAjaWZuZGVmIFNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUluZGVudChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5JdGVtOwotCVVJbnQzMiBvdXRJbmRlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgVUludDMyIG91dEluZGVudDsKICNpZm5kZWYgR2V0TWVudUl0ZW1JbmRlbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUluZGVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1JbmRlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1JbmRlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5kZW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRJbmRlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtSW5kZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5kZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtSW5kZW50KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JVUludDMyIGluSW5kZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOworICAgIFVJbnQzMiBpbkluZGVudDsKICNpZm5kZWYgU2V0TWVudUl0ZW1JbmRlbnQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUluZGVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1JbmRlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JbmRlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1JbmRlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZGVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JbmRlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1JbmRlbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZGVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRLZXkoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlCb29sZWFuIGluR2V0VmlydHVhbEtleTsKLQlVSW50MTYgb3V0S2V5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOworICAgIEJvb2xlYW4gaW5HZXRWaXJ0dWFsS2V5OworICAgIFVJbnQxNiBvdXRLZXk7CiAjaWZuZGVmIEdldE1lbnVJdGVtQ29tbWFuZEtleQotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtQ29tbWFuZEtleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Db21tYW5kS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluR2V0VmlydHVhbEtleSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUNvbW1hbmRLZXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluR2V0VmlydHVhbEtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLZXkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEtleSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5HZXRWaXJ0dWFsS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtQ29tbWFuZEtleShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5HZXRWaXJ0dWFsS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEtleSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0S2V5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtQ29tbWFuZEtleShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5JdGVtOwotCUJvb2xlYW4gaW5TZXRWaXJ0dWFsS2V5OwotCVVJbnQxNiBpbktleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBCb29sZWFuIGluU2V0VmlydHVhbEtleTsKKyAgICBVSW50MTYgaW5LZXk7CiAjaWZuZGVmIFNldE1lbnVJdGVtQ29tbWFuZEtleQotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtQ29tbWFuZEtleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Db21tYW5kS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpblNldFZpcnR1YWxLZXksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktleSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbUNvbW1hbmRLZXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2V0VmlydHVhbEtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2V5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TZXRWaXJ0dWFsS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5LZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1Db21tYW5kS2V5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNldFZpcnR1YWxLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktleSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaXRlbTsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CisgICAgT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgcHJvcGVydHlUYWc7CisgICAgVUludDMyIGF0dHJpYnV0ZXM7CiAjaWZuZGVmIEdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgcHJvcGVydHlUYWc7Ci0JVUludDMyIGF0dHJpYnV0ZXNUb1NldDsKLQlVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIHByb3BlcnR5VGFnOworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQ7CisgICAgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyOwogI2lmbmRlZiBDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKENoYW5nZU1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9DbGVhcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb0NsZWFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9DbGVhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb0NsZWFyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVBdHRyaWJ1dGVzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRNZW51QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRBdHRyaWJ1dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRBdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NoYW5nZU1lbnVBdHRyaWJ1dGVzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUF0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzOwotCU1lbnVBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKKyAgICBNZW51QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlczsKICNpZm5kZWYgQ2hhbmdlTWVudUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlTWVudUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2V0VGhlc2VBdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2xlYXJUaGVzZUF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2hhbmdlTWVudUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGhlc2VBdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRoZXNlQXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0VGhlc2VBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xlYXJUaGVzZUF0dHJpYnV0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2hhbmdlTWVudUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGhlc2VBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRoZXNlQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUF0dHJpYnV0ZXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JTWVudUl0ZW1BdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIE1lbnVJdGVtQXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRNZW51SXRlbUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtQXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1BdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEF0dHJpYnV0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QXR0cmlidXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9DaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JTWVudUl0ZW1BdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKLQlNZW51SXRlbUF0dHJpYnV0ZXMgY2xlYXJUaGVzZUF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIE1lbnVJdGVtQXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXM7CisgICAgTWVudUl0ZW1BdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOwogI2lmbmRlZiBDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYW5nZU1lbnVJdGVtQXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZU1lbnVJdGVtQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZU1lbnVJdGVtQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0Rpc2FibGVBbGxNZW51SXRlbXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaXNhYmxlQWxsTWVudUl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZUFsbE1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZUFsbE1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzYWJsZUFsbE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc2FibGVBbGxNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRW5hYmxlQWxsTWVudUl0ZW1zKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRW5hYmxlQWxsTWVudUl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlQWxsTWVudUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbmFibGVBbGxNZW51SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUVuYWJsZUFsbE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEVuYWJsZUFsbE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NZW51SGFzRW5hYmxlZEl0ZW1zKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgTWVudUhhc0VuYWJsZWRJdGVtcwotCVB5TWFjX1BSRUNIRUNLKE1lbnVIYXNFbmFibGVkSXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lbnVIYXNFbmFibGVkSXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lbnVIYXNFbmFibGVkSXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lbnVIYXNFbmFibGVkSXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51VHlwZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQxNiBvdXRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBvdXRUeXBlOwogI2lmbmRlZiBHZXRNZW51VHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51VHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZvdXRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICZvdXRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCVVJbnQzMiBpbkl0ZW1JbmRleDsKLQlNZW51SGFuZGxlIG91dE1lbnU7Ci0JTWVudUl0ZW1JbmRleCBvdXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBVSW50MzIgaW5JdGVtSW5kZXg7CisgICAgTWVudUhhbmRsZSBvdXRNZW51OworICAgIE1lbnVJdGVtSW5kZXggb3V0SW5kZXg7CiAjaWZuZGVmIEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRW5hYmxlTWVudUNvbW1hbmQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBFbmFibGVNZW51Q29tbWFuZAotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVDb21tYW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbmFibGVNZW51Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRW5hYmxlTWVudUNvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFbmFibGVNZW51Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EaXNhYmxlTWVudUNvbW1hbmQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBEaXNhYmxlTWVudUNvbW1hbmQKLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUNvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc2FibGVNZW51Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzYWJsZU1lbnVDb21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc2FibGVNZW51Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSXNNZW51Q29tbWFuZEVuYWJsZWQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBJc01lbnVDb21tYW5kRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUNvbW1hbmRFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01lbnVDb21tYW5kRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNZW51Q29tbWFuZEVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUNvbW1hbmRFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUNvbW1hbmRNYXJrKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVW5pQ2hhciBpbk1hcms7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgVW5pQ2hhciBpbk1hcms7CiAjaWZuZGVmIFNldE1lbnVDb21tYW5kTWFyawotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVDb21tYW5kTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUNvbW1hbmRNYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hcmspOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hcmspOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUNvbW1hbmRNYXJrKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVW5pQ2hhciBvdXRNYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFVuaUNoYXIgb3V0TWFyazsKICNpZm5kZWYgR2V0TWVudUNvbW1hbmRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51Q29tbWFuZE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51Q29tbWFuZE1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hcmspOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1hcmspOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUNvbW1hbmRNYXJrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYXJrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNYXJrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBpblByb3BlcnR5VGFnOwotCUJ5dGVDb3VudCBvdXRTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKKyAgICBCeXRlQ291bnQgb3V0U2l6ZTsKICNpZm5kZWYgR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1JlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7Ci0JT1NUeXBlIGluUHJvcGVydHlUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBpblByb3BlcnR5VGFnOwogI2lmbmRlZiBSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVJdGVtSW52YWxpZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CiAjaWZuZGVmIElzTWVudUl0ZW1JbnZhbGlkCi0JUHlNYWNfUFJFQ0hFQ0soSXNNZW51SXRlbUludmFsaWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1JbnZhbGlkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNZW51SXRlbUludmFsaWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51SXRlbUludmFsaWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW52YWxpZGF0ZU1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW07Ci0JSXRlbUNvdW50IGluTnVtSXRlbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbTsKKyAgICBJdGVtQ291bnQgaW5OdW1JdGVtczsKICNpZm5kZWYgSW52YWxpZGF0ZU1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNZW51SXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNZW51SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GaXJzdEl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk51bUl0ZW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsaWRhdGVNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZpcnN0SXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZpcnN0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtSXRlbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxpZGF0ZU1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmlyc3RJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtSXRlbXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfVXBkYXRlSW52YWxpZE1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBVcGRhdGVJbnZhbGlkTWVudUl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlSW52YWxpZE1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlSW52YWxpZE1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVwZGF0ZUludmFsaWRNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVJbnZhbGlkTWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ3JlYXRlU3RhbmRhcmRGb250TWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtOwotCU1lbnVJRCBmaXJzdEhpZXJNZW51SUQ7Ci0JT3B0aW9uQml0cyBvcHRpb25zOwotCUl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtOworICAgIE1lbnVJRCBmaXJzdEhpZXJNZW51SUQ7CisgICAgT3B0aW9uQml0cyBvcHRpb25zOworICAgIEl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50OwogI2lmbmRlZiBDcmVhdGVTdGFuZGFyZEZvbnRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhbmRhcmRGb250TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhbmRhcmRGb250TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RIaWVyTWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTdGFuZGFyZEZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SGllck1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRIaWVyTWVudUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RIaWVyTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTdGFuZGFyZEZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SGllck1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIaWVyTWVudUNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1VwZGF0ZVN0YW5kYXJkRm9udE1lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudDsKICNpZm5kZWYgVXBkYXRlU3RhbmRhcmRGb250TWVudQotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZVN0YW5kYXJkRm9udE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZVN0YW5kYXJkRm9udE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVTdGFuZGFyZEZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhpZXJNZW51Q291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEhpZXJNZW51Q291bnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlU3RhbmRhcmRGb250TWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIaWVyTWVudUNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaXRlbTsKLQlGTUZvbnRGYW1pbHkgb3V0Rm9udEZhbWlseTsKLQlGTUZvbnRTdHlsZSBvdXRTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CisgICAgRk1Gb250RmFtaWx5IG91dEZvbnRGYW1pbHk7CisgICAgRk1Gb250U3R5bGUgb3V0U3R5bGU7CiAjaWZuZGVmIEdldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rm9udEZhbWlseUZyb21NZW51U2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Rm9udEZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRGYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Rm9udEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUlEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBfcnY7CiAjaWZuZGVmIEdldE1lbnVJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51SUQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVXaWR0aChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRNZW51V2lkdGgKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51V2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVXaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVudVdpZHRoKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51V2lkdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SGVpZ2h0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIEdldE1lbnVIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUlEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBtZW51SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBtZW51SUQ7CiAjaWZuZGVmIFNldE1lbnVJRAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TWVudUlEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgIG1lbnVJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVudUlEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgIG1lbnVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudVdpZHRoKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB3aWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHdpZHRoOwogI2lmbmRlZiBTZXRNZW51V2lkdGgKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51V2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVXaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TWVudVdpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIHdpZHRoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1lbnVXaWR0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUhlaWdodChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgaGVpZ2h0OwogI2lmbmRlZiBTZXRNZW51SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lbnVIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVudUhlaWdodChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9hc19SZXNvdXJjZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBhc19SZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKGFzX1Jlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhhc19SZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19SZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9BcHBlbmRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgZGF0YTsKICNpZm5kZWYgQXBwZW5kTWVudQotCVB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICBkYXRhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGJlZm9yZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBiZWZvcmVJRDsKICNpZm5kZWYgSW5zZXJ0TWVudQotCVB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZiZWZvcmVJRCkpCi0JCXJldHVybiBOVUxMOwotCUluc2VydE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIGJlZm9yZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiZWZvcmVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIGJlZm9yZUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgaXRlbVN0cmluZzsKLQlzaG9ydCBhZnRlckl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBpdGVtU3RyaW5nOworICAgIHNob3J0IGFmdGVySXRlbTsKICNpZm5kZWYgSW5zZXJ0TWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXJ0TWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgIGFmdGVySXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydE1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0VuYWJsZU1lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQxNiBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MTYgaXRlbTsKICNpZm5kZWYgRW5hYmxlTWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhFbmFibGVNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9DaGVja01lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JQm9vbGVhbiBjaGVja2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIEJvb2xlYW4gY2hlY2tlZDsKICNpZm5kZWYgQ2hlY2tNZW51SXRlbQotCVB5TWFjX1BSRUNIRUNLKENoZWNrTWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKENoZWNrTWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoZWNrZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlDaGVja01lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgY2hlY2tlZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGVja2VkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2hlY2tNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgIGNoZWNrZWQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIE1lbnVPYmpfbWV0aG9kc1tdID0gewotCXsiRGlzcG9zZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNwb3NlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ2FsY01lbnVTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2FsY01lbnVTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDb3VudE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvdW50TWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgX3J2KSIpfSwKLQl7IkdldE1lbnVGb250IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUZvbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRGb250SUQsIFVJbnQxNiBvdXRGb250U2l6ZSkiKX0sCi0JeyJTZXRNZW51Rm9udCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVGb250LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5Gb250SUQsIFVJbnQxNiBpbkZvbnRTaXplKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGV4Y2x1ZGVzTWFyaykgLT4gTm9uZSIpfSwKLQl7IklzVmFsaWRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNWYWxpZE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldE1lbnVSZXRhaW5Db3VudCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVSZXRhaW5Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJSZXRhaW5NZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUmV0YWluTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUmVsZWFzZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9SZWxlYXNlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRHVwbGljYXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0R1cGxpY2F0ZU1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSkiKX0sCi0JeyJDb3B5TWVudVRpdGxlQXNDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvcHlNZW51VGl0bGVBc0NGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAotCXsiU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkludmFsaWRhdGVNZW51U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0ludmFsaWRhdGVNZW51U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSXNNZW51U2l6ZUludmFsaWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVTaXplSW52YWxpZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjQXBwZW5kTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0FwcGVuZE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBkYXRhKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0UmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydFJlc01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgYWZ0ZXJJdGVtKSAtPiBOb25lIil9LAotCXsiQXBwZW5kUmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZFJlc01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gTm9uZSIpfSwKLQl7Ik1hY0luc2VydE1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjSW5zZXJ0TWVudUl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBpdGVtU3RyaW5nLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJEZWxldGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0RlbGV0ZU1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0Rm9udFJlc01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRGb250UmVzTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgYWZ0ZXJJdGVtLCBzaG9ydCBzY3JpcHRGaWx0ZXIpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnRJbnRsUmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydEludGxSZXNNZW51LCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IGFmdGVySXRlbSwgc2hvcnQgc2NyaXB0RmlsdGVyKSAtPiBOb25lIil9LAotCXsiQXBwZW5kTWVudUl0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kTWVudUl0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51SXRlbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBpblN0cmluZywgTWVudUl0ZW1JbmRleCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJDb3B5TWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbSwgSXRlbUNvdW50IGluTnVtSXRlbXMsIE1lbnVIYW5kbGUgaW5EZXN0TWVudSwgTWVudUl0ZW1JbmRleCBpbkluc2VydEFmdGVyKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGVsZXRlTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcykgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcsIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXMsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoTWVudUl0ZW1JbmRleCBvdXROZXdJdGVtKSIpfSwKLQl7Ikluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcsIE1lbnVJdGVtSW5kZXggaW5BZnRlckl0ZW0sIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXMsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiUG9wVXBNZW51U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUG9wVXBNZW51U2VsZWN0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB0b3AsIHNob3J0IGxlZnQsIHNob3J0IHBvcFVwSXRlbSkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkludmFsaWRhdGVNZW51RW5hYmxpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnZhbGlkYXRlTWVudUVuYWJsaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVCYXJJbnZhbGlkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51QmFySW52YWxpZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjSW5zZXJ0TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0luc2VydE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBiZWZvcmVJRCkgLT4gTm9uZSIpfSwKLQl7IlNldFJvb3RNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0Um9vdE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1hY0NoZWNrTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNDaGVja01lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBCb29sZWFuIGNoZWNrZWQpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIFN0cjI1NSBpdGVtU3RyaW5nKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoU3RyMjU1IGl0ZW1TdHJpbmcpIil9LAotCXsiU2V0SXRlbU1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRJdGVtTWFyaywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgQ2hhclBhcmFtZXRlciBtYXJrQ2hhcikgLT4gTm9uZSIpfSwKLQl7IkdldEl0ZW1NYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbU1hcmssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChDaGFyUGFyYW1ldGVyIG1hcmtDaGFyKSIpfSwKLQl7IlNldEl0ZW1DbWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRJdGVtQ21kLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBDaGFyUGFyYW1ldGVyIGNtZENoYXIpIC0+IE5vbmUiKX0sCi0JeyJHZXRJdGVtQ21kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbUNtZCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKENoYXJQYXJhbWV0ZXIgY21kQ2hhcikiKX0sCi0JeyJTZXRJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1JY29uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBzaG9ydCBpY29uSW5kZXgpIC0+IE5vbmUiKX0sCi0JeyJHZXRJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEl0ZW1JY29uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoc2hvcnQgaWNvbkluZGV4KSIpfSwKLQl7IlNldEl0ZW1TdHlsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1TdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgU3R5bGVQYXJhbWV0ZXIgY2hTdHlsZSkgLT4gTm9uZSIpfSwKLQl7IkdldEl0ZW1TdHlsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEl0ZW1TdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKFN0eWxlIGNoU3R5bGUpIil9LAotCXsiU2V0TWVudUl0ZW1Db21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUNvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoTWVudUNvbW1hbmQgb3V0Q29tbWFuZElEKSIpfSwKLQl7IlNldE1lbnVJdGVtTW9kaWZpZXJzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1Nb2RpZmllcnMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFVJbnQ4IGluTW9kaWZpZXJzKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1Nb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbU1vZGlmaWVycywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQ4IG91dE1vZGlmaWVycykiKX0sCi0JeyJTZXRNZW51SXRlbUljb25IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUljb25IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFVJbnQ4IGluSWNvblR5cGUsIEhhbmRsZSBpbkljb25IYW5kbGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUljb25IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUljb25IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChVSW50OCBvdXRJY29uVHlwZSwgSGFuZGxlIG91dEljb25IYW5kbGUpIil9LAotCXsiU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVRleHRFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVGV4dEVuY29kaW5nIGluU2NyaXB0SUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbVRleHRFbmNvZGluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtVGV4dEVuY29kaW5nLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVGV4dEVuY29kaW5nIG91dFNjcmlwdElEKSIpfSwKLQl7IlNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUhpZXJhcmNoaWNhbElELCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBNZW51SUQgaW5IaWVySUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKE1lbnVJRCBvdXRIaWVySUQpIil9LAotCXsiU2V0TWVudUl0ZW1Gb250SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUZvbnRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgU0ludDE2IGluRm9udElEKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1Gb250SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUZvbnRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFNJbnQxNiBvdXRGb250SUQpIil9LAotCXsiU2V0TWVudUl0ZW1SZWZDb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVUludDMyIGluUmVmQ29uKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1SZWZDb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQzMiBvdXRSZWZDb24pIil9LAotCXsiU2V0TWVudUl0ZW1LZXlHbHlwaCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtS2V5R2x5cGgsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFNJbnQxNiBpbkdseXBoKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1LZXlHbHlwaCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtS2V5R2x5cGgsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChTSW50MTYgb3V0R2x5cGgpIil9LAotCXsiTWFjRW5hYmxlTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNFbmFibGVNZW51SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiBOb25lIil9LAotCXsiRGlzYWJsZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGlzYWJsZU1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVJdGVtRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1FbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJFbmFibGVNZW51SXRlbUljb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVNZW51SXRlbUljb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVNZW51SXRlbUljb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUl0ZW1JY29uLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVJdGVtSWNvbkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVJdGVtSWNvbkVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIE1lbnVIYW5kbGUgaW5IaWVyTWVudSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChNZW51SGFuZGxlIG91dEhpZXJNZW51KSIpfSwKLQl7IkNvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nKSIpfSwKLQl7IlNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIENGU3RyaW5nUmVmIGluU3RyaW5nKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1JbmRlbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUluZGVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChVSW50MzIgb3V0SW5kZW50KSIpfSwKLQl7IlNldE1lbnVJdGVtSW5kZW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1JbmRlbnQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBVSW50MzIgaW5JbmRlbnQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUNvbW1hbmRLZXkiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRLZXksIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBCb29sZWFuIGluR2V0VmlydHVhbEtleSkgLT4gKFVJbnQxNiBvdXRLZXkpIil9LAotCXsiU2V0TWVudUl0ZW1Db21tYW5kS2V5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1Db21tYW5kS2V5LCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgQm9vbGVhbiBpblNldFZpcnR1YWxLZXksIFVJbnQxNiBpbktleSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSwgT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnKSAtPiAoVUludDMyIGF0dHJpYnV0ZXMpIil9LAotCXsiQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtLCBPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcsIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQsIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcikgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVBdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXMpIil9LAotCXsiQ2hhbmdlTWVudUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51QXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUF0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzLCBNZW51QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoTWVudUl0ZW1BdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXMpIil9LAotCXsiQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0sIE1lbnVJdGVtQXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXMsIE1lbnVJdGVtQXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVBbGxNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlQWxsTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJFbmFibGVBbGxNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVBbGxNZW51SXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1lbnVIYXNFbmFibGVkSXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NZW51SGFzRW5hYmxlZEl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRNZW51VHlwZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVUeXBlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgb3V0VHlwZSkiKX0sCi0JeyJDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVSW50MzIgaW5JdGVtSW5kZXgpIC0+IChNZW51SGFuZGxlIG91dE1lbnUsIE1lbnVJdGVtSW5kZXggb3V0SW5kZXgpIil9LAotCXsiRW5hYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVNZW51Q29tbWFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCi0JeyJEaXNhYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUNvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiSXNNZW51Q29tbWFuZEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVDb21tYW5kRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51Q29tbWFuZE1hcmssIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVbmlDaGFyIGluTWFyaykgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVDb21tYW5kTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVDb21tYW5kTWFyaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChVbmlDaGFyIG91dE1hcmspIil9LAotCXsiR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IChCeXRlQ291bnQgb3V0U2l6ZSkiKX0sCi0JeyJSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVJdGVtSW52YWxpZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1JbnZhbGlkLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkludmFsaWRhdGVNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnZhbGlkYXRlTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcykgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZUludmFsaWRNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9VcGRhdGVJbnZhbGlkTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDcmVhdGVTdGFuZGFyZEZvbnRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ3JlYXRlU3RhbmRhcmRGb250TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBhZnRlckl0ZW0sIE1lbnVJRCBmaXJzdEhpZXJNZW51SUQsIE9wdGlvbkJpdHMgb3B0aW9ucykgLT4gKEl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50KSIpfSwKLQl7IlVwZGF0ZVN0YW5kYXJkRm9udE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9VcGRhdGVTdGFuZGFyZEZvbnRNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudCkiKX0sCi0JeyJHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEZNRm9udEZhbWlseSBvdXRGb250RmFtaWx5LCBGTUZvbnRTdHlsZSBvdXRTdHlsZSkiKX0sCi0JeyJHZXRNZW51SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVJRCBfcnYpIil9LAotCXsiR2V0TWVudVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudVdpZHRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkdldE1lbnVIZWlnaHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlNldE1lbnVJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IlNldE1lbnVXaWR0aCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHdpZHRoKSAtPiBOb25lIil9LAotCXsiU2V0TWVudUhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJhc19SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX2FzX1Jlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkFwcGVuZE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9BcHBlbmRNZW51LCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgZGF0YSkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBiZWZvcmVJRCkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydE1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0TWVudUl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBpdGVtU3RyaW5nLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJFbmFibGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZU1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihVSW50MTYgaXRlbSkgLT4gTm9uZSIpfSwKLQl7IkNoZWNrTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGVja01lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBCb29sZWFuIGNoZWNrZWQpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJEaXNwb3NlTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc3Bvc2VNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDYWxjTWVudVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DYWxjTWVudVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvdW50TWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ291bnRNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBfcnYpIil9LAorICAgIHsiR2V0TWVudUZvbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEZvbnRJRCwgVUludDE2IG91dEZvbnRTaXplKSIpfSwKKyAgICB7IlNldE1lbnVGb250IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkZvbnRJRCwgVUludDE2IGluRm9udFNpemUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4sIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gZXhjbHVkZXNNYXJrKSAtPiBOb25lIil9LAorICAgIHsiSXNWYWxpZE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc1ZhbGlkTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0TWVudVJldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudVJldGFpbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IlJldGFpbk1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9SZXRhaW5NZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJSZWxlYXNlTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1JlbGVhc2VNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEdXBsaWNhdGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRHVwbGljYXRlTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51KSIpfSwKKyAgICB7IkNvcHlNZW51VGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFN0cmluZykiKX0sCisgICAgeyJTZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiSW52YWxpZGF0ZU1lbnVTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW52YWxpZGF0ZU1lbnVTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVTaXplSW52YWxpZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudVNpemVJbnZhbGlkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNBcHBlbmRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjQXBwZW5kTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGRhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRSZXNNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0UmVzTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJBcHBlbmRSZXNNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kUmVzTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiTWFjSW5zZXJ0TWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNJbnNlcnRNZW51SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGl0ZW1TdHJpbmcsIHNob3J0IGFmdGVySXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkRlbGV0ZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGVsZXRlTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRGb250UmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydEZvbnRSZXNNZW51LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBhZnRlckl0ZW0sIHNob3J0IHNjcmlwdEZpbHRlcikgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydEludGxSZXNNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0SW50bFJlc01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgYWZ0ZXJJdGVtLCBzaG9ydCBzY3JpcHRGaWx0ZXIpIC0+IE5vbmUiKX0sCisgICAgeyJBcHBlbmRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9BcHBlbmRNZW51SXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBpblN0cmluZykgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydE1lbnVJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnVJdGVtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGluU3RyaW5nLCBNZW51SXRlbUluZGV4IGFmdGVySXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3B5TWVudUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcywgTWVudUhhbmRsZSBpbkRlc3RNZW51LCBNZW51SXRlbUluZGV4IGluSW5zZXJ0QWZ0ZXIpIC0+IE5vbmUiKX0sCisgICAgeyJEZWxldGVNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EZWxldGVNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW0sIEl0ZW1Db3VudCBpbk51bUl0ZW1zKSAtPiBOb25lIil9LAorICAgIHsiQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgTWVudUl0ZW1BdHRyaWJ1dGVzIGluQXR0cmlidXRlcywgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChNZW51SXRlbUluZGV4IG91dE5ld0l0ZW0pIil9LAorICAgIHsiSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgTWVudUl0ZW1JbmRleCBpbkFmdGVySXRlbSwgTWVudUl0ZW1BdHRyaWJ1dGVzIGluQXR0cmlidXRlcywgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJQb3BVcE1lbnVTZWxlY3QiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Qb3BVcE1lbnVTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHRvcCwgc2hvcnQgbGVmdCwgc2hvcnQgcG9wVXBJdGVtKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiSW52YWxpZGF0ZU1lbnVFbmFibGluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0ludmFsaWRhdGVNZW51RW5hYmxpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUJhckludmFsaWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVCYXJJbnZhbGlkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNJbnNlcnRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjSW5zZXJ0TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIGJlZm9yZUlEKSAtPiBOb25lIil9LAorICAgIHsiU2V0Um9vdE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRSb290TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTWFjQ2hlY2tNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0NoZWNrTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIEJvb2xlYW4gY2hlY2tlZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1lbnVJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgU3RyMjU1IGl0ZW1TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChTdHIyNTUgaXRlbVN0cmluZykiKX0sCisgICAgeyJTZXRJdGVtTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1NYXJrLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBDaGFyUGFyYW1ldGVyIG1hcmtDaGFyKSAtPiBOb25lIil9LAorICAgIHsiR2V0SXRlbU1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJdGVtTWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKENoYXJQYXJhbWV0ZXIgbWFya0NoYXIpIil9LAorICAgIHsiU2V0SXRlbUNtZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1DbWQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIENoYXJQYXJhbWV0ZXIgY21kQ2hhcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldEl0ZW1DbWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJdGVtQ21kLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoQ2hhclBhcmFtZXRlciBjbWRDaGFyKSIpfSwKKyAgICB7IlNldEl0ZW1JY29uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0SXRlbUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIHNob3J0IGljb25JbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEl0ZW1JY29uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChzaG9ydCBpY29uSW5kZXgpIil9LAorICAgIHsiU2V0SXRlbVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0SXRlbVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBTdHlsZVBhcmFtZXRlciBjaFN0eWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0SXRlbVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoU3R5bGUgY2hTdHlsZSkiKX0sCisgICAgeyJTZXRNZW51SXRlbUNvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtQ29tbWFuZElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1Db21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChNZW51Q29tbWFuZCBvdXRDb21tYW5kSUQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1Nb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbU1vZGlmaWVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVUludDggaW5Nb2RpZmllcnMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbU1vZGlmaWVycyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtTW9kaWZpZXJzLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVUludDggb3V0TW9kaWZpZXJzKSIpfSwKKyAgICB7IlNldE1lbnVJdGVtSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSWNvbkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVUludDggaW5JY29uVHlwZSwgSGFuZGxlIGluSWNvbkhhbmRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSWNvbkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQ4IG91dEljb25UeXBlLCBIYW5kbGUgb3V0SWNvbkhhbmRsZSkiKX0sCisgICAgeyJTZXRNZW51SXRlbVRleHRFbmNvZGluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtVGV4dEVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBUZXh0RW5jb2RpbmcgaW5TY3JpcHRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtVGV4dEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChUZXh0RW5jb2Rpbmcgb3V0U2NyaXB0SUQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIE1lbnVJRCBpbkhpZXJJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUhpZXJhcmNoaWNhbElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoTWVudUlEIG91dEhpZXJJRCkiKX0sCisgICAgeyJTZXRNZW51SXRlbUZvbnRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtRm9udElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBTSW50MTYgaW5Gb250SUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUZvbnRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtRm9udElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoU0ludDE2IG91dEZvbnRJRCkiKX0sCisgICAgeyJTZXRNZW51SXRlbVJlZkNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtUmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBVSW50MzIgaW5SZWZDb24pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbVJlZkNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtUmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVUludDMyIG91dFJlZkNvbikiKX0sCisgICAgeyJTZXRNZW51SXRlbUtleUdseXBoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1LZXlHbHlwaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgU0ludDE2IGluR2x5cGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUtleUdseXBoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1LZXlHbHlwaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFNJbnQxNiBvdXRHbHlwaCkiKX0sCisgICAgeyJNYWNFbmFibGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0VuYWJsZU1lbnVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJEaXNhYmxlTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUl0ZW1FbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51SXRlbUVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkVuYWJsZU1lbnVJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZU1lbnVJdGVtSWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZU1lbnVJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc2FibGVNZW51SXRlbUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUl0ZW1JY29uRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1JY29uRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgTWVudUhhbmRsZSBpbkhpZXJNZW51KSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKE1lbnVIYW5kbGUgb3V0SGllck1lbnUpIil9LAorICAgIHsiQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAorICAgIHsiU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUluZGVudCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSW5kZW50LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKFVJbnQzMiBvdXRJbmRlbnQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1JbmRlbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUluZGVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIFVJbnQzMiBpbkluZGVudCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtQ29tbWFuZEtleSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQ29tbWFuZEtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIEJvb2xlYW4gaW5HZXRWaXJ0dWFsS2V5KSAtPiAoVUludDE2IG91dEtleSkiKX0sCisgICAgeyJTZXRNZW51SXRlbUNvbW1hbmRLZXkiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBCb29sZWFuIGluU2V0VmlydHVhbEtleSwgVUludDE2IGluS2V5KSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtLCBPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IChVSW50MzIgYXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NoYW5nZU1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0sIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZywgVUludDMyIGF0dHJpYnV0ZXNUb1NldCwgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VNZW51QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NoYW5nZU1lbnVBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZW51QXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXMsIE1lbnVBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1BdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1BdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IChNZW51SXRlbUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSwgTWVudUl0ZW1BdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlcywgTWVudUl0ZW1BdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZUFsbE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc2FibGVBbGxNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkVuYWJsZUFsbE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZUFsbE1lbnVJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTWVudUhhc0VuYWJsZWRJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX01lbnVIYXNFbmFibGVkSXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldE1lbnVUeXBlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvdXRUeXBlKSIpfSwKKyAgICB7IkNvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IkdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVJbnQzMiBpbkl0ZW1JbmRleCkgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSwgTWVudUl0ZW1JbmRleCBvdXRJbmRleCkiKX0sCisgICAgeyJFbmFibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZU1lbnVDb21tYW5kLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpc2FibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc2FibGVNZW51Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVDb21tYW5kRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUNvbW1hbmRFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldE1lbnVDb21tYW5kTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVDb21tYW5kTWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVuaUNoYXIgaW5NYXJrKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUNvbW1hbmRNYXJrLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKFVuaUNoYXIgb3V0TWFyaykiKX0sCisgICAgeyJHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gKEJ5dGVDb3VudCBvdXRTaXplKSIpfSwKKyAgICB7IlJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9SZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUl0ZW1JbnZhbGlkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51SXRlbUludmFsaWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSW52YWxpZGF0ZU1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0ludmFsaWRhdGVNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW0sIEl0ZW1Db3VudCBpbk51bUl0ZW1zKSAtPiBOb25lIil9LAorICAgIHsiVXBkYXRlSW52YWxpZE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1VwZGF0ZUludmFsaWRNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNyZWF0ZVN0YW5kYXJkRm9udE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DcmVhdGVTdGFuZGFyZEZvbnRNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGFmdGVySXRlbSwgTWVudUlEIGZpcnN0SGllck1lbnVJRCwgT3B0aW9uQml0cyBvcHRpb25zKSAtPiAoSXRlbUNvdW50IG91dEhpZXJNZW51Q291bnQpIil9LAorICAgIHsiVXBkYXRlU3RhbmRhcmRGb250TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1VwZGF0ZVN0YW5kYXJkRm9udE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50KSIpfSwKKyAgICB7IkdldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoRk1Gb250RmFtaWx5IG91dEZvbnRGYW1pbHksIEZNRm9udFN0eWxlIG91dFN0eWxlKSIpfSwKKyAgICB7IkdldE1lbnVJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUlEIF9ydikiKX0sCisgICAgeyJHZXRNZW51V2lkdGgiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51V2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiR2V0TWVudUhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiU2V0TWVudUlEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUlELCAxLAorICAgICBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVudVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudVdpZHRoLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgd2lkdGgpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNZW51SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUhlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7ImFzX1Jlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfYXNfUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiQXBwZW5kTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBkYXRhKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGJlZm9yZUlEKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0TWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGl0ZW1TdHJpbmcsIHNob3J0IGFmdGVySXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkVuYWJsZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRW5hYmxlTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBpdGVtKSAtPiBOb25lIil9LAorICAgIHsiQ2hlY2tNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NoZWNrTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIEJvb2xlYW4gY2hlY2tlZCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgTWVudU9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTI1NDAsNjEgKzI1NDAsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlNZW51SGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTWVudUhhbmRsZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNZW51T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTWVudU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNZW51T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoTWVudU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBNZW51T2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1lbnVfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfTWVudS5NZW51IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTWVudU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIE1lbnVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgTWVudU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTWVudU9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgTWVudU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlNZW51T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1lbnVPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JTWVudU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JTWVudU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNZW51T2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JTWVudU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX01lbnUuTWVudSIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKE1lbnVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBNZW51T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIE1lbnVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIE1lbnVPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIE1lbnVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTWVudU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBNZW51T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIE1lbnVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIE1lbnVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgTWVudU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIE1lbnVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgTWVudSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNjAyLDg0MiArMjYwMiw4NDIgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X05ld01lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgX3J2OwotCU1lbnVJRCBtZW51SUQ7Ci0JU3RyMjU1IG1lbnVUaXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CisgICAgTWVudUlEIG1lbnVJRDsKKyAgICBTdHIyNTUgbWVudVRpdGxlOwogI2lmbmRlZiBOZXdNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTmV3TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG1lbnVUaXRsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld01lbnUobWVudUlELAotCSAgICAgICAgICAgICAgbWVudVRpdGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbWVudVRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3TWVudShtZW51SUQsCisgICAgICAgICAgICAgICAgICBtZW51VGl0bGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NYWNHZXRNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlzaG9ydCByZXNvdXJjZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBzaG9ydCByZXNvdXJjZUlEOwogI2lmbmRlZiBNYWNHZXRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjR2V0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjR2V0TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNHZXRNZW51KHJlc291cmNlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjR2V0TWVudShyZXNvdXJjZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfQ3JlYXRlTmV3TWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SUQgaW5NZW51SUQ7Ci0JTWVudUF0dHJpYnV0ZXMgaW5NZW51QXR0cmlidXRlczsKLQlNZW51SGFuZGxlIG91dE1lbnVSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUlEIGluTWVudUlEOworICAgIE1lbnVBdHRyaWJ1dGVzIGluTWVudUF0dHJpYnV0ZXM7CisgICAgTWVudUhhbmRsZSBvdXRNZW51UmVmOwogI2lmbmRlZiBDcmVhdGVOZXdNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWVudUF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlTmV3TWVudShpbk1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICBpbk1lbnVBdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnVSZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NZW51QXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVOZXdNZW51KGluTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVudUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NZW51S2V5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlDaGFyUGFyYW1ldGVyIGNoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBDaGFyUGFyYW1ldGVyIGNoOwogI2lmbmRlZiBNZW51S2V5Ci0JUHlNYWNfUFJFQ0hFQ0soTWVudUtleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVudUtleSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVudUtleShjaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lbnVLZXkoY2gpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfTWVudVNlbGVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUG9pbnQgc3RhcnRQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgUG9pbnQgc3RhcnRQdDsKICNpZm5kZWYgTWVudVNlbGVjdAotCVB5TWFjX1BSRUNIRUNLKE1lbnVTZWxlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lbnVTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZW51U2VsZWN0KHN0YXJ0UHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVudVNlbGVjdChzdGFydFB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X01lbnVDaG9pY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgTWVudUNob2ljZQotCVB5TWFjX1BSRUNIRUNLKE1lbnVDaG9pY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lbnVDaG9pY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lbnVDaG9pY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVudUNob2ljZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfTWVudUV2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCUV2ZW50UmVjb3JkIGluRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CisgICAgRXZlbnRSZWNvcmQgaW5FdmVudDsKICNpZm5kZWYgTWVudUV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTWVudUV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZW51RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmluRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZW51RXZlbnQoJmluRXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpbkV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVudUV2ZW50KCZpbkV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldE1CYXJIZWlnaHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRNQmFySGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TUJhckhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TUJhckhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TUJhckhlaWdodCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNQmFySGVpZ2h0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NYWNEcmF3TWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBNYWNEcmF3TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKE1hY0RyYXdNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNEcmF3TWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjRHJhd01lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0RyYXdNZW51QmFyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfSW52YWxNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEludmFsTWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKEludmFsTWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52YWxNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZhbE1lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEludmFsTWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0hpbGl0ZU1lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBtZW51SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBtZW51SUQ7CiAjaWZuZGVmIEhpbGl0ZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWxpdGVNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlsaXRlTWVudShtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpbGl0ZU1lbnUobWVudUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXROZXdNQmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51QmFySGFuZGxlIF9ydjsKLQlzaG9ydCBtZW51QmFySUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVCYXJIYW5kbGUgX3J2OworICAgIHNob3J0IG1lbnVCYXJJRDsKICNpZm5kZWYgR2V0TmV3TUJhcgotCVB5TWFjX1BSRUNIRUNLKEdldE5ld01CYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5ld01CYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZW51QmFySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXdNQmFyKG1lbnVCYXJJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUJhcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV3TUJhcihtZW51QmFySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldE1lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVCYXJIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51QmFySGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lbnVCYXIoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lbnVCYXIoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9TZXRNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51QmFySGFuZGxlIG1iYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVCYXJIYW5kbGUgbWJhcjsKICNpZm5kZWYgU2V0TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1iYXIpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZW51QmFyKG1iYXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWJhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1lbnVCYXIobWJhcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRHVwbGljYXRlTWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51QmFySGFuZGxlIGluTWJhcjsKLQlNZW51QmFySGFuZGxlIG91dE1iYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUJhckhhbmRsZSBpbk1iYXI7CisgICAgTWVudUJhckhhbmRsZSBvdXRNYmFyOwogI2lmbmRlZiBEdXBsaWNhdGVNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soRHVwbGljYXRlTWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHVwbGljYXRlTWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5NYmFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IER1cGxpY2F0ZU1lbnVCYXIoaW5NYmFyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYmFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0TWJhcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluTWJhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEdXBsaWNhdGVNZW51QmFyKGluTWJhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWJhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dE1iYXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRGlzcG9zZU1lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUJhckhhbmRsZSBpbk1iYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUJhckhhbmRsZSBpbk1iYXI7CiAjaWZuZGVmIERpc3Bvc2VNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZU1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbk1iYXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGlzcG9zZU1lbnVCYXIoaW5NYmFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5NYmFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERpc3Bvc2VNZW51QmFyKGluTWJhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51SGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBHZXRNZW51SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lbnVIYW5kbGUobWVudUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudUhhbmRsZShtZW51SUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NYWNEZWxldGVNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBNYWNEZWxldGVNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRGVsZXRlTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRGVsZXRlTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCU1hY0RlbGV0ZU1lbnUobWVudUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNEZWxldGVNZW51KG1lbnVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfQ2xlYXJNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsZWFyTWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKENsZWFyTWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xlYXJNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGVhck1lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsZWFyTWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X1NldE1lbnVGbGFzaENvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBjb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgY291bnQ7CiAjaWZuZGVmIFNldE1lbnVGbGFzaENvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUZsYXNoQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVGbGFzaENvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZW51Rmxhc2hDb3VudChjb3VudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZW51Rmxhc2hDb3VudChjb3VudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRmxhc2hNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBGbGFzaE1lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCUZsYXNoTWVudUJhcihtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZsYXNoTWVudUJhcihtZW51SUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0lzTWVudUJhclZpc2libGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNNZW51QmFyVmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKElzTWVudUJhclZpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUJhclZpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUJhclZpc2libGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51QmFyVmlzaWJsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfU2hvd01lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd01lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhTaG93TWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd01lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dNZW51QmFyKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaG93TWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0hpZGVNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEhpZGVNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZU1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlTWVudUJhcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSGlkZU1lbnVCYXIoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9BY3F1aXJlUm9vdE1lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKICNpZm5kZWYgQWNxdWlyZVJvb3RNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soQWNxdWlyZVJvb3RNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBY3F1aXJlUm9vdE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFjcXVpcmVSb290TWVudSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEFjcXVpcmVSb290TWVudSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9EZWxldGVNQ0VudHJpZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBtZW51SUQ7Ci0Jc2hvcnQgbWVudUl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBtZW51SUQ7CisgICAgc2hvcnQgbWVudUl0ZW07CiAjaWZuZGVmIERlbGV0ZU1DRW50cmllcwotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1DRW50cmllcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTUNFbnRyaWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGVsZXRlTUNFbnRyaWVzKG1lbnVJRCwKLQkgICAgICAgICAgICAgICAgbWVudUl0ZW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERlbGV0ZU1DRW50cmllcyhtZW51SUQsCisgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9Jbml0Q29udGV4dHVhbE1lbnVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBJbml0Q29udGV4dHVhbE1lbnVzCi0JUHlNYWNfUFJFQ0hFQ0soSW5pdENvbnRleHR1YWxNZW51cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5pdENvbnRleHR1YWxNZW51cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluaXRDb250ZXh0dWFsTWVudXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluaXRDb250ZXh0dWFsTWVudXMoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0lzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIGluRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVjb3JkIGluRXZlbnQ7CiAjaWZuZGVmIElzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2sKLQlQeU1hY19QUkVDSEVDSyhJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNTaG93Q29udGV4dHVhbE1lbnVDbGljaygmaW5FdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmluRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKCZpbkV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0xNR2V0VGhlTWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgTE1HZXRUaGVNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRUaGVNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFRoZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0VGhlTWVudSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFRoZU1lbnUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X2FzX01lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgX3J2OwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgYXNfTWVudQotCVB5TWFjX1BSRUNIRUNLKGFzX01lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKGFzX01lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19NZW51KGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19NZW51KGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlzaG9ydCByZXNvdXJjZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBzaG9ydCByZXNvdXJjZUlEOwogI2lmbmRlZiBHZXRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51KHJlc291cmNlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudShyZXNvdXJjZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRGVsZXRlTWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtZW51SUQ7CiAjaWZuZGVmIERlbGV0ZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhEZWxldGVNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGVsZXRlTWVudShtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERlbGV0ZU1lbnUobWVudUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9EcmF3TWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEcmF3TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKERyYXdNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3TWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRHJhd01lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdNZW51QmFyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlVSW50MzIgaW5JdGVtSW5kZXg7Ci0JTWVudUhhbmRsZSBvdXRNZW51OwotCU1lbnVJdGVtSW5kZXggb3V0SW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgVUludDMyIGluSXRlbUluZGV4OworICAgIE1lbnVIYW5kbGUgb3V0TWVudTsKKyAgICBNZW51SXRlbUluZGV4IG91dEluZGV4OwogI2lmbmRlZiBHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1JbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51LAotCSAgICAgICAgICAgICAgICAgICAgIG91dEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1JbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0VuYWJsZU1lbnVDb21tYW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CiAjaWZuZGVmIEVuYWJsZU1lbnVDb21tYW5kCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUNvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVDb21tYW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRW5hYmxlTWVudUNvbW1hbmQoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFbmFibGVNZW51Q29tbWFuZChpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0Rpc2FibGVNZW51Q29tbWFuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBEaXNhYmxlTWVudUNvbW1hbmQKLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUNvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc2FibGVNZW51Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVNZW51Q29tbWFuZChpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNhYmxlTWVudUNvbW1hbmQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfSXNNZW51Q29tbWFuZEVuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgSXNNZW51Q29tbWFuZEVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhJc01lbnVDb21tYW5kRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNNZW51Q29tbWFuZEVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVDb21tYW5kRW5hYmxlZChpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51Q29tbWFuZEVuYWJsZWQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X1NldE1lbnVDb21tYW5kTWFyayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlVbmlDaGFyIGluTWFyazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBVbmlDaGFyIGluTWFyazsKICNpZm5kZWYgU2V0TWVudUNvbW1hbmRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUNvbW1hbmRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51Q29tbWFuZE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWFyayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWFyayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51Q29tbWFuZE1hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVW5pQ2hhciBvdXRNYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFVuaUNoYXIgb3V0TWFyazsKICNpZm5kZWYgR2V0TWVudUNvbW1hbmRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51Q29tbWFuZE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUNvbW1hbmRNYXJrKGluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hcmspOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1hcmspOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVDb21tYW5kTWFyayhpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYXJrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNYXJrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCU9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKLQlCeXRlQ291bnQgb3V0U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIGluUHJvcGVydHlUYWc7CisgICAgQnl0ZUNvdW50IG91dFNpemU7CiAjaWZuZGVmIEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKGluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9SZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCU9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIGluUHJvcGVydHlUYWc7CiAjaWZuZGVmIFJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eShpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KGluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5VGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgTWVudV9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJOZXdNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTmV3TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCwgU3RyMjU1IG1lbnVUaXRsZSkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKLQl7Ik1hY0dldE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9NYWNHZXRNZW51LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZXNvdXJjZUlEKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiQ3JlYXRlTmV3TWVudSIsIChQeUNGdW5jdGlvbilNZW51X0NyZWF0ZU5ld01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBpbk1lbnVJRCwgTWVudUF0dHJpYnV0ZXMgaW5NZW51QXR0cmlidXRlcykgLT4gKE1lbnVIYW5kbGUgb3V0TWVudVJlZikiKX0sCi0JeyJNZW51S2V5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudUtleSwgMSwKLQkgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik1lbnVTZWxlY3QiLCAoUHlDRnVuY3Rpb24pTWVudV9NZW51U2VsZWN0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0KSAtPiAobG9uZyBfcnYpIil9LAotCXsiTWVudUNob2ljZSIsIChQeUNGdW5jdGlvbilNZW51X01lbnVDaG9pY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik1lbnVFdmVudCIsIChQeUNGdW5jdGlvbilNZW51X01lbnVFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaW5FdmVudCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiR2V0TUJhckhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51X0dldE1CYXJIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJNYWNEcmF3TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X01hY0RyYXdNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJbnZhbE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9JbnZhbE1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkhpbGl0ZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9IaWxpdGVNZW51LCAxLAotCSBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAotCXsiR2V0TmV3TUJhciIsIChQeUNGdW5jdGlvbilNZW51X0dldE5ld01CYXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1lbnVCYXJJRCkgLT4gKE1lbnVCYXJIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51QmFySGFuZGxlIF9ydikiKX0sCi0JeyJTZXRNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfU2V0TWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUJhckhhbmRsZSBtYmFyKSAtPiBOb25lIil9LAotCXsiRHVwbGljYXRlTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0R1cGxpY2F0ZU1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVCYXJIYW5kbGUgaW5NYmFyKSAtPiAoTWVudUJhckhhbmRsZSBvdXRNYmFyKSIpfSwKLQl7IkRpc3Bvc2VNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGlzcG9zZU1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVCYXJIYW5kbGUgaW5NYmFyKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUhhbmRsZSIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCi0JeyJNYWNEZWxldGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWFjRGVsZXRlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IkNsZWFyTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0NsZWFyTWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0TWVudUZsYXNoQ291bnQiLCAoUHlDRnVuY3Rpb24pTWVudV9TZXRNZW51Rmxhc2hDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQpIC0+IE5vbmUiKX0sCi0JeyJGbGFzaE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9GbGFzaE1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVCYXJWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSXNNZW51QmFyVmlzaWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2hvd01lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9TaG93TWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSGlkZU1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9IaWRlTWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQWNxdWlyZVJvb3RNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQWNxdWlyZVJvb3RNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCi0JeyJEZWxldGVNQ0VudHJpZXMiLCAoUHlDRnVuY3Rpb24pTWVudV9EZWxldGVNQ0VudHJpZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQsIHNob3J0IG1lbnVJdGVtKSAtPiBOb25lIil9LAotCXsiSW5pdENvbnRleHR1YWxNZW51cyIsIChQeUNGdW5jdGlvbilNZW51X0luaXRDb250ZXh0dWFsTWVudXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IklzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2siLCAoUHlDRnVuY3Rpb24pTWVudV9Jc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCBpbkV2ZW50KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTE1HZXRUaGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTE1HZXRUaGVNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7ImFzX01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9hc19NZW51LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZXNvdXJjZUlEKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiRGVsZXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51X0RlbGV0ZU1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IkRyYXdNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRHJhd01lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51X0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgVUludDMyIGluSXRlbUluZGV4KSAtPiAoTWVudUhhbmRsZSBvdXRNZW51LCBNZW51SXRlbUluZGV4IG91dEluZGV4KSIpfSwKLQl7IkVuYWJsZU1lbnVDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRW5hYmxlTWVudUNvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51X0Rpc2FibGVNZW51Q29tbWFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiSXNNZW51Q29tbWFuZEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudV9Jc01lbnVDb21tYW5kRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfU2V0TWVudUNvbW1hbmRNYXJrLCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVuaUNoYXIgaW5NYXJrKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TWVudUNvbW1hbmRNYXJrLCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChVbmlDaGFyIG91dE1hcmspIil9LAotCXsiR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBpblByb3BlcnR5VGFnKSAtPiAoQnl0ZUNvdW50IG91dFNpemUpIil9LAotCXsiUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilNZW51X1JlbW92ZU1lbnVDb21tYW5kUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9OZXdNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SUQgbWVudUlELCBTdHIyNTUgbWVudVRpdGxlKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAorICAgIHsiTWFjR2V0TWVudSIsIChQeUNGdW5jdGlvbilNZW51X01hY0dldE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc291cmNlSUQpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJDcmVhdGVOZXdNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQ3JlYXRlTmV3TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIGluTWVudUlELCBNZW51QXR0cmlidXRlcyBpbk1lbnVBdHRyaWJ1dGVzKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51UmVmKSIpfSwKKyAgICB7Ik1lbnVLZXkiLCAoUHlDRnVuY3Rpb24pTWVudV9NZW51S2V5LCAxLAorICAgICBQeURvY19TVFIoIihDaGFyUGFyYW1ldGVyIGNoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiTWVudVNlbGVjdCIsIChQeUNGdW5jdGlvbilNZW51X01lbnVTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJNZW51Q2hvaWNlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudUNob2ljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiTWVudUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudUV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpbkV2ZW50KSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJHZXRNQmFySGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TUJhckhlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7Ik1hY0RyYXdNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWFjRHJhd01lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkludmFsTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0ludmFsTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlsaXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51X0hpbGl0ZU1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXROZXdNQmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TmV3TUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbWVudUJhcklEKSAtPiAoTWVudUJhckhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVCYXJIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9TZXRNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIihNZW51QmFySGFuZGxlIG1iYXIpIC0+IE5vbmUiKX0sCisgICAgeyJEdXBsaWNhdGVNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRHVwbGljYXRlTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUJhckhhbmRsZSBpbk1iYXIpIC0+IChNZW51QmFySGFuZGxlIG91dE1iYXIpIil9LAorICAgIHsiRGlzcG9zZU1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9EaXNwb3NlTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUJhckhhbmRsZSBpbk1iYXIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TWVudUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1hY0RlbGV0ZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9NYWNEZWxldGVNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiQ2xlYXJNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQ2xlYXJNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNZW51Rmxhc2hDb3VudCIsIChQeUNGdW5jdGlvbilNZW51X1NldE1lbnVGbGFzaENvdW50LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb3VudCkgLT4gTm9uZSIpfSwKKyAgICB7IkZsYXNoTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0ZsYXNoTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUJhclZpc2libGUiLCAoUHlDRnVuY3Rpb24pTWVudV9Jc01lbnVCYXJWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTaG93TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X1Nob3dNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJIaWRlTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0hpZGVNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJBY3F1aXJlUm9vdE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9BY3F1aXJlUm9vdE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRlbGV0ZU1DRW50cmllcyIsIChQeUNGdW5jdGlvbilNZW51X0RlbGV0ZU1DRW50cmllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCwgc2hvcnQgbWVudUl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJJbml0Q29udGV4dHVhbE1lbnVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSW5pdENvbnRleHR1YWxNZW51cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSXNTaG93Q29udGV4dHVhbE1lbnVDbGljayIsIChQeUNGdW5jdGlvbilNZW51X0lzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGluRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJMTUdldFRoZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9MTUdldFRoZU1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiYXNfTWVudSIsIChQeUNGdW5jdGlvbilNZW51X2FzX01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TWVudSIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc291cmNlSUQpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJEZWxldGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGVsZXRlTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiRHJhd01lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9EcmF3TWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElELCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IkdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51X0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVSW50MzIgaW5JdGVtSW5kZXgpIC0+IChNZW51SGFuZGxlIG91dE1lbnUsIE1lbnVJdGVtSW5kZXggb3V0SW5kZXgpIil9LAorICAgIHsiRW5hYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudV9FbmFibGVNZW51Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZU1lbnVDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGlzYWJsZU1lbnVDb21tYW5kLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVDb21tYW5kRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51X0lzTWVudUNvbW1hbmRFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudV9TZXRNZW51Q29tbWFuZE1hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgVW5pQ2hhciBpbk1hcmspIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51Q29tbWFuZE1hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKFVuaUNoYXIgb3V0TWFyaykiKX0sCisgICAgeyJHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IChCeXRlQ291bnQgb3V0U2l6ZSkiKX0sCisgICAgeyJSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBpblByb3BlcnR5VGFnKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTM0NDUsMzEgKzM0NDUsMzEgQEAKIAogdm9pZCBpbml0X01lbnUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lbnVIYW5kbGUsIE1lbnVPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZW51SGFuZGxlLCBNZW51T2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNZW51SGFuZGxlLCBNZW51T2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZW51SGFuZGxlLCBNZW51T2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfTWVudSIsIE1lbnVfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9NZW51IiwgTWVudV9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlNZW51X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoTWVudV9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIE1lbnVfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlNZW51X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZNZW51X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTWVudV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lbnUiLCAoUHlPYmplY3QgKikmTWVudV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk1lbnVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZW51VHlwZSIsIChQeU9iamVjdCAqKSZNZW51X1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIE1lbnVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChNZW51X0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTWVudV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIE1lbnVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk1lbnVfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZNZW51X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVudSIsIChQeU9iamVjdCAqKSZNZW51X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmTWVudV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lbnVUeXBlIiwgKFB5T2JqZWN0ICopJk1lbnVfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvbWx0ZS9fTWx0ZW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvbWx0ZS9fTWx0ZW1vZHVsZS5jCmluZGV4IDFhNmI2YTQuLmNkNjk4ZjQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21sdGUvX01sdGVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9tbHRlL19NbHRlbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM5LDE0ICszOSwxNCBAQAogc3RhdGljIGludAogT3B0RlNTcGVjUHRyX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZTU3BlYyAqKnBfaXRzZWxmKQogewotICAgICAgICBzdGF0aWMgRlNTcGVjIGZzczsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgKnBfaXRzZWxmID0gJmZzczsKLSAgICAgICAgcmV0dXJuIFB5TWFjX0dldEZTU3BlYyh2LCAqcF9pdHNlbGYpOworICAgIHN0YXRpYyBGU1NwZWMgZnNzOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gJmZzczsKKyAgICByZXR1cm4gUHlNYWNfR2V0RlNTcGVjKHYsICpwX2l0c2VsZik7CiB9CiAKIC8qCkBAIC01NSwxMiArNTUsMTIgQEAKIHN0YXRpYyBpbnQKIE9wdEdXb3JsZE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBHV29ybGRQdHIgKnBfaXRzZWxmKQogewotICAgICAgICBpZiAodiA9PSBQeV9Ob25lKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gR1dvcmxkT2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIEdXb3JsZE9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKIH0KIAogCkBAIC03MywxMTU5ICs3MywxMTU5IEBACiAjZGVmaW5lIFRYTk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZUWE5PYmplY3RfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVFhOT2JqZWN0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBUWE5PYmplY3RPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlUWE5PYmplY3Qgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUWE5PYmplY3Qgb2JfaXRzZWxmOwogfSBUWE5PYmplY3RPYmplY3Q7CiAKIFB5T2JqZWN0ICpUWE5PYmpfTmV3KFRYTk9iamVjdCBpdHNlbGYpCiB7Ci0JVFhOT2JqZWN0T2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoVFhOT2JqZWN0T2JqZWN0LCAmVFhOT2JqZWN0X1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBUWE5PYmplY3RPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhUWE5PYmplY3RPYmplY3QsICZUWE5PYmplY3RfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVFhOT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRYTk9iamVjdCAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFUWE5PYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVFhOT2JqZWN0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFRYTk9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFUWE5PYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVFhOT2JqZWN0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRYTk9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRYTk9ial9kZWFsbG9jKFRYTk9iamVjdE9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkRlbGV0ZU9iamVjdChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhORGVsZXRlT2JqZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVFhORGVsZXRlT2JqZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5EZWxldGVPYmplY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTkRlbGV0ZU9iamVjdChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkRlbGV0ZU9iamVjdChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlJlc2l6ZUZyYW1lKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIGlXaWR0aDsKLQlVSW50MzIgaUhlaWdodDsKLQlUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgaVdpZHRoOworICAgIFVJbnQzMiBpSGVpZ2h0OworICAgIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQ7CiAjaWZuZGVmIFRYTlJlc2l6ZUZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soVFhOUmVzaXplRnJhbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlJlc2l6ZUZyYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpSGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5SZXNpemVGcmFtZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIGlXaWR0aCwKLQkgICAgICAgICAgICAgICBpSGVpZ2h0LAotCSAgICAgICAgICAgICAgIGlUWE5GcmFtZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVFhORnJhbWVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlJlc2l6ZUZyYW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOU2V0RnJhbWVCb3VuZHMoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgaVRvcDsKLQlTSW50MzIgaUxlZnQ7Ci0JU0ludDMyIGlCb3R0b207Ci0JU0ludDMyIGlSaWdodDsKLQlUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgaVRvcDsKKyAgICBTSW50MzIgaUxlZnQ7CisgICAgU0ludDMyIGlCb3R0b207CisgICAgU0ludDMyIGlSaWdodDsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOwogI2lmbmRlZiBUWE5TZXRGcmFtZUJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFRYTlNldEZyYW1lQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5TZXRGcmFtZUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpVG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpQm90dG9tLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5TZXRGcmFtZUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGlUb3AsCi0JICAgICAgICAgICAgICAgICAgaUxlZnQsCi0JICAgICAgICAgICAgICAgICAgaUJvdHRvbSwKLQkgICAgICAgICAgICAgICAgICBpUmlnaHQsCi0JICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5TZXRGcmFtZUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGlUb3AsCisgICAgICAgICAgICAgICAgICAgICAgaUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgaUJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICBpUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOS2V5RG93bihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50UmVjb3JkIGlFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRSZWNvcmQgaUV2ZW50OwogI2lmbmRlZiBUWE5LZXlEb3duCi0JUHlNYWNfUFJFQ0hFQ0soVFhOS2V5RG93bik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOS2V5RG93bik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOS2V5RG93bihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgJmlFdmVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5LZXlEb3duKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAmaUV2ZW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkFkanVzdEN1cnNvcihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBpb0N1cnNvclJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGlvQ3Vyc29yUmduOwogI2lmbmRlZiBUWE5BZGp1c3RDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhUWE5BZGp1c3RDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkFkanVzdEN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaW9DdXJzb3JSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5BZGp1c3RDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaW9DdXJzb3JSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaW9DdXJzb3JSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5BZGp1c3RDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaW9DdXJzb3JSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ2xpY2soVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFJlY29yZCBpRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50UmVjb3JkIGlFdmVudDsKICNpZm5kZWYgVFhOQ2xpY2sKLQlQeU1hY19QUkVDSEVDSyhUWE5DbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmlFdmVudCkpCi0JCXJldHVybiBOVUxMOwotCVRYTkNsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgJmlFdmVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5DbGljayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICZpRXZlbnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOU2VsZWN0QWxsKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5TZWxlY3RBbGwKLQlQeU1hY19QUkVDSEVDSyhUWE5TZWxlY3RBbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlNlbGVjdEFsbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOU2VsZWN0QWxsKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOU2VsZWN0QWxsKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhORm9jdXMoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGlCZWNvbWluZ0ZvY3VzZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gaUJlY29taW5nRm9jdXNlZDsKICNpZm5kZWYgVFhORm9jdXMKLQlQeU1hY19QUkVDSEVDSyhUWE5Gb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORm9jdXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpQmVjb21pbmdGb2N1c2VkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhORm9jdXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICBpQmVjb21pbmdGb2N1c2VkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpQmVjb21pbmdGb2N1c2VkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhORm9jdXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICBpQmVjb21pbmdGb2N1c2VkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlVwZGF0ZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOVXBkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5VcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTlVwZGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlVwZGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkRyYXcoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHV29ybGRQdHIgaURyYXdQb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHV29ybGRQdHIgaURyYXdQb3J0OwogI2lmbmRlZiBUWE5EcmF3Ci0JUHlNYWNfUFJFQ0hFQ0soVFhORHJhdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORHJhdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdEdXb3JsZE9ial9Db252ZXJ0LCAmaURyYXdQb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhORHJhdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgaURyYXdQb3J0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRHV29ybGRPYmpfQ29udmVydCwgJmlEcmF3UG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkRyYXcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgaURyYXdQb3J0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkZvcmNlVXBkYXRlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5Gb3JjZVVwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKFRYTkZvcmNlVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Gb3JjZVVwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhORm9yY2VVcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5Gb3JjZVVwZGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldFNsZWVwVGlja3MoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OwogI2lmbmRlZiBUWE5HZXRTbGVlcFRpY2tzCi0JUHlNYWNfUFJFQ0hFQ0soVFhOR2V0U2xlZXBUaWNrcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0U2xlZXBUaWNrcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVFhOR2V0U2xlZXBUaWNrcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOR2V0U2xlZXBUaWNrcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOSWRsZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOSWRsZQotCVB5TWFjX1BSRUNIRUNLKFRYTklkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTklkbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTklkbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5JZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR3Jvd1dpbmRvdyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50UmVjb3JkIGlFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRSZWNvcmQgaUV2ZW50OwogI2lmbmRlZiBUWE5Hcm93V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOR3Jvd1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR3Jvd1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOR3Jvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgJmlFdmVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5Hcm93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAmaUV2ZW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlpvb21XaW5kb3coVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgaVBhcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBpUGFydDsKICNpZm5kZWYgVFhOWm9vbVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFRYTlpvb21XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlpvb21XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpUGFydCkpCi0JCXJldHVybiBOVUxMOwotCVRYTlpvb21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGlQYXJ0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpUGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlpvb21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGlQYXJ0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkNhblVuZG8oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgVFhOQWN0aW9uS2V5IG9UWE5BY3Rpb25LZXk7CiAjaWZuZGVmIFRYTkNhblVuZG8KLQlQeU1hY19QUkVDSEVDSyhUWE5DYW5VbmRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5DYW5VbmRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5DYW5VbmRvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmb1RYTkFjdGlvbktleSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb1RYTkFjdGlvbktleSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTkNhblVuZG8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZvVFhOQWN0aW9uS2V5KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvVFhOQWN0aW9uS2V5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOVW5kbyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOVW5kbwotCVB5TWFjX1BSRUNIRUNLKFRYTlVuZG8pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlVuZG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTlVuZG8oX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5VbmRvKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ2FuUmVkbyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleTsKICNpZm5kZWYgVFhOQ2FuUmVkbwotCVB5TWFjX1BSRUNIRUNLKFRYTkNhblJlZG8pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkNhblJlZG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTkNhblJlZG8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZvVFhOQWN0aW9uS2V5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvVFhOQWN0aW9uS2V5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOQ2FuUmVkbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgJm9UWE5BY3Rpb25LZXkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9UWE5BY3Rpb25LZXkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5SZWRvKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5SZWRvCi0JUHlNYWNfUFJFQ0hFQ0soVFhOUmVkbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUmVkbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOUmVkbyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlJlZG8oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5DdXQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5DdXQKLQlQeU1hY19QUkVDSEVDSyhUWE5DdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkN1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkN1dChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkN1dChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ29weShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkNvcHkKLQlQeU1hY19QUkVDSEVDSyhUWE5Db3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Db3B5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQ29weShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkNvcHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlBhc3RlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVFhOUGFzdGUKLQlQeU1hY19QUkVDSEVDSyhUWE5QYXN0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUGFzdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5QYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlBhc3RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5DbGVhcihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkNsZWFyCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQ2xlYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkNsZWFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQ2xlYXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5DbGVhcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR2V0U2VsZWN0aW9uKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVFhOT2Zmc2V0IG9TdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgb0VuZE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVFhOT2Zmc2V0IG9TdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgb0VuZE9mZnNldDsKICNpZm5kZWYgVFhOR2V0U2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOR2V0U2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTkdldFNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAmb1N0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAmb0VuZE9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgb0VuZE9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkdldFNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAmb1N0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAmb0VuZE9mZnNldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb0VuZE9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNob3dTZWxlY3Rpb24oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGlTaG93RW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGlTaG93RW5kOwogI2lmbmRlZiBUWE5TaG93U2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOU2hvd1NlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2hvd1NlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlTaG93RW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOU2hvd1NlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgaVNob3dFbmQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTaG93RW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOU2hvd1NlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgaVNob3dFbmQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOSXNTZWxlY3Rpb25FbXB0eShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgVFhOSXNTZWxlY3Rpb25FbXB0eQotCVB5TWFjX1BSRUNIRUNLKFRYTklzU2VsZWN0aW9uRW1wdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTklzU2VsZWN0aW9uRW1wdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTklzU2VsZWN0aW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTklzU2VsZWN0aW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNldFNlbGVjdGlvbihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OworICAgIFRYTk9mZnNldCBpRW5kT2Zmc2V0OwogI2lmbmRlZiBUWE5TZXRTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUWE5TZXRTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlNldFNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlNldFNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5TZXRTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5Db3VudFJ1bnNJblJhbmdlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OwotCVRYTk9mZnNldCBpRW5kT2Zmc2V0OwotCUl0ZW1Db3VudCBvUnVuQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBJdGVtQ291bnQgb1J1bkNvdW50OwogI2lmbmRlZiBUWE5Db3VudFJ1bnNJblJhbmdlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQ291bnRSdW5zSW5SYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ291bnRSdW5zSW5SYW5nZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkNvdW50UnVuc0luUmFuZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb1J1bkNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvUnVuQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQ291bnRSdW5zSW5SYW5nZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvUnVuQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9SdW5Db3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkRhdGFTaXplKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQnl0ZUNvdW50IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQnl0ZUNvdW50IF9ydjsKICNpZm5kZWYgVFhORGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhUWE5EYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTkRhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUWE5EYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR2V0RGF0YShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgaUVuZE9mZnNldDsKLQlIYW5kbGUgb0RhdGFIYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBIYW5kbGUgb0RhdGFIYW5kbGU7CiAjaWZuZGVmIFRYTkdldERhdGEKLQlQeU1hY19QUkVDSEVDSyhUWE5HZXREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOR2V0RGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICBpRW5kT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICZvRGF0YUhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG9EYXRhSGFuZGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAmb0RhdGFIYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvRGF0YUhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldERhdGFFbmNvZGVkKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OwotCVRYTk9mZnNldCBpRW5kT2Zmc2V0OwotCUhhbmRsZSBvRGF0YUhhbmRsZTsKLQlUWE5EYXRhVHlwZSBpRW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBIYW5kbGUgb0RhdGFIYW5kbGU7CisgICAgVFhORGF0YVR5cGUgaUVuY29kaW5nOwogI2lmbmRlZiBUWE5HZXREYXRhRW5jb2RlZAotCVB5TWFjX1BSRUNIRUNLKFRYTkdldERhdGFFbmNvZGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXREYXRhRW5jb2RlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlFbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5HZXREYXRhRW5jb2RlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvRGF0YUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaUVuY29kaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb0RhdGFIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldERhdGFFbmNvZGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9EYXRhSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRW5jb2RpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvRGF0YUhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNldERhdGFGcm9tRmlsZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IGlGaWxlUmVmTnVtOwotCU9TVHlwZSBpRmlsZVR5cGU7Ci0JQnl0ZUNvdW50IGlGaWxlTGVuZ3RoOwotCVRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7Ci0JVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IGlGaWxlUmVmTnVtOworICAgIE9TVHlwZSBpRmlsZVR5cGU7CisgICAgQnl0ZUNvdW50IGlGaWxlTGVuZ3RoOworICAgIFRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7CisgICAgVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7CiAjaWZuZGVmIFRYTlNldERhdGFGcm9tRmlsZQotCVB5TWFjX1BSRUNIRUNLKFRYTlNldERhdGFGcm9tRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2V0RGF0YUZyb21GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRmlsZVJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUZpbGVMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlNldERhdGFGcm9tRmlsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZUxlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRmlsZVJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUZpbGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlNldERhdGFGcm9tRmlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5HZXRDaGFuZ2VDb3VudChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUl0ZW1Db3VudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEl0ZW1Db3VudCBfcnY7CiAjaWZuZGVmIFRYTkdldENoYW5nZUNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOR2V0Q2hhbmdlQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkdldENoYW5nZUNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5HZXRDaGFuZ2VDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOR2V0Q2hhbmdlQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNhdmUoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRYTkZpbGVUeXBlIGlUeXBlOwotCU9TVHlwZSBpUmVzVHlwZTsKLQlUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZzsKLQlGU1NwZWMgaUZpbGVTcGVjaWZpY2F0aW9uOwotCVNJbnQxNiBpRGF0YVJlZmVyZW5jZTsKLQlTSW50MTYgaVJlc291cmNlUmVmZXJlbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTkZpbGVUeXBlIGlUeXBlOworICAgIE9TVHlwZSBpUmVzVHlwZTsKKyAgICBUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZzsKKyAgICBGU1NwZWMgaUZpbGVTcGVjaWZpY2F0aW9uOworICAgIFNJbnQxNiBpRGF0YVJlZmVyZW5jZTsKKyAgICBTSW50MTYgaVJlc291cmNlUmVmZXJlbmNlOwogI2lmbmRlZiBUWE5TYXZlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOU2F2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2F2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaVJlc1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpUGVybWFuZW50RW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmlGaWxlU3BlY2lmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlEYXRhUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVJlc291cmNlUmVmZXJlbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlNhdmUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpVHlwZSwKLQkgICAgICAgICAgICAgICBpUmVzVHlwZSwKLQkgICAgICAgICAgICAgICBpUGVybWFuZW50RW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgJmlGaWxlU3BlY2lmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICBpRGF0YVJlZmVyZW5jZSwKLQkgICAgICAgICAgICAgICBpUmVzb3VyY2VSZWZlcmVuY2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpUmVzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlQZXJtYW5lbnRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmaUZpbGVTcGVjaWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaURhdGFSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpUmVzb3VyY2VSZWZlcmVuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOU2F2ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGlUeXBlLAorICAgICAgICAgICAgICAgICAgIGlSZXNUeXBlLAorICAgICAgICAgICAgICAgICAgIGlQZXJtYW5lbnRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAmaUZpbGVTcGVjaWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgIGlEYXRhUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgIGlSZXNvdXJjZVJlZmVyZW5jZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlJldmVydChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTlJldmVydAotCVB5TWFjX1BSRUNIRUNLKFRYTlJldmVydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUmV2ZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOUmV2ZXJ0KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUmV2ZXJ0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5QYWdlU2V0dXAoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5QYWdlU2V0dXAKLQlQeU1hY19QUkVDSEVDSyhUWE5QYWdlU2V0dXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlBhZ2VTZXR1cCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlBhZ2VTZXR1cChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlBhZ2VTZXR1cChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOUHJpbnQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5QcmludAotCVB5TWFjX1BSRUNIRUNLKFRYTlByaW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5QcmludCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlByaW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUHJpbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldFZpZXdSZWN0KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBvVmlld1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3Qgb1ZpZXdSZWN0OwogI2lmbmRlZiBUWE5HZXRWaWV3UmVjdAotCVB5TWFjX1BSRUNIRUNLKFRYTkdldFZpZXdSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRWaWV3UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOR2V0Vmlld1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmb1ZpZXdSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm9WaWV3UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkdldFZpZXdSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgJm9WaWV3UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvVmlld1JlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5TZXRWaWV3UmVjdChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgaVZpZXdSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGlWaWV3UmVjdDsKICNpZm5kZWYgVFhOU2V0Vmlld1JlY3QKLQlQeU1hY19QUkVDSEVDSyhUWE5TZXRWaWV3UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2V0Vmlld1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaVZpZXdSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOU2V0Vmlld1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmaVZpZXdSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaVZpZXdSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOU2V0Vmlld1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmaVZpZXdSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkF0dGFjaE9iamVjdFRvV2luZG93KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlHV29ybGRQdHIgaVdpbmRvdzsKLQlCb29sZWFuIGlJc0FjdHVhbFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBHV29ybGRQdHIgaVdpbmRvdzsKKyAgICBCb29sZWFuIGlJc0FjdHVhbFdpbmRvdzsKICNpZm5kZWYgVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhUWE5BdHRhY2hPYmplY3RUb1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZpV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmaUlzQWN0dWFsV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkF0dGFjaE9iamVjdFRvV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJc0FjdHVhbFdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUlzQWN0dWFsV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkF0dGFjaE9iamVjdFRvV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJc0FjdHVhbFdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5EcmFnVHJhY2tlcihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVFhORnJhbWVJRCBpVFhORnJhbWVJRDsKLQlEcmFnVHJhY2tpbmdNZXNzYWdlIGlNZXNzYWdlOwotCVdpbmRvd1B0ciBpV2luZG93OwotCURyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2U7Ci0JQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIERyYWdUcmFja2luZ01lc3NhZ2UgaU1lc3NhZ2U7CisgICAgV2luZG93UHRyIGlXaW5kb3c7CisgICAgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZTsKKyAgICBCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93OwogI2lmbmRlZiBUWE5EcmFnVHJhY2tlcgotCVB5TWFjX1BSRUNIRUNLKFRYTkRyYWdUcmFja2VyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5EcmFnVHJhY2tlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaE8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlUWE5GcmFtZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmaU1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaURyYWdSZWZlcmVuY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5EcmFnVHJhY2tlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpVFhORnJhbWVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgaU1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIGlEcmFnUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGhPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVFhORnJhbWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmlEcmFnUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORHJhZ1RyYWNrZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpRHJhZ1JlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5EcmFnUmVjZWl2ZXIoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRYTkZyYW1lSUQgaVRYTkZyYW1lSUQ7Ci0JV2luZG93UHRyIGlXaW5kb3c7Ci0JRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZTsKLQlCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQ7CisgICAgV2luZG93UHRyIGlXaW5kb3c7CisgICAgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZTsKKyAgICBCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93OwogI2lmbmRlZiBUWE5EcmFnUmVjZWl2ZXIKLQlQeU1hY19QUkVDSEVDSyhUWE5EcmFnUmVjZWl2ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkRyYWdSZWNlaXZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaURyYWdSZWZlcmVuY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5EcmFnUmVjZWl2ZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlUWE5GcmFtZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgIGlEcmFnUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICAgaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVFhORnJhbWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX0NvbnZlcnQsICZpRHJhZ1JlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkRyYWdSZWNlaXZlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaURyYWdSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkFjdGl2YXRlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOwotCVRYTlNjcm9sbEJhclN0YXRlIGlBY3RpdmVTdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIFRYTlNjcm9sbEJhclN0YXRlIGlBY3RpdmVTdGF0ZTsKICNpZm5kZWYgVFhOQWN0aXZhdGUKLQlQeU1hY19QUkVDSEVDSyhUWE5BY3RpdmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQWN0aXZhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpQWN0aXZlU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgIGlBY3RpdmVTdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpQWN0aXZlU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgIGlBY3RpdmVTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkVjaG9Nb2RlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVbmlDaGFyIGlFY2hvQ2hhcmFjdGVyOwotCVRleHRFbmNvZGluZyBpRW5jb2Rpbmc7Ci0JQm9vbGVhbiBpT247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVW5pQ2hhciBpRWNob0NoYXJhY3RlcjsKKyAgICBUZXh0RW5jb2RpbmcgaUVuY29kaW5nOworICAgIEJvb2xlYW4gaU9uOwogI2lmbmRlZiBUWE5FY2hvTW9kZQotCVB5TWFjX1BSRUNIRUNLKFRYTkVjaG9Nb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5FY2hvTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUVjaG9DaGFyYWN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpT24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhORWNob01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaUVjaG9DaGFyYWN0ZXIsCi0JICAgICAgICAgICAgICAgICAgIGlFbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgaU9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVjaG9DaGFyYWN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpT24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORWNob01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaUVjaG9DaGFyYWN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGlFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgaU9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhORG9Gb250TWVudVNlbGVjdGlvbihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0OwotCVNJbnQxNiBpTWVudUlEOwotCVNJbnQxNiBpTWVudUl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0OworICAgIFNJbnQxNiBpTWVudUlEOworICAgIFNJbnQxNiBpTWVudUl0ZW07CiAjaWZuZGVmIFRYTkRvRm9udE1lbnVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBUWE5Gb250TWVudU9ial9Db252ZXJ0LCAmaVRYTkZvbnRNZW51T2JqZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaU1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZvbnRNZW51T2JqZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1lbnVJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVFhORm9udE1lbnVPYmpfQ29udmVydCwgJmlUWE5Gb250TWVudU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpTWVudUl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORG9Gb250TWVudVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlUWE5Gb250TWVudU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW51SXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlByZXBhcmVGb250TWVudShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdDsKICNpZm5kZWYgVFhOUHJlcGFyZUZvbnRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOUHJlcGFyZUZvbnRNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5QcmVwYXJlRm9udE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUWE5Gb250TWVudU9ial9Db252ZXJ0LCAmaVRYTkZvbnRNZW51T2JqZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlByZXBhcmVGb250TWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZvbnRNZW51T2JqZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRYTkZvbnRNZW51T2JqX0NvbnZlcnQsICZpVFhORm9udE1lbnVPYmplY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUHJlcGFyZUZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVFhORm9udE1lbnVPYmplY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5Qb2ludFRvT2Zmc2V0KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBpUG9pbnQ7Ci0JVFhOT2Zmc2V0IG9PZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgaVBvaW50OworICAgIFRYTk9mZnNldCBvT2Zmc2V0OwogI2lmbmRlZiBUWE5Qb2ludFRvT2Zmc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOUG9pbnRUb09mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUG9pbnRUb09mZnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaVBvaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlBvaW50VG9PZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpUG9pbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm9PZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG9PZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpUG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUG9pbnRUb09mZnNldChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb09mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb09mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTk9mZnNldFRvUG9pbnQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRYTk9mZnNldCBpT2Zmc2V0OwotCVBvaW50IG9Qb2ludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5PZmZzZXQgaU9mZnNldDsKKyAgICBQb2ludCBvUG9pbnQ7CiAjaWZuZGVmIFRYTk9mZnNldFRvUG9pbnQKLQlQeU1hY19QUkVDSEVDSyhUWE5PZmZzZXRUb1BvaW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5PZmZzZXRUb1BvaW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaU9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5PZmZzZXRUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb1BvaW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgb1BvaW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlPZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOT2Zmc2V0VG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9Qb2ludCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIG9Qb2ludCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldExpbmVDb3VudChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JSXRlbUNvdW50IG9MaW5lVG90YWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgSXRlbUNvdW50IG9MaW5lVG90YWw7CiAjaWZuZGVmIFRYTkdldExpbmVDb3VudAotCVB5TWFjX1BSRUNIRUNLKFRYTkdldExpbmVDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0TGluZUNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOR2V0TGluZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmb0xpbmVUb3RhbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb0xpbmVUb3RhbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5HZXRMaW5lQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvTGluZVRvdGFsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvTGluZVRvdGFsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR2V0TGluZU1ldHJpY3MoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpTGluZU51bWJlcjsKLQlGaXhlZCBvTGluZVdpZHRoOwotCUZpeGVkIG9MaW5lSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpTGluZU51bWJlcjsKKyAgICBGaXhlZCBvTGluZVdpZHRoOworICAgIEZpeGVkIG9MaW5lSGVpZ2h0OwogI2lmbmRlZiBUWE5HZXRMaW5lTWV0cmljcwotCVB5TWFjX1BSRUNIRUNLKFRYTkdldExpbmVNZXRyaWNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRMaW5lTWV0cmljcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlMaW5lTnVtYmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkdldExpbmVNZXRyaWNzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlMaW5lTnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb0xpbmVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm9MaW5lSGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBvTGluZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIG9MaW5lSGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlMaW5lTnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldExpbmVNZXRyaWNzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb0xpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9MaW5lSGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBvTGluZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIG9MaW5lSGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOSXNPYmplY3RBdHRhY2hlZFRvU3BlY2lmaWNXaW5kb3coVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpV2luZG93OwotCUJvb2xlYW4gb0F0dGFjaGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpV2luZG93OworICAgIEJvb2xlYW4gb0F0dGFjaGVkOwogI2lmbmRlZiBUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFRYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb0F0dGFjaGVkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvQXR0YWNoZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvQXR0YWNoZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9BdHRhY2hlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlJlY2FsY1RleHRMYXlvdXQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRYTlJlY2FsY1RleHRMYXlvdXQKLQlQeU1hY19QUkVDSEVDSyhUWE5SZWNhbGNUZXh0TGF5b3V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5SZWNhbGNUZXh0TGF5b3V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5SZWNhbGNUZXh0TGF5b3V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOUmVjYWxjVGV4dExheW91dChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUWE5PYmpfbWV0aG9kc1tdID0gewotCXsiVFhORGVsZXRlT2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EZWxldGVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTlJlc2l6ZUZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZXNpemVGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGlXaWR0aCwgVUludDMyIGlIZWlnaHQsIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQpIC0+IE5vbmUiKX0sCi0JeyJUWE5TZXRGcmFtZUJvdW5kcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2V0RnJhbWVCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBpVG9wLCBTSW50MzIgaUxlZnQsIFNJbnQzMiBpQm90dG9tLCBTSW50MzIgaVJpZ2h0LCBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEKSAtPiBOb25lIil9LAotCXsiVFhOS2V5RG93biIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOS2V5RG93biwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAotCXsiVFhOQWRqdXN0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BZGp1c3RDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpb0N1cnNvclJnbikgLT4gTm9uZSIpfSwKLQl7IlRYTkNsaWNrIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAotCXsiVFhOU2VsZWN0QWxsIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZWxlY3RBbGwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkZvY3VzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Gb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpQmVjb21pbmdGb2N1c2VkKSAtPiBOb25lIil9LAotCXsiVFhOVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5VcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkRyYXciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYXcsIDEsCi0JIFB5RG9jX1NUUigiKEdXb3JsZFB0ciBpRHJhd1BvcnQpIC0+IE5vbmUiKX0sCi0JeyJUWE5Gb3JjZVVwZGF0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORm9yY2VVcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldFNsZWVwVGlja3MiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldFNsZWVwVGlja3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiVFhOSWRsZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOR3Jvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR3Jvd1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAotCXsiVFhOWm9vbVdpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOWm9vbVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGlQYXJ0KSAtPiBOb25lIil9LAotCXsiVFhOQ2FuVW5kbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2FuVW5kbywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIFRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5KSIpfSwKLQl7IlRYTlVuZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlVuZG8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkNhblJlZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNhblJlZG8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleSkiKX0sCi0JeyJUWE5SZWRvIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZWRvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5DdXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkN1dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOQ29weSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOUGFzdGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlBhc3RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5DbGVhciIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2xlYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldFNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUWE5PZmZzZXQgb1N0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgb0VuZE9mZnNldCkiKX0sCi0JeyJUWE5TaG93U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TaG93U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGlTaG93RW5kKSAtPiBOb25lIil9LAotCXsiVFhOSXNTZWxlY3Rpb25FbXB0eSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOSXNTZWxlY3Rpb25FbXB0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiVFhOU2V0U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXRTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiBOb25lIil9LAotCXsiVFhOQ291bnRSdW5zSW5SYW5nZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ291bnRSdW5zSW5SYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQpIC0+IChJdGVtQ291bnQgb1J1bkNvdW50KSIpfSwKLQl7IlRYTkRhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQnl0ZUNvdW50IF9ydikiKX0sCi0JeyJUWE5HZXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXREYXRhLCAxLAotCSBQeURvY19TVFIoIihUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gKEhhbmRsZSBvRGF0YUhhbmRsZSkiKX0sCi0JeyJUWE5HZXREYXRhRW5jb2RlZCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0RGF0YUVuY29kZWQsIDEsCi0JIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0LCBUWE5EYXRhVHlwZSBpRW5jb2RpbmcpIC0+IChIYW5kbGUgb0RhdGFIYW5kbGUpIil9LAotCXsiVFhOU2V0RGF0YUZyb21GaWxlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXREYXRhRnJvbUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpRmlsZVJlZk51bSwgT1NUeXBlIGlGaWxlVHlwZSwgQnl0ZUNvdW50IGlGaWxlTGVuZ3RoLCBUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldENoYW5nZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRDaGFuZ2VDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJUWE5TYXZlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TYXZlLCAxLAotCSBQeURvY19TVFIoIihUWE5GaWxlVHlwZSBpVHlwZSwgT1NUeXBlIGlSZXNUeXBlLCBUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZywgRlNTcGVjIGlGaWxlU3BlY2lmaWNhdGlvbiwgU0ludDE2IGlEYXRhUmVmZXJlbmNlLCBTSW50MTYgaVJlc291cmNlUmVmZXJlbmNlKSAtPiBOb25lIil9LAotCXsiVFhOUmV2ZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZXZlcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTlBhZ2VTZXR1cCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUGFnZVNldHVwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5QcmludCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUHJpbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldFZpZXdSZWN0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRWaWV3UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvVmlld1JlY3QpIil9LAotCXsiVFhOU2V0Vmlld1JlY3QiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldFZpZXdSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGlWaWV3UmVjdCkgLT4gTm9uZSIpfSwKLQl7IlRYTkF0dGFjaE9iamVjdFRvV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BdHRhY2hPYmplY3RUb1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoR1dvcmxkUHRyIGlXaW5kb3csIEJvb2xlYW4gaUlzQWN0dWFsV2luZG93KSAtPiBOb25lIil9LAotCXsiVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlRYTkRyYWdUcmFja2VyIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EcmFnVHJhY2tlciwgMSwKLQkgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgRHJhZ1RyYWNraW5nTWVzc2FnZSBpTWVzc2FnZSwgV2luZG93UHRyIGlXaW5kb3csIERyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2UsIEJvb2xlYW4gaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJUWE5EcmFnUmVjZWl2ZXIiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYWdSZWNlaXZlciwgMSwKLQkgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgV2luZG93UHRyIGlXaW5kb3csIERyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2UsIEJvb2xlYW4gaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJUWE5BY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQWN0aXZhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQsIFRYTlNjcm9sbEJhclN0YXRlIGlBY3RpdmVTdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IlRYTkVjaG9Nb2RlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5FY2hvTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoVW5pQ2hhciBpRWNob0NoYXJhY3RlciwgVGV4dEVuY29kaW5nIGlFbmNvZGluZywgQm9vbGVhbiBpT24pIC0+IE5vbmUiKX0sCi0JeyJUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Eb0ZvbnRNZW51U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihUWE5Gb250TWVudU9iamVjdCBpVFhORm9udE1lbnVPYmplY3QsIFNJbnQxNiBpTWVudUlELCBTSW50MTYgaU1lbnVJdGVtKSAtPiBOb25lIil9LAotCXsiVFhOUHJlcGFyZUZvbnRNZW51IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QcmVwYXJlRm9udE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdCkgLT4gTm9uZSIpfSwKLQl7IlRYTlBvaW50VG9PZmZzZXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlBvaW50VG9PZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGlQb2ludCkgLT4gKFRYTk9mZnNldCBvT2Zmc2V0KSIpfSwKLQl7IlRYTk9mZnNldFRvUG9pbnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTk9mZnNldFRvUG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpT2Zmc2V0KSAtPiAoUG9pbnQgb1BvaW50KSIpfSwKLQl7IlRYTkdldExpbmVDb3VudCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0TGluZUNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgb0xpbmVUb3RhbCkiKX0sCi0JeyJUWE5HZXRMaW5lTWV0cmljcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0TGluZU1ldHJpY3MsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpTGluZU51bWJlcikgLT4gKEZpeGVkIG9MaW5lV2lkdGgsIEZpeGVkIG9MaW5lSGVpZ2h0KSIpfSwKLQl7IlRYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGlXaW5kb3cpIC0+IChCb29sZWFuIG9BdHRhY2hlZCkiKX0sCi0JeyJUWE5SZWNhbGNUZXh0TGF5b3V0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZWNhbGNUZXh0TGF5b3V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJUWE5EZWxldGVPYmplY3QiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRlbGV0ZU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOUmVzaXplRnJhbWUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJlc2l6ZUZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaVdpZHRoLCBVSW50MzIgaUhlaWdodCwgVFhORnJhbWVJRCBpVFhORnJhbWVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTlNldEZyYW1lQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXRGcmFtZUJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIGlUb3AsIFNJbnQzMiBpTGVmdCwgU0ludDMyIGlCb3R0b20sIFNJbnQzMiBpUmlnaHQsIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5LZXlEb3duIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5LZXlEb3duLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5BZGp1c3RDdXJzb3IiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkFkanVzdEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGlvQ3Vyc29yUmduKSAtPiBOb25lIil9LAorICAgIHsiVFhOQ2xpY2siLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5TZWxlY3RBbGwiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNlbGVjdEFsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhORm9jdXMiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGlCZWNvbWluZ0ZvY3VzZWQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5VcGRhdGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhORHJhdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORHJhdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR1dvcmxkUHRyIGlEcmF3UG9ydCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkZvcmNlVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Gb3JjZVVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0U2xlZXBUaWNrcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0U2xlZXBUaWNrcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJUWE5JZGxlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5JZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Hcm93V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Hcm93V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5ab29tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5ab29tV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaVBhcnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5DYW5VbmRvIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DYW5VbmRvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgVFhOQWN0aW9uS2V5IG9UWE5BY3Rpb25LZXkpIil9LAorICAgIHsiVFhOVW5kbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOVW5kbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOQ2FuUmVkbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2FuUmVkbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIFRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5KSIpfSwKKyAgICB7IlRYTlJlZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJlZG8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkN1dCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ3V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Db3B5IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Db3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5QYXN0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUGFzdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkNsZWFyIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DbGVhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRYTk9mZnNldCBvU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBvRW5kT2Zmc2V0KSIpfSwKKyAgICB7IlRYTlNob3dTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNob3dTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaVNob3dFbmQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Jc1NlbGVjdGlvbkVtcHR5IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc1NlbGVjdGlvbkVtcHR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJUWE5TZXRTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldFNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Db3VudFJ1bnNJblJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Db3VudFJ1bnNJblJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gKEl0ZW1Db3VudCBvUnVuQ291bnQpIil9LAorICAgIHsiVFhORGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCeXRlQ291bnQgX3J2KSIpfSwKKyAgICB7IlRYTkdldERhdGEiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiAoSGFuZGxlIG9EYXRhSGFuZGxlKSIpfSwKKyAgICB7IlRYTkdldERhdGFFbmNvZGVkIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXREYXRhRW5jb2RlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQsIFRYTkRhdGFUeXBlIGlFbmNvZGluZykgLT4gKEhhbmRsZSBvRGF0YUhhbmRsZSkiKX0sCisgICAgeyJUWE5TZXREYXRhRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldERhdGFGcm9tRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGlGaWxlUmVmTnVtLCBPU1R5cGUgaUZpbGVUeXBlLCBCeXRlQ291bnQgaUZpbGVMZW5ndGgsIFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0Q2hhbmdlQ291bnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldENoYW5nZUNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IlRYTlNhdmUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNhdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTkZpbGVUeXBlIGlUeXBlLCBPU1R5cGUgaVJlc1R5cGUsIFRYTlBlcm1hbmVudFRleHRFbmNvZGluZ1R5cGUgaVBlcm1hbmVudEVuY29kaW5nLCBGU1NwZWMgaUZpbGVTcGVjaWZpY2F0aW9uLCBTSW50MTYgaURhdGFSZWZlcmVuY2UsIFNJbnQxNiBpUmVzb3VyY2VSZWZlcmVuY2UpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5SZXZlcnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJldmVydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOUGFnZVNldHVwIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QYWdlU2V0dXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTlByaW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QcmludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0Vmlld1JlY3QiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldFZpZXdSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IG9WaWV3UmVjdCkiKX0sCisgICAgeyJUWE5TZXRWaWV3UmVjdCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2V0Vmlld1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaVZpZXdSZWN0KSAtPiBOb25lIil9LAorICAgIHsiVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkF0dGFjaE9iamVjdFRvV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihHV29ybGRQdHIgaVdpbmRvdywgQm9vbGVhbiBpSXNBY3R1YWxXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiVFhORHJhZ1RyYWNrZXIiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYWdUcmFja2VyLCAxLAorICAgICBQeURvY19TVFIoIihUWE5GcmFtZUlEIGlUWE5GcmFtZUlELCBEcmFnVHJhY2tpbmdNZXNzYWdlIGlNZXNzYWdlLCBXaW5kb3dQdHIgaVdpbmRvdywgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZSwgQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkRyYWdSZWNlaXZlciIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORHJhZ1JlY2VpdmVyLCAxLAorICAgICBQeURvY19TVFIoIihUWE5GcmFtZUlEIGlUWE5GcmFtZUlELCBXaW5kb3dQdHIgaVdpbmRvdywgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZSwgQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkFjdGl2YXRlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BY3RpdmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgVFhOU2Nyb2xsQmFyU3RhdGUgaUFjdGl2ZVN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiVFhORWNob01vZGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkVjaG9Nb2RlLCAxLAorICAgICBQeURvY19TVFIoIihVbmlDaGFyIGlFY2hvQ2hhcmFjdGVyLCBUZXh0RW5jb2RpbmcgaUVuY29kaW5nLCBCb29sZWFuIGlPbikgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkRvRm9udE1lbnVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRvRm9udE1lbnVTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdCwgU0ludDE2IGlNZW51SUQsIFNJbnQxNiBpTWVudUl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJUWE5QcmVwYXJlRm9udE1lbnUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlByZXBhcmVGb250TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0KSAtPiBOb25lIil9LAorICAgIHsiVFhOUG9pbnRUb09mZnNldCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUG9pbnRUb09mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaVBvaW50KSAtPiAoVFhOT2Zmc2V0IG9PZmZzZXQpIil9LAorICAgIHsiVFhOT2Zmc2V0VG9Qb2ludCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOT2Zmc2V0VG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlPZmZzZXQpIC0+IChQb2ludCBvUG9pbnQpIil9LAorICAgIHsiVFhOR2V0TGluZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRMaW5lQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEl0ZW1Db3VudCBvTGluZVRvdGFsKSIpfSwKKyAgICB7IlRYTkdldExpbmVNZXRyaWNzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRMaW5lTWV0cmljcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGlMaW5lTnVtYmVyKSAtPiAoRml4ZWQgb0xpbmVXaWR0aCwgRml4ZWQgb0xpbmVIZWlnaHQpIil9LAorICAgIHsiVFhOSXNPYmplY3RBdHRhY2hlZFRvU3BlY2lmaWNXaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaVdpbmRvdykgLT4gKEJvb2xlYW4gb0F0dGFjaGVkKSIpfSwKKyAgICB7IlRYTlJlY2FsY1RleHRMYXlvdXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJlY2FsY1RleHRMYXlvdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgVFhOT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTI0Miw2MSArMTI0Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JVFhOT2JqZWN0IGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVFhOT2JqZWN0IGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRYTk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFRYTk9iamVjdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUWE5PYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChUWE5PYmplY3RPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgVFhOT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFRYTk9iamVjdF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9NbHRlLlRYTk9iamVjdCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRYTk9iamVjdE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFRYTk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBUWE5PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRYTk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgVFhOT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRYTk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlUWE5PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JVFhOT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlUWE5PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVFhOT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JVFhOT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfTWx0ZS5UWE5PYmplY3QiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihUWE5PYmplY3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBUWE5PYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVFhOT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBUWE5PYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFRYTk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUWE5PYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVFhOT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFRYTk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVFhOT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFRYTk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFRYTk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBUWE5PYmplY3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzMDksNzcgKzEzMDksNzcgQEAKICNkZWZpbmUgVFhORm9udE1lbnVPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmVFhORm9udE1lbnVPYmplY3RfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVFhORm9udE1lbnVPYmplY3RfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVFhORm9udE1lbnVPYmplY3Qgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUWE5Gb250TWVudU9iamVjdCBvYl9pdHNlbGY7CiB9IFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0OwogCiBQeU9iamVjdCAqVFhORm9udE1lbnVPYmpfTmV3KFRYTkZvbnRNZW51T2JqZWN0IGl0c2VsZikKIHsKLQlUWE5Gb250TWVudU9iamVjdE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0LCAmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoVFhORm9udE1lbnVPYmplY3RPYmplY3QsICZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBUWE5Gb250TWVudU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBUWE5Gb250TWVudU9iamVjdCAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFUWE5Gb250TWVudU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUWE5Gb250TWVudU9iamVjdCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChUWE5Gb250TWVudU9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFUWE5Gb250TWVudU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUWE5Gb250TWVudU9iamVjdCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChUWE5Gb250TWVudU9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRYTkZvbnRNZW51T2JqX2RlYWxsb2MoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTkZvbnRNZW51T2JqX1RYTkdldEZvbnRNZW51SGFuZGxlKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgb0ZvbnRNZW51SGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgb0ZvbnRNZW51SGFuZGxlOwogI2lmbmRlZiBUWE5HZXRGb250TWVudUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRYTkdldEZvbnRNZW51SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRGb250TWVudUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkdldEZvbnRNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvRm9udE1lbnVIYW5kbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb0ZvbnRNZW51SGFuZGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldEZvbnRNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvRm9udE1lbnVIYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb0ZvbnRNZW51SGFuZGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5Gb250TWVudU9ial9UWE5EaXNwb3NlRm9udE1lbnVPYmplY3QoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkRpc3Bvc2VGb250TWVudU9iamVjdAotCVB5TWFjX1BSRUNIRUNLKFRYTkRpc3Bvc2VGb250TWVudU9iamVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVFhORm9udE1lbnVPYmpfbWV0aG9kc1tdID0gewotCXsiVFhOR2V0Rm9udE1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVFhORm9udE1lbnVPYmpfVFhOR2V0Rm9udE1lbnVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgb0ZvbnRNZW51SGFuZGxlKSIpfSwKLQl7IlRYTkRpc3Bvc2VGb250TWVudU9iamVjdCIsIChQeUNGdW5jdGlvbilUWE5Gb250TWVudU9ial9UWE5EaXNwb3NlRm9udE1lbnVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlRYTkdldEZvbnRNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRYTkZvbnRNZW51T2JqX1RYTkdldEZvbnRNZW51SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIG9Gb250TWVudUhhbmRsZSkiKX0sCisgICAgeyJUWE5EaXNwb3NlRm9udE1lbnVPYmplY3QiLCAoUHlDRnVuY3Rpb24pVFhORm9udE1lbnVPYmpfVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFRYTkZvbnRNZW51T2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTM5Niw2MSArMTM5Niw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlRYTkZvbnRNZW51T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlUWE5Gb250TWVudU9iamVjdCBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFRYTkZvbnRNZW51T2JqZWN0IGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRYTkZvbnRNZW51T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVFhORm9udE1lbnVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChUWE5Gb250TWVudU9iamVjdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBUWE5Gb250TWVudU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBUWE5Gb250TWVudU9iamVjdF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9NbHRlLlRYTkZvbnRNZW51T2JqZWN0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVFhORm9udE1lbnVPYmplY3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBUWE5Gb250TWVudU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBUWE5Gb250TWVudU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVFhORm9udE1lbnVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFRYTkZvbnRNZW51T2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRYTkZvbnRNZW51T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVRYTkZvbnRNZW51T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVRYTkZvbnRNZW51T2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlUWE5Gb250TWVudU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlUWE5Gb250TWVudU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVRYTkZvbnRNZW51T2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfTWx0ZS5UWE5Gb250TWVudU9iamVjdCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVFhORm9udE1lbnVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVFhORm9udE1lbnVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFRYTkZvbnRNZW51T2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUWE5Gb250TWVudU9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUWE5Gb250TWVudU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBUWE5Gb250TWVudU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUWE5Gb250TWVudU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVFhORm9udE1lbnVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgVFhORm9udE1lbnVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUWE5Gb250TWVudU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRYTkZvbnRNZW51T2JqZWN0IC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE0NTgsMTY4ICsxNDU4LDE2OCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOTmV3T2JqZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTU3BlYyAqIGlGaWxlU3BlYzsKLQlXaW5kb3dQdHIgaVdpbmRvdzsKLQlSZWN0IGlGcmFtZTsKLQlUWE5GcmFtZU9wdGlvbnMgaUZyYW1lT3B0aW9uczsKLQlUWE5GcmFtZVR5cGUgaUZyYW1lVHlwZTsKLQlUWE5GaWxlVHlwZSBpRmlsZVR5cGU7Ci0JVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2Rpbmc7Ci0JVFhOT2JqZWN0IG9UWE5PYmplY3Q7Ci0JVFhORnJhbWVJRCBvVFhORnJhbWVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1NwZWMgKiBpRmlsZVNwZWM7CisgICAgV2luZG93UHRyIGlXaW5kb3c7CisgICAgUmVjdCBpRnJhbWU7CisgICAgVFhORnJhbWVPcHRpb25zIGlGcmFtZU9wdGlvbnM7CisgICAgVFhORnJhbWVUeXBlIGlGcmFtZVR5cGU7CisgICAgVFhORmlsZVR5cGUgaUZpbGVUeXBlOworICAgIFRYTlBlcm1hbmVudFRleHRFbmNvZGluZ1R5cGUgaVBlcm1hbmVudEVuY29kaW5nOworICAgIFRYTk9iamVjdCBvVFhOT2JqZWN0OworICAgIFRYTkZyYW1lSUQgb1RYTkZyYW1lSUQ7CiAjaWZuZGVmIFRYTk5ld09iamVjdAotCVB5TWFjX1BSRUNIRUNLKFRYTk5ld09iamVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOTmV3T2JqZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0RlNTcGVjUHRyX0NvbnZlcnQsICZpRmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmlGcmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlGcmFtZU9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRnJhbWVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpRmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpUGVybWFuZW50RW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOTmV3T2JqZWN0KGlGaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAmaUZyYW1lLAotCSAgICAgICAgICAgICAgICAgICAgaUZyYW1lT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgIGlGcmFtZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICBpRmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICBpUGVybWFuZW50RW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAmb1RYTk9iamVjdCwKLQkgICAgICAgICAgICAgICAgICAgICZvVFhORnJhbWVJRCwKLQkgICAgICAgICAgICAgICAgICAgIChUWE5PYmplY3RSZWZjb24pMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBUWE5PYmpfTmV3LCBvVFhOT2JqZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIG9UWE5GcmFtZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsbE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdEZTU3BlY1B0cl9Db252ZXJ0LCAmaUZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRnJhbWVPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUZyYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVBlcm1hbmVudEVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTk5ld09iamVjdChpRmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgJmlGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlGcmFtZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBpRnJhbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaVBlcm1hbmVudEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgJm9UWE5PYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAmb1RYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAoVFhOT2JqZWN0UmVmY29uKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFhOT2JqX05ldywgb1RYTk9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvVFhORnJhbWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWx0ZV9UWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRYTlRlcm1pbmF0ZVRleHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOSXNTY3JhcFBhc3RhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFRYTklzU2NyYXBQYXN0YWJsZQotCVB5TWFjX1BSRUNIRUNLKFRYTklzU2NyYXBQYXN0YWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOSXNTY3JhcFBhc3RhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5Jc1NjcmFwUGFzdGFibGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOSXNTY3JhcFBhc3RhYmxlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWx0ZV9UWE5Db252ZXJ0VG9QdWJsaWNTY3JhcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVFhOQ29udmVydFRvUHVibGljU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ29udmVydFRvUHVibGljU2NyYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQ29udmVydFRvUHVibGljU2NyYXAoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNbHRlX1RYTkNvbnZlcnRGcm9tUHVibGljU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkNvbnZlcnRGcm9tUHVibGljU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOTmV3Rm9udE1lbnVPYmplY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBpRm9udE1lbnVIYW5kbGU7Ci0JU0ludDE2IGlNZW51SUQ7Ci0JU0ludDE2IGlTdGFydEhpZXJNZW51SUQ7Ci0JVFhORm9udE1lbnVPYmplY3Qgb1RYTkZvbnRNZW51T2JqZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgaUZvbnRNZW51SGFuZGxlOworICAgIFNJbnQxNiBpTWVudUlEOworICAgIFNJbnQxNiBpU3RhcnRIaWVyTWVudUlEOworICAgIFRYTkZvbnRNZW51T2JqZWN0IG9UWE5Gb250TWVudU9iamVjdDsKICNpZm5kZWYgVFhOTmV3Rm9udE1lbnVPYmplY3QKLQlQeU1hY19QUkVDSEVDSyhUWE5OZXdGb250TWVudU9iamVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOTmV3Rm9udE1lbnVPYmplY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmlGb250TWVudUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRIaWVyTWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTk5ld0ZvbnRNZW51T2JqZWN0KGlGb250TWVudUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0SGllck1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9UWE5Gb250TWVudU9iamVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRYTkZvbnRNZW51T2JqX05ldywgb1RYTkZvbnRNZW51T2JqZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaUZvbnRNZW51SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaU1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydEhpZXJNZW51SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOTmV3Rm9udE1lbnVPYmplY3QoaUZvbnRNZW51SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRIaWVyTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb1RYTkZvbnRNZW51T2JqZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFhORm9udE1lbnVPYmpfTmV3LCBvVFhORm9udE1lbnVPYmplY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOVmVyc2lvbkluZm9ybWF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUWE5WZXJzaW9uVmFsdWUgX3J2OwotCVRYTkZlYXR1cmVCaXRzIG9GZWF0dXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRYTlZlcnNpb25WYWx1ZSBfcnY7CisgICAgVFhORmVhdHVyZUJpdHMgb0ZlYXR1cmVGbGFnczsKICNpZm5kZWYgVFhOVmVyc2lvbkluZm9ybWF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOVmVyc2lvbkluZm9ybWF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5WZXJzaW9uSW5mb3JtYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTlZlcnNpb25JbmZvcm1hdGlvbigmb0ZlYXR1cmVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb0ZlYXR1cmVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTlZlcnNpb25JbmZvcm1hdGlvbigmb0ZlYXR1cmVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb0ZlYXR1cmVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWx0ZV9UWE5Jbml0VGV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NTdGF0dXMgX2VycjsKLQlUWE5NYWNPU1ByZWZlcnJlZEZvbnREZXNjcmlwdGlvbiAqIGlEZWZhdWx0Rm9udHMgPSBOVUxMOwotCUl0ZW1Db3VudCBpQ291bnREZWZhdWx0Rm9udHMgPSAwOwotCVRYTkluaXRPcHRpb25zIGlVc2FnZUZsYWdzOwotCVB5TWFjX1BSRUNIRUNLKFRYTkluaXRUZXh0ZW5zaW9uKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwgJmlVc2FnZUZsYWdzKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Jbml0VGV4dGVuc2lvbihpRGVmYXVsdEZvbnRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpQ291bnREZWZhdWx0Rm9udHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlVc2FnZUZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTk1hY09TUHJlZmVycmVkRm9udERlc2NyaXB0aW9uICogaURlZmF1bHRGb250cyA9IE5VTEw7CisgICAgSXRlbUNvdW50IGlDb3VudERlZmF1bHRGb250cyA9IDA7CisgICAgVFhOSW5pdE9wdGlvbnMgaVVzYWdlRmxhZ3M7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOSW5pdFRleHRlbnNpb24pOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLCAmaVVzYWdlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOSW5pdFRleHRlbnNpb24oaURlZmF1bHRGb250cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvdW50RGVmYXVsdEZvbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVXNhZ2VGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIApAQCAtMTYyNywyNCArMTYyNywyNCBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYgTWx0ZV9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJUWE5OZXdPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyAqIGlGaWxlU3BlYywgV2luZG93UHRyIGlXaW5kb3csIFJlY3QgaUZyYW1lLCBUWE5GcmFtZU9wdGlvbnMgaUZyYW1lT3B0aW9ucywgVFhORnJhbWVUeXBlIGlGcmFtZVR5cGUsIFRYTkZpbGVUeXBlIGlGaWxlVHlwZSwgVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2RpbmcpIC0+IChUWE5PYmplY3Qgb1RYTk9iamVjdCwgVFhORnJhbWVJRCBvVFhORnJhbWVJRCkiKX0sCi0JeyJUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOVGVybWluYXRlVGV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOSXNTY3JhcFBhc3RhYmxlIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOSXNTY3JhcFBhc3RhYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCIsIChQeUNGdW5jdGlvbilNbHRlX1RYTkNvbnZlcnRUb1B1YmxpY1NjcmFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOTmV3Rm9udE1lbnVPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdGb250TWVudU9iamVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpRm9udE1lbnVIYW5kbGUsIFNJbnQxNiBpTWVudUlELCBTSW50MTYgaVN0YXJ0SGllck1lbnVJRCkgLT4gKFRYTkZvbnRNZW51T2JqZWN0IG9UWE5Gb250TWVudU9iamVjdCkiKX0sCi0JeyJUWE5WZXJzaW9uSW5mb3JtYXRpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5WZXJzaW9uSW5mb3JtYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRYTlZlcnNpb25WYWx1ZSBfcnYsIFRYTkZlYXR1cmVCaXRzIG9GZWF0dXJlRmxhZ3MpIil9LAotCXsiVFhOSW5pdFRleHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5Jbml0VGV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVFhOSW5pdE9wdGlvbnMpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5OZXdPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdPYmplY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyAqIGlGaWxlU3BlYywgV2luZG93UHRyIGlXaW5kb3csIFJlY3QgaUZyYW1lLCBUWE5GcmFtZU9wdGlvbnMgaUZyYW1lT3B0aW9ucywgVFhORnJhbWVUeXBlIGlGcmFtZVR5cGUsIFRYTkZpbGVUeXBlIGlGaWxlVHlwZSwgVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2RpbmcpIC0+IChUWE5PYmplY3Qgb1RYTk9iamVjdCwgVFhORnJhbWVJRCBvVFhORnJhbWVJRCkiKX0sCisgICAgeyJUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOVGVybWluYXRlVGV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOSXNTY3JhcFBhc3RhYmxlIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOSXNTY3JhcFBhc3RhYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCIsIChQeUNGdW5jdGlvbilNbHRlX1RYTkNvbnZlcnRUb1B1YmxpY1NjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOTmV3Rm9udE1lbnVPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdGb250TWVudU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpRm9udE1lbnVIYW5kbGUsIFNJbnQxNiBpTWVudUlELCBTSW50MTYgaVN0YXJ0SGllck1lbnVJRCkgLT4gKFRYTkZvbnRNZW51T2JqZWN0IG9UWE5Gb250TWVudU9iamVjdCkiKX0sCisgICAgeyJUWE5WZXJzaW9uSW5mb3JtYXRpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5WZXJzaW9uSW5mb3JtYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRYTlZlcnNpb25WYWx1ZSBfcnYsIFRYTkZlYXR1cmVCaXRzIG9GZWF0dXJlRmxhZ3MpIil9LAorICAgIHsiVFhOSW5pdFRleHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5Jbml0VGV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOSW5pdE9wdGlvbnMpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTY1MiwzNyArMTY1MiwzNyBAQAogCiB2b2lkIGluaXRfTWx0ZSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCS8vICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoeHh4eCk7CisgICAgLy8gICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyh4eHh4KTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX01sdGUiLCBNbHRlX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfTWx0ZSIsIE1sdGVfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JTWx0ZV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKE1sdGVfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBNbHRlX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JVFhOT2JqZWN0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUWE5PYmplY3RfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZUWE5PYmplY3RfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUWE5PYmplY3QiLCAoUHlPYmplY3QgKikmVFhOT2JqZWN0X1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVFhOT2JqZWN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhOT2JqZWN0VHlwZSIsIChQeU9iamVjdCAqKSZUWE5PYmplY3RfVHlwZSk7Ci0JVFhORm9udE1lbnVPYmplY3RfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUWE5Gb250TWVudU9iamVjdCIsIChQeU9iamVjdCAqKSZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhORm9udE1lbnVPYmplY3RUeXBlIiwgKFB5T2JqZWN0ICopJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIE1sdGVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChNbHRlX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTWx0ZV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFRYTk9iamVjdF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVFhOT2JqZWN0X1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVFhOT2JqZWN0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhOT2JqZWN0IiwgKFB5T2JqZWN0ICopJlRYTk9iamVjdF9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRYTk9iamVjdF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRYTk9iamVjdFR5cGUiLCAoUHlPYmplY3QgKikmVFhOT2JqZWN0X1R5cGUpOworICAgIFRYTkZvbnRNZW51T2JqZWN0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZUWE5Gb250TWVudU9iamVjdF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhORm9udE1lbnVPYmplY3QiLCAoUHlPYmplY3QgKikmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRYTkZvbnRNZW51T2JqZWN0VHlwZSIsIChQeU9iamVjdCAqKSZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9vc2EvX09TQW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvb3NhL19PU0Ftb2R1bGUuYwppbmRleCBhYjMwMzIwLi4xMGRkMGZmIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9vc2EvX09TQW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL29zYS9fT1NBbW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zNyw3NTMgKzM3LDc1MyBAQAogI2RlZmluZSBPU0FPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ29tcG9uZW50SW5zdGFuY2Ugb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDb21wb25lbnRJbnN0YW5jZSBvYl9pdHNlbGY7CiB9IE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0OwogCiBQeU9iamVjdCAqT1NBT2JqX05ldyhDb21wb25lbnRJbnN0YW5jZSBpdHNlbGYpCiB7Ci0JT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE9TQV9FcnJvciwiTlVMTCBDb21wb25lbnRJbnN0YW5jZSIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0LCAmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPU0FfRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCwgJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IE9TQU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb21wb25lbnRJbnN0YW5jZSAqcF9pdHNlbGYpCiB7CiAKLQkgICAgICAgICAgICAgICAgaWYgKENtcEluc3RPYmpfQ29udmVydCh2LCBwX2l0c2VsZikpCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0JICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0JICAgICAgICAgICAgICAgIAotCWlmICghT1NBT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9TQUNvbXBvbmVudEluc3RhbmNlIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDbXBJbnN0T2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisKKyAgICBpZiAoIU9TQU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPU0FDb21wb25lbnRJbnN0YW5jZSByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIE9TQU9ial9kZWFsbG9jKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBTG9hZChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBRURlc2Mgc2NyaXB0RGF0YTsKLQlsb25nIG1vZGVGbGFnczsKLQlPU0FJRCByZXN1bHRpbmdTY3JpcHRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBRURlc2Mgc2NyaXB0RGF0YTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBPU0FJRCByZXN1bHRpbmdTY3JpcHRJRDsKICNpZm5kZWYgT1NBTG9hZAotCVB5TWFjX1BSRUNIRUNLKE9TQUxvYWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUxvYWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUxvYWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmc2NyaXB0RGF0YSwKLQkgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUxvYWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQVN0b3JlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIHNjcmlwdElEOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCWxvbmcgbW9kZUZsYWdzOwotCUFFRGVzYyByZXN1bHRpbmdTY3JpcHREYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIHNjcmlwdElEOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIEFFRGVzYyByZXN1bHRpbmdTY3JpcHREYXRhOwogI2lmbmRlZiBPU0FTdG9yZQotCVB5TWFjX1BSRUNIRUNLKE9TQVN0b3JlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FTdG9yZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTdG9yZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdERhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nU2NyaXB0RGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU3RvcmUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHREYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NjcmlwdERhdGEpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FFeGVjdXRlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIGNvbXBpbGVkU2NyaXB0SUQ7Ci0JT1NBSUQgY29udGV4dElEOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgT1NBSUQgY29tcGlsZWRTY3JpcHRJRDsKKyAgICBPU0FJRCBjb250ZXh0SUQ7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRDsKICNpZm5kZWYgT1NBRXhlY3V0ZQotCVB5TWFjX1BSRUNIRUNLKE9TQUV4ZWN1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUV4ZWN1dGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQURpc3BsYXkoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgc2NyaXB0VmFsdWVJRDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlsb25nIG1vZGVGbGFnczsKLQlBRURlc2MgcmVzdWx0aW5nVGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRWYWx1ZUlEOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIEFFRGVzYyByZXN1bHRpbmdUZXh0OwogI2lmbmRlZiBPU0FEaXNwbGF5Ci0JUHlNYWNfUFJFQ0hFQ0soT1NBRGlzcGxheSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBRGlzcGxheSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFZhbHVlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQURpc3BsYXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBzY3JpcHRWYWx1ZUlELAotCSAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nVGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdUZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFZhbHVlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQURpc3BsYXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRWYWx1ZUlELAorICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nVGV4dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdUZXh0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU2NyaXB0RXJyb3IoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFRGVzYyByZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TVHlwZSBzZWxlY3RvcjsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBBRURlc2MgcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbjsKICNpZm5kZWYgT1NBU2NyaXB0RXJyb3IKLQlQeU1hY19QUkVDSEVDSyhPU0FTY3JpcHRFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU2NyaXB0RXJyb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTY3JpcHRFcnJvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0Vycm9yRGVzY3JpcHRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU2NyaXB0RXJyb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBRGlzcG9zZShPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKICNpZm5kZWYgT1NBRGlzcG9zZQotCVB5TWFjX1BSRUNIRUNLKE9TQURpc3Bvc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQURpc3Bvc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FEaXNwb3NlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc2NyaXB0SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBRGlzcG9zZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU2V0U2NyaXB0SW5mbyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKLQlPU1R5cGUgc2VsZWN0b3I7Ci0JbG9uZyB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKKyAgICBPU1R5cGUgc2VsZWN0b3I7CisgICAgbG9uZyB2YWx1ZTsKICNpZm5kZWYgT1NBU2V0U2NyaXB0SW5mbwotCVB5TWFjX1BSRUNIRUNLKE9TQVNldFNjcmlwdEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQVNldFNjcmlwdEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTZXRTY3JpcHRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU2V0U2NyaXB0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBR2V0U2NyaXB0SW5mbyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKLQlPU1R5cGUgc2VsZWN0b3I7Ci0JbG9uZyByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgT1NBSUQgc2NyaXB0SUQ7CisgICAgT1NUeXBlIHNlbGVjdG9yOworICAgIGxvbmcgcmVzdWx0OwogI2lmbmRlZiBPU0FHZXRTY3JpcHRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soT1NBR2V0U2NyaXB0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBR2V0U2NyaXB0SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUdldFNjcmlwdEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBR2V0U2NyaXB0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWU7CiAjaWZuZGVmIE9TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUKLQlQeU1hY19QUkVDSEVDSyhPU0FTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FDb21waWxlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyBzb3VyY2VEYXRhOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHNvdXJjZURhdGE7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgT1NBSUQgcHJldmlvdXNBbmRSZXN1bHRpbmdTY3JpcHRJRDsKICNpZm5kZWYgT1NBQ29tcGlsZQotCVB5TWFjX1BSRUNIRUNLKE9TQUNvbXBpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvbXBpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzb3VyY2VEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUNvbXBpbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAmc291cmNlRGF0YSwKLQkgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgJnByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc291cmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FDb21waWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICZwcmV2aW91c0FuZFJlc3VsdGluZ1NjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0FuZFJlc3VsdGluZ1NjcmlwdElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBQ29weUlEKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIGZyb21JRDsKLQlPU0FJRCB0b0lEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIGZyb21JRDsKKyAgICBPU0FJRCB0b0lEOwogI2lmbmRlZiBPU0FDb3B5SUQKLQlQeU1hY19QUkVDSEVDSyhPU0FDb3B5SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvcHlJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyb21JRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FDb3B5SUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGZyb21JRCwKLQkgICAgICAgICAgICAgICAgICZ0b0lEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICB0b0lEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb21JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FDb3B5SUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGZyb21JRCwKKyAgICAgICAgICAgICAgICAgICAgICZ0b0lEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b0lEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBR2V0U291cmNlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIHNjcmlwdElEOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFRGVzYyByZXN1bHRpbmdTb3VyY2VEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIHNjcmlwdElEOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIEFFRGVzYyByZXN1bHRpbmdTb3VyY2VEYXRhOwogI2lmbmRlZiBPU0FHZXRTb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhPU0FHZXRTb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUdldFNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUdldFNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTb3VyY2VEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NvdXJjZURhdGEpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBR2V0U291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NvdXJjZURhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nU291cmNlRGF0YSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUNvZXJjZUZyb21EZXNjKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyBzY3JpcHREYXRhOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBzY3JpcHREYXRhOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdElEOwogI2lmbmRlZiBPU0FDb2VyY2VGcm9tRGVzYwotCVB5TWFjX1BSRUNIRUNLKE9TQUNvZXJjZUZyb21EZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FDb2VyY2VGcm9tRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQ29lcmNlRnJvbURlc2MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUNvZXJjZUZyb21EZXNjKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FDb2VyY2VUb0Rlc2MoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgc2NyaXB0SUQ7Ci0JRGVzY1R5cGUgZGVzaXJlZFR5cGU7Ci0JbG9uZyBtb2RlRmxhZ3M7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBBRURlc2MgcmVzdWx0OwogI2lmbmRlZiBPU0FDb2VyY2VUb0Rlc2MKLQlQeU1hY19QUkVDSEVDSyhPU0FDb2VyY2VUb0Rlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvZXJjZVRvRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FDb2VyY2VUb0Rlc2MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBQ29lcmNlVG9EZXNjKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FTZXREZWZhdWx0VGFyZ2V0KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFQWRkcmVzc0Rlc2MgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFQWRkcmVzc0Rlc2MgdGFyZ2V0OwogI2lmbmRlZiBPU0FTZXREZWZhdWx0VGFyZ2V0Ci0JUHlNYWNfUFJFQ0hFQ0soT1NBU2V0RGVmYXVsdFRhcmdldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU2V0RGVmYXVsdFRhcmdldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQVNldERlZmF1bHRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVNldERlZmF1bHRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU3RhcnRSZWNvcmRpbmcoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIGNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRDsKICNpZm5kZWYgT1NBU3RhcnRSZWNvcmRpbmcKLQlQeU1hY19QUkVDSEVDSyhPU0FTdGFydFJlY29yZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU3RhcnRSZWNvcmRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTdGFydFJlY29yZGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBjb21waWxlZFNjcmlwdFRvTW9kaWZ5SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU3RhcnRSZWNvcmRpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU3RvcFJlY29yZGluZyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBjb21waWxlZFNjcmlwdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIGNvbXBpbGVkU2NyaXB0SUQ7CiAjaWZuZGVmIE9TQVN0b3BSZWNvcmRpbmcKLQlQeU1hY19QUkVDSEVDSyhPU0FTdG9wUmVjb3JkaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FTdG9wUmVjb3JkaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcGlsZWRTY3JpcHRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTdG9wUmVjb3JkaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21waWxlZFNjcmlwdElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVN0b3BSZWNvcmRpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZFNjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBTG9hZEV4ZWN1dGUoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHNjcmlwdERhdGE7Ci0JT1NBSUQgY29udGV4dElEOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHNjcmlwdERhdGE7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CiAjaWZuZGVmIE9TQUxvYWRFeGVjdXRlCi0JUHlNYWNfUFJFQ0hFQ0soT1NBTG9hZEV4ZWN1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUxvYWRFeGVjdXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBTG9hZEV4ZWN1dGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FMb2FkRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBQ29tcGlsZUV4ZWN1dGUoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHNvdXJjZURhdGE7Ci0JT1NBSUQgY29udGV4dElEOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHNvdXJjZURhdGE7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CiAjaWZuZGVmIE9TQUNvbXBpbGVFeGVjdXRlCi0JUHlNYWNfUFJFQ0hFQ0soT1NBQ29tcGlsZUV4ZWN1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvbXBpbGVFeGVjdXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNvdXJjZURhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQ29tcGlsZUV4ZWN1dGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZURhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc291cmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FDb21waWxlRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBRG9TY3JpcHQoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHNvdXJjZURhdGE7Ci0JT1NBSUQgY29udGV4dElEOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCWxvbmcgbW9kZUZsYWdzOwotCUFFRGVzYyByZXN1bHRpbmdUZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBzb3VyY2VEYXRhOworICAgIE9TQUlEIGNvbnRleHRJRDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBBRURlc2MgcmVzdWx0aW5nVGV4dDsKICNpZm5kZWYgT1NBRG9TY3JpcHQKLQlQeU1hY19QUkVDSEVDSyhPU0FEb1NjcmlwdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBRG9TY3JpcHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzb3VyY2VEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FEb1NjcmlwdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmc291cmNlRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nVGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdUZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNvdXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQURvU2NyaXB0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdUZXh0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1RleHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FTZXRDdXJyZW50RGlhbGVjdChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlzaG9ydCBkaWFsZWN0Q29kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBzaG9ydCBkaWFsZWN0Q29kZTsKICNpZm5kZWYgT1NBU2V0Q3VycmVudERpYWxlY3QKLQlQeU1hY19QUkVDSEVDSyhPU0FTZXRDdXJyZW50RGlhbGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU2V0Q3VycmVudERpYWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0Q29kZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTZXRDdXJyZW50RGlhbGVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0Q29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FTZXRDdXJyZW50RGlhbGVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUdldEN1cnJlbnREaWFsZWN0KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCXNob3J0IHJlc3VsdGluZ0RpYWxlY3RDb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIHNob3J0IHJlc3VsdGluZ0RpYWxlY3RDb2RlOwogI2lmbmRlZiBPU0FHZXRDdXJyZW50RGlhbGVjdAotCVB5TWFjX1BSRUNIRUNLKE9TQUdldEN1cnJlbnREaWFsZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FHZXRDdXJyZW50RGlhbGVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUdldEN1cnJlbnREaWFsZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0Q29kZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nRGlhbGVjdENvZGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBR2V0Q3VycmVudERpYWxlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0RpYWxlY3RDb2RlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdEaWFsZWN0Q29kZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RzKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mb0xpc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdDsKICNpZm5kZWYgT1NBQXZhaWxhYmxlRGlhbGVjdHMKLQlQeU1hY19QUkVDSEVDSyhPU0FBdmFpbGFibGVEaWFsZWN0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBQXZhaWxhYmxlRGlhbGVjdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FBdmFpbGFibGVEaWFsZWN0cyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FBdmFpbGFibGVEaWFsZWN0cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUdldERpYWxlY3RJbmZvKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCXNob3J0IGRpYWxlY3RDb2RlOwotCU9TVHlwZSBzZWxlY3RvcjsKLQlBRURlc2MgcmVzdWx0aW5nRGlhbGVjdEluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgc2hvcnQgZGlhbGVjdENvZGU7CisgICAgT1NUeXBlIHNlbGVjdG9yOworICAgIEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mbzsKICNpZm5kZWYgT1NBR2V0RGlhbGVjdEluZm8KLQlQeU1hY19QUkVDSEVDSyhPU0FHZXREaWFsZWN0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBR2V0RGlhbGVjdEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpYWxlY3RDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FHZXREaWFsZWN0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpYWxlY3RDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FHZXREaWFsZWN0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBRURlc2MgcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0Q29kZUxpc3Q7CiAjaWZuZGVmIE9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdAotCVB5TWFjX1BSRUNIRUNLKE9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0RpYWxlY3RDb2RlTGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0Q29kZUxpc3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBRXhlY3V0ZUV2ZW50KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudDsKLQlPU0FJRCBjb250ZXh0SUQ7Ci0JbG9uZyBtb2RlRmxhZ3M7Ci0JT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQ7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CiAjaWZuZGVmIE9TQUV4ZWN1dGVFdmVudAotCVB5TWFjX1BSRUNIRUNLKE9TQUV4ZWN1dGVFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBRXhlY3V0ZUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFwcGxlRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBRXhlY3V0ZUV2ZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmdGhlQXBwbGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZ0aGVBcHBsZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUV4ZWN1dGVFdmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFwcGxlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQURvRXZlbnQoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQXBwbGVFdmVudCB0aGVBcHBsZUV2ZW50OwotCU9TQUlEIGNvbnRleHRJRDsKLQlsb25nIG1vZGVGbGFnczsKLQlBcHBsZUV2ZW50IHJlcGx5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudDsKKyAgICBPU0FJRCBjb250ZXh0SUQ7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgQXBwbGVFdmVudCByZXBseTsKICNpZm5kZWYgT1NBRG9FdmVudAotCVB5TWFjX1BSRUNIRUNLKE9TQURvRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQURvRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQXBwbGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FEb0V2ZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgJnRoZUFwcGxlRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVwbHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFwcGxlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBRG9FdmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICZ0aGVBcHBsZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlcGx5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBTWFrZUNvbnRleHQoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIGNvbnRleHROYW1lOwotCU9TQUlEIHBhcmVudENvbnRleHQ7Ci0JT1NBSUQgcmVzdWx0aW5nQ29udGV4dElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBjb250ZXh0TmFtZTsKKyAgICBPU0FJRCBwYXJlbnRDb250ZXh0OworICAgIE9TQUlEIHJlc3VsdGluZ0NvbnRleHRJRDsKICNpZm5kZWYgT1NBTWFrZUNvbnRleHQKLQlQeU1hY19QUkVDSEVDSyhPU0FNYWtlQ29udGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBTWFrZUNvbnRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZjb250ZXh0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudENvbnRleHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBTWFrZUNvbnRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nQ29udGV4dElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdDb250ZXh0SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmY29udGV4dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRDb250ZXh0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQU1ha2VDb250ZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0NvbnRleHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nQ29udGV4dElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIE9TQU9ial9tZXRob2RzW10gPSB7Ci0JeyJPU0FMb2FkIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FMb2FkLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc2NyaXB0RGF0YSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRJRCkiKX0sCi0JeyJPU0FTdG9yZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU3RvcmUsIDEsCi0JIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0aW5nU2NyaXB0RGF0YSkiKX0sCi0JeyJPU0FFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FFeGVjdXRlLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBjb21waWxlZFNjcmlwdElELCBPU0FJRCBjb250ZXh0SUQsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCkiKX0sCi0JeyJPU0FEaXNwbGF5IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEaXNwbGF5LCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRWYWx1ZUlELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0aW5nVGV4dCkiKX0sCi0JeyJPU0FTY3JpcHRFcnJvciIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2NyaXB0RXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3RvciwgRGVzY1R5cGUgZGVzaXJlZFR5cGUpIC0+IChBRURlc2MgcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbikiKX0sCi0JeyJPU0FEaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEaXNwb3NlLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCkgLT4gTm9uZSIpfSwKLQl7Ik9TQVNldFNjcmlwdEluZm8iLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldFNjcmlwdEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBPU1R5cGUgc2VsZWN0b3IsIGxvbmcgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJPU0FHZXRTY3JpcHRJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRTY3JpcHRJbmZvLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgT1NUeXBlIHNlbGVjdG9yKSAtPiAobG9uZyByZXN1bHQpIil9LAotCXsiT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWUpIil9LAotCXsiT1NBQ29tcGlsZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQ29tcGlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcHJldmlvdXNBbmRSZXN1bHRpbmdTY3JpcHRJRCkiKX0sCi0JeyJPU0FDb3B5SUQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvcHlJRCwgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgZnJvbUlEKSAtPiAoT1NBSUQgdG9JRCkiKX0sCi0JeyJPU0FHZXRTb3VyY2UiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUdldFNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1NvdXJjZURhdGEpIil9LAotCXsiT1NBQ29lcmNlRnJvbURlc2MiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvZXJjZUZyb21EZXNjLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc2NyaXB0RGF0YSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRJRCkiKX0sCi0JeyJPU0FDb2VyY2VUb0Rlc2MiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvZXJjZVRvRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBsb25nIG1vZGVGbGFncykgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiT1NBU2V0RGVmYXVsdFRhcmdldCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2V0RGVmYXVsdFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVBZGRyZXNzRGVzYyB0YXJnZXQpIC0+IE5vbmUiKX0sCi0JeyJPU0FTdGFydFJlY29yZGluZyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU3RhcnRSZWNvcmRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9TQUlEIGNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRCkiKX0sCi0JeyJPU0FTdG9wUmVjb3JkaW5nIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTdG9wUmVjb3JkaW5nLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBjb21waWxlZFNjcmlwdElEKSAtPiBOb25lIil9LAotCXsiT1NBTG9hZEV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUxvYWRFeGVjdXRlLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc2NyaXB0RGF0YSwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAotCXsiT1NBQ29tcGlsZUV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvbXBpbGVFeGVjdXRlLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc291cmNlRGF0YSwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAotCXsiT1NBRG9TY3JpcHQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQURvU2NyaXB0LCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc291cmNlRGF0YSwgT1NBSUQgY29udGV4dElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0aW5nVGV4dCkiKX0sCi0JeyJPU0FTZXRDdXJyZW50RGlhbGVjdCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2V0Q3VycmVudERpYWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRpYWxlY3RDb2RlKSAtPiBOb25lIil9LAotCXsiT1NBR2V0Q3VycmVudERpYWxlY3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUdldEN1cnJlbnREaWFsZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCByZXN1bHRpbmdEaWFsZWN0Q29kZSkiKX0sCi0JeyJPU0FBdmFpbGFibGVEaWFsZWN0cyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQXZhaWxhYmxlRGlhbGVjdHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mb0xpc3QpIil9LAotCXsiT1NBR2V0RGlhbGVjdEluZm8iLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUdldERpYWxlY3RJbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkaWFsZWN0Q29kZSwgT1NUeXBlIHNlbGVjdG9yKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RJbmZvKSIpfSwKLQl7Ik9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBRURlc2MgcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0KSIpfSwKLQl7Ik9TQUV4ZWN1dGVFdmVudCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRXhlY3V0ZUV2ZW50LCAxLAotCSBQeURvY19TVFIoIihBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKLQl7Ik9TQURvRXZlbnQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQURvRXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudCwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKEFwcGxlRXZlbnQgcmVwbHkpIil9LAotCXsiT1NBTWFrZUNvbnRleHQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQU1ha2VDb250ZXh0LCAxLAotCSBQeURvY19TVFIoIihBRURlc2MgY29udGV4dE5hbWUsIE9TQUlEIHBhcmVudENvbnRleHQpIC0+IChPU0FJRCByZXN1bHRpbmdDb250ZXh0SUQpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiT1NBTG9hZCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBTG9hZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0SUQpIil9LAorICAgIHsiT1NBU3RvcmUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVN0b3JlLCAxLAorICAgICBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1NjcmlwdERhdGEpIil9LAorICAgIHsiT1NBRXhlY3V0ZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRXhlY3V0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgY29tcGlsZWRTY3JpcHRJRCwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAorICAgIHsiT1NBRGlzcGxheSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRGlzcGxheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0VmFsdWVJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1RleHQpIil9LAorICAgIHsiT1NBU2NyaXB0RXJyb3IiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNjcmlwdEVycm9yLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgc2VsZWN0b3IsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0Vycm9yRGVzY3JpcHRpb24pIil9LAorICAgIHsiT1NBRGlzcG9zZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRGlzcG9zZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQpIC0+IE5vbmUiKX0sCisgICAgeyJPU0FTZXRTY3JpcHRJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTZXRTY3JpcHRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgT1NUeXBlIHNlbGVjdG9yLCBsb25nIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiT1NBR2V0U2NyaXB0SW5mbyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBR2V0U2NyaXB0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIE9TVHlwZSBzZWxlY3RvcikgLT4gKGxvbmcgcmVzdWx0KSIpfSwKKyAgICB7Ik9TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKSIpfSwKKyAgICB7Ik9TQUNvbXBpbGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvbXBpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRGVzYyBzb3VyY2VEYXRhLCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQpIil9LAorICAgIHsiT1NBQ29weUlEIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb3B5SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIGZyb21JRCkgLT4gKE9TQUlEIHRvSUQpIil9LAorICAgIHsiT1NBR2V0U291cmNlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRTb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFRGVzYyByZXN1bHRpbmdTb3VyY2VEYXRhKSIpfSwKKyAgICB7Ik9TQUNvZXJjZUZyb21EZXNjIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb2VyY2VGcm9tRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0SUQpIil9LAorICAgIHsiT1NBQ29lcmNlVG9EZXNjIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb2VyY2VUb0Rlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7Ik9TQVNldERlZmF1bHRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldERlZmF1bHRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFQWRkcmVzc0Rlc2MgdGFyZ2V0KSAtPiBOb25lIil9LAorICAgIHsiT1NBU3RhcnRSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVN0YXJ0UmVjb3JkaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChPU0FJRCBjb21waWxlZFNjcmlwdFRvTW9kaWZ5SUQpIil9LAorICAgIHsiT1NBU3RvcFJlY29yZGluZyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU3RvcFJlY29yZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgY29tcGlsZWRTY3JpcHRJRCkgLT4gTm9uZSIpfSwKKyAgICB7Ik9TQUxvYWRFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FMb2FkRXhlY3V0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKKyAgICB7Ik9TQUNvbXBpbGVFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb21waWxlRXhlY3V0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKKyAgICB7Ik9TQURvU2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEb1NjcmlwdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIE9TQUlEIGNvbnRleHRJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1RleHQpIil9LAorICAgIHsiT1NBU2V0Q3VycmVudERpYWxlY3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldEN1cnJlbnREaWFsZWN0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaWFsZWN0Q29kZSkgLT4gTm9uZSIpfSwKKyAgICB7Ik9TQUdldEN1cnJlbnREaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRDdXJyZW50RGlhbGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgcmVzdWx0aW5nRGlhbGVjdENvZGUpIil9LAorICAgIHsiT1NBQXZhaWxhYmxlRGlhbGVjdHMiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChBRURlc2MgcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0KSIpfSwKKyAgICB7Ik9TQUdldERpYWxlY3RJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXREaWFsZWN0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGlhbGVjdENvZGUsIE9TVHlwZSBzZWxlY3RvcikgLT4gKEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mbykiKX0sCisgICAgeyJPU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RDb2RlTGlzdCkiKX0sCisgICAgeyJPU0FFeGVjdXRlRXZlbnQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUV4ZWN1dGVFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQXBwbGVFdmVudCB0aGVBcHBsZUV2ZW50LCBPU0FJRCBjb250ZXh0SUQsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCkiKX0sCisgICAgeyJPU0FEb0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEb0V2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBcHBsZUV2ZW50IHJlcGx5KSIpfSwKKyAgICB7Ik9TQU1ha2VDb250ZXh0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FNYWtlQ29udGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIGNvbnRleHROYW1lLCBPU0FJRCBwYXJlbnRDb250ZXh0KSAtPiAoT1NBSUQgcmVzdWx0aW5nQ29udGV4dElEKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgT1NBT2JqX2dldHNldGxpc3QgTlVMTApAQCAtODAwLDY4ICs4MDAsNjggQEAKIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUNvbXBvbmVudEluc3RhbmNlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgT1NBT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgT1NBT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgT1NBT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX09TQS5PU0FDb21wb25lbnRJbnN0YW5jZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgT1NBT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIE9TQU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgT1NBT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBPU0FPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JT1NBT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU9TQU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlPU0FPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCU9TQU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlPU0FPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlPU0FPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9PU0EuT1NBQ29tcG9uZW50SW5zdGFuY2UiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIE9TQU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBPU0FPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIE9TQU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgT1NBT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIE9TQU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBPU0FPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgT1NBT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBPU0FPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgT1NBT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgT1NBT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBPU0FDb21wb25lbnRJbnN0YW5jZSAtLS0tLS0tLS0tLS0tLSAqLwogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBPU0FfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC04NjksMzAgKzg2OSwzMCBAQAogCiB2b2lkIGluaXRfT1NBKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JLyoKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudEluc3RhbmNlLCBPU0FPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnRJbnN0YW5jZSwgT1NBT2JqX0NvbnZlcnQpOwotCSovCisgICAgLyoKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50SW5zdGFuY2UsIE9TQU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50SW5zdGFuY2UsIE9TQU9ial9Db252ZXJ0KTsKKyAgICAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX09TQSIsIE9TQV9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlPU0FfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChPU0FfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBPU0FfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk9TQUNvbXBvbmVudEluc3RhbmNlIiwgKFB5T2JqZWN0ICopJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJPU0FDb21wb25lbnRJbnN0YW5jZVR5cGUiLCAoUHlPYmplY3QgKikmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9PU0EiLCBPU0FfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgT1NBX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoT1NBX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgT1NBX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJPU0FDb21wb25lbnRJbnN0YW5jZSIsIChQeU9iamVjdCAqKSZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiT1NBQ29tcG9uZW50SW5zdGFuY2VUeXBlIiwgKFB5T2JqZWN0ICopJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfT1NBID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKaW5kZXggOGM5OGZhMS4uYzc1OTRiOSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTQyLDE5ICs0MiwxOSBAQAogUHlPYmplY3QgKlFkUkdCX05ldyhSR0JDb2xvclB0ciBpdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbCIsIChsb25nKWl0c2VsZi0+cmVkLCAobG9uZylpdHNlbGYtPmdyZWVuLCAobG9uZylpdHNlbGYtPmJsdWUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbGwiLCAobG9uZylpdHNlbGYtPnJlZCwgKGxvbmcpaXRzZWxmLT5ncmVlbiwgKGxvbmcpaXRzZWxmLT5ibHVlKTsKIH0KIAogaW50IFFkUkdCX0NvbnZlcnQoUHlPYmplY3QgKnYsIFJHQkNvbG9yUHRyIHBfaXRzZWxmKQogewotICAgICAgICBsb25nIHJlZCwgZ3JlZW4sIGJsdWU7CisgICAgbG9uZyByZWQsIGdyZWVuLCBibHVlOwogCi0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGxsIiwgJnJlZCwgJmdyZWVuLCAmYmx1ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBwX2l0c2VsZi0+cmVkID0gKHVuc2lnbmVkIHNob3J0KXJlZDsKLSAgICAgICAgcF9pdHNlbGYtPmdyZWVuID0gKHVuc2lnbmVkIHNob3J0KWdyZWVuOwotICAgICAgICBwX2l0c2VsZi0+Ymx1ZSA9ICh1bnNpZ25lZCBzaG9ydClibHVlOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsbCIsICZyZWQsICZncmVlbiwgJmJsdWUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcF9pdHNlbGYtPnJlZCA9ICh1bnNpZ25lZCBzaG9ydClyZWQ7CisgICAgcF9pdHNlbGYtPmdyZWVuID0gKHVuc2lnbmVkIHNob3J0KWdyZWVuOworICAgIHBfaXRzZWxmLT5ibHVlID0gKHVuc2lnbmVkIHNob3J0KWJsdWU7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC02NCw4ICs2NCw4IEBACiBQeU9iamVjdCAqUWRGSV9OZXcoRm9udEluZm8gKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaCIsIGl0c2VsZi0+YXNjZW50LCBpdHNlbGYtPmRlc2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPndpZE1heCwgaXRzZWxmLT5sZWFkaW5nKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaCIsIGl0c2VsZi0+YXNjZW50LCBpdHNlbGYtPmRlc2NlbnQsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+d2lkTWF4LCBpdHNlbGYtPmxlYWRpbmcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Vycm9yOwpAQCAtNzcsMTI2MCArNzcsMTI2MCBAQAogI2RlZmluZSBHcmFmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkdyYWZQb3J0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkdyYWZQb3J0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBHcmFmUG9ydE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUdyYWZQdHIgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBHcmFmUHRyIG9iX2l0c2VsZjsKIH0gR3JhZlBvcnRPYmplY3Q7CiAKIFB5T2JqZWN0ICpHcmFmT2JqX05ldyhHcmFmUHRyIGl0c2VsZikKIHsKLQlHcmFmUG9ydE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEdyYWZQb3J0T2JqZWN0LCAmR3JhZlBvcnRfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEdyYWZQb3J0T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoR3JhZlBvcnRPYmplY3QsICZHcmFmUG9ydF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBHcmFmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEdyYWZQdHIgKnBfaXRzZWxmKQogewogI2lmIDEKLQl7Ci0JCVdpbmRvd1JlZiB3aW47Ci0JCWlmIChXaW5PYmpfQ29udmVydCh2LCAmd2luKSAmJiB2KSB7Ci0JCQkqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlQeUVycl9DbGVhcigpOwotCX0KKyAgICB7CisgICAgICAgIFdpbmRvd1JlZiB3aW47CisgICAgICAgIGlmIChXaW5PYmpfQ29udmVydCh2LCAmd2luKSAmJiB2KSB7CisgICAgICAgICAgICAqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KICNlbHNlCi0JaWYgKERsZ09ial9DaGVjayh2KSkgewotCQlEaWFsb2dSZWYgZGxnID0gKERpYWxvZ1JlZikoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQkJKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydChHZXREaWFsb2dXaW5kb3coZGxnKSk7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoV2luT2JqX0NoZWNrKHYpKSB7Ci0JCVdpbmRvd1JlZiB3aW4gPSAoV2luZG93UmVmKSgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCQkqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7Ci0JCXJldHVybiAxOwotCX0KKyAgICBpZiAoRGxnT2JqX0NoZWNrKHYpKSB7CisgICAgICAgIERpYWxvZ1JlZiBkbGcgPSAoRGlhbG9nUmVmKSgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICAqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KEdldERpYWxvZ1dpbmRvdyhkbGcpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChXaW5PYmpfQ2hlY2sodikpIHsKKyAgICAgICAgV2luZG93UmVmIHdpbiA9IChXaW5kb3dSZWYpKChHcmFmUG9ydE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgICpwX2l0c2VsZiA9IChHcmFmUHRyKUdldFdpbmRvd1BvcnQod2luKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCi0JaWYgKCFHcmFmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkdyYWZQb3J0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUdyYWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiR3JhZlBvcnQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBHcmFmT2JqX2RlYWxsb2MoR3JhZlBvcnRPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfTWFjU2V0UG9ydChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBNYWNTZXRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjU2V0UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjU2V0UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2V0UG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1NldFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURTd2FwUG9ydChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0dyYWZQdHIgb3V0T2xkUG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQ0dyYWZQdHIgb3V0T2xkUG9ydDsKICNpZm5kZWYgUURTd2FwUG9ydAotCVB5TWFjX1BSRUNIRUNLKFFEU3dhcFBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFEU3dhcFBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFEU3dhcFBvcnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZvdXRPbGRQb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIG91dE9sZFBvcnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRRFN3YXBQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAmb3V0T2xkUG9ydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBvdXRPbGRQb3J0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzVmFsaWRQb3J0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzVmFsaWRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZFBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzVmFsaWRQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1ZhbGlkUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNWYWxpZFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGl4TWFwKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRQb3J0UGl4TWFwCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBpeE1hcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFBpeE1hcChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRQaXhNYXAoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljb25zdCBCaXRNYXAgKiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNvbnN0IEJpdE1hcCAqIF9ydjsKICNpZm5kZWYgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEJNT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEJvdW5kcyhHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIEdldFBvcnRCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAmcmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgJnJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0Rm9yZUNvbG9yKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBmb3JlQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGZvcmVDb2xvcjsKICNpZm5kZWYgR2V0UG9ydEZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRGb3JlQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRGb3JlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvcnRGb3JlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZmb3JlQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmZm9yZUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydEZvcmVDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgJmZvcmVDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZmb3JlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEJhY2tDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgYmFja0NvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBiYWNrQ29sb3I7CiAjaWZuZGVmIEdldFBvcnRCYWNrQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0QmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0QmFja0NvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0QmFja0NvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmYmFja0NvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmJhY2tDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRCYWNrQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZiYWNrQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYmFja0NvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRPcENvbG9yKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBvcENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBvcENvbG9yOwogI2lmbmRlZiBHZXRQb3J0T3BDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRPcENvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0T3BDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydE9wQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmb3BDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydE9wQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRIaWxpdGVDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgaGlsaXRlQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGhpbGl0ZUNvbG9yOwogI2lmbmRlZiBHZXRQb3J0SGlsaXRlQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0SGlsaXRlQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRIaWxpdGVDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydEhpbGl0ZUNvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZoaWxpdGVDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZoaWxpdGVDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRIaWxpdGVDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmaGlsaXRlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRGb250KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRGb250Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dEZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0Rm9udChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRGb250KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRGYWNlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHlsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0eWxlIF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRGYWNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRGYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dEZhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0RmFjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRGYWNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRNb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dE1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0TW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRNb2RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRTaXplKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRTaXplKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydENoRXh0cmEoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRQb3J0Q2hFeHRyYQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRDaEV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Q2hFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydENoRXh0cmEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRDaEV4dHJhKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRGcmFjSFBlbkxvY2F0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRGcmFjSFBlbkxvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFNwRXh0cmEoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OwogI2lmbmRlZiBHZXRQb3J0U3BFeHRyYQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRTcEV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0U3BFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFNwRXh0cmEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0U3BFeHRyYShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGVuVmlzaWJpbGl0eShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFBvcnRQZW5WaXNpYmlsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblZpc2liaWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5WaXNpYmlsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0UGVuVmlzaWJpbGl0eShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFBlblZpc2liaWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0VmlzaWJsZVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKLQlSZ25IYW5kbGUgdmlzUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OworICAgIFJnbkhhbmRsZSB2aXNSZ247CiAjaWZuZGVmIEdldFBvcnRWaXNpYmxlUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFZpc2libGVSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRWaXNpYmxlUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2aXNSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1Jnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2aXNSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1Jnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydENsaXBSZWdpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7Ci0JUmduSGFuZGxlIGNsaXBSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgUmduSGFuZGxlIGNsaXBSZ247CiAjaWZuZGVmIEdldFBvcnRDbGlwUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydENsaXBSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRDbGlwUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydENsaXBSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0Q2xpcFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRCYWNrUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgX3J2OwotCVBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIF9ydjsKKyAgICBQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm47CiAjaWZuZGVmIEdldFBvcnRCYWNrUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJhY2tQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRCYWNrUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZiYWNrUGF0dGVybikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRCYWNrUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdHRlcm4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja1BhdHRlcm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0QmFja1BpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXR0ZXJuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGVuUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgX3J2OwotCVBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgX3J2OworICAgIFBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuOwogI2lmbmRlZiBHZXRQb3J0UGVuUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRQZW5QaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRQZW5QaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRGaWxsUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgX3J2OwotCVBpeFBhdEhhbmRsZSBmaWxsUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIF9ydjsKKyAgICBQaXhQYXRIYW5kbGUgZmlsbFBhdHRlcm47CiAjaWZuZGVmIEdldFBvcnRGaWxsUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEZpbGxQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRGaWxsUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZmaWxsUGF0dGVybikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRGaWxsUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFBhdHRlcm4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZmlsbFBhdHRlcm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0RmlsbFBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxQYXR0ZXJuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGVuU2l6ZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcGVuU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcGVuU2l6ZTsKICNpZm5kZWYgR2V0UG9ydFBlblNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0UGVuU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnBlblNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0UGVuU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICZwZW5TaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBlblNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5TaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydFBlblNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmcGVuU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwZW5TaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRQZW5Nb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRQb3J0UGVuTW9kZQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5Nb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0UGVuTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFBlbk1vZGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRQZW5Nb2RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFBlbkxvY2F0aW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwZW5Mb2NhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcGVuTG9jYXRpb247CiAjaWZuZGVmIEdldFBvcnRQZW5Mb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5Mb2NhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlbkxvY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5Mb2NhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvcnRQZW5Mb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmcGVuTG9jYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcGVuTG9jYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5Mb2NhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRQZW5Mb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmcGVuTG9jYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcGVuTG9jYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZAotCVB5TWFjX1BSRUNIRUNLKElzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRSZWdpb25CZWluZ0RlZmluZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNQb3J0UGljdHVyZUJlaW5nRGVmaW5lZAotCVB5TWFjX1BSRUNIRUNLKElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Jc1BvcnRQb2x5QmVpbmdEZWZpbmVkKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydFBvbHlCZWluZ0RlZmluZWQKLQlQeU1hY19QUkVDSEVDSyhJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0T2Zmc2NyZWVuKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydE9mZnNjcmVlbgotCVB5TWFjX1BSRUNIRUNLKElzUG9ydE9mZnNjcmVlbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0T2Zmc2NyZWVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRPZmZzY3JlZW4oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydE9mZnNjcmVlbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzUG9ydENvbG9yKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydENvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soSXNQb3J0Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUG9ydENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRDb2xvcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNQb3J0Q29sb3IoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Jc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHkoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5Ci0JUHlNYWNfUFJFQ0hFQ0soSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzUG9ydFZpc2libGVSZWdpb25FbXB0eShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0Q2xpcFJlZ2lvbkVtcHR5KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydENsaXBSZWdpb25FbXB0eQotCVB5TWFjX1BSRUNIRUNLKElzUG9ydENsaXBSZWdpb25FbXB0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0Q2xpcFJlZ2lvbkVtcHR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRDbGlwUmVnaW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydENsaXBSZWdpb25FbXB0eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBpb1JlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGlvUmVnaW9uOwogI2lmbmRlZiBTZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW9SZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb1JlZ2lvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpb1JlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvUmVnaW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgaW9SZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBpb1JlZ2lvbjsKICNpZm5kZWYgU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlvUmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9SZWdpb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW9SZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb1JlZ2lvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU3dhcFBvcnRQaWNTYXZlSGFuZGxlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCUhhbmRsZSBpblBpY1NhdmVIZGw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgSGFuZGxlIGluUGljU2F2ZUhkbDsKICNpZm5kZWYgU3dhcFBvcnRQaWNTYXZlSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soU3dhcFBvcnRQaWNTYXZlSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTd2FwUG9ydFBpY1NhdmVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUGljU2F2ZUhkbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN3YXBQb3J0UGljU2F2ZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBpY1NhdmVIZGwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5QaWNTYXZlSGRsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3dhcFBvcnRQaWNTYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGljU2F2ZUhkbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlIYW5kbGUgaW5Qb2x5U2F2ZUhkbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBIYW5kbGUgaW5Qb2x5U2F2ZUhkbDsKICNpZm5kZWYgU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFN3YXBQb3J0UG9seVNhdmVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFN3YXBQb3J0UG9seVNhdmVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUG9seVNhdmVIZGwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTd2FwUG9ydFBvbHlTYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBvbHlTYXZlSGRsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUG9seVNhdmVIZGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTd2FwUG9ydFBvbHlTYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBvbHlTYXZlSGRsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Td2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JSGFuZGxlIGluUmVnaW9uU2F2ZUhkbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBIYW5kbGUgaW5SZWdpb25TYXZlSGRsOwogI2lmbmRlZiBTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFN3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5SZWdpb25TYXZlSGRsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uU2F2ZUhkbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpblJlZ2lvblNhdmVIZGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb25TYXZlSGRsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0Qm91bmRzKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgU2V0UG9ydEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICZyZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICZyZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0T3BDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3Igb3BDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3Igb3BDb2xvcjsKICNpZm5kZWYgU2V0UG9ydE9wQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0T3BDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydE9wQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmb3BDb2xvcikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRPcENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgJm9wQ29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZvcENvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydE9wQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFRleHRGb250KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB0eEZvbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHR4Rm9udDsKICNpZm5kZWYgU2V0UG9ydFRleHRGb250Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFRleHRGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dEZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eEZvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0VGV4dEZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgdHhGb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eEZvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0VGV4dEZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdHhGb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0VGV4dFNpemUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHR4U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdHhTaXplOwogI2lmbmRlZiBTZXRQb3J0VGV4dFNpemUKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRUZXh0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnR4U2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRUZXh0U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0eFNpemUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnR4U2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRUZXh0U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICB0eFNpemUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRUZXh0RmFjZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3R5bGVQYXJhbWV0ZXIgZmFjZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3R5bGVQYXJhbWV0ZXIgZmFjZTsKICNpZm5kZWYgU2V0UG9ydFRleHRGYWNlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFRleHRGYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dEZhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFRleHRGYWNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIGZhY2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0VGV4dEZhY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgZmFjZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFRleHRNb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOwogI2lmbmRlZiBTZXRQb3J0VGV4dE1vZGUKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dE1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRUZXh0TW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0VGV4dE1vZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgbW9kZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRUZXh0TW9kZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0VmlzaWJsZVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHZpc1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHZpc1JnbjsKICNpZm5kZWYgU2V0UG9ydFZpc2libGVSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0VmlzaWJsZVJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFZpc2libGVSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZpc1JnbikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRWaXNpYmxlUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdmlzUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZpc1JnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRWaXNpYmxlUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0Q2xpcFJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGNsaXBSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBjbGlwUmduOwogI2lmbmRlZiBTZXRQb3J0Q2xpcFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRDbGlwUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0Q2xpcFJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJnbikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRDbGlwUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgY2xpcFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydENsaXBSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0UGVuUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgcGVuUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIHBlblBhdHRlcm47CiAjaWZuZGVmIFNldFBvcnRQZW5QaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0UGVuUGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0UGVuUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwZW5QYXR0ZXJuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFBlblBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgcGVuUGF0dGVybik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwZW5QYXR0ZXJuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFBlblBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgcGVuUGF0dGVybik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydEZpbGxQaXhQYXQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgcGVuUGF0dGVybjsKICNpZm5kZWYgU2V0UG9ydEZpbGxQaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0RmlsbFBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEZpbGxQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBlblBhdHRlcm4pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0RmlsbFBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRGaWxsUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgcGVuUGF0dGVybik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydEJhY2tQaXhQYXQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIGJhY2tQYXR0ZXJuOwogI2lmbmRlZiBTZXRQb3J0QmFja1BpeFBhdAotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRCYWNrUGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0QmFja1BpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja1BhdHRlcm4pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0QmFja1BpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGJhY2tQYXR0ZXJuKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmJhY2tQYXR0ZXJuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydEJhY2tQaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0dGVybik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFBlblNpemUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHBlblNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHBlblNpemU7CiAjaWZuZGVmIFNldFBvcnRQZW5TaXplCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBlblNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRQZW5TaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5TaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFBlblNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBwZW5TaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnBlblNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0UGVuU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHBlblNpemUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRQZW5Nb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgcGVuTW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIHBlbk1vZGU7CiAjaWZuZGVmIFNldFBvcnRQZW5Nb2RlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBlbk1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRQZW5Nb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVuTW9kZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRQZW5Nb2RlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgcGVuTW9kZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuTW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRQZW5Nb2RlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgcGVuTW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydEZyYWNIUGVuTG9jYXRpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHBuTG9jSEZyYWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHBuTG9jSEZyYWM7CiAjaWZuZGVmIFNldFBvcnRGcmFjSFBlbkxvY2F0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEZyYWNIUGVuTG9jYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRGcmFjSFBlbkxvY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG5Mb2NIRnJhYykpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRGcmFjSFBlbkxvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcG5Mb2NIRnJhYyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG5Mb2NIRnJhYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRGcmFjSFBlbkxvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5Mb2NIRnJhYyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfRGlzcG9zZVBvcnQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlzcG9zZVBvcnQKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZVBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUG9pbnQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHBvaW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwb2ludDsKICNpZm5kZWYgUURMb2NhbFRvR2xvYmFsUG9pbnQKLQlQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxQb2ludCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURMb2NhbFRvR2xvYmFsUG9pbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnBvaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUURMb2NhbFRvR2xvYmFsUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAmcG9pbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcG9pbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwb2ludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFFETG9jYWxUb0dsb2JhbFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBvaW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFBvaW50KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwb2ludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcG9pbnQ7CiAjaWZuZGVmIFFER2xvYmFsVG9Mb2NhbFBvaW50Ci0JUHlNYWNfUFJFQ0hFQ0soUURHbG9iYWxUb0xvY2FsUG9pbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFBvaW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwb2ludCkpCi0JCXJldHVybiBOVUxMOwotCVFER2xvYmFsVG9Mb2NhbFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJnBvaW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBvaW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBRREdsb2JhbFRvTG9jYWxQb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwb2ludCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RRExvY2FsVG9HbG9iYWxSZWN0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIFFETG9jYWxUb0dsb2JhbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlRRExvY2FsVG9HbG9iYWxSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFFETG9jYWxUb0dsb2JhbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFJlY3QoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgUURHbG9iYWxUb0xvY2FsUmVjdAotCVB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVFER2xvYmFsVG9Mb2NhbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUURHbG9iYWxUb0xvY2FsUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgUURMb2NhbFRvR2xvYmFsUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUURMb2NhbFRvR2xvYmFsUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFETG9jYWxUb0dsb2JhbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUURMb2NhbFRvR2xvYmFsUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgUURHbG9iYWxUb0xvY2FsUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUURHbG9iYWxUb0xvY2FsUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRREdsb2JhbFRvTG9jYWxSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFER2xvYmFsVG9Mb2NhbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUURHbG9iYWxUb0xvY2FsUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURJc1BvcnRCdWZmZXJlZChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBRRElzUG9ydEJ1ZmZlcmVkCi0JUHlNYWNfUFJFQ0hFQ0soUURJc1BvcnRCdWZmZXJlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURJc1BvcnRCdWZmZXJlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUURJc1BvcnRCdWZmZXJlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUURJc1BvcnRCdWZmZXJlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FESXNQb3J0QnVmZmVyRGlydHkoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgUURJc1BvcnRCdWZmZXJEaXJ0eQotCVB5TWFjX1BSRUNIRUNLKFFESXNQb3J0QnVmZmVyRGlydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFFESXNQb3J0QnVmZmVyRGlydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFESXNQb3J0QnVmZmVyRGlydHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFESXNQb3J0QnVmZmVyRGlydHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RREZsdXNoUG9ydEJ1ZmZlcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgUURGbHVzaFBvcnRCdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhRREZsdXNoUG9ydEJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURGbHVzaFBvcnRCdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCVFERmx1c2hQb3J0QnVmZmVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFFERmx1c2hQb3J0QnVmZmVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RREdldERpcnR5UmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgUURHZXREaXJ0eVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFFER2V0RGlydHlSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFFER2V0RGlydHlSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRREdldERpcnR5UmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmduKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFER2V0RGlydHlSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURTZXREaXJ0eVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIFFEU2V0RGlydHlSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhRRFNldERpcnR5UmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRFNldERpcnR5UmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUURTZXREaXJ0eVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRRFNldERpcnR5UmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEdyYWZPYmpfbWV0aG9kc1tdID0gewotCXsiTWFjU2V0UG9ydCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX01hY1NldFBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlFEU3dhcFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRFN3YXBQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgQ0dyYWZQdHIgb3V0T2xkUG9ydCkiKX0sCi0JeyJJc1ZhbGlkUG9ydCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzVmFsaWRQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRQb3J0UGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGl4TWFwSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGNvbnN0IEJpdE1hcCAqIF9ydikiKX0sCi0JeyJHZXRQb3J0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKLQl7IkdldFBvcnRGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Rm9yZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBmb3JlQ29sb3IpIil9LAotCXsiR2V0UG9ydEJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCYWNrQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGJhY2tDb2xvcikiKX0sCi0JeyJHZXRQb3J0T3BDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRPcENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBvcENvbG9yKSIpfSwKLQl7IkdldFBvcnRIaWxpdGVDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRIaWxpdGVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgaGlsaXRlQ29sb3IpIil9LAotCXsiR2V0UG9ydFRleHRGb250IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRGb250LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UG9ydFRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRGYWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTdHlsZSBfcnYpIil9LAotCXsiR2V0UG9ydFRleHRNb2RlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRNb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UG9ydFRleHRTaXplIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UG9ydENoRXh0cmEiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Q2hFeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFBvcnRGcmFjSFBlbkxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRQb3J0U3BFeHRyYSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRTcEV4dHJhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiR2V0UG9ydFBlblZpc2liaWxpdHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuVmlzaWJpbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFBvcnRWaXNpYmxlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFZpc2libGVSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB2aXNSZ24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IkdldFBvcnRDbGlwUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydENsaXBSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbGlwUmduKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0QmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCYWNrUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm4pIC0+IChQaXhQYXRIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFBvcnRQZW5QaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGVuUGF0dGVybikgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAotCXsiR2V0UG9ydEZpbGxQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0RmlsbFBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIGZpbGxQYXR0ZXJuKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0UGVuU2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5TaXplLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwZW5TaXplKSAtPiAoUG9pbnQgcGVuU2l6ZSkiKX0sCi0JeyJHZXRQb3J0UGVuTW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5Nb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkdldFBvcnRQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5Mb2NhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcGVuTG9jYXRpb24pIC0+IChQb2ludCBwZW5Mb2NhdGlvbikiKX0sCi0JeyJJc1BvcnRSZWdpb25CZWluZ0RlZmluZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRSZWdpb25CZWluZ0RlZmluZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRQb2x5QmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UG9seUJlaW5nRGVmaW5lZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSXNQb3J0T2Zmc2NyZWVuIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0T2Zmc2NyZWVuLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzUG9ydENsaXBSZWdpb25FbXB0eSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydENsaXBSZWdpb25FbXB0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpb1JlZ2lvbikgLT4gTm9uZSIpfSwKLQl7IlNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgaW9SZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJTd2FwUG9ydFBpY1NhdmVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Td2FwUG9ydFBpY1NhdmVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBpblBpY1NhdmVIZGwpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlN3YXBQb3J0UG9seVNhdmVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Td2FwUG9ydFBvbHlTYXZlSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaW5Qb2x5U2F2ZUhkbCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaW5SZWdpb25TYXZlSGRsKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRQb3J0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiU2V0UG9ydE9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0T3BDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3Igb3BDb2xvcikgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRUZXh0Rm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdHhGb250KSAtPiBOb25lIil9LAotCXsiU2V0UG9ydFRleHRTaXplIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRTaXplLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB0eFNpemUpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0VGV4dEZhY2UiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dEZhY2UsIDEsCi0JIFB5RG9jX1NUUigiKFN0eWxlUGFyYW1ldGVyIGZhY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0VGV4dE1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dE1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1vZGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0VmlzaWJsZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRWaXNpYmxlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdmlzUmduKSAtPiBOb25lIil9LAotCXsiU2V0UG9ydENsaXBSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0Q2xpcFJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsaXBSZ24pIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0UGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFBlblBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0RmlsbFBpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRGaWxsUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGVuUGF0dGVybikgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRCYWNrUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydEJhY2tQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybikgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRQZW5TaXplIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFBlblNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHBlblNpemUpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0UGVuTW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5Nb2RlLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgcGVuTW9kZSkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRGcmFjSFBlbkxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydEZyYWNIUGVuTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBuTG9jSEZyYWMpIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlUG9ydCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0Rpc3Bvc2VQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJRRExvY2FsVG9HbG9iYWxQb2ludCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FETG9jYWxUb0dsb2JhbFBvaW50LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwb2ludCkgLT4gKFBvaW50IHBvaW50KSIpfSwKLQl7IlFER2xvYmFsVG9Mb2NhbFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHBvaW50KSAtPiAoUG9pbnQgcG9pbnQpIil9LAotCXsiUURMb2NhbFRvR2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FETG9jYWxUb0dsb2JhbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IlFER2xvYmFsVG9Mb2NhbFJlY3QiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdsb2JhbFRvTG9jYWxSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCi0JeyJRRExvY2FsVG9HbG9iYWxSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlFER2xvYmFsVG9Mb2NhbFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiUURJc1BvcnRCdWZmZXJlZCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FESXNQb3J0QnVmZmVyZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlFESXNQb3J0QnVmZmVyRGlydHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRElzUG9ydEJ1ZmZlckRpcnR5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJRREZsdXNoUG9ydEJ1ZmZlciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FERmx1c2hQb3J0QnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAotCXsiUURHZXREaXJ0eVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2V0RGlydHlSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJRRFNldERpcnR5UmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURTZXREaXJ0eVJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik1hY1NldFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9NYWNTZXRQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJRRFN3YXBQb3J0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURTd2FwUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIENHcmFmUHRyIG91dE9sZFBvcnQpIil9LAorICAgIHsiSXNWYWxpZFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1ZhbGlkUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0UG9ydFBpeE1hcCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChjb25zdCBCaXRNYXAgKiBfcnYpIil9LAorICAgIHsiR2V0UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgcmVjdCkiKX0sCisgICAgeyJHZXRQb3J0Rm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZvcmVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgZm9yZUNvbG9yKSIpfSwKKyAgICB7IkdldFBvcnRCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0QmFja0NvbG9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBiYWNrQ29sb3IpIil9LAorICAgIHsiR2V0UG9ydE9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0T3BDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3Igb3BDb2xvcikiKX0sCisgICAgeyJHZXRQb3J0SGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0SGlsaXRlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGhpbGl0ZUNvbG9yKSIpfSwKKyAgICB7IkdldFBvcnRUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRUZXh0RmFjZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0RmFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3R5bGUgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRUZXh0TW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRDaEV4dHJhIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydENoRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRGcmFjSFBlbkxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0UG9ydFNwRXh0cmEiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0U3BFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRQZW5WaXNpYmlsaXR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlblZpc2liaWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRQb3J0VmlzaWJsZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRWaXNpYmxlUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgdmlzUmduKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRQb3J0Q2xpcFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRDbGlwUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xpcFJnbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydEJhY2tQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0QmFja1BpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIGJhY2tQYXR0ZXJuKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRQb3J0UGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlblBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IChQaXhQYXRIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRGaWxsUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZpbGxQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBmaWxsUGF0dGVybikgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydFBlblNpemUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcGVuU2l6ZSkgLT4gKFBvaW50IHBlblNpemUpIil9LAorICAgIHsiR2V0UG9ydFBlbk1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJHZXRQb3J0UGVuTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuTG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHBlbkxvY2F0aW9uKSAtPiAoUG9pbnQgcGVuTG9jYXRpb24pIil9LAorICAgIHsiSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UGljdHVyZUJlaW5nRGVmaW5lZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0UG9seUJlaW5nRGVmaW5lZCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydFBvbHlCZWluZ0RlZmluZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IklzUG9ydE9mZnNjcmVlbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydE9mZnNjcmVlbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0Q29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc1BvcnRDbGlwUmVnaW9uRW1wdHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRDbGlwUmVnaW9uRW1wdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgaW9SZWdpb24pIC0+IE5vbmUiKX0sCisgICAgeyJTZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGlvUmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiU3dhcFBvcnRQaWNTYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRQaWNTYXZlSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaW5QaWNTYXZlSGRsKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJTd2FwUG9ydFBvbHlTYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGluUG9seVNhdmVIZGwpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlN3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1N3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGluUmVnaW9uU2F2ZUhkbCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRPcENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydE9wQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIG9wQ29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0VGV4dEZvbnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dEZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHR4Rm9udCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRUZXh0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdHhTaXplKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRGYWNlLCAxLAorICAgICBQeURvY19TVFIoIihTdHlsZVBhcmFtZXRlciBmYWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFRleHRNb2RlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFZpc2libGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VmlzaWJsZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHZpc1JnbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRDbGlwUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydENsaXBSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbGlwUmduKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFBlblBpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5QaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydEZpbGxQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0RmlsbFBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0QmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRCYWNrUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm4pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0UGVuU2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5TaXplLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwZW5TaXplKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFBlbk1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0UGVuTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIHBlbk1vZGUpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRGcmFjSFBlbkxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwbkxvY0hGcmFjKSAtPiBOb25lIil9LAorICAgIHsiRGlzcG9zZVBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9EaXNwb3NlUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUURMb2NhbFRvR2xvYmFsUG9pbnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcG9pbnQpIC0+IChQb2ludCBwb2ludCkiKX0sCisgICAgeyJRREdsb2JhbFRvTG9jYWxQb2ludCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFBvaW50LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwb2ludCkgLT4gKFBvaW50IHBvaW50KSIpfSwKKyAgICB7IlFETG9jYWxUb0dsb2JhbFJlY3QiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJRREdsb2JhbFRvTG9jYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHsiUURMb2NhbFRvR2xvYmFsUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJRREdsb2JhbFRvTG9jYWxSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdsb2JhbFRvTG9jYWxSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlFESXNQb3J0QnVmZmVyZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRElzUG9ydEJ1ZmZlcmVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJRRElzUG9ydEJ1ZmZlckRpcnR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURJc1BvcnRCdWZmZXJEaXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUURGbHVzaFBvcnRCdWZmZXIiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREZsdXNoUG9ydEJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IlFER2V0RGlydHlSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdldERpcnR5UmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiUURTZXREaXJ0eVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FEU2V0RGlydHlSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfZ2V0X3Zpc1JnbihHcmFmUG9ydE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KLQkgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKUdldFBvcnRWaXNpYmxlUmVnaW9uKHNlbGYtPm9iX2l0c2VsZiwgaCkpOwotCSAgICAgICAgICAgIAorICAgIFJnbkhhbmRsZSBoPU5ld1JnbigpOyAvKiBYWFhYIHdyb25nIGRpc3Bvc2Ugcm91dGluZSAqLworICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlHZXRQb3J0VmlzaWJsZVJlZ2lvbihzZWxmLT5vYl9pdHNlbGYsIGgpKTsKKwogfQogCiAjZGVmaW5lIEdyYWZPYmpfc2V0X3Zpc1JnbiBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9nZXRfY2xpcFJnbihHcmFmUG9ydE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KLQkgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKUdldFBvcnRDbGlwUmVnaW9uKHNlbGYtPm9iX2l0c2VsZiwgaCkpOwotCSAgICAgICAgICAgIAorICAgIFJnbkhhbmRsZSBoPU5ld1JnbigpOyAvKiBYWFhYIHdyb25nIGRpc3Bvc2Ugcm91dGluZSAqLworICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlHZXRQb3J0Q2xpcFJlZ2lvbihzZWxmLT5vYl9pdHNlbGYsIGgpKTsKKwogfQogCiAjZGVmaW5lIEdyYWZPYmpfc2V0X2NsaXBSZ24gTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgR3JhZk9ial9nZXRzZXRsaXN0W10gPSB7Ci0JeyJ2aXNSZ24iLCAoZ2V0dGVyKUdyYWZPYmpfZ2V0X3Zpc1JnbiwgKHNldHRlcilHcmFmT2JqX3NldF92aXNSZ24sICJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIHZpc2libGUgcmVnaW9uIn0sCi0JeyJjbGlwUmduIiwgKGdldHRlcilHcmFmT2JqX2dldF9jbGlwUmduLCAoc2V0dGVyKUdyYWZPYmpfc2V0X2NsaXBSZ24sICJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIGNsaXBwaW5nIHJlZ2lvbiJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7InZpc1JnbiIsIChnZXR0ZXIpR3JhZk9ial9nZXRfdmlzUmduLCAoc2V0dGVyKUdyYWZPYmpfc2V0X3Zpc1JnbiwgIkNvbnZlbmllbmNlIGF0dHJpYnV0ZTogcmV0dXJuIGEgY29weSBvZiB0aGUgdmlzaWJsZSByZWdpb24ifSwKKyAgICB7ImNsaXBSZ24iLCAoZ2V0dGVyKUdyYWZPYmpfZ2V0X2NsaXBSZ24sIChzZXR0ZXIpR3JhZk9ial9zZXRfY2xpcFJnbiwgIkNvbnZlbmllbmNlIGF0dHJpYnV0ZTogcmV0dXJuIGEgY29weSBvZiB0aGUgY2xpcHBpbmcgcmVnaW9uIn0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC0xMzQ1LDYxICsxMzQ1LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JR3JhZlB0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEdyYWZQdHIgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgR3JhZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEdyYWZQb3J0T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEdyYWZPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChHcmFmUG9ydE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBHcmFmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEdyYWZQb3J0X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1FkLkdyYWZQb3J0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoR3JhZlBvcnRPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBHcmFmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEdyYWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEdyYWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEdyYWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JR3JhZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlHcmFmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUdyYWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUdyYWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JR3JhZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUdyYWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RZC5HcmFmUG9ydCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEdyYWZQb3J0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgR3JhZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBHcmFmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBHcmFmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBHcmFmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEdyYWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgR3JhZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBHcmFmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBHcmFmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEdyYWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBHcmFmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBHcmFmUG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTQxMiwxMjQgKzE0MTIsMTI0IEBACiAjZGVmaW5lIEJNT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkJpdE1hcF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZCaXRNYXBfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEJpdE1hcE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUJpdE1hcFB0ciBvYl9pdHNlbGY7Ci0JUHlPYmplY3QgKnJlZmVycmVkX29iamVjdDsKLQlCaXRNYXAgKnJlZmVycmVkX2JpdG1hcDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQml0TWFwUHRyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqcmVmZXJyZWRfb2JqZWN0OworICAgIEJpdE1hcCAqcmVmZXJyZWRfYml0bWFwOwogfSBCaXRNYXBPYmplY3Q7CiAKIFB5T2JqZWN0ICpCTU9ial9OZXcoQml0TWFwUHRyIGl0c2VsZikKIHsKLQlCaXRNYXBPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhCaXRNYXBPYmplY3QsICZCaXRNYXBfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPnJlZmVycmVkX29iamVjdCA9IE5VTEw7Ci0JaXQtPnJlZmVycmVkX2JpdG1hcCA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEJpdE1hcE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKEJpdE1hcE9iamVjdCwgJkJpdE1hcF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+cmVmZXJyZWRfb2JqZWN0ID0gTlVMTDsKKyAgICBpdC0+cmVmZXJyZWRfYml0bWFwID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBCTU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBCaXRNYXBQdHIgKnBfaXRzZWxmKQogewotCWlmICghQk1PYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQml0TWFwIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEJpdE1hcE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFCTU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJCaXRNYXAgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQml0TWFwT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQk1PYmpfZGVhbGxvYyhCaXRNYXBPYmplY3QgKnNlbGYpCiB7Ci0JUHlfWERFQ1JFRihzZWxmLT5yZWZlcnJlZF9vYmplY3QpOwotCWlmIChzZWxmLT5yZWZlcnJlZF9iaXRtYXApIGZyZWUoc2VsZi0+cmVmZXJyZWRfYml0bWFwKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cmVmZXJyZWRfb2JqZWN0KTsKKyAgICBpZiAoc2VsZi0+cmVmZXJyZWRfYml0bWFwKSBmcmVlKHNlbGYtPnJlZmVycmVkX2JpdG1hcCk7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpCTU9ial9nZXRkYXRhKEJpdE1hcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IGZyb20sIGxlbmd0aDsKLQljaGFyICpjcDsKKyAgICBpbnQgZnJvbSwgbGVuZ3RoOworICAgIGNoYXIgKmNwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlpIiwgJmZyb20sICZsZW5ndGgpICkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKLQlfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY3AsIGxlbmd0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlpIiwgJmZyb20sICZsZW5ndGgpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3AgPSBfc2VsZi0+b2JfaXRzZWxmLT5iYXNlQWRkcitmcm9tOworICAgIF9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjcCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX3B1dGRhdGEoQml0TWFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpbnQgZnJvbSwgbGVuZ3RoOwotCWNoYXIgKmNwLCAqaWNwOworICAgIGludCBmcm9tLCBsZW5ndGg7CisgICAgY2hhciAqY3AsICppY3A7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaXMjIiwgJmZyb20sICZpY3AsICZsZW5ndGgpICkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKLQltZW1jcHkoY3AsIGljcCwgbGVuZ3RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlzIyIsICZmcm9tLCAmaWNwLCAmbGVuZ3RoKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKKyAgICBtZW1jcHkoY3AsIGljcCwgbGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEJNT2JqX21ldGhvZHNbXSA9IHsKLQl7ImdldGRhdGEiLCAoUHlDRnVuY3Rpb24pQk1PYmpfZ2V0ZGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IHN0YXJ0LCBpbnQgc2l6ZSkgLT4gc3RyaW5nLiBSZXR1cm4gYnl0ZXMgZnJvbSB0aGUgYml0bWFwIil9LAotCXsicHV0ZGF0YSIsIChQeUNGdW5jdGlvbilCTU9ial9wdXRkYXRhLCAxLAotCSBQeURvY19TVFIoIihpbnQgc3RhcnQsIHN0cmluZyBkYXRhKS4gU3RvcmUgYnl0ZXMgaW50byB0aGUgYml0bWFwIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiZ2V0ZGF0YSIsIChQeUNGdW5jdGlvbilCTU9ial9nZXRkYXRhLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgc3RhcnQsIGludCBzaXplKSAtPiBzdHJpbmcuIFJldHVybiBieXRlcyBmcm9tIHRoZSBiaXRtYXAiKX0sCisgICAgeyJwdXRkYXRhIiwgKFB5Q0Z1bmN0aW9uKUJNT2JqX3B1dGRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKGludCBzdGFydCwgc3RyaW5nIGRhdGEpLiBTdG9yZSBieXRlcyBpbnRvIHRoZSBiaXRtYXAiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9iYXNlQWRkcihCaXRNYXBPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5vYl9pdHNlbGYtPmJhc2VBZGRyKTsKIH0KIAogI2RlZmluZSBCTU9ial9zZXRfYmFzZUFkZHIgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9yb3dCeXRlcyhCaXRNYXBPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPm9iX2l0c2VsZi0+cm93Qnl0ZXMpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5vYl9pdHNlbGYtPnJvd0J5dGVzKTsKIH0KIAogI2RlZmluZSBCTU9ial9zZXRfcm93Qnl0ZXMgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9ib3VuZHMoQml0TWFwT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJnNlbGYtPm9iX2l0c2VsZi0+Ym91bmRzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICZzZWxmLT5vYl9pdHNlbGYtPmJvdW5kcyk7CiB9CiAKICNkZWZpbmUgQk1PYmpfc2V0X2JvdW5kcyBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqQk1PYmpfZ2V0X2JpdG1hcF9kYXRhKEJpdE1hcE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihCaXRNYXApKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihCaXRNYXApKTsKIH0KIAogI2RlZmluZSBCTU9ial9zZXRfYml0bWFwX2RhdGEgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9waXhtYXBfZGF0YShCaXRNYXBPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoUGl4TWFwKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoUGl4TWFwKSk7CiB9CiAKICNkZWZpbmUgQk1PYmpfc2V0X3BpeG1hcF9kYXRhIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEJNT2JqX2dldHNldGxpc3RbXSA9IHsKLQl7ImJhc2VBZGRyIiwgKGdldHRlcilCTU9ial9nZXRfYmFzZUFkZHIsIChzZXR0ZXIpQk1PYmpfc2V0X2Jhc2VBZGRyLCBOVUxMfSwKLQl7InJvd0J5dGVzIiwgKGdldHRlcilCTU9ial9nZXRfcm93Qnl0ZXMsIChzZXR0ZXIpQk1PYmpfc2V0X3Jvd0J5dGVzLCBOVUxMfSwKLQl7ImJvdW5kcyIsIChnZXR0ZXIpQk1PYmpfZ2V0X2JvdW5kcywgKHNldHRlcilCTU9ial9zZXRfYm91bmRzLCBOVUxMfSwKLQl7ImJpdG1hcF9kYXRhIiwgKGdldHRlcilCTU9ial9nZXRfYml0bWFwX2RhdGEsIChzZXR0ZXIpQk1PYmpfc2V0X2JpdG1hcF9kYXRhLCBOVUxMfSwKLQl7InBpeG1hcF9kYXRhIiwgKGdldHRlcilCTU9ial9nZXRfcGl4bWFwX2RhdGEsIChzZXR0ZXIpQk1PYmpfc2V0X3BpeG1hcF9kYXRhLCBOVUxMfSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJiYXNlQWRkciIsIChnZXR0ZXIpQk1PYmpfZ2V0X2Jhc2VBZGRyLCAoc2V0dGVyKUJNT2JqX3NldF9iYXNlQWRkciwgTlVMTH0sCisgICAgeyJyb3dCeXRlcyIsIChnZXR0ZXIpQk1PYmpfZ2V0X3Jvd0J5dGVzLCAoc2V0dGVyKUJNT2JqX3NldF9yb3dCeXRlcywgTlVMTH0sCisgICAgeyJib3VuZHMiLCAoZ2V0dGVyKUJNT2JqX2dldF9ib3VuZHMsIChzZXR0ZXIpQk1PYmpfc2V0X2JvdW5kcywgTlVMTH0sCisgICAgeyJiaXRtYXBfZGF0YSIsIChnZXR0ZXIpQk1PYmpfZ2V0X2JpdG1hcF9kYXRhLCAoc2V0dGVyKUJNT2JqX3NldF9iaXRtYXBfZGF0YSwgTlVMTH0sCisgICAgeyJwaXhtYXBfZGF0YSIsIChnZXR0ZXIpQk1PYmpfZ2V0X3BpeG1hcF9kYXRhLCAoc2V0dGVyKUJNT2JqX3NldF9waXhtYXBfZGF0YSwgTlVMTH0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC0xNTQ0LDYxICsxNTQ0LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQk1PYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUJpdE1hcFB0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEJpdE1hcFB0ciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBCTU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEJpdE1hcE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBCTU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEJpdE1hcE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBCTU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBCaXRNYXBfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUWQuQml0TWFwIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQml0TWFwT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQk1PYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQk1PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEJNT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBCTU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlCTU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlCTU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlCTU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQk1PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQk1PYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlCTU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1FkLkJpdE1hcCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEJpdE1hcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEJNT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEJNT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBCTU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQk1PYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQk1PYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQk1PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQk1PYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEJNT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEJNT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQk1PYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBCaXRNYXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNjA2LDU0ODUgKzE2MDYsNTQ4NSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdyYWZQdHIgcG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR3JhZlB0ciBwb3J0OwogI2lmbmRlZiBHZXRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydCgmcG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnQoJnBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dyYWZEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgZGV2aWNlOwogI2lmbmRlZiBHcmFmRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhZkRldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhZkRldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCUdyYWZEZXZpY2UoZGV2aWNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHcmFmRGV2aWNlKGRldmljZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBvcnRCaXRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCaXRNYXBQdHIgYm07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcFB0ciBibTsKICNpZm5kZWYgU2V0UG9ydEJpdHMKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0Qml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEJpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmYm0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0Qml0cyhibSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmJtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydEJpdHMoYm0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Qb3J0U2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgd2lkdGg7Ci0Jc2hvcnQgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB3aWR0aDsKKyAgICBzaG9ydCBoZWlnaHQ7CiAjaWZuZGVmIFBvcnRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soUG9ydFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBvcnRTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUG9ydFNpemUod2lkdGgsCi0JICAgICAgICAgaGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQb3J0U2l6ZSh3aWR0aCwKKyAgICAgICAgICAgICBoZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Nb3ZlUG9ydFRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBsZWZ0R2xvYmFsOwotCXNob3J0IHRvcEdsb2JhbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbGVmdEdsb2JhbDsKKyAgICBzaG9ydCB0b3BHbG9iYWw7CiAjaWZuZGVmIE1vdmVQb3J0VG8KLQlQeU1hY19QUkVDSEVDSyhNb3ZlUG9ydFRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlUG9ydFRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlZnRHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3BHbG9iYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlNb3ZlUG9ydFRvKGxlZnRHbG9iYWwsCi0JICAgICAgICAgICB0b3BHbG9iYWwpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0R2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wR2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTW92ZVBvcnRUbyhsZWZ0R2xvYmFsLAorICAgICAgICAgICAgICAgdG9wR2xvYmFsKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0T3JpZ2luKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBoOwotCXNob3J0IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKICNpZm5kZWYgU2V0T3JpZ2luCi0JUHlNYWNfUFJFQ0hFQ0soU2V0T3JpZ2luKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRPcmlnaW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRPcmlnaW4oaCwKLQkgICAgICAgICAgdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0T3JpZ2luKGgsCisgICAgICAgICAgICAgIHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBTZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q2xpcChyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q2xpcChyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBHZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0Q2xpcChyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0Q2xpcChyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DbGlwUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIENsaXBSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soQ2xpcFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKENsaXBSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGlwUmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGlwUmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0JhY2tQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBCYWNrUGF0Ci0JUHlNYWNfUFJFQ0hFQ0soQmFja1BhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQmFja1BhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JQmFja1BhdChwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgQmFja1BhdChwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Jbml0Q3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEluaXRDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhJbml0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbml0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlJbml0Q3Vyc29yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbml0Q3Vyc29yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1NldEN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ3Vyc29yICpjcnNyX19pbl9fOwotCWludCBjcnNyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ3Vyc29yICpjcnNyX19pbl9fOworICAgIGludCBjcnNyX19pbl9sZW5fXzsKICNpZm5kZWYgTWFjU2V0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soTWFjU2V0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNTZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmY3Jzcl9faW5fXywgJmNyc3JfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNyc3JfX2luX2xlbl9fICE9IHNpemVvZihDdXJzb3IpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihDdXJzb3IpIik7Ci0JCWdvdG8gY3Jzcl9fZXJyb3JfXzsKLQl9Ci0JTWFjU2V0Q3Vyc29yKGNyc3JfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZjcnNyX19pbl9fLCAmY3Jzcl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoY3Jzcl9faW5fbGVuX18gIT0gc2l6ZW9mKEN1cnNvcikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKEN1cnNvcikiKTsKKyAgICAgICAgZ290byBjcnNyX19lcnJvcl9fOworICAgIH0KKyAgICBNYWNTZXRDdXJzb3IoY3Jzcl9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIGNyc3JfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9IaWRlQ3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEhpZGVDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhIaWRlQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlQ3Vyc29yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWRlQ3Vyc29yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1Nob3dDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgTWFjU2hvd0N1cnNvcgotCVB5TWFjX1BSRUNIRUNLKE1hY1Nob3dDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1Nob3dDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU1hY1Nob3dDdXJzb3IoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1Nob3dDdXJzb3IoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT2JzY3VyZUN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBPYnNjdXJlQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soT2JzY3VyZUN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT2JzY3VyZUN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JT2JzY3VyZUN1cnNvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgT2JzY3VyZUN1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9IaWRlUGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEhpZGVQZW4KLQlQeU1hY19QUkVDSEVDSyhIaWRlUGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlUGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlUGVuKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWRlUGVuKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Nob3dQZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd1BlbgotCVB5TWFjX1BSRUNIRUNLKFNob3dQZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dQZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dQZW4oKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dQZW4oKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CiAjaWZuZGVmIEdldFBlbgotCVB5TWFjX1BSRUNIRUNLKEdldFBlbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQZW4oJnB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UGVuKCZwdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGVuU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBlblN0YXRlIHBuU3RhdGVfX291dF9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQZW5TdGF0ZSBwblN0YXRlX19vdXRfXzsKICNpZm5kZWYgR2V0UGVuU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRQZW5TdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGVuU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBlblN0YXRlKCZwblN0YXRlX19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZwblN0YXRlX19vdXRfXywgKGludClzaXplb2YoUGVuU3RhdGUpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UGVuU3RhdGUoJnBuU3RhdGVfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnBuU3RhdGVfX291dF9fLCAoaW50KXNpemVvZihQZW5TdGF0ZSkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBlblN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQZW5TdGF0ZSAqcG5TdGF0ZV9faW5fXzsKLQlpbnQgcG5TdGF0ZV9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBlblN0YXRlICpwblN0YXRlX19pbl9fOworICAgIGludCBwblN0YXRlX19pbl9sZW5fXzsKICNpZm5kZWYgU2V0UGVuU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRQZW5TdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UGVuU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcG5TdGF0ZV9faW5fXywgJnBuU3RhdGVfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBuU3RhdGVfX2luX2xlbl9fICE9IHNpemVvZihQZW5TdGF0ZSkpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBlblN0YXRlKSIpOwotCQlnb3RvIHBuU3RhdGVfX2Vycm9yX187Ci0JfQotCVNldFBlblN0YXRlKHBuU3RhdGVfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwblN0YXRlX19pbl9fLCAmcG5TdGF0ZV9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocG5TdGF0ZV9faW5fbGVuX18gIT0gc2l6ZW9mKFBlblN0YXRlKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGVuU3RhdGUpIik7CisgICAgICAgIGdvdG8gcG5TdGF0ZV9fZXJyb3JfXzsKKyAgICB9CisgICAgU2V0UGVuU3RhdGUocG5TdGF0ZV9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBuU3RhdGVfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5TaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB3aWR0aDsKLQlzaG9ydCBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHdpZHRoOworICAgIHNob3J0IGhlaWdodDsKICNpZm5kZWYgUGVuU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFBlblNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlblNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5TaXplKHdpZHRoLAotCSAgICAgICAgaGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQZW5TaXplKHdpZHRoLAorICAgICAgICBoZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5Nb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOwogI2lmbmRlZiBQZW5Nb2RlCi0JUHlNYWNfUFJFQ0hFQ0soUGVuTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGVuTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5Nb2RlKG1vZGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQZW5Nb2RlKG1vZGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5QYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBQZW5QYXQKLQlQeU1hY19QUkVDSEVDSyhQZW5QYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlblBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JUGVuUGF0KHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBQZW5QYXQocGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGVuTm9ybWFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFBlbk5vcm1hbAotCVB5TWFjX1BSRUNIRUNLKFBlbk5vcm1hbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGVuTm9ybWFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5Ob3JtYWwoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBlbk5vcm1hbCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Nb3ZlVG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBNb3ZlVG8KLQlQeU1hY19QUkVDSEVDSyhNb3ZlVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCU1vdmVUbyhoLAotCSAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlVG8oaCwKKyAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01vdmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgTW92ZQotCVB5TWFjX1BSRUNIRUNLKE1vdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU1vdmUoZGgsCi0JICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlKGRoLAorICAgICAgICAgZHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNMaW5lVG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBNYWNMaW5lVG8KLQlQeU1hY19QUkVDSEVDSyhNYWNMaW5lVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0xpbmVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCU1hY0xpbmVUbyhoLAotCSAgICAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNMaW5lVG8oaCwKKyAgICAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xpbmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgTGluZQotCVB5TWFjX1BSRUNIRUNLKExpbmUpOworICAgIFB5TWFjX1BSRUNIRUNLKExpbmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCUxpbmUoZGgsCi0JICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMaW5lKGRoLAorICAgICAgICAgZHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Gb3JlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgY29sb3I7CiAjaWZuZGVmIEZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEZvcmVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRm9yZUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlGb3JlQ29sb3IoY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRm9yZUNvbG9yKGNvbG9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQmFja0NvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGNvbG9yOwogI2lmbmRlZiBCYWNrQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhCYWNrQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEJhY2tDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQmFja0NvbG9yKGNvbG9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEJhY2tDb2xvcihjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvbG9yQml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB3aGljaEJpdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgd2hpY2hCaXQ7CiAjaWZuZGVmIENvbG9yQml0Ci0JUHlNYWNfUFJFQ0hFQ0soQ29sb3JCaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbG9yQml0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hCaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlDb2xvckJpdCh3aGljaEJpdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hCaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb2xvckJpdCh3aGljaEJpdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1NldFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHRvcDsKLQlzaG9ydCByaWdodDsKLQlzaG9ydCBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBsZWZ0OworICAgIHNob3J0IHRvcDsKKyAgICBzaG9ydCByaWdodDsKKyAgICBzaG9ydCBib3R0b207CiAjaWZuZGVmIE1hY1NldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2V0UmVjdCgmciwKLQkgICAgICAgICAgIGxlZnQsCi0JICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICByaWdodCwKLQkgICAgICAgICAgIGJvdHRvbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1NldFJlY3QoJnIsCisgICAgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgcmlnaHQsCisgICAgICAgICAgICAgICBib3R0b20pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjT2Zmc2V0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE1hY09mZnNldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNPZmZzZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNPZmZzZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNPZmZzZXRSZWN0KCZyLAotCSAgICAgICAgICAgICAgZGgsCi0JICAgICAgICAgICAgICBkdik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjT2Zmc2V0UmVjdCgmciwKKyAgICAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgICAgZHYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjSW5zZXRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgTWFjSW5zZXRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNJbnNldFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU1hY0luc2V0UmVjdCgmciwKLQkgICAgICAgICAgICAgZGgsCi0JICAgICAgICAgICAgIGR2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNJbnNldFJlY3QoJnIsCisgICAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgICBkdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZWN0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCBzcmMxOwotCVJlY3Qgc3JjMjsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3Qgc3JjMTsKKyAgICBSZWN0IHNyYzI7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBTZWN0UmVjdAotCVB5TWFjX1BSRUNIRUNLKFNlY3RSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZWN0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU2VjdFJlY3QoJnNyYzEsCi0JICAgICAgICAgICAgICAgJnNyYzIsCi0JICAgICAgICAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU2VjdFJlY3QoJnNyYzEsCisgICAgICAgICAgICAgICAgICAgJnNyYzIsCisgICAgICAgICAgICAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNVbmlvblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3Qgc3JjMTsKLQlSZWN0IHNyYzI7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHNyYzE7CisgICAgUmVjdCBzcmMyOworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgTWFjVW5pb25SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjVW5pb25SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNVbmlvblJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMxLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMikpCi0JCXJldHVybiBOVUxMOwotCU1hY1VuaW9uUmVjdCgmc3JjMSwKLQkgICAgICAgICAgICAgJnNyYzIsCi0JICAgICAgICAgICAgICZkc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNVbmlvblJlY3QoJnNyYzEsCisgICAgICAgICAgICAgICAgICZzcmMyLAorICAgICAgICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNFcXVhbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJlY3QgcmVjdDE7Ci0JUmVjdCByZWN0MjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmVjdCByZWN0MTsKKyAgICBSZWN0IHJlY3QyOwogI2lmbmRlZiBNYWNFcXVhbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNFcXVhbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0VxdWFsUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QxLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNFcXVhbFJlY3QoJnJlY3QxLAotCSAgICAgICAgICAgICAgICAgICAmcmVjdDIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1hY0VxdWFsUmVjdCgmcmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICZyZWN0Mik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRW1wdHlSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgcjsKICNpZm5kZWYgRW1wdHlSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRW1wdHlSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbXB0eVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEVtcHR5UmVjdCgmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEVtcHR5UmVjdCgmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRnJhbWVSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgTWFjRnJhbWVSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRnJhbWVSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNGcmFtZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCU1hY0ZyYW1lUmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNGcmFtZVJlY3QoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QYWludFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBQYWludFJlY3QKLQlQeU1hY19QUkVDSEVDSyhQYWludFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhaW50UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRSZWN0KCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50UmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VyYXNlUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIEVyYXNlUmVjdAotCVB5TWFjX1BSRUNIRUNLKEVyYXNlUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXJhc2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZVJlY3QoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXJhc2VSZWN0KCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjSW52ZXJ0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIE1hY0ludmVydFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNJbnZlcnRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNJbnZlcnRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNJbnZlcnRSZWN0KCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0ludmVydFJlY3QoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNGaWxsUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIFBhdHRlcm4gKnBhdF9faW5fXzsKKyAgICBpbnQgcGF0X19pbl9sZW5fXzsKICNpZm5kZWYgTWFjRmlsbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNGaWxsUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRmlsbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKLQkJZ290byBwYXRfX2Vycm9yX187Ci0JfQotCU1hY0ZpbGxSZWN0KCZyLAotCSAgICAgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBNYWNGaWxsUmVjdCgmciwKKyAgICAgICAgICAgICAgICBwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GcmFtZU92YWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBGcmFtZU92YWwKLQlQeU1hY19QUkVDSEVDSyhGcmFtZU92YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lT3ZhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVPdmFsKCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lT3ZhbCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1BhaW50T3ZhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIFBhaW50T3ZhbAotCVB5TWFjX1BSRUNIRUNLKFBhaW50T3ZhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRPdmFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlQYWludE92YWwoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGFpbnRPdmFsKCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRXJhc2VPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgRXJhc2VPdmFsCi0JUHlNYWNfUFJFQ0hFQ0soRXJhc2VPdmFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcmFzZU92YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUVyYXNlT3ZhbCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZU92YWwoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnZlcnRPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgSW52ZXJ0T3ZhbAotCVB5TWFjX1BSRUNIRUNLKEludmVydE92YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydE92YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUludmVydE92YWwoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0T3ZhbCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUGF0dGVybiAqcGF0X19pbl9fOwotCWludCBwYXRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBGaWxsT3ZhbAotCVB5TWFjX1BSRUNIRUNLKEZpbGxPdmFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsT3ZhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JRmlsbE92YWwoJnIsCi0JICAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxPdmFsKCZyLAorICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lUm91bmRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgb3ZhbFdpZHRoOwotCXNob3J0IG92YWxIZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBvdmFsV2lkdGg7CisgICAgc2hvcnQgb3ZhbEhlaWdodDsKICNpZm5kZWYgRnJhbWVSb3VuZFJlY3QKLQlQeU1hY19QUkVDSEVDSyhGcmFtZVJvdW5kUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRnJhbWVSb3VuZFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCUZyYW1lUm91bmRSZWN0KCZyLAotCSAgICAgICAgICAgICAgIG92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICBvdmFsSGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUm91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICBvdmFsSGVpZ2h0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGFpbnRSb3VuZFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBvdmFsV2lkdGg7Ci0Jc2hvcnQgb3ZhbEhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IG92YWxXaWR0aDsKKyAgICBzaG9ydCBvdmFsSGVpZ2h0OwogI2lmbmRlZiBQYWludFJvdW5kUmVjdAotCVB5TWFjX1BSRUNIRUNLKFBhaW50Um91bmRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQYWludFJvdW5kUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRSb3VuZFJlY3QoJnIsCi0JICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgIG92YWxIZWlnaHQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGFpbnRSb3VuZFJlY3QoJnIsCisgICAgICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgIG92YWxIZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZVJvdW5kUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IG92YWxXaWR0aDsKLQlzaG9ydCBvdmFsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CiAjaWZuZGVmIEVyYXNlUm91bmRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRXJhc2VSb3VuZFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEVyYXNlUm91bmRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZVJvdW5kUmVjdCgmciwKLQkgICAgICAgICAgICAgICBvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZVJvdW5kUmVjdCgmciwKKyAgICAgICAgICAgICAgICAgICBvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFJvdW5kUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IG92YWxXaWR0aDsKLQlzaG9ydCBvdmFsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CiAjaWZuZGVmIEludmVydFJvdW5kUmVjdAotCVB5TWFjX1BSRUNIRUNLKEludmVydFJvdW5kUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0Um91bmRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRSb3VuZFJlY3QoJnIsCi0JICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnZlcnRSb3VuZFJlY3QoJnIsCisgICAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxSb3VuZFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBvdmFsV2lkdGg7Ci0Jc2hvcnQgb3ZhbEhlaWdodDsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBvdmFsV2lkdGg7CisgICAgc2hvcnQgb3ZhbEhlaWdodDsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIEZpbGxSb3VuZFJlY3QKLQlQeU1hY19QUkVDSEVDSyhGaWxsUm91bmRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsUm91bmRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlGaWxsUm91bmRSZWN0KCZyLAotCSAgICAgICAgICAgICAgb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgb3ZhbEhlaWdodCwKLQkgICAgICAgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBGaWxsUm91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lQXJjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgc3RhcnRBbmdsZTsKLQlzaG9ydCBhcmNBbmdsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IHN0YXJ0QW5nbGU7CisgICAgc2hvcnQgYXJjQW5nbGU7CiAjaWZuZGVmIEZyYW1lQXJjCi0JUHlNYWNfUFJFQ0hFQ0soRnJhbWVBcmMpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lQXJjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSkpCi0JCXJldHVybiBOVUxMOwotCUZyYW1lQXJjKCZyLAotCSAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgYXJjQW5nbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGcmFtZUFyYygmciwKKyAgICAgICAgICAgICBzdGFydEFuZ2xlLAorICAgICAgICAgICAgIGFyY0FuZ2xlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGFpbnRBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgc3RhcnRBbmdsZTsKKyAgICBzaG9ydCBhcmNBbmdsZTsKICNpZm5kZWYgUGFpbnRBcmMKLQlQeU1hY19QUkVDSEVDSyhQYWludEFyYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRBcmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRBcmMoJnIsCi0JICAgICAgICAgc3RhcnRBbmdsZSwKLQkgICAgICAgICBhcmNBbmdsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50QXJjKCZyLAorICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgYXJjQW5nbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZUFyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IHN0YXJ0QW5nbGU7Ci0Jc2hvcnQgYXJjQW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBzdGFydEFuZ2xlOworICAgIHNob3J0IGFyY0FuZ2xlOwogI2lmbmRlZiBFcmFzZUFyYwotCVB5TWFjX1BSRUNIRUNLKEVyYXNlQXJjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcmFzZUFyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZUFyYygmciwKLQkgICAgICAgICBzdGFydEFuZ2xlLAotCSAgICAgICAgIGFyY0FuZ2xlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXJhc2VBcmMoJnIsCisgICAgICAgICAgICAgc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICBhcmNBbmdsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydEFyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IHN0YXJ0QW5nbGU7Ci0Jc2hvcnQgYXJjQW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBzdGFydEFuZ2xlOworICAgIHNob3J0IGFyY0FuZ2xlOwogI2lmbmRlZiBJbnZlcnRBcmMKLQlQeU1hY19QUkVDSEVDSyhJbnZlcnRBcmMpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydEFyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRBcmMoJnIsCi0JICAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgIGFyY0FuZ2xlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0QXJjKCZyLAorICAgICAgICAgICAgICBzdGFydEFuZ2xlLAorICAgICAgICAgICAgICBhcmNBbmdsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IHN0YXJ0QW5nbGU7CisgICAgc2hvcnQgYXJjQW5nbGU7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBGaWxsQXJjCi0JUHlNYWNfUFJFQ0hFQ0soRmlsbEFyYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbEFyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhocyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlGaWxsQXJjKCZyLAotCSAgICAgICAgc3RhcnRBbmdsZSwKLQkgICAgICAgIGFyY0FuZ2xlLAotCSAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaHMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgRmlsbEFyYygmciwKKyAgICAgICAgc3RhcnRBbmdsZSwKKyAgICAgICAgYXJjQW5nbGUsCisgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX05ld1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgTmV3UmduCi0JUHlNYWNfUFJFQ0hFQ0soTmV3UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld1JnbigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3UmduKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX09wZW5SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgT3BlblJnbgotCVB5TWFjX1BSRUNIRUNLKE9wZW5SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU9wZW5SZ24oKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE9wZW5SZ24oKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ2xvc2VSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIENsb3NlUmduCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlDbG9zZVJnbihkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xvc2VSZ24oZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQml0TWFwVG9SZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKLQlCaXRNYXBQdHIgYk1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOworICAgIEJpdE1hcFB0ciBiTWFwOwogI2lmbmRlZiBCaXRNYXBUb1JlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEJpdE1hcFRvUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCaXRNYXBUb1JlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZiTWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEJpdE1hcFRvUmVnaW9uKHJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgYk1hcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmYk1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCaXRNYXBUb1JlZ2lvbihyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JnblRvSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCUhhbmRsZSBmbGF0dGVuZWRSZ25EYXRhSGRsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOworICAgIEhhbmRsZSBmbGF0dGVuZWRSZ25EYXRhSGRsOwogI2lmbmRlZiBSZ25Ub0hhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFJnblRvSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZ25Ub0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZmxhdHRlbmVkUmduRGF0YUhkbCkpCi0JCXJldHVybiBOVUxMOwotCVJnblRvSGFuZGxlKHJlZ2lvbiwKLQkgICAgICAgICAgICBmbGF0dGVuZWRSZ25EYXRhSGRsKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmZsYXR0ZW5lZFJnbkRhdGFIZGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZ25Ub0hhbmRsZShyZWdpb24sCisgICAgICAgICAgICAgICAgZmxhdHRlbmVkUmduRGF0YUhkbCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIERpc3Bvc2VSZ24KLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlUmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlUmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0NvcHlSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ247Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbjsKKyAgICBSZ25IYW5kbGUgZHN0UmduOwogI2lmbmRlZiBNYWNDb3B5UmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjQ29weVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjQ29weVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjQ29weVJnbihzcmNSZ24sCi0JICAgICAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjQ29weVJnbihzcmNSZ24sCisgICAgICAgICAgICAgICBkc3RSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRFbXB0eVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgU2V0RW1wdHlSZ24KLQlQeU1hY19QUkVDSEVDSyhTZXRFbXB0eVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RW1wdHlSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCVNldEVtcHR5UmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRFbXB0eVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNTZXRSZWN0UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOwotCXNob3J0IGxlZnQ7Ci0Jc2hvcnQgdG9wOwotCXNob3J0IHJpZ2h0OwotCXNob3J0IGJvdHRvbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBzaG9ydCBsZWZ0OworICAgIHNob3J0IHRvcDsKKyAgICBzaG9ydCByaWdodDsKKyAgICBzaG9ydCBib3R0b207CiAjaWZuZGVmIE1hY1NldFJlY3RSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2V0UmVjdFJnbihyZ24sCi0JICAgICAgICAgICAgICBsZWZ0LAotCSAgICAgICAgICAgICAgdG9wLAotCSAgICAgICAgICAgICAgcmlnaHQsCi0JICAgICAgICAgICAgICBib3R0b20pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1NldFJlY3RSZ24ocmduLAorICAgICAgICAgICAgICAgICAgbGVmdCwKKyAgICAgICAgICAgICAgICAgIHRvcCwKKyAgICAgICAgICAgICAgICAgIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgYm90dG9tKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmVjdFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgUmVjdCByOwogI2lmbmRlZiBSZWN0UmduCi0JUHlNYWNfUFJFQ0hFQ0soUmVjdFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVjdFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVjdFJnbihyZ24sCi0JICAgICAgICAmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZWN0UmduKHJnbiwKKyAgICAgICAgJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNPZmZzZXRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE1hY09mZnNldFJnbgotCVB5TWFjX1BSRUNIRUNLKE1hY09mZnNldFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjT2Zmc2V0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNPZmZzZXRSZ24ocmduLAotCSAgICAgICAgICAgICBkaCwKLQkgICAgICAgICAgICAgZHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjT2Zmc2V0UmduKHJnbiwKKyAgICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICAgIGR2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW5zZXRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIEluc2V0UmduCi0JUHlNYWNfUFJFQ0hFQ0soSW5zZXRSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2V0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnNldFJnbihyZ24sCi0JICAgICAgICAgZGgsCi0JICAgICAgICAgZHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5zZXRSZ24ocmduLAorICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgIGR2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2VjdFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbkE7Ci0JUmduSGFuZGxlIHNyY1JnbkI7Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbkE7CisgICAgUmduSGFuZGxlIHNyY1JnbkI7CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgU2VjdFJnbgotCVB5TWFjX1BSRUNIRUNLKFNlY3RSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNlY3RSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VjdFJnbihzcmNSZ25BLAotCSAgICAgICAgc3JjUmduQiwKLQkgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNlY3RSZ24oc3JjUmduQSwKKyAgICAgICAgc3JjUmduQiwKKyAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjVW5pb25SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ25BOwotCVJnbkhhbmRsZSBzcmNSZ25COwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBzcmNSZ25BOworICAgIFJnbkhhbmRsZSBzcmNSZ25COworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIE1hY1VuaW9uUmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjVW5pb25SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1VuaW9uUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCi0JCXJldHVybiBOVUxMOwotCU1hY1VuaW9uUmduKHNyY1JnbkEsCi0JICAgICAgICAgICAgc3JjUmduQiwKLQkgICAgICAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNVbmlvblJnbihzcmNSZ25BLAorICAgICAgICAgICAgICAgIHNyY1JnbkIsCisgICAgICAgICAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGlmZlJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbkE7Ci0JUmduSGFuZGxlIHNyY1JnbkI7Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbkE7CisgICAgUmduSGFuZGxlIHNyY1JnbkI7CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgRGlmZlJnbgotCVB5TWFjX1BSRUNIRUNLKERpZmZSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKERpZmZSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlmZlJnbihzcmNSZ25BLAotCSAgICAgICAgc3JjUmduQiwKLQkgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpZmZSZ24oc3JjUmduQSwKKyAgICAgICAgc3JjUmduQiwKKyAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjWG9yUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgc3JjUmduQTsKLQlSZ25IYW5kbGUgc3JjUmduQjsKLQlSZ25IYW5kbGUgZHN0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgc3JjUmduQTsKKyAgICBSZ25IYW5kbGUgc3JjUmduQjsKKyAgICBSZ25IYW5kbGUgZHN0UmduOwogI2lmbmRlZiBNYWNYb3JSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNYb3JSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1hvclJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNYb3JSZ24oc3JjUmduQSwKLQkgICAgICAgICAgc3JjUmduQiwKLQkgICAgICAgICAgZHN0UmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjWG9yUmduKHNyY1JnbkEsCisgICAgICAgICAgICAgIHNyY1JnbkIsCisgICAgICAgICAgICAgIGRzdFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JlY3RJblJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCByOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgcjsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBSZWN0SW5SZ24KLQlQeU1hY19QUkVDSEVDSyhSZWN0SW5SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFJlY3RJblJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVjdEluUmduKCZyLAotCSAgICAgICAgICAgICAgICByZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWN0SW5SZ24oJnIsCisgICAgICAgICAgICAgICAgICAgIHJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRXF1YWxSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJnbkhhbmRsZSByZ25BOwotCVJnbkhhbmRsZSByZ25COworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZ25IYW5kbGUgcmduQTsKKyAgICBSZ25IYW5kbGUgcmduQjsKICNpZm5kZWYgTWFjRXF1YWxSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNFcXVhbFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRXF1YWxSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25CKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjRXF1YWxSZ24ocmduQSwKLQkgICAgICAgICAgICAgICAgICByZ25CKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbkIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNFcXVhbFJnbihyZ25BLAorICAgICAgICAgICAgICAgICAgICAgIHJnbkIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VtcHR5UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBFbXB0eVJnbgotCVB5TWFjX1BSRUNIRUNLKEVtcHR5UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbXB0eVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRW1wdHlSZ24ocmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRW1wdHlSZ24ocmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNGcmFtZVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgTWFjRnJhbWVSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNGcmFtZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRnJhbWVSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCU1hY0ZyYW1lUmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNGcmFtZVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNQYWludFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgTWFjUGFpbnRSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNQYWludFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjUGFpbnRSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCU1hY1BhaW50UmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNQYWludFJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgRXJhc2VSZ24KLQlQeU1hY19QUkVDSEVDSyhFcmFzZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXJhc2VSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCUVyYXNlUmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNJbnZlcnRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIE1hY0ludmVydFJnbgotCVB5TWFjX1BSRUNIRUNLKE1hY0ludmVydFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW52ZXJ0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNJbnZlcnRSZ24ocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0ludmVydFJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNGaWxsUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIE1hY0ZpbGxSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNGaWxsUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNGaWxsUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlNYWNGaWxsUmduKHJnbiwKLQkgICAgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBNYWNGaWxsUmduKHJnbiwKKyAgICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Njcm9sbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKLQlSZ25IYW5kbGUgdXBkYXRlUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CisgICAgUmduSGFuZGxlIHVwZGF0ZVJnbjsKICNpZm5kZWYgU2Nyb2xsUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNjcm9sbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNjcm9sbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCi0JCXJldHVybiBOVUxMOwotCVNjcm9sbFJlY3QoJnIsCi0JICAgICAgICAgICBkaCwKLQkgICAgICAgICAgIGR2LAotCSAgICAgICAgICAgdXBkYXRlUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNjcm9sbFJlY3QoJnIsCisgICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgIGR2LAorICAgICAgICAgICAgICAgdXBkYXRlUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weUJpdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCUJpdE1hcFB0ciBkc3RCaXRzOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7Ci0Jc2hvcnQgbW9kZTsKLQlSZ25IYW5kbGUgbWFza1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQml0TWFwUHRyIHNyY0JpdHM7CisgICAgQml0TWFwUHRyIGRzdEJpdHM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrUmduOwogI2lmbmRlZiBDb3B5Qml0cwotCVB5TWFjX1BSRUNIRUNLKENvcHlCaXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5Qml0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZzcmNCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29weUJpdHMoc3JjQml0cywKLQkgICAgICAgICBkc3RCaXRzLAotCSAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICZkc3RSZWN0LAotCSAgICAgICAgIG1vZGUsCi0JICAgICAgICAgbWFza1Jnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZkc3RCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1hc2tSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5Qml0cyhzcmNCaXRzLAorICAgICAgICAgICAgIGRzdEJpdHMsCisgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgJmRzdFJlY3QsCisgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICBtYXNrUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weU1hc2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCUJpdE1hcFB0ciBtYXNrQml0czsKLQlCaXRNYXBQdHIgZHN0Qml0czsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBtYXNrUmVjdDsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcFB0ciBzcmNCaXRzOworICAgIEJpdE1hcFB0ciBtYXNrQml0czsKKyAgICBCaXRNYXBQdHIgZHN0Qml0czsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBtYXNrUmVjdDsKKyAgICBSZWN0IGRzdFJlY3Q7CiAjaWZuZGVmIENvcHlNYXNrCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1hc2spOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlNYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZzcmNCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmbWFza0JpdHMsCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZkc3RCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJm1hc2tSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNvcHlNYXNrKHNyY0JpdHMsCi0JICAgICAgICAgbWFza0JpdHMsCi0JICAgICAgICAgZHN0Qml0cywKLQkgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAmbWFza1JlY3QsCi0JICAgICAgICAgJmRzdFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJm1hc2tCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZtYXNrUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5TWFzayhzcmNCaXRzLAorICAgICAgICAgICAgIG1hc2tCaXRzLAorICAgICAgICAgICAgIGRzdEJpdHMsCisgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgJm1hc2tSZWN0LAorICAgICAgICAgICAgICZkc3RSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT3BlblBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBfcnY7Ci0JUmVjdCBwaWNGcmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKKyAgICBSZWN0IHBpY0ZyYW1lOwogI2lmbmRlZiBPcGVuUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKE9wZW5QaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPcGVuUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZwaWNGcmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9wZW5QaWN0dXJlKCZwaWNGcmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnBpY0ZyYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT3BlblBpY3R1cmUoJnBpY0ZyYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGljQ29tbWVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQga2luZDsKLQlzaG9ydCBkYXRhU2l6ZTsKLQlIYW5kbGUgZGF0YUhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQga2luZDsKKyAgICBzaG9ydCBkYXRhU2l6ZTsKKyAgICBIYW5kbGUgZGF0YUhhbmRsZTsKICNpZm5kZWYgUGljQ29tbWVudAotCVB5TWFjX1BSRUNIRUNLKFBpY0NvbW1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBpY0NvbW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZraW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCVBpY0NvbW1lbnQoa2luZCwKLQkgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgZGF0YUhhbmRsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFIYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQaWNDb21tZW50KGtpbmQsCisgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgIGRhdGFIYW5kbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DbG9zZVBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2xvc2VQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZVBpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNsb3NlUGljdHVyZSgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xvc2VQaWN0dXJlKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0RyYXdQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaWNIYW5kbGUgbXlQaWN0dXJlOwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIG15UGljdHVyZTsKKyAgICBSZWN0IGRzdFJlY3Q7CiAjaWZuZGVmIERyYXdQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1BpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm15UGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmF3UGljdHVyZShteVBpY3R1cmUsCi0JICAgICAgICAgICAgJmRzdFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZteVBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhd1BpY3R1cmUobXlQaWN0dXJlLAorICAgICAgICAgICAgICAgICZkc3RSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfS2lsbFBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBteVBpY3R1cmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBteVBpY3R1cmU7CiAjaWZuZGVmIEtpbGxQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soS2lsbFBpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEtpbGxQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZteVBpY3R1cmUpKQotCQlyZXR1cm4gTlVMTDsKLQlLaWxsUGljdHVyZShteVBpY3R1cmUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbXlQaWN0dXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgS2lsbFBpY3R1cmUobXlQaWN0dXJlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT3BlblBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIF9ydjsKICNpZm5kZWYgT3BlblBvbHkKLQlQeU1hY19QUkVDSEVDSyhPcGVuUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlblBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9wZW5Qb2x5KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBPcGVuUG9seSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DbG9zZVBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2xvc2VQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZVBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNsb3NlUG9seSgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xvc2VQb2x5KCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0tpbGxQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKICNpZm5kZWYgS2lsbFBvbHkKLQlQeU1hY19QUkVDSEVDSyhLaWxsUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soS2lsbFBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQotCQlyZXR1cm4gTlVMTDsKLQlLaWxsUG9seShwb2x5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBLaWxsUG9seShwb2x5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT2Zmc2V0UG9seShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9seUhhbmRsZSBwb2x5OwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE9mZnNldFBvbHkKLQlQeU1hY19QUkVDSEVDSyhPZmZzZXRQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhPZmZzZXRQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JT2Zmc2V0UG9seShwb2x5LAotCSAgICAgICAgICAgZGgsCi0JICAgICAgICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgT2Zmc2V0UG9seShwb2x5LAorICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICBkdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lUG9seShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9seUhhbmRsZSBwb2x5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CiAjaWZuZGVmIEZyYW1lUG9seQotCVB5TWFjX1BSRUNIRUNLKEZyYW1lUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRnJhbWVQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVQb2x5KHBvbHkpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUG9seShwb2x5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGFpbnRQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKICNpZm5kZWYgUGFpbnRQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soUGFpbnRQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQYWludFBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQotCQlyZXR1cm4gTlVMTDsKLQlQYWludFBvbHkocG9seSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGFpbnRQb2x5KHBvbHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZVBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9seUhhbmRsZSBwb2x5OwogI2lmbmRlZiBFcmFzZVBvbHkKLQlQeU1hY19QUkVDSEVDSyhFcmFzZVBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEVyYXNlUG9seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCi0JCXJldHVybiBOVUxMOwotCUVyYXNlUG9seShwb2x5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZVBvbHkocG9seSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9seUhhbmRsZSBwb2x5OwogI2lmbmRlZiBJbnZlcnRQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UG9seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCi0JCXJldHVybiBOVUxMOwotCUludmVydFBvbHkocG9seSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0UG9seShwb2x5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbFBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIEZpbGxQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soRmlsbFBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JRmlsbFBvbHkocG9seSwKLQkgICAgICAgICBwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxQb2x5KHBvbHksCisgICAgICAgICAgICAgcGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0UHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0OwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBTZXRQdAotCVB5TWFjX1BSRUNIRUNLKFNldFB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCVNldFB0KCZwdCwKLQkgICAgICBoLAotCSAgICAgIHYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UHQoJnB0LAorICAgICAgICAgIGgsCisgICAgICAgICAgdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTG9jYWxUb0dsb2JhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHB0OwogI2lmbmRlZiBMb2NhbFRvR2xvYmFsCi0JUHlNYWNfUFJFQ0hFQ0soTG9jYWxUb0dsb2JhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTG9jYWxUb0dsb2JhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQpKQotCQlyZXR1cm4gTlVMTDsKLQlMb2NhbFRvR2xvYmFsKCZwdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTG9jYWxUb0dsb2JhbCgmcHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dsb2JhbFRvTG9jYWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDsKICNpZm5kZWYgR2xvYmFsVG9Mb2NhbAotCVB5TWFjX1BSRUNIRUNLKEdsb2JhbFRvTG9jYWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdsb2JhbFRvTG9jYWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2xvYmFsVG9Mb2NhbCgmcHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdsb2JhbFRvTG9jYWwoJnB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9SYW5kb20oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBSYW5kb20KLQlQeU1hY19QUkVDSEVDSyhSYW5kb20pOworICAgIFB5TWFjX1BSRUNIRUNLKFJhbmRvbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmFuZG9tKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJhbmRvbSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0dldFBpeGVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlzaG9ydCBoOwotCXNob3J0IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKICNpZm5kZWYgTWFjR2V0UGl4ZWwKLQlQeU1hY19QUkVDSEVDSyhNYWNHZXRQaXhlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjR2V0UGl4ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNHZXRQaXhlbChoLAotCSAgICAgICAgICAgICAgICAgIHYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjR2V0UGl4ZWwoaCwKKyAgICAgICAgICAgICAgICAgICAgICB2KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TY2FsZVB0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBTY2FsZVB0Ci0JUHlNYWNfUFJFQ0hFQ0soU2NhbGVQdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NhbGVQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlTY2FsZVB0KCZwdCwKLQkgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNjYWxlUHQoJnB0LAorICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hcFB0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBNYXBQdAotCVB5TWFjX1BSRUNIRUNLKE1hcFB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYXBQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlNYXBQdCgmcHQsCi0JICAgICAgJnNyY1JlY3QsCi0JICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hcFB0KCZwdCwKKyAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFwUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBNYXBSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFwUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFwUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFwUmVjdCgmciwKLQkgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hcFJlY3QoJnIsCisgICAgICAgICZzcmNSZWN0LAorICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYXBSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBNYXBSZ24KLQlQeU1hY19QUkVDSEVDSyhNYXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFwUmduKHJnbiwKLQkgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICZkc3RSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hcFJnbihyZ24sCisgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hcFBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgTWFwUG9seQotCVB5TWFjX1BSRUNIRUNLKE1hcFBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hcFBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlNYXBQb2x5KHBvbHksCi0JICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICZkc3RSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYXBQb2x5KHBvbHksCisgICAgICAgICZzcmNSZWN0LAorICAgICAgICAmZHN0UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1N0ZEJpdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7Ci0Jc2hvcnQgbW9kZTsKLQlSZ25IYW5kbGUgbWFza1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQml0TWFwUHRyIHNyY0JpdHM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrUmduOwogI2lmbmRlZiBTdGRCaXRzCi0JUHlNYWNfUFJFQ0hFQ0soU3RkQml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RkQml0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3RkQml0cyhzcmNCaXRzLAotCSAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAmZHN0UmVjdCwKLQkgICAgICAgIG1vZGUsCi0JICAgICAgICBtYXNrUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmbWFza1JnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN0ZEJpdHMoc3JjQml0cywKKyAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICZkc3RSZWN0LAorICAgICAgICBtb2RlLAorICAgICAgICBtYXNrUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQWRkUHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHNyYzsKLQlQb2ludCBkc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHNyYzsKKyAgICBQb2ludCBkc3Q7CiAjaWZuZGVmIEFkZFB0Ci0JUHlNYWNfUFJFQ0hFQ0soQWRkUHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlBZGRQdChzcmMsCi0JICAgICAgJmRzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBZGRQdChzcmMsCisgICAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VxdWFsUHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0MTsKLQlQb2ludCBwdDI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHB0MTsKKyAgICBQb2ludCBwdDI7CiAjaWZuZGVmIEVxdWFsUHQKLQlQeU1hY19QUkVDSEVDSyhFcXVhbFB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcXVhbFB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0MSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBFcXVhbFB0KHB0MSwKLQkgICAgICAgICAgICAgIHB0Mik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEVxdWFsUHQocHQxLAorICAgICAgICAgICAgICAgICAgcHQyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNQdEluUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgcHQ7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCBwdDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIE1hY1B0SW5SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjUHRJblJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1B0SW5SZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1hY1B0SW5SZWN0KHB0LAotCSAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNQdEluUmVjdChwdCwKKyAgICAgICAgICAgICAgICAgICAgICAmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHQyUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcHQxOwotCVBvaW50IHB0MjsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHB0MTsKKyAgICBQb2ludCBwdDI7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBQdDJSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soUHQyUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHQyUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHQyUmVjdChwdDEsCi0JICAgICAgICBwdDIsCi0JICAgICAgICAmZHN0UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHQyUmVjdChwdDEsCisgICAgICAgIHB0MiwKKyAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZHN0UmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHRUb0FuZ2xlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUG9pbnQgcHQ7Ci0Jc2hvcnQgYW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBQb2ludCBwdDsKKyAgICBzaG9ydCBhbmdsZTsKICNpZm5kZWYgUHRUb0FuZ2xlCi0JUHlNYWNfUFJFQ0hFQ0soUHRUb0FuZ2xlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdFRvQW5nbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHRUb0FuZ2xlKCZyLAotCSAgICAgICAgICBwdCwKLQkgICAgICAgICAgJmFuZ2xlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgYW5nbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB0VG9BbmdsZSgmciwKKyAgICAgICAgICAgICAgcHQsCisgICAgICAgICAgICAgICZhbmdsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TdWJQdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgc3JjOwotCVBvaW50IGRzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgc3JjOworICAgIFBvaW50IGRzdDsKICNpZm5kZWYgU3ViUHQKLQlQeU1hY19QUkVDSEVDSyhTdWJQdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ViUHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRzdCkpCi0JCXJldHVybiBOVUxMOwotCVN1YlB0KHNyYywKLQkgICAgICAmZHN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN1YlB0KHNyYywKKyAgICAgICAgICAmZHN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGRzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHRJblJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgcHQ7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgUHRJblJnbgotCVB5TWFjX1BSRUNIRUNLKFB0SW5SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJblJnbihwdCwKLQkgICAgICAgICAgICAgIHJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJblJnbihwdCwKKyAgICAgICAgICAgICAgICAgIHJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTmV3UGl4TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgX3J2OwogI2lmbmRlZiBOZXdQaXhNYXAKLQlQeU1hY19QUkVDSEVDSyhOZXdQaXhNYXApOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1BpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3UGl4TWFwKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdQaXhNYXAoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGlzcG9zZVBpeE1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIERpc3Bvc2VQaXhNYXAKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlUGl4TWFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VQaXhNYXAocG0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlUGl4TWFwKHBtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weVBpeE1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHNyY1BNOwotCVBpeE1hcEhhbmRsZSBkc3RQTTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHNyY1BNOworICAgIFBpeE1hcEhhbmRsZSBkc3RQTTsKICNpZm5kZWYgQ29weVBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKENvcHlQaXhNYXApOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlQaXhNYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUE0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UE0pKQotCQlyZXR1cm4gTlVMTDsKLQlDb3B5UGl4TWFwKHNyY1BNLAotCSAgICAgICAgICAgZHN0UE0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RQTSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvcHlQaXhNYXAoc3JjUE0sCisgICAgICAgICAgICAgICBkc3RQTSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX05ld1BpeFBhdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIF9ydjsKICNpZm5kZWYgTmV3UGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soTmV3UGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld1BpeFBhdCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3UGl4UGF0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VQaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBEaXNwb3NlUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlUGl4UGF0KHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZVBpeFBhdChwcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvcHlQaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBzcmNQUDsKLQlQaXhQYXRIYW5kbGUgZHN0UFA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBzcmNQUDsKKyAgICBQaXhQYXRIYW5kbGUgZHN0UFA7CiAjaWZuZGVmIENvcHlQaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhDb3B5UGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5UGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BQLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBQKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29weVBpeFBhdChzcmNQUCwKLQkgICAgICAgICAgIGRzdFBQKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UFApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5UGl4UGF0KHNyY1BQLAorICAgICAgICAgICAgICAgZHN0UFApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5QaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBQZW5QaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhQZW5QaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlblBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5QaXhQYXQocHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQZW5QaXhQYXQocHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9CYWNrUGl4UGF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcDsKICNpZm5kZWYgQmFja1BpeFBhdAotCVB5TWFjX1BSRUNIRUNLKEJhY2tQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEJhY2tQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQmFja1BpeFBhdChwcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEJhY2tQaXhQYXQocHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBfcnY7Ci0Jc2hvcnQgcGF0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBfcnY7CisgICAgc2hvcnQgcGF0SUQ7CiAjaWZuZGVmIEdldFBpeFBhdAotCVB5TWFjX1BSRUNIRUNLKEdldFBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQaXhQYXQocGF0SUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGl4UGF0KHBhdElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFrZVJHQlBhdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIHBwOwotCVJHQkNvbG9yIG15Q29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcDsKKyAgICBSR0JDb2xvciBteUNvbG9yOwogI2lmbmRlZiBNYWtlUkdCUGF0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFrZVJHQlBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFrZVJHQlBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm15Q29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWtlUkdCUGF0KHBwLAotCSAgICAgICAgICAgJm15Q29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm15Q29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWtlUkdCUGF0KHBwLAorICAgICAgICAgICAgICAgJm15Q29sb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQ1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBQaXhQYXRIYW5kbGUgcHA7CiAjaWZuZGVmIEZpbGxDUmVjdAotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbENSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCi0JCXJldHVybiBOVUxMOwotCUZpbGxDUmVjdCgmciwKLQkgICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGaWxsQ1JlY3QoJnIsCisgICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbENPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUGl4UGF0SGFuZGxlIHBwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ092YWwKLQlQeU1hY19QUkVDSEVDSyhGaWxsQ092YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxDT3ZhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ092YWwoJnIsCi0JICAgICAgICAgIHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmlsbENPdmFsKCZyLAorICAgICAgICAgICAgICBwcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxDUm91bmRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgb3ZhbFdpZHRoOwotCXNob3J0IG92YWxIZWlnaHQ7Ci0JUGl4UGF0SGFuZGxlIHBwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ1JvdW5kUmVjdAotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUm91bmRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsQ1JvdW5kUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ1JvdW5kUmVjdCgmciwKLQkgICAgICAgICAgICAgICBvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgb3ZhbEhlaWdodCwKLQkgICAgICAgICAgICAgICBwcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZpbGxDUm91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICBvdmFsSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbENBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IHN0YXJ0QW5nbGU7CisgICAgc2hvcnQgYXJjQW5nbGU7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ0FyYwotCVB5TWFjX1BSRUNIRUNLKEZpbGxDQXJjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsQ0FyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCi0JCXJldHVybiBOVUxMOwotCUZpbGxDQXJjKCZyLAotCSAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgYXJjQW5nbGUsCi0JICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZpbGxDQXJjKCZyLAorICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgYXJjQW5nbGUsCisgICAgICAgICAgICAgcHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQ1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ1JnbgotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsQ1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ1JnbihyZ24sCi0JICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGaWxsQ1JnbihyZ24sCisgICAgICAgICAgICAgcHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQ1BvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKKyAgICBQaXhQYXRIYW5kbGUgcHA7CiAjaWZuZGVmIEZpbGxDUG9seQotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbENQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ1BvbHkocG9seSwKLQkgICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmlsbENQb2x5KHBvbHksCisgICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUkdCRm9yZUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIFJHQkZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFJHQkZvcmVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUkdCRm9yZUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUkdCRm9yZUNvbG9yKCZjb2xvcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUkdCRm9yZUNvbG9yKCZjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JHQkJhY2tDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGNvbG9yOwogI2lmbmRlZiBSR0JCYWNrQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhSR0JCYWNrQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFJHQkJhY2tDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCi0JCXJldHVybiBOVUxMOwotCVJHQkJhY2tDb2xvcigmY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJHQkJhY2tDb2xvcigmY29sb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDUGl4ZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKLQlSR0JDb2xvciBjUGl4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoOworICAgIHNob3J0IHY7CisgICAgUkdCQ29sb3IgY1BpeDsKICNpZm5kZWYgU2V0Q1BpeGVsCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q1BpeGVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDUGl4ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNQaXgpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDUGl4ZWwoaCwKLQkgICAgICAgICAgdiwKLQkgICAgICAgICAgJmNQaXgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY1BpeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENQaXhlbChoLAorICAgICAgICAgICAgICB2LAorICAgICAgICAgICAgICAmY1BpeCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBvcnRQaXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBTZXRQb3J0UGl4Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBpeCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBpeCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0UGl4KHBtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFBpeChwbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldENQaXhlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaDsKLQlzaG9ydCB2OwotCVJHQkNvbG9yIGNQaXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKKyAgICBSR0JDb2xvciBjUGl4OwogI2lmbmRlZiBHZXRDUGl4ZWwKLQlQeU1hY19QUkVDSEVDSyhHZXRDUGl4ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENQaXhlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCUdldENQaXhlbChoLAotCSAgICAgICAgICB2LAotCSAgICAgICAgICAmY1BpeCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjUGl4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldENQaXhlbChoLAorICAgICAgICAgICAgICB2LAorICAgICAgICAgICAgICAmY1BpeCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjUGl4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRGb3JlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgR2V0Rm9yZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Rm9yZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGb3JlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldEZvcmVDb2xvcigmY29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRGb3JlQ29sb3IoJmNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRCYWNrQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgR2V0QmFja0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0QmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRCYWNrQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldEJhY2tDb2xvcigmY29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRCYWNrQ29sb3IoJmNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9PcENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIE9wQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhPcENvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPcENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JT3BDb2xvcigmY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE9wQ29sb3IoJmNvbG9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSGlsaXRlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgSGlsaXRlQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlsaXRlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWxpdGVDb2xvcigmY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpbGl0ZUNvbG9yKCZjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VDVGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNUYWJIYW5kbGUgY1RhYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDVGFiSGFuZGxlIGNUYWJsZTsKICNpZm5kZWYgRGlzcG9zZUNUYWJsZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VDVGFibGUoY1RhYmxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VDVGFibGUoY1RhYmxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Q1RhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDVGFiSGFuZGxlIF9ydjsKLQlzaG9ydCBjdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDVGFiSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBjdElEOwogI2lmbmRlZiBHZXRDVGFibGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENUYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmN0SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDVGFibGUoY3RJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3RJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENUYWJsZShjdElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Q0N1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0Nyc3JIYW5kbGUgX3J2OwotCXNob3J0IGNyc3JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0Nyc3JIYW5kbGUgX3J2OworICAgIHNob3J0IGNyc3JJRDsKICNpZm5kZWYgR2V0Q0N1cnNvcgotCVB5TWFjX1BSRUNIRUNLKEdldENDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcnNySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDQ3Vyc29yKGNyc3JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JzcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q0N1cnNvcihjcnNySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDQ3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDQ3JzckhhbmRsZSBjQ3JzcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0Nyc3JIYW5kbGUgY0Nyc3I7CiAjaWZuZGVmIFNldENDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRDQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjQ3JzcikpCi0JCXJldHVybiBOVUxMOwotCVNldENDdXJzb3IoY0Nyc3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY0Nyc3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDQ3Vyc29yKGNDcnNyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQWxsb2NDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQWxsb2NDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhBbGxvY0N1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWxsb2NDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUFsbG9jQ3Vyc29yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBbGxvY0N1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EaXNwb3NlQ0N1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0Nyc3JIYW5kbGUgY0Nyc3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENDcnNySGFuZGxlIGNDcnNyOwogI2lmbmRlZiBEaXNwb3NlQ0N1cnNvcgotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlQ0N1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY0Nyc3IpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlQ0N1cnNvcihjQ3Jzcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjQ3JzcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VDQ3Vyc29yKGNDcnNyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0TWF4RGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7Ci0JUmVjdCBnbG9iYWxSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBfcnY7CisgICAgUmVjdCBnbG9iYWxSZWN0OwogI2lmbmRlZiBHZXRNYXhEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRNYXhEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1heERldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWF4RGV2aWNlKCZnbG9iYWxSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1heERldmljZSgmZ2xvYmFsUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldENUU2VlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRDVFNlZWQKLQlQeU1hY19QUkVDSEVDSyhHZXRDVFNlZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENUU2VlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q1RTZWVkKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENUU2VlZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldERldmljZUxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXREZXZpY2VMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGV2aWNlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGV2aWNlTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGV2aWNlTGlzdCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGV2aWNlTGlzdCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRNYWluRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TWFpbkRldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldE1haW5EZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1haW5EZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1haW5EZXZpY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1haW5EZXZpY2UoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0TmV4dERldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OwotCUdESGFuZGxlIGN1ckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OworICAgIEdESGFuZGxlIGN1ckRldmljZTsKICNpZm5kZWYgR2V0TmV4dERldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldE5leHREZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHREZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN1ckRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHREZXZpY2UoY3VyRGV2aWNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN1ckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHREZXZpY2UoY3VyRGV2aWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfVGVzdERldmljZUF0dHJpYnV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JR0RIYW5kbGUgZ2RoOwotCXNob3J0IGF0dHJpYnV0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIHNob3J0IGF0dHJpYnV0ZTsKICNpZm5kZWYgVGVzdERldmljZUF0dHJpYnV0ZQotCVB5TWFjX1BSRUNIRUNLKFRlc3REZXZpY2VBdHRyaWJ1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRlc3REZXZpY2VBdHRyaWJ1dGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXN0RGV2aWNlQXR0cmlidXRlKGdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXN0RGV2aWNlQXR0cmlidXRlKGdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0RGV2aWNlQXR0cmlidXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBnZGg7Ci0Jc2hvcnQgYXR0cmlidXRlOwotCUJvb2xlYW4gdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIGdkaDsKKyAgICBzaG9ydCBhdHRyaWJ1dGU7CisgICAgQm9vbGVhbiB2YWx1ZTsKICNpZm5kZWYgU2V0RGV2aWNlQXR0cmlidXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGV2aWNlQXR0cmlidXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREZXZpY2VBdHRyaWJ1dGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXREZXZpY2VBdHRyaWJ1dGUoZ2RoLAotCSAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsCi0JICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXREZXZpY2VBdHRyaWJ1dGUoZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW5pdEdEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHFkUmVmTnVtOwotCWxvbmcgbW9kZTsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHFkUmVmTnVtOworICAgIGxvbmcgbW9kZTsKKyAgICBHREhhbmRsZSBnZGg7CiAjaWZuZGVmIEluaXRHRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soSW5pdEdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEluaXRHRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcWRSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkaCkpCi0JCXJldHVybiBOVUxMOwotCUluaXRHRGV2aWNlKHFkUmVmTnVtLAotCSAgICAgICAgICAgIG1vZGUsCi0JICAgICAgICAgICAgZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxZFJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5pdEdEZXZpY2UocWRSZWZOdW0sCisgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICBnZGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9OZXdHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7Ci0Jc2hvcnQgcmVmTnVtOwotCWxvbmcgbW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIG1vZGU7CiAjaWZuZGVmIE5ld0dEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhOZXdHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdHRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdHRGV2aWNlKHJlZk51bSwKLQkgICAgICAgICAgICAgICAgIG1vZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3R0RldmljZShyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGlzcG9zZUdEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIGdkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBEaXNwb3NlR0RldmljZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlR0RldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzcG9zZUdEZXZpY2UoZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VHRGV2aWNlKGdkaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldEdEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBnZDsKICNpZm5kZWYgU2V0R0RldmljZQotCVB5TWFjX1BSRUNIRUNLKFNldEdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0R0RldmljZShnZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEdEZXZpY2UoZ2QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0R0RldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldEdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEdEZXZpY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEdEZXZpY2UoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29sb3IySW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVJHQkNvbG9yIG15Q29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFJHQkNvbG9yIG15Q29sb3I7CiAjaWZuZGVmIENvbG9yMkluZGV4Ci0JUHlNYWNfUFJFQ0hFQ0soQ29sb3IySW5kZXgpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbG9yMkluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm15Q29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb2xvcjJJbmRleCgmbXlDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmbXlDb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvbG9yMkluZGV4KCZteUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbmRleDJDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBpbmRleDsKLQlSR0JDb2xvciBhQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgaW5kZXg7CisgICAgUkdCQ29sb3IgYUNvbG9yOwogI2lmbmRlZiBJbmRleDJDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEluZGV4MkNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbmRleDJDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5kZXgyQ29sb3IoaW5kZXgsCi0JICAgICAgICAgICAgJmFDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZhQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbmRleDJDb2xvcihpbmRleCwKKyAgICAgICAgICAgICAgICAmYUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmFDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW52ZXJ0Q29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIG15Q29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIG15Q29sb3I7CiAjaWZuZGVmIEludmVydENvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRDb2xvcigmbXlDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZteUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0Q29sb3IoJm15Q29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbXlDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmVhbENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIFJlYWxDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFJlYWxDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVhbENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVhbENvbG9yKCZjb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWFsQ29sb3IoJmNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRTdWJUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ1RhYkhhbmRsZSBteUNvbG9yczsKLQlzaG9ydCBpVGFiUmVzOwotCUNUYWJIYW5kbGUgdGFyZ2V0VGJsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDVGFiSGFuZGxlIG15Q29sb3JzOworICAgIHNob3J0IGlUYWJSZXM7CisgICAgQ1RhYkhhbmRsZSB0YXJnZXRUYmw7CiAjaWZuZGVmIEdldFN1YlRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0U3ViVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFN1YlRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZteUNvbG9ycywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlUYWJSZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGFyZ2V0VGJsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0U3ViVGFibGUobXlDb2xvcnMsCi0JICAgICAgICAgICAgaVRhYlJlcywKLQkgICAgICAgICAgICB0YXJnZXRUYmwpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbXlDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVGFiUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRhcmdldFRibCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFN1YlRhYmxlKG15Q29sb3JzLAorICAgICAgICAgICAgICAgIGlUYWJSZXMsCisgICAgICAgICAgICAgICAgdGFyZ2V0VGJsKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFrZUlUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ1RhYkhhbmRsZSBjVGFiSDsKLQlJVGFiSGFuZGxlIGlUYWJIOwotCXNob3J0IHJlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ1RhYkhhbmRsZSBjVGFiSDsKKyAgICBJVGFiSGFuZGxlIGlUYWJIOworICAgIHNob3J0IHJlczsKICNpZm5kZWYgTWFrZUlUYWJsZQotCVB5TWFjX1BSRUNIRUNLKE1ha2VJVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1ha2VJVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJILAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlUYWJILAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFrZUlUYWJsZShjVGFiSCwKLQkgICAgICAgICAgIGlUYWJILAotCSAgICAgICAgICAgcmVzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJILAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlUYWJILAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFrZUlUYWJsZShjVGFiSCwKKyAgICAgICAgICAgICAgIGlUYWJILAorICAgICAgICAgICAgICAgcmVzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0Q2xpZW50SUQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGlkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpZDsKICNpZm5kZWYgU2V0Q2xpZW50SUQKLQlQeU1hY19QUkVDSEVDSyhTZXRDbGllbnRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q2xpZW50SUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZCkpCi0JCXJldHVybiBOVUxMOwotCVNldENsaWVudElEKGlkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENsaWVudElEKGlkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHJvdGVjdEVudHJ5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbmRleDsKLQlCb29sZWFuIHByb3RlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGluZGV4OworICAgIEJvb2xlYW4gcHJvdGVjdDsKICNpZm5kZWYgUHJvdGVjdEVudHJ5Ci0JUHlNYWNfUFJFQ0hFQ0soUHJvdGVjdEVudHJ5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQcm90ZWN0RW50cnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm90ZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHJvdGVjdEVudHJ5KGluZGV4LAotCSAgICAgICAgICAgICBwcm90ZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90ZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHJvdGVjdEVudHJ5KGluZGV4LAorICAgICAgICAgICAgICAgICBwcm90ZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmVzZXJ2ZUVudHJ5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbmRleDsKLQlCb29sZWFuIHJlc2VydmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGluZGV4OworICAgIEJvb2xlYW4gcmVzZXJ2ZTsKICNpZm5kZWYgUmVzZXJ2ZUVudHJ5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVzZXJ2ZUVudHJ5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNlcnZlRW50cnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNlcnZlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVzZXJ2ZUVudHJ5KGluZGV4LAotCSAgICAgICAgICAgICByZXNlcnZlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNlcnZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUmVzZXJ2ZUVudHJ5KGluZGV4LAorICAgICAgICAgICAgICAgICByZXNlcnZlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUURFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIFFERXJyb3IKLQlQeU1hY19QUkVDSEVDSyhRREVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRREVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRREVycm9yKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFERXJyb3IoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Db3B5RGVlcE1hc2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCUJpdE1hcFB0ciBtYXNrQml0czsKLQlCaXRNYXBQdHIgZHN0Qml0czsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBtYXNrUmVjdDsKLQlSZWN0IGRzdFJlY3Q7Ci0Jc2hvcnQgbW9kZTsKLQlSZ25IYW5kbGUgbWFza1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQml0TWFwUHRyIHNyY0JpdHM7CisgICAgQml0TWFwUHRyIG1hc2tCaXRzOworICAgIEJpdE1hcFB0ciBkc3RCaXRzOworICAgIFJlY3Qgc3JjUmVjdDsKKyAgICBSZWN0IG1hc2tSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrUmduOwogI2lmbmRlZiBDb3B5RGVlcE1hc2sKLQlQeU1hY19QUkVDSEVDSyhDb3B5RGVlcE1hc2spOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlEZWVwTWFzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJm1hc2tCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZtYXNrUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1hc2tSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlDb3B5RGVlcE1hc2soc3JjQml0cywKLQkgICAgICAgICAgICAgbWFza0JpdHMsCi0JICAgICAgICAgICAgIGRzdEJpdHMsCi0JICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAmbWFza1JlY3QsCi0JICAgICAgICAgICAgICZkc3RSZWN0LAotCSAgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgICBtYXNrUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZtYXNrQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmRzdEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbWFza1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29weURlZXBNYXNrKHNyY0JpdHMsCisgICAgICAgICAgICAgICAgIG1hc2tCaXRzLAorICAgICAgICAgICAgICAgICBkc3RCaXRzLAorICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgJm1hc2tSZWN0LAorICAgICAgICAgICAgICAgICAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgbWFza1Jnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFBhdHRlcm4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdEhhbmRsZSBfcnY7Ci0Jc2hvcnQgcGF0dGVybklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXRIYW5kbGUgX3J2OworICAgIHNob3J0IHBhdHRlcm5JRDsKICNpZm5kZWYgR2V0UGF0dGVybgotCVB5TWFjX1BSRUNIRUNLKEdldFBhdHRlcm4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXR0ZXJuSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQYXR0ZXJuKHBhdHRlcm5JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0dGVybklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGF0dGVybihwYXR0ZXJuSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNHZXRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNIYW5kbGUgX3J2OwotCXNob3J0IGN1cnNvcklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDdXJzSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBjdXJzb3JJRDsKICNpZm5kZWYgTWFjR2V0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soTWFjR2V0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNHZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjdXJzb3JJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1hY0dldEN1cnNvcihjdXJzb3JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29ySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNHZXRDdXJzb3IoY3Vyc29ySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaWNIYW5kbGUgX3J2OwotCXNob3J0IHBpY3R1cmVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBwaWN0dXJlSUQ7CiAjaWZuZGVmIEdldFBpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhHZXRQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGljdHVyZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UGljdHVyZShwaWN0dXJlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpY3R1cmVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpY3R1cmUocGljdHVyZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGVsdGFQb2ludChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUG9pbnQgcHRBOwotCVBvaW50IHB0QjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgUG9pbnQgcHRBOworICAgIFBvaW50IHB0QjsKICNpZm5kZWYgRGVsdGFQb2ludAotCVB5TWFjX1BSRUNIRUNLKERlbHRhUG9pbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKERlbHRhUG9pbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHRBLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0QikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERlbHRhUG9pbnQocHRBLAotCSAgICAgICAgICAgICAgICAgcHRCKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHRCKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGVsdGFQb2ludChwdEEsCisgICAgICAgICAgICAgICAgICAgICBwdEIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NoaWVsZEN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBzaGllbGRSZWN0OwotCVBvaW50IG9mZnNldFB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHNoaWVsZFJlY3Q7CisgICAgUG9pbnQgb2Zmc2V0UHQ7CiAjaWZuZGVmIFNoaWVsZEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKFNoaWVsZEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hpZWxkQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc2hpZWxkUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvZmZzZXRQdCkpCi0JCXJldHVybiBOVUxMOwotCVNoaWVsZEN1cnNvcigmc2hpZWxkUmVjdCwKLQkgICAgICAgICAgICAgb2Zmc2V0UHQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNoaWVsZFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb2Zmc2V0UHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaGllbGRDdXJzb3IoJnNoaWVsZFJlY3QsCisgICAgICAgICAgICAgICAgIG9mZnNldFB0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2NyZWVuUmVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBzY3JuSFJlczsKLQlzaG9ydCBzY3JuVlJlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgc2NybkhSZXM7CisgICAgc2hvcnQgc2NyblZSZXM7CiAjaWZuZGVmIFNjcmVlblJlcwotCVB5TWFjX1BSRUNIRUNLKFNjcmVlblJlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NyZWVuUmVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTY3JlZW5SZXMoJnNjcm5IUmVzLAotCSAgICAgICAgICAmc2NyblZSZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgc2NybkhSZXMsCi0JICAgICAgICAgICAgICAgICAgICAgc2NyblZSZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTY3JlZW5SZXMoJnNjcm5IUmVzLAorICAgICAgICAgICAgICAmc2NyblZSZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NybkhSZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NyblZSZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldEluZFBhdHRlcm4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gdGhlUGF0X19vdXRfXzsKLQlzaG9ydCBwYXR0ZXJuTGlzdElEOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXR0ZXJuIHRoZVBhdF9fb3V0X187CisgICAgc2hvcnQgcGF0dGVybkxpc3RJRDsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0SW5kUGF0dGVybgotCVB5TWFjX1BSRUNIRUNLKEdldEluZFBhdHRlcm4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEluZFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0dGVybkxpc3RJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SW5kUGF0dGVybigmdGhlUGF0X19vdXRfXywKLQkgICAgICAgICAgICAgIHBhdHRlcm5MaXN0SUQsCi0JICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVQYXRfX291dF9fLCAoaW50KXNpemVvZihQYXR0ZXJuKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0dGVybkxpc3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0SW5kUGF0dGVybigmdGhlUGF0X19vdXRfXywKKyAgICAgICAgICAgICAgICAgIHBhdHRlcm5MaXN0SUQsCisgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVQYXRfX291dF9fLCAoaW50KXNpemVvZihQYXR0ZXJuKSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2xvcGVGcm9tQW5nbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlzaG9ydCBhbmdsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIHNob3J0IGFuZ2xlOwogI2lmbmRlZiBTbG9wZUZyb21BbmdsZQotCVB5TWFjX1BSRUNIRUNLKFNsb3BlRnJvbUFuZ2xlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTbG9wZUZyb21BbmdsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU2xvcGVGcm9tQW5nbGUoYW5nbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU2xvcGVGcm9tQW5nbGUoYW5nbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9BbmdsZUZyb21TbG9wZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCUZpeGVkIHNsb3BlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgRml4ZWQgc2xvcGU7CiAjaWZuZGVmIEFuZ2xlRnJvbVNsb3BlCi0JUHlNYWNfUFJFQ0hFQ0soQW5nbGVGcm9tU2xvcGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFuZ2xlRnJvbVNsb3BlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzbG9wZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFuZ2xlRnJvbVNsb3BlKHNsb3BlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc2xvcGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBBbmdsZUZyb21TbG9wZShzbG9wZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGl4Qm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgcGl4TWFwOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcGl4TWFwOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRQaXhCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRQaXhCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBpeEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGl4TWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UGl4Qm91bmRzKHBpeE1hcCwKLQkgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhNYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRQaXhCb3VuZHMocGl4TWFwLAorICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGl4RGVwdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlQaXhNYXBIYW5kbGUgcGl4TWFwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBpeE1hcDsKICNpZm5kZWYgR2V0UGl4RGVwdGgKLQlQeU1hY19QUkVDSEVDSyhHZXRQaXhEZXB0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGl4RGVwdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeE1hcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBpeERlcHRoKHBpeE1hcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeE1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpeERlcHRoKHBpeE1hcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UURHbG9iYWxzUmFuZG9tU2VlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRRREdsb2JhbHNSYW5kb21TZWVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UURHbG9iYWxzUmFuZG9tU2VlZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRRREdsb2JhbHNSYW5kb21TZWVkKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UURHbG9iYWxzU2NyZWVuQml0cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQml0TWFwIHNjcmVlbkJpdHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcCBzY3JlZW5CaXRzOwogI2lmbmRlZiBHZXRRREdsb2JhbHNTY3JlZW5CaXRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzU2NyZWVuQml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzU2NyZWVuQml0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UURHbG9iYWxzU2NyZWVuQml0cygmc2NyZWVuQml0cyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBCTU9ial9OZXdDb3BpZWQsICZzY3JlZW5CaXRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzU2NyZWVuQml0cygmc2NyZWVuQml0cyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9OZXdDb3BpZWQsICZzY3JlZW5CaXRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRRREdsb2JhbHNBcnJvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ3Vyc29yIGFycm93X19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ3Vyc29yIGFycm93X19vdXRfXzsKICNpZm5kZWYgR2V0UURHbG9iYWxzQXJyb3cKLQlQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNBcnJvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzQXJyb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFFER2xvYmFsc0Fycm93KCZhcnJvd19fb3V0X18pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmYXJyb3dfX291dF9fLCAoaW50KXNpemVvZihDdXJzb3IpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzQXJyb3coJmFycm93X19vdXRfXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZhcnJvd19fb3V0X18sIChpbnQpc2l6ZW9mKEN1cnNvcikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0RhcmtHcmF5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIGRrR3JheV9fb3V0X187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBhdHRlcm4gZGtHcmF5X19vdXRfXzsKICNpZm5kZWYgR2V0UURHbG9iYWxzRGFya0dyYXkKLQlQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNEYXJrR3JheSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzRGFya0dyYXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFFER2xvYmFsc0RhcmtHcmF5KCZka0dyYXlfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmRrR3JheV9fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzRGFya0dyYXkoJmRrR3JheV9fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmZGtHcmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0xpZ2h0R3JheShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGF0dGVybiBsdEdyYXlfX291dF9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXR0ZXJuIGx0R3JheV9fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0xpZ2h0R3JheQotCVB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc0xpZ2h0R3JheSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzTGlnaHRHcmF5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNMaWdodEdyYXkoJmx0R3JheV9fb3V0X18pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmbHRHcmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNMaWdodEdyYXkoJmx0R3JheV9fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmbHRHcmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0dyYXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gZ3JheV9fb3V0X187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBhdHRlcm4gZ3JheV9fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0dyYXkKLQlQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNHcmF5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNHcmF5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNHcmF5KCZncmF5X19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZncmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNHcmF5KCZncmF5X19vdXRfXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZncmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0JsYWNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIGJsYWNrX19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiBibGFja19fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0JsYWNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzQmxhY2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc0JsYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNCbGFjaygmYmxhY2tfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmJsYWNrX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNCbGFjaygmYmxhY2tfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmJsYWNrX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc1doaXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIHdoaXRlX19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiB3aGl0ZV9fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc1doaXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzV2hpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc1doaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNXaGl0ZSgmd2hpdGVfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJndoaXRlX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNXaGl0ZSgmd2hpdGVfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJndoaXRlX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc1RoZVBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBHZXRRREdsb2JhbHNUaGVQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzVGhlUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzVGhlUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UURHbG9iYWxzVGhlUG9ydCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFFER2xvYmFsc1RoZVBvcnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFFER2xvYmFsc1JhbmRvbVNlZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgcmFuZG9tU2VlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyByYW5kb21TZWVkOwogI2lmbmRlZiBTZXRRREdsb2JhbHNSYW5kb21TZWVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhbmRvbVNlZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRRREdsb2JhbHNSYW5kb21TZWVkKHJhbmRvbVNlZWQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmRvbVNlZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRRREdsb2JhbHNSYW5kb21TZWVkKHJhbmRvbVNlZWQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRRREdsb2JhbHNBcnJvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ3Vyc29yICphcnJvd19faW5fXzsKLQlpbnQgYXJyb3dfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDdXJzb3IgKmFycm93X19pbl9fOworICAgIGludCBhcnJvd19faW5fbGVuX187CiAjaWZuZGVmIFNldFFER2xvYmFsc0Fycm93Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UURHbG9iYWxzQXJyb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFFER2xvYmFsc0Fycm93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmFycm93X19pbl9fLCAmYXJyb3dfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFycm93X19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOwotCQlnb3RvIGFycm93X19lcnJvcl9fOwotCX0KLQlTZXRRREdsb2JhbHNBcnJvdyhhcnJvd19faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmFycm93X19pbl9fLCAmYXJyb3dfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFycm93X19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOworICAgICAgICBnb3RvIGFycm93X19lcnJvcl9fOworICAgIH0KKyAgICBTZXRRREdsb2JhbHNBcnJvdyhhcnJvd19faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIGFycm93X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UmVnaW9uQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRSZWdpb25Cb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRSZWdpb25Cb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlZ2lvbkJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UmVnaW9uQm91bmRzKHJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRSZWdpb25Cb3VuZHMocmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSXNSZWdpb25SZWN0YW5ndWxhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgSXNSZWdpb25SZWN0YW5ndWxhcgotCVB5TWFjX1BSRUNIRUNLKElzUmVnaW9uUmVjdGFuZ3VsYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUmVnaW9uUmVjdGFuZ3VsYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzUmVnaW9uUmVjdGFuZ3VsYXIocmVnaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNSZWdpb25SZWN0YW5ndWxhcihyZWdpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NyZWF0ZU5ld1BvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBDcmVhdGVOZXdQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ3JlYXRlTmV3UG9ydCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENyZWF0ZU5ld1BvcnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFFERXJyb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogI2lmbmRlZiBTZXRRREVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UURFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UURFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVycikpCi0JCXJldHVybiBOVUxMOwotCVNldFFERXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRRREVycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0U2NyVlJlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgTE1HZXRTY3JWUmVzCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRTY3JWUmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFNjclZSZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0U2NyVlJlcygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFNjclZSZXMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFNjclZSZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHZhbHVlOwogI2lmbmRlZiBMTVNldFNjclZSZXMKLQlQeU1hY19QUkVDSEVDSyhMTVNldFNjclZSZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0U2NyVlJlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRTY3JWUmVzKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0U2NyVlJlcyh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0U2NySFJlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgTE1HZXRTY3JIUmVzCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRTY3JIUmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFNjckhSZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0U2NySFJlcygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFNjckhSZXMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFNjckhSZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHZhbHVlOwogI2lmbmRlZiBMTVNldFNjckhSZXMKLQlQeU1hY19QUkVDSEVDSyhMTVNldFNjckhSZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0U2NySFJlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRTY3JIUmVzKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0U2NySFJlcyh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0TWFpbkRldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0TWFpbkRldmljZQotCVB5TWFjX1BSRUNIRUNLKExNR2V0TWFpbkRldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRNYWluRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldE1haW5EZXZpY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0TWFpbkRldmljZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldE1haW5EZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXRNYWluRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRNYWluRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldE1haW5EZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRNYWluRGV2aWNlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRNYWluRGV2aWNlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXREZXZpY2VMaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgTE1HZXREZXZpY2VMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soTE1HZXREZXZpY2VMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldERldmljZUxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0RGV2aWNlTGlzdCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXREZXZpY2VMaXN0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0RGV2aWNlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldERldmljZUxpc3QKLQlQeU1hY19QUkVDSEVDSyhMTVNldERldmljZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0RGV2aWNlTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldERldmljZUxpc3QodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldERldmljZUxpc3QodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldFFEQ29sb3JzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBMTUdldFFEQ29sb3JzCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRRRENvbG9ycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRRRENvbG9ycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRRRENvbG9ycygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRRRENvbG9ycygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFFEQ29sb3JzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXRRRENvbG9ycwotCVB5TWFjX1BSRUNIRUNLKExNU2V0UURDb2xvcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0UURDb2xvcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRRRENvbG9ycyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0UURDb2xvcnModmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldFdpZHRoTGlzdEhhbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0V2lkdGhMaXN0SGFuZAotCVB5TWFjX1BSRUNIRUNLKExNR2V0V2lkdGhMaXN0SGFuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRXaWR0aExpc3RIYW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFdpZHRoTGlzdEhhbmQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0V2lkdGhMaXN0SGFuZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFdpZHRoTGlzdEhhbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldFdpZHRoTGlzdEhhbmQKLQlQeU1hY19QUkVDSEVDSyhMTVNldFdpZHRoTGlzdEhhbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0V2lkdGhMaXN0SGFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldFdpZHRoTGlzdEhhbmQodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFdpZHRoTGlzdEhhbmQodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldEhpbGl0ZU1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggX3J2OwogI2lmbmRlZiBMTUdldEhpbGl0ZU1vZGUKLQlQeU1hY19QUkVDSEVDSyhMTUdldEhpbGl0ZU1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0SGlsaXRlTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRIaWxpdGVNb2RlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0SGlsaXRlTW9kZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0SGlsaXRlTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDggdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IHZhbHVlOwogI2lmbmRlZiBMTVNldEhpbGl0ZU1vZGUKLQlQeU1hY19QUkVDSEVDSyhMTVNldEhpbGl0ZU1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0SGlsaXRlTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRIaWxpdGVNb2RlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0SGlsaXRlTW9kZSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0V2lkdGhUYWJIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0V2lkdGhUYWJIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhMTUdldFdpZHRoVGFiSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFdpZHRoVGFiSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFdpZHRoVGFiSGFuZGxlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFdpZHRoVGFiSGFuZGxlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0V2lkdGhUYWJIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldFdpZHRoVGFiSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRXaWR0aFRhYkhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRXaWR0aFRhYkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldFdpZHRoVGFiSGFuZGxlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRXaWR0aFRhYkhhbmRsZSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0TGFzdFNQRXh0cmEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIExNR2V0TGFzdFNQRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhMTUdldExhc3RTUEV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldExhc3RTUEV4dHJhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldExhc3RTUEV4dHJhKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0TGFzdFNQRXh0cmEoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldExhc3RTUEV4dHJhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiB2YWx1ZTsKICNpZm5kZWYgTE1TZXRMYXN0U1BFeHRyYQotCVB5TWFjX1BSRUNIRUNLKExNU2V0TGFzdFNQRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0TGFzdFNQRXh0cmEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0TGFzdFNQRXh0cmEodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRMYXN0U1BFeHRyYSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0TGFzdEZPTkQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0TGFzdEZPTkQKLQlQeU1hY19QUkVDSEVDSyhMTUdldExhc3RGT05EKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldExhc3RGT05EKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldExhc3RGT05EKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldExhc3RGT05EKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0TGFzdEZPTkQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldExhc3RGT05ECi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRMYXN0Rk9ORCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRMYXN0Rk9ORCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldExhc3RGT05EKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRMYXN0Rk9ORCh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0RnJhY3RFbmFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggX3J2OwogI2lmbmRlZiBMTUdldEZyYWN0RW5hYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRGcmFjdEVuYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRGcmFjdEVuYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRGcmFjdEVuYWJsZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEZyYWN0RW5hYmxlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRGcmFjdEVuYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDggdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IHZhbHVlOwogI2lmbmRlZiBMTVNldEZyYWN0RW5hYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRGcmFjdEVuYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRGcmFjdEVuYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRGcmFjdEVuYWJsZSh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEZyYWN0RW5hYmxlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXRUaGVHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgTE1HZXRUaGVHRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRUaGVHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFRoZUdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0VGhlR0RldmljZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRUaGVHRGV2aWNlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0VGhlR0RldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldFRoZUdEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhMTVNldFRoZUdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0VGhlR0RldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldFRoZUdEZXZpY2UodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFRoZUdEZXZpY2UodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldEhpbGl0ZVJHQihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlOwogI2lmbmRlZiBMTUdldEhpbGl0ZVJHQgotCVB5TWFjX1BSRUNIRUNLKExNR2V0SGlsaXRlUkdCKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldEhpbGl0ZVJHQik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1HZXRIaWxpdGVSR0IoJmhpbGl0ZVJHQlZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmhpbGl0ZVJHQlZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1HZXRIaWxpdGVSR0IoJmhpbGl0ZVJHQlZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmhpbGl0ZVJHQlZhbHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldEhpbGl0ZVJHQihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlOwogI2lmbmRlZiBMTVNldEhpbGl0ZVJHQgotCVB5TWFjX1BSRUNIRUNLKExNU2V0SGlsaXRlUkdCKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEhpbGl0ZVJHQik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZoaWxpdGVSR0JWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0SGlsaXRlUkdCKCZoaWxpdGVSR0JWYWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmhpbGl0ZVJHQlZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRIaWxpdGVSR0IoJmhpbGl0ZVJHQlZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXRDdXJzb3JOZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgTE1HZXRDdXJzb3JOZXcKLQlQeU1hY19QUkVDSEVDSyhMTUdldEN1cnNvck5ldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRDdXJzb3JOZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0Q3Vyc29yTmV3KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0Q3Vyc29yTmV3KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRDdXJzb3JOZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gdmFsdWU7CiAjaWZuZGVmIExNU2V0Q3Vyc29yTmV3Ci0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRDdXJzb3JOZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0Q3Vyc29yTmV3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEN1cnNvck5ldyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEN1cnNvck5ldyh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRGb250KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBmb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBmb250OwogI2lmbmRlZiBUZXh0Rm9udAotCVB5TWFjX1BSRUNIRUNLKFRleHRGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0Rm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0Rm9udChmb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dEZvbnQoZm9udCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRGYWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHlsZVBhcmFtZXRlciBmYWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHlsZVBhcmFtZXRlciBmYWNlOwogI2lmbmRlZiBUZXh0RmFjZQotCVB5TWFjX1BSRUNIRUNLKFRleHRGYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RmFjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZhY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0RmFjZShmYWNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dEZhY2UoZmFjZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRNb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOwogI2lmbmRlZiBUZXh0TW9kZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0TW9kZShtb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dE1vZGUobW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBzaXplOwogI2lmbmRlZiBUZXh0U2l6ZQotCVB5TWFjX1BSRUNIRUNLKFRleHRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0U2l6ZShzaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dFNpemUoc2l6ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NwYWNlRXh0cmEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIGV4dHJhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBleHRyYTsKICNpZm5kZWYgU3BhY2VFeHRyYQotCVB5TWFjX1BSRUNIRUNLKFNwYWNlRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwYWNlRXh0cmEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmV4dHJhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3BhY2VFeHRyYShleHRyYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZleHRyYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNwYWNlRXh0cmEoZXh0cmEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EcmF3Q2hhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ2hhclBhcmFtZXRlciBjaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ2hhclBhcmFtZXRlciBjaDsKICNpZm5kZWYgRHJhd0NoYXIKLQlQeU1hY19QUkVDSEVDSyhEcmF3Q2hhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd0NoYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaCkpCi0JCXJldHVybiBOVUxMOwotCURyYXdDaGFyKGNoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdDaGFyKGNoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRHJhd1N0cmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBzOwogI2lmbmRlZiBEcmF3U3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcykpCi0JCXJldHVybiBOVUxMOwotCURyYXdTdHJpbmcocyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhd1N0cmluZyhzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRHJhd1RleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKnRleHRCdWZfX2luX187Ci0JaW50IHRleHRCdWZfX2luX2xlbl9fOwotCXNob3J0IGZpcnN0Qnl0ZTsKLQlzaG9ydCBieXRlQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKnRleHRCdWZfX2luX187CisgICAgaW50IHRleHRCdWZfX2luX2xlbl9fOworICAgIHNob3J0IGZpcnN0Qnl0ZTsKKyAgICBzaG9ydCBieXRlQ291bnQ7CiAjaWZuZGVmIE1hY0RyYXdUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRHJhd1RleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0RyYXdUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJ1Zl9faW5fXywgJnRleHRCdWZfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RCeXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLwotCXRleHRCdWZfX2luX2xlbl9fID0gdGV4dEJ1Zl9faW5fbGVuX187Ci0JTWFjRHJhd1RleHQodGV4dEJ1Zl9faW5fXywKLQkgICAgICAgICAgICBmaXJzdEJ5dGUsCi0JICAgICAgICAgICAgYnl0ZUNvdW50KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0QnVmX19pbl9fLCAmdGV4dEJ1Zl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdEJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBGb29sIGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgdGV4dEJ1Zl9faW5fbGVuX18gPSB0ZXh0QnVmX19pbl9sZW5fXzsKKyAgICBNYWNEcmF3VGV4dCh0ZXh0QnVmX19pbl9fLAorICAgICAgICAgICAgICAgIGZpcnN0Qnl0ZSwKKyAgICAgICAgICAgICAgICBieXRlQ291bnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DaGFyV2lkdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlDaGFyUGFyYW1ldGVyIGNoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgQ2hhclBhcmFtZXRlciBjaDsKICNpZm5kZWYgQ2hhcldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhcldpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFyV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENoYXJXaWR0aChjaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENoYXJXaWR0aChjaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU3RyaW5nV2lkdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlTdHIyNTUgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFN0cjI1NSBzOwogI2lmbmRlZiBTdHJpbmdXaWR0aAotCVB5TWFjX1BSRUNIRUNLKFN0cmluZ1dpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTdHJpbmdXaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN0cmluZ1dpZHRoKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3RyaW5nV2lkdGgocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfVGV4dFdpZHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JY2hhciAqdGV4dEJ1Zl9faW5fXzsKLQlpbnQgdGV4dEJ1Zl9faW5fbGVuX187Ci0Jc2hvcnQgZmlyc3RCeXRlOwotCXNob3J0IGJ5dGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIGNoYXIgKnRleHRCdWZfX2luX187CisgICAgaW50IHRleHRCdWZfX2luX2xlbl9fOworICAgIHNob3J0IGZpcnN0Qnl0ZTsKKyAgICBzaG9ydCBieXRlQ291bnQ7CiAjaWZuZGVmIFRleHRXaWR0aAotCVB5TWFjX1BSRUNIRUNLKFRleHRXaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dFdpZHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJ1Zl9faW5fXywgJnRleHRCdWZfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RCeXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLwotCXRleHRCdWZfX2luX2xlbl9fID0gdGV4dEJ1Zl9faW5fbGVuX187Ci0JX3J2ID0gVGV4dFdpZHRoKHRleHRCdWZfX2luX18sCi0JICAgICAgICAgICAgICAgIGZpcnN0Qnl0ZSwKLQkgICAgICAgICAgICAgICAgYnl0ZUNvdW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2hoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCdWZfX2luX18sICZ0ZXh0QnVmX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0Qnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICB0ZXh0QnVmX19pbl9sZW5fXyA9IHRleHRCdWZfX2luX2xlbl9fOworICAgIF9ydiA9IFRleHRXaWR0aCh0ZXh0QnVmX19pbl9fLAorICAgICAgICAgICAgICAgICAgICBmaXJzdEJ5dGUsCisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Rm9udEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZvbnRJbmZvIGluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZvbnRJbmZvIGluZm87CiAjaWZuZGVmIEdldEZvbnRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Rm9udEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZvbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRGb250SW5mbygmaW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZEZJX05ldywgJmluZm8pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRGb250SW5mbygmaW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZEZJX05ldywgJmluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NoYXJFeHRyYShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgZXh0cmE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIGV4dHJhOwogI2lmbmRlZiBDaGFyRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhDaGFyRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYXJFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXh0cmEpKQotCQlyZXR1cm4gTlVMTDsKLQlDaGFyRXh0cmEoZXh0cmEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXh0cmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDaGFyRXh0cmEoZXh0cmEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9UcnVuY1N0cmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCXNob3J0IHdpZHRoOwotCVN0cjI1NSB0aGVTdHJpbmc7Ci0JVHJ1bmNDb2RlIHRydW5jV2hlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBzaG9ydCB3aWR0aDsKKyAgICBTdHIyNTUgdGhlU3RyaW5nOworICAgIFRydW5jQ29kZSB0cnVuY1doZXJlOwogI2lmbmRlZiBUcnVuY1N0cmluZwotCVB5TWFjX1BSRUNIRUNLKFRydW5jU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcnVuY1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRoZVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRydW5jV2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUcnVuY1N0cmluZyh3aWR0aCwKLQkgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgdHJ1bmNXaGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY1doZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHJ1bmNTdHJpbmcod2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIHRydW5jV2hlcmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdyYWZQdHIgdGhlUG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR3JhZlB0ciB0aGVQb3J0OwogI2lmbmRlZiBTZXRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnRoZVBvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0KHRoZVBvcnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnRoZVBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0KHRoZVBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNIYW5kbGUgX3J2OwotCXNob3J0IGN1cnNvcklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDdXJzSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBjdXJzb3JJRDsKICNpZm5kZWYgR2V0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjdXJzb3JJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnNvcihjdXJzb3JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29ySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDdXJzb3IoY3Vyc29ySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNvciAqY3Jzcl9faW5fXzsKLQlpbnQgY3Jzcl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEN1cnNvciAqY3Jzcl9faW5fXzsKKyAgICBpbnQgY3Jzcl9faW5fbGVuX187CiAjaWZuZGVmIFNldEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKFNldEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmNyc3JfX2luX18sICZjcnNyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChjcnNyX19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOwotCQlnb3RvIGNyc3JfX2Vycm9yX187Ci0JfQotCVNldEN1cnNvcihjcnNyX19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmY3Jzcl9faW5fXywgJmNyc3JfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGNyc3JfX2luX2xlbl9fICE9IHNpemVvZihDdXJzb3IpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihDdXJzb3IpIik7CisgICAgICAgIGdvdG8gY3Jzcl9fZXJyb3JfXzsKKyAgICB9CisgICAgU2V0Q3Vyc29yKGNyc3JfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBjcnNyX19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2hvd0N1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTaG93Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0N1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0N1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2hvd0N1cnNvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd0N1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MaW5lVG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBMaW5lVG8KLQlQeU1hY19QUkVDSEVDSyhMaW5lVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKExpbmVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCUxpbmVUbyhoLAotCSAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMaW5lVG8oaCwKKyAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHRvcDsKLQlzaG9ydCByaWdodDsKLQlzaG9ydCBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBsZWZ0OworICAgIHNob3J0IHRvcDsKKyAgICBzaG9ydCByaWdodDsKKyAgICBzaG9ydCBib3R0b207CiAjaWZuZGVmIFNldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhTZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVjdCgmciwKLQkgICAgICAgIGxlZnQsCi0JICAgICAgICB0b3AsCi0JICAgICAgICByaWdodCwKLQkgICAgICAgIGJvdHRvbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFJlY3QoJnIsCisgICAgICAgIGxlZnQsCisgICAgICAgIHRvcCwKKyAgICAgICAgcmlnaHQsCisgICAgICAgIGJvdHRvbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9PZmZzZXRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgT2Zmc2V0UmVjdAotCVB5TWFjX1BSRUNIRUNLKE9mZnNldFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE9mZnNldFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU9mZnNldFJlY3QoJnIsCi0JICAgICAgICAgICBkaCwKLQkgICAgICAgICAgIGR2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBPZmZzZXRSZWN0KCZyLAorICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICBkdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnNldFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OwogI2lmbmRlZiBJbnNldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhJbnNldFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2V0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXRSZWN0KCZyLAotCSAgICAgICAgICBkaCwKLQkgICAgICAgICAgZHYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2V0UmVjdCgmciwKKyAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgIGR2KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1VuaW9uUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBzcmMxOwotCVJlY3Qgc3JjMjsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3Qgc3JjMTsKKyAgICBSZWN0IHNyYzI7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBVbmlvblJlY3QKLQlQeU1hY19QUkVDSEVDSyhVbmlvblJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFVuaW9uUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVW5pb25SZWN0KCZzcmMxLAotCSAgICAgICAgICAmc3JjMiwKLQkgICAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZHN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFVuaW9uUmVjdCgmc3JjMSwKKyAgICAgICAgICAgICAgJnNyYzIsCisgICAgICAgICAgICAgICZkc3RSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VxdWFsUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCByZWN0MTsKLQlSZWN0IHJlY3QyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHJlY3QxOworICAgIFJlY3QgcmVjdDI7CiAjaWZuZGVmIEVxdWFsUmVjdAotCVB5TWFjX1BSRUNIRUNLKEVxdWFsUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXF1YWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEVxdWFsUmVjdCgmcmVjdDEsCi0JICAgICAgICAgICAgICAgICZyZWN0Mik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRXF1YWxSZWN0KCZyZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgJnJlY3QyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GcmFtZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBGcmFtZVJlY3QKLQlQeU1hY19QUkVDSEVDSyhGcmFtZVJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVSZWN0KCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBJbnZlcnRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW52ZXJ0UmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnZlcnRSZWN0KCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIEZpbGxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRmlsbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlGaWxsUmVjdCgmciwKLQkgICAgICAgICBwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgRmlsbFJlY3QoJnIsCisgICAgICAgICAgICAgcGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbjsKLQlSZ25IYW5kbGUgZHN0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgc3JjUmduOworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIENvcHlSZ24KLQlQeU1hY19QUkVDSEVDSyhDb3B5UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlDb3B5UmduKHNyY1JnbiwKLQkgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5UmduKHNyY1JnbiwKKyAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0UmVjdFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHRvcDsKLQlzaG9ydCByaWdodDsKLQlzaG9ydCBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgbGVmdDsKKyAgICBzaG9ydCB0b3A7CisgICAgc2hvcnQgcmlnaHQ7CisgICAgc2hvcnQgYm90dG9tOwogI2lmbmRlZiBTZXRSZWN0UmduCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVjdFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UmVjdFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCi0JCXJldHVybiBOVUxMOwotCVNldFJlY3RSZ24ocmduLAotCSAgICAgICAgICAgbGVmdCwKLQkgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgIHJpZ2h0LAotCSAgICAgICAgICAgYm90dG9tKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRSZWN0UmduKHJnbiwKKyAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICByaWdodCwKKyAgICAgICAgICAgICAgIGJvdHRvbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX09mZnNldFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgT2Zmc2V0UmduCi0JUHlNYWNfUFJFQ0hFQ0soT2Zmc2V0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPZmZzZXRSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU9mZnNldFJnbihyZ24sCi0JICAgICAgICAgIGRoLAotCSAgICAgICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBPZmZzZXRSZ24ocmduLAorICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgZHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9VbmlvblJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbkE7Ci0JUmduSGFuZGxlIHNyY1JnbkI7Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbkE7CisgICAgUmduSGFuZGxlIHNyY1JnbkI7CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgVW5pb25SZ24KLQlQeU1hY19QUkVDSEVDSyhVbmlvblJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVW5pb25SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVW5pb25SZ24oc3JjUmduQSwKLQkgICAgICAgICBzcmNSZ25CLAotCSAgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFVuaW9uUmduKHNyY1JnbkEsCisgICAgICAgICAgICAgc3JjUmduQiwKKyAgICAgICAgICAgICBkc3RSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Yb3JSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ25BOwotCVJnbkhhbmRsZSBzcmNSZ25COwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBzcmNSZ25BOworICAgIFJnbkhhbmRsZSBzcmNSZ25COworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIFhvclJnbgotCVB5TWFjX1BSRUNIRUNLKFhvclJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soWG9yUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCi0JCXJldHVybiBOVUxMOwotCVhvclJnbihzcmNSZ25BLAotCSAgICAgICBzcmNSZ25CLAotCSAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBYb3JSZ24oc3JjUmduQSwKKyAgICAgICAgICAgc3JjUmduQiwKKyAgICAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRXF1YWxSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJnbkhhbmRsZSByZ25BOwotCVJnbkhhbmRsZSByZ25COworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZ25IYW5kbGUgcmduQTsKKyAgICBSZ25IYW5kbGUgcmduQjsKICNpZm5kZWYgRXF1YWxSZ24KLQlQeU1hY19QUkVDSEVDSyhFcXVhbFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXF1YWxSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25CKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRXF1YWxSZ24ocmduQSwKLQkgICAgICAgICAgICAgICByZ25CKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbkIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBFcXVhbFJnbihyZ25BLAorICAgICAgICAgICAgICAgICAgIHJnbkIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBGcmFtZVJnbgotCVB5TWFjX1BSRUNIRUNLKEZyYW1lUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGcmFtZVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVSZ24ocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1BhaW50UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBQYWludFJnbgotCVB5TWFjX1BSRUNIRUNLKFBhaW50UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQYWludFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRSZ24ocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50UmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgSW52ZXJ0UmduCi0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZlcnRSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCUludmVydFJnbihyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0UmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0JUGF0dGVybiAqcGF0X19pbl9fOwotCWludCBwYXRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOworICAgIFBhdHRlcm4gKnBhdF9faW5fXzsKKyAgICBpbnQgcGF0X19pbl9sZW5fXzsKICNpZm5kZWYgRmlsbFJnbgotCVB5TWFjX1BSRUNIRUNLKEZpbGxSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKLQkJZ290byBwYXRfX2Vycm9yX187Ci0JfQotCUZpbGxSZ24ocmduLAotCSAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxSZ24ocmduLAorICAgICAgICBwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQaXhlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0Jc2hvcnQgaDsKLQlzaG9ydCB2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBzaG9ydCBoOworICAgIHNob3J0IHY7CiAjaWZuZGVmIEdldFBpeGVsCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UGl4ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBpeGVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UGl4ZWwoaCwKLQkgICAgICAgICAgICAgICB2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpeGVsKGgsCisgICAgICAgICAgICAgICAgICAgdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHRJblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0OwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CisgICAgUmVjdCByOwogI2lmbmRlZiBQdEluUmVjdAotCVB5TWFjX1BSRUNIRUNLKFB0SW5SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdEluUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQdEluUmVjdChwdCwKLQkgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJblJlY3QocHQsCisgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0RyYXdUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICp0ZXh0QnVmX19pbl9fOwotCWludCB0ZXh0QnVmX19pbl9sZW5fXzsKLQlzaG9ydCBmaXJzdEJ5dGU7Ci0Jc2hvcnQgYnl0ZUNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0QnVmX19pbl9fOworICAgIGludCB0ZXh0QnVmX19pbl9sZW5fXzsKKyAgICBzaG9ydCBmaXJzdEJ5dGU7CisgICAgc2hvcnQgYnl0ZUNvdW50OwogI2lmbmRlZiBEcmF3VGV4dAotCVB5TWFjX1BSRUNIRUNLKERyYXdUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2hoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRCdWZfX2luX18sICZ0ZXh0QnVmX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0Qnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCkpCi0JCXJldHVybiBOVUxMOwotCS8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8KLQl0ZXh0QnVmX19pbl9sZW5fXyA9IHRleHRCdWZfX2luX2xlbl9fOwotCURyYXdUZXh0KHRleHRCdWZfX2luX18sCi0JICAgICAgICAgZmlyc3RCeXRlLAotCSAgICAgICAgIGJ5dGVDb3VudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJ1Zl9faW5fXywgJnRleHRCdWZfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHRleHRCdWZfX2luX2xlbl9fID0gdGV4dEJ1Zl9faW5fbGVuX187CisgICAgRHJhd1RleHQodGV4dEJ1Zl9faW5fXywKKyAgICAgICAgICAgICBmaXJzdEJ5dGUsCisgICAgICAgICAgICAgYnl0ZUNvdW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQml0TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlCaXRNYXAgKnB0cjsKLQlQeU9iamVjdCAqc291cmNlOwotCVJlY3QgYm91bmRzOwotCWludCByb3dieXRlczsKLQljaGFyICpkYXRhOworICAgIEJpdE1hcCAqcHRyOworICAgIFB5T2JqZWN0ICpzb3VyY2U7CisgICAgUmVjdCBib3VuZHM7CisgICAgaW50IHJvd2J5dGVzOworICAgIGNoYXIgKmRhdGE7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyFpTyYiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSwgJnJvd2J5dGVzLCBQeU1hY19HZXRSZWN0LAotCSAgICAgICAgICAgICAgICAmYm91bmRzKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKLQlpZiAoKHB0cj0oQml0TWFwICopbWFsbG9jKHNpemVvZihCaXRNYXApKSkgPT0gTlVMTCApCi0JICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlwdHItPmJhc2VBZGRyID0gKFB0cilkYXRhOwotCXB0ci0+cm93Qnl0ZXMgPSByb3dieXRlczsKLQlwdHItPmJvdW5kcyA9IGJvdW5kczsKLQlpZiAoIChfcmVzID0gQk1PYmpfTmV3KHB0cikpID09IE5VTEwgKSB7Ci0JICAgICAgICBmcmVlKHB0cik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JKChCaXRNYXBPYmplY3QgKilfcmVzKS0+cmVmZXJyZWRfb2JqZWN0ID0gc291cmNlOwotCVB5X0lOQ1JFRihzb3VyY2UpOwotCSgoQml0TWFwT2JqZWN0ICopX3JlcyktPnJlZmVycmVkX2JpdG1hcCA9IHB0cjsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyFpTyYiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSwgJnJvd2J5dGVzLCBQeU1hY19HZXRSZWN0LAorICAgICAgICAgICAgICAgICAgICAmYm91bmRzKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGEgPSBQeVN0cmluZ19Bc1N0cmluZyhzb3VyY2UpOworICAgIGlmICgocHRyPShCaXRNYXAgKiltYWxsb2Moc2l6ZW9mKEJpdE1hcCkpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcHRyLT5iYXNlQWRkciA9IChQdHIpZGF0YTsKKyAgICBwdHItPnJvd0J5dGVzID0gcm93Ynl0ZXM7CisgICAgcHRyLT5ib3VuZHMgPSBib3VuZHM7CisgICAgaWYgKCAoX3JlcyA9IEJNT2JqX05ldyhwdHIpKSA9PSBOVUxMICkgeworICAgICAgICBmcmVlKHB0cik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9vYmplY3QgPSBzb3VyY2U7CisgICAgUHlfSU5DUkVGKHNvdXJjZSk7CisgICAgKChCaXRNYXBPYmplY3QgKilfcmVzKS0+cmVmZXJyZWRfYml0bWFwID0gcHRyOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmF3Qml0TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlCaXRNYXAgKnB0cjsKLQlQeU9iamVjdCAqc291cmNlOworICAgIEJpdE1hcCAqcHRyOworICAgIFB5T2JqZWN0ICpzb3VyY2U7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyEiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSkgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKCBQeVN0cmluZ19TaXplKHNvdXJjZSkgIT0gc2l6ZW9mKEJpdE1hcCkgJiYgUHlTdHJpbmdfU2l6ZShzb3VyY2UpICE9IHNpemVvZihQaXhNYXApICkgewotCSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkgICAgICAgICAgICAgICAgIkFyZ3VtZW50IHNpemUgd2FzICVsZCwgc2hvdWxkIGJlICVsdSAoc2l6ZW9mIEJpdE1hcCkgb3IgJWx1IChzaXplb2YgUGl4TWFwKSIsCi0JICAgICAgICAgICAgICAgIFB5U3RyaW5nX1NpemUoc291cmNlKSwgc2l6ZW9mKEJpdE1hcCksIHNpemVvZihQaXhNYXApKTsKLQkgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQlwdHIgPSAoQml0TWFwUHRyKVB5U3RyaW5nX0FzU3RyaW5nKHNvdXJjZSk7Ci0JaWYgKCAoX3JlcyA9IEJNT2JqX05ldyhwdHIpKSA9PSBOVUxMICkgewotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCSgoQml0TWFwT2JqZWN0ICopX3JlcyktPnJlZmVycmVkX29iamVjdCA9IHNvdXJjZTsKLQlQeV9JTkNSRUYoc291cmNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyEiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIFB5U3RyaW5nX1NpemUoc291cmNlKSAhPSBzaXplb2YoQml0TWFwKSAmJiBQeVN0cmluZ19TaXplKHNvdXJjZSkgIT0gc2l6ZW9mKFBpeE1hcCkgKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiQXJndW1lbnQgc2l6ZSB3YXMgJWxkLCBzaG91bGQgYmUgJWx1IChzaXplb2YgQml0TWFwKSBvciAlbHUgKHNpemVvZiBQaXhNYXApIiwKKyAgICAgICAgICAgIFB5U3RyaW5nX1NpemUoc291cmNlKSwgc2l6ZW9mKEJpdE1hcCksIHNpemVvZihQaXhNYXApKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHB0ciA9IChCaXRNYXBQdHIpUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKKyAgICBpZiAoIChfcmVzID0gQk1PYmpfTmV3KHB0cikpID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9vYmplY3QgPSBzb3VyY2U7CisgICAgUHlfSU5DUkVGKHNvdXJjZSk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgUWRfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0UG9ydCIsIChQeUNGdW5jdGlvbilRZF9HZXRQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHcmFmUHRyIHBvcnQpIil9LAotCXsiR3JhZkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9HcmFmRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkZXZpY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0Qml0cyIsIChQeUNGdW5jdGlvbilRZF9TZXRQb3J0Qml0cywgMSwKLQkgUHlEb2NfU1RSKCIoQml0TWFwUHRyIGJtKSAtPiBOb25lIil9LAotCXsiUG9ydFNpemUiLCAoUHlDRnVuY3Rpb24pUWRfUG9ydFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpZHRoLCBzaG9ydCBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJNb3ZlUG9ydFRvIiwgKFB5Q0Z1bmN0aW9uKVFkX01vdmVQb3J0VG8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGxlZnRHbG9iYWwsIHNob3J0IHRvcEdsb2JhbCkgLT4gTm9uZSIpfSwKLQl7IlNldE9yaWdpbiIsIChQeUNGdW5jdGlvbilRZF9TZXRPcmlnaW4sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCi0JeyJTZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJHZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJDbGlwUmVjdCIsIChQeUNGdW5jdGlvbilRZF9DbGlwUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiQmFja1BhdCIsIChQeUNGdW5jdGlvbilRZF9CYWNrUGF0LCAxLAotCSBQeURvY19TVFIoIihQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IkluaXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfSW5pdEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiTWFjU2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1NldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQ3Vyc29yIGNyc3IpIC0+IE5vbmUiKX0sCi0JeyJIaWRlQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0hpZGVDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1hY1Nob3dDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2hvd0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiT2JzY3VyZUN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9PYnNjdXJlQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJIaWRlUGVuIiwgKFB5Q0Z1bmN0aW9uKVFkX0hpZGVQZW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNob3dQZW4iLCAoUHlDRnVuY3Rpb24pUWRfU2hvd1BlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0UGVuIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9pbnQgcHQpIil9LAotCXsiR2V0UGVuU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGVuU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBlblN0YXRlIHBuU3RhdGUpIil9LAotCXsiU2V0UGVuU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UGVuU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBlblN0YXRlIHBuU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJQZW5TaXplIiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblNpemUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpZHRoLCBzaG9ydCBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJQZW5Nb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX1Blbk1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1vZGUpIC0+IE5vbmUiKX0sCi0JeyJQZW5QYXQiLCAoUHlDRnVuY3Rpb24pUWRfUGVuUGF0LCAxLAotCSBQeURvY19TVFIoIihQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IlBlbk5vcm1hbCIsIChQeUNGdW5jdGlvbilRZF9QZW5Ob3JtYWwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1vdmVUbyIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlVG8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCi0JeyJNb3ZlIiwgKFB5Q0Z1bmN0aW9uKVFkX01vdmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7Ik1hY0xpbmVUbyIsIChQeUNGdW5jdGlvbilRZF9NYWNMaW5lVG8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCi0JeyJMaW5lIiwgKFB5Q0Z1bmN0aW9uKVFkX0xpbmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7IkZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9Gb3JlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgY29sb3IpIC0+IE5vbmUiKX0sCi0JeyJCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfQmFja0NvbG9yLCAxLAotCSBQeURvY19TVFIoIihsb25nIGNvbG9yKSAtPiBOb25lIil9LAotCXsiQ29sb3JCaXQiLCAoUHlDRnVuY3Rpb24pUWRfQ29sb3JCaXQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdoaWNoQml0KSAtPiBOb25lIil9LAotCXsiTWFjU2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNTZXRSZWN0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IChSZWN0IHIpIil9LAotCXsiTWFjT2Zmc2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNPZmZzZXRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gKFJlY3QgcikiKX0sCi0JeyJNYWNJbnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjSW5zZXRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gKFJlY3QgcikiKX0sCi0JeyJTZWN0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9TZWN0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBzcmMxLCBSZWN0IHNyYzIpIC0+IChCb29sZWFuIF9ydiwgUmVjdCBkc3RSZWN0KSIpfSwKLQl7Ik1hY1VuaW9uUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNVbmlvblJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoUmVjdCBkc3RSZWN0KSIpfSwKLQl7Ik1hY0VxdWFsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNFcXVhbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcmVjdDEsIFJlY3QgcmVjdDIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJFbXB0eVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRW1wdHlSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJNYWNGcmFtZVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjRnJhbWVSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJQYWludFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJFcmFzZVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJNYWNJbnZlcnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ludmVydFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7Ik1hY0ZpbGxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZpbGxSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiRnJhbWVPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiUGFpbnRPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50T3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiRXJhc2VPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiSW52ZXJ0T3ZhbCIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRPdmFsLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJGaWxsT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GaWxsT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IkZyYW1lUm91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUm91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IlBhaW50Um91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50Um91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkVyYXNlUm91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUm91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkludmVydFJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRSb3VuZFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0KSAtPiBOb25lIil9LAotCXsiRmlsbFJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GaWxsUm91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCi0JeyJGcmFtZUFyYyIsIChQeUNGdW5jdGlvbilRZF9GcmFtZUFyYywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKLQl7IlBhaW50QXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50QXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAotCXsiRXJhc2VBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VBcmMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUpIC0+IE5vbmUiKX0sCi0JeyJJbnZlcnRBcmMiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0QXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAotCXsiRmlsbEFyYyIsIChQeUNGdW5jdGlvbilRZF9GaWxsQXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7Ik5ld1JnbiIsIChQeUNGdW5jdGlvbilRZF9OZXdSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiT3BlblJnbiIsIChQeUNGdW5jdGlvbilRZF9PcGVuUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDbG9zZVJnbiIsIChQeUNGdW5jdGlvbilRZF9DbG9zZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7IkJpdE1hcFRvUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVFkX0JpdE1hcFRvUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBCaXRNYXBQdHIgYk1hcCkgLT4gTm9uZSIpfSwKLQl7IlJnblRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVFkX1JnblRvSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBIYW5kbGUgZmxhdHRlbmVkUmduRGF0YUhkbCkgLT4gTm9uZSIpfSwKLQl7IkRpc3Bvc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY0NvcHlSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjQ29weVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7IlNldEVtcHR5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEVtcHR5UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiTWFjU2V0UmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNTZXRSZWN0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IE5vbmUiKX0sCi0JeyJSZWN0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1JlY3RSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7Ik1hY09mZnNldFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNPZmZzZXRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7Ikluc2V0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0luc2V0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJTZWN0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1NlY3RSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY1VuaW9uUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1VuaW9uUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJEaWZmUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0RpZmZSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY1hvclJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNYb3JSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7IlJlY3RJblJnbiIsIChQeUNGdW5jdGlvbilRZF9SZWN0SW5SZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUmduSGFuZGxlIHJnbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik1hY0VxdWFsUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0VxdWFsUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduQSwgUmduSGFuZGxlIHJnbkIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJFbXB0eVJnbiIsIChQeUNGdW5jdGlvbilRZF9FbXB0eVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik1hY0ZyYW1lUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZyYW1lUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiTWFjUGFpbnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjUGFpbnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJFcmFzZVJnbiIsIChQeUNGdW5jdGlvbilRZF9FcmFzZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY0ludmVydFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNJbnZlcnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJNYWNGaWxsUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZpbGxSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiU2Nyb2xsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9TY3JvbGxSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdiwgUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKLQl7IkNvcHlCaXRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlCaXRzLCAxLAotCSBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgQml0TWFwUHRyIGRzdEJpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0LCBzaG9ydCBtb2RlLCBSZ25IYW5kbGUgbWFza1JnbikgLT4gTm9uZSIpfSwKLQl7IkNvcHlNYXNrIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlNYXNrLCAxLAotCSBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgQml0TWFwUHRyIG1hc2tCaXRzLCBCaXRNYXBQdHIgZHN0Qml0cywgUmVjdCBzcmNSZWN0LCBSZWN0IG1hc2tSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCi0JeyJPcGVuUGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9PcGVuUGljdHVyZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBwaWNGcmFtZSkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAotCXsiUGljQ29tbWVudCIsIChQeUNGdW5jdGlvbilRZF9QaWNDb21tZW50LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBraW5kLCBzaG9ydCBkYXRhU2l6ZSwgSGFuZGxlIGRhdGFIYW5kbGUpIC0+IE5vbmUiKX0sCi0JeyJDbG9zZVBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfQ2xvc2VQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEcmF3UGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9EcmF3UGljdHVyZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGljSGFuZGxlIG15UGljdHVyZSwgUmVjdCBkc3RSZWN0KSAtPiBOb25lIil9LAotCXsiS2lsbFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfS2lsbFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBteVBpY3R1cmUpIC0+IE5vbmUiKX0sCi0JeyJPcGVuUG9seSIsIChQeUNGdW5jdGlvbilRZF9PcGVuUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9seUhhbmRsZSBfcnYpIil9LAotCXsiQ2xvc2VQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0Nsb3NlUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiS2lsbFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfS2lsbFBvbHksIDEsCi0JIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSkgLT4gTm9uZSIpfSwKLQl7Ik9mZnNldFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfT2Zmc2V0UG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJGcmFtZVBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJQYWludFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJFcmFzZVBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJJbnZlcnRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydFBvbHksIDEsCi0JIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSkgLT4gTm9uZSIpfSwKLQl7IkZpbGxQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHksIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiU2V0UHQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UHQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChQb2ludCBwdCkiKX0sCi0JeyJMb2NhbFRvR2xvYmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0xvY2FsVG9HbG9iYWwsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0KSAtPiAoUG9pbnQgcHQpIil9LAotCXsiR2xvYmFsVG9Mb2NhbCIsIChQeUNGdW5jdGlvbilRZF9HbG9iYWxUb0xvY2FsLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKFBvaW50IHB0KSIpfSwKLQl7IlJhbmRvbSIsIChQeUNGdW5jdGlvbilRZF9SYW5kb20sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJNYWNHZXRQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9NYWNHZXRQaXhlbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNjYWxlUHQiLCAoUHlDRnVuY3Rpb24pUWRfU2NhbGVQdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiAoUG9pbnQgcHQpIil9LAotCXsiTWFwUHQiLCAoUHlDRnVuY3Rpb24pUWRfTWFwUHQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKFBvaW50IHB0KSIpfSwKLQl7Ik1hcFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFwUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKFJlY3QgcikiKX0sCi0JeyJNYXBSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFwUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKLQl7Ik1hcFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfTWFwUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKLQl7IlN0ZEJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfU3RkQml0cywgMSwKLQkgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0LCBzaG9ydCBtb2RlLCBSZ25IYW5kbGUgbWFza1JnbikgLT4gTm9uZSIpfSwKLQl7IkFkZFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX0FkZFB0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzcmMsIFBvaW50IGRzdCkgLT4gKFBvaW50IGRzdCkiKX0sCi0JeyJFcXVhbFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VxdWFsUHQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0MSwgUG9pbnQgcHQyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjUHRJblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjUHRJblJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJQdDJSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1B0MlJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0MSwgUG9pbnQgcHQyKSAtPiAoUmVjdCBkc3RSZWN0KSIpfSwKLQl7IlB0VG9BbmdsZSIsIChQeUNGdW5jdGlvbilRZF9QdFRvQW5nbGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUG9pbnQgcHQpIC0+IChzaG9ydCBhbmdsZSkiKX0sCi0JeyJTdWJQdCIsIChQeUNGdW5jdGlvbilRZF9TdWJQdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3JjLCBQb2ludCBkc3QpIC0+IChQb2ludCBkc3QpIil9LAotCXsiUHRJblJnbiIsIChQeUNGdW5jdGlvbilRZF9QdEluUmduLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgUmduSGFuZGxlIHJnbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik5ld1BpeE1hcCIsIChQeUNGdW5jdGlvbilRZF9OZXdQaXhNYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAotCXsiRGlzcG9zZVBpeE1hcCIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlUGl4TWFwLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCi0JeyJDb3B5UGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlQaXhNYXAsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmNQTSwgUGl4TWFwSGFuZGxlIGRzdFBNKSAtPiBOb25lIil9LAotCXsiTmV3UGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX05ld1BpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCi0JeyJEaXNwb3NlUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkNvcHlQaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfQ29weVBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHNyY1BQLCBQaXhQYXRIYW5kbGUgZHN0UFApIC0+IE5vbmUiKX0sCi0JeyJQZW5QaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfUGVuUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJCYWNrUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0JhY2tQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkdldFBpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBhdElEKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCi0JeyJNYWtlUkdCUGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX01ha2VSR0JQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcCwgUkdCQ29sb3IgbXlDb2xvcikgLT4gTm9uZSIpfSwKLQl7IkZpbGxDUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAotCXsiRmlsbENPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJGaWxsQ1JvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1JvdW5kUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQsIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkZpbGxDQXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDQXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlLCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJGaWxsQ1JnbiIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAotCXsiRmlsbENQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJSR0JGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUkdCRm9yZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IlJHQkJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilRZF9SR0JCYWNrQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJHQkNvbG9yIGNvbG9yKSAtPiBOb25lIil9LAotCXsiU2V0Q1BpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldENQaXhlbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdiwgUkdCQ29sb3IgY1BpeCkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRQaXgiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UG9ydFBpeCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAotCXsiR2V0Q1BpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENQaXhlbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gKFJHQkNvbG9yIGNQaXgpIil9LAotCXsiR2V0Rm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEZvcmVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgY29sb3IpIil9LAotCXsiR2V0QmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEJhY2tDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgY29sb3IpIil9LAotCXsiT3BDb2xvciIsIChQeUNGdW5jdGlvbilRZF9PcENvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IkhpbGl0ZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0hpbGl0ZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IkRpc3Bvc2VDVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZUNUYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjVGFibGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q1RhYmxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjdElEKSAtPiAoQ1RhYkhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9HZXRDQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjcnNySUQpIC0+IChDQ3JzckhhbmRsZSBfcnYpIil9LAotCXsiU2V0Q0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9TZXRDQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihDQ3JzckhhbmRsZSBjQ3JzcikgLT4gTm9uZSIpfSwKLQl7IkFsbG9jQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0FsbG9jQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlQ0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlQ0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQ0Nyc3JIYW5kbGUgY0Nyc3IpIC0+IE5vbmUiKX0sCi0JeyJHZXRNYXhEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TWF4RGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGdsb2JhbFJlY3QpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q1RTZWVkIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENUU2VlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0RGV2aWNlTGlzdCIsIChQeUNGdW5jdGlvbilRZF9HZXREZXZpY2VMaXN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiR2V0TWFpbkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXRNYWluRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiR2V0TmV4dERldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXROZXh0RGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBjdXJEZXZpY2UpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiVGVzdERldmljZUF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilRZF9UZXN0RGV2aWNlQXR0cmlidXRlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIHNob3J0IGF0dHJpYnV0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldERldmljZUF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilRZF9TZXREZXZpY2VBdHRyaWJ1dGUsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCwgc2hvcnQgYXR0cmlidXRlLCBCb29sZWFuIHZhbHVlKSAtPiBOb25lIil9LAotCXsiSW5pdEdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfSW5pdEdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHFkUmVmTnVtLCBsb25nIG1vZGUsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKLQl7Ik5ld0dEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTmV3R0RldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtLCBsb25nIG1vZGUpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiRGlzcG9zZUdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZUdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKLQl7IlNldEdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfU2V0R0RldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2QpIC0+IE5vbmUiKX0sCi0JeyJHZXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCi0JeyJDb2xvcjJJbmRleCIsIChQeUNGdW5jdGlvbilRZF9Db2xvcjJJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3IgbXlDb2xvcikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkluZGV4MkNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0luZGV4MkNvbG9yLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4KSAtPiAoUkdCQ29sb3IgYUNvbG9yKSIpfSwKLQl7IkludmVydENvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBteUNvbG9yKSIpfSwKLQl7IlJlYWxDb2xvciIsIChQeUNGdW5jdGlvbilRZF9SZWFsQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJHQkNvbG9yIGNvbG9yKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0U3ViVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0U3ViVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgbXlDb2xvcnMsIHNob3J0IGlUYWJSZXMsIENUYWJIYW5kbGUgdGFyZ2V0VGJsKSAtPiBOb25lIil9LAotCXsiTWFrZUlUYWJsZSIsIChQeUNGdW5jdGlvbilRZF9NYWtlSVRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDVGFiSGFuZGxlIGNUYWJILCBJVGFiSGFuZGxlIGlUYWJILCBzaG9ydCByZXMpIC0+IE5vbmUiKX0sCi0JeyJTZXRDbGllbnRJRCIsIChQeUNGdW5jdGlvbilRZF9TZXRDbGllbnRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaWQpIC0+IE5vbmUiKX0sCi0JeyJQcm90ZWN0RW50cnkiLCAoUHlDRnVuY3Rpb24pUWRfUHJvdGVjdEVudHJ5LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgQm9vbGVhbiBwcm90ZWN0KSAtPiBOb25lIil9LAotCXsiUmVzZXJ2ZUVudHJ5IiwgKFB5Q0Z1bmN0aW9uKVFkX1Jlc2VydmVFbnRyeSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIEJvb2xlYW4gcmVzZXJ2ZSkgLT4gTm9uZSIpfSwKLQl7IlFERXJyb3IiLCAoUHlDRnVuY3Rpb24pUWRfUURFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkNvcHlEZWVwTWFzayIsIChQeUNGdW5jdGlvbilRZF9Db3B5RGVlcE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBzcmNCaXRzLCBCaXRNYXBQdHIgbWFza0JpdHMsIEJpdE1hcFB0ciBkc3RCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgbWFza1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCi0JeyJHZXRQYXR0ZXJuIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBhdHRlcm4sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBhdHRlcm5JRCkgLT4gKFBhdEhhbmRsZSBfcnYpIil9LAotCXsiTWFjR2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0dldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY3Vyc29ySUQpIC0+IChDdXJzSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBpY3R1cmVJRCkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAotCXsiRGVsdGFQb2ludCIsIChQeUNGdW5jdGlvbilRZF9EZWx0YVBvaW50LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdEEsIFBvaW50IHB0QikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IlNoaWVsZEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9TaGllbGRDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgc2hpZWxkUmVjdCwgUG9pbnQgb2Zmc2V0UHQpIC0+IE5vbmUiKX0sCi0JeyJTY3JlZW5SZXMiLCAoUHlDRnVuY3Rpb24pUWRfU2NyZWVuUmVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBzY3JuSFJlcywgc2hvcnQgc2NyblZSZXMpIil9LAotCXsiR2V0SW5kUGF0dGVybiIsIChQeUNGdW5jdGlvbilRZF9HZXRJbmRQYXR0ZXJuLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBwYXR0ZXJuTGlzdElELCBzaG9ydCBpbmRleCkgLT4gKFBhdHRlcm4gdGhlUGF0KSIpfSwKLQl7IlNsb3BlRnJvbUFuZ2xlIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nsb3BlRnJvbUFuZ2xlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBhbmdsZSkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJBbmdsZUZyb21TbG9wZSIsIChQeUNGdW5jdGlvbilRZF9BbmdsZUZyb21TbG9wZSwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgc2xvcGUpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UGl4Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBpeE1hcCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IkdldFBpeERlcHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeERlcHRoLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcGl4TWFwKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFFER2xvYmFsc1JhbmRvbVNlZWQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzUmFuZG9tU2VlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0UURHbG9iYWxzU2NyZWVuQml0cyIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNTY3JlZW5CaXRzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCaXRNYXAgc2NyZWVuQml0cykiKX0sCi0JeyJHZXRRREdsb2JhbHNBcnJvdyIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNBcnJvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ3Vyc29yIGFycm93KSIpfSwKLQl7IkdldFFER2xvYmFsc0RhcmtHcmF5IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0RhcmtHcmF5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGRrR3JheSkiKX0sCi0JeyJHZXRRREdsb2JhbHNMaWdodEdyYXkiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzTGlnaHRHcmF5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGx0R3JheSkiKX0sCi0JeyJHZXRRREdsb2JhbHNHcmF5IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0dyYXksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gZ3JheSkiKX0sCi0JeyJHZXRRREdsb2JhbHNCbGFjayIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNCbGFjaywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBibGFjaykiKX0sCi0JeyJHZXRRREdsb2JhbHNXaGl0ZSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNXaGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiB3aGl0ZSkiKX0sCi0JeyJHZXRRREdsb2JhbHNUaGVQb3J0IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc1RoZVBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0JeyJTZXRRREdsb2JhbHNSYW5kb21TZWVkIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFFER2xvYmFsc1JhbmRvbVNlZWQsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgcmFuZG9tU2VlZCkgLT4gTm9uZSIpfSwKLQl7IlNldFFER2xvYmFsc0Fycm93IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFFER2xvYmFsc0Fycm93LCAxLAotCSBQeURvY19TVFIoIihDdXJzb3IgYXJyb3cpIC0+IE5vbmUiKX0sCi0JeyJHZXRSZWdpb25Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UmVnaW9uQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiSXNSZWdpb25SZWN0YW5ndWxhciIsIChQeUNGdW5jdGlvbilRZF9Jc1JlZ2lvblJlY3Rhbmd1bGFyLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ3JlYXRlTmV3UG9ydCIsIChQeUNGdW5jdGlvbilRZF9DcmVhdGVOZXdQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAotCXsiU2V0UURFcnJvciIsIChQeUNGdW5jdGlvbilRZF9TZXRRREVycm9yLCAxLAotCSBQeURvY19TVFIoIihPU0VyciBlcnIpIC0+IE5vbmUiKX0sCi0JeyJMTUdldFNjclZSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRTY3JWUmVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkxNU2V0U2NyVlJlcyIsIChQeUNGdW5jdGlvbilRZF9MTVNldFNjclZSZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0U2NySFJlcyIsIChQeUNGdW5jdGlvbilRZF9MTUdldFNjckhSZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiTE1TZXRTY3JIUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0U2NySFJlcywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRNYWluRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0TWFpbkRldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0TWFpbkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldE1haW5EZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXREZXZpY2VMaXN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0RGV2aWNlTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0RGV2aWNlTGlzdCIsIChQeUNGdW5jdGlvbilRZF9MTVNldERldmljZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRRRENvbG9ycyIsIChQeUNGdW5jdGlvbilRZF9MTUdldFFEQ29sb3JzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0UURDb2xvcnMiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRRRENvbG9ycywgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRXaWR0aExpc3RIYW5kIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0V2lkdGhMaXN0SGFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJMTVNldFdpZHRoTGlzdEhhbmQiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRXaWR0aExpc3RIYW5kLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEhpbGl0ZU1vZGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRIaWxpdGVNb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAotCXsiTE1TZXRIaWxpdGVNb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0SGlsaXRlTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDggdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldFdpZHRoVGFiSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0V2lkdGhUYWJIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiTE1TZXRXaWR0aFRhYkhhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldFdpZHRoVGFiSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldExhc3RTUEV4dHJhIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0TGFzdFNQRXh0cmEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAotCXsiTE1TZXRMYXN0U1BFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9MTVNldExhc3RTUEV4dHJhLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldExhc3RGT05EIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0TGFzdEZPTkQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiTE1TZXRMYXN0Rk9ORCIsIChQeUNGdW5jdGlvbilRZF9MTVNldExhc3RGT05ELCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEZyYWN0RW5hYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0RnJhY3RFbmFibGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCi0JeyJMTVNldEZyYWN0RW5hYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0RnJhY3RFbmFibGUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRUaGVHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0VGhlR0RldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0VGhlR0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldFRoZUdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRIaWxpdGVSR0IiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRIaWxpdGVSR0IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlKSIpfSwKLQl7IkxNU2V0SGlsaXRlUkdCIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0SGlsaXRlUkdCLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBoaWxpdGVSR0JWYWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0Q3Vyc29yTmV3IiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0Q3Vyc29yTmV3LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJMTVNldEN1cnNvck5ldyIsIChQeUNGdW5jdGlvbilRZF9MTVNldEN1cnNvck5ldywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IlRleHRGb250IiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRGb250LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBmb250KSAtPiBOb25lIil9LAotCXsiVGV4dEZhY2UiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dEZhY2UsIDEsCi0JIFB5RG9jX1NUUigiKFN0eWxlUGFyYW1ldGVyIGZhY2UpIC0+IE5vbmUiKX0sCi0JeyJUZXh0TW9kZSIsIChQeUNGdW5jdGlvbilRZF9UZXh0TW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSkgLT4gTm9uZSIpfSwKLQl7IlRleHRTaXplIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRTaXplLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzaXplKSAtPiBOb25lIil9LAotCXsiU3BhY2VFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9TcGFjZUV4dHJhLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBleHRyYSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdDaGFyIiwgKFB5Q0Z1bmN0aW9uKVFkX0RyYXdDaGFyLCAxLAotCSBQeURvY19TVFIoIihDaGFyUGFyYW1ldGVyIGNoKSAtPiBOb25lIil9LAotCXsiRHJhd1N0cmluZyIsIChQeUNGdW5jdGlvbilRZF9EcmF3U3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcykgLT4gTm9uZSIpfSwKLQl7Ik1hY0RyYXdUZXh0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0RyYXdUZXh0LCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dEJ1Ziwgc2hvcnQgZmlyc3RCeXRlLCBzaG9ydCBieXRlQ291bnQpIC0+IE5vbmUiKX0sCi0JeyJDaGFyV2lkdGgiLCAoUHlDRnVuY3Rpb24pUWRfQ2hhcldpZHRoLCAxLAotCSBQeURvY19TVFIoIihDaGFyUGFyYW1ldGVyIGNoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlN0cmluZ1dpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX1N0cmluZ1dpZHRoLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcykgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJUZXh0V2lkdGgiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dFdpZHRoLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dEJ1Ziwgc2hvcnQgZmlyc3RCeXRlLCBzaG9ydCBieXRlQ291bnQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0Rm9udEluZm8iLCAoUHlDRnVuY3Rpb24pUWRfR2V0Rm9udEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZvbnRJbmZvIGluZm8pIil9LAotCXsiQ2hhckV4dHJhIiwgKFB5Q0Z1bmN0aW9uKVFkX0NoYXJFeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgZXh0cmEpIC0+IE5vbmUiKX0sCi0JeyJUcnVuY1N0cmluZyIsIChQeUNGdW5jdGlvbilRZF9UcnVuY1N0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgd2lkdGgsIFN0cjI1NSB0aGVTdHJpbmcsIFRydW5jQ29kZSB0cnVuY1doZXJlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldFBvcnQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhZlB0ciB0aGVQb3J0KSAtPiBOb25lIil9LAotCXsiR2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY3Vyc29ySUQpIC0+IChDdXJzSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihDdXJzb3IgY3JzcikgLT4gTm9uZSIpfSwKLQl7IlNob3dDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2hvd0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiTGluZVRvIiwgKFB5Q0Z1bmN0aW9uKVFkX0xpbmVUbywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gTm9uZSIpfSwKLQl7IlNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiAoUmVjdCByKSIpfSwKLQl7Ik9mZnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfT2Zmc2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAotCXsiSW5zZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0luc2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAotCXsiVW5pb25SZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1VuaW9uUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBzcmMxLCBSZWN0IHNyYzIpIC0+IChSZWN0IGRzdFJlY3QpIil9LAotCXsiRXF1YWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VxdWFsUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByZWN0MSwgUmVjdCByZWN0MikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkZyYW1lUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZVJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7IkludmVydFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiRmlsbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCi0JeyJDb3B5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ24sIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJTZXRSZWN0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFJlY3RSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGxlZnQsIHNob3J0IHRvcCwgc2hvcnQgcmlnaHQsIHNob3J0IGJvdHRvbSkgLT4gTm9uZSIpfSwKLQl7Ik9mZnNldFJnbiIsIChQeUNGdW5jdGlvbilRZF9PZmZzZXRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7IlVuaW9uUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1VuaW9uUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJYb3JSZ24iLCAoUHlDRnVuY3Rpb24pUWRfWG9yUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJFcXVhbFJnbiIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbkEsIFJnbkhhbmRsZSByZ25CKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiRnJhbWVSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJQYWludFJnbiIsIChQeUNGdW5jdGlvbilRZF9QYWludFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7IkludmVydFJnbiIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJGaWxsUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiR2V0UGl4ZWwiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGl4ZWwsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJQdEluUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QdEluUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJlY3QgcikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkRyYXdUZXh0IiwgKFB5Q0Z1bmN0aW9uKVFkX0RyYXdUZXh0LCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dEJ1Ziwgc2hvcnQgZmlyc3RCeXRlLCBzaG9ydCBieXRlQ291bnQpIC0+IE5vbmUiKX0sCi0JeyJCaXRNYXAiLCAoUHlDRnVuY3Rpb24pUWRfQml0TWFwLCAxLAotCSBQeURvY19TVFIoIlRha2UgKHN0cmluZywgaW50LCBSZWN0KSBhcmd1bWVudCBhbmQgY3JlYXRlIEJpdE1hcCIpfSwKLQl7IlJhd0JpdE1hcCIsIChQeUNGdW5jdGlvbilRZF9SYXdCaXRNYXAsIDEsCi0JIFB5RG9jX1NUUigiVGFrZSBzdHJpbmcgQml0TWFwIGFuZCB0dXJuIGludG8gQml0TWFwIG9iamVjdCIpfSwKKyAgICB7IkdldFBvcnQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR3JhZlB0ciBwb3J0KSIpfSwKKyAgICB7IkdyYWZEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR3JhZkRldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydEJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UG9ydEJpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBibSkgLT4gTm9uZSIpfSwKKyAgICB7IlBvcnRTaXplIiwgKFB5Q0Z1bmN0aW9uKVFkX1BvcnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB3aWR0aCwgc2hvcnQgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiTW92ZVBvcnRUbyIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlUG9ydFRvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBsZWZ0R2xvYmFsLCBzaG9ydCB0b3BHbG9iYWwpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRPcmlnaW4iLCAoUHlDRnVuY3Rpb24pUWRfU2V0T3JpZ2luLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAorICAgIHsiU2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRZF9TZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRZF9HZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiQ2xpcFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfQ2xpcFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkJhY2tQYXQiLCAoUHlDRnVuY3Rpb24pUWRfQmFja1BhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJJbml0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0luaXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1NldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9NYWNTZXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEN1cnNvciBjcnNyKSAtPiBOb25lIil9LAorICAgIHsiSGlkZUN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9IaWRlQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNTaG93Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1Nob3dDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ik9ic2N1cmVDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfT2JzY3VyZUN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlkZVBlbiIsIChQeUNGdW5jdGlvbilRZF9IaWRlUGVuLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTaG93UGVuIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nob3dQZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFBlbiIsIChQeUNGdW5jdGlvbilRZF9HZXRQZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IHB0KSIpfSwKKyAgICB7IkdldFBlblN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBlblN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQZW5TdGF0ZSBwblN0YXRlKSIpfSwKKyAgICB7IlNldFBlblN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBlblN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQZW5TdGF0ZSBwblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiUGVuU2l6ZSIsIChQeUNGdW5jdGlvbilRZF9QZW5TaXplLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB3aWR0aCwgc2hvcnQgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiUGVuTW9kZSIsIChQeUNGdW5jdGlvbilRZF9QZW5Nb2RlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiUGVuUGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJQZW5Ob3JtYWwiLCAoUHlDRnVuY3Rpb24pUWRfUGVuTm9ybWFsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJNb3ZlVG8iLCAoUHlDRnVuY3Rpb24pUWRfTW92ZVRvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAorICAgIHsiTW92ZSIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNMaW5lVG8iLCAoUHlDRnVuY3Rpb24pUWRfTWFjTGluZVRvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAorICAgIHsiTGluZSIsIChQeUNGdW5jdGlvbilRZF9MaW5lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfRm9yZUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGNvbG9yKSAtPiBOb25lIil9LAorICAgIHsiQmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0JhY2tDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBjb2xvcikgLT4gTm9uZSIpfSwKKyAgICB7IkNvbG9yQml0IiwgKFB5Q0Z1bmN0aW9uKVFkX0NvbG9yQml0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB3aGljaEJpdCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1NldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2V0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiAoUmVjdCByKSIpfSwKKyAgICB7Ik1hY09mZnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjT2Zmc2V0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAorICAgIHsiTWFjSW5zZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0luc2V0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAorICAgIHsiU2VjdFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2VjdFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3QgZHN0UmVjdCkiKX0sCisgICAgeyJNYWNVbmlvblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjVW5pb25SZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNyYzEsIFJlY3Qgc3JjMikgLT4gKFJlY3QgZHN0UmVjdCkiKX0sCisgICAgeyJNYWNFcXVhbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjRXF1YWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJlY3QxLCBSZWN0IHJlY3QyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRW1wdHlSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VtcHR5UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTWFjRnJhbWVSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZyYW1lUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiRXJhc2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiTWFjSW52ZXJ0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNJbnZlcnRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNGaWxsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNGaWxsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IkZyYW1lT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZU92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IlBhaW50T3ZhbCIsIChQeUNGdW5jdGlvbilRZF9QYWludE92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkVyYXNlT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9FcmFzZU92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkludmVydE92YWwiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0T3ZhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiRmlsbE92YWwiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbE92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgciwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJGcmFtZVJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZVJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJQYWludFJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QYWludFJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJFcmFzZVJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9FcmFzZVJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJJbnZlcnRSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0Um91bmRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbFJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAorICAgIHsiRnJhbWVBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVBcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUpIC0+IE5vbmUiKX0sCisgICAgeyJQYWludEFyYyIsIChQeUNGdW5jdGlvbilRZF9QYWludEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkVyYXNlQXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlQXJjLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAorICAgIHsiSW52ZXJ0QXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTmV3UmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik9wZW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfT3BlblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ2xvc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfQ2xvc2VSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJCaXRNYXBUb1JlZ2lvbiIsIChQeUNGdW5jdGlvbilRZF9CaXRNYXBUb1JlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbiwgQml0TWFwUHRyIGJNYXApIC0+IE5vbmUiKX0sCisgICAgeyJSZ25Ub0hhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9SZ25Ub0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbiwgSGFuZGxlIGZsYXR0ZW5lZFJnbkRhdGFIZGwpIC0+IE5vbmUiKX0sCisgICAgeyJEaXNwb3NlUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNDb3B5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0NvcHlSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ24sIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRFbXB0eVJnbiIsIChQeUNGdW5jdGlvbilRZF9TZXRFbXB0eVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1NldFJlY3RSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2V0UmVjdFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiBOb25lIil9LAorICAgIHsiUmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9SZWN0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNPZmZzZXRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjT2Zmc2V0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNldFJnbiIsIChQeUNGdW5jdGlvbilRZF9JbnNldFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiU2VjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9TZWN0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNVbmlvblJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNVbmlvblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiRGlmZlJnbiIsIChQeUNGdW5jdGlvbilRZF9EaWZmUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNYb3JSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjWG9yUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJSZWN0SW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfUmVjdEluUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNFcXVhbFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNFcXVhbFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbkEsIFJnbkhhbmRsZSByZ25CKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRW1wdHlSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRW1wdHlSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNGcmFtZVJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNGcmFtZVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1BhaW50UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1BhaW50UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiRXJhc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNJbnZlcnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjSW52ZXJ0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiTWFjRmlsbFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNGaWxsUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNjcm9sbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2Nyb2xsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYsIFJnbkhhbmRsZSB1cGRhdGVSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5Qml0cyIsIChQeUNGdW5jdGlvbilRZF9Db3B5Qml0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIEJpdE1hcFB0ciBkc3RCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5TWFzayIsIChQeUNGdW5jdGlvbilRZF9Db3B5TWFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIEJpdE1hcFB0ciBtYXNrQml0cywgQml0TWFwUHRyIGRzdEJpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBtYXNrUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiBOb25lIil9LAorICAgIHsiT3BlblBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfT3BlblBpY3R1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcGljRnJhbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlBpY0NvbW1lbnQiLCAoUHlDRnVuY3Rpb24pUWRfUGljQ29tbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQga2luZCwgc2hvcnQgZGF0YVNpemUsIEhhbmRsZSBkYXRhSGFuZGxlKSAtPiBOb25lIil9LAorICAgIHsiQ2xvc2VQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Nsb3NlUGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfRHJhd1BpY3R1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBteVBpY3R1cmUsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IktpbGxQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0tpbGxQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihQaWNIYW5kbGUgbXlQaWN0dXJlKSAtPiBOb25lIil9LAorICAgIHsiT3BlblBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfT3BlblBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvbHlIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkNsb3NlUG9seSIsIChQeUNGdW5jdGlvbilRZF9DbG9zZVBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IktpbGxQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0tpbGxQb2x5LCAxLAorICAgICBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCisgICAgeyJPZmZzZXRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX09mZnNldFBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiRnJhbWVQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50UG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiRXJhc2VQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiSW52ZXJ0UG9seSIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRQb2x5LCAxLAorICAgICBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsUG9seSIsIChQeUNGdW5jdGlvbilRZF9GaWxsUG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFB0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiAoUG9pbnQgcHQpIil9LAorICAgIHsiTG9jYWxUb0dsb2JhbCIsIChQeUNGdW5jdGlvbilRZF9Mb2NhbFRvR2xvYmFsLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKFBvaW50IHB0KSIpfSwKKyAgICB7Ikdsb2JhbFRvTG9jYWwiLCAoUHlDRnVuY3Rpb24pUWRfR2xvYmFsVG9Mb2NhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChQb2ludCBwdCkiKX0sCisgICAgeyJSYW5kb20iLCAoUHlDRnVuY3Rpb24pUWRfUmFuZG9tLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiTWFjR2V0UGl4ZWwiLCAoUHlDRnVuY3Rpb24pUWRfTWFjR2V0UGl4ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTY2FsZVB0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NjYWxlUHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKFBvaW50IHB0KSIpfSwKKyAgICB7Ik1hcFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFB0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChQb2ludCBwdCkiKX0sCisgICAgeyJNYXBSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgciwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChSZWN0IHIpIil9LAorICAgIHsiTWFwUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJNYXBQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJTdGRCaXRzIiwgKFB5Q0Z1bmN0aW9uKVFkX1N0ZEJpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBzcmNCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJBZGRQdCIsIChQeUNGdW5jdGlvbilRZF9BZGRQdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3JjLCBQb2ludCBkc3QpIC0+IChQb2ludCBkc3QpIil9LAorICAgIHsiRXF1YWxQdCIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFB0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdDEsIFBvaW50IHB0MikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ik1hY1B0SW5SZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1B0SW5SZWN0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgUmVjdCByKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUHQyUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QdDJSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdDEsIFBvaW50IHB0MikgLT4gKFJlY3QgZHN0UmVjdCkiKX0sCisgICAgeyJQdFRvQW5nbGUiLCAoUHlDRnVuY3Rpb24pUWRfUHRUb0FuZ2xlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBvaW50IHB0KSAtPiAoc2hvcnQgYW5nbGUpIil9LAorICAgIHsiU3ViUHQiLCAoUHlDRnVuY3Rpb24pUWRfU3ViUHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHNyYywgUG9pbnQgZHN0KSAtPiAoUG9pbnQgZHN0KSIpfSwKKyAgICB7IlB0SW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfUHRJblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJOZXdQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUWRfTmV3UGl4TWFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRpc3Bvc2VQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZVBpeE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAorICAgIHsiQ29weVBpeE1hcCIsIChQeUNGdW5jdGlvbilRZF9Db3B5UGl4TWFwLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjUE0sIFBpeE1hcEhhbmRsZSBkc3RQTSkgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld1BpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9OZXdQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAorICAgIHsiRGlzcG9zZVBpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5UGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBzcmNQUCwgUGl4UGF0SGFuZGxlIGRzdFBQKSAtPiBOb25lIil9LAorICAgIHsiUGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiQmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9CYWNrUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJHZXRQaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwYXRJRCkgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAorICAgIHsiTWFrZVJHQlBhdCIsIChQeUNGdW5jdGlvbilRZF9NYWtlUkdCUGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHAsIFJHQkNvbG9yIG15Q29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsQ1JlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxDT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ092YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgciwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiRmlsbENSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSb3VuZFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0LCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsQ0FyYyIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ0FyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiRmlsbENSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxDUG9seSIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1BvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiUkdCRm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1JHQkZvcmVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJSR0JCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUkdCQmFja0NvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKKyAgICB7IlNldENQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9TZXRDUGl4ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYsIFJHQkNvbG9yIGNQaXgpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0UGl4IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBvcnRQaXgsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9HZXRDUGl4ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChSR0JDb2xvciBjUGl4KSIpfSwKKyAgICB7IkdldEZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9HZXRGb3JlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKKyAgICB7IkdldEJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilRZF9HZXRCYWNrQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKKyAgICB7Ik9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfT3BDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJIaWxpdGVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9IaWxpdGVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJEaXNwb3NlQ1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VDVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY1RhYmxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY3RJRCkgLT4gKENUYWJIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldENDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY3JzcklEKSAtPiAoQ0Nyc3JIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldENDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0Nyc3JIYW5kbGUgY0Nyc3IpIC0+IE5vbmUiKX0sCisgICAgeyJBbGxvY0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9BbGxvY0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRGlzcG9zZUNDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZUNDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKENDcnNySGFuZGxlIGNDcnNyKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWF4RGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldE1heERldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0KSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldENUU2VlZCIsIChQeUNGdW5jdGlvbilRZF9HZXRDVFNlZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldERldmljZUxpc3QiLCAoUHlDRnVuY3Rpb24pUWRfR2V0RGV2aWNlTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE1haW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TWFpbkRldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE5leHREZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TmV4dERldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgY3VyRGV2aWNlKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRlc3REZXZpY2VBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUWRfVGVzdERldmljZUF0dHJpYnV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBzaG9ydCBhdHRyaWJ1dGUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXREZXZpY2VBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUWRfU2V0RGV2aWNlQXR0cmlidXRlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIHNob3J0IGF0dHJpYnV0ZSwgQm9vbGVhbiB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkluaXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0luaXRHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBxZFJlZk51bSwgbG9uZyBtb2RlLCBHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX05ld0dEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgbG9uZyBtb2RlKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRpc3Bvc2VHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEdEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkKSAtPiBOb25lIil9LAorICAgIHsiR2V0R0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXRHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAorICAgIHsiQ29sb3IySW5kZXgiLCAoUHlDRnVuY3Rpb24pUWRfQ29sb3IySW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIG15Q29sb3IpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJJbmRleDJDb2xvciIsIChQeUNGdW5jdGlvbilRZF9JbmRleDJDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKFJHQkNvbG9yIGFDb2xvcikiKX0sCisgICAgeyJJbnZlcnRDb2xvciIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgbXlDb2xvcikiKX0sCisgICAgeyJSZWFsQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUmVhbENvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldFN1YlRhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFN1YlRhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihDVGFiSGFuZGxlIG15Q29sb3JzLCBzaG9ydCBpVGFiUmVzLCBDVGFiSGFuZGxlIHRhcmdldFRibCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1ha2VJVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfTWFrZUlUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjVGFiSCwgSVRhYkhhbmRsZSBpVGFiSCwgc2hvcnQgcmVzKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q2xpZW50SUQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q2xpZW50SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGlkKSAtPiBOb25lIil9LAorICAgIHsiUHJvdGVjdEVudHJ5IiwgKFB5Q0Z1bmN0aW9uKVFkX1Byb3RlY3RFbnRyeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIEJvb2xlYW4gcHJvdGVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlJlc2VydmVFbnRyeSIsIChQeUNGdW5jdGlvbilRZF9SZXNlcnZlRW50cnksIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBCb29sZWFuIHJlc2VydmUpIC0+IE5vbmUiKX0sCisgICAgeyJRREVycm9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1FERXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJDb3B5RGVlcE1hc2siLCAoUHlDRnVuY3Rpb24pUWRfQ29weURlZXBNYXNrLCAxLAorICAgICBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgQml0TWFwUHRyIG1hc2tCaXRzLCBCaXRNYXBQdHIgZHN0Qml0cywgUmVjdCBzcmNSZWN0LCBSZWN0IG1hc2tSZWN0LCBSZWN0IGRzdFJlY3QsIHNob3J0IG1vZGUsIFJnbkhhbmRsZSBtYXNrUmduKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGF0dGVybiIsIChQeUNGdW5jdGlvbilRZF9HZXRQYXR0ZXJuLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwYXR0ZXJuSUQpIC0+IChQYXRIYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1hY0dldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9NYWNHZXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGN1cnNvcklEKSAtPiAoQ3Vyc0hhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9HZXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwaWN0dXJlSUQpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRlbHRhUG9pbnQiLCAoUHlDRnVuY3Rpb24pUWRfRGVsdGFQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHRBLCBQb2ludCBwdEIpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJTaGllbGRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2hpZWxkQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNoaWVsZFJlY3QsIFBvaW50IG9mZnNldFB0KSAtPiBOb25lIil9LAorICAgIHsiU2NyZWVuUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX1NjcmVlblJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgc2NybkhSZXMsIHNob3J0IHNjcm5WUmVzKSIpfSwKKyAgICB7IkdldEluZFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pUWRfR2V0SW5kUGF0dGVybiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcGF0dGVybkxpc3RJRCwgc2hvcnQgaW5kZXgpIC0+IChQYXR0ZXJuIHRoZVBhdCkiKX0sCisgICAgeyJTbG9wZUZyb21BbmdsZSIsIChQeUNGdW5jdGlvbilRZF9TbG9wZUZyb21BbmdsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgYW5nbGUpIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiQW5nbGVGcm9tU2xvcGUiLCAoUHlDRnVuY3Rpb24pUWRfQW5nbGVGcm9tU2xvcGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHNsb3BlKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBpeEJvdW5kcyIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwaXhNYXApIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJHZXRQaXhEZXB0aCIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhEZXB0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBpeE1hcCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRRREdsb2JhbHNSYW5kb21TZWVkIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc1JhbmRvbVNlZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldFFER2xvYmFsc1NjcmVlbkJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzU2NyZWVuQml0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQml0TWFwIHNjcmVlbkJpdHMpIil9LAorICAgIHsiR2V0UURHbG9iYWxzQXJyb3ciLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzQXJyb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEN1cnNvciBhcnJvdykiKX0sCisgICAgeyJHZXRRREdsb2JhbHNEYXJrR3JheSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNEYXJrR3JheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBka0dyYXkpIil9LAorICAgIHsiR2V0UURHbG9iYWxzTGlnaHRHcmF5IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0xpZ2h0R3JheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBsdEdyYXkpIil9LAorICAgIHsiR2V0UURHbG9iYWxzR3JheSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNHcmF5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGdyYXkpIil9LAorICAgIHsiR2V0UURHbG9iYWxzQmxhY2siLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzQmxhY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gYmxhY2spIil9LAorICAgIHsiR2V0UURHbG9iYWxzV2hpdGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzV2hpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gd2hpdGUpIil9LAorICAgIHsiR2V0UURHbG9iYWxzVGhlUG9ydCIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNUaGVQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAorICAgIHsiU2V0UURHbG9iYWxzUmFuZG9tU2VlZCIsIChQeUNGdW5jdGlvbilRZF9TZXRRREdsb2JhbHNSYW5kb21TZWVkLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHJhbmRvbVNlZWQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRRREdsb2JhbHNBcnJvdyIsIChQeUNGdW5jdGlvbilRZF9TZXRRREdsb2JhbHNBcnJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ3Vyc29yIGFycm93KSAtPiBOb25lIil9LAorICAgIHsiR2V0UmVnaW9uQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFJlZ2lvbkJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKFJlY3QgYm91bmRzKSIpfSwKKyAgICB7IklzUmVnaW9uUmVjdGFuZ3VsYXIiLCAoUHlDRnVuY3Rpb24pUWRfSXNSZWdpb25SZWN0YW5ndWxhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNyZWF0ZU5ld1BvcnQiLCAoUHlDRnVuY3Rpb24pUWRfQ3JlYXRlTmV3UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IlNldFFERXJyb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UURFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NFcnIgZXJyKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRTY3JWUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0U2NyVlJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJMTVNldFNjclZSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRTY3JWUmVzLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldFNjckhSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRTY3JIUmVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkxNU2V0U2NySFJlcyIsIChQeUNGdW5jdGlvbilRZF9MTVNldFNjckhSZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0TWFpbkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldE1haW5EZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldE1haW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRNYWluRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0RGV2aWNlTGlzdCIsIChQeUNGdW5jdGlvbilRZF9MTUdldERldmljZUxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldERldmljZUxpc3QiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXREZXZpY2VMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0UURDb2xvcnMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRRRENvbG9ycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldFFEQ29sb3JzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0UURDb2xvcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0V2lkdGhMaXN0SGFuZCIsIChQeUNGdW5jdGlvbilRZF9MTUdldFdpZHRoTGlzdEhhbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiTE1TZXRXaWR0aExpc3RIYW5kIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0V2lkdGhMaXN0SGFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRIaWxpdGVNb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0SGlsaXRlTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKKyAgICB7IkxNU2V0SGlsaXRlTW9kZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldEhpbGl0ZU1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRXaWR0aFRhYkhhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldFdpZHRoVGFiSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkxNU2V0V2lkdGhUYWJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRXaWR0aFRhYkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRMYXN0U1BFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9MTUdldExhc3RTUEV4dHJhLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkxNU2V0TGFzdFNQRXh0cmEiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRMYXN0U1BFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRMYXN0Rk9ORCIsIChQeUNGdW5jdGlvbilRZF9MTUdldExhc3RGT05ELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkxNU2V0TGFzdEZPTkQiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRMYXN0Rk9ORCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldEZyYWN0RW5hYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAorICAgIHsiTE1TZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldEZyYWN0RW5hYmxlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0VGhlR0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldFRoZUdEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldFRoZUdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRUaGVHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0SGlsaXRlUkdCIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0SGlsaXRlUkdCLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBoaWxpdGVSR0JWYWx1ZSkiKX0sCisgICAgeyJMTVNldEhpbGl0ZVJHQiIsIChQeUNGdW5jdGlvbilRZF9MTVNldEhpbGl0ZVJHQiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldEN1cnNvck5ldyIsIChQeUNGdW5jdGlvbilRZF9MTUdldEN1cnNvck5ldywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTE1TZXRDdXJzb3JOZXciLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRDdXJzb3JOZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilRZF9UZXh0Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZm9udCkgLT4gTm9uZSIpfSwKKyAgICB7IlRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRGYWNlLCAxLAorICAgICBQeURvY19TVFIoIihTdHlsZVBhcmFtZXRlciBmYWNlKSAtPiBOb25lIil9LAorICAgIHsiVGV4dE1vZGUiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dE1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IG1vZGUpIC0+IE5vbmUiKX0sCisgICAgeyJUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilRZF9UZXh0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNwYWNlRXh0cmEiLCAoUHlDRnVuY3Rpb24pUWRfU3BhY2VFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgZXh0cmEpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3Q2hhciIsIChQeUNGdW5jdGlvbilRZF9EcmF3Q2hhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdTdHJpbmciLCAoUHlDRnVuY3Rpb24pUWRfRHJhd1N0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHMpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNEcmF3VGV4dCIsIChQeUNGdW5jdGlvbilRZF9NYWNEcmF3VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiBOb25lIil9LAorICAgIHsiQ2hhcldpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX0NoYXJXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTdHJpbmdXaWR0aCIsIChQeUNGdW5jdGlvbilRZF9TdHJpbmdXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHMpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVGV4dFdpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldEZvbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEZvbnRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGb250SW5mbyBpbmZvKSIpfSwKKyAgICB7IkNoYXJFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9DaGFyRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIGV4dHJhKSAtPiBOb25lIil9LAorICAgIHsiVHJ1bmNTdHJpbmciLCAoUHlDRnVuY3Rpb24pUWRfVHJ1bmNTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHdpZHRoLCBTdHIyNTUgdGhlU3RyaW5nLCBUcnVuY0NvZGUgdHJ1bmNXaGVyZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTZXRQb3J0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYWZQdHIgdGhlUG9ydCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9HZXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGN1cnNvcklEKSAtPiAoQ3Vyc0hhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ3Vyc29yIGNyc3IpIC0+IE5vbmUiKX0sCisgICAgeyJTaG93Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nob3dDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkxpbmVUbyIsIChQeUNGdW5jdGlvbilRZF9MaW5lVG8sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGxlZnQsIHNob3J0IHRvcCwgc2hvcnQgcmlnaHQsIHNob3J0IGJvdHRvbSkgLT4gKFJlY3QgcikiKX0sCisgICAgeyJPZmZzZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX09mZnNldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiAoUmVjdCByKSIpfSwKKyAgICB7Ikluc2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9JbnNldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiAoUmVjdCByKSIpfSwKKyAgICB7IlVuaW9uUmVjdCIsIChQeUNGdW5jdGlvbilRZF9VbmlvblJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoUmVjdCBkc3RSZWN0KSIpfSwKKyAgICB7IkVxdWFsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcmVjdDEsIFJlY3QgcmVjdDIpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJGcmFtZVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJJbnZlcnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAorICAgIHsiQ29weVJnbiIsIChQeUNGdW5jdGlvbilRZF9Db3B5UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiU2V0UmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9TZXRSZWN0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IE5vbmUiKX0sCisgICAgeyJPZmZzZXRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfT2Zmc2V0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJVbmlvblJnbiIsIChQeUNGdW5jdGlvbilRZF9VbmlvblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiWG9yUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1hvclJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiRXF1YWxSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRXF1YWxSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ25BLCBSZ25IYW5kbGUgcmduQikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkZyYW1lUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJJbnZlcnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiRmlsbFJnbiIsIChQeUNGdW5jdGlvbilRZF9GaWxsUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFBpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeGVsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUHRJblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfUHRJblJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHIpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJEcmF3VGV4dCIsIChQeUNGdW5jdGlvbilRZF9EcmF3VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiBOb25lIil9LAorICAgIHsiQml0TWFwIiwgKFB5Q0Z1bmN0aW9uKVFkX0JpdE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCJUYWtlIChzdHJpbmcsIGludCwgUmVjdCkgYXJndW1lbnQgYW5kIGNyZWF0ZSBCaXRNYXAiKX0sCisgICAgeyJSYXdCaXRNYXAiLCAoUHlDRnVuY3Rpb24pUWRfUmF3Qml0TWFwLCAxLAorICAgICBQeURvY19TVFIoIlRha2Ugc3RyaW5nIEJpdE1hcCBhbmQgdHVybiBpbnRvIEJpdE1hcCBvYmplY3QiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtNzA5NSwxNSArNzA5NSwxNSBAQAogKi8KIFB5T2JqZWN0ICpCTU9ial9OZXdDb3BpZWQoQml0TWFwUHRyIGl0c2VsZikKIHsKLSAgICAgICAgQml0TWFwT2JqZWN0ICppdDsKLSAgICAgICAgQml0TWFwUHRyIGl0c2VsZl9jb3B5OworICAgIEJpdE1hcE9iamVjdCAqaXQ7CisgICAgQml0TWFwUHRyIGl0c2VsZl9jb3B5OwogCi0gICAgICAgIGlmICgoaXRzZWxmX2NvcHk9KEJpdE1hcFB0ciltYWxsb2Moc2l6ZW9mKEJpdE1hcCkpKSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICAqaXRzZWxmX2NvcHkgPSAqaXRzZWxmOwotICAgICAgICBpdCA9IChCaXRNYXBPYmplY3QgKilCTU9ial9OZXcoaXRzZWxmX2NvcHkpOwotICAgICAgICBpdC0+cmVmZXJyZWRfYml0bWFwID0gaXRzZWxmX2NvcHk7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBpZiAoKGl0c2VsZl9jb3B5PShCaXRNYXBQdHIpbWFsbG9jKHNpemVvZihCaXRNYXApKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgKml0c2VsZl9jb3B5ID0gKml0c2VsZjsKKyAgICBpdCA9IChCaXRNYXBPYmplY3QgKilCTU9ial9OZXcoaXRzZWxmX2NvcHkpOworICAgIGl0LT5yZWZlcnJlZF9iaXRtYXAgPSBpdHNlbGZfY29weTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwpAQCAtNzExMSw0MiArNzExMSw0MiBAQAogCiB2b2lkIGluaXRfUWQodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEJpdE1hcFB0ciwgQk1PYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChCaXRNYXBQdHIsIEJNT2JqX0NvbnZlcnQpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR3JhZlB0ciwgR3JhZk9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdyYWZQdHIsIEdyYWZPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhSR0JDb2xvclB0ciwgUWRSR0JfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChSR0JDb2xvciwgUWRSR0JfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEJpdE1hcFB0ciwgQk1PYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEJpdE1hcFB0ciwgQk1PYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEdyYWZQdHIsIEdyYWZPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdyYWZQdHIsIEdyYWZPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFJHQkNvbG9yUHRyLCBRZFJHQl9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoUkdCQ29sb3IsIFFkUkdCX0NvbnZlcnQpOwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfUWQiLCBRZF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1FkIiwgUWRfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JUWRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChRZF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFFkX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JR3JhZlBvcnRfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkdyYWZQb3J0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmR3JhZlBvcnRfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJHcmFmUG9ydCIsIChQeU9iamVjdCAqKSZHcmFmUG9ydF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkdyYWZQb3J0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiR3JhZlBvcnRUeXBlIiwgKFB5T2JqZWN0ICopJkdyYWZQb3J0X1R5cGUpOwotCUJpdE1hcF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQml0TWFwX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQml0TWFwX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQml0TWFwIiwgKFB5T2JqZWN0ICopJkJpdE1hcF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkJpdE1hcF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJpdE1hcFR5cGUiLCAoUHlPYmplY3QgKikmQml0TWFwX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFFkX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoUWRfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBRZF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIEdyYWZQb3J0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZHcmFmUG9ydF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkdyYWZQb3J0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiR3JhZlBvcnQiLCAoUHlPYmplY3QgKikmR3JhZlBvcnRfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZHcmFmUG9ydF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdyYWZQb3J0VHlwZSIsIChQeU9iamVjdCAqKSZHcmFmUG9ydF9UeXBlKTsKKyAgICBCaXRNYXBfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkJpdE1hcF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkJpdE1hcF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJpdE1hcCIsIChQeU9iamVjdCAqKSZCaXRNYXBfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZCaXRNYXBfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCaXRNYXBUeXBlIiwgKFB5T2JqZWN0ICopJkJpdE1hcF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xZG9mZnMvX1Fkb2Zmc21vZHVsZS5jIGIvTWFjL01vZHVsZXMvcWRvZmZzL19RZG9mZnNtb2R1bGUuYwppbmRleCBiNDUxNDcyLi42ODZlY2E0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9xZG9mZnMvX1Fkb2Zmc21vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3Fkb2Zmcy9fUWRvZmZzbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM4LDkwICszOCw5MCBAQAogI2RlZmluZSBHV29ybGRPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmR1dvcmxkX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkdXb3JsZF9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgR1dvcmxkT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JR1dvcmxkUHRyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgR1dvcmxkUHRyIG9iX2l0c2VsZjsKIH0gR1dvcmxkT2JqZWN0OwogCiBQeU9iamVjdCAqR1dvcmxkT2JqX05ldyhHV29ybGRQdHIgaXRzZWxmKQogewotCUdXb3JsZE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEdXb3JsZE9iamVjdCwgJkdXb3JsZF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgR1dvcmxkT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoR1dvcmxkT2JqZWN0LCAmR1dvcmxkX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEdXb3JsZE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBHV29ybGRQdHIgKnBfaXRzZWxmKQogewotCWlmICghR1dvcmxkT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkdXb3JsZCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChHV29ybGRPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghR1dvcmxkT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkdXb3JsZCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChHV29ybGRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBHV29ybGRPYmpfZGVhbGxvYyhHV29ybGRPYmplY3QgKnNlbGYpCiB7Ci0JRGlzcG9zZUdXb3JsZChzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgRGlzcG9zZUdXb3JsZChzZWxmLT5vYl9pdHNlbGYpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR1dvcmxkT2JqX0dldEdXb3JsZERldmljZShHV29ybGRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRHV29ybGREZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRHV29ybGREZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdXb3JsZERldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0R1dvcmxkRGV2aWNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0R1dvcmxkRGV2aWNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHV29ybGRPYmpfR2V0R1dvcmxkUGl4TWFwKEdXb3JsZE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0R1dvcmxkUGl4TWFwCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R1dvcmxkUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHV29ybGRQaXhNYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEdXb3JsZFBpeE1hcChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEdXb3JsZFBpeE1hcChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR1dvcmxkT2JqX2FzX0dyYWZQdHIoR1dvcmxkT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR3JhZlB0ciBfcnY7CiAjaWZuZGVmIGFzX0dyYWZQdHIKLQlQeU1hY19QUkVDSEVDSyhhc19HcmFmUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhhc19HcmFmUHRyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19HcmFmUHRyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IGFzX0dyYWZQdHIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEdXb3JsZE9ial9tZXRob2RzW10gPSB7Ci0JeyJHZXRHV29ybGREZXZpY2UiLCAoUHlDRnVuY3Rpb24pR1dvcmxkT2JqX0dldEdXb3JsZERldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkdldEdXb3JsZFBpeE1hcCIsIChQeUNGdW5jdGlvbilHV29ybGRPYmpfR2V0R1dvcmxkUGl4TWFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKLQl7ImFzX0dyYWZQdHIiLCAoUHlDRnVuY3Rpb24pR1dvcmxkT2JqX2FzX0dyYWZQdHIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEdyYWZQdHIgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldEdXb3JsZERldmljZSIsIChQeUNGdW5jdGlvbilHV29ybGRPYmpfR2V0R1dvcmxkRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0R1dvcmxkUGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKUdXb3JsZE9ial9HZXRHV29ybGRQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAorICAgIHsiYXNfR3JhZlB0ciIsIChQeUNGdW5jdGlvbilHV29ybGRPYmpfYXNfR3JhZlB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR3JhZlB0ciBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBHV29ybGRPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMzgsNjEgKzEzOCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkdXb3JsZE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JR1dvcmxkUHRyIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgR1dvcmxkUHRyIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEdXb3JsZE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEdXb3JsZE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBHV29ybGRPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChHV29ybGRPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgR1dvcmxkT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEdXb3JsZF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RZG9mZnMuR1dvcmxkIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoR1dvcmxkT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgR1dvcmxkT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEdXb3JsZE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgR1dvcmxkT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBHV29ybGRPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JR1dvcmxkT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUdXb3JsZE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlHV29ybGRPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUdXb3JsZE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlHV29ybGRPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlHV29ybGRPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RZG9mZnMuR1dvcmxkIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoR1dvcmxkT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgR1dvcmxkT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEdXb3JsZE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgR1dvcmxkT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBHV29ybGRPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgR1dvcmxkT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEdXb3JsZE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBHV29ybGRPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEdXb3JsZE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBHV29ybGRPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBHV29ybGRPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBHV29ybGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMDAsNDg5ICsyMDAsNDg5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX05ld0dXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUURFcnIgX2VycjsKLQlHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkOwotCXNob3J0IFBpeGVsRGVwdGg7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNUYWJIYW5kbGUgY1RhYmxlOwotCUdESGFuZGxlIGFHRGV2aWNlOwotCUdXb3JsZEZsYWdzIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBRREVyciBfZXJyOworICAgIEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQ7CisgICAgc2hvcnQgUGl4ZWxEZXB0aDsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ1RhYkhhbmRsZSBjVGFibGU7CisgICAgR0RIYW5kbGUgYUdEZXZpY2U7CisgICAgR1dvcmxkRmxhZ3MgZmxhZ3M7CiAjaWZuZGVmIE5ld0dXb3JsZAotCVB5TWFjX1BSRUNIRUNLKE5ld0dXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJlBpeGVsRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmNUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZhR0RldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld0dXb3JsZCgmb2Zmc2NyZWVuR1dvcmxkLAotCSAgICAgICAgICAgICAgICAgUGl4ZWxEZXB0aCwKLQkgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgY1RhYmxlLAotCSAgICAgICAgICAgICAgICAgYUdEZXZpY2UsCi0JICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIG9mZnNjcmVlbkdXb3JsZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUGl4ZWxEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3R1dvcmxkKCZvZmZzY3JlZW5HV29ybGQsCisgICAgICAgICAgICAgICAgICAgICBQaXhlbERlcHRoLAorICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICBjVGFibGUsCisgICAgICAgICAgICAgICAgICAgICBhR0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgb2Zmc2NyZWVuR1dvcmxkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfTG9ja1BpeGVscyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIExvY2tQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhMb2NrUGl4ZWxzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2NrUGl4ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExvY2tQaXhlbHMocG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExvY2tQaXhlbHMocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19VbmxvY2tQaXhlbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBVbmxvY2tQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhVbmxvY2tQaXhlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFVubG9ja1BpeGVscyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlVbmxvY2tQaXhlbHMocG0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVbmxvY2tQaXhlbHMocG0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfVXBkYXRlR1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHV29ybGRGbGFncyBfcnY7Ci0JR1dvcmxkUHRyIG9mZnNjcmVlbkdXb3JsZDsKLQlzaG9ydCBwaXhlbERlcHRoOwotCVJlY3QgYm91bmRzUmVjdDsKLQlDVGFiSGFuZGxlIGNUYWJsZTsKLQlHREhhbmRsZSBhR0RldmljZTsKLQlHV29ybGRGbGFncyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR1dvcmxkRmxhZ3MgX3J2OworICAgIEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQ7CisgICAgc2hvcnQgcGl4ZWxEZXB0aDsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ1RhYkhhbmRsZSBjVGFibGU7CisgICAgR0RIYW5kbGUgYUdEZXZpY2U7CisgICAgR1dvcmxkRmxhZ3MgZmxhZ3M7CiAjaWZuZGVmIFVwZGF0ZUdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZUdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlR1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBpeGVsRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmNUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZhR0RldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVXBkYXRlR1dvcmxkKCZvZmZzY3JlZW5HV29ybGQsCi0JICAgICAgICAgICAgICAgICAgIHBpeGVsRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICBjVGFibGUsCi0JICAgICAgICAgICAgICAgICAgIGFHRGV2aWNlLAotCSAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIG9mZnNjcmVlbkdXb3JsZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl4ZWxEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBVcGRhdGVHV29ybGQoJm9mZnNjcmVlbkdXb3JsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYUdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgb2Zmc2NyZWVuR1dvcmxkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfR2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBwb3J0OwotCUdESGFuZGxlIGdkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgcG9ydDsKKyAgICBHREhhbmRsZSBnZGg7CiAjaWZuZGVmIEdldEdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKEdldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRHV29ybGQoJnBvcnQsCi0JICAgICAgICAgICZnZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRHV29ybGQoJnBvcnQsCisgICAgICAgICAgICAgICZnZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19TZXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIHBvcnQ7Ci0JR0RIYW5kbGUgZ2RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBwb3J0OworICAgIEdESGFuZGxlIGdkaDsKICNpZm5kZWYgU2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0R1dvcmxkKHBvcnQsCi0JICAgICAgICAgIGdkaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEdXb3JsZChwb3J0LAorICAgICAgICAgICAgICBnZGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfQ1RhYkNoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNUYWJIYW5kbGUgY3RhYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ1RhYkhhbmRsZSBjdGFiOwogI2lmbmRlZiBDVGFiQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKENUYWJDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDVGFiQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY3RhYikpCi0JCXJldHVybiBOVUxMOwotCUNUYWJDaGFuZ2VkKGN0YWIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY3RhYikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENUYWJDaGFuZ2VkKGN0YWIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfUGl4UGF0Q2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIHBwYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcGF0OwogI2lmbmRlZiBQaXhQYXRDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soUGl4UGF0Q2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGl4UGF0Q2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHBhdCkpCi0JCXJldHVybiBOVUxMOwotCVBpeFBhdENoYW5nZWQocHBhdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcGF0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGl4UGF0Q2hhbmdlZChwcGF0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1BvcnRDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIHBvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdyYWZQdHIgcG9ydDsKICNpZm5kZWYgUG9ydENoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhQb3J0Q2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUG9ydENoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUG9ydENoYW5nZWQocG9ydCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBvcnRDaGFuZ2VkKHBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfR0RldmljZUNoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIGdkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBHRGV2aWNlQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKEdEZXZpY2VDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHRGV2aWNlQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR0RldmljZUNoYW5nZWQoZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdEZXZpY2VDaGFuZ2VkKGdkaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19BbGxvd1B1cmdlUGl4ZWxzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgQWxsb3dQdXJnZVBpeGVscwotCVB5TWFjX1BSRUNIRUNLKEFsbG93UHVyZ2VQaXhlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEFsbG93UHVyZ2VQaXhlbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQWxsb3dQdXJnZVBpeGVscyhwbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFsbG93UHVyZ2VQaXhlbHMocG0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfTm9QdXJnZVBpeGVscyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIE5vUHVyZ2VQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhOb1B1cmdlUGl4ZWxzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOb1B1cmdlUGl4ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCU5vUHVyZ2VQaXhlbHMocG0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBOb1B1cmdlUGl4ZWxzKHBtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX0dldFBpeGVsc1N0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHV29ybGRGbGFncyBfcnY7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHV29ybGRGbGFncyBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBHZXRQaXhlbHNTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFBpeGVsc1N0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaXhlbHNTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQaXhlbHNTdGF0ZShwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGl4ZWxzU3RhdGUocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19TZXRQaXhlbHNTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBtOwotCUdXb3JsZEZsYWdzIHN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgR1dvcmxkRmxhZ3Mgc3RhdGU7CiAjaWZuZGVmIFNldFBpeGVsc1N0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UGl4ZWxzU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBpeGVsc1N0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBpeGVsc1N0YXRlKHBtLAotCSAgICAgICAgICAgICAgIHN0YXRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UGl4ZWxzU3RhdGUocG0sCisgICAgICAgICAgICAgICAgICAgc3RhdGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfR2V0UGl4Um93Qnl0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBHZXRQaXhSb3dCeXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldFBpeFJvd0J5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaXhSb3dCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQaXhSb3dCeXRlcyhwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGl4Um93Qnl0ZXMocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19OZXdTY3JlZW5CdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVFERXJyIF9lcnI7Ci0JUmVjdCBnbG9iYWxSZWN0OwotCUJvb2xlYW4gcHVyZ2VhYmxlOwotCUdESGFuZGxlIGdkaDsKLQlQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBRREVyciBfZXJyOworICAgIFJlY3QgZ2xvYmFsUmVjdDsKKyAgICBCb29sZWFuIHB1cmdlYWJsZTsKKyAgICBHREhhbmRsZSBnZGg7CisgICAgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKICNpZm5kZWYgTmV3U2NyZWVuQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soTmV3U2NyZWVuQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdTY3JlZW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmdsb2JhbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZwdXJnZWFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3U2NyZWVuQnVmZmVyKCZnbG9iYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgcHVyZ2VhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZvZmZzY3JlZW5QaXhNYXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGdkaCwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvZmZzY3JlZW5QaXhNYXApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHVyZ2VhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld1NjcmVlbkJ1ZmZlcigmZ2xvYmFsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cmdlYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfRGlzcG9zZVNjcmVlbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKICNpZm5kZWYgRGlzcG9zZVNjcmVlbkJ1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VTY3JlZW5CdWZmZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VTY3JlZW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm9mZnNjcmVlblBpeE1hcCkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VTY3JlZW5CdWZmZXIob2Zmc2NyZWVuUGl4TWFwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm9mZnNjcmVlblBpeE1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VTY3JlZW5CdWZmZXIob2Zmc2NyZWVuUGl4TWFwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1FERG9uZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JR3JhZlB0ciBwb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBHcmFmUHRyIHBvcnQ7CiAjaWZuZGVmIFFERG9uZQotCVB5TWFjX1BSRUNIRUNLKFFERG9uZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUUREb25lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFERG9uZShwb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRRERvbmUocG9ydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX09mZnNjcmVlblZlcnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgT2Zmc2NyZWVuVmVyc2lvbgotCVB5TWFjX1BSRUNIRUNLKE9mZnNjcmVlblZlcnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE9mZnNjcmVlblZlcnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9mZnNjcmVlblZlcnNpb24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT2Zmc2NyZWVuVmVyc2lvbigpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19OZXdUZW1wU2NyZWVuQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlRREVyciBfZXJyOwotCVJlY3QgZ2xvYmFsUmVjdDsKLQlCb29sZWFuIHB1cmdlYWJsZTsKLQlHREhhbmRsZSBnZGg7Ci0JUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUURFcnIgX2VycjsKKyAgICBSZWN0IGdsb2JhbFJlY3Q7CisgICAgQm9vbGVhbiBwdXJnZWFibGU7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXA7CiAjaWZuZGVmIE5ld1RlbXBTY3JlZW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhOZXdUZW1wU2NyZWVuQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdUZW1wU2NyZWVuQnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcHVyZ2VhYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld1RlbXBTY3JlZW5CdWZmZXIoJmdsb2JhbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZ2VhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNjcmVlblBpeE1hcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG9mZnNjcmVlblBpeE1hcCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmdsb2JhbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwdXJnZWFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3VGVtcFNjcmVlbkJ1ZmZlcigmZ2xvYmFsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJnZWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfUGl4TWFwMzJCaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBpeE1hcEhhbmRsZSBwbUhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtSGFuZGxlOwogI2lmbmRlZiBQaXhNYXAzMkJpdAotCVB5TWFjX1BSRUNIRUNLKFBpeE1hcDMyQml0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQaXhNYXAzMkJpdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG1IYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQaXhNYXAzMkJpdChwbUhhbmRsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtSGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUGl4TWFwMzJCaXQocG1IYW5kbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19HZXRQaXhNYXBCeXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JUGl4TWFwSGFuZGxlIHBtOwotCWludCBmcm9tLCBsZW5ndGg7Ci0JY2hhciAqY3A7CisgICAgUGl4TWFwSGFuZGxlIHBtOworICAgIGludCBmcm9tLCBsZW5ndGg7CisgICAgY2hhciAqY3A7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpaSIsIFJlc09ial9Db252ZXJ0LCAmcG0sICZmcm9tLCAmbGVuZ3RoKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQljcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOwotCV9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjcCwgbGVuZ3RoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpaSIsIFJlc09ial9Db252ZXJ0LCAmcG0sICZmcm9tLCAmbGVuZ3RoKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNwID0gR2V0UGl4QmFzZUFkZHIocG0pK2Zyb207CisgICAgX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNwLCBsZW5ndGgpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1B1dFBpeE1hcEJ5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlQaXhNYXBIYW5kbGUgcG07Ci0JaW50IGZyb20sIGxlbmd0aDsKLQljaGFyICpjcCwgKmljcDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgaW50IGZyb20sIGxlbmd0aDsKKyAgICBjaGFyICpjcCwgKmljcDsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmlzIyIsIFJlc09ial9Db252ZXJ0LCAmcG0sICZmcm9tLCAmaWNwLCAmbGVuZ3RoKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQljcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOwotCW1lbWNweShjcCwgaWNwLCBsZW5ndGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpcyMiLCBSZXNPYmpfQ29udmVydCwgJnBtLCAmZnJvbSwgJmljcCwgJmxlbmd0aCkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOworICAgIG1lbWNweShjcCwgaWNwLCBsZW5ndGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBRZG9mZnNfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiTmV3R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19OZXdHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IFBpeGVsRGVwdGgsIFJlY3QgYm91bmRzUmVjdCwgQ1RhYkhhbmRsZSBjVGFibGUsIEdESGFuZGxlIGFHRGV2aWNlLCBHV29ybGRGbGFncyBmbGFncykgLT4gKEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQpIil9LAotCXsiTG9ja1BpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfTG9ja1BpeGVscywgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiVW5sb2NrUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19VbmxvY2tQaXhlbHMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZUdXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfVXBkYXRlR1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBwaXhlbERlcHRoLCBSZWN0IGJvdW5kc1JlY3QsIENUYWJIYW5kbGUgY1RhYmxlLCBHREhhbmRsZSBhR0RldmljZSwgR1dvcmxkRmxhZ3MgZmxhZ3MpIC0+IChHV29ybGRGbGFncyBfcnYsIEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQpIil9LAotCXsiR2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkiKX0sCi0JeyJTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1NldEdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2RoKSAtPiBOb25lIil9LAotCXsiQ1RhYkNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0NUYWJDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihDVGFiSGFuZGxlIGN0YWIpIC0+IE5vbmUiKX0sCi0JeyJQaXhQYXRDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19QaXhQYXRDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHBhdCkgLT4gTm9uZSIpfSwKLQl7IlBvcnRDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19Qb3J0Q2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAotCXsiR0RldmljZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dEZXZpY2VDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCi0JeyJBbGxvd1B1cmdlUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19BbGxvd1B1cmdlUGl4ZWxzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCi0JeyJOb1B1cmdlUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19Ob1B1cmdlUGl4ZWxzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCi0JeyJHZXRQaXhlbHNTdGF0ZSIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0UGl4ZWxzU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEdXb3JsZEZsYWdzIF9ydikiKX0sCi0JeyJTZXRQaXhlbHNTdGF0ZSIsIChQeUNGdW5jdGlvbilRZG9mZnNfU2V0UGl4ZWxzU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgR1dvcmxkRmxhZ3Mgc3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRQaXhSb3dCeXRlcyIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0UGl4Um93Qnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik5ld1NjcmVlbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3U2NyZWVuQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGdsb2JhbFJlY3QsIEJvb2xlYW4gcHVyZ2VhYmxlKSAtPiAoR0RIYW5kbGUgZ2RoLCBQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwKSIpfSwKLQl7IkRpc3Bvc2VTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0Rpc3Bvc2VTY3JlZW5CdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXApIC0+IE5vbmUiKX0sCi0JeyJRRERvbmUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1FERG9uZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhZlB0ciBwb3J0KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiT2Zmc2NyZWVuVmVyc2lvbiIsIChQeUNGdW5jdGlvbilRZG9mZnNfT2Zmc2NyZWVuVmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiTmV3VGVtcFNjcmVlbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3VGVtcFNjcmVlbkJ1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0LCBCb29sZWFuIHB1cmdlYWJsZSkgLT4gKEdESGFuZGxlIGdkaCwgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcCkiKX0sCi0JeyJQaXhNYXAzMkJpdCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUGl4TWFwMzJCaXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbUhhbmRsZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFBpeE1hcEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HZXRQaXhNYXBCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIocGl4bWFwLCBpbnQgc3RhcnQsIGludCBzaXplKSAtPiBzdHJpbmcuIFJldHVybiBieXRlcyBmcm9tIHRoZSBwaXhtYXAiKX0sCi0JeyJQdXRQaXhNYXBCeXRlcyIsIChQeUNGdW5jdGlvbilRZG9mZnNfUHV0UGl4TWFwQnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKHBpeG1hcCwgaW50IHN0YXJ0LCBzdHJpbmcgZGF0YSkuIFN0b3JlIGJ5dGVzIGludG8gdGhlIHBpeG1hcCIpfSwKKyAgICB7Ik5ld0dXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBQaXhlbERlcHRoLCBSZWN0IGJvdW5kc1JlY3QsIENUYWJIYW5kbGUgY1RhYmxlLCBHREhhbmRsZSBhR0RldmljZSwgR1dvcmxkRmxhZ3MgZmxhZ3MpIC0+IChHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkKSIpfSwKKyAgICB7IkxvY2tQaXhlbHMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0xvY2tQaXhlbHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlVubG9ja1BpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfVW5sb2NrUGl4ZWxzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVHV29ybGQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1VwZGF0ZUdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcGl4ZWxEZXB0aCwgUmVjdCBib3VuZHNSZWN0LCBDVGFiSGFuZGxlIGNUYWJsZSwgR0RIYW5kbGUgYUdEZXZpY2UsIEdXb3JsZEZsYWdzIGZsYWdzKSAtPiAoR1dvcmxkRmxhZ3MgX3J2LCBHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkKSIpfSwKKyAgICB7IkdldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIil9LAorICAgIHsiU2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19TZXRHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKKyAgICB7IkNUYWJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19DVGFiQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjdGFiKSAtPiBOb25lIil9LAorICAgIHsiUGl4UGF0Q2hhbmdlZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUGl4UGF0Q2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJQb3J0Q2hhbmdlZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUG9ydENoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYWZQdHIgcG9ydCkgLT4gTm9uZSIpfSwKKyAgICB7IkdEZXZpY2VDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HRGV2aWNlQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoKSAtPiBOb25lIil9LAorICAgIHsiQWxsb3dQdXJnZVBpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfQWxsb3dQdXJnZVBpeGVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAorICAgIHsiTm9QdXJnZVBpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfTm9QdXJnZVBpeGVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGl4ZWxzU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dldFBpeGVsc1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChHV29ybGRGbGFncyBfcnYpIil9LAorICAgIHsiU2V0UGl4ZWxzU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1NldFBpeGVsc1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIEdXb3JsZEZsYWdzIHN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGl4Um93Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dldFBpeFJvd0J5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJOZXdTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX05ld1NjcmVlbkJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0LCBCb29sZWFuIHB1cmdlYWJsZSkgLT4gKEdESGFuZGxlIGdkaCwgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcCkiKX0sCisgICAgeyJEaXNwb3NlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19EaXNwb3NlU2NyZWVuQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwKSAtPiBOb25lIil9LAorICAgIHsiUUREb25lIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19RRERvbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYWZQdHIgcG9ydCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ik9mZnNjcmVlblZlcnNpb24iLCAoUHlDRnVuY3Rpb24pUWRvZmZzX09mZnNjcmVlblZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7Ik5ld1RlbXBTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX05ld1RlbXBTY3JlZW5CdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgZ2xvYmFsUmVjdCwgQm9vbGVhbiBwdXJnZWFibGUpIC0+IChHREhhbmRsZSBnZGgsIFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXApIil9LAorICAgIHsiUGl4TWFwMzJCaXQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1BpeE1hcDMyQml0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG1IYW5kbGUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRQaXhNYXBCeXRlcyIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0UGl4TWFwQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKHBpeG1hcCwgaW50IHN0YXJ0LCBpbnQgc2l6ZSkgLT4gc3RyaW5nLiBSZXR1cm4gYnl0ZXMgZnJvbSB0aGUgcGl4bWFwIil9LAorICAgIHsiUHV0UGl4TWFwQnl0ZXMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1B1dFBpeE1hcEJ5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihwaXhtYXAsIGludCBzdGFydCwgc3RyaW5nIGRhdGEpLiBTdG9yZSBieXRlcyBpbnRvIHRoZSBwaXhtYXAiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtNjkwLDMxICs2OTAsMzEgQEAKIAogdm9pZCBpbml0X1Fkb2Zmcyh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR1dvcmxkUHRyLCBHV29ybGRPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChHV29ybGRQdHIsIEdXb3JsZE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR1dvcmxkUHRyLCBHV29ybGRPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdXb3JsZFB0ciwgR1dvcmxkT2JqX0NvbnZlcnQpOwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfUWRvZmZzIiwgUWRvZmZzX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfUWRvZmZzIiwgUWRvZmZzX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVFkb2Zmc19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKFFkb2Zmc19FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFFkb2Zmc19FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUdXb3JsZF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmR1dvcmxkX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmR1dvcmxkX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiR1dvcmxkIiwgKFB5T2JqZWN0ICopJkdXb3JsZF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkdXb3JsZF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdXb3JsZFR5cGUiLCAoUHlPYmplY3QgKikmR1dvcmxkX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFFkb2Zmc19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFFkb2Zmc19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFFkb2Zmc19FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIEdXb3JsZF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmR1dvcmxkX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmR1dvcmxkX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiR1dvcmxkIiwgKFB5T2JqZWN0ICopJkdXb3JsZF9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkdXb3JsZF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdXb3JsZFR5cGUiLCAoUHlPYmplY3QgKikmR1dvcmxkX1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3F0L19RdG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvcXQvX1F0bW9kdWxlLmMKaW5kZXggNDg0NWU0YS4uYmY2N2NkYSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcXQvX1F0bW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvcXQvX1F0bW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTU2LDM3ICs1NiwzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFF0VGltZVJlY29yZF9OZXcoVGltZVJlY29yZCAqaXRzZWxmKQogewotICAgICAgICBpZiAoaXRzZWxmLT5iYXNlKQotICAgICAgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmxPJiIsIFB5TWFjX0J1aWxkd2lkZSwgJml0c2VsZi0+dmFsdWUsIGl0c2VsZi0+c2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIGl0c2VsZi0+YmFzZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gIFB5X0J1aWxkVmFsdWUoIk8mbE8iLCBQeU1hY19CdWlsZHdpZGUsICZpdHNlbGYtPnZhbHVlLCBpdHNlbGYtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CisgICAgaWYgKGl0c2VsZi0+YmFzZSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mbE8mIiwgUHlNYWNfQnVpbGR3aWRlLCAmaXRzZWxmLT52YWx1ZSwgaXRzZWxmLT5zY2FsZSwKKyAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgaXRzZWxmLT5iYXNlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAgUHlfQnVpbGRWYWx1ZSgiTyZsTyIsIFB5TWFjX0J1aWxkd2lkZSwgJml0c2VsZi0+dmFsdWUsIGl0c2VsZi0+c2NhbGUsCisgICAgICAgICAgICBQeV9Ob25lKTsKIH0KIAogc3RhdGljIGludAogUXRUaW1lUmVjb3JkX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRpbWVSZWNvcmQgKnBfaXRzZWxmKQogewotICAgICAgICBQeU9iamVjdCAqYmFzZSA9IE5VTEw7Ci0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZsfE8iLCBQeU1hY19HZXR3aWRlLCAmcF9pdHNlbGYtPnZhbHVlLCAmcF9pdHNlbGYtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgJmJhc2UpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBiYXNlID09IE5VTEwgfHwgYmFzZSA9PSBQeV9Ob25lICkKLSAgICAgICAgICAgICAgICBwX2l0c2VsZi0+YmFzZSA9IE5VTEw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoICFUaW1lQmFzZU9ial9Db252ZXJ0KGJhc2UsICZwX2l0c2VsZi0+YmFzZSkgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAxOworICAgIFB5T2JqZWN0ICpiYXNlID0gTlVMTDsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgIk8mbHxPIiwgUHlNYWNfR2V0d2lkZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgJmJhc2UpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBiYXNlID09IE5VTEwgfHwgYmFzZSA9PSBQeV9Ob25lICkKKyAgICAgICAgcF9pdHNlbGYtPmJhc2UgPSBOVUxMOworICAgIGVsc2UKKyAgICAgICAgaWYgKCAhVGltZUJhc2VPYmpfQ29udmVydChiYXNlLCAmcF9pdHNlbGYtPmJhc2UpICkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBNdXNpY01JRElQYWNrZXQgKnBfaXRzZWxmKQogewotICAgICAgICBpbnQgZHVtbXk7CisgICAgaW50IGR1bW15OwogCi0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAiaGxzIyIsICZwX2l0c2VsZi0+bGVuZ3RoLCAmcF9pdHNlbGYtPnJlc2VydmVkLCBwX2l0c2VsZi0+ZGF0YSwgZHVtbXkpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJobHMjIiwgJnBfaXRzZWxmLT5sZW5ndGgsICZwX2l0c2VsZi0+cmVzZXJ2ZWQsIHBfaXRzZWxmLT5kYXRhLCBkdW1teSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogCkBAIC0xMDEsNDcgKzEwMSw0NyBAQAogI2RlZmluZSBJZGxlTWFuYWdlck9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZJZGxlTWFuYWdlcl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZJZGxlTWFuYWdlcl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgSWRsZU1hbmFnZXJPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlJZGxlTWFuYWdlciBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIElkbGVNYW5hZ2VyIG9iX2l0c2VsZjsKIH0gSWRsZU1hbmFnZXJPYmplY3Q7CiAKIFB5T2JqZWN0ICpJZGxlTWFuYWdlck9ial9OZXcoSWRsZU1hbmFnZXIgaXRzZWxmKQogewotCUlkbGVNYW5hZ2VyT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBJZGxlTWFuYWdlciBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKElkbGVNYW5hZ2VyT2JqZWN0LCAmSWRsZU1hbmFnZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIElkbGVNYW5hZ2VyT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBJZGxlTWFuYWdlciBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKElkbGVNYW5hZ2VyT2JqZWN0LCAmSWRsZU1hbmFnZXJfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgSWRsZU1hbmFnZXJPYmpfQ29udmVydChQeU9iamVjdCAqdiwgSWRsZU1hbmFnZXIgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFJZGxlTWFuYWdlck9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJZGxlTWFuYWdlciByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChJZGxlTWFuYWdlck9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIUlkbGVNYW5hZ2VyT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIklkbGVNYW5hZ2VyIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKElkbGVNYW5hZ2VyT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgSWRsZU1hbmFnZXJPYmpfZGVhbGxvYyhJZGxlTWFuYWdlck9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBJZGxlTWFuYWdlck9ial9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIElkbGVNYW5hZ2VyT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTU4LDYxICsxNTgsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpJZGxlTWFuYWdlck9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JSWRsZU1hbmFnZXIgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBJZGxlTWFuYWdlciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKElkbGVNYW5hZ2VyT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoSWRsZU1hbmFnZXJPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgSWRsZU1hbmFnZXJPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgSWRsZU1hbmFnZXJfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUXQuSWRsZU1hbmFnZXIiLCAvKnRwX25hbWUqLwotCXNpemVvZihJZGxlTWFuYWdlck9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIElkbGVNYW5hZ2VyT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIElkbGVNYW5hZ2VyT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBJZGxlTWFuYWdlck9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgSWRsZU1hbmFnZXJPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JSWRsZU1hbmFnZXJPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JSWRsZU1hbmFnZXJPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JSWRsZU1hbmFnZXJPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUlkbGVNYW5hZ2VyT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUlkbGVNYW5hZ2VyT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JSWRsZU1hbmFnZXJPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RdC5JZGxlTWFuYWdlciIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKElkbGVNYW5hZ2VyT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgSWRsZU1hbmFnZXJPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgSWRsZU1hbmFnZXJPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIElkbGVNYW5hZ2VyT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBJZGxlTWFuYWdlck9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBJZGxlTWFuYWdlck9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBJZGxlTWFuYWdlck9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBJZGxlTWFuYWdlck9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgSWRsZU1hbmFnZXJPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgSWRsZU1hbmFnZXJPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBJZGxlTWFuYWdlck9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIElkbGVNYW5hZ2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIyNSwxMDQzICsyMjUsMTA0MyBAQAogI2RlZmluZSBNb3ZpZUN0bE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZNb3ZpZUNvbnRyb2xsZXJfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmTW92aWVDb250cm9sbGVyX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBNb3ZpZUNvbnRyb2xsZXJPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlNb3ZpZUNvbnRyb2xsZXIgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBNb3ZpZUNvbnRyb2xsZXIgb2JfaXRzZWxmOwogfSBNb3ZpZUNvbnRyb2xsZXJPYmplY3Q7CiAKIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9OZXcoTW92aWVDb250cm9sbGVyIGl0c2VsZikKIHsKLQlNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIE1vdmllQ29udHJvbGxlciBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKE1vdmllQ29udHJvbGxlck9iamVjdCwgJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgTW92aWVDb250cm9sbGVyT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNb3ZpZUNvbnRyb2xsZXIgZnJvbSBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QsICZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgTW92aWVDdGxPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTW92aWVDb250cm9sbGVyICpwX2l0c2VsZikKIHsKLQlpZiAodiA9PSBQeV9Ob25lKQotCXsKLQkJKnBfaXRzZWxmID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghTW92aWVDdGxPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTW92aWVDb250cm9sbGVyIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKE1vdmllQ29udHJvbGxlck9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIU1vdmllQ3RsT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1vdmllQ29udHJvbGxlciByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBNb3ZpZUN0bE9ial9kZWFsbG9jKE1vdmllQ29udHJvbGxlck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlTW92aWVDb250cm9sbGVyKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlTW92aWVDb250cm9sbGVyKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldE1vdmllKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlXaW5kb3dQdHIgbW92aWVXaW5kb3c7Ci0JUG9pbnQgd2hlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgV2luZG93UHRyIG1vdmllV2luZG93OworICAgIFBvaW50IHdoZXJlOwogI2lmbmRlZiBNQ1NldE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmbW92aWVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgIG1vdmllV2luZG93LAotCSAgICAgICAgICAgICAgICAgd2hlcmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZtb3ZpZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0TW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgbW92aWVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRJbmRNb3ZpZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBNQ0dldEluZE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRJbmRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRJbmRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNHZXRJbmRNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldEluZE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNSZW1vdmVBbGxNb3ZpZXMoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ1JlbW92ZUFsbE1vdmllcwotCVB5TWFjX1BSRUNIRUNLKE1DUmVtb3ZlQWxsTW92aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1JlbW92ZUFsbE1vdmllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNSZW1vdmVBbGxNb3ZpZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DUmVtb3ZlQWxsTW92aWVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DUmVtb3ZlQU1vdmllKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZSBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllIG07CiAjaWZuZGVmIE1DUmVtb3ZlQU1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNSZW1vdmVBTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DUmVtb3ZlQU1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJm0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1JlbW92ZUFNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1JlbW92ZUFNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DUmVtb3ZlTW92aWUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ1JlbW92ZU1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNSZW1vdmVNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNSZW1vdmVNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNSZW1vdmVNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNSZW1vdmVNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0lzUGxheWVyRXZlbnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUV2ZW50UmVjb3JkIGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRXZlbnRSZWNvcmQgZTsKICNpZm5kZWYgTUNJc1BsYXllckV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNJc1BsYXllckV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0lzUGxheWVyRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0lzUGxheWVyRXZlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNJc1BsYXllckV2ZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0RvQWN0aW9uKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlzaG9ydCBhY3Rpb247Ci0Jdm9pZCAqIHBhcmFtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBzaG9ydCBhY3Rpb247CisgICAgdm9pZCAqIHBhcmFtczsKICNpZm5kZWYgTUNEb0FjdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1DRG9BY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1DRG9BY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaHMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNEb0FjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgYWN0aW9uLAotCSAgICAgICAgICAgICAgICAgcGFyYW1zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJocyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0RvQWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckF0dGFjaGVkKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlCb29sZWFuIGF0dGFjaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBCb29sZWFuIGF0dGFjaDsKICNpZm5kZWYgTUNTZXRDb250cm9sbGVyQXR0YWNoZWQKLQlQeU1hY19QUkVDSEVDSyhNQ1NldENvbnRyb2xsZXJBdHRhY2hlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyQXR0YWNoZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRhY2gpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldENvbnRyb2xsZXJBdHRhY2hlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRhY2gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldENvbnRyb2xsZXJBdHRhY2hlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNJc0NvbnRyb2xsZXJBdHRhY2hlZChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CiAjaWZuZGVmIE1DSXNDb250cm9sbGVyQXR0YWNoZWQKLQlQeU1hY19QUkVDSEVDSyhNQ0lzQ29udHJvbGxlckF0dGFjaGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0lzQ29udHJvbGxlckF0dGFjaGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0lzQ29udHJvbGxlckF0dGFjaGVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0lzQ29udHJvbGxlckF0dGFjaGVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlclBvcnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNHcmFmUHRyIGdwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENHcmFmUHRyIGdwOwogI2lmbmRlZiBNQ1NldENvbnRyb2xsZXJQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmdwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRDb250cm9sbGVyUG9ydChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZ3ApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldENvbnRyb2xsZXJQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyUG9ydChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBNQ0dldENvbnRyb2xsZXJQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVyUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVyUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNHZXRDb250cm9sbGVyUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldENvbnRyb2xsZXJQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXRWaXNpYmxlKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlCb29sZWFuIHZpc2libGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQm9vbGVhbiB2aXNpYmxlOwogI2lmbmRlZiBNQ1NldFZpc2libGUKLQlQeU1hY19QUkVDSEVDSyhNQ1NldFZpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0VmlzaWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldFZpc2libGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgdmlzaWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0VmlzaWJsZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CiAjaWZuZGVmIE1DR2V0VmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKE1DR2V0VmlzaWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRWaXNpYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldFZpc2libGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DR2V0VmlzaWJsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdAotCVB5TWFjX1BSRUNIRUNLKE1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJCb3VuZHNSZWN0KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdAotCVB5TWFjX1BSRUNIRUNLKE1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyQm91bmRzUmduKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgTUNHZXRDb250cm9sbGVyQm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVyQm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0Q29udHJvbGxlckJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DR2V0Q29udHJvbGxlckJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRXaW5kb3dSZ24oTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVdpbmRvd1B0ciB3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OworICAgIFdpbmRvd1B0ciB3OwogI2lmbmRlZiBNQ0dldFdpbmRvd1JnbgotCVB5TWFjX1BSRUNIRUNLKE1DR2V0V2luZG93UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldFdpbmRvd1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0V2luZG93UmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRXaW5kb3dSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNNb3ZpZUNoYW5nZWQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllIG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgbTsKICNpZm5kZWYgTUNNb3ZpZUNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhNQ01vdmllQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNNb3ZpZUNoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DTW92aWVDaGFuZ2VkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DTW92aWVDaGFuZ2VkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXREdXJhdGlvbihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgTUNTZXREdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1DU2V0RHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0RHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0RHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXREdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0Q3VycmVudFRpbWUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVTY2FsZSBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIE1DR2V0Q3VycmVudFRpbWUKLQlQeU1hY19QUkVDSEVDSyhNQ0dldEN1cnJlbnRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldEN1cnJlbnRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldEN1cnJlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRDdXJyZW50VGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllIHRoZU1vdmllOwotCVdpbmRvd1B0ciB3OwotCVBvaW50IHdoZXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllIHRoZU1vdmllOworICAgIFdpbmRvd1B0ciB3OworICAgIFBvaW50IHdoZXJlOwogI2lmbmRlZiBNQ05ld0F0dGFjaGVkQ29udHJvbGxlcgotCVB5TWFjX1BSRUNIRUNLKE1DTmV3QXR0YWNoZWRDb250cm9sbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ05ld0F0dGFjaGVkQ29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DTmV3QXR0YWNoZWRDb250cm9sbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ05ld0F0dGFjaGVkQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DRHJhdyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JV2luZG93UHRyIHc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CiAjaWZuZGVmIE1DRHJhdwotCVB5TWFjX1BSRUNIRUNLKE1DRHJhdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNEcmF3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNEcmF3KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIHcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNEcmF3KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIHcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DQWN0aXZhdGUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVdpbmRvd1B0ciB3OwotCUJvb2xlYW4gYWN0aXZhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CisgICAgQm9vbGVhbiBhY3RpdmF0ZTsKICNpZm5kZWYgTUNBY3RpdmF0ZQotCVB5TWFjX1BSRUNIRUNLKE1DQWN0aXZhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQWN0aXZhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0FjdGl2YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICB3LAotCSAgICAgICAgICAgICAgICAgYWN0aXZhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNBY3RpdmF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0lkbGUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ0lkbGUKLQlQeU1hY19QUkVDSEVDSyhNQ0lkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNJZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0lkbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNLZXkoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNJbnQ4IGtleTsKLQlsb25nIG1vZGlmaWVyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTSW50OCBrZXk7CisgICAgbG9uZyBtb2RpZmllcnM7CiAjaWZuZGVmIE1DS2V5Ci0JUHlNYWNfUFJFQ0hFQ0soTUNLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DS2V5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAga2V5LAotCSAgICAgICAgICAgIG1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNLZXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgbW9kaWZpZXJzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0NsaWNrKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlXaW5kb3dQdHIgdzsKLQlQb2ludCB3aGVyZTsKLQlsb25nIHdoZW47Ci0JbG9uZyBtb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CisgICAgUG9pbnQgd2hlcmU7CisgICAgbG9uZyB3aGVuOworICAgIGxvbmcgbW9kaWZpZXJzOwogI2lmbmRlZiBNQ0NsaWNrCi0JUHlNYWNfUFJFQ0hFQ0soTUNDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNDbGljayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVuLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNDbGljayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgdywKLQkgICAgICAgICAgICAgIHdoZXJlLAotCSAgICAgICAgICAgICAgd2hlbiwKLQkgICAgICAgICAgICAgIG1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DQ2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICB3aGVyZSwKKyAgICAgICAgICAgICAgICAgIHdoZW4sCisgICAgICAgICAgICAgICAgICBtb2RpZmllcnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DRW5hYmxlRWRpdGluZyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQm9vbGVhbiBlbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEJvb2xlYW4gZW5hYmxlZDsKICNpZm5kZWYgTUNFbmFibGVFZGl0aW5nCi0JUHlNYWNfUFJFQ0hFQ0soTUNFbmFibGVFZGl0aW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0VuYWJsZUVkaXRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNFbmFibGVFZGl0aW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DRW5hYmxlRWRpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0lzRWRpdGluZ0VuYWJsZWQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIE1DSXNFZGl0aW5nRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKE1DSXNFZGl0aW5nRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNJc0VkaXRpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0lzRWRpdGluZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DSXNFZGl0aW5nRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0NvcHkoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKICNpZm5kZWYgTUNDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soTUNDb3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DQ29weShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DQ3V0KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CiAjaWZuZGVmIE1DQ3V0Ci0JUHlNYWNfUFJFQ0hFQ0soTUNDdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQ3V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0N1dChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNDdXQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNQYXN0ZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWUgc3JjTW92aWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgc3JjTW92aWU7CiAjaWZuZGVmIE1DUGFzdGUKLQlQeU1hY19QUkVDSEVDSyhNQ1Bhc3RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1Bhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyY01vdmllKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNQYXN0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgc3JjTW92aWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyY01vdmllKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNQYXN0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgc3JjTW92aWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DQ2xlYXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ0NsZWFyCi0JUHlNYWNfUFJFQ0hFQ0soTUNDbGVhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNDbGVhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNDbGVhcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNDbGVhcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1VuZG8oTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ1VuZG8KLQlQeU1hY19QUkVDSEVDSyhNQ1VuZG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1DVW5kbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNVbmRvKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1VuZG8oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNQb3NpdGlvbkNvbnRyb2xsZXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVJlY3QgbW92aWVSZWN0OwotCVJlY3QgY29udHJvbGxlclJlY3Q7Ci0JbG9uZyBzb21lRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUmVjdCBtb3ZpZVJlY3Q7CisgICAgUmVjdCBjb250cm9sbGVyUmVjdDsKKyAgICBsb25nIHNvbWVGbGFnczsKICNpZm5kZWYgTUNQb3NpdGlvbkNvbnRyb2xsZXIKLQlQeU1hY19QUkVDSEVDSyhNQ1Bvc2l0aW9uQ29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNQb3NpdGlvbkNvbnRyb2xsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbW92aWVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmY29udHJvbGxlclJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZzb21lRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1Bvc2l0aW9uQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbW92aWVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmY29udHJvbGxlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzb21lRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1Bvc2l0aW9uQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVySW5mbyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JbG9uZyBzb21lRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgbG9uZyBzb21lRmxhZ3M7CiAjaWZuZGVmIE1DR2V0Q29udHJvbGxlckluZm8KLQlQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldENvbnRyb2xsZXJJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldENvbnRyb2xsZXJJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0Q2xpcChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUmduSGFuZGxlIHRoZUNsaXA7Ci0JUmduSGFuZGxlIG1vdmllQ2xpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKKyAgICBSZ25IYW5kbGUgbW92aWVDbGlwOwogI2lmbmRlZiBNQ1NldENsaXAKLQlQeU1hY19QUkVDSEVDSyhNQ1NldENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDbGlwLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1vdmllQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0Q2xpcChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aGVDbGlwLAotCSAgICAgICAgICAgICAgICBtb3ZpZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbW92aWVDbGlwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRDbGlwKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHRoZUNsaXAsCisgICAgICAgICAgICAgICAgICAgIG1vdmllQ2xpcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDbGlwKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZ25IYW5kbGUgdGhlQ2xpcDsKLQlSZ25IYW5kbGUgbW92aWVDbGlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFJnbkhhbmRsZSB0aGVDbGlwOworICAgIFJnbkhhbmRsZSBtb3ZpZUNsaXA7CiAjaWZuZGVmIE1DR2V0Q2xpcAotCVB5TWFjX1BSRUNIRUNLKE1DR2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRDbGlwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldENsaXAoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgJnRoZUNsaXAsCi0JICAgICAgICAgICAgICAgICZtb3ZpZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNsaXAsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgbW92aWVDbGlwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRDbGlwKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICZ0aGVDbGlwLAorICAgICAgICAgICAgICAgICAgICAmbW92aWVDbGlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVDbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG1vdmllQ2xpcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNEcmF3QmFkZ2UoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVJnbkhhbmRsZSBtb3ZpZVJnbjsKLQlSZ25IYW5kbGUgYmFkZ2VSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUmduSGFuZGxlIG1vdmllUmduOworICAgIFJnbkhhbmRsZSBiYWRnZVJnbjsKICNpZm5kZWYgTUNEcmF3QmFkZ2UKLQlQeU1hY19QUkVDSEVDSyhNQ0RyYXdCYWRnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNEcmF3QmFkZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1vdmllUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNEcmF3QmFkZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBtb3ZpZVJnbiwKLQkgICAgICAgICAgICAgICAgICAmYmFkZ2VSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBiYWRnZVJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1vdmllUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNEcmF3QmFkZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAmYmFkZ2VSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBiYWRnZVJnbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXRVcEVkaXRNZW51KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlsb25nIG1vZGlmaWVyczsKLQlNZW51SGFuZGxlIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIGxvbmcgbW9kaWZpZXJzOworICAgIE1lbnVIYW5kbGUgbWg7CiAjaWZuZGVmIE1DU2V0VXBFZGl0TWVudQotCVB5TWFjX1BSRUNIRUNLKE1DU2V0VXBFZGl0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRVcEVkaXRNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRVcEVkaXRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgbWgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRVcEVkaXRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0TWVudVN0cmluZyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JbG9uZyBtb2RpZmllcnM7Ci0Jc2hvcnQgaXRlbTsKLQlTdHIyNTUgYVN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBsb25nIG1vZGlmaWVyczsKKyAgICBzaG9ydCBpdGVtOworICAgIFN0cjI1NSBhU3RyaW5nOwogI2lmbmRlZiBNQ0dldE1lbnVTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhNQ0dldE1lbnVTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DR2V0TWVudVN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgYVN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0TWVudVN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIGFTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRNZW51U3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYVN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNQdEluQ29udHJvbGxlcihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUG9pbnQgdGhlUHQ7Ci0JQm9vbGVhbiBpbkNvbnRyb2xsZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUG9pbnQgdGhlUHQ7CisgICAgQm9vbGVhbiBpbkNvbnRyb2xsZXI7CiAjaWZuZGVmIE1DUHRJbkNvbnRyb2xsZXIKLQlQeU1hY19QUkVDSEVDSyhNQ1B0SW5Db250cm9sbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1B0SW5Db250cm9sbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DUHRJbkNvbnRyb2xsZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZVB0LAotCSAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udHJvbGxlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5Db250cm9sbGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1B0SW5Db250cm9sbGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRyb2xsZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbGxlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNJbnZhbGlkYXRlKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlXaW5kb3dQdHIgdzsKLQlSZ25IYW5kbGUgaW52YWxpZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBXaW5kb3dQdHIgdzsKKyAgICBSZ25IYW5kbGUgaW52YWxpZFJnbjsKICNpZm5kZWYgTUNJbnZhbGlkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soTUNJbnZhbGlkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0ludmFsaWRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbnZhbGlkUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNJbnZhbGlkYXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHcsCi0JICAgICAgICAgICAgICAgICAgIGludmFsaWRSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW52YWxpZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DSW52YWxpZGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0FkanVzdEN1cnNvcihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JV2luZG93UHRyIHc7Ci0JUG9pbnQgd2hlcmU7Ci0JbG9uZyBtb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CisgICAgUG9pbnQgd2hlcmU7CisgICAgbG9uZyBtb2RpZmllcnM7CiAjaWZuZGVmIE1DQWRqdXN0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soTUNBZGp1c3RDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQWRqdXN0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNBZGp1c3RDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB3LAotCSAgICAgICAgICAgICAgICAgICAgIHdoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0FkanVzdEN1cnNvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0dldEludGVyZmFjZUVsZW1lbnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1DSW50ZXJmYWNlRWxlbWVudCB3aGljaEVsZW1lbnQ7Ci0Jdm9pZCAqIGVsZW1lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTUNJbnRlcmZhY2VFbGVtZW50IHdoaWNoRWxlbWVudDsKKyAgICB2b2lkICogZWxlbWVudDsKICNpZm5kZWYgTUNHZXRJbnRlcmZhY2VFbGVtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRJbnRlcmZhY2VFbGVtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldEludGVyZmFjZUVsZW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibHMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hFbGVtZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0SW50ZXJmYWNlRWxlbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEVsZW1lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldEludGVyZmFjZUVsZW1lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0FkZE1vdmllU2VnbWVudChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWUgc3JjTW92aWU7Ci0JQm9vbGVhbiBzY2FsZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgc3JjTW92aWU7CisgICAgQm9vbGVhbiBzY2FsZWQ7CiAjaWZuZGVmIE1DQWRkTW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNBZGRNb3ZpZVNlZ21lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQWRkTW92aWVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmNNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DQWRkTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3JjTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmc3JjTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0FkZE1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNUcmltTW92aWVTZWdtZW50KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKICNpZm5kZWYgTUNUcmltTW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNUcmltTW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1RyaW1Nb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DVHJpbU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNUcmltTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0SWRsZU1hbmFnZXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUlkbGVNYW5hZ2VyIGltOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIElkbGVNYW5hZ2VyIGltOwogI2lmbmRlZiBNQ1NldElkbGVNYW5hZ2VyCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRJZGxlTWFuYWdlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRJZGxlTWFuYWdlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0SWRsZU1hbmFnZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGltKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0SWRsZU1hbmFnZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBmbGFnc01hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGZsYWdzTWFzazsKICNpZm5kZWYgTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBNb3ZpZUN0bE9ial9tZXRob2RzW10gPSB7Ci0JeyJNQ1NldE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0TW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIHRoZU1vdmllLCBXaW5kb3dQdHIgbW92aWVXaW5kb3csIFBvaW50IHdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0dldEluZE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0SW5kTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7Ik1DUmVtb3ZlQWxsTW92aWVzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlQWxsTW92aWVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DUmVtb3ZlQU1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlQU1vdmllLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1JlbW92ZU1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJc1BsYXllckV2ZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNQbGF5ZXJFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNEb0FjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0RvQWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBhY3Rpb24sIHZvaWQgKiBwYXJhbXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DU2V0Q29udHJvbGxlckF0dGFjaGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckF0dGFjaGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGF0dGFjaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJc0NvbnRyb2xsZXJBdHRhY2hlZCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0lzQ29udHJvbGxlckF0dGFjaGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DU2V0Q29udHJvbGxlclBvcnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgZ3ApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q29udHJvbGxlclBvcnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKLQl7Ik1DU2V0VmlzaWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldFZpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gdmlzaWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0VmlzaWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7Ik1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q29udHJvbGxlckJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJCb3VuZHNSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiTUNHZXRXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRXaW5kb3dSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3KSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJNQ01vdmllQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ01vdmllQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNTZXREdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldER1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q3VycmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDdXJyZW50VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydiwgVGltZVNjYWxlIHNjYWxlKSIpfSwKLQl7Ik1DTmV3QXR0YWNoZWRDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DTmV3QXR0YWNoZWRDb250cm9sbGVyLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSB0aGVNb3ZpZSwgV2luZG93UHRyIHcsIFBvaW50IHdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0RyYXciLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNEcmF3LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0FjdGl2YXRlLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgQm9vbGVhbiBhY3RpdmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJZGxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0tleSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0tleSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDgga2V5LCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNDbGljayIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0NsaWNrLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgUG9pbnQgd2hlcmUsIGxvbmcgd2hlbiwgbG9uZyBtb2RpZmllcnMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DRW5hYmxlRWRpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0VuYWJsZUVkaXRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZW5hYmxlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJc0VkaXRpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNFZGl0aW5nRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiTUNDb3B5IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7Ik1DQ3V0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ3V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiTUNQYXN0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1Bhc3RlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBzcmNNb3ZpZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNDbGVhciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0NsZWFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DVW5kbyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1VuZG8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNQb3NpdGlvbkNvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNQb3NpdGlvbkNvbnRyb2xsZXIsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgbW92aWVSZWN0LCBSZWN0IGNvbnRyb2xsZXJSZWN0LCBsb25nIHNvbWVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRDb250cm9sbGVySW5mbyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJJbmZvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNvbWVGbGFncykiKX0sCi0JeyJNQ1NldENsaXAiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDbGlwLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdGhlQ2xpcCwgUmduSGFuZGxlIG1vdmllQ2xpcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIHRoZUNsaXAsIFJnbkhhbmRsZSBtb3ZpZUNsaXApIil9LAotCXsiTUNEcmF3QmFkZ2UiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNEcmF3QmFkZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBtb3ZpZVJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSBiYWRnZVJnbikiKX0sCi0JeyJNQ1NldFVwRWRpdE1lbnUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRVcEVkaXRNZW51LCAxLAotCSBQeURvY19TVFIoIihsb25nIG1vZGlmaWVycywgTWVudUhhbmRsZSBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRNZW51U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0TWVudVN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtb2RpZmllcnMsIHNob3J0IGl0ZW0sIFN0cjI1NSBhU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1B0SW5Db250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUHRJbkNvbnRyb2xsZXIsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZVB0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBpbkNvbnRyb2xsZXIpIil9LAotCXsiTUNJbnZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSW52YWxpZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcsIFJnbkhhbmRsZSBpbnZhbGlkUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0FkanVzdEN1cnNvciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0FkanVzdEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcsIFBvaW50IHdoZXJlLCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRJbnRlcmZhY2VFbGVtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0SW50ZXJmYWNlRWxlbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTUNJbnRlcmZhY2VFbGVtZW50IHdoaWNoRWxlbWVudCwgdm9pZCAqIGVsZW1lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DQWRkTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQWRkTW92aWVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBzcmNNb3ZpZSwgQm9vbGVhbiBzY2FsZWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DVHJpbU1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1RyaW1Nb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNTZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldElkbGVNYW5hZ2VyLCAxLAotCSBQeURvY19TVFIoIihJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckNhcGFiaWxpdGllcywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik1DU2V0TW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgdGhlTW92aWUsIFdpbmRvd1B0ciBtb3ZpZVdpbmRvdywgUG9pbnQgd2hlcmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DR2V0SW5kTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRJbmRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiTUNSZW1vdmVBbGxNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNSZW1vdmVBbGxNb3ZpZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNSZW1vdmVBTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNSZW1vdmVBTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIG0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DUmVtb3ZlTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNSZW1vdmVNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lzUGxheWVyRXZlbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJc1BsYXllckV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0RvQWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DRG9BY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGFjdGlvbiwgdm9pZCAqIHBhcmFtcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNTZXRDb250cm9sbGVyQXR0YWNoZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQXR0YWNoZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gYXR0YWNoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lzQ29udHJvbGxlckF0dGFjaGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNDb250cm9sbGVyQXR0YWNoZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNTZXRDb250cm9sbGVyUG9ydCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJQb3J0LCAxLAorICAgICBQeURvY19TVFIoIihDR3JhZlB0ciBncCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDb250cm9sbGVyUG9ydCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAorICAgIHsiTUNTZXRWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0VmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiB2aXNpYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldFZpc2libGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBib3VuZHMpIil9LAorICAgIHsiTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJCb3VuZHNSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDb250cm9sbGVyQm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJNQ0dldFdpbmRvd1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldFdpbmRvd1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1DTW92aWVDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DTW92aWVDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1NldER1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0RHVyYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDdXJyZW50VGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldEN1cnJlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lU2NhbGUgc2NhbGUpIil9LAorICAgIHsiTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHRoZU1vdmllLCBXaW5kb3dQdHIgdywgUG9pbnQgd2hlcmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DRHJhdyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0RyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0FjdGl2YXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQWN0aXZhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3LCBCb29sZWFuIGFjdGl2YXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lkbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DS2V5IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DS2V5LCAxLAorICAgICBQeURvY19TVFIoIihTSW50OCBrZXksIGxvbmcgbW9kaWZpZXJzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0NsaWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ2xpY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3LCBQb2ludCB3aGVyZSwgbG9uZyB3aGVuLCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNFbmFibGVFZGl0aW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DRW5hYmxlRWRpdGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBlbmFibGVkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lzRWRpdGluZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJc0VkaXRpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJNQ0NvcHkiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiTUNDdXQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNDdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJNQ1Bhc3RlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUGFzdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHNyY01vdmllKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0NsZWFyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ2xlYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNVbmRvIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DVW5kbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1Bvc2l0aW9uQ29udHJvbGxlciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1Bvc2l0aW9uQ29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBtb3ZpZVJlY3QsIFJlY3QgY29udHJvbGxlclJlY3QsIGxvbmcgc29tZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldENvbnRyb2xsZXJJbmZvIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc29tZUZsYWdzKSIpfSwKKyAgICB7Ik1DU2V0Q2xpcCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwLCBSZ25IYW5kbGUgbW92aWVDbGlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldENsaXAiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgdGhlQ2xpcCwgUmduSGFuZGxlIG1vdmllQ2xpcCkiKX0sCisgICAgeyJNQ0RyYXdCYWRnZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0RyYXdCYWRnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIG1vdmllUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGJhZGdlUmduKSIpfSwKKyAgICB7Ik1DU2V0VXBFZGl0TWVudSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldFVwRWRpdE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbW9kaWZpZXJzLCBNZW51SGFuZGxlIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldE1lbnVTdHJpbmciLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRNZW51U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vZGlmaWVycywgc2hvcnQgaXRlbSwgU3RyMjU1IGFTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DUHRJbkNvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNQdEluQ29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGluQ29udHJvbGxlcikiKX0sCisgICAgeyJNQ0ludmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJbnZhbGlkYXRlLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgUmduSGFuZGxlIGludmFsaWRSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DQWRqdXN0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQWRqdXN0Q3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgUG9pbnQgd2hlcmUsIGxvbmcgbW9kaWZpZXJzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldEludGVyZmFjZUVsZW1lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRJbnRlcmZhY2VFbGVtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNQ0ludGVyZmFjZUVsZW1lbnQgd2hpY2hFbGVtZW50LCB2b2lkICogZWxlbWVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNBZGRNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNBZGRNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHNyY01vdmllLCBCb29sZWFuIHNjYWxlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNUcmltTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DVHJpbU1vdmllU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1NldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0SWRsZU1hbmFnZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBNb3ZpZUN0bE9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTEyNzgsNjEgKzEyNzgsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JTW92aWVDb250cm9sbGVyIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTW92aWVDb250cm9sbGVyIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIE1vdmllQ3RsT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTW92aWVDb250cm9sbGVyT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIE1vdmllQ3RsT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoTW92aWVDb250cm9sbGVyT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIE1vdmllQ3RsT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1vdmllQ29udHJvbGxlcl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RdC5Nb3ZpZUNvbnRyb2xsZXIiLCAvKnRwX25hbWUqLwotCXNpemVvZihNb3ZpZUNvbnRyb2xsZXJPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBNb3ZpZUN0bE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBNb3ZpZUN0bE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTW92aWVDdGxPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIE1vdmllQ3RsT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCU1vdmllQ3RsT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1vdmllQ3RsT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCU1vdmllQ3RsT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlNb3ZpZUN0bE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNb3ZpZUN0bE9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCU1vdmllQ3RsT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuTW92aWVDb250cm9sbGVyIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoTW92aWVDb250cm9sbGVyT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgTW92aWVDdGxPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgTW92aWVDdGxPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIE1vdmllQ3RsT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBNb3ZpZUN0bE9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBNb3ZpZUN0bE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBNb3ZpZUN0bE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBNb3ZpZUN0bE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgTW92aWVDdGxPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgTW92aWVDdGxPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBNb3ZpZUN0bE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBNb3ZpZUNvbnRyb2xsZXIgLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzNDUsNDE3ICsxMzQ1LDQxNyBAQAogI2RlZmluZSBUaW1lQmFzZU9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZUaW1lQmFzZV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZUaW1lQmFzZV9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgVGltZUJhc2VPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlUaW1lQmFzZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFRpbWVCYXNlIG9iX2l0c2VsZjsKIH0gVGltZUJhc2VPYmplY3Q7CiAKIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9OZXcoVGltZUJhc2UgaXRzZWxmKQogewotCVRpbWVCYXNlT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUaW1lQmFzZSBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFRpbWVCYXNlT2JqZWN0LCAmVGltZUJhc2VfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRpbWVCYXNlT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUaW1lQmFzZSBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKFRpbWVCYXNlT2JqZWN0LCAmVGltZUJhc2VfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVGltZUJhc2VPYmpfQ29udmVydChQeU9iamVjdCAqdiwgVGltZUJhc2UgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFUaW1lQmFzZU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUaW1lQmFzZSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChUaW1lQmFzZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIVRpbWVCYXNlT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRpbWVCYXNlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRpbWVCYXNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgVGltZUJhc2VPYmpfZGVhbGxvYyhUaW1lQmFzZU9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfRGlzcG9zZVRpbWVCYXNlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERpc3Bvc2VUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlVGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKLQlUaW1lU2NhbGUgczsKLQlUaW1lUmVjb3JkIHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OworICAgIFRpbWVTY2FsZSBzOworICAgIFRpbWVSZWNvcmQgdHI7CiAjaWZuZGVmIEdldFRpbWVCYXNlVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBzLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdHIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdHIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgU2V0VGltZUJhc2VUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICZ0cik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVZhbHVlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgdDsKLQlUaW1lU2NhbGUgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHQ7CisgICAgVGltZVNjYWxlIHM7CiAjaWZuZGVmIFNldFRpbWVCYXNlVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgdCwKLQkgICAgICAgICAgICAgICAgIHMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlVmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICBzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VSYXRlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VSYXRlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCByOwogI2lmbmRlZiBTZXRUaW1lQmFzZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcikpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlUmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICByKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUaW1lQmFzZVJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlU3RhcnRUaW1lKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVTY2FsZSBzOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CisgICAgVGltZVNjYWxlIHM7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgR2V0VGltZUJhc2VTdGFydFRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVN0YXJ0VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VTdGFydFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VTdGFydFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VTdGFydFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VTdGFydFRpbWUoVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVSZWNvcmQgdHI7CiAjaWZuZGVmIFNldFRpbWVCYXNlU3RhcnRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VTdGFydFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlU3RhcnRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0cikpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlU3RhcnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJnRyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VTdGFydFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0b3BUaW1lKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVTY2FsZSBzOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CisgICAgVGltZVNjYWxlIHM7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgR2V0VGltZUJhc2VTdG9wVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlU3RvcFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlU3RvcFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VTdG9wVGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgU2V0VGltZUJhc2VTdG9wVGltZQotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlU3RvcFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlU3RvcFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJnRyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VGbGFncyhUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUaW1lQmFzZUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VGbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VGbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZUZsYWdzKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHRpbWVCYXNlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgdGltZUJhc2VGbGFnczsKICNpZm5kZWYgU2V0VGltZUJhc2VGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lQmFzZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgdGltZUJhc2VGbGFncyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZUJhc2VGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVCYXNlRmxhZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lQmFzZSBtYXN0ZXI7Ci0JVGltZVJlY29yZCBzbGF2ZVplcm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVCYXNlIG1hc3RlcjsKKyAgICBUaW1lUmVjb3JkIHNsYXZlWmVybzsKICNpZm5kZWYgU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZtYXN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmc2xhdmVaZXJvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsYXZlWmVybyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9HZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lQmFzZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVCYXNlIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJDbG9jayhUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50IGNsb2NrTWVpc3RlcjsKLQlUaW1lUmVjb3JkIHNsYXZlWmVybzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50IGNsb2NrTWVpc3RlcjsKKyAgICBUaW1lUmVjb3JkIHNsYXZlWmVybzsKICNpZm5kZWYgU2V0VGltZUJhc2VNYXN0ZXJDbG9jawotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyQ2xvY2spOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyQ2xvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2xvY2tNZWlzdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlTWFzdGVyQ2xvY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrTWVpc3RlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjbG9ja01laXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmc2xhdmVaZXJvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VNYXN0ZXJDbG9jayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tNZWlzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsYXZlWmVybyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyQ2xvY2soVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudEluc3RhbmNlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgX3J2OwogI2lmbmRlZiBHZXRUaW1lQmFzZU1hc3RlckNsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VNYXN0ZXJDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VNYXN0ZXJDbG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VNYXN0ZXJDbG9jayhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUaW1lQmFzZU1hc3RlckNsb2NrKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VTdGF0dXMoVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVRpbWVSZWNvcmQgdW5waW5uZWRUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBUaW1lUmVjb3JkIHVucGlubmVkVGltZTsKICNpZm5kZWYgR2V0VGltZUJhc2VTdGF0dXMKLQlQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVN0YXR1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VTdGF0dXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnVucGlubmVkVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ1bnBpbm5lZFRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUaW1lQmFzZVN0YXR1cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bnBpbm5lZFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdW5waW5uZWRUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVplcm8oVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgemVybzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB6ZXJvOwogI2lmbmRlZiBTZXRUaW1lQmFzZVplcm8KLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVplcm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlWmVybyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmemVybykpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlWmVybyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAmemVybyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ6ZXJvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VaZXJvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICZ6ZXJvKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUaW1lQmFzZU9ial9tZXRob2RzW10gPSB7Ci0JeyJEaXNwb3NlVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfRGlzcG9zZVRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZVRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAotCXsiU2V0VGltZUJhc2VUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0cikgLT4gTm9uZSIpfSwKLQl7IlNldFRpbWVCYXNlVmFsdWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHQsIFRpbWVTY2FsZSBzKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VSYXRlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IlNldFRpbWVCYXNlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHIpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZVN0YXJ0VGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXJ0VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHMpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIHRyKSIpfSwKLQl7IlNldFRpbWVCYXNlU3RhcnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlU3RhcnRUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAotCXsiU2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VGbGFncyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRUaW1lQmFzZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgdGltZUJhc2VGbGFncykgLT4gTm9uZSIpfSwKLQl7IlNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZUJhc2UgbWFzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKLQl7IkdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKLQl7IlNldFRpbWVCYXNlTWFzdGVyQ2xvY2siLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJDbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGNsb2NrTWVpc3RlciwgVGltZVJlY29yZCBzbGF2ZVplcm8pIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZU1hc3RlckNsb2NrIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyQ2xvY2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCi0JeyJHZXRUaW1lQmFzZVN0YXR1cyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYsIFRpbWVSZWNvcmQgdW5waW5uZWRUaW1lKSIpfSwKLQl7IlNldFRpbWVCYXNlWmVybyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVplcm8sIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgemVybykgLT4gTm9uZSIpfSwKLQl7IkdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJEaXNwb3NlVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfRGlzcG9zZVRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZVRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAorICAgIHsiU2V0VGltZUJhc2VUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0cikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRpbWVCYXNlVmFsdWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHQsIFRpbWVTY2FsZSBzKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VSYXRlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlNldFRpbWVCYXNlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZVN0YXJ0VGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXJ0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHMpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIHRyKSIpfSwKKyAgICB7IlNldFRpbWVCYXNlU3RhcnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlU3RhcnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAorICAgIHsiU2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VGbGFncyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJTZXRUaW1lQmFzZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgdGltZUJhc2VGbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZUJhc2UgbWFzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKKyAgICB7IlNldFRpbWVCYXNlTWFzdGVyQ2xvY2siLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJDbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGNsb2NrTWVpc3RlciwgVGltZVJlY29yZCBzbGF2ZVplcm8pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZU1hc3RlckNsb2NrIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyQ2xvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCisgICAgeyJHZXRUaW1lQmFzZVN0YXR1cyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYsIFRpbWVSZWNvcmQgdW5waW5uZWRUaW1lKSIpfSwKKyAgICB7IlNldFRpbWVCYXNlWmVybyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVplcm8sIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgemVybykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFRpbWVCYXNlT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTc3Miw2MSArMTc3Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlUaW1lQmFzZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFRpbWVCYXNlIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoVGltZUJhc2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVGltZUJhc2VPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChUaW1lQmFzZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBUaW1lQmFzZU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBUaW1lQmFzZV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RdC5UaW1lQmFzZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRpbWVCYXNlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgVGltZUJhc2VPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgVGltZUJhc2VPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRpbWVCYXNlT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBUaW1lQmFzZU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlUaW1lQmFzZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlUaW1lQmFzZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlUaW1lQmFzZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JVGltZUJhc2VPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVGltZUJhc2VPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlUaW1lQmFzZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1F0LlRpbWVCYXNlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoVGltZUJhc2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBUaW1lQmFzZU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBUaW1lQmFzZU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgVGltZUJhc2VPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFRpbWVCYXNlT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIFRpbWVCYXNlT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIFRpbWVCYXNlT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFRpbWVCYXNlT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBUaW1lQmFzZU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBUaW1lQmFzZU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFRpbWVCYXNlT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBUaW1lQmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTgzOSwyOTQgKzE4MzksMjk0IEBACiAjZGVmaW5lIFVzZXJEYXRhT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlVzZXJEYXRhX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlVzZXJEYXRhX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBVc2VyRGF0YU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVVzZXJEYXRhIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgVXNlckRhdGEgb2JfaXRzZWxmOwogfSBVc2VyRGF0YU9iamVjdDsKIAogUHlPYmplY3QgKlVzZXJEYXRhT2JqX05ldyhVc2VyRGF0YSBpdHNlbGYpCiB7Ci0JVXNlckRhdGFPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFVzZXJEYXRhIGZyb20gTlVMTCBwb2ludGVyIik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoVXNlckRhdGFPYmplY3QsICZVc2VyRGF0YV9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgVXNlckRhdGFPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFVzZXJEYXRhIGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoVXNlckRhdGFPYmplY3QsICZVc2VyRGF0YV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBVc2VyRGF0YU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBVc2VyRGF0YSAqcF9pdHNlbGYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIVVzZXJEYXRhT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlVzZXJEYXRhIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFVzZXJEYXRhT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghVXNlckRhdGFPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVXNlckRhdGEgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoVXNlckRhdGFPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBVc2VyRGF0YU9ial9kZWFsbG9jKFVzZXJEYXRhT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9pdHNlbGYpIERpc3Bvc2VVc2VyRGF0YShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZVVzZXJEYXRhKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9HZXRVc2VyRGF0YShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YTsKLQlPU1R5cGUgdWRUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGE7CisgICAgT1NUeXBlIHVkVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBHZXRVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldFVzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRVc2VyRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX0FkZFVzZXJEYXRhKFVzZXJEYXRhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhOwotCU9TVHlwZSB1ZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGE7CisgICAgT1NUeXBlIHVkVHlwZTsKICNpZm5kZWYgQWRkVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhBZGRVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZFVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZFVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfUmVtb3ZlVXNlckRhdGEoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSB1ZFR5cGU7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgUmVtb3ZlVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfQ291bnRVc2VyRGF0YVR5cGUoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlPU1R5cGUgdWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgT1NUeXBlIHVkVHlwZTsKICNpZm5kZWYgQ291bnRVc2VyRGF0YVR5cGUKLQlQeU1hY19QUkVDSEVDSyhDb3VudFVzZXJEYXRhVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ291bnRVc2VyRGF0YVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudFVzZXJEYXRhVHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudFVzZXJEYXRhVHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfR2V0TmV4dFVzZXJEYXRhVHlwZShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JT1NUeXBlIHVkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgT1NUeXBlIHVkVHlwZTsKICNpZm5kZWYgR2V0TmV4dFVzZXJEYXRhVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRVc2VyRGF0YVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHRVc2VyRGF0YVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0VXNlckRhdGFUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dFVzZXJEYXRhVHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9BZGRVc2VyRGF0YVRleHQoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGE7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OwotCXNob3J0IGl0bFJlZ2lvblRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YTsKKyAgICBPU1R5cGUgdWRUeXBlOworICAgIGxvbmcgaW5kZXg7CisgICAgc2hvcnQgaXRsUmVnaW9uVGFnOwogI2lmbmRlZiBBZGRVc2VyRGF0YVRleHQKLQlQeU1hY19QUkVDSEVDSyhBZGRVc2VyRGF0YVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFVzZXJEYXRhVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9HZXRVc2VyRGF0YVRleHQoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGE7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OwotCXNob3J0IGl0bFJlZ2lvblRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YTsKKyAgICBPU1R5cGUgdWRUeXBlOworICAgIGxvbmcgaW5kZXg7CisgICAgc2hvcnQgaXRsUmVnaW9uVGFnOwogI2lmbmRlZiBHZXRVc2VyRGF0YVRleHQKLQlQeU1hY19QUkVDSEVDSyhHZXRVc2VyRGF0YVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFVzZXJEYXRhVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9SZW1vdmVVc2VyRGF0YVRleHQoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OwotCXNob3J0IGl0bFJlZ2lvblRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgdWRUeXBlOworICAgIGxvbmcgaW5kZXg7CisgICAgc2hvcnQgaXRsUmVnaW9uVGFnOwogI2lmbmRlZiBSZW1vdmVVc2VyRGF0YVRleHQKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVVc2VyRGF0YVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZVVzZXJEYXRhVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGxSZWdpb25UYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlVXNlckRhdGFUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGl0bFJlZ2lvblRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZVVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGxSZWdpb25UYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX1B1dFVzZXJEYXRhSW50b0hhbmRsZShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgUHV0VXNlckRhdGFJbnRvSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0VXNlckRhdGFJbnRvSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRVc2VyRGF0YUludG9IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0VXNlckRhdGFJbnRvSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQdXRVc2VyRGF0YUludG9IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX0NvcHlVc2VyRGF0YShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVc2VyRGF0YSBkc3RVc2VyRGF0YTsKLQlPU1R5cGUgY29weVJ1bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVXNlckRhdGEgZHN0VXNlckRhdGE7CisgICAgT1NUeXBlIGNvcHlSdWxlOwogI2lmbmRlZiBDb3B5VXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhDb3B5VXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlVc2VyRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJmRzdFVzZXJEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5VXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGRzdFVzZXJEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmZHN0VXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvcHlSdWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0VXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UnVsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBVc2VyRGF0YU9ial9tZXRob2RzW10gPSB7Ci0JeyJHZXRVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9HZXRVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCi0JeyJBZGRVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9BZGRVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUpIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9SZW1vdmVVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50VXNlckRhdGFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0NvdW50VXNlckRhdGFUeXBlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgdWRUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldE5leHRVc2VyRGF0YVR5cGUiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfR2V0TmV4dFVzZXJEYXRhVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkFkZFVzZXJEYXRhVGV4dCIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9BZGRVc2VyRGF0YVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlLCBsb25nIGluZGV4LCBzaG9ydCBpdGxSZWdpb25UYWcpIC0+IE5vbmUiKX0sCi0JeyJHZXRVc2VyRGF0YVRleHQiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfR2V0VXNlckRhdGFUZXh0LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YSwgT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCwgc2hvcnQgaXRsUmVnaW9uVGFnKSAtPiBOb25lIil9LAotCXsiUmVtb3ZlVXNlckRhdGFUZXh0IiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX1JlbW92ZVVzZXJEYXRhVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCwgc2hvcnQgaXRsUmVnaW9uVGFnKSAtPiBOb25lIil9LAotCXsiUHV0VXNlckRhdGFJbnRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX1B1dFVzZXJEYXRhSW50b0hhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IE5vbmUiKX0sCi0JeyJDb3B5VXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQ29weVVzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIihVc2VyRGF0YSBkc3RVc2VyRGF0YSwgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiR2V0VXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfR2V0VXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiQWRkVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQWRkVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfUmVtb3ZlVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJDb3VudFVzZXJEYXRhVHlwZSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9Db3VudFVzZXJEYXRhVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXROZXh0VXNlckRhdGFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0dldE5leHRVc2VyRGF0YVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJBZGRVc2VyRGF0YVRleHQiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQWRkVXNlckRhdGFUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YSwgT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCwgc2hvcnQgaXRsUmVnaW9uVGFnKSAtPiBOb25lIil9LAorICAgIHsiR2V0VXNlckRhdGFUZXh0IiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0dldFVzZXJEYXRhVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgsIHNob3J0IGl0bFJlZ2lvblRhZykgLT4gTm9uZSIpfSwKKyAgICB7IlJlbW92ZVVzZXJEYXRhVGV4dCIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9SZW1vdmVVc2VyRGF0YVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgsIHNob3J0IGl0bFJlZ2lvblRhZykgLT4gTm9uZSIpfSwKKyAgICB7IlB1dFVzZXJEYXRhSW50b0hhbmRsZSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9QdXRVc2VyRGF0YUludG9IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiBOb25lIil9LAorICAgIHsiQ29weVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0NvcHlVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVXNlckRhdGEgZHN0VXNlckRhdGEsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgVXNlckRhdGFPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0yMTQzLDYxICsyMTQzLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVVzZXJEYXRhIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVXNlckRhdGEgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVXNlckRhdGFPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChVc2VyRGF0YU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBVc2VyRGF0YU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFVzZXJEYXRhT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFVzZXJEYXRhT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFVzZXJEYXRhX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0LlVzZXJEYXRhIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVXNlckRhdGFPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBVc2VyRGF0YU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBVc2VyRGF0YU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVXNlckRhdGFPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFVzZXJEYXRhT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVVzZXJEYXRhT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVVzZXJEYXRhT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVVzZXJEYXRhT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlVc2VyRGF0YU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlVc2VyRGF0YU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVVzZXJEYXRhT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuVXNlckRhdGEiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihVc2VyRGF0YU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFVzZXJEYXRhT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFVzZXJEYXRhT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBVc2VyRGF0YU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgVXNlckRhdGFPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgVXNlckRhdGFPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVXNlckRhdGFPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgVXNlckRhdGFPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFVzZXJEYXRhT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFVzZXJEYXRhT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgVXNlckRhdGFPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFVzZXJEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMjEwLDExNjUgKzIyMTAsMTE2NSBAQAogI2RlZmluZSBNZWRpYU9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZNZWRpYV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZNZWRpYV9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgTWVkaWFPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlNZWRpYSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIE1lZGlhIG9iX2l0c2VsZjsKIH0gTWVkaWFPYmplY3Q7CiAKIFB5T2JqZWN0ICpNZWRpYU9ial9OZXcoTWVkaWEgaXRzZWxmKQogewotCU1lZGlhT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNZWRpYSBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKE1lZGlhT2JqZWN0LCAmTWVkaWFfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE1lZGlhT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNZWRpYSBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKE1lZGlhT2JqZWN0LCAmTWVkaWFfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgTWVkaWFPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTWVkaWEgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFNZWRpYU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNZWRpYSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChNZWRpYU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIU1lZGlhT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1lZGlhIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKE1lZGlhT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgTWVkaWFPYmpfZGVhbGxvYyhNZWRpYU9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlVHJhY2tNZWRpYShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZVRyYWNrTWVkaWEoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0xvYWRNZWRpYUludG9SYW0oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIExvYWRNZWRpYUludG9SYW0KLQlQeU1hY19QUkVDSEVDSyhMb2FkTWVkaWFJbnRvUmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2FkTWVkaWFJbnRvUmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkTWVkaWFJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRNZWRpYUludG9SYW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVRyYWNrKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFUcmFjawotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVHJhY2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVHJhY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhVHJhY2soX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhVHJhY2soX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFDcmVhdGlvblRpbWUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFDcmVhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUNyZWF0aW9uVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFDcmVhdGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYUNyZWF0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhTW9kaWZpY2F0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhVGltZVNjYWxlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lU2NhbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lU2NhbGUgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhVGltZVNjYWxlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lU2NhbGUgdGltZVNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lU2NhbGUgdGltZVNjYWxlOwogI2lmbmRlZiBTZXRNZWRpYVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhVGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWVTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lZGlhVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgdGltZVNjYWxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZWRpYVRpbWVTY2FsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHRpbWVTY2FsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhRHVyYXRpb24oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CiAjaWZuZGVmIEdldE1lZGlhRHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUR1cmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUR1cmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZWRpYUR1cmF0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYUR1cmF0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhTGFuZ3VhZ2UoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRNZWRpYUxhbmd1YWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFMYW5ndWFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFMYW5ndWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFMYW5ndWFnZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFMYW5ndWFnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYUxhbmd1YWdlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBsYW5ndWFnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbGFuZ3VhZ2U7CiAjaWZuZGVmIFNldE1lZGlhTGFuZ3VhZ2UKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYUxhbmd1YWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYUxhbmd1YWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGFuZ3VhZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZWRpYUxhbmd1YWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBsYW5ndWFnZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGFuZ3VhZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZWRpYUxhbmd1YWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhUXVhbGl0eShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldE1lZGlhUXVhbGl0eQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhUXVhbGl0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFRdWFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZWRpYVF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVF1YWxpdHkoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHF1YWxpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHF1YWxpdHk7CiAjaWZuZGVmIFNldE1lZGlhUXVhbGl0eQotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhUXVhbGl0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFRdWFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lZGlhUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBxdWFsaXR5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVkaWFRdWFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKLQlTdHIyNTUgY3JlYXRvck5hbWU7Ci0JT1NUeXBlIGNyZWF0b3JNYW51ZmFjdHVyZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TVHlwZSBtZWRpYVR5cGU7CisgICAgU3RyMjU1IGNyZWF0b3JOYW1lOworICAgIE9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyOwogI2lmbmRlZiBHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY3JlYXRvck5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3JNYW51ZmFjdHVyZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yTWFudWZhY3R1cmVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY3JlYXRvck5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3JNYW51ZmFjdHVyZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yTWFudWZhY3R1cmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVVzZXJEYXRhKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVc2VyRGF0YSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVzZXJEYXRhIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZWRpYUhhbmRsZXIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZWRpYUhhbmRsZXIgX3J2OwogI2lmbmRlZiBHZXRNZWRpYUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhSGFuZGxlcihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNZWRpYUhhbmRsZXJDb21wb25lbnQgbUg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTWVkaWFIYW5kbGVyQ29tcG9uZW50IG1IOwogI2lmbmRlZiBTZXRNZWRpYUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYUhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmbUgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBtSCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJm1IKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lZGlhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0JlZ2luTWVkaWFFZGl0cyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQmVnaW5NZWRpYUVkaXRzCi0JUHlNYWNfUFJFQ0hFQ0soQmVnaW5NZWRpYUVkaXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCZWdpbk1lZGlhRWRpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBCZWdpbk1lZGlhRWRpdHMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCZWdpbk1lZGlhRWRpdHMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfRW5kTWVkaWFFZGl0cyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgRW5kTWVkaWFFZGl0cwotCVB5TWFjX1BSRUNIRUNLKEVuZE1lZGlhRWRpdHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuZE1lZGlhRWRpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmRNZWRpYUVkaXRzKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW5kTWVkaWFFZGl0cyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgaW5kZXg7CiAjaWZuZGVmIFNldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleAotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGluZGV4OwotCU9TVHlwZSBkaFR5cGU7Ci0JU3RyMjU1IGNyZWF0b3JOYW1lOwotCU9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBPU1R5cGUgZGhUeXBlOworICAgIFN0cjI1NSBjcmVhdG9yTmFtZTsKKyAgICBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcjsKICNpZm5kZWYgR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGNyZWF0b3JOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGhUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3JNYW51ZmFjdHVyZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGhUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yTWFudWZhY3R1cmVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY3JlYXRvck5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRvck1hbnVmYWN0dXJlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkaFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNyZWF0b3JNYW51ZmFjdHVyZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhRGF0YUhhbmRsZXIoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURhdGFIYW5kbGVyIF9ydjsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGF0YUhhbmRsZXIgX3J2OworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBHZXRNZWRpYURhdGFIYW5kbGVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFEYXRhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhRGF0YUhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhRGF0YUhhbmRsZXIoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgaW5kZXg7Ci0JRGF0YUhhbmRsZXJDb21wb25lbnQgZGF0YUhhbmRsZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgaW5kZXg7CisgICAgRGF0YUhhbmRsZXJDb21wb25lbnQgZGF0YUhhbmRsZXI7CiAjaWZuZGVmIFNldE1lZGlhRGF0YUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZkYXRhSGFuZGxlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZWRpYURhdGFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZkYXRhSGFuZGxlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYURhdGFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBpbmRleDsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBpbmRleDsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSDsKICNpZm5kZWYgR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2NIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjSCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjSCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY0gpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5kZXg7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpbmRleDsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSDsKICNpZm5kZWYgU2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2NIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjSCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2NIKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjSCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVDb3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZUNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTYW1wbGVDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTYW1wbGVDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFTYW1wbGVDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFTYW1wbGVDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVN5bmNTYW1wbGVDb3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVN5bmNTYW1wbGVDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU3luY1NhbXBsZUNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVN5bmNTYW1wbGVDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFTeW5jU2FtcGxlQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhU3luY1NhbXBsZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NhbXBsZU51bVRvTWVkaWFUaW1lKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGxvZ2ljYWxTYW1wbGVOdW07Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0JVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGxvZ2ljYWxTYW1wbGVOdW07CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uOwogI2lmbmRlZiBTYW1wbGVOdW1Ub01lZGlhVGltZQotCVB5TWFjX1BSRUNIRUNLKFNhbXBsZU51bVRvTWVkaWFUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTYW1wbGVOdW1Ub01lZGlhVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxvZ2ljYWxTYW1wbGVOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTYW1wbGVOdW1Ub01lZGlhVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxTYW1wbGVOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9naWNhbFNhbXBsZU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNhbXBsZU51bVRvTWVkaWFUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbFNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfTWVkaWFUaW1lVG9TYW1wbGVOdW0oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSB0aW1lOwotCWxvbmcgc2FtcGxlTnVtOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOwotCVRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgbG9uZyBzYW1wbGVOdW07CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uOwogI2lmbmRlZiBNZWRpYVRpbWVUb1NhbXBsZU51bQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhVGltZVRvU2FtcGxlTnVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVRpbWVUb1NhbXBsZU51bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlNZWRpYVRpbWVUb1NhbXBsZU51bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNZWRpYVRpbWVUb1NhbXBsZU51bShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9BZGRNZWRpYVNhbXBsZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YUluOwotCWxvbmcgaW5PZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCVRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7Ci0JbG9uZyBudW1iZXJPZlNhbXBsZXM7Ci0Jc2hvcnQgc2FtcGxlRmxhZ3M7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFJbjsKKyAgICBsb25nIGluT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOwogI2lmbmRlZiBBZGRNZWRpYVNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKEFkZE1lZGlhU2FtcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNZWRpYVNhbXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbE8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZE1lZGlhU2FtcGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGRhdGFJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCi0JICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbE8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZE1lZGlhU2FtcGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9BZGRNZWRpYVNhbXBsZVJlZmVyZW5jZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGRhdGFPZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCVRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7Ci0JbG9uZyBudW1iZXJPZlNhbXBsZXM7Ci0Jc2hvcnQgc2FtcGxlRmxhZ3M7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOwogI2lmbmRlZiBBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEFkZE1lZGlhU2FtcGxlUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxPJmxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25QZXJTYW1wbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25QZXJTYW1wbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbE8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFPdXQ7Ci0JbG9uZyBtYXhTaXplVG9Hcm93OwotCWxvbmcgc2l6ZTsKLQlUaW1lVmFsdWUgdGltZTsKLQlUaW1lVmFsdWUgc2FtcGxlVGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOwotCWxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLQlsb25nIG1heE51bWJlck9mU2FtcGxlczsKLQlsb25nIG51bWJlck9mU2FtcGxlczsKLQlzaG9ydCBzYW1wbGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YU91dDsKKyAgICBsb25nIG1heFNpemVUb0dyb3c7CisgICAgbG9uZyBzaXplOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4OworICAgIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZVRvR3JvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4TnVtYmVyT2ZTYW1wbGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhU2FtcGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGRhdGFPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgIG1heFNpemVUb0dyb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEZXNjcmlwdGlvbkluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBtYXhOdW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbGxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25QZXJTYW1wbGUsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplVG9Hcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhOdW1iZXJPZlNhbXBsZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVkaWFTYW1wbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZVRvR3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25QZXJTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBkYXRhT2Zmc2V0OwotCWxvbmcgc2l6ZTsKLQlUaW1lVmFsdWUgdGltZTsKLQlUaW1lVmFsdWUgc2FtcGxlVGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOwotCWxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLQlsb25nIG1heE51bWJlck9mU2FtcGxlczsKLQlsb25nIG51bWJlck9mU2FtcGxlczsKLQlzaG9ydCBzYW1wbGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGRhdGFPZmZzZXQ7CisgICAgbG9uZyBzaXplOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4OworICAgIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4TnVtYmVyT2ZTYW1wbGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhU2FtcGxlUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGxsbGgiLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4TnVtYmVyT2ZTYW1wbGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lZGlhU2FtcGxlUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGxsbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIG1heENodW5rU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIG1heENodW5rU2l6ZTsKICNpZm5kZWYgU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhDaHVua1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q2h1bmtTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heENodW5rU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDaHVua1NpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgbWF4Q2h1bmtTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgbWF4Q2h1bmtTaXplOwogI2lmbmRlZiBHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhDaHVua1NpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG1heENodW5rU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4Q2h1bmtTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDaHVua1NpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhU2hhZG93U3luYyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGZyYW1lRGlmZlNhbXBsZU51bTsKLQlsb25nIHN5bmNTYW1wbGVOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBmcmFtZURpZmZTYW1wbGVOdW07CisgICAgbG9uZyBzeW5jU2FtcGxlTnVtOwogI2lmbmRlZiBTZXRNZWRpYVNoYWRvd1N5bmMKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVNoYWRvd1N5bmMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhU2hhZG93U3luYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcmFtZURpZmZTYW1wbGVOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZzeW5jU2FtcGxlTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhU2hhZG93U3luYyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEaWZmU2FtcGxlTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY1NhbXBsZU51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVEaWZmU2FtcGxlTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3luY1NhbXBsZU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYVNoYWRvd1N5bmMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGlmZlNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhU2hhZG93U3luYyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGZyYW1lRGlmZlNhbXBsZU51bTsKLQlsb25nIHN5bmNTYW1wbGVOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBmcmFtZURpZmZTYW1wbGVOdW07CisgICAgbG9uZyBzeW5jU2FtcGxlTnVtOwogI2lmbmRlZiBHZXRNZWRpYVNoYWRvd1N5bmMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNoYWRvd1N5bmMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2hhZG93U3luYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lRGlmZlNhbXBsZU51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYVNoYWRvd1N5bmMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGlmZlNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW5jU2FtcGxlTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lRGlmZlNhbXBsZU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYVNoYWRvd1N5bmMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGlmZlNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW5jU2FtcGxlTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldE1lZGlhRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhRGF0YVNpemU2NChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQl3aWRlIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIHdpZGUgZGF0YVNpemU7CiAjaWZuZGVmIEdldE1lZGlhRGF0YVNpemU2NAotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YVNpemU2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhRGF0YVNpemU2NChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRhdGFTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYURhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfQ29weU1lZGlhVXNlckRhdGEoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTWVkaWEgZHN0TWVkaWE7Ci0JT1NUeXBlIGNvcHlSdWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1lZGlhIGRzdE1lZGlhOworICAgIE9TVHlwZSBjb3B5UnVsZTsKICNpZm5kZWYgQ29weU1lZGlhVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhDb3B5TWVkaWFVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weU1lZGlhVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX0NvbnZlcnQsICZkc3RNZWRpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29weVJ1bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1lZGlhVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TWVkaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlSdWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfQ29udmVydCwgJmRzdE1lZGlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5TWVkaWFVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JRml4ZWQgcmF0ZTsKLQlUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lOwotCVRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFnczsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBGaXhlZCByYXRlOworICAgIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb247CiAjaWZuZGVmIEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdEdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFEYXRhUmVmKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGluZGV4OwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIGRhdGFSZWZBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRNZWRpYURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmQXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZBdHRyaWJ1dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZBdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYURhdGFSZWYoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgaW5kZXg7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgU2V0TWVkaWFEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFEYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVkaWFEYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBpbmRleDsKLQlsb25nIGRhdGFSZWZBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OworICAgIGxvbmcgZGF0YVJlZkF0dHJpYnV0ZXM7CiAjaWZuZGVmIFNldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZkF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfQWRkTWVkaWFEYXRhUmVmKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGluZGV4OwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIEFkZE1lZGlhRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKEFkZE1lZGlhRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkTWVkaWFEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkTWVkaWFEYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFSZWZDb3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBjb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBjb3VudDsKICNpZm5kZWYgR2V0TWVkaWFEYXRhUmVmQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFSZWZDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhUmVmQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYURhdGFSZWZDb3VudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lZGlhRGF0YVJlZkNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhUGxheUhpbnRzKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGZsYWdzOwotCWxvbmcgZmxhZ3NNYXNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGZsYWdzOworICAgIGxvbmcgZmxhZ3NNYXNrOwogI2lmbmRlZiBTZXRNZWRpYVBsYXlIaW50cwotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhUGxheUhpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVBsYXlIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCi0JCXJldHVybiBOVUxMOwotCVNldE1lZGlhUGxheUhpbnRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZWRpYVBsYXlIaW50cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhUGxheUhpbnRzKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHZXRNZWRpYVBsYXlIaW50cwotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhUGxheUhpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVBsYXlIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFQbGF5SGludHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1lZGlhUGxheUhpbnRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHkoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIHJhdGU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgRml4ZWQgcmF0ZTsKKyAgICBUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lOwogI2lmbmRlZiBHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBNZWRpYU9ial9tZXRob2RzW10gPSB7Ci0JeyJMb2FkTWVkaWFJbnRvUmFtIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0xvYWRNZWRpYUludG9SYW0sIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lLCBUaW1lVmFsdWUgZHVyYXRpb24sIGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVHJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXRNZWRpYUNyZWF0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUNyZWF0aW9uVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAotCXsiR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTW9kaWZpY2F0aW9uVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAotCXsiR2V0TWVkaWFUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVTY2FsZSBfcnYpIil9LAotCXsiU2V0TWVkaWFUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVTY2FsZSB0aW1lU2NhbGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYUR1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRHVyYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBfcnYpIil9LAotCXsiR2V0TWVkaWFMYW5ndWFnZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUxhbmd1YWdlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiU2V0TWVkaWFMYW5ndWFnZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYUxhbmd1YWdlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBsYW5ndWFnZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lZGlhUXVhbGl0eSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVF1YWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTZXRNZWRpYVF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFRdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBxdWFsaXR5KSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBjcmVhdG9yTmFtZSkgLT4gKE9TVHlwZSBtZWRpYVR5cGUsIE9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyKSIpfSwKLQl7IkdldE1lZGlhVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgX3J2KSIpfSwKLQl7IkdldE1lZGlhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lZGlhSGFuZGxlciBfcnYpIil9LAotCXsiU2V0TWVkaWFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyQ29tcG9uZW50IG1IKSAtPiBOb25lIil9LAotCXsiQmVnaW5NZWRpYUVkaXRzIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0JlZ2luTWVkaWFFZGl0cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRW5kTWVkaWFFZGl0cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9FbmRNZWRpYUVkaXRzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkdldE1lZGlhRGF0YUhhbmRsZXJEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBTdHIyNTUgY3JlYXRvck5hbWUpIC0+IChPU1R5cGUgZGhUeXBlLCBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcikiKX0sCi0JeyJHZXRNZWRpYURhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoRGF0YUhhbmRsZXIgX3J2KSIpfSwKLQl7IlNldE1lZGlhRGF0YUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFEYXRhSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIERhdGFIYW5kbGVyQ29tcG9uZW50IGRhdGFIYW5kbGVyKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSCkgLT4gTm9uZSIpfSwKLQl7IlNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0gpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVNhbXBsZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1lZGlhU3luY1NhbXBsZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU3luY1NhbXBsZUNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTYW1wbGVOdW1Ub01lZGlhVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TYW1wbGVOdW1Ub01lZGlhVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBsb2dpY2FsU2FtcGxlTnVtKSAtPiAoVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbikiKX0sCi0JeyJNZWRpYVRpbWVUb1NhbXBsZU51bSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9NZWRpYVRpbWVUb1NhbXBsZU51bSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChsb25nIHNhbXBsZU51bSwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbikiKX0sCi0JeyJBZGRNZWRpYVNhbXBsZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9BZGRNZWRpYVNhbXBsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFJbiwgbG9uZyBpbk9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSAtPiAoVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSAtPiAoVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiR2V0TWVkaWFTYW1wbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhT3V0LCBsb25nIG1heFNpemVUb0dyb3csIFRpbWVWYWx1ZSB0aW1lLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzKSAtPiAobG9uZyBzaXplLCBUaW1lVmFsdWUgc2FtcGxlVGltZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBsb25nIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykiKX0sCi0JeyJHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZVJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCwgbG9uZyBtYXhOdW1iZXJPZlNhbXBsZXMpIC0+IChsb25nIGRhdGFPZmZzZXQsIGxvbmcgc2l6ZSwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZSwgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LCBsb25nIG51bWJlck9mU2FtcGxlcywgc2hvcnQgc2FtcGxlRmxhZ3MpIil9LAotCXsiU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbWF4Q2h1bmtTaXplKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgbWF4Q2h1bmtTaXplKSIpfSwKLQl7IlNldE1lZGlhU2hhZG93U3luYyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYVNoYWRvd1N5bmMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZnJhbWVEaWZmU2FtcGxlTnVtLCBsb25nIHN5bmNTYW1wbGVOdW0pIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVNoYWRvd1N5bmMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTaGFkb3dTeW5jLCAxLAotCSBQeURvY19TVFIoIihsb25nIGZyYW1lRGlmZlNhbXBsZU51bSkgLT4gKGxvbmcgc3luY1NhbXBsZU51bSkiKX0sCi0JeyJHZXRNZWRpYURhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1lZGlhRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAotCXsiQ29weU1lZGlhVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQ29weU1lZGlhVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhIGRzdE1lZGlhLCBPU1R5cGUgY29weVJ1bGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFncywgVGltZVZhbHVlIHRpbWUsIEZpeGVkIHJhdGUpIC0+IChUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lLCBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbikiKX0sCi0JeyJHZXRNZWRpYURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgZGF0YVJlZkF0dHJpYnV0ZXMpIil9LAotCXsiU2V0TWVkaWFEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAotCXsiQWRkTWVkaWFEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0FkZE1lZGlhRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKHNob3J0IGluZGV4KSIpfSwKLQl7IkdldE1lZGlhRGF0YVJlZkNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVJlZkNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBjb3VudCkiKX0sCi0JeyJTZXRNZWRpYVBsYXlIaW50cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYVBsYXlIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVBsYXlIaW50cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVBsYXlIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBmbGFncykiKX0sCi0JeyJHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHksIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTG9hZE1lZGlhSW50b1JhbSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9Mb2FkTWVkaWFJbnRvUmFtLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFUcmFjayIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVRyYWNrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiR2V0TWVkaWFDcmVhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFDcmVhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhTW9kaWZpY2F0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lU2NhbGUgX3J2KSIpfSwKKyAgICB7IlNldE1lZGlhVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgdGltZVNjYWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUR1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhTGFuZ3VhZ2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFMYW5ndWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldE1lZGlhTGFuZ3VhZ2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFMYW5ndWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGFuZ3VhZ2UpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZWRpYVF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFRdWFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiU2V0TWVkaWFRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhUXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcXVhbGl0eSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgY3JlYXRvck5hbWUpIC0+IChPU1R5cGUgbWVkaWFUeXBlLCBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcikiKX0sCisgICAgeyJHZXRNZWRpYVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZWRpYUhhbmRsZXIgX3J2KSIpfSwKKyAgICB7IlNldE1lZGlhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlckNvbXBvbmVudCBtSCkgLT4gTm9uZSIpfSwKKyAgICB7IkJlZ2luTWVkaWFFZGl0cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9CZWdpbk1lZGlhRWRpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkVuZE1lZGlhRWRpdHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfRW5kTWVkaWFFZGl0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgU3RyMjU1IGNyZWF0b3JOYW1lKSAtPiAoT1NUeXBlIGRoVHlwZSwgT1NUeXBlIGNyZWF0b3JNYW51ZmFjdHVyZXIpIil9LAorICAgIHsiR2V0TWVkaWFEYXRhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKERhdGFIYW5kbGVyIF9ydikiKX0sCisgICAgeyJTZXRNZWRpYURhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGF0YUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBEYXRhSGFuZGxlckNvbXBvbmVudCBkYXRhSGFuZGxlcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0gpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2NIKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFTYW1wbGVDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZUNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYVN5bmNTYW1wbGVDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVN5bmNTYW1wbGVDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2FtcGxlTnVtVG9NZWRpYVRpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2FtcGxlTnVtVG9NZWRpYVRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbG9naWNhbFNhbXBsZU51bSkgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIil9LAorICAgIHsiTWVkaWFUaW1lVG9TYW1wbGVOdW0iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfTWVkaWFUaW1lVG9TYW1wbGVOdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lKSAtPiAobG9uZyBzYW1wbGVOdW0sIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIil9LAorICAgIHsiQWRkTWVkaWFTYW1wbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQWRkTWVkaWFTYW1wbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhSW4sIGxvbmcgaW5PZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IkFkZE1lZGlhU2FtcGxlUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0FkZE1lZGlhU2FtcGxlUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YU91dCwgbG9uZyBtYXhTaXplVG9Hcm93LCBUaW1lVmFsdWUgdGltZSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25ILCBsb25nIG1heE51bWJlck9mU2FtcGxlcykgLT4gKGxvbmcgc2l6ZSwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZSwgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LCBsb25nIG51bWJlck9mU2FtcGxlcywgc2hvcnQgc2FtcGxlRmxhZ3MpIil9LAorICAgIHsiR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzKSAtPiAobG9uZyBkYXRhT2Zmc2V0LCBsb25nIHNpemUsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIGxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSIpfSwKKyAgICB7IlNldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1heENodW5rU2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIG1heENodW5rU2l6ZSkiKX0sCisgICAgeyJTZXRNZWRpYVNoYWRvd1N5bmMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFTaGFkb3dTeW5jLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZyYW1lRGlmZlNhbXBsZU51bSwgbG9uZyBzeW5jU2FtcGxlTnVtKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFTaGFkb3dTeW5jIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2hhZG93U3luYywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmcmFtZURpZmZTYW1wbGVOdW0pIC0+IChsb25nIHN5bmNTYW1wbGVOdW0pIil9LAorICAgIHsiR2V0TWVkaWFEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYURhdGFTaXplNjQiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+ICh3aWRlIGRhdGFTaXplKSIpfSwKKyAgICB7IkNvcHlNZWRpYVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0NvcHlNZWRpYVVzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYSBkc3RNZWRpYSwgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSwgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb24pIil9LAorICAgIHsiR2V0TWVkaWFEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzKSIpfSwKKyAgICB7IlNldE1lZGlhRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgbG9uZyBkYXRhUmVmQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkFkZE1lZGlhRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9BZGRNZWRpYURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChzaG9ydCBpbmRleCkiKX0sCisgICAgeyJHZXRNZWRpYURhdGFSZWZDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFSZWZDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgY291bnQpIil9LAorICAgIHsiU2V0TWVkaWFQbGF5SGludHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFQbGF5SGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFQbGF5SGludHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFQbGF5SGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgZmxhZ3MpIil9LAorICAgIHsiR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFncywgVGltZVZhbHVlIHRpbWUsIEZpeGVkIHJhdGUpIC0+IChUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgTWVkaWFPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zMzg1LDYxICszMzg1LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCU1lZGlhIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTWVkaWEgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTWVkaWFPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChNZWRpYU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNZWRpYU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKE1lZGlhT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIE1lZGlhT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1lZGlhX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0Lk1lZGlhIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTWVkaWFPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBNZWRpYU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBNZWRpYU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTWVkaWFPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIE1lZGlhT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCU1lZGlhT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1lZGlhT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCU1lZGlhT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlNZWRpYU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNZWRpYU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCU1lZGlhT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuTWVkaWEiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihNZWRpYU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIE1lZGlhT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIE1lZGlhT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBNZWRpYU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgTWVkaWFPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTWVkaWFPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgTWVkaWFPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgTWVkaWFPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIE1lZGlhT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIE1lZGlhT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgTWVkaWFPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBNZWRpYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zNDUyLDEyNzEgKzM0NTIsMTI3MSBAQAogI2RlZmluZSBUcmFja09ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZUcmFja19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZUcmFja19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgVHJhY2tPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlUcmFjayBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFRyYWNrIG9iX2l0c2VsZjsKIH0gVHJhY2tPYmplY3Q7CiAKIFB5T2JqZWN0ICpUcmFja09ial9OZXcoVHJhY2sgaXRzZWxmKQogewotCVRyYWNrT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUcmFjayBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFRyYWNrT2JqZWN0LCAmVHJhY2tfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRyYWNrT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUcmFjayBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKFRyYWNrT2JqZWN0LCAmVHJhY2tfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVHJhY2tPYmpfQ29udmVydChQeU9iamVjdCAqdiwgVHJhY2sgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFUcmFja09ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUcmFjayByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChUcmFja09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIVRyYWNrT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRyYWNrIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRyYWNrT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgVHJhY2tPYmpfZGVhbGxvYyhUcmFja09iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlTW92aWVUcmFjayhzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZU1vdmllVHJhY2soc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0xvYWRUcmFja0ludG9SYW0oVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIExvYWRUcmFja0ludG9SYW0KLQlQeU1hY19QUkVDSEVDSyhMb2FkVHJhY2tJbnRvUmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2FkVHJhY2tJbnRvUmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkVHJhY2tJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRUcmFja0ludG9SYW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1BpY3QoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBfcnY7Ci0JVGltZVZhbHVlIHRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBfcnY7CisgICAgVGltZVZhbHVlIHRpbWU7CiAjaWZuZGVmIEdldFRyYWNrUGljdAotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrUGljdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tQaWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrUGljdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICB0aW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tQaWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0NsaXBSZ24oVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrQ2xpcFJnbgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQ2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tDbGlwUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0NsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0NsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrQ2xpcFJnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTZXRUcmFja0NsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja0NsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrQ2xpcFJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aGVDbGlwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUcmFja0NsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdGhlQ2xpcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrRGlzcGxheUJvdW5kc1JnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW92aWVCb3VuZHNSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW92aWVCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrTW92aWVCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja01vdmllQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0JvdW5kc1JnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tCb3VuZHNSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0JvdW5kc1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTWF0dGUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrTWF0dGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja01hdHRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja01hdHRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja01hdHRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNYXR0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tNYXR0ZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHRoZU1hdHRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgdGhlTWF0dGU7CiAjaWZuZGVmIFNldFRyYWNrTWF0dGUKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja01hdHRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja01hdHRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVNYXR0ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrTWF0dGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIHRoZU1hdHRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZU1hdHRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tNYXR0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgdGhlTWF0dGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0lEKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldFRyYWNrSUQKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0lEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0lEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0lEKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0lEKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTW92aWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OwogI2lmbmRlZiBHZXRUcmFja01vdmllCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0NyZWF0aW9uVGltZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUcmFja0NyZWF0aW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQ3JlYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0NyZWF0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tDcmVhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTW9kaWZpY2F0aW9uVGltZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUcmFja01vZGlmaWNhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja01vZGlmaWNhdGlvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW9kaWZpY2F0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja01vZGlmaWNhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tFbmFibGVkKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEdldFRyYWNrRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja0VuYWJsZWQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gaXNFbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGlzRW5hYmxlZDsKICNpZm5kZWYgU2V0VHJhY2tFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja0VuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0VuYWJsZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaXNFbmFibGVkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0VuYWJsZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUcmFja0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaXNFbmFibGVkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tVc2FnZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUcmFja1VzYWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tVc2FnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tVc2FnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja1VzYWdlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHVzYWdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIHVzYWdlOwogI2lmbmRlZiBTZXRUcmFja1VzYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tVc2FnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tVc2FnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgdXNhZ2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgdXNhZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0R1cmF0aW9uKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OwogI2lmbmRlZiBHZXRUcmFja0R1cmF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEdXJhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEdXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tEdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tEdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja09mZnNldChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja09mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrT2Zmc2V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja09mZnNldChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja09mZnNldChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIG1vdmllT2Zmc2V0VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIG1vdmllT2Zmc2V0VGltZTsKICNpZm5kZWYgU2V0VHJhY2tPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja09mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZU9mZnNldFRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja09mZnNldChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIG1vdmllT2Zmc2V0VGltZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVPZmZzZXRUaW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tPZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBtb3ZpZU9mZnNldFRpbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0xheWVyKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0VHJhY2tMYXllcgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTGF5ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTGF5ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrTGF5ZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrTGF5ZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tMYXllcihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbGF5ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGxheWVyOwogI2lmbmRlZiBTZXRUcmFja0xheWVyCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tMYXllcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tMYXllcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxheWVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tMYXllcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgbGF5ZXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxheWVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tMYXllcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgbGF5ZXIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0FsdGVybmF0ZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CiAjaWZuZGVmIEdldFRyYWNrQWx0ZXJuYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tBbHRlcm5hdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQWx0ZXJuYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0FsdGVybmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tBbHRlcm5hdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tBbHRlcm5hdGUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRyYWNrIGFsdGVybmF0ZVQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIGFsdGVybmF0ZVQ7CiAjaWZuZGVmIFNldFRyYWNrQWx0ZXJuYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tBbHRlcm5hdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrQWx0ZXJuYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJmFsdGVybmF0ZVQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0FsdGVybmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZVQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZhbHRlcm5hdGVUKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tBbHRlcm5hdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGVUKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tWb2x1bWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRUcmFja1ZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1ZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrVm9sdW1lKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB2b2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHZvbHVtZTsKICNpZm5kZWYgU2V0VHJhY2tWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja1ZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja1ZvbHVtZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHZvbHVtZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0RpbWVuc2lvbnMoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIHdpZHRoOwotCUZpeGVkIGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgd2lkdGg7CisgICAgRml4ZWQgaGVpZ2h0OwogI2lmbmRlZiBHZXRUcmFja0RpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRGltZW5zaW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0VHJhY2tEaW1lbnNpb25zKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFRyYWNrRGltZW5zaW9ucyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBoZWlnaHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrRGltZW5zaW9ucyhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgd2lkdGg7Ci0JRml4ZWQgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCB3aWR0aDsKKyAgICBGaXhlZCBoZWlnaHQ7CiAjaWZuZGVmIFNldFRyYWNrRGltZW5zaW9ucwotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrRGltZW5zaW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tEaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrRGltZW5zaW9ucyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tEaW1lbnNpb25zKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1VzZXJEYXRhKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVc2VyRGF0YSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVzZXJEYXRhIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBzZXR0aW5nczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CiAjaWZuZGVmIEdldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5ncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5ncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIHNldHRpbmdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBzZXR0aW5nczsKICNpZm5kZWYgU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzZXR0aW5ncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9OZXdUcmFja01lZGlhKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZWRpYSBfcnY7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKLQlUaW1lU2NhbGUgdGltZVNjYWxlOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVkaWEgX3J2OworICAgIE9TVHlwZSBtZWRpYVR5cGU7CisgICAgVGltZVNjYWxlIHRpbWVTY2FsZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIE5ld1RyYWNrTWVkaWEKLQlQeU1hY19QUkVDSEVDSyhOZXdUcmFja01lZGlhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdUcmFja01lZGlhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdUcmFja01lZGlhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICB0aW1lU2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdUcmFja01lZGlhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTWVkaWEoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lZGlhIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVkaWEgX3J2OwogI2lmbmRlZiBHZXRUcmFja01lZGlhCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNZWRpYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNZWRpYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tNZWRpYShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNZWRpYShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9JbnNlcnRNZWRpYUludG9UcmFjayhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgdHJhY2tTdGFydDsKLQlUaW1lVmFsdWUgbWVkaWFUaW1lOwotCVRpbWVWYWx1ZSBtZWRpYUR1cmF0aW9uOwotCUZpeGVkIG1lZGlhUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgdHJhY2tTdGFydDsKKyAgICBUaW1lVmFsdWUgbWVkaWFUaW1lOworICAgIFRpbWVWYWx1ZSBtZWRpYUR1cmF0aW9uOworICAgIEZpeGVkIG1lZGlhUmF0ZTsKICNpZm5kZWYgSW5zZXJ0TWVkaWFJbnRvVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRNZWRpYUludG9UcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVkaWFJbnRvVHJhY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbWVkaWFSYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydE1lZGlhSW50b1RyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFEdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFSYXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja1N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZtZWRpYVJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0TWVkaWFJbnRvVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVJhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0luc2VydFRyYWNrU2VnbWVudChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayBkc3RUcmFjazsKLQlUaW1lVmFsdWUgc3JjSW47Ci0JVGltZVZhbHVlIHNyY0R1cmF0aW9uOwotCVRpbWVWYWx1ZSBkc3RJbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUcmFjayBkc3RUcmFjazsKKyAgICBUaW1lVmFsdWUgc3JjSW47CisgICAgVGltZVZhbHVlIHNyY0R1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBkc3RJbjsKICNpZm5kZWYgSW5zZXJ0VHJhY2tTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0VHJhY2tTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRUcmFja1NlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0VHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0VHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIGRzdEluOwotCVRpbWVWYWx1ZSBkc3REdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgZHN0SW47CisgICAgVGltZVZhbHVlIGRzdER1cmF0aW9uOwogI2lmbmRlZiBJbnNlcnRFbXB0eVRyYWNrU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEluc2VydEVtcHR5VHJhY2tTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRFbXB0eVRyYWNrU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3RJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdER1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydEVtcHR5VHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnNlcnRFbXB0eVRyYWNrU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RHVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0RlbGV0ZVRyYWNrU2VnbWVudChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgRGVsZXRlVHJhY2tTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlVHJhY2tTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVUcmFja1NlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVsZXRlVHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVsZXRlVHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2NhbGVUcmFja1NlZ21lbnQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgb2xkRHVyYXRpb247Ci0JVGltZVZhbHVlIG5ld0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIG9sZER1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBuZXdEdXJhdGlvbjsKICNpZm5kZWYgU2NhbGVUcmFja1NlZ21lbnQKLQlQeU1hY19QUkVDSEVDSyhTY2FsZVRyYWNrU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NhbGVUcmFja1NlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9sZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3RHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2NhbGVUcmFja1NlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBvbGREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RHVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0R1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNjYWxlVHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0R1cmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9Jc1NjcmFwTW92aWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBfcnY7CiAjaWZuZGVmIElzU2NyYXBNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKElzU2NyYXBNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNTY3JhcE1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1NjcmFwTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1NjcmFwTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0NvcHlUcmFja1NldHRpbmdzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRyYWNrIGRzdFRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRyYWNrIGRzdFRyYWNrOwogI2lmbmRlZiBDb3B5VHJhY2tTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKENvcHlUcmFja1NldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5VHJhY2tTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZkc3RUcmFjaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5VHJhY2tTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weVRyYWNrU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VHJhY2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0FkZEVtcHR5VHJhY2tUb01vdmllKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1vdmllIGRzdE1vdmllOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlUcmFjayBkc3RUcmFjazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBkc3RNb3ZpZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgVHJhY2sgZHN0VHJhY2s7CiAjaWZuZGVmIEFkZEVtcHR5VHJhY2tUb01vdmllCi0JUHlNYWNfUFJFQ0hFQ0soQWRkRW1wdHlUcmFja1RvTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZEVtcHR5VHJhY2tUb01vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRFbXB0eVRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRFbXB0eVRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0FkZENsb25lZFRyYWNrVG9Nb3ZpZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSBkc3RNb3ZpZTsKLQlsb25nIGZsYWdzOwotCVRyYWNrIGRzdFRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIGRzdE1vdmllOworICAgIGxvbmcgZmxhZ3M7CisgICAgVHJhY2sgZHN0VHJhY2s7CiAjaWZuZGVmIEFkZENsb25lZFRyYWNrVG9Nb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEFkZENsb25lZFRyYWNrVG9Nb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkQ2xvbmVkVHJhY2tUb01vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZENsb25lZFRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZENsb25lZFRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0FkZFRyYWNrUmVmZXJlbmNlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRyYWNrIHJlZlRyYWNrOwotCU9TVHlwZSByZWZUeXBlOwotCWxvbmcgYWRkZWRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUcmFjayByZWZUcmFjazsKKyAgICBPU1R5cGUgcmVmVHlwZTsKKyAgICBsb25nIGFkZGVkSW5kZXg7CiAjaWZuZGVmIEFkZFRyYWNrUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soQWRkVHJhY2tSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFRyYWNrUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmcmVmVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkVHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZEluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBhZGRlZEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnJlZlRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRkZWRJbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfRGVsZXRlVHJhY2tSZWZlcmVuY2UoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHJlZlR5cGU7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgcmVmVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBEZWxldGVUcmFja1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZVRyYWNrUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVUcmFja1JlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVsZXRlVHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWxldGVUcmFja1JlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tSZWZlcmVuY2UoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVHJhY2sgcmVmVHJhY2s7Ci0JT1NUeXBlIHJlZlR5cGU7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUcmFjayByZWZUcmFjazsKKyAgICBPU1R5cGUgcmVmVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBTZXRUcmFja1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja1JlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZyZWZUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmcmVmVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUcmFja1JlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JT1NUeXBlIHJlZlR5cGU7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVHJhY2sgX3J2OworICAgIE9TVHlwZSByZWZUeXBlOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIEdldFRyYWNrUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1R5cGUgX3J2OwotCU9TVHlwZSByZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1R5cGUgX3J2OworICAgIE9TVHlwZSByZWZUeXBlOwogI2lmbmRlZiBHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHRUcmFja1JlZmVyZW5jZVR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tSZWZlcmVuY2VDb3VudChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JT1NUeXBlIHJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIE9TVHlwZSByZWZUeXBlOwogI2lmbmRlZiBHZXRUcmFja1JlZmVyZW5jZUNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tSZWZlcmVuY2VDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tSZWZlcmVuY2VDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja1JlZmVyZW5jZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja1JlZmVyZW5jZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0VkaXRSYXRlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0JVGltZVZhbHVlIGF0VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIFRpbWVWYWx1ZSBhdFRpbWU7CiAjaWZuZGVmIEdldFRyYWNrRWRpdFJhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0VkaXRSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0VkaXRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tFZGl0UmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0VkaXRSYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0RhdGFTaXplKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldFRyYWNrRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemU2NChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQl3aWRlIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIHdpZGUgZGF0YVNpemU7CiAjaWZuZGVmIEdldFRyYWNrRGF0YVNpemU2NAotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRGF0YVNpemU2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEYXRhU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRyYWNrRGF0YVNpemU2NChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRhdGFTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUcmFja0RhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfUHRJblRyYWNrKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBwdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CiAjaWZuZGVmIFB0SW5UcmFjawotCVB5TWFjX1BSRUNIRUNLKFB0SW5UcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHRJblRyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFB0SW5UcmFjayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBwdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJblRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9Db3B5VHJhY2tVc2VyRGF0YShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayBkc3RUcmFjazsKLQlPU1R5cGUgY29weVJ1bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgZHN0VHJhY2s7CisgICAgT1NUeXBlIGNvcHlSdWxlOwogI2lmbmRlZiBDb3B5VHJhY2tVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKENvcHlUcmFja1VzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5VHJhY2tVc2VyRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJmRzdFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5VHJhY2tVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvcHlSdWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlUcmFja1VzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UnVsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFnczsKLQlUaW1lVmFsdWUgdGltZTsKLQlGaXhlZCByYXRlOwotCVRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIEZpeGVkIHJhdGU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKKyAgICBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbjsKICNpZm5kZWYgR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja05leHRJbnRlcmVzdGluZ1RpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCUdldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nRHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRUcmFja05leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVRpbWVWYWx1ZSB0aW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrU3RhdHVzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBHZXRUcmFja1N0YXR1cwotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrU3RhdHVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1N0YXR1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tTdGF0dXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrTG9hZFNldHRpbmdzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgcHJlbG9hZFRpbWU7Ci0JVGltZVZhbHVlIHByZWxvYWREdXJhdGlvbjsKLQlsb25nIHByZWxvYWRGbGFnczsKLQlsb25nIGRlZmF1bHRIaW50czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHByZWxvYWRUaW1lOworICAgIFRpbWVWYWx1ZSBwcmVsb2FkRHVyYXRpb247CisgICAgbG9uZyBwcmVsb2FkRmxhZ3M7CisgICAgbG9uZyBkZWZhdWx0SGludHM7CiAjaWZuZGVmIFNldFRyYWNrTG9hZFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tMb2FkU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrTG9hZFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0SGludHMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0xvYWRTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHByZWxvYWREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhpbnRzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRIaW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRyYWNrTG9hZFNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGludHMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0xvYWRTZXR0aW5ncyhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHByZWxvYWRUaW1lOwotCVRpbWVWYWx1ZSBwcmVsb2FkRHVyYXRpb247Ci0JbG9uZyBwcmVsb2FkRmxhZ3M7Ci0JbG9uZyBkZWZhdWx0SGludHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwcmVsb2FkVGltZTsKKyAgICBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uOworICAgIGxvbmcgcHJlbG9hZEZsYWdzOworICAgIGxvbmcgZGVmYXVsdEhpbnRzOwogI2lmbmRlZiBHZXRUcmFja0xvYWRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTG9hZFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0xvYWRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0VHJhY2tMb2FkU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0SGludHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRIaW50cyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFRyYWNrTG9hZFNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdEhpbnRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGludHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVHJhY2tPYmpfbWV0aG9kc1tdID0gewotCXsiTG9hZFRyYWNrSW50b1JhbSIsIChQeUNGdW5jdGlvbilUcmFja09ial9Mb2FkVHJhY2tJbnRvUmFtLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tQaWN0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUGljdCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFRyYWNrQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0NsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiU2V0VHJhY2tDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrQ2xpcFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IkdldFRyYWNrTW92aWVCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja0JvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0JvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja01hdHRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTWF0dGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAotCXsiU2V0VHJhY2tNYXR0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja01hdHRlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgdGhlTWF0dGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0lEIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldFRyYWNrTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7IkdldFRyYWNrQ3JlYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQ3JlYXRpb25UaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJHZXRUcmFja01vZGlmaWNhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJHZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGlzRW5hYmxlZCkgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrVXNhZ2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tVc2FnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU2V0VHJhY2tVc2FnZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja1VzYWdlLCAxLAotCSBQeURvY19TVFIoIihsb25nIHVzYWdlKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0R1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IkdldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IlNldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgbW92aWVPZmZzZXRUaW1lKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xheWVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiU2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xheWVyLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBsYXllcikgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrQWx0ZXJuYXRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQWx0ZXJuYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUcmFjayBfcnYpIil9LAotCXsiU2V0VHJhY2tBbHRlcm5hdGUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tBbHRlcm5hdGUsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIGFsdGVybmF0ZVQpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja1ZvbHVtZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1ZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldFRyYWNrVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0RpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSIpfSwKLQl7IlNldFRyYWNrRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0RpbWVuc2lvbnMsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCi0JeyJHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgc2V0dGluZ3MpIil9LAotCXsiU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHNldHRpbmdzKSAtPiBOb25lIil9LAotCXsiTmV3VHJhY2tNZWRpYSIsIChQeUNGdW5jdGlvbilUcmFja09ial9OZXdUcmFja01lZGlhLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgbWVkaWFUeXBlLCBUaW1lU2NhbGUgdGltZVNjYWxlLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoTWVkaWEgX3J2KSIpfSwKLQl7IkdldFRyYWNrTWVkaWEiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNZWRpYSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVkaWEgX3J2KSIpfSwKLQl7Ikluc2VydE1lZGlhSW50b1RyYWNrIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0luc2VydE1lZGlhSW50b1RyYWNrLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdHJhY2tTdGFydCwgVGltZVZhbHVlIG1lZGlhVGltZSwgVGltZVZhbHVlIG1lZGlhRHVyYXRpb24sIEZpeGVkIG1lZGlhUmF0ZSkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydFRyYWNrU2VnbWVudCIsIChQeUNGdW5jdGlvbilUcmFja09ial9JbnNlcnRUcmFja1NlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIGRzdFRyYWNrLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiRGVsZXRlVHJhY2tTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0RlbGV0ZVRyYWNrU2VnbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiU2NhbGVUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2NhbGVUcmFja1NlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiSXNTY3JhcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0lzU2NyYXBNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJDb3B5VHJhY2tTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9Db3B5VHJhY2tTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgZHN0VHJhY2spIC0+IE5vbmUiKX0sCi0JeyJBZGRFbXB0eVRyYWNrVG9Nb3ZpZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9BZGRFbXB0eVRyYWNrVG9Nb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChUcmFjayBkc3RUcmFjaykiKX0sCi0JeyJBZGRDbG9uZWRUcmFja1RvTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfQWRkQ2xvbmVkVHJhY2tUb01vdmllLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBkc3RNb3ZpZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIGRzdFRyYWNrKSIpfSwKLQl7IkFkZFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0FkZFRyYWNrUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihUcmFjayByZWZUcmFjaywgT1NUeXBlIHJlZlR5cGUpIC0+IChsb25nIGFkZGVkSW5kZXgpIil9LAotCXsiRGVsZXRlVHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfRGVsZXRlVHJhY2tSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAotCXsiU2V0VHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIHJlZlRyYWNrLCBPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldE5leHRUcmFja1JlZmVyZW5jZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAoT1NUeXBlIF9ydikiKX0sCi0JeyJHZXRUcmFja1JlZmVyZW5jZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0VHJhY2tFZGl0UmF0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0VkaXRSYXRlLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgYXRUaW1lKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IkdldFRyYWNrRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0VHJhY2tEYXRhU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemU2NCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAod2lkZSBkYXRhU2l6ZSkiKX0sCi0JeyJQdEluVHJhY2siLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfUHRJblRyYWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNvcHlUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0NvcHlUcmFja1VzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIihUcmFjayBkc3RUcmFjaywgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSwgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb24pIil9LAotCXsiR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja1N0YXR1cyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1N0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTG9hZFRyYWNrSW50b1JhbSIsIChQeUNGdW5jdGlvbilUcmFja09ial9Mb2FkVHJhY2tJbnRvUmFtLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tQaWN0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUGljdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0NsaXBSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrQ2xpcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrTW92aWVCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja0JvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0JvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja01hdHRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTWF0dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tNYXR0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja01hdHRlLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgdGhlTWF0dGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0lEIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrQ3JlYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQ3JlYXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCisgICAgeyJHZXRUcmFja01vZGlmaWNhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCisgICAgeyJHZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGlzRW5hYmxlZCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrVXNhZ2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tVc2FnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tVc2FnZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja1VzYWdlLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHVzYWdlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0R1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgbW92aWVPZmZzZXRUaW1lKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xheWVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xheWVyLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBsYXllcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrQWx0ZXJuYXRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQWx0ZXJuYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tBbHRlcm5hdGUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tBbHRlcm5hdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIGFsdGVybmF0ZVQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja1ZvbHVtZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1ZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0RpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaW1lbnNpb25zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSIpfSwKKyAgICB7IlNldFRyYWNrRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0RpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCisgICAgeyJHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgc2V0dGluZ3MpIil9LAorICAgIHsiU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHNldHRpbmdzKSAtPiBOb25lIil9LAorICAgIHsiTmV3VHJhY2tNZWRpYSIsIChQeUNGdW5jdGlvbilUcmFja09ial9OZXdUcmFja01lZGlhLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgbWVkaWFUeXBlLCBUaW1lU2NhbGUgdGltZVNjYWxlLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoTWVkaWEgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrTWVkaWEiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNZWRpYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVkaWEgX3J2KSIpfSwKKyAgICB7Ikluc2VydE1lZGlhSW50b1RyYWNrIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0luc2VydE1lZGlhSW50b1RyYWNrLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdHJhY2tTdGFydCwgVGltZVZhbHVlIG1lZGlhVGltZSwgVGltZVZhbHVlIG1lZGlhRHVyYXRpb24sIEZpeGVkIG1lZGlhUmF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydFRyYWNrU2VnbWVudCIsIChQeUNGdW5jdGlvbilUcmFja09ial9JbnNlcnRUcmFja1NlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIGRzdFRyYWNrLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiRGVsZXRlVHJhY2tTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0RlbGV0ZVRyYWNrU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiU2NhbGVUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2NhbGVUcmFja1NlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiSXNTY3JhcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0lzU2NyYXBNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJDb3B5VHJhY2tTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9Db3B5VHJhY2tTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgZHN0VHJhY2spIC0+IE5vbmUiKX0sCisgICAgeyJBZGRFbXB0eVRyYWNrVG9Nb3ZpZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9BZGRFbXB0eVRyYWNrVG9Nb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChUcmFjayBkc3RUcmFjaykiKX0sCisgICAgeyJBZGRDbG9uZWRUcmFja1RvTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfQWRkQ2xvbmVkVHJhY2tUb01vdmllLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBkc3RNb3ZpZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIGRzdFRyYWNrKSIpfSwKKyAgICB7IkFkZFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0FkZFRyYWNrUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayByZWZUcmFjaywgT1NUeXBlIHJlZlR5cGUpIC0+IChsb25nIGFkZGVkSW5kZXgpIil9LAorICAgIHsiRGVsZXRlVHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfRGVsZXRlVHJhY2tSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiU2V0VHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIHJlZlRyYWNrLCBPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldE5leHRUcmFja1JlZmVyZW5jZVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAoT1NUeXBlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja1JlZmVyZW5jZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tFZGl0UmF0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0VkaXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgYXRUaW1lKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEYXRhU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tEYXRhU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemU2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAod2lkZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJQdEluVHJhY2siLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfUHRJblRyYWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNvcHlUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0NvcHlUcmFja1VzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayBkc3RUcmFjaywgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSwgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb24pIil9LAorICAgIHsiR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja1N0YXR1cyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1N0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBUcmFja09ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTQ3MzMsNjEgKzQ3MzMsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JVHJhY2sgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBUcmFjayBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUcmFja09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFRyYWNrT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRyYWNrT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoVHJhY2tPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgVHJhY2tPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgVHJhY2tfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUXQuVHJhY2siLCAvKnRwX25hbWUqLwotCXNpemVvZihUcmFja09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFRyYWNrT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIFRyYWNrT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBUcmFja09ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgVHJhY2tPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JVHJhY2tPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JVHJhY2tPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JVHJhY2tPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCVRyYWNrT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCVRyYWNrT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JVHJhY2tPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RdC5UcmFjayIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFRyYWNrT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVHJhY2tPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVHJhY2tPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFRyYWNrT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUcmFja09ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUcmFja09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBUcmFja09ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUcmFja09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVHJhY2tPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgVHJhY2tPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUcmFja09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRyYWNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ4MDAsMjQ3NiArNDgwMCwyNDc2IEBACiAjZGVmaW5lIE1vdmllT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJk1vdmllX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJk1vdmllX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBNb3ZpZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCU1vdmllIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgTW92aWUgb2JfaXRzZWxmOwogfSBNb3ZpZU9iamVjdDsKIAogUHlPYmplY3QgKk1vdmllT2JqX05ldyhNb3ZpZSBpdHNlbGYpCiB7Ci0JTW92aWVPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIE1vdmllIGZyb20gTlVMTCBwb2ludGVyIik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoTW92aWVPYmplY3QsICZNb3ZpZV9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgTW92aWVPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIE1vdmllIGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoTW92aWVPYmplY3QsICZNb3ZpZV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBNb3ZpZU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBNb3ZpZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIU1vdmllT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1vdmllIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKE1vdmllT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghTW92aWVPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTW92aWUgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoTW92aWVPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBNb3ZpZU9ial9kZWFsbG9jKE1vdmllT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9pdHNlbGYpIERpc3Bvc2VNb3ZpZShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZU1vdmllKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9Nb3ZpZXNUYXNrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG1heE1pbGxpU2VjVG9Vc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbWF4TWlsbGlTZWNUb1VzZTsKICNpZm5kZWYgTW92aWVzVGFzawotCVB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhNaWxsaVNlY1RvVXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTW92aWVzVGFzayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgbWF4TWlsbGlTZWNUb1VzZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4TWlsbGlTZWNUb1VzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1vdmllc1Rhc2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIG1heE1pbGxpU2VjVG9Vc2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QcmVyb2xsTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JRml4ZWQgUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBGaXhlZCBSYXRlOwogI2lmbmRlZiBQcmVyb2xsTW92aWUKLQlQeU1hY19QUkVDSEVDSyhQcmVyb2xsTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFByZXJvbGxNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZSYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFByZXJvbGxNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgIFJhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJlJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHJlcm9sbE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgUmF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQWJvcnRQcmVQcmVyb2xsTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogI2lmbmRlZiBBYm9ydFByZVByZXJvbGxNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEFib3J0UHJlUHJlcm9sbE1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBYm9ydFByZVByZXJvbGxNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVycikpCi0JCXJldHVybiBOVUxMOwotCUFib3J0UHJlUHJlcm9sbE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBYm9ydFByZVByZXJvbGxNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0xvYWRNb3ZpZUludG9SYW0oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIExvYWRNb3ZpZUludG9SYW0KLQlQeU1hY19QUkVDSEVDSyhMb2FkTW92aWVJbnRvUmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2FkTW92aWVJbnRvUmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkTW92aWVJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRNb3ZpZUludG9SYW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZUFjdGl2ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBhY3RpdmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gYWN0aXZlOwogI2lmbmRlZiBTZXRNb3ZpZUFjdGl2ZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllQWN0aXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUFjdGl2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllQWN0aXZlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgYWN0aXZlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZUFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGFjdGl2ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllQWN0aXZlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEdldE1vdmllQWN0aXZlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVBY3RpdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQWN0aXZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVBY3RpdmUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU3RhcnRNb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTdGFydE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soU3RhcnRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RhcnRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3RhcnRNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN0YXJ0TW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1N0b3BNb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTdG9wTW92aWUKLQlQeU1hY19QUkVDSEVDSyhTdG9wTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFN0b3BNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3RvcE1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU3RvcE1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9Hb1RvQmVnaW5uaW5nT2ZNb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBHb1RvQmVnaW5uaW5nT2ZNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEdvVG9CZWdpbm5pbmdPZk1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHb1RvQmVnaW5uaW5nT2ZNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR29Ub0JlZ2lubmluZ09mTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHb1RvQmVnaW5uaW5nT2ZNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR29Ub0VuZE9mTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgR29Ub0VuZE9mTW92aWUKLQlQeU1hY19QUkVDSEVDSyhHb1RvRW5kT2ZNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR29Ub0VuZE9mTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdvVG9FbmRPZk1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR29Ub0VuZE9mTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0lzTW92aWVEb25lKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzTW92aWVEb25lCi0JUHlNYWNfUFJFQ0hFQ0soSXNNb3ZpZURvbmUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTW92aWVEb25lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01vdmllRG9uZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNb3ZpZURvbmUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVQcmV2aWV3TW9kZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBHZXRNb3ZpZVByZXZpZXdNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3TW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3TW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVQcmV2aWV3TW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQcmV2aWV3TW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVByZXZpZXdNb2RlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIHVzZVByZXZpZXc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gdXNlUHJldmlldzsKICNpZm5kZWYgU2V0TW92aWVQcmV2aWV3TW9kZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJldmlld01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJldmlld01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VQcmV2aWV3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVQcmV2aWV3TW9kZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdXNlUHJldmlldyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlUHJldmlldykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllUHJldmlld01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZVByZXZpZXcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TaG93TW92aWVQb3N0ZXIoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd01vdmllUG9zdGVyCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd01vdmllUG9zdGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93TW92aWVQb3N0ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dNb3ZpZVBvc3Rlcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dNb3ZpZVBvc3Rlcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUaW1lQmFzZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZUJhc2UgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllTWFzdGVyVGltZUJhc2UoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVCYXNlIHRiOwotCVRpbWVSZWNvcmQgc2xhdmVaZXJvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSB0YjsKKyAgICBUaW1lUmVjb3JkIHNsYXZlWmVybzsKICNpZm5kZWYgU2V0TW92aWVNYXN0ZXJUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllTWFzdGVyVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllTWFzdGVyVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0YiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzbGF2ZVplcm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZU1hc3RlclRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICB0YiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsYXZlWmVybyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllTWFzdGVyQ2xvY2soTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBjbG9ja01laXN0ZXI7Ci0JVGltZVJlY29yZCBzbGF2ZVplcm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBjbG9ja01laXN0ZXI7CisgICAgVGltZVJlY29yZCBzbGF2ZVplcm87CiAjaWZuZGVmIFNldE1vdmllTWFzdGVyQ2xvY2sKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZU1hc3RlckNsb2NrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZU1hc3RlckNsb2NrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNsb2NrTWVpc3RlciwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzbGF2ZVplcm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZU1hc3RlckNsb2NrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBjbG9ja01laXN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAmc2xhdmVaZXJvKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2xvY2tNZWlzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllTWFzdGVyQ2xvY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrTWVpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DaG9vc2VNb3ZpZUNsb2NrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBDaG9vc2VNb3ZpZUNsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soQ2hvb3NlTW92aWVDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hvb3NlTW92aWVDbG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2hvb3NlTW92aWVDbG9jayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2hvb3NlTW92aWVDbG9jayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUdXb3JsZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgcG9ydDsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBHZXRNb3ZpZUdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllR1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVHV29ybGQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmcG9ydCwKLQkgICAgICAgICAgICAgICAmZ2RoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2RoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TW92aWVHV29ybGQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmcG9ydCwKKyAgICAgICAgICAgICAgICAgICAmZ2RoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2RoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZUdXb3JsZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgcG9ydDsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBTZXRNb3ZpZUdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllR1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZUdXb3JsZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHBvcnQsCi0JICAgICAgICAgICAgICAgZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVHV29ybGQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgIGdkaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgbmF0dXJhbEJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBuYXR1cmFsQm91bmRzOwogI2lmbmRlZiBHZXRNb3ZpZU5hdHVyYWxCb3VuZHNSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hdHVyYWxCb3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbmF0dXJhbEJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYXR1cmFsQm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm5hdHVyYWxCb3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JVHJhY2sgdGhlVHJhY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBUcmFjayB0aGVUcmFjazsKICNpZm5kZWYgR2V0TmV4dFRyYWNrRm9yQ29tcG9zaXRpbmcKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFRyYWNrRm9yQ29tcG9zaXRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVRyYWNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0aGVUcmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHJhY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldFByZXZUcmFja0ZvckNvbXBvc2l0aW5nKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JVHJhY2sgdGhlVHJhY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBUcmFjayB0aGVUcmFjazsKICNpZm5kZWYgR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmcKLQlQeU1hY19QUkVDSEVDSyhHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVRyYWNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0aGVUcmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFByZXZUcmFja0ZvckNvbXBvc2l0aW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHJhY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUGljdChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIF9ydjsKLQlUaW1lVmFsdWUgdGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKKyAgICBUaW1lVmFsdWUgdGltZTsKICNpZm5kZWYgR2V0TW92aWVQaWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQaWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVBpY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVQaWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVBpY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUG9zdGVyUGljdChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVQb3N0ZXJQaWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQb3N0ZXJQaWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVBvc3RlclBpY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUG9zdGVyUGljdChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllUG9zdGVyUGljdChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfVXBkYXRlTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFVwZGF0ZU1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZU1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXBkYXRlTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9JbnZhbGlkYXRlTW92aWVSZWdpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIGludmFsaWRSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIGludmFsaWRSZ247CiAjaWZuZGVmIEludmFsaWRhdGVNb3ZpZVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNb3ZpZVJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52YWxpZGF0ZU1vdmllUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbnZhbGlkUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsaWRhdGVNb3ZpZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmludmFsaWRSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxpZGF0ZU1vdmllUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUJveChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3hSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJveFJlY3Q7CiAjaWZuZGVmIEdldE1vdmllQm94Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVCb3gpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQm94KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNb3ZpZUJveChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICZib3hSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZUJveChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICZib3hSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllQm94KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJveFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm94UmVjdDsKICNpZm5kZWYgU2V0TW92aWVCb3gKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUJveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllQm94KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgJmJveFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3hSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVCb3goX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAmYm94UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRGlzcGxheUNsaXBSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllRGlzcGxheUNsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURpc3BsYXlDbGlwUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURpc3BsYXlDbGlwUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZURpc3BsYXlDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVEaXNwbGF5Q2xpcFJnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVEaXNwbGF5Q2xpcFJnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTZXRNb3ZpZURpc3BsYXlDbGlwUmduCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEaXNwbGF5Q2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEaXNwbGF5Q2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllRGlzcGxheUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllRGlzcGxheUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUNsaXBSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllQ2xpcFJnbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQ2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVDbGlwUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllQ2xpcFJnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTZXRNb3ZpZUNsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUNsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllQ2xpcFJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aGVDbGlwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdGhlQ2xpcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRGlzcGxheUJvdW5kc1JnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURpc3BsYXlCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVCb3VuZHNSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllQm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVCb3VuZHNSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVZpZGVvT3V0cHV0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRJbnN0YW5jZSB2b3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB2b3V0OwogI2lmbmRlZiBTZXRNb3ZpZVZpZGVvT3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVWaWRlb091dHB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVWaWRlb091dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVZpZGVvT3V0cHV0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICB2b3V0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2b3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVWaWRlb091dHB1dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgdm91dCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllSW50b0hhbmRsZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgcHVibGljTW92aWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHB1YmxpY01vdmllOwogI2lmbmRlZiBQdXRNb3ZpZUludG9IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHVibGljTW92aWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVJbnRvSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNNb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllSW50b0hhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljTW92aWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllSW50b0RhdGFGb3JrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGZSZWZOdW07Ci0JbG9uZyBvZmZzZXQ7Ci0JbG9uZyBtYXhTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGZSZWZOdW07CisgICAgbG9uZyBvZmZzZXQ7CisgICAgbG9uZyBtYXhTaXplOwogI2lmbmRlZiBQdXRNb3ZpZUludG9EYXRhRm9yawotCVB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0RhdGFGb3JrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9EYXRhRm9yayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVJbnRvRGF0YUZvcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0TW92aWVJbnRvRGF0YUZvcmsoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdXRNb3ZpZUludG9EYXRhRm9yazY0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgZlJlZk51bTsKLQl3aWRlIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIG1heFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBmUmVmTnVtOworICAgIHdpZGUgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKICNpZm5kZWYgUHV0TW92aWVJbnRvRGF0YUZvcms2NAotCVB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0RhdGFGb3JrNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0RhdGFGb3JrNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQdXRNb3ZpZUludG9EYXRhRm9yazY0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0TW92aWVJbnRvRGF0YUZvcms2NChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdXRNb3ZpZUludG9TdG9yYWdlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURhdGFIYW5kbGVyIGRoOwotCXdpZGUgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heFNpemU7CiAjaWZuZGVmIFB1dE1vdmllSW50b1N0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9TdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9TdG9yYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dE1vdmllSW50b1N0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllSW50b1N0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUhhbmRsZSBwdWJsaWNNb3ZpZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgSGFuZGxlIHB1YmxpY01vdmllOwogI2lmbmRlZiBQdXRNb3ZpZUZvckRhdGFSZWZJbnRvSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUNyZWF0aW9uVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZUNyZWF0aW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQ3JlYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUNyZWF0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVDcmVhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllTW9kaWZpY2F0aW9uVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllTW9kaWZpY2F0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUaW1lU2NhbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVTY2FsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVTY2FsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllVGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRpbWVTY2FsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVUaW1lU2NhbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVTY2FsZSB0aW1lU2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVTY2FsZSB0aW1lU2NhbGU7CiAjaWZuZGVmIFNldE1vdmllVGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZVNjYWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICB0aW1lU2NhbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVTY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGltZVNjYWxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVEdXJhdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVEdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllRHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllRHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllRHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllRHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVSYXRlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKICNpZm5kZWYgR2V0TW92aWVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVSYXRlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCByYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCByYXRlOwogI2lmbmRlZiBTZXRNb3ZpZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllUmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICByYXRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgcmF0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUHJlZmVycmVkUmF0ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CiAjaWZuZGVmIEdldE1vdmllUHJlZmVycmVkUmF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJlZmVycmVkUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmVmZXJyZWRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVByZWZlcnJlZFJhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVByZWZlcnJlZFJhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllUHJlZmVycmVkUmF0ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgcmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgcmF0ZTsKICNpZm5kZWYgU2V0TW92aWVQcmVmZXJyZWRSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmVmZXJyZWRSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVByZWZlcnJlZFJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVByZWZlcnJlZFJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgcmF0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVQcmVmZXJyZWRSYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFZvbHVtZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldE1vdmllUHJlZmVycmVkVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJlZmVycmVkVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVQcmVmZXJyZWRWb2x1bWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdm9sdW1lOwogI2lmbmRlZiBTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJlZmVycmVkVm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllUHJlZmVycmVkVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllVm9sdW1lKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0TW92aWVWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVZvbHVtZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVZvbHVtZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgdm9sdW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIFNldE1vdmllVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICB2b2x1bWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVQcmV2aWV3VGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHByZXZpZXdUaW1lOwotCVRpbWVWYWx1ZSBwcmV2aWV3RHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwcmV2aWV3VGltZTsKKyAgICBUaW1lVmFsdWUgcHJldmlld0R1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZVByZXZpZXdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3VGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVQcmV2aWV3VGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdEdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZVByZXZpZXdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld0R1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVQcmV2aWV3VGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHByZXZpZXdUaW1lOwotCVRpbWVWYWx1ZSBwcmV2aWV3RHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwcmV2aWV3VGltZTsKKyAgICBUaW1lVmFsdWUgcHJldmlld0R1cmF0aW9uOwogI2lmbmRlZiBTZXRNb3ZpZVByZXZpZXdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmV2aWV3VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmV2aWV3VGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdEdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllUHJldmlld1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgcHJldmlld0R1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3RHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVByZXZpZXdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdEdXJhdGlvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUG9zdGVyVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVQb3N0ZXJUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQb3N0ZXJUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVBvc3RlclRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUG9zdGVyVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQb3N0ZXJUaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllUG9zdGVyVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHBvc3RlclRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwb3N0ZXJUaW1lOwogI2lmbmRlZiBTZXRNb3ZpZVBvc3RlclRpbWUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVBvc3RlclRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUG9zdGVyVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc3RlclRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVBvc3RlclRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgcG9zdGVyVGltZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zdGVyVGltZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllUG9zdGVyVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBwb3N0ZXJUaW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVTZWxlY3Rpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lOwotCVRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHNlbGVjdGlvblRpbWU7CisgICAgVGltZVZhbHVlIHNlbGVjdGlvbkR1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZVNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uVGltZSwKLQkgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EdXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgc2VsZWN0aW9uVGltZTsKLQlUaW1lVmFsdWUgc2VsZWN0aW9uRHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lOworICAgIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbjsKICNpZm5kZWYgU2V0TW92aWVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25UaW1lLAotCSAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkR1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVBY3RpdmVTZWdtZW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIFNldE1vdmllQWN0aXZlU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllQWN0aXZlU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVBY3RpdmVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVBY3RpdmVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllQWN0aXZlU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVBY3RpdmVTZWdtZW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldE1vdmllQWN0aXZlU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQWN0aXZlU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVBY3RpdmVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNb3ZpZUFjdGl2ZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdmllQWN0aXZlU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVRpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7Ci0JVGltZVJlY29yZCBjdXJyZW50VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKKyAgICBUaW1lUmVjb3JkIGN1cnJlbnRUaW1lOwogI2lmbmRlZiBHZXRNb3ZpZVRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZjdXJyZW50VGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZjdXJyZW50VGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmY3VycmVudFRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCBuZXd0aW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIG5ld3RpbWU7CiAjaWZuZGVmIFNldE1vdmllVGltZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZuZXd0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICZuZXd0aW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJm5ld3RpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgJm5ld3RpbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVRpbWVWYWx1ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIG5ld3RpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBuZXd0aW1lOwogI2lmbmRlZiBTZXRNb3ZpZVRpbWVWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVRpbWVWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld3RpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVRpbWVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIG5ld3RpbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld3RpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVRpbWVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIG5ld3RpbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVVzZXJEYXRhKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVc2VyRGF0YSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVzZXJEYXRhIF9ydjsKICNpZm5kZWYgR2V0TW92aWVVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUcmFja0NvdW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldE1vdmllVHJhY2tDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllVHJhY2tDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUcmFja0NvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRyYWNrQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllVHJhY2tDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVRyYWNrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JbG9uZyB0cmFja0lEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CisgICAgbG9uZyB0cmFja0lEOwogI2lmbmRlZiBHZXRNb3ZpZVRyYWNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUcmFjayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICB0cmFja0lEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVHJhY2sgX3J2OworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIEdldE1vdmllSW5kVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUluZFRyYWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUluZFRyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUluZFRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllSW5kVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrVHlwZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OwotCWxvbmcgaW5kZXg7Ci0JT1NUeXBlIHRyYWNrVHlwZTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CisgICAgbG9uZyBpbmRleDsKKyAgICBPU1R5cGUgdHJhY2tUeXBlOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIEdldE1vdmllSW5kVHJhY2tUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVJbmRUcmFja1R5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllSW5kVHJhY2tUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRyYWNrVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVJbmRUcmFja1R5cGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRyYWNrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVJbmRUcmFja1R5cGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX05ld01vdmllVHJhY2soTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRyYWNrIF9ydjsKLQlGaXhlZCB3aWR0aDsKLQlGaXhlZCBoZWlnaHQ7Ci0Jc2hvcnQgdHJhY2tWb2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBGaXhlZCB3aWR0aDsKKyAgICBGaXhlZCBoZWlnaHQ7CisgICAgc2hvcnQgdHJhY2tWb2x1bWU7CiAjaWZuZGVmIE5ld01vdmllVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZVRyYWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZVRyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFja1ZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld01vdmllVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgdHJhY2tWb2x1bWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja1ZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tWb2x1bWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBlbmFibGU7CiAjaWZuZGVmIFNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QXV0b1RyYWNrQWx0ZXJuYXRlc0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0QXV0b1RyYWNrQWx0ZXJuYXRlc0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2VsZWN0TW92aWVBbHRlcm5hdGVzKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNlbGVjdE1vdmllQWx0ZXJuYXRlcwotCVB5TWFjX1BSRUNIRUNLKFNlbGVjdE1vdmllQWx0ZXJuYXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2VsZWN0TW92aWVBbHRlcm5hdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTZWxlY3RNb3ZpZUFsdGVybmF0ZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZWxlY3RNb3ZpZUFsdGVybmF0ZXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0luc2VydE1vdmllU2VnbWVudChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSBkc3RNb3ZpZTsKLQlUaW1lVmFsdWUgc3JjSW47Ci0JVGltZVZhbHVlIHNyY0R1cmF0aW9uOwotCVRpbWVWYWx1ZSBkc3RJbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBkc3RNb3ZpZTsKKyAgICBUaW1lVmFsdWUgc3JjSW47CisgICAgVGltZVZhbHVlIHNyY0R1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBkc3RJbjsKICNpZm5kZWYgSW5zZXJ0TW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRNb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0TW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0TW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIGRzdEluOwotCVRpbWVWYWx1ZSBkc3REdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgZHN0SW47CisgICAgVGltZVZhbHVlIGRzdER1cmF0aW9uOwogI2lmbmRlZiBJbnNlcnRFbXB0eU1vdmllU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEluc2VydEVtcHR5TW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRFbXB0eU1vdmllU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3RJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdER1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydEVtcHR5TW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnNlcnRFbXB0eU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RHVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0RlbGV0ZU1vdmllU2VnbWVudChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgRGVsZXRlTW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVNb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVsZXRlTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVsZXRlTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2NhbGVNb3ZpZVNlZ21lbnQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgb2xkRHVyYXRpb247Ci0JVGltZVZhbHVlIG5ld0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIG9sZER1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBuZXdEdXJhdGlvbjsKICNpZm5kZWYgU2NhbGVNb3ZpZVNlZ21lbnQKLQlQeU1hY19QUkVDSEVDSyhTY2FsZU1vdmllU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NhbGVNb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9sZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3RHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2NhbGVNb3ZpZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBvbGREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RHVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0R1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNjYWxlTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0R1cmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DdXRNb3ZpZVNlbGVjdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CiAjaWZuZGVmIEN1dE1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ3V0TW92aWVTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEN1dE1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDdXRNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ3V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQ29weU1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKICNpZm5kZWYgQ29weU1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TW92aWVTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvcHlNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ29weU1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1Bhc3RlTW92aWVTZWxlY3Rpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIHNyYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgc3JjOwogI2lmbmRlZiBQYXN0ZU1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soUGFzdGVNb3ZpZVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFzdGVNb3ZpZVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlQYXN0ZU1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBzcmMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYXN0ZU1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9BZGRNb3ZpZVNlbGVjdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBzcmM7CiAjaWZuZGVmIEFkZE1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQWRkTW92aWVTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZE1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyYykpCi0JCXJldHVybiBOVUxMOwotCUFkZE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc3JjKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmc3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQWRkTW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzcmMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DbGVhck1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsZWFyTW92aWVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGVhck1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xlYXJNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JT1NUeXBlIGhhbmRsZVR5cGU7Ci0JSGFuZGxlIHB1YmxpY01vdmllOwotCVRpbWVWYWx1ZSBzdGFydDsKLQlUaW1lVmFsdWUgZHVyOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgdGFyZ2V0VHJhY2s7CisgICAgT1NUeXBlIGhhbmRsZVR5cGU7CisgICAgSGFuZGxlIHB1YmxpY01vdmllOworICAgIFRpbWVWYWx1ZSBzdGFydDsKKyAgICBUaW1lVmFsdWUgZHVyOworICAgIGxvbmcgZmxhZ3M7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CiAjaWZuZGVmIFB1dE1vdmllSW50b1R5cGVkSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b1R5cGVkSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckNvbXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckNvbXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0NvcHlNb3ZpZVNldHRpbmdzKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1vdmllIGRzdE1vdmllOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIGRzdE1vdmllOwogI2lmbmRlZiBDb3B5TW92aWVTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKENvcHlNb3ZpZVNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TW92aWVTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5TW92aWVTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weU1vdmllU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0NvbnZlcnRNb3ZpZVRvRmlsZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayBvbmx5VHJhY2s7Ci0JRlNTcGVjIG91dHB1dEZpbGU7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCXNob3J0IHJlc0lEOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgb25seVRyYWNrOworICAgIEZTU3BlYyBvdXRwdXRGaWxlOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBzaG9ydCByZXNJRDsKKyAgICBsb25nIGZsYWdzOworICAgIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wOwogI2lmbmRlZiBDb252ZXJ0TW92aWVUb0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhDb252ZXJ0TW92aWVUb0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbnZlcnRNb3ZpZVRvRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZvdXRwdXRGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ1c2VyQ29tcCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb252ZXJ0TW92aWVUb0ZpbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ29tcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8maGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZvbmx5VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJm91dHB1dEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnVzZXJDb21wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbnZlcnRNb3ZpZVRvRmlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJDb21wKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVEYXRhU2l6ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZURhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEYXRhU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplNjQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247Ci0Jd2lkZSBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICB3aWRlIGRhdGFTaXplOwogI2lmbmRlZiBHZXRNb3ZpZURhdGFTaXplNjQKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURhdGFTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGF0YVNpemU2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZURhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVEYXRhU2l6ZTY0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B0SW5Nb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHB0OwogI2lmbmRlZiBQdEluTW92aWUKLQlQeU1hY19QUkVDSEVDSyhQdEluTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5Nb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQdEluTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgcHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFB0SW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBwdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVMYW5ndWFnZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBsYW5ndWFnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBsYW5ndWFnZTsKICNpZm5kZWYgU2V0TW92aWVMYW5ndWFnZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllTGFuZ3VhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllTGFuZ3VhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsYW5ndWFnZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllTGFuZ3VhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGxhbmd1YWdlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsYW5ndWFnZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllTGFuZ3VhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQ29weU1vdmllVXNlckRhdGEoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgZHN0TW92aWU7Ci0JT1NUeXBlIGNvcHlSdWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIGRzdE1vdmllOworICAgIE9TVHlwZSBjb3B5UnVsZTsKICNpZm5kZWYgQ29weU1vdmllVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhDb3B5TW92aWVVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weU1vdmllVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29weVJ1bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1vdmllVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlSdWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJmRzdE1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5TW92aWVVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllTmV4dEludGVyZXN0aW5nVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7Ci0Jc2hvcnQgbnVtTWVkaWFUeXBlczsKLQlPU1R5cGUgd2hpY2hNZWRpYVR5cGVzOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIHJhdGU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKLQlUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7CisgICAgc2hvcnQgbnVtTWVkaWFUeXBlczsKKyAgICBPU1R5cGUgd2hpY2hNZWRpYVR5cGVzOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIEZpeGVkIHJhdGU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKKyAgICBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbjsKICNpZm5kZWYgR2V0TW92aWVOZXh0SW50ZXJlc3RpbmdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVOZXh0SW50ZXJlc3RpbmdUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bU1lZGlhVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJndoaWNoTWVkaWFUeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCUdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTWVkaWFUeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoTWVkaWFUeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nRHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1NZWRpYVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ3aGljaE1lZGlhVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1lZGlhVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaE1lZGlhVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9BZGRNb3ZpZVJlc291cmNlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlc1JlZk51bTsKLQlzaG9ydCByZXNJZDsKLQlTdHIyNTUgcmVzTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgc2hvcnQgcmVzSWQ7CisgICAgU3RyMjU1IHJlc05hbWU7CiAjaWZuZGVmIEFkZE1vdmllUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRNb3ZpZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICByZXNOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXNJZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCByZXNOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZE1vdmllUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9VcGRhdGVNb3ZpZVJlc291cmNlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlc1JlZk51bTsKLQlzaG9ydCByZXNJZDsKLQlTdHIyNTUgcmVzTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgc2hvcnQgcmVzSWQ7CisgICAgU3RyMjU1IHJlc05hbWU7CiAjaWZuZGVmIFVwZGF0ZU1vdmllUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVNb3ZpZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVNb3ZpZVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVNb3ZpZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc05hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVNb3ZpZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0FkZE1vdmllVG9TdG9yYWdlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBBZGRNb3ZpZVRvU3RvcmFnZQotCVB5TWFjX1BSRUNIRUNLKEFkZE1vdmllVG9TdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVRvU3RvcmFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZE1vdmllVG9TdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZE1vdmllVG9TdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9VcGRhdGVNb3ZpZUluU3RvcmFnZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEYXRhSGFuZGxlciBkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEYXRhSGFuZGxlciBkaDsKICNpZm5kZWYgVXBkYXRlTW92aWVJblN0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVNb3ZpZUluU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlTW92aWVJblN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVNb3ZpZUluU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVNb3ZpZUluU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfSGFzTW92aWVDaGFuZ2VkKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEhhc01vdmllQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKEhhc01vdmllQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGFzTW92aWVDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBIYXNNb3ZpZUNoYW5nZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhhc01vdmllQ2hhbmdlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DbGVhck1vdmllQ2hhbmdlZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDbGVhck1vdmllQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKENsZWFyTW92aWVDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xlYXJNb3ZpZUNoYW5nZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGVhck1vdmllQ2hhbmdlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVEZWZhdWx0RGF0YVJlZihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBTZXRNb3ZpZURlZmF1bHREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEZWZhdWx0RGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEZWZhdWx0RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNb3ZpZURlZmF1bHREYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TW92aWVEZWZhdWx0RGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRGVmYXVsdERhdGFSZWYoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgR2V0TW92aWVEZWZhdWx0RGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGVmYXVsdERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGVmYXVsdERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZURlZmF1bHREYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNb3ZpZURlZmF1bHREYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVDb2xvclRhYmxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNUYWJIYW5kbGUgY3RhYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBDVGFiSGFuZGxlIGN0YWI7CiAjaWZuZGVmIFNldE1vdmllQ29sb3JUYWJsZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllQ29sb3JUYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVDb2xvclRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdGFiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1vdmllQ29sb3JUYWJsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TW92aWVDb2xvclRhYmxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGFiKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUNvbG9yVGFibGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ1RhYkhhbmRsZSBjdGFiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENUYWJIYW5kbGUgY3RhYjsKICNpZm5kZWYgR2V0TW92aWVDb2xvclRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVDb2xvclRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUNvbG9yVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZUNvbG9yVGFibGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjdGFiKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY3RhYik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNb3ZpZUNvbG9yVGFibGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdGFiKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY3RhYik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfRmxhdHRlbk1vdmllKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG1vdmllRmxhdHRlbkZsYWdzOwotCUZTU3BlYyB0aGVGaWxlOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCWxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7Ci0Jc2hvcnQgcmVzSWQ7Ci0JU3RyMjU1IHJlc05hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbW92aWVGbGF0dGVuRmxhZ3M7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBzaG9ydCByZXNJZDsKKyAgICBTdHIyNTUgcmVzTmFtZTsKICNpZm5kZWYgRmxhdHRlbk1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soRmxhdHRlbk1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUZsYXR0ZW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKLQkgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgIHNjcmlwdFRhZywKLQkgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MsCi0JICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgcmVzTmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc0lkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJmhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGbGF0dGVuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCByZXNOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmxhdHRlbk1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIG1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgJnJlc0lkLAorICAgICAgICAgICAgICAgICByZXNOYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGEoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlsb25nIG1vdmllRmxhdHRlbkZsYWdzOwotCUZTU3BlYyB0aGVGaWxlOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCWxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKKyAgICBsb25nIG1vdmllRmxhdHRlbkZsYWdzOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7CiAjaWZuZGVmIEZsYXR0ZW5Nb3ZpZURhdGEKLQlQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWVEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWVEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8maGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGbGF0dGVuRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXR0ZW5Nb3ZpZURhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIG1vdmllRmxhdHRlbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8maGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGbGF0dGVuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXR0ZW5Nb3ZpZURhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlsb25nIG1vdmllRmxhdHRlbkZsYWdzOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlPU1R5cGUgY3JlYXRvcjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CisgICAgbG9uZyBtb3ZpZUZsYXR0ZW5GbGFnczsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKICNpZm5kZWYgRmxhdHRlbk1vdmllRGF0YVRvRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKEZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfTW92aWVTZWFyY2hUZXh0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVB0ciB0ZXh0OwotCWxvbmcgc2l6ZTsKLQlsb25nIHNlYXJjaEZsYWdzOwotCVRyYWNrIHNlYXJjaFRyYWNrOwotCVRpbWVWYWx1ZSBzZWFyY2hUaW1lOwotCWxvbmcgc2VhcmNoT2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFB0ciB0ZXh0OworICAgIGxvbmcgc2l6ZTsKKyAgICBsb25nIHNlYXJjaEZsYWdzOworICAgIFRyYWNrIHNlYXJjaFRyYWNrOworICAgIFRpbWVWYWx1ZSBzZWFyY2hUaW1lOworICAgIGxvbmcgc2VhcmNoT2Zmc2V0OwogI2lmbmRlZiBNb3ZpZVNlYXJjaFRleHQKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZVNlYXJjaFRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllU2VhcmNoVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBNb3ZpZVNlYXJjaFRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hPZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgc2VhcmNoVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlYXJjaEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE1vdmllU2VhcmNoVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlYXJjaE9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBzZWFyY2hUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaE9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0UG9zdGVyQm94KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJveFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm94UmVjdDsKICNpZm5kZWYgR2V0UG9zdGVyQm94Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9zdGVyQm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3N0ZXJCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvc3RlckJveChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAmYm94UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3hSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9zdGVyQm94KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICZib3hSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldFBvc3RlckJveChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3hSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJveFJlY3Q7CiAjaWZuZGVmIFNldFBvc3RlckJveAotCVB5TWFjX1BSRUNIRUNLKFNldFBvc3RlckJveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9zdGVyQm94KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3N0ZXJCb3goX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgJmJveFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3hSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9zdGVyQm94KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICZib3hSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKLQlUaW1lVmFsdWUgdGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVN0YXR1cyhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUcmFjayBmaXJzdFByb2JsZW1UcmFjazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUcmFjayBmaXJzdFByb2JsZW1UcmFjazsKICNpZm5kZWYgR2V0TW92aWVTdGF0dXMKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVN0YXR1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTdGF0dXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJmZpcnN0UHJvYmxlbVRyYWNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBmaXJzdFByb2JsZW1UcmFjayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0UHJvYmxlbVRyYWNrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBmaXJzdFByb2JsZW1UcmFjayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfTmV3TW92aWVDb250cm9sbGVyKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZUNvbnRyb2xsZXIgX3J2OwotCVJlY3QgbW92aWVSZWN0OwotCWxvbmcgc29tZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZUNvbnRyb2xsZXIgX3J2OworICAgIFJlY3QgbW92aWVSZWN0OworICAgIGxvbmcgc29tZUZsYWdzOwogI2lmbmRlZiBOZXdNb3ZpZUNvbnRyb2xsZXIKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUNvbnRyb2xsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllQ29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbW92aWVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3TW92aWVDb250cm9sbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZUN0bE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJm1vdmllUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvbWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVDdGxPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllT25TY3JhcChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIG1vdmllU2NyYXBGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIG1vdmllU2NyYXBGbGFnczsKICNpZm5kZWYgUHV0TW92aWVPblNjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVPblNjcmFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZU9uU2NyYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVNjcmFwRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVPblNjcmFwKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVNjcmFwRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVTY3JhcEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllT25TY3JhcChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVTY3JhcEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVBsYXlIaW50cyhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGZsYWdzTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGZsYWdzTWFzazsKICNpZm5kZWYgU2V0TW92aWVQbGF5SGludHMKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVBsYXlIaW50cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQbGF5SGludHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVBsYXlIaW50cyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVQbGF5SGludHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgdGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgdGltZTsKICNpZm5kZWYgR2V0TWF4TG9hZGVkVGltZUluTW92aWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWF4TG9hZGVkVGltZUluTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfUVRNb3ZpZU5lZWRzVGltZVRhYmxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUJvb2xlYW4gbmVlZHNUaW1lVGFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQm9vbGVhbiBuZWVkc1RpbWVUYWJsZTsKICNpZm5kZWYgUVRNb3ZpZU5lZWRzVGltZVRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soUVRNb3ZpZU5lZWRzVGltZVRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVE1vdmllTmVlZHNUaW1lVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVE1vdmllTmVlZHNUaW1lVGFibGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZWVkc1RpbWVUYWJsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgbmVlZHNUaW1lVGFibGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRNb3ZpZU5lZWRzVGltZVRhYmxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmVlZHNUaW1lVGFibGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzVGltZVRhYmxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9RVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlsb25nIG9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgbG9uZyBvZmZzZXQ7CiAjaWZuZGVmIFFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhRVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIE1vdmllT2JqX21ldGhvZHNbXSA9IHsKLQl7Ik1vdmllc1Rhc2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVzVGFzaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtYXhNaWxsaVNlY1RvVXNlKSAtPiBOb25lIil9LAotCXsiUHJlcm9sbE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1ByZXJvbGxNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIEZpeGVkIFJhdGUpIC0+IE5vbmUiKX0sCi0JeyJBYm9ydFByZVByZXJvbGxNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BYm9ydFByZVByZXJvbGxNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NFcnIgZXJyKSAtPiBOb25lIil9LAotCXsiTG9hZE1vdmllSW50b1JhbSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Mb2FkTW92aWVJbnRvUmFtLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAotCXsiU2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0aXZlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlN0YXJ0TW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU3RhcnRNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU3RvcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1N0b3BNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR29Ub0JlZ2lubmluZ09mTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR29Ub0JlZ2lubmluZ09mTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdvVG9FbmRPZk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dvVG9FbmRPZk1vdmllLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJc01vdmllRG9uZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Jc01vdmllRG9uZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0TW92aWVQcmV2aWV3TW9kZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZXZpZXdNb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVByZXZpZXdNb2RlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gdXNlUHJldmlldykgLT4gTm9uZSIpfSwKLQl7IlNob3dNb3ZpZVBvc3RlciIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TaG93TW92aWVQb3N0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKLQl7IlNldE1vdmllTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVNYXN0ZXJUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZUJhc2UgdGIsIFRpbWVSZWNvcmQgc2xhdmVaZXJvKSAtPiBOb25lIil9LAotCXsiU2V0TW92aWVNYXN0ZXJDbG9jayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZU1hc3RlckNsb2NrLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnQgY2xvY2tNZWlzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKLQl7IkNob29zZU1vdmllQ2xvY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ2hvb3NlTW92aWVDbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllR1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllR1dvcmxkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIil9LAotCXsiU2V0TW92aWVHV29ybGQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBuYXR1cmFsQm91bmRzKSIpfSwKLQl7IkdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nLCAxLAotCSBQeURvY19TVFIoIihUcmFjayB0aGVUcmFjaykgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZywgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgdGhlVHJhY2spIC0+IChUcmFjayBfcnYpIil9LAotCXsiR2V0TW92aWVQaWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUGljdCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE1vdmllUG9zdGVyUGljdCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclBpY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAotCXsiVXBkYXRlTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkludmFsaWRhdGVNb3ZpZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnZhbGlkYXRlTW92aWVSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpbnZhbGlkUmduKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVCb3gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm94UmVjdCkiKX0sCi0JeyJTZXRNb3ZpZUJveCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUJveCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEaXNwbGF5Q2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURpc3BsYXlDbGlwUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlNldE1vdmllRGlzcGxheUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVEaXNwbGF5Q2xpcFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDbGlwUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlNldE1vdmllQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGlzcGxheUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRNb3ZpZUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVZpZGVvT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVmlkZW9PdXRwdXQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHZvdXQpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgcHVibGljTW92aWUpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUludG9EYXRhRm9yayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9EYXRhRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZlJlZk51bSwgbG9uZyBvZmZzZXQsIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IlB1dE1vdmllSW50b0RhdGFGb3JrNjQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvRGF0YUZvcms2NCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmUmVmTnVtLCB3aWRlIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplKSAtPiBOb25lIil9LAotCXsiUHV0TW92aWVJbnRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9TdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IlB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIHB1YmxpY01vdmllKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVDcmVhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDcmVhdGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllTW9kaWZpY2F0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lU2NhbGUgX3J2KSIpfSwKLQl7IlNldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihUaW1lU2NhbGUgdGltZVNjYWxlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUR1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IkdldE1vdmllUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVJhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVSYXRlLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCByYXRlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVQcmVmZXJyZWRSYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJlZmVycmVkUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IlNldE1vdmllUHJlZmVycmVkUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZWZlcnJlZFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHJhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldE1vdmllUHJlZmVycmVkVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJlZmVycmVkVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldE1vdmllVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJldmlld1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikiKX0sCi0JeyJTZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllUG9zdGVyVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBfcnYpIil9LAotCXsiU2V0TW92aWVQb3N0ZXJUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUG9zdGVyVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHBvc3RlclRpbWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikiKX0sCi0JeyJTZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikiKX0sCi0JeyJHZXRNb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIGN1cnJlbnRUaW1lKSIpfSwKLQl7IlNldE1vdmllVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgbmV3dGltZSkgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllVGltZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVZhbHVlLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgbmV3dGltZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgX3J2KSIpfSwKLQl7IkdldE1vdmllVHJhY2tDb3VudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVRyYWNrQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUcmFjaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyB0cmFja0lEKSAtPiAoVHJhY2sgX3J2KSIpfSwKLQl7IkdldE1vdmllSW5kVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVJbmRUcmFjaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXRNb3ZpZUluZFRyYWNrVHlwZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgT1NUeXBlIHRyYWNrVHlwZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJOZXdNb3ZpZVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllVHJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQsIHNob3J0IHRyYWNrVm9sdW1lKSAtPiAoVHJhY2sgX3J2KSIpfSwKLQl7IlNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGVuYWJsZSkgLT4gTm9uZSIpfSwKLQl7IlNlbGVjdE1vdmllQWx0ZXJuYXRlcyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZWxlY3RNb3ZpZUFsdGVybmF0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydE1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnNlcnRNb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0RlbGV0ZU1vdmllU2VnbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiU2NhbGVNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2NhbGVNb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiQ3V0TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ3V0TW92aWVTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJDb3B5TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29weU1vdmllU2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiUGFzdGVNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QYXN0ZU1vdmllU2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBzcmMpIC0+IE5vbmUiKX0sCi0JeyJBZGRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgc3JjKSAtPiBOb25lIil9LAotCXsiQ2xlYXJNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllU2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUludG9UeXBlZEhhbmRsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9UeXBlZEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgdGFyZ2V0VHJhY2ssIE9TVHlwZSBoYW5kbGVUeXBlLCBIYW5kbGUgcHVibGljTW92aWUsIFRpbWVWYWx1ZSBzdGFydCwgVGltZVZhbHVlIGR1ciwgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IE5vbmUiKX0sCi0JeyJDb3B5TW92aWVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUpIC0+IE5vbmUiKX0sCi0JeyJDb252ZXJ0TW92aWVUb0ZpbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29udmVydE1vdmllVG9GaWxlLCAxLAotCSBQeURvY19TVFIoIihUcmFjayBvbmx5VHJhY2ssIEZTU3BlYyBvdXRwdXRGaWxlLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IChzaG9ydCByZXNJRCkiKX0sCi0JeyJHZXRNb3ZpZURhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAotCXsiUHRJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B0SW5Nb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNb3ZpZUxhbmd1YWdlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllTGFuZ3VhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbGFuZ3VhZ2UpIC0+IE5vbmUiKX0sCi0JeyJDb3B5TW92aWVVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBzaG9ydCBudW1NZWRpYVR5cGVzLCBPU1R5cGUgd2hpY2hNZWRpYVR5cGVzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUsIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uKSIpfSwKLQl7IkFkZE1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWRkTW92aWVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKLQl7IlVwZGF0ZU1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCwgU3RyMjU1IHJlc05hbWUpIC0+IE5vbmUiKX0sCi0JeyJBZGRNb3ZpZVRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVRvU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVNb3ZpZUluU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9VcGRhdGVNb3ZpZUluU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCi0JeyJIYXNNb3ZpZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSGFzTW92aWVDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDbGVhck1vdmllQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IlNldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNvbG9yVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY3RhYikgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUNvbG9yVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENUYWJIYW5kbGUgY3RhYikiKX0sCi0JeyJGbGF0dGVuTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllLCAxLAotCSBQeURvY19TVFIoIihsb25nIG1vdmllRmxhdHRlbkZsYWdzLCBGU1NwZWMgdGhlRmlsZSwgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKLQl7IkZsYXR0ZW5Nb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtb3ZpZUZsYXR0ZW5GbGFncywgRlNTcGVjIHRoZUZpbGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbW92aWVGbGF0dGVuRmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJNb3ZpZVNlYXJjaFRleHQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVTZWFyY2hUZXh0LCAxLAotCSBQeURvY19TVFIoIihQdHIgdGV4dCwgbG9uZyBzaXplLCBsb25nIHNlYXJjaEZsYWdzKSAtPiAoVHJhY2sgc2VhcmNoVHJhY2ssIFRpbWVWYWx1ZSBzZWFyY2hUaW1lLCBsb25nIHNlYXJjaE9mZnNldCkiKX0sCi0JeyJHZXRQb3N0ZXJCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0UG9zdGVyQm94LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGJveFJlY3QpIil9LAotCXsiU2V0UG9zdGVyQm94IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldFBvc3RlckJveCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRNb3ZpZVN0YXR1cyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVHJhY2sgZmlyc3RQcm9ibGVtVHJhY2spIil9LAotCXsiTmV3TW92aWVDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllQ29udHJvbGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBtb3ZpZVJlY3QsIGxvbmcgc29tZUZsYWdzKSAtPiAoTW92aWVDb250cm9sbGVyIF9ydikiKX0sCi0JeyJQdXRNb3ZpZU9uU2NyYXAiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVPblNjcmFwLCAxLAotCSBQeURvY19TVFIoIihsb25nIG1vdmllU2NyYXBGbGFncykgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllUGxheUhpbnRzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUGxheUhpbnRzLCAxLAotCSBQeURvY19TVFIoIihsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gTm9uZSIpfSwKLQl7IkdldE1heExvYWRlZFRpbWVJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1heExvYWRlZFRpbWVJbk1vdmllLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgdGltZSkiKX0sCi0JeyJRVE1vdmllTmVlZHNUaW1lVGFibGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRNb3ZpZU5lZWRzVGltZVRhYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIG5lZWRzVGltZVRhYmxlKSIpfSwKLQl7IlFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGRhdGFSZWZUeXBlLCBIYW5kbGUgZGF0YVJlZikgLT4gKGxvbmcgb2Zmc2V0KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik1vdmllc1Rhc2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVzVGFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtYXhNaWxsaVNlY1RvVXNlKSAtPiBOb25lIil9LAorICAgIHsiUHJlcm9sbE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1ByZXJvbGxNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIEZpeGVkIFJhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJBYm9ydFByZVByZXJvbGxNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BYm9ydFByZVByZXJvbGxNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NFcnIgZXJyKSAtPiBOb25lIil9LAorICAgIHsiTG9hZE1vdmllSW50b1JhbSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Mb2FkTW92aWVJbnRvUmFtLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiU2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVBY3RpdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0aXZlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVBY3RpdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlN0YXJ0TW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU3RhcnRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU3RvcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1N0b3BNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR29Ub0JlZ2lubmluZ09mTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR29Ub0JlZ2lubmluZ09mTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdvVG9FbmRPZk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dvVG9FbmRPZk1vdmllLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJc01vdmllRG9uZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Jc01vdmllRG9uZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0TW92aWVQcmV2aWV3TW9kZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZXZpZXdNb2RlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVByZXZpZXdNb2RlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld01vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gdXNlUHJldmlldykgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dNb3ZpZVBvc3RlciIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TaG93TW92aWVQb3N0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVNYXN0ZXJUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZUJhc2UgdGIsIFRpbWVSZWNvcmQgc2xhdmVaZXJvKSAtPiBOb25lIil9LAorICAgIHsiU2V0TW92aWVNYXN0ZXJDbG9jayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZU1hc3RlckNsb2NrLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnQgY2xvY2tNZWlzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKKyAgICB7IkNob29zZU1vdmllQ2xvY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ2hvb3NlTW92aWVDbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllR1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllR1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIil9LAorICAgIHsiU2V0TW92aWVHV29ybGQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBuYXR1cmFsQm91bmRzKSIpfSwKKyAgICB7IkdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayB0aGVUcmFjaykgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgdGhlVHJhY2spIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiR2V0TW92aWVQaWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUGljdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllUG9zdGVyUGljdCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclBpY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAorICAgIHsiVXBkYXRlTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkludmFsaWRhdGVNb3ZpZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnZhbGlkYXRlTW92aWVSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpbnZhbGlkUmduKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm94UmVjdCkiKX0sCisgICAgeyJTZXRNb3ZpZUJveCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUJveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEaXNwbGF5Q2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURpc3BsYXlDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllRGlzcGxheUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVEaXNwbGF5Q2xpcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNsaXBSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGlzcGxheUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVZpZGVvT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVmlkZW9PdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHZvdXQpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgcHVibGljTW92aWUpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUludG9EYXRhRm9yayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9EYXRhRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZlJlZk51bSwgbG9uZyBvZmZzZXQsIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlB1dE1vdmllSW50b0RhdGFGb3JrNjQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvRGF0YUZvcms2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmUmVmTnVtLCB3aWRlIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplKSAtPiBOb25lIil9LAorICAgIHsiUHV0TW92aWVJbnRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9TdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIHB1YmxpY01vdmllKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVDcmVhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDcmVhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllTW9kaWZpY2F0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lU2NhbGUgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgdGltZVNjYWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUR1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVJhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCByYXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVQcmVmZXJyZWRSYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJlZmVycmVkUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllUHJlZmVycmVkUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZWZlcnJlZFJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHJhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllUHJlZmVycmVkVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJlZmVycmVkVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJldmlld1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikiKX0sCisgICAgeyJTZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllUG9zdGVyVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBfcnYpIil9LAorICAgIHsiU2V0TW92aWVQb3N0ZXJUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUG9zdGVyVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHBvc3RlclRpbWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikiKX0sCisgICAgeyJTZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikiKX0sCisgICAgeyJHZXRNb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIGN1cnJlbnRUaW1lKSIpfSwKKyAgICB7IlNldE1vdmllVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgbmV3dGltZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllVGltZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgbmV3dGltZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllVHJhY2tDb3VudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVRyYWNrQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUcmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyB0cmFja0lEKSAtPiAoVHJhY2sgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllSW5kVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVJbmRUcmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZUluZFRyYWNrVHlwZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgT1NUeXBlIHRyYWNrVHlwZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJOZXdNb3ZpZVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllVHJhY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQsIHNob3J0IHRyYWNrVm9sdW1lKSAtPiAoVHJhY2sgX3J2KSIpfSwKKyAgICB7IlNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGVuYWJsZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNlbGVjdE1vdmllQWx0ZXJuYXRlcyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZWxlY3RNb3ZpZUFsdGVybmF0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydE1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnNlcnRNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiRGVsZXRlTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0RlbGV0ZU1vdmllU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiU2NhbGVNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2NhbGVNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiQ3V0TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ3V0TW92aWVTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJDb3B5TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29weU1vdmllU2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiUGFzdGVNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QYXN0ZU1vdmllU2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBzcmMpIC0+IE5vbmUiKX0sCisgICAgeyJBZGRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgc3JjKSAtPiBOb25lIil9LAorICAgIHsiQ2xlYXJNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllU2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUludG9UeXBlZEhhbmRsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9UeXBlZEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgdGFyZ2V0VHJhY2ssIE9TVHlwZSBoYW5kbGVUeXBlLCBIYW5kbGUgcHVibGljTW92aWUsIFRpbWVWYWx1ZSBzdGFydCwgVGltZVZhbHVlIGR1ciwgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5TW92aWVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUpIC0+IE5vbmUiKX0sCisgICAgeyJDb252ZXJ0TW92aWVUb0ZpbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29udmVydE1vdmllVG9GaWxlLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayBvbmx5VHJhY2ssIEZTU3BlYyBvdXRwdXRGaWxlLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IChzaG9ydCByZXNJRCkiKX0sCisgICAgeyJHZXRNb3ZpZURhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAorICAgIHsiUHRJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B0SW5Nb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZUxhbmd1YWdlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllTGFuZ3VhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbGFuZ3VhZ2UpIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5TW92aWVVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBzaG9ydCBudW1NZWRpYVR5cGVzLCBPU1R5cGUgd2hpY2hNZWRpYVR5cGVzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUsIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uKSIpfSwKKyAgICB7IkFkZE1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWRkTW92aWVSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKKyAgICB7IlVwZGF0ZU1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWVSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCwgU3RyMjU1IHJlc05hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJBZGRNb3ZpZVRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVRvU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVNb3ZpZUluU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9VcGRhdGVNb3ZpZUluU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCisgICAgeyJIYXNNb3ZpZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSGFzTW92aWVDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDbGVhck1vdmllQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKKyAgICB7IlNldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNvbG9yVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY3RhYikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUNvbG9yVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENUYWJIYW5kbGUgY3RhYikiKX0sCisgICAgeyJGbGF0dGVuTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vdmllRmxhdHRlbkZsYWdzLCBGU1NwZWMgdGhlRmlsZSwgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKKyAgICB7IkZsYXR0ZW5Nb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtb3ZpZUZsYXR0ZW5GbGFncywgRlNTcGVjIHRoZUZpbGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbW92aWVGbGF0dGVuRmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJNb3ZpZVNlYXJjaFRleHQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVTZWFyY2hUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihQdHIgdGV4dCwgbG9uZyBzaXplLCBsb25nIHNlYXJjaEZsYWdzKSAtPiAoVHJhY2sgc2VhcmNoVHJhY2ssIFRpbWVWYWx1ZSBzZWFyY2hUaW1lLCBsb25nIHNlYXJjaE9mZnNldCkiKX0sCisgICAgeyJHZXRQb3N0ZXJCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0UG9zdGVyQm94LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJveFJlY3QpIil9LAorICAgIHsiU2V0UG9zdGVyQm94IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldFBvc3RlckJveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZVN0YXR1cyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVN0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVHJhY2sgZmlyc3RQcm9ibGVtVHJhY2spIil9LAorICAgIHsiTmV3TW92aWVDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllQ29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBtb3ZpZVJlY3QsIGxvbmcgc29tZUZsYWdzKSAtPiAoTW92aWVDb250cm9sbGVyIF9ydikiKX0sCisgICAgeyJQdXRNb3ZpZU9uU2NyYXAiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVPblNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vdmllU2NyYXBGbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllUGxheUhpbnRzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUGxheUhpbnRzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1heExvYWRlZFRpbWVJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1heExvYWRlZFRpbWVJbk1vdmllLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgdGltZSkiKX0sCisgICAgeyJRVE1vdmllTmVlZHNUaW1lVGFibGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRNb3ZpZU5lZWRzVGltZVRhYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIG5lZWRzVGltZVRhYmxlKSIpfSwKKyAgICB7IlFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGRhdGFSZWZUeXBlLCBIYW5kbGUgZGF0YVJlZikgLT4gKGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgTW92aWVPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC03Mjg2LDYxICs3Mjg2LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCU1vdmllIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTW92aWUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTW92aWVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChNb3ZpZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNb3ZpZU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKE1vdmllT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIE1vdmllT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1vdmllX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0Lk1vdmllIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTW92aWVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBNb3ZpZU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBNb3ZpZU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTW92aWVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIE1vdmllT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCU1vdmllT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1vdmllT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCU1vdmllT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlNb3ZpZU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNb3ZpZU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCU1vdmllT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuTW92aWUiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihNb3ZpZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIE1vdmllT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIE1vdmllT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBNb3ZpZU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgTW92aWVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTW92aWVPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgTW92aWVPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgTW92aWVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIE1vdmllT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIE1vdmllT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgTW92aWVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBNb3ZpZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03MzUzLDQ3ICs3MzUzLDQ3IEBACiAjZGVmaW5lIFNHT3V0cHV0T2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlNHT3V0cHV0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlNHT3V0cHV0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBTR091dHB1dE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVNHT3V0cHV0IG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgU0dPdXRwdXQgb2JfaXRzZWxmOwogfSBTR091dHB1dE9iamVjdDsKIAogUHlPYmplY3QgKlNHT3V0cHV0T2JqX05ldyhTR091dHB1dCBpdHNlbGYpCiB7Ci0JU0dPdXRwdXRPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFNHT3V0cHV0IGZyb20gTlVMTCBwb2ludGVyIik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoU0dPdXRwdXRPYmplY3QsICZTR091dHB1dF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgU0dPdXRwdXRPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFNHT3V0cHV0IGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoU0dPdXRwdXRPYmplY3QsICZTR091dHB1dF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBTR091dHB1dE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBTR091dHB1dCAqcF9pdHNlbGYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIVNHT3V0cHV0T2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlNHT3V0cHV0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFNHT3V0cHV0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghU0dPdXRwdXRPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiU0dPdXRwdXQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoU0dPdXRwdXRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBTR091dHB1dE9ial9kZWFsbG9jKFNHT3V0cHV0T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNHT3V0cHV0T2JqX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgU0dPdXRwdXRPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC03NDEwLDYxICs3NDEwLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqU0dPdXRwdXRPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVNHT3V0cHV0IGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgU0dPdXRwdXQgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgU0dPdXRwdXRPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChTR091dHB1dE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBTR091dHB1dE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFNHT3V0cHV0T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFNHT3V0cHV0T2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFNHT3V0cHV0X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0LlNHT3V0cHV0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoU0dPdXRwdXRPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBTR091dHB1dE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBTR091dHB1dE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgU0dPdXRwdXRPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFNHT3V0cHV0T2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVNHT3V0cHV0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVNHT3V0cHV0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVNHT3V0cHV0T2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlTR091dHB1dE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlTR091dHB1dE9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVNHT3V0cHV0T2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuU0dPdXRwdXQiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihTR091dHB1dE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFNHT3V0cHV0T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFNHT3V0cHV0T2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBTR091dHB1dE9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgU0dPdXRwdXRPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgU0dPdXRwdXRPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgU0dPdXRwdXRPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgU0dPdXRwdXRPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFNHT3V0cHV0T2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFNHT3V0cHV0T2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgU0dPdXRwdXRPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFNHT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03NDcyLDIwNTI3ICs3NDcyLDIwNTI3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRW50ZXJNb3ZpZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEVudGVyTW92aWVzCi0JUHlNYWNfUFJFQ0hFQ0soRW50ZXJNb3ZpZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEVudGVyTW92aWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW50ZXJNb3ZpZXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVudGVyTW92aWVzKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRXhpdE1vdmllcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBFeGl0TW92aWVzCi0JUHlNYWNfUFJFQ0hFQ0soRXhpdE1vdmllcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXhpdE1vdmllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRXhpdE1vdmllcygpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXhpdE1vdmllcygpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRNb3ZpZXNFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgR2V0TW92aWVzRXJyb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZXNFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVzRXJyb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZXNFcnJvcigpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVzRXJyb3IoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbGVhck1vdmllc1N0aWNreUVycm9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsZWFyTW92aWVzU3RpY2t5RXJyb3IKLQlQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllc1N0aWNreUVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllc1N0aWNreUVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGVhck1vdmllc1N0aWNreUVycm9yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGVhck1vdmllc1N0aWNreUVycm9yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldE1vdmllc1N0aWNreUVycm9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBHZXRNb3ZpZXNTdGlja3lFcnJvcgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllc1N0aWNreUVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZXNTdGlja3lFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1vdmllc1N0aWNreUVycm9yKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNb3ZpZXNTdGlja3lFcnJvcigpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0V2FsbENsb2NrVGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZUJhc2Ugd2FsbENsb2NrVGltZUJhc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZUJhc2Ugd2FsbENsb2NrVGltZUJhc2U7CiAjaWZuZGVmIFFUR2V0V2FsbENsb2NrVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhRVEdldFdhbGxDbG9ja1RpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFdhbGxDbG9ja1RpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSgmd2FsbENsb2NrVGltZUJhc2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHdhbGxDbG9ja1RpbWVCYXNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUR2V0V2FsbENsb2NrVGltZUJhc2UoJndhbGxDbG9ja1RpbWVCYXNlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCB3YWxsQ2xvY2tUaW1lQmFzZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRJZGxlTWFuYWdlck9wZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUlkbGVNYW5hZ2VyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSWRsZU1hbmFnZXIgX3J2OwogI2lmbmRlZiBRVElkbGVNYW5hZ2VyT3BlbgotCVB5TWFjX1BSRUNIRUNLKFFUSWRsZU1hbmFnZXJPcGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVElkbGVNYW5hZ2VyT3Blbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRJZGxlTWFuYWdlck9wZW4oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRJZGxlTWFuYWdlck9wZW4oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DcmVhdGVNb3ZpZUNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIHRoZVdpbmRvdzsKLQlSZWN0IGxvY2FsUmVjdDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlVSW50MzIgb3B0aW9uczsKLQlDb250cm9sSGFuZGxlIHJldHVybmVkQ29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgdGhlV2luZG93OworICAgIFJlY3QgbG9jYWxSZWN0OworICAgIE1vdmllIHRoZU1vdmllOworICAgIFVJbnQzMiBvcHRpb25zOworICAgIENvbnRyb2xIYW5kbGUgcmV0dXJuZWRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVNb3ZpZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVNb3ZpZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZU1vdmllQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZU1vdmllQ29udHJvbCh0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldHVybmVkQ29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbG9jYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIHJldHVybmVkQ29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVNb3ZpZUNvbnRyb2wodGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2FsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXR1cm5lZENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmxvY2FsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCByZXR1cm5lZENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0Rpc3Bvc2VNYXR0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHRoZU1hdHRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgdGhlTWF0dGU7CiAjaWZuZGVmIERpc3Bvc2VNYXR0ZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VNYXR0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZU1hdHRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVNYXR0ZSkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VNYXR0ZSh0aGVNYXR0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVNYXR0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VNYXR0ZSh0aGVNYXR0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIE5ld01vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdNb3ZpZShmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllKGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFRpbWVVbnRpbE5leHRUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgZHVyYXRpb247Ci0JbG9uZyBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGR1cmF0aW9uOworICAgIGxvbmcgc2NhbGU7CiAjaWZuZGVmIFFUR2V0VGltZVVudGlsTmV4dFRhc2sKLQlQeU1hY19QUkVDSEVDSyhRVEdldFRpbWVVbnRpbE5leHRUYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFRpbWVVbnRpbE5leHRUYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRHZXRUaW1lVW50aWxOZXh0VGFzaygmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUR2V0VGltZVVudGlsTmV4dFRhc2soJmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0RGF0YUhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFIYW5kbGVyU3ViVHlwZTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnQgX3J2OworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhSGFuZGxlclN1YlR5cGU7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgR2V0RGF0YUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFIYW5kbGVyU3ViVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGF0YUhhbmRsZXIoZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhSGFuZGxlclN1YlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YUhhbmRsZXJTdWJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREYXRhSGFuZGxlcihkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFIYW5kbGVyU3ViVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Bhc3RlSGFuZGxlSW50b01vdmllKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBoOwotCU9TVHlwZSBoYW5kbGVUeXBlOwotCU1vdmllIHRoZU1vdmllOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGg7CisgICAgT1NUeXBlIGhhbmRsZVR5cGU7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgbG9uZyBmbGFnczsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB1c2VyQ29tcDsKICNpZm5kZWYgUGFzdGVIYW5kbGVJbnRvTW92aWUKLQlQeU1hY19QUkVDSEVDSyhQYXN0ZUhhbmRsZUludG9Nb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFzdGVIYW5kbGVJbnRvTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUGFzdGVIYW5kbGVJbnRvTW92aWUoaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ29tcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGFzdGVIYW5kbGVJbnRvTW92aWUoaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ29tcCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUhhbmRsZSBkYXRhUmVmOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50IGltcG9ydGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBsb25nIGZsYWdzOworICAgIENvbXBvbmVudCBpbXBvcnRlcjsKICNpZm5kZWYgR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUltcG9ydGVyRm9yRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1wb3J0ZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBpbXBvcnRlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1wb3J0ZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBpbXBvcnRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRHZXRNSU1FVHlwZUluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JY2hhciogbWltZVN0cmluZ1N0YXJ0OwotCXNob3J0IG1pbWVTdHJpbmdMZW5ndGg7Ci0JT1NUeXBlIGluZm9TZWxlY3RvcjsKLQl2b2lkICogaW5mb0RhdGFQdHI7Ci0JbG9uZyBpbmZvRGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgY2hhciogbWltZVN0cmluZ1N0YXJ0OworICAgIHNob3J0IG1pbWVTdHJpbmdMZW5ndGg7CisgICAgT1NUeXBlIGluZm9TZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb0RhdGFQdHI7CisgICAgbG9uZyBpbmZvRGF0YVNpemU7CiAjaWZuZGVmIFFUR2V0TUlNRVR5cGVJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soUVRHZXRNSU1FVHlwZUluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFFUR2V0TUlNRVR5cGVJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNoTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbWVTdHJpbmdTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbWVTdHJpbmdMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9TZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUR2V0TUlNRVR5cGVJbmZvKG1pbWVTdHJpbmdTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVN0cmluZ0xlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGFTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzaE8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW1lU3RyaW5nU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW1lU3RyaW5nTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVEdldE1JTUVUeXBlSW5mbyhtaW1lU3RyaW5nU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVTdHJpbmdMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHJhY2tUaW1lVG9NZWRpYVRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7Ci0JVGltZVZhbHVlIHZhbHVlOwotCVRyYWNrIHRoZVRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OworICAgIFRpbWVWYWx1ZSB2YWx1ZTsKKyAgICBUcmFjayB0aGVUcmFjazsKICNpZm5kZWYgVHJhY2tUaW1lVG9NZWRpYVRpbWUKLQlQeU1hY19QUkVDSEVDSyhUcmFja1RpbWVUb01lZGlhVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHJhY2tUaW1lVG9NZWRpYVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUcmFja1RpbWVUb01lZGlhVGltZSh2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUcmFjayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUcmFja1RpbWVUb01lZGlhVGltZSh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUcmFjayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3VXNlckRhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVXNlckRhdGEgdGhlVXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVXNlckRhdGEgdGhlVXNlckRhdGE7CiAjaWZuZGVmIE5ld1VzZXJEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTmV3VXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1VzZXJEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3VXNlckRhdGEoJnRoZVVzZXJEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB0aGVVc2VyRGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdVc2VyRGF0YSgmdGhlVXNlckRhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHRoZVVzZXJEYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdVc2VyRGF0YUZyb21IYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGg7Ci0JVXNlckRhdGEgdGhlVXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGg7CisgICAgVXNlckRhdGEgdGhlVXNlckRhdGE7CiAjaWZuZGVmIE5ld1VzZXJEYXRhRnJvbUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKE5ld1VzZXJEYXRhRnJvbUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3VXNlckRhdGFGcm9tSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld1VzZXJEYXRhRnJvbUhhbmRsZShoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVVzZXJEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB0aGVVc2VyRGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3VXNlckRhdGFGcm9tSGFuZGxlKGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlVXNlckRhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHRoZVVzZXJEYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DcmVhdGVNb3ZpZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZpbGVTcGVjOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCWxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7Ci0Jc2hvcnQgcmVzUmVmTnVtOwotCU1vdmllIG5ld21vdmllOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmaWxlU3BlYzsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBNb3ZpZSBuZXdtb3ZpZTsKICNpZm5kZWYgQ3JlYXRlTW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTW92aWVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVNb3ZpZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVNb3ZpZUZpbGUoJmZpbGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1vdmllRmlsZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZuZXdtb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBuZXdtb3ZpZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVNb3ZpZUZpbGUoJmZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1vdmllRmlsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdtb3ZpZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBuZXdtb3ZpZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfT3Blbk1vdmllRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZmlsZVNwZWM7Ci0Jc2hvcnQgcmVzUmVmTnVtOwotCVNJbnQ4IHBlcm1pc3Npb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZpbGVTcGVjOworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBTSW50OCBwZXJtaXNzaW9uOwogI2lmbmRlZiBPcGVuTW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT3Blbk1vdmllRmlsZSgmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPcGVuTW92aWVGaWxlKCZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2xvc2VNb3ZpZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVzUmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlc1JlZk51bTsKICNpZm5kZWYgQ2xvc2VNb3ZpZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhDbG9zZU1vdmllRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvc2VNb3ZpZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xvc2VNb3ZpZUZpbGUocmVzUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9zZU1vdmllRmlsZShyZXNSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RlbGV0ZU1vdmllRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZmlsZVNwZWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZpbGVTcGVjOwogI2lmbmRlZiBEZWxldGVNb3ZpZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhEZWxldGVNb3ZpZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERlbGV0ZU1vdmllRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZpbGVTcGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlbGV0ZU1vdmllRmlsZSgmZmlsZVNwZWMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVsZXRlTW92aWVGaWxlKCZmaWxlU3BlYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgcmVzSWQ7Ci0Jc2hvcnQgbmV3TW92aWVGbGFnczsKLQlCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIHRoZU1vdmllOworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBzaG9ydCByZXNJZDsKKyAgICBzaG9ydCBuZXdNb3ZpZUZsYWdzOworICAgIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CiAjaWZuZGVmIE5ld01vdmllRnJvbUZpbGUKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3TW92aWVGcm9tRmlsZSgmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nUHRyKTAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maGIiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSWQsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGcm9tRmlsZSgmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nUHRyKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRnJvbUhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlIYW5kbGUgaDsKLQlzaG9ydCBuZXdNb3ZpZUZsYWdzOwotCUJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgSGFuZGxlIGg7CisgICAgc2hvcnQgbmV3TW92aWVGbGFnczsKKyAgICBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbUhhbmRsZSgmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld01vdmllRnJvbUhhbmRsZSgmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdNb3ZpZUZyb21EYXRhRm9yayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBmUmVmTnVtOwotCWxvbmcgZmlsZU9mZnNldDsKLQlzaG9ydCBuZXdNb3ZpZUZsYWdzOwotCUJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgc2hvcnQgZlJlZk51bTsKKyAgICBsb25nIGZpbGVPZmZzZXQ7CisgICAgc2hvcnQgbmV3TW92aWVGbGFnczsKKyAgICBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21EYXRhRm9yawotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFGb3JrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21EYXRhRm9yayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbURhdGFGb3JrKCZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGcm9tRGF0YUZvcmsoJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tRGF0YUZvcms2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlsb25nIGZSZWZOdW07Ci0Jd2lkZSBmaWxlT2Zmc2V0OwotCXNob3J0IG5ld01vdmllRmxhZ3M7Ci0JQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBsb25nIGZSZWZOdW07CisgICAgd2lkZSBmaWxlT2Zmc2V0OworICAgIHNob3J0IG5ld01vdmllRmxhZ3M7CisgICAgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKICNpZm5kZWYgTmV3TW92aWVGcm9tRGF0YUZvcms2NAotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFGb3JrNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFGb3JrNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3TW92aWVGcm9tRGF0YUZvcms2NCgmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdNb3ZpZUZyb21EYXRhRm9yazY0KCZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRnJvbURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgbTsKLQlzaG9ydCBmbGFnczsKLQlzaG9ydCBpZDsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZHRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBtOworICAgIHNob3J0IGZsYWdzOworICAgIHNob3J0IGlkOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkdGFSZWZUeXBlOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21EYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbURhdGFSZWYoJm0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIG0sCi0JICAgICAgICAgICAgICAgICAgICAgaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmR0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGcm9tRGF0YVJlZigmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlEYXRhSGFuZGxlciBkaDsKLQl3aWRlIGZpbGVPZmZzZXQ7Ci0Jc2hvcnQgbmV3TW92aWVGbGFnczsKLQlCb29sZWFuIGRhdGFSZWZXYXNDYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIGZpbGVPZmZzZXQ7CisgICAgc2hvcnQgbmV3TW92aWVGbGFnczsKKyAgICBCb29sZWFuIGRhdGFSZWZXYXNDYXRhUmVmVHlwZTsKICNpZm5kZWYgTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldAotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQoJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQoJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlIYW5kbGUgaDsKLQlzaG9ydCBuZXdNb3ZpZUZsYWdzOwotCUJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIHRoZU1vdmllOworICAgIEhhbmRsZSBoOworICAgIHNob3J0IG5ld01vdmllRmxhZ3M7CisgICAgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIE5ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUoJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlKCZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUmVtb3ZlTW92aWVSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgcmVzSWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVzUmVmTnVtOworICAgIHNob3J0IHJlc0lkOwogI2lmbmRlZiBSZW1vdmVNb3ZpZVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTW92aWVSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTW92aWVSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVNb3ZpZVJlc291cmNlKHJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlTW92aWVSZXNvdXJjZShyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NyZWF0ZU1vdmllU3RvcmFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKLQlEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcjsKLQlNb3ZpZSBuZXdtb3ZpZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcjsKKyAgICBNb3ZpZSBuZXdtb3ZpZTsKICNpZm5kZWYgQ3JlYXRlTW92aWVTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTW92aWVTdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVNb3ZpZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlTW92aWVTdG9yYWdlKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXREYXRhSGFuZGxlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdtb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG91dERhdGFIYW5kbGVyLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgbmV3bW92aWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU1vdmllU3RvcmFnZShkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGF0YUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3bW92aWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBvdXREYXRhSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIG5ld21vdmllKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9PcGVuTW92aWVTdG9yYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIGZsYWdzOwotCURhdGFIYW5kbGVyIG91dERhdGFIYW5kbGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIGZsYWdzOworICAgIERhdGFIYW5kbGVyIG91dERhdGFIYW5kbGVyOwogI2lmbmRlZiBPcGVuTW92aWVTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllU3RvcmFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPcGVuTW92aWVTdG9yYWdlKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dERhdGFIYW5kbGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG91dERhdGFIYW5kbGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPcGVuTW92aWVTdG9yYWdlKGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERhdGFIYW5kbGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG91dERhdGFIYW5kbGVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbG9zZU1vdmllU3RvcmFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEYXRhSGFuZGxlciBkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEYXRhSGFuZGxlciBkaDsKICNpZm5kZWYgQ2xvc2VNb3ZpZVN0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhDbG9zZU1vdmllU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvc2VNb3ZpZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDbG9zZU1vdmllU3RvcmFnZShkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9zZU1vdmllU3RvcmFnZShkaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGVsZXRlTW92aWVTdG9yYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIERlbGV0ZU1vdmllU3RvcmFnZQotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1vdmllU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTW92aWVTdG9yYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlbGV0ZU1vdmllU3RvcmFnZShkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERlbGV0ZU1vdmllU3RvcmFnZShkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmaWxlU3BlYzsKLQlPU1R5cGUgY3JlYXRvcjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOwotCUhhbmRsZSB0YXJnZXREYXRhUmVmOwotCU9TVHlwZSB0YXJnZXREYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZmlsZVNwZWM7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBIYW5kbGUgdGFyZ2V0RGF0YVJlZjsKKyAgICBPU1R5cGUgdGFyZ2V0RGF0YVJlZlR5cGU7CiAjaWZuZGVmIENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU2hvcnRjdXRNb3ZpZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRhcmdldERhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRhcmdldERhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKCZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRhcmdldERhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRhcmdldERhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKCZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NhblF1aWNrVGltZU9wZW5GaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmaWxlU3BlYzsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uOwotCUJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyOwotCUJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWU7Ci0JQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmaWxlU3BlYzsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uOworICAgIEJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyOworICAgIEJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWU7CisgICAgQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyOworICAgIFVJbnQzMiBpbkZsYWdzOwogI2lmbmRlZiBDYW5RdWlja1RpbWVPcGVuRmlsZQotCVB5TWFjX1BSRUNIRUNLKENhblF1aWNrVGltZU9wZW5GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYW5RdWlja1RpbWVPcGVuRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlTmFtZUV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2FuUXVpY2tUaW1lT3BlbkZpbGUoJmZpbGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVFeHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuQXNNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENhbk9wZW5Bc01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVOYW1lRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDYW5RdWlja1RpbWVPcGVuRmlsZSgmZmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZUV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5Bc01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbkFzTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyOwotCUJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWU7Ci0JQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBCb29sZWFuIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlcjsKKyAgICBCb29sZWFuIG91dENhbk9wZW5Bc01vdmllOworICAgIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcjsKKyAgICBVSW50MzIgaW5GbGFnczsKICNpZm5kZWYgQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhDYW5RdWlja1RpbWVPcGVuRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDYW5RdWlja1RpbWVPcGVuRGF0YVJlZihkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5Bc01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbkFzTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDYW5RdWlja1RpbWVPcGVuRGF0YVJlZihkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5Bc01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbkFzTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlsb25nIG5ld01vdmllRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKKyAgICBsb25nIG5ld01vdmllRmxhZ3M7CiAjaWZuZGVmIE5ld01vdmllRnJvbVNjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbVNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld01vdmllRnJvbVNjcmFwKG5ld01vdmllRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllRnJvbVNjcmFwKG5ld01vdmllRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUTmV3QWxpYXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZzczsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlCb29sZWFuIG1pbmltYWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZzczsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBCb29sZWFuIG1pbmltYWw7CiAjaWZuZGVmIFFUTmV3QWxpYXMKLQlQeU1hY19QUkVDSEVDSyhRVE5ld0FsaWFzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVE5ld0FsaWFzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVROZXdBbGlhcygmZnNzLAotCSAgICAgICAgICAgICAgICAgICZhbGlhcywKLQkgICAgICAgICAgICAgICAgICBtaW5pbWFsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbmltYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVROZXdBbGlhcygmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICZhbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICBtaW5pbWFsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0VuZEZ1bGxTY3JlZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUHRyIGZ1bGxTdGF0ZTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFB0ciBmdWxsU3RhdGU7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgRW5kRnVsbFNjcmVlbgotCVB5TWFjX1BSRUNIRUNLKEVuZEZ1bGxTY3JlZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEVuZEZ1bGxTY3JlZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2wiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnVsbFN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW5kRnVsbFNjcmVlbihmdWxsU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVuZEZ1bGxTY3JlZW4oZnVsbFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9BZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlIYW5kbGUgZXh0ZW5zaW9uOwotCU9TVHlwZSBpZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgT1NUeXBlIGlkVHlwZTsKICNpZm5kZWYgQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCUhhbmRsZSBleHRlbnNpb247Ci0JT1NUeXBlIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgSGFuZGxlIGV4dGVuc2lvbjsKKyAgICBPU1R5cGUgaWRUeXBlOwogI2lmbmRlZiBHZXRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZXh0ZW5zaW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZXh0ZW5zaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9SZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlPU1R5cGUgaWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBPU1R5cGUgaWRUeXBlOwogI2lmbmRlZiBSZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZVNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUV2ZW50UmVjb3JkIHBFdmVudDsKLQlRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEV2ZW50UmVjb3JkIHBFdmVudDsKKyAgICBRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOwogI2lmbmRlZiBRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudAotCVB5TWFjX1BSRUNIRUNLKFFUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRJc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRXZlbnQoJnBFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZERpYWxvZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZwRXZlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpYWxvZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCgmcEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRGlhbG9nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnBFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVREaXNtaXNzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOwogI2lmbmRlZiBRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZwotCVB5TWFjX1BSRUNIRUNLKFFURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVREaXNtaXNzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2coY3JlYXRlZERpYWxvZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlhbG9nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nKGNyZWF0ZWREaWFsb2cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOwotCWxvbmcgYWN0aW9uOwotCXZvaWQgKiBwYXJhbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZzsKKyAgICBsb25nIGFjdGlvbjsKKyAgICB2b2lkICogcGFyYW1zOwogI2lmbmRlZiBRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFFUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpYWxvZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24oY3JlYXRlZERpYWxvZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0RvQWN0aW9uKGNyZWF0ZWREaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUUmVnaXN0ZXJBY2Nlc3NLZXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU3RyMjU1IGFjY2Vzc0tleVR5cGU7Ci0JbG9uZyBmbGFnczsKLQlIYW5kbGUgYWNjZXNzS2V5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjI1NSBhY2Nlc3NLZXlUeXBlOworICAgIGxvbmcgZmxhZ3M7CisgICAgSGFuZGxlIGFjY2Vzc0tleTsKICNpZm5kZWYgUVRSZWdpc3RlckFjY2Vzc0tleQotCVB5TWFjX1BSRUNIRUNLKFFUUmVnaXN0ZXJBY2Nlc3NLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUUmVnaXN0ZXJBY2Nlc3NLZXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGFjY2Vzc0tleVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhY2Nlc3NLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRSZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc0tleSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGFjY2Vzc0tleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhY2Nlc3NLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRSZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc0tleSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRVbnJlZ2lzdGVyQWNjZXNzS2V5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSBhY2Nlc3NLZXlUeXBlOwotCWxvbmcgZmxhZ3M7Ci0JSGFuZGxlIGFjY2Vzc0tleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHIyNTUgYWNjZXNzS2V5VHlwZTsKKyAgICBsb25nIGZsYWdzOworICAgIEhhbmRsZSBhY2Nlc3NLZXk7CiAjaWZuZGVmIFFUVW5yZWdpc3RlckFjY2Vzc0tleQotCVB5TWFjX1BSRUNIRUNLKFFUVW5yZWdpc3RlckFjY2Vzc0tleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRVbnJlZ2lzdGVyQWNjZXNzS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhY2Nlc3NLZXlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWNjZXNzS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUVW5yZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NLZXkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhY2Nlc3NLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWNjZXNzS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUVW5yZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NLZXkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBpblJlc3RyaWN0aW9uQ2xhc3M7Ci0JVUludDMyIG91dFJlc3RyaWN0aW9uSURzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBpblJlc3RyaWN0aW9uQ2xhc3M7CisgICAgVUludDMyIG91dFJlc3RyaWN0aW9uSURzOwogI2lmbmRlZiBRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucwotCVB5TWFjX1BSRUNIRUNLKFFUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUmVzdHJpY3Rpb25DbGFzcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyhpblJlc3RyaWN0aW9uQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN0cmljdGlvbklEcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdHJpY3Rpb25JRHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5SZXN0cmljdGlvbkNsYXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zKGluUmVzdHJpY3Rpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3RyaWN0aW9uSURzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZXN0cmljdGlvbklEcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRUZXh0VG9OYXRpdmVUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSB0aGVUZXh0OwotCWxvbmcgZW5jb2Rpbmc7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgdGhlVGV4dDsKKyAgICBsb25nIGVuY29kaW5nOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIFFUVGV4dFRvTmF0aXZlVGV4dAotCVB5TWFjX1BSRUNIRUNLKFFUVGV4dFRvTmF0aXZlVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRUZXh0VG9OYXRpdmVUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUVGV4dFRvTmF0aXZlVGV4dCh0aGVUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRUZXh0VG9OYXRpdmVUZXh0KHRoZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIFZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MKLQlQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcyhtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MKLQlQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhR2V0U3RhdGlzdGljcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZpZGVvTWVkaWFHZXRTdGF0aXN0aWNzKG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MobWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZpZGVvTWVkaWFHZXRTdGFsbENvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl1bnNpZ25lZCBsb25nIHN0YWxsczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgdW5zaWduZWQgbG9uZyBzdGFsbHM7CiAjaWZuZGVmIFZpZGVvTWVkaWFHZXRTdGFsbENvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYUdldFN0YWxsQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFZpZGVvTWVkaWFHZXRTdGFsbENvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWaWRlb01lZGlhR2V0U3RhbGxDb3VudChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhbGxzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzdGFsbHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWaWRlb01lZGlhR2V0U3RhbGxDb3VudChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhbGxzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFsbHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29kZWNUeXBlIGNUeXBlOwotCU9TVHlwZSBwYXJhbWV0ZXJJRDsKLQlsb25nIHBhcmFtZXRlckNoYW5nZVNlZWQ7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JbG9uZyBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIE9TVHlwZSBwYXJhbWV0ZXJJRDsKKyAgICBsb25nIHBhcmFtZXRlckNoYW5nZVNlZWQ7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgbG9uZyBkYXRhU2l6ZTsKICNpZm5kZWYgVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyCi0JUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbHNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJhbWV0ZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtZXRlckNoYW5nZVNlZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQ2hhbmdlU2VlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcGFyYW1ldGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbWV0ZXJDaGFuZ2VTZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckNoYW5nZVNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvZGVjVHlwZSBjVHlwZTsKLQlPU1R5cGUgcGFyYW1ldGVySUQ7Ci0JSGFuZGxlIG91dFBhcmFtZXRlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvZGVjVHlwZSBjVHlwZTsKKyAgICBPU1R5cGUgcGFyYW1ldGVySUQ7CisgICAgSGFuZGxlIG91dFBhcmFtZXRlckRhdGE7CiAjaWZuZGVmIFZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlcgotCVB5TWFjX1BSRUNIRUNLKFZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJhbWV0ZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRQYXJhbWV0ZXJEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBhcmFtZXRlckRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJhbWV0ZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRQYXJhbWV0ZXJEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBhcmFtZXRlckRhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYUFkZFRleHRTYW1wbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVB0ciB0ZXh0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlzaG9ydCBmb250TnVtYmVyOwotCXNob3J0IGZvbnRTaXplOwotCVN0eWxlIHRleHRGYWNlOwotCVJHQkNvbG9yIHRleHRDb2xvcjsKLQlSR0JDb2xvciBiYWNrQ29sb3I7Ci0Jc2hvcnQgdGV4dEp1c3RpZmljYXRpb247Ci0JUmVjdCB0ZXh0Qm94OwotCWxvbmcgZGlzcGxheUZsYWdzOwotCVRpbWVWYWx1ZSBzY3JvbGxEZWxheTsKLQlzaG9ydCBoaWxpdGVTdGFydDsKLQlzaG9ydCBoaWxpdGVFbmQ7Ci0JUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBQdHIgdGV4dDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgc2hvcnQgZm9udE51bWJlcjsKKyAgICBzaG9ydCBmb250U2l6ZTsKKyAgICBTdHlsZSB0ZXh0RmFjZTsKKyAgICBSR0JDb2xvciB0ZXh0Q29sb3I7CisgICAgUkdCQ29sb3IgYmFja0NvbG9yOworICAgIHNob3J0IHRleHRKdXN0aWZpY2F0aW9uOworICAgIFJlY3QgdGV4dEJveDsKKyAgICBsb25nIGRpc3BsYXlGbGFnczsKKyAgICBUaW1lVmFsdWUgc2Nyb2xsRGVsYXk7CisgICAgc2hvcnQgaGlsaXRlU3RhcnQ7CisgICAgc2hvcnQgaGlsaXRlRW5kOworICAgIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKICNpZm5kZWYgVGV4dE1lZGlhQWRkVGV4dFNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZFRleHRTYW1wbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZFRleHRTYW1wbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhoYmhsbGhobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9udFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RmFjZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsRGVsYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhQWRkVGV4dFNhbXBsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZhY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dENvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhY2tDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCb3gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEZWxheSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZ0ZXh0Q29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYmFja0NvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRleHRCb3gsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhoYmhsbGhobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRKdXN0aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhQWRkVGV4dFNhbXBsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhY2tDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZ0ZXh0Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYmFja0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRleHRCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhQWRkVEVTYW1wbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRFSGFuZGxlIGhURTsKLQlSR0JDb2xvciBiYWNrQ29sb3I7Ci0Jc2hvcnQgdGV4dEp1c3RpZmljYXRpb247Ci0JUmVjdCB0ZXh0Qm94OwotCWxvbmcgZGlzcGxheUZsYWdzOwotCVRpbWVWYWx1ZSBzY3JvbGxEZWxheTsKLQlzaG9ydCBoaWxpdGVTdGFydDsKLQlzaG9ydCBoaWxpdGVFbmQ7Ci0JUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBURUhhbmRsZSBoVEU7CisgICAgUkdCQ29sb3IgYmFja0NvbG9yOworICAgIHNob3J0IHRleHRKdXN0aWZpY2F0aW9uOworICAgIFJlY3QgdGV4dEJveDsKKyAgICBsb25nIGRpc3BsYXlGbGFnczsKKyAgICBUaW1lVmFsdWUgc2Nyb2xsRGVsYXk7CisgICAgc2hvcnQgaGlsaXRlU3RhcnQ7CisgICAgc2hvcnQgaGlsaXRlRW5kOworICAgIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKICNpZm5kZWYgVGV4dE1lZGlhQWRkVEVTYW1wbGUKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFBZGRURVNhbXBsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhQWRkVEVTYW1wbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsbGhobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmhURSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsRGVsYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhQWRkVEVTYW1wbGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRFLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWNrQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCb3gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbERlbGF5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmdiSGlsaXRlQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmJhY2tDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXh0Qm94LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnJnYkhpbGl0ZUNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobGxoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYUFkZFRFU2FtcGxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFja0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0Qm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZiYWNrQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGV4dEJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZyZ2JIaWxpdGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFBZGRIaWxpdGVTYW1wbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGhpbGl0ZVN0YXJ0OwotCXNob3J0IGhpbGl0ZUVuZDsKLQlSR0JDb2xvciByZ2JIaWxpdGVDb2xvcjsKLQlUaW1lVmFsdWUgZHVyYXRpb247Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGhpbGl0ZVN0YXJ0OworICAgIHNob3J0IGhpbGl0ZUVuZDsKKyAgICBSR0JDb2xvciByZ2JIaWxpdGVDb2xvcjsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CiAjaWZuZGVmIFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmdiSGlsaXRlQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZyZ2JIaWxpdGVDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhRHJhd1JhdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JR1dvcmxkUHRyIGd3OwotCUdESGFuZGxlIGdkOwotCXZvaWQgKiBkYXRhOwotCWxvbmcgZGF0YVNpemU7Ci0JVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgR1dvcmxkUHRyIGd3OworICAgIEdESGFuZGxlIGdkOworICAgIHZvaWQgKiBkYXRhOworICAgIGxvbmcgZGF0YVNpemU7CisgICAgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaDsKICNpZm5kZWYgVGV4dE1lZGlhRHJhd1JhdwotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYURyYXdSYXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYURyYXdSYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mc2xPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfQ29udmVydCwgJmd3LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYURyYXdSYXcobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICBndywKLQkgICAgICAgICAgICAgICAgICAgICAgIGdkLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgdGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZzbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhRHJhd1JhdyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYVNldFRleHRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVZhbHVlIGF0TWVkaWFUaW1lOwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBkYXRhOwotCWxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogZGF0YTsKKyAgICBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVNldFRleHRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhU2V0VGV4dFByb3BlcnR5KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdE1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYVNldFRleHRQcm9wZXJ0eShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRNZWRpYVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYVJhd1NldHVwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlHV29ybGRQdHIgZ3c7Ci0JR0RIYW5kbGUgZ2Q7Ci0Jdm9pZCAqIGRhdGE7Ci0JbG9uZyBkYXRhU2l6ZTsKLQlUZXh0RGVzY3JpcHRpb25IYW5kbGUgdGRoOwotCVRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgR1dvcmxkUHRyIGd3OworICAgIEdESGFuZGxlIGdkOworICAgIHZvaWQgKiBkYXRhOworICAgIGxvbmcgZGF0YVNpemU7CisgICAgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaDsKKyAgICBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb247CiAjaWZuZGVmIFRleHRNZWRpYVJhd1NldHVwCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhUmF3U2V0dXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVJhd1NldHVwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJnNsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0TWVkaWFSYXdTZXR1cChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBndywKLQkgICAgICAgICAgICAgICAgICAgICAgICBnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mc2xPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYVJhd1NldHVwKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFSYXdJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlHV29ybGRQdHIgZ3c7Ci0JR0RIYW5kbGUgZ2Q7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0JbG9uZyBmbGFnc0luOwotCWxvbmcgZmxhZ3NPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEdXb3JsZFB0ciBndzsKKyAgICBHREhhbmRsZSBnZDsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKKyAgICBsb25nIGZsYWdzSW47CisgICAgbG9uZyBmbGFnc091dDsKICNpZm5kZWYgVGV4dE1lZGlhUmF3SWRsZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVJhd0lkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVJhd0lkbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZndywKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc0luKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhUmF3SWRsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGd3LAotCSAgICAgICAgICAgICAgICAgICAgICAgZ2QsCi0JICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3NPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NJbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYVJhd0lkbGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzT3V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKLQlsb25nIHByb3BlcnR5VHlwZTsKLQl2b2lkICogZGF0YTsKLQlsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgYXRNZWRpYVRpbWU7CisgICAgbG9uZyBwcm9wZXJ0eVR5cGU7CisgICAgdm9pZCAqIGRhdGE7CisgICAgbG9uZyBkYXRhU2l6ZTsKICNpZm5kZWYgVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYUdldFRleHRQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRNZWRpYVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXRNZWRpYVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFGaW5kTmV4dFRleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVB0ciB0ZXh0OwotCWxvbmcgc2l6ZTsKLQlzaG9ydCBmaW5kRmxhZ3M7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZm91bmRUaW1lOwotCVRpbWVWYWx1ZSBmb3VuZER1cmF0aW9uOwotCWxvbmcgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBQdHIgdGV4dDsKKyAgICBsb25nIHNpemU7CisgICAgc2hvcnQgZmluZEZsYWdzOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGZvdW5kVGltZTsKKyAgICBUaW1lVmFsdWUgZm91bmREdXJhdGlvbjsKKyAgICBsb25nIG9mZnNldDsKICNpZm5kZWYgVGV4dE1lZGlhRmluZE5leHRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhRmluZE5leHRUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFGaW5kTmV4dFRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpbmRGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYUZpbmROZXh0VGV4dChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBmb3VuZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYUZpbmROZXh0VGV4dChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0Jc2hvcnQgaGlsaXRlU3RhcnQ7Ci0Jc2hvcnQgaGlsaXRlRW5kOwotCVJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKKyAgICBzaG9ydCBoaWxpdGVTdGFydDsKKyAgICBzaG9ydCBoaWxpdGVFbmQ7CisgICAgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7CiAjaWZuZGVmIFRleHRNZWRpYUhpbGl0ZVRleHRTYW1wbGUKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYVNldFRleHRTYW1wbGVEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogZGF0YTsKLQlPU1R5cGUgZGF0YVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHZvaWQgKiBkYXRhOworICAgIE9TVHlwZSBkYXRhVHlwZTsKICNpZm5kZWYgVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFTZXRUZXh0U2FtcGxlRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgc3ByaXRlSW5kZXg7Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIHByb3BlcnR5VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IHNwcml0ZUluZGV4OworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBwcm9wZXJ0eVZhbHVlOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNldFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZobHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU2V0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0UHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHNwcml0ZUluZGV4OwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBwcm9wZXJ0eVZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBzcHJpdGVJbmRleDsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogcHJvcGVydHlWYWx1ZTsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0UHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0UHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZobHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0UHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldFByb3BlcnR5KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOwotCVBvaW50IGxvYzsKLQlzaG9ydCBzcHJpdGVIaXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKKyAgICBQb2ludCBsb2M7CisgICAgc2hvcnQgc3ByaXRlSGl0SW5kZXg7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSGl0SW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUhpdEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUhpdEluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVIaXRJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IG51bVNwcml0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IG51bVNwcml0ZXM7CiAjaWZuZGVmIFNwcml0ZU1lZGlhQ291bnRTcHJpdGVzCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhQ291bnRTcHJpdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUNvdW50U3ByaXRlcyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtU3ByaXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtU3ByaXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhQ291bnRTcHJpdGVzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1TcHJpdGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1TcHJpdGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUNvdW50SW1hZ2VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBudW1JbWFnZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IG51bUltYWdlczsKICNpZm5kZWYgU3ByaXRlTWVkaWFDb3VudEltYWdlcwotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhQ291bnRJbWFnZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhQ291bnRJbWFnZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhQ291bnRJbWFnZXMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtSW1hZ2VzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBudW1JbWFnZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUNvdW50SW1hZ2VzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUltYWdlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtSW1hZ2VzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGltYWdlSW5kZXg7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBpbWFnZURlc2NyaXB0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaW1hZ2VEZXNjcmlwdGlvbjsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VEZXNjcmlwdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VEZXNjcmlwdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VEZXNjcmlwdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VEZXNjcmlwdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgc2FtcGxlTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHNhbXBsZU51bTsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldERpc3BsYXllZFNhbXBsZU51bWJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKLQlTdHIyNTUgc3ByaXRlTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CisgICAgU3RyMjU1IHNwcml0ZU5hbWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzcHJpdGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlTmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHNwcml0ZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVOYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUdldEltYWdlTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgaW1hZ2VJbmRleDsKLQlTdHIyNTUgaW1hZ2VOYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OworICAgIFN0cjI1NSBpbWFnZU5hbWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGltYWdlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VOYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpbWFnZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldEltYWdlTmFtZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRBdG9tSUQgc3ByaXRlSUQ7Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIHByb3BlcnR5VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHNwcml0ZUlEOworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBwcm9wZXJ0eVZhbHVlOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHNwcml0ZUlEOwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBwcm9wZXJ0eVZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogcHJvcGVydHlWYWx1ZTsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOwotCVBvaW50IGxvYzsKLQlRVEF0b21JRCBzcHJpdGVIaXRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKKyAgICBQb2ludCBsb2M7CisgICAgUVRBdG9tSUQgc3ByaXRlSGl0SUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSGl0SUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUhpdElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUhpdElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVIaXRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKLQlsb25nIGZsYWdzOwotCVBvaW50IGxvYzsKLQlCb29sZWFuIHdhc0hpdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CisgICAgbG9uZyBmbGFnczsKKyAgICBQb2ludCBsb2M7CisgICAgQm9vbGVhbiB3YXNIaXQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzSGl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNIaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzSGl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNIaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBzcHJpdGVJbmRleDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgc3ByaXRlSW5kZXg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lECi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHNwcml0ZUlEOwotCXNob3J0IHNwcml0ZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBzaG9ydCBzcHJpdGVJbmRleDsKICNpZm5kZWYgU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCB2YXJpYWJsZUlEOwotCWZsb2F0IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCB2YXJpYWJsZUlEOworICAgIGZsb2F0IHZhbHVlOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHZhcmlhYmxlSUQ7Ci0JZmxvYXQgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHZhcmlhYmxlSUQ7CisgICAgZmxvYXQgdmFsdWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHNwcml0ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBzcHJpdGVJRDsKICNpZm5kZWYgU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhRGlzcG9zZVNwcml0ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHZhcmlhYmxlSUQ7Ci0JUHRyIHRoZUNTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHZhcmlhYmxlSUQ7CisgICAgUHRyIHRoZUNTdHJpbmc7CiAjaWZuZGVmIFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZwotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVDU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVDU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ1N0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ1N0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCB2YXJpYWJsZUlEOwotCUhhbmRsZSB0aGVDU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCB2YXJpYWJsZUlEOworICAgIEhhbmRsZSB0aGVDU3RyaW5nOwogI2lmbmRlZiBTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGVBc1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlQ1N0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ1N0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhTmV3SW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlRVEF0b21JRCBkZXNpcmVkSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBRVEF0b21JRCBkZXNpcmVkSUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhTmV3SW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYU5ld0ltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYU5ld0ltYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlc2lyZWRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhTmV3SW1hZ2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2lyZWRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhTmV3SW1hZ2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhRGlzcG9zZUltYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBpbWFnZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OwogI2lmbmRlZiBTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhRGlzcG9zZUltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUltYWdlSW5kZXhUb0lEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBpbWFnZUluZGV4OwotCVFUQXRvbUlEIGltYWdlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGltYWdlSW5kZXg7CisgICAgUVRBdG9tSUQgaW1hZ2VJRDsKICNpZm5kZWYgU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRAotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFJbWFnZUlEVG9JbmRleChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRBdG9tSUQgaW1hZ2VJRDsKLQlzaG9ydCBpbWFnZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBpbWFnZUlEOworICAgIHNob3J0IGltYWdlSW5kZXg7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFTZXRQYW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHhQZXJjZW50OwotCXNob3J0IHlQZXJjZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCB4UGVyY2VudDsKKyAgICBzaG9ydCB5UGVyY2VudDsKICNpZm5kZWYgRmxhc2hNZWRpYVNldFBhbgotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRQYW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRQYW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmeFBlcmNlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ5UGVyY2VudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFTZXRQYW4obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICB4UGVyY2VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHlQZXJjZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4UGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnlQZXJjZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYVNldFBhbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhQZXJjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeVBlcmNlbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFTZXRab29tKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBmYWN0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGZhY3RvcjsKICNpZm5kZWYgRmxhc2hNZWRpYVNldFpvb20KLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhU2V0Wm9vbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldFpvb20pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYWN0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhU2V0Wm9vbShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYVNldFpvb20obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhU2V0Wm9vbVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgbGVmdDsKLQlsb25nIHRvcDsKLQlsb25nIHJpZ2h0OwotCWxvbmcgYm90dG9tOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGxlZnQ7CisgICAgbG9uZyB0b3A7CisgICAgbG9uZyByaWdodDsKKyAgICBsb25nIGJvdHRvbTsKICNpZm5kZWYgRmxhc2hNZWRpYVNldFpvb21SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldFpvb21SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhU2V0Wm9vbVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhU2V0Wm9vbVJlY3QobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGFzaE1lZGlhU2V0Wm9vbVJlY3QobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb247Ci0JbG9uZyBsZWZ0OwotCWxvbmcgdG9wOwotCWxvbmcgcmlnaHQ7Ci0JbG9uZyBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgcmVmQ29uOworICAgIGxvbmcgbGVmdDsKKyAgICBsb25nIHRvcDsKKyAgICBsb25nIHJpZ2h0OworICAgIGxvbmcgYm90dG9tOwogI2lmbmRlZiBGbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgICAgICAgICByaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICBib3R0b20pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldFJlZkNvbklEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHJlZkNvbjsKLQlsb25nIHJlZkNvbklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHJlZkNvbjsKKyAgICBsb25nIHJlZkNvbklEOwogI2lmbmRlZiBGbGFzaE1lZGlhR2V0UmVmQ29uSUQKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0UmVmQ29uSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFHZXRSZWZDb25JRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXRSZWZDb25JRChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFHZXRSZWZDb25JRChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhSURUb1JlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb25JRDsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyByZWZDb25JRDsKKyAgICBsb25nIHJlZkNvbjsKICNpZm5kZWYgRmxhc2hNZWRpYUlEVG9SZWZDb24KLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhSURUb1JlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUlEVG9SZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFJRFRvUmVmQ29uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFJRFRvUmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYXNoRnJhbWVOdW1iZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhc2hGcmFtZU51bWJlcjsKICNpZm5kZWYgRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlcihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXNoRnJhbWVOdW1iZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYXNoRnJhbWVOdW1iZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFzaEZyYW1lTnVtYmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFzaEZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmbGFzaEZyYW1lTnVtYmVyOwotCVRpbWVWYWx1ZSBtb3ZpZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhc2hGcmFtZU51bWJlcjsKKyAgICBUaW1lVmFsdWUgbW92aWVUaW1lOwogI2lmbmRlZiBGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZQotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFGcmFtZU51bWJlclRvTW92aWVUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXNoRnJhbWVOdW1iZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFzaEZyYW1lTnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFzaEZyYW1lTnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYUZyYW1lTnVtYmVyVG9Nb3ZpZVRpbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVB0ciB0aGVMYWJlbDsKLQlUaW1lVmFsdWUgbW92aWVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBQdHIgdGhlTGFiZWw7CisgICAgVGltZVZhbHVlIG1vdmllVGltZTsKICNpZm5kZWYgRmxhc2hNZWRpYUZyYW1lTGFiZWxUb01vdmllVGltZQotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWNoYXIgcGF0aDsKLQljaGFyIG5hbWU7Ci0JSGFuZGxlIHRoZVZhcmlhYmxlQ1N0cmluZ091dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBwYXRoOworICAgIGNoYXIgbmFtZTsKKyAgICBIYW5kbGUgdGhlVmFyaWFibGVDU3RyaW5nT3V0OwogI2lmbmRlZiBGbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZQotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVZhcmlhYmxlQ1N0cmluZ091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjY08mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVZhcmlhYmxlQ1N0cmluZ091dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVWYXJpYWJsZUNTdHJpbmdPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2NPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVWYXJpYWJsZUNTdHJpbmdPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQljaGFyIHBhdGg7Ci0JY2hhciBuYW1lOwotCWNoYXIgdmFsdWU7Ci0JQm9vbGVhbiB1cGRhdGVGb2N1czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBwYXRoOworICAgIGNoYXIgbmFtZTsKKyAgICBjaGFyIHZhbHVlOworICAgIEJvb2xlYW4gdXBkYXRlRm9jdXM7CiAjaWZuZGVmIEZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldEZsYXNoVmFyaWFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXBkYXRlRm9jdXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRm9jdXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2NjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwZGF0ZUZvY3VzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYVNldEZsYXNoVmFyaWFibGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZvY3VzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNjYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JY2hhciBwYXRoOwotCWxvbmcgYnV0dG9uSUQ7Ci0JbG9uZyB0cmFuc2l0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBjaGFyIHBhdGg7CisgICAgbG9uZyBidXR0b25JRDsKKyAgICBsb25nIHRyYW5zaXRpb247CiAjaWZuZGVmIEZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1dHRvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNpdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnV0dG9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2l0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVUludDggc3dmVmVyc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVUludDggc3dmVmVyc2lvbjsKICNpZm5kZWYgRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24KLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzd2ZWZXJzaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzd2ZWZXJzaW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN3ZlZlcnNpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN3ZlZlcnNpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RHZXRDdXJyZW50R3JvdXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXZvaWQgKiBncm91cDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgdm9pZCAqIGdyb3VwOwogI2lmbmRlZiBNZWRpYTNER2V0Q3VycmVudEdyb3VwCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldEN1cnJlbnRHcm91cCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldEN1cnJlbnRHcm91cCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzREdldEN1cnJlbnRHcm91cChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzREdldEN1cnJlbnRHcm91cChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JY2hhciBvYmplY3ROYW1lOwotCUZpeGVkIHg7Ci0JRml4ZWQgeTsKLQlGaXhlZCB6OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBjaGFyIG9iamVjdE5hbWU7CisgICAgRml4ZWQgeDsKKyAgICBGaXhlZCB5OworICAgIEZpeGVkIHo7CiAjaWZuZGVmIE1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFRyYW5zbGF0ZU5hbWVkT2JqZWN0VG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnopKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQljaGFyIG9iamVjdE5hbWU7Ci0JRml4ZWQgeFNjYWxlOwotCUZpeGVkIHlTY2FsZTsKLQlGaXhlZCB6U2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGNoYXIgb2JqZWN0TmFtZTsKKyAgICBGaXhlZCB4U2NhbGU7CisgICAgRml4ZWQgeVNjYWxlOworICAgIEZpeGVkIHpTY2FsZTsKICNpZm5kZWYgTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ4U2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeVNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnpTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTY2FsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlTY2FsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpTY2FsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ4U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeVNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnpTY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpTY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWNoYXIgb2JqZWN0TmFtZTsKLQlGaXhlZCB4RGVncmVlczsKLQlGaXhlZCB5RGVncmVlczsKLQlGaXhlZCB6RGVncmVlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBvYmplY3ROYW1lOworICAgIEZpeGVkIHhEZWdyZWVzOworICAgIEZpeGVkIHlEZWdyZWVzOworICAgIEZpeGVkIHpEZWdyZWVzOwogI2lmbmRlZiBNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnhEZWdyZWVzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnlEZWdyZWVzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnpEZWdyZWVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iamVjdE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeERlZ3JlZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeURlZ3JlZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekRlZ3JlZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYyIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeERlZ3JlZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeURlZ3JlZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmekRlZ3JlZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4RGVncmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5RGVncmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6RGVncmVlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFNldENhbWVyYURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXZvaWQgKiBjYW1lcmFEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogY2FtZXJhRGF0YTsKICNpZm5kZWYgTWVkaWEzRFNldENhbWVyYURhdGEKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNEU2V0Q2FtZXJhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFNldENhbWVyYURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzRFNldENhbWVyYURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzRFNldENhbWVyYURhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzREdldENhbWVyYURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXZvaWQgKiBjYW1lcmFEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogY2FtZXJhRGF0YTsKICNpZm5kZWYgTWVkaWEzREdldENhbWVyYURhdGEKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNER2V0Q2FtZXJhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldENhbWVyYURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzREdldENhbWVyYURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzREdldENhbWVyYURhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEZsb2F0U2luZ2xlIGZvdjsKLQlRVEZsb2F0U2luZ2xlIGFzcGVjdFJhdGlvWFRvWTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRGbG9hdFNpbmdsZSBmb3Y7CisgICAgUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1k7CiAjaWZuZGVmIE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvdiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFzcGVjdFJhdGlvWFRvWSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm92LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpb1hUb1kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzcGVjdFJhdGlvWFRvWSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpb1hUb1kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRGbG9hdFNpbmdsZSBmb3Y7Ci0JUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFURmxvYXRTaW5nbGUgZm92OworICAgIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZOwogI2lmbmRlZiBNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm92LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXNwZWN0UmF0aW9YVG9ZKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGZmIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZm92LAotCSAgICAgICAgICAgICAgICAgICAgIGFzcGVjdFJhdGlvWFRvWSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzcGVjdFJhdGlvWFRvWSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpb1hUb1kpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RTZXRDYW1lcmFSYW5nZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jdm9pZCAqIHRRM0NhbWVyYVJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogdFEzQ2FtZXJhUmFuZ2U7CiAjaWZuZGVmIE1lZGlhM0RTZXRDYW1lcmFSYW5nZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTZXRDYW1lcmFSYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFNldENhbWVyYVJhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdFEzQ2FtZXJhUmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYTNEU2V0Q2FtZXJhUmFuZ2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRRM0NhbWVyYVJhbmdlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRRM0NhbWVyYVJhbmdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzRFNldENhbWVyYVJhbmdlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UTNDYW1lcmFSYW5nZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzREdldENhbWVyYVJhbmdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogdFEzQ2FtZXJhUmFuZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHZvaWQgKiB0UTNDYW1lcmFSYW5nZTsKICNpZm5kZWYgTWVkaWEzREdldENhbWVyYVJhbmdlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldENhbWVyYVJhbmdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYTNER2V0Q2FtZXJhUmFuZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0UTNDYW1lcmFSYW5nZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RHZXRDYW1lcmFSYW5nZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFEzQ2FtZXJhUmFuZ2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdFEzQ2FtZXJhUmFuZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYTNER2V0Q2FtZXJhUmFuZ2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRRM0NhbWVyYVJhbmdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZUJhc2UgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSBfcnY7CiAjaWZuZGVmIE5ld1RpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soTmV3VGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1RpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdUaW1lQmFzZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdUaW1lQmFzZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbnZlcnRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lUmVjb3JkIHRoZVRpbWU7Ci0JVGltZUJhc2UgbmV3QmFzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB0aGVUaW1lOworICAgIFRpbWVCYXNlIG5ld0Jhc2U7CiAjaWZuZGVmIENvbnZlcnRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ29udmVydFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbnZlcnRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRoZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZuZXdCYXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29udmVydFRpbWUoJnRoZVRpbWUsCi0JICAgICAgICAgICAgbmV3QmFzZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdGhlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmdGhlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJm5ld0Jhc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb252ZXJ0VGltZSgmdGhlVGltZSwKKyAgICAgICAgICAgICAgICBuZXdCYXNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0aGVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db252ZXJ0VGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lUmVjb3JkIHRoZVRpbWU7Ci0JVGltZVNjYWxlIG5ld1NjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIHRoZVRpbWU7CisgICAgVGltZVNjYWxlIG5ld1NjYWxlOwogI2lmbmRlZiBDb252ZXJ0VGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ29udmVydFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29udmVydFRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRoZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCUNvbnZlcnRUaW1lU2NhbGUoJnRoZVRpbWUsCi0JICAgICAgICAgICAgICAgICBuZXdTY2FsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdGhlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0aGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb252ZXJ0VGltZVNjYWxlKCZ0aGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgbmV3U2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJnRoZVRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0FkZFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgZHN0OwotCVRpbWVSZWNvcmQgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIGRzdDsKKyAgICBUaW1lUmVjb3JkIHNyYzsKICNpZm5kZWYgQWRkVGltZQotCVB5TWFjX1BSRUNIRUNLKEFkZFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmZHN0LAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNyYykpCi0JCXJldHVybiBOVUxMOwotCUFkZFRpbWUoJmRzdCwKLQkgICAgICAgICZzcmMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNyYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFkZFRpbWUoJmRzdCwKKyAgICAgICAgJnNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TdWJ0cmFjdFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgZHN0OwotCVRpbWVSZWNvcmQgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIGRzdDsKKyAgICBUaW1lUmVjb3JkIHNyYzsKICNpZm5kZWYgU3VidHJhY3RUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU3VidHJhY3RUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTdWJ0cmFjdFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmZHN0LAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNyYykpCi0JCXJldHVybiBOVUxMOwotCVN1YnRyYWN0VGltZSgmZHN0LAotCSAgICAgICAgICAgICAmc3JjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTdWJ0cmFjdFRpbWUoJmRzdCwKKyAgICAgICAgICAgICAgICAgJnNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdGk7Ci0JbG9uZyBzYW1wbGVEZXNjSW5kZXg7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdGk7CisgICAgbG9uZyBzYW1wbGVEZXNjSW5kZXg7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdHA7CiAjaWZuZGVmIE11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllcgotCVB5TWFjX1BSRUNIRUNLKE11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY0luZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyKHRpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCB0cCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEZXNjSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIodGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIHRwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db2RlY01hbmFnZXJWZXJzaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgdmVyc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIHZlcnNpb247CiAjaWZuZGVmIENvZGVjTWFuYWdlclZlcnNpb24KLQlQeU1hY19QUkVDSEVDSyhDb2RlY01hbmFnZXJWZXJzaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb2RlY01hbmFnZXJWZXJzaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29kZWNNYW5hZ2VyVmVyc2lvbigmdmVyc2lvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb2RlY01hbmFnZXJWZXJzaW9uKCZ2ZXJzaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRNYXhDb21wcmVzc2lvblNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHNyYzsKLQlSZWN0IHNyY1JlY3Q7Ci0Jc2hvcnQgY29sb3JEZXB0aDsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7Ci0JQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYzsKLQlsb25nIHNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgc2hvcnQgY29sb3JEZXB0aDsKKyAgICBDb2RlY1EgcXVhbGl0eTsKKyAgICBDb2RlY1R5cGUgY1R5cGU7CisgICAgQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYzsKKyAgICBsb25nIHNpemU7CiAjaWZuZGVmIEdldE1heENvbXByZXNzaW9uU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1heENvbXByZXNzaW9uU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWF4Q29tcHJlc3Npb25TaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xvckRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWF4Q29tcHJlc3Npb25TaXplKHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvckRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWF4Q29tcHJlc3Npb25TaXplKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldENvbXByZXNzaW9uVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlzaG9ydCBjb2xvckRlcHRoOwotCUNvZGVjVHlwZSBjVHlwZTsKLQlDb21wcmVzc29yQ29tcG9uZW50IGNvZGVjOwotCUNvZGVjUSBzcGF0aWFsUXVhbGl0eTsKLQlDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OwotCXVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIHNob3J0IGNvbG9yRGVwdGg7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIENvbXByZXNzb3JDb21wb25lbnQgY29kZWM7CisgICAgQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHk7CisgICAgdW5zaWduZWQgbG9uZyBjb21wcmVzc1RpbWU7CiAjaWZuZGVmIEdldENvbXByZXNzaW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbXByZXNzaW9uVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcHJlc3Npb25UaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNvZGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXByZXNzaW9uVGltZShzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1RpbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcHJlc3Npb25UaW1lKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzVGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wcmVzc0ltYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0JUmVjdCBzcmNSZWN0OwotCUNvZGVjUSBxdWFsaXR5OwotCUNvZGVjVHlwZSBjVHlwZTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JUHRyIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgQ29kZWNRIHF1YWxpdHk7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQdHIgZGF0YTsKICNpZm5kZWYgQ29tcHJlc3NJbWFnZQotCVB5TWFjX1BSRUNIRUNLKENvbXByZXNzSW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXByZXNzSW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvbXByZXNzSW1hZ2Uoc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8mTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29tcHJlc3NJbWFnZShzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RlY29tcHJlc3NJbWFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQdHIgZGF0YTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JUGl4TWFwSGFuZGxlIGRzdDsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OwotCXNob3J0IG1vZGU7Ci0JUmduSGFuZGxlIG1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUHRyIGRhdGE7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFBpeE1hcEhhbmRsZSBkc3Q7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrOwogI2lmbmRlZiBEZWNvbXByZXNzSW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhEZWNvbXByZXNzSW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKERlY29tcHJlc3NJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzTyZPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZtYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlY29tcHJlc3NJbWFnZShkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgbWFzayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic08mTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWNvbXByZXNzSW1hZ2UoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldFNpbWlsYXJpdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHNyYzsKLQlSZWN0IHNyY1JlY3Q7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCVB0ciBkYXRhOwotCUZpeGVkIHNpbWlsYXJpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB0ciBkYXRhOworICAgIEZpeGVkIHNpbWlsYXJpdHk7CiAjaWZuZGVmIEdldFNpbWlsYXJpdHkKLQlQeU1hY19QUkVDSEVDSyhHZXRTaW1pbGFyaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRTaW1pbGFyaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2ltaWxhcml0eShzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICZzaW1pbGFyaXR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgc2ltaWxhcml0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTaW1pbGFyaXR5KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNpbWlsYXJpdHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzaW1pbGFyaXR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlDVGFiSGFuZGxlIGN0YWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgQ1RhYkhhbmRsZSBjdGFibGU7CiAjaWZuZGVmIEdldEltYWdlRGVzY3JpcHRpb25DVGFibGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEltYWdlRGVzY3JpcHRpb25DVGFibGUoZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3RhYmxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY3RhYmxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0YWJsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGN0YWJsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JQ1RhYkhhbmRsZSBjdGFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIENUYWJIYW5kbGUgY3RhYmxlOwogI2lmbmRlZiBTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYmxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYmxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlIYW5kbGUgZXh0ZW5zaW9uOwotCWxvbmcgaWRUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgbG9uZyBpZFR5cGU7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgR2V0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JSGFuZGxlIGV4dGVuc2lvbjsKLQlsb25nIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgSGFuZGxlIGV4dGVuc2lvbjsKKyAgICBsb25nIGlkVHlwZTsKICNpZm5kZWYgQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1JlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCWxvbmcgaWRUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIGxvbmcgaWRUeXBlOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIFJlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ291bnRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JbG9uZyBpZFR5cGU7Ci0JbG9uZyBjb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgbG9uZyBpZFR5cGU7CisgICAgbG9uZyBjb3VudDsKICNpZm5kZWYgQ291bnRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZQotCVB5TWFjX1BSRUNIRUNLKENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBjb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlsb25nIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgbG9uZyBpZFR5cGU7CiAjaWZuZGVmIEdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZShkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmluZENvZGVjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvZGVjVHlwZSBjVHlwZTsKLQlDb2RlY0NvbXBvbmVudCBzcGVjQ29kZWM7Ci0JQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yOwotCURlY29tcHJlc3NvckNvbXBvbmVudCBkZWNvbXByZXNzb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIENvZGVjQ29tcG9uZW50IHNwZWNDb2RlYzsKKyAgICBDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3I7CisgICAgRGVjb21wcmVzc29yQ29tcG9uZW50IGRlY29tcHJlc3NvcjsKICNpZm5kZWYgRmluZENvZGVjCi0JUHlNYWNfUFJFQ0hFQ0soRmluZENvZGVjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaW5kQ29kZWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJnNwZWNDb2RlYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGaW5kQ29kZWMoY1R5cGUsCi0JICAgICAgICAgICAgICAgICBzcGVjQ29kZWMsCi0JICAgICAgICAgICAgICAgICAmY29tcHJlc3NvciwKLQkgICAgICAgICAgICAgICAgICZkZWNvbXByZXNzb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIGNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgZGVjb21wcmVzc29yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmc3BlY0NvZGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZpbmRDb2RlYyhjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHNwZWNDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgJmRlY29tcHJlc3Nvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBkZWNvbXByZXNzb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXByZXNzUGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaWNIYW5kbGUgc3JjUGljdHVyZTsKLQlQaWNIYW5kbGUgZHN0UGljdHVyZTsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGljSGFuZGxlIHNyY1BpY3R1cmU7CisgICAgUGljSGFuZGxlIGRzdFBpY3R1cmU7CisgICAgQ29kZWNRIHF1YWxpdHk7CisgICAgQ29kZWNUeXBlIGNUeXBlOwogI2lmbmRlZiBDb21wcmVzc1BpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhDb21wcmVzc1BpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXByZXNzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBpY3R1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb21wcmVzc1BpY3R1cmUoc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRzdFBpY3R1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbXByZXNzUGljdHVyZShzcmNQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcHJlc3NQaWN0dXJlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBzcmNSZWZOdW07Ci0Jc2hvcnQgZHN0UmVmTnVtOwotCUNvZGVjUSBxdWFsaXR5OwotCUNvZGVjVHlwZSBjVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBzcmNSZWZOdW07CisgICAgc2hvcnQgZHN0UmVmTnVtOworICAgIENvZGVjUSBxdWFsaXR5OworICAgIENvZGVjVHlwZSBjVHlwZTsKICNpZm5kZWYgQ29tcHJlc3NQaWN0dXJlRmlsZQotCVB5TWFjX1BSRUNIRUNLKENvbXByZXNzUGljdHVyZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXByZXNzUGljdHVyZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29tcHJlc3NQaWN0dXJlRmlsZShzcmNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbXByZXNzUGljdHVyZUZpbGUoc3JjUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db252ZXJ0SW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNERDsKLQlQdHIgc3JjRGF0YTsKLQlzaG9ydCBjb2xvckRlcHRoOwotCUNUYWJIYW5kbGUgY3RhYmxlOwotCUNvZGVjUSBhY2N1cmFjeTsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7Ci0JQ29kZWNDb21wb25lbnQgY29kZWM7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3RERDsKLQlQdHIgZHN0RGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0REOworICAgIFB0ciBzcmNEYXRhOworICAgIHNob3J0IGNvbG9yRGVwdGg7CisgICAgQ1RhYkhhbmRsZSBjdGFibGU7CisgICAgQ29kZWNRIGFjY3VyYWN5OworICAgIENvZGVjUSBxdWFsaXR5OworICAgIENvZGVjVHlwZSBjVHlwZTsKKyAgICBDb2RlY0NvbXBvbmVudCBjb2RlYzsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRzdEREOworICAgIFB0ciBkc3REYXRhOwogI2lmbmRlZiBDb252ZXJ0SW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhDb252ZXJ0SW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbnZlcnRJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNoTyZsbE8mTyZPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY0RELAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY3RhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWNjdXJhY3ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb2RlYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RERCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29udmVydEltYWdlKHNyY0RELAotCSAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICBjdGFibGUsCi0JICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSwKLQkgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgIGNvZGVjLAotCSAgICAgICAgICAgICAgICAgICAgZHN0REQsCi0JICAgICAgICAgICAgICAgICAgICBkc3REYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNoTyZsbE8mTyZPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY0RELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjdXJhY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RERCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29udmVydEltYWdlKHNyY0RELAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0REQsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9BZGRGaWxlUHJldmlldyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZXNSZWZOdW07Ci0JT1NUeXBlIHByZXZpZXdUeXBlOwotCUhhbmRsZSBwcmV2aWV3RGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgT1NUeXBlIHByZXZpZXdUeXBlOworICAgIEhhbmRsZSBwcmV2aWV3RGF0YTsKICNpZm5kZWYgQWRkRmlsZVByZXZpZXcKLQlQeU1hY19QUkVDSEVDSyhBZGRGaWxlUHJldmlldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkRmlsZVByZXZpZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcmV2aWV3VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcmV2aWV3RGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRGaWxlUHJldmlldyhyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcmV2aWV3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcmV2aWV3RGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRGaWxlUHJldmlldyhyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0QmVzdERldmljZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JR0RIYW5kbGUgZ2RoOwotCVJlY3QgcnA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIFJlY3QgcnA7CiAjaWZuZGVmIEdldEJlc3REZXZpY2VSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0QmVzdERldmljZVJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEJlc3REZXZpY2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0QmVzdERldmljZVJlY3QoJmdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnJwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcnApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QmVzdERldmljZVJlY3QoJmdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcnApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dESGFzU2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JR0RIYW5kbGUgZ2RoOwotCXNob3J0IGRlcHRoOwotCUZpeGVkIHNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEdESGFuZGxlIGdkaDsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBGaXhlZCBzY2FsZTsKICNpZm5kZWYgR0RIYXNTY2FsZQotCVB5TWFjX1BSRUNIRUNLKEdESGFzU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdESGFzU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHREhhc1NjYWxlKGdkaCwKLQkgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAmc2NhbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzY2FsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHREhhc1NjYWxlKGdkaCwKKyAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzY2FsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR0RHZXRTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlHREhhbmRsZSBnZGg7Ci0JRml4ZWQgc2NhbGU7Ci0Jc2hvcnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIEZpeGVkIHNjYWxlOworICAgIHNob3J0IGZsYWdzOwogI2lmbmRlZiBHREdldFNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soR0RHZXRTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR0RHZXRTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdER2V0U2NhbGUoZ2RoLAotCSAgICAgICAgICAgICAgICAgICZzY2FsZSwKLQkgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgc2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR0RHZXRTY2FsZShnZGgsCisgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR0RTZXRTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlHREhhbmRsZSBnZGg7Ci0JRml4ZWQgc2NhbGU7Ci0Jc2hvcnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIEZpeGVkIHNjYWxlOworICAgIHNob3J0IGZsYWdzOwogI2lmbmRlZiBHRFNldFNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soR0RTZXRTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR0RTZXRTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR0RTZXRTY2FsZShnZGgsCi0JICAgICAgICAgICAgICAgICAgc2NhbGUsCi0JICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHRFNldFNjYWxlKGdkaCwKKyAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JQ29tcG9uZW50SW5zdGFuY2UgZ2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgZ2k7CiAjaWZuZGVmIEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSgmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGdpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUoJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUNvbXBvbmVudEluc3RhbmNlIGdpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBnaTsKICNpZm5kZWYgR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JQ29tcG9uZW50SW5zdGFuY2UgZ2k7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBnaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MoJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ2kpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncygmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUNvbXBvbmVudEluc3RhbmNlIGdpOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIENvbXBvbmVudEluc3RhbmNlIGdpOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGdpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZldpdGhGbGFncyhkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHBpeG1hcDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgcGl4bWFwOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoOwogI2lmbmRlZiBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGl4bWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yUGl4TWFwKHBpeG1hcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlkaCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeG1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcChwaXhtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpZGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBlZmZlY3RUeXBlOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBlZmZlY3RUeXBlOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoOwogI2lmbmRlZiBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdAotCVB5TWFjX1BSRUNIRUNLKE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmVmZmVjdFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JFZmZlY3QoZWZmZWN0VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlkaCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZlZmZlY3RUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0KGVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpZGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0UGl4ZWxTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JT1NUeXBlIFBpeGVsRm9ybWF0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgT1NUeXBlIFBpeGVsRm9ybWF0OwogI2lmbmRlZiBRVEdldFBpeGVsU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4ZWxTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFBpeGVsU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJlBpeGVsRm9ybWF0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRHZXRQaXhlbFNpemUoUGl4ZWxGb3JtYXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmUGl4ZWxGb3JtYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVEdldFBpeGVsU2l6ZShQaXhlbEZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCU9TVHlwZSBQaXhlbEZvcm1hdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIE9TVHlwZSBQaXhlbEZvcm1hdDsKICNpZm5kZWYgUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZQaXhlbEZvcm1hdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24oUGl4ZWxGb3JtYXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmUGl4ZWxGb3JtYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVEdldFBpeGVsRm9ybWF0RGVwdGhGb3JJbWFnZURlc2NyaXB0aW9uKFBpeGVsRm9ybWF0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFBpeE1hcEhhbmRsZVJvd0J5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcwotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhwbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgcG07Ci0JbG9uZyByb3dCeXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgbG9uZyByb3dCeXRlczsKICNpZm5kZWYgUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcwotCVB5TWFjX1BSRUNIRUNLKFFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJvd0J5dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMocG0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Qnl0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3dCeXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzKHBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0J5dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbAotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRHZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChwbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgcG07Ci0JRml4ZWQgZ2FtbWFMZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgRml4ZWQgZ2FtbWFMZXZlbDsKICNpZm5kZWYgUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsCi0JUHlNYWNfUFJFQ0hFQ0soUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZ2FtbWFMZXZlbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwocG0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYUxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZnYW1tYUxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbW1hTGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsCi0JUHlNYWNfUFJFQ0hFQ0soUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKHBtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKHBtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBpeE1hcEhhbmRsZSBwbTsKLQlGaXhlZCByZXF1ZXN0ZWRHYW1tYUxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpeE1hcEhhbmRsZSBwbTsKKyAgICBGaXhlZCByZXF1ZXN0ZWRHYW1tYUxldmVsOwogI2lmbmRlZiBRVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwKLQlQeU1hY19QUkVDSEVDSyhRVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyZXF1ZXN0ZWRHYW1tYUxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbChwbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEdhbW1hTGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJlcXVlc3RlZEdhbW1hTGV2ZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKHBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkR2FtbWFMZXZlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcEFkZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBzcmM7Ci0Jd2lkZSBkc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgc3JjOworICAgIHdpZGUgZHN0OwogI2lmbmRlZiBDb21wQWRkCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcEFkZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcEFkZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcEFkZCgmc3JjLAotCSAgICAgICAgJmRzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcEFkZCgmc3JjLAorICAgICAgICAmZHN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBTdWIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXdpZGUgc3JjOwotCXdpZGUgZHN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB3aWRlIHNyYzsKKyAgICB3aWRlIGRzdDsKICNpZm5kZWYgQ29tcFN1YgotCVB5TWFjX1BSRUNIRUNLKENvbXBTdWIpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBTdWIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNvbXBTdWIoJnNyYywKLQkgICAgICAgICZkc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvbXBTdWIoJnNyYywKKyAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wTmVnKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl3aWRlIGRzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgd2lkZSBkc3Q7CiAjaWZuZGVmIENvbXBOZWcKLQlQeU1hY19QUkVDSEVDSyhDb21wTmVnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wTmVnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wTmVnKCZkc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb21wTmVnKCZkc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBTaGlmdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBzcmM7Ci0Jc2hvcnQgc2hpZnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgc3JjOworICAgIHNob3J0IHNoaWZ0OwogI2lmbmRlZiBDb21wU2hpZnQKLQlQeU1hY19QUkVDSEVDSyhDb21wU2hpZnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBTaGlmdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNoaWZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcFNoaWZ0KCZzcmMsCi0JICAgICAgICAgIHNoaWZ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoaWZ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcFNoaWZ0KCZzcmMsCisgICAgICAgICAgICAgIHNoaWZ0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wTXVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHNyYzE7Ci0JbG9uZyBzcmMyOwotCXdpZGUgZHN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIHNyYzE7CisgICAgbG9uZyBzcmMyOworICAgIHdpZGUgZHN0OwogI2lmbmRlZiBDb21wTXVsCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcE11bCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcE11bCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmMxLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjMikpCi0JCXJldHVybiBOVUxMOwotCUNvbXBNdWwoc3JjMSwKLQkgICAgICAgIHNyYzIsCi0JICAgICAgICAmZHN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvbXBNdWwoc3JjMSwKKyAgICAgICAgc3JjMiwKKyAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcERpdihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0Jd2lkZSBudW1lcmF0b3I7Ci0JbG9uZyBkZW5vbWluYXRvcjsKLQlsb25nIHJlbWFpbmRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgd2lkZSBudW1lcmF0b3I7CisgICAgbG9uZyBkZW5vbWluYXRvcjsKKyAgICBsb25nIHJlbWFpbmRlcjsKICNpZm5kZWYgQ29tcERpdgotCVB5TWFjX1BSRUNIRUNLKENvbXBEaXYpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBEaXYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZW5vbWluYXRvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvbXBEaXYoJm51bWVyYXRvciwKLQkgICAgICAgICAgICAgIGRlbm9taW5hdG9yLAotCSAgICAgICAgICAgICAgJnJlbWFpbmRlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG51bWVyYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVub21pbmF0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wRGl2KCZudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICZyZW1haW5kZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wRml4TXVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl3aWRlIGNvbXBTcmM7Ci0JRml4ZWQgZml4U3JjOwotCXdpZGUgY29tcERzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgd2lkZSBjb21wU3JjOworICAgIEZpeGVkIGZpeFNyYzsKKyAgICB3aWRlIGNvbXBEc3Q7CiAjaWZuZGVmIENvbXBGaXhNdWwKLQlQeU1hY19QUkVDSEVDSyhDb21wRml4TXVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wRml4TXVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZmaXhTcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wRml4TXVsKCZjb21wU3JjLAotCSAgICAgICAgICAgZml4U3JjLAotCSAgICAgICAgICAgJmNvbXBEc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGNvbXBTcmMsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjb21wRHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZml4U3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcEZpeE11bCgmY29tcFNyYywKKyAgICAgICAgICAgICAgIGZpeFNyYywKKyAgICAgICAgICAgICAgICZjb21wRHN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjb21wU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY29tcERzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcE11bERpdihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBjbzsKLQlsb25nIG11bDsKLQlsb25nIGRpdmlzb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgY287CisgICAgbG9uZyBtdWw7CisgICAgbG9uZyBkaXZpc29yOwogI2lmbmRlZiBDb21wTXVsRGl2Ci0JUHlNYWNfUFJFQ0hFQ0soQ29tcE11bERpdik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcE11bERpdik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXZpc29yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcE11bERpdigmY28sCi0JICAgICAgICAgICBtdWwsCi0JICAgICAgICAgICBkaXZpc29yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY28pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpdmlzb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb21wTXVsRGl2KCZjbywKKyAgICAgICAgICAgICAgIG11bCwKKyAgICAgICAgICAgICAgIGRpdmlzb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcE11bERpdlRydW5jKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl3aWRlIGNvOwotCWxvbmcgbXVsOwotCWxvbmcgZGl2aXNvcjsKLQlsb25nIHJlbWFpbmRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgd2lkZSBjbzsKKyAgICBsb25nIG11bDsKKyAgICBsb25nIGRpdmlzb3I7CisgICAgbG9uZyByZW1haW5kZXI7CiAjaWZuZGVmIENvbXBNdWxEaXZUcnVuYwotCVB5TWFjX1BSRUNIRUNLKENvbXBNdWxEaXZUcnVuYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcE11bERpdlRydW5jKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm11bCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpdmlzb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wTXVsRGl2VHJ1bmMoJmNvLAotCSAgICAgICAgICAgICAgICBtdWwsCi0JICAgICAgICAgICAgICAgIGRpdmlzb3IsCi0JICAgICAgICAgICAgICAgICZyZW1haW5kZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY28sCi0JICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXZpc29yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcE11bERpdlRydW5jKCZjbywKKyAgICAgICAgICAgICAgICAgICAgbXVsLAorICAgICAgICAgICAgICAgICAgICBkaXZpc29yLAorICAgICAgICAgICAgICAgICAgICAmcmVtYWluZGVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGNvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcENvbXBhcmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCXdpZGUgYTsKLQl3aWRlIG1pbnVzYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgd2lkZSBhOworICAgIHdpZGUgbWludXNiOwogI2lmbmRlZiBDb21wQ29tcGFyZQotCVB5TWFjX1BSRUNIRUNLKENvbXBDb21wYXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wQ29tcGFyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtaW51c2IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb21wQ29tcGFyZSgmYSwKLQkgICAgICAgICAgICAgICAgICAmbWludXNiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtaW51c2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wQ29tcGFyZSgmYSwKKyAgICAgICAgICAgICAgICAgICAgICAmbWludXNiKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wU3F1YXJlUm9vdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7Ci0Jd2lkZSBzcmM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OworICAgIHdpZGUgc3JjOwogI2lmbmRlZiBDb21wU3F1YXJlUm9vdAotCVB5TWFjX1BSRUNIRUNLKENvbXBTcXVhcmVSb290KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wU3F1YXJlUm9vdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb21wU3F1YXJlUm9vdCgmc3JjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wU3F1YXJlUm9vdCgmc3JjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GaXhNdWxEaXYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBzcmM7Ci0JRml4ZWQgbXVsOwotCUZpeGVkIGRpdmlzb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBGaXhlZCBzcmM7CisgICAgRml4ZWQgbXVsOworICAgIEZpeGVkIGRpdmlzb3I7CiAjaWZuZGVmIEZpeE11bERpdgotCVB5TWFjX1BSRUNIRUNLKEZpeE11bERpdik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRml4TXVsRGl2KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJm11bCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZkaXZpc29yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRml4TXVsRGl2KHNyYywKLQkgICAgICAgICAgICAgICAgbXVsLAotCSAgICAgICAgICAgICAgICBkaXZpc29yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmRpdmlzb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaXhNdWxEaXYoc3JjLAorICAgICAgICAgICAgICAgICAgICBtdWwsCisgICAgICAgICAgICAgICAgICAgIGRpdmlzb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9VbnNpZ25lZEZpeE11bERpdihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCUZpeGVkIHNyYzsKLQlGaXhlZCBtdWw7Ci0JRml4ZWQgZGl2aXNvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIEZpeGVkIHNyYzsKKyAgICBGaXhlZCBtdWw7CisgICAgRml4ZWQgZGl2aXNvcjsKICNpZm5kZWYgVW5zaWduZWRGaXhNdWxEaXYKLQlQeU1hY19QUkVDSEVDSyhVbnNpZ25lZEZpeE11bERpdik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVW5zaWduZWRGaXhNdWxEaXYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbXVsLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmRpdmlzb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBVbnNpZ25lZEZpeE11bERpdihzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgbXVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZGl2aXNvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFVuc2lnbmVkRml4TXVsRGl2KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aXNvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZpeEV4cDIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBzcmM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBGaXhlZCBzcmM7CiAjaWZuZGVmIEZpeEV4cDIKLQlQeU1hY19QUkVDSEVDSyhGaXhFeHAyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaXhFeHAyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaXhFeHAyKHNyYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaXhFeHAyKHNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZpeExvZzIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBzcmM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBGaXhlZCBzcmM7CiAjaWZuZGVmIEZpeExvZzIKLQlQeU1hY19QUkVDSEVDSyhGaXhMb2cyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaXhMb2cyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaXhMb2cyKHNyYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaXhMb2cyKHNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZpeFBvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCUZpeGVkIGJhc2U7Ci0JRml4ZWQgZXhwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CisgICAgRml4ZWQgYmFzZTsKKyAgICBGaXhlZCBleHA7CiAjaWZuZGVmIEZpeFBvdwotCVB5TWFjX1BSRUNIRUNLKEZpeFBvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRml4UG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmJhc2UsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXhwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRml4UG93KGJhc2UsCi0JICAgICAgICAgICAgIGV4cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXhwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRml4UG93KGJhc2UsCisgICAgICAgICAgICAgICAgIGV4cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlVHlwZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVUeXBlOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZVR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldERhdGFGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhRmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGF0YUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0UmVhZERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0UmVhZERhdGEKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFJlYWREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFJlYWREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRSZWFkRGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRSZWFkRGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0Q2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZ25IYW5kbGUgY2xpcFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZ25IYW5kbGUgY2xpcFJnbjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRDbGlwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldENsaXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRDbGlwKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldENsaXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmduSGFuZGxlIGNsaXBSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUmduSGFuZGxlIGNsaXBSZ247CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0Q2xpcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRDbGlwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldENsaXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGlwUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY2xpcFJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0Q2xpcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaXBSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjbGlwUmduKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBzb3VyY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3Qgc291cmNlUmVjdDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc291cmNlUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZVJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNvdXJjZVJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBzb3VyY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3Qgc291cmNlUmVjdDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZVJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZzb3VyY2VSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnNvdXJjZVJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IG5hdHVyYWxCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUmVjdCBuYXR1cmFsQm91bmRzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmF0dXJhbEJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm5hdHVyYWxCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYXR1cmFsQm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbmF0dXJhbEJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnREcmF3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydERyYXcKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydERyYXcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RHJhdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnREcmF3KGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnREcmF3KGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlDR3JhZlB0ciBwb3J0OwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldEdXb3JsZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlDR3JhZlB0ciBwb3J0OwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEdXb3JsZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBwb3J0LAotCSAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGdkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIGZzczsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgZnNzOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2F2ZUFzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZ3JhcGhpY3NNb2RlOwotCVJHQkNvbG9yIG9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBncmFwaGljc01vZGU7CisgICAgUkdCQ29sb3Igb3BDb2xvcjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEdyYXBoaWNzTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyYXBoaWNzTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm9wQ29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEdyYXBoaWNzTW9kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljc01vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZncmFwaGljc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZvcENvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGdyYXBoaWNzTW9kZTsKLQlSR0JDb2xvciBvcENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgZ3JhcGhpY3NNb2RlOworICAgIFJHQkNvbG9yIG9wQ29sb3I7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JhcGhpY3NNb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXBoaWNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3BDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRRdWFsaXR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUNvZGVjUSBxdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENvZGVjUSBxdWFsaXR5OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUNvZGVjUSBxdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENvZGVjUSBxdWFsaXR5OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyBmc3M7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIGZzczsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbGltaXQ7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGxpbWl0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgbGltaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEFsaWFzZWREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0VmFsaWRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiB2YWxpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIHZhbGlkOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFZhbGlkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFZhbGlkYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogdXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHVzZXJEYXRhOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldE1ldGFEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldE1JTUVUeXBlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlzaG9ydCBkcmF3c0FsbFBpeGVsczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBkcmF3c0FsbFBpeGVsczsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJhd3NBbGxQaXhlbHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRyYXdzQWxsUGl4ZWxzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcmF3c0FsbFBpeGVscyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd3NBbGxQaXhlbHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVBpY0hhbmRsZSBwaWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFBpY0hhbmRsZSBwaWN0dXJlOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEFzUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEFzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpY3R1cmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwaWN0dXJlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpY3R1cmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwaWN0dXJlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOwotCUZTU3BlYyBmc3M7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKKyAgICBGU1NwZWMgZnNzOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBxdEF0b21Db250YWluZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW1hZ2VDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIGltYWdlQ291bnQ7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUNvdW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbWFnZUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXg7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBpbWFnZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHdpZGUgb2Zmc2V0OworICAgIHdpZGUgc2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBkYXRhUHRyOwotCXdpZGUgZGF0YU9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBkYXRhUHRyOworICAgIHdpZGUgZGF0YU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0UmVhZERhdGE2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB3aWRlIGxpbWl0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl3aWRlIG9mZnNldDsKLQl3aWRlIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHdpZGUgb2Zmc2V0OworICAgIHdpZGUgbGltaXQ7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBsaW1pdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGxpbWl0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJnbkhhbmRsZSBkZWZhdWx0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJnbkhhbmRsZSBkZWZhdWx0UmduOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0UmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVmYXVsdFJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdFJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlZmF1bHRSZ24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGRlZmF1bHRHcmFwaGljc01vZGU7Ci0JUkdCQ29sb3IgZGVmYXVsdE9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBkZWZhdWx0R3JhcGhpY3NNb2RlOworICAgIFJHQkNvbG9yIGRlZmF1bHRPcENvbG9yOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdEdyYXBoaWNzTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRPcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRHcmFwaGljc01vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmZGVmYXVsdE9wQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0R3JhcGhpY3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdE9wQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEdyYXBoaWNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZkZWZhdWx0T3BDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IGRlZmF1bHRTb3VyY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgZGVmYXVsdFNvdXJjZVJlY3Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdFNvdXJjZVJlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRTb3VyY2VSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVmYXVsdFNvdXJjZVJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRTb3VyY2VSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVmYXVsdFNvdXJjZVJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgcHJvZmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgcHJvZmlsZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldENvbG9yU3luY1Byb2ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2ZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwcm9maWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvZmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHByb2ZpbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBkZXN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRlc3RSZWN0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldERlc3RSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRlc3RSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IGRlc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgZGVzdFJlY3Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGVzdFJlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRGbGFncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHdpZGUgb2Zmc2V0OworICAgIHdpZGUgc2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRCYXNlRGF0YU9mZnNldEFuZFNpemU2NAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbChjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERvRXhwb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgYWN0dWFsU2l6ZVdyaXR0ZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBhY3R1YWxTaXplV3JpdHRlbjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnREb0V4cG9ydAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsU2l6ZVdyaXR0ZW4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNpemVXcml0dGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnREb0V4cG9ydChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxTaXplV3JpdHRlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2l6ZVdyaXR0ZW4pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gY2FuVHJhbnNjb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gY2FuVHJhbnNjb2RlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRDYW5UcmFuc2NvZGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhblRyYW5zY29kZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FuVHJhbnNjb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRDYW5UcmFuc2NvZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhblRyYW5zY29kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FuVHJhbnNjb2RlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZShjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGNhblVzZUNvbXByZXNzb3I7Ci0Jdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gY2FuVXNlQ29tcHJlc3NvcjsKKyAgICB2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3Nvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRDYW5Vc2VDb21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5Vc2VDb21wcmVzc29yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lclB0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FuVXNlQ29tcHJlc3Nvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhblVzZUNvbXByZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW5Vc2VDb21wcmVzc29yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBvdXREZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lcjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIG91dERlc2M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dERlc2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dERlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydChjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZUNyZWF0b3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZUNyZWF0b3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVDcmVhdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVDcmVhdG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZU5hbWVFeHRlbnNpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVOYW1lRXh0ZW5zaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVOYW1lRXh0ZW5zaW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBxdEF0b21Db250YWluZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXIKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXJQdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSB0aGVUZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSB0aGVUZXh0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVUZXh0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlVGV4dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlVGV4dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVRleHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBkb250UmVjb21wcmVzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGRvbnRSZWNvbXByZXNzOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldERvbnRSZWNvbXByZXNzCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRvbnRSZWNvbXByZXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRSZWNvbXByZXNzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvbnRSZWNvbXByZXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRSZWNvbXByZXNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldERvbnRSZWNvbXByZXNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gZG9udFJlY29tcHJlc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBkb250UmVjb21wcmVzczsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9udFJlY29tcHJlc3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRvbnRSZWNvbXByZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb250UmVjb21wcmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG9udFJlY29tcHJlc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIGludGVybGFjZVN0eWxlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldEludGVybGFjZVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmludGVybGFjZVN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZVN0eWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybGFjZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZVN0eWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJsYWNlU3R5bGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZVN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmxhY2VTdHlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlU3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHVzZXJEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiB1c2VyRGF0YTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VyRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogdXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHVzZXJEYXRhOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldE1ldGFEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyB0YXJnZXREYXRhU2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRUYXJnZXREYXRhU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXREYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXREYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldERhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0RGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgY29tcHJlc3Npb25NZXRob2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBjb21wcmVzc2lvbk1ldGhvZDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvbk1ldGhvZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbk1ldGhvZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbk1ldGhvZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvbk1ldGhvZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGNvbXByZXNzaW9uTWV0aG9kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgY29tcHJlc3Npb25NZXRob2Q7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzaW9uTWV0aG9kKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25NZXRob2QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTWV0aG9kKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgQ29kZWNRIHNwYXRpYWxRdWFsaXR5OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25RdWFsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvblF1YWxpdHkoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25RdWFsaXR5KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb247Ci0JRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uOworICAgIEZpeGVkIHZlcnRpY2FsUmVzb2x1dGlvbjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaG9yaXpvbnRhbFJlc29sdXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmdmVydGljYWxSZXNvbHV0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsUmVzb2x1dGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWxSZXNvbHV0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZob3Jpem9udGFsUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ2ZXJ0aWNhbFJlc29sdXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbFJlc29sdXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlGaXhlZCBob3Jpem9udGFsUmVzb2x1dGlvbjsKLQlGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb247CisgICAgRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24KLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRSZXNvbHV0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9yaXpvbnRhbFJlc29sdXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0aWNhbFJlc29sdXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGhvcml6b250YWxSZXNvbHV0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIHZlcnRpY2FsUmVzb2x1dGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6b250YWxSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydGljYWxSZXNvbHV0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBob3Jpem9udGFsUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCB2ZXJ0aWNhbFJlc29sdXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0RGVwdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBkZXB0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGRlcHRoOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldERlcHRoCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREZXB0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREZXB0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREZXB0aChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREZXB0aChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldERlcHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZGVwdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBkZXB0aDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXREZXB0aAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRlcHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREZXB0aChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgY29sb3JTeW5jUHJvZmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgY29sb3JTeW5jUHJvZmlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbG9yU3luY1Byb2ZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3luY1Byb2ZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb2xvclN5bmNQcm9maWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclN5bmNQcm9maWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclN5bmNQcm9maWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29sb3JTeW5jUHJvZmlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yU3luY1Byb2ZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjb2xvclN5bmNQcm9maWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFSZWZlcmVuY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyB0aGVGaWxlOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgaDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRIYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UHRyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVB0ciBwOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUHRyIHA7CisgICAgdW5zaWduZWQgbG9uZyBzaXplOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0cgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0cihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0cihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgZ3JpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmdyaXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmdyaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGdyaXA7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JpcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBncmlwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyaXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ3JpcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JUGljSGFuZGxlIHBpY3R1cmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUGljSGFuZGxlIHBpY3R1cmU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaWN0dXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpY3R1cmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0UGljdHVyZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0UGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlQaWNIYW5kbGUgcGljdHVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBQaWNIYW5kbGUgcGljdHVyZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0UGljdHVyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWN0dXJlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGljdHVyZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWN0dXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGljdHVyZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlHV29ybGRQdHIgZ3dvcmxkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEdXb3JsZFB0ciBnd29ybGQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZnd29ybGQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3dvcmxkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3dvcmxkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3b3JsZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlHV29ybGRQdHIgZ3dvcmxkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEdXb3JsZFB0ciBnd29ybGQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmd3b3JsZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGd3b3JsZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3dvcmxkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgZ3dvcmxkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVBpeE1hcEhhbmRsZSBwaXhtYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUGl4TWFwSGFuZGxlIHBpeG1hcDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXApOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeG1hcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhtYXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhtYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4bWFwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0UGl4bWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVBpeE1hcEhhbmRsZSBwaXhtYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUGl4TWFwSGFuZGxlIHBpeG1hcDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXApOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl4bWFwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGl4bWFwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaXhtYXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwaXhtYXApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbGltaXQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dE9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dE9mZnNldEFuZExpbWl0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBsaW1pdDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0T2Zmc2V0QW5kTGltaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gbWF5UmVhZElucHV0RGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIG1heVJlYWRJbnB1dERhdGE7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRNYXlFeHBvcnRlclJlYWRJbnB1dERhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF5UmVhZElucHV0RGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWF5UmVhZElucHV0RGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXlSZWFkSW5wdXREYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXlSZWFkSW5wdXREYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhU2l6ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVJlY3QgZGltZW5zaW9uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRpbWVuc2lvbnM7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpbWVuc2lvbnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkaW1lbnNpb25zKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaW1lbnNpb25zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGltZW5zaW9ucyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBpbnB1dERlcHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgaW5wdXREZXB0aDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXB0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlcHRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnB1dERlcHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVwdGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVwdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQ0dyYWZQdHIgZ3c7Ci0JR0RIYW5kbGUgZ2Q7Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBDR3JhZlB0ciBndzsKKyAgICBHREhhbmRsZSBnZDsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmd3LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKLQlCb29sZWFuIHRydW5jYXRlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heFNpemU7CisgICAgQm9vbGVhbiB0cnVuY2F0ZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJ1bmNhdGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY2F0ZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVGaWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBtYXhTaXplOwotCUJvb2xlYW4gdHJ1bmNhdGVGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKKyAgICBCb29sZWFuIHRydW5jYXRlRmlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY2F0ZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVGaWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRydW5jYXRlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZUZpbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlQ3JlYXRvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDcmVhdG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVDcmVhdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNyZWF0b3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZUNyZWF0b3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZUNyZWF0b3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVDcmVhdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVDcmVhdG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBtYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgbWFyazsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXJrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcmspKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmsoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmspOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG1hcms7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBtYXJrOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmsKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmspOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFyayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWFyayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcmspOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmspOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGVuYWJsZVRodW1ibmFpbDsKLQlsb25nIG1heFRodW1ibmFpbFdpZHRoOwotCWxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gZW5hYmxlVGh1bWJuYWlsOworICAgIGxvbmcgbWF4VGh1bWJuYWlsV2lkdGg7CisgICAgbG9uZyBtYXhUaHVtYm5haWxIZWlnaHQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVUaHVtYm5haWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhUaHVtYm5haWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbEhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlVGh1bWJuYWlsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUaHVtYm5haWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsSGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlVGh1bWJuYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhUaHVtYm5haWxIZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVRodW1ibmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRodW1ibmFpbEhlaWdodCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gdGh1bWJuYWlsRW5hYmxlZDsKLQlsb25nIG1heFRodW1ibmFpbFdpZHRoOwotCWxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gdGh1bWJuYWlsRW5hYmxlZDsKKyAgICBsb25nIG1heFRodW1ibmFpbFdpZHRoOworICAgIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGh1bWJuYWlsRW5hYmxlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsSGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbEVuYWJsZWQsCi0JICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsSGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGh1bWJuYWlsRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsSGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsSGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gZW5hYmxlRXhpZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGVuYWJsZUV4aWY7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlRXhpZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVFeGlmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZUV4aWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlRXhpZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGV4aWZFbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gZXhpZkVuYWJsZWQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4aWZFbmFibGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBleGlmRW5hYmxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhpZkVuYWJsZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4aWZFbmFibGVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9JbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNEZXNjOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0RGVzYzsKLQl2b2lkICogZGF0YTsKLQlsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNEZXNjOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0RGVzYzsKKyAgICB2b2lkICogZGF0YTsKKyAgICBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBJbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdGMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjRGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEltYWdlVHJhbnNjb2RlckJlZ2luU2VxdWVuY2UoaXRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZHN0RGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlKGl0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRzdERlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7Ci0Jdm9pZCAqIGRzdERhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0YzsKKyAgICB2b2lkICogZHN0RGF0YTsKICNpZm5kZWYgSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEKLQlQeU1hY19QUkVDSEVDSyhJbWFnZVRyYW5zY29kZXJEaXNwb3NlRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0RGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhKGl0YywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEoaXRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdERhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ltYWdlVHJhbnNjb2RlckVuZFNlcXVlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0YzsKICNpZm5kZWYgSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UKLQlQeU1hY19QUkVDSEVDSyhJbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdGMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZShpdGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UoaXRjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbG9ja0dldFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOwotCVRpbWVSZWNvcmQgb3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFDbG9jazsKKyAgICBUaW1lUmVjb3JkIG91dDsKICNpZm5kZWYgQ2xvY2tHZXRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvY2tHZXRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9ja0dldFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhQ2xvY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDbG9ja0dldFRpbWUoYUNsb2NrLAotCSAgICAgICAgICAgICAgICAgICAmb3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJm91dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhQ2xvY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDbG9ja0dldFRpbWUoYUNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAmb3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJm91dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2xvY2tTZXRUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2s7Ci0JVGltZUJhc2UgdGI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOworICAgIFRpbWVCYXNlIHRiOwogI2lmbmRlZiBDbG9ja1NldFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvY2tTZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvY2tTZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrLAotCSAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmdGIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDbG9ja1NldFRpbWVCYXNlKGFDbG9jaywKLQkgICAgICAgICAgICAgICAgICAgICAgIHRiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmdGIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDbG9ja1NldFRpbWVCYXNlKGFDbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbG9ja0dldFJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIENsb2NrR2V0UmF0ZQotCVB5TWFjX1BSRUNIRUNLKENsb2NrR2V0UmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvY2tHZXRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2xvY2tHZXRSYXRlKGFDbG9jaywKLQkgICAgICAgICAgICAgICAgICAgJnJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCByYXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFDbG9jaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENsb2NrR2V0UmF0ZShhQ2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICZyYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgcmF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NQb3NpdGlvblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JUmVjdCBycDsKLQlQb2ludCB3aGVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBSZWN0IHJwOworICAgIFBvaW50IHdoZXJlOwogI2lmbmRlZiBTQ1Bvc2l0aW9uUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNDUG9zaXRpb25SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1Bvc2l0aW9uUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NQb3NpdGlvblJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJnJwLAotCSAgICAgICAgICAgICAgICAgICAgICZ3aGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcnAsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgd2hlcmUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1Bvc2l0aW9uUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NQb3NpdGlvbkRpYWxvZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlzaG9ydCBpZDsKLQlQb2ludCB3aGVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBzaG9ydCBpZDsKKyAgICBQb2ludCB3aGVyZTsKICNpZm5kZWYgU0NQb3NpdGlvbkRpYWxvZwotCVB5TWFjX1BSRUNIRUNLKFNDUG9zaXRpb25EaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDUG9zaXRpb25EaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDUG9zaXRpb25EaWFsb2coY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICBpZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHdoZXJlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NQb3NpdGlvbkRpYWxvZyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgd2hlcmUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0VGVzdEltYWdlUGljdEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaWNIYW5kbGUgdGVzdFBpY3Q7Ci0JUmVjdCB0ZXN0UmVjdDsKLQlzaG9ydCB0ZXN0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGljSGFuZGxlIHRlc3RQaWN0OworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgc2hvcnQgdGVzdEZsYWdzOwogI2lmbmRlZiBTQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDU2V0VGVzdEltYWdlUGljdEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRlc3RQaWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGljdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZXN0UGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDU2V0VGVzdEltYWdlUGljdEhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0VGVzdEltYWdlUGljdEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0Jc2hvcnQgdGVzdEZpbGVSZWY7Ci0JUmVjdCB0ZXN0UmVjdDsKLQlzaG9ydCB0ZXN0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgc2hvcnQgdGVzdEZpbGVSZWY7CisgICAgUmVjdCB0ZXN0UmVjdDsKKyAgICBzaG9ydCB0ZXN0RmxhZ3M7CiAjaWZuZGVmIFNDU2V0VGVzdEltYWdlUGljdEZpbGUKLQlQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpY3RGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpY3RGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGaWxlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGaWxlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGaWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGaWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0VGVzdEltYWdlUGl4TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpeE1hcEhhbmRsZSB0ZXN0UGl4TWFwOwotCVJlY3QgdGVzdFJlY3Q7Ci0Jc2hvcnQgdGVzdEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpeE1hcEhhbmRsZSB0ZXN0UGl4TWFwOworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgc2hvcnQgdGVzdEZsYWdzOwogI2lmbmRlZiBTQ1NldFRlc3RJbWFnZVBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKFNDU2V0VGVzdEltYWdlUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRlc3RQaXhNYXAsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ1NldFRlc3RJbWFnZVBpeE1hcChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGl4TWFwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZXN0UGl4TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaXhNYXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBpeE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDR2V0QmVzdERldmljZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFJlY3QgcjsKICNpZm5kZWYgU0NHZXRCZXN0RGV2aWNlUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNDR2V0QmVzdERldmljZVJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDR2V0QmVzdERldmljZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDR2V0QmVzdERldmljZVJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0dldEJlc3REZXZpY2VSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ1JlcXVlc3RJbWFnZVNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOwogI2lmbmRlZiBTQ1JlcXVlc3RJbWFnZVNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyhjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDUmVxdWVzdEltYWdlU2V0dGluZ3MoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NJbWFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JSGFuZGxlIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBkYXRhOwogI2lmbmRlZiBTQ0NvbXByZXNzSW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzSW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NDb21wcmVzc0ltYWdlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NJbWFnZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGEpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpY0hhbmRsZSBzcmNQaWN0dXJlOwotCVBpY0hhbmRsZSBkc3RQaWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpY0hhbmRsZSBzcmNQaWN0dXJlOworICAgIFBpY0hhbmRsZSBkc3RQaWN0dXJlOwogI2lmbmRlZiBTQ0NvbXByZXNzUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBpY3R1cmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0NvbXByZXNzUGljdHVyZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzcmNQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFBpY3R1cmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UGljdHVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NQaWN0dXJlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UGljdHVyZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NDb21wcmVzc1BpY3R1cmVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCXNob3J0IHNyY1JlZk51bTsKLQlzaG9ydCBkc3RSZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgc2hvcnQgc3JjUmVmTnVtOworICAgIHNob3J0IGRzdFJlZk51bTsKICNpZm5kZWYgU0NDb21wcmVzc1BpY3R1cmVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1BpY3R1cmVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzUGljdHVyZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NDb21wcmVzc1BpY3R1cmVGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZk51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NDb21wcmVzc1BpY3R1cmVGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZk51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKICNpZm5kZWYgU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0NvbXByZXNzU2VxdWVuY2VCZWdpbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBTQ0NvbXByZXNzU2VxdWVuY2VCZWdpbgotCVB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzU2VxdWVuY2VCZWdpbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0JUmVjdCBzcmNSZWN0OwotCUhhbmRsZSBkYXRhOwotCWxvbmcgZGF0YVNpemU7Ci0Jc2hvcnQgbm90U3luY0ZsYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSGFuZGxlIGRhdGE7CisgICAgbG9uZyBkYXRhU2l6ZTsKKyAgICBzaG9ydCBub3RTeW5jRmxhZzsKICNpZm5kZWYgU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUKLQlQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzU2VxdWVuY2VGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vdFN5bmNGbGFnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgIG5vdFN5bmNGbGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm90U3luY0ZsYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbm90U3luY0ZsYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NTZXF1ZW5jZUVuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKICNpZm5kZWYgU0NDb21wcmVzc1NlcXVlbmNlRW5kCi0JUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1NlcXVlbmNlRW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzU2VxdWVuY2VFbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUVuZChjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUVuZChjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpY0hhbmRsZSBzcmNQaWN0dXJlOwotCXNob3J0IG1vdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQaWNIYW5kbGUgc3JjUGljdHVyZTsKKyAgICBzaG9ydCBtb3Rpb247CiAjaWZuZGVmIFNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlzaG9ydCBzcmNSZWY7Ci0Jc2hvcnQgbW90aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIHNob3J0IHNyY1JlZjsKKyAgICBzaG9ydCBtb3Rpb247CiAjaWZuZGVmIFNDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDRGVmYXVsdFBpeE1hcFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0Jc2hvcnQgbW90aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgc2hvcnQgbW90aW9uOwogI2lmbmRlZiBTQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNDRGVmYXVsdFBpeE1hcFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDRGVmYXVsdFBpeE1hcFNldHRpbmdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW90aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NHZXRJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCU9TVHlwZSBpbmZvVHlwZTsKLQl2b2lkICogaW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBPU1R5cGUgaW5mb1R5cGU7CisgICAgdm9pZCAqIGluZm87CiAjaWZuZGVmIFNDR2V0SW5mbwotCVB5TWFjX1BSRUNIRUNLKFNDR2V0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NHZXRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDR2V0SW5mbyhjaSwKLQkgICAgICAgICAgICAgICAgaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgIGluZm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDR2V0SW5mbyhjaSwKKyAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgIGluZm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0SW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlPU1R5cGUgaW5mb1R5cGU7Ci0Jdm9pZCAqIGluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgT1NUeXBlIGluZm9UeXBlOworICAgIHZvaWQgKiBpbmZvOwogI2lmbmRlZiBTQ1NldEluZm8KLQlQeU1hY19QUkVDSEVDSyhTQ1NldEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNDU2V0SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ1NldEluZm8oY2ksCi0JICAgICAgICAgICAgICAgIGluZm9UeXBlLAotCSAgICAgICAgICAgICAgICBpbmZvKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1NldEluZm8oY2ksCisgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgICAgICAgICAgICAgICAgICBpbmZvKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ1NldENvbXByZXNzRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTQ1NldENvbXByZXNzRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTQ1NldENvbXByZXNzRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDU2V0Q29tcHJlc3NGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRDb21wcmVzc0ZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDU2V0Q29tcHJlc3NGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDR2V0Q29tcHJlc3NGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIFNDR2V0Q29tcHJlc3NGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNDR2V0Q29tcHJlc3NGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NHZXRDb21wcmVzc0ZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0dldENvbXByZXNzRmxhZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0dldENvbXByZXNzRmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDR2V0U2V0dGluZ3NBc1RleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JSGFuZGxlIHRleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgSGFuZGxlIHRleHQ7CiAjaWZuZGVmIFNDR2V0U2V0dGluZ3NBc1RleHQKLQlQeU1hY19QUkVDSEVDSyhTQ0dldFNldHRpbmdzQXNUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0dldFNldHRpbmdzQXNUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0dldFNldHRpbmdzQXNUZXh0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0ZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NHZXRTZXR0aW5nc0FzVGV4dChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGV4dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NBc3luY0lkbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CiAjaWZuZGVmIFNDQXN5bmNJZGxlCi0JUHlNYWNfUFJFQ0hFQ0soU0NBc3luY0lkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDQXN5bmNJZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0FzeW5jSWRsZShjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQXN5bmNJZGxlKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Ud2VlbmVyUmVzZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHdlZW5lckNvbXBvbmVudCB0YzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUd2VlbmVyQ29tcG9uZW50IHRjOwogI2lmbmRlZiBUd2VlbmVyUmVzZXQKLQlQeU1hY19QUkVDSEVDSyhUd2VlbmVyUmVzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFR3ZWVuZXJSZXNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHdlZW5lclJlc2V0KHRjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHdlZW5lclJlc2V0KHRjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UQ0dldFNvdXJjZVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlckVycm9yIF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIOwotCVVzZXJEYXRhIHNyZWZIOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGVyRXJyb3IgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lQ29kZURlc2NyaXB0aW9uSGFuZGxlIHRjZEg7CisgICAgVXNlckRhdGEgc3JlZkg7CiAjaWZuZGVmIFRDR2V0U291cmNlUmVmCi0JUHlNYWNfUFJFQ0hFQ0soVENHZXRTb3VyY2VSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFRDR2V0U291cmNlUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0Y2RIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVENHZXRTb3VyY2VSZWYobWgsCi0JICAgICAgICAgICAgICAgICAgICAgdGNkSCwKLQkgICAgICAgICAgICAgICAgICAgICAmc3JlZkgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHNyZWZIKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGNkSCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRDR2V0U291cmNlUmVmKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRjZEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNyZWZIKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCBzcmVmSCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVENTZXRTb3VyY2VSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZXJFcnJvciBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVDb2RlRGVzY3JpcHRpb25IYW5kbGUgdGNkSDsKLQlVc2VyRGF0YSBzcmVmSDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlckVycm9yIF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIOworICAgIFVzZXJEYXRhIHNyZWZIOwogI2lmbmRlZiBUQ1NldFNvdXJjZVJlZgotCVB5TWFjX1BSRUNIRUNLKFRDU2V0U291cmNlUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUQ1NldFNvdXJjZVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0Y2RILAotCSAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmc3JlZkgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUQ1NldFNvdXJjZVJlZihtaCwKLQkgICAgICAgICAgICAgICAgICAgICB0Y2RILAotCSAgICAgICAgICAgICAgICAgICAgIHNyZWZIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0Y2RILAorICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmc3JlZkgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUQ1NldFNvdXJjZVJlZihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Y2RILAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyZWZIKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UQ1NldFRpbWVDb2RlRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZXJFcnJvciBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBmbGFnc01hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZXJFcnJvciBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhZ3M7CisgICAgbG9uZyBmbGFnc01hc2s7CiAjaWZuZGVmIFRDU2V0VGltZUNvZGVGbGFncwotCVB5TWFjX1BSRUNIRUNLKFRDU2V0VGltZUNvZGVGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVENTZXRUaW1lQ29kZUZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVENTZXRUaW1lQ29kZUZsYWdzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRDU2V0VGltZUNvZGVGbGFncyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVENHZXRUaW1lQ29kZUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGVyRXJyb3IgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGVyRXJyb3IgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBUQ0dldFRpbWVDb2RlRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhUQ0dldFRpbWVDb2RlRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFRDR2V0VGltZUNvZGVGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVENHZXRUaW1lQ29kZUZsYWdzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVENHZXRUaW1lQ29kZUZsYWdzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YUg7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JVHJhY2sgdXNlZFRyYWNrOwotCVRpbWVWYWx1ZSBhdFRpbWU7Ci0JVGltZVZhbHVlIGFkZGVkRHVyYXRpb247Ci0JbG9uZyBpbkZsYWdzOwotCWxvbmcgb3V0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFIOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIHRhcmdldFRyYWNrOworICAgIFRyYWNrIHVzZWRUcmFjazsKKyAgICBUaW1lVmFsdWUgYXRUaW1lOworICAgIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uOworICAgIGxvbmcgaW5GbGFnczsKKyAgICBsb25nIG91dEZsYWdzOwogI2lmbmRlZiBNb3ZpZUltcG9ydEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIHVzZWRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICBhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0SGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIHVzZWRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JVHJhY2sgdXNlZFRyYWNrOwotCVRpbWVWYWx1ZSBhdFRpbWU7Ci0JVGltZVZhbHVlIGFkZGVkRHVyYXRpb247Ci0JbG9uZyBpbkZsYWdzOwotCWxvbmcgb3V0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgVHJhY2sgdGFyZ2V0VHJhY2s7CisgICAgVHJhY2sgdXNlZFRyYWNrOworICAgIFRpbWVWYWx1ZSBhdFRpbWU7CisgICAgVGltZVZhbHVlIGFkZGVkRHVyYXRpb247CisgICAgbG9uZyBpbkZsYWdzOworICAgIGxvbmcgb3V0RmxhZ3M7CiAjaWZuZGVmIE1vdmllSW1wb3J0RmlsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGFyZ2V0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgIGFkZGVkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGFyZ2V0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgdXNlZFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCVRpbWVTY2FsZSBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgVGltZVNjYWxlIHNjYWxlOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCU9TVHlwZSBtZWRpYVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmbWVkaWFUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0TWVkaWFGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCUFsaWFzSGFuZGxlIGFsaWFzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEFsaWFzSGFuZGxlIGFsaWFzOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldE1lZGlhRmlsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0TWVkaWFGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE1lZGlhRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWxpYXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldE1lZGlhRmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmFsaWFzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRNZWRpYUZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0RGltZW5zaW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlGaXhlZCB3aWR0aDsKLQlGaXhlZCBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRml4ZWQgd2lkdGg7CisgICAgRml4ZWQgaGVpZ2h0OwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RGltZW5zaW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0RGltZW5zaW9ucyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRDaHVua1NpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBjaHVua1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBjaHVua1NpemU7CiAjaWZuZGVmIE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRDaHVua1NpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2h1bmtTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRDaHVua1NpemUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNodW5rU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhOwotCU9TVHlwZSBoYW5kbGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhOworICAgIE9TVHlwZSBoYW5kbGVUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldEZyb21TY3JhcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGZyb21TY3JhcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGZyb21TY3JhcDsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldEZyb21TY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRGcm9tU2NyYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZmcm9tU2NyYXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldEZyb21TY3JhcChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NyYXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbVNjcmFwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNjcmFwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydERvVXNlckRpYWxvZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKLQlIYW5kbGUgdGhlRGF0YTsKLQlCb29sZWFuIGNhbmNlbGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIEhhbmRsZSB0aGVEYXRhOworICAgIEJvb2xlYW4gY2FuY2VsZWQ7CiAjaWZuZGVmIE1vdmllSW1wb3J0RG9Vc2VyRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnREb1VzZXJEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RG9Vc2VyRGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydERvVXNlckRpYWxvZyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5jZWxlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydERvVXNlckRpYWxvZyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5jZWxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0RHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXREdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0U2V0RHVyYXRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0RHVyYXRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgYXV4VHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgYXV4VHlwZTsKICNpZm5kZWYgTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV4VHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBhdXhUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXhUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGF1eFR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0VmFsaWRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JSGFuZGxlIHRoZURhdGE7Ci0JQm9vbGVhbiB2YWxpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBIYW5kbGUgdGhlRGF0YTsKKyAgICBCb29sZWFuIHZhbGlkOwogI2lmbmRlZiBNb3ZpZUltcG9ydFZhbGlkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRWYWxpZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRWYWxpZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRWYWxpZGF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFZhbGlkYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRGaWxlVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldEZpbGVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRGaWxlVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXRGaWxlVHlwZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0RmlsZVR5cGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JVHJhY2sgdXNlZFRyYWNrOwotCVRpbWVWYWx1ZSBhdFRpbWU7Ci0JVGltZVZhbHVlIGFkZGVkRHVyYXRpb247Ci0JbG9uZyBpbkZsYWdzOwotCWxvbmcgb3V0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIHRhcmdldFRyYWNrOworICAgIFRyYWNrIHVzZWRUcmFjazsKKyAgICBUaW1lVmFsdWUgYXRUaW1lOworICAgIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uOworICAgIGxvbmcgaW5GbGFnczsKKyAgICBsb25nIG91dEZsYWdzOwogI2lmbmRlZiBNb3ZpZUltcG9ydERhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGFyZ2V0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnREYXRhUmVmKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgIGFkZGVkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0YXJnZXRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydERhdGFSZWYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZGVkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCB1c2VkVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCU9TVHlwZSBtZWRpYVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldFNhbXBsZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBsaW1pdDsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB3aWRlIGxpbWl0OwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgaW5GbGFnczsKLQlsb25nIG91dEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgaW5GbGFnczsKKyAgICBsb25nIG91dEZsYWdzOwogI2lmbmRlZiBNb3ZpZUltcG9ydElkbGUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydElkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0SWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydElkbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdXRGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0SWRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCVVJbnQ4IHZhbGlkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBVSW50OCB2YWxpZDsKICNpZm5kZWYgTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFZhbGlkYXRlRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFZhbGlkYXRlRGF0YVJlZihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsaWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEdldExvYWRTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGltcG9ydGVyTG9hZFN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgaW1wb3J0ZXJMb2FkU3RhdGU7CiAjaWZuZGVmIE1vdmllSW1wb3J0R2V0TG9hZFN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0TG9hZFN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydEdldExvYWRTdGF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1wb3J0ZXJMb2FkU3RhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVyTG9hZFN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltcG9ydGVyTG9hZFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlckxvYWRTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCVRpbWVWYWx1ZSB0aW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFRpbWVWYWx1ZSB0aW1lOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlUaW1lUmVjb3JkIHRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgVGltZVJlY29yZCB0aW1lOwogI2lmbmRlZiBNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0aW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0aW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldERvbnRCbG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGRvbnRCbG9jazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGRvbnRCbG9jazsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXREb250QmxvY2sKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldERvbnRCbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXREb250QmxvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkb250QmxvY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldERvbnRCbG9jayhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb250QmxvY2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9udEJsb2NrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXREb250QmxvY2soY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9udEJsb2NrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEdldERvbnRCbG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIHdpbGxCbG9jazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIHdpbGxCbG9jazsKICNpZm5kZWYgTW92aWVJbXBvcnRHZXREb250QmxvY2sKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEdldERvbnRCbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXREb250QmxvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0R2V0RG9udEJsb2NrKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWxsQmxvY2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdpbGxCbG9jayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0RG9udEJsb2NrKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWxsQmxvY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxCbG9jayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlJZGxlTWFuYWdlciBpbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBJZGxlTWFuYWdlciBpbTsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlcgotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldElkbGVNYW5hZ2VyKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJmltKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBuZXdNb3ZpZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgbmV3TW92aWVGbGFnczsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFRvSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhSDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlUcmFjayBvbmx5VGhpc1RyYWNrOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhSDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayBvbmx5VGhpc1RyYWNrOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBNb3ZpZUV4cG9ydFRvSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRUb0hhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRUb0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0VG9IYW5kbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0VG9IYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFRvRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlUcmFjayBvbmx5VGhpc1RyYWNrOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIG9ubHlUaGlzVHJhY2s7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIE1vdmllRXhwb3J0VG9GaWxlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRUb0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VG9GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRUb0ZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRUb0ZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0R2V0QXV4aWxpYXJ5RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YUg7Ci0JT1NUeXBlIGhhbmRsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFIOworICAgIE9TVHlwZSBoYW5kbGVUeXBlOwogI2lmbmRlZiBNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0QXV4aWxpYXJ5RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBoYW5kbGVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBoYW5kbGVUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCVNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIE9TVHlwZSBtZWRpYVR5cGU7CiAjaWZuZGVmIE1vdmllRXhwb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJm1lZGlhVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnREb1VzZXJEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgb25seVRoaXNUcmFjazsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQlCb29sZWFuIGNhbmNlbGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIG9ubHlUaGlzVHJhY2s7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgQm9vbGVhbiBjYW5jZWxlZDsKICNpZm5kZWYgTW92aWVFeHBvcnREb1VzZXJEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydERvVXNlckRpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnREb1VzZXJEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnREb1VzZXJEaWFsb2coY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmNlbGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjYW5jZWxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnREb1VzZXJEaWFsb2coY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmNlbGVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgY3JlYXRvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgY3JlYXRvcjsKICNpZm5kZWYgTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNyZWF0b3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0VG9EYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlUcmFjayBvbmx5VGhpc1RyYWNrOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayBvbmx5VGhpc1RyYWNrOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBNb3ZpZUV4cG9ydFRvRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VG9EYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFRvRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRUb0RhdGFSZWYoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VGhpc1RyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0VG9EYXRhUmVmKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgTW92aWVFeHBvcnRGcm9tUHJvY2VkdXJlc1RvRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0VmFsaWRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgb25seVRoaXNUcmFjazsKLQlCb29sZWFuIHZhbGlkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIG9ubHlUaGlzVHJhY2s7CisgICAgQm9vbGVhbiB2YWxpZDsKICNpZm5kZWYgTW92aWVFeHBvcnRWYWxpZGF0ZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VmFsaWRhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VmFsaWRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydFZhbGlkYXRlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VGhpc1RyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydFZhbGlkYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VGhpc1RyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZXh0ZW5zaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBleHRlbnNpb247CiAjaWZuZGVmIE1vdmllRXhwb3J0R2V0RmlsZU5hbWVFeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dGVuc2lvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBleHRlbnNpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dGVuc2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBleHRlbnNpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlTdHIyNTUgdHlwZVN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBTdHIyNTUgdHlwZVN0cmluZzsKICNpZm5kZWYgTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHR5cGVTdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmcoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0eXBlU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgbWVkaWFUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBtZWRpYVR5cGU7CiAjaWZuZGVmIE1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRHZXRTb3VyY2VNZWRpYVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG1lZGlhVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBtb3ZpZVRpbWVGcmFjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUZXh0RXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgbW92aWVUaW1lRnJhY3Rpb247CiAjaWZuZGVmIFRleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllVGltZUZyYWN0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtb3ZpZVRpbWVGcmFjdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lRnJhY3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZUZyYWN0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBtb3ZpZVRpbWVGcmFjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUZXh0RXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgbW92aWVUaW1lRnJhY3Rpb247CiAjaWZuZGVmIFRleHRFeHBvcnRTZXRUaW1lRnJhY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lRnJhY3Rpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVUaW1lRnJhY3Rpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lRnJhY3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVUaW1lRnJhY3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRFeHBvcnRHZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUZXh0RXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgc2V0dGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUZXh0RXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgc2V0dGluZzsKICNpZm5kZWYgVGV4dEV4cG9ydEdldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydEdldFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0R2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRFeHBvcnRHZXRTZXR0aW5ncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0RXhwb3J0R2V0U2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0RXhwb3J0U2V0U2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIHNldHRpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIHNldHRpbmc7CiAjaWZuZGVmIFRleHRFeHBvcnRTZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFRleHRFeHBvcnRTZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydFNldFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRFeHBvcnRTZXRTZXR0aW5ncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dEV4cG9ydFNldFNldHRpbmdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NSURJSW1wb3J0R2V0U2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIHNldHRpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIHNldHRpbmc7CiAjaWZuZGVmIE1JRElJbXBvcnRHZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKE1JRElJbXBvcnRHZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUlESUltcG9ydEdldFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNSURJSW1wb3J0R2V0U2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUlESUltcG9ydEdldFNldHRpbmdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTUlESUltcG9ydFNldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBzZXR0aW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFRleHRFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBzZXR0aW5nOwogI2lmbmRlZiBNSURJSW1wb3J0U2V0U2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhNSURJSW1wb3J0U2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKE1JRElJbXBvcnRTZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNSURJSW1wb3J0U2V0U2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1JRElJbXBvcnRTZXRTZXR0aW5ncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljSW1hZ2VNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljSW1hZ2VNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGVuYWJsZTsKICNpZm5kZWYgR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltYWdlSW1wb3J0U2V0U2VxdWVuY2VFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBlbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBlbmFibGU7CiAjaWZuZGVmIEdyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbWFnZUltcG9ydEdldFNlcXVlbmNlRW5hYmxlZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUHJldmlld1Nob3dEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCXBub3RDb21wb25lbnQgcDsKLQlPU1R5cGUgZGF0YVR5cGU7Ci0JSGFuZGxlIGRhdGE7Ci0JUmVjdCBpbkhlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgcG5vdENvbXBvbmVudCBwOworICAgIE9TVHlwZSBkYXRhVHlwZTsKKyAgICBIYW5kbGUgZGF0YTsKKyAgICBSZWN0IGluSGVyZTsKICNpZm5kZWYgUHJldmlld1Nob3dEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soUHJldmlld1Nob3dEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQcmV2aWV3U2hvd0RhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5IZXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHJldmlld1Nob3dEYXRhKHAsCi0JICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IZXJlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkhlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBQcmV2aWV3U2hvd0RhdGEocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhlcmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlwbm90Q29tcG9uZW50IHA7Ci0JT1NUeXBlIHByZXZpZXdUeXBlOwotCXNob3J0IHJlc0lEOwotCUZTU3BlYyBzb3VyY2VGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIHBub3RDb21wb25lbnQgcDsKKyAgICBPU1R5cGUgcHJldmlld1R5cGU7CisgICAgc2hvcnQgcmVzSUQ7CisgICAgRlNTcGVjIHNvdXJjZUZpbGU7CiAjaWZuZGVmIFByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzb3VyY2VGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlKHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgcHJldmlld1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzb3VyY2VGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlKHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgcHJldmlld1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ByZXZpZXdFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlwbm90Q29tcG9uZW50IHA7Ci0JRXZlbnRSZWNvcmQgZTsKLQlCb29sZWFuIGhhbmRsZWRFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBwbm90Q29tcG9uZW50IHA7CisgICAgRXZlbnRSZWNvcmQgZTsKKyAgICBCb29sZWFuIGhhbmRsZWRFdmVudDsKICNpZm5kZWYgUHJldmlld0V2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soUHJldmlld0V2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQcmV2aWV3RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHJldmlld0V2ZW50KHAsCi0JICAgICAgICAgICAgICAgICAgICZlLAotCSAgICAgICAgICAgICAgICAgICAmaGFuZGxlZEV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZlLAotCSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWRFdmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHJldmlld0V2ZW50KHAsCisgICAgICAgICAgICAgICAgICAgICAgICZlLAorICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZEV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWRFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUNvZGVjRGVjb21wcmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7Ci0Jdm9pZCAqIHNyY0RhdGE7Ci0JVUludDMyIHNyY1NpemU7Ci0Jdm9pZCAqIGRzdERhdGE7Ci0JVUludDMyIGRzdEJ1ZmZlclNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUNvZGVjQ29tcG9uZW50IGRjOworICAgIHZvaWQgKiBzcmNEYXRhOworICAgIFVJbnQzMiBzcmNTaXplOworICAgIHZvaWQgKiBkc3REYXRhOworICAgIFVJbnQzMiBkc3RCdWZmZXJTaXplOwogI2lmbmRlZiBEYXRhQ29kZWNEZWNvbXByZXNzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRGVjb21wcmVzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRGVjb21wcmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0RhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0RGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdEJ1ZmZlclNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhQ29kZWNEZWNvbXByZXNzKGRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUNvZGVjRGVjb21wcmVzcyhkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlclNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFDb2RlY0dldENvbXByZXNzQnVmZmVyU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7Ci0JVUludDMyIHNyY1NpemU7Ci0JVUludDMyIGRzdFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUNvZGVjQ29tcG9uZW50IGRjOworICAgIFVJbnQzMiBzcmNTaXplOworICAgIFVJbnQzMiBkc3RTaXplOwogI2lmbmRlZiBEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0dldENvbXByZXNzQnVmZmVyU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUoZGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkc3RTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUoZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhQ29kZWNDb21wcmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7Ci0Jdm9pZCAqIHNyY0RhdGE7Ci0JVUludDMyIHNyY1NpemU7Ci0Jdm9pZCAqIGRzdERhdGE7Ci0JVUludDMyIGRzdEJ1ZmZlclNpemU7Ci0JVUludDMyIGFjdHVhbERzdFNpemU7Ci0JVUludDMyIGRlY29tcHJlc3NTbG9wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFDb2RlY0NvbXBvbmVudCBkYzsKKyAgICB2b2lkICogc3JjRGF0YTsKKyAgICBVSW50MzIgc3JjU2l6ZTsKKyAgICB2b2lkICogZHN0RGF0YTsKKyAgICBVSW50MzIgZHN0QnVmZmVyU2l6ZTsKKyAgICBVSW50MzIgYWN0dWFsRHN0U2l6ZTsKKyAgICBVSW50MzIgZGVjb21wcmVzc1Nsb3A7CiAjaWZuZGVmIERhdGFDb2RlY0NvbXByZXNzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjQ29tcHJlc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0NvbXByZXNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3REYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0QnVmZmVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFDb2RlY0NvbXByZXNzKGRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3JjU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlclNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbERzdFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmRlY29tcHJlc3NTbG9wKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYWN0dWFsRHN0U2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICBkZWNvbXByZXNzU2xvcCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUNvZGVjQ29tcHJlc3MoZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsRHN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVjb21wcmVzc1Nsb3ApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxEc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcHJlc3NTbG9wKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUNvZGVjQ29tcG9uZW50IGRjOwotCXVuc2lnbmVkIGxvbmcgbWF4U3JjU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhQ29kZWNDb21wb25lbnQgZGM7CisgICAgdW5zaWduZWQgbG9uZyBtYXhTcmNTaXplOwogI2lmbmRlZiBEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUKLQlQeU1hY19QUkVDSEVDSyhEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNyY1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUoZGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNyY1NpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4U3JjU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZShkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3JjU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUNvZGVjQ29tcG9uZW50IGRjOwogI2lmbmRlZiBEYXRhQ29kZWNFbmRJbnRlcnJ1cHRTYWZlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZShkYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFDb2RlY0VuZEludGVycnVwdFNhZmUoZGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgaDsKLQlsb25nIGhPZmZzZXQ7Ci0JbG9uZyBvZmZzZXQ7Ci0JbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBoOworICAgIGxvbmcgaE9mZnNldDsKKyAgICBsb25nIG9mZnNldDsKKyAgICBsb25nIHNpemU7CiAjaWZuZGVmIERhdGFIR2V0RGF0YQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGEoZGgsCi0JICAgICAgICAgICAgICAgICAgIGgsCi0JICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGF0YShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFB1dERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGg7Ci0JbG9uZyBoT2Zmc2V0OwotCWxvbmcgb2Zmc2V0OwotCWxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgaDsKKyAgICBsb25nIGhPZmZzZXQ7CisgICAgbG9uZyBvZmZzZXQ7CisgICAgbG9uZyBzaXplOwogI2lmbmRlZiBEYXRhSFB1dERhdGEKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFB1dERhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIUHV0RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFB1dERhdGEoZGgsCi0JICAgICAgICAgICAgICAgICAgIGgsCi0JICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgIHNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhQdXREYXRhKGRoLAorICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIRmx1c2hEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSEZsdXNoRGF0YQotCVB5TWFjX1BSRUNIRUNLKERhdGFIRmx1c2hEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEZsdXNoRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhGbHVzaERhdGEoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEZsdXNoRGF0YShkaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhPcGVuRm9yV3JpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIT3BlbkZvcldyaXRlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhPcGVuRm9yV3JpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIT3BlbkZvcldyaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSE9wZW5Gb3JXcml0ZShkaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIT3BlbkZvcldyaXRlKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSENsb3NlRm9yV3JpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIQ2xvc2VGb3JXcml0ZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIQ2xvc2VGb3JXcml0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhDbG9zZUZvcldyaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSENsb3NlRm9yV3JpdGUoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENsb3NlRm9yV3JpdGUoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIT3BlbkZvclJlYWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIT3BlbkZvclJlYWQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSE9wZW5Gb3JSZWFkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSE9wZW5Gb3JSZWFkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSE9wZW5Gb3JSZWFkKGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhPcGVuRm9yUmVhZChkaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhDbG9zZUZvclJlYWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIQ2xvc2VGb3JSZWFkCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhDbG9zZUZvclJlYWQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQ2xvc2VGb3JSZWFkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSENsb3NlRm9yUmVhZChkaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQ2xvc2VGb3JSZWFkKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFNldERhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGRhdGFSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIGRhdGFSZWY7CiAjaWZuZGVmIERhdGFIU2V0RGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXREYXRhUmVmKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0RGF0YVJlZihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXREYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBkYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBkYXRhUmVmOwogI2lmbmRlZiBEYXRhSEdldERhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXREYXRhUmVmKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhDb21wYXJlRGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgZGF0YVJlZjsKLQlCb29sZWFuIGVxdWFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIEJvb2xlYW4gZXF1YWw7CiAjaWZuZGVmIERhdGFIQ29tcGFyZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSENvbXBhcmVEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSENvbXBhcmVEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhDb21wYXJlRGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZXF1YWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGVxdWFsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQ29tcGFyZURhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVxdWFsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSFRhc2sKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFRhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIVGFzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhUYXNrKGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhUYXNrKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEZpbmlzaERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JUHRyIFBsYWNlVG9QdXREYXRhUHRyOwotCUJvb2xlYW4gQ2FuY2VsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFB0ciBQbGFjZVRvUHV0RGF0YVB0cjsKKyAgICBCb29sZWFuIENhbmNlbDsKICNpZm5kZWYgRGF0YUhGaW5pc2hEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhGaW5pc2hEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEZpbmlzaERhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmUGxhY2VUb1B1dERhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZDYW5jZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEZpbmlzaERhdGEoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFBsYWNlVG9QdXREYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICBDYW5jZWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlBsYWNlVG9QdXREYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FuY2VsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhGaW5pc2hEYXRhKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFjZVRvUHV0RGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEZsdXNoQ2FjaGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIRmx1c2hDYWNoZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIRmx1c2hDYWNoZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhGbHVzaENhY2hlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEZsdXNoQ2FjaGUoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEZsdXNoQ2FjaGUoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUmVzb2x2ZURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIHRoZURhdGFSZWY7Ci0JQm9vbGVhbiB3YXNDaGFuZ2VkOwotCUJvb2xlYW4gdXNlckludGVyZmFjZUFsbG93ZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIHRoZURhdGFSZWY7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIEJvb2xlYW4gdXNlckludGVyZmFjZUFsbG93ZWQ7CiAjaWZuZGVmIERhdGFIUmVzb2x2ZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFJlc29sdmVEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFJlc29sdmVEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZXJJbnRlcmZhY2VBbGxvd2VkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhSZXNvbHZlRGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbnRlcmZhY2VBbGxvd2VkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VySW50ZXJmYWNlQWxsb3dlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIUmVzb2x2ZURhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW50ZXJmYWNlQWxsb3dlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRGaWxlU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZpbGVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZmlsZVNpemU7CiAjaWZuZGVmIERhdGFIR2V0RmlsZVNpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldEZpbGVTaXplKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmaWxlU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RmlsZVNpemUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSENhblVzZURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JbG9uZyB1c2VGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBsb25nIHVzZUZsYWdzOwogI2lmbmRlZiBEYXRhSENhblVzZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSENhblVzZURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQ2FuVXNlRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIQ2FuVXNlRGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB1c2VGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENhblVzZURhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUHJlZXh0ZW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXVuc2lnbmVkIGxvbmcgbWF4VG9BZGQ7Ci0JdW5zaWduZWQgbG9uZyBzcGFjZUFkZGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHVuc2lnbmVkIGxvbmcgbWF4VG9BZGQ7CisgICAgdW5zaWduZWQgbG9uZyBzcGFjZUFkZGVkOwogI2lmbmRlZiBEYXRhSFByZWV4dGVuZAotCVB5TWFjX1BSRUNIRUNLKERhdGFIUHJlZXh0ZW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFByZWV4dGVuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFRvQWRkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhQcmVleHRlbmQoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgbWF4VG9BZGQsCi0JICAgICAgICAgICAgICAgICAgICAgJnNwYWNlQWRkZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwYWNlQWRkZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VG9BZGQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFByZWV4dGVuZChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUb0FkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2VBZGRlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VBZGRlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRGaWxlU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZpbGVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZmlsZVNpemU7CiAjaWZuZGVmIERhdGFIU2V0RmlsZVNpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldEZpbGVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldEZpbGVTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldEZpbGVTaXplKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldEZpbGVTaXplKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RnJlZVNwYWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXVuc2lnbmVkIGxvbmcgZnJlZVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgdW5zaWduZWQgbG9uZyBmcmVlU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRGcmVlU3BhY2UKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZyZWVTcGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGcmVlU3BhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RnJlZVNwYWNlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZmcmVlU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZnJlZVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZyZWVTcGFjZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJlZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSENyZWF0ZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JQm9vbGVhbiBkZWxldGVFeGlzdGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nOwogI2lmbmRlZiBEYXRhSENyZWF0ZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSENyZWF0ZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQ3JlYXRlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlRXhpc3RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSENyZWF0ZUZpbGUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUV4aXN0aW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlRXhpc3RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENyZWF0ZUZpbGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUV4aXN0aW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGJsb2NrU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGJsb2NrU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0UHJlZmVycmVkQmxvY2tTaXplKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja1NpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0UHJlZmVycmVkQmxvY2tTaXplKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja1NpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXREZXZpY2VJbmRleChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGRldmljZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZGV2aWNlSW5kZXg7CiAjaWZuZGVmIERhdGFIR2V0RGV2aWNlSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERldmljZUluZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERldmljZUluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERldmljZUluZGV4KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGV2aWNlSW5kZXgoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JQm9vbGVhbiB5ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgQm9vbGVhbiB5ZXM7CiAjaWZuZGVmIERhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKERhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHllcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlcihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnllcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgeWVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFJbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIHN0YXJ0T2Zmc2V0OwotCWxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIHN0YXJ0T2Zmc2V0OworICAgIGxvbmcgc2l6ZTsKICNpZm5kZWYgRGF0YUhHZXREYXRhSW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFJbkJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhSW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydE9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RGF0YUluQnVmZmVyKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0T2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXREYXRhSW5CdWZmZXIoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBtaWxsaXNlY3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBtaWxsaXNlY3M7CiAjaWZuZGVmIERhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpc2Vjcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaXNlY3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRDYWNoZVNpemVMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlTaXplIGNhY2hlU2l6ZUxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFNpemUgY2FjaGVTaXplTGltaXQ7CiAjaWZuZGVmIERhdGFIU2V0Q2FjaGVTaXplTGltaXQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldENhY2hlU2l6ZUxpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldENhY2hlU2l6ZUxpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FjaGVTaXplTGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldENhY2hlU2l6ZUxpbWl0KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplTGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FjaGVTaXplTGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldENhY2hlU2l6ZUxpbWl0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplTGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0Q2FjaGVTaXplTGltaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JU2l6ZSBjYWNoZVNpemVMaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBTaXplIGNhY2hlU2l6ZUxpbWl0OwogI2lmbmRlZiBEYXRhSEdldENhY2hlU2l6ZUxpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRDYWNoZVNpemVMaW1pdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRDYWNoZVNpemVMaW1pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRDYWNoZVNpemVMaW1pdChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWNoZVNpemVMaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplTGltaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldENhY2hlU2l6ZUxpbWl0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhY2hlU2l6ZUxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVNpemVMaW1pdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRNb3ZpZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBzaG9ydCBpZDsKICNpZm5kZWYgRGF0YUhHZXRNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0TW92aWUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAmaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICBpZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0TW92aWUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhBZGRNb3ZpZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBzaG9ydCBpZDsKICNpZm5kZWYgRGF0YUhBZGRNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIQWRkTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQWRkTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEFkZE1vdmllKGRoLAotCSAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAmaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQWRkTW92aWUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIVXBkYXRlTW92aWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JTW92aWUgdGhlTW92aWU7Ci0Jc2hvcnQgaWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgc2hvcnQgaWQ7CiAjaWZuZGVmIERhdGFIVXBkYXRlTW92aWUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFVwZGF0ZU1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFVwZGF0ZU1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhVcGRhdGVNb3ZpZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhVcGRhdGVNb3ZpZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIRG9lc0J1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlCb29sZWFuIGJ1ZmZlcnNSZWFkczsKLQlCb29sZWFuIGJ1ZmZlcnNXcml0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgQm9vbGVhbiBidWZmZXJzUmVhZHM7CisgICAgQm9vbGVhbiBidWZmZXJzV3JpdGVzOwogI2lmbmRlZiBEYXRhSERvZXNCdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhEYXRhSERvZXNCdWZmZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIRG9lc0J1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhEb2VzQnVmZmVyKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1JlYWRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1dyaXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNSZWFkcywKLQkgICAgICAgICAgICAgICAgICAgICBidWZmZXJzV3JpdGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhEb2VzQnVmZmVyKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1JlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1dyaXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNSZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzV3JpdGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEZpbGVOYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCVN0cjI1NSBzdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgU3RyMjU1IHN0cjsKICNpZm5kZWYgRGF0YUhHZXRGaWxlTmFtZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZU5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHN0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RmlsZU5hbWUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZpbGVOYW1lKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmlsZVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmaWxlU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0TWFjT1NGaWxlVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlPU1R5cGUgZmlsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBEYXRhSEdldE1hY09TRmlsZVR5cGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldE1hY09TRmlsZVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TWFjT1NGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRNYWNPU0ZpbGVUeXBlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldE1hY09TRmlsZVR5cGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRNSU1FVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlTdHIyNTUgbWltZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgU3RyMjU1IG1pbWVUeXBlOwogI2lmbmRlZiBEYXRhSEdldE1JTUVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRNSU1FVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRNSU1FVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbWltZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldE1JTUVUeXBlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBtaW1lVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0TUlNRVR5cGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgYW5jaG9yRGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JSGFuZGxlIGRhdGFSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIGFuY2hvckRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIEhhbmRsZSBkYXRhUmVmOwogI2lmbmRlZiBEYXRhSFNldERhdGFSZWZXaXRoQW5jaG9yCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmFuY2hvckRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldERhdGFSZWZXaXRoQW5jaG9yKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhbmNob3JEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGFuY2hvckRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUhhbmRsZSBkYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBhbmNob3JEYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKICNpZm5kZWYgRGF0YUhHZXREYXRhUmVmV2l0aEFuY2hvcgotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYW5jaG9yRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhbmNob3JEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0TWFjT1NGaWxlVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlPU1R5cGUgZmlsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBEYXRhSFNldE1hY09TRmlsZVR5cGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldE1hY09TRmlsZVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0TWFjT1NGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRNYWNPU0ZpbGVUeXBlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0TWFjT1NGaWxlVHlwZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0VGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JVGltZUJhc2UgdGI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgVGltZUJhc2UgdGI7CiAjaWZuZGVmIERhdGFIU2V0VGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldFRpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldFRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnRiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRUaW1lQmFzZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0YikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0VGltZUJhc2UoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRJbmZvRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JVUludDMyIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFVJbnQzMiBmbGFnczsKICNpZm5kZWYgRGF0YUhHZXRJbmZvRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEluZm9GbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRJbmZvRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0SW5mb0ZsYWdzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEluZm9GbGFncyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEZpbGVTaXplNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jd2lkZSBmaWxlU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIGZpbGVTaXplOwogI2lmbmRlZiBEYXRhSEdldEZpbGVTaXplNjQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZVNpemU2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRGaWxlU2l6ZTY0KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRGaWxlU2l6ZTY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFByZWV4dGVuZDY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXdpZGUgbWF4VG9BZGQ7Ci0Jd2lkZSBzcGFjZUFkZGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHdpZGUgbWF4VG9BZGQ7CisgICAgd2lkZSBzcGFjZUFkZGVkOwogI2lmbmRlZiBEYXRhSFByZWV4dGVuZDY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQcmVleHRlbmQ2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhQcmVleHRlbmQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtYXhUb0FkZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUHJlZXh0ZW5kNjQoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAmbWF4VG9BZGQsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2VBZGRlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3BhY2VBZGRlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWF4VG9BZGQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFByZWV4dGVuZDY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRvQWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYWNlQWRkZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNwYWNlQWRkZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0RmlsZVNpemU2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQl3aWRlIGZpbGVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHdpZGUgZmlsZVNpemU7CiAjaWZuZGVmIERhdGFIU2V0RmlsZVNpemU2NAotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RmlsZVNpemU2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRGaWxlU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRGaWxlU2l6ZTY0KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRGaWxlU2l6ZTY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RnJlZVNwYWNlNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jd2lkZSBmcmVlU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIGZyZWVTaXplOwogI2lmbmRlZiBEYXRhSEdldEZyZWVTcGFjZTY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGcmVlU3BhY2U2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGcmVlU3BhY2U2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRGcmVlU3BhY2U2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmVlU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZnJlZVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZyZWVTcGFjZTY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyZWVTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBmcmVlU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhBcHBlbmQ2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQl2b2lkICogZGF0YTsKLQl3aWRlIGZpbGVPZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHZvaWQgKiBkYXRhOworICAgIHdpZGUgZmlsZU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CiAjaWZuZGVmIERhdGFIQXBwZW5kNjQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEFwcGVuZDY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEFwcGVuZDY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhBcHBlbmQ2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVPZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhBcHBlbmQ2NChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUG9sbFJlYWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JVUludDMyIGRhdGFTaXplU29GYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgVUludDMyIGRhdGFTaXplU29GYXI7CiAjaWZuZGVmIERhdGFIUG9sbFJlYWQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFBvbGxSZWFkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFBvbGxSZWFkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUG9sbFJlYWQoZGgsCi0JICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplU29GYXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplU29GYXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIUG9sbFJlYWQoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplU29GYXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplU29GYXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIG9mZnNldDsKLQlsb25nIGxlbjsKLQlsb25nIG1pc3Npbmdfb2Zmc2V0OwotCWxvbmcgbWlzc2luZ19sZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBvZmZzZXQ7CisgICAgbG9uZyBsZW47CisgICAgbG9uZyBtaXNzaW5nX29mZnNldDsKKyAgICBsb25nIG1pc3NpbmdfbGVuOwogI2lmbmRlZiBEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlzc2luZ19vZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaXNzaW5nX2xlbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1pc3Npbmdfb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdfbGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlzc2luZ19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaXNzaW5nX2xlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npbmdfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdfbGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFSZWZBc1R5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIHJlcXVlc3RlZFR5cGU7Ci0JSGFuZGxlIGRhdGFSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIHJlcXVlc3RlZFR5cGU7CisgICAgSGFuZGxlIGRhdGFSZWY7CiAjaWZuZGVmIERhdGFIR2V0RGF0YVJlZkFzVHlwZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZkFzVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhUmVmQXNUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVxdWVzdGVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RGF0YVJlZkFzVHlwZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlcXVlc3RlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFSZWZBc1R5cGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBleHRlbnNpb247Ci0JT1NUeXBlIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgZXh0ZW5zaW9uOworICAgIE9TVHlwZSBpZFR5cGU7CiAjaWZuZGVmIERhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldERhdGFSZWZFeHRlbnNpb24oZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFSZWZFeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGV4dGVuc2lvbjsKLQlPU1R5cGUgaWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgT1NUeXBlIGlkVHlwZTsKICNpZm5kZWYgRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSZWZFeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFSZWZFeHRlbnNpb24oZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFSZWZFeHRlbnNpb24oZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRNb3ZpZVdpdGhGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBpZDsKLQlzaG9ydCBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBzaG9ydCBpZDsKKyAgICBzaG9ydCBmbGFnczsKICNpZm5kZWYgRGF0YUhHZXRNb3ZpZVdpdGhGbGFncwotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWVXaXRoRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWVXaXRoRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0TW92aWVXaXRoRmxhZ3MoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGlkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRNb3ZpZVdpdGhGbGFncyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RmlsZVR5cGVPcmRlcmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlEYXRhSEZpbGVUeXBlT3JkZXJpbmdIYW5kbGUgb3JkZXJpbmdMaXN0SGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIERhdGFIRmlsZVR5cGVPcmRlcmluZ0hhbmRsZSBvcmRlcmluZ0xpc3RIYW5kbGU7CiAjaWZuZGVmIERhdGFIR2V0RmlsZVR5cGVPcmRlcmluZwotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZVR5cGVPcmRlcmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmcoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcmluZ0xpc3RIYW5kbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvcmRlcmluZ0xpc3RIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmcoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcmluZ0xpc3RIYW5kbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvcmRlcmluZ0xpc3RIYW5kbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlPU1R5cGUgY3JlYXRvcjsKLQlCb29sZWFuIGRlbGV0ZUV4aXN0aW5nOwotCVVJbnQzMiBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nOworICAgIFVJbnQzMiBmbGFnczsKICNpZm5kZWYgRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWxldGVFeGlzdGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVFeGlzdGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlRXhpc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRXhpc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIHdoYXQ7Ci0Jdm9pZCAqIGluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIHdoYXQ7CisgICAgdm9pZCAqIGluZm87CiAjaWZuZGVmIERhdGFIR2V0SW5mbwotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJndoYXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRJbmZvKGRoLAotCSAgICAgICAgICAgICAgICAgICB3aGF0LAotCSAgICAgICAgICAgICAgICAgICBpbmZvKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ3aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0SW5mbyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRJZGxlTWFuYWdlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlJZGxlTWFuYWdlciBpbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBJZGxlTWFuYWdlciBpbTsKICNpZm5kZWYgRGF0YUhTZXRJZGxlTWFuYWdlcgotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0SWRsZU1hbmFnZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldElkbGVNYW5hZ2VyKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJmltKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRJZGxlTWFuYWdlcihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSERlbGV0ZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIRGVsZXRlRmlsZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIRGVsZXRlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhEZWxldGVGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSERlbGV0ZUZpbGUoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSERlbGV0ZUZpbGUoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0TW92aWVVc2FnZUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldE1vdmllVXNhZ2VGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0TW92aWVVc2FnZUZsYWdzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGluRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBpbkZsYWdzOwogI2lmbmRlZiBEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgb3V0VW5kZXJzdG9vZEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgb3V0VW5kZXJzdG9vZEZsYWdzOwogI2lmbmRlZiBEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0VGVtcG9yYXJ5RGF0YVJlZkNhcGFiaWxpdGllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VW5kZXJzdG9vZEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRVbmRlcnN0b29kRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVbmRlcnN0b29kRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFVuZGVyc3Rvb2RGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhSZW5hbWVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBuZXdEYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBuZXdEYXRhUmVmOwogI2lmbmRlZiBEYXRhSFJlbmFtZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFJlbmFtZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIUmVuYW1lRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbmV3RGF0YVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUmVuYW1lRmlsZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld0RhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFJlbmFtZUZpbGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUGxheWJhY2tIaW50cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgbWluRmlsZU9mZnNldDsKLQl1bnNpZ25lZCBsb25nIG1heEZpbGVPZmZzZXQ7Ci0JbG9uZyBieXRlc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGxvbmcgbWluRmlsZU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heEZpbGVPZmZzZXQ7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgRGF0YUhQbGF5YmFja0hpbnRzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQbGF5YmFja0hpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFBsYXliYWNrSGludHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbkZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhGaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFBsYXliYWNrSGludHMoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5GaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbkZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhGaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFBsYXliYWNrSGludHMoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5GaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhQbGF5YmFja0hpbnRzNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBmbGFnczsKLQl3aWRlIG1pbkZpbGVPZmZzZXQ7Ci0Jd2lkZSBtYXhGaWxlT2Zmc2V0OwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmbGFnczsKKyAgICB3aWRlIG1pbkZpbGVPZmZzZXQ7CisgICAgd2lkZSBtYXhGaWxlT2Zmc2V0OworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIERhdGFIUGxheWJhY2tIaW50czY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQbGF5YmFja0hpbnRzNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIUGxheWJhY2tIaW50czY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1pbkZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtYXhGaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFBsYXliYWNrSGludHM2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluRmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4RmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWluRmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1heEZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIUGxheWJhY2tIaW50czY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5GaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhGaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBieXRlc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZsYWdzOworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIERhdGFIR2V0RGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFSYXRlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2Vjb25kKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXREYXRhUmF0ZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRUaW1lSGludHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGJhbmR3aWR0aFByaW9yaXR5OwotCVRpbWVTY2FsZSBzY2FsZTsKLQlUaW1lVmFsdWUgbWluVGltZTsKLQlUaW1lVmFsdWUgbWF4VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZsYWdzOworICAgIGxvbmcgYmFuZHdpZHRoUHJpb3JpdHk7CisgICAgVGltZVNjYWxlIHNjYWxlOworICAgIFRpbWVWYWx1ZSBtaW5UaW1lOworICAgIFRpbWVWYWx1ZSBtYXhUaW1lOwogI2lmbmRlZiBEYXRhSFNldFRpbWVIaW50cwotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0VGltZUhpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldFRpbWVIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhbmR3aWR0aFByaW9yaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5UaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4VGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0VGltZUhpbnRzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aFByaW9yaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG1pblRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYW5kd2lkdGhQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldFRpbWVIaW50cyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kd2lkdGhQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TWF4U3JjUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBpbnB1dFN0ZDsKLQlSZWN0IG1heFNyY1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXRTdGQ7CisgICAgUmVjdCBtYXhTcmNSZWN0OwogI2lmbmRlZiBWREdldE1heFNyY1JlY3QKLQlQeU1hY19QUkVDSEVDSyhWREdldE1heFNyY1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0TWF4U3JjUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRNYXhTcmNSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNyY1JlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZtYXhTcmNSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRNYXhTcmNSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNyY1JlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZtYXhTcmNSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEFjdGl2ZVNyY1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRTdGQ7Ci0JUmVjdCBhY3RpdmVTcmNSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGlucHV0U3RkOworICAgIFJlY3QgYWN0aXZlU3JjUmVjdDsKICNpZm5kZWYgVkRHZXRBY3RpdmVTcmNSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRBY3RpdmVTcmNSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEFjdGl2ZVNyY1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0ZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0QWN0aXZlU3JjUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVTcmNSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYWN0aXZlU3JjUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0ZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0QWN0aXZlU3JjUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVTcmNSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYWN0aXZlU3JjUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXREaWdpdGl6ZXJSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVJlY3QgZGlnaXRpemVyUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRpZ2l0aXplclJlY3Q7CiAjaWZuZGVmIFZEU2V0RGlnaXRpemVyUmVjdAotCVB5TWFjX1BSRUNIRUNLKFZEU2V0RGlnaXRpemVyUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXREaWdpdGl6ZXJSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldERpZ2l0aXplclJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkaWdpdGl6ZXJSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGlnaXRpemVyUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RGlnaXRpemVyUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpZ2l0aXplclJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkaWdpdGl6ZXJSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldERpZ2l0aXplclJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUmVjdCBkaWdpdGl6ZXJSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJlY3QgZGlnaXRpemVyUmVjdDsKICNpZm5kZWYgVkRHZXREaWdpdGl6ZXJSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXREaWdpdGl6ZXJSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldERpZ2l0aXplclJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0RGlnaXRpemVyUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmRpZ2l0aXplclJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkaWdpdGl6ZXJSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXREaWdpdGl6ZXJSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlnaXRpemVyUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRpZ2l0aXplclJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0VkJsYW5rUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBpbnB1dFN0ZDsKLQlSZWN0IHZCbGFua1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXRTdGQ7CisgICAgUmVjdCB2QmxhbmtSZWN0OwogI2lmbmRlZiBWREdldFZCbGFua1JlY3QKLQlQeU1hY19QUkVDSEVDSyhWREdldFZCbGFua1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0VkJsYW5rUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRWQmxhbmtSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZCbGFua1JlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ2QmxhbmtSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRWQmxhbmtSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZCbGFua1JlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ2QmxhbmtSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldE1hc2tQaXhNYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUGl4TWFwSGFuZGxlIG1hc2tQaXhNYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgUGl4TWFwSGFuZGxlIG1hc2tQaXhNYXA7CiAjaWZuZGVmIFZER2V0TWFza1BpeE1hcAotCVB5TWFjX1BSRUNIRUNLKFZER2V0TWFza1BpeE1hcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRNYXNrUGl4TWFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZtYXNrUGl4TWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRNYXNrUGl4TWFwKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBtYXNrUGl4TWFwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWFza1BpeE1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0TWFza1BpeE1hcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1BpeE1hcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRVc2VUaGlzQ0xVVChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlDVGFiSGFuZGxlIGNvbG9yVGFibGVIYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlOwogI2lmbmRlZiBWRFVzZVRoaXNDTFVUCi0JUHlNYWNfUFJFQ0hFQ0soVkRVc2VUaGlzQ0xVVCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRVc2VUaGlzQ0xVVCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29sb3JUYWJsZUhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEVXNlVGhpc0NMVVQoY2ksCi0JICAgICAgICAgICAgICAgICAgICBjb2xvclRhYmxlSGFuZGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29sb3JUYWJsZUhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEVXNlVGhpc0NMVVQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclRhYmxlSGFuZGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldElucHV0R2FtbWFWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlGaXhlZCBjaGFubmVsMTsKLQlGaXhlZCBjaGFubmVsMjsKLQlGaXhlZCBjaGFubmVsMzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBGaXhlZCBjaGFubmVsMTsKKyAgICBGaXhlZCBjaGFubmVsMjsKKyAgICBGaXhlZCBjaGFubmVsMzsKICNpZm5kZWYgVkRTZXRJbnB1dEdhbW1hVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhWRFNldElucHV0R2FtbWFWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dEdhbW1hVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0SW5wdXRHYW1tYVZhbHVlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmNoYW5uZWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmNoYW5uZWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmNoYW5uZWwzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRJbnB1dEdhbW1hVmFsdWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0SW5wdXRHYW1tYVZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUZpeGVkIGNoYW5uZWwxOwotCUZpeGVkIGNoYW5uZWwyOwotCUZpeGVkIGNoYW5uZWwzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEZpeGVkIGNoYW5uZWwxOworICAgIEZpeGVkIGNoYW5uZWwyOworICAgIEZpeGVkIGNoYW5uZWwzOwogI2lmbmRlZiBWREdldElucHV0R2FtbWFWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SW5wdXRHYW1tYVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0R2FtbWFWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRJbnB1dEdhbW1hVmFsdWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWwxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsMiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbDMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDEsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldElucHV0R2FtbWFWYWx1ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsMyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBjaGFubmVsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBjaGFubmVsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBjaGFubmVsMyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRCcmlnaHRuZXNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzczsKICNpZm5kZWYgVkRTZXRCcmlnaHRuZXNzCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRCcmlnaHRuZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldEJyaWdodG5lc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0QnJpZ2h0bmVzcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJyaWdodG5lc3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldEJyaWdodG5lc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZicmlnaHRuZXNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEJyaWdodG5lc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzOwogI2lmbmRlZiBWREdldEJyaWdodG5lc3MKLQlQeU1hY19QUkVDSEVDSyhWREdldEJyaWdodG5lc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0QnJpZ2h0bmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRCcmlnaHRuZXNzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnJpZ2h0bmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0QnJpZ2h0bmVzcyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyaWdodG5lc3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q29udHJhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CiAjaWZuZGVmIFZEU2V0Q29udHJhc3QKLQlQeU1hY19QUkVDSEVDSyhWRFNldENvbnRyYXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldENvbnRyYXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldENvbnRyYXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0Q29udHJhc3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJhc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldEh1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBodWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgaHVlOwogI2lmbmRlZiBWRFNldEh1ZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0SHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldEh1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRIdWUoY2ksCi0JICAgICAgICAgICAgICAgJmh1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRIdWUoY2ksCisgICAgICAgICAgICAgICAgICAgJmh1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFNoYXJwbmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOwogI2lmbmRlZiBWRFNldFNoYXJwbmVzcwotCVB5TWFjX1BSRUNIRUNLKFZEU2V0U2hhcnBuZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldFNoYXJwbmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRTaGFycG5lc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRTaGFycG5lc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFNhdHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uOwogI2lmbmRlZiBWRFNldFNhdHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhWRFNldFNhdHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0U2F0dXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRTYXR1cmF0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0U2F0dXJhdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0Q29udHJhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CiAjaWZuZGVmIFZER2V0Q29udHJhc3QKLQlQeU1hY19QUkVDSEVDSyhWREdldENvbnRyYXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldENvbnRyYXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldENvbnRyYXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0Q29udHJhc3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJhc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEh1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBodWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgaHVlOwogI2lmbmRlZiBWREdldEh1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEh1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRIdWUoY2ksCi0JICAgICAgICAgICAgICAgJmh1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRIdWUoY2ksCisgICAgICAgICAgICAgICAgICAgJmh1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFNoYXJwbmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOwogI2lmbmRlZiBWREdldFNoYXJwbmVzcwotCVB5TWFjX1BSRUNIRUNLKFZER2V0U2hhcnBuZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFNoYXJwbmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRTaGFycG5lc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRTaGFycG5lc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFNhdHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uOwogI2lmbmRlZiBWREdldFNhdHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhWREdldFNhdHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0U2F0dXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRTYXR1cmF0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0U2F0dXJhdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER3JhYk9uZUZyYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwogI2lmbmRlZiBWREdyYWJPbmVGcmFtZQotCVB5TWFjX1BSRUNIRUNLKFZER3JhYk9uZUZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdyYWJPbmVGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHcmFiT25lRnJhbWUoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdyYWJPbmVGcmFtZShjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRNYXhBdXhCdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUGl4TWFwSGFuZGxlIHBtOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgUmVjdCByOwogI2lmbmRlZiBWREdldE1heEF1eEJ1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKFZER2V0TWF4QXV4QnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldE1heEF1eEJ1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRNYXhBdXhCdWZmZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnBtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwbSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRNYXhBdXhCdWZmZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEN1cnJlbnRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGlucHV0Q3VycmVudEZsYWc7Ci0JbG9uZyBvdXRwdXRDdXJyZW50RmxhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBsb25nIGlucHV0Q3VycmVudEZsYWc7CisgICAgbG9uZyBvdXRwdXRDdXJyZW50RmxhZzsKICNpZm5kZWYgVkRHZXRDdXJyZW50RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhWREdldEN1cnJlbnRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRDdXJyZW50RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q3VycmVudEZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dEN1cnJlbnRGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRDdXJyZW50RmxhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlucHV0Q3VycmVudEZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q3VycmVudEZsYWcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEN1cnJlbnRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRDdXJyZW50RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q3VycmVudEZsYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEN1cnJlbnRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEN1cnJlbnRGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldEtleUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgVkRTZXRLZXlDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFZEU2V0S2V5Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0S2V5Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0S2V5Q29sb3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0S2V5Q29sb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRLZXlDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIFZER2V0S2V5Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhWREdldEtleUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEtleUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEtleUNvbG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0S2V5Q29sb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREFkZEtleUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgVkRBZGRLZXlDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFZEQWRkS2V5Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEQWRkS2V5Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEQWRkS2V5Q29sb3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICAmaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRBZGRLZXlDb2xvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TmV4dEtleUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgVkRHZXROZXh0S2V5Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhWREdldE5leHRLZXlDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXROZXh0S2V5Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0TmV4dEtleUNvbG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXROZXh0S2V5Q29sb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0S2V5Q29sb3JSYW5nZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlSR0JDb2xvciBtaW5SR0I7Ci0JUkdCQ29sb3IgbWF4UkdCOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJHQkNvbG9yIG1pblJHQjsKKyAgICBSR0JDb2xvciBtYXhSR0I7CiAjaWZuZGVmIFZEU2V0S2V5Q29sb3JSYW5nZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0S2V5Q29sb3JSYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRLZXlDb2xvclJhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEtleUNvbG9yUmFuZ2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldEtleUNvbG9yUmFuZ2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0S2V5Q29sb3JSYW5nZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlSR0JDb2xvciBtaW5SR0I7Ci0JUkdCQ29sb3IgbWF4UkdCOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJHQkNvbG9yIG1pblJHQjsKKyAgICBSR0JDb2xvciBtYXhSR0I7CiAjaWZuZGVmIFZER2V0S2V5Q29sb3JSYW5nZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0S2V5Q29sb3JSYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRLZXlDb2xvclJhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEtleUNvbG9yUmFuZ2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEtleUNvbG9yUmFuZ2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBjb2xvclNwYWNlTW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBjb2xvclNwYWNlTW9kZTsKICNpZm5kZWYgVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldElucHV0Q29sb3JTcGFjZU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xvclNwYWNlTW9kZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU1vZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JTcGFjZU1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldElucHV0Q29sb3JTcGFjZU1vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2VNb2RlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0Q29sb3JTcGFjZU1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgY29sb3JTcGFjZU1vZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgY29sb3JTcGFjZU1vZGU7CiAjaWZuZGVmIFZER2V0SW5wdXRDb2xvclNwYWNlTW9kZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SW5wdXRDb2xvclNwYWNlTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldElucHV0Q29sb3JTcGFjZU1vZGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclNwYWNlTW9kZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU1vZGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldElucHV0Q29sb3JTcGFjZU1vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclNwYWNlTW9kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU1vZGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q2xpcFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGNsaXBFbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgY2xpcEVuYWJsZTsKICNpZm5kZWYgVkRTZXRDbGlwU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhWRFNldENsaXBTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRDbGlwU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZjbGlwRW5hYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRDbGlwU3RhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgY2xpcEVuYWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGlwRW5hYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRDbGlwU3RhdGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcEVuYWJsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRDbGlwU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgY2xpcEVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBjbGlwRW5hYmxlOwogI2lmbmRlZiBWREdldENsaXBTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0Q2xpcFN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldENsaXBTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRDbGlwU3RhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJmNsaXBFbmFibGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNsaXBFbmFibGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldENsaXBTdGF0ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpcEVuYWJsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcEVuYWJsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRDbGlwUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVJnbkhhbmRsZSBjbGlwUmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJnbkhhbmRsZSBjbGlwUmVnaW9uOwogI2lmbmRlZiBWRFNldENsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhWRFNldENsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0Q2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0Q2xpcFJnbihjaSwKLQkgICAgICAgICAgICAgICAgICAgY2xpcFJlZ2lvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldENsaXBSZ24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZWdpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEQ2xlYXJDbGlwUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVJnbkhhbmRsZSBjbGlwUmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJnbkhhbmRsZSBjbGlwUmVnaW9uOwogI2lmbmRlZiBWRENsZWFyQ2xpcFJnbgotCVB5TWFjX1BSRUNIRUNLKFZEQ2xlYXJDbGlwUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRENsZWFyQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEQ2xlYXJDbGlwUmduKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIGNsaXBSZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRDbGVhckNsaXBSZ24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFJlZ2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRDTFVUSW5Vc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZTsKICNpZm5kZWYgVkRHZXRDTFVUSW5Vc2UKLQlQeU1hY19QUkVDSEVDSyhWREdldENMVVRJblVzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRDTFVUSW5Vc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q0xVVEluVXNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICZjb2xvclRhYmxlSGFuZGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29sb3JUYWJsZUhhbmRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0Q0xVVEluVXNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclRhYmxlSGFuZGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29sb3JUYWJsZUhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRQTExGaWx0ZXJUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IHBsbFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgcGxsVHlwZTsKICNpZm5kZWYgVkRTZXRQTExGaWx0ZXJUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRQTExGaWx0ZXJUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldFBMTEZpbHRlclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZwbGxUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQTExGaWx0ZXJUeXBlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwbGxUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsbFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFBMTEZpbHRlclR5cGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsbFR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0UExMRmlsdGVyVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBwbGxUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IHBsbFR5cGU7CiAjaWZuZGVmIFZER2V0UExMRmlsdGVyVHlwZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0UExMRmlsdGVyVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRQTExGaWx0ZXJUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFBMTEZpbHRlclR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZwbGxUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwbGxUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRQTExGaWx0ZXJUeXBlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGxsVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGxsVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRNYXNrYW5kVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbDsKLQlsb25nIG1hc2s7Ci0JbG9uZyB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBibGVuZExldmVsOworICAgIGxvbmcgbWFzazsKKyAgICBsb25nIHZhbHVlOwogI2lmbmRlZiBWREdldE1hc2thbmRWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0TWFza2FuZFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldE1hc2thbmRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJsZW5kTGV2ZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldE1hc2thbmRWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBibGVuZExldmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZtYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxlbmRMZXZlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0TWFza2FuZFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRNYXN0ZXJCbGVuZExldmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGJsZW5kTGV2ZWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbDsKICNpZm5kZWYgVkRTZXRNYXN0ZXJCbGVuZExldmVsCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRNYXN0ZXJCbGVuZExldmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldE1hc3RlckJsZW5kTGV2ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0TWFzdGVyQmxlbmRMZXZlbChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsZW5kTGV2ZWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJsZW5kTGV2ZWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldE1hc3RlckJsZW5kTGV2ZWwoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGVuZExldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZExldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFBsYXlUaHJ1T25PZmYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgc3RhdGU7CiAjaWZuZGVmIFZEU2V0UGxheVRocnVPbk9mZgotCVB5TWFjX1BSRUNIRUNLKFZEU2V0UGxheVRocnVPbk9mZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRQbGF5VGhydU9uT2ZmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldFBsYXlUaHJ1T25PZmYoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRQbGF5VGhydU9uT2ZmKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRGaWVsZFByZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgZmllbGRGbGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGZpZWxkRmxhZzsKICNpZm5kZWYgVkRTZXRGaWVsZFByZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhWRFNldEZpZWxkUHJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRGaWVsZFByZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZmaWVsZEZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEZpZWxkUHJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEZsYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRGbGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRGaWVsZFByZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGbGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEZpZWxkUHJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBmaWVsZEZsYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgZmllbGRGbGFnOwogI2lmbmRlZiBWREdldEZpZWxkUHJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0RmllbGRQcmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEZpZWxkUHJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRGaWVsZFByZWZlcmVuY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkRmxhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmllbGRGbGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRGaWVsZFByZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkRmxhZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFByZWZsaWdodEdsb2JhbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JR3JhZlB0ciB0aGVXaW5kb3c7Ci0JUmVjdCBnbG9iYWxSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEdyYWZQdHIgdGhlV2luZG93OworICAgIFJlY3QgZ2xvYmFsUmVjdDsKICNpZm5kZWYgVkRQcmVmbGlnaHRHbG9iYWxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRQcmVmbGlnaHRHbG9iYWxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFByZWZsaWdodEdsb2JhbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFByZWZsaWdodEdsb2JhbFJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZnbG9iYWxSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnRoZVdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEUHJlZmxpZ2h0R2xvYmFsUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmdsb2JhbFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0UGxheVRocnVHbG9iYWxSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUdyYWZQdHIgdGhlV2luZG93OwotCVJlY3QgZ2xvYmFsUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBHcmFmUHRyIHRoZVdpbmRvdzsKKyAgICBSZWN0IGdsb2JhbFJlY3Q7CiAjaWZuZGVmIFZEU2V0UGxheVRocnVHbG9iYWxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRQbGF5VGhydUdsb2JhbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0UGxheVRocnVHbG9iYWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQbGF5VGhydUdsb2JhbFJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZ2xvYmFsUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFBsYXlUaHJ1R2xvYmFsUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZnbG9iYWxSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldEJsYWNrTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWw7CiAjaWZuZGVmIFZEU2V0QmxhY2tMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRCbGFja0xldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0QmxhY2tMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEJsYWNrTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0QmxhY2tMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGFja0xldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGFja0xldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEJsYWNrTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWw7CiAjaWZuZGVmIFZER2V0QmxhY2tMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRCbGFja0xldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0QmxhY2tMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEJsYWNrTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0QmxhY2tMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGFja0xldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGFja0xldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFdoaXRlTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWw7CiAjaWZuZGVmIFZEU2V0V2hpdGVMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRXaGl0ZUxldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0V2hpdGVMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldFdoaXRlTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpdGVMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgd2hpdGVMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0V2hpdGVMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGl0ZUxldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZUxldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFdoaXRlTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWw7CiAjaWZuZGVmIFZER2V0V2hpdGVMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRXaGl0ZUxldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0V2hpdGVMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFdoaXRlTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpdGVMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgd2hpdGVMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0V2hpdGVMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGl0ZUxldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZUxldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFZpZGVvRGVmYXVsdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbDsKLQl1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOwotCXVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3M7Ci0JdW5zaWduZWQgc2hvcnQgaHVlOwotCXVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb247Ci0JdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7Ci0JdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWw7CisgICAgdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzOworICAgIHVuc2lnbmVkIHNob3J0IGh1ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uOworICAgIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0OworICAgIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzczsKICNpZm5kZWYgVkRHZXRWaWRlb0RlZmF1bHRzCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRWaWRlb0RlZmF1bHRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFZpZGVvRGVmYXVsdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0VmlkZW9EZWZhdWx0cyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrTGV2ZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGl0ZUxldmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYnJpZ2h0bmVzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmh1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cmFzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxISEhISEhIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCwKLQkgICAgICAgICAgICAgICAgICAgICB3aGl0ZUxldmVsLAotCSAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MsCi0JICAgICAgICAgICAgICAgICAgICAgaHVlLAotCSAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgY29udHJhc3QsCi0JICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRWaWRlb0RlZmF1bHRzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaXRlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZicmlnaHRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhcnBuZXNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEhISEhISEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGFja0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBodWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaGFycG5lc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TnVtYmVyT2ZJbnB1dHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGlucHV0czsKICNpZm5kZWYgVkRHZXROdW1iZXJPZklucHV0cwotCVB5TWFjX1BSRUNIRUNLKFZER2V0TnVtYmVyT2ZJbnB1dHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0TnVtYmVyT2ZJbnB1dHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0TnVtYmVyT2ZJbnB1dHMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnB1dHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldE51bWJlck9mSW5wdXRzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0cyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0Rm9ybWF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGlucHV0OwotCXNob3J0IGZvcm1hdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBpbnB1dDsKKyAgICBzaG9ydCBmb3JtYXQ7CiAjaWZuZGVmIFZER2V0SW5wdXRGb3JtYXQKLQlQeU1hY19QUkVDSEVDSyhWREdldElucHV0Rm9ybWF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0Rm9ybWF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldElucHV0Rm9ybWF0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldElucHV0Rm9ybWF0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0SW5wdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXQ7CiAjaWZuZGVmIFZEU2V0SW5wdXQKLQlQeU1hY19QUkVDSEVDSyhWRFNldElucHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldElucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldElucHV0KGNpLAotCSAgICAgICAgICAgICAgICAgaW5wdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldElucHV0KGNpLAorICAgICAgICAgICAgICAgICAgICAgaW5wdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0SW5wdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXQ7CiAjaWZuZGVmIFZER2V0SW5wdXQKLQlQeU1hY19QUkVDSEVDSyhWREdldElucHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldElucHV0KGNpLAotCSAgICAgICAgICAgICAgICAgJmlucHV0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnB1dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0SW5wdXQoY2ksCisgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldElucHV0U3RhbmRhcmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRTdGFuZGFyZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBpbnB1dFN0YW5kYXJkOwogI2lmbmRlZiBWRFNldElucHV0U3RhbmRhcmQKLQlQeU1hY19QUkVDSEVDSyhWRFNldElucHV0U3RhbmRhcmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0SW5wdXRTdGFuZGFyZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RhbmRhcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldElucHV0U3RhbmRhcmQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RhbmRhcmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRTdGFuZGFyZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0SW5wdXRTdGFuZGFyZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGFuZGFyZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXR1cEJ1ZmZlcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVmRpZ0J1ZmZlclJlY0xpc3RIYW5kbGUgYnVmZmVyTGlzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBWZGlnQnVmZmVyUmVjTGlzdEhhbmRsZSBidWZmZXJMaXN0OwogI2lmbmRlZiBWRFNldHVwQnVmZmVycwotCVB5TWFjX1BSRUNIRUNLKFZEU2V0dXBCdWZmZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldHVwQnVmZmVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYnVmZmVyTGlzdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0dXBCdWZmZXJzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckxpc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZidWZmZXJMaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXR1cEJ1ZmZlcnMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTGlzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHcmFiT25lRnJhbWVBc3luYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBidWZmZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgYnVmZmVyOwogI2lmbmRlZiBWREdyYWJPbmVGcmFtZUFzeW5jCi0JUHlNYWNfUFJFQ0hFQ0soVkRHcmFiT25lRnJhbWVBc3luYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHcmFiT25lRnJhbWVBc3luYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER3JhYk9uZUZyYW1lQXN5bmMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHcmFiT25lRnJhbWVBc3luYyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkREb25lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBidWZmZXI7CiAjaWZuZGVmIFZERG9uZQotCVB5TWFjX1BSRUNIRUNLKFZERG9uZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkREb25lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkREb25lKGNpLAotCSAgICAgICAgICAgICBidWZmZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkREb25lKGNpLAorICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q29tcHJlc3Npb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JT1NUeXBlIGNvbXByZXNzVHlwZTsKLQlzaG9ydCBkZXB0aDsKLQlSZWN0IGJvdW5kczsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7Ci0JQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKLQlsb25nIGtleUZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgY29tcHJlc3NUeXBlOworICAgIHNob3J0IGRlcHRoOworICAgIFJlY3QgYm91bmRzOworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKKyAgICBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OworICAgIGxvbmcga2V5RnJhbWVSYXRlOwogI2lmbmRlZiBWRFNldENvbXByZXNzaW9uCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb21wcmVzc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb21wcmVzc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAma2V5RnJhbWVSYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRDb21wcmVzc2lvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5RnJhbWVSYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRDb21wcmVzc2lvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRENvbXByZXNzT25lRnJhbWVBc3luYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKICNpZm5kZWYgVkRDb21wcmVzc09uZUZyYW1lQXN5bmMKLQlQeU1hY19QUkVDSEVDSyhWRENvbXByZXNzT25lRnJhbWVBc3luYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRDb21wcmVzc09uZUZyYW1lQXN5bmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jKGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRDb21wcmVzc09uZUZyYW1lQXN5bmMoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0SW1hZ2VEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBWREdldEltYWdlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhWREdldEltYWdlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0SW1hZ2VEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0SW1hZ2VEZXNjcmlwdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEltYWdlRGVzY3JpcHRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEUmVzZXRDb21wcmVzc1NlcXVlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwogI2lmbmRlZiBWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZQotCVB5TWFjX1BSRUNIRUNLKFZEUmVzZXRDb21wcmVzc1NlcXVlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRSZXNldENvbXByZXNzU2VxdWVuY2UoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZShjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRDb21wcmVzc2lvbk9uT2ZmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUJvb2xlYW4gc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBzdGF0ZTsKICNpZm5kZWYgVkRTZXRDb21wcmVzc2lvbk9uT2ZmCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb21wcmVzc2lvbk9uT2ZmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldENvbXByZXNzaW9uT25PZmYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0Q29tcHJlc3Npb25Pbk9mZihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldENvbXByZXNzaW9uT25PZmYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldENvbXByZXNzaW9uVHlwZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVkRDb21wcmVzc2lvbkxpc3RIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBWRENvbXByZXNzaW9uTGlzdEhhbmRsZSBoOwogI2lmbmRlZiBWREdldENvbXByZXNzaW9uVHlwZXMKLQlQeU1hY19QUkVDSEVDSyhWREdldENvbXByZXNzaW9uVHlwZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0Q29tcHJlc3Npb25UeXBlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q29tcHJlc3Npb25UeXBlcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldENvbXByZXNzaW9uVHlwZXMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0VGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVGltZUJhc2UgdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBUaW1lQmFzZSB0OwogI2lmbmRlZiBWRFNldFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRUaW1lQmFzZShjaSwKLQkgICAgICAgICAgICAgICAgICAgIHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFRpbWVCYXNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRGcmFtZVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JRml4ZWQgZnJhbWVzUGVyU2Vjb25kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEZpeGVkIGZyYW1lc1BlclNlY29uZDsKICNpZm5kZWYgVkRTZXRGcmFtZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhWRFNldEZyYW1lUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRGcmFtZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmZyYW1lc1BlclNlY29uZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0RnJhbWVSYXRlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmZyYW1lc1BlclNlY29uZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RnJhbWVSYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXREYXRhUmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIG1pbGxpU2VjUGVyRnJhbWU7Ci0JRml4ZWQgZnJhbWVzUGVyU2Vjb25kOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBtaWxsaVNlY1BlckZyYW1lOworICAgIEZpeGVkIGZyYW1lc1BlclNlY29uZDsKKyAgICBsb25nIGJ5dGVzUGVyU2Vjb25kOwogI2lmbmRlZiBWREdldERhdGFSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXREYXRhUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXREYXRhUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXREYXRhUmF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICZtaWxsaVNlY1BlckZyYW1lLAotCSAgICAgICAgICAgICAgICAgICAgJmZyYW1lc1BlclNlY29uZCwKLQkgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNQZXJGcmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBmcmFtZXNQZXJTZWNvbmQsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldERhdGFSYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpU2VjUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVzUGVyU2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaVNlY1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGZyYW1lc1BlclNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRTb3VuZElucHV0RHJpdmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVN0cjI1NSBzb3VuZERyaXZlck5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgU3RyMjU1IHNvdW5kRHJpdmVyTmFtZTsKICNpZm5kZWYgVkRHZXRTb3VuZElucHV0RHJpdmVyCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRTb3VuZElucHV0RHJpdmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFNvdW5kSW5wdXREcml2ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHNvdW5kRHJpdmVyTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0U291bmRJbnB1dERyaXZlcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmREcml2ZXJOYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc291bmREcml2ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRTb3VuZElucHV0RHJpdmVyKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZERyaXZlck5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0RE1BRGVwdGhzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgZGVwdGhBcnJheTsKLQlsb25nIHByZWZlcnJlZERlcHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgZGVwdGhBcnJheTsKKyAgICBsb25nIHByZWZlcnJlZERlcHRoOwogI2lmbmRlZiBWREdldERNQURlcHRocwotCVB5TWFjX1BSRUNIRUNLKFZER2V0RE1BRGVwdGhzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldERNQURlcHRocyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRETUFEZXB0aHMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJmRlcHRoQXJyYXksCi0JICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZERlcHRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZGVwdGhBcnJheSwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWREZXB0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0RE1BRGVwdGhzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWREZXB0aCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkRGVwdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0UHJlZmVycmVkVGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVRpbWVTY2FsZSBwcmVmZXJyZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgVGltZVNjYWxlIHByZWZlcnJlZDsKICNpZm5kZWYgVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhWREdldFByZWZlcnJlZFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0UHJlZmVycmVkVGltZVNjYWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0UHJlZmVycmVkVGltZVNjYWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRSZWxlYXNlQXN5bmNCdWZmZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwogI2lmbmRlZiBWRFJlbGVhc2VBc3luY0J1ZmZlcnMKLQlQeU1hY19QUkVDSEVDSyhWRFJlbGVhc2VBc3luY0J1ZmZlcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEUmVsZWFzZUFzeW5jQnVmZmVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRSZWxlYXNlQXN5bmNCdWZmZXJzKGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRSZWxlYXNlQXN5bmNCdWZmZXJzKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldERhdGFSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgVkRTZXREYXRhUmF0ZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0RGF0YVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0RGF0YVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0RGF0YVJhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RGF0YVJhdGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRUaW1lQ29kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlUaW1lUmVjb3JkIGF0VGltZTsKLQl2b2lkICogdGltZUNvZGVGb3JtYXQ7Ci0Jdm9pZCAqIHRpbWVDb2RlVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBUaW1lUmVjb3JkIGF0VGltZTsKKyAgICB2b2lkICogdGltZUNvZGVGb3JtYXQ7CisgICAgdm9pZCAqIHRpbWVDb2RlVGltZTsKICNpZm5kZWYgVkRHZXRUaW1lQ29kZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0VGltZUNvZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0VGltZUNvZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZUNvZGVGb3JtYXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lQ29kZVRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFRpbWVDb2RlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgIHRpbWVDb2RlRm9ybWF0LAotCSAgICAgICAgICAgICAgICAgICAgdGltZUNvZGVUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmF0VGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZUNvZGVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lQ29kZVRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldFRpbWVDb2RlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVDb2RlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZUNvZGVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmF0VGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRVc2VTYWZlQnVmZmVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlCb29sZWFuIHVzZVNhZmVCdWZmZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gdXNlU2FmZUJ1ZmZlcnM7CiAjaWZuZGVmIFZEVXNlU2FmZUJ1ZmZlcnMKLQlQeU1hY19QUkVDSEVDSyhWRFVzZVNhZmVCdWZmZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFVzZVNhZmVCdWZmZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXNlU2FmZUJ1ZmZlcnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFVzZVNhZmVCdWZmZXJzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgdXNlU2FmZUJ1ZmZlcnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlU2FmZUJ1ZmZlcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFVzZVNhZmVCdWZmZXJzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU2FmZUJ1ZmZlcnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0U291bmRJbnB1dFNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIHZpZGVvSW5wdXQ7Ci0JbG9uZyBzb3VuZElucHV0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgdmlkZW9JbnB1dDsKKyAgICBsb25nIHNvdW5kSW5wdXQ7CiAjaWZuZGVmIFZER2V0U291bmRJbnB1dFNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0U291bmRJbnB1dFNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRTb3VuZElucHV0U291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0U291bmRJbnB1dFNvdXJjZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdW5kSW5wdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNvdW5kSW5wdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0U291bmRJbnB1dFNvdXJjZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdW5kSW5wdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kSW5wdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0Q29tcHJlc3Npb25UaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCU9TVHlwZSBjb21wcmVzc2lvblR5cGU7Ci0Jc2hvcnQgZGVwdGg7Ci0JUmVjdCBzcmNSZWN0OwotCUNvZGVjUSBzcGF0aWFsUXVhbGl0eTsKLQlDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OwotCXVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIE9TVHlwZSBjb21wcmVzc2lvblR5cGU7CisgICAgc2hvcnQgZGVwdGg7CisgICAgUmVjdCBzcmNSZWN0OworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKKyAgICBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OworICAgIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lOwogI2lmbmRlZiBWREdldENvbXByZXNzaW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0Q29tcHJlc3Npb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldENvbXByZXNzaW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q29tcHJlc3Npb25UaW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0Q29tcHJlc3Npb25UaW1lKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFByZWZlcnJlZFBhY2tldFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzOwogI2lmbmRlZiBWRFNldFByZWZlcnJlZFBhY2tldFNpemUKLQlQeU1hY19QUkVDSEVDSyhWRFNldFByZWZlcnJlZFBhY2tldFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgd2lkdGg7Ci0JbG9uZyBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyB3aWR0aDsKKyAgICBsb25nIGhlaWdodDsKICNpZm5kZWYgVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhWRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIHdpZHRoOwotCWxvbmcgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgd2lkdGg7CisgICAgbG9uZyBoZWlnaHQ7CiAjaWZuZGVmIFZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0TmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIHZpZGVvSW5wdXQ7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyB2aWRlb0lucHV0OworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBWREdldElucHV0TmFtZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SW5wdXROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRJbnB1dE5hbWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRJbnB1dE5hbWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldERlc3RpbmF0aW9uUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlDR3JhZlB0ciBkZXN0UG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBDR3JhZlB0ciBkZXN0UG9ydDsKICNpZm5kZWYgVkRTZXREZXN0aW5hdGlvblBvcnQKLQlQeU1hY19QUkVDSEVDSyhWRFNldERlc3RpbmF0aW9uUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXREZXN0aW5hdGlvblBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZkZXN0UG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0RGVzdGluYXRpb25Qb3J0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmRlc3RQb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXREZXN0aW5hdGlvblBvcnQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0RGV2aWNlTmFtZUFuZEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVN0cjI1NSBvdXROYW1lOwotCVVJbnQzMiBvdXROYW1lRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgU3RyMjU1IG91dE5hbWU7CisgICAgVUludDMyIG91dE5hbWVGbGFnczsKICNpZm5kZWYgVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhWREdldERldmljZU5hbWVBbmRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG91dE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldERldmljZU5hbWVBbmRGbGFncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROYW1lRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG91dE5hbWVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG91dE5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldERldmljZU5hbWVBbmRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROYW1lRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE5hbWVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlVSW50MzIgaW5TdGF0ZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFVJbnQzMiBpblN0YXRlRmxhZ3M7CiAjaWZuZGVmIFZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmcKLQlQeU1hY19QUkVDSEVDSyhWRENhcHR1cmVTdGF0ZUNoYW5naW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRENhcHR1cmVTdGF0ZUNoYW5naW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRENhcHR1cmVTdGF0ZUNoYW5naW5nKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUdldERldGFpbGVkUGFyc2VFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCWxvbmcgZXJyb3JMaW5lOwotCVN0cmluZ1B0ciBlcnJEZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgbG9uZyBlcnJvckxpbmU7CisgICAgU3RyaW5nUHRyIGVyckRlc2M7CiAjaWZuZGVmIFhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlcnJEZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JMaW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGVycm9yTGluZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyckRlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUdldERldGFpbGVkUGFyc2VFcnJvcihhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvckxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyRGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JMaW5lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZEVsZW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQljaGFyIGVsZW1lbnROYW1lOwotCVVJbnQzMiBuYW1lU3BhY2VJRDsKLQlVSW50MzIgZWxlbWVudElEOwotCWxvbmcgZWxlbWVudEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgY2hhciBlbGVtZW50TmFtZTsKKyAgICBVSW50MzIgbmFtZVNwYWNlSUQ7CisgICAgVUludDMyIGVsZW1lbnRJRDsKKyAgICBsb25nIGVsZW1lbnRGbGFnczsKICNpZm5kZWYgWE1MUGFyc2VBZGRFbGVtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRFbGVtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEVsZW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFhNTFBhcnNlQWRkRWxlbWVudChhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2wiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZEVsZW1lbnQoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCVVJbnQzMiBlbGVtZW50SUQ7Ci0JVUludDMyIG5hbWVTcGFjZUlEOwotCWNoYXIgYXR0cmlidXRlTmFtZTsKLQlVSW50MzIgYXR0cmlidXRlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKKyAgICBVSW50MzIgZWxlbWVudElEOworICAgIFVJbnQzMiBuYW1lU3BhY2VJRDsKKyAgICBjaGFyIGF0dHJpYnV0ZU5hbWU7CisgICAgVUludDMyIGF0dHJpYnV0ZUlEOwogI2lmbmRlZiBYTUxQYXJzZUFkZEF0dHJpYnV0ZQotCVB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkQXR0cmlidXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVTcGFjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VBZGRBdHRyaWJ1dGUoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlQWRkQXR0cmlidXRlKGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1hNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7Ci0JVUludDMyIGVsZW1lbnRJRDsKLQlVSW50MzIgbmFtZVNwYWNlSURzOwotCWNoYXIgYXR0cmlidXRlTmFtZXM7Ci0JVUludDMyIGF0dHJpYnV0ZUlEczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIFVJbnQzMiBlbGVtZW50SUQ7CisgICAgVUludDMyIG5hbWVTcGFjZUlEczsKKyAgICBjaGFyIGF0dHJpYnV0ZU5hbWVzOworICAgIFVJbnQzMiBhdHRyaWJ1dGVJRHM7CiAjaWZuZGVmIFhNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRNdWx0aXBsZUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyhhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSURzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlSURzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlEcywKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lcywKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyhhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSURzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlSURzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlEcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1hNTFBhcnNlQWRkQXR0cmlidXRlQW5kVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQlVSW50MzIgZWxlbWVudElEOwotCVVJbnQzMiBuYW1lU3BhY2VJRDsKLQljaGFyIGF0dHJpYnV0ZU5hbWU7Ci0JVUludDMyIGF0dHJpYnV0ZUlEOwotCVVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQ7Ci0Jdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKKyAgICBVSW50MzIgZWxlbWVudElEOworICAgIFVJbnQzMiBuYW1lU3BhY2VJRDsKKyAgICBjaGFyIGF0dHJpYnV0ZU5hbWU7CisgICAgVUludDMyIGF0dHJpYnV0ZUlEOworICAgIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQ7CisgICAgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm87CiAjaWZuZGVmIFhNTFBhcnNlQWRkQXR0cmlidXRlQW5kVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZEluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kSW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZEluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kSW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1hNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7Ci0JVUludDMyIGVsZW1lbnRJRDsKLQlVSW50MzIgYXR0cmlidXRlSUQ7Ci0JVUludDMyIGF0dHJpYnV0ZVZhbHVlS2luZDsKLQl2b2lkICogYXR0cmlidXRlVmFsdWVLaW5kSW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIFVJbnQzMiBlbGVtZW50SUQ7CisgICAgVUludDMyIGF0dHJpYnV0ZUlEOworICAgIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQ7CisgICAgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm87CiAjaWZuZGVmIFhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZEluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZChhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUtpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kSW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlVmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlVmFsdWVLaW5kSW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kKGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZE5hbWVTcGFjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCWNoYXIgbmFtZVNwYWNlVVJMOwotCVVJbnQzMiBuYW1lU3BhY2VJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIGNoYXIgbmFtZVNwYWNlVVJMOworICAgIFVJbnQzMiBuYW1lU3BhY2VJRDsKICNpZm5kZWYgWE1MUGFyc2VBZGROYW1lU3BhY2UKLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZE5hbWVTcGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGROYW1lU3BhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VBZGROYW1lU3BhY2UoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZVVSTCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gWE1MUGFyc2VBZGROYW1lU3BhY2UoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfWE1MUGFyc2VTZXRPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCVVJbnQzMiBvZmZzZXQ7Ci0JVUludDMyIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgVUludDMyIG9mZnNldDsKKyAgICBVSW50MzIgbGltaXQ7CiAjaWZuZGVmIFhNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQKLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0KGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQlsb25nIHJlZmNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIGxvbmcgcmVmY29uOwogI2lmbmRlZiBYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24KLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uKGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZmNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbihhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZjb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHSW5pdGlhbGl6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR0luaXRpYWxpemUKLQlQeU1hY19QUkVDSEVDSyhTR0luaXRpYWxpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHSW5pdGlhbGl6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0luaXRpYWxpemUocyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dJbml0aWFsaXplKHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RGF0YU91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JRlNTcGVjIG1vdmllRmlsZTsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEZTU3BlYyBtb3ZpZUZpbGU7CisgICAgbG9uZyB3aGVyZUZsYWdzOwogI2lmbmRlZiBTR1NldERhdGFPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR1NldERhdGFPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0RGF0YU91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJm1vdmllRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldERhdGFPdXRwdXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZtb3ZpZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXREYXRhT3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RGF0YU91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JRlNTcGVjIG1vdmllRmlsZTsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEZTU3BlYyBtb3ZpZUZpbGU7CisgICAgbG9uZyB3aGVyZUZsYWdzOwogI2lmbmRlZiBTR0dldERhdGFPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR0dldERhdGFPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YU91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmbW92aWVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXREYXRhT3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmbW92aWVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXREYXRhT3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JQ0dyYWZQdHIgZ3A7Ci0JR0RIYW5kbGUgZ2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIENHcmFmUHRyIGdwOworICAgIEdESGFuZGxlIGdkOwogI2lmbmRlZiBTR1NldEdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZncCwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0R1dvcmxkKHMsCi0JICAgICAgICAgICAgICAgICAgZ3AsCi0JICAgICAgICAgICAgICAgICAgZ2QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRHV29ybGQocywKKyAgICAgICAgICAgICAgICAgICAgICBncCwKKyAgICAgICAgICAgICAgICAgICAgICBnZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUNHcmFmUHRyIGdwOwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBDR3JhZlB0ciBncDsKKyAgICBHREhhbmRsZSBnZDsKICNpZm5kZWYgU0dHZXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhTR0dldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRHV29ybGQocywKLQkgICAgICAgICAgICAgICAgICAmZ3AsCi0JICAgICAgICAgICAgICAgICAgJmdkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgZ3AsCi0JICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0R1dvcmxkKHMsCisgICAgICAgICAgICAgICAgICAgICAgJmdwLAorICAgICAgICAgICAgICAgICAgICAgICZnZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIGdwLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGdkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR05ld0NoYW5uZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCU9TVHlwZSBjaGFubmVsVHlwZTsKLQlTR0NoYW5uZWwgcmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBPU1R5cGUgY2hhbm5lbFR5cGU7CisgICAgU0dDaGFubmVsIHJlZjsKICNpZm5kZWYgU0dOZXdDaGFubmVsCi0JUHlNYWNfUFJFQ0hFQ0soU0dOZXdDaGFubmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR05ld0NoYW5uZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNoYW5uZWxUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dOZXdDaGFubmVsKHMsCi0JICAgICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAotCSAgICAgICAgICAgICAgICAgICAmcmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIHJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNoYW5uZWxUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dOZXdDaGFubmVsKHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIHJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dEaXNwb3NlQ2hhbm5lbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR0Rpc3Bvc2VDaGFubmVsCi0JUHlNYWNfUFJFQ0hFQ0soU0dEaXNwb3NlQ2hhbm5lbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dEaXNwb3NlQ2hhbm5lbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHRGlzcG9zZUNoYW5uZWwocywKLQkgICAgICAgICAgICAgICAgICAgICAgIGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dEaXNwb3NlQ2hhbm5lbChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTdGFydFByZXZpZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKICNpZm5kZWYgU0dTdGFydFByZXZpZXcKLQlQeU1hY19QUkVDSEVDSyhTR1N0YXJ0UHJldmlldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTdGFydFByZXZpZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTdGFydFByZXZpZXcocyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTdGFydFByZXZpZXcocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTdGFydFJlY29yZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR1N0YXJ0UmVjb3JkCi0JUHlNYWNfUFJFQ0hFQ0soU0dTdGFydFJlY29yZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTdGFydFJlY29yZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1N0YXJ0UmVjb3JkKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU3RhcnRSZWNvcmQocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CiAjaWZuZGVmIFNHSWRsZQotCVB5TWFjX1BSRUNIRUNLKFNHSWRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dJZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHSWRsZShzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0lkbGUocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTdG9wKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CiAjaWZuZGVmIFNHU3RvcAotCVB5TWFjX1BSRUNIRUNLKFNHU3RvcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTdG9wKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU3RvcChzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1N0b3Aocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYXVzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JQm9vbGVhbiBwYXVzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgQm9vbGVhbiBwYXVzZTsKICNpZm5kZWYgU0dQYXVzZQotCVB5TWFjX1BSRUNIRUNLKFNHUGF1c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGF1c2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhdXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYXVzZShzLAotCSAgICAgICAgICAgICAgcGF1c2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXVzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGF1c2UocywKKyAgICAgICAgICAgICAgICAgIHBhdXNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1ByZXBhcmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUJvb2xlYW4gcHJlcGFyZUZvclByZXZpZXc7Ci0JQm9vbGVhbiBwcmVwYXJlRm9yUmVjb3JkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBCb29sZWFuIHByZXBhcmVGb3JQcmV2aWV3OworICAgIEJvb2xlYW4gcHJlcGFyZUZvclJlY29yZDsKICNpZm5kZWYgU0dQcmVwYXJlCi0JUHlNYWNfUFJFQ0hFQ0soU0dQcmVwYXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1ByZXBhcmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVwYXJlRm9yUHJldmlldywKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZXBhcmVGb3JSZWNvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1ByZXBhcmUocywKLQkgICAgICAgICAgICAgICAgcHJlcGFyZUZvclByZXZpZXcsCi0JICAgICAgICAgICAgICAgIHByZXBhcmVGb3JSZWNvcmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlcGFyZUZvclByZXZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVwYXJlRm9yUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQcmVwYXJlKHMsCisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVGb3JQcmV2aWV3LAorICAgICAgICAgICAgICAgICAgICBwcmVwYXJlRm9yUmVjb3JkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1JlbGVhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKICNpZm5kZWYgU0dSZWxlYXNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dSZWxlYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1JlbGVhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dSZWxlYXNlKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUmVsZWFzZShzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE1vdmllKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR0dldE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE1vdmllKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0TW92aWUocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRNYXhpbXVtUmVjb3JkVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JdW5zaWduZWQgbG9uZyB0aWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgdW5zaWduZWQgbG9uZyB0aWNrczsKICNpZm5kZWYgU0dTZXRNYXhpbXVtUmVjb3JkVGltZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0TWF4aW11bVJlY29yZFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0TWF4aW11bVJlY29yZFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRNYXhpbXVtUmVjb3JkVGltZShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aWNrcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0TWF4aW11bVJlY29yZFRpbWUocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE1heGltdW1SZWNvcmRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQl1bnNpZ25lZCBsb25nIHRpY2tzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICB1bnNpZ25lZCBsb25nIHRpY2tzOwogI2lmbmRlZiBTR0dldE1heGltdW1SZWNvcmRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRNYXhpbXVtUmVjb3JkVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRNYXhpbXVtUmVjb3JkVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE1heGltdW1SZWNvcmRUaW1lKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGlja3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHRpY2tzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldE1heGltdW1SZWNvcmRUaW1lKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGlja3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JdW5zaWduZWQgbG9uZyBieXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgdW5zaWduZWQgbG9uZyBieXRlczsKICNpZm5kZWYgU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcKLQlQeU1hY19QUkVDSEVDSyhTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VGltZVJlbWFpbmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JbG9uZyB0aWNrc0xlZnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIGxvbmcgdGlja3NMZWZ0OwogI2lmbmRlZiBTR0dldFRpbWVSZW1haW5pbmcKLQlQeU1hY19QUkVDSEVDSyhTR0dldFRpbWVSZW1haW5pbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VGltZVJlbWFpbmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFRpbWVSZW1haW5pbmcocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzTGVmdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdGlja3NMZWZ0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFRpbWVSZW1haW5pbmcocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzTGVmdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3NMZWZ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dyYWJQaWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlQaWNIYW5kbGUgcDsKLQlSZWN0IGJvdW5kczsKLQlzaG9ydCBvZmZzY3JlZW5EZXB0aDsKLQlsb25nIGdyYWJQaWN0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFBpY0hhbmRsZSBwOworICAgIFJlY3QgYm91bmRzOworICAgIHNob3J0IG9mZnNjcmVlbkRlcHRoOworICAgIGxvbmcgZ3JhYlBpY3RGbGFnczsKICNpZm5kZWYgU0dHcmFiUGljdAotCVB5TWFjX1BSRUNIRUNLKFNHR3JhYlBpY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR3JhYlBpY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNjcmVlbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3JhYlBpY3RGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR3JhYlBpY3QocywKLQkgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgIG9mZnNjcmVlbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgZ3JhYlBpY3RGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzY3JlZW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYWJQaWN0RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dyYWJQaWN0KHMsCisgICAgICAgICAgICAgICAgICAgICAmcCwKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgIGdyYWJQaWN0RmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldExhc3RNb3ZpZVJlc0lEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlzaG9ydCByZXNJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgc2hvcnQgcmVzSUQ7CiAjaWZuZGVmIFNHR2V0TGFzdE1vdmllUmVzSUQKLQlQeU1hY19QUkVDSEVDSyhTR0dldExhc3RNb3ZpZVJlc0lEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldExhc3RNb3ZpZVJlc0lEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0TGFzdE1vdmllUmVzSUQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0TGFzdE1vdmllUmVzSUQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCWxvbmcgc2dGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgbG9uZyBzZ0ZsYWdzOwogI2lmbmRlZiBTR1NldEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2dGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0RmxhZ3MocywKLQkgICAgICAgICAgICAgICAgIHNnRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZ0ZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRGbGFncyhzLAorICAgICAgICAgICAgICAgICAgICAgc2dGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JbG9uZyBzZ0ZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBsb25nIHNnRmxhZ3M7CiAjaWZuZGVmIFNHR2V0RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0dldEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0RmxhZ3MocywKLQkgICAgICAgICAgICAgICAgICZzZ0ZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzZ0ZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldEZsYWdzKHMsCisgICAgICAgICAgICAgICAgICAgICAmc2dGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2dGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIG5ld0NoYW5uZWw7Ci0JQ29tcG9uZW50IHNnQ2hhbm5lbENvbXBvbmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIG5ld0NoYW5uZWw7CisgICAgQ29tcG9uZW50IHNnQ2hhbm5lbENvbXBvbmVudDsKICNpZm5kZWYgU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmc2dDaGFubmVsQ29tcG9uZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0NoYW5uZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ0NoYW5uZWxDb21wb25lbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgbmV3Q2hhbm5lbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmc2dDaGFubmVsQ29tcG9uZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ0NoYW5uZWxDb21wb25lbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgbmV3Q2hhbm5lbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dTZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0U2V0dGluZ3MocywKLQkgICAgICAgICAgICAgICAgICAgIHVkLAotCSAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICB1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlVc2VyRGF0YSB1ZDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBVc2VyRGF0YSB1ZDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTR0dldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICAmdWQsCi0JICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgdWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0U2V0dGluZ3MocywKKyAgICAgICAgICAgICAgICAgICAgICAgICZ1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB1ZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRJbmRDaGFubmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlzaG9ydCBpbmRleDsKLQlTR0NoYW5uZWwgcmVmOwotCU9TVHlwZSBjaGFuVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgc2hvcnQgaW5kZXg7CisgICAgU0dDaGFubmVsIHJlZjsKKyAgICBPU1R5cGUgY2hhblR5cGU7CiAjaWZuZGVmIFNHR2V0SW5kQ2hhbm5lbAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0SW5kQ2hhbm5lbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRJbmRDaGFubmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0SW5kQ2hhbm5lbChzLAotCSAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoYW5UeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgcmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjaGFuVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRJbmRDaGFubmVsKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhblR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNoYW5UeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1VwZGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JUmduSGFuZGxlIHVwZGF0ZVJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUmduSGFuZGxlIHVwZGF0ZVJnbjsKICNpZm5kZWYgU0dVcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhTR1VwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dVcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXBkYXRlUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dVcGRhdGUocywKLQkgICAgICAgICAgICAgICB1cGRhdGVSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHVXBkYXRlKHMsCisgICAgICAgICAgICAgICAgICAgdXBkYXRlUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFBhdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlCb29sZWFuIHBhdXNlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgQm9vbGVhbiBwYXVzZWQ7CiAjaWZuZGVmIFNHR2V0UGF1c2UKLQlQeU1hY19QUkVDSEVDSyhTR0dldFBhdXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFBhdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0UGF1c2UocywKLQkgICAgICAgICAgICAgICAgICZwYXVzZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHBhdXNlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRQYXVzZShzLAorICAgICAgICAgICAgICAgICAgICAgJnBhdXNlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dTZXRDaGFubmVsU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsU2V0dGluZ3MocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxTZXR0aW5ncyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlVc2VyRGF0YSB1ZDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBVc2VyRGF0YSB1ZDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTR0dldENoYW5uZWxTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUJvb2xlYW4gcHJldmlld01vZGU7Ci0JQm9vbGVhbiByZWNvcmRNb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBCb29sZWFuIHByZXZpZXdNb2RlOworICAgIEJvb2xlYW4gcmVjb3JkTW9kZTsKICNpZm5kZWYgU0dHZXRNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldE1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRNb2RlKHMsCi0JICAgICAgICAgICAgICAgICZwcmV2aWV3TW9kZSwKLQkgICAgICAgICAgICAgICAgJnJlY29yZE1vZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3TW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICByZWNvcmRNb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldE1vZGUocywKKyAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdNb2RlLAorICAgICAgICAgICAgICAgICAgICAmcmVjb3JkTW9kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZE1vZGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCWxvbmcgd2hlcmVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dTZXREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXREYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXREYXRhUmVmKHMsCi0JICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldERhdGFSZWYocywKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCWxvbmcgd2hlcmVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dHZXREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXREYXRhUmVmKHMsCi0JICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXREYXRhUmVmKHMsCisgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dOZXdPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIHdoZXJlRmxhZ3M7Ci0JU0dPdXRwdXQgc2dPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIHdoZXJlRmxhZ3M7CisgICAgU0dPdXRwdXQgc2dPdXQ7CiAjaWZuZGVmIFNHTmV3T3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dOZXdPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHTmV3T3V0cHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHTmV3T3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICZzZ091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgc2dPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHTmV3T3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICZzZ091dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgc2dPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHRGlzcG9zZU91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OwogI2lmbmRlZiBTR0Rpc3Bvc2VPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR0Rpc3Bvc2VPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHRGlzcG9zZU91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dEaXNwb3NlT3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgIHNnT3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dEaXNwb3NlT3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldE91dHB1dEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dTZXRPdXRwdXRGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRPdXRwdXRGbGFncyhzLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldE91dHB1dEZsYWdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbE91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JU0dPdXRwdXQgc2dPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIFNHT3V0cHV0IHNnT3V0OwogI2lmbmRlZiBTR1NldENoYW5uZWxPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbE91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxPdXRwdXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbE91dHB1dChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQl1bnNpZ25lZCBsb25nIHNwYWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICB1bnNpZ25lZCBsb25nIHNwYWNlOwogI2lmbmRlZiBTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmcKLQlQeU1hY19QUkVDSEVDSyhTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwYWNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0hhbmRsZVVwZGF0ZUV2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlFdmVudFJlY29yZCBldmVudDsKLQlCb29sZWFuIGhhbmRsZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEV2ZW50UmVjb3JkIGV2ZW50OworICAgIEJvb2xlYW4gaGFuZGxlZDsKICNpZm5kZWYgU0dIYW5kbGVVcGRhdGVFdmVudAotCVB5TWFjX1BSRUNIRUNLKFNHSGFuZGxlVXBkYXRlRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHSGFuZGxlVXBkYXRlRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0hhbmRsZVVwZGF0ZUV2ZW50KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0hhbmRsZVVwZGF0ZUV2ZW50KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRPdXRwdXROZXh0T3V0cHV0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQlTR091dHB1dCBuZXh0T3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBTR091dHB1dCBuZXh0T3V0OwogI2lmbmRlZiBTR1NldE91dHB1dE5leHRPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR1NldE91dHB1dE5leHRPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0TmV4dE91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZuZXh0T3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRPdXRwdXROZXh0T3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0T3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZuZXh0T3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRPdXRwdXROZXh0T3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0T3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE91dHB1dE5leHRPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OwotCVNHT3V0cHV0IG5leHRPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OworICAgIFNHT3V0cHV0IG5leHRPdXQ7CiAjaWZuZGVmIFNHR2V0T3V0cHV0TmV4dE91dHB1dAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0T3V0cHV0TmV4dE91dHB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRPdXRwdXROZXh0T3V0cHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE91dHB1dE5leHRPdXRwdXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0T3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfTmV3LCBuZXh0T3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRPdXRwdXROZXh0T3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dE91dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgbmV4dE91dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQl3aWRlIG1heE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dPdXRwdXQgc2dPdXQ7CisgICAgd2lkZSBtYXhPZmZzZXQ7CiAjaWZuZGVmIFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1heE9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWF4T2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4T2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE91dHB1dE1heGltdW1PZmZzZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OwotCXdpZGUgbWF4T2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICB3aWRlIG1heE9mZnNldDsKICNpZm5kZWYgU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldE91dHB1dE1heGltdW1PZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0T3V0cHV0TWF4aW11bU9mZnNldChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgbWF4T2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4T2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBtYXhPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIFNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE91dHB1dERhdGFSZWZlcmVuY2UocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlQdHIgcDsKLQlsb25nIGxlbjsKLQl3aWRlIG9mZnNldDsKLQlTR091dHB1dCBzZ091dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgUHRyIHA7CisgICAgbG9uZyBsZW47CisgICAgd2lkZSBvZmZzZXQ7CisgICAgU0dPdXRwdXQgc2dPdXQ7CiAjaWZuZGVmIFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNnT3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9OZXcsIHNnT3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZ091dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfTmV3LCBzZ091dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0Jd2lkZSBieXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgd2lkZSBieXRlczsKICNpZm5kZWYgU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBieXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBieXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OwotCXdpZGUgc3BhY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OworICAgIHdpZGUgc3BhY2U7CiAjaWZuZGVmIFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3BhY2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3BhY2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHV3JpdGVNb3ZpZURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCVB0ciBwOwotCWxvbmcgbGVuOwotCWxvbmcgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBQdHIgcDsKKyAgICBsb25nIGxlbjsKKyAgICBsb25nIG9mZnNldDsKICNpZm5kZWYgU0dXcml0ZU1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHV3JpdGVNb3ZpZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHV3JpdGVNb3ZpZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnAsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1dyaXRlTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgcCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1dyaXRlTW92aWVEYXRhKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JVGltZUJhc2UgdGI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFRpbWVCYXNlIHRiOwogI2lmbmRlZiBTR0dldFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFRpbWVCYXNlKHMsCi0JICAgICAgICAgICAgICAgICAgICAmdGIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFRpbWVCYXNlKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0FkZE1vdmllRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JUHRyIHA7Ci0JbG9uZyBsZW47Ci0JbG9uZyBvZmZzZXQ7Ci0JbG9uZyBjaFJlZkNvbjsKLQlUaW1lVmFsdWUgdGltZTsKLQlzaG9ydCB3cml0ZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIFB0ciBwOworICAgIGxvbmcgbGVuOworICAgIGxvbmcgb2Zmc2V0OworICAgIGxvbmcgY2hSZWZDb247CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgc2hvcnQgd3JpdGVUeXBlOwogI2lmbmRlZiBTR0FkZE1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHQWRkTW92aWVEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0FkZE1vdmllRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2xsbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoUmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndyaXRlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQWRkTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICBwLAotCSAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGNoUmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbGxsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dBZGRNb3ZpZURhdGEocywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFuZ2VkU291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHQ2hhbmdlZFNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbmdlZFNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFuZ2VkU291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFuZ2VkU291cmNlKHMsCi0JICAgICAgICAgICAgICAgICAgICAgIGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFuZ2VkU291cmNlKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQWRkRXh0ZW5kZWRNb3ZpZURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCVB0ciBwOwotCWxvbmcgbGVuOwotCXdpZGUgb2Zmc2V0OwotCWxvbmcgY2hSZWZDb247Ci0JVGltZVZhbHVlIHRpbWU7Ci0Jc2hvcnQgd3JpdGVUeXBlOwotCVNHT3V0cHV0IHdoaWNoT3V0cHV0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBQdHIgcDsKKyAgICBsb25nIGxlbjsKKyAgICB3aWRlIG9mZnNldDsKKyAgICBsb25nIGNoUmVmQ29uOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIHNob3J0IHdyaXRlVHlwZTsKKyAgICBTR091dHB1dCB3aGljaE91dHB1dDsKICNpZm5kZWYgU0dBZGRFeHRlbmRlZE1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsbGxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnAsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZjaFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3cml0ZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0FkZEV4dGVuZGVkTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hPdXRwdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgd2hpY2hPdXRwdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbGxsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dBZGRFeHRlbmRlZE1vdmllRGF0YShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoT3V0cHV0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9OZXcsIHdoaWNoT3V0cHV0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0FkZE91dHB1dERhdGFSZWZUb01lZGlhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQlNZWRpYSB0aGVNZWRpYTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBNZWRpYSB0aGVNZWRpYTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBTR0FkZE91dHB1dERhdGFSZWZUb01lZGlhCi0JUHlNYWNfUFJFQ0hFQ0soU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfQ29udmVydCwgJnRoZU1lZGlhLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0FkZE91dHB1dERhdGFSZWZUb01lZGlhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1lZGlhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX0NvbnZlcnQsICZ0aGVNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0U2V0dGluZ3NTdW1tYXJ5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlIYW5kbGUgc3VtbWFyeVRleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBzdW1tYXJ5VGV4dDsKICNpZm5kZWYgU0dTZXRTZXR0aW5nc1N1bW1hcnkKLQlQeU1hY19QUkVDSEVDSyhTR1NldFNldHRpbmdzU3VtbWFyeSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRTZXR0aW5nc1N1bW1hcnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3VtbWFyeVRleHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFNldHRpbmdzU3VtbWFyeShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlUZXh0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzdW1tYXJ5VGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0U2V0dGluZ3NTdW1tYXJ5KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVRleHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbFVzYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgdXNhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyB1c2FnZTsKICNpZm5kZWYgU0dTZXRDaGFubmVsVXNhZ2UKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxVc2FnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsVXNhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsVXNhZ2UoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsVXNhZ2UoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsVXNhZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyB1c2FnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHVzYWdlOwogI2lmbmRlZiBTR0dldENoYW5uZWxVc2FnZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFVzYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxVc2FnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxVc2FnZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2FnZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdXNhZ2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbFVzYWdlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBTR1NldENoYW5uZWxCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbEJvdW5kcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbEJvdW5kcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbEJvdW5kcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxCb3VuZHMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsVm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxWb2x1bWUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsVm9sdW1lKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsVm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFZvbHVtZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbFZvbHVtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBjaGFubmVsSW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGNoYW5uZWxJbmZvOwogI2lmbmRlZiBTR0dldENoYW5uZWxJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxJbmZvKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbEluZm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmZvKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxJbmZvKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbEluZm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmZvKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxQbGF5RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBwbGF5RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBwbGF5RmxhZ3M7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFBsYXlGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFBsYXlGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsUGxheUZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwbGF5RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxQbGF5RmxhZ3MoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGxheUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsUGxheUZsYWdzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsUGxheUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgcGxheUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgcGxheUZsYWdzOwogI2lmbmRlZiBTR0dldENoYW5uZWxQbGF5RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxQbGF5RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFBsYXlGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxQbGF5RmxhZ3MoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsYXlGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGxheUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxQbGF5RmxhZ3MoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsYXlGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxNYXhGcmFtZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBmcmFtZUNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgZnJhbWVDb3VudDsKICNpZm5kZWYgU0dTZXRDaGFubmVsTWF4RnJhbWVzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsTWF4RnJhbWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxNYXhGcmFtZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxNYXhGcmFtZXMoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxNYXhGcmFtZXMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsTWF4RnJhbWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgZnJhbWVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGZyYW1lQ291bnQ7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbE1heEZyYW1lcwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbE1heEZyYW1lcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsTWF4RnJhbWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbE1heEZyYW1lcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVDb3VudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsTWF4RnJhbWVzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZUNvdW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyByZWZDb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFJlZkNvbgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxSZWZDb24oYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsUmVmQ29uKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsQ2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZ25IYW5kbGUgdGhlQ2xpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKICNpZm5kZWYgU0dTZXRDaGFubmVsQ2xpcAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbENsaXAoYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxDbGlwKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVDbGlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVJnbkhhbmRsZSB0aGVDbGlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTR0dldENoYW5uZWxDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsQ2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsQ2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxDbGlwKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ2xpcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNsaXApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbENsaXAoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDbGlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlQ2xpcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIHNhbXBsZURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgSGFuZGxlIHNhbXBsZURlc2M7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxTYW1wbGVEZXNjcmlwdGlvbihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxTYW1wbGVEZXNjcmlwdGlvbihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbERldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHJpbmdQdHIgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTdHJpbmdQdHIgbmFtZTsKICNpZm5kZWYgU0dTZXRDaGFubmVsRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxEZXZpY2UoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxEZXZpY2UoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsVGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVRpbWVTY2FsZSBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFRpbWVTY2FsZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxUaW1lU2NhbGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsUHV0UGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dDaGFubmVsUHV0UGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFB1dFBpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFB1dFBpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsUHV0UGljdHVyZShjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxQdXRQaWN0dXJlKGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQ2hhbm5lbFNldFJlcXVlc3RlZERhdGFSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxTZXRSZXF1ZXN0ZWREYXRhUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsR2V0UmVxdWVzdGVkRGF0YVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBieXRlc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGJ5dGVzUGVyU2Vjb25kOwogI2lmbmRlZiBTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JU3RyMjU1IG5hbWU7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU3RyMjU1IG5hbWU7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CiAjaWZuZGVmIFNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxTZXREYXRhU291cmNlTmFtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHIyNTUgbmFtZTsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKICNpZm5kZWYgU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUhhbmRsZSBzZXR0aW5nczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CiAjaWZuZGVmIFNHQ2hhbm5lbFNldENvZGVjU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIHNldHRpbmdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSBzZXR0aW5nczsKICNpZm5kZWYgU0dDaGFubmVsR2V0Q29kZWNTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsR2V0Q29kZWNTZXR0aW5ncyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgc2V0dGluZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5ncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlUaW1lQmFzZSB0YjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBUaW1lQmFzZSB0YjsKICNpZm5kZWYgU0dHZXRDaGFubmVsVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsVGltZUJhc2UoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxUaW1lQmFzZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0Yik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgdGIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFJlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHJlZkNvbjsKICNpZm5kZWYgU0dHZXRDaGFubmVsUmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsUmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsUmVmQ29uKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsUmVmQ29uKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHIyNTUgb3V0RGV2aWNlTmFtZTsKLQlTdHIyNTUgb3V0SW5wdXROYW1lOwotCXNob3J0IG91dElucHV0TnVtYmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFN0cjI1NSBvdXREZXZpY2VOYW1lOworICAgIFN0cjI1NSBvdXRJbnB1dE5hbWU7CisgICAgc2hvcnQgb3V0SW5wdXROdW1iZXI7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgb3V0RGV2aWNlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvdXRJbnB1dE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXREZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5wdXROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dElucHV0TnVtYmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRJbnB1dE51bWJlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvdXREZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG91dElucHV0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dERldmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJbnB1dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5wdXROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dElucHV0TnVtYmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxEZXZpY2VJbnB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBpbklucHV0TnVtYmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGluSW5wdXROdW1iZXI7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbERldmljZUlucHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsRGV2aWNlSW5wdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbERldmljZUlucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklucHV0TnVtYmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsRGV2aWNlSW5wdXQoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklucHV0TnVtYmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JbnB1dE51bWJlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbERldmljZUlucHV0KGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbnB1dE51bWJlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsU2V0dGluZ3NTdGF0ZUNoYW5naW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFVJbnQzMiBpbkZsYWdzOwogI2lmbmRlZiBTR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0luaXRDaGFubmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVNlcUdyYWJDb21wb25lbnQgb3duZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU2VxR3JhYkNvbXBvbmVudCBvd25lcjsKICNpZm5kZWYgU0dJbml0Q2hhbm5lbAotCVB5TWFjX1BSRUNIRUNLKFNHSW5pdENoYW5uZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHSW5pdENoYW5uZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm93bmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dJbml0Q2hhbm5lbChjLAotCSAgICAgICAgICAgICAgICAgICAgb3duZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZvd25lcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHSW5pdENoYW5uZWwoYywKKyAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1dyaXRlU2FtcGxlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlNb3ZpZSBtOwotCUFsaWFzSGFuZGxlIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgTW92aWUgbTsKKyAgICBBbGlhc0hhbmRsZSB0aGVGaWxlOwogI2lmbmRlZiBTR1dyaXRlU2FtcGxlcwotCVB5TWFjX1BSRUNIRUNLKFNHV3JpdGVTYW1wbGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1dyaXRlU2FtcGxlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dXcml0ZVNhbXBsZXMoYywKLQkgICAgICAgICAgICAgICAgICAgICBtLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1dyaXRlU2FtcGxlcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXREYXRhUmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIGJ5dGVzUGVyU2Vjb25kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIFNHR2V0RGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldERhdGFSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldERhdGFSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0RGF0YVJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0RGF0YVJhdGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQWxpZ25DaGFubmVsUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCByOwogI2lmbmRlZiBTR0FsaWduQ2hhbm5lbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhTR0FsaWduQ2hhbm5lbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQWxpZ25DaGFubmVsUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0FsaWduQ2hhbm5lbFJlY3QoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0FsaWduQ2hhbm5lbFJlY3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsR2V0RGl0bChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JSGFuZGxlIGRpdGw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkaXRsOwogI2lmbmRlZiBTR1BhbmVsR2V0RGl0bAotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXREaXRsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsR2V0RGl0bCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsR2V0RGl0bChzLAotCSAgICAgICAgICAgICAgICAgICAgICZkaXRsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGl0bCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbEdldERpdGwocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGl0bCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRpdGwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxHZXRUaXRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU3RyMjU1IHRpdGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTdHIyNTUgdGl0bGU7CiAjaWZuZGVmIFNHUGFuZWxHZXRUaXRsZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRUaXRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEdldFRpdGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbEdldFRpdGxlKHMsCi0JICAgICAgICAgICAgICAgICAgICAgIHRpdGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxHZXRUaXRsZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbENhblJ1bihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR1BhbmVsQ2FuUnVuCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbENhblJ1bik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbENhblJ1bik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxDYW5SdW4ocywKLQkgICAgICAgICAgICAgICAgICAgIGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbENhblJ1bihzLAorICAgICAgICAgICAgICAgICAgICAgICAgYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbEluc3RhbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCURpYWxvZ1B0ciBkOwotCXNob3J0IGl0ZW1PZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIERpYWxvZ1B0ciBkOworICAgIHNob3J0IGl0ZW1PZmZzZXQ7CiAjaWZuZGVmIFNHUGFuZWxJbnN0YWxsCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEluc3RhbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxJbnN0YWxsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbEluc3RhbGwocywKLQkgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgIGQsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsSW5zdGFsbChzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtT2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCURpYWxvZ1B0ciBkOwotCXNob3J0IGl0ZW1PZmZzZXQ7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7Ci0Jc2hvcnQgaXRlbUhpdDsKLQlCb29sZWFuIGhhbmRsZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIERpYWxvZ1B0ciBkOworICAgIHNob3J0IGl0ZW1PZmZzZXQ7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgc2hvcnQgaXRlbUhpdDsKKyAgICBCb29sZWFuIGhhbmRsZWQ7CiAjaWZuZGVmIFNHUGFuZWxFdmVudAotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsRXZlbnQocywKLQkgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgZCwKLQkgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCwKLQkgICAgICAgICAgICAgICAgICAgJmhhbmRsZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0LAotCSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsRXZlbnQocywKKyAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxJdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlEaWFsb2dQdHIgZDsKLQlzaG9ydCBpdGVtT2Zmc2V0OwotCXNob3J0IGl0ZW1OdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIERpYWxvZ1B0ciBkOworICAgIHNob3J0IGl0ZW1PZmZzZXQ7CisgICAgc2hvcnQgaXRlbU51bTsKICNpZm5kZWYgU0dQYW5lbEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxJdGVtKHMsCi0JICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICBkLAotCSAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgaXRlbU51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxJdGVtKHMsCisgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICBkLAorICAgICAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaXRlbU51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbFJlbW92ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JRGlhbG9nUHRyIGQ7Ci0Jc2hvcnQgaXRlbU9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgRGlhbG9nUHRyIGQ7CisgICAgc2hvcnQgaXRlbU9mZnNldDsKICNpZm5kZWYgU0dQYW5lbFJlbW92ZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxSZW1vdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxSZW1vdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsUmVtb3ZlKHMsCi0JICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgZCwKLQkgICAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFJlbW92ZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGQsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtT2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsU2V0R3JhYmJlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU2VxR3JhYkNvbXBvbmVudCBzZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzZzsKICNpZm5kZWYgU0dQYW5lbFNldEdyYWJiZXIKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsU2V0R3JhYmJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFNldEdyYWJiZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnNnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbFNldEdyYWJiZXIocywKLQkgICAgICAgICAgICAgICAgICAgICAgICBzZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnNnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFNldEdyYWJiZXIocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbFNldFJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCXNob3J0IHJlc1JlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgc2hvcnQgcmVzUmVmOwogI2lmbmRlZiBTR1BhbmVsU2V0UmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxTZXRSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsU2V0UmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbFNldFJlc0ZpbGUocywKLQkgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsU2V0UmVzRmlsZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbEdldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlVc2VyRGF0YSB1ZDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBVc2VyRGF0YSB1ZDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTR1BhbmVsR2V0U2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsR2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxHZXRTZXR0aW5ncyhzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB1ZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsR2V0U2V0dGluZ3MocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgdWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxTZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dQYW5lbFNldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFNldFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsU2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbFNldFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFNldFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbFZhbGlkYXRlSW5wdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUJvb2xlYW4gb2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEJvb2xlYW4gb2s7CiAjaWZuZGVmIFNHUGFuZWxWYWxpZGF0ZUlucHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFZhbGlkYXRlSW5wdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxWYWxpZGF0ZUlucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxWYWxpZGF0ZUlucHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9rKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFZhbGlkYXRlSW5wdXQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9rKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsR2V0RElUTEZvclNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUhhbmRsZSBkaXRsOwotCVBvaW50IHJlcXVlc3RlZFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkaXRsOworICAgIFBvaW50IHJlcXVlc3RlZFNpemU7CiAjaWZuZGVmIFNHUGFuZWxHZXRESVRMRm9yU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRESVRMRm9yU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEdldERJVExGb3JTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxHZXRESVRMRm9yU2l6ZShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGl0bCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RlZFNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRpdGwsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcmVxdWVzdGVkU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbEdldERJVExGb3JTaXplKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdGVkU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGl0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCByZXF1ZXN0ZWRTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNyY1ZpZGVvQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIFNHR2V0U3JjVmlkZW9Cb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhTR0dldFNyY1ZpZGVvQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFNyY1ZpZGVvQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0U3JjVmlkZW9Cb3VuZHMoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTcmNWaWRlb0JvdW5kcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFZpZGVvUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCByOwogI2lmbmRlZiBTR1NldFZpZGVvUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFZpZGVvUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFZpZGVvUmVjdChjLAotCSAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFZpZGVvUmVjdChjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFZpZGVvUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCByOwogI2lmbmRlZiBTR0dldFZpZGVvUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFZpZGVvUmVjdChjLAotCSAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRWaWRlb1JlY3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VmlkZW9Db21wcmVzc29yVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlPU1R5cGUgY29tcHJlc3NvclR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgT1NUeXBlIGNvbXByZXNzb3JUeXBlOwogI2lmbmRlZiBTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9Db21wcmVzc29yVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzb3JUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNvbXByZXNzb3JUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzb3JUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNvbXByZXNzb3JUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFZpZGVvQ29tcHJlc3NvclR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JT1NUeXBlIGNvbXByZXNzb3JUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIE9TVHlwZSBjb21wcmVzc29yVHlwZTsKICNpZm5kZWYgU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFZpZGVvQ29tcHJlc3NvclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXByZXNzb3JUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3JUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3NvclR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFZpZGVvQ29tcHJlc3NvclR5cGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NvclR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VmlkZW9Db21wcmVzc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGRlcHRoOwotCUNvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvcjsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7Ci0JQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKLQlsb25nIGtleUZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3I7CisgICAgQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHk7CisgICAgbG9uZyBrZXlGcmFtZVJhdGU7CiAjaWZuZGVmIFNHU2V0VmlkZW9Db21wcmVzc29yCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRWaWRlb0NvbXByZXNzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9Db21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtleUZyYW1lUmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VmlkZW9Db21wcmVzc29yKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlGcmFtZVJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFZpZGVvQ29tcHJlc3NvcihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUZyYW1lUmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRWaWRlb0NvbXByZXNzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgZGVwdGg7Ci0JQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yOwotCUNvZGVjUSBzcGF0aWFsUXVhbGl0eTsKLQlDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OwotCWxvbmcga2V5RnJhbWVSYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGRlcHRoOworICAgIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvcjsKKyAgICBDb2RlY1Egc3BhdGlhbFF1YWxpdHk7CisgICAgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKKyAgICBsb25nIGtleUZyYW1lUmF0ZTsKICNpZm5kZWYgU0dHZXRWaWRlb0NvbXByZXNzb3IKLQlQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvQ29tcHJlc3Nvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRWaWRlb0NvbXByZXNzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRWaWRlb0NvbXByZXNzb3IoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleUZyYW1lUmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBjb21wcmVzc29yLAotCSAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICBrZXlGcmFtZVJhdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VmlkZW9Db21wcmVzc29yKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlGcmFtZVJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaE8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRJbnN0YW5jZSBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudEluc3RhbmNlIF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudChjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQoYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUNvbXBvbmVudEluc3RhbmNlIHZkaWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdmRpZzsKICNpZm5kZWYgU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZkaWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGlnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdmRpZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkaWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKFNHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZChjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZChjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dyYWJGcmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBidWZmZXJOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgYnVmZmVyTnVtOwogI2lmbmRlZiBTR0dyYWJGcmFtZQotCVB5TWFjX1BSRUNIRUNLKFNHR3JhYkZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dyYWJGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHcmFiRnJhbWUoYywKLQkgICAgICAgICAgICAgICAgICBidWZmZXJOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dyYWJGcmFtZShjLAorICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHcmFiRnJhbWVDb21wbGV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBidWZmZXJOdW07Ci0JQm9vbGVhbiBkb25lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGJ1ZmZlck51bTsKKyAgICBCb29sZWFuIGRvbmU7CiAjaWZuZGVmIFNHR3JhYkZyYW1lQ29tcGxldGUKLQlQeU1hY19QUkVDSEVDSyhTR0dyYWJGcmFtZUNvbXBsZXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dyYWJGcmFtZUNvbXBsZXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dyYWJGcmFtZUNvbXBsZXRlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9uZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZG9uZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlck51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR3JhYkZyYW1lQ29tcGxldGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb25lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NvbXByZXNzRnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgYnVmZmVyTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGJ1ZmZlck51bTsKICNpZm5kZWYgU0dDb21wcmVzc0ZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dDb21wcmVzc0ZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NvbXByZXNzRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlck51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ29tcHJlc3NGcmFtZShjLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NvbXByZXNzRnJhbWUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTnVtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENvbXByZXNzQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGRlcHRoOwotCVJlY3QgY29tcHJlc3NTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGRlcHRoOworICAgIFJlY3QgY29tcHJlc3NTaXplOwogI2lmbmRlZiBTR1NldENvbXByZXNzQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDb21wcmVzc0J1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDb21wcmVzc0J1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmNvbXByZXNzU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q29tcHJlc3NCdWZmZXIoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZjb21wcmVzc1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENvbXByZXNzQnVmZmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1NpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q29tcHJlc3NCdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgZGVwdGg7Ci0JUmVjdCBjb21wcmVzc1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgZGVwdGg7CisgICAgUmVjdCBjb21wcmVzc1NpemU7CiAjaWZuZGVmIFNHR2V0Q29tcHJlc3NCdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhTR0dldENvbXByZXNzQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENvbXByZXNzQnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q29tcHJlc3NCdWZmZXIoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1NpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmY29tcHJlc3NTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENvbXByZXNzQnVmZmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNvbXByZXNzU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRCdWZmZXJJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGJ1ZmZlck51bTsKLQlQaXhNYXBIYW5kbGUgYnVmZmVyUE07Ci0JUmVjdCBidWZmZXJSZWN0OwotCUdXb3JsZFB0ciBjb21wcmVzc0J1ZmZlcjsKLQlSZWN0IGNvbXByZXNzQnVmZmVyUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBidWZmZXJOdW07CisgICAgUGl4TWFwSGFuZGxlIGJ1ZmZlclBNOworICAgIFJlY3QgYnVmZmVyUmVjdDsKKyAgICBHV29ybGRQdHIgY29tcHJlc3NCdWZmZXI7CisgICAgUmVjdCBjb21wcmVzc0J1ZmZlclJlY3Q7CiAjaWZuZGVmIFNHR2V0QnVmZmVySW5mbwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0QnVmZmVySW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRCdWZmZXJJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldEJ1ZmZlckluZm8oYywKLQkgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyUE0sCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NCdWZmZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc0J1ZmZlclJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBidWZmZXJQTSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZidWZmZXJSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGNvbXByZXNzQnVmZmVyLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNvbXByZXNzQnVmZmVyUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlck51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0QnVmZmVySW5mbyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzQnVmZmVyUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGJ1ZmZlclBNLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJ1ZmZlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgY29tcHJlc3NCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmY29tcHJlc3NCdWZmZXJSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFVzZVNjcmVlbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcjsKICNpZm5kZWYgU0dTZXRVc2VTY3JlZW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhTR1NldFVzZVNjcmVlbkJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRVc2VTY3JlZW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZVNjcmVlbkJ1ZmZlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VXNlU2NyZWVuQnVmZmVyKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU2NyZWVuQnVmZmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlU2NyZWVuQnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRVc2VTY3JlZW5CdWZmZXIoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VTY3JlZW5CdWZmZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VXNlU2NyZWVuQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyOwogI2lmbmRlZiBTR0dldFVzZVNjcmVlbkJ1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VXNlU2NyZWVuQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFVzZVNjcmVlbkJ1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFVzZVNjcmVlbkJ1ZmZlcihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VTY3JlZW5CdWZmZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHVzZVNjcmVlbkJ1ZmZlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRVc2VTY3JlZW5CdWZmZXIoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlU2NyZWVuQnVmZmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VTY3JlZW5CdWZmZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RnJhbWVSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUZpeGVkIGZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBGaXhlZCBmcmFtZVJhdGU7CiAjaWZuZGVmIFNHU2V0RnJhbWVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRGcmFtZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0RnJhbWVSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmZyYW1lUmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0RnJhbWVSYXRlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZmcmFtZVJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldEZyYW1lUmF0ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRGcmFtZVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JRml4ZWQgZnJhbWVSYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEZpeGVkIGZyYW1lUmF0ZTsKICNpZm5kZWYgU0dHZXRGcmFtZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldEZyYW1lUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRGcmFtZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRGcmFtZVJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAmZnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgZnJhbWVSYXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldEZyYW1lUmF0ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZVJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBmcmFtZVJhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0UHJlZmVycmVkUGFja2V0U2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXM7CiAjaWZuZGVmIFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFByZWZlcnJlZFBhY2tldFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzOwogI2lmbmRlZiBTR0dldFByZWZlcnJlZFBhY2tldFNpemUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFByZWZlcnJlZFBhY2tldFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0UHJlZmVycmVkUGFja2V0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFByZWZlcnJlZFBhY2tldFNpemUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIGNvbXByZXNzb3JUeXBlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBIYW5kbGUgY29tcHJlc3NvclR5cGVzOwogI2lmbmRlZiBTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wcmVzc29yVHlwZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yVHlwZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXByZXNzb3JUeXBlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3JUeXBlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlIYW5kbGUgY29tcHJlc3NvclR5cGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSBjb21wcmVzc29yVHlwZXM7CiAjaWZuZGVmIFNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QKLQlQeU1hY19QUkVDSEVDSyhTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yVHlwZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjb21wcmVzc29yVHlwZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yVHlwZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjb21wcmVzc29yVHlwZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0U291bmRJbnB1dERyaXZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHIyNTUgZHJpdmVyTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTdHIyNTUgZHJpdmVyTmFtZTsKICNpZm5kZWYgU0dTZXRTb3VuZElucHV0RHJpdmVyCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZElucHV0RHJpdmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kSW5wdXREcml2ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZHJpdmVyTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0U291bmRJbnB1dERyaXZlcihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJOYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkcml2ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRTb3VuZElucHV0RHJpdmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlck5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0U291bmRJbnB1dERyaXZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR0dldFNvdW5kSW5wdXREcml2ZXIKLQlQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kSW5wdXREcml2ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dERyaXZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNvdW5kSW5wdXREcml2ZXIoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZElucHV0RHJpdmVyKGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU291bmRJbnB1dERyaXZlckNoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHU291bmRJbnB1dERyaXZlckNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU291bmRJbnB1dERyaXZlckNoYW5nZWQoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZChjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgc2Vjb25kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHNlY29uZHM7CiAjaWZuZGVmIFNHU2V0U291bmRSZWNvcmRDaHVua1NpemUKLQlQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlTR0NoYW5uZWwgYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHR2V0U291bmRSZWNvcmRDaHVua1NpemUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0U291bmRSZWNvcmRDaHVua1NpemUoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZFJlY29yZENodW5rU2l6ZShjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFNvdW5kSW5wdXRSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgRml4ZWQgcmF0ZTsKICNpZm5kZWYgU0dTZXRTb3VuZElucHV0UmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0U291bmRJbnB1dFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0U291bmRJbnB1dFJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0U291bmRJbnB1dFJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNvdW5kSW5wdXRSYXRlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNvdW5kSW5wdXRSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dHZXRTb3VuZElucHV0UmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dFJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTb3VuZElucHV0UmF0ZShjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZElucHV0UmF0ZShjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBzYW1wbGVTaXplOwotCXNob3J0IG51bUNoYW5uZWxzOwotCU9TVHlwZSBjb21wcmVzc2lvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgc2FtcGxlU2l6ZTsKKyAgICBzaG9ydCBudW1DaGFubmVsczsKKyAgICBPU1R5cGUgY29tcHJlc3Npb25UeXBlOwogI2lmbmRlZiBTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXByZXNzaW9uVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBzYW1wbGVTaXplOwotCXNob3J0IG51bUNoYW5uZWxzOwotCU9TVHlwZSBjb21wcmVzc2lvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgc2FtcGxlU2l6ZTsKKyAgICBzaG9ydCBudW1DaGFubmVsczsKKyAgICBPU1R5cGUgY29tcHJlc3Npb25UeXBlOwogI2lmbmRlZiBTR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvblR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNvbXByZXNzaW9uVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25UeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjb21wcmVzc2lvblR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIHJhdGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSByYXRlczsKICNpZm5kZWYgU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmF0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmF0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlIYW5kbGUgcmF0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgSGFuZGxlIHJhdGVzOwogI2lmbmRlZiBTR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmF0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCByYXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhdGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcmF0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Rm9udE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JU3RyaW5nUHRyIHBzdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU3RyaW5nUHRyIHBzdHI7CiAjaWZuZGVmIFNHU2V0Rm9udE5hbWUKLQlQeU1hY19QUkVDSEVDSyhTR1NldEZvbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldEZvbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRGb250TmFtZShjLAotCSAgICAgICAgICAgICAgICAgICAgcHN0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldEZvbnROYW1lKGMsCisgICAgICAgICAgICAgICAgICAgICAgICBwc3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEZvbnRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGZvbnRTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGZvbnRTaXplOwogI2lmbmRlZiBTR1NldEZvbnRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRGb250U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRGb250U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9udFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldEZvbnRTaXplKGMsCi0JICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnRTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRGb250U2l6ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VGV4dEZvcmVDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSR0JDb2xvciB0aGVDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSR0JDb2xvciB0aGVDb2xvcjsKICNpZm5kZWYgU0dTZXRUZXh0Rm9yZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRUZXh0Rm9yZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFRleHRGb3JlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRUZXh0Rm9yZUNvbG9yKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnRoZUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFRleHRGb3JlQ29sb3IoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmdGhlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VGV4dEJhY2tDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSR0JDb2xvciB0aGVDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSR0JDb2xvciB0aGVDb2xvcjsKICNpZm5kZWYgU0dTZXRUZXh0QmFja0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRUZXh0QmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFRleHRCYWNrQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRUZXh0QmFja0NvbG9yKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnRoZUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFRleHRCYWNrQ29sb3IoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmdGhlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0SnVzdGlmaWNhdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBqdXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGp1c3Q7CiAjaWZuZGVmIFNHU2V0SnVzdGlmaWNhdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0SnVzdGlmaWNhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRKdXN0aWZpY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRKdXN0aWZpY2F0aW9uKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRKdXN0aWZpY2F0aW9uKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCByZXR0b3NwYWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IHJldHRvc3BhY2U7CiAjaWZuZGVmIFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dG9zcGFjZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcmV0dG9zcGFjZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXR0b3NwYWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR0b3NwYWNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgcmV0dG9zcGFjZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCByZXR0b3NwYWNlOwogI2lmbmRlZiBTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmV0dG9zcGFjZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR0b3NwYWNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dG9zcGFjZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR0b3NwYWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlTdHIyNTUgc3RyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgU3RyMjU1IHN0cjsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHN0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXRDdXJyZW50Q2xpZW50TmFtZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JU3RyMjU1IHN0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIFN0cjI1NSBzdHI7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dFNldENsaWVudE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JU3RyMjU1IHN0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIFN0cjI1NSBzdHI7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRCZWdpbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRCZWdpbgotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRCZWdpbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEJlZ2luKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0QmVnaW4odm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0QmVnaW4odm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRFbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0RW5kCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEVuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEVuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEVuZCh2byk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUVmlkZW9PdXRwdXRFbmQodm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCWxvbmcgZGlzcGxheU1vZGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIGxvbmcgZGlzcGxheU1vZGVJRDsKICNpZm5kZWYgUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5TW9kZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlKHZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlNb2RlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUodm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlNb2RlSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCWxvbmcgZGlzcGxheU1vZGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIGxvbmcgZGlzcGxheU1vZGVJRDsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlNb2RlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlNb2RlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUodm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5TW9kZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JR1dvcmxkUHRyIGd3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgR1dvcmxkUHRyIGd3OwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0R2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEdldEdXb3JsZCh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZndyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGd3KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEdXb3JsZCh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZndyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGd3KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlsb25nIGluZGV4OwotCUNvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBsb25nIGluZGV4OworICAgIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dAotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgb3V0cHV0Q29tcG9uZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0KHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dENvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIG91dHB1dENvbXBvbmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRWaWRlb091dHB1dEdldENsb2NrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2xvY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjbG9jazsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldENsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldENsb2NrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0Q2xvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXRDbG9jayh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGNsb2NrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldENsb2NrKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xvY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgY2xvY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCUNHcmFmUHRyIGVjaG9Qb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgQ0dyYWZQdHIgZWNob1BvcnQ7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydAotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZWNob1BvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0U2V0RWNob1BvcnQodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9Qb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmVjaG9Qb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0KHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvUG9ydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JbG9uZyBpbmRleDsKLQlDb21wb25lbnQgY29kZWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBsb25nIGluZGV4OworICAgIENvbXBvbmVudCBjb2RlYzsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0SW5kSW1hZ2VEZWNvbXByZXNzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3Nvcih2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIGNvZGVjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgY29kZWMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlDR3JhZlB0ciBlY2hvUG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIENHcmFmUHRyIGVjaG9Qb3J0OwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmVjaG9Qb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9Qb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmVjaG9Qb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9Qb3J0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlVSW50MzIgZmxhZ3M7Ci0JVUludDMyIGZsYWdzTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVUludDMyIGZsYWdzOworICAgIFVJbnQzMiBmbGFnc01hc2s7CiAjaWZuZGVmIE1lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVUludDMyIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBVSW50MzIgZmxhZ3M7CiAjaWZuZGVmIE1lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTaXplIGFsbG93YW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgU2l6ZSBhbGxvd2FuY2U7CiAjaWZuZGVmIE1lZGlhU2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxsb3dhbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxvd2FuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dhbmNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTaXplIGFsbG93YW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgU2l6ZSBhbGxvd2FuY2U7CiAjaWZuZGVmIE1lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsbG93YW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYWxsb3dhbmNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxvd2FuY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOwogI2lmbmRlZiBNZWRpYUVtcHR5QWxsUHVyZ2VhYmxlQ2h1bmtzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyhtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MobWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0SGFuZGxlckNhcGFiaWxpdGllcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGZsYWdzTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGZsYWdzTWFzazsKICNpZm5kZWYgTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUlkbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKLQlsb25nIGZsYWdzSW47Ci0JbG9uZyBmbGFnc091dDsKLQlUaW1lUmVjb3JkIG1vdmllVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVZhbHVlIGF0TWVkaWFUaW1lOworICAgIGxvbmcgZmxhZ3NJbjsKKyAgICBsb25nIGZsYWdzT3V0OworICAgIFRpbWVSZWNvcmQgbW92aWVUaW1lOwogI2lmbmRlZiBNZWRpYUlkbGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUlkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZtb3ZpZVRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUlkbGUobWgsCi0JICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAotCSAgICAgICAgICAgICAgICBmbGFnc0luLAotCSAgICAgICAgICAgICAgICAmZmxhZ3NPdXQsCi0JICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzT3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZtb3ZpZVRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUlkbGUobWgsCisgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICBmbGFnc0luLAorICAgICAgICAgICAgICAgICAgICAmZmxhZ3NPdXQsCisgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzT3V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE1lZGlhSW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBNZWRpYUdldE1lZGlhSW5mbwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TWVkaWFJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldE1lZGlhSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TWVkaWFJbmZvKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRNZWRpYUluZm8obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFQdXRNZWRpYUluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgTWVkaWFQdXRNZWRpYUluZm8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVB1dE1lZGlhSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFQdXRNZWRpYUluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVB1dE1lZGlhSW5mbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhUHV0TWVkaWFJbmZvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0QWN0aXZlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlCb29sZWFuIGVuYWJsZU1lZGlhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBCb29sZWFuIGVuYWJsZU1lZGlhOwogI2lmbmRlZiBNZWRpYVNldEFjdGl2ZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0QWN0aXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldEFjdGl2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZU1lZGlhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRBY3RpdmUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgZW5hYmxlTWVkaWEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlTWVkaWEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldEFjdGl2ZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVNZWRpYSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlGaXhlZCByYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBGaXhlZCByYXRlOwogI2lmbmRlZiBNZWRpYVNldFJhdGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0UmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0UmF0ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgcmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldFJhdGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR0dldFN0YXR1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29tcG9uZW50UmVzdWx0IHN0YXR1c0VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQ29tcG9uZW50UmVzdWx0IHN0YXR1c0VycjsKICNpZm5kZWYgTWVkaWFHR2V0U3RhdHVzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHR2V0U3RhdHVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdHZXRTdGF0dXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR0dldFN0YXR1cyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1c0Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3RhdHVzRXJyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHR2V0U3RhdHVzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzRXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNFcnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVHJhY2tFZGl0ZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgTWVkaWFUcmFja0VkaXRlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tFZGl0ZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tFZGl0ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhVHJhY2tFZGl0ZWQobWgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVRyYWNrRWRpdGVkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldE1lZGlhVGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lU2NhbGUgbmV3VGltZVNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lU2NhbGUgbmV3VGltZVNjYWxlOwogI2lmbmRlZiBNZWRpYVNldE1lZGlhVGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0TWVkaWFUaW1lU2NhbGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUaW1lU2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3VGltZVNjYWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRNZWRpYVRpbWVTY2FsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RpbWVTY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVNjYWxlIG5ld1RpbWVTY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVNjYWxlIG5ld1RpbWVTY2FsZTsKICNpZm5kZWYgTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0TW92aWVUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0TW92aWVUaW1lU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdUaW1lU2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldE1vdmllVGltZVNjYWxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0TW92aWVUaW1lU2NhbGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUaW1lU2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlDR3JhZlB0ciBhUG9ydDsKLQlHREhhbmRsZSBhR0Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENHcmFmUHRyIGFQb3J0OworICAgIEdESGFuZGxlIGFHRDsKICNpZm5kZWYgTWVkaWFTZXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmFQb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0R1dvcmxkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgIGFQb3J0LAotCSAgICAgICAgICAgICAgICAgICAgIGFHRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmFQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0R1dvcmxkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFHRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXREaW1lbnNpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlGaXhlZCB3aWR0aDsKLQlGaXhlZCBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEZpeGVkIHdpZHRoOworICAgIEZpeGVkIGhlaWdodDsKICNpZm5kZWYgTWVkaWFTZXREaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXREaW1lbnNpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldERpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXREaW1lbnNpb25zKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldERpbWVuc2lvbnMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0Q2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBNZWRpYVNldENsaXAKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0Q2xpcChtaCwKLQkgICAgICAgICAgICAgICAgICAgdGhlQ2xpcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldENsaXAobWgsCisgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0VHJhY2tPcGFxdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUJvb2xlYW4gdHJhY2tJc09wYXF1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiB0cmFja0lzT3BhcXVlOwogI2lmbmRlZiBNZWRpYUdldFRyYWNrT3BhcXVlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRUcmFja09wYXF1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRUcmFja09wYXF1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRUcmFja09wYXF1ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0lzT3BhcXVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB0cmFja0lzT3BhcXVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRUcmFja09wYXF1ZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0lzT3BhcXVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lzT3BhcXVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBtb2RlOwotCVJHQkNvbG9yIG9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgbW9kZTsKKyAgICBSR0JDb2xvciBvcENvbG9yOwogI2lmbmRlZiBNZWRpYVNldEdyYXBoaWNzTW9kZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0R3JhcGhpY3NNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldEdyYXBoaWNzTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm9wQ29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldEdyYXBoaWNzTW9kZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm9wQ29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldEdyYXBoaWNzTW9kZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBtb2RlOwotCVJHQkNvbG9yIG9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgbW9kZTsKKyAgICBSR0JDb2xvciBvcENvbG9yOwogI2lmbmRlZiBNZWRpYUdldEdyYXBoaWNzTW9kZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0R3JhcGhpY3NNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldEdyYXBoaWNzTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRHcmFwaGljc01vZGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRHcmFwaGljc01vZGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdTZXRWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgdm9sdW1lOwogI2lmbmRlZiBNZWRpYUdTZXRWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdTZXRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR1NldFZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR1NldFZvbHVtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR1NldFZvbHVtZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFNvdW5kQmFsYW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgYmFsYW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgYmFsYW5jZTsKICNpZm5kZWYgTWVkaWFTZXRTb3VuZEJhbGFuY2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kQmFsYW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZEJhbGFuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTb3VuZEJhbGFuY2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZEJhbGFuY2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRTb3VuZEJhbGFuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGJhbGFuY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGJhbGFuY2U7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRCYWxhbmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZEJhbGFuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRCYWxhbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kQmFsYW5jZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0U291bmRCYWxhbmNlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSB3aGVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgd2hlbjsKICNpZm5kZWYgTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZW4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdoZW4pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFNyY1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmduSGFuZGxlIHJnbjsKLQlUaW1lVmFsdWUgYXRNZWRpYVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSByZ247CisgICAgVGltZVZhbHVlIGF0TWVkaWFUaW1lOwogI2lmbmRlZiBNZWRpYUdldFNyY1JnbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U3JjUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFNyY1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRTcmNSZ24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgcmduLAotCSAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRTcmNSZ24obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVByZXJvbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIE1lZGlhUHJlcm9sbAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhUHJlcm9sbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFQcmVyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVByZXJvbGwobWgsCi0JICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgIHJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVByZXJvbGwobWgsCisgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2FtcGxlRGVzY3JpcHRpb25DaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25DaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JT1NUeXBlIGNoYXJhY3RlcmlzdGljOwotCUJvb2xlYW4gaGFzSXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIE9TVHlwZSBjaGFyYWN0ZXJpc3RpYzsKKyAgICBCb29sZWFuIGhhc0l0OwogI2lmbmRlZiBNZWRpYUhhc0NoYXJhY3RlcmlzdGljCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNoYXJhY3RlcmlzdGljKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc0l0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBoYXNJdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjaGFyYWN0ZXJpc3RpYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhSGFzQ2hhcmFjdGVyaXN0aWMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNJdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmVjdCBib3VuZHM7Ci0Jc2hvcnQgZGVwdGg7Ci0JQ1RhYkhhbmRsZSBjdGFiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBDVGFiSGFuZGxlIGN0YWI7CiAjaWZuZGVmIE1lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdGFiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldE9mZnNjcmVlbkJ1ZmZlclNpemUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGFiKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldEhpbnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGhpbnRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGhpbnRzOwogI2lmbmRlZiBNZWRpYVNldEhpbnRzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRIaW50cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbnRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRIaW50cyhtaCwKLQkgICAgICAgICAgICAgICAgICAgIGhpbnRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbnRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRIaW50cyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVN0cjI1NSBuYW1lOwotCWxvbmcgcmVxdWVzdGVkTGFuZ3VhZ2U7Ci0JbG9uZyBhY3R1YWxMYW5ndWFnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgU3RyMjU1IG5hbWU7CisgICAgbG9uZyByZXF1ZXN0ZWRMYW5ndWFnZTsKKyAgICBsb25nIGFjdHVhbExhbmd1YWdlOwogI2lmbmRlZiBNZWRpYUdldE5hbWUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRMYW5ndWFnZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TmFtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkTGFuZ3VhZ2UsCi0JICAgICAgICAgICAgICAgICAgICZhY3R1YWxMYW5ndWFnZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYWN0dWFsTGFuZ3VhZ2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RlZExhbmd1YWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXROYW1lKG1oLAorICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRMYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbExhbmd1YWdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxMYW5ndWFnZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFGb3JjZVVwZGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmb3JjZVVwZGF0ZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZvcmNlVXBkYXRlRmxhZ3M7CiAjaWZuZGVmIE1lZGlhRm9yY2VVcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUZvcmNlVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUZvcmNlVXBkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9yY2VVcGRhdGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhRm9yY2VVcGRhdGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmNlVXBkYXRlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUZvcmNlVXBkYXRlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXREcmF3aW5nUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlSZ25IYW5kbGUgcGFydGlhbFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUmduSGFuZGxlIHBhcnRpYWxSZ247CiAjaWZuZGVmIE1lZGlhR2V0RHJhd2luZ1JnbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RHJhd2luZ1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXREcmF3aW5nUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldERyYXdpbmdSZ24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0aWFsUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGFydGlhbFJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0RHJhd2luZ1JnbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRpYWxSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwYXJ0aWFsUmduKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdTZXRBY3RpdmVTZWdtZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lVmFsdWUgYWN0aXZlU3RhcnQ7Ci0JVGltZVZhbHVlIGFjdGl2ZUR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgYWN0aXZlU3RhcnQ7CisgICAgVGltZVZhbHVlIGFjdGl2ZUR1cmF0aW9uOwogI2lmbmRlZiBNZWRpYUdTZXRBY3RpdmVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0QWN0aXZlU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0QWN0aXZlU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZUR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHU2V0QWN0aXZlU2VnbWVudChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlRHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdTZXRBY3RpdmVTZWdtZW50KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFJbnZhbGlkYXRlUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlSZ25IYW5kbGUgaW52YWxSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSBpbnZhbFJnbjsKICNpZm5kZWYgTWVkaWFJbnZhbGlkYXRlUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFJbnZhbGlkYXRlUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUludmFsaWRhdGVSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmludmFsUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFJbnZhbGlkYXRlUmVnaW9uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbFJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmludmFsUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFJbnZhbGlkYXRlUmVnaW9uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbFJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXROZXh0U3RlcFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGZsYWdzOwotCVRpbWVWYWx1ZSBtZWRpYVRpbWVJbjsKLQlUaW1lVmFsdWUgbWVkaWFUaW1lT3V0OwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGZsYWdzOworICAgIFRpbWVWYWx1ZSBtZWRpYVRpbWVJbjsKKyAgICBUaW1lVmFsdWUgbWVkaWFUaW1lT3V0OworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIE1lZGlhR2V0TmV4dFN0ZXBUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXROZXh0U3RlcFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TmV4dFN0ZXBUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVRpbWVJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXROZXh0U3RlcFRpbWUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lSW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVGltZU91dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVRpbWVJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXROZXh0U3RlcFRpbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgaW5wdXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBpbnB1dEluZGV4OwogI2lmbmRlZiBNZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0SW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dEluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOwogI2lmbmRlZiBNZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkKG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBzYW1wbGVOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgc2FtcGxlTnVtOwogI2lmbmRlZiBNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhUmVsZWFzZVNhbXBsZURhdGFQb2ludGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhUmVsZWFzZVNhbXBsZURhdGFQb2ludGVyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFUcmFja1Byb3BlcnR5QXRvbUNoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVRyYWNrUHJvcGVydHlBdG9tQ2hhbmdlZChtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFZpZGVvUGFyYW0oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgd2hpY2hQYXJhbTsKLQl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyB3aGljaFBhcmFtOworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOwogI2lmbmRlZiBNZWRpYVNldFZpZGVvUGFyYW0KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFZpZGVvUGFyYW0pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0VmlkZW9QYXJhbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoUGFyYW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldFZpZGVvUGFyYW0obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFyYW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hQYXJhbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0VmlkZW9QYXJhbShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRWaWRlb1BhcmFtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHdoaWNoUGFyYW07Ci0JdW5zaWduZWQgc2hvcnQgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgd2hpY2hQYXJhbTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKICNpZm5kZWYgTWVkaWFHZXRWaWRlb1BhcmFtCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRWaWRlb1BhcmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFZpZGVvUGFyYW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaFBhcmFtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRWaWRlb1BhcmFtKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaFBhcmFtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoUGFyYW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFZpZGVvUGFyYW0obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhQ29tcGFyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQm9vbGVhbiBpc09LOwotCU1lZGlhIHNyY01lZGlhOwotCUNvbXBvbmVudEluc3RhbmNlIHNyY01lZGlhQ29tcG9uZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBCb29sZWFuIGlzT0s7CisgICAgTWVkaWEgc3JjTWVkaWE7CisgICAgQ29tcG9uZW50SW5zdGFuY2Ugc3JjTWVkaWFDb21wb25lbnQ7CiAjaWZuZGVmIE1lZGlhQ29tcGFyZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhQ29tcGFyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFDb21wYXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBNZWRpYU9ial9Db252ZXJ0LCAmc3JjTWVkaWEsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnNyY01lZGlhQ29tcG9uZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFDb21wYXJlKG1oLAotCSAgICAgICAgICAgICAgICAgICAmaXNPSywKLQkgICAgICAgICAgICAgICAgICAgc3JjTWVkaWEsCi0JICAgICAgICAgICAgICAgICAgIHNyY01lZGlhQ29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpc09LKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfQ29udmVydCwgJnNyY01lZGlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzcmNNZWRpYUNvbXBvbmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhQ29tcGFyZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmlzT0ssCisgICAgICAgICAgICAgICAgICAgICAgIHNyY01lZGlhLAorICAgICAgICAgICAgICAgICAgICAgICBzcmNNZWRpYUNvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNPSyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRDbG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2xvY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudEluc3RhbmNlIGNsb2NrOwogI2lmbmRlZiBNZWRpYUdldENsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRDbG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRDbG9jayhtaCwKLQkgICAgICAgICAgICAgICAgICAgICZjbG9jayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBjbG9jayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0Q2xvY2sobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAmY2xvY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgY2xvY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZvdXRwdXRDb21wb25lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmb3V0cHV0Q29tcG9uZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29tcG9uZW50IG91dHB1dENvbXBvbmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudDsKICNpZm5kZWYgTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgb3V0cHV0Q29tcG9uZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRDb21wb25lbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBvdXRwdXRDb21wb25lbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlIYW5kbGUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgSGFuZGxlIGRhdGE7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEludmFsaWRSZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIE1lZGlhR2V0SW52YWxpZFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0SW52YWxpZFJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRJbnZhbGlkUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldEludmFsaWRSZWdpb24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0SW52YWxpZFJlZ2lvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSDsKICNpZm5kZWYgTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkIyTgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25IKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSDsKICNpZm5kZWYgTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25IKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgaW5wdXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBpbnB1dEluZGV4OwogI2lmbmRlZiBNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0SW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRJbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRVUkxMaW5rKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlQb2ludCBkaXNwbGF5V2hlcmU7Ci0JSGFuZGxlIHVybExpbms7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFBvaW50IGRpc3BsYXlXaGVyZTsKKyAgICBIYW5kbGUgdXJsTGluazsKICNpZm5kZWYgTWVkaWFHZXRVUkxMaW5rCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRVUkxMaW5rKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFVSTExpbmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRpc3BsYXlXaGVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0VVJMTGluayhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXJsTGluayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHVybExpbmspOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkaXNwbGF5V2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFVSTExpbmsobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVybExpbmspOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB1cmxMaW5rKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgZmxhZ3M7Ci0JUG9pbnQgbG9jOwotCWxvbmcgdGFyZ2V0UmVmQ29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZsYWdzOworICAgIFBvaW50IGxvYzsKKyAgICBsb25nIHRhcmdldFJlZkNvbjsKICNpZm5kZWYgTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldFJlZkNvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmQ29uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhSGl0VGVzdFRhcmdldFJlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyB0YXJnZXRSZWZDb247Ci0JbG9uZyBmbGFnczsKLQlQb2ludCBsb2M7Ci0JQm9vbGVhbiB3YXNIaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgdGFyZ2V0UmVmQ29uOworICAgIGxvbmcgZmxhZ3M7CisgICAgUG9pbnQgbG9jOworICAgIEJvb2xlYW4gd2FzSGl0OwogI2lmbmRlZiBNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24KLQlQeU1hY19QUkVDSEVDSyhNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhSGl0VGVzdFRhcmdldFJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhSGl0VGVzdFRhcmdldFJlZkNvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzSGl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNIaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNIaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0hpdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHRhcmdldFJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyB0YXJnZXRSZWZDb247CiAjaWZuZGVmIE1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZpcnN0UmVmQ29uOwotCWxvbmcgc2Vjb25kUmVmQ29uOwotCUJvb2xlYW4gZXF1YWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmlyc3RSZWZDb247CisgICAgbG9uZyBzZWNvbmRSZWZDb247CisgICAgQm9vbGVhbiBlcXVhbDsKICNpZm5kZWYgTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVRhcmdldFJlZkNvbnNFcXVhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RSZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRSZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVRhcmdldFJlZkNvbnNFcXVhbChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRSZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVxdWFsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlcXVhbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRSZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVRhcmdldFJlZkNvbnNFcXVhbChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVxdWFsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFQcmVQcmVyb2xsQ2FuY2VsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogcmVmY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogcmVmY29uOwogI2lmbmRlZiBNZWRpYVByZVByZXJvbGxDYW5jZWwKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVByZVByZXJvbGxDYW5jZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhUHJlUHJlcm9sbENhbmNlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZmNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhUHJlUHJlcm9sbENhbmNlbChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmY29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZmNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhUHJlUHJlcm9sbENhbmNlbChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmY29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUVudGVyRW1wdHlFZGl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhRW50ZXJFbXB0eUVkaXQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUVudGVyRW1wdHlFZGl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUVudGVyRW1wdHlFZGl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUVudGVyRW1wdHlFZGl0KG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFFbnRlckVtcHR5RWRpdChtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIG1pbGxpU2VjczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBtaWxsaVNlY3M7CiAjaWZuZGVmIE1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaVNlY3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2Vjcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpU2Vjcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEVmZmVjdGl2ZVZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgdm9sdW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIE1lZGlhR2V0RWZmZWN0aXZlVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RWZmZWN0aXZlVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQm9vbGVhbiBlbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBCb29sZWFuIGVuYWJsZWQ7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlCb29sZWFuIGVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiBlbmFibGU7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0RWZmZWN0aXZlU291bmRCYWxhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBiYWxhbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBiYWxhbmNlOwogI2lmbmRlZiBNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RWZmZWN0aXZlU291bmRCYWxhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRTY3JlZW5Mb2NrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlCb29sZWFuIGxvY2tJdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiBsb2NrSXQ7CiAjaWZuZGVmIE1lZGlhU2V0U2NyZWVuTG9jawotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U2NyZWVuTG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTY3JlZW5Mb2NrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmbG9ja0l0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTY3JlZW5Mb2NrKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrSXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9ja0l0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTY3JlZW5Mb2NrKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrSXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0RXJyb3JTdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudFJlc3VsdCB0aGVFcnJvcjsKLQlTdHIyNTUgZXJyb3JTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudFJlc3VsdCB0aGVFcnJvcjsKKyAgICBTdHIyNTUgZXJyb3JTdHJpbmc7CiAjaWZuZGVmIE1lZGlhR2V0RXJyb3JTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVycm9yU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVycm9yU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVFcnJvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBlcnJvclN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0RXJyb3JTdHJpbmcobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVFcnJvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZXJyb3JTdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldEVycm9yU3RyaW5nKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRMZXZlbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVVJbnQ4IGJhbmRMZXZlbHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFVJbnQ4IGJhbmRMZXZlbHM7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRMZXZlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFuZExldmVscyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmFuZExldmVscyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYW5kTGV2ZWxzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kTGV2ZWxzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYURvSWRsZUFjdGlvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgTWVkaWFEb0lkbGVBY3Rpb25zCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFEb0lkbGVBY3Rpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYURvSWRsZUFjdGlvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhRG9JZGxlQWN0aW9ucyhtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRG9JZGxlQWN0aW9ucyhtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGJhc3M7Ci0Jc2hvcnQgdHJlYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBiYXNzOworICAgIHNob3J0IHRyZWJsZTsKICNpZm5kZWYgTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kQmFzc0FuZFRyZWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyZWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBiYXNzOwotCXNob3J0IHRyZWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgYmFzczsKKyAgICBzaG9ydCB0cmVibGU7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmFzcywKLQkgICAgICAgICAgICAgICAgICAgICB0cmVibGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlYmxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmVibGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVGltZUJhc2VDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhVGltZUJhc2VDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFUaW1lQmFzZUNoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVGltZUJhc2VDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVRpbWVCYXNlQ2hhbmdlZChtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhVGltZUJhc2VDaGFuZ2VkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYU1DSXNQbGF5ZXJFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JRXZlbnRSZWNvcmQgZTsKLQlCb29sZWFuIGhhbmRsZWRJdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgRXZlbnRSZWNvcmQgZTsKKyAgICBCb29sZWFuIGhhbmRsZWRJdDsKICNpZm5kZWYgTWVkaWFNQ0lzUGxheWVyRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYU1DSXNQbGF5ZXJFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFNQ0lzUGxheWVyRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYU1DSXNQbGF5ZXJFdmVudChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZEl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkSXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFNQ0lzUGxheWVyRXZlbnQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZWRJdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZEl0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE1lZGlhTG9hZFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIG1lZGlhTG9hZFN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIG1lZGlhTG9hZFN0YXRlOwogI2lmbmRlZiBNZWRpYUdldE1lZGlhTG9hZFN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYUxvYWRTdGF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWVkaWFMb2FkU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldE1lZGlhTG9hZFN0YXRlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhTG9hZFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUxvYWRTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFWaWRlb091dHB1dENoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudEluc3RhbmNlIHZvdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudEluc3RhbmNlIHZvdXQ7CiAjaWZuZGVmIE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFWaWRlb091dHB1dENoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm91dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm91dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhRW1wdHlTYW1wbGVDYWNoZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBzYW1wbGVOdW07Ci0JbG9uZyBzYW1wbGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBzYW1wbGVOdW07CisgICAgbG9uZyBzYW1wbGVDb3VudDsKICNpZm5kZWYgTWVkaWFFbXB0eVNhbXBsZUNhY2hlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbXB0eVNhbXBsZUNhY2hlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUVtcHR5U2FtcGxlQ2FjaGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlQ291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUVtcHR5U2FtcGxlQ2FjaGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlQ291bnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFFbXB0eVNhbXBsZUNhY2hlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUNvdW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFB1YmxpY0luZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCU9TVHlwZSBpbmZvU2VsZWN0b3I7Ci0Jdm9pZCAqIGluZm9EYXRhUHRyOwotCVNpemUgaW9EYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgT1NUeXBlIGluZm9TZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb0RhdGFQdHI7CisgICAgU2l6ZSBpb0RhdGFTaXplOwogI2lmbmRlZiBNZWRpYUdldFB1YmxpY0luZm8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldFB1YmxpY0luZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0UHVibGljSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0UHVibGljSW5mbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmlvRGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlvRGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRQdWJsaWNJbmZvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9EYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9EYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRQdWJsaWNJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlPU1R5cGUgaW5mb1NlbGVjdG9yOwotCXZvaWQgKiBpbmZvRGF0YVB0cjsKLQlTaXplIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBPU1R5cGUgaW5mb1NlbGVjdG9yOworICAgIHZvaWQgKiBpbmZvRGF0YVB0cjsKKyAgICBTaXplIGRhdGFTaXplOwogI2lmbmRlZiBNZWRpYVNldFB1YmxpY0luZm8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFB1YmxpY0luZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0UHVibGljSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mb0RhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0UHVibGljSW5mbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRQdWJsaWNJbmZvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFSZWZDb25TZXRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb247Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIHByb3BlcnR5VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgcmVmQ29uOworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBwcm9wZXJ0eVZhbHVlOwogI2lmbmRlZiBNZWRpYVJlZkNvblNldFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFSZWZDb25TZXRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFSZWZDb25TZXRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhUmVmQ29uU2V0UHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhUmVmQ29uU2V0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVJlZkNvbkdldFByb3BlcnR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHJlZkNvbjsKLQlsb25nIHByb3BlcnR5VHlwZTsKLQl2b2lkICogcHJvcGVydHlWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyByZWZDb247CisgICAgbG9uZyBwcm9wZXJ0eVR5cGU7CisgICAgdm9pZCAqIHByb3BlcnR5VmFsdWU7CiAjaWZuZGVmIE1lZGlhUmVmQ29uR2V0UHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVJlZkNvbkdldFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVJlZkNvbkdldFByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFSZWZDb25HZXRQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFSZWZDb25HZXRQcm9wZXJ0eShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgbmF2aWdhdGlvbjsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBuYXZpZ2F0aW9uOworICAgIGxvbmcgcmVmQ29uOwogI2lmbmRlZiBNZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hdmlnYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYXZpZ2F0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR0dldElkbGVNYW5hZ2VyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlJZGxlTWFuYWdlciBwaW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIElkbGVNYW5hZ2VyIHBpbTsKICNpZm5kZWYgTWVkaWFHR2V0SWRsZU1hbmFnZXIKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdHZXRJZGxlTWFuYWdlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHR2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR0dldElkbGVNYW5hZ2VyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9OZXcsIHBpbSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR0dldElkbGVNYW5hZ2VyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9OZXcsIHBpbSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHU2V0SWRsZU1hbmFnZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUlkbGVNYW5hZ2VyIGltOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBJZGxlTWFuYWdlciBpbTsKICNpZm5kZWYgTWVkaWFHU2V0SWRsZU1hbmFnZXIKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdTZXRJZGxlTWFuYWdlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdTZXRJZGxlTWFuYWdlcihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdTZXRJZGxlTWFuYWdlcihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRNSURJR2V0TUlESVBvcnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUTUlESUNvbXBvbmVudCBjaTsKLQlRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzOwotCVFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUTUlESUNvbXBvbmVudCBjaTsKKyAgICBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzOworICAgIFFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzOwogI2lmbmRlZiBRVE1JRElHZXRNSURJUG9ydHMKLQlQeU1hY19QUkVDSEVDSyhRVE1JRElHZXRNSURJUG9ydHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUTUlESUdldE1JRElQb3J0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRNSURJR2V0TUlESVBvcnRzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dFBvcnRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnB1dFBvcnRzLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dHB1dFBvcnRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRNSURJR2V0TUlESVBvcnRzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dFBvcnRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnB1dFBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dHB1dFBvcnRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVE1JRElVc2VTZW5kUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVE1JRElDb21wb25lbnQgY2k7Ci0JbG9uZyBwb3J0SW5kZXg7Ci0JbG9uZyBpblVzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVE1JRElDb21wb25lbnQgY2k7CisgICAgbG9uZyBwb3J0SW5kZXg7CisgICAgbG9uZyBpblVzZTsKICNpZm5kZWYgUVRNSURJVXNlU2VuZFBvcnQKLQlQeU1hY19QUkVDSEVDSyhRVE1JRElVc2VTZW5kUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRNSURJVXNlU2VuZFBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9ydEluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Vc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVE1JRElVc2VTZW5kUG9ydChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5Vc2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRNSURJVXNlU2VuZFBvcnQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVXNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVE1JRElTZW5kTUlESShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVE1JRElDb21wb25lbnQgY2k7Ci0JbG9uZyBwb3J0SW5kZXg7Ci0JTXVzaWNNSURJUGFja2V0IG1wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUTUlESUNvbXBvbmVudCBjaTsKKyAgICBsb25nIHBvcnRJbmRleDsKKyAgICBNdXNpY01JRElQYWNrZXQgbXA7CiAjaWZuZGVmIFFUTUlESVNlbmRNSURJCi0JUHlNYWNfUFJFQ0hFQ0soUVRNSURJU2VuZE1JREkpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUTUlESVNlbmRNSURJKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3J0SW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0TXVzaWNNSURJUGFja2V0X0NvbnZlcnQsICZtcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUTUlESVNlbmRNSURJKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAmbXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0TXVzaWNNSURJUGFja2V0X0NvbnZlcnQsICZtcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUTUlESVNlbmRNSURJKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0UGFydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JbG9uZyBtaWRpQ2hhbm5lbDsKLQlsb25nIHBvbHlwaG9ueTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBtaWRpQ2hhbm5lbDsKKyAgICBsb25nIHBvbHlwaG9ueTsKICNpZm5kZWYgTXVzaWNHZXRQYXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0KG1jLAotCSAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAmbWlkaUNoYW5uZWwsCi0JICAgICAgICAgICAgICAgICAgICZwb2x5cGhvbnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtaWRpQ2hhbm5lbCwKLQkgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydChtYywKKyAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgJm1pZGlDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAmcG9seXBob255KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWlkaUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9seXBob255KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1NldFBhcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgbWlkaUNoYW5uZWw7Ci0JbG9uZyBwb2x5cGhvbnk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIGxvbmcgbWlkaUNoYW5uZWw7CisgICAgbG9uZyBwb2x5cGhvbnk7CiAjaWZuZGVmIE11c2ljU2V0UGFydAotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWlkaUNoYW5uZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb2x5cGhvbnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnQobWMsCi0JICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgIG1pZGlDaGFubmVsLAotCSAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlkaUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2x5cGhvbnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIG1pZGlDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgaW5zdHJ1bWVudE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBpbnN0cnVtZW50TnVtYmVyOwogI2lmbmRlZiBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcGFydDsKICNpZm5kZWYgTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlcgotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlcihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1N0b3JlUGFydEluc3RydW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgaW5zdHJ1bWVudE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBpbnN0cnVtZW50TnVtYmVyOwogI2lmbmRlZiBNdXNpY1N0b3JlUGFydEluc3RydW1lbnQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1N0b3JlUGFydEluc3RydW1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU3RvcmVQYXJ0SW5zdHJ1bWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU3RvcmVQYXJ0SW5zdHJ1bWVudChtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1N0b3JlUGFydEluc3RydW1lbnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCUF0b21pY0luc3RydW1lbnQgYWk7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgQXRvbWljSW5zdHJ1bWVudCBhaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBNdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50KG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBhaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JQXRvbWljSW5zdHJ1bWVudFB0ciBhaVA7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgQXRvbWljSW5zdHJ1bWVudFB0ciBhaVA7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudAotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhaVAsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlQLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWlQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50KG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldFBhcnRLbm9iKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIGtub2JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBrbm9iSUQ7CiAjaWZuZGVmIE11c2ljR2V0UGFydEtub2IKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnRLbm9iKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnRLbm9iKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldFBhcnRLbm9iKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGtub2JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub2JJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydEtub2IobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1NldFBhcnRLbm9iKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIGtub2JJRDsKLQlsb25nIGtub2JWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBrbm9iSUQ7CisgICAgbG9uZyBrbm9iVmFsdWU7CiAjaWZuZGVmIE11c2ljU2V0UGFydEtub2IKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRLbm9iKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRLbm9iKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAma25vYklELAotCSAgICAgICAgICAgICAgICAgICAgICAma25vYlZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZXRQYXJ0S25vYihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBrbm9iSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICBrbm9iVmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYlZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZXRQYXJ0S25vYihtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm9iSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm9iVmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0S25vYihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGtub2JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGtub2JJRDsKICNpZm5kZWYgTXVzaWNHZXRLbm9iCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRLbm9iKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldEtub2IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldEtub2IobWMsCi0JICAgICAgICAgICAgICAgICAgIGtub2JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldEtub2IobWMsCisgICAgICAgICAgICAgICAgICAgICAgIGtub2JJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRLbm9iKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcga25vYklEOwotCWxvbmcga25vYlZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcga25vYklEOworICAgIGxvbmcga25vYlZhbHVlOwogI2lmbmRlZiBNdXNpY1NldEtub2IKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldEtub2IpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0S25vYik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iVmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldEtub2IobWMsCi0JICAgICAgICAgICAgICAgICAgIGtub2JJRCwKLQkgICAgICAgICAgICAgICAgICAga25vYlZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iVmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldEtub2IobWMsCisgICAgICAgICAgICAgICAgICAgICAgIGtub2JJRCwKKyAgICAgICAgICAgICAgICAgICAgICAga25vYlZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldFBhcnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlTdHJpbmdQdHIgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgU3RyaW5nUHRyIG5hbWU7CiAjaWZuZGVmIE11c2ljR2V0UGFydE5hbWUKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0TmFtZShtYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydE5hbWUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0TmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JU3RyaW5nUHRyIG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIFN0cmluZ1B0ciBuYW1lOwogI2lmbmRlZiBNdXNpY1NldFBhcnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydE5hbWUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnROYW1lKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljUGxheU5vdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgcGl0Y2g7Ci0JbG9uZyB2ZWxvY2l0eTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBwaXRjaDsKKyAgICBsb25nIHZlbG9jaXR5OwogI2lmbmRlZiBNdXNpY1BsYXlOb3RlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNQbGF5Tm90ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNQbGF5Tm90ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBpdGNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmVsb2NpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1BsYXlOb3RlKG1jLAotCSAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgIHBpdGNoLAotCSAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZWxvY2l0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljUGxheU5vdGUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNSZXNldFBhcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcGFydDsKICNpZm5kZWYgTXVzaWNSZXNldFBhcnQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1Jlc2V0UGFydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNSZXNldFBhcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNSZXNldFBhcnQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgcGFydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNSZXNldFBhcnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0Q29udHJvbGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXI7Ci0JbG9uZyBjb250cm9sbGVyVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIE11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyOworICAgIGxvbmcgY29udHJvbGxlclZhbHVlOwogI2lmbmRlZiBNdXNpY1NldFBhcnRDb250cm9sbGVyCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0Q29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0Q29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJOdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250cm9sbGVyVmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnRDb250cm9sbGVyKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJOdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyVmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbGxlck51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2V0UGFydENvbnRyb2xsZXIobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlck51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJWYWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRQYXJ0Q29udHJvbGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIE11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyOwogI2lmbmRlZiBNdXNpY0dldFBhcnRDb250cm9sbGVyCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0Q29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0Q29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbGxlck51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0UGFydENvbnRyb2xsZXIobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlck51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJOdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldFBhcnRDb250cm9sbGVyKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJOdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0SW5zdHJ1bWVudE5hbWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzOwotCUhhbmRsZSBpbnN0cnVtZW50TmFtZXM7Ci0JSGFuZGxlIGluc3RydW1lbnRDYXRlZ29yeUxhc3RzOwotCUhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIG1vZGlmaWFibGVJbnN0cnVtZW50czsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzOworICAgIEhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlMYXN0czsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXM7CiAjaWZuZGVmIE11c2ljR2V0SW5zdHJ1bWVudE5hbWVzCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5zdHJ1bWVudE5hbWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpYWJsZUluc3RydW1lbnRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpYWJsZUluc3RydW1lbnRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TmFtZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnRDYXRlZ29yeUxhc3RzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnN0cnVtZW50TmFtZXMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpYWJsZUluc3RydW1lbnRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpYWJsZUluc3RydW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnRDYXRlZ29yeUxhc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnN0cnVtZW50TmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0RHJ1bU5hbWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzOwotCUhhbmRsZSBpbnN0cnVtZW50TnVtYmVyczsKLQlIYW5kbGUgaW5zdHJ1bWVudE5hbWVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzOworICAgIEhhbmRsZSBpbnN0cnVtZW50TnVtYmVyczsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzOwogI2lmbmRlZiBNdXNpY0dldERydW1OYW1lcwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0RHJ1bU5hbWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldERydW1OYW1lcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWFibGVJbnN0cnVtZW50cykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0RHJ1bU5hbWVzKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWFibGVJbnN0cnVtZW50cywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROYW1lcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE51bWJlcnMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE5hbWVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWFibGVJbnN0cnVtZW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0RHJ1bU5hbWVzKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWFibGVJbnN0cnVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROYW1lcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE51bWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE5hbWVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldE1hc3RlclR1bmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CiAjaWZuZGVmIE11c2ljR2V0TWFzdGVyVHVuZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0TWFzdGVyVHVuZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRNYXN0ZXJUdW5lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldE1hc3RlclR1bmUobWMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldE1hc3RlclR1bmUobWMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0TWFzdGVyVHVuZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIG1hc3RlclR1bmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBtYXN0ZXJUdW5lOwogI2lmbmRlZiBNdXNpY1NldE1hc3RlclR1bmUKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldE1hc3RlclR1bmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0TWFzdGVyVHVuZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1hc3RlclR1bmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldE1hc3RlclR1bmUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlclR1bmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFzdGVyVHVuZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2V0TWFzdGVyVHVuZShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyVHVuZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgaW5kZXg7Ci0JbG9uZyBpZDE7Ci0JbG9uZyBpZDI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBpbmRleDsKKyAgICBsb25nIGlkMTsKKyAgICBsb25nIGlkMjsKICNpZm5kZWYgTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldERldmljZUNvbm5lY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0RGV2aWNlQ29ubmVjdGlvbihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZDEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZDIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpZDEsCi0JICAgICAgICAgICAgICAgICAgICAgaWQyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkMik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZDIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljVXNlRGV2aWNlQ29ubmVjdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGlkMTsKLQlsb25nIGlkMjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGlkMTsKKyAgICBsb25nIGlkMjsKICNpZm5kZWYgTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1VzZURldmljZUNvbm5lY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWQxLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWQyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBrbm9iSW5kZXg7Ci0JbG9uZyBpc0dsb2JhbDsKLQlIYW5kbGUgc2V0dGluZ3NOYW1lczsKLQlIYW5kbGUgc2V0dGluZ3NDYXRlZ29yeUxhc3RzOwotCUhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TmFtZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBrbm9iSW5kZXg7CisgICAgbG9uZyBpc0dsb2JhbDsKKyAgICBIYW5kbGUgc2V0dGluZ3NOYW1lczsKKyAgICBIYW5kbGUgc2V0dGluZ3NDYXRlZ29yeUxhc3RzOworICAgIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TmFtZXM7CiAjaWZuZGVmIE11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmtub2JJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzR2xvYmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYkluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzR2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc05hbWVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc0NhdGVnb3J5TGFzdHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzQ2F0ZWdvcnlOYW1lcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc05hbWVzLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzQ2F0ZWdvcnlMYXN0cywKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc0NhdGVnb3J5TmFtZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub2JJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzR2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc05hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc0NhdGVnb3J5TGFzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzQ2F0ZWdvcnlOYW1lcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc05hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzQ2F0ZWdvcnlMYXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc0NhdGVnb3J5TmFtZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0TUlESVBvcnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgaW5wdXRQb3J0Q291bnQ7Ci0JbG9uZyBvdXRwdXRQb3J0Q291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBpbnB1dFBvcnRDb3VudDsKKyAgICBsb25nIG91dHB1dFBvcnRDb3VudDsKICNpZm5kZWYgTXVzaWNHZXRNSURJUG9ydHMKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldE1JRElQb3J0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRNSURJUG9ydHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0TUlESVBvcnRzKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFBvcnRDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0UG9ydENvdW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5wdXRQb3J0Q291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9ydENvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRNSURJUG9ydHMobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0UG9ydENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRQb3J0Q291bnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFBvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQb3J0Q291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2VuZE1JREkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwb3J0SW5kZXg7Ci0JTXVzaWNNSURJUGFja2V0IG1wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcG9ydEluZGV4OworICAgIE11c2ljTUlESVBhY2tldCBtcDsKICNpZm5kZWYgTXVzaWNTZW5kTUlESQotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2VuZE1JREkpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2VuZE1JREkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRNdXNpY01JRElQYWNrZXRfQ29udmVydCwgJm1wKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZW5kTUlESShtYywKLQkgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICZtcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRNdXNpY01JRElQYWNrZXRfQ29udmVydCwgJm1wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZW5kTUlESShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRPZmZsaW5lVGltZVRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgbmV3VGltZVN0YW1wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgbmV3VGltZVN0YW1wOwogI2lmbmRlZiBNdXNpY1NldE9mZmxpbmVUaW1lVG8KLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldE9mZmxpbmVUaW1lVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0T2ZmbGluZVRpbWVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTdGFtcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0T2ZmbGluZVRpbWVUbyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVN0YW1wKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTdGFtcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2V0T2ZmbGluZVRpbWVUbyhtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVN0YW1wKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldEluZm9UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgc2VsZWN0b3I7Ci0JSGFuZGxlIHRleHRIOwotCUhhbmRsZSBzdHlsZUg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBzZWxlY3RvcjsKKyAgICBIYW5kbGUgdGV4dEg7CisgICAgSGFuZGxlIHN0eWxlSDsKICNpZm5kZWYgTXVzaWNHZXRJbmZvVGV4dAotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5mb1RleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5mb1RleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0SW5mb1RleHQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZUgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRleHRILAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHN0eWxlSCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0SW5mb1RleHQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZUgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRleHRILAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHN0eWxlSCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRJbnN0cnVtZW50SW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGdldEluc3RydW1lbnRJbmZvRmxhZ3M7Ci0JSW5zdHJ1bWVudEluZm9MaXN0SGFuZGxlIGluZm9MaXN0SDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGdldEluc3RydW1lbnRJbmZvRmxhZ3M7CisgICAgSW5zdHJ1bWVudEluZm9MaXN0SGFuZGxlIGluZm9MaXN0SDsKICNpZm5kZWYgTXVzaWNHZXRJbnN0cnVtZW50SW5mbwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5zdHJ1bWVudEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5zdHJ1bWVudEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZnZXRJbnN0cnVtZW50SW5mb0ZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRJbnN0cnVtZW50SW5mbyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRJbmZvRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb0xpc3RIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5mb0xpc3RIKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdldEluc3RydW1lbnRJbmZvRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldEluc3RydW1lbnRJbmZvKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudEluZm9GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvTGlzdEgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbmZvTGlzdEgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljVGFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKICNpZm5kZWYgTXVzaWNUYXNrCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNUYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1Rhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljVGFzayhtYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljVGFzayhtYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgaW5zdHJ1bWVudE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBpbnN0cnVtZW50TnVtYmVyOwogI2lmbmRlZiBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlIYW5kbGUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgSGFuZGxlIGRhdGE7CiAjaWZuZGVmIE11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbihtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2VuZXJpY0NvbmZpZ3VyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIG1vZGU7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGJhc2VSZXNJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIG1vZGU7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGJhc2VSZXNJRDsKICNpZm5kZWYgTXVzaWNHZW5lcmljQ29uZmlndXJlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZW5lcmljQ29uZmlndXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dlbmVyaWNDb25maWd1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhc2VSZXNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2VuZXJpY0NvbmZpZ3VyZShtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VSZXNJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhc2VSZXNJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2VuZXJpY0NvbmZpZ3VyZShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VSZXNJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZW5lcmljR2V0S25vYkxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBrbm9iVHlwZTsKLQlHZW5lcmljS25vYkRlc2NyaXB0aW9uTGlzdEhhbmRsZSBna2RsSDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGtub2JUeXBlOworICAgIEdlbmVyaWNLbm9iRGVzY3JpcHRpb25MaXN0SGFuZGxlIGdrZGxIOwogI2lmbmRlZiBNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdAotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2VuZXJpY0dldEtub2JMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmtub2JUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZW5lcmljR2V0S25vYkxpc3QobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdrZGxIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2tkbEgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdChtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm9iVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2tkbEgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBna2RsSCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZW5lcmljU2V0UmVzb3VyY2VOdW1iZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCUhhbmRsZSByZXNvdXJjZUlESDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBIYW5kbGUgcmVzb3VyY2VJREg7CiAjaWZuZGVmIE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZW5lcmljU2V0UmVzb3VyY2VOdW1iZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZXNvdXJjZUlESCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJREgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZXNvdXJjZUlESCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyhtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJREgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljRGVyaXZlZE1JRElTZW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCU11c2ljTUlESVBhY2tldCBwYWNrZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgTXVzaWNNSURJUGFja2V0IHBhY2tldDsKICNpZm5kZWYgTXVzaWNEZXJpdmVkTUlESVNlbmQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0Rlcml2ZWRNSURJU2VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkTUlESVNlbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0LCAmcGFja2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNEZXJpdmVkTUlESVNlbmQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0LCAmcGFja2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNEZXJpdmVkTUlESVNlbmQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CiAjaWZuZGVmIE11c2ljRGVyaXZlZE9wZW5SZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljRGVyaXZlZE9wZW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZShtYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljRGVyaXZlZE9wZW5SZXNGaWxlKG1jKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0Jc2hvcnQgcmVzUmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIHNob3J0IHJlc1JlZk51bTsKICNpZm5kZWYgTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTm90ZUFsbG9jYXRvciBuYTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE5vdGVBbGxvY2F0b3IgbmE7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhOQVVucmVnaXN0ZXJNdXNpY0RldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5BVW5yZWdpc3Rlck11c2ljRGV2aWNlKG5hLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UobmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05BU2F2ZU11c2ljQ29uZmlndXJhdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlOb3RlQWxsb2NhdG9yIG5hOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE5vdGVBbGxvY2F0b3IgbmE7CiAjaWZuZGVmIE5BU2F2ZU11c2ljQ29uZmlndXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKE5BU2F2ZU11c2ljQ29uZmlndXJhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24obmEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24obmEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05BR2V0TUlESVBvcnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU5vdGVBbGxvY2F0b3IgbmE7Ci0JUVRNSURJUG9ydExpc3RIYW5kbGUgaW5wdXRQb3J0czsKLQlRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBOb3RlQWxsb2NhdG9yIG5hOworICAgIFFUTUlESVBvcnRMaXN0SGFuZGxlIGlucHV0UG9ydHM7CisgICAgUVRNSURJUG9ydExpc3RIYW5kbGUgb3V0cHV0UG9ydHM7CiAjaWZuZGVmIE5BR2V0TUlESVBvcnRzCi0JUHlNYWNfUFJFQ0hFQ0soTkFHZXRNSURJUG9ydHMpOworICAgIFB5TWFjX1BSRUNIRUNLKE5BR2V0TUlESVBvcnRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOQUdldE1JRElQb3J0cyhuYSwKLQkgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKLQkgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0UG9ydHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlucHV0UG9ydHMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0cHV0UG9ydHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOQUdldE1JRElQb3J0cyhuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0UG9ydHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlucHV0UG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0cHV0UG9ydHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05BVGFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlOb3RlQWxsb2NhdG9yIG5hOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE5vdGVBbGxvY2F0b3IgbmE7CiAjaWZuZGVmIE5BVGFzawotCVB5TWFjX1BSRUNIRUNLKE5BVGFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTkFUYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOQVRhc2sobmEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOQVRhc2sobmEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRIZWFkZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQl1bnNpZ25lZCBsb25nICogaGVhZGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgdW5zaWduZWQgbG9uZyAqIGhlYWRlcjsKICNpZm5kZWYgVHVuZVNldEhlYWRlcgotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRIZWFkZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRIZWFkZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0SGVhZGVyKHRwLAotCSAgICAgICAgICAgICAgICAgICAgaGVhZGVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTZXRIZWFkZXIodHAsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVHZXRUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCVRpbWVCYXNlIHRiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgVGltZUJhc2UgdGI7CiAjaWZuZGVmIFR1bmVHZXRUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVHZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZUdldFRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lR2V0VGltZUJhc2UodHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0Yik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgdGIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0VGltZUJhc2UodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0Yik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgdGIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRUaW1lU2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlUaW1lU2NhbGUgc2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIFR1bmVTZXRUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0VGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0VGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0VGltZVNjYWxlKHRwLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0VGltZVNjYWxlKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVHZXRUaW1lU2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlUaW1lU2NhbGUgc2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIFR1bmVHZXRUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhUdW5lR2V0VGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lR2V0VGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lR2V0VGltZVNjYWxlKHRwLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVHZXRUaW1lU2NhbGUodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lSW5zdGFudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgdHVuZTsKLQl1bnNpZ25lZCBsb25nIHR1bmVQb3NpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIHVuc2lnbmVkIGxvbmcgdHVuZTsKKyAgICB1bnNpZ25lZCBsb25nIHR1bmVQb3NpdGlvbjsKICNpZm5kZWYgVHVuZUluc3RhbnQKLQlQeU1hY19QUkVDSEVDSyhUdW5lSW5zdGFudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZUluc3RhbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0dW5lUG9zaXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lSW5zdGFudCh0cCwKLQkgICAgICAgICAgICAgICAgICAmdHVuZSwKLQkgICAgICAgICAgICAgICAgICB0dW5lUG9zaXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHR1bmUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHVuZVBvc2l0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZUluc3RhbnQodHAsCisgICAgICAgICAgICAgICAgICAgICAgJnR1bmUsCisgICAgICAgICAgICAgICAgICAgICAgdHVuZVBvc2l0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0dW5lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU3RvcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCWxvbmcgc3RvcEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgbG9uZyBzdG9wRmxhZ3M7CiAjaWZuZGVmIFR1bmVTdG9wCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZVN0b3ApOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTdG9wKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RvcEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVN0b3AodHAsCi0JICAgICAgICAgICAgICAgc3RvcEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3BGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTdG9wKHRwLAorICAgICAgICAgICAgICAgICAgIHN0b3BGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZVNldFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCUZpeGVkIHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIEZpeGVkIHZvbHVtZTsKICNpZm5kZWYgVHVuZVNldFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVTZXRWb2x1bWUodHAsCi0JICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ2b2x1bWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0Vm9sdW1lKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lR2V0Vm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZUdldFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVHZXRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVHZXRWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVHZXRWb2x1bWUodHApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0Vm9sdW1lKHRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lUHJlcm9sbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CiAjaWZuZGVmIFR1bmVQcmVyb2xsCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZVByZXJvbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVQcmVyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lUHJlcm9sbCh0cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVQcmVyb2xsKHRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lVW5yb2xsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZVVucm9sbAotCVB5TWFjX1BSRUNIRUNLKFR1bmVVbnJvbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVVbnJvbGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVVbnJvbGwodHApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lVW5yb2xsKHRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0UGFydFRyYW5zcG9zZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgcGFydDsKLQlsb25nIHRyYW5zcG9zZTsKLQlsb25nIHZlbG9jaXR5U2hpZnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICB1bnNpZ25lZCBsb25nIHBhcnQ7CisgICAgbG9uZyB0cmFuc3Bvc2U7CisgICAgbG9uZyB2ZWxvY2l0eVNoaWZ0OwogI2lmbmRlZiBUdW5lU2V0UGFydFRyYW5zcG9zZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRQYXJ0VHJhbnNwb3NlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0UGFydFRyYW5zcG9zZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9zZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZlbG9jaXR5U2hpZnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0UGFydFRyYW5zcG9zZSh0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVNoaWZ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlbG9jaXR5U2hpZnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0UGFydFRyYW5zcG9zZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVNoaWZ0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lR2V0Tm90ZUFsbG9jYXRvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTm90ZUFsbG9jYXRvciBfcnY7Ci0JVHVuZVBsYXllciB0cDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTm90ZUFsbG9jYXRvciBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZUdldE5vdGVBbGxvY2F0b3IKLQlQeU1hY19QUkVDSEVDSyhUdW5lR2V0Tm90ZUFsbG9jYXRvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZUdldE5vdGVBbGxvY2F0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVHZXROb3RlQWxsb2NhdG9yKHRwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0Tm90ZUFsbG9jYXRvcih0cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0U29mdGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JbG9uZyBzb2Z0ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBsb25nIHNvZnRlcjsKICNpZm5kZWYgVHVuZVNldFNvZnRlcgotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRTb2Z0ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRTb2Z0ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZzb2Z0ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0U29mdGVyKHRwLAotCSAgICAgICAgICAgICAgICAgICAgc29mdGVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvZnRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTZXRTb2Z0ZXIodHAsCisgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0ZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZVRhc2sKLQlQeU1hY19QUkVDSEVDSyhUdW5lVGFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVRhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVUYXNrKHRwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVRhc2sodHApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRCYWxhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JbG9uZyBiYWxhbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgbG9uZyBiYWxhbmNlOwogI2lmbmRlZiBUdW5lU2V0QmFsYW5jZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRCYWxhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0QmFsYW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0QmFsYW5jZSh0cCwKLQkgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0QmFsYW5jZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0U291bmRMb2NhbGl6YXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlIYW5kbGUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIEhhbmRsZSBkYXRhOwogI2lmbmRlZiBUdW5lU2V0U291bmRMb2NhbGl6YXRpb24KLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0U291bmRMb2NhbGl6YXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRTb3VuZExvY2FsaXphdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVTZXRTb3VuZExvY2FsaXphdGlvbih0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0U291bmRMb2NhbGl6YXRpb24odHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRIZWFkZXJXaXRoU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgKiBoZWFkZXI7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgdW5zaWduZWQgbG9uZyAqIGhlYWRlcjsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CiAjaWZuZGVmIFR1bmVTZXRIZWFkZXJXaXRoU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRIZWFkZXJXaXRoU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVNldEhlYWRlcldpdGhTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0SGVhZGVyV2l0aFNpemUodHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTZXRIZWFkZXJXaXRoU2l6ZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0UGFydE1peChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgcGFydE51bWJlcjsKLQlsb25nIHZvbHVtZTsKLQlsb25nIGJhbGFuY2U7Ci0JbG9uZyBtaXhGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIHVuc2lnbmVkIGxvbmcgcGFydE51bWJlcjsKKyAgICBsb25nIHZvbHVtZTsKKyAgICBsb25nIGJhbGFuY2U7CisgICAgbG9uZyBtaXhGbGFnczsKICNpZm5kZWYgVHVuZVNldFBhcnRNaXgKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0UGFydE1peCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVNldFBhcnRNaXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0TnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1peEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVNldFBhcnRNaXgodHAsCi0JICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICB2b2x1bWUsCi0JICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICBtaXhGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1peEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVNldFBhcnRNaXgodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaXhGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZUdldFBhcnRNaXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQl1bnNpZ25lZCBsb25nIHBhcnROdW1iZXI7Ci0JbG9uZyB2b2x1bWVPdXQ7Ci0JbG9uZyBiYWxhbmNlT3V0OwotCWxvbmcgbWl4RmxhZ3NPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXI7CisgICAgbG9uZyB2b2x1bWVPdXQ7CisgICAgbG9uZyBiYWxhbmNlT3V0OworICAgIGxvbmcgbWl4RmxhZ3NPdXQ7CiAjaWZuZGVmIFR1bmVHZXRQYXJ0TWl4Ci0JUHlNYWNfUFJFQ0hFQ0soVHVuZUdldFBhcnRNaXgpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVHZXRQYXJ0TWl4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVHZXRQYXJ0TWl4KHRwLAotCSAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZU91dCwKLQkgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZU91dCwKLQkgICAgICAgICAgICAgICAgICAgICAmbWl4RmxhZ3NPdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdm9sdW1lT3V0LAotCSAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgbWl4RmxhZ3NPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydE51bWJlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVHZXRQYXJ0TWl4KHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbWl4RmxhZ3NPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWl4RmxhZ3NPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0FsaWduV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgd3A7Ci0JQm9vbGVhbiBmcm9udDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIHdwOworICAgIEJvb2xlYW4gZnJvbnQ7CiAjaWZuZGVmIEFsaWduV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soQWxpZ25XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEFsaWduV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcm9udCkpCi0JCXJldHVybiBOVUxMOwotCUFsaWduV2luZG93KHdwLAotCSAgICAgICAgICAgIGZyb250LAotCSAgICAgICAgICAgIChSZWN0ICopMCwKLQkgICAgICAgICAgICAoSUNNQWxpZ25tZW50UHJvY1JlY29yZFB0cikwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQWxpZ25XaW5kb3cod3AsCisgICAgICAgICAgICAgICAgZnJvbnQsCisgICAgICAgICAgICAgICAgKFJlY3QgKikwLAorICAgICAgICAgICAgICAgIChJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyKTApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EcmFnQWxpZ25lZFdpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIHdwOwotCVBvaW50IHN0YXJ0UHQ7Ci0JUmVjdCBib3VuZHNSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgd3A7CisgICAgUG9pbnQgc3RhcnRQdDsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CiAjaWZuZGVmIERyYWdBbGlnbmVkV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhZ0FsaWduZWRXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYWdBbGlnbmVkV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd3AsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmFnQWxpZ25lZFdpbmRvdyh3cCwKLQkgICAgICAgICAgICAgICAgICBzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgIChSZWN0ICopMCwKLQkgICAgICAgICAgICAgICAgICAoSUNNQWxpZ25tZW50UHJvY1JlY29yZFB0cikwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYWdBbGlnbmVkV2luZG93KHdwLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgKFJlY3QgKikwLAorICAgICAgICAgICAgICAgICAgICAgIChJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyKTApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZXNUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG1heE1pbGxpU2VjVG9Vc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbWF4TWlsbGlTZWNUb1VzZTsKICNpZm5kZWYgTW92aWVzVGFzawotCVB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhNaWxsaVNlY1RvVXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTW92aWVzVGFzaygoTW92aWUpMCwKLQkgICAgICAgICAgIG1heE1pbGxpU2VjVG9Vc2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE1pbGxpU2VjVG9Vc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZpZXNUYXNrKChNb3ZpZSkwLAorICAgICAgICAgICAgICAgbWF4TWlsbGlTZWNUb1VzZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBRdF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJFbnRlck1vdmllcyIsIChQeUNGdW5jdGlvbilRdF9FbnRlck1vdmllcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRXhpdE1vdmllcyIsIChQeUNGdW5jdGlvbilRdF9FeGl0TW92aWVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZXNFcnJvciIsIChQeUNGdW5jdGlvbilRdF9HZXRNb3ZpZXNFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ2xlYXJNb3ZpZXNTdGlja3lFcnJvciIsIChQeUNGdW5jdGlvbilRdF9DbGVhck1vdmllc1N0aWNreUVycm9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZXNTdGlja3lFcnJvciIsIChQeUNGdW5jdGlvbilRdF9HZXRNb3ZpZXNTdGlja3lFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9RVEdldFdhbGxDbG9ja1RpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lQmFzZSB3YWxsQ2xvY2tUaW1lQmFzZSkiKX0sCi0JeyJRVElkbGVNYW5hZ2VyT3BlbiIsIChQeUNGdW5jdGlvbilRdF9RVElkbGVNYW5hZ2VyT3BlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSWRsZU1hbmFnZXIgX3J2KSIpfSwKLQl7IkNyZWF0ZU1vdmllQ29udHJvbCIsIChQeUNGdW5jdGlvbilRdF9DcmVhdGVNb3ZpZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB0aGVXaW5kb3csIE1vdmllIHRoZU1vdmllLCBVSW50MzIgb3B0aW9ucykgLT4gKFJlY3QgbG9jYWxSZWN0LCBDb250cm9sSGFuZGxlIHJldHVybmVkQ29udHJvbCkiKX0sCi0JeyJEaXNwb3NlTWF0dGUiLCAoUHlDRnVuY3Rpb24pUXRfRGlzcG9zZU1hdHRlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgdGhlTWF0dGUpIC0+IE5vbmUiKX0sCi0JeyJOZXdNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJRVEdldFRpbWVVbnRpbE5leHRUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0VGltZVVudGlsTmV4dFRhc2ssIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgc2NhbGUpIC0+IChsb25nIGR1cmF0aW9uKSIpfSwKLQl7IkdldERhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldERhdGFIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFIYW5kbGVyU3ViVHlwZSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudCBfcnYpIil9LAotCXsiUGFzdGVIYW5kbGVJbnRvTW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfUGFzdGVIYW5kbGVJbnRvTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoLCBPU1R5cGUgaGFuZGxlVHlwZSwgTW92aWUgdGhlTW92aWUsIGxvbmcgZmxhZ3MsIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIGRhdGFSZWYsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnQgaW1wb3J0ZXIpIil9LAotCXsiUVRHZXRNSU1FVHlwZUluZm8iLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRNSU1FVHlwZUluZm8sIDEsCi0JIFB5RG9jX1NUUigiKGNoYXIqIG1pbWVTdHJpbmdTdGFydCwgc2hvcnQgbWltZVN0cmluZ0xlbmd0aCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyKSAtPiAobG9uZyBpbmZvRGF0YVNpemUpIil9LAotCXsiVHJhY2tUaW1lVG9NZWRpYVRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfVHJhY2tUaW1lVG9NZWRpYVRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB2YWx1ZSwgVHJhY2sgdGhlVHJhY2spIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7Ik5ld1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld1VzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVc2VyRGF0YSB0aGVVc2VyRGF0YSkiKX0sCi0JeyJOZXdVc2VyRGF0YUZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3VXNlckRhdGFGcm9tSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKFVzZXJEYXRhIHRoZVVzZXJEYXRhKSIpfSwKLQl7IkNyZWF0ZU1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9DcmVhdGVNb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzKSAtPiAoc2hvcnQgcmVzUmVmTnVtLCBNb3ZpZSBuZXdtb3ZpZSkiKX0sCi0JeyJPcGVuTW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X09wZW5Nb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlc1JlZk51bSkiKX0sCi0JeyJDbG9zZU1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9DbG9zZU1vdmllRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlbGV0ZU1vdmllRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGZpbGVTcGVjKSAtPiBOb25lIil9LAotCXsiTmV3TW92aWVGcm9tRmlsZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21GaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZXNSZWZOdW0sIHNob3J0IHJlc0lkLCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIHNob3J0IHJlc0lkLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKLQl7Ik5ld01vdmllRnJvbUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoLCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQpIil9LAotCXsiTmV3TW92aWVGcm9tRGF0YUZvcmsiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRGF0YUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZSZWZOdW0sIGxvbmcgZmlsZU9mZnNldCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKLQl7Ik5ld01vdmllRnJvbURhdGFGb3JrNjQiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRGF0YUZvcms2NCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmUmVmTnVtLCB3aWRlIGZpbGVPZmZzZXQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCi0JeyJOZXdNb3ZpZUZyb21EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZsYWdzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGR0YVJlZlR5cGUpIC0+IChNb3ZpZSBtLCBzaG9ydCBpZCkiKX0sCi0JeyJOZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB3aWRlIGZpbGVPZmZzZXQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2F0YVJlZlR5cGUpIil9LAotCXsiTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCwgc2hvcnQgbmV3TW92aWVGbGFncywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKLQl7IlJlbW92ZU1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfUmVtb3ZlTW92aWVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCkgLT4gTm9uZSIpfSwKLQl7IkNyZWF0ZU1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9DcmVhdGVNb3ZpZVN0b3JhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKERhdGFIYW5kbGVyIG91dERhdGFIYW5kbGVyLCBNb3ZpZSBuZXdtb3ZpZSkiKX0sCi0JeyJPcGVuTW92aWVTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X09wZW5Nb3ZpZVN0b3JhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgZmxhZ3MpIC0+IChEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcikiKX0sCi0JeyJDbG9zZU1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9DbG9zZU1vdmllU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCi0JeyJEZWxldGVNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfRGVsZXRlTW92aWVTdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAotCXsiQ3JlYXRlU2hvcnRjdXRNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlU2hvcnRjdXRNb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzLCBIYW5kbGUgdGFyZ2V0RGF0YVJlZiwgT1NUeXBlIHRhcmdldERhdGFSZWZUeXBlKSAtPiBOb25lIil9LAotCXsiQ2FuUXVpY2tUaW1lT3BlbkZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ2FuUXVpY2tUaW1lT3BlbkZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZU5hbWVFeHRlbnNpb24sIFVJbnQzMiBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsIEJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWUsIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcikiKX0sCi0JeyJDYW5RdWlja1RpbWVPcGVuRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9DYW5RdWlja1RpbWVPcGVuRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgVUludDMyIGluRmxhZ3MpIC0+IChCb29sZWFuIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwgQm9vbGVhbiBvdXRDYW5PcGVuQXNNb3ZpZSwgQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyKSIpfSwKLQl7Ik5ld01vdmllRnJvbVNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbVNjcmFwLCAxLAotCSBQeURvY19TVFIoIihsb25nIG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiUVROZXdBbGlhcyIsIChQeUNGdW5jdGlvbilRdF9RVE5ld0FsaWFzLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZnNzLCBCb29sZWFuIG1pbmltYWwpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCi0JeyJFbmRGdWxsU2NyZWVuIiwgKFB5Q0Z1bmN0aW9uKVF0X0VuZEZ1bGxTY3JlZW4sIDEsCi0JIFB5RG9jX1NUUigiKFB0ciBmdWxsU3RhdGUsIGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJBZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgSGFuZGxlIGV4dGVuc2lvbiwgT1NUeXBlIGlkVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkdldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgaWRUeXBlKSAtPiAoSGFuZGxlIGV4dGVuc2lvbikiKX0sCi0JeyJSZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZVNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIGlkVHlwZSkgLT4gTm9uZSIpfSwKLQl7IlFUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50LCAxLAotCSBQeURvY19TVFIoIihRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nKSAtPiAoRXZlbnRSZWNvcmQgcEV2ZW50KSIpfSwKLQl7IlFURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKVF0X1FURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nLCAxLAotCSBQeURvY19TVFIoIihRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nKSAtPiBOb25lIil9LAotCXsiUVRTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0RvQWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZywgbG9uZyBhY3Rpb24sIHZvaWQgKiBwYXJhbXMpIC0+IE5vbmUiKX0sCi0JeyJRVFJlZ2lzdGVyQWNjZXNzS2V5IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUUmVnaXN0ZXJBY2Nlc3NLZXksIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBhY2Nlc3NLZXlUeXBlLCBsb25nIGZsYWdzLCBIYW5kbGUgYWNjZXNzS2V5KSAtPiBOb25lIil9LAotCXsiUVRVbnJlZ2lzdGVyQWNjZXNzS2V5IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVW5yZWdpc3RlckFjY2Vzc0tleSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IGFjY2Vzc0tleVR5cGUsIGxvbmcgZmxhZ3MsIEhhbmRsZSBhY2Nlc3NLZXkpIC0+IE5vbmUiKX0sCi0JeyJRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyIsIChQeUNGdW5jdGlvbilRdF9RVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGluUmVzdHJpY3Rpb25DbGFzcykgLT4gKFVJbnQzMiBvdXRSZXN0cmljdGlvbklEcykiKX0sCi0JeyJRVFRleHRUb05hdGl2ZVRleHQiLCAoUHlDRnVuY3Rpb24pUXRfUVRUZXh0VG9OYXRpdmVUZXh0LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdGhlVGV4dCwgbG9uZyBlbmNvZGluZywgbG9uZyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IlZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWaWRlb01lZGlhR2V0U3RhdGlzdGljcyIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhR2V0U3RhdGlzdGljcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWaWRlb01lZGlhR2V0U3RhbGxDb3VudCIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhR2V0U3RhbGxDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzdGFsbHMpIil9LAotCXsiVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb2RlY1R5cGUgY1R5cGUsIE9TVHlwZSBwYXJhbWV0ZXJJRCwgbG9uZyBwYXJhbWV0ZXJDaGFuZ2VTZWVkLCB2b2lkICogZGF0YVB0ciwgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb2RlY1R5cGUgY1R5cGUsIE9TVHlwZSBwYXJhbWV0ZXJJRCwgSGFuZGxlIG91dFBhcmFtZXRlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYUFkZFRleHRTYW1wbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhQWRkVGV4dFNhbXBsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGV4dCwgdW5zaWduZWQgbG9uZyBzaXplLCBzaG9ydCBmb250TnVtYmVyLCBzaG9ydCBmb250U2l6ZSwgU3R5bGUgdGV4dEZhY2UsIHNob3J0IHRleHRKdXN0aWZpY2F0aW9uLCBsb25nIGRpc3BsYXlGbGFncywgVGltZVZhbHVlIHNjcm9sbERlbGF5LCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciB0ZXh0Q29sb3IsIFJHQkNvbG9yIGJhY2tDb2xvciwgUmVjdCB0ZXh0Qm94LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiVGV4dE1lZGlhQWRkVEVTYW1wbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhQWRkVEVTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVEVIYW5kbGUgaFRFLCBzaG9ydCB0ZXh0SnVzdGlmaWNhdGlvbiwgbG9uZyBkaXNwbGF5RmxhZ3MsIFRpbWVWYWx1ZSBzY3JvbGxEZWxheSwgc2hvcnQgaGlsaXRlU3RhcnQsIHNob3J0IGhpbGl0ZUVuZCwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgYmFja0NvbG9yLCBSZWN0IHRleHRCb3gsIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yLCBUaW1lVmFsdWUgc2FtcGxlVGltZSkiKX0sCi0JeyJUZXh0TWVkaWFBZGRIaWxpdGVTYW1wbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yLCBUaW1lVmFsdWUgc2FtcGxlVGltZSkiKX0sCi0JeyJUZXh0TWVkaWFEcmF3UmF3IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYURyYXdSYXcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgR1dvcmxkUHRyIGd3LCBHREhhbmRsZSBnZCwgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUsIFRleHREZXNjcmlwdGlvbkhhbmRsZSB0ZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYVNldFRleHRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFTZXRUZXh0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIGF0TWVkaWFUaW1lLCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYVJhd1NldHVwIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYVJhd1NldHVwLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEdXb3JsZFB0ciBndywgR0RIYW5kbGUgZ2QsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplLCBUZXh0RGVzY3JpcHRpb25IYW5kbGUgdGRoLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYVJhd0lkbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhUmF3SWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBHV29ybGRQdHIgZ3csIEdESGFuZGxlIGdkLCBUaW1lVmFsdWUgc2FtcGxlVGltZSwgbG9uZyBmbGFnc0luKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFnc091dCkiKX0sCi0JeyJUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUZXh0TWVkaWFGaW5kTmV4dFRleHQiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhRmluZE5leHRUZXh0LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFB0ciB0ZXh0LCBsb25nIHNpemUsIHNob3J0IGZpbmRGbGFncywgVGltZVZhbHVlIHN0YXJ0VGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBmb3VuZFRpbWUsIFRpbWVWYWx1ZSBmb3VuZER1cmF0aW9uLCBsb25nIG9mZnNldCkiKX0sCi0JeyJUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUhpbGl0ZVRleHRTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvcikiKX0sCi0JeyJUZXh0TWVkaWFTZXRUZXh0U2FtcGxlRGF0YSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFTZXRUZXh0U2FtcGxlRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogZGF0YSwgT1NUeXBlIGRhdGFUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYVNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU2V0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgc3ByaXRlSW5kZXgsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHNwcml0ZUluZGV4LCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBzcHJpdGVIaXRJbmRleCkiKX0sCi0JeyJTcHJpdGVNZWRpYUNvdW50U3ByaXRlcyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUNvdW50U3ByaXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgbnVtU3ByaXRlcykiKX0sCi0JeyJTcHJpdGVNZWRpYUNvdW50SW1hZ2VzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhQ291bnRJbWFnZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IG51bUltYWdlcykiKX0sCi0JeyJTcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGltYWdlSW5kZXgsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaW1hZ2VEZXNjcmlwdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2FtcGxlTnVtKSIpfSwKLQl7IlNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQsIFN0cjI1NSBzcHJpdGVOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYUdldEltYWdlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEltYWdlTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4LCBTdHIyNTUgaW1hZ2VOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEF0b21JRCBzcHJpdGVIaXRJRCkiKX0sCi0JeyJTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdhc0hpdCkiKX0sCi0JeyJTcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBzcHJpdGVJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUQXRvbUlEIHNwcml0ZUlEKSIpfSwKLQl7IlNwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgc3ByaXRlSW5kZXgpIil9LAotCXsiU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQsIGZsb2F0IHZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgdmFyaWFibGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGZsb2F0IHZhbHVlKSIpfSwKLQl7IlNwcml0ZU1lZGlhRGlzcG9zZVNwcml0ZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgdmFyaWFibGVJRCwgUHRyIHRoZUNTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGVBc1N0cmluZyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgdmFyaWFibGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0aGVDU3RyaW5nKSIpfSwKLQl7IlNwcml0ZU1lZGlhTmV3SW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFOZXdJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBRVEF0b21JRCBkZXNpcmVkSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhRGlzcG9zZUltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhRGlzcG9zZUltYWdlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGltYWdlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRBdG9tSUQgaW1hZ2VJRCkiKX0sCi0JeyJTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgaW1hZ2VJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGltYWdlSW5kZXgpIil9LAotCXsiRmxhc2hNZWRpYVNldFBhbiIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhU2V0UGFuLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHhQZXJjZW50LCBzaG9ydCB5UGVyY2VudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRmxhc2hNZWRpYVNldFpvb20iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldFpvb20sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgZmFjdG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJGbGFzaE1lZGlhU2V0Wm9vbVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldFpvb21SZWN0LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgbGVmdCwgbG9uZyB0b3AsIGxvbmcgcmlnaHQsIGxvbmcgYm90dG9tKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJGbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGxlZnQsIGxvbmcgdG9wLCBsb25nIHJpZ2h0LCBsb25nIGJvdHRvbSkiKX0sCi0JeyJGbGFzaE1lZGlhR2V0UmVmQ29uSUQiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUdldFJlZkNvbklELCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb25JRCkiKX0sCi0JeyJGbGFzaE1lZGlhSURUb1JlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhSURUb1JlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbklEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb24pIil9LAotCXsiRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFzaEZyYW1lTnVtYmVyKSIpfSwKLQl7IkZsYXNoTWVkaWFGcmFtZU51bWJlclRvTW92aWVUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFGcmFtZU51bWJlclRvTW92aWVUaW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhc2hGcmFtZU51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBtb3ZpZVRpbWUpIil9LAotCXsiRmxhc2hNZWRpYUZyYW1lTGFiZWxUb01vdmllVGltZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRnJhbWVMYWJlbFRvTW92aWVUaW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFB0ciB0aGVMYWJlbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBtb3ZpZVRpbWUpIil9LAotCXsiRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgcGF0aCwgY2hhciBuYW1lLCBIYW5kbGUgdGhlVmFyaWFibGVDU3RyaW5nT3V0KSIpfSwKLQl7IkZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gdXBkYXRlRm9jdXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIHBhdGgsIGNoYXIgbmFtZSwgY2hhciB2YWx1ZSkiKX0sCi0JeyJGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBidXR0b25JRCwgbG9uZyB0cmFuc2l0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBwYXRoKSIpfSwKLQl7IkZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50OCBzd2ZWZXJzaW9uKSIpfSwKLQl7Ik1lZGlhM0RHZXRDdXJyZW50R3JvdXAiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldEN1cnJlbnRHcm91cCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogZ3JvdXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHgsIEZpeGVkIHksIEZpeGVkIHopIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG9iamVjdE5hbWUpIil9LAotCXsiTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHhTY2FsZSwgRml4ZWQgeVNjYWxlLCBGaXhlZCB6U2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG9iamVjdE5hbWUpIil9LAotCXsiTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgRml4ZWQgeERlZ3JlZXMsIEZpeGVkIHlEZWdyZWVzLCBGaXhlZCB6RGVncmVlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgb2JqZWN0TmFtZSkiKX0sCi0JeyJNZWRpYTNEU2V0Q2FtZXJhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2V0Q2FtZXJhRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogY2FtZXJhRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWEzREdldENhbWVyYURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldENhbWVyYURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGNhbWVyYURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRGbG9hdFNpbmdsZSBmb3YsIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEZsb2F0U2luZ2xlIGZvdiwgUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1kpIil9LAotCXsiTWVkaWEzRFNldENhbWVyYVJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RTZXRDYW1lcmFSYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogdFEzQ2FtZXJhUmFuZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhM0RHZXRDYW1lcmFSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNER2V0Q2FtZXJhUmFuZ2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIHRRM0NhbWVyYVJhbmdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJOZXdUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9OZXdUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKLQl7IkNvbnZlcnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbnZlcnRUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRoZVRpbWUsIFRpbWVCYXNlIG5ld0Jhc2UpIC0+IChUaW1lUmVjb3JkIHRoZVRpbWUpIil9LAotCXsiQ29udmVydFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9Db252ZXJ0VGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRoZVRpbWUsIFRpbWVTY2FsZSBuZXdTY2FsZSkgLT4gKFRpbWVSZWNvcmQgdGhlVGltZSkiKX0sCi0JeyJBZGRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgZHN0LCBUaW1lUmVjb3JkIHNyYykgLT4gKFRpbWVSZWNvcmQgZHN0KSIpfSwKLQl7IlN1YnRyYWN0VGltZSIsIChQeUNGdW5jdGlvbilRdF9TdWJ0cmFjdFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgZHN0LCBUaW1lUmVjb3JkIHNyYykgLT4gKFRpbWVSZWNvcmQgZHN0KSIpfSwKLQl7Ik11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHRpLCBsb25nIHNhbXBsZURlc2NJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudEluc3RhbmNlIHRwKSIpfSwKLQl7IkNvZGVjTWFuYWdlclZlcnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfQ29kZWNNYW5hZ2VyVmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyB2ZXJzaW9uKSIpfSwKLQl7IkdldE1heENvbXByZXNzaW9uU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HZXRNYXhDb21wcmVzc2lvblNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCwgc2hvcnQgY29sb3JEZXB0aCwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSwgQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYykgLT4gKGxvbmcgc2l6ZSkiKX0sCi0JeyJHZXRDb21wcmVzc2lvblRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0Q29tcHJlc3Npb25UaW1lLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIHNob3J0IGNvbG9yRGVwdGgsIENvZGVjVHlwZSBjVHlwZSwgQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYykgLT4gKENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgdW5zaWduZWQgbG9uZyBjb21wcmVzc1RpbWUpIil9LAotCXsiQ29tcHJlc3NJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9Db21wcmVzc0ltYWdlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUHRyIGRhdGEpIC0+IE5vbmUiKX0sCi0JeyJEZWNvbXByZXNzSW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfRGVjb21wcmVzc0ltYWdlLCAxLAotCSBQeURvY19TVFIoIihQdHIgZGF0YSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBQaXhNYXBIYW5kbGUgZHN0LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRTaW1pbGFyaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dldFNpbWlsYXJpdHksIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBQdHIgZGF0YSkgLT4gKEZpeGVkIHNpbWlsYXJpdHkpIil9LAotCXsiR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSIsIChQeUNGdW5jdGlvbilRdF9HZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlLCAxLAotCSBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDVGFiSGFuZGxlIGN0YWJsZSkiKX0sCi0JeyJTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NldEltYWdlRGVzY3JpcHRpb25DVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgQ1RhYkhhbmRsZSBjdGFibGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUsIGxvbmcgaW5kZXgpIC0+IChIYW5kbGUgZXh0ZW5zaW9uKSIpfSwKLQl7IkFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBIYW5kbGUgZXh0ZW5zaW9uLCBsb25nIGlkVHlwZSkgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfUmVtb3ZlSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBsb25nIGlkVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfQ291bnRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBsb25nIGlkVHlwZSkgLT4gKGxvbmcgY291bnQpIil9LAotCXsiR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAobG9uZyBpZFR5cGUpIil9LAotCXsiRmluZENvZGVjIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpbmRDb2RlYywgMSwKLQkgUHlEb2NfU1RSKCIoQ29kZWNUeXBlIGNUeXBlLCBDb2RlY0NvbXBvbmVudCBzcGVjQ29kZWMpIC0+IChDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3IsIERlY29tcHJlc3NvckNvbXBvbmVudCBkZWNvbXByZXNzb3IpIil9LAotCXsiQ29tcHJlc3NQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXByZXNzUGljdHVyZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGljSGFuZGxlIHNyY1BpY3R1cmUsIFBpY0hhbmRsZSBkc3RQaWN0dXJlLCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlKSAtPiBOb25lIil9LAotCXsiQ29tcHJlc3NQaWN0dXJlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Db21wcmVzc1BpY3R1cmVGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzcmNSZWZOdW0sIHNob3J0IGRzdFJlZk51bSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkNvbnZlcnRJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9Db252ZXJ0SW1hZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgc3JjREQsIFB0ciBzcmNEYXRhLCBzaG9ydCBjb2xvckRlcHRoLCBDVGFiSGFuZGxlIGN0YWJsZSwgQ29kZWNRIGFjY3VyYWN5LCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlLCBDb2RlY0NvbXBvbmVudCBjb2RlYywgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3RERCwgUHRyIGRzdERhdGEpIC0+IE5vbmUiKX0sCi0JeyJBZGRGaWxlUHJldmlldyIsIChQeUNGdW5jdGlvbilRdF9BZGRGaWxlUHJldmlldywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBPU1R5cGUgcHJldmlld1R5cGUsIEhhbmRsZSBwcmV2aWV3RGF0YSkgLT4gTm9uZSIpfSwKLQl7IkdldEJlc3REZXZpY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEJlc3REZXZpY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBnZGgsIFJlY3QgcnApIil9LAotCXsiR0RIYXNTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9HREhhc1NjYWxlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIHNob3J0IGRlcHRoKSAtPiAoRml4ZWQgc2NhbGUpIil9LAotCXsiR0RHZXRTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9HREdldFNjYWxlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgpIC0+IChGaXhlZCBzY2FsZSwgc2hvcnQgZmxhZ3MpIil9LAotCXsiR0RTZXRTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9HRFNldFNjYWxlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIEZpeGVkIHNjYWxlLCBzaG9ydCBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKLQl7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAotCXsiR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVGaWxlLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAotCXsiR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRJbnN0YW5jZSBnaSkiKX0sCi0JeyJNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcCIsIChQeUNGdW5jdGlvbilRdF9NYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBpeG1hcCkgLT4gKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoKSIpfSwKLQl7Ik1ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X01ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZWZmZWN0VHlwZSkgLT4gKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoKSIpfSwKLQl7IlFUR2V0UGl4ZWxTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0UGl4ZWxTaXplLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgUGl4ZWxGb3JtYXQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeGVsRm9ybWF0RGVwdGhGb3JJbWFnZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgUGl4ZWxGb3JtYXQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeE1hcEhhbmRsZVJvd0J5dGVzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChsb25nIF9ydikiKX0sCi0JeyJRVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgbG9uZyByb3dCeXRlcykgLT4gTm9uZSIpfSwKLQl7IlFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJRVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIEZpeGVkIGdhbW1hTGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJRVEdldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChGaXhlZCBfcnYpIil9LAotCXsiUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtLCBGaXhlZCByZXF1ZXN0ZWRHYW1tYUxldmVsKSAtPiBOb25lIil9LAotCXsiQ29tcEFkZCIsIChQeUNGdW5jdGlvbilRdF9Db21wQWRkLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh3aWRlIHNyYywgd2lkZSBkc3QpIil9LAotCXsiQ29tcFN1YiIsIChQeUNGdW5jdGlvbilRdF9Db21wU3ViLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh3aWRlIHNyYywgd2lkZSBkc3QpIil9LAotCXsiQ29tcE5lZyIsIChQeUNGdW5jdGlvbilRdF9Db21wTmVnLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh3aWRlIGRzdCkiKX0sCi0JeyJDb21wU2hpZnQiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFNoaWZ0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzaGlmdCkgLT4gKHdpZGUgc3JjKSIpfSwKLQl7IkNvbXBNdWwiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE11bCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBzcmMxLCBsb25nIHNyYzIpIC0+ICh3aWRlIGRzdCkiKX0sCi0JeyJDb21wRGl2IiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBEaXYsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZGVub21pbmF0b3IpIC0+IChsb25nIF9ydiwgd2lkZSBudW1lcmF0b3IsIGxvbmcgcmVtYWluZGVyKSIpfSwKLQl7IkNvbXBGaXhNdWwiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcEZpeE11bCwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgZml4U3JjKSAtPiAod2lkZSBjb21wU3JjLCB3aWRlIGNvbXBEc3QpIil9LAotCXsiQ29tcE11bERpdiIsIChQeUNGdW5jdGlvbilRdF9Db21wTXVsRGl2LCAxLAotCSBQeURvY19TVFIoIihsb25nIG11bCwgbG9uZyBkaXZpc29yKSAtPiAod2lkZSBjbykiKX0sCi0JeyJDb21wTXVsRGl2VHJ1bmMiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE11bERpdlRydW5jLCAxLAotCSBQeURvY19TVFIoIihsb25nIG11bCwgbG9uZyBkaXZpc29yKSAtPiAod2lkZSBjbywgbG9uZyByZW1haW5kZXIpIil9LAotCXsiQ29tcENvbXBhcmUiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcENvbXBhcmUsIDEsCi0JIFB5RG9jX1NUUigiKHdpZGUgYSwgd2lkZSBtaW51c2IpIC0+IChsb25nIF9ydikiKX0sCi0JeyJDb21wU3F1YXJlUm9vdCIsIChQeUNGdW5jdGlvbilRdF9Db21wU3F1YXJlUm9vdCwgMSwKLQkgUHlEb2NfU1RSKCIod2lkZSBzcmMpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJGaXhNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfRml4TXVsRGl2LCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBzcmMsIEZpeGVkIG11bCwgRml4ZWQgZGl2aXNvcikgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJVbnNpZ25lZEZpeE11bERpdiIsIChQeUNGdW5jdGlvbilRdF9VbnNpZ25lZEZpeE11bERpdiwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgc3JjLCBGaXhlZCBtdWwsIEZpeGVkIGRpdmlzb3IpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiRml4RXhwMiIsIChQeUNGdW5jdGlvbilRdF9GaXhFeHAyLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBzcmMpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiRml4TG9nMiIsIChQeUNGdW5jdGlvbilRdF9GaXhMb2cyLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBzcmMpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiRml4UG93IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpeFBvdywgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgYmFzZSwgRml4ZWQgZXhwKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVUeXBlKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBoKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0UmVhZERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRSZWFkRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBkYXRhUHRyLCB1bnNpZ25lZCBsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZ25IYW5kbGUgY2xpcFJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgY2xpcFJnbikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmVjdCBzb3VyY2VSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3Qgc291cmNlUmVjdCkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgbmF0dXJhbEJvdW5kcykiKX0sCi0JeyJHcmFwaGljc0ltcG9ydERyYXciLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnREcmF3LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2QpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIFJlY3QgYm91bmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2F2ZUFzUGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgZnNzLCBTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGdyYXBoaWNzTW9kZSwgUkdCQ29sb3Igb3BDb2xvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBncmFwaGljc01vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIENvZGVjUSBxdWFsaXR5KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvZGVjUSBxdWFsaXR5KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIGZzcywgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0VmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHZhbGlkKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiB1c2VyRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydERvZXNEcmF3QWxsUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZHJhd3NBbGxQaXhlbHMpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGljSGFuZGxlIHBpY3R1cmUpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvciwgRlNTcGVjIGZzcywgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGltYWdlQ291bnQpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXgpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgd2lkZSBzaXplKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0UmVhZERhdGE2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFJlYWREYXRhNjQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgd2lkZSBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB3aWRlIG9mZnNldCwgd2lkZSBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCB3aWRlIGxpbWl0KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgZGVmYXVsdFJnbikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGVmYXVsdEdyYXBoaWNzTW9kZSwgUkdCQ29sb3IgZGVmYXVsdE9wQ29sb3IpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGVmYXVsdFNvdXJjZVJlY3QpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgcHJvZmlsZSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldERlc3RSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZWN0IGRlc3RSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVzdFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkZXN0UmVjdCkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFncykiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIHdpZGUgc2l6ZSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RG9FeHBvcnQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb0V4cG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGFjdHVhbFNpemVXcml0dGVuKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gY2FuVHJhbnNjb2RlKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhblVzZUNvbXByZXNzb3IpIil9LAotCXsiR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIG91dERlc2MpIil9LAotCXsiR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVDcmVhdG9yKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlTmFtZUV4dGVuc2lvbikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRoZVRleHQpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldERvbnRSZWNvbXByZXNzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBkb250UmVjb21wcmVzcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERvbnRSZWNvbXByZXNzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZG9udFJlY29tcHJlc3MpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldEludGVybGFjZVN0eWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE1ldGFEYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHVzZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE1ldGFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0TWV0YURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogdXNlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRUYXJnZXREYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvbk1ldGhvZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgY29tcHJlc3Npb25NZXRob2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvbk1ldGhvZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGNvbXByZXNzaW9uTWV0aG9kKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25RdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25RdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb2RlY1Egc3BhdGlhbFF1YWxpdHkpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uLCBGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb24sIEZpeGVkIHZlcnRpY2FsUmVzb2x1dGlvbikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldERlcHRoIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0RGVwdGgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIGRlcHRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldERlcHRoIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RGVwdGgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkZXB0aCkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgaCwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGgpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0ciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UHRyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgUHRyIHAsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGdyaXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGdyaXApIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBQaWNIYW5kbGUgcGljdHVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGljSGFuZGxlIHBpY3R1cmUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgR1dvcmxkUHRyIGd3b3JsZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdXb3JsZFB0ciBnd29ybGQpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgUGl4TWFwSGFuZGxlIHBpeG1hcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0UGl4bWFwLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpeE1hcEhhbmRsZSBwaXhtYXApIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gbWF5UmVhZElucHV0RGF0YSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGRpbWVuc2lvbnMpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbnB1dERlcHRoKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIENHcmFmUHRyIGd3LCBHREhhbmRsZSBnZCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBoKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplLCBCb29sZWFuIHRydW5jYXRlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplLCBCb29sZWFuIHRydW5jYXRlRmlsZSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVDcmVhdG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmsiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBtYXJrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmsiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgbWFyaykiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBlbmFibGVUaHVtYm5haWwsIGxvbmcgbWF4VGh1bWJuYWlsV2lkdGgsIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdGh1bWJuYWlsRW5hYmxlZCwgbG9uZyBtYXhUaHVtYm5haWxXaWR0aCwgbG9uZyBtYXhUaHVtYm5haWxIZWlnaHQpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBlbmFibGVFeGlmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBleGlmRW5hYmxlZCkiKX0sCi0JeyJJbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ltYWdlVHJhbnNjb2RlckJlZ2luU2VxdWVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGMsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgc3JjRGVzYywgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRzdERlc2MpIil9LAotCXsiSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGMsIHZvaWQgKiBkc3REYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJJbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZSIsIChQeUNGdW5jdGlvbilRdF9JbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0YykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiQ2xvY2tHZXRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0Nsb2NrR2V0VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVJlY29yZCBvdXQpIil9LAotCXsiQ2xvY2tTZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9DbG9ja1NldFRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2ssIFRpbWVCYXNlIHRiKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJDbG9ja0dldFJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvY2tHZXRSYXRlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCByYXRlKSIpfSwKLQl7IlNDUG9zaXRpb25SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NDUG9zaXRpb25SZWN0LCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcnAsIFBvaW50IHdoZXJlKSIpfSwKLQl7IlNDUG9zaXRpb25EaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfU0NQb3NpdGlvbkRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIHNob3J0IGlkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUG9pbnQgd2hlcmUpIil9LAotCXsiU0NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0VGVzdEltYWdlUGljdEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpY0hhbmRsZSB0ZXN0UGljdCwgc2hvcnQgdGVzdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB0ZXN0UmVjdCkiKX0sCi0JeyJTQ1NldFRlc3RJbWFnZVBpY3RGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0VGVzdEltYWdlUGljdEZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCB0ZXN0RmlsZVJlZiwgc2hvcnQgdGVzdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB0ZXN0UmVjdCkiKX0sCi0JeyJTQ1NldFRlc3RJbWFnZVBpeE1hcCIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpeE1hcEhhbmRsZSB0ZXN0UGl4TWFwLCBzaG9ydCB0ZXN0RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHRlc3RSZWN0KSIpfSwKLQl7IlNDR2V0QmVzdERldmljZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRCZXN0RGV2aWNlUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHIpIil9LAotCXsiU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ1JlcXVlc3RJbWFnZVNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NDb21wcmVzc0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgSGFuZGxlIGRhdGEpIil9LAotCXsiU0NDb21wcmVzc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaWNIYW5kbGUgc3JjUGljdHVyZSwgUGljSGFuZGxlIGRzdFBpY3R1cmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDQ29tcHJlc3NQaWN0dXJlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzUGljdHVyZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCBzcmNSZWZOdW0sIHNob3J0IGRzdFJlZk51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4iLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4sIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIil9LAotCXsiU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YSwgbG9uZyBkYXRhU2l6ZSwgc2hvcnQgbm90U3luY0ZsYWcpIil9LAotCXsiU0NDb21wcmVzc1NlcXVlbmNlRW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUVuZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaWNIYW5kbGUgc3JjUGljdHVyZSwgc2hvcnQgbW90aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCBzcmNSZWYsIHNob3J0IG1vdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBzaG9ydCBtb3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDR2V0SW5mbyIsIChQeUNGdW5jdGlvbilRdF9TQ0dldEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBPU1R5cGUgaW5mb1R5cGUsIHZvaWQgKiBpbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTQ1NldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0NTZXRJbmZvLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NTZXRDb21wcmVzc0ZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0Q29tcHJlc3NGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDR2V0Q29tcHJlc3NGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TQ0dldENvbXByZXNzRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFncykiKX0sCi0JeyJTQ0dldFNldHRpbmdzQXNUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NDR2V0U2V0dGluZ3NBc1RleHQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRleHQpIil9LAotCXsiU0NBc3luY0lkbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0NBc3luY0lkbGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUd2VlbmVyUmVzZXQiLCAoUHlDRnVuY3Rpb24pUXRfVHdlZW5lclJlc2V0LCAxLAotCSBQeURvY19TVFIoIihUd2VlbmVyQ29tcG9uZW50IHRjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUQ0dldFNvdXJjZVJlZiIsIChQeUNGdW5jdGlvbilRdF9UQ0dldFNvdXJjZVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lQ29kZURlc2NyaXB0aW9uSGFuZGxlIHRjZEgpIC0+IChIYW5kbGVyRXJyb3IgX3J2LCBVc2VyRGF0YSBzcmVmSCkiKX0sCi0JeyJUQ1NldFNvdXJjZVJlZiIsIChQeUNGdW5jdGlvbilRdF9UQ1NldFNvdXJjZVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lQ29kZURlc2NyaXB0aW9uSGFuZGxlIHRjZEgsIFVzZXJEYXRhIHNyZWZIKSAtPiAoSGFuZGxlckVycm9yIF9ydikiKX0sCi0JeyJUQ1NldFRpbWVDb2RlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVENTZXRUaW1lQ29kZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiAoSGFuZGxlckVycm9yIF9ydikiKX0sCi0JeyJUQ0dldFRpbWVDb2RlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVENHZXRUaW1lQ29kZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChIYW5kbGVyRXJyb3IgX3J2LCBsb25nIGZsYWdzKSIpfSwKLQl7Ik1vdmllSW1wb3J0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFILCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgdGFyZ2V0VHJhY2ssIFRpbWVWYWx1ZSBhdFRpbWUsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIHVzZWRUcmFjaywgVGltZVZhbHVlIGFkZGVkRHVyYXRpb24sIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0RmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgdGFyZ2V0VHJhY2ssIFRpbWVWYWx1ZSBhdFRpbWUsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIHVzZWRUcmFjaywgVGltZVZhbHVlIGFkZGVkRHVyYXRpb24sIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgVGltZVZhbHVlIGR1cmF0aW9uLCBUaW1lU2NhbGUgc2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBtZWRpYVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0TWVkaWFGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0TWVkaWFGaWxlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgQWxpYXNIYW5kbGUgYWxpYXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0RGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldERpbWVuc2lvbnMsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldENodW5rU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldENodW5rU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgY2h1bmtTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGEsIE9TVHlwZSBoYW5kbGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldEZyb21TY3JhcCIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldEZyb21TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZnJvbVNjcmFwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydERvVXNlckRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydERvVXNlckRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBIYW5kbGUgdGhlRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gY2FuY2VsZWQpIil9LAotCXsiTW92aWVJbXBvcnRTZXREdXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldER1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydEdldEF1eGlsaWFyeURhdGFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGF1eFR5cGUpIil9LAotCXsiTW92aWVJbXBvcnRWYWxpZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFZhbGlkYXRlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIEhhbmRsZSB0aGVEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB2YWxpZCkiKX0sCi0JeyJNb3ZpZUltcG9ydEdldEZpbGVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0RmlsZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlKSIpfSwKLQl7Ik1vdmllSW1wb3J0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydERhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgdGFyZ2V0VHJhY2ssIFRpbWVWYWx1ZSBhdFRpbWUsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIHVzZWRUcmFjaywgVGltZVZhbHVlIGFkZGVkRHVyYXRpb24sIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldFNhbXBsZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBtZWRpYVR5cGUpIil9LAotCXsiTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQ2NCIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCB3aWRlIG9mZnNldCwgd2lkZSBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVJbXBvcnRJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0SWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggdmFsaWQpIil9LAotCXsiTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbXBvcnRlckxvYWRTdGF0ZSkiKX0sCi0JeyJNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSB0aW1lKSIpfSwKLQl7Ik1vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVJlY29yZCB0aW1lKSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0RG9udEJsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0RG9udEJsb2NrLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBkb250QmxvY2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0R2V0RG9udEJsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0RG9udEJsb2NrLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2lsbEJsb2NrKSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlciwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBuZXdNb3ZpZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIG1lZGlhVHlwZSkiKX0sCi0JeyJNb3ZpZUV4cG9ydFRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VG9IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YUgsIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0VG9GaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VG9GaWxlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0R2V0QXV4aWxpYXJ5RGF0YSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YUgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgaGFuZGxlVHlwZSkiKX0sCi0JeyJNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUV4cG9ydERvVXNlckRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydERvVXNlckRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhbmNlbGVkKSIpfSwKLQl7Ik1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgY3JlYXRvcikiKX0sCi0JeyJNb3ZpZUV4cG9ydFRvRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRGcm9tUHJvY2VkdXJlc1RvRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0VmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRWYWxpZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB2YWxpZCkiKX0sCi0JeyJNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0RmlsZU5hbWVFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGV4dGVuc2lvbikiKX0sCi0JeyJNb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgU3RyMjU1IHR5cGVTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBtZWRpYVR5cGUpIil9LAotCXsiVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtb3ZpZVRpbWVGcmFjdGlvbikiKX0sCi0JeyJUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRFeHBvcnRTZXRUaW1lRnJhY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgbW92aWVUaW1lRnJhY3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRFeHBvcnRHZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0R2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNldHRpbmcpIil9LAotCXsiVGV4dEV4cG9ydFNldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRFeHBvcnRTZXRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSwgbG9uZyBzZXR0aW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNSURJSW1wb3J0R2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTUlESUltcG9ydEdldFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZXR0aW5nKSIpfSwKLQl7Ik1JRElJbXBvcnRTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9NSURJSW1wb3J0U2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgc2V0dGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltYWdlSW1wb3J0U2V0U2VxdWVuY2VFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljSW1hZ2VNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBlbmFibGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbWFnZUltcG9ydEdldFNlcXVlbmNlRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVuYWJsZSkiKX0sCi0JeyJQcmV2aWV3U2hvd0RhdGEiLCAoUHlDRnVuY3Rpb24pUXRfUHJldmlld1Nob3dEYXRhLCAxLAotCSBQeURvY19TVFIoIihwbm90Q29tcG9uZW50IHAsIE9TVHlwZSBkYXRhVHlwZSwgSGFuZGxlIGRhdGEsIFJlY3QgaW5IZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJQcmV2aWV3TWFrZVByZXZpZXdSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihwbm90Q29tcG9uZW50IHAsIEZTU3BlYyBzb3VyY2VGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIHByZXZpZXdUeXBlLCBzaG9ydCByZXNJRCkiKX0sCi0JeyJQcmV2aWV3RXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfUHJldmlld0V2ZW50LCAxLAotCSBQeURvY19TVFIoIihwbm90Q29tcG9uZW50IHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBFdmVudFJlY29yZCBlLCBCb29sZWFuIGhhbmRsZWRFdmVudCkiKX0sCi0JeyJEYXRhQ29kZWNEZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0RlY29tcHJlc3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdm9pZCAqIHNyY0RhdGEsIFVJbnQzMiBzcmNTaXplLCB2b2lkICogZHN0RGF0YSwgVUludDMyIGRzdEJ1ZmZlclNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFDb2RlY0dldENvbXByZXNzQnVmZmVyU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgVUludDMyIHNyY1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgZHN0U2l6ZSkiKX0sCi0JeyJEYXRhQ29kZWNDb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNDb21wcmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjLCB2b2lkICogc3JjRGF0YSwgVUludDMyIHNyY1NpemUsIHZvaWQgKiBkc3REYXRhLCBVSW50MzIgZHN0QnVmZmVyU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBhY3R1YWxEc3RTaXplLCBVSW50MzIgZGVjb21wcmVzc1Nsb3ApIil9LAotCXsiRGF0YUNvZGVjQmVnaW5JbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjLCB1bnNpZ25lZCBsb25nIG1heFNyY1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFDb2RlY0VuZEludGVycnVwdFNhZmUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGgsIGxvbmcgaE9mZnNldCwgbG9uZyBvZmZzZXQsIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhQdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUHV0RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBoLCBsb25nIGhPZmZzZXQsIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKLQl7IkRhdGFIRmx1c2hEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRmx1c2hEYXRhLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhPcGVuRm9yV3JpdGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhPcGVuRm9yV3JpdGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSENsb3NlRm9yV3JpdGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDbG9zZUZvcldyaXRlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhPcGVuRm9yUmVhZCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSE9wZW5Gb3JSZWFkLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhDbG9zZUZvclJlYWQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDbG9zZUZvclJlYWQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFNldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYpIil9LAotCXsiRGF0YUhDb21wYXJlRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENvbXBhcmVEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVxdWFsKSIpfSwKLQl7IkRhdGFIVGFzayIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFRhc2ssIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEZpbmlzaERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhGaW5pc2hEYXRhLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgUHRyIFBsYWNlVG9QdXREYXRhUHRyLCBCb29sZWFuIENhbmNlbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhGbHVzaENhY2hlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRmx1c2hDYWNoZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIUmVzb2x2ZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhSZXNvbHZlRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSB0aGVEYXRhUmVmLCBCb29sZWFuIHVzZXJJbnRlcmZhY2VBbGxvd2VkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7IkRhdGFIR2V0RmlsZVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZpbGVTaXplKSIpfSwKLQl7IkRhdGFIQ2FuVXNlRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENhblVzZURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgZGF0YVJlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdXNlRmxhZ3MpIil9LAotCXsiRGF0YUhQcmVleHRlbmQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQcmVleHRlbmQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB1bnNpZ25lZCBsb25nIG1heFRvQWRkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzcGFjZUFkZGVkKSIpfSwKLQl7IkRhdGFIU2V0RmlsZVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRGaWxlU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmlsZVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RnJlZVNwYWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RnJlZVNwYWNlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgZnJlZVNpemUpIil9LAotCXsiRGF0YUhDcmVhdGVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ3JlYXRlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBjcmVhdG9yLCBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJsb2NrU2l6ZSkiKX0sCi0JeyJEYXRhSEdldERldmljZUluZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGV2aWNlSW5kZXgsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkZXZpY2VJbmRleCkiKX0sCi0JeyJEYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4geWVzKSIpfSwKLQl7IkRhdGFIR2V0RGF0YUluQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YUluQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBzdGFydE9mZnNldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2l6ZSkiKX0sCi0JeyJEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWxsaXNlY3MpIil9LAotCXsiRGF0YUhTZXRDYWNoZVNpemVMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldENhY2hlU2l6ZUxpbWl0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgU2l6ZSBjYWNoZVNpemVMaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXRDYWNoZVNpemVMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldENhY2hlU2l6ZUxpbWl0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNpemUgY2FjaGVTaXplTGltaXQpIil9LAotCXsiRGF0YUhHZXRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1vdmllLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE1vdmllIHRoZU1vdmllLCBzaG9ydCBpZCkiKX0sCi0JeyJEYXRhSEFkZE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQWRkTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBNb3ZpZSB0aGVNb3ZpZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlkKSIpfSwKLQl7IkRhdGFIVXBkYXRlTW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhVcGRhdGVNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE1vdmllIHRoZU1vdmllLCBzaG9ydCBpZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhEb2VzQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRG9lc0J1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGJ1ZmZlcnNSZWFkcywgQm9vbGVhbiBidWZmZXJzV3JpdGVzKSIpfSwKLQl7IkRhdGFIR2V0RmlsZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZpbGVTaXplKSIpfSwKLQl7IkRhdGFIR2V0TWFjT1NGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1hY09TRmlsZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlKSIpfSwKLQl7IkRhdGFIR2V0TUlNRVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNSU1FVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFN0cjI1NSBtaW1lVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldERhdGFSZWZXaXRoQW5jaG9yLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGFuY2hvckRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmV2l0aEFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBhbmNob3JEYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZikiKX0sCi0JeyJEYXRhSFNldE1hY09TRmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRNYWNPU0ZpbGVUeXBlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIGZpbGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFNldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0VGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBUaW1lQmFzZSB0YikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXRJbmZvRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRJbmZvRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGZsYWdzKSIpfSwKLQl7IkRhdGFIR2V0RmlsZVNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZpbGVTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBmaWxlU2l6ZSkiKX0sCi0JeyJEYXRhSFByZWV4dGVuZDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUHJlZXh0ZW5kNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB3aWRlIG1heFRvQWRkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBzcGFjZUFkZGVkKSIpfSwKLQl7IkRhdGFIU2V0RmlsZVNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldEZpbGVTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB3aWRlIGZpbGVTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldEZyZWVTcGFjZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RnJlZVNwYWNlNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBmcmVlU2l6ZSkiKX0sCi0JeyJEYXRhSEFwcGVuZDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQXBwZW5kNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB2b2lkICogZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBmaWxlT2Zmc2V0KSIpfSwKLQl7IkRhdGFIUG9sbFJlYWQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQb2xsUmVhZCwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHZvaWQgKiBkYXRhUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGRhdGFTaXplU29GYXIpIil9LAotCXsiRGF0YUhHZXREYXRhQXZhaWxhYmlsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgb2Zmc2V0LCBsb25nIGxlbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlzc2luZ19vZmZzZXQsIGxvbmcgbWlzc2luZ19sZW4pIil9LAotCXsiRGF0YUhHZXREYXRhUmVmQXNUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJlZkFzVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSByZXF1ZXN0ZWRUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYpIil9LAotCXsiRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBleHRlbnNpb24sIE9TVHlwZSBpZFR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RGF0YVJlZkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWZFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgaWRUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGV4dGVuc2lvbikiKX0sCi0JeyJEYXRhSEdldE1vdmllV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0TW92aWVXaXRoRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBzaG9ydCBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE1vdmllIHRoZU1vdmllLCBzaG9ydCBpZCkiKX0sCi0JeyJEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmciLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIERhdGFIRmlsZVR5cGVPcmRlcmluZ0hhbmRsZSBvcmRlcmluZ0xpc3RIYW5kbGUpIil9LAotCXsiRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBjcmVhdG9yLCBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nLCBVSW50MzIgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0SW5mbyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgd2hhdCwgdm9pZCAqIGluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIU2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRJZGxlTWFuYWdlciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSERlbGV0ZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhEZWxldGVGaWxlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhVc2VUZW1wb3JhcnlEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBpbkZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb3V0VW5kZXJzdG9vZEZsYWdzKSIpfSwKLQl7IkRhdGFIUmVuYW1lRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFJlbmFtZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgbmV3RGF0YVJlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhQbGF5YmFja0hpbnRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUGxheWJhY2tIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbWluRmlsZU9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhGaWxlT2Zmc2V0LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFBsYXliYWNrSGludHM2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFBsYXliYWNrSGludHM2NCwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MsIHdpZGUgbWluRmlsZU9mZnNldCwgd2lkZSBtYXhGaWxlT2Zmc2V0LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBieXRlc1BlclNlY29uZCkiKX0sCi0JeyJEYXRhSFNldFRpbWVIaW50cyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldFRpbWVIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MsIGxvbmcgYmFuZHdpZHRoUHJpb3JpdHksIFRpbWVTY2FsZSBzY2FsZSwgVGltZVZhbHVlIG1pblRpbWUsIFRpbWVWYWx1ZSBtYXhUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldE1heFNyY1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRNYXhTcmNSZWN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXRTdGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IG1heFNyY1JlY3QpIil9LAotCXsiVkRHZXRBY3RpdmVTcmNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0QWN0aXZlU3JjUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBhY3RpdmVTcmNSZWN0KSIpfSwKLQl7IlZEU2V0RGlnaXRpemVyUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFNldERpZ2l0aXplclJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkaWdpdGl6ZXJSZWN0KSIpfSwKLQl7IlZER2V0RGlnaXRpemVyUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldERpZ2l0aXplclJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkaWdpdGl6ZXJSZWN0KSIpfSwKLQl7IlZER2V0VkJsYW5rUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldFZCbGFua1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0ZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdkJsYW5rUmVjdCkiKX0sCi0JeyJWREdldE1hc2tQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRNYXNrUGl4TWFwLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUGl4TWFwSGFuZGxlIG1hc2tQaXhNYXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEVXNlVGhpc0NMVVQiLCAoUHlDRnVuY3Rpb24pUXRfVkRVc2VUaGlzQ0xVVCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRTZXRJbnB1dEdhbW1hVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRJbnB1dEdhbW1hVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBGaXhlZCBjaGFubmVsMSwgRml4ZWQgY2hhbm5lbDIsIEZpeGVkIGNoYW5uZWwzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldElucHV0R2FtbWFWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0R2FtbWFWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCBjaGFubmVsMSwgRml4ZWQgY2hhbm5lbDIsIEZpeGVkIGNoYW5uZWwzKSIpfSwKLQl7IlZEU2V0QnJpZ2h0bmVzcyIsIChQeUNGdW5jdGlvbilRdF9WRFNldEJyaWdodG5lc3MsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzcykiKX0sCi0JeyJWREdldEJyaWdodG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRCcmlnaHRuZXNzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3MpIil9LAotCXsiVkRTZXRDb250cmFzdCIsIChQeUNGdW5jdGlvbilRdF9WRFNldENvbnRyYXN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0KSIpfSwKLQl7IlZEU2V0SHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SHVlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGh1ZSkiKX0sCi0JeyJWRFNldFNoYXJwbmVzcyIsIChQeUNGdW5jdGlvbilRdF9WRFNldFNoYXJwbmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3MpIil9LAotCXsiVkRTZXRTYXR1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0U2F0dXJhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uKSIpfSwKLQl7IlZER2V0Q29udHJhc3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDb250cmFzdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBjb250cmFzdCkiKX0sCi0JeyJWREdldEh1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEh1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBodWUpIil9LAotCXsiVkRHZXRTaGFycG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTaGFycG5lc3MsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzKSIpfSwKLQl7IlZER2V0U2F0dXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WREdldFNhdHVyYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbikiKX0sCi0JeyJWREdyYWJPbmVGcmFtZSIsIChQeUNGdW5jdGlvbilRdF9WREdyYWJPbmVGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0TWF4QXV4QnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWF4QXV4QnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpeE1hcEhhbmRsZSBwbSwgUmVjdCByKSIpfSwKLQl7IlZER2V0Q3VycmVudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q3VycmVudEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5wdXRDdXJyZW50RmxhZywgbG9uZyBvdXRwdXRDdXJyZW50RmxhZykiKX0sCi0JeyJWRFNldEtleUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0S2V5Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldEtleUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0S2V5Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbmRleCkiKX0sCi0JeyJWREFkZEtleUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQWRkS2V5Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbmRleCkiKX0sCi0JeyJWREdldE5leHRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREdldE5leHRLZXlDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0S2V5Q29sb3JSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEtleUNvbG9yUmFuZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgbWluUkdCLCBSR0JDb2xvciBtYXhSR0IpIil9LAotCXsiVkRHZXRLZXlDb2xvclJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0S2V5Q29sb3JSYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciBtaW5SR0IsIFJHQkNvbG9yIG1heFJHQikiKX0sCi0JeyJWRFNldElucHV0Q29sb3JTcGFjZU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgY29sb3JTcGFjZU1vZGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0SW5wdXRDb2xvclNwYWNlTW9kZSIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0Q29sb3JTcGFjZU1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgY29sb3JTcGFjZU1vZGUpIil9LAotCXsiVkRTZXRDbGlwU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDbGlwU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBjbGlwRW5hYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldENsaXBTdGF0ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldENsaXBTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBjbGlwRW5hYmxlKSIpfSwKLQl7IlZEU2V0Q2xpcFJnbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldENsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBSZ25IYW5kbGUgY2xpcFJlZ2lvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRDbGVhckNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pUXRfVkRDbGVhckNsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBSZ25IYW5kbGUgY2xpcFJlZ2lvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRDTFVUSW5Vc2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDTFVUSW5Vc2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlKSIpfSwKLQl7IlZEU2V0UExMRmlsdGVyVHlwZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFBMTEZpbHRlclR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBwbGxUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldFBMTEZpbHRlclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRQTExGaWx0ZXJUeXBlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHBsbFR5cGUpIil9LAotCXsiVkRHZXRNYXNrYW5kVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRNYXNrYW5kVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCB1bnNpZ25lZCBzaG9ydCBibGVuZExldmVsKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtYXNrLCBsb25nIHZhbHVlKSIpfSwKLQl7IlZEU2V0TWFzdGVyQmxlbmRMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9WRFNldE1hc3RlckJsZW5kTGV2ZWwsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbCkiKX0sCi0JeyJWRFNldFBsYXlUaHJ1T25PZmYiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRQbGF5VGhydU9uT2ZmLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgc3RhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0RmllbGRQcmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RmllbGRQcmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgZmllbGRGbGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldEZpZWxkUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEZpZWxkUHJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBmaWVsZEZsYWcpIil9LAotCXsiVkRQcmVmbGlnaHRHbG9iYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEUHJlZmxpZ2h0R2xvYmFsUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEdyYWZQdHIgdGhlV2luZG93KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBnbG9iYWxSZWN0KSIpfSwKLQl7IlZEU2V0UGxheVRocnVHbG9iYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UGxheVRocnVHbG9iYWxSZWN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgR3JhZlB0ciB0aGVXaW5kb3cpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGdsb2JhbFJlY3QpIil9LAotCXsiVkRTZXRCbGFja0xldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRCbGFja0xldmVsVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbCkiKX0sCi0JeyJWREdldEJsYWNrTGV2ZWxWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEJsYWNrTGV2ZWxWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsKSIpfSwKLQl7IlZEU2V0V2hpdGVMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0V2hpdGVMZXZlbFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWwpIil9LAotCXsiVkRHZXRXaGl0ZUxldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRXaGl0ZUxldmVsVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbCkiKX0sCi0JeyJWREdldFZpZGVvRGVmYXVsdHMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRWaWRlb0RlZmF1bHRzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWwsIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWwsIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3MsIHVuc2lnbmVkIHNob3J0IGh1ZSwgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbiwgdW5zaWduZWQgc2hvcnQgY29udHJhc3QsIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzcykiKX0sCi0JeyJWREdldE51bWJlck9mSW5wdXRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TnVtYmVyT2ZJbnB1dHMsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgaW5wdXRzKSIpfSwKLQl7IlZER2V0SW5wdXRGb3JtYXQiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dEZvcm1hdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZm9ybWF0KSIpfSwKLQl7IlZEU2V0SW5wdXQiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRJbnB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldElucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXQsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgaW5wdXQpIil9LAotCXsiVkRTZXRJbnB1dFN0YW5kYXJkIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRTdGFuZGFyZCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RhbmRhcmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0dXBCdWZmZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0dXBCdWZmZXJzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgVmRpZ0J1ZmZlclJlY0xpc3RIYW5kbGUgYnVmZmVyTGlzdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHcmFiT25lRnJhbWVBc3luYyIsIChQeUNGdW5jdGlvbilRdF9WREdyYWJPbmVGcmFtZUFzeW5jLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgYnVmZmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRERvbmUiLCAoUHlDRnVuY3Rpb24pUXRfVkREb25lLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgYnVmZmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldENvbXByZXNzaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q29tcHJlc3Npb24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBPU1R5cGUgY29tcHJlc3NUeXBlLCBzaG9ydCBkZXB0aCwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7IlZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW1hZ2VEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRSZXNldENvbXByZXNzU2VxdWVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRSZXNldENvbXByZXNzU2VxdWVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldENvbXByZXNzaW9uT25PZmYiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDb21wcmVzc2lvbk9uT2ZmLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQm9vbGVhbiBzdGF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRDb21wcmVzc2lvblR5cGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q29tcHJlc3Npb25UeXBlcywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFZEQ29tcHJlc3Npb25MaXN0SGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFRpbWVCYXNlIHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0RnJhbWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RnJhbWVSYXRlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgRml4ZWQgZnJhbWVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWxsaVNlY1BlckZyYW1lLCBGaXhlZCBmcmFtZXNQZXJTZWNvbmQsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAotCXsiVkRHZXRTb3VuZElucHV0RHJpdmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U291bmRJbnB1dERyaXZlciwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFN0cjI1NSBzb3VuZERyaXZlck5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0RE1BRGVwdGhzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RE1BRGVwdGhzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGVwdGhBcnJheSwgbG9uZyBwcmVmZXJyZWREZXB0aCkiKX0sCi0JeyJWREdldFByZWZlcnJlZFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9WREdldFByZWZlcnJlZFRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lU2NhbGUgcHJlZmVycmVkKSIpfSwKLQl7IlZEUmVsZWFzZUFzeW5jQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFJlbGVhc2VBc3luY0J1ZmZlcnMsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldFRpbWVDb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0VGltZUNvZGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCB2b2lkICogdGltZUNvZGVGb3JtYXQsIHZvaWQgKiB0aW1lQ29kZVRpbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lUmVjb3JkIGF0VGltZSkiKX0sCi0JeyJWRFVzZVNhZmVCdWZmZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEVXNlU2FmZUJ1ZmZlcnMsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBCb29sZWFuIHVzZVNhZmVCdWZmZXJzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldFNvdW5kSW5wdXRTb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTb3VuZElucHV0U291cmNlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyB2aWRlb0lucHV0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzb3VuZElucHV0KSIpfSwKLQl7IlZER2V0Q29tcHJlc3Npb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q29tcHJlc3Npb25UaW1lLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgT1NUeXBlIGNvbXByZXNzaW9uVHlwZSwgc2hvcnQgZGVwdGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHNyY1JlY3QsIENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgdW5zaWduZWQgbG9uZyBjb21wcmVzc1RpbWUpIil9LAotCXsiVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyB3aWR0aCwgbG9uZyBoZWlnaHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KSIpfSwKLQl7IlZER2V0SW5wdXROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXROYW1lLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyB2aWRlb0lucHV0LCBTdHIyNTUgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRTZXREZXN0aW5hdGlvblBvcnQiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXREZXN0aW5hdGlvblBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBDR3JhZlB0ciBkZXN0UG9ydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBTdHIyNTUgb3V0TmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBvdXROYW1lRmxhZ3MpIil9LAotCXsiVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyIsIChQeUNGdW5jdGlvbilRdF9WRENhcHR1cmVTdGF0ZUNoYW5naW5nLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgVUludDMyIGluU3RhdGVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFN0cmluZ1B0ciBlcnJEZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBlcnJvckxpbmUpIil9LAotCXsiWE1MUGFyc2VBZGRFbGVtZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkRWxlbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIG5hbWVTcGFjZUlELCBsb25nIGVsZW1lbnRGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgZWxlbWVudE5hbWUsIFVJbnQzMiBlbGVtZW50SUQpIil9LAotCXsiWE1MUGFyc2VBZGRBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGRBdHRyaWJ1dGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQsIFVJbnQzMiBuYW1lU3BhY2VJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgYXR0cmlidXRlTmFtZSwgVUludDMyIGF0dHJpYnV0ZUlEKSIpfSwKLQl7IlhNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIG5hbWVTcGFjZUlEcywgY2hhciBhdHRyaWJ1dGVOYW1lcywgVUludDMyIGF0dHJpYnV0ZUlEcykiKX0sCi0JeyJYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkQXR0cmlidXRlQW5kVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQsIFVJbnQzMiBuYW1lU3BhY2VJRCwgVUludDMyIGF0dHJpYnV0ZVZhbHVlS2luZCwgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGF0dHJpYnV0ZU5hbWUsIFVJbnQzMiBhdHRyaWJ1dGVJRCkiKX0sCi0JeyJYTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZCIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIGVsZW1lbnRJRCwgVUludDMyIGF0dHJpYnV0ZUlELCBVSW50MzIgYXR0cmlidXRlVmFsdWVLaW5kLCB2b2lkICogYXR0cmlidXRlVmFsdWVLaW5kSW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiWE1MUGFyc2VBZGROYW1lU3BhY2UiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGROYW1lU3BhY2UsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG5hbWVTcGFjZVVSTCwgVUludDMyIG5hbWVTcGFjZUlEKSIpfSwKLQl7IlhNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VTZXRPZmZzZXRBbmRMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIG9mZnNldCwgVUludDMyIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBsb25nIHJlZmNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dJbml0aWFsaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSW5pdGlhbGl6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldERhdGFPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXREYXRhT3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEZTU3BlYyBtb3ZpZUZpbGUsIGxvbmcgd2hlcmVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXREYXRhT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YU91dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBGU1NwZWMgbW92aWVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyB3aGVyZUZsYWdzKSIpfSwKLQl7IlNHU2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIENHcmFmUHRyIGdwLCBHREhhbmRsZSBnZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENHcmFmUHRyIGdwLCBHREhhbmRsZSBnZCkiKX0sCi0JeyJTR05ld0NoYW5uZWwiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdDaGFubmVsLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIE9TVHlwZSBjaGFubmVsVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHQ2hhbm5lbCByZWYpIil9LAotCXsiU0dEaXNwb3NlQ2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0Rpc3Bvc2VDaGFubmVsLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1N0YXJ0UHJldmlldyIsIChQeUNGdW5jdGlvbilRdF9TR1N0YXJ0UHJldmlldywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1N0YXJ0UmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU3RhcnRSZWNvcmQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1N0b3AiLCAoUHlDRnVuY3Rpb24pUXRfU0dTdG9wLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGF1c2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYXVzZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBCb29sZWFuIHBhdXNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1ByZXBhcmUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQcmVwYXJlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEJvb2xlYW4gcHJlcGFyZUZvclByZXZpZXcsIEJvb2xlYW4gcHJlcGFyZUZvclJlY29yZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dSZWxlYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUmVsZWFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJTR1NldE1heGltdW1SZWNvcmRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0TWF4aW11bVJlY29yZFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgdW5zaWduZWQgbG9uZyB0aWNrcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRNYXhpbXVtUmVjb3JkVGltZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE1heGltdW1SZWNvcmRUaW1lLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHRpY2tzKSIpfSwKLQl7IlNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGJ5dGVzKSIpfSwKLQl7IlNHR2V0VGltZVJlbWFpbmluZyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFRpbWVSZW1haW5pbmcsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdGlja3NMZWZ0KSIpfSwKLQl7IlNHR3JhYlBpY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiUGljdCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBSZWN0IGJvdW5kcywgc2hvcnQgb2Zmc2NyZWVuRGVwdGgsIGxvbmcgZ3JhYlBpY3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwKSIpfSwKLQl7IlNHR2V0TGFzdE1vdmllUmVzSUQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRMYXN0TW92aWVSZXNJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgcmVzSUQpIil9LAotCXsiU0dTZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIGxvbmcgc2dGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR0dldEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNnRmxhZ3MpIil9LAotCXsiU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9TR05ld0NoYW5uZWxGcm9tQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIENvbXBvbmVudCBzZ0NoYW5uZWxDb21wb25lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgbmV3Q2hhbm5lbCkiKX0sCi0JeyJTR1NldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgVXNlckRhdGEgdWQsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVXNlckRhdGEgdWQpIil9LAotCXsiU0dHZXRJbmRDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0SW5kQ2hhbm5lbCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBzaG9ydCBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHQ2hhbm5lbCByZWYsIE9TVHlwZSBjaGFuVHlwZSkiKX0sCi0JeyJTR1VwZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR1VwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBSZ25IYW5kbGUgdXBkYXRlUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFBhdXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0UGF1c2UsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gcGF1c2VkKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBVc2VyRGF0YSB1ZCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDaGFubmVsU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVc2VyRGF0YSB1ZCkiKX0sCi0JeyJTR0dldE1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRNb2RlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHByZXZpZXdNb2RlLCBCb29sZWFuIHJlY29yZE1vZGUpIil9LAotCXsiU0dTZXREYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgd2hlcmVGbGFncykiKX0sCi0JeyJTR05ld091dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR05ld091dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR091dHB1dCBzZ091dCkiKX0sCi0JeyJTR0Rpc3Bvc2VPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dEaXNwb3NlT3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldE91dHB1dEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQsIGxvbmcgd2hlcmVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRDaGFubmVsT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbE91dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZyIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmcsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHNwYWNlKSIpfSwKLQl7IlNHSGFuZGxlVXBkYXRlRXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dIYW5kbGVVcGRhdGVFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBFdmVudFJlY29yZCBldmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaGFuZGxlZCkiKX0sCi0JeyJTR1NldE91dHB1dE5leHRPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRPdXRwdXROZXh0T3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCBTR091dHB1dCBuZXh0T3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldE91dHB1dE5leHRPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRPdXRwdXROZXh0T3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dPdXRwdXQgbmV4dE91dCkiKX0sCi0JeyJTR1NldE91dHB1dE1heGltdW1PZmZzZXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCB3aWRlIG1heE9mZnNldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0T3V0cHV0TWF4aW11bU9mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgbWF4T2Zmc2V0KSIpfSwKLQl7IlNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE91dHB1dERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IlNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YSIsIChQeUNGdW5jdGlvbilRdF9TR1dyaXRlRXh0ZW5kZWRNb3ZpZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCBTR091dHB1dCBzZ091dCkiKX0sCi0JeyJTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgYnl0ZXMpIil9LAotCXsiU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIHNwYWNlKSIpfSwKLQl7IlNHV3JpdGVNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZU1vdmllRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBvZmZzZXQpIil9LAotCXsiU0dHZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lQmFzZSB0YikiKX0sCi0JeyJTR0FkZE1vdmllRGF0YSIsIChQeUNGdW5jdGlvbilRdF9TR0FkZE1vdmllRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuLCBsb25nIGNoUmVmQ29uLCBUaW1lVmFsdWUgdGltZSwgc2hvcnQgd3JpdGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBvZmZzZXQpIil9LAotCXsiU0dDaGFuZ2VkU291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbmdlZFNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dBZGRFeHRlbmRlZE1vdmllRGF0YSIsIChQeUNGdW5jdGlvbilRdF9TR0FkZEV4dGVuZGVkTW92aWVEYXRhLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBQdHIgcCwgbG9uZyBsZW4sIGxvbmcgY2hSZWZDb24sIFRpbWVWYWx1ZSB0aW1lLCBzaG9ydCB3cml0ZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgU0dPdXRwdXQgd2hpY2hPdXRwdXQpIil9LAotCXsiU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSIsIChQeUNGdW5jdGlvbilRdF9TR0FkZE91dHB1dERhdGFSZWZUb01lZGlhLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCBNZWRpYSB0aGVNZWRpYSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRTZXR0aW5nc1N1bW1hcnkiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTZXR0aW5nc1N1bW1hcnksIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIHN1bW1hcnlUZXh0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldENoYW5uZWxVc2FnZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxVc2FnZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgdXNhZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFVzYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFVzYWdlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdXNhZ2UpIil9LAotCXsiU0dTZXRDaGFubmVsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFJlY3QgYm91bmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxCb3VuZHMiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCB2b2x1bWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgdm9sdW1lKSIpfSwKLQl7IlNHR2V0Q2hhbm5lbEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGNoYW5uZWxJbmZvKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbFBsYXlGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxQbGF5RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHBsYXlGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDaGFubmVsUGxheUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFBsYXlGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHBsYXlGbGFncykiKX0sCi0JeyJTR1NldENoYW5uZWxNYXhGcmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsTWF4RnJhbWVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBmcmFtZUNvdW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxNYXhGcmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsTWF4RnJhbWVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZnJhbWVDb3VudCkiKX0sCi0JeyJTR1NldENoYW5uZWxSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyByZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0Q2hhbm5lbENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsQ2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFJnbkhhbmRsZSB0aGVDbGlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIHRoZUNsaXApIil9LAotCXsiU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgc2FtcGxlRGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRDaGFubmVsRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbERldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cmluZ1B0ciBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVTY2FsZSBzY2FsZSkiKX0sCi0JeyJTR0NoYW5uZWxQdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFB1dFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0NoYW5uZWxTZXRSZXF1ZXN0ZWREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxTZXRSZXF1ZXN0ZWREYXRhUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAotCXsiU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHIyNTUgbmFtZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTY3JpcHRDb2RlIHNjcmlwdFRhZykiKX0sCi0JeyJTR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFNldENvZGVjU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgc2V0dGluZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsR2V0Q29kZWNTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgc2V0dGluZ3MpIil9LAotCXsiU0dHZXRDaGFubmVsVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZUJhc2UgdGIpIil9LAotCXsiU0dHZXRDaGFubmVsUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHJlZkNvbikiKX0sCi0JeyJTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHIyNTUgb3V0RGV2aWNlTmFtZSwgU3RyMjU1IG91dElucHV0TmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IG91dElucHV0TnVtYmVyKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbERldmljZUlucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbERldmljZUlucHV0LCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgaW5JbnB1dE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRDaGFubmVsU2V0dGluZ3NTdGF0ZUNoYW5naW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFVJbnQzMiBpbkZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0luaXRDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSW5pdENoYW5uZWwsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTZXFHcmFiQ29tcG9uZW50IG93bmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1dyaXRlU2FtcGxlcyIsIChQeUNGdW5jdGlvbilRdF9TR1dyaXRlU2FtcGxlcywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIE1vdmllIG0sIEFsaWFzSGFuZGxlIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKLQl7IlNHQWxpZ25DaGFubmVsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TR0FsaWduQ2hhbm5lbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKLQl7IlNHUGFuZWxHZXREaXRsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXREaXRsLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGl0bCkiKX0sCi0JeyJTR1BhbmVsR2V0VGl0bGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEdldFRpdGxlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFN0cjI1NSB0aXRsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dQYW5lbENhblJ1biIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsQ2FuUnVuLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhbmVsSW5zdGFsbCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsSW5zdGFsbCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgRGlhbG9nUHRyIGQsIHNob3J0IGl0ZW1PZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxFdmVudCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsRXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0LCBFdmVudFJlY29yZCB0aGVFdmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGl0ZW1IaXQsIEJvb2xlYW4gaGFuZGxlZCkiKX0sCi0JeyJTR1BhbmVsSXRlbSIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgRGlhbG9nUHRyIGQsIHNob3J0IGl0ZW1PZmZzZXQsIHNob3J0IGl0ZW1OdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxSZW1vdmUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFJlbW92ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgRGlhbG9nUHRyIGQsIHNob3J0IGl0ZW1PZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxTZXRHcmFiYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxTZXRHcmFiYmVyLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNlcUdyYWJDb21wb25lbnQgc2cpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxTZXRSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxTZXRSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIHNob3J0IHJlc1JlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dQYW5lbEdldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVzZXJEYXRhIHVkKSIpfSwKLQl7IlNHUGFuZWxTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFVzZXJEYXRhIHVkLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhbmVsVmFsaWRhdGVJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsVmFsaWRhdGVJbnB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBvaykiKX0sCi0JeyJTR1BhbmVsR2V0RElUTEZvclNpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEdldERJVExGb3JTaXplLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGl0bCwgUG9pbnQgcmVxdWVzdGVkU2l6ZSkiKX0sCi0JeyJTR0dldFNyY1ZpZGVvQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U3JjVmlkZW9Cb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKLQl7IlNHU2V0VmlkZW9SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9SZWN0LCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgUmVjdCByKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFZpZGVvUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHIpIil9LAotCXsiU0dHZXRWaWRlb0NvbXByZXNzb3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VmlkZW9Db21wcmVzc29yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgY29tcHJlc3NvclR5cGUpIil9LAotCXsiU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9Db21wcmVzc29yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIE9TVHlwZSBjb21wcmVzc29yVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRWaWRlb0NvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRWaWRlb0NvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBkZXB0aCwgQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yLCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIGxvbmcga2V5RnJhbWVSYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFZpZGVvQ29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvQ29tcHJlc3NvciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBkZXB0aCwgQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yLCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIGxvbmcga2V5RnJhbWVSYXRlKSIpfSwKLQl7IlNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRJbnN0YW5jZSBfcnYpIil9LAotCXsiU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgQ29tcG9uZW50SW5zdGFuY2UgdmRpZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dWaWRlb0RpZ2l0aXplckNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfU0dWaWRlb0RpZ2l0aXplckNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dyYWJGcmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0dyYWJGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHcmFiRnJhbWVDb21wbGV0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dyYWJGcmFtZUNvbXBsZXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBkb25lKSIpfSwKLQl7IlNHQ29tcHJlc3NGcmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0NvbXByZXNzRnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBidWZmZXJOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0Q29tcHJlc3NCdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDb21wcmVzc0J1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGRlcHRoLCBSZWN0IGNvbXByZXNzU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDb21wcmVzc0J1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9TR0dldENvbXByZXNzQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGRlcHRoLCBSZWN0IGNvbXByZXNzU2l6ZSkiKX0sCi0JeyJTR0dldEJ1ZmZlckluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRCdWZmZXJJbmZvLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGl4TWFwSGFuZGxlIGJ1ZmZlclBNLCBSZWN0IGJ1ZmZlclJlY3QsIEdXb3JsZFB0ciBjb21wcmVzc0J1ZmZlciwgUmVjdCBjb21wcmVzc0J1ZmZlclJlY3QpIil9LAotCXsiU0dTZXRVc2VTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRVc2VTY3JlZW5CdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRVc2VTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRVc2VTY3JlZW5CdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB1c2VTY3JlZW5CdWZmZXIpIil9LAotCXsiU0dTZXRGcmFtZVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGcmFtZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBGaXhlZCBmcmFtZVJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RnJhbWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RnJhbWVSYXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEZpeGVkIGZyYW1lUmF0ZSkiKX0sCi0JeyJTR1NldFByZWZlcnJlZFBhY2tldFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0UHJlZmVycmVkUGFja2V0U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSIpfSwKLQl7IlNHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEhhbmRsZSBjb21wcmVzc29yVHlwZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgY29tcHJlc3NvclR5cGVzKSIpfSwKLQl7IlNHU2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kSW5wdXREcml2ZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHIyNTUgZHJpdmVyTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRTb3VuZElucHV0RHJpdmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRJbnB1dERyaXZlciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU291bmRJbnB1dERyaXZlckNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRSZWNvcmRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHNlY29uZHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0U291bmRSZWNvcmRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTb3VuZFJlY29yZENodW5rU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTR1NldFNvdW5kSW5wdXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRJbnB1dFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBGaXhlZCByYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFNvdW5kSW5wdXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRJbnB1dFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IlNHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IHNhbXBsZVNpemUsIHNob3J0IG51bUNoYW5uZWxzLCBPU1R5cGUgY29tcHJlc3Npb25UeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRJbnB1dFBhcmFtZXRlcnMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgc2FtcGxlU2l6ZSwgc2hvcnQgbnVtQ2hhbm5lbHMsIE9TVHlwZSBjb21wcmVzc2lvblR5cGUpIil9LAotCXsiU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcyIsIChQeUNGdW5jdGlvbilRdF9TR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHJhdGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHJhdGVzKSIpfSwKLQl7IlNHU2V0Rm9udE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGb250TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cmluZ1B0ciBwc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldEZvbnRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Rm9udFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBmb250U2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRUZXh0Rm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VGV4dEZvcmVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciB0aGVDb2xvcikiKX0sCi0JeyJTR1NldFRleHRCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRUZXh0QmFja0NvbG9yLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIHRoZUNvbG9yKSIpfSwKLQl7IlNHU2V0SnVzdGlmaWNhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9TR1NldEp1c3RpZmljYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBqdXN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHJldHRvc3BhY2UpIil9LAotCXsiU0dTZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IHJldHRvc3BhY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRDdXJyZW50Q2xpZW50TmFtZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgU3RyMjU1IHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dEJlZ2luIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRCZWdpbiwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dEVuZCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0RW5kLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBsb25nIGRpc3BsYXlNb2RlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRpc3BsYXlNb2RlSUQpIil9LAotCXsiUVRWaWRlb091dHB1dEdldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgR1dvcmxkUHRyIGd3KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRDbG9jayIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0Q2xvY2ssIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnRJbnN0YW5jZSBjbG9jaykiKX0sCi0JeyJRVFZpZGVvT3V0cHV0U2V0RWNob1BvcnQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0LCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBDR3JhZlB0ciBlY2hvUG9ydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3NvciwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudCBjb2RlYykiKX0sCi0JeyJRVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIENHcmFmUHRyIGVjaG9Qb3J0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVUludDMyIGZsYWdzLCBVSW50MzIgZmxhZ3NNYXNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBmbGFncykiKX0sCi0JeyJNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU2l6ZSBhbGxvd2FuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2l6ZSBhbGxvd2FuY2UpIil9LAotCXsiTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUVtcHR5QWxsUHVyZ2VhYmxlQ2h1bmtzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0SGFuZGxlckNhcGFiaWxpdGllcyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhSWRsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUlkbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIGF0TWVkaWFUaW1lLCBsb25nIGZsYWdzSW4sIFRpbWVSZWNvcmQgbW92aWVUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFnc091dCkiKX0sCi0JeyJNZWRpYUdldE1lZGlhSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE1lZGlhSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBIYW5kbGUgaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFQdXRNZWRpYUluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFQdXRNZWRpYUluZm8sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0QWN0aXZlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0QWN0aXZlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gZW5hYmxlTWVkaWEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHR2V0U3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR0dldFN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50UmVzdWx0IHN0YXR1c0VycikiKX0sCi0JeyJNZWRpYVRyYWNrRWRpdGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVHJhY2tFZGl0ZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldE1lZGlhVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVTY2FsZSBuZXdUaW1lU2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0TW92aWVUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lU2NhbGUgbmV3VGltZVNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDR3JhZlB0ciBhUG9ydCwgR0RIYW5kbGUgYUdEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXREaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIHRoZUNsaXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0VHJhY2tPcGFxdWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRUcmFja09wYXF1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB0cmFja0lzT3BhcXVlKSIpfSwKLQl7Ik1lZGlhU2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0R3JhcGhpY3NNb2RlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgbW9kZSwgUkdCQ29sb3Igb3BDb2xvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRHcmFwaGljc01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbW9kZSwgUkdCQ29sb3Igb3BDb2xvcikiKX0sCi0JeyJNZWRpYUdTZXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHU2V0Vm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHZvbHVtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRTb3VuZEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZEJhbGFuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgYmFsYW5jZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRTb3VuZEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZEJhbGFuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhbGFuY2UpIil9LAotCXsiTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVZhbHVlIHdoZW4pIil9LAotCXsiTWVkaWFHZXRTcmNSZ24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTcmNSZ24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIHJnbiwgVGltZVZhbHVlIGF0TWVkaWFUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVByZXJvbGwiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFQcmVyb2xsLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUhhc0NoYXJhY3RlcmlzdGljIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSGFzQ2hhcmFjdGVyaXN0aWMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGNoYXJhY3RlcmlzdGljKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBoYXNJdCkiKX0sCi0JeyJNZWRpYUdldE9mZnNjcmVlbkJ1ZmZlclNpemUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGRlcHRoLCBDVGFiSGFuZGxlIGN0YWIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCi0JeyJNZWRpYVNldEhpbnRzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0SGludHMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBoaW50cykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBTdHIyNTUgbmFtZSwgbG9uZyByZXF1ZXN0ZWRMYW5ndWFnZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYWN0dWFsTGFuZ3VhZ2UpIil9LAotCXsiTWVkaWFGb3JjZVVwZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUZvcmNlVXBkYXRlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZm9yY2VVcGRhdGVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXREcmF3aW5nUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0RHJhd2luZ1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIHBhcnRpYWxSZ24pIil9LAotCXsiTWVkaWFHU2V0QWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdTZXRBY3RpdmVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhY3RpdmVTdGFydCwgVGltZVZhbHVlIGFjdGl2ZUR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUludmFsaWRhdGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFJbnZhbGlkYXRlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSBpbnZhbFJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXROZXh0U3RlcFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXROZXh0U3RlcFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgZmxhZ3MsIFRpbWVWYWx1ZSBtZWRpYVRpbWVJbiwgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBtZWRpYVRpbWVPdXQpIil9LAotCXsiTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaW5wdXRJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlciIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHNhbXBsZU51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFUcmFja1Byb3BlcnR5QXRvbUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFUcmFja1Byb3BlcnR5QXRvbUNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRWaWRlb1BhcmFtIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0VmlkZW9QYXJhbSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHdoaWNoUGFyYW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkiKX0sCi0JeyJNZWRpYUdldFZpZGVvUGFyYW0iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRWaWRlb1BhcmFtLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgd2hpY2hQYXJhbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHZhbHVlKSIpfSwKLQl7Ik1lZGlhQ29tcGFyZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUNvbXBhcmUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgTWVkaWEgc3JjTWVkaWEsIENvbXBvbmVudEluc3RhbmNlIHNyY01lZGlhQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBpc09LKSIpfSwKLQl7Ik1lZGlhR2V0Q2xvY2siLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRDbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50SW5zdGFuY2UgY2xvY2spIil9LAotCXsiTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudCkiKX0sCi0JeyJNZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBIYW5kbGUgZGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRJbnZhbGlkUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0SW52YWxpZFJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBSZ25IYW5kbGUgcmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaW5wdXRJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRVUkxMaW5rIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VVJMTGluaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQb2ludCBkaXNwbGF5V2hlcmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdXJsTGluaykiKX0sCi0JeyJNZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIFBvaW50IGxvYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdGFyZ2V0UmVmQ29uKSIpfSwKLQl7Ik1lZGlhSGl0VGVzdFRhcmdldFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB0YXJnZXRSZWZDb24sIGxvbmcgZmxhZ3MsIFBvaW50IGxvYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2FzSGl0KSIpfSwKLQl7Ik1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYURpc3Bvc2VUYXJnZXRSZWZDb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB0YXJnZXRSZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmlyc3RSZWZDb24sIGxvbmcgc2Vjb25kUmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlcXVhbCkiKX0sCi0JeyJNZWRpYVByZVByZXJvbGxDYW5jZWwiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFQcmVQcmVyb2xsQ2FuY2VsLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiByZWZjb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhRW50ZXJFbXB0eUVkaXQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFFbnRlckVtcHR5RWRpdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1pbGxpU2VjcykiKX0sCi0JeyJNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEVmZmVjdGl2ZVZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgdm9sdW1lKSIpfSwKLQl7Ik1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZW5hYmxlZCkiKX0sCi0JeyJNZWRpYVNldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gZW5hYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgYmFsYW5jZSkiKX0sCi0JeyJNZWRpYVNldFNjcmVlbkxvY2siLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTY3JlZW5Mb2NrLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gbG9ja0l0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldEVycm9yU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0RXJyb3JTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29tcG9uZW50UmVzdWx0IHRoZUVycm9yLCBTdHIyNTUgZXJyb3JTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50OCBiYW5kTGV2ZWxzKSIpfSwKLQl7Ik1lZGlhRG9JZGxlQWN0aW9ucyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYURvSWRsZUFjdGlvbnMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgYmFzcywgc2hvcnQgdHJlYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgYmFzcywgc2hvcnQgdHJlYmxlKSIpfSwKLQl7Ik1lZGlhVGltZUJhc2VDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVGltZUJhc2VDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhTUNJc1BsYXllckV2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhTUNJc1BsYXllckV2ZW50LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEV2ZW50UmVjb3JkIGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGhhbmRsZWRJdCkiKX0sCi0JeyJNZWRpYUdldE1lZGlhTG9hZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TWVkaWFMb2FkU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWVkaWFMb2FkU3RhdGUpIil9LAotCXsiTWVkaWFWaWRlb091dHB1dENoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFWaWRlb091dHB1dENoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29tcG9uZW50SW5zdGFuY2Ugdm91dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFFbXB0eVNhbXBsZUNhY2hlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRW1wdHlTYW1wbGVDYWNoZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHNhbXBsZU51bSwgbG9uZyBzYW1wbGVDb3VudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRQdWJsaWNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0UHVibGljSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBPU1R5cGUgaW5mb1NlbGVjdG9yLCB2b2lkICogaW5mb0RhdGFQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTaXplIGlvRGF0YVNpemUpIil9LAotCXsiTWVkaWFTZXRQdWJsaWNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0UHVibGljSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBPU1R5cGUgaW5mb1NlbGVjdG9yLCB2b2lkICogaW5mb0RhdGFQdHIsIFNpemUgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhUmVmQ29uU2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFSZWZDb25TZXRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbiwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVJlZkNvbkdldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUmVmQ29uR2V0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24sIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgbmF2aWdhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uKSIpfSwKLQl7Ik1lZGlhR0dldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR0dldElkbGVNYW5hZ2VyLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJZGxlTWFuYWdlciBwaW0pIil9LAotCXsiTWVkaWFHU2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHU2V0SWRsZU1hbmFnZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSWRsZU1hbmFnZXIgaW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUTUlESUdldE1JRElQb3J0cyIsIChQeUNGdW5jdGlvbilRdF9RVE1JRElHZXRNSURJUG9ydHMsIDEsCi0JIFB5RG9jX1NUUigiKFFUTUlESUNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUTUlESVBvcnRMaXN0SGFuZGxlIGlucHV0UG9ydHMsIFFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzKSIpfSwKLQl7IlFUTUlESVVzZVNlbmRQb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUTUlESVVzZVNlbmRQb3J0LCAxLAotCSBQeURvY19TVFIoIihRVE1JRElDb21wb25lbnQgY2ksIGxvbmcgcG9ydEluZGV4LCBsb25nIGluVXNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVE1JRElTZW5kTUlESSIsIChQeUNGdW5jdGlvbilRdF9RVE1JRElTZW5kTUlESSwgMSwKLQkgUHlEb2NfU1RSKCIoUVRNSURJQ29tcG9uZW50IGNpLCBsb25nIHBvcnRJbmRleCwgTXVzaWNNSURJUGFja2V0IG1wKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWRpQ2hhbm5lbCwgbG9uZyBwb2x5cGhvbnkpIil9LAotCXsiTXVzaWNTZXRQYXJ0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydCwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBtaWRpQ2hhbm5lbCwgbG9uZyBwb2x5cGhvbnkpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlciwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBpbnN0cnVtZW50TnVtYmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU3RvcmVQYXJ0SW5zdHJ1bWVudCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1N0b3JlUGFydEluc3RydW1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgaW5zdHJ1bWVudE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQXRvbWljSW5zdHJ1bWVudCBhaSkiKX0sCi0JeyJNdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIEF0b21pY0luc3RydW1lbnRQdHIgYWlQLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydEtub2IsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcga25vYklEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldFBhcnRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEtub2IsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcga25vYklELCBsb25nIGtub2JWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0S25vYiwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYklEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldEtub2IiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRLbm9iLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iSUQsIGxvbmcga25vYlZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIFN0cmluZ1B0ciBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldFBhcnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIFN0cmluZ1B0ciBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1BsYXlOb3RlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljUGxheU5vdGUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgcGl0Y2gsIGxvbmcgdmVsb2NpdHkpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljUmVzZXRQYXJ0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljUmVzZXRQYXJ0LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldFBhcnRDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydENvbnRyb2xsZXIsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIE11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyLCBsb25nIGNvbnRyb2xsZXJWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRQYXJ0Q29udHJvbGxlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRDb250cm9sbGVyLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBNdXNpY0NvbnRyb2xsZXIgY29udHJvbGxlck51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIG1vZGlmaWFibGVJbnN0cnVtZW50cykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBpbnN0cnVtZW50TmFtZXMsIEhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlMYXN0cywgSGFuZGxlIGluc3RydW1lbnRDYXRlZ29yeU5hbWVzKSIpfSwKLQl7Ik11c2ljR2V0RHJ1bU5hbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0RHJ1bU5hbWVzLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtb2RpZmlhYmxlSW5zdHJ1bWVudHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaW5zdHJ1bWVudE51bWJlcnMsIEhhbmRsZSBpbnN0cnVtZW50TmFtZXMpIil9LAotCXsiTXVzaWNHZXRNYXN0ZXJUdW5lIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0TWFzdGVyVHVuZSwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU2V0TWFzdGVyVHVuZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldE1hc3RlclR1bmUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIG1hc3RlclR1bmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0RGV2aWNlQ29ubmVjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldERldmljZUNvbm5lY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpZDEsIGxvbmcgaWQyKSIpfSwKLQl7Ik11c2ljVXNlRGV2aWNlQ29ubmVjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1VzZURldmljZUNvbm5lY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGlkMSwgbG9uZyBpZDIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iSW5kZXgsIGxvbmcgaXNHbG9iYWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgc2V0dGluZ3NOYW1lcywgSGFuZGxlIHNldHRpbmdzQ2F0ZWdvcnlMYXN0cywgSGFuZGxlIHNldHRpbmdzQ2F0ZWdvcnlOYW1lcykiKX0sCi0JeyJNdXNpY0dldE1JRElQb3J0cyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldE1JRElQb3J0cywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGlucHV0UG9ydENvdW50LCBsb25nIG91dHB1dFBvcnRDb3VudCkiKX0sCi0JeyJNdXNpY1NlbmRNSURJIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2VuZE1JREksIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBvcnRJbmRleCwgTXVzaWNNSURJUGFja2V0IG1wKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldE9mZmxpbmVUaW1lVG8iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRPZmZsaW5lVGltZVRvLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBuZXdUaW1lU3RhbXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0SW5mb1RleHQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRJbmZvVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgc2VsZWN0b3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdGV4dEgsIEhhbmRsZSBzdHlsZUgpIil9LAotCXsiTXVzaWNHZXRJbnN0cnVtZW50SW5mbyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEluc3RydW1lbnRJbmZvLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBnZXRJbnN0cnVtZW50SW5mb0ZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW5zdHJ1bWVudEluZm9MaXN0SGFuZGxlIGluZm9MaXN0SCkiKX0sCi0JeyJNdXNpY1Rhc2siLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNUYXNrLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgaW5zdHJ1bWVudE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIEhhbmRsZSBkYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dlbmVyaWNDb25maWd1cmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZW5lcmljQ29uZmlndXJlLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtb2RlLCBsb25nIGZsYWdzLCBsb25nIGJhc2VSZXNJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZW5lcmljR2V0S25vYkxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZW5lcmljR2V0S25vYkxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGtub2JUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgR2VuZXJpY0tub2JEZXNjcmlwdGlvbkxpc3RIYW5kbGUgZ2tkbEgpIil9LAotCXsiTXVzaWNHZW5lcmljU2V0UmVzb3VyY2VOdW1iZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIEhhbmRsZSByZXNvdXJjZUlESCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNEZXJpdmVkTUlESVNlbmQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkTUlESVNlbmQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBNdXNpY01JRElQYWNrZXQgcGFja2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljRGVyaXZlZENsb3NlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBzaG9ydCByZXNSZWZOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik5BVW5yZWdpc3Rlck11c2ljRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X05BVW5yZWdpc3Rlck11c2ljRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJOQUdldE1JRElQb3J0cyIsIChQeUNGdW5jdGlvbilRdF9OQUdldE1JRElQb3J0cywgMSwKLQkgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUTUlESVBvcnRMaXN0SGFuZGxlIGlucHV0UG9ydHMsIFFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzKSIpfSwKLQl7Ik5BVGFzayIsIChQeUNGdW5jdGlvbilRdF9OQVRhc2ssIDEsCi0JIFB5RG9jX1NUUigiKE5vdGVBbGxvY2F0b3IgbmEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRIZWFkZXIiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldEhlYWRlciwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgdW5zaWduZWQgbG9uZyAqIGhlYWRlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZUdldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVCYXNlIHRiKSIpfSwKLQl7IlR1bmVTZXRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgVGltZVNjYWxlIHNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUdW5lR2V0VGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lU2NhbGUgc2NhbGUpIil9LAotCXsiVHVuZUluc3RhbnQiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUluc3RhbnQsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgdHVuZVBvc2l0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0dW5lKSIpfSwKLQl7IlR1bmVTdG9wIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTdG9wLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIHN0b3BGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0Vm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBGaXhlZCB2b2x1bWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVHZXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVByZXJvbGwiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVByZXJvbGwsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVVbnJvbGwiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVVucm9sbCwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFBhcnRUcmFuc3Bvc2UiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFBhcnRUcmFuc3Bvc2UsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgcGFydCwgbG9uZyB0cmFuc3Bvc2UsIGxvbmcgdmVsb2NpdHlTaGlmdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZUdldE5vdGVBbGxvY2F0b3IiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldE5vdGVBbGxvY2F0b3IsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChOb3RlQWxsb2NhdG9yIF9ydikiKX0sCi0JeyJUdW5lU2V0U29mdGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRTb2Z0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIGxvbmcgc29mdGVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUdW5lVGFzayIsIChQeUNGdW5jdGlvbilRdF9UdW5lVGFzaywgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldEJhbGFuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIGxvbmcgYmFsYW5jZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFNvdW5kTG9jYWxpemF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRTb3VuZExvY2FsaXphdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgSGFuZGxlIGRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRIZWFkZXJXaXRoU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0SGVhZGVyV2l0aFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgKiBoZWFkZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFBhcnRNaXgiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFBhcnRNaXgsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgcGFydE51bWJlciwgbG9uZyB2b2x1bWUsIGxvbmcgYmFsYW5jZSwgbG9uZyBtaXhGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZUdldFBhcnRNaXgiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldFBhcnRNaXgsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgcGFydE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdm9sdW1lT3V0LCBsb25nIGJhbGFuY2VPdXQsIGxvbmcgbWl4RmxhZ3NPdXQpIil9LAotCXsiQWxpZ25XaW5kb3ciLCAoUHlDRnVuY3Rpb24pUXRfQWxpZ25XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3cCwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKLQl7IkRyYWdBbGlnbmVkV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVF0X0RyYWdBbGlnbmVkV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd3AsIFBvaW50IHN0YXJ0UHQsIFJlY3QgYm91bmRzUmVjdCkgLT4gTm9uZSIpfSwKLQl7Ik1vdmllc1Rhc2siLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVzVGFzaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtYXhNaWxsaVNlY1RvVXNlKSAtPiBOb25lIil9LAorICAgIHsiRW50ZXJNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRW50ZXJNb3ZpZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkV4aXRNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRXhpdE1vdmllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVzRXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVzRXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNsZWFyTW92aWVzU3RpY2t5RXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfQ2xlYXJNb3ZpZXNTdGlja3lFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVzU3RpY2t5RXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVzU3RpY2t5RXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlFUR2V0V2FsbENsb2NrVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2Ugd2FsbENsb2NrVGltZUJhc2UpIil9LAorICAgIHsiUVRJZGxlTWFuYWdlck9wZW4iLCAoUHlDRnVuY3Rpb24pUXRfUVRJZGxlTWFuYWdlck9wZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKElkbGVNYW5hZ2VyIF9ydikiKX0sCisgICAgeyJDcmVhdGVNb3ZpZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdGhlV2luZG93LCBNb3ZpZSB0aGVNb3ZpZSwgVUludDMyIG9wdGlvbnMpIC0+IChSZWN0IGxvY2FsUmVjdCwgQ29udHJvbEhhbmRsZSByZXR1cm5lZENvbnRyb2wpIil9LAorICAgIHsiRGlzcG9zZU1hdHRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Rpc3Bvc2VNYXR0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHRoZU1hdHRlKSAtPiBOb25lIil9LAorICAgIHsiTmV3TW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiUVRHZXRUaW1lVW50aWxOZXh0VGFzayIsIChQeUNGdW5jdGlvbilRdF9RVEdldFRpbWVVbnRpbE5leHRUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHNjYWxlKSAtPiAobG9uZyBkdXJhdGlvbikiKX0sCisgICAgeyJHZXREYXRhSGFuZGxlciIsIChQeUNGdW5jdGlvbilRdF9HZXREYXRhSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhSGFuZGxlclN1YlR5cGUsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKKyAgICB7IlBhc3RlSGFuZGxlSW50b01vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X1Bhc3RlSGFuZGxlSW50b01vdmllLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCwgT1NUeXBlIGhhbmRsZVR5cGUsIE1vdmllIHRoZU1vdmllLCBsb25nIGZsYWdzLCBDb21wb25lbnRJbnN0YW5jZSB1c2VyQ29tcCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgZGF0YVJlZlR5cGUsIEhhbmRsZSBkYXRhUmVmLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50IGltcG9ydGVyKSIpfSwKKyAgICB7IlFUR2V0TUlNRVR5cGVJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0TUlNRVR5cGVJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihjaGFyKiBtaW1lU3RyaW5nU3RhcnQsIHNob3J0IG1pbWVTdHJpbmdMZW5ndGgsIE9TVHlwZSBpbmZvU2VsZWN0b3IsIHZvaWQgKiBpbmZvRGF0YVB0cikgLT4gKGxvbmcgaW5mb0RhdGFTaXplKSIpfSwKKyAgICB7IlRyYWNrVGltZVRvTWVkaWFUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1RyYWNrVGltZVRvTWVkaWFUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdmFsdWUsIFRyYWNrIHRoZVRyYWNrKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCisgICAgeyJOZXdVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilRdF9OZXdVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgdGhlVXNlckRhdGEpIil9LAorICAgIHsiTmV3VXNlckRhdGFGcm9tSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld1VzZXJEYXRhRnJvbUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IChVc2VyRGF0YSB0aGVVc2VyRGF0YSkiKX0sCisgICAgeyJDcmVhdGVNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKHNob3J0IHJlc1JlZk51bSwgTW92aWUgbmV3bW92aWUpIil9LAorICAgIHsiT3Blbk1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9PcGVuTW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZXNSZWZOdW0pIil9LAorICAgIHsiQ2xvc2VNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvc2VNb3ZpZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkRlbGV0ZU1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EZWxldGVNb3ZpZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYykgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld01vdmllRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBzaG9ydCByZXNJZCwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKKyAgICB7Ik5ld01vdmllRnJvbURhdGFGb3JrIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmUmVmTnVtLCBsb25nIGZpbGVPZmZzZXQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21EYXRhRm9yazY0IiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFGb3JrNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZlJlZk51bSwgd2lkZSBmaWxlT2Zmc2V0LCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQpIil9LAorICAgIHsiTmV3TW92aWVGcm9tRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21EYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmbGFncywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkdGFSZWZUeXBlKSAtPiAoTW92aWUgbSwgc2hvcnQgaWQpIil9LAorICAgIHsiTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldCIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBmaWxlT2Zmc2V0LCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NhdGFSZWZUeXBlKSIpfSwKKyAgICB7Ik5ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgsIHNob3J0IG5ld01vdmllRmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCisgICAgeyJSZW1vdmVNb3ZpZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZU1vdmllUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgc2hvcnQgcmVzSWQpIC0+IE5vbmUiKX0sCisgICAgeyJDcmVhdGVNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3MpIC0+IChEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlciwgTW92aWUgbmV3bW92aWUpIil9LAorICAgIHsiT3Blbk1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9PcGVuTW92aWVTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGZsYWdzKSAtPiAoRGF0YUhhbmRsZXIgb3V0RGF0YUhhbmRsZXIpIil9LAorICAgIHsiQ2xvc2VNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvc2VNb3ZpZVN0b3JhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiBOb25lIil9LAorICAgIHsiRGVsZXRlTW92aWVTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlbGV0ZU1vdmllU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNyZWF0ZVNob3J0Y3V0TW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NyZWF0ZVNob3J0Y3V0TW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncywgSGFuZGxlIHRhcmdldERhdGFSZWYsIE9TVHlwZSB0YXJnZXREYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNhblF1aWNrVGltZU9wZW5GaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NhblF1aWNrVGltZU9wZW5GaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uLCBVSW50MzIgaW5GbGFncykgLT4gKEJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLCBCb29sZWFuIG91dENhbk9wZW5Bc01vdmllLCBCb29sZWFuIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpIil9LAorICAgIHsiQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIFVJbnQzMiBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsIEJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWUsIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcikiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21TY3JhcCIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21TY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7IlFUTmV3QWxpYXMiLCAoUHlDRnVuY3Rpb24pUXRfUVROZXdBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZzcywgQm9vbGVhbiBtaW5pbWFsKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAorICAgIHsiRW5kRnVsbFNjcmVlbiIsIChQeUNGdW5jdGlvbilRdF9FbmRGdWxsU2NyZWVuLCAxLAorICAgICBQeURvY19TVFIoIihQdHIgZnVsbFN0YXRlLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9BZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIEhhbmRsZSBleHRlbnNpb24sIE9TVHlwZSBpZFR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIGlkVHlwZSkgLT4gKEhhbmRsZSBleHRlbnNpb24pIil9LAorICAgIHsiUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9SZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBpZFR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCIsIChQeUNGdW5jdGlvbilRdF9RVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZykgLT4gKEV2ZW50UmVjb3JkIHBFdmVudCkiKX0sCisgICAgeyJRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9RVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZykgLT4gTm9uZSIpfSwKKyAgICB7IlFUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9RVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFFUUGFyYW1ldGVyRGlhbG9nIGNyZWF0ZWREaWFsb2csIGxvbmcgYWN0aW9uLCB2b2lkICogcGFyYW1zKSAtPiBOb25lIil9LAorICAgIHsiUVRSZWdpc3RlckFjY2Vzc0tleSIsIChQeUNGdW5jdGlvbilRdF9RVFJlZ2lzdGVyQWNjZXNzS2V5LCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgYWNjZXNzS2V5VHlwZSwgbG9uZyBmbGFncywgSGFuZGxlIGFjY2Vzc0tleSkgLT4gTm9uZSIpfSwKKyAgICB7IlFUVW5yZWdpc3RlckFjY2Vzc0tleSIsIChQeUNGdW5jdGlvbilRdF9RVFVucmVnaXN0ZXJBY2Nlc3NLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBhY2Nlc3NLZXlUeXBlLCBsb25nIGZsYWdzLCBIYW5kbGUgYWNjZXNzS2V5KSAtPiBOb25lIil9LAorICAgIHsiUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBpblJlc3RyaWN0aW9uQ2xhc3MpIC0+IChVSW50MzIgb3V0UmVzdHJpY3Rpb25JRHMpIil9LAorICAgIHsiUVRUZXh0VG9OYXRpdmVUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVGV4dFRvTmF0aXZlVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZVRleHQsIGxvbmcgZW5jb2RpbmcsIGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVmlkZW9NZWRpYUdldFN0YWxsQ291bnQiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYUdldFN0YWxsQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc3RhbGxzKSIpfSwKKyAgICB7IlZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlciIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29kZWNUeXBlIGNUeXBlLCBPU1R5cGUgcGFyYW1ldGVySUQsIGxvbmcgcGFyYW1ldGVyQ2hhbmdlU2VlZCwgdm9pZCAqIGRhdGFQdHIsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlciIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29kZWNUeXBlIGNUeXBlLCBPU1R5cGUgcGFyYW1ldGVySUQsIEhhbmRsZSBvdXRQYXJhbWV0ZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFBZGRUZXh0U2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZFRleHRTYW1wbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUHRyIHRleHQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc2hvcnQgZm9udE51bWJlciwgc2hvcnQgZm9udFNpemUsIFN0eWxlIHRleHRGYWNlLCBzaG9ydCB0ZXh0SnVzdGlmaWNhdGlvbiwgbG9uZyBkaXNwbGF5RmxhZ3MsIFRpbWVWYWx1ZSBzY3JvbGxEZWxheSwgc2hvcnQgaGlsaXRlU3RhcnQsIHNob3J0IGhpbGl0ZUVuZCwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgdGV4dENvbG9yLCBSR0JDb2xvciBiYWNrQ29sb3IsIFJlY3QgdGV4dEJveCwgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3IsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IlRleHRNZWRpYUFkZFRFU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZFRFU2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRFSGFuZGxlIGhURSwgc2hvcnQgdGV4dEp1c3RpZmljYXRpb24sIGxvbmcgZGlzcGxheUZsYWdzLCBUaW1lVmFsdWUgc2Nyb2xsRGVsYXksIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIGJhY2tDb2xvciwgUmVjdCB0ZXh0Qm94LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAorICAgIHsiVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAorICAgIHsiVGV4dE1lZGlhRHJhd1JhdyIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFEcmF3UmF3LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEdXb3JsZFB0ciBndywgR0RIYW5kbGUgZ2QsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplLCBUZXh0RGVzY3JpcHRpb25IYW5kbGUgdGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhU2V0VGV4dFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFSYXdTZXR1cCIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFSYXdTZXR1cCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBHV29ybGRQdHIgZ3csIEdESGFuZGxlIGdkLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSwgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaCwgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFSYXdJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYVJhd0lkbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgR1dvcmxkUHRyIGd3LCBHREhhbmRsZSBnZCwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIGxvbmcgZmxhZ3NJbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3NPdXQpIil9LAorICAgIHsiVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUdldFRleHRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgYXRNZWRpYVRpbWUsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVGV4dE1lZGlhRmluZE5leHRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUZpbmROZXh0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGV4dCwgbG9uZyBzaXplLCBzaG9ydCBmaW5kRmxhZ3MsIFRpbWVWYWx1ZSBzdGFydFRpbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgZm91bmRUaW1lLCBUaW1lVmFsdWUgZm91bmREdXJhdGlvbiwgbG9uZyBvZmZzZXQpIil9LAorICAgIHsiVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3IpIil9LAorICAgIHsiVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGRhdGEsIE9TVHlwZSBkYXRhVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHNwcml0ZUluZGV4LCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBzcHJpdGVJbmRleCwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgc3ByaXRlSGl0SW5kZXgpIil9LAorICAgIHsiU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IG51bVNwcml0ZXMpIil9LAorICAgIHsiU3ByaXRlTWVkaWFDb3VudEltYWdlcyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUNvdW50SW1hZ2VzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBudW1JbWFnZXMpIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGltYWdlRGVzY3JpcHRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNhbXBsZU51bSkiKX0sCisgICAgeyJTcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBTdHIyNTUgc3ByaXRlTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaW1hZ2VJbmRleCwgU3RyMjU1IGltYWdlTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRBdG9tSUQgc3ByaXRlSGl0SUQpIil9LAorICAgIHsiU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB3YXNIaXQpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgc3ByaXRlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEF0b21JRCBzcHJpdGVJRCkiKX0sCisgICAgeyJTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHNwcml0ZUluZGV4KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCB2YXJpYWJsZUlELCBmbG9hdCB2YWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBmbG9hdCB2YWx1ZSkiKX0sCisgICAgeyJTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQsIFB0ciB0aGVDU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdGhlQ1N0cmluZykiKX0sCisgICAgeyJTcHJpdGVNZWRpYU5ld0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhTmV3SW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgUVRBdG9tSUQgZGVzaXJlZElEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUltYWdlSW5kZXhUb0lEIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaW1hZ2VJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUQXRvbUlEIGltYWdlSUQpIil9LAorICAgIHsiU3ByaXRlTWVkaWFJbWFnZUlEVG9JbmRleCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUltYWdlSURUb0luZGV4LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIGltYWdlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpbWFnZUluZGV4KSIpfSwKKyAgICB7IkZsYXNoTWVkaWFTZXRQYW4iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldFBhbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCB4UGVyY2VudCwgc2hvcnQgeVBlcmNlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkZsYXNoTWVkaWFTZXRab29tIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRab29tLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGZhY3RvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRmxhc2hNZWRpYVNldFpvb21SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRab29tUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGxlZnQsIGxvbmcgdG9wLCBsb25nIHJpZ2h0LCBsb25nIGJvdHRvbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBsZWZ0LCBsb25nIHRvcCwgbG9uZyByaWdodCwgbG9uZyBib3R0b20pIil9LAorICAgIHsiRmxhc2hNZWRpYUdldFJlZkNvbklEIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRSZWZDb25JRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uSUQpIil9LAorICAgIHsiRmxhc2hNZWRpYUlEVG9SZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUlEVG9SZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb25JRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlciIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhc2hGcmFtZU51bWJlcikiKX0sCisgICAgeyJGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYXNoRnJhbWVOdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbW92aWVUaW1lKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUZyYW1lTGFiZWxUb01vdmllVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGhlTGFiZWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbW92aWVUaW1lKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIHBhdGgsIGNoYXIgbmFtZSwgSGFuZGxlIHRoZVZhcmlhYmxlQ1N0cmluZ091dCkiKX0sCisgICAgeyJGbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIHVwZGF0ZUZvY3VzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBwYXRoLCBjaGFyIG5hbWUsIGNoYXIgdmFsdWUpIil9LAorICAgIHsiRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgYnV0dG9uSUQsIGxvbmcgdHJhbnNpdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgcGF0aCkiKX0sCisgICAgeyJGbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbiIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggc3dmVmVyc2lvbikiKX0sCisgICAgeyJNZWRpYTNER2V0Q3VycmVudEdyb3VwIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDdXJyZW50R3JvdXAsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGdyb3VwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB4LCBGaXhlZCB5LCBGaXhlZCB6KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBvYmplY3ROYW1lKSIpfSwKKyAgICB7Ik1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB4U2NhbGUsIEZpeGVkIHlTY2FsZSwgRml4ZWQgelNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBvYmplY3ROYW1lKSIpfSwKKyAgICB7Ik1lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHhEZWdyZWVzLCBGaXhlZCB5RGVncmVlcywgRml4ZWQgekRlZ3JlZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG9iamVjdE5hbWUpIil9LAorICAgIHsiTWVkaWEzRFNldENhbWVyYURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNldENhbWVyYURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGNhbWVyYURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhM0RHZXRDYW1lcmFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDYW1lcmFEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiBjYW1lcmFEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFURmxvYXRTaW5nbGUgZm92LCBRVEZsb2F0U2luZ2xlIGFzcGVjdFJhdGlvWFRvWSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRGbG9hdFNpbmdsZSBmb3YsIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZKSIpfSwKKyAgICB7Ik1lZGlhM0RTZXRDYW1lcmFSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2V0Q2FtZXJhUmFuZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIHRRM0NhbWVyYVJhbmdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYTNER2V0Q2FtZXJhUmFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldENhbWVyYVJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiB0UTNDYW1lcmFSYW5nZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTmV3VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfTmV3VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVCYXNlIF9ydikiKX0sCisgICAgeyJDb252ZXJ0VGltZSIsIChQeUNGdW5jdGlvbilRdF9Db252ZXJ0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0aGVUaW1lLCBUaW1lQmFzZSBuZXdCYXNlKSAtPiAoVGltZVJlY29yZCB0aGVUaW1lKSIpfSwKKyAgICB7IkNvbnZlcnRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ29udmVydFRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0aGVUaW1lLCBUaW1lU2NhbGUgbmV3U2NhbGUpIC0+IChUaW1lUmVjb3JkIHRoZVRpbWUpIil9LAorICAgIHsiQWRkVGltZSIsIChQeUNGdW5jdGlvbilRdF9BZGRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIGRzdCwgVGltZVJlY29yZCBzcmMpIC0+IChUaW1lUmVjb3JkIGRzdCkiKX0sCisgICAgeyJTdWJ0cmFjdFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3VidHJhY3RUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIGRzdCwgVGltZVJlY29yZCBzcmMpIC0+IChUaW1lUmVjb3JkIGRzdCkiKX0sCisgICAgeyJNdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSB0aSwgbG9uZyBzYW1wbGVEZXNjSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnRJbnN0YW5jZSB0cCkiKX0sCisgICAgeyJDb2RlY01hbmFnZXJWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvZGVjTWFuYWdlclZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgdmVyc2lvbikiKX0sCisgICAgeyJHZXRNYXhDb21wcmVzc2lvblNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TWF4Q29tcHJlc3Npb25TaXplLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIHNob3J0IGNvbG9yRGVwdGgsIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUsIENvbXByZXNzb3JDb21wb25lbnQgY29kZWMpIC0+IChsb25nIHNpemUpIil9LAorICAgIHsiR2V0Q29tcHJlc3Npb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldENvbXByZXNzaW9uVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0LCBzaG9ydCBjb2xvckRlcHRoLCBDb2RlY1R5cGUgY1R5cGUsIENvbXByZXNzb3JDb21wb25lbnQgY29kZWMpIC0+IChDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lKSIpfSwKKyAgICB7IkNvbXByZXNzSW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcHJlc3NJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0LCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIFB0ciBkYXRhKSAtPiBOb25lIil9LAorICAgIHsiRGVjb21wcmVzc0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlY29tcHJlc3NJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUHRyIGRhdGEsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUGl4TWFwSGFuZGxlIGRzdCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QsIHNob3J0IG1vZGUsIFJnbkhhbmRsZSBtYXNrKSAtPiBOb25lIil9LAorICAgIHsiR2V0U2ltaWxhcml0eSIsIChQeUNGdW5jdGlvbilRdF9HZXRTaW1pbGFyaXR5LCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUHRyIGRhdGEpIC0+IChGaXhlZCBzaW1pbGFyaXR5KSIpfSwKKyAgICB7IkdldEltYWdlRGVzY3JpcHRpb25DVGFibGUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ1RhYkhhbmRsZSBjdGFibGUpIil9LAorICAgIHsiU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIENUYWJIYW5kbGUgY3RhYmxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9HZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIGxvbmcgaWRUeXBlLCBsb25nIGluZGV4KSAtPiAoSGFuZGxlIGV4dGVuc2lvbikiKX0sCisgICAgeyJBZGRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgSGFuZGxlIGV4dGVuc2lvbiwgbG9uZyBpZFR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJDb3VudEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUpIC0+IChsb25nIGNvdW50KSIpfSwKKyAgICB7IkdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSIsIChQeUNGdW5jdGlvbilRdF9HZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKGxvbmcgaWRUeXBlKSIpfSwKKyAgICB7IkZpbmRDb2RlYyIsIChQeUNGdW5jdGlvbilRdF9GaW5kQ29kZWMsIDEsCisgICAgIFB5RG9jX1NUUigiKENvZGVjVHlwZSBjVHlwZSwgQ29kZWNDb21wb25lbnQgc3BlY0NvZGVjKSAtPiAoQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yLCBEZWNvbXByZXNzb3JDb21wb25lbnQgZGVjb21wcmVzc29yKSIpfSwKKyAgICB7IkNvbXByZXNzUGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9Db21wcmVzc1BpY3R1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBzcmNQaWN0dXJlLCBQaWNIYW5kbGUgZHN0UGljdHVyZSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvbXByZXNzUGljdHVyZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcHJlc3NQaWN0dXJlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc3JjUmVmTnVtLCBzaG9ydCBkc3RSZWZOdW0sIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJDb252ZXJ0SW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ29udmVydEltYWdlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0RELCBQdHIgc3JjRGF0YSwgc2hvcnQgY29sb3JEZXB0aCwgQ1RhYkhhbmRsZSBjdGFibGUsIENvZGVjUSBhY2N1cmFjeSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSwgQ29kZWNDb21wb25lbnQgY29kZWMsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0REQsIFB0ciBkc3REYXRhKSAtPiBOb25lIil9LAorICAgIHsiQWRkRmlsZVByZXZpZXciLCAoUHlDRnVuY3Rpb24pUXRfQWRkRmlsZVByZXZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgT1NUeXBlIHByZXZpZXdUeXBlLCBIYW5kbGUgcHJldmlld0RhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRCZXN0RGV2aWNlUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HZXRCZXN0RGV2aWNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgZ2RoLCBSZWN0IHJwKSIpfSwKKyAgICB7IkdESGFzU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RIYXNTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBzaG9ydCBkZXB0aCkgLT4gKEZpeGVkIHNjYWxlKSIpfSwKKyAgICB7IkdER2V0U2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RHZXRTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoKSAtPiAoRml4ZWQgc2NhbGUsIHNob3J0IGZsYWdzKSIpfSwKKyAgICB7IkdEU2V0U2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RTZXRTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBGaXhlZCBzY2FsZSwgc2hvcnQgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRJbnN0YW5jZSBnaSkiKX0sCisgICAgeyJHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9HZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKKyAgICB7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgdGhlRmlsZSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKKyAgICB7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAorICAgIHsiTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwaXhtYXApIC0+IChJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaCkiKX0sCisgICAgeyJNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCIsIChQeUNGdW5jdGlvbilRdF9NYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGVmZmVjdFR5cGUpIC0+IChJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaCkiKX0sCisgICAgeyJRVEdldFBpeGVsU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeGVsU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIFBpeGVsRm9ybWF0KSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIFBpeGVsRm9ybWF0KSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyIsIChQeUNGdW5jdGlvbilRdF9RVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIGxvbmcgcm93Qnl0ZXMpIC0+IE5vbmUiKX0sCisgICAgeyJRVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtLCBGaXhlZCBnYW1tYUxldmVsKSAtPiBOb25lIil9LAorICAgIHsiUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9RVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgRml4ZWQgcmVxdWVzdGVkR2FtbWFMZXZlbCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvbXBBZGQiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcEFkZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBzcmMsIHdpZGUgZHN0KSIpfSwKKyAgICB7IkNvbXBTdWIiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFN1YiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBzcmMsIHdpZGUgZHN0KSIpfSwKKyAgICB7IkNvbXBOZWciLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE5lZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBkc3QpIil9LAorICAgIHsiQ29tcFNoaWZ0IiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBTaGlmdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc2hpZnQpIC0+ICh3aWRlIHNyYykiKX0sCisgICAgeyJDb21wTXVsIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBNdWwsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgc3JjMSwgbG9uZyBzcmMyKSAtPiAod2lkZSBkc3QpIil9LAorICAgIHsiQ29tcERpdiIsIChQeUNGdW5jdGlvbilRdF9Db21wRGl2LCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGRlbm9taW5hdG9yKSAtPiAobG9uZyBfcnYsIHdpZGUgbnVtZXJhdG9yLCBsb25nIHJlbWFpbmRlcikiKX0sCisgICAgeyJDb21wRml4TXVsIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBGaXhNdWwsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIGZpeFNyYykgLT4gKHdpZGUgY29tcFNyYywgd2lkZSBjb21wRHN0KSIpfSwKKyAgICB7IkNvbXBNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE11bERpdiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtdWwsIGxvbmcgZGl2aXNvcikgLT4gKHdpZGUgY28pIil9LAorICAgIHsiQ29tcE11bERpdlRydW5jIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBNdWxEaXZUcnVuYywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtdWwsIGxvbmcgZGl2aXNvcikgLT4gKHdpZGUgY28sIGxvbmcgcmVtYWluZGVyKSIpfSwKKyAgICB7IkNvbXBDb21wYXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBDb21wYXJlLCAxLAorICAgICBQeURvY19TVFIoIih3aWRlIGEsIHdpZGUgbWludXNiKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiQ29tcFNxdWFyZVJvb3QiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFNxdWFyZVJvb3QsIDEsCisgICAgIFB5RG9jX1NUUigiKHdpZGUgc3JjKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAorICAgIHsiRml4TXVsRGl2IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpeE11bERpdiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgc3JjLCBGaXhlZCBtdWwsIEZpeGVkIGRpdmlzb3IpIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiVW5zaWduZWRGaXhNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfVW5zaWduZWRGaXhNdWxEaXYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHNyYywgRml4ZWQgbXVsLCBGaXhlZCBkaXZpc29yKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkZpeEV4cDIiLCAoUHlDRnVuY3Rpb24pUXRfRml4RXhwMiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgc3JjKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkZpeExvZzIiLCAoUHlDRnVuY3Rpb24pUXRfRml4TG9nMiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgc3JjKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkZpeFBvdyIsIChQeUNGdW5jdGlvbilRdF9GaXhQb3csIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIGJhc2UsIEZpeGVkIGV4cCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlVHlwZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldERhdGFGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREYXRhRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFJlYWREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0UmVhZERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGNsaXBSZ24pIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIFJlY3Qgc291cmNlUmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHNvdXJjZVJlY3QpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IG5hdHVyYWxCb3VuZHMpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnREcmF3IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RHJhdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIGZzcywgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBncmFwaGljc01vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZ3JhcGhpY3NNb2RlLCBSR0JDb2xvciBvcENvbG9yKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldFF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBDb2RlY1EgcXVhbGl0eSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb2RlY1EgcXVhbGl0eSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyBmc3MsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEFsaWFzZWREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0VmFsaWRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB2YWxpZCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldE1ldGFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogdXNlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydERvZXNEcmF3QWxsUGl4ZWxzLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGRyYXdzQWxsUGl4ZWxzKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwaWN0dXJlKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZUNyZWF0b3IsIEZTU3BlYyBmc3MsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RXhwb3J0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBpbWFnZUNvdW50KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBpbWFnZUluZGV4KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIHdpZGUgc2l6ZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHdpZGUgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgd2lkZSBvZmZzZXQsIHdpZGUgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgd2lkZSBsaW1pdCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGRlZmF1bHRSZ24pIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRlZmF1bHRHcmFwaGljc01vZGUsIFJHQkNvbG9yIGRlZmF1bHRPcENvbG9yKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdFNvdXJjZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGRlZmF1bHRTb3VyY2VSZWN0KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldENvbG9yU3luY1Byb2ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHByb2ZpbGUpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERlc3RSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmVjdCBkZXN0UmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERlc3RSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGVzdFJlY3QpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3MpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRCYXNlRGF0YU9mZnNldEFuZFNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCB3aWRlIHNpemUpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERvRXhwb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9FeHBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBhY3R1YWxTaXplV3JpdHRlbikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhblRyYW5zY29kZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRDYW5Vc2VDb21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBjYW5Vc2VDb21wcmVzc29yKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBvdXREZXNjKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZU5hbWVFeHRlbnNpb24pIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0aGVUZXh0KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZG9udFJlY29tcHJlc3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGRvbnRSZWNvbXByZXNzKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGludGVybGFjZVN0eWxlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiB1c2VyRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE1ldGFEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHVzZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0YXJnZXREYXRhU2l6ZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIGNvbXByZXNzaW9uTWV0aG9kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBjb21wcmVzc2lvbk1ldGhvZCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIENvZGVjUSBzcGF0aWFsUXVhbGl0eSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGaXhlZCBob3Jpem9udGFsUmVzb2x1dGlvbiwgRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRSZXNvbHV0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uLCBGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb24pIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXREZXB0aCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldERlcHRoLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgbG9uZyBkZXB0aCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXREZXB0aCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERlcHRoLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGVwdGgpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBjb2xvclN5bmNQcm9maWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBjb2xvclN5bmNQcm9maWxlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGgsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBoKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIFB0ciBwLCB1bnNpZ25lZCBsb25nIHNpemUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgUGljSGFuZGxlIHBpY3R1cmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwaWN0dXJlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEdXb3JsZFB0ciBnd29ybGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBHV29ybGRQdHIgZ3dvcmxkKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIFBpeE1hcEhhbmRsZSBwaXhtYXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaXhNYXBIYW5kbGUgcGl4bWFwKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0T2Zmc2V0QW5kTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIG1heVJlYWRJbnB1dERhdGEpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHNpemUpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBkYXRhUHRyLCB1bnNpZ25lZCBsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkaW1lbnNpb25zKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5wdXREZXB0aCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBDR3JhZlB0ciBndywgR0RIYW5kbGUgZ2QsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSwgQm9vbGVhbiB0cnVuY2F0ZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSwgQm9vbGVhbiB0cnVuY2F0ZUZpbGUpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZUNyZWF0b3IpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0TWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgbWFyaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG1hcmspIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlVGh1bWJuYWlsLCBsb25nIG1heFRodW1ibmFpbFdpZHRoLCBsb25nIG1heFRodW1ibmFpbEhlaWdodCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHRodW1ibmFpbEVuYWJsZWQsIGxvbmcgbWF4VGh1bWJuYWlsV2lkdGgsIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlRXhpZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZXhpZkVuYWJsZWQpIil9LAorICAgIHsiSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSIsIChQeUNGdW5jdGlvbilRdF9JbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0Rlc2MsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3REZXNjKSIpfSwKKyAgICB7IkltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0ltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjLCB2b2lkICogZHN0RGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkNsb2NrR2V0VGltZSIsIChQeUNGdW5jdGlvbilRdF9DbG9ja0dldFRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFDbG9jaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVSZWNvcmQgb3V0KSIpfSwKKyAgICB7IkNsb2NrU2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvY2tTZXRUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrLCBUaW1lQmFzZSB0YikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiQ2xvY2tHZXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Nsb2NrR2V0UmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgcmF0ZSkiKX0sCisgICAgeyJTQ1Bvc2l0aW9uUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TQ1Bvc2l0aW9uUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHJwLCBQb2ludCB3aGVyZSkiKX0sCisgICAgeyJTQ1Bvc2l0aW9uRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDUG9zaXRpb25EaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCBpZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBvaW50IHdoZXJlKSIpfSwKKyAgICB7IlNDU2V0VGVzdEltYWdlUGljdEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaWNIYW5kbGUgdGVzdFBpY3QsIHNob3J0IHRlc3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdGVzdFJlY3QpIil9LAorICAgIHsiU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpY3RGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgdGVzdEZpbGVSZWYsIHNob3J0IHRlc3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdGVzdFJlY3QpIil9LAorICAgIHsiU0NTZXRUZXN0SW1hZ2VQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfU0NTZXRUZXN0SW1hZ2VQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgdGVzdFBpeE1hcCwgc2hvcnQgdGVzdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB0ZXN0UmVjdCkiKX0sCisgICAgeyJTQ0dldEJlc3REZXZpY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NDR2V0QmVzdERldmljZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKKyAgICB7IlNDUmVxdWVzdEltYWdlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDQ29tcHJlc3NJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzSW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIEhhbmRsZSBkYXRhKSIpfSwKKyAgICB7IlNDQ29tcHJlc3NQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGljSGFuZGxlIHNyY1BpY3R1cmUsIFBpY0hhbmRsZSBkc3RQaWN0dXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0NvbXByZXNzUGljdHVyZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1BpY3R1cmVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgc3JjUmVmTnVtLCBzaG9ydCBkc3RSZWZOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSIpfSwKKyAgICB7IlNDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGEsIGxvbmcgZGF0YVNpemUsIHNob3J0IG5vdFN5bmNGbGFnKSIpfSwKKyAgICB7IlNDQ29tcHJlc3NTZXF1ZW5jZUVuZCIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzU2VxdWVuY2VFbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGljSGFuZGxlIHNyY1BpY3R1cmUsIHNob3J0IG1vdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgc3JjUmVmLCBzaG9ydCBtb3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDRGVmYXVsdFBpeE1hcFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDRGVmYXVsdFBpeE1hcFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgc2hvcnQgbW90aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0dldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0NTZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIE9TVHlwZSBpbmZvVHlwZSwgdm9pZCAqIGluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDU2V0Q29tcHJlc3NGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TQ1NldENvbXByZXNzRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0dldENvbXByZXNzRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRDb21wcmVzc0ZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3MpIil9LAorICAgIHsiU0NHZXRTZXR0aW5nc0FzVGV4dCIsIChQeUNGdW5jdGlvbilRdF9TQ0dldFNldHRpbmdzQXNUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0ZXh0KSIpfSwKKyAgICB7IlNDQXN5bmNJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQXN5bmNJZGxlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHdlZW5lclJlc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1R3ZWVuZXJSZXNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHdlZW5lckNvbXBvbmVudCB0YykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVENHZXRTb3VyY2VSZWYiLCAoUHlDRnVuY3Rpb24pUXRfVENHZXRTb3VyY2VSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIKSAtPiAoSGFuZGxlckVycm9yIF9ydiwgVXNlckRhdGEgc3JlZkgpIil9LAorICAgIHsiVENTZXRTb3VyY2VSZWYiLCAoUHlDRnVuY3Rpb24pUXRfVENTZXRTb3VyY2VSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RILCBVc2VyRGF0YSBzcmVmSCkgLT4gKEhhbmRsZXJFcnJvciBfcnYpIil9LAorICAgIHsiVENTZXRUaW1lQ29kZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RDU2V0VGltZUNvZGVGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gKEhhbmRsZXJFcnJvciBfcnYpIil9LAorICAgIHsiVENHZXRUaW1lQ29kZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RDR2V0VGltZUNvZGVGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoSGFuZGxlckVycm9yIF9ydiwgbG9uZyBmbGFncykiKX0sCisgICAgeyJNb3ZpZUltcG9ydEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhSCwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFRpbWVWYWx1ZSBkdXJhdGlvbiwgVGltZVNjYWxlIHNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldE1lZGlhRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE1lZGlhRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEFsaWFzSGFuZGxlIGFsaWFzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXREaW1lbnNpb25zLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgRml4ZWQgd2lkdGgsIEZpeGVkIGhlaWdodCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRDaHVua1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGNodW5rU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhLCBPU1R5cGUgaGFuZGxlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBCb29sZWFuIGZyb21TY3JhcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnREb1VzZXJEaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnREb1VzZXJEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgSGFuZGxlIHRoZURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhbmNlbGVkKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0RHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXREdXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldEF1eGlsaWFyeURhdGFUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBhdXhUeXBlKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0VmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRWYWxpZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBIYW5kbGUgdGhlRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdmFsaWQpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXRGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldEZpbGVUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0R2V0U2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0LCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgd2lkZSBvZmZzZXQsIHdpZGUgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0SWRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydElkbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQ4IHZhbGlkKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0R2V0TG9hZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0TG9hZFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW1wb3J0ZXJMb2FkU3RhdGUpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgdGltZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVSZWNvcmQgdGltZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldERvbnRCbG9jayIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldERvbnRCbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZG9udEJsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydEdldERvbnRCbG9jayIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldERvbnRCbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdpbGxCbG9jaykiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0TmV3TW92aWVGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgbmV3TW92aWVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBtZWRpYVR5cGUpIil9LAorICAgIHsiTW92aWVFeHBvcnRUb0hhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFILCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydFRvRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRBdXhpbGlhcnlEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFIKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGhhbmRsZVR5cGUpIil9LAorICAgIHsiTW92aWVFeHBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIG1lZGlhVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVFeHBvcnREb1VzZXJEaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnREb1VzZXJEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBjYW5jZWxlZCkiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEdldENyZWF0b3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGNyZWF0b3IpIil9LAorICAgIHsiTW92aWVFeHBvcnRUb0RhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRUb0RhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydFZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VmFsaWRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdmFsaWQpIil9LAorICAgIHsiTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBleHRlbnNpb24pIil9LAorICAgIHsiTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIFN0cjI1NSB0eXBlU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgbWVkaWFUeXBlKSIpfSwKKyAgICB7IlRleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbW92aWVUaW1lRnJhY3Rpb24pIil9LAorICAgIHsiVGV4dEV4cG9ydFNldFRpbWVGcmFjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIG1vdmllVGltZUZyYWN0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0RXhwb3J0R2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dEV4cG9ydEdldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZXR0aW5nKSIpfSwKKyAgICB7IlRleHRFeHBvcnRTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0U2V0U2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgc2V0dGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUlESUltcG9ydEdldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01JRElJbXBvcnRHZXRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2V0dGluZykiKX0sCisgICAgeyJNSURJSW1wb3J0U2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTUlESUltcG9ydFNldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIHNldHRpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNJbWFnZU1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlbmFibGUpIil9LAorICAgIHsiUHJldmlld1Nob3dEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdTaG93RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwLCBPU1R5cGUgZGF0YVR5cGUsIEhhbmRsZSBkYXRhLCBSZWN0IGluSGVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwLCBGU1NwZWMgc291cmNlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBwcmV2aWV3VHlwZSwgc2hvcnQgcmVzSUQpIil9LAorICAgIHsiUHJldmlld0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRXZlbnRSZWNvcmQgZSwgQm9vbGVhbiBoYW5kbGVkRXZlbnQpIil9LAorICAgIHsiRGF0YUNvZGVjRGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNEZWNvbXByZXNzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMsIHZvaWQgKiBzcmNEYXRhLCBVSW50MzIgc3JjU2l6ZSwgdm9pZCAqIGRzdERhdGEsIFVJbnQzMiBkc3RCdWZmZXJTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjR2V0Q29tcHJlc3NCdWZmZXJTaXplLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMsIFVJbnQzMiBzcmNTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGRzdFNpemUpIil9LAorICAgIHsiRGF0YUNvZGVjQ29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjQ29tcHJlc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdm9pZCAqIHNyY0RhdGEsIFVJbnQzMiBzcmNTaXplLCB2b2lkICogZHN0RGF0YSwgVUludDMyIGRzdEJ1ZmZlclNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgYWN0dWFsRHN0U2l6ZSwgVUludDMyIGRlY29tcHJlc3NTbG9wKSIpfSwKKyAgICB7IkRhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdW5zaWduZWQgbG9uZyBtYXhTcmNTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhQ29kZWNFbmRJbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0VuZEludGVycnVwdFNhZmUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBoLCBsb25nIGhPZmZzZXQsIGxvbmcgb2Zmc2V0LCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIUHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFB1dERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgaCwgbG9uZyBoT2Zmc2V0LCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG9mZnNldCkiKX0sCisgICAgeyJEYXRhSEZsdXNoRGF0YSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEZsdXNoRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIT3BlbkZvcldyaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIT3BlbkZvcldyaXRlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhDbG9zZUZvcldyaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ2xvc2VGb3JXcml0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIT3BlbkZvclJlYWQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhPcGVuRm9yUmVhZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIQ2xvc2VGb3JSZWFkIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ2xvc2VGb3JSZWFkLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhTZXREYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmKSIpfSwKKyAgICB7IkRhdGFIQ29tcGFyZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDb21wYXJlRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlcXVhbCkiKX0sCisgICAgeyJEYXRhSFRhc2siLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhGaW5pc2hEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRmluaXNoRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFB0ciBQbGFjZVRvUHV0RGF0YVB0ciwgQm9vbGVhbiBDYW5jZWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIRmx1c2hDYWNoZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEZsdXNoQ2FjaGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSFJlc29sdmVEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUmVzb2x2ZURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgdGhlRGF0YVJlZiwgQm9vbGVhbiB1c2VySW50ZXJmYWNlQWxsb3dlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCisgICAgeyJEYXRhSEdldEZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmaWxlU2l6ZSkiKX0sCisgICAgeyJEYXRhSENhblVzZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDYW5Vc2VEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHVzZUZsYWdzKSIpfSwKKyAgICB7IkRhdGFIUHJlZXh0ZW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUHJlZXh0ZW5kLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgdW5zaWduZWQgbG9uZyBtYXhUb0FkZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc3BhY2VBZGRlZCkiKX0sCisgICAgeyJEYXRhSFNldEZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RmlsZVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZpbGVTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldEZyZWVTcGFjZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZyZWVTcGFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGZyZWVTaXplKSIpfSwKKyAgICB7IkRhdGFIQ3JlYXRlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENyZWF0ZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgY3JlYXRvciwgQm9vbGVhbiBkZWxldGVFeGlzdGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBibG9ja1NpemUpIil9LAorICAgIHsiRGF0YUhHZXREZXZpY2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERldmljZUluZGV4LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGV2aWNlSW5kZXgpIil9LAorICAgIHsiRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHllcykiKX0sCisgICAgeyJEYXRhSEdldERhdGFJbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFJbkJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgc3RhcnRPZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNpemUpIil9LAorICAgIHsiRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlsbGlzZWNzKSIpfSwKKyAgICB7IkRhdGFIU2V0Q2FjaGVTaXplTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRDYWNoZVNpemVMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFNpemUgY2FjaGVTaXplTGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0Q2FjaGVTaXplTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRDYWNoZVNpemVMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTaXplIGNhY2hlU2l6ZUxpbWl0KSIpfSwKKyAgICB7IkRhdGFIR2V0TW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIil9LAorICAgIHsiRGF0YUhBZGRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEFkZE1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgTW92aWUgdGhlTW92aWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpZCkiKX0sCisgICAgeyJEYXRhSFVwZGF0ZU1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIVXBkYXRlTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIRG9lc0J1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSERvZXNCdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBidWZmZXJzUmVhZHMsIEJvb2xlYW4gYnVmZmVyc1dyaXRlcykiKX0sCisgICAgeyJEYXRhSEdldEZpbGVOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZU5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmaWxlU2l6ZSkiKX0sCisgICAgeyJEYXRhSEdldE1hY09TRmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNYWNPU0ZpbGVUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSkiKX0sCisgICAgeyJEYXRhSEdldE1JTUVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0TUlNRVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBTdHIyNTUgbWltZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIU2V0RGF0YVJlZldpdGhBbmNob3IiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBhbmNob3JEYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgYW5jaG9yRGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYpIil9LAorICAgIHsiRGF0YUhTZXRNYWNPU0ZpbGVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0TWFjT1NGaWxlVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBmaWxlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhTZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldFRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgVGltZUJhc2UgdGIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0SW5mb0ZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0SW5mb0ZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBmbGFncykiKX0sCisgICAgeyJEYXRhSEdldEZpbGVTaXplNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZmlsZVNpemUpIil9LAorICAgIHsiRGF0YUhQcmVleHRlbmQ2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFByZWV4dGVuZDY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBtYXhUb0FkZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgc3BhY2VBZGRlZCkiKX0sCisgICAgeyJEYXRhSFNldEZpbGVTaXplNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRGaWxlU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBmaWxlU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRGcmVlU3BhY2U2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZyZWVTcGFjZTY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZnJlZVNpemUpIil9LAorICAgIHsiRGF0YUhBcHBlbmQ2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEFwcGVuZDY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgdm9pZCAqIGRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZmlsZU9mZnNldCkiKX0sCisgICAgeyJEYXRhSFBvbGxSZWFkIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUG9sbFJlYWQsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB2b2lkICogZGF0YVB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBkYXRhU2l6ZVNvRmFyKSIpfSwKKyAgICB7IkRhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFBdmFpbGFiaWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIG9mZnNldCwgbG9uZyBsZW4pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1pc3Npbmdfb2Zmc2V0LCBsb25nIG1pc3NpbmdfbGVuKSIpfSwKKyAgICB7IkRhdGFIR2V0RGF0YVJlZkFzVHlwZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWZBc1R5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgcmVxdWVzdGVkVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmKSIpfSwKKyAgICB7IkRhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldERhdGFSZWZFeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgZXh0ZW5zaW9uLCBPU1R5cGUgaWRUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldERhdGFSZWZFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIGlkVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBleHRlbnNpb24pIil9LAorICAgIHsiRGF0YUhHZXRNb3ZpZVdpdGhGbGFncyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1vdmllV2l0aEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgc2hvcnQgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIil9LAorICAgIHsiRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZVR5cGVPcmRlcmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBEYXRhSEZpbGVUeXBlT3JkZXJpbmdIYW5kbGUgb3JkZXJpbmdMaXN0SGFuZGxlKSIpfSwKKyAgICB7IkRhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgY3JlYXRvciwgQm9vbGVhbiBkZWxldGVFeGlzdGluZywgVUludDMyIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIHdoYXQsIHZvaWQgKiBpbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSFNldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0SWRsZU1hbmFnZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhEZWxldGVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRGVsZXRlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIU2V0TW92aWVVc2FnZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0TW92aWVVc2FnZUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhVc2VUZW1wb3JhcnlEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0VGVtcG9yYXJ5RGF0YVJlZkNhcGFiaWxpdGllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG91dFVuZGVyc3Rvb2RGbGFncykiKX0sCisgICAgeyJEYXRhSFJlbmFtZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhSZW5hbWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIG5ld0RhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIUGxheWJhY2tIaW50cyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFBsYXliYWNrSGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIG1pbkZpbGVPZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4RmlsZU9mZnNldCwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhQbGF5YmFja0hpbnRzNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQbGF5YmFja0hpbnRzNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCB3aWRlIG1pbkZpbGVPZmZzZXQsIHdpZGUgbWF4RmlsZU9mZnNldCwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAorICAgIHsiRGF0YUhTZXRUaW1lSGludHMiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRUaW1lSGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCBsb25nIGJhbmR3aWR0aFByaW9yaXR5LCBUaW1lU2NhbGUgc2NhbGUsIFRpbWVWYWx1ZSBtaW5UaW1lLCBUaW1lVmFsdWUgbWF4VGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRNYXhTcmNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWF4U3JjUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBtYXhTcmNSZWN0KSIpfSwKKyAgICB7IlZER2V0QWN0aXZlU3JjUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldEFjdGl2ZVNyY1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0ZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYWN0aXZlU3JjUmVjdCkiKX0sCisgICAgeyJWRFNldERpZ2l0aXplclJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXREaWdpdGl6ZXJSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGlnaXRpemVyUmVjdCkiKX0sCisgICAgeyJWREdldERpZ2l0aXplclJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXREaWdpdGl6ZXJSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGlnaXRpemVyUmVjdCkiKX0sCisgICAgeyJWREdldFZCbGFua1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRWQmxhbmtSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXRTdGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHZCbGFua1JlY3QpIil9LAorICAgIHsiVkRHZXRNYXNrUGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWFza1BpeE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFBpeE1hcEhhbmRsZSBtYXNrUGl4TWFwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFVzZVRoaXNDTFVUIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEVXNlVGhpc0NMVVQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBDVGFiSGFuZGxlIGNvbG9yVGFibGVIYW5kbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEU2V0SW5wdXRHYW1tYVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRHYW1tYVZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgRml4ZWQgY2hhbm5lbDEsIEZpeGVkIGNoYW5uZWwyLCBGaXhlZCBjaGFubmVsMykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRJbnB1dEdhbW1hVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dEdhbW1hVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgY2hhbm5lbDEsIEZpeGVkIGNoYW5uZWwyLCBGaXhlZCBjaGFubmVsMykiKX0sCisgICAgeyJWRFNldEJyaWdodG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRCcmlnaHRuZXNzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3MpIil9LAorICAgIHsiVkRHZXRCcmlnaHRuZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0QnJpZ2h0bmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzKSIpfSwKKyAgICB7IlZEU2V0Q29udHJhc3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDb250cmFzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBjb250cmFzdCkiKX0sCisgICAgeyJWRFNldEh1ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEh1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBodWUpIil9LAorICAgIHsiVkRTZXRTaGFycG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRTaGFycG5lc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzKSIpfSwKKyAgICB7IlZEU2V0U2F0dXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldFNhdHVyYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbikiKX0sCisgICAgeyJWREdldENvbnRyYXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q29udHJhc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgY29udHJhc3QpIil9LAorICAgIHsiVkRHZXRIdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRIdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgaHVlKSIpfSwKKyAgICB7IlZER2V0U2hhcnBuZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U2hhcnBuZXNzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzcykiKX0sCisgICAgeyJWREdldFNhdHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTYXR1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb24pIil9LAorICAgIHsiVkRHcmFiT25lRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHcmFiT25lRnJhbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldE1heEF1eEJ1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9WREdldE1heEF1eEJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaXhNYXBIYW5kbGUgcG0sIFJlY3QgcikiKX0sCisgICAgeyJWREdldEN1cnJlbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9WREdldEN1cnJlbnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGlucHV0Q3VycmVudEZsYWcsIGxvbmcgb3V0cHV0Q3VycmVudEZsYWcpIil9LAorICAgIHsiVkRTZXRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WRFNldEtleUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREdldEtleUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5kZXgpIil9LAorICAgIHsiVkRBZGRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREFkZEtleUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5kZXgpIil9LAorICAgIHsiVkRHZXROZXh0S2V5Q29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXROZXh0S2V5Q29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldEtleUNvbG9yUmFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRLZXlDb2xvclJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIG1pblJHQiwgUkdCQ29sb3IgbWF4UkdCKSIpfSwKKyAgICB7IlZER2V0S2V5Q29sb3JSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEtleUNvbG9yUmFuZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgbWluUkdCLCBSR0JDb2xvciBtYXhSR0IpIil9LAorICAgIHsiVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGNvbG9yU3BhY2VNb2RlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldElucHV0Q29sb3JTcGFjZU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGNvbG9yU3BhY2VNb2RlKSIpfSwKKyAgICB7IlZEU2V0Q2xpcFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q2xpcFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgY2xpcEVuYWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRDbGlwU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDbGlwU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgY2xpcEVuYWJsZSkiKX0sCisgICAgeyJWRFNldENsaXBSZ24iLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZWdpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEQ2xlYXJDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQ2xlYXJDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZWdpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0Q0xVVEluVXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q0xVVEluVXNlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZSkiKX0sCisgICAgeyJWRFNldFBMTEZpbHRlclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRQTExGaWx0ZXJUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgcGxsVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRQTExGaWx0ZXJUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0UExMRmlsdGVyVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBwbGxUeXBlKSIpfSwKKyAgICB7IlZER2V0TWFza2FuZFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWFza2FuZFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWFzaywgbG9uZyB2YWx1ZSkiKX0sCisgICAgeyJWRFNldE1hc3RlckJsZW5kTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRNYXN0ZXJCbGVuZExldmVsLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsZW5kTGV2ZWwpIil9LAorICAgIHsiVkRTZXRQbGF5VGhydU9uT2ZmIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UGxheVRocnVPbk9mZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IHN0YXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldEZpZWxkUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEZpZWxkUHJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGZpZWxkRmxhZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRGaWVsZFByZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRGaWVsZFByZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZmllbGRGbGFnKSIpfSwKKyAgICB7IlZEUHJlZmxpZ2h0R2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFByZWZsaWdodEdsb2JhbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBHcmFmUHRyIHRoZVdpbmRvdykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZ2xvYmFsUmVjdCkiKX0sCisgICAgeyJWRFNldFBsYXlUaHJ1R2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFNldFBsYXlUaHJ1R2xvYmFsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEdyYWZQdHIgdGhlV2luZG93KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBnbG9iYWxSZWN0KSIpfSwKKyAgICB7IlZEU2V0QmxhY2tMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0QmxhY2tMZXZlbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWwpIil9LAorICAgIHsiVkRHZXRCbGFja0xldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRCbGFja0xldmVsVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbCkiKX0sCisgICAgeyJWRFNldFdoaXRlTGV2ZWxWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFdoaXRlTGV2ZWxWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsKSIpfSwKKyAgICB7IlZER2V0V2hpdGVMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0V2hpdGVMZXZlbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWwpIil9LAorICAgIHsiVkRHZXRWaWRlb0RlZmF1bHRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0VmlkZW9EZWZhdWx0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsLCB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsLCB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzLCB1bnNpZ25lZCBzaG9ydCBodWUsIHVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb24sIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0LCB1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3MpIil9LAorICAgIHsiVkRHZXROdW1iZXJPZklucHV0cyIsIChQeUNGdW5jdGlvbilRdF9WREdldE51bWJlck9mSW5wdXRzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlucHV0cykiKX0sCisgICAgeyJWREdldElucHV0Rm9ybWF0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXRGb3JtYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGZvcm1hdCkiKX0sCisgICAgeyJWRFNldElucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlucHV0KSIpfSwKKyAgICB7IlZEU2V0SW5wdXRTdGFuZGFyZCIsIChQeUNGdW5jdGlvbilRdF9WRFNldElucHV0U3RhbmRhcmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0YW5kYXJkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldHVwQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFNldHVwQnVmZmVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFZkaWdCdWZmZXJSZWNMaXN0SGFuZGxlIGJ1ZmZlckxpc3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER3JhYk9uZUZyYW1lQXN5bmMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHcmFiT25lRnJhbWVBc3luYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkREb25lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZERG9uZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRDb21wcmVzc2lvbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldENvbXByZXNzaW9uLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgT1NUeXBlIGNvbXByZXNzVHlwZSwgc2hvcnQgZGVwdGgsIENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgbG9uZyBrZXlGcmFtZVJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCisgICAgeyJWRENvbXByZXNzT25lRnJhbWVBc3luYyIsIChQeUNGdW5jdGlvbilRdF9WRENvbXByZXNzT25lRnJhbWVBc3luYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0SW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WREdldEltYWdlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEUmVzZXRDb21wcmVzc1NlcXVlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEUmVzZXRDb21wcmVzc1NlcXVlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRDb21wcmVzc2lvbk9uT2ZmIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q29tcHJlc3Npb25Pbk9mZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEJvb2xlYW4gc3RhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0Q29tcHJlc3Npb25UeXBlcyIsIChQeUNGdW5jdGlvbilRdF9WREdldENvbXByZXNzaW9uVHlwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBWRENvbXByZXNzaW9uTGlzdEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBUaW1lQmFzZSB0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldEZyYW1lUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEZyYW1lUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEZpeGVkIGZyYW1lc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlsbGlTZWNQZXJGcmFtZSwgRml4ZWQgZnJhbWVzUGVyU2Vjb25kLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKKyAgICB7IlZER2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9WREdldFNvdW5kSW5wdXREcml2ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBTdHIyNTUgc291bmREcml2ZXJOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldERNQURlcHRocyIsIChQeUNGdW5jdGlvbilRdF9WREdldERNQURlcHRocywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRlcHRoQXJyYXksIGxvbmcgcHJlZmVycmVkRGVwdGgpIil9LAorICAgIHsiVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVNjYWxlIHByZWZlcnJlZCkiKX0sCisgICAgeyJWRFJlbGVhc2VBc3luY0J1ZmZlcnMiLCAoUHlDRnVuY3Rpb24pUXRfVkRSZWxlYXNlQXN5bmNCdWZmZXJzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRUaW1lQ29kZSIsIChQeUNGdW5jdGlvbilRdF9WREdldFRpbWVDb2RlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgdm9pZCAqIHRpbWVDb2RlRm9ybWF0LCB2b2lkICogdGltZUNvZGVUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVJlY29yZCBhdFRpbWUpIil9LAorICAgIHsiVkRVc2VTYWZlQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFVzZVNhZmVCdWZmZXJzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQm9vbGVhbiB1c2VTYWZlQnVmZmVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRTb3VuZElucHV0U291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U291bmRJbnB1dFNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgdmlkZW9JbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc291bmRJbnB1dCkiKX0sCisgICAgeyJWREdldENvbXByZXNzaW9uVGltZSIsIChQeUNGdW5jdGlvbilRdF9WREdldENvbXByZXNzaW9uVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIE9TVHlwZSBjb21wcmVzc2lvblR5cGUsIHNob3J0IGRlcHRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBzcmNSZWN0LCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lKSIpfSwKKyAgICB7IlZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFByZWZlcnJlZFBhY2tldFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9WRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9WREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHdpZHRoLCBsb25nIGhlaWdodCkiKX0sCisgICAgeyJWREdldElucHV0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgdmlkZW9JbnB1dCwgU3RyMjU1IG5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEU2V0RGVzdGluYXRpb25Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RGVzdGluYXRpb25Qb3J0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQ0dyYWZQdHIgZGVzdFBvcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0RGV2aWNlTmFtZUFuZEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RGV2aWNlTmFtZUFuZEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgU3RyMjU1IG91dE5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgb3V0TmFtZUZsYWdzKSIpfSwKKyAgICB7IlZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmciLCAoUHlDRnVuY3Rpb24pUXRfVkRDYXB0dXJlU3RhdGVDaGFuZ2luZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFVJbnQzMiBpblN0YXRlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBTdHJpbmdQdHIgZXJyRGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZXJyb3JMaW5lKSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkRWxlbWVudCIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEVsZW1lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBuYW1lU3BhY2VJRCwgbG9uZyBlbGVtZW50RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGVsZW1lbnROYW1lLCBVSW50MzIgZWxlbWVudElEKSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkQXR0cmlidXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkQXR0cmlidXRlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElELCBVSW50MzIgbmFtZVNwYWNlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGF0dHJpYnV0ZU5hbWUsIFVJbnQzMiBhdHRyaWJ1dGVJRCkiKX0sCisgICAgeyJYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIGVsZW1lbnRJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBuYW1lU3BhY2VJRHMsIGNoYXIgYXR0cmlidXRlTmFtZXMsIFVJbnQzMiBhdHRyaWJ1dGVJRHMpIil9LAorICAgIHsiWE1MUGFyc2VBZGRBdHRyaWJ1dGVBbmRWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElELCBVSW50MzIgbmFtZVNwYWNlSUQsIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQsIHZvaWQgKiBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBhdHRyaWJ1dGVOYW1lLCBVSW50MzIgYXR0cmlidXRlSUQpIil9LAorICAgIHsiWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQsIFVJbnQzMiBhdHRyaWJ1dGVJRCwgVUludDMyIGF0dHJpYnV0ZVZhbHVlS2luZCwgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkTmFtZVNwYWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkTmFtZVNwYWNlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBuYW1lU3BhY2VVUkwsIFVJbnQzMiBuYW1lU3BhY2VJRCkiKX0sCisgICAgeyJYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBvZmZzZXQsIFVJbnQzMiBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgbG9uZyByZWZjb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHSW5pdGlhbGl6ZSIsIChQeUNGdW5jdGlvbilRdF9TR0luaXRpYWxpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXREYXRhT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RGF0YU91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBGU1NwZWMgbW92aWVGaWxlLCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0RGF0YU91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgRlNTcGVjIG1vdmllRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgd2hlcmVGbGFncykiKX0sCisgICAgeyJTR1NldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9TR1NldEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBDR3JhZlB0ciBncCwgR0RIYW5kbGUgZ2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDR3JhZlB0ciBncCwgR0RIYW5kbGUgZ2QpIil9LAorICAgIHsiU0dOZXdDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHTmV3Q2hhbm5lbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBPU1R5cGUgY2hhbm5lbFR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgcmVmKSIpfSwKKyAgICB7IlNHRGlzcG9zZUNoYW5uZWwiLCAoUHlDRnVuY3Rpb24pUXRfU0dEaXNwb3NlQ2hhbm5lbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTdGFydFByZXZpZXciLCAoUHlDRnVuY3Rpb24pUXRfU0dTdGFydFByZXZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTdGFydFJlY29yZCIsIChQeUNGdW5jdGlvbilRdF9TR1N0YXJ0UmVjb3JkLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHSWRsZSIsIChQeUNGdW5jdGlvbilRdF9TR0lkbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTdG9wIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU3RvcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhdXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGF1c2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgQm9vbGVhbiBwYXVzZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQcmVwYXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUHJlcGFyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBCb29sZWFuIHByZXBhcmVGb3JQcmV2aWV3LCBCb29sZWFuIHByZXBhcmVGb3JSZWNvcmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUmVsZWFzZSIsIChQeUNGdW5jdGlvbilRdF9TR1JlbGVhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiU0dTZXRNYXhpbXVtUmVjb3JkVGltZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldE1heGltdW1SZWNvcmRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIHVuc2lnbmVkIGxvbmcgdGlja3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0TWF4aW11bVJlY29yZFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRNYXhpbXVtUmVjb3JkVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0aWNrcykiKX0sCisgICAgeyJTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBieXRlcykiKX0sCisgICAgeyJTR0dldFRpbWVSZW1haW5pbmciLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUaW1lUmVtYWluaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHRpY2tzTGVmdCkiKX0sCisgICAgeyJTR0dyYWJQaWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR3JhYlBpY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgUmVjdCBib3VuZHMsIHNob3J0IG9mZnNjcmVlbkRlcHRoLCBsb25nIGdyYWJQaWN0RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaWNIYW5kbGUgcCkiKX0sCisgICAgeyJTR0dldExhc3RNb3ZpZVJlc0lEIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TGFzdE1vdmllUmVzSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHJlc0lEKSIpfSwKKyAgICB7IlNHU2V0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBsb25nIHNnRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZ0ZsYWdzKSIpfSwKKyAgICB7IlNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBDb21wb25lbnQgc2dDaGFubmVsQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dDaGFubmVsIG5ld0NoYW5uZWwpIil9LAorICAgIHsiU0dTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFVzZXJEYXRhIHVkLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVzZXJEYXRhIHVkKSIpfSwKKyAgICB7IlNHR2V0SW5kQ2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0dldEluZENoYW5uZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgc2hvcnQgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgcmVmLCBPU1R5cGUgY2hhblR5cGUpIil9LAorICAgIHsiU0dVcGRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dVcGRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRQYXVzZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFBhdXNlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHBhdXNlZCkiKX0sCisgICAgeyJTR1NldENoYW5uZWxTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgVXNlckRhdGEgdWQsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVXNlckRhdGEgdWQpIil9LAorICAgIHsiU0dHZXRNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBwcmV2aWV3TW9kZSwgQm9vbGVhbiByZWNvcmRNb2RlKSIpfSwKKyAgICB7IlNHU2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9TR1NldERhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyB3aGVyZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIHdoZXJlRmxhZ3MpIil9LAorICAgIHsiU0dOZXdPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyB3aGVyZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dPdXRwdXQgc2dPdXQpIil9LAorICAgIHsiU0dEaXNwb3NlT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHRGlzcG9zZU91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRPdXRwdXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldE91dHB1dEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbE91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmciLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzcGFjZSkiKX0sCisgICAgeyJTR0hhbmRsZVVwZGF0ZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSGFuZGxlVXBkYXRlRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgRXZlbnRSZWNvcmQgZXZlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGhhbmRsZWQpIil9LAorICAgIHsiU0dTZXRPdXRwdXROZXh0T3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0TmV4dE91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgU0dPdXRwdXQgbmV4dE91dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRPdXRwdXROZXh0T3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0T3V0cHV0TmV4dE91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHT3V0cHV0IG5leHRPdXQpIil9LAorICAgIHsiU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0TWF4aW11bU9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgd2lkZSBtYXhPZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0T3V0cHV0TWF4aW11bU9mZnNldCIsIChQeUNGdW5jdGlvbilRdF9TR0dldE91dHB1dE1heGltdW1PZmZzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG1heE9mZnNldCkiKX0sCisgICAgeyJTR0dldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCisgICAgeyJTR1dyaXRlRXh0ZW5kZWRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBQdHIgcCwgbG9uZyBsZW4pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgU0dPdXRwdXQgc2dPdXQpIil9LAorICAgIHsiU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NCIsIChQeUNGdW5jdGlvbilRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIGJ5dGVzKSIpfSwKKyAgICB7IlNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBzcGFjZSkiKX0sCisgICAgeyJTR1dyaXRlTW92aWVEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHV3JpdGVNb3ZpZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7IlNHR2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZUJhc2UgdGIpIil9LAorICAgIHsiU0dBZGRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRNb3ZpZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbiwgbG9uZyBjaFJlZkNvbiwgVGltZVZhbHVlIHRpbWUsIHNob3J0IHdyaXRlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7IlNHQ2hhbmdlZFNvdXJjZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5nZWRTb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRFeHRlbmRlZE1vdmllRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuLCBsb25nIGNoUmVmQ29uLCBUaW1lVmFsdWUgdGltZSwgc2hvcnQgd3JpdGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIFNHT3V0cHV0IHdoaWNoT3V0cHV0KSIpfSwKKyAgICB7IlNHQWRkT3V0cHV0RGF0YVJlZlRvTWVkaWEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgTWVkaWEgdGhlTWVkaWEsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0U2V0dGluZ3NTdW1tYXJ5IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U2V0dGluZ3NTdW1tYXJ5LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEhhbmRsZSBzdW1tYXJ5VGV4dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRDaGFubmVsVXNhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsVXNhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHVzYWdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldENoYW5uZWxVc2FnZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxVc2FnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHVzYWdlKSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbEJvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCisgICAgeyJTR1NldENoYW5uZWxWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgdm9sdW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldENoYW5uZWxWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHZvbHVtZSkiKX0sCisgICAgeyJTR0dldENoYW5uZWxJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBjaGFubmVsSW5mbykiKX0sCisgICAgeyJTR1NldENoYW5uZWxQbGF5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsUGxheUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBwbGF5RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFBsYXlGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxQbGF5RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBwbGF5RmxhZ3MpIil9LAorICAgIHsiU0dTZXRDaGFubmVsTWF4RnJhbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbE1heEZyYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgZnJhbWVDb3VudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsTWF4RnJhbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbE1heEZyYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZyYW1lQ291bnQpIil9LAorICAgIHsiU0dTZXRDaGFubmVsUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldENoYW5uZWxDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBSZ25IYW5kbGUgdGhlQ2xpcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsQ2xpcCIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSB0aGVDbGlwKSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHNhbXBsZURlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbERldmljZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lU2NhbGUgc2NhbGUpIil9LAorICAgIHsiU0dDaGFubmVsUHV0UGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxQdXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKKyAgICB7IlNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG5hbWUsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cjI1NSBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIil9LAorICAgIHsiU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHNldHRpbmdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0NoYW5uZWxHZXRDb2RlY1NldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHNldHRpbmdzKSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVCYXNlIHRiKSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxSZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb24pIil9LAorICAgIHsiU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG91dERldmljZU5hbWUsIFN0cjI1NSBvdXRJbnB1dE5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBvdXRJbnB1dE51bWJlcikiKX0sCisgICAgeyJTR1NldENoYW5uZWxEZXZpY2VJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxEZXZpY2VJbnB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGluSW5wdXROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBVSW50MzIgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dJbml0Q2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0luaXRDaGFubmVsLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU2VxR3JhYkNvbXBvbmVudCBvd25lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dXcml0ZVNhbXBsZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZVNhbXBsZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBNb3ZpZSBtLCBBbGlhc0hhbmRsZSB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBieXRlc1BlclNlY29uZCkiKX0sCisgICAgeyJTR0FsaWduQ2hhbm5lbFJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dBbGlnbkNoYW5uZWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcikiKX0sCisgICAgeyJTR1BhbmVsR2V0RGl0bCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsR2V0RGl0bCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRpdGwpIil9LAorICAgIHsiU0dQYW5lbEdldFRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTdHIyNTUgdGl0bGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUGFuZWxDYW5SdW4iLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbENhblJ1biwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYW5lbEluc3RhbGwiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEluc3RhbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsRXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBEaWFsb2dQdHIgZCwgc2hvcnQgaXRlbU9mZnNldCwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpdGVtSGl0LCBCb29sZWFuIGhhbmRsZWQpIil9LAorICAgIHsiU0dQYW5lbEl0ZW0iLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0LCBzaG9ydCBpdGVtTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsUmVtb3ZlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxSZW1vdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsU2V0R3JhYmJlciIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0R3JhYmJlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTZXFHcmFiQ29tcG9uZW50IHNnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsU2V0UmVzRmlsZSIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0UmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBzaG9ydCByZXNSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUGFuZWxHZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsR2V0U2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVc2VyRGF0YSB1ZCkiKX0sCisgICAgeyJTR1BhbmVsU2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFNldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBVc2VyRGF0YSB1ZCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYW5lbFZhbGlkYXRlSW5wdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFZhbGlkYXRlSW5wdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gb2spIil9LAorICAgIHsiU0dQYW5lbEdldERJVExGb3JTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRESVRMRm9yU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRpdGwsIFBvaW50IHJlcXVlc3RlZFNpemUpIil9LAorICAgIHsiU0dHZXRTcmNWaWRlb0JvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNyY1ZpZGVvQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcikiKX0sCisgICAgeyJTR1NldFZpZGVvUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFJlY3QgcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRWaWRlb1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKKyAgICB7IlNHR2V0VmlkZW9Db21wcmVzc29yVHlwZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvQ29tcHJlc3NvclR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGNvbXByZXNzb3JUeXBlKSIpfSwKKyAgICB7IlNHU2V0VmlkZW9Db21wcmVzc29yVHlwZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvQ29tcHJlc3NvclR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBPU1R5cGUgY29tcHJlc3NvclR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0VmlkZW9Db21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9Db21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgZGVwdGgsIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvciwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRWaWRlb0NvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb0NvbXByZXNzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZGVwdGgsIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvciwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkiKX0sCisgICAgeyJTR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgX3J2KSIpfSwKKyAgICB7IlNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIENvbXBvbmVudEluc3RhbmNlIHZkaWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHcmFiRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiRnJhbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBidWZmZXJOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR3JhYkZyYW1lQ29tcGxldGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiRnJhbWVDb21wbGV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZG9uZSkiKX0sCisgICAgeyJTR0NvbXByZXNzRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDb21wcmVzc0ZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldENvbXByZXNzQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q29tcHJlc3NCdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBkZXB0aCwgUmVjdCBjb21wcmVzc1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q29tcHJlc3NCdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDb21wcmVzc0J1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBkZXB0aCwgUmVjdCBjb21wcmVzc1NpemUpIil9LAorICAgIHsiU0dHZXRCdWZmZXJJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0QnVmZmVySW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpeE1hcEhhbmRsZSBidWZmZXJQTSwgUmVjdCBidWZmZXJSZWN0LCBHV29ybGRQdHIgY29tcHJlc3NCdWZmZXIsIFJlY3QgY29tcHJlc3NCdWZmZXJSZWN0KSIpfSwKKyAgICB7IlNHU2V0VXNlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VXNlU2NyZWVuQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgQm9vbGVhbiB1c2VTY3JlZW5CdWZmZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0VXNlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VXNlU2NyZWVuQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyKSIpfSwKKyAgICB7IlNHU2V0RnJhbWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RnJhbWVSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgRml4ZWQgZnJhbWVSYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldEZyYW1lUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldEZyYW1lUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCBmcmFtZVJhdGUpIil9LAorICAgIHsiU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0UHJlZmVycmVkUGFja2V0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0UHJlZmVycmVkUGFja2V0U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFByZWZlcnJlZFBhY2tldFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykiKX0sCisgICAgeyJTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgY29tcHJlc3NvclR5cGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGNvbXByZXNzb3JUeXBlcykiKX0sCisgICAgeyJTR1NldFNvdW5kSW5wdXREcml2ZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTb3VuZElucHV0RHJpdmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IGRyaXZlck5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXREcml2ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9TR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBzZWNvbmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRSZWNvcmRDaHVua1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU0dTZXRTb3VuZElucHV0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kSW5wdXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRTb3VuZElucHV0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBzYW1wbGVTaXplLCBzaG9ydCBudW1DaGFubmVscywgT1NUeXBlIGNvbXByZXNzaW9uVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHNhbXBsZVNpemUsIHNob3J0IG51bUNoYW5uZWxzLCBPU1R5cGUgY29tcHJlc3Npb25UeXBlKSIpfSwKKyAgICB7IlNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEhhbmRsZSByYXRlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSByYXRlcykiKX0sCisgICAgeyJTR1NldEZvbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Rm9udE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHJpbmdQdHIgcHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRGb250U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldEZvbnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgZm9udFNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0VGV4dEZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRdF9TR1NldFRleHRGb3JlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgdGhlQ29sb3IpIil9LAorICAgIHsiU0dTZXRUZXh0QmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VGV4dEJhY2tDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciB0aGVDb2xvcikiKX0sCisgICAgeyJTR1NldEp1c3RpZmljYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRKdXN0aWZpY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQganVzdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCByZXR0b3NwYWNlKSIpfSwKKyAgICB7IlNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCByZXR0b3NwYWNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgU3RyMjU1IHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRCZWdpbiIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0QmVnaW4sIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRFbmQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEVuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgbG9uZyBkaXNwbGF5TW9kZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkaXNwbGF5TW9kZUlEKSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdXb3JsZFB0ciBndykiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0LCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudCkiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0Q2xvY2siLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldENsb2NrLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50SW5zdGFuY2UgY2xvY2spIil9LAorICAgIHsiUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgQ0dyYWZQdHIgZWNob1BvcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0SW5kSW1hZ2VEZWNvbXByZXNzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnQgY29kZWMpIil9LAorICAgIHsiUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0LCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBDR3JhZlB0ciBlY2hvUG9ydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFVJbnQzMiBmbGFncywgVUludDMyIGZsYWdzTWFzaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgZmxhZ3MpIil9LAorICAgIHsiTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNpemUgYWxsb3dhbmNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNpemUgYWxsb3dhbmNlKSIpfSwKKyAgICB7Ik1lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUlkbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFJZGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBmbGFnc0luLCBUaW1lUmVjb3JkIG1vdmllVGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3NPdXQpIil9LAorICAgIHsiTWVkaWFHZXRNZWRpYUluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRNZWRpYUluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhUHV0TWVkaWFJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHV0TWVkaWFJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldEFjdGl2ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEFjdGl2ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGVuYWJsZU1lZGlhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldFJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR0dldFN0YXR1cyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdHZXRTdGF0dXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudFJlc3VsdCBzdGF0dXNFcnIpIil9LAorICAgIHsiTWVkaWFUcmFja0VkaXRlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRyYWNrRWRpdGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0TWVkaWFUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lU2NhbGUgbmV3VGltZVNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0TW92aWVUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVNjYWxlIG5ld1RpbWVTY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ0dyYWZQdHIgYVBvcnQsIEdESGFuZGxlIGFHRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXREaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0RGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSB0aGVDbGlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFRyYWNrT3BhcXVlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VHJhY2tPcGFxdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdHJhY2tJc09wYXF1ZSkiKX0sCisgICAgeyJNZWRpYVNldEdyYXBoaWNzTW9kZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEdyYXBoaWNzTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIG1vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0R3JhcGhpY3NNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIil9LAorICAgIHsiTWVkaWFHU2V0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR1NldFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCB2b2x1bWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRCYWxhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGJhbGFuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0U291bmRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRCYWxhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBiYWxhbmNlKSIpfSwKKyAgICB7Ik1lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSB3aGVuKSIpfSwKKyAgICB7Ik1lZGlhR2V0U3JjUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U3JjUmduLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSByZ24sIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFQcmVyb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHJlcm9sbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUhhc0NoYXJhY3RlcmlzdGljLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIE9TVHlwZSBjaGFyYWN0ZXJpc3RpYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaGFzSXQpIil9LAorICAgIHsiTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBkZXB0aCwgQ1RhYkhhbmRsZSBjdGFiKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBib3VuZHMpIil9LAorICAgIHsiTWVkaWFTZXRIaW50cyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEhpbnRzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaGludHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU3RyMjU1IG5hbWUsIGxvbmcgcmVxdWVzdGVkTGFuZ3VhZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGFjdHVhbExhbmd1YWdlKSIpfSwKKyAgICB7Ik1lZGlhRm9yY2VVcGRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFGb3JjZVVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZvcmNlVXBkYXRlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0RHJhd2luZ1JnbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldERyYXdpbmdSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSBwYXJ0aWFsUmduKSIpfSwKKyAgICB7Ik1lZGlhR1NldEFjdGl2ZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHU2V0QWN0aXZlU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgYWN0aXZlU3RhcnQsIFRpbWVWYWx1ZSBhY3RpdmVEdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFJbnZhbGlkYXRlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSW52YWxpZGF0ZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBSZ25IYW5kbGUgaW52YWxSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0TmV4dFN0ZXBUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TmV4dFN0ZXBUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGZsYWdzLCBUaW1lVmFsdWUgbWVkaWFUaW1lSW4sIEZpeGVkIHJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbWVkaWFUaW1lT3V0KSIpfSwKKyAgICB7Ik1lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGlucHV0SW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBzYW1wbGVOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0VmlkZW9QYXJhbSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFZpZGVvUGFyYW0sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB3aGljaFBhcmFtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgdmFsdWUpIil9LAorICAgIHsiTWVkaWFHZXRWaWRlb1BhcmFtIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VmlkZW9QYXJhbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHdoaWNoUGFyYW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkiKX0sCisgICAgeyJNZWRpYUNvbXBhcmUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDb21wYXJlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIE1lZGlhIHNyY01lZGlhLCBDb21wb25lbnRJbnN0YW5jZSBzcmNNZWRpYUNvbXBvbmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaXNPSykiKX0sCisgICAgeyJNZWRpYUdldENsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0Q2xvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudEluc3RhbmNlIGNsb2NrKSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFNvdW5kT3V0cHV0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQpIil9LAorICAgIHsiTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0SW52YWxpZFJlZ2lvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEludmFsaWRSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIHJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkIyTiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGlucHV0SW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0VVJMTGluayIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFVSTExpbmssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUG9pbnQgZGlzcGxheVdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHVybExpbmspIil9LAorICAgIHsiTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHRhcmdldFJlZkNvbikiKX0sCisgICAgeyJNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgdGFyZ2V0UmVmQ29uLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdhc0hpdCkiKX0sCisgICAgeyJNZWRpYURpc3Bvc2VUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgdGFyZ2V0UmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVRhcmdldFJlZkNvbnNFcXVhbCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRhcmdldFJlZkNvbnNFcXVhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZpcnN0UmVmQ29uLCBsb25nIHNlY29uZFJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZXF1YWwpIil9LAorICAgIHsiTWVkaWFQcmVQcmVyb2xsQ2FuY2VsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHJlUHJlcm9sbENhbmNlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogcmVmY29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUVudGVyRW1wdHlFZGl0IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRW50ZXJFbXB0eUVkaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWxsaVNlY3MpIil9LAorICAgIHsiTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHZvbHVtZSkiKX0sCisgICAgeyJNZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVuYWJsZWQpIil9LAorICAgIHsiTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGVuYWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhbGFuY2UpIil9LAorICAgIHsiTWVkaWFTZXRTY3JlZW5Mb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U2NyZWVuTG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGxvY2tJdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRFcnJvclN0cmluZyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEVycm9yU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudFJlc3VsdCB0aGVFcnJvciwgU3RyMjU1IGVycm9yU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggYmFuZExldmVscykiKX0sCisgICAgeyJNZWRpYURvSWRsZUFjdGlvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFEb0lkbGVBY3Rpb25zLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGJhc3MsIHNob3J0IHRyZWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhc3MsIHNob3J0IHRyZWJsZSkiKX0sCisgICAgeyJNZWRpYVRpbWVCYXNlQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRpbWVCYXNlQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYU1DSXNQbGF5ZXJFdmVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYU1DSXNQbGF5ZXJFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBFdmVudFJlY29yZCBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBoYW5kbGVkSXQpIil9LAorICAgIHsiTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE1lZGlhTG9hZFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1lZGlhTG9hZFN0YXRlKSIpfSwKKyAgICB7Ik1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudEluc3RhbmNlIHZvdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhRW1wdHlTYW1wbGVDYWNoZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUVtcHR5U2FtcGxlQ2FjaGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBzYW1wbGVOdW0sIGxvbmcgc2FtcGxlQ291bnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0UHVibGljSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFB1YmxpY0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2l6ZSBpb0RhdGFTaXplKSIpfSwKKyAgICB7Ik1lZGlhU2V0UHVibGljSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFB1YmxpY0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyLCBTaXplIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVJlZkNvblNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUmVmQ29uU2V0UHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24sIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFSZWZDb25HZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVJlZkNvbkdldFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uLCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIG5hdmlnYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHJlZkNvbikiKX0sCisgICAgeyJNZWRpYUdHZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdHZXRJZGxlTWFuYWdlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSWRsZU1hbmFnZXIgcGltKSIpfSwKKyAgICB7Ik1lZGlhR1NldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR1NldElkbGVNYW5hZ2VyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVE1JRElHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfUVRNSURJR2V0TUlESVBvcnRzLCAxLAorICAgICBQeURvY19TVFIoIihRVE1JRElDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzLCBRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0cykiKX0sCisgICAgeyJRVE1JRElVc2VTZW5kUG9ydCIsIChQeUNGdW5jdGlvbilRdF9RVE1JRElVc2VTZW5kUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRNSURJQ29tcG9uZW50IGNpLCBsb25nIHBvcnRJbmRleCwgbG9uZyBpblVzZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRNSURJU2VuZE1JREkiLCAoUHlDRnVuY3Rpb24pUXRfUVRNSURJU2VuZE1JREksIDEsCisgICAgIFB5RG9jX1NUUigiKFFUTUlESUNvbXBvbmVudCBjaSwgbG9uZyBwb3J0SW5kZXgsIE11c2ljTUlESVBhY2tldCBtcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlkaUNoYW5uZWwsIGxvbmcgcG9seXBob255KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgbWlkaUNoYW5uZWwsIGxvbmcgcG9seXBob255KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgaW5zdHJ1bWVudE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1N0b3JlUGFydEluc3RydW1lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTdG9yZVBhcnRJbnN0cnVtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGluc3RydW1lbnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEF0b21pY0luc3RydW1lbnQgYWkpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBBdG9taWNJbnN0cnVtZW50UHRyIGFpUCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRLbm9iLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGtub2JJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRLbm9iLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGtub2JJRCwgbG9uZyBrbm9iVmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEtub2IsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGtub2JJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0S25vYiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYklELCBsb25nIGtub2JWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNQbGF5Tm90ZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1BsYXlOb3RlLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIHBpdGNoLCBsb25nIHZlbG9jaXR5KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1Jlc2V0UGFydCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1Jlc2V0UGFydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0Q29udHJvbGxlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRDb250cm9sbGVyLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBNdXNpY0NvbnRyb2xsZXIgY29udHJvbGxlck51bWJlciwgbG9uZyBjb250cm9sbGVyVmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0UGFydENvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0Q29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0SW5zdHJ1bWVudE5hbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0SW5zdHJ1bWVudE5hbWVzLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtb2RpZmlhYmxlSW5zdHJ1bWVudHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzLCBIYW5kbGUgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHMsIEhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lcykiKX0sCisgICAgeyJNdXNpY0dldERydW1OYW1lcyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldERydW1OYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGluc3RydW1lbnROdW1iZXJzLCBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzKSIpfSwKKyAgICB7Ik11c2ljR2V0TWFzdGVyVHVuZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldE1hc3RlclR1bmUsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1NldE1hc3RlclR1bmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRNYXN0ZXJUdW5lLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtYXN0ZXJUdW5lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldERldmljZUNvbm5lY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaWQxLCBsb25nIGlkMikiKX0sCisgICAgeyJNdXNpY1VzZURldmljZUNvbm5lY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBpZDEsIGxvbmcgaWQyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldEtub2JTZXR0aW5nU3RyaW5ncyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEtub2JTZXR0aW5nU3RyaW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYkluZGV4LCBsb25nIGlzR2xvYmFsKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHNldHRpbmdzTmFtZXMsIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TGFzdHMsIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TmFtZXMpIil9LAorICAgIHsiTXVzaWNHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRNSURJUG9ydHMsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbnB1dFBvcnRDb3VudCwgbG9uZyBvdXRwdXRQb3J0Q291bnQpIil9LAorICAgIHsiTXVzaWNTZW5kTUlESSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NlbmRNSURJLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwb3J0SW5kZXgsIE11c2ljTUlESVBhY2tldCBtcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRPZmZsaW5lVGltZVRvIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0T2ZmbGluZVRpbWVUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbmV3VGltZVN0YW1wKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldEluZm9UZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0SW5mb1RleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHNlbGVjdG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRleHRILCBIYW5kbGUgc3R5bGVIKSIpfSwKKyAgICB7Ik11c2ljR2V0SW5zdHJ1bWVudEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRJbnN0cnVtZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgZ2V0SW5zdHJ1bWVudEluZm9GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEluc3RydW1lbnRJbmZvTGlzdEhhbmRsZSBpbmZvTGlzdEgpIil9LAorICAgIHsiTXVzaWNUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljVGFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGluc3RydW1lbnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBIYW5kbGUgZGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZW5lcmljQ29uZmlndXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY0NvbmZpZ3VyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbW9kZSwgbG9uZyBmbGFncywgbG9uZyBiYXNlUmVzSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2VuZXJpY0dldEtub2JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY0dldEtub2JMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdlbmVyaWNLbm9iRGVzY3JpcHRpb25MaXN0SGFuZGxlIGdrZGxIKSIpfSwKKyAgICB7Ik11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dlbmVyaWNTZXRSZXNvdXJjZU51bWJlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBIYW5kbGUgcmVzb3VyY2VJREgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljRGVyaXZlZE1JRElTZW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljRGVyaXZlZE1JRElTZW5kLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgTXVzaWNNSURJUGFja2V0IHBhY2tldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgc2hvcnQgcmVzUmVmTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJOQVVucmVnaXN0ZXJNdXNpY0RldmljZSIsIChQeUNGdW5jdGlvbilRdF9OQVVucmVnaXN0ZXJNdXNpY0RldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X05BU2F2ZU11c2ljQ29uZmlndXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTkFHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfTkFHZXRNSURJUG9ydHMsIDEsCisgICAgIFB5RG9jX1NUUigiKE5vdGVBbGxvY2F0b3IgbmEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzLCBRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0cykiKX0sCisgICAgeyJOQVRhc2siLCAoUHlDRnVuY3Rpb24pUXRfTkFUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRIZWFkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgKiBoZWFkZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVHZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lQmFzZSB0YikiKX0sCisgICAgeyJUdW5lU2V0VGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIFRpbWVTY2FsZSBzY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHVuZUdldFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0VGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVNjYWxlIHNjYWxlKSIpfSwKKyAgICB7IlR1bmVJbnN0YW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVJbnN0YW50LCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHR1bmVQb3NpdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgdHVuZSkiKX0sCisgICAgeyJUdW5lU3RvcCIsIChQeUNGdW5jdGlvbilRdF9UdW5lU3RvcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgbG9uZyBzdG9wRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgRml4ZWQgdm9sdW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lR2V0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVQcmVyb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVQcmVyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lVW5yb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVVbnJvbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRQYXJ0VHJhbnNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRQYXJ0VHJhbnNwb3NlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnQsIGxvbmcgdHJhbnNwb3NlLCBsb25nIHZlbG9jaXR5U2hpZnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVHZXROb3RlQWxsb2NhdG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXROb3RlQWxsb2NhdG9yLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoTm90ZUFsbG9jYXRvciBfcnYpIil9LAorICAgIHsiVHVuZVNldFNvZnRlciIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0U29mdGVyLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIHNvZnRlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHVuZVRhc2siLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVRhc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRCYWxhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIGJhbGFuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRTb3VuZExvY2FsaXphdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0U291bmRMb2NhbGl6YXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIEhhbmRsZSBkYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0SGVhZGVyV2l0aFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldEhlYWRlcldpdGhTaXplLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nICogaGVhZGVyLCB1bnNpZ25lZCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRQYXJ0TWl4IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRQYXJ0TWl4LCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXIsIGxvbmcgdm9sdW1lLCBsb25nIGJhbGFuY2UsIGxvbmcgbWl4RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVHZXRQYXJ0TWl4IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRQYXJ0TWl4LCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHZvbHVtZU91dCwgbG9uZyBiYWxhbmNlT3V0LCBsb25nIG1peEZsYWdzT3V0KSIpfSwKKyAgICB7IkFsaWduV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVF0X0FsaWduV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd3AsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCisgICAgeyJEcmFnQWxpZ25lZFdpbmRvdyIsIChQeUNGdW5jdGlvbilRdF9EcmFnQWxpZ25lZFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdwLCBQb2ludCBzdGFydFB0LCBSZWN0IGJvdW5kc1JlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJNb3ZpZXNUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllc1Rhc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbWF4TWlsbGlTZWNUb1VzZSkgLT4gTm9uZSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0yODAwMCw5MCArMjgwMDAsOTAgQEAKIAogdm9pZCBpbml0X1F0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhUcmFjaywgVHJhY2tPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUcmFjaywgVHJhY2tPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZSwgTW92aWVPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNb3ZpZSwgTW92aWVPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTW92aWVDb250cm9sbGVyLCBNb3ZpZUN0bE9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFVzZXJEYXRhLCBVc2VyRGF0YU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFVzZXJEYXRhLCBVc2VyRGF0YU9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lZGlhLCBNZWRpYU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1lZGlhLCBNZWRpYU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVHJhY2ssIFRyYWNrT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUcmFjaywgVHJhY2tPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1vdmllLCBNb3ZpZU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTW92aWUsIE1vdmllT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhUaW1lQmFzZSwgVGltZUJhc2VPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVXNlckRhdGEsIFVzZXJEYXRhT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChVc2VyRGF0YSwgVXNlckRhdGFPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lZGlhLCBNZWRpYU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTWVkaWEsIE1lZGlhT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfUXQiLCBRdF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1F0IiwgUXRfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JUXRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChRdF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFF0X0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JSWRsZU1hbmFnZXJfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJklkbGVNYW5hZ2VyX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmSWRsZU1hbmFnZXJfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJZGxlTWFuYWdlciIsIChQeU9iamVjdCAqKSZJZGxlTWFuYWdlcl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJklkbGVNYW5hZ2VyX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSWRsZU1hbmFnZXJUeXBlIiwgKFB5T2JqZWN0ICopJklkbGVNYW5hZ2VyX1R5cGUpOwotCU1vdmllQ29udHJvbGxlcl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmTW92aWVDb250cm9sbGVyX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTW92aWVDb250cm9sbGVyX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTW92aWVDb250cm9sbGVyIiwgKFB5T2JqZWN0ICopJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllQ29udHJvbGxlclR5cGUiLCAoUHlPYmplY3QgKikmTW92aWVDb250cm9sbGVyX1R5cGUpOwotCVRpbWVCYXNlX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUaW1lQmFzZV9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlRpbWVCYXNlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVGltZUJhc2UiLCAoUHlPYmplY3QgKikmVGltZUJhc2VfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZUaW1lQmFzZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRpbWVCYXNlVHlwZSIsIChQeU9iamVjdCAqKSZUaW1lQmFzZV9UeXBlKTsKLQlVc2VyRGF0YV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVXNlckRhdGFfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZVc2VyRGF0YV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVzZXJEYXRhIiwgKFB5T2JqZWN0ICopJlVzZXJEYXRhX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVXNlckRhdGFfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVc2VyRGF0YVR5cGUiLCAoUHlPYmplY3QgKikmVXNlckRhdGFfVHlwZSk7Ci0JTWVkaWFfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJk1lZGlhX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTWVkaWFfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZWRpYSIsIChQeU9iamVjdCAqKSZNZWRpYV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk1lZGlhX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVkaWFUeXBlIiwgKFB5T2JqZWN0ICopJk1lZGlhX1R5cGUpOwotCVRyYWNrX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUcmFja19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlRyYWNrX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVHJhY2siLCAoUHlPYmplY3QgKikmVHJhY2tfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZUcmFja19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRyYWNrVHlwZSIsIChQeU9iamVjdCAqKSZUcmFja19UeXBlKTsKLQlNb3ZpZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmTW92aWVfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZNb3ZpZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllIiwgKFB5T2JqZWN0ICopJk1vdmllX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmTW92aWVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZVR5cGUiLCAoUHlPYmplY3QgKikmTW92aWVfVHlwZSk7Ci0JU0dPdXRwdXRfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlNHT3V0cHV0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmU0dPdXRwdXRfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTR091dHB1dCIsIChQeU9iamVjdCAqKSZTR091dHB1dF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlNHT3V0cHV0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0dPdXRwdXRUeXBlIiwgKFB5T2JqZWN0ICopJlNHT3V0cHV0X1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFF0X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoUXRfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBRdF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIElkbGVNYW5hZ2VyX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZJZGxlTWFuYWdlcl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJklkbGVNYW5hZ2VyX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiSWRsZU1hbmFnZXIiLCAoUHlPYmplY3QgKikmSWRsZU1hbmFnZXJfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZJZGxlTWFuYWdlcl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIklkbGVNYW5hZ2VyVHlwZSIsIChQeU9iamVjdCAqKSZJZGxlTWFuYWdlcl9UeXBlKTsKKyAgICBNb3ZpZUNvbnRyb2xsZXJfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk1vdmllQ29udHJvbGxlcl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllQ29udHJvbGxlciIsIChQeU9iamVjdCAqKSZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZUNvbnRyb2xsZXJUeXBlIiwgKFB5T2JqZWN0ICopJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKKyAgICBUaW1lQmFzZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVGltZUJhc2VfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZUaW1lQmFzZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRpbWVCYXNlIiwgKFB5T2JqZWN0ICopJlRpbWVCYXNlX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmVGltZUJhc2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaW1lQmFzZVR5cGUiLCAoUHlPYmplY3QgKikmVGltZUJhc2VfVHlwZSk7CisgICAgVXNlckRhdGFfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlVzZXJEYXRhX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVXNlckRhdGFfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVc2VyRGF0YSIsIChQeU9iamVjdCAqKSZVc2VyRGF0YV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlVzZXJEYXRhX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVXNlckRhdGFUeXBlIiwgKFB5T2JqZWN0ICopJlVzZXJEYXRhX1R5cGUpOworICAgIE1lZGlhX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZNZWRpYV9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJk1lZGlhX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVkaWEiLCAoUHlPYmplY3QgKikmTWVkaWFfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZNZWRpYV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lZGlhVHlwZSIsIChQeU9iamVjdCAqKSZNZWRpYV9UeXBlKTsKKyAgICBUcmFja19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVHJhY2tfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZUcmFja19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRyYWNrIiwgKFB5T2JqZWN0ICopJlRyYWNrX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmVHJhY2tfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUcmFja1R5cGUiLCAoUHlPYmplY3QgKikmVHJhY2tfVHlwZSk7CisgICAgTW92aWVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk1vdmllX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmTW92aWVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZSIsIChQeU9iamVjdCAqKSZNb3ZpZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJk1vdmllX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTW92aWVUeXBlIiwgKFB5T2JqZWN0ICopJk1vdmllX1R5cGUpOworICAgIFNHT3V0cHV0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTR091dHB1dF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJlNHT3V0cHV0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0dPdXRwdXQiLCAoUHlPYmplY3QgKikmU0dPdXRwdXRfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZTR091dHB1dF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNHT3V0cHV0VHlwZSIsIChQeU9iamVjdCAqKSZTR091dHB1dF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9yZXMvX1Jlc21vZHVsZS5jIGIvTWFjL01vZHVsZXMvcmVzL19SZXNtb2R1bGUuYwppbmRleCA4OWZkMDJjLi5mNTgyNGIxIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9yZXMvX1Jlc21vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3Jlcy9fUmVzbW9kdWxlLmMKQEAgLTgsOSArOCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zMSw3ICszMSw3IEBACiBzdGF0aWMgdm9pZAogUHlNYWNfQXV0b0Rpc3Bvc2VIYW5kbGUoSGFuZGxlIGgpCiB7Ci0gICAgICAgIERpc3Bvc2VIYW5kbGUoaCk7CisgICAgRGlzcG9zZUhhbmRsZShoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRXJyb3I7CkBAIC00Myw1MzEgKzQzLDUzMSBAQAogI2RlZmluZSBSZXNPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmUmVzb3VyY2VfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmUmVzb3VyY2VfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFJlc291cmNlT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JSGFuZGxlIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShIYW5kbGUgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgSGFuZGxlIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShIYW5kbGUgcHRyKTsKIH0gUmVzb3VyY2VPYmplY3Q7CiAKIFB5T2JqZWN0ICpSZXNPYmpfTmV3KEhhbmRsZSBpdHNlbGYpCiB7Ci0JUmVzb3VyY2VPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhSZXNvdXJjZU9iamVjdCwgJlJlc291cmNlX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBOVUxMOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBSZXNvdXJjZU9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKFJlc291cmNlT2JqZWN0LCAmUmVzb3VyY2VfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgUmVzT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFSZXNPYmpfQ2hlY2sodikpCi0JewotCQlQeU9iamVjdCAqdG1wOwotCQlpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICkKLQkJewotCQkJKnBfaXRzZWxmID0gKChSZXNvdXJjZU9iamVjdCAqKXRtcCktPm9iX2l0c2VsZjsKLQkJCVB5X0RFQ1JFRih0bXApOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JaWYgKCFSZXNPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiUmVzb3VyY2UgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghUmVzT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKnRtcDsKKyAgICAgICAgaWYgKCAodG1wPVB5T2JqZWN0X0NhbGxNZXRob2QodiwgImFzX1Jlc291cmNlIiwgIiIpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil0bXApLT5vYl9pdHNlbGY7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmICghUmVzT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgUmVzT2JqX2RlYWxsb2MoUmVzb3VyY2VPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsKLQl9Ci0Jc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7CisgICAgfQorICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfSG9tZVJlc0ZpbGUoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBIb21lUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEhvbWVSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIb21lUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSG9tZVJlc0ZpbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhvbWVSZXNGaWxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9NYWNMb2FkUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgTWFjTG9hZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWFjTG9hZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNMb2FkUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU1hY0xvYWRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0xvYWRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1JlbGVhc2VSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBSZWxlYXNlUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhSZWxlYXNlUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbGVhc2VSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVsZWFzZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUmVsZWFzZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfRGV0YWNoUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGV0YWNoUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhEZXRhY2hSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGV0YWNoUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURldGFjaFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGV0YWNoUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9HZXRSZXNBdHRycyhSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFJlc0F0dHJzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVzQXR0cnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc0F0dHJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRSZXNBdHRycyhfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UmVzQXR0cnMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0dldFJlc0luZm8oUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHRoZUlEOwotCVJlc1R5cGUgdGhlVHlwZTsKLQlTdHIyNTUgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdGhlSUQ7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBHZXRSZXNJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVzSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UmVzSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UmVzSW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgJnRoZUlELAotCSAgICAgICAgICAgJnRoZVR5cGUsCi0JICAgICAgICAgICBuYW1lKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUlELAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UmVzSW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgJnRoZUlELAorICAgICAgICAgICAgICAgJnRoZVR5cGUsCisgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfU2V0UmVzSW5mbyhSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgdGhlSUQ7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHRoZUlEOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBTZXRSZXNJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UmVzSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFJlc0luZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIHRoZUlELAotCSAgICAgICAgICAgbmFtZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzSW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgdGhlSUQsCisgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0FkZFJlc291cmNlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgdGhlSUQ7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCB0aGVJRDsKKyAgICBTdHIyNTUgbmFtZTsKICNpZm5kZWYgQWRkUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhBZGRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUFkZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICB0aGVJRCwKLQkgICAgICAgICAgICBuYW1lKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFkZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICB0aGVJRCwKKyAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0dldFJlc291cmNlU2l6ZU9uRGlzayhSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRSZXNvdXJjZVNpemVPbkRpc2sKLQlQeU1hY19QUkVDSEVDSyhHZXRSZXNvdXJjZVNpemVPbkRpc2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc291cmNlU2l6ZU9uRGlzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UmVzb3VyY2VTaXplT25EaXNrKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRSZXNvdXJjZVNpemVPbkRpc2soX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0dldE1heFJlc291cmNlU2l6ZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNYXhSZXNvdXJjZVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNYXhSZXNvdXJjZVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1heFJlc291cmNlU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWF4UmVzb3VyY2VTaXplKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNYXhSZXNvdXJjZVNpemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1NldFJlc0F0dHJzKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBhdHRyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgYXR0cnM7CiAjaWZuZGVmIFNldFJlc0F0dHJzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzQXR0cnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJlc0F0dHJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cnMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZXNBdHRycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIGF0dHJzKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFJlc0F0dHJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgYXR0cnMpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfQ2hhbmdlZFJlc291cmNlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENoYW5nZWRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKENoYW5nZWRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlZFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDaGFuZ2VkUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDaGFuZ2VkUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9SZW1vdmVSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBSZW1vdmVSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVtb3ZlUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZW1vdmVSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1dyaXRlUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgV3JpdGVSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFdyaXRlUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFdyaXRlUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVdyaXRlUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBXcml0ZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfU2V0UmVzb3VyY2VTaXplKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG5ld1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbmV3U2l6ZTsKICNpZm5kZWYgU2V0UmVzb3VyY2VTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzb3VyY2VTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNvdXJjZVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVzb3VyY2VTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIG5ld1NpemUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRSZXNvdXJjZVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbmV3U2l6ZSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9HZXROZXh0Rk9ORChSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TmV4dEZPTkQKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0Rk9ORCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dEZPTkQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHRGT05EKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dEZPTkQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9hc19Db250cm9sKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlfcmVzID0gQ3RsT2JqX05ldygoQ29udHJvbEhhbmRsZSlfc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBfcmVzID0gQ3RsT2JqX05ldygoQ29udHJvbEhhbmRsZSlfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9hc19NZW51KFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlfcmVzID0gTWVudU9ial9OZXcoKE1lbnVIYW5kbGUpX3NlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IE1lbnVPYmpfTmV3KChNZW51SGFuZGxlKV9zZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0xvYWRSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBMb2FkUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhMb2FkUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKExvYWRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTG9hZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTG9hZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfQXV0b0Rpc3Bvc2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWludCBvbm9mZiwgb2xkID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJm9ub2ZmKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWlmICggX3NlbGYtPm9iX2ZyZWVpdCApCi0JICAgICAgICBvbGQgPSAxOwotCWlmICggb25vZmYgKQotCSAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlSGFuZGxlOwotCWVsc2UKLQkgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBOVUxMOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgb2xkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpbnQgb25vZmYsIG9sZCA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZvbm9mZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggX3NlbGYtPm9iX2ZyZWVpdCApCisgICAgICAgIG9sZCA9IDE7CisgICAgaWYgKCBvbm9mZiApCisgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsKKyAgICBlbHNlCisgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBOVUxMOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgb2xkKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgUmVzT2JqX21ldGhvZHNbXSA9IHsKLQl7IkhvbWVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9Ib21lUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7Ik1hY0xvYWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfTWFjTG9hZFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSZWxlYXNlUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1JlbGVhc2VSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRGV0YWNoUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0RldGFjaFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRSZXNBdHRycyIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzQXR0cnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRSZXNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXRSZXNJbmZvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCB0aGVJRCwgUmVzVHlwZSB0aGVUeXBlLCBTdHIyNTUgbmFtZSkiKX0sCi0JeyJTZXRSZXNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9TZXRSZXNJbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB0aGVJRCwgU3RyMjU1IG5hbWUpIC0+IE5vbmUiKX0sCi0JeyJBZGRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfQWRkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgdGhlSUQsIFN0cjI1NSBuYW1lKSAtPiBOb25lIil9LAotCXsiR2V0UmVzb3VyY2VTaXplT25EaXNrIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXRSZXNvdXJjZVNpemVPbkRpc2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1heFJlc291cmNlU2l6ZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0TWF4UmVzb3VyY2VTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRSZXNBdHRycyIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzQXR0cnMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGF0dHJzKSAtPiBOb25lIil9LAotCXsiQ2hhbmdlZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9DaGFuZ2VkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9SZW1vdmVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiV3JpdGVSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfV3JpdGVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0UmVzb3VyY2VTaXplIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9TZXRSZXNvdXJjZVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbmV3U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IkdldE5leHRGT05EIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXROZXh0Rk9ORCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJIb21lUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfSG9tZVJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJNYWNMb2FkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX01hY0xvYWRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVsZWFzZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9SZWxlYXNlUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRldGFjaFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9EZXRhY2hSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0UmVzQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldFJlc0F0dHJzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0UmVzSW5mbyIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgdGhlSUQsIFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIil9LAorICAgIHsiU2V0UmVzSW5mbyIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdGhlSUQsIFN0cjI1NSBuYW1lKSAtPiBOb25lIil9LAorICAgIHsiQWRkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0FkZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IHRoZUlELCBTdHIyNTUgbmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFJlc291cmNlU2l6ZU9uRGlzayIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzb3VyY2VTaXplT25EaXNrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNYXhSZXNvdXJjZVNpemUiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldE1heFJlc291cmNlU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0UmVzQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1NldFJlc0F0dHJzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBhdHRycykgLT4gTm9uZSIpfSwKKyAgICB7IkNoYW5nZWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfQ2hhbmdlZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfUmVtb3ZlUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IldyaXRlUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1dyaXRlUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFJlc291cmNlU2l6ZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzb3VyY2VTaXplLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG5ld1NpemUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXROZXh0Rk9ORCIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0TmV4dEZPTkQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiYXNfQ29udHJvbCIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBDb250cm9sIil9LAotCXsiYXNfTWVudSIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfTWVudSwgMSwKLQkgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBNZW51Iil9LAorICAgIHsiYXNfQ29udHJvbCIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBDb250cm9sIil9LAorICAgIHsiYXNfTWVudSIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBNZW51Iil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXsiTG9hZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9Mb2FkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9BdXRvRGlzcG9zZSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IERpc3Bvc2VIYW5kbGUgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJMb2FkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0xvYWRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQXV0b0Rpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0F1dG9EaXNwb3NlLCAxLAorICAgICBQeURvY19TVFIoIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgRGlzcG9zZUhhbmRsZSB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX2dldF9kYXRhKFJlc291cmNlT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewogCi0JICAgICAgICAgICAgUHlPYmplY3QgKnJlczsKLQkgICAgICAgICAgICBjaGFyIHN0YXRlOworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICAgICAgICAgICAgICBjaGFyIHN0YXRlOwogCi0JICAgICAgICAgICAgc3RhdGUgPSBIR2V0U3RhdGUoc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCSAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCSAgICAgICAgICAgICAgICAgICAgKnNlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIEdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7Ci0JICAgICAgICAgICAgSFVubG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCSAgICAgICAgICAgIEhTZXRTdGF0ZShzZWxmLT5vYl9pdHNlbGYsIHN0YXRlKTsKLQkgICAgICAgICAgICByZXR1cm4gcmVzOwotCSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEhHZXRTdGF0ZShzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgICAgICAgICAgICAgICAgIEhVbmxvY2soc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgSFNldFN0YXRlKHNlbGYtPm9iX2l0c2VsZiwgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworCiB9CiAKIHN0YXRpYyBpbnQgUmVzT2JqX3NldF9kYXRhKFJlc291cmNlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKIAotCSAgICAgICAgICAgIGNoYXIgKmRhdGE7Ci0JICAgICAgICAgICAgbG9uZyBzaXplOworICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhOworICAgICAgICAgICAgICAgICAgICBsb25nIHNpemU7CiAKLQkgICAgICAgICAgICBpZiAoIHYgPT0gTlVMTCApCi0JICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JICAgICAgICAgICAgaWYgKCAhUHlTdHJpbmdfQ2hlY2sodikgKQotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCSAgICAgICAgICAgIHNpemUgPSBQeVN0cmluZ19TaXplKHYpOwotCSAgICAgICAgICAgIGRhdGEgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQkgICAgICAgICAgICAvKiBYWFhYIERvIEkgbmVlZCB0aGUgR2V0U3RhdGUvU2V0U3RhdGUgY2FsbHM/ICovCi0JICAgICAgICAgICAgU2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYsIHNpemUpOwotCSAgICAgICAgICAgIGlmICggTWVtRXJyb3IoKSkKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQkgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCSAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSpzZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUpOwotCSAgICAgICAgICAgIEhVbmxvY2soc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICAvKiBYWFhYIFNob3VsZCBJIGRvIHRoZSBDaGFuZ2VkIGNhbGwgaW1tZWRlYXRlbHk/ICovCi0JICAgICAgICAgICAgcmV0dXJuIDA7Ci0JICAgICAgICAgICAgCi0JcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIGlmICggdiA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggIVB5U3RyaW5nX0NoZWNrKHYpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBQeVN0cmluZ19TaXplKHYpOworICAgICAgICAgICAgICAgICAgICBkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgICAgICAgICAgICAgICAgIC8qIFhYWFggRG8gSSBuZWVkIHRoZSBHZXRTdGF0ZS9TZXRTdGF0ZSBjYWxscz8gKi8KKyAgICAgICAgICAgIFNldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmLCBzaXplKTsKKyAgICAgICAgICAgIGlmICggTWVtRXJyb3IoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopKnNlbGYtPm9iX2l0c2VsZiwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBIVW5sb2NrKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICAvKiBYWFhYIFNob3VsZCBJIGRvIHRoZSBDaGFuZ2VkIGNhbGwgaW1tZWRlYXRlbHk/ICovCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9nZXRfc2l6ZShSZXNvdXJjZU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoR2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoR2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYpKTsKIH0KIAogI2RlZmluZSBSZXNPYmpfc2V0X3NpemUgTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgUmVzT2JqX2dldHNldGxpc3RbXSA9IHsKLQl7ImRhdGEiLCAoZ2V0dGVyKVJlc09ial9nZXRfZGF0YSwgKHNldHRlcilSZXNPYmpfc2V0X2RhdGEsICJUaGUgcmVzb3VyY2UgZGF0YSJ9LAotCXsic2l6ZSIsIChnZXR0ZXIpUmVzT2JqX2dldF9zaXplLCAoc2V0dGVyKVJlc09ial9zZXRfc2l6ZSwgIlRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIGRhdGEifSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJkYXRhIiwgKGdldHRlcilSZXNPYmpfZ2V0X2RhdGEsIChzZXR0ZXIpUmVzT2JqX3NldF9kYXRhLCAiVGhlIHJlc291cmNlIGRhdGEifSwKKyAgICB7InNpemUiLCAoZ2V0dGVyKVJlc09ial9nZXRfc2l6ZSwgKHNldHRlcilSZXNPYmpfc2V0X3NpemUsICJUaGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBkYXRhIn0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC01NzgsODkgKzU3OCw4OSBAQAogI2RlZmluZSBSZXNPYmpfaGFzaCBOVUxMCiBzdGF0aWMgaW50IFJlc09ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JY2hhciAqc3JjZGF0YSA9IE5VTEw7Ci0JaW50IHNyY2xlbiA9IDA7Ci0JSGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBjaGFyICpzcmNkYXRhID0gTlVMTDsKKyAgICBpbnQgc3JjbGVuID0gMDsKKyAgICBIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBSZXNPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKFJlc291cmNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlQeUVycl9DbGVhcigpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxzIyIsIGt3LCAmc3JjZGF0YSwgJnNyY2xlbikpIHJldHVybiAtMTsKLQlpZiAoKGl0c2VsZiA9IE5ld0hhbmRsZShzcmNsZW4pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSgoUmVzb3VyY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpZiAoc3JjbGVuICYmIHNyY2RhdGEpCi0JewotCQlITG9jayhpdHNlbGYpOwotCQltZW1jcHkoKml0c2VsZiwgc3JjZGF0YSwgc3JjbGVuKTsKLQkJSFVubG9jayhpdHNlbGYpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFJlc09ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoUmVzb3VyY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifHMjIiwga3csICZzcmNkYXRhLCAmc3JjbGVuKSkgcmV0dXJuIC0xOworICAgIGlmICgoaXRzZWxmID0gTmV3SGFuZGxlKHNyY2xlbikpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKChSZXNvdXJjZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGlmIChzcmNsZW4gJiYgc3JjZGF0YSkKKyAgICB7CisgICAgICAgIEhMb2NrKGl0c2VsZik7CisgICAgICAgIG1lbWNweSgqaXRzZWxmLCBzcmNkYXRhLCBzcmNsZW4pOworICAgICAgICBIVW5sb2NrKGl0c2VsZik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIFJlc09ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFJlc291cmNlT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChSZXNvdXJjZU9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBOVUxMOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFJlc291cmNlT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChSZXNvdXJjZU9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBOVUxMOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIFJlc09ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBSZXNvdXJjZV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9SZXMuUmVzb3VyY2UiLCAvKnRwX25hbWUqLwotCXNpemVvZihSZXNvdXJjZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFJlc09ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBSZXNPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFJlc09ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgUmVzT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVJlc09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlSZXNPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JUmVzT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlSZXNPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JUmVzT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JUmVzT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUmVzLlJlc291cmNlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUmVzb3VyY2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBSZXNPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgUmVzT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBSZXNPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFJlc09ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBSZXNPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgUmVzT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFJlc09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgUmVzT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFJlc09ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFJlc09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgUmVzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTY2OCwxMDI3ICs2NjgsMTAyNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19DbG9zZVJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgcmVmTnVtOwogI2lmbmRlZiBDbG9zZVJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhDbG9zZVJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCUNsb3NlUmVzRmlsZShyZWZOdW0pOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsb3NlUmVzRmlsZShyZWZOdW0pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfUmVzRXJyb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFJlc0Vycm9yCi0JUHlNYWNfUFJFQ0hFQ0soUmVzRXJyb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlc0Vycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzRXJyb3IoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0N1clJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBDdXJSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ3VyUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3VyUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ3VyUmVzRmlsZSgpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDdXJSZXNGaWxlKCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX1VzZVJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgcmVmTnVtOwogI2lmbmRlZiBVc2VSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soVXNlUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXNlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCVVzZVJlc0ZpbGUocmVmTnVtKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVc2VSZXNGaWxlKHJlZk51bSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19Db3VudFR5cGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgQ291bnRUeXBlcwotCVB5TWFjX1BSRUNIRUNLKENvdW50VHlwZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50VHlwZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50VHlwZXMoKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRUeXBlcygpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19Db3VudDFUeXBlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIENvdW50MVR5cGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnQxVHlwZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50MVR5cGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudDFUeXBlcygpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudDFUeXBlcygpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRJbmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0SW5kVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldEluZFR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEluZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCUdldEluZFR5cGUoJnRoZVR5cGUsCi0JICAgICAgICAgICBpbmRleCk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEluZFR5cGUoJnRoZVR5cGUsCisgICAgICAgICAgICAgICBpbmRleCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldDFJbmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0MUluZFR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXQxSW5kVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0MUluZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCUdldDFJbmRUeXBlKCZ0aGVUeXBlLAotCSAgICAgICAgICAgIGluZGV4KTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0MUluZFR5cGUoJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZVR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19TZXRSZXNMb2FkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGxvYWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gbG9hZDsKICNpZm5kZWYgU2V0UmVzTG9hZAotCVB5TWFjX1BSRUNIRUNLKFNldFJlc0xvYWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJlc0xvYWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2FkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVzTG9hZChsb2FkKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2FkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzTG9hZChsb2FkKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0NvdW50UmVzb3VyY2VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBDb3VudFJlc291cmNlcwotCVB5TWFjX1BSRUNIRUNLKENvdW50UmVzb3VyY2VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudFJlc291cmNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudFJlc291cmNlcyh0aGVUeXBlKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudFJlc291cmNlcyh0aGVUeXBlKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfQ291bnQxUmVzb3VyY2VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBDb3VudDFSZXNvdXJjZXMKLQlQeU1hY19QUkVDSEVDSyhDb3VudDFSZXNvdXJjZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50MVJlc291cmNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudDFSZXNvdXJjZXModGhlVHlwZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnQxUmVzb3VyY2VzKHRoZVR5cGUpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRJbmRSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBHZXRJbmRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKEdldEluZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbmRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRJbmRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0SW5kUmVzb3VyY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXQxSW5kUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0MUluZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0MUluZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXQxSW5kUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0MUluZFJlc291cmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0MUluZFJlc291cmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldFJlc291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKLQlzaG9ydCB0aGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgc2hvcnQgdGhlSUQ7CiAjaWZuZGVmIEdldFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFJlc291cmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgdGhlSUQpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRSZXNvdXJjZSh0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIHRoZUlEKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldDFSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgdGhlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIHNob3J0IHRoZUlEOwogI2lmbmRlZiBHZXQxUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhHZXQxUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldDFSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXQxUmVzb3VyY2UodGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgdGhlSUQpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXQxUmVzb3VyY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlSUQpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0TmFtZWRSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBHZXROYW1lZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TmFtZWRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmFtZWRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmFtZWRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROYW1lZFJlc291cmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldDFOYW1lZFJlc291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKLQlTdHIyNTUgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgU3RyMjU1IG5hbWU7CiAjaWZuZGVmIEdldDFOYW1lZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0MU5hbWVkUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldDFOYW1lZFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXQxTmFtZWRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0MU5hbWVkUmVzb3VyY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX1VuaXF1ZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBVbmlxdWVJRAotCVB5TWFjX1BSRUNIRUNLKFVuaXF1ZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbmlxdWVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBVbmlxdWVJRCh0aGVUeXBlKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBVbmlxdWVJRCh0aGVUeXBlKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfVW5pcXVlMUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBVbmlxdWUxSUQKLQlQeU1hY19QUkVDSEVDSyhVbmlxdWUxSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVuaXF1ZTFJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBVbmlxdWUxSUQodGhlVHlwZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVW5pcXVlMUlEKHRoZVR5cGUpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19VcGRhdGVSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHJlZk51bTsKICNpZm5kZWYgVXBkYXRlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZVJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZVJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlVcGRhdGVSZXNGaWxlKHJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVXBkYXRlUmVzRmlsZShyZWZOdW0pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfU2V0UmVzUHVyZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gaW5zdGFsbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBpbnN0YWxsOwogI2lmbmRlZiBTZXRSZXNQdXJnZQotCVB5TWFjX1BSRUNIRUNLKFNldFJlc1B1cmdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNQdXJnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluc3RhbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZXNQdXJnZShpbnN0YWxsKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0YWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzUHVyZ2UoaW5zdGFsbCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRSZXNGaWxlQXR0cnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlzaG9ydCByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBzaG9ydCByZWZOdW07CiAjaWZuZGVmIEdldFJlc0ZpbGVBdHRycwotCVB5TWFjX1BSRUNIRUNLKEdldFJlc0ZpbGVBdHRycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UmVzRmlsZUF0dHJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UmVzRmlsZUF0dHJzKHJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRSZXNGaWxlQXR0cnMocmVmTnVtKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfU2V0UmVzRmlsZUF0dHJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCByZWZOdW07Ci0Jc2hvcnQgYXR0cnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHJlZk51bTsKKyAgICBzaG9ydCBhdHRyczsKICNpZm5kZWYgU2V0UmVzRmlsZUF0dHJzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzRmlsZUF0dHJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNGaWxlQXR0cnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cnMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZXNGaWxlQXR0cnMocmVmTnVtLAotCSAgICAgICAgICAgICAgICBhdHRycyk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzRmlsZUF0dHJzKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpSZXNfT3BlblJGUGVybShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVN0cjI1NSBmaWxlTmFtZTsKLQlzaG9ydCB2UmVmTnVtOwotCVNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIFNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKICNpZm5kZWYgT3BlblJGUGVybQotCVB5TWFjX1BSRUNIRUNLKE9wZW5SRlBlcm0pOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5SRlBlcm0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9wZW5SRlBlcm0oZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICB2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE9wZW5SRlBlcm0oZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0hPcGVuUmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb247CiAjaWZuZGVmIEhPcGVuUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEhPcGVuUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSE9wZW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBIT3BlblJlc0ZpbGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSE9wZW5SZXNGaWxlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0hDcmVhdGVSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOwogI2lmbmRlZiBIQ3JlYXRlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEhDcmVhdGVSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIQ3JlYXRlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUhDcmVhdGVSZXNGaWxlKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgZmlsZU5hbWUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhDcmVhdGVSZXNGaWxlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNwT3BlblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlGU1NwZWMgc3BlYzsKLQlTaWduZWRCeXRlIHBlcm1pc3Npb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBGU1NwZWMgc3BlYzsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb247CiAjaWZuZGVmIEZTcE9wZW5SZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRlNwT3BlblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTcE9wZW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRlNwT3BlblJlc0ZpbGUoJnNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGU3BPcGVuUmVzRmlsZSgmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNwQ3JlYXRlUmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRlNTcGVjIHNwZWM7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGU1NwZWMgc3BlYzsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CiAjaWZuZGVmIEZTcENyZWF0ZVJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhGU3BDcmVhdGVSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU3BDcmVhdGVSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCi0JCXJldHVybiBOVUxMOwotCUZTcENyZWF0ZVJlc0ZpbGUoJnNwZWMsCi0JICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGU3BDcmVhdGVSZXNGaWxlKCZzcGVjLAorICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0luc2VydFJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgcmVmTnVtOwotCVJzcmNDaGFpbkxvY2F0aW9uIHdoZXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiByZWZOdW07CisgICAgUnNyY0NoYWluTG9jYXRpb24gd2hlcmU7CiAjaWZuZGVmIEluc2VydFJlc291cmNlRmlsZQotCVB5TWFjX1BSRUNIRUNLKEluc2VydFJlc291cmNlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0UmVzb3VyY2VGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoZXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydFJlc291cmNlRmlsZShyZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0UmVzb3VyY2VGaWxlKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRGV0YWNoUmVzb3VyY2VGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IHJlZk51bTsKICNpZm5kZWYgRGV0YWNoUmVzb3VyY2VGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRGV0YWNoUmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZXRhY2hSZXNvdXJjZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGV0YWNoUmVzb3VyY2VGaWxlKHJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGV0YWNoUmVzb3VyY2VGaWxlKHJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlGU1NwZWMgcmVzb3VyY2VGaWxlOwotCUJvb2xlYW4gaW5DaGFpbjsKLQlTSW50MTYgcmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBGU1NwZWMgcmVzb3VyY2VGaWxlOworICAgIEJvb2xlYW4gaW5DaGFpbjsKKyAgICBTSW50MTYgcmVmTnVtOwogI2lmbmRlZiBGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbgotCVB5TWFjX1BSRUNIRUNLKEZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3Blbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnJlc291cmNlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKCZyZXNvdXJjZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGluQ2hhaW4sCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnJlc291cmNlRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKCZyZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNwT3Blbk9ycGhhblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHNwZWM7Ci0JU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOwotCVNJbnQxNiByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIHNwZWM7CisgICAgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOworICAgIFNJbnQxNiByZWZOdW07CiAjaWZuZGVmIEZTcE9wZW5PcnBoYW5SZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRlNwT3Blbk9ycGhhblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTcE9wZW5PcnBoYW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcE9wZW5PcnBoYW5SZXNGaWxlKCZzcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcE9wZW5PcnBoYW5SZXNGaWxlKCZzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRUb3BSZXNvdXJjZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IHJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgcmVmTnVtOwogI2lmbmRlZiBHZXRUb3BSZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUb3BSZXNvdXJjZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRvcFJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRvcFJlc291cmNlRmlsZSgmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VG9wUmVzb3VyY2VGaWxlKCZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0TmV4dFJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgY3VyUmVmTnVtOwotCVNJbnQxNiBuZXh0UmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBjdXJSZWZOdW07CisgICAgU0ludDE2IG5leHRSZWZOdW07CiAjaWZuZGVmIEdldE5leHRSZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0UmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0UmVzb3VyY2VGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3VyUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE5leHRSZXNvdXJjZUZpbGUoY3VyUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0UmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBuZXh0UmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1clJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXROZXh0UmVzb3VyY2VGaWxlKGN1clJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dFJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTT3BlblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlGU1JlZiByZWY7Ci0JU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgRlNSZWYgcmVmOworICAgIFNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKICNpZm5kZWYgRlNPcGVuUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTT3BlblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTT3BlblJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRlNPcGVuUmVzRmlsZSgmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRlNPcGVuUmVzRmlsZSgmcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNDcmVhdGVSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGU1JlZiBwYXJlbnRSZWY7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCUZTUmVmIG5ld1JlZjsKLQlGU1NwZWMgbmV3U3BlYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRlNSZWYgcGFyZW50UmVmOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBGU1JlZiBuZXdSZWY7CisgICAgRlNTcGVjIG5ld1NwZWM7CiAjaWZuZGVmIEZTQ3JlYXRlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTQ3JlYXRlUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRlNDcmVhdGVSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdSMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnBhcmVudFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCW5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JRlNDcmVhdGVSZXNGaWxlKCZwYXJlbnRSZWYsCi0JICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAwLAotCSAgICAgICAgICAgICAgICAoRlNDYXRhbG9nSW5mbyAqKTAsCi0JICAgICAgICAgICAgICAgICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICZuZXdTcGVjKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm5ld1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTU3BlYywgJm5ld1NwZWMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnBhcmVudFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgRlNDcmVhdGVSZXNGaWxlKCZwYXJlbnRSZWYsCisgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAoRlNDYXRhbG9nSW5mbyAqKTAsCisgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCisgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm5ld1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTU3BlYywgJm5ld1NwZWMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19GU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlGU1JlZiByZXNvdXJjZUZpbGVSZWY7Ci0JQm9vbGVhbiBpbkNoYWluOwotCVNJbnQxNiByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEZTUmVmIHJlc291cmNlRmlsZVJlZjsKKyAgICBCb29sZWFuIGluQ2hhaW47CisgICAgU0ludDE2IHJlZk51bTsKICNpZm5kZWYgRlNSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbgotCVB5TWFjX1BSRUNIRUNLKEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlc291cmNlRmlsZVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4oJnJlc291cmNlRmlsZVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNoYWluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGluQ2hhaW4sCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVzb3VyY2VGaWxlUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRlNSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbigmcmVzb3VyY2VGaWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19GU0NyZWF0ZVJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiBwYXJlbnRSZWY7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCVVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOwotCVVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlGU1JlZiBuZXdSZWY7Ci0JRlNTcGVjIG5ld1NwZWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgcGFyZW50UmVmOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgRlNSZWYgbmV3UmVmOworICAgIEZTU3BlYyBuZXdTcGVjOwogI2lmbmRlZiBGU0NyZWF0ZVJlc291cmNlRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTQ3JlYXRlUmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU0NyZWF0ZVJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnUjdSMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnBhcmVudFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbmFtZUxlbmd0aF9fbGVuX18gPSBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlmb3JrTmFtZUxlbmd0aF9fbGVuX18gPSBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTQ3JlYXRlUmVzb3VyY2VGaWxlKCZwYXJlbnRSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlNDYXRhbG9nSW5mbyAqKTAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmbmV3UmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNTcGVjLCAmbmV3U3BlYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZ1I3UjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZwYXJlbnRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU0NyZWF0ZVJlc291cmNlRmlsZSgmcGFyZW50UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZTQ2F0YWxvZ0luZm8gKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U3BlYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm5ld1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTU3BlYywgJm5ld1NwZWMpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTT3BlblJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiByZWY7Ci0JVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCVNpZ25lZEJ5dGUgcGVybWlzc2lvbnM7Ci0JUmVzRmlsZVJlZk51bSByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgcmVmOworICAgIFVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187CisgICAgaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb25zOworICAgIFJlc0ZpbGVSZWZOdW0gcmVmTnVtOwogI2lmbmRlZiBGU09wZW5SZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhGU09wZW5SZXNvdXJjZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTT3BlblJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnUjYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9ucykpCi0JCXJldHVybiBOVUxMOwotCWZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlfZXJyID0gRlNPcGVuUmVzb3VyY2VGaWxlKCZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdSNiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU09wZW5SZXNvdXJjZUZpbGUoJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0hhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JY2hhciAqYnVmOwotCWludCBsZW47Ci0JSGFuZGxlIGg7Ci0JUmVzb3VyY2VPYmplY3QgKnJ2OworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworICAgIEhhbmRsZSBoOworICAgIFJlc291cmNlT2JqZWN0ICpydjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwgJmJ1ZiwgJmxlbikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQloID0gTmV3SGFuZGxlKGxlbik7Ci0JaWYgKCBoID09IE5VTEwgKSB7Ci0JICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCUhMb2NrKGgpOwotCW1lbWNweSgqaCwgYnVmLCBsZW4pOwotCUhVbmxvY2soaCk7Ci0JcnYgPSAoUmVzb3VyY2VPYmplY3QgKilSZXNPYmpfTmV3KGgpOwotCXJ2LT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsKLQlfcmVzID0gKFB5T2JqZWN0ICopcnY7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLCAmYnVmLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaCA9IE5ld0hhbmRsZShsZW4pOworICAgIGlmICggaCA9PSBOVUxMICkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgSExvY2soaCk7CisgICAgbWVtY3B5KCpoLCBidWYsIGxlbik7CisgICAgSFVubG9jayhoKTsKKyAgICBydiA9IChSZXNvdXJjZU9iamVjdCAqKVJlc09ial9OZXcoaCk7CisgICAgcnYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlSGFuZGxlOworICAgIF9yZXMgPSAoUHlPYmplY3QgKilydjsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgUmVzX21ldGhvZHNbXSA9IHsKLQl7IkNsb3NlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfQ2xvc2VSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJSZXNFcnJvciIsIChQeUNGdW5jdGlvbilSZXNfUmVzRXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkN1clJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0N1clJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJVc2VSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19Vc2VSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJDb3VudFR5cGVzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudFR5cGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiQ291bnQxVHlwZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50MVR5cGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0SW5kVHlwZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0SW5kVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChSZXNUeXBlIHRoZVR5cGUpIil9LAotCXsiR2V0MUluZFR5cGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldDFJbmRUeXBlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKFJlc1R5cGUgdGhlVHlwZSkiKX0sCi0JeyJTZXRSZXNMb2FkIiwgKFB5Q0Z1bmN0aW9uKVJlc19TZXRSZXNMb2FkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGxvYWQpIC0+IE5vbmUiKX0sCi0JeyJDb3VudFJlc291cmNlcyIsIChQeUNGdW5jdGlvbilSZXNfQ291bnRSZXNvdXJjZXMsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJDb3VudDFSZXNvdXJjZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50MVJlc291cmNlcywgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldEluZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRJbmRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCBpbmRleCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0MUluZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxSW5kUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCB0aGVJRCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0MVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgdGhlSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE5hbWVkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzX0dldE5hbWVkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldDFOYW1lZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxTmFtZWRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBTdHIyNTUgbmFtZSkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiVW5pcXVlSUQiLCAoUHlDRnVuY3Rpb24pUmVzX1VuaXF1ZUlELCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiVW5pcXVlMUlEIiwgKFB5Q0Z1bmN0aW9uKVJlc19VbmlxdWUxSUQsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJVcGRhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19VcGRhdGVSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTZXRSZXNQdXJnZSIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzUHVyZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5zdGFsbCkgLT4gTm9uZSIpfSwKLQl7IkdldFJlc0ZpbGVBdHRycyIsIChQeUNGdW5jdGlvbilSZXNfR2V0UmVzRmlsZUF0dHJzLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChzaG9ydCBfcnYpIil9LAotCXsiU2V0UmVzRmlsZUF0dHJzIiwgKFB5Q0Z1bmN0aW9uKVJlc19TZXRSZXNGaWxlQXR0cnMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgc2hvcnQgYXR0cnMpIC0+IE5vbmUiKX0sCisgICAgeyJDbG9zZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0Nsb3NlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiUmVzRXJyb3IiLCAoUHlDRnVuY3Rpb24pUmVzX1Jlc0Vycm9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDdXJSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19DdXJSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVXNlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfVXNlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRUeXBlcyIsIChQeUNGdW5jdGlvbilSZXNfQ291bnRUeXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkNvdW50MVR5cGVzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudDFUeXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldEluZFR5cGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldEluZFR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoUmVzVHlwZSB0aGVUeXBlKSIpfSwKKyAgICB7IkdldDFJbmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxSW5kVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChSZXNUeXBlIHRoZVR5cGUpIil9LAorICAgIHsiU2V0UmVzTG9hZCIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzTG9hZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBsb2FkKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRSZXNvdXJjZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50UmVzb3VyY2VzLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiQ291bnQxUmVzb3VyY2VzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudDFSZXNvdXJjZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRJbmRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0SW5kUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldDFJbmRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MUluZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IGluZGV4KSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0UmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgdGhlSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldDFSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IHRoZUlEKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXROYW1lZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXROYW1lZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIFN0cjI1NSBuYW1lKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXQxTmFtZWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MU5hbWVkUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlVuaXF1ZUlEIiwgKFB5Q0Z1bmN0aW9uKVJlc19VbmlxdWVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlVuaXF1ZTFJRCIsIChQeUNGdW5jdGlvbilSZXNfVW5pcXVlMUlELCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVXBkYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfVXBkYXRlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiU2V0UmVzUHVyZ2UiLCAoUHlDRnVuY3Rpb24pUmVzX1NldFJlc1B1cmdlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluc3RhbGwpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRSZXNGaWxlQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzX0dldFJlc0ZpbGVBdHRycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldFJlc0ZpbGVBdHRycyIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzRmlsZUF0dHJzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIHNob3J0IGF0dHJzKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiT3BlblJGUGVybSIsIChQeUNGdW5jdGlvbilSZXNfT3BlblJGUGVybSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IGZpbGVOYW1lLCBzaG9ydCB2UmVmTnVtLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAotCXsiSE9wZW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IT3BlblJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkhDcmVhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IQ3JlYXRlUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiBOb25lIil9LAotCXsiRlNwT3BlblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcE9wZW5SZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgc3BlYywgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkZTcENyZWF0ZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcENyZWF0ZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBzcGVjLCBPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGZpbGVUeXBlLCBTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gTm9uZSIpfSwKKyAgICB7Ik9wZW5SRlBlcm0iLCAoUHlDRnVuY3Rpb24pUmVzX09wZW5SRlBlcm0sIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBmaWxlTmFtZSwgc2hvcnQgdlJlZk51bSwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkhPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSE9wZW5SZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJIQ3JlYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSENyZWF0ZVJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcE9wZW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BPcGVuUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHNwZWMsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJGU3BDcmVhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BDcmVhdGVSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgc3BlYywgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JeyJJbnNlcnRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0luc2VydFJlc291cmNlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHJlZk51bSwgUnNyY0NoYWluTG9jYXRpb24gd2hlcmUpIC0+IE5vbmUiKX0sCi0JeyJEZXRhY2hSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0RldGFjaFJlc291cmNlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSW5zZXJ0UmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgcmVmTnVtLCBSc3JjQ2hhaW5Mb2NhdGlvbiB3aGVyZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRldGFjaFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRGV0YWNoUmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgcmVmTnVtKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiRlNwUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4iLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgcmVzb3VyY2VGaWxlKSAtPiAoQm9vbGVhbiBfcnYsIEJvb2xlYW4gaW5DaGFpbiwgU0ludDE2IHJlZk51bSkiKX0sCi0JeyJGU3BPcGVuT3JwaGFuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNwT3Blbk9ycGhhblJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBzcGVjLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChTSW50MTYgcmVmTnVtKSIpfSwKLQl7IkdldFRvcFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0VG9wUmVzb3VyY2VGaWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgcmVmTnVtKSIpfSwKLQl7IkdldE5leHRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldE5leHRSZXNvdXJjZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBjdXJSZWZOdW0pIC0+IChTSW50MTYgbmV4dFJlZk51bSkiKX0sCisgICAgeyJGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbiIsIChQeUNGdW5jdGlvbilSZXNfRlNwUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyByZXNvdXJjZUZpbGUpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBpbkNoYWluLCBTSW50MTYgcmVmTnVtKSIpfSwKKyAgICB7IkZTcE9wZW5PcnBoYW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BPcGVuT3JwaGFuUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHNwZWMsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKFNJbnQxNiByZWZOdW0pIil9LAorICAgIHsiR2V0VG9wUmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRUb3BSZXNvdXJjZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiByZWZOdW0pIil9LAorICAgIHsiR2V0TmV4dFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0TmV4dFJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGN1clJlZk51bSkgLT4gKFNJbnQxNiBuZXh0UmVmTnVtKSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXsiRlNPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcmVmLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiRlNPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcmVmLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiRlNDcmVhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU0NyZWF0ZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHBhcmVudFJlZiwgQnVmZmVyIG5hbWVMZW5ndGgpIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjKSIpfSwKLQl7IkZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4iLCAoUHlDRnVuY3Rpb24pUmVzX0ZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4sIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHJlc291cmNlRmlsZVJlZikgLT4gKEJvb2xlYW4gX3J2LCBCb29sZWFuIGluQ2hhaW4sIFNJbnQxNiByZWZOdW0pIil9LAotCXsiRlNDcmVhdGVSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTQ3JlYXRlUmVzb3VyY2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBwYXJlbnRSZWYsIEJ1ZmZlciBuYW1lTGVuZ3RoLCBCdWZmZXIgZm9ya05hbWVMZW5ndGgpIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjKSIpfSwKKyAgICB7IkZTQ3JlYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNDcmVhdGVSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBwYXJlbnRSZWYsIEJ1ZmZlciBuYW1lTGVuZ3RoKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCisgICAgeyJGU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiByZXNvdXJjZUZpbGVSZWYpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBpbkNoYWluLCBTSW50MTYgcmVmTnVtKSIpfSwKKyAgICB7IkZTQ3JlYXRlUmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU0NyZWF0ZVJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcGFyZW50UmVmLCBCdWZmZXIgbmFtZUxlbmd0aCwgQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7IkZTT3BlblJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzb3VyY2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiByZWYsIEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9ucykgLT4gKFNJbnQxNiByZWZOdW0pIil9LAotCXsiSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiQ29udmVydCBhIHN0cmluZyB0byBhIEhhbmRsZSBvYmplY3QuXG5cblJlc291cmNlKCkgYW5kIEhhbmRsZSgpIGFyZSB2ZXJ5IHNpbWlsYXIsIGJ1dCBvYmplY3RzIGNyZWF0ZWQgd2l0aCBIYW5kbGUoKSBhcmVcbmJ5IGRlZmF1bHQgYXV0b21hdGljYWxseSBEaXNwb3NlSGFuZGxlKClkIHVwb24gb2JqZWN0IGNsZWFudXAuIFVzZSBBdXRvRGlzcG9zZSgpXG50byBjaGFuZ2UgdGhpcy5cbiIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkZTT3BlblJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiByZWYsIEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9ucykgLT4gKFNJbnQxNiByZWZOdW0pIil9LAorICAgIHsiSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiQ29udmVydCBhIHN0cmluZyB0byBhIEhhbmRsZSBvYmplY3QuXG5cblJlc291cmNlKCkgYW5kIEhhbmRsZSgpIGFyZSB2ZXJ5IHNpbWlsYXIsIGJ1dCBvYmplY3RzIGNyZWF0ZWQgd2l0aCBIYW5kbGUoKSBhcmVcbmJ5IGRlZmF1bHQgYXV0b21hdGljYWxseSBEaXNwb3NlSGFuZGxlKClkIHVwb24gb2JqZWN0IGNsZWFudXAuIFVzZSBBdXRvRGlzcG9zZSgpXG50byBjaGFuZ2UgdGhpcy5cbiIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTY5Niw2NCArMTY5Niw2NCBAQAogLyogQWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBSZXNPYmpfTmV3LCB3aGljaCByZXR1cm5zIE5vbmUgZm9yIG51bGwgYXJndW1lbnQgKi8KIFB5T2JqZWN0ICpPcHRSZXNPYmpfTmV3KEhhbmRsZSBpdHNlbGYpCiB7Ci0gICAgICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUmVzT2JqX05ldyhpdHNlbGYpOworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUmVzT2JqX05ldyhpdHNlbGYpOwogfQogCiBpbnQgT3B0UmVzT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotICAgICAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKLSAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChSZXNPYmpfQ2hlY2sodikpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICAvKiBJZiBpdCBpc24ndCBhIHJlc291cmNlIHlldCBzZWUgd2hldGhlciBpdCBpcyBjb252ZXJ0aWJsZSAqLwotICAgICAgICBpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICkgewotICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil0bXApLT5vYl9pdHNlbGY7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmICggdiA9PSBQeV9Ob25lICkgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKFJlc09ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogSWYgaXQgaXNuJ3QgYSByZXNvdXJjZSB5ZXQgc2VlIHdoZXRoZXIgaXQgaXMgY29udmVydGlibGUgKi8KKyAgICBpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICkgeworICAgICAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdG1wKS0+b2JfaXRzZWxmOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogdm9pZCBpbml0X1Jlcyh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoSGFuZGxlLCBSZXNPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChIYW5kbGUsIFJlc09ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEhhbmRsZSwgT3B0UmVzT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoSGFuZGxlLCBPcHRSZXNPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEhhbmRsZSwgUmVzT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChIYW5kbGUsIFJlc09ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoSGFuZGxlLCBPcHRSZXNPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEhhbmRsZSwgT3B0UmVzT2JqX0NvbnZlcnQpOwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1JlcyIsIFJlc19tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlSZXNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChSZXNfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBSZXNfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlSZXNvdXJjZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUmVzb3VyY2VfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZSZXNvdXJjZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJlc291cmNlIiwgKFB5T2JqZWN0ICopJlJlc291cmNlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmUmVzb3VyY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSZXNvdXJjZVR5cGUiLCAoUHlPYmplY3QgKikmUmVzb3VyY2VfVHlwZSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9SZXMiLCBSZXNfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgUmVzX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoUmVzX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgUmVzX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgUmVzb3VyY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlJlc291cmNlX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmUmVzb3VyY2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSZXNvdXJjZSIsIChQeU9iamVjdCAqKSZSZXNvdXJjZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlJlc291cmNlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUmVzb3VyY2VUeXBlIiwgKFB5T2JqZWN0ICopJlJlc291cmNlX1R5cGUpOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfUmVzID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3NjcmFwL19TY3JhcG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvc2NyYXAvX1NjcmFwbW9kdWxlLmMKaW5kZXggMTRlM2ZkMi4uZjI0ZWQ4YiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvc2NyYXAvX1NjcmFwbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvc2NyYXAvX1NjcmFwbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTI3LDE5OSArMjcsMTk5IEBACiAjZGVmaW5lIFNjcmFwT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlNjcmFwX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlNjcmFwX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBTY3JhcE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVNjcmFwUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgU2NyYXBSZWYgb2JfaXRzZWxmOwogfSBTY3JhcE9iamVjdDsKIAogUHlPYmplY3QgKlNjcmFwT2JqX05ldyhTY3JhcFJlZiBpdHNlbGYpCiB7Ci0JU2NyYXBPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKFNjcmFwT2JqZWN0LCAmU2NyYXBfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFNjcmFwT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhTY3JhcE9iamVjdCwgJlNjcmFwX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIGludCBTY3JhcE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBTY3JhcFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFTY3JhcE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJTY3JhcCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChTY3JhcE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFTY3JhcE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJTY3JhcCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChTY3JhcE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFNjcmFwT2JqX2RlYWxsb2MoU2NyYXBPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX0dldFNjcmFwRmxhdm9yRmxhZ3MoU2NyYXBPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7Ci0JU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvckZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGF2b3JGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7CisgICAgU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvckZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JTaXplKFNjcmFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOwotCVNpemUgYnl0ZUNvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmxhdm9yVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTY3JhcEZsYXZvclNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOworICAgIFNpemUgYnl0ZUNvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmxhdm9yVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTY3JhcEZsYXZvclNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX0dldFNjcmFwRmxhdm9yRGF0YShTY3JhcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZTsKLQlTaXplIGJ5dGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZTsKKyAgICBTaXplIGJ5dGVDb3VudDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmxhdm9yVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTY3JhcEZsYXZvclNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoaW50KWJ5dGVDb3VudCk7Ci0JaWYgKCBfcmVzID09IE5VTEwgKSByZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhfcmVzKSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHsKLQkJUHlfWERFQ1JFRihfcmVzKTsKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGludClieXRlQ291bnQpOworICAgIGlmICggX3JlcyA9PSBOVUxMICkgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNjcmFwRmxhdm9yRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoX3JlcykpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5X1hERUNSRUYoX3Jlcyk7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBPYmpfUHV0U2NyYXBGbGF2b3IoU2NyYXBPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7Ci0JU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFnczsKLQljaGFyICpmbGF2b3JEYXRhX19pbl9fOwotCWludCBmbGF2b3JEYXRhX19pbl9sZW5fXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJktzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGF2b3JGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvckRhdGFfX2luX18sICZmbGF2b3JEYXRhX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQdXRTY3JhcEZsYXZvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgKFNpemUpZmxhdm9yRGF0YV9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgIGZsYXZvckRhdGFfX2luX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOworICAgIFNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3M7CisgICAgY2hhciAqZmxhdm9yRGF0YV9faW5fXzsKKyAgICBpbnQgZmxhdm9yRGF0YV9faW5fbGVuX187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZLcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmbGF2b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhdm9yRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGF2b3JEYXRhX19pbl9fLCAmZmxhdm9yRGF0YV9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0U2NyYXBGbGF2b3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChTaXplKWZsYXZvckRhdGFfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JEYXRhX19pbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcE9ial9HZXRTY3JhcEZsYXZvckNvdW50KFNjcmFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpbmZvQ291bnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTY3JhcEZsYXZvckNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9Db3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW5mb0NvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5mb0NvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JDb3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9Db3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdChTY3JhcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZW07Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5mb0NvdW50OwotCVNjcmFwRmxhdm9ySW5mbyAqaW5mb2xpc3QgPSBOVUxMOwotCWludCBpOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JDb3VudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvQ291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JaWYgKGluZm9Db3VudCA9PSAwKSByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiW10iKTsKLQkKLQlpZiAoKGluZm9saXN0ID0gKFNjcmFwRmxhdm9ySW5mbyAqKW1hbGxvYyhpbmZvQ291bnQqc2l6ZW9mKFNjcmFwRmxhdm9ySW5mbykpKSA9PSBOVUxMICkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCi0JX2VyciA9IEdldFNjcmFwRmxhdm9ySW5mb0xpc3QoX3NlbGYtPm9iX2l0c2VsZiwgJmluZm9Db3VudCwgaW5mb2xpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JCWZyZWUoaW5mb2xpc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChfcmVzID0gUHlMaXN0X05ldyhpbmZvQ291bnQpKSA9PSBOVUxMICkgewotCQlmcmVlKGluZm9saXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvcihpPTA7IGk8aW5mb0NvdW50OyBpKyspIHsKLQkJaXRlbSA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpbmZvbGlzdFtpXS5mbGF2b3JUeXBlLAotCQkJaW5mb2xpc3RbaV0uZmxhdm9yRmxhZ3MpOwotCQlpZiAoICFpdGVtIHx8IFB5TGlzdF9TZXRJdGVtKF9yZXMsIGksIGl0ZW0pIDwgMCApIHsKLQkJCVB5X0RFQ1JFRihfcmVzKTsKLQkJCWZyZWUoaW5mb2xpc3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZnJlZShpbmZvbGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGluZm9Db3VudDsKKyAgICBTY3JhcEZsYXZvckluZm8gKmluZm9saXN0ID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JDb3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgaWYgKGluZm9Db3VudCA9PSAwKSByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiW10iKTsKKworICAgIGlmICgoaW5mb2xpc3QgPSAoU2NyYXBGbGF2b3JJbmZvICopbWFsbG9jKGluZm9Db3VudCpzaXplb2YoU2NyYXBGbGF2b3JJbmZvKSkpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKworICAgIF9lcnIgPSBHZXRTY3JhcEZsYXZvckluZm9MaXN0KF9zZWxmLT5vYl9pdHNlbGYsICZpbmZvQ291bnQsIGluZm9saXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgeworICAgICAgICBmcmVlKGluZm9saXN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoX3JlcyA9IFB5TGlzdF9OZXcoaW5mb0NvdW50KSkgPT0gTlVMTCApIHsKKyAgICAgICAgZnJlZShpbmZvbGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IoaT0wOyBpPGluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaW5mb2xpc3RbaV0uZmxhdm9yVHlwZSwKKyAgICAgICAgICAgIGluZm9saXN0W2ldLmZsYXZvckZsYWdzKTsKKyAgICAgICAgaWYgKCAhaXRlbSB8fCBQeUxpc3RfU2V0SXRlbShfcmVzLCBpLCBpdGVtKSA8IDAgKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoX3Jlcyk7CisgICAgICAgICAgICBmcmVlKGluZm9saXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGZyZWUoaW5mb2xpc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU2NyYXBPYmpfbWV0aG9kc1tdID0gewotCXsiR2V0U2NyYXBGbGF2b3JGbGFncyIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSkgLT4gKFNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3MpIil9LAotCXsiR2V0U2NyYXBGbGF2b3JTaXplIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX0dldFNjcmFwRmxhdm9yU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGUpIC0+IChTaXplIGJ5dGVDb3VudCkiKX0sCi0JeyJHZXRTY3JhcEZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JEYXRhLCAxLAotCSBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSwgQnVmZmVyIGRlc3RpbmF0aW9uKSAtPiAoU2l6ZSBieXRlQ291bnQpIil9LAotCXsiUHV0U2NyYXBGbGF2b3IiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfUHV0U2NyYXBGbGF2b3IsIDEsCi0JIFB5RG9jX1NUUigiKFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlLCBTY3JhcEZsYXZvckZsYWdzIGZsYXZvckZsYWdzLCBTaXplIGZsYXZvclNpemUsIEJ1ZmZlciBmbGF2b3JEYXRhKSAtPiBOb25lIil9LAotCXsiR2V0U2NyYXBGbGF2b3JDb3VudCIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaW5mb0NvdW50KSIpfSwKLQl7IkdldFNjcmFwRmxhdm9ySW5mb0xpc3QiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoWyhTY3JhcEZsYXZvclR5cGUsIFNjcmFwRmxhdm9ySW5mbyksIC4uLl0pIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiR2V0U2NyYXBGbGF2b3JGbGFncyIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSkgLT4gKFNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3MpIil9LAorICAgIHsiR2V0U2NyYXBGbGF2b3JTaXplIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX0dldFNjcmFwRmxhdm9yU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGUpIC0+IChTaXplIGJ5dGVDb3VudCkiKX0sCisgICAgeyJHZXRTY3JhcEZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSwgQnVmZmVyIGRlc3RpbmF0aW9uKSAtPiAoU2l6ZSBieXRlQ291bnQpIil9LAorICAgIHsiUHV0U2NyYXBGbGF2b3IiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfUHV0U2NyYXBGbGF2b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlLCBTY3JhcEZsYXZvckZsYWdzIGZsYXZvckZsYWdzLCBTaXplIGZsYXZvclNpemUsIEJ1ZmZlciBmbGF2b3JEYXRhKSAtPiBOb25lIil9LAorICAgIHsiR2V0U2NyYXBGbGF2b3JDb3VudCIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaW5mb0NvdW50KSIpfSwKKyAgICB7IkdldFNjcmFwRmxhdm9ySW5mb0xpc3QiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoWyhTY3JhcEZsYXZvclR5cGUsIFNjcmFwRmxhdm9ySW5mbyksIC4uLl0pIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogUHlNZXRob2RDaGFpbiBTY3JhcE9ial9jaGFpbiA9IHsgU2NyYXBPYmpfbWV0aG9kcywgTlVMTCB9OwogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX2dldGF0dHIoU2NyYXBPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2RJbkNoYWluKCZTY3JhcE9ial9jaGFpbiwgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2RJbkNoYWluKCZTY3JhcE9ial9jaGFpbiwgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKICNkZWZpbmUgU2NyYXBPYmpfc2V0YXR0ciBOVUxMCkBAIC0yMzEsMTA3ICsyMzEsMTA3IEBACiAjZGVmaW5lIFNjcmFwT2JqX2hhc2ggTlVMTAogCiBQeVR5cGVPYmplY3QgU2NyYXBfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfU2NyYXAuU2NyYXAiLCAvKnRwX25hbWUqLwotCXNpemVvZihTY3JhcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFNjcmFwT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKSBTY3JhcE9ial9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykgU2NyYXBPYmpfc2V0YXR0ciwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgU2NyYXBPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFNjcmFwT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBTY3JhcE9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9TY3JhcC5TY3JhcCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNjcmFwT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgU2NyYXBPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpIFNjcmFwT2JqX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKSBTY3JhcE9ial9zZXRhdHRyLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBTY3JhcE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgU2NyYXBPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFNjcmFwT2JqX2hhc2gsIC8qdHBfaGFzaCovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFNjcmFwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcF9Mb2FkU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRTY3JhcCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwX1VubG9hZFNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5sb2FkU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVubG9hZFNjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBfR2V0Q3VycmVudFNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNjcmFwUmVmIHNjcmFwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q3VycmVudFNjcmFwKCZzY3JhcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFNjcmFwT2JqX05ldywgc2NyYXApOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNjcmFwUmVmIHNjcmFwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q3VycmVudFNjcmFwKCZzY3JhcCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmFwT2JqX05ldywgc2NyYXApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwX0NsZWFyQ3VycmVudFNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xlYXJDdXJyZW50U2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENsZWFyQ3VycmVudFNjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBfQ2FsbEluU2NyYXBQcm9taXNlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENhbGxJblNjcmFwUHJvbWlzZXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENhbGxJblNjcmFwUHJvbWlzZXMoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgU2NyYXBfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiTG9hZFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX0xvYWRTY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVW5sb2FkU2NyYXAiLCAoUHlDRnVuY3Rpb24pU2NyYXBfVW5sb2FkU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldEN1cnJlbnRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9HZXRDdXJyZW50U2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNjcmFwUmVmIHNjcmFwKSIpfSwKLQl7IkNsZWFyQ3VycmVudFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX0NsZWFyQ3VycmVudFNjcmFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDYWxsSW5TY3JhcFByb21pc2VzIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX0NhbGxJblNjcmFwUHJvbWlzZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkxvYWRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9Mb2FkU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlVubG9hZFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX1VubG9hZFNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDdXJyZW50U2NyYXAiLCAoUHlDRnVuY3Rpb24pU2NyYXBfR2V0Q3VycmVudFNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTY3JhcFJlZiBzY3JhcCkiKX0sCisgICAgeyJDbGVhckN1cnJlbnRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9DbGVhckN1cnJlbnRTY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ2FsbEluU2NyYXBQcm9taXNlcyIsIChQeUNGdW5jdGlvbilTY3JhcF9DYWxsSW5TY3JhcFByb21pc2VzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMzM5LDI1ICszMzksMjUgQEAKIAogdm9pZCBpbml0X1NjcmFwKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfU2NyYXAiLCBTY3JhcF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1NjcmFwIiwgU2NyYXBfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JU2NyYXBfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChTY3JhcF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFNjcmFwX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JU2NyYXBfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCVB5X0lOQ1JFRigmU2NyYXBfVHlwZSk7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTY3JhcFR5cGUiLCAoUHlPYmplY3QgKikmU2NyYXBfVHlwZSkgIT0gMCkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBTY3JhcFR5cGUiKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBTY3JhcF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFNjcmFwX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgU2NyYXBfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBTY3JhcF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZTY3JhcF9UeXBlKTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNjcmFwVHlwZSIsIChQeU9iamVjdCAqKSZTY3JhcF9UeXBlKSAhPSAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIFNjcmFwVHlwZSIpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3NuZC9fU25kaWhvb2tzLmMgYi9NYWMvTW9kdWxlcy9zbmQvX1NuZGlob29rcy5jCmluZGV4IDc0Y2FkOWIuLjI1NGZjMGMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3NuZC9fU25kaWhvb2tzLmMKKysrIGIvTWFjL01vZHVsZXMvc25kL19TbmRpaG9va3MuYwpAQCAtMzUsMTMgKzM1LDEzIEBACiAKICNwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKIHN0cnVjdCBTYW1wbGVSYXRlQXZhaWxhYmxlX2FyZyB7Ci0Jc2hvcnQJbnVtcmF0ZXM7Ci0JSGFuZGxlCXJhdGVzOworICAgIHNob3J0ICAgICAgIG51bXJhdGVzOworICAgIEhhbmRsZSAgICAgIHJhdGVzOwogfTsKIAogc3RydWN0IFNhbXBsZVNpemVBdmFpbGFibGVfYXJnIHsKLQlzaG9ydAludW1zaXplczsKLQlIYW5kbGUJc2l6ZXM7CisgICAgc2hvcnQgICAgICAgbnVtc2l6ZXM7CisgICAgSGFuZGxlICAgICAgc2l6ZXM7CiB9OwogCiAjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKQEAgLTUzLDI4ICs1MywyOCBAQAogc3RhdGljIGludAogUHlNYWNfR2V0VUZpeGVkKFB5T2JqZWN0ICp2LCBGaXhlZCAqZikKIHsKLQlkb3VibGUgZDsKLQl1bnNpZ25lZCBsb25nIHVuczsKLQkKLQlpZiggIVB5QXJnX1BhcnNlKHYsICJkIiwgJmQpKQotCQlyZXR1cm4gMDsKLQl1bnMgPSAodW5zaWduZWQgbG9uZykoZCAqIDB4MTAwMDApOwotCSpmID0gKEZpeGVkKXVuczsKLQlyZXR1cm4gMTsKKyAgICBkb3VibGUgZDsKKyAgICB1bnNpZ25lZCBsb25nIHVuczsKKworICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgImQiLCAmZCkpCisgICAgICAgIHJldHVybiAwOworICAgIHVucyA9ICh1bnNpZ25lZCBsb25nKShkICogMHgxMDAwMCk7CisgICAgKmYgPSAoRml4ZWQpdW5zOworICAgIHJldHVybiAxOwogfQogCiAvKiBDb252ZXJ0IGEgUG9pbnQgdG8gYSBQeXRob24gb2JqZWN0ICovCiBzdGF0aWMgUHlPYmplY3QgKgogUHlNYWNfQnVpbGRVRml4ZWQoRml4ZWQgZikKIHsKLQlkb3VibGUgZDsKLQl1bnNpZ25lZCBsb25nIGZ1bnM7Ci0JCi0JZnVucyA9ICh1bnNpZ25lZCBsb25nKWY7Ci0JCi0JZCA9IGZ1bnM7Ci0JZCA9IGQgLyAweDEwMDAwOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJkIiwgZCk7CisgICAgZG91YmxlIGQ7CisgICAgdW5zaWduZWQgbG9uZyBmdW5zOworCisgICAgZnVucyA9ICh1bnNpZ25lZCBsb25nKWY7CisKKyAgICBkID0gZnVuczsKKyAgICBkID0gZCAvIDB4MTAwMDA7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImQiLCBkKTsKIH0KIAogCkBAIC04NiwxOSArODYsMTkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX2dldENoYW5uZWxBdmFpbGFibGUoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBuY2hhbm5lbDsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBuY2hhbm5lbDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUNoYW5uZWxBdmFpbGFibGUsIChQdHIpJm5jaGFubmVsKSkgIT0gbm9FcnIgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIG5jaGFubmVsKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpQ2hhbm5lbEF2YWlsYWJsZSwgKFB0cikmbmNoYW5uZWwpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgbmNoYW5uZWwpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXROdW1iZXJDaGFubmVsc19fZG9jX19bXSA9CkBAIC0xMDcsMTkgKzEwNywxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0TnVtYmVyQ2hhbm5lbHMoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBuY2hhbm5lbDsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBuY2hhbm5lbDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaU51bWJlckNoYW5uZWxzLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBuY2hhbm5lbCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaU51bWJlckNoYW5uZWxzLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBuY2hhbm5lbCk7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX3NldE51bWJlckNoYW5uZWxzX19kb2NfX1tdID0KQEAgLTEyOCwyMCArMTI4LDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9zZXROdW1iZXJDaGFubmVscyhzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG5jaGFubmVsOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG5jaGFubmVsOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZuY2hhbm5lbCkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpTnVtYmVyQ2hhbm5lbHMsIChQdHIpJm5jaGFubmVsKSkgIT0gbm9FcnIgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaCIsICZpblJlZk51bSwgJm5jaGFubmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaU51bWJlckNoYW5uZWxzLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRDb250aW51b3VzX19kb2NfX1tdID0KQEAgLTE1MCwxOSArMTUwLDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9nZXRDb250aW51b3VzKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgb25vZmY7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgb25vZmY7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lDb250aW51b3VzLCAoUHRyKSZvbm9mZikpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBvbm9mZik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUNvbnRpbnVvdXMsIChQdHIpJm9ub2ZmKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIG9ub2ZmKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfc2V0Q29udGludW91c19fZG9jX19bXSA9CkBAIC0xNzEsMjAgKzE3MSwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0Q29udGludW91cyhzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG9ub2ZmOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG9ub2ZmOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZvbm9mZikpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpQ29udGludW91cywgKFB0cikmb25vZmYpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmb25vZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpQ29udGludW91cywgKFB0cikmb25vZmYpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0SW5wdXRTb3VyY2VOYW1lc19fZG9jX19bXSA9CkBAIC0xOTMsMTkgKzE5MywxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0SW5wdXRTb3VyY2VOYW1lcyhzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCUhhbmRsZSBuYW1lczsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBIYW5kbGUgbmFtZXM7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lJbnB1dFNvdXJjZU5hbWVzLCAoUHRyKSZuYW1lcykpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgbmFtZXMpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lJbnB1dFNvdXJjZU5hbWVzLCAoUHRyKSZuYW1lcykpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgbmFtZXMpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRJbnB1dFNvdXJjZV9fZG9jX19bXSA9CkBAIC0yMTQsMTkgKzIxNCwxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0SW5wdXRTb3VyY2Uoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBzb3VyY2U7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgc291cmNlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2UsIChQdHIpJnNvdXJjZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzb3VyY2UpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lJbnB1dFNvdXJjZSwgKFB0cikmc291cmNlKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNvdXJjZSk7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX3NldElucHV0U291cmNlX19kb2NfX1tdID0KQEAgLTIzNSwyMCArMjM1LDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9zZXRJbnB1dFNvdXJjZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IHNvdXJjZTsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBzb3VyY2U7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaCIsICZpblJlZk51bSwgJnNvdXJjZSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2UsIChQdHIpJnNvdXJjZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZzb3VyY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2UsIChQdHIpJnNvdXJjZSkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRQbGF5VGhydU9uT2ZmX19kb2NfX1tdID0KQEAgLTI1NywxOSArMjU3LDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9nZXRQbGF5VGhydU9uT2ZmKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgb25vZmY7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgb25vZmY7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lQbGF5VGhydU9uT2ZmLCAoUHRyKSZvbm9mZikpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBvbm9mZik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVBsYXlUaHJ1T25PZmYsIChQdHIpJm9ub2ZmKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIG9ub2ZmKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfc2V0UGxheVRocnVPbk9mZl9fZG9jX19bXSA9CkBAIC0yNzgsMjAgKzI3OCwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0UGxheVRocnVPbk9mZihzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG9ub2ZmOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG9ub2ZmOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZvbm9mZikpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpUGxheVRocnVPbk9mZiwgKFB0cikmb25vZmYpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmb25vZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpUGxheVRocnVPbk9mZiwgKFB0cikmb25vZmYpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0U2FtcGxlUmF0ZV9fZG9jX19bXSA9CkBAIC0zMDAsMTkgKzMwMCwxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0U2FtcGxlUmF0ZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCUZpeGVkIHNhbXBsZV9yYXRlOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIEZpeGVkIHNhbXBsZV9yYXRlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlUmF0ZSwgKFB0cikmc2FtcGxlX3JhdGUpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkVUZpeGVkLCBzYW1wbGVfcmF0ZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVJhdGUsIChQdHIpJnNhbXBsZV9yYXRlKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFVGaXhlZCwgc2FtcGxlX3JhdGUpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9zZXRTYW1wbGVSYXRlX19kb2NfX1tdID0KQEAgLTMyMSwyMCArMzIxLDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9zZXRTYW1wbGVSYXRlKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0JRml4ZWQgc2FtcGxlX3JhdGU7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgRml4ZWQgc2FtcGxlX3JhdGU7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsTyYiLCAmaW5SZWZOdW0sIFB5TWFjX0dldFVGaXhlZCwgJnNhbXBsZV9yYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCU2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVSYXRlLCAoUHRyKSZzYW1wbGVfcmF0ZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibE8mIiwgJmluUmVmTnVtLCBQeU1hY19HZXRVRml4ZWQsICZzYW1wbGVfcmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCU2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVSYXRlLCAoUHRyKSZzYW1wbGVfcmF0ZSkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRTYW1wbGVTaXplX19kb2NfX1tdID0KQEAgLTM0MywxOSArMzQzLDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9nZXRTYW1wbGVTaXplKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgYml0czsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBiaXRzOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlU2l6ZSwgKFB0cikmYml0cykpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBiaXRzKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlU2l6ZSwgKFB0cikmYml0cykpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBiaXRzKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfc2V0U2FtcGxlU2l6ZV9fZG9jX19bXSA9CkBAIC0zNjQsMjAgKzM2NCwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0U2FtcGxlU2l6ZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IHNpemU7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgc2l6ZTsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlU2l6ZSwgKFB0cikmc2l6ZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemUsIChQdHIpJnNpemUpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZV9fZG9jX19bXSA9CkBAIC0zODYsMzEgKzM4NiwzMSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXN0cnVjdCBTYW1wbGVTaXplQXZhaWxhYmxlX2FyZyBhcmc7Ci0JT1NFcnIgZXJyOwotCVB5T2JqZWN0ICpyc2l6ZXM7Ci0Jc2hvcnQgKmZzaXplczsKLQlpbnQgaTsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHN0cnVjdCBTYW1wbGVTaXplQXZhaWxhYmxlX2FyZyBhcmc7CisgICAgT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpyc2l6ZXM7CisgICAgc2hvcnQgKmZzaXplczsKKyAgICBpbnQgaTsKIAotCWFyZy5zaXplcyA9IE5VTEw7Ci0JcnNpemVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemVBdmFpbGFibGUsIChQdHIpJmFyZykpICE9IG5vRXJyICkgewotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQl9Ci0JZnNpemVzID0gKHNob3J0ICopKihhcmcuc2l6ZXMpOwotCS8qIEhhbmRsZSBjb250YWlucyBhIGxpc3Qgb2YgcmF0ZXMgKi8KLQlpZiggKHJzaXplcyA9IFB5VHVwbGVfTmV3KGFyZy5udW1zaXplcykpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciggaT0wOyBpPGFyZy5udW1zaXplczsgaSsrICkKLQkJUHlUdXBsZV9TZXRJdGVtKHJzaXplcywgaSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpZnNpemVzW2ldKSk7Ci0JcmV0dXJuIHJzaXplczsKKyAgICBhcmcuc2l6ZXMgPSBOVUxMOworICAgIHJzaXplcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemVBdmFpbGFibGUsIChQdHIpJmFyZykpICE9IG5vRXJyICkgeworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICB9CisgICAgZnNpemVzID0gKHNob3J0ICopKihhcmcuc2l6ZXMpOworICAgIC8qIEhhbmRsZSBjb250YWlucyBhIGxpc3Qgb2YgcmF0ZXMgKi8KKyAgICBpZiggKHJzaXplcyA9IFB5VHVwbGVfTmV3KGFyZy5udW1zaXplcykpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciggaT0wOyBpPGFyZy5udW1zaXplczsgaSsrICkKKyAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJzaXplcywgaSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpZnNpemVzW2ldKSk7CisgICAgcmV0dXJuIHJzaXplczsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZV9fZG9jX19bXSA9CkBAIC00MTksOTQgKzQxOSw5NCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXN0cnVjdCBTYW1wbGVSYXRlQXZhaWxhYmxlX2FyZyBhcmc7Ci0JT1NFcnIgZXJyOwotCVB5T2JqZWN0ICpycmF0ZXMsICpvYmo7Ci0JRml4ZWQgKmZyYXRlczsKLQlpbnQgaTsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHN0cnVjdCBTYW1wbGVSYXRlQXZhaWxhYmxlX2FyZyBhcmc7CisgICAgT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpycmF0ZXMsICpvYmo7CisgICAgRml4ZWQgKmZyYXRlczsKKyAgICBpbnQgaTsKIAotCWFyZy5yYXRlcyA9IE5VTEw7Ci0JcnJhdGVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVJhdGVBdmFpbGFibGUsIChQdHIpJmFyZykpICE9IG5vRXJyICkgewotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQl9Ci0JZnJhdGVzID0gKEZpeGVkICopKihhcmcucmF0ZXMpOwotCWlmKCBhcmcubnVtcmF0ZXMgPT0gMCApIHsKLQkJLyogVGhlIGhhbmRsZSBjb250YWlucyB1cHBlciBhbmQgbG93ZXJib3VuZCAqLwotCQlycmF0ZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgZnJhdGVzWzBdLCBmcmF0ZXNbMV0pOwotCQlpZiAocnJhdGVzID09IE5VTEwpIHJldHVybiBOVUxMOwotCX0gZWxzZSB7Ci0JCS8qIEhhbmRsZSBjb250YWlucyBhIGxpc3Qgb2YgcmF0ZXMgKi8KLQkJaWYoIChycmF0ZXMgPSBQeVR1cGxlX05ldyhhcmcubnVtcmF0ZXMpKSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZvciggaT0wOyBpPGFyZy5udW1yYXRlczsgaSsrICkgewotCQkJaWYoIChvYmogPSBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkVUZpeGVkLCBmcmF0ZXNbaV0pKT09TlVMTCkKLQkJCQlnb3RvIG91dDsKLQkJCVB5VHVwbGVfU2V0SXRlbShycmF0ZXMsIGksIG9iaik7Ci0JCX0KLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPIiwgYXJnLm51bXJhdGVzLCBycmF0ZXMpOworICAgIGFyZy5yYXRlcyA9IE5VTEw7CisgICAgcnJhdGVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlUmF0ZUF2YWlsYWJsZSwgKFB0cikmYXJnKSkgIT0gbm9FcnIgKSB7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIH0KKyAgICBmcmF0ZXMgPSAoRml4ZWQgKikqKGFyZy5yYXRlcyk7CisgICAgaWYoIGFyZy5udW1yYXRlcyA9PSAwICkgeworICAgICAgICAvKiBUaGUgaGFuZGxlIGNvbnRhaW5zIHVwcGVyIGFuZCBsb3dlcmJvdW5kICovCisgICAgICAgIHJyYXRlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBmcmF0ZXNbMF0sIGZyYXRlc1sxXSk7CisgICAgICAgIGlmIChycmF0ZXMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSGFuZGxlIGNvbnRhaW5zIGEgbGlzdCBvZiByYXRlcyAqLworICAgICAgICBpZiggKHJyYXRlcyA9IFB5VHVwbGVfTmV3KGFyZy5udW1yYXRlcykpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yKCBpPTA7IGk8YXJnLm51bXJhdGVzOyBpKysgKSB7CisgICAgICAgICAgICBpZiggKG9iaiA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRVRml4ZWQsIGZyYXRlc1tpXSkpPT1OVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJyYXRlcywgaSwgb2JqKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaE8iLCBhcmcubnVtcmF0ZXMsIHJyYXRlcyk7CiBvdXQ6Ci0JUHlfWERFQ1JFRihycmF0ZXMpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYocnJhdGVzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogTGlzdCBvZiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHNuZGloX21ldGhvZHNbXSA9IHsKLSB7ImdldENoYW5uZWxBdmFpbGFibGUiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0Q2hhbm5lbEF2YWlsYWJsZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRDaGFubmVsQXZhaWxhYmxlX19kb2NfX30sCi0geyJnZXROdW1iZXJDaGFubmVscyIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXROdW1iZXJDaGFubmVscywJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXROdW1iZXJDaGFubmVsc19fZG9jX199LAotIHsic2V0TnVtYmVyQ2hhbm5lbHMiLAkoUHlDRnVuY3Rpb24pc25kaWhfc2V0TnVtYmVyQ2hhbm5lbHMsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0TnVtYmVyQ2hhbm5lbHNfX2RvY19ffSwKLSB7ImdldENvbnRpbnVvdXMiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0Q29udGludW91cywJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRDb250aW51b3VzX19kb2NfX30sCi0geyJzZXRDb250aW51b3VzIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX3NldENvbnRpbnVvdXMsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0Q29udGludW91c19fZG9jX199LAotIHsiZ2V0SW5wdXRTb3VyY2VOYW1lcyIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRJbnB1dFNvdXJjZU5hbWVzLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldElucHV0U291cmNlTmFtZXNfX2RvY19ffSwKLSB7ImdldElucHV0U291cmNlIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX2dldElucHV0U291cmNlLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldElucHV0U291cmNlX19kb2NfX30sCi0geyJzZXRJbnB1dFNvdXJjZSIsCShQeUNGdW5jdGlvbilzbmRpaF9zZXRJbnB1dFNvdXJjZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9zZXRJbnB1dFNvdXJjZV9fZG9jX199LAotIHsiZ2V0UGxheVRocnVPbk9mZiIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRQbGF5VGhydU9uT2ZmLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldFBsYXlUaHJ1T25PZmZfX2RvY19ffSwKLSB7InNldFBsYXlUaHJ1T25PZmYiLAkoUHlDRnVuY3Rpb24pc25kaWhfc2V0UGxheVRocnVPbk9mZiwJTUVUSF9WQVJBUkdTLAlzbmRpaF9zZXRQbGF5VGhydU9uT2ZmX19kb2NfX30sCi0geyJnZXRTYW1wbGVSYXRlIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX2dldFNhbXBsZVJhdGUsCU1FVEhfVkFSQVJHUywJc25kaWhfZ2V0U2FtcGxlUmF0ZV9fZG9jX199LAotIHsic2V0U2FtcGxlUmF0ZSIsCShQeUNGdW5jdGlvbilzbmRpaF9zZXRTYW1wbGVSYXRlLAlNRVRIX1ZBUkFSR1MsCXNuZGloX3NldFNhbXBsZVJhdGVfX2RvY19ffSwKLSB7ImdldFNhbXBsZVNpemUiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0U2FtcGxlU2l6ZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRTYW1wbGVTaXplX19kb2NfX30sCi0geyJzZXRTYW1wbGVTaXplIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX3NldFNhbXBsZVNpemUsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0U2FtcGxlU2l6ZV9fZG9jX199LAotIHsiZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZSIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVTaXplQXZhaWxhYmxlLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldFNhbXBsZVNpemVBdmFpbGFibGVfX2RvY19ffSwKLSB7ImdldFNhbXBsZVJhdGVBdmFpbGFibGUiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRTYW1wbGVSYXRlQXZhaWxhYmxlX19kb2NfX30sCi0gCi0Je05VTEwsCSAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgeyJnZXRDaGFubmVsQXZhaWxhYmxlIiwgICAgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRDaGFubmVsQXZhaWxhYmxlLCBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0Q2hhbm5lbEF2YWlsYWJsZV9fZG9jX199LAorIHsiZ2V0TnVtYmVyQ2hhbm5lbHMiLCAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldE51bWJlckNoYW5uZWxzLCAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXROdW1iZXJDaGFubmVsc19fZG9jX199LAorIHsic2V0TnVtYmVyQ2hhbm5lbHMiLCAgKFB5Q0Z1bmN0aW9uKXNuZGloX3NldE51bWJlckNoYW5uZWxzLCAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9zZXROdW1iZXJDaGFubmVsc19fZG9jX199LAorIHsiZ2V0Q29udGludW91cyIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldENvbnRpbnVvdXMsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRDb250aW51b3VzX19kb2NfX30sCisgeyJzZXRDb250aW51b3VzIiwgICAgICAoUHlDRnVuY3Rpb24pc25kaWhfc2V0Q29udGludW91cywgICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX3NldENvbnRpbnVvdXNfX2RvY19ffSwKKyB7ImdldElucHV0U291cmNlTmFtZXMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldElucHV0U291cmNlTmFtZXMsIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRJbnB1dFNvdXJjZU5hbWVzX19kb2NfX30sCisgeyJnZXRJbnB1dFNvdXJjZSIsICAgICAoUHlDRnVuY3Rpb24pc25kaWhfZ2V0SW5wdXRTb3VyY2UsICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX2dldElucHV0U291cmNlX19kb2NfX30sCisgeyJzZXRJbnB1dFNvdXJjZSIsICAgICAoUHlDRnVuY3Rpb24pc25kaWhfc2V0SW5wdXRTb3VyY2UsICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX3NldElucHV0U291cmNlX19kb2NfX30sCisgeyJnZXRQbGF5VGhydU9uT2ZmIiwgICAoUHlDRnVuY3Rpb24pc25kaWhfZ2V0UGxheVRocnVPbk9mZiwgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX2dldFBsYXlUaHJ1T25PZmZfX2RvY19ffSwKKyB7InNldFBsYXlUaHJ1T25PZmYiLCAgIChQeUNGdW5jdGlvbilzbmRpaF9zZXRQbGF5VGhydU9uT2ZmLCAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfc2V0UGxheVRocnVPbk9mZl9fZG9jX199LAorIHsiZ2V0U2FtcGxlUmF0ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldFNhbXBsZVJhdGUsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRTYW1wbGVSYXRlX19kb2NfX30sCisgeyJzZXRTYW1wbGVSYXRlIiwgICAgICAoUHlDRnVuY3Rpb24pc25kaWhfc2V0U2FtcGxlUmF0ZSwgICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX3NldFNhbXBsZVJhdGVfX2RvY19ffSwKKyB7ImdldFNhbXBsZVNpemUiLCAgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVTaXplLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0U2FtcGxlU2l6ZV9fZG9jX199LAorIHsic2V0U2FtcGxlU2l6ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX3NldFNhbXBsZVNpemUsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9zZXRTYW1wbGVTaXplX19kb2NfX30sCisgeyJnZXRTYW1wbGVTaXplQXZhaWxhYmxlIiwgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVTaXplQXZhaWxhYmxlLCAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRTYW1wbGVTaXplQXZhaWxhYmxlX19kb2NfX30sCisgeyJnZXRTYW1wbGVSYXRlQXZhaWxhYmxlIiwgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVSYXRlQXZhaWxhYmxlLCAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRTYW1wbGVSYXRlQXZhaWxhYmxlX19kb2NfX30sCisKKyAgICB7TlVMTCwgICAgICAgKFB5Q0Z1bmN0aW9uKU5VTEwsIDAsIE5VTEx9ICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIAogLyogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBtb2R1bGUgKCptdXN0KiBiZSBjYWxsZWQgaW5pdFNuZGlob29rcykgKi8KIAotc3RhdGljIGNoYXIgU25kaWhvb2tzX21vZHVsZV9kb2N1bWVudGF0aW9uW10gPSAKK3N0YXRpYyBjaGFyIFNuZGlob29rc19tb2R1bGVfZG9jdW1lbnRhdGlvbltdID0KICIiCiA7CiAKIHZvaWQKIGluaXRfU25kaWhvb2tzKCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJfU25kaWhvb2tzIiwgc25kaWhfbWV0aG9kcywKLQkJU25kaWhvb2tzX21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoIl9TbmRpaG9va3MiLCBzbmRpaF9tZXRob2RzLAorICAgICAgICBTbmRpaG9va3NfbW9kdWxlX2RvY3VtZW50YXRpb24sCisgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlFcnJvck9iamVjdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlNuZGlob29rcy5lcnJvciIpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEVycm9yT2JqZWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiU25kaWhvb2tzLmVycm9yIik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpOwogCi0JLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KLQkKLQkvKiBDaGVjayBmb3IgZXJyb3JzICovCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIFNuZGlob29rcyIpOworICAgIC8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCisKKyAgICAvKiBDaGVjayBmb3IgZXJyb3JzICovCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIFNuZGlob29rcyIpOwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9zbmQvX1NuZG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvc25kL19TbmRtb2R1bGUuYwppbmRleCBjMGM3MzlhLi4zNWNkNDAwIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9zbmQvX1NuZG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3NuZC9fU25kbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDE2ICsyMiwxNiBAQAogc3RhdGljIGludAogU25kQ21kX0NvbnZlcnQoUHlPYmplY3QgKnYsIFNuZENvbW1hbmQgKnBjKQogewotICAgICAgICBpbnQgbGVuOwotICAgICAgICBwYy0+cGFyYW0xID0gMDsKLSAgICAgICAgcGMtPnBhcmFtMiA9IDA7Ci0gICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImh8aGwiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIkhocyMiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yLCAmbGVuKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmcGMtPmNtZCk7CisgICAgaW50IGxlbjsKKyAgICBwYy0+cGFyYW0xID0gMDsKKyAgICBwYy0+cGFyYW0yID0gMDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAiaHxobCIsICZwYy0+Y21kLCAmcGMtPnBhcmFtMSwgJnBjLT5wYXJhbTIpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZVR1cGxlKHYsICJIaHMjIiwgJnBjLT5jbWQsICZwYy0+cGFyYW0xLCAmcGMtPnBhcmFtMiwgJmxlbik7CisgICAgfQorICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiSCIsICZwYy0+Y21kKTsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkIFNuZENoX1VzZXJSb3V0aW5lKFNuZENoYW5uZWxQdHIgY2hhbiwgU25kQ29tbWFuZCAqY21kKTsgLyogRm9yd2FyZCAqLwpAQCAtNDYsMTU2ICs0NiwxNTYgQEAKICNkZWZpbmUgU25kQ2hfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmU25kQ2hhbm5lbF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZTbmRDaGFubmVsX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBTbmRDaGFubmVsT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JU25kQ2hhbm5lbFB0ciBvYl9pdHNlbGY7Ci0JLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovCi0JUHlPYmplY3QgKm9iX2NhbGxiYWNrOwotCWxvbmcgb2JfQTU7Ci0JU25kQ29tbWFuZCBvYl9jbWQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFNuZENoYW5uZWxQdHIgb2JfaXRzZWxmOworICAgIC8qIE1lbWJlcnMgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzOiAqLworICAgIFB5T2JqZWN0ICpvYl9jYWxsYmFjazsKKyAgICBsb25nIG9iX0E1OworICAgIFNuZENvbW1hbmQgb2JfY21kOwogfSBTbmRDaGFubmVsT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX05ldyhTbmRDaGFubmVsUHRyIGl0c2VsZikKIHsKLQlTbmRDaGFubmVsT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhTbmRDaGFubmVsT2JqZWN0LCAmU25kQ2hhbm5lbF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfY2FsbGJhY2sgPSBOVUxMOwotCWl0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBTbmRDaGFubmVsT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhTbmRDaGFubmVsT2JqZWN0LCAmU25kQ2hhbm5lbF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgIGl0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIHZvaWQgU25kQ2hfZGVhbGxvYyhTbmRDaGFubmVsT2JqZWN0ICpzZWxmKQogewotCVNuZERpc3Bvc2VDaGFubmVsKHNlbGYtPm9iX2l0c2VsZiwgMSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFjayk7Ci0JUHlPYmplY3RfRnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBTbmREaXNwb3NlQ2hhbm5lbChzZWxmLT5vYl9pdHNlbGYsIDEpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2FsbGJhY2spOworICAgIFB5T2JqZWN0X0ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kQ2hfU25kRG9Db21tYW5kKFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kQ29tbWFuZCBjbWQ7Ci0JQm9vbGVhbiBub1dhaXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgU25kQ21kX0NvbnZlcnQsICZjbWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZub1dhaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kRG9Db21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmY21kLAotCSAgICAgICAgICAgICAgICAgICAgbm9XYWl0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTbmRDb21tYW5kIGNtZDsKKyAgICBCb29sZWFuIG5vV2FpdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbmRDbWRfQ29udmVydCwgJmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vV2FpdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmREb0NvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICBub1dhaXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZERvSW1tZWRpYXRlKFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kQ29tbWFuZCBjbWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBTbmRDbWRfQ29udmVydCwgJmNtZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmREb0ltbWVkaWF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAmY21kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTbmRDb21tYW5kIGNtZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNuZENtZF9Db252ZXJ0LCAmY21kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNuZERvSW1tZWRpYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZFBsYXkoU25kQ2hhbm5lbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKLQlCb29sZWFuIGFzeW5jOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc25kSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXN5bmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kUGxheShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHNuZEhhbmRsZSwKLQkgICAgICAgICAgICAgICBhc3luYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU25kTGlzdEhhbmRsZSBzbmRIYW5kbGU7CisgICAgQm9vbGVhbiBhc3luYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzeW5jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNuZFBsYXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBzbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgYXN5bmMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZENoYW5uZWxTdGF0dXMoU25kQ2hhbm5lbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB0aGVMZW5ndGg7Ci0JU0NTdGF0dXMgdGhlU3RhdHVzX19vdXRfXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRDaGFubmVsU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGVuZ3RoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVTdGF0dXNfX291dF9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlU3RhdHVzX19vdXRfXywgKGludClzaXplb2YoU0NTdGF0dXMpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB0aGVMZW5ndGg7CisgICAgU0NTdGF0dXMgdGhlU3RhdHVzX19vdXRfXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmRDaGFubmVsU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVTdGF0dXNfX291dF9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlU3RhdHVzX19vdXRfXywgKGludClzaXplb2YoU0NTdGF0dXMpKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRDaF9TbmRHZXRJbmZvKFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCXZvaWQgKiBpbmZvUHRyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mb1B0cikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRHZXRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgaW5mb1B0cik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHNlbGVjdG9yOworICAgIHZvaWQgKiBpbmZvUHRyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb1B0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmRHZXRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgaW5mb1B0cik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kQ2hfU25kU2V0SW5mbyhTbmRDaGFubmVsT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBzZWxlY3RvcjsKLQl2b2lkICogaW5mb1B0cjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnciLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9QdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kU2V0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgIGluZm9QdHIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBzZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb1B0cjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9QdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kU2V0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGluZm9QdHIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU25kQ2hfbWV0aG9kc1tdID0gewotCXsiU25kRG9Db21tYW5kIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZERvQ29tbWFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoU25kQ29tbWFuZCBjbWQsIEJvb2xlYW4gbm9XYWl0KSAtPiBOb25lIil9LAotCXsiU25kRG9JbW1lZGlhdGUiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kRG9JbW1lZGlhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNuZENvbW1hbmQgY21kKSAtPiBOb25lIil9LAotCXsiU25kUGxheSIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmRQbGF5LCAxLAotCSBQeURvY19TVFIoIihTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZSwgQm9vbGVhbiBhc3luYykgLT4gTm9uZSIpfSwKLQl7IlNuZENoYW5uZWxTdGF0dXMiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kQ2hhbm5lbFN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdGhlTGVuZ3RoKSAtPiAoU0NTdGF0dXMgdGhlU3RhdHVzKSIpfSwKLQl7IlNuZEdldEluZm8iLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kR2V0SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHNlbGVjdG9yLCB2b2lkICogaW5mb1B0cikgLT4gTm9uZSIpfSwKLQl7IlNuZFNldEluZm8iLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kU2V0SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHNlbGVjdG9yLCB2b2lkICogaW5mb1B0cikgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlNuZERvQ29tbWFuZCIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmREb0NvbW1hbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNuZENvbW1hbmQgY21kLCBCb29sZWFuIG5vV2FpdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNuZERvSW1tZWRpYXRlIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZERvSW1tZWRpYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTbmRDb21tYW5kIGNtZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNuZFBsYXkiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kUGxheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU25kTGlzdEhhbmRsZSBzbmRIYW5kbGUsIEJvb2xlYW4gYXN5bmMpIC0+IE5vbmUiKX0sCisgICAgeyJTbmRDaGFubmVsU3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZENoYW5uZWxTdGF0dXMsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHRoZUxlbmd0aCkgLT4gKFNDU3RhdHVzIHRoZVN0YXR1cykiKX0sCisgICAgeyJTbmRHZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZEdldEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3Rvciwgdm9pZCAqIGluZm9QdHIpIC0+IE5vbmUiKX0sCisgICAgeyJTbmRTZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZFNldEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3Rvciwgdm9pZCAqIGluZm9QdHIpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFNuZENoX2dldHNldGxpc3QgTlVMTApAQCAtMjA4LDQ3ICsyMDgsNDcgQEAKICNkZWZpbmUgU25kQ2hfaGFzaCBOVUxMCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU25kQ2hhbm5lbF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9TbmQuU25kQ2hhbm5lbCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFNuZENoYW5uZWxPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBTbmRDaF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBTbmRDaF9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgU25kQ2hfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFNuZENoX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlTbmRDaF9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlTbmRDaF9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2luaXQqLwotCTAsIC8qdHBfYWxsb2MqLwotCTAsIC8qdHBfbmV3Ki8KLQkwLCAvKnRwX2ZyZWUqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9TbmQuU25kQ2hhbm5lbCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNuZENoYW5uZWxPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBTbmRDaF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBTbmRDaF9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgU25kQ2hfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFNuZENoX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBTbmRDaF9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBTbmRDaF9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2luaXQqLworICAgIDAsIC8qdHBfYWxsb2MqLworICAgIDAsIC8qdHBfbmV3Ki8KKyAgICAwLCAvKnRwX2ZyZWUqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgU25kQ2hhbm5lbCAtLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNjEsODkgKzI2MSw4OSBAQAogI2RlZmluZSBTUEJPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmU1BCX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlNQQl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgU1BCT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovCi0JUHlPYmplY3QgKm9iX2NvbXBsZXRpb247Ci0JUHlPYmplY3QgKm9iX2ludGVycnVwdDsKLQlQeU9iamVjdCAqb2JfdGhpc2NhbGxiYWNrOwotCWxvbmcgb2JfQTU7Ci0JU1BCIG9iX3NwYjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovCisgICAgUHlPYmplY3QgKm9iX2NvbXBsZXRpb247CisgICAgUHlPYmplY3QgKm9iX2ludGVycnVwdDsKKyAgICBQeU9iamVjdCAqb2JfdGhpc2NhbGxiYWNrOworICAgIGxvbmcgb2JfQTU7CisgICAgU1BCIG9iX3NwYjsKIH0gU1BCT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKlNQQk9ial9OZXcodm9pZCkKIHsKLQlTUEJPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKFNQQk9iamVjdCwgJlNQQl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2NvbXBsZXRpb24gPSBOVUxMOwotCWl0LT5vYl9pbnRlcnJ1cHQgPSBOVUxMOwotCWl0LT5vYl90aGlzY2FsbGJhY2sgPSBOVUxMOwotCWl0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOwotCW1lbXNldCgoY2hhciAqKSZpdC0+b2Jfc3BiLCAwLCBzaXplb2YoaXQtPm9iX3NwYikpOwotCWl0LT5vYl9zcGIudXNlckxvbmcgPSAobG9uZylpdDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgU1BCT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhTUEJPYmplY3QsICZTUEJfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9jb21wbGV0aW9uID0gTlVMTDsKKyAgICBpdC0+b2JfaW50ZXJydXB0ID0gTlVMTDsKKyAgICBpdC0+b2JfdGhpc2NhbGxiYWNrID0gTlVMTDsKKyAgICBpdC0+b2JfQTUgPSBTZXRDdXJyZW50QTUoKTsKKyAgICBtZW1zZXQoKGNoYXIgKikmaXQtPm9iX3NwYiwgMCwgc2l6ZW9mKGl0LT5vYl9zcGIpKTsKKyAgICBpdC0+b2Jfc3BiLnVzZXJMb25nID0gKGxvbmcpaXQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogc3RhdGljIGludCBTUEJPYmpfQ29udmVydChQeU9iamVjdCAqdiwgU1BCUHRyICpwX2l0c2VsZikKIHsKLQlpZiAoIVNQQk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJTUEIgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICYoKFNQQk9iamVjdCAqKXYpLT5vYl9zcGI7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFTUEJPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiU1BCIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAmKChTUEJPYmplY3QgKil2KS0+b2Jfc3BiOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBTUEJPYmpfZGVhbGxvYyhTUEJPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2Jfc3BiLnVzZXJMb25nID0gMDsKLQlzZWxmLT5vYl90aGlzY2FsbGJhY2sgPSAwOwotCVB5X1hERUNSRUYoc2VsZi0+b2JfY29tcGxldGlvbik7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9pbnRlcnJ1cHQpOwotCVB5T2JqZWN0X0ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2Jfc3BiLnVzZXJMb25nID0gMDsKKyAgICBzZWxmLT5vYl90aGlzY2FsbGJhY2sgPSAwOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY29tcGxldGlvbik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9pbnRlcnJ1cHQpOworICAgIFB5T2JqZWN0X0ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBTUEJPYmpfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpTUEJPYmpfZ2V0X2luUmVmTnVtKFNQQk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5pblJlZk51bSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOwogfQogCiBzdGF0aWMgaW50IFNQQk9ial9zZXRfaW5SZWZOdW0oU1BCT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOwotCXJldHVybiAwOworICAgIHJldHVybiAtMSArIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX3NwYi5pblJlZk51bSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU1BCT2JqX2dldF9jb3VudChTUEJPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9zcGIuY291bnQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLmNvdW50KTsKIH0KIAogc3RhdGljIGludCBTUEJPYmpfc2V0X2NvdW50KFNQQk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIC0xICsgUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2Jfc3BiLmNvdW50KTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuY291bnQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNQQk9ial9nZXRfbWlsbGlzZWNvbmRzKFNQQk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5taWxsaXNlY29uZHMpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLm1pbGxpc2Vjb25kcyk7CiB9CiAKIHN0YXRpYyBpbnQgU1BCT2JqX3NldF9taWxsaXNlY29uZHMoU1BCT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIubWlsbGlzZWNvbmRzKTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIubWlsbGlzZWNvbmRzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTUEJPYmpfZ2V0X2Vycm9yKFNQQk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNlbGYtPm9iX3NwYi5lcnJvcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzZWxmLT5vYl9zcGIuZXJyb3IpOwogfQogCiAjZGVmaW5lIFNQQk9ial9zZXRfZXJyb3IgTlVMTApAQCAtMzUyLDIwICszNTIsMjAgQEAKIAogc3RhdGljIGludCBTUEJPYmpfc2V0X2NvbXBsZXRpb25Sb3V0aW5lKFNQQk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0Jc2VsZi0+b2Jfc3BiLmNvbXBsZXRpb25Sb3V0aW5lID0gTmV3U0lDb21wbGV0aW9uVVBQKFNQQl9jb21wbGV0aW9uKTsKLQkgICAgICAgICAgICBzZWxmLT5vYl9jb21wbGV0aW9uID0gdjsKLQkgICAgICAgICAgICBQeV9JTkNSRUYodik7Ci0JICAgICAgICAgICAgcmV0dXJuIDA7Ci0JcmV0dXJuIDA7CisgICAgc2VsZi0+b2Jfc3BiLmNvbXBsZXRpb25Sb3V0aW5lID0gTmV3U0lDb21wbGV0aW9uVVBQKFNQQl9jb21wbGV0aW9uKTsKKyAgICAgICAgICAgICAgICBzZWxmLT5vYl9jb21wbGV0aW9uID0gdjsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBTUEJPYmpfZ2V0c2V0bGlzdFtdID0gewotCXsiaW5SZWZOdW0iLCAoZ2V0dGVyKVNQQk9ial9nZXRfaW5SZWZOdW0sIChzZXR0ZXIpU1BCT2JqX3NldF9pblJlZk51bSwgTlVMTH0sCi0JeyJjb3VudCIsIChnZXR0ZXIpU1BCT2JqX2dldF9jb3VudCwgKHNldHRlcilTUEJPYmpfc2V0X2NvdW50LCBOVUxMfSwKLQl7Im1pbGxpc2Vjb25kcyIsIChnZXR0ZXIpU1BCT2JqX2dldF9taWxsaXNlY29uZHMsIChzZXR0ZXIpU1BCT2JqX3NldF9taWxsaXNlY29uZHMsIE5VTEx9LAotCXsiZXJyb3IiLCAoZ2V0dGVyKVNQQk9ial9nZXRfZXJyb3IsIChzZXR0ZXIpU1BCT2JqX3NldF9lcnJvciwgTlVMTH0sCi0JeyJjb21wbGV0aW9uUm91dGluZSIsIChnZXR0ZXIpU1BCT2JqX2dldF9jb21wbGV0aW9uUm91dGluZSwgKHNldHRlcilTUEJPYmpfc2V0X2NvbXBsZXRpb25Sb3V0aW5lLCBOVUxMfSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJpblJlZk51bSIsIChnZXR0ZXIpU1BCT2JqX2dldF9pblJlZk51bSwgKHNldHRlcilTUEJPYmpfc2V0X2luUmVmTnVtLCBOVUxMfSwKKyAgICB7ImNvdW50IiwgKGdldHRlcilTUEJPYmpfZ2V0X2NvdW50LCAoc2V0dGVyKVNQQk9ial9zZXRfY291bnQsIE5VTEx9LAorICAgIHsibWlsbGlzZWNvbmRzIiwgKGdldHRlcilTUEJPYmpfZ2V0X21pbGxpc2Vjb25kcywgKHNldHRlcilTUEJPYmpfc2V0X21pbGxpc2Vjb25kcywgTlVMTH0sCisgICAgeyJlcnJvciIsIChnZXR0ZXIpU1BCT2JqX2dldF9lcnJvciwgKHNldHRlcilTUEJPYmpfc2V0X2Vycm9yLCBOVUxMfSwKKyAgICB7ImNvbXBsZXRpb25Sb3V0aW5lIiwgKGdldHRlcilTUEJPYmpfZ2V0X2NvbXBsZXRpb25Sb3V0aW5lLCAoc2V0dGVyKVNQQk9ial9zZXRfY29tcGxldGlvblJvdXRpbmUsIE5VTEx9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtMzc2LDQ3ICszNzYsNDcgQEAKICNkZWZpbmUgU1BCT2JqX2hhc2ggTlVMTAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNQQl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9TbmQuU1BCIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoU1BCT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgU1BCT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIFNQQk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgU1BCT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBTUEJPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxULCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVNQQk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlTUEJPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JMCwgLyp0cF9pbml0Ki8KLQkwLCAvKnRwX2FsbG9jKi8KLQkwLCAvKnRwX25ldyovCi0JMCwgLyp0cF9mcmVlKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfU25kLlNQQiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNQQk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFNQQk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBTUEJPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFNQQk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgU1BCT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBTUEJPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgU1BCT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsIC8qdHBfaW5pdCovCisgICAgMCwgLyp0cF9hbGxvYyovCisgICAgMCwgLyp0cF9uZXcqLworICAgIDAsIC8qdHBfZnJlZSovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBTUEIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQyNCw2MzQgKzQyNCw2MzQgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlfcmVzID0gU1BCT2JqX05ldygpOyByZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgX3JlcyA9IFNQQk9ial9OZXcoKTsgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1N5c0JlZXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGR1cmF0aW9uOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTeXNCZWVwKGR1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGR1cmF0aW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTeXNCZWVwKGR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NuZE5ld0NoYW5uZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kQ2hhbm5lbFB0ciBjaGFuID0gMDsKLQlzaG9ydCBzeW50aDsKLQlsb25nIGluaXQ7Ci0JUHlPYmplY3QqIHVzZXJSb3V0aW5lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzeW50aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VyUm91dGluZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICh1c2VyUm91dGluZSAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKHVzZXJSb3V0aW5lKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYWxsYmFjayBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JCWdvdG8gdXNlclJvdXRpbmVfX2Vycm9yX187Ci0JfQotCV9lcnIgPSBTbmROZXdDaGFubmVsKCZjaGFuLAotCSAgICAgICAgICAgICAgICAgICAgIHN5bnRoLAotCSAgICAgICAgICAgICAgICAgICAgIGluaXQsCi0JICAgICAgICAgICAgICAgICAgICAgTmV3U25kQ2FsbEJhY2tVUFAoU25kQ2hfVXNlclJvdXRpbmUpKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgU25kQ2hfTmV3LCBjaGFuKTsKLQlpZiAoX3JlcyAhPSBOVUxMICYmIHVzZXJSb3V0aW5lICE9IFB5X05vbmUpCi0JewotCQlTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilfcmVzOwotCQlwLT5vYl9pdHNlbGYtPnVzZXJJbmZvID0gKGxvbmcpcDsKLQkJUHlfSU5DUkVGKHVzZXJSb3V0aW5lKTsKLQkJcC0+b2JfY2FsbGJhY2sgPSB1c2VyUm91dGluZTsKLQl9CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU25kQ2hhbm5lbFB0ciBjaGFuID0gMDsKKyAgICBzaG9ydCBzeW50aDsKKyAgICBsb25nIGluaXQ7CisgICAgUHlPYmplY3QqIHVzZXJSb3V0aW5lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyUm91dGluZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh1c2VyUm91dGluZSAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKHVzZXJSb3V0aW5lKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYWxsYmFjayBtdXN0IGJlIGNhbGxhYmxlIik7CisgICAgICAgIGdvdG8gdXNlclJvdXRpbmVfX2Vycm9yX187CisgICAgfQorICAgIF9lcnIgPSBTbmROZXdDaGFubmVsKCZjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTmV3U25kQ2FsbEJhY2tVUFAoU25kQ2hfVXNlclJvdXRpbmUpKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU25kQ2hfTmV3LCBjaGFuKTsKKyAgICBpZiAoX3JlcyAhPSBOVUxMICYmIHVzZXJSb3V0aW5lICE9IFB5X05vbmUpCisgICAgeworICAgICAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilfcmVzOworICAgICAgICBwLT5vYl9pdHNlbGYtPnVzZXJJbmZvID0gKGxvbmcpcDsKKyAgICAgICAgUHlfSU5DUkVGKHVzZXJSb3V0aW5lKTsKKyAgICAgICAgcC0+b2JfY2FsbGJhY2sgPSB1c2VyUm91dGluZTsKKyAgICB9CiAgdXNlclJvdXRpbmVfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kU291bmRNYW5hZ2VyVmVyc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTnVtVmVyc2lvbiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNuZFNvdW5kTWFuYWdlclZlcnNpb24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkTnVtVmVyc2lvbiwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTnVtVmVyc2lvbiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNuZFNvdW5kTWFuYWdlclZlcnNpb24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkTnVtVmVyc2lvbiwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kTWFuYWdlclN0YXR1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB0aGVMZW5ndGg7Ci0JU01TdGF0dXMgdGhlU3RhdHVzX19vdXRfXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRNYW5hZ2VyU3RhdHVzKHRoZUxlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmdGhlU3RhdHVzX19vdXRfXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnRoZVN0YXR1c19fb3V0X18sIChpbnQpc2l6ZW9mKFNNU3RhdHVzKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdGhlTGVuZ3RoOworICAgIFNNU3RhdHVzIHRoZVN0YXR1c19fb3V0X187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVMZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kTWFuYWdlclN0YXR1cyh0aGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVN0YXR1c19fb3V0X18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVTdGF0dXNfX291dF9fLCAoaW50KXNpemVvZihTTVN0YXR1cykpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TbmRHZXRTeXNCZWVwU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHN5c0JlZXBTdGF0ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU25kR2V0U3lzQmVlcFN0YXRlKCZzeXNCZWVwU3RhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBzeXNCZWVwU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBzeXNCZWVwU3RhdGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNuZEdldFN5c0JlZXBTdGF0ZSgmc3lzQmVlcFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3lzQmVlcFN0YXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kU2V0U3lzQmVlcFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHN5c0JlZXBTdGF0ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN5c0JlZXBTdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRTZXRTeXNCZWVwU3RhdGUoc3lzQmVlcFN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBzeXNCZWVwU3RhdGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeXNCZWVwU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kU2V0U3lzQmVlcFN0YXRlKHN5c0JlZXBTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX0dldFN5c0JlZXBWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBsZXZlbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFN5c0JlZXBWb2x1bWUoJmxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBsZXZlbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFN5c0JlZXBWb2x1bWUoJmxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NldFN5c0JlZXBWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBsZXZlbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFN5c0JlZXBWb2x1bWUobGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgbGV2ZWw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRTeXNCZWVwVm9sdW1lKGxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfR2V0RGVmYXVsdE91dHB1dFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGxldmVsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGVmYXVsdE91dHB1dFZvbHVtZSgmbGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGxldmVsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGVmYXVsdE91dHB1dFZvbHVtZSgmbGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU2V0RGVmYXVsdE91dHB1dFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGxldmVsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGVmYXVsdE91dHB1dFZvbHVtZShsZXZlbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBsZXZlbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERlZmF1bHRPdXRwdXRWb2x1bWUobGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9HZXRTb3VuZEhlYWRlck9mZnNldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKLQlsb25nIG9mZnNldDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc25kSGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFNvdW5kSGVhZGVyT2Zmc2V0KHNuZEhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKKyAgICBsb25nIG9mZnNldDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc25kSGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNvdW5kSGVhZGVyT2Zmc2V0KHNuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfR2V0Q29tcHJlc3Npb25JbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGNvbXByZXNzaW9uSUQ7Ci0JT1NUeXBlIGZvcm1hdDsKLQlzaG9ydCBudW1DaGFubmVsczsKLQlzaG9ydCBzYW1wbGVTaXplOwotCUNvbXByZXNzaW9uSW5mbyBjcF9fb3V0X187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9ybWF0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXByZXNzaW9uSW5mbyhjb21wcmVzc2lvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwX19vdXRfXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmNwX19vdXRfXywgKGludClzaXplb2YoQ29tcHJlc3Npb25JbmZvKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgY29tcHJlc3Npb25JRDsKKyAgICBPU1R5cGUgZm9ybWF0OworICAgIHNob3J0IG51bUNoYW5uZWxzOworICAgIHNob3J0IHNhbXBsZVNpemU7CisgICAgQ29tcHJlc3Npb25JbmZvIGNwX19vdXRfXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcHJlc3Npb25JbmZvKGNvbXByZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BfX291dF9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmY3BfX291dF9fLCAoaW50KXNpemVvZihDb21wcmVzc2lvbkluZm8pKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU2V0U291bmRQcmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSB0aGVUeXBlOwotCVN0cjI1NSBuYW1lOwotCUhhbmRsZSBzZXR0aW5nczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzZXR0aW5ncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRTb3VuZFByZWZlcmVuY2UodGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgdGhlVHlwZTsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2V0dGluZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0U291bmRQcmVmZXJlbmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgbmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX0dldFNvdW5kUHJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgdGhlVHlwZTsKLQlTdHIyNTUgbmFtZTsKLQlIYW5kbGUgc2V0dGluZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2V0dGluZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U291bmRQcmVmZXJlbmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgbmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHRoZVR5cGU7CisgICAgU3RyMjU1IG5hbWU7CisgICAgSGFuZGxlIHNldHRpbmdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNvdW5kUHJlZmVyZW5jZSh0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIG5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9HZXRDb21wcmVzc2lvbk5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGNvbXByZXNzaW9uVHlwZTsKLQlTdHIyNTUgY29tcHJlc3Npb25OYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3Npb25UeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXByZXNzaW9uTmFtZShjb21wcmVzc2lvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk5hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgY29tcHJlc3Npb25OYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgY29tcHJlc3Npb25UeXBlOworICAgIFN0cjI1NSBjb21wcmVzc2lvbk5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcHJlc3Npb25OYW1lKGNvbXByZXNzaW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBjb21wcmVzc2lvbk5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJWZXJzaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlOdW1WZXJzaW9uIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU1BCVmVyc2lvbigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGROdW1WZXJzaW9uLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBOdW1WZXJzaW9uIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU1BCVmVyc2lvbigpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGROdW1WZXJzaW9uLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TbmRSZWNvcmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUG9pbnQgY29ybmVyOwotCU9TVHlwZSBxdWFsaXR5OwotCVNuZExpc3RIYW5kbGUgc25kSGFuZGxlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNvcm5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcXVhbGl0eSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRSZWNvcmQoKE1vZGFsRmlsdGVyVVBQKTAsCi0JICAgICAgICAgICAgICAgICBjb3JuZXIsCi0JICAgICAgICAgICAgICAgICBxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgJnNuZEhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNuZEhhbmRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUG9pbnQgY29ybmVyOworICAgIE9TVHlwZSBxdWFsaXR5OworICAgIFNuZExpc3RIYW5kbGUgc25kSGFuZGxlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNvcm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcXVhbGl0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmRSZWNvcmQoKE1vZGFsRmlsdGVyVVBQKTAsCisgICAgICAgICAgICAgICAgICAgICBjb3JuZXIsCisgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgJnNuZEhhbmRsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNuZEhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQlNpZ25JbkRldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBkZXZpY2VSZWZOdW07Ci0JU3RyMjU1IGRldmljZU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlNpZ25JbkRldmljZShkZXZpY2VSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBkZXZpY2VSZWZOdW07CisgICAgU3RyMjU1IGRldmljZU5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQlNpZ25JbkRldmljZShkZXZpY2VSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCU2lnbk91dERldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBkZXZpY2VSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCU2lnbk91dERldmljZShkZXZpY2VSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGRldmljZVJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJTaWduT3V0RGV2aWNlKGRldmljZVJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQkdldEluZGV4ZWREZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgY291bnQ7Ci0JU3RyMjU1IGRldmljZU5hbWU7Ci0JSGFuZGxlIGRldmljZUljb25IYW5kbGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb3VudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJHZXRJbmRleGVkRGV2aWNlKGNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUljb25IYW5kbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBkZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRldmljZUljb25IYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGNvdW50OworICAgIFN0cjI1NSBkZXZpY2VOYW1lOworICAgIEhhbmRsZSBkZXZpY2VJY29uSGFuZGxlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCR2V0SW5kZXhlZERldmljZShjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJY29uSGFuZGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXZpY2VJY29uSGFuZGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCT3BlbkRldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHIyNTUgZGV2aWNlTmFtZTsKLQlzaG9ydCBwZXJtaXNzaW9uOwotCWxvbmcgaW5SZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJPcGVuRGV2aWNlKGRldmljZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGluUmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHIyNTUgZGV2aWNlTmFtZTsKKyAgICBzaG9ydCBwZXJtaXNzaW9uOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJPcGVuRGV2aWNlKGRldmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCQ2xvc2VEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpblJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQkNsb3NlRGV2aWNlKGluUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCQ2xvc2VEZXZpY2UoaW5SZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJSZWNvcmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU1BCUHRyIGluUGFyYW1QdHI7Ci0JQm9vbGVhbiBhc3luY2hGbGFnOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFNQQk9ial9Db252ZXJ0LCAmaW5QYXJhbVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFzeW5jaEZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCUmVjb3JkKGluUGFyYW1QdHIsCi0JICAgICAgICAgICAgICAgICBhc3luY2hGbGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTUEJQdHIgaW5QYXJhbVB0cjsKKyAgICBCb29sZWFuIGFzeW5jaEZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1BCT2JqX0NvbnZlcnQsICZpblBhcmFtUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXN5bmNoRmxhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJSZWNvcmQoaW5QYXJhbVB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGFzeW5jaEZsYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJQYXVzZVJlY29yZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCUGF1c2VSZWNvcmRpbmcoaW5SZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJQYXVzZVJlY29yZGluZyhpblJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQlJlc3VtZVJlY29yZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCUmVzdW1lUmVjb3JkaW5nKGluUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCUmVzdW1lUmVjb3JkaW5nKGluUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCU3RvcFJlY29yZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCU3RvcFJlY29yZGluZyhpblJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQlN0b3BSZWNvcmRpbmcoaW5SZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJHZXRSZWNvcmRpbmdTdGF0dXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCByZWNvcmRpbmdTdGF0dXM7Ci0Jc2hvcnQgbWV0ZXJMZXZlbDsKLQl1bnNpZ25lZCBsb25nIHRvdGFsU2FtcGxlc1RvUmVjb3JkOwotCXVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZTYW1wbGVzUmVjb3JkZWQ7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbE1zZWNzVG9SZWNvcmQ7Ci0JdW5zaWduZWQgbG9uZyBudW1iZXJPZk1zZWNzUmVjb3JkZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJHZXRSZWNvcmRpbmdTdGF0dXMoaW5SZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjb3JkaW5nU3RhdHVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldGVyTGV2ZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxTYW1wbGVzVG9SZWNvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzUmVjb3JkZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxNc2Vjc1RvUmVjb3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mTXNlY3NSZWNvcmRlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGhsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWNvcmRpbmdTdGF0dXMsCi0JICAgICAgICAgICAgICAgICAgICAgbWV0ZXJMZXZlbCwKLQkgICAgICAgICAgICAgICAgICAgICB0b3RhbFNhbXBsZXNUb1JlY29yZCwKLQkgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwKLQkgICAgICAgICAgICAgICAgICAgICB0b3RhbE1zZWNzVG9SZWNvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IHJlY29yZGluZ1N0YXR1czsKKyAgICBzaG9ydCBtZXRlckxldmVsOworICAgIHVuc2lnbmVkIGxvbmcgdG90YWxTYW1wbGVzVG9SZWNvcmQ7CisgICAgdW5zaWduZWQgbG9uZyBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZDsKKyAgICB1bnNpZ25lZCBsb25nIHRvdGFsTXNlY3NUb1JlY29yZDsKKyAgICB1bnNpZ25lZCBsb25nIG51bWJlck9mTXNlY3NSZWNvcmRlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQkdldFJlY29yZGluZ1N0YXR1cyhpblJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNvcmRpbmdTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0ZXJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbFNhbXBsZXNUb1JlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbE1zZWNzVG9SZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaGxsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZGluZ1N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXRlckxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2FtcGxlc1RvUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlc1JlY29yZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTXNlY3NUb1JlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZk1zZWNzUmVjb3JkZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJHZXREZXZpY2VJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0JT1NUeXBlIGluZm9UeXBlOwotCXZvaWQgKiBpbmZvRGF0YTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQkdldERldmljZUluZm8oaW5SZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgT1NUeXBlIGluZm9UeXBlOworICAgIHZvaWQgKiBpbmZvRGF0YTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQkdldERldmljZUluZm8oaW5SZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJTZXREZXZpY2VJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0JT1NUeXBlIGluZm9UeXBlOwotCXZvaWQgKiBpbmZvRGF0YTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlNldERldmljZUluZm8oaW5SZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgT1NUeXBlIGluZm9UeXBlOworICAgIHZvaWQgKiBpbmZvRGF0YTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQlNldERldmljZUluZm8oaW5SZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJNaWxsaXNlY29uZHNUb0J5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0JbG9uZyBtaWxsaXNlY29uZHM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJNaWxsaXNlY29uZHNUb0J5dGVzKGluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaXNlY29uZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBsb25nIG1pbGxpc2Vjb25kczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQk1pbGxpc2Vjb25kc1RvQnl0ZXMoaW5SZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpc2Vjb25kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWxvbmcgYnl0ZUNvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyhpblJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgbG9uZyBieXRlQ291bnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJCeXRlc1RvTWlsbGlzZWNvbmRzKGluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNuZF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJTUEIiLCAoUHlDRnVuY3Rpb24pU25kX1NQQiwgMSwKLQkgUHlEb2NfU1RSKE5VTEwpfSwKLQl7IlN5c0JlZXAiLCAoUHlDRnVuY3Rpb24pU25kX1N5c0JlZXAsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGR1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiU25kTmV3Q2hhbm5lbCIsIChQeUNGdW5jdGlvbilTbmRfU25kTmV3Q2hhbm5lbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgc3ludGgsIGxvbmcgaW5pdCwgUHlPYmplY3QqIHVzZXJSb3V0aW5lKSAtPiAoU25kQ2hhbm5lbFB0ciBjaGFuKSIpfSwKLQl7IlNuZFNvdW5kTWFuYWdlclZlcnNpb24iLCAoUHlDRnVuY3Rpb24pU25kX1NuZFNvdW5kTWFuYWdlclZlcnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE51bVZlcnNpb24gX3J2KSIpfSwKLQl7IlNuZE1hbmFnZXJTdGF0dXMiLCAoUHlDRnVuY3Rpb24pU25kX1NuZE1hbmFnZXJTdGF0dXMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHRoZUxlbmd0aCkgLT4gKFNNU3RhdHVzIHRoZVN0YXR1cykiKX0sCi0JeyJTbmRHZXRTeXNCZWVwU3RhdGUiLCAoUHlDRnVuY3Rpb24pU25kX1NuZEdldFN5c0JlZXBTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgc3lzQmVlcFN0YXRlKSIpfSwKLQl7IlNuZFNldFN5c0JlZXBTdGF0ZSIsIChQeUNGdW5jdGlvbilTbmRfU25kU2V0U3lzQmVlcFN0YXRlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzeXNCZWVwU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRTeXNCZWVwVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRTeXNCZWVwVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIGxldmVsKSIpfSwKLQl7IlNldFN5c0JlZXBWb2x1bWUiLCAoUHlDRnVuY3Rpb24pU25kX1NldFN5c0JlZXBWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJHZXREZWZhdWx0T3V0cHV0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXREZWZhdWx0T3V0cHV0Vm9sdW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIGxldmVsKSIpfSwKLQl7IlNldERlZmF1bHRPdXRwdXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pU25kX1NldERlZmF1bHRPdXRwdXRWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJHZXRTb3VuZEhlYWRlck9mZnNldCIsIChQeUNGdW5jdGlvbilTbmRfR2V0U291bmRIZWFkZXJPZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKFNuZExpc3RIYW5kbGUgc25kSGFuZGxlKSAtPiAobG9uZyBvZmZzZXQpIil9LAotCXsiR2V0Q29tcHJlc3Npb25JbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRDb21wcmVzc2lvbkluZm8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvbXByZXNzaW9uSUQsIE9TVHlwZSBmb3JtYXQsIHNob3J0IG51bUNoYW5uZWxzLCBzaG9ydCBzYW1wbGVTaXplKSAtPiAoQ29tcHJlc3Npb25JbmZvIGNwKSIpfSwKLQl7IlNldFNvdW5kUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilTbmRfU2V0U291bmRQcmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgdGhlVHlwZSwgSGFuZGxlIHNldHRpbmdzKSAtPiAoU3RyMjU1IG5hbWUpIil9LAotCXsiR2V0U291bmRQcmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRTb3VuZFByZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSB0aGVUeXBlLCBIYW5kbGUgc2V0dGluZ3MpIC0+IChTdHIyNTUgbmFtZSkiKX0sCi0JeyJHZXRDb21wcmVzc2lvbk5hbWUiLCAoUHlDRnVuY3Rpb24pU25kX0dldENvbXByZXNzaW9uTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGNvbXByZXNzaW9uVHlwZSkgLT4gKFN0cjI1NSBjb21wcmVzc2lvbk5hbWUpIil9LAotCXsiU1BCVmVyc2lvbiIsIChQeUNGdW5jdGlvbilTbmRfU1BCVmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTnVtVmVyc2lvbiBfcnYpIil9LAotCXsiU25kUmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRSZWNvcmQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGNvcm5lciwgT1NUeXBlIHF1YWxpdHkpIC0+IChTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZSkiKX0sCi0JeyJTUEJTaWduSW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQlNpZ25JbkRldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZGV2aWNlUmVmTnVtLCBTdHIyNTUgZGV2aWNlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IlNQQlNpZ25PdXREZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQlNpZ25PdXREZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRldmljZVJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IlNQQkdldEluZGV4ZWREZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldEluZGV4ZWREZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvdW50KSAtPiAoU3RyMjU1IGRldmljZU5hbWUsIEhhbmRsZSBkZXZpY2VJY29uSGFuZGxlKSIpfSwKLQl7IlNQQk9wZW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQk9wZW5EZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBkZXZpY2VOYW1lLCBzaG9ydCBwZXJtaXNzaW9uKSAtPiAobG9uZyBpblJlZk51bSkiKX0sCi0JeyJTUEJDbG9zZURldmljZSIsIChQeUNGdW5jdGlvbilTbmRfU1BCQ2xvc2VEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTUEJSZWNvcmQiLCAoUHlDRnVuY3Rpb24pU25kX1NQQlJlY29yZCwgMSwKLQkgUHlEb2NfU1RSKCIoU1BCUHRyIGluUGFyYW1QdHIsIEJvb2xlYW4gYXN5bmNoRmxhZykgLT4gTm9uZSIpfSwKLQl7IlNQQlBhdXNlUmVjb3JkaW5nIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJQYXVzZVJlY29yZGluZywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IlNQQlJlc3VtZVJlY29yZGluZyIsIChQeUNGdW5jdGlvbilTbmRfU1BCUmVzdW1lUmVjb3JkaW5nLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiBOb25lIil9LAotCXsiU1BCU3RvcFJlY29yZGluZyIsIChQeUNGdW5jdGlvbilTbmRfU1BCU3RvcFJlY29yZGluZywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IlNQQkdldFJlY29yZGluZ1N0YXR1cyIsIChQeUNGdW5jdGlvbilTbmRfU1BCR2V0UmVjb3JkaW5nU3RhdHVzLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiAoc2hvcnQgcmVjb3JkaW5nU3RhdHVzLCBzaG9ydCBtZXRlckxldmVsLCB1bnNpZ25lZCBsb25nIHRvdGFsU2FtcGxlc1RvUmVjb3JkLCB1bnNpZ25lZCBsb25nIG51bWJlck9mU2FtcGxlc1JlY29yZGVkLCB1bnNpZ25lZCBsb25nIHRvdGFsTXNlY3NUb1JlY29yZCwgdW5zaWduZWQgbG9uZyBudW1iZXJPZk1zZWNzUmVjb3JkZWQpIil9LAotCXsiU1BCR2V0RGV2aWNlSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfU1BCR2V0RGV2aWNlSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mb0RhdGEpIC0+IE5vbmUiKX0sCi0JeyJTUEJTZXREZXZpY2VJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTZXREZXZpY2VJbmZvLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtLCBPU1R5cGUgaW5mb1R5cGUsIHZvaWQgKiBpbmZvRGF0YSkgLT4gTm9uZSIpfSwKLQl7IlNQQk1pbGxpc2Vjb25kc1RvQnl0ZXMiLCAoUHlDRnVuY3Rpb24pU25kX1NQQk1pbGxpc2Vjb25kc1RvQnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IChsb25nIG1pbGxpc2Vjb25kcykiKX0sCi0JeyJTUEJCeXRlc1RvTWlsbGlzZWNvbmRzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJCeXRlc1RvTWlsbGlzZWNvbmRzLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiAobG9uZyBieXRlQ291bnQpIil9LAorICAgIHsiU1BCIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJTeXNCZWVwIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TeXNCZWVwLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNuZE5ld0NoYW5uZWwiLCAoUHlDRnVuY3Rpb24pU25kX1NuZE5ld0NoYW5uZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHN5bnRoLCBsb25nIGluaXQsIFB5T2JqZWN0KiB1c2VyUm91dGluZSkgLT4gKFNuZENoYW5uZWxQdHIgY2hhbikiKX0sCisgICAgeyJTbmRTb3VuZE1hbmFnZXJWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRTb3VuZE1hbmFnZXJWZXJzaW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChOdW1WZXJzaW9uIF9ydikiKX0sCisgICAgeyJTbmRNYW5hZ2VyU3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRNYW5hZ2VyU3RhdHVzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB0aGVMZW5ndGgpIC0+IChTTVN0YXR1cyB0aGVTdGF0dXMpIil9LAorICAgIHsiU25kR2V0U3lzQmVlcFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRHZXRTeXNCZWVwU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IHN5c0JlZXBTdGF0ZSkiKX0sCisgICAgeyJTbmRTZXRTeXNCZWVwU3RhdGUiLCAoUHlDRnVuY3Rpb24pU25kX1NuZFNldFN5c0JlZXBTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc3lzQmVlcFN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0U3lzQmVlcFZvbHVtZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0U3lzQmVlcFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBsZXZlbCkiKX0sCisgICAgeyJTZXRTeXNCZWVwVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TZXRTeXNCZWVwVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGxldmVsKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGVmYXVsdE91dHB1dFZvbHVtZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0RGVmYXVsdE91dHB1dFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBsZXZlbCkiKX0sCisgICAgeyJTZXREZWZhdWx0T3V0cHV0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TZXREZWZhdWx0T3V0cHV0Vm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGxldmVsKSAtPiBOb25lIil9LAorICAgIHsiR2V0U291bmRIZWFkZXJPZmZzZXQiLCAoUHlDRnVuY3Rpb24pU25kX0dldFNvdW5kSGVhZGVyT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIihTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZSkgLT4gKGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7IkdldENvbXByZXNzaW9uSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfR2V0Q29tcHJlc3Npb25JbmZvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb21wcmVzc2lvbklELCBPU1R5cGUgZm9ybWF0LCBzaG9ydCBudW1DaGFubmVscywgc2hvcnQgc2FtcGxlU2l6ZSkgLT4gKENvbXByZXNzaW9uSW5mbyBjcCkiKX0sCisgICAgeyJTZXRTb3VuZFByZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NldFNvdW5kUHJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHRoZVR5cGUsIEhhbmRsZSBzZXR0aW5ncykgLT4gKFN0cjI1NSBuYW1lKSIpfSwKKyAgICB7IkdldFNvdW5kUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0U291bmRQcmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgdGhlVHlwZSwgSGFuZGxlIHNldHRpbmdzKSAtPiAoU3RyMjU1IG5hbWUpIil9LAorICAgIHsiR2V0Q29tcHJlc3Npb25OYW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRDb21wcmVzc2lvbk5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjb21wcmVzc2lvblR5cGUpIC0+IChTdHIyNTUgY29tcHJlc3Npb25OYW1lKSIpfSwKKyAgICB7IlNQQlZlcnNpb24iLCAoUHlDRnVuY3Rpb24pU25kX1NQQlZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE51bVZlcnNpb24gX3J2KSIpfSwKKyAgICB7IlNuZFJlY29yZCIsIChQeUNGdW5jdGlvbilTbmRfU25kUmVjb3JkLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBjb3JuZXIsIE9TVHlwZSBxdWFsaXR5KSAtPiAoU25kTGlzdEhhbmRsZSBzbmRIYW5kbGUpIil9LAorICAgIHsiU1BCU2lnbkluRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTaWduSW5EZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGRldmljZVJlZk51bSwgU3RyMjU1IGRldmljZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJTUEJTaWduT3V0RGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTaWduT3V0RGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkZXZpY2VSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTUEJHZXRJbmRleGVkRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJHZXRJbmRleGVkRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb3VudCkgLT4gKFN0cjI1NSBkZXZpY2VOYW1lLCBIYW5kbGUgZGV2aWNlSWNvbkhhbmRsZSkiKX0sCisgICAgeyJTUEJPcGVuRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJPcGVuRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgZGV2aWNlTmFtZSwgc2hvcnQgcGVybWlzc2lvbikgLT4gKGxvbmcgaW5SZWZOdW0pIil9LAorICAgIHsiU1BCQ2xvc2VEZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkNsb3NlRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiU1BCUmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJSZWNvcmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNQQlB0ciBpblBhcmFtUHRyLCBCb29sZWFuIGFzeW5jaEZsYWcpIC0+IE5vbmUiKX0sCisgICAgeyJTUEJQYXVzZVJlY29yZGluZyIsIChQeUNGdW5jdGlvbilTbmRfU1BCUGF1c2VSZWNvcmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTUEJSZXN1bWVSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pU25kX1NQQlJlc3VtZVJlY29yZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IlNQQlN0b3BSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pU25kX1NQQlN0b3BSZWNvcmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTUEJHZXRSZWNvcmRpbmdTdGF0dXMiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldFJlY29yZGluZ1N0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gKHNob3J0IHJlY29yZGluZ1N0YXR1cywgc2hvcnQgbWV0ZXJMZXZlbCwgdW5zaWduZWQgbG9uZyB0b3RhbFNhbXBsZXNUb1JlY29yZCwgdW5zaWduZWQgbG9uZyBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwgdW5zaWduZWQgbG9uZyB0b3RhbE1zZWNzVG9SZWNvcmQsIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKSIpfSwKKyAgICB7IlNQQkdldERldmljZUluZm8iLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldERldmljZUluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0sIE9TVHlwZSBpbmZvVHlwZSwgdm9pZCAqIGluZm9EYXRhKSAtPiBOb25lIil9LAorICAgIHsiU1BCU2V0RGV2aWNlSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfU1BCU2V0RGV2aWNlSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mb0RhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJTUEJNaWxsaXNlY29uZHNUb0J5dGVzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJNaWxsaXNlY29uZHNUb0J5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiAobG9uZyBtaWxsaXNlY29uZHMpIil9LAorICAgIHsiU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyIsIChQeUNGdW5jdGlvbilTbmRfU1BCQnl0ZXNUb01pbGxpc2Vjb25kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gKGxvbmcgYnl0ZUNvdW50KSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xMDYxLDYyICsxMDYxLDYyIEBACiBzdGF0aWMgaW50CiBTbmRDaF9DYWxsQ2FsbEJhY2sodm9pZCAqYXJnKQogewotICAgICAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilhcmc7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzOwotICAgICAgICBQeU9iamVjdCAqcmVzOwotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8oaGhsKSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBwLT5vYl9jbWQuY21kLCBwLT5vYl9jbWQucGFyYW0xLCBwLT5vYl9jbWQucGFyYW0yKTsKLSAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfY2FsbGJhY2ssIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmIChyZXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIFB5X0RFQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gMDsKKyAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilhcmc7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8oaGhsKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAsIHAtPm9iX2NtZC5jbWQsIHAtPm9iX2NtZC5wYXJhbTEsIHAtPm9iX2NtZC5wYXJhbTIpOworICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KHAtPm9iX2NhbGxiYWNrLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFJvdXRpbmUgcGFzc2VkIHRvIE5ld1NuZENoYW5uZWwgLS0gc2NoZWR1bGUgYSBjYWxsIHRvIFNuZENoX0NhbGxDYWxsQmFjayAqLwogc3RhdGljIHBhc2NhbCB2b2lkCiBTbmRDaF9Vc2VyUm91dGluZShTbmRDaGFubmVsUHRyIGNoYW4sIFNuZENvbW1hbmQgKmNtZCkKIHsKLSAgICAgICAgU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopKGNoYW4tPnVzZXJJbmZvKTsKLSAgICAgICAgaWYgKHAtPm9iX2NhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBsb25nIEE1ID0gU2V0QTUocC0+b2JfQTUpOwotICAgICAgICAgICAgICAgIHAtPm9iX2NtZCA9ICpjbWQ7Ci0gICAgICAgICAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU25kQ2hfQ2FsbENhbGxCYWNrLCAodm9pZCAqKXApOwotICAgICAgICAgICAgICAgIFNldEE1KEE1KTsKLSAgICAgICAgfQorICAgIFNuZENoYW5uZWxPYmplY3QgKnAgPSAoU25kQ2hhbm5lbE9iamVjdCAqKShjaGFuLT51c2VySW5mbyk7CisgICAgaWYgKHAtPm9iX2NhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgbG9uZyBBNSA9IFNldEE1KHAtPm9iX0E1KTsKKyAgICAgICAgcC0+b2JfY21kID0gKmNtZDsKKyAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU25kQ2hfQ2FsbENhbGxCYWNrLCAodm9pZCAqKXApOworICAgICAgICBTZXRBNShBNSk7CisgICAgfQogfQogCiAvKiBTUEIgY2FsbGJhY2tzIC0gU2NoZWR1bGUgY2FsbGJhY2tzIHRvIFB5dGhvbiAqLwogc3RhdGljIGludAogU1BCX0NhbGxDYWxsQmFjayh2b2lkICphcmcpCiB7Ci0gICAgICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKilhcmc7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzOwotICAgICAgICBQeU9iamVjdCAqcmVzOworICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKilhcmc7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlczsKIAotICAgICAgICBpZiAoIHAtPm9iX3RoaXNjYWxsYmFjayA9PSAwICkgcmV0dXJuIDA7Ci0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTykiLCBwKTsKLSAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfdGhpc2NhbGxiYWNrLCBhcmdzKTsKLSAgICAgICAgcC0+b2JfdGhpc2NhbGxiYWNrID0gMDsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBQeV9ERUNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBwLT5vYl90aGlzY2FsbGJhY2sgPT0gMCApIHJldHVybiAwOworICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTykiLCBwKTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChwLT5vYl90aGlzY2FsbGJhY2ssIGFyZ3MpOworICAgIHAtPm9iX3RoaXNjYWxsYmFjayA9IDA7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIFNQQl9jb21wbGV0aW9uKFNQQlB0ciBteV9zcGIpCiB7Ci0gICAgICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKikobXlfc3BiLT51c2VyTG9uZyk7CisgICAgU1BCT2JqZWN0ICpwID0gKFNQQk9iamVjdCAqKShteV9zcGItPnVzZXJMb25nKTsKIAotICAgICAgICBpZiAocCAmJiBwLT5vYl9jb21wbGV0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBBNSA9IFNldEE1KHAtPm9iX0E1KTsKLSAgICAgICAgICAgICAgICBwLT5vYl90aGlzY2FsbGJhY2sgPSBwLT5vYl9jb21wbGV0aW9uOyAgLyogSG9wZSB3ZSBjYW5ub3QgZ2V0IHR3byBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU1BCX0NhbGxDYWxsQmFjaywgKHZvaWQgKilwKTsKLSAgICAgICAgICAgICAgICBTZXRBNShBNSk7Ci0gICAgICAgIH0KKyAgICBpZiAocCAmJiBwLT5vYl9jb21wbGV0aW9uKSB7CisgICAgICAgIGxvbmcgQTUgPSBTZXRBNShwLT5vYl9BNSk7CisgICAgICAgIHAtPm9iX3RoaXNjYWxsYmFjayA9IHAtPm9iX2NvbXBsZXRpb247ICAvKiBIb3BlIHdlIGNhbm5vdCBnZXQgdHdvIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU1BCX0NhbGxDYWxsQmFjaywgKHZvaWQgKilwKTsKKyAgICAgICAgU2V0QTUoQTUpOworICAgIH0KIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCkBAIC0xMTI0LDM2ICsxMTI0LDM2IEBACiAKIHZvaWQgaW5pdF9TbmQodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1NuZCIsIFNuZF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1NuZCIsIFNuZF9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlTbmRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChTbmRfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBTbmRfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlTbmRDaGFubmVsX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZTbmRDaGFubmVsX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmU25kQ2hhbm5lbF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNuZENoYW5uZWwiLCAoUHlPYmplY3QgKikmU25kQ2hhbm5lbF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlNuZENoYW5uZWxfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTbmRDaGFubmVsVHlwZSIsIChQeU9iamVjdCAqKSZTbmRDaGFubmVsX1R5cGUpOwotCVNQQl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmU1BCX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmU1BCX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU1BCIiwgKFB5T2JqZWN0ICopJlNQQl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlNQQl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNQQlR5cGUiLCAoUHlPYmplY3QgKikmU1BCX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFNuZF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFNuZF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFNuZF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFNuZENoYW5uZWxfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlNuZENoYW5uZWxfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZTbmRDaGFubmVsX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU25kQ2hhbm5lbCIsIChQeU9iamVjdCAqKSZTbmRDaGFubmVsX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmU25kQ2hhbm5lbF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNuZENoYW5uZWxUeXBlIiwgKFB5T2JqZWN0ICopJlNuZENoYW5uZWxfVHlwZSk7CisgICAgU1BCX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTUEJfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZTUEJfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTUEIiLCAoUHlPYmplY3QgKikmU1BCX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmU1BCX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU1BCVHlwZSIsIChQeU9iamVjdCAqKSZTUEJfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvdGUvX1RFbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy90ZS9fVEVtb2R1bGUuYwppbmRleCBmMTgyNjg4Li5hOTk4ZmM4IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy90ZS9fVEVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy90ZS9fVEVtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzYsMjEgKzM2LDIxIEBACiBUZXh0U3R5bGVfTmV3KFRleHRTdHlsZVB0ciBpdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbE8mIiwgKGxvbmcpaXRzZWxmLT50c0ZvbnQsIChsb25nKWl0c2VsZi0+dHNGYWNlLCAobG9uZylpdHNlbGYtPnRzU2l6ZSwgUWRSR0JfTmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT50c0NvbG9yKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGxsTyYiLCAobG9uZylpdHNlbGYtPnRzRm9udCwgKGxvbmcpaXRzZWxmLT50c0ZhY2UsIChsb25nKWl0c2VsZi0+dHNTaXplLCBRZFJHQl9OZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+dHNDb2xvcik7CiB9CiAKIHN0YXRpYyBpbnQKIFRleHRTdHlsZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBUZXh0U3R5bGVQdHIgcF9pdHNlbGYpCiB7Ci0gICAgICAgIGxvbmcgZm9udCwgZmFjZSwgc2l6ZTsKKyAgICBsb25nIGZvbnQsIGZhY2UsIHNpemU7CiAKLSAgICAgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGxPJiIsICZmb250LCAmZmFjZSwgJnNpemUsIFFkUkdCX0NvbnZlcnQsICZwX2l0c2VsZi0+dHNDb2xvcikgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBwX2l0c2VsZi0+dHNGb250ID0gKHNob3J0KWZvbnQ7Ci0gICAgICAgIHBfaXRzZWxmLT50c0ZhY2UgPSAoU3R5bGUpZmFjZTsKLSAgICAgICAgcF9pdHNlbGYtPnRzU2l6ZSA9IChzaG9ydClzaXplOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsbE8mIiwgJmZvbnQsICZmYWNlLCAmc2l6ZSwgUWRSR0JfQ29udmVydCwgJnBfaXRzZWxmLT50c0NvbG9yKSApCisgICAgICAgIHJldHVybiAwOworICAgIHBfaXRzZWxmLT50c0ZvbnQgPSAoc2hvcnQpZm9udDsKKyAgICBwX2l0c2VsZi0+dHNGYWNlID0gKFN0eWxlKWZhY2U7CisgICAgcF9pdHNlbGYtPnRzU2l6ZSA9IChzaG9ydClzaXplOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFX0Vycm9yOwpAQCAtNjIsOTE3ICs2Miw5MTcgQEAKICNkZWZpbmUgVEVPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmVEVfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVEVfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFRFT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVEVIYW5kbGUgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBURUhhbmRsZSBvYl9pdHNlbGY7CiB9IFRFT2JqZWN0OwogCiBQeU9iamVjdCAqVEVPYmpfTmV3KFRFSGFuZGxlIGl0c2VsZikKIHsKLQlURU9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoVEVfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBURSIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFRFT2JqZWN0LCAmVEVfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRFT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhURV9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIFRFIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoVEVPYmplY3QsICZURV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBURU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBURUhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFURU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJURSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChURU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFURU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJURSByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChURU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRFT2JqX2RlYWxsb2MoVEVPYmplY3QgKnNlbGYpCiB7Ci0JVEVEaXNwb3NlKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBURURpc3Bvc2Uoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2V0VGV4dChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqdGV4dF9faW5fXzsKLQlsb25nIHRleHRfX2xlbl9fOwotCWludCB0ZXh0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqdGV4dF9faW5fXzsKKyAgICBsb25nIHRleHRfX2xlbl9fOworICAgIGludCB0ZXh0X19pbl9sZW5fXzsKICNpZm5kZWYgVEVTZXRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soVEVTZXRUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdGV4dF9fbGVuX18gPSB0ZXh0X19pbl9sZW5fXzsKLQlURVNldFRleHQodGV4dF9faW5fXywgdGV4dF9fbGVuX18sCi0JICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X19pbl9fLCAmdGV4dF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOworICAgIFRFU2V0VGV4dCh0ZXh0X19pbl9fLCB0ZXh0X19sZW5fXywKKyAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0VGV4dChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ2hhcnNIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDaGFyc0hhbmRsZSBfcnY7CiAjaWZuZGVmIFRFR2V0VGV4dAotCVB5TWFjX1BSRUNIRUNLKFRFR2V0VGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFRleHQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURUdldFRleHQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFSWRsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURUlkbGUKLQlQeU1hY19QUkVDSEVDSyhURUlkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVJZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVJZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVNldFNlbGVjdChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBzZWxTdGFydDsKLQlsb25nIHNlbEVuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBzZWxTdGFydDsKKyAgICBsb25nIHNlbEVuZDsKICNpZm5kZWYgVEVTZXRTZWxlY3QKLQlQeU1hY19QUkVDSEVDSyhURVNldFNlbGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTZXRTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxFbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlURVNldFNlbGVjdChzZWxTdGFydCwKLQkgICAgICAgICAgICBzZWxFbmQsCi0JICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsRW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZXRTZWxlY3Qoc2VsU3RhcnQsCisgICAgICAgICAgICAgICAgc2VsRW5kLAorICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUFjdGl2YXRlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFQWN0aXZhdGUKLQlQeU1hY19QUkVDSEVDSyhURUFjdGl2YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUFjdGl2YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURUFjdGl2YXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVBY3RpdmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVEZWFjdGl2YXRlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFRGVhY3RpdmF0ZQotCVB5TWFjX1BSRUNIRUNLKFRFRGVhY3RpdmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVEZWFjdGl2YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURURlYWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURURlYWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFS2V5KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDaGFyUGFyYW1ldGVyIGtleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ2hhclBhcmFtZXRlciBrZXk7CiAjaWZuZGVmIFRFS2V5Ci0JUHlNYWNfUFJFQ0hFQ0soVEVLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAma2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVLZXkoa2V5LAotCSAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFS2V5KGtleSwKKyAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVDdXQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVDdXQKLQlQeU1hY19QUkVDSEVDSyhURUN1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVDdXQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ29weShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURUNvcHkKLQlQeU1hY19QUkVDSEVDSyhURUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVBhc3RlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFUGFzdGUKLQlQeU1hY19QUkVDSEVDSyhURVBhc3RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVBhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURVBhc3RlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVEZWxldGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVEZWxldGUKLQlQeU1hY19QUkVDSEVDSyhURURlbGV0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVEZWxldGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVEZWxldGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFSW5zZXJ0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICp0ZXh0X19pbl9fOwotCWxvbmcgdGV4dF9fbGVuX187Ci0JaW50IHRleHRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0X19pbl9fOworICAgIGxvbmcgdGV4dF9fbGVuX187CisgICAgaW50IHRleHRfX2luX2xlbl9fOwogI2lmbmRlZiBURUluc2VydAotCVB5TWFjX1BSRUNIRUNLKFRFSW5zZXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUluc2VydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X19pbl9fLCAmdGV4dF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQl0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOwotCVRFSW5zZXJ0KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X19pbl9fLCAmdGV4dF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOworICAgIFRFSW5zZXJ0KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAorICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVNldEFsaWdubWVudChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQganVzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQganVzdDsKICNpZm5kZWYgVEVTZXRBbGlnbm1lbnQKLQlQeU1hY19QUkVDSEVDSyhURVNldEFsaWdubWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTZXRBbGlnbm1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZXRBbGlnbm1lbnQoanVzdCwKLQkgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZXRBbGlnbm1lbnQoanVzdCwKKyAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVVcGRhdGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgclVwZGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByVXBkYXRlOwogI2lmbmRlZiBURVVwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKFRFVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVVwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyVXBkYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVVcGRhdGUoJnJVcGRhdGUsCi0JICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJVcGRhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVVwZGF0ZSgmclVwZGF0ZSwKKyAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTY3JvbGwoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgVEVTY3JvbGwKLQlQeU1hY19QUkVDSEVDSyhURVNjcm9sbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTY3JvbGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCVRFU2Nyb2xsKGRoLAotCSAgICAgICAgIGR2LAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTY3JvbGwoZGgsCisgICAgICAgICAgICAgZHYsCisgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2VsVmlldyhURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURVNlbFZpZXcKLQlQeU1hY19QUkVDSEVDSyhURVNlbFZpZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU2VsVmlldyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZWxWaWV3KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZWxWaWV3KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVBpblNjcm9sbChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OwogI2lmbmRlZiBURVBpblNjcm9sbAotCVB5TWFjX1BSRUNIRUNLKFRFUGluU2Nyb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVBpblNjcm9sbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVQaW5TY3JvbGwoZGgsCi0JICAgICAgICAgICAgZHYsCi0JICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVBpblNjcm9sbChkaCwKKyAgICAgICAgICAgICAgICBkdiwKKyAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVBdXRvVmlldyhURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBmQXV0bzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBmQXV0bzsKICNpZm5kZWYgVEVBdXRvVmlldwotCVB5TWFjX1BSRUNIRUNLKFRFQXV0b1ZpZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFQXV0b1ZpZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmQXV0bykpCi0JCXJldHVybiBOVUxMOwotCVRFQXV0b1ZpZXcoZkF1dG8sCi0JICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmQXV0bykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFQXV0b1ZpZXcoZkF1dG8sCisgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVDYWxUZXh0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFQ2FsVGV4dAotCVB5TWFjX1BSRUNIRUNLKFRFQ2FsVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDYWxUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURUNhbFRleHQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURUNhbFRleHQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0T2Zmc2V0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBQb2ludCBwdDsKICNpZm5kZWYgVEVHZXRPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhURUdldE9mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVHZXRPZmZzZXQocHQsCi0JICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVHZXRPZmZzZXQocHQsCisgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVHZXRQb2ludChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgX3J2OwotCXNob3J0IG9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgX3J2OworICAgIHNob3J0IG9mZnNldDsKICNpZm5kZWYgVEVHZXRQb2ludAotCVB5TWFjX1BSRUNIRUNLKFRFR2V0UG9pbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFR2V0UG9pbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFBvaW50KG9mZnNldCwKLQkgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0UG9pbnQob2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ2xpY2soVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0OwotCUJvb2xlYW4gZkV4dGVuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CisgICAgQm9vbGVhbiBmRXh0ZW5kOwogI2lmbmRlZiBURUNsaWNrCi0JUHlNYWNfUFJFQ0hFQ0soVEVDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDbGljayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZkV4dGVuZCkpCi0JCXJldHVybiBOVUxMOwotCVRFQ2xpY2socHQsCi0JICAgICAgICBmRXh0ZW5kLAotCSAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmRXh0ZW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVDbGljayhwdCwKKyAgICAgICAgZkV4dGVuZCwKKyAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2V0U3R5bGVIYW5kbGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRFU3R5bGVIYW5kbGUgdGhlSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBURVN0eWxlSGFuZGxlIHRoZUhhbmRsZTsKICNpZm5kZWYgVEVTZXRTdHlsZUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRFU2V0U3R5bGVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU2V0U3R5bGVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCVRFU2V0U3R5bGVIYW5kbGUodGhlSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVIYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVNldFN0eWxlSGFuZGxlKHRoZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUdldFN0eWxlSGFuZGxlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlURVN0eWxlSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVTdHlsZUhhbmRsZSBfcnY7CiAjaWZuZGVmIFRFR2V0U3R5bGVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhURUdldFN0eWxlSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFN0eWxlSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFN0eWxlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVHZXRTdHlsZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVHZXRTdHlsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgb2Zmc2V0OwotCVRleHRTdHlsZSB0aGVTdHlsZTsKLQlzaG9ydCBsaW5lSGVpZ2h0OwotCXNob3J0IGZvbnRBc2NlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IG9mZnNldDsKKyAgICBUZXh0U3R5bGUgdGhlU3R5bGU7CisgICAgc2hvcnQgbGluZUhlaWdodDsKKyAgICBzaG9ydCBmb250QXNjZW50OwogI2lmbmRlZiBURUdldFN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCVRFR2V0U3R5bGUob2Zmc2V0LAotCSAgICAgICAgICAgJnRoZVN0eWxlLAotCSAgICAgICAgICAgJmxpbmVIZWlnaHQsCi0JICAgICAgICAgICAmZm9udEFzY2VudCwKLQkgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBUZXh0U3R5bGVfTmV3LCAmdGhlU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICBmb250QXNjZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFR2V0U3R5bGUob2Zmc2V0LAorICAgICAgICAgICAgICAgJnRoZVN0eWxlLAorICAgICAgICAgICAgICAgJmxpbmVIZWlnaHQsCisgICAgICAgICAgICAgICAmZm9udEFzY2VudCwKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0U3R5bGVfTmV3LCAmdGhlU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb250QXNjZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVN0eWxlUGFzdGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVTdHlsZVBhc3RlCi0JUHlNYWNfUFJFQ0hFQ0soVEVTdHlsZVBhc3RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVN0eWxlUGFzdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFU3R5bGVQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFU3R5bGVQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTZXRTdHlsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbW9kZTsKLQlUZXh0U3R5bGUgbmV3U3R5bGU7Ci0JQm9vbGVhbiBmUmVkcmF3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOworICAgIFRleHRTdHlsZSBuZXdTdHlsZTsKKyAgICBCb29sZWFuIGZSZWRyYXc7CiAjaWZuZGVmIFRFU2V0U3R5bGUKLQlQeU1hY19QUkVDSEVDSyhURVNldFN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZuZXdTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZSZWRyYXcpKQotCQlyZXR1cm4gTlVMTDsKLQlURVNldFN0eWxlKG1vZGUsCi0JICAgICAgICAgICAmbmV3U3R5bGUsCi0JICAgICAgICAgICBmUmVkcmF3LAotCSAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZuZXdTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZSZWRyYXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVNldFN0eWxlKG1vZGUsCisgICAgICAgICAgICAgICAmbmV3U3R5bGUsCisgICAgICAgICAgICAgICBmUmVkcmF3LAorICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFUmVwbGFjZVN0eWxlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOwotCVRleHRTdHlsZSBvbGRTdHlsZTsKLQlUZXh0U3R5bGUgbmV3U3R5bGU7Ci0JQm9vbGVhbiBmUmVkcmF3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOworICAgIFRleHRTdHlsZSBvbGRTdHlsZTsKKyAgICBUZXh0U3R5bGUgbmV3U3R5bGU7CisgICAgQm9vbGVhbiBmUmVkcmF3OwogI2lmbmRlZiBURVJlcGxhY2VTdHlsZQotCVB5TWFjX1BSRUNIRUNLKFRFUmVwbGFjZVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVJlcGxhY2VTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZvbGRTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZuZXdTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZSZWRyYXcpKQotCQlyZXR1cm4gTlVMTDsKLQlURVJlcGxhY2VTdHlsZShtb2RlLAotCSAgICAgICAgICAgICAgICZvbGRTdHlsZSwKLQkgICAgICAgICAgICAgICAmbmV3U3R5bGUsCi0JICAgICAgICAgICAgICAgZlJlZHJhdywKLQkgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmb2xkU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmbmV3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmUmVkcmF3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVSZXBsYWNlU3R5bGUobW9kZSwKKyAgICAgICAgICAgICAgICAgICAmb2xkU3R5bGUsCisgICAgICAgICAgICAgICAgICAgJm5ld1N0eWxlLAorICAgICAgICAgICAgICAgICAgIGZSZWRyYXcsCisgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0U3R5bGVTY3JhcEhhbmRsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RTY3JwSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RTY3JwSGFuZGxlIF9ydjsKICNpZm5kZWYgVEVHZXRTdHlsZVNjcmFwSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZVNjcmFwSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFN0eWxlU2NyYXBIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFR2V0U3R5bGVTY3JhcEhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0U3R5bGVTY3JhcEhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTdHlsZUluc2VydChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqdGV4dF9faW5fXzsKLQlsb25nIHRleHRfX2xlbl9fOwotCWludCB0ZXh0X19pbl9sZW5fXzsKLQlTdFNjcnBIYW5kbGUgaFNUOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0X19pbl9fOworICAgIGxvbmcgdGV4dF9fbGVuX187CisgICAgaW50IHRleHRfX2luX2xlbl9fOworICAgIFN0U2NycEhhbmRsZSBoU1Q7CiAjaWZuZGVmIFRFU3R5bGVJbnNlcnQKLQlQeU1hY19QUkVDSEVDSyhURVN0eWxlSW5zZXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVN0eWxlSW5zZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmhTVCkpCi0JCXJldHVybiBOVUxMOwotCXRleHRfX2xlbl9fID0gdGV4dF9faW5fbGVuX187Ci0JVEVTdHlsZUluc2VydCh0ZXh0X19pbl9fLCB0ZXh0X19sZW5fXywKLQkgICAgICAgICAgICAgIGhTVCwKLQkgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRfX2luX18sICZ0ZXh0X19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoU1QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOworICAgIFRFU3R5bGVJbnNlcnQodGV4dF9faW5fXywgdGV4dF9fbGVuX18sCisgICAgICAgICAgICAgICAgICBoU1QsCisgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVHZXRIZWlnaHQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCWxvbmcgZW5kTGluZTsKLQlsb25nIHN0YXJ0TGluZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgbG9uZyBlbmRMaW5lOworICAgIGxvbmcgc3RhcnRMaW5lOwogI2lmbmRlZiBURUdldEhlaWdodAotCVB5TWFjX1BSRUNIRUNLKFRFR2V0SGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldEhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmRMaW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRMaW5lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVHZXRIZWlnaHQoZW5kTGluZSwKLQkgICAgICAgICAgICAgICAgICBzdGFydExpbmUsCi0JICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0TGluZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0SGVpZ2h0KGVuZExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ29udGludW91c1N0eWxlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlzaG9ydCBtb2RlOwotCVRleHRTdHlsZSBhU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIHNob3J0IG1vZGU7CisgICAgVGV4dFN0eWxlIGFTdHlsZTsKICNpZm5kZWYgVEVDb250aW51b3VzU3R5bGUKLQlQeU1hY19QUkVDSEVDSyhURUNvbnRpbnVvdXNTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDb250aW51b3VzU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmYVN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVDb250aW51b3VzU3R5bGUoJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmFTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX05ldywgJmFTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmYVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVDb250aW51b3VzU3R5bGUoJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX05ldywgJmFTdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVVc2VTdHlsZVNjcmFwKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHJhbmdlU3RhcnQ7Ci0JbG9uZyByYW5nZUVuZDsKLQlTdFNjcnBIYW5kbGUgbmV3U3R5bGVzOwotCUJvb2xlYW4gZlJlZHJhdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyByYW5nZVN0YXJ0OworICAgIGxvbmcgcmFuZ2VFbmQ7CisgICAgU3RTY3JwSGFuZGxlIG5ld1N0eWxlczsKKyAgICBCb29sZWFuIGZSZWRyYXc7CiAjaWZuZGVmIFRFVXNlU3R5bGVTY3JhcAotCVB5TWFjX1BSRUNIRUNLKFRFVXNlU3R5bGVTY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVVc2VTdHlsZVNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZyYW5nZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZuZXdTdHlsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVkcmF3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVVc2VTdHlsZVNjcmFwKHJhbmdlU3RhcnQsCi0JICAgICAgICAgICAgICAgIHJhbmdlRW5kLAotCSAgICAgICAgICAgICAgICBuZXdTdHlsZXMsCi0JICAgICAgICAgICAgICAgIGZSZWRyYXcsCi0JICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbmV3U3R5bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZHJhdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFVXNlU3R5bGVTY3JhcChyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICByYW5nZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGVzLAorICAgICAgICAgICAgICAgICAgICBmUmVkcmF3LAorICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVOdW1TdHlsZXMoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCWxvbmcgcmFuZ2VTdGFydDsKLQlsb25nIHJhbmdlRW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBsb25nIHJhbmdlU3RhcnQ7CisgICAgbG9uZyByYW5nZUVuZDsKICNpZm5kZWYgVEVOdW1TdHlsZXMKLQlQeU1hY19QUkVDSEVDSyhURU51bVN0eWxlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVOdW1TdHlsZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlRW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVOdW1TdHlsZXMocmFuZ2VTdGFydCwKLQkgICAgICAgICAgICAgICAgICByYW5nZUVuZCwKLQkgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VFbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURU51bVN0eWxlcyhyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIHJhbmdlRW5kLAorICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFRmVhdHVyZUZsYWcoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlzaG9ydCBmZWF0dXJlOwotCXNob3J0IGFjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIHNob3J0IGZlYXR1cmU7CisgICAgc2hvcnQgYWN0aW9uOwogI2lmbmRlZiBURUZlYXR1cmVGbGFnCi0JUHlNYWNfUFJFQ0hFQ0soVEVGZWF0dXJlRmxhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVGZWF0dXJlRmxhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmZWF0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVGZWF0dXJlRmxhZyhmZWF0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFRmVhdHVyZUZsYWcoZmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0SGlsaXRlUmduKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgVEVHZXRIaWxpdGVSZ24KLQlQeU1hY19QUkVDSEVDSyhURUdldEhpbGl0ZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRIaWxpdGVSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBURUdldEhpbGl0ZVJnbihyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVEVHZXRIaWxpdGVSZ24ocmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9hc19SZXNvdXJjZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgYXNfUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhhc19SZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soYXNfUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVEVPYmpfbWV0aG9kc1tdID0gewotCXsiVEVTZXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2V0VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHQpIC0+IE5vbmUiKX0sCi0JeyJURUdldFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRUZXh0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDaGFyc0hhbmRsZSBfcnYpIil9LAotCXsiVEVJZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVTZXRTZWxlY3QiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRTZWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgc2VsU3RhcnQsIGxvbmcgc2VsRW5kKSAtPiBOb25lIil9LAotCXsiVEVBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URUFjdGl2YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURURlYWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVEZWFjdGl2YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURUtleSIsIChQeUNGdW5jdGlvbilURU9ial9URUtleSwgMSwKLQkgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBrZXkpIC0+IE5vbmUiKX0sCi0JeyJURUN1dCIsIChQeUNGdW5jdGlvbilURU9ial9URUN1dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVDb3B5IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVQYXN0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVBhc3RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURURlbGV0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URURlbGV0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVJbnNlcnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVJbnNlcnQsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0KSAtPiBOb25lIil9LAotCXsiVEVTZXRBbGlnbm1lbnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRBbGlnbm1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGp1c3QpIC0+IE5vbmUiKX0sCi0JeyJURVVwZGF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVVwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByVXBkYXRlKSAtPiBOb25lIil9LAotCXsiVEVTY3JvbGwiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTY3JvbGwsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7IlRFU2VsVmlldyIsIChQeUNGdW5jdGlvbilURU9ial9URVNlbFZpZXcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRFUGluU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUGluU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJURUF1dG9WaWV3IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQXV0b1ZpZXcsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZkF1dG8pIC0+IE5vbmUiKX0sCi0JeyJURUNhbFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDYWxUZXh0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURUdldE9mZnNldCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldE9mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiVEVHZXRQb2ludCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFBvaW50LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChQb2ludCBfcnYpIil9LAotCXsiVEVDbGljayIsIChQeUNGdW5jdGlvbilURU9ial9URUNsaWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgQm9vbGVhbiBmRXh0ZW5kKSAtPiBOb25lIil9LAotCXsiVEVTZXRTdHlsZUhhbmRsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihURVN0eWxlSGFuZGxlIHRoZUhhbmRsZSkgLT4gTm9uZSIpfSwKLQl7IlRFR2V0U3R5bGVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRTdHlsZUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVEVTdHlsZUhhbmRsZSBfcnYpIil9LAotCXsiVEVHZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFN0eWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChUZXh0U3R5bGUgdGhlU3R5bGUsIHNob3J0IGxpbmVIZWlnaHQsIHNob3J0IGZvbnRBc2NlbnQpIil9LAotCXsiVEVTdHlsZVBhc3RlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVQYXN0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVTZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgbmV3U3R5bGUsIEJvb2xlYW4gZlJlZHJhdykgLT4gTm9uZSIpfSwKLQl7IlRFUmVwbGFjZVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUmVwbGFjZVN0eWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgb2xkU3R5bGUsIFRleHRTdHlsZSBuZXdTdHlsZSwgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAotCXsiVEVHZXRTdHlsZVNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0U3R5bGVTY3JhcEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU3RTY3JwSGFuZGxlIF9ydikiKX0sCi0JeyJURVN0eWxlSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVJbnNlcnQsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0LCBTdFNjcnBIYW5kbGUgaFNUKSAtPiBOb25lIil9LAotCXsiVEVHZXRIZWlnaHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZW5kTGluZSwgbG9uZyBzdGFydExpbmUpIC0+IChsb25nIF9ydikiKX0sCi0JeyJURUNvbnRpbnVvdXNTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUNvbnRpbnVvdXNTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSwgVGV4dFN0eWxlIGFTdHlsZSkgLT4gKEJvb2xlYW4gX3J2LCBzaG9ydCBtb2RlLCBUZXh0U3R5bGUgYVN0eWxlKSIpfSwKLQl7IlRFVXNlU3R5bGVTY3JhcCIsIChQeUNGdW5jdGlvbilURU9ial9URVVzZVN0eWxlU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCwgU3RTY3JwSGFuZGxlIG5ld1N0eWxlcywgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAotCXsiVEVOdW1TdHlsZXMiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVOdW1TdHlsZXMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IlRFRmVhdHVyZUZsYWciLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVGZWF0dXJlRmxhZywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZmVhdHVyZSwgc2hvcnQgYWN0aW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlRFR2V0SGlsaXRlUmduIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0SGlsaXRlUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAotCXsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pVEVPYmpfYXNfUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiVEVTZXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2V0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHQpIC0+IE5vbmUiKX0sCisgICAgeyJURUdldFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRUZXh0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDaGFyc0hhbmRsZSBfcnYpIil9LAorICAgIHsiVEVJZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFSWRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRTZWxlY3QiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgc2VsU3RhcnQsIGxvbmcgc2VsRW5kKSAtPiBOb25lIil9LAorICAgIHsiVEVBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URUFjdGl2YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURURlYWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVEZWFjdGl2YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURUtleSIsIChQeUNGdW5jdGlvbilURU9ial9URUtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBrZXkpIC0+IE5vbmUiKX0sCisgICAgeyJURUN1dCIsIChQeUNGdW5jdGlvbilURU9ial9URUN1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVDb3B5IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVQYXN0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVBhc3RlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURURlbGV0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URURlbGV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVJbnNlcnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVJbnNlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0KSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRBbGlnbm1lbnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRBbGlnbm1lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGp1c3QpIC0+IE5vbmUiKX0sCisgICAgeyJURVVwZGF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByVXBkYXRlKSAtPiBOb25lIil9LAorICAgIHsiVEVTY3JvbGwiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTY3JvbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKKyAgICB7IlRFU2VsVmlldyIsIChQeUNGdW5jdGlvbilURU9ial9URVNlbFZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFUGluU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUGluU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJURUF1dG9WaWV3IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQXV0b1ZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gZkF1dG8pIC0+IE5vbmUiKX0sCisgICAgeyJURUNhbFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDYWxUZXh0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURUdldE9mZnNldCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldE9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVEVHZXRQb2ludCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFBvaW50LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChQb2ludCBfcnYpIil9LAorICAgIHsiVEVDbGljayIsIChQeUNGdW5jdGlvbilURU9ial9URUNsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgQm9vbGVhbiBmRXh0ZW5kKSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRTdHlsZUhhbmRsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihURVN0eWxlSGFuZGxlIHRoZUhhbmRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IlRFR2V0U3R5bGVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRTdHlsZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVEVTdHlsZUhhbmRsZSBfcnYpIil9LAorICAgIHsiVEVHZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChUZXh0U3R5bGUgdGhlU3R5bGUsIHNob3J0IGxpbmVIZWlnaHQsIHNob3J0IGZvbnRBc2NlbnQpIil9LAorICAgIHsiVEVTdHlsZVBhc3RlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVQYXN0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgbmV3U3R5bGUsIEJvb2xlYW4gZlJlZHJhdykgLT4gTm9uZSIpfSwKKyAgICB7IlRFUmVwbGFjZVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUmVwbGFjZVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgb2xkU3R5bGUsIFRleHRTdHlsZSBuZXdTdHlsZSwgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAorICAgIHsiVEVHZXRTdHlsZVNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0U3R5bGVTY3JhcEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3RTY3JwSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVN0eWxlSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVJbnNlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0LCBTdFNjcnBIYW5kbGUgaFNUKSAtPiBOb25lIil9LAorICAgIHsiVEVHZXRIZWlnaHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZW5kTGluZSwgbG9uZyBzdGFydExpbmUpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJURUNvbnRpbnVvdXNTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUNvbnRpbnVvdXNTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSwgVGV4dFN0eWxlIGFTdHlsZSkgLT4gKEJvb2xlYW4gX3J2LCBzaG9ydCBtb2RlLCBUZXh0U3R5bGUgYVN0eWxlKSIpfSwKKyAgICB7IlRFVXNlU3R5bGVTY3JhcCIsIChQeUNGdW5jdGlvbilURU9ial9URVVzZVN0eWxlU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCwgU3RTY3JwSGFuZGxlIG5ld1N0eWxlcywgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAorICAgIHsiVEVOdW1TdHlsZXMiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVOdW1TdHlsZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlRFRmVhdHVyZUZsYWciLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVGZWF0dXJlRmxhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZmVhdHVyZSwgc2hvcnQgYWN0aW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlRFR2V0SGlsaXRlUmduIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0SGlsaXRlUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pVEVPYmpfYXNfUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfZGVzdFJlY3QoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5kZXN0UmVjdCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5kZXN0UmVjdCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2Rlc3RSZWN0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfdmlld1JlY3QoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT52aWV3UmVjdCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT52aWV3UmVjdCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3ZpZXdSZWN0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfc2VsUmVjdChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICYoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFJlY3QpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+c2VsUmVjdCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3NlbFJlY3QgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9saW5lSGVpZ2h0KFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5saW5lSGVpZ2h0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bGluZUhlaWdodCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2xpbmVIZWlnaHQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9mb250QXNjZW50KFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5mb250QXNjZW50KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+Zm9udEFzY2VudCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2ZvbnRBc2NlbnQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9zZWxQb2ludChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFBvaW50KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFBvaW50KTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfc2VsUG9pbnQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9zZWxTdGFydChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+c2VsU3RhcnQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxTdGFydCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3NlbFN0YXJ0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfc2VsRW5kKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxFbmQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxFbmQpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF9zZWxFbmQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9hY3RpdmUoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmFjdGl2ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmFjdGl2ZSk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2FjdGl2ZSBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X2p1c3QoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmp1c3QpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5qdXN0KTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfanVzdCBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X3RlTGVuZ3RoKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50ZUxlbmd0aCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnRlTGVuZ3RoKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfdGVMZW5ndGggTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF90eEZvbnQoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4Rm9udCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4Rm9udCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3R4Rm9udCBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X3R4RmFjZShURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhGYWNlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhGYWNlKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfdHhGYWNlIE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfdHhNb2RlKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eE1vZGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eE1vZGUpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF90eE1vZGUgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF90eFNpemUoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4U2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4U2l6ZSk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3R4U2l6ZSBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X25MaW5lcyhURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bkxpbmVzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bkxpbmVzKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfbkxpbmVzIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIFRFT2JqX2dldHNldGxpc3RbXSA9IHsKLQl7ImRlc3RSZWN0IiwgKGdldHRlcilURU9ial9nZXRfZGVzdFJlY3QsIChzZXR0ZXIpVEVPYmpfc2V0X2Rlc3RSZWN0LCAiRGVzdGluYXRpb24gcmVjdGFuZ2xlIn0sCi0JeyJ2aWV3UmVjdCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3ZpZXdSZWN0LCAoc2V0dGVyKVRFT2JqX3NldF92aWV3UmVjdCwgIlZpZXdpbmcgcmVjdGFuZ2xlIn0sCi0JeyJzZWxSZWN0IiwgKGdldHRlcilURU9ial9nZXRfc2VsUmVjdCwgKHNldHRlcilURU9ial9zZXRfc2VsUmVjdCwgIlNlbGVjdGlvbiByZWN0YW5nbGUifSwKLQl7ImxpbmVIZWlnaHQiLCAoZ2V0dGVyKVRFT2JqX2dldF9saW5lSGVpZ2h0LCAoc2V0dGVyKVRFT2JqX3NldF9saW5lSGVpZ2h0LCAiSGVpZ2h0IG9mIGEgbGluZSJ9LAotCXsiZm9udEFzY2VudCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2ZvbnRBc2NlbnQsIChzZXR0ZXIpVEVPYmpfc2V0X2ZvbnRBc2NlbnQsICJBc2NlbnQgb2YgYSBsaW5lIn0sCi0JeyJzZWxQb2ludCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbFBvaW50LCAoc2V0dGVyKVRFT2JqX3NldF9zZWxQb2ludCwgIlNlbGVjdGlvbiBQb2ludCJ9LAotCXsic2VsU3RhcnQiLCAoZ2V0dGVyKVRFT2JqX2dldF9zZWxTdGFydCwgKHNldHRlcilURU9ial9zZXRfc2VsU3RhcnQsICJTdGFydCBvZiBzZWxlY3Rpb24ifSwKLQl7InNlbEVuZCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbEVuZCwgKHNldHRlcilURU9ial9zZXRfc2VsRW5kLCAiRW5kIG9mIHNlbGVjdGlvbiJ9LAotCXsiYWN0aXZlIiwgKGdldHRlcilURU9ial9nZXRfYWN0aXZlLCAoc2V0dGVyKVRFT2JqX3NldF9hY3RpdmUsICJUQkQifSwKLQl7Imp1c3QiLCAoZ2V0dGVyKVRFT2JqX2dldF9qdXN0LCAoc2V0dGVyKVRFT2JqX3NldF9qdXN0LCAiSnVzdGlmaWNhdGlvbiJ9LAotCXsidGVMZW5ndGgiLCAoZ2V0dGVyKVRFT2JqX2dldF90ZUxlbmd0aCwgKHNldHRlcilURU9ial9zZXRfdGVMZW5ndGgsICJUQkQifSwKLQl7InR4Rm9udCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4Rm9udCwgKHNldHRlcilURU9ial9zZXRfdHhGb250LCAiQ3VycmVudCBmb250In0sCi0JeyJ0eEZhY2UiLCAoZ2V0dGVyKVRFT2JqX2dldF90eEZhY2UsIChzZXR0ZXIpVEVPYmpfc2V0X3R4RmFjZSwgIkN1cnJlbnQgZm9udCB2YXJpYW50In0sCi0JeyJ0eE1vZGUiLCAoZ2V0dGVyKVRFT2JqX2dldF90eE1vZGUsIChzZXR0ZXIpVEVPYmpfc2V0X3R4TW9kZSwgIkN1cnJlbnQgdGV4dC1kcmF3aW5nIG1vZGUifSwKLQl7InR4U2l6ZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4U2l6ZSwgKHNldHRlcilURU9ial9zZXRfdHhTaXplLCAiQ3VycmVudCBmb250IHNpemUifSwKLQl7Im5MaW5lcyIsIChnZXR0ZXIpVEVPYmpfZ2V0X25MaW5lcywgKHNldHRlcilURU9ial9zZXRfbkxpbmVzLCAiVEJEIn0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGVzdFJlY3QiLCAoZ2V0dGVyKVRFT2JqX2dldF9kZXN0UmVjdCwgKHNldHRlcilURU9ial9zZXRfZGVzdFJlY3QsICJEZXN0aW5hdGlvbiByZWN0YW5nbGUifSwKKyAgICB7InZpZXdSZWN0IiwgKGdldHRlcilURU9ial9nZXRfdmlld1JlY3QsIChzZXR0ZXIpVEVPYmpfc2V0X3ZpZXdSZWN0LCAiVmlld2luZyByZWN0YW5nbGUifSwKKyAgICB7InNlbFJlY3QiLCAoZ2V0dGVyKVRFT2JqX2dldF9zZWxSZWN0LCAoc2V0dGVyKVRFT2JqX3NldF9zZWxSZWN0LCAiU2VsZWN0aW9uIHJlY3RhbmdsZSJ9LAorICAgIHsibGluZUhlaWdodCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2xpbmVIZWlnaHQsIChzZXR0ZXIpVEVPYmpfc2V0X2xpbmVIZWlnaHQsICJIZWlnaHQgb2YgYSBsaW5lIn0sCisgICAgeyJmb250QXNjZW50IiwgKGdldHRlcilURU9ial9nZXRfZm9udEFzY2VudCwgKHNldHRlcilURU9ial9zZXRfZm9udEFzY2VudCwgIkFzY2VudCBvZiBhIGxpbmUifSwKKyAgICB7InNlbFBvaW50IiwgKGdldHRlcilURU9ial9nZXRfc2VsUG9pbnQsIChzZXR0ZXIpVEVPYmpfc2V0X3NlbFBvaW50LCAiU2VsZWN0aW9uIFBvaW50In0sCisgICAgeyJzZWxTdGFydCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbFN0YXJ0LCAoc2V0dGVyKVRFT2JqX3NldF9zZWxTdGFydCwgIlN0YXJ0IG9mIHNlbGVjdGlvbiJ9LAorICAgIHsic2VsRW5kIiwgKGdldHRlcilURU9ial9nZXRfc2VsRW5kLCAoc2V0dGVyKVRFT2JqX3NldF9zZWxFbmQsICJFbmQgb2Ygc2VsZWN0aW9uIn0sCisgICAgeyJhY3RpdmUiLCAoZ2V0dGVyKVRFT2JqX2dldF9hY3RpdmUsIChzZXR0ZXIpVEVPYmpfc2V0X2FjdGl2ZSwgIlRCRCJ9LAorICAgIHsianVzdCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2p1c3QsIChzZXR0ZXIpVEVPYmpfc2V0X2p1c3QsICJKdXN0aWZpY2F0aW9uIn0sCisgICAgeyJ0ZUxlbmd0aCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3RlTGVuZ3RoLCAoc2V0dGVyKVRFT2JqX3NldF90ZUxlbmd0aCwgIlRCRCJ9LAorICAgIHsidHhGb250IiwgKGdldHRlcilURU9ial9nZXRfdHhGb250LCAoc2V0dGVyKVRFT2JqX3NldF90eEZvbnQsICJDdXJyZW50IGZvbnQifSwKKyAgICB7InR4RmFjZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4RmFjZSwgKHNldHRlcilURU9ial9zZXRfdHhGYWNlLCAiQ3VycmVudCBmb250IHZhcmlhbnQifSwKKyAgICB7InR4TW9kZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4TW9kZSwgKHNldHRlcilURU9ial9zZXRfdHhNb2RlLCAiQ3VycmVudCB0ZXh0LWRyYXdpbmcgbW9kZSJ9LAorICAgIHsidHhTaXplIiwgKGdldHRlcilURU9ial9nZXRfdHhTaXplLCAoc2V0dGVyKVRFT2JqX3NldF90eFNpemUsICJDdXJyZW50IGZvbnQgc2l6ZSJ9LAorICAgIHsibkxpbmVzIiwgKGdldHRlcilURU9ial9nZXRfbkxpbmVzLCAoc2V0dGVyKVRFT2JqX3NldF9uTGluZXMsICJUQkQifSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTk4Nyw2MSArOTg3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVRFSGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVEVIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVEVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChURU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBURU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFRFT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFRFT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFRFX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1RFLlRFIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVEVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBURU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBURU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVEVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFRFT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRFT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVRFT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVRFT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlURU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlURU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVRFT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfVEUuVEUiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihURU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFRFT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFRFT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBURU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgVEVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgVEVPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVEVPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgVEVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFRFT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFRFT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgVEVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMDQ5LDI1NyArMTA0OSwyNTcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpURV9URVNjcmFwSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBURVNjcmFwSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVTY3JhcEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTY3JhcEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVTY3JhcEhhbmRsZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVTY3JhcEhhbmRsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9URUdldFNjcmFwTGVuZ3RoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIFRFR2V0U2NyYXBMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhURUdldFNjcmFwTGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFNjcmFwTGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFNjcmFwTGVuZ3RoKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0U2NyYXBMZW5ndGgoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9URU5ldyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVEVIYW5kbGUgX3J2OwotCVJlY3QgZGVzdFJlY3Q7Ci0JUmVjdCB2aWV3UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVIYW5kbGUgX3J2OworICAgIFJlY3QgZGVzdFJlY3Q7CisgICAgUmVjdCB2aWV3UmVjdDsKICNpZm5kZWYgVEVOZXcKLQlQeU1hY19QUkVDSEVDSyhURU5ldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVOZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXdSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVOZXcoJmRlc3RSZWN0LAotCSAgICAgICAgICAgICZ2aWV3UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXdSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVOZXcoJmRlc3RSZWN0LAorICAgICAgICAgICAgICAgICZ2aWV3UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVUZXh0Qm94KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICp0ZXh0X19pbl9fOwotCWxvbmcgdGV4dF9fbGVuX187Ci0JaW50IHRleHRfX2luX2xlbl9fOwotCVJlY3QgYm94OwotCXNob3J0IGp1c3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKnRleHRfX2luX187CisgICAgbG9uZyB0ZXh0X19sZW5fXzsKKyAgICBpbnQgdGV4dF9faW5fbGVuX187CisgICAgUmVjdCBib3g7CisgICAgc2hvcnQganVzdDsKICNpZm5kZWYgVEVUZXh0Qm94Ci0JUHlNYWNfUFJFQ0hFQ0soVEVUZXh0Qm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVRleHRCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94LAotCSAgICAgICAgICAgICAgICAgICAgICAmanVzdCkpCi0JCXJldHVybiBOVUxMOwotCXRleHRfX2xlbl9fID0gdGV4dF9faW5fbGVuX187Ci0JVEVUZXh0Qm94KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAotCSAgICAgICAgICAmYm94LAotCSAgICAgICAgICBqdXN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmanVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRleHRfX2xlbl9fID0gdGV4dF9faW5fbGVuX187CisgICAgVEVUZXh0Qm94KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAorICAgICAgICAgICAgICAmYm94LAorICAgICAgICAgICAgICBqdXN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVTdHlsZU5ldyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVEVIYW5kbGUgX3J2OwotCVJlY3QgZGVzdFJlY3Q7Ci0JUmVjdCB2aWV3UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVIYW5kbGUgX3J2OworICAgIFJlY3QgZGVzdFJlY3Q7CisgICAgUmVjdCB2aWV3UmVjdDsKICNpZm5kZWYgVEVTdHlsZU5ldwotCVB5TWFjX1BSRUNIRUNLKFRFU3R5bGVOZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU3R5bGVOZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXdSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVTdHlsZU5ldygmZGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAmdmlld1JlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVEVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZGVzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ2aWV3UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFU3R5bGVOZXcoJmRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgJnZpZXdSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRFT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9URVNldFNjcmFwTGVuZ3RoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGxlbmd0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBsZW5ndGg7CiAjaWZuZGVmIFRFU2V0U2NyYXBMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwTGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwTGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZXRTY3JhcExlbmd0aChsZW5ndGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFU2V0U2NyYXBMZW5ndGgobGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVGcm9tU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFRFRnJvbVNjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soVEVGcm9tU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRFRnJvbVNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVEVGcm9tU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRFRnJvbVNjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVUb1NjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBURVRvU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhURVRvU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRFVG9TY3JhcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRFVG9TY3JhcCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVEVUb1NjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVHZXRTY3JhcEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgVEVHZXRTY3JhcEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRFR2V0U2NyYXBIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFR2V0U2NyYXBIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFR2V0U2NyYXBIYW5kbGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0U2NyYXBIYW5kbGUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVTZXRTY3JhcEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgdmFsdWU7CiAjaWZuZGVmIFRFU2V0U2NyYXBIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCVRFU2V0U2NyYXBIYW5kbGUodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVNldFNjcmFwSGFuZGxlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfTE1HZXRXb3JkUmVkcmF3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IF9ydjsKICNpZm5kZWYgTE1HZXRXb3JkUmVkcmF3Ci0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRXb3JkUmVkcmF3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFdvcmRSZWRyYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0V29yZFJlZHJhdygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFdvcmRSZWRyYXcoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9MTVNldFdvcmRSZWRyYXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCB2YWx1ZTsKICNpZm5kZWYgTE1TZXRXb3JkUmVkcmF3Ci0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRXb3JkUmVkcmF3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldFdvcmRSZWRyYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0V29yZFJlZHJhdyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFdvcmRSZWRyYXcodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9hc19URShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVEVIYW5kbGUgX3J2OwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBURUhhbmRsZSBfcnY7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIGFzX1RFCi0JUHlNYWNfUFJFQ0hFQ0soYXNfVEUpOworICAgIFB5TWFjX1BSRUNIRUNLKGFzX1RFKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gYXNfVEUoaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19URShoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRFT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgVEVfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiVEVTY3JhcEhhbmRsZSIsIChQeUNGdW5jdGlvbilURV9URVNjcmFwSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlRFR2V0U2NyYXBMZW5ndGgiLCAoUHlDRnVuY3Rpb24pVEVfVEVHZXRTY3JhcExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiVEVOZXciLCAoUHlDRnVuY3Rpb24pVEVfVEVOZXcsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgZGVzdFJlY3QsIFJlY3Qgdmlld1JlY3QpIC0+IChURUhhbmRsZSBfcnYpIil9LAotCXsiVEVUZXh0Qm94IiwgKFB5Q0Z1bmN0aW9uKVRFX1RFVGV4dEJveCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHQsIFJlY3QgYm94LCBzaG9ydCBqdXN0KSAtPiBOb25lIil9LAotCXsiVEVTdHlsZU5ldyIsIChQeUNGdW5jdGlvbilURV9URVN0eWxlTmV3LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGRlc3RSZWN0LCBSZWN0IHZpZXdSZWN0KSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKLQl7IlRFU2V0U2NyYXBMZW5ndGgiLCAoUHlDRnVuY3Rpb24pVEVfVEVTZXRTY3JhcExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBsZW5ndGgpIC0+IE5vbmUiKX0sCi0JeyJURUZyb21TY3JhcCIsIChQeUNGdW5jdGlvbilURV9URUZyb21TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVUb1NjcmFwIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFVG9TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVHZXRTY3JhcEhhbmRsZSIsIChQeUNGdW5jdGlvbilURV9URUdldFNjcmFwSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlRFU2V0U2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVTZXRTY3JhcEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRXb3JkUmVkcmF3IiwgKFB5Q0Z1bmN0aW9uKVRFX0xNR2V0V29yZFJlZHJhdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKLQl7IkxNU2V0V29yZFJlZHJhdyIsIChQeUNGdW5jdGlvbilURV9MTVNldFdvcmRSZWRyYXcsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiYXNfVEUiLCAoUHlDRnVuY3Rpb24pVEVfYXNfVEUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRFU2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVTY3JhcEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJURUdldFNjcmFwTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFR2V0U2NyYXBMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlRFTmV3IiwgKFB5Q0Z1bmN0aW9uKVRFX1RFTmV3LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGRlc3RSZWN0LCBSZWN0IHZpZXdSZWN0KSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRFVGV4dEJveCIsIChQeUNGdW5jdGlvbilURV9URVRleHRCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0LCBSZWN0IGJveCwgc2hvcnQganVzdCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFU3R5bGVOZXciLCAoUHlDRnVuY3Rpb24pVEVfVEVTdHlsZU5ldywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBkZXN0UmVjdCwgUmVjdCB2aWV3UmVjdCkgLT4gKFRFSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVNldFNjcmFwTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFU2V0U2NyYXBMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbGVuZ3RoKSAtPiBOb25lIil9LAorICAgIHsiVEVGcm9tU2NyYXAiLCAoUHlDRnVuY3Rpb24pVEVfVEVGcm9tU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFVG9TY3JhcCIsIChQeUNGdW5jdGlvbilURV9URVRvU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFR2V0U2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVHZXRTY3JhcEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVNldFNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFU2V0U2NyYXBIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0V29yZFJlZHJhdyIsIChQeUNGdW5jdGlvbilURV9MTUdldFdvcmRSZWRyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCisgICAgeyJMTVNldFdvcmRSZWRyYXciLCAoUHlDRnVuY3Rpb24pVEVfTE1TZXRXb3JkUmVkcmF3LCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7ImFzX1RFIiwgKFB5Q0Z1bmN0aW9uKVRFX2FzX1RFLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKFRFSGFuZGxlIF9ydikiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTMwNywzMSArMTMwNywzMSBAQAogCiB2b2lkIGluaXRfVEUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRFSGFuZGxlLCBURU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRFSGFuZGxlLCBURU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVEVIYW5kbGUsIFRFT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChURUhhbmRsZSwgVEVPYmpfQ29udmVydCk7CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9URSIsIFRFX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfVEUiLCBURV9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlURV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKFRFX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgVEVfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlURV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVEVfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZURV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRFIiwgKFB5T2JqZWN0ICopJlRFX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVEVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJURVR5cGUiLCAoUHlPYmplY3QgKikmVEVfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgVEVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChURV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFRFX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgVEVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlRFX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVEVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJURSIsIChQeU9iamVjdCAqKSZURV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRFX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVEVUeXBlIiwgKFB5T2JqZWN0ICopJlRFX1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3dpbi9fV2lubW9kdWxlLmMgYi9NYWMvTW9kdWxlcy93aW4vX1dpbm1vZHVsZS5jCmluZGV4IDg3Zjc1OTEuLjg5MjMzZWQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3dpbi9fV2lubW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvd2luL19XaW5tb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM2LDcgKzM2LDcgQEAKIHN0YXRpYyB2b2lkCiBQeU1hY19BdXRvRGlzcG9zZVdpbmRvdyhXaW5kb3dQdHIgdykKIHsKLSAgICAgICAgRGlzcG9zZVdpbmRvdyh3KTsKKyAgICBEaXNwb3NlV2luZG93KHcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9FcnJvcjsKQEAgLTQ4LDI1MjIgKzQ4LDI1MjIgQEAKICNkZWZpbmUgV2luT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJldpbmRvd19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZXaW5kb3dfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFdpbmRvd09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVdpbmRvd1B0ciBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoV2luZG93UHRyIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFdpbmRvd1B0ciBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoV2luZG93UHRyIHB0cik7CiB9IFdpbmRvd09iamVjdDsKIAogUHlPYmplY3QgKldpbk9ial9OZXcoV2luZG93UHRyIGl0c2VsZikKIHsKLQlXaW5kb3dPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgV2hpY2hXaW5kb3cgY29kZSBoZXJlPyAqLwotCWl0ID0gUHlPYmplY3RfTkVXKFdpbmRvd09iamVjdCwgJldpbmRvd19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gTlVMTDsKLQlpZiAoR2V0V1JlZkNvbihpdHNlbGYpID09IDApCi0JewotCQlTZXRXUmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOwotCQlpdC0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBXaW5kb3dPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgV2hpY2hXaW5kb3cgY29kZSBoZXJlPyAqLworICAgIGl0ID0gUHlPYmplY3RfTkVXKFdpbmRvd09iamVjdCwgJldpbmRvd19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICBpZiAoR2V0V1JlZkNvbihpdHNlbGYpID09IDApCisgICAgeworICAgICAgICBTZXRXUmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOworICAgICAgICBpdC0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IFdpbk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBXaW5kb3dQdHIgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCWlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoV2luZG93UHRyKVB5SW50X0FzTG9uZyh2KTsgcmV0dXJuIDE7IH0KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChXaW5kb3dQdHIpUHlJbnRfQXNMb25nKHYpOyByZXR1cm4gMTsgfQogCi0JewotCQlEaWFsb2dSZWYgZGxnOwotCQlpZiAoRGxnT2JqX0NvbnZlcnQodiwgJmRsZykgJiYgZGxnKSB7Ci0JCQkqcF9pdHNlbGYgPSBHZXREaWFsb2dXaW5kb3coZGxnKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWlmICghV2luT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIldpbmRvdyByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChXaW5kb3dPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIHsKKyAgICAgICAgRGlhbG9nUmVmIGRsZzsKKyAgICAgICAgaWYgKERsZ09ial9Db252ZXJ0KHYsICZkbGcpICYmIGRsZykgeworICAgICAgICAgICAgKnBfaXRzZWxmID0gR2V0RGlhbG9nV2luZG93KGRsZyk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoIVdpbk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJXaW5kb3cgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgV2luT2JqX2RlYWxsb2MoV2luZG93T2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJU2V0V1JlZkNvbihzZWxmLT5vYl9pdHNlbGYsIDApOwotCQlzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsKLQl9Ci0Jc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQlzZWxmLT5vYl9mcmVlaXQgPSBOVUxMOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBTZXRXUmVmQ29uKHNlbGYtPm9iX2l0c2VsZiwgMCk7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOworICAgIH0KKyAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIHNlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93T3duZXJDb3VudChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIG91dENvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBvdXRDb3VudDsKICNpZm5kZWYgR2V0V2luZG93T3duZXJDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd093bmVyQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd093bmVyQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dPd25lckNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRDb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dPd25lckNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0Nsb25lV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgQ2xvbmVXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhDbG9uZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvbmVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDbG9uZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENsb25lV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dSZXRhaW5Db3VudChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUl0ZW1Db3VudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEl0ZW1Db3VudCBfcnY7CiAjaWZuZGVmIEdldFdpbmRvd1JldGFpbkNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UmV0YWluQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1JldGFpbkNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXaW5kb3dSZXRhaW5Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0V2luZG93UmV0YWluQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1JldGFpbldpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJldGFpbldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFJldGFpbldpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmV0YWluV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV0YWluV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmV0YWluV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9SZWxlYXNlV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgUmVsZWFzZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFJlbGVhc2VXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbGVhc2VXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWxlYXNlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVsZWFzZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfUmVzaGFwZUN1c3RvbVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJlc2hhcGVDdXN0b21XaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhSZXNoYXBlQ3VzdG9tV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNoYXBlQ3VzdG9tV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzaGFwZUN1c3RvbVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc2hhcGVDdXN0b21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1dpZGdldEhpbGl0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93RGVmUGFydENvZGUgb3V0SGlsaXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd0RlZlBhcnRDb2RlIG91dEhpbGl0ZTsKICNpZm5kZWYgR2V0V2luZG93V2lkZ2V0SGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93V2lkZ2V0SGlsaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dXaWRnZXRIaWxpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dXaWRnZXRIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWxpdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEhpbGl0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dXaWRnZXRIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWxpdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhpbGl0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0NsYXNzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dDbGFzcyBvdXRDbGFzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dDbGFzcyBvdXRDbGFzczsKICNpZm5kZWYgR2V0V2luZG93Q2xhc3MKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDbGFzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q2xhc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dDbGFzcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0Q2xhc3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENsYXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd0NsYXNzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDbGFzcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2xhc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dBdHRyaWJ1dGVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dBdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRXaW5kb3dBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0QXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEF0dHJpYnV0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKLQlXaW5kb3dBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd0F0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzOworICAgIFdpbmRvd0F0dHJpYnV0ZXMgY2xlYXJUaGVzZUF0dHJpYnV0ZXM7CiAjaWZuZGVmIENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaGVzZUF0dHJpYnV0ZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaGVzZUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dDbGFzcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOwogI2lmbmRlZiBTZXRXaW5kb3dDbGFzcwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0NsYXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dDbGFzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93Q2xhc3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3dDbGFzcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0NsYXNzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93Q2xhc3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dNb2RhbGl0eShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93TW9kYWxpdHkgaW5Nb2RhbEtpbmQ7Ci0JV2luZG93UHRyIGluVW5hdmFpbGFibGVXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93TW9kYWxpdHkgaW5Nb2RhbEtpbmQ7CisgICAgV2luZG93UHRyIGluVW5hdmFpbGFibGVXaW5kb3c7CiAjaWZuZGVmIFNldFdpbmRvd01vZGFsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93TW9kYWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd01vZGFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGFsS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpblVuYXZhaWxhYmxlV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd01vZGFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluTW9kYWxLaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblVuYXZhaWxhYmxlV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Nb2RhbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5VbmF2YWlsYWJsZVdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dNb2RhbGl0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGFsS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5VbmF2YWlsYWJsZVdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd01vZGFsaXR5KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dNb2RhbGl0eSBvdXRNb2RhbEtpbmQ7Ci0JV2luZG93UHRyIG91dFVuYXZhaWxhYmxlV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd01vZGFsaXR5IG91dE1vZGFsS2luZDsKKyAgICBXaW5kb3dQdHIgb3V0VW5hdmFpbGFibGVXaW5kb3c7CiAjaWZuZGVmIEdldFdpbmRvd01vZGFsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93TW9kYWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd01vZGFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93TW9kYWxpdHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1vZGFsS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFVuYXZhaWxhYmxlV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1vZGFsS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIG91dFVuYXZhaWxhYmxlV2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd01vZGFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNb2RhbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVbmF2YWlsYWJsZVdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNb2RhbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBvdXRVbmF2YWlsYWJsZVdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd0NvbnRlbnRDb2xvcihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIFNldFdpbmRvd0NvbnRlbnRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0NvbnRlbnRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Q29udGVudENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0NvbnRlbnRDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dDb250ZW50Q29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0NvbnRlbnRDb2xvcihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIEdldFdpbmRvd0NvbnRlbnRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0NvbnRlbnRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q29udGVudENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93Q29udGVudENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dDb250ZW50Q29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93Q29udGVudFBhdHRlcm4oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBpeFBhdEhhbmRsZSBvdXRQaXhQYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUGl4UGF0SGFuZGxlIG91dFBpeFBhdDsKICNpZm5kZWYgR2V0V2luZG93Q29udGVudFBhdHRlcm4KLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDb250ZW50UGF0dGVybik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q29udGVudFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dFBpeFBhdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dDb250ZW50UGF0dGVybihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQaXhQYXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRQaXhQYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93Q29udGVudFBhdHRlcm4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UGl4UGF0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93Q29udGVudFBhdHRlcm4oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBpeFBhdEhhbmRsZSBwaXhQYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUGl4UGF0SGFuZGxlIHBpeFBhdDsKICNpZm5kZWYgU2V0V2luZG93Q29udGVudFBhdHRlcm4KLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dDb250ZW50UGF0dGVybik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Q29udGVudFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeFBhdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dDb250ZW50UGF0dGVybihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhQYXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhQYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93Q29udGVudFBhdHRlcm4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4UGF0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2Nyb2xsV2luZG93UmVjdChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblNjcm9sbFJlY3Q7Ci0JU0ludDE2IGluSFBpeGVsczsKLQlTSW50MTYgaW5WUGl4ZWxzOwotCVNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zOwotCVJnbkhhbmRsZSBvdXRFeHBvc2VkUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5TY3JvbGxSZWN0OworICAgIFNJbnQxNiBpbkhQaXhlbHM7CisgICAgU0ludDE2IGluVlBpeGVsczsKKyAgICBTY3JvbGxXaW5kb3dPcHRpb25zIGluT3B0aW9uczsKKyAgICBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbjsKICNpZm5kZWYgU2Nyb2xsV2luZG93UmVjdAotCVB5TWFjX1BSRUNIRUNLKFNjcm9sbFdpbmRvd1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNjcm9sbFdpbmRvd1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNjcm9sbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RXhwb3NlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTY3JvbGxXaW5kb3dSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmluU2Nyb2xsUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkhQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5WUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICBvdXRFeHBvc2VkUmduKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluU2Nyb2xsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSFBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVlBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRFeHBvc2VkUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNjcm9sbFdpbmRvd1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TY3JvbGxSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSFBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEV4cG9zZWRSZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TY3JvbGxXaW5kb3dSZWdpb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJnbkhhbmRsZSBpblNjcm9sbFJnbjsKLQlTSW50MTYgaW5IUGl4ZWxzOwotCVNJbnQxNiBpblZQaXhlbHM7Ci0JU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnM7Ci0JUmduSGFuZGxlIG91dEV4cG9zZWRSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmduSGFuZGxlIGluU2Nyb2xsUmduOworICAgIFNJbnQxNiBpbkhQaXhlbHM7CisgICAgU0ludDE2IGluVlBpeGVsczsKKyAgICBTY3JvbGxXaW5kb3dPcHRpb25zIGluT3B0aW9uczsKKyAgICBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbjsKICNpZm5kZWYgU2Nyb2xsV2luZG93UmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2Nyb2xsV2luZG93UmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTY3JvbGxXaW5kb3dSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5TY3JvbGxSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RXhwb3NlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTY3JvbGxXaW5kb3dSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2Nyb2xsUmduLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RXhwb3NlZFJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5TY3JvbGxSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblZQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RXhwb3NlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTY3JvbGxXaW5kb3dSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2Nyb2xsUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IUGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WUGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RXhwb3NlZFJnbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NsaXBBYm92ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2xpcEFib3ZlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xpcEFib3ZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGlwQWJvdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNsaXBBYm92ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsaXBBYm92ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1BhaW50T25lKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKICNpZm5kZWYgUGFpbnRPbmUKLQlQeU1hY19QUkVDSEVDSyhQYWludE9uZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRPbmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCVBhaW50T25lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgY2xvYmJlcmVkUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50T25lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1BhaW50QmVoaW5kKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKICNpZm5kZWYgUGFpbnRCZWhpbmQKLQlQeU1hY19QUkVDSEVDSyhQYWludEJlaGluZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRCZWhpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCVBhaW50QmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50QmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NhbGNWaXMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENhbGNWaXMKLQlQeU1hY19QUkVDSEVDSyhDYWxjVmlzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYWxjVmlzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDYWxjVmlzKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2FsY1Zpcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NhbGNWaXNCZWhpbmQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgY2xvYmJlcmVkUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgY2xvYmJlcmVkUmduOwogI2lmbmRlZiBDYWxjVmlzQmVoaW5kCi0JUHlNYWNfUFJFQ0hFQ0soQ2FsY1Zpc0JlaGluZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FsY1Zpc0JlaGluZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xvYmJlcmVkUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2FsY1Zpc0JlaGluZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENhbGNWaXNCZWhpbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGNsb2JiZXJlZFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9CcmluZ1RvRnJvbnQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEJyaW5nVG9Gcm9udAotCVB5TWFjX1BSRUNIRUNLKEJyaW5nVG9Gcm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQnJpbmdUb0Zyb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlCcmluZ1RvRnJvbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBCcmluZ1RvRnJvbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZW5kQmVoaW5kKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIGJlaGluZFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIGJlaGluZFdpbmRvdzsKICNpZm5kZWYgU2VuZEJlaGluZAotCVB5TWFjX1BSRUNIRUNLKFNlbmRCZWhpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNlbmRCZWhpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZFdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCVNlbmRCZWhpbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIGJlaGluZFdpbmRvdyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmRXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZW5kQmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBiZWhpbmRXaW5kb3cpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2VsZWN0V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTZWxlY3RXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhTZWxlY3RXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNlbGVjdFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VsZWN0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2VsZWN0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0TmV4dFdpbmRvd09mQ2xhc3MoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCVdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3M7Ci0JQm9vbGVhbiBtdXN0QmVWaXNpYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3M7CisgICAgQm9vbGVhbiBtdXN0QmVWaXNpYmxlOwogI2lmbmRlZiBHZXROZXh0V2luZG93T2ZDbGFzcwotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRXaW5kb3dPZkNsYXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0V2luZG93T2ZDbGFzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmbXVzdEJlVmlzaWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHRXaW5kb3dPZkNsYXNzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0QmVWaXNpYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaW5kb3dDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm11c3RCZVZpc2libGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXh0V2luZG93T2ZDbGFzcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdEJlVmlzaWJsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dBbHRlcm5hdGVUaXRsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5UaXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblRpdGxlOwogI2lmbmRlZiBTZXRXaW5kb3dBbHRlcm5hdGVUaXRsZQotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0FsdGVybmF0ZVRpdGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dBbHRlcm5hdGVUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0FsdGVybmF0ZVRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGl0bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluVGl0bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93QWx0ZXJuYXRlVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaXRsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgb3V0VGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgb3V0VGl0bGU7CiAjaWZuZGVmIENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZQotCVB5TWFjX1BSRUNIRUNLKENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VGl0bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFRpdGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRpdGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRUaXRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0hpbGl0ZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZkhpbGl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBmSGlsaXRlOwogI2lmbmRlZiBIaWxpdGVXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpbGl0ZVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZIaWxpdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWxpdGVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgZkhpbGl0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZkhpbGl0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpbGl0ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICBmSGlsaXRlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdSZWZDb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgZGF0YTsKICNpZm5kZWYgU2V0V1JlZkNvbgotCVB5TWFjX1BSRUNIRUNLKFNldFdSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0V1JlZkNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgZGF0YSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdSZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIGRhdGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V1JlZkNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0V1JlZkNvbgotCVB5TWFjX1BSRUNIRUNLKEdldFdSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdSZWZDb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdSZWZDb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1BpYyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBwaWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBwaWM7CiAjaWZuZGVmIFNldFdpbmRvd1BpYwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1BpYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UGljKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaWMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRXaW5kb3dQaWMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgcGljKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdpbmRvd1BpYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICBwaWMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93UGljKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0V2luZG93UGljCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UGljKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQaWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd1BpYyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd1BpYyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdWYXJpYW50KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFdWYXJpYW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V1ZhcmlhbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdWYXJpYW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXVmFyaWFudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0V1ZhcmlhbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0ZlYXR1cmVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgb3V0RmVhdHVyZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIG91dEZlYXR1cmVzOwogI2lmbmRlZiBHZXRXaW5kb3dGZWF0dXJlcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0ZlYXR1cmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dGZWF0dXJlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0ZlYXR1cmVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGZWF0dXJlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmVhdHVyZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93RmVhdHVyZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZlYXR1cmVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGZWF0dXJlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1JlZ2lvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbkNvZGU7Ci0JUmduSGFuZGxlIGlvV2luUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlOworICAgIFJnbkhhbmRsZSBpb1dpblJnbjsKICNpZm5kZWYgR2V0V2luZG93UmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpb1dpblJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlvV2luUmduKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlvV2luUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd1JlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9XaW5SZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVXaWR0aHMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3Qgb3V0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IG91dFJlY3Q7CiAjaWZuZGVmIEdldFdpbmRvd1N0cnVjdHVyZVdpZHRocwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0cnVjdHVyZVdpZHRocyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlV2lkdGhzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93U3RydWN0dXJlV2lkdGhzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93U3RydWN0dXJlV2lkdGhzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9CZWdpblVwZGF0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQmVnaW5VcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhCZWdpblVwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQmVnaW5VcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUJlZ2luVXBkYXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQmVnaW5VcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9FbmRVcGRhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEVuZFVwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKEVuZFVwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5kVXBkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlFbmRVcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFbmRVcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9JbnZhbFdpbmRvd1JnbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOwogI2lmbmRlZiBJbnZhbFdpbmRvd1JnbgotCVB5TWFjX1BSRUNIRUNLKEludmFsV2luZG93UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbFdpbmRvd1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsV2luZG93UmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnZhbFdpbmRvd1Jnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9JbnZhbFdpbmRvd1JlY3QoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBJbnZhbFdpbmRvd1JlY3QKLQlQeU1hY19QUkVDSEVDSyhJbnZhbFdpbmRvd1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmFsV2luZG93UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW52YWxXaW5kb3dSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxXaW5kb3dSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVmFsaWRXaW5kb3dSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgVmFsaWRXaW5kb3dSZ24KLQlQeU1hY19QUkVDSEVDSyhWYWxpZFdpbmRvd1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmFsaWRXaW5kb3dSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBWYWxpZFdpbmRvd1Jnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVmFsaWRXaW5kb3dSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVmFsaWRXaW5kb3dSZWN0KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgVmFsaWRXaW5kb3dSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVmFsaWRXaW5kb3dSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWYWxpZFdpbmRvd1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFZhbGlkV2luZG93UmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFZhbGlkV2luZG93UmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0RyYXdHcm93SWNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRHJhd0dyb3dJY29uCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd0dyb3dJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3R3Jvd0ljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURyYXdHcm93SWNvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdHcm93SWNvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdUaXRsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSB0aXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IHRpdGxlOwogI2lmbmRlZiBTZXRXVGl0bGUKLQlQeU1hY19QUkVDSEVDSyhTZXRXVGl0bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRXVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgdGl0bGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRXVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgdGl0bGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V1RpdGxlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IHRpdGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgdGl0bGU7CiAjaWZuZGVmIEdldFdUaXRsZQotCVB5TWFjX1BSRUNIRUNLKEdldFdUaXRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V1RpdGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRXVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgdGl0bGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIHRpdGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0V1RpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgIHRpdGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aXRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKICNpZm5kZWYgU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ29weVdpbmRvd1RpdGxlQXNDRlN0cmluZyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIG91dFN0cmluZzsKICNpZm5kZWYgQ29weVdpbmRvd1RpdGxlQXNDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5V2luZG93VGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dQcm94eUZTU3BlYyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNTcGVjIGluRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1NwZWMgaW5GaWxlOwogI2lmbmRlZiBTZXRXaW5kb3dQcm94eUZTU3BlYwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1Byb3h5RlNTcGVjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dQcm94eUZTU3BlYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmluRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dQcm94eUZTU3BlYyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmluRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dQcm94eUZTU3BlYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93UHJveHlGU1NwZWMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTU3BlYyBvdXRGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTU3BlYyBvdXRGaWxlOwogI2lmbmRlZiBHZXRXaW5kb3dQcm94eUZTU3BlYwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3h5RlNTcGVjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQcm94eUZTU3BlYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd1Byb3h5RlNTcGVjKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGaWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1NwZWMsICZvdXRGaWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd1Byb3h5RlNTcGVjKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGaWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1NwZWMsICZvdXRGaWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93UHJveHlBbGlhcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQWxpYXNIYW5kbGUgaW5BbGlhczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBpbkFsaWFzOwogI2lmbmRlZiBTZXRXaW5kb3dQcm94eUFsaWFzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlBbGlhcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlBbGlhcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5BbGlhcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dQcm94eUFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluQWxpYXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93UHJveHlBbGlhcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWxpYXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQcm94eUFsaWFzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKICNpZm5kZWYgR2V0V2luZG93UHJveHlBbGlhcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3h5QWxpYXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3h5QWxpYXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dQcm94eUFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWFzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93UHJveHlBbGlhcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGFsaWFzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlTSW50MTYgdlJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIFNJbnQxNiB2UmVmTnVtOwogI2lmbmRlZiBTZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1Byb3h5SWNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JSWNvblJlZiBvdXRJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEljb25SZWYgb3V0SWNvbjsKICNpZm5kZWYgR2V0V2luZG93UHJveHlJY29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UHJveHlJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQcm94eUljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dQcm94eUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0SWNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dQcm94eUljb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0SWNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1Byb3h5SWNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JSWNvblJlZiBpY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEljb25SZWYgaWNvbjsKICNpZm5kZWYgU2V0V2luZG93UHJveHlJY29uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dQcm94eUljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93UHJveHlJY29uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dQcm94eUljb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9SZW1vdmVXaW5kb3dQcm94eShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJlbW92ZVdpbmRvd1Byb3h5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlV2luZG93UHJveHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZVdpbmRvd1Byb3h5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlV2luZG93UHJveHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVXaW5kb3dQcm94eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQmVnaW5XaW5kb3dQcm94eURyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURyYWdSZWZlcmVuY2Ugb3V0TmV3RHJhZzsKLQlSZ25IYW5kbGUgb3V0RHJhZ091dGxpbmVSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRHJhZ1JlZmVyZW5jZSBvdXROZXdEcmFnOworICAgIFJnbkhhbmRsZSBvdXREcmFnT3V0bGluZVJnbjsKICNpZm5kZWYgQmVnaW5XaW5kb3dQcm94eURyYWcKLQlQeU1hY19QUkVDSEVDSyhCZWdpbldpbmRvd1Byb3h5RHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQmVnaW5XaW5kb3dQcm94eURyYWcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dERyYWdPdXRsaW5lUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEJlZ2luV2luZG93UHJveHlEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROZXdEcmFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXREcmFnT3V0bGluZVJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfTmV3LCBvdXROZXdEcmFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RHJhZ091dGxpbmVSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQmVnaW5XaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE5ld0RyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dERyYWdPdXRsaW5lUmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9OZXcsIG91dE5ld0RyYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9FbmRXaW5kb3dQcm94eURyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURyYWdSZWZlcmVuY2UgdGhlRHJhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEcmFnUmVmZXJlbmNlIHRoZURyYWc7CiAjaWZuZGVmIEVuZFdpbmRvd1Byb3h5RHJhZwotCVB5TWFjX1BSRUNIRUNLKEVuZFdpbmRvd1Byb3h5RHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5kV2luZG93UHJveHlEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmdGhlRHJhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmRXaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURyYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmdGhlRHJhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbmRXaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURyYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgc3RhcnRQdDsKLQlEcmFnUmVmZXJlbmNlIGRyYWc7Ci0JUmduSGFuZGxlIGluRHJhZ091dGxpbmVSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgc3RhcnRQdDsKKyAgICBEcmFnUmVmZXJlbmNlIGRyYWc7CisgICAgUmduSGFuZGxlIGluRHJhZ091dGxpbmVSZ247CiAjaWZuZGVmIFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnCi0JUHlNYWNfUFJFQ0hFQ0soVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmZHJhZywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkRyYWdPdXRsaW5lUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZ091dGxpbmVSZ24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmZHJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkRyYWdPdXRsaW5lUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZ091dGxpbmVSZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFja1dpbmRvd1Byb3h5RHJhZyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgc3RhcnRQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBzdGFydFB0OwogI2lmbmRlZiBUcmFja1dpbmRvd1Byb3h5RHJhZwotCVB5TWFjX1BSRUNIRUNLKFRyYWNrV2luZG93UHJveHlEcmFnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcmFja1dpbmRvd1Byb3h5RHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja1dpbmRvd1Byb3h5RHJhZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFB0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja1dpbmRvd1Byb3h5RHJhZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFB0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSXNXaW5kb3dNb2RpZmllZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dNb2RpZmllZAotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93TW9kaWZpZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzV2luZG93TW9kaWZpZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd01vZGlmaWVkKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIG1vZGlmaWVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gbW9kaWZpZWQ7CiAjaWZuZGVmIFNldFdpbmRvd01vZGlmaWVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93TW9kaWZpZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd01vZGlmaWVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd1BhdGhTZWxlY3RDbGljayhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIGV2ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBldmVudDsKICNpZm5kZWYgSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2sKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd1BhdGhTZWxlY3RDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93UGF0aFNlbGVjdENsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfV2luZG93UGF0aFNlbGVjdChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBtZW51OwotCVNJbnQzMiBvdXRNZW51UmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgbWVudTsKKyAgICBTSW50MzIgb3V0TWVudVJlc3VsdDsKICNpZm5kZWYgV2luZG93UGF0aFNlbGVjdAotCVB5TWFjX1BSRUNIRUNLKFdpbmRvd1BhdGhTZWxlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFdpbmRvd1BhdGhTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZtZW51KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFdpbmRvd1BhdGhTZWxlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBtZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNZW51UmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJm1lbnUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gV2luZG93UGF0aFNlbGVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVSZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lbnVSZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9IaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaGlsaXRlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIGhpbGl0ZWQ7CiAjaWZuZGVmIEhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZwotCVB5TWFjX1BSRUNIRUNLKEhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFuc2l0aW9uV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0OwotCVdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb247Ci0JUmVjdCBpblJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93VHJhbnNpdGlvbkVmZmVjdCBpbkVmZmVjdDsKKyAgICBXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uOworICAgIFJlY3QgaW5SZWN0OwogI2lmbmRlZiBUcmFuc2l0aW9uV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soVHJhbnNpdGlvbldpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHJhbnNpdGlvbldpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhbnNpdGlvbldpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluQWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpblJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5FZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFuc2l0aW9uV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5FZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1RyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpblBhcmVudFdpbmRvdzsKLQlXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0OwotCVdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb247Ci0JUmVjdCBpblJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluUGFyZW50V2luZG93OworICAgIFdpbmRvd1RyYW5zaXRpb25FZmZlY3QgaW5FZmZlY3Q7CisgICAgV2luZG93VHJhbnNpdGlvbkFjdGlvbiBpbkFjdGlvbjsKKyAgICBSZWN0IGluUmVjdDsKICNpZm5kZWYgVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudAotCVB5TWFjX1BSRUNIRUNLKFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpblBhcmVudFdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyZW50V2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5QYXJlbnRXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmVudFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTWFjTW92ZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGhHbG9iYWw7Ci0Jc2hvcnQgdkdsb2JhbDsKLQlCb29sZWFuIGZyb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoR2xvYmFsOworICAgIHNob3J0IHZHbG9iYWw7CisgICAgQm9vbGVhbiBmcm9udDsKICNpZm5kZWYgTWFjTW92ZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE1hY01vdmVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY01vdmVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBoR2xvYmFsLAotCSAgICAgICAgICAgICAgdkdsb2JhbCwKLQkgICAgICAgICAgICAgIGZyb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBoR2xvYmFsLAorICAgICAgICAgICAgICAgICAgdkdsb2JhbCwKKyAgICAgICAgICAgICAgICAgIGZyb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NpemVXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB3OwotCXNob3J0IGg7Ci0JQm9vbGVhbiBmVXBkYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB3OworICAgIHNob3J0IGg7CisgICAgQm9vbGVhbiBmVXBkYXRlOwogI2lmbmRlZiBTaXplV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2l6ZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2l6ZVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmVXBkYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2l6ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgdywKLQkgICAgICAgICAgIGgsCi0JICAgICAgICAgICBmVXBkYXRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlVwZGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNpemVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgZlVwZGF0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Hcm93V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUG9pbnQgc3RhcnRQdDsKLQlSZWN0IGJCb3g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFBvaW50IHN0YXJ0UHQ7CisgICAgUmVjdCBiQm94OwogI2lmbmRlZiBHcm93V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR3Jvd1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3Jvd1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYkJveCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyb3dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCi0JICAgICAgICAgICAgICAgICAmYkJveCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJCb3gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcm93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBzdGFydFB0LAorICAgICAgICAgICAgICAgICAgICAgJmJCb3gpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9EcmFnV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgc3RhcnRQdDsKLQlSZWN0IGJvdW5kc1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHN0YXJ0UHQ7CisgICAgUmVjdCBib3VuZHNSZWN0OwogI2lmbmRlZiBEcmFnV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhZ1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhZ1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCURyYWdXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIHN0YXJ0UHQsCi0JICAgICAgICAgICAmYm91bmRzUmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhZ1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgc3RhcnRQdCwKKyAgICAgICAgICAgICAgICZib3VuZHNSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1pvb21XaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZTsKLQlCb29sZWFuIGZyb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZTsKKyAgICBCb29sZWFuIGZyb250OwogI2lmbmRlZiBab29tV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soWm9vbVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWm9vbVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKLQkJcmV0dXJuIE5VTEw7Ci0JWm9vbVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgcGFydENvZGUsCi0JICAgICAgICAgICBmcm9udCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBab29tV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBwYXJ0Q29kZSwKKyAgICAgICAgICAgICAgIGZyb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93Q29sbGFwc2FibGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzV2luZG93Q29sbGFwc2FibGUKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0NvbGxhcHNhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0NvbGxhcHNhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd0NvbGxhcHNhYmxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd0NvbGxhcHNhYmxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd0NvbGxhcHNlZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dDb2xsYXBzZWQKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0NvbGxhcHNlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dDb2xsYXBzZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93Q29sbGFwc2VkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd0NvbGxhcHNlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ29sbGFwc2VXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gY29sbGFwc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBjb2xsYXBzZTsKICNpZm5kZWYgQ29sbGFwc2VXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhDb2xsYXBzZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29sbGFwc2VXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xsYXBzZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb2xsYXBzZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xsYXBzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb2xsYXBzZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0JvdW5kcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UmVnaW9uQ29kZSByZWdpb25Db2RlOwotCVJlY3QgZ2xvYmFsQm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZTsKKyAgICBSZWN0IGdsb2JhbEJvdW5kczsKICNpZm5kZWYgR2V0V2luZG93Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25Db2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0JvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxCb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZnbG9iYWxCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uQ29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsQm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZ2xvYmFsQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfUmVzaXplV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgaW5TdGFydFBvaW50OwotCVJlY3QgaW5TaXplQ29uc3RyYWludHM7Ci0JUmVjdCBvdXROZXdDb250ZW50UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgaW5TdGFydFBvaW50OworICAgIFJlY3QgaW5TaXplQ29uc3RyYWludHM7CisgICAgUmVjdCBvdXROZXdDb250ZW50UmVjdDsKICNpZm5kZWYgUmVzaXplV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soUmVzaXplV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNpemVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5TdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5TaXplQ29uc3RyYWludHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZXNpemVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaW5TdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAmaW5TaXplQ29uc3RyYWludHMsCi0JICAgICAgICAgICAgICAgICAgICZvdXROZXdDb250ZW50UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dE5ld0NvbnRlbnRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpblN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNpemVDb25zdHJhaW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJlc2l6ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBpblN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICZpblNpemVDb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgJm91dE5ld0NvbnRlbnRSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0TmV3Q29udGVudFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dCb3VuZHMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZTsKLQlSZWN0IGdsb2JhbEJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dSZWdpb25Db2RlIHJlZ2lvbkNvZGU7CisgICAgUmVjdCBnbG9iYWxCb3VuZHM7CiAjaWZuZGVmIFNldFdpbmRvd0JvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0JvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25Db2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsQm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0JvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxCb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsQm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0JvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxCb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9SZXBvc2l0aW9uV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgcGFyZW50V2luZG93OwotCVdpbmRvd1Bvc2l0aW9uTWV0aG9kIG1ldGhvZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgcGFyZW50V2luZG93OworICAgIFdpbmRvd1Bvc2l0aW9uTWV0aG9kIG1ldGhvZDsKICNpZm5kZWYgUmVwb3NpdGlvbldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFJlcG9zaXRpb25XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlcG9zaXRpb25XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZwYXJlbnRXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZtZXRob2QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVwb3NpdGlvbldpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmcGFyZW50V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlcG9zaXRpb25XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTW92ZVdpbmRvd1N0cnVjdHVyZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0Jc2hvcnQgaEdsb2JhbDsKLQlzaG9ydCB2R2xvYmFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIHNob3J0IGhHbG9iYWw7CisgICAgc2hvcnQgdkdsb2JhbDsKICNpZm5kZWYgTW92ZVdpbmRvd1N0cnVjdHVyZQotCVB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3dTdHJ1Y3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3dTdHJ1Y3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaEdsb2JhbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZHbG9iYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTW92ZVdpbmRvd1N0cnVjdHVyZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdkdsb2JhbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaEdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZHbG9iYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTW92ZVdpbmRvd1N0cnVjdHVyZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkdsb2JhbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93SW5TdGFuZGFyZFN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgaW5JZGVhbFNpemU7Ci0JUmVjdCBvdXRJZGVhbFN0YW5kYXJkU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IGluSWRlYWxTaXplOworICAgIFJlY3Qgb3V0SWRlYWxTdGFuZGFyZFN0YXRlOwogI2lmbmRlZiBJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93SW5TdGFuZGFyZFN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5JZGVhbFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklkZWFsU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5JZGVhbFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklkZWFsU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfWm9vbVdpbmRvd0lkZWFsKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQYXJ0Q29kZSBpblBhcnRDb2RlOwotCVBvaW50IGlvSWRlYWxTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1BhcnRDb2RlIGluUGFydENvZGU7CisgICAgUG9pbnQgaW9JZGVhbFNpemU7CiAjaWZuZGVmIFpvb21XaW5kb3dJZGVhbAotCVB5TWFjX1BSRUNIRUNLKFpvb21XaW5kb3dJZGVhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWm9vbVdpbmRvd0lkZWFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0Q29kZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBab29tV2luZG93SWRlYWwoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluUGFydENvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmaW9JZGVhbFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBpb0lkZWFsU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnRDb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFpvb21XaW5kb3dJZGVhbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb0lkZWFsU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGlvSWRlYWxTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93SWRlYWxVc2VyU3RhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3Qgb3V0VXNlclN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3Qgb3V0VXNlclN0YXRlOwogI2lmbmRlZiBHZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0lkZWFsVXNlclN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0lkZWFsVXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVc2VyU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRVc2VyU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93SWRlYWxVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFVzZXJTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFVzZXJTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd0lkZWFsVXNlclN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluVXNlclN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5Vc2VyU3RhdGU7CiAjaWZuZGVmIFNldFdpbmRvd0lkZWFsVXNlclN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93SWRlYWxVc2VyU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0lkZWFsVXNlclN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluVXNlclN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0lkZWFsVXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblVzZXJTdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Vc2VyU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93SWRlYWxVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXNlclN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uOwotCUdESGFuZGxlIG91dEdyZWF0ZXN0RGV2aWNlOwotCVJlY3Qgb3V0R3JlYXRlc3REZXZpY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb247CisgICAgR0RIYW5kbGUgb3V0R3JlYXRlc3REZXZpY2U7CisgICAgUmVjdCBvdXRHcmVhdGVzdERldmljZVJlY3Q7CiAjaWZuZGVmIEdldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHcmVhdGVzdERldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHcmVhdGVzdERldmljZVJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dEdyZWF0ZXN0RGV2aWNlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEdyZWF0ZXN0RGV2aWNlUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEdyZWF0ZXN0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEdyZWF0ZXN0RGV2aWNlUmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0R3JlYXRlc3REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0R3JlYXRlc3REZXZpY2VSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ29uc3RyYWluV2luZG93VG9TY3JlZW4oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlOwotCVdpbmRvd0NvbnN0cmFpbk9wdGlvbnMgaW5PcHRpb25zOwotCVJlY3QgaW5TY3JlZW5SZWN0OwotCVJlY3Qgb3V0U3RydWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlOworICAgIFdpbmRvd0NvbnN0cmFpbk9wdGlvbnMgaW5PcHRpb25zOworICAgIFJlY3QgaW5TY3JlZW5SZWN0OworICAgIFJlY3Qgb3V0U3RydWN0dXJlOwogI2lmbmRlZiBDb25zdHJhaW5XaW5kb3dUb1NjcmVlbgotCVB5TWFjX1BSRUNIRUNLKENvbnN0cmFpbldpbmRvd1RvU2NyZWVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb25zdHJhaW5XaW5kb3dUb1NjcmVlbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluU2NyZWVuUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb25zdHJhaW5XaW5kb3dUb1NjcmVlbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbkNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2NyZWVuUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cnVjdHVyZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFN0cnVjdHVyZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZ2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNjcmVlblJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29uc3RyYWluV2luZG93VG9TY3JlZW4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNjcmVlblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJ1Y3R1cmUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRTdHJ1Y3R1cmUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9IaWRlV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBIaWRlV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soSGlkZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlkZVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpZGVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9NYWNTaG93V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBNYWNTaG93V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjU2hvd1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjU2hvd1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2hvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1Nob3dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TaG93SGlkZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gc2hvd0ZsYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gc2hvd0ZsYWc7CiAjaWZuZGVmIFNob3dIaWRlCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0hpZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dIaWRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2hvd0ZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93SGlkZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgIHNob3dGbGFnKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaG93RmxhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dIaWRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgc2hvd0ZsYWcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTWFjSXNXaW5kb3dWaXNpYmxlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBNYWNJc1dpbmRvd1Zpc2libGUKLQlQeU1hY19QUkVDSEVDSyhNYWNJc1dpbmRvd1Zpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0lzV2luZG93VmlzaWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjSXNXaW5kb3dWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNJc1dpbmRvd1Zpc2libGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1Nob3dTaGVldFdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluUGFyZW50V2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdzsKICNpZm5kZWYgU2hvd1NoZWV0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2hvd1NoZWV0V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93U2hlZXRXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluUGFyZW50V2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNob3dTaGVldFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJlbnRXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpblBhcmVudFdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTaG93U2hlZXRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyZW50V2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSGlkZVNoZWV0V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgSGlkZVNoZWV0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soSGlkZVNoZWV0V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlU2hlZXRXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIaWRlU2hlZXRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWRlU2hlZXRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFNoZWV0V2luZG93UGFyZW50KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgb3V0UGFyZW50V2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBvdXRQYXJlbnRXaW5kb3c7CiAjaWZuZGVmIEdldFNoZWV0V2luZG93UGFyZW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0U2hlZXRXaW5kb3dQYXJlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFNoZWV0V2luZG93UGFyZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2hlZXRXaW5kb3dQYXJlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcmVudFdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgb3V0UGFyZW50V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNoZWV0V2luZG93UGFyZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQYXJlbnRXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIG91dFBhcmVudFdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgcHJvcGVydHlUYWc7Ci0JVUludDMyIGF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgcHJvcGVydHlUYWc7CisgICAgVUludDMyIGF0dHJpYnV0ZXM7CiAjaWZuZGVmIEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlc1RvU2V0OwotCVVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBVSW50MzIgYXR0cmlidXRlc1RvU2V0OworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKICNpZm5kZWYgQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb1NldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb0NsZWFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9DbGVhcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb0NsZWFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9DbGVhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1RyYWNrQm94KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgdGhlUHQ7Ci0JV2luZG93UGFydENvZGUgcGFydENvZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHRoZVB0OworICAgIFdpbmRvd1BhcnRDb2RlIHBhcnRDb2RlOwogI2lmbmRlZiBUcmFja0JveAotCVB5TWFjX1BSRUNIRUNLKFRyYWNrQm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcmFja0JveCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVB0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydENvZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUcmFja0JveChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHRoZVB0LAotCSAgICAgICAgICAgICAgIHBhcnRDb2RlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydENvZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUcmFja0JveChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHRoZVB0LAorICAgICAgICAgICAgICAgICAgIHBhcnRDb2RlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVHJhY2tHb0F3YXkoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCB0aGVQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgdGhlUHQ7CiAjaWZuZGVmIFRyYWNrR29Bd2F5Ci0JUHlNYWNfUFJFQ0hFQ0soVHJhY2tHb0F3YXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYWNrR29Bd2F5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRyYWNrR29Bd2F5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgdGhlUHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRyYWNrR29Bd2F5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGhlUHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQb3J0KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBfcnY7CiAjaWZuZGVmIEdldFdpbmRvd1BvcnQKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXaW5kb3dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUG9ydChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBHZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0V2luZG93U3RydWN0dXJlUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0tpbmQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0V2luZG93S2luZAotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0tpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0tpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd0tpbmQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd0tpbmQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93SGlsaXRlZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dIaWxpdGVkCi0JUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dIaWxpdGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0hpbGl0ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93SGlsaXRlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNXaW5kb3dIaWxpdGVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd1VwZGF0ZVBlbmRpbmcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzV2luZG93VXBkYXRlUGVuZGluZwotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93VXBkYXRlUGVuZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dVcGRhdGVQZW5kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd1VwZGF0ZVBlbmRpbmcoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93VXBkYXRlUGVuZGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTWFjR2V0TmV4dFdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CiAjaWZuZGVmIE1hY0dldE5leHRXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhNYWNHZXROZXh0V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNHZXROZXh0V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNHZXROZXh0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjR2V0TmV4dFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1N0YW5kYXJkU3RhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgR2V0V2luZG93U3RhbmRhcmRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0YW5kYXJkU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0YW5kYXJkU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFdpbmRvd1N0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRXaW5kb3dTdGFuZGFyZFN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93VXNlclN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIEdldFdpbmRvd1VzZXJTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1VzZXJTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93VXNlclN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRXaW5kb3dVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgJnJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdpbmRvd1VzZXJTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93S2luZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGtpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGtpbmQ7CiAjaWZuZGVmIFNldFdpbmRvd0tpbmQKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dLaW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dLaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAma2luZCkpCi0JCXJldHVybiBOVUxMOwotCVNldFdpbmRvd0tpbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGtpbmQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRXaW5kb3dLaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBraW5kKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1N0YW5kYXJkU3RhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgU2V0V2luZG93U3RhbmRhcmRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1N0YW5kYXJkU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1N0YW5kYXJkU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVNldFdpbmRvd1N0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdpbmRvd1N0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1VzZXJTdGF0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByZWN0OwogI2lmbmRlZiBTZXRXaW5kb3dVc2VyU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dVc2VyU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1VzZXJTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0V2luZG93VXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZyZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdpbmRvd1VzZXJTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRQb3J0V2luZG93UG9ydChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2V0UG9ydFdpbmRvd1BvcnQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0V2luZG93UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFdpbmRvd1BvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRXaW5kb3dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFdpbmRvd1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQb3J0Qm91bmRzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRXaW5kb3dQb3J0Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UG9ydEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UG9ydEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93UG9ydEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRXaW5kb3dQb3J0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93VmlzaWJsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dWaXNpYmxlCi0JUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dWaXNpYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd1Zpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93VmlzaWJsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNXaW5kb3dWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHI7CiAjaWZuZGVmIEdldFdpbmRvd1N0cnVjdHVyZVJnbgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0cnVjdHVyZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93U3RydWN0dXJlUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdpbmRvd1N0cnVjdHVyZVJnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICByKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0NvbnRlbnRSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHI7CiAjaWZuZGVmIEdldFdpbmRvd0NvbnRlbnRSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDb250ZW50UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDb250ZW50UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93Q29udGVudFJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0V2luZG93Q29udGVudFJnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dVcGRhdGVSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHI7CiAjaWZuZGVmIEdldFdpbmRvd1VwZGF0ZVJnbgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1VwZGF0ZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93VXBkYXRlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93VXBkYXRlUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdpbmRvd1VwZGF0ZVJnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICByKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldE5leHRXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBHZXROZXh0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV4dFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTW92ZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGhHbG9iYWw7Ci0Jc2hvcnQgdkdsb2JhbDsKLQlCb29sZWFuIGZyb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoR2xvYmFsOworICAgIHNob3J0IHZHbG9iYWw7CisgICAgQm9vbGVhbiBmcm9udDsKICNpZm5kZWYgTW92ZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICBoR2xvYmFsLAotCSAgICAgICAgICAgdkdsb2JhbCwKLQkgICAgICAgICAgIGZyb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBoR2xvYmFsLAorICAgICAgICAgICAgICAgdkdsb2JhbCwKKyAgICAgICAgICAgICAgIGZyb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1Nob3dXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNob3dXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhTaG93V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0F1dG9EaXNwb3NlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IG9ub2ZmLCBvbGQgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmb25vZmYpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKCBfc2VsZi0+b2JfZnJlZWl0ICkKLQkgICAgICAgIG9sZCA9IDE7Ci0JaWYgKCBvbm9mZiApCi0JICAgICAgICBfc2VsZi0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7Ci0JZWxzZQotCSAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOwotCXJldHVybiBfcmVzOworICAgIGludCBvbm9mZiwgb2xkID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJm9ub2ZmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCBfc2VsZi0+b2JfZnJlZWl0ICkKKyAgICAgICAgb2xkID0gMTsKKyAgICBpZiAoIG9ub2ZmICkKKyAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlV2luZG93OworICAgIGVsc2UKKyAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBXaW5PYmpfbWV0aG9kc1tdID0gewotCXsiR2V0V2luZG93T3duZXJDb3VudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93T3duZXJDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dENvdW50KSIpfSwKLQl7IkNsb25lV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DbG9uZVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93UmV0YWluQ291bnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1JldGFpbkNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKLQl7IlJldGFpbldpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmV0YWluV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSZWxlYXNlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZWxlYXNlV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSZXNoYXBlQ3VzdG9tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZXNoYXBlQ3VzdG9tV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dXaWRnZXRIaWxpdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1dpZGdldEhpbGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93RGVmUGFydENvZGUgb3V0SGlsaXRlKSIpfSwKLQl7IkdldFdpbmRvd0NsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93Q2xhc3Mgb3V0Q2xhc3MpIil9LAotCXsiR2V0V2luZG93QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93QXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzKSIpfSwKLQl7IkNoYW5nZVdpbmRvd0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NoYW5nZVdpbmRvd0F0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd0F0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzLCBXaW5kb3dBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93Q2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NsYXNzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzKSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93TW9kYWxpdHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd01vZGFsaXR5LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dNb2RhbGl0eSBpbk1vZGFsS2luZCwgV2luZG93UHRyIGluVW5hdmFpbGFibGVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dNb2RhbGl0eSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93TW9kYWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd01vZGFsaXR5IG91dE1vZGFsS2luZCwgV2luZG93UHRyIG91dFVuYXZhaWxhYmxlV2luZG93KSIpfSwKLQl7IlNldFdpbmRvd0NvbnRlbnRDb2xvciIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93Q29udGVudENvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd0NvbnRlbnRDb2xvciIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q29udGVudENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCi0JeyJHZXRXaW5kb3dDb250ZW50UGF0dGVybiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q29udGVudFBhdHRlcm4sIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBvdXRQaXhQYXQpIC0+IE5vbmUiKX0sCi0JeyJTZXRXaW5kb3dDb250ZW50UGF0dGVybiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93Q29udGVudFBhdHRlcm4sIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwaXhQYXQpIC0+IE5vbmUiKX0sCi0JeyJTY3JvbGxXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TY3JvbGxXaW5kb3dSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluU2Nyb2xsUmVjdCwgU0ludDE2IGluSFBpeGVscywgU0ludDE2IGluVlBpeGVscywgU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnMsIFJnbkhhbmRsZSBvdXRFeHBvc2VkUmduKSAtPiBOb25lIil9LAotCXsiU2Nyb2xsV2luZG93UmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TY3JvbGxXaW5kb3dSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpblNjcm9sbFJnbiwgU0ludDE2IGluSFBpeGVscywgU0ludDE2IGluVlBpeGVscywgU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnMsIFJnbkhhbmRsZSBvdXRFeHBvc2VkUmduKSAtPiBOb25lIil9LAotCXsiQ2xpcEFib3ZlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DbGlwQWJvdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlBhaW50T25lIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9QYWludE9uZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsb2JiZXJlZFJnbikgLT4gTm9uZSIpfSwKLQl7IlBhaW50QmVoaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9QYWludEJlaGluZCwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsb2JiZXJlZFJnbikgLT4gTm9uZSIpfSwKLQl7IkNhbGNWaXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NhbGNWaXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNhbGNWaXNCZWhpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NhbGNWaXNCZWhpbmQsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCi0JeyJCcmluZ1RvRnJvbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0JyaW5nVG9Gcm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2VuZEJlaGluZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2VuZEJlaGluZCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGJlaGluZFdpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlNlbGVjdFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2VsZWN0V2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXROZXh0V2luZG93T2ZDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0TmV4dFdpbmRvd09mQ2xhc3MsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MsIEJvb2xlYW4gbXVzdEJlVmlzaWJsZSkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiU2V0V2luZG93QWx0ZXJuYXRlVGl0bGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0FsdGVybmF0ZVRpdGxlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblRpdGxlKSAtPiBOb25lIil9LAotCXsiQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db3B5V2luZG93QWx0ZXJuYXRlVGl0bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFRpdGxlKSIpfSwKLQl7IkhpbGl0ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlsaXRlV2luZG93LCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGZIaWxpdGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRXUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihsb25nIGRhdGEpIC0+IE5vbmUiKX0sCi0JeyJHZXRXUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRXaW5kb3dQaWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1BpYywgMSwKLQkgUHlEb2NfU1RSKCIoUGljSGFuZGxlIHBpYykgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd1BpYyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UGljLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFdWYXJpYW50IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXVmFyaWFudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFdpbmRvd0ZlYXR1cmVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dGZWF0dXJlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dEZlYXR1cmVzKSIpfSwKLQl7IkdldFdpbmRvd1JlZ2lvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uQ29kZSwgUmduSGFuZGxlIGlvV2luUmduKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93U3RydWN0dXJlV2lkdGhzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVXaWR0aHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3Qgb3V0UmVjdCkiKX0sCi0JeyJCZWdpblVwZGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQmVnaW5VcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkVuZFVwZGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfRW5kVXBkYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJbnZhbFdpbmRvd1JnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfSW52YWxXaW5kb3dSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJJbnZhbFdpbmRvd1JlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0ludmFsV2luZG93UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJWYWxpZFdpbmRvd1JnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfVmFsaWRXaW5kb3dSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJWYWxpZFdpbmRvd1JlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1ZhbGlkV2luZG93UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJEcmF3R3Jvd0ljb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0RyYXdHcm93SWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0V1RpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXVGl0bGUsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSB0aXRsZSkgLT4gTm9uZSIpfSwKLQl7IkdldFdUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1RpdGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTdHIyNTUgdGl0bGUpIil9LAotCXsiU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkNvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFN0cmluZykiKX0sCi0JeyJTZXRXaW5kb3dQcm94eUZTU3BlYyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlGU1NwZWMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBpbkZpbGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dQcm94eUZTU3BlYyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJveHlGU1NwZWMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZTU3BlYyBvdXRGaWxlKSIpfSwKLQl7IlNldFdpbmRvd1Byb3h5QWxpYXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5QWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEFsaWFzSGFuZGxlIGluQWxpYXMpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dQcm94eUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm94eUFsaWFzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCi0JeyJTZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZmlsZUNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU0ludDE2IHZSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dQcm94eUljb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1Byb3h5SWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSWNvblJlZiBvdXRJY29uKSIpfSwKLQl7IlNldFdpbmRvd1Byb3h5SWNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlJY29uLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIGljb24pIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVXaW5kb3dQcm94eSIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVtb3ZlV2luZG93UHJveHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkJlZ2luV2luZG93UHJveHlEcmFnIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9CZWdpbldpbmRvd1Byb3h5RHJhZywgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIG91dERyYWdPdXRsaW5lUmduKSAtPiAoRHJhZ1JlZmVyZW5jZSBvdXROZXdEcmFnKSIpfSwKLQl7IkVuZFdpbmRvd1Byb3h5RHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfRW5kV2luZG93UHJveHlEcmFnLCAxLAotCSBQeURvY19TVFIoIihEcmFnUmVmZXJlbmNlIHRoZURyYWcpIC0+IE5vbmUiKX0sCi0JeyJUcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWcsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQsIERyYWdSZWZlcmVuY2UgZHJhZywgUmduSGFuZGxlIGluRHJhZ091dGxpbmVSZ24pIC0+IE5vbmUiKX0sCi0JeyJUcmFja1dpbmRvd1Byb3h5RHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tXaW5kb3dQcm94eURyYWcsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQpIC0+IE5vbmUiKX0sCi0JeyJJc1dpbmRvd01vZGlmaWVkIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd01vZGlmaWVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRXaW5kb3dNb2RpZmllZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93TW9kaWZpZWQsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gbW9kaWZpZWQpIC0+IE5vbmUiKX0sCi0JeyJJc1dpbmRvd1BhdGhTZWxlY3RDbGljayIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2ssIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGV2ZW50KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiV2luZG93UGF0aFNlbGVjdCIsIChQeUNGdW5jdGlvbilXaW5PYmpfV2luZG93UGF0aFNlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBtZW51KSAtPiAoU0ludDMyIG91dE1lbnVSZXN1bHQpIil9LAotCXsiSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9IaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaGlsaXRlZCkgLT4gTm9uZSIpfSwKLQl7IlRyYW5zaXRpb25XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYW5zaXRpb25XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1RyYW5zaXRpb25FZmZlY3QgaW5FZmZlY3QsIFdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb24sIFJlY3QgaW5SZWN0KSAtPiBOb25lIil9LAotCXsiVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluUGFyZW50V2luZG93LCBXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0LCBXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uLCBSZWN0IGluUmVjdCkgLT4gTm9uZSIpfSwKLQl7Ik1hY01vdmVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY01vdmVXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGhHbG9iYWwsIHNob3J0IHZHbG9iYWwsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCi0JeyJTaXplV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TaXplV2luZG93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB3LCBzaG9ydCBoLCBCb29sZWFuIGZVcGRhdGUpIC0+IE5vbmUiKX0sCi0JeyJHcm93V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Hcm93V2luZG93LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0LCBSZWN0IGJCb3gpIC0+IChsb25nIF9ydikiKX0sCi0JeyJEcmFnV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9EcmFnV2luZG93LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0LCBSZWN0IGJvdW5kc1JlY3QpIC0+IE5vbmUiKX0sCi0JeyJab29tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9ab29tV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZSwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKLQl7IklzV2luZG93Q29sbGFwc2FibGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93Q29sbGFwc2FibGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzV2luZG93Q29sbGFwc2VkIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd0NvbGxhcHNlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ29sbGFwc2VXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvbGxhcHNlV2luZG93LCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGNvbGxhcHNlKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZSkgLT4gKFJlY3QgZ2xvYmFsQm91bmRzKSIpfSwKLQl7IlJlc2l6ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVzaXplV2luZG93LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpblN0YXJ0UG9pbnQsIFJlY3QgaW5TaXplQ29uc3RyYWludHMpIC0+IChCb29sZWFuIF9ydiwgUmVjdCBvdXROZXdDb250ZW50UmVjdCkiKX0sCi0JeyJTZXRXaW5kb3dCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0JvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSByZWdpb25Db2RlLCBSZWN0IGdsb2JhbEJvdW5kcykgLT4gTm9uZSIpfSwKLQl7IlJlcG9zaXRpb25XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JlcG9zaXRpb25XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBwYXJlbnRXaW5kb3csIFdpbmRvd1Bvc2l0aW9uTWV0aG9kIG1ldGhvZCkgLT4gTm9uZSIpfSwKLQl7Ik1vdmVXaW5kb3dTdHJ1Y3R1cmUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX01vdmVXaW5kb3dTdHJ1Y3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGhHbG9iYWwsIHNob3J0IHZHbG9iYWwpIC0+IE5vbmUiKX0sCi0JeyJJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGluSWRlYWxTaXplKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3Qgb3V0SWRlYWxTdGFuZGFyZFN0YXRlKSIpfSwKLQl7Ilpvb21XaW5kb3dJZGVhbCIsIChQeUNGdW5jdGlvbilXaW5PYmpfWm9vbVdpbmRvd0lkZWFsLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQYXJ0Q29kZSBpblBhcnRDb2RlKSAtPiAoUG9pbnQgaW9JZGVhbFNpemUpIil9LAotCXsiR2V0V2luZG93SWRlYWxVc2VyU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0lkZWFsVXNlclN0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dFVzZXJTdGF0ZSkiKX0sCi0JeyJTZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93SWRlYWxVc2VyU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Vc2VyU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbikgLT4gKEdESGFuZGxlIG91dEdyZWF0ZXN0RGV2aWNlLCBSZWN0IG91dEdyZWF0ZXN0RGV2aWNlUmVjdCkiKX0sCi0JeyJDb25zdHJhaW5XaW5kb3dUb1NjcmVlbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ29uc3RyYWluV2luZG93VG9TY3JlZW4sIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlLCBXaW5kb3dDb25zdHJhaW5PcHRpb25zIGluT3B0aW9ucywgUmVjdCBpblNjcmVlblJlY3QpIC0+IChSZWN0IG91dFN0cnVjdHVyZSkiKX0sCi0JeyJIaWRlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9IaWRlV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJNYWNTaG93V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNTaG93V2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTaG93SGlkZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2hvd0hpZGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gc2hvd0ZsYWcpIC0+IE5vbmUiKX0sCi0JeyJNYWNJc1dpbmRvd1Zpc2libGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY0lzV2luZG93VmlzaWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2hvd1NoZWV0V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TaG93U2hlZXRXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkhpZGVTaGVldFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlkZVNoZWV0V2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRTaGVldFdpbmRvd1BhcmVudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0U2hlZXRXaW5kb3dQYXJlbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBvdXRQYXJlbnRXaW5kb3cpIil9LAotCXsiR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gKFVJbnQzMiBhdHRyaWJ1dGVzKSIpfSwKLQl7IkNoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcsIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQsIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcikgLT4gTm9uZSIpfSwKLQl7IlRyYWNrQm94IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFja0JveCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQsIFdpbmRvd1BhcnRDb2RlIHBhcnRDb2RlKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiVHJhY2tHb0F3YXkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrR29Bd2F5LCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0aGVQdCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFdpbmRvd1BvcnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAotCXsiR2V0V2luZG93S2luZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93S2luZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IklzV2luZG93SGlsaXRlZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dIaWxpdGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1dpbmRvd1VwZGF0ZVBlbmRpbmciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93VXBkYXRlUGVuZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjR2V0TmV4dFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTWFjR2V0TmV4dFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dTdGFuZGFyZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dTdGFuZGFyZFN0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAotCXsiR2V0V2luZG93VXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dVc2VyU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgcmVjdCkiKX0sCi0JeyJTZXRXaW5kb3dLaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dLaW5kLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBraW5kKSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93U3RhbmRhcmRTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93U3RhbmRhcmRTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93VXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dVc2VyU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRXaW5kb3dQb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRQb3J0V2luZG93UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UG9ydEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiSXNXaW5kb3dWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd1Zpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFdpbmRvd1N0cnVjdHVyZVJnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd0NvbnRlbnRSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93VXBkYXRlUmduIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dVcGRhdGVSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByKSAtPiBOb25lIil9LAotCXsiR2V0TmV4dFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0TmV4dFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJNb3ZlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Nb3ZlV2luZG93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsLCBCb29sZWFuIGZyb250KSAtPiBOb25lIil9LAotCXsiU2hvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2hvd1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQXV0b0Rpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0F1dG9EaXNwb3NlLCAxLAotCSBQeURvY19TVFIoIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgRGlzcG9zZUhhbmRsZSB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldFdpbmRvd093bmVyQ291bnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd093bmVyQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRDb3VudCkiKX0sCisgICAgeyJDbG9uZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2xvbmVXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1JldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dSZXRhaW5Db3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCisgICAgeyJSZXRhaW5XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JldGFpbldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVsZWFzZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVsZWFzZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVzaGFwZUN1c3RvbVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVzaGFwZUN1c3RvbVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93V2lkZ2V0SGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dXaWRnZXRIaWxpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0RlZlBhcnRDb2RlIG91dEhpbGl0ZSkiKX0sCisgICAgeyJHZXRXaW5kb3dDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q2xhc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0NsYXNzIG91dENsYXNzKSIpfSwKKyAgICB7IkdldFdpbmRvd0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0F0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0F0dHJpYnV0ZXMgb3V0QXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlcywgV2luZG93QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd0NsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dDbGFzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzcykgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd01vZGFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dNb2RhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93TW9kYWxpdHkgaW5Nb2RhbEtpbmQsIFdpbmRvd1B0ciBpblVuYXZhaWxhYmxlV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93TW9kYWxpdHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd01vZGFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dNb2RhbGl0eSBvdXRNb2RhbEtpbmQsIFdpbmRvd1B0ciBvdXRVbmF2YWlsYWJsZVdpbmRvdykiKX0sCisgICAgeyJTZXRXaW5kb3dDb250ZW50Q29sb3IiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NvbnRlbnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dDb250ZW50Q29sb3IiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgY29sb3IpIil9LAorICAgIHsiR2V0V2luZG93Q29udGVudFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRQYXR0ZXJuLCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgb3V0UGl4UGF0KSAtPiBOb25lIil9LAorICAgIHsiU2V0V2luZG93Q29udGVudFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NvbnRlbnRQYXR0ZXJuLCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGl4UGF0KSAtPiBOb25lIil9LAorICAgIHsiU2Nyb2xsV2luZG93UmVjdCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2Nyb2xsV2luZG93UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblNjcm9sbFJlY3QsIFNJbnQxNiBpbkhQaXhlbHMsIFNJbnQxNiBpblZQaXhlbHMsIFNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zLCBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IlNjcm9sbFdpbmRvd1JlZ2lvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2Nyb2xsV2luZG93UmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgaW5TY3JvbGxSZ24sIFNJbnQxNiBpbkhQaXhlbHMsIFNJbnQxNiBpblZQaXhlbHMsIFNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zLCBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkNsaXBBYm92ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2xpcEFib3ZlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJQYWludE9uZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfUGFpbnRPbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJQYWludEJlaGluZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfUGFpbnRCZWhpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJDYWxjVmlzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DYWxjVmlzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDYWxjVmlzQmVoaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DYWxjVmlzQmVoaW5kLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xvYmJlcmVkUmduKSAtPiBOb25lIil9LAorICAgIHsiQnJpbmdUb0Zyb250IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9CcmluZ1RvRnJvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNlbmRCZWhpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NlbmRCZWhpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBiZWhpbmRXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJTZWxlY3RXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NlbGVjdFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TmV4dFdpbmRvd09mQ2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldE5leHRXaW5kb3dPZkNsYXNzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzLCBCb29sZWFuIG11c3RCZVZpc2libGUpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IlNldFdpbmRvd0FsdGVybmF0ZVRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dBbHRlcm5hdGVUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5UaXRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRUaXRsZSkiKX0sCisgICAgeyJIaWxpdGVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0hpbGl0ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBmSGlsaXRlKSAtPiBOb25lIil9LAorICAgIHsiU2V0V1JlZkNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V1JlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBkYXRhKSAtPiBOb25lIil9LAorICAgIHsiR2V0V1JlZkNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1JlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0V2luZG93UGljIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQaWMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBwaWMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dQaWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BpYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGljSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRXVmFyaWFudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1ZhcmlhbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dGZWF0dXJlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93RmVhdHVyZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRGZWF0dXJlcykiKX0sCisgICAgeyJHZXRXaW5kb3dSZWdpb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1JlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbkNvZGUsIFJnbkhhbmRsZSBpb1dpblJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1N0cnVjdHVyZVdpZHRocyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlV2lkdGhzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dFJlY3QpIil9LAorICAgIHsiQmVnaW5VcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0JlZ2luVXBkYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJFbmRVcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0VuZFVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSW52YWxXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0ludmFsV2luZG93UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiSW52YWxXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9JbnZhbFdpbmRvd1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzKSAtPiBOb25lIil9LAorICAgIHsiVmFsaWRXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1ZhbGlkV2luZG93UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiVmFsaWRXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9WYWxpZFdpbmRvd1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzKSAtPiBOb25lIil9LAorICAgIHsiRHJhd0dyb3dJY29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9EcmF3R3Jvd0ljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V1RpdGxlLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgdGl0bGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXVGl0bGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3RyMjU1IHRpdGxlKSIpfSwKKyAgICB7IlNldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5V2luZG93VGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db3B5V2luZG93VGl0bGVBc0NGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAorICAgIHsiU2V0V2luZG93UHJveHlGU1NwZWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5RlNTcGVjLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgaW5GaWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93UHJveHlGU1NwZWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1Byb3h5RlNTcGVjLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGU1NwZWMgb3V0RmlsZSkiKX0sCisgICAgeyJTZXRXaW5kb3dQcm94eUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQcm94eUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihBbGlhc0hhbmRsZSBpbkFsaWFzKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93UHJveHlBbGlhcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJveHlBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAorICAgIHsiU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVDcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUsIFNJbnQxNiB2UmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93UHJveHlJY29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm94eUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEljb25SZWYgb3V0SWNvbikiKX0sCisgICAgeyJTZXRXaW5kb3dQcm94eUljb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5SWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiBpY29uKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlV2luZG93UHJveHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JlbW92ZVdpbmRvd1Byb3h5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJCZWdpbldpbmRvd1Byb3h5RHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQmVnaW5XaW5kb3dQcm94eURyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBvdXREcmFnT3V0bGluZVJnbikgLT4gKERyYWdSZWZlcmVuY2Ugb3V0TmV3RHJhZykiKX0sCisgICAgeyJFbmRXaW5kb3dQcm94eURyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0VuZFdpbmRvd1Byb3h5RHJhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKSAtPiBOb25lIil9LAorICAgIHsiVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFB0LCBEcmFnUmVmZXJlbmNlIGRyYWcsIFJnbkhhbmRsZSBpbkRyYWdPdXRsaW5lUmduKSAtPiBOb25lIil9LAorICAgIHsiVHJhY2tXaW5kb3dQcm94eURyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrV2luZG93UHJveHlEcmFnLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFB0KSAtPiBOb25lIil9LAorICAgIHsiSXNXaW5kb3dNb2RpZmllZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dNb2RpZmllZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0V2luZG93TW9kaWZpZWQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd01vZGlmaWVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIG1vZGlmaWVkKSAtPiBOb25lIil9LAorICAgIHsiSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2siLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93UGF0aFNlbGVjdENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBldmVudCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IldpbmRvd1BhdGhTZWxlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1dpbmRvd1BhdGhTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgbWVudSkgLT4gKFNJbnQzMiBvdXRNZW51UmVzdWx0KSIpfSwKKyAgICB7IkhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGhpbGl0ZWQpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFuc2l0aW9uV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFuc2l0aW9uV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0LCBXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uLCBSZWN0IGluUmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdywgV2luZG93VHJhbnNpdGlvbkVmZmVjdCBpbkVmZmVjdCwgV2luZG93VHJhbnNpdGlvbkFjdGlvbiBpbkFjdGlvbiwgUmVjdCBpblJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNNb3ZlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNNb3ZlV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsLCBCb29sZWFuIGZyb250KSAtPiBOb25lIil9LAorICAgIHsiU2l6ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2l6ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdywgc2hvcnQgaCwgQm9vbGVhbiBmVXBkYXRlKSAtPiBOb25lIil9LAorICAgIHsiR3Jvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR3Jvd1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCwgUmVjdCBiQm94KSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiRHJhZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfRHJhZ1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCwgUmVjdCBib3VuZHNSZWN0KSAtPiBOb25lIil9LAorICAgIHsiWm9vbVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfWm9vbVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UGFydENvZGUgcGFydENvZGUsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCisgICAgeyJJc1dpbmRvd0NvbGxhcHNhYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd0NvbGxhcHNhYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc1dpbmRvd0NvbGxhcHNlZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dDb2xsYXBzZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNvbGxhcHNlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db2xsYXBzZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBjb2xsYXBzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd0JvdW5kcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIHJlZ2lvbkNvZGUpIC0+IChSZWN0IGdsb2JhbEJvdW5kcykiKX0sCisgICAgeyJSZXNpemVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Jlc2l6ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaW5TdGFydFBvaW50LCBSZWN0IGluU2l6ZUNvbnN0cmFpbnRzKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3Qgb3V0TmV3Q29udGVudFJlY3QpIil9LAorICAgIHsiU2V0V2luZG93Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZSwgUmVjdCBnbG9iYWxCb3VuZHMpIC0+IE5vbmUiKX0sCisgICAgeyJSZXBvc2l0aW9uV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZXBvc2l0aW9uV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgcGFyZW50V2luZG93LCBXaW5kb3dQb3NpdGlvbk1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCisgICAgeyJNb3ZlV2luZG93U3RydWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Nb3ZlV2luZG93U3RydWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsKSAtPiBOb25lIil9LAorICAgIHsiSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93SW5TdGFuZGFyZFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBpbklkZWFsU2l6ZSkgLT4gKEJvb2xlYW4gX3J2LCBSZWN0IG91dElkZWFsU3RhbmRhcmRTdGF0ZSkiKX0sCisgICAgeyJab29tV2luZG93SWRlYWwiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1pvb21XaW5kb3dJZGVhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UGFydENvZGUgaW5QYXJ0Q29kZSkgLT4gKFBvaW50IGlvSWRlYWxTaXplKSIpfSwKKyAgICB7IkdldFdpbmRvd0lkZWFsVXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvdXRVc2VyU3RhdGUpIil9LAorICAgIHsiU2V0V2luZG93SWRlYWxVc2VyU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0lkZWFsVXNlclN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluVXNlclN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb24pIC0+IChHREhhbmRsZSBvdXRHcmVhdGVzdERldmljZSwgUmVjdCBvdXRHcmVhdGVzdERldmljZVJlY3QpIil9LAorICAgIHsiQ29uc3RyYWluV2luZG93VG9TY3JlZW4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvbnN0cmFpbldpbmRvd1RvU2NyZWVuLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uQ29kZSwgV2luZG93Q29uc3RyYWluT3B0aW9ucyBpbk9wdGlvbnMsIFJlY3QgaW5TY3JlZW5SZWN0KSAtPiAoUmVjdCBvdXRTdHJ1Y3R1cmUpIil9LAorICAgIHsiSGlkZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlkZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTWFjU2hvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTWFjU2hvd1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2hvd0hpZGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Nob3dIaWRlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHNob3dGbGFnKSAtPiBOb25lIil9LAorICAgIHsiTWFjSXNXaW5kb3dWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNJc1dpbmRvd1Zpc2libGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNob3dTaGVldFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2hvd1NoZWV0V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5QYXJlbnRXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJIaWRlU2hlZXRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0hpZGVTaGVldFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0U2hlZXRXaW5kb3dQYXJlbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFNoZWV0V2luZG93UGFyZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgb3V0UGFyZW50V2luZG93KSIpfSwKKyAgICB7IkdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IChVSW50MzIgYXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnLCBVSW50MzIgYXR0cmlidXRlc1RvU2V0LCBVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFja0JveCIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZVB0LCBXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlRyYWNrR29Bd2F5IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFja0dvQXdheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dQb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAorICAgIHsiR2V0V2luZG93U3RydWN0dXJlUG9ydCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IkdldFdpbmRvd0tpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0tpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJJc1dpbmRvd0hpbGl0ZWQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93SGlsaXRlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNXaW5kb3dVcGRhdGVQZW5kaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd1VwZGF0ZVBlbmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ik1hY0dldE5leHRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY0dldE5leHRXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiR2V0V2luZG93U3RhbmRhcmRTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RhbmRhcmRTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKKyAgICB7IkdldFdpbmRvd1VzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93VXNlclN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAorICAgIHsiU2V0V2luZG93S2luZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93S2luZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQga2luZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd1N0YW5kYXJkU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1N0YW5kYXJkU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd1VzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93VXNlclN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0V2luZG93UG9ydCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0UG9ydFdpbmRvd1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1BvcnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BvcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKKyAgICB7IklzV2luZG93VmlzaWJsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dTdHJ1Y3R1cmVSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1N0cnVjdHVyZVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dDb250ZW50UmduIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dDb250ZW50UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1VwZGF0ZVJnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93VXBkYXRlUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE5leHRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldE5leHRXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiTW92ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTW92ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaEdsb2JhbCwgc2hvcnQgdkdsb2JhbCwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Nob3dXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9BdXRvRGlzcG9zZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IERpc3Bvc2VIYW5kbGUgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFdpbk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTI1NzEsMjEgKzI1NzEsMjEgQEAKIAogc3RhdGljIGludCBXaW5PYmpfY29tcGFyZShXaW5kb3dPYmplY3QgKnNlbGYsIFdpbmRvd09iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogV2luT2JqX3JlcHIoV2luZG93T2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8V2luZG93IG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8V2luZG93IG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IFdpbk9ial9oYXNoKFdpbmRvd09iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogI2RlZmluZSBXaW5PYmpfdHBfaW5pdCAwCiAKQEAgLTI1OTMsNjEgKzI1OTMsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVdpbmRvd1B0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFdpbmRvd1B0ciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBXaW5PYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChXaW5kb3dPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgV2luT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoV2luZG93T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFdpbk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBXaW5kb3dfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfV2luLldpbmRvdyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFdpbmRvd09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFdpbk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBXaW5PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFdpbk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgV2luT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVdpbk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlXaW5PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JV2luT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlXaW5PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JV2luT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JV2luT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfV2luLldpbmRvdyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFdpbmRvd09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFdpbk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBXaW5PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFdpbk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgV2luT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIFdpbk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBXaW5PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgV2luT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBXaW5PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgV2luT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgV2luT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgV2luZG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjY1NSw1NTMgKzI2NTUsNTUzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldE5ld0NXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7Ci0Jc2hvcnQgd2luZG93SUQ7Ci0JV2luZG93UHRyIGJlaGluZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBzaG9ydCB3aW5kb3dJRDsKKyAgICBXaW5kb3dQdHIgYmVoaW5kOwogI2lmbmRlZiBHZXROZXdDV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV3Q1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV3Q1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2luZG93SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV3Q1dpbmRvdyh3aW5kb3dJRCwKLQkgICAgICAgICAgICAgICAgICAgICh2b2lkICopMCwKLQkgICAgICAgICAgICAgICAgICAgIGJlaGluZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXdDV2luZG93KHdpbmRvd0lELAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX05ld1dpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU3RyMjU1IHRpdGxlOwotCUJvb2xlYW4gdmlzaWJsZTsKLQlzaG9ydCB0aGVQcm9jOwotCVdpbmRvd1B0ciBiZWhpbmQ7Ci0JQm9vbGVhbiBnb0F3YXlGbGFnOwotCWxvbmcgcmVmQ29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTdHIyNTUgdGl0bGU7CisgICAgQm9vbGVhbiB2aXNpYmxlOworICAgIHNob3J0IHRoZVByb2M7CisgICAgV2luZG93UHRyIGJlaGluZDsKKyAgICBCb29sZWFuIGdvQXdheUZsYWc7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIE5ld1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE5ld1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVQcm9jLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdXaW5kb3coKHZvaWQgKikwLAotCSAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgIHZpc2libGUsCi0JICAgICAgICAgICAgICAgIHRoZVByb2MsCi0JICAgICAgICAgICAgICAgIGJlaGluZCwKLQkgICAgICAgICAgICAgICAgZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld1dpbmRvdygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgdGhlUHJvYywKKyAgICAgICAgICAgICAgICAgICAgYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICBnb0F3YXlGbGFnLAorICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fR2V0TmV3V2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCXNob3J0IHdpbmRvd0lEOwotCVdpbmRvd1B0ciBiZWhpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CisgICAgc2hvcnQgd2luZG93SUQ7CisgICAgV2luZG93UHRyIGJlaGluZDsKICNpZm5kZWYgR2V0TmV3V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV3V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXdXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5ld1dpbmRvdyh3aW5kb3dJRCwKLQkgICAgICAgICAgICAgICAgICAgKHZvaWQgKikwLAotCSAgICAgICAgICAgICAgICAgICBiZWhpbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luZG93SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV3V2luZG93KHdpbmRvd0lELAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICAgIGJlaGluZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9OZXdDV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTdHIyNTUgdGl0bGU7Ci0JQm9vbGVhbiB2aXNpYmxlOwotCXNob3J0IHByb2NJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOwotCUJvb2xlYW4gZ29Bd2F5RmxhZzsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU3RyMjU1IHRpdGxlOworICAgIEJvb2xlYW4gdmlzaWJsZTsKKyAgICBzaG9ydCBwcm9jSUQ7CisgICAgV2luZG93UHRyIGJlaGluZDsKKyAgICBCb29sZWFuIGdvQXdheUZsYWc7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIE5ld0NXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhOZXdDV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdDV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld0NXaW5kb3coKHZvaWQgKikwLAotCSAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgIHZpc2libGUsCi0JICAgICAgICAgICAgICAgICBwcm9jSUQsCi0JICAgICAgICAgICAgICAgICBiZWhpbmQsCi0JICAgICAgICAgICAgICAgICBnb0F3YXlGbGFnLAotCSAgICAgICAgICAgICAgICAgcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnb0F3YXlGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3Q1dpbmRvdygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIHByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgIGJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fQ3JlYXRlTmV3V2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd0NsYXNzIHdpbmRvd0NsYXNzOwotCVdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKLQlSZWN0IGNvbnRlbnRCb3VuZHM7Ci0JV2luZG93UHRyIG91dFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dDbGFzcyB3aW5kb3dDbGFzczsKKyAgICBXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisgICAgUmVjdCBjb250ZW50Qm91bmRzOworICAgIFdpbmRvd1B0ciBvdXRXaW5kb3c7CiAjaWZuZGVmIENyZWF0ZU5ld1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZU5ld1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2luZG93Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmY29udGVudEJvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVOZXdXaW5kb3cod2luZG93Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRCb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmNvbnRlbnRCb3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTmV3V2luZG93KHdpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50Qm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIG91dFdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0NyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgcmVzSUQ7Ci0JV2luZG93UHRyIG91dFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgcmVzSUQ7CisgICAgV2luZG93UHRyIG91dFdpbmRvdzsKICNpZm5kZWYgQ3JlYXRlV2luZG93RnJvbVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlV2luZG93RnJvbVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UocmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZShyZXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBvdXRXaW5kb3cpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9TaG93RmxvYXRpbmdXaW5kb3dzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBTaG93RmxvYXRpbmdXaW5kb3dzCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0Zsb2F0aW5nV2luZG93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0Zsb2F0aW5nV2luZG93cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNob3dGbG9hdGluZ1dpbmRvd3MoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNob3dGbG9hdGluZ1dpbmRvd3MoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fSGlkZUZsb2F0aW5nV2luZG93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgSGlkZUZsb2F0aW5nV2luZG93cwotCVB5TWFjX1BSRUNIRUNLKEhpZGVGbG9hdGluZ1dpbmRvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVGbG9hdGluZ1dpbmRvd3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIaWRlRmxvYXRpbmdXaW5kb3dzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWRlRmxvYXRpbmdXaW5kb3dzKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0FyZUZsb2F0aW5nV2luZG93c1Zpc2libGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9DaGVja1VwZGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVjb3JkIHRoZUV2ZW50OwogI2lmbmRlZiBDaGVja1VwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKENoZWNrVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGVja1VwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2hlY2tVcGRhdGUoJnRoZUV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ2hlY2tVcGRhdGUoJnRoZUV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fTWFjRmluZFdpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UGFydENvZGUgX3J2OwotCVBvaW50IHRoZVBvaW50OwotCVdpbmRvd1B0ciB3aW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1BhcnRDb2RlIF9ydjsKKyAgICBQb2ludCB0aGVQb2ludDsKKyAgICBXaW5kb3dQdHIgd2luZG93OwogI2lmbmRlZiBNYWNGaW5kV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRmluZFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRmluZFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNGaW5kV2luZG93KHRoZVBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgJndpbmRvdyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgd2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNGaW5kV2luZG93KHRoZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgd2luZG93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRnJvbnRXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CiAjaWZuZGVmIEZyb250V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRnJvbnRXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyb250V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGcm9udFdpbmRvdygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGcm9udFdpbmRvdygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9Gcm9udE5vbkZsb2F0aW5nV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBGcm9udE5vbkZsb2F0aW5nV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRnJvbnROb25GbG9hdGluZ1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRnJvbnROb25GbG9hdGluZ1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRnJvbnROb25GbG9hdGluZ1dpbmRvdygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGcm9udE5vbkZsb2F0aW5nV2luZG93KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldEZyb250V2luZG93T2ZDbGFzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOwotCUJvb2xlYW4gbXVzdEJlVmlzaWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOworICAgIEJvb2xlYW4gbXVzdEJlVmlzaWJsZTsKICNpZm5kZWYgR2V0RnJvbnRXaW5kb3dPZkNsYXNzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RnJvbnRXaW5kb3dPZkNsYXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGcm9udFdpbmRvd09mQ2xhc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJm11c3RCZVZpc2libGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRGcm9udFdpbmRvd09mQ2xhc3MoaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdEJlVmlzaWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtdXN0QmVWaXNpYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RnJvbnRXaW5kb3dPZkNsYXNzKGluV2luZG93Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3RCZVZpc2libGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRmluZFdpbmRvd09mQ2xhc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgd2hlcmU7Ci0JV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKLQlXaW5kb3dQdHIgb3V0V2luZG93OwotCVdpbmRvd1BhcnRDb2RlIG91dFdpbmRvd1BhcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgd2hlcmU7CisgICAgV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKKyAgICBXaW5kb3dQdHIgb3V0V2luZG93OworICAgIFdpbmRvd1BhcnRDb2RlIG91dFdpbmRvd1BhcnQ7CiAjaWZuZGVmIEZpbmRXaW5kb3dPZkNsYXNzCi0JUHlNYWNfUFJFQ0hFQ0soRmluZFdpbmRvd09mQ2xhc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbmRXaW5kb3dPZkNsYXNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZpbmRXaW5kb3dPZkNsYXNzKCZ3aGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvd1BhcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBvdXRXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgb3V0V2luZG93UGFydCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmluZFdpbmRvd09mQ2xhc3MoJndoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93UGFydCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIG91dFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRXaW5kb3dQYXJ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9wdGlvbkJpdHMgaW5PcHRpb25zOwotCU1lbnVIYW5kbGUgb3V0TWVudTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPcHRpb25CaXRzIGluT3B0aW9uczsKKyAgICBNZW51SGFuZGxlIG91dE1lbnU7CiAjaWZuZGVmIENyZWF0ZVN0YW5kYXJkV2luZG93TWVudQotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVN0YW5kYXJkV2luZG93TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5PcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVN0YW5kYXJkV2luZG93TWVudShpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWVudSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTdGFuZGFyZFdpbmRvd01lbnUoaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0NvbGxhcHNlQWxsV2luZG93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGNvbGxhcHNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gY29sbGFwc2U7CiAjaWZuZGVmIENvbGxhcHNlQWxsV2luZG93cwotCVB5TWFjX1BSRUNIRUNLKENvbGxhcHNlQWxsV2luZG93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29sbGFwc2VBbGxXaW5kb3dzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sbGFwc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29sbGFwc2VBbGxXaW5kb3dzKGNvbGxhcHNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbGxhcHNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbGxhcHNlQWxsV2luZG93cyhjb2xsYXBzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUdESGFuZGxlIGluRGV2aWNlOwotCVJlY3Qgb3V0QXZhaWxhYmxlUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBHREhhbmRsZSBpbkRldmljZTsKKyAgICBSZWN0IG91dEF2YWlsYWJsZVJlY3Q7CiAjaWZuZGVmIEdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcyhpbkRldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF2YWlsYWJsZVJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRBdmFpbGFibGVSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5EZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMoaW5EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdmFpbGFibGVSZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0QXZhaWxhYmxlUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0Rpc2FibGVTY3JlZW5VcGRhdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBEaXNhYmxlU2NyZWVuVXBkYXRlcwotCVB5TWFjX1BSRUNIRUNLKERpc2FibGVTY3JlZW5VcGRhdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNhYmxlU2NyZWVuVXBkYXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERpc2FibGVTY3JlZW5VcGRhdGVzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEaXNhYmxlU2NyZWVuVXBkYXRlcygpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9FbmFibGVTY3JlZW5VcGRhdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBFbmFibGVTY3JlZW5VcGRhdGVzCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlU2NyZWVuVXBkYXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlU2NyZWVuVXBkYXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEVuYWJsZVNjcmVlblVwZGF0ZXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVuYWJsZVNjcmVlblVwZGF0ZXMoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fUGluUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUmVjdCB0aGVSZWN0OwotCVBvaW50IHRoZVB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgUG9pbnQgdGhlUHQ7CiAjaWZuZGVmIFBpblJlY3QKLQlQeU1hY19QUkVDSEVDSyhQaW5SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQaW5SZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFBpblJlY3QoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICB0aGVQdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUGluUmVjdCgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgIHRoZVB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fR2V0R3JheVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0R3JheVJnbgotCVB5TWFjX1BSRUNIRUNLKEdldEdyYXlSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdyYXlSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEdyYXlSZ24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEdyYXlSZ24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldFdpbmRvd0Zyb21Qb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCUNHcmFmUHRyIHBvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CisgICAgQ0dyYWZQdHIgcG9ydDsKICNpZm5kZWYgR2V0V2luZG93RnJvbVBvcnQKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dGcm9tUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93RnJvbVBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0V2luZG93RnJvbVBvcnQocG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd0Zyb21Qb3J0KHBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fV2hpY2hXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWxvbmcgcHRyOworICAgIGxvbmcgcHRyOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmcHRyKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfcmVzID0gV2luT2JqX1doaWNoV2luZG93KChXaW5kb3dQdHIpcHRyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZwdHIpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3JlcyA9IFdpbk9ial9XaGljaFdpbmRvdygoV2luZG93UHRyKXB0cik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRmluZFdpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVBvaW50IHRoZVBvaW50OwotCVdpbmRvd1B0ciB0aGVXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBQb2ludCB0aGVQb2ludDsKKyAgICBXaW5kb3dQdHIgdGhlV2luZG93OwogI2lmbmRlZiBGaW5kV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRmluZFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaW5kV2luZG93KHRoZVBvaW50LAotCSAgICAgICAgICAgICAgICAgJnRoZVdpbmRvdyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaW5kV2luZG93KHRoZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgJnRoZVdpbmRvdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgV2luX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkdldE5ld0NXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0dldE5ld0NXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpbmRvd0lELCBXaW5kb3dQdHIgYmVoaW5kKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJOZXdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX05ld1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgc2hvcnQgdGhlUHJvYywgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBsb25nIHJlZkNvbikgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiR2V0TmV3V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXROZXdXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpbmRvd0lELCBXaW5kb3dQdHIgYmVoaW5kKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJOZXdDV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9OZXdDV2luZG93LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBzaG9ydCBwcm9jSUQsIFdpbmRvd1B0ciBiZWhpbmQsIEJvb2xlYW4gZ29Bd2F5RmxhZywgbG9uZyByZWZDb24pIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkNyZWF0ZU5ld1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlTmV3V2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dDbGFzcyB3aW5kb3dDbGFzcywgV2luZG93QXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBSZWN0IGNvbnRlbnRCb3VuZHMpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKLQl7IkNyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlV2luZG93RnJvbVJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgcmVzSUQpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKLQl7IlNob3dGbG9hdGluZ1dpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX1Nob3dGbG9hdGluZ1dpbmRvd3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkhpZGVGbG9hdGluZ1dpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX0hpZGVGbG9hdGluZ1dpbmRvd3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUiLCAoUHlDRnVuY3Rpb24pV2luX0FyZUZsb2F0aW5nV2luZG93c1Zpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNoZWNrVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbl9DaGVja1VwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKLQl7Ik1hY0ZpbmRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX01hY0ZpbmRXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZVBvaW50KSAtPiAoV2luZG93UGFydENvZGUgX3J2LCBXaW5kb3dQdHIgd2luZG93KSIpfSwKLQl7IkZyb250V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9Gcm9udFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJGcm9udE5vbkZsb2F0aW5nV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9Gcm9udE5vbkZsb2F0aW5nV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkdldEZyb250V2luZG93T2ZDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5fR2V0RnJvbnRXaW5kb3dPZkNsYXNzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzLCBCb29sZWFuIG11c3RCZVZpc2libGUpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkZpbmRXaW5kb3dPZkNsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9GaW5kV2luZG93T2ZDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgd2hlcmUsIFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93LCBXaW5kb3dQYXJ0Q29kZSBvdXRXaW5kb3dQYXJ0KSIpfSwKLQl7IkNyZWF0ZVN0YW5kYXJkV2luZG93TWVudSIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51LCAxLAotCSBQeURvY19TVFIoIihPcHRpb25CaXRzIGluT3B0aW9ucykgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSkiKX0sCi0JeyJDb2xsYXBzZUFsbFdpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX0NvbGxhcHNlQWxsV2luZG93cywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBjb2xsYXBzZSkgLT4gTm9uZSIpfSwKLQl7IkdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgaW5EZXZpY2UpIC0+IChSZWN0IG91dEF2YWlsYWJsZVJlY3QpIil9LAotCXsiRGlzYWJsZVNjcmVlblVwZGF0ZXMiLCAoUHlDRnVuY3Rpb24pV2luX0Rpc2FibGVTY3JlZW5VcGRhdGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJFbmFibGVTY3JlZW5VcGRhdGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9FbmFibGVTY3JlZW5VcGRhdGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJQaW5SZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbl9QaW5SZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIFBvaW50IHRoZVB0KSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0R3JheVJnbiIsIChQeUNGdW5jdGlvbilXaW5fR2V0R3JheVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dGcm9tUG9ydCIsIChQeUNGdW5jdGlvbilXaW5fR2V0V2luZG93RnJvbVBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IldoaWNoV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9XaGljaFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCJSZXNvbHZlIGFuIGludGVnZXIgV2luZG93UHRyIGFkZHJlc3MgdG8gYSBXaW5kb3cgb2JqZWN0Iil9LAotCXsiRmluZFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fRmluZFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUG9pbnQpIC0+IChzaG9ydCBfcnYsIFdpbmRvd1B0ciB0aGVXaW5kb3cpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiR2V0TmV3Q1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fR2V0TmV3Q1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgd2luZG93SUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7Ik5ld1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fTmV3V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBzaG9ydCB0aGVQcm9jLCBXaW5kb3dQdHIgYmVoaW5kLCBCb29sZWFuIGdvQXdheUZsYWcsIGxvbmcgcmVmQ29uKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCisgICAgeyJHZXROZXdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0dldE5ld1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgd2luZG93SUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7Ik5ld0NXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX05ld0NXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzUmVjdCwgU3RyMjU1IHRpdGxlLCBCb29sZWFuIHZpc2libGUsIHNob3J0IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBsb25nIHJlZkNvbikgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiQ3JlYXRlTmV3V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9DcmVhdGVOZXdXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd0NsYXNzIHdpbmRvd0NsYXNzLCBXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIFJlY3QgY29udGVudEJvdW5kcykgLT4gKFdpbmRvd1B0ciBvdXRXaW5kb3cpIil9LAorICAgIHsiQ3JlYXRlV2luZG93RnJvbVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVdpbl9DcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiByZXNJRCkgLT4gKFdpbmRvd1B0ciBvdXRXaW5kb3cpIil9LAorICAgIHsiU2hvd0Zsb2F0aW5nV2luZG93cyIsIChQeUNGdW5jdGlvbilXaW5fU2hvd0Zsb2F0aW5nV2luZG93cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlkZUZsb2F0aW5nV2luZG93cyIsIChQeUNGdW5jdGlvbilXaW5fSGlkZUZsb2F0aW5nV2luZG93cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZSIsIChQeUNGdW5jdGlvbilXaW5fQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ2hlY2tVcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luX0NoZWNrVXBkYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAorICAgIHsiTWFjRmluZFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fTWFjRmluZFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUG9pbnQpIC0+IChXaW5kb3dQYXJ0Q29kZSBfcnYsIFdpbmRvd1B0ciB3aW5kb3cpIil9LAorICAgIHsiRnJvbnRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0Zyb250V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkZyb250Tm9uRmxvYXRpbmdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0Zyb250Tm9uRmxvYXRpbmdXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiR2V0RnJvbnRXaW5kb3dPZkNsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRGcm9udFdpbmRvd09mQ2xhc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MsIEJvb2xlYW4gbXVzdEJlVmlzaWJsZSkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiRmluZFdpbmRvd09mQ2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luX0ZpbmRXaW5kb3dPZkNsYXNzLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB3aGVyZSwgV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzcykgLT4gKFdpbmRvd1B0ciBvdXRXaW5kb3csIFdpbmRvd1BhcnRDb2RlIG91dFdpbmRvd1BhcnQpIil9LAorICAgIHsiQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51IiwgKFB5Q0Z1bmN0aW9uKVdpbl9DcmVhdGVTdGFuZGFyZFdpbmRvd01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9wdGlvbkJpdHMgaW5PcHRpb25zKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51KSIpfSwKKyAgICB7IkNvbGxhcHNlQWxsV2luZG93cyIsIChQeUNGdW5jdGlvbilXaW5fQ29sbGFwc2VBbGxXaW5kb3dzLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGNvbGxhcHNlKSAtPiBOb25lIil9LAorICAgIHsiR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luX0dldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSBpbkRldmljZSkgLT4gKFJlY3Qgb3V0QXZhaWxhYmxlUmVjdCkiKX0sCisgICAgeyJEaXNhYmxlU2NyZWVuVXBkYXRlcyIsIChQeUNGdW5jdGlvbilXaW5fRGlzYWJsZVNjcmVlblVwZGF0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkVuYWJsZVNjcmVlblVwZGF0ZXMiLCAoUHlDRnVuY3Rpb24pV2luX0VuYWJsZVNjcmVlblVwZGF0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlBpblJlY3QiLCAoUHlDRnVuY3Rpb24pV2luX1BpblJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgUG9pbnQgdGhlUHQpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRHcmF5UmduIiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRHcmF5UmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFdpbmRvd0Zyb21Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRXaW5kb3dGcm9tUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgcG9ydCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiV2hpY2hXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX1doaWNoV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIlJlc29sdmUgYW4gaW50ZWdlciBXaW5kb3dQdHIgYWRkcmVzcyB0byBhIFdpbmRvdyBvYmplY3QiKX0sCisgICAgeyJGaW5kV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9GaW5kV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0aGVQb2ludCkgLT4gKHNob3J0IF9ydiwgV2luZG93UHRyIHRoZVdpbmRvdykiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH07CiAKQEAgLTMyMTMsNTEgKzMyMTMsNTEgQEAKIFB5T2JqZWN0ICoKIFdpbk9ial9XaGljaFdpbmRvdyhXaW5kb3dQdHIgdykKIHsKLSAgICAgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdDsKIAotICAgICAgICBpZiAodyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOwotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaXQgPSAoUHlPYmplY3QgKikgR2V0V1JlZkNvbih3KTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgIUlzUG9pbnRlclZhbGlkKChQdHIpaXQpIHx8ICgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gdyB8fCAhV2luT2JqX0NoZWNrKGl0KSkgeworICAgICAgICAgICAgaXQgPSBXaW5PYmpfTmV3KHcpOworICAgICAgICAgICAgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2ZyZWVpdCA9IE5VTEw7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXQgPSAoUHlPYmplY3QgKikgR2V0V1JlZkNvbih3KTsKLSAgICAgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCB8fCAhSXNQb2ludGVyVmFsaWQoKFB0cilpdCkgfHwgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSB3IHx8ICFXaW5PYmpfQ2hlY2soaXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdCA9IFdpbk9ial9OZXcodyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfZnJlZWl0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdDsKKyAgICB9CisgICAgcmV0dXJuIGl0OwogfQogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogdm9pZCBpbml0X1dpbih2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoV2luZG93UHRyLCBXaW5PYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhXaW5kb3dQdHIsIFdpbk9ial9XaGljaFdpbmRvdyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFdpbmRvd1B0ciwgV2luT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFdpbmRvd1B0ciwgV2luT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoV2luZG93UHRyLCBXaW5PYmpfV2hpY2hXaW5kb3cpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChXaW5kb3dQdHIsIFdpbk9ial9Db252ZXJ0KTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1dpbiIsIFdpbl9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1dpbiIsIFdpbl9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlXaW5fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChXaW5fRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBXaW5fRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlXaW5kb3dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJldpbmRvd19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJldpbmRvd19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIldpbmRvdyIsIChQeU9iamVjdCAqKSZXaW5kb3dfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZXaW5kb3dfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJXaW5kb3dUeXBlIiwgKFB5T2JqZWN0ICopJldpbmRvd19UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBXaW5fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChXaW5fRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBXaW5fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBXaW5kb3dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJldpbmRvd19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJldpbmRvd19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIldpbmRvdyIsIChQeU9iamVjdCAqKSZXaW5kb3dfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZXaW5kb3dfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJXaW5kb3dUeXBlIiwgKFB5T2JqZWN0ICopJldpbmRvd19UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NaXNjL3NldHVpZC1wcm9nLmMgYi9NaXNjL3NldHVpZC1wcm9nLmMKaW5kZXggZDg1MGI0Ny4uNzI1NzQ5ZCAxMDA2NDQKLS0tIGEvTWlzYy9zZXR1aWQtcHJvZy5jCisrKyBiL01pc2Mvc2V0dWlkLXByb2cuYwpAQCAtMjEsMjggKzIxLDI4IEBACiAKICAgIEFzc3VtaW5nIHRoZSBzY3JpcHQgaXMgYSBCb3VybmUgc2hlbGwgc2NyaXB0LCB0aGUgZmlyc3QgbGluZSBvZiB0aGUKICAgIHNjcmlwdCBzaG91bGQgYmUKLQkjIS9iaW4vc2ggLQorICAgICMhL2Jpbi9zaCAtCiAgICBUaGUgLSBpcyBpbXBvcnRhbnQsIGRvbid0IG9taXQgaXQuICBJZiB5b3UncmUgdXNpbmcgZXNoLCB0aGUgZmlyc3QKICAgIGxpbmUgc2hvdWxkIGJlCi0JIyEvdXNyL2xvY2FsL2Jpbi9lc2ggLWYKKyAgICAjIS91c3IvbG9jYWwvYmluL2VzaCAtZgogICAgYW5kIGZvciBrc2gsIHRoZSBmaXJzdCBsaW5lIHNob3VsZCBiZQotCSMhL3Vzci9sb2NhbC9iaW4va3NoIC1wCisgICAgIyEvdXNyL2xvY2FsL2Jpbi9rc2ggLXAKICAgIFRoZSBzY3JpcHQgc2hvdWxkIHRoZW4gc2V0IHRoZSB2YXJpYWJsZSBJRlMgdG8gdGhlIHN0cmluZwogICAgY29uc2lzdGluZyBvZiA8c3BhY2U+LCA8dGFiPiwgYW5kIDxuZXdsaW5lPi4gIEFmdGVyIHRoaXMgKCpub3QqCiAgICBiZWZvcmUhKSwgdGhlIFBBVEggdmFyaWFibGUgc2hvdWxkIGJlIHNldCB0byBhIHJlYXNvbmFibGUgdmFsdWUgYW5kCiAgICBleHBvcnRlZC4gIERvIG5vdCBleHBlY3QgdGhlIFBBVEggdG8gaGF2ZSBhIHJlYXNvbmFibGUgdmFsdWUsIHNvIGRvCiAgICBub3QgdHJ1c3QgdGhlIG9sZCB2YWx1ZSBvZiBQQVRILiAgWW91IHNob3VsZCB0aGVuIHNldCB0aGUgdW1hc2sgb2YKICAgIHRoZSBwcm9ncmFtIGJ5IGNhbGxpbmcKLQl1bWFzayAwNzcgIyBvciAwMjIgaWYgeW91IHdhbnQgdGhlIGZpbGVzIHRvIGJlIHJlYWRhYmxlCisgICAgdW1hc2sgMDc3ICMgb3IgMDIyIGlmIHlvdSB3YW50IHRoZSBmaWxlcyB0byBiZSByZWFkYWJsZQogICAgSWYgeW91IHBsYW4gdG8gY2hhbmdlIGRpcmVjdG9yaWVzLCB5b3Ugc2hvdWxkIGVpdGhlciB1bnNldCBDRFBBVEgKICAgIG9yIHNldCBpdCB0byBhIGdvb2QgdmFsdWUuICBTZXR0aW5nIENEUEFUSCB0byBqdXN0IGBgLicnIChkb3QpIGlzIGEKICAgIGdvb2QgaWRlYS4KICAgIElmLCBmb3Igc29tZSByZWFzb24sIHlvdSB3YW50IHRvIHVzZSBjc2gsIHRoZSBmaXJzdCBsaW5lIHNob3VsZCBiZQotCSMhL2Jpbi9jc2ggLWZiCisgICAgIyEvYmluL2NzaCAtZmIKICAgIFlvdSBzaG91bGQgdGhlbiBzZXQgdGhlIHBhdGggdmFyaWFibGUgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUsCiAgICB3aXRob3V0IHRydXN0aW5nIHRoZSBpbmhlcml0ZWQgcGF0aC4gIEhlcmUgdG9vLCB5b3Ugc2hvdWxkIHNldCB0aGUKICAgIHVtYXNrIHVzaW5nIHRoZSBjb21tYW5kCi0JdW1hc2sgMDc3ICMgb3IgMDIyIGlmIHlvdSB3YW50IHRoZSBmaWxlcyB0byBiZSByZWFkYWJsZQorICAgIHVtYXNrIDA3NyAjIG9yIDAyMiBpZiB5b3Ugd2FudCB0aGUgZmlsZXMgdG8gYmUgcmVhZGFibGUKICovCiAKICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTU0LDE0ICs1NCwxNCBAQAogCiAvKiBDT05GSUdVUkFUSU9OIFNFQ1RJT04gKi8KIAotI2lmbmRlZiBGVUxMX1BBVEgJLyogc28gdGhhdCB0aGlzIGNhbiBiZSBzcGVjaWZpZWQgZnJvbSB0aGUgTWFrZWZpbGUgKi8KKyNpZm5kZWYgRlVMTF9QQVRIICAgICAgIC8qIHNvIHRoYXQgdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGZyb20gdGhlIE1ha2VmaWxlICovCiAvKiBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lOgotI2RlZmluZSBGVUxMX1BBVEgJIi9mdWxsL3BhdGgvb2Yvc2NyaXB0IiAKKyNkZWZpbmUgRlVMTF9QQVRIICAgICAgICIvZnVsbC9wYXRoL29mL3NjcmlwdCIKICogVGhlbiBjb21tZW50IG91dCB0aGUgI2Vycm9yIGxpbmUuICovCiAjZXJyb3IgIllvdSBtdXN0IGRlZmluZSBGVUxMX1BBVEggc29tZXdoZXJlIgogI2VuZGlmCiAjaWZuZGVmIFVNQVNLCi0jZGVmaW5lIFVNQVNLCQkwNzcKKyNkZWZpbmUgVU1BU0sgICAgICAgICAgIDA3NwogI2VuZGlmCiAKIC8qIEVORCBPRiBDT05GSUdVUkFUSU9OIFNFQ1RJT04gKi8KQEAgLTEwMSw3NiArMTAxLDc2IEBACiB2b2lkCiBjbGVhbl9lbnZpcm9uKHZvaWQpCiB7Ci0JY2hhciAqKnA7Ci0JZXh0ZXJuIGNoYXIgKiplbnZpcm9uOworICAgIGNoYXIgKipwOworICAgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKIAotCWZvciAocCA9IGVudmlyb247ICpwOyBwKyspIHsKLQkJaWYgKHN0cm5jbXAoKnAsICJMRF8iLCAzKSA9PSAwKQotCQkJKipwID0gJ1gnOwotCQllbHNlIGlmIChzdHJuY21wKCpwLCAiX1JMRCIsIDQpID09IDApCi0JCQkqKnAgPSAnWCc7Ci0JCWVsc2UgaWYgKHN0cm5jbXAoKnAsICJQWVRIT04iLCA2KSA9PSAwKQotCQkJKipwID0gJ1gnOwotCQllbHNlIGlmIChzdHJuY21wKCpwLCAiSUZTPSIsIDQpID09IDApCi0JCQkqcCA9IGRlZl9JRlM7Ci0JCWVsc2UgaWYgKHN0cm5jbXAoKnAsICJDRFBBVEg9IiwgNykgPT0gMCkKLQkJCSpwID0gZGVmX0NEUEFUSDsKLQkJZWxzZSBpZiAoc3RybmNtcCgqcCwgIkVOVj0iLCA0KSA9PSAwKQotCQkJKnAgPSBkZWZfRU5WOwotCX0KLQlwdXRlbnYoZGVmX1BBVEgpOworICAgIGZvciAocCA9IGVudmlyb247ICpwOyBwKyspIHsKKyAgICAgICAgaWYgKHN0cm5jbXAoKnAsICJMRF8iLCAzKSA9PSAwKQorICAgICAgICAgICAgKipwID0gJ1gnOworICAgICAgICBlbHNlIGlmIChzdHJuY21wKCpwLCAiX1JMRCIsIDQpID09IDApCisgICAgICAgICAgICAqKnAgPSAnWCc7CisgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKnAsICJQWVRIT04iLCA2KSA9PSAwKQorICAgICAgICAgICAgKipwID0gJ1gnOworICAgICAgICBlbHNlIGlmIChzdHJuY21wKCpwLCAiSUZTPSIsIDQpID09IDApCisgICAgICAgICAgICAqcCA9IGRlZl9JRlM7CisgICAgICAgIGVsc2UgaWYgKHN0cm5jbXAoKnAsICJDRFBBVEg9IiwgNykgPT0gMCkKKyAgICAgICAgICAgICpwID0gZGVmX0NEUEFUSDsKKyAgICAgICAgZWxzZSBpZiAoc3RybmNtcCgqcCwgIkVOVj0iLCA0KSA9PSAwKQorICAgICAgICAgICAgKnAgPSBkZWZfRU5WOworICAgIH0KKyAgICBwdXRlbnYoZGVmX1BBVEgpOwogfQogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCXN0cnVjdCBzdGF0IHN0YXRiOwotCWdpZF90IGVnaWQgPSBnZXRlZ2lkKCk7Ci0JdWlkX3QgZXVpZCA9IGdldGV1aWQoKTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YjsKKyAgICBnaWRfdCBlZ2lkID0gZ2V0ZWdpZCgpOworICAgIHVpZF90IGV1aWQgPSBnZXRldWlkKCk7CiAKLQkvKgotCSAgIFNhbml0eSBjaGVjayAjMS4KLQkgICBUaGlzIGNoZWNrIHNob3VsZCBiZSBtYWRlIGNvbXBpbGUtdGltZSwgYnV0IHRoYXQncyBub3QgcG9zc2libGUuCi0JICAgSWYgeW91J3JlIHN1cmUgdGhhdCB5b3Ugc3BlY2lmaWVkIGEgZnVsbCBwYXRoIG5hbWUgZm9yIEZVTExfUEFUSCwKLQkgICB5b3UgY2FuIG9taXQgdGhpcyBjaGVjay4KLQkqLwotCWlmIChGVUxMX1BBVEhbMF0gIT0gJy8nKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIGlzIG5vdCBhIGZ1bGwgcGF0aCBuYW1lXG4iLCBhcmd2WzBdLAotCQkJRlVMTF9QQVRIKTsKLQkJZnByaW50ZihzdGRlcnIsICJZb3UgY2FuIG9ubHkgdXNlIHRoaXMgd3JhcHBlciBpZiB5b3VcbiIpOwotCQlmcHJpbnRmKHN0ZGVyciwgImNvbXBpbGUgaXQgd2l0aCBhbiBhYnNvbHV0ZSBwYXRoLlxuIik7Ci0JCWV4aXQoMSk7Ci0JfQorICAgIC8qCisgICAgICAgU2FuaXR5IGNoZWNrICMxLgorICAgICAgIFRoaXMgY2hlY2sgc2hvdWxkIGJlIG1hZGUgY29tcGlsZS10aW1lLCBidXQgdGhhdCdzIG5vdCBwb3NzaWJsZS4KKyAgICAgICBJZiB5b3UncmUgc3VyZSB0aGF0IHlvdSBzcGVjaWZpZWQgYSBmdWxsIHBhdGggbmFtZSBmb3IgRlVMTF9QQVRILAorICAgICAgIHlvdSBjYW4gb21pdCB0aGlzIGNoZWNrLgorICAgICovCisgICAgaWYgKEZVTExfUEFUSFswXSAhPSAnLycpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJXMgaXMgbm90IGEgZnVsbCBwYXRoIG5hbWVcbiIsIGFyZ3ZbMF0sCisgICAgICAgICAgICBGVUxMX1BBVEgpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIllvdSBjYW4gb25seSB1c2UgdGhpcyB3cmFwcGVyIGlmIHlvdVxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY29tcGlsZSBpdCB3aXRoIGFuIGFic29sdXRlIHBhdGguXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CiAKLQkvKgotCSAgIFNhbml0eSBjaGVjayAjMi4KLQkgICBDaGVjayB0aGF0IHRoZSBvd25lciBvZiB0aGUgc2NyaXB0IGlzIGVxdWFsIHRvIGVpdGhlciB0aGUKLQkgICBlZmZlY3RpdmUgdWlkIG9yIHRoZSBzdXBlciB1c2VyLgotCSovCi0JaWYgKHN0YXQoRlVMTF9QQVRILCAmc3RhdGIpIDwgMCkgewotCQlwZXJyb3IoInN0YXQiKTsKLQkJZXhpdCgxKTsKLQl9Ci0JaWYgKHN0YXRiLnN0X3VpZCAhPSAwICYmIHN0YXRiLnN0X3VpZCAhPSBldWlkKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIGhhcyB0aGUgd3Jvbmcgb3duZXJcbiIsIGFyZ3ZbMF0sCi0JCQlGVUxMX1BBVEgpOwotCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBzY3JpcHQgc2hvdWxkIGJlIG93bmVkIGJ5IHJvb3QsXG4iKTsKLQkJZnByaW50ZihzdGRlcnIsICJhbmQgc2hvdWxkbid0IGJlIHdyaXRlYWJsZSBieSBhbnlvbmUuXG4iKTsKLQkJZXhpdCgxKTsKLQl9CisgICAgLyoKKyAgICAgICBTYW5pdHkgY2hlY2sgIzIuCisgICAgICAgQ2hlY2sgdGhhdCB0aGUgb3duZXIgb2YgdGhlIHNjcmlwdCBpcyBlcXVhbCB0byBlaXRoZXIgdGhlCisgICAgICAgZWZmZWN0aXZlIHVpZCBvciB0aGUgc3VwZXIgdXNlci4KKyAgICAqLworICAgIGlmIChzdGF0KEZVTExfUEFUSCwgJnN0YXRiKSA8IDApIHsKKyAgICAgICAgcGVycm9yKCJzdGF0Iik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIGlmIChzdGF0Yi5zdF91aWQgIT0gMCAmJiBzdGF0Yi5zdF91aWQgIT0gZXVpZCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyBoYXMgdGhlIHdyb25nIG93bmVyXG4iLCBhcmd2WzBdLAorICAgICAgICAgICAgRlVMTF9QQVRIKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaGUgc2NyaXB0IHNob3VsZCBiZSBvd25lZCBieSByb290LFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYW5kIHNob3VsZG4ndCBiZSB3cml0ZWFibGUgYnkgYW55b25lLlxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQogCi0JaWYgKHNldHJlZ2lkKGVnaWQsIGVnaWQpIDwgMCkKLQkJcGVycm9yKCJzZXRyZWdpZCIpOwotCWlmIChzZXRyZXVpZChldWlkLCBldWlkKSA8IDApCi0JCXBlcnJvcigic2V0cmV1aWQiKTsKKyAgICBpZiAoc2V0cmVnaWQoZWdpZCwgZWdpZCkgPCAwKQorICAgICAgICBwZXJyb3IoInNldHJlZ2lkIik7CisgICAgaWYgKHNldHJldWlkKGV1aWQsIGV1aWQpIDwgMCkKKyAgICAgICAgcGVycm9yKCJzZXRyZXVpZCIpOwogCi0JY2xlYW5fZW52aXJvbigpOworICAgIGNsZWFuX2Vudmlyb24oKTsKIAotCXVtYXNrKFVNQVNLKTsKKyAgICB1bWFzayhVTUFTSyk7CiAKLQl3aGlsZSAoKiphcmd2ID09ICctJykJLyogZG9uJ3QgbGV0IGFyZ3ZbMF0gc3RhcnQgd2l0aCAnLScgKi8KLQkJKCphcmd2KSsrOwotCWV4ZWN2KEZVTExfUEFUSCwgYXJndik7Ci0JZnByaW50ZihzdGRlcnIsICIlczogY291bGQgbm90IGV4ZWN1dGUgdGhlIHNjcmlwdFxuIiwgYXJndlswXSk7Ci0JZXhpdCgxKTsKKyAgICB3aGlsZSAoKiphcmd2ID09ICctJykgICAgICAgLyogZG9uJ3QgbGV0IGFyZ3ZbMF0gc3RhcnQgd2l0aCAnLScgKi8KKyAgICAgICAgKCphcmd2KSsrOworICAgIGV4ZWN2KEZVTExfUEFUSCwgYXJndik7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogY291bGQgbm90IGV4ZWN1dGUgdGhlIHNjcmlwdFxuIiwgYXJndlswXSk7CisgICAgZXhpdCgxKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Jpc2VjdG1vZHVsZS5jIGIvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMKaW5kZXggZmM1NDk1NC4uYjUxZjNkZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMKQEAgLTgsNTEgKzgsNTEgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBpbnRlcm5hbF9iaXNlY3RfcmlnaHQoUHlPYmplY3QgKmxpc3QsIFB5T2JqZWN0ICppdGVtLCBQeV9zc2l6ZV90IGxvLCBQeV9zc2l6ZV90IGhpKQogewotCVB5T2JqZWN0ICpsaXRlbTsKLQlQeV9zc2l6ZV90IG1pZCwgcmVzOworICAgIFB5T2JqZWN0ICpsaXRlbTsKKyAgICBQeV9zc2l6ZV90IG1pZCwgcmVzOwogCi0JaWYgKGxvIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGhpID09IC0xKSB7Ci0JCWhpID0gUHlTZXF1ZW5jZV9TaXplKGxpc3QpOwotCQlpZiAoaGkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQl3aGlsZSAobG8gPCBoaSkgewotCQltaWQgPSAobG8gKyBoaSkgLyAyOwotCQlsaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShsaXN0LCBtaWQpOwotCQlpZiAobGl0ZW0gPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmVzID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0ZW0sIGxpdGVtLCBQeV9MVCk7Ci0JCVB5X0RFQ1JFRihsaXRlbSk7Ci0JCWlmIChyZXMgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocmVzKQotCQkJaGkgPSBtaWQ7Ci0JCWVsc2UKLQkJCWxvID0gbWlkICsgMTsKLQl9Ci0JcmV0dXJuIGxvOworICAgIGlmIChsbyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChoaSA9PSAtMSkgeworICAgICAgICBoaSA9IFB5U2VxdWVuY2VfU2l6ZShsaXN0KTsKKyAgICAgICAgaWYgKGhpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd2hpbGUgKGxvIDwgaGkpIHsKKyAgICAgICAgbWlkID0gKGxvICsgaGkpIC8gMjsKKyAgICAgICAgbGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0obGlzdCwgbWlkKTsKKyAgICAgICAgaWYgKGxpdGVtID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCBsaXRlbSwgUHlfTFQpOworICAgICAgICBQeV9ERUNSRUYobGl0ZW0pOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgIGhpID0gbWlkOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsbyA9IG1pZCArIDE7CisgICAgfQorICAgIHJldHVybiBsbzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpc2VjdF9yaWdodChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqbGlzdCwgKml0ZW07Ci0JUHlfc3NpemVfdCBsbyA9IDA7Ci0JUHlfc3NpemVfdCBoaSA9IC0xOwotCVB5X3NzaXplX3QgaW5kZXg7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImEiLCAieCIsICJsbyIsICJoaSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpsaXN0LCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IGxvID0gMDsKKyAgICBQeV9zc2l6ZV90IGhpID0gLTE7CisgICAgUHlfc3NpemVfdCBpbmRleDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYSIsICJ4IiwgImxvIiwgImhpIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG5uOmJpc2VjdF9yaWdodCIsCi0JCWtleXdvcmRzLCAmbGlzdCwgJml0ZW0sICZsbywgJmhpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5kZXggPSBpbnRlcm5hbF9iaXNlY3RfcmlnaHQobGlzdCwgaXRlbSwgbG8sIGhpKTsKLQlpZiAoaW5kZXggPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoaW5kZXgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098bm46YmlzZWN0X3JpZ2h0IiwKKyAgICAgICAga2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbmRleCA9IGludGVybmFsX2Jpc2VjdF9yaWdodChsaXN0LCBpdGVtLCBsbywgaGkpOworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChpbmRleCk7CiB9CiAKIFB5RG9jX1NUUlZBUihiaXNlY3RfcmlnaHRfZG9jLApAQCAtNzAsMzAgKzcwLDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5zb3J0X3JpZ2h0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpsaXN0LCAqaXRlbSwgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGxvID0gMDsKLQlQeV9zc2l6ZV90IGhpID0gLTE7Ci0JUHlfc3NpemVfdCBpbmRleDsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYSIsICJ4IiwgImxvIiwgImhpIiwgTlVMTH07CisgICAgUHlPYmplY3QgKmxpc3QsICppdGVtLCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgbG8gPSAwOworICAgIFB5X3NzaXplX3QgaGkgPSAtMTsKKyAgICBQeV9zc2l6ZV90IGluZGV4OworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJhIiwgIngiLCAibG8iLCAiaGkiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098bm46aW5zb3J0X3JpZ2h0IiwKLQkJa2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQotCQlyZXR1cm4gTlVMTDsKLQlpbmRleCA9IGludGVybmFsX2Jpc2VjdF9yaWdodChsaXN0LCBpdGVtLCBsbywgaGkpOwotCWlmIChpbmRleCA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChQeUxpc3RfQ2hlY2tFeGFjdChsaXN0KSkgewotCQlpZiAoUHlMaXN0X0luc2VydChsaXN0LCBpbmRleCwgaXRlbSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChsaXN0LCAiaW5zZXJ0IiwgIm5PIiwKLQkJCQkJICAgICBpbmRleCwgaXRlbSk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPT3xubjppbnNvcnRfcmlnaHQiLAorICAgICAgICBrZXl3b3JkcywgJmxpc3QsICZpdGVtLCAmbG8sICZoaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGluZGV4ID0gaW50ZXJuYWxfYmlzZWN0X3JpZ2h0KGxpc3QsIGl0ZW0sIGxvLCBoaSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KGxpc3QpKSB7CisgICAgICAgIGlmIChQeUxpc3RfSW5zZXJ0KGxpc3QsIGluZGV4LCBpdGVtKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxpc3QsICJpbnNlcnQiLCAibk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBpdGVtKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoaW5zb3J0X3JpZ2h0X2RvYywKQEAgLTEwOSw1MSArMTA5LDUxIEBACiBzdGF0aWMgUHlfc3NpemVfdAogaW50ZXJuYWxfYmlzZWN0X2xlZnQoUHlPYmplY3QgKmxpc3QsIFB5T2JqZWN0ICppdGVtLCBQeV9zc2l6ZV90IGxvLCBQeV9zc2l6ZV90IGhpKQogewotCVB5T2JqZWN0ICpsaXRlbTsKLQlQeV9zc2l6ZV90IG1pZCwgcmVzOworICAgIFB5T2JqZWN0ICpsaXRlbTsKKyAgICBQeV9zc2l6ZV90IG1pZCwgcmVzOwogCi0JaWYgKGxvIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGhpID09IC0xKSB7Ci0JCWhpID0gUHlTZXF1ZW5jZV9TaXplKGxpc3QpOwotCQlpZiAoaGkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQl3aGlsZSAobG8gPCBoaSkgewotCQltaWQgPSAobG8gKyBoaSkgLyAyOwotCQlsaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShsaXN0LCBtaWQpOwotCQlpZiAobGl0ZW0gPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmVzID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGxpdGVtLCBpdGVtLCBQeV9MVCk7Ci0JCVB5X0RFQ1JFRihsaXRlbSk7Ci0JCWlmIChyZXMgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlpZiAocmVzKQotCQkJbG8gPSBtaWQgKyAxOwotCQllbHNlCi0JCQloaSA9IG1pZDsKLQl9Ci0JcmV0dXJuIGxvOworICAgIGlmIChsbyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChoaSA9PSAtMSkgeworICAgICAgICBoaSA9IFB5U2VxdWVuY2VfU2l6ZShsaXN0KTsKKyAgICAgICAgaWYgKGhpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgd2hpbGUgKGxvIDwgaGkpIHsKKyAgICAgICAgbWlkID0gKGxvICsgaGkpIC8gMjsKKyAgICAgICAgbGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0obGlzdCwgbWlkKTsKKyAgICAgICAgaWYgKGxpdGVtID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChsaXRlbSwgaXRlbSwgUHlfTFQpOworICAgICAgICBQeV9ERUNSRUYobGl0ZW0pOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgIGxvID0gbWlkICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaGkgPSBtaWQ7CisgICAgfQorICAgIHJldHVybiBsbzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpc2VjdF9sZWZ0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpsaXN0LCAqaXRlbTsKLQlQeV9zc2l6ZV90IGxvID0gMDsKLQlQeV9zc2l6ZV90IGhpID0gLTE7Ci0JUHlfc3NpemVfdCBpbmRleDsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYSIsICJ4IiwgImxvIiwgImhpIiwgTlVMTH07CisgICAgUHlPYmplY3QgKmxpc3QsICppdGVtOworICAgIFB5X3NzaXplX3QgbG8gPSAwOworICAgIFB5X3NzaXplX3QgaGkgPSAtMTsKKyAgICBQeV9zc2l6ZV90IGluZGV4OworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJhIiwgIngiLCAibG8iLCAiaGkiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098bm46YmlzZWN0X2xlZnQiLAotCQlrZXl3b3JkcywgJmxpc3QsICZpdGVtLCAmbG8sICZoaSkpCi0JCXJldHVybiBOVUxMOwotCWluZGV4ID0gaW50ZXJuYWxfYmlzZWN0X2xlZnQobGlzdCwgaXRlbSwgbG8sIGhpKTsKLQlpZiAoaW5kZXggPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoaW5kZXgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098bm46YmlzZWN0X2xlZnQiLAorICAgICAgICBrZXl3b3JkcywgJmxpc3QsICZpdGVtLCAmbG8sICZoaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGluZGV4ID0gaW50ZXJuYWxfYmlzZWN0X2xlZnQobGlzdCwgaXRlbSwgbG8sIGhpKTsKKyAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoaW5kZXgpOwogfQogCiBQeURvY19TVFJWQVIoYmlzZWN0X2xlZnRfZG9jLApAQCAtMTcxLDMwICsxNzEsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnNvcnRfbGVmdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqbGlzdCwgKml0ZW0sICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBsbyA9IDA7Ci0JUHlfc3NpemVfdCBoaSA9IC0xOwotCVB5X3NzaXplX3QgaW5kZXg7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImEiLCAieCIsICJsbyIsICJoaSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpsaXN0LCAqaXRlbSwgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGxvID0gMDsKKyAgICBQeV9zc2l6ZV90IGhpID0gLTE7CisgICAgUHlfc3NpemVfdCBpbmRleDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYSIsICJ4IiwgImxvIiwgImhpIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG5uOmluc29ydF9sZWZ0IiwKLQkJa2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQotCQlyZXR1cm4gTlVMTDsKLQlpbmRleCA9IGludGVybmFsX2Jpc2VjdF9sZWZ0KGxpc3QsIGl0ZW0sIGxvLCBoaSk7Ci0JaWYgKGluZGV4IDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5TGlzdF9DaGVja0V4YWN0KGxpc3QpKSB7Ci0JCWlmIChQeUxpc3RfSW5zZXJ0KGxpc3QsIGluZGV4LCBpdGVtKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxpc3QsICJpbnNlcnQiLCAiaU8iLAotCQkJCQkgICAgIGluZGV4LCBpdGVtKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG5uOmluc29ydF9sZWZ0IiwKKyAgICAgICAga2V5d29yZHMsICZsaXN0LCAmaXRlbSwgJmxvLCAmaGkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbmRleCA9IGludGVybmFsX2Jpc2VjdF9sZWZ0KGxpc3QsIGl0ZW0sIGxvLCBoaSk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KGxpc3QpKSB7CisgICAgICAgIGlmIChQeUxpc3RfSW5zZXJ0KGxpc3QsIGluZGV4LCBpdGVtKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxpc3QsICJpbnNlcnQiLCAiaU8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBpdGVtKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoaW5zb3J0X2xlZnRfZG9jLApAQCAtMjExLDE5ICsyMTEsMTkgQEAKIFB5RG9jX1NUUlZBUihpbnNvcnRfZG9jLCAiQWxpYXMgZm9yIGluc29ydF9yaWdodCgpLlxuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBiaXNlY3RfbWV0aG9kc1tdID0gewotCXsiYmlzZWN0X3JpZ2h0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9yaWdodCwKLQkJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpc2VjdF9yaWdodF9kb2N9LAotCXsiYmlzZWN0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9yaWdodCwKLQkJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpc2VjdF9kb2N9LAotCXsiaW5zb3J0X3JpZ2h0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9yaWdodCwKLQkJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGluc29ydF9yaWdodF9kb2N9LAotCXsiaW5zb3J0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9yaWdodCwKLQkJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGluc29ydF9kb2N9LAotCXsiYmlzZWN0X2xlZnQiLCAoUHlDRnVuY3Rpb24pYmlzZWN0X2xlZnQsCi0JCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBiaXNlY3RfbGVmdF9kb2N9LAotCXsiaW5zb3J0X2xlZnQiLCAoUHlDRnVuY3Rpb24paW5zb3J0X2xlZnQsCi0JCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBpbnNvcnRfbGVmdF9kb2N9LAotCXtOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLworICAgIHsiYmlzZWN0X3JpZ2h0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9yaWdodCwKKyAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpc2VjdF9yaWdodF9kb2N9LAorICAgIHsiYmlzZWN0IiwgKFB5Q0Z1bmN0aW9uKWJpc2VjdF9yaWdodCwKKyAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJpc2VjdF9kb2N9LAorICAgIHsiaW5zb3J0X3JpZ2h0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9yaWdodCwKKyAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGluc29ydF9yaWdodF9kb2N9LAorICAgIHsiaW5zb3J0IiwgKFB5Q0Z1bmN0aW9uKWluc29ydF9yaWdodCwKKyAgICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGluc29ydF9kb2N9LAorICAgIHsiYmlzZWN0X2xlZnQiLCAoUHlDRnVuY3Rpb24pYmlzZWN0X2xlZnQsCisgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBiaXNlY3RfbGVmdF9kb2N9LAorICAgIHsiaW5zb3J0X2xlZnQiLCAoUHlDRnVuY3Rpb24paW5zb3J0X2xlZnQsCisgICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBpbnNvcnRfbGVmdF9kb2N9LAorICAgIHtOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC0yMzcsNyArMjM3LDcgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X2Jpc2VjdCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJfYmlzZWN0IiwgYmlzZWN0X21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiX2Jpc2VjdCIsIGJpc2VjdF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JzZGRiLmMgYi9Nb2R1bGVzL19ic2RkYi5jCmluZGV4IDVhZWRmY2EuLjc1NTI0MmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2JzZGRiLmMKKysrIGIvTW9kdWxlcy9fYnNkZGIuYwpAQCAtMTM5LDkgKzEzOSw5IEBACiAvKiBhbmQgdGhlc2UgYXJlIGZvciBjYWxsaW5nIEMgLS0+IFB5dGhvbiAqLwogI2lmIGRlZmluZWQoTVlEQl9VU0VfR0lMU1RBVEUpCiAjZGVmaW5lIE1ZREJfQkVHSU5fQkxPQ0tfVEhSRUFEUyBcCi0JCVB5R0lMU3RhdGVfU1RBVEUgX19zYXZlc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworICAgICAgICAgICAgICAgIFB5R0lMU3RhdGVfU1RBVEUgX19zYXZlc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2RlZmluZSBNWURCX0VORF9CTE9DS19USFJFQURTIFwKLQkJUHlHSUxTdGF0ZV9SZWxlYXNlKF9fc2F2ZXN0YXRlKTsKKyAgICAgICAgICAgICAgICBQeUdJTFN0YXRlX1JlbGVhc2UoX19zYXZlc3RhdGUpOwogI2Vsc2UgLyogTVlEQl9VU0VfR0lMU1RBVEUgKi8KIC8qIFByZSBHSUxTdGF0ZSBBUEkgLSBkbyBpdCB0aGUgbG9uZyBvbGQgd2F5ICovCiBzdGF0aWMgUHlJbnRlcnByZXRlclN0YXRlKiBfZGJfaW50ZXJwcmV0ZXJTdGF0ZSA9IE5VTEw7CkBAIC0yMTIsNyArMjEyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCogREJSZXBVbmF2YWlsRXJyb3I7ICAgICAvKiBEQl9SRVBfVU5BVkFJTCAqLwogCiAjaWYgKERCVkVSIDwgNDMpCi0jZGVmaW5lCURCX0JVRkZFUl9TTUFMTAkJRU5PTUVNCisjZGVmaW5lIERCX0JVRkZFUl9TTUFMTCAgICAgICAgIEVOT01FTQogI2VuZGlmCiAKIApAQCAtNTM3LDcgKzUzNyw3IEBACiAKICAgICBzcmNsZW4gPSBzdHJsZW4oc3JjKTsKICAgICBpZiAobiA8PSAwKQotCXJldHVybiBzcmNsZW47CisgICAgICAgIHJldHVybiBzcmNsZW47CiAgICAgY29weWxlbiA9IChzcmNsZW4gPiBuLTEpID8gbi0xIDogc3JjbGVuOwogICAgIC8qIHBvcHVsYXRlIGRlc3RbMF0gdGhydSBkZXN0W2NvcHlsZW4tMV0gKi8KICAgICBtZW1jcHkoZGVzdCwgc3JjLCBjb3B5bGVuKTsKQEAgLTU1NCw3ICs1NTQsNyBAQAogc3RhdGljIHZvaWQgX2RiX2Vycm9yQ2FsbGJhY2soY29uc3QgY2hhciogcHJlZml4LCBjaGFyKiBtc2cpCiAjZWxzZQogc3RhdGljIHZvaWQgX2RiX2Vycm9yQ2FsbGJhY2soY29uc3QgREJfRU5WICpkYl9lbnYsCi0JY29uc3QgY2hhciogcHJlZml4LCBjb25zdCBjaGFyKiBtc2cpCisgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwgY29uc3QgY2hhciogbXNnKQogI2VuZGlmCiB7CiAgICAgb3VyX3N0cmxjcHkoX2RiX2Vycm1zZywgbXNnLCBzaXplb2YoX2RiX2Vycm1zZykpOwpAQCAtNjc2LDcgKzY3Niw3IEBACiAgICAgICAgICAgICAvKiBFbnN1cmUgdGhhdCBieXRlc19sZWZ0IG5ldmVyIGdvZXMgbmVnYXRpdmUgKi8KICAgICAgICAgICAgIGlmIChfZGJfZXJybXNnWzBdICYmIGJ5dGVzX2xlZnQgPCAoc2l6ZW9mKGVyclR4dCkgLSA0KSkgewogICAgICAgICAgICAgICAgIGJ5dGVzX2xlZnQgPSBzaXplb2YoZXJyVHh0KSAtIGJ5dGVzX2xlZnQgLSA0IC0gMTsKLQkJYXNzZXJ0KGJ5dGVzX2xlZnQgPj0gMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGJ5dGVzX2xlZnQgPj0gMCk7CiAgICAgICAgICAgICAgICAgc3RyY2F0KGVyclR4dCwgIiAtLSAiKTsKICAgICAgICAgICAgICAgICBzdHJuY2F0KGVyclR4dCwgX2RiX2Vycm1zZywgYnl0ZXNfbGVmdCk7CiAgICAgICAgICAgICB9CkBAIC03MDUsOCArNzA1LDggQEAKICAgICAgICAgY2FzZSBEQl9CVUZGRVJfU01BTEw6ICAgICAgIGVyck9iaiA9IERCTm9NZW1vcnlFcnJvcjsgICAgICAgYnJlYWs7CiAKICNpZiAoREJWRVIgPj0gNDMpCi0JLyogRU5PTUVNIGFuZCBEQl9CVUZGRVJfU01BTEwgd2VyZSBvbmUgYW5kIHRoZSBzYW1lIHVudGlsIDQuMyAqLwotCWNhc2UgRU5PTUVNOiAgZXJyT2JqID0gUHlFeGNfTWVtb3J5RXJyb3I7ICAgYnJlYWs7CisgICAgICAgIC8qIEVOT01FTSBhbmQgREJfQlVGRkVSX1NNQUxMIHdlcmUgb25lIGFuZCB0aGUgc2FtZSB1bnRpbCA0LjMgKi8KKyAgICAgICAgY2FzZSBFTk9NRU06ICBlcnJPYmogPSBQeUV4Y19NZW1vcnlFcnJvcjsgICBicmVhazsKICNlbmRpZgogICAgICAgICBjYXNlIEVJTlZBTDogIGVyck9iaiA9IERCSW52YWxpZEFyZ0Vycm9yOyAgIGJyZWFrOwogICAgICAgICBjYXNlIEVBQ0NFUzogIGVyck9iaiA9IERCQWNjZXNzRXJyb3I7ICAgICAgIGJyZWFrOwpAQCAtODExLDcgKzgxMSw3IEBACiAKIC8qIEdldCBhIGtleS9kYXRhIHBhaXIgZnJvbSBhIGN1cnNvciAqLwogc3RhdGljIFB5T2JqZWN0KiBfREJDdXJzb3JfZ2V0KERCQ3Vyc29yT2JqZWN0KiBzZWxmLCBpbnQgZXh0cmFfZmxhZ3MsCi0JCQkgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MsIGNoYXIgKmZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncywgY2hhciAqZm9ybWF0KQogewogICAgIGludCBlcnI7CiAgICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CkBAIC04MjIsNyArODIyLDcgQEAKICAgICBzdGF0aWMgY2hhcioga3duYW1lc1tdID0geyAiZmxhZ3MiLCAiZGxlbiIsICJkb2ZmIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCBmb3JtYXQsIGt3bmFtZXMsCi0JCQkJICAgICAmZmxhZ3MsICZkbGVuLCAmZG9mZikpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgQ0hFQ0tfQ1VSU09SX05PVF9DTE9TRUQoc2VsZik7CkBAIC04MzgsNyArODM4LDcgQEAKICAgICBNWURCX0VORF9BTExPV19USFJFQURTOwogCiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTg4MiwxMyArODgyLDEzIEBACiBzdGF0aWMgdm9pZCBfYWRkVGltZVRUb0RpY3QoUHlPYmplY3QqIGRpY3QsIGNoYXIgKm5hbWUsIHRpbWVfdCB2YWx1ZSkKIHsKICAgICBQeU9iamVjdCogdjsKLQkvKiBpZiB0aGUgdmFsdWUgZml0cyBpbiByZWd1bGFyIGludCwgdXNlIHRoYXQuICovCisgICAgICAgIC8qIGlmIHRoZSB2YWx1ZSBmaXRzIGluIHJlZ3VsYXIgaW50LCB1c2UgdGhhdC4gKi8KICNpZmRlZiBQWV9MT05HX0xPTkcKLQlpZiAoc2l6ZW9mKHRpbWVfdCkgPiBzaXplb2YobG9uZykpCi0JCXYgPSBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpIHZhbHVlKTsKLQllbHNlCisgICAgICAgIGlmIChzaXplb2YodGltZV90KSA+IHNpemVvZihsb25nKSkKKyAgICAgICAgICAgICAgICB2ID0gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKSB2YWx1ZSk7CisgICAgICAgIGVsc2UKICNlbmRpZgotCQl2ID0gTlVNQkVSX0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgdiA9IE5VTUJFUl9Gcm9tTG9uZygobG9uZykgdmFsdWUpOwogICAgIGlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBuYW1lLCB2KSkKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIApAQCAtMTAzOCwxMCArMTAzOCwxMCBAQAogCiAgICAgSU5TRVJUX0lOX0RPVUJMRV9MSU5LRURfTElTVChzZWxmLT5teWRiLT5jaGlsZHJlbl9jdXJzb3JzLHNlbGYpOwogICAgIGlmICh0eG4gJiYgKChQeU9iamVjdCAqKXR4biE9UHlfTm9uZSkpIHsKLQkgICAgSU5TRVJUX0lOX0RPVUJMRV9MSU5LRURfTElTVF9UWE4odHhuLT5jaGlsZHJlbl9jdXJzb3JzLHNlbGYpOwotCSAgICBzZWxmLT50eG49dHhuOworICAgICAgICAgICAgSU5TRVJUX0lOX0RPVUJMRV9MSU5LRURfTElTVF9UWE4odHhuLT5jaGlsZHJlbl9jdXJzb3JzLHNlbGYpOworICAgICAgICAgICAgc2VsZi0+dHhuPXR4bjsKICAgICB9IGVsc2UgewotCSAgICBzZWxmLT50eG49TlVMTDsKKyAgICAgICAgICAgIHNlbGYtPnR4bj1OVUxMOwogICAgIH0KIAogICAgIHNlbGYtPmluX3dlYWtyZWZsaXN0ID0gTlVMTDsKQEAgLTE0MDYsMTYgKzE0MDYsMTYgQEAKICAgICAgICAgICAgIFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKHJlc3VsdCwgJmRhdGEsICZzaXplKTsKICAgICAgICAgICAgIHNlY0tleS0+ZmxhZ3MgPSBEQl9EQlRfQVBQTUFMTE9DOyAgIC8qIERCIHdpbGwgZnJlZSAqLwogICAgICAgICAgICAgc2VjS2V5LT5kYXRhID0gbWFsbG9jKHNpemUpOyAgICAgICAgLyogVE9ETywgY2hlY2sgdGhpcyAqLwotCSAgICBpZiAoc2VjS2V5LT5kYXRhKSB7Ci0JCW1lbWNweShzZWNLZXktPmRhdGEsIGRhdGEsIHNpemUpOwotCQlzZWNLZXktPnNpemUgPSBzaXplOwotCQlyZXR2YWwgPSAwOwotCSAgICB9Ci0JICAgIGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICBpZiAoc2VjS2V5LT5kYXRhKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHNlY0tleS0+ZGF0YSwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgc2VjS2V5LT5zaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFsbG9jIGZhaWxlZCBpbiBfZGJfYXNzb2NpYXRlQ2FsbGJhY2siKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQkgICAgfQorICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCkBAIC0xNDk5LDcgKzE0OTksNyBAQAogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKICNpZiAoREJWRVIgPj0gNDEpCiAgICAgZXJyID0gc2VsZi0+ZGItPmFzc29jaWF0ZShzZWxmLT5kYiwKLQkgICAgICAgICAgICAgICAgICAgICAgdHhuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5REItPmRiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RiX2Fzc29jaWF0ZUNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwpAQCAtMTYxNyw3ICsxNjE3LDcgQEAKICAgICBNWURCX0VORF9BTExPV19USFJFQURTOwogCiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgZXJyID0gMDsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwpAQCAtMTc2NCw3ICsxNzY0LDcgQEAKICAgICAgICAgcmV0dmFsID0gZGZsdG9iajsKICAgICB9CiAgICAgZWxzZSBpZiAoKGVyciA9PSBEQl9OT1RGT1VORCB8fCBlcnIgPT0gREJfS0VZRU1QVFkpCi0JICAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgICYmIHNlbGYtPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CiAgICAgICAgIGVyciA9IDA7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKQEAgLTE4MzMsNyArMTgzMyw3IEBACiAgICAgICAgIHJldHZhbCA9IGRmbHRvYmo7CiAgICAgfQogICAgIGVsc2UgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAgJiYgc2VsZi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKKyAgICAgICAgICAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgewogICAgICAgICBlcnIgPSAwOwogICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgIHJldHZhbCA9IFB5X05vbmU7CkBAIC0xOTY4LDcgKzE5NjgsNyBAQAogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAKICAgICBpZiAoKGVyciA9PSBEQl9OT1RGT1VORCB8fCBlcnIgPT0gREJfS0VZRU1QVFkpCi0JICAgICYmIHNlbGYtPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CisgICAgICAgICAgICAmJiBzZWxmLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgewogICAgICAgICBlcnIgPSAwOwogICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgICAgIHJldHZhbCA9IFB5X05vbmU7CkBAIC0yMDQyLDggKzIwNDIsOCBAQAogICAgIGxlbmd0aCA9IFB5T2JqZWN0X0xlbmd0aChjdXJzb3JzT2JqKTsKICAgICBjdXJzb3JzID0gbWFsbG9jKChsZW5ndGgrMSkgKiBzaXplb2YoREJDKikpOwogICAgIGlmICghY3Vyc29ycykgewotCVB5RXJyX05vTWVtb3J5KCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGN1cnNvcnNbbGVuZ3RoXSA9IE5VTEw7CkBAIC0yMTM0LDI4ICsyMTM0LDI4IEBACiAKICNpZiAoREJWRVIgPj0gNDEpCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAienx6aWlpTzpvcGVuIiwga3duYW1lcywKLQkJCQkgICAgICZmaWxlbmFtZSwgJmRibmFtZSwgJnR5cGUsICZmbGFncywgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVuYW1lLCAmZGJuYW1lLCAmdHlwZSwgJmZsYWdzLCAmbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHhub2JqKSkKICNlbHNlCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAienx6aWlpOm9wZW4iLCBrd25hbWVzLAotCQkJCSAgICAgJmZpbGVuYW1lLCAmZGJuYW1lLCAmdHlwZSwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZSwgJmRibmFtZSwgJnR5cGUsICZmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCiAjZW5kaWYKICAgICB7Ci0JUHlFcnJfQ2xlYXIoKTsKLQl0eXBlID0gREJfVU5LTk9XTjsgZmxhZ3MgPSAwOyBtb2RlID0gMDY2MDsKLQlmaWxlbmFtZSA9IE5VTEw7IGRibmFtZSA9IE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHR5cGUgPSBEQl9VTktOT1dOOyBmbGFncyA9IDA7IG1vZGUgPSAwNjYwOworICAgICAgICBmaWxlbmFtZSA9IE5VTEw7IGRibmFtZSA9IE5VTEw7CiAjaWYgKERCVkVSID49IDQxKQotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywienxpaWlPOm9wZW4iLAorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsInp8aWlpTzpvcGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3duYW1lc19iYXNpYywKLQkJCQkJICZmaWxlbmFtZSwgJnR5cGUsICZmbGFncywgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbmFtZSwgJnR5cGUsICZmbGFncywgJm1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eG5vYmopKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2Vsc2UKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsInp8aWlpOm9wZW4iLAorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsInp8aWlpOm9wZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd25hbWVzX2Jhc2ljLAotCQkJCQkgJmZpbGVuYW1lLCAmdHlwZSwgJmZsYWdzLCAmbW9kZSkpCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZW5hbWUsICZ0eXBlLCAmZmxhZ3MsICZtb2RlKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAgICAgfQogCkBAIC0yMzM4LDIwICsyMzM4LDIwIEBACiAKIHN0YXRpYyBpbnQKIF9kZWZhdWx0X2NtcChjb25zdCBEQlQgKmxlZnRLZXksCi0JICAgICBjb25zdCBEQlQgKnJpZ2h0S2V5KQorICAgICAgICAgICAgIGNvbnN0IERCVCAqcmlnaHRLZXkpCiB7CiAgIGludCByZXM7CiAgIGludCBsc2l6ZSA9IGxlZnRLZXktPnNpemUsIHJzaXplID0gcmlnaHRLZXktPnNpemU7CiAKICAgcmVzID0gbWVtY21wKGxlZnRLZXktPmRhdGEsIHJpZ2h0S2V5LT5kYXRhLAotCSAgICAgICBsc2l6ZSA8IHJzaXplID8gbHNpemUgOiByc2l6ZSk7CisgICAgICAgICAgICAgICBsc2l6ZSA8IHJzaXplID8gbHNpemUgOiByc2l6ZSk7CiAKICAgaWYgKHJlcyA9PSAwKSB7CiAgICAgICBpZiAobHNpemUgPCByc2l6ZSkgewotCSAgcmVzID0gLTE7CisgICAgICAgICAgcmVzID0gLTE7CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChsc2l6ZSA+IHJzaXplKSB7Ci0JICByZXMgPSAxOworICAgICAgICAgIHJlcyA9IDE7CiAgICAgICB9CiAgIH0KICAgcmV0dXJuIHJlczsKQEAgLTIzNTksOCArMjM1OSw4IEBACiAKIHN0YXRpYyBpbnQKIF9kYl9jb21wYXJlQ2FsbGJhY2soREIqIGRiLAotCQkgICAgY29uc3QgREJUICpsZWZ0S2V5LAotCQkgICAgY29uc3QgREJUICpyaWdodEtleSkKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgREJUICpsZWZ0S2V5LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEQlQgKnJpZ2h0S2V5KQogewogICAgIGludCByZXMgPSAwOwogICAgIFB5T2JqZWN0ICphcmdzOwpAQCAtMjM2OCw0MCArMjM2OCw0MCBAQAogICAgIERCT2JqZWN0ICpzZWxmID0gKERCT2JqZWN0ICopZGItPmFwcF9wcml2YXRlOwogCiAgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5idENvbXBhcmVDYWxsYmFjayA9PSBOVUxMKSB7Ci0JTVlEQl9CRUdJTl9CTE9DS19USFJFQURTOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkoc2VsZiA9PSAwCi0JCQkgPyAiREJfYnRfY29tcGFyZSBkYiBpcyBOVUxMLiIKLQkJCSA6ICJEQl9idF9jb21wYXJlIGNhbGxiYWNrIGlzIE5VTEwuIikpOwotCS8qIHdlJ3JlIGluIGEgY2FsbGJhY2sgd2l0aGluIHRoZSBEQiBjb2RlLCB3ZSBjYW4ndCByYWlzZSAqLwotCVB5RXJyX1ByaW50KCk7Ci0JcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKLQlNWURCX0VORF9CTE9DS19USFJFQURTOworICAgICAgICBNWURCX0JFR0lOX0JMT0NLX1RIUkVBRFM7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZiA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgPyAiREJfYnRfY29tcGFyZSBkYiBpcyBOVUxMLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA6ICJEQl9idF9jb21wYXJlIGNhbGxiYWNrIGlzIE5VTEwuIikpOworICAgICAgICAvKiB3ZSdyZSBpbiBhIGNhbGxiYWNrIHdpdGhpbiB0aGUgREIgY29kZSwgd2UgY2FuJ3QgcmFpc2UgKi8KKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKKyAgICAgICAgTVlEQl9FTkRfQkxPQ0tfVEhSRUFEUzsKICAgICB9IGVsc2UgewotCU1ZREJfQkVHSU5fQkxPQ0tfVEhSRUFEUzsKKyAgICAgICAgTVlEQl9CRUdJTl9CTE9DS19USFJFQURTOwogCi0JYXJncyA9IEJ1aWxkVmFsdWVfU1MobGVmdEtleS0+ZGF0YSwgbGVmdEtleS0+c2l6ZSwgcmlnaHRLZXktPmRhdGEsIHJpZ2h0S2V5LT5zaXplKTsKLQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHNlbGYtPmJ0Q29tcGFyZUNhbGxiYWNrLCBhcmdzKTsKLQl9Ci0JaWYgKGFyZ3MgPT0gTlVMTCB8fCByZXN1bHQgPT0gTlVMTCkgewotCSAgICAvKiB3ZSdyZSBpbiBhIGNhbGxiYWNrIHdpdGhpbiB0aGUgREIgY29kZSwgd2UgY2FuJ3QgcmFpc2UgKi8KLQkgICAgUHlFcnJfUHJpbnQoKTsKLQkgICAgcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKLQl9IGVsc2UgaWYgKE5VTUJFUl9DaGVjayhyZXN1bHQpKSB7Ci0JICAgIHJlcyA9IE5VTUJFUl9Bc0xvbmcocmVzdWx0KTsKLQl9IGVsc2UgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJEQl9idF9jb21wYXJlIGNhbGxiYWNrIE1VU1QgcmV0dXJuIGFuIGludC4iKTsKLQkgICAgLyogd2UncmUgaW4gYSBjYWxsYmFjayB3aXRoaW4gdGhlIERCIGNvZGUsIHdlIGNhbid0IHJhaXNlICovCi0JICAgIFB5RXJyX1ByaW50KCk7Ci0JICAgIHJlcyA9IF9kZWZhdWx0X2NtcChsZWZ0S2V5LCByaWdodEtleSk7Ci0JfQorICAgICAgICBhcmdzID0gQnVpbGRWYWx1ZV9TUyhsZWZ0S2V5LT5kYXRhLCBsZWZ0S2V5LT5zaXplLCByaWdodEtleS0+ZGF0YSwgcmlnaHRLZXktPnNpemUpOworICAgICAgICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2ssIGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmIChhcmdzID09IE5VTEwgfHwgcmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIHdlJ3JlIGluIGEgY2FsbGJhY2sgd2l0aGluIHRoZSBEQiBjb2RlLCB3ZSBjYW4ndCByYWlzZSAqLworICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgIHJlcyA9IF9kZWZhdWx0X2NtcChsZWZ0S2V5LCByaWdodEtleSk7CisgICAgICAgIH0gZWxzZSBpZiAoTlVNQkVSX0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIHJlcyA9IE5VTUJFUl9Bc0xvbmcocmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRCX2J0X2NvbXBhcmUgY2FsbGJhY2sgTVVTVCByZXR1cm4gYW4gaW50LiIpOworICAgICAgICAgICAgLyogd2UncmUgaW4gYSBjYWxsYmFjayB3aXRoaW4gdGhlIERCIGNvZGUsIHdlIGNhbid0IHJhaXNlICovCisgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgcmVzID0gX2RlZmF1bHRfY21wKGxlZnRLZXksIHJpZ2h0S2V5KTsKKyAgICAgICAgfQogCi0JUHlfWERFQ1JFRihhcmdzKTsKLQlQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKIAotCU1ZREJfRU5EX0JMT0NLX1RIUkVBRFM7CisgICAgICAgIE1ZREJfRU5EX0JMT0NLX1RIUkVBRFM7CiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CkBAIC0yNDE1LDggKzI0MTUsOCBAQAogICAgIENIRUNLX0RCX05PVF9DTE9TRUQoc2VsZik7CiAKICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY29tcGFyYXRvcikpIHsKLQltYWtlVHlwZUVycm9yKCJDYWxsYWJsZSIsIGNvbXBhcmF0b3IpOwotCXJldHVybiBOVUxMOworICAgICAgICBtYWtlVHlwZUVycm9yKCJDYWxsYWJsZSIsIGNvbXBhcmF0b3IpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKgpAQCAtMjQzMCwxNSArMjQzMCwxNSBAQAogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKCFOVU1CRVJfQ2hlY2socmVzdWx0KSkgewotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgICAgImNhbGxiYWNrIE1VU1QgcmV0dXJuIGFuIGludCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBNVVNUIHJldHVybiBhbiBpbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfSBlbHNlIGlmIChOVU1CRVJfQXNMb25nKHJlc3VsdCkgIT0gMCkgewotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgICAgImNhbGxiYWNrIGZhaWxlZCB0byByZXR1cm4gMCBvbiB0d28gZW1wdHkgc3RyaW5ncyIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBmYWlsZWQgdG8gcmV0dXJuIDAgb24gdHdvIGVtcHR5IHN0cmluZ3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogCkBAIC0yNDQ2LDggKzI0NDYsOCBAQAogICAgICAqIHNpbXBsaWZ5IHRoZSBjb2RlLiBUaGlzIHdvdWxkIGhhdmUgbm8gcmVhbCB1c2UsIGFzIG9uZSBjYW5ub3QKICAgICAgKiBjaGFuZ2UgdGhlIGZ1bmN0aW9uIG9uY2UgdGhlIGRiIGlzIG9wZW5lZCBhbnl3YXkgKi8KICAgICBpZiAoc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2sgIT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJzZXRfYnRfY29tcGFyZSgpIGNhbm5vdCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInNldF9idF9jb21wYXJlKCkgY2Fubm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBQeV9JTkNSRUYoY29tcGFyYXRvcik7CkBAIC0yNDYyLDkgKzI0NjIsOSBAQAogICAgIGVyciA9IHNlbGYtPmRiLT5zZXRfYnRfY29tcGFyZShzZWxmLT5kYiwgX2RiX2NvbXBhcmVDYWxsYmFjayk7CiAKICAgICBpZiAoZXJyKSB7Ci0JLyogcmVzdG9yZSB0aGUgb2xkIHN0YXRlIGluIGNhc2Ugb2YgZXJyb3IgKi8KLQlQeV9ERUNSRUYoY29tcGFyYXRvcik7Ci0Jc2VsZi0+YnRDb21wYXJlQ2FsbGJhY2sgPSBOVUxMOworICAgICAgICAvKiByZXN0b3JlIHRoZSBvbGQgc3RhdGUgaW4gY2FzZSBvZiBlcnJvciAqLworICAgICAgICBQeV9ERUNSRUYoY29tcGFyYXRvcik7CisgICAgICAgIHNlbGYtPmJ0Q29tcGFyZUNhbGxiYWNrID0gTlVMTDsKICAgICB9CiAKICAgICBSRVRVUk5fSUZfRVJSKCk7CkBAIC0yODg1LDggKzI4ODUsOCBAQAogICAgIENIRUNLX0RCX05PVF9DTE9TRUQoc2VsZik7CiAgICAgaWYgKG91dEZpbGVOYW1lKQogICAgICAgICBvdXRGaWxlID0gZm9wZW4ob3V0RmlsZU5hbWUsICJ3Iik7Ci0JLyogWFhYKG5ub3J3aXR6KTogaXQgc2hvdWxkIHByb2JhYmx5IGJlIGFuIGV4Y2VwdGlvbiBpZiBvdXRGaWxlCi0JICAgY2FuJ3QgYmUgb3BlbmVkLiAqLworICAgICAgICAvKiBYWFgobm5vcndpdHopOiBpdCBzaG91bGQgcHJvYmFibHkgYmUgYW4gZXhjZXB0aW9uIGlmIG91dEZpbGUKKyAgICAgICAgICAgY2FuJ3QgYmUgb3BlbmVkLiAqLwogCiAgICAgeyAgLyogREIudmVyaWZ5IGFjdHMgYXMgYSBEQiBoYW5kbGUgZGVzdHJ1Y3RvciAobGlrZSBjbG9zZSkgKi8KICAgICAgICAgUHlPYmplY3QgKmVycm9yOwpAQCAtMjk0MCw4ICsyOTQwLDggQEAKICAgICBzdGF0aWMgY2hhcioga3duYW1lc1tdID0geyAicGFzc3dkIiwgImZsYWdzIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xpOnNldF9lbmNyeXB0Iiwga3duYW1lcywKLQkJJnBhc3N3ZCwgJmZsYWdzKSkgewotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICZwYXNzd2QsICZmbGFncykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOwpAQCAtMzQxNCwxMiArMzQxNCwxMiBAQAogICAgIENMRUFSX0RCVChrZXkpOwogICAgIENMRUFSX0RCVChkYXRhKTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpfGlpOmdldCIsICZrd25hbWVzWzJdLAotCQkJCSAgICAgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICB7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9pfGlpOmdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrd25hbWVzWzFdLAotCQkJCQkgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5b2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICAgIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT2l8aWk6Z2V0IiwKQEAgLTM0MjcsOCArMzQyNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQl9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBDSEVDS19DVVJTT1JfTk9UX0NMT1NFRChzZWxmKTsKQEAgLTM0NDcsNyArMzQ0Nyw3IEBACiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKIAogICAgIGlmICgoZXJyID09IERCX05PVEZPVU5EIHx8IGVyciA9PSBEQl9LRVlFTVBUWSkKLQkgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKKyAgICAgICAgICAgICYmIHNlbGYtPm15ZGItPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKICAgICB9CkBAIC0zNDkwLDEyICszNDkwLDEyIEBACiAgICAgQ0xFQVJfREJUKGtleSk7CiAgICAgQ0xFQVJfREJUKGRhdGEpOwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIml8aWk6cGdldCIsICZrd25hbWVzWzJdLAotCQkJCSAgICAgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICB7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9pfGlpOnBnZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd25hbWVzX2tleU9ubHksIAotCQkJCQkgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd25hbWVzX2tleU9ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlvYmosICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICAgICAgewogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9PaXxpaTpwZ2V0IiwKQEAgLTM1MDMsOCArMzUwMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQl9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBDSEVDS19DVVJTT1JfTk9UX0NMT1NFRChzZWxmKTsKQEAgLTM1MjUsNyArMzUyNSw3IEBACiAgICAgTVlEQl9FTkRfQUxMT1dfVEhSRUFEUzsKIAogICAgIGlmICgoZXJyID09IERCX05PVEZPVU5EIHx8IGVyciA9PSBEQl9LRVlFTVBUWSkKLQkgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKKyAgICAgICAgICAgICYmIHNlbGYtPm15ZGItPm1vZHVsZUZsYWdzLmdldFJldHVybnNOb25lKSB7CiAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKICAgICB9CkBAIC0zNjM2LDcgKzM2MzYsNyBAQAogICAgIGludCBkb2ZmID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT3xpaWk6cHV0Iiwga3duYW1lcywKLQkJCQkgICAgICZrZXlvYmosICZkYXRhb2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleW9iaiwgJmRhdGFvYmosICZmbGFncywgJmRsZW4sICZkb2ZmKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBDSEVDS19DVVJTT1JfTk9UX0NMT1NFRChzZWxmKTsKQEAgLTM2NzEsNyArMzY3MSw3IEBACiAgICAgaW50IGRvZmYgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aWlpOnNldCIsIGt3bmFtZXMsCi0JCQkJICAgICAma2V5b2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtMzY4OSw3ICszNjg5LDcgQEAKICAgICBlcnIgPSBfREJDX2dldChzZWxmLT5kYmMsICZrZXksICZkYXRhLCBmbGFnc3xEQl9TRVQpOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5jdXJzb3JTZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuY3Vyc29yU2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTM3MzQsNyArMzczNCw3IEBACiAgICAgaW50IGRvZmYgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aWlpOnNldF9yYW5nZSIsIGt3bmFtZXMsCi0JCQkJICAgICAma2V5b2JqLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleW9iaiwgJmZsYWdzLCAmZGxlbiwgJmRvZmYpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtMzc1MSw3ICszNzUxLDcgQEAKICAgICBlcnIgPSBfREJDX2dldChzZWxmLT5kYmMsICZrZXksICZkYXRhLCBmbGFnc3xEQl9TRVRfUkFOR0UpOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5jdXJzb3JTZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuY3Vyc29yU2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTM5MDUsNyArMzkwNSw3IEBACiAgICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgInJlY25vIiwiZmxhZ3MiLCAiZGxlbiIsICJkb2ZmIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaXxpaWk6c2V0X3JlY25vIiwga3duYW1lcywKLQkJCQkgICAgICZpcmVjbm8sICZmbGFncywgJmRsZW4sICZkb2ZmKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXJlY25vLCAmZmxhZ3MsICZkbGVuLCAmZG9mZikpCiAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIENIRUNLX0NVUlNPUl9OT1RfQ0xPU0VEKHNlbGYpOwpAQCAtMzkzNCw3ICszOTM0LDcgQEAKICAgICBlcnIgPSBfREJDX2dldChzZWxmLT5kYmMsICZrZXksICZkYXRhLCBmbGFnc3xEQl9TRVRfUkVDTk8pOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5jdXJzb3JTZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuY3Vyc29yU2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTM5OTcsNyArMzk5Nyw3IEBACiAgICAgZXJyID0gX0RCQ19nZXQoc2VsZi0+ZGJjLCAma2V5LCAmZGF0YSwgZmxhZ3MgfCBEQl9KT0lOX0lURU0pOwogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAgICAgaWYgKChlcnIgPT0gREJfTk9URk9VTkQgfHwgZXJyID09IERCX0tFWUVNUFRZKQotCSAgICAmJiBzZWxmLT5teWRiLT5tb2R1bGVGbGFncy5nZXRSZXR1cm5zTm9uZSkgeworICAgICAgICAgICAgJiYgc2VsZi0+bXlkYi0+bW9kdWxlRmxhZ3MuZ2V0UmV0dXJuc05vbmUpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgICAgICByZXR2YWwgPSBQeV9Ob25lOwogICAgIH0KQEAgLTQxMDksOCArNDEwOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3x6T2k6ZGJyZW1vdmUiLCBrd25hbWVzLAotCQkmZmlsZSwgJmRhdGFiYXNlLCAmdHhub2JqLCAmZmxhZ3MpKSB7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgJmZpbGUsICZkYXRhYmFzZSwgJnR4bm9iaiwgJmZsYWdzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKCFjaGVja1R4bk9iaih0eG5vYmosICZ0eG4pKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDEzNyw4ICs0MTM3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxhZ3MiLCBOVUxMIH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzenN8T2k6ZGJyZW5hbWUiLCBrd25hbWVzLAotCQkmZmlsZSwgJmRhdGFiYXNlLCAmbmV3bmFtZSwgJnR4bm9iaiwgJmZsYWdzKSkgewotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICZmaWxlLCAmZGF0YWJhc2UsICZuZXduYW1lLCAmdHhub2JqLCAmZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoIWNoZWNrVHhuT2JqKHR4bm9iaiwgJnR4bikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00MTYxLDggKzQxNjEsOCBAQAogICAgIHN0YXRpYyBjaGFyKiBrd25hbWVzW10gPSB7ICJwYXNzd2QiLCAiZmxhZ3MiLCBOVUxMIH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzfGk6c2V0X2VuY3J5cHQiLCBrd25hbWVzLAotCQkmcGFzc3dkLCAmZmxhZ3MpKSB7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgJnBhc3N3ZCwgJmZsYWdzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CkBAIC00MTgzLDggKzQxODMsOCBAQAogICAgIHN0YXRpYyBjaGFyKiBrd25hbWVzW10gPSB7ICJ0aW1lb3V0IiwgImZsYWdzIiwgTlVMTCB9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaWk6c2V0X3RpbWVvdXQiLCBrd25hbWVzLAotCQkmdGltZW91dCwgJmZsYWdzKSkgewotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICZ0aW1lb3V0LCAmZmxhZ3MpKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIE1ZREJfQkVHSU5fQUxMT1dfVEhSRUFEUzsKQEAgLTUxNDYsOCArNTE0Niw4IEBACiAgICAgQ0hFQ0tfRU5WX05PVF9DTE9TRUQoc2VsZik7CiAKICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2sobm90aWZ5RnVuYykpIHsKLQkgICAgbWFrZVR5cGVFcnJvcigiQ2FsbGFibGUiLCBub3RpZnlGdW5jKTsKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBtYWtlVHlwZUVycm9yKCJDYWxsYWJsZSIsIG5vdGlmeUZ1bmMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgUHlfWERFQ1JFRihzZWxmLT5ldmVudF9ub3RpZnlDYWxsYmFjayk7CkBAIC01MTY1LDggKzUxNjUsOCBAQAogICAgIE1ZREJfRU5EX0FMTE9XX1RIUkVBRFM7CiAKICAgICBpZiAoZXJyKSB7Ci0JICAgIFB5X0RFQ1JFRihub3RpZnlGdW5jKTsKLQkgICAgc2VsZi0+ZXZlbnRfbm90aWZ5Q2FsbGJhY2sgPSBOVUxMOworICAgICAgICAgICAgUHlfREVDUkVGKG5vdGlmeUZ1bmMpOworICAgICAgICAgICAgc2VsZi0+ZXZlbnRfbm90aWZ5Q2FsbGJhY2sgPSBOVUxMOwogICAgIH0KIAogICAgIFJFVFVSTl9JRl9FUlIoKTsKQEAgLTU0ODcsNyArNTQ4Nyw3IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLAogICAgICAgICAgICAgICAgICJpfE86cmVwX3N0YXJ0Iiwga3duYW1lcywgJmZsYWdzLCAmY2RhdGFfcHkpKQogICAgIHsKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgQ0hFQ0tfRU5WX05PVF9DTE9TRUQoc2VsZik7CiAKQEAgLTU2NDAsNyArNTY0MCw3IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLAogICAgICAgICAgICAgICAgICJpaTpyZXBtZ3Jfc3RhcnQiLCBrd25hbWVzLCAmbnRocmVhZHMsICZmbGFncykpCiAgICAgewotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CkBAIC01NjYzLDcgKzU2NjMsNyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKICAgICAgICAgICAgICAgICAic2l8aTpyZXBtZ3Jfc2V0X2xvY2FsX3NpdGUiLCBrd25hbWVzLCAmaG9zdCwgJnBvcnQsICZmbGFncykpCiAgICAgewotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CkBAIC01Njg3LDcgKzU2ODcsNyBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKICAgICAgICAgICAgICAgICAic2l8aTpyZXBtZ3JfYWRkX3JlbW90ZV9zaXRlIiwga3duYW1lcywgJmhvc3QsICZwb3J0LCAmZmxhZ3MpKQogICAgIHsKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgQ0hFQ0tfRU5WX05PVF9DTE9TRUQoc2VsZik7CiAgICAgTVlEQl9CRUdJTl9BTExPV19USFJFQURTOwpAQCAtNTcwNSw3ICs1NzA1LDcgQEAKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpyZXBtZ3Jfc2V0X2Fja19wb2xpY3kiLCAmYWNrX3BvbGljeSkpCiAgICAgewotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBDSEVDS19FTlZfTk9UX0NMT1NFRChzZWxmKTsKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CkBAIC01ODgwLDcgKzU4ODAsNyBAQAogICAgICAgICAgICAgLyogVGhlIGRiIGlzIGFscmVhZHkgbGlua2VkIHRvIGl0cyBlbnZpcm9ubWVudCwKICAgICAgICAgICAgICoqIHNvIG5vdGhpbmcgdG8gZG8uCiAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZGItPnR4bj1OVUxMOyAKKyAgICAgICAgICAgIGRiLT50eG49TlVMTDsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjY4MiwyMCArNjY4MiwyMCBAQAogICAgIDAsICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwogICAgICZEQl9tYXBwaW5nLC8qdHBfYXNfbWFwcGluZyovCiAgICAgMCwgICAgICAgICAgLyp0cF9oYXNoKi8KLSAgICAwLAkJCS8qIHRwX2NhbGwgKi8KLSAgICAwLAkJCS8qIHRwX3N0ciAqLwotICAgIDAsICAJCS8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCS8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMCkKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbHNlCiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgIC8qIHRwX2ZsYWdzICovCiAjZW5kaWYKICAgICAwLCAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAwLAkJICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwJCQkvKiB0cF9jbGVhciAqLwotICAgIDAsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIG9mZnNldG9mKERCT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAwLCAgICAgICAgICAvKnRwX2l0ZXIqLwogICAgIDAsICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwpAQCAtNjc2OCwyMCArNjc2OCwyMCBAQAogICAgIDAsICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwogICAgIDAsICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiAgICAgMCwgICAgICAgICAgLyp0cF9oYXNoKi8KLSAgICAwLAkJCS8qIHRwX2NhbGwgKi8KLSAgICAwLAkJCS8qIHRwX3N0ciAqLwotICAgIDAsICAJCS8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCS8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMCkKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbHNlCiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgIC8qIHRwX2ZsYWdzICovCiAjZW5kaWYKICAgICAwLCAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAwLAkJICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwJCQkvKiB0cF9jbGVhciAqLwotICAgIDAsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIG9mZnNldG9mKERCRW52T2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAwLCAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgMCwgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KQEAgLTY4MTEsMjAgKzY4MTEsMjAgQEAKICAgICAwLCAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KICAgICAwLCAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLwogICAgIDAsICAgICAgICAgIC8qdHBfaGFzaCovCi0gICAgMCwJCQkvKiB0cF9jYWxsICovCi0gICAgMCwJCQkvKiB0cF9zdHIgKi8KLSAgICAwLCAgCQkvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0gICAgMCwJCQkvKiB0cF9hc19idWZmZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMDAwMDApCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgICAgIC8qIHRwX2ZsYWdzICovCiAjZWxzZQogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAvKiB0cF9mbGFncyAqLwogI2VuZGlmCiAgICAgMCwgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgMCwJICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgIDAsCQkJLyogdHBfY2xlYXIgKi8KLSAgICAwLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIG9mZnNldG9mKERCVHhuT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAwLCAgICAgICAgICAvKnRwX2l0ZXIqLwogICAgIDAsICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwpAQCAtNjg1NCwyMCArNjg1NCwyMCBAQAogICAgIDAsICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwogICAgIDAsICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiAgICAgMCwgICAgICAgICAgLyp0cF9oYXNoKi8KLSAgICAwLAkJCS8qIHRwX2NhbGwgKi8KLSAgICAwLAkJCS8qIHRwX3N0ciAqLwotICAgIDAsICAJCS8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCS8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMCkKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbHNlCiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgIC8qIHRwX2ZsYWdzICovCiAjZW5kaWYKICAgICAwLCAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAwLAkJICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwJCQkvKiB0cF9jbGVhciAqLwotICAgIDAsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIG9mZnNldG9mKERCTG9ja09iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiB9OwogCkBAIC02ODkzLDIwICs2ODkzLDIwIEBACiAgICAgMCwgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCiAgICAgMCwgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KICAgICAwLCAgICAgICAgICAvKnRwX2hhc2gqLwotICAgIDAsCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJLyogdHBfc3RyICovCi0gICAgMCwgIAkJLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwKQogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgICAgICAvKiB0cF9mbGFncyAqLwogI2Vsc2UKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgLyogdHBfZmxhZ3MgKi8KICNlbmRpZgogICAgIDAsICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgIDAsCQkgICAgLyogdHBfdHJhdmVyc2UgKi8KLSAgICAwLAkJCS8qIHRwX2NsZWFyICovCi0gICAgMCwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgb2Zmc2V0b2YoREJTZXF1ZW5jZU9iamVjdCwgaW5fd2Vha3JlZmxpc3QpLCAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgMCwgICAgICAgICAgLyp0cF9pdGVyKi8KICAgICAwLCAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KQEAgLTcwNjgsNyArNzA2OCw3IEBACiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAwMDAwMCkKICAgICAgICAgcmV0dXJuOwogI2Vsc2UKLSAgICAJcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAgICAgfQogCkBAIC03NDczLDcgKzc0NzMsNyBAQAogICAgICAqIHVzaW5nIG9uZSBiYXNlIGNsYXNzLiAqLwogICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJLZXlFcnJvciIsIFB5RXhjX0tleUVycm9yKTsKICAgICBQeVJ1bl9TdHJpbmcoImNsYXNzIERCTm90Rm91bmRFcnJvcihEQkVycm9yLCBLZXlFcnJvcik6IHBhc3NcbiIKLQkgICAgICAgICAiY2xhc3MgREJLZXlFbXB0eUVycm9yKERCRXJyb3IsIEtleUVycm9yKTogcGFzcyIsCisgICAgICAgICAgICAgICAgICJjbGFzcyBEQktleUVtcHR5RXJyb3IoREJFcnJvciwgS2V5RXJyb3IpOiBwYXNzIiwKICAgICAgICAgICAgICAgICAgUHlfZmlsZV9pbnB1dCwgZCwgZCk7CiAgICAgREJOb3RGb3VuZEVycm9yID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIkRCTm90Rm91bmRFcnJvciIpOwogICAgIERCS2V5RW1wdHlFcnJvciA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJEQktleUVtcHR5RXJyb3IiKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKaW5kZXggNjg3NzIzOC4uOWYyMjg3MSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMKQEAgLTE1LDcgKzE1LDcgQEAKICAgIFRoZSBidWlsdGluIFVuaWNvZGUgY29kZWNzIHVzZSB0aGUgZm9sbG93aW5nIGludGVyZmFjZToKIAogICAgICA8ZW5jb2Rpbmc+X2VuY29kZShVbmljb2RlX29iamVjdFssZXJyb3JzPSdzdHJpY3QnXSkgLT4KLSAgICAgCShzdHJpbmcgb2JqZWN0LCBieXRlcyBjb25zdW1lZCkKKyAgICAgICAgKHN0cmluZyBvYmplY3QsIGJ5dGVzIGNvbnN1bWVkKQogCiAgICAgIDxlbmNvZGluZz5fZGVjb2RlKGNoYXJfYnVmZmVyX29ialssZXJyb3JzPSdzdHJpY3QnXSkgLT4KICAgICAgICAgKFVuaWNvZGUgb2JqZWN0LCBieXRlcyBjb25zdW1lZCkKQEAgLTk2LDExICs5NiwxMSBAQAogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKQotCWVuY29kaW5nID0gUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZygpOworICAgICAgICBlbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKICNlbHNlCiAgICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIGVuY29kaW5nIHNwZWNpZmllZCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIGVuY29kaW5nIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAjZW5kaWYKIApAQCAtMTMwLDExICsxMzAsMTEgQEAKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKICAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkKLQllbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKKyAgICAgICAgZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CiAjZWxzZQogICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBlbmNvZGluZyBzcGVjaWZpZWQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBlbmNvZGluZyBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogI2VuZGlmCiAKQEAgLTE0Niw3ICsxNDYsNyBAQAogCiBzdGF0aWMKIFB5T2JqZWN0ICpjb2RlY190dXBsZShQeU9iamVjdCAqdW5pY29kZSwKLQkJICAgICAgUHlfc3NpemVfdCBsZW4pCisgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgUHlPYmplY3QgKnY7CiAgICAgaWYgKHVuaWNvZGUgPT0gTlVMTCkKQEAgLTE1OSw0NCArMTU5LDQ0IEBACiAvKiAtLS0gU3RyaW5nIGNvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBlc2NhcGVfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmRhdGE7CiAgICAgUHlfc3NpemVfdCBzaXplOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3x6OmVzY2FwZV9kZWNvZGUiLAotCQkJICAmZGF0YSwgJnNpemUsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwgJnNpemUsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRGVjb2RlRXNjYXBlKGRhdGEsIHNpemUsIGVycm9ycywgMCwgTlVMTCksCi0JCSAgICAgICBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlc2NhcGVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc3RyOwotCWNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7Ci0JY2hhciAqYnVmOwotCVB5X3NzaXplX3QgbGVuOworICAgICAgICBQeU9iamVjdCAqc3RyOworICAgICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOworICAgICAgICBjaGFyICpidWY7CisgICAgICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXx6OmVzY2FwZV9lbmNvZGUiLAotCQkJICAgICAgJlB5U3RyaW5nX1R5cGUsICZzdHIsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXx6OmVzY2FwZV9lbmNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5U3RyaW5nX1R5cGUsICZzdHIsICZlcnJvcnMpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3RyID0gUHlTdHJpbmdfUmVwcihzdHIsIDApOwotCWlmICghc3RyKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgc3RyID0gUHlTdHJpbmdfUmVwcihzdHIsIDApOworICAgICAgICBpZiAoIXN0cikKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFRoZSBzdHJpbmcgd2lsbCBiZSBxdW90ZWQuIFVucXVvdGUsIHNpbWlsYXIgdG8gdW5pY29kZS1lc2NhcGUuICovCi0JYnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HIChzdHIpOwotCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFIChzdHIpOwotCW1lbW1vdmUoYnVmLCBidWYrMSwgbGVuLTIpOwotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZzdHIsIGxlbi0yKSA8IDApCi0JCXJldHVybiBOVUxMOwotCQotCXJldHVybiBjb2RlY190dXBsZShzdHIsIFB5U3RyaW5nX1NpemUoc3RyKSk7CisgICAgICAgIC8qIFRoZSBzdHJpbmcgd2lsbCBiZSBxdW90ZWQuIFVucXVvdGUsIHNpbWlsYXIgdG8gdW5pY29kZS1lc2NhcGUuICovCisgICAgICAgIGJ1ZiA9IFB5U3RyaW5nX0FTX1NUUklORyAoc3RyKTsKKyAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUgKHN0cik7CisgICAgICAgIG1lbW1vdmUoYnVmLCBidWYrMSwgbGVuLTIpOworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmc3RyLCBsZW4tMikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIHJldHVybiBjb2RlY190dXBsZShzdHIsIFB5U3RyaW5nX1NpemUoc3RyKSk7CiB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCkBAIC0yMDQsNyArMjA0LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkJUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqb2JqOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CkBAIC0yMTIsMTkgKzIxMiwxOSBAQAogICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlIiwKLQkJCSAgJm9iaiwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmosICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkgewotCVB5X0lOQ1JFRihvYmopOwotCXJldHVybiBjb2RlY190dXBsZShvYmosIFB5VW5pY29kZV9HRVRfU0laRShvYmopKTsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgICAgIHJldHVybiBjb2RlY190dXBsZShvYmosIFB5VW5pY29kZV9HRVRfU0laRShvYmopKTsKICAgICB9CiAgICAgZWxzZSB7Ci0JaWYgKFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmosIChjb25zdCB2b2lkICoqKSZkYXRhLCAmc2l6ZSkpCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iaiwgKGNvbnN0IHZvaWQgKiopJmRhdGEsICZzaXplKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRGVjb2RlVW5pY29kZUludGVybmFsKGRhdGEsIHNpemUsIGVycm9ycyksCi0JCQkgICBzaXplKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRGVjb2RlVW5pY29kZUludGVybmFsKGRhdGEsIHNpemUsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKICAgICB9CiB9CiAKQEAgLTIzMiwyMCArMjMyLDIwIEBACiB1dGZfN19kZWNvZGUoUHlPYmplY3QgKnNlbGYsCiAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGZpbmFsID0gMDsKICAgICBQeV9zc2l6ZV90IGNvbnN1bWVkOwogICAgIFB5T2JqZWN0ICpkZWNvZGVkID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8emk6dXRmXzdfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOwogCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JCQkJCSAgIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKQEAgLTI1MywzMiArMjUzLDMyIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfOF9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGZpbmFsID0gMDsKICAgICBQeV9zc2l6ZV90IGNvbnN1bWVkOwogICAgIFB5T2JqZWN0ICpkZWNvZGVkID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8emk6dXRmXzhfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOwogCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JCQkJCSAgIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl8xNl9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAgICAgaW50IGZpbmFsID0gMDsKQEAgLTI4NiwyMiArMjg2LDIyIEBACiAgICAgUHlPYmplY3QgKmRlY29kZWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppOnV0Zl8xNl9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGNvbnN1bWVkID0gcGJ1Zi5sZW47IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCQkJCQkmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBjb25zdW1lZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfbGVfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAtMTsKICAgICBpbnQgZmluYWwgPSAwOwpAQCAtMzA5LDIzICszMDksMjMgQEAKICAgICBQeU9iamVjdCAqZGVjb2RlZCA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppOnV0Zl8xNl9sZV9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgY29uc3VtZWQgPSBwYnVmLmxlbjsgLyogVGhpcyBpcyBvdmVyd3JpdHRlbiB1bmxlc3MgZmluYWwgaXMgdHJ1ZS4gKi8KICAgICBkZWNvZGVkID0gUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl8xNl9iZV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDE7CiAgICAgaW50IGZpbmFsID0gMDsKQEAgLTMzMywxNSArMzMzLDE1IEBACiAgICAgUHlPYmplY3QgKmRlY29kZWQgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aTp1dGZfMTZfYmVfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGNvbnN1bWVkID0gcGJ1Zi5sZW47IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCSZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBjb25zdW1lZCk7CiB9CiAKQEAgLTM1NSw5ICszNTUsOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogdXRmXzE2X2V4X2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMDsKICAgICBQeU9iamVjdCAqdW5pY29kZSwgKnR1cGxlOwpAQCAtMzY1LDE0ICszNjUsMTQgQEAKICAgICBQeV9zc2l6ZV90IGNvbnN1bWVkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aWk6dXRmXzE2X2V4X2RlY29kZSIsCi0JCQkgICZwYnVmLCAmZXJyb3JzLCAmYnl0ZW9yZGVyLCAmZmluYWwpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgY29uc3VtZWQgPSBwYnVmLmxlbjsgLyogVGhpcyBpcyBvdmVyd3JpdHRlbiB1bmxlc3MgZmluYWwgaXMgdHJ1ZS4gKi8KICAgICB1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JCQkJCSZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKHVuaWNvZGUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCJPbmkiLCB1bmljb2RlLCBjb25zdW1lZCwgYnl0ZW9yZGVyKTsKICAgICBQeV9ERUNSRUYodW5pY29kZSk7CiAgICAgcmV0dXJuIHR1cGxlOwpAQCAtMzgwLDkgKzM4MCw5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAwOwogICAgIGludCBmaW5hbCA9IDA7CkBAIC0zOTAsMjIgKzM5MCwyMiBAQAogICAgIFB5T2JqZWN0ICpkZWNvZGVkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aTp1dGZfMzJfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOyAvKiBUaGlzIGlzIG92ZXJ3cml0dGVuIHVubGVzcyBmaW5hbCBpcyB0cnVlLiAqLwogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycywKLQkJCQkJJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gY29kZWNfdHVwbGUoZGVjb2RlZCwgY29uc3VtZWQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdXRmXzMyX2xlX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gLTE7CiAgICAgaW50IGZpbmFsID0gMDsKQEAgLTQxMywyMiArNDEzLDIyIEBACiAgICAgUHlPYmplY3QgKmRlY29kZWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppOnV0Zl8zMl9sZV9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJmZpbmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGNvbnN1bWVkID0gcGJ1Zi5sZW47IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCQkJCQkmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmIChkZWNvZGVkID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBjb2RlY190dXBsZShkZWNvZGVkLCBjb25zdW1lZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfYmVfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAxOwogICAgIGludCBmaW5hbCA9IDA7CkBAIC00MzYsMTQgKzQzNiwxNCBAQAogICAgIFB5T2JqZWN0ICpkZWNvZGVkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6aTp1dGZfMzJfYmVfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOyAvKiBUaGlzIGlzIG92ZXJ3cml0dGVuIHVubGVzcyBmaW5hbCBpcyB0cnVlLiAqLwogICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycywKLQkJCQkJJmJ5dGVvcmRlciwgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKICAgICBpZiAoZGVjb2RlZCA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gY29kZWNfdHVwbGUoZGVjb2RlZCwgY29uc3VtZWQpOwogfQogCkBAIC00NTcsOSArNDU3LDkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl8zMl9leF9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAgICAgUHlPYmplY3QgKnVuaWNvZGUsICp0dXBsZTsKQEAgLTQ2NywxNCArNDY3LDE0IEBACiAgICAgUHlfc3NpemVfdCBjb25zdW1lZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8emlpOnV0Zl8zMl9leF9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBidWYsICZlcnJvcnMsICZieXRlb3JkZXIsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGNvbnN1bWVkID0gcGJ1Zi5sZW47IC8qIFRoaXMgaXMgb3ZlcndyaXR0ZW4gdW5sZXNzIGZpbmFsIGlzIHRydWUuICovCiAgICAgdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzLAotCQkJCQkmYnl0ZW9yZGVyLCBmaW5hbCA/IE5VTEwgOiAmY29uc3VtZWQpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlb3JkZXIsIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogICAgIGlmICh1bmljb2RlID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiT25pIiwgdW5pY29kZSwgY29uc3VtZWQsIGJ5dGVvcmRlcik7CiAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwogICAgIHJldHVybiB0dXBsZTsKQEAgLTQ4MiwxMTQgKzQ4MiwxMTQgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHVuaWNvZGVfZXNjYXBlX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJICAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwotCVB5T2JqZWN0ICp1bmljb2RlOworICAgICAgICBQeU9iamVjdCAqdW5pY29kZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ejp1bmljb2RlX2VzY2FwZV9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CisgICAgICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZShwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycyk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZShQeU9iamVjdCAqc2VsZiwKLQkJCVB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7Ci0JUHlPYmplY3QgKnVuaWNvZGU7CisgICAgICAgIFB5T2JqZWN0ICp1bmljb2RlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OnJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CisgICAgICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZShwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycyk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGF0aW5fMV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7Ci0JUHlPYmplY3QgKnVuaWNvZGU7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeU9iamVjdCAqdW5pY29kZTsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OmxhdGluXzFfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVMYXRpbjEocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CisgICAgICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xKHBidWYuYnVmLCBwYnVmLmxlbiwgZXJyb3JzKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIHJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhc2NpaV9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGJ1ZjsKLQlQeU9iamVjdCAqdW5pY29kZTsKKyAgICAgICAgUHlfYnVmZmVyIHBidWY7CisgICAgICAgIFB5T2JqZWN0ICp1bmljb2RlOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHo6YXNjaWlfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVBU0NJSShwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycyk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JcmV0dXJuIGNvZGVjX3R1cGxlKHVuaWNvZGUsIHBidWYubGVuKTsKKyAgICAgICAgdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVBU0NJSShwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIGVycm9ycyk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUodW5pY29kZSwgcGJ1Zi5sZW4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2hhcm1hcF9kZWNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfYnVmZmVyIHBidWY7Ci0JUHlPYmplY3QgKnVuaWNvZGU7CisgICAgICAgIFB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeU9iamVjdCAqdW5pY29kZTsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICptYXBwaW5nID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ek86Y2hhcm1hcF9kZWNvZGUiLAotCQkJICAmcGJ1ZiwgJmVycm9ycywgJm1hcHBpbmcpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmVycm9ycywgJm1hcHBpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAobWFwcGluZyA9PSBQeV9Ob25lKQotCW1hcHBpbmcgPSBOVUxMOworICAgICAgICBtYXBwaW5nID0gTlVMTDsKIAotCXVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcChwYnVmLmJ1ZiwgcGJ1Zi5sZW4sIG1hcHBpbmcsIGVycm9ycyk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JcmV0dXJuIGNvZGVjX3R1cGxlKHVuaWNvZGUsIHBidWYubGVuKTsKKyAgICAgICAgdW5pY29kZSA9IFB5VW5pY29kZV9EZWNvZGVDaGFybWFwKHBidWYuYnVmLCBwYnVmLmxlbiwgbWFwcGluZywgZXJyb3JzKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIHJldHVybiBjb2RlY190dXBsZSh1bmljb2RlLCBwYnVmLmxlbik7CiB9CiAKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmIGRlZmluZWQoSEFWRV9VU0FCTEVfV0NIQVJfVCkKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1iY3NfZGVjb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOworICAgICAgICBQeV9idWZmZXIgcGJ1ZjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBmaW5hbCA9IDA7CiAgICAgUHlfc3NpemVfdCBjb25zdW1lZDsKICAgICBQeU9iamVjdCAqZGVjb2RlZCA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHppOm1iY3NfZGVjb2RlIiwKLQkJCSAgJnBidWYsICZlcnJvcnMsICZmaW5hbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYnVmLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjb25zdW1lZCA9IHBidWYubGVuOwogCiAgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWwocGJ1Zi5idWYsIHBidWYubGVuLCBlcnJvcnMsCi0JCQkJCSAgIGZpbmFsID8gTlVMTCA6ICZjb25zdW1lZCk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CiAgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGNvbnN1bWVkKTsKIH0KIApAQCAtNTk5LDM5ICs1OTksMzkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlYWRidWZmZXJfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgY29uc3QgY2hhciAqZGF0YTsKICAgICBQeV9zc2l6ZV90IHNpemU7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8ejpyZWFkYnVmZmVyX2VuY29kZSIsCi0JCQkgICZkYXRhLCAmc2l6ZSwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLCAmc2l6ZSwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgcmV0dXJuIGNvZGVjX3R1cGxlKFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIHNpemUpLAotCQkgICAgICAgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2hhcmJ1ZmZlcl9lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBjb25zdCBjaGFyICpkYXRhOwogICAgIFB5X3NzaXplX3Qgc2l6ZTsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3x6OmNoYXJidWZmZXJfZW5jb2RlIiwKLQkJCSAgJmRhdGEsICZzaXplLCAmZXJyb3JzKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsICZzaXplLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSksCi0JCSAgICAgICBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2ludGVybmFsX2VuY29kZShQeU9iamVjdCAqc2VsZiwKLQkJCVB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKm9iajsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwpAQCAtNjM5LDY1ICs2MzksNjUgQEAKICAgICBQeV9zc2l6ZV90IHNpemU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1bmljb2RlX2ludGVybmFsX2VuY29kZSIsCi0JCQkgICZvYmosICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKLQlkYXRhID0gUHlVbmljb2RlX0FTX0RBVEEob2JqKTsKLQlzaXplID0gUHlVbmljb2RlX0dFVF9EQVRBX1NJWkUob2JqKTsKLQlyZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSksCi0JCQkgICBzaXplKTsKKyAgICAgICAgZGF0YSA9IFB5VW5pY29kZV9BU19EQVRBKG9iaik7CisgICAgICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX0RBVEFfU0laRShvYmopOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKICAgICB9CiAgICAgZWxzZSB7Ci0JaWYgKFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmosIChjb25zdCB2b2lkICoqKSZkYXRhLCAmc2l6ZSkpCi0JICAgIHJldHVybiBOVUxMOwotCXJldHVybiBjb2RlY190dXBsZShQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCBzaXplKSwKLQkJCSAgIHNpemUpOworICAgICAgICBpZiAoUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iaiwgKGNvbnN0IHZvaWQgKiopJmRhdGEsICZzaXplKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKICAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfN19lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnN0ciwgKnY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl83X2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVVVEY3KFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSwKLQkJCQkJIDAsCi0JCQkJCSAwLAotCQkJCQkgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHV0Zl84X2VuY29kZShQeU9iamVjdCAqc2VsZiwKLQkgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqc3RyLCAqdjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dXRmXzhfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjgoUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCQkJIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJCQkgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KQEAgLTcxMSw3MCArNzExLDcwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98emk6dXRmXzE2X2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMsICZieXRlb3JkZXIpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVVVEYxNihQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJCQkgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJCQkgIGVycm9ycywKLQkJCQkJICBieXRlb3JkZXIpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlb3JkZXIpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfbGVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMTZfbGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjE2KFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgICAgZXJyb3JzLAotCQkJCQkgICAgIC0xKSwKLQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMTZfYmVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMTZfYmVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjE2KFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgZXJyb3JzLAotCQkJCQkgICsxKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CkBAIC03ODgsMTg2ICs3ODgsMTg2IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgaW50IGJ5dGVvcmRlciA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98emk6dXRmXzMyX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMsICZieXRlb3JkZXIpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVVVEYzMihQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJCQkgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJCQkgIGVycm9ycywKLQkJCQkJICBieXRlb3JkZXIpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlb3JkZXIpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfbGVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfbGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjMyKFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgICAgZXJyb3JzLAotCQkJCQkgICAgIC0xKSwKLQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1dGZfMzJfYmVfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfYmVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVURjMyKFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkJCSAgZXJyb3JzLAotCQkJCQkgICsxKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2VzY2FwZV9lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCSAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqc3RyLCAqdjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVVuaWNvZGVFc2NhcGUoUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUoUHlPYmplY3QgKnNlbGYsCi0JCQlQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpyYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUoCi0JCQkgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCSAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSksCi0JCSAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxhdGluXzFfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpsYXRpbl8xX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVMYXRpbjEoCi0JCQkgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKLQkJCSAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSwKLQkJCSAgICAgICBlcnJvcnMpLAotCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOwogICAgIFB5X0RFQ1JFRihzdHIpOwogICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXNjaWlfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnN0ciwgKnY7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OmFzY2lpX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVBU0NJSSgKLQkJCSAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJICAgICAgIGVycm9ycyksCi0JCSAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUoc3RyKSk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjaGFybWFwX2VuY29kZShQeU9iamVjdCAqc2VsZiwKLQkgICAgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm1hcHBpbmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHpPOmNoYXJtYXBfZW5jb2RlIiwKLQkJCSAgJnN0ciwgJmVycm9ycywgJm1hcHBpbmcpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzLCAmbWFwcGluZykpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChtYXBwaW5nID09IFB5X05vbmUpCi0JbWFwcGluZyA9IE5VTEw7CisgICAgICAgIG1hcHBpbmcgPSBOVUxMOwogCiAgICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKICAgICBpZiAoc3RyID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcCgKLQkJCSAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAotCQkJICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAotCQkJICAgICAgIG1hcHBpbmcsCi0JCQkgICAgICAgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0cikpOwogICAgIFB5X0RFQ1JFRihzdHIpOwogICAgIHJldHVybiB2OwogfQpAQCAtOTg1LDIzICs5ODUsMjMgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1iY3NfZW5jb2RlKFB5T2JqZWN0ICpzZWxmLAotCSAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpzdHIsICp2OwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejptYmNzX2VuY29kZSIsCi0JCQkgICZzdHIsICZlcnJvcnMpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVNQkNTKAotCQkJICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHN0ciksCi0JCQkgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHN0ciksCi0JCQkgICAgICAgZXJyb3JzKSwKLQkJICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShzdHIpKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KQEAgLTEwMjYsOCArMTAyNiw4IEBACiAgICAgUHlPYmplY3QgKmhhbmRsZXI7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOnJlZ2lzdGVyX2Vycm9yIiwKLQkJCSAgJm5hbWUsICZoYW5kbGVyKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsICZoYW5kbGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5Q29kZWNfUmVnaXN0ZXJFcnJvcihuYW1lLCBoYW5kbGVyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfUkVUVVJOX05PTkU7CkBAIC0xMDQ0LDY4ICsxMDQ0LDY4IEBACiAgICAgY29uc3QgY2hhciAqbmFtZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpsb29rdXBfZXJyb3IiLAotCQkJICAmbmFtZSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5Q29kZWNfTG9va3VwRXJyb3IobmFtZSk7CiB9CiAKIC8qIC0tLSBNb2R1bGUgQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgX2NvZGVjc19mdW5jdGlvbnNbXSA9IHsKLSAgICB7InJlZ2lzdGVyIiwJCWNvZGVjX3JlZ2lzdGVyLAkJCU1FVEhfTywKKyAgICB7InJlZ2lzdGVyIiwgICAgICAgICAgICAgICAgY29kZWNfcmVnaXN0ZXIsICAgICAgICAgICAgICAgICBNRVRIX08sCiAgICAgICAgIHJlZ2lzdGVyX19kb2NfX30sCi0gICAgeyJsb29rdXAiLAkJCWNvZGVjX2xvb2t1cCwgCQkJTUVUSF9WQVJBUkdTLAorICAgIHsibG9va3VwIiwgICAgICAgICAgICAgICAgICBjb2RlY19sb29rdXAsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKICAgICAgICAgbG9va3VwX19kb2NfX30sCi0gICAgeyJlbmNvZGUiLAkJCWNvZGVjX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1MsCi0JZW5jb2RlX19kb2NfX30sCi0gICAgeyJkZWNvZGUiLAkJCWNvZGVjX2RlY29kZSwJCQlNRVRIX1ZBUkFSR1MsCi0JZGVjb2RlX19kb2NfX30sCi0gICAgeyJlc2NhcGVfZW5jb2RlIiwJCWVzY2FwZV9lbmNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImVzY2FwZV9kZWNvZGUiLAkJZXNjYXBlX2RlY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAorICAgIHsiZW5jb2RlIiwgICAgICAgICAgICAgICAgICBjb2RlY19lbmNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgZW5jb2RlX19kb2NfX30sCisgICAgeyJkZWNvZGUiLCAgICAgICAgICAgICAgICAgIGNvZGVjX2RlY29kZSwgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICBkZWNvZGVfX2RvY19ffSwKKyAgICB7ImVzY2FwZV9lbmNvZGUiLCAgICAgICAgICAgZXNjYXBlX2VuY29kZSwgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZXNjYXBlX2RlY29kZSIsICAgICAgICAgICBlc2NhcGVfZGVjb2RlLCAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotICAgIHsidXRmXzhfZW5jb2RlIiwJCXV0Zl84X2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzhfZGVjb2RlIiwJCXV0Zl84X2RlY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzdfZW5jb2RlIiwJCXV0Zl83X2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzdfZGVjb2RlIiwJCXV0Zl83X2RlY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzE2X2VuY29kZSIsCQl1dGZfMTZfZW5jb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMTZfbGVfZW5jb2RlIiwJdXRmXzE2X2xlX2VuY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMTZfYmVfZW5jb2RlIiwJdXRmXzE2X2JlX2VuY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMTZfZGVjb2RlIiwJCXV0Zl8xNl9kZWNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8xNl9sZV9kZWNvZGUiLAl1dGZfMTZfbGVfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8xNl9iZV9kZWNvZGUiLAl1dGZfMTZfYmVfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8xNl9leF9kZWNvZGUiLAl1dGZfMTZfZXhfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InV0Zl8zMl9lbmNvZGUiLAkJdXRmXzMyX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzMyX2xlX2VuY29kZSIsCXV0Zl8zMl9sZV9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzMyX2JlX2VuY29kZSIsCXV0Zl8zMl9iZV9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidXRmXzMyX2RlY29kZSIsCQl1dGZfMzJfZGVjb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMzJfbGVfZGVjb2RlIiwJdXRmXzMyX2xlX2RlY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMzJfYmVfZGVjb2RlIiwJdXRmXzMyX2JlX2RlY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1dGZfMzJfZXhfZGVjb2RlIiwJdXRmXzMyX2V4X2RlY29kZSwJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1bmljb2RlX2VzY2FwZV9lbmNvZGUiLAl1bmljb2RlX2VzY2FwZV9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsidW5pY29kZV9lc2NhcGVfZGVjb2RlIiwJdW5pY29kZV9lc2NhcGVfZGVjb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7InVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlIiwJdW5pY29kZV9pbnRlcm5hbF9lbmNvZGUsCU1FVEhfVkFSQVJHU30sCi0gICAgeyJ1bmljb2RlX2ludGVybmFsX2RlY29kZSIsCXVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlLAlNRVRIX1ZBUkFSR1N9LAotICAgIHsicmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSIsIHJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUsCU1FVEhfVkFSQVJHU30sCi0gICAgeyJyYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlIiwgcmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZSwJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImxhdGluXzFfZW5jb2RlIiwgCQlsYXRpbl8xX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsibGF0aW5fMV9kZWNvZGUiLCAJCWxhdGluXzFfZGVjb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJhc2NpaV9lbmNvZGUiLCAJCWFzY2lpX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsiYXNjaWlfZGVjb2RlIiwgCQlhc2NpaV9kZWNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImNoYXJtYXBfZW5jb2RlIiwgCQljaGFybWFwX2VuY29kZSwJCQlNRVRIX1ZBUkFSR1N9LAotICAgIHsiY2hhcm1hcF9kZWNvZGUiLCAJCWNoYXJtYXBfZGVjb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJjaGFybWFwX2J1aWxkIiwgCQljaGFybWFwX2J1aWxkLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJyZWFkYnVmZmVyX2VuY29kZSIsCXJlYWRidWZmZXJfZW5jb2RlLAkJTUVUSF9WQVJBUkdTfSwKLSAgICB7ImNoYXJidWZmZXJfZW5jb2RlIiwJY2hhcmJ1ZmZlcl9lbmNvZGUsCQlNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzhfZW5jb2RlIiwgICAgICAgICAgICB1dGZfOF9lbmNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfOF9kZWNvZGUiLCAgICAgICAgICAgIHV0Zl84X2RlY29kZSwgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl83X2VuY29kZSIsICAgICAgICAgICAgdXRmXzdfZW5jb2RlLCAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzdfZGVjb2RlIiwgICAgICAgICAgICB1dGZfN19kZWNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMTZfZW5jb2RlIiwgICAgICAgICAgIHV0Zl8xNl9lbmNvZGUsICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8xNl9sZV9lbmNvZGUiLCAgICAgICAgdXRmXzE2X2xlX2VuY29kZSwgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzE2X2JlX2VuY29kZSIsICAgICAgICB1dGZfMTZfYmVfZW5jb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMTZfZGVjb2RlIiwgICAgICAgICAgIHV0Zl8xNl9kZWNvZGUsICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8xNl9sZV9kZWNvZGUiLCAgICAgICAgdXRmXzE2X2xlX2RlY29kZSwgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzE2X2JlX2RlY29kZSIsICAgICAgICB1dGZfMTZfYmVfZGVjb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMTZfZXhfZGVjb2RlIiwgICAgICAgIHV0Zl8xNl9leF9kZWNvZGUsICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8zMl9lbmNvZGUiLCAgICAgICAgICAgdXRmXzMyX2VuY29kZSwgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzMyX2xlX2VuY29kZSIsICAgICAgICB1dGZfMzJfbGVfZW5jb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMzJfYmVfZW5jb2RlIiwgICAgICAgIHV0Zl8zMl9iZV9lbmNvZGUsICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8zMl9kZWNvZGUiLCAgICAgICAgICAgdXRmXzMyX2RlY29kZSwgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidXRmXzMyX2xlX2RlY29kZSIsICAgICAgICB1dGZfMzJfbGVfZGVjb2RlLCAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1dGZfMzJfYmVfZGVjb2RlIiwgICAgICAgIHV0Zl8zMl9iZV9kZWNvZGUsICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0Zl8zMl9leF9kZWNvZGUiLCAgICAgICAgdXRmXzMyX2V4X2RlY29kZSwgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidW5pY29kZV9lc2NhcGVfZW5jb2RlIiwgICB1bmljb2RlX2VzY2FwZV9lbmNvZGUsICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1bmljb2RlX2VzY2FwZV9kZWNvZGUiLCAgIHVuaWNvZGVfZXNjYXBlX2RlY29kZSwgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlIiwgdW5pY29kZV9pbnRlcm5hbF9lbmNvZGUsICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidW5pY29kZV9pbnRlcm5hbF9kZWNvZGUiLCB1bmljb2RlX2ludGVybmFsX2RlY29kZSwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJyYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlIiwgcmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSwgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUiLCByYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlLCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsibGF0aW5fMV9lbmNvZGUiLCAgICAgICAgICBsYXRpbl8xX2VuY29kZSwgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJsYXRpbl8xX2RlY29kZSIsICAgICAgICAgIGxhdGluXzFfZGVjb2RlLCAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImFzY2lpX2VuY29kZSIsICAgICAgICAgICAgYXNjaWlfZW5jb2RlLCAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiYXNjaWlfZGVjb2RlIiwgICAgICAgICAgICBhc2NpaV9kZWNvZGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJjaGFybWFwX2VuY29kZSIsICAgICAgICAgIGNoYXJtYXBfZW5jb2RlLCAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNoYXJtYXBfZGVjb2RlIiwgICAgICAgICAgY2hhcm1hcF9kZWNvZGUsICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2hhcm1hcF9idWlsZCIsICAgICAgICAgICBjaGFybWFwX2J1aWxkLCAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJyZWFkYnVmZmVyX2VuY29kZSIsICAgICAgIHJlYWRidWZmZXJfZW5jb2RlLCAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNoYXJidWZmZXJfZW5jb2RlIiwgICAgICAgY2hhcmJ1ZmZlcl9lbmNvZGUsICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgJiYgZGVmaW5lZChIQVZFX1VTQUJMRV9XQ0hBUl9UKQotICAgIHsibWJjc19lbmNvZGUiLCAJCW1iY3NfZW5jb2RlLAkJCU1FVEhfVkFSQVJHU30sCi0gICAgeyJtYmNzX2RlY29kZSIsIAkJbWJjc19kZWNvZGUsCQkJTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1iY3NfZW5jb2RlIiwgICAgICAgICAgICAgbWJjc19lbmNvZGUsICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsibWJjc19kZWNvZGUiLCAgICAgICAgICAgICBtYmNzX2RlY29kZSwgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKICNlbmRpZiAvKiBQeV9VU0lOR19VTklDT0RFICovCi0gICAgeyJyZWdpc3Rlcl9lcnJvciIsIAkJcmVnaXN0ZXJfZXJyb3IsCQkJTUVUSF9WQVJBUkdTLAorICAgIHsicmVnaXN0ZXJfZXJyb3IiLCAgICAgICAgICByZWdpc3Rlcl9lcnJvciwgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKICAgICAgICAgcmVnaXN0ZXJfZXJyb3JfX2RvY19ffSwKLSAgICB7Imxvb2t1cF9lcnJvciIsIAkJbG9va3VwX2Vycm9yLAkJCU1FVEhfVkFSQVJHUywKKyAgICB7Imxvb2t1cF9lcnJvciIsICAgICAgICAgICAgbG9va3VwX2Vycm9yLCAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsCiAgICAgICAgIGxvb2t1cF9lcnJvcl9fZG9jX199LAotICAgIHtOVUxMLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgTlVMTH0gICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jIGIvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYwppbmRleCA0MmNmZTZiLi42YWFkZWMxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKQEAgLTQ2LDkgKzQ2LDkgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCBCTE9DSyB7Ci0Jc3RydWN0IEJMT0NLICpsZWZ0bGluazsKLQlzdHJ1Y3QgQkxPQ0sgKnJpZ2h0bGluazsKLQlQeU9iamVjdCAqZGF0YVtCTE9DS0xFTl07CisgICAgc3RydWN0IEJMT0NLICpsZWZ0bGluazsKKyAgICBzdHJ1Y3QgQkxPQ0sgKnJpZ2h0bGluazsKKyAgICBQeU9iamVjdCAqZGF0YVtCTE9DS0xFTl07CiB9IGJsb2NrOwogCiAjZGVmaW5lIE1BWEZSRUVCTE9DS1MgMTAKQEAgLTU3LDcxICs1Nyw3MSBAQAogCiBzdGF0aWMgYmxvY2sgKgogbmV3YmxvY2soYmxvY2sgKmxlZnRsaW5rLCBibG9jayAqcmlnaHRsaW5rLCBQeV9zc2l6ZV90IGxlbikgewotCWJsb2NrICpiOwotCS8qIFRvIHByZXZlbnQgbGVuIGZyb20gb3ZlcmZsb3dpbmcgUFlfU1NJWkVfVF9NQVggb24gNjQtYml0IG1hY2hpbmVzLCB3ZQotCSAqIHJlZnVzZSB0byBhbGxvY2F0ZSBuZXcgYmxvY2tzIGlmIHRoZSBjdXJyZW50IGxlbiBpcyBkYW5nZXJvdXNseQotCSAqIGNsb3NlLiAgVGhlcmUgaXMgc29tZSBleHRyYSBtYXJnaW4gdG8gcHJldmVudCBzcHVyaW91cyBhcml0aG1ldGljCi0JICogb3ZlcmZsb3dzIGF0IHZhcmlvdXMgcGxhY2VzLiAgVGhlIGZvbGxvd2luZyBjaGVjayBlbnN1cmVzIHRoYXQKLQkgKiB0aGUgYmxvY2tzIGFsbG9jYXRlZCB0byB0aGUgZGVxdWUsIGluIHRoZSB3b3JzdCBjYXNlLCBjYW4gb25seQotCSAqIGhhdmUgUFlfU1NJWkVfVF9NQVgtMiBlbnRyaWVzIGluIHRvdGFsLgotCSAqLwotCWlmIChsZW4gPj0gUFlfU1NJWkVfVF9NQVggLSAyKkJMT0NLTEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJjYW5ub3QgYWRkIG1vcmUgYmxvY2tzIHRvIHRoZSBkZXF1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG51bWZyZWVibG9ja3MpIHsKLQkJbnVtZnJlZWJsb2NrcyAtPSAxOwotCQliID0gZnJlZWJsb2Nrc1tudW1mcmVlYmxvY2tzXTsKLQl9IGVsc2UgewotCQliID0gUHlNZW1fTWFsbG9jKHNpemVvZihibG9jaykpOwotCQlpZiAoYiA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JYi0+bGVmdGxpbmsgPSBsZWZ0bGluazsKLQliLT5yaWdodGxpbmsgPSByaWdodGxpbms7Ci0JcmV0dXJuIGI7CisgICAgYmxvY2sgKmI7CisgICAgLyogVG8gcHJldmVudCBsZW4gZnJvbSBvdmVyZmxvd2luZyBQWV9TU0laRV9UX01BWCBvbiA2NC1iaXQgbWFjaGluZXMsIHdlCisgICAgICogcmVmdXNlIHRvIGFsbG9jYXRlIG5ldyBibG9ja3MgaWYgdGhlIGN1cnJlbnQgbGVuIGlzIGRhbmdlcm91c2x5CisgICAgICogY2xvc2UuICBUaGVyZSBpcyBzb21lIGV4dHJhIG1hcmdpbiB0byBwcmV2ZW50IHNwdXJpb3VzIGFyaXRobWV0aWMKKyAgICAgKiBvdmVyZmxvd3MgYXQgdmFyaW91cyBwbGFjZXMuICBUaGUgZm9sbG93aW5nIGNoZWNrIGVuc3VyZXMgdGhhdAorICAgICAqIHRoZSBibG9ja3MgYWxsb2NhdGVkIHRvIHRoZSBkZXF1ZSwgaW4gdGhlIHdvcnN0IGNhc2UsIGNhbiBvbmx5CisgICAgICogaGF2ZSBQWV9TU0laRV9UX01BWC0yIGVudHJpZXMgaW4gdG90YWwuCisgICAgICovCisgICAgaWYgKGxlbiA+PSBQWV9TU0laRV9UX01BWCAtIDIqQkxPQ0tMRU4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBtb3JlIGJsb2NrcyB0byB0aGUgZGVxdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChudW1mcmVlYmxvY2tzKSB7CisgICAgICAgIG51bWZyZWVibG9ja3MgLT0gMTsKKyAgICAgICAgYiA9IGZyZWVibG9ja3NbbnVtZnJlZWJsb2Nrc107CisgICAgfSBlbHNlIHsKKyAgICAgICAgYiA9IFB5TWVtX01hbGxvYyhzaXplb2YoYmxvY2spKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGItPmxlZnRsaW5rID0gbGVmdGxpbms7CisgICAgYi0+cmlnaHRsaW5rID0gcmlnaHRsaW5rOworICAgIHJldHVybiBiOwogfQogCiBzdGF0aWMgdm9pZAogZnJlZWJsb2NrKGJsb2NrICpiKQogewotCWlmIChudW1mcmVlYmxvY2tzIDwgTUFYRlJFRUJMT0NLUykgewotCQlmcmVlYmxvY2tzW251bWZyZWVibG9ja3NdID0gYjsKLQkJbnVtZnJlZWJsb2NrcysrOwotCX0gZWxzZSB7Ci0JCVB5TWVtX0ZyZWUoYik7Ci0JfQorICAgIGlmIChudW1mcmVlYmxvY2tzIDwgTUFYRlJFRUJMT0NLUykgeworICAgICAgICBmcmVlYmxvY2tzW251bWZyZWVibG9ja3NdID0gYjsKKyAgICAgICAgbnVtZnJlZWJsb2NrcysrOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5TWVtX0ZyZWUoYik7CisgICAgfQogfQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWJsb2NrICpsZWZ0YmxvY2s7Ci0JYmxvY2sgKnJpZ2h0YmxvY2s7Ci0JUHlfc3NpemVfdCBsZWZ0aW5kZXg7CS8qIGluIHJhbmdlKEJMT0NLTEVOKSAqLwotCVB5X3NzaXplX3QgcmlnaHRpbmRleDsJLyogaW4gcmFuZ2UoQkxPQ0tMRU4pICovCi0JUHlfc3NpemVfdCBsZW47Ci0JUHlfc3NpemVfdCBtYXhsZW47Ci0JbG9uZyBzdGF0ZTsJLyogaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIGluZGljZXMgbW92ZSAqLwotCVB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgYmxvY2sgKmxlZnRibG9jazsKKyAgICBibG9jayAqcmlnaHRibG9jazsKKyAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsgICAgICAgLyogaW4gcmFuZ2UoQkxPQ0tMRU4pICovCisgICAgUHlfc3NpemVfdCByaWdodGluZGV4OyAgICAgIC8qIGluIHJhbmdlKEJMT0NLTEVOKSAqLworICAgIFB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgbWF4bGVuOworICAgIGxvbmcgc3RhdGU7ICAgICAgICAgLyogaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIGluZGljZXMgbW92ZSAqLworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KIH0gZGVxdWVvYmplY3Q7CiAKIC8qIFRoZSBkZXF1ZSdzIHNpemUgbGltaXQgaXMgZC5tYXhsZW4uICBUaGUgbGltaXQgY2FuIGJlIHplcm8gb3IgcG9zaXRpdmUuCiAgKiBJZiB0aGVyZSBpcyBubyBsaW1pdCwgdGhlbiBkLm1heGxlbiA9PSAtMS4KLSAqIAorICoKICAqIEFmdGVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYSBkZXF1ZSwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzaXplIGhhcyBncm93biBwYXN0CiAgKiB0aGUgbGltaXQuIElmIGl0IGhhcywgd2UgZ2V0IHRoZSBzaXplIGJhY2sgZG93biB0byB0aGUgbGltaXQgYnkgcG9wcGluZyBhbgogICogaXRlbSBvZmYgb2YgdGhlIG9wcG9zaXRlIGVuZC4gIFRoZSBtZXRob2RzIHRoYXQgY2FuIHRyaWdnZXIgdGhpcyBhcmUgYXBwZW5kKCksCiAgKiBhcHBlbmRsZWZ0KCksIGV4dGVuZCgpLCBhbmQgZXh0ZW5kbGVmdCgpLgogICovCiAKLSNkZWZpbmUgVFJJTShkLCBwb3BmdW5jdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKLSAgICBpZiAoZC0+bWF4bGVuICE9IC0xICYmIGQtPmxlbiA+IGQtPm1heGxlbikgeyAgICAgICAgICAgICAgCVwKLSAgICAgICAgICAgIFB5T2JqZWN0ICpydiA9IHBvcGZ1bmN0aW9uKGQsIE5VTEwpOyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBhc3NlcnQocnYgIT0gTlVMTCAgJiYgIGQtPmxlbiA8PSBkLT5tYXhsZW4pOyAgICAgICAgXAotICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgVFJJTShkLCBwb3BmdW5jdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGQtPm1heGxlbiAhPSAtMSAmJiBkLT5sZW4gPiBkLT5tYXhsZW4pIHsgICAgICAgICAgICAgICAgXAorICAgICAgICBQeU9iamVjdCAqcnYgPSBwb3BmdW5jdGlvbihkLCBOVUxMKTsgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NlcnQocnYgIT0gTlVMTCAgJiYgIGQtPmxlbiA8PSBkLT5tYXhsZW4pOyAgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYocnYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBkZXF1ZV90eXBlOwpAQCAtMTI5LDY1ICsxMjksNjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JZGVxdWVvYmplY3QgKmRlcXVlOwotCWJsb2NrICpiOworICAgIGRlcXVlb2JqZWN0ICpkZXF1ZTsKKyAgICBibG9jayAqYjsKIAotCS8qIGNyZWF0ZSBkZXF1ZW9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlkZXF1ZSA9IChkZXF1ZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChkZXF1ZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBjcmVhdGUgZGVxdWVvYmplY3Qgc3RydWN0dXJlICovCisgICAgZGVxdWUgPSAoZGVxdWVvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoZGVxdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQliID0gbmV3YmxvY2soTlVMTCwgTlVMTCwgMCk7Ci0JaWYgKGIgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZGVxdWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYiA9IG5ld2Jsb2NrKE5VTEwsIE5VTEwsIDApOworICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGRlcXVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYXNzZXJ0KEJMT0NLTEVOID49IDIpOwotCWRlcXVlLT5sZWZ0YmxvY2sgPSBiOwotCWRlcXVlLT5yaWdodGJsb2NrID0gYjsKLQlkZXF1ZS0+bGVmdGluZGV4ID0gQ0VOVEVSICsgMTsKLQlkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKLQlkZXF1ZS0+bGVuID0gMDsKLQlkZXF1ZS0+c3RhdGUgPSAwOwotCWRlcXVlLT53ZWFrcmVmbGlzdCA9IE5VTEw7Ci0JZGVxdWUtPm1heGxlbiA9IC0xOworICAgIGFzc2VydChCTE9DS0xFTiA+PSAyKTsKKyAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKKyAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7CisgICAgZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7CisgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7CisgICAgZGVxdWUtPmxlbiA9IDA7CisgICAgZGVxdWUtPnN0YXRlID0gMDsKKyAgICBkZXF1ZS0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIGRlcXVlLT5tYXhsZW4gPSAtMTsKIAotCXJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9wb3AoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqdW51c2VkKQogewotCVB5T2JqZWN0ICppdGVtOwotCWJsb2NrICpwcmV2YmxvY2s7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgYmxvY2sgKnByZXZibG9jazsKIAotCWlmIChkZXF1ZS0+bGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXRlbSA9IGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XTsKLQlkZXF1ZS0+cmlnaHRpbmRleC0tOwotCWRlcXVlLT5sZW4tLTsKLQlkZXF1ZS0+c3RhdGUrKzsKKyAgICBpZiAoZGVxdWUtPmxlbiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGZyb20gYW4gZW1wdHkgZGVxdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ZW0gPSBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF07CisgICAgZGVxdWUtPnJpZ2h0aW5kZXgtLTsKKyAgICBkZXF1ZS0+bGVuLS07CisgICAgZGVxdWUtPnN0YXRlKys7CiAKLQlpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gLTEpIHsKLQkJaWYgKGRlcXVlLT5sZW4gPT0gMCkgewotCQkJYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOwotCQkJYXNzZXJ0KGRlcXVlLT5sZWZ0aW5kZXggPT0gZGVxdWUtPnJpZ2h0aW5kZXgrMSk7Ci0JCQkvKiByZS1jZW50ZXIgaW5zdGVhZCBvZiBmcmVlaW5nIGEgYmxvY2sgKi8KLQkJCWRlcXVlLT5sZWZ0aW5kZXggPSBDRU5URVIgKyAxOwotCQkJZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jay0+bGVmdGxpbms7Ci0JCQlhc3NlcnQoZGVxdWUtPmxlZnRibG9jayAhPSBkZXF1ZS0+cmlnaHRibG9jayk7Ci0JCQlmcmVlYmxvY2soZGVxdWUtPnJpZ2h0YmxvY2spOwotCQkJcHJldmJsb2NrLT5yaWdodGxpbmsgPSBOVUxMOwotCQkJZGVxdWUtPnJpZ2h0YmxvY2sgPSBwcmV2YmxvY2s7Ci0JCQlkZXF1ZS0+cmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMTsKLQkJfQotCX0KLQlyZXR1cm4gaXRlbTsKKyAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gLTEpIHsKKyAgICAgICAgaWYgKGRlcXVlLT5sZW4gPT0gMCkgeworICAgICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOworICAgICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0aW5kZXggPT0gZGVxdWUtPnJpZ2h0aW5kZXgrMSk7CisgICAgICAgICAgICAvKiByZS1jZW50ZXIgaW5zdGVhZCBvZiBmcmVlaW5nIGEgYmxvY2sgKi8KKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBDRU5URVIgKyAxOworICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jay0+bGVmdGxpbms7CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayAhPSBkZXF1ZS0+cmlnaHRibG9jayk7CisgICAgICAgICAgICBmcmVlYmxvY2soZGVxdWUtPnJpZ2h0YmxvY2spOworICAgICAgICAgICAgcHJldmJsb2NrLT5yaWdodGxpbmsgPSBOVUxMOworICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBwcmV2YmxvY2s7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKHBvcF9kb2MsICJSZW1vdmUgYW5kIHJldHVybiB0aGUgcmlnaHRtb3N0IGVsZW1lbnQuIik7CkBAIC0xOTUsMzcgKzE5NSwzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX3BvcGxlZnQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqdW51c2VkKQogewotCVB5T2JqZWN0ICppdGVtOwotCWJsb2NrICpwcmV2YmxvY2s7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgYmxvY2sgKnByZXZibG9jazsKIAotCWlmIChkZXF1ZS0+bGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgIT0gTlVMTCk7Ci0JaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07Ci0JZGVxdWUtPmxlZnRpbmRleCsrOwotCWRlcXVlLT5sZW4tLTsKLQlkZXF1ZS0+c3RhdGUrKzsKKyAgICBpZiAoZGVxdWUtPmxlbiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGZyb20gYW4gZW1wdHkgZGVxdWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IE5VTEwpOworICAgIGl0ZW0gPSBkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdOworICAgIGRlcXVlLT5sZWZ0aW5kZXgrKzsKKyAgICBkZXF1ZS0+bGVuLS07CisgICAgZGVxdWUtPnN0YXRlKys7CiAKLQlpZiAoZGVxdWUtPmxlZnRpbmRleCA9PSBCTE9DS0xFTikgewotCQlpZiAoZGVxdWUtPmxlbiA9PSAwKSB7Ci0JCQlhc3NlcnQoZGVxdWUtPmxlZnRibG9jayA9PSBkZXF1ZS0+cmlnaHRibG9jayk7Ci0JCQlhc3NlcnQoZGVxdWUtPmxlZnRpbmRleCA9PSBkZXF1ZS0+cmlnaHRpbmRleCsxKTsKLQkJCS8qIHJlLWNlbnRlciBpbnN0ZWFkIG9mIGZyZWVpbmcgYSBibG9jayAqLwotCQkJZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7Ci0JCQlkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IGRlcXVlLT5yaWdodGJsb2NrKTsKLQkJCXByZXZibG9jayA9IGRlcXVlLT5sZWZ0YmxvY2stPnJpZ2h0bGluazsKLQkJCWZyZWVibG9jayhkZXF1ZS0+bGVmdGJsb2NrKTsKLQkJCWFzc2VydChwcmV2YmxvY2sgIT0gTlVMTCk7Ci0JCQlwcmV2YmxvY2stPmxlZnRsaW5rID0gTlVMTDsKLQkJCWRlcXVlLT5sZWZ0YmxvY2sgPSBwcmV2YmxvY2s7Ci0JCQlkZXF1ZS0+bGVmdGluZGV4ID0gMDsKLQkJfQotCX0KLQlyZXR1cm4gaXRlbTsKKyAgICBpZiAoZGVxdWUtPmxlZnRpbmRleCA9PSBCTE9DS0xFTikgeworICAgICAgICBpZiAoZGVxdWUtPmxlbiA9PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayA9PSBkZXF1ZS0+cmlnaHRibG9jayk7CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRpbmRleCA9PSBkZXF1ZS0+cmlnaHRpbmRleCsxKTsKKyAgICAgICAgICAgIC8qIHJlLWNlbnRlciBpbnN0ZWFkIG9mIGZyZWVpbmcgYSBibG9jayAqLworICAgICAgICAgICAgZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IGRlcXVlLT5yaWdodGJsb2NrKTsKKyAgICAgICAgICAgIHByZXZibG9jayA9IGRlcXVlLT5sZWZ0YmxvY2stPnJpZ2h0bGluazsKKyAgICAgICAgICAgIGZyZWVibG9jayhkZXF1ZS0+bGVmdGJsb2NrKTsKKyAgICAgICAgICAgIGFzc2VydChwcmV2YmxvY2sgIT0gTlVMTCk7CisgICAgICAgICAgICBwcmV2YmxvY2stPmxlZnRsaW5rID0gTlVMTDsKKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBwcmV2YmxvY2s7CisgICAgICAgICAgICBkZXF1ZS0+bGVmdGluZGV4ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKHBvcGxlZnRfZG9jLCAiUmVtb3ZlIGFuZCByZXR1cm4gdGhlIGxlZnRtb3N0IGVsZW1lbnQuIik7CkBAIC0yMzMsMjIgKzIzMywyMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2FwcGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQogewotCWRlcXVlLT5zdGF0ZSsrOwotCWlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTi0xKSB7Ci0JCWJsb2NrICpiID0gbmV3YmxvY2soZGVxdWUtPnJpZ2h0YmxvY2ssIE5VTEwsIGRlcXVlLT5sZW4pOwotCQlpZiAoYiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFzc2VydChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID09IE5VTEwpOwotCQlkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKLQkJZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOwotCQlkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOwotCX0KLQlQeV9JTkNSRUYoaXRlbSk7Ci0JZGVxdWUtPmxlbisrOwotCWRlcXVlLT5yaWdodGluZGV4Kys7Ci0JZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKLQlUUklNKGRlcXVlLCBkZXF1ZV9wb3BsZWZ0KTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4tMSkgeworICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKGRlcXVlLT5yaWdodGJsb2NrLCBOVUxMLCBkZXF1ZS0+bGVuKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhc3NlcnQoZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9PSBOVUxMKTsKKyAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9IGI7CisgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKKyAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAtMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGRlcXVlLT5sZW4rKzsKKyAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOworICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07CisgICAgVFJJTShkZXF1ZSwgZGVxdWVfcG9wbGVmdCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihhcHBlbmRfZG9jLCAiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlcXVlLiIpOwpAQCAtMjU2LDIyICsyNTYsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JZGVxdWUtPnN0YXRlKys7Ci0JaWYgKGRlcXVlLT5sZWZ0aW5kZXggPT0gMCkgewotCQlibG9jayAqYiA9IG5ld2Jsb2NrKE5VTEwsIGRlcXVlLT5sZWZ0YmxvY2ssIGRlcXVlLT5sZW4pOwotCQlpZiAoYiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFzc2VydChkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9PSBOVUxMKTsKLQkJZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPSBiOwotCQlkZXF1ZS0+bGVmdGJsb2NrID0gYjsKLQkJZGVxdWUtPmxlZnRpbmRleCA9IEJMT0NLTEVOOwotCX0KLQlQeV9JTkNSRUYoaXRlbSk7Ci0JZGVxdWUtPmxlbisrOwotCWRlcXVlLT5sZWZ0aW5kZXgtLTsKLQlkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdID0gaXRlbTsKLQlUUklNKGRlcXVlLCBkZXF1ZV9wb3ApOwotCVB5X1JFVFVSTl9OT05FOworICAgIGRlcXVlLT5zdGF0ZSsrOworICAgIGlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKKyAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhOVUxMLCBkZXF1ZS0+bGVmdGJsb2NrLCBkZXF1ZS0+bGVuKTsKKyAgICAgICAgaWYgKGIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPT0gTlVMTCk7CisgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rID0gYjsKKyAgICAgICAgZGVxdWUtPmxlZnRibG9jayA9IGI7CisgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGRlcXVlLT5sZW4rKzsKKyAgICBkZXF1ZS0+bGVmdGluZGV4LS07CisgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07CisgICAgVFJJTShkZXF1ZSwgZGVxdWVfcG9wKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGFwcGVuZGxlZnRfZG9jLCAiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUuIik7CkBAIC0yNzksNDcgKzI3OSw0NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2V4dGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKLQlQeU9iamVjdCAqaXQsICppdGVtOworICAgIFB5T2JqZWN0ICppdCwgKml0ZW07CiAKLQkvKiBIYW5kbGUgY2FzZSB3aGVyZSBpZChkZXF1ZSkgPT0gaWQoaXRlcmFibGUpICovCi0JaWYgKChQeU9iamVjdCAqKWRlcXVlID09IGl0ZXJhYmxlKSB7Ci0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCVB5T2JqZWN0ICpzID0gUHlTZXF1ZW5jZV9MaXN0KGl0ZXJhYmxlKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXN1bHQgPSBkZXF1ZV9leHRlbmQoZGVxdWUsIHMpOwotCQlQeV9ERUNSRUYocyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIC8qIEhhbmRsZSBjYXNlIHdoZXJlIGlkKGRlcXVlKSA9PSBpZChpdGVyYWJsZSkgKi8KKyAgICBpZiAoKFB5T2JqZWN0ICopZGVxdWUgPT0gaXRlcmFibGUpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QgKnMgPSBQeVNlcXVlbmNlX0xpc3QoaXRlcmFibGUpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlc3VsdCA9IGRlcXVlX2V4dGVuZChkZXF1ZSwgcyk7CisgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQlkZXF1ZS0+c3RhdGUrKzsKLQkJaWYgKGRlcXVlLT5yaWdodGluZGV4ID09IEJMT0NLTEVOLTEpIHsKLQkJCWJsb2NrICpiID0gbmV3YmxvY2soZGVxdWUtPnJpZ2h0YmxvY2ssIE5VTEwsCi0JCQkJCSAgICBkZXF1ZS0+bGVuKTsKLQkJCWlmIChiID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJUHlfREVDUkVGKGl0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWFzc2VydChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID09IE5VTEwpOwotCQkJZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9IGI7Ci0JCQlkZXF1ZS0+cmlnaHRibG9jayA9IGI7Ci0JCQlkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOwotCQl9Ci0JCWRlcXVlLT5sZW4rKzsKLQkJZGVxdWUtPnJpZ2h0aW5kZXgrKzsKLQkJZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKLQkJVFJJTShkZXF1ZSwgZGVxdWVfcG9wbGVmdCk7ICAgICAgICAgICAgICAgCi0JfQotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X1JFVFVSTl9OT05FOworICAgIHdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICAgICAgaWYgKGRlcXVlLT5yaWdodGluZGV4ID09IEJMT0NLTEVOLTEpIHsKKyAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soZGVxdWUtPnJpZ2h0YmxvY2ssIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcXVlLT5sZW4pOworICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0KGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmsgPT0gTlVMTCk7CisgICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKKyAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKKyAgICAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZGVxdWUtPmxlbisrOworICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOworICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF0gPSBpdGVtOworICAgICAgICBUUklNKGRlcXVlLCBkZXF1ZV9wb3BsZWZ0KTsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihleHRlbmRfZG9jLApAQCAtMzI4LDQ3ICszMjgsNDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9leHRlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZXJhYmxlKQogewotCVB5T2JqZWN0ICppdCwgKml0ZW07CisgICAgUHlPYmplY3QgKml0LCAqaXRlbTsKIAotCS8qIEhhbmRsZSBjYXNlIHdoZXJlIGlkKGRlcXVlKSA9PSBpZChpdGVyYWJsZSkgKi8KLQlpZiAoKFB5T2JqZWN0ICopZGVxdWUgPT0gaXRlcmFibGUpIHsKLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJUHlPYmplY3QgKnMgPSBQeVNlcXVlbmNlX0xpc3QoaXRlcmFibGUpOwotCQlpZiAocyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlc3VsdCA9IGRlcXVlX2V4dGVuZGxlZnQoZGVxdWUsIHMpOwotCQlQeV9ERUNSRUYocyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIC8qIEhhbmRsZSBjYXNlIHdoZXJlIGlkKGRlcXVlKSA9PSBpZChpdGVyYWJsZSkgKi8KKyAgICBpZiAoKFB5T2JqZWN0ICopZGVxdWUgPT0gaXRlcmFibGUpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QgKnMgPSBQeVNlcXVlbmNlX0xpc3QoaXRlcmFibGUpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlc3VsdCA9IGRlcXVlX2V4dGVuZGxlZnQoZGVxdWUsIHMpOworICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLQkJZGVxdWUtPnN0YXRlKys7Ci0JCWlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKLQkJCWJsb2NrICpiID0gbmV3YmxvY2soTlVMTCwgZGVxdWUtPmxlZnRibG9jaywKLQkJCQkJICAgIGRlcXVlLT5sZW4pOwotCQkJaWYgKGIgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlQeV9ERUNSRUYoaXQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rID09IE5VTEwpOwotCQkJZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPSBiOwotCQkJZGVxdWUtPmxlZnRibG9jayA9IGI7Ci0JCQlkZXF1ZS0+bGVmdGluZGV4ID0gQkxPQ0tMRU47Ci0JCX0KLQkJZGVxdWUtPmxlbisrOwotCQlkZXF1ZS0+bGVmdGluZGV4LS07Ci0JCWRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF0gPSBpdGVtOwotCQlUUklNKGRlcXVlLCBkZXF1ZV9wb3ApOyAgICAgICAgICAgICAgIAotCX0KLQlQeV9ERUNSRUYoaXQpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgICAgIGlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKKyAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soTlVMTCwgZGVxdWUtPmxlZnRibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVxdWUtPmxlbik7CisgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPT0gTlVMTCk7CisgICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9IGI7CisgICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKKyAgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKKyAgICAgICAgfQorICAgICAgICBkZXF1ZS0+bGVuKys7CisgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXgtLTsKKyAgICAgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07CisgICAgICAgIFRSSU0oZGVxdWUsIGRlcXVlX3BvcCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZXh0ZW5kbGVmdF9kb2MsCkBAIC0zNzcsNjMgKzM3Nyw2MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2lucGxhY2VfY29uY2F0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCXJlc3VsdCA9IGRlcXVlX2V4dGVuZChkZXF1ZSwgb3RoZXIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9JTkNSRUYoZGVxdWUpOwotCXJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKKyAgICByZXN1bHQgPSBkZXF1ZV9leHRlbmQoZGVxdWUsIG90aGVyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfSU5DUkVGKGRlcXVlKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKIHN0YXRpYyBpbnQKIF9kZXF1ZV9yb3RhdGUoZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IG4pCiB7Ci0JUHlfc3NpemVfdCBpLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xOwotCVB5T2JqZWN0ICppdGVtLCAqcnY7CisgICAgUHlfc3NpemVfdCBpLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xOworICAgIFB5T2JqZWN0ICppdGVtLCAqcnY7CiAKLQlpZiAobGVuID09IDApCi0JCXJldHVybiAwOwotCWlmIChuID4gaGFsZmxlbiB8fCBuIDwgLWhhbGZsZW4pIHsKLQkJbiAlPSBsZW47Ci0JCWlmIChuID4gaGFsZmxlbikKLQkJCW4gLT0gbGVuOwotCQllbHNlIGlmIChuIDwgLWhhbGZsZW4pCi0JCQluICs9IGxlbjsKLQl9CisgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAobiA+IGhhbGZsZW4gfHwgbiA8IC1oYWxmbGVuKSB7CisgICAgICAgIG4gJT0gbGVuOworICAgICAgICBpZiAobiA+IGhhbGZsZW4pCisgICAgICAgICAgICBuIC09IGxlbjsKKyAgICAgICAgZWxzZSBpZiAobiA8IC1oYWxmbGVuKQorICAgICAgICAgICAgbiArPSBsZW47CisgICAgfQogCi0JZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKLQkJaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7Ci0JCWFzc2VydCAoaXRlbSAhPSBOVUxMKTsKLQkJcnYgPSBkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAocnYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKHJ2KTsKLQl9Ci0JZm9yIChpPTAgOyBpPm4gOyBpLS0pIHsKLQkJaXRlbSA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOwotCQlhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7Ci0JCXJ2ID0gZGVxdWVfYXBwZW5kKGRlcXVlLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAocnYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKHJ2KTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7CisgICAgICAgIGFzc2VydCAoaXRlbSAhPSBOVUxMKTsKKyAgICAgICAgcnYgPSBkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9CisgICAgZm9yIChpPTAgOyBpPm4gOyBpLS0pIHsKKyAgICAgICAgaXRlbSA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOworICAgICAgICBhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7CisgICAgICAgIHJ2ID0gZGVxdWVfYXBwZW5kKGRlcXVlLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9yb3RhdGUoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IG49MTsKKyAgICBQeV9zc2l6ZV90IG49MTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cm90YXRlIiwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoX2RlcXVlX3JvdGF0ZShkZXF1ZSwgbikgPT0gMCkKLQkJUHlfUkVUVVJOX05PTkU7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpyb3RhdGUiLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChfZGVxdWVfcm90YXRlKGRlcXVlLCBuKSA9PSAwKQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHJvdGF0ZV9kb2MsCkBAIC00NDIsMzkgKzQ0MiwzOSBAQAogc3RhdGljIFB5X3NzaXplX3QKIGRlcXVlX2xlbihkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JcmV0dXJuIGRlcXVlLT5sZW47CisgICAgcmV0dXJuIGRlcXVlLT5sZW47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9yZW1vdmUoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlfc3NpemVfdCBpLCBuPWRlcXVlLT5sZW47CisgICAgUHlfc3NpemVfdCBpLCBuPWRlcXVlLT5sZW47CiAKLQlmb3IgKGk9MCA7IGk8biA7IGkrKykgewotCQlQeU9iamVjdCAqaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdmFsdWUsIFB5X0VRKTsKKyAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdmFsdWUsIFB5X0VRKTsKIAotCQlpZiAoZGVxdWUtPmxlbiAhPSBuKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkiZGVxdWUgbXV0YXRlZCBkdXJpbmcgcmVtb3ZlKCkuIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoY21wID4gMCkgewotCQkJUHlPYmplY3QgKnRndCA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOwotCQkJYXNzZXJ0ICh0Z3QgIT0gTlVMTCk7Ci0JCQlQeV9ERUNSRUYodGd0KTsKLQkJCWlmIChfZGVxdWVfcm90YXRlKGRlcXVlLCBpKSA9PSAtMSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5X1JFVFVSTl9OT05FOwotCQl9Ci0JCWVsc2UgaWYgKGNtcCA8IDApIHsKLQkJCV9kZXF1ZV9yb3RhdGUoZGVxdWUsIGkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJX2RlcXVlX3JvdGF0ZShkZXF1ZSwgLTEpOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRlcXVlLnJlbW92ZSh4KTogeCBub3QgaW4gZGVxdWUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGRlcXVlLT5sZW4gIT0gbikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIHJlbW92ZSgpLiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA+IDApIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp0Z3QgPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKKyAgICAgICAgICAgIGFzc2VydCAodGd0ICE9IE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKHRndCk7CisgICAgICAgICAgICBpZiAoX2RlcXVlX3JvdGF0ZShkZXF1ZSwgaSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjbXAgPCAwKSB7CisgICAgICAgICAgICBfZGVxdWVfcm90YXRlKGRlcXVlLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIF9kZXF1ZV9yb3RhdGUoZGVxdWUsIC0xKTsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkZXF1ZS5yZW1vdmUoeCk6IHggbm90IGluIGRlcXVlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihyZW1vdmVfZG9jLApAQCAtNDgzLDU2ICs0ODMsNTYgQEAKIHN0YXRpYyBpbnQKIGRlcXVlX2NsZWFyKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCXdoaWxlIChkZXF1ZS0+bGVuKSB7Ci0JCWl0ZW0gPSBkZXF1ZV9wb3AoZGVxdWUsIE5VTEwpOwotCQlhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9Ci0JYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2sgJiYKLQkgICAgICAgZGVxdWUtPmxlZnRpbmRleCAtIDEgPT0gZGVxdWUtPnJpZ2h0aW5kZXggJiYKLQkgICAgICAgZGVxdWUtPmxlbiA9PSAwKTsKLQlyZXR1cm4gMDsKKyAgICB3aGlsZSAoZGVxdWUtPmxlbikgeworICAgICAgICBpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKKyAgICAgICAgYXNzZXJ0IChpdGVtICE9IE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQorICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrID09IGRlcXVlLT5yaWdodGJsb2NrICYmCisgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggLSAxID09IGRlcXVlLT5yaWdodGluZGV4ICYmCisgICAgICAgICAgIGRlcXVlLT5sZW4gPT0gMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9pdGVtKGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlfc3NpemVfdCBpKQogewotCWJsb2NrICpiOwotCVB5T2JqZWN0ICppdGVtOwotCVB5X3NzaXplX3QgbiwgaW5kZXg9aTsKKyAgICBibG9jayAqYjsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IG4sIGluZGV4PWk7CiAKLQlpZiAoaSA8IDAgfHwgaSA+PSBkZXF1ZS0+bGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChpIDwgMCB8fCBpID49IGRlcXVlLT5sZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVxdWUgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChpID09IDApIHsKLQkJaSA9IGRlcXVlLT5sZWZ0aW5kZXg7Ci0JCWIgPSBkZXF1ZS0+bGVmdGJsb2NrOwotCX0gZWxzZSBpZiAoaSA9PSBkZXF1ZS0+bGVuIC0gMSkgewotCQlpID0gZGVxdWUtPnJpZ2h0aW5kZXg7Ci0JCWIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLQl9IGVsc2UgewotCQlpICs9IGRlcXVlLT5sZWZ0aW5kZXg7Ci0JCW4gPSBpIC8gQkxPQ0tMRU47Ci0JCWkgJT0gQkxPQ0tMRU47Ci0JCWlmIChpbmRleCA8IChkZXF1ZS0+bGVuID4+IDEpKSB7Ci0JCQliID0gZGVxdWUtPmxlZnRibG9jazsKLQkJCXdoaWxlIChuLS0pCi0JCQkJYiA9IGItPnJpZ2h0bGluazsKLQkJfSBlbHNlIHsKLQkJCW4gPSAoZGVxdWUtPmxlZnRpbmRleCArIGRlcXVlLT5sZW4gLSAxKSAvIEJMT0NLTEVOIC0gbjsKLQkJCWIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLQkJCXdoaWxlIChuLS0pCi0JCQkJYiA9IGItPmxlZnRsaW5rOwotCQl9Ci0JfQotCWl0ZW0gPSBiLT5kYXRhW2ldOwotCVB5X0lOQ1JFRihpdGVtKTsKLQlyZXR1cm4gaXRlbTsKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIGkgPSBkZXF1ZS0+bGVmdGluZGV4OworICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKKyAgICB9IGVsc2UgaWYgKGkgPT0gZGVxdWUtPmxlbiAtIDEpIHsKKyAgICAgICAgaSA9IGRlcXVlLT5yaWdodGluZGV4OworICAgICAgICBiID0gZGVxdWUtPnJpZ2h0YmxvY2s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaSArPSBkZXF1ZS0+bGVmdGluZGV4OworICAgICAgICBuID0gaSAvIEJMT0NLTEVOOworICAgICAgICBpICU9IEJMT0NLTEVOOworICAgICAgICBpZiAoaW5kZXggPCAoZGVxdWUtPmxlbiA+PiAxKSkgeworICAgICAgICAgICAgYiA9IGRlcXVlLT5sZWZ0YmxvY2s7CisgICAgICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuID0gKGRlcXVlLT5sZWZ0aW5kZXggKyBkZXF1ZS0+bGVuIC0gMSkgLyBCTE9DS0xFTiAtIG47CisgICAgICAgICAgICBiID0gZGVxdWUtPnJpZ2h0YmxvY2s7CisgICAgICAgICAgICB3aGlsZSAobi0tKQorICAgICAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpdGVtID0gYi0+ZGF0YVtpXTsKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgcmV0dXJuIGl0ZW07CiB9CiAKIC8qIGRlbGl0ZW0oKSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiByb3RhdGUgZm9yIHNpbXBsaWNpdHkgYW5kIHJlYXNvbmFibGUKQEAgLTU0NSw2MiArNTQ1LDYyIEBACiBzdGF0aWMgaW50CiBkZXF1ZV9kZWxfaXRlbShkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgaSkKIHsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCWFzc2VydCAoaSA+PSAwICYmIGkgPCBkZXF1ZS0+bGVuKTsKLQlpZiAoX2RlcXVlX3JvdGF0ZShkZXF1ZSwgLWkpID09IC0xKQotCQlyZXR1cm4gLTE7CisgICAgYXNzZXJ0IChpID49IDAgJiYgaSA8IGRlcXVlLT5sZW4pOworICAgIGlmIChfZGVxdWVfcm90YXRlKGRlcXVlLCAtaSkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKIAotCWl0ZW0gPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKLQlhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7Ci0JUHlfREVDUkVGKGl0ZW0pOworICAgIGl0ZW0gPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKKyAgICBhc3NlcnQgKGl0ZW0gIT0gTlVMTCk7CisgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JcmV0dXJuIF9kZXF1ZV9yb3RhdGUoZGVxdWUsIGkpOworICAgIHJldHVybiBfZGVxdWVfcm90YXRlKGRlcXVlLCBpKTsKIH0KIAogc3RhdGljIGludAogZGVxdWVfYXNzX2l0ZW0oZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpvbGRfdmFsdWU7Ci0JYmxvY2sgKmI7Ci0JUHlfc3NpemVfdCBuLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xLCBpbmRleD1pOworICAgIFB5T2JqZWN0ICpvbGRfdmFsdWU7CisgICAgYmxvY2sgKmI7CisgICAgUHlfc3NpemVfdCBuLCBsZW49ZGVxdWUtPmxlbiwgaGFsZmxlbj0obGVuKzEpPj4xLCBpbmRleD1pOwogCi0JaWYgKGkgPCAwIHx8IGkgPj0gbGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gZGVxdWVfZGVsX2l0ZW0oZGVxdWUsIGkpOworICAgIGlmIChpIDwgMCB8fCBpID49IGxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXF1ZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZGVxdWVfZGVsX2l0ZW0oZGVxdWUsIGkpOwogCi0JaSArPSBkZXF1ZS0+bGVmdGluZGV4OwotCW4gPSBpIC8gQkxPQ0tMRU47Ci0JaSAlPSBCTE9DS0xFTjsKLQlpZiAoaW5kZXggPD0gaGFsZmxlbikgewotCQliID0gZGVxdWUtPmxlZnRibG9jazsKLQkJd2hpbGUgKG4tLSkKLQkJCWIgPSBiLT5yaWdodGxpbms7Ci0JfSBlbHNlIHsKLQkJbiA9IChkZXF1ZS0+bGVmdGluZGV4ICsgbGVuIC0gMSkgLyBCTE9DS0xFTiAtIG47Ci0JCWIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLQkJd2hpbGUgKG4tLSkKLQkJCWIgPSBiLT5sZWZ0bGluazsKLQl9Ci0JUHlfSU5DUkVGKHYpOwotCW9sZF92YWx1ZSA9IGItPmRhdGFbaV07Ci0JYi0+ZGF0YVtpXSA9IHY7Ci0JUHlfREVDUkVGKG9sZF92YWx1ZSk7Ci0JcmV0dXJuIDA7CisgICAgaSArPSBkZXF1ZS0+bGVmdGluZGV4OworICAgIG4gPSBpIC8gQkxPQ0tMRU47CisgICAgaSAlPSBCTE9DS0xFTjsKKyAgICBpZiAoaW5kZXggPD0gaGFsZmxlbikgeworICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKKyAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbiA9IChkZXF1ZS0+bGVmdGluZGV4ICsgbGVuIC0gMSkgLyBCTE9DS0xFTiAtIG47CisgICAgICAgIGIgPSBkZXF1ZS0+cmlnaHRibG9jazsKKyAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKKyAgICB9CisgICAgUHlfSU5DUkVGKHYpOworICAgIG9sZF92YWx1ZSA9IGItPmRhdGFbaV07CisgICAgYi0+ZGF0YVtpXSA9IHY7CisgICAgUHlfREVDUkVGKG9sZF92YWx1ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9jbGVhcm1ldGhvZChkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JaW50IHJ2OworICAgIGludCBydjsKIAotCXJ2ID0gZGVxdWVfY2xlYXIoZGVxdWUpOwotCWFzc2VydCAocnYgIT0gLTEpOwotCVB5X1JFVFVSTl9OT05FOworICAgIHJ2ID0gZGVxdWVfY2xlYXIoZGVxdWUpOworICAgIGFzc2VydCAocnYgIT0gLTEpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoY2xlYXJfZG9jLCAiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkZXF1ZS4iKTsKQEAgLTYwOCw0OSArNjA4LDQ5IEBACiBzdGF0aWMgdm9pZAogZGVxdWVfZGVhbGxvYyhkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhkZXF1ZSk7Ci0JaWYgKGRlcXVlLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBkZXF1ZSk7Ci0JaWYgKGRlcXVlLT5sZWZ0YmxvY2sgIT0gTlVMTCkgewotCQlkZXF1ZV9jbGVhcihkZXF1ZSk7Ci0JCWFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IE5VTEwpOwotCQlmcmVlYmxvY2soZGVxdWUtPmxlZnRibG9jayk7Ci0JfQotCWRlcXVlLT5sZWZ0YmxvY2sgPSBOVUxMOwotCWRlcXVlLT5yaWdodGJsb2NrID0gTlVMTDsKLQlQeV9UWVBFKGRlcXVlKS0+dHBfZnJlZShkZXF1ZSk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhkZXF1ZSk7CisgICAgaWYgKGRlcXVlLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBkZXF1ZSk7CisgICAgaWYgKGRlcXVlLT5sZWZ0YmxvY2sgIT0gTlVMTCkgeworICAgICAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7CisgICAgICAgIGFzc2VydChkZXF1ZS0+bGVmdGJsb2NrICE9IE5VTEwpOworICAgICAgICBmcmVlYmxvY2soZGVxdWUtPmxlZnRibG9jayk7CisgICAgfQorICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBOVUxMOworICAgIGRlcXVlLT5yaWdodGJsb2NrID0gTlVMTDsKKyAgICBQeV9UWVBFKGRlcXVlKS0+dHBfZnJlZShkZXF1ZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGRlcXVlX3RyYXZlcnNlKGRlcXVlb2JqZWN0ICpkZXF1ZSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JYmxvY2sgKmI7Ci0JUHlPYmplY3QgKml0ZW07Ci0JUHlfc3NpemVfdCBpbmRleDsKLQlQeV9zc2l6ZV90IGluZGV4bG8gPSBkZXF1ZS0+bGVmdGluZGV4OworICAgIGJsb2NrICpiOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5X3NzaXplX3QgaW5kZXg7CisgICAgUHlfc3NpemVfdCBpbmRleGxvID0gZGVxdWUtPmxlZnRpbmRleDsKIAotCWZvciAoYiA9IGRlcXVlLT5sZWZ0YmxvY2s7IGIgIT0gTlVMTDsgYiA9IGItPnJpZ2h0bGluaykgewotCQljb25zdCBQeV9zc2l6ZV90IGluZGV4aGkgPSBiID09IGRlcXVlLT5yaWdodGJsb2NrID8KLQkJCQkJIGRlcXVlLT5yaWdodGluZGV4IDoKLQkJCQkgICAgCSBCTE9DS0xFTiAtIDE7CisgICAgZm9yIChiID0gZGVxdWUtPmxlZnRibG9jazsgYiAhPSBOVUxMOyBiID0gYi0+cmlnaHRsaW5rKSB7CisgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgaW5kZXhoaSA9IGIgPT0gZGVxdWUtPnJpZ2h0YmxvY2sgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggOgorICAgICAgICAgICAgICAgICAgICAgQkxPQ0tMRU4gLSAxOwogCi0JCWZvciAoaW5kZXggPSBpbmRleGxvOyBpbmRleCA8PSBpbmRleGhpOyArK2luZGV4KSB7Ci0JCQlpdGVtID0gYi0+ZGF0YVtpbmRleF07Ci0JCQlQeV9WSVNJVChpdGVtKTsKLQkJfQotCQlpbmRleGxvID0gMDsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGZvciAoaW5kZXggPSBpbmRleGxvOyBpbmRleCA8PSBpbmRleGhpOyArK2luZGV4KSB7CisgICAgICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CisgICAgICAgICAgICBQeV9WSVNJVChpdGVtKTsKKyAgICAgICAgfQorICAgICAgICBpbmRleGxvID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9jb3B5KFB5T2JqZWN0ICpkZXF1ZSkKIHsKLQlpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQotCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPIiwgZGVxdWUsIE5VTEwpOwotCWVsc2UKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiT2kiLAotCQkJZGVxdWUsICgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiwgTlVMTCk7CisgICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiTyIsIGRlcXVlLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk9pIiwKKyAgICAgICAgICAgIGRlcXVlLCAoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4sIE5VTEwpOwogfQogCiBQeURvY19TVFJWQVIoY29weV9kb2MsICJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS4iKTsKQEAgLTY1OCwzMCArNjU4LDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmVkdWNlKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLQlQeU9iamVjdCAqZGljdCwgKnJlc3VsdCwgKmFzbGlzdDsKKyAgICBQeU9iamVjdCAqZGljdCwgKnJlc3VsdCwgKmFzbGlzdDsKIAotCWRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKWRlcXVlLCAiX19kaWN0X18iKTsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOwotCWFzbGlzdCA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilkZXF1ZSk7Ci0JaWYgKGFzbGlzdCA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYoZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCWlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotCQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPKSIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9uKSIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4pOwotCX0gZWxzZSB7Ci0JCWlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotCQkJcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPTylPIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgUHlfTm9uZSwgZGljdCk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT24pTyIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4sIGRpY3QpOwotCX0KLQlQeV9YREVDUkVGKGRpY3QpOwotCVB5X0RFQ1JFRihhc2xpc3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopZGVxdWUsICJfX2RpY3RfXyIpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgYXNsaXN0ID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKWRlcXVlKTsKKyAgICBpZiAoYXNsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCisgICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE8pIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT24pIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgZGVxdWUtPm1heGxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCisgICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9PKU8iLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0LCBQeV9Ob25lLCBkaWN0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPbilPIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgZGVxdWUtPm1heGxlbiwgZGljdCk7CisgICAgfQorICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgUHlfREVDUkVGKGFzbGlzdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHJlZHVjZV9kb2MsICJSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLiIpOwpAQCAtNjg5LDIxMCArNjg5LDIxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX3JlcHIoUHlPYmplY3QgKmRlcXVlKQogewotCVB5T2JqZWN0ICphc2xpc3QsICpyZXN1bHQsICpmbXQ7Ci0JaW50IGk7CisgICAgUHlPYmplY3QgKmFzbGlzdCwgKnJlc3VsdCwgKmZtdDsKKyAgICBpbnQgaTsKIAotCWkgPSBQeV9SZXByRW50ZXIoZGVxdWUpOwotCWlmIChpICE9IDApIHsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJbLi4uXSIpOwotCX0KKyAgICBpID0gUHlfUmVwckVudGVyKGRlcXVlKTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiWy4uLl0iKTsKKyAgICB9CiAKLQlhc2xpc3QgPSBQeVNlcXVlbmNlX0xpc3QoZGVxdWUpOwotCWlmIChhc2xpc3QgPT0gTlVMTCkgewotCQlQeV9SZXByTGVhdmUoZGVxdWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiAhPSAtMSkKLQkJZm10ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiZGVxdWUoJSVyLCBtYXhsZW49JXpkKSIsIAotCQkJCQkoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4pOwotCWVsc2UKLQkJZm10ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiZGVxdWUoJXIpIik7ICAKLQlpZiAoZm10ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGFzbGlzdCk7Ci0JCVB5X1JlcHJMZWF2ZShkZXF1ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHQgPSBQeVN0cmluZ19Gb3JtYXQoZm10LCBhc2xpc3QpOwotCVB5X0RFQ1JFRihmbXQpOwotCVB5X0RFQ1JFRihhc2xpc3QpOwotCVB5X1JlcHJMZWF2ZShkZXF1ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBhc2xpc3QgPSBQeVNlcXVlbmNlX0xpc3QoZGVxdWUpOworICAgIGlmIChhc2xpc3QgPT0gTlVMTCkgeworICAgICAgICBQeV9SZXByTGVhdmUoZGVxdWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiAhPSAtMSkKKyAgICAgICAgZm10ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiZGVxdWUoJSVyLCBtYXhsZW49JXpkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbik7CisgICAgZWxzZQorICAgICAgICBmbXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJkZXF1ZSglcikiKTsKKyAgICBpZiAoZm10ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGFzbGlzdCk7CisgICAgICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gb3JtYXQoZm10LCBhc2xpc3QpOworICAgIFB5X0RFQ1JFRihmbXQpOworICAgIFB5X0RFQ1JFRihhc2xpc3QpOworICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludAogZGVxdWVfdHBfcHJpbnQoUHlPYmplY3QgKmRlcXVlLCBGSUxFICpmcCwgaW50IGZsYWdzKQogewotCVB5T2JqZWN0ICppdCwgKml0ZW07Ci0JY2hhciAqZW1pdCA9ICIiOwkvKiBObyBzZXBhcmF0b3IgZW1pdHRlZCBvbiBmaXJzdCBwYXNzICovCi0JY2hhciAqc2VwYXJhdG9yID0gIiwgIjsKLQlpbnQgaTsKKyAgICBQeU9iamVjdCAqaXQsICppdGVtOworICAgIGNoYXIgKmVtaXQgPSAiIjsgICAgICAgICAgICAvKiBObyBzZXBhcmF0b3IgZW1pdHRlZCBvbiBmaXJzdCBwYXNzICovCisgICAgY2hhciAqc2VwYXJhdG9yID0gIiwgIjsKKyAgICBpbnQgaTsKIAotCWkgPSBQeV9SZXByRW50ZXIoZGVxdWUpOwotCWlmIChpICE9IDApIHsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuIGk7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnB1dHMoIlsuLi5dIiwgZnApOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlyZXR1cm4gMDsKLQl9CisgICAgaSA9IFB5X1JlcHJFbnRlcihkZXF1ZSk7CisgICAgaWYgKGkgIT0gMCkgeworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHV0cygiWy4uLl0iLCBmcCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihkZXF1ZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoZGVxdWUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnB1dHMoImRlcXVlKFsiLCBmcCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmcHV0cyhlbWl0LCBmcCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWVtaXQgPSBzZXBhcmF0b3I7Ci0JCWlmIChQeU9iamVjdF9QcmludChpdGVtLCBmcCwgMCkgIT0gMCkgewotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X1JlcHJMZWF2ZShkZXF1ZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KLQlQeV9SZXByTGVhdmUoZGVxdWUpOwotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnB1dHMoImRlcXVlKFsiLCBmcCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHV0cyhlbWl0LCBmcCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGVtaXQgPSBzZXBhcmF0b3I7CisgICAgICAgIGlmIChQeU9iamVjdF9QcmludChpdGVtLCBmcCwgMCkgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICBQeV9SZXByTGVhdmUoZGVxdWUpOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQotCQlmcHV0cygiXSkiLCBmcCk7Ci0JZWxzZQotCQlmcHJpbnRmKGZwLCAiXSwgbWF4bGVuPSUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpIiwgKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiAwOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID09IC0xKQorICAgICAgICBmcHV0cygiXSkiLCBmcCk7CisgICAgZWxzZQorICAgICAgICBmcHJpbnRmKGZwLCAiXSwgbWF4bGVuPSUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpIiwgKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmljaGNvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JUHlPYmplY3QgKml0MT1OVUxMLCAqaXQyPU5VTEwsICp4LCAqeTsKLQlQeV9zc2l6ZV90IHZzLCB3czsKLQlpbnQgYiwgY21wPS0xOworICAgIFB5T2JqZWN0ICppdDE9TlVMTCwgKml0Mj1OVUxMLCAqeCwgKnk7CisgICAgUHlfc3NpemVfdCB2cywgd3M7CisgICAgaW50IGIsIGNtcD0tMTsKIAotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKHYsICZkZXF1ZV90eXBlKSB8fAotCSAgICAhUHlPYmplY3RfVHlwZUNoZWNrKHcsICZkZXF1ZV90eXBlKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHYsICZkZXF1ZV90eXBlKSB8fAorICAgICAgICAhUHlPYmplY3RfVHlwZUNoZWNrKHcsICZkZXF1ZV90eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JLyogU2hvcnRjdXRzICovCi0JdnMgPSAoKGRlcXVlb2JqZWN0ICopdiktPmxlbjsKLQl3cyA9ICgoZGVxdWVvYmplY3QgKil3KS0+bGVuOwotCWlmIChvcCA9PSBQeV9FUSkgewotCQlpZiAodiA9PSB3KQotCQkJUHlfUkVUVVJOX1RSVUU7Ci0JCWlmICh2cyAhPSB3cykKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQl9Ci0JaWYgKG9wID09IFB5X05FKSB7Ci0JCWlmICh2ID09IHcpCi0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCWlmICh2cyAhPSB3cykKLQkJCVB5X1JFVFVSTl9UUlVFOwotCX0KKyAgICAvKiBTaG9ydGN1dHMgKi8KKyAgICB2cyA9ICgoZGVxdWVvYmplY3QgKil2KS0+bGVuOworICAgIHdzID0gKChkZXF1ZW9iamVjdCAqKXcpLT5sZW47CisgICAgaWYgKG9wID09IFB5X0VRKSB7CisgICAgICAgIGlmICh2ID09IHcpCisgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgaWYgKHZzICE9IHdzKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgICBpZiAob3AgPT0gUHlfTkUpIHsKKyAgICAgICAgaWYgKHYgPT0gdykKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgaWYgKHZzICE9IHdzKQorICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfQogCi0JLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgaW5kZXggd2hlcmUgaXRlbXMgYXJlIGRpZmZlcmVudCAqLwotCWl0MSA9IFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JaWYgKGl0MSA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0JaXQyID0gUHlPYmplY3RfR2V0SXRlcih3KTsKLQlpZiAoaXQyID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKLQlmb3IgKDs7KSB7Ci0JCXggPSBQeUl0ZXJfTmV4dChpdDEpOwotCQlpZiAoeCA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlnb3RvIGRvbmU7Ci0JCXkgPSBQeUl0ZXJfTmV4dChpdDIpOwotCQlpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQliID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHgsIHksIFB5X0VRKTsKLQkJaWYgKGIgPT0gMCkgewotCQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHgsIHksIG9wKTsKLQkJCVB5X0RFQ1JFRih4KTsKLQkJCVB5X0RFQ1JFRih5KTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlQeV9ERUNSRUYoeCk7Ci0JCVB5X0RFQ1JFRih5KTsKLQkJaWYgKGIgPT0gLTEpCi0JCQlnb3RvIGRvbmU7Ci0JfQotCS8qIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiBvbmUgZGVxdWUgb3IgYm90aCAqLwotCVB5X1hERUNSRUYoeCk7Ci0JUHlfWERFQ1JFRih5KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBkb25lOwotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5X0xUOiBjbXAgPSB5ICE9IE5VTEw7IGJyZWFrOyAgLyogaWYgdyB3YXMgbG9uZ2VyICovCi0JY2FzZSBQeV9MRTogY21wID0geCA9PSBOVUxMOyBicmVhazsgIC8qIGlmIHYgd2FzIG5vdCBsb25nZXIgKi8KLQljYXNlIFB5X0VROiBjbXAgPSB4ID09IHk7ICAgIGJyZWFrOyAgLyogaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIGJvdGggKi8KLQljYXNlIFB5X05FOiBjbXAgPSB4ICE9IHk7ICAgIGJyZWFrOyAgLyogaWYgb25lIGRlcXVlIGNvbnRpbnVlcyAqLwotCWNhc2UgUHlfR1Q6IGNtcCA9IHggIT0gTlVMTDsgYnJlYWs7ICAvKiBpZiB2IHdhcyBsb25nZXIgKi8KLQljYXNlIFB5X0dFOiBjbXAgPSB5ID09IE5VTEw7IGJyZWFrOyAgLyogaWYgdyB3YXMgbm90IGxvbmdlciAqLwotCX0KKyAgICAvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBpdGVtcyBhcmUgZGlmZmVyZW50ICovCisgICAgaXQxID0gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICBpZiAoaXQxID09IE5VTEwpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBpdDIgPSBQeU9iamVjdF9HZXRJdGVyKHcpOworICAgIGlmIChpdDIgPT0gTlVMTCkKKyAgICAgICAgZ290byBkb25lOworICAgIGZvciAoOzspIHsKKyAgICAgICAgeCA9IFB5SXRlcl9OZXh0KGl0MSk7CisgICAgICAgIGlmICh4ID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgeSA9IFB5SXRlcl9OZXh0KGl0Mik7CisgICAgICAgIGlmICh4ID09IE5VTEwgfHwgeSA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGIgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgUHlfRVEpOworICAgICAgICBpZiAoYiA9PSAwKSB7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgb3ApOworICAgICAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICAgICAgUHlfREVDUkVGKHkpOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgUHlfREVDUkVGKHkpOworICAgICAgICBpZiAoYiA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgLyogV2UgcmVhY2hlZCB0aGUgZW5kIG9mIG9uZSBkZXF1ZSBvciBib3RoICovCisgICAgUHlfWERFQ1JFRih4KTsKKyAgICBQeV9YREVDUkVGKHkpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlfTFQ6IGNtcCA9IHkgIT0gTlVMTDsgYnJlYWs7ICAvKiBpZiB3IHdhcyBsb25nZXIgKi8KKyAgICBjYXNlIFB5X0xFOiBjbXAgPSB4ID09IE5VTEw7IGJyZWFrOyAgLyogaWYgdiB3YXMgbm90IGxvbmdlciAqLworICAgIGNhc2UgUHlfRVE6IGNtcCA9IHggPT0geTsgICAgYnJlYWs7ICAvKiBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgYm90aCAqLworICAgIGNhc2UgUHlfTkU6IGNtcCA9IHggIT0geTsgICAgYnJlYWs7ICAvKiBpZiBvbmUgZGVxdWUgY29udGludWVzICovCisgICAgY2FzZSBQeV9HVDogY21wID0geCAhPSBOVUxMOyBicmVhazsgIC8qIGlmIHYgd2FzIGxvbmdlciAqLworICAgIGNhc2UgUHlfR0U6IGNtcCA9IHkgPT0gTlVMTDsgYnJlYWs7ICAvKiBpZiB3IHdhcyBub3QgbG9uZ2VyICovCisgICAgfQogCiBkb25lOgotCVB5X1hERUNSRUYoaXQxKTsKLQlQeV9YREVDUkVGKGl0Mik7Ci0JaWYgKGNtcCA9PSAxKQotCQlQeV9SRVRVUk5fVFJVRTsKLQlpZiAoY21wID09IDApCi0JCVB5X1JFVFVSTl9GQUxTRTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGl0MSk7CisgICAgUHlfWERFQ1JFRihpdDIpOworICAgIGlmIChjbXAgPT0gMSkKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgaWYgKGNtcCA9PSAwKQorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGRlcXVlX2luaXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZGFyZ3MpCiB7Ci0JUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKLQlQeU9iamVjdCAqbWF4bGVub2JqID0gTlVMTDsKLQlQeV9zc2l6ZV90IG1heGxlbiA9IC0xOwotCWNoYXIgKmt3bGlzdFtdID0geyJpdGVyYWJsZSIsICJtYXhsZW4iLCAwfTsKKyAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICptYXhsZW5vYmogPSBOVUxMOworICAgIFB5X3NzaXplX3QgbWF4bGVuID0gLTE7CisgICAgY2hhciAqa3dsaXN0W10gPSB7Iml0ZXJhYmxlIiwgIm1heGxlbiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkYXJncywgInxPTzpkZXF1ZSIsIGt3bGlzdCwgJml0ZXJhYmxlLCAmbWF4bGVub2JqKSkKLQkJcmV0dXJuIC0xOwotCWlmIChtYXhsZW5vYmogIT0gTlVMTCAmJiBtYXhsZW5vYmogIT0gUHlfTm9uZSkgewotCQltYXhsZW4gPSBQeUludF9Bc1NzaXplX3QobWF4bGVub2JqKTsKLQkJaWYgKG1heGxlbiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAobWF4bGVuIDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtYXhsZW4gbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlkZXF1ZS0+bWF4bGVuID0gbWF4bGVuOwotCWRlcXVlX2NsZWFyKGRlcXVlKTsKLQlpZiAoaXRlcmFibGUgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcnYgPSBkZXF1ZV9leHRlbmQoZGVxdWUsIGl0ZXJhYmxlKTsKLQkJaWYgKHJ2ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfQotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGFyZ3MsICJ8T086ZGVxdWUiLCBrd2xpc3QsICZpdGVyYWJsZSwgJm1heGxlbm9iaikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobWF4bGVub2JqICE9IE5VTEwgJiYgbWF4bGVub2JqICE9IFB5X05vbmUpIHsKKyAgICAgICAgbWF4bGVuID0gUHlJbnRfQXNTc2l6ZV90KG1heGxlbm9iaik7CisgICAgICAgIGlmIChtYXhsZW4gPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKG1heGxlbiA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF4bGVuIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZGVxdWUtPm1heGxlbiA9IG1heGxlbjsKKyAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7CisgICAgaWYgKGl0ZXJhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnJ2ID0gZGVxdWVfZXh0ZW5kKGRlcXVlLCBpdGVyYWJsZSk7CisgICAgICAgIGlmIChydiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGRlcXVlX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKWRlcXVlX2xlbiwJCS8qIHNxX2xlbmd0aCAqLwotCTAsCQkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJCS8qIHNxX3JlcGVhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpZGVxdWVfaXRlbSwJLyogc3FfaXRlbSAqLwotCTAsCQkJCS8qIHNxX3NsaWNlICovCi0JKHNzaXplb2JqYXJncHJvYylkZXF1ZV9hc3NfaXRlbSwJLyogc3FfYXNzX2l0ZW0gKi8KLQkwLAkJCQkvKiBzcV9hc3Nfc2xpY2UgKi8KLQkwLAkJCQkvKiBzcV9jb250YWlucyAqLwotCShiaW5hcnlmdW5jKWRlcXVlX2lucGxhY2VfY29uY2F0LAkvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLwotCTAsCQkJCS8qIHNxX2lucGxhY2VfcmVwZWF0ICovCisgICAgKGxlbmZ1bmMpZGVxdWVfbGVuLCAgICAgICAgICAgICAgICAgLyogc3FfbGVuZ3RoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgKHNzaXplYXJnZnVuYylkZXF1ZV9pdGVtLCAgICAgICAgICAgLyogc3FfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgKHNzaXplb2JqYXJncHJvYylkZXF1ZV9hc3NfaXRlbSwgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbnRhaW5zICovCisgICAgKGJpbmFyeWZ1bmMpZGVxdWVfaW5wbGFjZV9jb25jYXQsICAgICAgICAgICAvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfcmVwZWF0ICovCiAKIH07CiAKQEAgLTkwMSwzNCArOTAxLDM0IEBACiBzdGF0aWMgUHlPYmplY3QgKmRlcXVlX2l0ZXIoZGVxdWVvYmplY3QgKmRlcXVlKTsKIHN0YXRpYyBQeU9iamVjdCAqZGVxdWVfcmV2aXRlcihkZXF1ZW9iamVjdCAqZGVxdWUpOwogUHlEb2NfU1RSVkFSKHJldmVyc2VkX2RvYywKLQkiRC5fX3JldmVyc2VkX18oKSAtLSByZXR1cm4gYSByZXZlcnNlIGl0ZXJhdG9yIG92ZXIgdGhlIGRlcXVlIik7CisgICAgIkQuX19yZXZlcnNlZF9fKCkgLS0gcmV0dXJuIGEgcmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSBkZXF1ZSIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgZGVxdWVfbWV0aG9kc1tdID0gewotCXsiYXBwZW5kIiwJCShQeUNGdW5jdGlvbilkZXF1ZV9hcHBlbmQsCi0JCU1FVEhfTywJCSBhcHBlbmRfZG9jfSwKLQl7ImFwcGVuZGxlZnQiLAkJKFB5Q0Z1bmN0aW9uKWRlcXVlX2FwcGVuZGxlZnQsCi0JCU1FVEhfTywJCSBhcHBlbmRsZWZ0X2RvY30sCi0JeyJjbGVhciIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfY2xlYXJtZXRob2QsCi0JCU1FVEhfTk9BUkdTLAkgY2xlYXJfZG9jfSwKLQl7Il9fY29weV9fIiwJCShQeUNGdW5jdGlvbilkZXF1ZV9jb3B5LAotCQlNRVRIX05PQVJHUywJIGNvcHlfZG9jfSwKLQl7ImV4dGVuZCIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfZXh0ZW5kLAotCQlNRVRIX08sCQkgZXh0ZW5kX2RvY30sCi0JeyJleHRlbmRsZWZ0IiwJCShQeUNGdW5jdGlvbilkZXF1ZV9leHRlbmRsZWZ0LAotCQlNRVRIX08sCQkgZXh0ZW5kbGVmdF9kb2N9LAotCXsicG9wIiwJCQkoUHlDRnVuY3Rpb24pZGVxdWVfcG9wLAotCQlNRVRIX05PQVJHUywJIHBvcF9kb2N9LAotCXsicG9wbGVmdCIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfcG9wbGVmdCwKLQkJTUVUSF9OT0FSR1MsCSBwb3BsZWZ0X2RvY30sCi0JeyJfX3JlZHVjZV9fIiwJKFB5Q0Z1bmN0aW9uKWRlcXVlX3JlZHVjZSwKLQkJTUVUSF9OT0FSR1MsCSByZWR1Y2VfZG9jfSwKLQl7InJlbW92ZSIsCQkoUHlDRnVuY3Rpb24pZGVxdWVfcmVtb3ZlLAotCQlNRVRIX08sCQkgcmVtb3ZlX2RvY30sCi0JeyJfX3JldmVyc2VkX18iLAkoUHlDRnVuY3Rpb24pZGVxdWVfcmV2aXRlciwKLQkJTUVUSF9OT0FSR1MsCSByZXZlcnNlZF9kb2N9LAotCXsicm90YXRlIiwJCShQeUNGdW5jdGlvbilkZXF1ZV9yb3RhdGUsCi0JCU1FVEhfVkFSQVJHUywJcm90YXRlX2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiYXBwZW5kIiwgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfYXBwZW5kLAorICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICAgYXBwZW5kX2RvY30sCisgICAgeyJhcHBlbmRsZWZ0IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9hcHBlbmRsZWZ0LAorICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICAgYXBwZW5kbGVmdF9kb2N9LAorICAgIHsiY2xlYXIiLCAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfY2xlYXJtZXRob2QsCisgICAgICAgIE1FVEhfTk9BUkdTLCAgICAgICAgICAgICBjbGVhcl9kb2N9LAorICAgIHsiX19jb3B5X18iLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfY29weSwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIGNvcHlfZG9jfSwKKyAgICB7ImV4dGVuZCIsICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlcXVlX2V4dGVuZCwKKyAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgIGV4dGVuZF9kb2N9LAorICAgIHsiZXh0ZW5kbGVmdCIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfZXh0ZW5kbGVmdCwKKyAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgIGV4dGVuZGxlZnRfZG9jfSwKKyAgICB7InBvcCIsICAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlcXVlX3BvcCwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIHBvcF9kb2N9LAorICAgIHsicG9wbGVmdCIsICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfcG9wbGVmdCwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIHBvcGxlZnRfZG9jfSwKKyAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9yZWR1Y2UsCisgICAgICAgIE1FVEhfTk9BUkdTLCAgICAgICAgICAgICByZWR1Y2VfZG9jfSwKKyAgICB7InJlbW92ZSIsICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlcXVlX3JlbW92ZSwKKyAgICAgICAgTUVUSF9PLCAgICAgICAgICAgICAgICAgIHJlbW92ZV9kb2N9LAorICAgIHsiX19yZXZlcnNlZF9fIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVxdWVfcmV2aXRlciwKKyAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgIHJldmVyc2VkX2RvY30sCisgICAgeyJyb3RhdGUiLCAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkZXF1ZV9yb3RhdGUsCisgICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIHJvdGF0ZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKGRlcXVlX2RvYywKQEAgLTkzNyw1OCArOTM3LDU4IEBACiBCdWlsZCBhbiBvcmRlcmVkIGNvbGxlY3Rpb24gYWNjZXNzaWJsZSBmcm9tIGVuZHBvaW50cyBvbmx5LiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRlcXVlX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImNvbGxlY3Rpb25zLmRlcXVlIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGVxdWVvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGVxdWVfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCWRlcXVlX3RwX3ByaW50LAkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JZGVxdWVfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJmRlcXVlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKVB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsCS8qIHRwX2ZsYWdzICovCi0JZGVxdWVfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZGVxdWVfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpZGVxdWVfY2xlYXIsCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylkZXF1ZV9yaWNoY29tcGFyZSwJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihkZXF1ZW9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCovCi0JKGdldGl0ZXJmdW5jKWRlcXVlX2l0ZXIsCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWRlcXVlX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpZGVxdWVfaW5pdCwJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJLyogdHBfYWxsb2MgKi8KLQlkZXF1ZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJjb2xsZWN0aW9ucy5kZXF1ZSIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZGVxdWVvYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilkZXF1ZV9kZWFsbG9jLCAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgZGVxdWVfdHBfcHJpbnQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICBkZXF1ZV9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJmRlcXVlX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKVB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZGVxdWVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkZXF1ZV90cmF2ZXJzZSwgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlkZXF1ZV9jbGVhciwgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYylkZXF1ZV9yaWNoY29tcGFyZSwgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoZGVxdWVvYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCovCisgICAgKGdldGl0ZXJmdW5jKWRlcXVlX2l0ZXIsICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGVxdWVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2MpZGVxdWVfaW5pdCwgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkZXF1ZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKiogRGVxdWUgSXRlcmF0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdCBpbmRleDsKLQlibG9jayAqYjsKLQlkZXF1ZW9iamVjdCAqZGVxdWU7Ci0JbG9uZyBzdGF0ZTsJLyogc3RhdGUgd2hlbiB0aGUgaXRlcmF0b3IgaXMgY3JlYXRlZCAqLwotCVB5X3NzaXplX3QgY291bnRlcjsgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHJlbWFpbmluZyBmb3IgaXRlcmF0aW9uICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgaW5kZXg7CisgICAgYmxvY2sgKmI7CisgICAgZGVxdWVvYmplY3QgKmRlcXVlOworICAgIGxvbmcgc3RhdGU7ICAgICAgICAgLyogc3RhdGUgd2hlbiB0aGUgaXRlcmF0b3IgaXMgY3JlYXRlZCAqLworICAgIFB5X3NzaXplX3QgY291bnRlcjsgICAgLyogbnVtYmVyIG9mIGl0ZW1zIHJlbWFpbmluZyBmb3IgaXRlcmF0aW9uICovCiB9IGRlcXVlaXRlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBkZXF1ZWl0ZXJfdHlwZTsKQEAgLTk5NiwxMDcgKzk5NiwxMDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9pdGVyKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLQlkZXF1ZWl0ZXJvYmplY3QgKml0OworICAgIGRlcXVlaXRlcm9iamVjdCAqaXQ7CiAKLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhkZXF1ZWl0ZXJvYmplY3QsICZkZXF1ZWl0ZXJfdHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0LT5iID0gZGVxdWUtPmxlZnRibG9jazsKLQlpdC0+aW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwotCVB5X0lOQ1JFRihkZXF1ZSk7Ci0JaXQtPmRlcXVlID0gZGVxdWU7Ci0JaXQtPnN0YXRlID0gZGVxdWUtPnN0YXRlOwotCWl0LT5jb3VudGVyID0gZGVxdWUtPmxlbjsKLQlQeU9iamVjdF9HQ19UcmFjayhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGRlcXVlaXRlcm9iamVjdCwgJmRlcXVlaXRlcl90eXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPmIgPSBkZXF1ZS0+bGVmdGJsb2NrOworICAgIGl0LT5pbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CisgICAgUHlfSU5DUkVGKGRlcXVlKTsKKyAgICBpdC0+ZGVxdWUgPSBkZXF1ZTsKKyAgICBpdC0+c3RhdGUgPSBkZXF1ZS0+c3RhdGU7CisgICAgaXQtPmNvdW50ZXIgPSBkZXF1ZS0+bGVuOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKGl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBpbnQKIGRlcXVlaXRlcl90cmF2ZXJzZShkZXF1ZWl0ZXJvYmplY3QgKmRpbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoZGlvLT5kZXF1ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoZGlvLT5kZXF1ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBkZXF1ZWl0ZXJfZGVhbGxvYyhkZXF1ZWl0ZXJvYmplY3QgKmRpbykKIHsKLQlQeV9YREVDUkVGKGRpby0+ZGVxdWUpOwotCVB5T2JqZWN0X0dDX0RlbChkaW8pOworICAgIFB5X1hERUNSRUYoZGlvLT5kZXF1ZSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGRpbyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZWl0ZXJfbmV4dChkZXF1ZWl0ZXJvYmplY3QgKml0KQogewotCVB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICppdGVtOwogCi0JaWYgKGl0LT5kZXF1ZS0+c3RhdGUgIT0gaXQtPnN0YXRlKSB7Ci0JCWl0LT5jb3VudGVyID0gMDsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiZGVxdWUgbXV0YXRlZCBkdXJpbmcgaXRlcmF0aW9uIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoaXQtPmNvdW50ZXIgPT0gMCkKLQkJcmV0dXJuIE5VTEw7ICAgICAgICAKLQlhc3NlcnQgKCEoaXQtPmIgPT0gaXQtPmRlcXVlLT5yaWdodGJsb2NrICYmCi0JCSAgaXQtPmluZGV4ID4gaXQtPmRlcXVlLT5yaWdodGluZGV4KSk7CisgICAgaWYgKGl0LT5kZXF1ZS0+c3RhdGUgIT0gaXQtPnN0YXRlKSB7CisgICAgICAgIGl0LT5jb3VudGVyID0gMDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZXF1ZSBtdXRhdGVkIGR1cmluZyBpdGVyYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpdC0+Y291bnRlciA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQgKCEoaXQtPmIgPT0gaXQtPmRlcXVlLT5yaWdodGJsb2NrICYmCisgICAgICAgICAgICAgIGl0LT5pbmRleCA+IGl0LT5kZXF1ZS0+cmlnaHRpbmRleCkpOwogCi0JaXRlbSA9IGl0LT5iLT5kYXRhW2l0LT5pbmRleF07Ci0JaXQtPmluZGV4Kys7Ci0JaXQtPmNvdW50ZXItLTsKLQlpZiAoaXQtPmluZGV4ID09IEJMT0NLTEVOICYmIGl0LT5jb3VudGVyID4gMCkgewotCQlhc3NlcnQgKGl0LT5iLT5yaWdodGxpbmsgIT0gTlVMTCk7Ci0JCWl0LT5iID0gaXQtPmItPnJpZ2h0bGluazsKLQkJaXQtPmluZGV4ID0gMDsKLQl9Ci0JUHlfSU5DUkVGKGl0ZW0pOwotCXJldHVybiBpdGVtOworICAgIGl0ZW0gPSBpdC0+Yi0+ZGF0YVtpdC0+aW5kZXhdOworICAgIGl0LT5pbmRleCsrOworICAgIGl0LT5jb3VudGVyLS07CisgICAgaWYgKGl0LT5pbmRleCA9PSBCTE9DS0xFTiAmJiBpdC0+Y291bnRlciA+IDApIHsKKyAgICAgICAgYXNzZXJ0IChpdC0+Yi0+cmlnaHRsaW5rICE9IE5VTEwpOworICAgICAgICBpdC0+YiA9IGl0LT5iLT5yaWdodGxpbms7CisgICAgICAgIGl0LT5pbmRleCA9IDA7CisgICAgfQorICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICByZXR1cm4gaXRlbTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlaXRlcl9sZW4oZGVxdWVpdGVyb2JqZWN0ICppdCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaXQtPmNvdW50ZXIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpdC0+Y291bnRlcik7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGRlcXVlaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pZGVxdWVpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pZGVxdWVpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZGVxdWVpdGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImRlcXVlX2l0ZXJhdG9yIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGRlcXVlaXRlcm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGVxdWVpdGVyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpZGVxdWVpdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWRlcXVlaXRlcl9uZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KLQlkZXF1ZWl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiZGVxdWVfaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZGVxdWVpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZGVxdWVpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkZXF1ZWl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZGVxdWVpdGVyX25leHQsICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkZXF1ZWl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqIERlcXVlIFJldmVyc2UgSXRlcmF0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMTA2LDg3ICsxMTA2LDg3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfcmV2aXRlcihkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0JZGVxdWVpdGVyb2JqZWN0ICppdDsKKyAgICBkZXF1ZWl0ZXJvYmplY3QgKml0OwogCi0JaXQgPSBQeU9iamVjdF9HQ19OZXcoZGVxdWVpdGVyb2JqZWN0LCAmZGVxdWVyZXZpdGVyX3R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpdC0+YiA9IGRlcXVlLT5yaWdodGJsb2NrOwotCWl0LT5pbmRleCA9IGRlcXVlLT5yaWdodGluZGV4OwotCVB5X0lOQ1JFRihkZXF1ZSk7Ci0JaXQtPmRlcXVlID0gZGVxdWU7Ci0JaXQtPnN0YXRlID0gZGVxdWUtPnN0YXRlOwotCWl0LT5jb3VudGVyID0gZGVxdWUtPmxlbjsKLQlQeU9iamVjdF9HQ19UcmFjayhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGRlcXVlaXRlcm9iamVjdCwgJmRlcXVlcmV2aXRlcl90eXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPmIgPSBkZXF1ZS0+cmlnaHRibG9jazsKKyAgICBpdC0+aW5kZXggPSBkZXF1ZS0+cmlnaHRpbmRleDsKKyAgICBQeV9JTkNSRUYoZGVxdWUpOworICAgIGl0LT5kZXF1ZSA9IGRlcXVlOworICAgIGl0LT5zdGF0ZSA9IGRlcXVlLT5zdGF0ZTsKKyAgICBpdC0+Y291bnRlciA9IGRlcXVlLT5sZW47CisgICAgUHlPYmplY3RfR0NfVHJhY2soaXQpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlcmV2aXRlcl9uZXh0KGRlcXVlaXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlPYmplY3QgKml0ZW07Ci0JaWYgKGl0LT5jb3VudGVyID09IDApCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIGlmIChpdC0+Y291bnRlciA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChpdC0+ZGVxdWUtPnN0YXRlICE9IGl0LT5zdGF0ZSkgewotCQlpdC0+Y291bnRlciA9IDA7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXNzZXJ0ICghKGl0LT5iID09IGl0LT5kZXF1ZS0+bGVmdGJsb2NrICYmCi0JCSAgaXQtPmluZGV4IDwgaXQtPmRlcXVlLT5sZWZ0aW5kZXgpKTsKKyAgICBpZiAoaXQtPmRlcXVlLT5zdGF0ZSAhPSBpdC0+c3RhdGUpIHsKKyAgICAgICAgaXQtPmNvdW50ZXIgPSAwOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXNzZXJ0ICghKGl0LT5iID09IGl0LT5kZXF1ZS0+bGVmdGJsb2NrICYmCisgICAgICAgICAgICAgIGl0LT5pbmRleCA8IGl0LT5kZXF1ZS0+bGVmdGluZGV4KSk7CiAKLQlpdGVtID0gaXQtPmItPmRhdGFbaXQtPmluZGV4XTsKLQlpdC0+aW5kZXgtLTsKLQlpdC0+Y291bnRlci0tOwotCWlmIChpdC0+aW5kZXggPT0gLTEgJiYgaXQtPmNvdW50ZXIgPiAwKSB7Ci0JCWFzc2VydCAoaXQtPmItPmxlZnRsaW5rICE9IE5VTEwpOwotCQlpdC0+YiA9IGl0LT5iLT5sZWZ0bGluazsKLQkJaXQtPmluZGV4ID0gQkxPQ0tMRU4gLSAxOwotCX0KLQlQeV9JTkNSRUYoaXRlbSk7Ci0JcmV0dXJuIGl0ZW07CisgICAgaXRlbSA9IGl0LT5iLT5kYXRhW2l0LT5pbmRleF07CisgICAgaXQtPmluZGV4LS07CisgICAgaXQtPmNvdW50ZXItLTsKKyAgICBpZiAoaXQtPmluZGV4ID09IC0xICYmIGl0LT5jb3VudGVyID4gMCkgeworICAgICAgICBhc3NlcnQgKGl0LT5iLT5sZWZ0bGluayAhPSBOVUxMKTsKKyAgICAgICAgaXQtPmIgPSBpdC0+Yi0+bGVmdGxpbms7CisgICAgICAgIGl0LT5pbmRleCA9IEJMT0NLTEVOIC0gMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIHJldHVybiBpdGVtOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRlcXVlcmV2aXRlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJkZXF1ZV9yZXZlcnNlX2l0ZXJhdG9yIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZGVxdWVpdGVyb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilkZXF1ZWl0ZXJfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylkZXF1ZWl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZGVxdWVyZXZpdGVyX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGVxdWVpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImRlcXVlX3JldmVyc2VfaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGRlcXVlaXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRlcXVlaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZGVxdWVpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWRlcXVlcmV2aXRlcl9uZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZGVxdWVpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIC8qIGRlZmF1bHRkaWN0IHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlEaWN0T2JqZWN0IGRpY3Q7Ci0JUHlPYmplY3QgKmRlZmF1bHRfZmFjdG9yeTsKKyAgICBQeURpY3RPYmplY3QgZGljdDsKKyAgICBQeU9iamVjdCAqZGVmYXVsdF9mYWN0b3J5OwogfSBkZWZkaWN0b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGRlZmRpY3RfdHlwZTsgLyogRm9yd2FyZCAqLwpAQCAtMTIwMSwyNSArMTIwMSwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlZmRpY3RfbWlzc2luZyhkZWZkaWN0b2JqZWN0ICpkZCwgUHlPYmplY3QgKmtleSkKIHsKLQlQeU9iamVjdCAqZmFjdG9yeSA9IGRkLT5kZWZhdWx0X2ZhY3Rvcnk7Ci0JUHlPYmplY3QgKnZhbHVlOwotCWlmIChmYWN0b3J5ID09IE5VTEwgfHwgZmFjdG9yeSA9PSBQeV9Ob25lKSB7Ci0JCS8qIFhYWCBDYWxsIGRpY3QuX19taXNzaW5nX18oa2V5KSAqLwotCQlQeU9iamVjdCAqdHVwOwotCQl0dXAgPSBQeVR1cGxlX1BhY2soMSwga2V5KTsKLQkJaWYgKCF0dXApIHJldHVybiBOVUxMOwotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7Ci0JCVB5X0RFQ1JFRih0dXApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdmFsdWUgPSBQeUV2YWxfQ2FsbE9iamVjdChmYWN0b3J5LCBOVUxMKTsKLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJcmV0dXJuIHZhbHVlOwotCWlmIChQeU9iamVjdF9TZXRJdGVtKChQeU9iamVjdCAqKWRkLCBrZXksIHZhbHVlKSA8IDApIHsKLQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqZmFjdG9yeSA9IGRkLT5kZWZhdWx0X2ZhY3Rvcnk7CisgICAgUHlPYmplY3QgKnZhbHVlOworICAgIGlmIChmYWN0b3J5ID09IE5VTEwgfHwgZmFjdG9yeSA9PSBQeV9Ob25lKSB7CisgICAgICAgIC8qIFhYWCBDYWxsIGRpY3QuX19taXNzaW5nX18oa2V5KSAqLworICAgICAgICBQeU9iamVjdCAqdHVwOworICAgICAgICB0dXAgPSBQeVR1cGxlX1BhY2soMSwga2V5KTsKKyAgICAgICAgaWYgKCF0dXApIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7CisgICAgICAgIFB5X0RFQ1JFRih0dXApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdmFsdWUgPSBQeUV2YWxfQ2FsbE9iamVjdChmYWN0b3J5LCBOVUxMKTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIGlmIChQeU9iamVjdF9TZXRJdGVtKChQeU9iamVjdCAqKWRkLCBrZXksIHZhbHVlKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKIH0KIAogUHlEb2NfU1RSVkFSKGRlZmRpY3RfY29weV9kb2MsICJELmNvcHkoKSAtPiBhIHNoYWxsb3cgY29weSBvZiBELiIpOwpAQCAtMTIyNywxOTIgKzEyMjcsMTkyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVmZGljdF9jb3B5KGRlZmRpY3RvYmplY3QgKmRkKQogewotCS8qIFRoaXMgY2FsbHMgdGhlIG9iamVjdCdzIGNsYXNzLiAgVGhhdCBvbmx5IHdvcmtzIGZvciBzdWJjbGFzc2VzCi0JICAgd2hvc2UgY2xhc3MgY29uc3RydWN0b3IgaGFzIHRoZSBzYW1lIHNpZ25hdHVyZS4gIFN1YmNsYXNzZXMgdGhhdAotCSAgIGRlZmluZSBhIGRpZmZlcmVudCBjb25zdHJ1Y3RvciBzaWduYXR1cmUgbXVzdCBvdmVycmlkZSBjb3B5KCkuCi0JKi8KKyAgICAvKiBUaGlzIGNhbGxzIHRoZSBvYmplY3QncyBjbGFzcy4gIFRoYXQgb25seSB3b3JrcyBmb3Igc3ViY2xhc3NlcworICAgICAgIHdob3NlIGNsYXNzIGNvbnN0cnVjdG9yIGhhcyB0aGUgc2FtZSBzaWduYXR1cmUuICBTdWJjbGFzc2VzIHRoYXQKKyAgICAgICBkZWZpbmUgYSBkaWZmZXJlbnQgY29uc3RydWN0b3Igc2lnbmF0dXJlIG11c3Qgb3ZlcnJpZGUgY29weSgpLgorICAgICovCiAKLQlpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKQotCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QqKVB5X1RZUEUoZGQpLCBQeV9Ob25lLCBkZCwgTlVMTCk7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KilQeV9UWVBFKGRkKSwKLQkJCQkJICAgIGRkLT5kZWZhdWx0X2ZhY3RvcnksIGRkLCBOVUxMKTsKKyAgICBpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QqKVB5X1RZUEUoZGQpLCBQeV9Ob25lLCBkZCwgTlVMTCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0KilQeV9UWVBFKGRkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZC0+ZGVmYXVsdF9mYWN0b3J5LCBkZCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWZkaWN0X3JlZHVjZShkZWZkaWN0b2JqZWN0ICpkZCkKIHsKLQkvKiBfX3JlZHVjZV9fIG11c3QgcmV0dXJuIGEgNS10dXBsZSBhcyBmb2xsb3dzOgorICAgIC8qIF9fcmVkdWNlX18gbXVzdCByZXR1cm4gYSA1LXR1cGxlIGFzIGZvbGxvd3M6CiAKLQkgICAtIGZhY3RvcnkgZnVuY3Rpb24KLQkgICAtIHR1cGxlIG9mIGFyZ3MgZm9yIHRoZSBmYWN0b3J5IGZ1bmN0aW9uCi0JICAgLSBhZGRpdGlvbmFsIHN0YXRlIChoZXJlIE5vbmUpCi0JICAgLSBzZXF1ZW5jZSBpdGVyYXRvciAoaGVyZSBOb25lKQotCSAgIC0gZGljdGlvbmFyeSBpdGVyYXRvciAoeWllbGRpbmcgc3VjY2Vzc2l2ZSAoa2V5LCB2YWx1ZSkgcGFpcnMKKyAgICAgICAtIGZhY3RvcnkgZnVuY3Rpb24KKyAgICAgICAtIHR1cGxlIG9mIGFyZ3MgZm9yIHRoZSBmYWN0b3J5IGZ1bmN0aW9uCisgICAgICAgLSBhZGRpdGlvbmFsIHN0YXRlIChoZXJlIE5vbmUpCisgICAgICAgLSBzZXF1ZW5jZSBpdGVyYXRvciAoaGVyZSBOb25lKQorICAgICAgIC0gZGljdGlvbmFyeSBpdGVyYXRvciAoeWllbGRpbmcgc3VjY2Vzc2l2ZSAoa2V5LCB2YWx1ZSkgcGFpcnMKIAotCSAgIFRoaXMgQVBJIGlzIHVzZWQgYnkgcGlja2xlLnB5IGFuZCBjb3B5LnB5LgorICAgICAgIFRoaXMgQVBJIGlzIHVzZWQgYnkgcGlja2xlLnB5IGFuZCBjb3B5LnB5LgogCi0JICAgRm9yIHRoaXMgdG8gYmUgdXNlZnVsIHdpdGggcGlja2xlLnB5LCB0aGUgZGVmYXVsdF9mYWN0b3J5Ci0JICAgbXVzdCBiZSBwaWNrbGFibGU7IGUuZy4sIE5vbmUsIGEgYnVpbHQtaW4sIG9yIGEgZ2xvYmFsCi0JICAgZnVuY3Rpb24gaW4gYSBtb2R1bGUgb3IgcGFja2FnZS4KKyAgICAgICBGb3IgdGhpcyB0byBiZSB1c2VmdWwgd2l0aCBwaWNrbGUucHksIHRoZSBkZWZhdWx0X2ZhY3RvcnkKKyAgICAgICBtdXN0IGJlIHBpY2tsYWJsZTsgZS5nLiwgTm9uZSwgYSBidWlsdC1pbiwgb3IgYSBnbG9iYWwKKyAgICAgICBmdW5jdGlvbiBpbiBhIG1vZHVsZSBvciBwYWNrYWdlLgogCi0JICAgQm90aCBzaGFsbG93IGFuZCBkZWVwIGNvcHlpbmcgYXJlIHN1cHBvcnRlZCwgYnV0IGZvciBkZWVwCi0JICAgY29weWluZywgdGhlIGRlZmF1bHRfZmFjdG9yeSBtdXN0IGJlIGRlZXAtY29weWFibGU7IGUuZy4gTm9uZSwKLQkgICBvciBhIGJ1aWx0LWluIChmdW5jdGlvbnMgYXJlIG5vdCBjb3B5YWJsZSBhdCB0aGlzIHRpbWUpLgorICAgICAgIEJvdGggc2hhbGxvdyBhbmQgZGVlcCBjb3B5aW5nIGFyZSBzdXBwb3J0ZWQsIGJ1dCBmb3IgZGVlcAorICAgICAgIGNvcHlpbmcsIHRoZSBkZWZhdWx0X2ZhY3RvcnkgbXVzdCBiZSBkZWVwLWNvcHlhYmxlOyBlLmcuIE5vbmUsCisgICAgICAgb3IgYSBidWlsdC1pbiAoZnVuY3Rpb25zIGFyZSBub3QgY29weWFibGUgYXQgdGhpcyB0aW1lKS4KIAotCSAgIFRoaXMgb25seSB3b3JrcyBmb3Igc3ViY2xhc3NlcyBhcyBsb25nIGFzIHRoZWlyIGNvbnN0cnVjdG9yCi0JICAgc2lnbmF0dXJlIGlzIGNvbXBhdGlibGU7IHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIHRoZQotCSAgIG9wdGlvbmFsIGRlZmF1bHRfZmFjdG9yeSwgZGVmYXVsdGluZyB0byBOb25lLgotCSovCi0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKml0ZW1zOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaWYgKGRkLT5kZWZhdWx0X2ZhY3RvcnkgPT0gTlVMTCB8fCBkZC0+ZGVmYXVsdF9mYWN0b3J5ID09IFB5X05vbmUpCi0JCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQllbHNlCi0JCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgZGQtPmRlZmF1bHRfZmFjdG9yeSk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXRlbXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKWRkLCAiaXRlcml0ZW1zIiwgIigpIik7Ci0JaWYgKGl0ZW1zID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDUsIFB5X1RZUEUoZGQpLCBhcmdzLAotCQkJICAgICAgUHlfTm9uZSwgUHlfTm9uZSwgaXRlbXMpOwotCVB5X0RFQ1JFRihpdGVtcyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgVGhpcyBvbmx5IHdvcmtzIGZvciBzdWJjbGFzc2VzIGFzIGxvbmcgYXMgdGhlaXIgY29uc3RydWN0b3IKKyAgICAgICBzaWduYXR1cmUgaXMgY29tcGF0aWJsZTsgdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgdGhlCisgICAgICAgb3B0aW9uYWwgZGVmYXVsdF9mYWN0b3J5LCBkZWZhdWx0aW5nIHRvIE5vbmUuCisgICAgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqaXRlbXM7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMIHx8IGRkLT5kZWZhdWx0X2ZhY3RvcnkgPT0gUHlfTm9uZSkKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdGVtcyA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopZGQsICJpdGVyaXRlbXMiLCAiKCkiKTsKKyAgICBpZiAoaXRlbXMgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soNSwgUHlfVFlQRShkZCksIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsIFB5X05vbmUsIGl0ZW1zKTsKKyAgICBQeV9ERUNSRUYoaXRlbXMpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGVmZGljdF9tZXRob2RzW10gPSB7Ci0JeyJfX21pc3NpbmdfXyIsIChQeUNGdW5jdGlvbilkZWZkaWN0X21pc3NpbmcsIE1FVEhfTywKLQkgZGVmZGljdF9taXNzaW5nX2RvY30sCi0JeyJjb3B5IiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfY29weSwgTUVUSF9OT0FSR1MsCi0JIGRlZmRpY3RfY29weV9kb2N9LAotCXsiX19jb3B5X18iLCAoUHlDRnVuY3Rpb24pZGVmZGljdF9jb3B5LCBNRVRIX05PQVJHUywKLQkgZGVmZGljdF9jb3B5X2RvY30sCi0JeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfcmVkdWNlLCBNRVRIX05PQVJHUywKLQkgcmVkdWNlX2RvY30sCi0Je05VTEx9CisgICAgeyJfX21pc3NpbmdfXyIsIChQeUNGdW5jdGlvbilkZWZkaWN0X21pc3NpbmcsIE1FVEhfTywKKyAgICAgZGVmZGljdF9taXNzaW5nX2RvY30sCisgICAgeyJjb3B5IiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfY29weSwgTUVUSF9OT0FSR1MsCisgICAgIGRlZmRpY3RfY29weV9kb2N9LAorICAgIHsiX19jb3B5X18iLCAoUHlDRnVuY3Rpb24pZGVmZGljdF9jb3B5LCBNRVRIX05PQVJHUywKKyAgICAgZGVmZGljdF9jb3B5X2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKWRlZmRpY3RfcmVkdWNlLCBNRVRIX05PQVJHUywKKyAgICAgcmVkdWNlX2RvY30sCisgICAge05VTEx9CiB9OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZGVmZGljdF9tZW1iZXJzW10gPSB7Ci0JeyJkZWZhdWx0X2ZhY3RvcnkiLCBUX09CSkVDVCwKLQkgb2Zmc2V0b2YoZGVmZGljdG9iamVjdCwgZGVmYXVsdF9mYWN0b3J5KSwgMCwKLQkgUHlEb2NfU1RSKCJGYWN0b3J5IGZvciBkZWZhdWx0IHZhbHVlIGNhbGxlZCBieSBfX21pc3NpbmdfXygpLiIpfSwKLQl7TlVMTH0KKyAgICB7ImRlZmF1bHRfZmFjdG9yeSIsIFRfT0JKRUNULAorICAgICBvZmZzZXRvZihkZWZkaWN0b2JqZWN0LCBkZWZhdWx0X2ZhY3RvcnkpLCAwLAorICAgICBQeURvY19TVFIoIkZhY3RvcnkgZm9yIGRlZmF1bHQgdmFsdWUgY2FsbGVkIGJ5IF9fbWlzc2luZ19fKCkuIil9LAorICAgIHtOVUxMfQogfTsKIAogc3RhdGljIHZvaWQKIGRlZmRpY3RfZGVhbGxvYyhkZWZkaWN0b2JqZWN0ICpkZCkKIHsKLQlQeV9DTEVBUihkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKLQlQeURpY3RfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKWRkKTsKKyAgICBQeV9DTEVBUihkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKKyAgICBQeURpY3RfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKWRkKTsKIH0KIAogc3RhdGljIGludAogZGVmZGljdF9wcmludChkZWZkaWN0b2JqZWN0ICpkZCwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlpbnQgc3RzOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiZGVmYXVsdGRpY3QoIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnByaW50ZihmcCwgIk5vbmUiKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9IGVsc2UgewotCQlQeU9iamVjdF9QcmludChkZC0+ZGVmYXVsdF9mYWN0b3J5LCBmcCwgMCk7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmcHJpbnRmKGZwLCAiLCAiKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXN0cyA9IFB5RGljdF9UeXBlLnRwX3ByaW50KChQeU9iamVjdCAqKWRkLCBmcCwgMCk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICIpIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXR1cm4gc3RzOworICAgIGludCBzdHM7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICJkZWZhdWx0ZGljdCgiKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChkZC0+ZGVmYXVsdF9mYWN0b3J5ID09IE5VTEwpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHJpbnRmKGZwLCAiTm9uZSIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0gZWxzZSB7CisgICAgICAgIFB5T2JqZWN0X1ByaW50KGRkLT5kZWZhdWx0X2ZhY3RvcnksIGZwLCAwKTsKKyAgICB9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICIsICIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgc3RzID0gUHlEaWN0X1R5cGUudHBfcHJpbnQoKFB5T2JqZWN0ICopZGQsIGZwLCAwKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnByaW50ZihmcCwgIikiKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiBzdHM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWZkaWN0X3JlcHIoZGVmZGljdG9iamVjdCAqZGQpCiB7Ci0JUHlPYmplY3QgKmRlZnJlcHI7Ci0JUHlPYmplY3QgKmJhc2VyZXByOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JYmFzZXJlcHIgPSBQeURpY3RfVHlwZS50cF9yZXByKChQeU9iamVjdCAqKWRkKTsKLQlpZiAoYmFzZXJlcHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRkLT5kZWZhdWx0X2ZhY3RvcnkgPT0gTlVMTCkKLQkJZGVmcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIk5vbmUiKTsKLQllbHNlCi0JewotCQlpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKGRkLT5kZWZhdWx0X2ZhY3RvcnkpOwotCQlpZiAoc3RhdHVzICE9IDApIHsKLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJZGVmcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIi4uLiIpOwotCQl9Ci0JCWVsc2UKLQkJCWRlZnJlcHIgPSBQeU9iamVjdF9SZXByKGRkLT5kZWZhdWx0X2ZhY3RvcnkpOwotCQlQeV9SZXByTGVhdmUoZGQtPmRlZmF1bHRfZmFjdG9yeSk7Ci0JfQotCWlmIChkZWZyZXByID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGJhc2VyZXByKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoImRlZmF1bHRkaWN0KCVzLCAlcykiLAotCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGRlZnJlcHIpLAotCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGJhc2VyZXByKSk7Ci0JUHlfREVDUkVGKGRlZnJlcHIpOwotCVB5X0RFQ1JFRihiYXNlcmVwcik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqZGVmcmVwcjsKKyAgICBQeU9iamVjdCAqYmFzZXJlcHI7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBiYXNlcmVwciA9IFB5RGljdF9UeXBlLnRwX3JlcHIoKFB5T2JqZWN0ICopZGQpOworICAgIGlmIChiYXNlcmVwciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZGQtPmRlZmF1bHRfZmFjdG9yeSA9PSBOVUxMKQorICAgICAgICBkZWZyZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZygiTm9uZSIpOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBzdGF0dXMgPSBQeV9SZXByRW50ZXIoZGQtPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBkZWZyZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLi4uIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVmcmVwciA9IFB5T2JqZWN0X1JlcHIoZGQtPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgICAgIFB5X1JlcHJMZWF2ZShkZC0+ZGVmYXVsdF9mYWN0b3J5KTsKKyAgICB9CisgICAgaWYgKGRlZnJlcHIgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoYmFzZXJlcHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiZGVmYXVsdGRpY3QoJXMsICVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoZGVmcmVwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYmFzZXJlcHIpKTsKKyAgICBQeV9ERUNSRUYoZGVmcmVwcik7CisgICAgUHlfREVDUkVGKGJhc2VyZXByKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBkZWZkaWN0X3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVCgoKGRlZmRpY3RvYmplY3QgKilzZWxmKS0+ZGVmYXVsdF9mYWN0b3J5KTsKLQlyZXR1cm4gUHlEaWN0X1R5cGUudHBfdHJhdmVyc2Uoc2VsZiwgdmlzaXQsIGFyZyk7CisgICAgUHlfVklTSVQoKChkZWZkaWN0b2JqZWN0ICopc2VsZiktPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgcmV0dXJuIFB5RGljdF9UeXBlLnRwX3RyYXZlcnNlKHNlbGYsIHZpc2l0LCBhcmcpOwogfQogCiBzdGF0aWMgaW50CiBkZWZkaWN0X3RwX2NsZWFyKGRlZmRpY3RvYmplY3QgKmRkKQogewotCVB5X0NMRUFSKGRkLT5kZWZhdWx0X2ZhY3RvcnkpOwotCXJldHVybiBQeURpY3RfVHlwZS50cF9jbGVhcigoUHlPYmplY3QgKilkZCk7CisgICAgUHlfQ0xFQVIoZGQtPmRlZmF1bHRfZmFjdG9yeSk7CisgICAgcmV0dXJuIFB5RGljdF9UeXBlLnRwX2NsZWFyKChQeU9iamVjdCAqKWRkKTsKIH0KIAogc3RhdGljIGludAogZGVmZGljdF9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JZGVmZGljdG9iamVjdCAqZGQgPSAoZGVmZGljdG9iamVjdCAqKXNlbGY7Ci0JUHlPYmplY3QgKm9sZGRlZmF1bHQgPSBkZC0+ZGVmYXVsdF9mYWN0b3J5OwotCVB5T2JqZWN0ICpuZXdkZWZhdWx0ID0gTlVMTDsKLQlQeU9iamVjdCAqbmV3YXJnczsKLQlpbnQgcmVzdWx0OwotCWlmIChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpCi0JCW5ld2FyZ3MgPSBQeVR1cGxlX05ldygwKTsKLQllbHNlIHsKLQkJUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQluZXdkZWZhdWx0ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQkJCWlmICghUHlDYWxsYWJsZV9DaGVjayhuZXdkZWZhdWx0KSAmJiBuZXdkZWZhdWx0ICE9IFB5X05vbmUpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQluZXdhcmdzID0gUHlTZXF1ZW5jZV9HZXRTbGljZShhcmdzLCAxLCBuKTsKLQl9Ci0JaWYgKG5ld2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X1hJTkNSRUYobmV3ZGVmYXVsdCk7Ci0JZGQtPmRlZmF1bHRfZmFjdG9yeSA9IG5ld2RlZmF1bHQ7Ci0JcmVzdWx0ID0gUHlEaWN0X1R5cGUudHBfaW5pdChzZWxmLCBuZXdhcmdzLCBrd2RzKTsKLQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JUHlfWERFQ1JFRihvbGRkZWZhdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGRlZmRpY3RvYmplY3QgKmRkID0gKGRlZmRpY3RvYmplY3QgKilzZWxmOworICAgIFB5T2JqZWN0ICpvbGRkZWZhdWx0ID0gZGQtPmRlZmF1bHRfZmFjdG9yeTsKKyAgICBQeU9iamVjdCAqbmV3ZGVmYXVsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5ld2FyZ3M7CisgICAgaW50IHJlc3VsdDsKKyAgICBpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpKQorICAgICAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgbmV3ZGVmYXVsdCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgICAgICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2sobmV3ZGVmYXVsdCkgJiYgbmV3ZGVmYXVsdCAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbmV3YXJncyA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgbik7CisgICAgfQorICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9YSU5DUkVGKG5ld2RlZmF1bHQpOworICAgIGRkLT5kZWZhdWx0X2ZhY3RvcnkgPSBuZXdkZWZhdWx0OworICAgIHJlc3VsdCA9IFB5RGljdF9UeXBlLnRwX2luaXQoc2VsZiwgbmV3YXJncywga3dkcyk7CisgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgIFB5X1hERUNSRUYob2xkZGVmYXVsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGRlZmRpY3RfZG9jLApAQCAtMTQyNyw0NyArMTQyNyw0NyBAQAogI2RlZmluZSBERUZFUlJFRF9BRERSRVNTKEFERFIpIDAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBkZWZkaWN0X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKERFRkVSUkVEX0FERFJFU1MoJlB5VHlwZV9UeXBlKSwgMCkKLQkiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QiLAkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGRlZmRpY3RvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGVmZGljdF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYylkZWZkaWN0X3ByaW50LAkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylkZWZkaWN0X3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJICAgICAgIAkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLAkvKiB0cF9mbGFncyAqLwotCWRlZmRpY3RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCWRlZmRpY3RfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KWRlZmRpY3RfdHBfY2xlYXIsCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGVmZGljdF9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLwotCWRlZmRpY3RfbWVtYmVycywJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQlERUZFUlJFRF9BRERSRVNTKCZQeURpY3RfVHlwZSksCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCWRlZmRpY3RfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCisgICAgImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0IiwgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihkZWZkaWN0b2JqZWN0KSwgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRlZmRpY3RfZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKWRlZmRpY3RfcHJpbnQsICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylkZWZkaWN0X3JlcHIsICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZGVmZGljdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgZGVmZGljdF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlkZWZkaWN0X3RwX2NsZWFyLCAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGRlZmRpY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkZWZkaWN0X21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgREVGRVJSRURfQUREUkVTUygmUHlEaWN0X1R5cGUpLCAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgZGVmZGljdF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogbW9kdWxlIGxldmVsIGNvZGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNDgxLDI4ICsxNDgxLDI4IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdF9jb2xsZWN0aW9ucyh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJfY29sbGVjdGlvbnMiLCBOVUxMLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfY29sbGVjdGlvbnMiLCBOVUxMLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZkZXF1ZV90eXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJmRlcXVlX3R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGVxdWUiLCAoUHlPYmplY3QgKikmZGVxdWVfdHlwZSk7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmZGVxdWVfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZkZXF1ZV90eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImRlcXVlIiwgKFB5T2JqZWN0ICopJmRlcXVlX3R5cGUpOwogCi0JZGVmZGljdF90eXBlLnRwX2Jhc2UgPSAmUHlEaWN0X1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmZGVmZGljdF90eXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJmRlZmRpY3RfdHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkZWZhdWx0ZGljdCIsIChQeU9iamVjdCAqKSZkZWZkaWN0X3R5cGUpOworICAgIGRlZmRpY3RfdHlwZS50cF9iYXNlID0gJlB5RGljdF9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJmRlZmRpY3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZkZWZkaWN0X3R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGVmYXVsdGRpY3QiLCAoUHlPYmplY3QgKikmZGVmZGljdF90eXBlKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJmRlcXVlaXRlcl90eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZkZXF1ZWl0ZXJfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZkZXF1ZXJldml0ZXJfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmZGVxdWVyZXZpdGVyX3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JcmV0dXJuOworICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Nzdi5jIGIvTW9kdWxlcy9fY3N2LmMKaW5kZXggYTU3ODdkMy4uOTgzZjZhNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3N2LmMKKysrIGIvTW9kdWxlcy9fY3N2LmMKQEAgLTMxLDk2ICszMSw5NiBAQAogI2VuZGlmIC8qIGlmbmRlZiBQeURvY19TVFJWQVIgKi8KIAogI2lmbmRlZiBQeU1PRElOSVRfRlVOQwotIwlpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQotIwkJZGVmaW5lIFB5TU9ESU5JVF9GVU5DIGV4dGVybiAiQyIgdm9pZAotIwllbHNlIC8qIF9fY3BsdXNwbHVzICovCi0jCQlkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAotIwllbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICBpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyBleHRlcm4gIkMiIHZvaWQKKyMgICAgICAgZWxzZSAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCisjICAgICAgIGVuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAjZW5kaWYKIAogI2lmbmRlZiBQeV9DTEVBUgotI2RlZmluZSBQeV9DTEVBUihvcCkJCQkJCQlcCi0JZG8gewkJCQkJCQlcCi0JCWlmIChvcCkgewkJCQkJXAotCQkJUHlPYmplY3QgKnRtcCA9IChQeU9iamVjdCAqKShvcCk7CVwKLQkJCShvcCkgPSBOVUxMOwkJCQlcCi0JCQlQeV9ERUNSRUYodG1wKTsJCQkJXAotCQl9CQkJCQkJXAotCX0gd2hpbGUgKDApCisjZGVmaW5lIFB5X0NMRUFSKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeU9iamVjdCAqdG1wID0gKFB5T2JqZWN0ICopKG9wKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKG9wKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAjZW5kaWYKICNpZm5kZWYgUHlfVklTSVQKLSNkZWZpbmUgUHlfVklTSVQob3ApCQkJCQkJCVwKLSAgICAgICAgZG8geyAJCQkJCQkJCVwKLSAgICAgICAgICAgICAgICBpZiAob3ApIHsJCQkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnJldCA9IHZpc2l0KChQeU9iamVjdCAqKShvcCksIGFyZyk7CVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2cmV0KQkJCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsJCQkJXAotICAgICAgICAgICAgICAgIH0JCQkJCQkJXAotICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9WSVNJVChvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IHZyZXQgPSB2aXNpdCgoUHlPYmplY3QgKikob3ApLCBhcmcpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHZyZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiB2cmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCiAjZW5kaWYKIAogLyogZW5kIDIuMiBjb21wYXRpYmlsaXR5IG1hY3JvcyAqLwogCiAjZGVmaW5lIElTX0JBU0VTVFJJTkcobykgXAotCVB5T2JqZWN0X1R5cGVDaGVjayhvLCAmUHlCYXNlU3RyaW5nX1R5cGUpCisgICAgUHlPYmplY3RfVHlwZUNoZWNrKG8sICZQeUJhc2VTdHJpbmdfVHlwZSkKIAotc3RhdGljIFB5T2JqZWN0ICplcnJvcl9vYmo7CS8qIENTViBleGNlcHRpb24gKi8KK3N0YXRpYyBQeU9iamVjdCAqZXJyb3Jfb2JqOyAgICAgLyogQ1NWIGV4Y2VwdGlvbiAqLwogc3RhdGljIFB5T2JqZWN0ICpkaWFsZWN0czsgICAgICAvKiBEaWFsZWN0IHJlZ2lzdHJ5ICovCi1zdGF0aWMgbG9uZyBmaWVsZF9saW1pdCA9IDEyOCAqIDEwMjQ7CS8qIG1heCBwYXJzZWQgZmllbGQgc2l6ZSAqLworc3RhdGljIGxvbmcgZmllbGRfbGltaXQgPSAxMjggKiAxMDI0OyAgIC8qIG1heCBwYXJzZWQgZmllbGQgc2l6ZSAqLwogCiB0eXBlZGVmIGVudW0gewotCVNUQVJUX1JFQ09SRCwgU1RBUlRfRklFTEQsIEVTQ0FQRURfQ0hBUiwgSU5fRklFTEQsIAotCUlOX1FVT1RFRF9GSUVMRCwgRVNDQVBFX0lOX1FVT1RFRF9GSUVMRCwgUVVPVEVfSU5fUVVPVEVEX0ZJRUxELAotCUVBVF9DUk5MCisgICAgU1RBUlRfUkVDT1JELCBTVEFSVF9GSUVMRCwgRVNDQVBFRF9DSEFSLCBJTl9GSUVMRCwKKyAgICBJTl9RVU9URURfRklFTEQsIEVTQ0FQRV9JTl9RVU9URURfRklFTEQsIFFVT1RFX0lOX1FVT1RFRF9GSUVMRCwKKyAgICBFQVRfQ1JOTAogfSBQYXJzZXJTdGF0ZTsKIAogdHlwZWRlZiBlbnVtIHsKLQlRVU9URV9NSU5JTUFMLCBRVU9URV9BTEwsIFFVT1RFX05PTk5VTUVSSUMsIFFVT1RFX05PTkUKKyAgICBRVU9URV9NSU5JTUFMLCBRVU9URV9BTEwsIFFVT1RFX05PTk5VTUVSSUMsIFFVT1RFX05PTkUKIH0gUXVvdGVTdHlsZTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVF1b3RlU3R5bGUgc3R5bGU7Ci0JY2hhciAqbmFtZTsKKyAgICBRdW90ZVN0eWxlIHN0eWxlOworICAgIGNoYXIgKm5hbWU7CiB9IFN0eWxlRGVzYzsKIAogc3RhdGljIFN0eWxlRGVzYyBxdW90ZV9zdHlsZXNbXSA9IHsKLQl7IFFVT1RFX01JTklNQUwsICAgICJRVU9URV9NSU5JTUFMIiB9LAotCXsgUVVPVEVfQUxMLCAgICAgICAgIlFVT1RFX0FMTCIgfSwKLQl7IFFVT1RFX05PTk5VTUVSSUMsICJRVU9URV9OT05OVU1FUklDIiB9LAotCXsgUVVPVEVfTk9ORSwgICAgICAgIlFVT1RFX05PTkUiIH0sCi0JeyAwIH0KKyAgICB7IFFVT1RFX01JTklNQUwsICAgICJRVU9URV9NSU5JTUFMIiB9LAorICAgIHsgUVVPVEVfQUxMLCAgICAgICAgIlFVT1RFX0FMTCIgfSwKKyAgICB7IFFVT1RFX05PTk5VTUVSSUMsICJRVU9URV9OT05OVU1FUklDIiB9LAorICAgIHsgUVVPVEVfTk9ORSwgICAgICAgIlFVT1RFX05PTkUiIH0sCisgICAgeyAwIH0KIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgUHlPYmplY3RfSEVBRAotICAgICAgICAKLQlpbnQgZG91YmxlcXVvdGU7CS8qIGlzICIgcmVwcmVzZW50ZWQgYnkgIiI/ICovCi0JY2hhciBkZWxpbWl0ZXI7CQkvKiBmaWVsZCBzZXBhcmF0b3IgKi8KLQljaGFyIHF1b3RlY2hhcjsJCS8qIHF1b3RlIGNoYXJhY3RlciAqLwotCWNoYXIgZXNjYXBlY2hhcjsJLyogZXNjYXBlIGNoYXJhY3RlciAqLwotCWludCBza2lwaW5pdGlhbHNwYWNlOwkvKiBpZ25vcmUgc3BhY2VzIGZvbGxvd2luZyBkZWxpbWl0ZXI/ICovCi0JUHlPYmplY3QgKmxpbmV0ZXJtaW5hdG9yOyAvKiBzdHJpbmcgdG8gd3JpdGUgYmV0d2VlbiByZWNvcmRzICovCi0JaW50IHF1b3Rpbmc7CQkvKiBzdHlsZSBvZiBxdW90aW5nIHRvIHdyaXRlICovCisgICAgUHlPYmplY3RfSEVBRAogCi0JaW50IHN0cmljdDsJCS8qIHJhaXNlIGV4Y2VwdGlvbiBvbiBiYWQgQ1NWICovCisgICAgaW50IGRvdWJsZXF1b3RlOyAgICAgICAgICAgIC8qIGlzICIgcmVwcmVzZW50ZWQgYnkgIiI/ICovCisgICAgY2hhciBkZWxpbWl0ZXI7ICAgICAgICAgICAgIC8qIGZpZWxkIHNlcGFyYXRvciAqLworICAgIGNoYXIgcXVvdGVjaGFyOyAgICAgICAgICAgICAvKiBxdW90ZSBjaGFyYWN0ZXIgKi8KKyAgICBjaGFyIGVzY2FwZWNoYXI7ICAgICAgICAgICAgLyogZXNjYXBlIGNoYXJhY3RlciAqLworICAgIGludCBza2lwaW5pdGlhbHNwYWNlOyAgICAgICAvKiBpZ25vcmUgc3BhY2VzIGZvbGxvd2luZyBkZWxpbWl0ZXI/ICovCisgICAgUHlPYmplY3QgKmxpbmV0ZXJtaW5hdG9yOyAvKiBzdHJpbmcgdG8gd3JpdGUgYmV0d2VlbiByZWNvcmRzICovCisgICAgaW50IHF1b3Rpbmc7ICAgICAgICAgICAgICAgIC8qIHN0eWxlIG9mIHF1b3RpbmcgdG8gd3JpdGUgKi8KKworICAgIGludCBzdHJpY3Q7ICAgICAgICAgICAgICAgICAvKiByYWlzZSBleGNlcHRpb24gb24gYmFkIENTViAqLwogfSBEaWFsZWN0T2JqOwogCiBzdGF0aWNmb3J3YXJkIFB5VHlwZU9iamVjdCBEaWFsZWN0X1R5cGU7CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0X0hFQUQKIAotICAgICAgICBQeU9iamVjdCAqaW5wdXRfaXRlcjsgICAvKiBpdGVyYXRlIG92ZXIgdGhpcyBmb3IgaW5wdXQgbGluZXMgKi8KKyAgICBQeU9iamVjdCAqaW5wdXRfaXRlcjsgICAvKiBpdGVyYXRlIG92ZXIgdGhpcyBmb3IgaW5wdXQgbGluZXMgKi8KIAotICAgICAgICBEaWFsZWN0T2JqICpkaWFsZWN0OyAgICAvKiBwYXJzaW5nIGRpYWxlY3QgKi8KKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0OyAgICAvKiBwYXJzaW5nIGRpYWxlY3QgKi8KIAotCVB5T2JqZWN0ICpmaWVsZHM7CS8qIGZpZWxkIGxpc3QgZm9yIGN1cnJlbnQgcmVjb3JkICovCi0JUGFyc2VyU3RhdGUgc3RhdGU7CS8qIGN1cnJlbnQgQ1NWIHBhcnNlIHN0YXRlICovCi0JY2hhciAqZmllbGQ7CQkvKiBidWlsZCBjdXJyZW50IGZpZWxkIGluIGhlcmUgKi8KLQlpbnQgZmllbGRfc2l6ZTsJCS8qIHNpemUgb2YgYWxsb2NhdGVkIGJ1ZmZlciAqLwotCWludCBmaWVsZF9sZW47CQkvKiBsZW5ndGggb2YgY3VycmVudCBmaWVsZCAqLwotCWludCBudW1lcmljX2ZpZWxkOwkvKiB0cmVhdCBmaWVsZCBhcyBudW1lcmljICovCi0JdW5zaWduZWQgbG9uZyBsaW5lX251bTsJLyogU291cmNlLWZpbGUgbGluZSBudW1iZXIgKi8KKyAgICBQeU9iamVjdCAqZmllbGRzOyAgICAgICAgICAgLyogZmllbGQgbGlzdCBmb3IgY3VycmVudCByZWNvcmQgKi8KKyAgICBQYXJzZXJTdGF0ZSBzdGF0ZTsgICAgICAgICAgLyogY3VycmVudCBDU1YgcGFyc2Ugc3RhdGUgKi8KKyAgICBjaGFyICpmaWVsZDsgICAgICAgICAgICAgICAgLyogYnVpbGQgY3VycmVudCBmaWVsZCBpbiBoZXJlICovCisgICAgaW50IGZpZWxkX3NpemU7ICAgICAgICAgICAgIC8qIHNpemUgb2YgYWxsb2NhdGVkIGJ1ZmZlciAqLworICAgIGludCBmaWVsZF9sZW47ICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBmaWVsZCAqLworICAgIGludCBudW1lcmljX2ZpZWxkOyAgICAgICAgICAvKiB0cmVhdCBmaWVsZCBhcyBudW1lcmljICovCisgICAgdW5zaWduZWQgbG9uZyBsaW5lX251bTsgICAgIC8qIFNvdXJjZS1maWxlIGxpbmUgbnVtYmVyICovCiB9IFJlYWRlck9iajsKIAogc3RhdGljZm9yd2FyZCBQeVR5cGVPYmplY3QgUmVhZGVyX1R5cGU7CkBAIC0xMjgsMTcgKzEyOCwxNyBAQAogI2RlZmluZSBSZWFkZXJPYmplY3RfQ2hlY2sodikgICAoUHlfVFlQRSh2KSA9PSAmUmVhZGVyX1R5cGUpCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0X0hFQUQKIAotICAgICAgICBQeU9iamVjdCAqd3JpdGVsaW5lOyAgICAvKiB3cml0ZSBvdXRwdXQgbGluZXMgdG8gdGhpcyBmaWxlICovCisgICAgUHlPYmplY3QgKndyaXRlbGluZTsgICAgLyogd3JpdGUgb3V0cHV0IGxpbmVzIHRvIHRoaXMgZmlsZSAqLwogCi0gICAgICAgIERpYWxlY3RPYmogKmRpYWxlY3Q7ICAgIC8qIHBhcnNpbmcgZGlhbGVjdCAqLworICAgIERpYWxlY3RPYmogKmRpYWxlY3Q7ICAgIC8qIHBhcnNpbmcgZGlhbGVjdCAqLwogCi0JY2hhciAqcmVjOwkJLyogYnVmZmVyIGZvciBwYXJzZXIuam9pbiAqLwotCWludCByZWNfc2l6ZTsJCS8qIHNpemUgb2YgYWxsb2NhdGVkIHJlY29yZCAqLwotCWludCByZWNfbGVuOwkJLyogbGVuZ3RoIG9mIHJlY29yZCAqLwotCWludCBudW1fZmllbGRzOwkJLyogbnVtYmVyIG9mIGZpZWxkcyBpbiByZWNvcmQgKi8KLX0gV3JpdGVyT2JqOyAgICAgICAgCisgICAgY2hhciAqcmVjOyAgICAgICAgICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgcGFyc2VyLmpvaW4gKi8KKyAgICBpbnQgcmVjX3NpemU7ICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBhbGxvY2F0ZWQgcmVjb3JkICovCisgICAgaW50IHJlY19sZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiByZWNvcmQgKi8KKyAgICBpbnQgbnVtX2ZpZWxkczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGZpZWxkcyBpbiByZWNvcmQgKi8KK30gV3JpdGVyT2JqOwogCiBzdGF0aWNmb3J3YXJkIFB5VHlwZU9iamVjdCBXcml0ZXJfVHlwZTsKIApAQCAtMTQ5LDM1NyArMTQ5LDM1NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9kaWFsZWN0X2Zyb21fcmVnaXN0cnkoUHlPYmplY3QgKiBuYW1lX29iaikKIHsKLSAgICAgICAgUHlPYmplY3QgKmRpYWxlY3Rfb2JqOworICAgIFB5T2JqZWN0ICpkaWFsZWN0X29iajsKIAotICAgICAgICBkaWFsZWN0X29iaiA9IFB5RGljdF9HZXRJdGVtKGRpYWxlY3RzLCBuYW1lX29iaik7Ci0JaWYgKGRpYWxlY3Rfb2JqID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfRm9ybWF0KGVycm9yX29iaiwgInVua25vd24gZGlhbGVjdCIpOwotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRihkaWFsZWN0X29iaik7Ci0gICAgICAgIHJldHVybiBkaWFsZWN0X29iajsKKyAgICBkaWFsZWN0X29iaiA9IFB5RGljdF9HZXRJdGVtKGRpYWxlY3RzLCBuYW1lX29iaik7CisgICAgaWYgKGRpYWxlY3Rfb2JqID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KGVycm9yX29iaiwgInVua25vd24gZGlhbGVjdCIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRihkaWFsZWN0X29iaik7CisgICAgcmV0dXJuIGRpYWxlY3Rfb2JqOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3N0cmluZyhQeU9iamVjdCAqc3RyKQogewotICAgICAgICBQeV9YSU5DUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBzdHI7CisgICAgUHlfWElOQ1JFRihzdHIpOworICAgIHJldHVybiBzdHI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfbnVsbGNoYXJfYXNfTm9uZShjaGFyIGMpCiB7Ci0gICAgICAgIGlmIChjID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopJmMsIDEpOworICAgIGlmIChjID09ICdcMCcpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKSZjLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIERpYWxlY3RfZ2V0X2xpbmV0ZXJtaW5hdG9yKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBnZXRfc3RyaW5nKHNlbGYtPmxpbmV0ZXJtaW5hdG9yKTsKKyAgICByZXR1cm4gZ2V0X3N0cmluZyhzZWxmLT5saW5ldGVybWluYXRvcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBEaWFsZWN0X2dldF9lc2NhcGVjaGFyKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBnZXRfbnVsbGNoYXJfYXNfTm9uZShzZWxmLT5lc2NhcGVjaGFyKTsKKyAgICByZXR1cm4gZ2V0X251bGxjaGFyX2FzX05vbmUoc2VsZi0+ZXNjYXBlY2hhcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBEaWFsZWN0X2dldF9xdW90ZWNoYXIoRGlhbGVjdE9iaiAqc2VsZikKIHsKLSAgICAgICAgcmV0dXJuIGdldF9udWxsY2hhcl9hc19Ob25lKHNlbGYtPnF1b3RlY2hhcik7CisgICAgcmV0dXJuIGdldF9udWxsY2hhcl9hc19Ob25lKHNlbGYtPnF1b3RlY2hhcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBEaWFsZWN0X2dldF9xdW90aW5nKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5xdW90aW5nKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+cXVvdGluZyk7CiB9CiAKIHN0YXRpYyBpbnQKIF9zZXRfYm9vbChjb25zdCBjaGFyICpuYW1lLCBpbnQgKnRhcmdldCwgUHlPYmplY3QgKnNyYywgaW50IGRmbHQpCiB7Ci0JaWYgKHNyYyA9PSBOVUxMKQotCQkqdGFyZ2V0ID0gZGZsdDsKLQllbHNlCi0JCSp0YXJnZXQgPSBQeU9iamVjdF9Jc1RydWUoc3JjKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICAgICp0YXJnZXQgPSBkZmx0OworICAgIGVsc2UKKyAgICAgICAgKnRhcmdldCA9IFB5T2JqZWN0X0lzVHJ1ZShzcmMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBfc2V0X2ludChjb25zdCBjaGFyICpuYW1lLCBpbnQgKnRhcmdldCwgUHlPYmplY3QgKnNyYywgaW50IGRmbHQpCiB7Ci0JaWYgKHNyYyA9PSBOVUxMKQotCQkqdGFyZ2V0ID0gZGZsdDsKLQllbHNlIHsKLQkJaWYgKCFQeUludF9DaGVjayhzcmMpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkgICAgICJcIiVzXCIgbXVzdCBiZSBhbiBpbnRlZ2VyIiwgbmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJKnRhcmdldCA9IFB5SW50X0FzTG9uZyhzcmMpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICAgICp0YXJnZXQgPSBkZmx0OworICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHNyYykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBtdXN0IGJlIGFuIGludGVnZXIiLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAqdGFyZ2V0ID0gUHlJbnRfQXNMb25nKHNyYyk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBfc2V0X2NoYXIoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdGFyZ2V0LCBQeU9iamVjdCAqc3JjLCBjaGFyIGRmbHQpCiB7Ci0JaWYgKHNyYyA9PSBOVUxMKQotCQkqdGFyZ2V0ID0gZGZsdDsKLQllbHNlIHsKLQkJaWYgKHNyYyA9PSBQeV9Ob25lIHx8IFB5U3RyaW5nX1NpemUoc3JjKSA9PSAwKQotCQkJKnRhcmdldCA9ICdcMCc7Ci0JCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhzcmMpIHx8IFB5U3RyaW5nX1NpemUoc3JjKSAhPSAxKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkgICAgICJcIiVzXCIgbXVzdCBiZSBhbiAxLWNoYXJhY3RlciBzdHJpbmciLCAKLQkJCQkgICAgIG5hbWUpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhciAqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHNyYyk7Ci0JCQlpZiAocyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCSp0YXJnZXQgPSBzWzBdOwotCQl9Ci0JfQotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc3JjID09IE5VTEwpCisgICAgICAgICp0YXJnZXQgPSBkZmx0OworICAgIGVsc2UgeworICAgICAgICBpZiAoc3JjID09IFB5X05vbmUgfHwgUHlTdHJpbmdfU2l6ZShzcmMpID09IDApCisgICAgICAgICAgICAqdGFyZ2V0ID0gJ1wwJzsKKyAgICAgICAgZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKHNyYykgfHwgUHlTdHJpbmdfU2l6ZShzcmMpICE9IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJXNcIiBtdXN0IGJlIGFuIDEtY2hhcmFjdGVyIHN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQXNTdHJpbmcoc3JjKTsKKyAgICAgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgKnRhcmdldCA9IHNbMF07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIF9zZXRfc3RyKGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICoqdGFyZ2V0LCBQeU9iamVjdCAqc3JjLCBjb25zdCBjaGFyICpkZmx0KQogewotCWlmIChzcmMgPT0gTlVMTCkKLQkJKnRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZGZsdCk7Ci0JZWxzZSB7Ci0JCWlmIChzcmMgPT0gUHlfTm9uZSkKLQkJCSp0YXJnZXQgPSBOVUxMOwotCQllbHNlIGlmICghSVNfQkFTRVNUUklORyhzcmMpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkgICAgICJcIiVzXCIgbXVzdCBiZSBhbiBzdHJpbmciLCBuYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIHsKLQkJCVB5X1hERUNSRUYoKnRhcmdldCk7Ci0JCQlQeV9JTkNSRUYoc3JjKTsKLQkJCSp0YXJnZXQgPSBzcmM7Ci0JCX0KLQl9Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChzcmMgPT0gTlVMTCkKKyAgICAgICAgKnRhcmdldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZGZsdCk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzcmMgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICp0YXJnZXQgPSBOVUxMOworICAgICAgICBlbHNlIGlmICghSVNfQkFTRVNUUklORyhzcmMpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJcIiVzXCIgbXVzdCBiZSBhbiBzdHJpbmciLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoKnRhcmdldCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoc3JjKTsKKyAgICAgICAgICAgICp0YXJnZXQgPSBzcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGRpYWxlY3RfY2hlY2tfcXVvdGluZyhpbnQgcXVvdGluZykKIHsKLSAgICAgICAgU3R5bGVEZXNjICpxcyA9IHF1b3RlX3N0eWxlczsKKyAgICBTdHlsZURlc2MgKnFzID0gcXVvdGVfc3R5bGVzOwogCi0JZm9yIChxcyA9IHF1b3RlX3N0eWxlczsgcXMtPm5hbWU7IHFzKyspIHsKLQkJaWYgKHFzLT5zdHlsZSA9PSBxdW90aW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYmFkIFwicXVvdGluZ1wiIHZhbHVlIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBmb3IgKHFzID0gcXVvdGVfc3R5bGVzOyBxcy0+bmFtZTsgcXMrKykgeworICAgICAgICBpZiAocXMtPnN0eWxlID09IHF1b3RpbmcpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImJhZCBcInF1b3RpbmdcIiB2YWx1ZSIpOworICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBEX09GRih4KSBvZmZzZXRvZihEaWFsZWN0T2JqLCB4KQogCiBzdGF0aWMgc3RydWN0IFB5TWVtYmVyRGVmIERpYWxlY3RfbWVtYmVybGlzdFtdID0gewotCXsgImRlbGltaXRlciIsICAgICAgICAgIFRfQ0hBUiwgRF9PRkYoZGVsaW1pdGVyKSwgUkVBRE9OTFkgfSwKLQl7ICJza2lwaW5pdGlhbHNwYWNlIiwgICBUX0lOVCwgRF9PRkYoc2tpcGluaXRpYWxzcGFjZSksIFJFQURPTkxZIH0sCi0JeyAiZG91YmxlcXVvdGUiLCAgICAgICAgVF9JTlQsIERfT0ZGKGRvdWJsZXF1b3RlKSwgUkVBRE9OTFkgfSwKLQl7ICJzdHJpY3QiLCAgICAgICAgICAgICBUX0lOVCwgRF9PRkYoc3RyaWN0KSwgUkVBRE9OTFkgfSwKLQl7IE5VTEwgfQorICAgIHsgImRlbGltaXRlciIsICAgICAgICAgIFRfQ0hBUiwgRF9PRkYoZGVsaW1pdGVyKSwgUkVBRE9OTFkgfSwKKyAgICB7ICJza2lwaW5pdGlhbHNwYWNlIiwgICBUX0lOVCwgRF9PRkYoc2tpcGluaXRpYWxzcGFjZSksIFJFQURPTkxZIH0sCisgICAgeyAiZG91YmxlcXVvdGUiLCAgICAgICAgVF9JTlQsIERfT0ZGKGRvdWJsZXF1b3RlKSwgUkVBRE9OTFkgfSwKKyAgICB7ICJzdHJpY3QiLCAgICAgICAgICAgICBUX0lOVCwgRF9PRkYoc3RyaWN0KSwgUkVBRE9OTFkgfSwKKyAgICB7IE5VTEwgfQogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIERpYWxlY3RfZ2V0c2V0bGlzdFtdID0gewotCXsgImVzY2FwZWNoYXIiLAkJKGdldHRlcilEaWFsZWN0X2dldF9lc2NhcGVjaGFyfSwKLQl7ICJsaW5ldGVybWluYXRvciIsCShnZXR0ZXIpRGlhbGVjdF9nZXRfbGluZXRlcm1pbmF0b3J9LAotCXsgInF1b3RlY2hhciIsCQkoZ2V0dGVyKURpYWxlY3RfZ2V0X3F1b3RlY2hhcn0sCi0JeyAicXVvdGluZyIsCQkoZ2V0dGVyKURpYWxlY3RfZ2V0X3F1b3Rpbmd9LAotCXtOVUxMfSwKKyAgICB7ICJlc2NhcGVjaGFyIiwgICAgICAgICAgICAgKGdldHRlcilEaWFsZWN0X2dldF9lc2NhcGVjaGFyfSwKKyAgICB7ICJsaW5ldGVybWluYXRvciIsICAgICAgICAgKGdldHRlcilEaWFsZWN0X2dldF9saW5ldGVybWluYXRvcn0sCisgICAgeyAicXVvdGVjaGFyIiwgICAgICAgICAgICAgIChnZXR0ZXIpRGlhbGVjdF9nZXRfcXVvdGVjaGFyfSwKKyAgICB7ICJxdW90aW5nIiwgICAgICAgICAgICAgICAgKGdldHRlcilEaWFsZWN0X2dldF9xdW90aW5nfSwKKyAgICB7TlVMTH0sCiB9OwogCiBzdGF0aWMgdm9pZAogRGlhbGVjdF9kZWFsbG9jKERpYWxlY3RPYmogKnNlbGYpCiB7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+bGluZXRlcm1pbmF0b3IpOwotICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+bGluZXRlcm1pbmF0b3IpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBjaGFyICpkaWFsZWN0X2t3c1tdID0gewotCSJkaWFsZWN0IiwKLQkiZGVsaW1pdGVyIiwKLQkiZG91YmxlcXVvdGUiLAotCSJlc2NhcGVjaGFyIiwKLQkibGluZXRlcm1pbmF0b3IiLAotCSJxdW90ZWNoYXIiLAotCSJxdW90aW5nIiwKLQkic2tpcGluaXRpYWxzcGFjZSIsCi0JInN0cmljdCIsCi0JTlVMTAorICAgICJkaWFsZWN0IiwKKyAgICAiZGVsaW1pdGVyIiwKKyAgICAiZG91YmxlcXVvdGUiLAorICAgICJlc2NhcGVjaGFyIiwKKyAgICAibGluZXRlcm1pbmF0b3IiLAorICAgICJxdW90ZWNoYXIiLAorICAgICJxdW90aW5nIiwKKyAgICAic2tpcGluaXRpYWxzcGFjZSIsCisgICAgInN0cmljdCIsCisgICAgTlVMTAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpYWxlY3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JRGlhbGVjdE9iaiAqc2VsZjsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlQeU9iamVjdCAqZGlhbGVjdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmRlbGltaXRlciA9IE5VTEw7Ci0JUHlPYmplY3QgKmRvdWJsZXF1b3RlID0gTlVMTDsKLQlQeU9iamVjdCAqZXNjYXBlY2hhciA9IE5VTEw7Ci0JUHlPYmplY3QgKmxpbmV0ZXJtaW5hdG9yID0gTlVMTDsKLQlQeU9iamVjdCAqcXVvdGVjaGFyID0gTlVMTDsKLQlQeU9iamVjdCAqcXVvdGluZyA9IE5VTEw7Ci0JUHlPYmplY3QgKnNraXBpbml0aWFsc3BhY2UgPSBOVUxMOwotCVB5T2JqZWN0ICpzdHJpY3QgPSBOVUxMOworICAgIERpYWxlY3RPYmogKnNlbGY7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRpYWxlY3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkZWxpbWl0ZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkb3VibGVxdW90ZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVzY2FwZWNoYXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsaW5ldGVybWluYXRvciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnF1b3RlY2hhciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnF1b3RpbmcgPSBOVUxMOworICAgIFB5T2JqZWN0ICpza2lwaW5pdGlhbHNwYWNlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RyaWN0ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKLQkJCQkJICJ8T09PT09PT09PIiwgZGlhbGVjdF9rd3MsCi0JCQkJCSAmZGlhbGVjdCwKLQkJCQkJICZkZWxpbWl0ZXIsCi0JCQkJCSAmZG91YmxlcXVvdGUsCi0JCQkJCSAmZXNjYXBlY2hhciwKLQkJCQkJICZsaW5ldGVybWluYXRvciwKLQkJCQkJICZxdW90ZWNoYXIsCi0JCQkJCSAmcXVvdGluZywKLQkJCQkJICZza2lwaW5pdGlhbHNwYWNlLAotCQkJCQkgJnN0cmljdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifE9PT09PT09PTyIsIGRpYWxlY3Rfa3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvdWJsZXF1b3RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlc2NhcGVjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW5ldGVybWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdGVjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdW90aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZza2lwaW5pdGlhbHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChkaWFsZWN0ICE9IE5VTEwpIHsKLQkJaWYgKElTX0JBU0VTVFJJTkcoZGlhbGVjdCkpIHsKLQkJCWRpYWxlY3QgPSBnZXRfZGlhbGVjdF9mcm9tX3JlZ2lzdHJ5KGRpYWxlY3QpOwotCQkJaWYgKGRpYWxlY3QgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlCi0JCQlQeV9JTkNSRUYoZGlhbGVjdCk7Ci0JCS8qIENhbiB3ZSByZXVzZSB0aGlzIGluc3RhbmNlPyAqLwotCQlpZiAoUHlPYmplY3RfVHlwZUNoZWNrKGRpYWxlY3QsICZEaWFsZWN0X1R5cGUpICYmCi0JCSAgICBkZWxpbWl0ZXIgPT0gMCAmJgotCQkgICAgZG91YmxlcXVvdGUgPT0gMCAmJgotCQkgICAgZXNjYXBlY2hhciA9PSAwICYmCi0JCSAgICBsaW5ldGVybWluYXRvciA9PSAwICYmCi0JCSAgICBxdW90ZWNoYXIgPT0gMCAmJgotCQkgICAgcXVvdGluZyA9PSAwICYmCi0JCSAgICBza2lwaW5pdGlhbHNwYWNlID09IDAgJiYKLQkJICAgIHN0cmljdCA9PSAwKQotCQkJcmV0dXJuIGRpYWxlY3Q7Ci0JfQorICAgIGlmIChkaWFsZWN0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKElTX0JBU0VTVFJJTkcoZGlhbGVjdCkpIHsKKyAgICAgICAgICAgIGRpYWxlY3QgPSBnZXRfZGlhbGVjdF9mcm9tX3JlZ2lzdHJ5KGRpYWxlY3QpOworICAgICAgICAgICAgaWYgKGRpYWxlY3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9JTkNSRUYoZGlhbGVjdCk7CisgICAgICAgIC8qIENhbiB3ZSByZXVzZSB0aGlzIGluc3RhbmNlPyAqLworICAgICAgICBpZiAoUHlPYmplY3RfVHlwZUNoZWNrKGRpYWxlY3QsICZEaWFsZWN0X1R5cGUpICYmCisgICAgICAgICAgICBkZWxpbWl0ZXIgPT0gMCAmJgorICAgICAgICAgICAgZG91YmxlcXVvdGUgPT0gMCAmJgorICAgICAgICAgICAgZXNjYXBlY2hhciA9PSAwICYmCisgICAgICAgICAgICBsaW5ldGVybWluYXRvciA9PSAwICYmCisgICAgICAgICAgICBxdW90ZWNoYXIgPT0gMCAmJgorICAgICAgICAgICAgcXVvdGluZyA9PSAwICYmCisgICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlID09IDAgJiYKKyAgICAgICAgICAgIHN0cmljdCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGRpYWxlY3Q7CisgICAgfQogCi0Jc2VsZiA9IChEaWFsZWN0T2JqICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKGRpYWxlY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZi0+bGluZXRlcm1pbmF0b3IgPSBOVUxMOworICAgIHNlbGYgPSAoRGlhbGVjdE9iaiAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihkaWFsZWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlbGYtPmxpbmV0ZXJtaW5hdG9yID0gTlVMTDsKIAotCVB5X1hJTkNSRUYoZGVsaW1pdGVyKTsKLQlQeV9YSU5DUkVGKGRvdWJsZXF1b3RlKTsKLQlQeV9YSU5DUkVGKGVzY2FwZWNoYXIpOwotCVB5X1hJTkNSRUYobGluZXRlcm1pbmF0b3IpOwotCVB5X1hJTkNSRUYocXVvdGVjaGFyKTsKLQlQeV9YSU5DUkVGKHF1b3RpbmcpOwotCVB5X1hJTkNSRUYoc2tpcGluaXRpYWxzcGFjZSk7Ci0JUHlfWElOQ1JFRihzdHJpY3QpOwotCWlmIChkaWFsZWN0ICE9IE5VTEwpIHsKKyAgICBQeV9YSU5DUkVGKGRlbGltaXRlcik7CisgICAgUHlfWElOQ1JFRihkb3VibGVxdW90ZSk7CisgICAgUHlfWElOQ1JFRihlc2NhcGVjaGFyKTsKKyAgICBQeV9YSU5DUkVGKGxpbmV0ZXJtaW5hdG9yKTsKKyAgICBQeV9YSU5DUkVGKHF1b3RlY2hhcik7CisgICAgUHlfWElOQ1JFRihxdW90aW5nKTsKKyAgICBQeV9YSU5DUkVGKHNraXBpbml0aWFsc3BhY2UpOworICAgIFB5X1hJTkNSRUYoc3RyaWN0KTsKKyAgICBpZiAoZGlhbGVjdCAhPSBOVUxMKSB7CiAjZGVmaW5lIERJQUxFQ1RfR0VUQVRUUih2LCBuKSBcCi0JCWlmICh2ID09IE5VTEwpIFwKLQkJCXYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRpYWxlY3QsIG4pCi0JCURJQUxFQ1RfR0VUQVRUUihkZWxpbWl0ZXIsICJkZWxpbWl0ZXIiKTsKLQkJRElBTEVDVF9HRVRBVFRSKGRvdWJsZXF1b3RlLCAiZG91YmxlcXVvdGUiKTsKLQkJRElBTEVDVF9HRVRBVFRSKGVzY2FwZWNoYXIsICJlc2NhcGVjaGFyIik7Ci0JCURJQUxFQ1RfR0VUQVRUUihsaW5ldGVybWluYXRvciwgImxpbmV0ZXJtaW5hdG9yIik7Ci0JCURJQUxFQ1RfR0VUQVRUUihxdW90ZWNoYXIsICJxdW90ZWNoYXIiKTsKLQkJRElBTEVDVF9HRVRBVFRSKHF1b3RpbmcsICJxdW90aW5nIik7Ci0JCURJQUxFQ1RfR0VUQVRUUihza2lwaW5pdGlhbHNwYWNlLCAic2tpcGluaXRpYWxzcGFjZSIpOwotCQlESUFMRUNUX0dFVEFUVFIoc3RyaWN0LCAic3RyaWN0Iik7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQorICAgICAgICBpZiAodiA9PSBOVUxMKSBcCisgICAgICAgICAgICB2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkaWFsZWN0LCBuKQorICAgICAgICBESUFMRUNUX0dFVEFUVFIoZGVsaW1pdGVyLCAiZGVsaW1pdGVyIik7CisgICAgICAgIERJQUxFQ1RfR0VUQVRUUihkb3VibGVxdW90ZSwgImRvdWJsZXF1b3RlIik7CisgICAgICAgIERJQUxFQ1RfR0VUQVRUUihlc2NhcGVjaGFyLCAiZXNjYXBlY2hhciIpOworICAgICAgICBESUFMRUNUX0dFVEFUVFIobGluZXRlcm1pbmF0b3IsICJsaW5ldGVybWluYXRvciIpOworICAgICAgICBESUFMRUNUX0dFVEFUVFIocXVvdGVjaGFyLCAicXVvdGVjaGFyIik7CisgICAgICAgIERJQUxFQ1RfR0VUQVRUUihxdW90aW5nLCAicXVvdGluZyIpOworICAgICAgICBESUFMRUNUX0dFVEFUVFIoc2tpcGluaXRpYWxzcGFjZSwgInNraXBpbml0aWFsc3BhY2UiKTsKKyAgICAgICAgRElBTEVDVF9HRVRBVFRSKHN0cmljdCwgInN0cmljdCIpOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KIAotCS8qIGNoZWNrIHR5cGVzIGFuZCBjb252ZXJ0IHRvIEMgdmFsdWVzICovCisgICAgLyogY2hlY2sgdHlwZXMgYW5kIGNvbnZlcnQgdG8gQyB2YWx1ZXMgKi8KICNkZWZpbmUgRElBU0VUKG1ldGgsIG5hbWUsIHRhcmdldCwgc3JjLCBkZmx0KSBcCi0JaWYgKG1ldGgobmFtZSwgdGFyZ2V0LCBzcmMsIGRmbHQpKSBcCi0JCWdvdG8gZXJyCi0JRElBU0VUKF9zZXRfY2hhciwgImRlbGltaXRlciIsICZzZWxmLT5kZWxpbWl0ZXIsIGRlbGltaXRlciwgJywnKTsKLQlESUFTRVQoX3NldF9ib29sLCAiZG91YmxlcXVvdGUiLCAmc2VsZi0+ZG91YmxlcXVvdGUsIGRvdWJsZXF1b3RlLCAxKTsKLQlESUFTRVQoX3NldF9jaGFyLCAiZXNjYXBlY2hhciIsICZzZWxmLT5lc2NhcGVjaGFyLCBlc2NhcGVjaGFyLCAwKTsKLQlESUFTRVQoX3NldF9zdHIsICJsaW5ldGVybWluYXRvciIsICZzZWxmLT5saW5ldGVybWluYXRvciwgbGluZXRlcm1pbmF0b3IsICJcclxuIik7Ci0JRElBU0VUKF9zZXRfY2hhciwgInF1b3RlY2hhciIsICZzZWxmLT5xdW90ZWNoYXIsIHF1b3RlY2hhciwgJyInKTsKLQlESUFTRVQoX3NldF9pbnQsICJxdW90aW5nIiwgJnNlbGYtPnF1b3RpbmcsIHF1b3RpbmcsIFFVT1RFX01JTklNQUwpOwotCURJQVNFVChfc2V0X2Jvb2wsICJza2lwaW5pdGlhbHNwYWNlIiwgJnNlbGYtPnNraXBpbml0aWFsc3BhY2UsIHNraXBpbml0aWFsc3BhY2UsIDApOwotCURJQVNFVChfc2V0X2Jvb2wsICJzdHJpY3QiLCAmc2VsZi0+c3RyaWN0LCBzdHJpY3QsIDApOworICAgIGlmIChtZXRoKG5hbWUsIHRhcmdldCwgc3JjLCBkZmx0KSkgXAorICAgICAgICBnb3RvIGVycgorICAgIERJQVNFVChfc2V0X2NoYXIsICJkZWxpbWl0ZXIiLCAmc2VsZi0+ZGVsaW1pdGVyLCBkZWxpbWl0ZXIsICcsJyk7CisgICAgRElBU0VUKF9zZXRfYm9vbCwgImRvdWJsZXF1b3RlIiwgJnNlbGYtPmRvdWJsZXF1b3RlLCBkb3VibGVxdW90ZSwgMSk7CisgICAgRElBU0VUKF9zZXRfY2hhciwgImVzY2FwZWNoYXIiLCAmc2VsZi0+ZXNjYXBlY2hhciwgZXNjYXBlY2hhciwgMCk7CisgICAgRElBU0VUKF9zZXRfc3RyLCAibGluZXRlcm1pbmF0b3IiLCAmc2VsZi0+bGluZXRlcm1pbmF0b3IsIGxpbmV0ZXJtaW5hdG9yLCAiXHJcbiIpOworICAgIERJQVNFVChfc2V0X2NoYXIsICJxdW90ZWNoYXIiLCAmc2VsZi0+cXVvdGVjaGFyLCBxdW90ZWNoYXIsICciJyk7CisgICAgRElBU0VUKF9zZXRfaW50LCAicXVvdGluZyIsICZzZWxmLT5xdW90aW5nLCBxdW90aW5nLCBRVU9URV9NSU5JTUFMKTsKKyAgICBESUFTRVQoX3NldF9ib29sLCAic2tpcGluaXRpYWxzcGFjZSIsICZzZWxmLT5za2lwaW5pdGlhbHNwYWNlLCBza2lwaW5pdGlhbHNwYWNlLCAwKTsKKyAgICBESUFTRVQoX3NldF9ib29sLCAic3RyaWN0IiwgJnNlbGYtPnN0cmljdCwgc3RyaWN0LCAwKTsKIAotCS8qIHZhbGlkYXRlIG9wdGlvbnMgKi8KLQlpZiAoZGlhbGVjdF9jaGVja19xdW90aW5nKHNlbGYtPnF1b3RpbmcpKQotCQlnb3RvIGVycjsKLQlpZiAoc2VsZi0+ZGVsaW1pdGVyID09IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGVsaW1pdGVyIG11c3QgYmUgc2V0Iik7Ci0JCWdvdG8gZXJyOwotCX0KLQlpZiAocXVvdGVjaGFyID09IFB5X05vbmUgJiYgcXVvdGluZyA9PSBOVUxMKQotCQlzZWxmLT5xdW90aW5nID0gUVVPVEVfTk9ORTsKLQlpZiAoc2VsZi0+cXVvdGluZyAhPSBRVU9URV9OT05FICYmIHNlbGYtPnF1b3RlY2hhciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJInF1b3RlY2hhciBtdXN0IGJlIHNldCBpZiBxdW90aW5nIGVuYWJsZWQiKTsKLQkJZ290byBlcnI7Ci0JfQotCWlmIChzZWxmLT5saW5ldGVybWluYXRvciA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsaW5ldGVybWluYXRvciBtdXN0IGJlIHNldCIpOwotCQlnb3RvIGVycjsKLQl9CisgICAgLyogdmFsaWRhdGUgb3B0aW9ucyAqLworICAgIGlmIChkaWFsZWN0X2NoZWNrX3F1b3Rpbmcoc2VsZi0+cXVvdGluZykpCisgICAgICAgIGdvdG8gZXJyOworICAgIGlmIChzZWxmLT5kZWxpbWl0ZXIgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGVsaW1pdGVyIG11c3QgYmUgc2V0Iik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAocXVvdGVjaGFyID09IFB5X05vbmUgJiYgcXVvdGluZyA9PSBOVUxMKQorICAgICAgICBzZWxmLT5xdW90aW5nID0gUVVPVEVfTk9ORTsKKyAgICBpZiAoc2VsZi0+cXVvdGluZyAhPSBRVU9URV9OT05FICYmIHNlbGYtPnF1b3RlY2hhciA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicXVvdGVjaGFyIG11c3QgYmUgc2V0IGlmIHF1b3RpbmcgZW5hYmxlZCIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgaWYgKHNlbGYtPmxpbmV0ZXJtaW5hdG9yID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxpbmV0ZXJtaW5hdG9yIG11c3QgYmUgc2V0Iik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KIAotCXJldCA9IChQeU9iamVjdCAqKXNlbGY7Ci0JUHlfSU5DUkVGKHNlbGYpOworICAgIHJldCA9IChQeU9iamVjdCAqKXNlbGY7CisgICAgUHlfSU5DUkVGKHNlbGYpOwogZXJyOgotCVB5X1hERUNSRUYoc2VsZik7Ci0JUHlfWERFQ1JFRihkaWFsZWN0KTsKLQlQeV9YREVDUkVGKGRlbGltaXRlcik7Ci0JUHlfWERFQ1JFRihkb3VibGVxdW90ZSk7Ci0JUHlfWERFQ1JFRihlc2NhcGVjaGFyKTsKLQlQeV9YREVDUkVGKGxpbmV0ZXJtaW5hdG9yKTsKLQlQeV9YREVDUkVGKHF1b3RlY2hhcik7Ci0JUHlfWERFQ1JFRihxdW90aW5nKTsKLQlQeV9YREVDUkVGKHNraXBpbml0aWFsc3BhY2UpOwotCVB5X1hERUNSRUYoc3RyaWN0KTsKLQlyZXR1cm4gcmV0OworICAgIFB5X1hERUNSRUYoc2VsZik7CisgICAgUHlfWERFQ1JFRihkaWFsZWN0KTsKKyAgICBQeV9YREVDUkVGKGRlbGltaXRlcik7CisgICAgUHlfWERFQ1JFRihkb3VibGVxdW90ZSk7CisgICAgUHlfWERFQ1JFRihlc2NhcGVjaGFyKTsKKyAgICBQeV9YREVDUkVGKGxpbmV0ZXJtaW5hdG9yKTsKKyAgICBQeV9YREVDUkVGKHF1b3RlY2hhcik7CisgICAgUHlfWERFQ1JFRihxdW90aW5nKTsKKyAgICBQeV9YREVDUkVGKHNraXBpbml0aWFsc3BhY2UpOworICAgIFB5X1hERUNSRUYoc3RyaWN0KTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKLVB5RG9jX1NUUlZBUihEaWFsZWN0X1R5cGVfZG9jLCAKK1B5RG9jX1NUUlZBUihEaWFsZWN0X1R5cGVfZG9jLAogIkNTViBkaWFsZWN0XG4iCiAiXG4iCiAiVGhlIERpYWxlY3QgdHlwZSByZWNvcmRzIENTViBwYXJzaW5nIGFuZCBnZW5lcmF0aW9uIG9wdGlvbnMuXG4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBEaWFsZWN0X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jc3YuRGlhbGVjdCIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KLQlzaXplb2YoRGlhbGVjdE9iaiksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCi0JLyogIG1ldGhvZHMgICovCi0JKGRlc3RydWN0b3IpRGlhbGVjdF9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkoZ2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCShzZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9zdHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQlEaWFsZWN0X1R5cGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotICAgICAgICBEaWFsZWN0X21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgICAgICBEaWFsZWN0X2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWRpYWxlY3RfbmV3LAkJCSAgICAgICAgLyogdHBfbmV3ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2Nzdi5EaWFsZWN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihEaWFsZWN0T2JqKSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiAgbWV0aG9kcyAgKi8KKyAgICAoZGVzdHJ1Y3RvcilEaWFsZWN0X2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgKHNldGF0dHJmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgRGlhbGVjdF9UeXBlX2RvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgRGlhbGVjdF9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBEaWFsZWN0X2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkaWFsZWN0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoKQEAgLTUwOSwxNSArNTA5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NhbGxfZGlhbGVjdChQeU9iamVjdCAqZGlhbGVjdF9pbnN0LCBQeU9iamVjdCAqa3dhcmdzKQogewotCVB5T2JqZWN0ICpjdG9yX2FyZ3M7Ci0JUHlPYmplY3QgKmRpYWxlY3Q7CisgICAgUHlPYmplY3QgKmN0b3JfYXJnczsKKyAgICBQeU9iamVjdCAqZGlhbGVjdDsKIAotCWN0b3JfYXJncyA9IFB5X0J1aWxkVmFsdWUoZGlhbGVjdF9pbnN0ID8gIihPKSIgOiAiKCkiLCBkaWFsZWN0X2luc3QpOwotCWlmIChjdG9yX2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZGlhbGVjdCA9IFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0ICopJkRpYWxlY3RfVHlwZSwgY3Rvcl9hcmdzLCBrd2FyZ3MpOwotCVB5X0RFQ1JFRihjdG9yX2FyZ3MpOwotCXJldHVybiBkaWFsZWN0OworICAgIGN0b3JfYXJncyA9IFB5X0J1aWxkVmFsdWUoZGlhbGVjdF9pbnN0ID8gIihPKSIgOiAiKCkiLCBkaWFsZWN0X2luc3QpOworICAgIGlmIChjdG9yX2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGlhbGVjdCA9IFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0ICopJkRpYWxlY3RfVHlwZSwgY3Rvcl9hcmdzLCBrd2FyZ3MpOworICAgIFB5X0RFQ1JFRihjdG9yX2FyZ3MpOworICAgIHJldHVybiBkaWFsZWN0OwogfQogCiAvKgpAQCAtNTI2LDMzMCArNTI2LDMzMCBAQAogc3RhdGljIGludAogcGFyc2Vfc2F2ZV9maWVsZChSZWFkZXJPYmogKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZpZWxkOworICAgIFB5T2JqZWN0ICpmaWVsZDsKIAotCWZpZWxkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+ZmllbGQsIHNlbGYtPmZpZWxkX2xlbik7Ci0JaWYgKGZpZWxkID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlzZWxmLT5maWVsZF9sZW4gPSAwOwotCWlmIChzZWxmLT5udW1lcmljX2ZpZWxkKSB7Ci0JCVB5T2JqZWN0ICp0bXA7CisgICAgZmllbGQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5maWVsZCwgc2VsZi0+ZmllbGRfbGVuKTsKKyAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlbGYtPmZpZWxkX2xlbiA9IDA7CisgICAgaWYgKHNlbGYtPm51bWVyaWNfZmllbGQpIHsKKyAgICAgICAgUHlPYmplY3QgKnRtcDsKIAotCQlzZWxmLT5udW1lcmljX2ZpZWxkID0gMDsKLQkJdG1wID0gUHlOdW1iZXJfRmxvYXQoZmllbGQpOwotCQlpZiAodG1wID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmaWVsZCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfREVDUkVGKGZpZWxkKTsKLQkJZmllbGQgPSB0bXA7Ci0JfQotCVB5TGlzdF9BcHBlbmQoc2VsZi0+ZmllbGRzLCBmaWVsZCk7Ci0JUHlfREVDUkVGKGZpZWxkKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgc2VsZi0+bnVtZXJpY19maWVsZCA9IDA7CisgICAgICAgIHRtcCA9IFB5TnVtYmVyX0Zsb2F0KGZpZWxkKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihmaWVsZCk7CisgICAgICAgIGZpZWxkID0gdG1wOworICAgIH0KKyAgICBQeUxpc3RfQXBwZW5kKHNlbGYtPmZpZWxkcywgZmllbGQpOworICAgIFB5X0RFQ1JFRihmaWVsZCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHBhcnNlX2dyb3dfYnVmZihSZWFkZXJPYmogKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmZpZWxkX3NpemUgPT0gMCkgewotCQlzZWxmLT5maWVsZF9zaXplID0gNDA5NjsKLQkJaWYgKHNlbGYtPmZpZWxkICE9IE5VTEwpCi0JCQlQeU1lbV9GcmVlKHNlbGYtPmZpZWxkKTsKLQkJc2VsZi0+ZmllbGQgPSBQeU1lbV9NYWxsb2Moc2VsZi0+ZmllbGRfc2l6ZSk7Ci0JfQotCWVsc2UgewotCQlpZiAoc2VsZi0+ZmllbGRfc2l6ZSA+IElOVF9NQVggLyAyKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIDA7Ci0JCX0gCi0JCXNlbGYtPmZpZWxkX3NpemUgKj0gMjsKLQkJc2VsZi0+ZmllbGQgPSBQeU1lbV9SZWFsbG9jKHNlbGYtPmZpZWxkLCBzZWxmLT5maWVsZF9zaXplKTsKLQl9Ci0JaWYgKHNlbGYtPmZpZWxkID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChzZWxmLT5maWVsZF9zaXplID09IDApIHsKKyAgICAgICAgc2VsZi0+ZmllbGRfc2l6ZSA9IDQwOTY7CisgICAgICAgIGlmIChzZWxmLT5maWVsZCAhPSBOVUxMKQorICAgICAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5maWVsZCk7CisgICAgICAgIHNlbGYtPmZpZWxkID0gUHlNZW1fTWFsbG9jKHNlbGYtPmZpZWxkX3NpemUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNlbGYtPmZpZWxkX3NpemUgPiBJTlRfTUFYIC8gMikgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmZpZWxkX3NpemUgKj0gMjsKKyAgICAgICAgc2VsZi0+ZmllbGQgPSBQeU1lbV9SZWFsbG9jKHNlbGYtPmZpZWxkLCBzZWxmLT5maWVsZF9zaXplKTsKKyAgICB9CisgICAgaWYgKHNlbGYtPmZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBwYXJzZV9hZGRfY2hhcihSZWFkZXJPYmogKnNlbGYsIGNoYXIgYykKIHsKLQlpZiAoc2VsZi0+ZmllbGRfbGVuID49IGZpZWxkX2xpbWl0KSB7Ci0JCVB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJmaWVsZCBsYXJnZXIgdGhhbiBmaWVsZCBsaW1pdCAoJWxkKSIsCi0JCQkgICAgIGZpZWxkX2xpbWl0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoc2VsZi0+ZmllbGRfbGVuID09IHNlbGYtPmZpZWxkX3NpemUgJiYgIXBhcnNlX2dyb3dfYnVmZihzZWxmKSkKLQkJcmV0dXJuIC0xOwotCXNlbGYtPmZpZWxkW3NlbGYtPmZpZWxkX2xlbisrXSA9IGM7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNlbGYtPmZpZWxkX2xlbiA+PSBmaWVsZF9saW1pdCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAiZmllbGQgbGFyZ2VyIHRoYW4gZmllbGQgbGltaXQgKCVsZCkiLAorICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGltaXQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzZWxmLT5maWVsZF9sZW4gPT0gc2VsZi0+ZmllbGRfc2l6ZSAmJiAhcGFyc2VfZ3Jvd19idWZmKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2VsZi0+ZmllbGRbc2VsZi0+ZmllbGRfbGVuKytdID0gYzsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogcGFyc2VfcHJvY2Vzc19jaGFyKFJlYWRlck9iaiAqc2VsZiwgY2hhciBjKQogewotICAgICAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKIAotCXN3aXRjaCAoc2VsZi0+c3RhdGUpIHsKLQljYXNlIFNUQVJUX1JFQ09SRDoKLQkJLyogc3RhcnQgb2YgcmVjb3JkICovCi0JCWlmIChjID09ICdcMCcpCi0JCQkvKiBlbXB0eSBsaW5lIC0gcmV0dXJuIFtdICovCi0JCQlicmVhazsKLQkJZWxzZSBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykgewotCQkJc2VsZi0+c3RhdGUgPSBFQVRfQ1JOTDsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBoYW5kbGUgYXMgU1RBUlRfRklFTEQgKi8KLQkJc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKLQkJLyogZmFsbHRocnUgKi8KLQljYXNlIFNUQVJUX0ZJRUxEOgotCQkvKiBleHBlY3RpbmcgZmllbGQgKi8KLQkJaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7Ci0JCQkvKiBzYXZlIGVtcHR5IGZpZWxkIC0gcmV0dXJuIFtmaWVsZHNdICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyICYmIAotCQkJIGRpYWxlY3QtPnF1b3RpbmcgIT0gUVVPVEVfTk9ORSkgewotCQkJLyogc3RhcnQgcXVvdGVkIGZpZWxkICovCi0JCQlzZWxmLT5zdGF0ZSA9IElOX1FVT1RFRF9GSUVMRDsKLQkJfQotCQllbHNlIGlmIChjID09IGRpYWxlY3QtPmVzY2FwZWNoYXIpIHsKLQkJCS8qIHBvc3NpYmxlIGVzY2FwZWQgY2hhcmFjdGVyICovCi0JCQlzZWxmLT5zdGF0ZSA9IEVTQ0FQRURfQ0hBUjsKLQkJfQotCQllbHNlIGlmIChjID09ICcgJyAmJiBkaWFsZWN0LT5za2lwaW5pdGlhbHNwYWNlKQotCQkJLyogaWdub3JlIHNwYWNlIGF0IHN0YXJ0IG9mIGZpZWxkICovCi0JCQk7Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7Ci0JCQkvKiBzYXZlIGVtcHR5IGZpZWxkICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJLyogYmVnaW4gbmV3IHVucXVvdGVkIGZpZWxkICovCi0JCQlpZiAoZGlhbGVjdC0+cXVvdGluZyA9PSBRVU9URV9OT05OVU1FUklDKQotCQkJCXNlbGYtPm51bWVyaWNfZmllbGQgPSAxOwotCQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlzZWxmLT5zdGF0ZSA9IElOX0ZJRUxEOwotCQl9Ci0JCWJyZWFrOworICAgIHN3aXRjaCAoc2VsZi0+c3RhdGUpIHsKKyAgICBjYXNlIFNUQVJUX1JFQ09SRDoKKyAgICAgICAgLyogc3RhcnQgb2YgcmVjb3JkICovCisgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICAvKiBlbXB0eSBsaW5lIC0gcmV0dXJuIFtdICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykgeworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBFQVRfQ1JOTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBoYW5kbGUgYXMgU1RBUlRfRklFTEQgKi8KKyAgICAgICAgc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKKyAgICAgICAgLyogZmFsbHRocnUgKi8KKyAgICBjYXNlIFNUQVJUX0ZJRUxEOgorICAgICAgICAvKiBleHBlY3RpbmcgZmllbGQgKi8KKyAgICAgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7CisgICAgICAgICAgICAvKiBzYXZlIGVtcHR5IGZpZWxkIC0gcmV0dXJuIFtmaWVsZHNdICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyICYmCisgICAgICAgICAgICAgICAgIGRpYWxlY3QtPnF1b3RpbmcgIT0gUVVPVEVfTk9ORSkgeworICAgICAgICAgICAgLyogc3RhcnQgcXVvdGVkIGZpZWxkICovCisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IElOX1FVT1RFRF9GSUVMRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09IGRpYWxlY3QtPmVzY2FwZWNoYXIpIHsKKyAgICAgICAgICAgIC8qIHBvc3NpYmxlIGVzY2FwZWQgY2hhcmFjdGVyICovCisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IEVTQ0FQRURfQ0hBUjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09ICcgJyAmJiBkaWFsZWN0LT5za2lwaW5pdGlhbHNwYWNlKQorICAgICAgICAgICAgLyogaWdub3JlIHNwYWNlIGF0IHN0YXJ0IG9mIGZpZWxkICovCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7CisgICAgICAgICAgICAvKiBzYXZlIGVtcHR5IGZpZWxkICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogYmVnaW4gbmV3IHVucXVvdGVkIGZpZWxkICovCisgICAgICAgICAgICBpZiAoZGlhbGVjdC0+cXVvdGluZyA9PSBRVU9URV9OT05OVU1FUklDKQorICAgICAgICAgICAgICAgIHNlbGYtPm51bWVyaWNfZmllbGQgPSAxOworICAgICAgICAgICAgaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IElOX0ZJRUxEOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBFU0NBUEVEX0NIQVI6Ci0JCWlmIChjID09ICdcMCcpCi0JCQljID0gJ1xuJzsKLQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJc2VsZi0+c3RhdGUgPSBJTl9GSUVMRDsKLQkJYnJlYWs7CisgICAgY2FzZSBFU0NBUEVEX0NIQVI6CisgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICBjID0gJ1xuJzsKKyAgICAgICAgaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2VsZi0+c3RhdGUgPSBJTl9GSUVMRDsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIElOX0ZJRUxEOgotCQkvKiBpbiB1bnF1b3RlZCBmaWVsZCAqLwotCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcMCcpIHsKLQkJCS8qIGVuZCBvZiBsaW5lIC0gcmV0dXJuIFtmaWVsZHNdICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZXNjYXBlY2hhcikgewotCQkJLyogcG9zc2libGUgZXNjYXBlZCBjaGFyYWN0ZXIgKi8KLQkJCXNlbGYtPnN0YXRlID0gRVNDQVBFRF9DSEFSOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7Ci0JCQkvKiBzYXZlIGZpZWxkIC0gd2FpdCBmb3IgbmV3IGZpZWxkICovCi0JCQlpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKLQkJfQotCQllbHNlIHsKLQkJCS8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBzYXZlIGluIGZpZWxkICovCi0JCQlpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlIElOX0ZJRUxEOgorICAgICAgICAvKiBpbiB1bnF1b3RlZCBmaWVsZCAqLworICAgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcMCcpIHsKKyAgICAgICAgICAgIC8qIGVuZCBvZiBsaW5lIC0gcmV0dXJuIFtmaWVsZHNdICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSAoYyA9PSAnXDAnID8gU1RBUlRfUkVDT1JEIDogRUFUX0NSTkwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZXNjYXBlY2hhcikgeworICAgICAgICAgICAgLyogcG9zc2libGUgZXNjYXBlZCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gRVNDQVBFRF9DSEFSOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gZGlhbGVjdC0+ZGVsaW1pdGVyKSB7CisgICAgICAgICAgICAvKiBzYXZlIGZpZWxkIC0gd2FpdCBmb3IgbmV3IGZpZWxkICovCisgICAgICAgICAgICBpZiAocGFyc2Vfc2F2ZV9maWVsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBTVEFSVF9GSUVMRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vcm1hbCBjaGFyYWN0ZXIgLSBzYXZlIGluIGZpZWxkICovCisgICAgICAgICAgICBpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCWNhc2UgSU5fUVVPVEVEX0ZJRUxEOgotCQkvKiBpbiBxdW90ZWQgZmllbGQgKi8KLQkJaWYgKGMgPT0gJ1wwJykKLQkJCTsKLQkJZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5lc2NhcGVjaGFyKSB7Ci0JCQkvKiBQb3NzaWJsZSBlc2NhcGUgY2hhcmFjdGVyICovCi0JCQlzZWxmLT5zdGF0ZSA9IEVTQ0FQRV9JTl9RVU9URURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5xdW90ZWNoYXIgJiYKLQkJCSBkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUpIHsKLQkJCWlmIChkaWFsZWN0LT5kb3VibGVxdW90ZSkgewotCQkJCS8qIGRvdWJsZXF1b3RlOyAiIHJlcHJlc2VudGVkIGJ5ICIiICovCi0JCQkJc2VsZi0+c3RhdGUgPSBRVU9URV9JTl9RVU9URURfRklFTEQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBlbmQgb2YgcXVvdGUgcGFydCBvZiBmaWVsZCAqLwotCQkJCXNlbGYtPnN0YXRlID0gSU5fRklFTEQ7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBub3JtYWwgY2hhcmFjdGVyIC0gc2F2ZSBpbiBmaWVsZCAqLwotCQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSBJTl9RVU9URURfRklFTEQ6CisgICAgICAgIC8qIGluIHF1b3RlZCBmaWVsZCAqLworICAgICAgICBpZiAoYyA9PSAnXDAnKQorICAgICAgICAgICAgOworICAgICAgICBlbHNlIGlmIChjID09IGRpYWxlY3QtPmVzY2FwZWNoYXIpIHsKKyAgICAgICAgICAgIC8qIFBvc3NpYmxlIGVzY2FwZSBjaGFyYWN0ZXIgKi8KKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gRVNDQVBFX0lOX1FVT1RFRF9GSUVMRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09IGRpYWxlY3QtPnF1b3RlY2hhciAmJgorICAgICAgICAgICAgICAgICBkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUpIHsKKyAgICAgICAgICAgIGlmIChkaWFsZWN0LT5kb3VibGVxdW90ZSkgeworICAgICAgICAgICAgICAgIC8qIGRvdWJsZXF1b3RlOyAiIHJlcHJlc2VudGVkIGJ5ICIiICovCisgICAgICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBRVU9URV9JTl9RVU9URURfRklFTEQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBlbmQgb2YgcXVvdGUgcGFydCBvZiBmaWVsZCAqLworICAgICAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gSU5fRklFTEQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBub3JtYWwgY2hhcmFjdGVyIC0gc2F2ZSBpbiBmaWVsZCAqLworICAgICAgICAgICAgaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEVTQ0FQRV9JTl9RVU9URURfRklFTEQ6Ci0JCWlmIChjID09ICdcMCcpCi0JCQljID0gJ1xuJzsKLQkJaWYgKHBhcnNlX2FkZF9jaGFyKHNlbGYsIGMpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJc2VsZi0+c3RhdGUgPSBJTl9RVU9URURfRklFTEQ7Ci0JCWJyZWFrOworICAgIGNhc2UgRVNDQVBFX0lOX1FVT1RFRF9GSUVMRDoKKyAgICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGMgPSAnXG4nOworICAgICAgICBpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzZWxmLT5zdGF0ZSA9IElOX1FVT1RFRF9GSUVMRDsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFFVT1RFX0lOX1FVT1RFRF9GSUVMRDoKLQkJLyogZG91YmxlcXVvdGUgLSBzZWVuIGEgcXVvdGUgaW4gYW4gcXVvdGVkIGZpZWxkICovCi0JCWlmIChkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUgJiYgCi0gICAgICAgICAgICAgICAgICAgIGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyKSB7Ci0JCQkvKiBzYXZlICIiIGFzICIgKi8KLQkJCWlmIChwYXJzZV9hZGRfY2hhcihzZWxmLCBjKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJc2VsZi0+c3RhdGUgPSBJTl9RVU9URURfRklFTEQ7Ci0JCX0KLQkJZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5kZWxpbWl0ZXIpIHsKLQkJCS8qIHNhdmUgZmllbGQgLSB3YWl0IGZvciBuZXcgZmllbGQgKi8KLQkJCWlmIChwYXJzZV9zYXZlX2ZpZWxkKHNlbGYpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlzZWxmLT5zdGF0ZSA9IFNUQVJUX0ZJRUxEOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7Ci0JCQkvKiBlbmQgb2YgbGluZSAtIHJldHVybiBbZmllbGRzXSAqLwotCQkJaWYgKHBhcnNlX3NhdmVfZmllbGQoc2VsZikgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCXNlbGYtPnN0YXRlID0gKGMgPT0gJ1wwJyA/IFNUQVJUX1JFQ09SRCA6IEVBVF9DUk5MKTsKLQkJfQotCQllbHNlIGlmICghZGlhbGVjdC0+c3RyaWN0KSB7Ci0JCQlpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCXNlbGYtPnN0YXRlID0gSU5fRklFTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBpbGxlZ2FsICovCi0JCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAiJyVjJyBleHBlY3RlZCBhZnRlciAnJWMnIiwgCi0JCQkJCWRpYWxlY3QtPmRlbGltaXRlciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdC0+cXVvdGVjaGFyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlIFFVT1RFX0lOX1FVT1RFRF9GSUVMRDoKKyAgICAgICAgLyogZG91YmxlcXVvdGUgLSBzZWVuIGEgcXVvdGUgaW4gYW4gcXVvdGVkIGZpZWxkICovCisgICAgICAgIGlmIChkaWFsZWN0LT5xdW90aW5nICE9IFFVT1RFX05PTkUgJiYKKyAgICAgICAgICAgIGMgPT0gZGlhbGVjdC0+cXVvdGVjaGFyKSB7CisgICAgICAgICAgICAvKiBzYXZlICIiIGFzICIgKi8KKyAgICAgICAgICAgIGlmIChwYXJzZV9hZGRfY2hhcihzZWxmLCBjKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgc2VsZi0+c3RhdGUgPSBJTl9RVU9URURfRklFTEQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA9PSBkaWFsZWN0LT5kZWxpbWl0ZXIpIHsKKyAgICAgICAgICAgIC8qIHNhdmUgZmllbGQgLSB3YWl0IGZvciBuZXcgZmllbGQgKi8KKyAgICAgICAgICAgIGlmIChwYXJzZV9zYXZlX2ZpZWxkKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzZWxmLT5zdGF0ZSA9IFNUQVJUX0ZJRUxEOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAnXDAnKSB7CisgICAgICAgICAgICAvKiBlbmQgb2YgbGluZSAtIHJldHVybiBbZmllbGRzXSAqLworICAgICAgICAgICAgaWYgKHBhcnNlX3NhdmVfZmllbGQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gKGMgPT0gJ1wwJyA/IFNUQVJUX1JFQ09SRCA6IEVBVF9DUk5MKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghZGlhbGVjdC0+c3RyaWN0KSB7CisgICAgICAgICAgICBpZiAocGFyc2VfYWRkX2NoYXIoc2VsZiwgYykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gSU5fRklFTEQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBpbGxlZ2FsICovCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAiJyVjJyBleHBlY3RlZCBhZnRlciAnJWMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0LT5kZWxpbWl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbGVjdC0+cXVvdGVjaGFyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCWNhc2UgRUFUX0NSTkw6Ci0JCWlmIChjID09ICdcbicgfHwgYyA9PSAnXHInKQotCQkJOwotCQllbHNlIGlmIChjID09ICdcMCcpCi0JCQlzZWxmLT5zdGF0ZSA9IFNUQVJUX1JFQ09SRDsKLQkJZWxzZSB7Ci0JCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAibmV3LWxpbmUgY2hhcmFjdGVyIHNlZW4gaW4gdW5xdW90ZWQgZmllbGQgLSBkbyB5b3UgbmVlZCB0byBvcGVuIHRoZSBmaWxlIGluIHVuaXZlcnNhbC1uZXdsaW5lIG1vZGU/Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSBFQVRfQ1JOTDoKKyAgICAgICAgaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicpCisgICAgICAgICAgICA7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIHNlbGYtPnN0YXRlID0gU1RBUlRfUkVDT1JEOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJuZXctbGluZSBjaGFyYWN0ZXIgc2VlbiBpbiB1bnF1b3RlZCBmaWVsZCAtIGRvIHlvdSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgaW4gdW5pdmVyc2FsLW5ld2xpbmUgbW9kZT8iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotCX0KLQlyZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHBhcnNlX3Jlc2V0KFJlYWRlck9iaiAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPmZpZWxkcyk7Ci0Jc2VsZi0+ZmllbGRzID0gUHlMaXN0X05ldygwKTsKLQlpZiAoc2VsZi0+ZmllbGRzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlzZWxmLT5maWVsZF9sZW4gPSAwOwotCXNlbGYtPnN0YXRlID0gU1RBUlRfUkVDT1JEOwotCXNlbGYtPm51bWVyaWNfZmllbGQgPSAwOwotCXJldHVybiAwOworICAgIFB5X1hERUNSRUYoc2VsZi0+ZmllbGRzKTsKKyAgICBzZWxmLT5maWVsZHMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChzZWxmLT5maWVsZHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlbGYtPmZpZWxkX2xlbiA9IDA7CisgICAgc2VsZi0+c3RhdGUgPSBTVEFSVF9SRUNPUkQ7CisgICAgc2VsZi0+bnVtZXJpY19maWVsZCA9IDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBSZWFkZXJfaXRlcm5leHQoUmVhZGVyT2JqICpzZWxmKQogewotICAgICAgICBQeU9iamVjdCAqbGluZW9iajsKLSAgICAgICAgUHlPYmplY3QgKmZpZWxkcyA9IE5VTEw7Ci0gICAgICAgIGNoYXIgKmxpbmUsIGM7Ci0JaW50IGxpbmVsZW47CisgICAgUHlPYmplY3QgKmxpbmVvYmo7CisgICAgUHlPYmplY3QgKmZpZWxkcyA9IE5VTEw7CisgICAgY2hhciAqbGluZSwgYzsKKyAgICBpbnQgbGluZWxlbjsKIAotCWlmIChwYXJzZV9yZXNldChzZWxmKSA8IDApCi0JCXJldHVybiBOVUxMOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgbGluZW9iaiA9IFB5SXRlcl9OZXh0KHNlbGYtPmlucHV0X2l0ZXIpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lb2JqID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBvZiBpbnB1dCBPUiBleGNlcHRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSAmJiBzZWxmLT5maWVsZF9sZW4gIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KGVycm9yX29iaiwKLQkJCQkJICAgICAibmV3bGluZSBpbnNpZGUgc3RyaW5nIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0JCSsrc2VsZi0+bGluZV9udW07CisgICAgaWYgKHBhcnNlX3Jlc2V0KHNlbGYpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZG8geworICAgICAgICBsaW5lb2JqID0gUHlJdGVyX05leHQoc2VsZi0+aW5wdXRfaXRlcik7CisgICAgICAgIGlmIChsaW5lb2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEVuZCBvZiBpbnB1dCBPUiBleGNlcHRpb24gKi8KKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSAmJiBzZWxmLT5maWVsZF9sZW4gIT0gMCkKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3bGluZSBpbnNpZGUgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICArK3NlbGYtPmxpbmVfbnVtOwogCi0gICAgICAgICAgICAgICAgbGluZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGxpbmVvYmopOwotCQlsaW5lbGVuID0gUHlTdHJpbmdfU2l6ZShsaW5lb2JqKTsKKyAgICAgICAgbGluZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGxpbmVvYmopOworICAgICAgICBsaW5lbGVuID0gUHlTdHJpbmdfU2l6ZShsaW5lb2JqKTsKIAotICAgICAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwgfHwgbGluZWxlbiA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAobGluZWxlbi0tKSB7Ci0JCQljID0gKmxpbmUrKzsKLQkJCWlmIChjID09ICdcMCcpIHsKLQkJCQlQeV9ERUNSRUYobGluZW9iaik7Ci0JCQkJUHlFcnJfRm9ybWF0KGVycm9yX29iaiwKLQkJCQkJICAgICAibGluZSBjb250YWlucyBOVUxMIGJ5dGUiKTsKLQkJCQlnb3RvIGVycjsKLQkJCX0KLQkJCWlmIChwYXJzZV9wcm9jZXNzX2NoYXIoc2VsZiwgYykgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGxpbmVvYmopOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9CisgICAgICAgIGlmIChsaW5lID09IE5VTEwgfHwgbGluZWxlbiA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChsaW5lbGVuLS0pIHsKKyAgICAgICAgICAgIGMgPSAqbGluZSsrOworICAgICAgICAgICAgaWYgKGMgPT0gJ1wwJykgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKLQkJaWYgKHBhcnNlX3Byb2Nlc3NfY2hhcihzZWxmLCAwKSA8IDApCi0JCQlnb3RvIGVycjsKLSAgICAgICAgfSB3aGlsZSAoc2VsZi0+c3RhdGUgIT0gU1RBUlRfUkVDT1JEKTsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZSBjb250YWlucyBOVUxMIGJ5dGUiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJzZV9wcm9jZXNzX2NoYXIoc2VsZiwgYykgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxpbmVvYmopOworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihsaW5lb2JqKTsKKyAgICAgICAgaWYgKHBhcnNlX3Byb2Nlc3NfY2hhcihzZWxmLCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9IHdoaWxlIChzZWxmLT5zdGF0ZSAhPSBTVEFSVF9SRUNPUkQpOwogCi0gICAgICAgIGZpZWxkcyA9IHNlbGYtPmZpZWxkczsKLSAgICAgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKKyAgICBmaWVsZHMgPSBzZWxmLT5maWVsZHM7CisgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKIGVycjoKLSAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICByZXR1cm4gZmllbGRzOwogfQogCiBzdGF0aWMgdm9pZAogUmVhZGVyX2RlYWxsb2MoUmVhZGVyT2JqICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZGlhbGVjdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+aW5wdXRfaXRlcik7Ci0gICAgICAgIFB5X1hERUNSRUYoc2VsZi0+ZmllbGRzKTsKLSAgICAgICAgaWYgKHNlbGYtPmZpZWxkICE9IE5VTEwpCi0gICAgICAgIAlQeU1lbV9GcmVlKHNlbGYtPmZpZWxkKTsKLQlQeU9iamVjdF9HQ19EZWwoc2VsZik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmRpYWxlY3QpOworICAgIFB5X1hERUNSRUYoc2VsZi0+aW5wdXRfaXRlcik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maWVsZHMpOworICAgIGlmIChzZWxmLT5maWVsZCAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmZpZWxkKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIFJlYWRlcl90cmF2ZXJzZShSZWFkZXJPYmogKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNlbGYtPmRpYWxlY3QpOwotCVB5X1ZJU0lUKHNlbGYtPmlucHV0X2l0ZXIpOwotCVB5X1ZJU0lUKHNlbGYtPmZpZWxkcyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoc2VsZi0+ZGlhbGVjdCk7CisgICAgUHlfVklTSVQoc2VsZi0+aW5wdXRfaXRlcik7CisgICAgUHlfVklTSVQoc2VsZi0+ZmllbGRzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogUmVhZGVyX2NsZWFyKFJlYWRlck9iaiAqc2VsZikKIHsKLQlQeV9DTEVBUihzZWxmLT5kaWFsZWN0KTsKLQlQeV9DTEVBUihzZWxmLT5pbnB1dF9pdGVyKTsKLQlQeV9DTEVBUihzZWxmLT5maWVsZHMpOwotCXJldHVybiAwOworICAgIFB5X0NMRUFSKHNlbGYtPmRpYWxlY3QpOworICAgIFB5X0NMRUFSKHNlbGYtPmlucHV0X2l0ZXIpOworICAgIFB5X0NMRUFSKHNlbGYtPmZpZWxkcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5RG9jX1NUUlZBUihSZWFkZXJfVHlwZV9kb2MsCkBAIC04NjAsOTMgKzg2MCw5MyBAQAogKTsKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBSZWFkZXJfbWV0aG9kc1tdID0gewotCXsgTlVMTCwgTlVMTCB9CisgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAjZGVmaW5lIFJfT0ZGKHgpIG9mZnNldG9mKFJlYWRlck9iaiwgeCkKIAogc3RhdGljIHN0cnVjdCBQeU1lbWJlckRlZiBSZWFkZXJfbWVtYmVybGlzdFtdID0gewotCXsgImRpYWxlY3QiLCBUX09CSkVDVCwgUl9PRkYoZGlhbGVjdCksIFJPIH0sCi0JeyAibGluZV9udW0iLCBUX1VMT05HLCBSX09GRihsaW5lX251bSksIFJPIH0sCi0JeyBOVUxMIH0KKyAgICB7ICJkaWFsZWN0IiwgVF9PQkpFQ1QsIFJfT0ZGKGRpYWxlY3QpLCBSTyB9LAorICAgIHsgImxpbmVfbnVtIiwgVF9VTE9ORywgUl9PRkYobGluZV9udW0pLCBSTyB9LAorICAgIHsgTlVMTCB9CiB9OwogCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUmVhZGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jc3YucmVhZGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFJlYWRlck9iaiksICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVJlYWRlcl9kZWFsbG9jLCAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgIAkvKnRwX3N0ciovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAotCQlQeV9UUEZMQUdTX0hBVkVfR0MsCQkvKnRwX2ZsYWdzKi8KLQlSZWFkZXJfVHlwZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwotICAgICAgICAodHJhdmVyc2Vwcm9jKVJlYWRlcl90cmF2ZXJzZSwgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIChpbnF1aXJ5KVJlYWRlcl9jbGVhciwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIFB5T2JqZWN0X1NlbGZJdGVyLAkJICAgICAgICAvKnRwX2l0ZXIqLwotICAgICAgICAoZ2V0aXRlcmZ1bmMpUmVhZGVyX2l0ZXJuZXh0LCAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIFJlYWRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICBSZWFkZXJfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2Nzdi5yZWFkZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUmVhZGVyT2JqKSwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpUmVhZGVyX2RlYWxsb2MsICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgIFJlYWRlcl9UeXBlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgKHRyYXZlcnNlcHJvYylSZWFkZXJfdHJhdmVyc2UsICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIChpbnF1aXJ5KVJlYWRlcl9jbGVhciwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAoZ2V0aXRlcmZ1bmMpUmVhZGVyX2l0ZXJuZXh0LCAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgUmVhZGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgUmVhZGVyX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KIAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl9yZWFkZXIoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprZXl3b3JkX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKiBpdGVyYXRvciwgKiBkaWFsZWN0ID0gTlVMTDsKLSAgICAgICAgUmVhZGVyT2JqICogc2VsZiA9IFB5T2JqZWN0X0dDX05ldyhSZWFkZXJPYmosICZSZWFkZXJfVHlwZSk7CisgICAgUHlPYmplY3QgKiBpdGVyYXRvciwgKiBkaWFsZWN0ID0gTlVMTDsKKyAgICBSZWFkZXJPYmogKiBzZWxmID0gUHlPYmplY3RfR0NfTmV3KFJlYWRlck9iaiwgJlJlYWRlcl9UeXBlKTsKIAotICAgICAgICBpZiAoIXNlbGYpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBzZWxmLT5kaWFsZWN0ID0gTlVMTDsKLSAgICAgICAgc2VsZi0+ZmllbGRzID0gTlVMTDsKLSAgICAgICAgc2VsZi0+aW5wdXRfaXRlciA9IE5VTEw7Ci0Jc2VsZi0+ZmllbGQgPSBOVUxMOwotCXNlbGYtPmZpZWxkX3NpemUgPSAwOwotCXNlbGYtPmxpbmVfbnVtID0gMDsKKyAgICBzZWxmLT5kaWFsZWN0ID0gTlVMTDsKKyAgICBzZWxmLT5maWVsZHMgPSBOVUxMOworICAgIHNlbGYtPmlucHV0X2l0ZXIgPSBOVUxMOworICAgIHNlbGYtPmZpZWxkID0gTlVMTDsKKyAgICBzZWxmLT5maWVsZF9zaXplID0gMDsKKyAgICBzZWxmLT5saW5lX251bSA9IDA7CiAKLQlpZiAocGFyc2VfcmVzZXQoc2VsZikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlbGYpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocGFyc2VfcmVzZXQoc2VsZikgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJml0ZXJhdG9yLCAmZGlhbGVjdCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi0+aW5wdXRfaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmF0b3IpOwotICAgICAgICBpZiAoc2VsZi0+aW5wdXRfaXRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCAxIG11c3QgYmUgYW4gaXRlcmF0b3IiKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQlzZWxmLT5kaWFsZWN0ID0gKERpYWxlY3RPYmogKilfY2FsbF9kaWFsZWN0KGRpYWxlY3QsIGtleXdvcmRfYXJncyk7Ci0gICAgICAgIGlmIChzZWxmLT5kaWFsZWN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmaXRlcmF0b3IsICZkaWFsZWN0KSkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5pbnB1dF9pdGVyID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYXRvcik7CisgICAgaWYgKHNlbGYtPmlucHV0X2l0ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IDEgbXVzdCBiZSBhbiBpdGVyYXRvciIpOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5kaWFsZWN0ID0gKERpYWxlY3RPYmogKilfY2FsbF9kaWFsZWN0KGRpYWxlY3QsIGtleXdvcmRfYXJncyk7CisgICAgaWYgKHNlbGYtPmRpYWxlY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5T2JqZWN0X0dDX1RyYWNrKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogLyoKQEAgLTk1Niw4ICs5NTYsOCBAQAogc3RhdGljIHZvaWQKIGpvaW5fcmVzZXQoV3JpdGVyT2JqICpzZWxmKQogewotCXNlbGYtPnJlY19sZW4gPSAwOwotCXNlbGYtPm51bV9maWVsZHMgPSAwOworICAgIHNlbGYtPnJlY19sZW4gPSAwOworICAgIHNlbGYtPm51bV9maWVsZHMgPSAwOwogfQogCiAjZGVmaW5lIE1FTV9JTkNSIDMyNzY4CkBAIC05NjcsOTAgKzk2Nyw5MCBAQAogICovCiBzdGF0aWMgaW50CiBqb2luX2FwcGVuZF9kYXRhKFdyaXRlck9iaiAqc2VsZiwgY2hhciAqZmllbGQsIGludCBxdW90ZV9lbXB0eSwKLQkJIGludCAqcXVvdGVkLCBpbnQgY29weV9waGFzZSkKKyAgICAgICAgICAgICAgICAgaW50ICpxdW90ZWQsIGludCBjb3B5X3BoYXNlKQogewotICAgICAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKLQlpbnQgaSwgcmVjX2xlbjsKLQljaGFyICpsaW5ldGVybTsKKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKKyAgICBpbnQgaSwgcmVjX2xlbjsKKyAgICBjaGFyICpsaW5ldGVybTsKIAogI2RlZmluZSBBRERDSChjKSBcCi0JZG8ge1wKLQkJaWYgKGNvcHlfcGhhc2UpIFwKLQkJCXNlbGYtPnJlY1tyZWNfbGVuXSA9IGM7XAotCQlyZWNfbGVuKys7XAotCX0gd2hpbGUoMCkKKyAgICBkbyB7XAorICAgICAgICBpZiAoY29weV9waGFzZSkgXAorICAgICAgICAgICAgc2VsZi0+cmVjW3JlY19sZW5dID0gYztcCisgICAgICAgIHJlY19sZW4rKztcCisgICAgfSB3aGlsZSgwKQogCi0JbGluZXRlcm0gPSBQeVN0cmluZ19Bc1N0cmluZyhkaWFsZWN0LT5saW5ldGVybWluYXRvcik7Ci0JaWYgKGxpbmV0ZXJtID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBsaW5ldGVybSA9IFB5U3RyaW5nX0FzU3RyaW5nKGRpYWxlY3QtPmxpbmV0ZXJtaW5hdG9yKTsKKyAgICBpZiAobGluZXRlcm0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmVjX2xlbiA9IHNlbGYtPnJlY19sZW47CisgICAgcmVjX2xlbiA9IHNlbGYtPnJlY19sZW47CiAKLQkvKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZmllbGQgd2UgbmVlZCBhIGZpZWxkIHNlcGFyYXRvciAqLwotCWlmIChzZWxmLT5udW1fZmllbGRzID4gMCkKLQkJQUREQ0goZGlhbGVjdC0+ZGVsaW1pdGVyKTsKKyAgICAvKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgZmllbGQgd2UgbmVlZCBhIGZpZWxkIHNlcGFyYXRvciAqLworICAgIGlmIChzZWxmLT5udW1fZmllbGRzID4gMCkKKyAgICAgICAgQUREQ0goZGlhbGVjdC0+ZGVsaW1pdGVyKTsKIAotCS8qIEhhbmRsZSBwcmVjZWRpbmcgcXVvdGUgKi8KLQlpZiAoY29weV9waGFzZSAmJiAqcXVvdGVkKQotCQlBRERDSChkaWFsZWN0LT5xdW90ZWNoYXIpOworICAgIC8qIEhhbmRsZSBwcmVjZWRpbmcgcXVvdGUgKi8KKyAgICBpZiAoY29weV9waGFzZSAmJiAqcXVvdGVkKQorICAgICAgICBBRERDSChkaWFsZWN0LT5xdW90ZWNoYXIpOwogCi0JLyogQ29weS9jb3VudCBmaWVsZCBkYXRhICovCi0JZm9yIChpID0gMDs7IGkrKykgewotCQljaGFyIGMgPSBmaWVsZFtpXTsKLQkJaW50IHdhbnRfZXNjYXBlID0gMDsKKyAgICAvKiBDb3B5L2NvdW50IGZpZWxkIGRhdGEgKi8KKyAgICBmb3IgKGkgPSAwOzsgaSsrKSB7CisgICAgICAgIGNoYXIgYyA9IGZpZWxkW2ldOworICAgICAgICBpbnQgd2FudF9lc2NhcGUgPSAwOwogCi0JCWlmIChjID09ICdcMCcpCi0JCQlicmVhazsKKyAgICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWlmIChjID09IGRpYWxlY3QtPmRlbGltaXRlciB8fAotCQkgICAgYyA9PSBkaWFsZWN0LT5lc2NhcGVjaGFyIHx8Ci0JCSAgICBjID09IGRpYWxlY3QtPnF1b3RlY2hhciB8fAotCQkgICAgc3RyY2hyKGxpbmV0ZXJtLCBjKSkgewotCQkJaWYgKGRpYWxlY3QtPnF1b3RpbmcgPT0gUVVPVEVfTk9ORSkKLQkJCQl3YW50X2VzY2FwZSA9IDE7Ci0JCQllbHNlIHsKLQkJCQlpZiAoYyA9PSBkaWFsZWN0LT5xdW90ZWNoYXIpIHsKLQkJCQkJaWYgKGRpYWxlY3QtPmRvdWJsZXF1b3RlKQotCQkJCQkJQUREQ0goZGlhbGVjdC0+cXVvdGVjaGFyKTsKLQkJCQkJZWxzZQotCQkJCQkJd2FudF9lc2NhcGUgPSAxOwotCQkJCX0KLQkJCQlpZiAoIXdhbnRfZXNjYXBlKQotCQkJCQkqcXVvdGVkID0gMTsKLQkJCX0KLQkJCWlmICh3YW50X2VzY2FwZSkgewotCQkJCWlmICghZGlhbGVjdC0+ZXNjYXBlY2hhcikgewotCQkJCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAKLQkJCQkJCSAgICAgIm5lZWQgdG8gZXNjYXBlLCBidXQgbm8gZXNjYXBlY2hhciBzZXQiKTsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlBRERDSChkaWFsZWN0LT5lc2NhcGVjaGFyKTsKLQkJCX0KLQkJfQotCQkvKiBDb3B5IGZpZWxkIGNoYXJhY3RlciBpbnRvIHJlY29yZCBidWZmZXIuCi0JCSAqLwotCQlBRERDSChjKTsKLQl9CisgICAgICAgIGlmIChjID09IGRpYWxlY3QtPmRlbGltaXRlciB8fAorICAgICAgICAgICAgYyA9PSBkaWFsZWN0LT5lc2NhcGVjaGFyIHx8CisgICAgICAgICAgICBjID09IGRpYWxlY3QtPnF1b3RlY2hhciB8fAorICAgICAgICAgICAgc3RyY2hyKGxpbmV0ZXJtLCBjKSkgeworICAgICAgICAgICAgaWYgKGRpYWxlY3QtPnF1b3RpbmcgPT0gUVVPVEVfTk9ORSkKKyAgICAgICAgICAgICAgICB3YW50X2VzY2FwZSA9IDE7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBkaWFsZWN0LT5xdW90ZWNoYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWxlY3QtPmRvdWJsZXF1b3RlKQorICAgICAgICAgICAgICAgICAgICAgICAgQUREQ0goZGlhbGVjdC0+cXVvdGVjaGFyKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgd2FudF9lc2NhcGUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXdhbnRfZXNjYXBlKQorICAgICAgICAgICAgICAgICAgICAqcXVvdGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3YW50X2VzY2FwZSkgeworICAgICAgICAgICAgICAgIGlmICghZGlhbGVjdC0+ZXNjYXBlY2hhcikgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWQgdG8gZXNjYXBlLCBidXQgbm8gZXNjYXBlY2hhciBzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBRERDSChkaWFsZWN0LT5lc2NhcGVjaGFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBDb3B5IGZpZWxkIGNoYXJhY3RlciBpbnRvIHJlY29yZCBidWZmZXIuCisgICAgICAgICAqLworICAgICAgICBBRERDSChjKTsKKyAgICB9CiAKLQkvKiBJZiBmaWVsZCBpcyBlbXB0eSBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSBxdW90ZWQuCi0JICovCi0JaWYgKGkgPT0gMCAmJiBxdW90ZV9lbXB0eSkgewotCQlpZiAoZGlhbGVjdC0+cXVvdGluZyA9PSBRVU9URV9OT05FKSB7Ci0JCQlQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaW5nbGUgZW1wdHkgZmllbGQgcmVjb3JkIG11c3QgYmUgcXVvdGVkIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQotCQkJKnF1b3RlZCA9IDE7Ci0JfQorICAgIC8qIElmIGZpZWxkIGlzIGVtcHR5IGNoZWNrIGlmIGl0IG5lZWRzIHRvIGJlIHF1b3RlZC4KKyAgICAgKi8KKyAgICBpZiAoaSA9PSAwICYmIHF1b3RlX2VtcHR5KSB7CisgICAgICAgIGlmIChkaWFsZWN0LT5xdW90aW5nID09IFFVT1RFX05PTkUpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZSBlbXB0eSBmaWVsZCByZWNvcmQgbXVzdCBiZSBxdW90ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqcXVvdGVkID0gMTsKKyAgICB9CiAKLQlpZiAoKnF1b3RlZCkgewotCQlpZiAoY29weV9waGFzZSkKLQkJCUFERENIKGRpYWxlY3QtPnF1b3RlY2hhcik7Ci0JCWVsc2UKLQkJCXJlY19sZW4gKz0gMjsKLQl9Ci0JcmV0dXJuIHJlY19sZW47CisgICAgaWYgKCpxdW90ZWQpIHsKKyAgICAgICAgaWYgKGNvcHlfcGhhc2UpCisgICAgICAgICAgICBBRERDSChkaWFsZWN0LT5xdW90ZWNoYXIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZWNfbGVuICs9IDI7CisgICAgfQorICAgIHJldHVybiByZWNfbGVuOwogI3VuZGVmIEFERENICiB9CiAKQEAgLTEwNTgsNzQgKzEwNTgsNzQgQEAKIGpvaW5fY2hlY2tfcmVjX3NpemUoV3JpdGVyT2JqICpzZWxmLCBpbnQgcmVjX2xlbikKIHsKIAotCWlmIChyZWNfbGVuIDwgMCB8fCByZWNfbGVuID4gSU5UX01BWCAtIE1FTV9JTkNSKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAocmVjX2xlbiA8IDAgfHwgcmVjX2xlbiA+IElOVF9NQVggLSBNRU1fSU5DUikgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAocmVjX2xlbiA+IHNlbGYtPnJlY19zaXplKSB7Ci0JCWlmIChzZWxmLT5yZWNfc2l6ZSA9PSAwKSB7Ci0JCQlzZWxmLT5yZWNfc2l6ZSA9IChyZWNfbGVuIC8gTUVNX0lOQ1IgKyAxKSAqIE1FTV9JTkNSOwotCQkJaWYgKHNlbGYtPnJlYyAhPSBOVUxMKQotCQkJCVB5TWVtX0ZyZWUoc2VsZi0+cmVjKTsKLQkJCXNlbGYtPnJlYyA9IFB5TWVtX01hbGxvYyhzZWxmLT5yZWNfc2l6ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFyICpvbGRfcmVjID0gc2VsZi0+cmVjOworICAgIGlmIChyZWNfbGVuID4gc2VsZi0+cmVjX3NpemUpIHsKKyAgICAgICAgaWYgKHNlbGYtPnJlY19zaXplID09IDApIHsKKyAgICAgICAgICAgIHNlbGYtPnJlY19zaXplID0gKHJlY19sZW4gLyBNRU1fSU5DUiArIDEpICogTUVNX0lOQ1I7CisgICAgICAgICAgICBpZiAoc2VsZi0+cmVjICE9IE5VTEwpCisgICAgICAgICAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5yZWMpOworICAgICAgICAgICAgc2VsZi0+cmVjID0gUHlNZW1fTWFsbG9jKHNlbGYtPnJlY19zaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKm9sZF9yZWMgPSBzZWxmLT5yZWM7CiAKLQkJCXNlbGYtPnJlY19zaXplID0gKHJlY19sZW4gLyBNRU1fSU5DUiArIDEpICogTUVNX0lOQ1I7Ci0JCQlzZWxmLT5yZWMgPSBQeU1lbV9SZWFsbG9jKHNlbGYtPnJlYywgc2VsZi0+cmVjX3NpemUpOwotCQkJaWYgKHNlbGYtPnJlYyA9PSBOVUxMKQotCQkJCVB5TWVtX0ZyZWUob2xkX3JlYyk7Ci0JCX0KLQkJaWYgKHNlbGYtPnJlYyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgICAgICAgICBzZWxmLT5yZWNfc2l6ZSA9IChyZWNfbGVuIC8gTUVNX0lOQ1IgKyAxKSAqIE1FTV9JTkNSOworICAgICAgICAgICAgc2VsZi0+cmVjID0gUHlNZW1fUmVhbGxvYyhzZWxmLT5yZWMsIHNlbGYtPnJlY19zaXplKTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5yZWMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKG9sZF9yZWMpOworICAgICAgICB9CisgICAgICAgIGlmIChzZWxmLT5yZWMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBqb2luX2FwcGVuZChXcml0ZXJPYmogKnNlbGYsIGNoYXIgKmZpZWxkLCBpbnQgKnF1b3RlZCwgaW50IHF1b3RlX2VtcHR5KQogewotCWludCByZWNfbGVuOworICAgIGludCByZWNfbGVuOwogCi0JcmVjX2xlbiA9IGpvaW5fYXBwZW5kX2RhdGEoc2VsZiwgZmllbGQsIHF1b3RlX2VtcHR5LCBxdW90ZWQsIDApOwotCWlmIChyZWNfbGVuIDwgMCkKLQkJcmV0dXJuIDA7CisgICAgcmVjX2xlbiA9IGpvaW5fYXBwZW5kX2RhdGEoc2VsZiwgZmllbGQsIHF1b3RlX2VtcHR5LCBxdW90ZWQsIDApOworICAgIGlmIChyZWNfbGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBncm93IHJlY29yZCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKCFqb2luX2NoZWNrX3JlY19zaXplKHNlbGYsIHJlY19sZW4pKQotCQlyZXR1cm4gMDsKKyAgICAvKiBncm93IHJlY29yZCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKCFqb2luX2NoZWNrX3JlY19zaXplKHNlbGYsIHJlY19sZW4pKQorICAgICAgICByZXR1cm4gMDsKIAotCXNlbGYtPnJlY19sZW4gPSBqb2luX2FwcGVuZF9kYXRhKHNlbGYsIGZpZWxkLCBxdW90ZV9lbXB0eSwgcXVvdGVkLCAxKTsKLQlzZWxmLT5udW1fZmllbGRzKys7CisgICAgc2VsZi0+cmVjX2xlbiA9IGpvaW5fYXBwZW5kX2RhdGEoc2VsZiwgZmllbGQsIHF1b3RlX2VtcHR5LCBxdW90ZWQsIDEpOworICAgIHNlbGYtPm51bV9maWVsZHMrKzsKIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBqb2luX2FwcGVuZF9saW5ldGVybWluYXRvcihXcml0ZXJPYmogKnNlbGYpCiB7Ci0JaW50IHRlcm1pbmF0b3JfbGVuOwotCWNoYXIgKnRlcm1pbmF0b3I7CisgICAgaW50IHRlcm1pbmF0b3JfbGVuOworICAgIGNoYXIgKnRlcm1pbmF0b3I7CiAKLQl0ZXJtaW5hdG9yX2xlbiA9IFB5U3RyaW5nX1NpemUoc2VsZi0+ZGlhbGVjdC0+bGluZXRlcm1pbmF0b3IpOwotCWlmICh0ZXJtaW5hdG9yX2xlbiA9PSAtMSkKLQkJcmV0dXJuIDA7CisgICAgdGVybWluYXRvcl9sZW4gPSBQeVN0cmluZ19TaXplKHNlbGYtPmRpYWxlY3QtPmxpbmV0ZXJtaW5hdG9yKTsKKyAgICBpZiAodGVybWluYXRvcl9sZW4gPT0gLTEpCisgICAgICAgIHJldHVybiAwOwogCi0JLyogZ3JvdyByZWNvcmQgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwotCWlmICgham9pbl9jaGVja19yZWNfc2l6ZShzZWxmLCBzZWxmLT5yZWNfbGVuICsgdGVybWluYXRvcl9sZW4pKQotCQlyZXR1cm4gMDsKKyAgICAvKiBncm93IHJlY29yZCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKCFqb2luX2NoZWNrX3JlY19zaXplKHNlbGYsIHNlbGYtPnJlY19sZW4gKyB0ZXJtaW5hdG9yX2xlbikpCisgICAgICAgIHJldHVybiAwOwogCi0JdGVybWluYXRvciA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmRpYWxlY3QtPmxpbmV0ZXJtaW5hdG9yKTsgCi0JaWYgKHRlcm1pbmF0b3IgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JbWVtbW92ZShzZWxmLT5yZWMgKyBzZWxmLT5yZWNfbGVuLCB0ZXJtaW5hdG9yLCB0ZXJtaW5hdG9yX2xlbik7Ci0Jc2VsZi0+cmVjX2xlbiArPSB0ZXJtaW5hdG9yX2xlbjsKKyAgICB0ZXJtaW5hdG9yID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+ZGlhbGVjdC0+bGluZXRlcm1pbmF0b3IpOworICAgIGlmICh0ZXJtaW5hdG9yID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIG1lbW1vdmUoc2VsZi0+cmVjICsgc2VsZi0+cmVjX2xlbiwgdGVybWluYXRvciwgdGVybWluYXRvcl9sZW4pOworICAgIHNlbGYtPnJlY19sZW4gKz0gdGVybWluYXRvcl9sZW47CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogUHlEb2NfU1RSVkFSKGNzdl93cml0ZXJvd19kb2MsCkBAIC0xMTM3LDczICsxMTM3LDczIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY3N2X3dyaXRlcm93KFdyaXRlck9iaiAqc2VsZiwgUHlPYmplY3QgKnNlcSkKIHsKLSAgICAgICAgRGlhbGVjdE9iaiAqZGlhbGVjdCA9IHNlbGYtPmRpYWxlY3Q7Ci0JaW50IGxlbiwgaTsKKyAgICBEaWFsZWN0T2JqICpkaWFsZWN0ID0gc2VsZi0+ZGlhbGVjdDsKKyAgICBpbnQgbGVuLCBpOwogCi0JaWYgKCFQeVNlcXVlbmNlX0NoZWNrKHNlcSkpCi0JCXJldHVybiBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAic2VxdWVuY2UgZXhwZWN0ZWQiKTsKKyAgICBpZiAoIVB5U2VxdWVuY2VfQ2hlY2soc2VxKSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJzZXF1ZW5jZSBleHBlY3RlZCIpOwogCi0JbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgoc2VxKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgoc2VxKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBKb2luIGFsbCBmaWVsZHMgaW4gaW50ZXJuYWwgYnVmZmVyLgotCSAqLwotCWpvaW5fcmVzZXQoc2VsZik7Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpmaWVsZDsKLQkJaW50IGFwcGVuZF9vazsKLQkJaW50IHF1b3RlZDsKKyAgICAvKiBKb2luIGFsbCBmaWVsZHMgaW4gaW50ZXJuYWwgYnVmZmVyLgorICAgICAqLworICAgIGpvaW5fcmVzZXQoc2VsZik7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpmaWVsZDsKKyAgICAgICAgaW50IGFwcGVuZF9vazsKKyAgICAgICAgaW50IHF1b3RlZDsKIAotCQlmaWVsZCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZXEsIGkpOwotCQlpZiAoZmllbGQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBmaWVsZCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZXEsIGkpOworICAgICAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXN3aXRjaCAoZGlhbGVjdC0+cXVvdGluZykgewotCQljYXNlIFFVT1RFX05PTk5VTUVSSUM6Ci0JCQlxdW90ZWQgPSAhUHlOdW1iZXJfQ2hlY2soZmllbGQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUVVPVEVfQUxMOgotCQkJcXVvdGVkID0gMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcXVvdGVkID0gMDsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIHN3aXRjaCAoZGlhbGVjdC0+cXVvdGluZykgeworICAgICAgICBjYXNlIFFVT1RFX05PTk5VTUVSSUM6CisgICAgICAgICAgICBxdW90ZWQgPSAhUHlOdW1iZXJfQ2hlY2soZmllbGQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUVVPVEVfQUxMOgorICAgICAgICAgICAgcXVvdGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcXVvdGVkID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGZpZWxkKSkgewotCQkJYXBwZW5kX29rID0gam9pbl9hcHBlbmQoc2VsZiwKLQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORyhmaWVsZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdGVkLCBsZW4gPT0gMSk7Ci0JCQlQeV9ERUNSRUYoZmllbGQpOwotCQl9Ci0JCWVsc2UgaWYgKGZpZWxkID09IFB5X05vbmUpIHsKLQkJCWFwcGVuZF9vayA9IGpvaW5fYXBwZW5kKHNlbGYsICIiLCAmcXVvdGVkLCBsZW4gPT0gMSk7Ci0JCQlQeV9ERUNSRUYoZmllbGQpOwotCQl9Ci0JCWVsc2UgewotCQkJUHlPYmplY3QgKnN0cjsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGZpZWxkKSkgeworICAgICAgICAgICAgYXBwZW5kX29rID0gam9pbl9hcHBlbmQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVvdGVkLCBsZW4gPT0gMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZpZWxkID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIGFwcGVuZF9vayA9IGpvaW5fYXBwZW5kKHNlbGYsICIiLCAmcXVvdGVkLCBsZW4gPT0gMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKnN0cjsKIAotCQkJc3RyID0gUHlPYmplY3RfU3RyKGZpZWxkKTsKLQkJCVB5X0RFQ1JFRihmaWVsZCk7Ci0JCQlpZiAoc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBzdHIgPSBQeU9iamVjdF9TdHIoZmllbGQpOworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkKTsKKyAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQkJYXBwZW5kX29rID0gam9pbl9hcHBlbmQoc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ciksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1b3RlZCwgbGVuID09IDEpOwotCQkJUHlfREVDUkVGKHN0cik7Ci0JCX0KLQkJaWYgKCFhcHBlbmRfb2spCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICBhcHBlbmRfb2sgPSBqb2luX2FwcGVuZChzZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdW90ZWQsIGxlbiA9PSAxKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICB9CisgICAgICAgIGlmICghYXBwZW5kX29rKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQWRkIGxpbmUgdGVybWluYXRvci4KLQkgKi8KLQlpZiAoIWpvaW5fYXBwZW5kX2xpbmV0ZXJtaW5hdG9yKHNlbGYpKQotCQlyZXR1cm4gMDsKKyAgICAvKiBBZGQgbGluZSB0ZXJtaW5hdG9yLgorICAgICAqLworICAgIGlmICgham9pbl9hcHBlbmRfbGluZXRlcm1pbmF0b3Ioc2VsZikpCisgICAgICAgIHJldHVybiAwOwogCi0JcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT53cml0ZWxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIocyMpIiwgc2VsZi0+cmVjLCBzZWxmLT5yZWNfbGVuKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPndyaXRlbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIocyMpIiwgc2VsZi0+cmVjLCBzZWxmLT5yZWNfbGVuKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNzdl93cml0ZXJvd3NfZG9jLApAQCAtMTIxNSw3MiArMTIxNSw3MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl93cml0ZXJvd3MoV3JpdGVyT2JqICpzZWxmLCBQeU9iamVjdCAqc2Vxc2VxKQogewotICAgICAgICBQeU9iamVjdCAqcm93X2l0ZXIsICpyb3dfb2JqLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyb3dfaXRlciwgKnJvd19vYmosICpyZXN1bHQ7CiAKLSAgICAgICAgcm93X2l0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcXNlcSk7Ci0gICAgICAgIGlmIChyb3dfaXRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlcm93cygpIGFyZ3VtZW50IG11c3QgYmUgaXRlcmFibGUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByb3dfaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2Vxc2VxKTsKKyAgICBpZiAocm93X2l0ZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlcm93cygpIGFyZ3VtZW50IG11c3QgYmUgaXRlcmFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdoaWxlICgocm93X29iaiA9IFB5SXRlcl9OZXh0KHJvd19pdGVyKSkpIHsKKyAgICAgICAgcmVzdWx0ID0gY3N2X3dyaXRlcm93KHNlbGYsIHJvd19vYmopOworICAgICAgICBQeV9ERUNSRUYocm93X29iaik7CisgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocm93X2l0ZXIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChyb3dfb2JqID0gUHlJdGVyX05leHQocm93X2l0ZXIpKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNzdl93cml0ZXJvdyhzZWxmLCByb3dfb2JqKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocm93X29iaik7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyb3dfaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7ICAgCi0gICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHJvd19pdGVyKTsKLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJvd19pdGVyKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFdyaXRlcl9tZXRob2RzW10gPSB7Ci0gICAgICAgIHsgIndyaXRlcm93IiwgKFB5Q0Z1bmN0aW9uKWNzdl93cml0ZXJvdywgTUVUSF9PLCBjc3Zfd3JpdGVyb3dfZG9jfSwKLSAgICAgICAgeyAid3JpdGVyb3dzIiwgKFB5Q0Z1bmN0aW9uKWNzdl93cml0ZXJvd3MsIE1FVEhfTywgY3N2X3dyaXRlcm93c19kb2N9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAid3JpdGVyb3ciLCAoUHlDRnVuY3Rpb24pY3N2X3dyaXRlcm93LCBNRVRIX08sIGNzdl93cml0ZXJvd19kb2N9LAorICAgIHsgIndyaXRlcm93cyIsIChQeUNGdW5jdGlvbiljc3Zfd3JpdGVyb3dzLCBNRVRIX08sIGNzdl93cml0ZXJvd3NfZG9jfSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogI2RlZmluZSBXX09GRih4KSBvZmZzZXRvZihXcml0ZXJPYmosIHgpCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZW1iZXJEZWYgV3JpdGVyX21lbWJlcmxpc3RbXSA9IHsKLQl7ICJkaWFsZWN0IiwgVF9PQkpFQ1QsIFdfT0ZGKGRpYWxlY3QpLCBSTyB9LAotCXsgTlVMTCB9CisgICAgeyAiZGlhbGVjdCIsIFRfT0JKRUNULCBXX09GRihkaWFsZWN0KSwgUk8gfSwKKyAgICB7IE5VTEwgfQogfTsKIAogc3RhdGljIHZvaWQKIFdyaXRlcl9kZWFsbG9jKFdyaXRlck9iaiAqc2VsZikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmRpYWxlY3QpOwotICAgICAgICBQeV9YREVDUkVGKHNlbGYtPndyaXRlbGluZSk7Ci0JaWYgKHNlbGYtPnJlYyAhPSBOVUxMKQotCQlQeU1lbV9GcmVlKHNlbGYtPnJlYyk7Ci0JUHlPYmplY3RfR0NfRGVsKHNlbGYpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kaWFsZWN0KTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPndyaXRlbGluZSk7CisgICAgaWYgKHNlbGYtPnJlYyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPnJlYyk7CisgICAgUHlPYmplY3RfR0NfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBXcml0ZXJfdHJhdmVyc2UoV3JpdGVyT2JqICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChzZWxmLT5kaWFsZWN0KTsKLQlQeV9WSVNJVChzZWxmLT53cml0ZWxpbmUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNlbGYtPmRpYWxlY3QpOworICAgIFB5X1ZJU0lUKHNlbGYtPndyaXRlbGluZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFdyaXRlcl9jbGVhcihXcml0ZXJPYmogKnNlbGYpCiB7Ci0JUHlfQ0xFQVIoc2VsZi0+ZGlhbGVjdCk7Ci0JUHlfQ0xFQVIoc2VsZi0+d3JpdGVsaW5lKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihzZWxmLT5kaWFsZWN0KTsKKyAgICBQeV9DTEVBUihzZWxmLT53cml0ZWxpbmUpOworICAgIHJldHVybiAwOwogfQogCi1QeURvY19TVFJWQVIoV3JpdGVyX1R5cGVfZG9jLCAKK1B5RG9jX1NUUlZBUihXcml0ZXJfVHlwZV9kb2MsCiAiQ1NWIHdyaXRlclxuIgogIlxuIgogIldyaXRlciBvYmplY3RzIGFyZSByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyB0YWJ1bGFyIGRhdGFcbiIKQEAgLTEyODgsNzUgKzEyODgsNzUgQEAKICk7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgV3JpdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jc3Yud3JpdGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFdyaXRlck9iaiksICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVdyaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKLQkJUHlfVFBGTEFHU19IQVZFX0dDLAkJLyp0cF9mbGFncyovCi0JV3JpdGVyX1R5cGVfZG9jLAotICAgICAgICAodHJhdmVyc2Vwcm9jKVdyaXRlcl90cmF2ZXJzZSwgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIChpbnF1aXJ5KVdyaXRlcl9jbGVhciwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIChnZXRpdGVyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwotICAgICAgICAoZ2V0aXRlcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIFdyaXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICBXcml0ZXJfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2Nzdi53cml0ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoV3JpdGVyT2JqKSwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpV3JpdGVyX2RlYWxsb2MsICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAorICAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgV3JpdGVyX1R5cGVfZG9jLAorICAgICh0cmF2ZXJzZXByb2MpV3JpdGVyX3RyYXZlcnNlLCAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAoaW5xdWlyeSlXcml0ZXJfY2xlYXIsICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAoZ2V0aXRlcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAoZ2V0aXRlcmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgV3JpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgV3JpdGVyX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjc3Zfd3JpdGVyKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa2V5d29yZF9hcmdzKQogewotCVB5T2JqZWN0ICogb3V0cHV0X2ZpbGUsICogZGlhbGVjdCA9IE5VTEw7Ci0gICAgICAgIFdyaXRlck9iaiAqIHNlbGYgPSBQeU9iamVjdF9HQ19OZXcoV3JpdGVyT2JqLCAmV3JpdGVyX1R5cGUpOworICAgIFB5T2JqZWN0ICogb3V0cHV0X2ZpbGUsICogZGlhbGVjdCA9IE5VTEw7CisgICAgV3JpdGVyT2JqICogc2VsZiA9IFB5T2JqZWN0X0dDX05ldyhXcml0ZXJPYmosICZXcml0ZXJfVHlwZSk7CiAKLSAgICAgICAgaWYgKCFzZWxmKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghc2VsZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgc2VsZi0+ZGlhbGVjdCA9IE5VTEw7Ci0gICAgICAgIHNlbGYtPndyaXRlbGluZSA9IE5VTEw7CisgICAgc2VsZi0+ZGlhbGVjdCA9IE5VTEw7CisgICAgc2VsZi0+d3JpdGVsaW5lID0gTlVMTDsKIAotCXNlbGYtPnJlYyA9IE5VTEw7Ci0Jc2VsZi0+cmVjX3NpemUgPSAwOwotCXNlbGYtPnJlY19sZW4gPSAwOwotCXNlbGYtPm51bV9maWVsZHMgPSAwOworICAgIHNlbGYtPnJlYyA9IE5VTEw7CisgICAgc2VsZi0+cmVjX3NpemUgPSAwOworICAgIHNlbGYtPnJlY19sZW4gPSAwOworICAgIHNlbGYtPm51bV9maWVsZHMgPSAwOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm91dHB1dF9maWxlLCAmZGlhbGVjdCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc2VsZi0+d3JpdGVsaW5lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvdXRwdXRfZmlsZSwgIndyaXRlIik7Ci0gICAgICAgIGlmIChzZWxmLT53cml0ZWxpbmUgPT0gTlVMTCB8fCAhUHlDYWxsYWJsZV9DaGVjayhzZWxmLT53cml0ZWxpbmUpKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IDEgbXVzdCBoYXZlIGEgXCJ3cml0ZVwiIG1ldGhvZCIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCXNlbGYtPmRpYWxlY3QgPSAoRGlhbGVjdE9iaiAqKV9jYWxsX2RpYWxlY3QoZGlhbGVjdCwga2V5d29yZF9hcmdzKTsKLSAgICAgICAgaWYgKHNlbGYtPmRpYWxlY3QgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCVB5T2JqZWN0X0dDX1RyYWNrKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmb3V0cHV0X2ZpbGUsICZkaWFsZWN0KSkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT53cml0ZWxpbmUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG91dHB1dF9maWxlLCAid3JpdGUiKTsKKyAgICBpZiAoc2VsZi0+d3JpdGVsaW5lID09IE5VTEwgfHwgIVB5Q2FsbGFibGVfQ2hlY2soc2VsZi0+d3JpdGVsaW5lKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IDEgbXVzdCBoYXZlIGEgXCJ3cml0ZVwiIG1ldGhvZCIpOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5kaWFsZWN0ID0gKERpYWxlY3RPYmogKilfY2FsbF9kaWFsZWN0KGRpYWxlY3QsIGtleXdvcmRfYXJncyk7CisgICAgaWYgKHNlbGYtPmRpYWxlY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogLyoKQEAgLTEzNjUsNjYgKzEzNjUsNjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjc3ZfbGlzdF9kaWFsZWN0cyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgcmV0dXJuIFB5RGljdF9LZXlzKGRpYWxlY3RzKTsKKyAgICByZXR1cm4gUHlEaWN0X0tleXMoZGlhbGVjdHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY3N2X3JlZ2lzdGVyX2RpYWxlY3QoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JUHlPYmplY3QgKm5hbWVfb2JqLCAqZGlhbGVjdF9vYmogPSBOVUxMOwotCVB5T2JqZWN0ICpkaWFsZWN0OworICAgIFB5T2JqZWN0ICpuYW1lX29iaiwgKmRpYWxlY3Rfb2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGlhbGVjdDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDIsICZuYW1lX29iaiwgJmRpYWxlY3Rfb2JqKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKCFJU19CQVNFU1RSSU5HKG5hbWVfb2JqKSkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlhbGVjdCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgdW5pY29kZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0JZGlhbGVjdCA9IF9jYWxsX2RpYWxlY3QoZGlhbGVjdF9vYmosIGt3YXJncyk7Ci0JaWYgKGRpYWxlY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5RGljdF9TZXRJdGVtKGRpYWxlY3RzLCBuYW1lX29iaiwgZGlhbGVjdCkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihkaWFsZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCVB5X0RFQ1JFRihkaWFsZWN0KTsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmbmFtZV9vYmosICZkaWFsZWN0X29iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghSVNfQkFTRVNUUklORyhuYW1lX29iaikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaWFsZWN0IG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciB1bmljb2RlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWFsZWN0ID0gX2NhbGxfZGlhbGVjdChkaWFsZWN0X29iaiwga3dhcmdzKTsKKyAgICBpZiAoZGlhbGVjdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGlhbGVjdHMsIG5hbWVfb2JqLCBkaWFsZWN0KSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGRpYWxlY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKGRpYWxlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl91bnJlZ2lzdGVyX2RpYWxlY3QoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKm5hbWVfb2JqKQogewotICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oZGlhbGVjdHMsIG5hbWVfb2JqKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChlcnJvcl9vYmosICJ1bmtub3duIGRpYWxlY3QiKTsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oZGlhbGVjdHMsIG5hbWVfb2JqKSA8IDApCisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoZXJyb3Jfb2JqLCAidW5rbm93biBkaWFsZWN0Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY3N2X2dldF9kaWFsZWN0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpuYW1lX29iaikKIHsKLSAgICAgICAgcmV0dXJuIGdldF9kaWFsZWN0X2Zyb21fcmVnaXN0cnkobmFtZV9vYmopOworICAgIHJldHVybiBnZXRfZGlhbGVjdF9mcm9tX3JlZ2lzdHJ5KG5hbWVfb2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNzdl9maWVsZF9zaXplX2xpbWl0KFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpuZXdfbGltaXQgPSBOVUxMOwotCWxvbmcgb2xkX2xpbWl0ID0gZmllbGRfbGltaXQ7CisgICAgUHlPYmplY3QgKm5ld19saW1pdCA9IE5VTEw7CisgICAgbG9uZyBvbGRfbGltaXQgPSBmaWVsZF9saW1pdDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZpZWxkX3NpemVfbGltaXQiLCAwLCAxLCAmbmV3X2xpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG5ld19saW1pdCAhPSBOVUxMKSB7Ci0JCWlmICghUHlJbnRfQ2hlY2sobmV3X2xpbWl0KSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJICAgICAibGltaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmaWVsZF9saW1pdCA9IFB5SW50X0FzTG9uZyhuZXdfbGltaXQpOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcob2xkX2xpbWl0KTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJmaWVsZF9zaXplX2xpbWl0IiwgMCwgMSwgJm5ld19saW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuZXdfbGltaXQgIT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKG5ld19saW1pdCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImxpbWl0IG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZmllbGRfbGltaXQgPSBQeUludF9Bc0xvbmcobmV3X2xpbWl0KTsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9sZF9saW1pdCk7CiB9CiAKIC8qCkBAIC0xNTQyLDcwICsxNTQyLDcwIEBACiAidGhlIG9sZCBsaW1pdCBpcyByZXR1cm5lZCIpOwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGNzdl9tZXRob2RzW10gPSB7Ci0JeyAicmVhZGVyIiwgKFB5Q0Z1bmN0aW9uKWNzdl9yZWFkZXIsIAotCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjc3ZfcmVhZGVyX2RvY30sCi0JeyAid3JpdGVyIiwgKFB5Q0Z1bmN0aW9uKWNzdl93cml0ZXIsIAotCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjc3Zfd3JpdGVyX2RvY30sCi0JeyAibGlzdF9kaWFsZWN0cyIsIChQeUNGdW5jdGlvbiljc3ZfbGlzdF9kaWFsZWN0cywgCi0JCU1FVEhfTk9BUkdTLCBjc3ZfbGlzdF9kaWFsZWN0c19kb2N9LAotCXsgInJlZ2lzdGVyX2RpYWxlY3QiLCAoUHlDRnVuY3Rpb24pY3N2X3JlZ2lzdGVyX2RpYWxlY3QsIAotCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjc3ZfcmVnaXN0ZXJfZGlhbGVjdF9kb2N9LAotCXsgInVucmVnaXN0ZXJfZGlhbGVjdCIsIChQeUNGdW5jdGlvbiljc3ZfdW5yZWdpc3Rlcl9kaWFsZWN0LCAKLQkJTUVUSF9PLCBjc3ZfdW5yZWdpc3Rlcl9kaWFsZWN0X2RvY30sCi0JeyAiZ2V0X2RpYWxlY3QiLCAoUHlDRnVuY3Rpb24pY3N2X2dldF9kaWFsZWN0LCAKLQkJTUVUSF9PLCBjc3ZfZ2V0X2RpYWxlY3RfZG9jfSwKLQl7ICJmaWVsZF9zaXplX2xpbWl0IiwgKFB5Q0Z1bmN0aW9uKWNzdl9maWVsZF9zaXplX2xpbWl0LCAKLQkJTUVUSF9WQVJBUkdTLCBjc3ZfZmllbGRfc2l6ZV9saW1pdF9kb2N9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAicmVhZGVyIiwgKFB5Q0Z1bmN0aW9uKWNzdl9yZWFkZXIsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGNzdl9yZWFkZXJfZG9jfSwKKyAgICB7ICJ3cml0ZXIiLCAoUHlDRnVuY3Rpb24pY3N2X3dyaXRlciwKKyAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgY3N2X3dyaXRlcl9kb2N9LAorICAgIHsgImxpc3RfZGlhbGVjdHMiLCAoUHlDRnVuY3Rpb24pY3N2X2xpc3RfZGlhbGVjdHMsCisgICAgICAgIE1FVEhfTk9BUkdTLCBjc3ZfbGlzdF9kaWFsZWN0c19kb2N9LAorICAgIHsgInJlZ2lzdGVyX2RpYWxlY3QiLCAoUHlDRnVuY3Rpb24pY3N2X3JlZ2lzdGVyX2RpYWxlY3QsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGNzdl9yZWdpc3Rlcl9kaWFsZWN0X2RvY30sCisgICAgeyAidW5yZWdpc3Rlcl9kaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKWNzdl91bnJlZ2lzdGVyX2RpYWxlY3QsCisgICAgICAgIE1FVEhfTywgY3N2X3VucmVnaXN0ZXJfZGlhbGVjdF9kb2N9LAorICAgIHsgImdldF9kaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKWNzdl9nZXRfZGlhbGVjdCwKKyAgICAgICAgTUVUSF9PLCBjc3ZfZ2V0X2RpYWxlY3RfZG9jfSwKKyAgICB7ICJmaWVsZF9zaXplX2xpbWl0IiwgKFB5Q0Z1bmN0aW9uKWNzdl9maWVsZF9zaXplX2xpbWl0LAorICAgICAgICBNRVRIX1ZBUkFSR1MsIGNzdl9maWVsZF9zaXplX2xpbWl0X2RvY30sCisgICAgeyBOVUxMLCBOVUxMIH0KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X2Nzdih2b2lkKQogewotCVB5T2JqZWN0ICptb2R1bGU7Ci0JU3R5bGVEZXNjICpzdHlsZTsKKyAgICBQeU9iamVjdCAqbW9kdWxlOworICAgIFN0eWxlRGVzYyAqc3R5bGU7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZEaWFsZWN0X1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkRpYWxlY3RfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZSZWFkZXJfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUmVhZGVyX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmV3JpdGVyX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJldyaXRlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW1vZHVsZSA9IFB5X0luaXRNb2R1bGUzKCJfY3N2IiwgY3N2X21ldGhvZHMsIGNzdl9tb2R1bGVfZG9jKTsKLQlpZiAobW9kdWxlID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlMygiX2NzdiIsIGNzdl9tZXRob2RzLCBjc3ZfbW9kdWxlX2RvYyk7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgdmVyc2lvbiB0byB0aGUgbW9kdWxlLiAqLwotCWlmIChQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtb2R1bGUsICJfX3ZlcnNpb25fXyIsCi0JCQkJICAgICAgIE1PRFVMRV9WRVJTSU9OKSA9PSAtMSkKLQkJcmV0dXJuOworICAgIC8qIEFkZCB2ZXJzaW9uIHRvIHRoZSBtb2R1bGUuICovCisgICAgaWYgKFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG1vZHVsZSwgIl9fdmVyc2lvbl9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVUxFX1ZFUlNJT04pID09IC0xKQorICAgICAgICByZXR1cm47CiAKLSAgICAgICAgLyogQWRkIF9kaWFsZWN0cyBkaWN0aW9uYXJ5ICovCi0gICAgICAgIGRpYWxlY3RzID0gUHlEaWN0X05ldygpOwotICAgICAgICBpZiAoZGlhbGVjdHMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiX2RpYWxlY3RzIiwgZGlhbGVjdHMpKQotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAvKiBBZGQgX2RpYWxlY3RzIGRpY3Rpb25hcnkgKi8KKyAgICBkaWFsZWN0cyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoZGlhbGVjdHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiX2RpYWxlY3RzIiwgZGlhbGVjdHMpKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgcXVvdGUgc3R5bGVzIGludG8gZGljdGlvbmFyeSAqLwotCWZvciAoc3R5bGUgPSBxdW90ZV9zdHlsZXM7IHN0eWxlLT5uYW1lOyBzdHlsZSsrKSB7Ci0JCWlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtb2R1bGUsIHN0eWxlLT5uYW1lLAotCQkJCQkgICAgc3R5bGUtPnN0eWxlKSA9PSAtMSkKLQkJCXJldHVybjsKLQl9CisgICAgLyogQWRkIHF1b3RlIHN0eWxlcyBpbnRvIGRpY3Rpb25hcnkgKi8KKyAgICBmb3IgKHN0eWxlID0gcXVvdGVfc3R5bGVzOyBzdHlsZS0+bmFtZTsgc3R5bGUrKykgeworICAgICAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCBzdHlsZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLT5zdHlsZSkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgIC8qIEFkZCB0aGUgRGlhbGVjdCB0eXBlICovCi0JUHlfSU5DUkVGKCZEaWFsZWN0X1R5cGUpOwotICAgICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIkRpYWxlY3QiLCAoUHlPYmplY3QgKikmRGlhbGVjdF9UeXBlKSkKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgLyogQWRkIHRoZSBEaWFsZWN0IHR5cGUgKi8KKyAgICBQeV9JTkNSRUYoJkRpYWxlY3RfVHlwZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJEaWFsZWN0IiwgKFB5T2JqZWN0ICopJkRpYWxlY3RfVHlwZSkpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCB0aGUgQ1NWIGV4Y2VwdGlvbiBvYmplY3QgdG8gdGhlIG1vZHVsZS4gKi8KLQllcnJvcl9vYmogPSBQeUVycl9OZXdFeGNlcHRpb24oIl9jc3YuRXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlpZiAoZXJyb3Jfb2JqID09IE5VTEwpCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiRXJyb3IiLCBlcnJvcl9vYmopOworICAgIC8qIEFkZCB0aGUgQ1NWIGV4Y2VwdGlvbiBvYmplY3QgdG8gdGhlIG1vZHVsZS4gKi8KKyAgICBlcnJvcl9vYmogPSBQeUVycl9OZXdFeGNlcHRpb24oIl9jc3YuRXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyb3Jfb2JqID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiRXJyb3IiLCBlcnJvcl9vYmopOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKaW5kZXggYzYyY2VjNS4uYWY0ZmY0OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCkBAIC0yNSwyMCArMjUsMjAgQEAKIAogLyoKIAotTmFtZQkJCW1ldGhvZHMsIG1lbWJlcnMsIGdldHNldHMKK05hbWUgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMsIG1lbWJlcnMsIGdldHNldHMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1TdHJ1Y3RUeXBlX1R5cGUJCV9fbmV3X18oKSwgZnJvbV9hZGRyZXNzKCksIF9fbXVsX18oKSwgZnJvbV9wYXJhbSgpCi1VbmlvblR5cGVfVHlwZQkJX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCkKLVBvaW50ZXJUeXBlX1R5cGUJX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCksIHNldF90eXBlKCkKLUFycmF5VHlwZV9UeXBlCQlfX25ld19fKCksIGZyb21fYWRkcmVzcygpLCBfX211bF9fKCksIGZyb21fcGFyYW0oKQotU2ltcGxlVHlwZV9UeXBlCQlfX25ld19fKCksIGZyb21fYWRkcmVzcygpLCBfX211bF9fKCksIGZyb21fcGFyYW0oKQorU3RydWN0VHlwZV9UeXBlICAgICAgICAgX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCkKK1VuaW9uVHlwZV9UeXBlICAgICAgICAgIF9fbmV3X18oKSwgZnJvbV9hZGRyZXNzKCksIF9fbXVsX18oKSwgZnJvbV9wYXJhbSgpCitQb2ludGVyVHlwZV9UeXBlICAgICAgICBfX25ld19fKCksIGZyb21fYWRkcmVzcygpLCBfX211bF9fKCksIGZyb21fcGFyYW0oKSwgc2V0X3R5cGUoKQorQXJyYXlUeXBlX1R5cGUgICAgICAgICAgX19uZXdfXygpLCBmcm9tX2FkZHJlc3MoKSwgX19tdWxfXygpLCBmcm9tX3BhcmFtKCkKK1NpbXBsZVR5cGVfVHlwZSAgICAgICAgIF9fbmV3X18oKSwgZnJvbV9hZGRyZXNzKCksIF9fbXVsX18oKSwgZnJvbV9wYXJhbSgpCiAKIENEYXRhX1R5cGUKLSAgU3RydWN0X1R5cGUJCV9fbmV3X18oKSwgX19pbml0X18oKQotICBQb2ludGVyX1R5cGUJCV9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8sIGNvbnRlbnRzCi0gIEFycmF5X1R5cGUJCV9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8sIF9fZ2V0L3NldGl0ZW1fXygpLCBfX2xlbl9fKCkKLSAgU2ltcGxlX1R5cGUJCV9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8KKyAgU3RydWN0X1R5cGUgICAgICAgICAgIF9fbmV3X18oKSwgX19pbml0X18oKQorICBQb2ludGVyX1R5cGUgICAgICAgICAgX19uZXdfXygpLCBfX2luaXRfXygpLCBfYXNfcGFyYW1ldGVyXywgY29udGVudHMKKyAgQXJyYXlfVHlwZSAgICAgICAgICAgIF9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8sIF9fZ2V0L3NldGl0ZW1fXygpLCBfX2xlbl9fKCkKKyAgU2ltcGxlX1R5cGUgICAgICAgICAgIF9fbmV3X18oKSwgX19pbml0X18oKSwgX2FzX3BhcmFtZXRlcl8KIAogQ0ZpZWxkX1R5cGUKIFN0Z0RpY3RfVHlwZQpAQCAtNTAsMjggKzUwLDI4IEBACiAKIEl0IGhhcyBzb21lIHNpbWlsYXJpdHkgdG8gdGhlIGJ5cmVmKCkgY29uc3RydWN0IGNvbXBhcmVkIHRvIHBvaW50ZXIoKQogZnJvbV9hZGRyZXNzKGFkZHIpCi0JLSBjb25zdHJ1Y3QgYW4gaW5zdGFuY2UgZnJvbSBhIGdpdmVuIG1lbW9yeSBibG9jayAoc2hhcmluZyB0aGlzIG1lbW9yeSBibG9jaykKKyAgICAtIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBmcm9tIGEgZ2l2ZW4gbWVtb3J5IGJsb2NrIChzaGFyaW5nIHRoaXMgbWVtb3J5IGJsb2NrKQogCiBmcm9tX3BhcmFtKG9iaikKLQktIHR5cGVjaGVjayBhbmQgY29udmVydCBhIFB5dGhvbiBvYmplY3QgaW50byBhIEMgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIKLQkgIHRoZSByZXN1bHQgbWF5IGJlIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlLCBvciBhbiBpbnRlZ2VyIG9yIHR1cGxlCi0JICAodHlwZWNvZGUsIHZhbHVlWywgb2JqXSkKKyAgICAtIHR5cGVjaGVjayBhbmQgY29udmVydCBhIFB5dGhvbiBvYmplY3QgaW50byBhIEMgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIKKyAgICAgIHRoZSByZXN1bHQgbWF5IGJlIGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlLCBvciBhbiBpbnRlZ2VyIG9yIHR1cGxlCisgICAgICAodHlwZWNvZGUsIHZhbHVlWywgb2JqXSkKIAogaW5zdGFuY2UgbWV0aG9kcy9wcm9wZXJ0aWVzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogX2FzX3BhcmFtZXRlcl8KLQktIGNvbnZlcnQgc2VsZiBpbnRvIGEgQyBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlcgotCSAgVGhpcyBpcyBlaXRoZXIgYW4gaW50ZWdlciwgb3IgYSAzLXR1cGxlICh0eXBlY29kZSwgdmFsdWUsIG9iaikKKyAgICAtIGNvbnZlcnQgc2VsZiBpbnRvIGEgQyBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlcgorICAgICAgVGhpcyBpcyBlaXRoZXIgYW4gaW50ZWdlciwgb3IgYSAzLXR1cGxlICh0eXBlY29kZSwgdmFsdWUsIG9iaikKIAogZnVuY3Rpb25zCiAtLS0tLS0tLS0KIAogc2l6ZW9mKGNkYXRhKQotCS0gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIGJ1ZmZlciBjb250YWlucworICAgIC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIGJ1ZmZlciBjb250YWlucwogCiBzaXplb2YoY3R5cGUpCi0JLSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGUgYnVmZmVyIG9mIGFuIGluc3RhbmNlIHdvdWxkIGNvbnRhaW4KKyAgICAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBidWZmZXIgb2YgYW4gaW5zdGFuY2Ugd291bGQgY29udGFpbgogCiBieXJlZihjZGF0YSkKIApAQCAtODIsNyArODIsNyBAQAogUE9JTlRFUihjdHlwZSkKIAogYnl0ZXMoY2RhdGEpCi0JLSByZXR1cm4gdGhlIGJ1ZmZlciBjb250ZW50cyBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzICh3aGljaCBpcyBjdXJyZW50bHkgYSBzdHJpbmcpCisgICAgLSByZXR1cm4gdGhlIGJ1ZmZlciBjb250ZW50cyBhcyBhIHNlcXVlbmNlIG9mIGJ5dGVzICh3aGljaCBpcyBjdXJyZW50bHkgYSBzdHJpbmcpCiAKICovCiAKQEAgLTEwMyw3ICsxMDMsNyBAQAogICogQ0ZpZWxkX1R5cGUKICAqCiAgKi8KLQwKKwogI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCiAKICNpbmNsdWRlICJQeXRob24uaCIKQEAgLTE0MCw3ICsxNDAsNyBAQAogY2hhciAqY29udmVyc2lvbl9tb2RlX2VuY29kaW5nID0gTlVMTDsKIGNoYXIgKmNvbnZlcnNpb25fbW9kZV9lcnJvcnMgPSBOVUxMOwogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA0MDAwMCkKQEAgLTE0OCwxNDggKzE0OCwxNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVR1cGxlX1BhY2soaW50IG4sIC4uLikKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbzsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICoqaXRlbXM7Ci0JdmFfbGlzdCB2YXJnczsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqbzsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICoqaXRlbXM7CisgICAgdmFfbGlzdCB2YXJnczsKIAotCXZhX3N0YXJ0KHZhcmdzLCBuKTsKLQlyZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0ZW1zID0gKChQeVR1cGxlT2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCW8gPSB2YV9hcmcodmFyZ3MsIFB5T2JqZWN0ICopOwotCQlQeV9JTkNSRUYobyk7Ci0JCWl0ZW1zW2ldID0gbzsKLQl9Ci0JdmFfZW5kKHZhcmdzKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHZhX3N0YXJ0KHZhcmdzLCBuKTsKKyAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0ZW1zID0gKChQeVR1cGxlT2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIG8gPSB2YV9hcmcodmFyZ3MsIFB5T2JqZWN0ICopOworICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgIGl0ZW1zW2ldID0gbzsKKyAgICB9CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICprZXk7Ci0JUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICprZXk7CisgICAgUHlPYmplY3QgKmRpY3Q7CiB9IERpY3RSZW1vdmVyT2JqZWN0OwogCiBzdGF0aWMgdm9pZAogX0RpY3RSZW1vdmVyX2RlYWxsb2MoUHlPYmplY3QgKl9zZWxmKQogewotCURpY3RSZW1vdmVyT2JqZWN0ICpzZWxmID0gKERpY3RSZW1vdmVyT2JqZWN0ICopX3NlbGY7Ci0JUHlfWERFQ1JFRihzZWxmLT5rZXkpOwotCVB5X1hERUNSRUYoc2VsZi0+ZGljdCk7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShfc2VsZik7CisgICAgRGljdFJlbW92ZXJPYmplY3QgKnNlbGYgPSAoRGljdFJlbW92ZXJPYmplY3QgKilfc2VsZjsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmtleSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kaWN0KTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKF9zZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIF9EaWN0UmVtb3Zlcl9jYWxsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlEaWN0UmVtb3Zlck9iamVjdCAqc2VsZiA9IChEaWN0UmVtb3Zlck9iamVjdCAqKV9zZWxmOwotCWlmIChzZWxmLT5rZXkgJiYgc2VsZi0+ZGljdCkgewotCQlpZiAoLTEgPT0gUHlEaWN0X0RlbEl0ZW0oc2VsZi0+ZGljdCwgc2VsZi0+a2V5KSkKLQkJCS8qIFhYWCBFcnJvciBjb250ZXh0ICovCi0JCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoUHlfTm9uZSk7Ci0JCVB5X0RFQ1JFRihzZWxmLT5rZXkpOwotCQlzZWxmLT5rZXkgPSBOVUxMOwotCQlQeV9ERUNSRUYoc2VsZi0+ZGljdCk7Ci0JCXNlbGYtPmRpY3QgPSBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgRGljdFJlbW92ZXJPYmplY3QgKnNlbGYgPSAoRGljdFJlbW92ZXJPYmplY3QgKilfc2VsZjsKKyAgICBpZiAoc2VsZi0+a2V5ICYmIHNlbGYtPmRpY3QpIHsKKyAgICAgICAgaWYgKC0xID09IFB5RGljdF9EZWxJdGVtKHNlbGYtPmRpY3QsIHNlbGYtPmtleSkpCisgICAgICAgICAgICAvKiBYWFggRXJyb3IgY29udGV4dCAqLworICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKFB5X05vbmUpOworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+a2V5KTsKKyAgICAgICAgc2VsZi0+a2V5ID0gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPmRpY3QpOworICAgICAgICBzZWxmLT5kaWN0ID0gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IERpY3RSZW1vdmVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuRGljdFJlbW92ZXIiLAkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoRGljdFJlbW92ZXJPYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JX0RpY3RSZW1vdmVyX2RlYWxsb2MsCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JX0RpY3RSZW1vdmVyX2NhbGwsCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuRGljdFJlbW92ZXIiLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKERpY3RSZW1vdmVyT2JqZWN0KSwgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgX0RpY3RSZW1vdmVyX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIF9EaWN0UmVtb3Zlcl9jYWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogLyogWFhYIHNob3VsZCBwYXJ0aWNpcGF0ZSBpbiBHQz8gKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MgKi8KLQkiZGVsZXRlcyBhIGtleSBmcm9tIGEgZGljdGlvbmFyeSIsCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICJkZWxldGVzIGEga2V5IGZyb20gYSBkaWN0aW9uYXJ5IiwgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIGludAogUHlEaWN0X1NldEl0ZW1Qcm94eShQeU9iamVjdCAqZGljdCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JUHlPYmplY3QgKm9iajsKLQlEaWN0UmVtb3Zlck9iamVjdCAqcmVtb3ZlcjsKLQlQeU9iamVjdCAqcHJveHk7Ci0JaW50IHJlc3VsdDsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIERpY3RSZW1vdmVyT2JqZWN0ICpyZW1vdmVyOworICAgIFB5T2JqZWN0ICpwcm94eTsKKyAgICBpbnQgcmVzdWx0OwogCi0Jb2JqID0gUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmRGljdFJlbW92ZXJfVHlwZSwgTlVMTCk7Ci0JaWYgKG9iaiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgb2JqID0gUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmRGljdFJlbW92ZXJfVHlwZSwgTlVMTCk7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZW1vdmVyID0gKERpY3RSZW1vdmVyT2JqZWN0ICopb2JqOwotCWFzc2VydChyZW1vdmVyLT5rZXkgPT0gTlVMTCk7Ci0JYXNzZXJ0KHJlbW92ZXItPmRpY3QgPT0gTlVMTCk7Ci0JUHlfSU5DUkVGKGtleSk7Ci0JcmVtb3Zlci0+a2V5ID0ga2V5OwotCVB5X0lOQ1JFRihkaWN0KTsKLQlyZW1vdmVyLT5kaWN0ID0gZGljdDsKKyAgICByZW1vdmVyID0gKERpY3RSZW1vdmVyT2JqZWN0ICopb2JqOworICAgIGFzc2VydChyZW1vdmVyLT5rZXkgPT0gTlVMTCk7CisgICAgYXNzZXJ0KHJlbW92ZXItPmRpY3QgPT0gTlVMTCk7CisgICAgUHlfSU5DUkVGKGtleSk7CisgICAgcmVtb3Zlci0+a2V5ID0ga2V5OworICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICByZW1vdmVyLT5kaWN0ID0gZGljdDsKIAotCXByb3h5ID0gUHlXZWFrcmVmX05ld1Byb3h5KGl0ZW0sIG9iaik7Ci0JUHlfREVDUkVGKG9iaik7Ci0JaWYgKHByb3h5ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBwcm94eSA9IFB5V2Vha3JlZl9OZXdQcm94eShpdGVtLCBvYmopOworICAgIFB5X0RFQ1JFRihvYmopOworICAgIGlmIChwcm94eSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXN1bHQgPSBQeURpY3RfU2V0SXRlbShkaWN0LCBrZXksIHByb3h5KTsKLQlQeV9ERUNSRUYocHJveHkpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlEaWN0X1NldEl0ZW0oZGljdCwga2V5LCBwcm94eSk7CisgICAgUHlfREVDUkVGKHByb3h5KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeURpY3RfR2V0SXRlbVByb3h5KFB5T2JqZWN0ICpkaWN0LCBQeU9iamVjdCAqa2V5KQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKml0ZW0gPSBQeURpY3RfR2V0SXRlbShkaWN0LCBrZXkpOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKml0ZW0gPSBQeURpY3RfR2V0SXRlbShkaWN0LCBrZXkpOwogCi0JaWYgKGl0ZW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeVdlYWtyZWZfQ2hlY2tQcm94eShpdGVtKSkKLQkJcmV0dXJuIGl0ZW07Ci0JcmVzdWx0ID0gUHlXZWFrcmVmX0dFVF9PQkpFQ1QoaXRlbSk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob25lKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlXZWFrcmVmX0NoZWNrUHJveHkoaXRlbSkpCisgICAgICAgIHJldHVybiBpdGVtOworICAgIHJlc3VsdCA9IFB5V2Vha3JlZl9HRVRfT0JKRUNUKGl0ZW0pOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMwMiwyNSArMzAyLDI1IEBACiBjaGFyICoKIGFsbG9jX2Zvcm1hdF9zdHJpbmcoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICpzdWZmaXgpCiB7Ci0Jc2l6ZV90IGxlbjsKLQljaGFyICpyZXN1bHQ7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjaGFyICpyZXN1bHQ7CiAKLQlpZiAoc3VmZml4ID09IE5VTEwpIHsKLQkJYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbGVuID0gc3RybGVuKHN1ZmZpeCk7Ci0JaWYgKHByZWZpeCkKLQkJbGVuICs9IHN0cmxlbihwcmVmaXgpOwotCXJlc3VsdCA9IFB5TWVtX01hbGxvYyhsZW4gKyAxKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChwcmVmaXgpCi0JCXN0cmNweShyZXN1bHQsIHByZWZpeCk7Ci0JZWxzZQotCQlyZXN1bHRbMF0gPSAnXDAnOwotCXN0cmNhdChyZXN1bHQsIHN1ZmZpeCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoc3VmZml4ID09IE5VTEwpIHsKKyAgICAgICAgYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGVuID0gc3RybGVuKHN1ZmZpeCk7CisgICAgaWYgKHByZWZpeCkKKyAgICAgICAgbGVuICs9IHN0cmxlbihwcmVmaXgpOworICAgIHJlc3VsdCA9IFB5TWVtX01hbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwcmVmaXgpCisgICAgICAgIHN0cmNweShyZXN1bHQsIHByZWZpeCk7CisgICAgZWxzZQorICAgICAgICByZXN1bHRbMF0gPSAnXDAnOworICAgIHN0cmNhdChyZXN1bHQsIHN1ZmZpeCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTMzMywxMDAgKzMzMywxMDAgQEAKIHN0YXRpYyBQeUNBcmdPYmplY3QgKgogU3RydWN0VW5pb25UeXBlX3BhcmFtZnVuYyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdDsKLQkKLQlwYXJnID0gbmV3X0NBcmdPYmplY3QoKTsKLQlpZiAocGFyZyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAotCXBhcmctPnRhZyA9ICdWJzsKLQlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBzdHJ1Y3R1cmUvdW5pb24gaW5zdGFuY2VzICovCi0JcGFyZy0+cGZmaV90eXBlID0gJnN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXI7Ci0JLyogRm9yIHN0cnVjdHVyZSBwYXJhbWV0ZXJzIChieSB2YWx1ZSksIHBhcmctPnZhbHVlIGRvZXNuJ3QgY29udGFpbiB0aGUgc3RydWN0dXJlCi0JICAgZGF0YSBpdHNlbGYsIGluc3RlYWQgcGFyZy0+dmFsdWUucCAqcG9pbnRzKiB0byB0aGUgc3RydWN0dXJlJ3MgZGF0YQotCSAgIFNlZSBhbHNvIF9jdHlwZXMuYywgZnVuY3Rpb24gX2NhbGxfZnVuY3Rpb25fcG9pbnRlcigpLgotCSovCi0JcGFyZy0+dmFsdWUucCA9IHNlbGYtPmJfcHRyOwotCXBhcmctPnNpemUgPSBzZWxmLT5iX3NpemU7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7Ci0JcmV0dXJuIHBhcmc7CQorICAgIHBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOworICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcGFyZy0+dGFnID0gJ1YnOworICAgIHN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHN0cnVjdHVyZS91bmlvbiBpbnN0YW5jZXMgKi8KKyAgICBwYXJnLT5wZmZpX3R5cGUgPSAmc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKKyAgICAvKiBGb3Igc3RydWN0dXJlIHBhcmFtZXRlcnMgKGJ5IHZhbHVlKSwgcGFyZy0+dmFsdWUgZG9lc24ndCBjb250YWluIHRoZSBzdHJ1Y3R1cmUKKyAgICAgICBkYXRhIGl0c2VsZiwgaW5zdGVhZCBwYXJnLT52YWx1ZS5wICpwb2ludHMqIHRvIHRoZSBzdHJ1Y3R1cmUncyBkYXRhCisgICAgICAgU2VlIGFsc28gX2N0eXBlcy5jLCBmdW5jdGlvbiBfY2FsbF9mdW5jdGlvbl9wb2ludGVyKCkuCisgICAgKi8KKyAgICBwYXJnLT52YWx1ZS5wID0gc2VsZi0+Yl9wdHI7CisgICAgcGFyZy0+c2l6ZSA9IHNlbGYtPmJfc2l6ZTsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcGFyZy0+b2JqID0gKFB5T2JqZWN0ICopc2VsZjsKKyAgICByZXR1cm4gcGFyZzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFN0cnVjdFVuaW9uVHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsIGludCBpc1N0cnVjdCkKIHsKLQlQeVR5cGVPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqZmllbGRzOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmZpZWxkczsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCi0JICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLwotCXJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKCFyZXN1bHQpCi0JCXJldHVybiBOVUxMOworICAgIC8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAorICAgICAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KKyAgICByZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGtlZXAgdGhpcyBmb3IgYncgY29tcGF0aWJpbGl0eSAqLwotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhyZXN1bHQtPnRwX2RpY3QsICJfYWJzdHJhY3RfIikpCi0JCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgLyoga2VlcCB0aGlzIGZvciBidyBjb21wYXRpYmlsaXR5ICovCisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHJlc3VsdC0+dHBfZGljdCwgIl9hYnN0cmFjdF8iKSkKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIAotCWRpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7Ci0JaWYgKCFkaWN0KSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzdGdkaWN0LCB3aGljaCBob2xkcyBpbmZvCi0JICAgYWJvdXQgc3RvcmFnZSByZXF1aXJlbWVudHMgb2YgdGhlIGluc3RhbmNlcyAqLwotCWlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKWRpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOwotCXJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKWRpY3Q7Ci0JZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiQiIpOwotCWlmIChkaWN0LT5mb3JtYXQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGRpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7CisgICAgaWYgKCFkaWN0KSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzdGdkaWN0LCB3aGljaCBob2xkcyBpbmZvCisgICAgICAgYWJvdXQgc3RvcmFnZSByZXF1aXJlbWVudHMgb2YgdGhlIGluc3RhbmNlcyAqLworICAgIGlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKWRpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOworICAgIHJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKWRpY3Q7CisgICAgZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiQiIpOworICAgIGlmIChkaWN0LT5mb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZGljdC0+cGFyYW1mdW5jID0gU3RydWN0VW5pb25UeXBlX3BhcmFtZnVuYzsKKyAgICBkaWN0LT5wYXJhbWZ1bmMgPSBTdHJ1Y3RVbmlvblR5cGVfcGFyYW1mdW5jOwogCi0JZmllbGRzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopZGljdCwgIl9maWVsZHNfIik7Ci0JaWYgKCFmaWVsZHMpIHsKLQkJU3RnRGljdE9iamVjdCAqYmFzZWRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilyZXN1bHQtPnRwX2Jhc2UpOworICAgIGZpZWxkcyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKWRpY3QsICJfZmllbGRzXyIpOworICAgIGlmICghZmllbGRzKSB7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmJhc2VkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopcmVzdWx0LT50cF9iYXNlKTsKIAotCQlpZiAoYmFzZWRpY3QgPT0gTlVMTCkKLQkJCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7Ci0JCS8qIGNvcHkgYmFzZSBkaWN0ICovCi0JCWlmICgtMSA9PSBTdGdEaWN0X2Nsb25lKGRpY3QsIGJhc2VkaWN0KSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlkaWN0LT5mbGFncyAmPSB+RElDVEZMQUdfRklOQUw7IC8qIGNsZWFyIHRoZSAnZmluYWwnIGZsYWcgaW4gdGhlIHN1YmNsYXNzIGRpY3QgKi8KLQkJYmFzZWRpY3QtPmZsYWdzIHw9IERJQ1RGTEFHX0ZJTkFMOyAvKiBzZXQgdGhlICdmaW5hbCcgZmxhZyBpbiB0aGUgYmFzZWNsYXNzIGRpY3QgKi8KLQkJcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKLQl9CisgICAgICAgIGlmIChiYXNlZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICAgICAgLyogY29weSBiYXNlIGRpY3QgKi8KKyAgICAgICAgaWYgKC0xID09IFN0Z0RpY3RfY2xvbmUoZGljdCwgYmFzZWRpY3QpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGRpY3QtPmZsYWdzICY9IH5ESUNURkxBR19GSU5BTDsgLyogY2xlYXIgdGhlICdmaW5hbCcgZmxhZyBpbiB0aGUgc3ViY2xhc3MgZGljdCAqLworICAgICAgICBiYXNlZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7IC8qIHNldCB0aGUgJ2ZpbmFsJyBmbGFnIGluIHRoZSBiYXNlY2xhc3MgZGljdCAqLworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIH0KIAotCWlmICgtMSA9PSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXJlc3VsdCwgIl9maWVsZHNfIiwgZmllbGRzKSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgaWYgKC0xID09IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX2ZpZWxkc18iLCBmaWVsZHMpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFN0cnVjdFR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiBTdHJ1Y3RVbmlvblR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMsIDEpOworICAgIHJldHVybiBTdHJ1Y3RVbmlvblR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVW5pb25UeXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlyZXR1cm4gU3RydWN0VW5pb25UeXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzLCAwKTsKKyAgICByZXR1cm4gU3RydWN0VW5pb25UeXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzLCAwKTsKIH0KIAogc3RhdGljIGNoYXIgZnJvbV9hZGRyZXNzX2RvY1tdID0KQEAgLTQzNSwxNiArNDM1LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFUeXBlX2Zyb21fYWRkcmVzcyhQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQogewotCXZvaWQgKmJ1ZjsKLQlpZiAoIVB5SW50X0NoZWNrKHZhbHVlKSAmJiAhUHlMb25nX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpbnRlZ2VyIGV4cGVjdGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlidWYgPSAodm9pZCAqKVB5TG9uZ19Bc1ZvaWRQdHIodmFsdWUpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gQ0RhdGFfQXRBZGRyZXNzKHR5cGUsIGJ1Zik7CisgICAgdm9pZCAqYnVmOworICAgIGlmICghUHlJbnRfQ2hlY2sodmFsdWUpICYmICFQeUxvbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciBleHBlY3RlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYnVmID0gKHZvaWQgKilQeUxvbmdfQXNWb2lkUHRyKHZhbHVlKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIENEYXRhX0F0QWRkcmVzcyh0eXBlLCBidWYpOwogfQogCiBzdGF0aWMgY2hhciBmcm9tX2J1ZmZlcl9kb2NbXSA9CkBAIC00NTYsNTEgKzQ1Niw1MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIENEYXRhVHlwZV9mcm9tX2J1ZmZlcihQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jdm9pZCAqYnVmZmVyOwotCVB5X3NzaXplX3QgYnVmZmVyX2xlbjsKLQlQeV9zc2l6ZV90IG9mZnNldCA9IDA7Ci0JUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JYXNzZXJ0IChkaWN0KTsKKyAgICB2b2lkICpidWZmZXI7CisgICAgUHlfc3NpemVfdCBidWZmZXJfbGVuOworICAgIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBQeU9iamVjdCAqb2JqLCAqcmVzdWx0OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBhc3NlcnQgKGRpY3QpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSAgICAgICJPfGk6ZnJvbV9idWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT3xpOmZyb21fYnVmZmVyIiwKICNlbHNlCi0JCQkgICAgICAiT3xuOmZyb21fYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk98bjpmcm9tX2J1ZmZlciIsCiAjZW5kaWYKLQkJCSAgICAgICZvYmosICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iaiwgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKC0xID09IFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIob2JqLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgtMSA9PSBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKG9iaiwgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChvZmZzZXQgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZGljdC0+c2l6ZSA+IGJ1ZmZlcl9sZW4gLSBvZmZzZXQpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGRpY3QtPnNpemUgPiBidWZmZXJfbGVuIC0gb2Zmc2V0KSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCVkIGluc3RlYWQgb2YgYXQgbGVhc3QgJWQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCVkIGluc3RlYWQgb2YgYXQgbGVhc3QgJWQgYnl0ZXMpIiwKICNlbHNlCi0JCQkgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCV6ZCBpbnN0ZWFkIG9mIGF0IGxlYXN0ICV6ZCBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBzaXplIHRvbyBzbWFsbCAoJXpkIGluc3RlYWQgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzKSIsCiAjZW5kaWYKLQkJCSAgICAgYnVmZmVyX2xlbiwgZGljdC0+c2l6ZSArIG9mZnNldCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW4sIGRpY3QtPnNpemUgKyBvZmZzZXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXN1bHQgPSBDRGF0YV9BdEFkZHJlc3ModHlwZSwgKGNoYXIgKilidWZmZXIgKyBvZmZzZXQpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gQ0RhdGFfQXRBZGRyZXNzKHR5cGUsIChjaGFyICopYnVmZmVyICsgb2Zmc2V0KTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKG9iaik7Ci0JaWYgKC0xID09IEtlZXBSZWYoKENEYXRhT2JqZWN0ICopcmVzdWx0LCAtMSwgb2JqKSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlfSU5DUkVGKG9iaik7CisgICAgaWYgKC0xID09IEtlZXBSZWYoKENEYXRhT2JqZWN0ICopcmVzdWx0LCAtMSwgb2JqKSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBjaGFyIGZyb21fYnVmZmVyX2NvcHlfZG9jW10gPQpAQCAtNTEyLDQ4ICs1MTIsNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRGF0YVR5cGVfZnJvbV9idWZmZXJfY29weShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY29uc3Qgdm9pZCAqYnVmZmVyOwotCVB5X3NzaXplX3QgYnVmZmVyX2xlbjsKLQlQeV9zc2l6ZV90IG9mZnNldCA9IDA7Ci0JUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JYXNzZXJ0IChkaWN0KTsKKyAgICBjb25zdCB2b2lkICpidWZmZXI7CisgICAgUHlfc3NpemVfdCBidWZmZXJfbGVuOworICAgIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBQeU9iamVjdCAqb2JqLCAqcmVzdWx0OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBhc3NlcnQgKGRpY3QpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSAgICAgICJPfGk6ZnJvbV9idWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT3xpOmZyb21fYnVmZmVyIiwKICNlbHNlCi0JCQkgICAgICAiT3xuOmZyb21fYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk98bjpmcm9tX2J1ZmZlciIsCiAjZW5kaWYKLQkJCSAgICAgICZvYmosICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iaiwgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKC0xID09IFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmosICZidWZmZXIsICZidWZmZXJfbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKC0xID09IFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmosICZidWZmZXIsICZidWZmZXJfbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAob2Zmc2V0IDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZGljdC0+c2l6ZSA+IGJ1ZmZlcl9sZW4gLSBvZmZzZXQpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgaWYgKGRpY3QtPnNpemUgPiBidWZmZXJfbGVuIC0gb2Zmc2V0KSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCVkIGluc3RlYWQgb2YgYXQgbGVhc3QgJWQgYnl0ZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCVkIGluc3RlYWQgb2YgYXQgbGVhc3QgJWQgYnl0ZXMpIiwKICNlbHNlCi0JCQkgICAgICJCdWZmZXIgc2l6ZSB0b28gc21hbGwgKCV6ZCBpbnN0ZWFkIG9mIGF0IGxlYXN0ICV6ZCBieXRlcykiLAorICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciBzaXplIHRvbyBzbWFsbCAoJXpkIGluc3RlYWQgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzKSIsCiAjZW5kaWYKLQkJCSAgICAgYnVmZmVyX2xlbiwgZGljdC0+c2l6ZSArIG9mZnNldCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW4sIGRpY3QtPnNpemUgKyBvZmZzZXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXN1bHQgPSBHZW5lcmljQ0RhdGFfbmV3KChQeVR5cGVPYmplY3QgKil0eXBlLCBOVUxMLCBOVUxMKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgoKENEYXRhT2JqZWN0ICopcmVzdWx0KS0+Yl9wdHIsCi0JICAgICAgIChjaGFyICopYnVmZmVyK29mZnNldCwgZGljdC0+c2l6ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBHZW5lcmljQ0RhdGFfbmV3KChQeVR5cGVPYmplY3QgKil0eXBlLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgoKENEYXRhT2JqZWN0ICopcmVzdWx0KS0+Yl9wdHIsCisgICAgICAgICAgIChjaGFyICopYnVmZmVyK29mZnNldCwgZGljdC0+c2l6ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGNoYXIgaW5fZGxsX2RvY1tdID0KQEAgLTU2Miw1NSArNTYyLDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFUeXBlX2luX2RsbChQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmRsbDsKLQljaGFyICpuYW1lOwotCVB5T2JqZWN0ICpvYmo7Ci0Jdm9pZCAqaGFuZGxlOwotCXZvaWQgKmFkZHJlc3M7CisgICAgUHlPYmplY3QgKmRsbDsKKyAgICBjaGFyICpuYW1lOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgdm9pZCAqaGFuZGxlOworICAgIHZvaWQgKmFkZHJlc3M7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zOmluX2RsbCIsICZkbGwsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPczppbl9kbGwiLCAmZGxsLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jb2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkbGwsICJfaGFuZGxlIik7Ci0JaWYgKCFvYmopCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlJbnRfQ2hlY2sob2JqKSAmJiAhUHlMb25nX0NoZWNrKG9iaikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidGhlIF9oYW5kbGUgYXR0cmlidXRlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaGFuZGxlID0gKHZvaWQgKilQeUxvbmdfQXNWb2lkUHRyKG9iaik7Ci0JUHlfREVDUkVGKG9iaik7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNvdWxkIG5vdCBjb252ZXJ0IHRoZSBfaGFuZGxlIGF0dHJpYnV0ZSB0byBhIHBvaW50ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGxsLCAiX2hhbmRsZSIpOworICAgIGlmICghb2JqKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SW50X0NoZWNrKG9iaikgJiYgIVB5TG9uZ19DaGVjayhvYmopKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIF9oYW5kbGUgYXR0cmlidXRlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaGFuZGxlID0gKHZvaWQgKilQeUxvbmdfQXNWb2lkUHRyKG9iaik7CisgICAgUHlfREVDUkVGKG9iaik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNvbnZlcnQgdGhlIF9oYW5kbGUgYXR0cmlidXRlIHRvIGEgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZmRlZiBNU19XSU4zMgotCWFkZHJlc3MgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7Ci0JaWYgKCFhZGRyZXNzKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAic3ltYm9sICclcycgbm90IGZvdW5kIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBhZGRyZXNzID0gKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhoYW5kbGUsIG5hbWUpOworICAgIGlmICghYWRkcmVzcykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJzeW1ib2wgJyVzJyBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbHNlCi0JYWRkcmVzcyA9ICh2b2lkICopY3R5cGVzX2Rsc3ltKGhhbmRsZSwgbmFtZSk7Ci0JaWYgKCFhZGRyZXNzKSB7CisgICAgYWRkcmVzcyA9ICh2b2lkICopY3R5cGVzX2Rsc3ltKGhhbmRsZSwgbmFtZSk7CisgICAgaWYgKCFhZGRyZXNzKSB7CiAjaWZkZWYgX19DWUdXSU5fXwogLyogZGxlcnJvcigpIGlzbid0IHZlcnkgaGVscGZ1bCBvbiBjeWd3aW4gKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJzeW1ib2wgJyVzJyBub3QgZm91bmQgKCVzKSAiLAotCQkJICAgICBuYW1lKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAic3ltYm9sICclcycgbm90IGZvdW5kICglcykgIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwogI2Vsc2UKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGN0eXBlc19kbGVycm9yKCkpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgY3R5cGVzX2RsZXJyb3IoKSk7CiAjZW5kaWYKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gQ0RhdGFfQXRBZGRyZXNzKHR5cGUsIGFkZHJlc3MpOworICAgIHJldHVybiBDRGF0YV9BdEFkZHJlc3ModHlwZSwgYWRkcmVzcyk7CiB9CiAKIHN0YXRpYyBjaGFyIGZyb21fcGFyYW1fZG9jW10gPQpAQCAtNjE5LDIxMyArNjE5LDIxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIENEYXRhVHlwZV9mcm9tX3BhcmFtKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKmFzX3BhcmFtZXRlcjsKLQlpZiAoMSA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgewotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCWlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKLQkJUHlDQXJnT2JqZWN0ICpwID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOwotCQlQeU9iamVjdCAqb2IgPSBwLT5vYmo7Ci0JCWNvbnN0IGNoYXIgKm9iX25hbWU7Ci0JCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JCWRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBQeU9iamVjdCAqYXNfcGFyYW1ldGVyOworICAgIGlmICgxID09IFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGUpKSB7CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgeworICAgICAgICBQeUNBcmdPYmplY3QgKnAgPSAoUHlDQXJnT2JqZWN0ICopdmFsdWU7CisgICAgICAgIFB5T2JqZWN0ICpvYiA9IHAtPm9iajsKKyAgICAgICAgY29uc3QgY2hhciAqb2JfbmFtZTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICAgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwogCi0JCS8qIElmIHdlIGdvdCBhIFB5Q0FyZ09iamVjdCwgd2UgbXVzdCBjaGVjayBpZiB0aGUgb2JqZWN0IHBhY2tlZCBpbiBpdAotCQkgICBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSdzIGRpY3QtPnByb3RvICovCi0JCWlmKGRpY3QgJiYgb2IKLQkJICAgJiYgUHlPYmplY3RfSXNJbnN0YW5jZShvYiwgZGljdC0+cHJvdG8pKSB7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JCW9iX25hbWUgPSAob2IpID8gUHlfVFlQRShvYiktPnRwX25hbWUgOiAiPz8/IjsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImV4cGVjdGVkICVzIGluc3RhbmNlIGluc3RlYWQgb2YgcG9pbnRlciB0byAlcyIsCi0JCQkgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUsIG9iX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIC8qIElmIHdlIGdvdCBhIFB5Q0FyZ09iamVjdCwgd2UgbXVzdCBjaGVjayBpZiB0aGUgb2JqZWN0IHBhY2tlZCBpbiBpdAorICAgICAgICAgICBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSdzIGRpY3QtPnByb3RvICovCisgICAgICAgIGlmKGRpY3QgJiYgb2IKKyAgICAgICAgICAgJiYgUHlPYmplY3RfSXNJbnN0YW5jZShvYiwgZGljdC0+cHJvdG8pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgICAgIG9iX25hbWUgPSAob2IpID8gUHlfVFlQRShvYiktPnRwX25hbWUgOiAiPz8/IjsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyBpbnN0YW5jZSBpbnN0ZWFkIG9mIHBvaW50ZXIgdG8gJXMiLAorICAgICAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSwgb2JfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWFzX3BhcmFtZXRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodmFsdWUsICJfYXNfcGFyYW1ldGVyXyIpOwotCWlmIChhc19wYXJhbWV0ZXIpIHsKLQkJdmFsdWUgPSBDRGF0YVR5cGVfZnJvbV9wYXJhbSh0eXBlLCBhc19wYXJhbWV0ZXIpOwotCQlQeV9ERUNSRUYoYXNfcGFyYW1ldGVyKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJleHBlY3RlZCAlcyBpbnN0YW5jZSBpbnN0ZWFkIG9mICVzIiwKLQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLAotCQkgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKKyAgICBpZiAoYXNfcGFyYW1ldGVyKSB7CisgICAgICAgIHZhbHVlID0gQ0RhdGFUeXBlX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKKyAgICAgICAgUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzIGluc3RhbmNlIGluc3RlYWQgb2YgJXMiLAorICAgICAgICAgICAgICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRGF0YVR5cGVfbWV0aG9kc1tdID0gewotCXsgImZyb21fcGFyYW0iLCBDRGF0YVR5cGVfZnJvbV9wYXJhbSwgTUVUSF9PLCBmcm9tX3BhcmFtX2RvYyB9LAotCXsgImZyb21fYWRkcmVzcyIsIENEYXRhVHlwZV9mcm9tX2FkZHJlc3MsIE1FVEhfTywgZnJvbV9hZGRyZXNzX2RvYyB9LAotCXsgImZyb21fYnVmZmVyIiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyLCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2RvYywgfSwKLQl7ICJmcm9tX2J1ZmZlcl9jb3B5IiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyX2NvcHksIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfY29weV9kb2MsIH0sCi0JeyAiaW5fZGxsIiwgQ0RhdGFUeXBlX2luX2RsbCwgTUVUSF9WQVJBUkdTLCBpbl9kbGxfZG9jIH0sCi0JeyBOVUxMLCBOVUxMIH0sCisgICAgeyAiZnJvbV9wYXJhbSIsIENEYXRhVHlwZV9mcm9tX3BhcmFtLCBNRVRIX08sIGZyb21fcGFyYW1fZG9jIH0sCisgICAgeyAiZnJvbV9hZGRyZXNzIiwgQ0RhdGFUeXBlX2Zyb21fYWRkcmVzcywgTUVUSF9PLCBmcm9tX2FkZHJlc3NfZG9jIH0sCisgICAgeyAiZnJvbV9idWZmZXIiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXIsIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfZG9jLCB9LAorICAgIHsgImZyb21fYnVmZmVyX2NvcHkiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXJfY29weSwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9jb3B5X2RvYywgfSwKKyAgICB7ICJpbl9kbGwiLCBDRGF0YVR5cGVfaW5fZGxsLCBNRVRIX1ZBUkFSR1MsIGluX2RsbF9kb2MgfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRGF0YVR5cGVfcmVwZWF0KFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGxlbmd0aCkKIHsKLQlpZiAobGVuZ3RoIDwgMCkKLQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgIGlmIChsZW5ndGggPCAwKQorICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCQkgICAgIkFycmF5IGxlbmd0aCBtdXN0IGJlID49IDAsIG5vdCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5IGxlbmd0aCBtdXN0IGJlID49IDAsIG5vdCAlZCIsCiAjZWxzZQotCQkJCSAgICAiQXJyYXkgbGVuZ3RoIG11c3QgYmUgPj0gMCwgbm90ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5IGxlbmd0aCBtdXN0IGJlID49IDAsIG5vdCAlemQiLAogI2VuZGlmCi0JCQkJICAgIGxlbmd0aCk7Ci0JcmV0dXJuIENyZWF0ZUFycmF5VHlwZShzZWxmLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7CisgICAgcmV0dXJuIENyZWF0ZUFycmF5VHlwZShzZWxmLCBsZW5ndGgpOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgQ0RhdGFUeXBlX2FzX3NlcXVlbmNlID0gewotCTAsCQkJLyogaW5xdWlyeSBzcV9sZW5ndGg7ICovCi0JMCwJCQkvKiBiaW5hcnlmdW5jIHNxX2NvbmNhdDsgKi8KLQlDRGF0YVR5cGVfcmVwZWF0LAkvKiBpbnRhcmdmdW5jIHNxX3JlcGVhdDsgKi8KLQkwLAkJCS8qIGludGFyZ2Z1bmMgc3FfaXRlbTsgKi8KLQkwLAkJCS8qIGludGludGFyZ2Z1bmMgc3Ffc2xpY2U7ICovCi0JMCwJCQkvKiBpbnRvYmphcmdwcm9jIHNxX2Fzc19pdGVtOyAqLwotCTAsCQkJLyogaW50aW50b2JqYXJncHJvYyBzcV9hc3Nfc2xpY2U7ICovCi0JMCwJCQkvKiBvYmpvYmpwcm9jIHNxX2NvbnRhaW5zOyAqLwotCQotCTAsCQkJLyogYmluYXJ5ZnVuYyBzcV9pbnBsYWNlX2NvbmNhdDsgKi8KLQkwLAkJCS8qIGludGFyZ2Z1bmMgc3FfaW5wbGFjZV9yZXBlYXQ7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucXVpcnkgc3FfbGVuZ3RoOyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaW5hcnlmdW5jIHNxX2NvbmNhdDsgKi8KKyAgICBDRGF0YVR5cGVfcmVwZWF0LCAgICAgICAgICAgLyogaW50YXJnZnVuYyBzcV9yZXBlYXQ7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGFyZ2Z1bmMgc3FfaXRlbTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50aW50YXJnZnVuYyBzcV9zbGljZTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50b2JqYXJncHJvYyBzcV9hc3NfaXRlbTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50aW50b2JqYXJncHJvYyBzcV9hc3Nfc2xpY2U7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iam9ianByb2Mgc3FfY29udGFpbnM7ICovCisKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmluYXJ5ZnVuYyBzcV9pbnBsYWNlX2NvbmNhdDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50YXJnZnVuYyBzcV9pbnBsYWNlX3JlcGVhdDsgKi8KIH07CiAKIHN0YXRpYyBpbnQKIENEYXRhVHlwZV9jbGVhcihQeVR5cGVPYmplY3QgKnNlbGYpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWlmIChkaWN0KQotCQlQeV9DTEVBUihkaWN0LT5wcm90byk7Ci0JcmV0dXJuIFB5VHlwZV9UeXBlLnRwX2NsZWFyKChQeU9iamVjdCAqKXNlbGYpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoZGljdCkKKyAgICAgICAgUHlfQ0xFQVIoZGljdC0+cHJvdG8pOworICAgIHJldHVybiBQeVR5cGVfVHlwZS50cF9jbGVhcigoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIGludAogQ0RhdGFUeXBlX3RyYXZlcnNlKFB5VHlwZU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWlmIChkaWN0KQotCQlQeV9WSVNJVChkaWN0LT5wcm90byk7Ci0JcmV0dXJuIFB5VHlwZV9UeXBlLnRwX3RyYXZlcnNlKChQeU9iamVjdCAqKXNlbGYsIHZpc2l0LCBhcmcpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoZGljdCkKKyAgICAgICAgUHlfVklTSVQoZGljdC0+cHJvdG8pOworICAgIHJldHVybiBQeVR5cGVfVHlwZS50cF90cmF2ZXJzZSgoUHlPYmplY3QgKilzZWxmLCB2aXNpdCwgYXJnKTsKIH0KIAogc3RhdGljIGludAogU3RydWN0VHlwZV9zZXRhdHRybyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbHVlKQogewotCS8qIFhYWCBTaG91bGQgd2UgZGlzYWxsb3cgZGVsZXRpbmcgX2ZpZWxkc18/ICovCi0JaWYgKC0xID09IFB5VHlwZV9UeXBlLnRwX3NldGF0dHJvKHNlbGYsIGtleSwgdmFsdWUpKQotCQlyZXR1cm4gLTE7Ci0JCi0JaWYgKHZhbHVlICYmIFB5U3RyaW5nX0NoZWNrKGtleSkgJiYKLQkgICAgMCA9PSBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKGtleSksICJfZmllbGRzXyIpKQotCQlyZXR1cm4gU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KHNlbGYsIHZhbHVlLCAxKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFggU2hvdWxkIHdlIGRpc2FsbG93IGRlbGV0aW5nIF9maWVsZHNfPyAqLworICAgIGlmICgtMSA9PSBQeVR5cGVfVHlwZS50cF9zZXRhdHRybyhzZWxmLCBrZXksIHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKHZhbHVlICYmIFB5U3RyaW5nX0NoZWNrKGtleSkgJiYKKyAgICAgICAgMCA9PSBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKGtleSksICJfZmllbGRzXyIpKQorICAgICAgICByZXR1cm4gU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KHNlbGYsIHZhbHVlLCAxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBVbmlvblR5cGVfc2V0YXR0cm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQkvKiBYWFggU2hvdWxkIHdlIGRpc2FsbG93IGRlbGV0aW5nIF9maWVsZHNfPyAqLwotCWlmICgtMSA9PSBQeU9iamVjdF9HZW5lcmljU2V0QXR0cihzZWxmLCBrZXksIHZhbHVlKSkKLQkJcmV0dXJuIC0xOwotCQotCWlmIChQeVN0cmluZ19DaGVjayhrZXkpICYmCi0JICAgIDAgPT0gc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhrZXkpLCAiX2ZpZWxkc18iKSkKLQkJcmV0dXJuIFN0cnVjdFVuaW9uVHlwZV91cGRhdGVfc3RnZGljdChzZWxmLCB2YWx1ZSwgMCk7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYIFNob3VsZCB3ZSBkaXNhbGxvdyBkZWxldGluZyBfZmllbGRzXz8gKi8KKyAgICBpZiAoLTEgPT0gUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoc2VsZiwga2V5LCB2YWx1ZSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChQeVN0cmluZ19DaGVjayhrZXkpICYmCisgICAgICAgIDAgPT0gc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhrZXkpLCAiX2ZpZWxkc18iKSkKKyAgICAgICAgcmV0dXJuIFN0cnVjdFVuaW9uVHlwZV91cGRhdGVfc3RnZGljdChzZWxmLCB2YWx1ZSwgMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogUHlUeXBlT2JqZWN0IFN0cnVjdFR5cGVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5TdHJ1Y3RUeXBlIiwJCQkvKiB0cF9uYW1lICovCi0JMCwJCQkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkgICAgICAgCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZDRGF0YVR5cGVfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JU3RydWN0VHlwZV9zZXRhdHRybywJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCSJtZXRhdHlwZSBmb3IgdGhlIENEYXRhIE9iamVjdHMiLAkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKUNEYXRhVHlwZV90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlDRGF0YVR5cGVfY2xlYXIsCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JQ0RhdGFUeXBlX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlTdHJ1Y3RUeXBlX25ldywJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5TdHJ1Y3RUeXBlIiwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgU3RydWN0VHlwZV9zZXRhdHRybywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAibWV0YXR5cGUgZm9yIHRoZSBDRGF0YSBPYmplY3RzIiwgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YVR5cGVfY2xlYXIsICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgQ0RhdGFUeXBlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFN0cnVjdFR5cGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFVuaW9uVHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlVuaW9uVHlwZSIsCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JVW5pb25UeXBlX3NldGF0dHJvLAkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JIm1ldGF0eXBlIGZvciB0aGUgQ0RhdGEgT2JqZWN0cyIsCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlDRGF0YVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCVVuaW9uVHlwZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuVW5pb25UeXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBVbmlvblR5cGVfc2V0YXR0cm8sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgICJtZXRhdHlwZSBmb3IgdGhlIENEYXRhIE9iamVjdHMiLCAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylDRGF0YVR5cGVfdHJhdmVyc2UsICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBDRGF0YVR5cGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgVW5pb25UeXBlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKQEAgLTg0NSwxMjQgKzg0NSwxMjQgQEAKIHN0YXRpYyBpbnQKIFBvaW50ZXJUeXBlX1NldFByb3RvKFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsIFB5T2JqZWN0ICpwcm90bykKIHsKLQlpZiAoIXByb3RvIHx8ICFQeVR5cGVfQ2hlY2socHJvdG8pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl90eXBlXyBtdXN0IGJlIGEgdHlwZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghUHlUeXBlX3N0Z2RpY3QocHJvdG8pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl90eXBlXyBtdXN0IGhhdmUgc3RvcmFnZSBpbmZvIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfSU5DUkVGKHByb3RvKTsKLQlQeV9YREVDUkVGKHN0Z2RpY3QtPnByb3RvKTsKLQlzdGdkaWN0LT5wcm90byA9IHByb3RvOwotCXJldHVybiAwOworICAgIGlmICghcHJvdG8gfHwgIVB5VHlwZV9DaGVjayhwcm90bykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8gbXVzdCBiZSBhIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5VHlwZV9zdGdkaWN0KHByb3RvKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl90eXBlXyBtdXN0IGhhdmUgc3RvcmFnZSBpbmZvIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKHByb3RvKTsKKyAgICBQeV9YREVDUkVGKHN0Z2RpY3QtPnByb3RvKTsKKyAgICBzdGdkaWN0LT5wcm90byA9IHByb3RvOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlDQXJnT2JqZWN0ICoKIFBvaW50ZXJUeXBlX3BhcmFtZnVuYyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgUHlDQXJnT2JqZWN0ICpwYXJnOwogCi0JcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7Ci0JaWYgKHBhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgaWYgKHBhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlwYXJnLT50YWcgPSAnUCc7Ci0JcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7Ci0JcGFyZy0+dmFsdWUucCA9ICoodm9pZCAqKilzZWxmLT5iX3B0cjsKLQlyZXR1cm4gcGFyZzsKKyAgICBwYXJnLT50YWcgPSAnUCc7CisgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7CisgICAgcGFyZy0+dmFsdWUucCA9ICoodm9pZCAqKilzZWxmLT5iX3B0cjsKKyAgICByZXR1cm4gcGFyZzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBvaW50ZXJUeXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeVR5cGVPYmplY3QgKnJlc3VsdDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCVB5T2JqZWN0ICpwcm90bzsKLQlQeU9iamVjdCAqdHlwZWRpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICpyZXN1bHQ7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKKyAgICBQeU9iamVjdCAqcHJvdG87CisgICAgUHlPYmplY3QgKnR5cGVkaWN0OwogCi0JdHlwZWRpY3QgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMik7Ci0JaWYgKCF0eXBlZGljdCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdHlwZWRpY3QgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMik7CisgICAgaWYgKCF0eXBlZGljdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAvKgogICBzdGdkaWN0IGl0ZW1zIHNpemUsIGFsaWduLCBsZW5ndGggY29udGFpbiBpbmZvIGFib3V0IHBvaW50ZXJzIGl0c2VsZiwKICAgc3RnZGljdC0+cHJvdG8gaGFzIGluZm8gYWJvdXQgdGhlIHBvaW50ZWQgdG8gdHlwZSEKICovCi0Jc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKLQkJKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7Ci0JaWYgKCFzdGdkaWN0KQotCQlyZXR1cm4gTlVMTDsKLQlzdGdkaWN0LT5zaXplID0gc2l6ZW9mKHZvaWQgKik7Ci0Jc3RnZGljdC0+YWxpZ24gPSBnZXRlbnRyeSgiUCIpLT5wZmZpX3R5cGUtPmFsaWdubWVudDsKLQlzdGdkaWN0LT5sZW5ndGggPSAxOwotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOwotCXN0Z2RpY3QtPnBhcmFtZnVuYyA9IFBvaW50ZXJUeXBlX3BhcmFtZnVuYzsKLQlzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CisgICAgc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKKyAgICAgICAgKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7CisgICAgaWYgKCFzdGdkaWN0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdGdkaWN0LT5zaXplID0gc2l6ZW9mKHZvaWQgKik7CisgICAgc3RnZGljdC0+YWxpZ24gPSBnZXRlbnRyeSgiUCIpLT5wZmZpX3R5cGUtPmFsaWdubWVudDsKKyAgICBzdGdkaWN0LT5sZW5ndGggPSAxOworICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOworICAgIHN0Z2RpY3QtPnBhcmFtZnVuYyA9IFBvaW50ZXJUeXBlX3BhcmFtZnVuYzsKKyAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CiAKLQlwcm90byA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGVkaWN0LCAiX3R5cGVfIik7IC8qIEJvcnJvd2VkIHJlZiAqLwotCWlmIChwcm90byAmJiAtMSA9PSBQb2ludGVyVHlwZV9TZXRQcm90byhzdGdkaWN0LCBwcm90bykpIHsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcHJvdG8gPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlZGljdCwgIl90eXBlXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KKyAgICBpZiAocHJvdG8gJiYgLTEgPT0gUG9pbnRlclR5cGVfU2V0UHJvdG8oc3RnZGljdCwgcHJvdG8pKSB7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHByb3RvKSB7Ci0JCVN0Z0RpY3RPYmplY3QgKml0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCQlhc3NlcnQoaXRlbWRpY3QpOwotCQkvKiBJZiBpdGVtZGljdC0+Zm9ybWF0IGlzIE5VTEwsIHRoZW4gdGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4KLQkJICAgaW5jb21wbGV0ZSB0eXBlLiAgV2UgY3JlYXRlIGEgZ2VuZXJpYyBmb3JtYXQgc3RyaW5nCi0JCSAgICdwb2ludGVyIHRvIGJ5dGVzJyBpbiB0aGlzIGNhc2UuICBYWFggQmV0dGVyIHdvdWxkIGJlIHRvCi0JCSAgIGZpeCB0aGUgZm9ybWF0IHN0cmluZyBsYXRlci4uLgotCQkqLwotCQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKCImIiwKLQkJCSAgICAgIGl0ZW1kaWN0LT5mb3JtYXQgPyBpdGVtZGljdC0+Zm9ybWF0IDogIkIiKTsKLQkJaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAocHJvdG8pIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7CisgICAgICAgIGFzc2VydChpdGVtZGljdCk7CisgICAgICAgIC8qIElmIGl0ZW1kaWN0LT5mb3JtYXQgaXMgTlVMTCwgdGhlbiB0aGlzIGlzIGEgcG9pbnRlciB0byBhbgorICAgICAgICAgICBpbmNvbXBsZXRlIHR5cGUuICBXZSBjcmVhdGUgYSBnZW5lcmljIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgICAgJ3BvaW50ZXIgdG8gYnl0ZXMnIGluIHRoaXMgY2FzZS4gIFhYWCBCZXR0ZXIgd291bGQgYmUgdG8KKyAgICAgICAgICAgZml4IHRoZSBmb3JtYXQgc3RyaW5nIGxhdGVyLi4uCisgICAgICAgICovCisgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoIiYiLAorICAgICAgICAgICAgICAgICAgICAgIGl0ZW1kaWN0LT5mb3JtYXQgPyBpdGVtZGljdC0+Zm9ybWF0IDogIkIiKTsKKyAgICAgICAgaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAotCSAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KLQlyZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKKyAgICAgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCisgICAgcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHNwYW0gZGljdCAqLwotCWlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKXN0Z2RpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOwotCXJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKXN0Z2RpY3Q7CisgICAgLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KKyAgICBpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKKyAgICByZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyVHlwZV9zZXRfdHlwZShQeVR5cGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0eXBlKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoZGljdCk7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChkaWN0KTsKIAotCWlmICgtMSA9PSBQb2ludGVyVHlwZV9TZXRQcm90byhkaWN0LCB0eXBlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKC0xID09IFBvaW50ZXJUeXBlX1NldFByb3RvKGRpY3QsIHR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgtMSA9PSBQeURpY3RfU2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilkaWN0LCAiX3R5cGVfIiwgdHlwZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgtMSA9PSBQeURpY3RfU2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilkaWN0LCAiX3R5cGVfIiwgdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljZm9yd2FyZCBQeU9iamVjdCAqX2J5cmVmKFB5T2JqZWN0ICopOwpAQCAtOTcwLDk4ICs5NzAsOTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyVHlwZV9mcm9tX3BhcmFtKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JU3RnRGljdE9iamVjdCAqdHlwZWRpY3Q7CisgICAgU3RnRGljdE9iamVjdCAqdHlwZWRpY3Q7CiAKLQlpZiAodmFsdWUgPT0gUHlfTm9uZSkgewotCQkvKiBDb252UGFyYW0gd2lsbCBjb252ZXJ0IHRvIGEgTlVMTCBwb2ludGVyIGxhdGVyICovCi0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9CisgICAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKKyAgICAgICAgLyogQ29udlBhcmFtIHdpbGwgY29udmVydCB0byBhIE5VTEwgcG9pbnRlciBsYXRlciAqLworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQogCi0JdHlwZWRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKLQlhc3NlcnQodHlwZWRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciB0eXBlcyAqLworICAgIHR5cGVkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7CisgICAgYXNzZXJ0KHR5cGVkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgdHlwZXMgKi8KIAotCS8qIElmIHdlIGV4cGVjdCBQT0lOVEVSKDx0eXBlPiksIGJ1dCByZWNlaXZlIGEgPHR5cGU+IGluc3RhbmNlLCBhY2NlcHQKLQkgICBpdCBieSBjYWxsaW5nIGJ5cmVmKDx0eXBlPikuCi0JKi8KLQlzd2l0Y2ggKFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGVkaWN0LT5wcm90bykpIHsKLQljYXNlIDE6Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7IC8qIF9ieXJlZiBzdGVhbHMgYSByZWZjb3VudCAqLwotCQlyZXR1cm4gX2J5cmVmKHZhbHVlKTsKLQljYXNlIC0xOgotCQlQeUVycl9DbGVhcigpOwotCQlicmVhazsKLQlkZWZhdWx0OgotIAkJYnJlYWs7Ci0JfQorICAgIC8qIElmIHdlIGV4cGVjdCBQT0lOVEVSKDx0eXBlPiksIGJ1dCByZWNlaXZlIGEgPHR5cGU+IGluc3RhbmNlLCBhY2NlcHQKKyAgICAgICBpdCBieSBjYWxsaW5nIGJ5cmVmKDx0eXBlPikuCisgICAgKi8KKyAgICBzd2l0Y2ggKFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGVkaWN0LT5wcm90bykpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7IC8qIF9ieXJlZiBzdGVhbHMgYSByZWZjb3VudCAqLworICAgICAgICByZXR1cm4gX2J5cmVmKHZhbHVlKTsKKyAgICBjYXNlIC0xOgorICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CiAKLSAJaWYgKFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpIHx8IEFycmF5T2JqZWN0X0NoZWNrKHZhbHVlKSkgewotIAkJLyogQXJyYXkgaW5zdGFuY2VzIGFyZSBhbHNvIHBvaW50ZXJzIHdoZW4KLSAJCSAgIHRoZSBpdGVtIHR5cGVzIGFyZSB0aGUgc2FtZS4KLSAJCSovCi0gCQlTdGdEaWN0T2JqZWN0ICp2ID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7Ci0JCWFzc2VydCh2KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgb3IgYXJyYXkgb2JqZWN0cyAqLwotIAkJaWYgKFB5T2JqZWN0X0lzU3ViY2xhc3Modi0+cHJvdG8sIHR5cGVkaWN0LT5wcm90bykpIHsKLSAgCQkJUHlfSU5DUkVGKHZhbHVlKTsKLSAgCQkJcmV0dXJuIHZhbHVlOwotICAJCX0KLSAgCX0KLSAgICAgCXJldHVybiBDRGF0YVR5cGVfZnJvbV9wYXJhbSh0eXBlLCB2YWx1ZSk7CisgICAgaWYgKFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpIHx8IEFycmF5T2JqZWN0X0NoZWNrKHZhbHVlKSkgeworICAgICAgICAvKiBBcnJheSBpbnN0YW5jZXMgYXJlIGFsc28gcG9pbnRlcnMgd2hlbgorICAgICAgICAgICB0aGUgaXRlbSB0eXBlcyBhcmUgdGhlIHNhbWUuCisgICAgICAgICovCisgICAgICAgIFN0Z0RpY3RPYmplY3QgKnYgPSBQeU9iamVjdF9zdGdkaWN0KHZhbHVlKTsKKyAgICAgICAgYXNzZXJ0KHYpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvciBhcnJheSBvYmplY3RzICovCisgICAgICAgIGlmIChQeU9iamVjdF9Jc1N1YmNsYXNzKHYtPnByb3RvLCB0eXBlZGljdC0+cHJvdG8pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDRGF0YVR5cGVfZnJvbV9wYXJhbSh0eXBlLCB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBQb2ludGVyVHlwZV9tZXRob2RzW10gPSB7Ci0JeyAiZnJvbV9hZGRyZXNzIiwgQ0RhdGFUeXBlX2Zyb21fYWRkcmVzcywgTUVUSF9PLCBmcm9tX2FkZHJlc3NfZG9jIH0sCi0JeyAiZnJvbV9idWZmZXIiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXIsIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfZG9jLCB9LAotCXsgImZyb21fYnVmZmVyX2NvcHkiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXJfY29weSwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9jb3B5X2RvYywgfSwKLQl7ICJpbl9kbGwiLCBDRGF0YVR5cGVfaW5fZGxsLCBNRVRIX1ZBUkFSR1MsIGluX2RsbF9kb2N9LAotCXsgImZyb21fcGFyYW0iLCAoUHlDRnVuY3Rpb24pUG9pbnRlclR5cGVfZnJvbV9wYXJhbSwgTUVUSF9PLCBmcm9tX3BhcmFtX2RvY30sCi0JeyAic2V0X3R5cGUiLCAoUHlDRnVuY3Rpb24pUG9pbnRlclR5cGVfc2V0X3R5cGUsIE1FVEhfTyB9LAotCXsgTlVMTCwgTlVMTCB9LAorICAgIHsgImZyb21fYWRkcmVzcyIsIENEYXRhVHlwZV9mcm9tX2FkZHJlc3MsIE1FVEhfTywgZnJvbV9hZGRyZXNzX2RvYyB9LAorICAgIHsgImZyb21fYnVmZmVyIiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyLCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2RvYywgfSwKKyAgICB7ICJmcm9tX2J1ZmZlcl9jb3B5IiwgQ0RhdGFUeXBlX2Zyb21fYnVmZmVyX2NvcHksIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfY29weV9kb2MsIH0sCisgICAgeyAiaW5fZGxsIiwgQ0RhdGFUeXBlX2luX2RsbCwgTUVUSF9WQVJBUkdTLCBpbl9kbGxfZG9jfSwKKyAgICB7ICJmcm9tX3BhcmFtIiwgKFB5Q0Z1bmN0aW9uKVBvaW50ZXJUeXBlX2Zyb21fcGFyYW0sIE1FVEhfTywgZnJvbV9wYXJhbV9kb2N9LAorICAgIHsgInNldF90eXBlIiwgKFB5Q0Z1bmN0aW9uKVBvaW50ZXJUeXBlX3NldF90eXBlLCBNRVRIX08gfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIFB5VHlwZU9iamVjdCBQb2ludGVyVHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlBvaW50ZXJUeXBlIiwJCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JIm1ldGF0eXBlIGZvciB0aGUgUG9pbnRlciBPYmplY3RzIiwJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylDRGF0YVR5cGVfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpQ0RhdGFUeXBlX2NsZWFyLAkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCVBvaW50ZXJUeXBlX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlQb2ludGVyVHlwZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5Qb2ludGVyVHlwZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZDRGF0YVR5cGVfYXNfc2VxdWVuY2UsICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAibWV0YXR5cGUgZm9yIHRoZSBQb2ludGVyIE9iamVjdHMiLCAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YVR5cGVfY2xlYXIsICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgUG9pbnRlclR5cGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFBvaW50ZXJUeXBlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICBBcnJheVR5cGVfVHlwZQpAQCAtMTA3NCwxNDkgKzEwNzQsMTQ5IEBACiBzdGF0aWMgaW50CiBDaGFyQXJyYXlfc2V0X3JhdyhDRGF0YU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotCWNoYXIgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKFB5QnVmZmVyX0NoZWNrKHZhbHVlKSkgewotCQlzaXplID0gUHlfVFlQRSh2YWx1ZSktPnRwX2FzX2J1ZmZlci0+YmZfZ2V0cmVhZGJ1ZmZlcih2YWx1ZSwgMCwgKHZvaWQgKikmcHRyKTsKLQkJaWYgKHNpemUgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0gZWxzZSBpZiAoLTEgPT0gUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHZhbHVlLCAmcHRyLCAmc2l6ZSkpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoc2l6ZSA+IHNlbGYtPmJfc2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic3RyaW5nIHRvbyBsb25nIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgY2hhciAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpZiAoUHlCdWZmZXJfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHNpemUgPSBQeV9UWVBFKHZhbHVlKS0+dHBfYXNfYnVmZmVyLT5iZl9nZXRyZWFkYnVmZmVyKHZhbHVlLCAwLCAodm9pZCAqKSZwdHIpOworICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICgtMSA9PSBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUodmFsdWUsICZwdHIsICZzaXplKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzaXplID4gc2VsZi0+Yl9zaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbWVtY3B5KHNlbGYtPmJfcHRyLCBwdHIsIHNpemUpOworICAgIG1lbWNweShzZWxmLT5iX3B0ciwgcHRyLCBzaXplKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ2hhckFycmF5X2dldF9yYXcoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmJfcHRyLCBzZWxmLT5iX3NpemUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENoYXJBcnJheV9nZXRfdmFsdWUoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JaW50IGk7Ci0JY2hhciAqcHRyID0gc2VsZi0+Yl9wdHI7Ci0JZm9yIChpID0gMDsgaSA8IHNlbGYtPmJfc2l6ZTsgKytpKQotCQlpZiAoKnB0cisrID09ICdcMCcpCi0JCQlicmVhazsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+Yl9wdHIsIGkpOworICAgIGludCBpOworICAgIGNoYXIgKnB0ciA9IHNlbGYtPmJfcHRyOworICAgIGZvciAoaSA9IDA7IGkgPCBzZWxmLT5iX3NpemU7ICsraSkKKyAgICAgICAgaWYgKCpwdHIrKyA9PSAnXDAnKQorICAgICAgICAgICAgYnJlYWs7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmJfcHRyLCBpKTsKIH0KIAogc3RhdGljIGludAogQ2hhckFycmF5X3NldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotCWNoYXIgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgY2hhciAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCXZhbHVlID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh2YWx1ZSwKLQkJCQkJCSAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAotCQkJCQkJICBjb252ZXJzaW9uX21vZGVfZXJyb3JzKTsKLQkJaWYgKCF2YWx1ZSkKLQkJCXJldHVybiAtMTsKLQl9IGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgInN0cmluZyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCSAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlCi0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0Jc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKTsKLQlpZiAoc2l6ZSA+IHNlbGYtPmJfc2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic3RyaW5nIHRvbyBsb25nIik7Ci0JCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKTsKKyAgICBpZiAoc2l6ZSA+IHNlbGYtPmJfc2l6ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdG9vIGxvbmciKTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSk7Ci0JbWVtY3B5KHNlbGYtPmJfcHRyLCBwdHIsIHNpemUpOwotCWlmIChzaXplIDwgc2VsZi0+Yl9zaXplKQotCQlzZWxmLT5iX3B0cltzaXplXSA9ICdcMCc7Ci0JUHlfREVDUkVGKHZhbHVlKTsKKyAgICBwdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpOworICAgIG1lbWNweShzZWxmLT5iX3B0ciwgcHRyLCBzaXplKTsKKyAgICBpZiAoc2l6ZSA8IHNlbGYtPmJfc2l6ZSkKKyAgICAgICAgc2VsZi0+Yl9wdHJbc2l6ZV0gPSAnXDAnOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIENoYXJBcnJheV9nZXRzZXRzW10gPSB7Ci0JeyAicmF3IiwgKGdldHRlcilDaGFyQXJyYXlfZ2V0X3JhdywgKHNldHRlcilDaGFyQXJyYXlfc2V0X3JhdywKLQkgICJ2YWx1ZSIsIE5VTEwgfSwKLQl7ICJ2YWx1ZSIsIChnZXR0ZXIpQ2hhckFycmF5X2dldF92YWx1ZSwgKHNldHRlcilDaGFyQXJyYXlfc2V0X3ZhbHVlLAotCSAgInN0cmluZyB2YWx1ZSJ9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAicmF3IiwgKGdldHRlcilDaGFyQXJyYXlfZ2V0X3JhdywgKHNldHRlcilDaGFyQXJyYXlfc2V0X3JhdywKKyAgICAgICJ2YWx1ZSIsIE5VTEwgfSwKKyAgICB7ICJ2YWx1ZSIsIChnZXR0ZXIpQ2hhckFycmF5X2dldF92YWx1ZSwgKHNldHRlcilDaGFyQXJyYXlfc2V0X3ZhbHVlLAorICAgICAgInN0cmluZyB2YWx1ZSJ9LAorICAgIHsgTlVMTCwgTlVMTCB9CiB9OwogCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKIHN0YXRpYyBQeU9iamVjdCAqCiBXQ2hhckFycmF5X2dldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZikKIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQl3Y2hhcl90ICpwdHIgPSAod2NoYXJfdCAqKXNlbGYtPmJfcHRyOwotCWZvciAoaSA9IDA7IGkgPCBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpOyArK2kpCi0JCWlmICgqcHRyKysgPT0gKHdjaGFyX3QpMCkKLQkJCWJyZWFrOwotCXJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKCh3Y2hhcl90ICopc2VsZi0+Yl9wdHIsIGkpOworICAgIHVuc2lnbmVkIGludCBpOworICAgIHdjaGFyX3QgKnB0ciA9ICh3Y2hhcl90ICopc2VsZi0+Yl9wdHI7CisgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPmJfc2l6ZS9zaXplb2Yod2NoYXJfdCk7ICsraSkKKyAgICAgICAgaWYgKCpwdHIrKyA9PSAod2NoYXJfdCkwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKHdjaGFyX3QgKilzZWxmLT5iX3B0ciwgaSk7CiB9CiAKIHN0YXRpYyBpbnQKIFdDaGFyQXJyYXlfc2V0X3ZhbHVlKENEYXRhT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlfc3NpemVfdCByZXN1bHQgPSAwOworICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gMDsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCXZhbHVlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHZhbHVlLAotCQkJCQkJICAgIGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywKLQkJCQkJCSAgICBjb252ZXJzaW9uX21vZGVfZXJyb3JzKTsKLQkJaWYgKCF2YWx1ZSkKLQkJCXJldHVybiAtMTsKLQl9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJCVB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0gZWxzZQotCQlQeV9JTkNSRUYodmFsdWUpOwotCWlmICgodW5zaWduZWQpUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKSA+IHNlbGYtPmJfc2l6ZS9zaXplb2Yod2NoYXJfdCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInN0cmluZyB0b28gbG9uZyIpOwotCQlyZXN1bHQgPSAtMTsKLQkJZ290byBkb25lOwotCX0KLQlyZXN1bHQgPSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigoUHlVbmljb2RlT2JqZWN0ICopdmFsdWUsCi0JCQkJICAgICAgKHdjaGFyX3QgKilzZWxmLT5iX3B0ciwKLQkJCQkgICAgICBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKTsKLQlpZiAocmVzdWx0ID49IDAgJiYgKHNpemVfdClyZXN1bHQgPCBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKQotCQkoKHdjaGFyX3QgKilzZWxmLT5iX3B0cilbcmVzdWx0XSA9ICh3Y2hhcl90KTA7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICB2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uX21vZGVfZXJyb3JzKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5pY29kZSBzdHJpbmcgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBpZiAoKHVuc2lnbmVkKVB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSkgPiBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyB0b28gbG9uZyIpOworICAgICAgICByZXN1bHQgPSAtMTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICByZXN1bHQgPSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigoUHlVbmljb2RlT2JqZWN0ICopdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdjaGFyX3QgKilzZWxmLT5iX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICBpZiAocmVzdWx0ID49IDAgJiYgKHNpemVfdClyZXN1bHQgPCBzZWxmLT5iX3NpemUvc2l6ZW9mKHdjaGFyX3QpKQorICAgICAgICAoKHdjaGFyX3QgKilzZWxmLT5iX3B0cilbcmVzdWx0XSA9ICh3Y2hhcl90KTA7CiAgIGRvbmU6Ci0JUHlfREVDUkVGKHZhbHVlKTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOwogCi0JcmV0dXJuIHJlc3VsdCA+PSAwID8gMCA6IC0xOworICAgIHJldHVybiByZXN1bHQgPj0gMCA/IDAgOiAtMTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIFdDaGFyQXJyYXlfZ2V0c2V0c1tdID0gewotCXsgInZhbHVlIiwgKGdldHRlcilXQ2hhckFycmF5X2dldF92YWx1ZSwgKHNldHRlcilXQ2hhckFycmF5X3NldF92YWx1ZSwKLQkgICJzdHJpbmcgdmFsdWUifSwKLQl7IE5VTEwsIE5VTEwgfQorICAgIHsgInZhbHVlIiwgKGdldHRlcilXQ2hhckFycmF5X2dldF92YWx1ZSwgKHNldHRlcilXQ2hhckFycmF5X3NldF92YWx1ZSwKKyAgICAgICJzdHJpbmcgdmFsdWUifSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKICNlbmRpZgogCkBAIC0xMjMxLDIzMSArMTIzMSwyMzEgQEAKIHN0YXRpYyBpbnQKIGFkZF9tZXRob2RzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlNZXRob2REZWYgKm1ldGgpCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OwotCWZvciAoOyBtZXRoLT5tbF9uYW1lICE9IE5VTEw7IG1ldGgrKykgewotCQlQeU9iamVjdCAqZGVzY3I7Ci0JCWRlc2NyID0gUHlEZXNjcl9OZXdNZXRob2QodHlwZSwgbWV0aCk7Ci0JCWlmIChkZXNjciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCxtZXRoLT5tbF9uYW1lLCBkZXNjcikgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYoZGVzY3IpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CisgICAgZm9yICg7IG1ldGgtPm1sX25hbWUgIT0gTlVMTDsgbWV0aCsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpkZXNjcjsKKyAgICAgICAgZGVzY3IgPSBQeURlc2NyX05ld01ldGhvZCh0eXBlLCBtZXRoKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LG1ldGgtPm1sX25hbWUsIGRlc2NyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBhZGRfbWVtYmVycyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5TWVtYmVyRGVmICptZW1iKQogewotCVB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKLQlmb3IgKDsgbWVtYi0+bmFtZSAhPSBOVUxMOyBtZW1iKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlkZXNjciA9IFB5RGVzY3JfTmV3TWVtYmVyKHR5cGUsIG1lbWIpOwotCQlpZiAoZGVzY3IgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG1lbWItPm5hbWUsIGRlc2NyKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihkZXNjcik7Ci0JfQotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyAgICBmb3IgKDsgbWVtYi0+bmFtZSAhPSBOVUxMOyBtZW1iKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmRlc2NyOworICAgICAgICBkZXNjciA9IFB5RGVzY3JfTmV3TWVtYmVyKHR5cGUsIG1lbWIpOworICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG1lbWItPm5hbWUsIGRlc2NyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogKi8KIAogc3RhdGljIGludAogYWRkX2dldHNldChQeVR5cGVPYmplY3QgKnR5cGUsIFB5R2V0U2V0RGVmICpnc3ApCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OwotCWZvciAoOyBnc3AtPm5hbWUgIT0gTlVMTDsgZ3NwKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlkZXNjciA9IFB5RGVzY3JfTmV3R2V0U2V0KHR5cGUsIGdzcCk7Ci0JCWlmIChkZXNjciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgZ3NwLT5uYW1lLCBkZXNjcikgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYoZGVzY3IpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CisgICAgZm9yICg7IGdzcC0+bmFtZSAhPSBOVUxMOyBnc3ArKykgeworICAgICAgICBQeU9iamVjdCAqZGVzY3I7CisgICAgICAgIGRlc2NyID0gUHlEZXNjcl9OZXdHZXRTZXQodHlwZSwgZ3NwKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBnc3AtPm5hbWUsIGRlc2NyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlDQXJnT2JqZWN0ICoKIEFycmF5VHlwZV9wYXJhbWZ1bmMoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JUHlDQXJnT2JqZWN0ICpwID0gbmV3X0NBcmdPYmplY3QoKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwLT50YWcgPSAnUCc7Ci0JcC0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JcC0+dmFsdWUucCA9IChjaGFyICopc2VsZi0+Yl9wdHI7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXAtPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7Ci0JcmV0dXJuIHA7CisgICAgUHlDQXJnT2JqZWN0ICpwID0gbmV3X0NBcmdPYmplY3QoKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT50YWcgPSAnUCc7CisgICAgcC0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgcC0+dmFsdWUucCA9IChjaGFyICopc2VsZi0+Yl9wdHI7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHAtPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7CisgICAgcmV0dXJuIHA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBBcnJheVR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5VHlwZU9iamVjdCAqcmVzdWx0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7Ci0JU3RnRGljdE9iamVjdCAqaXRlbWRpY3Q7Ci0JUHlPYmplY3QgKnByb3RvOwotCVB5T2JqZWN0ICp0eXBlZGljdDsKLQlsb25nIGxlbmd0aDsKKyAgICBQeVR5cGVPYmplY3QgKnJlc3VsdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIFN0Z0RpY3RPYmplY3QgKml0ZW1kaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKKyAgICBQeU9iamVjdCAqdHlwZWRpY3Q7CisgICAgbG9uZyBsZW5ndGg7CiAKLQlQeV9zc2l6ZV90IGl0ZW1zaXplLCBpdGVtYWxpZ247Ci0JY2hhciBidWZbMzJdOworICAgIFB5X3NzaXplX3QgaXRlbXNpemUsIGl0ZW1hbGlnbjsKKyAgICBjaGFyIGJ1ZlszMl07CiAKLQl0eXBlZGljdCA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAyKTsKLQlpZiAoIXR5cGVkaWN0KQotCQlyZXR1cm4gTlVMTDsKKyAgICB0eXBlZGljdCA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAyKTsKKyAgICBpZiAoIXR5cGVkaWN0KQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXByb3RvID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZWRpY3QsICJfbGVuZ3RoXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KLQlpZiAoIXByb3RvIHx8ICFQeUludF9DaGVjayhwcm90bykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSJjbGFzcyBtdXN0IGRlZmluZSBhICdfbGVuZ3RoXycgYXR0cmlidXRlLCAiCi0JCQkJIndoaWNoIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlsZW5ndGggPSBQeUludF9BU19MT05HKHByb3RvKTsKKyAgICBwcm90byA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGVkaWN0LCAiX2xlbmd0aF8iKTsgLyogQm9ycm93ZWQgcmVmICovCisgICAgaWYgKCFwcm90byB8fCAhUHlJbnRfQ2hlY2socHJvdG8pKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzcyBtdXN0IGRlZmluZSBhICdfbGVuZ3RoXycgYXR0cmlidXRlLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGxlbmd0aCA9IFB5SW50X0FTX0xPTkcocHJvdG8pOwogCi0JcHJvdG8gPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlZGljdCwgIl90eXBlXyIpOyAvKiBCb3Jyb3dlZCByZWYgKi8KLQlpZiAoIXByb3RvKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX3R5cGVfJyBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHByb3RvID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZWRpY3QsICJfdHlwZV8iKTsgLyogQm9ycm93ZWQgcmVmICovCisgICAgaWYgKCFwcm90bykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX3R5cGVfJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKLQkJKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7Ci0JaWYgKCFzdGdkaWN0KQotCQlyZXR1cm4gTlVMTDsKKyAgICBzdGdkaWN0ID0gKFN0Z0RpY3RPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KAorICAgICAgICAoUHlPYmplY3QgKikmU3RnRGljdF9UeXBlLCBOVUxMKTsKKyAgICBpZiAoIXN0Z2RpY3QpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JaWYgKCFpdGVtZGljdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfdHlwZV8gbXVzdCBoYXZlIHN0b3JhZ2UgaW5mbyIpOwotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICBpZiAoIWl0ZW1kaWN0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX3R5cGVfIG11c3QgaGF2ZSBzdG9yYWdlIGluZm8iKTsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlhc3NlcnQoaXRlbWRpY3QtPmZvcm1hdCk7Ci0JaWYgKGl0ZW1kaWN0LT5mb3JtYXRbMF0gPT0gJygnKSB7Ci0JCXNwcmludGYoYnVmLCAiKCVsZCwiLCBsZW5ndGgpOwotCQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKGJ1ZiwgaXRlbWRpY3QtPmZvcm1hdCsxKTsKLQl9IGVsc2UgewotCQlzcHJpbnRmKGJ1ZiwgIiglbGQpIiwgbGVuZ3RoKTsKLQkJc3RnZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhidWYsIGl0ZW1kaWN0LT5mb3JtYXQpOwotCX0KLQlpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RnZGljdC0+bmRpbSA9IGl0ZW1kaWN0LT5uZGltICsgMTsKLQlzdGdkaWN0LT5zaGFwZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCAqKSAqIHN0Z2RpY3QtPm5kaW0pOwotCWlmIChzdGdkaWN0LT5zaGFwZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN0Z2RpY3QtPnNoYXBlWzBdID0gbGVuZ3RoOwotCW1lbW1vdmUoJnN0Z2RpY3QtPnNoYXBlWzFdLCBpdGVtZGljdC0+c2hhcGUsCi0JCXNpemVvZihQeV9zc2l6ZV90KSAqIChzdGdkaWN0LT5uZGltIC0gMSkpOworICAgIGFzc2VydChpdGVtZGljdC0+Zm9ybWF0KTsKKyAgICBpZiAoaXRlbWRpY3QtPmZvcm1hdFswXSA9PSAnKCcpIHsKKyAgICAgICAgc3ByaW50ZihidWYsICIoJWxkLCIsIGxlbmd0aCk7CisgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoYnVmLCBpdGVtZGljdC0+Zm9ybWF0KzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwcmludGYoYnVmLCAiKCVsZCkiLCBsZW5ndGgpOworICAgICAgICBzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKGJ1ZiwgaXRlbWRpY3QtPmZvcm1hdCk7CisgICAgfQorICAgIGlmIChzdGdkaWN0LT5mb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdGdkaWN0LT5uZGltID0gaXRlbWRpY3QtPm5kaW0gKyAxOworICAgIHN0Z2RpY3QtPnNoYXBlID0gUHlNZW1fTWFsbG9jKHNpemVvZihQeV9zc2l6ZV90ICopICogc3RnZGljdC0+bmRpbSk7CisgICAgaWYgKHN0Z2RpY3QtPnNoYXBlID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RnZGljdC0+c2hhcGVbMF0gPSBsZW5ndGg7CisgICAgbWVtbW92ZSgmc3RnZGljdC0+c2hhcGVbMV0sIGl0ZW1kaWN0LT5zaGFwZSwKKyAgICAgICAgc2l6ZW9mKFB5X3NzaXplX3QpICogKHN0Z2RpY3QtPm5kaW0gLSAxKSk7CiAKLQlpdGVtc2l6ZSA9IGl0ZW1kaWN0LT5zaXplOwotCWlmIChsZW5ndGggKiBpdGVtc2l6ZSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImFycmF5IHRvbyBsYXJnZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaXRlbXNpemUgPSBpdGVtZGljdC0+c2l6ZTsKKyAgICBpZiAobGVuZ3RoICogaXRlbXNpemUgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFycmF5IHRvbyBsYXJnZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpdGVtYWxpZ24gPSBpdGVtZGljdC0+YWxpZ247CisgICAgaXRlbWFsaWduID0gaXRlbWRpY3QtPmFsaWduOwogCi0JaWYgKGl0ZW1kaWN0LT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVIgfCBUWVBFRkxBR19IQVNQT0lOVEVSKSkKLQkJc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSEFTUE9JTlRFUjsKKyAgICBpZiAoaXRlbWRpY3QtPmZsYWdzICYgKFRZUEVGTEFHX0lTUE9JTlRFUiB8IFRZUEVGTEFHX0hBU1BPSU5URVIpKQorICAgICAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19IQVNQT0lOVEVSOwogCi0Jc3RnZGljdC0+c2l6ZSA9IGl0ZW1zaXplICogbGVuZ3RoOwotCXN0Z2RpY3QtPmFsaWduID0gaXRlbWFsaWduOwotCXN0Z2RpY3QtPmxlbmd0aCA9IGxlbmd0aDsKLQlQeV9JTkNSRUYocHJvdG8pOwotCXN0Z2RpY3QtPnByb3RvID0gcHJvdG87CisgICAgc3RnZGljdC0+c2l6ZSA9IGl0ZW1zaXplICogbGVuZ3RoOworICAgIHN0Z2RpY3QtPmFsaWduID0gaXRlbWFsaWduOworICAgIHN0Z2RpY3QtPmxlbmd0aCA9IGxlbmd0aDsKKyAgICBQeV9JTkNSRUYocHJvdG8pOworICAgIHN0Z2RpY3QtPnByb3RvID0gcHJvdG87CiAKLQlzdGdkaWN0LT5wYXJhbWZ1bmMgPSAmQXJyYXlUeXBlX3BhcmFtZnVuYzsKKyAgICBzdGdkaWN0LT5wYXJhbWZ1bmMgPSAmQXJyYXlUeXBlX3BhcmFtZnVuYzsKIAotCS8qIEFycmF5cyBhcmUgcGFzc2VkIGFzIHBvaW50ZXJzIHRvIGZ1bmN0aW9uIGNhbGxzLiAqLwotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOworICAgIC8qIEFycmF5cyBhcmUgcGFzc2VkIGFzIHBvaW50ZXJzIHRvIGZ1bmN0aW9uIGNhbGxzLiAqLworICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOwogCi0JLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCi0JICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLwotCXJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKKyAgICAgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCisgICAgcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KLQlpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKLQlyZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OworICAgIC8qIHJlcGxhY2UgdGhlIGNsYXNzIGRpY3QgYnkgb3VyIHVwZGF0ZWQgc3BhbSBkaWN0ICovCisgICAgaWYgKC0xID09IFB5RGljdF9VcGRhdGUoKFB5T2JqZWN0ICopc3RnZGljdCwgcmVzdWx0LT50cF9kaWN0KSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlc3VsdC0+dHBfZGljdCk7CisgICAgcmVzdWx0LT50cF9kaWN0ID0gKFB5T2JqZWN0ICopc3RnZGljdDsKIAotCS8qIFNwZWNpYWwgY2FzZSBmb3IgY2hhcmFjdGVyIGFycmF5cy4KLQkgICBBIHBlcm1hbmVudCBhbm5veWFuY2U6IGNoYXIgYXJyYXlzIGFyZSBhbHNvIHN0cmluZ3MhCi0JKi8KLQlpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgewotCQlpZiAoLTEgPT0gYWRkX2dldHNldChyZXN1bHQsIENoYXJBcnJheV9nZXRzZXRzKSkKLQkJCXJldHVybiBOVUxMOworICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgY2hhcmFjdGVyIGFycmF5cy4KKyAgICAgICBBIHBlcm1hbmVudCBhbm5veWFuY2U6IGNoYXIgYXJyYXlzIGFyZSBhbHNvIHN0cmluZ3MhCisgICAgKi8KKyAgICBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICBpZiAoLTEgPT0gYWRkX2dldHNldChyZXN1bHQsIENoYXJBcnJheV9nZXRzZXRzKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JfSBlbHNlIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBnZXRlbnRyeSgidSIpLT5nZXRmdW5jKSB7Ci0JCWlmICgtMSA9PSBhZGRfZ2V0c2V0KHJlc3VsdCwgV0NoYXJBcnJheV9nZXRzZXRzKSkKLQkJCXJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoInUiKS0+Z2V0ZnVuYykgeworICAgICAgICBpZiAoLTEgPT0gYWRkX2dldHNldChyZXN1bHQsIFdDaGFyQXJyYXlfZ2V0c2V0cykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CiB9CiAKIFB5VHlwZU9iamVjdCBBcnJheVR5cGVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5BcnJheVR5cGUiLAkJCS8qIHRwX25hbWUgKi8KLQkwLAkJCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCSAgICAgICAJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkibWV0YXR5cGUgZm9yIHRoZSBBcnJheSBPYmplY3RzIiwJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlDRGF0YVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCUFycmF5VHlwZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuQXJyYXlUeXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIm1ldGF0eXBlIGZvciB0aGUgQXJyYXkgT2JqZWN0cyIsICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIENEYXRhVHlwZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBBcnJheVR5cGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgU2ltcGxlVHlwZV9UeXBlCkBAIC0xNDcyLDI2NCArMTQ3MiwyNjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjX3djaGFyX3BfZnJvbV9wYXJhbShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICphc19wYXJhbWV0ZXI7CisgICAgUHlPYmplY3QgKmFzX3BhcmFtZXRlcjsKICNpZiAoUFlUSE9OX0FQSV9WRVJTSU9OIDwgMTAxMikKICMgZXJyb3Igbm90IHN1cHBvcnRlZAogI2VuZGlmCi0JaWYgKHZhbHVlID09IFB5X05vbmUpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkgfHwgUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5Q0FyZ09iamVjdCAqcGFyZzsKLQkJc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgiWiIpOworICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpIHx8IFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZkID0gZ2V0ZW50cnkoIloiKTsKIAotCQlwYXJnID0gbmV3X0NBcmdPYmplY3QoKTsKLQkJaWYgKHBhcmcgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlwYXJnLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQkJcGFyZy0+dGFnID0gJ1onOwotCQlwYXJnLT5vYmogPSBmZC0+c2V0ZnVuYygmcGFyZy0+dmFsdWUsIHZhbHVlLCAwKTsKLQkJaWYgKHBhcmctPm9iaiA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocGFyZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKLQl9Ci0JaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGUpKSB7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JaWYgKEFycmF5T2JqZWN0X0NoZWNrKHZhbHVlKSB8fCBQb2ludGVyT2JqZWN0X0NoZWNrKHZhbHVlKSkgewotCQkvKiBjX3djaGFyIGFycmF5IGluc3RhbmNlIG9yIHBvaW50ZXIoY193Y2hhciguLi4pKSAqLwotCQlTdGdEaWN0T2JqZWN0ICpkdCA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCQlhc3NlcnQoZHQpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvciBhcnJheSBvYmplY3RzICovCi0JCWRpY3QgPSBkdCAmJiBkdC0+cHJvdG8gPyBQeVR5cGVfc3RnZGljdChkdC0+cHJvdG8pIDogTlVMTDsKLQkJaWYgKGRpY3QgJiYgKGRpY3QtPnNldGZ1bmMgPT0gZ2V0ZW50cnkoInUiKS0+c2V0ZnVuYykpIHsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0JaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgewotCQkvKiBieXJlZihjX2NoYXIoLi4uKSkgKi8KLQkJUHlDQXJnT2JqZWN0ICphID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChhLT5vYmopOwotCQlpZiAoZGljdCAmJiAoZGljdC0+c2V0ZnVuYyA9PSBnZXRlbnRyeSgidSIpLT5zZXRmdW5jKSkgewotCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdaJzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGlmIChBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkgfHwgUG9pbnRlck9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgLyogY193Y2hhciBhcnJheSBpbnN0YW5jZSBvciBwb2ludGVyKGNfd2NoYXIoLi4uKSkgKi8KKyAgICAgICAgU3RnRGljdE9iamVjdCAqZHQgPSBQeU9iamVjdF9zdGdkaWN0KHZhbHVlKTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICAgICAgYXNzZXJ0KGR0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgb3IgYXJyYXkgb2JqZWN0cyAqLworICAgICAgICBkaWN0ID0gZHQgJiYgZHQtPnByb3RvID8gUHlUeXBlX3N0Z2RpY3QoZHQtPnByb3RvKSA6IE5VTEw7CisgICAgICAgIGlmIChkaWN0ICYmIChkaWN0LT5zZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPnNldGZ1bmMpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgLyogYnlyZWYoY19jaGFyKC4uLikpICovCisgICAgICAgIFB5Q0FyZ09iamVjdCAqYSA9IChQeUNBcmdPYmplY3QgKil2YWx1ZTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoYS0+b2JqKTsKKyAgICAgICAgaWYgKGRpY3QgJiYgKGRpY3QtPnNldGZ1bmMgPT0gZ2V0ZW50cnkoInUiKS0+c2V0ZnVuYykpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CiAKLQlhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKLQlpZiAoYXNfcGFyYW1ldGVyKSB7Ci0JCXZhbHVlID0gY193Y2hhcl9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKLQkJUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JLyogWFhYIGJldHRlciBtZXNzYWdlICovCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ3cm9uZyB0eXBlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7CisgICAgaWYgKGFzX3BhcmFtZXRlcikgeworICAgICAgICB2YWx1ZSA9IGNfd2NoYXJfcF9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7CisgICAgICAgIFB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIC8qIFhYWCBiZXR0ZXIgbWVzc2FnZSAqLworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB0eXBlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjX2NoYXJfcF9mcm9tX3BhcmFtKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKmFzX3BhcmFtZXRlcjsKKyAgICBQeU9iamVjdCAqYXNfcGFyYW1ldGVyOwogI2lmIChQWVRIT05fQVBJX1ZFUlNJT04gPCAxMDEyKQogIyBlcnJvciBub3Qgc3VwcG9ydGVkCiAjZW5kaWYKLQlpZiAodmFsdWUgPT0gUHlfTm9uZSkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpIHx8IFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKLQkJUHlDQXJnT2JqZWN0ICpwYXJnOwotCQlzdHJ1Y3QgZmllbGRkZXNjICpmZCA9IGdldGVudHJ5KCJ6Iik7CisgICAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSB8fCBQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgieiIpOwogCi0JCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYXJnLT50YWcgPSAneic7Ci0JCXBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOwotCQlpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KLQlpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQlpZiAoQXJyYXlPYmplY3RfQ2hlY2sodmFsdWUpIHx8IFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCS8qIGNfY2hhciBhcnJheSBpbnN0YW5jZSBvciBwb2ludGVyKGNfY2hhciguLi4pKSAqLwotCQlTdGdEaWN0T2JqZWN0ICpkdCA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCQlhc3NlcnQoZHQpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvciBhcnJheSBvYmplY3RzICovCi0JCWRpY3QgPSBkdCAmJiBkdC0+cHJvdG8gPyBQeVR5cGVfc3RnZGljdChkdC0+cHJvdG8pIDogTlVMTDsKLQkJaWYgKGRpY3QgJiYgKGRpY3QtPnNldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+c2V0ZnVuYykpIHsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0JaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgewotCQkvKiBieXJlZihjX2NoYXIoLi4uKSkgKi8KLQkJUHlDQXJnT2JqZWN0ICphID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOwotCQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChhLT5vYmopOwotCQlpZiAoZGljdCAmJiAoZGljdC0+c2V0ZnVuYyA9PSBnZXRlbnRyeSgiYyIpLT5zZXRmdW5jKSkgewotCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCX0KKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICd6JzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGlmIChBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkgfHwgUG9pbnRlck9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgLyogY19jaGFyIGFycmF5IGluc3RhbmNlIG9yIHBvaW50ZXIoY19jaGFyKC4uLikpICovCisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmR0ID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgICAgIGFzc2VydChkdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIG9yIGFycmF5IG9iamVjdHMgKi8KKyAgICAgICAgZGljdCA9IGR0ICYmIGR0LT5wcm90byA/IFB5VHlwZV9zdGdkaWN0KGR0LT5wcm90bykgOiBOVUxMOworICAgICAgICBpZiAoZGljdCAmJiAoZGljdC0+c2V0ZnVuYyA9PSBnZXRlbnRyeSgiYyIpLT5zZXRmdW5jKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoUHlDQXJnX0NoZWNrRXhhY3QodmFsdWUpKSB7CisgICAgICAgIC8qIGJ5cmVmKGNfY2hhciguLi4pKSAqLworICAgICAgICBQeUNBcmdPYmplY3QgKmEgPSAoUHlDQXJnT2JqZWN0ICopdmFsdWU7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KGEtPm9iaik7CisgICAgICAgIGlmIChkaWN0ICYmIChkaWN0LT5zZXRmdW5jID09IGdldGVudHJ5KCJjIiktPnNldGZ1bmMpKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQogCi0JYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7Ci0JaWYgKGFzX3BhcmFtZXRlcikgewotCQl2YWx1ZSA9IGNfY2hhcl9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKLQkJUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JLyogWFhYIGJldHRlciBtZXNzYWdlICovCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ3cm9uZyB0eXBlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNfcGFyYW1ldGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2YWx1ZSwgIl9hc19wYXJhbWV0ZXJfIik7CisgICAgaWYgKGFzX3BhcmFtZXRlcikgeworICAgICAgICB2YWx1ZSA9IGNfY2hhcl9wX2Zyb21fcGFyYW0odHlwZSwgYXNfcGFyYW1ldGVyKTsKKyAgICAgICAgUHlfREVDUkVGKGFzX3BhcmFtZXRlcik7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgLyogWFhYIGJldHRlciBtZXNzYWdlICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIHR5cGUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNfdm9pZF9wX2Zyb21fcGFyYW0oUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkOwotCVB5T2JqZWN0ICphc19wYXJhbWV0ZXI7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZDsKKyAgICBQeU9iamVjdCAqYXNfcGFyYW1ldGVyOwogI2lmIChQWVRIT05fQVBJX1ZFUlNJT04gPCAxMDEyKQogIyBlcnJvciBub3Qgc3VwcG9ydGVkCiAjZW5kaWYKIAogLyogTm9uZSAqLwotCWlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCS8qIFNob3VsZCBwcm9iYWJseSBhbGxvdyBidWZmZXIgaW50ZXJmYWNlIGFzIHdlbGwgKi8KKyAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICAvKiBTaG91bGQgcHJvYmFibHkgYWxsb3cgYnVmZmVyIGludGVyZmFjZSBhcyB3ZWxsICovCiAvKiBpbnQsIGxvbmcgKi8KLQlpZiAoUHlJbnRfQ2hlY2sodmFsdWUpIHx8IFB5TG9uZ19DaGVjayh2YWx1ZSkpIHsKLQkJUHlDQXJnT2JqZWN0ICpwYXJnOwotCQlzdHJ1Y3QgZmllbGRkZXNjICpmZCA9IGdldGVudHJ5KCJQIik7CisgICAgaWYgKFB5SW50X0NoZWNrKHZhbHVlKSB8fCBQeUxvbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgiUCIpOwogCi0JCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYXJnLT50YWcgPSAnUCc7Ci0JCXBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOwotCQlpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdQJzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQogLyogc3RyaW5nICovCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JCXN0cnVjdCBmaWVsZGRlc2MgKmZkID0gZ2V0ZW50cnkoInoiKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgieiIpOwogCi0JCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYXJnLT50YWcgPSAneic7Ci0JCXBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOwotCQlpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICd6JzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQogLyogdW5pY29kZSAqLwotCWlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5Q0FyZ09iamVjdCAqcGFyZzsKLQkJc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgiWiIpOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgc3RydWN0IGZpZWxkZGVzYyAqZmQgPSBnZXRlbnRyeSgiWiIpOwogCi0JCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYXJnLT50YWcgPSAnWic7Ci0JCXBhcmctPm9iaiA9IGZkLT5zZXRmdW5jKCZwYXJnLT52YWx1ZSwgdmFsdWUsIDApOwotCQlpZiAocGFyZy0+b2JqID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihwYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdaJzsKKyAgICAgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgICAgIGlmIChwYXJnLT5vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHBhcmcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgfQogLyogY192b2lkX3AgaW5zdGFuY2UgKG9yIHN1YmNsYXNzKSAqLwotCWlmIChQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgewotCQkvKiBjX3ZvaWRfcCBpbnN0YW5jZXMgKi8KLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KKyAgICBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKKyAgICAgICAgLyogY192b2lkX3AgaW5zdGFuY2VzICovCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CiAvKiBjdHlwZXMgYXJyYXkgb3IgcG9pbnRlciBpbnN0YW5jZSAqLwotCWlmIChBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkgfHwgUG9pbnRlck9iamVjdF9DaGVjayh2YWx1ZSkpIHsKLQkJLyogQW55IGFycmF5IG9yIHBvaW50ZXIgaXMgYWNjZXB0ZWQgKi8KLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KKyAgICBpZiAoQXJyYXlPYmplY3RfQ2hlY2sodmFsdWUpIHx8IFBvaW50ZXJPYmplY3RfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIC8qIEFueSBhcnJheSBvciBwb2ludGVyIGlzIGFjY2VwdGVkICovCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CiAvKiBieXJlZiguLi4pICovCi0JaWYgKFB5Q0FyZ19DaGVja0V4YWN0KHZhbHVlKSkgewotCQkvKiBieXJlZihjX3h4eCgpKSAqLwotCQlQeUNBcmdPYmplY3QgKmEgPSAoUHlDQXJnT2JqZWN0ICopdmFsdWU7Ci0JCWlmIChhLT50YWcgPT0gJ1AnKSB7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQorICAgIGlmIChQeUNBcmdfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgLyogYnlyZWYoY194eHgoKSkgKi8KKyAgICAgICAgUHlDQXJnT2JqZWN0ICphID0gKFB5Q0FyZ09iamVjdCAqKXZhbHVlOworICAgICAgICBpZiAoYS0+dGFnID09ICdQJykgeworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KIC8qIGZ1bmN0aW9uIHBvaW50ZXIgKi8KLQlpZiAoQ0Z1bmNQdHJPYmplY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5Q0FyZ09iamVjdCAqcGFyZzsKLQkJQ0Z1bmNQdHJPYmplY3QgKmZ1bmM7Ci0JCWZ1bmMgPSAoQ0Z1bmNQdHJPYmplY3QgKil2YWx1ZTsKLQkJcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7Ci0JCWlmIChwYXJnID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JCXBhcmctPnRhZyA9ICdQJzsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcGFyZy0+dmFsdWUucCA9ICoodm9pZCAqKilmdW5jLT5iX3B0cjsKLQkJcGFyZy0+b2JqID0gdmFsdWU7Ci0JCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCX0KKyAgICBpZiAoQ0Z1bmNQdHJPYmplY3RfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICAgICAgQ0Z1bmNQdHJPYmplY3QgKmZ1bmM7CisgICAgICAgIGZ1bmMgPSAoQ0Z1bmNQdHJPYmplY3QgKil2YWx1ZTsKKyAgICAgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhcmctPnRhZyA9ICdQJzsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcGFyZy0+dmFsdWUucCA9ICoodm9pZCAqKilmdW5jLT5iX3B0cjsKKyAgICAgICAgcGFyZy0+b2JqID0gdmFsdWU7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilwYXJnOworICAgIH0KIC8qIGNfY2hhcl9wLCBjX3djaGFyX3AgKi8KLQlzdGdkID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7Ci0JaWYgKHN0Z2QgJiYgQ0RhdGFPYmplY3RfQ2hlY2sodmFsdWUpICYmIHN0Z2QtPnByb3RvICYmIFB5U3RyaW5nX0NoZWNrKHN0Z2QtPnByb3RvKSkgewotCQlQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgc3RnZCA9IFB5T2JqZWN0X3N0Z2RpY3QodmFsdWUpOworICAgIGlmIChzdGdkICYmIENEYXRhT2JqZWN0X0NoZWNrKHZhbHVlKSAmJiBzdGdkLT5wcm90byAmJiBQeVN0cmluZ19DaGVjayhzdGdkLT5wcm90bykpIHsKKyAgICAgICAgUHlDQXJnT2JqZWN0ICpwYXJnOwogCi0JCXN3aXRjaCAoUHlTdHJpbmdfQVNfU1RSSU5HKHN0Z2QtPnByb3RvKVswXSkgewotCQljYXNlICd6JzogLyogY19jaGFyX3AgKi8KLQkJY2FzZSAnWic6IC8qIGNfd2NoYXJfcCAqLwotCQkJcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7Ci0JCQlpZiAocGFyZyA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JCQlwYXJnLT50YWcgPSAnWic7Ci0JCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJcGFyZy0+b2JqID0gdmFsdWU7Ci0JCQkvKiBSZW1lbWJlcjogYl9wdHIgcG9pbnRzIHRvIHdoZXJlIHRoZSBwb2ludGVyIGlzIHN0b3JlZCEgKi8KLQkJCXBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopKCgoQ0RhdGFPYmplY3QgKil2YWx1ZSktPmJfcHRyKTsKLQkJCXJldHVybiAoUHlPYmplY3QgKilwYXJnOwotCQl9Ci0JfQorICAgICAgICBzd2l0Y2ggKFB5U3RyaW5nX0FTX1NUUklORyhzdGdkLT5wcm90bylbMF0pIHsKKyAgICAgICAgY2FzZSAneic6IC8qIGNfY2hhcl9wICovCisgICAgICAgIGNhc2UgJ1onOiAvKiBjX3djaGFyX3AgKi8KKyAgICAgICAgICAgIHBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOworICAgICAgICAgICAgaWYgKHBhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICAgICAgcGFyZy0+dGFnID0gJ1onOworICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHBhcmctPm9iaiA9IHZhbHVlOworICAgICAgICAgICAgLyogUmVtZW1iZXI6IGJfcHRyIHBvaW50cyB0byB3aGVyZSB0aGUgcG9pbnRlciBpcyBzdG9yZWQhICovCisgICAgICAgICAgICBwYXJnLT52YWx1ZS5wID0gKih2b2lkICoqKSgoKENEYXRhT2JqZWN0ICopdmFsdWUpLT5iX3B0cik7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKKyAgICAgICAgfQorICAgIH0KIAotCWFzX3BhcmFtZXRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodmFsdWUsICJfYXNfcGFyYW1ldGVyXyIpOwotCWlmIChhc19wYXJhbWV0ZXIpIHsKLQkJdmFsdWUgPSBjX3ZvaWRfcF9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7Ci0JCVB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCS8qIFhYWCBiZXR0ZXIgbWVzc2FnZSAqLwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkid3JvbmcgdHlwZSIpOwotCXJldHVybiBOVUxMOworICAgIGFzX3BhcmFtZXRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodmFsdWUsICJfYXNfcGFyYW1ldGVyXyIpOworICAgIGlmIChhc19wYXJhbWV0ZXIpIHsKKyAgICAgICAgdmFsdWUgPSBjX3ZvaWRfcF9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7CisgICAgICAgIFB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIC8qIFhYWCBiZXR0ZXIgbWVzc2FnZSAqLworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB0eXBlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAjaWYgKFBZVEhPTl9BUElfVkVSU0lPTiA+PSAxMDEyKQogCkBAIC0xNzQ2LDI5MSArMTc0NiwyOTEgQEAKICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKkNyZWF0ZVN3YXBwZWRUeXBlKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLAotCQkJCSAgIFB5T2JqZWN0ICpwcm90bywgc3RydWN0IGZpZWxkZGVzYyAqZm10KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcHJvdG8sIHN0cnVjdCBmaWVsZGRlc2MgKmZtdCkKIHsKLQlQeVR5cGVPYmplY3QgKnJlc3VsdDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCVB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlQeU9iamVjdCAqc3dhcHBlZF9hcmdzOwotCXN0YXRpYyBQeU9iamVjdCAqc3VmZml4OwotCVB5X3NzaXplX3QgaTsKKyAgICBQeVR5cGVPYmplY3QgKnJlc3VsdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIFB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBQeU9iamVjdCAqc3dhcHBlZF9hcmdzOworICAgIHN0YXRpYyBQeU9iamVjdCAqc3VmZml4OworICAgIFB5X3NzaXplX3QgaTsKIAotCXN3YXBwZWRfYXJncyA9IFB5VHVwbGVfTmV3KFB5VHVwbGVfR0VUX1NJWkUoYXJncykpOwotCWlmICghc3dhcHBlZF9hcmdzKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzd2FwcGVkX2FyZ3MgPSBQeVR1cGxlX05ldyhQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKTsKKyAgICBpZiAoIXN3YXBwZWRfYXJncykKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3VmZml4ID09IE5VTEwpCisgICAgaWYgKHN1ZmZpeCA9PSBOVUxMKQogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCQlzdWZmaXggPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfbGUiKTsKKyAgICAgICAgc3VmZml4ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX2xlIik7CiAjZWxzZQotCQlzdWZmaXggPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfYmUiKTsKKyAgICAgICAgc3VmZml4ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX2JlIik7CiAjZW5kaWYKIAotCVB5X0lOQ1JFRihuYW1lKTsKLQlQeVN0cmluZ19Db25jYXQoJm5hbWUsIHN1ZmZpeCk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKG5hbWUpOworICAgIFB5U3RyaW5nX0NvbmNhdCgmbmFtZSwgc3VmZml4KTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5VHVwbGVfU0VUX0lURU0oc3dhcHBlZF9hcmdzLCAwLCBuYW1lKTsKLQlmb3IgKGk9MTsgaTxQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOyArK2kpIHsKLQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlQeV9JTkNSRUYodik7Ci0JCVB5VHVwbGVfU0VUX0lURU0oc3dhcHBlZF9hcmdzLCBpLCB2KTsKLQl9CisgICAgUHlUdXBsZV9TRVRfSVRFTShzd2FwcGVkX2FyZ3MsIDAsIG5hbWUpOworICAgIGZvciAoaT0xOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShzd2FwcGVkX2FyZ3MsIGksIHYpOworICAgIH0KIAotCS8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAotCSAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KLQlyZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIHN3YXBwZWRfYXJncywga3dkcyk7Ci0JUHlfREVDUkVGKHN3YXBwZWRfYXJncyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKKyAgICAgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCisgICAgcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBzd2FwcGVkX2FyZ3MsIGt3ZHMpOworICAgIFB5X0RFQ1JFRihzd2FwcGVkX2FyZ3MpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGdkaWN0ID0gKFN0Z0RpY3RPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KAotCQkoUHlPYmplY3QgKikmU3RnRGljdF9UeXBlLCBOVUxMKTsKLQlpZiAoIXN0Z2RpY3QpIC8qIFhYWCBsZWFrcyByZXN1bHQhICovCi0JCXJldHVybiBOVUxMOworICAgIHN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCisgICAgICAgIChQeU9iamVjdCAqKSZTdGdEaWN0X1R5cGUsIE5VTEwpOworICAgIGlmICghc3RnZGljdCkgLyogWFhYIGxlYWtzIHJlc3VsdCEgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyID0gKmZtdC0+cGZmaV90eXBlOwotCXN0Z2RpY3QtPmFsaWduID0gZm10LT5wZmZpX3R5cGUtPmFsaWdubWVudDsKLQlzdGdkaWN0LT5sZW5ndGggPSAwOwotCXN0Z2RpY3QtPnNpemUgPSBmbXQtPnBmZmlfdHlwZS0+c2l6ZTsKLQlzdGdkaWN0LT5zZXRmdW5jID0gZm10LT5zZXRmdW5jX3N3YXBwZWQ7Ci0Jc3RnZGljdC0+Z2V0ZnVuYyA9IGZtdC0+Z2V0ZnVuY19zd2FwcGVkOworICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSAqZm10LT5wZmZpX3R5cGU7CisgICAgc3RnZGljdC0+YWxpZ24gPSBmbXQtPnBmZmlfdHlwZS0+YWxpZ25tZW50OworICAgIHN0Z2RpY3QtPmxlbmd0aCA9IDA7CisgICAgc3RnZGljdC0+c2l6ZSA9IGZtdC0+cGZmaV90eXBlLT5zaXplOworICAgIHN0Z2RpY3QtPnNldGZ1bmMgPSBmbXQtPnNldGZ1bmNfc3dhcHBlZDsKKyAgICBzdGdkaWN0LT5nZXRmdW5jID0gZm10LT5nZXRmdW5jX3N3YXBwZWQ7CiAKLQlQeV9JTkNSRUYocHJvdG8pOwotCXN0Z2RpY3QtPnByb3RvID0gcHJvdG87CisgICAgUHlfSU5DUkVGKHByb3RvKTsKKyAgICBzdGdkaWN0LT5wcm90byA9IHByb3RvOwogCi0JLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KLQlpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKLQlyZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OworICAgIC8qIHJlcGxhY2UgdGhlIGNsYXNzIGRpY3QgYnkgb3VyIHVwZGF0ZWQgc3BhbSBkaWN0ICovCisgICAgaWYgKC0xID09IFB5RGljdF9VcGRhdGUoKFB5T2JqZWN0ICopc3RnZGljdCwgcmVzdWx0LT50cF9kaWN0KSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlc3VsdC0+dHBfZGljdCk7CisgICAgcmVzdWx0LT50cF9kaWN0ID0gKFB5T2JqZWN0ICopc3RnZGljdDsKIAotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogc3RhdGljIFB5Q0FyZ09iamVjdCAqCiBTaW1wbGVUeXBlX3BhcmFtZnVuYyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWNoYXIgKmZtdDsKLQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0Jc3RydWN0IGZpZWxkZGVzYyAqZmQ7Ci0JCi0JZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCi0JZm10ID0gUHlTdHJpbmdfQXNTdHJpbmcoZGljdC0+cHJvdG8pOwotCWFzc2VydChmbXQpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgY2hhciAqZm10OworICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICBzdHJ1Y3QgZmllbGRkZXNjICpmZDsKIAotCWZkID0gZ2V0ZW50cnkoZm10KTsKLQlhc3NlcnQoZmQpOwotCQotCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCWlmIChwYXJnID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCQotCXBhcmctPnRhZyA9IGZtdFswXTsKLQlwYXJnLT5wZmZpX3R5cGUgPSBmZC0+cGZmaV90eXBlOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlwYXJnLT5vYmogPSAoUHlPYmplY3QgKilzZWxmOwotCW1lbWNweSgmcGFyZy0+dmFsdWUsIHNlbGYtPmJfcHRyLCBzZWxmLT5iX3NpemUpOwotCXJldHVybiBwYXJnOwkKKyAgICBkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBDRGF0YU9iamVjdCBpbnN0YW5jZXMgKi8KKyAgICBmbXQgPSBQeVN0cmluZ19Bc1N0cmluZyhkaWN0LT5wcm90byk7CisgICAgYXNzZXJ0KGZtdCk7CisKKyAgICBmZCA9IGdldGVudHJ5KGZtdCk7CisgICAgYXNzZXJ0KGZkKTsKKworICAgIHBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOworICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcGFyZy0+dGFnID0gZm10WzBdOworICAgIHBhcmctPnBmZmlfdHlwZSA9IGZkLT5wZmZpX3R5cGU7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHBhcmctPm9iaiA9IChQeU9iamVjdCAqKXNlbGY7CisgICAgbWVtY3B5KCZwYXJnLT52YWx1ZSwgc2VsZi0+Yl9wdHIsIHNlbGYtPmJfc2l6ZSk7CisgICAgcmV0dXJuIHBhcmc7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBTaW1wbGVUeXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeVR5cGVPYmplY3QgKnJlc3VsdDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCVB5T2JqZWN0ICpwcm90bzsKLQljb25zdCBjaGFyICpwcm90b19zdHI7Ci0JUHlfc3NpemVfdCBwcm90b19sZW47Ci0JUHlNZXRob2REZWYgKm1sOwotCXN0cnVjdCBmaWVsZGRlc2MgKmZtdDsKKyAgICBQeVR5cGVPYmplY3QgKnJlc3VsdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKKyAgICBjb25zdCBjaGFyICpwcm90b19zdHI7CisgICAgUHlfc3NpemVfdCBwcm90b19sZW47CisgICAgUHlNZXRob2REZWYgKm1sOworICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZtdDsKIAotCS8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAotCSAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KLQlyZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogY3JlYXRlIHRoZSBuZXcgaW5zdGFuY2UgKHdoaWNoIGlzIGEgY2xhc3MsCisgICAgICAgc2luY2Ugd2UgYXJlIGEgbWV0YXR5cGUhKSAqLworICAgIHJlc3VsdCA9IChQeVR5cGVPYmplY3QgKilQeVR5cGVfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXByb3RvID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfdHlwZV8iKTsgLyogbmV3IHJlZiAqLwotCWlmICghcHJvdG8pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIGF0dHJpYnV0ZSIpOworICAgIHByb3RvID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfdHlwZV8iKTsgLyogbmV3IHJlZiAqLworICAgIGlmICghcHJvdG8pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzIG11c3QgZGVmaW5lIGEgJ190eXBlXycgYXR0cmlidXRlIik7CiAgIGVycm9yOgotCQlQeV9YREVDUkVGKHByb3RvKTsKLQkJUHlfWERFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHByb3RvKSkgewotCQlwcm90b19zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pOwotCQlwcm90b19sZW4gPSBQeVN0cmluZ19HRVRfU0laRShwcm90byk7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIHN0cmluZyBhdHRyaWJ1dGUiKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaWYgKHByb3RvX2xlbiAhPSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIGF0dHJpYnV0ZSAiCi0JCQkJIndoaWNoIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDEiKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaWYgKCFzdHJjaHIoU0lNUExFX1RZUEVfQ0hBUlMsICpwcm90b19zdHIpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgImNsYXNzIG11c3QgZGVmaW5lIGEgJ190eXBlXycgYXR0cmlidXRlIHdoaWNoIG11c3QgYmVcbiIKLQkJCSAgICAgImEgc2luZ2xlIGNoYXJhY3RlciBzdHJpbmcgY29udGFpbmluZyBvbmUgb2YgJyVzJy4iLAotCQkJICAgICBTSU1QTEVfVFlQRV9DSEFSUyk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWZtdCA9IGdldGVudHJ5KFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOwotCWlmIChmbXQgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIl90eXBlXyAnJXMnIG5vdCBzdXBwb3J0ZWQiLAotCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgICAgIFB5X1hERUNSRUYocHJvdG8pOworICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2socHJvdG8pKSB7CisgICAgICAgIHByb3RvX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhwcm90byk7CisgICAgICAgIHByb3RvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHByb3RvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImNsYXNzIG11c3QgZGVmaW5lIGEgJ190eXBlXycgc3RyaW5nIGF0dHJpYnV0ZSIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAocHJvdG9fbGVuICE9IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX3R5cGVfJyBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDEiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKCFzdHJjaHIoU0lNUExFX1RZUEVfQ0hBUlMsICpwcm90b19zdHIpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjbGFzcyBtdXN0IGRlZmluZSBhICdfdHlwZV8nIGF0dHJpYnV0ZSB3aGljaCBtdXN0IGJlXG4iCisgICAgICAgICAgICAgICAgICAgICAiYSBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZyBjb250YWluaW5nIG9uZSBvZiAnJXMnLiIsCisgICAgICAgICAgICAgICAgICAgICBTSU1QTEVfVFlQRV9DSEFSUyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGZtdCA9IGdldGVudHJ5KFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOworICAgIGlmIChmbXQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8gJyVzJyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCXN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCi0JCShQeU9iamVjdCAqKSZTdGdEaWN0X1R5cGUsIE5VTEwpOwotCWlmICghc3RnZGljdCkKLQkJZ290byBlcnJvcjsKKyAgICBzdGdkaWN0ID0gKFN0Z0RpY3RPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KAorICAgICAgICAoUHlPYmplY3QgKikmU3RnRGljdF9UeXBlLCBOVUxMKTsKKyAgICBpZiAoIXN0Z2RpY3QpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyID0gKmZtdC0+cGZmaV90eXBlOwotCXN0Z2RpY3QtPmFsaWduID0gZm10LT5wZmZpX3R5cGUtPmFsaWdubWVudDsKLQlzdGdkaWN0LT5sZW5ndGggPSAwOwotCXN0Z2RpY3QtPnNpemUgPSBmbXQtPnBmZmlfdHlwZS0+c2l6ZTsKLQlzdGdkaWN0LT5zZXRmdW5jID0gZm10LT5zZXRmdW5jOwotCXN0Z2RpY3QtPmdldGZ1bmMgPSBmbXQtPmdldGZ1bmM7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9ICpmbXQtPnBmZmlfdHlwZTsKKyAgICBzdGdkaWN0LT5hbGlnbiA9IGZtdC0+cGZmaV90eXBlLT5hbGlnbm1lbnQ7CisgICAgc3RnZGljdC0+bGVuZ3RoID0gMDsKKyAgICBzdGdkaWN0LT5zaXplID0gZm10LT5wZmZpX3R5cGUtPnNpemU7CisgICAgc3RnZGljdC0+c2V0ZnVuYyA9IGZtdC0+c2V0ZnVuYzsKKyAgICBzdGdkaWN0LT5nZXRmdW5jID0gZm10LT5nZXRmdW5jOwogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCXN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoIj4iLCBwcm90b19zdHIpOworICAgIHN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoIj4iLCBwcm90b19zdHIpOwogI2Vsc2UKLQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKCI8IiwgcHJvdG9fc3RyKTsKKyAgICBzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKCI8IiwgcHJvdG9fc3RyKTsKICNlbmRpZgotCWlmIChzdGdkaWN0LT5mb3JtYXQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfREVDUkVGKHByb3RvKTsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYocHJvdG8pOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN0Z2RpY3QtPnBhcmFtZnVuYyA9IFNpbXBsZVR5cGVfcGFyYW1mdW5jOworICAgIHN0Z2RpY3QtPnBhcmFtZnVuYyA9IFNpbXBsZVR5cGVfcGFyYW1mdW5jOwogLyoKLQlpZiAocmVzdWx0LT50cF9iYXNlICE9ICZTaW1wbGVfVHlwZSkgewotCQlzdGdkaWN0LT5zZXRmdW5jID0gTlVMTDsKLQkJc3RnZGljdC0+Z2V0ZnVuYyA9IE5VTEw7Ci0JfQorICAgIGlmIChyZXN1bHQtPnRwX2Jhc2UgIT0gJlNpbXBsZV9UeXBlKSB7CisgICAgICAgIHN0Z2RpY3QtPnNldGZ1bmMgPSBOVUxMOworICAgICAgICBzdGdkaWN0LT5nZXRmdW5jID0gTlVMTDsKKyAgICB9CiAqLwogCi0JLyogVGhpcyBjb25zdW1lcyB0aGUgcmVmY291bnQgb24gcHJvdG8gd2hpY2ggd2UgaGF2ZSAqLwotCXN0Z2RpY3QtPnByb3RvID0gcHJvdG87CisgICAgLyogVGhpcyBjb25zdW1lcyB0aGUgcmVmY291bnQgb24gcHJvdG8gd2hpY2ggd2UgaGF2ZSAqLworICAgIHN0Z2RpY3QtPnByb3RvID0gcHJvdG87CiAKLQkvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHNwYW0gZGljdCAqLwotCWlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKXN0Z2RpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOwotCXJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKXN0Z2RpY3Q7CisgICAgLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzcGFtIGRpY3QgKi8KKyAgICBpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKKyAgICByZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OwogCi0JLyogSW5zdGFsbCBmcm9tX3BhcmFtIGNsYXNzIG1ldGhvZHMgaW4gY3R5cGVzIGJhc2UgY2xhc3Nlcy4KLQkgICBPdmVycmlkZXMgdGhlIFNpbXBsZVR5cGVfZnJvbV9wYXJhbSBnZW5lcmljIG1ldGhvZC4KLQkgKi8KLQlpZiAocmVzdWx0LT50cF9iYXNlID09ICZTaW1wbGVfVHlwZSkgewotCQlzd2l0Y2ggKFB5U3RyaW5nX0FTX1NUUklORyhwcm90bylbMF0pIHsKLQkJY2FzZSAneic6IC8qIGNfY2hhcl9wICovCi0JCQltbCA9ICZjX2NoYXJfcF9tZXRob2Q7Ci0JCQlzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7Ci0JCQlicmVhazsKLQkJY2FzZSAnWic6IC8qIGNfd2NoYXJfcCAqLwotCQkJbWwgPSAmY193Y2hhcl9wX21ldGhvZDsKLQkJCXN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKLQkJCWJyZWFrOwotCQljYXNlICdQJzogLyogY192b2lkX3AgKi8KLQkJCW1sID0gJmNfdm9pZF9wX21ldGhvZDsKLQkJCXN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKLQkJCWJyZWFrOwotCQljYXNlICdzJzoKLQkJY2FzZSAnWCc6Ci0JCWNhc2UgJ08nOgotCQkJbWwgPSBOVUxMOwotCQkJc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSVNQT0lOVEVSOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQltbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQkJCi0JCWlmIChtbCkgeworICAgIC8qIEluc3RhbGwgZnJvbV9wYXJhbSBjbGFzcyBtZXRob2RzIGluIGN0eXBlcyBiYXNlIGNsYXNzZXMuCisgICAgICAgT3ZlcnJpZGVzIHRoZSBTaW1wbGVUeXBlX2Zyb21fcGFyYW0gZ2VuZXJpYyBtZXRob2QuCisgICAgICovCisgICAgaWYgKHJlc3VsdC0+dHBfYmFzZSA9PSAmU2ltcGxlX1R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pWzBdKSB7CisgICAgICAgIGNhc2UgJ3onOiAvKiBjX2NoYXJfcCAqLworICAgICAgICAgICAgbWwgPSAmY19jaGFyX3BfbWV0aG9kOworICAgICAgICAgICAgc3RnZGljdC0+ZmxhZ3MgfD0gVFlQRUZMQUdfSVNQT0lOVEVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1onOiAvKiBjX3djaGFyX3AgKi8KKyAgICAgICAgICAgIG1sID0gJmNfd2NoYXJfcF9tZXRob2Q7CisgICAgICAgICAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUCc6IC8qIGNfdm9pZF9wICovCisgICAgICAgICAgICBtbCA9ICZjX3ZvaWRfcF9tZXRob2Q7CisgICAgICAgICAgICBzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICBjYXNlICdPJzoKKyAgICAgICAgICAgIG1sID0gTlVMTDsKKyAgICAgICAgICAgIHN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWwpIHsKICNpZiAoUFlUSE9OX0FQSV9WRVJTSU9OID49IDEwMTIpCi0JCQlQeU9iamVjdCAqbWV0aDsKLQkJCWludCB4OwotCQkJbWV0aCA9IFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QocmVzdWx0LCBtbCk7Ci0JCQlpZiAoIW1ldGgpCi0JCQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqbWV0aDsKKyAgICAgICAgICAgIGludCB4OworICAgICAgICAgICAgbWV0aCA9IFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QocmVzdWx0LCBtbCk7CisgICAgICAgICAgICBpZiAoIW1ldGgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjZWxzZQogI2Vycm9yCi0JCQlQeU9iamVjdCAqbWV0aCwgKmZ1bmM7Ci0JCQlpbnQgeDsKLQkJCWZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcobWwsIE5VTEwpOwotCQkJaWYgKCFmdW5jKQotCQkJCXJldHVybiBOVUxMOwotCQkJbWV0aCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCi0JCQkJKFB5T2JqZWN0ICopJlB5Q2xhc3NNZXRob2RfVHlwZSwKLQkJCQlmdW5jLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihmdW5jKTsKLQkJCWlmICghbWV0aCkgewotCQkJCXJldHVybiBOVUxMOwotCQkJfQorICAgICAgICAgICAgUHlPYmplY3QgKm1ldGgsICpmdW5jOworICAgICAgICAgICAgaW50IHg7CisgICAgICAgICAgICBmdW5jID0gUHlDRnVuY3Rpb25fTmV3KG1sLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghZnVuYykKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIG1ldGggPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAorICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSZQeUNsYXNzTWV0aG9kX1R5cGUsCisgICAgICAgICAgICAgICAgZnVuYywgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICBpZiAoIW1ldGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJeCA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdC0+dHBfZGljdCwKLQkJCQkJCSBtbC0+bWxfbmFtZSwKLQkJCQkJCSBtZXRoKTsKLQkJCVB5X0RFQ1JFRihtZXRoKTsKLQkJCWlmICh4ID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICB4ID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcocmVzdWx0LT50cF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sLT5tbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGgpOworICAgICAgICAgICAgUHlfREVDUkVGKG1ldGgpOworICAgICAgICAgICAgaWYgKHggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmICh0eXBlID09ICZTaW1wbGVUeXBlX1R5cGUgJiYgZm10LT5zZXRmdW5jX3N3YXBwZWQgJiYgZm10LT5nZXRmdW5jX3N3YXBwZWQpIHsKLQkJUHlPYmplY3QgKnN3YXBwZWQgPSBDcmVhdGVTd2FwcGVkVHlwZSh0eXBlLCBhcmdzLCBrd2RzLAotCQkJCQkJICAgICAgcHJvdG8sIGZtdCk7Ci0JCVN0Z0RpY3RPYmplY3QgKnN3X2RpY3Q7Ci0JCWlmIChzd2FwcGVkID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3dfZGljdCA9IFB5VHlwZV9zdGdkaWN0KHN3YXBwZWQpOworICAgIGlmICh0eXBlID09ICZTaW1wbGVUeXBlX1R5cGUgJiYgZm10LT5zZXRmdW5jX3N3YXBwZWQgJiYgZm10LT5nZXRmdW5jX3N3YXBwZWQpIHsKKyAgICAgICAgUHlPYmplY3QgKnN3YXBwZWQgPSBDcmVhdGVTd2FwcGVkVHlwZSh0eXBlLCBhcmdzLCBrd2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLCBmbXQpOworICAgICAgICBTdGdEaWN0T2JqZWN0ICpzd19kaWN0OworICAgICAgICBpZiAoc3dhcHBlZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN3X2RpY3QgPSBQeVR5cGVfc3RnZGljdChzd2FwcGVkKTsKICNpZmRlZiBXT1JEU19CSUdFTkRJQU4KLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2xlX18iLCBzd2FwcGVkKTsKLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2JlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwotCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2JlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwotCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2xlX18iLCBzd2FwcGVkKTsKLQkJLyogV2UgYXJlIGNyZWF0aW5nIHRoZSB0eXBlIGZvciB0aGUgT1RIRVIgZW5kaWFuICovCi0JCXN3X2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoIjwiLCBzdGdkaWN0LT5mb3JtYXQrMSk7CisgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9sZV9fIiwgc3dhcHBlZCk7CisgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9iZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9iZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9sZV9fIiwgc3dhcHBlZCk7CisgICAgICAgIC8qIFdlIGFyZSBjcmVhdGluZyB0aGUgdHlwZSBmb3IgdGhlIE9USEVSIGVuZGlhbiAqLworICAgICAgICBzd19kaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKCI8Iiwgc3RnZGljdC0+Zm9ybWF0KzEpOwogI2Vsc2UKLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2JlX18iLCBzd2FwcGVkKTsKLQkJUHlPYmplY3RfU2V0QXR0clN0cmluZygoUHlPYmplY3QgKilyZXN1bHQsICJfX2N0eXBlX2xlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwotCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2xlX18iLCAoUHlPYmplY3QgKilyZXN1bHQpOwotCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHN3YXBwZWQsICJfX2N0eXBlX2JlX18iLCBzd2FwcGVkKTsKLQkJLyogV2UgYXJlIGNyZWF0aW5nIHRoZSB0eXBlIGZvciB0aGUgT1RIRVIgZW5kaWFuICovCi0JCXN3X2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoIj4iLCBzdGdkaWN0LT5mb3JtYXQrMSk7CisgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9iZV9fIiwgc3dhcHBlZCk7CisgICAgICAgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopcmVzdWx0LCAiX19jdHlwZV9sZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9sZV9fIiwgKFB5T2JqZWN0ICopcmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhzd2FwcGVkLCAiX19jdHlwZV9iZV9fIiwgc3dhcHBlZCk7CisgICAgICAgIC8qIFdlIGFyZSBjcmVhdGluZyB0aGUgdHlwZSBmb3IgdGhlIE9USEVSIGVuZGlhbiAqLworICAgICAgICBzd19kaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKCI+Iiwgc3RnZGljdC0+Zm9ybWF0KzEpOwogI2VuZGlmCi0JCVB5X0RFQ1JFRihzd2FwcGVkKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9OworICAgICAgICBQeV9ERUNSRUYoc3dhcHBlZCk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfTsKIAotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogLyoKQEAgLTIwNDAsMTAxICsyMDQwLDEwMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFNpbXBsZVR5cGVfZnJvbV9wYXJhbShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JY2hhciAqZm10OwotCVB5Q0FyZ09iamVjdCAqcGFyZzsKLQlzdHJ1Y3QgZmllbGRkZXNjICpmZDsKLQlQeU9iamVjdCAqYXNfcGFyYW1ldGVyOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgY2hhciAqZm10OworICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKyAgICBzdHJ1Y3QgZmllbGRkZXNjICpmZDsKKyAgICBQeU9iamVjdCAqYXNfcGFyYW1ldGVyOwogCi0JLyogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlcXVlc3RlZCB0eXBlLAotCSAgIHdlIGNhbiB1c2UgaXQgYXMgaXMgKi8KLQlpZiAoMSA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCB0eXBlKSkgewotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQorICAgIC8qIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGFuIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZSwKKyAgICAgICB3ZSBjYW4gdXNlIGl0IGFzIGlzICovCisgICAgaWYgKDEgPT0gUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKLQlhc3NlcnQoZGljdCk7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgIGFzc2VydChkaWN0KTsKIAotCS8qIEkgdGhpbmsgd2UgY2FuIHJlbHkgb24gdGhpcyBiZWluZyBhIG9uZS1jaGFyYWN0ZXIgc3RyaW5nICovCi0JZm10ID0gUHlTdHJpbmdfQXNTdHJpbmcoZGljdC0+cHJvdG8pOwotCWFzc2VydChmbXQpOwotCQotCWZkID0gZ2V0ZW50cnkoZm10KTsKLQlhc3NlcnQoZmQpOwotCQotCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCWlmIChwYXJnID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEkgdGhpbmsgd2UgY2FuIHJlbHkgb24gdGhpcyBiZWluZyBhIG9uZS1jaGFyYWN0ZXIgc3RyaW5nICovCisgICAgZm10ID0gUHlTdHJpbmdfQXNTdHJpbmcoZGljdC0+cHJvdG8pOworICAgIGFzc2VydChmbXQpOwogCi0JcGFyZy0+dGFnID0gZm10WzBdOwotCXBhcmctPnBmZmlfdHlwZSA9IGZkLT5wZmZpX3R5cGU7Ci0JcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7Ci0JaWYgKHBhcmctPm9iaikKLQkJcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7Ci0JUHlFcnJfQ2xlYXIoKTsKLQlQeV9ERUNSRUYocGFyZyk7CisgICAgZmQgPSBnZXRlbnRyeShmbXQpOworICAgIGFzc2VydChmZCk7CiAKLQlhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKLQlpZiAoYXNfcGFyYW1ldGVyKSB7Ci0JCXZhbHVlID0gU2ltcGxlVHlwZV9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7Ci0JCVB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkid3JvbmcgdHlwZSIpOwotCXJldHVybiBOVUxMOworICAgIHBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOworICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcGFyZy0+dGFnID0gZm10WzBdOworICAgIHBhcmctPnBmZmlfdHlwZSA9IGZkLT5wZmZpX3R5cGU7CisgICAgcGFyZy0+b2JqID0gZmQtPnNldGZ1bmMoJnBhcmctPnZhbHVlLCB2YWx1ZSwgMCk7CisgICAgaWYgKHBhcmctPm9iaikKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9ERUNSRUYocGFyZyk7CisKKyAgICBhc19wYXJhbWV0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiX2FzX3BhcmFtZXRlcl8iKTsKKyAgICBpZiAoYXNfcGFyYW1ldGVyKSB7CisgICAgICAgIHZhbHVlID0gU2ltcGxlVHlwZV9mcm9tX3BhcmFtKHR5cGUsIGFzX3BhcmFtZXRlcik7CisgICAgICAgIFB5X0RFQ1JFRihhc19wYXJhbWV0ZXIpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB0eXBlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBTaW1wbGVUeXBlX21ldGhvZHNbXSA9IHsKLQl7ICJmcm9tX3BhcmFtIiwgU2ltcGxlVHlwZV9mcm9tX3BhcmFtLCBNRVRIX08sIGZyb21fcGFyYW1fZG9jIH0sCi0JeyAiZnJvbV9hZGRyZXNzIiwgQ0RhdGFUeXBlX2Zyb21fYWRkcmVzcywgTUVUSF9PLCBmcm9tX2FkZHJlc3NfZG9jIH0sCi0JeyAiZnJvbV9idWZmZXIiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXIsIE1FVEhfVkFSQVJHUywgZnJvbV9idWZmZXJfZG9jLCB9LAotCXsgImZyb21fYnVmZmVyX2NvcHkiLCBDRGF0YVR5cGVfZnJvbV9idWZmZXJfY29weSwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9jb3B5X2RvYywgfSwKLQl7ICJpbl9kbGwiLCBDRGF0YVR5cGVfaW5fZGxsLCBNRVRIX1ZBUkFSR1MsIGluX2RsbF9kb2N9LAotCXsgTlVMTCwgTlVMTCB9LAorICAgIHsgImZyb21fcGFyYW0iLCBTaW1wbGVUeXBlX2Zyb21fcGFyYW0sIE1FVEhfTywgZnJvbV9wYXJhbV9kb2MgfSwKKyAgICB7ICJmcm9tX2FkZHJlc3MiLCBDRGF0YVR5cGVfZnJvbV9hZGRyZXNzLCBNRVRIX08sIGZyb21fYWRkcmVzc19kb2MgfSwKKyAgICB7ICJmcm9tX2J1ZmZlciIsIENEYXRhVHlwZV9mcm9tX2J1ZmZlciwgTUVUSF9WQVJBUkdTLCBmcm9tX2J1ZmZlcl9kb2MsIH0sCisgICAgeyAiZnJvbV9idWZmZXJfY29weSIsIENEYXRhVHlwZV9mcm9tX2J1ZmZlcl9jb3B5LCBNRVRIX1ZBUkFSR1MsIGZyb21fYnVmZmVyX2NvcHlfZG9jLCB9LAorICAgIHsgImluX2RsbCIsIENEYXRhVHlwZV9pbl9kbGwsIE1FVEhfVkFSQVJHUywgaW5fZGxsX2RvY30sCisgICAgeyBOVUxMLCBOVUxMIH0sCiB9OwogCiBQeVR5cGVPYmplY3QgU2ltcGxlVHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlNpbXBsZVR5cGUiLAkJCQkvKiB0cF9uYW1lICovCi0JMCwJCQkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkgICAgICAgCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZDRGF0YVR5cGVfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkibWV0YXR5cGUgZm9yIHRoZSBTaW1wbGVUeXBlIE9iamVjdHMiLAkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCVNpbXBsZVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCVNpbXBsZVR5cGVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLlNpbXBsZVR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkNEYXRhVHlwZV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgICJtZXRhdHlwZSBmb3IgdGhlIFNpbXBsZVR5cGUgT2JqZWN0cyIsICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBTaW1wbGVUeXBlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgU2ltcGxlVHlwZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMTQ1LDIyMSArMjE0NSwyMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb252ZXJ0ZXJzX2Zyb21fYXJndHlwZXMoUHlPYmplY3QgKm9iKQogewotCVB5T2JqZWN0ICpjb252ZXJ0ZXJzOwotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IG5BcmdzOworICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IG5BcmdzOwogCi0Jb2IgPSBQeVNlcXVlbmNlX1R1cGxlKG9iKTsgLyogbmV3IHJlZmVyZW5jZSAqLwotCWlmICghb2IpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX2FyZ3R5cGVzXyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgdHlwZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG9iID0gUHlTZXF1ZW5jZV9UdXBsZShvYik7IC8qIG5ldyByZWZlcmVuY2UgKi8KKyAgICBpZiAoIW9iKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX2FyZ3R5cGVzXyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgdHlwZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbkFyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKG9iKTsKLQljb252ZXJ0ZXJzID0gUHlUdXBsZV9OZXcobkFyZ3MpOwotCWlmICghY29udmVydGVycykKLQkJcmV0dXJuIE5VTEw7Ci0JCQotCS8qIEkgaGF2ZSB0byBjaGVjayBpZiB0aGlzIGlzIGNvcnJlY3QuIFVzaW5nIGNfY2hhciwgd2hpY2ggaGFzIGEgc2l6ZQotCSAgIG9mIDEsIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBwdXNoZWQgYXMgb25seSBvbmUgYnl0ZSEKLQkgICBBcmVuJ3QgdGhlc2UgcHJvbW90ZWQgdG8gaW50ZWdlcnMgYnkgdGhlIEMgY29tcGlsZXIgYW5kIHB1c2hlZCBhcyA0IGJ5dGVzPwotCSovCisgICAgbkFyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKG9iKTsKKyAgICBjb252ZXJ0ZXJzID0gUHlUdXBsZV9OZXcobkFyZ3MpOworICAgIGlmICghY29udmVydGVycykKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbkFyZ3M7ICsraSkgewotCQlQeU9iamVjdCAqdHAgPSBQeVR1cGxlX0dFVF9JVEVNKG9iLCBpKTsKLQkJUHlPYmplY3QgKmNudiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodHAsICJmcm9tX3BhcmFtIik7Ci0JCWlmICghY252KQotCQkJZ290byBhcmd0eXBlc19lcnJvcl8xOwotCQlQeVR1cGxlX1NFVF9JVEVNKGNvbnZlcnRlcnMsIGksIGNudik7Ci0JfQotCVB5X0RFQ1JFRihvYik7Ci0JcmV0dXJuIGNvbnZlcnRlcnM7CisgICAgLyogSSBoYXZlIHRvIGNoZWNrIGlmIHRoaXMgaXMgY29ycmVjdC4gVXNpbmcgY19jaGFyLCB3aGljaCBoYXMgYSBzaXplCisgICAgICAgb2YgMSwgd2lsbCBiZSBhc3N1bWVkIHRvIGJlIHB1c2hlZCBhcyBvbmx5IG9uZSBieXRlIQorICAgICAgIEFyZW4ndCB0aGVzZSBwcm9tb3RlZCB0byBpbnRlZ2VycyBieSB0aGUgQyBjb21waWxlciBhbmQgcHVzaGVkIGFzIDQgYnl0ZXM/CisgICAgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBuQXJnczsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICp0cCA9IFB5VHVwbGVfR0VUX0lURU0ob2IsIGkpOworICAgICAgICBQeU9iamVjdCAqY252ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0cCwgImZyb21fcGFyYW0iKTsKKyAgICAgICAgaWYgKCFjbnYpCisgICAgICAgICAgICBnb3RvIGFyZ3R5cGVzX2Vycm9yXzE7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY29udmVydGVycywgaSwgY252KTsKKyAgICB9CisgICAgUHlfREVDUkVGKG9iKTsKKyAgICByZXR1cm4gY29udmVydGVyczsKIAogICBhcmd0eXBlc19lcnJvcl8xOgotCVB5X1hERUNSRUYoY29udmVydGVycyk7Ci0JUHlfREVDUkVGKG9iKTsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgIFB5X1hERUNSRUYoY29udmVydGVycyk7CisgICAgUHlfREVDUkVGKG9iKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCSAgICAgIml0ZW0gJWQgaW4gX2FyZ3R5cGVzXyBoYXMgbm8gZnJvbV9wYXJhbSBtZXRob2QiLAorICAgICAgICAgICAgICAgICAiaXRlbSAlZCBpbiBfYXJndHlwZXNfIGhhcyBubyBmcm9tX3BhcmFtIG1ldGhvZCIsCiAjZWxzZQotCQkgICAgICJpdGVtICV6ZCBpbiBfYXJndHlwZXNfIGhhcyBubyBmcm9tX3BhcmFtIG1ldGhvZCIsCisgICAgICAgICAgICAgICAgICJpdGVtICV6ZCBpbiBfYXJndHlwZXNfIGhhcyBubyBmcm9tX3BhcmFtIG1ldGhvZCIsCiAjZW5kaWYKLQkJICAgICBpKzEpOwotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICBpKzEpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBtYWtlX2Z1bmNwdHJ0eXBlX2RpY3QoU3RnRGljdE9iamVjdCAqc3RnZGljdCkKIHsKLQlQeU9iamVjdCAqb2I7Ci0JUHlPYmplY3QgKmNvbnZlcnRlcnMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpvYjsKKyAgICBQeU9iamVjdCAqY29udmVydGVycyA9IE5VTEw7CiAKLQlzdGdkaWN0LT5hbGlnbiA9IGdldGVudHJ5KCJQIiktPnBmZmlfdHlwZS0+YWxpZ25tZW50OwotCXN0Z2RpY3QtPmxlbmd0aCA9IDE7Ci0Jc3RnZGljdC0+c2l6ZSA9IHNpemVvZih2b2lkICopOwotCXN0Z2RpY3QtPnNldGZ1bmMgPSBOVUxMOwotCXN0Z2RpY3QtPmdldGZ1bmMgPSBOVUxMOwotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIgPSBmZmlfdHlwZV9wb2ludGVyOworICAgIHN0Z2RpY3QtPmFsaWduID0gZ2V0ZW50cnkoIlAiKS0+cGZmaV90eXBlLT5hbGlnbm1lbnQ7CisgICAgc3RnZGljdC0+bGVuZ3RoID0gMTsKKyAgICBzdGdkaWN0LT5zaXplID0gc2l6ZW9mKHZvaWQgKik7CisgICAgc3RnZGljdC0+c2V0ZnVuYyA9IE5VTEw7CisgICAgc3RnZGljdC0+Z2V0ZnVuYyA9IE5VTEw7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9IGZmaV90eXBlX3BvaW50ZXI7CiAKLQlvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfZmxhZ3NfIik7Ci0JaWYgKCFvYiB8fCAhUHlJbnRfQ2hlY2sob2IpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAiY2xhc3MgbXVzdCBkZWZpbmUgX2ZsYWdzXyB3aGljaCBtdXN0IGJlIGFuIGludGVnZXIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzdGdkaWN0LT5mbGFncyA9IFB5SW50X0FTX0xPTkcob2IpIHwgVFlQRUZMQUdfSVNQT0lOVEVSOworICAgIG9iID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopc3RnZGljdCwgIl9mbGFnc18iKTsKKyAgICBpZiAoIW9iIHx8ICFQeUludF9DaGVjayhvYikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJjbGFzcyBtdXN0IGRlZmluZSBfZmxhZ3NfIHdoaWNoIG11c3QgYmUgYW4gaW50ZWdlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHN0Z2RpY3QtPmZsYWdzID0gUHlJbnRfQVNfTE9ORyhvYikgfCBUWVBFRkxBR19JU1BPSU5URVI7CiAKLQkvKiBfYXJndHlwZXNfIGlzIG9wdGlvbmFsLi4uICovCi0Jb2IgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilzdGdkaWN0LCAiX2FyZ3R5cGVzXyIpOwotCWlmIChvYikgewotCQljb252ZXJ0ZXJzID0gY29udmVydGVyc19mcm9tX2FyZ3R5cGVzKG9iKTsKLQkJaWYgKCFjb252ZXJ0ZXJzKQotCQkJZ290byBlcnJvcjsKLQkJUHlfSU5DUkVGKG9iKTsKLQkJc3RnZGljdC0+YXJndHlwZXMgPSBvYjsKLQkJc3RnZGljdC0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7Ci0JfQorICAgIC8qIF9hcmd0eXBlc18gaXMgb3B0aW9uYWwuLi4gKi8KKyAgICBvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfYXJndHlwZXNfIik7CisgICAgaWYgKG9iKSB7CisgICAgICAgIGNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzX2Zyb21fYXJndHlwZXMob2IpOworICAgICAgICBpZiAoIWNvbnZlcnRlcnMpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBQeV9JTkNSRUYob2IpOworICAgICAgICBzdGdkaWN0LT5hcmd0eXBlcyA9IG9iOworICAgICAgICBzdGdkaWN0LT5jb252ZXJ0ZXJzID0gY29udmVydGVyczsKKyAgICB9CiAKLQlvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfcmVzdHlwZV8iKTsKLQlpZiAob2IpIHsKLQkJaWYgKG9iICE9IFB5X05vbmUgJiYgIVB5VHlwZV9zdGdkaWN0KG9iKSAmJiAhUHlDYWxsYWJsZV9DaGVjayhvYikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl9yZXN0eXBlXyBtdXN0IGJlIGEgdHlwZSwgYSBjYWxsYWJsZSwgb3IgTm9uZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0lOQ1JFRihvYik7Ci0JCXN0Z2RpY3QtPnJlc3R5cGUgPSBvYjsKLQkJc3RnZGljdC0+Y2hlY2tlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2IsICJfY2hlY2tfcmV0dmFsXyIpOwotCQlpZiAoc3RnZGljdC0+Y2hlY2tlciA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9CisgICAgb2IgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilzdGdkaWN0LCAiX3Jlc3R5cGVfIik7CisgICAgaWYgKG9iKSB7CisgICAgICAgIGlmIChvYiAhPSBQeV9Ob25lICYmICFQeVR5cGVfc3RnZGljdChvYikgJiYgIVB5Q2FsbGFibGVfQ2hlY2sob2IpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJfcmVzdHlwZV8gbXVzdCBiZSBhIHR5cGUsIGEgY2FsbGFibGUsIG9yIE5vbmUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYob2IpOworICAgICAgICBzdGdkaWN0LT5yZXN0eXBlID0gb2I7CisgICAgICAgIHN0Z2RpY3QtPmNoZWNrZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iLCAiX2NoZWNrX3JldHZhbF8iKTsKKyAgICAgICAgaWYgKHN0Z2RpY3QtPmNoZWNrZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQogLyogWFhYIGxhdGVyLCBtYXliZS4KLQlvYiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKXN0Z2RpY3QsICJfZXJyY2hlY2tfIik7Ci0JaWYgKG9iKSB7Ci0JCWlmICghUHlDYWxsYWJsZV9DaGVjayhvYikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl9lcnJjaGVja18gbXVzdCBiZSBjYWxsYWJsZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0lOQ1JFRihvYik7Ci0JCXN0Z2RpY3QtPmVycmNoZWNrID0gb2I7Ci0JfQorICAgIG9iID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoKFB5T2JqZWN0ICopc3RnZGljdCwgIl9lcnJjaGVja18iKTsKKyAgICBpZiAob2IpIHsKKyAgICAgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKG9iKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiX2VycmNoZWNrXyBtdXN0IGJlIGNhbGxhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG9iKTsKKyAgICAgICAgc3RnZGljdC0+ZXJyY2hlY2sgPSBvYjsKKyAgICB9CiAqLwotCXJldHVybiAwOworICAgIHJldHVybiAwOwogCiAgIGVycm9yOgotCVB5X1hERUNSRUYoY29udmVydGVycyk7Ci0JcmV0dXJuIC0xOworICAgIFB5X1hERUNSRUYoY29udmVydGVycyk7CisgICAgcmV0dXJuIC0xOwogCiB9CiAKIHN0YXRpYyBQeUNBcmdPYmplY3QgKgogQ0Z1bmNQdHJUeXBlX3BhcmFtZnVuYyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JCi0JcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7Ci0JaWYgKHBhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JcGFyZy0+dGFnID0gJ1AnOwotCXBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlwYXJnLT5vYmogPSAoUHlPYmplY3QgKilzZWxmOwotCXBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopc2VsZi0+Yl9wdHI7Ci0JcmV0dXJuIHBhcmc7CQorICAgIFB5Q0FyZ09iamVjdCAqcGFyZzsKKworICAgIHBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOworICAgIGlmIChwYXJnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcGFyZy0+dGFnID0gJ1AnOworICAgIHBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICBwYXJnLT5vYmogPSAoUHlPYmplY3QgKilzZWxmOworICAgIHBhcmctPnZhbHVlLnAgPSAqKHZvaWQgKiopc2VsZi0+Yl9wdHI7CisgICAgcmV0dXJuIHBhcmc7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0clR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5VHlwZU9iamVjdCAqcmVzdWx0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICpyZXN1bHQ7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAotCXN0Z2RpY3QgPSAoU3RnRGljdE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoCi0JCShQeU9iamVjdCAqKSZTdGdEaWN0X1R5cGUsIE5VTEwpOwotCWlmICghc3RnZGljdCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKKyAgICAgICAgKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7CisgICAgaWYgKCFzdGdkaWN0KQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0Z2RpY3QtPnBhcmFtZnVuYyA9IENGdW5jUHRyVHlwZV9wYXJhbWZ1bmM7Ci0JLyogV2UgZG8gTk9UIGV4cG9zZSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgSXQKLQkgICBpcyBpbXBvc3NpYmxlLCBnZW5lcmFsbHksIGJlY2F1c2UgdGhlIG9ubHkgcmVxdWlyZW1lbnQgZm9yIHRoZQotCSAgIGFyZ3R5cGVzIGl0ZW1zIGlzIHRoYXQgdGhleSBoYXZlIGEgLmZyb21fcGFyYW0gbWV0aG9kIC0gd2UgZG8gbm90Ci0JICAga25vdyB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyAoYWx0aG91Z2gsIGluIHByYWN0aWNlLCBtb3N0Ci0JICAgYXJndHlwZXMgd291bGQgYmUgYSBjdHlwZXMgdHlwZSkuCi0JKi8KLQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKE5VTEwsICJYe30iKTsKLQlzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19JU1BPSU5URVI7CisgICAgc3RnZGljdC0+cGFyYW1mdW5jID0gQ0Z1bmNQdHJUeXBlX3BhcmFtZnVuYzsKKyAgICAvKiBXZSBkbyBOT1QgZXhwb3NlIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgaW4gdGhlIGZvcm1hdCBzdHJpbmcuICBJdAorICAgICAgIGlzIGltcG9zc2libGUsIGdlbmVyYWxseSwgYmVjYXVzZSB0aGUgb25seSByZXF1aXJlbWVudCBmb3IgdGhlCisgICAgICAgYXJndHlwZXMgaXRlbXMgaXMgdGhhdCB0aGV5IGhhdmUgYSAuZnJvbV9wYXJhbSBtZXRob2QgLSB3ZSBkbyBub3QKKyAgICAgICBrbm93IHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIChhbHRob3VnaCwgaW4gcHJhY3RpY2UsIG1vc3QKKyAgICAgICBhcmd0eXBlcyB3b3VsZCBiZSBhIGN0eXBlcyB0eXBlKS4KKyAgICAqLworICAgIHN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoTlVMTCwgIlh7fSIpOworICAgIHN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0lTUE9JTlRFUjsKIAotCS8qIGNyZWF0ZSB0aGUgbmV3IGluc3RhbmNlICh3aGljaCBpcyBhIGNsYXNzLAotCSAgIHNpbmNlIHdlIGFyZSBhIG1ldGF0eXBlISkgKi8KLQlyZXN1bHQgPSAoUHlUeXBlT2JqZWN0ICopUHlUeXBlX1R5cGUudHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBjcmVhdGUgdGhlIG5ldyBpbnN0YW5jZSAod2hpY2ggaXMgYSBjbGFzcywKKyAgICAgICBzaW5jZSB3ZSBhcmUgYSBtZXRhdHlwZSEpICovCisgICAgcmVzdWx0ID0gKFB5VHlwZU9iamVjdCAqKVB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKChQeU9iamVjdCAqKXN0Z2RpY3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiByZXBsYWNlIHRoZSBjbGFzcyBkaWN0IGJ5IG91ciB1cGRhdGVkIHN0b3JhZ2UgZGljdCAqLwotCWlmICgtMSA9PSBQeURpY3RfVXBkYXRlKChQeU9iamVjdCAqKXN0Z2RpY3QsIHJlc3VsdC0+dHBfZGljdCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzdGdkaWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQtPnRwX2RpY3QpOwotCXJlc3VsdC0+dHBfZGljdCA9IChQeU9iamVjdCAqKXN0Z2RpY3Q7CisgICAgLyogcmVwbGFjZSB0aGUgY2xhc3MgZGljdCBieSBvdXIgdXBkYXRlZCBzdG9yYWdlIGRpY3QgKi8KKyAgICBpZiAoLTEgPT0gUHlEaWN0X1VwZGF0ZSgoUHlPYmplY3QgKilzdGdkaWN0LCByZXN1bHQtPnRwX2RpY3QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc3RnZGljdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0LT50cF9kaWN0KTsKKyAgICByZXN1bHQtPnRwX2RpY3QgPSAoUHlPYmplY3QgKilzdGdkaWN0OwogCi0JaWYgKC0xID09IG1ha2VfZnVuY3B0cnR5cGVfZGljdChzdGdkaWN0KSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgtMSA9PSBtYWtlX2Z1bmNwdHJ0eXBlX2RpY3Qoc3RnZGljdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogUHlUeXBlT2JqZWN0IENGdW5jUHRyVHlwZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLkNGdW5jUHRyVHlwZSIsCQkJLyogdHBfbmFtZSAqLwotCTAsCQkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJICAgICAgIAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCSJtZXRhdHlwZSBmb3IgQyBmdW5jdGlvbiBwb2ludGVycyIsCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhVHlwZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlDRGF0YVR5cGVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCUNGdW5jUHRyVHlwZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5DRnVuY1B0clR5cGUiLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmQ0RhdGFUeXBlX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAibWV0YXR5cGUgZm9yIEMgZnVuY3Rpb24gcG9pbnRlcnMiLCAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFUeXBlX3RyYXZlcnNlLCAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YVR5cGVfY2xlYXIsICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgQ0RhdGFUeXBlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIENGdW5jUHRyVHlwZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQ29kZSB0byBrZWVwIG5lZWRlZCBvYmplY3RzIGFsaXZlCiAgKi8KQEAgLTIzNjcsNTQgKzIzNjcsNTQgQEAKIHN0YXRpYyBDRGF0YU9iamVjdCAqCiBDRGF0YV9HZXRDb250YWluZXIoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0Jd2hpbGUgKHNlbGYtPmJfYmFzZSkKLQkJc2VsZiA9IHNlbGYtPmJfYmFzZTsKLQlpZiAoc2VsZi0+Yl9vYmplY3RzID09IE5VTEwpIHsKLQkJaWYgKHNlbGYtPmJfbGVuZ3RoKSB7Ci0JCQlzZWxmLT5iX29iamVjdHMgPSBQeURpY3RfTmV3KCk7Ci0JCX0gZWxzZSB7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlzZWxmLT5iX29iamVjdHMgPSBQeV9Ob25lOwotCQl9Ci0JfQotCXJldHVybiBzZWxmOworICAgIHdoaWxlIChzZWxmLT5iX2Jhc2UpCisgICAgICAgIHNlbGYgPSBzZWxmLT5iX2Jhc2U7CisgICAgaWYgKHNlbGYtPmJfb2JqZWN0cyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChzZWxmLT5iX2xlbmd0aCkgeworICAgICAgICAgICAgc2VsZi0+Yl9vYmplY3RzID0gUHlEaWN0X05ldygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgc2VsZi0+Yl9vYmplY3RzID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEdldEtlZXBlZE9iamVjdHMoQ0RhdGFPYmplY3QgKnRhcmdldCkKIHsKLQlyZXR1cm4gQ0RhdGFfR2V0Q29udGFpbmVyKHRhcmdldCktPmJfb2JqZWN0czsKKyAgICByZXR1cm4gQ0RhdGFfR2V0Q29udGFpbmVyKHRhcmdldCktPmJfb2JqZWN0czsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHVuaXF1ZV9rZXkoQ0RhdGFPYmplY3QgKnRhcmdldCwgUHlfc3NpemVfdCBpbmRleCkKIHsKLQljaGFyIHN0cmluZ1syNTZdOwotCWNoYXIgKmNwID0gc3RyaW5nOwotCXNpemVfdCBieXRlc19sZWZ0OworICAgIGNoYXIgc3RyaW5nWzI1Nl07CisgICAgY2hhciAqY3AgPSBzdHJpbmc7CisgICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CiAKLQlhc3NlcnQoc2l6ZW9mKHN0cmluZykgLSAxID4gc2l6ZW9mKFB5X3NzaXplX3QpICogMik7CisgICAgYXNzZXJ0KHNpemVvZihzdHJpbmcpIC0gMSA+IHNpemVvZihQeV9zc2l6ZV90KSAqIDIpOwogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JY3AgKz0gc3ByaW50ZihjcCwgIiV4IiwgaW5kZXgpOworICAgIGNwICs9IHNwcmludGYoY3AsICIleCIsIGluZGV4KTsKICNlbHNlCi0JY3AgKz0gc3ByaW50ZihjcCwgIiV4IiwgUHlfU0FGRV9ET1dOQ0FTVChpbmRleCwgUHlfc3NpemVfdCwgaW50KSk7CisgICAgY3AgKz0gc3ByaW50ZihjcCwgIiV4IiwgUHlfU0FGRV9ET1dOQ0FTVChpbmRleCwgUHlfc3NpemVfdCwgaW50KSk7CiAjZW5kaWYKLQl3aGlsZSAodGFyZ2V0LT5iX2Jhc2UpIHsKLQkJYnl0ZXNfbGVmdCA9IHNpemVvZihzdHJpbmcpIC0gKGNwIC0gc3RyaW5nKSAtIDE7Ci0JCS8qIEhleCBmb3JtYXQgbmVlZHMgMiBjaGFyYWN0ZXJzIHBlciBieXRlICovCi0JCWlmIChieXRlc19sZWZ0IDwgc2l6ZW9mKFB5X3NzaXplX3QpICogMikgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJjdHlwZXMgb2JqZWN0IHN0cnVjdHVyZSB0b28gZGVlcCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICB3aGlsZSAodGFyZ2V0LT5iX2Jhc2UpIHsKKyAgICAgICAgYnl0ZXNfbGVmdCA9IHNpemVvZihzdHJpbmcpIC0gKGNwIC0gc3RyaW5nKSAtIDE7CisgICAgICAgIC8qIEhleCBmb3JtYXQgbmVlZHMgMiBjaGFyYWN0ZXJzIHBlciBieXRlICovCisgICAgICAgIGlmIChieXRlc19sZWZ0IDwgc2l6ZW9mKFB5X3NzaXplX3QpICogMikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImN0eXBlcyBvYmplY3Qgc3RydWN0dXJlIHRvbyBkZWVwIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCWNwICs9IHNwcmludGYoY3AsICI6JXgiLCAoaW50KXRhcmdldC0+Yl9pbmRleCk7CisgICAgICAgIGNwICs9IHNwcmludGYoY3AsICI6JXgiLCAoaW50KXRhcmdldC0+Yl9pbmRleCk7CiAjZWxzZQotCQljcCArPSBzcHJpbnRmKGNwLCAiOiV4IiwgUHlfU0FGRV9ET1dOQ0FTVCh0YXJnZXQtPmJfaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOworICAgICAgICBjcCArPSBzcHJpbnRmKGNwLCAiOiV4IiwgUHlfU0FGRV9ET1dOQ0FTVCh0YXJnZXQtPmJfaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOwogI2VuZGlmCi0JCXRhcmdldCA9IHRhcmdldC0+Yl9iYXNlOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyaW5nLCBjcC1zdHJpbmcpOworICAgICAgICB0YXJnZXQgPSB0YXJnZXQtPmJfYmFzZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0cmluZywgY3Atc3RyaW5nKTsKIH0KIAogLyoKQEAgLTI0MzgsMzAgKzI0MzgsMzAgQEAKIHN0YXRpYyBpbnQKIEtlZXBSZWYoQ0RhdGFPYmplY3QgKnRhcmdldCwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKmtlZXApCiB7Ci0JaW50IHJlc3VsdDsKLQlDRGF0YU9iamVjdCAqb2I7Ci0JUHlPYmplY3QgKmtleTsKKyAgICBpbnQgcmVzdWx0OworICAgIENEYXRhT2JqZWN0ICpvYjsKKyAgICBQeU9iamVjdCAqa2V5OwogCiAvKiBPcHRpbWl6YXRpb246IG5vIG5lZWQgdG8gc3RvcmUgTm9uZSAqLwotCWlmIChrZWVwID09IFB5X05vbmUpIHsKLQkJUHlfREVDUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jb2IgPSBDRGF0YV9HZXRDb250YWluZXIodGFyZ2V0KTsKLQlpZiAob2ItPmJfb2JqZWN0cyA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2tFeGFjdChvYi0+Yl9vYmplY3RzKSkgewotCQlQeV9YREVDUkVGKG9iLT5iX29iamVjdHMpOwotCQlvYi0+Yl9vYmplY3RzID0ga2VlcDsgLyogcmVmY291bnQgY29uc3VtZWQgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCWtleSA9IHVuaXF1ZV9rZXkodGFyZ2V0LCBpbmRleCk7Ci0JaWYgKGtleSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihrZWVwKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXN1bHQgPSBQeURpY3RfU2V0SXRlbShvYi0+Yl9vYmplY3RzLCBrZXksIGtlZXApOwotCVB5X0RFQ1JFRihrZXkpOwotCVB5X0RFQ1JFRihrZWVwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChrZWVwID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2IgPSBDRGF0YV9HZXRDb250YWluZXIodGFyZ2V0KTsKKyAgICBpZiAob2ItPmJfb2JqZWN0cyA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2tFeGFjdChvYi0+Yl9vYmplY3RzKSkgeworICAgICAgICBQeV9YREVDUkVGKG9iLT5iX29iamVjdHMpOworICAgICAgICBvYi0+Yl9vYmplY3RzID0ga2VlcDsgLyogcmVmY291bnQgY29uc3VtZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGtleSA9IHVuaXF1ZV9rZXkodGFyZ2V0LCBpbmRleCk7CisgICAgaWYgKGtleSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihrZWVwKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXN1bHQgPSBQeURpY3RfU2V0SXRlbShvYi0+Yl9vYmplY3RzLCBrZXksIGtlZXApOworICAgIFB5X0RFQ1JFRihrZXkpOworICAgIFB5X0RFQ1JFRihrZWVwKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQ3MSwxMDAgKzI0NzEsMTAwIEBACiBzdGF0aWMgaW50CiBDRGF0YV90cmF2ZXJzZShDRGF0YU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoc2VsZi0+Yl9vYmplY3RzKTsKLQlQeV9WSVNJVCgoUHlPYmplY3QgKilzZWxmLT5iX2Jhc2UpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNlbGYtPmJfb2JqZWN0cyk7CisgICAgUHlfVklTSVQoKFB5T2JqZWN0ICopc2VsZi0+Yl9iYXNlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogQ0RhdGFfY2xlYXIoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCi0JUHlfQ0xFQVIoc2VsZi0+Yl9vYmplY3RzKTsKLQlpZiAoKHNlbGYtPmJfbmVlZHNmcmVlKQotCSAgICAmJiAoKHNpemVfdClkaWN0LT5zaXplID4gc2l6ZW9mKHNlbGYtPmJfdmFsdWUpKSkKLQkJUHlNZW1fRnJlZShzZWxmLT5iX3B0cik7Ci0Jc2VsZi0+Yl9wdHIgPSBOVUxMOwotCVB5X0NMRUFSKHNlbGYtPmJfYmFzZSk7Ci0JcmV0dXJuIDA7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCisgICAgUHlfQ0xFQVIoc2VsZi0+Yl9vYmplY3RzKTsKKyAgICBpZiAoKHNlbGYtPmJfbmVlZHNmcmVlKQorICAgICAgICAmJiAoKHNpemVfdClkaWN0LT5zaXplID4gc2l6ZW9mKHNlbGYtPmJfdmFsdWUpKSkKKyAgICAgICAgUHlNZW1fRnJlZShzZWxmLT5iX3B0cik7CisgICAgc2VsZi0+Yl9wdHIgPSBOVUxMOworICAgIFB5X0NMRUFSKHNlbGYtPmJfYmFzZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBDRGF0YV9kZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCUNEYXRhX2NsZWFyKChDRGF0YU9iamVjdCAqKXNlbGYpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CisgICAgQ0RhdGFfY2xlYXIoKENEYXRhT2JqZWN0ICopc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5TWVtYmVyRGVmIENEYXRhX21lbWJlcnNbXSA9IHsKLQl7ICJfYl9iYXNlXyIsIFRfT0JKRUNULAotCSAgb2Zmc2V0b2YoQ0RhdGFPYmplY3QsIGJfYmFzZSksIFJFQURPTkxZLAotCSAgInRoZSBiYXNlIG9iamVjdCIgfSwKLQl7ICJfYl9uZWVkc2ZyZWVfIiwgVF9JTlQsCi0JICBvZmZzZXRvZihDRGF0YU9iamVjdCwgYl9uZWVkc2ZyZWUpLCBSRUFET05MWSwKLQkgICJ3aGV0aGVyIHRoZSBvYmplY3Qgb3ducyB0aGUgbWVtb3J5IG9yIG5vdCIgfSwKLQl7ICJfb2JqZWN0cyIsIFRfT0JKRUNULAotCSAgb2Zmc2V0b2YoQ0RhdGFPYmplY3QsIGJfb2JqZWN0cyksIFJFQURPTkxZLAotCSAgImludGVybmFsIG9iamVjdHMgdHJlZSAoTkVWRVIgQ0hBTkdFIFRISVMgT0JKRUNUISkifSwKLQl7IE5VTEwgfSwKKyAgICB7ICJfYl9iYXNlXyIsIFRfT0JKRUNULAorICAgICAgb2Zmc2V0b2YoQ0RhdGFPYmplY3QsIGJfYmFzZSksIFJFQURPTkxZLAorICAgICAgInRoZSBiYXNlIG9iamVjdCIgfSwKKyAgICB7ICJfYl9uZWVkc2ZyZWVfIiwgVF9JTlQsCisgICAgICBvZmZzZXRvZihDRGF0YU9iamVjdCwgYl9uZWVkc2ZyZWUpLCBSRUFET05MWSwKKyAgICAgICJ3aGV0aGVyIHRoZSBvYmplY3Qgb3ducyB0aGUgbWVtb3J5IG9yIG5vdCIgfSwKKyAgICB7ICJfb2JqZWN0cyIsIFRfT0JKRUNULAorICAgICAgb2Zmc2V0b2YoQ0RhdGFPYmplY3QsIGJfb2JqZWN0cyksIFJFQURPTkxZLAorICAgICAgImludGVybmFsIG9iamVjdHMgdHJlZSAoTkVWRVIgQ0hBTkdFIFRISVMgT0JKRUNUISkifSwKKyAgICB7IE5VTEwgfSwKIH07CiAKICNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA2MDAwMCkKIHN0YXRpYyBpbnQgQ0RhdGFfTmV3R2V0QnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlfYnVmZmVyICp2aWV3LCBpbnQgZmxhZ3MpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChfc2VsZik7Ci0JUHlfc3NpemVfdCBpOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoX3NlbGYpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmICh2aWV3ID09IE5VTEwpIHJldHVybiAwOworICAgIGlmICh2aWV3ID09IE5VTEwpIHJldHVybiAwOwogCi0Jdmlldy0+YnVmID0gc2VsZi0+Yl9wdHI7Ci0Jdmlldy0+b2JqID0gX3NlbGY7Ci0JUHlfSU5DUkVGKF9zZWxmKTsKLQl2aWV3LT5sZW4gPSBzZWxmLT5iX3NpemU7Ci0Jdmlldy0+cmVhZG9ubHkgPSAwOwotCS8qIHVzZSBkZWZhdWx0IGZvcm1hdCBjaGFyYWN0ZXIgaWYgbm90IHNldCAqLwotCXZpZXctPmZvcm1hdCA9IGRpY3QtPmZvcm1hdCA/IGRpY3QtPmZvcm1hdCA6ICJCIjsKLQl2aWV3LT5uZGltID0gZGljdC0+bmRpbTsKLQl2aWV3LT5zaGFwZSA9IGRpY3QtPnNoYXBlOwotCXZpZXctPml0ZW1zaXplID0gc2VsZi0+Yl9zaXplOwotCWZvciAoaSA9IDA7IGkgPCB2aWV3LT5uZGltOyArK2kpIHsKLQkJdmlldy0+aXRlbXNpemUgLz0gZGljdC0+c2hhcGVbaV07Ci0JfQotCXZpZXctPnN0cmlkZXMgPSBOVUxMOwotCXZpZXctPnN1Ym9mZnNldHMgPSBOVUxMOwotCXZpZXctPmludGVybmFsID0gTlVMTDsKLQlyZXR1cm4gMDsKKyAgICB2aWV3LT5idWYgPSBzZWxmLT5iX3B0cjsKKyAgICB2aWV3LT5vYmogPSBfc2VsZjsKKyAgICBQeV9JTkNSRUYoX3NlbGYpOworICAgIHZpZXctPmxlbiA9IHNlbGYtPmJfc2l6ZTsKKyAgICB2aWV3LT5yZWFkb25seSA9IDA7CisgICAgLyogdXNlIGRlZmF1bHQgZm9ybWF0IGNoYXJhY3RlciBpZiBub3Qgc2V0ICovCisgICAgdmlldy0+Zm9ybWF0ID0gZGljdC0+Zm9ybWF0ID8gZGljdC0+Zm9ybWF0IDogIkIiOworICAgIHZpZXctPm5kaW0gPSBkaWN0LT5uZGltOworICAgIHZpZXctPnNoYXBlID0gZGljdC0+c2hhcGU7CisgICAgdmlldy0+aXRlbXNpemUgPSBzZWxmLT5iX3NpemU7CisgICAgZm9yIChpID0gMDsgaSA8IHZpZXctPm5kaW07ICsraSkgeworICAgICAgICB2aWV3LT5pdGVtc2l6ZSAvPSBkaWN0LT5zaGFwZVtpXTsKKyAgICB9CisgICAgdmlldy0+c3RyaWRlcyA9IE5VTEw7CisgICAgdmlldy0+c3Vib2Zmc2V0cyA9IE5VTEw7CisgICAgdmlldy0+aW50ZXJuYWwgPSBOVUxMOworICAgIHJldHVybiAwOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeV9zc2l6ZV90IENEYXRhX0dldFNlZ2NvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCAqbGVucCkKIHsKLQlpZiAobGVucCkKLQkJKmxlbnAgPSAxOwotCXJldHVybiAxOworICAgIGlmIChsZW5wKQorICAgICAgICAqbGVucCA9IDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90IENEYXRhX0dldEJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3Qgc2VnLCB2b2lkICoqcHB0cikKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwotCWlmIChzZWcgIT0gMCkgewotCQkvKiBIbS4gTXVzdCB0aGlzIHNldCBhbiBleGNlcHRpb24/ICovCi0JCXJldHVybiAtMTsKLQl9Ci0JKnBwdHIgPSBzZWxmLT5iX3B0cjsKLQlyZXR1cm4gc2VsZi0+Yl9zaXplOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgaWYgKHNlZyAhPSAwKSB7CisgICAgICAgIC8qIEhtLiBNdXN0IHRoaXMgc2V0IGFuIGV4Y2VwdGlvbj8gKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHB0ciA9IHNlbGYtPmJfcHRyOworICAgIHJldHVybiBzZWxmLT5iX3NpemU7CiB9CiAKIHN0YXRpYyBQeUJ1ZmZlclByb2NzIENEYXRhX2FzX2J1ZmZlciA9IHsKLQkocmVhZGJ1ZmZlcnByb2MpQ0RhdGFfR2V0QnVmZmVyLAotCSh3cml0ZWJ1ZmZlcnByb2MpQ0RhdGFfR2V0QnVmZmVyLAotCShzZWdjb3VudHByb2MpQ0RhdGFfR2V0U2VnY291bnQsCi0JKGNoYXJidWZmZXJwcm9jKU5VTEwsCisgICAgKHJlYWRidWZmZXJwcm9jKUNEYXRhX0dldEJ1ZmZlciwKKyAgICAod3JpdGVidWZmZXJwcm9jKUNEYXRhX0dldEJ1ZmZlciwKKyAgICAoc2VnY291bnRwcm9jKUNEYXRhX0dldFNlZ2NvdW50LAorICAgIChjaGFyYnVmZmVycHJvYylOVUxMLAogI2lmIChQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDYwMDAwKQotCShnZXRidWZmZXJwcm9jKUNEYXRhX05ld0dldEJ1ZmZlciwKLQkocmVsZWFzZWJ1ZmZlcnByb2MpTlVMTCwKKyAgICAoZ2V0YnVmZmVycHJvYylDRGF0YV9OZXdHZXRCdWZmZXIsCisgICAgKHJlbGVhc2VidWZmZXJwcm9jKU5VTEwsCiAjZW5kaWYKIH07CiAKQEAgLTI1NzQsNDcgKzI1NzQsNDcgQEAKIHN0YXRpYyBsb25nCiBDRGF0YV9ub2hhc2goUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZSIpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSB0eXBlIik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFfcmVkdWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwogCi0JaWYgKFB5T2JqZWN0X3N0Z2RpY3QoX3NlbGYpLT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVJ8VFlQRUZMQUdfSEFTUE9JTlRFUikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImN0eXBlcyBvYmplY3RzIGNvbnRhaW5pbmcgcG9pbnRlcnMgY2Fubm90IGJlIHBpY2tsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE8oTk4pKSIsCi0JCQkgICAgIF91bnBpY2tsZSwKLQkJCSAgICAgUHlfVFlQRShfc2VsZiksCi0JCQkgICAgIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoX3NlbGYsICJfX2RpY3RfXyIpLAotCQkJICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKSk7CisgICAgaWYgKFB5T2JqZWN0X3N0Z2RpY3QoX3NlbGYpLT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVJ8VFlQRUZMQUdfSEFTUE9JTlRFUikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY3R5cGVzIG9iamVjdHMgY29udGFpbmluZyBwb2ludGVycyBjYW5ub3QgYmUgcGlja2xlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oTyhOTikpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfdW5waWNrbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShfc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfR2V0QXR0clN0cmluZyhfc2VsZiwgIl9fZGljdF9fIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+Yl9wdHIsIHNlbGYtPmJfc2l6ZSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFfc2V0c3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl2b2lkICpkYXRhOwotCVB5X3NzaXplX3QgbGVuOwotCWludCByZXM7Ci0JUHlPYmplY3QgKmRpY3QsICpteWRpY3Q7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zIyIsICZkaWN0LCAmZGF0YSwgJmxlbikpCi0JCXJldHVybiBOVUxMOwotCWlmIChsZW4gPiBzZWxmLT5iX3NpemUpCi0JCWxlbiA9IHNlbGYtPmJfc2l6ZTsKLQltZW1tb3ZlKHNlbGYtPmJfcHRyLCBkYXRhLCBsZW4pOwotCW15ZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoX3NlbGYsICJfX2RpY3RfXyIpOwotCXJlcyA9IFB5RGljdF9VcGRhdGUobXlkaWN0LCBkaWN0KTsKLQlQeV9ERUNSRUYobXlkaWN0KTsKLQlpZiAocmVzID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgdm9pZCAqZGF0YTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpbnQgcmVzOworICAgIFB5T2JqZWN0ICpkaWN0LCAqbXlkaWN0OworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPcyMiLCAmZGljdCwgJmRhdGEsICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobGVuID4gc2VsZi0+Yl9zaXplKQorICAgICAgICBsZW4gPSBzZWxmLT5iX3NpemU7CisgICAgbWVtbW92ZShzZWxmLT5iX3B0ciwgZGF0YSwgbGVuKTsKKyAgICBteWRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKF9zZWxmLCAiX19kaWN0X18iKTsKKyAgICByZXMgPSBQeURpY3RfVXBkYXRlKG15ZGljdCwgZGljdCk7CisgICAgUHlfREVDUkVGKG15ZGljdCk7CisgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKgpAQCAtMjYyMywxMjQgKzI2MjMsMTI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0RhdGFfZnJvbV9vdXRwYXJhbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiBzZWxmOworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENEYXRhX21ldGhvZHNbXSA9IHsKLQl7ICJfX2N0eXBlc19mcm9tX291dHBhcmFtX18iLCBDRGF0YV9mcm9tX291dHBhcmFtLCBNRVRIX05PQVJHUywgfSwKLQl7ICJfX3JlZHVjZV9fIiwgQ0RhdGFfcmVkdWNlLCBNRVRIX05PQVJHUywgfSwKLQl7ICJfX3NldHN0YXRlX18iLCBDRGF0YV9zZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLCB9LAotCXsgTlVMTCwgTlVMTCB9LAorICAgIHsgIl9fY3R5cGVzX2Zyb21fb3V0cGFyYW1fXyIsIENEYXRhX2Zyb21fb3V0cGFyYW0sIE1FVEhfTk9BUkdTLCB9LAorICAgIHsgIl9fcmVkdWNlX18iLCBDRGF0YV9yZWR1Y2UsIE1FVEhfTk9BUkdTLCB9LAorICAgIHsgIl9fc2V0c3RhdGVfXyIsIENEYXRhX3NldHN0YXRlLCBNRVRIX1ZBUkFSR1MsIH0sCisgICAgeyBOVUxMLCBOVUxMIH0sCiB9OwogCiBQeVR5cGVPYmplY3QgQ0RhdGFfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5fQ0RhdGEiLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JQ0RhdGFfZGVhbGxvYywJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JQ0RhdGFfbm9oYXNoLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJkNEYXRhX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkiWFhYIHRvIGJlIHByb3ZpZGVkIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKUNEYXRhX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlDRGF0YV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JQ0RhdGFfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCUNEYXRhX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLl9DRGF0YSIsCisgICAgc2l6ZW9mKENEYXRhT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgQ0RhdGFfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIENEYXRhX25vaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAmQ0RhdGFfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgICJYWFggdG8gYmUgcHJvdmlkZWQiLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylDRGF0YV90cmF2ZXJzZSwgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KUNEYXRhX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBDRGF0YV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBDRGF0YV9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIHN0YXRpYyBpbnQgQ0RhdGFfTWFsbG9jQnVmZmVyKENEYXRhT2JqZWN0ICpvYmosIFN0Z0RpY3RPYmplY3QgKmRpY3QpCiB7Ci0JaWYgKChzaXplX3QpZGljdC0+c2l6ZSA8PSBzaXplb2Yob2JqLT5iX3ZhbHVlKSkgewotCQkvKiBObyBuZWVkIHRvIGNhbGwgbWFsbG9jLCBjYW4gdXNlIHRoZSBkZWZhdWx0IGJ1ZmZlciAqLwotCQlvYmotPmJfcHRyID0gKGNoYXIgKikmb2JqLT5iX3ZhbHVlOwotCQkvKiBUaGUgYl9uZWVkc2ZyZWUgZmxhZyBkb2VzIG5vdCBtZWFuIHRoYXQgd2UgYWN0dWFsbHkgZGlkCi0JCSAgIGNhbGwgUHlNZW1fTWFsbG9jIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgYmxvY2s7IGluc3RlYWQgaXQKLQkJICAgbWVhbnMgd2UgYXJlIHRoZSAqb3duZXIqIG9mIHRoZSBtZW1vcnkgYW5kIGFyZSByZXNwb25zaWJsZQotCQkgICBmb3IgZnJlZWluZyByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1vcnkuICBUaGlzIGlzCi0JCSAgIGFsc28gdGhlIHJlYXNvbiB0aGF0IGJfbmVlZHNmcmVlIGlzIGV4cG9zZWQgdG8gUHl0aG9uLgotCQkgKi8KLQkJb2JqLT5iX25lZWRzZnJlZSA9IDE7Ci0JfSBlbHNlIHsKLQkJLyogSW4gcHl0aG9uIDIuNCwgYW5kIGN0eXBlcyAwLjkuNiwgdGhlIG1hbGxvYyBjYWxsIHRvb2sgYWJvdXQKLQkJICAgMzMlIG9mIHRoZSBjcmVhdGlvbiB0aW1lIGZvciBjX2ludCgpLgotCQkqLwotCQlvYmotPmJfcHRyID0gKGNoYXIgKilQeU1lbV9NYWxsb2MoZGljdC0+c2l6ZSk7Ci0JCWlmIChvYmotPmJfcHRyID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJb2JqLT5iX25lZWRzZnJlZSA9IDE7Ci0JCW1lbXNldChvYmotPmJfcHRyLCAwLCBkaWN0LT5zaXplKTsKLQl9Ci0Jb2JqLT5iX3NpemUgPSBkaWN0LT5zaXplOwotCXJldHVybiAwOworICAgIGlmICgoc2l6ZV90KWRpY3QtPnNpemUgPD0gc2l6ZW9mKG9iai0+Yl92YWx1ZSkpIHsKKyAgICAgICAgLyogTm8gbmVlZCB0byBjYWxsIG1hbGxvYywgY2FuIHVzZSB0aGUgZGVmYXVsdCBidWZmZXIgKi8KKyAgICAgICAgb2JqLT5iX3B0ciA9IChjaGFyICopJm9iai0+Yl92YWx1ZTsKKyAgICAgICAgLyogVGhlIGJfbmVlZHNmcmVlIGZsYWcgZG9lcyBub3QgbWVhbiB0aGF0IHdlIGFjdHVhbGx5IGRpZAorICAgICAgICAgICBjYWxsIFB5TWVtX01hbGxvYyB0byBhbGxvY2F0ZSB0aGUgbWVtb3J5IGJsb2NrOyBpbnN0ZWFkIGl0CisgICAgICAgICAgIG1lYW5zIHdlIGFyZSB0aGUgKm93bmVyKiBvZiB0aGUgbWVtb3J5IGFuZCBhcmUgcmVzcG9uc2libGUKKyAgICAgICAgICAgZm9yIGZyZWVpbmcgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVtb3J5LiAgVGhpcyBpcworICAgICAgICAgICBhbHNvIHRoZSByZWFzb24gdGhhdCBiX25lZWRzZnJlZSBpcyBleHBvc2VkIHRvIFB5dGhvbi4KKyAgICAgICAgICovCisgICAgICAgIG9iai0+Yl9uZWVkc2ZyZWUgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEluIHB5dGhvbiAyLjQsIGFuZCBjdHlwZXMgMC45LjYsIHRoZSBtYWxsb2MgY2FsbCB0b29rIGFib3V0CisgICAgICAgICAgIDMzJSBvZiB0aGUgY3JlYXRpb24gdGltZSBmb3IgY19pbnQoKS4KKyAgICAgICAgKi8KKyAgICAgICAgb2JqLT5iX3B0ciA9IChjaGFyICopUHlNZW1fTWFsbG9jKGRpY3QtPnNpemUpOworICAgICAgICBpZiAob2JqLT5iX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG9iai0+Yl9uZWVkc2ZyZWUgPSAxOworICAgICAgICBtZW1zZXQob2JqLT5iX3B0ciwgMCwgZGljdC0+c2l6ZSk7CisgICAgfQorICAgIG9iai0+Yl9zaXplID0gZGljdC0+c2l6ZTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogQ0RhdGFfRnJvbUJhc2VPYmooUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpiYXNlLCBQeV9zc2l6ZV90IGluZGV4LCBjaGFyICphZHIpCiB7Ci0JQ0RhdGFPYmplY3QgKmNtZW07Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBDRGF0YU9iamVjdCAqY21lbTsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JYXNzZXJ0KFB5VHlwZV9DaGVjayh0eXBlKSk7Ci0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwotCWlmICghZGljdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhYnN0cmFjdCBjbGFzcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7Ci0JY21lbSA9IChDRGF0YU9iamVjdCAqKSgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX2FsbG9jKChQeVR5cGVPYmplY3QgKil0eXBlLCAwKTsKLQlpZiAoY21lbSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soY21lbSkpOworICAgIGFzc2VydChQeVR5cGVfQ2hlY2sodHlwZSkpOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYnN0cmFjdCBjbGFzcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7CisgICAgY21lbSA9IChDRGF0YU9iamVjdCAqKSgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX2FsbG9jKChQeVR5cGVPYmplY3QgKil0eXBlLCAwKTsKKyAgICBpZiAoY21lbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soY21lbSkpOwogCi0JY21lbS0+Yl9sZW5ndGggPSBkaWN0LT5sZW5ndGg7Ci0JY21lbS0+Yl9zaXplID0gZGljdC0+c2l6ZTsKLQlpZiAoYmFzZSkgeyAvKiB1c2UgYmFzZSdzIGJ1ZmZlciAqLwotCQlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soYmFzZSkpOwotCQljbWVtLT5iX3B0ciA9IGFkcjsKLQkJY21lbS0+Yl9uZWVkc2ZyZWUgPSAwOwotCQlQeV9JTkNSRUYoYmFzZSk7Ci0JCWNtZW0tPmJfYmFzZSA9IChDRGF0YU9iamVjdCAqKWJhc2U7Ci0JCWNtZW0tPmJfaW5kZXggPSBpbmRleDsKLQl9IGVsc2UgeyAvKiBjb3B5IGNvbnRlbnRzIG9mIGFkciAqLwotCQlpZiAoLTEgPT0gQ0RhdGFfTWFsbG9jQnVmZmVyKGNtZW0sIGRpY3QpKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJCVB5X0RFQ1JFRihjbWVtKTsKLQkJfQotCQltZW1jcHkoY21lbS0+Yl9wdHIsIGFkciwgZGljdC0+c2l6ZSk7Ci0JCWNtZW0tPmJfaW5kZXggPSBpbmRleDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKWNtZW07CisgICAgY21lbS0+Yl9sZW5ndGggPSBkaWN0LT5sZW5ndGg7CisgICAgY21lbS0+Yl9zaXplID0gZGljdC0+c2l6ZTsKKyAgICBpZiAoYmFzZSkgeyAvKiB1c2UgYmFzZSdzIGJ1ZmZlciAqLworICAgICAgICBhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soYmFzZSkpOworICAgICAgICBjbWVtLT5iX3B0ciA9IGFkcjsKKyAgICAgICAgY21lbS0+Yl9uZWVkc2ZyZWUgPSAwOworICAgICAgICBQeV9JTkNSRUYoYmFzZSk7CisgICAgICAgIGNtZW0tPmJfYmFzZSA9IChDRGF0YU9iamVjdCAqKWJhc2U7CisgICAgICAgIGNtZW0tPmJfaW5kZXggPSBpbmRleDsKKyAgICB9IGVsc2UgeyAvKiBjb3B5IGNvbnRlbnRzIG9mIGFkciAqLworICAgICAgICBpZiAoLTEgPT0gQ0RhdGFfTWFsbG9jQnVmZmVyKGNtZW0sIGRpY3QpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjbWVtKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY21lbS0+Yl9wdHIsIGFkciwgZGljdC0+c2l6ZSk7CisgICAgICAgIGNtZW0tPmJfaW5kZXggPSBpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNtZW07CiB9CiAKIC8qCkBAIC0yNzQ5LDI2ICsyNzQ5LDI2IEBACiBQeU9iamVjdCAqCiBDRGF0YV9BdEFkZHJlc3MoUHlPYmplY3QgKnR5cGUsIHZvaWQgKmJ1ZikKIHsKLQlDRGF0YU9iamVjdCAqcGQ7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBDRGF0YU9iamVjdCAqcGQ7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWFzc2VydChQeVR5cGVfQ2hlY2sodHlwZSkpOwotCWRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKLQlpZiAoIWRpY3QpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYWJzdHJhY3QgY2xhc3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRpY3QtPmZsYWdzIHw9IERJQ1RGTEFHX0ZJTkFMOworICAgIGFzc2VydChQeVR5cGVfQ2hlY2sodHlwZSkpOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYnN0cmFjdCBjbGFzcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7CiAKLQlwZCA9IChDRGF0YU9iamVjdCAqKSgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX2FsbG9jKChQeVR5cGVPYmplY3QgKil0eXBlLCAwKTsKLQlpZiAoIXBkKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2socGQpKTsKLQlwZC0+Yl9wdHIgPSAoY2hhciAqKWJ1ZjsKLQlwZC0+Yl9sZW5ndGggPSBkaWN0LT5sZW5ndGg7Ci0JcGQtPmJfc2l6ZSA9IGRpY3QtPnNpemU7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXBkOworICAgIHBkID0gKENEYXRhT2JqZWN0ICopKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfYWxsb2MoKFB5VHlwZU9iamVjdCAqKXR5cGUsIDApOworICAgIGlmICghcGQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChDRGF0YU9iamVjdF9DaGVjayhwZCkpOworICAgIHBkLT5iX3B0ciA9IChjaGFyICopYnVmOworICAgIHBkLT5iX2xlbmd0aCA9IGRpY3QtPmxlbmd0aDsKKyAgICBwZC0+Yl9zaXplID0gZGljdC0+c2l6ZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcGQ7CiB9CiAKIC8qCkBAIC0yNzc4LDI1ICsyNzc4LDI1IEBACiAqLwogaW50IElzU2ltcGxlU3ViVHlwZShQeU9iamVjdCAqb2JqKQogewotCVB5VHlwZU9iamVjdCAqdHlwZSA9IChQeVR5cGVPYmplY3QgKilvYmo7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gKFB5VHlwZU9iamVjdCAqKW9iajsKIAotCWlmIChTaW1wbGVUeXBlT2JqZWN0X0NoZWNrKHR5cGUpKQotCQlyZXR1cm4gdHlwZS0+dHBfYmFzZSAhPSAmU2ltcGxlX1R5cGU7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFNpbXBsZVR5cGVPYmplY3RfQ2hlY2sodHlwZSkpCisgICAgICAgIHJldHVybiB0eXBlLT50cF9iYXNlICE9ICZTaW1wbGVfVHlwZTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogQ0RhdGFfZ2V0KFB5T2JqZWN0ICp0eXBlLCBHRVRGVU5DIGdldGZ1bmMsIFB5T2JqZWN0ICpzcmMsCi0JICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKmFkcikKKyAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKmFkcikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWlmIChnZXRmdW5jKQotCQlyZXR1cm4gZ2V0ZnVuYyhhZHIsIHNpemUpOwotCWFzc2VydCh0eXBlKTsKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JaWYgKGRpY3QgJiYgZGljdC0+Z2V0ZnVuYyAmJiAhSXNTaW1wbGVTdWJUeXBlKHR5cGUpKQotCQlyZXR1cm4gZGljdC0+Z2V0ZnVuYyhhZHIsIHNpemUpOwotCXJldHVybiBDRGF0YV9Gcm9tQmFzZU9iaih0eXBlLCBzcmMsIGluZGV4LCBhZHIpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgaWYgKGdldGZ1bmMpCisgICAgICAgIHJldHVybiBnZXRmdW5jKGFkciwgc2l6ZSk7CisgICAgYXNzZXJ0KHR5cGUpOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICBpZiAoZGljdCAmJiBkaWN0LT5nZXRmdW5jICYmICFJc1NpbXBsZVN1YlR5cGUodHlwZSkpCisgICAgICAgIHJldHVybiBkaWN0LT5nZXRmdW5jKGFkciwgc2l6ZSk7CisgICAgcmV0dXJuIENEYXRhX0Zyb21CYXNlT2JqKHR5cGUsIHNyYywgaW5kZXgsIGFkcik7CiB9CiAKIC8qCkBAIC0yODA0LDk2ICsyODA0LDk2IEBACiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIF9DRGF0YV9zZXQoQ0RhdGFPYmplY3QgKmRzdCwgUHlPYmplY3QgKnR5cGUsIFNFVEZVTkMgc2V0ZnVuYywgUHlPYmplY3QgKnZhbHVlLAotCSAgIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKQorICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cikKIHsKLQlDRGF0YU9iamVjdCAqc3JjOworICAgIENEYXRhT2JqZWN0ICpzcmM7CiAKLQlpZiAoc2V0ZnVuYykKLQkJcmV0dXJuIHNldGZ1bmMocHRyLCB2YWx1ZSwgc2l6ZSk7Ci0JCi0JaWYgKCFDRGF0YU9iamVjdF9DaGVjayh2YWx1ZSkpIHsKLQkJU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwotCQlpZiAoZGljdCAmJiBkaWN0LT5zZXRmdW5jKQotCQkJcmV0dXJuIGRpY3QtPnNldGZ1bmMocHRyLCB2YWx1ZSwgc2l6ZSk7Ci0JCS8qCi0JCSAgIElmIHZhbHVlIGlzIGEgdHVwbGUsIHdlIHRyeSB0byBjYWxsIHRoZSB0eXBlIHdpdGggdGhlIHR1cGxlCi0JCSAgIGFuZCB1c2UgdGhlIHJlc3VsdCEKLQkJKi8KLQkJYXNzZXJ0KFB5VHlwZV9DaGVjayh0eXBlKSk7Ci0JCWlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgewotCQkJUHlPYmplY3QgKm9iOwotCQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJCW9iID0gUHlPYmplY3RfQ2FsbE9iamVjdCh0eXBlLCB2YWx1ZSk7Ci0JCQlpZiAob2IgPT0gTlVMTCkgewotCQkJCUV4dGVuZF9FcnJvcl9JbmZvKFB5RXhjX1J1bnRpbWVFcnJvciwgIiglcykgIiwKLQkJCQkJCSAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBfQ0RhdGFfc2V0KGRzdCwgdHlwZSwgc2V0ZnVuYywgb2IsCi0JCQkJCSAgICBzaXplLCBwdHIpOwotCQkJUHlfREVDUkVGKG9iKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gZWxzZSBpZiAodmFsdWUgPT0gUHlfTm9uZSAmJiBQb2ludGVyVHlwZU9iamVjdF9DaGVjayh0eXBlKSkgewotCQkJKih2b2lkICoqKXB0ciA9IE5VTEw7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlyZXR1cm4gUHlfTm9uZTsKLQkJfSBlbHNlIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiZXhwZWN0ZWQgJXMgaW5zdGFuY2UsIGdvdCAlcyIsCi0JCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLAotCQkJCSAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0Jc3JjID0gKENEYXRhT2JqZWN0ICopdmFsdWU7CisgICAgaWYgKHNldGZ1bmMpCisgICAgICAgIHJldHVybiBzZXRmdW5jKHB0ciwgdmFsdWUsIHNpemUpOwogCi0JaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UodmFsdWUsIHR5cGUpKSB7Ci0JCW1lbWNweShwdHIsCi0JCSAgICAgICBzcmMtPmJfcHRyLAotCQkgICAgICAgc2l6ZSk7CisgICAgaWYgKCFDRGF0YU9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgICAgICBpZiAoZGljdCAmJiBkaWN0LT5zZXRmdW5jKQorICAgICAgICAgICAgcmV0dXJuIGRpY3QtPnNldGZ1bmMocHRyLCB2YWx1ZSwgc2l6ZSk7CisgICAgICAgIC8qCisgICAgICAgICAgIElmIHZhbHVlIGlzIGEgdHVwbGUsIHdlIHRyeSB0byBjYWxsIHRoZSB0eXBlIHdpdGggdGhlIHR1cGxlCisgICAgICAgICAgIGFuZCB1c2UgdGhlIHJlc3VsdCEKKyAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayh0eXBlKSk7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm9iOworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgICAgIG9iID0gUHlPYmplY3RfQ2FsbE9iamVjdCh0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAob2IgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEV4dGVuZF9FcnJvcl9JbmZvKFB5RXhjX1J1bnRpbWVFcnJvciwgIiglcykgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IF9DRGF0YV9zZXQoZHN0LCB0eXBlLCBzZXRmdW5jLCBvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgcHRyKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvYik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IFB5X05vbmUgJiYgUG9pbnRlclR5cGVPYmplY3RfQ2hlY2sodHlwZSkpIHsKKyAgICAgICAgICAgICoodm9pZCAqKilwdHIgPSBOVUxMOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyBpbnN0YW5jZSwgZ290ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHNyYyA9IChDRGF0YU9iamVjdCAqKXZhbHVlOwogCi0JCWlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayh0eXBlKSkKLQkJCS8qIFhYWCAqLzsKKyAgICBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZSh2YWx1ZSwgdHlwZSkpIHsKKyAgICAgICAgbWVtY3B5KHB0ciwKKyAgICAgICAgICAgICAgIHNyYy0+Yl9wdHIsCisgICAgICAgICAgICAgICBzaXplKTsKIAotCQl2YWx1ZSA9IEdldEtlZXBlZE9iamVjdHMoc3JjKTsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KKyAgICAgICAgaWYgKFBvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKHR5cGUpKQorICAgICAgICAgICAgLyogWFhYICovOwogCi0JaWYgKFBvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKHR5cGUpCi0JICAgICYmIEFycmF5T2JqZWN0X0NoZWNrKHZhbHVlKSkgewotCQlTdGdEaWN0T2JqZWN0ICpwMSwgKnAyOwotCQlQeU9iamVjdCAqa2VlcDsKLQkJcDEgPSBQeU9iamVjdF9zdGdkaWN0KHZhbHVlKTsKLQkJYXNzZXJ0KHAxKTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIGFycmF5IGluc3RhbmNlcyAqLwotCQlwMiA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOwotCQlhc3NlcnQocDIpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciB0eXBlcyAqLworICAgICAgICB2YWx1ZSA9IEdldEtlZXBlZE9iamVjdHMoc3JjKTsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KIAotCQlpZiAocDEtPnByb3RvICE9IHAyLT5wcm90bykgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJpbmNvbXBhdGlibGUgdHlwZXMsICVzIGluc3RhbmNlIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJCSAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUsCi0JCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKXR5cGUpLT50cF9uYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCSoodm9pZCAqKilwdHIgPSBzcmMtPmJfcHRyOworICAgIGlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayh0eXBlKQorICAgICAgICAmJiBBcnJheU9iamVjdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqcDEsICpwMjsKKyAgICAgICAgUHlPYmplY3QgKmtlZXA7CisgICAgICAgIHAxID0gUHlPYmplY3Rfc3RnZGljdCh2YWx1ZSk7CisgICAgICAgIGFzc2VydChwMSk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBpbnN0YW5jZXMgKi8KKyAgICAgICAgcDIgPSBQeVR5cGVfc3RnZGljdCh0eXBlKTsKKyAgICAgICAgYXNzZXJ0KHAyKTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgdHlwZXMgKi8KIAotCQlrZWVwID0gR2V0S2VlcGVkT2JqZWN0cyhzcmMpOwotCQkvKgotCQkgIFdlIGFyZSBhc3NpZ25pbmcgYW4gYXJyYXkgb2JqZWN0IHRvIGEgZmllbGQgd2hpY2ggcmVwcmVzZW50cwotCQkgIGEgcG9pbnRlci4gVGhpcyBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNvbnZlcnRpbmcgYW4gYXJyYXkKLQkJICBpbnRvIGEgcG9pbnRlci4gU28sIGFnYWluLCB3ZSBoYXZlIHRvIGtlZXAgdGhlIHdob2xlIG9iamVjdAotCQkgIHBvaW50ZWQgdG8gKHdoaWNoIGlzIHRoZSBhcnJheSBpbiB0aGlzIGNhc2UpIGFsaXZlLCBhbmQgbm90Ci0JCSAgb25seSBpdCdzIG9iamVjdCBsaXN0LiAgU28gd2UgY3JlYXRlIGEgdHVwbGUsIGNvbnRhaW5pbmcKLQkJICBiX29iamVjdHMgbGlzdCBQTFVTIHRoZSBhcnJheSBpdHNlbGYsIGFuZCByZXR1cm4gdGhhdCEKLQkJKi8KLQkJcmV0dXJuIFB5VHVwbGVfUGFjaygyLCBrZWVwLCB2YWx1ZSk7Ci0JfQotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgImluY29tcGF0aWJsZSB0eXBlcywgJXMgaW5zdGFuY2UgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCSAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUsCi0JCSAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChwMS0+cHJvdG8gIT0gcDItPnByb3RvKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvbXBhdGlibGUgdHlwZXMsICVzIGluc3RhbmNlIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKih2b2lkICoqKXB0ciA9IHNyYy0+Yl9wdHI7CisKKyAgICAgICAga2VlcCA9IEdldEtlZXBlZE9iamVjdHMoc3JjKTsKKyAgICAgICAgLyoKKyAgICAgICAgICBXZSBhcmUgYXNzaWduaW5nIGFuIGFycmF5IG9iamVjdCB0byBhIGZpZWxkIHdoaWNoIHJlcHJlc2VudHMKKyAgICAgICAgICBhIHBvaW50ZXIuIFRoaXMgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjb252ZXJ0aW5nIGFuIGFycmF5CisgICAgICAgICAgaW50byBhIHBvaW50ZXIuIFNvLCBhZ2Fpbiwgd2UgaGF2ZSB0byBrZWVwIHRoZSB3aG9sZSBvYmplY3QKKyAgICAgICAgICBwb2ludGVkIHRvICh3aGljaCBpcyB0aGUgYXJyYXkgaW4gdGhpcyBjYXNlKSBhbGl2ZSwgYW5kIG5vdAorICAgICAgICAgIG9ubHkgaXQncyBvYmplY3QgbGlzdC4gIFNvIHdlIGNyZWF0ZSBhIHR1cGxlLCBjb250YWluaW5nCisgICAgICAgICAgYl9vYmplY3RzIGxpc3QgUExVUyB0aGUgYXJyYXkgaXRzZWxmLCBhbmQgcmV0dXJuIHRoYXQhCisgICAgICAgICovCisgICAgICAgIHJldHVybiBQeVR1cGxlX1BhY2soMiwga2VlcCwgdmFsdWUpOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiaW5jb21wYXRpYmxlIHR5cGVzLCAlcyBpbnN0YW5jZSBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKgpAQCAtMjkwMiw1OCArMjkwMiw1OCBAQAogICovCiBpbnQKIENEYXRhX3NldChQeU9iamVjdCAqZHN0LCBQeU9iamVjdCAqdHlwZSwgU0VURlVOQyBzZXRmdW5jLCBQeU9iamVjdCAqdmFsdWUsCi0JICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cikKKyAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cikKIHsKLQlDRGF0YU9iamVjdCAqbWVtID0gKENEYXRhT2JqZWN0ICopZHN0OwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgQ0RhdGFPYmplY3QgKm1lbSA9IChDRGF0YU9iamVjdCAqKWRzdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFDRGF0YU9iamVjdF9DaGVjayhkc3QpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm5vdCBhIGN0eXBlIGluc3RhbmNlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFDRGF0YU9iamVjdF9DaGVjayhkc3QpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IGEgY3R5cGUgaW5zdGFuY2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJlc3VsdCA9IF9DRGF0YV9zZXQobWVtLCB0eXBlLCBzZXRmdW5jLCB2YWx1ZSwKLQkJCSAgICBzaXplLCBwdHIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHJlc3VsdCA9IF9DRGF0YV9zZXQobWVtLCB0eXBlLCBzZXRmdW5jLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHB0cik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQkvKiBLZWVwUmVmIHN0ZWFscyBhIHJlZmNvdW50IGZyb20gaXQncyBsYXN0IGFyZ3VtZW50ICovCi0JLyogSWYgS2VlcFJlZiBmYWlscywgd2UgYXJlIHN0dW1wZWQuICBUaGUgZHN0IG1lbW9yeSBibG9jayBoYXMgYWxyZWFkeQotCSAgIGJlZW4gY2hhbmdlZCAqLwotCXJldHVybiBLZWVwUmVmKG1lbSwgaW5kZXgsIHJlc3VsdCk7CisgICAgLyogS2VlcFJlZiBzdGVhbHMgYSByZWZjb3VudCBmcm9tIGl0J3MgbGFzdCBhcmd1bWVudCAqLworICAgIC8qIElmIEtlZXBSZWYgZmFpbHMsIHdlIGFyZSBzdHVtcGVkLiAgVGhlIGRzdCBtZW1vcnkgYmxvY2sgaGFzIGFscmVhZHkKKyAgICAgICBiZWVuIGNoYW5nZWQgKi8KKyAgICByZXR1cm4gS2VlcFJlZihtZW0sIGluZGV4LCByZXN1bHQpOwogfQogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgUHlPYmplY3QgKgogR2VuZXJpY0NEYXRhX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlDRGF0YU9iamVjdCAqb2JqOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgQ0RhdGFPYmplY3QgKm9iajsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOwotCWlmICghZGljdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhYnN0cmFjdCBjbGFzcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGljdC0+ZmxhZ3MgfD0gRElDVEZMQUdfRklOQUw7CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOworICAgIGlmICghZGljdCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFic3RyYWN0IGNsYXNzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKIAotCW9iaiA9IChDRGF0YU9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmICghb2JqKQotCQlyZXR1cm4gTlVMTDsKKyAgICBvYmogPSAoQ0RhdGFPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlvYmotPmJfYmFzZSA9IE5VTEw7Ci0Jb2JqLT5iX2luZGV4ID0gMDsKLQlvYmotPmJfb2JqZWN0cyA9IE5VTEw7Ci0Jb2JqLT5iX2xlbmd0aCA9IGRpY3QtPmxlbmd0aDsKLQkJCQotCWlmICgtMSA9PSBDRGF0YV9NYWxsb2NCdWZmZXIob2JqLCBkaWN0KSkgewotCQlQeV9ERUNSRUYob2JqKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilvYmo7CisgICAgb2JqLT5iX2Jhc2UgPSBOVUxMOworICAgIG9iai0+Yl9pbmRleCA9IDA7CisgICAgb2JqLT5iX29iamVjdHMgPSBOVUxMOworICAgIG9iai0+Yl9sZW5ndGggPSBkaWN0LT5sZW5ndGg7CisKKyAgICBpZiAoLTEgPT0gQ0RhdGFfTWFsbG9jQnVmZmVyKG9iaiwgZGljdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb2JqOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKQEAgLTI5NjMsMTY1ICsyOTYzLDE2NSBAQAogc3RhdGljIGludAogQ0Z1bmNQdHJfc2V0X2VycmNoZWNrKENGdW5jUHRyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2IpCiB7Ci0JaWYgKG9iICYmICFQeUNhbGxhYmxlX0NoZWNrKG9iKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0aGUgZXJyY2hlY2sgYXR0cmlidXRlIG11c3QgYmUgY2FsbGFibGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9YREVDUkVGKHNlbGYtPmVycmNoZWNrKTsKLQlQeV9YSU5DUkVGKG9iKTsKLQlzZWxmLT5lcnJjaGVjayA9IG9iOwotCXJldHVybiAwOworICAgIGlmIChvYiAmJiAhUHlDYWxsYWJsZV9DaGVjayhvYikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZXJyY2hlY2sgYXR0cmlidXRlIG11c3QgYmUgY2FsbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9YREVDUkVGKHNlbGYtPmVycmNoZWNrKTsKKyAgICBQeV9YSU5DUkVGKG9iKTsKKyAgICBzZWxmLT5lcnJjaGVjayA9IG9iOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Z1bmNQdHJfZ2V0X2VycmNoZWNrKENGdW5jUHRyT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5lcnJjaGVjaykgewotCQlQeV9JTkNSRUYoc2VsZi0+ZXJyY2hlY2spOwotCQlyZXR1cm4gc2VsZi0+ZXJyY2hlY2s7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoc2VsZi0+ZXJyY2hlY2spIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPmVycmNoZWNrKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPmVycmNoZWNrOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBpbnQKIENGdW5jUHRyX3NldF9yZXN0eXBlKENGdW5jUHRyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2IpCiB7Ci0JaWYgKG9iID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRihzZWxmLT5yZXN0eXBlKTsKLQkJc2VsZi0+cmVzdHlwZSA9IE5VTEw7Ci0JCVB5X1hERUNSRUYoc2VsZi0+Y2hlY2tlcik7Ci0JCXNlbGYtPmNoZWNrZXIgPSBOVUxMOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG9iICE9IFB5X05vbmUgJiYgIVB5VHlwZV9zdGdkaWN0KG9iKSAmJiAhUHlDYWxsYWJsZV9DaGVjayhvYikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkicmVzdHlwZSBtdXN0IGJlIGEgdHlwZSwgYSBjYWxsYWJsZSwgb3IgTm9uZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X1hERUNSRUYoc2VsZi0+Y2hlY2tlcik7Ci0JUHlfWERFQ1JFRihzZWxmLT5yZXN0eXBlKTsKLQlQeV9JTkNSRUYob2IpOwotCXNlbGYtPnJlc3R5cGUgPSBvYjsKLQlzZWxmLT5jaGVja2VyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYiwgIl9jaGVja19yZXR2YWxfIik7Ci0JaWYgKHNlbGYtPmNoZWNrZXIgPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAob2IgPT0gTlVMTCkgeworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPnJlc3R5cGUpOworICAgICAgICBzZWxmLT5yZXN0eXBlID0gTlVMTDsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5jaGVja2VyKTsKKyAgICAgICAgc2VsZi0+Y2hlY2tlciA9IE5VTEw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAob2IgIT0gUHlfTm9uZSAmJiAhUHlUeXBlX3N0Z2RpY3Qob2IpICYmICFQeUNhbGxhYmxlX0NoZWNrKG9iKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlc3R5cGUgbXVzdCBiZSBhIHR5cGUsIGEgY2FsbGFibGUsIG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9YREVDUkVGKHNlbGYtPmNoZWNrZXIpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cmVzdHlwZSk7CisgICAgUHlfSU5DUkVGKG9iKTsKKyAgICBzZWxmLT5yZXN0eXBlID0gb2I7CisgICAgc2VsZi0+Y2hlY2tlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2IsICJfY2hlY2tfcmV0dmFsXyIpOworICAgIGlmIChzZWxmLT5jaGVja2VyID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0cl9nZXRfcmVzdHlwZShDRnVuY1B0ck9iamVjdCAqc2VsZikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWlmIChzZWxmLT5yZXN0eXBlKSB7Ci0JCVB5X0lOQ1JFRihzZWxmLT5yZXN0eXBlKTsKLQkJcmV0dXJuIHNlbGYtPnJlc3R5cGU7Ci0JfQotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENGdW5jUHRyT2JqZWN0IGluc3RhbmNlcyAqLwotCWlmIChkaWN0LT5yZXN0eXBlKSB7Ci0JCVB5X0lOQ1JFRihkaWN0LT5yZXN0eXBlKTsKLQkJcmV0dXJuIGRpY3QtPnJlc3R5cGU7Ci0JfSBlbHNlIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBpZiAoc2VsZi0+cmVzdHlwZSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+cmVzdHlwZSk7CisgICAgICAgIHJldHVybiBzZWxmLT5yZXN0eXBlOworICAgIH0KKyAgICBkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBDRnVuY1B0ck9iamVjdCBpbnN0YW5jZXMgKi8KKyAgICBpZiAoZGljdC0+cmVzdHlwZSkgeworICAgICAgICBQeV9JTkNSRUYoZGljdC0+cmVzdHlwZSk7CisgICAgICAgIHJldHVybiBkaWN0LT5yZXN0eXBlOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBDRnVuY1B0cl9zZXRfYXJndHlwZXMoQ0Z1bmNQdHJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYikKIHsKLQlQeU9iamVjdCAqY29udmVydGVyczsKKyAgICBQeU9iamVjdCAqY29udmVydGVyczsKIAotCWlmIChvYiA9PSBOVUxMIHx8IG9iID09IFB5X05vbmUpIHsKLQkJUHlfWERFQ1JFRihzZWxmLT5jb252ZXJ0ZXJzKTsKLQkJc2VsZi0+Y29udmVydGVycyA9IE5VTEw7Ci0JCVB5X1hERUNSRUYoc2VsZi0+YXJndHlwZXMpOwotCQlzZWxmLT5hcmd0eXBlcyA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJY29udmVydGVycyA9IGNvbnZlcnRlcnNfZnJvbV9hcmd0eXBlcyhvYik7Ci0JCWlmICghY29udmVydGVycykKLQkJCXJldHVybiAtMTsKLQkJUHlfWERFQ1JFRihzZWxmLT5jb252ZXJ0ZXJzKTsKLQkJc2VsZi0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7Ci0JCVB5X1hERUNSRUYoc2VsZi0+YXJndHlwZXMpOwotCQlQeV9JTkNSRUYob2IpOwotCQlzZWxmLT5hcmd0eXBlcyA9IG9iOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAob2IgPT0gTlVMTCB8fCBvYiA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+Y29udmVydGVycyk7CisgICAgICAgIHNlbGYtPmNvbnZlcnRlcnMgPSBOVUxMOworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmFyZ3R5cGVzKTsKKyAgICAgICAgc2VsZi0+YXJndHlwZXMgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzX2Zyb21fYXJndHlwZXMob2IpOworICAgICAgICBpZiAoIWNvbnZlcnRlcnMpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+Y29udmVydGVycyk7CisgICAgICAgIHNlbGYtPmNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzOworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPmFyZ3R5cGVzKTsKKyAgICAgICAgUHlfSU5DUkVGKG9iKTsKKyAgICAgICAgc2VsZi0+YXJndHlwZXMgPSBvYjsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0cl9nZXRfYXJndHlwZXMoQ0Z1bmNQdHJPYmplY3QgKnNlbGYpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlpZiAoc2VsZi0+YXJndHlwZXMpIHsKLQkJUHlfSU5DUkVGKHNlbGYtPmFyZ3R5cGVzKTsKLQkJcmV0dXJuIHNlbGYtPmFyZ3R5cGVzOwotCX0KLQlkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBDRnVuY1B0ck9iamVjdCBpbnN0YW5jZXMgKi8KLQlpZiAoZGljdC0+YXJndHlwZXMpIHsKLQkJUHlfSU5DUkVGKGRpY3QtPmFyZ3R5cGVzKTsKLQkJcmV0dXJuIGRpY3QtPmFyZ3R5cGVzOwotCX0gZWxzZSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgaWYgKHNlbGYtPmFyZ3R5cGVzKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5hcmd0eXBlcyk7CisgICAgICAgIHJldHVybiBzZWxmLT5hcmd0eXBlczsKKyAgICB9CisgICAgZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0Z1bmNQdHJPYmplY3QgaW5zdGFuY2VzICovCisgICAgaWYgKGRpY3QtPmFyZ3R5cGVzKSB7CisgICAgICAgIFB5X0lOQ1JFRihkaWN0LT5hcmd0eXBlcyk7CisgICAgICAgIHJldHVybiBkaWN0LT5hcmd0eXBlczsKKyAgICB9IGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIENGdW5jUHRyX2dldHNldHNbXSA9IHsKLQl7ICJlcnJjaGVjayIsIChnZXR0ZXIpQ0Z1bmNQdHJfZ2V0X2VycmNoZWNrLCAoc2V0dGVyKUNGdW5jUHRyX3NldF9lcnJjaGVjaywKLQkgICJhIGZ1bmN0aW9uIHRvIGNoZWNrIGZvciBlcnJvcnMiLCBOVUxMIH0sCi0JeyAicmVzdHlwZSIsIChnZXR0ZXIpQ0Z1bmNQdHJfZ2V0X3Jlc3R5cGUsIChzZXR0ZXIpQ0Z1bmNQdHJfc2V0X3Jlc3R5cGUsCi0JICAic3BlY2lmeSB0aGUgcmVzdWx0IHR5cGUiLCBOVUxMIH0sCi0JeyAiYXJndHlwZXMiLCAoZ2V0dGVyKUNGdW5jUHRyX2dldF9hcmd0eXBlcywKLQkgIChzZXR0ZXIpQ0Z1bmNQdHJfc2V0X2FyZ3R5cGVzLAotCSAgInNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGVzIiwgTlVMTCB9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAiZXJyY2hlY2siLCAoZ2V0dGVyKUNGdW5jUHRyX2dldF9lcnJjaGVjaywgKHNldHRlcilDRnVuY1B0cl9zZXRfZXJyY2hlY2ssCisgICAgICAiYSBmdW5jdGlvbiB0byBjaGVjayBmb3IgZXJyb3JzIiwgTlVMTCB9LAorICAgIHsgInJlc3R5cGUiLCAoZ2V0dGVyKUNGdW5jUHRyX2dldF9yZXN0eXBlLCAoc2V0dGVyKUNGdW5jUHRyX3NldF9yZXN0eXBlLAorICAgICAgInNwZWNpZnkgdGhlIHJlc3VsdCB0eXBlIiwgTlVMTCB9LAorICAgIHsgImFyZ3R5cGVzIiwgKGdldHRlcilDRnVuY1B0cl9nZXRfYXJndHlwZXMsCisgICAgICAoc2V0dGVyKUNGdW5jUHRyX3NldF9hcmd0eXBlcywKKyAgICAgICJzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyIsIE5VTEwgfSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogI2lmZGVmIE1TX1dJTjMyCiBzdGF0aWMgUFBST0MgRmluZEFkZHJlc3Modm9pZCAqaGFuZGxlLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdHlwZSkKIHsKICNpZmRlZiBNU19XSU42NAotCS8qIHdpbjY0IGhhcyBubyBzdGRjYWxsIGNhbGxpbmcgY29udiwgc28gaXQgc2hvdWxkCi0JICAgYWxzbyBub3QgaGF2ZSB0aGUgbmFtZSBtYW5nbGluZyBvZiBpdC4KLQkqLwotCXJldHVybiAoUFBST0MpR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCBuYW1lKTsKKyAgICAvKiB3aW42NCBoYXMgbm8gc3RkY2FsbCBjYWxsaW5nIGNvbnYsIHNvIGl0IHNob3VsZAorICAgICAgIGFsc28gbm90IGhhdmUgdGhlIG5hbWUgbWFuZ2xpbmcgb2YgaXQuCisgICAgKi8KKyAgICByZXR1cm4gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7CiAjZWxzZQotCVBQUk9DIGFkZHJlc3M7Ci0JY2hhciAqbWFuZ2xlZF9uYW1lOwotCWludCBpOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUFBST0MgYWRkcmVzczsKKyAgICBjaGFyICptYW5nbGVkX25hbWU7CisgICAgaW50IGk7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWFkZHJlc3MgPSAoUFBST0MpR2V0UHJvY0FkZHJlc3MoaGFuZGxlLCBuYW1lKTsKLQlpZiAoYWRkcmVzcykKLQkJcmV0dXJuIGFkZHJlc3M7Ci0JaWYgKCgoc2l6ZV90KW5hbWUgJiB+MHhGRkZGKSA9PSAwKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBhZGRyZXNzID0gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbmFtZSk7CisgICAgaWYgKGFkZHJlc3MpCisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgIGlmICgoKHNpemVfdCluYW1lICYgfjB4RkZGRikgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7Ci0JLyogSXQgc2hvdWxkIG5vdCBoYXBwZW4gdGhhdCBkaWN0IGlzIE5VTEwsIGJ1dCBiZXR0ZXIgYmUgc2FmZSAqLwotCWlmIChkaWN0PT1OVUxMIHx8IGRpY3QtPmZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpCi0JCXJldHVybiBhZGRyZXNzOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKKyAgICAvKiBJdCBzaG91bGQgbm90IGhhcHBlbiB0aGF0IGRpY3QgaXMgTlVMTCwgYnV0IGJldHRlciBiZSBzYWZlICovCisgICAgaWYgKGRpY3Q9PU5VTEwgfHwgZGljdC0+ZmxhZ3MgJiBGVU5DRkxBR19DREVDTCkKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CiAKLQkvKiBmb3Igc3RkY2FsbCwgdHJ5IG1hbmdsZWQgbmFtZXM6Ci0JICAgZnVuY25hbWUgLT4gX2Z1bmNuYW1lQDxuPgotCSAgIHdoZXJlIG4gaXMgMCwgNCwgOCwgMTIsIC4uLiwgMTI4Ci0JICovCi0JbWFuZ2xlZF9uYW1lID0gYWxsb2NhKHN0cmxlbihuYW1lKSArIDEgKyAxICsgMSArIDMpOyAvKiBcMCBfIEAgJWQgKi8KLQlpZiAoIW1hbmdsZWRfbmFtZSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHsKLQkJc3ByaW50ZihtYW5nbGVkX25hbWUsICJfJXNAJWQiLCBuYW1lLCBpKjQpOwotCQlhZGRyZXNzID0gKFBQUk9DKUdldFByb2NBZGRyZXNzKGhhbmRsZSwgbWFuZ2xlZF9uYW1lKTsKLQkJaWYgKGFkZHJlc3MpCi0JCQlyZXR1cm4gYWRkcmVzczsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogZm9yIHN0ZGNhbGwsIHRyeSBtYW5nbGVkIG5hbWVzOgorICAgICAgIGZ1bmNuYW1lIC0+IF9mdW5jbmFtZUA8bj4KKyAgICAgICB3aGVyZSBuIGlzIDAsIDQsIDgsIDEyLCAuLi4sIDEyOAorICAgICAqLworICAgIG1hbmdsZWRfbmFtZSA9IGFsbG9jYShzdHJsZW4obmFtZSkgKyAxICsgMSArIDEgKyAzKTsgLyogXDAgXyBAICVkICovCisgICAgaWYgKCFtYW5nbGVkX25hbWUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKSB7CisgICAgICAgIHNwcmludGYobWFuZ2xlZF9uYW1lLCAiXyVzQCVkIiwgbmFtZSwgaSo0KTsKKyAgICAgICAgYWRkcmVzcyA9IChQUFJPQylHZXRQcm9jQWRkcmVzcyhoYW5kbGUsIG1hbmdsZWRfbmFtZSk7CisgICAgICAgIGlmIChhZGRyZXNzKQorICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiB9CiAjZW5kaWYKQEAgLTMxMzAsMjIzICszMTMwLDIyMyBAQAogc3RhdGljIGludAogX2NoZWNrX291dGFyZ190eXBlKFB5T2JqZWN0ICphcmcsIFB5X3NzaXplX3QgaW5kZXgpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OwogCi0JaWYgKFBvaW50ZXJUeXBlT2JqZWN0X0NoZWNrKGFyZykpCi0JCXJldHVybiAxOworICAgIGlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayhhcmcpKQorICAgICAgICByZXR1cm4gMTsKIAotCWlmIChBcnJheVR5cGVPYmplY3RfQ2hlY2soYXJnKSkKLQkJcmV0dXJuIDE7CisgICAgaWYgKEFycmF5VHlwZU9iamVjdF9DaGVjayhhcmcpKQorICAgICAgICByZXR1cm4gMTsKIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOwotCWlmIChkaWN0Ci0JICAgIC8qIHNpbXBsZSBwb2ludGVyIHR5cGVzLCBjX3ZvaWRfcCwgY193Y2hhcl9wLCBCU1RSLCAuLi4gKi8KLQkgICAgJiYgUHlTdHJpbmdfQ2hlY2soZGljdC0+cHJvdG8pCisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFyZyk7CisgICAgaWYgKGRpY3QKKyAgICAgICAgLyogc2ltcGxlIHBvaW50ZXIgdHlwZXMsIGNfdm9pZF9wLCBjX3djaGFyX3AsIEJTVFIsIC4uLiAqLworICAgICAgICAmJiBQeVN0cmluZ19DaGVjayhkaWN0LT5wcm90bykKIC8qIFdlIG9ubHkgYWxsb3cgY192b2lkX3AsIGNfY2hhcl9wIGFuZCBjX3djaGFyX3AgYXMgYSBzaW1wbGUgb3V0cHV0IHBhcmFtZXRlciB0eXBlICovCi0JICAgICYmIChzdHJjaHIoIlB6WiIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgewotCQlyZXR1cm4gMTsKLQl9CisgICAgICAgICYmIChzdHJjaHIoIlB6WiIsIFB5U3RyaW5nX0FTX1NUUklORyhkaWN0LT5wcm90bylbMF0pKSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICInb3V0JyBwYXJhbWV0ZXIgJWQgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSwgbm90ICVzIiwKLQkJICAgICBQeV9TQUZFX0RPV05DQVNUKGluZGV4LCBQeV9zc2l6ZV90LCBpbnQpLAotCQkgICAgIFB5VHlwZV9DaGVjayhhcmcpID8KLQkJICAgICAoKFB5VHlwZU9iamVjdCAqKWFyZyktPnRwX25hbWUgOgotCQkgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIidvdXQnIHBhcmFtZXRlciAlZCBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKGluZGV4LCBQeV9zc2l6ZV90LCBpbnQpLAorICAgICAgICAgICAgICAgICBQeVR5cGVfQ2hlY2soYXJnKSA/CisgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopYXJnKS0+dHBfbmFtZSA6CisgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gZXJyb3IgKi8KIHN0YXRpYyBpbnQKIF92YWxpZGF0ZV9wYXJhbWZsYWdzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnBhcmFtZmxhZ3MpCiB7Ci0JUHlfc3NpemVfdCBpLCBsZW47Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlQeU9iamVjdCAqYXJndHlwZXM7CisgICAgUHlfc3NpemVfdCBpLCBsZW47CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqYXJndHlwZXM7CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7Ci0JYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTC4gJ3R5cGUnIGlzIGEgQ0Z1bmNQdHIgdHlwZS4gKi8KLQlhcmd0eXBlcyA9IGRpY3QtPmFyZ3R5cGVzOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKKyAgICBhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMLiAndHlwZScgaXMgYSBDRnVuY1B0ciB0eXBlLiAqLworICAgIGFyZ3R5cGVzID0gZGljdC0+YXJndHlwZXM7CiAKLQlpZiAocGFyYW1mbGFncyA9PSBOVUxMIHx8IGRpY3QtPmFyZ3R5cGVzID09IE5VTEwpCi0JCXJldHVybiAxOworICAgIGlmIChwYXJhbWZsYWdzID09IE5VTEwgfHwgZGljdC0+YXJndHlwZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2socGFyYW1mbGFncykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkicGFyYW1mbGFncyBtdXN0IGJlIGEgdHVwbGUgb3IgTm9uZSIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHBhcmFtZmxhZ3MpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1mbGFncyBtdXN0IGJlIGEgdHVwbGUgb3IgTm9uZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKHBhcmFtZmxhZ3MpOwotCWlmIChsZW4gIT0gUHlUdXBsZV9HRVRfU0laRShkaWN0LT5hcmd0eXBlcykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInBhcmFtZmxhZ3MgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBhcmd0eXBlcyIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShwYXJhbWZsYWdzLCBpKTsKLQkJaW50IGZsYWc7Ci0JCWNoYXIgKm5hbWU7Ci0JCVB5T2JqZWN0ICpkZWZ2YWw7Ci0JCVB5T2JqZWN0ICp0eXA7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtLCAiaXx6TyIsICZmbGFnLCAmbmFtZSwgJmRlZnZhbCkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICAgInBhcmFtZmxhZ3MgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIChpbnQgWyxzdHJpbmcgWyx2YWx1ZV1dKSB0dXBsZXMiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXR5cCA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHlwZXMsIGkpOwotCQlzd2l0Y2ggKGZsYWcgJiAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUIHwgUEFSQU1GTEFHX0ZMQ0lEKSkgewotCQljYXNlIDA6Ci0JCWNhc2UgUEFSQU1GTEFHX0ZJTjoKLQkJY2FzZSBQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZMQ0lEOgotCQljYXNlIFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRk9VVDoKLQkJCWJyZWFrOwotCQljYXNlIFBBUkFNRkxBR19GT1VUOgotCQkJaWYgKCFfY2hlY2tfb3V0YXJnX3R5cGUodHlwLCBpKzEpKQotCQkJCXJldHVybiAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgInBhcmFtZmxhZyB2YWx1ZSAlZCBub3Qgc3VwcG9ydGVkIiwKLQkJCQkgICAgIGZsYWcpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgbGVuID0gUHlUdXBsZV9HRVRfU0laRShwYXJhbWZsYWdzKTsKKyAgICBpZiAobGVuICE9IFB5VHVwbGVfR0VUX1NJWkUoZGljdC0+YXJndHlwZXMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtZmxhZ3MgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyBhcmd0eXBlcyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBhcmFtZmxhZ3MsIGkpOworICAgICAgICBpbnQgZmxhZzsKKyAgICAgICAgY2hhciAqbmFtZTsKKyAgICAgICAgUHlPYmplY3QgKmRlZnZhbDsKKyAgICAgICAgUHlPYmplY3QgKnR5cDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGl0ZW0sICJpfHpPIiwgJmZsYWcsICZuYW1lLCAmZGVmdmFsKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAicGFyYW1mbGFncyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgKGludCBbLHN0cmluZyBbLHZhbHVlXV0pIHR1cGxlcyIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgdHlwID0gUHlUdXBsZV9HRVRfSVRFTShhcmd0eXBlcywgaSk7CisgICAgICAgIHN3aXRjaCAoZmxhZyAmIChQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZPVVQgfCBQQVJBTUZMQUdfRkxDSUQpKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSBQQVJBTUZMQUdfRklOOgorICAgICAgICBjYXNlIFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRkxDSUQ6CisgICAgICAgIGNhc2UgUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEFSQU1GTEFHX0ZPVVQ6CisgICAgICAgICAgICBpZiAoIV9jaGVja19vdXRhcmdfdHlwZSh0eXAsIGkrMSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtZmxhZyB2YWx1ZSAlZCBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBfZ2V0X25hbWUoUHlPYmplY3QgKm9iaiwgY2hhciAqKnBuYW1lKQogewogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKFB5SW50X0NoZWNrKG9iaikgfHwgUHlMb25nX0NoZWNrKG9iaikpIHsKLQkJLyogV2UgaGF2ZSB0byB1c2UgTUFLRUlOVFJFU09VUkNFQSBmb3IgV2luZG93cyBDRS4KLQkJICAgV29ya3Mgb24gV2luZG93cyBhcyB3ZWxsLCBvZiBjb3Vyc2UuCi0JCSovCi0JCSpwbmFtZSA9IE1BS0VJTlRSRVNPVVJDRUEoUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG9iaikgJiAweEZGRkYpOwotCQlyZXR1cm4gMTsKLQl9CisgICAgaWYgKFB5SW50X0NoZWNrKG9iaikgfHwgUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgLyogV2UgaGF2ZSB0byB1c2UgTUFLRUlOVFJFU09VUkNFQSBmb3IgV2luZG93cyBDRS4KKyAgICAgICAgICAgV29ya3Mgb24gV2luZG93cyBhcyB3ZWxsLCBvZiBjb3Vyc2UuCisgICAgICAgICovCisgICAgICAgICpwbmFtZSA9IE1BS0VJTlRSRVNPVVJDRUEoUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG9iaikgJiAweEZGRkYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAjZW5kaWYKLQlpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSB8fCBQeVVuaWNvZGVfQ2hlY2sob2JqKSkgewotCQkqcG5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhvYmopOwotCQlyZXR1cm4gKnBuYW1lID8gMSA6IDA7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiZnVuY3Rpb24gbmFtZSBtdXN0IGJlIHN0cmluZyBvciBpbnRlZ2VyIik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikgfHwgUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgKnBuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcob2JqKTsKKyAgICAgICAgcmV0dXJuICpwbmFtZSA/IDEgOiAwOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gbmFtZSBtdXN0IGJlIHN0cmluZyBvciBpbnRlZ2VyIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIENGdW5jUHRyX0Zyb21EbGwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgKCogYWRkcmVzcykodm9pZCk7Ci0JUHlPYmplY3QgKmRsbDsKLQlQeU9iamVjdCAqb2JqOwotCUNGdW5jUHRyT2JqZWN0ICpzZWxmOwotCXZvaWQgKmhhbmRsZTsKLQlQeU9iamVjdCAqcGFyYW1mbGFncyA9IE5VTEw7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgKCogYWRkcmVzcykodm9pZCk7CisgICAgUHlPYmplY3QgKmRsbDsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIENGdW5jUHRyT2JqZWN0ICpzZWxmOworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBQeU9iamVjdCAqcGFyYW1mbGFncyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIihPJk8pfE8iLCBfZ2V0X25hbWUsICZuYW1lLCAmZGxsLCAmcGFyYW1mbGFncykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXJhbWZsYWdzID09IFB5X05vbmUpCi0JCXBhcmFtZmxhZ3MgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiKE8mTyl8TyIsIF9nZXRfbmFtZSwgJm5hbWUsICZkbGwsICZwYXJhbWZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhcmFtZmxhZ3MgPT0gUHlfTm9uZSkKKyAgICAgICAgcGFyYW1mbGFncyA9IE5VTEw7CiAKLQlvYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRsbCwgIl9oYW5kbGUiKTsKLQlpZiAoIW9iaikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUludF9DaGVjayhvYmopICYmICFQeUxvbmdfQ2hlY2sob2JqKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0aGUgX2hhbmRsZSBhdHRyaWJ1dGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGFuIGludGVnZXIiKTsKLQkJUHlfREVDUkVGKG9iaik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQloYW5kbGUgPSAodm9pZCAqKVB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKLQlQeV9ERUNSRUYob2JqKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY291bGQgbm90IGNvbnZlcnQgdGhlIF9oYW5kbGUgYXR0cmlidXRlIHRvIGEgcG9pbnRlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgb2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkbGwsICJfaGFuZGxlIik7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlJbnRfQ2hlY2sob2JqKSAmJiAhUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgX2hhbmRsZSBhdHRyaWJ1dGUgb2YgdGhlIHNlY29uZCBhcmd1bWVudCBtdXN0IGJlIGFuIGludGVnZXIiKTsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBoYW5kbGUgPSAodm9pZCAqKVB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKKyAgICBQeV9ERUNSRUYob2JqKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY29udmVydCB0aGUgX2hhbmRsZSBhdHRyaWJ1dGUgdG8gYSBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogI2lmZGVmIE1TX1dJTjMyCi0JYWRkcmVzcyA9IEZpbmRBZGRyZXNzKGhhbmRsZSwgbmFtZSwgKFB5T2JqZWN0ICopdHlwZSk7Ci0JaWYgKCFhZGRyZXNzKSB7Ci0JCWlmICghSVNfSU5UUkVTT1VSQ0UobmFtZSkpCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJICAgICAiZnVuY3Rpb24gJyVzJyBub3QgZm91bmQiLAotCQkJCSAgICAgbmFtZSk7Ci0JCWVsc2UKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkgICAgICJmdW5jdGlvbiBvcmRpbmFsICVkIG5vdCBmb3VuZCIsCi0JCQkJICAgICAoV09SRCkoc2l6ZV90KW5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYWRkcmVzcyA9IEZpbmRBZGRyZXNzKGhhbmRsZSwgbmFtZSwgKFB5T2JqZWN0ICopdHlwZSk7CisgICAgaWYgKCFhZGRyZXNzKSB7CisgICAgICAgIGlmICghSVNfSU5UUkVTT1VSQ0UobmFtZSkpCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uICclcycgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBvcmRpbmFsICVkIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKFdPUkQpKHNpemVfdCluYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2Vsc2UKLQlhZGRyZXNzID0gKFBQUk9DKWN0eXBlc19kbHN5bShoYW5kbGUsIG5hbWUpOwotCWlmICghYWRkcmVzcykgeworICAgIGFkZHJlc3MgPSAoUFBST0MpY3R5cGVzX2Rsc3ltKGhhbmRsZSwgbmFtZSk7CisgICAgaWYgKCFhZGRyZXNzKSB7CiAjaWZkZWYgX19DWUdXSU5fXwogLyogZGxlcnJvcigpIGlzbid0IHZlcnkgaGVscGZ1bCBvbiBjeWd3aW4gKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICAgICAiZnVuY3Rpb24gJyVzJyBub3QgZm91bmQgKCVzKSAiLAotCQkJICAgICBuYW1lKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uICclcycgbm90IGZvdW5kICglcykgIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwogI2Vsc2UKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBjdHlwZXNfZGxlcnJvcigpKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBjdHlwZXNfZGxlcnJvcigpKTsKICNlbmRpZgotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCWlmICghX3ZhbGlkYXRlX3BhcmFtZmxhZ3ModHlwZSwgcGFyYW1mbGFncykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghX3ZhbGlkYXRlX3BhcmFtZmxhZ3ModHlwZSwgcGFyYW1mbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKCFzZWxmKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZWxmID0gKENGdW5jUHRyT2JqZWN0ICopR2VuZXJpY0NEYXRhX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAoIXNlbGYpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfWElOQ1JFRihwYXJhbWZsYWdzKTsKLQlzZWxmLT5wYXJhbWZsYWdzID0gcGFyYW1mbGFnczsKKyAgICBQeV9YSU5DUkVGKHBhcmFtZmxhZ3MpOworICAgIHNlbGYtPnBhcmFtZmxhZ3MgPSBwYXJhbWZsYWdzOwogCi0JKih2b2lkICoqKXNlbGYtPmJfcHRyID0gYWRkcmVzczsKKyAgICAqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPSBhZGRyZXNzOwogCi0JUHlfSU5DUkVGKChQeU9iamVjdCAqKWRsbCk7IC8qIGZvciBLZWVwUmVmICovCi0JaWYgKC0xID09IEtlZXBSZWYoKENEYXRhT2JqZWN0ICopc2VsZiwgMCwgZGxsKSkgewotCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopZGxsKTsgLyogZm9yIEtlZXBSZWYgKi8KKyAgICBpZiAoLTEgPT0gS2VlcFJlZigoQ0RhdGFPYmplY3QgKilzZWxmLCAwLCBkbGwpKSB7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKilzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKHNlbGYpOwotCXNlbGYtPmNhbGxhYmxlID0gKFB5T2JqZWN0ICopc2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgc2VsZi0+Y2FsbGFibGUgPSAoUHlPYmplY3QgKilzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0cl9Gcm9tVnRibEluZGV4KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCUNGdW5jUHRyT2JqZWN0ICpzZWxmOwotCWludCBpbmRleDsKLQljaGFyICpuYW1lID0gTlVMTDsKLQlQeU9iamVjdCAqcGFyYW1mbGFncyA9IE5VTEw7Ci0JR1VJRCAqaWlkID0gTlVMTDsKLQlQeV9zc2l6ZV90IGlpZF9sZW4gPSAwOworICAgIENGdW5jUHRyT2JqZWN0ICpzZWxmOworICAgIGludCBpbmRleDsKKyAgICBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcGFyYW1mbGFncyA9IE5VTEw7CisgICAgR1VJRCAqaWlkID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGlpZF9sZW4gPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpc3xPeiMiLCAmaW5kZXgsICZuYW1lLCAmcGFyYW1mbGFncywgJmlpZCwgJmlpZF9sZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGFyYW1mbGFncyA9PSBQeV9Ob25lKQotCQlwYXJhbWZsYWdzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzfE96IyIsICZpbmRleCwgJm5hbWUsICZwYXJhbWZsYWdzLCAmaWlkLCAmaWlkX2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXJhbWZsYWdzID09IFB5X05vbmUpCisgICAgICAgIHBhcmFtZmxhZ3MgPSBOVUxMOwogCi0JaWYgKCFfdmFsaWRhdGVfcGFyYW1mbGFncyh0eXBlLCBwYXJhbWZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfdmFsaWRhdGVfcGFyYW1mbGFncyh0eXBlLCBwYXJhbWZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmID0gKENGdW5jUHRyT2JqZWN0ICopR2VuZXJpY0NEYXRhX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKLQlzZWxmLT5pbmRleCA9IGluZGV4ICsgMHgxMDAwOwotCVB5X1hJTkNSRUYocGFyYW1mbGFncyk7Ci0Jc2VsZi0+cGFyYW1mbGFncyA9IHBhcmFtZmxhZ3M7Ci0JaWYgKGlpZF9sZW4gPT0gc2l6ZW9mKEdVSUQpKQotCQlzZWxmLT5paWQgPSBpaWQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgc2VsZiA9IChDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgc2VsZi0+aW5kZXggPSBpbmRleCArIDB4MTAwMDsKKyAgICBQeV9YSU5DUkVGKHBhcmFtZmxhZ3MpOworICAgIHNlbGYtPnBhcmFtZmxhZ3MgPSBwYXJhbWZsYWdzOworICAgIGlmIChpaWRfbGVuID09IHNpemVvZihHVUlEKSkKKyAgICAgICAgc2VsZi0+aWlkID0gaWlkOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogI2VuZGlmCiAKQEAgLTMzNjYsOTEgKzMzNjYsOTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRnVuY1B0cl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JQ0Z1bmNQdHJPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOwotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JQ1RodW5rT2JqZWN0ICp0aHVuazsKKyAgICBDRnVuY1B0ck9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqY2FsbGFibGU7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBDVGh1bmtPYmplY3QgKnRodW5rOwogCi0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKLQkJcmV0dXJuIEdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKKyAgICAgICAgcmV0dXJuIEdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CiAKLQlpZiAoMSA8PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICYmIFB5VHVwbGVfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCi0JCXJldHVybiBDRnVuY1B0cl9Gcm9tRGxsKHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICgxIDw9IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgJiYgUHlUdXBsZV9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSkKKyAgICAgICAgcmV0dXJuIENGdW5jUHRyX0Zyb21EbGwodHlwZSwgYXJncywga3dkcyk7CiAKICNpZmRlZiBNU19XSU4zMgotCWlmICgyIDw9IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgJiYgUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCi0JCXJldHVybiBDRnVuY1B0cl9Gcm9tVnRibEluZGV4KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICgyIDw9IFB5VHVwbGVfR0VUX1NJWkUoYXJncykgJiYgUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpCisgICAgICAgIHJldHVybiBDRnVuY1B0cl9Gcm9tVnRibEluZGV4KHR5cGUsIGFyZ3MsIGt3ZHMpOwogI2VuZGlmCiAKLQlpZiAoMSA9PSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpCi0JICAgICYmIChQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKQotCQl8fCBQeUxvbmdfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkpKSB7Ci0JCUNEYXRhT2JqZWN0ICpvYjsKLQkJdm9pZCAqcHRyID0gUHlMb25nX0FzVm9pZFB0cihQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKTsKLQkJaWYgKHB0ciA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJb2IgPSAoQ0RhdGFPYmplY3QgKilHZW5lcmljQ0RhdGFfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCQlpZiAob2IgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQkqKHZvaWQgKiopb2ItPmJfcHRyID0gcHRyOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopb2I7Ci0JfQorICAgIGlmICgxID09IFB5VHVwbGVfR0VUX1NJWkUoYXJncykKKyAgICAgICAgJiYgKFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpCisgICAgICAgIHx8IFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSkpIHsKKyAgICAgICAgQ0RhdGFPYmplY3QgKm9iOworICAgICAgICB2b2lkICpwdHIgPSBQeUxvbmdfQXNWb2lkUHRyKFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpOworICAgICAgICBpZiAocHRyID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBvYiA9IChDRGF0YU9iamVjdCAqKUdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgICAgIGlmIChvYiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICoodm9pZCAqKilvYi0+Yl9wdHIgPSBwdHI7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilvYjsKKyAgICB9CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmY2FsbGFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY2FsbGFibGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUgb3IgaW50ZWdlciBmdW5jdGlvbiBhZGRyZXNzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmY2FsbGFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soY2FsbGFibGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSBvciBpbnRlZ2VyIGZ1bmN0aW9uIGFkZHJlc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogWFhYIFhYWCBUaGlzIHdvdWxkIGFsbG93IHRvIHBhc3MgYWRkaXRpb25hbCBvcHRpb25zLiAgRm9yIENPTQotCSAgIG1ldGhvZCAqaW1wbGVtZW50YXRpb25zKiwgd2Ugd291bGQgcHJvYmFibHkgd2FudCBkaWZmZXJlbnQKLQkgICBiZWhhdmlvdXIgdGhhbiBpbiAnbm9ybWFsJyBjYWxsYmFjayBmdW5jdGlvbnM6IHJldHVybiBhIEhSRVNVTFQgaWYKLQkgICBhbiBleGNlcHRpb24gb2NjdXJycyBpbiB0aGUgY2FsbGJhY2ssIGFuZCBwcmludCB0aGUgdHJhY2ViYWNrIG5vdAotCSAgIG9ubHkgb24gdGhlIGNvbnNvbGUsIGJ1dCBhbHNvIHRvIE91dHB1dERlYnVnU3RyaW5nKCkgb3Igc29tZXRoaW5nCi0JICAgbGlrZSB0aGF0LgotCSovCisgICAgLyogWFhYIFhYWCBUaGlzIHdvdWxkIGFsbG93IHRvIHBhc3MgYWRkaXRpb25hbCBvcHRpb25zLiAgRm9yIENPTQorICAgICAgIG1ldGhvZCAqaW1wbGVtZW50YXRpb25zKiwgd2Ugd291bGQgcHJvYmFibHkgd2FudCBkaWZmZXJlbnQKKyAgICAgICBiZWhhdmlvdXIgdGhhbiBpbiAnbm9ybWFsJyBjYWxsYmFjayBmdW5jdGlvbnM6IHJldHVybiBhIEhSRVNVTFQgaWYKKyAgICAgICBhbiBleGNlcHRpb24gb2NjdXJycyBpbiB0aGUgY2FsbGJhY2ssIGFuZCBwcmludCB0aGUgdHJhY2ViYWNrIG5vdAorICAgICAgIG9ubHkgb24gdGhlIGNvbnNvbGUsIGJ1dCBhbHNvIHRvIE91dHB1dERlYnVnU3RyaW5nKCkgb3Igc29tZXRoaW5nCisgICAgICAgbGlrZSB0aGF0LgorICAgICovCiAvKgotCWlmIChrd2RzICYmIFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsICJvcHRpb25zIikpIHsKLQkJLi4uCi0JfQorICAgIGlmIChrd2RzICYmIFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsICJvcHRpb25zIikpIHsKKyAgICAgICAgLi4uCisgICAgfQogKi8KIAotCWRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKLQkvKiBYWFhYIEZhaWxzIGlmIHdlIGRvOiAnQ0Z1bmNQdHIobGFtYmRhIHg6IHgpJyAqLwotCWlmICghZGljdCB8fCAhZGljdC0+YXJndHlwZXMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAgICJjYW5ub3QgY29uc3RydWN0IGluc3RhbmNlIG9mIHRoaXMgY2xhc3M6IgotCQkJIiBubyBhcmd0eXBlcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOworICAgIC8qIFhYWFggRmFpbHMgaWYgd2UgZG86ICdDRnVuY1B0cihsYW1iZGEgeDogeCknICovCisgICAgaWYgKCFkaWN0IHx8ICFkaWN0LT5hcmd0eXBlcykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgImNhbm5vdCBjb25zdHJ1Y3QgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzczoiCisgICAgICAgICAgICAiIG5vIGFyZ3R5cGVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXRodW5rID0gQWxsb2NGdW5jdGlvbkNhbGxiYWNrKGNhbGxhYmxlLAotCQkJCSAgICAgIGRpY3QtPmFyZ3R5cGVzLAotCQkJCSAgICAgIGRpY3QtPnJlc3R5cGUsCi0JCQkJICAgICAgZGljdC0+ZmxhZ3MpOwotCWlmICghdGh1bmspCi0JCXJldHVybiBOVUxMOworICAgIHRodW5rID0gQWxsb2NGdW5jdGlvbkNhbGxiYWNrKGNhbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmFyZ3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPnJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+ZmxhZ3MpOworICAgIGlmICghdGh1bmspCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodGh1bmspOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc2VsZiA9IChDRnVuY1B0ck9iamVjdCAqKUdlbmVyaWNDRGF0YV9uZXcodHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodGh1bmspOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoY2FsbGFibGUpOwotCXNlbGYtPmNhbGxhYmxlID0gY2FsbGFibGU7CisgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICBzZWxmLT5jYWxsYWJsZSA9IGNhbGxhYmxlOwogCi0Jc2VsZi0+dGh1bmsgPSB0aHVuazsKLQkqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPSAodm9pZCAqKXRodW5rLT5wY2w7Ci0JCi0JUHlfSU5DUkVGKChQeU9iamVjdCAqKXRodW5rKTsgLyogZm9yIEtlZXBSZWYgKi8KLQlpZiAoLTEgPT0gS2VlcFJlZigoQ0RhdGFPYmplY3QgKilzZWxmLCAwLCAoUHlPYmplY3QgKil0aHVuaykpIHsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXNlbGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgc2VsZi0+dGh1bmsgPSB0aHVuazsKKyAgICAqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPSAodm9pZCAqKXRodW5rLT5wY2w7CisKKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopdGh1bmspOyAvKiBmb3IgS2VlcFJlZiAqLworICAgIGlmICgtMSA9PSBLZWVwUmVmKChDRGF0YU9iamVjdCAqKXNlbGYsIDAsIChQeU9iamVjdCAqKXRodW5rKSkgeworICAgICAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogCkBAIC0zNDYwLDU0ICszNDYwLDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2J5cmVmKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlDQXJnT2JqZWN0ICpwYXJnOwotCWlmICghQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleHBlY3RlZCBDRGF0YSBpbnN0YW5jZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlDQXJnT2JqZWN0ICpwYXJnOworICAgIGlmICghQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIENEYXRhIGluc3RhbmNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXBhcmcgPSBuZXdfQ0FyZ09iamVjdCgpOwotCWlmIChwYXJnID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG9iaik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBwYXJnID0gbmV3X0NBcmdPYmplY3QoKTsKKyAgICBpZiAocGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwYXJnLT50YWcgPSAnUCc7Ci0JcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JcGFyZy0+b2JqID0gb2JqOwotCXBhcmctPnZhbHVlLnAgPSAoKENEYXRhT2JqZWN0ICopb2JqKS0+Yl9wdHI7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CisgICAgcGFyZy0+dGFnID0gJ1AnOworICAgIHBhcmctPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgIHBhcmctPm9iaiA9IG9iajsKKyAgICBwYXJnLT52YWx1ZS5wID0gKChDRGF0YU9iamVjdCAqKW9iaiktPmJfcHRyOworICAgIHJldHVybiAoUHlPYmplY3QgKilwYXJnOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogX2dldF9hcmcoaW50ICpwaW5kZXgsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpkZWZ2YWwsIFB5T2JqZWN0ICppbmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKCpwaW5kZXggPCBQeVR1cGxlX0dFVF9TSVpFKGluYXJncykpIHsKLQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oaW5hcmdzLCAqcGluZGV4KTsKLQkJKysqcGluZGV4OwotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiB2OwotCX0KLQlpZiAoa3dkcyAmJiAodiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsIG5hbWUpKSkgewotCQkrKypwaW5kZXg7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIHY7Ci0JfQotCWlmIChkZWZ2YWwpIHsKLQkJUHlfSU5DUkVGKGRlZnZhbCk7Ci0JCXJldHVybiBkZWZ2YWw7Ci0JfQotCS8qIHdlIGNhbid0IGN1cnJlbnRseSBlbWl0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgKi8KLQlpZiAobmFtZSkKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgInJlcXVpcmVkIGFyZ3VtZW50ICclcycgbWlzc2luZyIsIG5hbWUpOwotCWVsc2UKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIm5vdCBlbm91Z2ggYXJndW1lbnRzIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCpwaW5kZXggPCBQeVR1cGxlX0dFVF9TSVpFKGluYXJncykpIHsKKyAgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oaW5hcmdzLCAqcGluZGV4KTsKKyAgICAgICAgKysqcGluZGV4OworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICBpZiAoa3dkcyAmJiAodiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsIG5hbWUpKSkgeworICAgICAgICArKypwaW5kZXg7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIGlmIChkZWZ2YWwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlZnZhbCk7CisgICAgICAgIHJldHVybiBkZWZ2YWw7CisgICAgfQorICAgIC8qIHdlIGNhbid0IGN1cnJlbnRseSBlbWl0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgKi8KKyAgICBpZiAobmFtZSkKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBhcmd1bWVudCAnJXMnIG1pc3NpbmciLCBuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBhcmd1bWVudHMiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyoKQEAgLTM1MzAsMTcwICszNTMwLDE3MCBAQAogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBfYnVpbGRfY2FsbGFyZ3MoQ0Z1bmNQdHJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmd0eXBlcywKLQkJUHlPYmplY3QgKmluYXJncywgUHlPYmplY3QgKmt3ZHMsCi0JCWludCAqcG91dG1hc2ssIGludCAqcGlub3V0bWFzaywgdW5zaWduZWQgaW50ICpwbnVtcmV0dmFscykKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqaW5hcmdzLCBQeU9iamVjdCAqa3dkcywKKyAgICAgICAgICAgICAgICBpbnQgKnBvdXRtYXNrLCBpbnQgKnBpbm91dG1hc2ssIHVuc2lnbmVkIGludCAqcG51bXJldHZhbHMpCiB7Ci0JUHlPYmplY3QgKnBhcmFtZmxhZ3MgPSBzZWxmLT5wYXJhbWZsYWdzOwotCVB5T2JqZWN0ICpjYWxsYXJnczsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCVB5X3NzaXplX3QgaSwgbGVuOwotCWludCBpbmFyZ3NfaW5kZXggPSAwOwotCS8qIEl0J3MgYSBsaXR0bGUgYml0IGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgaG93IG1hbnkgYXJndW1lbnRzIHRoZQotCWZ1bmN0aW9uIGNhbGwgcmVxdWlyZXMvYWNjZXB0cy4gIEZvciBzaW1wbGljaXR5LCB3ZSBjb3VudCB0aGUgY29uc3VtZWQKLQlhcmdzIGFuZCBjb21wYXJlIHRoaXMgdG8gdGhlIG51bWJlciBvZiBzdXBwbGllZCBhcmdzLiAqLwotCVB5X3NzaXplX3QgYWN0dWFsX2FyZ3M7CisgICAgUHlPYmplY3QgKnBhcmFtZmxhZ3MgPSBzZWxmLT5wYXJhbWZsYWdzOworICAgIFB5T2JqZWN0ICpjYWxsYXJnczsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIFB5X3NzaXplX3QgaSwgbGVuOworICAgIGludCBpbmFyZ3NfaW5kZXggPSAwOworICAgIC8qIEl0J3MgYSBsaXR0bGUgYml0IGRpZmZpY3VsdCB0byBkZXRlcm1pbmUgaG93IG1hbnkgYXJndW1lbnRzIHRoZQorICAgIGZ1bmN0aW9uIGNhbGwgcmVxdWlyZXMvYWNjZXB0cy4gIEZvciBzaW1wbGljaXR5LCB3ZSBjb3VudCB0aGUgY29uc3VtZWQKKyAgICBhcmdzIGFuZCBjb21wYXJlIHRoaXMgdG8gdGhlIG51bWJlciBvZiBzdXBwbGllZCBhcmdzLiAqLworICAgIFB5X3NzaXplX3QgYWN0dWFsX2FyZ3M7CiAKLQkqcG91dG1hc2sgPSAwOwotCSpwaW5vdXRtYXNrID0gMDsKLQkqcG51bXJldHZhbHMgPSAwOworICAgICpwb3V0bWFzayA9IDA7CisgICAgKnBpbm91dG1hc2sgPSAwOworICAgICpwbnVtcmV0dmFscyA9IDA7CiAKLQkvKiBUcml2aWFsIGNhc2VzLCB3aGVyZSB3ZSBlaXRoZXIgcmV0dXJuIGluYXJncyBpdHNlbGYsIG9yIGEgc2xpY2Ugb2YgaXQuICovCi0JaWYgKGFyZ3R5cGVzID09IE5VTEwgfHwgcGFyYW1mbGFncyA9PSBOVUxMIHx8IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpID09IDApIHsKKyAgICAvKiBUcml2aWFsIGNhc2VzLCB3aGVyZSB3ZSBlaXRoZXIgcmV0dXJuIGluYXJncyBpdHNlbGYsIG9yIGEgc2xpY2Ugb2YgaXQuICovCisgICAgaWYgKGFyZ3R5cGVzID09IE5VTEwgfHwgcGFyYW1mbGFncyA9PSBOVUxMIHx8IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpID09IDApIHsKICNpZmRlZiBNU19XSU4zMgotCQlpZiAoc2VsZi0+aW5kZXgpCi0JCQlyZXR1cm4gUHlUdXBsZV9HZXRTbGljZShpbmFyZ3MsIDEsIFB5VHVwbGVfR0VUX1NJWkUoaW5hcmdzKSk7CisgICAgICAgIGlmIChzZWxmLT5pbmRleCkKKyAgICAgICAgICAgIHJldHVybiBQeVR1cGxlX0dldFNsaWNlKGluYXJncywgMSwgUHlUdXBsZV9HRVRfU0laRShpbmFyZ3MpKTsKICNlbmRpZgotCQlQeV9JTkNSRUYoaW5hcmdzKTsKLQkJcmV0dXJuIGluYXJnczsKLQl9CisgICAgICAgIFB5X0lOQ1JFRihpbmFyZ3MpOworICAgICAgICByZXR1cm4gaW5hcmdzOworICAgIH0KIAotCWxlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpOwotCWNhbGxhcmdzID0gUHlUdXBsZV9OZXcobGVuKTsgLyogdGhlIGFyZ3VtZW50IHR1cGxlIHdlIGJ1aWxkICovCi0JaWYgKGNhbGxhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGxlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpOworICAgIGNhbGxhcmdzID0gUHlUdXBsZV9OZXcobGVuKTsgLyogdGhlIGFyZ3VtZW50IHR1cGxlIHdlIGJ1aWxkICovCisgICAgaWYgKGNhbGxhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgTVNfV0lOMzIKLQkvKiBGb3IgYSBDT00gbWV0aG9kLCBza2lwIHRoZSBmaXJzdCBhcmcgKi8KLQlpZiAoc2VsZi0+aW5kZXgpIHsKLQkJaW5hcmdzX2luZGV4ID0gMTsKLQl9CisgICAgLyogRm9yIGEgQ09NIG1ldGhvZCwgc2tpcCB0aGUgZmlyc3QgYXJnICovCisgICAgaWYgKHNlbGYtPmluZGV4KSB7CisgICAgICAgIGluYXJnc19pbmRleCA9IDE7CisgICAgfQogI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShwYXJhbWZsYWdzLCBpKTsKLQkJUHlPYmplY3QgKm9iOwotCQlpbnQgZmxhZzsKLQkJY2hhciAqbmFtZSA9IE5VTEw7Ci0JCVB5T2JqZWN0ICpkZWZ2YWwgPSBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyYW1mbGFncywgaSk7CisgICAgICAgIFB5T2JqZWN0ICpvYjsKKyAgICAgICAgaW50IGZsYWc7CisgICAgICAgIGNoYXIgKm5hbWUgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqZGVmdmFsID0gTlVMTDsKIAotCQkvKiBUaGlzIHdheSBzZWVtcyB0byBiZSB+MiB1cyBmYXN0ZXIgdGhhbiB0aGUgUHlBcmdfUGFyc2VUdXBsZQotCQkgICBjYWxscyBiZWxvdy4gKi8KLQkJLyogV2UgSEFWRSBhbHJlYWR5IGNoZWNrZWQgdGhhdCB0aGUgdHVwbGUgY2FuIGJlIHBhcnNlZCB3aXRoICJpfHpPIiwgc28uLi4gKi8KLQkJUHlfc3NpemVfdCB0c2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoaXRlbSk7Ci0JCWZsYWcgPSBQeUludF9BU19MT05HKFB5VHVwbGVfR0VUX0lURU0oaXRlbSwgMCkpOwotCQluYW1lID0gdHNpemUgPiAxID8gUHlTdHJpbmdfQVNfU1RSSU5HKFB5VHVwbGVfR0VUX0lURU0oaXRlbSwgMSkpIDogTlVMTDsKLQkJZGVmdmFsID0gdHNpemUgPiAyID8gUHlUdXBsZV9HRVRfSVRFTShpdGVtLCAyKSA6IE5VTEw7CisgICAgICAgIC8qIFRoaXMgd2F5IHNlZW1zIHRvIGJlIH4yIHVzIGZhc3RlciB0aGFuIHRoZSBQeUFyZ19QYXJzZVR1cGxlCisgICAgICAgICAgIGNhbGxzIGJlbG93LiAqLworICAgICAgICAvKiBXZSBIQVZFIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSB0dXBsZSBjYW4gYmUgcGFyc2VkIHdpdGggIml8ek8iLCBzby4uLiAqLworICAgICAgICBQeV9zc2l6ZV90IHRzaXplID0gUHlUdXBsZV9HRVRfU0laRShpdGVtKTsKKyAgICAgICAgZmxhZyA9IFB5SW50X0FTX0xPTkcoUHlUdXBsZV9HRVRfSVRFTShpdGVtLCAwKSk7CisgICAgICAgIG5hbWUgPSB0c2l6ZSA+IDEgPyBQeVN0cmluZ19BU19TVFJJTkcoUHlUdXBsZV9HRVRfSVRFTShpdGVtLCAxKSkgOiBOVUxMOworICAgICAgICBkZWZ2YWwgPSB0c2l6ZSA+IDIgPyBQeVR1cGxlX0dFVF9JVEVNKGl0ZW0sIDIpIDogTlVMTDsKIAotCQlzd2l0Y2ggKGZsYWcgJiAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUIHwgUEFSQU1GTEFHX0ZMQ0lEKSkgewotCQljYXNlIFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRkxDSUQ6Ci0JCQkvKiBbJ2luJywgJ2xjaWQnXSBwYXJhbWV0ZXIuICBBbHdheXMgdGFrZW4gZnJvbSBkZWZ2YWwsCi0JCQkgaWYgZ2l2ZW4sIGVsc2UgdGhlIGludGVnZXIgMC4gKi8KLQkJCWlmIChkZWZ2YWwgPT0gTlVMTCkgewotCQkJCWRlZnZhbCA9IFB5SW50X0Zyb21Mb25nKDApOwotCQkJCWlmIChkZWZ2YWwgPT0gTlVMTCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCX0gZWxzZQotCQkJCVB5X0lOQ1JFRihkZWZ2YWwpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgaSwgZGVmdmFsKTsKLQkJCWJyZWFrOwotCQljYXNlIChQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZPVVQpOgotCQkJKnBpbm91dG1hc2sgfD0gKDEgPDwgaSk7IC8qIG1hcmsgYXMgaW5vdXQgYXJnICovCi0JCQkoKnBudW1yZXR2YWxzKSsrOwotCQkJLyogZmFsbCB0aHJvdWdoIHRvIFBBUkFNRkxBR19GSU4uLi4gKi8KLQkJY2FzZSAwOgotCQljYXNlIFBBUkFNRkxBR19GSU46Ci0JCQkvKiAnaW4nIHBhcmFtZXRlci4gIENvcHkgaXQgZnJvbSBpbmFyZ3MuICovCi0JCQlvYiA9X2dldF9hcmcoJmluYXJnc19pbmRleCwgbmFtZSwgZGVmdmFsLCBpbmFyZ3MsIGt3ZHMpOwotCQkJaWYgKG9iID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJCVB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIGksIG9iKTsKLQkJCWJyZWFrOwotCQljYXNlIFBBUkFNRkxBR19GT1VUOgotCQkJLyogWFhYIFJlZmFjdG9yIHRoaXMgY29kZSBpbnRvIGEgc2VwYXJhdGUgZnVuY3Rpb24uICovCi0JCQkvKiAnb3V0JyBwYXJhbWV0ZXIuCi0JCQkgICBhcmd0eXBlc1tpXSBtdXN0IGJlIGEgUE9JTlRFUiB0byBhIGMgdHlwZS4KKyAgICAgICAgc3dpdGNoIChmbGFnICYgKFBBUkFNRkxBR19GSU4gfCBQQVJBTUZMQUdfRk9VVCB8IFBBUkFNRkxBR19GTENJRCkpIHsKKyAgICAgICAgY2FzZSBQQVJBTUZMQUdfRklOIHwgUEFSQU1GTEFHX0ZMQ0lEOgorICAgICAgICAgICAgLyogWydpbicsICdsY2lkJ10gcGFyYW1ldGVyLiAgQWx3YXlzIHRha2VuIGZyb20gZGVmdmFsLAorICAgICAgICAgICAgIGlmIGdpdmVuLCBlbHNlIHRoZSBpbnRlZ2VyIDAuICovCisgICAgICAgICAgICBpZiAoZGVmdmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBkZWZ2YWwgPSBQeUludF9Gcm9tTG9uZygwKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVmdmFsID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZGVmdmFsKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIGksIGRlZnZhbCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAoUEFSQU1GTEFHX0ZJTiB8IFBBUkFNRkxBR19GT1VUKToKKyAgICAgICAgICAgICpwaW5vdXRtYXNrIHw9ICgxIDw8IGkpOyAvKiBtYXJrIGFzIGlub3V0IGFyZyAqLworICAgICAgICAgICAgKCpwbnVtcmV0dmFscykrKzsKKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0byBQQVJBTUZMQUdfRklOLi4uICovCisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSBQQVJBTUZMQUdfRklOOgorICAgICAgICAgICAgLyogJ2luJyBwYXJhbWV0ZXIuICBDb3B5IGl0IGZyb20gaW5hcmdzLiAqLworICAgICAgICAgICAgb2IgPV9nZXRfYXJnKCZpbmFyZ3NfaW5kZXgsIG5hbWUsIGRlZnZhbCwgaW5hcmdzLCBrd2RzKTsKKyAgICAgICAgICAgIGlmIChvYiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBpLCBvYik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQVJBTUZMQUdfRk9VVDoKKyAgICAgICAgICAgIC8qIFhYWCBSZWZhY3RvciB0aGlzIGNvZGUgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uLiAqLworICAgICAgICAgICAgLyogJ291dCcgcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgYXJndHlwZXNbaV0gbXVzdCBiZSBhIFBPSU5URVIgdG8gYSBjIHR5cGUuCiAKLQkJCSAgIENhbm5vdCBieSBzdXBwbGllZCBpbiBpbmFyZ3MsIGJ1dCBhIGRlZnZhbCB3aWxsIGJlIHVzZWQKLQkJCSAgIGlmIGF2YWlsYWJsZS4gIFhYWCBTaG91bGQgd2Ugc3VwcG9ydCBnZXR0aW5nIGl0IGZyb20ga3dkcz8KLQkJCSovCi0JCQlpZiAoZGVmdmFsKSB7Ci0JCQkJLyogWFhYIFVzaW5nIG11dGFibGUgb2JqZWN0cyBhcyBkZWZ2YWwgd2lsbAotCQkJCSAgIG1ha2UgdGhlIGZ1bmN0aW9uIG5vbi10aHJlYWRzYWZlLCB1bmxlc3Mgd2UKLQkJCQkgICBjb3B5IHRoZSBvYmplY3QgaW4gZWFjaCBpbnZvY2F0aW9uICovCi0JCQkJUHlfSU5DUkVGKGRlZnZhbCk7Ci0JCQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgaSwgZGVmdmFsKTsKLQkJCQkqcG91dG1hc2sgfD0gKDEgPDwgaSk7IC8qIG1hcmsgYXMgb3V0IGFyZyAqLwotCQkJCSgqcG51bXJldHZhbHMpKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvYiA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHlwZXMsIGkpOwotCQkJZGljdCA9IFB5VHlwZV9zdGdkaWN0KG9iKTsKLQkJCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJCQkvKiBDYW5ub3QgaGFwcGVuOiBfdmFsaWRhdGVfcGFyYW1mbGFncygpCi0JCQkJICB3b3VsZCBub3QgYWNjZXB0IHN1Y2ggYW4gb2JqZWN0ICovCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJICAgICAiTlVMTCBzdGdkaWN0IHVuZXhwZWN0ZWQiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKFB5U3RyaW5nX0NoZWNrKGRpY3QtPnByb3RvKSkgewotCQkJCVB5RXJyX0Zvcm1hdCgKLQkJCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiJXMgJ291dCcgcGFyYW1ldGVyIG11c3QgYmUgcGFzc2VkIGFzIGRlZmF1bHQgdmFsdWUiLAotCQkJCQkoKFB5VHlwZU9iamVjdCAqKW9iKS0+dHBfbmFtZSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmIChBcnJheVR5cGVPYmplY3RfQ2hlY2sob2IpKQotCQkJCW9iID0gUHlPYmplY3RfQ2FsbE9iamVjdChvYiwgTlVMTCk7Ci0JCQllbHNlCi0JCQkJLyogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBwb2ludGVkLXRvIHR5cGUgKi8KLQkJCQlvYiA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZGljdC0+cHJvdG8sIE5VTEwpOwotCQkJLyoJCQkgICAKLQkJCSAgIFhYWCBJcyB0aGUgZm9sbG93aW5nIGNvcnJlY3QgYW55IGxvbmdlcj8KLQkJCSAgIFdlIG11c3Qgbm90IHBhc3MgYSBieXJlZigpIHRvIHRoZSBhcnJheSB0aGVuIGJ1dAotCQkJICAgdGhlIGFycmF5IGluc3RhbmNlIGl0c2VsZi4gVGhlbiwgd2UgY2Fubm90IHJldHJpdmUKLQkJCSAgIHRoZSByZXN1bHQgZnJvbSB0aGUgUHlDQXJnT2JqZWN0LgotCQkJKi8KLQkJCWlmIChvYiA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQkvKiBUaGUgLmZyb21fcGFyYW0gY2FsbCB0aGF0IHdpbGwgb2N1cnIgbGF0ZXIgd2lsbCBwYXNzIHRoaXMKLQkJCSAgIGFzIGEgYnlyZWYgcGFyYW1ldGVyLiAqLwotCQkJUHlUdXBsZV9TRVRfSVRFTShjYWxsYXJncywgaSwgb2IpOwotCQkJKnBvdXRtYXNrIHw9ICgxIDw8IGkpOyAvKiBtYXJrIGFzIG91dCBhcmcgKi8KLQkJCSgqcG51bXJldHZhbHMpKys7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgInBhcmFtZmxhZyAlZCBub3QgeWV0IGltcGxlbWVudGVkIiwgZmxhZyk7Ci0JCQlnb3RvIGVycm9yOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICBDYW5ub3QgYnkgc3VwcGxpZWQgaW4gaW5hcmdzLCBidXQgYSBkZWZ2YWwgd2lsbCBiZSB1c2VkCisgICAgICAgICAgICAgICBpZiBhdmFpbGFibGUuICBYWFggU2hvdWxkIHdlIHN1cHBvcnQgZ2V0dGluZyBpdCBmcm9tIGt3ZHM/CisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGRlZnZhbCkgeworICAgICAgICAgICAgICAgIC8qIFhYWCBVc2luZyBtdXRhYmxlIG9iamVjdHMgYXMgZGVmdmFsIHdpbGwKKyAgICAgICAgICAgICAgICAgICBtYWtlIHRoZSBmdW5jdGlvbiBub24tdGhyZWFkc2FmZSwgdW5sZXNzIHdlCisgICAgICAgICAgICAgICAgICAgY29weSB0aGUgb2JqZWN0IGluIGVhY2ggaW52b2NhdGlvbiAqLworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihkZWZ2YWwpOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIGksIGRlZnZhbCk7CisgICAgICAgICAgICAgICAgKnBvdXRtYXNrIHw9ICgxIDw8IGkpOyAvKiBtYXJrIGFzIG91dCBhcmcgKi8KKyAgICAgICAgICAgICAgICAoKnBudW1yZXR2YWxzKSsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2IgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R5cGVzLCBpKTsKKyAgICAgICAgICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdChvYik7CisgICAgICAgICAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogQ2Fubm90IGhhcHBlbjogX3ZhbGlkYXRlX3BhcmFtZmxhZ3MoKQorICAgICAgICAgICAgICAgICAgd291bGQgbm90IGFjY2VwdCBzdWNoIGFuIG9iamVjdCAqLworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIHN0Z2RpY3QgdW5leHBlY3RlZCIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGljdC0+cHJvdG8pKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICIlcyAnb3V0JyBwYXJhbWV0ZXIgbXVzdCBiZSBwYXNzZWQgYXMgZGVmYXVsdCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICgoUHlUeXBlT2JqZWN0ICopb2IpLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEFycmF5VHlwZU9iamVjdF9DaGVjayhvYikpCisgICAgICAgICAgICAgICAgb2IgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG9iLCBOVUxMKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHBvaW50ZWQtdG8gdHlwZSAqLworICAgICAgICAgICAgICAgIG9iID0gUHlPYmplY3RfQ2FsbE9iamVjdChkaWN0LT5wcm90bywgTlVMTCk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgWFhYIElzIHRoZSBmb2xsb3dpbmcgY29ycmVjdCBhbnkgbG9uZ2VyPworICAgICAgICAgICAgICAgV2UgbXVzdCBub3QgcGFzcyBhIGJ5cmVmKCkgdG8gdGhlIGFycmF5IHRoZW4gYnV0CisgICAgICAgICAgICAgICB0aGUgYXJyYXkgaW5zdGFuY2UgaXRzZWxmLiBUaGVuLCB3ZSBjYW5ub3QgcmV0cml2ZQorICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBmcm9tIHRoZSBQeUNBcmdPYmplY3QuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG9iID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIC8qIFRoZSAuZnJvbV9wYXJhbSBjYWxsIHRoYXQgd2lsbCBvY3VyciBsYXRlciB3aWxsIHBhc3MgdGhpcworICAgICAgICAgICAgICAgYXMgYSBieXJlZiBwYXJhbWV0ZXIuICovCisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBpLCBvYik7CisgICAgICAgICAgICAqcG91dG1hc2sgfD0gKDEgPDwgaSk7IC8qIG1hcmsgYXMgb3V0IGFyZyAqLworICAgICAgICAgICAgKCpwbnVtcmV0dmFscykrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtZmxhZyAlZCBub3QgeWV0IGltcGxlbWVudGVkIiwgZmxhZyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBXZSBoYXZlIGNvdW50ZWQgdGhlIGFyZ3VtZW50cyB3ZSBoYXZlIGNvbnN1bWVkIGluICdpbmFyZ3NfaW5kZXgnLiAgVGhpcwotCSAgIG11c3QgYmUgdGhlIHNhbWUgYXMgbGVuKGluYXJncykgKyBsZW4oa3dkcyksIG90aGVyd2lzZSB3ZSBoYXZlCi0JICAgZWl0aGVyIHRvbyBtdWNoIG9yIG5vdCBlbm91Z2ggYXJndW1lbnRzLiAqLworICAgIC8qIFdlIGhhdmUgY291bnRlZCB0aGUgYXJndW1lbnRzIHdlIGhhdmUgY29uc3VtZWQgaW4gJ2luYXJnc19pbmRleCcuICBUaGlzCisgICAgICAgbXVzdCBiZSB0aGUgc2FtZSBhcyBsZW4oaW5hcmdzKSArIGxlbihrd2RzKSwgb3RoZXJ3aXNlIHdlIGhhdmUKKyAgICAgICBlaXRoZXIgdG9vIG11Y2ggb3Igbm90IGVub3VnaCBhcmd1bWVudHMuICovCiAKLQlhY3R1YWxfYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUoaW5hcmdzKSArIChrd2RzID8gUHlEaWN0X1NpemUoa3dkcykgOiAwKTsKLQlpZiAoYWN0dWFsX2FyZ3MgIT0gaW5hcmdzX2luZGV4KSB7Ci0JCS8qIFdoZW4gd2UgaGF2ZSBkZWZhdWx0IHZhbHVlcyBvciBuYW1lZCBwYXJhbWV0ZXJzLCB0aGlzIGVycm9yCi0JCSAgIG1lc3NhZ2UgaXMgbWlzbGVhZGluZy4gIFNlZSB1bml0dGVzdHMvdGVzdF9wYXJhbWZsYWdzLnB5Ci0JCSAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgIGFjdHVhbF9hcmdzID0gUHlUdXBsZV9HRVRfU0laRShpbmFyZ3MpICsgKGt3ZHMgPyBQeURpY3RfU2l6ZShrd2RzKSA6IDApOworICAgIGlmIChhY3R1YWxfYXJncyAhPSBpbmFyZ3NfaW5kZXgpIHsKKyAgICAgICAgLyogV2hlbiB3ZSBoYXZlIGRlZmF1bHQgdmFsdWVzIG9yIG5hbWVkIHBhcmFtZXRlcnMsIHRoaXMgZXJyb3IKKyAgICAgICAgICAgbWVzc2FnZSBpcyBtaXNsZWFkaW5nLiAgU2VlIHVuaXR0ZXN0cy90ZXN0X3BhcmFtZmxhZ3MucHkKKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSAgICAgImNhbGwgdGFrZXMgZXhhY3RseSAlZCBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAiY2FsbCB0YWtlcyBleGFjdGx5ICVkIGFyZ3VtZW50cyAoJWQgZ2l2ZW4pIiwKICNlbHNlCi0JCQkgICAgICJjYWxsIHRha2VzIGV4YWN0bHkgJWQgYXJndW1lbnRzICglemQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICJjYWxsIHRha2VzIGV4YWN0bHkgJWQgYXJndW1lbnRzICglemQgZ2l2ZW4pIiwKICNlbmRpZgotCQkJICAgICBpbmFyZ3NfaW5kZXgsIGFjdHVhbF9hcmdzKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgICAgICAgICAgICAgICAgICBpbmFyZ3NfaW5kZXgsIGFjdHVhbF9hcmdzKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBvdXRtYXNrIGlzIGEgYml0bWFzayBjb250YWluaW5nIGluZGV4ZXMgaW50byBjYWxsYXJncy4gIEl0ZW1zIGF0Ci0JICAgdGhlc2UgaW5kZXhlcyBjb250YWluIHZhbHVlcyB0byByZXR1cm4uCi0JICovCi0JcmV0dXJuIGNhbGxhcmdzOworICAgIC8qIG91dG1hc2sgaXMgYSBiaXRtYXNrIGNvbnRhaW5pbmcgaW5kZXhlcyBpbnRvIGNhbGxhcmdzLiAgSXRlbXMgYXQKKyAgICAgICB0aGVzZSBpbmRleGVzIGNvbnRhaW4gdmFsdWVzIHRvIHJldHVybi4KKyAgICAgKi8KKyAgICByZXR1cm4gY2FsbGFyZ3M7CiAgIGVycm9yOgotCVB5X0RFQ1JFRihjYWxsYXJncyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogU2VlIGFsc286CkBAIC0zNzA2LDMwOCArMzcwNiwzMDggQEAKICovCiBzdGF0aWMgUHlPYmplY3QgKgogX2J1aWxkX3Jlc3VsdChQeU9iamVjdCAqcmVzdWx0LCBQeU9iamVjdCAqY2FsbGFyZ3MsCi0JICAgICAgaW50IG91dG1hc2ssIGludCBpbm91dG1hc2ssIHVuc2lnbmVkIGludCBudW1yZXR2YWxzKQorICAgICAgICAgICAgICBpbnQgb3V0bWFzaywgaW50IGlub3V0bWFzaywgdW5zaWduZWQgaW50IG51bXJldHZhbHMpCiB7Ci0JdW5zaWduZWQgaW50IGksIGluZGV4OwotCWludCBiaXQ7Ci0JUHlPYmplY3QgKnR1cCA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGksIGluZGV4OworICAgIGludCBiaXQ7CisgICAgUHlPYmplY3QgKnR1cCA9IE5VTEw7CiAKLQlpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlpZiAocmVzdWx0ID09IE5VTEwgfHwgbnVtcmV0dmFscyA9PSAwKSB7Ci0JCVB5X0RFQ1JFRihjYWxsYXJncyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCVB5X0RFQ1JFRihyZXN1bHQpOworICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCBudW1yZXR2YWxzID09IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAKLQkvKiB0dXAgd2lsbCBub3QgYmUgYWxsb2NhdGVkIGlmIG51bXJldHZhbHMgPT0gMSAqLwotCS8qIGFsbG9jYXRlIHR1cGxlIHRvIGhvbGQgdGhlIHJlc3VsdCAqLwotCWlmIChudW1yZXR2YWxzID4gMSkgewotCQl0dXAgPSBQeVR1cGxlX05ldyhudW1yZXR2YWxzKTsKLQkJaWYgKHR1cCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgLyogdHVwIHdpbGwgbm90IGJlIGFsbG9jYXRlZCBpZiBudW1yZXR2YWxzID09IDEgKi8KKyAgICAvKiBhbGxvY2F0ZSB0dXBsZSB0byBob2xkIHRoZSByZXN1bHQgKi8KKyAgICBpZiAobnVtcmV0dmFscyA+IDEpIHsKKyAgICAgICAgdHVwID0gUHlUdXBsZV9OZXcobnVtcmV0dmFscyk7CisgICAgICAgIGlmICh0dXAgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JaW5kZXggPSAwOwotCWZvciAoYml0ID0gMSwgaSA9IDA7IGkgPCAzMjsgKytpLCBiaXQgPDw9IDEpIHsKLQkJUHlPYmplY3QgKnY7Ci0JCWlmIChiaXQgJiBpbm91dG1hc2spIHsKLQkJCXYgPSBQeVR1cGxlX0dFVF9JVEVNKGNhbGxhcmdzLCBpKTsKLQkJCVB5X0lOQ1JFRih2KTsKLQkJCWlmIChudW1yZXR2YWxzID09IDEpIHsKLQkJCQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCQkJCXJldHVybiB2OwotCQkJfQotCQkJUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGluZGV4LCB2KTsKLQkJCWluZGV4Kys7Ci0JCX0gZWxzZSBpZiAoYml0ICYgb3V0bWFzaykgewotCQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oY2FsbGFyZ3MsIGkpOwotCQkJdiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodiwgIl9fY3R5cGVzX2Zyb21fb3V0cGFyYW1fXyIsIE5VTEwpOwotCQkJaWYgKHYgPT0gTlVMTCB8fCBudW1yZXR2YWxzID09IDEpIHsKLQkJCQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCQkJCXJldHVybiB2OwotCQkJfQotCQkJUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGluZGV4LCB2KTsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJaWYgKGluZGV4ID09IG51bXJldHZhbHMpCi0JCQlicmVhazsKLQl9CisgICAgaW5kZXggPSAwOworICAgIGZvciAoYml0ID0gMSwgaSA9IDA7IGkgPCAzMjsgKytpLCBiaXQgPDw9IDEpIHsKKyAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgIGlmIChiaXQgJiBpbm91dG1hc2spIHsKKyAgICAgICAgICAgIHYgPSBQeVR1cGxlX0dFVF9JVEVNKGNhbGxhcmdzLCBpKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIGlmIChudW1yZXR2YWxzID09IDEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGluZGV4LCB2KTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0gZWxzZSBpZiAoYml0ICYgb3V0bWFzaykgeworICAgICAgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oY2FsbGFyZ3MsIGkpOworICAgICAgICAgICAgdiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodiwgIl9fY3R5cGVzX2Zyb21fb3V0cGFyYW1fXyIsIE5VTEwpOworICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCBudW1yZXR2YWxzID09IDEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGluZGV4LCB2KTsKKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluZGV4ID09IG51bXJldHZhbHMpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCXJldHVybiB0dXA7CisgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICByZXR1cm4gdHVwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0Z1bmNQdHJfY2FsbChDRnVuY1B0ck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmluYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnJlc3R5cGU7Ci0JUHlPYmplY3QgKmNvbnZlcnRlcnM7Ci0JUHlPYmplY3QgKmNoZWNrZXI7Ci0JUHlPYmplY3QgKmFyZ3R5cGVzOwotCVN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKmNhbGxhcmdzOwotCVB5T2JqZWN0ICplcnJjaGVjazsKKyAgICBQeU9iamVjdCAqcmVzdHlwZTsKKyAgICBQeU9iamVjdCAqY29udmVydGVyczsKKyAgICBQeU9iamVjdCAqY2hlY2tlcjsKKyAgICBQeU9iamVjdCAqYXJndHlwZXM7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqY2FsbGFyZ3M7CisgICAgUHlPYmplY3QgKmVycmNoZWNrOwogI2lmZGVmIE1TX1dJTjMyCi0JSVVua25vd24gKnBpdW5rID0gTlVMTDsKKyAgICBJVW5rbm93biAqcGl1bmsgPSBOVUxMOwogI2VuZGlmCi0Jdm9pZCAqcFByb2MgPSBOVUxMOworICAgIHZvaWQgKnBQcm9jID0gTlVMTDsKIAotCWludCBpbm91dG1hc2s7Ci0JaW50IG91dG1hc2s7Ci0JdW5zaWduZWQgaW50IG51bXJldHZhbHM7CisgICAgaW50IGlub3V0bWFzazsKKyAgICBpbnQgb3V0bWFzazsKKyAgICB1bnNpZ25lZCBpbnQgbnVtcmV0dmFsczsKIAotCWFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENGdW5jUHRyT2JqZWN0IGluc3RhbmNlcyAqLwotCXJlc3R5cGUgPSBzZWxmLT5yZXN0eXBlID8gc2VsZi0+cmVzdHlwZSA6IGRpY3QtPnJlc3R5cGU7Ci0JY29udmVydGVycyA9IHNlbGYtPmNvbnZlcnRlcnMgPyBzZWxmLT5jb252ZXJ0ZXJzIDogZGljdC0+Y29udmVydGVyczsKLQljaGVja2VyID0gc2VsZi0+Y2hlY2tlciA/IHNlbGYtPmNoZWNrZXIgOiBkaWN0LT5jaGVja2VyOwotCWFyZ3R5cGVzID0gc2VsZi0+YXJndHlwZXMgPyBzZWxmLT5hcmd0eXBlcyA6IGRpY3QtPmFyZ3R5cGVzOworICAgIGFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENGdW5jUHRyT2JqZWN0IGluc3RhbmNlcyAqLworICAgIHJlc3R5cGUgPSBzZWxmLT5yZXN0eXBlID8gc2VsZi0+cmVzdHlwZSA6IGRpY3QtPnJlc3R5cGU7CisgICAgY29udmVydGVycyA9IHNlbGYtPmNvbnZlcnRlcnMgPyBzZWxmLT5jb252ZXJ0ZXJzIDogZGljdC0+Y29udmVydGVyczsKKyAgICBjaGVja2VyID0gc2VsZi0+Y2hlY2tlciA/IHNlbGYtPmNoZWNrZXIgOiBkaWN0LT5jaGVja2VyOworICAgIGFyZ3R5cGVzID0gc2VsZi0+YXJndHlwZXMgPyBzZWxmLT5hcmd0eXBlcyA6IGRpY3QtPmFyZ3R5cGVzOwogLyogbGF0ZXIsIHdlIHByb2JhYmx5IHdhbnQgdG8gaGF2ZSBhbiBlcnJjaGVjayBmaWVsZCBpbiBzdGdkaWN0ICovCi0JZXJyY2hlY2sgPSBzZWxmLT5lcnJjaGVjayAvKiA/IHNlbGYtPmVycmNoZWNrIDogZGljdC0+ZXJyY2hlY2sgKi87CisgICAgZXJyY2hlY2sgPSBzZWxmLT5lcnJjaGVjayAvKiA/IHNlbGYtPmVycmNoZWNrIDogZGljdC0+ZXJyY2hlY2sgKi87CiAKIAotCXBQcm9jID0gKih2b2lkICoqKXNlbGYtPmJfcHRyOworICAgIHBQcm9jID0gKih2b2lkICoqKXNlbGYtPmJfcHRyOwogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKHNlbGYtPmluZGV4KSB7Ci0JCS8qIEl0J3MgYSBDT00gbWV0aG9kICovCi0JCUNEYXRhT2JqZWN0ICp0aGlzOwotCQl0aGlzID0gKENEYXRhT2JqZWN0ICopUHlUdXBsZV9HZXRJdGVtKGluYXJncywgMCk7IC8qIGJvcnJvd2VkIHJlZiEgKi8KLQkJaWYgKCF0aGlzKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIm5hdGl2ZSBjb20gbWV0aG9kIGNhbGwgd2l0aG91dCAndGhpcycgcGFyYW1ldGVyIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKHRoaXMpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiRXhwZWN0ZWQgYSBDT00gdGhpcyBwb2ludGVyIGFzIGZpcnN0IGFyZ3VtZW50Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiB0aGVyZSBzaG91bGQgYmUgbW9yZSBjaGVja3M/IE5vLCBpbiBQeXRob24gKi8KLQkJLyogRmlyc3QgYXJnIGlzIGFuIHBvaW50ZXIgdG8gYW4gaW50ZXJmYWNlIGluc3RhbmNlICovCi0JCWlmICghdGhpcy0+Yl9wdHIgfHwgKih2b2lkICoqKXRoaXMtPmJfcHRyID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiTlVMTCBDT00gcG9pbnRlciBhY2Nlc3MiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXBpdW5rID0gKihJVW5rbm93biAqKil0aGlzLT5iX3B0cjsKLQkJaWYgKE5VTEwgPT0gcGl1bmstPmxwVnRibCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJDT00gbWV0aG9kIGNhbGwgd2l0aG91dCBWVGFibGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXBQcm9jID0gKCh2b2lkICoqKXBpdW5rLT5scFZ0YmwpW3NlbGYtPmluZGV4IC0gMHgxMDAwXTsKLQl9CisgICAgaWYgKHNlbGYtPmluZGV4KSB7CisgICAgICAgIC8qIEl0J3MgYSBDT00gbWV0aG9kICovCisgICAgICAgIENEYXRhT2JqZWN0ICp0aGlzOworICAgICAgICB0aGlzID0gKENEYXRhT2JqZWN0ICopUHlUdXBsZV9HZXRJdGVtKGluYXJncywgMCk7IC8qIGJvcnJvd2VkIHJlZiEgKi8KKyAgICAgICAgaWYgKCF0aGlzKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmF0aXZlIGNvbSBtZXRob2QgY2FsbCB3aXRob3V0ICd0aGlzJyBwYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICghQ0RhdGFPYmplY3RfQ2hlY2sodGhpcykpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgQ09NIHRoaXMgcG9pbnRlciBhcyBmaXJzdCBhcmd1bWVudCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogdGhlcmUgc2hvdWxkIGJlIG1vcmUgY2hlY2tzPyBObywgaW4gUHl0aG9uICovCisgICAgICAgIC8qIEZpcnN0IGFyZyBpcyBhbiBwb2ludGVyIHRvIGFuIGludGVyZmFjZSBpbnN0YW5jZSAqLworICAgICAgICBpZiAoIXRoaXMtPmJfcHRyIHx8ICoodm9pZCAqKil0aGlzLT5iX3B0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBDT00gcG9pbnRlciBhY2Nlc3MiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHBpdW5rID0gKihJVW5rbm93biAqKil0aGlzLT5iX3B0cjsKKyAgICAgICAgaWYgKE5VTEwgPT0gcGl1bmstPmxwVnRibCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPTSBtZXRob2QgY2FsbCB3aXRob3V0IFZUYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcFByb2MgPSAoKHZvaWQgKiopcGl1bmstPmxwVnRibClbc2VsZi0+aW5kZXggLSAweDEwMDBdOworICAgIH0KICNlbmRpZgotCWNhbGxhcmdzID0gX2J1aWxkX2NhbGxhcmdzKHNlbGYsIGFyZ3R5cGVzLAotCQkJCSAgIGluYXJncywga3dkcywKLQkJCQkgICAmb3V0bWFzaywgJmlub3V0bWFzaywgJm51bXJldHZhbHMpOwotCWlmIChjYWxsYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjYWxsYXJncyA9IF9idWlsZF9jYWxsYXJncyhzZWxmLCBhcmd0eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmFyZ3MsIGt3ZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dG1hc2ssICZpbm91dG1hc2ssICZudW1yZXR2YWxzKTsKKyAgICBpZiAoY2FsbGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoY29udmVydGVycykgewotCQlpbnQgcmVxdWlyZWQgPSBQeV9TQUZFX0RPV05DQVNUKFB5VHVwbGVfR0VUX1NJWkUoY29udmVydGVycyksCi0JCQkJCSAgICAgICAgUHlfc3NpemVfdCwgaW50KTsKLQkJaW50IGFjdHVhbCA9IFB5X1NBRkVfRE9XTkNBU1QoUHlUdXBsZV9HRVRfU0laRShjYWxsYXJncyksCi0JCQkJCSAgICAgIFB5X3NzaXplX3QsIGludCk7CisgICAgaWYgKGNvbnZlcnRlcnMpIHsKKyAgICAgICAgaW50IHJlcXVpcmVkID0gUHlfU0FGRV9ET1dOQ0FTVChQeVR1cGxlX0dFVF9TSVpFKGNvbnZlcnRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QsIGludCk7CisgICAgICAgIGludCBhY3R1YWwgPSBQeV9TQUZFX0RPV05DQVNUKFB5VHVwbGVfR0VUX1NJWkUoY2FsbGFyZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90LCBpbnQpOwogCi0JCWlmICgoZGljdC0+ZmxhZ3MgJiBGVU5DRkxBR19DREVDTCkgPT0gRlVOQ0ZMQUdfQ0RFQ0wpIHsKLQkJCS8qIEZvciBjZGVjbCBmdW5jdGlvbnMsIHdlIGFsbG93IG1vcmUgYWN0dWFsIGFyZ3VtZW50cwotCQkJICAgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBhcmd0eXBlcyB0dXBsZS4KLQkJCSovCi0JCQlpZiAocmVxdWlyZWQgPiBhY3R1YWwpIHsKLQkJCQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICJ0aGlzIGZ1bmN0aW9uIHRha2VzIGF0IGxlYXN0ICVkIGFyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCi0JCQkJCSAgICAgcmVxdWlyZWQsCi0JCQkJCSAgICAgcmVxdWlyZWQgPT0gMSA/ICIiIDogInMiLAotCQkJCQkgICAgIGFjdHVhbCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocmVxdWlyZWQgIT0gYWN0dWFsKSB7Ci0JCQlQeV9ERUNSRUYoY2FsbGFyZ3MpOwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgInRoaXMgZnVuY3Rpb24gdGFrZXMgJWQgYXJndW1lbnQlcyAoJWQgZ2l2ZW4pIiwKLQkJCQkgICAgIHJlcXVpcmVkLAotCQkJCSAgICAgcmVxdWlyZWQgPT0gMSA/ICIiIDogInMiLAotCQkJCSAgICAgYWN0dWFsKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgICAgICBpZiAoKGRpY3QtPmZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpID09IEZVTkNGTEFHX0NERUNMKSB7CisgICAgICAgICAgICAvKiBGb3IgY2RlY2wgZnVuY3Rpb25zLCB3ZSBhbGxvdyBtb3JlIGFjdHVhbCBhcmd1bWVudHMKKyAgICAgICAgICAgICAgIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgYXJndHlwZXMgdHVwbGUuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHJlcXVpcmVkID4gYWN0dWFsKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAidGhpcyBmdW5jdGlvbiB0YWtlcyBhdCBsZWFzdCAlZCBhcmd1bWVudCVzICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCA9PSAxID8gIiIgOiAicyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJlcXVpcmVkICE9IGFjdHVhbCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhcmdzKTsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJ0aGlzIGZ1bmN0aW9uIHRha2VzICVkIGFyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXJlc3VsdCA9IF9DYWxsUHJvYyhwUHJvYywKLQkJCSAgIGNhbGxhcmdzLAorICAgIHJlc3VsdCA9IF9DYWxsUHJvYyhwUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFyZ3MsCiAjaWZkZWYgTVNfV0lOMzIKLQkJCSAgIHBpdW5rLAotCQkJICAgc2VsZi0+aWlkLAorICAgICAgICAgICAgICAgICAgICAgICBwaXVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aWlkLAogI2VuZGlmCi0JCQkgICBkaWN0LT5mbGFncywKLQkJCSAgIGNvbnZlcnRlcnMsCi0JCQkgICByZXN0eXBlLAotCQkJICAgY2hlY2tlcik7CisgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICByZXN0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyKTsKIC8qIFRoZSAnZXJyY2hlY2snIHByb3RvY29sICovCi0JaWYgKHJlc3VsdCAhPSBOVUxMICYmIGVycmNoZWNrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhlcnJjaGVjaywKLQkJCQkJCQkgICByZXN1bHQsCi0JCQkJCQkJICAgc2VsZiwKLQkJCQkJCQkgICBjYWxsYXJncywKLQkJCQkJCQkgICBOVUxMKTsKLQkJLyogSWYgdGhlIGVycmNoZWNrIGZ1bnRpb24gZmFpbGVkLCByZXR1cm4gTlVMTC4KLQkJICAgSWYgdGhlIGVycmNoZWNrIGZ1bmN0aW9uIHJldHVybmVkIGNhbGxhcmdzIHVuY2hhbmdlZCwKLQkJICAgY29udGludWUgbm9ybWFsIHByb2Nlc3NpbmcuCi0JCSAgIElmIHRoZSBlcnJjaGVjayBmdW5jdGlvbiByZXR1cm5lZCBzb21ldGhpbmcgZWxzZSwKLQkJICAgdXNlIHRoYXQgYXMgcmVzdWx0LgotCQkqLwotCQlpZiAodiA9PSBOVUxMIHx8IHYgIT0gY2FsbGFyZ3MpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJUHlfREVDUkVGKGNhbGxhcmdzKTsKLQkJCXJldHVybiB2OwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIGVycmNoZWNrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhlcnJjaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAvKiBJZiB0aGUgZXJyY2hlY2sgZnVudGlvbiBmYWlsZWQsIHJldHVybiBOVUxMLgorICAgICAgICAgICBJZiB0aGUgZXJyY2hlY2sgZnVuY3Rpb24gcmV0dXJuZWQgY2FsbGFyZ3MgdW5jaGFuZ2VkLAorICAgICAgICAgICBjb250aW51ZSBub3JtYWwgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgSWYgdGhlIGVycmNoZWNrIGZ1bmN0aW9uIHJldHVybmVkIHNvbWV0aGluZyBlbHNlLAorICAgICAgICAgICB1c2UgdGhhdCBhcyByZXN1bHQuCisgICAgICAgICovCisgICAgICAgIGlmICh2ID09IE5VTEwgfHwgdiAhPSBjYWxsYXJncykgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIAotCXJldHVybiBfYnVpbGRfcmVzdWx0KHJlc3VsdCwgY2FsbGFyZ3MsCi0JCQkgICAgIG91dG1hc2ssIGlub3V0bWFzaywgbnVtcmV0dmFscyk7CisgICAgcmV0dXJuIF9idWlsZF9yZXN1bHQocmVzdWx0LCBjYWxsYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRtYXNrLCBpbm91dG1hc2ssIG51bXJldHZhbHMpOwogfQogCiBzdGF0aWMgaW50CiBDRnVuY1B0cl90cmF2ZXJzZShDRnVuY1B0ck9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoc2VsZi0+Y2FsbGFibGUpOwotCVB5X1ZJU0lUKHNlbGYtPnJlc3R5cGUpOwotCVB5X1ZJU0lUKHNlbGYtPmNoZWNrZXIpOwotCVB5X1ZJU0lUKHNlbGYtPmVycmNoZWNrKTsKLQlQeV9WSVNJVChzZWxmLT5hcmd0eXBlcyk7Ci0JUHlfVklTSVQoc2VsZi0+Y29udmVydGVycyk7Ci0JUHlfVklTSVQoc2VsZi0+cGFyYW1mbGFncyk7Ci0JUHlfVklTSVQoc2VsZi0+dGh1bmspOwotCXJldHVybiBDRGF0YV90cmF2ZXJzZSgoQ0RhdGFPYmplY3QgKilzZWxmLCB2aXNpdCwgYXJnKTsKKyAgICBQeV9WSVNJVChzZWxmLT5jYWxsYWJsZSk7CisgICAgUHlfVklTSVQoc2VsZi0+cmVzdHlwZSk7CisgICAgUHlfVklTSVQoc2VsZi0+Y2hlY2tlcik7CisgICAgUHlfVklTSVQoc2VsZi0+ZXJyY2hlY2spOworICAgIFB5X1ZJU0lUKHNlbGYtPmFyZ3R5cGVzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5wYXJhbWZsYWdzKTsKKyAgICBQeV9WSVNJVChzZWxmLT50aHVuayk7CisgICAgcmV0dXJuIENEYXRhX3RyYXZlcnNlKChDRGF0YU9iamVjdCAqKXNlbGYsIHZpc2l0LCBhcmcpOwogfQogCiBzdGF0aWMgaW50CiBDRnVuY1B0cl9jbGVhcihDRnVuY1B0ck9iamVjdCAqc2VsZikKIHsKLQlQeV9DTEVBUihzZWxmLT5jYWxsYWJsZSk7Ci0JUHlfQ0xFQVIoc2VsZi0+cmVzdHlwZSk7Ci0JUHlfQ0xFQVIoc2VsZi0+Y2hlY2tlcik7Ci0JUHlfQ0xFQVIoc2VsZi0+ZXJyY2hlY2spOwotCVB5X0NMRUFSKHNlbGYtPmFyZ3R5cGVzKTsKLQlQeV9DTEVBUihzZWxmLT5jb252ZXJ0ZXJzKTsKLQlQeV9DTEVBUihzZWxmLT5wYXJhbWZsYWdzKTsKLQlQeV9DTEVBUihzZWxmLT50aHVuayk7Ci0JcmV0dXJuIENEYXRhX2NsZWFyKChDRGF0YU9iamVjdCAqKXNlbGYpOworICAgIFB5X0NMRUFSKHNlbGYtPmNhbGxhYmxlKTsKKyAgICBQeV9DTEVBUihzZWxmLT5yZXN0eXBlKTsKKyAgICBQeV9DTEVBUihzZWxmLT5jaGVja2VyKTsKKyAgICBQeV9DTEVBUihzZWxmLT5lcnJjaGVjayk7CisgICAgUHlfQ0xFQVIoc2VsZi0+YXJndHlwZXMpOworICAgIFB5X0NMRUFSKHNlbGYtPmNvbnZlcnRlcnMpOworICAgIFB5X0NMRUFSKHNlbGYtPnBhcmFtZmxhZ3MpOworICAgIFB5X0NMRUFSKHNlbGYtPnRodW5rKTsKKyAgICByZXR1cm4gQ0RhdGFfY2xlYXIoKENEYXRhT2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyB2b2lkCiBDRnVuY1B0cl9kZWFsbG9jKENGdW5jUHRyT2JqZWN0ICpzZWxmKQogewotCUNGdW5jUHRyX2NsZWFyKHNlbGYpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgQ0Z1bmNQdHJfY2xlYXIoc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENGdW5jUHRyX3JlcHIoQ0Z1bmNQdHJPYmplY3QgKnNlbGYpCiB7CiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoc2VsZi0+aW5kZXgpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Q09NIG1ldGhvZCBvZmZzZXQgJWQ6ICVzIGF0ICVwPiIsCi0JCQkJCSAgIHNlbGYtPmluZGV4IC0gMHgxMDAwLAotCQkJCQkgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAotCQkJCQkgICBzZWxmKTsKKyAgICBpZiAoc2VsZi0+aW5kZXgpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Q09NIG1ldGhvZCBvZmZzZXQgJWQ6ICVzIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmluZGV4IC0gMHgxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKICNlbmRpZgotCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgb2JqZWN0IGF0ICVwPiIsCi0JCQkJICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKLQkJCQkgICBzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIENGdW5jUHRyX25vbnplcm8oQ0Z1bmNQdHJPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuICgoKih2b2lkICoqKXNlbGYtPmJfcHRyICE9IE5VTEwpCisgICAgcmV0dXJuICgoKih2b2lkICoqKXNlbGYtPmJfcHRyICE9IE5VTEwpCiAjaWZkZWYgTVNfV0lOMzIKLQkJfHwgKHNlbGYtPmluZGV4ICE9IDApCisgICAgICAgIHx8IChzZWxmLT5pbmRleCAhPSAwKQogI2VuZGlmCi0JCSk7CisgICAgICAgICk7CiB9CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgQ0Z1bmNQdHJfYXNfbnVtYmVyID0gewotCTAsIC8qIG5iX2FkZCAqLwotCTAsIC8qIG5iX3N1YnRyYWN0ICovCi0JMCwgLyogbmJfbXVsdGlwbHkgKi8KLQkwLCAvKiBuYl9kaXZpZGUgKi8KLQkwLCAvKiBuYl9yZW1haW5kZXIgKi8KLQkwLCAvKiBuYl9kaXZtb2QgKi8KLQkwLCAvKiBuYl9wb3dlciAqLwotCTAsIC8qIG5iX25lZ2F0aXZlICovCi0JMCwgLyogbmJfcG9zaXRpdmUgKi8KLQkwLCAvKiBuYl9hYnNvbHV0ZSAqLwotCShpbnF1aXJ5KUNGdW5jUHRyX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAvKiBuYl9hZGQgKi8KKyAgICAwLCAvKiBuYl9zdWJ0cmFjdCAqLworICAgIDAsIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgLyogbmJfZGl2aWRlICovCisgICAgMCwgLyogbmJfcmVtYWluZGVyICovCisgICAgMCwgLyogbmJfZGl2bW9kICovCisgICAgMCwgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAvKiBuYl9uZWdhdGl2ZSAqLworICAgIDAsIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlDRnVuY1B0cl9ub256ZXJvLCAvKiBuYl9ub256ZXJvICovCiB9OwogCiBQeVR5cGVPYmplY3QgQ0Z1bmNQdHJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5DRnVuY1B0ciIsCi0Jc2l6ZW9mKENGdW5jUHRyT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkoZGVzdHJ1Y3RvcilDRnVuY1B0cl9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylDRnVuY1B0cl9yZXByLAkJLyogdHBfcmVwciAqLwotCSZDRnVuY1B0cl9hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYylDRnVuY1B0cl9jYWxsLAkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkmQ0RhdGFfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCSJGdW5jdGlvbiBQb2ludGVyIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKUNGdW5jUHRyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNGdW5jUHRyX2NsZWFyLAkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlDRnVuY1B0cl9nZXRzZXRzLAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLSAgICAgICAgQ0Z1bmNQdHJfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLkNGdW5jUHRyIiwKKyAgICBzaXplb2YoQ0Z1bmNQdHJPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3RvcilDRnVuY1B0cl9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKUNGdW5jUHRyX3JlcHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJkNGdW5jUHRyX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKUNGdW5jUHRyX2NhbGwsICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZDRGF0YV9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIkZ1bmN0aW9uIFBvaW50ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKUNGdW5jUHRyX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpQ0Z1bmNQdHJfY2xlYXIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIENGdW5jUHRyX2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBDRnVuY1B0cl9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgU3RydWN0X1R5cGUKQEAgLTQwMjIsNjEgKzQwMjIsNjEgQEAKICAqLwogc3RhdGljIGludAogX2luaXRfcG9zX2FyZ3MoUHlPYmplY3QgKnNlbGYsIFB5VHlwZU9iamVjdCAqdHlwZSwKLQkgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLAotCSAgICAgICBpbnQgaW5kZXgpCisgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMsCisgICAgICAgICAgICAgICBpbnQgaW5kZXgpCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlQeU9iamVjdCAqZmllbGRzOwotCWludCBpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmZpZWxkczsKKyAgICBpbnQgaTsKIAotCWlmIChQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlLT50cF9iYXNlKSkgewotCQlpbmRleCA9IF9pbml0X3Bvc19hcmdzKHNlbGYsIHR5cGUtPnRwX2Jhc2UsCi0JCQkJICAgICAgIGFyZ3MsIGt3ZHMsCi0JCQkJICAgICAgIGluZGV4KTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZS0+dHBfYmFzZSkpIHsKKyAgICAgICAgaW5kZXggPSBfaW5pdF9wb3NfYXJncyhzZWxmLCB0eXBlLT50cF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIGt3ZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgICAgICBpZiAoaW5kZXggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOwotCWZpZWxkcyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKWRpY3QsICJfZmllbGRzXyIpOwotCWlmIChmaWVsZHMgPT0gTlVMTCkKLQkJcmV0dXJuIGluZGV4OworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdCgoUHlPYmplY3QgKil0eXBlKTsKKyAgICBmaWVsZHMgPSBQeURpY3RfR2V0SXRlbVN0cmluZygoUHlPYmplY3QgKilkaWN0LCAiX2ZpZWxkc18iKTsKKyAgICBpZiAoZmllbGRzID09IE5VTEwpCisgICAgICAgIHJldHVybiBpbmRleDsKIAotCWZvciAoaSA9IDA7Ci0JICAgICBpIDwgZGljdC0+bGVuZ3RoICYmIChpK2luZGV4KSA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JICAgICArK2kpIHsKLQkJUHlPYmplY3QgKnBhaXIgPSBQeVNlcXVlbmNlX0dldEl0ZW0oZmllbGRzLCBpKTsKLQkJUHlPYmplY3QgKm5hbWUsICp2YWw7Ci0JCWludCByZXM7Ci0JCWlmICghcGFpcikKLQkJCXJldHVybiAtMTsKLQkJbmFtZSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYWlyLCAwKTsKLQkJaWYgKCFuYW1lKSB7Ci0JCQlQeV9ERUNSRUYocGFpcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdmFsID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpICsgaW5kZXgpOwotCQlpZiAoa3dkcyAmJiBQeURpY3RfR2V0SXRlbShrd2RzLCBuYW1lKSkgewotCQkJY2hhciAqZmllbGQgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKLQkJCWlmIChmaWVsZCA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlmaWVsZCA9ICI/Pz8iOwotCQkJfQotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJkdXBsaWNhdGUgdmFsdWVzIGZvciBmaWVsZCAnJXMnIiwKLQkJCQkgICAgIGZpZWxkKTsKLQkJCVB5X0RFQ1JFRihwYWlyKTsKLQkJCVB5X0RFQ1JFRihuYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkKLQkJcmVzID0gUHlPYmplY3RfU2V0QXR0cihzZWxmLCBuYW1lLCB2YWwpOwotCQlQeV9ERUNSRUYocGFpcik7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQkJaWYgKHJlcyA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIGluZGV4ICsgZGljdC0+bGVuZ3RoOworICAgIGZvciAoaSA9IDA7CisgICAgICAgICBpIDwgZGljdC0+bGVuZ3RoICYmIChpK2luZGV4KSA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgICAgICArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKnBhaXIgPSBQeVNlcXVlbmNlX0dldEl0ZW0oZmllbGRzLCBpKTsKKyAgICAgICAgUHlPYmplY3QgKm5hbWUsICp2YWw7CisgICAgICAgIGludCByZXM7CisgICAgICAgIGlmICghcGFpcikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbmFtZSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYWlyLCAwKTsKKyAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdmFsID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpICsgaW5kZXgpOworICAgICAgICBpZiAoa3dkcyAmJiBQeURpY3RfR2V0SXRlbShrd2RzLCBuYW1lKSkgeworICAgICAgICAgICAgY2hhciAqZmllbGQgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKKyAgICAgICAgICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBmaWVsZCA9ICI/Pz8iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIHZhbHVlcyBmb3IgZmllbGQgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQpOworICAgICAgICAgICAgUHlfREVDUkVGKHBhaXIpOworICAgICAgICAgICAgUHlfREVDUkVGKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gUHlPYmplY3RfU2V0QXR0cihzZWxmLCBuYW1lLCB2YWwpOworICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGluZGV4ICsgZGljdC0+bGVuZ3RoOwogfQogCiBzdGF0aWMgaW50CkBAIC00MDg1LDExOSArNDA4NSwxMTkgQEAKIC8qIE9wdGltaXphdGlvbiBwb3NzaWJsZTogU3RvcmUgdGhlIGF0dHJpYnV0ZSBuYW1lcyBfZmllbGRzX1t4XVswXQogICogaW4gQyBhY2Nlc3NpYmxlIGZpZWxkcyBzb21ld2hlcmUgPwogICovCi0JaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3Mgbm90IGEgdHVwbGU/Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykpIHsKLQkJaW50IHJlcyA9IF9pbml0X3Bvc19hcmdzKHNlbGYsIFB5X1RZUEUoc2VsZiksCi0JCQkJCSBhcmdzLCBrd2RzLCAwKTsKLQkJaWYgKHJlcyA9PSAtMSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHJlcyA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJ0b28gbWFueSBpbml0aWFsaXplcnMiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmdzIG5vdCBhIHR1cGxlPyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKSB7CisgICAgICAgIGludCByZXMgPSBfaW5pdF9wb3NfYXJncyhzZWxmLCBQeV9UWVBFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywga3dkcywgMCk7CisgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChyZXMgPCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBpbml0aWFsaXplcnMiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChrd2RzKSB7Ci0JCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLQkJUHlfc3NpemVfdCBwb3MgPSAwOwotCQl3aGlsZShQeURpY3RfTmV4dChrd2RzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCQlpZiAoLTEgPT0gUHlPYmplY3RfU2V0QXR0cihzZWxmLCBrZXksIHZhbHVlKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKGt3ZHMpIHsKKyAgICAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgICAgIHdoaWxlKFB5RGljdF9OZXh0KGt3ZHMsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGlmICgtMSA9PSBQeU9iamVjdF9TZXRBdHRyKHNlbGYsIGtleSwgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJ1Y3RfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5TdHJ1Y3R1cmUiLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJkNEYXRhX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkiU3RydWN0dXJlIGJhc2UgY2xhc3MiLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JU3RydWN0X2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlHZW5lcmljQ0RhdGFfbmV3LAkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuU3RydWN0dXJlIiwKKyAgICBzaXplb2YoQ0RhdGFPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZDRGF0YV9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIlN0cnVjdHVyZSBiYXNlIGNsYXNzIiwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKUNEYXRhX3RyYXZlcnNlLCAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpQ0RhdGFfY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIFN0cnVjdF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBHZW5lcmljQ0RhdGFfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBVbmlvbl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLlVuaW9uIiwKLQlzaXplb2YoQ0RhdGFPYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCSZDRGF0YV9hc19idWZmZXIsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JIlVuaW9uIGJhc2UgY2xhc3MiLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0RhdGFfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KUNEYXRhX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JU3RydWN0X2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlHZW5lcmljQ0RhdGFfbmV3LAkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuVW5pb24iLAorICAgIHNpemVvZihDRGF0YU9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgJkNEYXRhX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAiVW5pb24gYmFzZSBjbGFzcyIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFfdHJhdmVyc2UsICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgU3RydWN0X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIEdlbmVyaWNDRGF0YV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0MCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgogICBBcnJheV9UeXBlCkBAIC00MjA1LDQ2MyArNDIwNSw0NjMgQEAKIHN0YXRpYyBpbnQKIEFycmF5X2luaXQoQ0RhdGFPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3QgbjsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBuOwogCi0JaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZ3Mgbm90IGEgdHVwbGU/Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlQeU9iamVjdCAqdjsKLQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCWlmICgtMSA9PSBQeVNlcXVlbmNlX1NldEl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSwgdikpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3Mgbm90IGEgdHVwbGU/Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIGlmICgtMSA9PSBQeVNlcXVlbmNlX1NldEl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSwgdikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQXJyYXlfaXRlbShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaW5kZXgpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlQeV9zc2l6ZV90IG9mZnNldCwgc2l6ZTsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgUHlfc3NpemVfdCBvZmZzZXQsIHNpemU7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKIAogCi0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzZWxmLT5iX2xlbmd0aCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkiaW52YWxpZCBpbmRleCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzZWxmLT5iX2xlbmd0aCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGluZGV4Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIGFycmF5IGluc3RhbmNlcyAqLwotCS8qIFdvdWxkIGl0IGJlIGNsZWFyZXIgaWYgd2UgZ290IHRoZSBpdGVtIHNpemUgZnJvbQotCSAgIHN0Z2RpY3QtPnByb3RvJ3Mgc3RnZGljdD8KLQkqLwotCXNpemUgPSBzdGdkaWN0LT5zaXplIC8gc3RnZGljdC0+bGVuZ3RoOwotCW9mZnNldCA9IGluZGV4ICogc2l6ZTsKKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBpbnN0YW5jZXMgKi8KKyAgICAvKiBXb3VsZCBpdCBiZSBjbGVhcmVyIGlmIHdlIGdvdCB0aGUgaXRlbSBzaXplIGZyb20KKyAgICAgICBzdGdkaWN0LT5wcm90bydzIHN0Z2RpY3Q/CisgICAgKi8KKyAgICBzaXplID0gc3RnZGljdC0+c2l6ZSAvIHN0Z2RpY3QtPmxlbmd0aDsKKyAgICBvZmZzZXQgPSBpbmRleCAqIHNpemU7CiAKLQlyZXR1cm4gQ0RhdGFfZ2V0KHN0Z2RpY3QtPnByb3RvLCBzdGdkaWN0LT5nZXRmdW5jLCAoUHlPYmplY3QgKilzZWxmLAotCQkJIGluZGV4LCBzaXplLCBzZWxmLT5iX3B0ciArIG9mZnNldCk7CisgICAgcmV0dXJuIENEYXRhX2dldChzdGdkaWN0LT5wcm90bywgc3RnZGljdC0+Z2V0ZnVuYywgKFB5T2JqZWN0ICopc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBzaXplLCBzZWxmLT5iX3B0ciArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBBcnJheV9zbGljZShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKLQlQeU9iamVjdCAqcHJvdG87Ci0JUHlMaXN0T2JqZWN0ICpucDsKLQlQeV9zc2l6ZV90IGksIGxlbjsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKKyAgICBQeU9iamVjdCAqcHJvdG87CisgICAgUHlMaXN0T2JqZWN0ICpucDsKKyAgICBQeV9zc2l6ZV90IGksIGxlbjsKIAotCWlmIChpbG93IDwgMCkKLQkJaWxvdyA9IDA7Ci0JZWxzZSBpZiAoaWxvdyA+IHNlbGYtPmJfbGVuZ3RoKQotCQlpbG93ID0gc2VsZi0+Yl9sZW5ndGg7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKGloaWdoID4gc2VsZi0+Yl9sZW5ndGgpCi0JCWloaWdoID0gc2VsZi0+Yl9sZW5ndGg7Ci0JbGVuID0gaWhpZ2ggLSBpbG93OworICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgZWxzZSBpZiAoaWxvdyA+IHNlbGYtPmJfbGVuZ3RoKQorICAgICAgICBpbG93ID0gc2VsZi0+Yl9sZW5ndGg7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGVsc2UgaWYgKGloaWdoID4gc2VsZi0+Yl9sZW5ndGgpCisgICAgICAgIGloaWdoID0gc2VsZi0+Yl9sZW5ndGg7CisgICAgbGVuID0gaWhpZ2ggLSBpbG93OwogCi0Jc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgYXJyYXkgb2JqZWN0IGluc3RhbmNlcyAqLwotCXByb3RvID0gc3RnZGljdC0+cHJvdG87Ci0JaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JYXNzZXJ0KGl0ZW1kaWN0KTsgLyogcHJvdG8gaXMgdGhlIGl0ZW0gdHlwZSBvZiB0aGUgYXJyYXksIGEgY3R5cGVzCi0JCQkgICAgIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KLQlpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgewotCQljaGFyICpwdHIgPSAoY2hhciAqKXNlbGYtPmJfcHRyOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyICsgaWxvdywgbGVuKTsKKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCisgICAgcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKKyAgICBpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICBhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBhcnJheSwgYSBjdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBzbyB0aGlzIGNhbm5vdCBiZSBOVUxMICovCisgICAgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJjIiktPmdldGZ1bmMpIHsKKyAgICAgICAgY2hhciAqcHRyID0gKGNoYXIgKilzZWxmLT5iX3B0cjsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciArIGlsb3csIGxlbik7CiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKLQl9IGVsc2UgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKLQkJd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKilzZWxmLT5iX3B0cjsKLQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyICsgaWxvdywgbGVuKTsKKyAgICB9IGVsc2UgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKKyAgICAgICAgd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKilzZWxmLT5iX3B0cjsKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyICsgaWxvdywgbGVuKTsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhsZW4pOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhsZW4pOworICAgIGlmIChucCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqdiA9IEFycmF5X2l0ZW0oX3NlbGYsIGkraWxvdyk7Ci0JCVB5TGlzdF9TRVRfSVRFTShucCwgaSwgdik7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilucDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBBcnJheV9pdGVtKF9zZWxmLCBpK2lsb3cpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbnA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBBcnJheV9zdWJzY3JpcHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqaXRlbSkKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CiAKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCQotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gc2VsZi0+Yl9sZW5ndGg7Ci0JCXJldHVybiBBcnJheV9pdGVtKF9zZWxmLCBpKTsKLQl9Ci0JZWxzZSBpZiBQeVNsaWNlX0NoZWNrKGl0ZW0pIHsKLQkJU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OwotCQlQeU9iamVjdCAqcHJvdG87Ci0JCVB5T2JqZWN0ICpucDsKLQkJUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW4sIGN1ciwgaTsKLQkJCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCi0JCQkJCSBzZWxmLT5iX2xlbmd0aCwgJnN0YXJ0LCAmc3RvcCwKLQkJCQkJICZzdGVwLCAmc2xpY2VsZW4pIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJCi0JCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCi0JCXByb3RvID0gc3RnZGljdC0+cHJvdG87Ci0JCWl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCQlhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBhcnJheSwgYQotCQkJCSAgICAgY3R5cGVzIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CiAKLQkJaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJjIiktPmdldGZ1bmMpIHsKLQkJCWNoYXIgKnB0ciA9IChjaGFyICopc2VsZi0+Yl9wdHI7Ci0JCQljaGFyICpkZXN0OworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gc2VsZi0+Yl9sZW5ndGg7CisgICAgICAgIHJldHVybiBBcnJheV9pdGVtKF9zZWxmLCBpKTsKKyAgICB9CisgICAgZWxzZSBpZiBQeVNsaWNlX0NoZWNrKGl0ZW0pIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OworICAgICAgICBQeU9iamVjdCAqcHJvdG87CisgICAgICAgIFB5T2JqZWN0ICpucDsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW4sIGN1ciwgaTsKIAotCQkJaWYgKHNsaWNlbGVuIDw9IDApCi0JCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCQkJaWYgKHN0ZXAgPT0gMSkgewotCQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIgKyBzdGFydCwKLQkJCQkJCQkJICBzbGljZWxlbik7Ci0JCQl9Ci0JCQlkZXN0ID0gKGNoYXIgKilQeU1lbV9NYWxsb2Moc2xpY2VsZW4pOworICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Yl9sZW5ndGgsICZzdGFydCwgJnN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RlcCwgJnNsaWNlbGVuKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJCWlmIChkZXN0ID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgICAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCisgICAgICAgIHByb3RvID0gc3RnZGljdC0+cHJvdG87CisgICAgICAgIGl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOworICAgICAgICBhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBhcnJheSwgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZXMgdHlwZSwgc28gdGhpcyBjYW5ub3QgYmUgTlVMTCAqLwogCi0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOwotCQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkJZGVzdFtpXSA9IHB0cltjdXJdOwotCQkJfQorICAgICAgICBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICAgICAgY2hhciAqcHRyID0gKGNoYXIgKilzZWxmLT5iX3B0cjsKKyAgICAgICAgICAgIGNoYXIgKmRlc3Q7CiAKLQkJCW5wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGVzdCwgc2xpY2VsZW4pOwotCQkJUHlNZW1fRnJlZShkZXN0KTsKLQkJCXJldHVybiBucDsKLQkJfQorICAgICAgICAgICAgaWYgKHNsaWNlbGVuIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICAgICAgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdCA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuKTsKKworICAgICAgICAgICAgaWYgKGRlc3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBwdHJbY3VyXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkZXN0LCBzbGljZWxlbik7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGRlc3QpOworICAgICAgICAgICAgcmV0dXJuIG5wOworICAgICAgICB9CiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKLQkJaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKLQkJCXdjaGFyX3QgKnB0ciA9ICh3Y2hhcl90ICopc2VsZi0+Yl9wdHI7Ci0JCQl3Y2hhcl90ICpkZXN0OwotCQkJCi0JCQlpZiAoc2xpY2VsZW4gPD0gMCkKLQkJCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApOwotCQkJaWYgKHN0ZXAgPT0gMSkgewotCQkJCXJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHB0ciArIHN0YXJ0LAotCQkJCQkJCSAgICAgIHNsaWNlbGVuKTsKLQkJCX0KKyAgICAgICAgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKKyAgICAgICAgICAgIHdjaGFyX3QgKnB0ciA9ICh3Y2hhcl90ICopc2VsZi0+Yl9wdHI7CisgICAgICAgICAgICB3Y2hhcl90ICpkZXN0OwogCi0JCQlkZXN0ID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2MoCi0JCQkJCQlzbGljZWxlbiAqIHNpemVvZih3Y2hhcl90KSk7Ci0JCQkKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47Ci0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlkZXN0W2ldID0gcHRyW2N1cl07Ci0JCQl9Ci0JCQkKLQkJCW5wID0gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihkZXN0LCBzbGljZWxlbik7Ci0JCQlQeU1lbV9GcmVlKGRlc3QpOwotCQkJcmV0dXJuIG5wOwotCQl9CisgICAgICAgICAgICBpZiAoc2xpY2VsZW4gPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIDApOworICAgICAgICAgICAgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHB0ciArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlbGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVzdCA9ICh3Y2hhcl90ICopUHlNZW1fTWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VsZW4gKiBzaXplb2Yod2NoYXJfdCkpOworCisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOworICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IHB0cltjdXJdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBucCA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoZGVzdCwgc2xpY2VsZW4pOworICAgICAgICAgICAgUHlNZW1fRnJlZShkZXN0KTsKKyAgICAgICAgICAgIHJldHVybiBucDsKKyAgICAgICAgfQogI2VuZGlmCiAKLQkJbnAgPSBQeUxpc3RfTmV3KHNsaWNlbGVuKTsKLQkJaWYgKG5wID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgbnAgPSBQeUxpc3RfTmV3KHNsaWNlbGVuKTsKKyAgICAgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOwotCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCVB5T2JqZWN0ICp2ID0gQXJyYXlfaXRlbShfc2VsZiwgY3VyKTsKLQkJCVB5TGlzdF9TRVRfSVRFTShucCwgaSwgdik7Ci0JCX0KLQkJcmV0dXJuIG5wOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJImluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47CisgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBBcnJheV9pdGVtKF9zZWxmLCBjdXIpOworICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKG5wLCBpLCB2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKIH0KIAogc3RhdGljIGludAogQXJyYXlfYXNzX2l0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGluZGV4LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKLQlQeV9zc2l6ZV90IHNpemUsIG9mZnNldDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCWNoYXIgKnB0cjsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIFB5X3NzaXplX3Qgc2l6ZSwgb2Zmc2V0OworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CisgICAgY2hhciAqcHRyOwogCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiQXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0Jc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgYXJyYXkgb2JqZWN0IGluc3RhbmNlcyAqLwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc3RnZGljdC0+bGVuZ3RoKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJpbnZhbGlkIGluZGV4Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2l6ZSA9IHN0Z2RpY3QtPnNpemUgLyBzdGdkaWN0LT5sZW5ndGg7Ci0Jb2Zmc2V0ID0gaW5kZXggKiBzaXplOwotCXB0ciA9IHNlbGYtPmJfcHRyICsgb2Zmc2V0OworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gQ0RhdGFfc2V0KChQeU9iamVjdCAqKXNlbGYsIHN0Z2RpY3QtPnByb3RvLCBzdGdkaWN0LT5zZXRmdW5jLCB2YWx1ZSwKLQkJCSBpbmRleCwgc2l6ZSwgcHRyKTsKKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBhcnJheSBvYmplY3QgaW5zdGFuY2VzICovCisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzdGdkaWN0LT5sZW5ndGgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBpbmRleCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNpemUgPSBzdGdkaWN0LT5zaXplIC8gc3RnZGljdC0+bGVuZ3RoOworICAgIG9mZnNldCA9IGluZGV4ICogc2l6ZTsKKyAgICBwdHIgPSBzZWxmLT5iX3B0ciArIG9mZnNldDsKKworICAgIHJldHVybiBDRGF0YV9zZXQoKFB5T2JqZWN0ICopc2VsZiwgc3RnZGljdC0+cHJvdG8sIHN0Z2RpY3QtPnNldGZ1bmMsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHNpemUsIHB0cik7CiB9CiAKIHN0YXRpYyBpbnQKIEFycmF5X2Fzc19zbGljZShQeU9iamVjdCAqX3NlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCwgUHlPYmplY3QgKnZhbHVlKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlfc3NpemVfdCBpLCBsZW47CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBQeV9zc2l6ZV90IGksIGxlbjsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIkFycmF5IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWVsc2UgaWYgKGlsb3cgPiBzZWxmLT5iX2xlbmd0aCkKLQkJaWxvdyA9IHNlbGYtPmJfbGVuZ3RoOwotCWlmIChpaGlnaCA8IDApCi0JCWloaWdoID0gMDsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JZWxzZSBpZiAoaWhpZ2ggPiBzZWxmLT5iX2xlbmd0aCkKLQkJaWhpZ2ggPSBzZWxmLT5iX2xlbmd0aDsKKyAgICBpZiAoaWxvdyA8IDApCisgICAgICAgIGlsb3cgPSAwOworICAgIGVsc2UgaWYgKGlsb3cgPiBzZWxmLT5iX2xlbmd0aCkKKyAgICAgICAgaWxvdyA9IHNlbGYtPmJfbGVuZ3RoOworICAgIGlmIChpaGlnaCA8IDApCisgICAgICAgIGloaWdoID0gMDsKKyAgICBpZiAoaWhpZ2ggPCBpbG93KQorICAgICAgICBpaGlnaCA9IGlsb3c7CisgICAgZWxzZSBpZiAoaWhpZ2ggPiBzZWxmLT5iX2xlbmd0aCkKKyAgICAgICAgaWhpZ2ggPSBzZWxmLT5iX2xlbmd0aDsKIAotCWxlbiA9IFB5U2VxdWVuY2VfTGVuZ3RoKHZhbHVlKTsKLQlpZiAobGVuICE9IGloaWdoIC0gaWxvdykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiQ2FuIG9ubHkgYXNzaWduIHNlcXVlbmNlIG9mIHNhbWUgc2l6ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbSh2YWx1ZSwgaSk7Ci0JCWludCByZXN1bHQ7Ci0JCWlmIChpdGVtID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJlc3VsdCA9IEFycmF5X2Fzc19pdGVtKF9zZWxmLCBpK2lsb3csIGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCWlmIChyZXN1bHQgPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGxlbiA9IFB5U2VxdWVuY2VfTGVuZ3RoKHZhbHVlKTsKKyAgICBpZiAobGVuICE9IGloaWdoIC0gaWxvdykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2FtZSBzaXplIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHZhbHVlLCBpKTsKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmVzdWx0ID0gQXJyYXlfYXNzX2l0ZW0oX3NlbGYsIGkraWxvdywgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIEFycmF5X2Fzc19zdWJzY3JpcHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqaXRlbSwgUHlPYmplY3QgKnZhbHVlKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiQXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKIAotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJCi0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gc2VsZi0+Yl9sZW5ndGg7Ci0JCXJldHVybiBBcnJheV9hc3NfaXRlbShfc2VsZiwgaSwgdmFsdWUpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuLCBvdGhlcmxlbiwgaSwgY3VyOwotCQkKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwKLQkJCQkJIHNlbGYtPmJfbGVuZ3RoLCAmc3RhcnQsICZzdG9wLAotCQkJCQkgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKChzdGVwIDwgMCAmJiBzdGFydCA8IHN0b3ApIHx8Ci0JCSAgICAoc3RlcCA+IDAgJiYgc3RhcnQgPiBzdG9wKSkKLQkJCXN0b3AgPSBzdGFydDsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFycmF5IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JCW90aGVybGVuID0gUHlTZXF1ZW5jZV9MZW5ndGgodmFsdWUpOwotCQlpZiAob3RoZXJsZW4gIT0gc2xpY2VsZW4pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJDYW4gb25seSBhc3NpZ24gc2VxdWVuY2Ugb2Ygc2FtZSBzaXplIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBvdGhlcmxlbjsgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJUHlPYmplY3QgKml0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0odmFsdWUsIGkpOwotCQkJaW50IHJlc3VsdDsKLQkJCWlmIChpdGVtID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmVzdWx0ID0gQXJyYXlfYXNzX2l0ZW0oX3NlbGYsIGN1ciwgaXRlbSk7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlpZiAocmVzdWx0ID09IC0xKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImluZGljZXMgbXVzdCBiZSBpbnRlZ2VyIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworCisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gc2VsZi0+Yl9sZW5ndGg7CisgICAgICAgIHJldHVybiBBcnJheV9hc3NfaXRlbShfc2VsZiwgaSwgdmFsdWUpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuLCBvdGhlcmxlbiwgaSwgY3VyOworCisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5iX2xlbmd0aCwgJnN0YXJ0LCAmc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGVwLCAmc2xpY2VsZW4pIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICgoc3RlcCA8IDAgJiYgc3RhcnQgPCBzdG9wKSB8fAorICAgICAgICAgICAgKHN0ZXAgPiAwICYmIHN0YXJ0ID4gc3RvcCkpCisgICAgICAgICAgICBzdG9wID0gc3RhcnQ7CisKKyAgICAgICAgb3RoZXJsZW4gPSBQeVNlcXVlbmNlX0xlbmd0aCh2YWx1ZSk7CisgICAgICAgIGlmIChvdGhlcmxlbiAhPSBzbGljZWxlbikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgIkNhbiBvbmx5IGFzc2lnbiBzZXF1ZW5jZSBvZiBzYW1lIHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IG90aGVybGVuOyBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbSh2YWx1ZSwgaSk7CisgICAgICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXN1bHQgPSBBcnJheV9hc3NfaXRlbShfc2VsZiwgY3VyLCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbmRpY2VzIG11c3QgYmUgaW50ZWdlciIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogQXJyYXlfbGVuZ3RoKFB5T2JqZWN0ICpfc2VsZikKIHsKLQlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwotCXJldHVybiBzZWxmLT5iX2xlbmd0aDsKKyAgICBDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOworICAgIHJldHVybiBzZWxmLT5iX2xlbmd0aDsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIEFycmF5X2FzX3NlcXVlbmNlID0gewotCUFycmF5X2xlbmd0aCwJCQkJLyogc3FfbGVuZ3RoOyAqLwotCTAsCQkJCQkvKiBzcV9jb25jYXQ7ICovCi0JMCwJCQkJCS8qIHNxX3JlcGVhdDsgKi8KLQlBcnJheV9pdGVtLAkJCQkvKiBzcV9pdGVtOyAqLwotCUFycmF5X3NsaWNlLAkJCQkvKiBzcV9zbGljZTsgKi8KLQlBcnJheV9hc3NfaXRlbSwJCQkJLyogc3FfYXNzX2l0ZW07ICovCi0JQXJyYXlfYXNzX3NsaWNlLAkJCS8qIHNxX2Fzc19zbGljZTsgKi8KLQkwLAkJCQkJLyogc3FfY29udGFpbnM7ICovCi0JCi0JMCwJCQkJCS8qIHNxX2lucGxhY2VfY29uY2F0OyAqLwotCTAsCQkJCQkvKiBzcV9pbnBsYWNlX3JlcGVhdDsgKi8KKyAgICBBcnJheV9sZW5ndGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbmNhdDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdDsgKi8KKyAgICBBcnJheV9pdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW07ICovCisgICAgQXJyYXlfc2xpY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9zbGljZTsgKi8KKyAgICBBcnJheV9hc3NfaXRlbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19pdGVtOyAqLworICAgIEFycmF5X2Fzc19zbGljZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX3NsaWNlOyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29udGFpbnM7ICovCisKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfY29uY2F0OyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9yZXBlYXQ7ICovCiB9OwogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBBcnJheV9hc19tYXBwaW5nID0gewotCUFycmF5X2xlbmd0aCwKLQlBcnJheV9zdWJzY3JpcHQsCi0JQXJyYXlfYXNzX3N1YnNjcmlwdCwKKyAgICBBcnJheV9sZW5ndGgsCisgICAgQXJyYXlfc3Vic2NyaXB0LAorICAgIEFycmF5X2Fzc19zdWJzY3JpcHQsCiB9OwogCiBQeVR5cGVPYmplY3QgQXJyYXlfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5BcnJheSIsCi0Jc2l6ZW9mKENEYXRhT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkwLAkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZBcnJheV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZBcnJheV9hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCSZDRGF0YV9hc19idWZmZXIsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JIlhYWCB0byBiZSBwcm92aWRlZCIsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylDRGF0YV90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpQ0RhdGFfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpQXJyYXlfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0gICAgICAgIEdlbmVyaWNDRGF0YV9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5BcnJheSIsCisgICAgc2l6ZW9mKENEYXRhT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJkFycmF5X2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZBcnJheV9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAmQ0RhdGFfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgICJYWFggdG8gYmUgcHJvdmlkZWQiLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylDRGF0YV90cmF2ZXJzZSwgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KUNEYXRhX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2MpQXJyYXlfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgR2VuZXJpY0NEYXRhX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIFB5T2JqZWN0ICoKIENyZWF0ZUFycmF5VHlwZShQeU9iamVjdCAqaXRlbXR5cGUsIFB5X3NzaXplX3QgbGVuZ3RoKQogewotCXN0YXRpYyBQeU9iamVjdCAqY2FjaGU7Ci0JUHlPYmplY3QgKmtleTsKLQlQeU9iamVjdCAqcmVzdWx0OwotCWNoYXIgbmFtZVsyNTZdOwotCVB5T2JqZWN0ICpsZW47CisgICAgc3RhdGljIFB5T2JqZWN0ICpjYWNoZTsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciBuYW1lWzI1Nl07CisgICAgUHlPYmplY3QgKmxlbjsKIAotCWlmIChjYWNoZSA9PSBOVUxMKSB7Ci0JCWNhY2hlID0gUHlEaWN0X05ldygpOwotCQlpZiAoY2FjaGUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlsZW4gPSBQeUludF9Gcm9tU3NpemVfdChsZW5ndGgpOwotCWlmIChsZW4gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Ja2V5ID0gUHlUdXBsZV9QYWNrKDIsIGl0ZW10eXBlLCBsZW4pOwotCVB5X0RFQ1JFRihsZW4pOwotCWlmICgha2V5KQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeURpY3RfR2V0SXRlbVByb3h5KGNhY2hlLCBrZXkpOwotCWlmIChyZXN1bHQpIHsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICBpZiAoY2FjaGUgPT0gTlVMTCkgeworICAgICAgICBjYWNoZSA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGNhY2hlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGVuID0gUHlJbnRfRnJvbVNzaXplX3QobGVuZ3RoKTsKKyAgICBpZiAobGVuID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGtleSA9IFB5VHVwbGVfUGFjaygyLCBpdGVtdHlwZSwgbGVuKTsKKyAgICBQeV9ERUNSRUYobGVuKTsKKyAgICBpZiAoIWtleSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW1Qcm94eShjYWNoZSwga2V5KTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQlpZiAoIVB5VHlwZV9DaGVjayhpdGVtdHlwZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiRXhwZWN0ZWQgYSB0eXBlIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeVR5cGVfQ2hlY2soaXRlbXR5cGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSB0eXBlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWZkZWYgTVNfV0lONjQKLQlzcHJpbnRmKG5hbWUsICIlLjIwMHNfQXJyYXlfJUlkIiwKLQkJKChQeVR5cGVPYmplY3QgKilpdGVtdHlwZSktPnRwX25hbWUsIGxlbmd0aCk7CisgICAgc3ByaW50ZihuYW1lLCAiJS4yMDBzX0FycmF5XyVJZCIsCisgICAgICAgICgoUHlUeXBlT2JqZWN0ICopaXRlbXR5cGUpLT50cF9uYW1lLCBsZW5ndGgpOwogI2Vsc2UKLQlzcHJpbnRmKG5hbWUsICIlLjIwMHNfQXJyYXlfJWxkIiwKLQkJKChQeVR5cGVPYmplY3QgKilpdGVtdHlwZSktPnRwX25hbWUsIChsb25nKWxlbmd0aCk7CisgICAgc3ByaW50ZihuYW1lLCAiJS4yMDBzX0FycmF5XyVsZCIsCisgICAgICAgICgoUHlUeXBlT2JqZWN0ICopaXRlbXR5cGUpLT50cF9uYW1lLCAobG9uZylsZW5ndGgpOwogI2VuZGlmCiAKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJkFycmF5VHlwZV9UeXBlLAorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikmQXJyYXlUeXBlX1R5cGUsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCQkgICAgICAgInMoTyl7czppLHM6T30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicyhPKXtzOmksczpPfSIsCiAjZWxzZQotCQkJCSAgICAgICAicyhPKXtzOm4sczpPfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzKE8pe3M6bixzOk99IiwKICNlbmRpZgotCQkJCSAgICAgICBuYW1lLAotCQkJCSAgICAgICAmQXJyYXlfVHlwZSwKLQkJCQkgICAgICAgIl9sZW5ndGhfIiwKLQkJCQkgICAgICAgbGVuZ3RoLAotCQkJCSAgICAgICAiX3R5cGVfIiwKLQkJCQkgICAgICAgaXRlbXR5cGUKLQkJKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoLTEgPT0gUHlEaWN0X1NldEl0ZW1Qcm94eShjYWNoZSwga2V5LCByZXN1bHQpKSB7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihrZXkpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZBcnJheV9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2xlbmd0aF8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtdHlwZQorICAgICAgICApOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgtMSA9PSBQeURpY3RfU2V0SXRlbVByb3h5KGNhY2hlLCBrZXksIHJlc3VsdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgU2ltcGxlX1R5cGUKQEAgLTQ2NzAsMTY3ICs0NjcwLDE2NyBAQAogc3RhdGljIGludAogU2ltcGxlX3NldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JU3RnRGljdE9iamVjdCAqZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlhc3NlcnQoZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBDRGF0YU9iamVjdCBpbnN0YW5jZXMgKi8KLQlhc3NlcnQoZGljdC0+c2V0ZnVuYyk7Ci0JcmVzdWx0ID0gZGljdC0+c2V0ZnVuYyhzZWxmLT5iX3B0ciwgdmFsdWUsIGRpY3QtPnNpemUpOwotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXNzZXJ0KGRpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgQ0RhdGFPYmplY3QgaW5zdGFuY2VzICovCisgICAgYXNzZXJ0KGRpY3QtPnNldGZ1bmMpOworICAgIHJlc3VsdCA9IGRpY3QtPnNldGZ1bmMoc2VsZi0+Yl9wdHIsIHZhbHVlLCBkaWN0LT5zaXplKTsKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JLyogY29uc3VtZXMgdGhlIHJlZmNvdW50IHRoZSBzZXRmdW5jIHJldHVybnMgKi8KLQlyZXR1cm4gS2VlcFJlZihzZWxmLCAwLCByZXN1bHQpOworICAgIC8qIGNvbnN1bWVzIHRoZSByZWZjb3VudCB0aGUgc2V0ZnVuYyByZXR1cm5zICovCisgICAgcmV0dXJuIEtlZXBSZWYoc2VsZiwgMCwgcmVzdWx0KTsKIH0KIAogc3RhdGljIGludAogU2ltcGxlX2luaXQoQ0RhdGFPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnZhbHVlID0gTlVMTDsKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJfX2luaXRfXyIsIDAsIDEsICZ2YWx1ZSkpCi0JCXJldHVybiAtMTsKLQlpZiAodmFsdWUpCi0JCXJldHVybiBTaW1wbGVfc2V0X3ZhbHVlKHNlbGYsIHZhbHVlKTsKLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIl9faW5pdF9fIiwgMCwgMSwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIFNpbXBsZV9zZXRfdmFsdWUoc2VsZiwgdmFsdWUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogU2ltcGxlX2dldF92YWx1ZShDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENEYXRhT2JqZWN0IGluc3RhbmNlcyAqLwotCWFzc2VydChkaWN0LT5nZXRmdW5jKTsKLQlyZXR1cm4gZGljdC0+Z2V0ZnVuYyhzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKTsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIGRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIENEYXRhT2JqZWN0IGluc3RhbmNlcyAqLworICAgIGFzc2VydChkaWN0LT5nZXRmdW5jKTsKKyAgICByZXR1cm4gZGljdC0+Z2V0ZnVuYyhzZWxmLT5iX3B0ciwgc2VsZi0+Yl9zaXplKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIFNpbXBsZV9nZXRzZXRzW10gPSB7Ci0JeyAidmFsdWUiLCAoZ2V0dGVyKVNpbXBsZV9nZXRfdmFsdWUsIChzZXR0ZXIpU2ltcGxlX3NldF92YWx1ZSwKLQkgICJjdXJyZW50IHZhbHVlIiwgTlVMTCB9LAotCXsgTlVMTCwgTlVMTCB9CisgICAgeyAidmFsdWUiLCAoZ2V0dGVyKVNpbXBsZV9nZXRfdmFsdWUsIChzZXR0ZXIpU2ltcGxlX3NldF92YWx1ZSwKKyAgICAgICJjdXJyZW50IHZhbHVlIiwgTlVMTCB9LAorICAgIHsgTlVMTCwgTlVMTCB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogU2ltcGxlX2Zyb21fb3V0cGFybShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKElzU2ltcGxlU3ViVHlwZSgoUHlPYmplY3QgKilQeV9UWVBFKHNlbGYpKSkgewotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiBzZWxmOwotCX0KLQkvKiBjYWxsIHN0Z2RpY3QtPmdldGZ1bmMgKi8KLQlyZXR1cm4gU2ltcGxlX2dldF92YWx1ZSgoQ0RhdGFPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoSXNTaW1wbGVTdWJUeXBlKChQeU9iamVjdCAqKVB5X1RZUEUoc2VsZikpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorICAgIC8qIGNhbGwgc3RnZGljdC0+Z2V0ZnVuYyAqLworICAgIHJldHVybiBTaW1wbGVfZ2V0X3ZhbHVlKChDRGF0YU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU2ltcGxlX21ldGhvZHNbXSA9IHsKLQl7ICJfX2N0eXBlc19mcm9tX291dHBhcmFtX18iLCBTaW1wbGVfZnJvbV9vdXRwYXJtLCBNRVRIX05PQVJHUywgfSwKLQl7IE5VTEwsIE5VTEwgfSwKKyAgICB7ICJfX2N0eXBlc19mcm9tX291dHBhcmFtX18iLCBTaW1wbGVfZnJvbV9vdXRwYXJtLCBNRVRIX05PQVJHUywgfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIHN0YXRpYyBpbnQgU2ltcGxlX25vbnplcm8oQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIG1lbWNtcChzZWxmLT5iX3B0ciwgIlwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwIiwgc2VsZi0+Yl9zaXplKTsKKyAgICByZXR1cm4gbWVtY21wKHNlbGYtPmJfcHRyLCAiXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAiLCBzZWxmLT5iX3NpemUpOwogfQogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIFNpbXBsZV9hc19udW1iZXIgPSB7Ci0JMCwgLyogbmJfYWRkICovCi0JMCwgLyogbmJfc3VidHJhY3QgKi8KLQkwLCAvKiBuYl9tdWx0aXBseSAqLwotCTAsIC8qIG5iX2RpdmlkZSAqLwotCTAsIC8qIG5iX3JlbWFpbmRlciAqLwotCTAsIC8qIG5iX2Rpdm1vZCAqLwotCTAsIC8qIG5iX3Bvd2VyICovCi0JMCwgLyogbmJfbmVnYXRpdmUgKi8KLQkwLCAvKiBuYl9wb3NpdGl2ZSAqLwotCTAsIC8qIG5iX2Fic29sdXRlICovCi0JKGlucXVpcnkpU2ltcGxlX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAvKiBuYl9hZGQgKi8KKyAgICAwLCAvKiBuYl9zdWJ0cmFjdCAqLworICAgIDAsIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgLyogbmJfZGl2aWRlICovCisgICAgMCwgLyogbmJfcmVtYWluZGVyICovCisgICAgMCwgLyogbmJfZGl2bW9kICovCisgICAgMCwgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAvKiBuYl9uZWdhdGl2ZSAqLworICAgIDAsIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlTaW1wbGVfbm9uemVybywgLyogbmJfbm9uemVybyAqLwogfTsKIAogLyogIiVzKCVzKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYudmFsdWUpICovCiBzdGF0aWMgUHlPYmplY3QgKgogU2ltcGxlX3JlcHIoQ0RhdGFPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnZhbCwgKm5hbWUsICphcmdzLCAqcmVzdWx0OwotCXN0YXRpYyBQeU9iamVjdCAqZm9ybWF0OworICAgIFB5T2JqZWN0ICp2YWwsICpuYW1lLCAqYXJncywgKnJlc3VsdDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmZvcm1hdDsKIAotCWlmIChQeV9UWVBFKHNlbGYpLT50cF9iYXNlICE9ICZTaW1wbGVfVHlwZSkgewotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAotCQkJCQkgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLCBzZWxmKTsKLQl9CisgICAgaWYgKFB5X1RZUEUoc2VsZiktPnRwX2Jhc2UgIT0gJlNpbXBsZV9UeXBlKSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgb2JqZWN0IGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIHNlbGYpOworICAgIH0KIAotCWlmIChmb3JtYXQgPT0gTlVMTCkgewotCQlmb3JtYXQgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCIlcyglcikiKTsKLQkJaWYgKGZvcm1hdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBmb3JtYXQgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCIlcyglcikiKTsKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JdmFsID0gU2ltcGxlX2dldF92YWx1ZShzZWxmKTsKLQlpZiAodmFsID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHZhbCA9IFNpbXBsZV9nZXRfdmFsdWUoc2VsZik7CisgICAgaWYgKHZhbCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X1RZUEUoc2VsZiktPnRwX25hbWUpOwotCWlmIChuYW1lID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHZhbCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9UWVBFKHNlbGYpLT50cF9uYW1lKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih2YWwpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlhcmdzID0gUHlUdXBsZV9QYWNrKDIsIG5hbWUsIHZhbCk7Ci0JUHlfREVDUkVGKG5hbWUpOwotCVB5X0RFQ1JFRih2YWwpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMiwgbmFtZSwgdmFsKTsKKyAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgUHlfREVDUkVGKHZhbCk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHQgPSBQeVN0cmluZ19Gb3JtYXQoZm9ybWF0LCBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gb3JtYXQoZm9ybWF0LCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBTaW1wbGVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX2N0eXBlcy5fU2ltcGxlQ0RhdGEiLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpJlNpbXBsZV9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkmU2ltcGxlX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJkNEYXRhX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkiWFhYIHRvIGJlIHByb3ZpZGVkIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKUNEYXRhX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlDRGF0YV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JU2ltcGxlX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCVNpbXBsZV9nZXRzZXRzLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylTaW1wbGVfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0gICAgICAgIEdlbmVyaWNDRGF0YV9uZXcsCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5fU2ltcGxlQ0RhdGEiLAorICAgIHNpemVvZihDRGF0YU9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpJlNpbXBsZV9yZXByLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmU2ltcGxlX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgJkNEYXRhX2FzX2J1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAiWFhYIHRvIGJlIHByb3ZpZGVkIiwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpQ0RhdGFfdHJhdmVyc2UsICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlDRGF0YV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgU2ltcGxlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgU2ltcGxlX2dldHNldHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKVNpbXBsZV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIEdlbmVyaWNDRGF0YV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAgUG9pbnRlcl9UeXBlCkBAIC00ODM4LDQyMCArNDgzOCw0MjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyX2l0ZW0oUHlPYmplY3QgKl9zZWxmLCBQeV9zc2l6ZV90IGluZGV4KQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKLQlQeU9iamVjdCAqcHJvdG87CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKIAotCWlmICgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiTlVMTCBwb2ludGVyIGFjY2VzcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCoodm9pZCAqKilzZWxmLT5iX3B0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgcG9pbnRlciBhY2Nlc3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmb3IgcG9pbnRlciBvYmplY3QgaW5zdGFuY2VzICovCi0JCi0JcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKLQlhc3NlcnQocHJvdG8pOwotCWl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOwotCWFzc2VydChpdGVtZGljdCk7IC8qIHByb3RvIGlzIHRoZSBpdGVtIHR5cGUgb2YgdGhlIHBvaW50ZXIsIGEgY3R5cGVzCi0JCQkgICAgIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KKyAgICBzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIG9iamVjdCBpbnN0YW5jZXMgKi8KIAotCXNpemUgPSBpdGVtZGljdC0+c2l6ZTsKLQlvZmZzZXQgPSBpbmRleCAqIGl0ZW1kaWN0LT5zaXplOworICAgIHByb3RvID0gc3RnZGljdC0+cHJvdG87CisgICAgYXNzZXJ0KHByb3RvKTsKKyAgICBpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKyAgICBhc3NlcnQoaXRlbWRpY3QpOyAvKiBwcm90byBpcyB0aGUgaXRlbSB0eXBlIG9mIHRoZSBwb2ludGVyLCBhIGN0eXBlcworICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHNvIHRoaXMgY2Fubm90IGJlIE5VTEwgKi8KIAotCXJldHVybiBDRGF0YV9nZXQocHJvdG8sIHN0Z2RpY3QtPmdldGZ1bmMsIChQeU9iamVjdCAqKXNlbGYsCi0JCQkgaW5kZXgsIHNpemUsICgqKGNoYXIgKiopc2VsZi0+Yl9wdHIpICsgb2Zmc2V0KTsKKyAgICBzaXplID0gaXRlbWRpY3QtPnNpemU7CisgICAgb2Zmc2V0ID0gaW5kZXggKiBpdGVtZGljdC0+c2l6ZTsKKworICAgIHJldHVybiBDRGF0YV9nZXQocHJvdG8sIHN0Z2RpY3QtPmdldGZ1bmMsIChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICBpbmRleCwgc2l6ZSwgKCooY2hhciAqKilzZWxmLT5iX3B0cikgKyBvZmZzZXQpOwogfQogCiBzdGF0aWMgaW50CiBQb2ludGVyX2Fzc19pdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKnZhbHVlKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKLQlQeU9iamVjdCAqcHJvdG87CisgICAgQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OworICAgIFB5T2JqZWN0ICpwcm90bzsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIlBvaW50ZXIgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJQb2ludGVyIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCoodm9pZCAqKilzZWxmLT5iX3B0ciA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJOVUxMIHBvaW50ZXIgYWNjZXNzIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0Jc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7Ci0JYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLworICAgIGlmICgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIHBvaW50ZXIgYWNjZXNzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlwcm90byA9IHN0Z2RpY3QtPnByb3RvOwotCWFzc2VydChwcm90byk7CisgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLwogCi0JaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JYXNzZXJ0KGl0ZW1kaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgYmVjYXVzZSB0aGUgaXRlbXR5cGUgb2YgYSBwb2ludGVyCi0JCQkgICAgIGlzIGFsd2F5cyBhIGN0eXBlcyB0eXBlICovCisgICAgcHJvdG8gPSBzdGdkaWN0LT5wcm90bzsKKyAgICBhc3NlcnQocHJvdG8pOwogCi0Jc2l6ZSA9IGl0ZW1kaWN0LT5zaXplOwotCW9mZnNldCA9IGluZGV4ICogaXRlbWRpY3QtPnNpemU7CisgICAgaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7CisgICAgYXNzZXJ0KGl0ZW1kaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgYmVjYXVzZSB0aGUgaXRlbXR5cGUgb2YgYSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWx3YXlzIGEgY3R5cGVzIHR5cGUgKi8KIAotCXJldHVybiBDRGF0YV9zZXQoKFB5T2JqZWN0ICopc2VsZiwgcHJvdG8sIHN0Z2RpY3QtPnNldGZ1bmMsIHZhbHVlLAotCQkJIGluZGV4LCBzaXplLCAoKihjaGFyICoqKXNlbGYtPmJfcHRyKSArIG9mZnNldCk7CisgICAgc2l6ZSA9IGl0ZW1kaWN0LT5zaXplOworICAgIG9mZnNldCA9IGluZGV4ICogaXRlbWRpY3QtPnNpemU7CisKKyAgICByZXR1cm4gQ0RhdGFfc2V0KChQeU9iamVjdCAqKXNlbGYsIHByb3RvLCBzdGdkaWN0LT5zZXRmdW5jLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBzaXplLCAoKihjaGFyICoqKXNlbGYtPmJfcHRyKSArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyX2dldF9jb250ZW50cyhDRGF0YU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3Q7CiAKLQlpZiAoKih2b2lkICoqKXNlbGYtPmJfcHRyID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIk5VTEwgcG9pbnRlciBhY2Nlc3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIHBvaW50ZXIgYWNjZXNzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZnIgcG9pbnRlciBpbnN0YW5jZXMgKi8KLQlyZXR1cm4gQ0RhdGFfRnJvbUJhc2VPYmooc3RnZGljdC0+cHJvdG8sCi0JCQkJIChQeU9iamVjdCAqKXNlbGYsIDAsCi0JCQkJICoodm9pZCAqKilzZWxmLT5iX3B0cik7CisgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLworICAgIHJldHVybiBDRGF0YV9Gcm9tQmFzZU9iaihzdGdkaWN0LT5wcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopc2VsZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih2b2lkICoqKXNlbGYtPmJfcHRyKTsKIH0KIAogc3RhdGljIGludAogUG9pbnRlcl9zZXRfY29udGVudHMoQ0RhdGFPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKIHsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwotCUNEYXRhT2JqZWN0ICpkc3Q7Ci0JUHlPYmplY3QgKmtlZXA7CisgICAgU3RnRGljdE9iamVjdCAqc3RnZGljdDsKKyAgICBDRGF0YU9iamVjdCAqZHN0OworICAgIFB5T2JqZWN0ICprZWVwOwogCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiUG9pbnRlciBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZyIHBvaW50ZXIgaW5zdGFuY2VzICovCi0JYXNzZXJ0KHN0Z2RpY3QtPnByb3RvKTsKLQlpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKHZhbHVlKSAKLQkgICAgfHwgMCA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCBzdGdkaWN0LT5wcm90bykpIHsKLQkJLyogWFhYIFB5T2JqZWN0X0lzSW5zdGFuY2UgY291bGQgcmV0dXJuIC0xISAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZXhwZWN0ZWQgJXMgaW5zdGVhZCBvZiAlcyIsCi0JCQkgICAgICgoUHlUeXBlT2JqZWN0ICopKHN0Z2RpY3QtPnByb3RvKSktPnRwX25hbWUsCi0JCQkgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlBvaW50ZXIgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgYXNzZXJ0KHN0Z2RpY3QpOyAvKiBDYW5ub3QgYmUgTlVMTCBmciBwb2ludGVyIGluc3RhbmNlcyAqLworICAgIGFzc2VydChzdGdkaWN0LT5wcm90byk7CisgICAgaWYgKCFDRGF0YU9iamVjdF9DaGVjayh2YWx1ZSkKKyAgICAgICAgfHwgMCA9PSBQeU9iamVjdF9Jc0luc3RhbmNlKHZhbHVlLCBzdGdkaWN0LT5wcm90bykpIHsKKyAgICAgICAgLyogWFhYIFB5T2JqZWN0X0lzSW5zdGFuY2UgY291bGQgcmV0dXJuIC0xISAqLworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzIGluc3RlYWQgb2YgJXMiLAorICAgICAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKikoc3RnZGljdC0+cHJvdG8pKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWRzdCA9IChDRGF0YU9iamVjdCAqKXZhbHVlOwotCSoodm9pZCAqKilzZWxmLT5iX3B0ciA9IGRzdC0+Yl9wdHI7CisgICAgZHN0ID0gKENEYXRhT2JqZWN0ICopdmFsdWU7CisgICAgKih2b2lkICoqKXNlbGYtPmJfcHRyID0gZHN0LT5iX3B0cjsKIAotCS8qIAotCSAgIEEgUG9pbnRlciBpbnN0YW5jZSBtdXN0IGtlZXAgYSB0aGUgdmFsdWUgaXQgcG9pbnRzIHRvIGFsaXZlLiAgU28sIGEKLQkgICBwb2ludGVyIGluc3RhbmNlIGhhcyBiX2xlbmd0aCBzZXQgdG8gMiBpbnN0ZWFkIG9mIDEsIGFuZCB3ZSBzZXQKLQkgICAndmFsdWUnIGl0c2VsZiBhcyB0aGUgc2Vjb25kIGl0ZW0gb2YgdGhlIGJfb2JqZWN0cyBsaXN0LCBhZGRpdGlvbmFsbHkuCi0JKi8KLQlQeV9JTkNSRUYodmFsdWUpOwotCWlmICgtMSA9PSBLZWVwUmVmKHNlbGYsIDEsIHZhbHVlKSkKLQkJcmV0dXJuIC0xOworICAgIC8qCisgICAgICAgQSBQb2ludGVyIGluc3RhbmNlIG11c3Qga2VlcCBhIHRoZSB2YWx1ZSBpdCBwb2ludHMgdG8gYWxpdmUuICBTbywgYQorICAgICAgIHBvaW50ZXIgaW5zdGFuY2UgaGFzIGJfbGVuZ3RoIHNldCB0byAyIGluc3RlYWQgb2YgMSwgYW5kIHdlIHNldAorICAgICAgICd2YWx1ZScgaXRzZWxmIGFzIHRoZSBzZWNvbmQgaXRlbSBvZiB0aGUgYl9vYmplY3RzIGxpc3QsIGFkZGl0aW9uYWxseS4KKyAgICAqLworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgaWYgKC0xID09IEtlZXBSZWYoc2VsZiwgMSwgdmFsdWUpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlrZWVwID0gR2V0S2VlcGVkT2JqZWN0cyhkc3QpOwotCVB5X0lOQ1JFRihrZWVwKTsKLQlyZXR1cm4gS2VlcFJlZihzZWxmLCAwLCBrZWVwKTsKKyAgICBrZWVwID0gR2V0S2VlcGVkT2JqZWN0cyhkc3QpOworICAgIFB5X0lOQ1JFRihrZWVwKTsKKyAgICByZXR1cm4gS2VlcFJlZihzZWxmLCAwLCBrZWVwKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIFBvaW50ZXJfZ2V0c2V0c1tdID0gewotCXsgImNvbnRlbnRzIiwgKGdldHRlcilQb2ludGVyX2dldF9jb250ZW50cywKLQkgIChzZXR0ZXIpUG9pbnRlcl9zZXRfY29udGVudHMsCi0JICAidGhlIG9iamVjdCB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIChyZWFkLXdyaXRlKSIsIE5VTEwgfSwKLQl7IE5VTEwsIE5VTEwgfQorICAgIHsgImNvbnRlbnRzIiwgKGdldHRlcilQb2ludGVyX2dldF9jb250ZW50cywKKyAgICAgIChzZXR0ZXIpUG9pbnRlcl9zZXRfY29udGVudHMsCisgICAgICAidGhlIG9iamVjdCB0aGlzIHBvaW50ZXIgcG9pbnRzIHRvIChyZWFkLXdyaXRlKSIsIE5VTEwgfSwKKyAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogc3RhdGljIGludAogUG9pbnRlcl9pbml0KENEYXRhT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICp2YWx1ZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnZhbHVlID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIlBPSU5URVIiLCAwLCAxLCAmdmFsdWUpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHZhbHVlID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBQb2ludGVyX3NldF9jb250ZW50cyhzZWxmLCB2YWx1ZSwgTlVMTCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiUE9JTlRFUiIsIDAsIDEsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFBvaW50ZXJfc2V0X2NvbnRlbnRzKHNlbGYsIHZhbHVlLCBOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBvaW50ZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoKFB5T2JqZWN0ICopdHlwZSk7Ci0JaWYgKCFkaWN0IHx8ICFkaWN0LT5wcm90bykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJDYW5ub3QgY3JlYXRlIGluc3RhbmNlOiBoYXMgbm8gX3R5cGVfIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gR2VuZXJpY0NEYXRhX25ldyh0eXBlLCBhcmdzLCBrdyk7CisgICAgU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXR5cGUpOworICAgIGlmICghZGljdCB8fCAhZGljdC0+cHJvdG8pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGluc3RhbmNlOiBoYXMgbm8gX3R5cGVfIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gR2VuZXJpY0NEYXRhX25ldyh0eXBlLCBhcmdzLCBrdyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyX3NsaWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JUHlMaXN0T2JqZWN0ICpucDsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCAqaXRlbWRpY3Q7Ci0JUHlPYmplY3QgKnByb3RvOwotCVB5X3NzaXplX3QgaSwgbGVuOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgUHlMaXN0T2JqZWN0ICpucDsKKyAgICBTdGdEaWN0T2JqZWN0ICpzdGdkaWN0LCAqaXRlbWRpY3Q7CisgICAgUHlPYmplY3QgKnByb3RvOworICAgIFB5X3NzaXplX3QgaSwgbGVuOwogCi0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JbGVuID0gaWhpZ2ggLSBpbG93OworICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGxlbiA9IGloaWdoIC0gaWxvdzsKIAotCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCWFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZnIgcG9pbnRlciBpbnN0YW5jZXMgKi8KLQlwcm90byA9IHN0Z2RpY3QtPnByb3RvOwotCWFzc2VydChwcm90byk7Ci0JaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JYXNzZXJ0KGl0ZW1kaWN0KTsKLQlpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgewotCQljaGFyICpwdHIgPSAqKGNoYXIgKiopc2VsZi0+Yl9wdHI7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIgKyBpbG93LCBsZW4pOworICAgIHN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOworICAgIGFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZnIgcG9pbnRlciBpbnN0YW5jZXMgKi8KKyAgICBwcm90byA9IHN0Z2RpY3QtPnByb3RvOworICAgIGFzc2VydChwcm90byk7CisgICAgaXRlbWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7CisgICAgYXNzZXJ0KGl0ZW1kaWN0KTsKKyAgICBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICBjaGFyICpwdHIgPSAqKGNoYXIgKiopc2VsZi0+Yl9wdHI7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwdHIgKyBpbG93LCBsZW4pOwogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JfSBlbHNlIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBnZXRlbnRyeSgidSIpLT5nZXRmdW5jKSB7Ci0JCXdjaGFyX3QgKnB0ciA9ICood2NoYXJfdCAqKilzZWxmLT5iX3B0cjsKLQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyICsgaWxvdywgbGVuKTsKKyAgICB9IGVsc2UgaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKKyAgICAgICAgd2NoYXJfdCAqcHRyID0gKih3Y2hhcl90ICoqKXNlbGYtPmJfcHRyOworICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIgKyBpbG93LCBsZW4pOwogI2VuZGlmCi0JfQorICAgIH0KIAotCW5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KGxlbik7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KGxlbik7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUG9pbnRlcl9pdGVtKF9zZWxmLCBpK2lsb3cpOwotCQlQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbnA7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUG9pbnRlcl9pdGVtKF9zZWxmLCBpK2lsb3cpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbnA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQb2ludGVyX3N1YnNjcmlwdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICppdGVtKQogewotCUNEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBQb2ludGVyX2l0ZW0oX3NlbGYsIGkpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5U2xpY2VPYmplY3QgKnNsaWNlID0gKFB5U2xpY2VPYmplY3QgKilpdGVtOwotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwOwotCQlQeU9iamVjdCAqbnA7Ci0JCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKLQkJUHlPYmplY3QgKnByb3RvOwotCQlQeV9zc2l6ZV90IGksIGxlbiwgY3VyOworICAgIENEYXRhT2JqZWN0ICpzZWxmID0gKENEYXRhT2JqZWN0ICopX3NlbGY7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBQb2ludGVyX2l0ZW0oX3NlbGYsIGkpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5U2xpY2VPYmplY3QgKnNsaWNlID0gKFB5U2xpY2VPYmplY3QgKilpdGVtOworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwOworICAgICAgICBQeU9iamVjdCAqbnA7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKKyAgICAgICAgUHlPYmplY3QgKnByb3RvOworICAgICAgICBQeV9zc2l6ZV90IGksIGxlbiwgY3VyOwogCi0JCS8qIFNpbmNlIHBvaW50ZXJzIGhhdmUgbm8gbGVuZ3RoLCBhbmQgd2Ugd2FudCB0byBhcHBseQotCQkgICBkaWZmZXJlbnQgc2VtYW50aWNzIHRvIG5lZ2F0aXZlIGluZGljZXMgdGhhbiBub3JtYWwKLQkJICAgc2xpY2luZywgd2UgaGF2ZSB0byBkaXNzZWN0IHRoZSBzbGljZSBvYmplY3Qgb3Vyc2VsdmVzLiovCi0JCWlmIChzbGljZS0+c3RlcCA9PSBQeV9Ob25lKSB7Ci0JCQlzdGVwID0gMTsKLQkJfQotCQllbHNlIHsKLQkJCXN0ZXAgPSBQeU51bWJlcl9Bc1NzaXplX3Qoc2xpY2UtPnN0ZXAsCi0JCQkJCQkgIFB5RXhjX1ZhbHVlRXJyb3IpOwotCQkJaWYgKHN0ZXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWlmIChzdGVwID09IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJzbGljZSBzdGVwIGNhbm5vdCBiZSB6ZXJvIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNsaWNlLT5zdGFydCA9PSBQeV9Ob25lKSB7Ci0JCQlpZiAoc3RlcCA8IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJzbGljZSBzdGFydCBpcyByZXF1aXJlZCAiCi0JCQkJCQkiZm9yIHN0ZXAgPCAwIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlzdGFydCA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdGFydCA9IFB5TnVtYmVyX0FzU3NpemVfdChzbGljZS0+c3RhcnQsCi0JCQkJCQkgICBQeUV4Y19WYWx1ZUVycm9yKTsKLQkJCWlmIChzdGFydCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChzbGljZS0+c3RvcCA9PSBQeV9Ob25lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInNsaWNlIHN0b3AgaXMgcmVxdWlyZWQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXN0b3AgPSBQeU51bWJlcl9Bc1NzaXplX3Qoc2xpY2UtPnN0b3AsCi0JCQkJCSAgUHlFeGNfVmFsdWVFcnJvcik7Ci0JCWlmIChzdG9wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKChzdGVwID4gMCAmJiBzdGFydCA+IHN0b3ApIHx8Ci0JCSAgICAoc3RlcCA8IDAgJiYgc3RhcnQgPCBzdG9wKSkKLQkJCWxlbiA9IDA7Ci0JCWVsc2UgaWYgKHN0ZXAgPiAwKQotCQkJbGVuID0gKHN0b3AgLSBzdGFydCAtIDEpIC8gc3RlcCArIDE7Ci0JCWVsc2UKLQkJCWxlbiA9IChzdG9wIC0gc3RhcnQgKyAxKSAvIHN0ZXAgKyAxOworICAgICAgICAvKiBTaW5jZSBwb2ludGVycyBoYXZlIG5vIGxlbmd0aCwgYW5kIHdlIHdhbnQgdG8gYXBwbHkKKyAgICAgICAgICAgZGlmZmVyZW50IHNlbWFudGljcyB0byBuZWdhdGl2ZSBpbmRpY2VzIHRoYW4gbm9ybWFsCisgICAgICAgICAgIHNsaWNpbmcsIHdlIGhhdmUgdG8gZGlzc2VjdCB0aGUgc2xpY2Ugb2JqZWN0IG91cnNlbHZlcy4qLworICAgICAgICBpZiAoc2xpY2UtPnN0ZXAgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgc3RlcCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGVwID0gUHlOdW1iZXJfQXNTc2l6ZV90KHNsaWNlLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yKTsKKyAgICAgICAgICAgIGlmIChzdGVwID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAoc3RlcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbGljZSBzdGVwIGNhbm5vdCBiZSB6ZXJvIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNsaWNlLT5zdGFydCA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBpZiAoc3RlcCA8IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWNlIHN0YXJ0IGlzIHJlcXVpcmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBzdGVwIDwgMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RhcnQgPSBQeU51bWJlcl9Bc1NzaXplX3Qoc2xpY2UtPnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgICAgICBpZiAoc3RhcnQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2xpY2UtPnN0b3AgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWNlIHN0b3AgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0b3AgPSBQeU51bWJlcl9Bc1NzaXplX3Qoc2xpY2UtPnN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgIGlmIChzdG9wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKChzdGVwID4gMCAmJiBzdGFydCA+IHN0b3ApIHx8CisgICAgICAgICAgICAoc3RlcCA8IDAgJiYgc3RhcnQgPCBzdG9wKSkKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgIGVsc2UgaWYgKHN0ZXAgPiAwKQorICAgICAgICAgICAgbGVuID0gKHN0b3AgLSBzdGFydCAtIDEpIC8gc3RlcCArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxlbiA9IChzdG9wIC0gc3RhcnQgKyAxKSAvIHN0ZXAgKyAxOwogCi0JCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwotCQlhc3NlcnQoc3RnZGljdCk7IC8qIENhbm5vdCBiZSBOVUxMIGZvciBwb2ludGVyIGluc3RhbmNlcyAqLwotCQlwcm90byA9IHN0Z2RpY3QtPnByb3RvOwotCQlhc3NlcnQocHJvdG8pOwotCQlpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKLQkJYXNzZXJ0KGl0ZW1kaWN0KTsKLQkJaWYgKGl0ZW1kaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJjIiktPmdldGZ1bmMpIHsKLQkJCWNoYXIgKnB0ciA9ICooY2hhciAqKilzZWxmLT5iX3B0cjsKLQkJCWNoYXIgKmRlc3Q7Ci0JCQkKLQkJCWlmIChsZW4gPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIAlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JCQlpZiAoc3RlcCA9PSAxKSB7Ci0JCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciArIHN0YXJ0LAotCQkJCQkJCQkgIGxlbik7Ci0JCQl9Ci0JCQlkZXN0ID0gKGNoYXIgKilQeU1lbV9NYWxsb2MobGVuKTsKLQkJCWlmIChkZXN0ID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCWRlc3RbaV0gPSBwdHJbY3VyXTsKLQkJCX0KLQkJCW5wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGVzdCwgbGVuKTsKLQkJCVB5TWVtX0ZyZWUoZGVzdCk7Ci0JCQlyZXR1cm4gbnA7Ci0JCX0KKyAgICAgICAgc3RnZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgICAgIGFzc2VydChzdGdkaWN0KTsgLyogQ2Fubm90IGJlIE5VTEwgZm9yIHBvaW50ZXIgaW5zdGFuY2VzICovCisgICAgICAgIHByb3RvID0gc3RnZGljdC0+cHJvdG87CisgICAgICAgIGFzc2VydChwcm90byk7CisgICAgICAgIGl0ZW1kaWN0ID0gUHlUeXBlX3N0Z2RpY3QocHJvdG8pOworICAgICAgICBhc3NlcnQoaXRlbWRpY3QpOworICAgICAgICBpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICAgICAgY2hhciAqcHRyID0gKihjaGFyICoqKXNlbGYtPmJfcHRyOworICAgICAgICAgICAgY2hhciAqZGVzdDsKKworICAgICAgICAgICAgaWYgKGxlbiA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgICAgIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyICsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0ID0gKGNoYXIgKilQeU1lbV9NYWxsb2MobGVuKTsKKyAgICAgICAgICAgIGlmIChkZXN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBwdHJbY3VyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGVzdCwgbGVuKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gbnA7CisgICAgICAgIH0KICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCQlpZiAoaXRlbWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoInUiKS0+Z2V0ZnVuYykgewotCQkJd2NoYXJfdCAqcHRyID0gKih3Y2hhcl90ICoqKXNlbGYtPmJfcHRyOwotCQkJd2NoYXJfdCAqZGVzdDsKLQkJCQotCQkJaWYgKGxlbiA8PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCk7Ci0JCQlpZiAoc3RlcCA9PSAxKSB7Ci0JCQkJcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyICsgc3RhcnQsCi0JCQkJCQkJICAgICAgbGVuKTsKLQkJCX0KLQkJCWRlc3QgPSAod2NoYXJfdCAqKVB5TWVtX01hbGxvYyhsZW4gKiBzaXplb2Yod2NoYXJfdCkpOwotCQkJaWYgKGRlc3QgPT0gTlVMTCkKLQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgbGVuOyBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkJZGVzdFtpXSA9IHB0cltjdXJdOwotCQkJfQotCQkJbnAgPSBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKGRlc3QsIGxlbik7Ci0JCQlQeU1lbV9GcmVlKGRlc3QpOwotCQkJcmV0dXJuIG5wOwotCQl9CisgICAgICAgIGlmIChpdGVtZGljdC0+Z2V0ZnVuYyA9PSBnZXRlbnRyeSgidSIpLT5nZXRmdW5jKSB7CisgICAgICAgICAgICB3Y2hhcl90ICpwdHIgPSAqKHdjaGFyX3QgKiopc2VsZi0+Yl9wdHI7CisgICAgICAgICAgICB3Y2hhcl90ICpkZXN0OworCisgICAgICAgICAgICBpZiAobGVuIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIgKyBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdCA9ICh3Y2hhcl90ICopUHlNZW1fTWFsbG9jKGxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgICAgICAgICBpZiAoZGVzdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBsZW47IGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gcHRyW2N1cl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBucCA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoZGVzdCwgbGVuKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gbnA7CisgICAgICAgIH0KICNlbmRpZgogCi0JCW5wID0gUHlMaXN0X05ldyhsZW4pOwotCQlpZiAobnAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBucCA9IFB5TGlzdF9OZXcobGVuKTsKKyAgICAgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBQb2ludGVyX2l0ZW0oX3NlbGYsIGN1cik7Ci0JCQlQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOwotCQl9Ci0JCXJldHVybiBucDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIlBvaW50ZXIgaW5kaWNlcyBtdXN0IGJlIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IGxlbjsgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQb2ludGVyX2l0ZW0oX3NlbGYsIGN1cik7CisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0obnAsIGksIHYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBucDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiUG9pbnRlciBpbmRpY2VzIG11c3QgYmUgaW50ZWdlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBQb2ludGVyX2FzX3NlcXVlbmNlID0gewotCTAsCQkJCQkvKiBpbnF1aXJ5IHNxX2xlbmd0aDsgKi8KLQkwLAkJCQkJLyogYmluYXJ5ZnVuYyBzcV9jb25jYXQ7ICovCi0JMCwJCQkJCS8qIGludGFyZ2Z1bmMgc3FfcmVwZWF0OyAqLwotCVBvaW50ZXJfaXRlbSwJCQkJLyogaW50YXJnZnVuYyBzcV9pdGVtOyAqLwotCVBvaW50ZXJfc2xpY2UsCQkJCS8qIGludGludGFyZ2Z1bmMgc3Ffc2xpY2U7ICovCi0JUG9pbnRlcl9hc3NfaXRlbSwJCQkvKiBpbnRvYmphcmdwcm9jIHNxX2Fzc19pdGVtOyAqLwotCTAsCQkJCQkvKiBpbnRpbnRvYmphcmdwcm9jIHNxX2Fzc19zbGljZTsgKi8KLQkwLAkJCQkJLyogb2Jqb2JqcHJvYyBzcV9jb250YWluczsgKi8KLQkvKiBBZGRlZCBpbiByZWxlYXNlIDIuMCAqLwotCTAsCQkJCQkvKiBiaW5hcnlmdW5jIHNxX2lucGxhY2VfY29uY2F0OyAqLwotCTAsCQkJCQkvKiBpbnRhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5xdWlyeSBzcV9sZW5ndGg7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaW5hcnlmdW5jIHNxX2NvbmNhdDsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludGFyZ2Z1bmMgc3FfcmVwZWF0OyAqLworICAgIFBvaW50ZXJfaXRlbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50YXJnZnVuYyBzcV9pdGVtOyAqLworICAgIFBvaW50ZXJfc2xpY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW50aW50YXJnZnVuYyBzcV9zbGljZTsgKi8KKyAgICBQb2ludGVyX2Fzc19pdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGludG9iamFyZ3Byb2Mgc3FfYXNzX2l0ZW07ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRpbnRvYmphcmdwcm9jIHNxX2Fzc19zbGljZTsgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iam9ianByb2Mgc3FfY29udGFpbnM7ICovCisgICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpbmFyeWZ1bmMgc3FfaW5wbGFjZV9jb25jYXQ7ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OyAqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgUG9pbnRlcl9hc19tYXBwaW5nID0gewotCTAsCi0JUG9pbnRlcl9zdWJzY3JpcHQsCisgICAgMCwKKyAgICBQb2ludGVyX3N1YnNjcmlwdCwKIH07CiAKIHN0YXRpYyBpbnQKIFBvaW50ZXJfbm9uemVybyhDRGF0YU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKCoodm9pZCAqKilzZWxmLT5iX3B0ciAhPSBOVUxMKTsKKyAgICByZXR1cm4gKCoodm9pZCAqKilzZWxmLT5iX3B0ciAhPSBOVUxMKTsKIH0KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBQb2ludGVyX2FzX251bWJlciA9IHsKLQkwLCAvKiBuYl9hZGQgKi8KLQkwLCAvKiBuYl9zdWJ0cmFjdCAqLwotCTAsIC8qIG5iX211bHRpcGx5ICovCi0JMCwgLyogbmJfZGl2aWRlICovCi0JMCwgLyogbmJfcmVtYWluZGVyICovCi0JMCwgLyogbmJfZGl2bW9kICovCi0JMCwgLyogbmJfcG93ZXIgKi8KLQkwLCAvKiBuYl9uZWdhdGl2ZSAqLwotCTAsIC8qIG5iX3Bvc2l0aXZlICovCi0JMCwgLyogbmJfYWJzb2x1dGUgKi8KLQkoaW5xdWlyeSlQb2ludGVyX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAvKiBuYl9hZGQgKi8KKyAgICAwLCAvKiBuYl9zdWJ0cmFjdCAqLworICAgIDAsIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgLyogbmJfZGl2aWRlICovCisgICAgMCwgLyogbmJfcmVtYWluZGVyICovCisgICAgMCwgLyogbmJfZGl2bW9kICovCisgICAgMCwgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAvKiBuYl9uZWdhdGl2ZSAqLworICAgIDAsIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlQb2ludGVyX25vbnplcm8sIC8qIG5iX25vbnplcm8gKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQb2ludGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuX1BvaW50ZXIiLAotCXNpemVvZihDRGF0YU9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCSZQb2ludGVyX2FzX251bWJlciwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmUG9pbnRlcl9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZQb2ludGVyX2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JJkNEYXRhX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkiWFhYIHRvIGJlIHByb3ZpZGVkIiwJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKUNEYXRhX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlDRGF0YV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCVBvaW50ZXJfZ2V0c2V0cywJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylQb2ludGVyX2luaXQsCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCVBvaW50ZXJfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJfY3R5cGVzLl9Qb2ludGVyIiwKKyAgICBzaXplb2YoQ0RhdGFPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJlBvaW50ZXJfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmUG9pbnRlcl9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJlBvaW50ZXJfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZDRGF0YV9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgIlhYWCB0byBiZSBwcm92aWRlZCIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKUNEYXRhX3RyYXZlcnNlLCAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpQ0RhdGFfY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIFBvaW50ZXJfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylQb2ludGVyX2luaXQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQb2ludGVyX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAotDAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKICAqICBNb2R1bGUgaW5pdGlhbGl6YXRpb24uCkBAIC01MjcyLDc4ICs1MjcyLDc4IEBACiAgICAgaW50IHN0YXR1czsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09PTzpDT01FcnJvciIsICZzZWxmLCAmaHJlc3VsdCwgJnRleHQsICZkZXRhaWxzKSkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgYSA9IFB5U2VxdWVuY2VfR2V0U2xpY2UoYXJncywgMSwgUHlTZXF1ZW5jZV9TaXplKGFyZ3MpKTsKICAgICBpZiAoIWEpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIHN0YXR1cyA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImFyZ3MiLCBhKTsKICAgICBQeV9ERUNSRUYoYSk7CiAgICAgaWYgKHN0YXR1cyA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImhyZXN1bHQiLCBocmVzdWx0KSA8IDApCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJ0ZXh0IiwgdGV4dCkgPCAwKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiZGV0YWlscyIsIGRldGFpbHMpIDwgMCkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY29tZXJyb3JfbWV0aG9kc1tdID0gewotCXsgIl9faW5pdF9fIiwgY29tZXJyb3JfaW5pdCwgTUVUSF9WQVJBUkdTIH0sCi0JeyBOVUxMLCBOVUxMIH0sCisgICAgeyAiX19pbml0X18iLCBjb21lcnJvcl9pbml0LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7IE5VTEwsIE5VTEwgfSwKIH07CiAKIHN0YXRpYyBpbnQKIGNyZWF0ZV9jb21lcnJvcih2b2lkKQogewotCVB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOwotCVB5TWV0aG9kRGVmICptZXRob2RzID0gY29tZXJyb3JfbWV0aG9kczsKLQlQeU9iamVjdCAqczsKLQlpbnQgc3RhdHVzOworICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOworICAgIFB5TWV0aG9kRGVmICptZXRob2RzID0gY29tZXJyb3JfbWV0aG9kczsKKyAgICBQeU9iamVjdCAqczsKKyAgICBpbnQgc3RhdHVzOwogCi0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXdoaWxlIChtZXRob2RzLT5tbF9uYW1lKSB7Ci0JCS8qIGdldCBhIHdyYXBwZXIgZm9yIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAqLwotCQlQeU9iamVjdCAqZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyhtZXRob2RzLCBOVUxMKTsKLQkJUHlPYmplY3QgKm1ldGg7Ci0JCWlmIChmdW5jID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQltZXRoID0gUHlNZXRob2RfTmV3KGZ1bmMsIE5VTEwsIENvbUVycm9yKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlpZiAobWV0aCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbWV0aG9kcy0+bWxfbmFtZSwgbWV0aCk7Ci0JCVB5X0RFQ1JFRihtZXRoKTsKLQkJKyttZXRob2RzOwotCX0KKyAgICB3aGlsZSAobWV0aG9kcy0+bWxfbmFtZSkgeworICAgICAgICAvKiBnZXQgYSB3cmFwcGVyIGZvciB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gKi8KKyAgICAgICAgUHlPYmplY3QgKmZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcobWV0aG9kcywgTlVMTCk7CisgICAgICAgIFB5T2JqZWN0ICptZXRoOworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgbWV0aCA9IFB5TWV0aG9kX05ldyhmdW5jLCBOVUxMLCBDb21FcnJvcik7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgaWYgKG1ldGggPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG1ldGhvZHMtPm1sX25hbWUsIG1ldGgpOworICAgICAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgICAgICsrbWV0aG9kczsKKyAgICB9CiAKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjb21lcnJvcl9kb2MpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0Jc3RhdHVzID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iLCBzKTsKLQlQeV9ERUNSRUYocyk7Ci0JaWYgKHN0YXR1cyA9PSAtMSkKLQkJZ290byBlcnJvcjsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjb21lcnJvcl9kb2MpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iLCBzKTsKKyAgICBQeV9ERUNSRUYocyk7CisgICAgaWYgKHN0YXR1cyA9PSAtMSkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCUNvbUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfY3R5cGVzLkNPTUVycm9yIiwKLQkJCQkgICAgICBOVUxMLAotCQkJCSAgICAgIGRpY3QpOwotCWlmIChDb21FcnJvciA9PSBOVUxMKQotCQlnb3RvIGVycm9yOworICAgIENvbUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfY3R5cGVzLkNPTUVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QpOworICAgIGlmIChDb21FcnJvciA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgIGVycm9yOgotCVB5X0RFQ1JFRihkaWN0KTsKLQlyZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKGRpY3QpOworICAgIHJldHVybiAtMTsKIH0KIAogI2VuZGlmCkBAIC01MzUxLDI0NiArNTM1MSwyNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfYXQoY29uc3QgY2hhciAqcHRyLCBpbnQgc2l6ZSkKIHsKLQlpZiAoc2l6ZSA9PSAtMSkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocHRyKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKKyAgICBpZiAoc2l6ZSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocHRyKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKIH0KIAogc3RhdGljIGludAogY2FzdF9jaGVja19wb2ludGVydHlwZShQeU9iamVjdCAqYXJnKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKIAotCWlmIChQb2ludGVyVHlwZU9iamVjdF9DaGVjayhhcmcpKQotCQlyZXR1cm4gMTsKLQlpZiAoQ0Z1bmNQdHJUeXBlT2JqZWN0X0NoZWNrKGFyZykpCi0JCXJldHVybiAxOwotCWRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOwotCWlmIChkaWN0KSB7Ci0JCWlmIChQeVN0cmluZ19DaGVjayhkaWN0LT5wcm90bykKLQkJICAgICYmIChzdHJjaHIoInNQelVaWE8iLCBQeVN0cmluZ19BU19TVFJJTkcoZGljdC0+cHJvdG8pWzBdKSkpIHsKLQkJCS8qIHNpbXBsZSBwb2ludGVyIHR5cGVzLCBjX3ZvaWRfcCwgY193Y2hhcl9wLCBCU1RSLCAuLi4gKi8KLQkJCXJldHVybiAxOwotCQl9Ci0JfQotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgImNhc3QoKSBhcmd1bWVudCAyIG11c3QgYmUgYSBwb2ludGVyIHR5cGUsIG5vdCAlcyIsCi0JCSAgICAgUHlUeXBlX0NoZWNrKGFyZykKLQkJICAgICA/ICgoUHlUeXBlT2JqZWN0ICopYXJnKS0+dHBfbmFtZQotCQkgICAgIDogUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoUG9pbnRlclR5cGVPYmplY3RfQ2hlY2soYXJnKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKENGdW5jUHRyVHlwZU9iamVjdF9DaGVjayhhcmcpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoYXJnKTsKKyAgICBpZiAoZGljdCkgeworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGljdC0+cHJvdG8pCisgICAgICAgICAgICAmJiAoc3RyY2hyKCJzUHpVWlhPIiwgUHlTdHJpbmdfQVNfU1RSSU5HKGRpY3QtPnByb3RvKVswXSkpKSB7CisgICAgICAgICAgICAvKiBzaW1wbGUgcG9pbnRlciB0eXBlcywgY192b2lkX3AsIGNfd2NoYXJfcCwgQlNUUiwgLi4uICovCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiY2FzdCgpIGFyZ3VtZW50IDIgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSwgbm90ICVzIiwKKyAgICAgICAgICAgICAgICAgUHlUeXBlX0NoZWNrKGFyZykKKyAgICAgICAgICAgICAgICAgPyAoKFB5VHlwZU9iamVjdCAqKWFyZyktPnRwX25hbWUKKyAgICAgICAgICAgICAgICAgOiBQeV9UWVBFKGFyZyktPnRwX25hbWUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FzdCh2b2lkICpwdHIsIFB5T2JqZWN0ICpzcmMsIFB5T2JqZWN0ICpjdHlwZSkKIHsKLQlDRGF0YU9iamVjdCAqcmVzdWx0OwotCWlmICgwID09IGNhc3RfY2hlY2tfcG9pbnRlcnR5cGUoY3R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSAoQ0RhdGFPYmplY3QgKilQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGN0eXBlLCBOVUxMKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIENEYXRhT2JqZWN0ICpyZXN1bHQ7CisgICAgaWYgKDAgPT0gY2FzdF9jaGVja19wb2ludGVydHlwZShjdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IChDRGF0YU9iamVjdCAqKVB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY3R5cGUsIE5VTEwpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKgotCSAgVGhlIGNhc3RlZCBvYmplY3RzICdfb2JqZWN0cycgbWVtYmVyOgorICAgIC8qCisgICAgICBUaGUgY2FzdGVkIG9iamVjdHMgJ19vYmplY3RzJyBtZW1iZXI6CiAKLQkgIEl0IG11c3QgY2VydGFpbmx5IGNvbnRhaW4gdGhlIHNvdXJjZSBvYmplY3RzIG9uZS4KLQkgIEl0IG11c3QgY29udGFpbiB0aGUgc291cmNlIG9iamVjdCBpdHNlbGYuCi0JICovCi0JaWYgKENEYXRhT2JqZWN0X0NoZWNrKHNyYykpIHsKLQkJQ0RhdGFPYmplY3QgKm9iaiA9IChDRGF0YU9iamVjdCAqKXNyYzsKLQkJLyogQ0RhdGFfR2V0Q29udGFpbmVyIHdpbGwgaW5pdGlhbGl6ZSBzcmMuYl9vYmplY3RzLCB3ZSBuZWVkCi0JCSAgIHRoaXMgc28gaXQgY2FuIGJlIHNoYXJlZCAqLwotCQlDRGF0YV9HZXRDb250YWluZXIob2JqKTsKLQkJLyogQnV0IHdlIG5lZWQgYSBkaWN0aW9uYXJ5ISAqLwotCQlpZiAob2JqLT5iX29iamVjdHMgPT0gUHlfTm9uZSkgewotCQkJUHlfREVDUkVGKFB5X05vbmUpOwotCQkJb2JqLT5iX29iamVjdHMgPSBQeURpY3RfTmV3KCk7Ci0JCQlpZiAob2JqLT5iX29iamVjdHMgPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWxlZDsKLQkJfQotCQlQeV9YSU5DUkVGKG9iai0+Yl9vYmplY3RzKTsKLQkJcmVzdWx0LT5iX29iamVjdHMgPSBvYmotPmJfb2JqZWN0czsKLQkJaWYgKHJlc3VsdC0+Yl9vYmplY3RzICYmIFB5RGljdF9DaGVja0V4YWN0KHJlc3VsdC0+Yl9vYmplY3RzKSkgewotCQkJUHlPYmplY3QgKmluZGV4OwotCQkJaW50IHJjOwotCQkJaW5kZXggPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilzcmMpOwotCQkJaWYgKGluZGV4ID09IE5VTEwpCi0JCQkJZ290byBmYWlsZWQ7Ci0JCQlyYyA9IFB5RGljdF9TZXRJdGVtKHJlc3VsdC0+Yl9vYmplY3RzLCBpbmRleCwgc3JjKTsKLQkJCVB5X0RFQ1JFRihpbmRleCk7Ci0JCQlpZiAocmMgPT0gLTEpCi0JCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQl9Ci0JLyogU2hvdWxkIHdlIGFzc2VydCB0aGF0IHJlc3VsdCBpcyBhIHBvaW50ZXIgdHlwZT8gKi8KLQltZW1jcHkocmVzdWx0LT5iX3B0ciwgJnB0ciwgc2l6ZW9mKHZvaWQgKikpOwotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgICBJdCBtdXN0IGNlcnRhaW5seSBjb250YWluIHRoZSBzb3VyY2Ugb2JqZWN0cyBvbmUuCisgICAgICBJdCBtdXN0IGNvbnRhaW4gdGhlIHNvdXJjZSBvYmplY3QgaXRzZWxmLgorICAgICAqLworICAgIGlmIChDRGF0YU9iamVjdF9DaGVjayhzcmMpKSB7CisgICAgICAgIENEYXRhT2JqZWN0ICpvYmogPSAoQ0RhdGFPYmplY3QgKilzcmM7CisgICAgICAgIC8qIENEYXRhX0dldENvbnRhaW5lciB3aWxsIGluaXRpYWxpemUgc3JjLmJfb2JqZWN0cywgd2UgbmVlZAorICAgICAgICAgICB0aGlzIHNvIGl0IGNhbiBiZSBzaGFyZWQgKi8KKyAgICAgICAgQ0RhdGFfR2V0Q29udGFpbmVyKG9iaik7CisgICAgICAgIC8qIEJ1dCB3ZSBuZWVkIGEgZGljdGlvbmFyeSEgKi8KKyAgICAgICAgaWYgKG9iai0+Yl9vYmplY3RzID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIG9iai0+Yl9vYmplY3RzID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKG9iai0+Yl9vYmplY3RzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgUHlfWElOQ1JFRihvYmotPmJfb2JqZWN0cyk7CisgICAgICAgIHJlc3VsdC0+Yl9vYmplY3RzID0gb2JqLT5iX29iamVjdHM7CisgICAgICAgIGlmIChyZXN1bHQtPmJfb2JqZWN0cyAmJiBQeURpY3RfQ2hlY2tFeGFjdChyZXN1bHQtPmJfb2JqZWN0cykpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppbmRleDsKKyAgICAgICAgICAgIGludCByYzsKKyAgICAgICAgICAgIGluZGV4ID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkICopc3JjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmMgPSBQeURpY3RfU2V0SXRlbShyZXN1bHQtPmJfb2JqZWN0cywgaW5kZXgsIHNyYyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW5kZXgpOworICAgICAgICAgICAgaWYgKHJjID09IC0xKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgfQorICAgIC8qIFNob3VsZCB3ZSBhc3NlcnQgdGhhdCByZXN1bHQgaXMgYSBwb2ludGVyIHR5cGU/ICovCisgICAgbWVtY3B5KHJlc3VsdC0+Yl9wdHIsICZwdHIsIHNpemVvZih2b2lkICopKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogCiAgIGZhaWxlZDoKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIENUWVBFU19VTklDT0RFCiBzdGF0aWMgUHlPYmplY3QgKgogd3N0cmluZ19hdChjb25zdCB3Y2hhcl90ICpwdHIsIGludCBzaXplKQogewotCVB5X3NzaXplX3Qgc3NpemUgPSBzaXplOwotCWlmIChzc2l6ZSA9PSAtMSkKLQkJc3NpemUgPSB3Y3NsZW4ocHRyKTsKLQlyZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwdHIsIHNzaXplKTsKKyAgICBQeV9zc2l6ZV90IHNzaXplID0gc2l6ZTsKKyAgICBpZiAoc3NpemUgPT0gLTEpCisgICAgICAgIHNzaXplID0gd2NzbGVuKHB0cik7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIocHRyLCBzc2l6ZSk7CiB9CiAjZW5kaWYKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRfY3R5cGVzKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKIC8qIE5vdGU6CiAgICBvYl90eXBlIGlzIHRoZSBtZXRhdHlwZSAodGhlICd0eXBlJyksIGRlZmF1bHRzIHRvIFB5VHlwZV9UeXBlLAogICAgdHBfYmFzZSBpcyB0aGUgYmFzZSB0eXBlLCBkZWZhdWx0cyB0byAnb2JqZWN0JyBha2EgUHlCYXNlT2JqZWN0X1R5cGUuCiAqLwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlFdmFsX0luaXRUaHJlYWRzKCk7CisgICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7CiAjZW5kaWYKLQltID0gUHlfSW5pdE1vZHVsZTMoIl9jdHlwZXMiLCBtb2R1bGVfbWV0aG9kcywgbW9kdWxlX2RvY3MpOwotCWlmICghbSkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiX2N0eXBlcyIsIG1vZHVsZV9tZXRob2RzLCBtb2R1bGVfZG9jcyk7CisgICAgaWYgKCFtKQorICAgICAgICByZXR1cm47CiAKLQlfcG9pbnRlcl90eXBlX2NhY2hlID0gUHlEaWN0X05ldygpOwotCWlmIChfcG9pbnRlcl90eXBlX2NhY2hlID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBfcG9pbnRlcl90eXBlX2NhY2hlID0gUHlEaWN0X05ldygpOworICAgIGlmIChfcG9pbnRlcl90eXBlX2NhY2hlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3BvaW50ZXJfdHlwZV9jYWNoZSIsIChQeU9iamVjdCAqKV9wb2ludGVyX3R5cGVfY2FjaGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3BvaW50ZXJfdHlwZV9jYWNoZSIsIChQeU9iamVjdCAqKV9wb2ludGVyX3R5cGVfY2FjaGUpOwogCi0JX3VucGlja2xlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtLCAiX3VucGlja2xlIik7Ci0JaWYgKF91bnBpY2tsZSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgX3VucGlja2xlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtLCAiX3VucGlja2xlIik7CisgICAgaWYgKF91bnBpY2tsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNBcmdfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlDQXJnX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmQ1RodW5rX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNUaHVua19UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIFN0Z0RpY3QgaXMgZGVyaXZlZCBmcm9tIFB5RGljdF9UeXBlICovCi0JU3RnRGljdF9UeXBlLnRwX2Jhc2UgPSAmUHlEaWN0X1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmU3RnRGljdF9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICAvKiBTdGdEaWN0IGlzIGRlcml2ZWQgZnJvbSBQeURpY3RfVHlwZSAqLworICAgIFN0Z0RpY3RfVHlwZS50cF9iYXNlID0gJlB5RGljdF9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlN0Z0RpY3RfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCi0JICogTWV0YWNsYXNzZXMKLQkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogTWV0YWNsYXNzZXMKKyAgICAgKi8KIAotCVN0cnVjdFR5cGVfVHlwZS50cF9iYXNlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlN0cnVjdFR5cGVfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgU3RydWN0VHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmU3RydWN0VHlwZV9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCVVuaW9uVHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVW5pb25UeXBlX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFVuaW9uVHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVW5pb25UeXBlX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JUG9pbnRlclR5cGVfVHlwZS50cF9iYXNlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlBvaW50ZXJUeXBlX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFBvaW50ZXJUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQb2ludGVyVHlwZV9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCUFycmF5VHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQXJyYXlUeXBlX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIEFycmF5VHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQXJyYXlUeXBlX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JU2ltcGxlVHlwZV9UeXBlLnRwX2Jhc2UgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmU2ltcGxlVHlwZV9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBTaW1wbGVUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTaW1wbGVUeXBlX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JQ0Z1bmNQdHJUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRnVuY1B0clR5cGVfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgQ0Z1bmNQdHJUeXBlX1R5cGUudHBfYmFzZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRnVuY1B0clR5cGVfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCi0JICogQ2xhc3NlcyB1c2luZyBhIGN1c3RvbSBtZXRhY2xhc3MKLQkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogQ2xhc3NlcyB1c2luZyBhIGN1c3RvbSBtZXRhY2xhc3MKKyAgICAgKi8KIAotCWlmIChQeVR5cGVfUmVhZHkoJkNEYXRhX1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNEYXRhX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfVFlQRSgmU3RydWN0X1R5cGUpID0gJlN0cnVjdFR5cGVfVHlwZTsKLQlTdHJ1Y3RfVHlwZS50cF9iYXNlID0gJkNEYXRhX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmU3RydWN0X1R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU3RydWN0dXJlIiwgKFB5T2JqZWN0ICopJlN0cnVjdF9UeXBlKTsKKyAgICBQeV9UWVBFKCZTdHJ1Y3RfVHlwZSkgPSAmU3RydWN0VHlwZV9UeXBlOworICAgIFN0cnVjdF9UeXBlLnRwX2Jhc2UgPSAmQ0RhdGFfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTdHJ1Y3RfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTdHJ1Y3R1cmUiLCAoUHlPYmplY3QgKikmU3RydWN0X1R5cGUpOwogCi0JUHlfVFlQRSgmVW5pb25fVHlwZSkgPSAmVW5pb25UeXBlX1R5cGU7Ci0JVW5pb25fVHlwZS50cF9iYXNlID0gJkNEYXRhX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVW5pb25fVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVbmlvbiIsIChQeU9iamVjdCAqKSZVbmlvbl9UeXBlKTsKKyAgICBQeV9UWVBFKCZVbmlvbl9UeXBlKSA9ICZVbmlvblR5cGVfVHlwZTsKKyAgICBVbmlvbl9UeXBlLnRwX2Jhc2UgPSAmQ0RhdGFfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZVbmlvbl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVuaW9uIiwgKFB5T2JqZWN0ICopJlVuaW9uX1R5cGUpOwogCi0JUHlfVFlQRSgmUG9pbnRlcl9UeXBlKSA9ICZQb2ludGVyVHlwZV9UeXBlOwotCVBvaW50ZXJfVHlwZS50cF9iYXNlID0gJkNEYXRhX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUG9pbnRlcl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9Qb2ludGVyIiwgKFB5T2JqZWN0ICopJlBvaW50ZXJfVHlwZSk7CisgICAgUHlfVFlQRSgmUG9pbnRlcl9UeXBlKSA9ICZQb2ludGVyVHlwZV9UeXBlOworICAgIFBvaW50ZXJfVHlwZS50cF9iYXNlID0gJkNEYXRhX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUG9pbnRlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9Qb2ludGVyIiwgKFB5T2JqZWN0ICopJlBvaW50ZXJfVHlwZSk7CiAKLQlQeV9UWVBFKCZBcnJheV9UeXBlKSA9ICZBcnJheVR5cGVfVHlwZTsKLQlBcnJheV9UeXBlLnRwX2Jhc2UgPSAmQ0RhdGFfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZBcnJheV9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFycmF5IiwgKFB5T2JqZWN0ICopJkFycmF5X1R5cGUpOworICAgIFB5X1RZUEUoJkFycmF5X1R5cGUpID0gJkFycmF5VHlwZV9UeXBlOworICAgIEFycmF5X1R5cGUudHBfYmFzZSA9ICZDRGF0YV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkFycmF5X1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQXJyYXkiLCAoUHlPYmplY3QgKikmQXJyYXlfVHlwZSk7CiAKLQlQeV9UWVBFKCZTaW1wbGVfVHlwZSkgPSAmU2ltcGxlVHlwZV9UeXBlOwotCVNpbXBsZV9UeXBlLnRwX2Jhc2UgPSAmQ0RhdGFfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZTaW1wbGVfVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfU2ltcGxlQ0RhdGEiLCAoUHlPYmplY3QgKikmU2ltcGxlX1R5cGUpOworICAgIFB5X1RZUEUoJlNpbXBsZV9UeXBlKSA9ICZTaW1wbGVUeXBlX1R5cGU7CisgICAgU2ltcGxlX1R5cGUudHBfYmFzZSA9ICZDRGF0YV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlNpbXBsZV9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9TaW1wbGVDRGF0YSIsIChQeU9iamVjdCAqKSZTaW1wbGVfVHlwZSk7CiAKLQlQeV9UWVBFKCZDRnVuY1B0cl9UeXBlKSA9ICZDRnVuY1B0clR5cGVfVHlwZTsKLQlDRnVuY1B0cl9UeXBlLnRwX2Jhc2UgPSAmQ0RhdGFfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRnVuY1B0cl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGdW5jUHRyIiwgKFB5T2JqZWN0ICopJkNGdW5jUHRyX1R5cGUpOworICAgIFB5X1RZUEUoJkNGdW5jUHRyX1R5cGUpID0gJkNGdW5jUHRyVHlwZV9UeXBlOworICAgIENGdW5jUHRyX1R5cGUudHBfYmFzZSA9ICZDRGF0YV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGdW5jUHRyX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0Z1bmNQdHIiLCAoUHlPYmplY3QgKikmQ0Z1bmNQdHJfVHlwZSk7CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCi0JICogU2ltcGxlIGNsYXNzZXMKLQkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogU2ltcGxlIGNsYXNzZXMKKyAgICAgKi8KIAotCS8qIENGaWVsZF9UeXBlIGlzIGRlcml2ZWQgZnJvbSBQeUJhc2VPYmplY3RfVHlwZSAqLwotCWlmIChQeVR5cGVfUmVhZHkoJkNGaWVsZF9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICAvKiBDRmllbGRfVHlwZSBpcyBkZXJpdmVkIGZyb20gUHlCYXNlT2JqZWN0X1R5cGUgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRmllbGRfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqCi0JICogT3RoZXIgc3R1ZmYKLQkgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogT3RoZXIgc3R1ZmYKKyAgICAgKi8KIAotCURpY3RSZW1vdmVyX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRGljdFJlbW92ZXJfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgRGljdFJlbW92ZXJfVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZEaWN0UmVtb3Zlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKGNyZWF0ZV9jb21lcnJvcigpIDwgMCkKLQkJcmV0dXJuOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ09NRXJyb3IiLCBDb21FcnJvcik7CisgICAgaWYgKGNyZWF0ZV9jb21lcnJvcigpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ09NRXJyb3IiLCBDb21FcnJvcik7CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX0hSRVNVTFQiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19IUkVTVUxUKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGVU5DRkxBR19TVERDQUxMIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfU1REQ0FMTCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfSFJFU1VMVCIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX0hSRVNVTFQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1NURENBTEwiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19TVERDQUxMKSk7CiAjZW5kaWYKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX0NERUNMIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfQ0RFQ0wpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1VTRV9FUlJOTyIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1VTRV9FUlJOTykpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUiIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1VTRV9MQVNURVJST1IpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZVTkNGTEFHX1BZVEhPTkFQSSIsIFB5SW50X0Zyb21Mb25nKEZVTkNGTEFHX1BZVEhPTkFQSSkpOwotCVB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJfX3ZlcnNpb25fXyIsICIxLjEuMCIpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfQ0RFQ0wiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19DREVDTCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfVVNFX0VSUk5PIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfVVNFX0VSUk5PKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGVU5DRkxBR19VU0VfTEFTVEVSUk9SIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfUFlUSE9OQVBJIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfUFlUSE9OQVBJKSk7CisgICAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fdmVyc2lvbl9fIiwgIjEuMS4wIik7CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1tb3ZlX2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIobWVtbW92ZSkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX21lbXNldF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbXNldCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3N0cmluZ19hdF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKHN0cmluZ19hdCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX2Nhc3RfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihjYXN0KSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbWVtbW92ZV9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKG1lbW1vdmUpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9tZW1zZXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihtZW1zZXQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9zdHJpbmdfYXRfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihzdHJpbmdfYXQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9jYXN0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIoY2FzdCkpOwogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfd3N0cmluZ19hdF9hZGRyIiwgUHlMb25nX0Zyb21Wb2lkUHRyKHdzdHJpbmdfYXQpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl93c3RyaW5nX2F0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIod3N0cmluZ19hdCkpOwogI2VuZGlmCiAKIC8qIElmIFJUTERfTE9DQUwgaXMgbm90IGRlZmluZWQgKFdpbmRvd3MhKSwgc2V0IGl0IHRvIHplcm8uICovCkBAIC01NjA1LDE0ICs1NjA1LDE0IEBACiAjZGVmaW5lIFJUTERfR0xPQkFMIFJUTERfTE9DQUwKICNlbmRpZgogCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSVExEX0xPQ0FMIiwgUHlJbnRfRnJvbUxvbmcoUlRMRF9MT0NBTCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUlRMRF9HTE9CQUwiLCBQeUludF9Gcm9tTG9uZyhSVExEX0dMT0JBTCkpOwotCQotCVB5RXhjX0FyZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjdHlwZXMuQXJndW1lbnRFcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChQeUV4Y19BcmdFcnJvcikgewotCQlQeV9JTkNSRUYoUHlFeGNfQXJnRXJyb3IpOwotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFyZ3VtZW50RXJyb3IiLCBQeUV4Y19BcmdFcnJvcik7Ci0JfQorICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUlRMRF9MT0NBTCIsIFB5SW50X0Zyb21Mb25nKFJUTERfTE9DQUwpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJUTERfR0xPQkFMIiwgUHlJbnRfRnJvbUxvbmcoUlRMRF9HTE9CQUwpKTsKKworICAgIFB5RXhjX0FyZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjdHlwZXMuQXJndW1lbnRFcnJvciIsIE5VTEwsIE5VTEwpOworICAgIGlmIChQeUV4Y19BcmdFcnJvcikgeworICAgICAgICBQeV9JTkNSRUYoUHlFeGNfQXJnRXJyb3IpOworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFyZ3VtZW50RXJyb3IiLCBQeUV4Y19BcmdFcnJvcik7CisgICAgfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU2MjMsMzAgKzU2MjMsMzAgQEAKICNpZmRlZiBIQVZFX1dDSEFSX0gKIAogUHlPYmplY3QgKk15X1B5VW5pY29kZV9Gcm9tV2lkZUNoYXIocmVnaXN0ZXIgY29uc3Qgd2NoYXJfdCAqdywKLQkJCQkgICAgUHlfc3NpemVfdCBzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplKQogewogICAgIFB5VW5pY29kZU9iamVjdCAqdW5pY29kZTsKIAogICAgIGlmICh3ID09IE5VTEwpIHsKLQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICB1bmljb2RlID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzaXplKTsKICAgICBpZiAoIXVuaWNvZGUpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogQ29weSB0aGUgd2NoYXJfdCBkYXRhIGludG8gdGhlIG5ldyBvYmplY3QgKi8KICNpZmRlZiBIQVZFX1VTQUJMRV9XQ0hBUl9UCiAgICAgbWVtY3B5KHVuaWNvZGUtPnN0ciwgdywgc2l6ZSAqIHNpemVvZih3Y2hhcl90KSk7CiAjZWxzZQogICAgIHsKLQlyZWdpc3RlciBQeV9VTklDT0RFICp1OwotCXJlZ2lzdGVyIGludCBpOwotCXUgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh1bmljb2RlKTsKLQkvKiBJbiBQeXRob24sIHRoZSBmb2xsb3dpbmcgbGluZSBoYXMgYSBvbmUtb2ZmIGVycm9yICovCi0JZm9yIChpID0gc2l6ZTsgaSA+IDA7IGktLSkKLQkgICAgKnUrKyA9ICp3Kys7CisgICAgcmVnaXN0ZXIgUHlfVU5JQ09ERSAqdTsKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICB1ID0gUHlVbmljb2RlX0FTX1VOSUNPREUodW5pY29kZSk7CisgICAgLyogSW4gUHl0aG9uLCB0aGUgZm9sbG93aW5nIGxpbmUgaGFzIGEgb25lLW9mZiBlcnJvciAqLworICAgIGZvciAoaSA9IHNpemU7IGkgPiAwOyBpLS0pCisgICAgICAgICp1KysgPSAqdysrOwogICAgIH0KICNlbmRpZgogCkBAIC01NjU0LDI1ICs1NjU0LDI1IEBACiB9CiAKIFB5X3NzaXplX3QgTXlfUHlVbmljb2RlX0FzV2lkZUNoYXIoUHlVbmljb2RlT2JqZWN0ICp1bmljb2RlLAotCQkJICAgIHJlZ2lzdGVyIHdjaGFyX3QgKncsCi0JCQkgICAgUHlfc3NpemVfdCBzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHdjaGFyX3QgKncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplKQogewogICAgIGlmICh1bmljb2RlID09IE5VTEwpIHsKLQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAoc2l6ZSA+IFB5VW5pY29kZV9HRVRfU0laRSh1bmljb2RlKSkKLQlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHVuaWNvZGUpOworICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodW5pY29kZSk7CiAjaWZkZWYgSEFWRV9VU0FCTEVfV0NIQVJfVAogICAgIG1lbWNweSh3LCB1bmljb2RlLT5zdHIsIHNpemUgKiBzaXplb2Yod2NoYXJfdCkpOwogI2Vsc2UKICAgICB7Ci0JcmVnaXN0ZXIgUHlfVU5JQ09ERSAqdTsKLQlyZWdpc3RlciBpbnQgaTsKLQl1ID0gUHlVbmljb2RlX0FTX1VOSUNPREUodW5pY29kZSk7Ci0JLyogSW4gUHl0aG9uLCB0aGUgZm9sbG93aW5nIGxpbmUgaGFzIGEgb25lLW9mZiBlcnJvciAqLwotCWZvciAoaSA9IHNpemU7IGkgPiAwOyBpLS0pCi0JICAgICp3KysgPSAqdSsrOworICAgIHJlZ2lzdGVyIFB5X1VOSUNPREUgKnU7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgdSA9IFB5VW5pY29kZV9BU19VTklDT0RFKHVuaWNvZGUpOworICAgIC8qIEluIFB5dGhvbiwgdGhlIGZvbGxvd2luZyBsaW5lIGhhcyBhIG9uZS1vZmYgZXJyb3IgKi8KKyAgICBmb3IgKGkgPSBzaXplOyBpID4gMDsgaS0tKQorICAgICAgICAqdysrID0gKnUrKzsKICAgICB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCmluZGV4IDNmMTMxODAuLjQ2NDA2YTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKQEAgLTI3LDE1MiArMjcsMTUyIEBACiAKIEVYUE9SVCh2b2lkKXRlc3RmdW5jX2FycmF5KGludCB2YWx1ZXNbNF0pCiB7Ci0JcHJpbnRmKCJ0ZXN0ZnVuY19hcnJheSAlZCAlZCAlZCAlZFxuIiwKLQkgICAgICAgdmFsdWVzWzBdLAotCSAgICAgICB2YWx1ZXNbMV0sCi0JICAgICAgIHZhbHVlc1syXSwKLQkgICAgICAgdmFsdWVzWzNdKTsKKyAgICBwcmludGYoInRlc3RmdW5jX2FycmF5ICVkICVkICVkICVkXG4iLAorICAgICAgICAgICB2YWx1ZXNbMF0sCisgICAgICAgICAgIHZhbHVlc1sxXSwKKyAgICAgICAgICAgdmFsdWVzWzJdLAorICAgICAgICAgICB2YWx1ZXNbM10pOwogfQogCiBFWFBPUlQobG9uZyBkb3VibGUpdGVzdGZ1bmNfRGRkKGRvdWJsZSBhLCBkb3VibGUgYikKIHsKLQlsb25nIGRvdWJsZSByZXN1bHQgPSAobG9uZyBkb3VibGUpKGEgKiBiKTsKLQlwcmludGYoInRlc3RmdW5jX0RkZCglcCwgJXApXG4iLCAmYSwgJmIpOwotCXByaW50ZigidGVzdGZ1bmNfRGRkKCVnLCAlZylcbiIsIGEsIGIpOwotCXJldHVybiByZXN1bHQ7CisgICAgbG9uZyBkb3VibGUgcmVzdWx0ID0gKGxvbmcgZG91YmxlKShhICogYik7CisgICAgcHJpbnRmKCJ0ZXN0ZnVuY19EZGQoJXAsICVwKVxuIiwgJmEsICZiKTsKKyAgICBwcmludGYoInRlc3RmdW5jX0RkZCglZywgJWcpXG4iLCBhLCBiKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBFWFBPUlQobG9uZyBkb3VibGUpdGVzdGZ1bmNfREREKGxvbmcgZG91YmxlIGEsIGxvbmcgZG91YmxlIGIpCiB7Ci0JbG9uZyBkb3VibGUgcmVzdWx0ID0gYSAqIGI7Ci0JcHJpbnRmKCJ0ZXN0ZnVuY19EREQoJXAsICVwKVxuIiwgJmEsICZiKTsKLQlwcmludGYoInRlc3RmdW5jX0RERCglTGcsICVMZylcbiIsIGEsIGIpOwotCXJldHVybiByZXN1bHQ7CisgICAgbG9uZyBkb3VibGUgcmVzdWx0ID0gYSAqIGI7CisgICAgcHJpbnRmKCJ0ZXN0ZnVuY19EREQoJXAsICVwKVxuIiwgJmEsICZiKTsKKyAgICBwcmludGYoInRlc3RmdW5jX0RERCglTGcsICVMZylcbiIsIGEsIGIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEVYUE9SVChpbnQpdGVzdGZ1bmNfaWlpKGludCBhLCBpbnQgYikKIHsKLQlpbnQgcmVzdWx0ID0gYSAqIGI7Ci0JcHJpbnRmKCJ0ZXN0ZnVuY19paWkoJXAsICVwKVxuIiwgJmEsICZiKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGludCByZXN1bHQgPSBhICogYjsKKyAgICBwcmludGYoInRlc3RmdW5jX2lpaSglcCwgJXApXG4iLCAmYSwgJmIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEVYUE9SVChpbnQpbXlwcmludGYoY2hhciAqZm10LCAuLi4pCiB7Ci0JaW50IHJlc3VsdDsKLQl2YV9saXN0IGFyZ3B0cjsKLQl2YV9zdGFydChhcmdwdHIsIGZtdCk7Ci0JcmVzdWx0ID0gdnByaW50ZihmbXQsIGFyZ3B0cik7Ci0JdmFfZW5kKGFyZ3B0cik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpbnQgcmVzdWx0OworICAgIHZhX2xpc3QgYXJncHRyOworICAgIHZhX3N0YXJ0KGFyZ3B0ciwgZm10KTsKKyAgICByZXN1bHQgPSB2cHJpbnRmKGZtdCwgYXJncHRyKTsKKyAgICB2YV9lbmQoYXJncHRyKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBFWFBPUlQoY2hhciAqKW15X3N0cnRvayhjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqZGVsaW0pCiB7Ci0JcmV0dXJuIHN0cnRvayh0b2tlbiwgZGVsaW0pOworICAgIHJldHVybiBzdHJ0b2sodG9rZW4sIGRlbGltKTsKIH0KIAogRVhQT1JUKGNoYXIgKilteV9zdHJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpCiB7Ci0JcmV0dXJuIHN0cmNocihzLCBjKTsKKyAgICByZXR1cm4gc3RyY2hyKHMsIGMpOwogfQogCiAKIEVYUE9SVChkb3VibGUpIG15X3NxcnQoZG91YmxlIGEpCiB7Ci0JcmV0dXJuIHNxcnQoYSk7CisgICAgcmV0dXJuIHNxcnQoYSk7CiB9CiAKIEVYUE9SVCh2b2lkKSBteV9xc29ydCh2b2lkICpiYXNlLCBzaXplX3QgbnVtLCBzaXplX3Qgd2lkdGgsIGludCgqY29tcGFyZSkoY29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqKSkKIHsKLQlxc29ydChiYXNlLCBudW0sIHdpZHRoLCBjb21wYXJlKTsKKyAgICBxc29ydChiYXNlLCBudW0sIHdpZHRoLCBjb21wYXJlKTsKIH0KIAogRVhQT1JUKGludCAqKSBfdGVzdGZ1bmNfYWk4KGludCBhWzhdKQogewotCXJldHVybiBhOworICAgIHJldHVybiBhOwogfQogCiBFWFBPUlQodm9pZCkgX3Rlc3RmdW5jX3YoaW50IGEsIGludCBiLCBpbnQgKnByZXN1bHQpCiB7Ci0JKnByZXN1bHQgPSBhICsgYjsKKyAgICAqcHJlc3VsdCA9IGEgKyBiOwogfQogCiBFWFBPUlQoaW50KSBfdGVzdGZ1bmNfaV9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7Ci0vKglwcmludGYoIl90ZXN0ZnVuY19pX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAotCSAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKKy8qICAgICAgcHJpbnRmKCJfdGVzdGZ1bmNfaV9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKKyAgICAgICAgICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOwogKi8KLQlyZXR1cm4gKGludCkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKKyAgICByZXR1cm4gKGludCkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKIH0KIAogRVhQT1JUKGZsb2F0KSBfdGVzdGZ1bmNfZl9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7Ci0vKglwcmludGYoIl90ZXN0ZnVuY19mX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAotCSAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKKy8qICAgICAgcHJpbnRmKCJfdGVzdGZ1bmNfZl9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKKyAgICAgICAgICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOwogKi8KLQlyZXR1cm4gKGZsb2F0KShiICsgaCArIGkgKyBsICsgZiArIGQpOworICAgIHJldHVybiAoZmxvYXQpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CiB9CiAKIEVYUE9SVChkb3VibGUpIF90ZXN0ZnVuY19kX2JoaWxmZChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBkb3VibGUgZCkKIHsKLS8qCXByaW50ZigiX3Rlc3RmdW5jX2RfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCi0JICAgICAgIGIsIGgsIGksIGwsIGYsIGQpOworLyogICAgICBwcmludGYoIl90ZXN0ZnVuY19kX2JoaWxmZCBnb3QgJWQgJWQgJWQgJWxkICVmICVmXG4iLAorICAgICAgICAgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CiAqLwotCXJldHVybiAoZG91YmxlKShiICsgaCArIGkgKyBsICsgZiArIGQpOworICAgIHJldHVybiAoZG91YmxlKShiICsgaCArIGkgKyBsICsgZiArIGQpOwogfQogCiBFWFBPUlQobG9uZyBkb3VibGUpIF90ZXN0ZnVuY19EX2JoaWxmRChzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLCBsb25nIGRvdWJsZSBkKQogewotLyoJcHJpbnRmKCJfdGVzdGZ1bmNfZF9iaGlsZmQgZ290ICVkICVkICVkICVsZCAlZiAlZlxuIiwKLQkgICAgICAgYiwgaCwgaSwgbCwgZiwgZCk7CisvKiAgICAgIHByaW50ZigiX3Rlc3RmdW5jX2RfYmhpbGZkIGdvdCAlZCAlZCAlZCAlbGQgJWYgJWZcbiIsCisgICAgICAgICAgICAgICBiLCBoLCBpLCBsLCBmLCBkKTsKICovCi0JcmV0dXJuIChsb25nIGRvdWJsZSkoYiArIGggKyBpICsgbCArIGYgKyBkKTsKKyAgICByZXR1cm4gKGxvbmcgZG91YmxlKShiICsgaCArIGkgKyBsICsgZiArIGQpOwogfQogCiBFWFBPUlQoY2hhciAqKSBfdGVzdGZ1bmNfcF9wKHZvaWQgKnMpCiB7Ci0JcmV0dXJuIChjaGFyICopczsKKyAgICByZXR1cm4gKGNoYXIgKilzOwogfQogCiBFWFBPUlQodm9pZCAqKSBfdGVzdGZ1bmNfY19wX3AoaW50ICphcmdjcCwgY2hhciAqKmFyZ3YpCiB7Ci0JcmV0dXJuIGFyZ3ZbKCphcmdjcCktMV07CisgICAgcmV0dXJuIGFyZ3ZbKCphcmdjcCktMV07CiB9CiAKIEVYUE9SVCh2b2lkICopIGdldF9zdHJjaHIodm9pZCkKIHsKLQlyZXR1cm4gKHZvaWQgKilzdHJjaHI7CisgICAgcmV0dXJuICh2b2lkICopc3RyY2hyOwogfQogCiBFWFBPUlQoY2hhciAqKSBteV9zdHJkdXAoY2hhciAqc3JjKQogewotCWNoYXIgKmRzdCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihzcmMpKzEpOwotCWlmICghZHN0KQotCQlyZXR1cm4gTlVMTDsKLQlzdHJjcHkoZHN0LCBzcmMpOwotCXJldHVybiBkc3Q7CisgICAgY2hhciAqZHN0ID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHNyYykrMSk7CisgICAgaWYgKCFkc3QpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0cmNweShkc3QsIHNyYyk7CisgICAgcmV0dXJuIGRzdDsKIH0KIAogRVhQT1JUKHZvaWQpbXlfZnJlZSh2b2lkICpwdHIpCiB7Ci0JZnJlZShwdHIpOworICAgIGZyZWUocHRyKTsKIH0KIAogI2lmZGVmIEhBVkVfV0NIQVJfSAogRVhQT1JUKHdjaGFyX3QgKikgbXlfd2NzZHVwKHdjaGFyX3QgKnNyYykKIHsKLQlzaXplX3QgbGVuID0gd2NzbGVuKHNyYyk7Ci0Jd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKiltYWxsb2MoKGxlbiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKLQlpZiAocHRyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1lbWNweShwdHIsIHNyYywgKGxlbisxKSAqIHNpemVvZih3Y2hhcl90KSk7Ci0JcmV0dXJuIHB0cjsKKyAgICBzaXplX3QgbGVuID0gd2NzbGVuKHNyYyk7CisgICAgd2NoYXJfdCAqcHRyID0gKHdjaGFyX3QgKiltYWxsb2MoKGxlbiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICBpZiAocHRyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweShwdHIsIHNyYywgKGxlbisxKSAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgcmV0dXJuIHB0cjsKIH0KIAogRVhQT1JUKHNpemVfdCkgbXlfd2NzbGVuKHdjaGFyX3QgKnNyYykKIHsKLQlyZXR1cm4gd2NzbGVuKHNyYyk7CisgICAgcmV0dXJuIHdjc2xlbihzcmMpOwogfQogI2VuZGlmCiAKQEAgLTE4MywxNTggKzE4MywxNTggQEAKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JaW50ICgqYykoaW50LCBpbnQpOwotCWludCAoX19zdGRjYWxsICpzKShpbnQsIGludCk7CisgICAgaW50ICgqYykoaW50LCBpbnQpOworICAgIGludCAoX19zdGRjYWxsICpzKShpbnQsIGludCk7CiB9IEZVTkNTOwogCiBFWFBPUlQoaW50KSBfdGVzdGZ1bmNfY2FsbGZ1bmNwKEZVTkNTICpmcCkKIHsKLQlmcC0+YygxLCAyKTsKLQlmcC0+cygzLCA0KTsKLQlyZXR1cm4gMDsKKyAgICBmcC0+YygxLCAyKTsKKyAgICBmcC0+cygzLCA0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogRVhQT1JUKGludCkgX3Rlc3RmdW5jX2RlcmVmX3BvaW50ZXIoaW50ICpwaSkKIHsKLQlyZXR1cm4gKnBpOworICAgIHJldHVybiAqcGk7CiB9CiAKICNpZmRlZiBNU19XSU4zMgogRVhQT1JUKGludCkgX3Rlc3RmdW5jX3BpdW5rKElVbmtub3duIEZBUiAqcGl1bmspCiB7Ci0JcGl1bmstPmxwVnRibC0+QWRkUmVmKHBpdW5rKTsKLQlyZXR1cm4gcGl1bmstPmxwVnRibC0+UmVsZWFzZShwaXVuayk7CisgICAgcGl1bmstPmxwVnRibC0+QWRkUmVmKHBpdW5rKTsKKyAgICByZXR1cm4gcGl1bmstPmxwVnRibC0+UmVsZWFzZShwaXVuayk7CiB9CiAjZW5kaWYKIAogRVhQT1JUKGludCkgX3Rlc3RmdW5jX2NhbGxiYWNrX3dpdGhfcG9pbnRlcihpbnQgKCpmdW5jKShpbnQgKikpCiB7Ci0JaW50IHRhYmxlW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9OworICAgIGludCB0YWJsZVtdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKIAotCXJldHVybiAoKmZ1bmMpKHRhYmxlKTsKKyAgICByZXR1cm4gKCpmdW5jKSh0YWJsZSk7CiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogRVhQT1JUKFBZX0xPTkdfTE9ORykgX3Rlc3RmdW5jX3FfYmhpbGZkcShzaWduZWQgY2hhciBiLCBzaG9ydCBoLCBpbnQgaSwgbG9uZyBsLCBmbG9hdCBmLAotCQkJCSAgICAgZG91YmxlIGQsIFBZX0xPTkdfTE9ORyBxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLCBQWV9MT05HX0xPTkcgcSkKIHsKLQlyZXR1cm4gKFBZX0xPTkdfTE9ORykoYiArIGggKyBpICsgbCArIGYgKyBkICsgcSk7CisgICAgcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCArIHEpOwogfQogCiBFWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfcV9iaGlsZmQoc2lnbmVkIGNoYXIgYiwgc2hvcnQgaCwgaW50IGksIGxvbmcgbCwgZmxvYXQgZiwgZG91YmxlIGQpCiB7Ci0JcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CisgICAgcmV0dXJuIChQWV9MT05HX0xPTkcpKGIgKyBoICsgaSArIGwgKyBmICsgZCk7CiB9CiAKIEVYUE9SVChpbnQpIF90ZXN0ZnVuY19jYWxsYmFja19pX2lmKGludCB2YWx1ZSwgaW50ICgqZnVuYykoaW50KSkKIHsKLQlpbnQgc3VtID0gMDsKLQl3aGlsZSAodmFsdWUgIT0gMCkgewotCQlzdW0gKz0gZnVuYyh2YWx1ZSk7Ci0JCXZhbHVlIC89IDI7Ci0JfQotCXJldHVybiBzdW07CisgICAgaW50IHN1bSA9IDA7CisgICAgd2hpbGUgKHZhbHVlICE9IDApIHsKKyAgICAgICAgc3VtICs9IGZ1bmModmFsdWUpOworICAgICAgICB2YWx1ZSAvPSAyOworICAgIH0KKyAgICByZXR1cm4gc3VtOwogfQogCiBFWFBPUlQoUFlfTE9OR19MT05HKSBfdGVzdGZ1bmNfY2FsbGJhY2tfcV9xZihQWV9MT05HX0xPTkcgdmFsdWUsCi0JCQkJCSAgICAgUFlfTE9OR19MT05HICgqZnVuYykoUFlfTE9OR19MT05HKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZX0xPTkdfTE9ORyAoKmZ1bmMpKFBZX0xPTkdfTE9ORykpCiB7Ci0JUFlfTE9OR19MT05HIHN1bSA9IDA7CisgICAgUFlfTE9OR19MT05HIHN1bSA9IDA7CiAKLQl3aGlsZSAodmFsdWUgIT0gMCkgewotCQlzdW0gKz0gZnVuYyh2YWx1ZSk7Ci0JCXZhbHVlIC89IDI7Ci0JfQotCXJldHVybiBzdW07CisgICAgd2hpbGUgKHZhbHVlICE9IDApIHsKKyAgICAgICAgc3VtICs9IGZ1bmModmFsdWUpOworICAgICAgICB2YWx1ZSAvPSAyOworICAgIH0KKyAgICByZXR1cm4gc3VtOwogfQogCiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqdmFsdWU7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICp2YWx1ZTsKIH0gU1BBTTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JaW50IG51bV9zcGFtczsKLQlTUEFNICpzcGFtczsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBudW1fc3BhbXM7CisgICAgU1BBTSAqc3BhbXM7CiB9IEVHRzsKIAogU1BBTSBteV9zcGFtc1syXSA9IHsKLQl7ICJuYW1lMSIsICJ2YWx1ZTEiIH0sCi0JeyAibmFtZTIiLCAidmFsdWUyIiB9LAorICAgIHsgIm5hbWUxIiwgInZhbHVlMSIgfSwKKyAgICB7ICJuYW1lMiIsICJ2YWx1ZTIiIH0sCiB9OwogCiBFR0cgbXlfZWdnc1sxXSA9IHsKLQl7ICJmaXJzdCBlZ2ciLCAxLCBteV9zcGFtcyB9CisgICAgeyAiZmlyc3QgZWdnIiwgMSwgbXlfc3BhbXMgfQogfTsKIAogRVhQT1JUKGludCkgZ2V0U1BBTUFOREVHR1MoRUdHICoqZWdncykKIHsKLQkqZWdncyA9IG15X2VnZ3M7Ci0JcmV0dXJuIDE7CisgICAgKmVnZ3MgPSBteV9lZ2dzOworICAgIHJldHVybiAxOwogfQogCiB0eXBlZGVmIHN0cnVjdCB0YWdwb2ludCB7Ci0JaW50IHg7Ci0JaW50IHk7CisgICAgaW50IHg7CisgICAgaW50IHk7CiB9IHBvaW50OwogCiBFWFBPUlQoaW50KSBfdGVzdGZ1bmNfYnl2YWwocG9pbnQgaW4sIHBvaW50ICpwb3V0KQogewotCWlmIChwb3V0KSB7Ci0JCXBvdXQtPnggPSBpbi54OwotCQlwb3V0LT55ID0gaW4ueTsKLQl9Ci0JcmV0dXJuIGluLnggKyBpbi55OworICAgIGlmIChwb3V0KSB7CisgICAgICAgIHBvdXQtPnggPSBpbi54OworICAgICAgICBwb3V0LT55ID0gaW4ueTsKKyAgICB9CisgICAgcmV0dXJuIGluLnggKyBpbi55OwogfQogCiBFWFBPUlQgKGludCkgYW5faW50ZWdlciA9IDQyOwogCiBFWFBPUlQoaW50KSBnZXRfYW5faW50ZWdlcih2b2lkKQogewotCXJldHVybiBhbl9pbnRlZ2VyOworICAgIHJldHVybiBhbl9pbnRlZ2VyOwogfQogCiBFWFBPUlQoZG91YmxlKQogaW50ZWdyYXRlKGRvdWJsZSBhLCBkb3VibGUgYiwgZG91YmxlICgqZikoZG91YmxlKSwgbG9uZyBuc3RlcCkKIHsKLQlkb3VibGUgeCwgc3VtPTAuMCwgZHg9KGItYSkvKGRvdWJsZSluc3RlcDsKLQlmb3IoeD1hKzAuNSpkeDsgKGIteCkqKHgtYSk+MC4wOyB4Kz1keCkKLQkJc3VtICs9IGYoeCk7Ci0JcmV0dXJuIHN1bS8oZG91YmxlKW5zdGVwOworICAgIGRvdWJsZSB4LCBzdW09MC4wLCBkeD0oYi1hKS8oZG91YmxlKW5zdGVwOworICAgIGZvcih4PWErMC41KmR4OyAoYi14KSooeC1hKT4wLjA7IHgrPWR4KQorICAgICAgICBzdW0gKz0gZih4KTsKKyAgICByZXR1cm4gc3VtLyhkb3VibGUpbnN0ZXA7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQl2b2lkICgqaW5pdGlhbGl6ZSkodm9pZCAqKCopKGludCksIHZvaWQoKikodm9pZCAqKSk7CisgICAgdm9pZCAoKmluaXRpYWxpemUpKHZvaWQgKigqKShpbnQpLCB2b2lkKCopKHZvaWQgKikpOwogfSB4eHhfbGlicmFyeTsKIAogc3RhdGljIHZvaWQgX3h4eF9pbml0KHZvaWQgKigqWGFsbG9jKShpbnQpLCB2b2lkICgqWGZyZWUpKHZvaWQgKikpCiB7Ci0Jdm9pZCAqcHRyOwotCQotCXByaW50ZigiX3h4eF9pbml0IGdvdCAlcCAlcFxuIiwgWGFsbG9jLCBYZnJlZSk7Ci0JcHJpbnRmKCJjYWxsaW5nXG4iKTsKLQlwdHIgPSBYYWxsb2MoMzIpOwotCVhmcmVlKHB0cik7Ci0JcHJpbnRmKCJjYWxscyBkb25lLCBwdHIgd2FzICVwXG4iLCBwdHIpOworICAgIHZvaWQgKnB0cjsKKworICAgIHByaW50ZigiX3h4eF9pbml0IGdvdCAlcCAlcFxuIiwgWGFsbG9jLCBYZnJlZSk7CisgICAgcHJpbnRmKCJjYWxsaW5nXG4iKTsKKyAgICBwdHIgPSBYYWxsb2MoMzIpOworICAgIFhmcmVlKHB0cik7CisgICAgcHJpbnRmKCJjYWxscyBkb25lLCBwdHIgd2FzICVwXG4iLCBwdHIpOwogfQogCiB4eHhfbGlicmFyeSBfeHh4X2xpYiA9IHsKLQlfeHh4X2luaXQKKyAgICBfeHh4X2luaXQKIH07CiAKIEVYUE9SVCh4eHhfbGlicmFyeSkgKmxpYnJhcnlfZ2V0KHZvaWQpCiB7Ci0JcmV0dXJuICZfeHh4X2xpYjsKKyAgICByZXR1cm4gJl94eHhfbGliOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKIC8qIFNlZSBEb24gQm94IChnZXJtYW4pLCBwcCA3OWZmLiAqLwogRVhQT1JUKHZvaWQpIEdldFN0cmluZyhCU1RSICpwYnN0cikKIHsKLQkqcGJzdHIgPSBTeXNBbGxvY1N0cmluZyhMIkdvb2RieWUhIik7CisgICAgKnBic3RyID0gU3lzQWxsb2NTdHJpbmcoTCJHb29kYnllISIpOwogfQogI2VuZGlmCiAKQEAgLTM0MywxMiArMzQzLDEyIEBACiAgKi8KIFB5T2JqZWN0ICpweV9mdW5jX3NpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWludCBpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2kiLCAmbmFtZSwgJmkpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgaTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpIiwgJm5hbWUsICZpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBFWFBPUlQodm9pZCkgX3B5X2Z1bmNfc2koY2hhciAqcywgaW50IGkpCkBAIC0zNTcsOCArMzU3LDggQEAKIAogUHlPYmplY3QgKnB5X2Z1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIEVYUE9SVCh2b2lkKSBfcHlfZnVuYyh2b2lkKQpAQCAtMzY5LDY0ICszNjksNjQgQEAKIEVYUE9SVCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIGxhc3RfdGZfYXJnX3U7CiAKIHN0cnVjdCBCSVRTIHsKLQlpbnQgQTogMSwgQjoyLCBDOjMsIEQ6NCwgRTogNSwgRjogNiwgRzogNywgSDogOCwgSTogOTsKLQlzaG9ydCBNOiAxLCBOOiAyLCBPOiAzLCBQOiA0LCBROiA1LCBSOiA2LCBTOiA3OworICAgIGludCBBOiAxLCBCOjIsIEM6MywgRDo0LCBFOiA1LCBGOiA2LCBHOiA3LCBIOiA4LCBJOiA5OworICAgIHNob3J0IE06IDEsIE46IDIsIE86IDMsIFA6IDQsIFE6IDUsIFI6IDYsIFM6IDc7CiB9OwogCiBETF9FWFBPUlQodm9pZCkgc2V0X2JpdGZpZWxkcyhzdHJ1Y3QgQklUUyAqYml0cywgY2hhciBuYW1lLCBpbnQgdmFsdWUpCiB7Ci0Jc3dpdGNoIChuYW1lKSB7Ci0JY2FzZSAnQSc6IGJpdHMtPkEgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnQic6IGJpdHMtPkIgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnQyc6IGJpdHMtPkMgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRCc6IGJpdHMtPkQgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRSc6IGJpdHMtPkUgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRic6IGJpdHMtPkYgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnRyc6IGJpdHMtPkcgPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnSCc6IGJpdHMtPkggPSB2YWx1ZTsgYnJlYWs7Ci0JY2FzZSAnSSc6IGJpdHMtPkkgPSB2YWx1ZTsgYnJlYWs7CisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgY2FzZSAnQSc6IGJpdHMtPkEgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnQic6IGJpdHMtPkIgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnQyc6IGJpdHMtPkMgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRCc6IGJpdHMtPkQgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRSc6IGJpdHMtPkUgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRic6IGJpdHMtPkYgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnRyc6IGJpdHMtPkcgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnSCc6IGJpdHMtPkggPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnSSc6IGJpdHMtPkkgPSB2YWx1ZTsgYnJlYWs7CiAKLQljYXNlICdNJzogYml0cy0+TSA9IHZhbHVlOyBicmVhazsKLQljYXNlICdOJzogYml0cy0+TiA9IHZhbHVlOyBicmVhazsKLQljYXNlICdPJzogYml0cy0+TyA9IHZhbHVlOyBicmVhazsKLQljYXNlICdQJzogYml0cy0+UCA9IHZhbHVlOyBicmVhazsKLQljYXNlICdRJzogYml0cy0+USA9IHZhbHVlOyBicmVhazsKLQljYXNlICdSJzogYml0cy0+UiA9IHZhbHVlOyBicmVhazsKLQljYXNlICdTJzogYml0cy0+UyA9IHZhbHVlOyBicmVhazsKLQl9CisgICAgY2FzZSAnTSc6IGJpdHMtPk0gPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnTic6IGJpdHMtPk4gPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnTyc6IGJpdHMtPk8gPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUCc6IGJpdHMtPlAgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUSc6IGJpdHMtPlEgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUic6IGJpdHMtPlIgPSB2YWx1ZTsgYnJlYWs7CisgICAgY2FzZSAnUyc6IGJpdHMtPlMgPSB2YWx1ZTsgYnJlYWs7CisgICAgfQogfQogCiBETF9FWFBPUlQoaW50KSB1bnBhY2tfYml0ZmllbGRzKHN0cnVjdCBCSVRTICpiaXRzLCBjaGFyIG5hbWUpCiB7Ci0Jc3dpdGNoIChuYW1lKSB7Ci0JY2FzZSAnQSc6IHJldHVybiBiaXRzLT5BOwotCWNhc2UgJ0InOiByZXR1cm4gYml0cy0+QjsKLQljYXNlICdDJzogcmV0dXJuIGJpdHMtPkM7Ci0JY2FzZSAnRCc6IHJldHVybiBiaXRzLT5EOwotCWNhc2UgJ0UnOiByZXR1cm4gYml0cy0+RTsKLQljYXNlICdGJzogcmV0dXJuIGJpdHMtPkY7Ci0JY2FzZSAnRyc6IHJldHVybiBiaXRzLT5HOwotCWNhc2UgJ0gnOiByZXR1cm4gYml0cy0+SDsKLQljYXNlICdJJzogcmV0dXJuIGJpdHMtPkk7CisgICAgc3dpdGNoIChuYW1lKSB7CisgICAgY2FzZSAnQSc6IHJldHVybiBiaXRzLT5BOworICAgIGNhc2UgJ0InOiByZXR1cm4gYml0cy0+QjsKKyAgICBjYXNlICdDJzogcmV0dXJuIGJpdHMtPkM7CisgICAgY2FzZSAnRCc6IHJldHVybiBiaXRzLT5EOworICAgIGNhc2UgJ0UnOiByZXR1cm4gYml0cy0+RTsKKyAgICBjYXNlICdGJzogcmV0dXJuIGJpdHMtPkY7CisgICAgY2FzZSAnRyc6IHJldHVybiBiaXRzLT5HOworICAgIGNhc2UgJ0gnOiByZXR1cm4gYml0cy0+SDsKKyAgICBjYXNlICdJJzogcmV0dXJuIGJpdHMtPkk7CiAKLQljYXNlICdNJzogcmV0dXJuIGJpdHMtPk07Ci0JY2FzZSAnTic6IHJldHVybiBiaXRzLT5OOwotCWNhc2UgJ08nOiByZXR1cm4gYml0cy0+TzsKLQljYXNlICdQJzogcmV0dXJuIGJpdHMtPlA7Ci0JY2FzZSAnUSc6IHJldHVybiBiaXRzLT5ROwotCWNhc2UgJ1InOiByZXR1cm4gYml0cy0+UjsKLQljYXNlICdTJzogcmV0dXJuIGJpdHMtPlM7Ci0JfQotCXJldHVybiAwOworICAgIGNhc2UgJ00nOiByZXR1cm4gYml0cy0+TTsKKyAgICBjYXNlICdOJzogcmV0dXJuIGJpdHMtPk47CisgICAgY2FzZSAnTyc6IHJldHVybiBiaXRzLT5POworICAgIGNhc2UgJ1AnOiByZXR1cm4gYml0cy0+UDsKKyAgICBjYXNlICdRJzogcmV0dXJuIGJpdHMtPlE7CisgICAgY2FzZSAnUic6IHJldHVybiBiaXRzLT5SOworICAgIGNhc2UgJ1MnOiByZXR1cm4gYml0cy0+UzsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewotLyoJeyJnZXRfbGFzdF90Zl9hcmdfcyIsIGdldF9sYXN0X3RmX2FyZ19zLCBNRVRIX05PQVJHU30sCi0JeyJnZXRfbGFzdF90Zl9hcmdfdSIsIGdldF9sYXN0X3RmX2FyZ191LCBNRVRIX05PQVJHU30sCisvKiAgICAgIHsiZ2V0X2xhc3RfdGZfYXJnX3MiLCBnZXRfbGFzdF90Zl9hcmdfcywgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0X2xhc3RfdGZfYXJnX3UiLCBnZXRfbGFzdF90Zl9hcmdfdSwgTUVUSF9OT0FSR1N9LAogKi8KLQl7ImZ1bmNfc2kiLCBweV9mdW5jX3NpLCBNRVRIX1ZBUkFSR1N9LAotCXsiZnVuYyIsIHB5X2Z1bmMsIE1FVEhfTk9BUkdTfSwKLQl7IE5VTEwsIE5VTEwsIDAsIE5VTEx9LAorICAgIHsiZnVuY19zaSIsIHB5X2Z1bmNfc2ksIE1FVEhfVkFSQVJHU30sCisgICAgeyJmdW5jIiwgcHlfZnVuYywgTUVUSF9OT0FSR1N9LAorICAgIHsgTlVMTCwgTlVMTCwgMCwgTlVMTH0sCiB9OwogCiAjZGVmaW5lIFMgbGFzdF90Zl9hcmdfcyA9IChQWV9MT05HX0xPTkcpYwpAQCAtNDk2LDgwICs0OTYsODAgQEAKICNlbmRpZgogCiAvKioqKioqKiovCi0gCisKICNpZm5kZWYgTVNfV0lOMzIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcgeDsKLQlsb25nIHk7CisgICAgbG9uZyB4OworICAgIGxvbmcgeTsKIH0gUE9JTlQ7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlsb25nIGxlZnQ7Ci0JbG9uZyB0b3A7Ci0JbG9uZyByaWdodDsKLQlsb25nIGJvdHRvbTsKKyAgICBsb25nIGxlZnQ7CisgICAgbG9uZyB0b3A7CisgICAgbG9uZyByaWdodDsKKyAgICBsb25nIGJvdHRvbTsKIH0gUkVDVDsKIAogI2VuZGlmCiAKIEVYUE9SVChpbnQpIFBvaW50SW5SZWN0KFJFQ1QgKnByYywgUE9JTlQgcHQpCiB7Ci0JaWYgKHB0LnggPCBwcmMtPmxlZnQpCi0JCXJldHVybiAwOwotCWlmIChwdC54ID4gcHJjLT5yaWdodCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHB0LnkgPCBwcmMtPnRvcCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHB0LnkgPiBwcmMtPmJvdHRvbSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHB0LnggPCBwcmMtPmxlZnQpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwdC54ID4gcHJjLT5yaWdodCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHB0LnkgPCBwcmMtPnRvcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHB0LnkgPiBwcmMtPmJvdHRvbSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlzaG9ydCB4OwotCXNob3J0IHk7CisgICAgc2hvcnQgeDsKKyAgICBzaG9ydCB5OwogfSBTMkg7CiAKIEVYUE9SVChTMkgpIHJldF8yaF9mdW5jKFMySCBpbnApCiB7Ci0JaW5wLnggKj0gMjsKLQlpbnAueSAqPSAzOwotCXJldHVybiBpbnA7CisgICAgaW5wLnggKj0gMjsKKyAgICBpbnAueSAqPSAzOworICAgIHJldHVybiBpbnA7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlpbnQgYSwgYiwgYywgZCwgZSwgZiwgZywgaDsKKyAgICBpbnQgYSwgYiwgYywgZCwgZSwgZiwgZywgaDsKIH0gUzhJOwogCiBFWFBPUlQoUzhJKSByZXRfOGlfZnVuYyhTOEkgaW5wKQogewotCWlucC5hICo9IDI7Ci0JaW5wLmIgKj0gMzsKLQlpbnAuYyAqPSA0OwotCWlucC5kICo9IDU7Ci0JaW5wLmUgKj0gNjsKLQlpbnAuZiAqPSA3OwotCWlucC5nICo9IDg7Ci0JaW5wLmggKj0gOTsKLQlyZXR1cm4gaW5wOworICAgIGlucC5hICo9IDI7CisgICAgaW5wLmIgKj0gMzsKKyAgICBpbnAuYyAqPSA0OworICAgIGlucC5kICo9IDU7CisgICAgaW5wLmUgKj0gNjsKKyAgICBpbnAuZiAqPSA3OworICAgIGlucC5nICo9IDg7CisgICAgaW5wLmggKj0gOTsKKyAgICByZXR1cm4gaW5wOwogfQogCiBFWFBPUlQoaW50KSBHZXRSZWN0YW5nbGUoaW50IGZsYWcsIFJFQ1QgKnByZWN0KQogewotCWlmIChmbGFnID09IDApCi0JCXJldHVybiAwOwotCXByZWN0LT5sZWZ0ID0gKGludClmbGFnOwotCXByZWN0LT50b3AgPSAoaW50KWZsYWcgKyAxOwotCXByZWN0LT5yaWdodCA9IChpbnQpZmxhZyArIDI7Ci0JcHJlY3QtPmJvdHRvbSA9IChpbnQpZmxhZyArIDM7Ci0JcmV0dXJuIDE7CisgICAgaWYgKGZsYWcgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcHJlY3QtPmxlZnQgPSAoaW50KWZsYWc7CisgICAgcHJlY3QtPnRvcCA9IChpbnQpZmxhZyArIDE7CisgICAgcHJlY3QtPnJpZ2h0ID0gKGludClmbGFnICsgMjsKKyAgICBwcmVjdC0+Ym90dG9tID0gKGludClmbGFnICsgMzsKKyAgICByZXR1cm4gMTsKIH0KIAogRVhQT1JUKHZvaWQpIFR3b091dEFyZ3MoaW50IGEsIGludCAqcGksIGludCBiLCBpbnQgKnBqKQogewotCSpwaSArPSBhOwotCSpwaiArPSBiOworICAgICpwaSArPSBhOworICAgICpwaiArPSBiOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKQEAgLTU4NCwxMyArNTg0LDEzIEBACiAKIEVYUE9SVCAoSFJFU1VMVCkgS2VlcE9iamVjdChJVW5rbm93biAqcHVuaykKIHsKLQlzdGF0aWMgSVVua25vd24gKnBvYmo7Ci0JaWYgKHB1bmspCi0JCXB1bmstPmxwVnRibC0+QWRkUmVmKHB1bmspOwotCWlmIChwb2JqKQotCQlwb2JqLT5scFZ0YmwtPlJlbGVhc2UocG9iaik7Ci0JcG9iaiA9IHB1bms7Ci0JcmV0dXJuIFNfT0s7CisgICAgc3RhdGljIElVbmtub3duICpwb2JqOworICAgIGlmIChwdW5rKQorICAgICAgICBwdW5rLT5scFZ0YmwtPkFkZFJlZihwdW5rKTsKKyAgICBpZiAocG9iaikKKyAgICAgICAgcG9iai0+bHBWdGJsLT5SZWxlYXNlKHBvYmopOworICAgIHBvYmogPSBwdW5rOworICAgIHJldHVybiBTX09LOwogfQogCiAjZW5kaWYKQEAgLTU5OCw1ICs1OTgsNSBAQAogRExfRVhQT1JUKHZvaWQpCiBpbml0X2N0eXBlc190ZXN0KHZvaWQpCiB7Ci0JUHlfSW5pdE1vZHVsZSgiX2N0eXBlc190ZXN0IiwgbW9kdWxlX21ldGhvZHMpOworICAgIFB5X0luaXRNb2R1bGUoIl9jdHlwZXNfdGVzdCIsIG1vZHVsZV9tZXRob2RzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwppbmRleCA1OGMwZGNhLi5iMWI2MGJhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCkBAIC0xNyw2NSArMTcsNjUgQEAKIHN0YXRpYyB2b2lkCiBDVGh1bmtPYmplY3RfZGVhbGxvYyhQeU9iamVjdCAqX3NlbGYpCiB7Ci0JQ1RodW5rT2JqZWN0ICpzZWxmID0gKENUaHVua09iamVjdCAqKV9zZWxmOwotCVB5X1hERUNSRUYoc2VsZi0+Y29udmVydGVycyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5jYWxsYWJsZSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5yZXN0eXBlKTsKLQlpZiAoc2VsZi0+cGNsKQotCQlGcmVlQ2xvc3VyZShzZWxmLT5wY2wpOwotCVB5T2JqZWN0X0dDX0RlbChzZWxmKTsKKyAgICBDVGh1bmtPYmplY3QgKnNlbGYgPSAoQ1RodW5rT2JqZWN0ICopX3NlbGY7CisgICAgUHlfWERFQ1JFRihzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmNhbGxhYmxlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnJlc3R5cGUpOworICAgIGlmIChzZWxmLT5wY2wpCisgICAgICAgIEZyZWVDbG9zdXJlKHNlbGYtPnBjbCk7CisgICAgUHlPYmplY3RfR0NfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgaW50CiBDVGh1bmtPYmplY3RfdHJhdmVyc2UoUHlPYmplY3QgKl9zZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlDVGh1bmtPYmplY3QgKnNlbGYgPSAoQ1RodW5rT2JqZWN0ICopX3NlbGY7Ci0JUHlfVklTSVQoc2VsZi0+Y29udmVydGVycyk7Ci0JUHlfVklTSVQoc2VsZi0+Y2FsbGFibGUpOwotCVB5X1ZJU0lUKHNlbGYtPnJlc3R5cGUpOwotCXJldHVybiAwOworICAgIENUaHVua09iamVjdCAqc2VsZiA9IChDVGh1bmtPYmplY3QgKilfc2VsZjsKKyAgICBQeV9WSVNJVChzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5jYWxsYWJsZSk7CisgICAgUHlfVklTSVQoc2VsZi0+cmVzdHlwZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIENUaHVua09iamVjdF9jbGVhcihQeU9iamVjdCAqX3NlbGYpCiB7Ci0JQ1RodW5rT2JqZWN0ICpzZWxmID0gKENUaHVua09iamVjdCAqKV9zZWxmOwotCVB5X0NMRUFSKHNlbGYtPmNvbnZlcnRlcnMpOwotCVB5X0NMRUFSKHNlbGYtPmNhbGxhYmxlKTsKLQlQeV9DTEVBUihzZWxmLT5yZXN0eXBlKTsKLQlyZXR1cm4gMDsKKyAgICBDVGh1bmtPYmplY3QgKnNlbGYgPSAoQ1RodW5rT2JqZWN0ICopX3NlbGY7CisgICAgUHlfQ0xFQVIoc2VsZi0+Y29udmVydGVycyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+Y2FsbGFibGUpOworICAgIFB5X0NMRUFSKHNlbGYtPnJlc3R5cGUpOworICAgIHJldHVybiAwOwogfQogCiBQeVR5cGVPYmplY3QgQ1RodW5rX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9jdHlwZXMuQ1RodW5rT2JqZWN0IiwKLQlzaXplb2YoQ1RodW5rT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQlzaXplb2YoZmZpX3R5cGUpLAkJCS8qIHRwX2l0ZW1zaXplICovCi0JQ1RodW5rT2JqZWN0X2RlYWxsb2MsCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLAkJCS8qIHRwX2ZsYWdzICovCi0JIkNUaHVua09iamVjdCIsCQkJCS8qIHRwX2RvYyAqLwotCUNUaHVua09iamVjdF90cmF2ZXJzZSwJCQkvKiB0cF90cmF2ZXJzZSAqLwotCUNUaHVua09iamVjdF9jbGVhciwJICAgICAgIAkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX2N0eXBlcy5DVGh1bmtPYmplY3QiLAorICAgIHNpemVvZihDVGh1bmtPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgc2l6ZW9mKGZmaV90eXBlKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIENUaHVua09iamVjdF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgIkNUaHVua09iamVjdCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBDVGh1bmtPYmplY3RfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgQ1RodW5rT2JqZWN0X2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODMsNzQgKzgzLDc0IEBACiBzdGF0aWMgdm9pZAogUHJpbnRFcnJvcihjaGFyICptc2csIC4uLikKIHsKLQljaGFyIGJ1Zls1MTJdOwotCVB5T2JqZWN0ICpmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKLQl2YV9saXN0IG1hcmtlcjsKKyAgICBjaGFyIGJ1Zls1MTJdOworICAgIFB5T2JqZWN0ICpmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKKyAgICB2YV9saXN0IG1hcmtlcjsKIAotCXZhX3N0YXJ0KG1hcmtlciwgbXNnKTsKLQl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbXNnLCBtYXJrZXIpOwotCXZhX2VuZChtYXJrZXIpOwotCWlmIChmKQotCQlQeUZpbGVfV3JpdGVTdHJpbmcoYnVmLCBmKTsKLQlQeUVycl9QcmludCgpOworICAgIHZhX3N0YXJ0KG1hcmtlciwgbXNnKTsKKyAgICB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbXNnLCBtYXJrZXIpOworICAgIHZhX2VuZChtYXJrZXIpOworICAgIGlmIChmKQorICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoYnVmLCBmKTsKKyAgICBQeUVycl9QcmludCgpOwogfQogCiAKIC8qIGFmdGVyIGNvZGUgdGhhdCBweXJleCBnZW5lcmF0ZXMgKi8KIHZvaWQgX0FkZFRyYWNlYmFjayhjaGFyICpmdW5jbmFtZSwgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pCiB7Ci0JUHlPYmplY3QgKnB5X3NyY2ZpbGUgPSAwOwotCVB5T2JqZWN0ICpweV9mdW5jbmFtZSA9IDA7Ci0JUHlPYmplY3QgKnB5X2dsb2JhbHMgPSAwOwotCVB5T2JqZWN0ICplbXB0eV90dXBsZSA9IDA7Ci0JUHlPYmplY3QgKmVtcHR5X3N0cmluZyA9IDA7Ci0JUHlDb2RlT2JqZWN0ICpweV9jb2RlID0gMDsKLQlQeUZyYW1lT2JqZWN0ICpweV9mcmFtZSA9IDA7Ci0gICAgCi0JcHlfc3JjZmlsZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOwotCWlmICghcHlfc3JjZmlsZSkgZ290byBiYWQ7Ci0JcHlfZnVuY25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZ1bmNuYW1lKTsKLQlpZiAoIXB5X2Z1bmNuYW1lKSBnb3RvIGJhZDsKLQlweV9nbG9iYWxzID0gUHlEaWN0X05ldygpOwotCWlmICghcHlfZ2xvYmFscykgZ290byBiYWQ7Ci0JZW1wdHlfdHVwbGUgPSBQeVR1cGxlX05ldygwKTsKLQlpZiAoIWVtcHR5X3R1cGxlKSBnb3RvIGJhZDsKLQllbXB0eV9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQlpZiAoIWVtcHR5X3N0cmluZykgZ290byBiYWQ7Ci0JcHlfY29kZSA9IFB5Q29kZV9OZXcoCi0JCTAsICAgICAgICAgICAgLyppbnQgYXJnY291bnQsKi8KLQkJMCwgICAgICAgICAgICAvKmludCBubG9jYWxzLCovCi0JCTAsICAgICAgICAgICAgLyppbnQgc3RhY2tzaXplLCovCi0JCTAsICAgICAgICAgICAgLyppbnQgZmxhZ3MsKi8KLQkJZW1wdHlfc3RyaW5nLCAvKlB5T2JqZWN0ICpjb2RlLCovCi0JCWVtcHR5X3R1cGxlLCAgLypQeU9iamVjdCAqY29uc3RzLCovCi0JCWVtcHR5X3R1cGxlLCAgLypQeU9iamVjdCAqbmFtZXMsKi8KLQkJZW1wdHlfdHVwbGUsICAvKlB5T2JqZWN0ICp2YXJuYW1lcywqLwotCQllbXB0eV90dXBsZSwgIC8qUHlPYmplY3QgKmZyZWV2YXJzLCovCi0JCWVtcHR5X3R1cGxlLCAgLypQeU9iamVjdCAqY2VsbHZhcnMsKi8KLQkJcHlfc3JjZmlsZSwgICAvKlB5T2JqZWN0ICpmaWxlbmFtZSwqLwotCQlweV9mdW5jbmFtZSwgIC8qUHlPYmplY3QgKm5hbWUsKi8KLQkJbGluZW5vLCAgIC8qaW50IGZpcnN0bGluZW5vLCovCi0JCWVtcHR5X3N0cmluZyAgLypQeU9iamVjdCAqbG5vdGFiKi8KLQkJKTsKLQlpZiAoIXB5X2NvZGUpIGdvdG8gYmFkOwotCXB5X2ZyYW1lID0gUHlGcmFtZV9OZXcoCi0JCVB5VGhyZWFkU3RhdGVfR2V0KCksIC8qUHlUaHJlYWRTdGF0ZSAqdHN0YXRlLCovCi0JCXB5X2NvZGUsICAgICAgICAgICAgIC8qUHlDb2RlT2JqZWN0ICpjb2RlLCovCi0JCXB5X2dsb2JhbHMsICAgICAgICAgIC8qUHlPYmplY3QgKmdsb2JhbHMsKi8KLQkJMCAgICAgICAgICAgICAgICAgICAgLypQeU9iamVjdCAqbG9jYWxzKi8KLQkJKTsKLQlpZiAoIXB5X2ZyYW1lKSBnb3RvIGJhZDsKLQlweV9mcmFtZS0+Zl9saW5lbm8gPSBsaW5lbm87Ci0JUHlUcmFjZUJhY2tfSGVyZShweV9mcmFtZSk7CisgICAgUHlPYmplY3QgKnB5X3NyY2ZpbGUgPSAwOworICAgIFB5T2JqZWN0ICpweV9mdW5jbmFtZSA9IDA7CisgICAgUHlPYmplY3QgKnB5X2dsb2JhbHMgPSAwOworICAgIFB5T2JqZWN0ICplbXB0eV90dXBsZSA9IDA7CisgICAgUHlPYmplY3QgKmVtcHR5X3N0cmluZyA9IDA7CisgICAgUHlDb2RlT2JqZWN0ICpweV9jb2RlID0gMDsKKyAgICBQeUZyYW1lT2JqZWN0ICpweV9mcmFtZSA9IDA7CisKKyAgICBweV9zcmNmaWxlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSk7CisgICAgaWYgKCFweV9zcmNmaWxlKSBnb3RvIGJhZDsKKyAgICBweV9mdW5jbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZnVuY25hbWUpOworICAgIGlmICghcHlfZnVuY25hbWUpIGdvdG8gYmFkOworICAgIHB5X2dsb2JhbHMgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFweV9nbG9iYWxzKSBnb3RvIGJhZDsKKyAgICBlbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmICghZW1wdHlfdHVwbGUpIGdvdG8gYmFkOworICAgIGVtcHR5X3N0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIGlmICghZW1wdHlfc3RyaW5nKSBnb3RvIGJhZDsKKyAgICBweV9jb2RlID0gUHlDb2RlX05ldygKKyAgICAgICAgMCwgICAgICAgICAgICAvKmludCBhcmdjb3VudCwqLworICAgICAgICAwLCAgICAgICAgICAgIC8qaW50IG5sb2NhbHMsKi8KKyAgICAgICAgMCwgICAgICAgICAgICAvKmludCBzdGFja3NpemUsKi8KKyAgICAgICAgMCwgICAgICAgICAgICAvKmludCBmbGFncywqLworICAgICAgICBlbXB0eV9zdHJpbmcsIC8qUHlPYmplY3QgKmNvZGUsKi8KKyAgICAgICAgZW1wdHlfdHVwbGUsICAvKlB5T2JqZWN0ICpjb25zdHMsKi8KKyAgICAgICAgZW1wdHlfdHVwbGUsICAvKlB5T2JqZWN0ICpuYW1lcywqLworICAgICAgICBlbXB0eV90dXBsZSwgIC8qUHlPYmplY3QgKnZhcm5hbWVzLCovCisgICAgICAgIGVtcHR5X3R1cGxlLCAgLypQeU9iamVjdCAqZnJlZXZhcnMsKi8KKyAgICAgICAgZW1wdHlfdHVwbGUsICAvKlB5T2JqZWN0ICpjZWxsdmFycywqLworICAgICAgICBweV9zcmNmaWxlLCAgIC8qUHlPYmplY3QgKmZpbGVuYW1lLCovCisgICAgICAgIHB5X2Z1bmNuYW1lLCAgLypQeU9iamVjdCAqbmFtZSwqLworICAgICAgICBsaW5lbm8sICAgLyppbnQgZmlyc3RsaW5lbm8sKi8KKyAgICAgICAgZW1wdHlfc3RyaW5nICAvKlB5T2JqZWN0ICpsbm90YWIqLworICAgICAgICApOworICAgIGlmICghcHlfY29kZSkgZ290byBiYWQ7CisgICAgcHlfZnJhbWUgPSBQeUZyYW1lX05ldygKKyAgICAgICAgUHlUaHJlYWRTdGF0ZV9HZXQoKSwgLypQeVRocmVhZFN0YXRlICp0c3RhdGUsKi8KKyAgICAgICAgcHlfY29kZSwgICAgICAgICAgICAgLypQeUNvZGVPYmplY3QgKmNvZGUsKi8KKyAgICAgICAgcHlfZ2xvYmFscywgICAgICAgICAgLypQeU9iamVjdCAqZ2xvYmFscywqLworICAgICAgICAwICAgICAgICAgICAgICAgICAgICAvKlB5T2JqZWN0ICpsb2NhbHMqLworICAgICAgICApOworICAgIGlmICghcHlfZnJhbWUpIGdvdG8gYmFkOworICAgIHB5X2ZyYW1lLT5mX2xpbmVubyA9IGxpbmVubzsKKyAgICBQeVRyYWNlQmFja19IZXJlKHB5X2ZyYW1lKTsKICAgYmFkOgotCVB5X1hERUNSRUYocHlfZ2xvYmFscyk7Ci0JUHlfWERFQ1JFRihweV9zcmNmaWxlKTsKLQlQeV9YREVDUkVGKHB5X2Z1bmNuYW1lKTsKLQlQeV9YREVDUkVGKGVtcHR5X3R1cGxlKTsKLQlQeV9YREVDUkVGKGVtcHR5X3N0cmluZyk7Ci0JUHlfWERFQ1JFRihweV9jb2RlKTsKLQlQeV9YREVDUkVGKHB5X2ZyYW1lKTsKKyAgICBQeV9YREVDUkVGKHB5X2dsb2JhbHMpOworICAgIFB5X1hERUNSRUYocHlfc3JjZmlsZSk7CisgICAgUHlfWERFQ1JFRihweV9mdW5jbmFtZSk7CisgICAgUHlfWERFQ1JFRihlbXB0eV90dXBsZSk7CisgICAgUHlfWERFQ1JFRihlbXB0eV9zdHJpbmcpOworICAgIFB5X1hERUNSRUYocHlfY29kZSk7CisgICAgUHlfWERFQ1JFRihweV9mcmFtZSk7CiB9CiAKICNpZmRlZiBNU19XSU4zMgpAQCAtMTY3LDE1ICsxNjcsMTUgQEAKIHN0YXRpYyB2b2lkCiBUcnlBZGRSZWYoU3RnRGljdE9iamVjdCAqZGljdCwgQ0RhdGFPYmplY3QgKm9iaikKIHsKLQlJVW5rbm93biAqcHVuazsKKyAgICBJVW5rbm93biAqcHVuazsKIAotCWlmIChOVUxMID09IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKWRpY3QsICJfbmVlZHNfY29tX2FkZHJlZl8iKSkKLQkJcmV0dXJuOworICAgIGlmIChOVUxMID09IFB5RGljdF9HZXRJdGVtU3RyaW5nKChQeU9iamVjdCAqKWRpY3QsICJfbmVlZHNfY29tX2FkZHJlZl8iKSkKKyAgICAgICAgcmV0dXJuOwogCi0JcHVuayA9ICooSVVua25vd24gKiopb2JqLT5iX3B0cjsKLQlpZiAocHVuaykKLQkJcHVuay0+bHBWdGJsLT5BZGRSZWYocHVuayk7Ci0JcmV0dXJuOworICAgIHB1bmsgPSAqKElVbmtub3duICoqKW9iai0+Yl9wdHI7CisgICAgaWYgKHB1bmspCisgICAgICAgIHB1bmstPmxwVnRibC0+QWRkUmVmKHB1bmspOworICAgIHJldHVybjsKIH0KICNlbmRpZgogCkBAIC0xODUsNDIwICsxODUsNDIwIEBACiAgKgogICovCiBzdGF0aWMgdm9pZCBfQ2FsbFB5dGhvbk9iamVjdCh2b2lkICptZW0sCi0JCQkgICAgICBmZmlfdHlwZSAqcmVzdHlwZSwKLQkJCSAgICAgIFNFVEZVTkMgc2V0ZnVuYywKLQkJCSAgICAgIFB5T2JqZWN0ICpjYWxsYWJsZSwKLQkJCSAgICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAotCQkJICAgICAgaW50IGZsYWdzLAotCQkJICAgICAgdm9pZCAqKnBBcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX3R5cGUgKnJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRGVU5DIHNldGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2FsbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29udmVydGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipwQXJncykKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqYXJnbGlzdCA9IE5VTEw7Ci0JUHlfc3NpemVfdCBuQXJnczsKLQlQeU9iamVjdCAqZXJyb3Jfb2JqZWN0ID0gTlVMTDsKLQlpbnQgKnNwYWNlOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICphcmdsaXN0ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IG5BcmdzOworICAgIFB5T2JqZWN0ICplcnJvcl9vYmplY3QgPSBOVUxMOworICAgIGludCAqc3BhY2U7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1NUQVRFIHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyAgICBQeUdJTFN0YXRlX1NUQVRFIHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKICNlbmRpZgogCi0JbkFyZ3MgPSBQeVNlcXVlbmNlX0xlbmd0aChjb252ZXJ0ZXJzKTsKLQkvKiBIbS4gV2hhdCB0byByZXR1cm4gaW4gY2FzZSBvZiBlcnJvcj8KLQkgICBGb3IgQ09NLCAweEZGRkZGRkZGIHNlZW1zIGJldHRlciB0aGFuIDAuCi0JKi8KLQlpZiAobkFyZ3MgPCAwKSB7Ci0JCVByaW50RXJyb3IoIkJVRzogUHlTZXF1ZW5jZV9MZW5ndGgiKTsKLQkJZ290byBEb25lOwotCX0KKyAgICBuQXJncyA9IFB5U2VxdWVuY2VfTGVuZ3RoKGNvbnZlcnRlcnMpOworICAgIC8qIEhtLiBXaGF0IHRvIHJldHVybiBpbiBjYXNlIG9mIGVycm9yPworICAgICAgIEZvciBDT00sIDB4RkZGRkZGRkYgc2VlbXMgYmV0dGVyIHRoYW4gMC4KKyAgICAqLworICAgIGlmIChuQXJncyA8IDApIHsKKyAgICAgICAgUHJpbnRFcnJvcigiQlVHOiBQeVNlcXVlbmNlX0xlbmd0aCIpOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQogCi0JYXJnbGlzdCA9IFB5VHVwbGVfTmV3KG5BcmdzKTsKLQlpZiAoIWFyZ2xpc3QpIHsKLQkJUHJpbnRFcnJvcigiUHlUdXBsZV9OZXcoKSIpOwotCQlnb3RvIERvbmU7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBuQXJnczsgKytpKSB7Ci0JCS8qIE5vdGU6IG5ldyByZWZlcmVuY2UhICovCi0JCVB5T2JqZWN0ICpjbnYgPSBQeVNlcXVlbmNlX0dldEl0ZW0oY29udmVydGVycywgaSk7Ci0JCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JCWlmIChjbnYpCi0JCQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoY252KTsKLQkJZWxzZSB7Ci0JCQlQcmludEVycm9yKCJHZXR0aW5nIGFyZ3VtZW50IGNvbnZlcnRlciAlZFxuIiwgaSk7Ci0JCQlnb3RvIERvbmU7Ci0JCX0KKyAgICBhcmdsaXN0ID0gUHlUdXBsZV9OZXcobkFyZ3MpOworICAgIGlmICghYXJnbGlzdCkgeworICAgICAgICBQcmludEVycm9yKCJQeVR1cGxlX05ldygpIik7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG5BcmdzOyArK2kpIHsKKyAgICAgICAgLyogTm90ZTogbmV3IHJlZmVyZW5jZSEgKi8KKyAgICAgICAgUHlPYmplY3QgKmNudiA9IFB5U2VxdWVuY2VfR2V0SXRlbShjb252ZXJ0ZXJzLCBpKTsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICAgICAgaWYgKGNudikKKyAgICAgICAgICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdChjbnYpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFByaW50RXJyb3IoIkdldHRpbmcgYXJndW1lbnQgY29udmVydGVyICVkXG4iLCBpKTsKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgfQogCi0JCWlmIChkaWN0ICYmIGRpY3QtPmdldGZ1bmMgJiYgIUlzU2ltcGxlU3ViVHlwZShjbnYpKSB7Ci0JCQlQeU9iamVjdCAqdiA9IGRpY3QtPmdldGZ1bmMoKnBBcmdzLCBkaWN0LT5zaXplKTsKLQkJCWlmICghdikgewotCQkJCVByaW50RXJyb3IoImNyZWF0ZSBhcmd1bWVudCAlZDpcbiIsIGkpOwotCQkJCVB5X0RFQ1JFRihjbnYpOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCVB5VHVwbGVfU0VUX0lURU0oYXJnbGlzdCwgaSwgdik7Ci0JCQkvKiBYWFggWFhYIFhYCi0JCQkgICBXZSBoYXZlIHRoZSBwcm9ibGVtIHRoYXQgY19ieXRlIG9yIGNfc2hvcnQgaGF2ZSBkaWN0LT5zaXplIG9mCi0JCQkgICAxIHJlc3AuIDQsIGJ1dCB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBwdXNoZWQgYXMgc2l6ZW9mKGludCkgYnl0ZXMuCi0JCQkgICBCVFcsIHRoZSBzYW1lIHByb2JsZW0gb2NjdXJycyB3aGVuIHRoZXkgYXJlIHB1c2hlZCBhcyBwYXJhbWV0ZXJzCi0JCQkqLwotCQl9IGVsc2UgaWYgKGRpY3QpIHsKLQkJCS8qIEhtLCBzaG91bGRuJ3Qgd2UgdXNlIENEYXRhX0F0QWRkcmVzcygpIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgaW5zdGVhZD8gKi8KLQkJCUNEYXRhT2JqZWN0ICpvYmogPSAoQ0RhdGFPYmplY3QgKilQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNudiwgTlVMTCk7Ci0JCQlpZiAoIW9iaikgewotCQkJCVByaW50RXJyb3IoImNyZWF0ZSBhcmd1bWVudCAlZDpcbiIsIGkpOwotCQkJCVB5X0RFQ1JFRihjbnYpOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCWlmICghQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkgewotCQkJCVB5X0RFQ1JFRihvYmopOwotCQkJCVB5X0RFQ1JFRihjbnYpOwotCQkJCVByaW50RXJyb3IoInVuZXhwZWN0ZWQgcmVzdWx0IG9mIGNyZWF0ZSBhcmd1bWVudCAlZDpcbiIsIGkpOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCW1lbWNweShvYmotPmJfcHRyLCAqcEFyZ3MsIGRpY3QtPnNpemUpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShhcmdsaXN0LCBpLCAoUHlPYmplY3QgKilvYmopOworICAgICAgICBpZiAoZGljdCAmJiBkaWN0LT5nZXRmdW5jICYmICFJc1NpbXBsZVN1YlR5cGUoY252KSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBkaWN0LT5nZXRmdW5jKCpwQXJncywgZGljdC0+c2l6ZSk7CisgICAgICAgICAgICBpZiAoIXYpIHsKKyAgICAgICAgICAgICAgICBQcmludEVycm9yKCJjcmVhdGUgYXJndW1lbnQgJWQ6XG4iLCBpKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY252KTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ2xpc3QsIGksIHYpOworICAgICAgICAgICAgLyogWFhYIFhYWCBYWAorICAgICAgICAgICAgICAgV2UgaGF2ZSB0aGUgcHJvYmxlbSB0aGF0IGNfYnl0ZSBvciBjX3Nob3J0IGhhdmUgZGljdC0+c2l6ZSBvZgorICAgICAgICAgICAgICAgMSByZXNwLiA0LCBidXQgdGhlc2UgcGFyYW1ldGVycyBhcmUgcHVzaGVkIGFzIHNpemVvZihpbnQpIGJ5dGVzLgorICAgICAgICAgICAgICAgQlRXLCB0aGUgc2FtZSBwcm9ibGVtIG9jY3VycnMgd2hlbiB0aGV5IGFyZSBwdXNoZWQgYXMgcGFyYW1ldGVycworICAgICAgICAgICAgKi8KKyAgICAgICAgfSBlbHNlIGlmIChkaWN0KSB7CisgICAgICAgICAgICAvKiBIbSwgc2hvdWxkbid0IHdlIHVzZSBDRGF0YV9BdEFkZHJlc3MoKSBvciBzb21ldGhpbmcgbGlrZSB0aGF0IGluc3RlYWQ/ICovCisgICAgICAgICAgICBDRGF0YU9iamVjdCAqb2JqID0gKENEYXRhT2JqZWN0ICopUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjbnYsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFvYmopIHsKKyAgICAgICAgICAgICAgICBQcmludEVycm9yKCJjcmVhdGUgYXJndW1lbnQgJWQ6XG4iLCBpKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY252KTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKG9iaikpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY252KTsKKyAgICAgICAgICAgICAgICBQcmludEVycm9yKCJ1bmV4cGVjdGVkIHJlc3VsdCBvZiBjcmVhdGUgYXJndW1lbnQgJWQ6XG4iLCBpKTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkob2JqLT5iX3B0ciwgKnBBcmdzLCBkaWN0LT5zaXplKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJnbGlzdCwgaSwgKFB5T2JqZWN0ICopb2JqKTsKICNpZmRlZiBNU19XSU4zMgotCQkJVHJ5QWRkUmVmKGRpY3QsIG9iaik7CisgICAgICAgICAgICBUcnlBZGRSZWYoZGljdCwgb2JqKTsKICNlbmRpZgotCQl9IGVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNhbm5vdCBidWlsZCBwYXJhbWV0ZXIiKTsKLQkJCVByaW50RXJyb3IoIlBhcnNpbmcgYXJndW1lbnQgJWRcbiIsIGkpOwotCQkJUHlfREVDUkVGKGNudik7Ci0JCQlnb3RvIERvbmU7Ci0JCX0KLQkJUHlfREVDUkVGKGNudik7Ci0JCS8qIFhYWCBlcnJvciBoYW5kbGluZyEgKi8KLQkJcEFyZ3MrKzsKLQl9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYnVpbGQgcGFyYW1ldGVyIik7CisgICAgICAgICAgICBQcmludEVycm9yKCJQYXJzaW5nIGFyZ3VtZW50ICVkXG4iLCBpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjbnYpOworICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihjbnYpOworICAgICAgICAvKiBYWFggZXJyb3IgaGFuZGxpbmchICovCisgICAgICAgIHBBcmdzKys7CisgICAgfQogCiAjZGVmaW5lIENIRUNLKHdoYXQsIHgpIFwKIGlmICh4ID09IE5VTEwpIF9BZGRUcmFjZWJhY2sod2hhdCwgIl9jdHlwZXMvY2FsbGJhY2tzLmMiLCBfX0xJTkVfXyAtIDEpLCBQeUVycl9QcmludCgpCiAKLQlpZiAoZmxhZ3MgJiAoRlVOQ0ZMQUdfVVNFX0VSUk5PIHwgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikpIHsKLQkJZXJyb3Jfb2JqZWN0ID0gZ2V0X2Vycm9yX29iamVjdCgmc3BhY2UpOwotCQlpZiAoZXJyb3Jfb2JqZWN0ID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCWlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgewotCQkJaW50IHRlbXAgPSBzcGFjZVswXTsKLQkJCXNwYWNlWzBdID0gZXJybm87Ci0JCQllcnJubyA9IHRlbXA7Ci0JCX0KKyAgICBpZiAoZmxhZ3MgJiAoRlVOQ0ZMQUdfVVNFX0VSUk5PIHwgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikpIHsKKyAgICAgICAgZXJyb3Jfb2JqZWN0ID0gZ2V0X2Vycm9yX29iamVjdCgmc3BhY2UpOworICAgICAgICBpZiAoZXJyb3Jfb2JqZWN0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICAgICAgaW50IHRlbXAgPSBzcGFjZVswXTsKKyAgICAgICAgICAgIHNwYWNlWzBdID0gZXJybm87CisgICAgICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgICAgIH0KICNpZmRlZiBNU19XSU4zMgotCQlpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7Ci0JCQlpbnQgdGVtcCA9IHNwYWNlWzFdOwotCQkJc3BhY2VbMV0gPSBHZXRMYXN0RXJyb3IoKTsKLQkJCVNldExhc3RFcnJvcih0ZW1wKTsKLQkJfQorICAgICAgICBpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7CisgICAgICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzFdOworICAgICAgICAgICAgc3BhY2VbMV0gPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIFNldExhc3RFcnJvcih0ZW1wKTsKKyAgICAgICAgfQogI2VuZGlmCi0JfQorICAgIH0KIAotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2FsbGFibGUsIGFyZ2xpc3QpOwotCUNIRUNLKCInY2FsbGluZyBjYWxsYmFjayBmdW5jdGlvbiciLCByZXN1bHQpOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2FsbGFibGUsIGFyZ2xpc3QpOworICAgIENIRUNLKCInY2FsbGluZyBjYWxsYmFjayBmdW5jdGlvbiciLCByZXN1bHQpOwogCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMV07Ci0JCXNwYWNlWzFdID0gR2V0TGFzdEVycm9yKCk7Ci0JCVNldExhc3RFcnJvcih0ZW1wKTsKLQl9CisgICAgaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzFdOworICAgICAgICBzcGFjZVsxXSA9IEdldExhc3RFcnJvcigpOworICAgICAgICBTZXRMYXN0RXJyb3IodGVtcCk7CisgICAgfQogI2VuZGlmCi0JaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0VSUk5PKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMF07Ci0JCXNwYWNlWzBdID0gZXJybm87Ci0JCWVycm5vID0gdGVtcDsKLQl9Ci0JUHlfWERFQ1JFRihlcnJvcl9vYmplY3QpOworICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzBdOworICAgICAgICBzcGFjZVswXSA9IGVycm5vOworICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgfQorICAgIFB5X1hERUNSRUYoZXJyb3Jfb2JqZWN0KTsKIAotCWlmICgocmVzdHlwZSAhPSAmZmZpX3R5cGVfdm9pZCkgJiYgcmVzdWx0KSB7Ci0JCVB5T2JqZWN0ICprZWVwOwotCQlhc3NlcnQoc2V0ZnVuYyk7CisgICAgaWYgKChyZXN0eXBlICE9ICZmZmlfdHlwZV92b2lkKSAmJiByZXN1bHQpIHsKKyAgICAgICAgUHlPYmplY3QgKmtlZXA7CisgICAgICAgIGFzc2VydChzZXRmdW5jKTsKICNpZmRlZiBXT1JEU19CSUdFTkRJQU4KLQkJLyogU2VlIHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gY2FsbHByb2MuYywgYXJvdW5kIGxpbmUgOTYxICovCi0JCWlmIChyZXN0eXBlLT50eXBlICE9IEZGSV9UWVBFX0ZMT0FUICYmIHJlc3R5cGUtPnNpemUgPCBzaXplb2YoZmZpX2FyZykpCi0JCQltZW0gPSAoY2hhciAqKW1lbSArIHNpemVvZihmZmlfYXJnKSAtIHJlc3R5cGUtPnNpemU7CisgICAgICAgIC8qIFNlZSB0aGUgY29ycmVzcG9uZGluZyBjb2RlIGluIGNhbGxwcm9jLmMsIGFyb3VuZCBsaW5lIDk2MSAqLworICAgICAgICBpZiAocmVzdHlwZS0+dHlwZSAhPSBGRklfVFlQRV9GTE9BVCAmJiByZXN0eXBlLT5zaXplIDwgc2l6ZW9mKGZmaV9hcmcpKQorICAgICAgICAgICAgbWVtID0gKGNoYXIgKiltZW0gKyBzaXplb2YoZmZpX2FyZykgLSByZXN0eXBlLT5zaXplOwogI2VuZGlmCi0JCWtlZXAgPSBzZXRmdW5jKG1lbSwgcmVzdWx0LCAwKTsKLQkJQ0hFQ0soIidjb252ZXJ0aW5nIGNhbGxiYWNrIHJlc3VsdCciLCBrZWVwKTsKLQkJLyoga2VlcCBpcyBhbiBvYmplY3Qgd2UgaGF2ZSB0byBrZWVwIGFsaXZlIHNvIHRoYXQgdGhlIHJlc3VsdAotCQkgICBzdGF5cyB2YWxpZC4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggb2JqZWN0LCB0aGUgc2V0ZnVuYyB3aWxsCi0JCSAgIGhhdmUgcmV0dXJuZWQgUHlfTm9uZS4KKyAgICAgICAga2VlcCA9IHNldGZ1bmMobWVtLCByZXN1bHQsIDApOworICAgICAgICBDSEVDSygiJ2NvbnZlcnRpbmcgY2FsbGJhY2sgcmVzdWx0JyIsIGtlZXApOworICAgICAgICAvKiBrZWVwIGlzIGFuIG9iamVjdCB3ZSBoYXZlIHRvIGtlZXAgYWxpdmUgc28gdGhhdCB0aGUgcmVzdWx0CisgICAgICAgICAgIHN0YXlzIHZhbGlkLiAgSWYgdGhlcmUgaXMgbm8gc3VjaCBvYmplY3QsIHRoZSBzZXRmdW5jIHdpbGwKKyAgICAgICAgICAgaGF2ZSByZXR1cm5lZCBQeV9Ob25lLgogCi0JCSAgIElmIHRoZXJlIGlzIHN1Y2ggYW4gb2JqZWN0LCB3ZSBoYXZlIG5vIGNob2ljZSB0aGFuIHRvIGtlZXAKLQkJICAgaXQgYWxpdmUgZm9yZXZlciAtIGJ1dCBhIHJlZmNvdW50IGFuZC9vciBtZW1vcnkgbGVhayB3aWxsCi0JCSAgIGJlIHRoZSByZXN1bHQuICBFWENFUFQgd2hlbiByZXN0eXBlIGlzIHB5X29iamVjdCAtIFB5dGhvbgotCQkgICBpdHNlbGYga25vd3MgaG93IHRvIG1hbmFnZSB0aGUgcmVmY291bnQgb2YgdGhlc2Ugb2JqZWN0cy4KLQkJKi8KLQkJaWYgKGtlZXAgPT0gTlVMTCkgLyogQ291bGQgbm90IGNvbnZlcnQgY2FsbGJhY2sgcmVzdWx0LiAqLwotCQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNhbGxhYmxlKTsKLQkJZWxzZSBpZiAoa2VlcCA9PSBQeV9Ob25lKSAvKiBOb3RoaW5nIHRvIGtlZXAgKi8KLQkJCVB5X0RFQ1JFRihrZWVwKTsKLQkJZWxzZSBpZiAoc2V0ZnVuYyAhPSBnZXRlbnRyeSgiTyIpLT5zZXRmdW5jKSB7Ci0JCQlpZiAoLTEgPT0gUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywKLQkJCQkJICAgICAibWVtb3J5IGxlYWsgaW4gY2FsbGJhY2sgZnVuY3Rpb24uIikpCi0JCQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNhbGxhYmxlKTsKLQkJfQotCX0KLQlQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgIElmIHRoZXJlIGlzIHN1Y2ggYW4gb2JqZWN0LCB3ZSBoYXZlIG5vIGNob2ljZSB0aGFuIHRvIGtlZXAKKyAgICAgICAgICAgaXQgYWxpdmUgZm9yZXZlciAtIGJ1dCBhIHJlZmNvdW50IGFuZC9vciBtZW1vcnkgbGVhayB3aWxsCisgICAgICAgICAgIGJlIHRoZSByZXN1bHQuICBFWENFUFQgd2hlbiByZXN0eXBlIGlzIHB5X29iamVjdCAtIFB5dGhvbgorICAgICAgICAgICBpdHNlbGYga25vd3MgaG93IHRvIG1hbmFnZSB0aGUgcmVmY291bnQgb2YgdGhlc2Ugb2JqZWN0cy4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGtlZXAgPT0gTlVMTCkgLyogQ291bGQgbm90IGNvbnZlcnQgY2FsbGJhY2sgcmVzdWx0LiAqLworICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNhbGxhYmxlKTsKKyAgICAgICAgZWxzZSBpZiAoa2VlcCA9PSBQeV9Ob25lKSAvKiBOb3RoaW5nIHRvIGtlZXAgKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZWVwKTsKKyAgICAgICAgZWxzZSBpZiAoc2V0ZnVuYyAhPSBnZXRlbnRyeSgiTyIpLT5zZXRmdW5jKSB7CisgICAgICAgICAgICBpZiAoLTEgPT0gUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZW1vcnkgbGVhayBpbiBjYWxsYmFjayBmdW5jdGlvbi4iKSkKKyAgICAgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY2FsbGFibGUpOworICAgICAgICB9CisgICAgfQorICAgIFB5X1hERUNSRUYocmVzdWx0KTsKICAgRG9uZToKLQlQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworICAgIFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CiAjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgY2xvc3VyZV9mY24oZmZpX2NpZiAqY2lmLAotCQkJdm9pZCAqcmVzcCwKLQkJCXZvaWQgKiphcmdzLAotCQkJdm9pZCAqdXNlcmRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSkKIHsKLQlDVGh1bmtPYmplY3QgKnAgPSAoQ1RodW5rT2JqZWN0ICopdXNlcmRhdGE7CisgICAgQ1RodW5rT2JqZWN0ICpwID0gKENUaHVua09iamVjdCAqKXVzZXJkYXRhOwogCi0JX0NhbGxQeXRob25PYmplY3QocmVzcCwKLQkJCSAgcC0+ZmZpX3Jlc3R5cGUsCi0JCQkgIHAtPnNldGZ1bmMsCi0JCQkgIHAtPmNhbGxhYmxlLAotCQkJICBwLT5jb252ZXJ0ZXJzLAotCQkJICBwLT5mbGFncywKLQkJCSAgYXJncyk7CisgICAgX0NhbGxQeXRob25PYmplY3QocmVzcCwKKyAgICAgICAgICAgICAgICAgICAgICBwLT5mZmlfcmVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBwLT5zZXRmdW5jLAorICAgICAgICAgICAgICAgICAgICAgIHAtPmNhbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgIHAtPmNvbnZlcnRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgcC0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgYXJncyk7CiB9CiAKIHN0YXRpYyBDVGh1bmtPYmplY3QqIENUaHVua09iamVjdF9uZXcoUHlfc3NpemVfdCBuQXJncykKIHsKLQlDVGh1bmtPYmplY3QgKnA7Ci0JaW50IGk7CisgICAgQ1RodW5rT2JqZWN0ICpwOworICAgIGludCBpOwogCi0JcCA9IFB5T2JqZWN0X0dDX05ld1ZhcihDVGh1bmtPYmplY3QsICZDVGh1bmtfVHlwZSwgbkFyZ3MpOwotCWlmIChwID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHAgPSBQeU9iamVjdF9HQ19OZXdWYXIoQ1RodW5rT2JqZWN0LCAmQ1RodW5rX1R5cGUsIG5BcmdzKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXAtPnBjbCA9IE5VTEw7Ci0JbWVtc2V0KCZwLT5jaWYsIDAsIHNpemVvZihwLT5jaWYpKTsKLQlwLT5jb252ZXJ0ZXJzID0gTlVMTDsKLQlwLT5jYWxsYWJsZSA9IE5VTEw7Ci0JcC0+c2V0ZnVuYyA9IE5VTEw7Ci0JcC0+ZmZpX3Jlc3R5cGUgPSBOVUxMOwotCQotCWZvciAoaSA9IDA7IGkgPCBuQXJncyArIDE7ICsraSkKLQkJcC0+YXR5cGVzW2ldID0gTlVMTDsKLQlQeU9iamVjdF9HQ19UcmFjaygoUHlPYmplY3QgKilwKTsKLQlyZXR1cm4gcDsKKyAgICBwLT5wY2wgPSBOVUxMOworICAgIG1lbXNldCgmcC0+Y2lmLCAwLCBzaXplb2YocC0+Y2lmKSk7CisgICAgcC0+Y29udmVydGVycyA9IE5VTEw7CisgICAgcC0+Y2FsbGFibGUgPSBOVUxMOworICAgIHAtPnNldGZ1bmMgPSBOVUxMOworICAgIHAtPmZmaV9yZXN0eXBlID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuQXJncyArIDE7ICsraSkKKyAgICAgICAgcC0+YXR5cGVzW2ldID0gTlVMTDsKKyAgICBQeU9iamVjdF9HQ19UcmFjaygoUHlPYmplY3QgKilwKTsKKyAgICByZXR1cm4gcDsKIH0KIAogQ1RodW5rT2JqZWN0ICpBbGxvY0Z1bmN0aW9uQ2FsbGJhY2soUHlPYmplY3QgKmNhbGxhYmxlLAotCQkJCSAgICBQeU9iamVjdCAqY29udmVydGVycywKLQkJCQkgICAgUHlPYmplY3QgKnJlc3R5cGUsCi0JCQkJICAgIGludCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCiB7Ci0JaW50IHJlc3VsdDsKLQlDVGh1bmtPYmplY3QgKnA7Ci0JUHlfc3NpemVfdCBuQXJncywgaTsKLQlmZmlfYWJpIGNjOworICAgIGludCByZXN1bHQ7CisgICAgQ1RodW5rT2JqZWN0ICpwOworICAgIFB5X3NzaXplX3QgbkFyZ3MsIGk7CisgICAgZmZpX2FiaSBjYzsKIAotCW5BcmdzID0gUHlTZXF1ZW5jZV9TaXplKGNvbnZlcnRlcnMpOwotCXAgPSBDVGh1bmtPYmplY3RfbmV3KG5BcmdzKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuQXJncyA9IFB5U2VxdWVuY2VfU2l6ZShjb252ZXJ0ZXJzKTsKKyAgICBwID0gQ1RodW5rT2JqZWN0X25ldyhuQXJncyk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQoQ1RodW5rX0NoZWNrRXhhY3QocCkpOworICAgIGFzc2VydChDVGh1bmtfQ2hlY2tFeGFjdChwKSk7CiAKLQlwLT5wY2wgPSBNYWxsb2NDbG9zdXJlKCk7Ci0JaWYgKHAtPnBjbCA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIHAtPnBjbCA9IE1hbGxvY0Nsb3N1cmUoKTsKKyAgICBpZiAocC0+cGNsID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlwLT5mbGFncyA9IGZsYWdzOwotCWZvciAoaSA9IDA7IGkgPCBuQXJnczsgKytpKSB7Ci0JCVB5T2JqZWN0ICpjbnYgPSBQeVNlcXVlbmNlX0dldEl0ZW0oY29udmVydGVycywgaSk7Ci0JCWlmIChjbnYgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCXAtPmF0eXBlc1tpXSA9IEdldFR5cGUoY252KTsKLQkJUHlfREVDUkVGKGNudik7Ci0JfQotCXAtPmF0eXBlc1tpXSA9IE5VTEw7CisgICAgcC0+ZmxhZ3MgPSBmbGFnczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkFyZ3M7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqY252ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGNvbnZlcnRlcnMsIGkpOworICAgICAgICBpZiAoY252ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBwLT5hdHlwZXNbaV0gPSBHZXRUeXBlKGNudik7CisgICAgICAgIFB5X0RFQ1JFRihjbnYpOworICAgIH0KKyAgICBwLT5hdHlwZXNbaV0gPSBOVUxMOwogCi0JUHlfSU5DUkVGKHJlc3R5cGUpOwotCXAtPnJlc3R5cGUgPSByZXN0eXBlOwotCWlmIChyZXN0eXBlID09IFB5X05vbmUpIHsKLQkJcC0+c2V0ZnVuYyA9IE5VTEw7Ci0JCXAtPmZmaV9yZXN0eXBlID0gJmZmaV90eXBlX3ZvaWQ7Ci0JfSBlbHNlIHsKLQkJU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHJlc3R5cGUpOwotCQlpZiAoZGljdCA9PSBOVUxMIHx8IGRpY3QtPnNldGZ1bmMgPT0gTlVMTCkgewotCQkgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAiaW52YWxpZCByZXN1bHQgdHlwZSBmb3IgY2FsbGJhY2sgZnVuY3Rpb24iKTsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JCXAtPnNldGZ1bmMgPSBkaWN0LT5zZXRmdW5jOwotCQlwLT5mZmlfcmVzdHlwZSA9ICZkaWN0LT5mZmlfdHlwZV9wb2ludGVyOwotCX0KKyAgICBQeV9JTkNSRUYocmVzdHlwZSk7CisgICAgcC0+cmVzdHlwZSA9IHJlc3R5cGU7CisgICAgaWYgKHJlc3R5cGUgPT0gUHlfTm9uZSkgeworICAgICAgICBwLT5zZXRmdW5jID0gTlVMTDsKKyAgICAgICAgcC0+ZmZpX3Jlc3R5cGUgPSAmZmZpX3R5cGVfdm9pZDsKKyAgICB9IGVsc2UgeworICAgICAgICBTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QocmVzdHlwZSk7CisgICAgICAgIGlmIChkaWN0ID09IE5VTEwgfHwgZGljdC0+c2V0ZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmVzdWx0IHR5cGUgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uIik7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBwLT5zZXRmdW5jID0gZGljdC0+c2V0ZnVuYzsKKyAgICAgICAgcC0+ZmZpX3Jlc3R5cGUgPSAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKKyAgICB9CiAKLQljYyA9IEZGSV9ERUZBVUxUX0FCSTsKKyAgICBjYyA9IEZGSV9ERUZBVUxUX0FCSTsKICNpZiBkZWZpbmVkKE1TX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAhZGVmaW5lZChNU19XSU42NCkKLQlpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpID09IDApCi0JCWNjID0gRkZJX1NURENBTEw7CisgICAgaWYgKChmbGFncyAmIEZVTkNGTEFHX0NERUNMKSA9PSAwKQorICAgICAgICBjYyA9IEZGSV9TVERDQUxMOwogI2VuZGlmCi0JcmVzdWx0ID0gZmZpX3ByZXBfY2lmKCZwLT5jaWYsIGNjLAotCQkJICAgICAgUHlfU0FGRV9ET1dOQ0FTVChuQXJncywgUHlfc3NpemVfdCwgaW50KSwKLQkJCSAgICAgIEdldFR5cGUocmVzdHlwZSksCi0JCQkgICAgICAmcC0+YXR5cGVzWzBdKTsKLQlpZiAocmVzdWx0ICE9IEZGSV9PSykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgICAiZmZpX3ByZXBfY2lmIGZhaWxlZCB3aXRoICVkIiwgcmVzdWx0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JcmVzdWx0ID0gZmZpX3ByZXBfY2xvc3VyZShwLT5wY2wsICZwLT5jaWYsIGNsb3N1cmVfZmNuLCBwKTsKLQlpZiAocmVzdWx0ICE9IEZGSV9PSykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgICAiZmZpX3ByZXBfY2xvc3VyZSBmYWlsZWQgd2l0aCAlZCIsIHJlc3VsdCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIHJlc3VsdCA9IGZmaV9wcmVwX2NpZigmcC0+Y2lmLCBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0FGRV9ET1dOQ0FTVChuQXJncywgUHlfc3NpemVfdCwgaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VHlwZShyZXN0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPmF0eXBlc1swXSk7CisgICAgaWYgKHJlc3VsdCAhPSBGRklfT0spIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJmZmlfcHJlcF9jaWYgZmFpbGVkIHdpdGggJWQiLCByZXN1bHQpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICByZXN1bHQgPSBmZmlfcHJlcF9jbG9zdXJlKHAtPnBjbCwgJnAtPmNpZiwgY2xvc3VyZV9mY24sIHApOworICAgIGlmIChyZXN1bHQgIT0gRkZJX09LKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZmZpX3ByZXBfY2xvc3VyZSBmYWlsZWQgd2l0aCAlZCIsIHJlc3VsdCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JUHlfSU5DUkVGKGNvbnZlcnRlcnMpOwotCXAtPmNvbnZlcnRlcnMgPSBjb252ZXJ0ZXJzOwotCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0JcC0+Y2FsbGFibGUgPSBjYWxsYWJsZTsKLQlyZXR1cm4gcDsKKyAgICBQeV9JTkNSRUYoY29udmVydGVycyk7CisgICAgcC0+Y29udmVydGVycyA9IGNvbnZlcnRlcnM7CisgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICBwLT5jYWxsYWJsZSA9IGNhbGxhYmxlOworICAgIHJldHVybiBwOwogCiAgIGVycm9yOgotCVB5X1hERUNSRUYocCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihwKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIE1TX1dJTjMyCiAKIHN0YXRpYyB2b2lkIExvYWRQeXRob24odm9pZCkKIHsKLQlpZiAoIVB5X0lzSW5pdGlhbGl6ZWQoKSkgeworICAgIGlmICghUHlfSXNJbml0aWFsaXplZCgpKSB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlFdmFsX0luaXRUaHJlYWRzKCk7CisgICAgICAgIFB5RXZhbF9Jbml0VGhyZWFkcygpOwogI2VuZGlmCi0JCVB5X0luaXRpYWxpemUoKTsKLQl9CisgICAgICAgIFB5X0luaXRpYWxpemUoKTsKKyAgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGxvbmcgQ2FsbF9HZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsIFJFRklJRCByaWlkLCBMUFZPSUQgKnBwdikKIHsKLQlQeU9iamVjdCAqbW9kLCAqZnVuYywgKnJlc3VsdDsKLQlsb25nIHJldHZhbDsKLQlzdGF0aWMgUHlPYmplY3QgKmNvbnRleHQ7CisgICAgUHlPYmplY3QgKm1vZCwgKmZ1bmMsICpyZXN1bHQ7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb250ZXh0OwogCi0JaWYgKGNvbnRleHQgPT0gTlVMTCkKLQkJY29udGV4dCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9jdHlwZXMuRGxsR2V0Q2xhc3NPYmplY3QiKTsKKyAgICBpZiAoY29udGV4dCA9PSBOVUxMKQorICAgICAgICBjb250ZXh0ID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX2N0eXBlcy5EbGxHZXRDbGFzc09iamVjdCIpOwogCi0JbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygiY3R5cGVzIik7Ci0JaWYgKCFtb2QpIHsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7Ci0JCS8qIFRoZXJlIGhhcyBiZWVuIGEgd2FybmluZyBiZWZvcmUgYWJvdXQgdGhpcyBhbHJlYWR5ICovCi0JCXJldHVybiBFX0ZBSUw7Ci0JfQorICAgIG1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soImN0eXBlcyIpOworICAgIGlmICghbW9kKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOworICAgICAgICAvKiBUaGVyZSBoYXMgYmVlbiBhIHdhcm5pbmcgYmVmb3JlIGFib3V0IHRoaXMgYWxyZWFkeSAqLworICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIH0KIAotCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIkRsbEdldENsYXNzT2JqZWN0Iik7Ci0JUHlfREVDUkVGKG1vZCk7Ci0JaWYgKCFmdW5jKSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOwotCQlyZXR1cm4gRV9GQUlMOwotCX0KKyAgICBmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJEbGxHZXRDbGFzc09iamVjdCIpOworICAgIFB5X0RFQ1JFRihtb2QpOworICAgIGlmICghZnVuYykgeworICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICB9CiAKLQl7Ci0JCVB5T2JqZWN0ICpweV9yY2xzaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilyY2xzaWQpOwotCQlQeU9iamVjdCAqcHlfcmlpZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKXJpaWQpOwotCQlQeU9iamVjdCAqcHlfcHB2ID0gUHlMb25nX0Zyb21Wb2lkUHRyKHBwdik7Ci0JCWlmICghcHlfcmNsc2lkIHx8ICFweV9yaWlkIHx8ICFweV9wcHYpIHsKLQkJCVB5X1hERUNSRUYocHlfcmNsc2lkKTsKLQkJCVB5X1hERUNSRUYocHlfcmlpZCk7Ci0JCQlQeV9YREVDUkVGKHB5X3Bwdik7Ci0JCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKLQkJCXJldHVybiBFX0ZBSUw7Ci0JCX0KLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLAotCQkJCQkJICAgICAgcHlfcmNsc2lkLAotCQkJCQkJICAgICAgcHlfcmlpZCwKLQkJCQkJCSAgICAgIHB5X3BwdiwKLQkJCQkJCSAgICAgIE5VTEwpOwotCQlQeV9ERUNSRUYocHlfcmNsc2lkKTsKLQkJUHlfREVDUkVGKHB5X3JpaWQpOwotCQlQeV9ERUNSRUYocHlfcHB2KTsKLQl9Ci0JUHlfREVDUkVGKGZ1bmMpOwotCWlmICghcmVzdWx0KSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOwotCQlyZXR1cm4gRV9GQUlMOwotCX0KKyAgICB7CisgICAgICAgIFB5T2JqZWN0ICpweV9yY2xzaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilyY2xzaWQpOworICAgICAgICBQeU9iamVjdCAqcHlfcmlpZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKXJpaWQpOworICAgICAgICBQeU9iamVjdCAqcHlfcHB2ID0gUHlMb25nX0Zyb21Wb2lkUHRyKHBwdik7CisgICAgICAgIGlmICghcHlfcmNsc2lkIHx8ICFweV9yaWlkIHx8ICFweV9wcHYpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocHlfcmNsc2lkKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocHlfcmlpZCk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHB5X3Bwdik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X3JjbHNpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweV9yaWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X3BwdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKHB5X3JjbHNpZCk7CisgICAgICAgIFB5X0RFQ1JFRihweV9yaWlkKTsKKyAgICAgICAgUHlfREVDUkVGKHB5X3Bwdik7CisgICAgfQorICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIEVfRkFJTDsKKyAgICB9CiAKLQlyZXR2YWwgPSBQeUludF9Bc0xvbmcocmVzdWx0KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKLQkJcmV0dmFsID0gRV9GQUlMOwotCX0KLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHZhbCA9IFB5SW50X0FzTG9uZyhyZXN1bHQpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOworICAgICAgICByZXR2YWwgPSBFX0ZBSUw7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIFNUREFQSSBEbGxHZXRDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsCi0JCQkgUkVGSUlEIHJpaWQsCi0JCQkgTFBWT0lEICpwcHYpCisgICAgICAgICAgICAgICAgICAgICAgICAgUkVGSUlEIHJpaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEICpwcHYpCiB7Ci0JbG9uZyByZXN1bHQ7CisgICAgbG9uZyByZXN1bHQ7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1NUQVRFIHN0YXRlOworICAgIFB5R0lMU3RhdGVfU1RBVEUgc3RhdGU7CiAjZW5kaWYKIAotCUxvYWRQeXRob24oKTsKKyAgICBMb2FkUHl0aG9uKCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOwogI2VuZGlmCi0JcmVzdWx0ID0gQ2FsbF9HZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik7CisgICAgcmVzdWx0ID0gQ2FsbF9HZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworICAgIFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CiAjZW5kaWYKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGxvbmcgQ2FsbF9DYW5VbmxvYWROb3codm9pZCkKIHsKLQlQeU9iamVjdCAqbW9kLCAqZnVuYywgKnJlc3VsdDsKLQlsb25nIHJldHZhbDsKLQlzdGF0aWMgUHlPYmplY3QgKmNvbnRleHQ7CisgICAgUHlPYmplY3QgKm1vZCwgKmZ1bmMsICpyZXN1bHQ7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb250ZXh0OwogCi0JaWYgKGNvbnRleHQgPT0gTlVMTCkKLQkJY29udGV4dCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9jdHlwZXMuRGxsQ2FuVW5sb2FkTm93Iik7CisgICAgaWYgKGNvbnRleHQgPT0gTlVMTCkKKyAgICAgICAgY29udGV4dCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9jdHlwZXMuRGxsQ2FuVW5sb2FkTm93Iik7CiAKLQltb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJjdHlwZXMiKTsKLQlpZiAoIW1vZCkgewotLyoJCU91dHB1dERlYnVnU3RyaW5nKCJDb3VsZCBub3QgaW1wb3J0IGN0eXBlcyIpOyAqLwotCQkvKiBXZSBhc3N1bWUgdGhhdCB0aGlzIGVycm9yIGNhbiBvbmx5IG9jY3VyIHdoZW4gc2h1dHRpbmcKLQkJICAgZG93biwgc28gd2Ugc2lsZW50bHkgaWdub3JlIGl0ICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiBFX0ZBSUw7Ci0JfQotCS8qIE90aGVyIGVycm9ycyBjYW5ub3QgYmUgcmFpc2VkLCBidXQgYXJlIHByaW50ZWQgdG8gc3RkZXJyICovCi0JZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiRGxsQ2FuVW5sb2FkTm93Iik7Ci0JUHlfREVDUkVGKG1vZCk7Ci0JaWYgKCFmdW5jKSB7Ci0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOwotCQlyZXR1cm4gRV9GQUlMOwotCX0KKyAgICBtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJjdHlwZXMiKTsKKyAgICBpZiAoIW1vZCkgeworLyogICAgICAgICAgICAgIE91dHB1dERlYnVnU3RyaW5nKCJDb3VsZCBub3QgaW1wb3J0IGN0eXBlcyIpOyAqLworICAgICAgICAvKiBXZSBhc3N1bWUgdGhhdCB0aGlzIGVycm9yIGNhbiBvbmx5IG9jY3VyIHdoZW4gc2h1dHRpbmcKKyAgICAgICAgICAgZG93biwgc28gd2Ugc2lsZW50bHkgaWdub3JlIGl0ICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgfQorICAgIC8qIE90aGVyIGVycm9ycyBjYW5ub3QgYmUgcmFpc2VkLCBidXQgYXJlIHByaW50ZWQgdG8gc3RkZXJyICovCisgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiRGxsQ2FuVW5sb2FkTm93Iik7CisgICAgUHlfREVDUkVGKG1vZCk7CisgICAgaWYgKCFmdW5jKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShjb250ZXh0ID8gY29udGV4dCA6IFB5X05vbmUpOworICAgICAgICByZXR1cm4gRV9GQUlMOworICAgIH0KIAotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCBOVUxMKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JaWYgKCFyZXN1bHQpIHsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7Ci0JCXJldHVybiBFX0ZBSUw7Ci0JfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBFX0ZBSUw7CisgICAgfQogCi0JcmV0dmFsID0gUHlJbnRfQXNMb25nKHJlc3VsdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNvbnRleHQgPyBjb250ZXh0IDogUHlfTm9uZSk7Ci0JCXJldHZhbCA9IEVfRkFJTDsKLQl9Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR2YWwgPSBQeUludF9Bc0xvbmcocmVzdWx0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoY29udGV4dCA/IGNvbnRleHQgOiBQeV9Ob25lKTsKKyAgICAgICAgcmV0dmFsID0gRV9GQUlMOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAvKgpAQCAtNjA3LDI2ICs2MDcsMjYgQEAKIAogU1REQVBJIERsbENhblVubG9hZE5vdyh2b2lkKQogewotCWxvbmcgcmVzdWx0OworICAgIGxvbmcgcmVzdWx0OwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlHSUxTdGF0ZV9TVEFURSBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgUHlHSUxTdGF0ZV9TVEFURSBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAjZW5kaWYKLQlyZXN1bHQgPSBDYWxsX0NhblVubG9hZE5vdygpOworICAgIHJlc3VsdCA9IENhbGxfQ2FuVW5sb2FkTm93KCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1JlbGVhc2Uoc3RhdGUpOworICAgIFB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CiAjZW5kaWYKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKICNpZm5kZWYgUHlfTk9fRU5BQkxFX1NIQVJFRAogQk9PTCBXSU5BUEkgRGxsTWFpbihISU5TVEFOQ0UgaGluc3RETEwsIERXT1JEIGZkd1JlYXNvbiwgTFBWT0lEIGxwdlJlcykKIHsKLQlzd2l0Y2goZmR3UmVhc29uKSB7Ci0JY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6Ci0JCURpc2FibGVUaHJlYWRMaWJyYXJ5Q2FsbHMoaGluc3RETEwpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgc3dpdGNoKGZkd1JlYXNvbikgeworICAgIGNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgorICAgICAgICBEaXNhYmxlVGhyZWFkTGlicmFyeUNhbGxzKGhpbnN0RExMKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKaW5kZXggMGM1MWY4NC4uYzg0YjRmMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKQEAgLTksOSArOSw5IEBACiAgKi8KIC8qCiAgKiBSZWxhdGVkIFdvcms6Ci0gKgktIGNhbGxkbGwJaHR0cDovL3d3dy5uaWdodG1hcmUuY29tL3NvZnR3YXJlLmh0bWwKLSAqCS0gbGliZmZpCWh0dHA6Ly9zb3VyY2V3YXJlLmN5Z251cy5jb20vbGliZmZpLwotICoJLSBmZmNhbGwgCWh0dHA6Ly9jbGlzcC5jb25zLm9yZy9+aGFpYmxlL3BhY2thZ2VzLWZmY2FsbC5odG1sCisgKiAgICAgIC0gY2FsbGRsbCAgICAgICBodHRwOi8vd3d3Lm5pZ2h0bWFyZS5jb20vc29mdHdhcmUuaHRtbAorICogICAgICAtIGxpYmZmaSAgICAgICAgaHR0cDovL3NvdXJjZXdhcmUuY3lnbnVzLmNvbS9saWJmZmkvCisgKiAgICAgIC0gZmZjYWxsICAgICAgICBodHRwOi8vY2xpc3AuY29ucy5vcmcvfmhhaWJsZS9wYWNrYWdlcy1mZmNhbGwuaHRtbAogICogICBhbmQsIG9mIGNvdXJzZSwgRG9uIEJlYXVkcnkncyBNRVNTIHBhY2thZ2UsIGJ1dCB0aGlzIGlzIG1vcmUgY3R5cGVzCiAgKiAgIHJlbGF0ZWQuCiAgKi8KQEAgLTg3LDcgKzg3LDcgQEAKICAgY3R5cGVzIG1haW50YWlucyB0aHJlYWQtbG9jYWwgc3RvcmFnZSB0aGF0IGhhcyBzcGFjZSBmb3IgdHdvIGVycm9yIG51bWJlcnM6CiAgIHByaXZhdGUgY29waWVzIG9mIHRoZSBzeXN0ZW0gJ2Vycm5vJyB2YWx1ZSBhbmQsIG9uIFdpbmRvd3MsIHRoZSBzeXN0ZW0gZXJyb3IgY29kZQogICBhY2Nlc3NlZCBieSB0aGUgR2V0TGFzdEVycm9yKCkgYW5kIFNldExhc3RFcnJvcigpIGFwaSBmdW5jdGlvbnMuCi0gIAorCiAgIEZvcmVpZ24gZnVuY3Rpb25zIGNyZWF0ZWQgd2l0aCBDRExMKC4uLiwgdXNlX2Vycm5vPVRydWUpLCB3aGVuIGNhbGxlZCwgc3dhcAogICB0aGUgc3lzdGVtICdlcnJubycgdmFsdWUgd2l0aCB0aGUgcHJpdmF0ZSBjb3B5IGp1c3QgYmVmb3JlIHRoZSBhY3R1YWwKICAgZnVuY3Rpb24gY2FsbCwgYW5kIHN3YXBwZWQgYWdhaW4gaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcy4gIFRoZSAndXNlX2Vycm5vJwpAQCAtMTIwLDgyICsxMjAsODIgQEAKIFB5T2JqZWN0ICoKIGdldF9lcnJvcl9vYmplY3QoaW50ICoqcHNwYWNlKQogewotCVB5T2JqZWN0ICpkaWN0ID0gUHlUaHJlYWRTdGF0ZV9HZXREaWN0KCk7Ci0JUHlPYmplY3QgKmVycm9iajsKLQlzdGF0aWMgUHlPYmplY3QgKmVycm9yX29iamVjdF9uYW1lOwotCWlmIChkaWN0ID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiY2Fubm90IGdldCB0aHJlYWQgc3RhdGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChlcnJvcl9vYmplY3RfbmFtZSA9PSBOVUxMKSB7Ci0JCWVycm9yX29iamVjdF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiY3R5cGVzLmVycm9yX29iamVjdCIpOwotCQlpZiAoZXJyb3Jfb2JqZWN0X25hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllcnJvYmogPSBQeURpY3RfR2V0SXRlbShkaWN0LCBlcnJvcl9vYmplY3RfbmFtZSk7Ci0JaWYgKGVycm9iaikKLQkJUHlfSU5DUkVGKGVycm9iaik7Ci0JZWxzZSB7Ci0JCXZvaWQgKnNwYWNlID0gUHlNZW1fTWFsbG9jKHNpemVvZihpbnQpICogMik7Ci0JCWlmIChzcGFjZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW1lbXNldChzcGFjZSwgMCwgc2l6ZW9mKGludCkgKiAyKTsKLQkJZXJyb2JqID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKHNwYWNlLCBQeU1lbV9GcmVlKTsKLQkJaWYgKGVycm9iaiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICgtMSA9PSBQeURpY3RfU2V0SXRlbShkaWN0LCBlcnJvcl9vYmplY3RfbmFtZSwKLQkJCQkJIGVycm9iaikpIHsKLQkJCVB5X0RFQ1JFRihlcnJvYmopOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JKnBzcGFjZSA9IChpbnQgKilQeUNPYmplY3RfQXNWb2lkUHRyKGVycm9iaik7Ci0JcmV0dXJuIGVycm9iajsKKyAgICBQeU9iamVjdCAqZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIFB5T2JqZWN0ICplcnJvYmo7CisgICAgc3RhdGljIFB5T2JqZWN0ICplcnJvcl9vYmplY3RfbmFtZTsKKyAgICBpZiAoZGljdCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGdldCB0aHJlYWQgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChlcnJvcl9vYmplY3RfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGVycm9yX29iamVjdF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiY3R5cGVzLmVycm9yX29iamVjdCIpOworICAgICAgICBpZiAoZXJyb3Jfb2JqZWN0X25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlcnJvYmogPSBQeURpY3RfR2V0SXRlbShkaWN0LCBlcnJvcl9vYmplY3RfbmFtZSk7CisgICAgaWYgKGVycm9iaikKKyAgICAgICAgUHlfSU5DUkVGKGVycm9iaik7CisgICAgZWxzZSB7CisgICAgICAgIHZvaWQgKnNwYWNlID0gUHlNZW1fTWFsbG9jKHNpemVvZihpbnQpICogMik7CisgICAgICAgIGlmIChzcGFjZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG1lbXNldChzcGFjZSwgMCwgc2l6ZW9mKGludCkgKiAyKTsKKyAgICAgICAgZXJyb2JqID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKHNwYWNlLCBQeU1lbV9GcmVlKTsKKyAgICAgICAgaWYgKGVycm9iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICgtMSA9PSBQeURpY3RfU2V0SXRlbShkaWN0LCBlcnJvcl9vYmplY3RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9iaikpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlcnJvYmopOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBzcGFjZSA9IChpbnQgKilQeUNPYmplY3RfQXNWb2lkUHRyKGVycm9iaik7CisgICAgcmV0dXJuIGVycm9iajsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9lcnJvcl9pbnRlcm5hbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBpbmRleCkKIHsKLQlpbnQgKnNwYWNlOwotCVB5T2JqZWN0ICplcnJvYmogPSBnZXRfZXJyb3Jfb2JqZWN0KCZzcGFjZSk7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgKnNwYWNlOworICAgIFB5T2JqZWN0ICplcnJvYmogPSBnZXRfZXJyb3Jfb2JqZWN0KCZzcGFjZSk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChlcnJvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoc3BhY2VbaW5kZXhdKTsKLQlQeV9ERUNSRUYoZXJyb2JqKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChlcnJvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoc3BhY2VbaW5kZXhdKTsKKyAgICBQeV9ERUNSRUYoZXJyb2JqKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Vycm9yX2ludGVybmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGluZGV4KQogewotCWludCBuZXdfZXJybm8sIG9sZF9lcnJubzsKLQlQeU9iamVjdCAqZXJyb2JqOwotCWludCAqc3BhY2U7CisgICAgaW50IG5ld19lcnJubywgb2xkX2Vycm5vOworICAgIFB5T2JqZWN0ICplcnJvYmo7CisgICAgaW50ICpzcGFjZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZuZXdfZXJybm8pKQotCQlyZXR1cm4gTlVMTDsKLQllcnJvYmogPSBnZXRfZXJyb3Jfb2JqZWN0KCZzcGFjZSk7Ci0JaWYgKGVycm9iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlvbGRfZXJybm8gPSBzcGFjZVtpbmRleF07Ci0Jc3BhY2VbaW5kZXhdID0gbmV3X2Vycm5vOwotCVB5X0RFQ1JFRihlcnJvYmopOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhvbGRfZXJybm8pOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZuZXdfZXJybm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJvYmogPSBnZXRfZXJyb3Jfb2JqZWN0KCZzcGFjZSk7CisgICAgaWYgKGVycm9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvbGRfZXJybm8gPSBzcGFjZVtpbmRleF07CisgICAgc3BhY2VbaW5kZXhdID0gbmV3X2Vycm5vOworICAgIFB5X0RFQ1JFRihlcnJvYmopOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhvbGRfZXJybm8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Vycm5vKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2V0X2Vycm9yX2ludGVybmFsKHNlbGYsIGFyZ3MsIDApOworICAgIHJldHVybiBnZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZXJybm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMCk7CisgICAgcmV0dXJuIHNldF9lcnJvcl9pbnRlcm5hbChzZWxmLCBhcmdzLCAwKTsKIH0KIAogI2lmZGVmIE1TX1dJTjMyCkBAIC0yMDMsMjA2ICsyMDMsMjA2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2xhc3RfZXJyb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMSk7CisgICAgcmV0dXJuIGdldF9lcnJvcl9pbnRlcm5hbChzZWxmLCBhcmdzLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9sYXN0X2Vycm9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc2V0X2Vycm9yX2ludGVybmFsKHNlbGYsIGFyZ3MsIDEpOworICAgIHJldHVybiBzZXRfZXJyb3JfaW50ZXJuYWwoc2VsZiwgYXJncywgMSk7CiB9CiAKIFB5T2JqZWN0ICpDb21FcnJvcjsKIAogc3RhdGljIFRDSEFSICpGb3JtYXRFcnJvcihEV09SRCBjb2RlKQogewotCVRDSEFSICpscE1zZ0J1ZjsKLQlEV09SRCBuOwotCW4gPSBGb3JtYXRNZXNzYWdlKEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAotCQkJICBOVUxMLAotCQkJICBjb2RlLAotCQkJICBNQUtFTEFOR0lEKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUKSwgLyogRGVmYXVsdCBsYW5ndWFnZSAqLwotCQkJICAoTFBUU1RSKSAmbHBNc2dCdWYsCi0JCQkgIDAsCi0JCQkgIE5VTEwpOwotCWlmIChuKSB7Ci0JCXdoaWxlIChfaXN0c3BhY2UobHBNc2dCdWZbbi0xXSkpCi0JCQktLW47Ci0JCWxwTXNnQnVmW25dID0gX1QoJ1wwJyk7IC8qIHJzdHJpcCgpICovCi0JfQotCXJldHVybiBscE1zZ0J1ZjsKKyAgICBUQ0hBUiAqbHBNc2dCdWY7CisgICAgRFdPUkQgbjsKKyAgICBuID0gRm9ybWF0TWVzc2FnZShGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksIC8qIERlZmF1bHQgbGFuZ3VhZ2UgKi8KKyAgICAgICAgICAgICAgKExQVFNUUikgJmxwTXNnQnVmLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBOVUxMKTsKKyAgICBpZiAobikgeworICAgICAgICB3aGlsZSAoX2lzdHNwYWNlKGxwTXNnQnVmW24tMV0pKQorICAgICAgICAgICAgLS1uOworICAgICAgICBscE1zZ0J1ZltuXSA9IF9UKCdcMCcpOyAvKiByc3RyaXAoKSAqLworICAgIH0KKyAgICByZXR1cm4gbHBNc2dCdWY7CiB9CiAKICNpZm5kZWYgRE9OVF9VU0VfU0VICiB2b2lkIFNldEV4Y2VwdGlvbihEV09SRCBjb2RlLCBFWENFUFRJT05fUkVDT1JEICpwcikKIHsKLQlUQ0hBUiAqbHBNc2dCdWY7Ci0JbHBNc2dCdWYgPSBGb3JtYXRFcnJvcihjb2RlKTsKLQlpZihscE1zZ0J1ZikgewotCQlQeUVycl9TZXRGcm9tV2luZG93c0Vycihjb2RlKTsKLQkJTG9jYWxGcmVlKGxwTXNnQnVmKTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJY2FzZSBFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTjoKLQkJCS8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIHJlYWQgZnJvbSBvciB3cml0ZQotCQkJICAgdG8gYSB2aXJ0dWFsIGFkZHJlc3MgZm9yIHdoaWNoIGl0IGRvZXMgbm90Ci0JCQkgICBoYXZlIHRoZSBhcHByb3ByaWF0ZSBhY2Nlc3MuICovCi0JCQlpZiAocHItPkV4Y2VwdGlvbkluZm9ybWF0aW9uWzBdID09IDApCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJICAgICAiZXhjZXB0aW9uOiBhY2Nlc3MgdmlvbGF0aW9uIHJlYWRpbmcgJXAiLAotCQkJCQkgICAgIHByLT5FeGNlcHRpb25JbmZvcm1hdGlvblsxXSk7Ci0JCQllbHNlCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJICAgICAiZXhjZXB0aW9uOiBhY2Nlc3MgdmlvbGF0aW9uIHdyaXRpbmcgJXAiLAotCQkJCQkgICAgIHByLT5FeGNlcHRpb25JbmZvcm1hdGlvblsxXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBFWENFUFRJT05fQlJFQUtQT0lOVDoKLQkJCS8qIEEgYnJlYWtwb2ludCB3YXMgZW5jb3VudGVyZWQuICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkiZXhjZXB0aW9uOiBicmVha3BvaW50IGVuY291bnRlcmVkIik7Ci0JCQlicmVhazsKLQkJCQotCQljYXNlIEVYQ0VQVElPTl9EQVRBVFlQRV9NSVNBTElHTk1FTlQ6Ci0JCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byByZWFkIG9yIHdyaXRlIGRhdGEgdGhhdCBpcwotCQkJICAgbWlzYWxpZ25lZCBvbiBoYXJkd2FyZSB0aGF0IGRvZXMgbm90IHByb3ZpZGUKLQkJCSAgIGFsaWdubWVudC4gRm9yIGV4YW1wbGUsIDE2LWJpdCB2YWx1ZXMgbXVzdCBiZQotCQkJICAgYWxpZ25lZCBvbiAyLWJ5dGUgYm91bmRhcmllcywgMzItYml0IHZhbHVlcyBvbgotCQkJICAgNC1ieXRlIGJvdW5kYXJpZXMsIGFuZCBzbyBvbi4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGRhdGF0eXBlIG1pc2FsaWdubWVudCIpOwotCQkJYnJlYWs7CisgICAgVENIQVIgKmxwTXNnQnVmOworICAgIGxwTXNnQnVmID0gRm9ybWF0RXJyb3IoY29kZSk7CisgICAgaWYobHBNc2dCdWYpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoY29kZSk7CisgICAgICAgIExvY2FsRnJlZShscE1zZ0J1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChjb2RlKSB7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT046CisgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byByZWFkIGZyb20gb3Igd3JpdGUKKyAgICAgICAgICAgICAgIHRvIGEgdmlydHVhbCBhZGRyZXNzIGZvciB3aGljaCBpdCBkb2VzIG5vdAorICAgICAgICAgICAgICAgaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzLiAqLworICAgICAgICAgICAgaWYgKHByLT5FeGNlcHRpb25JbmZvcm1hdGlvblswXSA9PSAwKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGFjY2VzcyB2aW9sYXRpb24gcmVhZGluZyAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT5FeGNlcHRpb25JbmZvcm1hdGlvblsxXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogYWNjZXNzIHZpb2xhdGlvbiB3cml0aW5nICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPkV4Y2VwdGlvbkluZm9ybWF0aW9uWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9CUkVBS1BPSU5UOgorICAgICAgICAgICAgLyogQSBicmVha3BvaW50IHdhcyBlbmNvdW50ZXJlZC4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogYnJlYWtwb2ludCBlbmNvdW50ZXJlZCIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBFWENFUFRJT05fU0lOR0xFX1NURVA6Ci0JCQkvKiBBIHRyYWNlIHRyYXAgb3Igb3RoZXIgc2luZ2xlLWluc3RydWN0aW9uIG1lY2hhbmlzbQotCQkJICAgc2lnbmFsZWQgdGhhdCBvbmUgaW5zdHJ1Y3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWQuICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkiZXhjZXB0aW9uOiBzaW5nbGUgc3RlcCIpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX0RBVEFUWVBFX01JU0FMSUdOTUVOVDoKKyAgICAgICAgICAgIC8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIHJlYWQgb3Igd3JpdGUgZGF0YSB0aGF0IGlzCisgICAgICAgICAgICAgICBtaXNhbGlnbmVkIG9uIGhhcmR3YXJlIHRoYXQgZG9lcyBub3QgcHJvdmlkZQorICAgICAgICAgICAgICAgYWxpZ25tZW50LiBGb3IgZXhhbXBsZSwgMTYtYml0IHZhbHVlcyBtdXN0IGJlCisgICAgICAgICAgICAgICBhbGlnbmVkIG9uIDItYnl0ZSBib3VuZGFyaWVzLCAzMi1iaXQgdmFsdWVzIG9uCisgICAgICAgICAgICAgICA0LWJ5dGUgYm91bmRhcmllcywgYW5kIHNvIG9uLiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBkYXRhdHlwZSBtaXNhbGlnbm1lbnQiKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhDRVBUSU9OX0FSUkFZX0JPVU5EU19FWENFRURFRDogCi0JCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBhY2Nlc3MgYW4gYXJyYXkgZWxlbWVudAotCQkJICAgdGhhdCBpcyBvdXQgb2YgYm91bmRzLCBhbmQgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUKLQkJCSAgIHN1cHBvcnRzIGJvdW5kcyBjaGVja2luZy4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGFycmF5IGJvdW5kcyBleGNlZWRlZCIpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX1NJTkdMRV9TVEVQOgorICAgICAgICAgICAgLyogQSB0cmFjZSB0cmFwIG9yIG90aGVyIHNpbmdsZS1pbnN0cnVjdGlvbiBtZWNoYW5pc20KKyAgICAgICAgICAgICAgIHNpZ25hbGVkIHRoYXQgb25lIGluc3RydWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBzaW5nbGUgc3RlcCIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBFWENFUFRJT05fRkxUX0RFTk9STUFMX09QRVJBTkQ6Ci0JCQkvKiBPbmUgb2YgdGhlIG9wZXJhbmRzIGluIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uCi0JCQkgICBpcyBkZW5vcm1hbC4gQSBkZW5vcm1hbCB2YWx1ZSBpcyBvbmUgdGhhdCBpcyB0b28KLQkJCSAgIHNtYWxsIHRvIHJlcHJlc2VudCBhcyBhIHN0YW5kYXJkIGZsb2F0aW5nLXBvaW50Ci0JCQkgICB2YWx1ZS4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGZsb2F0aW5nLXBvaW50IG9wZXJhbmQgZGVub3JtYWwiKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9BUlJBWV9CT1VORFNfRVhDRUVERUQ6CisgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBhY2Nlc3MgYW4gYXJyYXkgZWxlbWVudAorICAgICAgICAgICAgICAgdGhhdCBpcyBvdXQgb2YgYm91bmRzLCBhbmQgdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUKKyAgICAgICAgICAgICAgIHN1cHBvcnRzIGJvdW5kcyBjaGVja2luZy4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogYXJyYXkgYm91bmRzIGV4Y2VlZGVkIik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYQ0VQVElPTl9GTFRfRElWSURFX0JZX1pFUk86Ci0JCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBkaXZpZGUgYSBmbG9hdGluZy1wb2ludAotCQkJICAgdmFsdWUgYnkgYSBmbG9hdGluZy1wb2ludCBkaXZpc29yIG9mIHplcm8uICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkiZXhjZXB0aW9uOiBmbG9hdCBkaXZpZGUgYnkgemVybyIpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX0ZMVF9ERU5PUk1BTF9PUEVSQU5EOgorICAgICAgICAgICAgLyogT25lIG9mIHRoZSBvcGVyYW5kcyBpbiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbgorICAgICAgICAgICAgICAgaXMgZGVub3JtYWwuIEEgZGVub3JtYWwgdmFsdWUgaXMgb25lIHRoYXQgaXMgdG9vCisgICAgICAgICAgICAgICBzbWFsbCB0byByZXByZXNlbnQgYXMgYSBzdGFuZGFyZCBmbG9hdGluZy1wb2ludAorICAgICAgICAgICAgICAgdmFsdWUuICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGZsb2F0aW5nLXBvaW50IG9wZXJhbmQgZGVub3JtYWwiKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhDRVBUSU9OX0ZMVF9JTkVYQUNUX1JFU1VMVDoKLQkJCS8qIFRoZSByZXN1bHQgb2YgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gY2Fubm90IGJlCi0JCQkgICByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZGVjaW1hbCBmcmFjdGlvbi4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGZsb2F0IGluZXhhY3QiKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9GTFRfRElWSURFX0JZX1pFUk86CisgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBkaXZpZGUgYSBmbG9hdGluZy1wb2ludAorICAgICAgICAgICAgICAgdmFsdWUgYnkgYSBmbG9hdGluZy1wb2ludCBkaXZpc29yIG9mIHplcm8uICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGZsb2F0IGRpdmlkZSBieSB6ZXJvIik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYQ0VQVElPTl9GTFRfSU5WQUxJRF9PUEVSQVRJT046Ci0JCQkvKiBUaGlzIGV4Y2VwdGlvbiByZXByZXNlbnRzIGFueSBmbG9hdGluZy1wb2ludAotCQkJICAgZXhjZXB0aW9uIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkiZXhjZXB0aW9uOiBmbG9hdCBpbnZhbGlkIG9wZXJhdGlvbiIpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX0ZMVF9JTkVYQUNUX1JFU1VMVDoKKyAgICAgICAgICAgIC8qIFRoZSByZXN1bHQgb2YgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24gY2Fubm90IGJlCisgICAgICAgICAgICAgICByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZGVjaW1hbCBmcmFjdGlvbi4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogZmxvYXQgaW5leGFjdCIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBFWENFUFRJT05fRkxUX09WRVJGTE9XOgotCQkJLyogVGhlIGV4cG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGlzCi0JCQkgICBncmVhdGVyIHRoYW4gdGhlIG1hZ25pdHVkZSBhbGxvd2VkIGJ5IHRoZQotCQkJICAgY29ycmVzcG9uZGluZyB0eXBlLiAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJImV4Y2VwdGlvbjogZmxvYXQgb3ZlcmZsb3ciKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9GTFRfSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICAvKiBUaGlzIGV4Y2VwdGlvbiByZXByZXNlbnRzIGFueSBmbG9hdGluZy1wb2ludAorICAgICAgICAgICAgICAgZXhjZXB0aW9uIG5vdCBpbmNsdWRlZCBpbiB0aGlzIGxpc3QuICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGZsb2F0IGludmFsaWQgb3BlcmF0aW9uIik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYQ0VQVElPTl9GTFRfU1RBQ0tfQ0hFQ0s6Ci0JCQkvKiBUaGUgc3RhY2sgb3ZlcmZsb3dlZCBvciB1bmRlcmZsb3dlZCBhcyB0aGUgcmVzdWx0Ci0JCQkgICBvZiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbi4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IHN0YWNrIG92ZXIvdW5kZXJmbG93Iik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBFWENFUFRJT05fRkxUX09WRVJGTE9XOgorICAgICAgICAgICAgLyogVGhlIGV4cG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGlzCisgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gdGhlIG1hZ25pdHVkZSBhbGxvd2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0eXBlLiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBmbG9hdCBvdmVyZmxvdyIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1c6Ci0JCQkvKiBUaGUgc3RhY2sgb3ZlcmZsb3dlZCBvciB1bmRlcmZsb3dlZCBhcyB0aGUgcmVzdWx0Ci0JCQkgICBvZiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbi4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IHN0YWNrIG92ZXJmbG93Iik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBFWENFUFRJT05fRkxUX1NUQUNLX0NIRUNLOgorICAgICAgICAgICAgLyogVGhlIHN0YWNrIG92ZXJmbG93ZWQgb3IgdW5kZXJmbG93ZWQgYXMgdGhlIHJlc3VsdAorICAgICAgICAgICAgICAgb2YgYSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24uICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IHN0YWNrIG92ZXIvdW5kZXJmbG93Iik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYQ0VQVElPTl9GTFRfVU5ERVJGTE9XOgotCQkJLyogVGhlIGV4cG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGlzIGxlc3MKLQkJCSAgIHRoYW4gdGhlIG1hZ25pdHVkZSBhbGxvd2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nCi0JCQkgICB0eXBlLiAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJImV4Y2VwdGlvbjogZmxvYXQgdW5kZXJmbG93Iik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1c6CisgICAgICAgICAgICAvKiBUaGUgc3RhY2sgb3ZlcmZsb3dlZCBvciB1bmRlcmZsb3dlZCBhcyB0aGUgcmVzdWx0CisgICAgICAgICAgICAgICBvZiBhIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbi4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogc3RhY2sgb3ZlcmZsb3ciKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTzoKLQkJCS8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIGRpdmlkZSBhbiBpbnRlZ2VyIHZhbHVlIGJ5Ci0JCQkgICBhbiBpbnRlZ2VyIGRpdmlzb3Igb2YgemVyby4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGludGVnZXIgZGl2aWRlIGJ5IHplcm8iKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9GTFRfVU5ERVJGTE9XOgorICAgICAgICAgICAgLyogVGhlIGV4cG9uZW50IG9mIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uIGlzIGxlc3MKKyAgICAgICAgICAgICAgIHRoYW4gdGhlIG1hZ25pdHVkZSBhbGxvd2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICAgICB0eXBlLiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBmbG9hdCB1bmRlcmZsb3ciKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhDRVBUSU9OX0lOVF9PVkVSRkxPVzoKLQkJCS8qIFRoZSByZXN1bHQgb2YgYW4gaW50ZWdlciBvcGVyYXRpb24gY2F1c2VkIGEgY2FycnkKLQkJCSAgIG91dCBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIHJlc3VsdC4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IGludGVnZXIgb3ZlcmZsb3ciKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk86CisgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBkaXZpZGUgYW4gaW50ZWdlciB2YWx1ZSBieQorICAgICAgICAgICAgICAgYW4gaW50ZWdlciBkaXZpc29yIG9mIHplcm8uICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IGludGVnZXIgZGl2aWRlIGJ5IHplcm8iKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhDRVBUSU9OX1BSSVZfSU5TVFJVQ1RJT046Ci0JCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBleGVjdXRlIGFuIGluc3RydWN0aW9uCi0JCQkgICB3aG9zZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQKLQkJCSAgIG1hY2hpbmUgbW9kZS4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCSJleGNlcHRpb246IHByaXZpbGVkZ2VkIGluc3RydWN0aW9uIik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBFWENFUFRJT05fSU5UX09WRVJGTE9XOgorICAgICAgICAgICAgLyogVGhlIHJlc3VsdCBvZiBhbiBpbnRlZ2VyIG9wZXJhdGlvbiBjYXVzZWQgYSBjYXJyeQorICAgICAgICAgICAgICAgb3V0IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgcmVzdWx0LiAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBpbnRlZ2VyIG92ZXJmbG93Iik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRV9FWENFUFRJT046Ci0JCQkvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBjb250aW51ZSBleGVjdXRpb24gYWZ0ZXIgYQotCQkJICAgbm9uY29udGludWFibGUgZXhjZXB0aW9uIG9jY3VycmVkLiAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJImV4Y2VwdGlvbjogbm9jb250aW51YWJsZSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGYoImVycm9yICVkXG4iLCBjb2RlKTsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJICAgICAiZXhjZXB0aW9uIGNvZGUgMHglMDh4IiwKLQkJCQkgICAgIGNvZGUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgICAgIGNhc2UgRVhDRVBUSU9OX1BSSVZfSU5TVFJVQ1RJT046CisgICAgICAgICAgICAvKiBUaGUgdGhyZWFkIGF0dGVtcHRlZCB0byBleGVjdXRlIGFuIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICB3aG9zZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAgIG1hY2hpbmUgbW9kZS4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogcHJpdmlsZWRnZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTjoKKyAgICAgICAgICAgIC8qIFRoZSB0aHJlYWQgYXR0ZW1wdGVkIHRvIGNvbnRpbnVlIGV4ZWN1dGlvbiBhZnRlciBhCisgICAgICAgICAgICAgICBub25jb250aW51YWJsZSBleGNlcHRpb24gb2NjdXJyZWQuICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IG5vY29udGludWFibGUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCJlcnJvciAlZFxuIiwgY29kZSk7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24gY29kZSAweCUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHN0YXRpYyBEV09SRCBIYW5kbGVFeGNlcHRpb24oRVhDRVBUSU9OX1BPSU5URVJTICpwdHJzLAotCQkJICAgICBEV09SRCAqcGR3LCBFWENFUFRJT05fUkVDT1JEICpyZWNvcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEICpwZHcsIEVYQ0VQVElPTl9SRUNPUkQgKnJlY29yZCkKIHsKLQkqcGR3ID0gcHRycy0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25Db2RlOwotCSpyZWNvcmQgPSAqcHRycy0+RXhjZXB0aW9uUmVjb3JkOwotCXJldHVybiBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSOworICAgICpwZHcgPSBwdHJzLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkNvZGU7CisgICAgKnJlY29yZCA9ICpwdHJzLT5FeGNlcHRpb25SZWNvcmQ7CisgICAgcmV0dXJuIEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVI7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNoZWNrX2hyZXN1bHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhSRVNVTFQgaHI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJmhyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKEZBSUxFRChocikpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0Vycihocik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGhyKTsKKyAgICBIUkVTVUxUIGhyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZocikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChGQUlMRUQoaHIpKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoaHIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhocik7CiB9CiAKICNlbmRpZgpAQCAtNDEyLDEzMiArNDEyLDEzMiBAQAogUHlDQXJnT2JqZWN0ICoKIG5ld19DQXJnT2JqZWN0KHZvaWQpCiB7Ci0JUHlDQXJnT2JqZWN0ICpwOwotCXAgPSBQeU9iamVjdF9OZXcoUHlDQXJnT2JqZWN0LCAmUHlDQXJnX1R5cGUpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAtPnBmZmlfdHlwZSA9IE5VTEw7Ci0JcC0+dGFnID0gJ1wwJzsKLQlwLT5vYmogPSBOVUxMOwotCW1lbXNldCgmcC0+dmFsdWUsIDAsIHNpemVvZihwLT52YWx1ZSkpOwotCXJldHVybiBwOworICAgIFB5Q0FyZ09iamVjdCAqcDsKKyAgICBwID0gUHlPYmplY3RfTmV3KFB5Q0FyZ09iamVjdCwgJlB5Q0FyZ19UeXBlKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5wZmZpX3R5cGUgPSBOVUxMOworICAgIHAtPnRhZyA9ICdcMCc7CisgICAgcC0+b2JqID0gTlVMTDsKKyAgICBtZW1zZXQoJnAtPnZhbHVlLCAwLCBzaXplb2YocC0+dmFsdWUpKTsKKyAgICByZXR1cm4gcDsKIH0KIAogc3RhdGljIHZvaWQKIFB5Q0FyZ19kZWFsbG9jKFB5Q0FyZ09iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPm9iaik7Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JqKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNBcmdfcmVwcihQeUNBcmdPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZmZXJbMjU2XTsKLQlzd2l0Y2goc2VsZi0+dGFnKSB7Ci0JY2FzZSAnYic6Ci0JY2FzZSAnQic6Ci0JCXNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglZCk+IiwKLQkJCXNlbGYtPnRhZywgc2VsZi0+dmFsdWUuYik7Ci0JCWJyZWFrOwotCWNhc2UgJ2gnOgotCWNhc2UgJ0gnOgotCQlzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWQpPiIsCi0JCQlzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmgpOwotCQlicmVhazsKLQljYXNlICdpJzoKLQljYXNlICdJJzoKLQkJc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVkKT4iLAotCQkJc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5pKTsKLQkJYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JY2FzZSAnTCc6Ci0JCXNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglbGQpPiIsCi0JCQlzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmwpOwotCQlicmVhazsKLQkJCi0jaWZkZWYgSEFWRV9MT05HX0xPTkcKLQljYXNlICdxJzoKLQljYXNlICdRJzoKLQkJc3ByaW50ZihidWZmZXIsCi0jaWZkZWYgTVNfV0lOMzIKLQkJCSI8Y3BhcmFtICclYycgKCVJNjRkKT4iLAotI2Vsc2UKLQkJCSI8Y3BhcmFtICclYycgKCVxZCk+IiwKLSNlbmRpZgotCQkJc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5xKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQljYXNlICdkJzoKLQkJc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVmKT4iLAotCQkJc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5kKTsKLQkJYnJlYWs7Ci0JY2FzZSAnZic6Ci0JCXNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglZik+IiwKLQkJCXNlbGYtPnRhZywgc2VsZi0+dmFsdWUuZik7Ci0JCWJyZWFrOworICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgc3dpdGNoKHNlbGYtPnRhZykgeworICAgIGNhc2UgJ2InOgorICAgIGNhc2UgJ0InOgorICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWQpPiIsCisgICAgICAgICAgICBzZWxmLT50YWcsIHNlbGYtPnZhbHVlLmIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzoKKyAgICBjYXNlICdIJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVkKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5oKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaSc6CisgICAgY2FzZSAnSSc6CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglZCk+IiwKKyAgICAgICAgICAgIHNlbGYtPnRhZywgc2VsZi0+dmFsdWUuaSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2wnOgorICAgIGNhc2UgJ0wnOgorICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJWxkKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5sKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlICdjJzoKLQkJc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVjKT4iLAotCQkJc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5jKTsKLQkJYnJlYWs7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyAgICBjYXNlICdxJzoKKyAgICBjYXNlICdRJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsCisjaWZkZWYgTVNfV0lOMzIKKyAgICAgICAgICAgICI8Y3BhcmFtICclYycgKCVJNjRkKT4iLAorI2Vsc2UKKyAgICAgICAgICAgICI8Y3BhcmFtICclYycgKCVxZCk+IiwKKyNlbmRpZgorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5xKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlICdkJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVmKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5kKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnZic6CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglZik+IiwKKyAgICAgICAgICAgIHNlbGYtPnRhZywgc2VsZi0+dmFsdWUuZik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAnYyc6CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiPGNwYXJhbSAnJWMnICglYyk+IiwKKyAgICAgICAgICAgIHNlbGYtPnRhZywgc2VsZi0+dmFsdWUuYyk7CisgICAgICAgIGJyZWFrOwogCiAvKiBIbSwgYXJlIHRoZXNlICd6JyBhbmQgJ1onIGNvZGVzIHVzZWZ1bCBhdCBhbGw/CiAgICBTaG91bGRuJ3QgdGhleSBiZSByZXBsYWNlZCBieSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBjX3N0cmluZwogICAgYW5kIGNfd3N0cmluZyA/CiAqLwotCWNhc2UgJ3onOgotCWNhc2UgJ1onOgotCWNhc2UgJ1AnOgotCQlzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyAoJXApPiIsCi0JCQlzZWxmLT50YWcsIHNlbGYtPnZhbHVlLnApOwotCQlicmVhazsKKyAgICBjYXNlICd6JzoKKyAgICBjYXNlICdaJzoKKyAgICBjYXNlICdQJzoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgKCVwKT4iLAorICAgICAgICAgICAgc2VsZi0+dGFnLCBzZWxmLT52YWx1ZS5wKTsKKyAgICAgICAgYnJlYWs7CiAKLQlkZWZhdWx0OgotCQlzcHJpbnRmKGJ1ZmZlciwgIjxjcGFyYW0gJyVjJyBhdCAlcD4iLAotCQkJc2VsZi0+dGFnLCBzZWxmKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgc3ByaW50ZihidWZmZXIsICI8Y3BhcmFtICclYycgYXQgJXA+IiwKKyAgICAgICAgICAgIHNlbGYtPnRhZywgc2VsZik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOwogfQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgUHlDQXJnVHlwZV9tZW1iZXJzW10gPSB7Ci0JeyAiX29iaiIsIFRfT0JKRUNULAotCSAgb2Zmc2V0b2YoUHlDQXJnT2JqZWN0LCBvYmopLCBSRUFET05MWSwKLQkgICJ0aGUgd3JhcHBlZCBvYmplY3QiIH0sCi0JeyBOVUxMIH0sCisgICAgeyAiX29iaiIsIFRfT0JKRUNULAorICAgICAgb2Zmc2V0b2YoUHlDQXJnT2JqZWN0LCBvYmopLCBSRUFET05MWSwKKyAgICAgICJ0aGUgd3JhcHBlZCBvYmplY3QiIH0sCisgICAgeyBOVUxMIH0sCiB9OwogCiBQeVR5cGVPYmplY3QgUHlDQXJnX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIkNBcmdPYmplY3QiLAotCXNpemVvZihQeUNBcmdPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpUHlDQXJnX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKVB5Q0FyZ19yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCVB5Q0FyZ1R5cGVfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIkNBcmdPYmplY3QiLAorICAgIHNpemVvZihQeUNBcmdPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpUHlDQXJnX2RlYWxsb2MsICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylQeUNBcmdfcmVwciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgUHlDQXJnVHlwZV9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU3MCwyNCArNTcwLDI0IEBACiAgKi8KIAogdW5pb24gcmVzdWx0IHsKLQljaGFyIGM7Ci0JY2hhciBiOwotCXNob3J0IGg7Ci0JaW50IGk7Ci0JbG9uZyBsOworICAgIGNoYXIgYzsKKyAgICBjaGFyIGI7CisgICAgc2hvcnQgaDsKKyAgICBpbnQgaTsKKyAgICBsb25nIGw7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQlQWV9MT05HX0xPTkcgcTsKKyAgICBQWV9MT05HX0xPTkcgcTsKICNlbmRpZgotCWxvbmcgZG91YmxlIEQ7Ci0JZG91YmxlIGQ7Ci0JZmxvYXQgZjsKLQl2b2lkICpwOworICAgIGxvbmcgZG91YmxlIEQ7CisgICAgZG91YmxlIGQ7CisgICAgZmxvYXQgZjsKKyAgICB2b2lkICpwOwogfTsKIAogc3RydWN0IGFyZ3VtZW50IHsKLQlmZmlfdHlwZSAqZmZpX3R5cGU7Ci0JUHlPYmplY3QgKmtlZXA7Ci0JdW5pb24gcmVzdWx0IHZhbHVlOworICAgIGZmaV90eXBlICpmZmlfdHlwZTsKKyAgICBQeU9iamVjdCAqa2VlcDsKKyAgICB1bmlvbiByZXN1bHQgdmFsdWU7CiB9OwogCiAvKgpAQCAtNTk1LDE0MCArNTk1LDE0MCBAQAogICovCiBzdGF0aWMgaW50IENvbnZQYXJhbShQeU9iamVjdCAqb2JqLCBQeV9zc2l6ZV90IGluZGV4LCBzdHJ1Y3QgYXJndW1lbnQgKnBhKQogewotCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JcGEtPmtlZXAgPSBOVUxMOyAvKiBzbyB3ZSBjYW5ub3QgZm9yZ2V0IGl0IGxhdGVyICovCisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBwYS0+a2VlcCA9IE5VTEw7IC8qIHNvIHdlIGNhbm5vdCBmb3JnZXQgaXQgbGF0ZXIgKi8KIAotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KG9iaik7Ci0JaWYgKGRpY3QpIHsKLQkJUHlDQXJnT2JqZWN0ICpjYXJnOwotCQlhc3NlcnQoZGljdC0+cGFyYW1mdW5jKTsKLQkJLyogSWYgaXQgaGFzIGFuIHN0Z2RpY3QsIGl0IGlzIGEgQ0RhdGFPYmplY3QgKi8KLQkJY2FyZyA9IGRpY3QtPnBhcmFtZnVuYygoQ0RhdGFPYmplY3QgKilvYmopOwotCQlwYS0+ZmZpX3R5cGUgPSBjYXJnLT5wZmZpX3R5cGU7Ci0JCW1lbWNweSgmcGEtPnZhbHVlLCAmY2FyZy0+dmFsdWUsIHNpemVvZihwYS0+dmFsdWUpKTsKLQkJcGEtPmtlZXAgPSAoUHlPYmplY3QgKiljYXJnOwotCQlyZXR1cm4gMDsKLQl9CisgICAgZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3Qob2JqKTsKKyAgICBpZiAoZGljdCkgeworICAgICAgICBQeUNBcmdPYmplY3QgKmNhcmc7CisgICAgICAgIGFzc2VydChkaWN0LT5wYXJhbWZ1bmMpOworICAgICAgICAvKiBJZiBpdCBoYXMgYW4gc3RnZGljdCwgaXQgaXMgYSBDRGF0YU9iamVjdCAqLworICAgICAgICBjYXJnID0gZGljdC0+cGFyYW1mdW5jKChDRGF0YU9iamVjdCAqKW9iaik7CisgICAgICAgIHBhLT5mZmlfdHlwZSA9IGNhcmctPnBmZmlfdHlwZTsKKyAgICAgICAgbWVtY3B5KCZwYS0+dmFsdWUsICZjYXJnLT52YWx1ZSwgc2l6ZW9mKHBhLT52YWx1ZSkpOworICAgICAgICBwYS0+a2VlcCA9IChQeU9iamVjdCAqKWNhcmc7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmIChQeUNBcmdfQ2hlY2tFeGFjdChvYmopKSB7Ci0JCVB5Q0FyZ09iamVjdCAqY2FyZyA9IChQeUNBcmdPYmplY3QgKilvYmo7Ci0JCXBhLT5mZmlfdHlwZSA9IGNhcmctPnBmZmlfdHlwZTsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JCXBhLT5rZWVwID0gb2JqOwotCQltZW1jcHkoJnBhLT52YWx1ZSwgJmNhcmctPnZhbHVlLCBzaXplb2YocGEtPnZhbHVlKSk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlDQXJnX0NoZWNrRXhhY3Qob2JqKSkgeworICAgICAgICBQeUNBcmdPYmplY3QgKmNhcmcgPSAoUHlDQXJnT2JqZWN0ICopb2JqOworICAgICAgICBwYS0+ZmZpX3R5cGUgPSBjYXJnLT5wZmZpX3R5cGU7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICBwYS0+a2VlcCA9IG9iajsKKyAgICAgICAgbWVtY3B5KCZwYS0+dmFsdWUsICZjYXJnLT52YWx1ZSwgc2l6ZW9mKHBhLT52YWx1ZSkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBjaGVjayBmb3IgTm9uZSwgaW50ZWdlciwgc3RyaW5nIG9yIHVuaWNvZGUgYW5kIHVzZSBkaXJlY3RseSBpZiBzdWNjZXNzZnVsICovCi0JaWYgKG9iaiA9PSBQeV9Ob25lKSB7Ci0JCXBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYS0+dmFsdWUucCA9IE5VTEw7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBjaGVjayBmb3IgTm9uZSwgaW50ZWdlciwgc3RyaW5nIG9yIHVuaWNvZGUgYW5kIHVzZSBkaXJlY3RseSBpZiBzdWNjZXNzZnVsICovCisgICAgaWYgKG9iaiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICBwYS0+dmFsdWUucCA9IE5VTEw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmIChQeUludF9DaGVjayhvYmopKSB7Ci0JCXBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9zaW50OwotCQlwYS0+dmFsdWUuaSA9IFB5SW50X0FTX0xPTkcob2JqKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUludF9DaGVjayhvYmopKSB7CisgICAgICAgIHBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9zaW50OworICAgICAgICBwYS0+dmFsdWUuaSA9IFB5SW50X0FTX0xPTkcob2JqKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKFB5TG9uZ19DaGVjayhvYmopKSB7Ci0JCXBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9zaW50OwotCQlwYS0+dmFsdWUuaSA9IChsb25nKVB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhvYmopOwotCQlpZiAocGEtPnZhbHVlLmkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXBhLT52YWx1ZS5pID0gUHlMb25nX0FzTG9uZyhvYmopOwotCQkJaWYgKHBhLT52YWx1ZS5pID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJCSJsb25nIGludCB0b28gbG9uZyB0byBjb252ZXJ0Iik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3NpbnQ7CisgICAgICAgIHBhLT52YWx1ZS5pID0gKGxvbmcpUHlMb25nX0FzVW5zaWduZWRMb25nKG9iaik7CisgICAgICAgIGlmIChwYS0+dmFsdWUuaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcGEtPnZhbHVlLmkgPSBQeUxvbmdfQXNMb25nKG9iaik7CisgICAgICAgICAgICBpZiAocGEtPnZhbHVlLmkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZyBpbnQgdG9vIGxvbmcgdG8gY29udmVydCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSkgewotCQlwYS0+ZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQkJcGEtPnZhbHVlLnAgPSBQeVN0cmluZ19BU19TVFJJTkcob2JqKTsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JCXBhLT5rZWVwID0gb2JqOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHBhLT52YWx1ZS5wID0gUHlTdHJpbmdfQVNfU1RSSU5HKG9iaik7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICBwYS0+a2VlcCA9IG9iajsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKICNpZmRlZiBIQVZFX1VTQUJMRV9XQ0hBUl9UCi0JCXBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlwYS0+dmFsdWUucCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaik7Ci0JCVB5X0lOQ1JFRihvYmopOwotCQlwYS0+a2VlcCA9IG9iajsKLQkJcmV0dXJuIDA7CisgICAgICAgIHBhLT5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICBwYS0+dmFsdWUucCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaik7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICBwYS0+a2VlcCA9IG9iajsKKyAgICAgICAgcmV0dXJuIDA7CiAjZWxzZQotCQlpbnQgc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShvYmopOwotCQlwYS0+ZmZpX3R5cGUgPSAmZmZpX3R5cGVfcG9pbnRlcjsKLQkJc2l6ZSArPSAxOyAvKiB0ZXJtaW5hdGluZyBOVUwgKi8KLQkJc2l6ZSAqPSBzaXplb2Yod2NoYXJfdCk7Ci0JCXBhLT52YWx1ZS5wID0gUHlNZW1fTWFsbG9jKHNpemUpOwotCQlpZiAoIXBhLT52YWx1ZS5wKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1lbXNldChwYS0+dmFsdWUucCwgMCwgc2l6ZSk7Ci0JCXBhLT5rZWVwID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKHBhLT52YWx1ZS5wLCBQeU1lbV9GcmVlKTsKLQkJaWYgKCFwYS0+a2VlcCkgewotCQkJUHlNZW1fRnJlZShwYS0+dmFsdWUucCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKC0xID09IFB5VW5pY29kZV9Bc1dpZGVDaGFyKChQeVVuaWNvZGVPYmplY3QgKilvYmosCi0JCQkJCSAgICAgICBwYS0+dmFsdWUucCwgUHlVbmljb2RlX0dFVF9TSVpFKG9iaikpKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gMDsKKyAgICAgICAgaW50IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUob2JqKTsKKyAgICAgICAgcGEtPmZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIHNpemUgKz0gMTsgLyogdGVybWluYXRpbmcgTlVMICovCisgICAgICAgIHNpemUgKj0gc2l6ZW9mKHdjaGFyX3QpOworICAgICAgICBwYS0+dmFsdWUucCA9IFB5TWVtX01hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFwYS0+dmFsdWUucCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocGEtPnZhbHVlLnAsIDAsIHNpemUpOworICAgICAgICBwYS0+a2VlcCA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cihwYS0+dmFsdWUucCwgUHlNZW1fRnJlZSk7CisgICAgICAgIGlmICghcGEtPmtlZXApIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUocGEtPnZhbHVlLnApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICgtMSA9PSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigoUHlVbmljb2RlT2JqZWN0ICopb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGEtPnZhbHVlLnAsIFB5VW5pY29kZV9HRVRfU0laRShvYmopKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIDA7CiAjZW5kaWYKLQl9CisgICAgfQogI2VuZGlmCiAKLQl7Ci0JCVB5T2JqZWN0ICphcmc7Ci0JCWFyZyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX2FzX3BhcmFtZXRlcl8iKTsKLQkJLyogV2hpY2ggdHlwZXMgc2hvdWxkIHdlIGV4YWN0bHkgYWxsb3cgaGVyZT8KLQkJICAgaW50ZWdlcnMgYXJlIHJlcXVpcmVkIGZvciB1c2luZyBQeXRob24gY2xhc3NlcwotCQkgICBhcyBwYXJhbWV0ZXJzICh0aGV5IGhhdmUgdG8gZXhwb3NlIHRoZSAnX2FzX3BhcmFtZXRlcl8nCi0JCSAgIGF0dHJpYnV0ZSkKLQkJKi8KLQkJaWYgKGFyZykgewotCQkJaW50IHJlc3VsdDsKLQkJCXJlc3VsdCA9IENvbnZQYXJhbShhcmcsIGluZGV4LCBwYSk7Ci0JCQlQeV9ERUNSRUYoYXJnKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIkRvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgcGFyYW1ldGVyICVkIiwgCi0JCQkgICAgIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZzsKKyAgICAgICAgYXJnID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfYXNfcGFyYW1ldGVyXyIpOworICAgICAgICAvKiBXaGljaCB0eXBlcyBzaG91bGQgd2UgZXhhY3RseSBhbGxvdyBoZXJlPworICAgICAgICAgICBpbnRlZ2VycyBhcmUgcmVxdWlyZWQgZm9yIHVzaW5nIFB5dGhvbiBjbGFzc2VzCisgICAgICAgICAgIGFzIHBhcmFtZXRlcnMgKHRoZXkgaGF2ZSB0byBleHBvc2UgdGhlICdfYXNfcGFyYW1ldGVyXycKKyAgICAgICAgICAgYXR0cmlidXRlKQorICAgICAgICAqLworICAgICAgICBpZiAoYXJnKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gQ29udlBhcmFtKGFyZywgaW5kZXgsIHBhKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkRvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgcGFyYW1ldGVyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiAKIGZmaV90eXBlICpHZXRUeXBlKFB5T2JqZWN0ICpvYmopCiB7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlpZiAob2JqID09IE5VTEwpCi0JCXJldHVybiAmZmZpX3R5cGVfc2ludDsKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlyZXR1cm4gJmZmaV90eXBlX3NpbnQ7CisgICAgU3RnRGljdE9iamVjdCAqZGljdDsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiAmZmZpX3R5cGVfc2ludDsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gJmZmaV90eXBlX3NpbnQ7CiAjaWYgZGVmaW5lZChNU19XSU4zMikgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKLQkvKiBUaGlzIGxpdHRsZSB0cmljayB3b3JrcyBjb3JyZWN0bHkgd2l0aCBNU1ZDLgotCSAgIEl0IHJldHVybnMgc21hbGwgc3RydWN0dXJlcyBpbiByZWdpc3RlcnMKLQkqLwotCWlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSB7Ci0JCWlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPD0gNCkKLQkJCXJldHVybiAmZmZpX3R5cGVfc2ludDMyOwotCQllbHNlIGlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPD0gOCkKLQkJCXJldHVybiAmZmZpX3R5cGVfc2ludDY0OwotCX0KKyAgICAvKiBUaGlzIGxpdHRsZSB0cmljayB3b3JrcyBjb3JyZWN0bHkgd2l0aCBNU1ZDLgorICAgICAgIEl0IHJldHVybnMgc21hbGwgc3RydWN0dXJlcyBpbiByZWdpc3RlcnMKKyAgICAqLworICAgIGlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUKSB7CisgICAgICAgIGlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPD0gNCkKKyAgICAgICAgICAgIHJldHVybiAmZmZpX3R5cGVfc2ludDMyOworICAgICAgICBlbHNlIGlmIChkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnNpemUgPD0gOCkKKyAgICAgICAgICAgIHJldHVybiAmZmZpX3R5cGVfc2ludDY0OworICAgIH0KICNlbmRpZgotCXJldHVybiAmZGljdC0+ZmZpX3R5cGVfcG9pbnRlcjsKKyAgICByZXR1cm4gJmRpY3QtPmZmaV90eXBlX3BvaW50ZXI7CiB9CiAKIApAQCAtNzM2LDcgKzczNiw3IEBACiAgKiBsaWJmZmkgdXNlczoKICAqCiAgKiBmZmlfc3RhdHVzIGZmaV9wcmVwX2NpZihmZmlfY2lmICpjaWYsIGZmaV9hYmkgYWJpLAotICoJICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYXJncywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYXJncywKICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZmaV90eXBlICpydHlwZSwKICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZmaV90eXBlICoqYXR5cGVzKTsKICAqCkBAIC03NDUsMTM5ICs3NDUsMTM5IEBACiAgKiB2b2lkIGZmaV9jYWxsKGZmaV9jaWYgKmNpZiwgdm9pZCAqZm4sIHZvaWQgKnJ2YWx1ZSwgdm9pZCAqKmF2YWx1ZXMpOwogICovCiBzdGF0aWMgaW50IF9jYWxsX2Z1bmN0aW9uX3BvaW50ZXIoaW50IGZsYWdzLAotCQkJCSAgUFBST0MgcFByb2MsCi0JCQkJICB2b2lkICoqYXZhbHVlcywKLQkJCQkgIGZmaV90eXBlICoqYXR5cGVzLAotCQkJCSAgZmZpX3R5cGUgKnJlc3R5cGUsCi0JCQkJICB2b2lkICpyZXNtZW0sCi0JCQkJICBpbnQgYXJnY291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBST0MgcFByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmF2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX3R5cGUgKiphdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZpX3R5cGUgKnJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVzbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjb3VudCkKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkU3RhdGUgKl9zYXZlID0gTlVMTDsgLyogRm9yIFB5X0JMT0NLX1RIUkVBRFMgYW5kIFB5X1VOQkxPQ0tfVEhSRUFEUyAqLworICAgIFB5VGhyZWFkU3RhdGUgKl9zYXZlID0gTlVMTDsgLyogRm9yIFB5X0JMT0NLX1RIUkVBRFMgYW5kIFB5X1VOQkxPQ0tfVEhSRUFEUyAqLwogI2VuZGlmCi0JUHlPYmplY3QgKmVycm9yX29iamVjdCA9IE5VTEw7Ci0JaW50ICpzcGFjZTsKLQlmZmlfY2lmIGNpZjsKLQlpbnQgY2M7CisgICAgUHlPYmplY3QgKmVycm9yX29iamVjdCA9IE5VTEw7CisgICAgaW50ICpzcGFjZTsKKyAgICBmZmlfY2lmIGNpZjsKKyAgICBpbnQgY2M7CiAjaWZkZWYgTVNfV0lOMzIKLQlpbnQgZGVsdGE7CisgICAgaW50IGRlbHRhOwogI2lmbmRlZiBET05UX1VTRV9TRUgKLQlEV09SRCBkd0V4Y2VwdGlvbkNvZGUgPSAwOwotCUVYQ0VQVElPTl9SRUNPUkQgcmVjb3JkOworICAgIERXT1JEIGR3RXhjZXB0aW9uQ29kZSA9IDA7CisgICAgRVhDRVBUSU9OX1JFQ09SRCByZWNvcmQ7CiAjZW5kaWYKICNlbmRpZgotCS8qIFhYWCBjaGVjayBiZWZvcmUgaGVyZSAqLwotCWlmIChyZXN0eXBlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiTm8gZmZpX3R5cGUgZm9yIHJlc3VsdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCWNjID0gRkZJX0RFRkFVTFRfQUJJOwotI2lmIGRlZmluZWQoTVNfV0lOMzIpICYmICFkZWZpbmVkKE1TX1dJTjY0KSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19DREVDTCkgPT0gMCkKLQkJY2MgPSBGRklfU1REQ0FMTDsKLSNlbmRpZgotCWlmIChGRklfT0sgIT0gZmZpX3ByZXBfY2lmKCZjaWYsCi0JCQkJICAgY2MsCi0JCQkJICAgYXJnY291bnQsCi0JCQkJICAgcmVzdHlwZSwKLQkJCQkgICBhdHlwZXMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJImZmaV9wcmVwX2NpZiBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBYWFggY2hlY2sgYmVmb3JlIGhlcmUgKi8KKyAgICBpZiAocmVzdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8gZmZpX3R5cGUgZm9yIHJlc3VsdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKGZsYWdzICYgKEZVTkNGTEFHX1VTRV9FUlJOTyB8IEZVTkNGTEFHX1VTRV9MQVNURVJST1IpKSB7Ci0JCWVycm9yX29iamVjdCA9IGdldF9lcnJvcl9vYmplY3QoJnNwYWNlKTsKLQkJaWYgKGVycm9yX29iamVjdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICBjYyA9IEZGSV9ERUZBVUxUX0FCSTsKKyNpZiBkZWZpbmVkKE1TX1dJTjMyKSAmJiAhZGVmaW5lZChNU19XSU42NCkgJiYgIWRlZmluZWQoX1dJTjMyX1dDRSkKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpID09IDApCisgICAgICAgIGNjID0gRkZJX1NURENBTEw7CisjZW5kaWYKKyAgICBpZiAoRkZJX09LICE9IGZmaV9wcmVwX2NpZigmY2lmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGVzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZmaV9wcmVwX2NpZiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChmbGFncyAmIChGVU5DRkxBR19VU0VfRVJSTk8gfCBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSkgeworICAgICAgICBlcnJvcl9vYmplY3QgPSBnZXRfZXJyb3Jfb2JqZWN0KCZzcGFjZSk7CisgICAgICAgIGlmIChlcnJvcl9vYmplY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQotCQlQeV9VTkJMT0NLX1RIUkVBRFMKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQorICAgICAgICBQeV9VTkJMT0NLX1RIUkVBRFMKICNlbmRpZgotCWlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgewotCQlpbnQgdGVtcCA9IHNwYWNlWzBdOwotCQlzcGFjZVswXSA9IGVycm5vOwotCQllcnJubyA9IHRlbXA7Ci0JfQorICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzBdOworICAgICAgICBzcGFjZVswXSA9IGVycm5vOworICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgfQogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikgewotCQlpbnQgdGVtcCA9IHNwYWNlWzFdOwotCQlzcGFjZVsxXSA9IEdldExhc3RFcnJvcigpOwotCQlTZXRMYXN0RXJyb3IodGVtcCk7Ci0JfQorICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9MQVNURVJST1IpIHsKKyAgICAgICAgaW50IHRlbXAgPSBzcGFjZVsxXTsKKyAgICAgICAgc3BhY2VbMV0gPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgU2V0TGFzdEVycm9yKHRlbXApOworICAgIH0KICNpZm5kZWYgRE9OVF9VU0VfU0VICi0JX190cnkgeworICAgIF9fdHJ5IHsKICNlbmRpZgotCQlkZWx0YSA9CisgICAgICAgIGRlbHRhID0KICNlbmRpZgotCQkJZmZpX2NhbGwoJmNpZiwgKHZvaWQgKilwUHJvYywgcmVzbWVtLCBhdmFsdWVzKTsKKyAgICAgICAgICAgIGZmaV9jYWxsKCZjaWYsICh2b2lkICopcFByb2MsIHJlc21lbSwgYXZhbHVlcyk7CiAjaWZkZWYgTVNfV0lOMzIKICNpZm5kZWYgRE9OVF9VU0VfU0VICi0JfQotCV9fZXhjZXB0IChIYW5kbGVFeGNlcHRpb24oR2V0RXhjZXB0aW9uSW5mb3JtYXRpb24oKSwKLQkJCQkgICZkd0V4Y2VwdGlvbkNvZGUsICZyZWNvcmQpKSB7Ci0JCTsKLQl9CisgICAgfQorICAgIF9fZXhjZXB0IChIYW5kbGVFeGNlcHRpb24oR2V0RXhjZXB0aW9uSW5mb3JtYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkd0V4Y2VwdGlvbkNvZGUsICZyZWNvcmQpKSB7CisgICAgICAgIDsKKyAgICB9CiAjZW5kaWYKLQlpZiAoZmxhZ3MgJiBGVU5DRkxBR19VU0VfTEFTVEVSUk9SKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMV07Ci0JCXNwYWNlWzFdID0gR2V0TGFzdEVycm9yKCk7Ci0JCVNldExhc3RFcnJvcih0ZW1wKTsKLQl9CisgICAgaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUikgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzFdOworICAgICAgICBzcGFjZVsxXSA9IEdldExhc3RFcnJvcigpOworICAgICAgICBTZXRMYXN0RXJyb3IodGVtcCk7CisgICAgfQogI2VuZGlmCi0JaWYgKGZsYWdzICYgRlVOQ0ZMQUdfVVNFX0VSUk5PKSB7Ci0JCWludCB0ZW1wID0gc3BhY2VbMF07Ci0JCXNwYWNlWzBdID0gZXJybm87Ci0JCWVycm5vID0gdGVtcDsKLQl9Ci0JUHlfWERFQ1JFRihlcnJvcl9vYmplY3QpOworICAgIGlmIChmbGFncyAmIEZVTkNGTEFHX1VTRV9FUlJOTykgeworICAgICAgICBpbnQgdGVtcCA9IHNwYWNlWzBdOworICAgICAgICBzcGFjZVswXSA9IGVycm5vOworICAgICAgICBlcnJubyA9IHRlbXA7CisgICAgfQorICAgIFB5X1hERUNSRUYoZXJyb3Jfb2JqZWN0KTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19QWVRIT05BUEkpID09IDApCi0JCVB5X0JMT0NLX1RIUkVBRFMKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSA9PSAwKQorICAgICAgICBQeV9CTE9DS19USFJFQURTCiAjZW5kaWYKICNpZmRlZiBNU19XSU4zMgogI2lmbmRlZiBET05UX1VTRV9TRUgKLQlpZiAoZHdFeGNlcHRpb25Db2RlKSB7Ci0JCVNldEV4Y2VwdGlvbihkd0V4Y2VwdGlvbkNvZGUsICZyZWNvcmQpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChkd0V4Y2VwdGlvbkNvZGUpIHsKKyAgICAgICAgU2V0RXhjZXB0aW9uKGR3RXhjZXB0aW9uQ29kZSwgJnJlY29yZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjZW5kaWYKICNpZmRlZiBNU19XSU42NAotCWlmIChkZWx0YSAhPSAwKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAgICJmZmlfY2FsbCBmYWlsZWQgd2l0aCBjb2RlICVkIiwKLQkJCSAgICAgZGVsdGEpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChkZWx0YSAhPSAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZmZpX2NhbGwgZmFpbGVkIHdpdGggY29kZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICBkZWx0YSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjZWxzZQotCWlmIChkZWx0YSA8IDApIHsKLQkJaWYgKGZsYWdzICYgRlVOQ0ZMQUdfQ0RFQ0wpCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICJQcm9jZWR1cmUgY2FsbGVkIHdpdGggbm90IGVub3VnaCAiCi0JCQkJICAgICAiYXJndW1lbnRzICglZCBieXRlcyBtaXNzaW5nKSAiCi0JCQkJICAgICAib3Igd3JvbmcgY2FsbGluZyBjb252ZW50aW9uIiwKLQkJCQkgICAgIC1kZWx0YSk7Ci0JCWVsc2UKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgIlByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCBub3QgZW5vdWdoICIKLQkJCQkgICAgICJhcmd1bWVudHMgKCVkIGJ5dGVzIG1pc3NpbmcpIiwKLQkJCQkgICAgIC1kZWx0YSk7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgaWYgKGRlbHRhID4gMCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIlByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCB0b28gbWFueSAiCi0JCQkgICAgICJhcmd1bWVudHMgKCVkIGJ5dGVzIGluIGV4Y2VzcykiLAotCQkJICAgICBkZWx0YSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKGRlbHRhIDwgMCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBGVU5DRkxBR19DREVDTCkKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZWR1cmUgY2FsbGVkIHdpdGggbm90IGVub3VnaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyAoJWQgYnl0ZXMgbWlzc2luZykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvciB3cm9uZyBjYWxsaW5nIGNvbnZlbnRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIC1kZWx0YSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggbm90IGVub3VnaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyAoJWQgYnl0ZXMgbWlzc2luZykiLAorICAgICAgICAgICAgICAgICAgICAgICAgIC1kZWx0YSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGRlbHRhID4gMCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggdG9vIG1hbnkgIgorICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyAoJWQgYnl0ZXMgaW4gZXhjZXNzKSIsCisgICAgICAgICAgICAgICAgICAgICBkZWx0YSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjZW5kaWYKICNlbmRpZgotCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19QWVRIT05BUEkpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoKGZsYWdzICYgRlVOQ0ZMQUdfUFlUSE9OQVBJKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC04OTIsNDEgKzg5Miw0MSBAQAogICovCiBzdGF0aWMgUHlPYmplY3QgKkdldFJlc3VsdChQeU9iamVjdCAqcmVzdHlwZSwgdm9pZCAqcmVzdWx0LCBQeU9iamVjdCAqY2hlY2tlcikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCVB5T2JqZWN0ICpyZXR2YWwsICp2OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKnJldHZhbCwgKnY7CiAKLQlpZiAocmVzdHlwZSA9PSBOVUxMKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKihpbnQgKilyZXN1bHQpOworICAgIGlmIChyZXN0eXBlID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygqKGludCAqKXJlc3VsdCk7CiAKLQlpZiAocmVzdHlwZSA9PSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIGlmIChyZXN0eXBlID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3QocmVzdHlwZSk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihyZXN0eXBlLCAiaSIsICooaW50ICopcmVzdWx0KTsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3QocmVzdHlwZSk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihyZXN0eXBlLCAiaSIsICooaW50ICopcmVzdWx0KTsKIAotCWlmIChkaWN0LT5nZXRmdW5jICYmICFJc1NpbXBsZVN1YlR5cGUocmVzdHlwZSkpIHsKLQkJcmV0dmFsID0gZGljdC0+Z2V0ZnVuYyhyZXN1bHQsIGRpY3QtPnNpemUpOwotCQkvKiBJZiByZXN0eXBlIGlzIHB5X29iamVjdCAoZGV0ZWN0ZWQgYnkgY29tcGFyaW5nIGdldGZ1bmMgd2l0aAotCQkgICBPX2dldCksIHdlIGhhdmUgdG8gY2FsbCBQeV9ERUNSRUYgYmVjYXVzZSBPX2dldCBoYXMgYWxyZWFkeQotCQkgICBjYWxsZWQgUHlfSU5DUkVGLgotCQkqLwotCQlpZiAoZGljdC0+Z2V0ZnVuYyA9PSBnZXRlbnRyeSgiTyIpLT5nZXRmdW5jKSB7Ci0JCQlQeV9ERUNSRUYocmV0dmFsKTsKLQkJfQotCX0gZWxzZQotCQlyZXR2YWwgPSBDRGF0YV9Gcm9tQmFzZU9iaihyZXN0eXBlLCBOVUxMLCAwLCByZXN1bHQpOworICAgIGlmIChkaWN0LT5nZXRmdW5jICYmICFJc1NpbXBsZVN1YlR5cGUocmVzdHlwZSkpIHsKKyAgICAgICAgcmV0dmFsID0gZGljdC0+Z2V0ZnVuYyhyZXN1bHQsIGRpY3QtPnNpemUpOworICAgICAgICAvKiBJZiByZXN0eXBlIGlzIHB5X29iamVjdCAoZGV0ZWN0ZWQgYnkgY29tcGFyaW5nIGdldGZ1bmMgd2l0aAorICAgICAgICAgICBPX2dldCksIHdlIGhhdmUgdG8gY2FsbCBQeV9ERUNSRUYgYmVjYXVzZSBPX2dldCBoYXMgYWxyZWFkeQorICAgICAgICAgICBjYWxsZWQgUHlfSU5DUkVGLgorICAgICAgICAqLworICAgICAgICBpZiAoZGljdC0+Z2V0ZnVuYyA9PSBnZXRlbnRyeSgiTyIpLT5nZXRmdW5jKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICByZXR2YWwgPSBDRGF0YV9Gcm9tQmFzZU9iaihyZXN0eXBlLCBOVUxMLCAwLCByZXN1bHQpOwogCi0JaWYgKCFjaGVja2VyIHx8ICFyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisgICAgaWYgKCFjaGVja2VyIHx8ICFyZXR2YWwpCisgICAgICAgIHJldHVybiByZXR2YWw7CiAKLQl2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjaGVja2VyLCByZXR2YWwsIE5VTEwpOwotCWlmICh2ID09IE5VTEwpCi0JCV9BZGRUcmFjZWJhY2soIkdldFJlc3VsdCIsICJfY3R5cGVzL2NhbGxwcm9jLmMiLCBfX0xJTkVfXy0yKTsKLQlQeV9ERUNSRUYocmV0dmFsKTsKLQlyZXR1cm4gdjsKKyAgICB2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjaGVja2VyLCByZXR2YWwsIE5VTEwpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIF9BZGRUcmFjZWJhY2soIkdldFJlc3VsdCIsICJfY3R5cGVzL2NhbGxwcm9jLmMiLCBfX0xJTkVfXy0yKTsKKyAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyoKQEAgLTkzNSw0MCArOTM1LDQwIEBACiAgKi8KIHZvaWQgRXh0ZW5kX0Vycm9yX0luZm8oUHlPYmplY3QgKmV4Y19jbGFzcywgY2hhciAqZm10LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YXJnczsKLQlQeU9iamVjdCAqdHAsICp2LCAqdGIsICpzLCAqY2xzX3N0ciwgKm1zZ19zdHI7CisgICAgdmFfbGlzdCB2YXJnczsKKyAgICBQeU9iamVjdCAqdHAsICp2LCAqdGIsICpzLCAqY2xzX3N0ciwgKm1zZ19zdHI7CiAKLQl2YV9zdGFydCh2YXJncywgZm10KTsKLQlzID0gUHlTdHJpbmdfRnJvbUZvcm1hdFYoZm10LCB2YXJncyk7Ci0JdmFfZW5kKHZhcmdzKTsKLQlpZiAoIXMpCi0JCXJldHVybjsKKyAgICB2YV9zdGFydCh2YXJncywgZm10KTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbUZvcm1hdFYoZm10LCB2YXJncyk7CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKIAotCVB5RXJyX0ZldGNoKCZ0cCwgJnYsICZ0Yik7Ci0JUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZ0cCwgJnYsICZ0Yik7Ci0JY2xzX3N0ciA9IFB5T2JqZWN0X1N0cih0cCk7Ci0JaWYgKGNsc19zdHIpIHsKLQkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBjbHNfc3RyKTsKLQkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCI6ICIpKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JfSBlbHNlCi0JCVB5RXJyX0NsZWFyKCk7Ci0JbXNnX3N0ciA9IFB5T2JqZWN0X1N0cih2KTsKLQlpZiAobXNnX3N0cikKLQkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBtc2dfc3RyKTsKLQllbHNlIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeVN0cmluZ19Gcm9tU3RyaW5nKCI/Pz8iKSk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCX0KLQlQeUVycl9TZXRPYmplY3QoZXhjX2NsYXNzLCBzKTsKKyAgICBQeUVycl9GZXRjaCgmdHAsICZ2LCAmdGIpOworICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmdHAsICZ2LCAmdGIpOworICAgIGNsc19zdHIgPSBQeU9iamVjdF9TdHIodHApOworICAgIGlmIChjbHNfc3RyKSB7CisgICAgICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgY2xzX3N0cik7CisgICAgICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlTdHJpbmdfRnJvbVN0cmluZygiOiAiKSk7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0gZWxzZQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIG1zZ19zdHIgPSBQeU9iamVjdF9TdHIodik7CisgICAgaWYgKG1zZ19zdHIpCisgICAgICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgbXNnX3N0cik7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlTdHJpbmdfRnJvbVN0cmluZygiPz8/IikpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgUHlFcnJfU2V0T2JqZWN0KGV4Y19jbGFzcywgcyk7CiBlcnJvcjoKLQlQeV9YREVDUkVGKHRwKTsKLQlQeV9YREVDUkVGKHYpOwotCVB5X1hERUNSRUYodGIpOwotCVB5X1hERUNSRUYocyk7CisgICAgUHlfWERFQ1JFRih0cCk7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICBQeV9YREVDUkVGKHRiKTsKKyAgICBQeV9YREVDUkVGKHMpOwogfQogCiAKQEAgLTk3Nyw3NyArOTc3LDc3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogR2V0Q29tRXJyb3IoSFJFU1VMVCBlcnJjb2RlLCBHVUlEICpyaWlkLCBJVW5rbm93biAqcEl1bmspCiB7Ci0JSFJFU1VMVCBocjsKLQlJU3VwcG9ydEVycm9ySW5mbyAqcHNlaSA9IE5VTEw7Ci0JSUVycm9ySW5mbyAqcGVpID0gTlVMTDsKLQlCU1RSIGRlc2NyPU5VTEwsIGhlbHBmaWxlPU5VTEwsIHNvdXJjZT1OVUxMOwotCUdVSUQgZ3VpZDsKLQlEV09SRCBoZWxwY29udGV4dD0wOwotCUxQT0xFU1RSIHByb2dpZDsKLQlQeU9iamVjdCAqb2JqOwotCVRDSEFSICp0ZXh0OworICAgIEhSRVNVTFQgaHI7CisgICAgSVN1cHBvcnRFcnJvckluZm8gKnBzZWkgPSBOVUxMOworICAgIElFcnJvckluZm8gKnBlaSA9IE5VTEw7CisgICAgQlNUUiBkZXNjcj1OVUxMLCBoZWxwZmlsZT1OVUxMLCBzb3VyY2U9TlVMTDsKKyAgICBHVUlEIGd1aWQ7CisgICAgRFdPUkQgaGVscGNvbnRleHQ9MDsKKyAgICBMUE9MRVNUUiBwcm9naWQ7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBUQ0hBUiAqdGV4dDsKIAotCS8qIFdlIGFic29sdXRlbHkgaGF2ZSB0byByZWxlYXNlIHRoZSBHSUwgZHVyaW5nIENPTSBtZXRob2QgY2FsbHMsCi0JICAgb3RoZXJ3aXNlIHdlIG1heSBnZXQgYSBkZWFkbG9jayEKLQkqLworICAgIC8qIFdlIGFic29sdXRlbHkgaGF2ZSB0byByZWxlYXNlIHRoZSBHSUwgZHVyaW5nIENPTSBtZXRob2QgY2FsbHMsCisgICAgICAgb3RoZXJ3aXNlIHdlIG1heSBnZXQgYSBkZWFkbG9jayEKKyAgICAqLwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICNlbmRpZgogCi0JaHIgPSBwSXVuay0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwSXVuaywgJklJRF9JU3VwcG9ydEVycm9ySW5mbywgKHZvaWQgKiopJnBzZWkpOwotCWlmIChGQUlMRUQoaHIpKQotCQlnb3RvIGZhaWxlZDsKKyAgICBociA9IHBJdW5rLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHBJdW5rLCAmSUlEX0lTdXBwb3J0RXJyb3JJbmZvLCAodm9pZCAqKikmcHNlaSk7CisgICAgaWYgKEZBSUxFRChocikpCisgICAgICAgIGdvdG8gZmFpbGVkOwogCi0JaHIgPSBwc2VpLT5scFZ0YmwtPkludGVyZmFjZVN1cHBvcnRzRXJyb3JJbmZvKHBzZWksIHJpaWQpOwotCXBzZWktPmxwVnRibC0+UmVsZWFzZShwc2VpKTsKLQlpZiAoRkFJTEVEKGhyKSkKLQkJZ290byBmYWlsZWQ7CisgICAgaHIgPSBwc2VpLT5scFZ0YmwtPkludGVyZmFjZVN1cHBvcnRzRXJyb3JJbmZvKHBzZWksIHJpaWQpOworICAgIHBzZWktPmxwVnRibC0+UmVsZWFzZShwc2VpKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICAgICAgZ290byBmYWlsZWQ7CiAKLQlociA9IEdldEVycm9ySW5mbygwLCAmcGVpKTsKLQlpZiAoaHIgIT0gU19PSykKLQkJZ290byBmYWlsZWQ7CisgICAgaHIgPSBHZXRFcnJvckluZm8oMCwgJnBlaSk7CisgICAgaWYgKGhyICE9IFNfT0spCisgICAgICAgIGdvdG8gZmFpbGVkOwogCi0JcGVpLT5scFZ0YmwtPkdldERlc2NyaXB0aW9uKHBlaSwgJmRlc2NyKTsKLQlwZWktPmxwVnRibC0+R2V0R1VJRChwZWksICZndWlkKTsKLQlwZWktPmxwVnRibC0+R2V0SGVscENvbnRleHQocGVpLCAmaGVscGNvbnRleHQpOwotCXBlaS0+bHBWdGJsLT5HZXRIZWxwRmlsZShwZWksICZoZWxwZmlsZSk7Ci0JcGVpLT5scFZ0YmwtPkdldFNvdXJjZShwZWksICZzb3VyY2UpOworICAgIHBlaS0+bHBWdGJsLT5HZXREZXNjcmlwdGlvbihwZWksICZkZXNjcik7CisgICAgcGVpLT5scFZ0YmwtPkdldEdVSUQocGVpLCAmZ3VpZCk7CisgICAgcGVpLT5scFZ0YmwtPkdldEhlbHBDb250ZXh0KHBlaSwgJmhlbHBjb250ZXh0KTsKKyAgICBwZWktPmxwVnRibC0+R2V0SGVscEZpbGUocGVpLCAmaGVscGZpbGUpOworICAgIHBlaS0+bHBWdGJsLT5HZXRTb3VyY2UocGVpLCAmc291cmNlKTsKIAotCXBlaS0+bHBWdGJsLT5SZWxlYXNlKHBlaSk7CisgICAgcGVpLT5scFZ0YmwtPlJlbGVhc2UocGVpKTsKIAogICBmYWlsZWQ6CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZW5kaWYKIAotCXByb2dpZCA9IE5VTEw7Ci0JUHJvZ0lERnJvbUNMU0lEKCZndWlkLCAmcHJvZ2lkKTsKKyAgICBwcm9naWQgPSBOVUxMOworICAgIFByb2dJREZyb21DTFNJRCgmZ3VpZCwgJnByb2dpZCk7CiAKLQl0ZXh0ID0gRm9ybWF0RXJyb3IoZXJyY29kZSk7Ci0Jb2JqID0gUHlfQnVpbGRWYWx1ZSgKKyAgICB0ZXh0ID0gRm9ybWF0RXJyb3IoZXJyY29kZSk7CisgICAgb2JqID0gUHlfQnVpbGRWYWx1ZSgKICNpZmRlZiBfVU5JQ09ERQotCQkiaXUodXV1aXUpIiwKKyAgICAgICAgIml1KHV1dWl1KSIsCiAjZWxzZQotCQkiaXModXV1aXUpIiwKKyAgICAgICAgImlzKHV1dWl1KSIsCiAjZW5kaWYKLQkJZXJyY29kZSwKLQkJdGV4dCwKLQkJZGVzY3IsIHNvdXJjZSwgaGVscGZpbGUsIGhlbHBjb250ZXh0LAotCQlwcm9naWQpOwotCWlmIChvYmopIHsKLQkJUHlFcnJfU2V0T2JqZWN0KENvbUVycm9yLCBvYmopOwotCQlQeV9ERUNSRUYob2JqKTsKLQl9Ci0JTG9jYWxGcmVlKHRleHQpOworICAgICAgICBlcnJjb2RlLAorICAgICAgICB0ZXh0LAorICAgICAgICBkZXNjciwgc291cmNlLCBoZWxwZmlsZSwgaGVscGNvbnRleHQsCisgICAgICAgIHByb2dpZCk7CisgICAgaWYgKG9iaikgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoQ29tRXJyb3IsIG9iaik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgIH0KKyAgICBMb2NhbEZyZWUodGV4dCk7CiAKLQlpZiAoZGVzY3IpCi0JCVN5c0ZyZWVTdHJpbmcoZGVzY3IpOwotCWlmIChoZWxwZmlsZSkKLQkJU3lzRnJlZVN0cmluZyhoZWxwZmlsZSk7Ci0JaWYgKHNvdXJjZSkKLQkJU3lzRnJlZVN0cmluZyhzb3VyY2UpOworICAgIGlmIChkZXNjcikKKyAgICAgICAgU3lzRnJlZVN0cmluZyhkZXNjcik7CisgICAgaWYgKGhlbHBmaWxlKQorICAgICAgICBTeXNGcmVlU3RyaW5nKGhlbHBmaWxlKTsKKyAgICBpZiAoc291cmNlKQorICAgICAgICBTeXNGcmVlU3RyaW5nKHNvdXJjZSk7CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KICNlbmRpZgogCkBAIC0xMDU5LDE1OCArMTA1OSwxNTggQEAKICAqIC0gWFhYIHZhcmlvdXMgcmVxdWlyZW1lbnRzIGZvciByZXN0eXBlLCBub3QgeWV0IGNvbGxlY3RlZAogICovCiBQeU9iamVjdCAqX0NhbGxQcm9jKFBQUk9DIHBQcm9jLAotCQkgICAgUHlPYmplY3QgKmFyZ3R1cGxlLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJndHVwbGUsCiAjaWZkZWYgTVNfV0lOMzIKLQkJICAgIElVbmtub3duICpwSXVuaywKLQkJICAgIEdVSUQgKmlpZCwKKyAgICAgICAgICAgICAgICAgICAgSVVua25vd24gKnBJdW5rLAorICAgICAgICAgICAgICAgICAgICBHVUlEICppaWQsCiAjZW5kaWYKLQkJICAgIGludCBmbGFncywKLQkJICAgIFB5T2JqZWN0ICphcmd0eXBlcywgLyogbWlzbGVhZGluZyBuYW1lOiBUaGlzIGlzIGEgdHVwbGUgb2YKLQkJCQkJICAgbWV0aG9kcywgbm90IHR5cGVzOiB0aGUgLmZyb21fcGFyYW0KLQkJCQkJICAgY2xhc3MgbWV0aG9kcyBvZiB0aGUgdHlwZXMgKi8KLQkJICAgIFB5T2JqZWN0ICpyZXN0eXBlLAotCQkgICAgUHlPYmplY3QgKmNoZWNrZXIpCisgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3R5cGVzLCAvKiBtaXNsZWFkaW5nIG5hbWU6IFRoaXMgaXMgYSB0dXBsZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMsIG5vdCB0eXBlczogdGhlIC5mcm9tX3BhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgbWV0aG9kcyBvZiB0aGUgdHlwZXMgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN0eXBlLAorICAgICAgICAgICAgUHlPYmplY3QgKmNoZWNrZXIpCiB7Ci0JUHlfc3NpemVfdCBpLCBuLCBhcmdjb3VudCwgYXJndHlwZV9jb3VudDsKLQl2b2lkICpyZXNidWY7Ci0Jc3RydWN0IGFyZ3VtZW50ICphcmdzLCAqcGE7Ci0JZmZpX3R5cGUgKiphdHlwZXM7Ci0JZmZpX3R5cGUgKnJ0eXBlOwotCXZvaWQgKiphdmFsdWVzOwotCVB5T2JqZWN0ICpyZXR2YWwgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgbiwgYXJnY291bnQsIGFyZ3R5cGVfY291bnQ7CisgICAgdm9pZCAqcmVzYnVmOworICAgIHN0cnVjdCBhcmd1bWVudCAqYXJncywgKnBhOworICAgIGZmaV90eXBlICoqYXR5cGVzOworICAgIGZmaV90eXBlICpydHlwZTsKKyAgICB2b2lkICoqYXZhbHVlczsKKyAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKIAotCW4gPSBhcmdjb3VudCA9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHVwbGUpOworICAgIG4gPSBhcmdjb3VudCA9IFB5VHVwbGVfR0VUX1NJWkUoYXJndHVwbGUpOwogI2lmZGVmIE1TX1dJTjMyCi0JLyogYW4gb3B0aW9uYWwgQ09NIG9iamVjdCB0aGlzIHBvaW50ZXIgKi8KLQlpZiAocEl1bmspCi0JCSsrYXJnY291bnQ7CisgICAgLyogYW4gb3B0aW9uYWwgQ09NIG9iamVjdCB0aGlzIHBvaW50ZXIgKi8KKyAgICBpZiAocEl1bmspCisgICAgICAgICsrYXJnY291bnQ7CiAjZW5kaWYKIAotCWFyZ3MgPSAoc3RydWN0IGFyZ3VtZW50ICopYWxsb2NhKHNpemVvZihzdHJ1Y3QgYXJndW1lbnQpICogYXJnY291bnQpOwotCWlmICghYXJncykgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtc2V0KGFyZ3MsIDAsIHNpemVvZihzdHJ1Y3QgYXJndW1lbnQpICogYXJnY291bnQpOwotCWFyZ3R5cGVfY291bnQgPSBhcmd0eXBlcyA/IFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpIDogMDsKKyAgICBhcmdzID0gKHN0cnVjdCBhcmd1bWVudCAqKWFsbG9jYShzaXplb2Yoc3RydWN0IGFyZ3VtZW50KSAqIGFyZ2NvdW50KTsKKyAgICBpZiAoIWFyZ3MpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChhcmdzLCAwLCBzaXplb2Yoc3RydWN0IGFyZ3VtZW50KSAqIGFyZ2NvdW50KTsKKyAgICBhcmd0eXBlX2NvdW50ID0gYXJndHlwZXMgPyBQeVR1cGxlX0dFVF9TSVpFKGFyZ3R5cGVzKSA6IDA7CiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAocEl1bmspIHsKLQkJYXJnc1swXS5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOwotCQlhcmdzWzBdLnZhbHVlLnAgPSBwSXVuazsKLQkJcGEgPSAmYXJnc1sxXTsKLQl9IGVsc2UKKyAgICBpZiAocEl1bmspIHsKKyAgICAgICAgYXJnc1swXS5mZmlfdHlwZSA9ICZmZmlfdHlwZV9wb2ludGVyOworICAgICAgICBhcmdzWzBdLnZhbHVlLnAgPSBwSXVuazsKKyAgICAgICAgcGEgPSAmYXJnc1sxXTsKKyAgICB9IGVsc2UKICNlbmRpZgotCQlwYSA9ICZhcmdzWzBdOworICAgICAgICBwYSA9ICZhcmdzWzBdOwogCi0JLyogQ29udmVydCB0aGUgYXJndW1lbnRzICovCi0JZm9yIChpID0gMDsgaSA8IG47ICsraSwgKytwYSkgewotCQlQeU9iamVjdCAqY29udmVydGVyOwotCQlQeU9iamVjdCAqYXJnOwotCQlpbnQgZXJyOworICAgIC8qIENvbnZlcnQgdGhlIGFyZ3VtZW50cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2ksICsrcGEpIHsKKyAgICAgICAgUHlPYmplY3QgKmNvbnZlcnRlcjsKKyAgICAgICAgUHlPYmplY3QgKmFyZzsKKyAgICAgICAgaW50IGVycjsKIAotCQlhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R1cGxlLCBpKTsJLyogYm9ycm93ZWQgcmVmICovCi0JCS8qIEZvciBjZGVjbCBmdW5jdGlvbnMsIHdlIGFsbG93IG1vcmUgYWN0dWFsIGFyZ3VtZW50cwotCQkgICB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFyZ3R5cGVzIHR1cGxlLgotCQkgICBUaGlzIGlzIGNoZWNrZWQgaW4gX2N0eXBlczo6Q0Z1bmNQdHJfQ2FsbAotCQkqLwotCQlpZiAoYXJndHlwZXMgJiYgYXJndHlwZV9jb3VudCA+IGkpIHsKLQkJCVB5T2JqZWN0ICp2OwotCQkJY29udmVydGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmd0eXBlcywgaSk7Ci0JCQl2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjb252ZXJ0ZXIsCi0JCQkJCQkJICAgYXJnLAotCQkJCQkJCSAgIE5VTEwpOwotCQkJaWYgKHYgPT0gTlVMTCkgewotCQkJCUV4dGVuZF9FcnJvcl9JbmZvKFB5RXhjX0FyZ0Vycm9yLCAiYXJndW1lbnQgJWQ6ICIsIGkrMSk7Ci0JCQkJZ290byBjbGVhbnVwOwotCQkJfQorICAgICAgICBhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R1cGxlLCBpKTsgICAgICAgICAgICAvKiBib3Jyb3dlZCByZWYgKi8KKyAgICAgICAgLyogRm9yIGNkZWNsIGZ1bmN0aW9ucywgd2UgYWxsb3cgbW9yZSBhY3R1YWwgYXJndW1lbnRzCisgICAgICAgICAgIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgYXJndHlwZXMgdHVwbGUuCisgICAgICAgICAgIFRoaXMgaXMgY2hlY2tlZCBpbiBfY3R5cGVzOjpDRnVuY1B0cl9DYWxsCisgICAgICAgICovCisgICAgICAgIGlmIChhcmd0eXBlcyAmJiBhcmd0eXBlX2NvdW50ID4gaSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgICAgICBjb252ZXJ0ZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R5cGVzLCBpKTsKKyAgICAgICAgICAgIHYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBFeHRlbmRfRXJyb3JfSW5mbyhQeUV4Y19BcmdFcnJvciwgImFyZ3VtZW50ICVkOiAiLCBpKzEpOworICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgIH0KIAotCQkJZXJyID0gQ29udlBhcmFtKHYsIGkrMSwgcGEpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJaWYgKC0xID09IGVycikgewotCQkJCUV4dGVuZF9FcnJvcl9JbmZvKFB5RXhjX0FyZ0Vycm9yLCAiYXJndW1lbnQgJWQ6ICIsIGkrMSk7Ci0JCQkJZ290byBjbGVhbnVwOwotCQkJfQotCQl9IGVsc2UgewotCQkJZXJyID0gQ29udlBhcmFtKGFyZywgaSsxLCBwYSk7Ci0JCQlpZiAoLTEgPT0gZXJyKSB7Ci0JCQkJRXh0ZW5kX0Vycm9yX0luZm8oUHlFeGNfQXJnRXJyb3IsICJhcmd1bWVudCAlZDogIiwgaSsxKTsKLQkJCQlnb3RvIGNsZWFudXA7IC8qIGxlYWtpbmcgPyAqLwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgZXJyID0gQ29udlBhcmFtKHYsIGkrMSwgcGEpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgaWYgKC0xID09IGVycikgeworICAgICAgICAgICAgICAgIEV4dGVuZF9FcnJvcl9JbmZvKFB5RXhjX0FyZ0Vycm9yLCAiYXJndW1lbnQgJWQ6ICIsIGkrMSk7CisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gQ29udlBhcmFtKGFyZywgaSsxLCBwYSk7CisgICAgICAgICAgICBpZiAoLTEgPT0gZXJyKSB7CisgICAgICAgICAgICAgICAgRXh0ZW5kX0Vycm9yX0luZm8oUHlFeGNfQXJnRXJyb3IsICJhcmd1bWVudCAlZDogIiwgaSsxKTsKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7IC8qIGxlYWtpbmcgPyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcnR5cGUgPSBHZXRUeXBlKHJlc3R5cGUpOwotCXJlc2J1ZiA9IGFsbG9jYShtYXgocnR5cGUtPnNpemUsIHNpemVvZihmZmlfYXJnKSkpOworICAgIHJ0eXBlID0gR2V0VHlwZShyZXN0eXBlKTsKKyAgICByZXNidWYgPSBhbGxvY2EobWF4KHJ0eXBlLT5zaXplLCBzaXplb2YoZmZpX2FyZykpKTsKIAotCWF2YWx1ZXMgPSAodm9pZCAqKilhbGxvY2Eoc2l6ZW9mKHZvaWQgKikgKiBhcmdjb3VudCk7Ci0JYXR5cGVzID0gKGZmaV90eXBlICoqKWFsbG9jYShzaXplb2YoZmZpX3R5cGUgKikgKiBhcmdjb3VudCk7Ci0JaWYgKCFyZXNidWYgfHwgIWF2YWx1ZXMgfHwgIWF0eXBlcykgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgKytpKSB7Ci0JCWF0eXBlc1tpXSA9IGFyZ3NbaV0uZmZpX3R5cGU7Ci0JCWlmIChhdHlwZXNbaV0tPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUIAorICAgIGF2YWx1ZXMgPSAodm9pZCAqKilhbGxvY2Eoc2l6ZW9mKHZvaWQgKikgKiBhcmdjb3VudCk7CisgICAgYXR5cGVzID0gKGZmaV90eXBlICoqKWFsbG9jYShzaXplb2YoZmZpX3R5cGUgKikgKiBhcmdjb3VudCk7CisgICAgaWYgKCFyZXNidWYgfHwgIWF2YWx1ZXMgfHwgIWF0eXBlcykgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgKytpKSB7CisgICAgICAgIGF0eXBlc1tpXSA9IGFyZ3NbaV0uZmZpX3R5cGU7CisgICAgICAgIGlmIChhdHlwZXNbaV0tPnR5cGUgPT0gRkZJX1RZUEVfU1RSVUNUCiAjaWZkZWYgX1dJTjY0Ci0JCSAgICAmJiBhdHlwZXNbaV0tPnNpemUgPD0gc2l6ZW9mKHZvaWQgKikKKyAgICAgICAgICAgICYmIGF0eXBlc1tpXS0+c2l6ZSA8PSBzaXplb2Yodm9pZCAqKQogI2VuZGlmCi0JCSAgICApCi0JCQlhdmFsdWVzW2ldID0gKHZvaWQgKilhcmdzW2ldLnZhbHVlLnA7Ci0JCWVsc2UKLQkJCWF2YWx1ZXNbaV0gPSAodm9pZCAqKSZhcmdzW2ldLnZhbHVlOwotCX0KKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGF2YWx1ZXNbaV0gPSAodm9pZCAqKWFyZ3NbaV0udmFsdWUucDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZhbHVlc1tpXSA9ICh2b2lkICopJmFyZ3NbaV0udmFsdWU7CisgICAgfQogCi0JaWYgKC0xID09IF9jYWxsX2Z1bmN0aW9uX3BvaW50ZXIoZmxhZ3MsIHBQcm9jLCBhdmFsdWVzLCBhdHlwZXMsCi0JCQkJCSBydHlwZSwgcmVzYnVmLAotCQkJCQkgUHlfU0FGRV9ET1dOQ0FTVChhcmdjb3VudCwKLQkJCQkJCQkgIFB5X3NzaXplX3QsCi0JCQkJCQkJICBpbnQpKSkKLQkJZ290byBjbGVhbnVwOworICAgIGlmICgtMSA9PSBfY2FsbF9mdW5jdGlvbl9wb2ludGVyKGZsYWdzLCBwUHJvYywgYXZhbHVlcywgYXR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0eXBlLCByZXNidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0FGRV9ET1dOQ0FTVChhcmdjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpKSkKKyAgICAgICAgZ290byBjbGVhbnVwOwogCiAjaWZkZWYgV09SRFNfQklHRU5ESUFOCi0JLyogbGliZmZpIHJldHVybnMgdGhlIHJlc3VsdCBpbiBhIGJ1ZmZlciB3aXRoIHNpemVvZihmZmlfYXJnKS4gVGhpcwotCSAgIGNhdXNlcyBwcm9ibGVtcyBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLCBzaW5jZSB0aGUgcmVzdWx0IGJ1ZmZlcgotCSAgIGFkZHJlc3MgY2Fubm90IHNpbXBseSBiZSB1c2VkIGFzIHJlc3VsdCBwb2ludGVyLCBpbnN0ZWFkIHdlIG11c3QKLQkgICBhZGp1c3QgdGhlIHBvaW50ZXIgdmFsdWU6Ci0JICovCi0JLyoKLQkgIFhYWCBJIHNob3VsZCBmaW5kIG91dCBhbmQgY2xhcmlmeSB3aHkgdGhpcyBpcyBuZWVkZWQgYXQgYWxsLAotCSAgZXNwZWNpYWxseSB3aHkgYWRqdXN0aW5nIGZvciBmZmlfdHlwZV9mbG9hdCBtdXN0IGJlIGF2b2lkZWQgb24KLQkgIDY0LWJpdCBwbGF0Zm9ybXMuCi0JICovCi0JaWYgKHJ0eXBlLT50eXBlICE9IEZGSV9UWVBFX0ZMT0FUCi0JICAgICYmIHJ0eXBlLT50eXBlICE9IEZGSV9UWVBFX1NUUlVDVAotCSAgICAmJiBydHlwZS0+c2l6ZSA8IHNpemVvZihmZmlfYXJnKSkKLQkJcmVzYnVmID0gKGNoYXIgKilyZXNidWYgKyBzaXplb2YoZmZpX2FyZykgLSBydHlwZS0+c2l6ZTsKKyAgICAvKiBsaWJmZmkgcmV0dXJucyB0aGUgcmVzdWx0IGluIGEgYnVmZmVyIHdpdGggc2l6ZW9mKGZmaV9hcmcpLiBUaGlzCisgICAgICAgY2F1c2VzIHByb2JsZW1zIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMsIHNpbmNlIHRoZSByZXN1bHQgYnVmZmVyCisgICAgICAgYWRkcmVzcyBjYW5ub3Qgc2ltcGx5IGJlIHVzZWQgYXMgcmVzdWx0IHBvaW50ZXIsIGluc3RlYWQgd2UgbXVzdAorICAgICAgIGFkanVzdCB0aGUgcG9pbnRlciB2YWx1ZToKKyAgICAgKi8KKyAgICAvKgorICAgICAgWFhYIEkgc2hvdWxkIGZpbmQgb3V0IGFuZCBjbGFyaWZ5IHdoeSB0aGlzIGlzIG5lZWRlZCBhdCBhbGwsCisgICAgICBlc3BlY2lhbGx5IHdoeSBhZGp1c3RpbmcgZm9yIGZmaV90eXBlX2Zsb2F0IG11c3QgYmUgYXZvaWRlZCBvbgorICAgICAgNjQtYml0IHBsYXRmb3Jtcy4KKyAgICAgKi8KKyAgICBpZiAocnR5cGUtPnR5cGUgIT0gRkZJX1RZUEVfRkxPQVQKKyAgICAgICAgJiYgcnR5cGUtPnR5cGUgIT0gRkZJX1RZUEVfU1RSVUNUCisgICAgICAgICYmIHJ0eXBlLT5zaXplIDwgc2l6ZW9mKGZmaV9hcmcpKQorICAgICAgICByZXNidWYgPSAoY2hhciAqKXJlc2J1ZiArIHNpemVvZihmZmlfYXJnKSAtIHJ0eXBlLT5zaXplOwogI2VuZGlmCiAKICNpZmRlZiBNU19XSU4zMgotCWlmIChpaWQgJiYgcEl1bmspIHsKLQkJaWYgKCooaW50ICopcmVzYnVmICYgMHg4MDAwMDAwMCkKLQkJCXJldHZhbCA9IEdldENvbUVycm9yKCooSFJFU1VMVCAqKXJlc2J1ZiwgaWlkLCBwSXVuayk7Ci0JCWVsc2UKLQkJCXJldHZhbCA9IFB5SW50X0Zyb21Mb25nKCooaW50ICopcmVzYnVmKTsKLQl9IGVsc2UgaWYgKGZsYWdzICYgRlVOQ0ZMQUdfSFJFU1VMVCkgewotCQlpZiAoKihpbnQgKilyZXNidWYgJiAweDgwMDAwMDAwKQotCQkJcmV0dmFsID0gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoKihpbnQgKilyZXNidWYpOwotCQllbHNlCi0JCQlyZXR2YWwgPSBQeUludF9Gcm9tTG9uZygqKGludCAqKXJlc2J1Zik7Ci0JfSBlbHNlCisgICAgaWYgKGlpZCAmJiBwSXVuaykgeworICAgICAgICBpZiAoKihpbnQgKilyZXNidWYgJiAweDgwMDAwMDAwKQorICAgICAgICAgICAgcmV0dmFsID0gR2V0Q29tRXJyb3IoKihIUkVTVUxUICopcmVzYnVmLCBpaWQsIHBJdW5rKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dmFsID0gUHlJbnRfRnJvbUxvbmcoKihpbnQgKilyZXNidWYpOworICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBGVU5DRkxBR19IUkVTVUxUKSB7CisgICAgICAgIGlmICgqKGludCAqKXJlc2J1ZiAmIDB4ODAwMDAwMDApCisgICAgICAgICAgICByZXR2YWwgPSBQeUVycl9TZXRGcm9tV2luZG93c0VycigqKGludCAqKXJlc2J1Zik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHZhbCA9IFB5SW50X0Zyb21Mb25nKCooaW50ICopcmVzYnVmKTsKKyAgICB9IGVsc2UKICNlbmRpZgotCQlyZXR2YWwgPSBHZXRSZXN1bHQocmVzdHlwZSwgcmVzYnVmLCBjaGVja2VyKTsKKyAgICAgICAgcmV0dmFsID0gR2V0UmVzdWx0KHJlc3R5cGUsIHJlc2J1ZiwgY2hlY2tlcik7CiAgIGNsZWFudXA6Ci0JZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyArK2kpCi0JCVB5X1hERUNSRUYoYXJnc1tpXS5rZWVwKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgKytpKQorICAgICAgICBQeV9YREVDUkVGKGFyZ3NbaV0ua2VlcCk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGludAogX3BhcnNlX3ZvaWRwKFB5T2JqZWN0ICpvYmosIHZvaWQgKiphZGRyZXNzKQogewotCSphZGRyZXNzID0gUHlMb25nX0FzVm9pZFB0cihvYmopOwotCWlmICgqYWRkcmVzcyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICAqYWRkcmVzcyA9IFB5TG9uZ19Bc1ZvaWRQdHIob2JqKTsKKyAgICBpZiAoKmFkZHJlc3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKICNpZmRlZiBNU19XSU4zMgpAQCAtMTIzMSwyMSArMTIzMSwyMSBAQAogZ2l2ZW4sIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBjYWxsIHRvIEdldExhc3RFcnJvcigpIGlzIHVzZWQuXG4iOwogc3RhdGljIFB5T2JqZWN0ICpmb3JtYXRfZXJyb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JVENIQVIgKmxwTXNnQnVmOwotCURXT1JEIGNvZGUgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6Rm9ybWF0RXJyb3IiLCAmY29kZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChjb2RlID09IDApCi0JCWNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKLQlscE1zZ0J1ZiA9IEZvcm1hdEVycm9yKGNvZGUpOwotCWlmIChscE1zZ0J1ZikgewotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKFBZQlVJTERfVFNUUiwgbHBNc2dCdWYpOwotCQlMb2NhbEZyZWUobHBNc2dCdWYpOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoInMiLCAiPG5vIGRlc2NyaXB0aW9uPiIpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgVENIQVIgKmxwTXNnQnVmOworICAgIERXT1JEIGNvZGUgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6Rm9ybWF0RXJyb3IiLCAmY29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjb2RlID09IDApCisgICAgICAgIGNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBscE1zZ0J1ZiA9IEZvcm1hdEVycm9yKGNvZGUpOworICAgIGlmIChscE1zZ0J1ZikgeworICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKFBZQlVJTERfVFNUUiwgbHBNc2dCdWYpOworICAgICAgICBMb2NhbEZyZWUobHBNc2dCdWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoInMiLCAiPG5vIGRlc2NyaXB0aW9uPiIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgY2hhciBsb2FkX2xpYnJhcnlfZG9jW10gPQpAQCAtMTI1Niw0MCArMTI1Niw0MCBAQAogbW9kdWxlLlxuIjsKIHN0YXRpYyBQeU9iamVjdCAqbG9hZF9saWJyYXJ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlUQ0hBUiAqbmFtZTsKLQlQeU9iamVjdCAqbmFtZW9iajsKLQlQeU9iamVjdCAqaWdub3JlZDsKLQlITU9EVUxFIGhNb2Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE86TG9hZExpYnJhcnkiLCAmbmFtZW9iaiwgJmlnbm9yZWQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBUQ0hBUiAqbmFtZTsKKyAgICBQeU9iamVjdCAqbmFtZW9iajsKKyAgICBQeU9iamVjdCAqaWdub3JlZDsKKyAgICBITU9EVUxFIGhNb2Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE86TG9hZExpYnJhcnkiLCAmbmFtZW9iaiwgJmlnbm9yZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBfVU5JQ09ERQotCW5hbWUgPSBhbGxvY2EoKFB5U3RyaW5nX1NpemUobmFtZW9iaikgKyAxKSAqIHNpemVvZihXQ0hBUikpOwotCWlmICghbmFtZSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbmFtZSA9IGFsbG9jYSgoUHlTdHJpbmdfU2l6ZShuYW1lb2JqKSArIDEpICogc2l6ZW9mKFdDSEFSKSk7CisgICAgaWYgKCFuYW1lKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXsKLQkJaW50IHI7Ci0JCWNoYXIgKmFuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZW9iaik7Ci0JCWlmKCFhbmFtZSkKLQkJCXJldHVybiBOVUxMOwotCQlyID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGFuYW1lLCAtMSwgbmFtZSwgUHlTdHJpbmdfU2l6ZShuYW1lb2JqKSArIDEpOwotCQluYW1lW3JdID0gMDsKLQl9CisgICAgeworICAgICAgICBpbnQgcjsKKyAgICAgICAgY2hhciAqYW5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lb2JqKTsKKyAgICAgICAgaWYoIWFuYW1lKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHIgPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYW5hbWUsIC0xLCBuYW1lLCBQeVN0cmluZ19TaXplKG5hbWVvYmopICsgMSk7CisgICAgICAgIG5hbWVbcl0gPSAwOworICAgIH0KICNlbHNlCi0JbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWVvYmopOwotCWlmKCFuYW1lKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZW9iaik7CisgICAgaWYoIW5hbWUpCisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAKLQloTW9kID0gTG9hZExpYnJhcnkobmFtZSk7Ci0JaWYgKCFoTW9kKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIGhNb2QgPSBMb2FkTGlicmFyeShuYW1lKTsKKyAgICBpZiAoIWhNb2QpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CiAjaWZkZWYgX1dJTjY0Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihoTW9kKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKGhNb2QpOwogI2Vsc2UKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGhNb2QpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgaE1vZCk7CiAjZW5kaWYKIH0KIApAQCAtMTI5OSwxMyArMTI5OSwxMyBAQAogRnJlZSB0aGUgaGFuZGxlIG9mIGFuIGV4ZWN1dGFibGUgcHJldmlvdXNseSBsb2FkZWQgYnkgTG9hZExpYnJhcnkuXG4iOwogc3RhdGljIFB5T2JqZWN0ICpmcmVlX2xpYnJhcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmhNb2Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpGcmVlTGlicmFyeSIsICZfcGFyc2Vfdm9pZHAsICZoTW9kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFGcmVlTGlicmFyeSgoSE1PRFVMRSloTW9kKSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgdm9pZCAqaE1vZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOkZyZWVMaWJyYXJ5IiwgJl9wYXJzZV92b2lkcCwgJmhNb2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIUZyZWVMaWJyYXJ5KChITU9EVUxFKWhNb2QpKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogb2Jzb2xldGUsIHNob3VsZCBiZSByZW1vdmVkICovCkBAIC0xMzEzLDU1ICsxMzEzLDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9jb21tZXRob2QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUlVbmtub3duICpwSXVuazsKLQlpbnQgaW5kZXg7Ci0JUHlPYmplY3QgKmFyZ3VtZW50czsKLQlQUFJPQyAqbHBWdGJsOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JQ0RhdGFPYmplY3QgKnBjb207Ci0JUHlPYmplY3QgKmFyZ3R5cGVzID0gTlVMTDsKKyAgICBJVW5rbm93biAqcEl1bms7CisgICAgaW50IGluZGV4OworICAgIFB5T2JqZWN0ICphcmd1bWVudHM7CisgICAgUFBST0MgKmxwVnRibDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIENEYXRhT2JqZWN0ICpwY29tOworICAgIFB5T2JqZWN0ICphcmd0eXBlcyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKLQkJCSAgICAgICJPaU8hfE8hIiwKLQkJCSAgICAgICZwY29tLCAmaW5kZXgsCi0JCQkgICAgICAmUHlUdXBsZV9UeXBlLCAmYXJndW1lbnRzLAotCQkJICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3R5cGVzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJPaU8hfE8hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBjb20sICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3R5cGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoYXJndHlwZXMgJiYgKFB5VHVwbGVfR0VUX1NJWkUoYXJndW1lbnRzKSAhPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3R5cGVzKSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIk1ldGhvZCB0YWtlcyAlZCBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCi0JCQkgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpLCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3VtZW50cykpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGFyZ3R5cGVzICYmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3VtZW50cykgIT0gUHlUdXBsZV9HRVRfU0laRShhcmd0eXBlcykpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTWV0aG9kIHRha2VzICVkIGFyZ3VtZW50cyAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJndHlwZXMpLCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3VtZW50cykpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKHBjb20pIHx8IChwY29tLT5iX3NpemUgIT0gc2l6ZW9mKHZvaWQgKikpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJDT00gUG9pbnRlciBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCSAgICAgUHlfVFlQRShwY29tKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIUNEYXRhT2JqZWN0X0NoZWNrKHBjb20pIHx8IChwY29tLT5iX3NpemUgIT0gc2l6ZW9mKHZvaWQgKikpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiQ09NIFBvaW50ZXIgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHBjb20pLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCgqKHZvaWQgKiopKHBjb20tPmJfcHRyKSkgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiVGhlIENPTSAndGhpcycgcG9pbnRlciBpcyBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKCoodm9pZCAqKikocGNvbS0+Yl9wdHIpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBDT00gJ3RoaXMnIHBvaW50ZXIgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwSXVuayA9IChJVW5rbm93biAqKSgqKHZvaWQgKiopKHBjb20tPmJfcHRyKSk7Ci0JbHBWdGJsID0gKFBQUk9DICopKHBJdW5rLT5scFZ0YmwpOworICAgIHBJdW5rID0gKElVbmtub3duICopKCoodm9pZCAqKikocGNvbS0+Yl9wdHIpKTsKKyAgICBscFZ0YmwgPSAoUFBST0MgKikocEl1bmstPmxwVnRibCk7CiAKLQlyZXN1bHQgPSAgX0NhbGxQcm9jKGxwVnRibFtpbmRleF0sCi0JCQkgICAgYXJndW1lbnRzLAorICAgIHJlc3VsdCA9ICBfQ2FsbFByb2MobHBWdGJsW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cywKICNpZmRlZiBNU19XSU4zMgotCQkJICAgIHBJdW5rLAotCQkJICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBwSXVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAjZW5kaWYKLQkJCSAgICBGVU5DRkxBR19IUkVTVUxULCAvKiBmbGFncyAqLwotCQkJICAgIGFyZ3R5cGVzLCAvKiBzZWxmLT5hcmd0eXBlcyAqLwotCQkJICAgIE5VTEwsIC8qIHNlbGYtPnJlc3R5cGUgKi8KLQkJCSAgICBOVUxMKTsgLyogY2hlY2tlciAqLwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBGVU5DRkxBR19IUkVTVUxULCAvKiBmbGFncyAqLworICAgICAgICAgICAgICAgIGFyZ3R5cGVzLCAvKiBzZWxmLT5hcmd0eXBlcyAqLworICAgICAgICAgICAgICAgIE5VTEwsIC8qIHNlbGYtPnJlc3R5cGUgKi8KKyAgICAgICAgICAgICAgICBOVUxMKTsgLyogY2hlY2tlciAqLworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBjaGFyIGNvcHlfY29tX3BvaW50ZXJfZG9jW10gPQpAQCAtMTM3MCw4OSArMTM3MCw4OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvcHlfY29tX3BvaW50ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpwMSwgKnAyLCAqciA9IE5VTEw7Ci0Jc3RydWN0IGFyZ3VtZW50IGEsIGI7Ci0JSVVua25vd24gKnNyYywgKipwZHN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT086Q29weUNvbVBvaW50ZXIiLCAmcDEsICZwMikpCi0JCXJldHVybiBOVUxMOwotCWEua2VlcCA9IGIua2VlcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnAxLCAqcDIsICpyID0gTlVMTDsKKyAgICBzdHJ1Y3QgYXJndW1lbnQgYSwgYjsKKyAgICBJVW5rbm93biAqc3JjLCAqKnBkc3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTzpDb3B5Q29tUG9pbnRlciIsICZwMSwgJnAyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYS5rZWVwID0gYi5rZWVwID0gTlVMTDsKIAotCWlmICgtMSA9PSBDb252UGFyYW0ocDEsIDAsICZhKSB8fCAtMSA9PSBDb252UGFyYW0ocDIsIDEsICZiKSkKLQkJZ290byBkb25lOwotCXNyYyA9IChJVW5rbm93biAqKWEudmFsdWUucDsKLQlwZHN0ID0gKElVbmtub3duICoqKWIudmFsdWUucDsKKyAgICBpZiAoLTEgPT0gQ29udlBhcmFtKHAxLCAwLCAmYSkgfHwgLTEgPT0gQ29udlBhcmFtKHAyLCAxLCAmYikpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBzcmMgPSAoSVVua25vd24gKilhLnZhbHVlLnA7CisgICAgcGRzdCA9IChJVW5rbm93biAqKiliLnZhbHVlLnA7CiAKLQlpZiAocGRzdCA9PSBOVUxMKQotCQlyID0gUHlJbnRfRnJvbUxvbmcoRV9QT0lOVEVSKTsKLQllbHNlIHsKLQkJaWYgKHNyYykKLQkJCXNyYy0+bHBWdGJsLT5BZGRSZWYoc3JjKTsKLQkJKnBkc3QgPSBzcmM7Ci0JCXIgPSBQeUludF9Gcm9tTG9uZyhTX09LKTsKLQl9CisgICAgaWYgKHBkc3QgPT0gTlVMTCkKKyAgICAgICAgciA9IFB5SW50X0Zyb21Mb25nKEVfUE9JTlRFUik7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzcmMpCisgICAgICAgICAgICBzcmMtPmxwVnRibC0+QWRkUmVmKHNyYyk7CisgICAgICAgICpwZHN0ID0gc3JjOworICAgICAgICByID0gUHlJbnRfRnJvbUxvbmcoU19PSyk7CisgICAgfQogICBkb25lOgotCVB5X1hERUNSRUYoYS5rZWVwKTsKLQlQeV9YREVDUkVGKGIua2VlcCk7Ci0JcmV0dXJuIHI7CisgICAgUHlfWERFQ1JFRihhLmtlZXApOworICAgIFB5X1hERUNSRUYoYi5rZWVwKTsKKyAgICByZXR1cm4gcjsKIH0KICNlbHNlCiAKIHN0YXRpYyBQeU9iamVjdCAqcHlfZGxfb3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQl2b2lkICogaGFuZGxlOwotI2lmZGVmIFJUTERfTE9DQUwJCi0JaW50IG1vZGUgPSBSVExEX05PVyB8IFJUTERfTE9DQUw7CisgICAgY2hhciAqbmFtZTsKKyAgICB2b2lkICogaGFuZGxlOworI2lmZGVmIFJUTERfTE9DQUwKKyAgICBpbnQgbW9kZSA9IFJUTERfTk9XIHwgUlRMRF9MT0NBTDsKICNlbHNlCi0JLyogY3lnd2luIGRvZXNuJ3QgZGVmaW5lIFJUTERfTE9DQUwgKi8KLQlpbnQgbW9kZSA9IFJUTERfTk9XOworICAgIC8qIGN5Z3dpbiBkb2Vzbid0IGRlZmluZSBSVExEX0xPQ0FMICovCisgICAgaW50IG1vZGUgPSBSVExEX05PVzsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxpOmRsb3BlbiIsICZuYW1lLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOwotCW1vZGUgfD0gUlRMRF9OT1c7Ci0JaGFuZGxlID0gY3R5cGVzX2Rsb3BlbihuYW1lLCBtb2RlKTsKLQlpZiAoIWhhbmRsZSkgewotCQljaGFyICplcnJtc2cgPSBjdHlwZXNfZGxlcnJvcigpOwotCQlpZiAoIWVycm1zZykKLQkJCWVycm1zZyA9ICJkbG9wZW4oKSBlcnJvciI7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PU0Vycm9yLAotCQkJCSAgICAgICBlcnJtc2cpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihoYW5kbGUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxpOmRsb3BlbiIsICZuYW1lLCAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1vZGUgfD0gUlRMRF9OT1c7CisgICAgaGFuZGxlID0gY3R5cGVzX2Rsb3BlbihuYW1lLCBtb2RlKTsKKyAgICBpZiAoIWhhbmRsZSkgeworICAgICAgICBjaGFyICplcnJtc2cgPSBjdHlwZXNfZGxlcnJvcigpOworICAgICAgICBpZiAoIWVycm1zZykKKyAgICAgICAgICAgIGVycm1zZyA9ICJkbG9wZW4oKSBlcnJvciI7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKGhhbmRsZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqcHlfZGxfY2xvc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmhhbmRsZTsKKyAgICB2b2lkICpoYW5kbGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOmRsY2xvc2UiLCAmX3BhcnNlX3ZvaWRwLCAmaGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGRsY2xvc2UoaGFuZGxlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT1NFcnJvciwKLQkJCQkgICAgICAgY3R5cGVzX2RsZXJyb3IoKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpkbGNsb3NlIiwgJl9wYXJzZV92b2lkcCwgJmhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChkbGNsb3NlKGhhbmRsZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVzX2RsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqcHlfZGxfc3ltKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCXZvaWQgKmhhbmRsZTsKLQl2b2lkICpwdHI7CisgICAgY2hhciAqbmFtZTsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgdm9pZCAqcHRyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnM6ZGxzeW0iLAotCQkJICAgICAgJl9wYXJzZV92b2lkcCwgJmhhbmRsZSwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlwdHIgPSBjdHlwZXNfZGxzeW0oKHZvaWQqKWhhbmRsZSwgbmFtZSk7Ci0JaWYgKCFwdHIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCi0JCQkJICAgICAgIGN0eXBlc19kbGVycm9yKCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihwdHIpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZzOmRsc3ltIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJl9wYXJzZV92b2lkcCwgJmhhbmRsZSwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSBjdHlwZXNfZGxzeW0oKHZvaWQqKWhhbmRsZSwgbmFtZSk7CisgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVzX2RsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHB0cik7CiB9CiAjZW5kaWYKIApAQCAtMTQ2NCwyNyArMTQ2NCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZnVuY3Rpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmZ1bmM7Ci0JUHlPYmplY3QgKmFyZ3VtZW50czsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIHZvaWQgKmZ1bmM7CisgICAgUHlPYmplY3QgKmFyZ3VtZW50czsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkgICAgICAiTyZPISIsCi0JCQkgICAgICAmX3BhcnNlX3ZvaWRwLCAmZnVuYywKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZhcmd1bWVudHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk8mTyEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmX3BhcnNlX3ZvaWRwLCAmZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3VtZW50cykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gIF9DYWxsUHJvYygoUFBST0MpZnVuYywKLQkJCSAgICBhcmd1bWVudHMsCisgICAgcmVzdWx0ID0gIF9DYWxsUHJvYygoUFBST0MpZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cywKICNpZmRlZiBNU19XSU4zMgotCQkJICAgIE5VTEwsCi0JCQkgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogI2VuZGlmCi0JCQkgICAgMCwgLyogZmxhZ3MgKi8KLQkJCSAgICBOVUxMLCAvKiBzZWxmLT5hcmd0eXBlcyAqLwotCQkJICAgIE5VTEwsIC8qIHNlbGYtPnJlc3R5cGUgKi8KLQkJCSAgICBOVUxMKTsgLyogY2hlY2tlciAqLwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBmbGFncyAqLworICAgICAgICAgICAgICAgIE5VTEwsIC8qIHNlbGYtPmFyZ3R5cGVzICovCisgICAgICAgICAgICAgICAgTlVMTCwgLyogc2VsZi0+cmVzdHlwZSAqLworICAgICAgICAgICAgICAgIE5VTEwpOyAvKiBjaGVja2VyICovCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTE0OTUsMjcgKzE0OTUsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2NkZWNsZnVuY3Rpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKmZ1bmM7Ci0JUHlPYmplY3QgKmFyZ3VtZW50czsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIHZvaWQgKmZ1bmM7CisgICAgUHlPYmplY3QgKmFyZ3VtZW50czsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkgICAgICAiTyZPISIsCi0JCQkgICAgICAmX3BhcnNlX3ZvaWRwLCAmZnVuYywKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZhcmd1bWVudHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk8mTyEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmX3BhcnNlX3ZvaWRwLCAmZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmFyZ3VtZW50cykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gIF9DYWxsUHJvYygoUFBST0MpZnVuYywKLQkJCSAgICBhcmd1bWVudHMsCisgICAgcmVzdWx0ID0gIF9DYWxsUHJvYygoUFBST0MpZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cywKICNpZmRlZiBNU19XSU4zMgotCQkJICAgIE5VTEwsCi0JCQkgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogI2VuZGlmCi0JCQkgICAgRlVOQ0ZMQUdfQ0RFQ0wsIC8qIGZsYWdzICovCi0JCQkgICAgTlVMTCwgLyogc2VsZi0+YXJndHlwZXMgKi8KLQkJCSAgICBOVUxMLCAvKiBzZWxmLT5yZXN0eXBlICovCi0JCQkgICAgTlVMTCk7IC8qIGNoZWNrZXIgKi8KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgRlVOQ0ZMQUdfQ0RFQ0wsIC8qIGZsYWdzICovCisgICAgICAgICAgICAgICAgTlVMTCwgLyogc2VsZi0+YXJndHlwZXMgKi8KKyAgICAgICAgICAgICAgICBOVUxMLCAvKiBzZWxmLT5yZXN0eXBlICovCisgICAgICAgICAgICAgICAgTlVMTCk7IC8qIGNoZWNrZXIgKi8KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1MjksMTcgKzE1MjksMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzaXplb2ZfZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKLQlpZiAoZGljdCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGRpY3QtPnNpemUpOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdChvYmopOworICAgIGlmIChkaWN0KQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoZGljdC0+c2l6ZSk7CiAKLQlpZiAoQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkKLQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KCgoQ0RhdGFPYmplY3QgKilvYmopLT5iX3NpemUpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkidGhpcyB0eXBlIGhhcyBubyBzaXplIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKENEYXRhT2JqZWN0X0NoZWNrKG9iaikpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoKENEYXRhT2JqZWN0ICopb2JqKS0+Yl9zaXplKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAidGhpcyB0eXBlIGhhcyBubyBzaXplIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBjaGFyIGFsaWdubWVudF9kb2NbXSA9CkBAIC0xNTUwLDE5ICsxNTUwLDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxpZ25fZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CiAKLQlkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKLQlpZiAoZGljdCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGRpY3QtPmFsaWduKTsKKyAgICBkaWN0ID0gUHlUeXBlX3N0Z2RpY3Qob2JqKTsKKyAgICBpZiAoZGljdCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGRpY3QtPmFsaWduKTsKIAotCWRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KG9iaik7Ci0JaWYgKGRpY3QpCi0JCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChkaWN0LT5hbGlnbik7CisgICAgZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3Qob2JqKTsKKyAgICBpZiAoZGljdCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGRpY3QtPmFsaWduKTsKIAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkibm8gYWxpZ25tZW50IGluZm8iKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAibm8gYWxpZ25tZW50IGluZm8iKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGNoYXIgYnlyZWZfZG9jW10gPQpAQCAtMTU3NywzNiArMTU3NywzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5cmVmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeUNBcmdPYmplY3QgKnBhcmc7Ci0JUHlPYmplY3QgKm9iajsKLQlQeU9iamVjdCAqcHlvZmZzZXQgPSBOVUxMOwotCVB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICBQeUNBcmdPYmplY3QgKnBhcmc7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBQeU9iamVjdCAqcHlvZmZzZXQgPSBOVUxMOworICAgIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImJ5cmVmIiwgMSwgMiwKLQkJCSAgICAgICAmb2JqLCAmcHlvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocHlvZmZzZXQpIHsKLQkJb2Zmc2V0ID0gUHlOdW1iZXJfQXNTc2l6ZV90KHB5b2Zmc2V0LCBOVUxMKTsKLQkJaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiYnlyZWYoKSBhcmd1bWVudCBtdXN0IGJlIGEgY3R5cGVzIGluc3RhbmNlLCBub3QgJyVzJyIsCi0JCQkgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJieXJlZiIsIDEsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqLCAmcHlvZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocHlvZmZzZXQpIHsKKyAgICAgICAgb2Zmc2V0ID0gUHlOdW1iZXJfQXNTc2l6ZV90KHB5b2Zmc2V0LCBOVUxMKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghQ0RhdGFPYmplY3RfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImJ5cmVmKCkgYXJndW1lbnQgbXVzdCBiZSBhIGN0eXBlcyBpbnN0YW5jZSwgbm90ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7Ci0JaWYgKHBhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcGFyZyA9IG5ld19DQXJnT2JqZWN0KCk7CisgICAgaWYgKHBhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlwYXJnLT50YWcgPSAnUCc7Ci0JcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7Ci0JUHlfSU5DUkVGKG9iaik7Ci0JcGFyZy0+b2JqID0gb2JqOwotCXBhcmctPnZhbHVlLnAgPSAoY2hhciAqKSgoQ0RhdGFPYmplY3QgKilvYmopLT5iX3B0ciArIG9mZnNldDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKKyAgICBwYXJnLT50YWcgPSAnUCc7CisgICAgcGFyZy0+cGZmaV90eXBlID0gJmZmaV90eXBlX3BvaW50ZXI7CisgICAgUHlfSU5DUkVGKG9iaik7CisgICAgcGFyZy0+b2JqID0gb2JqOworICAgIHBhcmctPnZhbHVlLnAgPSAoY2hhciAqKSgoQ0RhdGFPYmplY3QgKilvYmopLT5iX3B0ciArIG9mZnNldDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKIH0KIAogc3RhdGljIGNoYXIgYWRkcmVzc29mX2RvY1tdID0KQEAgLTE2MTYsNDQgKzE2MTYsNDQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhZGRyZXNzb2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmopCiB7Ci0JaWYgKENEYXRhT2JqZWN0X0NoZWNrKG9iaikpCi0JCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoKChDRGF0YU9iamVjdCAqKW9iaiktPmJfcHRyKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImludmFsaWQgdHlwZSIpOwotCXJldHVybiBOVUxMOworICAgIGlmIChDRGF0YU9iamVjdF9DaGVjayhvYmopKQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKCgoQ0RhdGFPYmplY3QgKilvYmopLT5iX3B0cik7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdHlwZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBjb252ZXJ0ZXIoUHlPYmplY3QgKm9iaiwgdm9pZCAqKmFkZHJlc3MpCiB7Ci0JKmFkZHJlc3MgPSBQeUxvbmdfQXNWb2lkUHRyKG9iaik7Ci0JcmV0dXJuICphZGRyZXNzICE9IE5VTEw7CisgICAgKmFkZHJlc3MgPSBQeUxvbmdfQXNWb2lkUHRyKG9iaik7CisgICAgcmV0dXJuICphZGRyZXNzICE9IE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBNeV9QeU9ial9Gcm9tUHRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb2I7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpQeU9ial9Gcm9tUHRyIiwgY29udmVydGVyLCAmb2IpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYob2IpOwotCXJldHVybiBvYjsKKyAgICBQeU9iamVjdCAqb2I7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjpQeU9ial9Gcm9tUHRyIiwgY29udmVydGVyLCAmb2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYob2IpOworICAgIHJldHVybiBvYjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIE15X1B5X0lOQ1JFRihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlQeV9JTkNSRUYoYXJnKTsgLyogdGhhdCdzIHdoYXQgdGhpcyBmdW5jdGlvbiBpcyBmb3IgKi8KLQlQeV9JTkNSRUYoYXJnKTsgLyogdGhhdCBmb3IgcmV0dXJuaW5nIGl0ICovCi0JcmV0dXJuIGFyZzsKKyAgICBQeV9JTkNSRUYoYXJnKTsgLyogdGhhdCdzIHdoYXQgdGhpcyBmdW5jdGlvbiBpcyBmb3IgKi8KKyAgICBQeV9JTkNSRUYoYXJnKTsgLyogdGhhdCBmb3IgcmV0dXJuaW5nIGl0ICovCisgICAgcmV0dXJuIGFyZzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIE15X1B5X0RFQ1JFRihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlQeV9ERUNSRUYoYXJnKTsgLyogdGhhdCdzIHdoYXQgdGhpcyBmdW5jdGlvbiBpcyBmb3IgKi8KLQlQeV9JTkNSRUYoYXJnKTsgLyogdGhhdCdzIGZvciByZXR1cm5pbmcgaXQgKi8KLQlyZXR1cm4gYXJnOworICAgIFB5X0RFQ1JFRihhcmcpOyAvKiB0aGF0J3Mgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGZvciAqLworICAgIFB5X0lOQ1JFRihhcmcpOyAvKiB0aGF0J3MgZm9yIHJldHVybmluZyBpdCAqLworICAgIHJldHVybiBhcmc7CiB9CiAKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQpAQCAtMTY2NywyNDIgKzE2NjcsMjQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvbnZlcnNpb25fbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqY29kaW5nLCAqbW9kZTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKmNvZGluZywgKm1vZGU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienM6c2V0X2NvbnZlcnNpb25fbW9kZSIsICZjb2RpbmcsICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiKHp6KSIsIGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7Ci0JaWYgKGNvZGluZykgewotCQlQeU1lbV9GcmVlKGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZyk7Ci0JCWNvbnZlcnNpb25fbW9kZV9lbmNvZGluZyA9IFB5TWVtX01hbGxvYyhzdHJsZW4oY29kaW5nKSArIDEpOwotCQlzdHJjcHkoY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLCBjb2RpbmcpOwotCX0gZWxzZSB7Ci0JCWNvbnZlcnNpb25fbW9kZV9lbmNvZGluZyA9IE5VTEw7Ci0JfQotCVB5TWVtX0ZyZWUoY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7Ci0JY29udmVyc2lvbl9tb2RlX2Vycm9ycyA9IFB5TWVtX01hbGxvYyhzdHJsZW4obW9kZSkgKyAxKTsKLQlzdHJjcHkoY29udmVyc2lvbl9tb2RlX2Vycm9ycywgbW9kZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInpzOnNldF9jb252ZXJzaW9uX21vZGUiLCAmY29kaW5nLCAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIih6eikiLCBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcsIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOworICAgIGlmIChjb2RpbmcpIHsKKyAgICAgICAgUHlNZW1fRnJlZShjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcpOworICAgICAgICBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcgPSBQeU1lbV9NYWxsb2Moc3RybGVuKGNvZGluZykgKyAxKTsKKyAgICAgICAgc3RyY3B5KGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywgY29kaW5nKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcgPSBOVUxMOworICAgIH0KKyAgICBQeU1lbV9GcmVlKGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOworICAgIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMgPSBQeU1lbV9NYWxsb2Moc3RybGVuKG1vZGUpICsgMSk7CisgICAgc3RyY3B5KGNvbnZlcnNpb25fbW9kZV9lcnJvcnMsIG1vZGUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQ0RhdGFPYmplY3QgKm9iajsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0OwotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBDRGF0YU9iamVjdCAqb2JqOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3Q7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSAgICAgICJPaTpyZXNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT2k6cmVzaXplIiwKICNlbHNlCi0JCQkgICAgICAiT246cmVzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk9uOnJlc2l6ZSIsCiAjZW5kaWYKLQkJCSAgICAgICZvYmosICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmosICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilvYmopOwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZXhjZXB0ZWQgY3R5cGVzIGluc3RhbmNlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc2l6ZSA8IGRpY3QtPnNpemUpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopb2JqKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0ZWQgY3R5cGVzIGluc3RhbmNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2l6ZSA8IGRpY3QtPnNpemUpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwCi0JCQkgICAgICJtaW5pbXVtIHNpemUgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIm1pbmltdW0gc2l6ZSBpcyAlZCIsCiAjZWxzZQotCQkJICAgICAibWluaW11bSBzaXplIGlzICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICAibWluaW11bSBzaXplIGlzICV6ZCIsCiAjZW5kaWYKLQkJCSAgICAgZGljdC0+c2l6ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAob2JqLT5iX25lZWRzZnJlZSA9PSAwKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiTWVtb3J5IGNhbm5vdCBiZSByZXNpemVkIGJlY2F1c2UgdGhpcyBvYmplY3QgZG9lc24ndCBvd24gaXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7Ci0JCS8qIGludGVybmFsIGRlZmF1bHQgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCAqLwotCQlvYmotPmJfc2l6ZSA9IHNpemU7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKG9iai0+Yl9zaXplIDw9IHNpemVvZihvYmotPmJfdmFsdWUpKSB7Ci0JCS8qIFdlIGFyZSBjdXJyZW50bHkgdXNpbmcgdGhlIG9iamVjdHMgZGVmYXVsdCBidWZmZXIsIGJ1dCBpdAotCQkgICBpc24ndCBsYXJnZSBlbm91Z2ggYW55IG1vcmUuICovCi0JCXZvaWQgKnB0ciA9IFB5TWVtX01hbGxvYyhzaXplKTsKLQkJaWYgKHB0ciA9PSBOVUxMKQotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCW1lbXNldChwdHIsIDAsIHNpemUpOwotCQltZW1tb3ZlKHB0ciwgb2JqLT5iX3B0ciwgb2JqLT5iX3NpemUpOwotCQlvYmotPmJfcHRyID0gcHRyOwotCQlvYmotPmJfc2l6ZSA9IHNpemU7Ci0JfSBlbHNlIHsKLQkJdm9pZCAqIHB0ciA9IFB5TWVtX1JlYWxsb2Mob2JqLT5iX3B0ciwgc2l6ZSk7Ci0JCWlmIChwdHIgPT0gTlVMTCkKLQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQlvYmotPmJfcHRyID0gcHRyOwotCQlvYmotPmJfc2l6ZSA9IHNpemU7Ci0JfQorICAgICAgICAgICAgICAgICAgICAgZGljdC0+c2l6ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAob2JqLT5iX25lZWRzZnJlZSA9PSAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIk1lbW9yeSBjYW5ub3QgYmUgcmVzaXplZCBiZWNhdXNlIHRoaXMgb2JqZWN0IGRvZXNuJ3Qgb3duIGl0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2l6ZSA8PSBzaXplb2Yob2JqLT5iX3ZhbHVlKSkgeworICAgICAgICAvKiBpbnRlcm5hbCBkZWZhdWx0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggKi8KKyAgICAgICAgb2JqLT5iX3NpemUgPSBzaXplOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIGlmIChvYmotPmJfc2l6ZSA8PSBzaXplb2Yob2JqLT5iX3ZhbHVlKSkgeworICAgICAgICAvKiBXZSBhcmUgY3VycmVudGx5IHVzaW5nIHRoZSBvYmplY3RzIGRlZmF1bHQgYnVmZmVyLCBidXQgaXQKKyAgICAgICAgICAgaXNuJ3QgbGFyZ2UgZW5vdWdoIGFueSBtb3JlLiAqLworICAgICAgICB2b2lkICpwdHIgPSBQeU1lbV9NYWxsb2Moc2l6ZSk7CisgICAgICAgIGlmIChwdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBtZW1zZXQocHRyLCAwLCBzaXplKTsKKyAgICAgICAgbWVtbW92ZShwdHIsIG9iai0+Yl9wdHIsIG9iai0+Yl9zaXplKTsKKyAgICAgICAgb2JqLT5iX3B0ciA9IHB0cjsKKyAgICAgICAgb2JqLT5iX3NpemUgPSBzaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHZvaWQgKiBwdHIgPSBQeU1lbV9SZWFsbG9jKG9iai0+Yl9wdHIsIHNpemUpOworICAgICAgICBpZiAocHRyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgb2JqLT5iX3B0ciA9IHB0cjsKKyAgICAgICAgb2JqLT5iX3NpemUgPSBzaXplOworICAgIH0KICAgZG9uZToKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdW5waWNrbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0eXA7Ci0JUHlPYmplY3QgKnN0YXRlOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKnRtcDsKKyAgICBQeU9iamVjdCAqdHlwOworICAgIFB5T2JqZWN0ICpzdGF0ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJnR5cCwgJnN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0eXAsICJfX25ld19fIiwgIk8iLCB0eXApOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdG1wID0gUHlPYmplY3RfQ2FsbE1ldGhvZChyZXN1bHQsICJfX3NldHN0YXRlX18iLCAiTyIsIHN0YXRlKTsKLQlpZiAodG1wID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmdHlwLCAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR5cCwgIl9fbmV3X18iLCAiTyIsIHR5cCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0bXAgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHJlc3VsdCwgIl9fc2V0c3RhdGVfXyIsICJPIiwgc3RhdGUpOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQT0lOVEVSKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY2xzKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlUeXBlT2JqZWN0ICp0eXA7Ci0JUHlPYmplY3QgKmtleTsKLQljaGFyICpidWY7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeVR5cGVPYmplY3QgKnR5cDsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIGNoYXIgKmJ1ZjsKIAotCXJlc3VsdCA9IFB5RGljdF9HZXRJdGVtKF9wb2ludGVyX3R5cGVfY2FjaGUsIGNscyk7Ci0JaWYgKHJlc3VsdCkgewotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QoY2xzKSkgewotCQlidWYgPSBhbGxvY2Eoc3RybGVuKFB5U3RyaW5nX0FTX1NUUklORyhjbHMpKSArIDMgKyAxKTsKLQkJc3ByaW50ZihidWYsICJMUF8lcyIsIFB5U3RyaW5nX0FTX1NUUklORyhjbHMpKTsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKVB5X1RZUEUoJlBvaW50ZXJfVHlwZSksCi0JCQkJCSAgICAgICAicyhPKXt9IiwKLQkJCQkJICAgICAgIGJ1ZiwKLQkJCQkJICAgICAgICZQb2ludGVyX1R5cGUpOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlrZXkgPSBQeUxvbmdfRnJvbVZvaWRQdHIocmVzdWx0KTsKLQl9IGVsc2UgaWYgKFB5VHlwZV9DaGVjayhjbHMpKSB7Ci0JCXR5cCA9IChQeVR5cGVPYmplY3QgKiljbHM7Ci0JCWJ1ZiA9IGFsbG9jYShzdHJsZW4odHlwLT50cF9uYW1lKSArIDMgKyAxKTsKLQkJc3ByaW50ZihidWYsICJMUF8lcyIsIHR5cC0+dHBfbmFtZSk7Ci0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKilQeV9UWVBFKCZQb2ludGVyX1R5cGUpLAotCQkJCQkgICAgICAgInMoTyl7c099IiwKLQkJCQkJICAgICAgIGJ1ZiwKLQkJCQkJICAgICAgICZQb2ludGVyX1R5cGUsCi0JCQkJCSAgICAgICAiX3R5cGVfIiwgY2xzKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfSU5DUkVGKGNscyk7Ci0JCWtleSA9IGNsczsKLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibXVzdCBiZSBhIGN0eXBlcyB0eXBlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoLTEgPT0gUHlEaWN0X1NldEl0ZW0oX3BvaW50ZXJfdHlwZV9jYWNoZSwga2V5LCByZXN1bHQpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9ERUNSRUYoa2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihrZXkpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW0oX3BvaW50ZXJfdHlwZV9jYWNoZSwgY2xzKTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChjbHMpKSB7CisgICAgICAgIGJ1ZiA9IGFsbG9jYShzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKGNscykpICsgMyArIDEpOworICAgICAgICBzcHJpbnRmKGJ1ZiwgIkxQXyVzIiwgUHlTdHJpbmdfQVNfU1RSSU5HKGNscykpOworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopUHlfVFlQRSgmUG9pbnRlcl9UeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzKE8pe30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBvaW50ZXJfVHlwZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIGtleSA9IFB5TG9uZ19Gcm9tVm9pZFB0cihyZXN1bHQpOworICAgIH0gZWxzZSBpZiAoUHlUeXBlX0NoZWNrKGNscykpIHsKKyAgICAgICAgdHlwID0gKFB5VHlwZU9iamVjdCAqKWNsczsKKyAgICAgICAgYnVmID0gYWxsb2NhKHN0cmxlbih0eXAtPnRwX25hbWUpICsgMyArIDEpOworICAgICAgICBzcHJpbnRmKGJ1ZiwgIkxQXyVzIiwgdHlwLT50cF9uYW1lKTsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKVB5X1RZUEUoJlBvaW50ZXJfVHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicyhPKXtzT30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBvaW50ZXJfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfdHlwZV8iLCBjbHMpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBQeV9JTkNSRUYoY2xzKTsKKyAgICAgICAga2V5ID0gY2xzOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtdXN0IGJlIGEgY3R5cGVzIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgtMSA9PSBQeURpY3RfU2V0SXRlbShfcG9pbnRlcl90eXBlX2NhY2hlLCBrZXksIHJlc3VsdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHBvaW50ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqdHlwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnR5cDsKIAotCXR5cCA9IFB5RGljdF9HZXRJdGVtKF9wb2ludGVyX3R5cGVfY2FjaGUsIChQeU9iamVjdCAqKVB5X1RZUEUoYXJnKSk7Ci0JaWYgKHR5cCkKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3ModHlwLCBhcmcsIE5VTEwpOwotCXR5cCA9IFBPSU5URVIoTlVMTCwgKFB5T2JqZWN0ICopUHlfVFlQRShhcmcpKTsKLQlpZiAodHlwID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHR5cCwgYXJnLCBOVUxMKTsKLQlQeV9ERUNSRUYodHlwKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHR5cCA9IFB5RGljdF9HZXRJdGVtKF9wb2ludGVyX3R5cGVfY2FjaGUsIChQeU9iamVjdCAqKVB5X1RZUEUoYXJnKSk7CisgICAgaWYgKHR5cCkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3ModHlwLCBhcmcsIE5VTEwpOworICAgIHR5cCA9IFBPSU5URVIoTlVMTCwgKFB5T2JqZWN0ICopUHlfVFlQRShhcmcpKTsKKyAgICBpZiAodHlwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3ModHlwLCBhcmcsIE5VTEwpOworICAgIFB5X0RFQ1JFRih0eXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfaW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlTdGdEaWN0T2JqZWN0ICpkaWN0ID0gUHlUeXBlX3N0Z2RpY3QoYXJnKTsKLQlQeU9iamVjdCAqc2hhcGU7Ci0JUHlfc3NpemVfdCBpOworICAgIFN0Z0RpY3RPYmplY3QgKmRpY3QgPSBQeVR5cGVfc3RnZGljdChhcmcpOworICAgIFB5T2JqZWN0ICpzaGFwZTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlkaWN0ID0gUHlPYmplY3Rfc3RnZGljdChhcmcpOwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibm90IGEgY3R5cGVzIHR5cGUgb3Igb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzaGFwZSA9IFB5VHVwbGVfTmV3KGRpY3QtPm5kaW0pOwotCWlmIChzaGFwZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgKGludClkaWN0LT5uZGltOyArK2kpCi0JCVB5VHVwbGVfU0VUX0lURU0oc2hhcGUsIGksIFB5TG9uZ19Gcm9tU3NpemVfdChkaWN0LT5zaGFwZVtpXSkpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIGRpY3QgPSBQeU9iamVjdF9zdGdkaWN0KGFyZyk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhIGN0eXBlcyB0eXBlIG9yIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2hhcGUgPSBQeVR1cGxlX05ldyhkaWN0LT5uZGltKTsKKyAgICBpZiAoc2hhcGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IChpbnQpZGljdC0+bmRpbTsgKytpKQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHNoYXBlLCBpLCBQeUxvbmdfRnJvbVNzaXplX3QoZGljdC0+c2hhcGVbaV0pKTsKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X0RFQ1JFRihzaGFwZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgic2lOIiwgZGljdC0+Zm9ybWF0LCBkaWN0LT5uZGltLCBzaGFwZSk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHNoYXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJzaU4iLCBkaWN0LT5mb3JtYXQsIGRpY3QtPm5kaW0sIHNoYXBlKTsKIH0KIAogUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKLQl7ImdldF9lcnJubyIsIGdldF9lcnJubywgTUVUSF9OT0FSR1N9LAotCXsic2V0X2Vycm5vIiwgc2V0X2Vycm5vLCBNRVRIX1ZBUkFSR1N9LAotCXsiUE9JTlRFUiIsIFBPSU5URVIsIE1FVEhfTyB9LAotCXsicG9pbnRlciIsIHBvaW50ZXIsIE1FVEhfTyB9LAotCXsiX3VucGlja2xlIiwgdW5waWNrbGUsIE1FVEhfVkFSQVJHUyB9LAotCXsiX2J1ZmZlcl9pbmZvIiwgYnVmZmVyX2luZm8sIE1FVEhfTywKLQkgIlJldHVybiBidWZmZXIgaW50ZXJmYWNlIGluZm9ybWF0aW9uIChmb3IgdGVzdGluZyBvbmx5KSJ9LAotCXsicmVzaXplIiwgcmVzaXplLCBNRVRIX1ZBUkFSR1MsICJSZXNpemUgdGhlIG1lbW9yeSBidWZmZXIgb2YgYSBjdHlwZXMgaW5zdGFuY2UifSwKKyAgICB7ImdldF9lcnJubyIsIGdldF9lcnJubywgTUVUSF9OT0FSR1N9LAorICAgIHsic2V0X2Vycm5vIiwgc2V0X2Vycm5vLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiUE9JTlRFUiIsIFBPSU5URVIsIE1FVEhfTyB9LAorICAgIHsicG9pbnRlciIsIHBvaW50ZXIsIE1FVEhfTyB9LAorICAgIHsiX3VucGlja2xlIiwgdW5waWNrbGUsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsiX2J1ZmZlcl9pbmZvIiwgYnVmZmVyX2luZm8sIE1FVEhfTywKKyAgICAgIlJldHVybiBidWZmZXIgaW50ZXJmYWNlIGluZm9ybWF0aW9uIChmb3IgdGVzdGluZyBvbmx5KSJ9LAorICAgIHsicmVzaXplIiwgcmVzaXplLCBNRVRIX1ZBUkFSR1MsICJSZXNpemUgdGhlIG1lbW9yeSBidWZmZXIgb2YgYSBjdHlwZXMgaW5zdGFuY2UifSwKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCXsic2V0X2NvbnZlcnNpb25fbW9kZSIsIHNldF9jb252ZXJzaW9uX21vZGUsIE1FVEhfVkFSQVJHUywgc2V0X2NvbnZlcnNpb25fbW9kZV9kb2N9LAorICAgIHsic2V0X2NvbnZlcnNpb25fbW9kZSIsIHNldF9jb252ZXJzaW9uX21vZGUsIE1FVEhfVkFSQVJHUywgc2V0X2NvbnZlcnNpb25fbW9kZV9kb2N9LAogI2VuZGlmCiAjaWZkZWYgTVNfV0lOMzIKLQl7ImdldF9sYXN0X2Vycm9yIiwgZ2V0X2xhc3RfZXJyb3IsIE1FVEhfTk9BUkdTfSwKLQl7InNldF9sYXN0X2Vycm9yIiwgc2V0X2xhc3RfZXJyb3IsIE1FVEhfVkFSQVJHU30sCi0JeyJDb3B5Q29tUG9pbnRlciIsIGNvcHlfY29tX3BvaW50ZXIsIE1FVEhfVkFSQVJHUywgY29weV9jb21fcG9pbnRlcl9kb2N9LAotCXsiRm9ybWF0RXJyb3IiLCBmb3JtYXRfZXJyb3IsIE1FVEhfVkFSQVJHUywgZm9ybWF0X2Vycm9yX2RvY30sCi0JeyJMb2FkTGlicmFyeSIsIGxvYWRfbGlicmFyeSwgTUVUSF9WQVJBUkdTLCBsb2FkX2xpYnJhcnlfZG9jfSwKLQl7IkZyZWVMaWJyYXJ5IiwgZnJlZV9saWJyYXJ5LCBNRVRIX1ZBUkFSR1MsIGZyZWVfbGlicmFyeV9kb2N9LAotCXsiY2FsbF9jb21tZXRob2QiLCBjYWxsX2NvbW1ldGhvZCwgTUVUSF9WQVJBUkdTIH0sCi0JeyJfY2hlY2tfSFJFU1VMVCIsIGNoZWNrX2hyZXN1bHQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRfbGFzdF9lcnJvciIsIGdldF9sYXN0X2Vycm9yLCBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfbGFzdF9lcnJvciIsIHNldF9sYXN0X2Vycm9yLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiQ29weUNvbVBvaW50ZXIiLCBjb3B5X2NvbV9wb2ludGVyLCBNRVRIX1ZBUkFSR1MsIGNvcHlfY29tX3BvaW50ZXJfZG9jfSwKKyAgICB7IkZvcm1hdEVycm9yIiwgZm9ybWF0X2Vycm9yLCBNRVRIX1ZBUkFSR1MsIGZvcm1hdF9lcnJvcl9kb2N9LAorICAgIHsiTG9hZExpYnJhcnkiLCBsb2FkX2xpYnJhcnksIE1FVEhfVkFSQVJHUywgbG9hZF9saWJyYXJ5X2RvY30sCisgICAgeyJGcmVlTGlicmFyeSIsIGZyZWVfbGlicmFyeSwgTUVUSF9WQVJBUkdTLCBmcmVlX2xpYnJhcnlfZG9jfSwKKyAgICB7ImNhbGxfY29tbWV0aG9kIiwgY2FsbF9jb21tZXRob2QsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsiX2NoZWNrX0hSRVNVTFQiLCBjaGVja19ocmVzdWx0LCBNRVRIX1ZBUkFSR1N9LAogI2Vsc2UKLQl7ImRsb3BlbiIsIHB5X2RsX29wZW4sIE1FVEhfVkFSQVJHUywKLQkgImRsb3BlbihuYW1lLCBmbGFnPXtSVExEX0dMT0JBTHxSVExEX0xPQ0FMfSkgb3BlbiBhIHNoYXJlZCBsaWJyYXJ5In0sCi0JeyJkbGNsb3NlIiwgcHlfZGxfY2xvc2UsIE1FVEhfVkFSQVJHUywgImRsY2xvc2UgYSBsaWJyYXJ5In0sCi0JeyJkbHN5bSIsIHB5X2RsX3N5bSwgTUVUSF9WQVJBUkdTLCAiZmluZCBzeW1ib2wgaW4gc2hhcmVkIGxpYnJhcnkifSwKKyAgICB7ImRsb3BlbiIsIHB5X2RsX29wZW4sIE1FVEhfVkFSQVJHUywKKyAgICAgImRsb3BlbihuYW1lLCBmbGFnPXtSVExEX0dMT0JBTHxSVExEX0xPQ0FMfSkgb3BlbiBhIHNoYXJlZCBsaWJyYXJ5In0sCisgICAgeyJkbGNsb3NlIiwgcHlfZGxfY2xvc2UsIE1FVEhfVkFSQVJHUywgImRsY2xvc2UgYSBsaWJyYXJ5In0sCisgICAgeyJkbHN5bSIsIHB5X2RsX3N5bSwgTUVUSF9WQVJBUkdTLCAiZmluZCBzeW1ib2wgaW4gc2hhcmVkIGxpYnJhcnkifSwKICNlbmRpZgotCXsiYWxpZ25tZW50IiwgYWxpZ25fZnVuYywgTUVUSF9PLCBhbGlnbm1lbnRfZG9jfSwKLQl7InNpemVvZiIsIHNpemVvZl9mdW5jLCBNRVRIX08sIHNpemVvZl9kb2N9LAotCXsiYnlyZWYiLCBieXJlZiwgTUVUSF9WQVJBUkdTLCBieXJlZl9kb2N9LAotCXsiYWRkcmVzc29mIiwgYWRkcmVzc29mLCBNRVRIX08sIGFkZHJlc3NvZl9kb2N9LAotCXsiY2FsbF9mdW5jdGlvbiIsIGNhbGxfZnVuY3Rpb24sIE1FVEhfVkFSQVJHUyB9LAotCXsiY2FsbF9jZGVjbGZ1bmN0aW9uIiwgY2FsbF9jZGVjbGZ1bmN0aW9uLCBNRVRIX1ZBUkFSR1MgfSwKLQl7IlB5T2JqX0Zyb21QdHIiLCBNeV9QeU9ial9Gcm9tUHRyLCBNRVRIX1ZBUkFSR1MgfSwKLQl7IlB5X0lOQ1JFRiIsIE15X1B5X0lOQ1JFRiwgTUVUSF9PIH0sCi0JeyJQeV9ERUNSRUYiLCBNeV9QeV9ERUNSRUYsIE1FVEhfTyB9LAotCXtOVUxMLCAgICAgIE5VTEx9ICAgICAgICAvKiBTZW50aW5lbCAqLworICAgIHsiYWxpZ25tZW50IiwgYWxpZ25fZnVuYywgTUVUSF9PLCBhbGlnbm1lbnRfZG9jfSwKKyAgICB7InNpemVvZiIsIHNpemVvZl9mdW5jLCBNRVRIX08sIHNpemVvZl9kb2N9LAorICAgIHsiYnlyZWYiLCBieXJlZiwgTUVUSF9WQVJBUkdTLCBieXJlZl9kb2N9LAorICAgIHsiYWRkcmVzc29mIiwgYWRkcmVzc29mLCBNRVRIX08sIGFkZHJlc3NvZl9kb2N9LAorICAgIHsiY2FsbF9mdW5jdGlvbiIsIGNhbGxfZnVuY3Rpb24sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsiY2FsbF9jZGVjbGZ1bmN0aW9uIiwgY2FsbF9jZGVjbGZ1bmN0aW9uLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7IlB5T2JqX0Zyb21QdHIiLCBNeV9QeU9ial9Gcm9tUHRyLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7IlB5X0lOQ1JFRiIsIE15X1B5X0lOQ1JFRiwgTUVUSF9PIH0sCisgICAgeyJQeV9ERUNSRUYiLCBNeV9QeV9ERUNSRUYsIE1FVEhfTyB9LAorICAgIHtOVUxMLCAgICAgIE5VTEx9ICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYyBiL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYwppbmRleCA0MDM3ZTkzLi40NjA1M2I4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCkBAIC0xNyw5ICsxNyw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ0ZpZWxkX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlDRmllbGRPYmplY3QgKm9iajsKLQlvYmogPSAoQ0ZpZWxkT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW9iajsKKyAgICBDRmllbGRPYmplY3QgKm9iajsKKyAgICBvYmogPSAoQ0ZpZWxkT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9iajsKIH0KIAogLyoKQEAgLTM2LDMwNSArMzYsMzA1IEBACiAgKi8KIFB5T2JqZWN0ICoKIENGaWVsZF9Gcm9tRGVzYyhQeU9iamVjdCAqZGVzYywgUHlfc3NpemVfdCBpbmRleCwKLQkJUHlfc3NpemVfdCAqcGZpZWxkX3NpemUsIGludCBiaXRzaXplLCBpbnQgKnBiaXRvZnMsCi0JCVB5X3NzaXplX3QgKnBzaXplLCBQeV9zc2l6ZV90ICpwb2Zmc2V0LCBQeV9zc2l6ZV90ICpwYWxpZ24sCi0JCWludCBwYWNrLCBpbnQgYmlnX2VuZGlhbikKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpwZmllbGRfc2l6ZSwgaW50IGJpdHNpemUsIGludCAqcGJpdG9mcywKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpwc2l6ZSwgUHlfc3NpemVfdCAqcG9mZnNldCwgUHlfc3NpemVfdCAqcGFsaWduLAorICAgICAgICAgICAgICAgIGludCBwYWNrLCBpbnQgYmlnX2VuZGlhbikKIHsKLQlDRmllbGRPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKnByb3RvOwotCVB5X3NzaXplX3Qgc2l6ZSwgYWxpZ24sIGxlbmd0aDsKLQlTRVRGVU5DIHNldGZ1bmMgPSBOVUxMOwotCUdFVEZVTkMgZ2V0ZnVuYyA9IE5VTEw7Ci0JU3RnRGljdE9iamVjdCAqZGljdDsKLQlpbnQgZmllbGR0eXBlOworICAgIENGaWVsZE9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqcHJvdG87CisgICAgUHlfc3NpemVfdCBzaXplLCBhbGlnbiwgbGVuZ3RoOworICAgIFNFVEZVTkMgc2V0ZnVuYyA9IE5VTEw7CisgICAgR0VURlVOQyBnZXRmdW5jID0gTlVMTDsKKyAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgIGludCBmaWVsZHR5cGU7CiAjZGVmaW5lIE5PX0JJVEZJRUxEIDAKICNkZWZpbmUgTkVXX0JJVEZJRUxEIDEKICNkZWZpbmUgQ09OVF9CSVRGSUVMRCAyCiAjZGVmaW5lIEVYUEFORF9CSVRGSUVMRCAzCiAKLQlzZWxmID0gKENGaWVsZE9iamVjdCAqKVB5T2JqZWN0X0NhbGxPYmplY3QoKFB5T2JqZWN0ICopJkNGaWVsZF9UeXBlLAotCQkJCQkJICAgTlVMTCk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZGljdCA9IFB5VHlwZV9zdGdkaWN0KGRlc2MpOwotCWlmICghZGljdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJoYXMgbm8gX3N0Z2luZm9fIik7Ci0JCVB5X0RFQ1JFRihzZWxmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChiaXRzaXplIC8qIHRoaXMgaXMgYSBiaXRmaWVsZCByZXF1ZXN0ICovCi0JICAgICYmICpwZmllbGRfc2l6ZSAvKiB3ZSBoYXZlIGEgYml0ZmllbGQgb3BlbiAqLworICAgIHNlbGYgPSAoQ0ZpZWxkT2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmQ0ZpZWxkX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRpY3QgPSBQeVR5cGVfc3RnZGljdChkZXNjKTsKKyAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgbm8gX3N0Z2luZm9fIik7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChiaXRzaXplIC8qIHRoaXMgaXMgYSBiaXRmaWVsZCByZXF1ZXN0ICovCisgICAgICAgICYmICpwZmllbGRfc2l6ZSAvKiB3ZSBoYXZlIGEgYml0ZmllbGQgb3BlbiAqLwogI2lmZGVmIE1TX1dJTjMyCi0JICAgIC8qIE1TVkMsIEdDQyB3aXRoIC1tbXMtYml0ZmllbGRzICovCi0JICAgICYmIGRpY3QtPnNpemUgKiA4ID09ICpwZmllbGRfc2l6ZQorICAgICAgICAvKiBNU1ZDLCBHQ0Mgd2l0aCAtbW1zLWJpdGZpZWxkcyAqLworICAgICAgICAmJiBkaWN0LT5zaXplICogOCA9PSAqcGZpZWxkX3NpemUKICNlbHNlCi0JICAgIC8qIEdDQyAqLwotCSAgICAmJiBkaWN0LT5zaXplICogOCA8PSAqcGZpZWxkX3NpemUgCisgICAgICAgIC8qIEdDQyAqLworICAgICAgICAmJiBkaWN0LT5zaXplICogOCA8PSAqcGZpZWxkX3NpemUKICNlbmRpZgotCSAgICAmJiAoKnBiaXRvZnMgKyBiaXRzaXplKSA8PSAqcGZpZWxkX3NpemUpIHsKLQkJLyogY29udGludWUgYml0IGZpZWxkICovCi0JCWZpZWxkdHlwZSA9IENPTlRfQklURklFTEQ7CisgICAgICAgICYmICgqcGJpdG9mcyArIGJpdHNpemUpIDw9ICpwZmllbGRfc2l6ZSkgeworICAgICAgICAvKiBjb250aW51ZSBiaXQgZmllbGQgKi8KKyAgICAgICAgZmllbGR0eXBlID0gQ09OVF9CSVRGSUVMRDsKICNpZm5kZWYgTVNfV0lOMzIKLQl9IGVsc2UgaWYgKGJpdHNpemUgLyogdGhpcyBpcyBhIGJpdGZpZWxkIHJlcXVlc3QgKi8KLQkgICAgJiYgKnBmaWVsZF9zaXplIC8qIHdlIGhhdmUgYSBiaXRmaWVsZCBvcGVuICovCi0JICAgICYmIGRpY3QtPnNpemUgKiA4ID49ICpwZmllbGRfc2l6ZQotCSAgICAmJiAoKnBiaXRvZnMgKyBiaXRzaXplKSA8PSBkaWN0LT5zaXplICogOCkgewotCQkvKiBleHBhbmQgYml0IGZpZWxkICovCi0JCWZpZWxkdHlwZSA9IEVYUEFORF9CSVRGSUVMRDsKKyAgICB9IGVsc2UgaWYgKGJpdHNpemUgLyogdGhpcyBpcyBhIGJpdGZpZWxkIHJlcXVlc3QgKi8KKyAgICAgICAgJiYgKnBmaWVsZF9zaXplIC8qIHdlIGhhdmUgYSBiaXRmaWVsZCBvcGVuICovCisgICAgICAgICYmIGRpY3QtPnNpemUgKiA4ID49ICpwZmllbGRfc2l6ZQorICAgICAgICAmJiAoKnBiaXRvZnMgKyBiaXRzaXplKSA8PSBkaWN0LT5zaXplICogOCkgeworICAgICAgICAvKiBleHBhbmQgYml0IGZpZWxkICovCisgICAgICAgIGZpZWxkdHlwZSA9IEVYUEFORF9CSVRGSUVMRDsKICNlbmRpZgotCX0gZWxzZSBpZiAoYml0c2l6ZSkgewotCQkvKiBzdGFydCBuZXcgYml0ZmllbGQgKi8KLQkJZmllbGR0eXBlID0gTkVXX0JJVEZJRUxEOwotCQkqcGJpdG9mcyA9IDA7Ci0JCSpwZmllbGRfc2l6ZSA9IGRpY3QtPnNpemUgKiA4OwotCX0gZWxzZSB7Ci0JCS8qIG5vdCBhIGJpdCBmaWVsZCAqLwotCQlmaWVsZHR5cGUgPSBOT19CSVRGSUVMRDsKLQkJKnBiaXRvZnMgPSAwOwotCQkqcGZpZWxkX3NpemUgPSAwOwotCX0KKyAgICB9IGVsc2UgaWYgKGJpdHNpemUpIHsKKyAgICAgICAgLyogc3RhcnQgbmV3IGJpdGZpZWxkICovCisgICAgICAgIGZpZWxkdHlwZSA9IE5FV19CSVRGSUVMRDsKKyAgICAgICAgKnBiaXRvZnMgPSAwOworICAgICAgICAqcGZpZWxkX3NpemUgPSBkaWN0LT5zaXplICogODsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBub3QgYSBiaXQgZmllbGQgKi8KKyAgICAgICAgZmllbGR0eXBlID0gTk9fQklURklFTEQ7CisgICAgICAgICpwYml0b2ZzID0gMDsKKyAgICAgICAgKnBmaWVsZF9zaXplID0gMDsKKyAgICB9CiAKLQlzaXplID0gZGljdC0+c2l6ZTsKLQlsZW5ndGggPSBkaWN0LT5sZW5ndGg7Ci0JcHJvdG8gPSBkZXNjOworICAgIHNpemUgPSBkaWN0LT5zaXplOworICAgIGxlbmd0aCA9IGRpY3QtPmxlbmd0aDsKKyAgICBwcm90byA9IGRlc2M7CiAKLQkvKiAgRmllbGQgZGVzY3JpcHRvcnMgZm9yICdjX2NoYXIgKiBuJyBhcmUgYmUgc2NwZWNpYWwgY2FzZWQgdG8KLQkgICAgcmV0dXJuIGEgUHl0aG9uIHN0cmluZyBpbnN0ZWFkIG9mIGFuIEFycmF5IG9iamVjdCBpbnN0YW5jZS4uLgotCSovCi0JaWYgKEFycmF5VHlwZU9iamVjdF9DaGVjayhwcm90bykpIHsKLQkJU3RnRGljdE9iamVjdCAqYWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7Ci0JCVN0Z0RpY3RPYmplY3QgKmlkaWN0OwotCQlpZiAoYWRpY3QgJiYgYWRpY3QtPnByb3RvKSB7Ci0JCQlpZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFkaWN0LT5wcm90byk7Ci0JCQlpZiAoIWlkaWN0KSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJoYXMgbm8gX3N0Z2luZm9fIik7Ci0JCQkJUHlfREVDUkVGKHNlbGYpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKGlkaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJjIiktPmdldGZ1bmMpIHsKLQkJCQlzdHJ1Y3QgZmllbGRkZXNjICpmZCA9IGdldGVudHJ5KCJzIik7Ci0JCQkJZ2V0ZnVuYyA9IGZkLT5nZXRmdW5jOwotCQkJCXNldGZ1bmMgPSBmZC0+c2V0ZnVuYzsKLQkJCX0KKyAgICAvKiAgRmllbGQgZGVzY3JpcHRvcnMgZm9yICdjX2NoYXIgKiBuJyBhcmUgYmUgc2NwZWNpYWwgY2FzZWQgdG8KKyAgICAgICAgcmV0dXJuIGEgUHl0aG9uIHN0cmluZyBpbnN0ZWFkIG9mIGFuIEFycmF5IG9iamVjdCBpbnN0YW5jZS4uLgorICAgICovCisgICAgaWYgKEFycmF5VHlwZU9iamVjdF9DaGVjayhwcm90bykpIHsKKyAgICAgICAgU3RnRGljdE9iamVjdCAqYWRpY3QgPSBQeVR5cGVfc3RnZGljdChwcm90byk7CisgICAgICAgIFN0Z0RpY3RPYmplY3QgKmlkaWN0OworICAgICAgICBpZiAoYWRpY3QgJiYgYWRpY3QtPnByb3RvKSB7CisgICAgICAgICAgICBpZGljdCA9IFB5VHlwZV9zdGdkaWN0KGFkaWN0LT5wcm90byk7CisgICAgICAgICAgICBpZiAoIWlkaWN0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBubyBfc3RnaW5mb18iKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoImMiKS0+Z2V0ZnVuYykgeworICAgICAgICAgICAgICAgIHN0cnVjdCBmaWVsZGRlc2MgKmZkID0gZ2V0ZW50cnkoInMiKTsKKyAgICAgICAgICAgICAgICBnZXRmdW5jID0gZmQtPmdldGZ1bmM7CisgICAgICAgICAgICAgICAgc2V0ZnVuYyA9IGZkLT5zZXRmdW5jOworICAgICAgICAgICAgfQogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JCQlpZiAoaWRpY3QtPmdldGZ1bmMgPT0gZ2V0ZW50cnkoInUiKS0+Z2V0ZnVuYykgewotCQkJCXN0cnVjdCBmaWVsZGRlc2MgKmZkID0gZ2V0ZW50cnkoIlUiKTsKLQkJCQlnZXRmdW5jID0gZmQtPmdldGZ1bmM7Ci0JCQkJc2V0ZnVuYyA9IGZkLT5zZXRmdW5jOwotCQkJfQorICAgICAgICAgICAgaWYgKGlkaWN0LT5nZXRmdW5jID09IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZmllbGRkZXNjICpmZCA9IGdldGVudHJ5KCJVIik7CisgICAgICAgICAgICAgICAgZ2V0ZnVuYyA9IGZkLT5nZXRmdW5jOworICAgICAgICAgICAgICAgIHNldGZ1bmMgPSBmZC0+c2V0ZnVuYzsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQl9Ci0JfQorICAgICAgICB9CisgICAgfQogCi0Jc2VsZi0+c2V0ZnVuYyA9IHNldGZ1bmM7Ci0Jc2VsZi0+Z2V0ZnVuYyA9IGdldGZ1bmM7Ci0Jc2VsZi0+aW5kZXggPSBpbmRleDsKKyAgICBzZWxmLT5zZXRmdW5jID0gc2V0ZnVuYzsKKyAgICBzZWxmLT5nZXRmdW5jID0gZ2V0ZnVuYzsKKyAgICBzZWxmLT5pbmRleCA9IGluZGV4OwogCi0JUHlfSU5DUkVGKHByb3RvKTsKLQlzZWxmLT5wcm90byA9IHByb3RvOworICAgIFB5X0lOQ1JFRihwcm90byk7CisgICAgc2VsZi0+cHJvdG8gPSBwcm90bzsKIAotCXN3aXRjaCAoZmllbGR0eXBlKSB7Ci0JY2FzZSBORVdfQklURklFTEQ6Ci0JCWlmIChiaWdfZW5kaWFuKQotCQkJc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwZmllbGRfc2l6ZSAtICpwYml0b2ZzIC0gYml0c2l6ZTsKLQkJZWxzZQotCQkJc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwYml0b2ZzOwotCQkqcGJpdG9mcyA9IGJpdHNpemU7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgTk9fQklURklFTEQ6Ci0JCWlmIChwYWNrKQotCQkJYWxpZ24gPSBtaW4ocGFjaywgZGljdC0+YWxpZ24pOwotCQllbHNlCi0JCQlhbGlnbiA9IGRpY3QtPmFsaWduOwotCQlpZiAoYWxpZ24gJiYgKnBvZmZzZXQgJSBhbGlnbikgewotCQkJUHlfc3NpemVfdCBkZWx0YSA9IGFsaWduIC0gKCpwb2Zmc2V0ICUgYWxpZ24pOwotCQkJKnBzaXplICs9IGRlbHRhOwotCQkJKnBvZmZzZXQgKz0gZGVsdGE7Ci0JCX0KKyAgICBzd2l0Y2ggKGZpZWxkdHlwZSkgeworICAgIGNhc2UgTkVXX0JJVEZJRUxEOgorICAgICAgICBpZiAoYmlnX2VuZGlhbikKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGZpZWxkX3NpemUgLSAqcGJpdG9mcyAtIGJpdHNpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGJpdG9mczsKKyAgICAgICAgKnBiaXRvZnMgPSBiaXRzaXplOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlIE5PX0JJVEZJRUxEOgorICAgICAgICBpZiAocGFjaykKKyAgICAgICAgICAgIGFsaWduID0gbWluKHBhY2ssIGRpY3QtPmFsaWduKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWxpZ24gPSBkaWN0LT5hbGlnbjsKKyAgICAgICAgaWYgKGFsaWduICYmICpwb2Zmc2V0ICUgYWxpZ24pIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgZGVsdGEgPSBhbGlnbiAtICgqcG9mZnNldCAlIGFsaWduKTsKKyAgICAgICAgICAgICpwc2l6ZSArPSBkZWx0YTsKKyAgICAgICAgICAgICpwb2Zmc2V0ICs9IGRlbHRhOworICAgICAgICB9CiAKLQkJaWYgKGJpdHNpemUgPT0gMCkKLQkJCXNlbGYtPnNpemUgPSBzaXplOwotCQkqcHNpemUgKz0gc2l6ZTsKKyAgICAgICAgaWYgKGJpdHNpemUgPT0gMCkKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSBzaXplOworICAgICAgICAqcHNpemUgKz0gc2l6ZTsKIAotCQlzZWxmLT5vZmZzZXQgPSAqcG9mZnNldDsKLQkJKnBvZmZzZXQgKz0gc2l6ZTsKKyAgICAgICAgc2VsZi0+b2Zmc2V0ID0gKnBvZmZzZXQ7CisgICAgICAgICpwb2Zmc2V0ICs9IHNpemU7CiAKLQkJKnBhbGlnbiA9IGFsaWduOwotCQlicmVhazsKKyAgICAgICAgKnBhbGlnbiA9IGFsaWduOworICAgICAgICBicmVhazsKIAotCWNhc2UgRVhQQU5EX0JJVEZJRUxEOgotCQkqcG9mZnNldCArPSBkaWN0LT5zaXplIC0gKnBmaWVsZF9zaXplLzg7Ci0JCSpwc2l6ZSArPSBkaWN0LT5zaXplIC0gKnBmaWVsZF9zaXplLzg7CisgICAgY2FzZSBFWFBBTkRfQklURklFTEQ6CisgICAgICAgICpwb2Zmc2V0ICs9IGRpY3QtPnNpemUgLSAqcGZpZWxkX3NpemUvODsKKyAgICAgICAgKnBzaXplICs9IGRpY3QtPnNpemUgLSAqcGZpZWxkX3NpemUvODsKIAotCQkqcGZpZWxkX3NpemUgPSBkaWN0LT5zaXplICogODsKKyAgICAgICAgKnBmaWVsZF9zaXplID0gZGljdC0+c2l6ZSAqIDg7CiAKLQkJaWYgKGJpZ19lbmRpYW4pCi0JCQlzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBmaWVsZF9zaXplIC0gKnBiaXRvZnMgLSBiaXRzaXplOwotCQllbHNlCi0JCQlzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBiaXRvZnM7CisgICAgICAgIGlmIChiaWdfZW5kaWFuKQorICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwZmllbGRfc2l6ZSAtICpwYml0b2ZzIC0gYml0c2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VsZi0+c2l6ZSA9IChiaXRzaXplIDw8IDE2KSArICpwYml0b2ZzOwogCi0JCXNlbGYtPm9mZnNldCA9ICpwb2Zmc2V0IC0gc2l6ZTsgLyogcG9mZnNldCBpcyBhbHJlYWR5IHVwZGF0ZWQgZm9yIHRoZSBORVhUIGZpZWxkICovCi0JCSpwYml0b2ZzICs9IGJpdHNpemU7Ci0JCWJyZWFrOworICAgICAgICBzZWxmLT5vZmZzZXQgPSAqcG9mZnNldCAtIHNpemU7IC8qIHBvZmZzZXQgaXMgYWxyZWFkeSB1cGRhdGVkIGZvciB0aGUgTkVYVCBmaWVsZCAqLworICAgICAgICAqcGJpdG9mcyArPSBiaXRzaXplOworICAgICAgICBicmVhazsKIAotCWNhc2UgQ09OVF9CSVRGSUVMRDoKLQkJaWYgKGJpZ19lbmRpYW4pCi0JCQlzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBmaWVsZF9zaXplIC0gKnBiaXRvZnMgLSBiaXRzaXplOwotCQllbHNlCi0JCQlzZWxmLT5zaXplID0gKGJpdHNpemUgPDwgMTYpICsgKnBiaXRvZnM7CisgICAgY2FzZSBDT05UX0JJVEZJRUxEOgorICAgICAgICBpZiAoYmlnX2VuZGlhbikKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGZpZWxkX3NpemUgLSAqcGJpdG9mcyAtIGJpdHNpemU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSAoYml0c2l6ZSA8PCAxNikgKyAqcGJpdG9mczsKIAotCQlzZWxmLT5vZmZzZXQgPSAqcG9mZnNldCAtIHNpemU7IC8qIHBvZmZzZXQgaXMgYWxyZWFkeSB1cGRhdGVkIGZvciB0aGUgTkVYVCBmaWVsZCAqLwotCQkqcGJpdG9mcyArPSBiaXRzaXplOwotCQlicmVhazsKLQl9CisgICAgICAgIHNlbGYtPm9mZnNldCA9ICpwb2Zmc2V0IC0gc2l6ZTsgLyogcG9mZnNldCBpcyBhbHJlYWR5IHVwZGF0ZWQgZm9yIHRoZSBORVhUIGZpZWxkICovCisgICAgICAgICpwYml0b2ZzICs9IGJpdHNpemU7CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiBzdGF0aWMgaW50CiBDRmllbGRfc2V0KENGaWVsZE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmluc3QsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlDRGF0YU9iamVjdCAqZHN0OwotCWNoYXIgKnB0cjsKLQlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soaW5zdCkpOwotCWRzdCA9IChDRGF0YU9iamVjdCAqKWluc3Q7Ci0JcHRyID0gZHN0LT5iX3B0ciArIHNlbGYtPm9mZnNldDsKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIENEYXRhX3NldChpbnN0LCBzZWxmLT5wcm90bywgc2VsZi0+c2V0ZnVuYywgdmFsdWUsCi0JCQkgc2VsZi0+aW5kZXgsIHNlbGYtPnNpemUsIHB0cik7CisgICAgQ0RhdGFPYmplY3QgKmRzdDsKKyAgICBjaGFyICpwdHI7CisgICAgYXNzZXJ0KENEYXRhT2JqZWN0X0NoZWNrKGluc3QpKTsKKyAgICBkc3QgPSAoQ0RhdGFPYmplY3QgKilpbnN0OworICAgIHB0ciA9IGRzdC0+Yl9wdHIgKyBzZWxmLT5vZmZzZXQ7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIENEYXRhX3NldChpbnN0LCBzZWxmLT5wcm90bywgc2VsZi0+c2V0ZnVuYywgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLT5pbmRleCwgc2VsZi0+c2l6ZSwgcHRyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENGaWVsZF9nZXQoQ0ZpZWxkT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaW5zdCwgUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCUNEYXRhT2JqZWN0ICpzcmM7Ci0JaWYgKGluc3QgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotCX0KLQlhc3NlcnQoQ0RhdGFPYmplY3RfQ2hlY2soaW5zdCkpOwotCXNyYyA9IChDRGF0YU9iamVjdCAqKWluc3Q7Ci0JcmV0dXJuIENEYXRhX2dldChzZWxmLT5wcm90bywgc2VsZi0+Z2V0ZnVuYywgaW5zdCwKLQkJCSBzZWxmLT5pbmRleCwgc2VsZi0+c2l6ZSwgc3JjLT5iX3B0ciArIHNlbGYtPm9mZnNldCk7CisgICAgQ0RhdGFPYmplY3QgKnNyYzsKKyAgICBpZiAoaW5zdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgfQorICAgIGFzc2VydChDRGF0YU9iamVjdF9DaGVjayhpbnN0KSk7CisgICAgc3JjID0gKENEYXRhT2JqZWN0ICopaW5zdDsKKyAgICByZXR1cm4gQ0RhdGFfZ2V0KHNlbGYtPnByb3RvLCBzZWxmLT5nZXRmdW5jLCBpbnN0LAorICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aW5kZXgsIHNlbGYtPnNpemUsIHNyYy0+Yl9wdHIgKyBzZWxmLT5vZmZzZXQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ0ZpZWxkX2dldF9vZmZzZXQoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KCgoQ0ZpZWxkT2JqZWN0ICopc2VsZiktPm9mZnNldCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KCgoQ0ZpZWxkT2JqZWN0ICopc2VsZiktPm9mZnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRmllbGRfZ2V0X3NpemUoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KCgoQ0ZpZWxkT2JqZWN0ICopc2VsZiktPnNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoKENGaWVsZE9iamVjdCAqKXNlbGYpLT5zaXplKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIENGaWVsZF9nZXRzZXRbXSA9IHsKLQl7ICJvZmZzZXQiLCBDRmllbGRfZ2V0X29mZnNldCwgTlVMTCwgIm9mZnNldCBpbiBieXRlcyBvZiB0aGlzIGZpZWxkIiB9LAotCXsgInNpemUiLCBDRmllbGRfZ2V0X3NpemUsIE5VTEwsICJzaXplIGluIGJ5dGVzIG9mIHRoaXMgZmllbGQiIH0sCi0JeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0sCisgICAgeyAib2Zmc2V0IiwgQ0ZpZWxkX2dldF9vZmZzZXQsIE5VTEwsICJvZmZzZXQgaW4gYnl0ZXMgb2YgdGhpcyBmaWVsZCIgfSwKKyAgICB7ICJzaXplIiwgQ0ZpZWxkX2dldF9zaXplLCBOVUxMLCAic2l6ZSBpbiBieXRlcyBvZiB0aGlzIGZpZWxkIiB9LAorICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9LAogfTsKIAogc3RhdGljIGludAogQ0ZpZWxkX3RyYXZlcnNlKENGaWVsZE9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoc2VsZi0+cHJvdG8pOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNlbGYtPnByb3RvKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogQ0ZpZWxkX2NsZWFyKENGaWVsZE9iamVjdCAqc2VsZikKIHsKLQlQeV9DTEVBUihzZWxmLT5wcm90byk7Ci0JcmV0dXJuIDA7CisgICAgUHlfQ0xFQVIoc2VsZi0+cHJvdG8pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogQ0ZpZWxkX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0JQ0ZpZWxkX2NsZWFyKChDRmllbGRPYmplY3QgKilzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIENGaWVsZF9jbGVhcigoQ0ZpZWxkT2JqZWN0ICopc2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENGaWVsZF9yZXByKENGaWVsZE9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5X3NzaXplX3QgYml0cyA9IHNlbGYtPnNpemUgPj4gMTY7Ci0JUHlfc3NpemVfdCBzaXplID0gc2VsZi0+c2l6ZSAmIDB4RkZGRjsKLQljb25zdCBjaGFyICpuYW1lOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBiaXRzID0gc2VsZi0+c2l6ZSA+PiAxNjsKKyAgICBQeV9zc2l6ZV90IHNpemUgPSBzZWxmLT5zaXplICYgMHhGRkZGOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAKLQluYW1lID0gKChQeVR5cGVPYmplY3QgKilzZWxmLT5wcm90byktPnRwX25hbWU7CisgICAgbmFtZSA9ICgoUHlUeXBlT2JqZWN0ICopc2VsZi0+cHJvdG8pLT50cF9uYW1lOwogCi0JaWYgKGJpdHMpCi0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoCisgICAgaWYgKGJpdHMpCisgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoCiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLQkJCSI8RmllbGQgdHlwZT0lcywgb2ZzPSVkOiVkLCBiaXRzPSVkPiIsCisgICAgICAgICAgICAiPEZpZWxkIHR5cGU9JXMsIG9mcz0lZDolZCwgYml0cz0lZD4iLAogI2Vsc2UKLQkJCSI8RmllbGQgdHlwZT0lcywgb2ZzPSV6ZDolemQsIGJpdHM9JXpkPiIsCisgICAgICAgICAgICAiPEZpZWxkIHR5cGU9JXMsIG9mcz0lemQ6JXpkLCBiaXRzPSV6ZD4iLAogI2VuZGlmCi0JCQluYW1lLCBzZWxmLT5vZmZzZXQsIHNpemUsIGJpdHMpOwotCWVsc2UKLQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgKKyAgICAgICAgICAgIG5hbWUsIHNlbGYtPm9mZnNldCwgc2l6ZSwgYml0cyk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkiPEZpZWxkIHR5cGU9JXMsIG9mcz0lZCwgc2l6ZT0lZD4iLAorICAgICAgICAgICAgIjxGaWVsZCB0eXBlPSVzLCBvZnM9JWQsIHNpemU9JWQ+IiwKICNlbHNlCi0JCQkiPEZpZWxkIHR5cGU9JXMsIG9mcz0lemQsIHNpemU9JXpkPiIsCisgICAgICAgICAgICAiPEZpZWxkIHR5cGU9JXMsIG9mcz0lemQsIHNpemU9JXpkPiIsCiAjZW5kaWYKLQkJCW5hbWUsIHNlbGYtPm9mZnNldCwgc2l6ZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIG5hbWUsIHNlbGYtPm9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlUeXBlT2JqZWN0IENGaWVsZF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJfY3R5cGVzLkNGaWVsZCIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoQ0ZpZWxkT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQlDRmllbGRfZGVhbGxvYywJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylDRmllbGRfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCSJTdHJ1Y3R1cmUvVW5pb24gbWVtYmVyIiwJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpQ0ZpZWxkX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlDRmllbGRfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlDRmllbGRfZ2V0c2V0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JKGRlc2NyZ2V0ZnVuYylDRmllbGRfZ2V0LAkJLyogdHBfZGVzY3JfZ2V0ICovCi0JKGRlc2Nyc2V0ZnVuYylDRmllbGRfc2V0LAkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCUNGaWVsZF9uZXcsCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9jdHlwZXMuQ0ZpZWxkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoQ0ZpZWxkT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICBDRmllbGRfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKUNGaWVsZF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgICJTdHJ1Y3R1cmUvVW5pb24gbWVtYmVyIiwgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylDRmllbGRfdHJhdmVyc2UsICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KUNGaWVsZF9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBDRmllbGRfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIChkZXNjcmdldGZ1bmMpQ0ZpZWxkX2dldCwgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgKGRlc2Nyc2V0ZnVuYylDRmllbGRfc2V0LCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgQ0ZpZWxkX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKLQwKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgIEFjY2Vzc29yIGZ1bmN0aW9ucwpAQCAtMzQ3LDE3ICszNDcsMTcgQEAKIHN0YXRpYyBpbnQKIGdldF9sb25nKFB5T2JqZWN0ICp2LCBsb25nICpwKQogewotCWxvbmcgeDsKLQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXggPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCSpwID0geDsKLQlyZXR1cm4gMDsKKyAgICBsb25nIHg7CisgICAgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHggPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodik7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpwID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogU2FtZSwgYnV0IGhhbmRsaW5nIHVuc2lnbmVkIGxvbmcgKi8KQEAgLTM2NSwxNyArMzY1LDE3IEBACiBzdGF0aWMgaW50CiBnZXRfdWxvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIGxvbmcgKnApCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCWlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImludCBleHBlY3RlZCBpbnN0ZWFkIG9mIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JeCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2KTsKLQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImludCBleHBlY3RlZCBpbnN0ZWFkIG9mIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2KTsKKyAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKQEAgLTM4NSwxNyArMzg1LDE3IEBACiBzdGF0aWMgaW50CiBnZXRfbG9uZ2xvbmcoUHlPYmplY3QgKnYsIFBZX0xPTkdfTE9ORyAqcCkKIHsKLQlQWV9MT05HX0xPTkcgeDsKLQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBmbG9hdCIpOwotIAkJcmV0dXJuIC0xOwotCX0KLQl4ID0gUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOworICAgIFBZX0xPTkdfTE9ORyB4OworICAgIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50IGV4cGVjdGVkIGluc3RlYWQgb2YgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ID0gUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2KTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAvKiBTYW1lLCBidXQgaGFuZGxpbmcgbmF0aXZlIHVuc2lnbmVkIGxvbmcgbG9uZy4gKi8KQEAgLTQwMywxNyArNDAzLDE3IEBACiBzdGF0aWMgaW50CiBnZXRfdWxvbmdsb25nKFB5T2JqZWN0ICp2LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKnApCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7Ci0JaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiaW50IGV4cGVjdGVkIGluc3RlYWQgb2YgZmxvYXQiKTsKLSAJCXJldHVybiAtMTsKLSAJfQotCXggPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHYpOwotCWlmICh4ID09ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCSpwID0geDsKLQlyZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImludCBleHBlY3RlZCBpbnN0ZWFkIG9mIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeCA9IFB5SW50X0FzVW5zaWduZWRMb25nTG9uZ01hc2sodik7CisgICAgaWYgKHggPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAjZW5kaWYKQEAgLTQzNiw0OSArNDM2LDQ5IEBACiAvKiBUaGlzIG1hY3JvIENIQU5HRVMgdGhlIGZpcnN0IHBhcmFtZXRlciBJTiBQTEFDRS4gRm9yIHByb3BlciBzaWduIGhhbmRsaW5nLAogICAgd2UgbXVzdCBmaXJzdCBzaGlmdCBsZWZ0LCB0aGVuIHJpZ2h0LgogKi8KLSNkZWZpbmUgR0VUX0JJVEZJRUxEKHYsIHNpemUpCQkJCQkJXAotCWlmIChOVU1fQklUUyhzaXplKSkgewkJCQkJCVwKLQkJdiA8PD0gKHNpemVvZih2KSo4IC0gTE9XX0JJVChzaXplKSAtIE5VTV9CSVRTKHNpemUpKTsJXAotCQl2ID4+PSAoc2l6ZW9mKHYpKjggLSBOVU1fQklUUyhzaXplKSk7CQkJXAotCX0KKyNkZWZpbmUgR0VUX0JJVEZJRUxEKHYsIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoTlVNX0JJVFMoc2l6ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdiA8PD0gKHNpemVvZih2KSo4IC0gTE9XX0JJVChzaXplKSAtIE5VTV9CSVRTKHNpemUpKTsgICAgICAgICAgIFwKKyAgICAgICAgdiA+Pj0gKHNpemVvZih2KSo4IC0gTlVNX0JJVFMoc2l6ZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKIC8qIFRoaXMgbWFjcm8gUkVUVVJOUyB0aGUgZmlyc3QgcGFyYW1ldGVyIHdpdGggdGhlIGJpdCBmaWVsZCBDSEFOR0VELiAqLwotI2RlZmluZSBTRVQoeCwgdiwgc2l6ZSkJCQkJCQkJXAotCShOVU1fQklUUyhzaXplKSA/CQkJCQkJXAotCSAoICggeCAmIH4oQklUX01BU0soc2l6ZSkgPDwgTE9XX0JJVChzaXplKSkgKSB8ICggKHYgJiBCSVRfTUFTSyhzaXplKSkgPDwgTE9XX0JJVChzaXplKSApICkgXAotCSA6IHYpCisjZGVmaW5lIFNFVCh4LCB2LCBzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKE5VTV9CSVRTKHNpemUpID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICggKCB4ICYgfihCSVRfTUFTSyhzaXplKSA8PCBMT1dfQklUKHNpemUpKSApIHwgKCAodiAmIEJJVF9NQVNLKHNpemUpKSA8PCBMT1dfQklUKHNpemUpICkgKSBcCisgICAgIDogdikKIAogLyogYnl0ZSBzd2FwcGluZyBtYWNyb3MgKi8KLSNkZWZpbmUgU1dBUF8yKHYpCQkJCVwKLQkoICggKHYgPj4gOCkgJiAweDAwRkYpIHwJCVwKLQkgICggKHYgPDwgOCkgJiAweEZGMDApICkKKyNkZWZpbmUgU1dBUF8yKHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICggKHYgPj4gOCkgJiAweDAwRkYpIHwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICggKHYgPDwgOCkgJiAweEZGMDApICkKIAotI2RlZmluZSBTV0FQXzQodikJCQlcCi0JKCAoICh2ICYgMHgwMDAwMDBGRikgPDwgMjQgKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwRkYwMCkgPDwgIDggKSB8ICBcCi0JICAoICh2ICYgMHgwMEZGMDAwMCkgPj4gIDggKSB8ICBcCi0JICAoICgodiA+PiAyNCkgJiAweEZGKSkgKQorI2RlZmluZSBTV0FQXzQodikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICggKHYgJiAweDAwMDAwMEZGKSA8PCAyNCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDBGRjAwKSA8PCAgOCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwRkYwMDAwKSA+PiAgOCApIHwgIFwKKyAgICAgICggKCh2ID4+IDI0KSAmIDB4RkYpKSApCiAKICNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBTV0FQXzgodikJCQkJXAotCSggKCAodiAmIDB4MDAwMDAwMDAwMDAwMDBGRkwpIDw8IDU2ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwMDAwMDAwRkYwMEwpIDw8IDQwICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwMDAwMEZGMDAwMEwpIDw8IDI0ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwMDBGRjAwMDAwMEwpIDw8ICA4ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwRkYwMDAwMDAwMEwpID4+ICA4ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMEZGMDAwMDAwMDAwMEwpID4+IDI0ICkgfCAgXAotCSAgKCAodiAmIDB4MDBGRjAwMDAwMDAwMDAwMEwpID4+IDQwICkgfCAgXAotCSAgKCAoKHYgPj4gNTYpICYgMHhGRikpICkKKyNkZWZpbmUgU1dBUF84KHYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoICggKHYgJiAweDAwMDAwMDAwMDAwMDAwRkZMKSA8PCA1NiApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMDAwMDAwMEZGMDBMKSA8PCA0MCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMDAwMDBGRjAwMDBMKSA8PCAyNCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMDAwRkYwMDAwMDBMKSA8PCAgOCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMEZGMDAwMDAwMDBMKSA+PiAgOCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDBGRjAwMDAwMDAwMDBMKSA+PiAyNCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwRkYwMDAwMDAwMDAwMDBMKSA+PiA0MCApIHwgIFwKKyAgICAgICggKCh2ID4+IDU2KSAmIDB4RkYpKSApCiAjZWxzZQotI2RlZmluZSBTV0FQXzgodikJCQkJXAotCSggKCAodiAmIDB4MDAwMDAwMDAwMDAwMDBGRkxMKSA8PCA1NiApIHwgIFwKLQkgICggKHYgJiAweDAwMDAwMDAwMDAwMEZGMDBMTCkgPDwgNDAgKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwMDAwMDAwRkYwMDAwTEwpIDw8IDI0ICkgfCAgXAotCSAgKCAodiAmIDB4MDAwMDAwMDBGRjAwMDAwMExMKSA8PCAgOCApIHwgIFwKLQkgICggKHYgJiAweDAwMDAwMEZGMDAwMDAwMDBMTCkgPj4gIDggKSB8ICBcCi0JICAoICh2ICYgMHgwMDAwRkYwMDAwMDAwMDAwTEwpID4+IDI0ICkgfCAgXAotCSAgKCAodiAmIDB4MDBGRjAwMDAwMDAwMDAwMExMKSA+PiA0MCApIHwgIFwKLQkgICggKCh2ID4+IDU2KSAmIDB4RkYpKSApCisjZGVmaW5lIFNXQVBfOCh2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAoICh2ICYgMHgwMDAwMDAwMDAwMDAwMEZGTEwpIDw8IDU2ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMDAwMDAwMDAwRkYwMExMKSA8PCA0MCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDAwMDAwMDBGRjAwMDBMTCkgPDwgMjQgKSB8ICBcCisgICAgICAoICh2ICYgMHgwMDAwMDAwMEZGMDAwMDAwTEwpIDw8ICA4ICkgfCAgXAorICAgICAgKCAodiAmIDB4MDAwMDAwRkYwMDAwMDAwMExMKSA+PiAgOCApIHwgIFwKKyAgICAgICggKHYgJiAweDAwMDBGRjAwMDAwMDAwMDBMTCkgPj4gMjQgKSB8ICBcCisgICAgICAoICh2ICYgMHgwMEZGMDAwMDAwMDAwMDAwTEwpID4+IDQwICkgfCAgXAorICAgICAgKCAoKHYgPj4gNTYpICYgMHhGRikpICkKICNlbmRpZgogCiAjZGVmaW5lIFNXQVBfSU5UIFNXQVBfNApAQCAtNTE1LDE4NCArNTE1LDE4NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JbG9uZyB2YWw7Ci0JaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCSooc2lnbmVkIGNoYXIgKilwdHIgPSAoc2lnbmVkIGNoYXIpU0VUKCooc2lnbmVkIGNoYXIgKilwdHIsIChzaWduZWQgY2hhcil2YWwsIHNpemUpOwotCV9SRVQodmFsdWUpOworICAgIGxvbmcgdmFsOworICAgIGlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAqKHNpZ25lZCBjaGFyICopcHRyID0gKHNpZ25lZCBjaGFyKVNFVCgqKHNpZ25lZCBjaGFyICopcHRyLCAoc2lnbmVkIGNoYXIpdmFsLCBzaXplKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogYl9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0Jc2lnbmVkIGNoYXIgdmFsID0gKihzaWduZWQgY2hhciAqKXB0cjsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBzaWduZWQgY2hhciB2YWwgPSAqKHNpZ25lZCBjaGFyICopcHRyOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQl9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCSoodW5zaWduZWQgY2hhciAqKXB0ciA9ICh1bnNpZ25lZCBjaGFyKVNFVCgqKHVuc2lnbmVkIGNoYXIqKXB0ciwKLQkJCQkJCSAgICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOwotCV9SRVQodmFsdWUpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIGlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgKih1bnNpZ25lZCBjaGFyICopcHRyID0gKHVuc2lnbmVkIGNoYXIpU0VUKCoodW5zaWduZWQgY2hhciopcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQpdmFsLCBzaXplKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogQl9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgY2hhciB2YWwgPSAqKHVuc2lnbmVkIGNoYXIgKilwdHI7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgdW5zaWduZWQgY2hhciB2YWwgPSAqKHVuc2lnbmVkIGNoYXIgKilwdHI7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgdmFsOwotCXNob3J0IHg7Ci0JaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotCXggPSBTRVQoeCwgKHNob3J0KXZhbCwgc2l6ZSk7Ci0JbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgbG9uZyB2YWw7CisgICAgc2hvcnQgeDsKKyAgICBpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisgICAgeCA9IFNFVCh4LCAoc2hvcnQpdmFsLCBzaXplKTsKKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogaF9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQlzaG9ydCBmaWVsZDsKLQlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfMihmaWVsZCk7Ci0JZmllbGQgPSBTRVQoZmllbGQsIChzaG9ydCl2YWwsIHNpemUpOwotCWZpZWxkID0gU1dBUF8yKGZpZWxkKTsKLQltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwotCV9SRVQodmFsdWUpOworICAgIGxvbmcgdmFsOworICAgIHNob3J0IGZpZWxkOworICAgIGlmIChnZXRfbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworICAgIGZpZWxkID0gU1dBUF8yKGZpZWxkKTsKKyAgICBmaWVsZCA9IFNFVChmaWVsZCwgKHNob3J0KXZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTV0FQXzIoZmllbGQpOworICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlzaG9ydCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl2YWwpOworICAgIHNob3J0IHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoX2dldF9zdyh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlzaG9ydCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCXZhbCA9IFNXQVBfMih2YWwpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIHNob3J0IHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgdmFsID0gU1dBUF8yKHZhbCk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBIX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCXVuc2lnbmVkIHNob3J0IHg7Ci0JaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKLQl4ID0gU0VUKHgsICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOwotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwotCV9SRVQodmFsdWUpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIHVuc2lnbmVkIHNob3J0IHg7CisgICAgaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKyAgICB4ID0gU0VUKHgsICh1bnNpZ25lZCBzaG9ydCl2YWwsIHNpemUpOworICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSF9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQl1bnNpZ25lZCBzaG9ydCBmaWVsZDsKLQlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7Ci0JZmllbGQgPSBTV0FQXzIoZmllbGQpOwotCWZpZWxkID0gU0VUKGZpZWxkLCAodW5zaWduZWQgc2hvcnQpdmFsLCBzaXplKTsKLQlmaWVsZCA9IFNXQVBfMihmaWVsZCk7Ci0JbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBmaWVsZDsKKyAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisgICAgZmllbGQgPSBTV0FQXzIoZmllbGQpOworICAgIGZpZWxkID0gU0VUKGZpZWxkLCAodW5zaWduZWQgc2hvcnQpdmFsLCBzaXplKTsKKyAgICBmaWVsZCA9IFNXQVBfMihmaWVsZCk7CisgICAgbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogSF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSF9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQl2YWwgPSBTV0FQXzIodmFsKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHZhbCA9IFNXQVBfMih2YWwpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQlpbnQgeDsKLQlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0JeCA9IFNFVCh4LCAoaW50KXZhbCwgc2l6ZSk7Ci0JbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgbG9uZyB2YWw7CisgICAgaW50IHg7CisgICAgaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworICAgIHggPSBTRVQoeCwgKGludCl2YWwsIHNpemUpOworICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaV9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQlpbnQgZmllbGQ7Ci0JaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7Ci0JZmllbGQgPSBTV0FQX0lOVChmaWVsZCk7Ci0JZmllbGQgPSBTRVQoZmllbGQsIChpbnQpdmFsLCBzaXplKTsKLQlmaWVsZCA9IFNXQVBfSU5UKGZpZWxkKTsKLQltZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOwotCV9SRVQodmFsdWUpOworICAgIGxvbmcgdmFsOworICAgIGludCBmaWVsZDsKKyAgICBpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKyAgICBmaWVsZCA9IFNXQVBfSU5UKGZpZWxkKTsKKyAgICBmaWVsZCA9IFNFVChmaWVsZCwgKGludCl2YWwsIHNpemUpOworICAgIGZpZWxkID0gU1dBUF9JTlQoZmllbGQpOworICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGlfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCWludCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIGludCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaV9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JaW50IHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gU1dBUF9JTlQodmFsKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBpbnQgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICB2YWwgPSBTV0FQX0lOVCh2YWwpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiAjaWZkZWYgTVNfV0lOMzIKQEAgLTcwMCwyMiArNzAwLDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdkJPT0xfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0Jc3dpdGNoIChQeU9iamVjdF9Jc1RydWUodmFsdWUpKSB7Ci0JY2FzZSAtMToKLQkJcmV0dXJuIE5VTEw7Ci0JY2FzZSAwOgotCQkqKHNob3J0IGludCAqKXB0ciA9IFZBUklBTlRfRkFMU0U7Ci0JCV9SRVQodmFsdWUpOwotCWRlZmF1bHQ6Ci0JCSooc2hvcnQgaW50ICopcHRyID0gVkFSSUFOVF9UUlVFOwotCQlfUkVUKHZhbHVlKTsKLQl9CisgICAgc3dpdGNoIChQeU9iamVjdF9Jc1RydWUodmFsdWUpKSB7CisgICAgY2FzZSAtMToKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSAwOgorICAgICAgICAqKHNob3J0IGludCAqKXB0ciA9IFZBUklBTlRfRkFMU0U7CisgICAgICAgIF9SRVQodmFsdWUpOworICAgIGRlZmF1bHQ6CisgICAgICAgICooc2hvcnQgaW50ICopcHRyID0gVkFSSUFOVF9UUlVFOworICAgICAgICBfUkVUKHZhbHVlKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB2Qk9PTF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykqKHNob3J0IGludCAqKXB0cik7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykqKHNob3J0IGludCAqKXB0cik7CiB9CiAjZW5kaWYKIApAQCAtNzMwLDI2MCArNzMwLDI2MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJvb2xfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0Jc3dpdGNoIChQeU9iamVjdF9Jc1RydWUodmFsdWUpKSB7Ci0JY2FzZSAtMToKLQkJcmV0dXJuIE5VTEw7Ci0JY2FzZSAwOgotCQkqKEJPT0xfVFlQRSAqKXB0ciA9IDA7Ci0JCV9SRVQodmFsdWUpOwotCWRlZmF1bHQ6Ci0JCSooQk9PTF9UWVBFICopcHRyID0gMTsKLQkJX1JFVCh2YWx1ZSk7Ci0JfQorICAgIHN3aXRjaCAoUHlPYmplY3RfSXNUcnVlKHZhbHVlKSkgeworICAgIGNhc2UgLTE6CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UgMDoKKyAgICAgICAgKihCT09MX1RZUEUgKilwdHIgPSAwOworICAgICAgICBfUkVUKHZhbHVlKTsKKyAgICBkZWZhdWx0OgorICAgICAgICAqKEJPT0xfVFlQRSAqKXB0ciA9IDE7CisgICAgICAgIF9SRVQodmFsdWUpOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJvb2xfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKihCT09MX1RZUEUgKilwdHIpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKihCT09MX1RZUEUgKilwdHIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQl1bnNpZ25lZCBpbnQgeDsKLQlpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiAgTlVMTDsKLQltZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKLQl4ID0gU0VUKHgsICh1bnNpZ25lZCBpbnQpdmFsLCBzaXplKTsKLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgICB1bnNpZ25lZCBpbnQgeDsKKyAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiAgTlVMTDsKKyAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKyAgICB4ID0gU0VUKHgsICh1bnNpZ25lZCBpbnQpdmFsLCBzaXplKTsKKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIElfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JdW5zaWduZWQgaW50IGZpZWxkOwotCWlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuICBOVUxMOwotCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7Ci0JZmllbGQgPSAodW5zaWduZWQgaW50KVNFVChmaWVsZCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOwotCWZpZWxkID0gU1dBUF9JTlQoZmllbGQpOwotCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgdW5zaWduZWQgaW50IGZpZWxkOworICAgIGlmIChnZXRfdWxvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuICBOVUxMOworICAgIG1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7CisgICAgZmllbGQgPSAodW5zaWduZWQgaW50KVNFVChmaWVsZCwgKHVuc2lnbmVkIGludCl2YWwsIHNpemUpOworICAgIGZpZWxkID0gU1dBUF9JTlQoZmllbGQpOworICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIElfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGludCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIGludCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSV9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gU1dBUF9JTlQodmFsKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBpbnQgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICB2YWwgPSBTV0FQX0lOVCh2YWwpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbF9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQlsb25nIHg7Ci0JaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotCXggPSBTRVQoeCwgdmFsLCBzaXplKTsKLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICBsb25nIHZhbDsKKyAgICBsb25nIHg7CisgICAgaWYgKGdldF9sb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworICAgIHggPSBTRVQoeCwgdmFsLCBzaXplKTsKKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JbG9uZyB2YWw7Ci0JbG9uZyBmaWVsZDsKLQlpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7Ci0JZmllbGQgPSAobG9uZylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7Ci0JZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOwotCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgbG9uZyB2YWw7CisgICAgbG9uZyBmaWVsZDsKKyAgICBpZiAoZ2V0X2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKKyAgICBmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7CisgICAgZmllbGQgPSAobG9uZylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7CisgICAgZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOworICAgIG1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGxfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCWxvbmcgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBsb25nIHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsX2dldF9zdyh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gU1dBUF9MT05HKHZhbCk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgbG9uZyB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHZhbCA9IFNXQVBfTE9ORyh2YWwpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTF9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gIE5VTEw7Ci0JbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7Ci0JeCA9IFNFVCh4LCB2YWwsIHNpemUpOwotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOwotCV9SRVQodmFsdWUpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiAgTlVMTDsKKyAgICBtZW1jcHkoJngsIHB0ciwgc2l6ZW9mKHgpKTsKKyAgICB4ID0gU0VUKHgsIHZhbCwgc2l6ZSk7CisgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBMX3NldF9zdyh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCXVuc2lnbmVkIGxvbmcgZmllbGQ7Ci0JaWYgKGdldF91bG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQotCQlyZXR1cm4gIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7Ci0JZmllbGQgPSAodW5zaWduZWQgbG9uZylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7Ci0JZmllbGQgPSBTV0FQX0xPTkcoZmllbGQpOwotCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgdW5zaWduZWQgbG9uZyBmaWVsZDsKKyAgICBpZiAoZ2V0X3Vsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiAgTlVMTDsKKyAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworICAgIGZpZWxkID0gU1dBUF9MT05HKGZpZWxkKTsKKyAgICBmaWVsZCA9ICh1bnNpZ25lZCBsb25nKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKKyAgICBmaWVsZCA9IFNXQVBfTE9ORyhmaWVsZCk7CisgICAgbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogTF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIExfZ2V0X3N3KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKLQl2YWwgPSBTV0FQX0xPTkcodmFsKTsKLQlHRVRfQklURklFTEQodmFsLCBzaXplKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbDsKKyAgICBtZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7CisgICAgdmFsID0gU1dBUF9MT05HKHZhbCk7CisgICAgR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbCk7CiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogc3RhdGljIFB5T2JqZWN0ICoKIHFfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUFlfTE9OR19MT05HIHZhbDsKLQlQWV9MT05HX0xPTkcgeDsKLQlpZiAoZ2V0X2xvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotCXggPSBTRVQoeCwgdmFsLCBzaXplKTsKLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICBQWV9MT05HX0xPTkcgdmFsOworICAgIFBZX0xPTkdfTE9ORyB4OworICAgIGlmIChnZXRfbG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtY3B5KCZ4LCBwdHIsIHNpemVvZih4KSk7CisgICAgeCA9IFNFVCh4LCB2YWwsIHNpemUpOworICAgIG1lbWNweShwdHIsICZ4LCBzaXplb2YoeCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcV9zZXRfc3codm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQWV9MT05HX0xPTkcgdmFsOwotCVBZX0xPTkdfTE9ORyBmaWVsZDsKLQlpZiAoZ2V0X2xvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmZmllbGQsIHB0ciwgc2l6ZW9mKGZpZWxkKSk7Ci0JZmllbGQgPSBTV0FQXzgoZmllbGQpOwotCWZpZWxkID0gKFBZX0xPTkdfTE9ORylTRVQoZmllbGQsIHZhbCwgc2l6ZSk7Ci0JZmllbGQgPSBTV0FQXzgoZmllbGQpOwotCW1lbWNweShwdHIsICZmaWVsZCwgc2l6ZW9mKGZpZWxkKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgUFlfTE9OR19MT05HIHZhbDsKKyAgICBQWV9MT05HX0xPTkcgZmllbGQ7CisgICAgaWYgKGdldF9sb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKKyAgICBmaWVsZCA9IChQWV9MT05HX0xPTkcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOworICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKKyAgICBtZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcV9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUFlfTE9OR19MT05HIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsKTsKKyAgICBQWV9MT05HX0xPTkcgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcV9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUFlfTE9OR19MT05HIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JdmFsID0gU1dBUF84KHZhbCk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsKTsKKyAgICBQWV9MT05HX0xPTkcgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICB2YWwgPSBTV0FQXzgodmFsKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUV9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OwotCWlmIChnZXRfdWxvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCi0JCXJldHVybiBOVUxMOwotCW1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOwotCXggPSBTRVQoeCwgdmFsLCBzaXplKTsKLQltZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworICAgIGlmIChnZXRfdWxvbmdsb25nKHZhbHVlLCAmdmFsKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbWNweSgmeCwgcHRyLCBzaXplb2YoeCkpOworICAgIHggPSBTRVQoeCwgdmFsLCBzaXplKTsKKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKHgpKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFFfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgZmllbGQ7Ci0JaWYgKGdldF91bG9uZ2xvbmcodmFsdWUsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtY3B5KCZmaWVsZCwgcHRyLCBzaXplb2YoZmllbGQpKTsKLQlmaWVsZCA9IFNXQVBfOChmaWVsZCk7Ci0JZmllbGQgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKVNFVChmaWVsZCwgdmFsLCBzaXplKTsKLQlmaWVsZCA9IFNXQVBfOChmaWVsZCk7Ci0JbWVtY3B5KHB0ciwgJmZpZWxkLCBzaXplb2YoZmllbGQpKTsKLQlfUkVUKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBmaWVsZDsKKyAgICBpZiAoZ2V0X3Vsb25nbG9uZyh2YWx1ZSwgJnZhbCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkoJmZpZWxkLCBwdHIsIHNpemVvZihmaWVsZCkpOworICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKKyAgICBmaWVsZCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpU0VUKGZpZWxkLCB2YWwsIHNpemUpOworICAgIGZpZWxkID0gU1dBUF84KGZpZWxkKTsKKyAgICBtZW1jcHkocHRyLCAmZmllbGQsIHNpemVvZihmaWVsZCkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUV9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JR0VUX0JJVEZJRUxEKHZhbCwgc2l6ZSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWwpOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIEdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFFfZ2V0X3N3KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCXZhbCA9IFNXQVBfOCh2YWwpOwotCUdFVF9CSVRGSUVMRCh2YWwsIHNpemUpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsKTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOworICAgIG1lbWNweSgmdmFsLCBwdHIsIHNpemVvZih2YWwpKTsKKyAgICB2YWwgPSBTV0FQXzgodmFsKTsKKyAgICBHRVRfQklURklFTEQodmFsLCBzaXplKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbCk7CiB9CiAjZW5kaWYKIApAQCAtOTk1LDEzNiArOTk1LDEzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JbG9uZyBkb3VibGUgeDsKKyAgICBsb25nIGRvdWJsZSB4OwogCi0JeCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCSAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtY3B5KHB0ciwgJngsIHNpemVvZihsb25nIGRvdWJsZSkpOwotCV9SRVQodmFsdWUpOworICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiIGZsb2F0IGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZihsb25nIGRvdWJsZSkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ19nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JbG9uZyBkb3VibGUgdmFsOwotCW1lbWNweSgmdmFsLCBwdHIsIHNpemVvZihsb25nIGRvdWJsZSkpOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKKyAgICBsb25nIGRvdWJsZSB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKGxvbmcgZG91YmxlKSk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZF9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlkb3VibGUgeDsKKyAgICBkb3VibGUgeDsKIAotCXggPSBQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbWNweShwdHIsICZ4LCBzaXplb2YoZG91YmxlKSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1jcHkocHRyLCAmeCwgc2l6ZW9mKGRvdWJsZSkpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZF9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JZG91YmxlIHZhbDsKLQltZW1jcHkoJnZhbCwgcHRyLCBzaXplb2YodmFsKSk7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWwpOworICAgIGRvdWJsZSB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JZG91YmxlIHg7CisgICAgZG91YmxlIHg7CiAKLQl4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiIGZsb2F0IGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCWlmIChfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXB0ciwgMSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXB0ciwgMSkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2Vsc2UKLQlpZiAoX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDApKQorICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCV9SRVQodmFsdWUpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZF9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7CiAjaWZkZWYgV09SRFNfQklHRU5ESUFOCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShfUHlGbG9hdF9VbnBhY2s4KHB0ciwgMSkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrOChwdHIsIDEpKTsKICNlbHNlCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShfUHlGbG9hdF9VbnBhY2s4KHB0ciwgMCkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrOChwdHIsIDApKTsKICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZl9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlmbG9hdCB4OworICAgIGZsb2F0IHg7CiAKLQl4ID0gKGZsb2F0KVB5RmxvYXRfQXNEb3VibGUodmFsdWUpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKLQkJCSAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7Ci0JX1JFVCh2YWx1ZSk7CisgICAgeCA9IChmbG9hdClQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiIGZsb2F0IGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtY3B5KHB0ciwgJngsIHNpemVvZih4KSk7CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlmbG9hdCB2YWw7Ci0JbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKKyAgICBmbG9hdCB2YWw7CisgICAgbWVtY3B5KCZ2YWwsIHB0ciwgc2l6ZW9mKHZhbCkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZfc2V0X3N3KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JZmxvYXQgeDsKKyAgICBmbG9hdCB4OwogCi0JeCA9IChmbG9hdClQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIgZmxvYXQgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHggPSAoZmxvYXQpUHlGbG9hdF9Bc0RvdWJsZSh2YWx1ZSk7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiBmbG9hdCBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCWlmIChfUHlGbG9hdF9QYWNrNCh4LCAodW5zaWduZWQgY2hhciAqKXB0ciwgMSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChfUHlGbG9hdF9QYWNrNCh4LCAodW5zaWduZWQgY2hhciAqKXB0ciwgMSkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2Vsc2UKLQlpZiAoX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwdHIsIDApKQorICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCV9SRVQodmFsdWUpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZl9nZXRfc3codm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7CiAjaWZkZWYgV09SRFNfQklHRU5ESUFOCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShfUHlGbG9hdF9VbnBhY2s0KHB0ciwgMSkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrNChwdHIsIDEpKTsKICNlbHNlCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShfUHlGbG9hdF9VbnBhY2s0KHB0ciwgMCkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoX1B5RmxvYXRfVW5wYWNrNChwdHIsIDApKTsKICNlbmRpZgogfQogCkBAIC0xMTQxLDQ1ICsxMTQxLDQ1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogT19nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUHlPYmplY3QgKm9iID0gKihQeU9iamVjdCAqKilwdHI7Ci0JaWYgKG9iID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJLyogU2V0IGFuIGVycm9yIGlmIG5vdCB5ZXQgc2V0ICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIlB5T2JqZWN0IGlzIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihvYik7Ci0JcmV0dXJuIG9iOworICAgIFB5T2JqZWN0ICpvYiA9ICooUHlPYmplY3QgKiopcHRyOworICAgIGlmIChvYiA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIC8qIFNldCBhbiBlcnJvciBpZiBub3QgeWV0IHNldCAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5T2JqZWN0IGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihvYik7CisgICAgcmV0dXJuIG9iOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogT19zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQkvKiBIbSwgZG9lcyB0aGUgbWVtb3J5IGJsb2NrIG5lZWQgaXQncyBvd24gcmVmY291bnQgb3Igbm90PyAqLwotCSooUHlPYmplY3QgKiopcHRyID0gdmFsdWU7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKLQlyZXR1cm4gdmFsdWU7CisgICAgLyogSG0sIGRvZXMgdGhlIG1lbW9yeSBibG9jayBuZWVkIGl0J3Mgb3duIHJlZmNvdW50IG9yIG5vdD8gKi8KKyAgICAqKFB5T2JqZWN0ICoqKXB0ciA9IHZhbHVlOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgcmV0dXJuIHZhbHVlOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpIHx8ICgxICE9IFB5U3RyaW5nX1NpemUodmFsdWUpKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAib25lIGNoYXJhY3RlciBzdHJpbmcgZXhwZWN0ZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSooY2hhciAqKXB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSlbMF07Ci0JX1JFVCh2YWx1ZSk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkgfHwgKDEgIT0gUHlTdHJpbmdfU2l6ZSh2YWx1ZSkpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAib25lIGNoYXJhY3RlciBzdHJpbmcgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICooY2hhciAqKXB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSlbMF07CisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXB0ciwgMSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopcHRyLCAxKTsKIH0KIAogI2lmZGVmIENUWVBFU19VTklDT0RFCkBAIC0xMTg3LDExMiArMTE4NywxMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB1X3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCVB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQl2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCh2YWx1ZSwKLQkJCQkJCSAgICBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcsCi0JCQkJCQkgICAgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7Ci0JCWlmICghdmFsdWUpCi0JCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJCXZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlCi0JCVB5X0lOQ1JFRih2YWx1ZSk7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgeworICAgICAgICB2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uX21vZGVfZXJyb3JzKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bmljb2RlIHN0cmluZyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CiAKLQlsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOwotCWlmIChsZW4gIT0gMSkgewotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJvbmUgY2hhcmFjdGVyIHVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOworICAgIGlmIChsZW4gIT0gMSkgeworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9uZSBjaGFyYWN0ZXIgdW5pY29kZSBzdHJpbmcgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JKih3Y2hhcl90ICopcHRyID0gUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpWzBdOwotCVB5X0RFQ1JFRih2YWx1ZSk7CisgICAgKih3Y2hhcl90ICopcHRyID0gUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpWzBdOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CiAKLQlfUkVUKHZhbHVlKTsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogdV9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKHdjaGFyX3QgKilwdHIsIDEpOworICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKCh3Y2hhcl90ICopcHRyLCAxKTsKIH0KIAogLyogVSAtIGEgdW5pY29kZSBzdHJpbmcgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBVX2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5X3NzaXplX3QgbGVuOwotCVB5X1VOSUNPREUgKnA7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBQeV9VTklDT0RFICpwOwogCi0Jc2l6ZSAvPSBzaXplb2Yod2NoYXJfdCk7IC8qIHdlIGNvdW50IGNoYXJhY3RlciB1bml0cyBoZXJlLCBub3QgYnl0ZXMgKi8KKyAgICBzaXplIC89IHNpemVvZih3Y2hhcl90KTsgLyogd2UgY291bnQgY2hhcmFjdGVyIHVuaXRzIGhlcmUsIG5vdCBieXRlcyAqLwogCi0JcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcigod2NoYXJfdCAqKXB0ciwgc2l6ZSk7Ci0JaWYgKCFyZXN1bHQpCi0JCXJldHVybiBOVUxMOwotCS8qIFdlIG5lZWQgJ3Jlc3VsdCcgdG8gYmUgYWJsZSB0byBjb3VudCB0aGUgY2hhcmFjdGVycyB3aXRoIHdjc2xlbiwKLQkgICBzaW5jZSBwdHIgbWF5IG5vdCBiZSBOVUwgdGVybWluYXRlZC4gIElmIHRoZSBsZW5ndGggaXMgc21hbGxlciAoaWYKLQkgICBpdCB3YXMgYWN0dWFsbHkgTlVMIHRlcm1pbmF0ZWQsIHdlIGNvbnN0cnVjdCBhIG5ldyBvbmUgYW5kIHRocm93Ci0JICAgYXdheSB0aGUgcmVzdWx0LgotCSovCi0JLyogY2hvcCBvZmYgYXQgdGhlIGZpcnN0IE5VTCBjaGFyYWN0ZXIsIGlmIGFueS4gKi8KLQlwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKLQlmb3IgKGxlbiA9IDA7IGxlbiA8IHNpemU7ICsrbGVuKQotCQlpZiAoIXBbbGVuXSkKLQkJCWJyZWFrOworICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKHdjaGFyX3QgKilwdHIsIHNpemUpOworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBXZSBuZWVkICdyZXN1bHQnIHRvIGJlIGFibGUgdG8gY291bnQgdGhlIGNoYXJhY3RlcnMgd2l0aCB3Y3NsZW4sCisgICAgICAgc2luY2UgcHRyIG1heSBub3QgYmUgTlVMIHRlcm1pbmF0ZWQuICBJZiB0aGUgbGVuZ3RoIGlzIHNtYWxsZXIgKGlmCisgICAgICAgaXQgd2FzIGFjdHVhbGx5IE5VTCB0ZXJtaW5hdGVkLCB3ZSBjb25zdHJ1Y3QgYSBuZXcgb25lIGFuZCB0aHJvdworICAgICAgIGF3YXkgdGhlIHJlc3VsdC4KKyAgICAqLworICAgIC8qIGNob3Agb2ZmIGF0IHRoZSBmaXJzdCBOVUwgY2hhcmFjdGVyLCBpZiBhbnkuICovCisgICAgcCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7CisgICAgZm9yIChsZW4gPSAwOyBsZW4gPCBzaXplOyArK2xlbikKKyAgICAgICAgaWYgKCFwW2xlbl0pCisgICAgICAgICAgICBicmVhazsKIAotCWlmIChsZW4gPCBzaXplKSB7Ci0JCVB5T2JqZWN0ICpvYiA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKHdjaGFyX3QgKilwdHIsIGxlbik7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gb2I7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKGxlbiA8IHNpemUpIHsKKyAgICAgICAgUHlPYmplY3QgKm9iID0gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcigod2NoYXJfdCAqKXB0ciwgbGVuKTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBvYjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFVfc2V0KHZvaWQgKnB0ciwgUHlPYmplY3QgKnZhbHVlLCBQeV9zc2l6ZV90IGxlbmd0aCkKIHsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JLyogSXQncyBlYXNpZXIgdG8gY2FsY3VsYXRlIGluIGNoYXJhY3RlcnMgdGhhbiBpbiBieXRlcyAqLwotCWxlbmd0aCAvPSBzaXplb2Yod2NoYXJfdCk7CisgICAgLyogSXQncyBlYXNpZXIgdG8gY2FsY3VsYXRlIGluIGNoYXJhY3RlcnMgdGhhbiBpbiBieXRlcyAqLworICAgIGxlbmd0aCAvPSBzaXplb2Yod2NoYXJfdCk7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCXZhbHVlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHZhbHVlLAotCQkJCQkJICAgIGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywKLQkJCQkJCSAgICBjb252ZXJzaW9uX21vZGVfZXJyb3JzKTsKLQkJaWYgKCF2YWx1ZSkKLQkJCXJldHVybiBOVUxMOwotCX0gZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidW5pY29kZSBzdHJpbmcgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkJdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKLQlpZiAoc2l6ZSA+IGxlbmd0aCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHZhbHVlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKKyAgICBpZiAoc2l6ZSA+IGxlbmd0aCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotCQkJICAgICAic3RyaW5nIHRvbyBsb25nICglZCwgbWF4aW11bSBsZW5ndGggJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdG9vIGxvbmcgKCVkLCBtYXhpbXVtIGxlbmd0aCAlZCkiLAogI2Vsc2UKLQkJCSAgICAgInN0cmluZyB0b28gbG9uZyAoJXpkLCBtYXhpbXVtIGxlbmd0aCAlemQpIiwKKyAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgdG9vIGxvbmcgKCV6ZCwgbWF4aW11bSBsZW5ndGggJXpkKSIsCiAjZW5kaWYKLQkJCSAgICAgc2l6ZSwgbGVuZ3RoKTsKLQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChzaXplIDwgbGVuZ3RoLTEpCi0JCS8qIGNvcHkgdGVybWluYXRpbmcgTlVMIGNoYXJhY3RlciBpZiB0aGVyZSBpcyBzcGFjZSAqLwotCQlzaXplICs9IDE7Ci0JUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLCAod2NoYXJfdCAqKXB0ciwgc2l6ZSk7Ci0JcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgbGVuZ3RoKTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmIChzaXplIDwgbGVuZ3RoLTEpCisgICAgICAgIC8qIGNvcHkgdGVybWluYXRpbmcgTlVMIGNoYXJhY3RlciBpZiB0aGVyZSBpcyBzcGFjZSAqLworICAgICAgICBzaXplICs9IDE7CisgICAgUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLCAod2NoYXJfdCAqKXB0ciwgc2l6ZSk7CisgICAgcmV0dXJuIHZhbHVlOwogfQogCiAjZW5kaWYKQEAgLTEzMDAsMjAxICsxMzAwLDIwMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0Jc2l6ZV90IHNsZW47CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBzaXplX3Qgc2xlbjsKIAotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoKGNoYXIgKilwdHIpOwotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gTlVMTDsKLQkvKiBjaG9wIG9mZiBhdCB0aGUgZmlyc3QgTlVMIGNoYXJhY3RlciwgaWYgYW55LgotCSAqIE9uIGVycm9yLCByZXN1bHQgd2lsbCBiZSBkZWFsbG9jYXRlZCBhbmQgc2V0IHRvIE5VTEwuCi0JICovCi0Jc2xlbiA9IHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KSk7Ci0Jc2l6ZSA9IG1pbihzaXplLCAoUHlfc3NpemVfdClzbGVuKTsKLQlpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkgewotCQkvKiBzaG9ydGVuIHRoZSByZXN1bHQgKi8KLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBzaXplKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9IGVsc2UKLQkJLyogY2Fubm90IHNob3J0ZW4gdGhlIHJlc3VsdCAqLwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocHRyLCBzaXplKTsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyICopcHRyKTsKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogY2hvcCBvZmYgYXQgdGhlIGZpcnN0IE5VTCBjaGFyYWN0ZXIsIGlmIGFueS4KKyAgICAgKiBPbiBlcnJvciwgcmVzdWx0IHdpbGwgYmUgZGVhbGxvY2F0ZWQgYW5kIHNldCB0byBOVUxMLgorICAgICAqLworICAgIHNsZW4gPSBzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkpOworICAgIHNpemUgPSBtaW4oc2l6ZSwgKFB5X3NzaXplX3Qpc2xlbik7CisgICAgaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpIHsKKyAgICAgICAgLyogc2hvcnRlbiB0aGUgcmVzdWx0ICovCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgc2l6ZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBlbHNlCisgICAgICAgIC8qIGNhbm5vdCBzaG9ydGVuIHRoZSByZXN1bHQgKi8KKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHB0ciwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBsZW5ndGgpCiB7Ci0JY2hhciAqZGF0YTsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgY2hhciAqZGF0YTsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOwotCWlmICghZGF0YSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2l6ZSA9IHN0cmxlbihkYXRhKTsKLQlpZiAoc2l6ZSA8IGxlbmd0aCkgewotCQkvKiBUaGlzIHdpbGwgY29weSB0aGUgbGVhZGluZyBOVUwgY2hhcmFjdGVyCi0JCSAqIGlmIHRoZXJlIGlzIHNwYWNlIGZvciBpdC4KLQkJICovCi0JCSsrc2l6ZTsKLQl9IGVsc2UgaWYgKHNpemUgPiBsZW5ndGgpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgZGF0YSA9IFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKKyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNpemUgPSBzdHJsZW4oZGF0YSk7CisgICAgaWYgKHNpemUgPCBsZW5ndGgpIHsKKyAgICAgICAgLyogVGhpcyB3aWxsIGNvcHkgdGhlIGxlYWRpbmcgTlVMIGNoYXJhY3RlcgorICAgICAgICAgKiBpZiB0aGVyZSBpcyBzcGFjZSBmb3IgaXQuCisgICAgICAgICAqLworICAgICAgICArK3NpemU7CisgICAgfSBlbHNlIGlmIChzaXplID4gbGVuZ3RoKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkgICAgICJzdHJpbmcgdG9vIGxvbmcgKCVkLCBtYXhpbXVtIGxlbmd0aCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgInN0cmluZyB0b28gbG9uZyAoJWQsIG1heGltdW0gbGVuZ3RoICVkKSIsCiAjZWxzZQotCQkJICAgICAic3RyaW5nIHRvbyBsb25nICglemQsIG1heGltdW0gbGVuZ3RoICV6ZCkiLAorICAgICAgICAgICAgICAgICAgICAgInN0cmluZyB0b28gbG9uZyAoJXpkLCBtYXhpbXVtIGxlbmd0aCAlemQpIiwKICNlbmRpZgotCQkJICAgICBzaXplLCBsZW5ndGgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogQWxzbyBjb3B5IHRoZSB0ZXJtaW5hdGluZyBOVUwgY2hhcmFjdGVyIGlmIHRoZXJlIGlzIHNwYWNlICovCi0JbWVtY3B5KChjaGFyICopcHRyLCBkYXRhLCBzaXplKTsKLQlfUkVUKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgIHNpemUsIGxlbmd0aCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBBbHNvIGNvcHkgdGhlIHRlcm1pbmF0aW5nIE5VTCBjaGFyYWN0ZXIgaWYgdGhlcmUgaXMgc3BhY2UgKi8KKyAgICBtZW1jcHkoKGNoYXIgKilwdHIsIGRhdGEsIHNpemUpOworICAgIF9SRVQodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogel9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlpZiAodmFsdWUgPT0gUHlfTm9uZSkgewotCQkqKGNoYXIgKiopcHRyID0gTlVMTDsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQlpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCSooY2hhciAqKilwdHIgPSBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpOwotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5T2JqZWN0ICpzdHIgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHZhbHVlLAotCQkJCQkJCSAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAotCQkJCQkJCSAgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7Ci0JCWlmIChzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQkqKGNoYXIgKiopcHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cik7Ci0JCXJldHVybiBzdHI7Ci0JfSBlbHNlIGlmIChQeUludF9DaGVjayh2YWx1ZSkgfHwgUHlMb25nX0NoZWNrKHZhbHVlKSkgeworICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgICooY2hhciAqKilwdHIgPSBOVUxMOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgKihjaGFyICoqKXB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSk7CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlPYmplY3QgKnN0ciA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7CisgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAqKGNoYXIgKiopcHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cik7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfSBlbHNlIGlmIChQeUludF9DaGVjayh2YWx1ZSkgfHwgUHlMb25nX0NoZWNrKHZhbHVlKSkgewogI2lmIFNJWkVPRl9WT0lEX1AgPT0gU0laRU9GX0xPTkdfTE9ORwotCQkqKGNoYXIgKiopcHRyID0gKGNoYXIgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHZhbHVlKTsKKyAgICAgICAgKihjaGFyICoqKXB0ciA9IChjaGFyICopUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2YWx1ZSk7CiAjZWxzZQotCQkqKGNoYXIgKiopcHRyID0gKGNoYXIgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodmFsdWUpOworICAgICAgICAqKGNoYXIgKiopcHRyID0gKGNoYXIgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodmFsdWUpOwogI2VuZGlmCi0JCV9SRVQodmFsdWUpOwotCX0KLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJzdHJpbmcgb3IgaW50ZWdlciBhZGRyZXNzIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgX1JFVCh2YWx1ZSk7CisgICAgfQorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJzdHJpbmcgb3IgaW50ZWdlciBhZGRyZXNzIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAorICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB6X2dldCh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQkvKiBYWFggV2hhdCBhYm91dCBpbnZhbGlkIHBvaW50ZXJzID8/PyAqLwotCWlmICgqKHZvaWQgKiopcHRyKSB7CisgICAgLyogWFhYIFdoYXQgYWJvdXQgaW52YWxpZCBwb2ludGVycyA/Pz8gKi8KKyAgICBpZiAoKih2b2lkICoqKXB0cikgewogI2lmIGRlZmluZWQoTVNfV0lOMzIpICYmICFkZWZpbmVkKF9XSU4zMl9XQ0UpCi0JCWlmIChJc0JhZFN0cmluZ1B0ckEoKihjaGFyICoqKXB0ciwgLTEpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICJpbnZhbGlkIHN0cmluZyBwb2ludGVyICVwIiwKLQkJCQkgICAgICooY2hhciAqKilwdHIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKElzQmFkU3RyaW5nUHRyQSgqKGNoYXIgKiopcHRyLCAtMSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmluZyBwb2ludGVyICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqKGNoYXIgKiopcHRyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoKihjaGFyICoqKXB0cik7Ci0JfSBlbHNlIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCooY2hhciAqKilwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogfQogCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKIHN0YXRpYyBQeU9iamVjdCAqCiBaX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCWlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7Ci0JCSood2NoYXJfdCAqKilwdHIgPSBOVUxMOwotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCWlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJdmFsdWUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QodmFsdWUsCi0JCQkJCQkgICAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAotCQkJCQkJICAgIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOwotCQlpZiAoIXZhbHVlKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChQeUludF9DaGVjayh2YWx1ZSkgfHwgUHlMb25nX0NoZWNrKHZhbHVlKSkgeworICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgICood2NoYXJfdCAqKilwdHIgPSBOVUxMOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QodmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25fbW9kZV9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl9tb2RlX2Vycm9ycyk7CisgICAgICAgIGlmICghdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHZhbHVlKSB8fCBQeUxvbmdfQ2hlY2sodmFsdWUpKSB7CiAjaWYgU0laRU9GX1ZPSURfUCA9PSBTSVpFT0ZfTE9OR19MT05HCi0JCSood2NoYXJfdCAqKilwdHIgPSAod2NoYXJfdCAqKVB5SW50X0FzVW5zaWduZWRMb25nTG9uZ01hc2sodmFsdWUpOworICAgICAgICAqKHdjaGFyX3QgKiopcHRyID0gKHdjaGFyX3QgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHZhbHVlKTsKICNlbHNlCi0JCSood2NoYXJfdCAqKilwdHIgPSAod2NoYXJfdCAqKVB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2YWx1ZSk7CisgICAgICAgICood2NoYXJfdCAqKilwdHIgPSAod2NoYXJfdCAqKVB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2YWx1ZSk7CiAjZW5kaWYKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9IGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJ1bmljb2RlIHN0cmluZyBvciBpbnRlZ2VyIGFkZHJlc3MgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCi0JCQkgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlCi0JCVB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfSBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInVuaWNvZGUgc3RyaW5nIG9yIGludGVnZXIgYWRkcmVzcyBleHBlY3RlZCBpbnN0ZWFkIG9mICVzIGluc3RhbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlCisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CiAjaWZkZWYgSEFWRV9VU0FCTEVfV0NIQVJfVAotCS8qIEhBVkVfVVNBQkxFX1dDSEFSX1QgbWVhbnMgdGhhdCBQeV9VTklDT0RFIGFuZCB3Y2hhcl90IGlzIHRoZSBzYW1lCi0JICAgdHlwZS4gIFNvIHdlIGNhbiBjb3B5IGRpcmVjdGx5LiAgSG0sIGFyZSB1bmljb2RlIG9iamVjdHMgYWx3YXlzIE5VTAotCSAgIHRlcm1pbmF0ZWQgaW4gUHl0aG9uLCBpbnRlcm5hbGx5PwotCSAqLwotCSood2NoYXJfdCAqKilwdHIgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2YWx1ZSk7Ci0JcmV0dXJuIHZhbHVlOworICAgIC8qIEhBVkVfVVNBQkxFX1dDSEFSX1QgbWVhbnMgdGhhdCBQeV9VTklDT0RFIGFuZCB3Y2hhcl90IGlzIHRoZSBzYW1lCisgICAgICAgdHlwZS4gIFNvIHdlIGNhbiBjb3B5IGRpcmVjdGx5LiAgSG0sIGFyZSB1bmljb2RlIG9iamVjdHMgYWx3YXlzIE5VTAorICAgICAgIHRlcm1pbmF0ZWQgaW4gUHl0aG9uLCBpbnRlcm5hbGx5PworICAgICAqLworICAgICood2NoYXJfdCAqKilwdHIgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2YWx1ZSk7CisgICAgcmV0dXJuIHZhbHVlOwogI2Vsc2UKLQl7Ci0JCS8qIFdlIG11c3QgY3JlYXRlIGEgd2NoYXJfdCogYnVmZmVyIGZyb20gdGhlIHVuaWNvZGUgb2JqZWN0LAotCQkgICBhbmQga2VlcCBpdCBhbGl2ZSAqLwotCQlQeU9iamVjdCAqa2VlcDsKLQkJd2NoYXJfdCAqYnVmZmVyOworICAgIHsKKyAgICAgICAgLyogV2UgbXVzdCBjcmVhdGUgYSB3Y2hhcl90KiBidWZmZXIgZnJvbSB0aGUgdW5pY29kZSBvYmplY3QsCisgICAgICAgICAgIGFuZCBrZWVwIGl0IGFsaXZlICovCisgICAgICAgIFB5T2JqZWN0ICprZWVwOworICAgICAgICB3Y2hhcl90ICpidWZmZXI7CiAKLQkJaW50IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOwotCQlzaXplICs9IDE7IC8qIHRlcm1pbmF0aW5nIE5VTCAqLwotCQlzaXplICo9IHNpemVvZih3Y2hhcl90KTsKLQkJYnVmZmVyID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2Moc2l6ZSk7Ci0JCWlmICghYnVmZmVyKSB7Ci0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KLQkJbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZSk7Ci0JCWtlZXAgPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoYnVmZmVyLCBQeU1lbV9GcmVlKTsKLQkJaWYgKCFrZWVwKSB7Ci0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJUHlNZW1fRnJlZShidWZmZXIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJKih3Y2hhcl90ICoqKXB0ciA9ICh3Y2hhcl90ICopYnVmZmVyOwotCQlpZiAoLTEgPT0gUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLAotCQkJCQkgICAgICAgYnVmZmVyLCBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpKSkgewotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCVB5X0RFQ1JFRihrZWVwKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiBrZWVwOwotCX0KKyAgICAgICAgaW50IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOworICAgICAgICBzaXplICs9IDE7IC8qIHRlcm1pbmF0aW5nIE5VTCAqLworICAgICAgICBzaXplICo9IHNpemVvZih3Y2hhcl90KTsKKyAgICAgICAgYnVmZmVyID0gKHdjaGFyX3QgKilQeU1lbV9NYWxsb2Moc2l6ZSk7CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZSk7CisgICAgICAgIGtlZXAgPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoYnVmZmVyLCBQeU1lbV9GcmVlKTsKKyAgICAgICAgaWYgKCFrZWVwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgUHlNZW1fRnJlZShidWZmZXIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKih3Y2hhcl90ICoqKXB0ciA9ICh3Y2hhcl90ICopYnVmZmVyOworICAgICAgICBpZiAoLTEgPT0gUHlVbmljb2RlX0FzV2lkZUNoYXIoKFB5VW5pY29kZU9iamVjdCAqKXZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZWVwKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiBrZWVwOworICAgIH0KICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogWl9nZXQodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0Jd2NoYXJfdCAqcDsKLQlwID0gKih3Y2hhcl90ICoqKXB0cjsKLQlpZiAocCkgeworICAgIHdjaGFyX3QgKnA7CisgICAgcCA9ICood2NoYXJfdCAqKilwdHI7CisgICAgaWYgKHApIHsKICNpZiBkZWZpbmVkKE1TX1dJTjMyKSAmJiAhZGVmaW5lZChfV0lOMzJfV0NFKQotCQlpZiAoSXNCYWRTdHJpbmdQdHJXKCood2NoYXJfdCAqKilwdHIsIC0xKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgICAiaW52YWxpZCBzdHJpbmcgcG9pbnRlciAlcCIsCi0JCQkJICAgICAqKHdjaGFyX3QgKiopcHRyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGlmIChJc0JhZFN0cmluZ1B0clcoKih3Y2hhcl90ICoqKXB0ciwgLTEpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBzdHJpbmcgcG9pbnRlciAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKih3Y2hhcl90ICoqKXB0cik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JCXJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHAsIHdjc2xlbihwKSk7Ci0JfSBlbHNlIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKHAsIHdjc2xlbihwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CiB9CiAjZW5kaWYKIApAQCAtMTUwMiwxNjYgKzE1MDIsMTY2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQlNUUl9zZXQodm9pZCAqcHRyLCBQeU9iamVjdCAqdmFsdWUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlCU1RSIGJzdHI7CisgICAgQlNUUiBic3RyOwogCi0JLyogY29udmVydCB2YWx1ZSBpbnRvIGEgUHlVbmljb2RlT2JqZWN0IG9yIE5VTEwgKi8KLQlpZiAoUHlfTm9uZSA9PSB2YWx1ZSkgewotCQl2YWx1ZSA9IE5VTEw7Ci0JfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJdmFsdWUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QodmFsdWUsCi0JCQkJCQkgICAgY29udmVyc2lvbl9tb2RlX2VuY29kaW5nLAotCQkJCQkJICAgIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOwotCQlpZiAoIXZhbHVlKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7IC8qIGZvciB0aGUgZGVzY3JlZiBiZWxvdyAqLwotCX0gZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInVuaWNvZGUgc3RyaW5nIGV4cGVjdGVkIGluc3RlYWQgb2YgJXMgaW5zdGFuY2UiLAotCQkJCXZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIGNvbnZlcnQgdmFsdWUgaW50byBhIFB5VW5pY29kZU9iamVjdCBvciBOVUxMICovCisgICAgaWYgKFB5X05vbmUgPT0gdmFsdWUpIHsKKyAgICAgICAgdmFsdWUgPSBOVUxMOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIHZhbHVlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uX21vZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25fbW9kZV9lcnJvcnMpOworICAgICAgICBpZiAoIXZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7IC8qIGZvciB0aGUgZGVzY3JlZiBiZWxvdyAqLworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5pY29kZSBzdHJpbmcgZXhwZWN0ZWQgaW5zdGVhZCBvZiAlcyBpbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIGNyZWF0ZSBhIEJTVFIgZnJvbSB2YWx1ZSAqLwotCWlmICh2YWx1ZSkgewotCQlQeV9zc2l6ZV90IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOwotCQlpZiAoKHVuc2lnbmVkKSBzaXplICE9IHNpemUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiU3RyaW5nIHRvbyBsb25nIGZvciBCU1RSIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlic3RyID0gU3lzQWxsb2NTdHJpbmdMZW4oUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpLAotCQkJCQkgKHVuc2lnbmVkKXNpemUpOwotCQlQeV9ERUNSRUYodmFsdWUpOwotCX0gZWxzZQotCQlic3RyID0gTlVMTDsKKyAgICAvKiBjcmVhdGUgYSBCU1RSIGZyb20gdmFsdWUgKi8KKyAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKKyAgICAgICAgaWYgKCh1bnNpZ25lZCkgc2l6ZSAhPSBzaXplKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIlN0cmluZyB0b28gbG9uZyBmb3IgQlNUUiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnN0ciA9IFN5c0FsbG9jU3RyaW5nTGVuKFB5VW5pY29kZV9BU19VTklDT0RFKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClzaXplKTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICB9IGVsc2UKKyAgICAgICAgYnN0ciA9IE5VTEw7CiAKLQkvKiBmcmVlIHRoZSBwcmV2aW91cyBjb250ZW50cywgaWYgYW55ICovCi0JaWYgKCooQlNUUiAqKXB0cikKLQkJU3lzRnJlZVN0cmluZygqKEJTVFIgKilwdHIpOwotCQotCS8qIGFuZCBzdG9yZSBpdCAqLwotCSooQlNUUiAqKXB0ciA9IGJzdHI7CisgICAgLyogZnJlZSB0aGUgcHJldmlvdXMgY29udGVudHMsIGlmIGFueSAqLworICAgIGlmICgqKEJTVFIgKilwdHIpCisgICAgICAgIFN5c0ZyZWVTdHJpbmcoKihCU1RSICopcHRyKTsKIAotCS8qIFdlIGRvbid0IG5lZWQgdG8ga2VlcCBhbnkgb3RoZXIgb2JqZWN0ICovCi0JX1JFVCh2YWx1ZSk7CisgICAgLyogYW5kIHN0b3JlIGl0ICovCisgICAgKihCU1RSICopcHRyID0gYnN0cjsKKworICAgIC8qIFdlIGRvbid0IG5lZWQgdG8ga2VlcCBhbnkgb3RoZXIgb2JqZWN0ICovCisgICAgX1JFVCh2YWx1ZSk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIEJTVFJfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCUJTVFIgcDsKLQlwID0gKihCU1RSICopcHRyOwotCWlmIChwKQotCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwLCBTeXNTdHJpbmdMZW4ocCkpOwotCWVsc2UgewotCQkvKiBIbSwgaXQgc2VlbXMgTlVMTCBwb2ludGVyIGFuZCB6ZXJvIGxlbmd0aCBzdHJpbmcgYXJlIHRoZQotCQkgICBzYW1lIGluIEJTVFIsIHNlZSBEb24gQm94LCBwIDgxCi0JCSovCi0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIEJTVFIgcDsKKyAgICBwID0gKihCU1RSICopcHRyOworICAgIGlmIChwKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihwLCBTeXNTdHJpbmdMZW4ocCkpOworICAgIGVsc2UgeworICAgICAgICAvKiBIbSwgaXQgc2VlbXMgTlVMTCBwb2ludGVyIGFuZCB6ZXJvIGxlbmd0aCBzdHJpbmcgYXJlIHRoZQorICAgICAgICAgICBzYW1lIGluIEJTVFIsIHNlZSBEb24gQm94LCBwIDgxCisgICAgICAgICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQX3NldCh2b2lkICpwdHIsIFB5T2JqZWN0ICp2YWx1ZSwgUHlfc3NpemVfdCBzaXplKQogewotCXZvaWQgKnY7Ci0JaWYgKHZhbHVlID09IFB5X05vbmUpIHsKLQkJKih2b2lkICoqKXB0ciA9IE5VTEw7Ci0JCV9SRVQodmFsdWUpOwotCX0KKyAgICB2b2lkICp2OworICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgICoodm9pZCAqKilwdHIgPSBOVUxMOworICAgICAgICBfUkVUKHZhbHVlKTsKKyAgICB9CiAKLQlpZiAoIVB5SW50X0NoZWNrKHZhbHVlKSAmJiAhUHlMb25nX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjYW5ub3QgYmUgY29udmVydGVkIHRvIHBvaW50ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlJbnRfQ2hlY2sodmFsdWUpICYmICFQeUxvbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGJlIGNvbnZlcnRlZCB0byBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogI2lmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcKLQl2ID0gKHZvaWQgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodmFsdWUpOworICAgIHYgPSAodm9pZCAqKVB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2YWx1ZSk7CiAjZWxzZQogI2lmbmRlZiBIQVZFX0xPTkdfTE9ORwogIyAgIGVycm9yICJQeUxvbmdfQXNWb2lkUHRyOiBzaXplb2Yodm9pZCopID4gc2l6ZW9mKGxvbmcpLCBidXQgbm8gbG9uZyBsb25nIgogI2VsaWYgU0laRU9GX0xPTkdfTE9ORyA8IFNJWkVPRl9WT0lEX1AKICMgICBlcnJvciAiUHlMb25nX0FzVm9pZFB0cjogc2l6ZW9mKFBZX0xPTkdfTE9ORykgPCBzaXplb2Yodm9pZCopIgogI2VuZGlmCi0JdiA9ICh2b2lkICopUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2YWx1ZSk7CisgICAgdiA9ICh2b2lkICopUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayh2YWx1ZSk7CiAjZW5kaWYKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkqKHZvaWQgKiopcHRyID0gdjsKLQlfUkVUKHZhbHVlKTsKKyAgICAqKHZvaWQgKiopcHRyID0gdjsKKyAgICBfUkVUKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBfZ2V0KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCWlmICgqKHZvaWQgKiopcHRyID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cigqKHZvaWQgKiopcHRyKTsKKyAgICBpZiAoKih2b2lkICoqKXB0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoKih2b2lkICoqKXB0cik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmllbGRkZXNjIGZvcm1hdHRhYmxlW10gPSB7Ci0JeyAncycsIHNfc2V0LCBzX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAotCXsgJ2InLCBiX3NldCwgYl9nZXQsICZmZmlfdHlwZV9zY2hhcn0sCi0JeyAnQicsIEJfc2V0LCBCX2dldCwgJmZmaV90eXBlX3VjaGFyfSwKLQl7ICdjJywgY19zZXQsIGNfZ2V0LCAmZmZpX3R5cGVfc2NoYXJ9LAotCXsgJ2QnLCBkX3NldCwgZF9nZXQsICZmZmlfdHlwZV9kb3VibGUsIGRfc2V0X3N3LCBkX2dldF9zd30sCi0JeyAnZycsIGdfc2V0LCBnX2dldCwgJmZmaV90eXBlX2xvbmdkb3VibGV9LAotCXsgJ2YnLCBmX3NldCwgZl9nZXQsICZmZmlfdHlwZV9mbG9hdCwgZl9zZXRfc3csIGZfZ2V0X3N3fSwKLQl7ICdoJywgaF9zZXQsIGhfZ2V0LCAmZmZpX3R5cGVfc3Nob3J0LCBoX3NldF9zdywgaF9nZXRfc3d9LAotCXsgJ0gnLCBIX3NldCwgSF9nZXQsICZmZmlfdHlwZV91c2hvcnQsIEhfc2V0X3N3LCBIX2dldF9zd30sCi0JeyAnaScsIGlfc2V0LCBpX2dldCwgJmZmaV90eXBlX3NpbnQsIGlfc2V0X3N3LCBpX2dldF9zd30sCi0JeyAnSScsIElfc2V0LCBJX2dldCwgJmZmaV90eXBlX3VpbnQsIElfc2V0X3N3LCBJX2dldF9zd30sCisgICAgeyAncycsIHNfc2V0LCBzX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAorICAgIHsgJ2InLCBiX3NldCwgYl9nZXQsICZmZmlfdHlwZV9zY2hhcn0sCisgICAgeyAnQicsIEJfc2V0LCBCX2dldCwgJmZmaV90eXBlX3VjaGFyfSwKKyAgICB7ICdjJywgY19zZXQsIGNfZ2V0LCAmZmZpX3R5cGVfc2NoYXJ9LAorICAgIHsgJ2QnLCBkX3NldCwgZF9nZXQsICZmZmlfdHlwZV9kb3VibGUsIGRfc2V0X3N3LCBkX2dldF9zd30sCisgICAgeyAnZycsIGdfc2V0LCBnX2dldCwgJmZmaV90eXBlX2xvbmdkb3VibGV9LAorICAgIHsgJ2YnLCBmX3NldCwgZl9nZXQsICZmZmlfdHlwZV9mbG9hdCwgZl9zZXRfc3csIGZfZ2V0X3N3fSwKKyAgICB7ICdoJywgaF9zZXQsIGhfZ2V0LCAmZmZpX3R5cGVfc3Nob3J0LCBoX3NldF9zdywgaF9nZXRfc3d9LAorICAgIHsgJ0gnLCBIX3NldCwgSF9nZXQsICZmZmlfdHlwZV91c2hvcnQsIEhfc2V0X3N3LCBIX2dldF9zd30sCisgICAgeyAnaScsIGlfc2V0LCBpX2dldCwgJmZmaV90eXBlX3NpbnQsIGlfc2V0X3N3LCBpX2dldF9zd30sCisgICAgeyAnSScsIElfc2V0LCBJX2dldCwgJmZmaV90eXBlX3VpbnQsIElfc2V0X3N3LCBJX2dldF9zd30sCiAvKiBYWFggSG0sIHNpemVvZihpbnQpID09IHNpemVvZihsb25nKSBkb2Vzbid0IGhvbGQgb24gZXZlcnkgcGxhdGZvcm0gKi8KIC8qIEFzIHNvb24gYXMgd2UgY2FuIGdldCByaWQgb2YgdGhlIHR5cGUgY29kZXMsIHRoaXMgaXMgbm8gbG9uZ2VyIGEgcHJvYmxlbSAqLwogI2lmIFNJWkVPRl9MT05HID09IDQKLQl7ICdsJywgbF9zZXQsIGxfZ2V0LCAmZmZpX3R5cGVfc2ludDMyLCBsX3NldF9zdywgbF9nZXRfc3d9LAotCXsgJ0wnLCBMX3NldCwgTF9nZXQsICZmZmlfdHlwZV91aW50MzIsIExfc2V0X3N3LCBMX2dldF9zd30sCisgICAgeyAnbCcsIGxfc2V0LCBsX2dldCwgJmZmaV90eXBlX3NpbnQzMiwgbF9zZXRfc3csIGxfZ2V0X3N3fSwKKyAgICB7ICdMJywgTF9zZXQsIExfZ2V0LCAmZmZpX3R5cGVfdWludDMyLCBMX3NldF9zdywgTF9nZXRfc3d9LAogI2VsaWYgU0laRU9GX0xPTkcgPT0gOAotCXsgJ2wnLCBsX3NldCwgbF9nZXQsICZmZmlfdHlwZV9zaW50NjQsIGxfc2V0X3N3LCBsX2dldF9zd30sCi0JeyAnTCcsIExfc2V0LCBMX2dldCwgJmZmaV90eXBlX3VpbnQ2NCwgTF9zZXRfc3csIExfZ2V0X3N3fSwKKyAgICB7ICdsJywgbF9zZXQsIGxfZ2V0LCAmZmZpX3R5cGVfc2ludDY0LCBsX3NldF9zdywgbF9nZXRfc3d9LAorICAgIHsgJ0wnLCBMX3NldCwgTF9nZXQsICZmZmlfdHlwZV91aW50NjQsIExfc2V0X3N3LCBMX2dldF9zd30sCiAjZWxzZQogIyBlcnJvcgogI2VuZGlmCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKICNpZiBTSVpFT0ZfTE9OR19MT05HID09IDgKLQl7ICdxJywgcV9zZXQsIHFfZ2V0LCAmZmZpX3R5cGVfc2ludDY0LCBxX3NldF9zdywgcV9nZXRfc3d9LAotCXsgJ1EnLCBRX3NldCwgUV9nZXQsICZmZmlfdHlwZV91aW50NjQsIFFfc2V0X3N3LCBRX2dldF9zd30sCisgICAgeyAncScsIHFfc2V0LCBxX2dldCwgJmZmaV90eXBlX3NpbnQ2NCwgcV9zZXRfc3csIHFfZ2V0X3N3fSwKKyAgICB7ICdRJywgUV9zZXQsIFFfZ2V0LCAmZmZpX3R5cGVfdWludDY0LCBRX3NldF9zdywgUV9nZXRfc3d9LAogI2Vsc2UKICMgZXJyb3IKICNlbmRpZgogI2VuZGlmCi0JeyAnUCcsIFBfc2V0LCBQX2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAotCXsgJ3onLCB6X3NldCwgel9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKKyAgICB7ICdQJywgUF9zZXQsIFBfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCisgICAgeyAneicsIHpfc2V0LCB6X2dldCwgJmZmaV90eXBlX3BvaW50ZXJ9LAogI2lmZGVmIENUWVBFU19VTklDT0RFCi0JeyAndScsIHVfc2V0LCB1X2dldCwgTlVMTH0sIC8qIGZmaV90eXBlIHNldCBsYXRlciAqLwotCXsgJ1UnLCBVX3NldCwgVV9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKLQl7ICdaJywgWl9zZXQsIFpfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCisgICAgeyAndScsIHVfc2V0LCB1X2dldCwgTlVMTH0sIC8qIGZmaV90eXBlIHNldCBsYXRlciAqLworICAgIHsgJ1UnLCBVX3NldCwgVV9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKKyAgICB7ICdaJywgWl9zZXQsIFpfZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCiAjZW5kaWYKICNpZmRlZiBNU19XSU4zMgotCXsgJ1gnLCBCU1RSX3NldCwgQlNUUl9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKLQl7ICd2JywgdkJPT0xfc2V0LCB2Qk9PTF9nZXQsICZmZmlfdHlwZV9zc2hvcnR9LAorICAgIHsgJ1gnLCBCU1RSX3NldCwgQlNUUl9nZXQsICZmZmlfdHlwZV9wb2ludGVyfSwKKyAgICB7ICd2JywgdkJPT0xfc2V0LCB2Qk9PTF9nZXQsICZmZmlfdHlwZV9zc2hvcnR9LAogI2VuZGlmCiAjaWYgU0laRU9GX19CT09MID09IDEKLQl7ICc/JywgYm9vbF9zZXQsIGJvb2xfZ2V0LCAmZmZpX3R5cGVfdWNoYXJ9LCAvKiBBbHNvIGZhbGxiYWNrIGZvciBubyBuYXRpdmUgX0Jvb2wgc3VwcG9ydCAqLworICAgIHsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91Y2hhcn0sIC8qIEFsc28gZmFsbGJhY2sgZm9yIG5vIG5hdGl2ZSBfQm9vbCBzdXBwb3J0ICovCiAjZWxpZiBTSVpFT0ZfX0JPT0wgPT0gU0laRU9GX1NIT1JUCi0JeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3VzaG9ydH0sCisgICAgeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3VzaG9ydH0sCiAjZWxpZiBTSVpFT0ZfX0JPT0wgPT0gU0laRU9GX0lOVAotCXsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91aW50LCBJX3NldF9zdywgSV9nZXRfc3d9LAorICAgIHsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91aW50LCBJX3NldF9zdywgSV9nZXRfc3d9LAogI2VsaWYgU0laRU9GX19CT09MID09IFNJWkVPRl9MT05HCi0JeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3Vsb25nLCBMX3NldF9zdywgTF9nZXRfc3d9LAorICAgIHsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91bG9uZywgTF9zZXRfc3csIExfZ2V0X3N3fSwKICNlbGlmIFNJWkVPRl9fQk9PTCA9PSBTSVpFT0ZfTE9OR19MT05HCi0JeyAnPycsIGJvb2xfc2V0LCBib29sX2dldCwgJmZmaV90eXBlX3Vsb25nLCBRX3NldF9zdywgUV9nZXRfc3d9LAorICAgIHsgJz8nLCBib29sX3NldCwgYm9vbF9nZXQsICZmZmlfdHlwZV91bG9uZywgUV9zZXRfc3csIFFfZ2V0X3N3fSwKICNlbmRpZiAvKiBTSVpFT0ZfX0JPT0wgKi8KLQl7ICdPJywgT19zZXQsIE9fZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCi0JeyAwLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7ICdPJywgT19zZXQsIE9fZ2V0LCAmZmZpX3R5cGVfcG9pbnRlcn0sCisgICAgeyAwLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIC8qCkBAIC0xNjcyLDI2ICsxNjcyLDI2IEBACiBzdHJ1Y3QgZmllbGRkZXNjICoKIGdldGVudHJ5KGNoYXIgKmZtdCkKIHsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLQlzdHJ1Y3QgZmllbGRkZXNjICp0YWJsZSA9IGZvcm1hdHRhYmxlOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICAgIHN0cnVjdCBmaWVsZGRlc2MgKnRhYmxlID0gZm9ybWF0dGFibGU7CiAKLQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCWluaXRpYWxpemVkID0gMTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIGluaXRpYWxpemVkID0gMTsKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCQlpZiAoc2l6ZW9mKHdjaGFyX3QpID09IHNpemVvZihzaG9ydCkpCi0JCQlnZXRlbnRyeSgidSIpLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfc3Nob3J0OwotCQllbHNlIGlmIChzaXplb2Yod2NoYXJfdCkgPT0gc2l6ZW9mKGludCkpCi0JCQlnZXRlbnRyeSgidSIpLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfc2ludDsKLQkJZWxzZSBpZiAoc2l6ZW9mKHdjaGFyX3QpID09IHNpemVvZihsb25nKSkKLQkJCWdldGVudHJ5KCJ1IiktPnBmZmlfdHlwZSA9ICZmZmlfdHlwZV9zbG9uZzsKKyAgICAgICAgaWYgKHNpemVvZih3Y2hhcl90KSA9PSBzaXplb2Yoc2hvcnQpKQorICAgICAgICAgICAgZ2V0ZW50cnkoInUiKS0+cGZmaV90eXBlID0gJmZmaV90eXBlX3NzaG9ydDsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZW9mKHdjaGFyX3QpID09IHNpemVvZihpbnQpKQorICAgICAgICAgICAgZ2V0ZW50cnkoInUiKS0+cGZmaV90eXBlID0gJmZmaV90eXBlX3NpbnQ7CisgICAgICAgIGVsc2UgaWYgKHNpemVvZih3Y2hhcl90KSA9PSBzaXplb2YobG9uZykpCisgICAgICAgICAgICBnZXRlbnRyeSgidSIpLT5wZmZpX3R5cGUgPSAmZmZpX3R5cGVfc2xvbmc7CiAjZW5kaWYKLQl9CisgICAgfQogCi0JZm9yICg7IHRhYmxlLT5jb2RlOyArK3RhYmxlKSB7Ci0JCWlmICh0YWJsZS0+Y29kZSA9PSBmbXRbMF0pCi0JCQlyZXR1cm4gdGFibGU7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGZvciAoOyB0YWJsZS0+Y29kZTsgKyt0YWJsZSkgeworICAgICAgICBpZiAodGFibGUtPmNvZGUgPT0gZm10WzBdKQorICAgICAgICAgICAgcmV0dXJuIHRhYmxlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGM7IGNoYXIgeDsgfSBzX2NoYXI7CkBAIC0xNzM1LDEwICsxNzM1LDEwIEBACiAvKiBmcm9tIGZmaS5oOgogdHlwZWRlZiBzdHJ1Y3QgX2ZmaV90eXBlCiB7Ci0Jc2l6ZV90IHNpemU7Ci0JdW5zaWduZWQgc2hvcnQgYWxpZ25tZW50OwotCXVuc2lnbmVkIHNob3J0IHR5cGU7Ci0Jc3RydWN0IF9mZmlfdHlwZSAqKmVsZW1lbnRzOworICAgIHNpemVfdCBzaXplOworICAgIHVuc2lnbmVkIHNob3J0IGFsaWdubWVudDsKKyAgICB1bnNpZ25lZCBzaG9ydCB0eXBlOworICAgIHN0cnVjdCBfZmZpX3R5cGUgKiplbGVtZW50czsKIH0gZmZpX3R5cGU7CiAqLwogCkBAIC0xNzY1LDcgKzE3NjUsNyBAQAogI2VuZGlmCiAgIC8qIFRoaXMgaXMgYWxyZWFkeSBkZWZpbmVkIG9uIE9TWCAqLwogZmZpX3R5cGUgZmZpX3R5cGVfbG9uZ2RvdWJsZSA9IHsgc2l6ZW9mKGxvbmcgZG91YmxlKSwgTE9OR0RPVUJMRV9BTElHTiwKLQkJCQkgRkZJX1RZUEVfTE9OR0RPVUJMRSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZJX1RZUEVfTE9OR0RPVUJMRSB9OwogCiBmZmlfdHlwZSBmZmlfdHlwZV9wb2ludGVyID0geyBzaXplb2Yodm9pZCAqKSwgVk9JRF9QX0FMSUdOLCBGRklfVFlQRV9QT0lOVEVSIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaCBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAppbmRleCA2ZGU5YTgxLi4zN2Y0NzBkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCkBAIC0yNCw3ICsyNCw3IEBACiAjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA2MDAwMCkKICNkZWZpbmUgUHlfVFlQRShvYikgKCgoUHlPYmplY3QqKShvYikpLT5vYl90eXBlKQogI2RlZmluZSBQeVZhck9iamVjdF9IRUFEX0lOSVQodHlwZSwgc2l6ZSkgXAotCVB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSBzaXplLAorICAgIFB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSBzaXplLAogI2RlZmluZSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrIFB5SW1wb3J0X0ltcG9ydE1vZHVsZQogI2RlZmluZSBQeUxvbmdfRnJvbVNzaXplX3QgUHlJbnRfRnJvbUxvbmcKICNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiAwCkBAIC02MiwxNiArNjIsMTYgQEAKIGRpZmZpY3VsdCBpbiB0aGUgcHJlc2VuY2Ugb2YgQ0Z1bmNQdHJPYmplY3QuICBNYXliZSBsYXRlci4KICovCiB1bmlvbiB2YWx1ZSB7Ci0JCWNoYXIgY1sxNl07Ci0JCXNob3J0IHM7Ci0JCWludCBpOwotCQlsb25nIGw7Ci0JCWZsb2F0IGY7Ci0JCWRvdWJsZSBkOworICAgICAgICAgICAgICAgIGNoYXIgY1sxNl07CisgICAgICAgICAgICAgICAgc2hvcnQgczsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBsb25nIGw7CisgICAgICAgICAgICAgICAgZmxvYXQgZjsKKyAgICAgICAgICAgICAgICBkb3VibGUgZDsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQlQWV9MT05HX0xPTkcgbGw7CisgICAgICAgICAgICAgICAgUFlfTE9OR19MT05HIGxsOwogI2VuZGlmCi0JCWxvbmcgZG91YmxlIEQ7CisgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgRDsKIH07CiAKIC8qCkBAIC04MSw2NyArODEsNjcgQEAKICovCiAKIHN0cnVjdCB0YWdDRGF0YU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWNoYXIgKmJfcHRyOwkJLyogcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgKi8KLQlpbnQgIGJfbmVlZHNmcmVlOwkvKiBuZWVkIF93ZV8gZnJlZSB0aGUgbWVtb3J5PyAqLwotCUNEYXRhT2JqZWN0ICpiX2Jhc2U7CS8qIHBvaW50ZXIgdG8gYmFzZSBvYmplY3Qgb3IgTlVMTCAqLwotCVB5X3NzaXplX3QgYl9zaXplOwkvKiBzaXplIG9mIG1lbW9yeSBibG9jayBpbiBieXRlcyAqLwotCVB5X3NzaXplX3QgYl9sZW5ndGg7CS8qIG51bWJlciBvZiByZWZlcmVuY2VzIHdlIG5lZWQgKi8KLQlQeV9zc2l6ZV90IGJfaW5kZXg7CS8qIGluZGV4IG9mIHRoaXMgb2JqZWN0IGludG8gYmFzZSdzCi0JCQkJICAgYl9vYmplY3QgbGlzdCAqLwotCVB5T2JqZWN0ICpiX29iamVjdHM7CS8qIGRpY3Rpb25hcnkgb2YgcmVmZXJlbmNlcyB3ZSBuZWVkIHRvIGtlZXAsIG9yIFB5X05vbmUgKi8KLQl1bmlvbiB2YWx1ZSBiX3ZhbHVlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBjaGFyICpiX3B0cjsgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgKi8KKyAgICBpbnQgIGJfbmVlZHNmcmVlOyAgICAgICAgICAgLyogbmVlZCBfd2VfIGZyZWUgdGhlIG1lbW9yeT8gKi8KKyAgICBDRGF0YU9iamVjdCAqYl9iYXNlOyAgICAgICAgLyogcG9pbnRlciB0byBiYXNlIG9iamVjdCBvciBOVUxMICovCisgICAgUHlfc3NpemVfdCBiX3NpemU7ICAgICAgICAgIC8qIHNpemUgb2YgbWVtb3J5IGJsb2NrIGluIGJ5dGVzICovCisgICAgUHlfc3NpemVfdCBiX2xlbmd0aDsgICAgICAgIC8qIG51bWJlciBvZiByZWZlcmVuY2VzIHdlIG5lZWQgKi8KKyAgICBQeV9zc2l6ZV90IGJfaW5kZXg7ICAgICAgICAgLyogaW5kZXggb2YgdGhpcyBvYmplY3QgaW50byBiYXNlJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX29iamVjdCBsaXN0ICovCisgICAgUHlPYmplY3QgKmJfb2JqZWN0czsgICAgICAgIC8qIGRpY3Rpb25hcnkgb2YgcmVmZXJlbmNlcyB3ZSBuZWVkIHRvIGtlZXAsIG9yIFB5X05vbmUgKi8KKyAgICB1bmlvbiB2YWx1ZSBiX3ZhbHVlOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X1ZBUl9IRUFECi0JZmZpX2Nsb3N1cmUgKnBjbDsgLyogdGhlIEMgY2FsbGFibGUgKi8KLQlmZmlfY2lmIGNpZjsKLQlpbnQgZmxhZ3M7Ci0JUHlPYmplY3QgKmNvbnZlcnRlcnM7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOwotCVB5T2JqZWN0ICpyZXN0eXBlOwotCVNFVEZVTkMgc2V0ZnVuYzsKLQlmZmlfdHlwZSAqZmZpX3Jlc3R5cGU7Ci0JZmZpX3R5cGUgKmF0eXBlc1sxXTsKKyAgICBQeU9iamVjdF9WQVJfSEVBRAorICAgIGZmaV9jbG9zdXJlICpwY2w7IC8qIHRoZSBDIGNhbGxhYmxlICovCisgICAgZmZpX2NpZiBjaWY7CisgICAgaW50IGZsYWdzOworICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzOworICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKKyAgICBQeU9iamVjdCAqcmVzdHlwZTsKKyAgICBTRVRGVU5DIHNldGZ1bmM7CisgICAgZmZpX3R5cGUgKmZmaV9yZXN0eXBlOworICAgIGZmaV90eXBlICphdHlwZXNbMV07CiB9IENUaHVua09iamVjdDsKIGV4dGVybiBQeVR5cGVPYmplY3QgQ1RodW5rX1R5cGU7Ci0jZGVmaW5lIENUaHVua19DaGVja0V4YWN0KHYpCSAgICAoKHYpLT5vYl90eXBlID09ICZDVGh1bmtfVHlwZSkKKyNkZWZpbmUgQ1RodW5rX0NoZWNrRXhhY3QodikgICAgICAgICgodiktPm9iX3R5cGUgPT0gJkNUaHVua19UeXBlKQogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JLyogRmlyc3QgcGFydCBpZGVudGljYWwgdG8gdGFnQ0RhdGFPYmplY3QgKi8KLQlQeU9iamVjdF9IRUFECi0JY2hhciAqYl9wdHI7CQkvKiBwb2ludGVyIHRvIG1lbW9yeSBibG9jayAqLwotCWludCAgYl9uZWVkc2ZyZWU7CS8qIG5lZWQgX3dlXyBmcmVlIHRoZSBtZW1vcnk/ICovCi0JQ0RhdGFPYmplY3QgKmJfYmFzZTsJLyogcG9pbnRlciB0byBiYXNlIG9iamVjdCBvciBOVUxMICovCi0JUHlfc3NpemVfdCBiX3NpemU7CS8qIHNpemUgb2YgbWVtb3J5IGJsb2NrIGluIGJ5dGVzICovCi0JUHlfc3NpemVfdCBiX2xlbmd0aDsJLyogbnVtYmVyIG9mIHJlZmVyZW5jZXMgd2UgbmVlZCAqLwotCVB5X3NzaXplX3QgYl9pbmRleDsJLyogaW5kZXggb2YgdGhpcyBvYmplY3QgaW50byBiYXNlJ3MKLQkJCQkgICBiX29iamVjdCBsaXN0ICovCi0JUHlPYmplY3QgKmJfb2JqZWN0czsJLyogbGlzdCBvZiByZWZlcmVuY2VzIHdlIG5lZWQgdG8ga2VlcCAqLwotCXVuaW9uIHZhbHVlIGJfdmFsdWU7Ci0JLyogZW5kIG9mIHRhZ0NEYXRhT2JqZWN0LCBhZGRpdGlvbmFsIGZpZWxkcyBmb2xsb3cgKi8KKyAgICAvKiBGaXJzdCBwYXJ0IGlkZW50aWNhbCB0byB0YWdDRGF0YU9iamVjdCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBjaGFyICpiX3B0cjsgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBtZW1vcnkgYmxvY2sgKi8KKyAgICBpbnQgIGJfbmVlZHNmcmVlOyAgICAgICAgICAgLyogbmVlZCBfd2VfIGZyZWUgdGhlIG1lbW9yeT8gKi8KKyAgICBDRGF0YU9iamVjdCAqYl9iYXNlOyAgICAgICAgLyogcG9pbnRlciB0byBiYXNlIG9iamVjdCBvciBOVUxMICovCisgICAgUHlfc3NpemVfdCBiX3NpemU7ICAgICAgICAgIC8qIHNpemUgb2YgbWVtb3J5IGJsb2NrIGluIGJ5dGVzICovCisgICAgUHlfc3NpemVfdCBiX2xlbmd0aDsgICAgICAgIC8qIG51bWJlciBvZiByZWZlcmVuY2VzIHdlIG5lZWQgKi8KKyAgICBQeV9zc2l6ZV90IGJfaW5kZXg7ICAgICAgICAgLyogaW5kZXggb2YgdGhpcyBvYmplY3QgaW50byBiYXNlJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX29iamVjdCBsaXN0ICovCisgICAgUHlPYmplY3QgKmJfb2JqZWN0czsgICAgICAgIC8qIGxpc3Qgb2YgcmVmZXJlbmNlcyB3ZSBuZWVkIHRvIGtlZXAgKi8KKyAgICB1bmlvbiB2YWx1ZSBiX3ZhbHVlOworICAgIC8qIGVuZCBvZiB0YWdDRGF0YU9iamVjdCwgYWRkaXRpb25hbCBmaWVsZHMgZm9sbG93ICovCiAKLQlDVGh1bmtPYmplY3QgKnRodW5rOwotCVB5T2JqZWN0ICpjYWxsYWJsZTsKKyAgICBDVGh1bmtPYmplY3QgKnRodW5rOworICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKIAotCS8qIFRoZXNlIHR3byBmaWVsZHMgd2lsbCBvdmVycmlkZSB0aGUgb25lcyBpbiB0aGUgdHlwZSdzIHN0Z2RpY3QgaWYKLQkgICB0aGV5IGFyZSBzZXQgKi8KLQlQeU9iamVjdCAqY29udmVydGVyczsKLQlQeU9iamVjdCAqYXJndHlwZXM7Ci0JUHlPYmplY3QgKnJlc3R5cGU7Ci0JUHlPYmplY3QgKmNoZWNrZXI7Ci0JUHlPYmplY3QgKmVycmNoZWNrOworICAgIC8qIFRoZXNlIHR3byBmaWVsZHMgd2lsbCBvdmVycmlkZSB0aGUgb25lcyBpbiB0aGUgdHlwZSdzIHN0Z2RpY3QgaWYKKyAgICAgICB0aGV5IGFyZSBzZXQgKi8KKyAgICBQeU9iamVjdCAqY29udmVydGVyczsKKyAgICBQeU9iamVjdCAqYXJndHlwZXM7CisgICAgUHlPYmplY3QgKnJlc3R5cGU7CisgICAgUHlPYmplY3QgKmNoZWNrZXI7CisgICAgUHlPYmplY3QgKmVycmNoZWNrOwogI2lmZGVmIE1TX1dJTjMyCi0JaW50IGluZGV4OwotCUdVSUQgKmlpZDsKKyAgICBpbnQgaW5kZXg7CisgICAgR1VJRCAqaWlkOwogI2VuZGlmCi0JUHlPYmplY3QgKnBhcmFtZmxhZ3M7CisgICAgUHlPYmplY3QgKnBhcmFtZmxhZ3M7CiB9IENGdW5jUHRyT2JqZWN0OwogCiBleHRlcm4gUHlUeXBlT2JqZWN0IFN0Z0RpY3RfVHlwZTsKLSNkZWZpbmUgU3RnRGljdF9DaGVja0V4YWN0KHYpCSAgICAoKHYpLT5vYl90eXBlID09ICZTdGdEaWN0X1R5cGUpCi0jZGVmaW5lIFN0Z0RpY3RfQ2hlY2sodikJICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmU3RnRGljdF9UeXBlKQorI2RlZmluZSBTdGdEaWN0X0NoZWNrRXhhY3QodikgICAgICAgKCh2KS0+b2JfdHlwZSA9PSAmU3RnRGljdF9UeXBlKQorI2RlZmluZSBTdGdEaWN0X0NoZWNrKHYpICAgICAgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZTdGdEaWN0X1R5cGUpCiAKIGV4dGVybiBpbnQgU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KFB5T2JqZWN0ICpmaWVsZHMsIFB5T2JqZWN0ICp0eXBlLCBpbnQgaXNTdHJ1Y3QpOwogZXh0ZXJuIGludCBQeVR5cGVfc3RnaW5mbyhQeVR5cGVPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgKnBzaXplLCBQeV9zc2l6ZV90ICpwYWxpZ24sIFB5X3NzaXplX3QgKnBsZW5ndGgpOwpAQCAtMTUwLDEyICsxNTAsMTIgQEAKIAogCiBleHRlcm4gUHlUeXBlT2JqZWN0IENEYXRhX1R5cGU7Ci0jZGVmaW5lIENEYXRhT2JqZWN0X0NoZWNrRXhhY3QodikJKCh2KS0+b2JfdHlwZSA9PSAmQ0RhdGFfVHlwZSkKLSNkZWZpbmUgQ0RhdGFPYmplY3RfQ2hlY2sodikJCVB5T2JqZWN0X1R5cGVDaGVjayh2LCAmQ0RhdGFfVHlwZSkKKyNkZWZpbmUgQ0RhdGFPYmplY3RfQ2hlY2tFeGFjdCh2KSAgICAgICAoKHYpLT5vYl90eXBlID09ICZDRGF0YV9UeXBlKQorI2RlZmluZSBDRGF0YU9iamVjdF9DaGVjayh2KSAgICAgICAgICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmQ0RhdGFfVHlwZSkKIAogZXh0ZXJuIFB5VHlwZU9iamVjdCBTaW1wbGVUeXBlX1R5cGU7Ci0jZGVmaW5lIFNpbXBsZVR5cGVPYmplY3RfQ2hlY2tFeGFjdCh2KQkoKHYpLT5vYl90eXBlID09ICZTaW1wbGVUeXBlX1R5cGUpCi0jZGVmaW5lIFNpbXBsZVR5cGVPYmplY3RfQ2hlY2sodikJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZTaW1wbGVUeXBlX1R5cGUpCisjZGVmaW5lIFNpbXBsZVR5cGVPYmplY3RfQ2hlY2tFeGFjdCh2KSAgKCh2KS0+b2JfdHlwZSA9PSAmU2ltcGxlVHlwZV9UeXBlKQorI2RlZmluZSBTaW1wbGVUeXBlT2JqZWN0X0NoZWNrKHYpICAgICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmU2ltcGxlVHlwZV9UeXBlKQogCiBleHRlcm4gUHlUeXBlT2JqZWN0IENGaWVsZF9UeXBlOwogZXh0ZXJuIHN0cnVjdCBmaWVsZGRlc2MgKmdldGVudHJ5KGNoYXIgKmZtdCk7CkBAIC0xNjMsOSArMTYzLDkgQEAKIAogZXh0ZXJuIFB5T2JqZWN0ICoKIENGaWVsZF9Gcm9tRGVzYyhQeU9iamVjdCAqZGVzYywgUHlfc3NpemVfdCBpbmRleCwKLQkJUHlfc3NpemVfdCAqcGZpZWxkX3NpemUsIGludCBiaXRzaXplLCBpbnQgKnBiaXRvZnMsCi0JCVB5X3NzaXplX3QgKnBzaXplLCBQeV9zc2l6ZV90ICpwb2Zmc2V0LCBQeV9zc2l6ZV90ICpwYWxpZ24sCi0JCWludCBwYWNrLCBpbnQgaXNfYmlnX2VuZGlhbik7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqcGZpZWxkX3NpemUsIGludCBiaXRzaXplLCBpbnQgKnBiaXRvZnMsCisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqcHNpemUsIFB5X3NzaXplX3QgKnBvZmZzZXQsIFB5X3NzaXplX3QgKnBhbGlnbiwKKyAgICAgICAgICAgICAgICBpbnQgcGFjaywgaW50IGlzX2JpZ19lbmRpYW4pOwogCiBleHRlcm4gUHlPYmplY3QgKkNEYXRhX0F0QWRkcmVzcyhQeU9iamVjdCAqdHlwZSwgdm9pZCAqYnVmKTsKIGV4dGVybiBQeU9iamVjdCAqQ0RhdGFfRnJvbUJ5dGVzKFB5T2JqZWN0ICp0eXBlLCBjaGFyICpkYXRhLCBQeV9zc2l6ZV90IGxlbmd0aCk7CkBAIC0xNzgsMTMgKzE3OCwxMyBAQAogZXh0ZXJuIFB5VHlwZU9iamVjdCBDRnVuY1B0clR5cGVfVHlwZTsKIGV4dGVybiBQeVR5cGVPYmplY3QgU3RydWN0VHlwZV9UeXBlOwogCi0jZGVmaW5lIEFycmF5VHlwZU9iamVjdF9DaGVjayh2KQlQeU9iamVjdF9UeXBlQ2hlY2sodiwgJkFycmF5VHlwZV9UeXBlKQotI2RlZmluZSBBcnJheU9iamVjdF9DaGVjayh2KQkJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZBcnJheV9UeXBlKQotI2RlZmluZSBQb2ludGVyT2JqZWN0X0NoZWNrKHYpCQlQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlBvaW50ZXJfVHlwZSkKLSNkZWZpbmUgUG9pbnRlclR5cGVPYmplY3RfQ2hlY2sodikJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZQb2ludGVyVHlwZV9UeXBlKQotI2RlZmluZSBDRnVuY1B0ck9iamVjdF9DaGVjayh2KQkJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZDRnVuY1B0cl9UeXBlKQotI2RlZmluZSBDRnVuY1B0clR5cGVPYmplY3RfQ2hlY2sodikJUHlPYmplY3RfVHlwZUNoZWNrKHYsICZDRnVuY1B0clR5cGVfVHlwZSkKLSNkZWZpbmUgU3RydWN0VHlwZU9iamVjdF9DaGVjayh2KQlQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlN0cnVjdFR5cGVfVHlwZSkKKyNkZWZpbmUgQXJyYXlUeXBlT2JqZWN0X0NoZWNrKHYpICAgICAgICBQeU9iamVjdF9UeXBlQ2hlY2sodiwgJkFycmF5VHlwZV9UeXBlKQorI2RlZmluZSBBcnJheU9iamVjdF9DaGVjayh2KSAgICAgICAgICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmQXJyYXlfVHlwZSkKKyNkZWZpbmUgUG9pbnRlck9iamVjdF9DaGVjayh2KSAgICAgICAgICBQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlBvaW50ZXJfVHlwZSkKKyNkZWZpbmUgUG9pbnRlclR5cGVPYmplY3RfQ2hlY2sodikgICAgICBQeU9iamVjdF9UeXBlQ2hlY2sodiwgJlBvaW50ZXJUeXBlX1R5cGUpCisjZGVmaW5lIENGdW5jUHRyT2JqZWN0X0NoZWNrKHYpICAgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZDRnVuY1B0cl9UeXBlKQorI2RlZmluZSBDRnVuY1B0clR5cGVPYmplY3RfQ2hlY2sodikgICAgIFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmQ0Z1bmNQdHJUeXBlX1R5cGUpCisjZGVmaW5lIFN0cnVjdFR5cGVPYmplY3RfQ2hlY2sodikgICAgICAgUHlPYmplY3RfVHlwZUNoZWNrKHYsICZTdHJ1Y3RUeXBlX1R5cGUpCiAKIGV4dGVybiBQeU9iamVjdCAqCiBDcmVhdGVBcnJheVR5cGUoUHlPYmplY3QgKml0ZW10eXBlLCBQeV9zc2l6ZV90IGxlbmd0aCk7CkBAIC0xOTIsMzUgKzE5MiwzNSBAQAogZXh0ZXJuIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW107CiAKIGV4dGVybiBDVGh1bmtPYmplY3QgKkFsbG9jRnVuY3Rpb25DYWxsYmFjayhQeU9iamVjdCAqY2FsbGFibGUsCi0JCQkJCSAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzLAotCQkJCQkgICBQeU9iamVjdCAqcmVzdHlwZSwKLQkJCQkJICAgaW50IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29udmVydGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVzdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwogLyogYSB0YWJsZSBlbnRyeSBkZXNjcmliaW5nIGEgcHJlZGVmaW5lZCBjdHlwZXMgdHlwZSAqLwogc3RydWN0IGZpZWxkZGVzYyB7Ci0JY2hhciBjb2RlOwotCVNFVEZVTkMgc2V0ZnVuYzsKLQlHRVRGVU5DIGdldGZ1bmM7Ci0JZmZpX3R5cGUgKnBmZmlfdHlwZTsgLyogYWx3YXlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCi0JU0VURlVOQyBzZXRmdW5jX3N3YXBwZWQ7Ci0JR0VURlVOQyBnZXRmdW5jX3N3YXBwZWQ7CisgICAgY2hhciBjb2RlOworICAgIFNFVEZVTkMgc2V0ZnVuYzsKKyAgICBHRVRGVU5DIGdldGZ1bmM7CisgICAgZmZpX3R5cGUgKnBmZmlfdHlwZTsgLyogYWx3YXlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCisgICAgU0VURlVOQyBzZXRmdW5jX3N3YXBwZWQ7CisgICAgR0VURlVOQyBnZXRmdW5jX3N3YXBwZWQ7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3Qgb2Zmc2V0OwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeV9zc2l6ZV90IGluZGV4OwkJLyogSW5kZXggaW50byBDRGF0YU9iamVjdCdzCi0JCQkJCSAgIG9iamVjdCBhcnJheSAqLwotCVB5T2JqZWN0ICpwcm90bzsJCS8qIGEgdHlwZSBvciBOVUxMICovCi0JR0VURlVOQyBnZXRmdW5jOwkJLyogZ2V0dGVyIGZ1bmN0aW9uIGlmIHByb3RvIGlzIE5VTEwgKi8KLQlTRVRGVU5DIHNldGZ1bmM7CQkvKiBzZXR0ZXIgZnVuY3Rpb24gaWYgcHJvdG8gaXMgTlVMTCAqLwotCWludCBhbm9ueW1vdXM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3Qgb2Zmc2V0OworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGluZGV4OyAgICAgICAgICAgICAgICAgICAvKiBJbmRleCBpbnRvIENEYXRhT2JqZWN0J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBhcnJheSAqLworICAgIFB5T2JqZWN0ICpwcm90bzsgICAgICAgICAgICAgICAgICAgIC8qIGEgdHlwZSBvciBOVUxMICovCisgICAgR0VURlVOQyBnZXRmdW5jOyAgICAgICAgICAgICAgICAgICAgLyogZ2V0dGVyIGZ1bmN0aW9uIGlmIHByb3RvIGlzIE5VTEwgKi8KKyAgICBTRVRGVU5DIHNldGZ1bmM7ICAgICAgICAgICAgICAgICAgICAvKiBzZXR0ZXIgZnVuY3Rpb24gaWYgcHJvdG8gaXMgTlVMTCAqLworICAgIGludCBhbm9ueW1vdXM7CiB9IENGaWVsZE9iamVjdDsKIAogLyogQSBzdWJjbGFzcyBvZiBQeURpY3RPYmplY3QsIHVzZWQgYXMgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkgb2YgY3R5cGVzCiAgICBtZXRhdHlwZXMgKi8KIHR5cGVkZWYgc3RydWN0IHsKLQlQeURpY3RPYmplY3QgZGljdDsJLyogZmlyc3QgcGFydCBpZGVudGljYWwgdG8gUHlEaWN0T2JqZWN0ICovCisgICAgUHlEaWN0T2JqZWN0IGRpY3Q7ICAgICAgICAgIC8qIGZpcnN0IHBhcnQgaWRlbnRpY2FsIHRvIFB5RGljdE9iamVjdCAqLwogLyogVGhlIHNpemUgYW5kIGFsaWduIGZpZWxkcyBhcmUgdW5uZWVkZWQsIHRoZXkgYXJlIGluIGZmaV90eXBlIGFzIHdlbGwuICBBcwogICAgYW4gZXhwZXJpbWVudCBzaG93cywgaXQncyB0cml2aWFsIHRvIGdldCByaWQgb2YgdGhlbSwgdGhlIG9ubHkgdGhpbmcgdG8KICAgIHJlbWVtYmVyIGlzIHRoYXQgaW4gQXJyYXlUeXBlX25ldyB0aGUgZmZpX3R5cGUgZmllbGRzIG11c3QgYmUgZmlsbGVkIGluIC0KQEAgLTIyOSwyOCArMjI5LDI4IEBACiAgICB0b28gbXVjaCByaXNrIHRvIGNoYW5nZSB0aGF0IG5vdywgYW5kIHRoZXJlIGFyZSBvdGhlciBmaWVsZHMgd2hpY2ggZG9lbid0CiAgICBiZWxvbmcgaW50byB0aGlzIHN0cnVjdHVyZSBhbnl3YXkuICBNYXliZSBpbiBjdHlwZXMgMi4wLi4uIChjdHlwZXMgMjAwMD8pCiAqLwotCVB5X3NzaXplX3Qgc2l6ZTsJLyogbnVtYmVyIG9mIGJ5dGVzICovCi0JUHlfc3NpemVfdCBhbGlnbjsJLyogYWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLwotCVB5X3NzaXplX3QgbGVuZ3RoOwkvKiBudW1iZXIgb2YgZmllbGRzICovCi0JZmZpX3R5cGUgZmZpX3R5cGVfcG9pbnRlcjsKLQlQeU9iamVjdCAqcHJvdG87CS8qIE9ubHkgZm9yIFBvaW50ZXIvQXJyYXlPYmplY3QgKi8KLQlTRVRGVU5DIHNldGZ1bmM7CS8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCi0JR0VURlVOQyBnZXRmdW5jOwkvKiBPbmx5IGZvciBzaW1wbGUgb2JqZWN0cyAqLwotCVBBUkFNRlVOQyBwYXJhbWZ1bmM7CisgICAgUHlfc3NpemVfdCBzaXplOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyAqLworICAgIFB5X3NzaXplX3QgYWxpZ247ICAgICAgICAgICAvKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCisgICAgUHlfc3NpemVfdCBsZW5ndGg7ICAgICAgICAgIC8qIG51bWJlciBvZiBmaWVsZHMgKi8KKyAgICBmZmlfdHlwZSBmZmlfdHlwZV9wb2ludGVyOworICAgIFB5T2JqZWN0ICpwcm90bzsgICAgICAgICAgICAvKiBPbmx5IGZvciBQb2ludGVyL0FycmF5T2JqZWN0ICovCisgICAgU0VURlVOQyBzZXRmdW5jOyAgICAgICAgICAgIC8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCisgICAgR0VURlVOQyBnZXRmdW5jOyAgICAgICAgICAgIC8qIE9ubHkgZm9yIHNpbXBsZSBvYmplY3RzICovCisgICAgUEFSQU1GVU5DIHBhcmFtZnVuYzsKIAotCS8qIEZvbGxvd2luZyBmaWVsZHMgb25seSB1c2VkIGJ5IENGdW5jUHRyVHlwZV9UeXBlIGluc3RhbmNlcyAqLwotCVB5T2JqZWN0ICphcmd0eXBlczsJLyogdHVwbGUgb2YgQ0RhdGFPYmplY3RzICovCi0JUHlPYmplY3QgKmNvbnZlcnRlcnM7CS8qIHR1cGxlKFt0LmZyb21fcGFyYW0gZm9yIHQgaW4gYXJndHlwZXNdKSAqLwotCVB5T2JqZWN0ICpyZXN0eXBlOwkvKiBDRGF0YU9iamVjdCBvciBOVUxMICovCi0JUHlPYmplY3QgKmNoZWNrZXI7Ci0JaW50IGZsYWdzOwkJLyogY2FsbGluZyBjb252ZW50aW9uIGFuZCBzdWNoICovCisgICAgLyogRm9sbG93aW5nIGZpZWxkcyBvbmx5IHVzZWQgYnkgQ0Z1bmNQdHJUeXBlX1R5cGUgaW5zdGFuY2VzICovCisgICAgUHlPYmplY3QgKmFyZ3R5cGVzOyAgICAgICAgIC8qIHR1cGxlIG9mIENEYXRhT2JqZWN0cyAqLworICAgIFB5T2JqZWN0ICpjb252ZXJ0ZXJzOyAgICAgICAvKiB0dXBsZShbdC5mcm9tX3BhcmFtIGZvciB0IGluIGFyZ3R5cGVzXSkgKi8KKyAgICBQeU9iamVjdCAqcmVzdHlwZTsgICAgICAgICAgLyogQ0RhdGFPYmplY3Qgb3IgTlVMTCAqLworICAgIFB5T2JqZWN0ICpjaGVja2VyOworICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBjYWxsaW5nIGNvbnZlbnRpb24gYW5kIHN1Y2ggKi8KIAotCS8qIHBlcDMxMTggZmllbGRzLCBwb2ludGVycyBuZWVlZCBQeU1lbV9GcmVlICovCi0JY2hhciAqZm9ybWF0OwotCWludCBuZGltOwotCVB5X3NzaXplX3QgKnNoYXBlOwotLyoJUHlfc3NpemVfdCAqc3RyaWRlczsJKi8gLyogdW51c2VkIGluIGN0eXBlcyAqLwotLyoJUHlfc3NpemVfdCAqc3Vib2Zmc2V0czsJKi8gLyogdW51c2VkIGluIGN0eXBlcyAqLworICAgIC8qIHBlcDMxMTggZmllbGRzLCBwb2ludGVycyBuZWVlZCBQeU1lbV9GcmVlICovCisgICAgY2hhciAqZm9ybWF0OworICAgIGludCBuZGltOworICAgIFB5X3NzaXplX3QgKnNoYXBlOworLyogICAgICBQeV9zc2l6ZV90ICpzdHJpZGVzOyAgICAqLyAvKiB1bnVzZWQgaW4gY3R5cGVzICovCisvKiAgICAgIFB5X3NzaXplX3QgKnN1Ym9mZnNldHM7ICovIC8qIHVudXNlZCBpbiBjdHlwZXMgKi8KIAogfSBTdGdEaWN0T2JqZWN0OwogCkBAIC0zMDUsMTYgKzMwNSwxNiBAQAogdHlwZWRlZiBpbnQoKiBQUFJPQykodm9pZCk7CiAKIFB5T2JqZWN0ICpfQ2FsbFByb2MoUFBST0MgcFByb2MsCi0JCSAgICBQeU9iamVjdCAqYXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJndW1lbnRzLAogI2lmZGVmIE1TX1dJTjMyCi0JCSAgICBJVW5rbm93biAqcElVbmssCi0JCSAgICBHVUlEICppaWQsCisgICAgICAgICAgICAgICAgICAgIElVbmtub3duICpwSVVuaywKKyAgICAgICAgICAgICAgICAgICAgR1VJRCAqaWlkLAogI2VuZGlmCi0JCSAgICBpbnQgZmxhZ3MsCi0JCSAgICBQeU9iamVjdCAqYXJndHlwZXMsCi0JCSAgICBQeU9iamVjdCAqcmVzdHlwZSwKLQkJICAgIFB5T2JqZWN0ICpjaGVja2VyKTsKLSAKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJndHlwZXMsCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN0eXBlLAorICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2hlY2tlcik7CisKIAogI2RlZmluZSBGVU5DRkxBR19TVERDQUxMIDB4MAogI2RlZmluZSBGVU5DRkxBR19DREVDTCAgIDB4MQpAQCAtMzI5LDQ1ICszMjksNDUgQEAKICNkZWZpbmUgRElDVEZMQUdfRklOQUwgMHgxMDAwCiAKIHN0cnVjdCB0YWdQeUNBcmdPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlmZmlfdHlwZSAqcGZmaV90eXBlOwotCWNoYXIgdGFnOwotCXVuaW9uIHsKLQkJY2hhciBjOwotCQljaGFyIGI7Ci0JCXNob3J0IGg7Ci0JCWludCBpOwotCQlsb25nIGw7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGZmaV90eXBlICpwZmZpX3R5cGU7CisgICAgY2hhciB0YWc7CisgICAgdW5pb24geworICAgICAgICBjaGFyIGM7CisgICAgICAgIGNoYXIgYjsKKyAgICAgICAgc2hvcnQgaDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGxvbmcgbDsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQlQWV9MT05HX0xPTkcgcTsKKyAgICAgICAgUFlfTE9OR19MT05HIHE7CiAjZW5kaWYKLQkJbG9uZyBkb3VibGUgRDsKLQkJZG91YmxlIGQ7Ci0JCWZsb2F0IGY7Ci0JCXZvaWQgKnA7Ci0JfSB2YWx1ZTsKLQlQeU9iamVjdCAqb2JqOwotCVB5X3NzaXplX3Qgc2l6ZTsgLyogZm9yIHRoZSAnVicgdGFnICovCisgICAgICAgIGxvbmcgZG91YmxlIEQ7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgICBmbG9hdCBmOworICAgICAgICB2b2lkICpwOworICAgIH0gdmFsdWU7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBQeV9zc2l6ZV90IHNpemU7IC8qIGZvciB0aGUgJ1YnIHRhZyAqLwogfTsKIAogZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUNBcmdfVHlwZTsKLSNkZWZpbmUgUHlDQXJnX0NoZWNrRXhhY3QodikJICAgICgodiktPm9iX3R5cGUgPT0gJlB5Q0FyZ19UeXBlKQorI2RlZmluZSBQeUNBcmdfQ2hlY2tFeGFjdCh2KSAgICAgICAgKCh2KS0+b2JfdHlwZSA9PSAmUHlDQXJnX1R5cGUpCiBleHRlcm4gUHlDQXJnT2JqZWN0ICpuZXdfQ0FyZ09iamVjdCh2b2lkKTsKIAogZXh0ZXJuIFB5T2JqZWN0ICoKIENEYXRhX2dldChQeU9iamVjdCAqdHlwZSwgR0VURlVOQyBnZXRmdW5jLCBQeU9iamVjdCAqc3JjLAotCSAgUHlfc3NpemVfdCBpbmRleCwgUHlfc3NpemVfdCBzaXplLCBjaGFyICpwdHIpOworICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKTsKIAogZXh0ZXJuIGludAogQ0RhdGFfc2V0KFB5T2JqZWN0ICpkc3QsIFB5T2JqZWN0ICp0eXBlLCBTRVRGVU5DIHNldGZ1bmMsIFB5T2JqZWN0ICp2YWx1ZSwKLQkgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKTsKKyAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cik7CiAKIGV4dGVybiB2b2lkIEV4dGVuZF9FcnJvcl9JbmZvKFB5T2JqZWN0ICpleGNfY2xhc3MsIGNoYXIgKmZtdCwgLi4uKTsKIAogc3RydWN0IGJhc2VzcGVjIHsKLQlDRGF0YU9iamVjdCAqYmFzZTsKLQlQeV9zc2l6ZV90IGluZGV4OwotCWNoYXIgKmFkcjsKKyAgICBDRGF0YU9iamVjdCAqYmFzZTsKKyAgICBQeV9zc2l6ZV90IGluZGV4OworICAgIGNoYXIgKmFkcjsKIH07CiAKIGV4dGVybiBjaGFyIGJhc2VzcGVjX3N0cmluZ1tdOwpAQCAtMzgzLDE0ICszODMsMTQgQEAKIC8qIFB5dGhvbiAyLjQgbWFjcm9zLCB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSBpbiBQeXRob24gMi4zICovCiAKICNpZm5kZWYgUHlfQ0xFQVIKLSNkZWZpbmUgUHlfQ0xFQVIob3ApCQkJCVwKLSAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICAgICAgICAgICAgICAgIGlmIChvcCkgewkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0bXAgPSAoUHlPYmplY3QgKikob3ApOwlcCi0gICAgICAgICAgICAgICAgICAgICAgICAob3ApID0gTlVMTDsJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOwkJXAotICAgICAgICAgICAgICAgIH0JCQkJXAotICAgICAgICB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9DTEVBUihvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUHlPYmplY3QgKnRtcCA9IChQeU9iamVjdCAqKShvcCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChvcCkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQogI2VuZGlmCiAKICNpZm5kZWYgUHlfVklTSVQKQEAgLTM5OSwxNCArMzk5LDE0IEBACiAgKiAidmlzaXQiIGFuZCAiYXJnIi4gIFRoaXMgaXMgaW50ZW5kZWQgdG8ga2VlcCB0cF90cmF2ZXJzZSBmdW5jdGlvbnMKICAqIGxvb2tpbmcgYXMgbXVjaCBhbGlrZSBhcyBwb3NzaWJsZS4KICAqLwotI2RlZmluZSBQeV9WSVNJVChvcCkJCQkJCVwKLSAgICAgICAgZG8geyAJCQkJCQlcCi0gICAgICAgICAgICAgICAgaWYgKG9wKSB7CQkJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2cmV0ID0gdmlzaXQoKG9wKSwgYXJnKTsJXAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZyZXQpCQkJXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsJCVwKLSAgICAgICAgICAgICAgICB9CQkJCQlcCi0gICAgICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIFB5X1ZJU0lUKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgdnJldCA9IHZpc2l0KChvcCksIGFyZyk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICh2cmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiB2cmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQogI2VuZGlmCiAKIC8qIFB5dGhvbidzIFB5VW5pY29kZV8qV2lkZUNoYXIgZnVuY3Rpb25zIGFyZSBicm9rZW4gLi4uICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvZGFyd2luL2RsZmNuX3NpbXBsZS5jIGIvTW9kdWxlcy9fY3R5cGVzL2Rhcndpbi9kbGZjbl9zaW1wbGUuYwppbmRleCA0YjU1MzIzLi4yYjI5M2JiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvZGFyd2luL2RsZmNuX3NpbXBsZS5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9kYXJ3aW4vZGxmY25fc2ltcGxlLmMKQEAgLTgxLDE2NyArODEsMTY3IEBACiAvKiBTZXQgYW5kIGdldCB0aGUgZXJyb3Igc3RyaW5nIGZvciB1c2UgYnkgZGxlcnJvciAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmVycm9yKGludCBzZXRnZXQsIGNvbnN0IGNoYXIgKnN0ciwgLi4uKQogewotCXN0YXRpYyBjaGFyIGVycnN0cltFUlJfU1RSX0xFTl07Ci0Jc3RhdGljIGludCBlcnJfZmlsbGVkID0gMDsKLQljb25zdCBjaGFyICpyZXR2YWw7Ci0JdmFfbGlzdCBhcmc7Ci0JaWYgKHNldGdldCA9PSAwKQotCXsKLQkJdmFfc3RhcnQoYXJnLCBzdHIpOwotCQlzdHJuY3B5KGVycnN0ciwgImRsY29tcGF0OiAiLCBFUlJfU1RSX0xFTik7Ci0JCXZzbnByaW50ZihlcnJzdHIgKyAxMCwgRVJSX1NUUl9MRU4gLSAxMCwgc3RyLCBhcmcpOwotCQl2YV9lbmQoYXJnKTsKLQkJZXJyX2ZpbGxlZCA9IDE7Ci0JCXJldHZhbCA9IE5VTEw7Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICghZXJyX2ZpbGxlZCkKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCWVsc2UKLQkJCXJldHZhbCA9IGVycnN0cjsKLQkJZXJyX2ZpbGxlZCA9IDA7Ci0JfQotCXJldHVybiByZXR2YWw7CisgICAgc3RhdGljIGNoYXIgZXJyc3RyW0VSUl9TVFJfTEVOXTsKKyAgICBzdGF0aWMgaW50IGVycl9maWxsZWQgPSAwOworICAgIGNvbnN0IGNoYXIgKnJldHZhbDsKKyAgICB2YV9saXN0IGFyZzsKKyAgICBpZiAoc2V0Z2V0ID09IDApCisgICAgeworICAgICAgICB2YV9zdGFydChhcmcsIHN0cik7CisgICAgICAgIHN0cm5jcHkoZXJyc3RyLCAiZGxjb21wYXQ6ICIsIEVSUl9TVFJfTEVOKTsKKyAgICAgICAgdnNucHJpbnRmKGVycnN0ciArIDEwLCBFUlJfU1RSX0xFTiAtIDEwLCBzdHIsIGFyZyk7CisgICAgICAgIHZhX2VuZChhcmcpOworICAgICAgICBlcnJfZmlsbGVkID0gMTsKKyAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKCFlcnJfZmlsbGVkKQorICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dmFsID0gZXJyc3RyOworICAgICAgICBlcnJfZmlsbGVkID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogLyogZGFyd2luX2Rsb3BlbiAqLwogc3RhdGljIHZvaWQgKmRhcndpbl9kbG9wZW4oY29uc3QgY2hhciAqcGF0aCwgaW50IG1vZGUpCiB7Ci0Jdm9pZCAqbW9kdWxlID0gMDsKLQlOU09iamVjdEZpbGVJbWFnZSBvZmkgPSAwOwotCU5TT2JqZWN0RmlsZUltYWdlUmV0dXJuQ29kZSBvZmlyYzsKKyAgICB2b2lkICptb2R1bGUgPSAwOworICAgIE5TT2JqZWN0RmlsZUltYWdlIG9maSA9IDA7CisgICAgTlNPYmplY3RGaWxlSW1hZ2VSZXR1cm5Db2RlIG9maXJjOwogCi0JLyogSWYgd2UgZ290IG5vIHBhdGgsIHRoZSBhcHAgd2FudHMgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIHVzZSAtMSBhcyB0aGUgbWFya2VyCi0JICAgaW4gdGhpcyBjYXNlICovCi0JaWYgKCFwYXRoKQotCQlyZXR1cm4gKHZvaWQgKiktMTsKKyAgICAvKiBJZiB3ZSBnb3Qgbm8gcGF0aCwgdGhlIGFwcCB3YW50cyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgdXNlIC0xIGFzIHRoZSBtYXJrZXIKKyAgICAgICBpbiB0aGlzIGNhc2UgKi8KKyAgICBpZiAoIXBhdGgpCisgICAgICAgIHJldHVybiAodm9pZCAqKS0xOwogCi0JLyogQ3JlYXRlIHRoZSBvYmplY3QgZmlsZSBpbWFnZSwgd29ya3MgZm9yIHRoaW5ncyBsaW5rZWQgd2l0aCB0aGUgLWJ1bmRsZSBhcmcgdG8gbGQgKi8KLQlvZmlyYyA9IE5TQ3JlYXRlT2JqZWN0RmlsZUltYWdlRnJvbUZpbGUocGF0aCwgJm9maSk7Ci0Jc3dpdGNoIChvZmlyYykKLQl7Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VTdWNjZXNzOgotCQkJLyogSXQgd2FzIG9rYXksIHNvIHVzZSBOU0xpbmtNb2R1bGUgdG8gbGluayBpbiB0aGUgaW1hZ2UgKi8KLQkJCW1vZHVsZSA9IE5TTGlua01vZHVsZShvZmksIHBhdGgsCi0JCQkJCQkJCSAgTlNMSU5LTU9EVUxFX09QVElPTl9SRVRVUk5fT05fRVJST1IKLQkJCQkJCQkJICB8IChtb2RlICYgUlRMRF9HTE9CQUwpID8gMCA6IE5TTElOS01PRFVMRV9PUFRJT05fUFJJVkFURQotCQkJCQkJCQkgIHwgKG1vZGUgJiBSVExEX0xBWlkpID8gMCA6IE5TTElOS01PRFVMRV9PUFRJT05fQklORE5PVyk7Ci0JCQlOU0Rlc3Ryb3lPYmplY3RGaWxlSW1hZ2Uob2ZpKTsKLQkJCWJyZWFrOwotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlSW5hcHByb3ByaWF0ZUZpbGU6Ci0JCQkvKiBJdCBtYXkgaGF2ZSBiZWVuIGEgZHluYW1pYyBsaWJyYXJ5IHJhdGhlciB0aGFuIGEgYnVuZGxlLCB0cnkgdG8gbG9hZCBpdCAqLwotCQkJbW9kdWxlID0gKHZvaWQgKilOU0FkZEltYWdlKHBhdGgsIE5TQURESU1BR0VfT1BUSU9OX1JFVFVSTl9PTl9FUlJPUik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIEdvZCBrbm93cyB3aGF0IHdlIGdvdCAqLwotCQkJZXJyb3IoMCwgIkNhbiBub3Qgb3BlbiBcIiVzXCIiLCBwYXRoKTsKLQkJCXJldHVybiAwOwotCX0KLQlpZiAoIW1vZHVsZSkKLQkJZXJyb3IoMCwgIkNhbiBub3Qgb3BlbiBcIiVzXCIiLCBwYXRoKTsKLQlyZXR1cm4gbW9kdWxlOworICAgIC8qIENyZWF0ZSB0aGUgb2JqZWN0IGZpbGUgaW1hZ2UsIHdvcmtzIGZvciB0aGluZ3MgbGlua2VkIHdpdGggdGhlIC1idW5kbGUgYXJnIHRvIGxkICovCisgICAgb2ZpcmMgPSBOU0NyZWF0ZU9iamVjdEZpbGVJbWFnZUZyb21GaWxlKHBhdGgsICZvZmkpOworICAgIHN3aXRjaCAob2ZpcmMpCisgICAgeworICAgICAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlU3VjY2VzczoKKyAgICAgICAgICAgIC8qIEl0IHdhcyBva2F5LCBzbyB1c2UgTlNMaW5rTW9kdWxlIHRvIGxpbmsgaW4gdGhlIGltYWdlICovCisgICAgICAgICAgICBtb2R1bGUgPSBOU0xpbmtNb2R1bGUob2ZpLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNMSU5LTU9EVUxFX09QVElPTl9SRVRVUk5fT05fRVJST1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG1vZGUgJiBSVExEX0dMT0JBTCkgPyAwIDogTlNMSU5LTU9EVUxFX09QVElPTl9QUklWQVRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChtb2RlICYgUlRMRF9MQVpZKSA/IDAgOiBOU0xJTktNT0RVTEVfT1BUSU9OX0JJTkROT1cpOworICAgICAgICAgICAgTlNEZXN0cm95T2JqZWN0RmlsZUltYWdlKG9maSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZUluYXBwcm9wcmlhdGVGaWxlOgorICAgICAgICAgICAgLyogSXQgbWF5IGhhdmUgYmVlbiBhIGR5bmFtaWMgbGlicmFyeSByYXRoZXIgdGhhbiBhIGJ1bmRsZSwgdHJ5IHRvIGxvYWQgaXQgKi8KKyAgICAgICAgICAgIG1vZHVsZSA9ICh2b2lkICopTlNBZGRJbWFnZShwYXRoLCBOU0FERElNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBHb2Qga25vd3Mgd2hhdCB3ZSBnb3QgKi8KKyAgICAgICAgICAgIGVycm9yKDAsICJDYW4gbm90IG9wZW4gXCIlc1wiIiwgcGF0aCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFtb2R1bGUpCisgICAgICAgIGVycm9yKDAsICJDYW4gbm90IG9wZW4gXCIlc1wiIiwgcGF0aCk7CisgICAgcmV0dXJuIG1vZHVsZTsKIAogfQogCiAvKiBkbHN5bUludGVybiBpcyB1c2VkIGJ5IGRsc3ltIHRvIGZpbmQgdGhlIHN5bWJvbCAqLwogc3RhdGljIHZvaWQgKmRsc3ltSW50ZXJuKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKQogewotCU5TU3ltYm9sIG5zc3ltID0gMDsKLQkvKiBJZiB0aGUgaGFuZGxlIGlzIC0xLCBpZiBpcyB0aGUgYXBwIGdsb2JhbCBjb250ZXh0ICovCi0JaWYgKGhhbmRsZSA9PSAodm9pZCAqKS0xKQotCXsKLQkJLyogR2xvYmFsIGNvbnRleHQsIHVzZSBOU0xvb2t1cEFuZEJpbmRTeW1ib2wgKi8KLQkJaWYgKE5TSXNTeW1ib2xOYW1lRGVmaW5lZChzeW1ib2wpKQotCQl7Ci0JCQluc3N5bSA9IE5TTG9va3VwQW5kQmluZFN5bWJvbChzeW1ib2wpOwotCQl9CisgICAgTlNTeW1ib2wgbnNzeW0gPSAwOworICAgIC8qIElmIHRoZSBoYW5kbGUgaXMgLTEsIGlmIGlzIHRoZSBhcHAgZ2xvYmFsIGNvbnRleHQgKi8KKyAgICBpZiAoaGFuZGxlID09ICh2b2lkICopLTEpCisgICAgeworICAgICAgICAvKiBHbG9iYWwgY29udGV4dCwgdXNlIE5TTG9va3VwQW5kQmluZFN5bWJvbCAqLworICAgICAgICBpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkKHN5bWJvbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5zc3ltID0gTlNMb29rdXBBbmRCaW5kU3ltYm9sKHN5bWJvbCk7CisgICAgICAgIH0KIAotCX0KLQkvKiBOb3cgc2VlIGlmIHRoZSBoYW5kbGUgaXMgYSBzdHJ1Y2ggbWFjaF9oZWFkZXIqIG9yIG5vdCwgdXNlIE5TTG9va3VwU3ltYm9sIGluIGltYWdlCi0JICAgZm9yIGxpYnJhcmllcywgYW5kIE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUgZm9yIGJ1bmRsZXMgKi8KLQllbHNlCi0JewotCQkvKiBDaGVjayBmb3IgYm90aCBwb3NzaWJsZSBtYWdpYyBudW1iZXJzIGRlcGVuZGluZyBvbiB4ODYvcHBjIGJ5dGUgb3JkZXIgKi8KLQkJaWYgKCgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX01BR0lDKSB8fAotCQkJKCgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlKS0+bWFnaWMgPT0gTUhfQ0lHQU0pKQotCQl7Ci0JCQlpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZSgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlLCBzeW1ib2wpKQotCQkJewotCQkJCW5zc3ltID0gTlNMb29rdXBTeW1ib2xJbkltYWdlKChzdHJ1Y3QgbWFjaF9oZWFkZXIgKiloYW5kbGUsCi0JCQkJCQkJCQkJCSAgc3ltYm9sLAotCQkJCQkJCQkJCQkgIE5TTE9PS1VQU1lNQk9MSU5JTUFHRV9PUFRJT05fQklORAotCQkJCQkJCQkJCQkgIHwgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOwotCQkJfQorICAgIH0KKyAgICAvKiBOb3cgc2VlIGlmIHRoZSBoYW5kbGUgaXMgYSBzdHJ1Y2ggbWFjaF9oZWFkZXIqIG9yIG5vdCwgdXNlIE5TTG9va3VwU3ltYm9sIGluIGltYWdlCisgICAgICAgZm9yIGxpYnJhcmllcywgYW5kIE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUgZm9yIGJ1bmRsZXMgKi8KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBDaGVjayBmb3IgYm90aCBwb3NzaWJsZSBtYWdpYyBudW1iZXJzIGRlcGVuZGluZyBvbiB4ODYvcHBjIGJ5dGUgb3JkZXIgKi8KKyAgICAgICAgaWYgKCgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX01BR0lDKSB8fAorICAgICAgICAgICAgKCgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlKS0+bWFnaWMgPT0gTUhfQ0lHQU0pKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkSW5JbWFnZSgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlLCBzeW1ib2wpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5zc3ltID0gTlNMb29rdXBTeW1ib2xJbkltYWdlKChzdHJ1Y3QgbWFjaF9oZWFkZXIgKiloYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9CSU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTlNMT09LVVBTWU1CT0xJTklNQUdFX09QVElPTl9SRVRVUk5fT05fRVJST1IpOworICAgICAgICAgICAgfQogCi0JCX0KLQkJZWxzZQotCQl7Ci0JCQluc3N5bSA9IE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUoaGFuZGxlLCBzeW1ib2wpOwotCQl9Ci0JfQotCWlmICghbnNzeW0pCi0JewotCQllcnJvcigwLCAiU3ltYm9sIFwiJXNcIiBOb3QgZm91bmQiLCBzeW1ib2wpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIE5TQWRkcmVzc09mU3ltYm9sKG5zc3ltKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG5zc3ltID0gTlNMb29rdXBTeW1ib2xJbk1vZHVsZShoYW5kbGUsIHN5bWJvbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFuc3N5bSkKKyAgICB7CisgICAgICAgIGVycm9yKDAsICJTeW1ib2wgXCIlc1wiIE5vdCBmb3VuZCIsIHN5bWJvbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gTlNBZGRyZXNzT2ZTeW1ib2wobnNzeW0pOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqZGFyd2luX2RsZXJyb3Iodm9pZCkKIHsKLQlyZXR1cm4gZXJyb3IoMSwgKGNoYXIgKilOVUxMKTsKKyAgICByZXR1cm4gZXJyb3IoMSwgKGNoYXIgKilOVUxMKTsKIH0KIAogc3RhdGljIGludCBkYXJ3aW5fZGxjbG9zZSh2b2lkICpoYW5kbGUpCiB7Ci0JaWYgKCgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX01BR0lDKSB8fAotCQkoKChzdHJ1Y3QgbWFjaF9oZWFkZXIgKiloYW5kbGUpLT5tYWdpYyA9PSBNSF9DSUdBTSkpCi0JewotCQllcnJvcigwLCAiQ2FuJ3QgcmVtb3ZlIGR5bmFtaWMgbGlicmFyaWVzIG9uIGRhcndpbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFOU1VuTGlua01vZHVsZShoYW5kbGUsIDApKQotCXsKLQkJZXJyb3IoMCwgInVuYWJsZSB0byB1bmxpbmsgbW9kdWxlICVzIiwgTlNOYW1lT2ZNb2R1bGUoaGFuZGxlKSk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoKCgoc3RydWN0IG1hY2hfaGVhZGVyICopaGFuZGxlKS0+bWFnaWMgPT0gTUhfTUFHSUMpIHx8CisgICAgICAgICgoKHN0cnVjdCBtYWNoX2hlYWRlciAqKWhhbmRsZSktPm1hZ2ljID09IE1IX0NJR0FNKSkKKyAgICB7CisgICAgICAgIGVycm9yKDAsICJDYW4ndCByZW1vdmUgZHluYW1pYyBsaWJyYXJpZXMgb24gZGFyd2luIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIU5TVW5MaW5rTW9kdWxlKGhhbmRsZSwgMCkpCisgICAgeworICAgICAgICBlcnJvcigwLCAidW5hYmxlIHRvIHVubGluayBtb2R1bGUgJXMiLCBOU05hbWVPZk1vZHVsZShoYW5kbGUpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKIC8qIGRsc3ltLCBwcmVwZW5kIHRoZSB1bmRlcnNjb3JlIGFuZCBjYWxsIGRsc3ltSW50ZXJuICovCiBzdGF0aWMgdm9pZCAqZGFyd2luX2Rsc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKQogewotCXN0YXRpYyBjaGFyIHVuZGVyc3ltWzI1N107CS8qIFNhdmVzIGNhbGxzIHRvIG1hbGxvYygzKSAqLwotCWludCBzeW1fbGVuID0gc3RybGVuKHN5bWJvbCk7Ci0Jdm9pZCAqdmFsdWUgPSBOVUxMOwotCWNoYXIgKm1hbGxvY19zeW0gPSBOVUxMOworICAgIHN0YXRpYyBjaGFyIHVuZGVyc3ltWzI1N107ICAgICAgICAgIC8qIFNhdmVzIGNhbGxzIHRvIG1hbGxvYygzKSAqLworICAgIGludCBzeW1fbGVuID0gc3RybGVuKHN5bWJvbCk7CisgICAgdm9pZCAqdmFsdWUgPSBOVUxMOworICAgIGNoYXIgKm1hbGxvY19zeW0gPSBOVUxMOwogCi0JaWYgKHN5bV9sZW4gPCAyNTYpCi0JewotCQlzbnByaW50Zih1bmRlcnN5bSwgMjU2LCAiXyVzIiwgc3ltYm9sKTsKLQkJdmFsdWUgPSBkbHN5bUludGVybihoYW5kbGUsIHVuZGVyc3ltKTsKLQl9Ci0JZWxzZQotCXsKLQkJbWFsbG9jX3N5bSA9IG1hbGxvYyhzeW1fbGVuICsgMik7Ci0JCWlmIChtYWxsb2Nfc3ltKQotCQl7Ci0JCQlzcHJpbnRmKG1hbGxvY19zeW0sICJfJXMiLCBzeW1ib2wpOwotCQkJdmFsdWUgPSBkbHN5bUludGVybihoYW5kbGUsIG1hbGxvY19zeW0pOwotCQkJZnJlZShtYWxsb2Nfc3ltKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWVycm9yKDAsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5Iik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHZhbHVlOworICAgIGlmIChzeW1fbGVuIDwgMjU2KQorICAgIHsKKyAgICAgICAgc25wcmludGYodW5kZXJzeW0sIDI1NiwgIl8lcyIsIHN5bWJvbCk7CisgICAgICAgIHZhbHVlID0gZGxzeW1JbnRlcm4oaGFuZGxlLCB1bmRlcnN5bSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1hbGxvY19zeW0gPSBtYWxsb2Moc3ltX2xlbiArIDIpOworICAgICAgICBpZiAobWFsbG9jX3N5bSkKKyAgICAgICAgeworICAgICAgICAgICAgc3ByaW50ZihtYWxsb2Nfc3ltLCAiXyVzIiwgc3ltYm9sKTsKKyAgICAgICAgICAgIHZhbHVlID0gZGxzeW1JbnRlcm4oaGFuZGxlLCBtYWxsb2Nfc3ltKTsKKyAgICAgICAgICAgIGZyZWUobWFsbG9jX3N5bSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBlcnJvcigwLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKIH0KIAogc3RhdGljIGludCBkYXJ3aW5fZGxhZGRyKGNvbnN0IHZvaWQgKmhhbmRsZSwgRGxfaW5mbyAqaW5mbykgewotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogI2VuZGlmIC8qIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDwgTUFDX09TX1hfVkVSU0lPTl8xMF8zICovCiAKQEAgLTI1MiwyMSArMjUyLDIxIEBACiBzdGF0aWMKICNlbmRpZgogdm9pZCBjdHlwZXNfZGxmY25faW5pdCh2b2lkKSB7Ci0JaWYgKGRsb3BlbiAhPSBOVUxMKSB7Ci0JCWN0eXBlc19kbHN5bSA9IGRsc3ltOwotCQljdHlwZXNfZGxvcGVuID0gZGxvcGVuOwotCQljdHlwZXNfZGxlcnJvciA9IGRsZXJyb3I7Ci0JCWN0eXBlc19kbGNsb3NlID0gZGxjbG9zZTsKLQkJY3R5cGVzX2RsYWRkciA9IGRsYWRkcjsKLQl9IGVsc2UgeworICAgIGlmIChkbG9wZW4gIT0gTlVMTCkgeworICAgICAgICBjdHlwZXNfZGxzeW0gPSBkbHN5bTsKKyAgICAgICAgY3R5cGVzX2Rsb3BlbiA9IGRsb3BlbjsKKyAgICAgICAgY3R5cGVzX2RsZXJyb3IgPSBkbGVycm9yOworICAgICAgICBjdHlwZXNfZGxjbG9zZSA9IGRsY2xvc2U7CisgICAgICAgIGN0eXBlc19kbGFkZHIgPSBkbGFkZHI7CisgICAgfSBlbHNlIHsKICNpZiBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IE1BQ19PU19YX1ZFUlNJT05fMTBfMwotCQljdHlwZXNfZGxzeW0gPSBkYXJ3aW5fZGxzeW07Ci0JCWN0eXBlc19kbG9wZW4gPSBkYXJ3aW5fZGxvcGVuOwotCQljdHlwZXNfZGxlcnJvciA9IGRhcndpbl9kbGVycm9yOwotCQljdHlwZXNfZGxjbG9zZSA9IGRhcndpbl9kbGNsb3NlOwotCQljdHlwZXNfZGxhZGRyID0gZGFyd2luX2RsYWRkcjsKKyAgICAgICAgY3R5cGVzX2Rsc3ltID0gZGFyd2luX2Rsc3ltOworICAgICAgICBjdHlwZXNfZGxvcGVuID0gZGFyd2luX2Rsb3BlbjsKKyAgICAgICAgY3R5cGVzX2RsZXJyb3IgPSBkYXJ3aW5fZGxlcnJvcjsKKyAgICAgICAgY3R5cGVzX2RsY2xvc2UgPSBkYXJ3aW5fZGxjbG9zZTsKKyAgICAgICAgY3R5cGVzX2RsYWRkciA9IGRhcndpbl9kbGFkZHI7CiAjZW5kaWYgLyogTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPCBNQUNfT1NfWF9WRVJTSU9OXzEwXzMgKi8KLQl9CisgICAgfQogfQogCiAjZW5kaWYgLyogQ1RZUEVTX0RBUldJTl9ETEZDTiAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL21hbGxvY19jbG9zdXJlLmMgYi9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYwppbmRleCAxMDU5MzVlLi5jNTBkNTNlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYwpAQCAtMjcsOCArMjcsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiB1bmlvbiBfdGFnSVRFTSB7Ci0JZmZpX2Nsb3N1cmUgY2xvc3VyZTsKLQl1bmlvbiBfdGFnSVRFTSAqbmV4dDsKKyAgICBmZmlfY2xvc3VyZSBjbG9zdXJlOworICAgIHVuaW9uIF90YWdJVEVNICpuZXh0OwogfSBJVEVNOwogCiBzdGF0aWMgSVRFTSAqZnJlZV9saXN0OwpAQCAtMzYsNTggKzM2LDU4IEBACiAKIHN0YXRpYyB2b2lkIG1vcmVfY29yZSh2b2lkKQogewotCUlURU0gKml0ZW07Ci0JaW50IGNvdW50LCBpOworICAgIElURU0gKml0ZW07CisgICAgaW50IGNvdW50LCBpOwogCiAvKiBkZXRlcm1pbmUgdGhlIHBhZ2VzaXplICovCiAjaWZkZWYgTVNfV0lOMzIKLQlpZiAoIV9wYWdlc2l6ZSkgewotCQlTWVNURU1fSU5GTyBzeXN0ZW1pbmZvOwotCQlHZXRTeXN0ZW1JbmZvKCZzeXN0ZW1pbmZvKTsKLQkJX3BhZ2VzaXplID0gc3lzdGVtaW5mby5kd1BhZ2VTaXplOwotCX0KKyAgICBpZiAoIV9wYWdlc2l6ZSkgeworICAgICAgICBTWVNURU1fSU5GTyBzeXN0ZW1pbmZvOworICAgICAgICBHZXRTeXN0ZW1JbmZvKCZzeXN0ZW1pbmZvKTsKKyAgICAgICAgX3BhZ2VzaXplID0gc3lzdGVtaW5mby5kd1BhZ2VTaXplOworICAgIH0KICNlbHNlCi0JaWYgKCFfcGFnZXNpemUpIHsKKyAgICBpZiAoIV9wYWdlc2l6ZSkgewogI2lmZGVmIF9TQ19QQUdFU0laRQotCQlfcGFnZXNpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CisgICAgICAgIF9wYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKICNlbHNlCi0JCV9wYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgICAgIF9wYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CiAjZW5kaWYKLQl9CisgICAgfQogI2VuZGlmCiAKLQkvKiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBub2RlcyB0byBhbGxvY2F0ZSAqLwotCWNvdW50ID0gQkxPQ0tTSVpFIC8gc2l6ZW9mKElURU0pOworICAgIC8qIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG5vZGVzIHRvIGFsbG9jYXRlICovCisgICAgY291bnQgPSBCTE9DS1NJWkUgLyBzaXplb2YoSVRFTSk7CiAKLQkvKiBhbGxvY2F0ZSBhIG1lbW9yeSBibG9jayAqLworICAgIC8qIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrICovCiAjaWZkZWYgTVNfV0lOMzIKLQlpdGVtID0gKElURU0gKilWaXJ0dWFsQWxsb2MoTlVMTCwKLQkJCQkJICAgICAgIGNvdW50ICogc2l6ZW9mKElURU0pLAotCQkJCQkgICAgICAgTUVNX0NPTU1JVCwKLQkJCQkJICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOwotCWlmIChpdGVtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBpdGVtID0gKElURU0gKilWaXJ0dWFsQWxsb2MoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIHNpemVvZihJVEVNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1fQ09NTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfRVhFQ1VURV9SRUFEV1JJVEUpOworICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKICNlbHNlCi0JaXRlbSA9IChJVEVNICopbW1hcChOVUxMLAotCQkJICAgIGNvdW50ICogc2l6ZW9mKElURU0pLAotCQkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsCi0JCQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLAotCQkJICAgIC0xLAotCQkJICAgIDApOwotCWlmIChpdGVtID09ICh2b2lkICopTUFQX0ZBSUxFRCkKLQkJcmV0dXJuOworICAgIGl0ZW0gPSAoSVRFTSAqKW1tYXAoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICogc2l6ZW9mKElURU0pLAorICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywKKyAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKGl0ZW0gPT0gKHZvaWQgKilNQVBfRkFJTEVEKQorICAgICAgICByZXR1cm47CiAjZW5kaWYKIAogI2lmZGVmIE1BTExPQ19DTE9TVVJFX0RFQlVHCi0JcHJpbnRmKCJibG9jayBhdCAlcCBhbGxvY2F0ZWQgKCVkIGJ5dGVzKSwgJWQgSVRFTXNcbiIsCi0JICAgICAgIGl0ZW0sIGNvdW50ICogc2l6ZW9mKElURU0pLCBjb3VudCk7CisgICAgcHJpbnRmKCJibG9jayBhdCAlcCBhbGxvY2F0ZWQgKCVkIGJ5dGVzKSwgJWQgSVRFTXNcbiIsCisgICAgICAgICAgIGl0ZW0sIGNvdW50ICogc2l6ZW9mKElURU0pLCBjb3VudCk7CiAjZW5kaWYKLQkvKiBwdXQgdGhlbSBpbnRvIHRoZSBmcmVlIGxpc3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQlpdGVtLT5uZXh0ID0gZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSBpdGVtOwotCQkrK2l0ZW07Ci0JfQorICAgIC8qIHB1dCB0aGVtIGludG8gdGhlIGZyZWUgbGlzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIGl0ZW0tPm5leHQgPSBmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IGl0ZW07CisgICAgICAgICsraXRlbTsKKyAgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NSwyMCArOTUsMjAgQEAKIC8qIHB1dCB0aGUgaXRlbSBiYWNrIGludG8gdGhlIGZyZWUgbGlzdCAqLwogdm9pZCBGcmVlQ2xvc3VyZSh2b2lkICpwKQogewotCUlURU0gKml0ZW0gPSAoSVRFTSAqKXA7Ci0JaXRlbS0+bmV4dCA9IGZyZWVfbGlzdDsKLQlmcmVlX2xpc3QgPSBpdGVtOworICAgIElURU0gKml0ZW0gPSAoSVRFTSAqKXA7CisgICAgaXRlbS0+bmV4dCA9IGZyZWVfbGlzdDsKKyAgICBmcmVlX2xpc3QgPSBpdGVtOwogfQogCiAvKiByZXR1cm4gb25lIGl0ZW0gZnJvbSB0aGUgZnJlZSBsaXN0LCBhbGxvY2F0aW5nIG1vcmUgaWYgbmVlZGVkICovCiB2b2lkICpNYWxsb2NDbG9zdXJlKHZvaWQpCiB7Ci0JSVRFTSAqaXRlbTsKLQlpZiAoIWZyZWVfbGlzdCkKLQkJbW9yZV9jb3JlKCk7Ci0JaWYgKCFmcmVlX2xpc3QpCi0JCXJldHVybiBOVUxMOwotCWl0ZW0gPSBmcmVlX2xpc3Q7Ci0JZnJlZV9saXN0ID0gaXRlbS0+bmV4dDsKLQlyZXR1cm4gaXRlbTsKKyAgICBJVEVNICppdGVtOworICAgIGlmICghZnJlZV9saXN0KQorICAgICAgICBtb3JlX2NvcmUoKTsKKyAgICBpZiAoIWZyZWVfbGlzdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXRlbSA9IGZyZWVfbGlzdDsKKyAgICBmcmVlX2xpc3QgPSBpdGVtLT5uZXh0OworICAgIHJldHVybiBpdGVtOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYyBiL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMKaW5kZXggZGFiZjlmMS4uOGFlMDliZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jCkBAIC0yMywxNDUgKzIzLDE0NSBAQAogc3RhdGljIGludAogU3RnRGljdF9pbml0KFN0Z0RpY3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpZiAoUHlEaWN0X1R5cGUudHBfaW5pdCgoUHlPYmplY3QgKilzZWxmLCBhcmdzLCBrd2RzKSA8IDApCi0JCXJldHVybiAtMTsKLQlzZWxmLT5mb3JtYXQgPSBOVUxMOwotCXNlbGYtPm5kaW0gPSAwOwotCXNlbGYtPnNoYXBlID0gTlVMTDsKLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlEaWN0X1R5cGUudHBfaW5pdCgoUHlPYmplY3QgKilzZWxmLCBhcmdzLCBrd2RzKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzZWxmLT5mb3JtYXQgPSBOVUxMOworICAgIHNlbGYtPm5kaW0gPSAwOworICAgIHNlbGYtPnNoYXBlID0gTlVMTDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogU3RnRGljdF9jbGVhcihTdGdEaWN0T2JqZWN0ICpzZWxmKQogewotCVB5X0NMRUFSKHNlbGYtPnByb3RvKTsKLQlQeV9DTEVBUihzZWxmLT5hcmd0eXBlcyk7Ci0JUHlfQ0xFQVIoc2VsZi0+Y29udmVydGVycyk7Ci0JUHlfQ0xFQVIoc2VsZi0+cmVzdHlwZSk7Ci0JUHlfQ0xFQVIoc2VsZi0+Y2hlY2tlcik7Ci0JcmV0dXJuIDA7CisgICAgUHlfQ0xFQVIoc2VsZi0+cHJvdG8pOworICAgIFB5X0NMRUFSKHNlbGYtPmFyZ3R5cGVzKTsKKyAgICBQeV9DTEVBUihzZWxmLT5jb252ZXJ0ZXJzKTsKKyAgICBQeV9DTEVBUihzZWxmLT5yZXN0eXBlKTsKKyAgICBQeV9DTEVBUihzZWxmLT5jaGVja2VyKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIFN0Z0RpY3RfZGVhbGxvYyhTdGdEaWN0T2JqZWN0ICpzZWxmKQogewotCVN0Z0RpY3RfY2xlYXIoc2VsZik7Ci0JUHlNZW1fRnJlZShzZWxmLT5mb3JtYXQpOwotCVB5TWVtX0ZyZWUoc2VsZi0+c2hhcGUpOwotCVB5TWVtX0ZyZWUoc2VsZi0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7Ci0JUHlEaWN0X1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBTdGdEaWN0X2NsZWFyKHNlbGYpOworICAgIFB5TWVtX0ZyZWUoc2VsZi0+Zm9ybWF0KTsKKyAgICBQeU1lbV9GcmVlKHNlbGYtPnNoYXBlKTsKKyAgICBQeU1lbV9GcmVlKHNlbGYtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMpOworICAgIFB5RGljdF9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIGludAogU3RnRGljdF9jbG9uZShTdGdEaWN0T2JqZWN0ICpkc3QsIFN0Z0RpY3RPYmplY3QgKnNyYykKIHsKLQljaGFyICpkLCAqczsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgY2hhciAqZCwgKnM7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0JU3RnRGljdF9jbGVhcihkc3QpOwotCVB5TWVtX0ZyZWUoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzKTsKLQlQeU1lbV9GcmVlKGRzdC0+Zm9ybWF0KTsKLQlkc3QtPmZvcm1hdCA9IE5VTEw7Ci0JUHlNZW1fRnJlZShkc3QtPnNoYXBlKTsKLQlkc3QtPnNoYXBlID0gTlVMTDsKLQlkc3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBOVUxMOworICAgIFN0Z0RpY3RfY2xlYXIoZHN0KTsKKyAgICBQeU1lbV9GcmVlKGRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7CisgICAgUHlNZW1fRnJlZShkc3QtPmZvcm1hdCk7CisgICAgZHN0LT5mb3JtYXQgPSBOVUxMOworICAgIFB5TWVtX0ZyZWUoZHN0LT5zaGFwZSk7CisgICAgZHN0LT5zaGFwZSA9IE5VTEw7CisgICAgZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gTlVMTDsKIAotCWQgPSAoY2hhciAqKWRzdDsKLQlzID0gKGNoYXIgKilzcmM7Ci0JbWVtY3B5KGQgKyBzaXplb2YoUHlEaWN0T2JqZWN0KSwKLQkgICAgICAgcyArIHNpemVvZihQeURpY3RPYmplY3QpLAotCSAgICAgICBzaXplb2YoU3RnRGljdE9iamVjdCkgLSBzaXplb2YoUHlEaWN0T2JqZWN0KSk7CisgICAgZCA9IChjaGFyICopZHN0OworICAgIHMgPSAoY2hhciAqKXNyYzsKKyAgICBtZW1jcHkoZCArIHNpemVvZihQeURpY3RPYmplY3QpLAorICAgICAgICAgICBzICsgc2l6ZW9mKFB5RGljdE9iamVjdCksCisgICAgICAgICAgIHNpemVvZihTdGdEaWN0T2JqZWN0KSAtIHNpemVvZihQeURpY3RPYmplY3QpKTsKIAotCVB5X1hJTkNSRUYoZHN0LT5wcm90byk7Ci0JUHlfWElOQ1JFRihkc3QtPmFyZ3R5cGVzKTsKLQlQeV9YSU5DUkVGKGRzdC0+Y29udmVydGVycyk7Ci0JUHlfWElOQ1JFRihkc3QtPnJlc3R5cGUpOwotCVB5X1hJTkNSRUYoZHN0LT5jaGVja2VyKTsKKyAgICBQeV9YSU5DUkVGKGRzdC0+cHJvdG8pOworICAgIFB5X1hJTkNSRUYoZHN0LT5hcmd0eXBlcyk7CisgICAgUHlfWElOQ1JFRihkc3QtPmNvbnZlcnRlcnMpOworICAgIFB5X1hJTkNSRUYoZHN0LT5yZXN0eXBlKTsKKyAgICBQeV9YSU5DUkVGKGRzdC0+Y2hlY2tlcik7CiAKLQlpZiAoc3JjLT5mb3JtYXQpIHsKLQkJZHN0LT5mb3JtYXQgPSBQeU1lbV9NYWxsb2Moc3RybGVuKHNyYy0+Zm9ybWF0KSArIDEpOwotCQlpZiAoZHN0LT5mb3JtYXQgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJc3RyY3B5KGRzdC0+Zm9ybWF0LCBzcmMtPmZvcm1hdCk7Ci0JfQotCWlmIChzcmMtPnNoYXBlKSB7Ci0JCWRzdC0+c2hhcGUgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5X3NzaXplX3QpICogc3JjLT5uZGltKTsKLQkJaWYgKGRzdC0+c2hhcGUgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJbWVtY3B5KGRzdC0+c2hhcGUsIHNyYy0+c2hhcGUsCi0JCSAgICAgICBzaXplb2YoUHlfc3NpemVfdCkgKiBzcmMtPm5kaW0pOwotCX0KKyAgICBpZiAoc3JjLT5mb3JtYXQpIHsKKyAgICAgICAgZHN0LT5mb3JtYXQgPSBQeU1lbV9NYWxsb2Moc3RybGVuKHNyYy0+Zm9ybWF0KSArIDEpOworICAgICAgICBpZiAoZHN0LT5mb3JtYXQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc3RyY3B5KGRzdC0+Zm9ybWF0LCBzcmMtPmZvcm1hdCk7CisgICAgfQorICAgIGlmIChzcmMtPnNoYXBlKSB7CisgICAgICAgIGRzdC0+c2hhcGUgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKFB5X3NzaXplX3QpICogc3JjLT5uZGltKTsKKyAgICAgICAgaWYgKGRzdC0+c2hhcGUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbWVtY3B5KGRzdC0+c2hhcGUsIHNyYy0+c2hhcGUsCisgICAgICAgICAgICAgICBzaXplb2YoUHlfc3NpemVfdCkgKiBzcmMtPm5kaW0pOworICAgIH0KIAotCWlmIChzcmMtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0Jc2l6ZSA9IHNpemVvZihmZmlfdHlwZSAqKSAqIChzcmMtPmxlbmd0aCArIDEpOwotCWRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplKTsKLQlpZiAoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltZW1jcHkoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAotCSAgICAgICBzcmMtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCi0JICAgICAgIHNpemUpOwotCXJldHVybiAwOworICAgIGlmIChzcmMtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc2l6ZSA9IHNpemVvZihmZmlfdHlwZSAqKSAqIChzcmMtPmxlbmd0aCArIDEpOworICAgIGRzdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9IFB5TWVtX01hbGxvYyhzaXplKTsKKyAgICBpZiAoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1jcHkoZHN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAorICAgICAgICAgICBzcmMtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCisgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiAwOwogfQogCiBQeVR5cGVPYmplY3QgU3RnRGljdF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJTdGdEaWN0IiwKLQlzaXplb2YoU3RnRGljdE9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilTdGdEaWN0X2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpU3RnRGljdF9pbml0LAkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiU3RnRGljdCIsCisgICAgc2l6ZW9mKFN0Z0RpY3RPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpU3RnRGljdF9kZWFsbG9jLCAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylTdGdEaWN0X2luaXQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogTWF5IHJldHVybiBOVUxMLCBidXQgZG9lcyBub3Qgc2V0IGFuIGV4Y2VwdGlvbiEgKi8KIFN0Z0RpY3RPYmplY3QgKgogUHlUeXBlX3N0Z2RpY3QoUHlPYmplY3QgKm9iaikKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGU7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlOwogCi0JaWYgKCFQeVR5cGVfQ2hlY2sob2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdHlwZSA9IChQeVR5cGVPYmplY3QgKilvYmo7Ci0JaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIXR5cGUtPnRwX2RpY3QgfHwgIVN0Z0RpY3RfQ2hlY2tFeGFjdCh0eXBlLT50cF9kaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIChTdGdEaWN0T2JqZWN0ICopdHlwZS0+dHBfZGljdDsKKyAgICBpZiAoIVB5VHlwZV9DaGVjayhvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0eXBlID0gKFB5VHlwZU9iamVjdCAqKW9iajsKKyAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghdHlwZS0+dHBfZGljdCB8fCAhU3RnRGljdF9DaGVja0V4YWN0KHR5cGUtPnRwX2RpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFN0Z0RpY3RPYmplY3QgKil0eXBlLT50cF9kaWN0OwogfQogCiAvKiBNYXkgcmV0dXJuIE5VTEwsIGJ1dCBkb2VzIG5vdCBzZXQgYW4gZXhjZXB0aW9uISAqLwpAQCAtMTcyLDEyICsxNzIsMTIgQEAKIFN0Z0RpY3RPYmplY3QgKgogUHlPYmplY3Rfc3RnZGljdChQeU9iamVjdCAqc2VsZikKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGUgPSBzZWxmLT5vYl90eXBlOwotCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCF0eXBlLT50cF9kaWN0IHx8ICFTdGdEaWN0X0NoZWNrRXhhY3QodHlwZS0+dHBfZGljdCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoU3RnRGljdE9iamVjdCAqKXR5cGUtPnRwX2RpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gc2VsZi0+b2JfdHlwZTsKKyAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghdHlwZS0+dHBfZGljdCB8fCAhU3RnRGljdF9DaGVja0V4YWN0KHR5cGUtPnRwX2RpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFN0Z0RpY3RPYmplY3QgKil0eXBlLT50cF9kaWN0OwogfQogCiAvKiBkZXNjciBpcyB0aGUgZGVzY3JpcHRvciBmb3IgYSBmaWVsZCBtYXJrZWQgYXMgYW5vbnltb3VzLiAgR2V0IGFsbCB0aGUKQEAgLTE4Niw3OCArMTg2LDc4IEBACiAgKi8KIHN0YXRpYyBpbnQKIE1ha2VGaWVsZHMoUHlPYmplY3QgKnR5cGUsIENGaWVsZE9iamVjdCAqZGVzY3IsCi0JICAgUHlfc3NpemVfdCBpbmRleCwgUHlfc3NpemVfdCBvZmZzZXQpCisgICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgb2Zmc2V0KQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqZmllbGRzOwotCVB5T2JqZWN0ICpmaWVsZGxpc3Q7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpmaWVsZHM7CisgICAgUHlPYmplY3QgKmZpZWxkbGlzdDsKIAotCWZpZWxkcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGVzY3ItPnByb3RvLCAiX2ZpZWxkc18iKTsKLQlpZiAoZmllbGRzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlmaWVsZGxpc3QgPSBQeVNlcXVlbmNlX0Zhc3QoZmllbGRzLCAiX2ZpZWxkc18gbXVzdCBiZSBhIHNlcXVlbmNlIik7Ci0JUHlfREVDUkVGKGZpZWxkcyk7Ci0JaWYgKGZpZWxkbGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgZmllbGRzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkZXNjci0+cHJvdG8sICJfZmllbGRzXyIpOworICAgIGlmIChmaWVsZHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZpZWxkbGlzdCA9IFB5U2VxdWVuY2VfRmFzdChmaWVsZHMsICJfZmllbGRzXyBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKKyAgICBQeV9ERUNSRUYoZmllbGRzKTsKKyAgICBpZiAoZmllbGRsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCWZvciAoaSA9IDA7IGkgPCBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmllbGRsaXN0KTsgKytpKSB7Ci0JCVB5T2JqZWN0ICpwYWlyID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZpZWxkbGlzdCwgaSk7IC8qIGJvcnJvd2VkICovCi0JCVB5T2JqZWN0ICpmbmFtZSwgKmZ0eXBlLCAqYml0czsKLQkJQ0ZpZWxkT2JqZWN0ICpmZGVzY3I7Ci0JCUNGaWVsZE9iamVjdCAqbmV3X2Rlc2NyOwotCQkvKiBDb252ZXJ0IHRvIFB5QXJnX1VucGFja1R1cGxlLi4uICovCi0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShwYWlyLCAiT098TyIsICZmbmFtZSwgJmZ0eXBlLCAmYml0cykpIHsKLQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZkZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9HZXRBdHRyKGRlc2NyLT5wcm90bywgZm5hbWUpOwotCQlpZiAoZmRlc2NyID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChQeV9UWVBFKGZkZXNjcikgIT0gJkNGaWVsZF9UeXBlKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidW5leHBlY3RlZCB0eXBlIik7Ci0JCQlQeV9ERUNSRUYoZmRlc2NyKTsKLQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChmZGVzY3ItPmFub255bW91cykgewotCQkJaW50IHJjID0gTWFrZUZpZWxkcyh0eXBlLCBmZGVzY3IsCi0JCQkJCSAgICBpbmRleCArIGZkZXNjci0+aW5kZXgsCi0JCQkJCSAgICBvZmZzZXQgKyBmZGVzY3ItPm9mZnNldCk7Ci0JCQlQeV9ERUNSRUYoZmRlc2NyKTsKLQkJCWlmIChyYyA9PSAtMSkgewotCQkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0gCQluZXdfZGVzY3IgPSAoQ0ZpZWxkT2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgoUHlPYmplY3QgKikmQ0ZpZWxkX1R5cGUsIE5VTEwpOwotCQlpZiAobmV3X2Rlc2NyID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmZGVzY3IpOwotCQkJUHlfREVDUkVGKGZpZWxkbGlzdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYXNzZXJ0KFB5X1RZUEUobmV3X2Rlc2NyKSA9PSAmQ0ZpZWxkX1R5cGUpOwotIAkJbmV3X2Rlc2NyLT5zaXplID0gZmRlc2NyLT5zaXplOwotIAkJbmV3X2Rlc2NyLT5vZmZzZXQgPSBmZGVzY3ItPm9mZnNldCArIG9mZnNldDsKLSAJCW5ld19kZXNjci0+aW5kZXggPSBmZGVzY3ItPmluZGV4ICsgaW5kZXg7Ci0gCQluZXdfZGVzY3ItPnByb3RvID0gZmRlc2NyLT5wcm90bzsKLSAJCVB5X1hJTkNSRUYobmV3X2Rlc2NyLT5wcm90byk7Ci0gCQluZXdfZGVzY3ItPmdldGZ1bmMgPSBmZGVzY3ItPmdldGZ1bmM7Ci0gCQluZXdfZGVzY3ItPnNldGZ1bmMgPSBmZGVzY3ItPnNldGZ1bmM7CisgICAgZm9yIChpID0gMDsgaSA8IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShmaWVsZGxpc3QpOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKnBhaXIgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZmllbGRsaXN0LCBpKTsgLyogYm9ycm93ZWQgKi8KKyAgICAgICAgUHlPYmplY3QgKmZuYW1lLCAqZnR5cGUsICpiaXRzOworICAgICAgICBDRmllbGRPYmplY3QgKmZkZXNjcjsKKyAgICAgICAgQ0ZpZWxkT2JqZWN0ICpuZXdfZGVzY3I7CisgICAgICAgIC8qIENvbnZlcnQgdG8gUHlBcmdfVW5wYWNrVHVwbGUuLi4gKi8KKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBhaXIsICJPT3xPIiwgJmZuYW1lLCAmZnR5cGUsICZiaXRzKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZmRlc2NyID0gKENGaWVsZE9iamVjdCAqKVB5T2JqZWN0X0dldEF0dHIoZGVzY3ItPnByb3RvLCBmbmFtZSk7CisgICAgICAgIGlmIChmZGVzY3IgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5X1RZUEUoZmRlc2NyKSAhPSAmQ0ZpZWxkX1R5cGUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmV4cGVjdGVkIHR5cGUiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmZGVzY3IpOworICAgICAgICAgICAgUHlfREVDUkVGKGZpZWxkbGlzdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZkZXNjci0+YW5vbnltb3VzKSB7CisgICAgICAgICAgICBpbnQgcmMgPSBNYWtlRmllbGRzKHR5cGUsIGZkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKyBmZGVzY3ItPmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyBmZGVzY3ItPm9mZnNldCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmRlc2NyKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmaWVsZGxpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5ld19kZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKSZDRmllbGRfVHlwZSwgTlVMTCk7CisgICAgICAgIGlmIChuZXdfZGVzY3IgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZkZXNjcik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGRsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoUHlfVFlQRShuZXdfZGVzY3IpID09ICZDRmllbGRfVHlwZSk7CisgICAgICAgIG5ld19kZXNjci0+c2l6ZSA9IGZkZXNjci0+c2l6ZTsKKyAgICAgICAgbmV3X2Rlc2NyLT5vZmZzZXQgPSBmZGVzY3ItPm9mZnNldCArIG9mZnNldDsKKyAgICAgICAgbmV3X2Rlc2NyLT5pbmRleCA9IGZkZXNjci0+aW5kZXggKyBpbmRleDsKKyAgICAgICAgbmV3X2Rlc2NyLT5wcm90byA9IGZkZXNjci0+cHJvdG87CisgICAgICAgIFB5X1hJTkNSRUYobmV3X2Rlc2NyLT5wcm90byk7CisgICAgICAgIG5ld19kZXNjci0+Z2V0ZnVuYyA9IGZkZXNjci0+Z2V0ZnVuYzsKKyAgICAgICAgbmV3X2Rlc2NyLT5zZXRmdW5jID0gZmRlc2NyLT5zZXRmdW5jOwogCi0gIAkJUHlfREVDUkVGKGZkZXNjcik7Ci0JCQotCQlpZiAoLTEgPT0gUHlPYmplY3RfU2V0QXR0cih0eXBlLCBmbmFtZSwgKFB5T2JqZWN0ICopbmV3X2Rlc2NyKSkgewotCQkJUHlfREVDUkVGKGZpZWxkbGlzdCk7Ci0JCQlQeV9ERUNSRUYobmV3X2Rlc2NyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9ERUNSRUYobmV3X2Rlc2NyKTsKLQl9Ci0JUHlfREVDUkVGKGZpZWxkbGlzdCk7Ci0JcmV0dXJuIDA7CisgICAgICAgIFB5X0RFQ1JFRihmZGVzY3IpOworCisgICAgICAgIGlmICgtMSA9PSBQeU9iamVjdF9TZXRBdHRyKHR5cGUsIGZuYW1lLCAoUHlPYmplY3QgKiluZXdfZGVzY3IpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZmllbGRsaXN0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdfZGVzY3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihuZXdfZGVzY3IpOworICAgIH0KKyAgICBQeV9ERUNSRUYoZmllbGRsaXN0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogSXRlcmF0ZSBvdmVyIHRoZSBuYW1lcyBpbiB0aGUgdHlwZSdzIF9hbm9ueW1vdXNfIGF0dHJpYnV0ZSwgaWYgcHJlc2VudCwKQEAgLTI2NSw0MyArMjY1LDQzIEBACiBzdGF0aWMgaW50CiBNYWtlQW5vbkZpZWxkcyhQeU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqYW5vbjsKLQlQeU9iamVjdCAqYW5vbl9uYW1lczsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKmFub247CisgICAgUHlPYmplY3QgKmFub25fbmFtZXM7CisgICAgUHlfc3NpemVfdCBpOwogCi0JYW5vbiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodHlwZSwgIl9hbm9ueW1vdXNfIik7Ci0JaWYgKGFub24gPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gMDsKLQl9Ci0JYW5vbl9uYW1lcyA9IFB5U2VxdWVuY2VfRmFzdChhbm9uLCAiX2Fub255bW91c18gbXVzdCBiZSBhIHNlcXVlbmNlIik7Ci0JUHlfREVDUkVGKGFub24pOwotCWlmIChhbm9uX25hbWVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBhbm9uID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0eXBlLCAiX2Fub255bW91c18iKTsKKyAgICBpZiAoYW5vbiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhbm9uX25hbWVzID0gUHlTZXF1ZW5jZV9GYXN0KGFub24sICJfYW5vbnltb3VzXyBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKKyAgICBQeV9ERUNSRUYoYW5vbik7CisgICAgaWYgKGFub25fbmFtZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JZm9yIChpID0gMDsgaSA8IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShhbm9uX25hbWVzKTsgKytpKSB7Ci0JCVB5T2JqZWN0ICpmbmFtZSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShhbm9uX25hbWVzLCBpKTsgLyogYm9ycm93ZWQgKi8KLQkJQ0ZpZWxkT2JqZWN0ICpkZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9HZXRBdHRyKHR5cGUsIGZuYW1lKTsKLQkJaWYgKGRlc2NyID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihhbm9uX25hbWVzKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlhc3NlcnQoUHlfVFlQRShkZXNjcikgPT0gJkNGaWVsZF9UeXBlKTsKLQkJZGVzY3ItPmFub255bW91cyA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShhbm9uX25hbWVzKTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICpmbmFtZSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShhbm9uX25hbWVzLCBpKTsgLyogYm9ycm93ZWQgKi8KKyAgICAgICAgQ0ZpZWxkT2JqZWN0ICpkZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9HZXRBdHRyKHR5cGUsIGZuYW1lKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhbm9uX25hbWVzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoUHlfVFlQRShkZXNjcikgPT0gJkNGaWVsZF9UeXBlKTsKKyAgICAgICAgZGVzY3ItPmFub255bW91cyA9IDE7CiAKLQkJLyogZGVzY3IgaXMgaW4gdGhlIGZpZWxkIGRlc2NyaXB0b3IuICovCi0JCWlmICgtMSA9PSBNYWtlRmllbGRzKHR5cGUsIChDRmllbGRPYmplY3QgKilkZXNjciwKLQkJCQkgICAgICgoQ0ZpZWxkT2JqZWN0ICopZGVzY3IpLT5pbmRleCwKLQkJCQkgICAgICgoQ0ZpZWxkT2JqZWN0ICopZGVzY3IpLT5vZmZzZXQpKSB7Ci0JCQlQeV9ERUNSRUYoZGVzY3IpOwotCQkJUHlfREVDUkVGKGFub25fbmFtZXMpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRihkZXNjcik7Ci0JfQorICAgICAgICAvKiBkZXNjciBpcyBpbiB0aGUgZmllbGQgZGVzY3JpcHRvci4gKi8KKyAgICAgICAgaWYgKC0xID09IE1ha2VGaWVsZHModHlwZSwgKENGaWVsZE9iamVjdCAqKWRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENGaWVsZE9iamVjdCAqKWRlc2NyKS0+aW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQ0ZpZWxkT2JqZWN0ICopZGVzY3IpLT5vZmZzZXQpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgICAgICAgICAgUHlfREVDUkVGKGFub25fbmFtZXMpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgfQogCi0JUHlfREVDUkVGKGFub25fbmFtZXMpOwotCXJldHVybiAwOworICAgIFB5X0RFQ1JFRihhbm9uX25hbWVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTMxMSwyNjUgKzMxMSwyNjUgQEAKIGludAogU3RydWN0VW5pb25UeXBlX3VwZGF0ZV9zdGdkaWN0KFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqZmllbGRzLCBpbnQgaXNTdHJ1Y3QpCiB7Ci0JU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKmJhc2VkaWN0OwotCVB5X3NzaXplX3QgbGVuLCBvZmZzZXQsIHNpemUsIGFsaWduLCBpOwotCVB5X3NzaXplX3QgdW5pb25fc2l6ZSwgdG90YWxfYWxpZ247Ci0JUHlfc3NpemVfdCBmaWVsZF9zaXplID0gMDsKLQlpbnQgYml0b2ZzOwotCVB5T2JqZWN0ICppc1BhY2tlZDsKLQlpbnQgcGFjayA9IDA7Ci0JUHlfc3NpemVfdCBmZmlfb2ZzOwotCWludCBiaWdfZW5kaWFuOworICAgIFN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICpiYXNlZGljdDsKKyAgICBQeV9zc2l6ZV90IGxlbiwgb2Zmc2V0LCBzaXplLCBhbGlnbiwgaTsKKyAgICBQeV9zc2l6ZV90IHVuaW9uX3NpemUsIHRvdGFsX2FsaWduOworICAgIFB5X3NzaXplX3QgZmllbGRfc2l6ZSA9IDA7CisgICAgaW50IGJpdG9mczsKKyAgICBQeU9iamVjdCAqaXNQYWNrZWQ7CisgICAgaW50IHBhY2sgPSAwOworICAgIFB5X3NzaXplX3QgZmZpX29mczsKKyAgICBpbnQgYmlnX2VuZGlhbjsKIAotCS8qIEhBQ0sgQWxlcnQ6IEkgY2Fubm90IGJlIGJvdGhlcmVkIHRvIGZpeCBjdHlwZXMuY29tLCBzbyB0aGVyZSBoYXMgdG8KLQkgICBiZSBhIHdheSB0byB1c2UgdGhlIG9sZCwgYnJva2VuIHNlbWF0aWNzOiBfZmllbGRzXyBhcmUgbm90IGV4dGVuZGVkCi0JICAgYnV0IHJlcGxhY2VkIGluIHN1YmNsYXNzZXMuCi0JICAgCi0JICAgWFhYIFJlbW92ZSB0aGlzIGluIGN0eXBlcyAxLjAhCi0JKi8KLQlpbnQgdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3NlbWFudGljczsKKyAgICAvKiBIQUNLIEFsZXJ0OiBJIGNhbm5vdCBiZSBib3RoZXJlZCB0byBmaXggY3R5cGVzLmNvbSwgc28gdGhlcmUgaGFzIHRvCisgICAgICAgYmUgYSB3YXkgdG8gdXNlIHRoZSBvbGQsIGJyb2tlbiBzZW1hdGljczogX2ZpZWxkc18gYXJlIG5vdCBleHRlbmRlZAorICAgICAgIGJ1dCByZXBsYWNlZCBpbiBzdWJjbGFzc2VzLgogCi0JaWYgKGZpZWxkcyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICAgICBYWFggUmVtb3ZlIHRoaXMgaW4gY3R5cGVzIDEuMCEKKyAgICAqLworICAgIGludCB1c2VfYnJva2VuX29sZF9jdHlwZXNfc2VtYW50aWNzOworCisgICAgaWYgKGZpZWxkcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAogI2lmZGVmIFdPUkRTX0JJR0VORElBTgotCWJpZ19lbmRpYW4gPSBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHR5cGUsICJfc3dhcHBlZGJ5dGVzXyIpID8gMCA6IDE7CisgICAgYmlnX2VuZGlhbiA9IFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodHlwZSwgIl9zd2FwcGVkYnl0ZXNfIikgPyAwIDogMTsKICNlbHNlCi0JYmlnX2VuZGlhbiA9IFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodHlwZSwgIl9zd2FwcGVkYnl0ZXNfIikgPyAxIDogMDsKKyAgICBiaWdfZW5kaWFuID0gUHlPYmplY3RfSGFzQXR0clN0cmluZyh0eXBlLCAiX3N3YXBwZWRieXRlc18iKSA/IDEgOiAwOwogI2VuZGlmCiAKLQl1c2VfYnJva2VuX29sZF9jdHlwZXNfc2VtYW50aWNzID0gXAotCQlQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHR5cGUsICJfdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3N0cnVjdHVyZV9zZW1hbnRpY3NfIik7CisgICAgdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3NlbWFudGljcyA9IFwKKyAgICAgICAgUHlPYmplY3RfSGFzQXR0clN0cmluZyh0eXBlLCAiX3VzZV9icm9rZW5fb2xkX2N0eXBlc19zdHJ1Y3R1cmVfc2VtYW50aWNzXyIpOwogCi0JaXNQYWNrZWQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHR5cGUsICJfcGFja18iKTsKLQlpZiAoaXNQYWNrZWQpIHsKLQkJcGFjayA9IFB5SW50X0FzTG9uZyhpc1BhY2tlZCk7Ci0JCWlmIChwYWNrIDwgMCB8fCBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeV9YREVDUkVGKGlzUGFja2VkKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiX3BhY2tfIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRihpc1BhY2tlZCk7Ci0JfSBlbHNlCi0JCVB5RXJyX0NsZWFyKCk7CisgICAgaXNQYWNrZWQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHR5cGUsICJfcGFja18iKTsKKyAgICBpZiAoaXNQYWNrZWQpIHsKKyAgICAgICAgcGFjayA9IFB5SW50X0FzTG9uZyhpc1BhY2tlZCk7CisgICAgICAgIGlmIChwYWNrIDwgMCB8fCBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGlzUGFja2VkKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfcGFja18gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGlzUGFja2VkKTsKKyAgICB9IGVsc2UKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIAotCWxlbiA9IFB5U2VxdWVuY2VfTGVuZ3RoKGZpZWxkcyk7Ci0JaWYgKGxlbiA9PSAtMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSInX2ZpZWxkc18nIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBwYWlycyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGxlbiA9IFB5U2VxdWVuY2VfTGVuZ3RoKGZpZWxkcyk7CisgICAgaWYgKGxlbiA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIidfZmllbGRzXycgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIHBhaXJzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlzdGdkaWN0ID0gUHlUeXBlX3N0Z2RpY3QodHlwZSk7Ci0JaWYgKCFzdGdkaWN0KQotCQlyZXR1cm4gLTE7Ci0JLyogSWYgdGhpcyBzdHJ1Y3R1cmUvdW5pb24gaXMgYWxyZWFkeSBtYXJrZWQgZmluYWwgd2UgY2Fubm90IGFzc2lnbgotCSAgIF9maWVsZHNfIGFueW1vcmUuICovCisgICAgc3RnZGljdCA9IFB5VHlwZV9zdGdkaWN0KHR5cGUpOworICAgIGlmICghc3RnZGljdCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIElmIHRoaXMgc3RydWN0dXJlL3VuaW9uIGlzIGFscmVhZHkgbWFya2VkIGZpbmFsIHdlIGNhbm5vdCBhc3NpZ24KKyAgICAgICBfZmllbGRzXyBhbnltb3JlLiAqLwogCi0JaWYgKHN0Z2RpY3QtPmZsYWdzICYgRElDVEZMQUdfRklOQUwpIHsvKiBpcyBmaW5hbCA/ICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkiX2ZpZWxkc18gaXMgZmluYWwiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoc3RnZGljdC0+ZmxhZ3MgJiBESUNURkxBR19GSU5BTCkgey8qIGlzIGZpbmFsID8gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9maWVsZHNfIGlzIGZpbmFsIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoc3RnZGljdC0+Zm9ybWF0KSB7Ci0JCVB5TWVtX0ZyZWUoc3RnZGljdC0+Zm9ybWF0KTsKLQkJc3RnZGljdC0+Zm9ybWF0ID0gTlVMTDsKLQl9CisgICAgaWYgKHN0Z2RpY3QtPmZvcm1hdCkgeworICAgICAgICBQeU1lbV9GcmVlKHN0Z2RpY3QtPmZvcm1hdCk7CisgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IE5VTEw7CisgICAgfQogCi0JaWYgKHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMpCi0JCVB5TWVtX0ZyZWUoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7CisgICAgaWYgKHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMpCisgICAgICAgIFB5TWVtX0ZyZWUoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyk7CiAKLQliYXNlZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKSgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX2Jhc2UpOwotCWlmIChiYXNlZGljdCAmJiAhdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3NlbWFudGljcykgewotCQlzaXplID0gb2Zmc2V0ID0gYmFzZWRpY3QtPnNpemU7Ci0JCWFsaWduID0gYmFzZWRpY3QtPmFsaWduOwotCQl1bmlvbl9zaXplID0gMDsKLQkJdG90YWxfYWxpZ24gPSBhbGlnbiA/IGFsaWduIDogMTsKLQkJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlID0gRkZJX1RZUEVfU1RSVUNUOwotCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOwotCQlpZiAoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1lbXNldChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLCAwLAotCQkgICAgICAgc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGggKyBsZW4gKyAxKSk7Ci0JCW1lbWNweShzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAotCQkgICAgICAgYmFzZWRpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCi0JCSAgICAgICBzaXplb2YoZmZpX3R5cGUgKikgKiAoYmFzZWRpY3QtPmxlbmd0aCkpOwotCQlmZmlfb2ZzID0gYmFzZWRpY3QtPmxlbmd0aDsKLQl9IGVsc2UgewotCQlvZmZzZXQgPSAwOwotCQlzaXplID0gMDsKLQkJYWxpZ24gPSAwOwotCQl1bmlvbl9zaXplID0gMDsKLQkJdG90YWxfYWxpZ24gPSAxOwotCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7Ci0JCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKGZmaV90eXBlICopICogKGxlbiArIDEpKTsKLQkJaWYgKHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQltZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywgMCwKLQkJICAgICAgIHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7Ci0JCWZmaV9vZnMgPSAwOwotCX0KKyAgICBiYXNlZGljdCA9IFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKSgoUHlUeXBlT2JqZWN0ICopdHlwZSktPnRwX2Jhc2UpOworICAgIGlmIChiYXNlZGljdCAmJiAhdXNlX2Jyb2tlbl9vbGRfY3R5cGVzX3NlbWFudGljcykgeworICAgICAgICBzaXplID0gb2Zmc2V0ID0gYmFzZWRpY3QtPnNpemU7CisgICAgICAgIGFsaWduID0gYmFzZWRpY3QtPmFsaWduOworICAgICAgICB1bmlvbl9zaXplID0gMDsKKyAgICAgICAgdG90YWxfYWxpZ24gPSBhbGlnbiA/IGFsaWduIDogMTsKKyAgICAgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlID0gRkZJX1RZUEVfU1RSVUNUOworICAgICAgICBzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzID0gUHlNZW1fTWFsbG9jKHNpemVvZihmZmlfdHlwZSAqKSAqIChiYXNlZGljdC0+bGVuZ3RoICsgbGVuICsgMSkpOworICAgICAgICBpZiAoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1lbXNldChzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKGZmaV90eXBlICopICogKGJhc2VkaWN0LT5sZW5ndGggKyBsZW4gKyAxKSk7CisgICAgICAgIG1lbWNweShzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzLAorICAgICAgICAgICAgICAgYmFzZWRpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMsCisgICAgICAgICAgICAgICBzaXplb2YoZmZpX3R5cGUgKikgKiAoYmFzZWRpY3QtPmxlbmd0aCkpOworICAgICAgICBmZmlfb2ZzID0gYmFzZWRpY3QtPmxlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgYWxpZ24gPSAwOworICAgICAgICB1bmlvbl9zaXplID0gMDsKKyAgICAgICAgdG90YWxfYWxpZ24gPSAxOworICAgICAgICBzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLnR5cGUgPSBGRklfVFlQRV9TVFJVQ1Q7CisgICAgICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKGZmaV90eXBlICopICogKGxlbiArIDEpKTsKKyAgICAgICAgaWYgKHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQoc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5lbGVtZW50cywgMCwKKyAgICAgICAgICAgICAgIHNpemVvZihmZmlfdHlwZSAqKSAqIChsZW4gKyAxKSk7CisgICAgICAgIGZmaV9vZnMgPSAwOworICAgIH0KIAotCWFzc2VydChzdGdkaWN0LT5mb3JtYXQgPT0gTlVMTCk7Ci0JaWYgKGlzU3RydWN0ICYmICFpc1BhY2tlZCkgewotCQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKE5VTEwsICJUeyIpOwotCX0gZWxzZSB7Ci0JCS8qIFBFUDMxMTggZG9lc24ndCBzdXBwb3J0IHVuaW9uLCBvciBwYWNrZWQgc3RydWN0dXJlcyAod2VsbCwKLQkJICAgb25seSBzdGFuZGFyZCBwYWNraW5nLCBidXQgd2UgZG9udCBzdXBwb3J0IHRoZSBwZXAgZm9yCi0JCSAgIHRoYXQpLiBVc2UgJ0InIGZvciBieXRlcy4gKi8KLQkJc3RnZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiQiIpOwotCX0KKyAgICBhc3NlcnQoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpOworICAgIGlmIChpc1N0cnVjdCAmJiAhaXNQYWNrZWQpIHsKKyAgICAgICAgc3RnZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhOVUxMLCAiVHsiKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBQRVAzMTE4IGRvZXNuJ3Qgc3VwcG9ydCB1bmlvbiwgb3IgcGFja2VkIHN0cnVjdHVyZXMgKHdlbGwsCisgICAgICAgICAgIG9ubHkgc3RhbmRhcmQgcGFja2luZywgYnV0IHdlIGRvbnQgc3VwcG9ydCB0aGUgcGVwIGZvcgorICAgICAgICAgICB0aGF0KS4gVXNlICdCJyBmb3IgYnl0ZXMuICovCisgICAgICAgIHN0Z2RpY3QtPmZvcm1hdCA9IGFsbG9jX2Zvcm1hdF9zdHJpbmcoTlVMTCwgIkIiKTsKKyAgICB9CiAKICNkZWZpbmUgcmVhbGRpY3QgKChQeU9iamVjdCAqKSZzdGdkaWN0LT5kaWN0KQotCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgewotCQlQeU9iamVjdCAqbmFtZSA9IE5VTEwsICpkZXNjID0gTlVMTDsKLQkJUHlPYmplY3QgKnBhaXIgPSBQeVNlcXVlbmNlX0dldEl0ZW0oZmllbGRzLCBpKTsKLQkJUHlPYmplY3QgKnByb3A7Ci0JCVN0Z0RpY3RPYmplY3QgKmRpY3Q7Ci0JCWludCBiaXRzaXplID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBOVUxMLCAqZGVzYyA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICpwYWlyID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGZpZWxkcywgaSk7CisgICAgICAgIFB5T2JqZWN0ICpwcm9wOworICAgICAgICBTdGdEaWN0T2JqZWN0ICpkaWN0OworICAgICAgICBpbnQgYml0c2l6ZSA9IDA7CiAKLQkJaWYgKCFwYWlyIHx8ICFQeUFyZ19QYXJzZVR1cGxlKHBhaXIsICJPT3xpIiwgJm5hbWUsICZkZXNjLCAmYml0c2l6ZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkJIidfZmllbGRzXycgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIHBhaXJzIik7Ci0JCQlQeV9YREVDUkVGKHBhaXIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWRpY3QgPSBQeVR5cGVfc3RnZGljdChkZXNjKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHBhaXIpOwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgaWYgKCFwYWlyIHx8ICFQeUFyZ19QYXJzZVR1cGxlKHBhaXIsICJPT3xpIiwgJm5hbWUsICZkZXNjLCAmYml0c2l6ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ19maWVsZHNfJyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgcGFpcnMiKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYocGFpcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZGljdCA9IFB5VHlwZV9zdGdkaWN0KGRlc2MpOworICAgICAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0JCQkJICAgICAic2Vjb25kIGl0ZW0gaW4gX2ZpZWxkc18gdHVwbGUgKGluZGV4ICVkKSBtdXN0IGJlIGEgQyB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2Vjb25kIGl0ZW0gaW4gX2ZpZWxkc18gdHVwbGUgKGluZGV4ICVkKSBtdXN0IGJlIGEgQyB0eXBlIiwKICNlbHNlCi0JCQkJICAgICAic2Vjb25kIGl0ZW0gaW4gX2ZpZWxkc18gdHVwbGUgKGluZGV4ICV6ZCkgbXVzdCBiZSBhIEMgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlY29uZCBpdGVtIGluIF9maWVsZHNfIHR1cGxlIChpbmRleCAlemQpIG11c3QgYmUgYSBDIHR5cGUiLAogI2VuZGlmCi0JCQkJICAgICBpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlzdGdkaWN0LT5mZmlfdHlwZV9wb2ludGVyLmVsZW1lbnRzW2ZmaV9vZnMgKyBpXSA9ICZkaWN0LT5mZmlfdHlwZV9wb2ludGVyOwotCQlpZiAoZGljdC0+ZmxhZ3MgJiAoVFlQRUZMQUdfSVNQT0lOVEVSIHwgVFlQRUZMQUdfSEFTUE9JTlRFUikpCi0JCQlzdGdkaWN0LT5mbGFncyB8PSBUWVBFRkxBR19IQVNQT0lOVEVSOwotCQlkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsgLyogbWFyayBmaWVsZCB0eXBlIGZpbmFsICovCi0JCWlmIChQeVR1cGxlX1NpemUocGFpcikgPT0gMykgeyAvKiBiaXRzIHNwZWNpZmllZCAqLwotCQkJc3dpdGNoKGRpY3QtPmZmaV90eXBlX3BvaW50ZXIudHlwZSkgewotCQkJY2FzZSBGRklfVFlQRV9VSU5UODoKLQkJCWNhc2UgRkZJX1RZUEVfVUlOVDE2OgotCQkJY2FzZSBGRklfVFlQRV9VSU5UMzI6Ci0JCQljYXNlIEZGSV9UWVBFX1NJTlQ2NDoKLQkJCWNhc2UgRkZJX1RZUEVfVUlOVDY0OgotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuZWxlbWVudHNbZmZpX29mcyArIGldID0gJmRpY3QtPmZmaV90eXBlX3BvaW50ZXI7CisgICAgICAgIGlmIChkaWN0LT5mbGFncyAmIChUWVBFRkxBR19JU1BPSU5URVIgfCBUWVBFRkxBR19IQVNQT0lOVEVSKSkKKyAgICAgICAgICAgIHN0Z2RpY3QtPmZsYWdzIHw9IFRZUEVGTEFHX0hBU1BPSU5URVI7CisgICAgICAgIGRpY3QtPmZsYWdzIHw9IERJQ1RGTEFHX0ZJTkFMOyAvKiBtYXJrIGZpZWxkIHR5cGUgZmluYWwgKi8KKyAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZShwYWlyKSA9PSAzKSB7IC8qIGJpdHMgc3BlY2lmaWVkICovCisgICAgICAgICAgICBzd2l0Y2goZGljdC0+ZmZpX3R5cGVfcG9pbnRlci50eXBlKSB7CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQ4OgorICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UMTY6CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1VJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgorICAgICAgICAgICAgY2FzZSBGRklfVFlQRV9VSU5UNjQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCWNhc2UgRkZJX1RZUEVfU0lOVDg6Ci0JCQljYXNlIEZGSV9UWVBFX1NJTlQxNjoKLQkJCWNhc2UgRkZJX1RZUEVfU0lOVDMyOgotCQkJCWlmIChkaWN0LT5nZXRmdW5jICE9IGdldGVudHJ5KCJjIiktPmdldGZ1bmMKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDg6CisgICAgICAgICAgICBjYXNlIEZGSV9UWVBFX1NJTlQxNjoKKyAgICAgICAgICAgIGNhc2UgRkZJX1RZUEVfU0lOVDMyOgorICAgICAgICAgICAgICAgIGlmIChkaWN0LT5nZXRmdW5jICE9IGdldGVudHJ5KCJjIiktPmdldGZ1bmMKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQotCQkJCSAgICAmJiBkaWN0LT5nZXRmdW5jICE9IGdldGVudHJ5KCJ1IiktPmdldGZ1bmMKKyAgICAgICAgICAgICAgICAgICAgJiYgZGljdC0+Z2V0ZnVuYyAhPSBnZXRlbnRyeSgidSIpLT5nZXRmdW5jCiAjZW5kaWYKLQkJCQkJKQotCQkJCQlicmVhazsKLQkJCQkvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotCQkJZGVmYXVsdDoKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgICAgICJiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlICVzIiwKLQkJCQkJICAgICAoKFB5VHlwZU9iamVjdCAqKWRlc2MpLT50cF9uYW1lKTsKLQkJCQlQeV9ERUNSRUYocGFpcik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKGJpdHNpemUgPD0gMCB8fCBiaXRzaXplID4gZGljdC0+c2l6ZSAqIDgpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJudW1iZXIgb2YgYml0cyBpbnZhbGlkIGZvciBiaXQgZmllbGQiKTsKLQkJCQlQeV9ERUNSRUYocGFpcik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UKLQkJCWJpdHNpemUgPSAwOwotCQlpZiAoaXNTdHJ1Y3QgJiYgIWlzUGFja2VkKSB7Ci0JCQljaGFyICpmaWVsZGZtdCA9IGRpY3QtPmZvcm1hdCA/IGRpY3QtPmZvcm1hdCA6ICJCIjsKLQkJCWNoYXIgKmZpZWxkbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOwotCQkJY2hhciAqcHRyOwotCQkJUHlfc3NpemVfdCBsZW4gPSBzdHJsZW4oZmllbGRuYW1lKSArIHN0cmxlbihmaWVsZGZtdCk7Ci0JCQljaGFyICpidWYgPSBhbGxvY2EobGVuICsgMiArIDEpOworICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8qIGVsc2UgZmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKilkZXNjKS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHBhaXIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaXRzaXplIDw9IDAgfHwgYml0c2l6ZSA+IGRpY3QtPnNpemUgKiA4KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgb2YgYml0cyBpbnZhbGlkIGZvciBiaXQgZmllbGQiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJpdHNpemUgPSAwOworICAgICAgICBpZiAoaXNTdHJ1Y3QgJiYgIWlzUGFja2VkKSB7CisgICAgICAgICAgICBjaGFyICpmaWVsZGZtdCA9IGRpY3QtPmZvcm1hdCA/IGRpY3QtPmZvcm1hdCA6ICJCIjsKKyAgICAgICAgICAgIGNoYXIgKmZpZWxkbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOworICAgICAgICAgICAgY2hhciAqcHRyOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBzdHJsZW4oZmllbGRuYW1lKSArIHN0cmxlbihmaWVsZGZtdCk7CisgICAgICAgICAgICBjaGFyICpidWYgPSBhbGxvY2EobGVuICsgMiArIDEpOwogCi0JCQlzcHJpbnRmKGJ1ZiwgIiVzOiVzOiIsIGZpZWxkZm10LCBmaWVsZG5hbWUpOworICAgICAgICAgICAgc3ByaW50ZihidWYsICIlczolczoiLCBmaWVsZGZtdCwgZmllbGRuYW1lKTsKIAotCQkJcHRyID0gc3RnZGljdC0+Zm9ybWF0OwotCQkJc3RnZGljdC0+Zm9ybWF0ID0gYWxsb2NfZm9ybWF0X3N0cmluZyhzdGdkaWN0LT5mb3JtYXQsIGJ1Zik7Ci0JCQlQeU1lbV9GcmVlKHB0cik7CisgICAgICAgICAgICBwdHIgPSBzdGdkaWN0LT5mb3JtYXQ7CisgICAgICAgICAgICBzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKHN0Z2RpY3QtPmZvcm1hdCwgYnVmKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUocHRyKTsKIAotCQkJaWYgKHN0Z2RpY3QtPmZvcm1hdCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHBhaXIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoaXNTdHJ1Y3QpIHsKLQkJCXByb3AgPSBDRmllbGRfRnJvbURlc2MoZGVzYywgaSwKLQkJCQkJICAgICAgICZmaWVsZF9zaXplLCBiaXRzaXplLCAmYml0b2ZzLAotCQkJCQkgICAgICAgJnNpemUsICZvZmZzZXQsICZhbGlnbiwKLQkJCQkJICAgICAgIHBhY2ssIGJpZ19lbmRpYW4pOwotCQl9IGVsc2UgLyogdW5pb24gKi8gewotCQkJc2l6ZSA9IDA7Ci0JCQlvZmZzZXQgPSAwOwotCQkJYWxpZ24gPSAwOwotCQkJcHJvcCA9IENGaWVsZF9Gcm9tRGVzYyhkZXNjLCBpLAotCQkJCQkgICAgICAgJmZpZWxkX3NpemUsIGJpdHNpemUsICZiaXRvZnMsCi0JCQkJCSAgICAgICAmc2l6ZSwgJm9mZnNldCwgJmFsaWduLAotCQkJCQkgICAgICAgcGFjaywgYmlnX2VuZGlhbik7Ci0JCQl1bmlvbl9zaXplID0gbWF4KHNpemUsIHVuaW9uX3NpemUpOwotCQl9Ci0JCXRvdGFsX2FsaWduID0gbWF4KGFsaWduLCB0b3RhbF9hbGlnbik7CisgICAgICAgICAgICBpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc1N0cnVjdCkgeworICAgICAgICAgICAgcHJvcCA9IENGaWVsZF9Gcm9tRGVzYyhkZXNjLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfc2l6ZSwgYml0c2l6ZSwgJmJpdG9mcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsICZvZmZzZXQsICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjaywgYmlnX2VuZGlhbik7CisgICAgICAgIH0gZWxzZSAvKiB1bmlvbiAqLyB7CisgICAgICAgICAgICBzaXplID0gMDsKKyAgICAgICAgICAgIG9mZnNldCA9IDA7CisgICAgICAgICAgICBhbGlnbiA9IDA7CisgICAgICAgICAgICBwcm9wID0gQ0ZpZWxkX0Zyb21EZXNjKGRlc2MsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9zaXplLCBiaXRzaXplLCAmYml0b2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgJm9mZnNldCwgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrLCBiaWdfZW5kaWFuKTsKKyAgICAgICAgICAgIHVuaW9uX3NpemUgPSBtYXgoc2l6ZSwgdW5pb25fc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxfYWxpZ24gPSBtYXgoYWxpZ24sIHRvdGFsX2FsaWduKTsKIAotCQlpZiAoIXByb3ApIHsKLQkJCVB5X0RFQ1JFRihwYWlyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoLTEgPT0gUHlPYmplY3RfU2V0QXR0cih0eXBlLCBuYW1lLCBwcm9wKSkgewotCQkJUHlfREVDUkVGKHByb3ApOwotCQkJUHlfREVDUkVGKHBhaXIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRihwYWlyKTsKLQkJUHlfREVDUkVGKHByb3ApOwotCX0KKyAgICAgICAgaWYgKCFwcm9wKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKC0xID09IFB5T2JqZWN0X1NldEF0dHIodHlwZSwgbmFtZSwgcHJvcCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwcm9wKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwYWlyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYocGFpcik7CisgICAgICAgIFB5X0RFQ1JFRihwcm9wKTsKKyAgICB9CiAjdW5kZWYgcmVhbGRpY3QKIAotCWlmIChpc1N0cnVjdCAmJiAhaXNQYWNrZWQpIHsKLQkJY2hhciAqcHRyID0gc3RnZGljdC0+Zm9ybWF0OwotCQlzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKHN0Z2RpY3QtPmZvcm1hdCwgIn0iKTsKLQkJUHlNZW1fRnJlZShwdHIpOwotCQlpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChpc1N0cnVjdCAmJiAhaXNQYWNrZWQpIHsKKyAgICAgICAgY2hhciAqcHRyID0gc3RnZGljdC0+Zm9ybWF0OworICAgICAgICBzdGdkaWN0LT5mb3JtYXQgPSBhbGxvY19mb3JtYXRfc3RyaW5nKHN0Z2RpY3QtPmZvcm1hdCwgIn0iKTsKKyAgICAgICAgUHlNZW1fRnJlZShwdHIpOworICAgICAgICBpZiAoc3RnZGljdC0+Zm9ybWF0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCFpc1N0cnVjdCkKLQkJc2l6ZSA9IHVuaW9uX3NpemU7CisgICAgaWYgKCFpc1N0cnVjdCkKKyAgICAgICAgc2l6ZSA9IHVuaW9uX3NpemU7CiAKLQkvKiBBZGp1c3QgdGhlIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCi0Jc2l6ZSA9ICgoc2l6ZSArIHRvdGFsX2FsaWduIC0gMSkgLyB0b3RhbF9hbGlnbikgKiB0b3RhbF9hbGlnbjsKKyAgICAvKiBBZGp1c3QgdGhlIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzICovCisgICAgc2l6ZSA9ICgoc2l6ZSArIHRvdGFsX2FsaWduIC0gMSkgLyB0b3RhbF9hbGlnbikgKiB0b3RhbF9hbGlnbjsKIAotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuYWxpZ25tZW50ID0gUHlfU0FGRV9ET1dOQ0FTVCh0b3RhbF9hbGlnbiwKLQkJCQkJCQkgICAgICAgUHlfc3NpemVfdCwKLQkJCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQpOwotCXN0Z2RpY3QtPmZmaV90eXBlX3BvaW50ZXIuc2l6ZSA9IHNpemU7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5hbGlnbm1lbnQgPSBQeV9TQUZFX0RPV05DQVNUKHRvdGFsX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCk7CisgICAgc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlci5zaXplID0gc2l6ZTsKIAotCXN0Z2RpY3QtPnNpemUgPSBzaXplOwotCXN0Z2RpY3QtPmFsaWduID0gdG90YWxfYWxpZ247Ci0Jc3RnZGljdC0+bGVuZ3RoID0gbGVuOwkvKiBBREQgZmZpX29mcz8gKi8KKyAgICBzdGdkaWN0LT5zaXplID0gc2l6ZTsKKyAgICBzdGdkaWN0LT5hbGlnbiA9IHRvdGFsX2FsaWduOworICAgIHN0Z2RpY3QtPmxlbmd0aCA9IGxlbjsgICAgICAvKiBBREQgZmZpX29mcz8gKi8KIAotCS8qIFdlIGRpZCBjaGVjayB0aGF0IHRoaXMgZmxhZyB3YXMgTk9UIHNldCBhYm92ZSwgaXQgbXVzdCBub3QKLQkgICBoYXZlIGJlZW4gc2V0IHVudGlsIG5vdy4gKi8KLQlpZiAoc3RnZGljdC0+ZmxhZ3MgJiBESUNURkxBR19GSU5BTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzdGdkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKKyAgICAvKiBXZSBkaWQgY2hlY2sgdGhhdCB0aGlzIGZsYWcgd2FzIE5PVCBzZXQgYWJvdmUsIGl0IG11c3Qgbm90CisgICAgICAgaGF2ZSBiZWVuIHNldCB1bnRpbCBub3cuICovCisgICAgaWYgKHN0Z2RpY3QtPmZsYWdzICYgRElDVEZMQUdfRklOQUwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzdGdkaWN0LT5mbGFncyB8PSBESUNURkxBR19GSU5BTDsKIAotCXJldHVybiBNYWtlQW5vbkZpZWxkcyh0eXBlKTsKKyAgICByZXR1cm4gTWFrZUFub25GaWVsZHModHlwZSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYyBiL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCmluZGV4IDc0ZTZiZmEuLjA0YTBhMjggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCisrKyBiL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jCkBAIC0yMiw3ICsyMiw3IEBACiAvKiBVdGlsaXR5IEZ1bmN0aW9ucyAqLwogCiAvKgotICogQ2hlY2sgdGhlIHJldHVybiBjb2RlIGZyb20gYSBjdXJzZXMgZnVuY3Rpb24gYW5kIHJldHVybiBOb25lIAorICogQ2hlY2sgdGhlIHJldHVybiBjb2RlIGZyb20gYSBjdXJzZXMgZnVuY3Rpb24gYW5kIHJldHVybiBOb25lCiAgKiBvciByYWlzZSBhbiBleGNlcHRpb24gYXMgYXBwcm9wcmlhdGUuCiAgKi8KIApAQCAtMzAsMTUgKzMwLDE1IEBACiBQeUN1cnNlc0NoZWNrRVJSKGludCBjb2RlLCBjaGFyICpmbmFtZSkKIHsKICAgICBpZiAoY29kZSAhPSBFUlIpIHsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfSBlbHNlIHsKLQlpZiAoZm5hbWUgPT0gTlVMTCkgewotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgY2F0Y2hhbGxfRVJSKTsKLQl9IGVsc2UgewotCSAgICBQeUVycl9Gb3JtYXQoUHlDdXJzZXNFcnJvciwgIiVzKCkgcmV0dXJuZWQgRVJSIiwgZm5hbWUpOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGZuYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUN1cnNlc0Vycm9yLCBjYXRjaGFsbF9FUlIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5Q3Vyc2VzRXJyb3IsICIlcygpIHJldHVybmVkIEVSUiIsIGZuYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CiAKQEAgLTUxLDEyICs1MSwxMiBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKICAgICBQQU5FTCAqcGFuOwotICAgIFB5Q3Vyc2VzV2luZG93T2JqZWN0ICp3bzsJLyogZm9yIHJlZmVyZW5jZSBjb3VudHMgKi8KKyAgICBQeUN1cnNlc1dpbmRvd09iamVjdCAqd287ICAgLyogZm9yIHJlZmVyZW5jZSBjb3VudHMgKi8KIH0gUHlDdXJzZXNQYW5lbE9iamVjdDsKIAogUHlUeXBlT2JqZWN0IFB5Q3Vyc2VzUGFuZWxfVHlwZTsKIAotI2RlZmluZSBQeUN1cnNlc1BhbmVsX0NoZWNrKHYpCSAoUHlfVFlQRSh2KSA9PSAmUHlDdXJzZXNQYW5lbF9UeXBlKQorI2RlZmluZSBQeUN1cnNlc1BhbmVsX0NoZWNrKHYpICAgKFB5X1RZUEUodikgPT0gJlB5Q3Vyc2VzUGFuZWxfVHlwZSkKIAogLyogU29tZSBoZWxwZXIgZnVuY3Rpb25zLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZXJlJ3MgYWx3YXlzIGEgd2luZG93CiAgICBhc3NvY2lhdGVkIHdpdGggYSBwYW5lbC4gVG8gZW5zdXJlIHRoYXQgUHl0aG9uJ3MgR0MgZG9lc24ndCBwdWxsCkBAIC04OCwxMCArODgsMTAgQEAKIGluc2VydF9sb3AoUHlDdXJzZXNQYW5lbE9iamVjdCAqcG8pCiB7CiAgICAgbGlzdF9vZl9wYW5lbHMgKm5ldzsKLSAgICAKKwogICAgIGlmICgobmV3ID0gKGxpc3Rfb2ZfcGFuZWxzICopbWFsbG9jKHNpemVvZihsaXN0X29mX3BhbmVscykpKSA9PSBOVUxMKSB7Ci0JUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgbmV3LT5wbyA9IHBvOwogICAgIG5ldy0+bmV4dCA9IGxvcDsKQEAgLTEwNywxNyArMTA3LDE3IEBACiAKICAgICB0ZW1wID0gbG9wOwogICAgIGlmICh0ZW1wLT5wbyA9PSBwbykgewotCWxvcCA9IHRlbXAtPm5leHQ7Ci0JZnJlZSh0ZW1wKTsKLQlyZXR1cm47CisgICAgICAgIGxvcCA9IHRlbXAtPm5leHQ7CisgICAgICAgIGZyZWUodGVtcCk7CisgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgd2hpbGUgKHRlbXAtPm5leHQgPT0gTlVMTCB8fCB0ZW1wLT5uZXh0LT5wbyAhPSBwbykgewotCWlmICh0ZW1wLT5uZXh0ID09IE5VTEwpIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICAicmVtb3ZlX2xvcDogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQkgICAgcmV0dXJuOwotCX0KLQl0ZW1wID0gdGVtcC0+bmV4dDsKKyAgICAgICAgaWYgKHRlbXAtPm5leHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlX2xvcDogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICB9CiAgICAgbiA9IHRlbXAtPm5leHQtPm5leHQ7CiAgICAgZnJlZSh0ZW1wLT5uZXh0KTsKQEAgLTEzMSw3ICsxMzEsNyBAQAogewogICAgIGxpc3Rfb2ZfcGFuZWxzICp0ZW1wOwogICAgIGZvciAodGVtcCA9IGxvcDsgdGVtcC0+cG8tPnBhbiAhPSBwYW47IHRlbXAgPSB0ZW1wLT5uZXh0KQotCWlmICh0ZW1wLT5uZXh0ID09IE5VTEwpIHJldHVybiBOVUxMOwkvKiBub3QgZm91bmQhPyAqLworICAgICAgICBpZiAodGVtcC0+bmV4dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsgICAgLyogbm90IGZvdW5kIT8gKi8KICAgICByZXR1cm4gdGVtcC0+cG87CiB9CiAKQEAgLTE3OSw5ICsxNzksOSBAQAogICAgIGlmIChwbyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKICAgICBwby0+cGFuID0gcGFuOwogICAgIGlmIChpbnNlcnRfbG9wKHBvKSA8IDApIHsKLQlwby0+d28gPSBOVUxMOwotCVB5X0RFQ1JFRihwbyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIHBvLT53byA9IE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihwbyk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBwby0+d28gPSB3bzsKICAgICBQeV9JTkNSRUYod28pOwpAQCAtMTkzLDggKzE5Myw4IEBACiB7CiAgICAgKHZvaWQpZGVsX3BhbmVsKHBvLT5wYW4pOwogICAgIGlmIChwby0+d28gIT0gTlVMTCkgewotCVB5X0RFQ1JFRihwby0+d28pOwotCXJlbW92ZV9sb3AocG8pOworICAgICAgICBQeV9ERUNSRUYocG8tPndvKTsKKyAgICAgICAgcmVtb3ZlX2xvcChwbyk7CiAgICAgfQogICAgIFB5T2JqZWN0X0RFTChwbyk7CiB9CkBAIC0yMDYsMTkgKzIwNiwxOSBAQAogewogICAgIFBBTkVMICpwYW47CiAgICAgUHlDdXJzZXNQYW5lbE9iamVjdCAqcG87Ci0gICAgCisKICAgICBwYW4gPSBwYW5lbF9hYm92ZShzZWxmLT5wYW4pOwogCi0gICAgaWYgKHBhbiA9PSBOVUxMKSB7CQkvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zIHRoZSBjYWxsaW5nIHBhbmVsCi0JCQkJICAgaXMgb24gdG9wIG9mIHRoZSBzdGFjayAqLwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAocGFuID09IE5VTEwpIHsgICAgICAgICAgLyogdmFsaWQgb3V0cHV0LCBpdCBtZWFucyB0aGUgY2FsbGluZyBwYW5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvbiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfQogICAgIHBvID0gZmluZF9wbyhwYW4pOwogICAgIGlmIChwbyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJwYW5lbF9hYm92ZTogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYW5lbF9hYm92ZTogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0lOQ1JFRihwbyk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBvOwpAQCAtMjMxLDE5ICsyMzEsMTkgQEAKIHsKICAgICBQQU5FTCAqcGFuOwogICAgIFB5Q3Vyc2VzUGFuZWxPYmplY3QgKnBvOwotICAgIAorCiAgICAgcGFuID0gcGFuZWxfYmVsb3coc2VsZi0+cGFuKTsKLSAgICAKLSAgICBpZiAocGFuID09IE5VTEwpIHsJCS8qIHZhbGlkIG91dHB1dCwgaXQgbWVhbnMgdGhlIGNhbGxpbmcgcGFuZWwKLQkJCQkgICBpcyBvbiB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAqLwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKworICAgIGlmIChwYW4gPT0gTlVMTCkgeyAgICAgICAgICAvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zIHRoZSBjYWxsaW5nIHBhbmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9uIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfQogICAgIHBvID0gZmluZF9wbyhwYW4pOwogICAgIGlmIChwbyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0lOQ1JFRihwbyk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBvOwpAQCAtMjYyLDI2ICsyNjIsMjYgQEAKICAgICBQeUN1cnNlc1BhbmVsT2JqZWN0ICpwbzsKICAgICBQeUN1cnNlc1dpbmRvd09iamVjdCAqdGVtcDsKICAgICBpbnQgcnRuOwotICAgIAorCiAgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSAhPSAxKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcGxhY2UgcmVxdWlyZXMgb25lIGFyZ3VtZW50Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZXBsYWNlIHJlcXVpcmVzIG9uZSBhcmd1bWVudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITt3aW5kb3cgb2JqZWN0IiwKLQkJCSAgJlB5Q3Vyc2VzV2luZG93X1R5cGUsICZ0ZW1wKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5Q3Vyc2VzV2luZG93X1R5cGUsICZ0ZW1wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBwbyA9IGZpbmRfcG8oc2VsZi0+cGFuKTsKICAgICBpZiAocG8gPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkicmVwbGFjZV9wYW5lbDogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlX3BhbmVsOiBjYW4ndCBmaW5kIFBhbmVsIE9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBydG4gPSByZXBsYWNlX3BhbmVsKHNlbGYtPnBhbiwgdGVtcC0+d2luKTsKICAgICBpZiAocnRuID09IEVSUikgewotCVB5RXJyX1NldFN0cmluZyhQeUN1cnNlc0Vycm9yLCAicmVwbGFjZV9wYW5lbCgpIHJldHVybmVkIEVSUiIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgInJlcGxhY2VfcGFuZWwoKSByZXR1cm5lZCBFUlIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0RFQ1JFRihwby0+d28pOwogICAgIHBvLT53byA9IHRlbXA7CkBAIC0zMDIsMTEgKzMwMiwxMSBAQAogUHlDdXJzZXNQYW5lbF91c2VycHRyKFB5Q3Vyc2VzUGFuZWxPYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKm9iajsKLSAgICBQeUN1cnNlc0luaXRpYWxpc2VkOyAKKyAgICBQeUN1cnNlc0luaXRpYWxpc2VkOwogICAgIG9iaiA9IChQeU9iamVjdCAqKSBwYW5lbF91c2VycHRyKHNlbGYtPnBhbik7CiAgICAgaWYgKG9iaiA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5Q3Vyc2VzRXJyb3IsICJubyB1c2VycHRyIHNldCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlDdXJzZXNFcnJvciwgIm5vIHVzZXJwdHIgc2V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIFB5X0lOQ1JFRihvYmopOwpAQCAtMzI5LDcgKzMyOSw3IEBACiAgICAgeyJ0b3AiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pUHlDdXJzZXNQYW5lbF90b3BfcGFuZWwsIE1FVEhfTk9BUkdTfSwKICAgICB7InVzZXJwdHIiLCAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc1BhbmVsX3VzZXJwdHIsIE1FVEhfTk9BUkdTfSwKICAgICB7IndpbmRvdyIsICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc1BhbmVsX3dpbmRvdywgTUVUSF9OT0FSR1N9LAotICAgIHtOVUxMLAkJTlVMTH0gICAvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTM0MiwyMCArMzQyLDIwIEBACiAKIFB5VHlwZU9iamVjdCBQeUN1cnNlc1BhbmVsX1R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9jdXJzZXNfcGFuZWwuY3Vyc2VzIHBhbmVsIiwJLyp0cF9uYW1lKi8KLSAgICBzaXplb2YoUHlDdXJzZXNQYW5lbE9iamVjdCksCS8qdHBfYmFzaWNzaXplKi8KLSAgICAwLAkJCS8qdHBfaXRlbXNpemUqLworICAgICJfY3Vyc2VzX3BhbmVsLmN1cnNlcyBwYW5lbCIsICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFB5Q3Vyc2VzUGFuZWxPYmplY3QpLCAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwogICAgIChkZXN0cnVjdG9yKVB5Q3Vyc2VzUGFuZWxfRGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLSAgICAwLAkJCS8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCiAgICAgKGdldGF0dHJmdW5jKVB5Q3Vyc2VzUGFuZWxfR2V0QXR0ciwgLyp0cF9nZXRhdHRyKi8KICAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLSAgICAwLAkJCS8qdHBfY29tcGFyZSovCi0gICAgMCwJCQkvKnRwX3JlcHIqLwotICAgIDAsCQkJLyp0cF9hc19udW1iZXIqLwotICAgIDAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0gICAgMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotICAgIDAsCQkJLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KIH07CiAKIC8qIFdyYXBwZXIgZm9yIHBhbmVsX2Fib3ZlKE5VTEwpLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJvdHRvbQpAQCAtMzcyLDE2ICszNzIsMTYgQEAKIAogICAgIHBhbiA9IHBhbmVsX2Fib3ZlKE5VTEwpOwogCi0gICAgaWYgKHBhbiA9PSBOVUxMKSB7CQkvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zCi0JCQkJICAgdGhlcmUncyBubyBwYW5lbCBhdCBhbGwgKi8gIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAocGFuID09IE5VTEwpIHsgICAgICAgICAgLyogdmFsaWQgb3V0cHV0LCBpdCBtZWFucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSdzIG5vIHBhbmVsIGF0IGFsbCAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOwogICAgIH0KICAgICBwbyA9IGZpbmRfcG8ocGFuKTsKICAgICBpZiAocG8gPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkicGFuZWxfYWJvdmU6IGNhbid0IGZpbmQgUGFuZWwgT2JqZWN0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicGFuZWxfYWJvdmU6IGNhbid0IGZpbmQgUGFuZWwgT2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBQeV9JTkNSRUYocG8pOwogICAgIHJldHVybiAoUHlPYmplY3QgKilwbzsKQEAgLTM5Nyw4ICszOTcsOCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBwYW4gPSBuZXdfcGFuZWwod2luLT53aW4pOwogICAgIGlmIChwYW4gPT0gTlVMTCkgewotCVB5RXJyX1NldFN0cmluZyhQeUN1cnNlc0Vycm9yLCBjYXRjaGFsbF9OVUxMKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5Q3Vyc2VzRXJyb3IsIGNhdGNoYWxsX05VTEwpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKVB5Q3Vyc2VzUGFuZWxfTmV3KHBhbiwgd2luKTsKIH0KQEAgLTQxMywyOCArNDEzLDI4IEBACiB7CiAgICAgUEFORUwgKnBhbjsKICAgICBQeUN1cnNlc1BhbmVsT2JqZWN0ICpwbzsKLSAgICAKKwogICAgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQ7CiAKICAgICBwYW4gPSBwYW5lbF9iZWxvdyhOVUxMKTsKIAotICAgIGlmIChwYW4gPT0gTlVMTCkgewkJLyogdmFsaWQgb3V0cHV0LCBpdCBtZWFucwotCQkJCSAgIHRoZXJlJ3Mgbm8gcGFuZWwgYXQgYWxsICovCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChwYW4gPT0gTlVMTCkgeyAgICAgICAgICAvKiB2YWxpZCBvdXRwdXQsIGl0IG1lYW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlJ3Mgbm8gcGFuZWwgYXQgYWxsICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAgICAgfQogICAgIHBvID0gZmluZF9wbyhwYW4pOwogICAgIGlmIChwbyA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYW5lbF9iZWxvdzogY2FuJ3QgZmluZCBQYW5lbCBPYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X0lOQ1JFRihwbyk7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlB5Q3Vyc2VzX3VwZGF0ZV9wYW5lbHMoUHlPYmplY3QgKnNlbGYpCi17IAorewogICAgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQ7CiAgICAgdXBkYXRlX3BhbmVscygpOwogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKQEAgLTQ0OSw3ICs0NDksNyBAQAogICAgIHsibmV3X3BhbmVsIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19uZXdfcGFuZWwsICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHsidG9wX3BhbmVsIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc190b3BfcGFuZWwsICAgICBNRVRIX05PQVJHU30sCiAgICAgeyJ1cGRhdGVfcGFuZWxzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKVB5Q3Vyc2VzX3VwZGF0ZV9wYW5lbHMsIE1FVEhfTk9BUkdTfSwKLSAgICB7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZSAqLwpAQCAtNDY3LDcgKzQ2Nyw3IEBACiAgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCiAgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9jdXJzZXNfcGFuZWwiLCBQeUN1cnNlc19tZXRob2RzKTsKICAgICBpZiAobSA9PSBOVUxMKQotICAgIAlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKIAogICAgIC8qIEZvciBleGNlcHRpb24gX2N1cnNlc19wYW5lbC5lcnJvciAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZnVuY3Rvb2xzbW9kdWxlLmMgYi9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYwppbmRleCA1ZGZiYzE1Li4zZTBlMDc3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYworKysgYi9Nb2R1bGVzL19mdW5jdG9vbHNtb2R1bGUuYwpAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAotLyogX2Z1bmN0b29scyBtb2R1bGUgd3JpdHRlbiBhbmQgbWFpbnRhaW5lZCAKKy8qIF9mdW5jdG9vbHMgbW9kdWxlIHdyaXR0ZW4gYW5kIG1haW50YWluZWQKICAgIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KICAgIHdpdGggYWRhcHRhdGlvbnMgYnkgUmF5bW9uZCBIZXR0aW5nZXIgPHB5dGhvbkByY24uY29tPgogICAgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1LCAyMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpAQCAtMTQsNjQgKzE0LDY0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZnVuY3Rvb2xzX3JlZHVjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNlcSwgKmZ1bmMsICpyZXN1bHQgPSBOVUxMLCAqaXQ7CisgICAgUHlPYmplY3QgKnNlcSwgKmZ1bmMsICpyZXN1bHQgPSBOVUxMLCAqaXQ7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWR1Y2UiLCAyLCAzLCAmZnVuYywgJnNlcSwgJnJlc3VsdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChyZXN1bHQgIT0gTlVMTCkKLQkJUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVkdWNlIiwgMiwgMywgJmZ1bmMsICZzZXEsICZyZXN1bHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpCisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOwogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICJyZWR1Y2UoKSBhcmcgMiBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIik7Ci0JCVB5X1hERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAicmVkdWNlKCkgYXJnIDIgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIpOworICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICgoYXJncyA9IFB5VHVwbGVfTmV3KDIpKSA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgaWYgKChhcmdzID0gUHlUdXBsZV9OZXcoMikpID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCWZvciAoOzspIHsKLQkJUHlPYmplY3QgKm9wMjsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5T2JqZWN0ICpvcDI7CiAKLQkJaWYgKGFyZ3MtPm9iX3JlZmNudCA+IDEpIHsKLQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJCWlmICgoYXJncyA9IFB5VHVwbGVfTmV3KDIpKSA9PSBOVUxMKQotCQkJCWdvdG8gRmFpbDsKLQkJfQorICAgICAgICBpZiAoYXJncy0+b2JfcmVmY250ID4gMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgaWYgKChhcmdzID0gUHlUdXBsZV9OZXcoMikpID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CiAKLQkJb3AyID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAob3AyID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gRmFpbDsKLSAJCQlicmVhazsKLQkJfQorICAgICAgICBvcDIgPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmIChvcDIgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQlyZXN1bHQgPSBvcDI7Ci0JCWVsc2UgewotCQkJUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDAsIHJlc3VsdCk7Ci0JCQlQeVR1cGxlX1NldEl0ZW0oYXJncywgMSwgb3AyKTsKLQkJCWlmICgocmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncykpID09IE5VTEwpCi0JCQkJZ290byBGYWlsOwotCQl9Ci0JfQorICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXN1bHQgPSBvcDI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDAsIHJlc3VsdCk7CisgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgMSwgb3AyKTsKKyAgICAgICAgICAgIGlmICgocmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncykpID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgfQogCi0JUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKIAotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICJyZWR1Y2UoKSBvZiBlbXB0eSBzZXF1ZW5jZSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgInJlZHVjZSgpIG9mIGVtcHR5IHNlcXVlbmNlIHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpOwogCi0JUHlfREVDUkVGKGl0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogRmFpbDoKLQlQeV9YREVDUkVGKGFyZ3MpOwotCVB5X1hERUNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYoaXQpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYoYXJncyk7CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihyZWR1Y2VfZG9jLApAQCAtOTAsMTIgKzkwLDEyIEBACiAvKiBwYXJ0aWFsIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmbjsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqa3c7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZm47CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmt3OworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KIH0gcGFydGlhbG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwYXJ0aWFsX3R5cGU7CkBAIC0xMDMsMjE5ICsxMDMsMjE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcGFydGlhbF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpmdW5jOwotCXBhcnRpYWxvYmplY3QgKnB0bzsKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBwYXJ0aWFsb2JqZWN0ICpwdG87CiAKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkidHlwZSAncGFydGlhbCcgdGFrZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICdwYXJ0aWFsJyB0YWtlcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZnVuYyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmdW5jID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgcGFydGlhbG9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlwdG8gPSAocGFydGlhbG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChwdG8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogY3JlYXRlIHBhcnRpYWxvYmplY3Qgc3RydWN0dXJlICovCisgICAgcHRvID0gKHBhcnRpYWxvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAocHRvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcHRvLT5mbiA9IGZ1bmM7Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCXB0by0+YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgUFlfU1NJWkVfVF9NQVgpOwotCWlmIChwdG8tPmFyZ3MgPT0gTlVMTCkgewotCQlwdG8tPmt3ID0gTlVMTDsKLQkJUHlfREVDUkVGKHB0byk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoa3cgIT0gTlVMTCkgewotCQlwdG8tPmt3ID0gUHlEaWN0X0NvcHkoa3cpOwotCQlpZiAocHRvLT5rdyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocHRvKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHRvLT5rdyA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQl9CisgICAgcHRvLT5mbiA9IGZ1bmM7CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIHB0by0+YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgUFlfU1NJWkVfVF9NQVgpOworICAgIGlmIChwdG8tPmFyZ3MgPT0gTlVMTCkgeworICAgICAgICBwdG8tPmt3ID0gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHB0byk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoa3cgIT0gTlVMTCkgeworICAgICAgICBwdG8tPmt3ID0gUHlEaWN0X0NvcHkoa3cpOworICAgICAgICBpZiAocHRvLT5rdyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocHRvKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRvLT5rdyA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICB9CiAKLQlwdG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKLQlwdG8tPmRpY3QgPSBOVUxMOworICAgIHB0by0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIHB0by0+ZGljdCA9IE5VTEw7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopcHRvOworICAgIHJldHVybiAoUHlPYmplY3QgKilwdG87CiB9CiAKIHN0YXRpYyB2b2lkCiBwYXJ0aWFsX2RlYWxsb2MocGFydGlhbG9iamVjdCAqcHRvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2socHRvKTsKLQlpZiAocHRvLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBwdG8pOwotCVB5X1hERUNSRUYocHRvLT5mbik7Ci0JUHlfWERFQ1JFRihwdG8tPmFyZ3MpOwotCVB5X1hERUNSRUYocHRvLT5rdyk7Ci0JUHlfWERFQ1JFRihwdG8tPmRpY3QpOwotCVB5X1RZUEUocHRvKS0+dHBfZnJlZShwdG8pOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2socHRvKTsKKyAgICBpZiAocHRvLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBwdG8pOworICAgIFB5X1hERUNSRUYocHRvLT5mbik7CisgICAgUHlfWERFQ1JFRihwdG8tPmFyZ3MpOworICAgIFB5X1hERUNSRUYocHRvLT5rdyk7CisgICAgUHlfWERFQ1JFRihwdG8tPmRpY3QpOworICAgIFB5X1RZUEUocHRvKS0+dHBfZnJlZShwdG8pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcGFydGlhbF9jYWxsKHBhcnRpYWxvYmplY3QgKnB0bywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmV0OwotCVB5T2JqZWN0ICphcmdhcHBsID0gTlVMTCwgKmt3YXBwbCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJldDsKKyAgICBQeU9iamVjdCAqYXJnYXBwbCA9IE5VTEwsICprd2FwcGwgPSBOVUxMOwogCi0JYXNzZXJ0IChQeUNhbGxhYmxlX0NoZWNrKHB0by0+Zm4pKTsKLQlhc3NlcnQgKFB5VHVwbGVfQ2hlY2socHRvLT5hcmdzKSk7Ci0JYXNzZXJ0IChwdG8tPmt3ID09IFB5X05vbmUgIHx8ICBQeURpY3RfQ2hlY2socHRvLT5rdykpOworICAgIGFzc2VydCAoUHlDYWxsYWJsZV9DaGVjayhwdG8tPmZuKSk7CisgICAgYXNzZXJ0IChQeVR1cGxlX0NoZWNrKHB0by0+YXJncykpOworICAgIGFzc2VydCAocHRvLT5rdyA9PSBQeV9Ob25lICB8fCAgUHlEaWN0X0NoZWNrKHB0by0+a3cpKTsKIAotCWlmIChQeVR1cGxlX0dFVF9TSVpFKHB0by0+YXJncykgPT0gMCkgewotCQlhcmdhcHBsID0gYXJnczsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCX0gZWxzZSBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKSB7Ci0JCWFyZ2FwcGwgPSBwdG8tPmFyZ3M7Ci0JCVB5X0lOQ1JFRihwdG8tPmFyZ3MpOwotCX0gZWxzZSB7Ci0JCWFyZ2FwcGwgPSBQeVNlcXVlbmNlX0NvbmNhdChwdG8tPmFyZ3MsIGFyZ3MpOwotCQlpZiAoYXJnYXBwbCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKHB0by0+YXJncykgPT0gMCkgeworICAgICAgICBhcmdhcHBsID0gYXJnczsKKyAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgIH0gZWxzZSBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKSB7CisgICAgICAgIGFyZ2FwcGwgPSBwdG8tPmFyZ3M7CisgICAgICAgIFB5X0lOQ1JFRihwdG8tPmFyZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFyZ2FwcGwgPSBQeVNlcXVlbmNlX0NvbmNhdChwdG8tPmFyZ3MsIGFyZ3MpOworICAgICAgICBpZiAoYXJnYXBwbCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHB0by0+a3cgPT0gUHlfTm9uZSkgewotCQlrd2FwcGwgPSBrdzsKLQkJUHlfWElOQ1JFRihrdyk7Ci0JfSBlbHNlIHsKLQkJa3dhcHBsID0gUHlEaWN0X0NvcHkocHRvLT5rdyk7Ci0JCWlmIChrd2FwcGwgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGFyZ2FwcGwpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGt3ICE9IE5VTEwpIHsKLQkJCWlmIChQeURpY3RfTWVyZ2Uoa3dhcHBsLCBrdywgMSkgIT0gMCkgewotCQkJCVB5X0RFQ1JFRihhcmdhcHBsKTsKLQkJCQlQeV9ERUNSRUYoa3dhcHBsKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KKyAgICBpZiAocHRvLT5rdyA9PSBQeV9Ob25lKSB7CisgICAgICAgIGt3YXBwbCA9IGt3OworICAgICAgICBQeV9YSU5DUkVGKGt3KTsKKyAgICB9IGVsc2UgeworICAgICAgICBrd2FwcGwgPSBQeURpY3RfQ29weShwdG8tPmt3KTsKKyAgICAgICAgaWYgKGt3YXBwbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJnYXBwbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoa3cgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RGljdF9NZXJnZShrd2FwcGwsIGt3LCAxKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ2FwcGwpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrd2FwcGwpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JcmV0ID0gUHlPYmplY3RfQ2FsbChwdG8tPmZuLCBhcmdhcHBsLCBrd2FwcGwpOwotCVB5X0RFQ1JFRihhcmdhcHBsKTsKLQlQeV9YREVDUkVGKGt3YXBwbCk7Ci0JcmV0dXJuIHJldDsKKyAgICByZXQgPSBQeU9iamVjdF9DYWxsKHB0by0+Zm4sIGFyZ2FwcGwsIGt3YXBwbCk7CisgICAgUHlfREVDUkVGKGFyZ2FwcGwpOworICAgIFB5X1hERUNSRUYoa3dhcHBsKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CiBwYXJ0aWFsX3RyYXZlcnNlKHBhcnRpYWxvYmplY3QgKnB0bywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQocHRvLT5mbik7Ci0JUHlfVklTSVQocHRvLT5hcmdzKTsKLQlQeV9WSVNJVChwdG8tPmt3KTsKLQlQeV9WSVNJVChwdG8tPmRpY3QpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHB0by0+Zm4pOworICAgIFB5X1ZJU0lUKHB0by0+YXJncyk7CisgICAgUHlfVklTSVQocHRvLT5rdyk7CisgICAgUHlfVklTSVQocHRvLT5kaWN0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKHBhcnRpYWxfZG9jLAogInBhcnRpYWwoZnVuYywgKmFyZ3MsICoqa2V5d29yZHMpIC0gbmV3IGZ1bmN0aW9uIHdpdGggcGFydGlhbCBhcHBsaWNhdGlvblxuXAotCW9mIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIGtleXdvcmRzLlxuIik7CisgICAgb2YgdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQga2V5d29yZHMuXG4iKTsKIAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YocGFydGlhbG9iamVjdCwgeCkKIHN0YXRpYyBQeU1lbWJlckRlZiBwYXJ0aWFsX21lbWJlcmxpc3RbXSA9IHsKLQl7ImZ1bmMiLAlUX09CSkVDVCwJT0ZGKGZuKSwJUkVBRE9OTFksCi0JICJmdW5jdGlvbiBvYmplY3QgdG8gdXNlIGluIGZ1dHVyZSBwYXJ0aWFsIGNhbGxzIn0sCi0JeyJhcmdzIiwJVF9PQkpFQ1QsCU9GRihhcmdzKSwJUkVBRE9OTFksCi0JICJ0dXBsZSBvZiBhcmd1bWVudHMgdG8gZnV0dXJlIHBhcnRpYWwgY2FsbHMifSwKLQl7ImtleXdvcmRzIiwJVF9PQkpFQ1QsCU9GRihrdyksCVJFQURPTkxZLAotCSAiZGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyB0byBmdXR1cmUgcGFydGlhbCBjYWxscyJ9LAotCXtOVUxMfSAgLyogU2VudGluZWwgKi8KKyAgICB7ImZ1bmMiLCAgICAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoZm4pLCAgICAgICAgUkVBRE9OTFksCisgICAgICJmdW5jdGlvbiBvYmplY3QgdG8gdXNlIGluIGZ1dHVyZSBwYXJ0aWFsIGNhbGxzIn0sCisgICAgeyJhcmdzIiwgICAgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGFyZ3MpLCAgICAgIFJFQURPTkxZLAorICAgICAidHVwbGUgb2YgYXJndW1lbnRzIHRvIGZ1dHVyZSBwYXJ0aWFsIGNhbGxzIn0sCisgICAgeyJrZXl3b3JkcyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGt3KSwgICAgICAgIFJFQURPTkxZLAorICAgICAiZGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyB0byBmdXR1cmUgcGFydGlhbCBjYWxscyJ9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwYXJ0aWFsX2dldF9kaWN0KHBhcnRpYWxvYmplY3QgKnB0bykKIHsKLQlpZiAocHRvLT5kaWN0ID09IE5VTEwpIHsKLQkJcHRvLT5kaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAocHRvLT5kaWN0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKHB0by0+ZGljdCk7Ci0JcmV0dXJuIHB0by0+ZGljdDsKKyAgICBpZiAocHRvLT5kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgcHRvLT5kaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAocHRvLT5kaWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKHB0by0+ZGljdCk7CisgICAgcmV0dXJuIHB0by0+ZGljdDsKIH0KIAogc3RhdGljIGludAogcGFydGlhbF9zZXRfZGljdChwYXJ0aWFsb2JqZWN0ICpwdG8sIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQkvKiBJdCBpcyBpbGxlZ2FsIHRvIGRlbCBwLl9fZGljdF9fICovCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYSBwYXJ0aWFsIG9iamVjdCdzIGRpY3Rpb25hcnkgbWF5IG5vdCBiZSBkZWxldGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogQ2FuIG9ubHkgc2V0IF9fZGljdF9fIHRvIGEgZGljdGlvbmFyeSAqLwotCWlmICghUHlEaWN0X0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzZXR0aW5nIHBhcnRpYWwgb2JqZWN0J3MgZGljdGlvbmFyeSB0byBhIG5vbi1kaWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdG1wID0gcHRvLT5kaWN0OwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JcHRvLT5kaWN0ID0gdmFsdWU7Ci0JUHlfWERFQ1JFRih0bXApOwotCXJldHVybiAwOworICAgIC8qIEl0IGlzIGlsbGVnYWwgdG8gZGVsIHAuX19kaWN0X18gKi8KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImEgcGFydGlhbCBvYmplY3QncyBkaWN0aW9uYXJ5IG1heSBub3QgYmUgZGVsZXRlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIENhbiBvbmx5IHNldCBfX2RpY3RfXyB0byBhIGRpY3Rpb25hcnkgKi8KKyAgICBpZiAoIVB5RGljdF9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXR0aW5nIHBhcnRpYWwgb2JqZWN0J3MgZGljdGlvbmFyeSB0byBhIG5vbi1kaWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdG1wID0gcHRvLT5kaWN0OworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgcHRvLT5kaWN0ID0gdmFsdWU7CisgICAgUHlfWERFQ1JFRih0bXApOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgcGFydGlhbF9nZXRzZXRsaXN0W10gPSB7Ci0JeyJfX2RpY3RfXyIsIChnZXR0ZXIpcGFydGlhbF9nZXRfZGljdCwgKHNldHRlcilwYXJ0aWFsX3NldF9kaWN0fSwKLQl7TlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7Il9fZGljdF9fIiwgKGdldHRlcilwYXJ0aWFsX2dldF9kaWN0LCAoc2V0dGVyKXBhcnRpYWxfc2V0X2RpY3R9LAorICAgIHtOVUxMfSAvKiBTZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwYXJ0aWFsX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImZ1bmN0b29scy5wYXJ0aWFsIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YocGFydGlhbG9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilwYXJ0aWFsX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKXBhcnRpYWxfY2FsbCwJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsCS8qIHRwX2ZsYWdzICovCi0JcGFydGlhbF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylwYXJ0aWFsX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihwYXJ0aWFsb2JqZWN0LCB3ZWFrcmVmbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCXBhcnRpYWxfbWVtYmVybGlzdCwJCS8qIHRwX21lbWJlcnMgKi8KLQlwYXJ0aWFsX2dldHNldGxpc3QsCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCW9mZnNldG9mKHBhcnRpYWxvYmplY3QsIGRpY3QpLAkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JcGFydGlhbF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJmdW5jdG9vbHMucGFydGlhbCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YocGFydGlhbG9iamVjdCksICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilwYXJ0aWFsX2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYylwYXJ0aWFsX2NhbGwsICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHBhcnRpYWxfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpcGFydGlhbF90cmF2ZXJzZSwgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKHBhcnRpYWxvYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgcGFydGlhbF9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIHBhcnRpYWxfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgb2Zmc2V0b2YocGFydGlhbG9iamVjdCwgZGljdCksICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHBhcnRpYWxfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMzI1LDMxICszMjUsMzEgQEAKICJUb29scyB0aGF0IG9wZXJhdGUgb24gZnVuY3Rpb25zLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKLSAJeyJyZWR1Y2UiLAlmdW5jdG9vbHNfcmVkdWNlLCAgICAgTUVUSF9WQVJBUkdTLCByZWR1Y2VfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InJlZHVjZSIsICAgICAgICAgIGZ1bmN0b29sc19yZWR1Y2UsICAgICBNRVRIX1ZBUkFSR1MsIHJlZHVjZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdF9mdW5jdG9vbHModm9pZCkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbTsKLQljaGFyICpuYW1lOwotCVB5VHlwZU9iamVjdCAqdHlwZWxpc3RbXSA9IHsKLQkJJnBhcnRpYWxfdHlwZSwKLQkJTlVMTAotCX07CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKm07CisgICAgY2hhciAqbmFtZTsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGVsaXN0W10gPSB7CisgICAgICAgICZwYXJ0aWFsX3R5cGUsCisgICAgICAgIE5VTEwKKyAgICB9OwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJfZnVuY3Rvb2xzIiwgbW9kdWxlX21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9mdW5jdG9vbHMiLCBtb2R1bGVfbWV0aG9kcywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JZm9yIChpPTAgOyB0eXBlbGlzdFtpXSAhPSBOVUxMIDsgaSsrKSB7Ci0JCWlmIChQeVR5cGVfUmVhZHkodHlwZWxpc3RbaV0pIDwgMCkKLQkJCXJldHVybjsKLQkJbmFtZSA9IHN0cmNocih0eXBlbGlzdFtpXS0+dHBfbmFtZSwgJy4nKTsKLQkJYXNzZXJ0IChuYW1lICE9IE5VTEwpOwotCQlQeV9JTkNSRUYodHlwZWxpc3RbaV0pOwotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgbmFtZSsxLCAoUHlPYmplY3QgKil0eXBlbGlzdFtpXSk7Ci0JfQorICAgIGZvciAoaT0wIDsgdHlwZWxpc3RbaV0gIT0gTlVMTCA7IGkrKykgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGVsaXN0W2ldKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG5hbWUgPSBzdHJjaHIodHlwZWxpc3RbaV0tPnRwX25hbWUsICcuJyk7CisgICAgICAgIGFzc2VydCAobmFtZSAhPSBOVUxMKTsKKyAgICAgICAgUHlfSU5DUkVGKHR5cGVsaXN0W2ldKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sIG5hbWUrMSwgKFB5T2JqZWN0ICopdHlwZWxpc3RbaV0pOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMgYi9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jCmluZGV4IDRmZDBkZDUuLmY3MDVlYzEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9faGVhcHFtb2R1bGUuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIERyb3AgaW4gcmVwbGFjZW1lbnQgZm9yIGhlYXBxLnB5IAorLyogRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgaGVhcHEucHkKIAogQyBpbXBsZW1lbnRhdGlvbiBkZXJpdmVkIGRpcmVjdGx5IGZyb20gaGVhcHEucHkgaW4gUHkyLjMKIHdoaWNoIHdhcyB3cml0dGVuIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycywKQEAgLTE2LDEyOCArMTYsMTI4IEBACiBzdGF0aWMgaW50CiBjbXBfbHQoUHlPYmplY3QgKngsIFB5T2JqZWN0ICp5KQogewotCWludCBjbXA7Ci0Jc3RhdGljIFB5T2JqZWN0ICpsdCA9IE5VTEw7CisgICAgaW50IGNtcDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmx0ID0gTlVMTDsKIAotCWlmIChsdCA9PSBOVUxMKSB7Ci0JCWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19sdF9fIik7Ci0JCWlmIChsdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlPYmplY3RfSGFzQXR0cih4LCBsdCkpCi0JCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgUHlfTFQpOwotCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh5LCB4LCBQeV9MRSk7Ci0JaWYgKGNtcCAhPSAtMSkKLQkJY21wID0gMSAtIGNtcDsKLQlyZXR1cm4gY21wOworICAgIGlmIChsdCA9PSBOVUxMKSB7CisgICAgICAgIGx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19sdF9fIik7CisgICAgICAgIGlmIChsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfSGFzQXR0cih4LCBsdCkpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeCwgeSwgUHlfTFQpOworICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh5LCB4LCBQeV9MRSk7CisgICAgaWYgKGNtcCAhPSAtMSkKKyAgICAgICAgY21wID0gMSAtIGNtcDsKKyAgICByZXR1cm4gY21wOwogfQogCiBzdGF0aWMgaW50CiBfc2lmdGRvd24oUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IHBvcykKIHsKLQlQeU9iamVjdCAqbmV3aXRlbSwgKnBhcmVudDsKLQlpbnQgY21wOwotCVB5X3NzaXplX3QgcGFyZW50cG9zOworICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqcGFyZW50OworICAgIGludCBjbXA7CisgICAgUHlfc3NpemVfdCBwYXJlbnRwb3M7CiAKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKLQlpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOworICAgIGlmIChwb3MgPj0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQluZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7Ci0JUHlfSU5DUkVGKG5ld2l0ZW0pOwotCS8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCi0JICAgYSBwbGFjZSBuZXdpdGVtIGZpdHMuICovCi0Jd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKXsKLQkJcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7Ci0JCXBhcmVudCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwYXJlbnRwb3MpOwotCQljbXAgPSBjbXBfbHQobmV3aXRlbSwgcGFyZW50KTsKLQkJaWYgKGNtcCA9PSAtMSkgewotCQkJUHlfREVDUkVGKG5ld2l0ZW0pOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChjbXAgPT0gMCkKLQkJCWJyZWFrOwotCQlQeV9JTkNSRUYocGFyZW50KTsKLQkJUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKLQkJcG9zID0gcGFyZW50cG9zOwotCX0KLQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwotCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwotCXJldHVybiAwOworICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKKyAgICBQeV9JTkNSRUYobmV3aXRlbSk7CisgICAgLyogRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcKKyAgICAgICBhIHBsYWNlIG5ld2l0ZW0gZml0cy4gKi8KKyAgICB3aGlsZSAocG9zID4gc3RhcnRwb3MpeworICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMTsKKyAgICAgICAgcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7CisgICAgICAgIGNtcCA9IGNtcF9sdChuZXdpdGVtLCBwYXJlbnQpOworICAgICAgICBpZiAoY21wID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIFB5X0lOQ1JFRihwYXJlbnQpOworICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBwYXJlbnQpOworICAgICAgICBwb3MgPSBwYXJlbnRwb3M7CisgICAgfQorICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIF9zaWZ0dXAoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHBvcykKIHsKLQlQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvczsKLQlpbnQgY21wOwotCVB5T2JqZWN0ICpuZXdpdGVtLCAqdG1wOworICAgIFB5X3NzaXplX3Qgc3RhcnRwb3MsIGVuZHBvcywgY2hpbGRwb3MsIHJpZ2h0cG9zOworICAgIGludCBjbXA7CisgICAgUHlPYmplY3QgKm5ld2l0ZW0sICp0bXA7CiAKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKLQllbmRwb3MgPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7Ci0Jc3RhcnRwb3MgPSBwb3M7Ci0JaWYgKHBvcyA+PSBlbmRwb3MpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQluZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7Ci0JUHlfSU5DUkVGKG5ld2l0ZW0pOworICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOworICAgIGVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKKyAgICBzdGFydHBvcyA9IHBvczsKKyAgICBpZiAocG9zID49IGVuZHBvcykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKKyAgICBQeV9JTkNSRUYobmV3aXRlbSk7CiAKLQkvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCi0JY2hpbGRwb3MgPSAyKnBvcyArIDE7ICAgIC8qIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uICAqLwotCXdoaWxlIChjaGlsZHBvcyA8IGVuZHBvcykgewotCQkvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwotCQlyaWdodHBvcyA9IGNoaWxkcG9zICsgMTsKLQkJaWYgKHJpZ2h0cG9zIDwgZW5kcG9zKSB7Ci0JCQljbXAgPSBjbXBfbHQoCi0JCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSwKLQkJCQlQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpKTsKLQkJCWlmIChjbXAgPT0gLTEpIHsKLQkJCQlQeV9ERUNSRUYobmV3aXRlbSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKGNtcCA9PSAwKQotCQkJCWNoaWxkcG9zID0gcmlnaHRwb3M7Ci0JCX0KLQkJLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KLQkJdG1wID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKTsKLQkJUHlfSU5DUkVGKHRtcCk7Ci0JCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7Ci0JCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHRtcCk7Ci0JCXBvcyA9IGNoaWxkcG9zOwotCQljaGlsZHBvcyA9IDIqcG9zICsgMTsKLQl9CisgICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLworICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KKyAgICB3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKKyAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KKyAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7CisgICAgICAgIGlmIChyaWdodHBvcyA8IGVuZHBvcykgeworICAgICAgICAgICAgY21wID0gY21wX2x0KAorICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyksCisgICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHJpZ2h0cG9zKSk7CisgICAgICAgICAgICBpZiAoY21wID09IC0xKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2l0ZW0pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbXAgPT0gMCkKKyAgICAgICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zOworICAgICAgICB9CisgICAgICAgIC8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCisgICAgICAgIHRtcCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyk7CisgICAgICAgIFB5X0lOQ1JFRih0bXApOworICAgICAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOworICAgICAgICBwb3MgPSBjaGlsZHBvczsKKyAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDE7CisgICAgfQogCi0JLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQotCSAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLwotCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7Ci0JUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7Ci0JcmV0dXJuIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKTsKKyAgICAvKiBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBhbmQgYnViYmxlCisgICAgICAgaXQgdXAgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuICovCisgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKKyAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKKyAgICByZXR1cm4gX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaGVhcHB1c2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpoZWFwLCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaGVhcCwgKml0ZW07CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhlYXBwdXNoIiwgMiwgMiwgJmhlYXAsICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgaXRlbSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGl0ZW0pID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChfc2lmdGRvd24oKFB5TGlzdE9iamVjdCAqKWhlYXAsIDAsIFB5TGlzdF9HRVRfU0laRShoZWFwKS0xKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChfc2lmdGRvd24oKFB5TGlzdE9iamVjdCAqKWhlYXAsIDAsIFB5TGlzdF9HRVRfU0laRShoZWFwKS0xKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoaGVhcHB1c2hfZG9jLApAQCAtMTQ2LDM1ICsxNDYsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBoZWFwcG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaGVhcCkKIHsKLQlQeU9iamVjdCAqbGFzdGVsdCwgKnJldHVybml0ZW07Ci0JUHlfc3NpemVfdCBuOworICAgIFB5T2JqZWN0ICpsYXN0ZWx0LCAqcmV0dXJuaXRlbTsKKyAgICBQeV9zc2l6ZV90IG47CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5ICovCi0JbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKLQlpZiAobiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkgKi8KKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbGFzdGVsdCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBuLTEpIDsKLQlQeV9JTkNSRUYobGFzdGVsdCk7Ci0JUHlMaXN0X1NldFNsaWNlKGhlYXAsIG4tMSwgbiwgTlVMTCk7Ci0Jbi0tOworICAgIGxhc3RlbHQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgbi0xKSA7CisgICAgUHlfSU5DUkVGKGxhc3RlbHQpOworICAgIFB5TGlzdF9TZXRTbGljZShoZWFwLCBuLTEsIG4sIE5VTEwpOworICAgIG4tLTsKIAotCWlmICghbikgCi0JCXJldHVybiBsYXN0ZWx0OwotCXJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Ci0JUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGxhc3RlbHQpOwotCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgewotCQlQeV9ERUNSRUYocmV0dXJuaXRlbSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gcmV0dXJuaXRlbTsKKyAgICBpZiAoIW4pCisgICAgICAgIHJldHVybiBsYXN0ZWx0OworICAgIHJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGxhc3RlbHQpOworICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYocmV0dXJuaXRlbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmV0dXJuaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBwb3BfZG9jLApAQCAtMTgzLDI5ICsxODMsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBoZWFwcmVwbGFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmhlYXAsICppdGVtLCAqcmV0dXJuaXRlbTsKKyAgICBQeU9iamVjdCAqaGVhcCwgKml0ZW0sICpyZXR1cm5pdGVtOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGVhcHJlcGxhY2UiLCAyLCAyLCAmaGVhcCwgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcmVwbGFjZSIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCVB5X0lOQ1JFRihpdGVtKTsKLQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgaXRlbSk7Ci0JaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihyZXR1cm5pdGVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiByZXR1cm5pdGVtOworICAgIHJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsKKyAgICBpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpIHsKKyAgICAgICAgUHlfREVDUkVGKHJldHVybml0ZW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJldHVybml0ZW07CiB9CiAKIFB5RG9jX1NUUlZBUihoZWFwcmVwbGFjZV9kb2MsCkBAIC0yMTUsNDQgKzIxNSw0NCBAQAogbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZVxuXAogcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hICBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2VzIG9mXG5cCiB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OlxuXG5cCi0gICAgICAgIGlmIGl0ZW0gPiBoZWFwWzBdOlxuXAotICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXG4iKTsKKyAgICBpZiBpdGVtID4gaGVhcFswXTpcblwKKyAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pXG4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGhlYXBwdXNocG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqaGVhcCwgKml0ZW0sICpyZXR1cm5pdGVtOwotCWludCBjbXA7CisgICAgUHlPYmplY3QgKmhlYXAsICppdGVtLCAqcmV0dXJuaXRlbTsKKyAgICBpbnQgY21wOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGVhcHB1c2hwb3AiLCAyLCAyLCAmaGVhcCwgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcHVzaHBvcCIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQorICAgIGlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQogCi0JY21wID0gY21wX2x0KFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKSwgaXRlbSk7Ci0JaWYgKGNtcCA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNtcCA9PSAwKSB7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQorICAgIGNtcCA9IGNtcF9sdChQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCksIGl0ZW0pOworICAgIGlmIChjbXAgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjbXAgPT0gMCkgeworICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KIAotCXJldHVybml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Ci0JUHlfSU5DUkVGKGl0ZW0pOwotCVB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsKLQlpZiAoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpIHsKLQkJUHlfREVDUkVGKHJldHVybml0ZW0pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJldHVybml0ZW07CisgICAgcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGl0ZW0pOworICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYocmV0dXJuaXRlbSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmV0dXJuaXRlbTsKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBwdXNocG9wX2RvYywKQEAgLTI2MywyNiArMjYzLDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaGVhcGlmeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmhlYXApCiB7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwotCS8qIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0bwotCSAgIGxvb2tpbmcgYXQgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0Ci0JICAgaGF2ZSAyKmkgKyAxIDwgbiwgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMKLQkgICAoMipqLTEpLzIgPSBqLTEvMiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYKLQkgICBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsCi0JICAgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuCi0JKi8KLQlmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQotCQlpZihfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIC8qIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0bworICAgICAgIGxvb2tpbmcgYXQgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0CisgICAgICAgaGF2ZSAyKmkgKyAxIDwgbiwgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMKKyAgICAgICAoMipqLTEpLzIgPSBqLTEvMiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYKKyAgICAgICBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsCisgICAgICAgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuCisgICAgKi8KKyAgICBmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQorICAgICAgICBpZihfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGhlYXBpZnlfZG9jLApAQCAtMjkxLDc5ICsyOTEsNzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBubGFyZ2VzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKnNvbCwgKml0LCAqb2xkZWxlbTsKLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IGNtcDsKKyAgICBQeU9iamVjdCAqaGVhcD1OVUxMLCAqZWxlbSwgKml0ZXJhYmxlLCAqc29sLCAqaXQsICpvbGRlbGVtOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBpbnQgY21wOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpubGFyZ2VzdCIsICZuLCAmaXRlcmFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POm5sYXJnZXN0IiwgJm4sICZpdGVyYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQloZWFwID0gUHlMaXN0X05ldygwKTsKLQlpZiAoaGVhcCA9PSBOVUxMKQotCQlnb3RvIGZhaWw7CisgICAgaGVhcCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGhlYXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOwogCi0JZm9yIChpPTAgOyBpPG4gOyBpKysgKXsKLQkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKLQkJaWYgKGVsZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBmYWlsOwotCQkJZWxzZQotCQkJCWdvdG8gc29ydGl0OwotCQl9Ci0JCWlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGVsZW0pID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoZWxlbSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJUHlfREVDUkVGKGVsZW0pOwotCX0KLQlpZiAoUHlMaXN0X0dFVF9TSVpFKGhlYXApID09IDApCi0JCWdvdG8gc29ydGl0OworICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrICl7CisgICAgICAgIGVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmIChlbGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb3RvIHNvcnRpdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChoZWFwLCBlbGVtKSA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICB9CisgICAgaWYgKFB5TGlzdF9HRVRfU0laRShoZWFwKSA9PSAwKQorICAgICAgICBnb3RvIHNvcnRpdDsKIAotCWZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCi0JCWlmKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQotCQkJZ290byBmYWlsOworICAgIGZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCisgICAgICAgIGlmKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsOwogCi0Jc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCXdoaWxlICgxKSB7Ci0JCWVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCWlmIChlbGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gZmFpbDsKLQkJCWVsc2UKLQkJCQlnb3RvIHNvcnRpdDsKLQkJfQotCQljbXAgPSBjbXBfbHQoc29sLCBlbGVtKTsKLQkJaWYgKGNtcCA9PSAtMSkgewotCQkJUHlfREVDUkVGKGVsZW0pOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWlmIChjbXAgPT0gMCkgewotCQkJUHlfREVDUkVGKGVsZW0pOwotCQkJY29udGludWU7Ci0JCX0KLQkJb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwotCQlQeV9ERUNSRUYob2xkZWxlbSk7Ci0JCWlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKLQkJCWdvdG8gZmFpbDsKLQkJc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCX0KKyAgICBzb2wgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgaWYgKGVsZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gc29ydGl0OworICAgICAgICB9CisgICAgICAgIGNtcCA9IGNtcF9sdChzb2wsIGVsZW0pOworICAgICAgICBpZiAoY21wID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA9PSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBvbGRlbGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOworICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgMCwgZWxlbSk7CisgICAgICAgIFB5X0RFQ1JFRihvbGRlbGVtKTsKKyAgICAgICAgaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBzb2wgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CisgICAgfQogc29ydGl0OgotCWlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkKLQkJZ290byBmYWlsOwotCWlmIChQeUxpc3RfUmV2ZXJzZShoZWFwKSA9PSAtMSkKLQkJZ290byBmYWlsOwotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIGhlYXA7CisgICAgaWYgKFB5TGlzdF9Tb3J0KGhlYXApID09IC0xKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKFB5TGlzdF9SZXZlcnNlKGhlYXApID09IC0xKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gaGVhcDsKIAogZmFpbDoKLQlQeV9ERUNSRUYoaXQpOwotCVB5X1hERUNSRUYoaGVhcCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9YREVDUkVGKGhlYXApOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIobmxhcmdlc3RfZG9jLApAQCAtMzc0LDE2NiArMzc0LDE2NiBAQAogc3RhdGljIGludAogX3NpZnRkb3dubWF4KFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBzdGFydHBvcywgUHlfc3NpemVfdCBwb3MpCiB7Ci0JUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQ7Ci0JaW50IGNtcDsKLQlQeV9zc2l6ZV90IHBhcmVudHBvczsKKyAgICBQeU9iamVjdCAqbmV3aXRlbSwgKnBhcmVudDsKKyAgICBpbnQgY21wOworICAgIFB5X3NzaXplX3QgcGFyZW50cG9zOwogCi0JYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7Ci0JaWYgKHBvcyA+PSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKKyAgICBpZiAocG9zID49IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwotCVB5X0lOQ1JFRihuZXdpdGVtKTsKLQkvKiBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZwotCSAgIGEgcGxhY2UgbmV3aXRlbSBmaXRzLiAqLwotCXdoaWxlIChwb3MgPiBzdGFydHBvcyl7Ci0JCXBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxOwotCQlwYXJlbnQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcGFyZW50cG9zKTsKLQkJY21wID0gY21wX2x0KHBhcmVudCwgbmV3aXRlbSk7Ci0JCWlmIChjbXAgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihuZXdpdGVtKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoY21wID09IDApCi0JCQlicmVhazsKLQkJUHlfSU5DUkVGKHBhcmVudCk7Ci0JCVB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7Ci0JCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHBhcmVudCk7Ci0JCXBvcyA9IHBhcmVudHBvczsKLQl9Ci0JUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKLQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKLQlyZXR1cm4gMDsKKyAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CisgICAgUHlfSU5DUkVGKG5ld2l0ZW0pOworICAgIC8qIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nCisgICAgICAgYSBwbGFjZSBuZXdpdGVtIGZpdHMuICovCisgICAgd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKXsKKyAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7CisgICAgICAgIHBhcmVudCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwYXJlbnRwb3MpOworICAgICAgICBjbXAgPSBjbXBfbHQocGFyZW50LCBuZXdpdGVtKTsKKyAgICAgICAgaWYgKGNtcCA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKG5ld2l0ZW0pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChjbXAgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBQeV9JTkNSRUYocGFyZW50KTsKKyAgICAgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgcGFyZW50KTsKKyAgICAgICAgcG9zID0gcGFyZW50cG9zOworICAgIH0KKyAgICBQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOworICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBfc2lmdHVwbWF4KFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBwb3MpCiB7Ci0JUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBjaGlsZHBvcywgcmlnaHRwb3M7Ci0JaW50IGNtcDsKLQlQeU9iamVjdCAqbmV3aXRlbSwgKnRtcDsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBlbmRwb3MsIGNoaWxkcG9zLCByaWdodHBvczsKKyAgICBpbnQgY21wOworICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqdG1wOwogCi0JYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7Ci0JZW5kcG9zID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwotCXN0YXJ0cG9zID0gcG9zOwotCWlmIChwb3MgPj0gZW5kcG9zKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwotCVB5X0lOQ1JFRihuZXdpdGVtKTsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKKyAgICBlbmRwb3MgPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7CisgICAgc3RhcnRwb3MgPSBwb3M7CisgICAgaWYgKHBvcyA+PSBlbmRwb3MpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CisgICAgUHlfSU5DUkVGKG5ld2l0ZW0pOwogCi0JLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLwotCWNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KLQl3aGlsZSAoY2hpbGRwb3MgPCBlbmRwb3MpIHsKLQkJLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KLQkJcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7Ci0JCWlmIChyaWdodHBvcyA8IGVuZHBvcykgewotCQkJY21wID0gY21wX2x0KAotCQkJCVB5TGlzdF9HRVRfSVRFTShoZWFwLCByaWdodHBvcyksCi0JCQkJUHlMaXN0X0dFVF9JVEVNKGhlYXAsIGNoaWxkcG9zKSk7Ci0JCQlpZiAoY21wID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKG5ld2l0ZW0pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWlmIChjbXAgPT0gMCkKLQkJCQljaGlsZHBvcyA9IHJpZ2h0cG9zOwotCQl9Ci0JCS8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCi0JCXRtcCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyk7Ci0JCVB5X0lOQ1JFRih0bXApOwotCQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwotCQlQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCB0bXApOwotCQlwb3MgPSBjaGlsZHBvczsKLQkJY2hpbGRwb3MgPSAyKnBvcyArIDE7Ci0JfQorICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KKyAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCisgICAgd2hpbGUgKGNoaWxkcG9zIDwgZW5kcG9zKSB7CisgICAgICAgIC8qIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLiAgICovCisgICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxOworICAgICAgICBpZiAocmlnaHRwb3MgPCBlbmRwb3MpIHsKKyAgICAgICAgICAgIGNtcCA9IGNtcF9sdCgKKyAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpLAorICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcykpOworICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY21wID09IDApCisgICAgICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvczsKKyAgICAgICAgfQorICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLworICAgICAgICB0bXAgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpOworICAgICAgICBQeV9JTkNSRUYodG1wKTsKKyAgICAgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgdG1wKTsKKyAgICAgICAgcG9zID0gY2hpbGRwb3M7CisgICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOworICAgIH0KIAotCS8qIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGFuZCBidWJibGUKLQkgICBpdCB1cCB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4gKi8KLQlQeV9ERUNSRUYoUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcykpOwotCVB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwotCXJldHVybiBfc2lmdGRvd25tYXgoaGVhcCwgc3RhcnRwb3MsIHBvcyk7CisgICAgLyogVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYW5kIGJ1YmJsZQorICAgICAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLworICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CisgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgbmV3aXRlbSk7CisgICAgcmV0dXJuIF9zaWZ0ZG93bm1heChoZWFwLCBzdGFydHBvcywgcG9zKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5zbWFsbGVzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKmxvcywgKml0LCAqb2xkZWxlbTsKLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IGNtcDsKKyAgICBQeU9iamVjdCAqaGVhcD1OVUxMLCAqZWxlbSwgKml0ZXJhYmxlLCAqbG9zLCAqaXQsICpvbGRlbGVtOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBpbnQgY21wOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpuc21hbGxlc3QiLCAmbiwgJml0ZXJhYmxlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpuc21hbGxlc3QiLCAmbiwgJml0ZXJhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWhlYXAgPSBQeUxpc3RfTmV3KDApOwotCWlmIChoZWFwID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKKyAgICBoZWFwID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoaGVhcCA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CiAKLQlmb3IgKGk9MCA7IGk8biA7IGkrKyApewotCQllbGVtID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAoZWxlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIGZhaWw7Ci0JCQllbHNlCi0JCQkJZ290byBzb3J0aXQ7Ci0JCX0KLQkJaWYgKFB5TGlzdF9BcHBlbmQoaGVhcCwgZWxlbSkgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihlbGVtKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlQeV9ERUNSRUYoZWxlbSk7Ci0JfQotCW4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7Ci0JaWYgKG4gPT0gMCkKLQkJZ290byBzb3J0aXQ7CisgICAgZm9yIChpPTAgOyBpPG4gOyBpKysgKXsKKyAgICAgICAgZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgaWYgKGVsZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gc29ydGl0OworICAgICAgICB9CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGVsZW0pID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgIH0KKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOworICAgIGlmIChuID09IDApCisgICAgICAgIGdvdG8gc29ydGl0OwogCi0JZm9yIChpPW4vMi0xIDsgaT49MCA7IGktLSkKLQkJaWYoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCi0JCQlnb3RvIGZhaWw7CisgICAgZm9yIChpPW4vMi0xIDsgaT49MCA7IGktLSkKKyAgICAgICAgaWYoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWw7CiAKLQlsb3MgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7Ci0Jd2hpbGUgKDEpIHsKLQkJZWxlbSA9IFB5SXRlcl9OZXh0KGl0KTsKLQkJaWYgKGVsZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBmYWlsOwotCQkJZWxzZQotCQkJCWdvdG8gc29ydGl0OwotCQl9Ci0JCWNtcCA9IGNtcF9sdChlbGVtLCBsb3MpOwotCQlpZiAoY21wID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoZWxlbSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJaWYgKGNtcCA9PSAwKSB7Ci0JCQlQeV9ERUNSRUYoZWxlbSk7Ci0JCQljb250aW51ZTsKLQkJfQorICAgIGxvcyA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICBpZiAoZWxlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7CisgICAgICAgIH0KKyAgICAgICAgY21wID0gY21wX2x0KGVsZW0sIGxvcyk7CisgICAgICAgIGlmIChjbXAgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY21wID09IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKLQkJUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwotCQlQeV9ERUNSRUYob2xkZWxlbSk7Ci0JCWlmIChfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKLQkJCWdvdG8gZmFpbDsKLQkJbG9zID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwotCX0KKyAgICAgICAgb2xkZWxlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOworICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7CisgICAgICAgIGlmIChfc2lmdHVwbWF4KChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgbG9zID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOworICAgIH0KIAogc29ydGl0OgotCWlmIChQeUxpc3RfU29ydChoZWFwKSA9PSAtMSkKLQkJZ290byBmYWlsOwotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIGhlYXA7CisgICAgaWYgKFB5TGlzdF9Tb3J0KGhlYXApID09IC0xKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gaGVhcDsKIAogZmFpbDoKLQlQeV9ERUNSRUYoaXQpOwotCVB5X1hERUNSRUYoaGVhcCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9YREVDUkVGKGhlYXApOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIobnNtYWxsZXN0X2RvYywKQEAgLTU0MiwyMSArNTQyLDIxIEBACiBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlKVs6bl1cbiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgaGVhcHFfbWV0aG9kc1tdID0gewotCXsiaGVhcHB1c2giLAkoUHlDRnVuY3Rpb24paGVhcHB1c2gsCQkKLQkJTUVUSF9WQVJBUkdTLAloZWFwcHVzaF9kb2N9LAotCXsiaGVhcHB1c2hwb3AiLAkoUHlDRnVuY3Rpb24paGVhcHB1c2hwb3AsCQkKLQkJTUVUSF9WQVJBUkdTLAloZWFwcHVzaHBvcF9kb2N9LAotCXsiaGVhcHBvcCIsCShQeUNGdW5jdGlvbiloZWFwcG9wLAotCQlNRVRIX08sCQloZWFwcG9wX2RvY30sCi0JeyJoZWFwcmVwbGFjZSIsCShQeUNGdW5jdGlvbiloZWFwcmVwbGFjZSwKLQkJTUVUSF9WQVJBUkdTLAloZWFwcmVwbGFjZV9kb2N9LAotCXsiaGVhcGlmeSIsCShQeUNGdW5jdGlvbiloZWFwaWZ5LAotCQlNRVRIX08sCQloZWFwaWZ5X2RvY30sCi0JeyJubGFyZ2VzdCIsCShQeUNGdW5jdGlvbilubGFyZ2VzdCwKLQkJTUVUSF9WQVJBUkdTLAlubGFyZ2VzdF9kb2N9LAotCXsibnNtYWxsZXN0IiwJKFB5Q0Z1bmN0aW9uKW5zbWFsbGVzdCwKLQkJTUVUSF9WQVJBUkdTLAluc21hbGxlc3RfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiaGVhcHB1c2giLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwdXNoLAorICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBoZWFwcHVzaF9kb2N9LAorICAgIHsiaGVhcHB1c2hwb3AiLCAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwdXNocG9wLAorICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBoZWFwcHVzaHBvcF9kb2N9LAorICAgIHsiaGVhcHBvcCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwb3AsCisgICAgICAgIE1FVEhfTywgICAgICAgICAgICAgICAgIGhlYXBwb3BfZG9jfSwKKyAgICB7ImhlYXByZXBsYWNlIiwgICAgIChQeUNGdW5jdGlvbiloZWFwcmVwbGFjZSwKKyAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgaGVhcHJlcGxhY2VfZG9jfSwKKyAgICB7ImhlYXBpZnkiLCAgICAgICAgIChQeUNGdW5jdGlvbiloZWFwaWZ5LAorICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICBoZWFwaWZ5X2RvY30sCisgICAgeyJubGFyZ2VzdCIsICAgICAgICAoUHlDRnVuY3Rpb24pbmxhcmdlc3QsCisgICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIG5sYXJnZXN0X2RvY30sCisgICAgeyJuc21hbGxlc3QiLCAgICAgICAoUHlDRnVuY3Rpb24pbnNtYWxsZXN0LAorICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBuc21hbGxlc3RfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC02ODcsMTEgKzY4NywxMSBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRfaGVhcHEodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlMygiX2hlYXBxIiwgaGVhcHFfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLSAgICAJCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9fYWJvdXRfXyIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoX19hYm91dF9fKSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfaGVhcHEiLCBoZWFwcV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfX2Fib3V0X18iLCBQeVN0cmluZ19Gcm9tU3RyaW5nKF9fYWJvdXRfXykpOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ob3RzaG90LmMgYi9Nb2R1bGVzL19ob3RzaG90LmMKaW5kZXggYTM2Y2Q1MC4uZGY4YTdmOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faG90c2hvdC5jCisrKyBiL01vZHVsZXMvX2hvdHNob3QuYwpAQCAtMjEsMTAgKzIxLDEwIEBACiAKIHR5cGVkZWYgX19pbnQ2NCBoc190aW1lOwogI2RlZmluZSBHRVRUSU1FT0ZEQVkoUF9IU19USU1FKSBcCi0JeyBMQVJHRV9JTlRFR0VSIF90ZW1wOyBcCi0JICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmX3RlbXApOyBcCi0JICAqKFBfSFNfVElNRSkgPSBfdGVtcC5RdWFkUGFydDsgfQotCSAgCisgICAgICAgIHsgTEFSR0VfSU5URUdFUiBfdGVtcDsgXAorICAgICAgICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZfdGVtcCk7IFwKKyAgICAgICAgICAqKFBfSFNfVElNRSkgPSBfdGVtcC5RdWFkUGFydDsgfQorCiAKICNlbHNlCiAjaWZuZGVmIEhBVkVfR0VUVElNRU9GREFZCkBAIC0yODQsNyArMjg0LDcgQEAKIAogICAgIGRvIHsKICAgICAgICAgLyogcmVhZCBieXRlICovCi0JaWYgKChjID0gZmdldGMoc2VsZi0+bG9nZnApKSA9PSBFT0YpCisgICAgICAgIGlmICgoYyA9IGZnZXRjKHNlbGYtPmxvZ2ZwKSkgPT0gRU9GKQogICAgICAgICAgICAgcmV0dXJuIEVSUl9FT0Y7CiAgICAgICAgIGFjY3VtIHw9ICgoYyAmIDB4N0YpID4+IGRpc2NhcmQpIDw8IGJpdHM7CiAgICAgICAgIGJpdHMgKz0gKDcgLSBkaXNjYXJkKTsKQEAgLTMwOCwxOSArMzA4LDE5IEBACiAgICAgaW50IGVycjsKICAgICBpbnQgY2g7CiAgICAgY2hhciAqYnVmOwotICAgIAorCiAgICAgaWYgKChlcnIgPSB1bnBhY2tfcGFja2VkX2ludChzZWxmLCAmbGVuLCAwKSkpCiAgICAgICAgIHJldHVybiBlcnI7CiAKICAgICBidWYgPSAoY2hhciAqKW1hbGxvYyhsZW4pOwogICAgIGlmICghYnVmKSB7Ci0JUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXR1cm4gRVJSX0VYQ0VQVElPTjsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIEVSUl9FWENFUFRJT047CiAgICAgfQogCiAgICAgZm9yIChpPTA7IGkgPCBsZW47IGkrKykgewogICAgICAgICBjaCA9IGZnZXRjKHNlbGYtPmxvZ2ZwKTsKLQlidWZbaV0gPSBjaDsKKyAgICAgICAgYnVmW2ldID0gY2g7CiAgICAgICAgIGlmIChjaCA9PSBFT0YpIHsKICAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgIHJldHVybiBFUlJfRU9GOwpAQCAtNDU5LDE2ICs0NTksMTYgQEAKICAgICAgICAgICAgIGVyciA9IEVSUl9FT0Y7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgc2VsZi0+bGluZXRpbWluZ3MgPSBjID8gMSA6IDA7Ci0JICAgIGdvdG8gcmVzdGFydDsKLQl9CisgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBXSEFUX0ZSQU1FX1RJTUVTOgogICAgICAgICBpZiAoKGMgPSBmZ2V0YyhzZWxmLT5sb2dmcCkpID09IEVPRikKICAgICAgICAgICAgIGVyciA9IEVSUl9FT0Y7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgc2VsZi0+ZnJhbWV0aW1pbmdzID0gYyA/IDEgOiAwOwotCSAgICBnb3RvIHJlc3RhcnQ7Ci0JfQorICAgICAgICAgICAgZ290byByZXN0YXJ0OworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGVyciA9IEVSUl9CQURfUkVDVFlQRTsKQEAgLTg3Niw3ICs4NzYsNyBAQAogICAgIGNhc2UgUHlUcmFjZV9MSU5FOiAgLyogd2Ugb25seSBnZXQgdGhlc2UgZXZlbnRzIGlmIHdlIGFza2VkIGZvciB0aGVtICovCiAgICAgICAgIGlmIChzZWxmLT5saW5ldGltaW5ncykKICAgICAgICAgICAgIHJldHVybiBwYWNrX2xpbmVub190ZGVsdGEoc2VsZiwgZnJhbWUtPmZfbGluZW5vLAotCQkJCSAgICAgIGdldF90ZGVsdGEoc2VsZikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdGRlbHRhKHNlbGYpKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmV0dXJuIHBhY2tfbGluZW5vKHNlbGYsIGZyYW1lLT5mX2xpbmVubyk7CiAKQEAgLTEyMjEsMzkgKzEyMjEsMzkgQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQcm9maWxlclR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9ob3RzaG90LlByb2ZpbGVyVHlwZSIsCQkvKiB0cF9uYW1lCQkqLwotICAgIChpbnQpIHNpemVvZihQcm9maWxlck9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfaXRlbXNpemUJCSovCi0gICAgKGRlc3RydWN0b3IpcHJvZmlsZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfcHJpbnQJCSovCi0gICAgMCwJCQkJCS8qIHRwX2dldGF0dHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NvbXBhcmUJCSovCi0gICAgMCwJCQkJCS8qIHRwX3JlcHIJCSovCi0gICAgMCwJCQkJCS8qIHRwX2FzX251bWJlcgkJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbWFwcGluZwkqLwotICAgIDAsCQkJCQkvKiB0cF9oYXNoCQkqLwotICAgIDAsCQkJCQkvKiB0cF9jYWxsCQkqLwotICAgIDAsCQkJCQkvKiB0cF9zdHIJCSovCi0gICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybwkJKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0cm8JCSovCi0gICAgMCwJCQkJCS8qIHRwX2FzX2J1ZmZlcgkJKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQsCQkJLyogdHBfZmxhZ3MJCSovCi0gICAgcHJvZmlsZXJfb2JqZWN0X19kb2NfXywJCS8qIHRwX2RvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfdHJhdmVyc2UJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NsZWFyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZQkqLwotICAgIDAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldAkqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVybmV4dAkJKi8KLSAgICBwcm9maWxlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMJCSovCi0gICAgcHJvZmlsZXJfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzCQkqLwotICAgIHByb2ZpbGVyX2dldHNldHMsCQkJLyogdHBfZ2V0c2V0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9iYXNlCQkqLwotICAgIDAsCQkJCQkvKiB0cF9kaWN0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9kZXNjcl9nZXQJCSovCi0gICAgMCwJCQkJCS8qIHRwX2Rlc2NyX3NldAkJKi8KKyAgICAiX2hvdHNob3QuUHJvZmlsZXJUeXBlIiwgICAgICAgICAgICAvKiB0cF9uYW1lICAgICAgICAgICAgICAqLworICAgIChpbnQpIHNpemVvZihQcm9maWxlck9iamVjdCksICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgICAgICAgICAgKi8KKyAgICAoZGVzdHJ1Y3Rvcilwcm9maWxlcl9kZWFsbG9jLCAgICAgICAvKiB0cF9kZWFsbG9jICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICAgICAgICAgICAgICAgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICAgICAgICAgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAgICAgICAgICAgICAqLworICAgIHByb2ZpbGVyX29iamVjdF9fZG9jX18sICAgICAgICAgICAgIC8qIHRwX2RvYyAgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICAgICAgICAgICovCisgICAgcHJvZmlsZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAgICAgICAgICAgKi8KKyAgICBwcm9maWxlcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICAgICAgICAgICAqLworICAgIHByb2ZpbGVyX2dldHNldHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICAgICAgICAgKi8KIH07CiAKIApAQCAtMTI3NywxNiArMTI3NywxNiBAQAogQ3JlYXRlIGEgbG9nLXJlYWRlciBmb3IgdGhlIHRpbWluZyBpbmZvcm1hdGlvbiBmaWxlLiIpOwogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgbG9ncmVhZGVyX2FzX3NlcXVlbmNlID0gewotICAgIDAsCQkJCQkvKiBzcV9sZW5ndGggKi8KLSAgICAwLAkJCQkJLyogc3FfY29uY2F0ICovCi0gICAgMCwJCQkJCS8qIHNxX3JlcGVhdCAqLwotICAgIChzc2l6ZWFyZ2Z1bmMpbG9ncmVhZGVyX3NxX2l0ZW0sCS8qIHNxX2l0ZW0gKi8KLSAgICAwLAkJCQkJLyogc3Ffc2xpY2UgKi8KLSAgICAwLAkJCQkJLyogc3FfYXNzX2l0ZW0gKi8KLSAgICAwLAkJCQkJLyogc3FfYXNzX3NsaWNlICovCi0gICAgMCwJCQkJCS8qIHNxX2NvbnRhaW5zICovCi0gICAgMCwJCQkJCS8qIHNxX2lucGxhY2VfY29uY2F0ICovCi0gICAgMCwJCQkJCS8qIHNxX2lucGxhY2VfcmVwZWF0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfbGVuZ3RoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgKHNzaXplYXJnZnVuYylsb2dyZWFkZXJfc3FfaXRlbSwgICAgLyogc3FfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3Nfc2xpY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfaW5wbGFjZV9yZXBlYXQgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMzA1LDM5ICsxMzA1LDM5IEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTG9nUmVhZGVyVHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLSAgICAiX2hvdHNob3QuTG9nUmVhZGVyVHlwZSIsCQkvKiB0cF9uYW1lCQkqLwotICAgIChpbnQpIHNpemVvZihMb2dSZWFkZXJPYmplY3QpLAkvKiB0cF9iYXNpY3NpemUJCSovCi0gICAgMCwJCQkJCS8qIHRwX2l0ZW1zaXplCQkqLwotICAgIChkZXN0cnVjdG9yKWxvZ3JlYWRlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jCQkqLwotICAgIDAsCQkJCQkvKiB0cF9wcmludAkJKi8KLSAgICAwLAkJCQkJLyogdHBfZ2V0YXR0cgkJKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0cgkJKi8KLSAgICAwLAkJCQkJLyogdHBfY29tcGFyZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfcmVwcgkJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbnVtYmVyCQkqLwotICAgICZsb2dyZWFkZXJfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZQkqLwotICAgIDAsCQkJCQkvKiB0cF9hc19tYXBwaW5nCSovCi0gICAgMCwJCQkJCS8qIHRwX2hhc2gJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NhbGwJCSovCi0gICAgMCwJCQkJCS8qIHRwX3N0cgkJKi8KLSAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvCQkqLwotICAgIDAsCQkJCQkvKiB0cF9zZXRhdHRybwkJKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfYnVmZmVyCQkqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncwkJKi8KLSAgICBsb2dyZWFkZXJfX2RvY19fLAkJCS8qIHRwX2RvYwkJKi8KLSAgICAwLAkJCQkJLyogdHBfdHJhdmVyc2UJCSovCi0gICAgMCwJCQkJCS8qIHRwX2NsZWFyCQkqLwotICAgIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZQkqLwotICAgIDAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldAkqLwotICAgIFB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIJCSovCi0gICAgKGl0ZXJuZXh0ZnVuYylsb2dyZWFkZXJfdHBfaXRlcm5leHQsLyogdHBfaXRlcm5leHQJCSovCi0gICAgbG9ncmVhZGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcwkJKi8KLSAgICBsb2dyZWFkZXJfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzCQkqLwotICAgIGxvZ3JlYWRlcl9nZXRzZXRzLAkJCS8qIHRwX2dldHNldAkJKi8KLSAgICAwLAkJCQkJLyogdHBfYmFzZQkJKi8KLSAgICAwLAkJCQkJLyogdHBfZGljdAkJKi8KLSAgICAwLAkJCQkJLyogdHBfZGVzY3JfZ2V0CQkqLwotICAgIDAsCQkJCQkvKiB0cF9kZXNjcl9zZXQJCSovCisgICAgIl9ob3RzaG90LkxvZ1JlYWRlclR5cGUiLCAgICAgICAgICAgLyogdHBfbmFtZSAgICAgICAgICAgICAgKi8KKyAgICAoaW50KSBzaXplb2YoTG9nUmVhZGVyT2JqZWN0KSwgICAgICAvKiB0cF9iYXNpY3NpemUgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICAgICAgICAgICovCisgICAgKGRlc3RydWN0b3IpbG9ncmVhZGVyX2RlYWxsb2MsICAgICAgLyogdHBfZGVhbGxvYyAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICAgICAgICAgKi8KKyAgICAmbG9ncmVhZGVyX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAgICAgICAgICAgICAgICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAgICAgICAgICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgICAgICAgICAgICAgKi8KKyAgICBsb2dyZWFkZXJfX2RvY19fLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgICAgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICAgICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAgICAgICAgICAgICAgKi8KKyAgICAoaXRlcm5leHRmdW5jKWxvZ3JlYWRlcl90cF9pdGVybmV4dCwvKiB0cF9pdGVybmV4dCAgICAgICAgICAqLworICAgIGxvZ3JlYWRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgICAgICAgICAgICovCisgICAgbG9ncmVhZGVyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAgICAgICAgICAgKi8KKyAgICBsb2dyZWFkZXJfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgICAgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgICAgICAgICAgICAgICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAgICAgICAgICAgICAgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgICAgICAgICAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAgICAgICAgICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTQ2Myw4ICsxNDYzLDggQEAKIAogICAgIHRlbXAgPSBQeVN5c19HZXRPYmplY3QoInBhdGgiKTsKICAgICBpZiAodGVtcCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodGVtcCkpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAic3lzLnBhdGggbXVzdCBiZSBhIGxpc3QiKTsKLSAgICAJcmV0dXJuIC0xOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAic3lzLnBhdGggbXVzdCBiZSBhIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBsZW4gPSBQeUxpc3RfR0VUX1NJWkUodGVtcCk7CiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CkBAIC0xNTYyLDcgKzE1NjIsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLVB5RG9jX1ZBUihyZXNvbHV0aW9uX19kb2NfXykgPSAKK1B5RG9jX1ZBUihyZXNvbHV0aW9uX19kb2NfXykgPQogI2lmZGVmIE1TX1dJTkRPV1MKIFB5RG9jX1NUUigKICJyZXNvbHV0aW9uKCkgLT4gKHBlcmZvcm1hbmNlLWNvdW50ZXItdGlja3MsIHVwZGF0ZS1mcmVxdWVuY3kpXG4iCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCmluZGV4IGJmNWQ1OGQuLjdlNDc1ZGEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICBQeU9iamVjdCAqcmVzdWx0X29iamVjdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXx6OnNldGxvY2FsZSIsICZjYXRlZ29yeSwgJmxvY2FsZSkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKGxvY2FsZSkgewogICAgICAgICAvKiBzZXQgbG9jYWxlICovCkBAIC0yNzIsNyArMjcyLDcgQEAKIHsKICNpZiAhZGVmaW5lZChIQVZFX1dDU0NPTEwpIHx8ICFkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpCiAgICAgY2hhciAqczEsKnMyOwotICAgIAorCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpzdHJjb2xsIiwgJnMxLCAmczIpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc3RyY29sbChzMSwgczIpKTsKQEAgLTI4MCw3ICsyODAsNyBAQAogICAgIFB5T2JqZWN0ICpvczEsICpvczIsICpyZXN1bHQgPSBOVUxMOwogICAgIHdjaGFyX3QgKndzMSA9IE5VTEwsICp3czIgPSBOVUxMOwogICAgIGludCByZWwxID0gMCwgcmVsMiA9IDAsIGxlbjEsIGxlbjI7Ci0gICAgCisKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdHJjb2xsIiwgMiwgMiwgJm9zMSwgJm9zMikpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIC8qIElmIGJvdGggYXJndW1lbnRzIGFyZSBieXRlIHN0cmluZ3MsIHVzZSBzdHJjb2xsLiAgKi8KQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvczEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0gCisgICAgICAgIH0KICAgICAgICAgcmVsMiA9IDE7CiAgICAgfQogICAgIC8qIENvbnZlcnQgdGhlIHVuaWNvZGUgc3RyaW5ncyB0byB3Y2hhcltdLiAqLwpAQCAtNDM0LDcgKzQzNCw3IEBACiAgICAgICAgIC8qIFRoaXMgbGVha3MgYW4gb2JqZWN0LiAqLwogICAgICAgICBuYW1lID0gQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZShlbmMpOwogICAgIH0KLSAgICByZXR1cm4gKGNoYXIgKilDRlN0cmluZ0dldENTdHJpbmdQdHIobmFtZSwgMCk7IAorICAgIHJldHVybiAoY2hhciAqKUNGU3RyaW5nR2V0Q1N0cmluZ1B0cihuYW1lLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgpAQCAtNDQ3LDkgKzQ0Nyw5IEBACiAjaWZkZWYgSEFWRV9MQU5HSU5GT19ICiAjZGVmaW5lIExBTkdJTkZPKFgpIHsjWCwgWH0KIHN0YXRpYyBzdHJ1Y3QgbGFuZ2luZm9fY29uc3RhbnR7Ci0JY2hhciogbmFtZTsKLQlpbnQgdmFsdWU7Ci19IGxhbmdpbmZvX2NvbnN0YW50c1tdID0gCisgICAgY2hhciogbmFtZTsKKyAgICBpbnQgdmFsdWU7Cit9IGxhbmdpbmZvX2NvbnN0YW50c1tdID0KIHsKICAgICAvKiBUaGVzZSBjb25zdGFudHMgc2hvdWxkIGV4aXN0IG9uIGFueSBsYW5naW5mbyBpbXBsZW1lbnRhdGlvbiAqLwogICAgIExBTkdJTkZPKERBWV8xKSwKQEAgLTU2NywxMiArNTY3LDEyIEBACiAgICAgICAgcmV0dXJucyBudW1lcmljIHZhbHVlcyBpbiB0aGUgY2hhciogcmV0dXJuIHZhbHVlLCB3aGljaCB3b3VsZAogICAgICAgIGNyYXNoIFB5U3RyaW5nX0Zyb21TdHJpbmcuICAqLwogICAgIGZvciAoaSA9IDA7IGxhbmdpbmZvX2NvbnN0YW50c1tpXS5uYW1lOyBpKyspCi0gICAgICAgIGlmIChsYW5naW5mb19jb25zdGFudHNbaV0udmFsdWUgPT0gaXRlbSkgewotICAgICAgICAgICAgLyogQ2hlY2sgTlVMTCBhcyBhIHdvcmthcm91bmQgZm9yIEdOVSBsaWJjJ3MgcmV0dXJuaW5nIE5VTEwKLSAgICAgICAgICAgICAgIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nIGZvciBubF9sYW5naW5mbyhFUkEpLiAgKi8KLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IG5sX2xhbmdpbmZvKGl0ZW0pOwotICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmVzdWx0ICE9IE5VTEwgPyByZXN1bHQgOiAiIik7Ci0gICAgICAgIH0KKyAgICBpZiAobGFuZ2luZm9fY29uc3RhbnRzW2ldLnZhbHVlID09IGl0ZW0pIHsKKyAgICAgICAgLyogQ2hlY2sgTlVMTCBhcyBhIHdvcmthcm91bmQgZm9yIEdOVSBsaWJjJ3MgcmV0dXJuaW5nIE5VTEwKKyAgICAgICAgICAgaW5zdGVhZCBvZiBhbiBlbXB0eSBzdHJpbmcgZm9yIG5sX2xhbmdpbmZvKEVSQSkuICAqLworICAgICAgICBjb25zdCBjaGFyICpyZXN1bHQgPSBubF9sYW5naW5mbyhpdGVtKTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmVzdWx0ICE9IE5VTEwgPyByZXN1bHQgOiAiIik7CisgICAgfQogICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidW5zdXBwb3J0ZWQgbGFuZ2luZm8gY29uc3RhbnQiKTsKICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTU4NywxMCArNTg3LDEwIEBACiBzdGF0aWMgUHlPYmplY3QqCiBQeUludGxfZ2V0dGV4dChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqaW47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJmluKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZ2V0dGV4dChpbikpOworICAgIGNoYXIgKmluOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZpbikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGdldHRleHQoaW4pKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRnZXR0ZXh0X19kb2NfXywKQEAgLTYwMCwxMCArNjAwLDEwIEBACiBzdGF0aWMgUHlPYmplY3QqCiBQeUludGxfZGdldHRleHQoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmRvbWFpbiwgKmluOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienMiLCAmZG9tYWluLCAmaW4pKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZ2V0dGV4dChkb21haW4sIGluKSk7CisgICAgY2hhciAqZG9tYWluLCAqaW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6cyIsICZkb21haW4sICZpbikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRnZXR0ZXh0KGRvbWFpbiwgaW4pKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRjZ2V0dGV4dF9fZG9jX18sCkBAIC02MTMsMTEgKzYxMywxMSBAQAogc3RhdGljIFB5T2JqZWN0KgogUHlJbnRsX2RjZ2V0dGV4dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZG9tYWluLCAqbXNnaWQ7Ci0JaW50IGNhdGVnb3J5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienNpIiwgJmRvbWFpbiwgJm1zZ2lkLCAmY2F0ZWdvcnkpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkY2dldHRleHQoZG9tYWluLG1zZ2lkLGNhdGVnb3J5KSk7CisgICAgY2hhciAqZG9tYWluLCAqbXNnaWQ7CisgICAgaW50IGNhdGVnb3J5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienNpIiwgJmRvbWFpbiwgJm1zZ2lkLCAmY2F0ZWdvcnkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkY2dldHRleHQoZG9tYWluLG1zZ2lkLGNhdGVnb3J5KSk7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZXh0ZG9tYWluX19kb2NfXywKQEAgLTYyNywxNSArNjI3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QqCiBQeUludGxfdGV4dGRvbWFpbihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JY2hhciAqZG9tYWluOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieiIsICZkb21haW4pKQotCQlyZXR1cm4gMDsKLQlkb21haW4gPSB0ZXh0ZG9tYWluKGRvbWFpbik7Ci0JaWYgKCFkb21haW4pIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9tYWluKTsKKyAgICBjaGFyICpkb21haW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6IiwgJmRvbWFpbikpCisgICAgICAgIHJldHVybiAwOworICAgIGRvbWFpbiA9IHRleHRkb21haW4oZG9tYWluKTsKKyAgICBpZiAoIWRvbWFpbikgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkb21haW4pOwogfQogCiBQeURvY19TVFJWQVIoYmluZHRleHRkb21haW5fX2RvY19fLApAQCAtNjQ1LDE5ICs2NDUsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCoKIFB5SW50bF9iaW5kdGV4dGRvbWFpbihQeU9iamVjdCogc2VsZixQeU9iamVjdCphcmdzKQogewotCWNoYXIgKmRvbWFpbiwgKmRpcm5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzeiIsICZkb21haW4sICZkaXJuYW1lKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFzdHJsZW4oZG9tYWluKSkgewotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJkb21haW4gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmciKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWRpcm5hbWUgPSBiaW5kdGV4dGRvbWFpbihkb21haW4sIGRpcm5hbWUpOwotCWlmICghZGlybmFtZSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkaXJuYW1lKTsKKyAgICBjaGFyICpkb21haW4sICpkaXJuYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3oiLCAmZG9tYWluLCAmZGlybmFtZSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghc3RybGVuKGRvbWFpbikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiZG9tYWluIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBkaXJuYW1lID0gYmluZHRleHRkb21haW4oZG9tYWluLCBkaXJuYW1lKTsKKyAgICBpZiAoIWRpcm5hbWUpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGlybmFtZSk7CiB9CiAKICNpZmRlZiBIQVZFX0JJTkRfVEVYVERPTUFJTl9DT0RFU0VUCkBAIC02NjgsMjYgKzY2OCwyNiBAQAogc3RhdGljIFB5T2JqZWN0KgogUHlJbnRsX2JpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KFB5T2JqZWN0KiBzZWxmLFB5T2JqZWN0KmFyZ3MpCiB7Ci0JY2hhciAqZG9tYWluLCpjb2Rlc2V0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3oiLCAmZG9tYWluLCAmY29kZXNldCkpCi0JCXJldHVybiBOVUxMOwotCWNvZGVzZXQgPSBiaW5kX3RleHRkb21haW5fY29kZXNldChkb21haW4sIGNvZGVzZXQpOwotCWlmIChjb2Rlc2V0KQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhjb2Rlc2V0KTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBjaGFyICpkb21haW4sKmNvZGVzZXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzeiIsICZkb21haW4sICZjb2Rlc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29kZXNldCA9IGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0KGRvbWFpbiwgY29kZXNldCk7CisgICAgaWYgKGNvZGVzZXQpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGNvZGVzZXQpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogI2VuZGlmCiAKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFB5TG9jYWxlX01ldGhvZHNbXSA9IHsKLSAgeyJzZXRsb2NhbGUiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX3NldGxvY2FsZSwgCisgIHsic2V0bG9jYWxlIiwgKFB5Q0Z1bmN0aW9uKSBQeUxvY2FsZV9zZXRsb2NhbGUsCiAgICBNRVRIX1ZBUkFSR1MsIHNldGxvY2FsZV9fZG9jX199LAotICB7ImxvY2FsZWNvbnYiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX2xvY2FsZWNvbnYsIAorICB7ImxvY2FsZWNvbnYiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX2xvY2FsZWNvbnYsCiAgICBNRVRIX05PQVJHUywgbG9jYWxlY29udl9fZG9jX199LAotICB7InN0cmNvbGwiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX3N0cmNvbGwsIAorICB7InN0cmNvbGwiLCAoUHlDRnVuY3Rpb24pIFB5TG9jYWxlX3N0cmNvbGwsCiAgICBNRVRIX1ZBUkFSR1MsIHN0cmNvbGxfX2RvY19ffSwKLSAgeyJzdHJ4ZnJtIiwgKFB5Q0Z1bmN0aW9uKSBQeUxvY2FsZV9zdHJ4ZnJtLCAKKyAgeyJzdHJ4ZnJtIiwgKFB5Q0Z1bmN0aW9uKSBQeUxvY2FsZV9zdHJ4ZnJtLAogICAgTUVUSF9WQVJBUkdTLCBzdHJ4ZnJtX19kb2NfX30sCiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQVBQTEVfXykKICAgeyJfZ2V0ZGVmYXVsdGxvY2FsZSIsIChQeUNGdW5jdGlvbikgUHlMb2NhbGVfZ2V0ZGVmYXVsdGxvY2FsZSwgTUVUSF9OT0FSR1N9LApAQCAtNzExLDcgKzcxMSw3IEBACiAgIHsiYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQiLChQeUNGdW5jdGlvbilQeUludGxfYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQsCiAgICBNRVRIX1ZBUkFSR1MsIGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0X19kb2NfX30sCiAjZW5kaWYKLSNlbmRpZiAgCisjZW5kaWYKICAge05VTEwsIE5VTEx9CiB9OwogCkBAIC03MjUsNyArNzI1LDcgQEAKIAogICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfbG9jYWxlIiwgUHlMb2NhbGVfTWV0aG9kcyk7CiAgICAgaWYgKG0gPT0gTlVMTCkKLSAgICAJcmV0dXJuOworICAgIHJldHVybjsKIAogICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogCkBAIC03NzIsMTMgKzc3MiwxMyBAQAogCiAjaWZkZWYgSEFWRV9MQU5HSU5GT19ICiAgICAgZm9yIChpID0gMDsgbGFuZ2luZm9fY29uc3RhbnRzW2ldLm5hbWU7IGkrKykgewotCSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCBsYW5naW5mb19jb25zdGFudHNbaV0ubmFtZSwKLQkJCQkgICAgbGFuZ2luZm9fY29uc3RhbnRzW2ldLnZhbHVlKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgbGFuZ2luZm9fY29uc3RhbnRzW2ldLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmdpbmZvX2NvbnN0YW50c1tpXS52YWx1ZSk7CiAgICAgfQogI2VuZGlmCiB9CiAKLS8qIAorLyoKIExvY2FsIHZhcmlhYmxlczoKIGMtYmFzaWMtb2Zmc2V0OiA0CiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2xzcHJvZi5jIGIvTW9kdWxlcy9fbHNwcm9mLmMKaW5kZXggODgyMGZjZi4uMDQ5Yzk0ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbHNwcm9mLmMKKysrIGIvTW9kdWxlcy9fbHNwcm9mLmMKQEAgLTE3LDE5ICsxNywxOSBAQAogc3RhdGljIFBZX0xPTkdfTE9ORwogaHBUaW1lcih2b2lkKQogewotCUxBUkdFX0lOVEVHRVIgbGk7Ci0JUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJmxpKTsKLQlyZXR1cm4gbGkuUXVhZFBhcnQ7CisgICAgTEFSR0VfSU5URUdFUiBsaTsKKyAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcigmbGkpOworICAgIHJldHVybiBsaS5RdWFkUGFydDsKIH0KIAogc3RhdGljIGRvdWJsZQogaHBUaW1lclVuaXQodm9pZCkKIHsKLQlMQVJHRV9JTlRFR0VSIGxpOwotCWlmIChRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZsaSkpCi0JCXJldHVybiAxLjAgLyBsaS5RdWFkUGFydDsKLQllbHNlCi0JCXJldHVybiAwLjAwMDAwMTsgIC8qIHVubGlrZWx5ICovCisgICAgTEFSR0VfSU5URUdFUiBsaTsKKyAgICBpZiAoUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSgmbGkpKQorICAgICAgICByZXR1cm4gMS4wIC8gbGkuUXVhZFBhcnQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMC4wMDAwMDE7ICAvKiB1bmxpa2VseSAqLwogfQogCiAjZWxzZSAgLyogIU1TX1dJTkRPV1MgKi8KQEAgLTQ4LDIyICs0OCwyMiBAQAogc3RhdGljIFBZX0xPTkdfTE9ORwogaHBUaW1lcih2b2lkKQogewotCXN0cnVjdCB0aW1ldmFsIHR2OwotCVBZX0xPTkdfTE9ORyByZXQ7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgUFlfTE9OR19MT05HIHJldDsKICNpZmRlZiBHRVRUSU1FT0ZEQVlfTk9fVFoKLQlnZXR0aW1lb2ZkYXkoJnR2KTsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2KTsKICNlbHNlCi0JZ2V0dGltZW9mZGF5KCZ0diwgKHN0cnVjdCB0aW1lem9uZSAqKU5VTEwpOworICAgIGdldHRpbWVvZmRheSgmdHYsIChzdHJ1Y3QgdGltZXpvbmUgKilOVUxMKTsKICNlbmRpZgotCXJldCA9IHR2LnR2X3NlYzsKLQlyZXQgPSByZXQgKiAxMDAwMDAwICsgdHYudHZfdXNlYzsKLQlyZXR1cm4gcmV0OworICAgIHJldCA9IHR2LnR2X3NlYzsKKyAgICByZXQgPSByZXQgKiAxMDAwMDAwICsgdHYudHZfdXNlYzsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgZG91YmxlCiBocFRpbWVyVW5pdCh2b2lkKQogewotCXJldHVybiAwLjAwMDAwMTsKKyAgICByZXR1cm4gMC4wMDAwMDE7CiB9CiAKICNlbmRpZiAgLyogTVNfV0lORE9XUyAqLwpAQCAtNzUsNDEgKzc1LDQxIEBACiAKIC8qIHJlcHJlc2VudHMgYSBmdW5jdGlvbiBjYWxsZWQgZnJvbSBhbm90aGVyIGZ1bmN0aW9uICovCiB0eXBlZGVmIHN0cnVjdCBfUHJvZmlsZXJTdWJFbnRyeSB7Ci0Jcm90YXRpbmdfbm9kZV90IGhlYWRlcjsKLQlQWV9MT05HX0xPTkcgdHQ7Ci0JUFlfTE9OR19MT05HIGl0OwotCWxvbmcgY2FsbGNvdW50OwotCWxvbmcgcmVjdXJzaXZlY2FsbGNvdW50OwotCWxvbmcgcmVjdXJzaW9uTGV2ZWw7CisgICAgcm90YXRpbmdfbm9kZV90IGhlYWRlcjsKKyAgICBQWV9MT05HX0xPTkcgdHQ7CisgICAgUFlfTE9OR19MT05HIGl0OworICAgIGxvbmcgY2FsbGNvdW50OworICAgIGxvbmcgcmVjdXJzaXZlY2FsbGNvdW50OworICAgIGxvbmcgcmVjdXJzaW9uTGV2ZWw7CiB9IFByb2ZpbGVyU3ViRW50cnk7CiAKIC8qIHJlcHJlc2VudHMgYSBmdW5jdGlvbiBvciB1c2VyIGRlZmluZWQgYmxvY2sgKi8KIHR5cGVkZWYgc3RydWN0IF9Qcm9maWxlckVudHJ5IHsKLQlyb3RhdGluZ19ub2RlX3QgaGVhZGVyOwotCVB5T2JqZWN0ICp1c2VyT2JqOyAvKiBQeUNvZGVPYmplY3QsIG9yIGEgZGVzY3JpcHRpdmUgc3RyIGZvciBidWlsdGlucyAqLwotCVBZX0xPTkdfTE9ORyB0dDsgLyogdG90YWwgdGltZSBpbiB0aGlzIGVudHJ5ICovCi0JUFlfTE9OR19MT05HIGl0OyAvKiBpbmxpbmUgdGltZSBpbiB0aGlzIGVudHJ5IChub3QgaW4gc3ViY2FsbHMpICovCi0JbG9uZyBjYWxsY291bnQ7IC8qIGhvdyBtYW55IHRpbWVzIHRoaXMgd2FzIGNhbGxlZCAqLwotCWxvbmcgcmVjdXJzaXZlY2FsbGNvdW50OyAvKiBob3cgbWFueSB0aW1lcyBjYWxsZWQgcmVjdXJzaXZlbHkgKi8KLQlsb25nIHJlY3Vyc2lvbkxldmVsOwotCXJvdGF0aW5nX25vZGVfdCAqY2FsbHM7CisgICAgcm90YXRpbmdfbm9kZV90IGhlYWRlcjsKKyAgICBQeU9iamVjdCAqdXNlck9iajsgLyogUHlDb2RlT2JqZWN0LCBvciBhIGRlc2NyaXB0aXZlIHN0ciBmb3IgYnVpbHRpbnMgKi8KKyAgICBQWV9MT05HX0xPTkcgdHQ7IC8qIHRvdGFsIHRpbWUgaW4gdGhpcyBlbnRyeSAqLworICAgIFBZX0xPTkdfTE9ORyBpdDsgLyogaW5saW5lIHRpbWUgaW4gdGhpcyBlbnRyeSAobm90IGluIHN1YmNhbGxzKSAqLworICAgIGxvbmcgY2FsbGNvdW50OyAvKiBob3cgbWFueSB0aW1lcyB0aGlzIHdhcyBjYWxsZWQgKi8KKyAgICBsb25nIHJlY3Vyc2l2ZWNhbGxjb3VudDsgLyogaG93IG1hbnkgdGltZXMgY2FsbGVkIHJlY3Vyc2l2ZWx5ICovCisgICAgbG9uZyByZWN1cnNpb25MZXZlbDsKKyAgICByb3RhdGluZ19ub2RlX3QgKmNhbGxzOwogfSBQcm9maWxlckVudHJ5OwogCiB0eXBlZGVmIHN0cnVjdCBfUHJvZmlsZXJDb250ZXh0IHsKLQlQWV9MT05HX0xPTkcgdDA7Ci0JUFlfTE9OR19MT05HIHN1YnQ7Ci0Jc3RydWN0IF9Qcm9maWxlckNvbnRleHQgKnByZXZpb3VzOwotCVByb2ZpbGVyRW50cnkgKmN0eEVudHJ5OworICAgIFBZX0xPTkdfTE9ORyB0MDsKKyAgICBQWV9MT05HX0xPTkcgc3VidDsKKyAgICBzdHJ1Y3QgX1Byb2ZpbGVyQ29udGV4dCAqcHJldmlvdXM7CisgICAgUHJvZmlsZXJFbnRyeSAqY3R4RW50cnk7CiB9IFByb2ZpbGVyQ29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlyb3RhdGluZ19ub2RlX3QgKnByb2ZpbGVyRW50cmllczsKLQlQcm9maWxlckNvbnRleHQgKmN1cnJlbnRQcm9maWxlckNvbnRleHQ7Ci0JUHJvZmlsZXJDb250ZXh0ICpmcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKLQlpbnQgZmxhZ3M7Ci0JUHlPYmplY3QgKmV4dGVybmFsVGltZXI7Ci0JZG91YmxlIGV4dGVybmFsVGltZXJVbml0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICByb3RhdGluZ19ub2RlX3QgKnByb2ZpbGVyRW50cmllczsKKyAgICBQcm9maWxlckNvbnRleHQgKmN1cnJlbnRQcm9maWxlckNvbnRleHQ7CisgICAgUHJvZmlsZXJDb250ZXh0ICpmcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKKyAgICBpbnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKmV4dGVybmFsVGltZXI7CisgICAgZG91YmxlIGV4dGVybmFsVGltZXJVbml0OwogfSBQcm9maWxlck9iamVjdDsKIAogI2RlZmluZSBQT0ZfRU5BQkxFRCAgICAgMHgwMDEKQEAgLTEyOSw0MDcgKzEyOSw0MDcgQEAKIAogc3RhdGljIFBZX0xPTkdfTE9ORyBDYWxsRXh0ZXJuYWxUaW1lcihQcm9maWxlck9iamVjdCAqcE9iaikKIHsKLQlQWV9MT05HX0xPTkcgcmVzdWx0OwotCVB5T2JqZWN0ICpvID0gUHlPYmplY3RfQ2FsbChwT2JqLT5leHRlcm5hbFRpbWVyLCBlbXB0eV90dXBsZSwgTlVMTCk7Ci0JaWYgKG8gPT0gTlVMTCkgewotCQlQeUVycl9Xcml0ZVVucmFpc2FibGUocE9iai0+ZXh0ZXJuYWxUaW1lcik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAocE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQgPiAwLjApIHsKLQkJLyogaW50ZXJwcmV0IHRoZSByZXN1bHQgYXMgYW4gaW50ZWdlciB0aGF0IHdpbGwgYmUgc2NhbGVkCi0JCSAgIGluIHByb2ZpbGVyX2dldHN0YXRzKCkgKi8KLQkJcmVzdWx0ID0gUHlMb25nX0FzTG9uZ0xvbmcobyk7Ci0JfQotCWVsc2UgewotCQkvKiBpbnRlcnByZXQgdGhlIHJlc3VsdCBhcyBhIGRvdWJsZSBtZWFzdXJlZCBpbiBzZWNvbmRzLgotCQkgICBBcyB0aGUgcHJvZmlsZXIgd29ya3Mgd2l0aCBQWV9MT05HX0xPTkcgaW50ZXJuYWxseQotCQkgICB3ZSBjb252ZXJ0IGl0IHRvIGEgbGFyZ2UgaW50ZWdlciAqLwotCQlkb3VibGUgdmFsID0gUHlGbG9hdF9Bc0RvdWJsZShvKTsKLQkJLyogZXJyb3IgaGFuZGxpbmcgZGVsYXllZCB0byB0aGUgY29kZSBiZWxvdyAqLwotCQlyZXN1bHQgPSAoUFlfTE9OR19MT05HKSAodmFsICogRE9VQkxFX1RJTUVSX1BSRUNJU0lPTik7Ci0JfQotCVB5X0RFQ1JFRihvKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9Xcml0ZVVucmFpc2FibGUocE9iai0+ZXh0ZXJuYWxUaW1lcik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFBZX0xPTkdfTE9ORyByZXN1bHQ7CisgICAgUHlPYmplY3QgKm8gPSBQeU9iamVjdF9DYWxsKHBPYmotPmV4dGVybmFsVGltZXIsIGVtcHR5X3R1cGxlLCBOVUxMKTsKKyAgICBpZiAobyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShwT2JqLT5leHRlcm5hbFRpbWVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChwT2JqLT5leHRlcm5hbFRpbWVyVW5pdCA+IDAuMCkgeworICAgICAgICAvKiBpbnRlcnByZXQgdGhlIHJlc3VsdCBhcyBhbiBpbnRlZ2VyIHRoYXQgd2lsbCBiZSBzY2FsZWQKKyAgICAgICAgICAgaW4gcHJvZmlsZXJfZ2V0c3RhdHMoKSAqLworICAgICAgICByZXN1bHQgPSBQeUxvbmdfQXNMb25nTG9uZyhvKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGludGVycHJldCB0aGUgcmVzdWx0IGFzIGEgZG91YmxlIG1lYXN1cmVkIGluIHNlY29uZHMuCisgICAgICAgICAgIEFzIHRoZSBwcm9maWxlciB3b3JrcyB3aXRoIFBZX0xPTkdfTE9ORyBpbnRlcm5hbGx5CisgICAgICAgICAgIHdlIGNvbnZlcnQgaXQgdG8gYSBsYXJnZSBpbnRlZ2VyICovCisgICAgICAgIGRvdWJsZSB2YWwgPSBQeUZsb2F0X0FzRG91YmxlKG8pOworICAgICAgICAvKiBlcnJvciBoYW5kbGluZyBkZWxheWVkIHRvIHRoZSBjb2RlIGJlbG93ICovCisgICAgICAgIHJlc3VsdCA9IChQWV9MT05HX0xPTkcpICh2YWwgKiBET1VCTEVfVElNRVJfUFJFQ0lTSU9OKTsKKyAgICB9CisgICAgUHlfREVDUkVGKG8pOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShwT2JqLT5leHRlcm5hbFRpbWVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLSNkZWZpbmUgQ0FMTF9USU1FUihwT2JqKQkoKHBPYmopLT5leHRlcm5hbFRpbWVyID8JCVwKLQkJCQkJQ2FsbEV4dGVybmFsVGltZXIocE9iaikgOglcCi0JCQkJCWhwVGltZXIoKSkKKyNkZWZpbmUgQ0FMTF9USU1FUihwT2JqKSAgICAgICAgKChwT2JqKS0+ZXh0ZXJuYWxUaW1lciA/ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsRXh0ZXJuYWxUaW1lcihwT2JqKSA6ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocFRpbWVyKCkpCiAKIC8qKiogUHJvZmlsZXJPYmplY3QgKioqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogbm9ybWFsaXplVXNlck9iaihQeU9iamVjdCAqb2JqKQogewotCVB5Q0Z1bmN0aW9uT2JqZWN0ICpmbjsKLQlpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKG9iaikpIHsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JCXJldHVybiBvYmo7Ci0JfQotCS8qIFJlcGxhY2UgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0cyB3aXRoIGEgZGVzY3JpcHRpdmUgc3RyaW5nCi0JICAgYmVjYXVzZSBvZiBidWlsdC1pbiBtZXRob2RzIC0tIGtlZXBpbmcgYSByZWZlcmVuY2UgdG8KLQkgICBfX3NlbGZfXyBpcyBwcm9iYWJseSBub3QgYSBnb29kIGlkZWEuICovCi0JZm4gPSAoUHlDRnVuY3Rpb25PYmplY3QgKilvYmo7CisgICAgUHlDRnVuY3Rpb25PYmplY3QgKmZuOworICAgIGlmICghUHlDRnVuY3Rpb25fQ2hlY2sob2JqKSkgeworICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisgICAgLyogUmVwbGFjZSBidWlsdC1pbiBmdW5jdGlvbiBvYmplY3RzIHdpdGggYSBkZXNjcmlwdGl2ZSBzdHJpbmcKKyAgICAgICBiZWNhdXNlIG9mIGJ1aWx0LWluIG1ldGhvZHMgLS0ga2VlcGluZyBhIHJlZmVyZW5jZSB0bworICAgICAgIF9fc2VsZl9fIGlzIHByb2JhYmx5IG5vdCBhIGdvb2QgaWRlYS4gKi8KKyAgICBmbiA9IChQeUNGdW5jdGlvbk9iamVjdCAqKW9iajsKIAotCWlmIChmbi0+bV9zZWxmID09IE5VTEwpIHsKLQkJLyogYnVpbHQtaW4gZnVuY3Rpb246IGxvb2sgdXAgdGhlIG1vZHVsZSBuYW1lICovCi0JCVB5T2JqZWN0ICptb2QgPSBmbi0+bV9tb2R1bGU7Ci0JCWNoYXIgKm1vZG5hbWU7Ci0JCWlmIChtb2QgJiYgUHlTdHJpbmdfQ2hlY2sobW9kKSkgewotCQkJbW9kbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhtb2QpOwotCQl9Ci0JCWVsc2UgaWYgKG1vZCAmJiBQeU1vZHVsZV9DaGVjayhtb2QpKSB7Ci0JCQltb2RuYW1lID0gUHlNb2R1bGVfR2V0TmFtZShtb2QpOwotCQkJaWYgKG1vZG5hbWUgPT0gTlVMTCkgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJbW9kbmFtZSA9ICJfX2J1aWx0aW5fXyI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQltb2RuYW1lID0gIl9fYnVpbHRpbl9fIjsKLQkJfQotCQlpZiAoc3RyY21wKG1vZG5hbWUsICJfX2J1aWx0aW5fXyIpICE9IDApCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzLiVzPiIsCi0JCQkJCQkgICBtb2RuYW1lLAotCQkJCQkJICAgZm4tPm1fbWwtPm1sX25hbWUpOwotCQllbHNlCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzPiIsCi0JCQkJCQkgICBmbi0+bV9tbC0+bWxfbmFtZSk7Ci0JfQotCWVsc2UgewotCQkvKiBidWlsdC1pbiBtZXRob2Q6IHRyeSB0byByZXR1cm4KLQkJCXJlcHIoZ2V0YXR0cih0eXBlKF9fc2VsZl9fKSwgX19uYW1lX18pKQotCQkqLwotCQlQeU9iamVjdCAqc2VsZiA9IGZuLT5tX3NlbGY7Ci0JCVB5T2JqZWN0ICpuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmbi0+bV9tbC0+bWxfbmFtZSk7Ci0JCWlmIChuYW1lICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICptbyA9IF9QeVR5cGVfTG9va3VwKFB5X1RZUEUoc2VsZiksIG5hbWUpOwotCQkJUHlfWElOQ1JFRihtbyk7Ci0JCQlQeV9ERUNSRUYobmFtZSk7Ci0JCQlpZiAobW8gIT0gTlVMTCkgewotCQkJCVB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9SZXByKG1vKTsKLQkJCQlQeV9ERUNSRUYobW8pOwotCQkJCWlmIChyZXMgIT0gTlVMTCkKLQkJCQkJcmV0dXJuIHJlczsKLQkJCX0KLQkJfQotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGJ1aWx0LWluIG1ldGhvZCAlcz4iLAotCQkJCQkgICBmbi0+bV9tbC0+bWxfbmFtZSk7Ci0JfQorICAgIGlmIChmbi0+bV9zZWxmID09IE5VTEwpIHsKKyAgICAgICAgLyogYnVpbHQtaW4gZnVuY3Rpb246IGxvb2sgdXAgdGhlIG1vZHVsZSBuYW1lICovCisgICAgICAgIFB5T2JqZWN0ICptb2QgPSBmbi0+bV9tb2R1bGU7CisgICAgICAgIGNoYXIgKm1vZG5hbWU7CisgICAgICAgIGlmIChtb2QgJiYgUHlTdHJpbmdfQ2hlY2sobW9kKSkgeworICAgICAgICAgICAgbW9kbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhtb2QpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1vZCAmJiBQeU1vZHVsZV9DaGVjayhtb2QpKSB7CisgICAgICAgICAgICBtb2RuYW1lID0gUHlNb2R1bGVfR2V0TmFtZShtb2QpOworICAgICAgICAgICAgaWYgKG1vZG5hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgbW9kbmFtZSA9ICJfX2J1aWx0aW5fXyI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtb2RuYW1lID0gIl9fYnVpbHRpbl9fIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKG1vZG5hbWUsICJfX2J1aWx0aW5fXyIpICE9IDApCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzLiVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4tPm1fbWwtPm1sX25hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbi0+bV9tbC0+bWxfbmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBidWlsdC1pbiBtZXRob2Q6IHRyeSB0byByZXR1cm4KKyAgICAgICAgICAgIHJlcHIoZ2V0YXR0cih0eXBlKF9fc2VsZl9fKSwgX19uYW1lX18pKQorICAgICAgICAqLworICAgICAgICBQeU9iamVjdCAqc2VsZiA9IGZuLT5tX3NlbGY7CisgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmbi0+bV9tbC0+bWxfbmFtZSk7CisgICAgICAgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICptbyA9IF9QeVR5cGVfTG9va3VwKFB5X1RZUEUoc2VsZiksIG5hbWUpOworICAgICAgICAgICAgUHlfWElOQ1JFRihtbyk7CisgICAgICAgICAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgICAgICAgICBpZiAobW8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9SZXByKG1vKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobW8pOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGJ1aWx0LWluIG1ldGhvZCAlcz4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbi0+bV9tbC0+bWxfbmFtZSk7CisgICAgfQogfQogCiBzdGF0aWMgUHJvZmlsZXJFbnRyeSoKIG5ld1Byb2ZpbGVyRW50cnkoUHJvZmlsZXJPYmplY3QgKnBPYmosIHZvaWQgKmtleSwgUHlPYmplY3QgKnVzZXJPYmopCiB7Ci0JUHJvZmlsZXJFbnRyeSAqc2VsZjsKLQlzZWxmID0gKFByb2ZpbGVyRW50cnkqKSBtYWxsb2Moc2l6ZW9mKFByb2ZpbGVyRW50cnkpKTsKLQlpZiAoc2VsZiA9PSBOVUxMKSB7Ci0JCXBPYmotPmZsYWdzIHw9IFBPRl9OT01FTU9SWTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXVzZXJPYmogPSBub3JtYWxpemVVc2VyT2JqKHVzZXJPYmopOwotCWlmICh1c2VyT2JqID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJZnJlZShzZWxmKTsKLQkJcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZi0+aGVhZGVyLmtleSA9IGtleTsKLQlzZWxmLT51c2VyT2JqID0gdXNlck9iajsKLQlzZWxmLT50dCA9IDA7Ci0Jc2VsZi0+aXQgPSAwOwotCXNlbGYtPmNhbGxjb3VudCA9IDA7Ci0Jc2VsZi0+cmVjdXJzaXZlY2FsbGNvdW50ID0gMDsKLQlzZWxmLT5yZWN1cnNpb25MZXZlbCA9IDA7Ci0Jc2VsZi0+Y2FsbHMgPSBFTVBUWV9ST1RBVElOR19UUkVFOwotCVJvdGF0aW5nVHJlZV9BZGQoJnBPYmotPnByb2ZpbGVyRW50cmllcywgJnNlbGYtPmhlYWRlcik7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHJvZmlsZXJFbnRyeSAqc2VsZjsKKyAgICBzZWxmID0gKFByb2ZpbGVyRW50cnkqKSBtYWxsb2Moc2l6ZW9mKFByb2ZpbGVyRW50cnkpKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CisgICAgICAgIHBPYmotPmZsYWdzIHw9IFBPRl9OT01FTU9SWTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHVzZXJPYmogPSBub3JtYWxpemVVc2VyT2JqKHVzZXJPYmopOworICAgIGlmICh1c2VyT2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZnJlZShzZWxmKTsKKyAgICAgICAgcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2VsZi0+aGVhZGVyLmtleSA9IGtleTsKKyAgICBzZWxmLT51c2VyT2JqID0gdXNlck9iajsKKyAgICBzZWxmLT50dCA9IDA7CisgICAgc2VsZi0+aXQgPSAwOworICAgIHNlbGYtPmNhbGxjb3VudCA9IDA7CisgICAgc2VsZi0+cmVjdXJzaXZlY2FsbGNvdW50ID0gMDsKKyAgICBzZWxmLT5yZWN1cnNpb25MZXZlbCA9IDA7CisgICAgc2VsZi0+Y2FsbHMgPSBFTVBUWV9ST1RBVElOR19UUkVFOworICAgIFJvdGF0aW5nVHJlZV9BZGQoJnBPYmotPnByb2ZpbGVyRW50cmllcywgJnNlbGYtPmhlYWRlcik7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBQcm9maWxlckVudHJ5KgogZ2V0RW50cnkoUHJvZmlsZXJPYmplY3QgKnBPYmosIHZvaWQgKmtleSkKIHsKLQlyZXR1cm4gKFByb2ZpbGVyRW50cnkqKSBSb3RhdGluZ1RyZWVfR2V0KCZwT2JqLT5wcm9maWxlckVudHJpZXMsIGtleSk7CisgICAgcmV0dXJuIChQcm9maWxlckVudHJ5KikgUm90YXRpbmdUcmVlX0dldCgmcE9iai0+cHJvZmlsZXJFbnRyaWVzLCBrZXkpOwogfQogCi1zdGF0aWMgUHJvZmlsZXJTdWJFbnRyeSAqIAorc3RhdGljIFByb2ZpbGVyU3ViRW50cnkgKgogZ2V0U3ViRW50cnkoUHJvZmlsZXJPYmplY3QgKnBPYmosIFByb2ZpbGVyRW50cnkgKmNhbGxlciwgUHJvZmlsZXJFbnRyeSogZW50cnkpCiB7Ci0JcmV0dXJuIChQcm9maWxlclN1YkVudHJ5KikgUm90YXRpbmdUcmVlX0dldCgmY2FsbGVyLT5jYWxscywKLQkJCQkJCSAgICAodm9pZCAqKWVudHJ5KTsKKyAgICByZXR1cm4gKFByb2ZpbGVyU3ViRW50cnkqKSBSb3RhdGluZ1RyZWVfR2V0KCZjYWxsZXItPmNhbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKillbnRyeSk7CiB9CiAKIHN0YXRpYyBQcm9maWxlclN1YkVudHJ5ICoKIG5ld1N1YkVudHJ5KFByb2ZpbGVyT2JqZWN0ICpwT2JqLCAgUHJvZmlsZXJFbnRyeSAqY2FsbGVyLCBQcm9maWxlckVudHJ5KiBlbnRyeSkKIHsKLQlQcm9maWxlclN1YkVudHJ5ICpzZWxmOwotCXNlbGYgPSAoUHJvZmlsZXJTdWJFbnRyeSopIG1hbGxvYyhzaXplb2YoUHJvZmlsZXJTdWJFbnRyeSkpOwotCWlmIChzZWxmID09IE5VTEwpIHsKLQkJcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZi0+aGVhZGVyLmtleSA9ICh2b2lkICopZW50cnk7Ci0Jc2VsZi0+dHQgPSAwOwotCXNlbGYtPml0ID0gMDsKLQlzZWxmLT5jYWxsY291bnQgPSAwOwotCXNlbGYtPnJlY3Vyc2l2ZWNhbGxjb3VudCA9IDA7Ci0Jc2VsZi0+cmVjdXJzaW9uTGV2ZWwgPSAwOwotCVJvdGF0aW5nVHJlZV9BZGQoJmNhbGxlci0+Y2FsbHMsICZzZWxmLT5oZWFkZXIpOwotCXJldHVybiBzZWxmOworICAgIFByb2ZpbGVyU3ViRW50cnkgKnNlbGY7CisgICAgc2VsZiA9IChQcm9maWxlclN1YkVudHJ5KikgbWFsbG9jKHNpemVvZihQcm9maWxlclN1YkVudHJ5KSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICBwT2JqLT5mbGFncyB8PSBQT0ZfTk9NRU1PUlk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzZWxmLT5oZWFkZXIua2V5ID0gKHZvaWQgKillbnRyeTsKKyAgICBzZWxmLT50dCA9IDA7CisgICAgc2VsZi0+aXQgPSAwOworICAgIHNlbGYtPmNhbGxjb3VudCA9IDA7CisgICAgc2VsZi0+cmVjdXJzaXZlY2FsbGNvdW50ID0gMDsKKyAgICBzZWxmLT5yZWN1cnNpb25MZXZlbCA9IDA7CisgICAgUm90YXRpbmdUcmVlX0FkZCgmY2FsbGVyLT5jYWxscywgJnNlbGYtPmhlYWRlcik7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBpbnQgZnJlZVN1YkVudHJ5KHJvdGF0aW5nX25vZGVfdCAqaGVhZGVyLCB2b2lkICphcmcpCiB7Ci0JUHJvZmlsZXJTdWJFbnRyeSAqc3ViZW50cnkgPSAoUHJvZmlsZXJTdWJFbnRyeSopIGhlYWRlcjsKLQlmcmVlKHN1YmVudHJ5KTsKLQlyZXR1cm4gMDsKKyAgICBQcm9maWxlclN1YkVudHJ5ICpzdWJlbnRyeSA9IChQcm9maWxlclN1YkVudHJ5KikgaGVhZGVyOworICAgIGZyZWUoc3ViZW50cnkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGZyZWVFbnRyeShyb3RhdGluZ19ub2RlX3QgKmhlYWRlciwgdm9pZCAqYXJnKQogewotCVByb2ZpbGVyRW50cnkgKmVudHJ5ID0gKFByb2ZpbGVyRW50cnkqKSBoZWFkZXI7Ci0JUm90YXRpbmdUcmVlX0VudW0oZW50cnktPmNhbGxzLCBmcmVlU3ViRW50cnksIE5VTEwpOwotCVB5X0RFQ1JFRihlbnRyeS0+dXNlck9iaik7Ci0JZnJlZShlbnRyeSk7Ci0JcmV0dXJuIDA7CisgICAgUHJvZmlsZXJFbnRyeSAqZW50cnkgPSAoUHJvZmlsZXJFbnRyeSopIGhlYWRlcjsKKyAgICBSb3RhdGluZ1RyZWVfRW51bShlbnRyeS0+Y2FsbHMsIGZyZWVTdWJFbnRyeSwgTlVMTCk7CisgICAgUHlfREVDUkVGKGVudHJ5LT51c2VyT2JqKTsKKyAgICBmcmVlKGVudHJ5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgY2xlYXJFbnRyaWVzKFByb2ZpbGVyT2JqZWN0ICpwT2JqKQogewotCVJvdGF0aW5nVHJlZV9FbnVtKHBPYmotPnByb2ZpbGVyRW50cmllcywgZnJlZUVudHJ5LCBOVUxMKTsKLQlwT2JqLT5wcm9maWxlckVudHJpZXMgPSBFTVBUWV9ST1RBVElOR19UUkVFOwotCS8qIHJlbGVhc2UgdGhlIG1lbW9yeSBob2xkIGJ5IHRoZSBQcm9maWxlckNvbnRleHRzICovCi0JaWYgKHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQpIHsKLQkJZnJlZShwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0KTsKLQkJcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IE5VTEw7Ci0JfQotCXdoaWxlIChwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dCkgewotCQlQcm9maWxlckNvbnRleHQgKmMgPSBwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKLQkJcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBjLT5wcmV2aW91czsKLQkJZnJlZShjKTsKLQl9Ci0JcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBOVUxMOworICAgIFJvdGF0aW5nVHJlZV9FbnVtKHBPYmotPnByb2ZpbGVyRW50cmllcywgZnJlZUVudHJ5LCBOVUxMKTsKKyAgICBwT2JqLT5wcm9maWxlckVudHJpZXMgPSBFTVBUWV9ST1RBVElOR19UUkVFOworICAgIC8qIHJlbGVhc2UgdGhlIG1lbW9yeSBob2xkIGJ5IHRoZSBQcm9maWxlckNvbnRleHRzICovCisgICAgaWYgKHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQpIHsKKyAgICAgICAgZnJlZShwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0KTsKKyAgICAgICAgcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IE5VTEw7CisgICAgfQorICAgIHdoaWxlIChwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dCkgeworICAgICAgICBQcm9maWxlckNvbnRleHQgKmMgPSBwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKKyAgICAgICAgcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBjLT5wcmV2aW91czsKKyAgICAgICAgZnJlZShjKTsKKyAgICB9CisgICAgcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAogaW5pdENvbnRleHQoUHJvZmlsZXJPYmplY3QgKnBPYmosIFByb2ZpbGVyQ29udGV4dCAqc2VsZiwgUHJvZmlsZXJFbnRyeSAqZW50cnkpCiB7Ci0Jc2VsZi0+Y3R4RW50cnkgPSBlbnRyeTsKLQlzZWxmLT5zdWJ0ID0gMDsKLQlzZWxmLT5wcmV2aW91cyA9IHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQ7Ci0JcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IHNlbGY7Ci0JKytlbnRyeS0+cmVjdXJzaW9uTGV2ZWw7Ci0JaWYgKChwT2JqLT5mbGFncyAmIFBPRl9TVUJDQUxMUykgJiYgc2VsZi0+cHJldmlvdXMpIHsKLQkJLyogZmluZCBvciBjcmVhdGUgYW4gZW50cnkgZm9yIG1lIGluIG15IGNhbGxlcidzIGVudHJ5ICovCi0JCVByb2ZpbGVyRW50cnkgKmNhbGxlciA9IHNlbGYtPnByZXZpb3VzLT5jdHhFbnRyeTsKLQkJUHJvZmlsZXJTdWJFbnRyeSAqc3ViZW50cnkgPSBnZXRTdWJFbnRyeShwT2JqLCBjYWxsZXIsIGVudHJ5KTsKLQkJaWYgKHN1YmVudHJ5ID09IE5VTEwpCi0JCQlzdWJlbnRyeSA9IG5ld1N1YkVudHJ5KHBPYmosIGNhbGxlciwgZW50cnkpOwotCQlpZiAoc3ViZW50cnkpCi0JCQkrK3N1YmVudHJ5LT5yZWN1cnNpb25MZXZlbDsKLQl9Ci0Jc2VsZi0+dDAgPSBDQUxMX1RJTUVSKHBPYmopOworICAgIHNlbGYtPmN0eEVudHJ5ID0gZW50cnk7CisgICAgc2VsZi0+c3VidCA9IDA7CisgICAgc2VsZi0+cHJldmlvdXMgPSBwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0OworICAgIHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQgPSBzZWxmOworICAgICsrZW50cnktPnJlY3Vyc2lvbkxldmVsOworICAgIGlmICgocE9iai0+ZmxhZ3MgJiBQT0ZfU1VCQ0FMTFMpICYmIHNlbGYtPnByZXZpb3VzKSB7CisgICAgICAgIC8qIGZpbmQgb3IgY3JlYXRlIGFuIGVudHJ5IGZvciBtZSBpbiBteSBjYWxsZXIncyBlbnRyeSAqLworICAgICAgICBQcm9maWxlckVudHJ5ICpjYWxsZXIgPSBzZWxmLT5wcmV2aW91cy0+Y3R4RW50cnk7CisgICAgICAgIFByb2ZpbGVyU3ViRW50cnkgKnN1YmVudHJ5ID0gZ2V0U3ViRW50cnkocE9iaiwgY2FsbGVyLCBlbnRyeSk7CisgICAgICAgIGlmIChzdWJlbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgc3ViZW50cnkgPSBuZXdTdWJFbnRyeShwT2JqLCBjYWxsZXIsIGVudHJ5KTsKKyAgICAgICAgaWYgKHN1YmVudHJ5KQorICAgICAgICAgICAgKytzdWJlbnRyeS0+cmVjdXJzaW9uTGV2ZWw7CisgICAgfQorICAgIHNlbGYtPnQwID0gQ0FMTF9USU1FUihwT2JqKTsKIH0KIAogc3RhdGljIHZvaWQKIFN0b3AoUHJvZmlsZXJPYmplY3QgKnBPYmosIFByb2ZpbGVyQ29udGV4dCAqc2VsZiwgUHJvZmlsZXJFbnRyeSAqZW50cnkpCiB7Ci0JUFlfTE9OR19MT05HIHR0ID0gQ0FMTF9USU1FUihwT2JqKSAtIHNlbGYtPnQwOwotCVBZX0xPTkdfTE9ORyBpdCA9IHR0IC0gc2VsZi0+c3VidDsKLQlpZiAoc2VsZi0+cHJldmlvdXMpCi0JCXNlbGYtPnByZXZpb3VzLT5zdWJ0ICs9IHR0OwotCXBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQgPSBzZWxmLT5wcmV2aW91czsKLQlpZiAoLS1lbnRyeS0+cmVjdXJzaW9uTGV2ZWwgPT0gMCkKLQkJZW50cnktPnR0ICs9IHR0OwotCWVsc2UKLQkJKytlbnRyeS0+cmVjdXJzaXZlY2FsbGNvdW50OwotCWVudHJ5LT5pdCArPSBpdDsKLQllbnRyeS0+Y2FsbGNvdW50Kys7Ci0JaWYgKChwT2JqLT5mbGFncyAmIFBPRl9TVUJDQUxMUykgJiYgc2VsZi0+cHJldmlvdXMpIHsKLQkJLyogZmluZCBvciBjcmVhdGUgYW4gZW50cnkgZm9yIG1lIGluIG15IGNhbGxlcidzIGVudHJ5ICovCi0JCVByb2ZpbGVyRW50cnkgKmNhbGxlciA9IHNlbGYtPnByZXZpb3VzLT5jdHhFbnRyeTsKLQkJUHJvZmlsZXJTdWJFbnRyeSAqc3ViZW50cnkgPSBnZXRTdWJFbnRyeShwT2JqLCBjYWxsZXIsIGVudHJ5KTsKLQkJaWYgKHN1YmVudHJ5KSB7Ci0JCQlpZiAoLS1zdWJlbnRyeS0+cmVjdXJzaW9uTGV2ZWwgPT0gMCkKLQkJCQlzdWJlbnRyeS0+dHQgKz0gdHQ7Ci0JCQllbHNlCi0JCQkJKytzdWJlbnRyeS0+cmVjdXJzaXZlY2FsbGNvdW50OwotCQkJc3ViZW50cnktPml0ICs9IGl0OwotCQkJKytzdWJlbnRyeS0+Y2FsbGNvdW50OwotCQl9Ci0JfQorICAgIFBZX0xPTkdfTE9ORyB0dCA9IENBTExfVElNRVIocE9iaikgLSBzZWxmLT50MDsKKyAgICBQWV9MT05HX0xPTkcgaXQgPSB0dCAtIHNlbGYtPnN1YnQ7CisgICAgaWYgKHNlbGYtPnByZXZpb3VzKQorICAgICAgICBzZWxmLT5wcmV2aW91cy0+c3VidCArPSB0dDsKKyAgICBwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0ID0gc2VsZi0+cHJldmlvdXM7CisgICAgaWYgKC0tZW50cnktPnJlY3Vyc2lvbkxldmVsID09IDApCisgICAgICAgIGVudHJ5LT50dCArPSB0dDsKKyAgICBlbHNlCisgICAgICAgICsrZW50cnktPnJlY3Vyc2l2ZWNhbGxjb3VudDsKKyAgICBlbnRyeS0+aXQgKz0gaXQ7CisgICAgZW50cnktPmNhbGxjb3VudCsrOworICAgIGlmICgocE9iai0+ZmxhZ3MgJiBQT0ZfU1VCQ0FMTFMpICYmIHNlbGYtPnByZXZpb3VzKSB7CisgICAgICAgIC8qIGZpbmQgb3IgY3JlYXRlIGFuIGVudHJ5IGZvciBtZSBpbiBteSBjYWxsZXIncyBlbnRyeSAqLworICAgICAgICBQcm9maWxlckVudHJ5ICpjYWxsZXIgPSBzZWxmLT5wcmV2aW91cy0+Y3R4RW50cnk7CisgICAgICAgIFByb2ZpbGVyU3ViRW50cnkgKnN1YmVudHJ5ID0gZ2V0U3ViRW50cnkocE9iaiwgY2FsbGVyLCBlbnRyeSk7CisgICAgICAgIGlmIChzdWJlbnRyeSkgeworICAgICAgICAgICAgaWYgKC0tc3ViZW50cnktPnJlY3Vyc2lvbkxldmVsID09IDApCisgICAgICAgICAgICAgICAgc3ViZW50cnktPnR0ICs9IHR0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICsrc3ViZW50cnktPnJlY3Vyc2l2ZWNhbGxjb3VudDsKKyAgICAgICAgICAgIHN1YmVudHJ5LT5pdCArPSBpdDsKKyAgICAgICAgICAgICsrc3ViZW50cnktPmNhbGxjb3VudDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHB0cmFjZV9lbnRlcl9jYWxsKFB5T2JqZWN0ICpzZWxmLCB2b2lkICprZXksIFB5T2JqZWN0ICp1c2VyT2JqKQogewotCS8qIGVudGVyaW5nIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gaWRlbnRpZmllZCBieSAna2V5JwotCSAgICh3aGljaCBjYW4gYmUgYSBQeUNvZGVPYmplY3Qgb3IgYSBQeU1ldGhvZERlZiBwb2ludGVyKSAqLwotCVByb2ZpbGVyT2JqZWN0ICpwT2JqID0gKFByb2ZpbGVyT2JqZWN0KilzZWxmOwotCVByb2ZpbGVyRW50cnkgKnByb2ZFbnRyeTsKLQlQcm9maWxlckNvbnRleHQgKnBDb250ZXh0OworICAgIC8qIGVudGVyaW5nIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gaWRlbnRpZmllZCBieSAna2V5JworICAgICAgICh3aGljaCBjYW4gYmUgYSBQeUNvZGVPYmplY3Qgb3IgYSBQeU1ldGhvZERlZiBwb2ludGVyKSAqLworICAgIFByb2ZpbGVyT2JqZWN0ICpwT2JqID0gKFByb2ZpbGVyT2JqZWN0KilzZWxmOworICAgIFByb2ZpbGVyRW50cnkgKnByb2ZFbnRyeTsKKyAgICBQcm9maWxlckNvbnRleHQgKnBDb250ZXh0OwogCi0JLyogSW4gdGhlIGNhc2Ugb2YgZW50ZXJpbmcgYSBnZW5lcmF0b3IgZXhwcmVzc2lvbiBmcmFtZSB2aWEgYQotCSAqIHRocm93IChnZW5fc2VuZF9leCguLiwgMSkpLCB3ZSBtYXkgYWxyZWFkeSBoYXZlIGFuCi0JICogRXhjZXB0aW9uIHNldCBoZXJlLiBXZSBtdXN0IG5vdCBtZXNzIGFyb3VuZCB3aXRoIHRoaXMKLQkgKiBleGNlcHRpb24sIGFuZCBzb21lIG9mIHRoZSBjb2RlIHVuZGVyIGhlcmUgYXNzdW1lcyB0aGF0Ci0JICogUHlFcnJfKiBpcyBpdHMgb3duIHRvIG1lc3MgYXJvdW5kIHdpdGgsIHNvIHdlIGhhdmUgdG8KLQkgKiBzYXZlIGFuZCByZXN0b3JlIGFueSBjdXJyZW50IGV4Y2VwdGlvbi4gKi8KLQlQeU9iamVjdCAqbGFzdF90eXBlLCAqbGFzdF92YWx1ZSwgKmxhc3RfdGI7Ci0JUHlFcnJfRmV0Y2goJmxhc3RfdHlwZSwgJmxhc3RfdmFsdWUsICZsYXN0X3RiKTsKKyAgICAvKiBJbiB0aGUgY2FzZSBvZiBlbnRlcmluZyBhIGdlbmVyYXRvciBleHByZXNzaW9uIGZyYW1lIHZpYSBhCisgICAgICogdGhyb3cgKGdlbl9zZW5kX2V4KC4uLCAxKSksIHdlIG1heSBhbHJlYWR5IGhhdmUgYW4KKyAgICAgKiBFeGNlcHRpb24gc2V0IGhlcmUuIFdlIG11c3Qgbm90IG1lc3MgYXJvdW5kIHdpdGggdGhpcworICAgICAqIGV4Y2VwdGlvbiwgYW5kIHNvbWUgb2YgdGhlIGNvZGUgdW5kZXIgaGVyZSBhc3N1bWVzIHRoYXQKKyAgICAgKiBQeUVycl8qIGlzIGl0cyBvd24gdG8gbWVzcyBhcm91bmQgd2l0aCwgc28gd2UgaGF2ZSB0bworICAgICAqIHNhdmUgYW5kIHJlc3RvcmUgYW55IGN1cnJlbnQgZXhjZXB0aW9uLiAqLworICAgIFB5T2JqZWN0ICpsYXN0X3R5cGUsICpsYXN0X3ZhbHVlLCAqbGFzdF90YjsKKyAgICBQeUVycl9GZXRjaCgmbGFzdF90eXBlLCAmbGFzdF92YWx1ZSwgJmxhc3RfdGIpOwogCi0JcHJvZkVudHJ5ID0gZ2V0RW50cnkocE9iaiwga2V5KTsKLQlpZiAocHJvZkVudHJ5ID09IE5VTEwpIHsKLQkJcHJvZkVudHJ5ID0gbmV3UHJvZmlsZXJFbnRyeShwT2JqLCBrZXksIHVzZXJPYmopOwotCQlpZiAocHJvZkVudHJ5ID09IE5VTEwpCi0JCQlnb3RvIHJlc3RvcmVQeWVycjsKLQl9Ci0JLyogZ3JhYiBhIFByb2ZpbGVyQ29udGV4dCBvdXQgb2YgdGhlIGZyZWUgbGlzdCAqLwotCXBDb250ZXh0ID0gcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQ7Ci0JaWYgKHBDb250ZXh0KSB7Ci0JCXBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQtPnByZXZpb3VzOwotCX0KLQllbHNlIHsKLQkJLyogZnJlZSBsaXN0IGV4aGF1c3RlZCwgYWxsb2NhdGUgYSBuZXcgb25lICovCi0JCXBDb250ZXh0ID0gKFByb2ZpbGVyQ29udGV4dCopCi0JCQltYWxsb2Moc2l6ZW9mKFByb2ZpbGVyQ29udGV4dCkpOwotCQlpZiAocENvbnRleHQgPT0gTlVMTCkgewotCQkJcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOwotCQkJZ290byByZXN0b3JlUHllcnI7Ci0JCX0KLQl9Ci0JaW5pdENvbnRleHQocE9iaiwgcENvbnRleHQsIHByb2ZFbnRyeSk7CisgICAgcHJvZkVudHJ5ID0gZ2V0RW50cnkocE9iaiwga2V5KTsKKyAgICBpZiAocHJvZkVudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgcHJvZkVudHJ5ID0gbmV3UHJvZmlsZXJFbnRyeShwT2JqLCBrZXksIHVzZXJPYmopOworICAgICAgICBpZiAocHJvZkVudHJ5ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIHJlc3RvcmVQeWVycjsKKyAgICB9CisgICAgLyogZ3JhYiBhIFByb2ZpbGVyQ29udGV4dCBvdXQgb2YgdGhlIGZyZWUgbGlzdCAqLworICAgIHBDb250ZXh0ID0gcE9iai0+ZnJlZWxpc3RQcm9maWxlckNvbnRleHQ7CisgICAgaWYgKHBDb250ZXh0KSB7CisgICAgICAgIHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQtPnByZXZpb3VzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogZnJlZSBsaXN0IGV4aGF1c3RlZCwgYWxsb2NhdGUgYSBuZXcgb25lICovCisgICAgICAgIHBDb250ZXh0ID0gKFByb2ZpbGVyQ29udGV4dCopCisgICAgICAgICAgICBtYWxsb2Moc2l6ZW9mKFByb2ZpbGVyQ29udGV4dCkpOworICAgICAgICBpZiAocENvbnRleHQgPT0gTlVMTCkgeworICAgICAgICAgICAgcE9iai0+ZmxhZ3MgfD0gUE9GX05PTUVNT1JZOworICAgICAgICAgICAgZ290byByZXN0b3JlUHllcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgaW5pdENvbnRleHQocE9iaiwgcENvbnRleHQsIHByb2ZFbnRyeSk7CiAKIHJlc3RvcmVQeWVycjoKLQlQeUVycl9SZXN0b3JlKGxhc3RfdHlwZSwgbGFzdF92YWx1ZSwgbGFzdF90Yik7CisgICAgUHlFcnJfUmVzdG9yZShsYXN0X3R5cGUsIGxhc3RfdmFsdWUsIGxhc3RfdGIpOwogfQogCiBzdGF0aWMgdm9pZAogcHRyYWNlX2xlYXZlX2NhbGwoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmtleSkKIHsKLQkvKiBsZWF2aW5nIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gaWRlbnRpZmllZCBieSAna2V5JyAqLwotCVByb2ZpbGVyT2JqZWN0ICpwT2JqID0gKFByb2ZpbGVyT2JqZWN0KilzZWxmOwotCVByb2ZpbGVyRW50cnkgKnByb2ZFbnRyeTsKLQlQcm9maWxlckNvbnRleHQgKnBDb250ZXh0OworICAgIC8qIGxlYXZpbmcgYSBjYWxsIHRvIHRoZSBmdW5jdGlvbiBpZGVudGlmaWVkIGJ5ICdrZXknICovCisgICAgUHJvZmlsZXJPYmplY3QgKnBPYmogPSAoUHJvZmlsZXJPYmplY3QqKXNlbGY7CisgICAgUHJvZmlsZXJFbnRyeSAqcHJvZkVudHJ5OworICAgIFByb2ZpbGVyQ29udGV4dCAqcENvbnRleHQ7CiAKLQlwQ29udGV4dCA9IHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQ7Ci0JaWYgKHBDb250ZXh0ID09IE5VTEwpCi0JCXJldHVybjsKLQlwcm9mRW50cnkgPSBnZXRFbnRyeShwT2JqLCBrZXkpOwotCWlmIChwcm9mRW50cnkpIHsKLQkJU3RvcChwT2JqLCBwQ29udGV4dCwgcHJvZkVudHJ5KTsKLQl9Ci0JZWxzZSB7Ci0JCXBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQgPSBwQ29udGV4dC0+cHJldmlvdXM7Ci0JfQotCS8qIHB1dCBwQ29udGV4dCBpbnRvIHRoZSBmcmVlIGxpc3QgKi8KLQlwQ29udGV4dC0+cHJldmlvdXMgPSBwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dDsKLQlwT2JqLT5mcmVlbGlzdFByb2ZpbGVyQ29udGV4dCA9IHBDb250ZXh0OworICAgIHBDb250ZXh0ID0gcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dDsKKyAgICBpZiAocENvbnRleHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIHByb2ZFbnRyeSA9IGdldEVudHJ5KHBPYmosIGtleSk7CisgICAgaWYgKHByb2ZFbnRyeSkgeworICAgICAgICBTdG9wKHBPYmosIHBDb250ZXh0LCBwcm9mRW50cnkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IHBDb250ZXh0LT5wcmV2aW91czsKKyAgICB9CisgICAgLyogcHV0IHBDb250ZXh0IGludG8gdGhlIGZyZWUgbGlzdCAqLworICAgIHBDb250ZXh0LT5wcmV2aW91cyA9IHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0OworICAgIHBPYmotPmZyZWVsaXN0UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQ7CiB9CiAKIHN0YXRpYyBpbnQKIHByb2ZpbGVyX2NhbGxiYWNrKFB5T2JqZWN0ICpzZWxmLCBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50IHdoYXQsCi0JCSAgUHlPYmplY3QgKmFyZykKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmcpCiB7Ci0Jc3dpdGNoICh3aGF0KSB7CisgICAgc3dpdGNoICh3aGF0KSB7CiAKLQkvKiB0aGUgJ2ZyYW1lJyBvZiBhIGNhbGxlZCBmdW5jdGlvbiBpcyBhYm91dCB0byBzdGFydCBpdHMgZXhlY3V0aW9uICovCi0JY2FzZSBQeVRyYWNlX0NBTEw6Ci0JCXB0cmFjZV9lbnRlcl9jYWxsKHNlbGYsICh2b2lkICopZnJhbWUtPmZfY29kZSwKLQkJCQkgICAgICAgIChQeU9iamVjdCAqKWZyYW1lLT5mX2NvZGUpOwotCQlicmVhazsKKyAgICAvKiB0aGUgJ2ZyYW1lJyBvZiBhIGNhbGxlZCBmdW5jdGlvbiBpcyBhYm91dCB0byBzdGFydCBpdHMgZXhlY3V0aW9uICovCisgICAgY2FzZSBQeVRyYWNlX0NBTEw6CisgICAgICAgIHB0cmFjZV9lbnRlcl9jYWxsKHNlbGYsICh2b2lkICopZnJhbWUtPmZfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopZnJhbWUtPmZfY29kZSk7CisgICAgICAgIGJyZWFrOwogCi0JLyogdGhlICdmcmFtZScgb2YgYSBjYWxsZWQgZnVuY3Rpb24gaXMgYWJvdXQgdG8gZmluaXNoCi0JICAgKGVpdGhlciBub3JtYWxseSBvciB3aXRoIGFuIGV4Y2VwdGlvbikgKi8KLQljYXNlIFB5VHJhY2VfUkVUVVJOOgotCQlwdHJhY2VfbGVhdmVfY2FsbChzZWxmLCAodm9pZCAqKWZyYW1lLT5mX2NvZGUpOwotCQlicmVhazsKKyAgICAvKiB0aGUgJ2ZyYW1lJyBvZiBhIGNhbGxlZCBmdW5jdGlvbiBpcyBhYm91dCB0byBmaW5pc2gKKyAgICAgICAoZWl0aGVyIG5vcm1hbGx5IG9yIHdpdGggYW4gZXhjZXB0aW9uKSAqLworICAgIGNhc2UgUHlUcmFjZV9SRVRVUk46CisgICAgICAgIHB0cmFjZV9sZWF2ZV9jYWxsKHNlbGYsICh2b2lkICopZnJhbWUtPmZfY29kZSk7CisgICAgICAgIGJyZWFrOwogCi0JLyogY2FzZSBQeVRyYWNlX0VYQ0VQVElPTjoKLQkJSWYgdGhlIGV4Y2VwdGlvbiByZXN1bHRzIGluIHRoZSBmdW5jdGlvbiBleGl0aW5nLCBhCi0JCVB5VHJhY2VfUkVUVVJOIGV2ZW50IHdpbGwgYmUgZ2VuZXJhdGVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0JCWhhbmRsZSBpdC4gKi8KKyAgICAvKiBjYXNlIFB5VHJhY2VfRVhDRVBUSU9OOgorICAgICAgICBJZiB0aGUgZXhjZXB0aW9uIHJlc3VsdHMgaW4gdGhlIGZ1bmN0aW9uIGV4aXRpbmcsIGEKKyAgICAgICAgUHlUcmFjZV9SRVRVUk4gZXZlbnQgd2lsbCBiZSBnZW5lcmF0ZWQsIHNvIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgaGFuZGxlIGl0LiAqLwogCi0jaWZkZWYgUHlUcmFjZV9DX0NBTEwJLyogbm90IGRlZmluZWQgaW4gUHl0aG9uIDw9IDIuMyAqLwotCS8qIHRoZSBQeXRob24gZnVuY3Rpb24gJ2ZyYW1lJyBpcyBpc3N1aW5nIGEgY2FsbCB0byB0aGUgYnVpbHQtaW4KLQkgICBmdW5jdGlvbiAnYXJnJyAqLwotCWNhc2UgUHlUcmFjZV9DX0NBTEw6Ci0JCWlmICgoKChQcm9maWxlck9iamVjdCAqKXNlbGYpLT5mbGFncyAmIFBPRl9CVUlMVElOUykKLQkJICAgICYmIFB5Q0Z1bmN0aW9uX0NoZWNrKGFyZykpIHsKLQkJCXB0cmFjZV9lbnRlcl9jYWxsKHNlbGYsCi0JCQkJCSAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWFyZyktPm1fbWwsCi0JCQkJCSAgYXJnKTsKLQkJfQotCQlicmVhazsKKyNpZmRlZiBQeVRyYWNlX0NfQ0FMTCAgIC8qIG5vdCBkZWZpbmVkIGluIFB5dGhvbiA8PSAyLjMgKi8KKyAgICAvKiB0aGUgUHl0aG9uIGZ1bmN0aW9uICdmcmFtZScgaXMgaXNzdWluZyBhIGNhbGwgdG8gdGhlIGJ1aWx0LWluCisgICAgICAgZnVuY3Rpb24gJ2FyZycgKi8KKyAgICBjYXNlIFB5VHJhY2VfQ19DQUxMOgorICAgICAgICBpZiAoKCgoUHJvZmlsZXJPYmplY3QgKilzZWxmKS0+ZmxhZ3MgJiBQT0ZfQlVJTFRJTlMpCisgICAgICAgICAgICAmJiBQeUNGdW5jdGlvbl9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICBwdHJhY2VfZW50ZXJfY2FsbChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWFyZyktPm1fbWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0JLyogdGhlIGNhbGwgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICdhcmcnIGlzIHJldHVybmluZyBpbnRvIGl0cwotCSAgIGNhbGxlciAnZnJhbWUnICovCi0JY2FzZSBQeVRyYWNlX0NfUkVUVVJOOgkJLyogLi4ubm9ybWFsbHkgKi8KLQljYXNlIFB5VHJhY2VfQ19FWENFUFRJT046CS8qIC4uLndpdGggYW4gZXhjZXB0aW9uIHNldCAqLwotCQlpZiAoKCgoUHJvZmlsZXJPYmplY3QgKilzZWxmKS0+ZmxhZ3MgJiBQT0ZfQlVJTFRJTlMpCi0JCSAgICAmJiBQeUNGdW5jdGlvbl9DaGVjayhhcmcpKSB7Ci0JCQlwdHJhY2VfbGVhdmVfY2FsbChzZWxmLAotCQkJCQkgICgoUHlDRnVuY3Rpb25PYmplY3QgKilhcmcpLT5tX21sKTsKLQkJfQotCQlicmVhazsKKyAgICAvKiB0aGUgY2FsbCB0byB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gJ2FyZycgaXMgcmV0dXJuaW5nIGludG8gaXRzCisgICAgICAgY2FsbGVyICdmcmFtZScgKi8KKyAgICBjYXNlIFB5VHJhY2VfQ19SRVRVUk46ICAgICAgICAgICAgICAvKiAuLi5ub3JtYWxseSAqLworICAgIGNhc2UgUHlUcmFjZV9DX0VYQ0VQVElPTjogICAgICAgICAgIC8qIC4uLndpdGggYW4gZXhjZXB0aW9uIHNldCAqLworICAgICAgICBpZiAoKCgoUHJvZmlsZXJPYmplY3QgKilzZWxmKS0+ZmxhZ3MgJiBQT0ZfQlVJTFRJTlMpCisgICAgICAgICAgICAmJiBQeUNGdW5jdGlvbl9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICBwdHJhY2VfbGVhdmVfY2FsbChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWFyZyktPm1fbWwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogI2VuZGlmCiAKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBwZW5kaW5nX2V4Y2VwdGlvbihQcm9maWxlck9iamVjdCAqcE9iaikKIHsKLQlpZiAocE9iai0+ZmxhZ3MgJiBQT0ZfTk9NRU1PUlkpIHsKLQkJcE9iai0+ZmxhZ3MgLT0gUE9GX05PTUVNT1JZOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0JCQkJIm1lbW9yeSB3YXMgZXhoYXVzdGVkIHdoaWxlIHByb2ZpbGluZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmIChwT2JqLT5mbGFncyAmIFBPRl9OT01FTU9SWSkgeworICAgICAgICBwT2JqLT5mbGFncyAtPSBQT0ZfTk9NRU1PUlk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtZW1vcnkgd2FzIGV4aGF1c3RlZCB3aGlsZSBwcm9maWxpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgcHJvZmlsZXJfZW50cnlfZmllbGRzW10gPSB7Ci0JeyJjb2RlIiwgICAgICAgICAiY29kZSBvYmplY3Qgb3IgYnVpbHQtaW4gZnVuY3Rpb24gbmFtZSJ9LAotCXsiY2FsbGNvdW50IiwgICAgImhvdyBtYW55IHRpbWVzIHRoaXMgd2FzIGNhbGxlZCJ9LAotCXsicmVjY2FsbGNvdW50IiwgImhvdyBtYW55IHRpbWVzIGNhbGxlZCByZWN1cnNpdmVseSJ9LAotCXsidG90YWx0aW1lIiwgICAgInRvdGFsIHRpbWUgaW4gdGhpcyBlbnRyeSJ9LAotCXsiaW5saW5ldGltZSIsICAgImlubGluZSB0aW1lIGluIHRoaXMgZW50cnkgKG5vdCBpbiBzdWJjYWxscykifSwKLQl7ImNhbGxzIiwgICAgICAgICJkZXRhaWxzIG9mIHRoZSBjYWxscyJ9LAotCXswfQorICAgIHsiY29kZSIsICAgICAgICAgImNvZGUgb2JqZWN0IG9yIGJ1aWx0LWluIGZ1bmN0aW9uIG5hbWUifSwKKyAgICB7ImNhbGxjb3VudCIsICAgICJob3cgbWFueSB0aW1lcyB0aGlzIHdhcyBjYWxsZWQifSwKKyAgICB7InJlY2NhbGxjb3VudCIsICJob3cgbWFueSB0aW1lcyBjYWxsZWQgcmVjdXJzaXZlbHkifSwKKyAgICB7InRvdGFsdGltZSIsICAgICJ0b3RhbCB0aW1lIGluIHRoaXMgZW50cnkifSwKKyAgICB7ImlubGluZXRpbWUiLCAgICJpbmxpbmUgdGltZSBpbiB0aGlzIGVudHJ5IChub3QgaW4gc3ViY2FsbHMpIn0sCisgICAgeyJjYWxscyIsICAgICAgICAiZGV0YWlscyBvZiB0aGUgY2FsbHMifSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkIHByb2ZpbGVyX3N1YmVudHJ5X2ZpZWxkc1tdID0gewotCXsiY29kZSIsICAgICAgICAgImNhbGxlZCBjb2RlIG9iamVjdCBvciBidWlsdC1pbiBmdW5jdGlvbiBuYW1lIn0sCi0JeyJjYWxsY291bnQiLCAgICAiaG93IG1hbnkgdGltZXMgdGhpcyBpcyBjYWxsZWQifSwKLQl7InJlY2NhbGxjb3VudCIsICJob3cgbWFueSB0aW1lcyB0aGlzIGlzIGNhbGxlZCByZWN1cnNpdmVseSJ9LAotCXsidG90YWx0aW1lIiwgICAgInRvdGFsIHRpbWUgc3BlbnQgaW4gdGhpcyBjYWxsIn0sCi0JeyJpbmxpbmV0aW1lIiwgICAiaW5saW5lIHRpbWUgKG5vdCBpbiBmdXJ0aGVyIHN1YmNhbGxzKSJ9LAotCXswfQorICAgIHsiY29kZSIsICAgICAgICAgImNhbGxlZCBjb2RlIG9iamVjdCBvciBidWlsdC1pbiBmdW5jdGlvbiBuYW1lIn0sCisgICAgeyJjYWxsY291bnQiLCAgICAiaG93IG1hbnkgdGltZXMgdGhpcyBpcyBjYWxsZWQifSwKKyAgICB7InJlY2NhbGxjb3VudCIsICJob3cgbWFueSB0aW1lcyB0aGlzIGlzIGNhbGxlZCByZWN1cnNpdmVseSJ9LAorICAgIHsidG90YWx0aW1lIiwgICAgInRvdGFsIHRpbWUgc3BlbnQgaW4gdGhpcyBjYWxsIn0sCisgICAgeyJpbmxpbmV0aW1lIiwgICAiaW5saW5lIHRpbWUgKG5vdCBpbiBmdXJ0aGVyIHN1YmNhbGxzKSJ9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBwcm9maWxlcl9lbnRyeV9kZXNjID0gewotCSJfbHNwcm9mLnByb2ZpbGVyX2VudHJ5IiwgLyogbmFtZSAqLwotCU5VTEwsIC8qIGRvYyAqLwotCXByb2ZpbGVyX2VudHJ5X2ZpZWxkcywKLQk2CisgICAgIl9sc3Byb2YucHJvZmlsZXJfZW50cnkiLCAvKiBuYW1lICovCisgICAgTlVMTCwgLyogZG9jICovCisgICAgcHJvZmlsZXJfZW50cnlfZmllbGRzLAorICAgIDYKIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2MgcHJvZmlsZXJfc3ViZW50cnlfZGVzYyA9IHsKLQkiX2xzcHJvZi5wcm9maWxlcl9zdWJlbnRyeSIsIC8qIG5hbWUgKi8KLQlOVUxMLCAvKiBkb2MgKi8KLQlwcm9maWxlcl9zdWJlbnRyeV9maWVsZHMsCi0JNQorICAgICJfbHNwcm9mLnByb2ZpbGVyX3N1YmVudHJ5IiwgLyogbmFtZSAqLworICAgIE5VTEwsIC8qIGRvYyAqLworICAgIHByb2ZpbGVyX3N1YmVudHJ5X2ZpZWxkcywKKyAgICA1CiB9OwogCiBzdGF0aWMgaW50IGluaXRpYWxpemVkOwpAQCAtNTM4LDcwICs1MzgsNzAgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3QgKmxpc3Q7Ci0JUHlPYmplY3QgKnN1Ymxpc3Q7Ci0JZG91YmxlIGZhY3RvcjsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBQeU9iamVjdCAqc3VibGlzdDsKKyAgICBkb3VibGUgZmFjdG9yOwogfSBzdGF0c2NvbGxlY3Rvcl90OwogCiBzdGF0aWMgaW50IHN0YXRzRm9yU3ViRW50cnkocm90YXRpbmdfbm9kZV90ICpub2RlLCB2b2lkICphcmcpCiB7Ci0JUHJvZmlsZXJTdWJFbnRyeSAqc2VudHJ5ID0gKFByb2ZpbGVyU3ViRW50cnkqKSBub2RlOwotCXN0YXRzY29sbGVjdG9yX3QgKmNvbGxlY3QgPSAoc3RhdHNjb2xsZWN0b3JfdCopIGFyZzsKLQlQcm9maWxlckVudHJ5ICplbnRyeSA9IChQcm9maWxlckVudHJ5Kikgc2VudHJ5LT5oZWFkZXIua2V5OwotCWludCBlcnI7Ci0JUHlPYmplY3QgKnNpbmZvOwotCXNpbmZvID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopICZTdGF0c1N1YkVudHJ5VHlwZSwKLQkJCQkgICAgICAiKChPbGxkZCkpIiwKLQkJCQkgICAgICBlbnRyeS0+dXNlck9iaiwKLQkJCQkgICAgICBzZW50cnktPmNhbGxjb3VudCwKLQkJCQkgICAgICBzZW50cnktPnJlY3Vyc2l2ZWNhbGxjb3VudCwKLQkJCQkgICAgICBjb2xsZWN0LT5mYWN0b3IgKiBzZW50cnktPnR0LAotCQkJCSAgICAgIGNvbGxlY3QtPmZhY3RvciAqIHNlbnRyeS0+aXQpOwotCWlmIChzaW5mbyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZXJyID0gUHlMaXN0X0FwcGVuZChjb2xsZWN0LT5zdWJsaXN0LCBzaW5mbyk7Ci0JUHlfREVDUkVGKHNpbmZvKTsKLQlyZXR1cm4gZXJyOworICAgIFByb2ZpbGVyU3ViRW50cnkgKnNlbnRyeSA9IChQcm9maWxlclN1YkVudHJ5Kikgbm9kZTsKKyAgICBzdGF0c2NvbGxlY3Rvcl90ICpjb2xsZWN0ID0gKHN0YXRzY29sbGVjdG9yX3QqKSBhcmc7CisgICAgUHJvZmlsZXJFbnRyeSAqZW50cnkgPSAoUHJvZmlsZXJFbnRyeSopIHNlbnRyeS0+aGVhZGVyLmtleTsKKyAgICBpbnQgZXJyOworICAgIFB5T2JqZWN0ICpzaW5mbzsKKyAgICBzaW5mbyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSAmU3RhdHNTdWJFbnRyeVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigoT2xsZGQpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnVzZXJPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudHJ5LT5jYWxsY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudHJ5LT5yZWN1cnNpdmVjYWxsY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdC0+ZmFjdG9yICogc2VudHJ5LT50dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0LT5mYWN0b3IgKiBzZW50cnktPml0KTsKKyAgICBpZiAoc2luZm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVyciA9IFB5TGlzdF9BcHBlbmQoY29sbGVjdC0+c3VibGlzdCwgc2luZm8pOworICAgIFB5X0RFQ1JFRihzaW5mbyk7CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBzdGF0c0ZvckVudHJ5KHJvdGF0aW5nX25vZGVfdCAqbm9kZSwgdm9pZCAqYXJnKQogewotCVByb2ZpbGVyRW50cnkgKmVudHJ5ID0gKFByb2ZpbGVyRW50cnkqKSBub2RlOwotCXN0YXRzY29sbGVjdG9yX3QgKmNvbGxlY3QgPSAoc3RhdHNjb2xsZWN0b3JfdCopIGFyZzsKLQlQeU9iamVjdCAqaW5mbzsKLQlpbnQgZXJyOwotCWlmIChlbnRyeS0+Y2FsbGNvdW50ID09IDApCi0JCXJldHVybiAwOyAgIC8qIHNraXAgKi8KKyAgICBQcm9maWxlckVudHJ5ICplbnRyeSA9IChQcm9maWxlckVudHJ5Kikgbm9kZTsKKyAgICBzdGF0c2NvbGxlY3Rvcl90ICpjb2xsZWN0ID0gKHN0YXRzY29sbGVjdG9yX3QqKSBhcmc7CisgICAgUHlPYmplY3QgKmluZm87CisgICAgaW50IGVycjsKKyAgICBpZiAoZW50cnktPmNhbGxjb3VudCA9PSAwKQorICAgICAgICByZXR1cm4gMDsgICAvKiBza2lwICovCiAKLQlpZiAoZW50cnktPmNhbGxzICE9IEVNUFRZX1JPVEFUSU5HX1RSRUUpIHsKLQkJY29sbGVjdC0+c3VibGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChjb2xsZWN0LT5zdWJsaXN0ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChSb3RhdGluZ1RyZWVfRW51bShlbnRyeS0+Y2FsbHMsCi0JCQkJICAgICAgc3RhdHNGb3JTdWJFbnRyeSwgY29sbGVjdCkgIT0gMCkgewotCQkJUHlfREVDUkVGKGNvbGxlY3QtPnN1Ymxpc3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCWNvbGxlY3QtPnN1Ymxpc3QgPSBQeV9Ob25lOwotCX0KKyAgICBpZiAoZW50cnktPmNhbGxzICE9IEVNUFRZX1JPVEFUSU5HX1RSRUUpIHsKKyAgICAgICAgY29sbGVjdC0+c3VibGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmIChjb2xsZWN0LT5zdWJsaXN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChSb3RhdGluZ1RyZWVfRW51bShlbnRyeS0+Y2FsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0c0ZvclN1YkVudHJ5LCBjb2xsZWN0KSAhPSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoY29sbGVjdC0+c3VibGlzdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgY29sbGVjdC0+c3VibGlzdCA9IFB5X05vbmU7CisgICAgfQogCi0JaW5mbyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSAmU3RhdHNFbnRyeVR5cGUsCi0JCQkJICAgICAiKChPbGxkZE8pKSIsCi0JCQkJICAgICBlbnRyeS0+dXNlck9iaiwKLQkJCQkgICAgIGVudHJ5LT5jYWxsY291bnQsCi0JCQkJICAgICBlbnRyeS0+cmVjdXJzaXZlY2FsbGNvdW50LAotCQkJCSAgICAgY29sbGVjdC0+ZmFjdG9yICogZW50cnktPnR0LAotCQkJCSAgICAgY29sbGVjdC0+ZmFjdG9yICogZW50cnktPml0LAotCQkJCSAgICAgY29sbGVjdC0+c3VibGlzdCk7Ci0JUHlfREVDUkVGKGNvbGxlY3QtPnN1Ymxpc3QpOwotCWlmIChpbmZvID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQllcnIgPSBQeUxpc3RfQXBwZW5kKGNvbGxlY3QtPmxpc3QsIGluZm8pOwotCVB5X0RFQ1JFRihpbmZvKTsKLQlyZXR1cm4gZXJyOworICAgIGluZm8gPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0KikgJlN0YXRzRW50cnlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigoT2xsZGRPKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnVzZXJPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+Y2FsbGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnJlY3Vyc2l2ZWNhbGxjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QtPmZhY3RvciAqIGVudHJ5LT50dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QtPmZhY3RvciAqIGVudHJ5LT5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QtPnN1Ymxpc3QpOworICAgIFB5X0RFQ1JFRihjb2xsZWN0LT5zdWJsaXN0KTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZXJyID0gUHlMaXN0X0FwcGVuZChjb2xsZWN0LT5saXN0LCBpbmZvKTsKKyAgICBQeV9ERUNSRUYoaW5mbyk7CisgICAgcmV0dXJuIGVycjsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHN0YXRzX2RvYywgIlwKQEAgLTYzMSw1MSArNjMxLDUxIEBACiBzdGF0aWMgUHlPYmplY3QqCiBwcm9maWxlcl9nZXRzdGF0cyhQcm9maWxlck9iamVjdCAqcE9iaiwgUHlPYmplY3QqIG5vYXJnKQogewotCXN0YXRzY29sbGVjdG9yX3QgY29sbGVjdDsKLQlpZiAocGVuZGluZ19leGNlcHRpb24ocE9iaikpCi0JCXJldHVybiBOVUxMOwotCWlmICghcE9iai0+ZXh0ZXJuYWxUaW1lcikKLQkJY29sbGVjdC5mYWN0b3IgPSBocFRpbWVyVW5pdCgpOwotCWVsc2UgaWYgKHBPYmotPmV4dGVybmFsVGltZXJVbml0ID4gMC4wKQotCQljb2xsZWN0LmZhY3RvciA9IHBPYmotPmV4dGVybmFsVGltZXJVbml0OwotCWVsc2UKLQkJY29sbGVjdC5mYWN0b3IgPSAxLjAgLyBET1VCTEVfVElNRVJfUFJFQ0lTSU9OOwotCWNvbGxlY3QubGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGNvbGxlY3QubGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUm90YXRpbmdUcmVlX0VudW0ocE9iai0+cHJvZmlsZXJFbnRyaWVzLCBzdGF0c0ZvckVudHJ5LCAmY29sbGVjdCkKLQkgICAgIT0gMCkgewotCQlQeV9ERUNSRUYoY29sbGVjdC5saXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBjb2xsZWN0Lmxpc3Q7CisgICAgc3RhdHNjb2xsZWN0b3JfdCBjb2xsZWN0OworICAgIGlmIChwZW5kaW5nX2V4Y2VwdGlvbihwT2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFwT2JqLT5leHRlcm5hbFRpbWVyKQorICAgICAgICBjb2xsZWN0LmZhY3RvciA9IGhwVGltZXJVbml0KCk7CisgICAgZWxzZSBpZiAocE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQgPiAwLjApCisgICAgICAgIGNvbGxlY3QuZmFjdG9yID0gcE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQ7CisgICAgZWxzZQorICAgICAgICBjb2xsZWN0LmZhY3RvciA9IDEuMCAvIERPVUJMRV9USU1FUl9QUkVDSVNJT047CisgICAgY29sbGVjdC5saXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoY29sbGVjdC5saXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChSb3RhdGluZ1RyZWVfRW51bShwT2JqLT5wcm9maWxlckVudHJpZXMsIHN0YXRzRm9yRW50cnksICZjb2xsZWN0KQorICAgICAgICAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihjb2xsZWN0Lmxpc3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGNvbGxlY3QubGlzdDsKIH0KIAogc3RhdGljIGludAogc2V0U3ViY2FsbHMoUHJvZmlsZXJPYmplY3QgKnBPYmosIGludCBudmFsdWUpCiB7Ci0JaWYgKG52YWx1ZSA9PSAwKQotCQlwT2JqLT5mbGFncyAmPSB+UE9GX1NVQkNBTExTOwotCWVsc2UgaWYgKG52YWx1ZSA+IDApCi0JCXBPYmotPmZsYWdzIHw9ICBQT0ZfU1VCQ0FMTFM7Ci0JcmV0dXJuIDA7CisgICAgaWYgKG52YWx1ZSA9PSAwKQorICAgICAgICBwT2JqLT5mbGFncyAmPSB+UE9GX1NVQkNBTExTOworICAgIGVsc2UgaWYgKG52YWx1ZSA+IDApCisgICAgICAgIHBPYmotPmZsYWdzIHw9ICBQT0ZfU1VCQ0FMTFM7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNldEJ1aWx0aW5zKFByb2ZpbGVyT2JqZWN0ICpwT2JqLCBpbnQgbnZhbHVlKQogewotCWlmIChudmFsdWUgPT0gMCkKLQkJcE9iai0+ZmxhZ3MgJj0gflBPRl9CVUlMVElOUzsKLQllbHNlIGlmIChudmFsdWUgPiAwKSB7CisgICAgaWYgKG52YWx1ZSA9PSAwKQorICAgICAgICBwT2JqLT5mbGFncyAmPSB+UE9GX0JVSUxUSU5TOworICAgIGVsc2UgaWYgKG52YWx1ZSA+IDApIHsKICNpZm5kZWYgUHlUcmFjZV9DX0NBTEwKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImJ1aWx0aW5zPVRydWUgcmVxdWlyZXMgUHl0aG9uID49IDIuNCIpOwotCQlyZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJ1aWx0aW5zPVRydWUgcmVxdWlyZXMgUHl0aG9uID49IDIuNCIpOworICAgICAgICByZXR1cm4gLTE7CiAjZWxzZQotCQlwT2JqLT5mbGFncyB8PSAgUE9GX0JVSUxUSU5TOworICAgICAgICBwT2JqLT5mbGFncyB8PSAgUE9GX0JVSUxUSU5TOwogI2VuZGlmCi0JfQotCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKGVuYWJsZV9kb2MsICJcCkBAIC02OTEsMzMgKzY5MSwzMyBAQAogc3RhdGljIFB5T2JqZWN0KgogcHJvZmlsZXJfZW5hYmxlKFByb2ZpbGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaW50IHN1YmNhbGxzID0gLTE7Ci0gICAgICAgIGludCBidWlsdGlucyA9IC0xOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic3ViY2FsbHMiLCAiYnVpbHRpbnMiLCAwfTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGlpOmVuYWJsZSIsCi0JCQkJCSBrd2xpc3QsICZzdWJjYWxscywgJmJ1aWx0aW5zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNldFN1YmNhbGxzKHNlbGYsIHN1YmNhbGxzKSA8IDAgfHwgc2V0QnVpbHRpbnMoc2VsZiwgYnVpbHRpbnMpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlFdmFsX1NldFByb2ZpbGUocHJvZmlsZXJfY2FsbGJhY2ssIChQeU9iamVjdCopc2VsZik7Ci0Jc2VsZi0+ZmxhZ3MgfD0gUE9GX0VOQUJMRUQ7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGludCBzdWJjYWxscyA9IC0xOworICAgIGludCBidWlsdGlucyA9IC0xOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic3ViY2FsbHMiLCAiYnVpbHRpbnMiLCAwfTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifGlpOmVuYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmc3ViY2FsbHMsICZidWlsdGlucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzZXRTdWJjYWxscyhzZWxmLCBzdWJjYWxscykgPCAwIHx8IHNldEJ1aWx0aW5zKHNlbGYsIGJ1aWx0aW5zKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXZhbF9TZXRQcm9maWxlKHByb2ZpbGVyX2NhbGxiYWNrLCAoUHlPYmplY3QqKXNlbGYpOworICAgIHNlbGYtPmZsYWdzIHw9IFBPRl9FTkFCTEVEOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIHZvaWQKIGZsdXNoX3VubWF0Y2hlZChQcm9maWxlck9iamVjdCAqcE9iaikKIHsKLQl3aGlsZSAocE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCkgewotCQlQcm9maWxlckNvbnRleHQgKnBDb250ZXh0ID0gcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dDsKLQkJUHJvZmlsZXJFbnRyeSAqcHJvZkVudHJ5PSBwQ29udGV4dC0+Y3R4RW50cnk7Ci0JCWlmIChwcm9mRW50cnkpCi0JCQlTdG9wKHBPYmosIHBDb250ZXh0LCBwcm9mRW50cnkpOwotCQllbHNlCi0JCQlwT2JqLT5jdXJyZW50UHJvZmlsZXJDb250ZXh0ID0gcENvbnRleHQtPnByZXZpb3VzOwotCQlpZiAocENvbnRleHQpCi0JCQlmcmVlKHBDb250ZXh0KTsKLQl9CisgICAgd2hpbGUgKHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQpIHsKKyAgICAgICAgUHJvZmlsZXJDb250ZXh0ICpwQ29udGV4dCA9IHBPYmotPmN1cnJlbnRQcm9maWxlckNvbnRleHQ7CisgICAgICAgIFByb2ZpbGVyRW50cnkgKnByb2ZFbnRyeT0gcENvbnRleHQtPmN0eEVudHJ5OworICAgICAgICBpZiAocHJvZkVudHJ5KQorICAgICAgICAgICAgU3RvcChwT2JqLCBwQ29udGV4dCwgcHJvZkVudHJ5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcE9iai0+Y3VycmVudFByb2ZpbGVyQ29udGV4dCA9IHBDb250ZXh0LT5wcmV2aW91czsKKyAgICAgICAgaWYgKHBDb250ZXh0KQorICAgICAgICAgICAgZnJlZShwQ29udGV4dCk7CisgICAgfQogCiB9CiAKQEAgLTczMCwxMyArNzMwLDEzIEBACiBzdGF0aWMgUHlPYmplY3QqCiBwcm9maWxlcl9kaXNhYmxlKFByb2ZpbGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCogbm9hcmcpCiB7Ci0Jc2VsZi0+ZmxhZ3MgJj0gflBPRl9FTkFCTEVEOwotCVB5RXZhbF9TZXRQcm9maWxlKE5VTEwsIE5VTEwpOwotCWZsdXNoX3VubWF0Y2hlZChzZWxmKTsKLQlpZiAocGVuZGluZ19leGNlcHRpb24oc2VsZikpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzZWxmLT5mbGFncyAmPSB+UE9GX0VOQUJMRUQ7CisgICAgUHlFdmFsX1NldFByb2ZpbGUoTlVMTCwgTlVMTCk7CisgICAgZmx1c2hfdW5tYXRjaGVkKHNlbGYpOworICAgIGlmIChwZW5kaW5nX2V4Y2VwdGlvbihzZWxmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoY2xlYXJfZG9jLCAiXApAQCAtNzQ4LDYyICs3NDgsNjIgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHByb2ZpbGVyX2NsZWFyKFByb2ZpbGVyT2JqZWN0ICpwT2JqLCBQeU9iamVjdCogbm9hcmcpCiB7Ci0JY2xlYXJFbnRyaWVzKHBPYmopOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjbGVhckVudHJpZXMocE9iaik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgdm9pZAogcHJvZmlsZXJfZGVhbGxvYyhQcm9maWxlck9iamVjdCAqb3ApCiB7Ci0JaWYgKG9wLT5mbGFncyAmIFBPRl9FTkFCTEVEKQotCQlQeUV2YWxfU2V0UHJvZmlsZShOVUxMLCBOVUxMKTsKLQlmbHVzaF91bm1hdGNoZWQob3ApOwotCWNsZWFyRW50cmllcyhvcCk7Ci0JUHlfWERFQ1JFRihvcC0+ZXh0ZXJuYWxUaW1lcik7Ci0JUHlfVFlQRShvcCktPnRwX2ZyZWUob3ApOworICAgIGlmIChvcC0+ZmxhZ3MgJiBQT0ZfRU5BQkxFRCkKKyAgICAgICAgUHlFdmFsX1NldFByb2ZpbGUoTlVMTCwgTlVMTCk7CisgICAgZmx1c2hfdW5tYXRjaGVkKG9wKTsKKyAgICBjbGVhckVudHJpZXMob3ApOworICAgIFB5X1hERUNSRUYob3AtPmV4dGVybmFsVGltZXIpOworICAgIFB5X1RZUEUob3ApLT50cF9mcmVlKG9wKTsKIH0KIAogc3RhdGljIGludAogcHJvZmlsZXJfaW5pdChQcm9maWxlck9iamVjdCAqcE9iaiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqbzsKLQlQeU9iamVjdCAqdGltZXIgPSBOVUxMOwotCWRvdWJsZSB0aW1ldW5pdCA9IDAuMDsKLQlpbnQgc3ViY2FsbHMgPSAxOworICAgIFB5T2JqZWN0ICpvOworICAgIFB5T2JqZWN0ICp0aW1lciA9IE5VTEw7CisgICAgZG91YmxlIHRpbWV1bml0ID0gMC4wOworICAgIGludCBzdWJjYWxscyA9IDE7CiAjaWZkZWYgUHlUcmFjZV9DX0NBTEwKLQlpbnQgYnVpbHRpbnMgPSAxOworICAgIGludCBidWlsdGlucyA9IDE7CiAjZWxzZQotCWludCBidWlsdGlucyA9IDA7CisgICAgaW50IGJ1aWx0aW5zID0gMDsKICNlbmRpZgotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsidGltZXIiLCAidGltZXVuaXQiLAotCQkJCSAgICAgICAic3ViY2FsbHMiLCAiYnVpbHRpbnMiLCAwfTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InRpbWVyIiwgInRpbWV1bml0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YmNhbGxzIiwgImJ1aWx0aW5zIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPZGlpOlByb2ZpbGVyIiwga3dsaXN0LAotCQkJCQkgJnRpbWVyLCAmdGltZXVuaXQsCi0JCQkJCSAmc3ViY2FsbHMsICZidWlsdGlucykpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPZGlpOlByb2ZpbGVyIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lciwgJnRpbWV1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJjYWxscywgJmJ1aWx0aW5zKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKHNldFN1YmNhbGxzKHBPYmosIHN1YmNhbGxzKSA8IDAgfHwgc2V0QnVpbHRpbnMocE9iaiwgYnVpbHRpbnMpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW8gPSBwT2JqLT5leHRlcm5hbFRpbWVyOwotCXBPYmotPmV4dGVybmFsVGltZXIgPSB0aW1lcjsKLQlQeV9YSU5DUkVGKHRpbWVyKTsKLQlQeV9YREVDUkVGKG8pOwotCXBPYmotPmV4dGVybmFsVGltZXJVbml0ID0gdGltZXVuaXQ7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNldFN1YmNhbGxzKHBPYmosIHN1YmNhbGxzKSA8IDAgfHwgc2V0QnVpbHRpbnMocE9iaiwgYnVpbHRpbnMpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG8gPSBwT2JqLT5leHRlcm5hbFRpbWVyOworICAgIHBPYmotPmV4dGVybmFsVGltZXIgPSB0aW1lcjsKKyAgICBQeV9YSU5DUkVGKHRpbWVyKTsKKyAgICBQeV9YREVDUkVGKG8pOworICAgIHBPYmotPmV4dGVybmFsVGltZXJVbml0ID0gdGltZXVuaXQ7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBwcm9maWxlcl9tZXRob2RzW10gPSB7Ci0JeyJnZXRzdGF0cyIsICAgIChQeUNGdW5jdGlvbilwcm9maWxlcl9nZXRzdGF0cywKLQkJCU1FVEhfTk9BUkdTLAkJCWdldHN0YXRzX2RvY30sCi0JeyJlbmFibGUiLAkoUHlDRnVuY3Rpb24pcHJvZmlsZXJfZW5hYmxlLAotCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywJZW5hYmxlX2RvY30sCi0JeyJkaXNhYmxlIiwJKFB5Q0Z1bmN0aW9uKXByb2ZpbGVyX2Rpc2FibGUsCi0JCQlNRVRIX05PQVJHUywJCQlkaXNhYmxlX2RvY30sCi0JeyJjbGVhciIsCShQeUNGdW5jdGlvbilwcm9maWxlcl9jbGVhciwKLQkJCU1FVEhfTk9BUkdTLAkJCWNsZWFyX2RvY30sCi0Je05VTEwsIE5VTEx9CisgICAgeyJnZXRzdGF0cyIsICAgIChQeUNGdW5jdGlvbilwcm9maWxlcl9nZXRzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgICAgICAgICAgICAgZ2V0c3RhdHNfZG9jfSwKKyAgICB7ImVuYWJsZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilwcm9maWxlcl9lbmFibGUsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgIGVuYWJsZV9kb2N9LAorICAgIHsiZGlzYWJsZSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXByb2ZpbGVyX2Rpc2FibGUsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTLCAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVfZG9jfSwKKyAgICB7ImNsZWFyIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilwcm9maWxlcl9jbGVhciwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfZG9jfSwKKyAgICB7TlVMTCwgTlVMTH0KIH07CiAKIFB5RG9jX1NUUlZBUihwcm9maWxlcl9kb2MsICJcCkBAIC04MTcsNzYgKzgxNyw3NiBAQAogIik7CiAKIHN0YXRpY2hlcmUgUHlUeXBlT2JqZWN0IFB5UHJvZmlsZXJfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLwotCSJfbHNwcm9mLlByb2ZpbGVyIiwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFByb2ZpbGVyT2JqZWN0KSwgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKXByb2ZpbGVyX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCXByb2ZpbGVyX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotCXByb2ZpbGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KLQkoaW5pdHByb2MpcHJvZmlsZXJfaW5pdCwgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisgICAgIl9sc3Byb2YuUHJvZmlsZXIiLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHJvZmlsZXJPYmplY3QpLCAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3IpcHJvZmlsZXJfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgcHJvZmlsZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgcHJvZmlsZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylwcm9maWxlcl9pbml0LCAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlTWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMfQorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRfbHNwcm9mKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm1vZHVsZSwgKmQ7Ci0JbW9kdWxlID0gUHlfSW5pdE1vZHVsZTMoIl9sc3Byb2YiLCBtb2R1bGVNZXRob2RzLCAiRmFzdCBwcm9maWxlciIpOwotCWlmIChtb2R1bGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG1vZHVsZSk7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlQcm9maWxlcl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUHJvZmlsZXIiLCAoUHlPYmplY3QgKikmUHlQcm9maWxlcl9UeXBlKTsKKyAgICBQeU9iamVjdCAqbW9kdWxlLCAqZDsKKyAgICBtb2R1bGUgPSBQeV9Jbml0TW9kdWxlMygiX2xzcHJvZiIsIG1vZHVsZU1ldGhvZHMsICJGYXN0IHByb2ZpbGVyIik7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVByb2ZpbGVyX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQcm9maWxlciIsIChQeU9iamVjdCAqKSZQeVByb2ZpbGVyX1R5cGUpOwogCi0JaWYgKCFpbml0aWFsaXplZCkgewotCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c0VudHJ5VHlwZSwgCi0JCQkJCSAgJnByb2ZpbGVyX2VudHJ5X2Rlc2MpOwotCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdGF0c1N1YkVudHJ5VHlwZSwgCi0JCQkJCSAgJnByb2ZpbGVyX3N1YmVudHJ5X2Rlc2MpOwotCX0KLQlQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzRW50cnlUeXBlKTsKLQlQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAicHJvZmlsZXJfZW50cnkiLAotCQkJICAgKFB5T2JqZWN0KikgJlN0YXRzRW50cnlUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAicHJvZmlsZXJfc3ViZW50cnkiLAotCQkJICAgKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlKTsKLQllbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApOwotCWluaXRpYWxpemVkID0gMTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRzRW50cnlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9maWxlcl9lbnRyeV9kZXNjKTsKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RhdHNTdWJFbnRyeVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2ZpbGVyX3N1YmVudHJ5X2Rlc2MpOworICAgIH0KKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzRW50cnlUeXBlKTsKKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0KikgJlN0YXRzU3ViRW50cnlUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAicHJvZmlsZXJfZW50cnkiLAorICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QqKSAmU3RhdHNFbnRyeVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJwcm9maWxlcl9zdWJlbnRyeSIsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopICZTdGF0c1N1YkVudHJ5VHlwZSk7CisgICAgZW1wdHlfdHVwbGUgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5oIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24uaAppbmRleCA0NThkMWQzLi5mNmRiODUxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5oCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogRGVmaW5pdGlvbiBvZiBhIGBDb25uZWN0aW9uYCB0eXBlLiAgCisgKiBEZWZpbml0aW9uIG9mIGEgYENvbm5lY3Rpb25gIHR5cGUuCiAgKiBVc2VkIGJ5IGBzb2NrZXRfY29ubmVjdGlvbi5jYCBhbmQgYHBpcGVfY29ubmVjdGlvbi5jYC4KICAqCiAgKiBjb25uZWN0aW9uLmgKQEAgLTE5LDE0ICsxOSwxNCBAQAogCiAjZGVmaW5lIENIRUNLX1JFQURBQkxFKHNlbGYpIFwKICAgICBpZiAoIShzZWxmLT5mbGFncyAmIFJFQURBQkxFKSkgeyBcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAiY29ubmVjdGlvbiBpcyB3cml0ZS1vbmx5Iik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImNvbm5lY3Rpb24gaXMgd3JpdGUtb25seSIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9CiAKICNkZWZpbmUgQ0hFQ0tfV1JJVEFCTEUoc2VsZikgXAogICAgIGlmICghKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpKSB7IFwKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJjb25uZWN0aW9uIGlzIHJlYWQtb25seSIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJjb25uZWN0aW9uIGlzIHJlYWQtb25seSIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9CiAKIC8qCkBAIC0zNiw1NyArMzYsNTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlDb25uZWN0aW9uT2JqZWN0ICpzZWxmOwotCUhBTkRMRSBoYW5kbGU7Ci0JQk9PTCByZWFkYWJsZSA9IFRSVUUsIHdyaXRhYmxlID0gVFJVRTsKKyAgICBDb25uZWN0aW9uT2JqZWN0ICpzZWxmOworICAgIEhBTkRMRSBoYW5kbGU7CisgICAgQk9PTCByZWFkYWJsZSA9IFRSVUUsIHdyaXRhYmxlID0gVFJVRTsKIAotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiaGFuZGxlIiwgInJlYWRhYmxlIiwgIndyaXRhYmxlIiwgTlVMTH07CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJoYW5kbGUiLCAicmVhZGFibGUiLCAid3JpdGFibGUiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIEZfSEFORExFICJ8aWkiLCBrd2xpc3QsIAotCQkJCQkgJmhhbmRsZSwgJnJlYWRhYmxlLCAmd3JpdGFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBGX0hBTkRMRSAifGlpIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGUsICZyZWFkYWJsZSwgJndyaXRhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFIHx8IChQeV9zc2l6ZV90KWhhbmRsZSA8IDApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0lPRXJyb3IsICJpbnZhbGlkIGhhbmRsZSAlemQiLAotCQkJICAgICAoUHlfc3NpemVfdCloYW5kbGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fCAoUHlfc3NpemVfdCloYW5kbGUgPCAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLCAiaW52YWxpZCBoYW5kbGUgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KWhhbmRsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICghcmVhZGFibGUgJiYgIXdyaXRhYmxlKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAKLQkJCQkiZWl0aGVyIHJlYWRhYmxlIG9yIHdyaXRhYmxlIG11c3QgYmUgdHJ1ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFyZWFkYWJsZSAmJiAhd3JpdGFibGUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZWl0aGVyIHJlYWRhYmxlIG9yIHdyaXRhYmxlIG11c3QgYmUgdHJ1ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzZWxmID0gUHlPYmplY3RfTmV3KENvbm5lY3Rpb25PYmplY3QsIHR5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoQ29ubmVjdGlvbk9iamVjdCwgdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmLT53ZWFrcmVmbGlzdCA9IE5VTEw7Ci0Jc2VsZi0+aGFuZGxlID0gaGFuZGxlOwotCXNlbGYtPmZsYWdzID0gMDsKKyAgICBzZWxmLT53ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgc2VsZi0+aGFuZGxlID0gaGFuZGxlOworICAgIHNlbGYtPmZsYWdzID0gMDsKIAotCWlmIChyZWFkYWJsZSkKLQkJc2VsZi0+ZmxhZ3MgfD0gUkVBREFCTEU7Ci0JaWYgKHdyaXRhYmxlKQotCQlzZWxmLT5mbGFncyB8PSBXUklUQUJMRTsKLQlhc3NlcnQoc2VsZi0+ZmxhZ3MgPj0gMSAmJiBzZWxmLT5mbGFncyA8PSAzKTsKKyAgICBpZiAocmVhZGFibGUpCisgICAgICAgIHNlbGYtPmZsYWdzIHw9IFJFQURBQkxFOworICAgIGlmICh3cml0YWJsZSkKKyAgICAgICAgc2VsZi0+ZmxhZ3MgfD0gV1JJVEFCTEU7CisgICAgYXNzZXJ0KHNlbGYtPmZsYWdzID49IDEgJiYgc2VsZi0+ZmxhZ3MgPD0gMyk7CiAKLQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CiB9CiAKIHN0YXRpYyB2b2lkCiBjb25uZWN0aW9uX2RlYWxsb2MoQ29ubmVjdGlvbk9iamVjdCogc2VsZikKIHsKLQlpZiAoc2VsZi0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QqKXNlbGYpOworICAgIGlmIChzZWxmLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCopc2VsZik7CiAKLQlpZiAoc2VsZi0+aGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBDTE9TRShzZWxmLT5oYW5kbGUpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIC8qCkBAIC05NiwxNTYgKzk2LDE1NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fc2VuZGJ5dGVzKENvbm5lY3Rpb25PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmJ1ZmZlcjsKLQlQeV9zc2l6ZV90IGxlbmd0aCwgb2Zmc2V0PTAsIHNpemU9UFlfU1NJWkVfVF9NSU47Ci0JaW50IHJlczsKKyAgICBjaGFyICpidWZmZXI7CisgICAgUHlfc3NpemVfdCBsZW5ndGgsIG9mZnNldD0wLCBzaXplPVBZX1NTSVpFX1RfTUlOOworICAgIGludCByZXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9SQlVGRkVSICIjfCIgRl9QWV9TU0laRV9UIEZfUFlfU1NJWkVfVCwKLQkJCSAgICAgICZidWZmZXIsICZsZW5ndGgsICZvZmZzZXQsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfUkJVRkZFUiAiI3wiIEZfUFlfU1NJWkVfVCBGX1BZX1NTSVpFX1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsICZsZW5ndGgsICZvZmZzZXQsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDSEVDS19XUklUQUJMRShzZWxmKTsKKyAgICBDSEVDS19XUklUQUJMRShzZWxmKTsKIAotCWlmIChvZmZzZXQgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAib2Zmc2V0IGlzIG5lZ2F0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobGVuZ3RoIDwgb2Zmc2V0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnVmZmVyIGxlbmd0aCA8IG9mZnNldCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvZmZzZXQgaXMgbmVnYXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChsZW5ndGggPCBvZmZzZXQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJidWZmZXIgbGVuZ3RoIDwgb2Zmc2V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChzaXplID09IFBZX1NTSVpFX1RfTUlOKSB7Ci0JCXNpemUgPSBsZW5ndGggLSBvZmZzZXQ7Ci0JfSBlbHNlIHsKLQkJaWYgKHNpemUgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNpemUgaXMgbmVnYXRpdmUiKTsKLQkJCXJldHVybiBOVUxMOwkJCi0JCX0KLQkJaWYgKG9mZnNldCArIHNpemUgPiBsZW5ndGgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAKLQkJCQkJImJ1ZmZlciBsZW5ndGggPCBvZmZzZXQgKyBzaXplIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoc2l6ZSA9PSBQWV9TU0laRV9UX01JTikgeworICAgICAgICBzaXplID0gbGVuZ3RoIC0gb2Zmc2V0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzaXplIGlzIG5lZ2F0aXZlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ICsgc2l6ZSA+IGxlbmd0aCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBsZW5ndGggPCBvZmZzZXQgKyBzaXplIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXJlcyA9IGNvbm5fc2VuZF9zdHJpbmcoc2VsZiwgYnVmZmVyICsgb2Zmc2V0LCBzaXplKTsKKyAgICByZXMgPSBjb25uX3NlbmRfc3RyaW5nKHNlbGYsIGJ1ZmZlciArIG9mZnNldCwgc2l6ZSk7CiAKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIG1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBtcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1jb25uZWN0aW9uX3JlY3ZieXRlcyhDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgCitjb25uZWN0aW9uX3JlY3ZieXRlcyhDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmcmVlbWUgPSBOVUxMOwotCVB5X3NzaXplX3QgcmVzLCBtYXhsZW5ndGggPSBQWV9TU0laRV9UX01BWDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBjaGFyICpmcmVlbWUgPSBOVUxMOworICAgIFB5X3NzaXplX3QgcmVzLCBtYXhsZW5ndGggPSBQWV9TU0laRV9UX01BWDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifCIgRl9QWV9TU0laRV9ULCAmbWF4bGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8IiBGX1BZX1NTSVpFX1QsICZtYXhsZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNIRUNLX1JFQURBQkxFKHNlbGYpOwotCQotCWlmIChtYXhsZW5ndGggPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF4bGVuZ3RoIDwgMCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JcmVzID0gY29ubl9yZWN2X3N0cmluZyhzZWxmLCBzZWxmLT5idWZmZXIsIENPTk5FQ1RJT05fQlVGRkVSX1NJWkUsIAotCQkJICAgICAgICZmcmVlbWUsIG1heGxlbmd0aCk7Ci0JCi0JaWYgKHJlcyA8IDApIHsKLQkJaWYgKHJlcyA9PSBNUF9CQURfTUVTU0FHRV9MRU5HVEgpIHsKLQkJCWlmICgoc2VsZi0+ZmxhZ3MgJiBXUklUQUJMRSkgPT0gMCkgewotCQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCQlDTE9TRShzZWxmLT5oYW5kbGUpOwotCQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCQkJc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGYtPmZsYWdzID0gV1JJVEFCTEU7Ci0JCQl9Ci0JCX0KLQkJbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKLQl9IGVsc2UgeyAgICAKLQkJaWYgKGZyZWVtZSA9PSBOVUxMKSB7Ci0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5idWZmZXIsIHJlcyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShmcmVlbWUsIHJlcyk7Ci0JCQlQeU1lbV9GcmVlKGZyZWVtZSk7Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIHJlc3VsdDsKKyAgICBDSEVDS19SRUFEQUJMRShzZWxmKTsKKworICAgIGlmIChtYXhsZW5ndGggPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF4bGVuZ3RoIDwgMCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXMgPSBjb25uX3JlY3Zfc3RyaW5nKHNlbGYsIHNlbGYtPmJ1ZmZlciwgQ09OTkVDVElPTl9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmVlbWUsIG1heGxlbmd0aCk7CisKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBpZiAocmVzID09IE1QX0JBRF9NRVNTQUdFX0xFTkdUSCkgeworICAgICAgICAgICAgaWYgKChzZWxmLT5mbGFncyAmIFdSSVRBQkxFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgICAgIENMT1NFKHNlbGYtPmhhbmRsZSk7CisgICAgICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MgPSBXUklUQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmcmVlbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+YnVmZmVyLCByZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZnJlZW1lLCByZXMpOworICAgICAgICAgICAgUHlNZW1fRnJlZShmcmVlbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWNvbm5lY3Rpb25fcmVjdmJ5dGVzX2ludG8oQ29ubmVjdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIAorY29ubmVjdGlvbl9yZWN2Ynl0ZXNfaW50byhDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmcmVlbWUgPSBOVUxMLCAqYnVmZmVyID0gTlVMTDsKLQlQeV9zc2l6ZV90IHJlcywgbGVuZ3RoLCBvZmZzZXQgPSAwOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCVB5X2J1ZmZlciBwYnVmOworICAgIGNoYXIgKmZyZWVtZSA9IE5VTEwsICpidWZmZXIgPSBOVUxMOworICAgIFB5X3NzaXplX3QgcmVzLCBsZW5ndGgsIG9mZnNldCA9IDA7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlfYnVmZmVyIHBidWY7CiAKLQlDSEVDS19SRUFEQUJMRShzZWxmKTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIncqfCIgRl9QWV9TU0laRV9ULCAKLQkJCSAgICAgICZwYnVmLCAmb2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfUkVBREFCTEUoc2VsZik7CiAKLQlidWZmZXIgPSBwYnVmLmJ1ZjsKLQlsZW5ndGggPSBwYnVmLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIncqfCIgRl9QWV9TU0laRV9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKG9mZnNldCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBvZmZzZXQiKTsKLQkJZ290byBfZXJyb3I7Ci0JfSAgIAorICAgIGJ1ZmZlciA9IHBidWYuYnVmOworICAgIGxlbmd0aCA9IHBidWYubGVuOwogCi0JaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm9mZnNldCB0b28gbGFyZ2UiKTsKLQkJZ290byBfZXJyb3I7Ci0JfQorICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgb2Zmc2V0Iik7CisgICAgICAgIGdvdG8gX2Vycm9yOworICAgIH0KIAotCXJlcyA9IGNvbm5fcmVjdl9zdHJpbmcoc2VsZiwgYnVmZmVyK29mZnNldCwgbGVuZ3RoLW9mZnNldCwgCi0JCQkgICAgICAgJmZyZWVtZSwgUFlfU1NJWkVfVF9NQVgpOworICAgIGlmIChvZmZzZXQgPiBsZW5ndGgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvZmZzZXQgdG9vIGxhcmdlIik7CisgICAgICAgIGdvdG8gX2Vycm9yOworICAgIH0KIAotCWlmIChyZXMgPCAwKSB7Ci0JCWlmIChyZXMgPT0gTVBfQkFEX01FU1NBR0VfTEVOR1RIKSB7Ci0JCQlpZiAoKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpID09IDApIHsKLQkJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQkJQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKLQkJCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkJCXNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxmLT5mbGFncyA9IFdSSVRBQkxFOwotCQkJfQotCQl9Ci0JCW1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7Ci0JfSBlbHNlIHsKLQkJaWYgKGZyZWVtZSA9PSBOVUxMKSB7Ci0JCQlyZXN1bHQgPSBQeUludF9Gcm9tU3NpemVfdChyZXMpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKEJ1ZmZlclRvb1Nob3J0LCAKLQkJCQkJCSAgICAgICBGX1JCVUZGRVIgIiMiLCAKLQkJCQkJCSAgICAgICBmcmVlbWUsIHJlcyk7Ci0JCQlQeU1lbV9GcmVlKGZyZWVtZSk7Ci0JCQlpZiAocmVzdWx0KSB7Ci0JCQkJUHlFcnJfU2V0T2JqZWN0KEJ1ZmZlclRvb1Nob3J0LCByZXN1bHQpOwotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJfQotCQkJZ290byBfZXJyb3I7Ci0JCX0KLQl9CisgICAgcmVzID0gY29ubl9yZWN2X3N0cmluZyhzZWxmLCBidWZmZXIrb2Zmc2V0LCBsZW5ndGgtb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyZWVtZSwgUFlfU1NJWkVfVF9NQVgpOworCisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgaWYgKHJlcyA9PSBNUF9CQURfTUVTU0FHRV9MRU5HVEgpIHsKKyAgICAgICAgICAgIGlmICgoc2VsZi0+ZmxhZ3MgJiBXUklUQUJMRSkgPT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBDTE9TRShzZWxmLT5oYW5kbGUpOworICAgICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICAgICAgc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzID0gV1JJVEFCTEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJlZW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oQnVmZmVyVG9vU2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRl9SQlVGRkVSICIjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlbWUsIHJlcyk7CisgICAgICAgICAgICBQeU1lbV9GcmVlKGZyZWVtZSk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KEJ1ZmZlclRvb1Nob3J0LCByZXN1bHQpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBfZXJyb3I7CisgICAgICAgIH0KKyAgICB9CiAKIF9jbGVhbnVwOgotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogX2Vycm9yOgotCXJlc3VsdCA9IE5VTEw7Ci0JZ290byBfY2xlYW51cDsKKyAgICByZXN1bHQgPSBOVUxMOworICAgIGdvdG8gX2NsZWFudXA7CiB9CiAKIC8qCkBAIC0yNTUsNzQgKzI1NSw3NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fc2VuZF9vYmooQ29ubmVjdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQljaGFyICpidWZmZXI7Ci0JaW50IHJlczsKLQlQeV9zc2l6ZV90IGxlbmd0aDsKLQlQeU9iamVjdCAqcGlja2xlZF9zdHJpbmcgPSBOVUxMOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBpbnQgcmVzOworICAgIFB5X3NzaXplX3QgbGVuZ3RoOworICAgIFB5T2JqZWN0ICpwaWNrbGVkX3N0cmluZyA9IE5VTEw7CiAKLQlDSEVDS19XUklUQUJMRShzZWxmKTsKKyAgICBDSEVDS19XUklUQUJMRShzZWxmKTsKIAotCXBpY2tsZWRfc3RyaW5nID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhwaWNrbGVfZHVtcHMsIG9iaiwgCi0JCQkJCQkgICAgICBwaWNrbGVfcHJvdG9jb2wsIE5VTEwpOwotCWlmICghcGlja2xlZF9zdHJpbmcpCi0JCWdvdG8gZmFpbHVyZTsKKyAgICBwaWNrbGVkX3N0cmluZyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MocGlja2xlX2R1bXBzLCBvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZV9wcm90b2NvbCwgTlVMTCk7CisgICAgaWYgKCFwaWNrbGVkX3N0cmluZykKKyAgICAgICAgZ290byBmYWlsdXJlOwogCi0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShwaWNrbGVkX3N0cmluZywgJmJ1ZmZlciwgJmxlbmd0aCkgPCAwKQotCQlnb3RvIGZhaWx1cmU7CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShwaWNrbGVkX3N0cmluZywgJmJ1ZmZlciwgJmxlbmd0aCkgPCAwKQorICAgICAgICBnb3RvIGZhaWx1cmU7CiAKLQlyZXMgPSBjb25uX3NlbmRfc3RyaW5nKHNlbGYsIGJ1ZmZlciwgKGludClsZW5ndGgpOworICAgIHJlcyA9IGNvbm5fc2VuZF9zdHJpbmcoc2VsZiwgYnVmZmVyLCAoaW50KWxlbmd0aCk7CiAKLQlpZiAocmVzIDwgMCkgewotCQltcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOwotCQlnb3RvIGZhaWx1cmU7Ci0JfQorICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIG1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7CisgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CiAKLQlQeV9YREVDUkVGKHBpY2tsZWRfc3RyaW5nKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9YREVDUkVGKHBpY2tsZWRfc3RyaW5nKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIAogICBmYWlsdXJlOgotCVB5X1hERUNSRUYocGlja2xlZF9zdHJpbmcpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYocGlja2xlZF9zdHJpbmcpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9yZWN2X29iaihDb25uZWN0aW9uT2JqZWN0ICpzZWxmKQogewotCWNoYXIgKmZyZWVtZSA9IE5VTEw7Ci0JUHlfc3NpemVfdCByZXM7Ci0JUHlPYmplY3QgKnRlbXAgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKKyAgICBjaGFyICpmcmVlbWUgPSBOVUxMOworICAgIFB5X3NzaXplX3QgcmVzOworICAgIFB5T2JqZWN0ICp0ZW1wID0gTlVMTCwgKnJlc3VsdCA9IE5VTEw7CiAKLQlDSEVDS19SRUFEQUJMRShzZWxmKTsKKyAgICBDSEVDS19SRUFEQUJMRShzZWxmKTsKIAotCXJlcyA9IGNvbm5fcmVjdl9zdHJpbmcoc2VsZiwgc2VsZi0+YnVmZmVyLCBDT05ORUNUSU9OX0JVRkZFUl9TSVpFLCAKLQkJCSAgICAgICAmZnJlZW1lLCBQWV9TU0laRV9UX01BWCk7CisgICAgcmVzID0gY29ubl9yZWN2X3N0cmluZyhzZWxmLCBzZWxmLT5idWZmZXIsIENPTk5FQ1RJT05fQlVGRkVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJlZW1lLCBQWV9TU0laRV9UX01BWCk7CiAKLQlpZiAocmVzIDwgMCkgewotCQlpZiAocmVzID09IE1QX0JBRF9NRVNTQUdFX0xFTkdUSCkgewotCQkJaWYgKChzZWxmLT5mbGFncyAmIFdSSVRBQkxFKSA9PSAwKSB7Ci0JCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkJCUNMT1NFKHNlbGYtPmhhbmRsZSk7Ci0JCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCQlzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZi0+ZmxhZ3MgPSBXUklUQUJMRTsKLQkJCX0KLQkJfQotCQltcF9TZXRFcnJvcihQeUV4Y19JT0Vycm9yLCByZXMpOwotCX0gZWxzZSB7ICAgIAotCQlpZiAoZnJlZW1lID09IE5VTEwpIHsKLQkJCXRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5idWZmZXIsIHJlcyk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZnJlZW1lLCByZXMpOwotCQkJUHlNZW1fRnJlZShmcmVlbWUpOwotCQl9Ci0JfQorICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIGlmIChyZXMgPT0gTVBfQkFEX01FU1NBR0VfTEVOR1RIKSB7CisgICAgICAgICAgICBpZiAoKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpID09IDApIHsKKyAgICAgICAgICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICAgICAgICAgQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKKyAgICAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgICAgIHNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5mbGFncyA9IFdSSVRBQkxFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1wX1NldEVycm9yKFB5RXhjX0lPRXJyb3IsIHJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyZWVtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICB0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+YnVmZmVyLCByZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGVtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZyZWVtZSwgcmVzKTsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZnJlZW1lKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICh0ZW1wKQotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHBpY2tsZV9sb2FkcywgCi0JCQkJCQkgICAgICB0ZW1wLCBOVUxMKTsKLQlQeV9YREVDUkVGKHRlbXApOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHRlbXApCisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MocGlja2xlX2xvYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAsIE5VTEwpOworICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTMzMiw3MyArMzMyLDczIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9wb2xsKENvbm5lY3Rpb25PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0aW1lb3V0X29iaiA9IE5VTEw7Ci0JZG91YmxlIHRpbWVvdXQgPSAwLjA7Ci0JaW50IHJlczsKKyAgICBQeU9iamVjdCAqdGltZW91dF9vYmogPSBOVUxMOworICAgIGRvdWJsZSB0aW1lb3V0ID0gMC4wOworICAgIGludCByZXM7CiAKLQlDSEVDS19SRUFEQUJMRShzZWxmKTsKKyAgICBDSEVDS19SRUFEQUJMRShzZWxmKTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8iLCAmdGltZW91dF9vYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPIiwgJnRpbWVvdXRfb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodGltZW91dF9vYmogPT0gTlVMTCkgewotCQl0aW1lb3V0ID0gMC4wOwotCX0gZWxzZSBpZiAodGltZW91dF9vYmogPT0gUHlfTm9uZSkgewotCQl0aW1lb3V0ID0gLTEuMDsJCQkJLyogYmxvY2sgZm9yZXZlciAqLwotCX0gZWxzZSB7Ci0JCXRpbWVvdXQgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWVvdXRfb2JqKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKHRpbWVvdXQgPCAwLjApCi0JCQl0aW1lb3V0ID0gMC4wOwotCX0KKyAgICBpZiAodGltZW91dF9vYmogPT0gTlVMTCkgeworICAgICAgICB0aW1lb3V0ID0gMC4wOworICAgIH0gZWxzZSBpZiAodGltZW91dF9vYmogPT0gUHlfTm9uZSkgeworICAgICAgICB0aW1lb3V0ID0gLTEuMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibG9jayBmb3JldmVyICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodGltZW91dF9vYmopOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAodGltZW91dCA8IDAuMCkKKyAgICAgICAgICAgIHRpbWVvdXQgPSAwLjA7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlcyA9IGNvbm5fcG9sbChzZWxmLCB0aW1lb3V0LCBfc2F2ZSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gY29ubl9wb2xsKHNlbGYsIHRpbWVvdXQsIF9zYXZlKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0Jc3dpdGNoIChyZXMpIHsKLQljYXNlIFRSVUU6Ci0JCVB5X1JFVFVSTl9UUlVFOwotCWNhc2UgRkFMU0U6Ci0JCVB5X1JFVFVSTl9GQUxTRTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKLQl9CisgICAgc3dpdGNoIChyZXMpIHsKKyAgICBjYXNlIFRSVUU6CisgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIGNhc2UgRkFMU0U6CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbXBfU2V0RXJyb3IoUHlFeGNfSU9FcnJvciwgcmVzKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX2ZpbGVubyhDb25uZWN0aW9uT2JqZWN0KiBzZWxmKQogewotCWlmIChzZWxmLT5oYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJoYW5kbGUgaXMgaW52YWxpZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPmhhbmRsZSk7CisgICAgaWYgKHNlbGYtPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImhhbmRsZSBpcyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc2VsZi0+aGFuZGxlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fY2xvc2UoQ29ubmVjdGlvbk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+aGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJc2VsZi0+aGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0JfQorICAgIGlmIChzZWxmLT5oYW5kbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBDTE9TRShzZWxmLT5oYW5kbGUpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICB9CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbm5lY3Rpb25fcmVwcihDb25uZWN0aW9uT2JqZWN0ICpzZWxmKQogewotCXN0YXRpYyBjaGFyICpjb25uX3R5cGVbXSA9IHsicmVhZC1vbmx5IiwgIndyaXRlLW9ubHkiLCAicmVhZC13cml0ZSJ9OworICAgIHN0YXRpYyBjaGFyICpjb25uX3R5cGVbXSA9IHsicmVhZC1vbmx5IiwgIndyaXRlLW9ubHkiLCAicmVhZC13cml0ZSJ9OwogCi0JYXNzZXJ0KHNlbGYtPmZsYWdzID49IDEgJiYgc2VsZi0+ZmxhZ3MgPD0gMyk7Ci0JcmV0dXJuIEZST01fRk9STUFUKCI8JXMgJXMsIGhhbmRsZSAlemQ+IiwgCi0JCQkgICBjb25uX3R5cGVbc2VsZi0+ZmxhZ3MgLSAxXSwKLQkJCSAgIENPTk5FQ1RJT05fTkFNRSwgKFB5X3NzaXplX3Qpc2VsZi0+aGFuZGxlKTsKKyAgICBhc3NlcnQoc2VsZi0+ZmxhZ3MgPj0gMSAmJiBzZWxmLT5mbGFncyA8PSAzKTsKKyAgICByZXR1cm4gRlJPTV9GT1JNQVQoIjwlcyAlcywgaGFuZGxlICV6ZD4iLAorICAgICAgICAgICAgICAgICAgICAgICBjb25uX3R5cGVbc2VsZi0+ZmxhZ3MgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09OTkVDVElPTl9OQU1FLCAoUHlfc3NpemVfdClzZWxmLT5oYW5kbGUpOwogfQogCiAvKgpAQCAtNDA4LDE5ICs0MDgsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX2Nsb3NlZChDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29ubmVjdGlvbl9yZWFkYWJsZShDb25uZWN0aW9uT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmZsYWdzICYgUkVBREFCTEUpKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShzZWxmLT5mbGFncyAmIFJFQURBQkxFKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX3dyaXRhYmxlKENvbm5lY3Rpb25PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykoc2VsZi0+ZmxhZ3MgJiBXUklUQUJMRSkpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmZsYWdzICYgV1JJVEFCTEUpKTsKIH0KIAogLyoKQEAgLTQyOCwzNyArNDI4LDM3IEBACiAgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIGNvbm5lY3Rpb25fbWV0aG9kc1tdID0gewotCXsic2VuZF9ieXRlcyIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX3NlbmRieXRlcywgTUVUSF9WQVJBUkdTLCAKLQkgInNlbmQgdGhlIGJ5dGUgZGF0YSBmcm9tIGEgcmVhZGFibGUgYnVmZmVyLWxpa2Ugb2JqZWN0In0sCi0JeyJyZWN2X2J5dGVzIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdmJ5dGVzLCBNRVRIX1ZBUkFSR1MsIAotCSAicmVjZWl2ZSBieXRlIGRhdGEgYXMgYSBzdHJpbmcifSwKLQl7InJlY3ZfYnl0ZXNfaW50byIsKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdmJ5dGVzX2ludG8sTUVUSF9WQVJBUkdTLAotCSAicmVjZWl2ZSBieXRlIGRhdGEgaW50byBhIHdyaXRlYWJsZSBidWZmZXItbGlrZSBvYmplY3RcbiIKLQkgInJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIn0sCisgICAgeyJzZW5kX2J5dGVzIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fc2VuZGJ5dGVzLCBNRVRIX1ZBUkFSR1MsCisgICAgICJzZW5kIHRoZSBieXRlIGRhdGEgZnJvbSBhIHJlYWRhYmxlIGJ1ZmZlci1saWtlIG9iamVjdCJ9LAorICAgIHsicmVjdl9ieXRlcyIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX3JlY3ZieXRlcywgTUVUSF9WQVJBUkdTLAorICAgICAicmVjZWl2ZSBieXRlIGRhdGEgYXMgYSBzdHJpbmcifSwKKyAgICB7InJlY3ZfYnl0ZXNfaW50byIsKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdmJ5dGVzX2ludG8sTUVUSF9WQVJBUkdTLAorICAgICAicmVjZWl2ZSBieXRlIGRhdGEgaW50byBhIHdyaXRlYWJsZSBidWZmZXItbGlrZSBvYmplY3RcbiIKKyAgICAgInJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIn0sCiAKLQl7InNlbmQiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9zZW5kX29iaiwgTUVUSF9PLCAKLQkgInNlbmQgYSAocGlja2xhYmxlKSBvYmplY3QifSwKLQl7InJlY3YiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9yZWN2X29iaiwgTUVUSF9OT0FSR1MsIAotCSAicmVjZWl2ZSBhIChwaWNrbGFibGUpIG9iamVjdCJ9LAorICAgIHsic2VuZCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX3NlbmRfb2JqLCBNRVRIX08sCisgICAgICJzZW5kIGEgKHBpY2tsYWJsZSkgb2JqZWN0In0sCisgICAgeyJyZWN2IiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcmVjdl9vYmosIE1FVEhfTk9BUkdTLAorICAgICAicmVjZWl2ZSBhIChwaWNrbGFibGUpIG9iamVjdCJ9LAogCi0JeyJwb2xsIiwgKFB5Q0Z1bmN0aW9uKWNvbm5lY3Rpb25fcG9sbCwgTUVUSF9WQVJBUkdTLCAKLQkgIndoZXRoZXIgdGhlcmUgaXMgYW55IGlucHV0IGF2YWlsYWJsZSB0byBiZSByZWFkIn0sCi0JeyJmaWxlbm8iLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9maWxlbm8sIE1FVEhfTk9BUkdTLAotCSAiZmlsZSBkZXNjcmlwdG9yIG9yIGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbiJ9LAotCXsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jbG9zZSwgTUVUSF9OT0FSR1MsCi0JICJjbG9zZSB0aGUgY29ubmVjdGlvbiJ9LAorICAgIHsicG9sbCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX3BvbGwsIE1FVEhfVkFSQVJHUywKKyAgICAgIndoZXRoZXIgdGhlcmUgaXMgYW55IGlucHV0IGF2YWlsYWJsZSB0byBiZSByZWFkIn0sCisgICAgeyJmaWxlbm8iLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9maWxlbm8sIE1FVEhfTk9BUkdTLAorICAgICAiZmlsZSBkZXNjcmlwdG9yIG9yIGhhbmRsZSBvZiB0aGUgY29ubmVjdGlvbiJ9LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jbG9zZSwgTUVUSF9OT0FSR1MsCisgICAgICJjbG9zZSB0aGUgY29ubmVjdGlvbiJ9LAogCi0Je05VTEx9ICAvKiBTZW50aW5lbCAqLworICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeUdldFNldERlZiBjb25uZWN0aW9uX2dldHNldFtdID0gewotCXsiY2xvc2VkIiwgKGdldHRlciljb25uZWN0aW9uX2Nsb3NlZCwgTlVMTCwgCi0JICJUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCIsIE5VTEx9LAotCXsicmVhZGFibGUiLCAoZ2V0dGVyKWNvbm5lY3Rpb25fcmVhZGFibGUsIE5VTEwsIAotCSAiVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyByZWFkYWJsZSIsIE5VTEx9LAotCXsid3JpdGFibGUiLCAoZ2V0dGVyKWNvbm5lY3Rpb25fd3JpdGFibGUsIE5VTEwsIAotCSAiVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyB3cml0YWJsZSIsIE5VTEx9LAotCXtOVUxMfQorICAgIHsiY2xvc2VkIiwgKGdldHRlciljb25uZWN0aW9uX2Nsb3NlZCwgTlVMTCwKKyAgICAgIlRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIiwgTlVMTH0sCisgICAgeyJyZWFkYWJsZSIsIChnZXR0ZXIpY29ubmVjdGlvbl9yZWFkYWJsZSwgTlVMTCwKKyAgICAgIlRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZGFibGUiLCBOVUxMfSwKKyAgICB7IndyaXRhYmxlIiwgKGdldHRlciljb25uZWN0aW9uX3dyaXRhYmxlLCBOVUxMLAorICAgICAiVHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyB3cml0YWJsZSIsIE5VTEx9LAorICAgIHtOVUxMfQogfTsKIAogLyoKQEAgLTQ2Niw1MCArNDY2LDUwIEBACiAgKi8KIAogUHlEb2NfU1RSVkFSKGNvbm5lY3Rpb25fZG9jLAotCSAgICAgIkNvbm5lY3Rpb24gdHlwZSB3aG9zZSBjb25zdHJ1Y3RvciBzaWduYXR1cmUgaXNcblxuIgotCSAgICAgIiAgICBDb25uZWN0aW9uKGhhbmRsZSwgcmVhZGFibGU9VHJ1ZSwgd3JpdGFibGU9VHJ1ZSkuXG5cbiIKLQkgICAgICJUaGUgY29uc3RydWN0b3IgZG9lcyAqbm90KiBkdXBsaWNhdGUgdGhlIGhhbmRsZS4iKTsKKyAgICAgICAgICAgICAiQ29ubmVjdGlvbiB0eXBlIHdob3NlIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBpc1xuXG4iCisgICAgICAgICAgICAgIiAgICBDb25uZWN0aW9uKGhhbmRsZSwgcmVhZGFibGU9VHJ1ZSwgd3JpdGFibGU9VHJ1ZSkuXG5cbiIKKyAgICAgICAgICAgICAiVGhlIGNvbnN0cnVjdG9yIGRvZXMgKm5vdCogZHVwbGljYXRlIHRoZSBoYW5kbGUuIik7CiAKIFB5VHlwZU9iamVjdCBDT05ORUNUSU9OX1RZUEUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JLyogdHBfbmFtZSAgICAgICAgICAgKi8gIl9tdWx0aXByb2Nlc3NpbmcuIiBDT05ORUNUSU9OX05BTUUsCi0JLyogdHBfYmFzaWNzaXplICAgICAgKi8gc2l6ZW9mKENvbm5lY3Rpb25PYmplY3QpLAotCS8qIHRwX2l0ZW1zaXplICAgICAgICovIDAsCi0JLyogdHBfZGVhbGxvYyAgICAgICAgKi8gKGRlc3RydWN0b3IpY29ubmVjdGlvbl9kZWFsbG9jLAotCS8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCi0JLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKLQkvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAotCS8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCi0JLyogdHBfcmVwciAgICAgICAgICAgKi8gKHJlcHJmdW5jKWNvbm5lY3Rpb25fcmVwciwKLQkvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAotCS8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCi0JLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKLQkvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAotCS8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCi0JLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9nZXRhdHRybyAgICAgICAqLyAwLAotCS8qIHRwX3NldGF0dHJvICAgICAgICovIDAsCi0JLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKLQkvKiB0cF9mbGFncyAgICAgICAgICAqLyBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgCi0JCQkJUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLAotCS8qIHRwX2RvYyAgICAgICAgICAgICovIGNvbm5lY3Rpb25fZG9jLAotCS8qIHRwX3RyYXZlcnNlICAgICAgICovIDAsCi0JLyogdHBfY2xlYXIgICAgICAgICAgKi8gMCwKLQkvKiB0cF9yaWNoY29tcGFyZSAgICAqLyAwLAotCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovIG9mZnNldG9mKENvbm5lY3Rpb25PYmplY3QsIHdlYWtyZWZsaXN0KSwKLQkvKiB0cF9pdGVyICAgICAgICAgICAqLyAwLAotCS8qIHRwX2l0ZXJuZXh0ICAgICAgICovIDAsCi0JLyogdHBfbWV0aG9kcyAgICAgICAgKi8gY29ubmVjdGlvbl9tZXRob2RzLAotCS8qIHRwX21lbWJlcnMgICAgICAgICovIDAsCi0JLyogdHBfZ2V0c2V0ICAgICAgICAgKi8gY29ubmVjdGlvbl9nZXRzZXQsCi0JLyogdHBfYmFzZSAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9kaWN0ICAgICAgICAgICAqLyAwLAotCS8qIHRwX2Rlc2NyX2dldCAgICAgICovIDAsCi0JLyogdHBfZGVzY3Jfc2V0ICAgICAgKi8gMCwKLQkvKiB0cF9kaWN0b2Zmc2V0ICAgICAqLyAwLAotCS8qIHRwX2luaXQgICAgICAgICAgICovIDAsCi0JLyogdHBfYWxsb2MgICAgICAgICAgKi8gMCwKLQkvKiB0cF9uZXcgICAgICAgICAgICAqLyBjb25uZWN0aW9uX25ldywKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAvKiB0cF9uYW1lICAgICAgICAgICAqLyAiX211bHRpcHJvY2Vzc2luZy4iIENPTk5FQ1RJT05fTkFNRSwKKyAgICAvKiB0cF9iYXNpY3NpemUgICAgICAqLyBzaXplb2YoQ29ubmVjdGlvbk9iamVjdCksCisgICAgLyogdHBfaXRlbXNpemUgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZWFsbG9jICAgICAgICAqLyAoZGVzdHJ1Y3Rvciljb25uZWN0aW9uX2RlYWxsb2MsCisgICAgLyogdHBfcHJpbnQgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRhdHRyICAgICAgICAqLyAwLAorICAgIC8qIHRwX3NldGF0dHIgICAgICAgICovIDAsCisgICAgLyogdHBfY29tcGFyZSAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9yZXByICAgICAgICAgICAqLyAocmVwcmZ1bmMpY29ubmVjdGlvbl9yZXByLAorICAgIC8qIHRwX2FzX251bWJlciAgICAgICovIDAsCisgICAgLyogdHBfYXNfc2VxdWVuY2UgICAgKi8gMCwKKyAgICAvKiB0cF9hc19tYXBwaW5nICAgICAqLyAwLAorICAgIC8qIHRwX2hhc2ggICAgICAgICAgICovIDAsCisgICAgLyogdHBfY2FsbCAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9zdHIgICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2dldGF0dHJvICAgICAgICovIDAsCisgICAgLyogdHBfc2V0YXR0cm8gICAgICAgKi8gMCwKKyAgICAvKiB0cF9hc19idWZmZXIgICAgICAqLyAwLAorICAgIC8qIHRwX2ZsYWdzICAgICAgICAgICovIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywKKyAgICAvKiB0cF9kb2MgICAgICAgICAgICAqLyBjb25uZWN0aW9uX2RvYywKKyAgICAvKiB0cF90cmF2ZXJzZSAgICAgICAqLyAwLAorICAgIC8qIHRwX2NsZWFyICAgICAgICAgICovIDAsCisgICAgLyogdHBfcmljaGNvbXBhcmUgICAgKi8gMCwKKyAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLyBvZmZzZXRvZihDb25uZWN0aW9uT2JqZWN0LCB3ZWFrcmVmbGlzdCksCisgICAgLyogdHBfaXRlciAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9pdGVybmV4dCAgICAgICAqLyAwLAorICAgIC8qIHRwX21ldGhvZHMgICAgICAgICovIGNvbm5lY3Rpb25fbWV0aG9kcywKKyAgICAvKiB0cF9tZW1iZXJzICAgICAgICAqLyAwLAorICAgIC8qIHRwX2dldHNldCAgICAgICAgICovIGNvbm5lY3Rpb25fZ2V0c2V0LAorICAgIC8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCisgICAgLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZXNjcl9nZXQgICAgICAqLyAwLAorICAgIC8qIHRwX2Rlc2NyX3NldCAgICAgICovIDAsCisgICAgLyogdHBfZGljdG9mZnNldCAgICAgKi8gMCwKKyAgICAvKiB0cF9pbml0ICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2FsbG9jICAgICAgICAgICovIDAsCisgICAgLyogdHBfbmV3ICAgICAgICAgICAgKi8gY29ubmVjdGlvbl9uZXcsCiB9OwogCiAjZW5kaWYgLyogQ09OTkVDVElPTl9IICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMKaW5kZXggNDgwNDljNy4uZTU5Mzk1MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuYwpAQCAtMjAsNDYgKzIwLDQ2IEBACiBQeU9iamVjdCAqCiBtcF9TZXRFcnJvcihQeU9iamVjdCAqVHlwZSwgaW50IG51bSkKIHsKLQlzd2l0Y2ggKG51bSkgeworICAgIHN3aXRjaCAobnVtKSB7CiAjaWZkZWYgTVNfV0lORE9XUwotCWNhc2UgTVBfU1RBTkRBUkRfRVJST1I6IAotCQlpZiAoVHlwZSA9PSBOVUxMKQotCQkJVHlwZSA9IFB5RXhjX1dpbmRvd3NFcnJvcjsKLQkJUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoVHlwZSwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgTVBfU09DS0VUX0VSUk9SOgotCQlpZiAoVHlwZSA9PSBOVUxMKQotCQkJVHlwZSA9IFB5RXhjX1dpbmRvd3NFcnJvcjsKLQkJUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoVHlwZSwgV1NBR2V0TGFzdEVycm9yKCkpOwotCQlicmVhazsKKyAgICBjYXNlIE1QX1NUQU5EQVJEX0VSUk9SOgorICAgICAgICBpZiAoVHlwZSA9PSBOVUxMKQorICAgICAgICAgICAgVHlwZSA9IFB5RXhjX1dpbmRvd3NFcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoVHlwZSwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVBfU09DS0VUX0VSUk9SOgorICAgICAgICBpZiAoVHlwZSA9PSBOVUxMKQorICAgICAgICAgICAgVHlwZSA9IFB5RXhjX1dpbmRvd3NFcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoVHlwZSwgV1NBR2V0TGFzdEVycm9yKCkpOworICAgICAgICBicmVhazsKICNlbHNlIC8qICFNU19XSU5ET1dTICovCi0JY2FzZSBNUF9TVEFOREFSRF9FUlJPUjoKLQljYXNlIE1QX1NPQ0tFVF9FUlJPUjoKLQkJaWYgKFR5cGUgPT0gTlVMTCkKLQkJCVR5cGUgPSBQeUV4Y19PU0Vycm9yOwotCQlQeUVycl9TZXRGcm9tRXJybm8oVHlwZSk7Ci0JCWJyZWFrOworICAgIGNhc2UgTVBfU1RBTkRBUkRfRVJST1I6CisgICAgY2FzZSBNUF9TT0NLRVRfRVJST1I6CisgICAgICAgIGlmIChUeXBlID09IE5VTEwpCisgICAgICAgICAgICBUeXBlID0gUHlFeGNfT1NFcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFR5cGUpOworICAgICAgICBicmVhazsKICNlbmRpZiAvKiAhTVNfV0lORE9XUyAqLwotCWNhc2UgTVBfTUVNT1JZX0VSUk9SOgotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlicmVhazsKLQljYXNlIE1QX0VORF9PRl9GSUxFOgotCQlQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLQkJYnJlYWs7Ci0JY2FzZSBNUF9FQVJMWV9FTkRfT0ZfRklMRToKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJImdvdCBlbmQgb2YgZmlsZSBkdXJpbmcgbWVzc2FnZSIpOwotCQlicmVhazsKLQljYXNlIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJiYWQgbWVzc2FnZSBsZW5ndGgiKTsKLQkJYnJlYWs7Ci0JY2FzZSBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgICAidW5rb3duIGVycm9yIG51bWJlciAlZCIsIG51bSk7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGNhc2UgTVBfTUVNT1JZX0VSUk9SOgorICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1QX0VORF9PRl9GSUxFOgorICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNUF9FQVJMWV9FTkRfT0ZfRklMRToKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ290IGVuZCBvZiBmaWxlIGR1cmluZyBtZXNzYWdlIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTVBfQkFEX01FU1NBR0VfTEVOR1RIOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImJhZCBtZXNzYWdlIGxlbmd0aCIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1QX0VYQ0VQVElPTl9IQVNfQkVFTl9TRVQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidW5rb3duIGVycm9yIG51bWJlciAlZCIsIG51bSk7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTc2LDggKzc2LDggQEAKIHN0YXRpYyBCT09MIFdJTkFQSQogUHJvY2Vzc2luZ0N0cmxIYW5kbGVyKERXT1JEIGR3Q3RybFR5cGUpCiB7Ci0JU2V0RXZlbnQoc2lnaW50X2V2ZW50KTsKLQlyZXR1cm4gRkFMU0U7CisgICAgU2V0RXZlbnQoc2lnaW50X2V2ZW50KTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIC8qCkBAIC05NSw3MiArOTUsNzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtdWx0aXByb2Nlc3Npbmdfc2VuZGZkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgY29ubiwgZmQsIHJlczsKLQljaGFyIGR1bW15X2NoYXI7Ci0JY2hhciBidWZbQ01TR19TUEFDRShzaXplb2YoaW50KSldOwotCXN0cnVjdCBtc2doZHIgbXNnID0gezB9OwotCXN0cnVjdCBpb3ZlYyBkdW1teV9pb3Y7Ci0Jc3RydWN0IGNtc2doZHIgKmNtc2c7CisgICAgaW50IGNvbm4sIGZkLCByZXM7CisgICAgY2hhciBkdW1teV9jaGFyOworICAgIGNoYXIgYnVmW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXTsKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZyA9IHswfTsKKyAgICBzdHJ1Y3QgaW92ZWMgZHVtbXlfaW92OworICAgIHN0cnVjdCBjbXNnaGRyICpjbXNnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaSIsICZjb25uLCAmZmQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpIiwgJmNvbm4sICZmZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZHVtbXlfaW92Lmlvdl9iYXNlID0gJmR1bW15X2NoYXI7Ci0JZHVtbXlfaW92Lmlvdl9sZW4gPSAxOwotCW1zZy5tc2dfY29udHJvbCA9IGJ1ZjsKLQltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoYnVmKTsKLQltc2cubXNnX2lvdiA9ICZkdW1teV9pb3Y7Ci0JbXNnLm1zZ19pb3ZsZW4gPSAxOwotCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOwotCWNtc2ctPmNtc2dfbGV2ZWwgPSBTT0xfU09DS0VUOwotCWNtc2ctPmNtc2dfdHlwZSA9IFNDTV9SSUdIVFM7Ci0JY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2YoaW50KSk7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47Ci0JKihpbnQqKUNNU0dfREFUQShjbXNnKSA9IGZkOworICAgIGR1bW15X2lvdi5pb3ZfYmFzZSA9ICZkdW1teV9jaGFyOworICAgIGR1bW15X2lvdi5pb3ZfbGVuID0gMTsKKyAgICBtc2cubXNnX2NvbnRyb2wgPSBidWY7CisgICAgbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGJ1Zik7CisgICAgbXNnLm1zZ19pb3YgPSAmZHVtbXlfaW92OworICAgIG1zZy5tc2dfaW92bGVuID0gMTsKKyAgICBjbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKKyAgICBjbXNnLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKKyAgICBjbXNnLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOworICAgIGNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKGludCkpOworICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworICAgICooaW50KilDTVNHX0RBVEEoY21zZykgPSBmZDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBzZW5kbXNnKGNvbm4sICZtc2csIDApOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlcyA9IHNlbmRtc2coY29ubiwgJm1zZywgMCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbXVsdGlwcm9jZXNzaW5nX3JlY3ZmZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGNvbm4sIGZkLCByZXM7Ci0JY2hhciBkdW1teV9jaGFyOwotCWNoYXIgYnVmW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXTsKLQlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHswfTsKLQlzdHJ1Y3QgaW92ZWMgZHVtbXlfaW92OwotCXN0cnVjdCBjbXNnaGRyICpjbXNnOworICAgIGludCBjb25uLCBmZCwgcmVzOworICAgIGNoYXIgZHVtbXlfY2hhcjsKKyAgICBjaGFyIGJ1ZltDTVNHX1NQQUNFKHNpemVvZihpbnQpKV07CisgICAgc3RydWN0IG1zZ2hkciBtc2cgPSB7MH07CisgICAgc3RydWN0IGlvdmVjIGR1bW15X2lvdjsKKyAgICBzdHJ1Y3QgY21zZ2hkciAqY21zZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZjb25uKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJmNvbm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWR1bW15X2lvdi5pb3ZfYmFzZSA9ICZkdW1teV9jaGFyOwotCWR1bW15X2lvdi5pb3ZfbGVuID0gMTsKLQltc2cubXNnX2NvbnRyb2wgPSBidWY7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGJ1Zik7Ci0JbXNnLm1zZ19pb3YgPSAmZHVtbXlfaW92OwotCW1zZy5tc2dfaW92bGVuID0gMTsKLQljbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKLQljbXNnLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKLQljbXNnLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOwotCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKGludCkpOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworICAgIGR1bW15X2lvdi5pb3ZfYmFzZSA9ICZkdW1teV9jaGFyOworICAgIGR1bW15X2lvdi5pb3ZfbGVuID0gMTsKKyAgICBtc2cubXNnX2NvbnRyb2wgPSBidWY7CisgICAgbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGJ1Zik7CisgICAgbXNnLm1zZ19pb3YgPSAmZHVtbXlfaW92OworICAgIG1zZy5tc2dfaW92bGVuID0gMTsKKyAgICBjbXNnID0gQ01TR19GSVJTVEhEUigmbXNnKTsKKyAgICBjbXNnLT5jbXNnX2xldmVsID0gU09MX1NPQ0tFVDsKKyAgICBjbXNnLT5jbXNnX3R5cGUgPSBTQ01fUklHSFRTOworICAgIGNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKGludCkpOworICAgIG1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJlcyA9IHJlY3Ztc2coY29ubiwgJm1zZywgMCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gcmVjdm1zZyhjb25uLCAmbXNnLCAwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CiAKLQlmZCA9ICooaW50KilDTVNHX0RBVEEoY21zZyk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBmZCk7CisgICAgZmQgPSAqKGludCopQ01TR19EQVRBKGNtc2cpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgZmQpOwogfQogCiAjZW5kaWYgLyogSEFWRV9GRF9UUkFOU0ZFUiAqLwpAQCAtMTc1LDE0ICsxNzUsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCoKIG11bHRpcHJvY2Vzc2luZ19hZGRyZXNzX29mX2J1ZmZlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQl2b2lkICpidWZmZXI7Ci0JUHlfc3NpemVfdCBidWZmZXJfbGVuOworICAgIHZvaWQgKmJ1ZmZlcjsKKyAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9sZW47CiAKLQlpZiAoUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihvYmosICZidWZmZXIsICZidWZmZXJfbGVuKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKG9iaiwgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTiIgRl9QWV9TU0laRV9ULCAKLQkJCSAgICAgUHlMb25nX0Zyb21Wb2lkUHRyKGJ1ZmZlciksIGJ1ZmZlcl9sZW4pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOIiBGX1BZX1NTSVpFX1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0Zyb21Wb2lkUHRyKGJ1ZmZlciksIGJ1ZmZlcl9sZW4pOwogfQogCiAKQEAgLTE5MSwyMCArMTkxLDIwIEBACiAgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7Ci0JeyJhZGRyZXNzX29mX2J1ZmZlciIsIG11bHRpcHJvY2Vzc2luZ19hZGRyZXNzX29mX2J1ZmZlciwgTUVUSF9PLCAKLQkgImFkZHJlc3Nfb2ZfYnVmZmVyKG9iaikgLT4gaW50XG4iIAotCSAiUmV0dXJuIGFkZHJlc3Mgb2Ygb2JqIGFzc3VtaW5nIG9iaiBzdXBwb3J0cyBidWZmZXIgaW50ZWZhY2UifSwKKyAgICB7ImFkZHJlc3Nfb2ZfYnVmZmVyIiwgbXVsdGlwcm9jZXNzaW5nX2FkZHJlc3Nfb2ZfYnVmZmVyLCBNRVRIX08sCisgICAgICJhZGRyZXNzX29mX2J1ZmZlcihvYmopIC0+IGludFxuIgorICAgICAiUmV0dXJuIGFkZHJlc3Mgb2Ygb2JqIGFzc3VtaW5nIG9iaiBzdXBwb3J0cyBidWZmZXIgaW50ZWZhY2UifSwKICNpZiBIQVZFX0ZEX1RSQU5TRkVSCi0JeyJzZW5kZmQiLCBtdWx0aXByb2Nlc3Npbmdfc2VuZGZkLCBNRVRIX1ZBUkFSR1MsIAotCSAic2VuZGZkKHNvY2tmZCwgZmQpIC0+IE5vbmVcbiIKLQkgIlNlbmQgZmlsZSBkZXNjcmlwdG9yIGdpdmVuIGJ5IGZkIG92ZXIgdGhlIHVuaXggZG9tYWluIHNvY2tldFxuIgotCSAid2hvc2UgZmlsZSBkZWNyaXB0b3IgaXMgc29ja2ZkIn0sCi0JeyJyZWN2ZmQiLCBtdWx0aXByb2Nlc3NpbmdfcmVjdmZkLCBNRVRIX1ZBUkFSR1MsCi0JICJyZWN2ZmQoc29ja2ZkKSAtPiBmZFxuIgotCSAiUmVjZWl2ZSBhIGZpbGUgZGVzY3JpcHRvciBvdmVyIGEgdW5peCBkb21haW4gc29ja2V0XG4iCi0JICJ3aG9zZSBmaWxlIGRlY3JpcHRvciBpcyBzb2NrZmQifSwKKyAgICB7InNlbmRmZCIsIG11bHRpcHJvY2Vzc2luZ19zZW5kZmQsIE1FVEhfVkFSQVJHUywKKyAgICAgInNlbmRmZChzb2NrZmQsIGZkKSAtPiBOb25lXG4iCisgICAgICJTZW5kIGZpbGUgZGVzY3JpcHRvciBnaXZlbiBieSBmZCBvdmVyIHRoZSB1bml4IGRvbWFpbiBzb2NrZXRcbiIKKyAgICAgIndob3NlIGZpbGUgZGVjcmlwdG9yIGlzIHNvY2tmZCJ9LAorICAgIHsicmVjdmZkIiwgbXVsdGlwcm9jZXNzaW5nX3JlY3ZmZCwgTUVUSF9WQVJBUkdTLAorICAgICAicmVjdmZkKHNvY2tmZCkgLT4gZmRcbiIKKyAgICAgIlJlY2VpdmUgYSBmaWxlIGRlc2NyaXB0b3Igb3ZlciBhIHVuaXggZG9tYWluIHNvY2tldFxuIgorICAgICAid2hvc2UgZmlsZSBkZWNyaXB0b3IgaXMgc29ja2ZkIn0sCiAjZW5kaWYKLQl7TlVMTH0KKyAgICB7TlVMTH0KIH07CiAKIApAQCAtMjE1LDk3ICsyMTUsOTcgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X211bHRpcHJvY2Vzc2luZyh2b2lkKQogewotCVB5T2JqZWN0ICptb2R1bGUsICp0ZW1wLCAqdmFsdWU7CisgICAgUHlPYmplY3QgKm1vZHVsZSwgKnRlbXAsICp2YWx1ZTsKIAotCS8qIEluaXRpYWxpemUgbW9kdWxlICovCi0JbW9kdWxlID0gUHlfSW5pdE1vZHVsZSgiX211bHRpcHJvY2Vzc2luZyIsIG1vZHVsZV9tZXRob2RzKTsKLQlpZiAoIW1vZHVsZSkKLQkJcmV0dXJuOworICAgIC8qIEluaXRpYWxpemUgbW9kdWxlICovCisgICAgbW9kdWxlID0gUHlfSW5pdE1vZHVsZSgiX211bHRpcHJvY2Vzc2luZyIsIG1vZHVsZV9tZXRob2RzKTsKKyAgICBpZiAoIW1vZHVsZSkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogR2V0IGNvcHkgb2Ygb2JqZWN0cyBmcm9tIHBpY2tsZSAqLwotCXRlbXAgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoUElDS0xFX01PRFVMRSk7Ci0JaWYgKCF0ZW1wKQotCQlyZXR1cm47Ci0JcGlja2xlX2R1bXBzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0ZW1wLCAiZHVtcHMiKTsKLQlwaWNrbGVfbG9hZHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRlbXAsICJsb2FkcyIpOwotCXBpY2tsZV9wcm90b2NvbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodGVtcCwgIkhJR0hFU1RfUFJPVE9DT0wiKTsKLQlQeV9YREVDUkVGKHRlbXApOworICAgIC8qIEdldCBjb3B5IG9mIG9iamVjdHMgZnJvbSBwaWNrbGUgKi8KKyAgICB0ZW1wID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKFBJQ0tMRV9NT0RVTEUpOworICAgIGlmICghdGVtcCkKKyAgICAgICAgcmV0dXJuOworICAgIHBpY2tsZV9kdW1wcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodGVtcCwgImR1bXBzIik7CisgICAgcGlja2xlX2xvYWRzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0ZW1wLCAibG9hZHMiKTsKKyAgICBwaWNrbGVfcHJvdG9jb2wgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRlbXAsICJISUdIRVNUX1BST1RPQ09MIik7CisgICAgUHlfWERFQ1JFRih0ZW1wKTsKIAotCS8qIEdldCBjb3B5IG9mIEJ1ZmZlclRvb1Nob3J0ICovCi0JdGVtcCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgibXVsdGlwcm9jZXNzaW5nIik7Ci0JaWYgKCF0ZW1wKQotCQlyZXR1cm47Ci0JQnVmZmVyVG9vU2hvcnQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHRlbXAsICJCdWZmZXJUb29TaG9ydCIpOwotCVB5X1hERUNSRUYodGVtcCk7CisgICAgLyogR2V0IGNvcHkgb2YgQnVmZmVyVG9vU2hvcnQgKi8KKyAgICB0ZW1wID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJtdWx0aXByb2Nlc3NpbmciKTsKKyAgICBpZiAoIXRlbXApCisgICAgICAgIHJldHVybjsKKyAgICBCdWZmZXJUb29TaG9ydCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodGVtcCwgIkJ1ZmZlclRvb1Nob3J0Iik7CisgICAgUHlfWERFQ1JFRih0ZW1wKTsKIAotCS8qIEFkZCBjb25uZWN0aW9uIHR5cGUgdG8gbW9kdWxlICovCi0JaWYgKFB5VHlwZV9SZWFkeSgmQ29ubmVjdGlvblR5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRigmQ29ubmVjdGlvblR5cGUpOwkKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ29ubmVjdGlvbiIsIChQeU9iamVjdCopJkNvbm5lY3Rpb25UeXBlKTsKKyAgICAvKiBBZGQgY29ubmVjdGlvbiB0eXBlIHRvIG1vZHVsZSAqLworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNvbm5lY3Rpb25UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNvbm5lY3Rpb25UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiQ29ubmVjdGlvbiIsIChQeU9iamVjdCopJkNvbm5lY3Rpb25UeXBlKTsKIAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgSEFWRV9TRU1fT1BFTgotCS8qIEFkZCBTZW1Mb2NrIHR5cGUgdG8gbW9kdWxlICovCi0JaWYgKFB5VHlwZV9SZWFkeSgmU2VtTG9ja1R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRigmU2VtTG9ja1R5cGUpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKFNlbUxvY2tUeXBlLnRwX2RpY3QsICJTRU1fVkFMVUVfTUFYIiwgCi0JCQkgICAgIFB5X0J1aWxkVmFsdWUoImkiLCBTRU1fVkFMVUVfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlNlbUxvY2siLCAoUHlPYmplY3QqKSZTZW1Mb2NrVHlwZSk7ICAgCisgICAgLyogQWRkIFNlbUxvY2sgdHlwZSB0byBtb2R1bGUgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTZW1Mb2NrVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZTZW1Mb2NrVHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoU2VtTG9ja1R5cGUudHBfZGljdCwgIlNFTV9WQUxVRV9NQVgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoImkiLCBTRU1fVkFMVUVfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlNlbUxvY2siLCAoUHlPYmplY3QqKSZTZW1Mb2NrVHlwZSk7CiAjZW5kaWYKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQkvKiBBZGQgUGlwZUNvbm5lY3Rpb24gdG8gbW9kdWxlICovCi0JaWYgKFB5VHlwZV9SZWFkeSgmUGlwZUNvbm5lY3Rpb25UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJlBpcGVDb25uZWN0aW9uVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgIlBpcGVDb25uZWN0aW9uIiwKLQkJCSAgIChQeU9iamVjdCopJlBpcGVDb25uZWN0aW9uVHlwZSk7CisgICAgLyogQWRkIFBpcGVDb25uZWN0aW9uIHRvIG1vZHVsZSAqLworICAgIGlmIChQeVR5cGVfUmVhZHkoJlBpcGVDb25uZWN0aW9uVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZQaXBlQ29ubmVjdGlvblR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJQaXBlQ29ubmVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopJlBpcGVDb25uZWN0aW9uVHlwZSk7CiAKLQkvKiBJbml0aWFsaXplIHdpbjMyIGNsYXNzIGFuZCBhZGQgdG8gbXVsdGlwcm9jZXNzaW5nICovCi0JdGVtcCA9IGNyZWF0ZV93aW4zMl9uYW1lc3BhY2UoKTsKLQlpZiAoIXRlbXApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAid2luMzIiLCB0ZW1wKTsKKyAgICAvKiBJbml0aWFsaXplIHdpbjMyIGNsYXNzIGFuZCBhZGQgdG8gbXVsdGlwcm9jZXNzaW5nICovCisgICAgdGVtcCA9IGNyZWF0ZV93aW4zMl9uYW1lc3BhY2UoKTsKKyAgICBpZiAoIXRlbXApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAid2luMzIiLCB0ZW1wKTsKIAotCS8qIEluaXRpYWxpemUgdGhlIGV2ZW50IGhhbmRsZSB1c2VkIHRvIHNpZ25hbCBDdHJsLUMgKi8KLQlzaWdpbnRfZXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7Ci0JaWYgKCFzaWdpbnRfZXZlbnQpIHsKLQkJUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFTZXRDb25zb2xlQ3RybEhhbmRsZXIoUHJvY2Vzc2luZ0N0cmxIYW5kbGVyLCBUUlVFKSkgewotCQlQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKLQkJcmV0dXJuOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHRoZSBldmVudCBoYW5kbGUgdXNlZCB0byBzaWduYWwgQ3RybC1DICovCisgICAgc2lnaW50X2V2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOworICAgIGlmICghc2lnaW50X2V2ZW50KSB7CisgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghU2V0Q29uc29sZUN0cmxIYW5kbGVyKFByb2Nlc3NpbmdDdHJsSGFuZGxlciwgVFJVRSkpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAjZW5kaWYKIAotCS8qIEFkZCBjb25maWd1cmF0aW9uIG1hY3JvcyAqLwotCXRlbXAgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCF0ZW1wKQotCQlyZXR1cm47Ci0jZGVmaW5lIEFERF9GTEFHKG5hbWUpCQkJCQkJICBcCi0JdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJpIiwgbmFtZSk7CQkJICBcCi0JaWYgKHZhbHVlID09IE5VTEwpIHsgUHlfREVDUkVGKHRlbXApOyByZXR1cm47IH0JCSAgXAotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0ZW1wLCAjbmFtZSwgdmFsdWUpIDwgMCkgewkgIFwKLQkJUHlfREVDUkVGKHRlbXApOyBQeV9ERUNSRUYodmFsdWUpOyByZXR1cm47IH0JICBcCi0JUHlfREVDUkVGKHZhbHVlKQotCQorICAgIC8qIEFkZCBjb25maWd1cmF0aW9uIG1hY3JvcyAqLworICAgIHRlbXAgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCF0ZW1wKQorICAgICAgICByZXR1cm47CisjZGVmaW5lIEFERF9GTEFHKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJpIiwgbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsgUHlfREVDUkVGKHRlbXApOyByZXR1cm47IH0gICAgICAgICAgICAgICBcCisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHRlbXAsICNuYW1lLCB2YWx1ZSkgPCAwKSB7ICAgICAgICAgICBcCisgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsgUHlfREVDUkVGKHZhbHVlKTsgcmV0dXJuOyB9ICAgICAgICAgICAgICBcCisgICAgUHlfREVDUkVGKHZhbHVlKQorCiAjaWZkZWYgSEFWRV9TRU1fT1BFTgotCUFERF9GTEFHKEhBVkVfU0VNX09QRU4pOworICAgIEFERF9GTEFHKEhBVkVfU0VNX09QRU4pOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9TRU1fVElNRURXQUlUCi0JQUREX0ZMQUcoSEFWRV9TRU1fVElNRURXQUlUKTsKKyAgICBBRERfRkxBRyhIQVZFX1NFTV9USU1FRFdBSVQpOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9GRF9UUkFOU0ZFUgotCUFERF9GTEFHKEhBVkVfRkRfVFJBTlNGRVIpOworICAgIEFERF9GTEFHKEhBVkVfRkRfVFJBTlNGRVIpOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9CUk9LRU5fU0VNX0dFVFZBTFVFCi0JQUREX0ZMQUcoSEFWRV9CUk9LRU5fU0VNX0dFVFZBTFVFKTsKKyAgICBBRERfRkxBRyhIQVZFX0JST0tFTl9TRU1fR0VUVkFMVUUpOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9CUk9LRU5fU0VNX1VOTElOSwotCUFERF9GTEFHKEhBVkVfQlJPS0VOX1NFTV9VTkxJTkspOworICAgIEFERF9GTEFHKEhBVkVfQlJPS0VOX1NFTV9VTkxJTkspOwogI2VuZGlmCi0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsICJmbGFncyIsIHRlbXApIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kdWxlLCAiZmxhZ3MiLCB0ZW1wKSA8IDApCisgICAgICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9waXBlX2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9waXBlX2Nvbm5lY3Rpb24uYwppbmRleCAyN2U3OWRkLi5lZTU4MzZmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvcGlwZV9jb25uZWN0aW9uLmMKKysrIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3BpcGVfY29ubmVjdGlvbi5jCkBAIC0xNywxMyArMTcsMTMgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBjb25uX3NlbmRfc3RyaW5nKENvbm5lY3Rpb25PYmplY3QgKmNvbm4sIGNoYXIgKnN0cmluZywgc2l6ZV90IGxlbmd0aCkKIHsKLQlEV09SRCBhbW91bnRfd3JpdHRlbjsKLQlCT09MIHJldDsKKyAgICBEV09SRCBhbW91bnRfd3JpdHRlbjsKKyAgICBCT09MIHJldDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBXcml0ZUZpbGUoY29ubi0+aGFuZGxlLCBzdHJpbmcsIGxlbmd0aCwgJmFtb3VudF93cml0dGVuLCBOVUxMKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiByZXQgPyBNUF9TVUNDRVNTIDogTVBfU1RBTkRBUkRfRVJST1I7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldCA9IFdyaXRlRmlsZShjb25uLT5oYW5kbGUsIHN0cmluZywgbGVuZ3RoLCAmYW1vdW50X3dyaXR0ZW4sIE5VTEwpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0dXJuIHJldCA/IE1QX1NVQ0NFU1MgOiBNUF9TVEFOREFSRF9FUlJPUjsKIH0KIAogLyoKQEAgLTMzLDUwICszMyw1MCBAQAogICovCiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1jb25uX3JlY3Zfc3RyaW5nKENvbm5lY3Rpb25PYmplY3QgKmNvbm4sIGNoYXIgKmJ1ZmZlciwgCi0JCSBzaXplX3QgYnVmbGVuZ3RoLCBjaGFyICoqbmV3YnVmZmVyLCBzaXplX3QgbWF4bGVuZ3RoKQorY29ubl9yZWN2X3N0cmluZyhDb25uZWN0aW9uT2JqZWN0ICpjb25uLCBjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgIHNpemVfdCBidWZsZW5ndGgsIGNoYXIgKipuZXdidWZmZXIsIHNpemVfdCBtYXhsZW5ndGgpCiB7Ci0JRFdPUkQgbGVmdCwgbGVuZ3RoLCBmdWxsX2xlbmd0aCwgZXJyOwotCUJPT0wgcmV0OwotCSpuZXdidWZmZXIgPSBOVUxMOworICAgIERXT1JEIGxlZnQsIGxlbmd0aCwgZnVsbF9sZW5ndGgsIGVycjsKKyAgICBCT09MIHJldDsKKyAgICAqbmV3YnVmZmVyID0gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBSZWFkRmlsZShjb25uLT5oYW5kbGUsIGJ1ZmZlciwgTUlOKGJ1Zmxlbmd0aCwgbWF4bGVuZ3RoKSwgCi0JCSAgICAgICZsZW5ndGgsIE5VTEwpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJldCkKLQkJcmV0dXJuIGxlbmd0aDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmV0ID0gUmVhZEZpbGUoY29ubi0+aGFuZGxlLCBidWZmZXIsIE1JTihidWZsZW5ndGgsIG1heGxlbmd0aCksCisgICAgICAgICAgICAgICAgICAmbGVuZ3RoLCBOVUxMKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiBsZW5ndGg7CiAKLQllcnIgPSBHZXRMYXN0RXJyb3IoKTsKLQlpZiAoZXJyICE9IEVSUk9SX01PUkVfREFUQSkgewotCQlpZiAoZXJyID09IEVSUk9SX0JST0tFTl9QSVBFKQotCQkJcmV0dXJuIE1QX0VORF9PRl9GSUxFOwotCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7Ci0JfQorICAgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgIGlmIChlcnIgIT0gRVJST1JfTU9SRV9EQVRBKSB7CisgICAgICAgIGlmIChlcnIgPT0gRVJST1JfQlJPS0VOX1BJUEUpCisgICAgICAgICAgICByZXR1cm4gTVBfRU5EX09GX0ZJTEU7CisgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKKyAgICB9CiAKLQlpZiAoIVBlZWtOYW1lZFBpcGUoY29ubi0+aGFuZGxlLCBOVUxMLCAwLCBOVUxMLCBOVUxMLCAmbGVmdCkpCi0JCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKKyAgICBpZiAoIVBlZWtOYW1lZFBpcGUoY29ubi0+aGFuZGxlLCBOVUxMLCAwLCBOVUxMLCBOVUxMLCAmbGVmdCkpCisgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKIAotCWZ1bGxfbGVuZ3RoID0gbGVuZ3RoICsgbGVmdDsKLQlpZiAoZnVsbF9sZW5ndGggPiBtYXhsZW5ndGgpCi0JCXJldHVybiBNUF9CQURfTUVTU0FHRV9MRU5HVEg7CisgICAgZnVsbF9sZW5ndGggPSBsZW5ndGggKyBsZWZ0OworICAgIGlmIChmdWxsX2xlbmd0aCA+IG1heGxlbmd0aCkKKyAgICAgICAgcmV0dXJuIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDsKIAotCSpuZXdidWZmZXIgPSBQeU1lbV9NYWxsb2MoZnVsbF9sZW5ndGgpOwotCWlmICgqbmV3YnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBNUF9NRU1PUllfRVJST1I7CisgICAgKm5ld2J1ZmZlciA9IFB5TWVtX01hbGxvYyhmdWxsX2xlbmd0aCk7CisgICAgaWYgKCpuZXdidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE1QX01FTU9SWV9FUlJPUjsKIAotCW1lbWNweSgqbmV3YnVmZmVyLCBidWZmZXIsIGxlbmd0aCk7CisgICAgbWVtY3B5KCpuZXdidWZmZXIsIGJ1ZmZlciwgbGVuZ3RoKTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBSZWFkRmlsZShjb25uLT5oYW5kbGUsICpuZXdidWZmZXIrbGVuZ3RoLCBsZWZ0LCAmbGVuZ3RoLCBOVUxMKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXQpIHsKLQkJYXNzZXJ0KGxlbmd0aCA9PSBsZWZ0KTsKLQkJcmV0dXJuIGZ1bGxfbGVuZ3RoOwotCX0gZWxzZSB7Ci0JCVB5TWVtX0ZyZWUoKm5ld2J1ZmZlcik7Ci0JCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKLQl9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldCA9IFJlYWRGaWxlKGNvbm4tPmhhbmRsZSwgKm5ld2J1ZmZlcitsZW5ndGgsIGxlZnQsICZsZW5ndGgsIE5VTEwpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJldCkgeworICAgICAgICBhc3NlcnQobGVuZ3RoID09IGxlZnQpOworICAgICAgICByZXR1cm4gZnVsbF9sZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlNZW1fRnJlZSgqbmV3YnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOworICAgIH0KIH0KIAogLyoKQEAgLTg2LDUxICs4Niw1MSBAQAogc3RhdGljIGludAogY29ubl9wb2xsKENvbm5lY3Rpb25PYmplY3QgKmNvbm4sIGRvdWJsZSB0aW1lb3V0LCBQeVRocmVhZFN0YXRlICpfc2F2ZSkKIHsKLQlEV09SRCBieXRlcywgZGVhZGxpbmUsIGRlbGF5OwotCWludCBkaWZmZXJlbmNlLCByZXM7Ci0JQk9PTCBibG9jayA9IEZBTFNFOworICAgIERXT1JEIGJ5dGVzLCBkZWFkbGluZSwgZGVsYXk7CisgICAgaW50IGRpZmZlcmVuY2UsIHJlczsKKyAgICBCT09MIGJsb2NrID0gRkFMU0U7CiAKLQlpZiAoIVBlZWtOYW1lZFBpcGUoY29ubi0+aGFuZGxlLCBOVUxMLCAwLCBOVUxMLCAmYnl0ZXMsIE5VTEwpKQotCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgaWYgKCFQZWVrTmFtZWRQaXBlKGNvbm4tPmhhbmRsZSwgTlVMTCwgMCwgTlVMTCwgJmJ5dGVzLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwogCi0JaWYgKHRpbWVvdXQgPT0gMC4wKQotCQlyZXR1cm4gYnl0ZXMgPiAwOworICAgIGlmICh0aW1lb3V0ID09IDAuMCkKKyAgICAgICAgcmV0dXJuIGJ5dGVzID4gMDsKIAotCWlmICh0aW1lb3V0IDwgMC4wKQotCQlibG9jayA9IFRSVUU7Ci0JZWxzZQotCQkvKiBYWFggZG9lcyBub3QgY2hlY2sgZm9yIG92ZXJmbG93ICovCi0JCWRlYWRsaW5lID0gR2V0VGlja0NvdW50KCkgKyAoRFdPUkQpKDEwMDAgKiB0aW1lb3V0ICsgMC41KTsKKyAgICBpZiAodGltZW91dCA8IDAuMCkKKyAgICAgICAgYmxvY2sgPSBUUlVFOworICAgIGVsc2UKKyAgICAgICAgLyogWFhYIGRvZXMgbm90IGNoZWNrIGZvciBvdmVyZmxvdyAqLworICAgICAgICBkZWFkbGluZSA9IEdldFRpY2tDb3VudCgpICsgKERXT1JEKSgxMDAwICogdGltZW91dCArIDAuNSk7CiAKLQlTbGVlcCgwKTsKKyAgICBTbGVlcCgwKTsKIAotCWZvciAoZGVsYXkgPSAxIDsgOyBkZWxheSArPSAxKSB7Ci0JCWlmICghUGVla05hbWVkUGlwZShjb25uLT5oYW5kbGUsIE5VTEwsIDAsIE5VTEwsICZieXRlcywgTlVMTCkpCi0JCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7Ci0JCWVsc2UgaWYgKGJ5dGVzID4gMCkKLQkJCXJldHVybiBUUlVFOworICAgIGZvciAoZGVsYXkgPSAxIDsgOyBkZWxheSArPSAxKSB7CisgICAgICAgIGlmICghUGVla05hbWVkUGlwZShjb25uLT5oYW5kbGUsIE5VTEwsIDAsIE5VTEwsICZieXRlcywgTlVMTCkpCisgICAgICAgICAgICByZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgICAgIGVsc2UgaWYgKGJ5dGVzID4gMCkKKyAgICAgICAgICAgIHJldHVybiBUUlVFOwogCi0JCWlmICghYmxvY2spIHsKLQkJCWRpZmZlcmVuY2UgPSBkZWFkbGluZSAtIEdldFRpY2tDb3VudCgpOwotCQkJaWYgKGRpZmZlcmVuY2UgPCAwKQotCQkJCXJldHVybiBGQUxTRTsKLQkJCWlmICgoaW50KWRlbGF5ID4gZGlmZmVyZW5jZSkKLQkJCQlkZWxheSA9IGRpZmZlcmVuY2U7Ci0JCX0KKyAgICAgICAgaWYgKCFibG9jaykgeworICAgICAgICAgICAgZGlmZmVyZW5jZSA9IGRlYWRsaW5lIC0gR2V0VGlja0NvdW50KCk7CisgICAgICAgICAgICBpZiAoZGlmZmVyZW5jZSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKChpbnQpZGVsYXkgPiBkaWZmZXJlbmNlKQorICAgICAgICAgICAgICAgIGRlbGF5ID0gZGlmZmVyZW5jZTsKKyAgICAgICAgfQogCi0JCWlmIChkZWxheSA+IDIwKQotCQkJZGVsYXkgPSAyMDsKKyAgICAgICAgaWYgKGRlbGF5ID4gMjApCisgICAgICAgICAgICBkZWxheSA9IDIwOwogCi0JCVNsZWVwKGRlbGF5KTsKKyAgICAgICAgU2xlZXAoZGVsYXkpOwogCi0JCS8qIGNoZWNrIGZvciBzaWduYWxzICovCi0JCVB5X0JMT0NLX1RIUkVBRFMgCi0JCXJlcyA9IFB5RXJyX0NoZWNrU2lnbmFscygpOwotCQlQeV9VTkJMT0NLX1RIUkVBRFMKKyAgICAgICAgLyogY2hlY2sgZm9yIHNpZ25hbHMgKi8KKyAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICByZXMgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKKyAgICAgICAgUHlfVU5CTE9DS19USFJFQURTCiAKLQkJaWYgKHJlcykKLQkJCXJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOwotCX0KKyAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgIHJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOworICAgIH0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zZW1hcGhvcmUuYyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zZW1hcGhvcmUuYwppbmRleCAyYzJmYjEwLi4yNjFlNjdjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc2VtYXBob3JlLmMKKysrIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3NlbWFwaG9yZS5jCkBAIC0xMSwxMiArMTEsMTIgQEAKIGVudW0geyBSRUNVUlNJVkVfTVVURVgsIFNFTUFQSE9SRSB9OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVNFTV9IQU5ETEUgaGFuZGxlOwotCWxvbmcgbGFzdF90aWQ7Ci0JaW50IGNvdW50OwotCWludCBtYXh2YWx1ZTsKLQlpbnQga2luZDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgU0VNX0hBTkRMRSBoYW5kbGU7CisgICAgbG9uZyBsYXN0X3RpZDsKKyAgICBpbnQgY291bnQ7CisgICAgaW50IG1heHZhbHVlOworICAgIGludCBraW5kOwogfSBTZW1Mb2NrT2JqZWN0OwogCiAjZGVmaW5lIElTTUlORShvKSAoby0+Y291bnQgPiAwICYmIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSA9PSBvLT5sYXN0X3RpZCkKQEAgLTQwLDE0OCArNDAsMTQ4IEBACiBzdGF0aWMgaW50CiBfR2V0U2VtYXBob3JlVmFsdWUoSEFORExFIGhhbmRsZSwgbG9uZyAqdmFsdWUpCiB7Ci0JbG9uZyBwcmV2aW91czsKKyAgICBsb25nIHByZXZpb3VzOwogCi0Jc3dpdGNoIChXYWl0Rm9yU2luZ2xlT2JqZWN0KGhhbmRsZSwgMCkpIHsKLQljYXNlIFdBSVRfT0JKRUNUXzA6Ci0JCWlmICghUmVsZWFzZVNlbWFwaG9yZShoYW5kbGUsIDEsICZwcmV2aW91cykpCi0JCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7Ci0JCSp2YWx1ZSA9IHByZXZpb3VzICsgMTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBXQUlUX1RJTUVPVVQ6Ci0JCSp2YWx1ZSA9IDA7Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKLQl9CisgICAgc3dpdGNoIChXYWl0Rm9yU2luZ2xlT2JqZWN0KGhhbmRsZSwgMCkpIHsKKyAgICBjYXNlIFdBSVRfT0JKRUNUXzA6CisgICAgICAgIGlmICghUmVsZWFzZVNlbWFwaG9yZShoYW5kbGUsIDEsICZwcmV2aW91cykpCisgICAgICAgICAgICByZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgICAgICp2YWx1ZSA9IHByZXZpb3VzICsgMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBXQUlUX1RJTUVPVVQ6CisgICAgICAgICp2YWx1ZSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZW1sb2NrX2FjcXVpcmUoU2VtTG9ja09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWludCBibG9ja2luZyA9IDE7Ci0JZG91YmxlIHRpbWVvdXQ7Ci0JUHlPYmplY3QgKnRpbWVvdXRfb2JqID0gUHlfTm9uZTsKLQlEV09SRCByZXMsIGZ1bGxfbXNlY3MsIG1zZWNzLCBzdGFydCwgdGlja3M7CisgICAgaW50IGJsb2NraW5nID0gMTsKKyAgICBkb3VibGUgdGltZW91dDsKKyAgICBQeU9iamVjdCAqdGltZW91dF9vYmogPSBQeV9Ob25lOworICAgIERXT1JEIHJlcywgZnVsbF9tc2VjcywgbXNlY3MsIHN0YXJ0LCB0aWNrczsKIAotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiYmxvY2siLCAidGltZW91dCIsIE5VTEx9OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiYmxvY2siLCAidGltZW91dCIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxpTyIsIGt3bGlzdCwKLQkJCQkJICZibG9ja2luZywgJnRpbWVvdXRfb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxpTyIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2tpbmcsICZ0aW1lb3V0X29iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogY2FsY3VsYXRlIHRpbWVvdXQgKi8KLQlpZiAoIWJsb2NraW5nKSB7Ci0JCWZ1bGxfbXNlY3MgPSAwOwotCX0gZWxzZSBpZiAodGltZW91dF9vYmogPT0gUHlfTm9uZSkgewotCQlmdWxsX21zZWNzID0gSU5GSU5JVEU7Ci0JfSBlbHNlIHsKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodGltZW91dF9vYmopOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQl0aW1lb3V0ICo9IDEwMDAuMDsgICAgICAvKiBjb252ZXJ0IHRvIG1pbGxpc2VjcyAqLwotCQlpZiAodGltZW91dCA8IDAuMCkgewotCQkJdGltZW91dCA9IDAuMDsKLQkJfSBlbHNlIGlmICh0aW1lb3V0ID49IDAuNSAqIElORklOSVRFKSB7IC8qIDI1IGRheXMgKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkidGltZW91dCBpcyB0b28gbGFyZ2UiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWZ1bGxfbXNlY3MgPSAoRFdPUkQpKHRpbWVvdXQgKyAwLjUpOwotCX0KLQkKLQkvKiBjaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgb3duIHRoZSBsb2NrICovCi0JaWYgKHNlbGYtPmtpbmQgPT0gUkVDVVJTSVZFX01VVEVYICYmIElTTUlORShzZWxmKSkgewotCQkrK3NlbGYtPmNvdW50OwotCQlQeV9SRVRVUk5fVFJVRTsKLQl9CisgICAgLyogY2FsY3VsYXRlIHRpbWVvdXQgKi8KKyAgICBpZiAoIWJsb2NraW5nKSB7CisgICAgICAgIGZ1bGxfbXNlY3MgPSAwOworICAgIH0gZWxzZSBpZiAodGltZW91dF9vYmogPT0gUHlfTm9uZSkgeworICAgICAgICBmdWxsX21zZWNzID0gSU5GSU5JVEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodGltZW91dF9vYmopOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB0aW1lb3V0ICo9IDEwMDAuMDsgICAgICAvKiBjb252ZXJ0IHRvIG1pbGxpc2VjcyAqLworICAgICAgICBpZiAodGltZW91dCA8IDAuMCkgeworICAgICAgICAgICAgdGltZW91dCA9IDAuMDsKKyAgICAgICAgfSBlbHNlIGlmICh0aW1lb3V0ID49IDAuNSAqIElORklOSVRFKSB7IC8qIDI1IGRheXMgKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IGlzIHRvbyBsYXJnZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZnVsbF9tc2VjcyA9IChEV09SRCkodGltZW91dCArIDAuNSk7CisgICAgfQogCi0JLyogY2hlY2sgd2hldGhlciB3ZSBjYW4gYWNxdWlyZSB3aXRob3V0IGJsb2NraW5nICovCi0JaWYgKFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VsZi0+aGFuZGxlLCAwKSA9PSBXQUlUX09CSkVDVF8wKSB7Ci0JCXNlbGYtPmxhc3RfdGlkID0gR2V0Q3VycmVudFRocmVhZElkKCk7Ci0JCSsrc2VsZi0+Y291bnQ7Ci0JCVB5X1JFVFVSTl9UUlVFOwotCX0KLQkKLQltc2VjcyA9IGZ1bGxfbXNlY3M7Ci0Jc3RhcnQgPSBHZXRUaWNrQ291bnQoKTsKKyAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGFscmVhZHkgb3duIHRoZSBsb2NrICovCisgICAgaWYgKHNlbGYtPmtpbmQgPT0gUkVDVVJTSVZFX01VVEVYICYmIElTTUlORShzZWxmKSkgeworICAgICAgICArK3NlbGYtPmNvdW50OworICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9CiAKLQlmb3IgKCA7IDsgKSB7Ci0JCUhBTkRMRSBoYW5kbGVzWzJdID0ge3NlbGYtPmhhbmRsZSwgc2lnaW50X2V2ZW50fTsKLQkJCi0JCS8qIGRvIHRoZSB3YWl0ICovCi0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJUmVzZXRFdmVudChzaWdpbnRfZXZlbnQpOwotCQlyZXMgPSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKDIsIGhhbmRsZXMsIEZBTFNFLCBtc2Vjcyk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCQotCQkvKiBoYW5kbGUgcmVzdWx0ICovCi0JCWlmIChyZXMgIT0gV0FJVF9PQkpFQ1RfMCArIDEpCi0JCQlicmVhazsKLQkJCi0JCS8qIGdvdCBTSUdJTlQgc28gZ2l2ZSBzaWduYWwgaGFuZGxlciBhIGNoYW5jZSB0byBydW4gKi8KLQkJU2xlZXAoMSk7Ci0JCQotCQkvKiBpZiB0aGlzIGlzIG1haW4gdGhyZWFkIGxldCBLZXlib2FyZEludGVycnVwdCBiZSByYWlzZWQgKi8KLQkJaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCQotCQkvKiByZWNhbGN1bGF0ZSB0aW1lb3V0ICovCi0JCWlmIChtc2VjcyAhPSBJTkZJTklURSkgewotCQkJdGlja3MgPSBHZXRUaWNrQ291bnQoKTsKLQkJCWlmICgoRFdPUkQpKHRpY2tzIC0gc3RhcnQpID49IGZ1bGxfbXNlY3MpCi0JCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQkJbXNlY3MgPSBmdWxsX21zZWNzIC0gKHRpY2tzIC0gc3RhcnQpOwotCQl9Ci0JfQotCQotCS8qIGhhbmRsZSByZXN1bHQgKi8KLQlzd2l0Y2ggKHJlcykgewotCWNhc2UgV0FJVF9USU1FT1VUOgotCQlQeV9SRVRVUk5fRkFMU0U7Ci0JY2FzZSBXQUlUX09CSkVDVF8wOgotCQlzZWxmLT5sYXN0X3RpZCA9IEdldEN1cnJlbnRUaHJlYWRJZCgpOwotCQkrK3NlbGYtPmNvdW50OwotCQlQeV9SRVRVUk5fVFJVRTsKLQljYXNlIFdBSVRfRkFJTEVEOgotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwgIldhaXRGb3JTaW5nbGVPYmplY3QoKSBvciAiCi0JCQkgICAgICJXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKCkgZ2F2ZSB1bnJlY29nbml6ZWQgIgotCQkJICAgICAidmFsdWUgJWQiLCByZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY2hlY2sgd2hldGhlciB3ZSBjYW4gYWNxdWlyZSB3aXRob3V0IGJsb2NraW5nICovCisgICAgaWYgKFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VsZi0+aGFuZGxlLCAwKSA9PSBXQUlUX09CSkVDVF8wKSB7CisgICAgICAgIHNlbGYtPmxhc3RfdGlkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgICAgICsrc2VsZi0+Y291bnQ7CisgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIH0KKworICAgIG1zZWNzID0gZnVsbF9tc2VjczsKKyAgICBzdGFydCA9IEdldFRpY2tDb3VudCgpOworCisgICAgZm9yICggOyA7ICkgeworICAgICAgICBIQU5ETEUgaGFuZGxlc1syXSA9IHtzZWxmLT5oYW5kbGUsIHNpZ2ludF9ldmVudH07CisKKyAgICAgICAgLyogZG8gdGhlIHdhaXQgKi8KKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBSZXNldEV2ZW50KHNpZ2ludF9ldmVudCk7CisgICAgICAgIHJlcyA9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoMiwgaGFuZGxlcywgRkFMU0UsIG1zZWNzKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgICAgICAvKiBoYW5kbGUgcmVzdWx0ICovCisgICAgICAgIGlmIChyZXMgIT0gV0FJVF9PQkpFQ1RfMCArIDEpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBnb3QgU0lHSU5UIHNvIGdpdmUgc2lnbmFsIGhhbmRsZXIgYSBjaGFuY2UgdG8gcnVuICovCisgICAgICAgIFNsZWVwKDEpOworCisgICAgICAgIC8qIGlmIHRoaXMgaXMgbWFpbiB0aHJlYWQgbGV0IEtleWJvYXJkSW50ZXJydXB0IGJlIHJhaXNlZCAqLworICAgICAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAvKiByZWNhbGN1bGF0ZSB0aW1lb3V0ICovCisgICAgICAgIGlmIChtc2VjcyAhPSBJTkZJTklURSkgeworICAgICAgICAgICAgdGlja3MgPSBHZXRUaWNrQ291bnQoKTsKKyAgICAgICAgICAgIGlmICgoRFdPUkQpKHRpY2tzIC0gc3RhcnQpID49IGZ1bGxfbXNlY3MpCisgICAgICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICAgICAgbXNlY3MgPSBmdWxsX21zZWNzIC0gKHRpY2tzIC0gc3RhcnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaGFuZGxlIHJlc3VsdCAqLworICAgIHN3aXRjaCAocmVzKSB7CisgICAgY2FzZSBXQUlUX1RJTUVPVVQ6CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICBjYXNlIFdBSVRfT0JKRUNUXzA6CisgICAgICAgIHNlbGYtPmxhc3RfdGlkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgICAgICsrc2VsZi0+Y291bnQ7CisgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIGNhc2UgV0FJVF9GQUlMRUQ6CisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLCAiV2FpdEZvclNpbmdsZU9iamVjdCgpIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICJXYWl0Rm9yTXVsdGlwbGVPYmplY3RzKCkgZ2F2ZSB1bnJlY29nbml6ZWQgIgorICAgICAgICAgICAgICAgICAgICAgInZhbHVlICVkIiwgcmVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19yZWxlYXNlKFNlbUxvY2tPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChzZWxmLT5raW5kID09IFJFQ1VSU0lWRV9NVVRFWCkgewotCQlpZiAoIUlTTUlORShzZWxmKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0Fzc2VydGlvbkVycm9yLCAiYXR0ZW1wdCB0byAiCi0JCQkJCSJyZWxlYXNlIHJlY3Vyc2l2ZSBsb2NrIG5vdCBvd25lZCAiCi0JCQkJCSJieSB0aHJlYWQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChzZWxmLT5jb3VudCA+IDEpIHsKLQkJCS0tc2VsZi0+Y291bnQ7Ci0JCQlQeV9SRVRVUk5fTk9ORTsKLQkJfQotCQlhc3NlcnQoc2VsZi0+Y291bnQgPT0gMSk7Ci0JfQorICAgIGlmIChzZWxmLT5raW5kID09IFJFQ1VSU0lWRV9NVVRFWCkgeworICAgICAgICBpZiAoIUlTTUlORShzZWxmKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0Fzc2VydGlvbkVycm9yLCAiYXR0ZW1wdCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2UgcmVjdXJzaXZlIGxvY2sgbm90IG93bmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnkgdGhyZWFkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZi0+Y291bnQgPiAxKSB7CisgICAgICAgICAgICAtLXNlbGYtPmNvdW50OworICAgICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KHNlbGYtPmNvdW50ID09IDEpOworICAgIH0KIAotCWlmICghUmVsZWFzZVNlbWFwaG9yZShzZWxmLT5oYW5kbGUsIDEsIE5VTEwpKSB7Ci0JCWlmIChHZXRMYXN0RXJyb3IoKSA9PSBFUlJPUl9UT09fTUFOWV9QT1NUUykgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZW1hcGhvcmUgb3IgbG9jayAiCi0JCQkJCSJyZWxlYXNlZCB0b28gbWFueSB0aW1lcyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7Ci0JCX0KLQl9CisgICAgaWYgKCFSZWxlYXNlU2VtYXBob3JlKHNlbGYtPmhhbmRsZSwgMSwgTlVMTCkpIHsKKyAgICAgICAgaWYgKEdldExhc3RFcnJvcigpID09IEVSUk9SX1RPT19NQU5ZX1BPU1RTKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNlbWFwaG9yZSBvciBsb2NrICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsZWFzZWQgdG9vIG1hbnkgdGltZXMiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgICAgICB9CisgICAgfQogCi0JLS1zZWxmLT5jb3VudDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICAtLXNlbGYtPmNvdW50OworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiAjZWxzZSAvKiAhTVNfV0lORE9XUyAqLwpAQCAtMjA3LDU5ICsyMDcsNTkgQEAKIGludAogc2VtX3RpbWVkd2FpdF9zYXZlKHNlbV90ICpzZW0sIHN0cnVjdCB0aW1lc3BlYyAqZGVhZGxpbmUsIFB5VGhyZWFkU3RhdGUgKl9zYXZlKQogewotCWludCByZXM7Ci0JdW5zaWduZWQgbG9uZyBkZWxheSwgZGlmZmVyZW5jZTsKLQlzdHJ1Y3QgdGltZXZhbCBub3csIHR2ZGVhZGxpbmUsIHR2ZGVsYXk7CisgICAgaW50IHJlczsKKyAgICB1bnNpZ25lZCBsb25nIGRlbGF5LCBkaWZmZXJlbmNlOworICAgIHN0cnVjdCB0aW1ldmFsIG5vdywgdHZkZWFkbGluZSwgdHZkZWxheTsKIAotCWVycm5vID0gMDsKLQl0dmRlYWRsaW5lLnR2X3NlYyA9IGRlYWRsaW5lLT50dl9zZWM7Ci0JdHZkZWFkbGluZS50dl91c2VjID0gZGVhZGxpbmUtPnR2X25zZWMgLyAxMDAwOworICAgIGVycm5vID0gMDsKKyAgICB0dmRlYWRsaW5lLnR2X3NlYyA9IGRlYWRsaW5lLT50dl9zZWM7CisgICAgdHZkZWFkbGluZS50dl91c2VjID0gZGVhZGxpbmUtPnR2X25zZWMgLyAxMDAwOwogCi0JZm9yIChkZWxheSA9IDAgOyA7IGRlbGF5ICs9IDEwMDApIHsKLQkJLyogcG9sbCAqLwotCQlpZiAoc2VtX3RyeXdhaXQoc2VtKSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UgaWYgKGVycm5vICE9IEVBR0FJTikKLQkJCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKKyAgICBmb3IgKGRlbGF5ID0gMCA7IDsgZGVsYXkgKz0gMTAwMCkgeworICAgICAgICAvKiBwb2xsICovCisgICAgICAgIGlmIChzZW1fdHJ5d2FpdChzZW0pID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZSBpZiAoZXJybm8gIT0gRUFHQUlOKQorICAgICAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwogCi0JCS8qIGdldCBjdXJyZW50IHRpbWUgKi8KLQkJaWYgKGdldHRpbWVvZmRheSgmbm93LCBOVUxMKSA8IDApCi0JCQlyZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgICAgIC8qIGdldCBjdXJyZW50IHRpbWUgKi8KKyAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmbm93LCBOVUxMKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CiAKLQkJLyogY2hlY2sgZm9yIHRpbWVvdXQgKi8KLQkJaWYgKHR2ZGVhZGxpbmUudHZfc2VjIDwgbm93LnR2X3NlYyB8fCAKLQkJICAgICh0dmRlYWRsaW5lLnR2X3NlYyA9PSBub3cudHZfc2VjICYmIAotCQkgICAgIHR2ZGVhZGxpbmUudHZfdXNlYyA8PSBub3cudHZfdXNlYykpIHsKLQkJCWVycm5vID0gRVRJTUVET1VUOwotCQkJcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwotCQl9CisgICAgICAgIC8qIGNoZWNrIGZvciB0aW1lb3V0ICovCisgICAgICAgIGlmICh0dmRlYWRsaW5lLnR2X3NlYyA8IG5vdy50dl9zZWMgfHwKKyAgICAgICAgICAgICh0dmRlYWRsaW5lLnR2X3NlYyA9PSBub3cudHZfc2VjICYmCisgICAgICAgICAgICAgdHZkZWFkbGluZS50dl91c2VjIDw9IG5vdy50dl91c2VjKSkgeworICAgICAgICAgICAgZXJybm8gPSBFVElNRURPVVQ7CisgICAgICAgICAgICByZXR1cm4gTVBfU1RBTkRBUkRfRVJST1I7CisgICAgICAgIH0KIAotCQkvKiBjYWxjdWxhdGUgaG93IG11Y2ggdGltZSBpcyBsZWZ0ICovCi0JCWRpZmZlcmVuY2UgPSAodHZkZWFkbGluZS50dl9zZWMgLSBub3cudHZfc2VjKSAqIDEwMDAwMDAgKyAKLQkJCSh0dmRlYWRsaW5lLnR2X3VzZWMgLSBub3cudHZfdXNlYyk7CisgICAgICAgIC8qIGNhbGN1bGF0ZSBob3cgbXVjaCB0aW1lIGlzIGxlZnQgKi8KKyAgICAgICAgZGlmZmVyZW5jZSA9ICh0dmRlYWRsaW5lLnR2X3NlYyAtIG5vdy50dl9zZWMpICogMTAwMDAwMCArCisgICAgICAgICAgICAodHZkZWFkbGluZS50dl91c2VjIC0gbm93LnR2X3VzZWMpOwogCi0JCS8qIGNoZWNrIGRlbGF5IG5vdCB0b28gbG9uZyAtLSBtYXhpbXVtIGlzIDIwIG1zZWNzICovCi0JCWlmIChkZWxheSA+IDIwMDAwKQotCQkJZGVsYXkgPSAyMDAwMDsKLQkJaWYgKGRlbGF5ID4gZGlmZmVyZW5jZSkKLQkJCWRlbGF5ID0gZGlmZmVyZW5jZTsKKyAgICAgICAgLyogY2hlY2sgZGVsYXkgbm90IHRvbyBsb25nIC0tIG1heGltdW0gaXMgMjAgbXNlY3MgKi8KKyAgICAgICAgaWYgKGRlbGF5ID4gMjAwMDApCisgICAgICAgICAgICBkZWxheSA9IDIwMDAwOworICAgICAgICBpZiAoZGVsYXkgPiBkaWZmZXJlbmNlKQorICAgICAgICAgICAgZGVsYXkgPSBkaWZmZXJlbmNlOwogCi0JCS8qIHNsZWVwICovCi0JCXR2ZGVsYXkudHZfc2VjID0gZGVsYXkgLyAxMDAwMDAwOwotCQl0dmRlbGF5LnR2X3VzZWMgPSBkZWxheSAlIDEwMDAwMDA7Ci0JCWlmIChzZWxlY3QoMCwgTlVMTCwgTlVMTCwgTlVMTCwgJnR2ZGVsYXkpIDwgMCkKLQkJCXJldHVybiBNUF9TVEFOREFSRF9FUlJPUjsKKyAgICAgICAgLyogc2xlZXAgKi8KKyAgICAgICAgdHZkZWxheS50dl9zZWMgPSBkZWxheSAvIDEwMDAwMDA7CisgICAgICAgIHR2ZGVsYXkudHZfdXNlYyA9IGRlbGF5ICUgMTAwMDAwMDsKKyAgICAgICAgaWYgKHNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHZkZWxheSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE1QX1NUQU5EQVJEX0VSUk9SOwogCi0JCS8qIGNoZWNrIGZvciBzaWduYWxzICovCi0JCVB5X0JMT0NLX1RIUkVBRFMgCi0JCXJlcyA9IFB5RXJyX0NoZWNrU2lnbmFscygpOwotCQlQeV9VTkJMT0NLX1RIUkVBRFMKKyAgICAgICAgLyogY2hlY2sgZm9yIHNpZ25hbHMgKi8KKyAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICByZXMgPSBQeUVycl9DaGVja1NpZ25hbHMoKTsKKyAgICAgICAgUHlfVU5CTE9DS19USFJFQURTCiAKLQkJaWYgKHJlcykgewotCQkJZXJybm8gPSBFSU5UUjsKLQkJCXJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOwotCQl9Ci0JfQorICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICBlcnJubyA9IEVJTlRSOworICAgICAgICAgICAgcmV0dXJuIE1QX0VYQ0VQVElPTl9IQVNfQkVFTl9TRVQ7CisgICAgICAgIH0KKyAgICB9CiB9CiAKICNlbmRpZiAvKiAhSEFWRV9TRU1fVElNRURXQUlUICovCkBAIC0yNjcsMTI5ICsyNjcsMTI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19hY3F1aXJlKFNlbUxvY2tPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbnQgYmxvY2tpbmcgPSAxLCByZXM7Ci0JZG91YmxlIHRpbWVvdXQ7Ci0JUHlPYmplY3QgKnRpbWVvdXRfb2JqID0gUHlfTm9uZTsKLQlzdHJ1Y3QgdGltZXNwZWMgZGVhZGxpbmUgPSB7MH07Ci0Jc3RydWN0IHRpbWV2YWwgbm93OwotCWxvbmcgc2VjLCBuc2VjOworICAgIGludCBibG9ja2luZyA9IDEsIHJlczsKKyAgICBkb3VibGUgdGltZW91dDsKKyAgICBQeU9iamVjdCAqdGltZW91dF9vYmogPSBQeV9Ob25lOworICAgIHN0cnVjdCB0aW1lc3BlYyBkZWFkbGluZSA9IHswfTsKKyAgICBzdHJ1Y3QgdGltZXZhbCBub3c7CisgICAgbG9uZyBzZWMsIG5zZWM7CiAKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJsb2NrIiwgInRpbWVvdXQiLCBOVUxMfTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJsb2NrIiwgInRpbWVvdXQiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aU8iLCBrd2xpc3QsCi0JCQkJCSAmYmxvY2tpbmcsICZ0aW1lb3V0X29iaikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8aU8iLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NraW5nLCAmdGltZW91dF9vYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzZWxmLT5raW5kID09IFJFQ1VSU0lWRV9NVVRFWCAmJiBJU01JTkUoc2VsZikpIHsKLQkJKytzZWxmLT5jb3VudDsKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JfQorICAgIGlmIChzZWxmLT5raW5kID09IFJFQ1VSU0lWRV9NVVRFWCAmJiBJU01JTkUoc2VsZikpIHsKKyAgICAgICAgKytzZWxmLT5jb3VudDsKKyAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfQogCi0JaWYgKHRpbWVvdXRfb2JqICE9IFB5X05vbmUpIHsKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodGltZW91dF9vYmopOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAodGltZW91dCA8IDAuMCkKLQkJCXRpbWVvdXQgPSAwLjA7CisgICAgaWYgKHRpbWVvdXRfb2JqICE9IFB5X05vbmUpIHsKKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUodGltZW91dF9vYmopOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAodGltZW91dCA8IDAuMCkKKyAgICAgICAgICAgIHRpbWVvdXQgPSAwLjA7CiAKLQkJaWYgKGdldHRpbWVvZmRheSgmbm93LCBOVUxMKSA8IDApIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlYyA9IChsb25nKSB0aW1lb3V0OwotCQluc2VjID0gKGxvbmcpICgxZTkgKiAodGltZW91dCAtIHNlYykgKyAwLjUpOwotCQlkZWFkbGluZS50dl9zZWMgPSBub3cudHZfc2VjICsgc2VjOwotCQlkZWFkbGluZS50dl9uc2VjID0gbm93LnR2X3VzZWMgKiAxMDAwICsgbnNlYzsKLQkJZGVhZGxpbmUudHZfc2VjICs9IChkZWFkbGluZS50dl9uc2VjIC8gMTAwMDAwMDAwMCk7Ci0JCWRlYWRsaW5lLnR2X25zZWMgJT0gMTAwMDAwMDAwMDsKLQl9CisgICAgICAgIGlmIChnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCkgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWMgPSAobG9uZykgdGltZW91dDsKKyAgICAgICAgbnNlYyA9IChsb25nKSAoMWU5ICogKHRpbWVvdXQgLSBzZWMpICsgMC41KTsKKyAgICAgICAgZGVhZGxpbmUudHZfc2VjID0gbm93LnR2X3NlYyArIHNlYzsKKyAgICAgICAgZGVhZGxpbmUudHZfbnNlYyA9IG5vdy50dl91c2VjICogMTAwMCArIG5zZWM7CisgICAgICAgIGRlYWRsaW5lLnR2X3NlYyArPSAoZGVhZGxpbmUudHZfbnNlYyAvIDEwMDAwMDAwMDApOworICAgICAgICBkZWFkbGluZS50dl9uc2VjICU9IDEwMDAwMDAwMDA7CisgICAgfQogCi0JZG8gewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWlmIChibG9ja2luZyAmJiB0aW1lb3V0X29iaiA9PSBQeV9Ob25lKQotCQkJcmVzID0gc2VtX3dhaXQoc2VsZi0+aGFuZGxlKTsKLQkJZWxzZSBpZiAoIWJsb2NraW5nKQotCQkJcmVzID0gc2VtX3RyeXdhaXQoc2VsZi0+aGFuZGxlKTsKLQkJZWxzZQotCQkJcmVzID0gc2VtX3RpbWVkd2FpdChzZWxmLT5oYW5kbGUsICZkZWFkbGluZSk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChyZXMgPT0gTVBfRVhDRVBUSU9OX0hBU19CRUVOX1NFVCkKLQkJCWJyZWFrOwotCX0gd2hpbGUgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlOVFIgJiYgIVB5RXJyX0NoZWNrU2lnbmFscygpKTsKKyAgICBkbyB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKGJsb2NraW5nICYmIHRpbWVvdXRfb2JqID09IFB5X05vbmUpCisgICAgICAgICAgICByZXMgPSBzZW1fd2FpdChzZWxmLT5oYW5kbGUpOworICAgICAgICBlbHNlIGlmICghYmxvY2tpbmcpCisgICAgICAgICAgICByZXMgPSBzZW1fdHJ5d2FpdChzZWxmLT5oYW5kbGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBzZW1fdGltZWR3YWl0KHNlbGYtPmhhbmRsZSwgJmRlYWRsaW5lKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKHJlcyA9PSBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfSB3aGlsZSAocmVzIDwgMCAmJiBlcnJubyA9PSBFSU5UUiAmJiAhUHlFcnJfQ2hlY2tTaWduYWxzKCkpOwogCi0JaWYgKHJlcyA8IDApIHsKLQkJaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFVElNRURPVVQpCi0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCWVsc2UgaWYgKGVycm5vID09IEVJTlRSKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UKLQkJCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0JfQorICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVRJTUVET1VUKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBlbHNlIGlmIChlcnJubyA9PSBFSU5UUikKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgIH0KIAotCSsrc2VsZi0+Y291bnQ7Ci0Jc2VsZi0+bGFzdF90aWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgKytzZWxmLT5jb3VudDsKKyAgICBzZWxmLT5sYXN0X3RpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKIAotCVB5X1JFVFVSTl9UUlVFOworICAgIFB5X1JFVFVSTl9UUlVFOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19yZWxlYXNlKFNlbUxvY2tPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChzZWxmLT5raW5kID09IFJFQ1VSU0lWRV9NVVRFWCkgewotCQlpZiAoIUlTTUlORShzZWxmKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0Fzc2VydGlvbkVycm9yLCAiYXR0ZW1wdCB0byAiCi0JCQkJCSJyZWxlYXNlIHJlY3Vyc2l2ZSBsb2NrIG5vdCBvd25lZCAiCi0JCQkJCSJieSB0aHJlYWQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChzZWxmLT5jb3VudCA+IDEpIHsKLQkJCS0tc2VsZi0+Y291bnQ7Ci0JCQlQeV9SRVRVUk5fTk9ORTsKLQkJfQotCQlhc3NlcnQoc2VsZi0+Y291bnQgPT0gMSk7Ci0JfSBlbHNlIHsKKyAgICBpZiAoc2VsZi0+a2luZCA9PSBSRUNVUlNJVkVfTVVURVgpIHsKKyAgICAgICAgaWYgKCFJU01JTkUoc2VsZikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Bc3NlcnRpb25FcnJvciwgImF0dGVtcHQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxlYXNlIHJlY3Vyc2l2ZSBsb2NrIG5vdCBvd25lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5IHRocmVhZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlbGYtPmNvdW50ID4gMSkgeworICAgICAgICAgICAgLS1zZWxmLT5jb3VudDsKKyAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgICAgICB9CisgICAgICAgIGFzc2VydChzZWxmLT5jb3VudCA9PSAxKTsKKyAgICB9IGVsc2UgewogI2lmIEhBVkVfQlJPS0VOX1NFTV9HRVRWQUxVRQotCQkvKiBXZSB3aWxsIG9ubHkgY2hlY2sgcHJvcGVybHkgdGhlIG1heHZhbHVlID09IDEgY2FzZSAqLwotCQlpZiAoc2VsZi0+bWF4dmFsdWUgPT0gMSkgewotCQkJLyogbWFrZSBzdXJlIHRoYXQgYWxyZWFkeSBsb2NrZWQgKi8KLQkJCWlmIChzZW1fdHJ5d2FpdChzZWxmLT5oYW5kbGUpIDwgMCkgewotCQkJCWlmIChlcnJubyAhPSBFQUdBSU4pIHsKLQkJCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJLyogaXQgaXMgYWxyZWFkeSBsb2NrZWQgYXMgZXhwZWN0ZWQgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJLyogaXQgd2FzIG5vdCBsb2NrZWQgc28gdW5kbyB3YWl0IGFuZCByYWlzZSAgKi8KLQkJCQlpZiAoc2VtX3Bvc3Qoc2VsZi0+aGFuZGxlKSA8IDApIHsKLQkJCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZW1hcGhvcmUgIgotCQkJCQkJIm9yIGxvY2sgcmVsZWFzZWQgdG9vIG1hbnkgIgotCQkJCQkJInRpbWVzIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLyogV2Ugd2lsbCBvbmx5IGNoZWNrIHByb3Blcmx5IHRoZSBtYXh2YWx1ZSA9PSAxIGNhc2UgKi8KKyAgICAgICAgaWYgKHNlbGYtPm1heHZhbHVlID09IDEpIHsKKyAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGFscmVhZHkgbG9ja2VkICovCisgICAgICAgICAgICBpZiAoc2VtX3RyeXdhaXQoc2VsZi0+aGFuZGxlKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZXJybm8gIT0gRUFHQUlOKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGl0IGlzIGFscmVhZHkgbG9ja2VkIGFzIGV4cGVjdGVkICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGl0IHdhcyBub3QgbG9ja2VkIHNvIHVuZG8gd2FpdCBhbmQgcmFpc2UgICovCisgICAgICAgICAgICAgICAgaWYgKHNlbV9wb3N0KHNlbGYtPmhhbmRsZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2VtYXBob3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGxvY2sgcmVsZWFzZWQgdG9vIG1hbnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2Vsc2UKLQkJaW50IHN2YWw7CisgICAgICAgIGludCBzdmFsOwogCi0JCS8qIFRoaXMgY2hlY2sgaXMgbm90IGFuIGFic29sdXRlIGd1YXJhbnRlZSB0aGF0IHRoZSBzZW1hcGhvcmUKLQkJICAgZG9lcyBub3QgcmlzZSBhYm92ZSBtYXh2YWx1ZS4gKi8KLQkJaWYgKHNlbV9nZXR2YWx1ZShzZWxmLT5oYW5kbGUsICZzdmFsKSA8IDApIHsKLQkJCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7Ci0JCX0gZWxzZSBpZiAoc3ZhbCA+PSBzZWxmLT5tYXh2YWx1ZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZW1hcGhvcmUgb3IgbG9jayAiCi0JCQkJCSJyZWxlYXNlZCB0b28gbWFueSB0aW1lcyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgLyogVGhpcyBjaGVjayBpcyBub3QgYW4gYWJzb2x1dGUgZ3VhcmFudGVlIHRoYXQgdGhlIHNlbWFwaG9yZQorICAgICAgICAgICBkb2VzIG5vdCByaXNlIGFib3ZlIG1heHZhbHVlLiAqLworICAgICAgICBpZiAoc2VtX2dldHZhbHVlKHNlbGYtPmhhbmRsZSwgJnN2YWwpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdmFsID49IHNlbGYtPm1heHZhbHVlKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNlbWFwaG9yZSBvciBsb2NrICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsZWFzZWQgdG9vIG1hbnkgdGltZXMiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYKLQl9CisgICAgfQogCi0JaWYgKHNlbV9wb3N0KHNlbGYtPmhhbmRsZSkgPCAwKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgIGlmIChzZW1fcG9zdChzZWxmLT5oYW5kbGUpIDwgMCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKIAotCS0tc2VsZi0+Y291bnQ7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgLS1zZWxmLT5jb3VudDsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogI2VuZGlmIC8qICFNU19XSU5ET1dTICovCkBAIC00MDEsMTExICs0MDEsMTExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmV3c2VtbG9ja29iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFNFTV9IQU5ETEUgaGFuZGxlLCBpbnQga2luZCwgaW50IG1heHZhbHVlKQogewotCVNlbUxvY2tPYmplY3QgKnNlbGY7CisgICAgU2VtTG9ja09iamVjdCAqc2VsZjsKIAotCXNlbGYgPSBQeU9iamVjdF9OZXcoU2VtTG9ja09iamVjdCwgdHlwZSk7Ci0JaWYgKCFzZWxmKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5oYW5kbGUgPSBoYW5kbGU7Ci0Jc2VsZi0+a2luZCA9IGtpbmQ7Ci0Jc2VsZi0+Y291bnQgPSAwOwotCXNlbGYtPmxhc3RfdGlkID0gMDsKLQlzZWxmLT5tYXh2YWx1ZSA9IG1heHZhbHVlOwotCXJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhTZW1Mb2NrT2JqZWN0LCB0eXBlKTsKKyAgICBpZiAoIXNlbGYpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPmhhbmRsZSA9IGhhbmRsZTsKKyAgICBzZWxmLT5raW5kID0ga2luZDsKKyAgICBzZWxmLT5jb3VudCA9IDA7CisgICAgc2VsZi0+bGFzdF90aWQgPSAwOworICAgIHNlbGYtPm1heHZhbHVlID0gbWF4dmFsdWU7CisgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbWxvY2tfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWNoYXIgYnVmZmVyWzI1Nl07Ci0JU0VNX0hBTkRMRSBoYW5kbGUgPSBTRU1fRkFJTEVEOwotCWludCBraW5kLCBtYXh2YWx1ZSwgdmFsdWU7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImtpbmQiLCAidmFsdWUiLCAibWF4dmFsdWUiLCBOVUxMfTsKLQlzdGF0aWMgaW50IGNvdW50ZXIgPSAwOworICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgU0VNX0hBTkRMRSBoYW5kbGUgPSBTRU1fRkFJTEVEOworICAgIGludCBraW5kLCBtYXh2YWx1ZSwgdmFsdWU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImtpbmQiLCAidmFsdWUiLCAibWF4dmFsdWUiLCBOVUxMfTsKKyAgICBzdGF0aWMgaW50IGNvdW50ZXIgPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgImlpaSIsIGt3bGlzdCwgCi0JCQkJCSAma2luZCwgJnZhbHVlLCAmbWF4dmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiaWlpIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZraW5kLCAmdmFsdWUsICZtYXh2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGtpbmQgIT0gUkVDVVJTSVZFX01VVEVYICYmIGtpbmQgIT0gU0VNQVBIT1JFKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidW5yZWNvZ25pemVkIGtpbmQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChraW5kICE9IFJFQ1VSU0lWRV9NVVRFWCAmJiBraW5kICE9IFNFTUFQSE9SRSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInVucmVjb2duaXplZCBraW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIi9tcCVkLSVkIiwgZ2V0cGlkKCksIGNvdW50ZXIrKyk7CisgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiL21wJWQtJWQiLCBnZXRwaWQoKSwgY291bnRlcisrKTsKIAotCVNFTV9DTEVBUl9FUlJPUigpOwotCWhhbmRsZSA9IFNFTV9DUkVBVEUoYnVmZmVyLCB2YWx1ZSwgbWF4dmFsdWUpOwotCS8qIE9uIFdpbmRvd3Mgd2Ugc2hvdWxkIGZhaWwgaWYgR2V0TGFzdEVycm9yKCk9PUVSUk9SX0FMUkVBRFlfRVhJU1RTICovCi0JaWYgKGhhbmRsZSA9PSBTRU1fRkFJTEVEIHx8IFNFTV9HRVRfTEFTVF9FUlJPUigpICE9IDApCi0JCWdvdG8gZmFpbHVyZTsKKyAgICBTRU1fQ0xFQVJfRVJST1IoKTsKKyAgICBoYW5kbGUgPSBTRU1fQ1JFQVRFKGJ1ZmZlciwgdmFsdWUsIG1heHZhbHVlKTsKKyAgICAvKiBPbiBXaW5kb3dzIHdlIHNob3VsZCBmYWlsIGlmIEdldExhc3RFcnJvcigpPT1FUlJPUl9BTFJFQURZX0VYSVNUUyAqLworICAgIGlmIChoYW5kbGUgPT0gU0VNX0ZBSUxFRCB8fCBTRU1fR0VUX0xBU1RfRVJST1IoKSAhPSAwKQorICAgICAgICBnb3RvIGZhaWx1cmU7CiAKLQlpZiAoU0VNX1VOTElOSyhidWZmZXIpIDwgMCkKLQkJZ290byBmYWlsdXJlOworICAgIGlmIChTRU1fVU5MSU5LKGJ1ZmZlcikgPCAwKQorICAgICAgICBnb3RvIGZhaWx1cmU7CiAKLQlyZXN1bHQgPSBuZXdzZW1sb2Nrb2JqZWN0KHR5cGUsIGhhbmRsZSwga2luZCwgbWF4dmFsdWUpOwotCWlmICghcmVzdWx0KQotCQlnb3RvIGZhaWx1cmU7CisgICAgcmVzdWx0ID0gbmV3c2VtbG9ja29iamVjdCh0eXBlLCBoYW5kbGUsIGtpbmQsIG1heHZhbHVlKTsKKyAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgZ290byBmYWlsdXJlOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogCiAgIGZhaWx1cmU6Ci0JaWYgKGhhbmRsZSAhPSBTRU1fRkFJTEVEKQotCQlTRU1fQ0xPU0UoaGFuZGxlKTsKLQltcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGhhbmRsZSAhPSBTRU1fRkFJTEVEKQorICAgICAgICBTRU1fQ0xPU0UoaGFuZGxlKTsKKyAgICBtcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZW1sb2NrX3JlYnVpbGQoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncykKIHsKLQlTRU1fSEFORExFIGhhbmRsZTsKLQlpbnQga2luZCwgbWF4dmFsdWU7CisgICAgU0VNX0hBTkRMRSBoYW5kbGU7CisgICAgaW50IGtpbmQsIG1heHZhbHVlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfU0VNX0hBTkRMRSAiaWkiLCAKLQkJCSAgICAgICZoYW5kbGUsICZraW5kLCAmbWF4dmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9TRU1fSEFORExFICJpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGUsICZraW5kLCAmbWF4dmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBuZXdzZW1sb2Nrb2JqZWN0KHR5cGUsIGhhbmRsZSwga2luZCwgbWF4dmFsdWUpOworICAgIHJldHVybiBuZXdzZW1sb2Nrb2JqZWN0KHR5cGUsIGhhbmRsZSwga2luZCwgbWF4dmFsdWUpOwogfQogCiBzdGF0aWMgdm9pZAogc2VtbG9ja19kZWFsbG9jKFNlbUxvY2tPYmplY3QqIHNlbGYpCiB7Ci0JaWYgKHNlbGYtPmhhbmRsZSAhPSBTRU1fRkFJTEVEKQotCQlTRU1fQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKHNlbGYtPmhhbmRsZSAhPSBTRU1fRkFJTEVEKQorICAgICAgICBTRU1fQ0xPU0Uoc2VsZi0+aGFuZGxlKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZW1sb2NrX2NvdW50KFNlbUxvY2tPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPmNvdW50KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc2VsZi0+Y291bnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19pc21pbmUoU2VtTG9ja09iamVjdCAqc2VsZikKIHsKLQkvKiBvbmx5IG1ha2VzIHNlbnNlIGZvciBhIGxvY2sgKi8KLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKElTTUlORShzZWxmKSk7CisgICAgLyogb25seSBtYWtlcyBzZW5zZSBmb3IgYSBsb2NrICovCisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhJU01JTkUoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19nZXR2YWx1ZShTZW1Mb2NrT2JqZWN0ICpzZWxmKQogewogI2lmIEhBVkVfQlJPS0VOX1NFTV9HRVRWQUxVRQotCVB5RXJyX1NldE5vbmUoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yKTsKKyAgICByZXR1cm4gTlVMTDsKICNlbHNlCi0JaW50IHN2YWw7Ci0JaWYgKFNFTV9HRVRWQUxVRShzZWxmLT5oYW5kbGUsICZzdmFsKSA8IDApCi0JCXJldHVybiBtcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7Ci0JLyogc29tZSBwb3NpeCBpbXBsZW1lbnRhdGlvbnMgdXNlIG5lZ2F0aXZlIG51bWJlcnMgdG8gaW5kaWNhdGUgCi0JICAgdGhlIG51bWJlciBvZiB3YWl0aW5nIHRocmVhZHMgKi8KLQlpZiAoc3ZhbCA8IDApCi0JCXN2YWwgPSAwOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzdmFsKTsKKyAgICBpbnQgc3ZhbDsKKyAgICBpZiAoU0VNX0dFVFZBTFVFKHNlbGYtPmhhbmRsZSwgJnN2YWwpIDwgMCkKKyAgICAgICAgcmV0dXJuIG1wX1NldEVycm9yKE5VTEwsIE1QX1NUQU5EQVJEX0VSUk9SKTsKKyAgICAvKiBzb21lIHBvc2l4IGltcGxlbWVudGF0aW9ucyB1c2UgbmVnYXRpdmUgbnVtYmVycyB0byBpbmRpY2F0ZQorICAgICAgIHRoZSBudW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzICovCisgICAgaWYgKHN2YWwgPCAwKQorICAgICAgICBzdmFsID0gMDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc3ZhbCk7CiAjZW5kaWYKIH0KIApAQCAtNTEzLDI4ICs1MTMsMjggQEAKIHNlbWxvY2tfaXN6ZXJvKFNlbUxvY2tPYmplY3QgKnNlbGYpCiB7CiAjaWYgSEFWRV9CUk9LRU5fU0VNX0dFVFZBTFVFCi0JaWYgKHNlbV90cnl3YWl0KHNlbGYtPmhhbmRsZSkgPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFQUdBSU4pCi0JCQlQeV9SRVRVUk5fVFJVRTsKLQkJcmV0dXJuIG1wX1NldEVycm9yKE5VTEwsIE1QX1NUQU5EQVJEX0VSUk9SKTsKLQl9IGVsc2UgewotCQlpZiAoc2VtX3Bvc3Qoc2VsZi0+aGFuZGxlKSA8IDApCi0JCQlyZXR1cm4gbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOwotCQlQeV9SRVRVUk5fRkFMU0U7Ci0JfQorICAgIGlmIChzZW1fdHJ5d2FpdChzZWxmLT5oYW5kbGUpIDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKQorICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgIHJldHVybiBtcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNlbV9wb3N0KHNlbGYtPmhhbmRsZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIG1wX1NldEVycm9yKE5VTEwsIE1QX1NUQU5EQVJEX0VSUk9SKTsKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KICNlbHNlCi0JaW50IHN2YWw7Ci0JaWYgKFNFTV9HRVRWQUxVRShzZWxmLT5oYW5kbGUsICZzdmFsKSA8IDApCi0JCXJldHVybiBtcF9TZXRFcnJvcihOVUxMLCBNUF9TVEFOREFSRF9FUlJPUik7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylzdmFsID09IDApOworICAgIGludCBzdmFsOworICAgIGlmIChTRU1fR0VUVkFMVUUoc2VsZi0+aGFuZGxlLCAmc3ZhbCkgPCAwKQorICAgICAgICByZXR1cm4gbXBfU2V0RXJyb3IoTlVMTCwgTVBfU1RBTkRBUkRfRVJST1IpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpc3ZhbCA9PSAwKTsKICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2VtbG9ja19hZnRlcmZvcmsoU2VtTG9ja09iamVjdCAqc2VsZikKIHsKLQlzZWxmLT5jb3VudCA9IDA7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgc2VsZi0+Y291bnQgPSAwOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiAvKgpAQCAtNTQyLDI3ICs1NDIsMjcgQEAKICAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgc2VtbG9ja19tZXRob2RzW10gPSB7Ci0JeyJhY3F1aXJlIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfYWNxdWlyZSwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkgImFjcXVpcmUgdGhlIHNlbWFwaG9yZS9sb2NrIn0sCi0JeyJyZWxlYXNlIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfcmVsZWFzZSwgTUVUSF9OT0FSR1MsIAotCSAicmVsZWFzZSB0aGUgc2VtYXBob3JlL2xvY2sifSwKKyAgICB7ImFjcXVpcmUiLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19hY3F1aXJlLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAiYWNxdWlyZSB0aGUgc2VtYXBob3JlL2xvY2sifSwKKyAgICB7InJlbGVhc2UiLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19yZWxlYXNlLCBNRVRIX05PQVJHUywKKyAgICAgInJlbGVhc2UgdGhlIHNlbWFwaG9yZS9sb2NrIn0sCiAgICAgeyJfX2VudGVyX18iLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19hY3F1aXJlLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCSAiZW50ZXIgdGhlIHNlbWFwaG9yZS9sb2NrIn0sCi0JeyJfX2V4aXRfXyIsIChQeUNGdW5jdGlvbilzZW1sb2NrX3JlbGVhc2UsIE1FVEhfVkFSQVJHUywgCi0JICJleGl0IHRoZSBzZW1hcGhvcmUvbG9jayJ9LAotCXsiX2NvdW50IiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfY291bnQsIE1FVEhfTk9BUkdTLCAKLQkgIm51bSBvZiBgYWNxdWlyZSgpYHMgbWludXMgbnVtIG9mIGByZWxlYXNlKClgcyBmb3IgdGhpcyBwcm9jZXNzIn0sCi0JeyJfaXNfbWluZSIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2lzbWluZSwgTUVUSF9OT0FSR1MsIAotCSAid2hldGhlciB0aGUgbG9jayBpcyBvd25lZCBieSB0aGlzIHRocmVhZCJ9LAotCXsiX2dldF92YWx1ZSIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2dldHZhbHVlLCBNRVRIX05PQVJHUywgCi0JICJnZXQgdGhlIHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUifSwgCi0JeyJfaXNfemVybyIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2lzemVybywgTUVUSF9OT0FSR1MsIAotCSAicmV0dXJucyB3aGV0aGVyIHNlbWFwaG9yZSBoYXMgdmFsdWUgemVybyJ9LCAKLQl7Il9yZWJ1aWxkIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfcmVidWlsZCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywgCi0JICIifSwgCi0JeyJfYWZ0ZXJfZm9yayIsIChQeUNGdW5jdGlvbilzZW1sb2NrX2FmdGVyZm9yaywgTUVUSF9OT0FSR1MsCi0JICJyZXplcm8gdGhlIG5ldCBhY3F1aXNpdGlvbiBjb3VudCBhZnRlciBmb3JrKCkifSwKLQl7TlVMTH0KKyAgICAgImVudGVyIHRoZSBzZW1hcGhvcmUvbG9jayJ9LAorICAgIHsiX19leGl0X18iLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19yZWxlYXNlLCBNRVRIX1ZBUkFSR1MsCisgICAgICJleGl0IHRoZSBzZW1hcGhvcmUvbG9jayJ9LAorICAgIHsiX2NvdW50IiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfY291bnQsIE1FVEhfTk9BUkdTLAorICAgICAibnVtIG9mIGBhY3F1aXJlKClgcyBtaW51cyBudW0gb2YgYHJlbGVhc2UoKWBzIGZvciB0aGlzIHByb2Nlc3MifSwKKyAgICB7Il9pc19taW5lIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfaXNtaW5lLCBNRVRIX05PQVJHUywKKyAgICAgIndoZXRoZXIgdGhlIGxvY2sgaXMgb3duZWQgYnkgdGhpcyB0aHJlYWQifSwKKyAgICB7Il9nZXRfdmFsdWUiLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19nZXR2YWx1ZSwgTUVUSF9OT0FSR1MsCisgICAgICJnZXQgdGhlIHZhbHVlIG9mIHRoZSBzZW1hcGhvcmUifSwKKyAgICB7Il9pc196ZXJvIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfaXN6ZXJvLCBNRVRIX05PQVJHUywKKyAgICAgInJldHVybnMgd2hldGhlciBzZW1hcGhvcmUgaGFzIHZhbHVlIHplcm8ifSwKKyAgICB7Il9yZWJ1aWxkIiwgKFB5Q0Z1bmN0aW9uKXNlbWxvY2tfcmVidWlsZCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywKKyAgICAgIiJ9LAorICAgIHsiX2FmdGVyX2ZvcmsiLCAoUHlDRnVuY3Rpb24pc2VtbG9ja19hZnRlcmZvcmssIE1FVEhfTk9BUkdTLAorICAgICAicmV6ZXJvIHRoZSBuZXQgYWNxdWlzaXRpb24gY291bnQgYWZ0ZXIgZm9yaygpIn0sCisgICAge05VTEx9CiB9OwogCiAvKgpAQCAtNTcwLDEzICs1NzAsMTMgQEAKICAqLwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgc2VtbG9ja19tZW1iZXJzW10gPSB7Ci0JeyJoYW5kbGUiLCBUX1NFTV9IQU5ETEUsIG9mZnNldG9mKFNlbUxvY2tPYmplY3QsIGhhbmRsZSksIFJFQURPTkxZLCAKLQkgIiJ9LAotCXsia2luZCIsIFRfSU5ULCBvZmZzZXRvZihTZW1Mb2NrT2JqZWN0LCBraW5kKSwgUkVBRE9OTFksIAotCSAiIn0sCi0JeyJtYXh2YWx1ZSIsIFRfSU5ULCBvZmZzZXRvZihTZW1Mb2NrT2JqZWN0LCBtYXh2YWx1ZSksIFJFQURPTkxZLCAKLQkgIiJ9LAotCXtOVUxMfQorICAgIHsiaGFuZGxlIiwgVF9TRU1fSEFORExFLCBvZmZzZXRvZihTZW1Mb2NrT2JqZWN0LCBoYW5kbGUpLCBSRUFET05MWSwKKyAgICAgIiJ9LAorICAgIHsia2luZCIsIFRfSU5ULCBvZmZzZXRvZihTZW1Mb2NrT2JqZWN0LCBraW5kKSwgUkVBRE9OTFksCisgICAgICIifSwKKyAgICB7Im1heHZhbHVlIiwgVF9JTlQsIG9mZnNldG9mKFNlbUxvY2tPYmplY3QsIG1heHZhbHVlKSwgUkVBRE9OTFksCisgICAgICIifSwKKyAgICB7TlVMTH0KIH07CiAKIC8qCkBAIC01ODQsNDIgKzU4NCw0MiBAQAogICovCiAKIFB5VHlwZU9iamVjdCBTZW1Mb2NrVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkvKiB0cF9uYW1lICAgICAgICAgICAqLyAiX211bHRpcHJvY2Vzc2luZy5TZW1Mb2NrIiwKLQkvKiB0cF9iYXNpY3NpemUgICAgICAqLyBzaXplb2YoU2VtTG9ja09iamVjdCksCi0JLyogdHBfaXRlbXNpemUgICAgICAgKi8gMCwKLQkvKiB0cF9kZWFsbG9jICAgICAgICAqLyAoZGVzdHJ1Y3RvcilzZW1sb2NrX2RlYWxsb2MsCi0JLyogdHBfcHJpbnQgICAgICAgICAgKi8gMCwKLQkvKiB0cF9nZXRhdHRyICAgICAgICAqLyAwLAotCS8qIHRwX3NldGF0dHIgICAgICAgICovIDAsCi0JLyogdHBfY29tcGFyZSAgICAgICAgKi8gMCwKLQkvKiB0cF9yZXByICAgICAgICAgICAqLyAwLAotCS8qIHRwX2FzX251bWJlciAgICAgICovIDAsCi0JLyogdHBfYXNfc2VxdWVuY2UgICAgKi8gMCwKLQkvKiB0cF9hc19tYXBwaW5nICAgICAqLyAwLAotCS8qIHRwX2hhc2ggICAgICAgICAgICovIDAsCi0JLyogdHBfY2FsbCAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9zdHIgICAgICAgICAgICAqLyAwLAotCS8qIHRwX2dldGF0dHJvICAgICAgICovIDAsCi0JLyogdHBfc2V0YXR0cm8gICAgICAgKi8gMCwKLQkvKiB0cF9hc19idWZmZXIgICAgICAqLyAwLAotCS8qIHRwX2ZsYWdzICAgICAgICAgICovIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsCi0JLyogdHBfZG9jICAgICAgICAgICAgKi8gIlNlbWFwaG9yZS9NdXRleCB0eXBlIiwKLQkvKiB0cF90cmF2ZXJzZSAgICAgICAqLyAwLAotCS8qIHRwX2NsZWFyICAgICAgICAgICovIDAsCi0JLyogdHBfcmljaGNvbXBhcmUgICAgKi8gMCwKLQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLyAwLAotCS8qIHRwX2l0ZXIgICAgICAgICAgICovIDAsCi0JLyogdHBfaXRlcm5leHQgICAgICAgKi8gMCwKLQkvKiB0cF9tZXRob2RzICAgICAgICAqLyBzZW1sb2NrX21ldGhvZHMsCi0JLyogdHBfbWVtYmVycyAgICAgICAgKi8gc2VtbG9ja19tZW1iZXJzLAotCS8qIHRwX2dldHNldCAgICAgICAgICovIDAsCi0JLyogdHBfYmFzZSAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9kaWN0ICAgICAgICAgICAqLyAwLAotCS8qIHRwX2Rlc2NyX2dldCAgICAgICovIDAsCi0JLyogdHBfZGVzY3Jfc2V0ICAgICAgKi8gMCwKLQkvKiB0cF9kaWN0b2Zmc2V0ICAgICAqLyAwLAotCS8qIHRwX2luaXQgICAgICAgICAgICovIDAsCi0JLyogdHBfYWxsb2MgICAgICAgICAgKi8gMCwKLQkvKiB0cF9uZXcgICAgICAgICAgICAqLyBzZW1sb2NrX25ldywKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAvKiB0cF9uYW1lICAgICAgICAgICAqLyAiX211bHRpcHJvY2Vzc2luZy5TZW1Mb2NrIiwKKyAgICAvKiB0cF9iYXNpY3NpemUgICAgICAqLyBzaXplb2YoU2VtTG9ja09iamVjdCksCisgICAgLyogdHBfaXRlbXNpemUgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZWFsbG9jICAgICAgICAqLyAoZGVzdHJ1Y3RvcilzZW1sb2NrX2RlYWxsb2MsCisgICAgLyogdHBfcHJpbnQgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRhdHRyICAgICAgICAqLyAwLAorICAgIC8qIHRwX3NldGF0dHIgICAgICAgICovIDAsCisgICAgLyogdHBfY29tcGFyZSAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9yZXByICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2FzX251bWJlciAgICAgICovIDAsCisgICAgLyogdHBfYXNfc2VxdWVuY2UgICAgKi8gMCwKKyAgICAvKiB0cF9hc19tYXBwaW5nICAgICAqLyAwLAorICAgIC8qIHRwX2hhc2ggICAgICAgICAgICovIDAsCisgICAgLyogdHBfY2FsbCAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9zdHIgICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2dldGF0dHJvICAgICAgICovIDAsCisgICAgLyogdHBfc2V0YXR0cm8gICAgICAgKi8gMCwKKyAgICAvKiB0cF9hc19idWZmZXIgICAgICAqLyAwLAorICAgIC8qIHRwX2ZsYWdzICAgICAgICAgICovIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsCisgICAgLyogdHBfZG9jICAgICAgICAgICAgKi8gIlNlbWFwaG9yZS9NdXRleCB0eXBlIiwKKyAgICAvKiB0cF90cmF2ZXJzZSAgICAgICAqLyAwLAorICAgIC8qIHRwX2NsZWFyICAgICAgICAgICovIDAsCisgICAgLyogdHBfcmljaGNvbXBhcmUgICAgKi8gMCwKKyAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLyAwLAorICAgIC8qIHRwX2l0ZXIgICAgICAgICAgICovIDAsCisgICAgLyogdHBfaXRlcm5leHQgICAgICAgKi8gMCwKKyAgICAvKiB0cF9tZXRob2RzICAgICAgICAqLyBzZW1sb2NrX21ldGhvZHMsCisgICAgLyogdHBfbWVtYmVycyAgICAgICAgKi8gc2VtbG9ja19tZW1iZXJzLAorICAgIC8qIHRwX2dldHNldCAgICAgICAgICovIDAsCisgICAgLyogdHBfYmFzZSAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kaWN0ICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2Rlc2NyX2dldCAgICAgICovIDAsCisgICAgLyogdHBfZGVzY3Jfc2V0ICAgICAgKi8gMCwKKyAgICAvKiB0cF9kaWN0b2Zmc2V0ICAgICAqLyAwLAorICAgIC8qIHRwX2luaXQgICAgICAgICAgICovIDAsCisgICAgLyogdHBfYWxsb2MgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9uZXcgICAgICAgICAgICAqLyBzZW1sb2NrX25ldywKIH07CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvc29ja2V0X2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zb2NrZXRfY29ubmVjdGlvbi5jCmluZGV4IGFkNDAwNWIuLjdlYmYzMzggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zb2NrZXRfY29ubmVjdGlvbi5jCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9zb2NrZXRfY29ubmVjdGlvbi5jCkBAIC0yNSw0NSArMjUsNDUgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBfY29ubl9zZW5kYWxsKEhBTkRMRSBoLCBjaGFyICpzdHJpbmcsIHNpemVfdCBsZW5ndGgpCiB7Ci0JY2hhciAqcCA9IHN0cmluZzsKLQlQeV9zc2l6ZV90IHJlczsKKyAgICBjaGFyICpwID0gc3RyaW5nOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0Jd2hpbGUgKGxlbmd0aCA+IDApIHsKLQkJcmVzID0gV1JJVEUoaCwgcCwgbGVuZ3RoKTsKLQkJaWYgKHJlcyA8IDApCi0JCQlyZXR1cm4gTVBfU09DS0VUX0VSUk9SOwotCQlsZW5ndGggLT0gcmVzOwotCQlwICs9IHJlczsKLQl9CisgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgcmVzID0gV1JJVEUoaCwgcCwgbGVuZ3RoKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gTVBfU09DS0VUX0VSUk9SOworICAgICAgICBsZW5ndGggLT0gcmVzOworICAgICAgICBwICs9IHJlczsKKyAgICB9CiAKLQlyZXR1cm4gTVBfU1VDQ0VTUzsKKyAgICByZXR1cm4gTVBfU1VDQ0VTUzsKIH0KIAogLyoKLSAqIFJlY2VpdmUgc3RyaW5nIG9mIGV4YWN0IGxlbmd0aCBmcm9tIGZpbGUgZGVzY3JpcHRvciAKKyAqIFJlY2VpdmUgc3RyaW5nIG9mIGV4YWN0IGxlbmd0aCBmcm9tIGZpbGUgZGVzY3JpcHRvcgogICovCiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBfY29ubl9yZWN2YWxsKEhBTkRMRSBoLCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW5ndGgpCiB7Ci0Jc2l6ZV90IHJlbWFpbmluZyA9IGxlbmd0aDsKLQlQeV9zc2l6ZV90IHRlbXA7Ci0JY2hhciAqcCA9IGJ1ZmZlcjsKKyAgICBzaXplX3QgcmVtYWluaW5nID0gbGVuZ3RoOworICAgIFB5X3NzaXplX3QgdGVtcDsKKyAgICBjaGFyICpwID0gYnVmZmVyOwogCi0Jd2hpbGUgKHJlbWFpbmluZyA+IDApIHsKLQkJdGVtcCA9IFJFQUQoaCwgcCwgcmVtYWluaW5nKTsKLQkJaWYgKHRlbXAgPD0gMCkgewotCQkJaWYgKHRlbXAgPT0gMCkKLQkJCQlyZXR1cm4gcmVtYWluaW5nID09IGxlbmd0aCA/IAotCQkJCQlNUF9FTkRfT0ZfRklMRSA6IE1QX0VBUkxZX0VORF9PRl9GSUxFOwotCQkJZWxzZQotCQkJCXJldHVybiB0ZW1wOwotCQl9Ci0JCXJlbWFpbmluZyAtPSB0ZW1wOwotCQlwICs9IHRlbXA7Ci0JfQorICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgIHRlbXAgPSBSRUFEKGgsIHAsIHJlbWFpbmluZyk7CisgICAgICAgIGlmICh0ZW1wIDw9IDApIHsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZyA9PSBsZW5ndGggPworICAgICAgICAgICAgICAgICAgICBNUF9FTkRfT0ZfRklMRSA6IE1QX0VBUkxZX0VORF9PRl9GSUxFOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wOworICAgICAgICB9CisgICAgICAgIHJlbWFpbmluZyAtPSB0ZW1wOworICAgICAgICBwICs9IHRlbXA7CisgICAgfQogCi0JcmV0dXJuIE1QX1NVQ0NFU1M7CisgICAgcmV0dXJuIE1QX1NVQ0NFU1M7CiB9CiAKIC8qCkBAIC03MywzOCArNzMsMzggQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBjb25uX3NlbmRfc3RyaW5nKENvbm5lY3Rpb25PYmplY3QgKmNvbm4sIGNoYXIgKnN0cmluZywgc2l6ZV90IGxlbmd0aCkKIHsKLQlQeV9zc2l6ZV90IHJlczsKLQkvKiBUaGUgImhlYWRlciIgb2YgdGhlIG1lc3NhZ2UgaXMgYSAzMiBiaXQgdW5zaWduZWQgbnVtYmVyIChpbgotCSAgIG5ldHdvcmsgb3JkZXIpIHdoaWNoIHNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIHRoZSAiYm9keSIuICBJZgotCSAgIHRoZSBtZXNzYWdlIGlzIHNob3J0ZXIgdGhhbiBhYm91dCAxNmtiIHRoZW4gaXQgaXMgcXVpY2tlciB0bwotCSAgIGNvbWJpbmUgdGhlICJoZWFkZXIiIGFuZCB0aGUgImJvZHkiIG9mIHRoZSBtZXNzYWdlIGFuZCBzZW5kCi0JICAgdGhlbSBhdCBvbmNlLiAqLwotCWlmIChsZW5ndGggPCAoMTYqMTAyNCkpIHsKLQkJY2hhciAqbWVzc2FnZTsKKyAgICBQeV9zc2l6ZV90IHJlczsKKyAgICAvKiBUaGUgImhlYWRlciIgb2YgdGhlIG1lc3NhZ2UgaXMgYSAzMiBiaXQgdW5zaWduZWQgbnVtYmVyIChpbgorICAgICAgIG5ldHdvcmsgb3JkZXIpIHdoaWNoIHNwZWNpZmllcyB0aGUgbGVuZ3RoIG9mIHRoZSAiYm9keSIuICBJZgorICAgICAgIHRoZSBtZXNzYWdlIGlzIHNob3J0ZXIgdGhhbiBhYm91dCAxNmtiIHRoZW4gaXQgaXMgcXVpY2tlciB0bworICAgICAgIGNvbWJpbmUgdGhlICJoZWFkZXIiIGFuZCB0aGUgImJvZHkiIG9mIHRoZSBtZXNzYWdlIGFuZCBzZW5kCisgICAgICAgdGhlbSBhdCBvbmNlLiAqLworICAgIGlmIChsZW5ndGggPCAoMTYqMTAyNCkpIHsKKyAgICAgICAgY2hhciAqbWVzc2FnZTsKIAotCQltZXNzYWdlID0gUHlNZW1fTWFsbG9jKGxlbmd0aCs0KTsKLQkJaWYgKG1lc3NhZ2UgPT0gTlVMTCkKLQkJCXJldHVybiBNUF9NRU1PUllfRVJST1I7CisgICAgICAgIG1lc3NhZ2UgPSBQeU1lbV9NYWxsb2MobGVuZ3RoKzQpOworICAgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE1QX01FTU9SWV9FUlJPUjsKIAotCQkqKFVJTlQzMiopbWVzc2FnZSA9IGh0b25sKChVSU5UMzIpbGVuZ3RoKTsgICAgIAotCQltZW1jcHkobWVzc2FnZSs0LCBzdHJpbmcsIGxlbmd0aCk7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJcmVzID0gX2Nvbm5fc2VuZGFsbChjb25uLT5oYW5kbGUsIG1lc3NhZ2UsIGxlbmd0aCs0KTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJUHlNZW1fRnJlZShtZXNzYWdlKTsKLQl9IGVsc2UgewotCQlVSU5UMzIgbGVuYnVmZjsKKyAgICAgICAgKihVSU5UMzIqKW1lc3NhZ2UgPSBodG9ubCgoVUlOVDMyKWxlbmd0aCk7CisgICAgICAgIG1lbWNweShtZXNzYWdlKzQsIHN0cmluZywgbGVuZ3RoKTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXMgPSBfY29ubl9zZW5kYWxsKGNvbm4tPmhhbmRsZSwgbWVzc2FnZSwgbGVuZ3RoKzQpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBQeU1lbV9GcmVlKG1lc3NhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIFVJTlQzMiBsZW5idWZmOwogCi0JCWlmIChsZW5ndGggPiBNQVhfTUVTU0FHRV9MRU5HVEgpCi0JCQlyZXR1cm4gTVBfQkFEX01FU1NBR0VfTEVOR1RIOworICAgICAgICBpZiAobGVuZ3RoID4gTUFYX01FU1NBR0VfTEVOR1RIKQorICAgICAgICAgICAgcmV0dXJuIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDsKIAotCQlsZW5idWZmID0gaHRvbmwoKFVJTlQzMilsZW5ndGgpOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJlcyA9IF9jb25uX3NlbmRhbGwoY29ubi0+aGFuZGxlLCAoY2hhciopJmxlbmJ1ZmYsIDQpIHx8IAotCQkJX2Nvbm5fc2VuZGFsbChjb25uLT5oYW5kbGUsIHN0cmluZywgbGVuZ3RoKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICAgICAgbGVuYnVmZiA9IGh0b25sKChVSU5UMzIpbGVuZ3RoKTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXMgPSBfY29ubl9zZW5kYWxsKGNvbm4tPmhhbmRsZSwgKGNoYXIqKSZsZW5idWZmLCA0KSB8fAorICAgICAgICAgICAgX2Nvbm5fc2VuZGFsbChjb25uLT5oYW5kbGUsIHN0cmluZywgbGVuZ3RoKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyoKQEAgLTExNCwzOCArMTE0LDM4IEBACiAgKi8KIAogc3RhdGljIFB5X3NzaXplX3QKLWNvbm5fcmVjdl9zdHJpbmcoQ29ubmVjdGlvbk9iamVjdCAqY29ubiwgY2hhciAqYnVmZmVyLCAKLQkJIHNpemVfdCBidWZsZW5ndGgsIGNoYXIgKipuZXdidWZmZXIsIHNpemVfdCBtYXhsZW5ndGgpCitjb25uX3JlY3Zfc3RyaW5nKENvbm5lY3Rpb25PYmplY3QgKmNvbm4sIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1Zmxlbmd0aCwgY2hhciAqKm5ld2J1ZmZlciwgc2l6ZV90IG1heGxlbmd0aCkKIHsKLQlpbnQgcmVzOwotCVVJTlQzMiB1bGVuZ3RoOworICAgIGludCByZXM7CisgICAgVUlOVDMyIHVsZW5ndGg7CiAKLQkqbmV3YnVmZmVyID0gTlVMTDsKKyAgICAqbmV3YnVmZmVyID0gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgKGNoYXIqKSZ1bGVuZ3RoLCA0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gcmVzOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXMgPSBfY29ubl9yZWN2YWxsKGNvbm4tPmhhbmRsZSwgKGNoYXIqKSZ1bGVuZ3RoLCA0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOwogCi0JdWxlbmd0aCA9IG50b2hsKHVsZW5ndGgpOwotCWlmICh1bGVuZ3RoID4gbWF4bGVuZ3RoKQotCQlyZXR1cm4gTVBfQkFEX01FU1NBR0VfTEVOR1RIOworICAgIHVsZW5ndGggPSBudG9obCh1bGVuZ3RoKTsKKyAgICBpZiAodWxlbmd0aCA+IG1heGxlbmd0aCkKKyAgICAgICAgcmV0dXJuIE1QX0JBRF9NRVNTQUdFX0xFTkdUSDsKIAotCWlmICh1bGVuZ3RoIDw9IGJ1Zmxlbmd0aCkgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJlcyA9IF9jb25uX3JlY3ZhbGwoY29ubi0+aGFuZGxlLCBidWZmZXIsIChzaXplX3QpdWxlbmd0aCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCXJldHVybiByZXMgPCAwID8gcmVzIDogdWxlbmd0aDsKLQl9IGVsc2UgewotCQkqbmV3YnVmZmVyID0gUHlNZW1fTWFsbG9jKChzaXplX3QpdWxlbmd0aCk7Ci0JCWlmICgqbmV3YnVmZmVyID09IE5VTEwpCi0JCQlyZXR1cm4gTVBfTUVNT1JZX0VSUk9SOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJlcyA9IF9jb25uX3JlY3ZhbGwoY29ubi0+aGFuZGxlLCAqbmV3YnVmZmVyLCAoc2l6ZV90KXVsZW5ndGgpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlyZXR1cm4gcmVzIDwgMCA/IChQeV9zc2l6ZV90KXJlcyA6IChQeV9zc2l6ZV90KXVsZW5ndGg7Ci0JfQorICAgIGlmICh1bGVuZ3RoIDw9IGJ1Zmxlbmd0aCkgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJlcyA9IF9jb25uX3JlY3ZhbGwoY29ubi0+aGFuZGxlLCBidWZmZXIsIChzaXplX3QpdWxlbmd0aCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHJldHVybiByZXMgPCAwID8gcmVzIDogdWxlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgICAqbmV3YnVmZmVyID0gUHlNZW1fTWFsbG9jKChzaXplX3QpdWxlbmd0aCk7CisgICAgICAgIGlmICgqbmV3YnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTVBfTUVNT1JZX0VSUk9SOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJlcyA9IF9jb25uX3JlY3ZhbGwoY29ubi0+aGFuZGxlLCAqbmV3YnVmZmVyLCAoc2l6ZV90KXVsZW5ndGgpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICByZXR1cm4gcmVzIDwgMCA/IChQeV9zc2l6ZV90KXJlcyA6IChQeV9zc2l6ZV90KXVsZW5ndGg7CisgICAgfQogfQogCiAvKgpAQCAtMTU1LDQxICsxNTUsNDEgQEAKIHN0YXRpYyBpbnQKIGNvbm5fcG9sbChDb25uZWN0aW9uT2JqZWN0ICpjb25uLCBkb3VibGUgdGltZW91dCwgUHlUaHJlYWRTdGF0ZSAqX3NhdmUpCiB7Ci0JaW50IHJlczsKLQlmZF9zZXQgcmZkczsKKyAgICBpbnQgcmVzOworICAgIGZkX3NldCByZmRzOwogCi0JLyoKLQkgKiBWZXJpZnkgdGhlIGhhbmRsZSwgaXNzdWUgMzMyMS4gTm90IHJlcXVpcmVkIGZvciB3aW5kb3dzLgotCSAqLyAKLQkjaWZuZGVmIE1TX1dJTkRPV1MKLQkJaWYgKCgoaW50KWNvbm4tPmhhbmRsZSkgPCAwIHx8ICgoaW50KWNvbm4tPmhhbmRsZSkgPj0gRkRfU0VUU0laRSkgewotCQkJUHlfQkxPQ0tfVEhSRUFEUwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJoYW5kbGUgb3V0IG9mIHJhbmdlIGluIHNlbGVjdCgpIik7Ci0JCQlQeV9VTkJMT0NLX1RIUkVBRFMKLQkJCXJldHVybiBNUF9FWENFUFRJT05fSEFTX0JFRU5fU0VUOwotCQl9Ci0JI2VuZGlmCisgICAgLyoKKyAgICAgKiBWZXJpZnkgdGhlIGhhbmRsZSwgaXNzdWUgMzMyMS4gTm90IHJlcXVpcmVkIGZvciB3aW5kb3dzLgorICAgICAqLworICAgICNpZm5kZWYgTVNfV0lORE9XUworICAgICAgICBpZiAoKChpbnQpY29ubi0+aGFuZGxlKSA8IDAgfHwgKChpbnQpY29ubi0+aGFuZGxlKSA+PSBGRF9TRVRTSVpFKSB7CisgICAgICAgICAgICBQeV9CTE9DS19USFJFQURTCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImhhbmRsZSBvdXQgb2YgcmFuZ2UgaW4gc2VsZWN0KCkiKTsKKyAgICAgICAgICAgIFB5X1VOQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgcmV0dXJuIE1QX0VYQ0VQVElPTl9IQVNfQkVFTl9TRVQ7CisgICAgICAgIH0KKyAgICAjZW5kaWYKIAotCUZEX1pFUk8oJnJmZHMpOwotCUZEX1NFVCgoU09DS0VUKWNvbm4tPmhhbmRsZSwgJnJmZHMpOworICAgIEZEX1pFUk8oJnJmZHMpOworICAgIEZEX1NFVCgoU09DS0VUKWNvbm4tPmhhbmRsZSwgJnJmZHMpOwogCi0JaWYgKHRpbWVvdXQgPCAwLjApIHsKLQkJcmVzID0gc2VsZWN0KChpbnQpY29ubi0+aGFuZGxlKzEsICZyZmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgdGltZXZhbCB0djsKLQkJdHYudHZfc2VjID0gKGxvbmcpdGltZW91dDsKLQkJdHYudHZfdXNlYyA9IChsb25nKSgodGltZW91dCAtIHR2LnR2X3NlYykgKiAxZTYgKyAwLjUpOwotCQlyZXMgPSBzZWxlY3QoKGludCljb25uLT5oYW5kbGUrMSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dik7Ci0JfQorICAgIGlmICh0aW1lb3V0IDwgMC4wKSB7CisgICAgICAgIHJlcyA9IHNlbGVjdCgoaW50KWNvbm4tPmhhbmRsZSsxLCAmcmZkcywgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIHR2LnR2X3NlYyA9IChsb25nKXRpbWVvdXQ7CisgICAgICAgIHR2LnR2X3VzZWMgPSAobG9uZykoKHRpbWVvdXQgLSB0di50dl9zZWMpICogMWU2ICsgMC41KTsKKyAgICAgICAgcmVzID0gc2VsZWN0KChpbnQpY29ubi0+aGFuZGxlKzEsICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworICAgIH0KIAotCWlmIChyZXMgPCAwKSB7Ci0JCXJldHVybiBNUF9TT0NLRVRfRVJST1I7Ci0JfSBlbHNlIGlmIChGRF9JU1NFVChjb25uLT5oYW5kbGUsICZyZmRzKSkgewotCQlyZXR1cm4gVFJVRTsKLQl9IGVsc2UgewotCQlhc3NlcnQocmVzID09IDApOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIHJldHVybiBNUF9TT0NLRVRfRVJST1I7CisgICAgfSBlbHNlIGlmIChGRF9JU1NFVChjb25uLT5oYW5kbGUsICZyZmRzKSkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgICBhc3NlcnQocmVzID09IDApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3dpbjMyX2Z1bmN0aW9ucy5jIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL3dpbjMyX2Z1bmN0aW9ucy5jCmluZGV4IDU0OWMxNTEuLjE2NjZhYTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy93aW4zMl9mdW5jdGlvbnMuYworKysgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3Npbmcvd2luMzJfZnVuY3Rpb25zLmMKQEAgLTE5LDI0OCArMTksMjQ4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfQ2xvc2VIYW5kbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhBTkRMRSBoT2JqZWN0OwotCUJPT0wgc3VjY2VzczsKKyAgICBIQU5ETEUgaE9iamVjdDsKKyAgICBCT09MIHN1Y2Nlc3M7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9IQU5ETEUsICZoT2JqZWN0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfSEFORExFLCAmaE9iamVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXN1Y2Nlc3MgPSBDbG9zZUhhbmRsZShoT2JqZWN0KTsgCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgc3VjY2VzcyA9IENsb3NlSGFuZGxlKGhPYmplY3QpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoIXN1Y2Nlc3MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfQ29ubmVjdE5hbWVkUGlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEFORExFIGhOYW1lZFBpcGU7Ci0JTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZDsKLQlCT09MIHN1Y2Nlc3M7CisgICAgSEFORExFIGhOYW1lZFBpcGU7CisgICAgTFBPVkVSTEFQUEVEIGxwT3ZlcmxhcHBlZDsKKyAgICBCT09MIHN1Y2Nlc3M7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9IQU5ETEUgRl9QT0lOVEVSLCAKLQkJCSAgICAgICZoTmFtZWRQaXBlLCAmbHBPdmVybGFwcGVkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfSEFORExFIEZfUE9JTlRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhOYW1lZFBpcGUsICZscE92ZXJsYXBwZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzdWNjZXNzID0gQ29ubmVjdE5hbWVkUGlwZShoTmFtZWRQaXBlLCBscE92ZXJsYXBwZWQpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHN1Y2Nlc3MgPSBDb25uZWN0TmFtZWRQaXBlKGhOYW1lZFBpcGUsIGxwT3ZlcmxhcHBlZCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICghc3VjY2VzcykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwogCi0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW4zMl9DcmVhdGVGaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlMUENUU1RSIGxwRmlsZU5hbWU7Ci0JRFdPUkQgZHdEZXNpcmVkQWNjZXNzOwotCURXT1JEIGR3U2hhcmVNb2RlOwotCUxQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlczsKLQlEV09SRCBkd0NyZWF0aW9uRGlzcG9zaXRpb247Ci0JRFdPUkQgZHdGbGFnc0FuZEF0dHJpYnV0ZXM7Ci0JSEFORExFIGhUZW1wbGF0ZUZpbGU7Ci0JSEFORExFIGhhbmRsZTsKKyAgICBMUENUU1RSIGxwRmlsZU5hbWU7CisgICAgRFdPUkQgZHdEZXNpcmVkQWNjZXNzOworICAgIERXT1JEIGR3U2hhcmVNb2RlOworICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBscFNlY3VyaXR5QXR0cmlidXRlczsKKyAgICBEV09SRCBkd0NyZWF0aW9uRGlzcG9zaXRpb247CisgICAgRFdPUkQgZHdGbGFnc0FuZEF0dHJpYnV0ZXM7CisgICAgSEFORExFIGhUZW1wbGF0ZUZpbGU7CisgICAgSEFORExFIGhhbmRsZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIgRl9EV09SRCBGX0RXT1JEIEZfUE9JTlRFUiAKLQkJCSAgICAgIEZfRFdPUkQgRl9EV09SRCBGX0hBTkRMRSwKLQkJCSAgICAgICZscEZpbGVOYW1lLCAmZHdEZXNpcmVkQWNjZXNzLCAmZHdTaGFyZU1vZGUsIAotCQkJICAgICAgJmxwU2VjdXJpdHlBdHRyaWJ1dGVzLCAmZHdDcmVhdGlvbkRpc3Bvc2l0aW9uLCAKLQkJCSAgICAgICZkd0ZsYWdzQW5kQXR0cmlidXRlcywgJmhUZW1wbGF0ZUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiIEZfRFdPUkQgRl9EV09SRCBGX1BPSU5URVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRl9EV09SRCBGX0RXT1JEIEZfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbHBGaWxlTmFtZSwgJmR3RGVzaXJlZEFjY2VzcywgJmR3U2hhcmVNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbHBTZWN1cml0eUF0dHJpYnV0ZXMsICZkd0NyZWF0aW9uRGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkd0ZsYWdzQW5kQXR0cmlidXRlcywgJmhUZW1wbGF0ZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQloYW5kbGUgPSBDcmVhdGVGaWxlKGxwRmlsZU5hbWUsIGR3RGVzaXJlZEFjY2VzcywgCi0JCQkgICAgZHdTaGFyZU1vZGUsIGxwU2VjdXJpdHlBdHRyaWJ1dGVzLCAKLQkJCSAgICBkd0NyZWF0aW9uRGlzcG9zaXRpb24sIAotCQkJICAgIGR3RmxhZ3NBbmRBdHRyaWJ1dGVzLCBoVGVtcGxhdGVGaWxlKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBoYW5kbGUgPSBDcmVhdGVGaWxlKGxwRmlsZU5hbWUsIGR3RGVzaXJlZEFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGR3U2hhcmVNb2RlLCBscFNlY3VyaXR5QXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGR3Q3JlYXRpb25EaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3NBbmRBdHRyaWJ1dGVzLCBoVGVtcGxhdGVGaWxlKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKEZfSEFORExFLCBoYW5kbGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKEZfSEFORExFLCBoYW5kbGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfQ3JlYXRlTmFtZWRQaXBlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlMUENUU1RSIGxwTmFtZTsKLQlEV09SRCBkd09wZW5Nb2RlOwotCURXT1JEIGR3UGlwZU1vZGU7Ci0JRFdPUkQgbk1heEluc3RhbmNlczsKLQlEV09SRCBuT3V0QnVmZmVyU2l6ZTsKLQlEV09SRCBuSW5CdWZmZXJTaXplOwotCURXT1JEIG5EZWZhdWx0VGltZU91dDsKLQlMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBTZWN1cml0eUF0dHJpYnV0ZXM7Ci0JSEFORExFIGhhbmRsZTsKKyAgICBMUENUU1RSIGxwTmFtZTsKKyAgICBEV09SRCBkd09wZW5Nb2RlOworICAgIERXT1JEIGR3UGlwZU1vZGU7CisgICAgRFdPUkQgbk1heEluc3RhbmNlczsKKyAgICBEV09SRCBuT3V0QnVmZmVyU2l6ZTsKKyAgICBEV09SRCBuSW5CdWZmZXJTaXplOworICAgIERXT1JEIG5EZWZhdWx0VGltZU91dDsKKyAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBTZWN1cml0eUF0dHJpYnV0ZXM7CisgICAgSEFORExFIGhhbmRsZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIgRl9EV09SRCBGX0RXT1JEIEZfRFdPUkQgCi0JCQkgICAgICBGX0RXT1JEIEZfRFdPUkQgRl9EV09SRCBGX1BPSU5URVIsCi0JCQkgICAgICAmbHBOYW1lLCAmZHdPcGVuTW9kZSwgJmR3UGlwZU1vZGUsIAotCQkJICAgICAgJm5NYXhJbnN0YW5jZXMsICZuT3V0QnVmZmVyU2l6ZSwgCi0JCQkgICAgICAmbkluQnVmZmVyU2l6ZSwgJm5EZWZhdWx0VGltZU91dCwKLQkJCSAgICAgICZscFNlY3VyaXR5QXR0cmlidXRlcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIgRl9EV09SRCBGX0RXT1JEIEZfRFdPUkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRl9EV09SRCBGX0RXT1JEIEZfRFdPUkQgRl9QT0lOVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbHBOYW1lLCAmZHdPcGVuTW9kZSwgJmR3UGlwZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuTWF4SW5zdGFuY2VzLCAmbk91dEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuSW5CdWZmZXJTaXplLCAmbkRlZmF1bHRUaW1lT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbHBTZWN1cml0eUF0dHJpYnV0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQloYW5kbGUgPSBDcmVhdGVOYW1lZFBpcGUobHBOYW1lLCBkd09wZW5Nb2RlLCBkd1BpcGVNb2RlLCAKLQkJCQkgbk1heEluc3RhbmNlcywgbk91dEJ1ZmZlclNpemUsIAotCQkJCSBuSW5CdWZmZXJTaXplLCBuRGVmYXVsdFRpbWVPdXQsCi0JCQkJIGxwU2VjdXJpdHlBdHRyaWJ1dGVzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBoYW5kbGUgPSBDcmVhdGVOYW1lZFBpcGUobHBOYW1lLCBkd09wZW5Nb2RlLCBkd1BpcGVNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTWF4SW5zdGFuY2VzLCBuT3V0QnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkluQnVmZmVyU2l6ZSwgbkRlZmF1bHRUaW1lT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFNlY3VyaXR5QXR0cmlidXRlcyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKKyAgICBpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZShGX0hBTkRMRSwgaGFuZGxlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZShGX0hBTkRMRSwgaGFuZGxlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbjMyX0V4aXRQcm9jZXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlVSU5UIHVFeGl0Q29kZTsKKyAgICBVSU5UIHVFeGl0Q29kZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSSIsICZ1RXhpdENvZGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkkiLCAmdUV4aXRDb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkjaWYgZGVmaW5lZChQeV9ERUJVRykKLQkJU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlN8U0VNX05PQUxJR05NRU5URkFVTFRFWENFUFR8U0VNX05PR1BGQVVMVEVSUk9SQk9YfFNFTV9OT09QRU5GSUxFRVJST1JCT1gpOwotCQlfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX0FTU0VSVCwgX0NSVERCR19NT0RFX0RFQlVHKTsKLQkjZW5kaWYKKyAgICAjaWYgZGVmaW5lZChQeV9ERUJVRykKKyAgICAgICAgU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlN8U0VNX05PQUxJR05NRU5URkFVTFRFWENFUFR8U0VNX05PR1BGQVVMVEVSUk9SQk9YfFNFTV9OT09QRU5GSUxFRVJST1JCT1gpOworICAgICAgICBfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX0FTU0VSVCwgX0NSVERCR19NT0RFX0RFQlVHKTsKKyAgICAjZW5kaWYKIAogCi0JRXhpdFByb2Nlc3ModUV4aXRDb2RlKTsKKyAgICBFeGl0UHJvY2Vzcyh1RXhpdENvZGUpOwogCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW4zMl9HZXRMYXN0RXJyb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKEZfRFdPUkQsIEdldExhc3RFcnJvcigpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZShGX0RXT1JELCBHZXRMYXN0RXJyb3IoKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW4zMl9PcGVuUHJvY2VzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JRFdPUkQgZHdEZXNpcmVkQWNjZXNzOwotCUJPT0wgYkluaGVyaXRIYW5kbGU7Ci0JRFdPUkQgZHdQcm9jZXNzSWQ7Ci0JSEFORExFIGhhbmRsZTsKKyAgICBEV09SRCBkd0Rlc2lyZWRBY2Nlc3M7CisgICAgQk9PTCBiSW5oZXJpdEhhbmRsZTsKKyAgICBEV09SRCBkd1Byb2Nlc3NJZDsKKyAgICBIQU5ETEUgaGFuZGxlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEZfRFdPUkQgImkiIEZfRFdPUkQsIAotCQkJICAgICAgJmR3RGVzaXJlZEFjY2VzcywgJmJJbmhlcml0SGFuZGxlLCAmZHdQcm9jZXNzSWQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgRl9EV09SRCAiaSIgRl9EV09SRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR3RGVzaXJlZEFjY2VzcywgJmJJbmhlcml0SGFuZGxlLCAmZHdQcm9jZXNzSWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWhhbmRsZSA9IE9wZW5Qcm9jZXNzKGR3RGVzaXJlZEFjY2VzcywgYkluaGVyaXRIYW5kbGUsIGR3UHJvY2Vzc0lkKTsgICAgCi0JaWYgKGhhbmRsZSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgaGFuZGxlID0gT3BlblByb2Nlc3MoZHdEZXNpcmVkQWNjZXNzLCBiSW5oZXJpdEhhbmRsZSwgZHdQcm9jZXNzSWQpOworICAgIGlmIChoYW5kbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoRl9IQU5ETEUsIGhhbmRsZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoRl9IQU5ETEUsIGhhbmRsZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW4zMl9TZXROYW1lZFBpcGVIYW5kbGVTdGF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEFORExFIGhOYW1lZFBpcGU7Ci0JUHlPYmplY3QgKm9BcmdzWzNdOwotCURXT1JEIGR3QXJnc1szXSwgKnBBcmdzWzNdID0ge05VTEwsIE5VTEwsIE5VTEx9OwotCWludCBpOworICAgIEhBTkRMRSBoTmFtZWRQaXBlOworICAgIFB5T2JqZWN0ICpvQXJnc1szXTsKKyAgICBEV09SRCBkd0FyZ3NbM10sICpwQXJnc1szXSA9IHtOVUxMLCBOVUxMLCBOVUxMfTsKKyAgICBpbnQgaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX0hBTkRMRSAiT09PIiwgCi0JCQkgICAgICAmaE5hbWVkUGlwZSwgJm9BcmdzWzBdLCAmb0FyZ3NbMV0sICZvQXJnc1syXSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBGX0hBTkRMRSAiT09PIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhOYW1lZFBpcGUsICZvQXJnc1swXSwgJm9BcmdzWzFdLCAmb0FyZ3NbMl0pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5RXJyX0NsZWFyKCk7CisgICAgUHlFcnJfQ2xlYXIoKTsKIAotCWZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgewotCQlpZiAob0FyZ3NbaV0gIT0gUHlfTm9uZSkgewotCQkJZHdBcmdzW2ldID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG9BcmdzW2ldKTsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiBOVUxMOwotCQkJcEFyZ3NbaV0gPSAmZHdBcmdzW2ldOwotCQl9Ci0JfQorICAgIGZvciAoaSA9IDAgOyBpIDwgMyA7IGkrKykgeworICAgICAgICBpZiAob0FyZ3NbaV0gIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgZHdBcmdzW2ldID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG9BcmdzW2ldKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcEFyZ3NbaV0gPSAmZHdBcmdzW2ldOworICAgICAgICB9CisgICAgfQogCi0JaWYgKCFTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZShoTmFtZWRQaXBlLCBwQXJnc1swXSwgcEFyZ3NbMV0sIHBBcmdzWzJdKSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgIGlmICghU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUoaE5hbWVkUGlwZSwgcEFyZ3NbMF0sIHBBcmdzWzFdLCBwQXJnc1syXSkpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycigwKTsKIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd2luMzJfV2FpdE5hbWVkUGlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JTFBDVFNUUiBscE5hbWVkUGlwZU5hbWU7Ci0JRFdPUkQgblRpbWVPdXQ7Ci0JQk9PTCBzdWNjZXNzOworICAgIExQQ1RTVFIgbHBOYW1lZFBpcGVOYW1lOworICAgIERXT1JEIG5UaW1lT3V0OworICAgIEJPT0wgc3VjY2VzczsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIgRl9EV09SRCwgJmxwTmFtZWRQaXBlTmFtZSwgJm5UaW1lT3V0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiBGX0RXT1JELCAmbHBOYW1lZFBpcGVOYW1lLCAmblRpbWVPdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzdWNjZXNzID0gV2FpdE5hbWVkUGlwZShscE5hbWVkUGlwZU5hbWUsIG5UaW1lT3V0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzdWNjZXNzID0gV2FpdE5hbWVkUGlwZShscE5hbWVkUGlwZU5hbWUsIG5UaW1lT3V0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKCFzdWNjZXNzKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHdpbjMyX21ldGhvZHNbXSA9IHsKLQlXSU4zMl9GVU5DVElPTihDbG9zZUhhbmRsZSksCi0JV0lOMzJfRlVOQ1RJT04oR2V0TGFzdEVycm9yKSwKLQlXSU4zMl9GVU5DVElPTihPcGVuUHJvY2VzcyksCi0JV0lOMzJfRlVOQ1RJT04oRXhpdFByb2Nlc3MpLAotCVdJTjMyX0ZVTkNUSU9OKENvbm5lY3ROYW1lZFBpcGUpLAotCVdJTjMyX0ZVTkNUSU9OKENyZWF0ZUZpbGUpLAotCVdJTjMyX0ZVTkNUSU9OKENyZWF0ZU5hbWVkUGlwZSksCi0JV0lOMzJfRlVOQ1RJT04oU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUpLAotCVdJTjMyX0ZVTkNUSU9OKFdhaXROYW1lZFBpcGUpLAotCXtOVUxMfQorICAgIFdJTjMyX0ZVTkNUSU9OKENsb3NlSGFuZGxlKSwKKyAgICBXSU4zMl9GVU5DVElPTihHZXRMYXN0RXJyb3IpLAorICAgIFdJTjMyX0ZVTkNUSU9OKE9wZW5Qcm9jZXNzKSwKKyAgICBXSU4zMl9GVU5DVElPTihFeGl0UHJvY2VzcyksCisgICAgV0lOMzJfRlVOQ1RJT04oQ29ubmVjdE5hbWVkUGlwZSksCisgICAgV0lOMzJfRlVOQ1RJT04oQ3JlYXRlRmlsZSksCisgICAgV0lOMzJfRlVOQ1RJT04oQ3JlYXRlTmFtZWRQaXBlKSwKKyAgICBXSU4zMl9GVU5DVElPTihTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZSksCisgICAgV0lOMzJfRlVOQ1RJT04oV2FpdE5hbWVkUGlwZSksCisgICAge05VTEx9CiB9OwogCiAKIFB5VHlwZU9iamVjdCBXaW4zMlR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCiB9OwogCiAKIFB5T2JqZWN0ICoKIGNyZWF0ZV93aW4zMl9uYW1lc3BhY2Uodm9pZCkKIHsKLQlXaW4zMlR5cGUudHBfbmFtZSA9ICJfbXVsdGlwcm9jZXNzaW5nLndpbjMyIjsKLQlXaW4zMlR5cGUudHBfbWV0aG9kcyA9IHdpbjMyX21ldGhvZHM7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmV2luMzJUeXBlKSA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRigmV2luMzJUeXBlKTsKKyAgICBXaW4zMlR5cGUudHBfbmFtZSA9ICJfbXVsdGlwcm9jZXNzaW5nLndpbjMyIjsKKyAgICBXaW4zMlR5cGUudHBfbWV0aG9kcyA9IHdpbjMyX21ldGhvZHM7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmV2luMzJUeXBlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRigmV2luMzJUeXBlKTsKIAotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX0FMUkVBRFlfRVhJU1RTKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9QSVBFX0JVU1kpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX1BJUEVfQ09OTkVDVEVEKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBFUlJPUl9TRU1fVElNRU9VVCk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgR0VORVJJQ19SRUFEKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBHRU5FUklDX1dSSVRFKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBJTkZJTklURSk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgTk1QV0FJVF9XQUlUX0ZPUkVWRVIpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIE9QRU5fRVhJU1RJTkcpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBJUEVfQUNDRVNTX0RVUExFWCk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9BQ0NFU1NfSU5CT1VORCk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9SRUFETU9ERV9NRVNTQUdFKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX1RZUEVfTUVTU0FHRSk7Ci0JV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTKTsKLQlXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX1dBSVQpOwotCVdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBST0NFU1NfQUxMX0FDQ0VTUyk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgRVJST1JfQUxSRUFEWV9FWElTVFMpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX1BJUEVfQlVTWSk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgRVJST1JfUElQRV9DT05ORUNURUQpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEVSUk9SX1NFTV9USU1FT1VUKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBHRU5FUklDX1JFQUQpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIEdFTkVSSUNfV1JJVEUpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIElORklOSVRFKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBOTVBXQUlUX1dBSVRfRk9SRVZFUik7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgT1BFTl9FWElTVElORyk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUElQRV9BQ0NFU1NfRFVQTEVYKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX0FDQ0VTU19JTkJPVU5EKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX1JFQURNT0RFX01FU1NBR0UpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBJUEVfVFlQRV9NRVNTQUdFKTsKKyAgICBXSU4zMl9DT05TVEFOVChGX0RXT1JELCBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMpOworICAgIFdJTjMyX0NPTlNUQU5UKEZfRFdPUkQsIFBJUEVfV0FJVCk7CisgICAgV0lOMzJfQ09OU1RBTlQoRl9EV09SRCwgUFJPQ0VTU19BTExfQUNDRVNTKTsKIAotCVdJTjMyX0NPTlNUQU5UKCJpIiwgTlVMTCk7CisgICAgV0lOMzJfQ09OU1RBTlQoImkiLCBOVUxMKTsKIAotCXJldHVybiAoUHlPYmplY3QqKSZXaW4zMlR5cGU7CisgICAgcmV0dXJuIChQeU9iamVjdCopJldpbjMyVHlwZTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKaW5kZXggYjQ1ZjI0My4uMmQ4MWRhZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKQEAgLTIsMjMgKzIsMjMgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBUaGUgY29kZSBpbiB0aGlzIG1vZHVsZSB3YXMgYmFzZWQgb24gYSBkb3dubG9hZCBmcm9tOgotCSAgaHR0cDovL3d3dy5tYXRoLmtlaW8uYWMuanAvfm1hdHVtb3RvL01UMjAwMi9lbXQxOTkzN2FyLmh0bWwKKyAgICAgIGh0dHA6Ly93d3cubWF0aC5rZWlvLmFjLmpwL35tYXR1bW90by9NVDIwMDIvZW10MTk5Mzdhci5odG1sCiAKICAgIEl0IHdhcyBtb2RpZmllZCBpbiAyMDAyIGJ5IFJheW1vbmQgSGV0dGluZ2VyIGFzIGZvbGxvd3M6CiAKLQkqIHRoZSBwcmluY2lwYWwgY29tcHV0YXRpb25hbCBsaW5lcyB1bnRvdWNoZWQgZXhjZXB0IGZvciB0YWJiaW5nLgorICAgICogdGhlIHByaW5jaXBhbCBjb21wdXRhdGlvbmFsIGxpbmVzIHVudG91Y2hlZCBleGNlcHQgZm9yIHRhYmJpbmcuCiAKLQkqIHJlbmFtZWQgZ2VucmFuZF9yZXM1MygpIHRvIHJhbmRvbV9yYW5kb20oKSBhbmQgd3JhcHBlZAotCSAgaW4gcHl0aG9uIGNhbGxpbmcvcmV0dXJuIGNvZGUuCisgICAgKiByZW5hbWVkIGdlbnJhbmRfcmVzNTMoKSB0byByYW5kb21fcmFuZG9tKCkgYW5kIHdyYXBwZWQKKyAgICAgIGluIHB5dGhvbiBjYWxsaW5nL3JldHVybiBjb2RlLgogCi0JKiBnZW5yYW5kX2ludDMyKCkgYW5kIHRoZSBoZWxwZXIgZnVuY3Rpb25zLCBpbml0X2dlbnJhbmQoKQotCSAgYW5kIGluaXRfYnlfYXJyYXkoKSwgd2VyZSBkZWNsYXJlZCBzdGF0aWMsIHdyYXBwZWQgaW4KLQkgIFB5dGhvbiBjYWxsaW5nL3JldHVybiBjb2RlLiAgYWxzbywgdGhlaXIgZ2xvYmFsIGRhdGEKLQkgIHJlZmVyZW5jZXMgd2VyZSByZXBsYWNlZCB3aXRoIHN0cnVjdHVyZSByZWZlcmVuY2VzLgorICAgICogZ2VucmFuZF9pbnQzMigpIGFuZCB0aGUgaGVscGVyIGZ1bmN0aW9ucywgaW5pdF9nZW5yYW5kKCkKKyAgICAgIGFuZCBpbml0X2J5X2FycmF5KCksIHdlcmUgZGVjbGFyZWQgc3RhdGljLCB3cmFwcGVkIGluCisgICAgICBQeXRob24gY2FsbGluZy9yZXR1cm4gY29kZS4gIGFsc28sIHRoZWlyIGdsb2JhbCBkYXRhCisgICAgICByZWZlcmVuY2VzIHdlcmUgcmVwbGFjZWQgd2l0aCBzdHJ1Y3R1cmUgcmVmZXJlbmNlcy4KIAotCSogdW51c2VkIGZ1bmN0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCB3ZXJlIGRlbGV0ZWQuCi0JICBuZXcsIG9yaWdpbmFsIEMgcHl0aG9uIGNvZGUgd2FzIGFkZGVkIHRvIGltcGxlbWVudCB0aGUKLQkgIFJhbmRvbSgpIGludGVyZmFjZS4KKyAgICAqIHVudXNlZCBmdW5jdGlvbnMgZnJvbSB0aGUgb3JpZ2luYWwgd2VyZSBkZWxldGVkLgorICAgICAgbmV3LCBvcmlnaW5hbCBDIHB5dGhvbiBjb2RlIHdhcyBhZGRlZCB0byBpbXBsZW1lbnQgdGhlCisgICAgICBSYW5kb20oKSBpbnRlcmZhY2UuCiAKICAgIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2ZXJiYXRpbSBjb21tZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2RlOgogCkBAIC0zNiwxNSArMzYsMTUgQEAKICAgIGFyZSBtZXQ6CiAKICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLQlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCiAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0Jbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAKICAgICAgMy4gVGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotCXByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgotCXBlcm1pc3Npb24uCisgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgICAgcGVybWlzc2lvbi4KIAogICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKQEAgLTY3LDI0ICs2NywyNCBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogI2luY2x1ZGUgIlB5dGhvbi5oIgotI2luY2x1ZGUgPHRpbWUuaD4JCS8qIGZvciBzZWVkaW5nIHRvIGN1cnJlbnQgdGltZSAqLworI2luY2x1ZGUgPHRpbWUuaD4gICAgICAgICAgICAgICAvKiBmb3Igc2VlZGluZyB0byBjdXJyZW50IHRpbWUgKi8KIAogLyogUGVyaW9kIHBhcmFtZXRlcnMgLS0gVGhlc2UgYXJlIGFsbCBtYWdpYy4gIERvbid0IGNoYW5nZS4gKi8KICNkZWZpbmUgTiA2MjQKICNkZWZpbmUgTSAzOTcKLSNkZWZpbmUgTUFUUklYX0EgMHg5OTA4YjBkZlVMCS8qIGNvbnN0YW50IHZlY3RvciBhICovCisjZGVmaW5lIE1BVFJJWF9BIDB4OTkwOGIwZGZVTCAgIC8qIGNvbnN0YW50IHZlY3RvciBhICovCiAjZGVmaW5lIFVQUEVSX01BU0sgMHg4MDAwMDAwMFVMIC8qIG1vc3Qgc2lnbmlmaWNhbnQgdy1yIGJpdHMgKi8KICNkZWZpbmUgTE9XRVJfTUFTSyAweDdmZmZmZmZmVUwgLyogbGVhc3Qgc2lnbmlmaWNhbnQgciBiaXRzICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JdW5zaWduZWQgbG9uZyBzdGF0ZVtOXTsKLQlpbnQgaW5kZXg7CisgICAgUHlPYmplY3RfSEVBRAorICAgIHVuc2lnbmVkIGxvbmcgc3RhdGVbTl07CisgICAgaW50IGluZGV4OwogfSBSYW5kb21PYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUmFuZG9tX1R5cGU7CiAKLSNkZWZpbmUgUmFuZG9tT2JqZWN0X0NoZWNrKHYpCSAgIChQeV9UWVBFKHYpID09ICZSYW5kb21fVHlwZSkKKyNkZWZpbmUgUmFuZG9tT2JqZWN0X0NoZWNrKHYpICAgICAgKFB5X1RZUEUodikgPT0gJlJhbmRvbV9UeXBlKQogCiAKIC8qIFJhbmRvbSBtZXRob2RzICovCkBAIC05NCwyOCArOTQsMjggQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nCiBnZW5yYW5kX2ludDMyKFJhbmRvbU9iamVjdCAqc2VsZikKIHsKLQl1bnNpZ25lZCBsb25nIHk7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFnMDFbMl09ezB4MFVMLCBNQVRSSVhfQX07Ci0JLyogbWFnMDFbeF0gPSB4ICogTUFUUklYX0EgIGZvciB4PTAsMSAqLwotCXVuc2lnbmVkIGxvbmcgKm10OworICAgIHVuc2lnbmVkIGxvbmcgeTsKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBtYWcwMVsyXT17MHgwVUwsIE1BVFJJWF9BfTsKKyAgICAvKiBtYWcwMVt4XSA9IHggKiBNQVRSSVhfQSAgZm9yIHg9MCwxICovCisgICAgdW5zaWduZWQgbG9uZyAqbXQ7CiAKLQltdCA9IHNlbGYtPnN0YXRlOwotCWlmIChzZWxmLT5pbmRleCA+PSBOKSB7IC8qIGdlbmVyYXRlIE4gd29yZHMgYXQgb25lIHRpbWUgKi8KLQkJaW50IGtrOworICAgIG10ID0gc2VsZi0+c3RhdGU7CisgICAgaWYgKHNlbGYtPmluZGV4ID49IE4pIHsgLyogZ2VuZXJhdGUgTiB3b3JkcyBhdCBvbmUgdGltZSAqLworICAgICAgICBpbnQga2s7CiAKLQkJZm9yIChraz0wO2trPE4tTTtraysrKSB7Ci0JCQl5ID0gKG10W2trXSZVUFBFUl9NQVNLKXwobXRba2srMV0mTE9XRVJfTUFTSyk7Ci0JCQltdFtra10gPSBtdFtraytNXSBeICh5ID4+IDEpIF4gbWFnMDFbeSAmIDB4MVVMXTsKLQkJfQotCQlmb3IgKDtrazxOLTE7a2srKykgewotCQkJeSA9IChtdFtra10mVVBQRVJfTUFTSyl8KG10W2trKzFdJkxPV0VSX01BU0spOwotCQkJbXRba2tdID0gbXRba2srKE0tTildIF4gKHkgPj4gMSkgXiBtYWcwMVt5ICYgMHgxVUxdOwotCQl9Ci0JCXkgPSAobXRbTi0xXSZVUFBFUl9NQVNLKXwobXRbMF0mTE9XRVJfTUFTSyk7Ci0JCW10W04tMV0gPSBtdFtNLTFdIF4gKHkgPj4gMSkgXiBtYWcwMVt5ICYgMHgxVUxdOworICAgICAgICBmb3IgKGtrPTA7a2s8Ti1NO2trKyspIHsKKyAgICAgICAgICAgIHkgPSAobXRba2tdJlVQUEVSX01BU0spfChtdFtraysxXSZMT1dFUl9NQVNLKTsKKyAgICAgICAgICAgIG10W2trXSA9IG10W2trK01dIF4gKHkgPj4gMSkgXiBtYWcwMVt5ICYgMHgxVUxdOworICAgICAgICB9CisgICAgICAgIGZvciAoO2trPE4tMTtraysrKSB7CisgICAgICAgICAgICB5ID0gKG10W2trXSZVUFBFUl9NQVNLKXwobXRba2srMV0mTE9XRVJfTUFTSyk7CisgICAgICAgICAgICBtdFtra10gPSBtdFtraysoTS1OKV0gXiAoeSA+PiAxKSBeIG1hZzAxW3kgJiAweDFVTF07CisgICAgICAgIH0KKyAgICAgICAgeSA9IChtdFtOLTFdJlVQUEVSX01BU0spfChtdFswXSZMT1dFUl9NQVNLKTsKKyAgICAgICAgbXRbTi0xXSA9IG10W00tMV0gXiAoeSA+PiAxKSBeIG1hZzAxW3kgJiAweDFVTF07CiAKLQkJc2VsZi0+aW5kZXggPSAwOwotCX0KKyAgICAgICAgc2VsZi0+aW5kZXggPSAwOworICAgIH0KIAogICAgIHkgPSBtdFtzZWxmLT5pbmRleCsrXTsKICAgICB5IF49ICh5ID4+IDExKTsKQEAgLTEzNywzMSArMTM3LDMxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX3JhbmRvbShSYW5kb21PYmplY3QgKnNlbGYpCiB7Ci0JdW5zaWduZWQgbG9uZyBhPWdlbnJhbmRfaW50MzIoc2VsZik+PjUsIGI9Z2VucmFuZF9pbnQzMihzZWxmKT4+NjsKLSAgICAJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoYSo2NzEwODg2NC4wK2IpKigxLjAvOTAwNzE5OTI1NDc0MDk5Mi4wKSk7CisgICAgdW5zaWduZWQgbG9uZyBhPWdlbnJhbmRfaW50MzIoc2VsZik+PjUsIGI9Z2VucmFuZF9pbnQzMihzZWxmKT4+NjsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChhKjY3MTA4ODY0LjArYikqKDEuMC85MDA3MTk5MjU0NzQwOTkyLjApKTsKIH0KIAogLyogaW5pdGlhbGl6ZXMgbXRbTl0gd2l0aCBhIHNlZWQgKi8KIHN0YXRpYyB2b2lkCiBpbml0X2dlbnJhbmQoUmFuZG9tT2JqZWN0ICpzZWxmLCB1bnNpZ25lZCBsb25nIHMpCiB7Ci0JaW50IG10aTsKLQl1bnNpZ25lZCBsb25nICptdDsKKyAgICBpbnQgbXRpOworICAgIHVuc2lnbmVkIGxvbmcgKm10OwogCi0JbXQgPSBzZWxmLT5zdGF0ZTsKLQltdFswXT0gcyAmIDB4ZmZmZmZmZmZVTDsKLQlmb3IgKG10aT0xOyBtdGk8TjsgbXRpKyspIHsKLQkJbXRbbXRpXSA9Ci0JCSgxODEyNDMzMjUzVUwgKiAobXRbbXRpLTFdIF4gKG10W210aS0xXSA+PiAzMCkpICsgbXRpKTsKLQkJLyogU2VlIEtudXRoIFRBT0NQIFZvbDIuIDNyZCBFZC4gUC4xMDYgZm9yIG11bHRpcGxpZXIuICovCi0JCS8qIEluIHRoZSBwcmV2aW91cyB2ZXJzaW9ucywgTVNCcyBvZiB0aGUgc2VlZCBhZmZlY3QgICAqLwotCQkvKiBvbmx5IE1TQnMgb2YgdGhlIGFycmF5IG10W10uIAkJICAgICAgICovCi0JCS8qIDIwMDIvMDEvMDkgbW9kaWZpZWQgYnkgTWFrb3RvIE1hdHN1bW90bwkgICAgICAgKi8KLQkJbXRbbXRpXSAmPSAweGZmZmZmZmZmVUw7Ci0JCS8qIGZvciA+MzIgYml0IG1hY2hpbmVzICovCi0JfQotCXNlbGYtPmluZGV4ID0gbXRpOwotCXJldHVybjsKKyAgICBtdCA9IHNlbGYtPnN0YXRlOworICAgIG10WzBdPSBzICYgMHhmZmZmZmZmZlVMOworICAgIGZvciAobXRpPTE7IG10aTxOOyBtdGkrKykgeworICAgICAgICBtdFttdGldID0KKyAgICAgICAgKDE4MTI0MzMyNTNVTCAqIChtdFttdGktMV0gXiAobXRbbXRpLTFdID4+IDMwKSkgKyBtdGkpOworICAgICAgICAvKiBTZWUgS251dGggVEFPQ1AgVm9sMi4gM3JkIEVkLiBQLjEwNiBmb3IgbXVsdGlwbGllci4gKi8KKyAgICAgICAgLyogSW4gdGhlIHByZXZpb3VzIHZlcnNpb25zLCBNU0JzIG9mIHRoZSBzZWVkIGFmZmVjdCAgICovCisgICAgICAgIC8qIG9ubHkgTVNCcyBvZiB0aGUgYXJyYXkgbXRbXS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qIDIwMDIvMDEvMDkgbW9kaWZpZWQgYnkgTWFrb3RvIE1hdHN1bW90byAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIG10W210aV0gJj0gMHhmZmZmZmZmZlVMOworICAgICAgICAvKiBmb3IgPjMyIGJpdCBtYWNoaW5lcyAqLworICAgIH0KKyAgICBzZWxmLT5pbmRleCA9IG10aTsKKyAgICByZXR1cm47CiB9CiAKIC8qIGluaXRpYWxpemUgYnkgYW4gYXJyYXkgd2l0aCBhcnJheS1sZW5ndGggKi8KQEAgLTE3MCwyOCArMTcwLDI4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5pdF9ieV9hcnJheShSYW5kb21PYmplY3QgKnNlbGYsIHVuc2lnbmVkIGxvbmcgaW5pdF9rZXlbXSwgdW5zaWduZWQgbG9uZyBrZXlfbGVuZ3RoKQogewotCXVuc2lnbmVkIGludCBpLCBqLCBrOwkvKiB3YXMgc2lnbmVkIGluIHRoZSBvcmlnaW5hbCBjb2RlLiBSREggMTIvMTYvMjAwMiAqLwotCXVuc2lnbmVkIGxvbmcgKm10OworICAgIHVuc2lnbmVkIGludCBpLCBqLCBrOyAgICAgICAvKiB3YXMgc2lnbmVkIGluIHRoZSBvcmlnaW5hbCBjb2RlLiBSREggMTIvMTYvMjAwMiAqLworICAgIHVuc2lnbmVkIGxvbmcgKm10OwogCi0JbXQgPSBzZWxmLT5zdGF0ZTsKLQlpbml0X2dlbnJhbmQoc2VsZiwgMTk2NTAyMThVTCk7Ci0JaT0xOyBqPTA7Ci0JayA9IChOPmtleV9sZW5ndGggPyBOIDoga2V5X2xlbmd0aCk7Ci0JZm9yICg7IGs7IGstLSkgewotCQltdFtpXSA9IChtdFtpXSBeICgobXRbaS0xXSBeIChtdFtpLTFdID4+IDMwKSkgKiAxNjY0NTI1VUwpKQotCQkJICsgaW5pdF9rZXlbal0gKyBqOyAvKiBub24gbGluZWFyICovCi0JCW10W2ldICY9IDB4ZmZmZmZmZmZVTDsgLyogZm9yIFdPUkRTSVpFID4gMzIgbWFjaGluZXMgKi8KLQkJaSsrOyBqKys7Ci0JCWlmIChpPj1OKSB7IG10WzBdID0gbXRbTi0xXTsgaT0xOyB9Ci0JCWlmIChqPj1rZXlfbGVuZ3RoKSBqPTA7Ci0JfQotCWZvciAoaz1OLTE7IGs7IGstLSkgewotCQltdFtpXSA9IChtdFtpXSBeICgobXRbaS0xXSBeIChtdFtpLTFdID4+IDMwKSkgKiAxNTY2MDgzOTQxVUwpKQotCQkJIC0gaTsgLyogbm9uIGxpbmVhciAqLwotCQltdFtpXSAmPSAweGZmZmZmZmZmVUw7IC8qIGZvciBXT1JEU0laRSA+IDMyIG1hY2hpbmVzICovCi0JCWkrKzsKLQkJaWYgKGk+PU4pIHsgbXRbMF0gPSBtdFtOLTFdOyBpPTE7IH0KLQl9CisgICAgbXQgPSBzZWxmLT5zdGF0ZTsKKyAgICBpbml0X2dlbnJhbmQoc2VsZiwgMTk2NTAyMThVTCk7CisgICAgaT0xOyBqPTA7CisgICAgayA9IChOPmtleV9sZW5ndGggPyBOIDoga2V5X2xlbmd0aCk7CisgICAgZm9yICg7IGs7IGstLSkgeworICAgICAgICBtdFtpXSA9IChtdFtpXSBeICgobXRbaS0xXSBeIChtdFtpLTFdID4+IDMwKSkgKiAxNjY0NTI1VUwpKQorICAgICAgICAgICAgICAgICArIGluaXRfa2V5W2pdICsgajsgLyogbm9uIGxpbmVhciAqLworICAgICAgICBtdFtpXSAmPSAweGZmZmZmZmZmVUw7IC8qIGZvciBXT1JEU0laRSA+IDMyIG1hY2hpbmVzICovCisgICAgICAgIGkrKzsgaisrOworICAgICAgICBpZiAoaT49TikgeyBtdFswXSA9IG10W04tMV07IGk9MTsgfQorICAgICAgICBpZiAoaj49a2V5X2xlbmd0aCkgaj0wOworICAgIH0KKyAgICBmb3IgKGs9Ti0xOyBrOyBrLS0pIHsKKyAgICAgICAgbXRbaV0gPSAobXRbaV0gXiAoKG10W2ktMV0gXiAobXRbaS0xXSA+PiAzMCkpICogMTU2NjA4Mzk0MVVMKSkKKyAgICAgICAgICAgICAgICAgLSBpOyAvKiBub24gbGluZWFyICovCisgICAgICAgIG10W2ldICY9IDB4ZmZmZmZmZmZVTDsgLyogZm9yIFdPUkRTSVpFID4gMzIgbWFjaGluZXMgKi8KKyAgICAgICAgaSsrOworICAgICAgICBpZiAoaT49TikgeyBtdFswXSA9IG10W04tMV07IGk9MTsgfQorICAgIH0KIAogICAgIG10WzBdID0gMHg4MDAwMDAwMFVMOyAvKiBNU0IgaXMgMTsgYXNzdXJpbmcgbm9uLXplcm8gaW5pdGlhbCBhcnJheSAqLwogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKQEAgLTIwNiwxNjcgKzIwNiwxNjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5kb21fc2VlZChSYW5kb21PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwkvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCi0JUHlPYmplY3QgKm1hc2tsb3dlciA9IE5VTEw7Ci0JUHlPYmplY3QgKnRoaXJ0eXR3byA9IE5VTEw7Ci0JUHlPYmplY3QgKm4gPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgKmtleSA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBrZXltYXg7CQkvKiAjIG9mIGFsbG9jYXRlZCBzbG90cyBpbiBrZXkgKi8KLQl1bnNpZ25lZCBsb25nIGtleXVzZWQ7CQkvKiAjIG9mIHVzZWQgc2xvdHMgaW4ga2V5ICovCi0JaW50IGVycjsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsgICAgICAgICAgICAvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCisgICAgUHlPYmplY3QgKm1hc2tsb3dlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRoaXJ0eXR3byA9IE5VTEw7CisgICAgUHlPYmplY3QgKm4gPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgKmtleSA9IE5VTEw7CisgICAgdW5zaWduZWQgbG9uZyBrZXltYXg7ICAgICAgICAgICAgICAgLyogIyBvZiBhbGxvY2F0ZWQgc2xvdHMgaW4ga2V5ICovCisgICAgdW5zaWduZWQgbG9uZyBrZXl1c2VkOyAgICAgICAgICAgICAgLyogIyBvZiB1c2VkIHNsb3RzIGluIGtleSAqLworICAgIGludCBlcnI7CiAKLQlQeU9iamVjdCAqYXJnID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNlZWQiLCAwLCAxLCAmYXJnKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2VlZCIsIDAsIDEsICZhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChhcmcgPT0gTlVMTCB8fCBhcmcgPT0gUHlfTm9uZSkgewotCQl0aW1lX3Qgbm93OworICAgIGlmIChhcmcgPT0gTlVMTCB8fCBhcmcgPT0gUHlfTm9uZSkgeworICAgICAgICB0aW1lX3Qgbm93OwogCi0JCXRpbWUoJm5vdyk7Ci0JCWluaXRfZ2VucmFuZChzZWxmLCAodW5zaWduZWQgbG9uZylub3cpOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQkvKiBJZiB0aGUgYXJnIGlzIGFuIGludCBvciBsb25nLCB1c2UgaXRzIGFic29sdXRlIHZhbHVlOyBlbHNlIHVzZQotCSAqIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBpdHMgaGFzaCBjb2RlLgotCSAqLwotCWlmIChQeUludF9DaGVjayhhcmcpIHx8IFB5TG9uZ19DaGVjayhhcmcpKQotCQluID0gUHlOdW1iZXJfQWJzb2x1dGUoYXJnKTsKLQllbHNlIHsKLQkJbG9uZyBoYXNoID0gUHlPYmplY3RfSGFzaChhcmcpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCWdvdG8gRG9uZTsKLQkJbiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKWhhc2gpOwotCX0KLQlpZiAobiA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgICAgIHRpbWUoJm5vdyk7CisgICAgICAgIGluaXRfZ2VucmFuZChzZWxmLCAodW5zaWduZWQgbG9uZylub3cpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICAvKiBJZiB0aGUgYXJnIGlzIGFuIGludCBvciBsb25nLCB1c2UgaXRzIGFic29sdXRlIHZhbHVlOyBlbHNlIHVzZQorICAgICAqIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBpdHMgaGFzaCBjb2RlLgorICAgICAqLworICAgIGlmIChQeUludF9DaGVjayhhcmcpIHx8IFB5TG9uZ19DaGVjayhhcmcpKQorICAgICAgICBuID0gUHlOdW1iZXJfQWJzb2x1dGUoYXJnKTsKKyAgICBlbHNlIHsKKyAgICAgICAgbG9uZyBoYXNoID0gUHlPYmplY3RfSGFzaChhcmcpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgbiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKWhhc2gpOworICAgIH0KKyAgICBpZiAobiA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQkvKiBOb3cgc3BsaXQgbiBpbnRvIDMyLWJpdCBjaHVua3MsIGZyb20gdGhlIHJpZ2h0LiAgRWFjaCBwaWVjZSBpcwotCSAqIHN0b3JlZCBpbnRvIGtleSwgd2hpY2ggaGFzIGEgY2FwYWNpdHkgb2Yga2V5bWF4IGNodW5rcywgb2Ygd2hpY2gKLQkgKiBrZXl1c2VkIGFyZSBmaWxsZWQuICBBbGFzLCB0aGUgcmVwZWF0ZWQgc2hpZnRpbmcgbWFrZXMgdGhpcyBhCi0JICogcXVhZHJhdGljLXRpbWUgYWxnb3JpdGhtOyB3ZSdkIHJlYWxseSBsaWtlIHRvIHVzZQotCSAqIF9QeUxvbmdfQXNCeXRlQXJyYXkgaGVyZSwgYnV0IHRoZW4gd2UnZCBoYXZlIHRvIGJyZWFrIGludG8gdGhlCi0JICogbG9uZyByZXByZXNlbnRhdGlvbiB0byBmaWd1cmUgb3V0IGhvdyBiaWcgYW4gYXJyYXkgd2FzIG5lZWRlZAotCSAqIGluIGFkdmFuY2UuCi0JICovCi0Ja2V5bWF4ID0gODsgCS8qIGFyYml0cmFyeTsgZ3Jvd3MgbGF0ZXIgaWYgbmVlZGVkICovCi0Ja2V5dXNlZCA9IDA7Ci0Ja2V5ID0gKHVuc2lnbmVkIGxvbmcgKilQeU1lbV9NYWxsb2Moa2V5bWF4ICogc2l6ZW9mKCprZXkpKTsKLQlpZiAoa2V5ID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICAvKiBOb3cgc3BsaXQgbiBpbnRvIDMyLWJpdCBjaHVua3MsIGZyb20gdGhlIHJpZ2h0LiAgRWFjaCBwaWVjZSBpcworICAgICAqIHN0b3JlZCBpbnRvIGtleSwgd2hpY2ggaGFzIGEgY2FwYWNpdHkgb2Yga2V5bWF4IGNodW5rcywgb2Ygd2hpY2gKKyAgICAgKiBrZXl1c2VkIGFyZSBmaWxsZWQuICBBbGFzLCB0aGUgcmVwZWF0ZWQgc2hpZnRpbmcgbWFrZXMgdGhpcyBhCisgICAgICogcXVhZHJhdGljLXRpbWUgYWxnb3JpdGhtOyB3ZSdkIHJlYWxseSBsaWtlIHRvIHVzZQorICAgICAqIF9QeUxvbmdfQXNCeXRlQXJyYXkgaGVyZSwgYnV0IHRoZW4gd2UnZCBoYXZlIHRvIGJyZWFrIGludG8gdGhlCisgICAgICogbG9uZyByZXByZXNlbnRhdGlvbiB0byBmaWd1cmUgb3V0IGhvdyBiaWcgYW4gYXJyYXkgd2FzIG5lZWRlZAorICAgICAqIGluIGFkdmFuY2UuCisgICAgICovCisgICAga2V5bWF4ID0gODsgICAgICAgICAvKiBhcmJpdHJhcnk7IGdyb3dzIGxhdGVyIGlmIG5lZWRlZCAqLworICAgIGtleXVzZWQgPSAwOworICAgIGtleSA9ICh1bnNpZ25lZCBsb25nICopUHlNZW1fTWFsbG9jKGtleW1heCAqIHNpemVvZigqa2V5KSk7CisgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQltYXNrbG93ZXIgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygweGZmZmZmZmZmVSk7Ci0JaWYgKG1hc2tsb3dlciA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JdGhpcnR5dHdvID0gUHlJbnRfRnJvbUxvbmcoMzJMKTsKLQlpZiAodGhpcnR5dHdvID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl3aGlsZSAoKGVycj1QeU9iamVjdF9Jc1RydWUobikpKSB7Ci0JCVB5T2JqZWN0ICpuZXduOwotCQlQeU9iamVjdCAqcHljaHVuazsKLQkJdW5zaWduZWQgbG9uZyBjaHVuazsKKyAgICBtYXNrbG93ZXIgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygweGZmZmZmZmZmVSk7CisgICAgaWYgKG1hc2tsb3dlciA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgdGhpcnR5dHdvID0gUHlJbnRfRnJvbUxvbmcoMzJMKTsKKyAgICBpZiAodGhpcnR5dHdvID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB3aGlsZSAoKGVycj1QeU9iamVjdF9Jc1RydWUobikpKSB7CisgICAgICAgIFB5T2JqZWN0ICpuZXduOworICAgICAgICBQeU9iamVjdCAqcHljaHVuazsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBjaHVuazsKIAotCQlpZiAoZXJyID09IC0xKQotCQkJZ290byBEb25lOwotCQlweWNodW5rID0gUHlOdW1iZXJfQW5kKG4sIG1hc2tsb3dlcik7Ci0JCWlmIChweWNodW5rID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCWNodW5rID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHB5Y2h1bmspOwotCQlQeV9ERUNSRUYocHljaHVuayk7Ci0JCWlmIChjaHVuayA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJZ290byBEb25lOwotCQluZXduID0gUHlOdW1iZXJfUnNoaWZ0KG4sIHRoaXJ0eXR3byk7Ci0JCWlmIChuZXduID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCVB5X0RFQ1JFRihuKTsKLQkJbiA9IG5ld247Ci0JCWlmIChrZXl1c2VkID49IGtleW1heCkgewotCQkJdW5zaWduZWQgbG9uZyBiaWdnZXIgPSBrZXltYXggPDwgMTsKLQkJCWlmICgoYmlnZ2VyID4+IDEpICE9IGtleW1heCkgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJZ290byBEb25lOwotCQkJfQotCQkJa2V5ID0gKHVuc2lnbmVkIGxvbmcgKilQeU1lbV9SZWFsbG9jKGtleSwKLQkJCQkJCWJpZ2dlciAqIHNpemVvZigqa2V5KSk7Ci0JCQlpZiAoa2V5ID09IE5VTEwpCi0JCQkJZ290byBEb25lOwotCQkJa2V5bWF4ID0gYmlnZ2VyOwotCQl9Ci0JCWFzc2VydChrZXl1c2VkIDwga2V5bWF4KTsKLQkJa2V5W2tleXVzZWQrK10gPSBjaHVuazsKLQl9CisgICAgICAgIGlmIChlcnIgPT0gLTEpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIHB5Y2h1bmsgPSBQeU51bWJlcl9BbmQobiwgbWFza2xvd2VyKTsKKyAgICAgICAgaWYgKHB5Y2h1bmsgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgY2h1bmsgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcocHljaHVuayk7CisgICAgICAgIFB5X0RFQ1JFRihweWNodW5rKTsKKyAgICAgICAgaWYgKGNodW5rID09ICh1bnNpZ25lZCBsb25nKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIG5ld24gPSBQeU51bWJlcl9Sc2hpZnQobiwgdGhpcnR5dHdvKTsKKyAgICAgICAgaWYgKG5ld24gPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgUHlfREVDUkVGKG4pOworICAgICAgICBuID0gbmV3bjsKKyAgICAgICAgaWYgKGtleXVzZWQgPj0ga2V5bWF4KSB7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJpZ2dlciA9IGtleW1heCA8PCAxOworICAgICAgICAgICAgaWYgKChiaWdnZXIgPj4gMSkgIT0ga2V5bWF4KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZXkgPSAodW5zaWduZWQgbG9uZyAqKVB5TWVtX1JlYWxsb2Moa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlnZ2VyICogc2l6ZW9mKCprZXkpKTsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICBrZXltYXggPSBiaWdnZXI7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGtleXVzZWQgPCBrZXltYXgpOworICAgICAgICBrZXlba2V5dXNlZCsrXSA9IGNodW5rOworICAgIH0KIAotCWlmIChrZXl1c2VkID09IDApCi0JCWtleVtrZXl1c2VkKytdID0gMFVMOwotCXJlc3VsdCA9IGluaXRfYnlfYXJyYXkoc2VsZiwga2V5LCBrZXl1c2VkKTsKKyAgICBpZiAoa2V5dXNlZCA9PSAwKQorICAgICAgICBrZXlba2V5dXNlZCsrXSA9IDBVTDsKKyAgICByZXN1bHQgPSBpbml0X2J5X2FycmF5KHNlbGYsIGtleSwga2V5dXNlZCk7CiBEb25lOgotCVB5X1hERUNSRUYobWFza2xvd2VyKTsKLQlQeV9YREVDUkVGKHRoaXJ0eXR3byk7Ci0JUHlfWERFQ1JFRihuKTsKLQlQeU1lbV9GcmVlKGtleSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKG1hc2tsb3dlcik7CisgICAgUHlfWERFQ1JFRih0aGlydHl0d28pOworICAgIFB5X1hERUNSRUYobik7CisgICAgUHlNZW1fRnJlZShrZXkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5kb21fZ2V0c3RhdGUoUmFuZG9tT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpzdGF0ZTsKLQlQeU9iamVjdCAqZWxlbWVudDsKLQlpbnQgaTsKKyAgICBQeU9iamVjdCAqc3RhdGU7CisgICAgUHlPYmplY3QgKmVsZW1lbnQ7CisgICAgaW50IGk7CiAKLQlzdGF0ZSA9IFB5VHVwbGVfTmV3KE4rMSk7Ci0JaWYgKHN0YXRlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaT0wOyBpPE4gOyBpKyspIHsKLQkJZWxlbWVudCA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHNlbGYtPnN0YXRlW2ldKTsKLQkJaWYgKGVsZW1lbnQgPT0gTlVMTCkKLQkJCWdvdG8gRmFpbDsKLQkJUHlUdXBsZV9TRVRfSVRFTShzdGF0ZSwgaSwgZWxlbWVudCk7Ci0JfQotCWVsZW1lbnQgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmluZGV4KSk7Ci0JaWYgKGVsZW1lbnQgPT0gTlVMTCkKLQkJZ290byBGYWlsOwotCVB5VHVwbGVfU0VUX0lURU0oc3RhdGUsIGksIGVsZW1lbnQpOwotCXJldHVybiBzdGF0ZTsKKyAgICBzdGF0ZSA9IFB5VHVwbGVfTmV3KE4rMSk7CisgICAgaWYgKHN0YXRlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaT0wOyBpPE4gOyBpKyspIHsKKyAgICAgICAgZWxlbWVudCA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHNlbGYtPnN0YXRlW2ldKTsKKyAgICAgICAgaWYgKGVsZW1lbnQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShzdGF0ZSwgaSwgZWxlbWVudCk7CisgICAgfQorICAgIGVsZW1lbnQgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpKHNlbGYtPmluZGV4KSk7CisgICAgaWYgKGVsZW1lbnQgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOworICAgIFB5VHVwbGVfU0VUX0lURU0oc3RhdGUsIGksIGVsZW1lbnQpOworICAgIHJldHVybiBzdGF0ZTsKIAogRmFpbDoKLQlQeV9ERUNSRUYoc3RhdGUpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihzdGF0ZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5kb21fc2V0c3RhdGUoUmFuZG9tT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc3RhdGUpCiB7Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBlbGVtZW50OwotCWxvbmcgaW5kZXg7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgbG9uZyBlbGVtZW50OworICAgIGxvbmcgaW5kZXg7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2soc3RhdGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkic3RhdGUgdmVjdG9yIG11c3QgYmUgYSB0dXBsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5VHVwbGVfU2l6ZShzdGF0ZSkgIT0gTisxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJInN0YXRlIHZlY3RvciBpcyB0aGUgd3Jvbmcgc2l6ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHN0YXRlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgInN0YXRlIHZlY3RvciBtdXN0IGJlIGEgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeVR1cGxlX1NpemUoc3RhdGUpICE9IE4rMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJzdGF0ZSB2ZWN0b3IgaXMgdGhlIHdyb25nIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yIChpPTA7IGk8TiA7IGkrKykgewotCQllbGVtZW50ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKFB5VHVwbGVfR0VUX0lURU0oc3RhdGUsIGkpKTsKLQkJaWYgKGVsZW1lbnQgPT0gKHVuc2lnbmVkIGxvbmcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlzZWxmLT5zdGF0ZVtpXSA9IGVsZW1lbnQgJiAweGZmZmZmZmZmVUw7IC8qIE1ha2Ugc3VyZSB3ZSBnZXQgc2FuZSBzdGF0ZSAqLwotCX0KKyAgICBmb3IgKGk9MDsgaTxOIDsgaSsrKSB7CisgICAgICAgIGVsZW1lbnQgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcoUHlUdXBsZV9HRVRfSVRFTShzdGF0ZSwgaSkpOworICAgICAgICBpZiAoZWxlbWVudCA9PSAodW5zaWduZWQgbG9uZyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNlbGYtPnN0YXRlW2ldID0gZWxlbWVudCAmIDB4ZmZmZmZmZmZVTDsgLyogTWFrZSBzdXJlIHdlIGdldCBzYW5lIHN0YXRlICovCisgICAgfQogCi0JaW5kZXggPSBQeUxvbmdfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0oc3RhdGUsIGkpKTsKLQlpZiAoaW5kZXggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+aW5kZXggPSAoaW50KWluZGV4OworICAgIGluZGV4ID0gUHlMb25nX0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHN0YXRlLCBpKSk7CisgICAgaWYgKGluZGV4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPmluZGV4ID0gKGludClpbmRleDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qCkBAIC0zODksNyArMzg5LDcgQEAKIGhhdmUgY2hhbmdpbmcgKGdyb3dpbmcpIHZhbHVlcyBhcyB3ZWxsIGFzIHNodWZmbGVkIHBvc2l0aW9ucy4KIAogRmluYWxseSwgdGhlIHNlbGYtPmluZGV4IHZhbHVlIGlzIHNldCB0byBOIHNvIHRoYXQgdGhlIGdlbmVyYXRvciBpdHNlbGYKLWtpY2tzIGluIG9uIHRoZSBuZXh0IGNhbGwgdG8gcmFuZG9tKCkuCVRoaXMgYXNzdXJlcyB0aGF0IGFsbCByZXN1bHRzCitraWNrcyBpbiBvbiB0aGUgbmV4dCBjYWxsIHRvIHJhbmRvbSgpLiAgVGhpcyBhc3N1cmVzIHRoYXQgYWxsIHJlc3VsdHMKIGhhdmUgYmVlbiB0aHJvdWdoIHRoZSBnZW5lcmF0b3IgYW5kIGRvIG5vdCBqdXN0IHJlZmxlY3QgYWx0ZXJhdGlvbnMgdG8KIHRoZSB1bmRlcmx5aW5nIHN0YXRlLgogKi8KQEAgLTM5NywxNjkgKzM5NywxNjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5kb21fanVtcGFoZWFkKFJhbmRvbU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm4pCiB7Ci0JbG9uZyBpLCBqOwotCVB5T2JqZWN0ICppb2JqOwotCVB5T2JqZWN0ICpyZW1vYmo7Ci0JdW5zaWduZWQgbG9uZyAqbXQsIHRtcDsKKyAgICBsb25nIGksIGo7CisgICAgUHlPYmplY3QgKmlvYmo7CisgICAgUHlPYmplY3QgKnJlbW9iajsKKyAgICB1bnNpZ25lZCBsb25nICptdCwgdG1wOwogCi0JaWYgKCFQeUludF9DaGVjayhuKSAmJiAhUHlMb25nX0NoZWNrKG4pKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJqdW1wYWhlYWQgcmVxdWlyZXMgYW4gIgotCQkJICAgICAiaW50ZWdlciwgbm90ICclcyciLAotCQkJICAgICBQeV9UWVBFKG4pLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlJbnRfQ2hlY2sobikgJiYgIVB5TG9uZ19DaGVjayhuKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAianVtcGFoZWFkIHJlcXVpcmVzIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyLCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG4pLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbXQgPSBzZWxmLT5zdGF0ZTsKLQlmb3IgKGkgPSBOLTE7IGkgPiAxOyBpLS0pIHsKLQkJaW9iaiA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQlpZiAoaW9iaiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlbW9iaiA9IFB5TnVtYmVyX1JlbWFpbmRlcihuLCBpb2JqKTsKLQkJUHlfREVDUkVGKGlvYmopOwotCQlpZiAocmVtb2JqID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaiA9IFB5SW50X0FzTG9uZyhyZW1vYmopOwotCQlQeV9ERUNSRUYocmVtb2JqKTsKLQkJaWYgKGogPT0gLTFMICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJdG1wID0gbXRbaV07Ci0JCW10W2ldID0gbXRbal07Ci0JCW10W2pdID0gdG1wOwotCX0KKyAgICBtdCA9IHNlbGYtPnN0YXRlOworICAgIGZvciAoaSA9IE4tMTsgaSA+IDE7IGktLSkgeworICAgICAgICBpb2JqID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgIGlmIChpb2JqID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVtb2JqID0gUHlOdW1iZXJfUmVtYWluZGVyKG4sIGlvYmopOworICAgICAgICBQeV9ERUNSRUYoaW9iaik7CisgICAgICAgIGlmIChyZW1vYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBqID0gUHlJbnRfQXNMb25nKHJlbW9iaik7CisgICAgICAgIFB5X0RFQ1JFRihyZW1vYmopOworICAgICAgICBpZiAoaiA9PSAtMUwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB0bXAgPSBtdFtpXTsKKyAgICAgICAgbXRbaV0gPSBtdFtqXTsKKyAgICAgICAgbXRbal0gPSB0bXA7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IE47IGkrKykKLQkJbXRbaV0gKz0gaSsxOworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICAgIG10W2ldICs9IGkrMTsKIAotCXNlbGYtPmluZGV4ID0gTjsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2VsZi0+aW5kZXggPSBOOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmRvbV9nZXRyYW5kYml0cyhSYW5kb21PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBrLCBpLCBieXRlczsKLQl1bnNpZ25lZCBsb25nIHI7Ci0JdW5zaWduZWQgY2hhciAqYnl0ZWFycmF5OwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IGssIGksIGJ5dGVzOworICAgIHVuc2lnbmVkIGxvbmcgcjsKKyAgICB1bnNpZ25lZCBjaGFyICpieXRlYXJyYXk7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRyYW5kYml0cyIsICZrKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmdldHJhbmRiaXRzIiwgJmspKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChrIDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm51bWJlciBvZiBiaXRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChrIDw9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIGJpdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlieXRlcyA9ICgoayAtIDEpIC8gMzIgKyAxKSAqIDQ7Ci0JYnl0ZWFycmF5ID0gKHVuc2lnbmVkIGNoYXIgKilQeU1lbV9NYWxsb2MoYnl0ZXMpOwotCWlmIChieXRlYXJyYXkgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYnl0ZXMgPSAoKGsgLSAxKSAvIDMyICsgMSkgKiA0OworICAgIGJ5dGVhcnJheSA9ICh1bnNpZ25lZCBjaGFyICopUHlNZW1fTWFsbG9jKGJ5dGVzKTsKKyAgICBpZiAoYnl0ZWFycmF5ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogRmlsbC1vdXQgd2hvbGUgd29yZHMsIGJ5dGUtYnktYnl0ZSB0byBhdm9pZCBlbmRpYW5uZXNzIGlzc3VlcyAqLwotCWZvciAoaT0wIDsgaTxieXRlcyA7IGkrPTQsIGstPTMyKSB7Ci0JCXIgPSBnZW5yYW5kX2ludDMyKHNlbGYpOwotCQlpZiAoayA8IDMyKQotCQkJciA+Pj0gKDMyIC0gayk7Ci0JCWJ5dGVhcnJheVtpKzBdID0gKHVuc2lnbmVkIGNoYXIpcjsKLQkJYnl0ZWFycmF5W2krMV0gPSAodW5zaWduZWQgY2hhcikociA+PiA4KTsKLQkJYnl0ZWFycmF5W2krMl0gPSAodW5zaWduZWQgY2hhcikociA+PiAxNik7Ci0JCWJ5dGVhcnJheVtpKzNdID0gKHVuc2lnbmVkIGNoYXIpKHIgPj4gMjQpOwotCX0KKyAgICAvKiBGaWxsLW91dCB3aG9sZSB3b3JkcywgYnl0ZS1ieS1ieXRlIHRvIGF2b2lkIGVuZGlhbm5lc3MgaXNzdWVzICovCisgICAgZm9yIChpPTAgOyBpPGJ5dGVzIDsgaSs9NCwgay09MzIpIHsKKyAgICAgICAgciA9IGdlbnJhbmRfaW50MzIoc2VsZik7CisgICAgICAgIGlmIChrIDwgMzIpCisgICAgICAgICAgICByID4+PSAoMzIgLSBrKTsKKyAgICAgICAgYnl0ZWFycmF5W2krMF0gPSAodW5zaWduZWQgY2hhcilyOworICAgICAgICBieXRlYXJyYXlbaSsxXSA9ICh1bnNpZ25lZCBjaGFyKShyID4+IDgpOworICAgICAgICBieXRlYXJyYXlbaSsyXSA9ICh1bnNpZ25lZCBjaGFyKShyID4+IDE2KTsKKyAgICAgICAgYnl0ZWFycmF5W2krM10gPSAodW5zaWduZWQgY2hhcikociA+PiAyNCk7CisgICAgfQogCi0JLyogbGl0dGxlIGVuZGlhbiBvcmRlciB0byBtYXRjaCBieXRlYXJyYXkgYXNzaWdubWVudCBvcmRlciAqLwotCXJlc3VsdCA9IF9QeUxvbmdfRnJvbUJ5dGVBcnJheShieXRlYXJyYXksIGJ5dGVzLCAxLCAwKTsKLQlQeU1lbV9GcmVlKGJ5dGVhcnJheSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBsaXR0bGUgZW5kaWFuIG9yZGVyIHRvIG1hdGNoIGJ5dGVhcnJheSBhc3NpZ25tZW50IG9yZGVyICovCisgICAgcmVzdWx0ID0gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KGJ5dGVhcnJheSwgYnl0ZXMsIDEsIDApOworICAgIFB5TWVtX0ZyZWUoYnl0ZWFycmF5KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlSYW5kb21PYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKnRtcDsKKyAgICBSYW5kb21PYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCWlmICh0eXBlID09ICZSYW5kb21fVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoIlJhbmRvbSgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZSYW5kb21fVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoIlJhbmRvbSgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChSYW5kb21PYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl0bXAgPSByYW5kb21fc2VlZChzZWxmLCBhcmdzKTsKLQlpZiAodG1wID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNlbGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgc2VsZiA9IChSYW5kb21PYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0bXAgPSByYW5kb21fc2VlZChzZWxmLCBhcmdzKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiByYW5kb21fbWV0aG9kc1tdID0gewotCXsicmFuZG9tIiwJKFB5Q0Z1bmN0aW9uKXJhbmRvbV9yYW5kb20sICBNRVRIX05PQVJHUywKLQkJUHlEb2NfU1RSKCJyYW5kb20oKSAtPiB4IGluIHRoZSBpbnRlcnZhbCBbMCwgMSkuIil9LAotCXsic2VlZCIsCShQeUNGdW5jdGlvbilyYW5kb21fc2VlZCwgIE1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJzZWVkKFtuXSkgLT4gTm9uZS4gIERlZmF1bHRzIHRvIGN1cnJlbnQgdGltZS4iKX0sCi0JeyJnZXRzdGF0ZSIsCShQeUNGdW5jdGlvbilyYW5kb21fZ2V0c3RhdGUsICBNRVRIX05PQVJHUywKLQkJUHlEb2NfU1RSKCJnZXRzdGF0ZSgpIC0+IHR1cGxlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUuIil9LAotCXsic2V0c3RhdGUiLAkgIChQeUNGdW5jdGlvbilyYW5kb21fc2V0c3RhdGUsICBNRVRIX08sCi0JCVB5RG9jX1NUUigic2V0c3RhdGUoc3RhdGUpIC0+IE5vbmUuICBSZXN0b3JlcyBnZW5lcmF0b3Igc3RhdGUuIil9LAotCXsianVtcGFoZWFkIiwJKFB5Q0Z1bmN0aW9uKXJhbmRvbV9qdW1wYWhlYWQsCU1FVEhfTywKLQkJUHlEb2NfU1RSKCJqdW1wYWhlYWQoaW50KSAtPiBOb25lLiAgQ3JlYXRlIG5ldyBzdGF0ZSBmcm9tICIKLQkJCSAgImV4aXN0aW5nIHN0YXRlIGFuZCBpbnRlZ2VyLiIpfSwKLQl7ImdldHJhbmRiaXRzIiwJKFB5Q0Z1bmN0aW9uKXJhbmRvbV9nZXRyYW5kYml0cywgIE1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJnZXRyYW5kYml0cyhrKSAtPiB4LiAgR2VuZXJhdGVzIGEgbG9uZyBpbnQgd2l0aCAiCi0JCQkgICJrIHJhbmRvbSBiaXRzLiIpfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsicmFuZG9tIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXJhbmRvbV9yYW5kb20sICBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJyYW5kb20oKSAtPiB4IGluIHRoZSBpbnRlcnZhbCBbMCwgMSkuIil9LAorICAgIHsic2VlZCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXJhbmRvbV9zZWVkLCAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoInNlZWQoW25dKSAtPiBOb25lLiAgRGVmYXVsdHMgdG8gY3VycmVudCB0aW1lLiIpfSwKKyAgICB7ImdldHN0YXRlIiwgICAgICAgIChQeUNGdW5jdGlvbilyYW5kb21fZ2V0c3RhdGUsICBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJnZXRzdGF0ZSgpIC0+IHR1cGxlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc3RhdGUuIil9LAorICAgIHsic2V0c3RhdGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pcmFuZG9tX3NldHN0YXRlLCAgTUVUSF9PLAorICAgICAgICBQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSAtPiBOb25lLiAgUmVzdG9yZXMgZ2VuZXJhdG9yIHN0YXRlLiIpfSwKKyAgICB7Imp1bXBhaGVhZCIsICAgICAgIChQeUNGdW5jdGlvbilyYW5kb21fanVtcGFoZWFkLCAgTUVUSF9PLAorICAgICAgICBQeURvY19TVFIoImp1bXBhaGVhZChpbnQpIC0+IE5vbmUuICBDcmVhdGUgbmV3IHN0YXRlIGZyb20gIgorICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIHN0YXRlIGFuZCBpbnRlZ2VyLiIpfSwKKyAgICB7ImdldHJhbmRiaXRzIiwgICAgIChQeUNGdW5jdGlvbilyYW5kb21fZ2V0cmFuZGJpdHMsICBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiZ2V0cmFuZGJpdHMoaykgLT4geC4gIEdlbmVyYXRlcyBhIGxvbmcgaW50IHdpdGggIgorICAgICAgICAgICAgICAgICAgImsgcmFuZG9tIGJpdHMuIil9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIocmFuZG9tX2RvYywKICJSYW5kb20oKSAtPiBjcmVhdGUgYSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB3aXRoIGl0cyBvd24gaW50ZXJuYWwgc3RhdGUuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUmFuZG9tX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9yYW5kb20uUmFuZG9tIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKFJhbmRvbU9iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCTAsCQkJCS8qdHBfZGVhbGxvYyovCi0JMCwJCQkJLyp0cF9wcmludCovCi0JMCwJCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkJLyp0cF9yZXByKi8KLQkwLAkJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCQkvKnRwX2hhc2gqLwotCTAsCQkJCS8qdHBfY2FsbCovCi0JMCwJCQkJLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKnRwX2dldGF0dHJvKi8KLQkwLAkJCQkvKnRwX3NldGF0dHJvKi8KLQkwLAkJCQkvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyp0cF9mbGFncyovCi0JcmFuZG9tX2RvYywJCQkvKnRwX2RvYyovCi0JMCwJCQkJLyp0cF90cmF2ZXJzZSovCi0JMCwJCQkJLyp0cF9jbGVhciovCi0JMCwJCQkJLyp0cF9yaWNoY29tcGFyZSovCi0JMCwJCQkJLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwJCQkJLyp0cF9pdGVyKi8KLQkwLAkJCQkvKnRwX2l0ZXJuZXh0Ki8KLQlyYW5kb21fbWV0aG9kcywgCQkvKnRwX21ldGhvZHMqLwotCTAsCQkJCS8qdHBfbWVtYmVycyovCi0JMCwJCQkJLyp0cF9nZXRzZXQqLwotCTAsCQkJCS8qdHBfYmFzZSovCi0JMCwJCQkJLyp0cF9kaWN0Ki8KLQkwLAkJCQkvKnRwX2Rlc2NyX2dldCovCi0JMCwJCQkJLyp0cF9kZXNjcl9zZXQqLwotCTAsCQkJCS8qdHBfZGljdG9mZnNldCovCi0JMCwJCQkJLyp0cF9pbml0Ki8KLQkwLAkJCQkvKnRwX2FsbG9jKi8KLQlyYW5kb21fbmV3LAkJCS8qdHBfbmV3Ki8KLQlfUHlPYmplY3RfRGVsLAkJCS8qdHBfZnJlZSovCi0JMCwJCQkJLyp0cF9pc19nYyovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIl9yYW5kb20uUmFuZG9tIiwgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUmFuZG9tT2JqZWN0KSwgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgLyp0cF9mbGFncyovCisgICAgcmFuZG9tX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgcmFuZG9tX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCisgICAgcmFuZG9tX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLworICAgIF9QeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCiB9OwogCiBQeURvY19TVFJWQVIobW9kdWxlX2RvYywKQEAgLTU2OCwxMyArNTY4LDEzIEBACiBQeU1PRElOSVRfRlVOQwogaW5pdF9yYW5kb20odm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlJhbmRvbV9UeXBlKSA8IDApCi0JCXJldHVybjsKLQltID0gUHlfSW5pdE1vZHVsZTMoIl9yYW5kb20iLCBOVUxMLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKCZSYW5kb21fVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSYW5kb20iLCAoUHlPYmplY3QgKikmUmFuZG9tX1R5cGUpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlJhbmRvbV9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9yYW5kb20iLCBOVUxMLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZSYW5kb21fVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSYW5kb20iLCAoUHlPYmplY3QgKikmUmFuZG9tX1R5cGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3RydWN0LmMgYi9Nb2R1bGVzL19zdHJ1Y3QuYwppbmRleCBkOTI0Y2FkLi42ZDI0NTJiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zdHJ1Y3QuYworKysgYi9Nb2R1bGVzL19zdHJ1Y3QuYwpAQCAtNDQsMzAgKzQ0LDMwIEBACiAKIC8qIFRoZSB0cmFuc2xhdGlvbiBmdW5jdGlvbiBmb3IgZWFjaCBmb3JtYXQgY2hhcmFjdGVyIGlzIHRhYmxlIGRyaXZlbiAqLwogdHlwZWRlZiBzdHJ1Y3QgX2Zvcm1hdGRlZiB7Ci0JY2hhciBmb3JtYXQ7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5X3NzaXplX3QgYWxpZ25tZW50OwotCVB5T2JqZWN0KiAoKnVucGFjaykoY29uc3QgY2hhciAqLAotCQkJICAgIGNvbnN0IHN0cnVjdCBfZm9ybWF0ZGVmICopOwotCWludCAoKnBhY2spKGNoYXIgKiwgUHlPYmplY3QgKiwKLQkJICAgIGNvbnN0IHN0cnVjdCBfZm9ybWF0ZGVmICopOworICAgIGNoYXIgZm9ybWF0OworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGFsaWdubWVudDsKKyAgICBQeU9iamVjdCogKCp1bnBhY2spKGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfZm9ybWF0ZGVmICopOworICAgIGludCAoKnBhY2spKGNoYXIgKiwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Zvcm1hdGRlZiAqKTsKIH0gZm9ybWF0ZGVmOwogCiB0eXBlZGVmIHN0cnVjdCBfZm9ybWF0Y29kZSB7Ci0JY29uc3Qgc3RydWN0IF9mb3JtYXRkZWYgKmZtdGRlZjsKLQlQeV9zc2l6ZV90IG9mZnNldDsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgY29uc3Qgc3RydWN0IF9mb3JtYXRkZWYgKmZtdGRlZjsKKyAgICBQeV9zc2l6ZV90IG9mZnNldDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiB9IGZvcm1hdGNvZGU7CiAKIC8qIFN0cnVjdCBvYmplY3QgaW50ZXJmYWNlICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdCBzX3NpemU7Ci0JUHlfc3NpemVfdCBzX2xlbjsKLQlmb3JtYXRjb2RlICpzX2NvZGVzOwotCVB5T2JqZWN0ICpzX2Zvcm1hdDsKLQlQeU9iamVjdCAqd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3Qgc19zaXplOworICAgIFB5X3NzaXplX3Qgc19sZW47CisgICAgZm9ybWF0Y29kZSAqc19jb2RlczsKKyAgICBQeU9iamVjdCAqc19mb3JtYXQ7CisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogfSBQeVN0cnVjdE9iamVjdDsKIAogCkBAIC0xMjQsMjcgKzEyNCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9weWxvbmcoUHlPYmplY3QgKnYpCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotCWFzc2VydCh2ICE9IE5VTEwpOwotCWlmIChQeUludF9DaGVjayh2KSkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKLQlpZiAoUHlMb25nX0NoZWNrKHYpKSB7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIHY7Ci0JfQotCW0gPSBQeV9UWVBFKHYpLT50cF9hc19udW1iZXI7Ci0JaWYgKG0gIT0gTlVMTCAmJiBtLT5uYl9sb25nICE9IE5VTEwpIHsKLQkJdiA9IG0tPm5iX2xvbmcodik7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKFB5TG9uZ19DaGVjayh2KSkKLQkJCXJldHVybiB2OwotCQlQeV9ERUNSRUYodik7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCSJjYW5ub3QgY29udmVydCBhcmd1bWVudCB0byBsb25nIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KHYgIT0gTlVMTCk7CisgICAgaWYgKFB5SW50X0NoZWNrKHYpKQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodikpOworICAgIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisgICAgbSA9IFB5X1RZUEUodiktPnRwX2FzX251bWJlcjsKKyAgICBpZiAobSAhPSBOVUxMICYmIG0tPm5iX2xvbmcgIT0gTlVMTCkgeworICAgICAgICB2ID0gbS0+bmJfbG9uZyh2KTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlMb25nX0NoZWNrKHYpKQorICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgYXJndW1lbnQgdG8gbG9uZyIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBIZWxwZXIgcm91dGluZSB0byBnZXQgYSBQeXRob24gaW50ZWdlciBhbmQgcmFpc2UgdGhlIGFwcHJvcHJpYXRlIGVycm9yCkBAIC0xNTMsMzAgKzE1MywzMCBAQAogc3RhdGljIGludAogZ2V0X2xvbmcoUHlPYmplY3QgKnYsIGxvbmcgKnApCiB7Ci0JbG9uZyB4ID0gUHlJbnRfQXNMb25nKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICBsb25nIHggPSBQeUludF9Bc0xvbmcodik7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogI2lmZGVmIFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0UKLQkJaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKLQkJCVB5T2JqZWN0ICpvOwotCQkJaW50IHJlczsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgRkxPQVRfQ09FUkNFLCAxKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJbyA9IFB5TnVtYmVyX0ludCh2KTsKLQkJCWlmIChvID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmVzID0gZ2V0X2xvbmcobywgcCk7Ci0JCQlQeV9ERUNSRUYobyk7Ci0JCQlyZXR1cm4gcmVzOwotCQl9CisgICAgICAgIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqbzsKKyAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIEZMT0FUX0NPRVJDRSwgMSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIG8gPSBQeU51bWJlcl9JbnQodik7CisgICAgICAgICAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJlcyA9IGdldF9sb25nKG8sIHApOworICAgICAgICAgICAgUHlfREVDUkVGKG8pOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQogI2VuZGlmCi0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYW4gaW50ZWdlciIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwID0geDsKLQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGFuIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcCA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTg3LDIxICsxODcsMjEgQEAKIHN0YXRpYyBpbnQKIGdldF91bG9uZyhQeU9iamVjdCAqdiwgdW5zaWduZWQgbG9uZyAqcCkKIHsKLQlpZiAoUHlMb25nX0NoZWNrKHYpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2KTsKLQkJaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpKC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqcCA9IHg7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoZ2V0X2xvbmcodiwgKGxvbmcgKilwKSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoKChsb25nKSpwKSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJ1bnNpZ25lZCBhcmd1bWVudCBpcyA8IDAiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlMb25nX0NoZWNrKHYpKSB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2KTsKKyAgICAgICAgaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpKC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqcCA9IHg7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZ2V0X2xvbmcodiwgKGxvbmcgKilwKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoKChsb25nKSpwKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInVuc2lnbmVkIGFyZ3VtZW50IGlzIDwgMCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAjZW5kaWYgLyogUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcgKi8KQEAgLTIxMywxOCArMjEzLDE4IEBACiBzdGF0aWMgaW50CiBnZXRfbG9uZ2xvbmcoUHlPYmplY3QgKnYsIFBZX0xPTkdfTE9ORyAqcCkKIHsKLQlQWV9MT05HX0xPTkcgeDsKKyAgICBQWV9MT05HX0xPTkcgeDsKIAotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKLQl4ID0gUHlMb25nX0FzTG9uZ0xvbmcodik7Ci0JUHlfREVDUkVGKHYpOwotCWlmICh4ID09IChQWV9MT05HX0xPTkcpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCSpwID0geDsKLQlyZXR1cm4gMDsKKyAgICB2ID0gZ2V0X3B5bG9uZyh2KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisgICAgeCA9IFB5TG9uZ19Bc0xvbmdMb25nKHYpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBpZiAoeCA9PSAoUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAqcCA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFNhbWUsIGJ1dCBoYW5kbGluZyBuYXRpdmUgdW5zaWduZWQgbG9uZyBsb25nLiAqLwpAQCAtMjMyLDE4ICsyMzIsMTggQEAKIHN0YXRpYyBpbnQKIGdldF91bG9uZ2xvbmcoUHlPYmplY3QgKnYsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqcCkKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKIAotCXYgPSBnZXRfcHlsb25nKHYpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKLQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKLQlQeV9ERUNSRUYodik7Ci0JaWYgKHggPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnAgPSB4OwotCXJldHVybiAwOworICAgIHYgPSBnZXRfcHlsb25nKHYpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKyAgICB4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2KTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKHggPT0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnAgPSB4OworICAgIHJldHVybiAwOwogfQogCiAjZW5kaWYKQEAgLTI1OCw4OSArMjU4LDg5IEBACiBzdGF0aWMgaW50CiBnZXRfd3JhcHBlZF9sb25nKFB5T2JqZWN0ICp2LCBsb25nICpwKQogewotCWlmIChnZXRfbG9uZyh2LCBwKSA8IDApIHsKLQkJaWYgKFB5TG9uZ19DaGVjayh2KSAmJgotCQkgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkgewotCQkJUHlPYmplY3QgKndyYXBwZWQ7Ci0JCQlsb25nIHg7Ci0JCQlQeUVycl9DbGVhcigpOworICAgIGlmIChnZXRfbG9uZyh2LCBwKSA8IDApIHsKKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayh2KSAmJgorICAgICAgICAgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkgeworICAgICAgICAgICAgUHlPYmplY3QgKndyYXBwZWQ7CisgICAgICAgICAgICBsb25nIHg7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogI2lmZGVmIFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0UKLQkJCWlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCQkJUHlPYmplY3QgKm87Ci0JCQkJaW50IHJlczsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCWlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCBGTE9BVF9DT0VSQ0UsIDEpIDwgMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCW8gPSBQeU51bWJlcl9JbnQodik7Ci0JCQkJaWYgKG8gPT0gTlVMTCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCXJlcyA9IGdldF93cmFwcGVkX2xvbmcobywgcCk7Ci0JCQkJUHlfREVDUkVGKG8pOwotCQkJCXJldHVybiByZXM7Ci0JCQl9CisgICAgICAgICAgICBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvOworICAgICAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgRkxPQVRfQ09FUkNFLCAxKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBvID0gUHlOdW1iZXJfSW50KHYpOworICAgICAgICAgICAgICAgIGlmIChvID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByZXMgPSBnZXRfd3JhcHBlZF9sb25nKG8sIHApOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgSU5UX09WRVJGTE9XLCAxKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJd3JhcHBlZCA9IFB5TnVtYmVyX0FuZCh2LCBweWxvbmdfdWxvbmdfbWFzayk7Ci0JCQlpZiAod3JhcHBlZCA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCXggPSAobG9uZylQeUxvbmdfQXNVbnNpZ25lZExvbmcod3JhcHBlZCk7Ci0JCQlQeV9ERUNSRUYod3JhcHBlZCk7Ci0JCQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKLQkJCSpwID0geDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCBJTlRfT1ZFUkZMT1csIDEpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB3cmFwcGVkID0gUHlOdW1iZXJfQW5kKHYsIHB5bG9uZ191bG9uZ19tYXNrKTsKKyAgICAgICAgICAgIGlmICh3cmFwcGVkID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgeCA9IChsb25nKVB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh3cmFwcGVkKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3cmFwcGVkKTsKKyAgICAgICAgICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgKnAgPSB4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBnZXRfd3JhcHBlZF91bG9uZyhQeU9iamVjdCAqdiwgdW5zaWduZWQgbG9uZyAqcCkKIHsKLQlsb25nIHggPSAobG9uZylQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeU9iamVjdCAqd3JhcHBlZDsKLQkJUHlFcnJfQ2xlYXIoKTsKKyAgICBsb25nIHggPSAobG9uZylQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeU9iamVjdCAqd3JhcHBlZDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICNpZmRlZiBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFCi0JCWlmIChQeUZsb2F0X0NoZWNrKHYpKSB7Ci0JCQlQeU9iamVjdCAqbzsKLQkJCWludCByZXM7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIEZMT0FUX0NPRVJDRSwgMSkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCW8gPSBQeU51bWJlcl9JbnQodik7Ci0JCQlpZiAobyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCXJlcyA9IGdldF93cmFwcGVkX3Vsb25nKG8sIHApOwotCQkJUHlfREVDUkVGKG8pOwotCQkJcmV0dXJuIHJlczsKLQkJfQorICAgICAgICBpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm87CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCBGTE9BVF9DT0VSQ0UsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBvID0gUHlOdW1iZXJfSW50KHYpOworICAgICAgICAgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXMgPSBnZXRfd3JhcHBlZF91bG9uZyhvLCBwKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KICNlbmRpZgotCQl3cmFwcGVkID0gUHlOdW1iZXJfQW5kKHYsIHB5bG9uZ191bG9uZ19tYXNrKTsKLQkJaWYgKHdyYXBwZWQgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIElOVF9PVkVSRkxPVywgMSkgPCAwKSB7Ci0JCQlQeV9ERUNSRUYod3JhcHBlZCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJeCA9IChsb25nKVB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh3cmFwcGVkKTsKLQkJUHlfREVDUkVGKHdyYXBwZWQpOwotCQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCX0KLQkqcCA9ICh1bnNpZ25lZCBsb25nKXg7Ci0JcmV0dXJuIDA7CisgICAgICAgIHdyYXBwZWQgPSBQeU51bWJlcl9BbmQodiwgcHlsb25nX3Vsb25nX21hc2spOworICAgICAgICBpZiAod3JhcHBlZCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgSU5UX09WRVJGTE9XLCAxKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3cmFwcGVkKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB4ID0gKGxvbmcpUHlMb25nX0FzVW5zaWduZWRMb25nKHdyYXBwZWQpOworICAgICAgICBQeV9ERUNSRUYod3JhcHBlZCk7CisgICAgICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICpwID0gKHVuc2lnbmVkIGxvbmcpeDsKKyAgICByZXR1cm4gMDsKIH0KIAogI2RlZmluZSBSQU5HRV9FUlJPUih4LCBmLCBmbGFnLCBtYXNrKSBcCi0JZG8geyBcCi0JCWlmIChfcmFuZ2VfZXJyb3IoZiwgZmxhZykgPCAwKSBcCi0JCQlyZXR1cm4gLTE7IFwKLQkJZWxzZSBcCi0JCQkoeCkgJj0gKG1hc2spOyBcCi0JfSB3aGlsZSAoMCkKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKF9yYW5nZV9lcnJvcihmLCBmbGFnKSA8IDApIFwKKyAgICAgICAgICAgIHJldHVybiAtMTsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICh4KSAmPSAobWFzayk7IFwKKyAgICB9IHdoaWxlICgwKQogCiAjZWxzZQogCkBAIC0zNTQsNzYgKzM1NCw3NiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogdW5wYWNrX2Zsb2F0KGNvbnN0IGNoYXIgKnAsICAvKiBzdGFydCBvZiA0LWJ5dGUgc3RyaW5nICovCi0gICAgICAgICAgICAgaW50IGxlKQkgICAgIC8qIHRydWUgZm9yIGxpdHRsZS1lbmRpYW4sIGZhbHNlIGZvciBiaWctZW5kaWFuICovCisgICAgICAgICBpbnQgbGUpICAgICAgICAgICAgIC8qIHRydWUgZm9yIGxpdHRsZS1lbmRpYW4sIGZhbHNlIGZvciBiaWctZW5kaWFuICovCiB7Ci0JZG91YmxlIHg7CisgICAgZG91YmxlIHg7CiAKLQl4ID0gX1B5RmxvYXRfVW5wYWNrNCgodW5zaWduZWQgY2hhciAqKXAsIGxlKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgeCA9IF9QeUZsb2F0X1VucGFjazQoKHVuc2lnbmVkIGNoYXIgKilwLCBsZSk7CisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdW5wYWNrX2RvdWJsZShjb25zdCBjaGFyICpwLCAgLyogc3RhcnQgb2YgOC1ieXRlIHN0cmluZyAqLwotICAgICAgICAgICAgICBpbnQgbGUpICAgICAgICAgLyogdHJ1ZSBmb3IgbGl0dGxlLWVuZGlhbiwgZmFsc2UgZm9yIGJpZy1lbmRpYW4gKi8KKyAgICAgICAgICBpbnQgbGUpICAgICAgICAgLyogdHJ1ZSBmb3IgbGl0dGxlLWVuZGlhbiwgZmFsc2UgZm9yIGJpZy1lbmRpYW4gKi8KIHsKLQlkb3VibGUgeDsKKyAgICBkb3VibGUgeDsKIAotCXggPSBfUHlGbG9hdF9VbnBhY2s4KCh1bnNpZ25lZCBjaGFyICopcCwgbGUpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKyAgICB4ID0gX1B5RmxvYXRfVW5wYWNrOCgodW5zaWduZWQgY2hhciAqKXAsIGxlKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CiB9CiAKIC8qIEhlbHBlciB0byBmb3JtYXQgdGhlIHJhbmdlIGVycm9yIGV4Y2VwdGlvbnMgKi8KIHN0YXRpYyBpbnQKIF9yYW5nZV9lcnJvcihjb25zdCBmb3JtYXRkZWYgKmYsIGludCBpc191bnNpZ25lZCkKIHsKLQkvKiB1bGFyZ2VzdCBpcyB0aGUgbGFyZ2VzdCB1bnNpZ25lZCB2YWx1ZSB3aXRoIGYtPnNpemUgYnl0ZXMuCi0JICogTm90ZSB0aGF0IHRoZSBzaW1wbGVyOgotCSAqICAgICAoKHNpemVfdCkxIDw8IChmLT5zaXplICogOCkpIC0gMQotCSAqIGRvZXNuJ3Qgd29yayB3aGVuIGYtPnNpemUgPT0gc2l6ZW9mKHNpemVfdCkgYmVjYXVzZSBDIGRvZXNuJ3QKLQkgKiBkZWZpbmUgd2hhdCBoYXBwZW5zIHdoZW4gYSBsZWZ0IHNoaWZ0IGNvdW50IGlzID49IHRoZSBudW1iZXIgb2YKLQkgKiBiaXRzIGluIHRoZSBpbnRlZ2VyIGJlaW5nIHNoaWZ0ZWQ7IGUuZy4sIG9uIHNvbWUgYm94ZXMgaXQgZG9lc24ndAotCSAqIHNoaWZ0IGF0IGFsbCB3aGVuIHRoZXkncmUgZXF1YWwuCi0JICovCi0JY29uc3Qgc2l6ZV90IHVsYXJnZXN0ID0gKHNpemVfdCktMSA+PiAoKFNJWkVPRl9TSVpFX1QgLSBmLT5zaXplKSo4KTsKLQlhc3NlcnQoZi0+c2l6ZSA+PSAxICYmIGYtPnNpemUgPD0gU0laRU9GX1NJWkVfVCk7Ci0JaWYgKGlzX3Vuc2lnbmVkKQotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkiJyVjJyBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gJXp1IiwKLQkJCWYtPmZvcm1hdCwKLQkJCXVsYXJnZXN0KTsKLQllbHNlIHsKLQkJY29uc3QgUHlfc3NpemVfdCBsYXJnZXN0ID0gKFB5X3NzaXplX3QpKHVsYXJnZXN0ID4+IDEpOwotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkiJyVjJyBmb3JtYXQgcmVxdWlyZXMgJXpkIDw9IG51bWJlciA8PSAlemQiLAotCQkJZi0+Zm9ybWF0LAotCQkJfiBsYXJnZXN0LAotCQkJbGFyZ2VzdCk7Ci0JfQorICAgIC8qIHVsYXJnZXN0IGlzIHRoZSBsYXJnZXN0IHVuc2lnbmVkIHZhbHVlIHdpdGggZi0+c2l6ZSBieXRlcy4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHNpbXBsZXI6CisgICAgICogICAgICgoc2l6ZV90KTEgPDwgKGYtPnNpemUgKiA4KSkgLSAxCisgICAgICogZG9lc24ndCB3b3JrIHdoZW4gZi0+c2l6ZSA9PSBzaXplb2Yoc2l6ZV90KSBiZWNhdXNlIEMgZG9lc24ndAorICAgICAqIGRlZmluZSB3aGF0IGhhcHBlbnMgd2hlbiBhIGxlZnQgc2hpZnQgY291bnQgaXMgPj0gdGhlIG51bWJlciBvZgorICAgICAqIGJpdHMgaW4gdGhlIGludGVnZXIgYmVpbmcgc2hpZnRlZDsgZS5nLiwgb24gc29tZSBib3hlcyBpdCBkb2Vzbid0CisgICAgICogc2hpZnQgYXQgYWxsIHdoZW4gdGhleSdyZSBlcXVhbC4KKyAgICAgKi8KKyAgICBjb25zdCBzaXplX3QgdWxhcmdlc3QgPSAoc2l6ZV90KS0xID4+ICgoU0laRU9GX1NJWkVfVCAtIGYtPnNpemUpKjgpOworICAgIGFzc2VydChmLT5zaXplID49IDEgJiYgZi0+c2l6ZSA8PSBTSVpFT0ZfU0laRV9UKTsKKyAgICBpZiAoaXNfdW5zaWduZWQpCisgICAgICAgIFB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICInJWMnIGZvcm1hdCByZXF1aXJlcyAwIDw9IG51bWJlciA8PSAlenUiLAorICAgICAgICAgICAgZi0+Zm9ybWF0LAorICAgICAgICAgICAgdWxhcmdlc3QpOworICAgIGVsc2UgeworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IGxhcmdlc3QgPSAoUHlfc3NpemVfdCkodWxhcmdlc3QgPj4gMSk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICInJWMnIGZvcm1hdCByZXF1aXJlcyAlemQgPD0gbnVtYmVyIDw9ICV6ZCIsCisgICAgICAgICAgICBmLT5mb3JtYXQsCisgICAgICAgICAgICB+IGxhcmdlc3QsCisgICAgICAgICAgICBsYXJnZXN0KTsKKyAgICB9CiAjaWZkZWYgUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcKLQl7Ci0JCVB5T2JqZWN0ICpwdHlwZSwgKnB2YWx1ZSwgKnB0cmFjZWJhY2s7Ci0JCVB5T2JqZWN0ICptc2c7Ci0JCWludCBydmFsOwotCQlQeUVycl9GZXRjaCgmcHR5cGUsICZwdmFsdWUsICZwdHJhY2ViYWNrKTsKLQkJYXNzZXJ0KHB2YWx1ZSAhPSBOVUxMKTsKLQkJbXNnID0gUHlPYmplY3RfU3RyKHB2YWx1ZSk7Ci0JCVB5X1hERUNSRUYocHR5cGUpOwotCQlQeV9YREVDUkVGKHB2YWx1ZSk7Ci0JCVB5X1hERUNSRUYocHRyYWNlYmFjayk7Ci0JCWlmIChtc2cgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcnZhbCA9IFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJICAgIFB5U3RyaW5nX0FTX1NUUklORyhtc2cpLCAxKTsKLQkJUHlfREVDUkVGKG1zZyk7Ci0JCWlmIChydmFsID09IDApCi0JCQlyZXR1cm4gMDsKLQl9CisgICAgeworICAgICAgICBQeU9iamVjdCAqcHR5cGUsICpwdmFsdWUsICpwdHJhY2ViYWNrOworICAgICAgICBQeU9iamVjdCAqbXNnOworICAgICAgICBpbnQgcnZhbDsKKyAgICAgICAgUHlFcnJfRmV0Y2goJnB0eXBlLCAmcHZhbHVlLCAmcHRyYWNlYmFjayk7CisgICAgICAgIGFzc2VydChwdmFsdWUgIT0gTlVMTCk7CisgICAgICAgIG1zZyA9IFB5T2JqZWN0X1N0cihwdmFsdWUpOworICAgICAgICBQeV9YREVDUkVGKHB0eXBlKTsKKyAgICAgICAgUHlfWERFQ1JFRihwdmFsdWUpOworICAgICAgICBQeV9YREVDUkVGKHB0cmFjZWJhY2spOworICAgICAgICBpZiAobXNnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJ2YWwgPSBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhtc2cpLCAxKTsKKyAgICAgICAgUHlfREVDUkVGKG1zZyk7CisgICAgICAgIGlmIChydmFsID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogfQogCiAKQEAgLTQ1MCw3NSArNDUwLDc1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbnVfY2hhcihjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHAsIDEpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X2J5dGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKihzaWduZWQgY2hhciAqKXApOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKihzaWduZWQgY2hhciAqKXApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfdWJ5dGUoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKih1bnNpZ25lZCBjaGFyICopcCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAqKHVuc2lnbmVkIGNoYXIgKilwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X3Nob3J0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlzaG9ydCB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHNob3J0IHg7CisgICAgbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV91c2hvcnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIHNob3J0IHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CisgICAgdW5zaWduZWQgc2hvcnQgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51X2ludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JaW50IHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CisgICAgaW50IHg7CisgICAgbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV91aW50KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl1bnNpZ25lZCBpbnQgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIHVuc2lnbmVkIGludCB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CiAjaWYgKFNJWkVPRl9MT05HID4gU0laRU9GX0lOVCkKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwogI2Vsc2UKLQlpZiAoeCA8PSAoKHVuc2lnbmVkIGludClMT05HX01BWCkpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpeCk7CisgICAgaWYgKHggPD0gKCh1bnNpZ25lZCBpbnQpTE9OR19NQVgpKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXgpOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9sb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlsb25nIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgbG9uZyB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfdWxvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCWlmICh4IDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHgpOworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIGlmICh4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHgpOwogfQogCiAvKiBOYXRpdmUgbW9kZSBkb2Vzbid0IHN1cHBvcnQgcSBvciBRIHVubGVzcyB0aGUgcGxhdGZvcm0gQyBzdXBwb3J0cwpAQCAtNTI5LDIxICs1MjksMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9sb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JUFlfTE9OR19MT05HIHg7Ci0JbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKLQlpZiAoeCA+PSBMT05HX01JTiAmJiB4IDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKKyAgICBQWV9MT05HX0xPTkcgeDsKKyAgICBtZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOworICAgIGlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIFBZX0xPTkdfTE9ORywgbG9uZykpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfdWxvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCWlmICh4IDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCB1bnNpZ25lZCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHgpOworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgaWYgKHggPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORywgbG9uZykpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoeCk7CiB9CiAKICNlbmRpZgpAQCAtNTUxLDE2MyArNTUxLDE2MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG51X2Jvb2woY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCUJPT0xfVFlQRSB4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyh4ICE9IDApOworICAgIEJPT0xfVFlQRSB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyh4ICE9IDApOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBudV9mbG9hdChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JZmxvYXQgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSl4KTsKKyAgICBmbG9hdCB4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfZG91YmxlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlkb3VibGUgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgZG91YmxlIHg7CisgICAgbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbnVfdm9pZF9wKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl2b2lkICp4OwotCW1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cih4KTsKKyAgICB2b2lkICp4OworICAgIG1lbWNweSgoY2hhciAqKSZ4LCBwLCBzaXplb2YgeCk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cih4KTsKIH0KIAogc3RhdGljIGludAogbnBfYnl0ZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeDsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmICh4IDwgLTEyOCB8fCB4ID4gMTI3KXsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJieXRlIGZvcm1hdCByZXF1aXJlcyAtMTI4IDw9IG51bWJlciA8PSAxMjciKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcCA9IChjaGFyKXg7Ci0JcmV0dXJuIDA7CisgICAgbG9uZyB4OworICAgIGlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHggPCAtMTI4IHx8IHggPiAxMjcpeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZSBmb3JtYXQgcmVxdWlyZXMgLTEyOCA8PSBudW1iZXIgPD0gMTI3Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnAgPSAoY2hhcil4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF91Ynl0ZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeDsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmICh4IDwgMCB8fCB4ID4gMjU1KXsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJ1Ynl0ZSBmb3JtYXQgcmVxdWlyZXMgMCA8PSBudW1iZXIgPD0gMjU1Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnAgPSAoY2hhcil4OwotCXJldHVybiAwOworICAgIGxvbmcgeDsKKyAgICBpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh4IDwgMCB8fCB4ID4gMjU1KXsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInVieXRlIGZvcm1hdCByZXF1aXJlcyAwIDw9IG51bWJlciA8PSAyNTUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcCA9IChjaGFyKXg7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX2NoYXIoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpIHx8IFB5U3RyaW5nX1NpemUodikgIT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJImNoYXIgZm9ybWF0IHJlcXVpcmUgc3RyaW5nIG9mIGxlbmd0aCAxIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JKnAgPSAqUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeVN0cmluZ19TaXplKHYpICE9IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNoYXIgZm9ybWF0IHJlcXVpcmUgc3RyaW5nIG9mIGxlbmd0aCAxIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnAgPSAqUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX3Nob3J0KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4OwotCXNob3J0IHk7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoeCA8IFNIUlRfTUlOIHx8IHggPiBTSFJUX01BWCl7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkic2hvcnQgZm9ybWF0IHJlcXVpcmVzICIgU1RSSU5HSUZZKFNIUlRfTUlOKQotCQkJCSIgPD0gbnVtYmVyIDw9ICIgU1RSSU5HSUZZKFNIUlRfTUFYKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JeSA9IChzaG9ydCl4OwotCW1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7Ci0JcmV0dXJuIDA7CisgICAgbG9uZyB4OworICAgIHNob3J0IHk7CisgICAgaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoeCA8IFNIUlRfTUlOIHx8IHggPiBTSFJUX01BWCl7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaG9ydCBmb3JtYXQgcmVxdWlyZXMgIiBTVFJJTkdJRlkoU0hSVF9NSU4pCisgICAgICAgICAgICAgICAgICAgICAgICAiIDw9IG51bWJlciA8PSAiIFNUUklOR0lGWShTSFJUX01BWCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHkgPSAoc2hvcnQpeDsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF91c2hvcnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlsb25nIHg7Ci0JdW5zaWduZWQgc2hvcnQgeTsKLQlpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmICh4IDwgMCB8fCB4ID4gVVNIUlRfTUFYKXsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJ1c2hvcnQgZm9ybWF0IHJlcXVpcmVzIDAgPD0gbnVtYmVyIDw9ICIgU1RSSU5HSUZZKFVTSFJUX01BWCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXkgPSAodW5zaWduZWQgc2hvcnQpeDsKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOworICAgIGxvbmcgeDsKKyAgICB1bnNpZ25lZCBzaG9ydCB5OworICAgIGlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHggPCAwIHx8IHggPiBVU0hSVF9NQVgpeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidXNob3J0IGZvcm1hdCByZXF1aXJlcyAwIDw9IG51bWJlciA8PSAiIFNUUklOR0lGWShVU0hSVF9NQVgpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB5ID0gKHVuc2lnbmVkIHNob3J0KXg7CisgICAgbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfaW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4OwotCWludCB5OwotCWlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgbG9uZyB4OworICAgIGludCB5OworICAgIGlmIChnZXRfbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAjaWYgKFNJWkVPRl9MT05HID4gU0laRU9GX0lOVCkKLQlpZiAoKHggPCAoKGxvbmcpSU5UX01JTikpIHx8ICh4ID4gKChsb25nKUlOVF9NQVgpKSkKLQkJUkFOR0VfRVJST1IoeCwgZiwgMCwgLTEpOworICAgIGlmICgoeCA8ICgobG9uZylJTlRfTUlOKSkgfHwgKHggPiAoKGxvbmcpSU5UX01BWCkpKQorICAgICAgICBSQU5HRV9FUlJPUih4LCBmLCAwLCAtMSk7CiAjZW5kaWYKLQl5ID0gKGludCl4OwotCW1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7Ci0JcmV0dXJuIDA7CisgICAgeSA9IChpbnQpeDsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF91aW50KGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCXVuc2lnbmVkIGludCB5OwotCWlmIChnZXRfd3JhcHBlZF91bG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JeSA9ICh1bnNpZ25lZCBpbnQpeDsKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgdW5zaWduZWQgaW50IHk7CisgICAgaWYgKGdldF93cmFwcGVkX3Vsb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICB5ID0gKHVuc2lnbmVkIGludCl4OwogI2lmIChTSVpFT0ZfTE9ORyA+IFNJWkVPRl9JTlQpCi0JaWYgKHggPiAoKHVuc2lnbmVkIGxvbmcpVUlOVF9NQVgpKQotCQlSQU5HRV9FUlJPUih5LCBmLCAxLCAtMSk7CisgICAgaWYgKHggPiAoKHVuc2lnbmVkIGxvbmcpVUlOVF9NQVgpKQorICAgICAgICBSQU5HRV9FUlJPUih5LCBmLCAxLCAtMSk7CiAjZW5kaWYKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOworICAgIG1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX2xvbmcoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlsb25nIHg7Ci0JaWYgKGdldF9sb25nKHYsICZ4KSA8IDApCi0JCXJldHVybiAtMTsKLQltZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOwotCXJldHVybiAwOworICAgIGxvbmcgeDsKKyAgICBpZiAoZ2V0X2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG5wX3Vsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCWlmIChnZXRfd3JhcHBlZF91bG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKLQlyZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgaWYgKGdldF93cmFwcGVkX3Vsb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOworICAgIHJldHVybiAwOwogfQogCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKQEAgLTcxNSwyMSArNzE1LDIxIEBACiBzdGF0aWMgaW50CiBucF9sb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCVBZX0xPTkdfTE9ORyB4OwotCWlmIChnZXRfbG9uZ2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7CisgICAgUFlfTE9OR19MT05HIHg7CisgICAgaWYgKGdldF9sb25nbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfdWxvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7Ci0JaWYgKGdldF91bG9uZ2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHg7CisgICAgaWYgKGdldF91bG9uZ2xvbmcodiwgJngpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIG1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7CisgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApAQCAtNzM3LDc3ICs3MzcsNzcgQEAKIHN0YXRpYyBpbnQKIG5wX2Jvb2woY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlCT09MX1RZUEUgeTsgCi0JeSA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOworICAgIEJPT0xfVFlQRSB5OworICAgIHkgPSBQeU9iamVjdF9Jc1RydWUodik7CisgICAgbWVtY3B5KHAsIChjaGFyICopJnksIHNpemVvZiB5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbnBfZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlmbG9hdCB4ID0gKGZsb2F0KVB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZiB4KTsKLQlyZXR1cm4gMDsKKyAgICBmbG9hdCB4ID0gKGZsb2F0KVB5RmxvYXRfQXNEb3VibGUodik7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF9kb3VibGUoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbWVtY3B5KHAsIChjaGFyICopJngsIHNpemVvZihkb3VibGUpKTsKLQlyZXR1cm4gMDsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mKGRvdWJsZSkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBucF92b2lkX3AoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl2b2lkICp4OworICAgIHZvaWQgKng7CiAKLQl2ID0gZ2V0X3B5bG9uZyh2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7Ci0JeCA9IFB5TG9uZ19Bc1ZvaWRQdHIodik7Ci0JUHlfREVDUkVGKHYpOwotCWlmICh4ID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShwLCAoY2hhciAqKSZ4LCBzaXplb2YgeCk7Ci0JcmV0dXJuIDA7CisgICAgdiA9IGdldF9weWxvbmcodik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGFzc2VydChQeUxvbmdfQ2hlY2sodikpOworICAgIHggPSBQeUxvbmdfQXNWb2lkUHRyKHYpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBpZiAoeCA9PSBOVUxMICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBtZW1jcHkocCwgKGNoYXIgKikmeCwgc2l6ZW9mIHgpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgZm9ybWF0ZGVmIG5hdGl2ZV90YWJsZVtdID0gewotCXsneCcsCXNpemVvZihjaGFyKSwJMCwJCU5VTEx9LAotCXsnYicsCXNpemVvZihjaGFyKSwJMCwJCW51X2J5dGUsCW5wX2J5dGV9LAotCXsnQicsCXNpemVvZihjaGFyKSwJMCwJCW51X3VieXRlLAlucF91Ynl0ZX0sCi0JeydjJywJc2l6ZW9mKGNoYXIpLAkwLAkJbnVfY2hhciwJbnBfY2hhcn0sCi0JeydzJywJc2l6ZW9mKGNoYXIpLAkwLAkJTlVMTH0sCi0JeydwJywJc2l6ZW9mKGNoYXIpLAkwLAkJTlVMTH0sCi0JeydoJywJc2l6ZW9mKHNob3J0KSwJU0hPUlRfQUxJR04sCW51X3Nob3J0LAlucF9zaG9ydH0sCi0JeydIJywJc2l6ZW9mKHNob3J0KSwJU0hPUlRfQUxJR04sCW51X3VzaG9ydCwJbnBfdXNob3J0fSwKLQl7J2knLAlzaXplb2YoaW50KSwJSU5UX0FMSUdOLAludV9pbnQsCQlucF9pbnR9LAotCXsnSScsCXNpemVvZihpbnQpLAlJTlRfQUxJR04sCW51X3VpbnQsCW5wX3VpbnR9LAotCXsnbCcsCXNpemVvZihsb25nKSwJTE9OR19BTElHTiwJbnVfbG9uZywJbnBfbG9uZ30sCi0JeydMJywJc2l6ZW9mKGxvbmcpLAlMT05HX0FMSUdOLAludV91bG9uZywJbnBfdWxvbmd9LAorICAgIHsneCcsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgTlVMTH0sCisgICAgeydiJywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBudV9ieXRlLCAgICAgICAgbnBfYnl0ZX0sCisgICAgeydCJywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBudV91Ynl0ZSwgICAgICAgbnBfdWJ5dGV9LAorICAgIHsnYycsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgbnVfY2hhciwgICAgICAgIG5wX2NoYXJ9LAorICAgIHsncycsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgTlVMTH0sCisgICAgeydwJywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7J2gnLCAgICAgICBzaXplb2Yoc2hvcnQpLCAgU0hPUlRfQUxJR04sICAgIG51X3Nob3J0LCAgICAgICBucF9zaG9ydH0sCisgICAgeydIJywgICAgICAgc2l6ZW9mKHNob3J0KSwgIFNIT1JUX0FMSUdOLCAgICBudV91c2hvcnQsICAgICAgbnBfdXNob3J0fSwKKyAgICB7J2knLCAgICAgICBzaXplb2YoaW50KSwgICAgSU5UX0FMSUdOLCAgICAgIG51X2ludCwgICAgICAgICBucF9pbnR9LAorICAgIHsnSScsICAgICAgIHNpemVvZihpbnQpLCAgICBJTlRfQUxJR04sICAgICAgbnVfdWludCwgICAgICAgIG5wX3VpbnR9LAorICAgIHsnbCcsICAgICAgIHNpemVvZihsb25nKSwgICBMT05HX0FMSUdOLCAgICAgbnVfbG9uZywgICAgICAgIG5wX2xvbmd9LAorICAgIHsnTCcsICAgICAgIHNpemVvZihsb25nKSwgICBMT05HX0FMSUdOLCAgICAgbnVfdWxvbmcsICAgICAgIG5wX3Vsb25nfSwKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCXsncScsCXNpemVvZihQWV9MT05HX0xPTkcpLCBMT05HX0xPTkdfQUxJR04sIG51X2xvbmdsb25nLCBucF9sb25nbG9uZ30sCi0JeydRJywJc2l6ZW9mKFBZX0xPTkdfTE9ORyksIExPTkdfTE9OR19BTElHTiwgbnVfdWxvbmdsb25nLG5wX3Vsb25nbG9uZ30sCisgICAgeydxJywgICAgICAgc2l6ZW9mKFBZX0xPTkdfTE9ORyksIExPTkdfTE9OR19BTElHTiwgbnVfbG9uZ2xvbmcsIG5wX2xvbmdsb25nfSwKKyAgICB7J1EnLCAgICAgICBzaXplb2YoUFlfTE9OR19MT05HKSwgTE9OR19MT05HX0FMSUdOLCBudV91bG9uZ2xvbmcsbnBfdWxvbmdsb25nfSwKICNlbmRpZgotCXsnPycsCXNpemVvZihCT09MX1RZUEUpLAlCT09MX0FMSUdOLAludV9ib29sLAlucF9ib29sfSwKLQl7J2YnLAlzaXplb2YoZmxvYXQpLAlGTE9BVF9BTElHTiwJbnVfZmxvYXQsCW5wX2Zsb2F0fSwKLQl7J2QnLAlzaXplb2YoZG91YmxlKSwJRE9VQkxFX0FMSUdOLAludV9kb3VibGUsCW5wX2RvdWJsZX0sCi0JeydQJywJc2l6ZW9mKHZvaWQgKiksCVZPSURfUF9BTElHTiwJbnVfdm9pZF9wLAlucF92b2lkX3B9LAotCXswfQorICAgIHsnPycsICAgICAgIHNpemVvZihCT09MX1RZUEUpLCAgICAgIEJPT0xfQUxJR04sICAgICBudV9ib29sLCAgICAgICAgbnBfYm9vbH0sCisgICAgeydmJywgICAgICAgc2l6ZW9mKGZsb2F0KSwgIEZMT0FUX0FMSUdOLCAgICBudV9mbG9hdCwgICAgICAgbnBfZmxvYXR9LAorICAgIHsnZCcsICAgICAgIHNpemVvZihkb3VibGUpLCBET1VCTEVfQUxJR04sICAgbnVfZG91YmxlLCAgICAgIG5wX2RvdWJsZX0sCisgICAgeydQJywgICAgICAgc2l6ZW9mKHZvaWQgKiksIFZPSURfUF9BTElHTiwgICBudV92b2lkX3AsICAgICAgbnBfdm9pZF9wfSwKKyAgICB7MH0KIH07CiAKIC8qIEJpZy1lbmRpYW4gcm91dGluZXMuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODE1LDUzICs4MTUsNTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidV9pbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCAqYnl0ZXMrKzsKLQl9IHdoaWxlICgtLWkgPiAwKTsKLQkvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLwotCWlmIChTSVpFT0ZfTE9ORyA+IGYtPnNpemUpCi0JCXggfD0gLSh4ICYgKDFMIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgbG9uZyB4ID0gMDsKKyAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOworICAgIGRvIHsKKyAgICAgICAgeCA9ICh4PDw4KSB8ICpieXRlcysrOworICAgIH0gd2hpbGUgKC0taSA+IDApOworICAgIC8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCisgICAgaWYgKFNJWkVPRl9MT05HID4gZi0+c2l6ZSkKKyAgICAgICAgeCB8PSAtKHggJiAoMUwgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1X3VpbnQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXVuc2lnbmVkIGxvbmcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCAqYnl0ZXMrKzsKLQl9IHdoaWxlICgtLWkgPiAwKTsKLQlpZiAoeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh4KTsKKyAgICB1bnNpZ25lZCBsb25nIHggPSAwOworICAgIFB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7CisgICAgZG8geworICAgICAgICB4ID0gKHg8PDgpIHwgKmJ5dGVzKys7CisgICAgfSB3aGlsZSAoLS1pID4gMCk7CisgICAgaWYgKHggPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyl4KTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidV9sb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQlQWV9MT05HX0xPTkcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCAqYnl0ZXMrKzsKLQl9IHdoaWxlICgtLWkgPiAwKTsKLQkvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLwotCWlmIChTSVpFT0ZfTE9OR19MT05HID4gZi0+c2l6ZSkKLQkJeCB8PSAtKHggJiAoKFBZX0xPTkdfTE9ORykxIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKLQlpZiAoeCA+PSBMT05HX01JTiAmJiB4IDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKKyAgICBQWV9MT05HX0xPTkcgeCA9IDA7CisgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKKyAgICBkbyB7CisgICAgICAgIHggPSAoeDw8OCkgfCAqYnl0ZXMrKzsKKyAgICB9IHdoaWxlICgtLWkgPiAwKTsKKyAgICAvKiBFeHRlbmQgdGhlIHNpZ24gYml0LiAqLworICAgIGlmIChTSVpFT0ZfTE9OR19MT05HID4gZi0+c2l6ZSkKKyAgICAgICAgeCB8PSAtKHggJiAoKFBZX0xPTkdfTE9ORykxIDw8ICgoOCAqIGYtPnNpemUpIC0gMSkpKTsKKyAgICBpZiAoeCA+PSBMT05HX01JTiAmJiB4IDw9IExPTkdfTUFYKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfU0FGRV9ET1dOQ0FTVCh4LCBQWV9MT05HX0xPTkcsIGxvbmcpKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh4KTsKICNlbHNlCi0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICAgICAgOCwKLQkJCQkgICAgICAwLCAvKiBsaXR0bGUtZW5kaWFuICovCi0JCQkJICAgICAgMSAgLyogc2lnbmVkICovKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGxpdHRsZS1lbmRpYW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAxICAvKiBzaWduZWQgKi8pOwogI2VuZGlmCiB9CiAKQEAgLTg2OSwxODEgKzg2OSwxODEgQEAKIGJ1X3Vsb25nbG9uZyhjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgeCA9IDA7Ci0JUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKLQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKLQlkbyB7Ci0JCXggPSAoeDw8OCkgfCAqYnl0ZXMrKzsKLQl9IHdoaWxlICgtLWkgPiAwKTsKLQlpZiAoeCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh4KTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeCA9IDA7CisgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKKyAgICBkbyB7CisgICAgICAgIHggPSAoeDw8OCkgfCAqYnl0ZXMrKzsKKyAgICB9IHdoaWxlICgtLWkgPiAwKTsKKyAgICBpZiAoeCA8PSBMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5X1NBRkVfRE9XTkNBU1QoeCwgdW5zaWduZWQgUFlfTE9OR19MT05HLCBsb25nKSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh4KTsKICNlbHNlCi0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCi0JCQkJICAgICAgOCwKLQkJCQkgICAgICAwLCAvKiBsaXR0bGUtZW5kaWFuICovCi0JCQkJICAgICAgMCAgLyogc2lnbmVkICovKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGxpdHRsZS1lbmRpYW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAwICAvKiBzaWduZWQgKi8pOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidV9mbG9hdChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JcmV0dXJuIHVucGFja19mbG9hdChwLCAwKTsKKyAgICByZXR1cm4gdW5wYWNrX2Zsb2F0KHAsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVfZG91YmxlKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlyZXR1cm4gdW5wYWNrX2RvdWJsZShwLCAwKTsKKyAgICByZXR1cm4gdW5wYWNrX2RvdWJsZShwLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1X2Jvb2woY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWNoYXIgeDsKLQltZW1jcHkoKGNoYXIgKikmeCwgcCwgc2l6ZW9mIHgpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoeCAhPSAwKTsKKyAgICBjaGFyIHg7CisgICAgbWVtY3B5KChjaGFyICopJngsIHAsIHNpemVvZiB4KTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHggIT0gMCk7CiB9CiAKIHN0YXRpYyBpbnQKIGJwX2ludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeDsKLQlQeV9zc2l6ZV90IGk7Ci0JaWYgKGdldF93cmFwcGVkX2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWkgPSBmLT5zaXplOwotCWlmIChpICE9IFNJWkVPRl9MT05HKSB7Ci0JCWlmICgoaSA9PSAyKSAmJiAoeCA8IC0zMjc2OCB8fCB4ID4gMzI3NjcpKQotCQkJUkFOR0VfRVJST1IoeCwgZiwgMCwgMHhmZmZmTCk7CisgICAgbG9uZyB4OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpZiAoZ2V0X3dyYXBwZWRfbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaSA9IGYtPnNpemU7CisgICAgaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKKyAgICAgICAgaWYgKChpID09IDIpICYmICh4IDwgLTMyNzY4IHx8IHggPiAzMjc2NykpCisgICAgICAgICAgICBSQU5HRV9FUlJPUih4LCBmLCAwLCAweGZmZmZMKTsKICNpZiAoU0laRU9GX0xPTkcgIT0gNCkKLQkJZWxzZSBpZiAoKGkgPT0gNCkgJiYgKHggPCAtMjE0NzQ4MzY0OEwgfHwgeCA+IDIxNDc0ODM2NDdMKSkKLQkJCVJBTkdFX0VSUk9SKHgsIGYsIDAsIDB4ZmZmZmZmZmZMKTsKKyAgICAgICAgZWxzZSBpZiAoKGkgPT0gNCkgJiYgKHggPCAtMjE0NzQ4MzY0OEwgfHwgeCA+IDIxNDc0ODM2NDdMKSkKKyAgICAgICAgICAgIFJBTkdFX0VSUk9SKHgsIGYsIDAsIDB4ZmZmZmZmZmZMKTsKICNlbmRpZgogI2lmZGVmIFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HCi0JCWVsc2UgaWYgKChpID09IDEpICYmICh4IDwgLTEyOCB8fCB4ID4gMTI3KSkKLQkJCVJBTkdFX0VSUk9SKHgsIGYsIDAsIDB4ZmZMKTsKKyAgICAgICAgZWxzZSBpZiAoKGkgPT0gMSkgJiYgKHggPCAtMTI4IHx8IHggPiAxMjcpKQorICAgICAgICAgICAgUkFOR0VfRVJST1IoeCwgZiwgMCwgMHhmZkwpOwogI2VuZGlmCi0JfQotCWRvIHsKLQkJcFstLWldID0gKGNoYXIpeDsKLQkJeCA+Pj0gODsKLQl9IHdoaWxlIChpID4gMCk7Ci0JcmV0dXJuIDA7CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgcFstLWldID0gKGNoYXIpeDsKKyAgICAgICAgeCA+Pj0gODsKKyAgICB9IHdoaWxlIChpID4gMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGJwX3VpbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JUHlfc3NpemVfdCBpOwotCWlmIChnZXRfd3JhcHBlZF91bG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaSA9IGYtPnNpemU7Ci0JaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKLQkJdW5zaWduZWQgbG9uZyBtYXhpbnQgPSAxOwotCQltYXhpbnQgPDw9ICh1bnNpZ25lZCBsb25nKShpICogOCk7Ci0JCWlmICh4ID49IG1heGludCkKLQkJCVJBTkdFX0VSUk9SKHgsIGYsIDEsIG1heGludCAtIDEpOwotCX0KLQlkbyB7Ci0JCXBbLS1pXSA9IChjaGFyKXg7Ci0JCXggPj49IDg7Ci0JfSB3aGlsZSAoaSA+IDApOwotCXJldHVybiAwOworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaWYgKGdldF93cmFwcGVkX3Vsb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpID0gZi0+c2l6ZTsKKyAgICBpZiAoaSAhPSBTSVpFT0ZfTE9ORykgeworICAgICAgICB1bnNpZ25lZCBsb25nIG1heGludCA9IDE7CisgICAgICAgIG1heGludCA8PD0gKHVuc2lnbmVkIGxvbmcpKGkgKiA4KTsKKyAgICAgICAgaWYgKHggPj0gbWF4aW50KQorICAgICAgICAgICAgUkFOR0VfRVJST1IoeCwgZiwgMSwgbWF4aW50IC0gMSk7CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgcFstLWldID0gKGNoYXIpeDsKKyAgICAgICAgeCA+Pj0gODsKKyAgICB9IHdoaWxlIChpID4gMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGJwX2xvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JaW50IHJlczsKLQl2ID0gZ2V0X3B5bG9uZyh2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0ICopdiwKLQkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgIDgsCi0JCQkJICAwLCAvKiBsaXR0bGVfZW5kaWFuICovCi0JCQkJICAxICAvKiBzaWduZWQgKi8pOwotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gcmVzOworICAgIGludCByZXM7CisgICAgdiA9IGdldF9weWxvbmcodik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbGl0dGxlX2VuZGlhbiAqLworICAgICAgICAgICAgICAgICAgMSAgLyogc2lnbmVkICovKTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogYnBfdWxvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JaW50IHJlczsKLQl2ID0gZ2V0X3B5bG9uZyh2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0ICopdiwKLQkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgIDgsCi0JCQkJICAwLCAvKiBsaXR0bGVfZW5kaWFuICovCi0JCQkJICAwICAvKiBzaWduZWQgKi8pOwotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gcmVzOworICAgIGludCByZXM7CisgICAgdiA9IGdldF9weWxvbmcodik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbGl0dGxlX2VuZGlhbiAqLworICAgICAgICAgICAgICAgICAgMCAgLyogc2lnbmVkICovKTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogYnBfZmxvYXQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIF9QeUZsb2F0X1BhY2s0KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMCk7CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGFyZ3VtZW50IGlzIG5vdCBhIGZsb2F0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIF9QeUZsb2F0X1BhY2s0KHgsICh1bnNpZ25lZCBjaGFyICopcCwgMCk7CiB9CiAKIHN0YXRpYyBpbnQKIGJwX2RvdWJsZShjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAwKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAwKTsKIH0KIAogc3RhdGljIGludAogYnBfYm9vbChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWNoYXIgeTsgCi0JeSA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKLQltZW1jcHkocCwgKGNoYXIgKikmeSwgc2l6ZW9mIHkpOwotCXJldHVybiAwOworICAgIGNoYXIgeTsKKyAgICB5ID0gUHlPYmplY3RfSXNUcnVlKHYpOworICAgIG1lbWNweShwLCAoY2hhciAqKSZ5LCBzaXplb2YgeSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBmb3JtYXRkZWYgYmlnZW5kaWFuX3RhYmxlW10gPSB7Ci0Jeyd4JywJMSwJCTAsCQlOVUxMfSwKKyAgICB7J3gnLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIE5VTEx9LAogI2lmZGVmIFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HCi0JLyogTmF0aXZlIHBhY2tlcnMgZG8gcmFuZ2UgY2hlY2tpbmcgd2l0aG91dCBvdmVyZmxvdyBtYXNraW5nLiAqLwotCXsnYicsCTEsCQkwLAkJbnVfYnl0ZSwJYnBfaW50fSwKLQl7J0InLAkxLAkJMCwJCW51X3VieXRlLAlicF91aW50fSwKKyAgICAvKiBOYXRpdmUgcGFja2VycyBkbyByYW5nZSBjaGVja2luZyB3aXRob3V0IG92ZXJmbG93IG1hc2tpbmcuICovCisgICAgeydiJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBudV9ieXRlLCAgICAgICAgYnBfaW50fSwKKyAgICB7J0InLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIG51X3VieXRlLCAgICAgICBicF91aW50fSwKICNlbHNlCi0JeydiJywJMSwJCTAsCQludV9ieXRlLAlucF9ieXRlfSwKLQl7J0InLAkxLAkJMCwJCW51X3VieXRlLAlucF91Ynl0ZX0sCisgICAgeydiJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBudV9ieXRlLCAgICAgICAgbnBfYnl0ZX0sCisgICAgeydCJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBudV91Ynl0ZSwgICAgICAgbnBfdWJ5dGV9LAogI2VuZGlmCi0JeydjJywJMSwJCTAsCQludV9jaGFyLAlucF9jaGFyfSwKLQl7J3MnLAkxLAkJMCwJCU5VTEx9LAotCXsncCcsCTEsCQkwLAkJTlVMTH0sCi0JeydoJywJMiwJCTAsCQlidV9pbnQsCQlicF9pbnR9LAotCXsnSCcsCTIsCQkwLAkJYnVfdWludCwJYnBfdWludH0sCi0JeydpJywJNCwJCTAsCQlidV9pbnQsCQlicF9pbnR9LAotCXsnSScsCTQsCQkwLAkJYnVfdWludCwJYnBfdWludH0sCi0JeydsJywJNCwJCTAsCQlidV9pbnQsCQlicF9pbnR9LAotCXsnTCcsCTQsCQkwLAkJYnVfdWludCwJYnBfdWludH0sCi0JeydxJywJOCwJCTAsCQlidV9sb25nbG9uZywJYnBfbG9uZ2xvbmd9LAotCXsnUScsCTgsCQkwLAkJYnVfdWxvbmdsb25nLAlicF91bG9uZ2xvbmd9LAotCXsnPycsCTEsCQkwLAkJYnVfYm9vbCwJYnBfYm9vbH0sCi0JeydmJywJNCwJCTAsCQlidV9mbG9hdCwJYnBfZmxvYXR9LAotCXsnZCcsCTgsCQkwLAkJYnVfZG91YmxlLAlicF9kb3VibGV9LAotCXswfQorICAgIHsnYycsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbnVfY2hhciwgICAgICAgIG5wX2NoYXJ9LAorICAgIHsncycsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgTlVMTH0sCisgICAgeydwJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBOVUxMfSwKKyAgICB7J2gnLCAgICAgICAyLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2ludCwgICAgICAgICBicF9pbnR9LAorICAgIHsnSCcsICAgICAgIDIsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfdWludCwgICAgICAgIGJwX3VpbnR9LAorICAgIHsnaScsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgYnVfaW50LCAgICAgICAgIGJwX2ludH0sCisgICAgeydJJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV91aW50LCAgICAgICAgYnBfdWludH0sCisgICAgeydsJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9pbnQsICAgICAgICAgYnBfaW50fSwKKyAgICB7J0wnLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X3VpbnQsICAgICAgICBicF91aW50fSwKKyAgICB7J3EnLCAgICAgICA4LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2xvbmdsb25nLCAgICBicF9sb25nbG9uZ30sCisgICAgeydRJywgICAgICAgOCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV91bG9uZ2xvbmcsICAgYnBfdWxvbmdsb25nfSwKKyAgICB7Jz8nLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2Jvb2wsICAgICAgICBicF9ib29sfSwKKyAgICB7J2YnLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGJ1X2Zsb2F0LCAgICAgICBicF9mbG9hdH0sCisgICAgeydkJywgICAgICAgOCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9kb3VibGUsICAgICAgYnBfZG91YmxlfSwKKyAgICB7MH0KIH07CiAKIC8qIExpdHRsZS1lbmRpYW4gcm91dGluZXMuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTA1MSw1MyArMTA1MSw1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGx1X2ludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JbG9uZyB4ID0gMDsKLQlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwotCWRvIHsKLQkJeCA9ICh4PDw4KSB8IGJ5dGVzWy0taV07Ci0JfSB3aGlsZSAoaSA+IDApOwotCS8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCi0JaWYgKFNJWkVPRl9MT05HID4gZi0+c2l6ZSkKLQkJeCB8PSAtKHggJiAoMUwgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKKyAgICBsb25nIHggPSAwOworICAgIFB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7CisgICAgZG8geworICAgICAgICB4ID0gKHg8PDgpIHwgYnl0ZXNbLS1pXTsKKyAgICB9IHdoaWxlIChpID4gMCk7CisgICAgLyogRXh0ZW5kIHRoZSBzaWduIGJpdC4gKi8KKyAgICBpZiAoU0laRU9GX0xPTkcgPiBmLT5zaXplKQorICAgICAgICB4IHw9IC0oeCAmICgxTCA8PCAoKDggKiBmLT5zaXplKSAtIDEpKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbHVfdWludChjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JdW5zaWduZWQgbG9uZyB4ID0gMDsKLQlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwotCWRvIHsKLQkJeCA9ICh4PDw4KSB8IGJ5dGVzWy0taV07Ci0JfSB3aGlsZSAoaSA+IDApOwotCWlmICh4IDw9IExPTkdfTUFYKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpeCk7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKChsb25nKXgpOworICAgIHVuc2lnbmVkIGxvbmcgeCA9IDA7CisgICAgUHlfc3NpemVfdCBpID0gZi0+c2l6ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopcDsKKyAgICBkbyB7CisgICAgICAgIHggPSAoeDw8OCkgfCBieXRlc1stLWldOworICAgIH0gd2hpbGUgKGkgPiAwKTsKKyAgICBpZiAoeCA8PSBMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXgpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygobG9uZyl4KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGx1X2xvbmdsb25nKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCVBZX0xPTkdfTE9ORyB4ID0gMDsKLQlQeV9zc2l6ZV90IGkgPSBmLT5zaXplOwotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOwotCWRvIHsKLQkJeCA9ICh4PDw4KSB8IGJ5dGVzWy0taV07Ci0JfSB3aGlsZSAoaSA+IDApOwotCS8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCi0JaWYgKFNJWkVPRl9MT05HX0xPTkcgPiBmLT5zaXplKQotCQl4IHw9IC0oeCAmICgoUFlfTE9OR19MT05HKTEgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOwotCWlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIFBZX0xPTkdfTE9ORywgbG9uZykpOwotCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOworICAgIFBZX0xPTkdfTE9ORyB4ID0gMDsKKyAgICBQeV9zc2l6ZV90IGkgPSBmLT5zaXplOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwOworICAgIGRvIHsKKyAgICAgICAgeCA9ICh4PDw4KSB8IGJ5dGVzWy0taV07CisgICAgfSB3aGlsZSAoaSA+IDApOworICAgIC8qIEV4dGVuZCB0aGUgc2lnbiBiaXQuICovCisgICAgaWYgKFNJWkVPRl9MT05HX0xPTkcgPiBmLT5zaXplKQorICAgICAgICB4IHw9IC0oeCAmICgoUFlfTE9OR19MT05HKTEgPDwgKCg4ICogZi0+c2l6ZSkgLSAxKSkpOworICAgIGlmICh4ID49IExPTkdfTUlOICYmIHggPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIFBZX0xPTkdfTE9ORywgbG9uZykpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHgpOwogI2Vsc2UKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KChjb25zdCB1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgICAgICA4LAotCQkJCSAgICAgIDEsIC8qIGxpdHRsZS1lbmRpYW4gKi8KLQkJCQkgICAgICAxICAvKiBzaWduZWQgKi8pOworICAgIHJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogbGl0dGxlLWVuZGlhbiAqLworICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIHNpZ25lZCAqLyk7CiAjZW5kaWYKIH0KIApAQCAtMTEwNSwxOTIgKzExMDUsMTkyIEBACiBsdV91bG9uZ2xvbmcoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JdW5zaWduZWQgUFlfTE9OR19MT05HIHggPSAwOwotCVB5X3NzaXplX3QgaSA9IGYtPnNpemU7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7Ci0JZG8gewotCQl4ID0gKHg8PDgpIHwgYnl0ZXNbLS1pXTsKLQl9IHdoaWxlIChpID4gMCk7Ci0JaWYgKHggPD0gTE9OR19NQVgpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORywgbG9uZykpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoeCk7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHggPSAwOworICAgIFB5X3NzaXplX3QgaSA9IGYtPnNpemU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXA7CisgICAgZG8geworICAgICAgICB4ID0gKHg8PDgpIHwgYnl0ZXNbLS1pXTsKKyAgICB9IHdoaWxlIChpID4gMCk7CisgICAgaWYgKHggPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9TQUZFX0RPV05DQVNUKHgsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORywgbG9uZykpOworICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoeCk7CiAjZWxzZQotCXJldHVybiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgICAgIDgsCi0JCQkJICAgICAgMSwgLyogbGl0dGxlLWVuZGlhbiAqLwotCQkJCSAgICAgIDAgIC8qIHNpZ25lZCAqLyk7CisgICAgcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgoY29uc3QgdW5zaWduZWQgY2hhciAqKXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAvKiBsaXR0bGUtZW5kaWFuICovCisgICAgICAgICAgICAgICAgICAgICAgMCAgLyogc2lnbmVkICovKTsKICNlbmRpZgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbHVfZmxvYXQoY29uc3QgY2hhciAqcCwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCXJldHVybiB1bnBhY2tfZmxvYXQocCwgMSk7CisgICAgcmV0dXJuIHVucGFja19mbG9hdChwLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGx1X2RvdWJsZShjb25zdCBjaGFyICpwLCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JcmV0dXJuIHVucGFja19kb3VibGUocCwgMSk7CisgICAgcmV0dXJuIHVucGFja19kb3VibGUocCwgMSk7CiB9CiAKIHN0YXRpYyBpbnQKIGxwX2ludChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWxvbmcgeDsKLQlQeV9zc2l6ZV90IGk7Ci0JaWYgKGdldF93cmFwcGVkX2xvbmcodiwgJngpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWkgPSBmLT5zaXplOwotCWlmIChpICE9IFNJWkVPRl9MT05HKSB7Ci0JCWlmICgoaSA9PSAyKSAmJiAoeCA8IC0zMjc2OCB8fCB4ID4gMzI3NjcpKQotCQkJUkFOR0VfRVJST1IoeCwgZiwgMCwgMHhmZmZmTCk7CisgICAgbG9uZyB4OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpZiAoZ2V0X3dyYXBwZWRfbG9uZyh2LCAmeCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaSA9IGYtPnNpemU7CisgICAgaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKKyAgICAgICAgaWYgKChpID09IDIpICYmICh4IDwgLTMyNzY4IHx8IHggPiAzMjc2NykpCisgICAgICAgICAgICBSQU5HRV9FUlJPUih4LCBmLCAwLCAweGZmZmZMKTsKICNpZiAoU0laRU9GX0xPTkcgIT0gNCkKLQkJZWxzZSBpZiAoKGkgPT0gNCkgJiYgKHggPCAtMjE0NzQ4MzY0OEwgfHwgeCA+IDIxNDc0ODM2NDdMKSkKLQkJCVJBTkdFX0VSUk9SKHgsIGYsIDAsIDB4ZmZmZmZmZmZMKTsKKyAgICAgICAgZWxzZSBpZiAoKGkgPT0gNCkgJiYgKHggPCAtMjE0NzQ4MzY0OEwgfHwgeCA+IDIxNDc0ODM2NDdMKSkKKyAgICAgICAgICAgIFJBTkdFX0VSUk9SKHgsIGYsIDAsIDB4ZmZmZmZmZmZMKTsKICNlbmRpZgogI2lmZGVmIFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HCi0JCWVsc2UgaWYgKChpID09IDEpICYmICh4IDwgLTEyOCB8fCB4ID4gMTI3KSkKLQkJCVJBTkdFX0VSUk9SKHgsIGYsIDAsIDB4ZmZMKTsKKyAgICAgICAgZWxzZSBpZiAoKGkgPT0gMSkgJiYgKHggPCAtMTI4IHx8IHggPiAxMjcpKQorICAgICAgICAgICAgUkFOR0VfRVJST1IoeCwgZiwgMCwgMHhmZkwpOwogI2VuZGlmCi0JfQotCWRvIHsKLQkJKnArKyA9IChjaGFyKXg7Ci0JCXggPj49IDg7Ci0JfSB3aGlsZSAoLS1pID4gMCk7Ci0JcmV0dXJuIDA7CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgKnArKyA9IChjaGFyKXg7CisgICAgICAgIHggPj49IDg7CisgICAgfSB3aGlsZSAoLS1pID4gMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxwX3VpbnQoY2hhciAqcCwgUHlPYmplY3QgKnYsIGNvbnN0IGZvcm1hdGRlZiAqZikKIHsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JUHlfc3NpemVfdCBpOwotCWlmIChnZXRfd3JhcHBlZF91bG9uZyh2LCAmeCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaSA9IGYtPnNpemU7Ci0JaWYgKGkgIT0gU0laRU9GX0xPTkcpIHsKLQkJdW5zaWduZWQgbG9uZyBtYXhpbnQgPSAxOwotCQltYXhpbnQgPDw9ICh1bnNpZ25lZCBsb25nKShpICogOCk7Ci0JCWlmICh4ID49IG1heGludCkKLQkJCVJBTkdFX0VSUk9SKHgsIGYsIDEsIG1heGludCAtIDEpOwotCX0KLQlkbyB7Ci0JCSpwKysgPSAoY2hhcil4OwotCQl4ID4+PSA4OwotCX0gd2hpbGUgKC0taSA+IDApOwotCXJldHVybiAwOworICAgIHVuc2lnbmVkIGxvbmcgeDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaWYgKGdldF93cmFwcGVkX3Vsb25nKHYsICZ4KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpID0gZi0+c2l6ZTsKKyAgICBpZiAoaSAhPSBTSVpFT0ZfTE9ORykgeworICAgICAgICB1bnNpZ25lZCBsb25nIG1heGludCA9IDE7CisgICAgICAgIG1heGludCA8PD0gKHVuc2lnbmVkIGxvbmcpKGkgKiA4KTsKKyAgICAgICAgaWYgKHggPj0gbWF4aW50KQorICAgICAgICAgICAgUkFOR0VfRVJST1IoeCwgZiwgMSwgbWF4aW50IC0gMSk7CisgICAgfQorICAgIGRvIHsKKyAgICAgICAgKnArKyA9IChjaGFyKXg7CisgICAgICAgIHggPj49IDg7CisgICAgfSB3aGlsZSAoLS1pID4gMCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxwX2xvbmdsb25nKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JaW50IHJlczsKLQl2ID0gZ2V0X3B5bG9uZyh2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0Kil2LAotCQkJICAgCSAgKHVuc2lnbmVkIGNoYXIgKilwLAotCQkJCSAgOCwKLQkJCQkgIDEsIC8qIGxpdHRsZV9lbmRpYW4gKi8KLQkJCQkgIDEgIC8qIHNpZ25lZCAqLyk7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiByZXM7CisgICAgaW50IHJlczsKKyAgICB2ID0gZ2V0X3B5bG9uZyh2KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0Kil2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIC8qIGxpdHRsZV9lbmRpYW4gKi8KKyAgICAgICAgICAgICAgICAgIDEgIC8qIHNpZ25lZCAqLyk7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIGxwX3Vsb25nbG9uZyhjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWludCByZXM7Ci0JdiA9IGdldF9weWxvbmcodik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCopdiwKLQkJCSAgIAkgICh1bnNpZ25lZCBjaGFyICopcCwKLQkJCQkgIDgsCi0JCQkJICAxLCAvKiBsaXR0bGVfZW5kaWFuICovCi0JCQkJICAwICAvKiBzaWduZWQgKi8pOwotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gcmVzOworICAgIGludCByZXM7CisgICAgdiA9IGdldF9weWxvbmcodik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCopdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAvKiBsaXR0bGVfZW5kaWFuICovCisgICAgICAgICAgICAgICAgICAwICAvKiBzaWduZWQgKi8pOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBscF9mbG9hdChjaGFyICpwLCBQeU9iamVjdCAqdiwgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAxKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgYXJndW1lbnQgaXMgbm90IGEgZmxvYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gX1B5RmxvYXRfUGFjazQoeCwgKHVuc2lnbmVkIGNoYXIgKilwLCAxKTsKIH0KIAogc3RhdGljIGludAogbHBfZG91YmxlKGNoYXIgKnAsIFB5T2JqZWN0ICp2LCBjb25zdCBmb3JtYXRkZWYgKmYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDEpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYSBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBfUHlGbG9hdF9QYWNrOCh4LCAodW5zaWduZWQgY2hhciAqKXAsIDEpOwogfQogCiBzdGF0aWMgZm9ybWF0ZGVmIGxpbGVuZGlhbl90YWJsZVtdID0gewotCXsneCcsCTEsCQkwLAkJTlVMTH0sCisgICAgeyd4JywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBOVUxMfSwKICNpZmRlZiBQWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORwotCS8qIE5hdGl2ZSBwYWNrZXJzIGRvIHJhbmdlIGNoZWNraW5nIHdpdGhvdXQgb3ZlcmZsb3cgbWFza2luZy4gKi8KLQl7J2InLAkxLAkJMCwJCW51X2J5dGUsCWxwX2ludH0sCi0JeydCJywJMSwJCTAsCQludV91Ynl0ZSwJbHBfdWludH0sCisgICAgLyogTmF0aXZlIHBhY2tlcnMgZG8gcmFuZ2UgY2hlY2tpbmcgd2l0aG91dCBvdmVyZmxvdyBtYXNraW5nLiAqLworICAgIHsnYicsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbnVfYnl0ZSwgICAgICAgIGxwX2ludH0sCisgICAgeydCJywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBudV91Ynl0ZSwgICAgICAgbHBfdWludH0sCiAjZWxzZQotCXsnYicsCTEsCQkwLAkJbnVfYnl0ZSwJbnBfYnl0ZX0sCi0JeydCJywJMSwJCTAsCQludV91Ynl0ZSwJbnBfdWJ5dGV9LAorICAgIHsnYicsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbnVfYnl0ZSwgICAgICAgIG5wX2J5dGV9LAorICAgIHsnQicsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbnVfdWJ5dGUsICAgICAgIG5wX3VieXRlfSwKICNlbmRpZgotCXsnYycsCTEsCQkwLAkJbnVfY2hhciwJbnBfY2hhcn0sCi0JeydzJywJMSwJCTAsCQlOVUxMfSwKLQl7J3AnLAkxLAkJMCwJCU5VTEx9LAotCXsnaCcsCTIsCQkwLAkJbHVfaW50LAkJbHBfaW50fSwKLQl7J0gnLAkyLAkJMCwJCWx1X3VpbnQsCWxwX3VpbnR9LAotCXsnaScsCTQsCQkwLAkJbHVfaW50LAkJbHBfaW50fSwKLQl7J0knLAk0LAkJMCwJCWx1X3VpbnQsCWxwX3VpbnR9LAotCXsnbCcsCTQsCQkwLAkJbHVfaW50LAkJbHBfaW50fSwKLQl7J0wnLAk0LAkJMCwJCWx1X3VpbnQsCWxwX3VpbnR9LAotCXsncScsCTgsCQkwLAkJbHVfbG9uZ2xvbmcsCWxwX2xvbmdsb25nfSwKLQl7J1EnLAk4LAkJMCwJCWx1X3Vsb25nbG9uZywJbHBfdWxvbmdsb25nfSwKLQl7Jz8nLAkxLAkJMCwJCWJ1X2Jvb2wsCWJwX2Jvb2x9LCAvKiBTdGQgcmVwIG5vdCBlbmRpYW4gZGVwLAotCQlidXQgcG90ZW50aWFsbHkgZGlmZmVyZW50IGZyb20gbmF0aXZlIHJlcCAtLSByZXVzZSBieF9ib29sIGZ1bmNzLiAqLwotCXsnZicsCTQsCQkwLAkJbHVfZmxvYXQsCWxwX2Zsb2F0fSwKLQl7J2QnLAk4LAkJMCwJCWx1X2RvdWJsZSwJbHBfZG91YmxlfSwKLQl7MH0KKyAgICB7J2MnLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIG51X2NoYXIsICAgICAgICBucF9jaGFyfSwKKyAgICB7J3MnLCAgICAgICAxLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIE5VTEx9LAorICAgIHsncCcsICAgICAgIDEsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgTlVMTH0sCisgICAgeydoJywgICAgICAgMiwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV9pbnQsICAgICAgICAgbHBfaW50fSwKKyAgICB7J0gnLCAgICAgICAyLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X3VpbnQsICAgICAgICBscF91aW50fSwKKyAgICB7J2knLCAgICAgICA0LCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIGx1X2ludCwgICAgICAgICBscF9pbnR9LAorICAgIHsnSScsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfdWludCwgICAgICAgIGxwX3VpbnR9LAorICAgIHsnbCcsICAgICAgIDQsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfaW50LCAgICAgICAgIGxwX2ludH0sCisgICAgeydMJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV91aW50LCAgICAgICAgbHBfdWludH0sCisgICAgeydxJywgICAgICAgOCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV9sb25nbG9uZywgICAgbHBfbG9uZ2xvbmd9LAorICAgIHsnUScsICAgICAgIDgsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfdWxvbmdsb25nLCAgIGxwX3Vsb25nbG9uZ30sCisgICAgeyc/JywgICAgICAgMSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBidV9ib29sLCAgICAgICAgYnBfYm9vbH0sIC8qIFN0ZCByZXAgbm90IGVuZGlhbiBkZXAsCisgICAgICAgIGJ1dCBwb3RlbnRpYWxseSBkaWZmZXJlbnQgZnJvbSBuYXRpdmUgcmVwIC0tIHJldXNlIGJ4X2Jvb2wgZnVuY3MuICovCisgICAgeydmJywgICAgICAgNCwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBsdV9mbG9hdCwgICAgICAgbHBfZmxvYXR9LAorICAgIHsnZCcsICAgICAgIDgsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgbHVfZG91YmxlLCAgICAgIGxwX2RvdWJsZX0sCisgICAgezB9CiB9OwogCiAKIHN0YXRpYyBjb25zdCBmb3JtYXRkZWYgKgogd2hpY2h0YWJsZShjaGFyICoqcGZtdCkKIHsKLQljb25zdCBjaGFyICpmbXQgPSAoKnBmbXQpKys7IC8qIE1heSBiZSBiYWNrZWQgb3V0IG9mIGxhdGVyICovCi0Jc3dpdGNoICgqZm10KSB7Ci0JY2FzZSAnPCc6Ci0JCXJldHVybiBsaWxlbmRpYW5fdGFibGU7Ci0JY2FzZSAnPic6Ci0JY2FzZSAnISc6IC8qIE5ldHdvcmsgYnl0ZSBvcmRlciBpcyBiaWctZW5kaWFuICovCi0JCXJldHVybiBiaWdlbmRpYW5fdGFibGU7Ci0JY2FzZSAnPSc6IHsgLyogSG9zdCBieXRlIG9yZGVyIC0tIGRpZmZlcmVudCBmcm9tIG5hdGl2ZSBpbiBhbGlnbWVudCEgKi8KLQkJaW50IG4gPSAxOwotCQljaGFyICpwID0gKGNoYXIgKikgJm47Ci0JCWlmICgqcCA9PSAxKQotCQkJcmV0dXJuIGxpbGVuZGlhbl90YWJsZTsKLQkJZWxzZQotCQkJcmV0dXJuIGJpZ2VuZGlhbl90YWJsZTsKLQl9Ci0JZGVmYXVsdDoKLQkJLS0qcGZtdDsgLyogQmFjayBvdXQgb2YgcG9pbnRlciBpbmNyZW1lbnQgKi8KLQkJLyogRmFsbCB0aHJvdWdoICovCi0JY2FzZSAnQCc6Ci0JCXJldHVybiBuYXRpdmVfdGFibGU7Ci0JfQorICAgIGNvbnN0IGNoYXIgKmZtdCA9ICgqcGZtdCkrKzsgLyogTWF5IGJlIGJhY2tlZCBvdXQgb2YgbGF0ZXIgKi8KKyAgICBzd2l0Y2ggKCpmbXQpIHsKKyAgICBjYXNlICc8JzoKKyAgICAgICAgcmV0dXJuIGxpbGVuZGlhbl90YWJsZTsKKyAgICBjYXNlICc+JzoKKyAgICBjYXNlICchJzogLyogTmV0d29yayBieXRlIG9yZGVyIGlzIGJpZy1lbmRpYW4gKi8KKyAgICAgICAgcmV0dXJuIGJpZ2VuZGlhbl90YWJsZTsKKyAgICBjYXNlICc9JzogeyAvKiBIb3N0IGJ5dGUgb3JkZXIgLS0gZGlmZmVyZW50IGZyb20gbmF0aXZlIGluIGFsaWdtZW50ISAqLworICAgICAgICBpbnQgbiA9IDE7CisgICAgICAgIGNoYXIgKnAgPSAoY2hhciAqKSAmbjsKKyAgICAgICAgaWYgKCpwID09IDEpCisgICAgICAgICAgICByZXR1cm4gbGlsZW5kaWFuX3RhYmxlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gYmlnZW5kaWFuX3RhYmxlOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICAtLSpwZm10OyAvKiBCYWNrIG91dCBvZiBwb2ludGVyIGluY3JlbWVudCAqLworICAgICAgICAvKiBGYWxsIHRocm91Z2ggKi8KKyAgICBjYXNlICdAJzoKKyAgICAgICAgcmV0dXJuIG5hdGl2ZV90YWJsZTsKKyAgICB9CiB9CiAKIApAQCAtMTI5OSwxMyArMTI5OSwxMyBAQAogc3RhdGljIGNvbnN0IGZvcm1hdGRlZiAqCiBnZXRlbnRyeShpbnQgYywgY29uc3QgZm9ybWF0ZGVmICpmKQogewotCWZvciAoOyBmLT5mb3JtYXQgIT0gJ1wwJzsgZisrKSB7Ci0JCWlmIChmLT5mb3JtYXQgPT0gYykgewotCQkJcmV0dXJuIGY7Ci0JCX0KLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLCAiYmFkIGNoYXIgaW4gc3RydWN0IGZvcm1hdCIpOwotCXJldHVybiBOVUxMOworICAgIGZvciAoOyBmLT5mb3JtYXQgIT0gJ1wwJzsgZisrKSB7CisgICAgICAgIGlmIChmLT5mb3JtYXQgPT0gYykgeworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLCAiYmFkIGNoYXIgaW4gc3RydWN0IGZvcm1hdCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTEzMTQsMTQgKzEzMTQsMTQgQEAKIHN0YXRpYyBpbnQKIGFsaWduKFB5X3NzaXplX3Qgc2l6ZSwgY2hhciBjLCBjb25zdCBmb3JtYXRkZWYgKmUpCiB7Ci0JaWYgKGUtPmZvcm1hdCA9PSBjKSB7Ci0JCWlmIChlLT5hbGlnbm1lbnQpIHsKLQkJCXNpemUgPSAoKHNpemUgKyBlLT5hbGlnbm1lbnQgLSAxKQotCQkJCS8gZS0+YWxpZ25tZW50KQotCQkJCSogZS0+YWxpZ25tZW50OwotCQl9Ci0JfQotCXJldHVybiBzaXplOworICAgIGlmIChlLT5mb3JtYXQgPT0gYykgeworICAgICAgICBpZiAoZS0+YWxpZ25tZW50KSB7CisgICAgICAgICAgICBzaXplID0gKChzaXplICsgZS0+YWxpZ25tZW50IC0gMSkKKyAgICAgICAgICAgICAgICAvIGUtPmFsaWdubWVudCkKKyAgICAgICAgICAgICAgICAqIGUtPmFsaWdubWVudDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKIH0KIAogCkBAIC0xMzMwLDIwNyArMTMzMCwyMDcgQEAKIHN0YXRpYyBpbnQKIHByZXBhcmVfcyhQeVN0cnVjdE9iamVjdCAqc2VsZikKIHsKLQljb25zdCBmb3JtYXRkZWYgKmY7Ci0JY29uc3QgZm9ybWF0ZGVmICplOwotCWZvcm1hdGNvZGUgKmNvZGVzOworICAgIGNvbnN0IGZvcm1hdGRlZiAqZjsKKyAgICBjb25zdCBmb3JtYXRkZWYgKmU7CisgICAgZm9ybWF0Y29kZSAqY29kZXM7CiAKLQljb25zdCBjaGFyICpzOwotCWNvbnN0IGNoYXIgKmZtdDsKLQljaGFyIGM7Ci0JUHlfc3NpemVfdCBzaXplLCBsZW4sIG51bSwgaXRlbXNpemUsIHg7CisgICAgY29uc3QgY2hhciAqczsKKyAgICBjb25zdCBjaGFyICpmbXQ7CisgICAgY2hhciBjOworICAgIFB5X3NzaXplX3Qgc2l6ZSwgbGVuLCBudW0sIGl0ZW1zaXplLCB4OwogCi0JZm10ID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYtPnNfZm9ybWF0KTsKKyAgICBmbXQgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZi0+c19mb3JtYXQpOwogCi0JZiA9IHdoaWNodGFibGUoKGNoYXIgKiopJmZtdCk7CisgICAgZiA9IHdoaWNodGFibGUoKGNoYXIgKiopJmZtdCk7CiAKLQlzID0gZm10OwotCXNpemUgPSAwOwotCWxlbiA9IDA7Ci0Jd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgewotCQlpZiAoaXNzcGFjZShQeV9DSEFSTUFTSyhjKSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7Ci0JCQludW0gPSBjIC0gJzAnOwotCQkJd2hpbGUgKCcwJyA8PSAoYyA9ICpzKyspICYmIGMgPD0gJzknKSB7Ci0JCQkJeCA9IG51bSoxMCArIChjIC0gJzAnKTsKLQkJCQlpZiAoeC8xMCAhPSBudW0pIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCQkJU3RydWN0RXJyb3IsCi0JCQkJCQkib3ZlcmZsb3cgaW4gaXRlbSBjb3VudCIpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCW51bSA9IHg7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAnXDAnKQotCQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UKLQkJCW51bSA9IDE7CisgICAgcyA9IGZtdDsKKyAgICBzaXplID0gMDsKKyAgICBsZW4gPSAwOworICAgIHdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKGlzc3BhY2UoUHlfQ0hBUk1BU0soYykpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgbnVtID0gYyAtICcwJzsKKyAgICAgICAgICAgIHdoaWxlICgnMCcgPD0gKGMgPSAqcysrKSAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgIHggPSBudW0qMTAgKyAoYyAtICcwJyk7CisgICAgICAgICAgICAgICAgaWYgKHgvMTAgIT0gbnVtKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm92ZXJmbG93IGluIGl0ZW0gY291bnQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW0gPSB4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJ1wwJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBudW0gPSAxOwogCi0JCWUgPSBnZXRlbnRyeShjLCBmKTsKLQkJaWYgKGUgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgZSA9IGdldGVudHJ5KGMsIGYpOworICAgICAgICBpZiAoZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAncyc6IC8qIGZhbGwgdGhyb3VnaCAqLwotCQkJY2FzZSAncCc6IGxlbisrOyBicmVhazsKLQkJCWNhc2UgJ3gnOiBicmVhazsKLQkJCWRlZmF1bHQ6IGxlbiArPSBudW07IGJyZWFrOwotCQl9CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAncyc6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICAgICAgY2FzZSAncCc6IGxlbisrOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3gnOiBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGxlbiArPSBudW07IGJyZWFrOworICAgICAgICB9CiAKLQkJaXRlbXNpemUgPSBlLT5zaXplOwotCQlzaXplID0gYWxpZ24oc2l6ZSwgYywgZSk7Ci0JCXggPSBudW0gKiBpdGVtc2l6ZTsKLQkJc2l6ZSArPSB4OwotCQlpZiAoeC9pdGVtc2l6ZSAhPSBudW0gfHwgc2l6ZSA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKLQkJCQkJInRvdGFsIHN0cnVjdCBzaXplIHRvbyBsb25nIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgICAgIGl0ZW1zaXplID0gZS0+c2l6ZTsKKyAgICAgICAgc2l6ZSA9IGFsaWduKHNpemUsIGMsIGUpOworICAgICAgICB4ID0gbnVtICogaXRlbXNpemU7CisgICAgICAgIHNpemUgKz0geDsKKyAgICAgICAgaWYgKHgvaXRlbXNpemUgIT0gbnVtIHx8IHNpemUgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIHN0cnVjdCBzaXplIHRvbyBsb25nIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQlpZiAoKGxlbiArIDEpID4gKFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKGZvcm1hdGNvZGUpKSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLworICAgIGlmICgobGVuICsgMSkgPiAoUFlfU1NJWkVfVF9NQVggLyBzaXplb2YoZm9ybWF0Y29kZSkpKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlzZWxmLT5zX3NpemUgPSBzaXplOwotCXNlbGYtPnNfbGVuID0gbGVuOwotCWNvZGVzID0gUHlNZW1fTUFMTE9DKChsZW4gKyAxKSAqIHNpemVvZihmb3JtYXRjb2RlKSk7Ci0JaWYgKGNvZGVzID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzZWxmLT5zX2NvZGVzID0gY29kZXM7CisgICAgc2VsZi0+c19zaXplID0gc2l6ZTsKKyAgICBzZWxmLT5zX2xlbiA9IGxlbjsKKyAgICBjb2RlcyA9IFB5TWVtX01BTExPQygobGVuICsgMSkgKiBzaXplb2YoZm9ybWF0Y29kZSkpOworICAgIGlmIChjb2RlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc2VsZi0+c19jb2RlcyA9IGNvZGVzOwogCi0JcyA9IGZtdDsKLQlzaXplID0gMDsKLQl3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKSB7Ci0JCWlmIChpc3NwYWNlKFB5X0NIQVJNQVNLKGMpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHsKLQkJCW51bSA9IGMgLSAnMCc7Ci0JCQl3aGlsZSAoJzAnIDw9IChjID0gKnMrKykgJiYgYyA8PSAnOScpCi0JCQkJbnVtID0gbnVtKjEwICsgKGMgLSAnMCcpOwotCQkJaWYgKGMgPT0gJ1wwJykKLQkJCQlicmVhazsKLQkJfQotCQllbHNlCi0JCQludW0gPSAxOworICAgIHMgPSBmbXQ7CisgICAgc2l6ZSA9IDA7CisgICAgd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJykgeworICAgICAgICBpZiAoaXNzcGFjZShQeV9DSEFSTUFTSyhjKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCcwJyA8PSBjICYmIGMgPD0gJzknKSB7CisgICAgICAgICAgICBudW0gPSBjIC0gJzAnOworICAgICAgICAgICAgd2hpbGUgKCcwJyA8PSAoYyA9ICpzKyspICYmIGMgPD0gJzknKQorICAgICAgICAgICAgICAgIG51bSA9IG51bSoxMCArIChjIC0gJzAnKTsKKyAgICAgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbnVtID0gMTsKIAotCQllID0gZ2V0ZW50cnkoYywgZik7CisgICAgICAgIGUgPSBnZXRlbnRyeShjLCBmKTsKIAotCQlzaXplID0gYWxpZ24oc2l6ZSwgYywgZSk7Ci0JCWlmIChjID09ICdzJyB8fCBjID09ICdwJykgewotCQkJY29kZXMtPm9mZnNldCA9IHNpemU7Ci0JCQljb2Rlcy0+c2l6ZSA9IG51bTsKLQkJCWNvZGVzLT5mbXRkZWYgPSBlOwotCQkJY29kZXMrKzsKLQkJCXNpemUgKz0gbnVtOwotCQl9IGVsc2UgaWYgKGMgPT0gJ3gnKSB7Ci0JCQlzaXplICs9IG51bTsKLQkJfSBlbHNlIHsKLQkJCXdoaWxlICgtLW51bSA+PSAwKSB7Ci0JCQkJY29kZXMtPm9mZnNldCA9IHNpemU7Ci0JCQkJY29kZXMtPnNpemUgPSBlLT5zaXplOwotCQkJCWNvZGVzLT5mbXRkZWYgPSBlOwotCQkJCWNvZGVzKys7Ci0JCQkJc2l6ZSArPSBlLT5zaXplOwotCQkJfQotCQl9Ci0JfQotCWNvZGVzLT5mbXRkZWYgPSBOVUxMOwotCWNvZGVzLT5vZmZzZXQgPSBzaXplOwotCWNvZGVzLT5zaXplID0gMDsKKyAgICAgICAgc2l6ZSA9IGFsaWduKHNpemUsIGMsIGUpOworICAgICAgICBpZiAoYyA9PSAncycgfHwgYyA9PSAncCcpIHsKKyAgICAgICAgICAgIGNvZGVzLT5vZmZzZXQgPSBzaXplOworICAgICAgICAgICAgY29kZXMtPnNpemUgPSBudW07CisgICAgICAgICAgICBjb2Rlcy0+Zm10ZGVmID0gZTsKKyAgICAgICAgICAgIGNvZGVzKys7CisgICAgICAgICAgICBzaXplICs9IG51bTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICd4JykgeworICAgICAgICAgICAgc2l6ZSArPSBudW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAoLS1udW0gPj0gMCkgeworICAgICAgICAgICAgICAgIGNvZGVzLT5vZmZzZXQgPSBzaXplOworICAgICAgICAgICAgICAgIGNvZGVzLT5zaXplID0gZS0+c2l6ZTsKKyAgICAgICAgICAgICAgICBjb2Rlcy0+Zm10ZGVmID0gZTsKKyAgICAgICAgICAgICAgICBjb2RlcysrOworICAgICAgICAgICAgICAgIHNpemUgKz0gZS0+c2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBjb2Rlcy0+Zm10ZGVmID0gTlVMTDsKKyAgICBjb2Rlcy0+b2Zmc2V0ID0gc2l6ZTsKKyAgICBjb2Rlcy0+c2l6ZSA9IDA7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOwogCi0JYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKKyAgICBhc3NlcnQodHlwZSAhPSBOVUxMICYmIHR5cGUtPnRwX2FsbG9jICE9IE5VTEwpOwogCi0Jc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChzZWxmICE9IE5VTEwpIHsKLQkJUHlTdHJ1Y3RPYmplY3QgKnMgPSAoUHlTdHJ1Y3RPYmplY3QqKXNlbGY7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcy0+c19mb3JtYXQgPSBQeV9Ob25lOwotCQlzLT5zX2NvZGVzID0gTlVMTDsKLQkJcy0+c19zaXplID0gLTE7Ci0JCXMtPnNfbGVuID0gLTE7Ci0JfQotCXJldHVybiBzZWxmOworICAgIHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIFB5U3RydWN0T2JqZWN0ICpzID0gKFB5U3RydWN0T2JqZWN0KilzZWxmOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHMtPnNfZm9ybWF0ID0gUHlfTm9uZTsKKyAgICAgICAgcy0+c19jb2RlcyA9IE5VTEw7CisgICAgICAgIHMtPnNfc2l6ZSA9IC0xOworICAgICAgICBzLT5zX2xlbiA9IC0xOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIGludAogc19pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7Ci0JUHlPYmplY3QgKm9fZm9ybWF0ID0gTlVMTDsKLQlpbnQgcmV0ID0gMDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZvcm1hdCIsIDB9OworICAgIFB5U3RydWN0T2JqZWN0ICpzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOworICAgIFB5T2JqZWN0ICpvX2Zvcm1hdCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmb3JtYXQiLCAwfTsKIAotCWFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7CisgICAgYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJTOlN0cnVjdCIsIGt3bGlzdCwKLQkJCQkJICZvX2Zvcm1hdCkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiUzpTdHJ1Y3QiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9fZm9ybWF0KSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUHlfSU5DUkVGKG9fZm9ybWF0KTsKLQlQeV9DTEVBUihzb3NlbGYtPnNfZm9ybWF0KTsKLQlzb3NlbGYtPnNfZm9ybWF0ID0gb19mb3JtYXQ7CisgICAgUHlfSU5DUkVGKG9fZm9ybWF0KTsKKyAgICBQeV9DTEVBUihzb3NlbGYtPnNfZm9ybWF0KTsKKyAgICBzb3NlbGYtPnNfZm9ybWF0ID0gb19mb3JtYXQ7CiAKLQlyZXQgPSBwcmVwYXJlX3Moc29zZWxmKTsKLQlyZXR1cm4gcmV0OworICAgIHJldCA9IHByZXBhcmVfcyhzb3NlbGYpOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkCiBzX2RlYWxsb2MoUHlTdHJ1Y3RPYmplY3QgKnMpCiB7Ci0JaWYgKHMtPndlYWtyZWZsaXN0ICE9IE5VTEwpCi0JCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopcyk7Ci0JaWYgKHMtPnNfY29kZXMgIT0gTlVMTCkgewotCQlQeU1lbV9GUkVFKHMtPnNfY29kZXMpOwotCX0KLQlQeV9YREVDUkVGKHMtPnNfZm9ybWF0KTsKLQlQeV9UWVBFKHMpLT50cF9mcmVlKChQeU9iamVjdCAqKXMpOworICAgIGlmIChzLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKXMpOworICAgIGlmIChzLT5zX2NvZGVzICE9IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fRlJFRShzLT5zX2NvZGVzKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihzLT5zX2Zvcm1hdCk7CisgICAgUHlfVFlQRShzKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNfdW5wYWNrX2ludGVybmFsKFB5U3RydWN0T2JqZWN0ICpzb3NlbGYsIGNoYXIgKnN0YXJ0ZnJvbSkgewotCWZvcm1hdGNvZGUgKmNvZGU7Ci0JUHlfc3NpemVfdCBpID0gMDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlUdXBsZV9OZXcoc29zZWxmLT5zX2xlbik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBmb3JtYXRjb2RlICpjb2RlOworICAgIFB5X3NzaXplX3QgaSA9IDA7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5VHVwbGVfTmV3KHNvc2VsZi0+c19sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGNvZGUgPSBzb3NlbGYtPnNfY29kZXM7IGNvZGUtPmZtdGRlZiAhPSBOVUxMOyBjb2RlKyspIHsKLQkJUHlPYmplY3QgKnY7Ci0JCWNvbnN0IGZvcm1hdGRlZiAqZSA9IGNvZGUtPmZtdGRlZjsKLQkJY29uc3QgY2hhciAqcmVzID0gc3RhcnRmcm9tICsgY29kZS0+b2Zmc2V0OwotCQlpZiAoZS0+Zm9ybWF0ID09ICdzJykgewotCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlcywgY29kZS0+c2l6ZSk7Ci0JCX0gZWxzZSBpZiAoZS0+Zm9ybWF0ID09ICdwJykgewotCQkJUHlfc3NpemVfdCBuID0gKih1bnNpZ25lZCBjaGFyKilyZXM7Ci0JCQlpZiAobiA+PSBjb2RlLT5zaXplKQotCQkJCW4gPSBjb2RlLT5zaXplIC0gMTsKLQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXMgKyAxLCBuKTsKLQkJfSBlbHNlIHsKLQkJCXYgPSBlLT51bnBhY2socmVzLCBlKTsKLQkJfQotCQlpZiAodiA9PSBOVUxMKQotCQkJZ290byBmYWlsOwotCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSsrLCB2KTsKLQl9CisgICAgZm9yIChjb2RlID0gc29zZWxmLT5zX2NvZGVzOyBjb2RlLT5mbXRkZWYgIT0gTlVMTDsgY29kZSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICBjb25zdCBmb3JtYXRkZWYgKmUgPSBjb2RlLT5mbXRkZWY7CisgICAgICAgIGNvbnN0IGNoYXIgKnJlcyA9IHN0YXJ0ZnJvbSArIGNvZGUtPm9mZnNldDsKKyAgICAgICAgaWYgKGUtPmZvcm1hdCA9PSAncycpIHsKKyAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXMsIGNvZGUtPnNpemUpOworICAgICAgICB9IGVsc2UgaWYgKGUtPmZvcm1hdCA9PSAncCcpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbiA9ICoodW5zaWduZWQgY2hhciopcmVzOworICAgICAgICAgICAgaWYgKG4gPj0gY29kZS0+c2l6ZSkKKyAgICAgICAgICAgICAgICBuID0gY29kZS0+c2l6ZSAtIDE7CisgICAgICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzICsgMSwgbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ID0gZS0+dW5wYWNrKHJlcywgZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGkrKywgdik7CisgICAgfQogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogZmFpbDoKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC0xNTQ0LDM1ICsxNTQ0LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc191bnBhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppbnB1dHN0cikKIHsKLQljaGFyICpzdGFydDsKLQlQeV9zc2l6ZV90IGxlbjsKLQlQeU9iamVjdCAqYXJncz1OVUxMLCAqcmVzdWx0OwotCVB5U3RydWN0T2JqZWN0ICpzb3NlbGYgPSAoUHlTdHJ1Y3RPYmplY3QgKilzZWxmOwotCWFzc2VydChQeVN0cnVjdF9DaGVjayhzZWxmKSk7Ci0JYXNzZXJ0KHNvc2VsZi0+c19jb2RlcyAhPSBOVUxMKTsKLQlpZiAoaW5wdXRzdHIgPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCWlmIChQeVN0cmluZ19DaGVjayhpbnB1dHN0cikgJiYKLQkJUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRzdHIpID09IHNvc2VsZi0+c19zaXplKSB7Ci0JCQlyZXR1cm4gc191bnBhY2tfaW50ZXJuYWwoc29zZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoaW5wdXRzdHIpKTsKLQl9Ci0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCBpbnB1dHN0cik7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp1bnBhY2siLCAmc3RhcnQsICZsZW4pKQotCQlnb3RvIGZhaWw7Ci0JaWYgKHNvc2VsZi0+c19zaXplICE9IGxlbikKLQkJZ290byBmYWlsOwotCXJlc3VsdCA9IHNfdW5wYWNrX2ludGVybmFsKHNvc2VsZiwgc3RhcnQpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGNoYXIgKnN0YXJ0OworICAgIFB5X3NzaXplX3QgbGVuOworICAgIFB5T2JqZWN0ICphcmdzPU5VTEwsICpyZXN1bHQ7CisgICAgUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7CisgICAgYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKKyAgICBhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOworICAgIGlmIChpbnB1dHN0ciA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGlucHV0c3RyKSAmJgorICAgICAgICBQeVN0cmluZ19HRVRfU0laRShpbnB1dHN0cikgPT0gc29zZWxmLT5zX3NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBzX3VucGFja19pbnRlcm5hbChzb3NlbGYsIFB5U3RyaW5nX0FTX1NUUklORyhpbnB1dHN0cikpOworICAgIH0KKyAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIGlucHV0c3RyKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOnVucGFjayIsICZzdGFydCwgJmxlbikpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoc29zZWxmLT5zX3NpemUgIT0gbGVuKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcmVzdWx0ID0gc191bnBhY2tfaW50ZXJuYWwoc29zZWxmLCBzdGFydCk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiAKIGZhaWw6Ci0JUHlfWERFQ1JFRihhcmdzKTsKLQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCSJ1bnBhY2sgcmVxdWlyZXMgYSBzdHJpbmcgYXJndW1lbnQgb2YgbGVuZ3RoICV6ZCIsCi0JCXNvc2VsZi0+c19zaXplKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGFyZ3MpOworICAgIFB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKyAgICAgICAgInVucGFjayByZXF1aXJlcyBhIHN0cmluZyBhcmd1bWVudCBvZiBsZW5ndGggJXpkIiwKKyAgICAgICAgc29zZWxmLT5zX3NpemUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoc191bnBhY2tfZnJvbV9fZG9jX18sCkBAIC0xNTg2LDM4ICsxNTg2LDM4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc191bnBhY2tfZnJvbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiYnVmZmVyIiwgIm9mZnNldCIsIDB9OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiYnVmZmVyIiwgIm9mZnNldCIsIDB9OwogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0Jc3RhdGljIGNoYXIgKmZtdCA9ICJ6I3xpOnVucGFja19mcm9tIjsKKyAgICBzdGF0aWMgY2hhciAqZm10ID0gInojfGk6dW5wYWNrX2Zyb20iOwogI2Vsc2UKLQlzdGF0aWMgY2hhciAqZm10ID0gInojfG46dW5wYWNrX2Zyb20iOworICAgIHN0YXRpYyBjaGFyICpmbXQgPSAieiN8bjp1bnBhY2tfZnJvbSI7CiAjZW5kaWYKLQlQeV9zc2l6ZV90IGJ1ZmZlcl9sZW4gPSAwLCBvZmZzZXQgPSAwOwotCWNoYXIgKmJ1ZmZlciA9IE5VTEw7Ci0JUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7Ci0JYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKLQlhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOworICAgIFB5X3NzaXplX3QgYnVmZmVyX2xlbiA9IDAsIG9mZnNldCA9IDA7CisgICAgY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICBQeVN0cnVjdE9iamVjdCAqc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKKyAgICBhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOworICAgIGFzc2VydChzb3NlbGYtPnNfY29kZXMgIT0gTlVMTCk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBmbXQsIGt3bGlzdCwKLQkJCQkJICZidWZmZXIsICZidWZmZXJfbGVuLCAmb2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgZm10LCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4sICZvZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkidW5wYWNrX2Zyb20gcmVxdWlyZXMgYSBidWZmZXIgYXJndW1lbnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAidW5wYWNrX2Zyb20gcmVxdWlyZXMgYSBidWZmZXIgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKG9mZnNldCA8IDApCi0JCW9mZnNldCArPSBidWZmZXJfbGVuOworICAgIGlmIChvZmZzZXQgPCAwKQorICAgICAgICBvZmZzZXQgKz0gYnVmZmVyX2xlbjsKIAotCWlmIChvZmZzZXQgPCAwIHx8IChidWZmZXJfbGVuIC0gb2Zmc2V0KSA8IHNvc2VsZi0+c19zaXplKSB7Ci0JCVB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKLQkJCSJ1bnBhY2tfZnJvbSByZXF1aXJlcyBhIGJ1ZmZlciBvZiBhdCBsZWFzdCAlemQgYnl0ZXMiLAotCQkJc29zZWxmLT5zX3NpemUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHNfdW5wYWNrX2ludGVybmFsKHNvc2VsZiwgYnVmZmVyICsgb2Zmc2V0KTsKKyAgICBpZiAob2Zmc2V0IDwgMCB8fCAoYnVmZmVyX2xlbiAtIG9mZnNldCkgPCBzb3NlbGYtPnNfc2l6ZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAidW5wYWNrX2Zyb20gcmVxdWlyZXMgYSBidWZmZXIgb2YgYXQgbGVhc3QgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgIHNvc2VsZi0+c19zaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzX3VucGFja19pbnRlcm5hbChzb3NlbGYsIGJ1ZmZlciArIG9mZnNldCk7CiB9CiAKIApAQCAtMTYzNCw1NSArMTYzNCw1NSBAQAogc3RhdGljIGludAogc19wYWNrX2ludGVybmFsKFB5U3RydWN0T2JqZWN0ICpzb3NlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgb2Zmc2V0LCBjaGFyKiBidWYpCiB7Ci0JZm9ybWF0Y29kZSAqY29kZTsKLQkvKiBYWFgobm5vcndpdHopOiB3aHkgZG9lcyBpIG5lZWQgdG8gYmUgYSBsb2NhbD8gIGNhbiB3ZSB1c2UKLQkgICB0aGUgb2Zmc2V0IHBhcmFtZXRlciBvciBkbyB3ZSBuZWVkIHRoZSB3aWRlciB3aWR0aD8gKi8KLQlQeV9zc2l6ZV90IGk7CisgICAgZm9ybWF0Y29kZSAqY29kZTsKKyAgICAvKiBYWFgobm5vcndpdHopOiB3aHkgZG9lcyBpIG5lZWQgdG8gYmUgYSBsb2NhbD8gIGNhbiB3ZSB1c2UKKyAgICAgICB0aGUgb2Zmc2V0IHBhcmFtZXRlciBvciBkbyB3ZSBuZWVkIHRoZSB3aWRlciB3aWR0aD8gKi8KKyAgICBQeV9zc2l6ZV90IGk7CiAKLQltZW1zZXQoYnVmLCAnXDAnLCBzb3NlbGYtPnNfc2l6ZSk7Ci0JaSA9IG9mZnNldDsKLQlmb3IgKGNvZGUgPSBzb3NlbGYtPnNfY29kZXM7IGNvZGUtPmZtdGRlZiAhPSBOVUxMOyBjb2RlKyspIHsKLQkJUHlfc3NpemVfdCBuOwotCQlQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSsrKTsKLQkJY29uc3QgZm9ybWF0ZGVmICplID0gY29kZS0+Zm10ZGVmOwotCQljaGFyICpyZXMgPSBidWYgKyBjb2RlLT5vZmZzZXQ7Ci0JCWlmIChlLT5mb3JtYXQgPT0gJ3MnKSB7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAotCQkJCQkJImFyZ3VtZW50IGZvciAncycgbXVzdCBiZSBhIHN0cmluZyIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQkJCWlmIChuID4gY29kZS0+c2l6ZSkKLQkJCQluID0gY29kZS0+c2l6ZTsKLQkJCWlmIChuID4gMCkKLQkJCQltZW1jcHkocmVzLCBQeVN0cmluZ19BU19TVFJJTkcodiksIG4pOwotCQl9IGVsc2UgaWYgKGUtPmZvcm1hdCA9PSAncCcpIHsKLQkJCWlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJCQkiYXJndW1lbnQgZm9yICdwJyBtdXN0IGJlIGEgc3RyaW5nIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCQkJaWYgKG4gPiAoY29kZS0+c2l6ZSAtIDEpKQotCQkJCW4gPSBjb2RlLT5zaXplIC0gMTsKLQkJCWlmIChuID4gMCkKLQkJCQltZW1jcHkocmVzICsgMSwgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBuKTsKLQkJCWlmIChuID4gMjU1KQotCQkJCW4gPSAyNTU7Ci0JCQkqcmVzID0gUHlfU0FGRV9ET1dOQ0FTVChuLCBQeV9zc2l6ZV90LCB1bnNpZ25lZCBjaGFyKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChlLT5wYWNrKHJlcywgdiwgZSkgPCAwKSB7Ci0JCQkJaWYgKFB5TG9uZ19DaGVjayh2KSAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQotCQkJCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCi0JCQkJCQkJImxvbmcgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gaW50Iik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQorICAgIG1lbXNldChidWYsICdcMCcsIHNvc2VsZi0+c19zaXplKTsKKyAgICBpID0gb2Zmc2V0OworICAgIGZvciAoY29kZSA9IHNvc2VsZi0+c19jb2RlczsgY29kZS0+Zm10ZGVmICE9IE5VTEw7IGNvZGUrKykgeworICAgICAgICBQeV9zc2l6ZV90IG47CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKyspOworICAgICAgICBjb25zdCBmb3JtYXRkZWYgKmUgPSBjb2RlLT5mbXRkZWY7CisgICAgICAgIGNoYXIgKnJlcyA9IGJ1ZiArIGNvZGUtPm9mZnNldDsKKyAgICAgICAgaWYgKGUtPmZvcm1hdCA9PSAncycpIHsKKyAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBmb3IgJ3MnIG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisgICAgICAgICAgICBpZiAobiA+IGNvZGUtPnNpemUpCisgICAgICAgICAgICAgICAgbiA9IGNvZGUtPnNpemU7CisgICAgICAgICAgICBpZiAobiA+IDApCisgICAgICAgICAgICAgICAgbWVtY3B5KHJlcywgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBuKTsKKyAgICAgICAgfSBlbHNlIGlmIChlLT5mb3JtYXQgPT0gJ3AnKSB7CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgZm9yICdwJyBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworICAgICAgICAgICAgaWYgKG4gPiAoY29kZS0+c2l6ZSAtIDEpKQorICAgICAgICAgICAgICAgIG4gPSBjb2RlLT5zaXplIC0gMTsKKyAgICAgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICAgICAgICBtZW1jcHkocmVzICsgMSwgUHlTdHJpbmdfQVNfU1RSSU5HKHYpLCBuKTsKKyAgICAgICAgICAgIGlmIChuID4gMjU1KQorICAgICAgICAgICAgICAgIG4gPSAyNTU7CisgICAgICAgICAgICAqcmVzID0gUHlfU0FGRV9ET1dOQ0FTVChuLCBQeV9zc2l6ZV90LCB1bnNpZ25lZCBjaGFyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChlLT5wYWNrKHJlcywgdiwgZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5TG9uZ19DaGVjayh2KSAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZyB0b28gbGFyZ2UgdG8gY29udmVydCB0byBpbnQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBTdWNjZXNzICovCi0JcmV0dXJuIDA7CisgICAgLyogU3VjY2VzcyAqLworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTE2OTUsMzIgKzE2OTUsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzX3BhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5U3RydWN0T2JqZWN0ICpzb3NlbGY7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeVN0cnVjdE9iamVjdCAqc29zZWxmOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQkvKiBWYWxpZGF0ZSBhcmd1bWVudHMuICovCi0Jc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKLQlhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOwotCWFzc2VydChzb3NlbGYtPnNfY29kZXMgIT0gTlVMTCk7Ci0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgIT0gc29zZWxmLT5zX2xlbikKLQl7Ci0JCVB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKLQkJCSJwYWNrIHJlcXVpcmVzIGV4YWN0bHkgJXpkIGFyZ3VtZW50cyIsIHNvc2VsZi0+c19sZW4pOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogVmFsaWRhdGUgYXJndW1lbnRzLiAqLworICAgIHNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7CisgICAgYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKKyAgICBhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IHNvc2VsZi0+c19sZW4pCisgICAgeworICAgICAgICBQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCisgICAgICAgICAgICAicGFjayByZXF1aXJlcyBleGFjdGx5ICV6ZCBhcmd1bWVudHMiLCBzb3NlbGYtPnNfbGVuKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nICovCi0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBzb3NlbGYtPnNfc2l6ZSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBBbGxvY2F0ZSBhIG5ldyBzdHJpbmcgKi8KKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHNvc2VsZi0+c19zaXplKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogQ2FsbCB0aGUgZ3V0cyAqLwotCWlmICggc19wYWNrX2ludGVybmFsKHNvc2VsZiwgYXJncywgMCwgUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkpICE9IDAgKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2FsbCB0aGUgZ3V0cyAqLworICAgIGlmICggc19wYWNrX2ludGVybmFsKHNvc2VsZiwgYXJncywgMCwgUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkpICE9IDAgKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihzX3BhY2tfaW50b19fZG9jX18sCkBAIC0xNzM0LDU5ICsxNzM0LDU5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc19wYWNrX2ludG8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5U3RydWN0T2JqZWN0ICpzb3NlbGY7Ci0JY2hhciAqYnVmZmVyOwotCVB5X3NzaXplX3QgYnVmZmVyX2xlbiwgb2Zmc2V0OworICAgIFB5U3RydWN0T2JqZWN0ICpzb3NlbGY7CisgICAgY2hhciAqYnVmZmVyOworICAgIFB5X3NzaXplX3QgYnVmZmVyX2xlbiwgb2Zmc2V0OwogCi0JLyogVmFsaWRhdGUgYXJndW1lbnRzLiAgKzEgaXMgZm9yIHRoZSBmaXJzdCBhcmcgYXMgYnVmZmVyLiAqLwotCXNvc2VsZiA9IChQeVN0cnVjdE9iamVjdCAqKXNlbGY7Ci0JYXNzZXJ0KFB5U3RydWN0X0NoZWNrKHNlbGYpKTsKLQlhc3NlcnQoc29zZWxmLT5zX2NvZGVzICE9IE5VTEwpOwotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IChzb3NlbGYtPnNfbGVuICsgMikpCi0JewotCQlQeUVycl9Gb3JtYXQoU3RydWN0RXJyb3IsCi0JCQkgICAgICJwYWNrX2ludG8gcmVxdWlyZXMgZXhhY3RseSAlemQgYXJndW1lbnRzIiwKLQkJCSAgICAgKHNvc2VsZi0+c19sZW4gKyAyKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBWYWxpZGF0ZSBhcmd1bWVudHMuICArMSBpcyBmb3IgdGhlIGZpcnN0IGFyZyBhcyBidWZmZXIuICovCisgICAgc29zZWxmID0gKFB5U3RydWN0T2JqZWN0ICopc2VsZjsKKyAgICBhc3NlcnQoUHlTdHJ1Y3RfQ2hlY2soc2VsZikpOworICAgIGFzc2VydChzb3NlbGYtPnNfY29kZXMgIT0gTlVMTCk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgIT0gKHNvc2VsZi0+c19sZW4gKyAyKSkKKyAgICB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJwYWNrX2ludG8gcmVxdWlyZXMgZXhhY3RseSAlemQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgIChzb3NlbGYtPnNfbGVuICsgMikpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBFeHRyYWN0IGEgd3JpdGFibGUgbWVtb3J5IGJ1ZmZlciBmcm9tIHRoZSBmaXJzdCBhcmd1bWVudCAqLwotCWlmICggUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApLAotCQkJCQkJCQkodm9pZCoqKSZidWZmZXIsICZidWZmZXJfbGVuKSA9PSAtMSApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWFzc2VydCggYnVmZmVyX2xlbiA+PSAwICk7CisgICAgLyogRXh0cmFjdCBhIHdyaXRhYmxlIG1lbW9yeSBidWZmZXIgZnJvbSB0aGUgZmlyc3QgYXJndW1lbnQgKi8KKyAgICBpZiAoIFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIoUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiopJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pID09IC0xICkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXNzZXJ0KCBidWZmZXJfbGVuID49IDAgKTsKIAotCS8qIEV4dHJhY3QgdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBhcmd1bWVudCAqLwotCW9mZnNldCA9IFB5SW50X0FzU3NpemVfdChQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpKTsKLQlpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEV4dHJhY3QgdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBhcmd1bWVudCAqLworICAgIG9mZnNldCA9IFB5SW50X0FzU3NpemVfdChQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpKTsKKyAgICBpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogU3VwcG9ydCBuZWdhdGl2ZSBvZmZzZXRzLiAqLwotCWlmIChvZmZzZXQgPCAwKQotCQlvZmZzZXQgKz0gYnVmZmVyX2xlbjsKKyAgICAvKiBTdXBwb3J0IG5lZ2F0aXZlIG9mZnNldHMuICovCisgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIG9mZnNldCArPSBidWZmZXJfbGVuOwogCi0JLyogQ2hlY2sgYm91bmRhcmllcyAqLwotCWlmIChvZmZzZXQgPCAwIHx8IChidWZmZXJfbGVuIC0gb2Zmc2V0KSA8IHNvc2VsZi0+c19zaXplKSB7Ci0JCVB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKLQkJCSAgICAgInBhY2tfaW50byByZXF1aXJlcyBhIGJ1ZmZlciBvZiBhdCBsZWFzdCAlemQgYnl0ZXMiLAotCQkJICAgICBzb3NlbGYtPnNfc2l6ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBDaGVjayBib3VuZGFyaWVzICovCisgICAgaWYgKG9mZnNldCA8IDAgfHwgKGJ1ZmZlcl9sZW4gLSBvZmZzZXQpIDwgc29zZWxmLT5zX3NpemUpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFN0cnVjdEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInBhY2tfaW50byByZXF1aXJlcyBhIGJ1ZmZlciBvZiBhdCBsZWFzdCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgc29zZWxmLT5zX3NpemUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBDYWxsIHRoZSBndXRzICovCi0JaWYgKCBzX3BhY2tfaW50ZXJuYWwoc29zZWxmLCBhcmdzLCAyLCBidWZmZXIgKyBvZmZzZXQpICE9IDAgKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBDYWxsIHRoZSBndXRzICovCisgICAgaWYgKCBzX3BhY2tfaW50ZXJuYWwoc29zZWxmLCBhcmdzLCAyLCBidWZmZXIgKyBvZmZzZXQpICE9IDAgKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc19nZXRfZm9ybWF0KFB5U3RydWN0T2JqZWN0ICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JUHlfSU5DUkVGKHNlbGYtPnNfZm9ybWF0KTsKLQlyZXR1cm4gc2VsZi0+c19mb3JtYXQ7CisgICAgUHlfSU5DUkVGKHNlbGYtPnNfZm9ybWF0KTsKKyAgICByZXR1cm4gc2VsZi0+c19mb3JtYXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNzk4LDEyICsxNzk4LDEyIEBACiAvKiBMaXN0IG9mIGZ1bmN0aW9ucyAqLwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHNfbWV0aG9kc1tdID0gewotCXsicGFjayIsCXNfcGFjaywJCU1FVEhfVkFSQVJHUywgc19wYWNrX19kb2NfX30sCi0JeyJwYWNrX2ludG8iLAlzX3BhY2tfaW50bywJTUVUSF9WQVJBUkdTLCBzX3BhY2tfaW50b19fZG9jX199LAotCXsidW5wYWNrIiwJc191bnBhY2ssICAgICAgIE1FVEhfTywgc191bnBhY2tfX2RvY19ffSwKLQl7InVucGFja19mcm9tIiwJKFB5Q0Z1bmN0aW9uKXNfdW5wYWNrX2Zyb20sIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAotCQkJc191bnBhY2tfZnJvbV9fZG9jX199LAotCXtOVUxMLAkgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJwYWNrIiwgICAgICAgICAgICBzX3BhY2ssICAgICAgICAgTUVUSF9WQVJBUkdTLCBzX3BhY2tfX2RvY19ffSwKKyAgICB7InBhY2tfaW50byIsICAgICAgIHNfcGFja19pbnRvLCAgICBNRVRIX1ZBUkFSR1MsIHNfcGFja19pbnRvX19kb2NfX30sCisgICAgeyJ1bnBhY2siLCAgICAgICAgICBzX3VucGFjaywgICAgICAgTUVUSF9PLCBzX3VucGFja19fZG9jX199LAorICAgIHsidW5wYWNrX2Zyb20iLCAgICAgKFB5Q0Z1bmN0aW9uKXNfdW5wYWNrX2Zyb20sIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICBzX3VucGFja19mcm9tX19kb2NfX30sCisgICAge05VTEwsICAgICAgIE5VTEx9ICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoc19fZG9jX18sICJDb21waWxlZCBzdHJ1Y3Qgb2JqZWN0Iik7CkBAIC0xODExLDUyICsxODExLDUyIEBACiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeVN0cnVjdE9iamVjdCwgeCkKIAogc3RhdGljIFB5R2V0U2V0RGVmIHNfZ2V0c2V0bGlzdFtdID0gewotCXsiZm9ybWF0IiwgKGdldHRlcilzX2dldF9mb3JtYXQsIChzZXR0ZXIpTlVMTCwgInN0cnVjdCBmb3JtYXQgc3RyaW5nIiwgTlVMTH0sCi0JeyJzaXplIiwgKGdldHRlcilzX2dldF9zaXplLCAoc2V0dGVyKU5VTEwsICJzdHJ1Y3Qgc2l6ZSBpbiBieXRlcyIsIE5VTEx9LAotCXtOVUxMfSAvKiBzZW50aW5lbCAqLworICAgIHsiZm9ybWF0IiwgKGdldHRlcilzX2dldF9mb3JtYXQsIChzZXR0ZXIpTlVMTCwgInN0cnVjdCBmb3JtYXQgc3RyaW5nIiwgTlVMTH0sCisgICAgeyJzaXplIiwgKGdldHRlcilzX2dldF9zaXplLCAoc2V0dGVyKU5VTEwsICJzdHJ1Y3Qgc2l6ZSBpbiBieXRlcyIsIE5VTEx9LAorICAgIHtOVUxMfSAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljCiBQeVR5cGVPYmplY3QgUHlTdHJ1Y3RUeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJTdHJ1Y3QiLAotCXNpemVvZihQeVN0cnVjdE9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilzX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsLyogdHBfZmxhZ3MgKi8KLQlzX19kb2NfXywJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihQeVN0cnVjdE9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0Jc19tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQlOVUxMLAkJCQkvKiB0cF9tZW1iZXJzICovCi0Jc19nZXRzZXRsaXN0LAkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQlzX2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLC8qIHRwX2FsbG9jICovCi0Jc19uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiU3RydWN0IiwKKyAgICBzaXplb2YoUHlTdHJ1Y3RPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3Ipc19kZWFsbG9jLCAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLC8qIHRwX2ZsYWdzICovCisgICAgc19fZG9jX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlTdHJ1Y3RPYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIHNfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgc19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsLyogdHBfYWxsb2MgKi8KKyAgICBzX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC0xODY4LDI5ICsxODY4LDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FjaGVfc3RydWN0KFB5T2JqZWN0ICpmbXQpCiB7Ci0JUHlPYmplY3QgKiBzX29iamVjdDsKKyAgICBQeU9iamVjdCAqIHNfb2JqZWN0OwogCi0JaWYgKGNhY2hlID09IE5VTEwpIHsKLQkJY2FjaGUgPSBQeURpY3RfTmV3KCk7Ci0JCWlmIChjYWNoZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChjYWNoZSA9PSBOVUxMKSB7CisgICAgICAgIGNhY2hlID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoY2FjaGUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNfb2JqZWN0ID0gUHlEaWN0X0dldEl0ZW0oY2FjaGUsIGZtdCk7Ci0JaWYgKHNfb2JqZWN0ICE9IE5VTEwpIHsKLQkJUHlfSU5DUkVGKHNfb2JqZWN0KTsKLQkJcmV0dXJuIHNfb2JqZWN0OwotCX0KKyAgICBzX29iamVjdCA9IFB5RGljdF9HZXRJdGVtKGNhY2hlLCBmbXQpOworICAgIGlmIChzX29iamVjdCAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihzX29iamVjdCk7CisgICAgICAgIHJldHVybiBzX29iamVjdDsKKyAgICB9CiAKLQlzX29iamVjdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0ICopKCZQeVN0cnVjdFR5cGUpLCBmbXQsIE5VTEwpOwotCWlmIChzX29iamVjdCAhPSBOVUxMKSB7Ci0JCWlmIChQeURpY3RfU2l6ZShjYWNoZSkgPj0gTUFYQ0FDSEUpCi0JCQlQeURpY3RfQ2xlYXIoY2FjaGUpOwotCQkvKiBBdHRlbXB0IHRvIGNhY2hlIHRoZSByZXN1bHQgKi8KLQkJaWYgKFB5RGljdF9TZXRJdGVtKGNhY2hlLCBmbXQsIHNfb2JqZWN0KSA9PSAtMSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JfQotCXJldHVybiBzX29iamVjdDsKKyAgICBzX29iamVjdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0ICopKCZQeVN0cnVjdFR5cGUpLCBmbXQsIE5VTEwpOworICAgIGlmIChzX29iamVjdCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChQeURpY3RfU2l6ZShjYWNoZSkgPj0gTUFYQ0FDSEUpCisgICAgICAgICAgICBQeURpY3RfQ2xlYXIoY2FjaGUpOworICAgICAgICAvKiBBdHRlbXB0IHRvIGNhY2hlIHRoZSByZXN1bHQgKi8KKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKGNhY2hlLCBmbXQsIHNfb2JqZWN0KSA9PSAtMSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIHJldHVybiBzX29iamVjdDsKIH0KIAogUHlEb2NfU1RSVkFSKGNsZWFyY2FjaGVfZG9jLApAQCAtMTg5OSw4ICsxODk5LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGVhcmNhY2hlKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X0NMRUFSKGNhY2hlKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9DTEVBUihjYWNoZSk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihjYWxjc2l6ZV9kb2MsCkBAIC0xOTA5LDEzICsxOTA5LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsY3NpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpmbXQpCiB7Ci0JUHlfc3NpemVfdCBuOwotCVB5T2JqZWN0ICpzX29iamVjdCA9IGNhY2hlX3N0cnVjdChmbXQpOwotCWlmIChzX29iamVjdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQluID0gKChQeVN0cnVjdE9iamVjdCAqKXNfb2JqZWN0KS0+c19zaXplOwotCVB5X0RFQ1JFRihzX29iamVjdCk7Ci0gICAgCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChuKTsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlPYmplY3QgKnNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7CisgICAgaWYgKHNfb2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG4gPSAoKFB5U3RydWN0T2JqZWN0ICopc19vYmplY3QpLT5zX3NpemU7CisgICAgUHlfREVDUkVGKHNfb2JqZWN0KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3Qobik7CiB9CiAKIFB5RG9jX1NUUlZBUihwYWNrX2RvYywKQEAgLTE5MjQsMjcgKzE5MjQsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBwYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc19vYmplY3QsICpmbXQsICpuZXdhcmdzLCAqcmVzdWx0OwotCVB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqbmV3YXJncywgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwogCi0JaWYgKG4gPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWlzc2luZyBmb3JtYXQgYXJndW1lbnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZtdCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgbik7Ci0JaWYgKG5ld2FyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibWlzc2luZyBmb3JtYXQgYXJndW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZtdCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgbmV3YXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgbik7CisgICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzX29iamVjdCA9IGNhY2hlX3N0cnVjdChmbXQpOwotCWlmIChzX29iamVjdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihuZXdhcmdzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotICAgIAlyZXN1bHQgPSBzX3BhY2soc19vYmplY3QsIG5ld2FyZ3MpOwotCVB5X0RFQ1JFRihuZXdhcmdzKTsKLQlQeV9ERUNSRUYoc19vYmplY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgc19vYmplY3QgPSBjYWNoZV9zdHJ1Y3QoZm10KTsKKyAgICBpZiAoc19vYmplY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBzX3BhY2soc19vYmplY3QsIG5ld2FyZ3MpOworICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICBQeV9ERUNSRUYoc19vYmplY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihwYWNrX2ludG9fZG9jLApAQCAtMTk1NCwyNyArMTk1NCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBhY2tfaW50byhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqbmV3YXJncywgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIFB5T2JqZWN0ICpzX29iamVjdCwgKmZtdCwgKm5ld2FyZ3MsICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKIAotCWlmIChuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1pc3NpbmcgZm9ybWF0IGFyZ3VtZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmbXQgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCW5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIG4pOwotCWlmIChuZXdhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1pc3NpbmcgZm9ybWF0IGFyZ3VtZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmbXQgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIG5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIG4pOworICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc19vYmplY3QgPSBjYWNoZV9zdHJ1Y3QoZm10KTsKLQlpZiAoc19vYmplY3QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLSAgICAJcmVzdWx0ID0gc19wYWNrX2ludG8oc19vYmplY3QsIG5ld2FyZ3MpOwotCVB5X0RFQ1JFRihuZXdhcmdzKTsKLQlQeV9ERUNSRUYoc19vYmplY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgc19vYmplY3QgPSBjYWNoZV9zdHJ1Y3QoZm10KTsKKyAgICBpZiAoc19vYmplY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBzX3BhY2tfaW50byhzX29iamVjdCwgbmV3YXJncyk7CisgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgIFB5X0RFQ1JFRihzX29iamVjdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHVucGFja19kb2MsCkBAIC0xOTg0LDE3ICsxOTg0LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdW5wYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc19vYmplY3QsICpmbXQsICppbnB1dHN0ciwgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqc19vYmplY3QsICpmbXQsICppbnB1dHN0ciwgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInVucGFjayIsIDIsIDIsICZmbXQsICZpbnB1dHN0cikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInVucGFjayIsIDIsIDIsICZmbXQsICZpbnB1dHN0cikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc19vYmplY3QgPSBjYWNoZV9zdHJ1Y3QoZm10KTsKLQlpZiAoc19vYmplY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgCXJlc3VsdCA9IHNfdW5wYWNrKHNfb2JqZWN0LCBpbnB1dHN0cik7Ci0JUHlfREVDUkVGKHNfb2JqZWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHNfb2JqZWN0ID0gY2FjaGVfc3RydWN0KGZtdCk7CisgICAgaWYgKHNfb2JqZWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IHNfdW5wYWNrKHNfb2JqZWN0LCBpbnB1dHN0cik7CisgICAgUHlfREVDUkVGKHNfb2JqZWN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIodW5wYWNrX2Zyb21fZG9jLApAQCAtMjAwNCwzOCArMjAwNCwzOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHVucGFja19mcm9tKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnNfb2JqZWN0LCAqZm10LCAqbmV3YXJncywgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIFB5T2JqZWN0ICpzX29iamVjdCwgKmZtdCwgKm5ld2FyZ3MsICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKIAotCWlmIChuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1pc3NpbmcgZm9ybWF0IGFyZ3VtZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmbXQgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCW5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIG4pOwotCWlmIChuZXdhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1pc3NpbmcgZm9ybWF0IGFyZ3VtZW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmbXQgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIG5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIG4pOworICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc19vYmplY3QgPSBjYWNoZV9zdHJ1Y3QoZm10KTsKLQlpZiAoc19vYmplY3QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobmV3YXJncyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLSAgICAJcmVzdWx0ID0gc191bnBhY2tfZnJvbShzX29iamVjdCwgbmV3YXJncywga3dkcyk7Ci0JUHlfREVDUkVGKG5ld2FyZ3MpOwotCVB5X0RFQ1JFRihzX29iamVjdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBzX29iamVjdCA9IGNhY2hlX3N0cnVjdChmbXQpOworICAgIGlmIChzX29iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdCA9IHNfdW5wYWNrX2Zyb20oc19vYmplY3QsIG5ld2FyZ3MsIGt3ZHMpOworICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICBQeV9ERUNSRUYoc19vYmplY3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbW9kdWxlX2Z1bmN0aW9uc1tdID0gewotCXsiX2NsZWFyY2FjaGUiLAkoUHlDRnVuY3Rpb24pY2xlYXJjYWNoZSwJTUVUSF9OT0FSR1MsIAljbGVhcmNhY2hlX2RvY30sCi0JeyJjYWxjc2l6ZSIsCWNhbGNzaXplLAlNRVRIX08sIAljYWxjc2l6ZV9kb2N9LAotCXsicGFjayIsCXBhY2ssCQlNRVRIX1ZBUkFSR1MsIAlwYWNrX2RvY30sCi0JeyJwYWNrX2ludG8iLAlwYWNrX2ludG8sCU1FVEhfVkFSQVJHUywgCXBhY2tfaW50b19kb2N9LAotCXsidW5wYWNrIiwJdW5wYWNrLCAgICAgICAJTUVUSF9WQVJBUkdTLCAJdW5wYWNrX2RvY30sCi0JeyJ1bnBhY2tfZnJvbSIsCShQeUNGdW5jdGlvbil1bnBhY2tfZnJvbSwgCQotCQkJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIAl1bnBhY2tfZnJvbV9kb2N9LAotCXtOVUxMLAkgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfY2xlYXJjYWNoZSIsICAgICAoUHlDRnVuY3Rpb24pY2xlYXJjYWNoZSwgICAgICAgIE1FVEhfTk9BUkdTLCAgICBjbGVhcmNhY2hlX2RvY30sCisgICAgeyJjYWxjc2l6ZSIsICAgICAgICBjYWxjc2l6ZSwgICAgICAgTUVUSF9PLCAgICAgICAgIGNhbGNzaXplX2RvY30sCisgICAgeyJwYWNrIiwgICAgICAgICAgICBwYWNrLCAgICAgICAgICAgTUVUSF9WQVJBUkdTLCAgIHBhY2tfZG9jfSwKKyAgICB7InBhY2tfaW50byIsICAgICAgIHBhY2tfaW50bywgICAgICBNRVRIX1ZBUkFSR1MsICAgcGFja19pbnRvX2RvY30sCisgICAgeyJ1bnBhY2siLCAgICAgICAgICB1bnBhY2ssICAgICAgICAgTUVUSF9WQVJBUkdTLCAgIHVucGFja19kb2N9LAorICAgIHsidW5wYWNrX2Zyb20iLCAgICAgKFB5Q0Z1bmN0aW9uKXVucGFja19mcm9tLAorICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgICAgICB1bnBhY2tfZnJvbV9kb2N9LAorICAgIHtOVUxMLCAgICAgICBOVUxMfSAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0yMDczLDEwMSArMjA3MywxMDEgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X3N0cnVjdCh2b2lkKQogewotCVB5T2JqZWN0ICp2ZXIsICptOworICAgIFB5T2JqZWN0ICp2ZXIsICptOwogCi0JdmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZygiMC4yIik7Ci0JaWYgKHZlciA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgdmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZygiMC4yIik7CisgICAgaWYgKHZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQltID0gUHlfSW5pdE1vZHVsZTMoIl9zdHJ1Y3QiLCBtb2R1bGVfZnVuY3Rpb25zLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfc3RydWN0IiwgbW9kdWxlX2Z1bmN0aW9ucywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfVFlQRSgmUHlTdHJ1Y3RUeXBlKSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVN0cnVjdFR5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5X1RZUEUoJlB5U3RydWN0VHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlTdHJ1Y3RUeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAogI2lmZGVmIFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HCi0JaWYgKHB5aW50X3plcm8gPT0gTlVMTCkgewotCQlweWludF96ZXJvID0gUHlJbnRfRnJvbUxvbmcoMCk7Ci0JCWlmIChweWludF96ZXJvID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfQotCWlmIChweWxvbmdfdWxvbmdfbWFzayA9PSBOVUxMKSB7CisgICAgaWYgKHB5aW50X3plcm8gPT0gTlVMTCkgeworICAgICAgICBweWludF96ZXJvID0gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgICAgIGlmIChweWludF96ZXJvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChweWxvbmdfdWxvbmdfbWFzayA9PSBOVUxMKSB7CiAjaWYgKFNJWkVPRl9MT05HID09IDQpCi0JCXB5bG9uZ191bG9uZ19tYXNrID0gUHlMb25nX0Zyb21TdHJpbmcoIkZGRkZGRkZGIiwgTlVMTCwgMTYpOworICAgICAgICBweWxvbmdfdWxvbmdfbWFzayA9IFB5TG9uZ19Gcm9tU3RyaW5nKCJGRkZGRkZGRiIsIE5VTEwsIDE2KTsKICNlbHNlCi0JCXB5bG9uZ191bG9uZ19tYXNrID0gUHlMb25nX0Zyb21TdHJpbmcoIkZGRkZGRkZGRkZGRkZGRkYiLCBOVUxMLCAxNik7CisgICAgICAgIHB5bG9uZ191bG9uZ19tYXNrID0gUHlMb25nX0Zyb21TdHJpbmcoIkZGRkZGRkZGRkZGRkZGRkYiLCBOVUxMLCAxNik7CiAjZW5kaWYKLQkJaWYgKHB5bG9uZ191bG9uZ19tYXNrID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfQorICAgICAgICBpZiAocHlsb25nX3Vsb25nX21hc2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CiAKICNlbHNlCi0JLyogVGhpcyBzcGVlZCB0cmljayBjYW4ndCBiZSB1c2VkIHVudGlsIG92ZXJmbG93IG1hc2tpbmcgZ29lcyBhd2F5LCBiZWNhdXNlCi0JICAgbmF0aXZlIGVuZGlhbiBhbHdheXMgcmFpc2VzIGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiBvdmVyZmxvdyBtYXNraW5nLiAqLworICAgIC8qIFRoaXMgc3BlZWQgdHJpY2sgY2FuJ3QgYmUgdXNlZCB1bnRpbCBvdmVyZmxvdyBtYXNraW5nIGdvZXMgYXdheSwgYmVjYXVzZQorICAgICAgIG5hdGl2ZSBlbmRpYW4gYWx3YXlzIHJhaXNlcyBleGNlcHRpb25zIGluc3RlYWQgb2Ygb3ZlcmZsb3cgbWFza2luZy4gKi8KIAotCS8qIENoZWNrIGVuZGlhbiBhbmQgc3dhcCBpbiBmYXN0ZXIgZnVuY3Rpb25zICovCi0JewotCQlpbnQgb25lID0gMTsKLQkJZm9ybWF0ZGVmICpuYXRpdmUgPSBuYXRpdmVfdGFibGU7Ci0JCWZvcm1hdGRlZiAqb3RoZXIsICpwdHI7Ci0JCWlmICgoaW50KSoodW5zaWduZWQgY2hhciopJm9uZSkKLQkJCW90aGVyID0gbGlsZW5kaWFuX3RhYmxlOwotCQllbHNlCi0JCQlvdGhlciA9IGJpZ2VuZGlhbl90YWJsZTsKLQkJLyogU2NhbiB0aHJvdWdoIHRoZSBuYXRpdmUgdGFibGUsIGZpbmQgYSBtYXRjaGluZwotCQkgICBlbnRyeSBpbiB0aGUgZW5kaWFuIHRhYmxlIGFuZCBzd2FwIGluIHRoZQotCQkgICBuYXRpdmUgaW1wbGVtZW50YXRpb25zIHdoZW5ldmVyIHBvc3NpYmxlCi0JCSAgICg2NC1iaXQgcGxhdGZvcm1zIG1heSBub3QgaGF2ZSAic3RhbmRhcmQiIHNpemVzKSAqLwotCQl3aGlsZSAobmF0aXZlLT5mb3JtYXQgIT0gJ1wwJyAmJiBvdGhlci0+Zm9ybWF0ICE9ICdcMCcpIHsKLQkJCXB0ciA9IG90aGVyOwotCQkJd2hpbGUgKHB0ci0+Zm9ybWF0ICE9ICdcMCcpIHsKLQkJCQlpZiAocHRyLT5mb3JtYXQgPT0gbmF0aXZlLT5mb3JtYXQpIHsKLQkJCQkJLyogTWF0Y2ggZmFzdGVyIHdoZW4gZm9ybWF0cyBhcmUKLQkJCQkJICAgbGlzdGVkIGluIHRoZSBzYW1lIG9yZGVyICovCi0JCQkJCWlmIChwdHIgPT0gb3RoZXIpCi0JCQkJCQlvdGhlcisrOwotCQkJCQkvKiBPbmx5IHVzZSB0aGUgdHJpY2sgaWYgdGhlCi0JCQkJCSAgIHNpemUgbWF0Y2hlcyAqLwotCQkJCQlpZiAocHRyLT5zaXplICE9IG5hdGl2ZS0+c2l6ZSkKLQkJCQkJCWJyZWFrOwotCQkJCQkvKiBTa2lwIGZsb2F0IGFuZCBkb3VibGUsIGNvdWxkIGJlCi0JCQkJCSAgICJ1bmtub3duIiBmbG9hdCBmb3JtYXQgKi8KLQkJCQkJaWYgKHB0ci0+Zm9ybWF0ID09ICdkJyB8fCBwdHItPmZvcm1hdCA9PSAnZicpCi0JCQkJCQlicmVhazsKLQkJCQkJcHRyLT5wYWNrID0gbmF0aXZlLT5wYWNrOwotCQkJCQlwdHItPnVucGFjayA9IG5hdGl2ZS0+dW5wYWNrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcHRyKys7Ci0JCQl9Ci0JCQluYXRpdmUrKzsKLQkJfQotCX0KKyAgICAvKiBDaGVjayBlbmRpYW4gYW5kIHN3YXAgaW4gZmFzdGVyIGZ1bmN0aW9ucyAqLworICAgIHsKKyAgICAgICAgaW50IG9uZSA9IDE7CisgICAgICAgIGZvcm1hdGRlZiAqbmF0aXZlID0gbmF0aXZlX3RhYmxlOworICAgICAgICBmb3JtYXRkZWYgKm90aGVyLCAqcHRyOworICAgICAgICBpZiAoKGludCkqKHVuc2lnbmVkIGNoYXIqKSZvbmUpCisgICAgICAgICAgICBvdGhlciA9IGxpbGVuZGlhbl90YWJsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb3RoZXIgPSBiaWdlbmRpYW5fdGFibGU7CisgICAgICAgIC8qIFNjYW4gdGhyb3VnaCB0aGUgbmF0aXZlIHRhYmxlLCBmaW5kIGEgbWF0Y2hpbmcKKyAgICAgICAgICAgZW50cnkgaW4gdGhlIGVuZGlhbiB0YWJsZSBhbmQgc3dhcCBpbiB0aGUKKyAgICAgICAgICAgbmF0aXZlIGltcGxlbWVudGF0aW9ucyB3aGVuZXZlciBwb3NzaWJsZQorICAgICAgICAgICAoNjQtYml0IHBsYXRmb3JtcyBtYXkgbm90IGhhdmUgInN0YW5kYXJkIiBzaXplcykgKi8KKyAgICAgICAgd2hpbGUgKG5hdGl2ZS0+Zm9ybWF0ICE9ICdcMCcgJiYgb3RoZXItPmZvcm1hdCAhPSAnXDAnKSB7CisgICAgICAgICAgICBwdHIgPSBvdGhlcjsKKyAgICAgICAgICAgIHdoaWxlIChwdHItPmZvcm1hdCAhPSAnXDAnKSB7CisgICAgICAgICAgICAgICAgaWYgKHB0ci0+Zm9ybWF0ID09IG5hdGl2ZS0+Zm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIE1hdGNoIGZhc3RlciB3aGVuIGZvcm1hdHMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlZCBpbiB0aGUgc2FtZSBvcmRlciAqLworICAgICAgICAgICAgICAgICAgICBpZiAocHRyID09IG90aGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgLyogT25seSB1c2UgdGhlIHRyaWNrIGlmIHRoZQorICAgICAgICAgICAgICAgICAgICAgICBzaXplIG1hdGNoZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0ci0+c2l6ZSAhPSBuYXRpdmUtPnNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLyogU2tpcCBmbG9hdCBhbmQgZG91YmxlLCBjb3VsZCBiZQorICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIgZmxvYXQgZm9ybWF0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChwdHItPmZvcm1hdCA9PSAnZCcgfHwgcHRyLT5mb3JtYXQgPT0gJ2YnKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHB0ci0+cGFjayA9IG5hdGl2ZS0+cGFjazsKKyAgICAgICAgICAgICAgICAgICAgcHRyLT51bnBhY2sgPSBuYXRpdmUtPnVucGFjazsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB0cisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmF0aXZlKys7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JaWYgKFN0cnVjdEVycm9yID09IE5VTEwpIHsKLQkJU3RydWN0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInN0cnVjdC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCQlpZiAoU3RydWN0RXJyb3IgPT0gTlVMTCkKLQkJCXJldHVybjsKLQl9CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBpZiAoU3RydWN0RXJyb3IgPT0gTlVMTCkgeworICAgICAgICBTdHJ1Y3RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic3RydWN0LmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmIChTdHJ1Y3RFcnJvciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KIAotCVB5X0lOQ1JFRihTdHJ1Y3RFcnJvcik7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFN0cnVjdEVycm9yKTsKKyAgICBQeV9JTkNSRUYoU3RydWN0RXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBTdHJ1Y3RFcnJvcik7CiAKLQlQeV9JTkNSRUYoKFB5T2JqZWN0KikmUHlTdHJ1Y3RUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlN0cnVjdCIsIChQeU9iamVjdCopJlB5U3RydWN0VHlwZSk7CisgICAgUHlfSU5DUkVGKChQeU9iamVjdCopJlB5U3RydWN0VHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTdHJ1Y3QiLCAoUHlPYmplY3QqKSZQeVN0cnVjdFR5cGUpOwogCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfX3ZlcnNpb25fXyIsIHZlcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfX3ZlcnNpb25fXyIsIHZlcik7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX1BZX1NUUlVDVF9SQU5HRV9DSEVDS0lORyIsIDEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfUFlfU1RSVUNUX1JBTkdFX0NIRUNLSU5HIiwgMSk7CiAjaWZkZWYgUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX1BZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HIiwgMSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9QWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORyIsIDEpOwogI2VuZGlmCiAjaWZkZWYgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRSIsIDEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRSIsIDEpOwogI2VuZGlmCiAKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCmluZGV4IDA5OTYxNDUuLmVlNWFlNDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwpAQCAtMTIsMjIgKzEyLDIyIEBACiAjaWZkZWYgV0lUSF9USFJFQUQKICNpbmNsdWRlICJweXRocmVhZC5oIgogI2VuZGlmIC8qIFdJVEhfVEhSRUFEICovCi1zdGF0aWMgUHlPYmplY3QgKlRlc3RFcnJvcjsJLyogc2V0IHRvIGV4Y2VwdGlvbiBvYmplY3QgaW4gaW5pdCAqLworc3RhdGljIFB5T2JqZWN0ICpUZXN0RXJyb3I7ICAgICAvKiBzZXQgdG8gZXhjZXB0aW9uIG9iamVjdCBpbiBpbml0ICovCiAKIC8qIFJhaXNlIFRlc3RFcnJvciB3aXRoIHRlc3RfbmFtZSArICI6ICIgKyBtc2csIGFuZCByZXR1cm4gTlVMTC4gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhaXNlVGVzdEVycm9yKGNvbnN0IGNoYXIqIHRlc3RfbmFtZSwgY29uc3QgY2hhciogbXNnKQogewotCWNoYXIgYnVmWzIwNDhdOworICAgIGNoYXIgYnVmWzIwNDhdOwogCi0JaWYgKHN0cmxlbih0ZXN0X25hbWUpICsgc3RybGVuKG1zZykgPiBzaXplb2YoYnVmKSAtIDUwKQotCQlQeUVycl9TZXRTdHJpbmcoVGVzdEVycm9yLCAiaW50ZXJuYWwgZXJyb3IgbXNnIHRvbyBsYXJnZSIpOwotCWVsc2UgewotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczogJXMiLCB0ZXN0X25hbWUsIG1zZyk7Ci0JCVB5RXJyX1NldFN0cmluZyhUZXN0RXJyb3IsIGJ1Zik7Ci0JfQotCXJldHVybiBOVUxMOworICAgIGlmIChzdHJsZW4odGVzdF9uYW1lKSArIHN0cmxlbihtc2cpID4gc2l6ZW9mKGJ1ZikgLSA1MCkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRlc3RFcnJvciwgImludGVybmFsIGVycm9yIG1zZyB0b28gbGFyZ2UiKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6ICVzIiwgdGVzdF9uYW1lLCBtc2cpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGVzdEVycm9yLCBidWYpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogVGVzdCAjZGVmaW5lcyBmcm9tIHB5Y29uZmlnLmggKHBhcnRpY3VsYXJseSB0aGUgU0laRU9GXyogZGVmaW5lcykuCkBAIC0zOCwxMzggKzM4LDEzOCBAQAogKi8KIHN0YXRpYyBQeU9iamVjdCoKIHNpemVvZl9lcnJvcihjb25zdCBjaGFyKiBmYXRuYW1lLCBjb25zdCBjaGFyKiB0eXBuYW1lLAotICAgICAgICBpbnQgZXhwZWN0ZWQsIGludCBnb3QpCisgICAgaW50IGV4cGVjdGVkLCBpbnQgZ290KQogewotCWNoYXIgYnVmWzEwMjRdOwotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJIiUuMjAwcyAjZGVmaW5lID09ICVkIGJ1dCBzaXplb2YoJS4yMDBzKSA9PSAlZCIsCi0JCWZhdG5hbWUsIGV4cGVjdGVkLCB0eXBuYW1lLCBnb3QpOwotCVB5RXJyX1NldFN0cmluZyhUZXN0RXJyb3IsIGJ1Zik7Ci0JcmV0dXJuIChQeU9iamVjdCopTlVMTDsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICIlLjIwMHMgI2RlZmluZSA9PSAlZCBidXQgc2l6ZW9mKCUuMjAwcykgPT0gJWQiLAorICAgICAgICBmYXRuYW1lLCBleHBlY3RlZCwgdHlwbmFtZSwgZ290KTsKKyAgICBQeUVycl9TZXRTdHJpbmcoVGVzdEVycm9yLCBidWYpOworICAgIHJldHVybiAoUHlPYmplY3QqKU5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHRlc3RfY29uZmlnKFB5T2JqZWN0ICpzZWxmKQogewogI2RlZmluZSBDSEVDS19TSVpFT0YoRkFUTkFNRSwgVFlQRSkgXAotCSAgICBpZiAoRkFUTkFNRSAhPSBzaXplb2YoVFlQRSkpIFwKLSAgICAJICAgIAlyZXR1cm4gc2l6ZW9mX2Vycm9yKCNGQVROQU1FLCAjVFlQRSwgRkFUTkFNRSwgc2l6ZW9mKFRZUEUpKQorICAgICAgICAgICAgaWYgKEZBVE5BTUUgIT0gc2l6ZW9mKFRZUEUpKSBcCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpemVvZl9lcnJvcigjRkFUTkFNRSwgI1RZUEUsIEZBVE5BTUUsIHNpemVvZihUWVBFKSkKIAotCUNIRUNLX1NJWkVPRihTSVpFT0ZfU0hPUlQsIHNob3J0KTsKLQlDSEVDS19TSVpFT0YoU0laRU9GX0lOVCwgaW50KTsKLQlDSEVDS19TSVpFT0YoU0laRU9GX0xPTkcsIGxvbmcpOwotCUNIRUNLX1NJWkVPRihTSVpFT0ZfVk9JRF9QLCB2b2lkKik7Ci0JQ0hFQ0tfU0laRU9GKFNJWkVPRl9USU1FX1QsIHRpbWVfdCk7CisgICAgQ0hFQ0tfU0laRU9GKFNJWkVPRl9TSE9SVCwgc2hvcnQpOworICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfSU5ULCBpbnQpOworICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfTE9ORywgbG9uZyk7CisgICAgQ0hFQ0tfU0laRU9GKFNJWkVPRl9WT0lEX1AsIHZvaWQqKTsKKyAgICBDSEVDS19TSVpFT0YoU0laRU9GX1RJTUVfVCwgdGltZV90KTsKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCUNIRUNLX1NJWkVPRihTSVpFT0ZfTE9OR19MT05HLCBQWV9MT05HX0xPTkcpOworICAgIENIRUNLX1NJWkVPRihTSVpFT0ZfTE9OR19MT05HLCBQWV9MT05HX0xPTkcpOwogI2VuZGlmCiAKICN1bmRlZiBDSEVDS19TSVpFT0YKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHRlc3RfbGlzdF9hcGkoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QqIGxpc3Q7Ci0JaW50IGk7CisgICAgUHlPYmplY3QqIGxpc3Q7CisgICAgaW50IGk7CiAKLQkvKiBTRiBidWcgMTMyMDA4OiAgUHlMaXN0X1JldmVyc2Ugc2VnZmF1bHRzICovCisgICAgLyogU0YgYnVnIDEzMjAwODogIFB5TGlzdF9SZXZlcnNlIHNlZ2ZhdWx0cyAqLwogI2RlZmluZSBOTElTVCAzMAotCWxpc3QgPSBQeUxpc3RfTmV3KE5MSVNUKTsKLQlpZiAobGlzdCA9PSAoUHlPYmplY3QqKU5VTEwpCi0JCXJldHVybiAoUHlPYmplY3QqKU5VTEw7Ci0JLyogbGlzdCA9IHJhbmdlKE5MSVNUKSAqLwotCWZvciAoaSA9IDA7IGkgPCBOTElTVDsgKytpKSB7Ci0JCVB5T2JqZWN0KiBhbmludCA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQlpZiAoYW5pbnQgPT0gKFB5T2JqZWN0KilOVUxMKSB7Ci0JCQlQeV9ERUNSRUYobGlzdCk7Ci0JCQlyZXR1cm4gKFB5T2JqZWN0KilOVUxMOwotCQl9Ci0JCVB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCBhbmludCk7Ci0JfQotCS8qIGxpc3QucmV2ZXJzZSgpLCB2aWEgUHlMaXN0X1JldmVyc2UoKSAqLwotCWkgPSBQeUxpc3RfUmV2ZXJzZShsaXN0KTsgICAvKiBzaG91bGQgbm90IGJsb3cgdXAhICovCi0JaWYgKGkgIT0gMCkgewotCQlQeV9ERUNSRUYobGlzdCk7Ci0JCXJldHVybiAoUHlPYmplY3QqKU5VTEw7Ci0JfQotCS8qIENoZWNrIHRoYXQgbGlzdCA9PSByYW5nZSgyOSwgLTEsIC0xKSBub3cgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkxJU1Q7ICsraSkgewotCQlQeU9iamVjdCogYW5pbnQgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCWlmIChQeUludF9BU19MT05HKGFuaW50KSAhPSBOTElTVC0xLWkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhUZXN0RXJyb3IsCi0JCQkgICAgICAgICAgICAgICAgInRlc3RfbGlzdF9hcGk6IHJldmVyc2Ugc2NyZXdlZCB1cCIpOwotCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJcmV0dXJuIChQeU9iamVjdCopTlVMTDsKLQkJfQotCX0KLQlQeV9ERUNSRUYobGlzdCk7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoTkxJU1QpOworICAgIGlmIChsaXN0ID09IChQeU9iamVjdCopTlVMTCkKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopTlVMTDsKKyAgICAvKiBsaXN0ID0gcmFuZ2UoTkxJU1QpICovCisgICAgZm9yIChpID0gMDsgaSA8IE5MSVNUOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QqIGFuaW50ID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgIGlmIChhbmludCA9PSAoUHlPYmplY3QqKU5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QqKU5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QsIGksIGFuaW50KTsKKyAgICB9CisgICAgLyogbGlzdC5yZXZlcnNlKCksIHZpYSBQeUxpc3RfUmV2ZXJzZSgpICovCisgICAgaSA9IFB5TGlzdF9SZXZlcnNlKGxpc3QpOyAgIC8qIHNob3VsZCBub3QgYmxvdyB1cCEgKi8KKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopTlVMTDsKKyAgICB9CisgICAgLyogQ2hlY2sgdGhhdCBsaXN0ID09IHJhbmdlKDI5LCAtMSwgLTEpIG5vdyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOTElTVDsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0KiBhbmludCA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgaWYgKFB5SW50X0FTX0xPTkcoYW5pbnQpICE9IE5MSVNULTEtaSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRlc3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF9saXN0X2FwaTogcmV2ZXJzZSBzY3Jld2VkIHVwIik7CisgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilOVUxMOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihsaXN0KTsKICN1bmRlZiBOTElTVAogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGludAogdGVzdF9kaWN0X2lubmVyKGludCBjb3VudCkKIHsKLQlQeV9zc2l6ZV90IHBvcyA9IDAsIGl0ZXJhdGlvbnMgPSAwOwotCWludCBpOwotCVB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOwotCVB5T2JqZWN0ICp2LCAqazsKKyAgICBQeV9zc2l6ZV90IHBvcyA9IDAsIGl0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOworICAgIFB5T2JqZWN0ICp2LCAqazsKIAotCWlmIChkaWN0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQl2ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCVB5RGljdF9TZXRJdGVtKGRpY3QsIHYsIHYpOwotCQlQeV9ERUNSRUYodik7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW0oZGljdCwgdiwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiAKLQl3aGlsZSAoUHlEaWN0X05leHQoZGljdCwgJnBvcywgJmssICZ2KSkgewotCQlQeU9iamVjdCAqbzsKLQkJaXRlcmF0aW9ucysrOworICAgIHdoaWxlIChQeURpY3RfTmV4dChkaWN0LCAmcG9zLCAmaywgJnYpKSB7CisgICAgICAgIFB5T2JqZWN0ICpvOworICAgICAgICBpdGVyYXRpb25zKys7CiAKLQkJaSA9IFB5SW50X0FTX0xPTkcodikgKyAxOwotCQlvID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCWlmIChvID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBrLCBvKSA8IDApIHsKLQkJCVB5X0RFQ1JFRihvKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9ERUNSRUYobyk7Ci0JfQorICAgICAgICBpID0gUHlJbnRfQVNfTE9ORyh2KSArIDE7CisgICAgICAgIG8gPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIGssIG8pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG8pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICB9CiAKLQlQeV9ERUNSRUYoZGljdCk7CisgICAgUHlfREVDUkVGKGRpY3QpOwogCi0JaWYgKGl0ZXJhdGlvbnMgIT0gY291bnQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJVGVzdEVycm9yLAotCQkJInRlc3RfZGljdF9pdGVyYXRpb246IGRpY3QgaXRlcmF0aW9uIHdlbnQgd3JvbmcgIik7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgewotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKGl0ZXJhdGlvbnMgIT0gY291bnQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgVGVzdEVycm9yLAorICAgICAgICAgICAgInRlc3RfZGljdF9pdGVyYXRpb246IGRpY3QgaXRlcmF0aW9uIHdlbnQgd3JvbmcgIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHRlc3RfZGljdF9pdGVyYXRpb24oUHlPYmplY3QqIHNlbGYpCiB7Ci0JaW50IGk7CisgICAgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJaWYgKHRlc3RfZGljdF9pbm5lcihpKSA8IDApIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgeworICAgICAgICBpZiAodGVzdF9kaWN0X2lubmVyKGkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTE3NywxMDggKzE3NywxMDggQEAKICAqICAgUHlUeXBlX1JlYWR5IGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gY2FsbGVkCiAgKi8KIHN0YXRpYyBQeVR5cGVPYmplY3QgX0hhc2hJbmhlcml0YW5jZVRlc3Rlcl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsCQkJLyogTnVtYmVyIG9mIGl0ZW1zIGZvciB2YXJvYmplY3QgKi8KLQkiaGFzaGluaGVyaXRhbmNldGVzdGVyIiwJLyogTmFtZSBvZiB0aGlzIHR5cGUgKi8KLQlzaXplb2YoUHlPYmplY3QpLAkvKiBCYXNpYyBvYmplY3Qgc2l6ZSAqLwotCTAsCQkJLyogSXRlbSBzaXplIGZvciB2YXJvYmplY3QgKi8KLQkoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsIC8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgIC8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkvKiB0cF9mbGFncyAqLwotCTAsCQkJLyogdHBfZG9jICovCi0JMCwJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJLyogdHBfaXRlciAqLwotCTAsCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJLyogdHBfZGljdCAqLwotCTAsCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGl0ZW1zIGZvciB2YXJvYmplY3QgKi8KKyAgICAiaGFzaGluaGVyaXRhbmNldGVzdGVyIiwgICAgICAgICAgICAvKiBOYW1lIG9mIHRoaXMgdHlwZSAqLworICAgIHNpemVvZihQeU9iamVjdCksICAgICAgICAgICAvKiBCYXNpYyBvYmplY3Qgc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdGVtIHNpemUgZm9yIHZhcm9iamVjdCAqLworICAgIChkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0KgogdGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2UoUHlPYmplY3QqIHNlbGYpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlOwotCVB5T2JqZWN0ICpvYmo7Ci0JbG9uZyBoYXNoOworICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIGxvbmcgaGFzaDsKIAotCXR5cGUgPSAmX0hhc2hJbmhlcml0YW5jZVRlc3Rlcl9UeXBlOworICAgIHR5cGUgPSAmX0hhc2hJbmhlcml0YW5jZVRlc3Rlcl9UeXBlOwogCi0JaWYgKHR5cGUtPnRwX2RpY3QgIT0gTlVMTCkKLQkJLyogVGhlIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4gVGhpcyBwcm9iYWJseSBtZWFucwotCQkgICAtUiBpcyBiZWluZyB1c2VkLiAqLwotCQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAodHlwZS0+dHBfZGljdCAhPSBOVUxMKQorICAgICAgICAvKiBUaGUgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLiBUaGlzIHByb2JhYmx5IG1lYW5zCisgICAgICAgICAgIC1SIGlzIGJlaW5nIHVzZWQuICovCisgICAgICAgIFB5X1JFVFVSTl9OT05FOwogCiAKLQlvYmogPSBQeU9iamVjdF9OZXcoUHlPYmplY3QsIHR5cGUpOwotCWlmIChvYmogPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQlUZXN0RXJyb3IsCi0JCQkidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBvYmogPSBQeU9iamVjdF9OZXcoUHlPYmplY3QsIHR5cGUpOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBUZXN0RXJyb3IsCisgICAgICAgICAgICAidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICh0eXBlLT50cF9kaWN0ICE9IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJVGVzdEVycm9yLAotCQkJInRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlOiB0eXBlIGluaXRpYWxpc2VkIHRvbyBzb29uIik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2RpY3QgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBUZXN0RXJyb3IsCisgICAgICAgICAgICAidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IHR5cGUgaW5pdGlhbGlzZWQgdG9vIHNvb24iKTsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWhhc2ggPSBQeU9iamVjdF9IYXNoKG9iaik7Ci0JaWYgKChoYXNoID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVRlc3RFcnJvciwKLQkJCSJ0ZXN0X2xhenlfaGFzaF9pbmhlcml0YW5jZTogY291bGQgbm90IGhhc2ggb2JqZWN0Iik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2gob2JqKTsKKyAgICBpZiAoKGhhc2ggPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgVGVzdEVycm9yLAorICAgICAgICAgICAgInRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlOiBjb3VsZCBub3QgaGFzaCBvYmplY3QiKTsKKyAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICh0eXBlLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJVGVzdEVycm9yLAotCQkJInRlc3RfbGF6eV9oYXNoX2luaGVyaXRhbmNlOiB0eXBlIG5vdCBpbml0aWFsaXNlZCBieSBoYXNoKCkiKTsKLQkJUHlfREVDUkVGKG9iaik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodHlwZS0+dHBfZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFRlc3RFcnJvciwKKyAgICAgICAgICAgICJ0ZXN0X2xhenlfaGFzaF9pbmhlcml0YW5jZTogdHlwZSBub3QgaW5pdGlhbGlzZWQgYnkgaGFzaCgpIik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAodHlwZS0+dHBfaGFzaCAhPSBQeVR5cGVfVHlwZS50cF9oYXNoKSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVRlc3RFcnJvciwKLQkJCSJ0ZXN0X2xhenlfaGFzaF9pbmhlcml0YW5jZTogdW5leHBlY3RlZCBoYXNoIGZ1bmN0aW9uIik7Ci0JCVB5X0RFQ1JFRihvYmopOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2hhc2ggIT0gUHlUeXBlX1R5cGUudHBfaGFzaCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBUZXN0RXJyb3IsCisgICAgICAgICAgICAidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2U6IHVuZXhwZWN0ZWQgaGFzaCBmdW5jdGlvbiIpOworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfREVDUkVGKG9iaik7CisgICAgUHlfREVDUkVGKG9iaik7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogCkBAIC0zMDIsMjIgKzMwMiwyMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJhaXNlX3Rlc3RfbG9uZ19lcnJvcihjb25zdCBjaGFyKiBtc2cpCiB7Ci0JcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2xvbmdfYXBpIiwgbXNnKTsKKyAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19hcGkiLCBtc2cpOwogfQogCi0jZGVmaW5lIFRFU1ROQU1FCXRlc3RfbG9uZ19hcGlfaW5uZXIKLSNkZWZpbmUgVFlQRU5BTUUJbG9uZwotI2RlZmluZSBGX1NfVE9fUFkJUHlMb25nX0Zyb21Mb25nCi0jZGVmaW5lIEZfUFlfVE9fUwlQeUxvbmdfQXNMb25nCi0jZGVmaW5lIEZfVV9UT19QWQlQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZwotI2RlZmluZSBGX1BZX1RPX1UJUHlMb25nX0FzVW5zaWduZWRMb25nCisjZGVmaW5lIFRFU1ROQU1FICAgICAgICB0ZXN0X2xvbmdfYXBpX2lubmVyCisjZGVmaW5lIFRZUEVOQU1FICAgICAgICBsb25nCisjZGVmaW5lIEZfU19UT19QWSAgICAgICBQeUxvbmdfRnJvbUxvbmcKKyNkZWZpbmUgRl9QWV9UT19TICAgICAgIFB5TG9uZ19Bc0xvbmcKKyNkZWZpbmUgRl9VX1RPX1BZICAgICAgIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nCisjZGVmaW5lIEZfUFlfVE9fVSAgICAgICBQeUxvbmdfQXNVbnNpZ25lZExvbmcKIAogI2luY2x1ZGUgInRlc3RjYXBpX2xvbmcuaCIKIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfbG9uZ19hcGkoUHlPYmplY3QqIHNlbGYpCiB7Ci0JcmV0dXJuIFRFU1ROQU1FKHJhaXNlX3Rlc3RfbG9uZ19lcnJvcik7CisgICAgcmV0dXJuIFRFU1ROQU1FKHJhaXNlX3Rlc3RfbG9uZ19lcnJvcik7CiB9CiAKICN1bmRlZiBURVNUTkFNRQpAQCAtMzMyLDIyICszMzIsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByYWlzZV90ZXN0X2xvbmdsb25nX2Vycm9yKGNvbnN0IGNoYXIqIG1zZykKIHsKLQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ2xvbmdfYXBpIiwgbXNnKTsKKyAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ2xvbmdfYXBpIiwgbXNnKTsKIH0KIAotI2RlZmluZSBURVNUTkFNRQl0ZXN0X2xvbmdsb25nX2FwaV9pbm5lcgotI2RlZmluZSBUWVBFTkFNRQlQWV9MT05HX0xPTkcKLSNkZWZpbmUgRl9TX1RPX1BZCVB5TG9uZ19Gcm9tTG9uZ0xvbmcKLSNkZWZpbmUgRl9QWV9UT19TCVB5TG9uZ19Bc0xvbmdMb25nCi0jZGVmaW5lIEZfVV9UT19QWQlQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcKLSNkZWZpbmUgRl9QWV9UT19VCVB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcKKyNkZWZpbmUgVEVTVE5BTUUgICAgICAgIHRlc3RfbG9uZ2xvbmdfYXBpX2lubmVyCisjZGVmaW5lIFRZUEVOQU1FICAgICAgICBQWV9MT05HX0xPTkcKKyNkZWZpbmUgRl9TX1RPX1BZICAgICAgIFB5TG9uZ19Gcm9tTG9uZ0xvbmcKKyNkZWZpbmUgRl9QWV9UT19TICAgICAgIFB5TG9uZ19Bc0xvbmdMb25nCisjZGVmaW5lIEZfVV9UT19QWSAgICAgICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcKKyNkZWZpbmUgRl9QWV9UT19VICAgICAgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcKIAogI2luY2x1ZGUgInRlc3RjYXBpX2xvbmcuaCIKIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfbG9uZ2xvbmdfYXBpKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gVEVTVE5BTUUocmFpc2VfdGVzdF9sb25nbG9uZ19lcnJvcik7CisgICAgcmV0dXJuIFRFU1ROQU1FKHJhaXNlX3Rlc3RfbG9uZ2xvbmdfZXJyb3IpOwogfQogCiAjdW5kZWYgVEVTVE5BTUUKQEAgLTM2NCw3MSArMzY0LDcxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF9MX2NvZGUoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnR1cGxlLCAqbnVtOwotCVBZX0xPTkdfTE9ORyB2YWx1ZTsKKyAgICBQeU9iamVjdCAqdHVwbGUsICpudW07CisgICAgUFlfTE9OR19MT05HIHZhbHVlOwogCi0gICAgICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoMSk7Ci0gICAgICAgIGlmICh0dXBsZSA9PSBOVUxMKQotICAgICAgICAJcmV0dXJuIE5VTEw7CisgICAgdHVwbGUgPSBQeVR1cGxlX05ldygxKTsKKyAgICBpZiAodHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgbnVtID0gUHlMb25nX0Zyb21Mb25nKDQyKTsKLSAgICAgICAgaWYgKG51bSA9PSBOVUxMKQotICAgICAgICAJcmV0dXJuIE5VTEw7CisgICAgbnVtID0gUHlMb25nX0Zyb21Mb25nKDQyKTsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKIAotICAgICAgICB2YWx1ZSA9IC0xOwotICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgIkw6dGVzdF9MX2NvZGUiLCAmdmFsdWUpIDwgMCkKLSAgICAgICAgCXJldHVybiBOVUxMOwotICAgICAgICBpZiAodmFsdWUgIT0gNDIpCi0gICAgICAgIAlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfTF9jb2RlIiwKLQkJCSJMIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgNDIiKTsKKyAgICB2YWx1ZSA9IC0xOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiTDp0ZXN0X0xfY29kZSIsICZ2YWx1ZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gNDIpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9MX2NvZGUiLAorICAgICAgICAgICAgIkwgY29kZSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyA0MiIpOwogCi0JUHlfREVDUkVGKG51bSk7Ci0gICAgICAgIG51bSA9IFB5SW50X0Zyb21Mb25nKDQyKTsKLSAgICAgICAgaWYgKG51bSA9PSBOVUxMKQotICAgICAgICAJcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKG51bSk7CisgICAgbnVtID0gUHlJbnRfRnJvbUxvbmcoNDIpOworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOwogCi0JdmFsdWUgPSAtMTsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJMOnRlc3RfTF9jb2RlIiwgJnZhbHVlKSA8IDApCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKHZhbHVlICE9IDQyKQotICAgICAgICAJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X0xfY29kZSIsCi0JCQkiTCBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBpbnQgNDIiKTsKKyAgICB2YWx1ZSA9IC0xOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiTDp0ZXN0X0xfY29kZSIsICZ2YWx1ZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gNDIpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9MX2NvZGUiLAorICAgICAgICAgICAgIkwgY29kZSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgaW50IDQyIik7CiAKLQlQeV9ERUNSRUYodHVwbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAotI2VuZGlmCS8qIGlmZGVmIEhBVkVfTE9OR19MT05HICovCisjZW5kaWYgIC8qIGlmZGVmIEhBVkVfTE9OR19MT05HICovCiAKIC8qIFRlc3QgdHVwbGUgYXJndW1lbnQgcHJvY2Vzc2luZyAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfdHVwbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBhLCBiLCBjOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaShpaSkiLCAmYSwgJmIsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIGEsIGIsIGMpOworICAgIGludCBhLCBiLCBjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaShpaSkiLCAmYSwgJmIsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIGEsIGIsIGMpOwogfQogCiAvKiB0ZXN0IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyAqLwogc3RhdGljIFB5T2JqZWN0ICpnZXRhcmdzX2tleXdvcmRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYXJnMSIsImFyZzIiLCJhcmczIiwiYXJnNCIsImFyZzUiLCBOVUxMfTsKLQlzdGF0aWMgY2hhciAqZm10PSIoaWkpaXwoaShpaSkpKGlpaSlpIjsKLQlpbnQgaW50X2FyZ3NbMTBdPXstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLCJhcmc1IiwgTlVMTH07CisgICAgc3RhdGljIGNoYXIgKmZtdD0iKGlpKWl8KGkoaWkpKShpaWkpaSI7CisgICAgaW50IGludF9hcmdzWzEwXT17LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCBmbXQsIGtleXdvcmRzLAotCQkmaW50X2FyZ3NbMF0sICZpbnRfYXJnc1sxXSwgJmludF9hcmdzWzJdLCAmaW50X2FyZ3NbM10sICZpbnRfYXJnc1s0XSwKLQkJJmludF9hcmdzWzVdLCAmaW50X2FyZ3NbNl0sICZpbnRfYXJnc1s3XSwgJmludF9hcmdzWzhdLCAmaW50X2FyZ3NbOV0pKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpaWlpaWlpaSIsCi0JCWludF9hcmdzWzBdLCBpbnRfYXJnc1sxXSwgaW50X2FyZ3NbMl0sIGludF9hcmdzWzNdLCBpbnRfYXJnc1s0XSwKLQkJaW50X2FyZ3NbNV0sIGludF9hcmdzWzZdLCBpbnRfYXJnc1s3XSwgaW50X2FyZ3NbOF0sIGludF9hcmdzWzldKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsIGZtdCwga2V5d29yZHMsCisgICAgICAgICZpbnRfYXJnc1swXSwgJmludF9hcmdzWzFdLCAmaW50X2FyZ3NbMl0sICZpbnRfYXJnc1szXSwgJmludF9hcmdzWzRdLAorICAgICAgICAmaW50X2FyZ3NbNV0sICZpbnRfYXJnc1s2XSwgJmludF9hcmdzWzddLCAmaW50X2FyZ3NbOF0sICZpbnRfYXJnc1s5XSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWlpaWlpaWlpIiwKKyAgICAgICAgaW50X2FyZ3NbMF0sIGludF9hcmdzWzFdLCBpbnRfYXJnc1syXSwgaW50X2FyZ3NbM10sIGludF9hcmdzWzRdLAorICAgICAgICBpbnRfYXJnc1s1XSwgaW50X2FyZ3NbNl0sIGludF9hcmdzWzddLCBpbnRfYXJnc1s4XSwgaW50X2FyZ3NbOV0pOwogfQogCiAvKiBGdW5jdGlvbnMgdG8gY2FsbCBQeUFyZ19QYXJzZVR1cGxlIHdpdGggaW50ZWdlciBmb3JtYXQgY29kZXMsCkBAIC00MzcsOTIgKzQzNyw5MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfYihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgY2hhciB2YWx1ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImIiLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpdmFsdWUpOworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJiIiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfQihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgY2hhciB2YWx1ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkIiLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpdmFsdWUpOworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJCIiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfSChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJIIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXZhbHVlKTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkgiLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpdmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJnc19JKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBpbnQgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXZhbHVlKTsKKyAgICB1bnNpZ25lZCBpbnQgdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJIiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImsiLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodmFsdWUpOworICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHZhbHVlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpdmFsdWUpOworICAgIGludCB2YWx1ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKChsb25nKXZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldGFyZ3NfbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyB2YWx1ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKHZhbHVlKTsKKyAgICBsb25nIHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJnc19uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IHZhbHVlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibiIsICZ2YWx1ZSkpCi0JcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHZhbHVlKTsKKyAgICBQeV9zc2l6ZV90IHZhbHVlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibiIsICZ2YWx1ZSkpCisgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHZhbHVlKTsKIH0KIAogI2lmZGVmIEhBVkVfTE9OR19MT05HCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJnc19MKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQWV9MT05HX0xPTkcgdmFsdWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJMIiwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcodmFsdWUpOworICAgIFBZX0xPTkdfTE9ORyB2YWx1ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkwiLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcmdzX0soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWx1ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIksiLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbHVlKTsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsdWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJLIiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWx1ZSk7CiB9CiAjZW5kaWYKIApAQCAtNTMxLDU0ICs1MzEsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2tfY29kZShQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdHVwbGUsICpudW07Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyAgICBQeU9iamVjdCAqdHVwbGUsICpudW07CisgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAotICAgICAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KDEpOwotICAgICAgICBpZiAodHVwbGUgPT0gTlVMTCkKLSAgICAgICAgCXJldHVybiBOVUxMOworICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoMSk7CisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogYSBudW1iZXIgbGFyZ2VyIHRoYW4gVUxPTkdfTUFYIGV2ZW4gb24gNjQtYml0IHBsYXRmb3JtcyAqLwotICAgICAgICBudW0gPSBQeUxvbmdfRnJvbVN0cmluZygiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIiwgTlVMTCwgMTYpOwotICAgICAgICBpZiAobnVtID09IE5VTEwpCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKKyAgICAvKiBhIG51bWJlciBsYXJnZXIgdGhhbiBVTE9OR19NQVggZXZlbiBvbiA2NC1iaXQgcGxhdGZvcm1zICovCisgICAgbnVtID0gUHlMb25nX0Zyb21TdHJpbmcoIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIsIE5VTEwsIDE2KTsKKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdmFsdWUgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sobnVtKTsKLQlpZiAodmFsdWUgIT0gVUxPTkdfTUFYKQotICAgICAgICAJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCi0JICAgICJQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soKSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOworICAgIHZhbHVlID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG51bSk7CisgICAgaWYgKHZhbHVlICE9IFVMT05HX01BWCkKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCisgICAgICAgICJQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soKSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOwogCi0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKIAotICAgICAgICB2YWx1ZSA9IDA7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAiazp0ZXN0X2tfY29kZSIsICZ2YWx1ZSkgPCAwKQotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBVTE9OR19NQVgpCi0gICAgICAgIAlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKLQkJCSJrIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKKyAgICB2YWx1ZSA9IDA7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJrOnRlc3Rfa19jb2RlIiwgJnZhbHVlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSBVTE9OR19NQVgpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAorICAgICAgICAgICAgImsgY29kZSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOwogCi0JUHlfREVDUkVGKG51bSk7Ci0gICAgICAgIG51bSA9IFB5TG9uZ19Gcm9tU3RyaW5nKCItRkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwNDIiLCBOVUxMLCAxNik7Ci0gICAgICAgIGlmIChudW0gPT0gTlVMTCkKLSAgICAgICAgCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihudW0pOworICAgIG51bSA9IFB5TG9uZ19Gcm9tU3RyaW5nKCItRkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwNDIiLCBOVUxMLCAxNik7CisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXZhbHVlID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG51bSk7Ci0JaWYgKHZhbHVlICE9ICh1bnNpZ25lZCBsb25nKS0weDQyKQotICAgICAgICAJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCi0JICAgICJQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soKSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOworICAgIHZhbHVlID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKG51bSk7CisgICAgaWYgKHZhbHVlICE9ICh1bnNpZ25lZCBsb25nKS0weDQyKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKKyAgICAgICAgIlB5SW50X0FzVW5zaWduZWRMb25nTWFzaygpIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CiAKLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOwogCi0JdmFsdWUgPSAwOwotICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgIms6dGVzdF9rX2NvZGUiLCAmdmFsdWUpIDwgMCkKLSAgICAgICAgCXJldHVybiBOVUxMOwotICAgICAgICBpZiAodmFsdWUgIT0gKHVuc2lnbmVkIGxvbmcpLTB4NDIpCi0gICAgICAgIAlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKLQkJCSJrIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgLTB4RkZGLi4wMDAwNDIiKTsKKyAgICB2YWx1ZSA9IDA7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJrOnRlc3Rfa19jb2RlIiwgJnZhbHVlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSAodW5zaWduZWQgbG9uZyktMHg0MikKKyAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCisgICAgICAgICAgICAiayBjb2RlIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIC0weEZGRi4uMDAwMDQyIik7CiAKLQlQeV9ERUNSRUYodHVwbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKQEAgLTU5MSw4OCArNTkxLDg4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF91X2NvZGUoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnR1cGxlLCAqb2JqOwotCVB5X1VOSUNPREUgKnZhbHVlOwotCWludCBsZW47CisgICAgUHlPYmplY3QgKnR1cGxlLCAqb2JqOworICAgIFB5X1VOSUNPREUgKnZhbHVlOworICAgIGludCBsZW47CiAKLQkvKiBpc3N1ZTQxMjI6IFVuZGVmaW5lZCByZWZlcmVuY2UgdG8gX1B5X2FzY2lpX3doaXRlc3BhY2Ugb24gV2luZG93cyAqLwotCS8qIEp1c3QgdXNlIHRoZSBtYWNybyBhbmQgY2hlY2sgdGhhdCBpdCBjb21waWxlcyAqLwotCXggPSBQeV9VTklDT0RFX0lTU1BBQ0UoMjUpOworICAgIC8qIGlzc3VlNDEyMjogVW5kZWZpbmVkIHJlZmVyZW5jZSB0byBfUHlfYXNjaWlfd2hpdGVzcGFjZSBvbiBXaW5kb3dzICovCisgICAgLyogSnVzdCB1c2UgdGhlIG1hY3JvIGFuZCBjaGVjayB0aGF0IGl0IGNvbXBpbGVzICovCisgICAgeCA9IFB5X1VOSUNPREVfSVNTUEFDRSgyNSk7CiAKLSAgICAgICAgdHVwbGUgPSBQeVR1cGxlX05ldygxKTsKLSAgICAgICAgaWYgKHR1cGxlID09IE5VTEwpCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKKyAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KDEpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBvYmogPSBQeVVuaWNvZGVfRGVjb2RlKCJ0ZXN0Iiwgc3RybGVuKCJ0ZXN0IiksCi0JCQkgICAgICAgImFzY2lpIiwgTlVMTCk7Ci0gICAgICAgIGlmIChvYmogPT0gTlVMTCkKLSAgICAgICAgCXJldHVybiBOVUxMOworICAgIG9iaiA9IFB5VW5pY29kZV9EZWNvZGUoInRlc3QiLCBzdHJsZW4oInRlc3QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc2NpaSIsIE5VTEwpOworICAgIGlmIChvYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgb2JqKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBvYmopOwogCi0gICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJ1OnRlc3RfdV9jb2RlIiwgJnZhbHVlKSA8IDApCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKHZhbHVlICE9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaikpCi0gICAgICAgIAlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfdV9jb2RlIiwKLQkJCSJ1IGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIHUndGVzdCciKTsKLSAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh0dXBsZSwgInUjOnRlc3RfdV9jb2RlIiwgJnZhbHVlLCAmbGVuKSA8IDApCi0gICAgICAgIAlyZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKHZhbHVlICE9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iaikgfHwKLQkgICAgbGVuICE9IFB5VW5pY29kZV9HRVRfU0laRShvYmopKQotICAgICAgICAJcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X3VfY29kZSIsCi0JCQkidSMgY29kZSByZXR1cm5lZCB3cm9uZyB2YWx1ZXMgZm9yIHUndGVzdCciKTsKKyAgICB2YWx1ZSA9IDA7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJ1OnRlc3RfdV9jb2RlIiwgJnZhbHVlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2YWx1ZSAhPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmopKQorICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfdV9jb2RlIiwKKyAgICAgICAgICAgICJ1IGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIHUndGVzdCciKTsKKyAgICB2YWx1ZSA9IDA7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJ1Izp0ZXN0X3VfY29kZSIsICZ2YWx1ZSwgJmxlbikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKSB8fAorICAgICAgICBsZW4gIT0gUHlVbmljb2RlX0dFVF9TSVpFKG9iaikpCisgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF91X2NvZGUiLAorICAgICAgICAgICAgInUjIGNvZGUgcmV0dXJuZWQgd3JvbmcgdmFsdWVzIGZvciB1J3Rlc3QnIik7CiAKLQlQeV9ERUNSRUYodHVwbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfZW1wdHlfYXJncGFyc2UoUHlPYmplY3QgKnNlbGYpCiB7Ci0JLyogVGVzdCB0aGF0IGZvcm1hdHMgY2FuIGJlZ2luIHdpdGggJ3wnLiBTZWUgaXNzdWUgIzQ3MjAuICovCi0JUHlPYmplY3QgKnR1cGxlLCAqZGljdCA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0ge05VTEx9OwotCWludCByZXN1bHQ7Ci0JdHVwbGUgPSBQeVR1cGxlX05ldygwKTsKLQlpZiAoIXR1cGxlKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHJlc3VsdCA9IFB5QXJnX1BhcnNlVHVwbGUodHVwbGUsICJ8OnRlc3RfZW1wdHlfYXJncGFyc2UiKSkgPCAwKQotCQlnb3RvIGRvbmU7Ci0JZGljdCA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIWRpY3QpCi0JCWdvdG8gZG9uZTsKLQlyZXN1bHQgPSBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHModHVwbGUsIGRpY3QsICJ8OnRlc3RfZW1wdHlfYXJncGFyc2UiLCBrd2xpc3QpOworICAgIC8qIFRlc3QgdGhhdCBmb3JtYXRzIGNhbiBiZWdpbiB3aXRoICd8Jy4gU2VlIGlzc3VlICM0NzIwLiAqLworICAgIFB5T2JqZWN0ICp0dXBsZSwgKmRpY3QgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHtOVUxMfTsKKyAgICBpbnQgcmVzdWx0OworICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKCF0dXBsZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChyZXN1bHQgPSBQeUFyZ19QYXJzZVR1cGxlKHR1cGxlLCAifDp0ZXN0X2VtcHR5X2FyZ3BhcnNlIikpIDwgMCkKKyAgICAgICAgZ290byBkb25lOworICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFkaWN0KQorICAgICAgICBnb3RvIGRvbmU7CisgICAgcmVzdWx0ID0gUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKHR1cGxlLCBkaWN0LCAifDp0ZXN0X2VtcHR5X2FyZ3BhcnNlIiwga3dsaXN0KTsKICAgZG9uZToKLQlQeV9ERUNSRUYodHVwbGUpOwotCVB5X1hERUNSRUYoZGljdCk7Ci0JaWYgKHJlc3VsdCA8IDApCi0JCXJldHVybiBOVUxMOwotCWVsc2UgewotCQlQeV9SRVRVUk5fTk9ORTsKLQl9CisgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICBQeV9YREVDUkVGKGRpY3QpOworICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljb25zdCBjaGFyICplbmNvZGluZywgKmVycm9ycyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6dGVzdF9pbmNyZW1lbnRhbGVuY29kZXIiLAotCQkJICAgICAgJmVuY29kaW5nLCAmZXJyb3JzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyKGVuY29kaW5nLCBlcnJvcnMpOworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAqZXJyb3JzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp0ZXN0X2luY3JlbWVudGFsZW5jb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUNvZGVjX0luY3JlbWVudGFsRW5jb2RlcihlbmNvZGluZywgZXJyb3JzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvZGVjX2luY3JlbWVudGFsZGVjb2RlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY29uc3QgY2hhciAqZW5jb2RpbmcsICplcnJvcnMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOnRlc3RfaW5jcmVtZW50YWxkZWNvZGVyIiwKLQkJCSAgICAgICZlbmNvZGluZywgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUNvZGVjX0luY3JlbWVudGFsRGVjb2RlcihlbmNvZGluZywgZXJyb3JzKTsKKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgKmVycm9ycyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6dGVzdF9pbmNyZW1lbnRhbGRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIoZW5jb2RpbmcsIGVycm9ycyk7CiB9CiAKICNlbmRpZgpAQCAtNjgxLDQyICs2ODEsNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X2xvbmdfbnVtYml0cyhQeU9iamVjdCAqc2VsZikKIHsKLQlzdHJ1Y3QgdHJpcGxlIHsKLQkJbG9uZyBpbnB1dDsKLQkJc2l6ZV90IG5iaXRzOwotCQlpbnQgc2lnbjsKLQl9IHRlc3RjYXNlc1tdID0ge3swLCAwLCAwfSwKLQkJCSB7MUwsIDEsIDF9LAotCQkJIHstMUwsIDEsIC0xfSwKLQkJCSB7MkwsIDIsIDF9LAotCQkJIHstMkwsIDIsIC0xfSwKLQkJCSB7M0wsIDIsIDF9LAotCQkJIHstM0wsIDIsIC0xfSwKLQkJCSB7NEwsIDMsIDF9LAotCQkJIHstNEwsIDMsIC0xfSwKLQkJCSB7MHg3ZmZmTCwgMTUsIDF9LAkvKiBvbmUgUHl0aG9uIGxvbmcgZGlnaXQgKi8KLQkJCSB7LTB4N2ZmZkwsIDE1LCAtMX0sCi0JCQkgezB4ZmZmZkwsIDE2LCAxfSwKLQkJCSB7LTB4ZmZmZkwsIDE2LCAtMX0sCi0JCQkgezB4ZmZmZmZmZkwsIDI4LCAxfSwKLQkJCSB7LTB4ZmZmZmZmZkwsIDI4LCAtMX19OwotCWludCBpOworICAgIHN0cnVjdCB0cmlwbGUgeworICAgICAgICBsb25nIGlucHV0OworICAgICAgICBzaXplX3QgbmJpdHM7CisgICAgICAgIGludCBzaWduOworICAgIH0gdGVzdGNhc2VzW10gPSB7ezAsIDAsIDB9LAorICAgICAgICAgICAgICAgICAgICAgezFMLCAxLCAxfSwKKyAgICAgICAgICAgICAgICAgICAgIHstMUwsIDEsIC0xfSwKKyAgICAgICAgICAgICAgICAgICAgIHsyTCwgMiwgMX0sCisgICAgICAgICAgICAgICAgICAgICB7LTJMLCAyLCAtMX0sCisgICAgICAgICAgICAgICAgICAgICB7M0wsIDIsIDF9LAorICAgICAgICAgICAgICAgICAgICAgey0zTCwgMiwgLTF9LAorICAgICAgICAgICAgICAgICAgICAgezRMLCAzLCAxfSwKKyAgICAgICAgICAgICAgICAgICAgIHstNEwsIDMsIC0xfSwKKyAgICAgICAgICAgICAgICAgICAgIHsweDdmZmZMLCAxNSwgMX0sICAgICAgICAgIC8qIG9uZSBQeXRob24gbG9uZyBkaWdpdCAqLworICAgICAgICAgICAgIHstMHg3ZmZmTCwgMTUsIC0xfSwKKyAgICAgICAgICAgICB7MHhmZmZmTCwgMTYsIDF9LAorICAgICAgICAgICAgIHstMHhmZmZmTCwgMTYsIC0xfSwKKyAgICAgICAgICAgICB7MHhmZmZmZmZmTCwgMjgsIDF9LAorICAgICAgICAgICAgIHstMHhmZmZmZmZmTCwgMjgsIC0xfX07CisgICAgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRlc3RjYXNlcykgLyBzaXplb2Yoc3RydWN0IHRyaXBsZSk7ICsraSkgewotCQlQeU9iamVjdCAqcGxvbmcgPSBQeUxvbmdfRnJvbUxvbmcodGVzdGNhc2VzW2ldLmlucHV0KTsKLQkJc2l6ZV90IG5iaXRzID0gX1B5TG9uZ19OdW1CaXRzKHBsb25nKTsKLQkJaW50IHNpZ24gPSBfUHlMb25nX1NpZ24ocGxvbmcpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YodGVzdGNhc2VzKSAvIHNpemVvZihzdHJ1Y3QgdHJpcGxlKTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICpwbG9uZyA9IFB5TG9uZ19Gcm9tTG9uZyh0ZXN0Y2FzZXNbaV0uaW5wdXQpOworICAgICAgICBzaXplX3QgbmJpdHMgPSBfUHlMb25nX051bUJpdHMocGxvbmcpOworICAgICAgICBpbnQgc2lnbiA9IF9QeUxvbmdfU2lnbihwbG9uZyk7CiAKLQkJUHlfREVDUkVGKHBsb25nKTsKLQkJaWYgKG5iaXRzICE9IHRlc3RjYXNlc1tpXS5uYml0cykKLQkJCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX251bWJpdHMiLAotCQkJCQkid3JvbmcgcmVzdWx0IGZvciBfUHlMb25nX051bUJpdHMiKTsKLQkJaWYgKHNpZ24gIT0gdGVzdGNhc2VzW2ldLnNpZ24pCi0JCQlyZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3RfbG9uZ19udW1iaXRzIiwKLQkJCQkJIndyb25nIHJlc3VsdCBmb3IgX1B5TG9uZ19TaWduIik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfREVDUkVGKHBsb25nKTsKKyAgICAgICAgaWYgKG5iaXRzICE9IHRlc3RjYXNlc1tpXS5uYml0cykKKyAgICAgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX251bWJpdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyByZXN1bHQgZm9yIF9QeUxvbmdfTnVtQml0cyIpOworICAgICAgICBpZiAoc2lnbiAhPSB0ZXN0Y2FzZXNbaV0uc2lnbikKKyAgICAgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9sb25nX251bWJpdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyByZXN1bHQgZm9yIF9QeUxvbmdfU2lnbiIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIEV4YW1wbGUgcGFzc2luZyBOVUxMcyB0byBQeU9iamVjdF9TdHIoTlVMTCkgYW5kIFB5T2JqZWN0X1VuaWNvZGUoTlVMTCkuICovCkBAIC03MjQsNDIgKzcyNCw0MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfbnVsbF9zdHJpbmdzKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpvMSA9IFB5T2JqZWN0X1N0cihOVUxMKSwgKm8yID0gUHlPYmplY3RfVW5pY29kZShOVUxMKTsKLQlQeU9iamVjdCAqdHVwbGUgPSBQeVR1cGxlX1BhY2soMiwgbzEsIG8yKTsKLQlQeV9YREVDUkVGKG8xKTsKLQlQeV9YREVDUkVGKG8yKTsKLQlyZXR1cm4gdHVwbGU7CisgICAgUHlPYmplY3QgKm8xID0gUHlPYmplY3RfU3RyKE5VTEwpLCAqbzIgPSBQeU9iamVjdF9Vbmljb2RlKE5VTEwpOworICAgIFB5T2JqZWN0ICp0dXBsZSA9IFB5VHVwbGVfUGFjaygyLCBvMSwgbzIpOworICAgIFB5X1hERUNSRUYobzEpOworICAgIFB5X1hERUNSRUYobzIpOworICAgIHJldHVybiB0dXBsZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhaXNlX2V4Y2VwdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmV4YzsKLQlQeU9iamVjdCAqZXhjX2FyZ3MsICp2OwotCWludCBudW1fYXJncywgaTsKKyAgICBQeU9iamVjdCAqZXhjOworICAgIFB5T2JqZWN0ICpleGNfYXJncywgKnY7CisgICAgaW50IG51bV9hcmdzLCBpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpyYWlzZV9leGNlcHRpb24iLAotCQkJICAgICAgJmV4YywgJm51bV9hcmdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGV4YykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImFuIGV4Y2VwdGlvbiBjbGFzcyBpcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpyYWlzZV9leGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhjLCAmbnVtX2FyZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2soZXhjKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYW4gZXhjZXB0aW9uIGNsYXNzIGlzIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWV4Y19hcmdzID0gUHlUdXBsZV9OZXcobnVtX2FyZ3MpOwotCWlmIChleGNfYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotCQl2ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihleGNfYXJncyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKGV4Y19hcmdzLCBpLCB2KTsKLQl9Ci0JUHlFcnJfU2V0T2JqZWN0KGV4YywgZXhjX2FyZ3MpOwotCVB5X0RFQ1JFRihleGNfYXJncyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgZXhjX2FyZ3MgPSBQeVR1cGxlX05ldyhudW1fYXJncyk7CisgICAgaWYgKGV4Y19hcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGV4Y19hcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oZXhjX2FyZ3MsIGksIHYpOworICAgIH0KKyAgICBQeUVycl9TZXRPYmplY3QoZXhjLCBleGNfYXJncyk7CisgICAgUHlfREVDUkVGKGV4Y19hcmdzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogI2lmZGVmIFdJVEhfVEhSRUFECkBAIC03NzYsMTQgKzc3NiwxNCBAQAogc3RhdGljIGludAogX21ha2VfY2FsbCh2b2lkICpjYWxsYWJsZSkKIHsKLQlQeU9iamVjdCAqcmM7Ci0JaW50IHN1Y2Nlc3M7Ci0JUHlHSUxTdGF0ZV9TVEFURSBzID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKLQlyYyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKiljYWxsYWJsZSwgIiIpOwotCXN1Y2Nlc3MgPSAocmMgIT0gTlVMTCk7Ci0JUHlfWERFQ1JFRihyYyk7Ci0JUHlHSUxTdGF0ZV9SZWxlYXNlKHMpOwotCXJldHVybiBzdWNjZXNzOworICAgIFB5T2JqZWN0ICpyYzsKKyAgICBpbnQgc3VjY2VzczsKKyAgICBQeUdJTFN0YXRlX1NUQVRFIHMgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworICAgIHJjID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKWNhbGxhYmxlLCAiIik7CisgICAgc3VjY2VzcyA9IChyYyAhPSBOVUxMKTsKKyAgICBQeV9YREVDUkVGKHJjKTsKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2Uocyk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIC8qIFNhbWUgdGhpbmcsIGJ1dCByZWxlYXNlcyBgdGhyZWFkX2RvbmVgIHdoZW4gaXQgcmV0dXJucy4gIFRoaXMgdmFyaWFudApAQCAtNzkyLDU5ICs3OTIsNTkgQEAKIHN0YXRpYyB2b2lkCiBfbWFrZV9jYWxsX2Zyb21fdGhyZWFkKHZvaWQgKmNhbGxhYmxlKQogewotCV9tYWtlX2NhbGwoY2FsbGFibGUpOwotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0aHJlYWRfZG9uZSk7CisgICAgX21ha2VfY2FsbChjYWxsYWJsZSk7CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRocmVhZF9kb25lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfdGhyZWFkX3N0YXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZm47Ci0JaW50IHN1Y2Nlc3MgPSAxOworICAgIFB5T2JqZWN0ICpmbjsKKyAgICBpbnQgc3VjY2VzcyA9IDE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dGVzdF90aHJlYWRfc3RhdGUiLCAmZm4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dGVzdF90aHJlYWRfc3RhdGUiLCAmZm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlDYWxsYWJsZV9DaGVjayhmbikpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiclcycgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZSIsCi0JCQlmbi0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZm4pKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICInJXMnIG9iamVjdCBpcyBub3QgY2FsbGFibGUiLAorICAgICAgICAgICAgZm4tPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBFbnN1cmUgUHl0aG9uIGlzIHNldCB1cCBmb3IgdGhyZWFkaW5nICovCi0JUHlFdmFsX0luaXRUaHJlYWRzKCk7Ci0JdGhyZWFkX2RvbmUgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKHRocmVhZF9kb25lID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0aHJlYWRfZG9uZSwgMSk7CisgICAgLyogRW5zdXJlIFB5dGhvbiBpcyBzZXQgdXAgZm9yIHRocmVhZGluZyAqLworICAgIFB5RXZhbF9Jbml0VGhyZWFkcygpOworICAgIHRocmVhZF9kb25lID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmICh0aHJlYWRfZG9uZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2sodGhyZWFkX2RvbmUsIDEpOwogCi0JLyogU3RhcnQgYSBuZXcgdGhyZWFkIHdpdGggb3VyIGNhbGxiYWNrLiAqLwotCVB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoX21ha2VfY2FsbF9mcm9tX3RocmVhZCwgZm4pOwotCS8qIE1ha2UgdGhlIGNhbGxiYWNrIHdpdGggdGhlIHRocmVhZCBsb2NrIGhlbGQgYnkgdGhpcyB0aHJlYWQgKi8KLQlzdWNjZXNzICY9IF9tYWtlX2NhbGwoZm4pOwotCS8qIERvIGl0IGFsbCBhZ2FpbiwgYnV0IHRoaXMgdGltZSB3aXRoIHRoZSB0aHJlYWQtbG9jayByZWxlYXNlZCAqLwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzdWNjZXNzICY9IF9tYWtlX2NhbGwoZm4pOwotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0aHJlYWRfZG9uZSwgMSk7ICAvKiB3YWl0IGZvciB0aHJlYWQgdG8gZmluaXNoICovCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAvKiBTdGFydCBhIG5ldyB0aHJlYWQgd2l0aCBvdXIgY2FsbGJhY2suICovCisgICAgUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChfbWFrZV9jYWxsX2Zyb21fdGhyZWFkLCBmbik7CisgICAgLyogTWFrZSB0aGUgY2FsbGJhY2sgd2l0aCB0aGUgdGhyZWFkIGxvY2sgaGVsZCBieSB0aGlzIHRocmVhZCAqLworICAgIHN1Y2Nlc3MgJj0gX21ha2VfY2FsbChmbik7CisgICAgLyogRG8gaXQgYWxsIGFnYWluLCBidXQgdGhpcyB0aW1lIHdpdGggdGhlIHRocmVhZC1sb2NrIHJlbGVhc2VkICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHN1Y2Nlc3MgJj0gX21ha2VfY2FsbChmbik7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRocmVhZF9kb25lLCAxKTsgIC8qIHdhaXQgZm9yIHRocmVhZCB0byBmaW5pc2ggKi8KKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JLyogQW5kIG9uY2UgbW9yZSB3aXRoIGFuZCB3aXRob3V0IGEgdGhyZWFkCi0JICAgWFhYIC0gc2hvdWxkIHVzZSBhIGxvY2sgYW5kIHdvcmsgb3V0IGV4YWN0bHkgd2hhdCB3ZSBhcmUgdHJ5aW5nCi0JICAgdG8gdGVzdCA8d2luaz4KLQkqLwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKF9tYWtlX2NhbGxfZnJvbV90aHJlYWQsIGZuKTsKLQlzdWNjZXNzICY9IF9tYWtlX2NhbGwoZm4pOwotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0aHJlYWRfZG9uZSwgMSk7ICAvKiB3YWl0IGZvciB0aHJlYWQgdG8gZmluaXNoICovCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAvKiBBbmQgb25jZSBtb3JlIHdpdGggYW5kIHdpdGhvdXQgYSB0aHJlYWQKKyAgICAgICBYWFggLSBzaG91bGQgdXNlIGEgbG9jayBhbmQgd29yayBvdXQgZXhhY3RseSB3aGF0IHdlIGFyZSB0cnlpbmcKKyAgICAgICB0byB0ZXN0IDx3aW5rPgorICAgICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoX21ha2VfY2FsbF9mcm9tX3RocmVhZCwgZm4pOworICAgIHN1Y2Nlc3MgJj0gX21ha2VfY2FsbChmbik7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRocmVhZF9kb25lLCAxKTsgIC8qIHdhaXQgZm9yIHRocmVhZCB0byBmaW5pc2ggKi8KKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JLyogUmVsZWFzZSBsb2NrIHdlIGFjcXVpcmVkIGFib3ZlLiAgVGhpcyBpcyByZXF1aXJlZCBvbiBIUC1VWC4gKi8KLQlQeVRocmVhZF9yZWxlYXNlX2xvY2sodGhyZWFkX2RvbmUpOworICAgIC8qIFJlbGVhc2UgbG9jayB3ZSBhY3F1aXJlZCBhYm92ZS4gIFRoaXMgaXMgcmVxdWlyZWQgb24gSFAtVVguICovCisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRocmVhZF9kb25lKTsKIAotCVB5VGhyZWFkX2ZyZWVfbG9jayh0aHJlYWRfZG9uZSk7Ci0JaWYgKCFzdWNjZXNzKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeVRocmVhZF9mcmVlX2xvY2sodGhyZWFkX2RvbmUpOworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAjZW5kaWYKIApAQCAtODUyLDM0ICs4NTIsMzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQljaGFyICptc2c7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBjaGFyICptc2c7CiAKLSNkZWZpbmUgQ0hFQ0tfMV9GT1JNQVQoRk9STUFULCBUWVBFKSAJCQlcCi0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdChGT1JNQVQsIChUWVBFKTEpOwlcCi0JaWYgKHJlc3VsdCA9PSBOVUxMKQkJCQlcCi0JCXJldHVybiBOVUxMOwkJCQlcCi0JaWYgKHN0cmNtcChQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpLCAiMSIpKSB7CVwKLQkJbXNnID0gRk9STUFUICIgZmFpbGVkIGF0IDEiOwkJXAotCQlnb3RvIEZhaWw7CQkJCVwKLQl9CQkJCQkJXAotCVB5X0RFQ1JFRihyZXN1bHQpCisjZGVmaW5lIENIRUNLXzFfRk9STUFUKEZPUk1BVCwgVFlQRSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KEZPUk1BVCwgKFRZUEUpMSk7ICAgICAgXAorICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc3RyY21wKFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCksICIxIikpIHsgICAgICAgXAorICAgICAgICBtc2cgPSBGT1JNQVQgIiBmYWlsZWQgYXQgMSI7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gRmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFB5X0RFQ1JFRihyZXN1bHQpCiAKLQlDSEVDS18xX0ZPUk1BVCgiJWQiLCBpbnQpOwotCUNIRUNLXzFfRk9STUFUKCIlbGQiLCBsb25nKTsKLQkvKiBUaGUgeiB3aWR0aCBtb2RpZmllciB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuNS4gKi8KLQlDSEVDS18xX0ZPUk1BVCgiJXpkIiwgUHlfc3NpemVfdCk7CisgICAgQ0hFQ0tfMV9GT1JNQVQoIiVkIiwgaW50KTsKKyAgICBDSEVDS18xX0ZPUk1BVCgiJWxkIiwgbG9uZyk7CisgICAgLyogVGhlIHogd2lkdGggbW9kaWZpZXIgd2FzIGFkZGVkIGluIFB5dGhvbiAyLjUuICovCisgICAgQ0hFQ0tfMV9GT1JNQVQoIiV6ZCIsIFB5X3NzaXplX3QpOwogCi0JLyogVGhlIHUgdHlwZSBjb2RlIHdhcyBhZGRlZCBpbiBQeXRob24gMi41LiAqLwotCUNIRUNLXzFfRk9STUFUKCIldSIsIHVuc2lnbmVkIGludCk7Ci0JQ0hFQ0tfMV9GT1JNQVQoIiVsdSIsIHVuc2lnbmVkIGxvbmcpOwotCUNIRUNLXzFfRk9STUFUKCIlenUiLCBzaXplX3QpOworICAgIC8qIFRoZSB1IHR5cGUgY29kZSB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuNS4gKi8KKyAgICBDSEVDS18xX0ZPUk1BVCgiJXUiLCB1bnNpZ25lZCBpbnQpOworICAgIENIRUNLXzFfRk9STUFUKCIlbHUiLCB1bnNpZ25lZCBsb25nKTsKKyAgICBDSEVDS18xX0ZPUk1BVCgiJXp1Iiwgc2l6ZV90KTsKIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogCiAgRmFpbDoKLSAJUHlfWERFQ1JFRihyZXN1bHQpOwotCXJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9zdHJpbmdfZnJvbV9mb3JtYXQiLCBtc2cpOworICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfc3RyaW5nX2Zyb21fZm9ybWF0IiwgbXNnKTsKIAogI3VuZGVmIENIRUNLXzFfRk9STUFUCiB9CkBAIC04ODgsMjY3ICs4ODgsMjY3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVzdF93aXRoX2RvY3N0cmluZyhQeU9iamVjdCAqc2VsZikKIHsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogLyogVG8gdGVzdCB0aGUgZm9ybWF0IG9mIHRyYWNlYmFja3MgYXMgcHJpbnRlZCBvdXQuICovCiBzdGF0aWMgUHlPYmplY3QgKgogdHJhY2ViYWNrX3ByaW50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZmlsZTsKLQlQeU9iamVjdCAqdHJhY2ViYWNrOwotCWludCByZXN1bHQ7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTzp0cmFjZWJhY2tfcHJpbnQiLAotCQkJCSZ0cmFjZWJhY2ssICZmaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCQotCXJlc3VsdCA9IFB5VHJhY2VCYWNrX1ByaW50KHRyYWNlYmFjaywgZmlsZSk7Ci0JaWYgKHJlc3VsdCA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X1JFVFVSTl9OT05FOworICAgIFB5T2JqZWN0ICpmaWxlOworICAgIFB5T2JqZWN0ICp0cmFjZWJhY2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT086dHJhY2ViYWNrX3ByaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2ViYWNrLCAmZmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmVzdWx0ID0gUHlUcmFjZUJhY2tfUHJpbnQodHJhY2ViYWNrLCBmaWxlKTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUZXN0TWV0aG9kc1tdID0gewotCXsicmFpc2VfZXhjZXB0aW9uIiwJcmFpc2VfZXhjZXB0aW9uLAkJIE1FVEhfVkFSQVJHU30sCi0JeyJ0ZXN0X2NvbmZpZyIsCQkoUHlDRnVuY3Rpb24pdGVzdF9jb25maWcsCSBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X2xpc3RfYXBpIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfbGlzdF9hcGksCSBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X2RpY3RfaXRlcmF0aW9uIiwJKFB5Q0Z1bmN0aW9uKXRlc3RfZGljdF9pdGVyYXRpb24sTUVUSF9OT0FSR1N9LAotCXsidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2UiLAkoUHlDRnVuY3Rpb24pdGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2UsTUVUSF9OT0FSR1N9LAotCXsidGVzdF9sb25nX2FwaSIsCShQeUNGdW5jdGlvbil0ZXN0X2xvbmdfYXBpLAkgTUVUSF9OT0FSR1N9LAotCXsidGVzdF9sb25nX251bWJpdHMiLAkoUHlDRnVuY3Rpb24pdGVzdF9sb25nX251bWJpdHMsCSBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X2tfY29kZSIsCQkoUHlDRnVuY3Rpb24pdGVzdF9rX2NvZGUsCSBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X2VtcHR5X2FyZ3BhcnNlIiwgKFB5Q0Z1bmN0aW9uKXRlc3RfZW1wdHlfYXJncGFyc2UsTUVUSF9OT0FSR1N9LAotCXsidGVzdF9udWxsX3N0cmluZ3MiLAkoUHlDRnVuY3Rpb24pdGVzdF9udWxsX3N0cmluZ3MsCSBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCIsIChQeUNGdW5jdGlvbil0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCwgTUVUSF9OT0FSR1N9LAotCXsidGVzdF93aXRoX2RvY3N0cmluZyIsIChQeUNGdW5jdGlvbil0ZXN0X3dpdGhfZG9jc3RyaW5nLCBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJUaGlzIGlzIGEgcHJldHR5IG5vcm1hbCBkb2NzdHJpbmcuIil9LAorICAgIHsicmFpc2VfZXhjZXB0aW9uIiwgICAgICAgICByYWlzZV9leGNlcHRpb24sICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidGVzdF9jb25maWciLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9jb25maWcsICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X2xpc3RfYXBpIiwgICAgICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2xpc3RfYXBpLCAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3RfZGljdF9pdGVyYXRpb24iLCAgICAgKFB5Q0Z1bmN0aW9uKXRlc3RfZGljdF9pdGVyYXRpb24sTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9sYXp5X2hhc2hfaW5oZXJpdGFuY2UiLCAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2xhenlfaGFzaF9pbmhlcml0YW5jZSxNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X2xvbmdfYXBpIiwgICAgICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2xvbmdfYXBpLCAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3RfbG9uZ19udW1iaXRzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXRlc3RfbG9uZ19udW1iaXRzLCAgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9rX2NvZGUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9rX2NvZGUsICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X2VtcHR5X2FyZ3BhcnNlIiwgKFB5Q0Z1bmN0aW9uKXRlc3RfZW1wdHlfYXJncGFyc2UsTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF9udWxsX3N0cmluZ3MiLCAgICAgICAoUHlDRnVuY3Rpb24pdGVzdF9udWxsX3N0cmluZ3MsICBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCIsIChQeUNGdW5jdGlvbil0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCwgTUVUSF9OT0FSR1N9LAorICAgIHsidGVzdF93aXRoX2RvY3N0cmluZyIsIChQeUNGdW5jdGlvbil0ZXN0X3dpdGhfZG9jc3RyaW5nLCBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJUaGlzIGlzIGEgcHJldHR5IG5vcm1hbCBkb2NzdHJpbmcuIil9LAogCi0JeyJnZXRhcmdzX3R1cGxlIiwJZ2V0YXJnc190dXBsZSwJCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3Nfa2V5d29yZHMiLCAoUHlDRnVuY3Rpb24pZ2V0YXJnc19rZXl3b3JkcywgCi0JICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCi0JeyJnZXRhcmdzX2IiLAkJZ2V0YXJnc19iLAkJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19CIiwJCWdldGFyZ3NfQiwJCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfSCIsCQlnZXRhcmdzX0gsCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX0kiLAkJZ2V0YXJnc19JLAkJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19rIiwJCWdldGFyZ3NfaywJCQkgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGFyZ3NfaSIsCQlnZXRhcmdzX2ksCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX2wiLAkJZ2V0YXJnc19sLAkJCSBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0YXJnc19uIiwJCWdldGFyZ3NfbiwgCQkJIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX3R1cGxlIiwgICAgICAgICAgIGdldGFyZ3NfdHVwbGUsICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX2tleXdvcmRzIiwgKFB5Q0Z1bmN0aW9uKWdldGFyZ3Nfa2V5d29yZHMsCisgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCisgICAgeyJnZXRhcmdzX2IiLCAgICAgICAgICAgICAgIGdldGFyZ3NfYiwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX0IiLCAgICAgICAgICAgICAgIGdldGFyZ3NfQiwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX0giLCAgICAgICAgICAgICAgIGdldGFyZ3NfSCwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX0kiLCAgICAgICAgICAgICAgIGdldGFyZ3NfSSwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX2siLCAgICAgICAgICAgICAgIGdldGFyZ3NfaywgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX2kiLCAgICAgICAgICAgICAgIGdldGFyZ3NfaSwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX2wiLCAgICAgICAgICAgICAgIGdldGFyZ3NfbCwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRhcmdzX24iLCAgICAgICAgICAgICAgIGdldGFyZ3NfbiwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQl7ImdldGFyZ3NfTCIsCQlnZXRhcmdzX0wsCQkJIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRhcmdzX0siLAkJZ2V0YXJnc19LLAkJCSBNRVRIX1ZBUkFSR1N9LAotCXsidGVzdF9sb25nbG9uZ19hcGkiLAl0ZXN0X2xvbmdsb25nX2FwaSwJCSBNRVRIX05PQVJHU30sCi0JeyJ0ZXN0X0xfY29kZSIsCQkoUHlDRnVuY3Rpb24pdGVzdF9MX2NvZGUsCSBNRVRIX05PQVJHU30sCi0JeyJjb2RlY19pbmNyZW1lbnRhbGVuY29kZXIiLAotCSAoUHlDRnVuY3Rpb24pY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyLAkgTUVUSF9WQVJBUkdTfSwKLQl7ImNvZGVjX2luY3JlbWVudGFsZGVjb2RlciIsCi0JIChQeUNGdW5jdGlvbiljb2RlY19pbmNyZW1lbnRhbGRlY29kZXIsCSBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc19MIiwgICAgICAgICAgICAgICBnZXRhcmdzX0wsICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0YXJnc19LIiwgICAgICAgICAgICAgICBnZXRhcmdzX0ssICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsidGVzdF9sb25nbG9uZ19hcGkiLCAgICAgICB0ZXN0X2xvbmdsb25nX2FwaSwgICAgICAgICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJ0ZXN0X0xfY29kZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0ZXN0X0xfY29kZSwgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImNvZGVjX2luY3JlbWVudGFsZW5jb2RlciIsCisgICAgIChQeUNGdW5jdGlvbiljb2RlY19pbmNyZW1lbnRhbGVuY29kZXIsICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNvZGVjX2luY3JlbWVudGFsZGVjb2RlciIsCisgICAgIChQeUNGdW5jdGlvbiljb2RlY19pbmNyZW1lbnRhbGRlY29kZXIsICAgICAgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQl7InRlc3RfdV9jb2RlIiwJCShQeUNGdW5jdGlvbil0ZXN0X3VfY29kZSwJIE1FVEhfTk9BUkdTfSwKKyAgICB7InRlc3RfdV9jb2RlIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlc3RfdV9jb2RlLCAgICAgICAgTUVUSF9OT0FSR1N9LAogI2VuZGlmCiAjaWZkZWYgV0lUSF9USFJFQUQKLQl7Il90ZXN0X3RocmVhZF9zdGF0ZSIsICB0ZXN0X3RocmVhZF9zdGF0ZSwgCQkgTUVUSF9WQVJBUkdTfSwKKyAgICB7Il90ZXN0X3RocmVhZF9zdGF0ZSIsICB0ZXN0X3RocmVhZF9zdGF0ZSwgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgotCXsidHJhY2ViYWNrX3ByaW50IiwgdHJhY2ViYWNrX3ByaW50LCAJICAgICAgICAgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwgTlVMTH0gLyogc2VudGluZWwgKi8KKyAgICB7InRyYWNlYmFja19wcmludCIsIHRyYWNlYmFja19wcmludCwgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCiB9OwogCiAjZGVmaW5lIEFkZFN5bShkLCBuLCBmLCB2KSB7UHlPYmplY3QgKm8gPSBmKHYpOyBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuLCBvKTsgUHlfREVDUkVGKG8pO30KIAogdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgYm9vbF9tZW1iZXI7Ci0JY2hhciBieXRlX21lbWJlcjsKLQl1bnNpZ25lZCBjaGFyIHVieXRlX21lbWJlcjsKLQlzaG9ydCBzaG9ydF9tZW1iZXI7Ci0JdW5zaWduZWQgc2hvcnQgdXNob3J0X21lbWJlcjsKLQlpbnQgaW50X21lbWJlcjsKLQl1bnNpZ25lZCBpbnQgdWludF9tZW1iZXI7Ci0JbG9uZyBsb25nX21lbWJlcjsKLQl1bnNpZ25lZCBsb25nIHVsb25nX21lbWJlcjsKLQlmbG9hdCBmbG9hdF9tZW1iZXI7Ci0JZG91YmxlIGRvdWJsZV9tZW1iZXI7Ci0JY2hhciBpbnBsYWNlX21lbWJlcls2XTsKKyAgICBjaGFyIGJvb2xfbWVtYmVyOworICAgIGNoYXIgYnl0ZV9tZW1iZXI7CisgICAgdW5zaWduZWQgY2hhciB1Ynl0ZV9tZW1iZXI7CisgICAgc2hvcnQgc2hvcnRfbWVtYmVyOworICAgIHVuc2lnbmVkIHNob3J0IHVzaG9ydF9tZW1iZXI7CisgICAgaW50IGludF9tZW1iZXI7CisgICAgdW5zaWduZWQgaW50IHVpbnRfbWVtYmVyOworICAgIGxvbmcgbG9uZ19tZW1iZXI7CisgICAgdW5zaWduZWQgbG9uZyB1bG9uZ19tZW1iZXI7CisgICAgZmxvYXQgZmxvYXRfbWVtYmVyOworICAgIGRvdWJsZSBkb3VibGVfbWVtYmVyOworICAgIGNoYXIgaW5wbGFjZV9tZW1iZXJbNl07CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQlQWV9MT05HX0xPTkcgbG9uZ2xvbmdfbWVtYmVyOwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB1bG9uZ2xvbmdfbWVtYmVyOworICAgIFBZX0xPTkdfTE9ORyBsb25nbG9uZ19tZW1iZXI7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHVsb25nbG9uZ19tZW1iZXI7CiAjZW5kaWYKIH0gYWxsX3N0cnVjdG1lbWJlcnM7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0JYWxsX3N0cnVjdG1lbWJlcnMgc3RydWN0bWVtYmVyczsKKyAgICBhbGxfc3RydWN0bWVtYmVycyBzdHJ1Y3RtZW1iZXJzOwogfSB0ZXN0X3N0cnVjdG1lbWJlcnM7CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZW1iZXJEZWYgdGVzdF9tZW1iZXJzW10gPSB7Ci0JeyJUX0JPT0wiLCBUX0JPT0wsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5ib29sX21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9CWVRFIiwgVF9CWVRFLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuYnl0ZV9tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfVUJZVEUiLCBUX1VCWVRFLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMudWJ5dGVfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX1NIT1JUIiwgVF9TSE9SVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnNob3J0X21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9VU0hPUlQiLCBUX1VTSE9SVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVzaG9ydF9tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfSU5UIiwgVF9JTlQsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5pbnRfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX1VJTlQiLCBUX1VJTlQsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51aW50X21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9MT05HIiwgVF9MT05HLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMubG9uZ19tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfVUxPTkciLCBUX1VMT05HLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMudWxvbmdfbWVtYmVyKSwgMCwgTlVMTH0sCi0JeyJUX0ZMT0FUIiwgVF9GTE9BVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmZsb2F0X21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9ET1VCTEUiLCBUX0RPVUJMRSwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmRvdWJsZV9tZW1iZXIpLCAwLCBOVUxMfSwKLQl7IlRfU1RSSU5HX0lOUExBQ0UiLCBUX1NUUklOR19JTlBMQUNFLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuaW5wbGFjZV9tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfQk9PTCIsIFRfQk9PTCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmJvb2xfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX0JZVEUiLCBUX0JZVEUsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5ieXRlX21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9VQllURSIsIFRfVUJZVEUsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51Ynl0ZV9tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfU0hPUlQiLCBUX1NIT1JULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuc2hvcnRfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX1VTSE9SVCIsIFRfVVNIT1JULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMudXNob3J0X21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9JTlQiLCBUX0lOVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmludF9tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfVUlOVCIsIFRfVUlOVCwgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVpbnRfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX0xPTkciLCBUX0xPTkcsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5sb25nX21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9VTE9ORyIsIFRfVUxPTkcsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy51bG9uZ19tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfRkxPQVQiLCBUX0ZMT0FULCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuZmxvYXRfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX0RPVUJMRSIsIFRfRE9VQkxFLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMuZG91YmxlX21lbWJlciksIDAsIE5VTEx9LAorICAgIHsiVF9TVFJJTkdfSU5QTEFDRSIsIFRfU1RSSU5HX0lOUExBQ0UsIG9mZnNldG9mKHRlc3Rfc3RydWN0bWVtYmVycywgc3RydWN0bWVtYmVycy5pbnBsYWNlX21lbWJlciksIDAsIE5VTEx9LAogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JeyJUX0xPTkdMT05HIiwgVF9MT05HTE9ORywgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLmxvbmdsb25nX21lbWJlciksIDAsIE5VTEx9LAotCXsiVF9VTE9OR0xPTkciLCBUX1VMT05HTE9ORywgb2Zmc2V0b2YodGVzdF9zdHJ1Y3RtZW1iZXJzLCBzdHJ1Y3RtZW1iZXJzLnVsb25nbG9uZ19tZW1iZXIpLCAwLCBOVUxMfSwKKyAgICB7IlRfTE9OR0xPTkciLCBUX0xPTkdMT05HLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMubG9uZ2xvbmdfbWVtYmVyKSwgMCwgTlVMTH0sCisgICAgeyJUX1VMT05HTE9ORyIsIFRfVUxPTkdMT05HLCBvZmZzZXRvZih0ZXN0X3N0cnVjdG1lbWJlcnMsIHN0cnVjdG1lbWJlcnMudWxvbmdsb25nX21lbWJlciksIDAsIE5VTEx9LAogI2VuZGlmCi0Je05VTEx9CisgICAge05VTEx9CiB9OwogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXN0X3N0cnVjdG1lbWJlcnNfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7Ci0JCSJUX0JPT0wiLCAiVF9CWVRFIiwgIlRfVUJZVEUiLCAiVF9TSE9SVCIsICJUX1VTSE9SVCIsCi0JCSJUX0lOVCIsICJUX1VJTlQiLCAiVF9MT05HIiwgIlRfVUxPTkciLAotCQkiVF9GTE9BVCIsICJUX0RPVUJMRSIsICJUX1NUUklOR19JTlBMQUNFIiwKLSNpZmRlZiBIQVZFX0xPTkdfTE9ORwkKLQkJIlRfTE9OR0xPTkciLCAiVF9VTE9OR0xPTkciLAotI2VuZGlmCi0JCU5VTEx9OwotCXN0YXRpYyBjaGFyICpmbXQgPSAifGJiQmhIaUlsa2ZkcyMiCisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7CisgICAgICAgICJUX0JPT0wiLCAiVF9CWVRFIiwgIlRfVUJZVEUiLCAiVF9TSE9SVCIsICJUX1VTSE9SVCIsCisgICAgICAgICJUX0lOVCIsICJUX1VJTlQiLCAiVF9MT05HIiwgIlRfVUxPTkciLAorICAgICAgICAiVF9GTE9BVCIsICJUX0RPVUJMRSIsICJUX1NUUklOR19JTlBMQUNFIiwKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQkiTEsiCisgICAgICAgICJUX0xPTkdMT05HIiwgIlRfVUxPTkdMT05HIiwKICNlbmRpZgotCQk7Ci0JdGVzdF9zdHJ1Y3RtZW1iZXJzICpvYjsKLQljb25zdCBjaGFyICpzID0gTlVMTDsKLQlQeV9zc2l6ZV90IHN0cmluZ19sZW4gPSAwOwotCW9iID0gUHlPYmplY3RfTmV3KHRlc3Rfc3RydWN0bWVtYmVycywgdHlwZSk7Ci0JaWYgKG9iID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1lbXNldCgmb2ItPnN0cnVjdG1lbWJlcnMsIDAsIHNpemVvZihhbGxfc3RydWN0bWVtYmVycykpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgZm10LCBrZXl3b3JkcywKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy5ib29sX21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy5ieXRlX21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy51Ynl0ZV9tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMuc2hvcnRfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLnVzaG9ydF9tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMuaW50X21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy51aW50X21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy5sb25nX21lbWJlciwKLQkJCQkJICZvYi0+c3RydWN0bWVtYmVycy51bG9uZ19tZW1iZXIsCi0JCQkJCSAmb2ItPnN0cnVjdG1lbWJlcnMuZmxvYXRfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLmRvdWJsZV9tZW1iZXIsCi0JCQkJCSAmcywgJnN0cmluZ19sZW4KKyAgICAgICAgTlVMTH07CisgICAgc3RhdGljIGNoYXIgKmZtdCA9ICJ8YmJCaEhpSWxrZmRzIyIKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQkJCQkgLCAmb2ItPnN0cnVjdG1lbWJlcnMubG9uZ2xvbmdfbWVtYmVyLAotCQkJCQkgJm9iLT5zdHJ1Y3RtZW1iZXJzLnVsb25nbG9uZ19tZW1iZXIKKyAgICAgICAgIkxLIgogI2VuZGlmCi0JCSkpIHsKLQkJUHlfREVDUkVGKG9iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzICE9IE5VTEwpIHsKLQkJaWYgKHN0cmluZ19sZW4gPiA1KSB7Ci0JCQlQeV9ERUNSRUYob2IpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzdHJpbmcgdG9vIGxvbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXN0cmNweShvYi0+c3RydWN0bWVtYmVycy5pbnBsYWNlX21lbWJlciwgcyk7Ci0JfQotCWVsc2UgewotCQlzdHJjcHkob2ItPnN0cnVjdG1lbWJlcnMuaW5wbGFjZV9tZW1iZXIsICIiKTsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW9iOworICAgICAgICA7CisgICAgdGVzdF9zdHJ1Y3RtZW1iZXJzICpvYjsKKyAgICBjb25zdCBjaGFyICpzID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IHN0cmluZ19sZW4gPSAwOworICAgIG9iID0gUHlPYmplY3RfTmV3KHRlc3Rfc3RydWN0bWVtYmVycywgdHlwZSk7CisgICAgaWYgKG9iID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmb2ItPnN0cnVjdG1lbWJlcnMsIDAsIHNpemVvZihhbGxfc3RydWN0bWVtYmVycykpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgZm10LCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMuYm9vbF9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLmJ5dGVfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy51Ynl0ZV9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLnNob3J0X21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMudXNob3J0X21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMuaW50X21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMudWludF9tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLmxvbmdfbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYi0+c3RydWN0bWVtYmVycy51bG9uZ19tZW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iLT5zdHJ1Y3RtZW1iZXJzLmZsb2F0X21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMuZG91YmxlX21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcywgJnN0cmluZ19sZW4KKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJm9iLT5zdHJ1Y3RtZW1iZXJzLmxvbmdsb25nX21lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2ItPnN0cnVjdG1lbWJlcnMudWxvbmdsb25nX21lbWJlcgorI2VuZGlmCisgICAgICAgICkpIHsKKyAgICAgICAgUHlfREVDUkVGKG9iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHN0cmluZ19sZW4gPiA1KSB7CisgICAgICAgICAgICBQeV9ERUNSRUYob2IpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzdHJpbmcgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0cmNweShvYi0+c3RydWN0bWVtYmVycy5pbnBsYWNlX21lbWJlciwgcyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdHJjcHkob2ItPnN0cnVjdG1lbWJlcnMuaW5wbGFjZV9tZW1iZXIsICIiKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9iOwogfQogCiBzdGF0aWMgdm9pZAogdGVzdF9zdHJ1Y3RtZW1iZXJzX2ZyZWUoUHlPYmplY3QgKm9iKQogewotCVB5T2JqZWN0X0ZSRUUob2IpOworICAgIFB5T2JqZWN0X0ZSRUUob2IpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHRlc3Rfc3RydWN0bWVtYmVyc1R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInRlc3Rfc3RydWN0bWVtYmVyc1R5cGUiLAotCXNpemVvZih0ZXN0X3N0cnVjdG1lbWJlcnMpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCXRlc3Rfc3RydWN0bWVtYmVyc19mcmVlLAkvKiBkZXN0cnVjdG9yIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCTAsCQkJCS8qIHRwX2ZsYWdzICovCi0JIlR5cGUgY29udGFpbmluZyBhbGwgc3RydWN0bWVtYmVyIHR5cGVzIiwKLQkwLAkJCQkvKiB0cmF2ZXJzZXByb2MgdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JdGVzdF9tZW1iZXJzLAkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAotCTAsCi0JMCwKLQkwLAotCTAsCi0JMCwKLQkwLAotCTAsCi0JdGVzdF9zdHJ1Y3RtZW1iZXJzX25ldywJICAgICAgIAkvKiB0cF9uZXcgKi8KKyAgICAidGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSIsCisgICAgc2l6ZW9mKHRlc3Rfc3RydWN0bWVtYmVycyksICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICB0ZXN0X3N0cnVjdG1lbWJlcnNfZnJlZSwgICAgICAgICAgICAvKiBkZXN0cnVjdG9yIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICJUeXBlIGNvbnRhaW5pbmcgYWxsIHN0cnVjdG1lbWJlciB0eXBlcyIsCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhdmVyc2Vwcm9jIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHRlc3RfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgdGVzdF9zdHJ1Y3RtZW1iZXJzX25ldywgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X3Rlc3RjYXBpKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX3Rlc3RjYXBpIiwgVGVzdE1ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX3Rlc3RjYXBpIiwgVGVzdE1ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVB5X1RZUEUoJl9IYXNoSW5oZXJpdGFuY2VUZXN0ZXJfVHlwZSk9JlB5VHlwZV9UeXBlOworICAgIFB5X1RZUEUoJl9IYXNoSW5oZXJpdGFuY2VUZXN0ZXJfVHlwZSk9JlB5VHlwZV9UeXBlOwogCi0JUHlfVFlQRSgmdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSk9JlB5VHlwZV9UeXBlOwotCVB5X0lOQ1JFRigmdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSk7Ci0JLyogZG9uJ3QgdXNlIGEgbmFtZSBzdGFydGluZyB3aXRoICJ0ZXN0Iiwgc2luY2Ugd2UgZG9uJ3Qgd2FudAotCSAgIHRlc3RfY2FwaSB0byBhdXRvbWF0aWNhbGx5IGNhbGwgdGhpcyAqLwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3Rlc3Rfc3RydWN0bWVtYmVyc1R5cGUiLCAoUHlPYmplY3QgKikmdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSk7CisgICAgUHlfVFlQRSgmdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSk9JlB5VHlwZV9UeXBlOworICAgIFB5X0lOQ1JFRigmdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSk7CisgICAgLyogZG9uJ3QgdXNlIGEgbmFtZSBzdGFydGluZyB3aXRoICJ0ZXN0Iiwgc2luY2Ugd2UgZG9uJ3Qgd2FudAorICAgICAgIHRlc3RfY2FwaSB0byBhdXRvbWF0aWNhbGx5IGNhbGwgdGhpcyAqLworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiX3Rlc3Rfc3RydWN0bWVtYmVyc1R5cGUiLCAoUHlPYmplY3QgKikmdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSk7CiAKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNIQVJfTUFYIiwgUHlJbnRfRnJvbUxvbmcoQ0hBUl9NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNIQVJfTUlOIiwgUHlJbnRfRnJvbUxvbmcoQ0hBUl9NSU4pKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVDSEFSX01BWCIsIFB5SW50X0Zyb21Mb25nKFVDSEFSX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0hSVF9NQVgiLCBQeUludF9Gcm9tTG9uZyhTSFJUX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0hSVF9NSU4iLCBQeUludF9Gcm9tTG9uZyhTSFJUX01JTikpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVVNIUlRfTUFYIiwgUHlJbnRfRnJvbUxvbmcoVVNIUlRfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJTlRfTUFYIiwgIFB5TG9uZ19Gcm9tTG9uZyhJTlRfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJTlRfTUlOIiwgIFB5TG9uZ19Gcm9tTG9uZyhJTlRfTUlOKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVSU5UX01BWCIsICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhVSU5UX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTE9OR19NQVgiLCBQeUludF9Gcm9tTG9uZyhMT05HX01BWCkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTE9OR19NSU4iLCBQeUludF9Gcm9tTG9uZyhMT05HX01JTikpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUxPTkdfTUFYIiwgUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoVUxPTkdfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGTFRfTUFYIiwgUHlGbG9hdF9Gcm9tRG91YmxlKEZMVF9NQVgpKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZMVF9NSU4iLCBQeUZsb2F0X0Zyb21Eb3VibGUoRkxUX01JTikpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiREJMX01BWCIsIFB5RmxvYXRfRnJvbURvdWJsZShEQkxfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEQkxfTUlOIiwgUHlGbG9hdF9Gcm9tRG91YmxlKERCTF9NSU4pKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxMT05HX01BWCIsIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTExPTkdfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMTE9OR19NSU4iLCBQeUxvbmdfRnJvbUxvbmdMb25nKFBZX0xMT05HX01JTikpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUxMT05HX01BWCIsIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyhQWV9VTExPTkdfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQWV9TU0laRV9UX01BWCIsIFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUFYKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQWV9TU0laRV9UX01JTiIsIFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUlOKSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSVpFT0ZfUFlHQ19IRUFEIiwgUHlJbnRfRnJvbVNzaXplX3Qoc2l6ZW9mKFB5R0NfSGVhZCkpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNIQVJfTUFYIiwgUHlJbnRfRnJvbUxvbmcoQ0hBUl9NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNIQVJfTUlOIiwgUHlJbnRfRnJvbUxvbmcoQ0hBUl9NSU4pKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVDSEFSX01BWCIsIFB5SW50X0Zyb21Mb25nKFVDSEFSX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0hSVF9NQVgiLCBQeUludF9Gcm9tTG9uZyhTSFJUX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0hSVF9NSU4iLCBQeUludF9Gcm9tTG9uZyhTSFJUX01JTikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVVNIUlRfTUFYIiwgUHlJbnRfRnJvbUxvbmcoVVNIUlRfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJTlRfTUFYIiwgIFB5TG9uZ19Gcm9tTG9uZyhJTlRfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJTlRfTUlOIiwgIFB5TG9uZ19Gcm9tTG9uZyhJTlRfTUlOKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVSU5UX01BWCIsICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhVSU5UX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTE9OR19NQVgiLCBQeUludF9Gcm9tTG9uZyhMT05HX01BWCkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTE9OR19NSU4iLCBQeUludF9Gcm9tTG9uZyhMT05HX01JTikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUxPTkdfTUFYIiwgUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoVUxPTkdfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGTFRfTUFYIiwgUHlGbG9hdF9Gcm9tRG91YmxlKEZMVF9NQVgpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZMVF9NSU4iLCBQeUZsb2F0X0Zyb21Eb3VibGUoRkxUX01JTikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiREJMX01BWCIsIFB5RmxvYXRfRnJvbURvdWJsZShEQkxfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEQkxfTUlOIiwgUHlGbG9hdF9Gcm9tRG91YmxlKERCTF9NSU4pKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxMT05HX01BWCIsIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTExPTkdfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMTE9OR19NSU4iLCBQeUxvbmdfRnJvbUxvbmdMb25nKFBZX0xMT05HX01JTikpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVUxMT05HX01BWCIsIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyhQWV9VTExPTkdfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQWV9TU0laRV9UX01BWCIsIFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUFYKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQWV9TU0laRV9UX01JTiIsIFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUlOKSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTSVpFT0ZfUFlHQ19IRUFEIiwgUHlJbnRfRnJvbVNzaXplX3Qoc2l6ZW9mKFB5R0NfSGVhZCkpKTsKIAotCVRlc3RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiX3Rlc3RjYXBpLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JUHlfSU5DUkVGKFRlc3RFcnJvcik7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFRlc3RFcnJvcik7CisgICAgVGVzdEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfdGVzdGNhcGkuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBQeV9JTkNSRUYoVGVzdEVycm9yKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgVGVzdEVycm9yKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3RraW50ZXIuYyBiL01vZHVsZXMvX3RraW50ZXIuYwppbmRleCA4MzUwMWJmLi5iODkyOWI2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190a2ludGVyLmMKKysrIGIvTW9kdWxlcy9fdGtpbnRlci5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBUQ0wvVEsgVkVSU0lPTiBJTkZPOgogCi0JT25seSBUY2wvVGsgOC4yIGFuZCBsYXRlciBhcmUgc3VwcG9ydGVkLiAgT2xkZXIgdmVyc2lvbnMgYXJlIG5vdAotCXN1cHBvcnRlZC4gIChVc2UgUHl0aG9uIDIuMiBpZiB5b3UgY2Fubm90IHVwZ3JhZGUgeW91ciBUY2wvVGsKLQlsaWJyYXJpZXMuKQorICAgIE9ubHkgVGNsL1RrIDguMiBhbmQgbGF0ZXIgYXJlIHN1cHBvcnRlZC4gIE9sZGVyIHZlcnNpb25zIGFyZSBub3QKKyAgICBzdXBwb3J0ZWQuICAoVXNlIFB5dGhvbiAyLjIgaWYgeW91IGNhbm5vdCB1cGdyYWRlIHlvdXIgVGNsL1RrCisgICAgbGlicmFyaWVzLikKICovCiAKIC8qIFhYWCBGdXJ0aGVyIHNwZWVkLXVwIGlkZWFzLCBpbnZvbHZpbmcgVGNsIDguMCBmZWF0dXJlczoKQEAgLTgzLDggKzgzLDggQEAKIC8qIFVuaWNvZGUgY29udmVyc2lvbiBhc3N1bWVzIHRoYXQgVGNsX1VuaUNoYXIgaXMgdHdvIGJ5dGVzLgogICAgV2UgY2Fubm90IHRlc3QgdGhpcyBkaXJlY3RseSwgc28gd2UgdGVzdCBVVEYtOCBzaXplIGluc3RlYWQsCiAgICBleHBlY3RpbmcgdGhhdCBUQ0xfVVRGX01BWCBpcyBjaGFuZ2VkIGlmIFRjbCBldmVyIHN1cHBvcnRzCi0gICBlaXRoZXIgVVRGLTE2IG9yIFVDUy00LiAgCi0gICBSZWRoYXQgOCBzZXRzIFRDTF9VVEZfTUFYIHRvIDYsIGFuZCB1c2VzIHdjaGFyX3QgZm9yIAorICAgZWl0aGVyIFVURi0xNiBvciBVQ1MtNC4KKyAgIFJlZGhhdCA4IHNldHMgVENMX1VURl9NQVggdG8gNiwgYW5kIHVzZXMgd2NoYXJfdCBmb3IKICAgIFRjbF9VbmljaGFyLiBUaGlzIGlzIGFsc28gb2sgYXMgbG9uZyBhcyBQeXRob24gdXNlcyBVQ1MtNCwKICAgIGFzIHdlbGwuCiAqLwpAQCAtMTk3LDMyICsxOTcsMzIgQEAKICNlbmRpZgogCiAjZGVmaW5lIEVOVEVSX1RDTCBcCi0JeyBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOyBQeV9CRUdJTl9BTExPV19USFJFQURTIFwKLQkgICAgaWYodGNsX2xvY2spUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRjbF9sb2NrLCAxKTsgdGNsX3RzdGF0ZSA9IHRzdGF0ZTsKKyAgICB7IFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7IFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgXAorICAgICAgICBpZih0Y2xfbG9jaylQeVRocmVhZF9hY3F1aXJlX2xvY2sodGNsX2xvY2ssIDEpOyB0Y2xfdHN0YXRlID0gdHN0YXRlOwogCiAjZGVmaW5lIExFQVZFX1RDTCBcCiAgICAgdGNsX3RzdGF0ZSA9IE5VTEw7IGlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7IFB5X0VORF9BTExPV19USFJFQURTfQogCiAjZGVmaW5lIEVOVEVSX09WRVJMQVAgXAotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAogI2RlZmluZSBMRUFWRV9PVkVSTEFQX1RDTCBcCi0JdGNsX3RzdGF0ZSA9IE5VTEw7IGlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7IH0KKyAgICB0Y2xfdHN0YXRlID0gTlVMTDsgaWYodGNsX2xvY2spUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRjbF9sb2NrKTsgfQogCiAjZGVmaW5lIEVOVEVSX1BZVEhPTiBcCi0JeyBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSB0Y2xfdHN0YXRlOyB0Y2xfdHN0YXRlID0gTlVMTDsgXAotCSAgICBpZih0Y2xfbG9jaylQeVRocmVhZF9yZWxlYXNlX2xvY2sodGNsX2xvY2spOyBQeUV2YWxfUmVzdG9yZVRocmVhZCgodHN0YXRlKSk7IH0KKyAgICB7IFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IHRjbF90c3RhdGU7IHRjbF90c3RhdGUgPSBOVUxMOyBcCisgICAgICAgIGlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7IFB5RXZhbF9SZXN0b3JlVGhyZWFkKCh0c3RhdGUpKTsgfQogCiAjZGVmaW5lIExFQVZFX1BZVEhPTiBcCi0JeyBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOyBcCi0JICAgIGlmKHRjbF9sb2NrKVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0Y2xfbG9jaywgMSk7IHRjbF90c3RhdGUgPSB0c3RhdGU7IH0KKyAgICB7IFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7IFwKKyAgICAgICAgaWYodGNsX2xvY2spUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRjbF9sb2NrLCAxKTsgdGNsX3RzdGF0ZSA9IHRzdGF0ZTsgfQogCiAjZGVmaW5lIENIRUNLX1RDTF9BUFBBUlRNRU5UIFwKLQlpZiAoKChUa2FwcE9iamVjdCAqKXNlbGYpLT50aHJlYWRlZCAmJiBcCi0JICAgICgoVGthcHBPYmplY3QgKilzZWxmKS0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsgXAotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiQ2FsbGluZyBUY2wgZnJvbSBkaWZmZXJlbnQgYXBwYXJ0bWVudCIpOyBcCi0JCXJldHVybiAwOyBcCi0JfQorICAgIGlmICgoKFRrYXBwT2JqZWN0ICopc2VsZiktPnRocmVhZGVkICYmIFwKKyAgICAgICAgKChUa2FwcE9iamVjdCAqKXNlbGYpLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgeyBcCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJDYWxsaW5nIFRjbCBmcm9tIGRpZmZlcmVudCBhcHBhcnRtZW50Iik7IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9CiAKICNlbHNlCiAKQEAgLTI0NSwyMSArMjQ1LDIxIEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0IFRrYXBwX1R5cGU7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVGNsX0ludGVycCAqaW50ZXJwOwotCWludCB3YW50b2JqZWN0czsKLQlpbnQgdGhyZWFkZWQ7IC8qIFRydWUgaWYgdGNsX3BsYXRmb3JtW3RocmVhZGVkXSAqLwotCVRjbF9UaHJlYWRJZCB0aHJlYWRfaWQ7Ci0JaW50IGRpc3BhdGNoaW5nOwotCS8qIFdlIGNhbm5vdCBpbmNsdWRlIHRjbEludC5oLCBhcyB0aGlzIGlzIGludGVybmFsLgotCSAgIFNvIHdlIGNhY2hlIGludGVyZXN0aW5nIHR5cGVzIGhlcmUuICovCi0JVGNsX09ialR5cGUgKkJvb2xlYW5UeXBlOwotCVRjbF9PYmpUeXBlICpCeXRlQXJyYXlUeXBlOwotCVRjbF9PYmpUeXBlICpEb3VibGVUeXBlOwotCVRjbF9PYmpUeXBlICpJbnRUeXBlOwotCVRjbF9PYmpUeXBlICpMaXN0VHlwZTsKLQlUY2xfT2JqVHlwZSAqUHJvY0JvZHlUeXBlOwotCVRjbF9PYmpUeXBlICpTdHJpbmdUeXBlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUY2xfSW50ZXJwICppbnRlcnA7CisgICAgaW50IHdhbnRvYmplY3RzOworICAgIGludCB0aHJlYWRlZDsgLyogVHJ1ZSBpZiB0Y2xfcGxhdGZvcm1bdGhyZWFkZWRdICovCisgICAgVGNsX1RocmVhZElkIHRocmVhZF9pZDsKKyAgICBpbnQgZGlzcGF0Y2hpbmc7CisgICAgLyogV2UgY2Fubm90IGluY2x1ZGUgdGNsSW50LmgsIGFzIHRoaXMgaXMgaW50ZXJuYWwuCisgICAgICAgU28gd2UgY2FjaGUgaW50ZXJlc3RpbmcgdHlwZXMgaGVyZS4gKi8KKyAgICBUY2xfT2JqVHlwZSAqQm9vbGVhblR5cGU7CisgICAgVGNsX09ialR5cGUgKkJ5dGVBcnJheVR5cGU7CisgICAgVGNsX09ialR5cGUgKkRvdWJsZVR5cGU7CisgICAgVGNsX09ialR5cGUgKkludFR5cGU7CisgICAgVGNsX09ialR5cGUgKkxpc3RUeXBlOworICAgIFRjbF9PYmpUeXBlICpQcm9jQm9keVR5cGU7CisgICAgVGNsX09ialR5cGUgKlN0cmluZ1R5cGU7CiB9IFRrYXBwT2JqZWN0OwogCiAjZGVmaW5lIFRrYXBwX0NoZWNrKHYpIChQeV9UWVBFKHYpID09ICZUa2FwcF9UeXBlKQpAQCAtMjcwLDcgKzI3MCw3IEBACiAodm9pZCAqKSB2LCBQeV9SRUZDTlQodikpKQogCiAKLQwKKwogLyoqKiogRXJyb3IgSGFuZGxpbmcgKioqKi8KIAogc3RhdGljIFB5T2JqZWN0ICpUa2ludGVyX1RjbEVycm9yOwpAQCAtMjgxLDE2ICsyODEsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqdHJiSW5DbWQ7CiAKIAotDAorCiBzdGF0aWMgUHlPYmplY3QgKgogVGtpbnRlcl9FcnJvcihQeU9iamVjdCAqdikKIHsKLQlQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgVGthcHBfUmVzdWx0KHYpKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgVGthcHBfUmVzdWx0KHYpKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCi0MCisKIC8qKioqIFV0aWxzICoqKiovCiAKIHN0YXRpYyBpbnQgVGtpbnRlcl9idXN5d2FpdGludGVydmFsID0gMjA7CkBAIC0zMDMsMTEgKzMwMywxMSBAQAogc3RhdGljIHZvaWQKIFNsZWVwKGludCBtaWxsaSkKIHsKLQkvKiBYWFggVG9vIGJhZCBpZiB5b3UgZG9uJ3QgaGF2ZSBzZWxlY3QoKS4gKi8KLQlzdHJ1Y3QgdGltZXZhbCB0OwotCXQudHZfc2VjID0gbWlsbGkvMTAwMDsKLQl0LnR2X3VzZWMgPSAobWlsbGklMTAwMCkgKiAxMDAwOwotCXNlbGVjdCgwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdCk7CisgICAgLyogWFhYIFRvbyBiYWQgaWYgeW91IGRvbid0IGhhdmUgc2VsZWN0KCkuICovCisgICAgc3RydWN0IHRpbWV2YWwgdDsKKyAgICB0LnR2X3NlYyA9IG1pbGxpLzEwMDA7CisgICAgdC50dl91c2VjID0gKG1pbGxpJTEwMDApICogMTAwMDsKKyAgICBzZWxlY3QoMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgJnQpOwogfQogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIApAQCAtMzE2LDE3NCArMzE2LDE3NCBAQAogc3RhdGljIGludAogV2FpdEZvck1haW5sb29wKFRrYXBwT2JqZWN0KiBzZWxmKQogewotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0JCWlmIChzZWxmLT5kaXNwYXRjaGluZykKLQkJCXJldHVybiAxOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCVNsZWVwKDEwMCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCWlmIChzZWxmLT5kaXNwYXRjaGluZykKLQkJcmV0dXJuIDE7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIm1haW4gdGhyZWFkIGlzIG5vdCBpbiBtYWluIGxvb3AiKTsKLQlyZXR1cm4gMDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICBpZiAoc2VsZi0+ZGlzcGF0Y2hpbmcpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBTbGVlcCgxMDApOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBpZiAoc2VsZi0+ZGlzcGF0Y2hpbmcpCisgICAgICAgIHJldHVybiAxOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJtYWluIHRocmVhZCBpcyBub3QgaW4gbWFpbiBsb29wIik7CisgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogV0lUSF9USFJFQUQgKi8KIAotDAorCiBzdGF0aWMgY2hhciAqCiBBc1N0cmluZyhQeU9iamVjdCAqdmFsdWUsIFB5T2JqZWN0ICp0bXApCiB7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkKLQkJcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodmFsdWUpKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyh2YWx1ZSk7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKFB5TGlzdF9BcHBlbmQodG1wLCB2KSAhPSAwKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQl9CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodmFsdWUpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHRtcCwgdikgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgfQogI2VuZGlmCi0JZWxzZSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoUHlMaXN0X0FwcGVuZCh0bXAsIHYpICE9IDApIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCX0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeU9iamVjdF9TdHIodmFsdWUpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHRtcCwgdikgIT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgfQogfQogCiAKLQwKKwogI2RlZmluZSBBUkdTWiA2NAogCiBzdGF0aWMgY2hhciAqCiBNZXJnZShQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdG1wID0gTlVMTDsKLQljaGFyICphcmd2U3RvcmVbQVJHU1pdOwotCWNoYXIgKiphcmd2ID0gTlVMTDsKLQlpbnQgZnZTdG9yZVtBUkdTWl07Ci0JaW50ICpmdiA9IE5VTEw7Ci0JaW50IGFyZ2MgPSAwLCBmdmMgPSAwLCBpOwotCWNoYXIgKnJlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRtcCA9IE5VTEw7CisgICAgY2hhciAqYXJndlN0b3JlW0FSR1NaXTsKKyAgICBjaGFyICoqYXJndiA9IE5VTEw7CisgICAgaW50IGZ2U3RvcmVbQVJHU1pdOworICAgIGludCAqZnYgPSBOVUxMOworICAgIGludCBhcmdjID0gMCwgZnZjID0gMCwgaTsKKyAgICBjaGFyICpyZXMgPSBOVUxMOwogCi0JaWYgKCEodG1wID0gUHlMaXN0X05ldygwKSkpCi0JICAgIHJldHVybiBOVUxMOworICAgIGlmICghKHRtcCA9IFB5TGlzdF9OZXcoMCkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFyZ3YgPSBhcmd2U3RvcmU7Ci0JZnYgPSBmdlN0b3JlOworICAgIGFyZ3YgPSBhcmd2U3RvcmU7CisgICAgZnYgPSBmdlN0b3JlOwogCi0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJYXJnYyA9IDA7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgYXJnYyA9IDA7CiAKLQllbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlhcmdjID0gMTsKLQkJZnZbMF0gPSAwOwotCQlpZiAoIShhcmd2WzBdID0gQXNTdHJpbmcoYXJncywgdG1wKSkpCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWVsc2UgewotCQlhcmdjID0gUHlUdXBsZV9TaXplKGFyZ3MpOworICAgIGVsc2UgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIGFyZ2MgPSAxOworICAgICAgICBmdlswXSA9IDA7CisgICAgICAgIGlmICghKGFyZ3ZbMF0gPSBBc1N0cmluZyhhcmdzLCB0bXApKSkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFyZ2MgPSBQeVR1cGxlX1NpemUoYXJncyk7CiAKLQkJaWYgKGFyZ2MgPiBBUkdTWikgewotCQkJYXJndiA9IChjaGFyICoqKWNrYWxsb2MoYXJnYyAqIHNpemVvZihjaGFyICopKTsKLQkJCWZ2ID0gKGludCAqKWNrYWxsb2MoYXJnYyAqIHNpemVvZihpbnQpKTsKLQkJCWlmIChhcmd2ID09IE5VTEwgfHwgZnYgPT0gTlVMTCkgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQotCQl9CisgICAgICAgIGlmIChhcmdjID4gQVJHU1opIHsKKyAgICAgICAgICAgIGFyZ3YgPSAoY2hhciAqKilja2FsbG9jKGFyZ2MgKiBzaXplb2YoY2hhciAqKSk7CisgICAgICAgICAgICBmdiA9IChpbnQgKilja2FsbG9jKGFyZ2MgKiBzaXplb2YoaW50KSk7CisgICAgICAgICAgICBpZiAoYXJndiA9PSBOVUxMIHx8IGZ2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLQkJCVB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOwotCQkJaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKLQkJCQlmdltpXSA9IDE7Ci0JCQkJaWYgKCEoYXJndltpXSA9IE1lcmdlKHYpKSkKLQkJCQkJZ290byBmaW5hbGx5OwotCQkJCWZ2YysrOwotCQkJfQotCQkJZWxzZSBpZiAodiA9PSBQeV9Ob25lKSB7Ci0JCQkJYXJnYyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmdltpXSA9IDA7Ci0JCQkJaWYgKCEoYXJndltpXSA9IEFzU3RyaW5nKHYsIHRtcCkpKQotCQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQkJZnZjKys7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmVzID0gVGNsX01lcmdlKGFyZ2MsIGFyZ3YpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsICJtZXJnZSBmYWlsZWQiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7CisgICAgICAgICAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIGZ2W2ldID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIShhcmd2W2ldID0gTWVyZ2UodikpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICAgICAgZnZjKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBhcmdjID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGZ2W2ldID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoIShhcmd2W2ldID0gQXNTdHJpbmcodiwgdG1wKSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgICAgICBmdmMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXMgPSBUY2xfTWVyZ2UoYXJnYywgYXJndik7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgIm1lcmdlIGZhaWxlZCIpOwogCiAgIGZpbmFsbHk6Ci0JZm9yIChpID0gMDsgaSA8IGZ2YzsgaSsrKQotCQlpZiAoZnZbaV0pIHsKLQkJCWNrZnJlZShhcmd2W2ldKTsKLQkJfQotCWlmIChhcmd2ICE9IGFyZ3ZTdG9yZSkKLQkJY2tmcmVlKEZSRUVDQVNUIGFyZ3YpOwotCWlmIChmdiAhPSBmdlN0b3JlKQotCQlja2ZyZWUoRlJFRUNBU1QgZnYpOworICAgIGZvciAoaSA9IDA7IGkgPCBmdmM7IGkrKykKKyAgICAgICAgaWYgKGZ2W2ldKSB7CisgICAgICAgICAgICBja2ZyZWUoYXJndltpXSk7CisgICAgICAgIH0KKyAgICBpZiAoYXJndiAhPSBhcmd2U3RvcmUpCisgICAgICAgIGNrZnJlZShGUkVFQ0FTVCBhcmd2KTsKKyAgICBpZiAoZnYgIT0gZnZTdG9yZSkKKyAgICAgICAgY2tmcmVlKEZSRUVDQVNUIGZ2KTsKIAotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiByZXM7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCi0MCisKIHN0YXRpYyBQeU9iamVjdCAqCiBTcGxpdChjaGFyICpsaXN0KQogewotCWludCBhcmdjOwotCWNoYXIgKiphcmd2OwotCVB5T2JqZWN0ICp2OworICAgIGludCBhcmdjOworICAgIGNoYXIgKiphcmd2OworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKGxpc3QgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICBpZiAobGlzdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogCi0JaWYgKFRjbF9TcGxpdExpc3QoKFRjbF9JbnRlcnAgKilOVUxMLCBsaXN0LCAmYXJnYywgJmFyZ3YpICE9IFRDTF9PSykgewotCQkvKiBOb3QgYSBsaXN0LgotCQkgKiBDb3VsZCBiZSBhIHF1b3RlZCBzdHJpbmcgY29udGFpbmluZyBmdW5uaWVzLCBlLmcuIHsifS4KLQkJICogUmV0dXJuIHRoZSBzdHJpbmcgaXRzZWxmLgotCQkgKi8KLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobGlzdCk7Ci0JfQorICAgIGlmIChUY2xfU3BsaXRMaXN0KChUY2xfSW50ZXJwICopTlVMTCwgbGlzdCwgJmFyZ2MsICZhcmd2KSAhPSBUQ0xfT0spIHsKKyAgICAgICAgLyogTm90IGEgbGlzdC4KKyAgICAgICAgICogQ291bGQgYmUgYSBxdW90ZWQgc3RyaW5nIGNvbnRhaW5pbmcgZnVubmllcywgZS5nLiB7In0uCisgICAgICAgICAqIFJldHVybiB0aGUgc3RyaW5nIGl0c2VsZi4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGxpc3QpOworICAgIH0KIAotCWlmIChhcmdjID09IDApCi0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQllbHNlIGlmIChhcmdjID09IDEpCi0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbMF0pOwotCWVsc2UgaWYgKCh2ID0gUHlUdXBsZV9OZXcoYXJnYykpICE9IE5VTEwpIHsKLQkJaW50IGk7Ci0JCVB5T2JqZWN0ICp3OworICAgIGlmIChhcmdjID09IDApCisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICBlbHNlIGlmIChhcmdjID09IDEpCisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbMF0pOworICAgIGVsc2UgaWYgKCh2ID0gUHlUdXBsZV9OZXcoYXJnYykpICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIFB5T2JqZWN0ICp3OwogCi0JCWZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLQkJCWlmICgodyA9IFNwbGl0KGFyZ3ZbaV0pKSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCXYgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlUdXBsZV9TZXRJdGVtKHYsIGksIHcpOwotCQl9Ci0JfQotCVRjbF9GcmVlKEZSRUVDQVNUIGFyZ3YpOwotCXJldHVybiB2OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKHcgPSBTcGxpdChhcmd2W2ldKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCB3KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBUY2xfRnJlZShGUkVFQ0FTVCBhcmd2KTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogSW4gc29tZSBjYXNlcywgVGNsIHdpbGwgc3RpbGwgcmV0dXJuIHN0cmluZ3MgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUKQEAgLTQ5Myw4OSArNDkzLDg5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogU3BsaXRPYmooUHlPYmplY3QgKmFyZykKIHsKLQlpZiAoUHlUdXBsZV9DaGVjayhhcmcpKSB7Ci0JCWludCBpLCBzaXplOwotCQlQeU9iamVjdCAqZWxlbSwgKm5ld2VsZW0sICpyZXN1bHQ7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soYXJnKSkgeworICAgICAgICBpbnQgaSwgc2l6ZTsKKyAgICAgICAgUHlPYmplY3QgKmVsZW0sICpuZXdlbGVtLCAqcmVzdWx0OwogCi0JCXNpemUgPSBQeVR1cGxlX1NpemUoYXJnKTsKLQkJcmVzdWx0ID0gTlVMTDsKLQkJLyogUmVjdXJzaXZlbHkgaW52b2tlIFNwbGl0T2JqIGZvciBhbGwgdHVwbGUgaXRlbXMuCi0JCSAgIElmIHRoaXMgZG9lcyBub3QgcmV0dXJuIGEgbmV3IG9iamVjdCwgbm8gYWN0aW9uIGlzCi0JCSAgIG5lZWRlZC4gKi8KLQkJZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQllbGVtID0gUHlUdXBsZV9HZXRJdGVtKGFyZywgaSk7Ci0JCQluZXdlbGVtID0gU3BsaXRPYmooZWxlbSk7Ci0JCQlpZiAoIW5ld2VsZW0pIHsKLQkJCQlQeV9YREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlpZiAoIXJlc3VsdCkgewotCQkJCWludCBrOwotCQkJCWlmIChuZXdlbGVtID09IGVsZW0pIHsKLQkJCQkJUHlfREVDUkVGKG5ld2VsZW0pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcoc2l6ZSk7Ci0JCQkJaWYgKCFyZXN1bHQpCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCWZvcihrID0gMDsgayA8IGk7IGsrKykgewotCQkJCQllbGVtID0gUHlUdXBsZV9HZXRJdGVtKGFyZywgayk7Ci0JCQkJCVB5X0lOQ1JFRihlbGVtKTsKLQkJCQkJUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaywgZWxlbSk7Ci0JCQkJfQotCQkJfQotCQkJUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaSwgbmV3ZWxlbSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCS8qIEZhbGwgdGhyb3VnaCwgcmV0dXJuaW5nIGFyZy4gKi8KLQl9Ci0JZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQlpbnQgYXJnYzsKLQkJY2hhciAqKmFyZ3Y7Ci0JCWNoYXIgKmxpc3QgPSBQeVN0cmluZ19Bc1N0cmluZyhhcmcpOworICAgICAgICBzaXplID0gUHlUdXBsZV9TaXplKGFyZyk7CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIC8qIFJlY3Vyc2l2ZWx5IGludm9rZSBTcGxpdE9iaiBmb3IgYWxsIHR1cGxlIGl0ZW1zLgorICAgICAgICAgICBJZiB0aGlzIGRvZXMgbm90IHJldHVybiBhIG5ldyBvYmplY3QsIG5vIGFjdGlvbiBpcworICAgICAgICAgICBuZWVkZWQuICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmcsIGkpOworICAgICAgICAgICAgbmV3ZWxlbSA9IFNwbGl0T2JqKGVsZW0pOworICAgICAgICAgICAgaWYgKCFuZXdlbGVtKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgICAgICBpZiAobmV3ZWxlbSA9PSBlbGVtKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdlbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHNpemUpOworICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmcsIGspOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGssIGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGksIG5ld2VsZW0pOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAvKiBGYWxsIHRocm91Z2gsIHJldHVybmluZyBhcmcuICovCisgICAgfQorICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgaW50IGFyZ2M7CisgICAgICAgIGNoYXIgKiphcmd2OworICAgICAgICBjaGFyICpsaXN0ID0gUHlTdHJpbmdfQXNTdHJpbmcoYXJnKTsKIAotCQlpZiAoVGNsX1NwbGl0TGlzdCgoVGNsX0ludGVycCAqKU5VTEwsIGxpc3QsICZhcmdjLCAmYXJndikgIT0gVENMX09LKSB7Ci0JCQlQeV9JTkNSRUYoYXJnKTsKLQkJCXJldHVybiBhcmc7Ci0JCX0KLQkJVGNsX0ZyZWUoRlJFRUNBU1QgYXJndik7Ci0JCWlmIChhcmdjID4gMSkKLQkJCXJldHVybiBTcGxpdChQeVN0cmluZ19Bc1N0cmluZyhhcmcpKTsKLQkJLyogRmFsbCB0aHJvdWdoLCByZXR1cm5pbmcgYXJnLiAqLwotCX0KLQlQeV9JTkNSRUYoYXJnKTsKLQlyZXR1cm4gYXJnOworICAgICAgICBpZiAoVGNsX1NwbGl0TGlzdCgoVGNsX0ludGVycCAqKU5VTEwsIGxpc3QsICZhcmdjLCAmYXJndikgIT0gVENMX09LKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoYXJnKTsKKyAgICAgICAgICAgIHJldHVybiBhcmc7CisgICAgICAgIH0KKyAgICAgICAgVGNsX0ZyZWUoRlJFRUNBU1QgYXJndik7CisgICAgICAgIGlmIChhcmdjID4gMSkKKyAgICAgICAgICAgIHJldHVybiBTcGxpdChQeVN0cmluZ19Bc1N0cmluZyhhcmcpKTsKKyAgICAgICAgLyogRmFsbCB0aHJvdWdoLCByZXR1cm5pbmcgYXJnLiAqLworICAgIH0KKyAgICBQeV9JTkNSRUYoYXJnKTsKKyAgICByZXR1cm4gYXJnOwogfQogCi0MCisKIC8qKioqIFRrYXBwIE9iamVjdCAqKioqLwogCiAjaWZuZGVmIFdJVEhfQVBQSU5JVAogaW50CiBUY2xfQXBwSW5pdChUY2xfSW50ZXJwICppbnRlcnApCiB7Ci0JVGtfV2luZG93IG1haW47Ci0JY29uc3QgY2hhciAqIF90a2ludGVyX3NraXBfdGtfaW5pdDsKKyAgICBUa19XaW5kb3cgbWFpbjsKKyAgICBjb25zdCBjaGFyICogX3RraW50ZXJfc2tpcF90a19pbml0OwogCi0JaWYgKFRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJUY2xfSW5pdCBlcnJvcjogJXNcbiIsIFRjbF9HZXRTdHJpbmdSZXN1bHQoaW50ZXJwKSk7Ci0JCXJldHVybiBUQ0xfRVJST1I7Ci0JfQotCV90a2ludGVyX3NraXBfdGtfaW5pdCA9CVRjbF9HZXRWYXIoaW50ZXJwLCAiX3RraW50ZXJfc2tpcF90a19pbml0IiwgVENMX0dMT0JBTF9PTkxZKTsKLQlpZiAoX3RraW50ZXJfc2tpcF90a19pbml0ID09IE5VTEwgfHwgc3RyY21wKF90a2ludGVyX3NraXBfdGtfaW5pdCwgIjEiKQkhPSAwKSB7Ci0JCW1haW4gPSBUa19NYWluV2luZG93KGludGVycCk7Ci0JCWlmIChUa19Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7Ci0JCQlQeVN5c19Xcml0ZVN0ZGVycigiVGtfSW5pdCBlcnJvcjogJXNcbiIsIFRjbF9HZXRTdHJpbmdSZXN1bHQoaW50ZXJwKSk7Ci0JCQlyZXR1cm4gVENMX0VSUk9SOwotCQl9Ci0JfQotCXJldHVybiBUQ0xfT0s7CisgICAgaWYgKFRjbF9Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJUY2xfSW5pdCBlcnJvcjogJXNcbiIsIFRjbF9HZXRTdHJpbmdSZXN1bHQoaW50ZXJwKSk7CisgICAgICAgIHJldHVybiBUQ0xfRVJST1I7CisgICAgfQorICAgIF90a2ludGVyX3NraXBfdGtfaW5pdCA9ICAgICBUY2xfR2V0VmFyKGludGVycCwgIl90a2ludGVyX3NraXBfdGtfaW5pdCIsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgaWYgKF90a2ludGVyX3NraXBfdGtfaW5pdCA9PSBOVUxMIHx8IHN0cmNtcChfdGtpbnRlcl9za2lwX3RrX2luaXQsICIxIikgICAgICE9IDApIHsKKyAgICAgICAgbWFpbiA9IFRrX01haW5XaW5kb3coaW50ZXJwKTsKKyAgICAgICAgaWYgKFRrX0luaXQoaW50ZXJwKSA9PSBUQ0xfRVJST1IpIHsKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJUa19Jbml0IGVycm9yOiAlc1xuIiwgVGNsX0dldFN0cmluZ1Jlc3VsdChpbnRlcnApKTsKKyAgICAgICAgICAgIHJldHVybiBUQ0xfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRDTF9PSzsKIH0KICNlbmRpZiAvKiAhV0lUSF9BUFBJTklUICovCiAKIAotDAorCiAKIC8qIEluaXRpYWxpemUgdGhlIFRrIGFwcGxpY2F0aW9uOyBzZWUgdGhlIGBtYWluJyBmdW5jdGlvbiBpbgogICogYHRrTWFpbi5jJy4KQEAgLTU4NiwyMTQgKzU4NiwyMTQgQEAKIAogc3RhdGljIFRrYXBwT2JqZWN0ICoKIFRrYXBwX05ldyhjaGFyICpzY3JlZW5OYW1lLCBjaGFyICpiYXNlTmFtZSwgY2hhciAqY2xhc3NOYW1lLAotCSAgaW50IGludGVyYWN0aXZlLCBpbnQgd2FudG9iamVjdHMsIGludAl3YW50VGssIGludCBzeW5jLCBjaGFyICp1c2UpCisgICAgICAgICAgaW50IGludGVyYWN0aXZlLCBpbnQgd2FudG9iamVjdHMsIGludCB3YW50VGssIGludCBzeW5jLCBjaGFyICp1c2UpCiB7Ci0JVGthcHBPYmplY3QgKnY7Ci0JY2hhciAqYXJndjA7CisgICAgVGthcHBPYmplY3QgKnY7CisgICAgY2hhciAqYXJndjA7CiAKLQl2ID0gUHlPYmplY3RfTmV3KFRrYXBwT2JqZWN0LCAmVGthcHBfVHlwZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgdiA9IFB5T2JqZWN0X05ldyhUa2FwcE9iamVjdCwgJlRrYXBwX1R5cGUpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jdi0+aW50ZXJwID0gVGNsX0NyZWF0ZUludGVycCgpOwotCXYtPndhbnRvYmplY3RzID0gd2FudG9iamVjdHM7Ci0Jdi0+dGhyZWFkZWQgPSBUY2xfR2V0VmFyMkV4KHYtPmludGVycCwgInRjbF9wbGF0Zm9ybSIsICJ0aHJlYWRlZCIsCi0JCQkJICAgIFRDTF9HTE9CQUxfT05MWSkgIT0gTlVMTDsKLQl2LT50aHJlYWRfaWQgPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpOwotCXYtPmRpc3BhdGNoaW5nID0gMDsKKyAgICB2LT5pbnRlcnAgPSBUY2xfQ3JlYXRlSW50ZXJwKCk7CisgICAgdi0+d2FudG9iamVjdHMgPSB3YW50b2JqZWN0czsKKyAgICB2LT50aHJlYWRlZCA9IFRjbF9HZXRWYXIyRXgodi0+aW50ZXJwLCAidGNsX3BsYXRmb3JtIiwgInRocmVhZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENMX0dMT0JBTF9PTkxZKSAhPSBOVUxMOworICAgIHYtPnRocmVhZF9pZCA9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCk7CisgICAgdi0+ZGlzcGF0Y2hpbmcgPSAwOwogCiAjaWZuZGVmIFRDTF9USFJFQURTCi0JaWYgKHYtPnRocmVhZGVkKSB7Ci0JICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJUY2wgaXMgdGhyZWFkZWQgYnV0IF90a2ludGVyIGlzIG5vdCIpOwotCSAgICBQeV9ERUNSRUYodik7Ci0JICAgIHJldHVybiAwOwotCX0KKyAgICBpZiAodi0+dGhyZWFkZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIlRjbCBpcyB0aHJlYWRlZCBidXQgX3RraW50ZXIgaXMgbm90Iik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogI2VuZGlmCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAodi0+dGhyZWFkZWQgJiYgdGNsX2xvY2spIHsKLQkgICAgLyogSWYgVGNsIGlzIHRocmVhZGVkLCB3ZSBkb24ndCBuZWVkIHRoZSBsb2NrLiAqLwotCSAgICBQeVRocmVhZF9mcmVlX2xvY2sodGNsX2xvY2spOwotCSAgICB0Y2xfbG9jayA9IE5VTEw7Ci0JfQorICAgIGlmICh2LT50aHJlYWRlZCAmJiB0Y2xfbG9jaykgeworICAgICAgICAvKiBJZiBUY2wgaXMgdGhyZWFkZWQsIHdlIGRvbid0IG5lZWQgdGhlIGxvY2suICovCisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayh0Y2xfbG9jayk7CisgICAgICAgIHRjbF9sb2NrID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCXYtPkJvb2xlYW5UeXBlID0gVGNsX0dldE9ialR5cGUoImJvb2xlYW4iKTsKLQl2LT5CeXRlQXJyYXlUeXBlID0gVGNsX0dldE9ialR5cGUoImJ5dGVhcnJheSIpOwotCXYtPkRvdWJsZVR5cGUgPSBUY2xfR2V0T2JqVHlwZSgiZG91YmxlIik7Ci0Jdi0+SW50VHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJpbnQiKTsKLQl2LT5MaXN0VHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJsaXN0Iik7Ci0Jdi0+UHJvY0JvZHlUeXBlID0gVGNsX0dldE9ialR5cGUoInByb2Nib2R5Iik7Ci0Jdi0+U3RyaW5nVHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJzdHJpbmciKTsKKyAgICB2LT5Cb29sZWFuVHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJib29sZWFuIik7CisgICAgdi0+Qnl0ZUFycmF5VHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJieXRlYXJyYXkiKTsKKyAgICB2LT5Eb3VibGVUeXBlID0gVGNsX0dldE9ialR5cGUoImRvdWJsZSIpOworICAgIHYtPkludFR5cGUgPSBUY2xfR2V0T2JqVHlwZSgiaW50Iik7CisgICAgdi0+TGlzdFR5cGUgPSBUY2xfR2V0T2JqVHlwZSgibGlzdCIpOworICAgIHYtPlByb2NCb2R5VHlwZSA9IFRjbF9HZXRPYmpUeXBlKCJwcm9jYm9keSIpOworICAgIHYtPlN0cmluZ1R5cGUgPSBUY2xfR2V0T2JqVHlwZSgic3RyaW5nIik7CiAKLQkvKiBEZWxldGUgdGhlICdleGl0JyBjb21tYW5kLCB3aGljaCBjYW4gc2NyZXcgdGhpbmdzIHVwICovCi0JVGNsX0RlbGV0ZUNvbW1hbmQodi0+aW50ZXJwLCAiZXhpdCIpOworICAgIC8qIERlbGV0ZSB0aGUgJ2V4aXQnIGNvbW1hbmQsIHdoaWNoIGNhbiBzY3JldyB0aGluZ3MgdXAgKi8KKyAgICBUY2xfRGVsZXRlQ29tbWFuZCh2LT5pbnRlcnAsICJleGl0Iik7CiAKLQlpZiAoc2NyZWVuTmFtZSAhPSBOVUxMKQotCQlUY2xfU2V0VmFyMih2LT5pbnRlcnAsICJlbnYiLCAiRElTUExBWSIsCi0JCQkgICAgc2NyZWVuTmFtZSwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICBpZiAoc2NyZWVuTmFtZSAhPSBOVUxMKQorICAgICAgICBUY2xfU2V0VmFyMih2LT5pbnRlcnAsICJlbnYiLCAiRElTUExBWSIsCisgICAgICAgICAgICAgICAgICAgIHNjcmVlbk5hbWUsIFRDTF9HTE9CQUxfT05MWSk7CiAKLQlpZiAoaW50ZXJhY3RpdmUpCi0JCVRjbF9TZXRWYXIodi0+aW50ZXJwLCAidGNsX2ludGVyYWN0aXZlIiwgIjEiLCBUQ0xfR0xPQkFMX09OTFkpOwotCWVsc2UKLQkJVGNsX1NldFZhcih2LT5pbnRlcnAsICJ0Y2xfaW50ZXJhY3RpdmUiLCAiMCIsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgaWYgKGludGVyYWN0aXZlKQorICAgICAgICBUY2xfU2V0VmFyKHYtPmludGVycCwgInRjbF9pbnRlcmFjdGl2ZSIsICIxIiwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICBlbHNlCisgICAgICAgIFRjbF9TZXRWYXIodi0+aW50ZXJwLCAidGNsX2ludGVyYWN0aXZlIiwgIjAiLCBUQ0xfR0xPQkFMX09OTFkpOwogCi0JLyogVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgYXBwbGljYXRpb24gY2xhc3MgZm9yIFRrIDQuMSBhbmQgdXAgKi8KLQlhcmd2MCA9IChjaGFyKilja2FsbG9jKHN0cmxlbihjbGFzc05hbWUpICsgMSk7Ci0JaWYgKCFhcmd2MCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBhcHBsaWNhdGlvbiBjbGFzcyBmb3IgVGsgNC4xIGFuZCB1cCAqLworICAgIGFyZ3YwID0gKGNoYXIqKWNrYWxsb2Moc3RybGVuKGNsYXNzTmFtZSkgKyAxKTsKKyAgICBpZiAoIWFyZ3YwKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3RyY3B5KGFyZ3YwLCBjbGFzc05hbWUpOwotCWlmIChpc3VwcGVyKFB5X0NIQVJNQVNLKGFyZ3YwWzBdKSkpCi0JCWFyZ3YwWzBdID0gdG9sb3dlcihQeV9DSEFSTUFTSyhhcmd2MFswXSkpOwotCVRjbF9TZXRWYXIodi0+aW50ZXJwLCAiYXJndjAiLCBhcmd2MCwgVENMX0dMT0JBTF9PTkxZKTsKLQlja2ZyZWUoYXJndjApOworICAgIHN0cmNweShhcmd2MCwgY2xhc3NOYW1lKTsKKyAgICBpZiAoaXN1cHBlcihQeV9DSEFSTUFTSyhhcmd2MFswXSkpKQorICAgICAgICBhcmd2MFswXSA9IHRvbG93ZXIoUHlfQ0hBUk1BU0soYXJndjBbMF0pKTsKKyAgICBUY2xfU2V0VmFyKHYtPmludGVycCwgImFyZ3YwIiwgYXJndjAsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgY2tmcmVlKGFyZ3YwKTsKIAotCWlmICghIHdhbnRUaykgewotCSAgICBUY2xfU2V0VmFyKHYtPmludGVycCwgIl90a2ludGVyX3NraXBfdGtfaW5pdCIsICIxIiwJVENMX0dMT0JBTF9PTkxZKTsKLQl9CisgICAgaWYgKCEgd2FudFRrKSB7CisgICAgICAgIFRjbF9TZXRWYXIodi0+aW50ZXJwLCAiX3RraW50ZXJfc2tpcF90a19pbml0IiwgIjEiLCAgICAgVENMX0dMT0JBTF9PTkxZKTsKKyAgICB9CiAKLQkvKiBzb21lIGluaXRpYWwgYXJndW1lbnRzIG5lZWQgdG8gYmUgaW4gYXJndiAqLwotCWlmIChzeW5jIHx8IHVzZSkgewotCQljaGFyICphcmdzOwotCQlpbnQgbGVuID0gMDsKKyAgICAvKiBzb21lIGluaXRpYWwgYXJndW1lbnRzIG5lZWQgdG8gYmUgaW4gYXJndiAqLworICAgIGlmIChzeW5jIHx8IHVzZSkgeworICAgICAgICBjaGFyICphcmdzOworICAgICAgICBpbnQgbGVuID0gMDsKIAotCQlpZiAoc3luYykKLQkJCWxlbiArPSBzaXplb2YgIi1zeW5jIjsKLQkJaWYgKHVzZSkKLQkJCWxlbiArPSBzdHJsZW4odXNlKSArIHNpemVvZiAiLXVzZSAiOworICAgICAgICBpZiAoc3luYykKKyAgICAgICAgICAgIGxlbiArPSBzaXplb2YgIi1zeW5jIjsKKyAgICAgICAgaWYgKHVzZSkKKyAgICAgICAgICAgIGxlbiArPSBzdHJsZW4odXNlKSArIHNpemVvZiAiLXVzZSAiOwogCi0JCWFyZ3MgPSAoY2hhciopY2thbGxvYyhsZW4pOwotCQlpZiAoIWFyZ3MpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBhcmdzID0gKGNoYXIqKWNrYWxsb2MobGVuKTsKKyAgICAgICAgaWYgKCFhcmdzKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlhcmdzWzBdID0gJ1wwJzsKLQkJaWYgKHN5bmMpCi0JCQlzdHJjYXQoYXJncywgIi1zeW5jIik7Ci0JCWlmICh1c2UpIHsKLQkJCWlmIChzeW5jKQotCQkJCXN0cmNhdChhcmdzLCAiICIpOwotCQkJc3RyY2F0KGFyZ3MsICItdXNlICIpOwotCQkJc3RyY2F0KGFyZ3MsIHVzZSk7Ci0JCX0KKyAgICAgICAgYXJnc1swXSA9ICdcMCc7CisgICAgICAgIGlmIChzeW5jKQorICAgICAgICAgICAgc3RyY2F0KGFyZ3MsICItc3luYyIpOworICAgICAgICBpZiAodXNlKSB7CisgICAgICAgICAgICBpZiAoc3luYykKKyAgICAgICAgICAgICAgICBzdHJjYXQoYXJncywgIiAiKTsKKyAgICAgICAgICAgIHN0cmNhdChhcmdzLCAiLXVzZSAiKTsKKyAgICAgICAgICAgIHN0cmNhdChhcmdzLCB1c2UpOworICAgICAgICB9CiAKLQkJVGNsX1NldFZhcih2LT5pbnRlcnAsICJhcmd2IiwgYXJncywgVENMX0dMT0JBTF9PTkxZKTsKLQkJY2tmcmVlKGFyZ3MpOwotCX0KKyAgICAgICAgVGNsX1NldFZhcih2LT5pbnRlcnAsICJhcmd2IiwgYXJncywgVENMX0dMT0JBTF9PTkxZKTsKKyAgICAgICAgY2tmcmVlKGFyZ3MpOworICAgIH0KIAotCWlmIChUY2xfQXBwSW5pdCh2LT5pbnRlcnApICE9IFRDTF9PSykgewotCQlQeU9iamVjdCAqcmVzdWx0ID0gVGtpbnRlcl9FcnJvcigoUHlPYmplY3QgKil2KTsKLQkJUHlfREVDUkVGKChQeU9iamVjdCAqKXYpOwotCQlyZXR1cm4gKFRrYXBwT2JqZWN0ICopcmVzdWx0OwotCX0KKyAgICBpZiAoVGNsX0FwcEluaXQodi0+aW50ZXJwKSAhPSBUQ0xfT0spIHsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFRraW50ZXJfRXJyb3IoKFB5T2JqZWN0ICopdik7CisgICAgICAgIFB5X0RFQ1JFRigoUHlPYmplY3QgKil2KTsKKyAgICAgICAgcmV0dXJuIChUa2FwcE9iamVjdCAqKXJlc3VsdDsKKyAgICB9CiAKLQlFbmFibGVFdmVudEhvb2soKTsKKyAgICBFbmFibGVFdmVudEhvb2soKTsKIAotCXJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiAKIHN0YXRpYyB2b2lkCiBUa2FwcF9UaHJlYWRTZW5kKFRrYXBwT2JqZWN0ICpzZWxmLCBUY2xfRXZlbnQgKmV2LAotCQkgVGNsX0NvbmRpdGlvbiAqY29uZCwgVGNsX011dGV4ICptdXRleCkKKyAgICAgICAgICAgICAgICAgVGNsX0NvbmRpdGlvbiAqY29uZCwgVGNsX011dGV4ICptdXRleCkKIHsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTOwotCVRjbF9NdXRleExvY2sobXV0ZXgpOwotCVRjbF9UaHJlYWRRdWV1ZUV2ZW50KHNlbGYtPnRocmVhZF9pZCwgZXYsIFRDTF9RVUVVRV9UQUlMKTsKLQlUY2xfVGhyZWFkQWxlcnQoc2VsZi0+dGhyZWFkX2lkKTsKLQlUY2xfQ29uZGl0aW9uV2FpdChjb25kLCBtdXRleCwgTlVMTCk7Ci0JVGNsX011dGV4VW5sb2NrKG11dGV4KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFM7CisgICAgVGNsX011dGV4TG9jayhtdXRleCk7CisgICAgVGNsX1RocmVhZFF1ZXVlRXZlbnQoc2VsZi0+dGhyZWFkX2lkLCBldiwgVENMX1FVRVVFX1RBSUwpOworICAgIFRjbF9UaHJlYWRBbGVydChzZWxmLT50aHJlYWRfaWQpOworICAgIFRjbF9Db25kaXRpb25XYWl0KGNvbmQsIG11dGV4LCBOVUxMKTsKKyAgICBUY2xfTXV0ZXhVbmxvY2sobXV0ZXgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiB9CiAKLQwKKwogLyoqIFRjbCBFdmFsICoqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVRjbF9PYmogKnZhbHVlOwotCVB5T2JqZWN0ICpzdHJpbmc7IC8qIFRoaXMgY2Fubm90IGNhdXNlIGN5Y2xlcy4gKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgVGNsX09iaiAqdmFsdWU7CisgICAgUHlPYmplY3QgKnN0cmluZzsgLyogVGhpcyBjYW5ub3QgY2F1c2UgY3ljbGVzLiAqLwogfSBQeVRjbE9iamVjdDsKIAogc3RhdGljZm9yd2FyZCBQeVR5cGVPYmplY3QgUHlUY2xPYmplY3RfVHlwZTsKLSNkZWZpbmUgUHlUY2xPYmplY3RfQ2hlY2sodikJKCh2KS0+b2JfdHlwZSA9PSAmUHlUY2xPYmplY3RfVHlwZSkKKyNkZWZpbmUgUHlUY2xPYmplY3RfQ2hlY2sodikgICAgKCh2KS0+b2JfdHlwZSA9PSAmUHlUY2xPYmplY3RfVHlwZSkKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld1B5VGNsT2JqZWN0KFRjbF9PYmogKmFyZykKIHsKLQlQeVRjbE9iamVjdCAqc2VsZjsKLQlzZWxmID0gUHlPYmplY3RfTmV3KFB5VGNsT2JqZWN0LCAmUHlUY2xPYmplY3RfVHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JVGNsX0luY3JSZWZDb3VudChhcmcpOwotCXNlbGYtPnZhbHVlID0gYXJnOwotCXNlbGYtPnN0cmluZyA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICBQeVRjbE9iamVjdCAqc2VsZjsKKyAgICBzZWxmID0gUHlPYmplY3RfTmV3KFB5VGNsT2JqZWN0LCAmUHlUY2xPYmplY3RfVHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGNsX0luY3JSZWZDb3VudChhcmcpOworICAgIHNlbGYtPnZhbHVlID0gYXJnOworICAgIHNlbGYtPnN0cmluZyA9IE5VTEw7CisgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKIH0KIAogc3RhdGljIHZvaWQKIFB5VGNsT2JqZWN0X2RlYWxsb2MoUHlUY2xPYmplY3QgKnNlbGYpCiB7Ci0JVGNsX0RlY3JSZWZDb3VudChzZWxmLT52YWx1ZSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5zdHJpbmcpOwotCVB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBUY2xfRGVjclJlZkNvdW50KHNlbGYtPnZhbHVlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnN0cmluZyk7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlUY2xPYmplY3Rfc3RyKFB5VGNsT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5zdHJpbmcgJiYgUHlTdHJpbmdfQ2hlY2soc2VsZi0+c3RyaW5nKSkgewotCQlQeV9JTkNSRUYoc2VsZi0+c3RyaW5nKTsKLQkJcmV0dXJuIHNlbGYtPnN0cmluZzsKLQl9Ci0JLyogWFhYIENvdWxkIGNhY2hlIHZhbHVlIGlmIGl0IGlzIGFuIEFTQ0lJIHN0cmluZy4gKi8KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhUY2xfR2V0U3RyaW5nKHNlbGYtPnZhbHVlKSk7CisgICAgaWYgKHNlbGYtPnN0cmluZyAmJiBQeVN0cmluZ19DaGVjayhzZWxmLT5zdHJpbmcpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5zdHJpbmcpOworICAgICAgICByZXR1cm4gc2VsZi0+c3RyaW5nOworICAgIH0KKyAgICAvKiBYWFggQ291bGQgY2FjaGUgdmFsdWUgaWYgaXQgaXMgYW4gQVNDSUkgc3RyaW5nLiAqLworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKFRjbF9HZXRTdHJpbmcoc2VsZi0+dmFsdWUpKTsKIH0KIAogc3RhdGljIGNoYXIqCiBQeVRjbE9iamVjdF9UY2xTdHJpbmcoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFRjbF9HZXRTdHJpbmcoKChQeVRjbE9iamVjdCopc2VsZiktPnZhbHVlKTsKKyAgICByZXR1cm4gVGNsX0dldFN0cmluZygoKFB5VGNsT2JqZWN0KilzZWxmKS0+dmFsdWUpOwogfQogCiAvKiBMaWtlIF9zdHIsIGJ1dCBjcmVhdGUgVW5pY29kZSBpZiBuZWNlc3NhcnkuICovCi1QeURvY19TVFJWQVIoUHlUY2xPYmplY3Rfc3RyaW5nX19kb2NfXywgCitQeURvY19TVFJWQVIoUHlUY2xPYmplY3Rfc3RyaW5nX19kb2NfXywKICJ0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LCBlaXRoZXIgYXMgc3RyaW5nIG9yIFVuaWNvZGUiKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5VGNsT2JqZWN0X3N0cmluZyhQeVRjbE9iamVjdCAqc2VsZiwgdm9pZCAqaWdub3JlZCkKIHsKLQljaGFyICpzOwotCWludCBpLCBsZW47Ci0JaWYgKCFzZWxmLT5zdHJpbmcpIHsKLQkJcyA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKHNlbGYtPnZhbHVlLCAmbGVuKTsKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJaWYgKHNbaV0gJiAweDgwKQotCQkJCWJyZWFrOworICAgIGNoYXIgKnM7CisgICAgaW50IGksIGxlbjsKKyAgICBpZiAoIXNlbGYtPnN0cmluZykgeworICAgICAgICBzID0gVGNsX0dldFN0cmluZ0Zyb21PYmooc2VsZi0+dmFsdWUsICZsZW4pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICBpZiAoc1tpXSAmIDB4ODApCisgICAgICAgICAgICAgICAgYnJlYWs7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQlpZiAoaSA9PSBsZW4pCi0JCQkvKiBJdCBpcyBhbiBBU0NJSSBzdHJpbmcuICovCi0JCQlzZWxmLT5zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotCQllbHNlIHsKLQkJCXNlbGYtPnN0cmluZyA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGxlbiwgInN0cmljdCIpOwotCQkJaWYgKCFzZWxmLT5zdHJpbmcpIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCXNlbGYtPnN0cmluZyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKGkgPT0gbGVuKQorICAgICAgICAgICAgLyogSXQgaXMgYW4gQVNDSUkgc3RyaW5nLiAqLworICAgICAgICAgICAgc2VsZi0+c3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZWxmLT5zdHJpbmcgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsZW4sICJzdHJpY3QiKTsKKyAgICAgICAgICAgIGlmICghc2VsZi0+c3RyaW5nKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzZWxmLT5zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZWxzZQotCQlzZWxmLT5zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOworICAgICAgICBzZWxmLT5zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwogI2VuZGlmCi0JCWlmICghc2VsZi0+c3RyaW5nKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihzZWxmLT5zdHJpbmcpOwotCXJldHVybiBzZWxmLT5zdHJpbmc7CisgICAgICAgIGlmICghc2VsZi0+c3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihzZWxmLT5zdHJpbmcpOworICAgIHJldHVybiBzZWxmLT5zdHJpbmc7CiB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCkBAIC04MDIsMzYgKzgwMiwzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5VGNsT2JqZWN0X3VuaWNvZGUoUHlUY2xPYmplY3QgKnNlbGYsIHZvaWQgKmlnbm9yZWQpCiB7Ci0JY2hhciAqczsKLQlpbnQgbGVuOwotCWlmIChzZWxmLT5zdHJpbmcgJiYgUHlVbmljb2RlX0NoZWNrKHNlbGYtPnN0cmluZykpIHsKLQkJUHlfSU5DUkVGKHNlbGYtPnN0cmluZyk7Ci0JCXJldHVybiBzZWxmLT5zdHJpbmc7Ci0JfQotCS8qIFhYWCBDb3VsZCBjaGFjaGUgcmVzdWx0IGlmIGl0IGlzIG5vbi1BU0NJSS4gKi8KLQlzID0gVGNsX0dldFN0cmluZ0Zyb21PYmooc2VsZi0+dmFsdWUsICZsZW4pOwotCXJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsZW4sICJzdHJpY3QiKTsKKyAgICBjaGFyICpzOworICAgIGludCBsZW47CisgICAgaWYgKHNlbGYtPnN0cmluZyAmJiBQeVVuaWNvZGVfQ2hlY2soc2VsZi0+c3RyaW5nKSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+c3RyaW5nKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPnN0cmluZzsKKyAgICB9CisgICAgLyogWFhYIENvdWxkIGNoYWNoZSByZXN1bHQgaWYgaXQgaXMgbm9uLUFTQ0lJLiAqLworICAgIHMgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaihzZWxmLT52YWx1ZSwgJmxlbik7CisgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGxlbiwgInN0cmljdCIpOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeVRjbE9iamVjdF9yZXByKFB5VGNsT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzUwXTsKLQlQeU9TX3NucHJpbnRmKGJ1ZiwgNTAsICI8JXMgb2JqZWN0IGF0ICVwPiIsCi0JCSAgICAgIHNlbGYtPnZhbHVlLT50eXBlUHRyLT5uYW1lLCBzZWxmLT52YWx1ZSk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1Zls1MF07CisgICAgUHlPU19zbnByaW50ZihidWYsIDUwLCAiPCVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgc2VsZi0+dmFsdWUtPnR5cGVQdHItPm5hbWUsIHNlbGYtPnZhbHVlKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50CiBQeVRjbE9iamVjdF9jbXAoUHlUY2xPYmplY3QgKnNlbGYsIFB5VGNsT2JqZWN0ICpvdGhlcikKIHsKLQlpbnQgcmVzOwotCXJlcyA9IHN0cmNtcChUY2xfR2V0U3RyaW5nKHNlbGYtPnZhbHVlKSwKLQkJICAgICBUY2xfR2V0U3RyaW5nKG90aGVyLT52YWx1ZSkpOwotCWlmIChyZXMgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKHJlcyA+IDApIHJldHVybiAxOwotCXJldHVybiAwOworICAgIGludCByZXM7CisgICAgcmVzID0gc3RyY21wKFRjbF9HZXRTdHJpbmcoc2VsZi0+dmFsdWUpLAorICAgICAgICAgICAgICAgICBUY2xfR2V0U3RyaW5nKG90aGVyLT52YWx1ZSkpOworICAgIGlmIChyZXMgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHJlcyA+IDApIHJldHVybiAxOworICAgIHJldHVybiAwOwogfQogCiBQeURvY19TVFJWQVIoZ2V0X3R5cGVuYW1lX19kb2NfXywgIm5hbWUgb2YgdGhlIFRjbCB0eXBlIik7CkBAIC04MzksMjY0ICs4MzksMjY0IEBACiBzdGF0aWMgUHlPYmplY3QqCiBnZXRfdHlwZW5hbWUoUHlUY2xPYmplY3QqIG9iaiwgdm9pZCogaWdub3JlZCkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhvYmotPnZhbHVlLT50eXBlUHRyLT5uYW1lKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhvYmotPnZhbHVlLT50eXBlUHRyLT5uYW1lKTsKIH0KIAogCiBzdGF0aWMgUHlHZXRTZXREZWYgUHlUY2xPYmplY3RfZ2V0c2V0bGlzdFtdID0gewotCXsidHlwZW5hbWUiLCAoZ2V0dGVyKWdldF90eXBlbmFtZSwgTlVMTCwgZ2V0X3R5cGVuYW1lX19kb2NfX30sCi0JeyJzdHJpbmciLCAoZ2V0dGVyKVB5VGNsT2JqZWN0X3N0cmluZywgTlVMTCwgCi0JIFB5VGNsT2JqZWN0X3N0cmluZ19fZG9jX199LAotCXswfSwKKyAgICB7InR5cGVuYW1lIiwgKGdldHRlcilnZXRfdHlwZW5hbWUsIE5VTEwsIGdldF90eXBlbmFtZV9fZG9jX199LAorICAgIHsic3RyaW5nIiwgKGdldHRlcilQeVRjbE9iamVjdF9zdHJpbmcsIE5VTEwsCisgICAgIFB5VGNsT2JqZWN0X3N0cmluZ19fZG9jX199LAorICAgIHswfSwKIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBQeVRjbE9iamVjdF9tZXRob2RzW10gPSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCXsiX191bmljb2RlX18iLAkoUHlDRnVuY3Rpb24pUHlUY2xPYmplY3RfdW5pY29kZSwgTUVUSF9OT0FSR1MsCi0JUHlUY2xPYmplY3RfdW5pY29kZV9fZG9jX199LAorICAgIHsiX191bmljb2RlX18iLCAgICAgKFB5Q0Z1bmN0aW9uKVB5VGNsT2JqZWN0X3VuaWNvZGUsIE1FVEhfTk9BUkdTLAorICAgIFB5VGNsT2JqZWN0X3VuaWNvZGVfX2RvY19ffSwKICNlbmRpZgotCXswfQorICAgIHswfQogfTsKIAogc3RhdGljaGVyZSBQeVR5cGVPYmplY3QgUHlUY2xPYmplY3RfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLAkJCS8qb2Jfc2l6ZSovCi0JIl90a2ludGVyLlRjbF9PYmoiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoUHlUY2xPYmplY3QpLAkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpUHlUY2xPYmplY3RfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpUHlUY2xPYmplY3RfY21wLAkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYylQeVRjbE9iamVjdF9yZXByLAkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLSAgICAgICAgKHJlcHJmdW5jKVB5VGNsT2JqZWN0X3N0ciwgICAgICAgIC8qdHBfc3RyKi8KLSAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgIC8qdHBfZmxhZ3MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KLSAgICAgICAgUHlUY2xPYmplY3RfbWV0aG9kcywgICAgLyp0cF9tZXRob2RzKi8KLSAgICAgICAgMCwJCQkvKnRwX21lbWJlcnMqLwotICAgICAgICBQeVRjbE9iamVjdF9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiX3RraW50ZXIuVGNsX09iaiIsICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihQeVRjbE9iamVjdCksICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilQeVRjbE9iamVjdF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYylQeVRjbE9iamVjdF9jbXAsICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYylQeVRjbE9iamVjdF9yZXByLCAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAocmVwcmZ1bmMpUHlUY2xPYmplY3Rfc3RyLCAgICAgICAgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAvKnRwX2ZsYWdzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBQeVRjbE9iamVjdF9tZXRob2RzLCAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIFB5VGNsT2JqZWN0X2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCiB9OwogCiBzdGF0aWMgVGNsX09iaioKIEFzT2JqKFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlUY2xfT2JqICpyZXN1bHQ7CisgICAgVGNsX09iaiAqcmVzdWx0OwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkKLQkJcmV0dXJuIFRjbF9OZXdTdHJpbmdPYmooUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKSwKLQkJCQkJUHlTdHJpbmdfR0VUX1NJWkUodmFsdWUpKTsKLQllbHNlIGlmIChQeUJvb2xfQ2hlY2sodmFsdWUpKQotCQlyZXR1cm4gVGNsX05ld0Jvb2xlYW5PYmooUHlPYmplY3RfSXNUcnVlKHZhbHVlKSk7Ci0JZWxzZSBpZiAoUHlJbnRfQ2hlY2sodmFsdWUpKQotCQlyZXR1cm4gVGNsX05ld0xvbmdPYmooUHlJbnRfQVNfTE9ORyh2YWx1ZSkpOwotCWVsc2UgaWYgKFB5RmxvYXRfQ2hlY2sodmFsdWUpKQotCQlyZXR1cm4gVGNsX05ld0RvdWJsZU9iaihQeUZsb2F0X0FTX0RPVUJMRSh2YWx1ZSkpOwotCWVsc2UgaWYgKFB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVRjbF9PYmogKiphcmd2ID0gKFRjbF9PYmoqKikKLQkJCWNrYWxsb2MoUHlUdXBsZV9TaXplKHZhbHVlKSpzaXplb2YoVGNsX09iaiopKTsKLQkJaW50IGk7Ci0JCWlmKCFhcmd2KQotCQkgIHJldHVybiAwOwotCQlmb3IoaT0wO2k8UHlUdXBsZV9TaXplKHZhbHVlKTtpKyspCi0JCSAgYXJndltpXSA9IEFzT2JqKFB5VHVwbGVfR2V0SXRlbSh2YWx1ZSxpKSk7Ci0JCXJlc3VsdCA9IFRjbF9OZXdMaXN0T2JqKFB5VHVwbGVfU2l6ZSh2YWx1ZSksIGFyZ3YpOwotCQlja2ZyZWUoRlJFRUNBU1QgYXJndik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkpCisgICAgICAgIHJldHVybiBUY2xfTmV3U3RyaW5nT2JqKFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoUHlCb29sX0NoZWNrKHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIFRjbF9OZXdCb29sZWFuT2JqKFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSkpOworICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIFRjbF9OZXdMb25nT2JqKFB5SW50X0FTX0xPTkcodmFsdWUpKTsKKyAgICBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIFRjbF9OZXdEb3VibGVPYmooUHlGbG9hdF9BU19ET1VCTEUodmFsdWUpKTsKKyAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBUY2xfT2JqICoqYXJndiA9IChUY2xfT2JqKiopCisgICAgICAgICAgICBja2FsbG9jKFB5VHVwbGVfU2l6ZSh2YWx1ZSkqc2l6ZW9mKFRjbF9PYmoqKSk7CisgICAgICAgIGludCBpOworICAgICAgICBpZighYXJndikKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm9yKGk9MDtpPFB5VHVwbGVfU2l6ZSh2YWx1ZSk7aSsrKQorICAgICAgICAgIGFyZ3ZbaV0gPSBBc09iaihQeVR1cGxlX0dldEl0ZW0odmFsdWUsaSkpOworICAgICAgICByZXN1bHQgPSBUY2xfTmV3TGlzdE9iaihQeVR1cGxlX1NpemUodmFsdWUpLCBhcmd2KTsKKyAgICAgICAgY2tmcmVlKEZSRUVDQVNUIGFyZ3YpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotCQlQeV9VTklDT0RFICppbmJ1ZiA9IFB5VW5pY29kZV9BU19VTklDT0RFKHZhbHVlKTsKLQkJUHlfc3NpemVfdCBzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKHZhbHVlKTsKLQkJLyogVGhpcyAjaWZkZWYgYXNzdW1lcyB0aGF0IFRjbCB1c2VzIFVDUy0yLgotCQkgICBTZWUgVENMX1VURl9NQVggdGVzdCBhYm92ZS4gKi8KKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5X1VOSUNPREUgKmluYnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpOworICAgICAgICBQeV9zc2l6ZV90IHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUodmFsdWUpOworICAgICAgICAvKiBUaGlzICNpZmRlZiBhc3N1bWVzIHRoYXQgVGNsIHVzZXMgVUNTLTIuCisgICAgICAgICAgIFNlZSBUQ0xfVVRGX01BWCB0ZXN0IGFib3ZlLiAqLwogI2lmIGRlZmluZWQoUHlfVU5JQ09ERV9XSURFKSAmJiBUQ0xfVVRGX01BWCA9PSAzCi0JCVRjbF9VbmlDaGFyICpvdXRidWYgPSBOVUxMOwotCQlQeV9zc2l6ZV90IGk7Ci0JCXNpemVfdCBhbGxvY3NpemUgPSAoKHNpemVfdClzaXplKSAqIHNpemVvZihUY2xfVW5pQ2hhcik7Ci0JCWlmIChhbGxvY3NpemUgPj0gc2l6ZSkKLQkJCW91dGJ1ZiA9IChUY2xfVW5pQ2hhciopY2thbGxvYyhhbGxvY3NpemUpOwotCQkvKiBFbHNlIG92ZXJmbG93IG9jY3VycmVkLCBhbmQgd2UgdGFrZSB0aGUgbmV4dCBleGl0ICovCi0JCWlmICghb3V0YnVmKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGluYnVmW2ldID49IDB4MTAwMDApIHsKLQkJCQkvKiBUY2wgZG9lc24ndCBkbyBVVEYtMTYsIHlldC4gKi8KLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJ1bnN1cHBvcnRlZCBjaGFyYWN0ZXIiKTsKLQkJCQlja2ZyZWUoRlJFRUNBU1Qgb3V0YnVmKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCW91dGJ1ZltpXSA9IGluYnVmW2ldOwotCQl9Ci0JCXJlc3VsdCA9IFRjbF9OZXdVbmljb2RlT2JqKG91dGJ1Ziwgc2l6ZSk7Ci0JCWNrZnJlZShGUkVFQ0FTVCBvdXRidWYpOwotCQlyZXR1cm4gcmVzdWx0OworICAgICAgICBUY2xfVW5pQ2hhciAqb3V0YnVmID0gTlVMTDsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBzaXplX3QgYWxsb2NzaXplID0gKChzaXplX3Qpc2l6ZSkgKiBzaXplb2YoVGNsX1VuaUNoYXIpOworICAgICAgICBpZiAoYWxsb2NzaXplID49IHNpemUpCisgICAgICAgICAgICBvdXRidWYgPSAoVGNsX1VuaUNoYXIqKWNrYWxsb2MoYWxsb2NzaXplKTsKKyAgICAgICAgLyogRWxzZSBvdmVyZmxvdyBvY2N1cnJlZCwgYW5kIHdlIHRha2UgdGhlIG5leHQgZXhpdCAqLworICAgICAgICBpZiAoIW91dGJ1ZikgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbmJ1ZltpXSA+PSAweDEwMDAwKSB7CisgICAgICAgICAgICAgICAgLyogVGNsIGRvZXNuJ3QgZG8gVVRGLTE2LCB5ZXQuICovCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBjaGFyYWN0ZXIiKTsKKyAgICAgICAgICAgICAgICBja2ZyZWUoRlJFRUNBU1Qgb3V0YnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dGJ1ZltpXSA9IGluYnVmW2ldOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IFRjbF9OZXdVbmljb2RlT2JqKG91dGJ1Ziwgc2l6ZSk7CisgICAgICAgIGNrZnJlZShGUkVFQ0FTVCBvdXRidWYpOworICAgICAgICByZXR1cm4gcmVzdWx0OwogI2Vsc2UKLQkJcmV0dXJuIFRjbF9OZXdVbmljb2RlT2JqKGluYnVmLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIFRjbF9OZXdVbmljb2RlT2JqKGluYnVmLCBzaXplKTsKICNlbmRpZgogCi0JfQorICAgIH0KICNlbmRpZgotCWVsc2UgaWYoUHlUY2xPYmplY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCVRjbF9PYmogKnYgPSAoKFB5VGNsT2JqZWN0Kil2YWx1ZSktPnZhbHVlOwotCQlUY2xfSW5jclJlZkNvdW50KHYpOwotCQlyZXR1cm4gdjsKLQl9IAotCWVsc2UgewotCQlQeU9iamVjdCAqdiA9IFB5T2JqZWN0X1N0cih2YWx1ZSk7Ci0JCWlmICghdikKLQkJCXJldHVybiAwOwotCQlyZXN1bHQgPSBBc09iaih2KTsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICBlbHNlIGlmKFB5VGNsT2JqZWN0X0NoZWNrKHZhbHVlKSkgeworICAgICAgICBUY2xfT2JqICp2ID0gKChQeVRjbE9iamVjdCopdmFsdWUpLT52YWx1ZTsKKyAgICAgICAgVGNsX0luY3JSZWZDb3VudCh2KTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5T2JqZWN0X1N0cih2YWx1ZSk7CisgICAgICAgIGlmICghdikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXN1bHQgPSBBc09iaih2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0KgogRnJvbU9iaihQeU9iamVjdCogdGthcHAsIFRjbF9PYmogKnZhbHVlKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCVRrYXBwT2JqZWN0ICphcHAgPSAoVGthcHBPYmplY3QqKXRrYXBwOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFRrYXBwT2JqZWN0ICphcHAgPSAoVGthcHBPYmplY3QqKXRrYXBwOwogCi0JaWYgKHZhbHVlLT50eXBlUHRyID09IE5VTEwpIHsKLQkJLyogSWYgdGhlIHJlc3VsdCBjb250YWlucyBhbnkgYnl0ZXMgd2l0aCB0aGUgdG9wIGJpdCBzZXQsCi0JCSAgIGl0J3MgVVRGLTggYW5kIHdlIHNob3VsZCBkZWNvZGUgaXQgdG8gVW5pY29kZSAqLworICAgIGlmICh2YWx1ZS0+dHlwZVB0ciA9PSBOVUxMKSB7CisgICAgICAgIC8qIElmIHRoZSByZXN1bHQgY29udGFpbnMgYW55IGJ5dGVzIHdpdGggdGhlIHRvcCBiaXQgc2V0LAorICAgICAgICAgICBpdCdzIFVURi04IGFuZCB3ZSBzaG91bGQgZGVjb2RlIGl0IHRvIFVuaWNvZGUgKi8KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWludCBpOwotCQljaGFyICpzID0gdmFsdWUtPmJ5dGVzOwotCQlpbnQgbGVuID0gdmFsdWUtPmxlbmd0aDsKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAodmFsdWUtPmJ5dGVzW2ldICYgMHg4MCkKLQkJCQlicmVhazsKLQkJfQorICAgICAgICBpbnQgaTsKKyAgICAgICAgY2hhciAqcyA9IHZhbHVlLT5ieXRlczsKKyAgICAgICAgaW50IGxlbiA9IHZhbHVlLT5sZW5ndGg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKHZhbHVlLT5ieXRlc1tpXSAmIDB4ODApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAoaSA9PSB2YWx1ZS0+bGVuZ3RoKQotCQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKLQkJZWxzZSB7Ci0JCQkvKiBDb252ZXJ0IFVURi04IHRvIFVuaWNvZGUgc3RyaW5nICovCi0JCQlyZXN1bHQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsZW4sICJzdHJpY3QiKTsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoaSA9PSB2YWx1ZS0+bGVuZ3RoKQorICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBDb252ZXJ0IFVURi04IHRvIFVuaWNvZGUgc3RyaW5nICovCisgICAgICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsZW4sICJzdHJpY3QiKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2Vsc2UKLQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsdWUtPmJ5dGVzLCB2YWx1ZS0+bGVuZ3RoKTsKKyAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsdWUtPmJ5dGVzLCB2YWx1ZS0+bGVuZ3RoKTsKICNlbmRpZgotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQlpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5Cb29sZWFuVHlwZSkgewotCQlyZXN1bHQgPSB2YWx1ZS0+aW50ZXJuYWxSZXAubG9uZ1ZhbHVlID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+Qm9vbGVhblR5cGUpIHsKKyAgICAgICAgcmVzdWx0ID0gdmFsdWUtPmludGVybmFsUmVwLmxvbmdWYWx1ZSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogCi0JaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+Qnl0ZUFycmF5VHlwZSkgewotCQlpbnQgc2l6ZTsKLQkJY2hhciAqZGF0YSA9IChjaGFyKilUY2xfR2V0Qnl0ZUFycmF5RnJvbU9iaih2YWx1ZSwgJnNpemUpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSk7Ci0JfQorICAgIGlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPkJ5dGVBcnJheVR5cGUpIHsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGNoYXIgKmRhdGEgPSAoY2hhciopVGNsX0dldEJ5dGVBcnJheUZyb21PYmoodmFsdWUsICZzaXplKTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIHNpemUpOworICAgIH0KIAotCWlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPkRvdWJsZVR5cGUpIHsKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZS0+aW50ZXJuYWxSZXAuZG91YmxlVmFsdWUpOwotCX0KKyAgICBpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5Eb3VibGVUeXBlKSB7CisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsdWUtPmludGVybmFsUmVwLmRvdWJsZVZhbHVlKTsKKyAgICB9CiAKLQlpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5JbnRUeXBlKSB7Ci0JCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZS0+aW50ZXJuYWxSZXAubG9uZ1ZhbHVlKTsKLQl9CisgICAgaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+SW50VHlwZSkgeworICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUtPmludGVybmFsUmVwLmxvbmdWYWx1ZSk7CisgICAgfQogCi0JaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+TGlzdFR5cGUpIHsKLQkJaW50IHNpemU7Ci0JCWludCBpLCBzdGF0dXM7Ci0JCVB5T2JqZWN0ICplbGVtOwotCQlUY2xfT2JqICp0Y2xfZWxlbTsKKyAgICBpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5MaXN0VHlwZSkgeworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgaW50IGksIHN0YXR1czsKKyAgICAgICAgUHlPYmplY3QgKmVsZW07CisgICAgICAgIFRjbF9PYmogKnRjbF9lbGVtOwogCi0JCXN0YXR1cyA9IFRjbF9MaXN0T2JqTGVuZ3RoKFRrYXBwX0ludGVycCh0a2FwcCksIHZhbHVlLCAmc2l6ZSk7Ci0JCWlmIChzdGF0dXMgPT0gVENMX0VSUk9SKQotCQkJcmV0dXJuIFRraW50ZXJfRXJyb3IodGthcHApOwotCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhzaXplKTsKLQkJaWYgKCFyZXN1bHQpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJc3RhdHVzID0gVGNsX0xpc3RPYmpJbmRleChUa2FwcF9JbnRlcnAodGthcHApLAotCQkJCQkJICB2YWx1ZSwgaSwgJnRjbF9lbGVtKTsKLQkJCWlmIChzdGF0dXMgPT0gVENMX0VSUk9SKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIFRraW50ZXJfRXJyb3IodGthcHApOwotCQkJfQotCQkJZWxlbSA9IEZyb21PYmoodGthcHAsIHRjbF9lbGVtKTsKLQkJCWlmICghZWxlbSkgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaSwgZWxlbSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgICAgIHN0YXR1cyA9IFRjbF9MaXN0T2JqTGVuZ3RoKFRrYXBwX0ludGVycCh0a2FwcCksIHZhbHVlLCAmc2l6ZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gVENMX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIFRraW50ZXJfRXJyb3IodGthcHApOworICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhzaXplKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgc3RhdHVzID0gVGNsX0xpc3RPYmpJbmRleChUa2FwcF9JbnRlcnAodGthcHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgaSwgJnRjbF9lbGVtKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gVENMX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRraW50ZXJfRXJyb3IodGthcHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxlbSA9IEZyb21PYmoodGthcHAsIHRjbF9lbGVtKTsKKyAgICAgICAgICAgIGlmICghZWxlbSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaSwgZWxlbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiAKLQlpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5Qcm9jQm9keVR5cGUpIHsKLQkgIC8qIGZhbGwgdGhyb3VnaDogcmV0dXJuIHRjbCBvYmplY3QuICovCi0JfQorICAgIGlmICh2YWx1ZS0+dHlwZVB0ciA9PSBhcHAtPlByb2NCb2R5VHlwZSkgeworICAgICAgLyogZmFsbCB0aHJvdWdoOiByZXR1cm4gdGNsIG9iamVjdC4gKi8KKyAgICB9CiAKLQlpZiAodmFsdWUtPnR5cGVQdHIgPT0gYXBwLT5TdHJpbmdUeXBlKSB7CisgICAgaWYgKHZhbHVlLT50eXBlUHRyID09IGFwcC0+U3RyaW5nVHlwZSkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKICNpZiBkZWZpbmVkKFB5X1VOSUNPREVfV0lERSkgJiYgVENMX1VURl9NQVg9PTMKLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJaW50IHNpemU7Ci0JCVRjbF9VbmlDaGFyICppbnB1dDsKLQkJUHlfVU5JQ09ERSAqb3V0cHV0OworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgVGNsX1VuaUNoYXIgKmlucHV0OworICAgICAgICBQeV9VTklDT0RFICpvdXRwdXQ7CiAKLQkJc2l6ZSA9IFRjbF9HZXRDaGFyTGVuZ3RoKHZhbHVlKTsKLQkJcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHNpemUpOwotCQlpZiAoIXJlc3VsdCkKLQkJCXJldHVybiBOVUxMOwotCQlpbnB1dCA9IFRjbF9HZXRVbmljb2RlKHZhbHVlKTsKLQkJb3V0cHV0ID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKLQkJd2hpbGUgKHNpemUtLSkKLQkJCSpvdXRwdXQrKyA9ICppbnB1dCsrOwotCQlyZXR1cm4gcmVzdWx0OworICAgICAgICBzaXplID0gVGNsX0dldENoYXJMZW5ndGgodmFsdWUpOworICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgc2l6ZSk7CisgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlucHV0ID0gVGNsX0dldFVuaWNvZGUodmFsdWUpOworICAgICAgICBvdXRwdXQgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOworICAgICAgICB3aGlsZSAoc2l6ZS0tKQorICAgICAgICAgICAgKm91dHB1dCsrID0gKmlucHV0Kys7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAjZWxzZQotCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKFRjbF9HZXRVbmljb2RlKHZhbHVlKSwKLQkJCQkJICAgICBUY2xfR2V0Q2hhckxlbmd0aCh2YWx1ZSkpOworICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKFRjbF9HZXRVbmljb2RlKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUY2xfR2V0Q2hhckxlbmd0aCh2YWx1ZSkpOwogI2VuZGlmCiAjZWxzZQotCQlpbnQgc2l6ZTsKLQkJY2hhciAqYzsKLQkJYyA9IFRjbF9HZXRTdHJpbmdGcm9tT2JqKHZhbHVlLCAmc2l6ZSk7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjLCBzaXplKTsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGNoYXIgKmM7CisgICAgICAgIGMgPSBUY2xfR2V0U3RyaW5nRnJvbU9iaih2YWx1ZSwgJnNpemUpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYywgc2l6ZSk7CiAjZW5kaWYKLQl9CisgICAgfQogCi0JcmV0dXJuIG5ld1B5VGNsT2JqZWN0KHZhbHVlKTsKKyAgICByZXR1cm4gbmV3UHlUY2xPYmplY3QodmFsdWUpOwogfQogCiAvKiBUaGlzIG11dGV4IHN5bmNocm9uaXplcyBpbnRlci10aHJlYWQgY29tbWFuZCBjYWxscy4gKi8KQEAgLTExMDQsMjMgKzExMDQsMjMgQEAKIFRDTF9ERUNMQVJFX01VVEVYKGNhbGxfbXV0ZXgpCiAKIHR5cGVkZWYgc3RydWN0IFRrYXBwX0NhbGxFdmVudCB7Ci0JVGNsX0V2ZW50IGV2OwkgICAgIC8qIE11c3QgYmUgZmlyc3QgKi8KLQlUa2FwcE9iamVjdCAqc2VsZjsKLQlQeU9iamVjdCAqYXJnczsKLQlpbnQgZmxhZ3M7Ci0JUHlPYmplY3QgKipyZXM7Ci0JUHlPYmplY3QgKipleGNfdHlwZSwgKipleGNfdmFsdWUsICoqZXhjX3RiOwotCVRjbF9Db25kaXRpb24gZG9uZTsKKyAgICBUY2xfRXZlbnQgZXY7ICAgICAgICAgICAgLyogTXVzdCBiZSBmaXJzdCAqLworICAgIFRrYXBwT2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIGludCBmbGFnczsKKyAgICBQeU9iamVjdCAqKnJlczsKKyAgICBQeU9iamVjdCAqKmV4Y190eXBlLCAqKmV4Y192YWx1ZSwgKipleGNfdGI7CisgICAgVGNsX0NvbmRpdGlvbiBkb25lOwogfSBUa2FwcF9DYWxsRXZlbnQ7CiAKIHZvaWQKIFRrYXBwX0NhbGxEZWFsbG9jQXJncyhUY2xfT2JqKiogb2JqdiwgVGNsX09iaioqIG9ialN0b3JlLCBpbnQgb2JqYykKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgb2JqYzsgaSsrKQotCQlUY2xfRGVjclJlZkNvdW50KG9ianZbaV0pOwotCWlmIChvYmp2ICE9IG9ialN0b3JlKQotCQlja2ZyZWUoRlJFRUNBU1Qgb2Jqdik7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG9iamM7IGkrKykKKyAgICAgICAgVGNsX0RlY3JSZWZDb3VudChvYmp2W2ldKTsKKyAgICBpZiAob2JqdiAhPSBvYmpTdG9yZSkKKyAgICAgICAgY2tmcmVlKEZSRUVDQVNUIG9ianYpOwogfQogCiAvKiBDb252ZXJ0IFB5dGhvbiBvYmplY3RzIHRvIFRjbCBvYmplY3RzLiBUaGlzIG11c3QgaGFwcGVuIGluIHRoZQpAQCAtMTEyOSw1MSArMTEyOSw1MSBAQAogc3RhdGljIFRjbF9PYmoqKgogVGthcHBfQ2FsbEFyZ3MoUHlPYmplY3QgKmFyZ3MsIFRjbF9PYmoqKiBvYmpTdG9yZSwgaW50ICpwb2JqYykKIHsKLQlUY2xfT2JqICoqb2JqdiA9IG9ialN0b3JlOwotCWludCBvYmpjID0gMCwgaTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQkvKiBkbyBub3RoaW5nICovOworICAgIFRjbF9PYmogKipvYmp2ID0gb2JqU3RvcmU7CisgICAgaW50IG9iamMgPSAwLCBpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIC8qIGRvIG5vdGhpbmcgKi87CiAKLQllbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlvYmp2WzBdID0gQXNPYmooYXJncyk7Ci0JCWlmIChvYmp2WzBdID09IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JCW9iamMgPSAxOwotCQlUY2xfSW5jclJlZkNvdW50KG9ianZbMF0pOwotCX0KLQllbHNlIHsKLQkJb2JqYyA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKKyAgICBlbHNlIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICBvYmp2WzBdID0gQXNPYmooYXJncyk7CisgICAgICAgIGlmIChvYmp2WzBdID09IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIG9iamMgPSAxOworICAgICAgICBUY2xfSW5jclJlZkNvdW50KG9ianZbMF0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb2JqYyA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKIAotCQlpZiAob2JqYyA+IEFSR1NaKSB7Ci0JCQlvYmp2ID0gKFRjbF9PYmogKiopY2thbGxvYyhvYmpjICogc2l6ZW9mKGNoYXIgKikpOwotCQkJaWYgKG9ianYgPT0gTlVMTCkgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJb2JqYyA9IDA7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQotCQl9CisgICAgICAgIGlmIChvYmpjID4gQVJHU1opIHsKKyAgICAgICAgICAgIG9ianYgPSAoVGNsX09iaiAqKilja2FsbG9jKG9iamMgKiBzaXplb2YoY2hhciAqKSk7CisgICAgICAgICAgICBpZiAob2JqdiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICBvYmpjID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlmb3IgKGkgPSAwOyBpIDwgb2JqYzsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqdiA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKTsKLQkJCWlmICh2ID09IFB5X05vbmUpIHsKLQkJCQlvYmpjID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW9ianZbaV0gPSBBc09iaih2KTsKLQkJCWlmICghb2JqdltpXSkgewotCQkJCS8qIFJlc2V0IG9iamMsIHNvIGl0IGF0dGVtcHRzIHRvIGNsZWFyCi0JCQkJICAgb2JqZWN0cyBvbmx5IHVwIHRvIGkuICovCi0JCQkJb2JqYyA9IGk7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQotCQkJVGNsX0luY3JSZWZDb3VudChvYmp2W2ldKTsKLQkJfQotCX0KLQkqcG9iamMgPSBvYmpjOwotCXJldHVybiBvYmp2OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqYzsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKTsKKyAgICAgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBvYmpjID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9ianZbaV0gPSBBc09iaih2KTsKKyAgICAgICAgICAgIGlmICghb2JqdltpXSkgeworICAgICAgICAgICAgICAgIC8qIFJlc2V0IG9iamMsIHNvIGl0IGF0dGVtcHRzIHRvIGNsZWFyCisgICAgICAgICAgICAgICAgICAgb2JqZWN0cyBvbmx5IHVwIHRvIGkuICovCisgICAgICAgICAgICAgICAgb2JqYyA9IGk7CisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgVGNsX0luY3JSZWZDb3VudChvYmp2W2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcG9iamMgPSBvYmpjOworICAgIHJldHVybiBvYmp2OwogZmluYWxseToKLQlUa2FwcF9DYWxsRGVhbGxvY0FyZ3Mob2Jqdiwgb2JqU3RvcmUsIG9iamMpOwotCXJldHVybiBOVUxMOworICAgIFRrYXBwX0NhbGxEZWFsbG9jQXJncyhvYmp2LCBvYmpTdG9yZSwgb2JqYyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIENvbnZlcnQgdGhlIHJlc3VsdHMgb2YgYSBjb21tYW5kIGNhbGwgaW50byBhIFB5dGhvbiBvYmplY3RzLiAqLwpAQCAtMTE4MSw0NSArMTE4MSw0NSBAQAogc3RhdGljIFB5T2JqZWN0KgogVGthcHBfQ2FsbFJlc3VsdChUa2FwcE9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlpZihzZWxmLT53YW50b2JqZWN0cykgewotCQlUY2xfT2JqICp2YWx1ZSA9IFRjbF9HZXRPYmpSZXN1bHQoc2VsZi0+aW50ZXJwKTsKLQkJLyogTm90IHN1cmUgd2hldGhlciB0aGUgSW5jclJlZiBpcyBuZWNlc3NhcnksIGJ1dCBzb21ldGhpbmcKLQkJICAgbWF5IG92ZXJ3cml0ZSB0aGUgaW50ZXJwcmV0ZXIgcmVzdWx0IHdoaWxlIHdlIGFyZQotCQkgICBjb252ZXJ0aW5nIGl0LiAqLwotCQlUY2xfSW5jclJlZkNvdW50KHZhbHVlKTsKLQkJcmVzID0gRnJvbU9iaigoUHlPYmplY3QqKXNlbGYsIHZhbHVlKTsKLQkJVGNsX0RlY3JSZWZDb3VudCh2YWx1ZSk7Ci0JfSBlbHNlIHsKLQkJY29uc3QgY2hhciAqcyA9IFRjbF9HZXRTdHJpbmdSZXN1bHQoc2VsZi0+aW50ZXJwKTsKLQkJY29uc3QgY2hhciAqcCA9IHM7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgaWYoc2VsZi0+d2FudG9iamVjdHMpIHsKKyAgICAgICAgVGNsX09iaiAqdmFsdWUgPSBUY2xfR2V0T2JqUmVzdWx0KHNlbGYtPmludGVycCk7CisgICAgICAgIC8qIE5vdCBzdXJlIHdoZXRoZXIgdGhlIEluY3JSZWYgaXMgbmVjZXNzYXJ5LCBidXQgc29tZXRoaW5nCisgICAgICAgICAgIG1heSBvdmVyd3JpdGUgdGhlIGludGVycHJldGVyIHJlc3VsdCB3aGlsZSB3ZSBhcmUKKyAgICAgICAgICAgY29udmVydGluZyBpdC4gKi8KKyAgICAgICAgVGNsX0luY3JSZWZDb3VudCh2YWx1ZSk7CisgICAgICAgIHJlcyA9IEZyb21PYmooKFB5T2JqZWN0KilzZWxmLCB2YWx1ZSk7CisgICAgICAgIFRjbF9EZWNyUmVmQ291bnQodmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBUY2xfR2V0U3RyaW5nUmVzdWx0KHNlbGYtPmludGVycCk7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBzOwogCi0JCS8qIElmIHRoZSByZXN1bHQgY29udGFpbnMgYW55IGJ5dGVzIHdpdGggdGhlIHRvcCBiaXQgc2V0LAotCQkgICBpdCdzIFVURi04IGFuZCB3ZSBzaG91bGQgZGVjb2RlIGl0IHRvIFVuaWNvZGUgKi8KKyAgICAgICAgLyogSWYgdGhlIHJlc3VsdCBjb250YWlucyBhbnkgYnl0ZXMgd2l0aCB0aGUgdG9wIGJpdCBzZXQsCisgICAgICAgICAgIGl0J3MgVVRGLTggYW5kIHdlIHNob3VsZCBkZWNvZGUgaXQgdG8gVW5pY29kZSAqLwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJd2hpbGUgKCpwICE9ICdcMCcpIHsKLQkJCWlmICgqcCAmIDB4ODApCi0JCQkJYnJlYWs7Ci0JCQlwKys7Ci0JCX0KKyAgICAgICAgd2hpbGUgKCpwICE9ICdcMCcpIHsKKyAgICAgICAgICAgIGlmICgqcCAmIDB4ODApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KIAotCQlpZiAoKnAgPT0gJ1wwJykKLQkJCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIChpbnQpKHAtcykpOwotCQllbHNlIHsKLQkJCS8qIENvbnZlcnQgVVRGLTggdG8gVW5pY29kZSBzdHJpbmcgKi8KLQkJCXAgPSBzdHJjaHIocCwgJ1wwJyk7Ci0JCQlyZXMgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCAoaW50KShwLXMpLCAic3RyaWN0Iik7Ci0JCQlpZiAocmVzID09IE5VTEwpIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIChpbnQpKHAtcykpOwotCQkJfQotCQl9CisgICAgICAgIGlmICgqcCA9PSAnXDAnKQorICAgICAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgKGludCkocC1zKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogQ29udmVydCBVVEYtOCB0byBVbmljb2RlIHN0cmluZyAqLworICAgICAgICAgICAgcCA9IHN0cmNocihwLCAnXDAnKTsKKyAgICAgICAgICAgIHJlcyA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIChpbnQpKHAtcyksICJzdHJpY3QiKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgKGludCkocC1zKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbHNlCi0JCXAgPSBzdHJjaHIocCwgJ1wwJyk7Ci0JCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIChpbnQpKHAtcykpOworICAgICAgICBwID0gc3RyY2hyKHAsICdcMCcpOworICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAoaW50KShwLXMpKTsKICNlbmRpZgotCX0KLQlyZXR1cm4gcmVzOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiBUa2FwcF9DYWxsUHJvYyBpcyB0aGUgZXZlbnQgcHJvY2VkdXJlIHRoYXQgaXMgZXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YKQEAgLTEyMjksNDEgKzEyMjksNDEgQEAKIHN0YXRpYyBpbnQKIFRrYXBwX0NhbGxQcm9jKFRrYXBwX0NhbGxFdmVudCAqZSwgaW50IGZsYWdzKQogewotCVRjbF9PYmogKm9ialN0b3JlW0FSR1NaXTsKLQlUY2xfT2JqICoqb2JqdjsKLQlpbnQgb2JqYzsKLQlpbnQgaTsKLQlFTlRFUl9QWVRIT04KLQlvYmp2ID0gVGthcHBfQ2FsbEFyZ3MoZS0+YXJncywgb2JqU3RvcmUsICZvYmpjKTsKLQlpZiAoIW9ianYpIHsKLQkJUHlFcnJfRmV0Y2goZS0+ZXhjX3R5cGUsIGUtPmV4Y192YWx1ZSwgZS0+ZXhjX3RiKTsKLQkJKihlLT5yZXMpID0gTlVMTDsKLQl9Ci0JTEVBVkVfUFlUSE9OCi0JaWYgKCFvYmp2KQotCQlnb3RvIGRvbmU7Ci0JaSA9IFRjbF9FdmFsT2JqdihlLT5zZWxmLT5pbnRlcnAsIG9iamMsIG9ianYsIGUtPmZsYWdzKTsKLQlFTlRFUl9QWVRIT04KLQlpZiAoaSA9PSBUQ0xfRVJST1IpIHsKLQkJKihlLT5yZXMpID0gTlVMTDsKLQkJKihlLT5leGNfdHlwZSkgPSBOVUxMOwotCQkqKGUtPmV4Y190YikgPSBOVUxMOwotCQkqKGUtPmV4Y192YWx1ZSkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oCi0JCQlUa2ludGVyX1RjbEVycm9yLCAicyIsCi0JCQlUY2xfR2V0U3RyaW5nUmVzdWx0KGUtPnNlbGYtPmludGVycCkpOwotCX0KLQllbHNlIHsKLQkJKihlLT5yZXMpID0gVGthcHBfQ2FsbFJlc3VsdChlLT5zZWxmKTsKLQl9Ci0JTEVBVkVfUFlUSE9OCisgICAgVGNsX09iaiAqb2JqU3RvcmVbQVJHU1pdOworICAgIFRjbF9PYmogKipvYmp2OworICAgIGludCBvYmpjOworICAgIGludCBpOworICAgIEVOVEVSX1BZVEhPTgorICAgIG9ianYgPSBUa2FwcF9DYWxsQXJncyhlLT5hcmdzLCBvYmpTdG9yZSwgJm9iamMpOworICAgIGlmICghb2JqdikgeworICAgICAgICBQeUVycl9GZXRjaChlLT5leGNfdHlwZSwgZS0+ZXhjX3ZhbHVlLCBlLT5leGNfdGIpOworICAgICAgICAqKGUtPnJlcykgPSBOVUxMOworICAgIH0KKyAgICBMRUFWRV9QWVRIT04KKyAgICBpZiAoIW9ianYpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICBpID0gVGNsX0V2YWxPYmp2KGUtPnNlbGYtPmludGVycCwgb2JqYywgb2JqdiwgZS0+ZmxhZ3MpOworICAgIEVOVEVSX1BZVEhPTgorICAgIGlmIChpID09IFRDTF9FUlJPUikgeworICAgICAgICAqKGUtPnJlcykgPSBOVUxMOworICAgICAgICAqKGUtPmV4Y190eXBlKSA9IE5VTEw7CisgICAgICAgICooZS0+ZXhjX3RiKSA9IE5VTEw7CisgICAgICAgICooZS0+ZXhjX3ZhbHVlKSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigKKyAgICAgICAgICAgIFRraW50ZXJfVGNsRXJyb3IsICJzIiwKKyAgICAgICAgICAgIFRjbF9HZXRTdHJpbmdSZXN1bHQoZS0+c2VsZi0+aW50ZXJwKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAqKGUtPnJlcykgPSBUa2FwcF9DYWxsUmVzdWx0KGUtPnNlbGYpOworICAgIH0KKyAgICBMRUFWRV9QWVRIT04KIAotCVRrYXBwX0NhbGxEZWFsbG9jQXJncyhvYmp2LCBvYmpTdG9yZSwgb2JqYyk7CisgICAgVGthcHBfQ2FsbERlYWxsb2NBcmdzKG9ianYsIG9ialN0b3JlLCBvYmpjKTsKIGRvbmU6Ci0JLyogV2FrZSB1cCBjYWxsaW5nIHRocmVhZC4gKi8KLQlUY2xfTXV0ZXhMb2NrKCZjYWxsX211dGV4KTsKLQlUY2xfQ29uZGl0aW9uTm90aWZ5KCZlLT5kb25lKTsKLQlUY2xfTXV0ZXhVbmxvY2soJmNhbGxfbXV0ZXgpOwotCXJldHVybiAxOworICAgIC8qIFdha2UgdXAgY2FsbGluZyB0aHJlYWQuICovCisgICAgVGNsX011dGV4TG9jaygmY2FsbF9tdXRleCk7CisgICAgVGNsX0NvbmRpdGlvbk5vdGlmeSgmZS0+ZG9uZSk7CisgICAgVGNsX011dGV4VW5sb2NrKCZjYWxsX211dGV4KTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgY2FsbGluZyBhIFRjbCBjb21tYW5kLgpAQCAtMTI4MSw3MTEgKzEyODEsNzExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfQ2FsbChQeU9iamVjdCAqc2VsZnB0ciwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JVGNsX09iaiAqb2JqU3RvcmVbQVJHU1pdOwotCVRjbF9PYmogKipvYmp2ID0gTlVMTDsKLQlpbnQgb2JqYywgaTsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKLQlpbnQgZmxhZ3MgPSBUQ0xfRVZBTF9ESVJFQ1QgfCBUQ0xfRVZBTF9HTE9CQUw7CisgICAgVGNsX09iaiAqb2JqU3RvcmVbQVJHU1pdOworICAgIFRjbF9PYmogKipvYmp2ID0gTlVMTDsKKyAgICBpbnQgb2JqYywgaTsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKKyAgICBpbnQgZmxhZ3MgPSBUQ0xfRVZBTF9ESVJFQ1QgfCBUQ0xfRVZBTF9HTE9CQUw7CiAKLQkvKiBJZiBhcmdzIGlzIGEgc2luZ2xlIHR1cGxlLCByZXBsYWNlIHdpdGggY29udGVudHMgb2YgdHVwbGUgKi8KLQlpZiAoMSA9PSBQeVR1cGxlX1NpemUoYXJncykpewotCQlQeU9iamVjdCogaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLQkJaWYgKFB5VHVwbGVfQ2hlY2soaXRlbSkpCi0JCQlhcmdzID0gaXRlbTsKLQl9CisgICAgLyogSWYgYXJncyBpcyBhIHNpbmdsZSB0dXBsZSwgcmVwbGFjZSB3aXRoIGNvbnRlbnRzIG9mIHR1cGxlICovCisgICAgaWYgKDEgPT0gUHlUdXBsZV9TaXplKGFyZ3MpKXsKKyAgICAgICAgUHlPYmplY3QqIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKGl0ZW0pKQorICAgICAgICAgICAgYXJncyA9IGl0ZW07CisgICAgfQogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpKSB7Ci0JCS8qIFdlIGNhbm5vdCBjYWxsIHRoZSBjb21tYW5kIGRpcmVjdGx5LiBJbnN0ZWFkLCB3ZSBtdXN0Ci0JCSAgIG1hcnNoYWwgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIGludGVycHJldGVyIHRocmVhZC4gKi8KLQkJVGthcHBfQ2FsbEV2ZW50ICpldjsKLQkJUHlPYmplY3QgKmV4Y190eXBlLCAqZXhjX3ZhbHVlLCAqZXhjX3RiOwotCQlpZiAoIVdhaXRGb3JNYWlubG9vcChzZWxmKSkKLQkJCXJldHVybiBOVUxMOwotCQlldiA9IChUa2FwcF9DYWxsRXZlbnQqKWNrYWxsb2Moc2l6ZW9mKFRrYXBwX0NhbGxFdmVudCkpOwotCQlldi0+ZXYucHJvYyA9IChUY2xfRXZlbnRQcm9jKilUa2FwcF9DYWxsUHJvYzsKLQkJZXYtPnNlbGYgPSBzZWxmOwotCQlldi0+YXJncyA9IGFyZ3M7Ci0JCWV2LT5yZXMgPSAmcmVzOwotCQlldi0+ZXhjX3R5cGUgPSAmZXhjX3R5cGU7Ci0JCWV2LT5leGNfdmFsdWUgPSAmZXhjX3ZhbHVlOwotCQlldi0+ZXhjX3RiID0gJmV4Y190YjsKLQkJZXYtPmRvbmUgPSAoVGNsX0NvbmRpdGlvbikwOworICAgIGlmIChzZWxmLT50aHJlYWRlZCAmJiBzZWxmLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICAvKiBXZSBjYW5ub3QgY2FsbCB0aGUgY29tbWFuZCBkaXJlY3RseS4gSW5zdGVhZCwgd2UgbXVzdAorICAgICAgICAgICBtYXJzaGFsIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBpbnRlcnByZXRlciB0aHJlYWQuICovCisgICAgICAgIFRrYXBwX0NhbGxFdmVudCAqZXY7CisgICAgICAgIFB5T2JqZWN0ICpleGNfdHlwZSwgKmV4Y192YWx1ZSwgKmV4Y190YjsKKyAgICAgICAgaWYgKCFXYWl0Rm9yTWFpbmxvb3Aoc2VsZikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZXYgPSAoVGthcHBfQ2FsbEV2ZW50Kilja2FsbG9jKHNpemVvZihUa2FwcF9DYWxsRXZlbnQpKTsKKyAgICAgICAgZXYtPmV2LnByb2MgPSAoVGNsX0V2ZW50UHJvYyopVGthcHBfQ2FsbFByb2M7CisgICAgICAgIGV2LT5zZWxmID0gc2VsZjsKKyAgICAgICAgZXYtPmFyZ3MgPSBhcmdzOworICAgICAgICBldi0+cmVzID0gJnJlczsKKyAgICAgICAgZXYtPmV4Y190eXBlID0gJmV4Y190eXBlOworICAgICAgICBldi0+ZXhjX3ZhbHVlID0gJmV4Y192YWx1ZTsKKyAgICAgICAgZXYtPmV4Y190YiA9ICZleGNfdGI7CisgICAgICAgIGV2LT5kb25lID0gKFRjbF9Db25kaXRpb24pMDsKIAotCQlUa2FwcF9UaHJlYWRTZW5kKHNlbGYsIChUY2xfRXZlbnQqKWV2LCAmZXYtPmRvbmUsICZjYWxsX211dGV4KTsKKyAgICAgICAgVGthcHBfVGhyZWFkU2VuZChzZWxmLCAoVGNsX0V2ZW50KilldiwgJmV2LT5kb25lLCAmY2FsbF9tdXRleCk7CiAKLQkJaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCQlpZiAoZXhjX3R5cGUpCi0JCQkJUHlFcnJfUmVzdG9yZShleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdGIpOwotCQkJZWxzZQotCQkJCVB5RXJyX1NldE9iamVjdChUa2ludGVyX1RjbEVycm9yLCBleGNfdmFsdWUpOwotCQl9Ci0JfQotCWVsc2UgCisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGV4Y190eXBlKQorICAgICAgICAgICAgICAgIFB5RXJyX1Jlc3RvcmUoZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoVGtpbnRlcl9UY2xFcnJvciwgZXhjX3ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCiAjZW5kaWYKLQl7CisgICAgewogCi0JCW9ianYgPSBUa2FwcF9DYWxsQXJncyhhcmdzLCBvYmpTdG9yZSwgJm9iamMpOwotCQlpZiAoIW9ianYpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgb2JqdiA9IFRrYXBwX0NhbGxBcmdzKGFyZ3MsIG9ialN0b3JlLCAmb2JqYyk7CisgICAgICAgIGlmICghb2JqdikKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCUVOVEVSX1RDTAorICAgICAgICBFTlRFUl9UQ0wKIAotCQlpID0gVGNsX0V2YWxPYmp2KHNlbGYtPmludGVycCwgb2JqYywgb2JqdiwgZmxhZ3MpOworICAgICAgICBpID0gVGNsX0V2YWxPYmp2KHNlbGYtPmludGVycCwgb2JqYywgb2JqdiwgZmxhZ3MpOwogCi0JCUVOVEVSX09WRVJMQVAKKyAgICAgICAgRU5URVJfT1ZFUkxBUAogCi0JCWlmIChpID09IFRDTF9FUlJPUikKLQkJCVRraW50ZXJfRXJyb3Ioc2VsZnB0cik7Ci0JCWVsc2UKLQkJCXJlcyA9IFRrYXBwX0NhbGxSZXN1bHQoc2VsZik7CisgICAgICAgIGlmIChpID09IFRDTF9FUlJPUikKKyAgICAgICAgICAgIFRraW50ZXJfRXJyb3Ioc2VsZnB0cik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFRrYXBwX0NhbGxSZXN1bHQoc2VsZik7CiAKLQkJTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICAgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKIAotCQlUa2FwcF9DYWxsRGVhbGxvY0FyZ3Mob2Jqdiwgb2JqU3RvcmUsIG9iamMpOwotCX0KLQlyZXR1cm4gcmVzOworICAgICAgICBUa2FwcF9DYWxsRGVhbGxvY0FyZ3Mob2Jqdiwgb2JqU3RvcmUsIG9iamMpOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HbG9iYWxDYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQkvKiBDb3VsZCBkbyB0aGUgc2FtZSBoZXJlIGFzIGZvciBUa2FwcF9DYWxsKCksIGJ1dCB0aGlzIGlzIG5vdCB1c2VkCi0JICAgbXVjaCwgc28gSSBjYW4ndCBiZSBib3RoZXJlZC4gIFVuZm9ydHVuYXRlbHkgVGNsIGRvZXNuJ3QgZXhwb3J0IGEKLQkgICB3YXkgZm9yIHRoZSB1c2VyIHRvIGRvIHdoYXQgYWxsIGl0cyBHbG9iYWwqIHZhcmlhbnRzIGRvIChzYXZlIGFuZAotCSAgIHJlc2V0IHRoZSBzY29wZSBwb2ludGVyLCBjYWxsIHRoZSBsb2NhbCB2ZXJzaW9uLCByZXN0b3JlIHRoZSBzYXZlZAotCSAgIHNjb3BlIHBvaW50ZXIpLiAqLworICAgIC8qIENvdWxkIGRvIHRoZSBzYW1lIGhlcmUgYXMgZm9yIFRrYXBwX0NhbGwoKSwgYnV0IHRoaXMgaXMgbm90IHVzZWQKKyAgICAgICBtdWNoLCBzbyBJIGNhbid0IGJlIGJvdGhlcmVkLiAgVW5mb3J0dW5hdGVseSBUY2wgZG9lc24ndCBleHBvcnQgYQorICAgICAgIHdheSBmb3IgdGhlIHVzZXIgdG8gZG8gd2hhdCBhbGwgaXRzIEdsb2JhbCogdmFyaWFudHMgZG8gKHNhdmUgYW5kCisgICAgICAgcmVzZXQgdGhlIHNjb3BlIHBvaW50ZXIsIGNhbGwgdGhlIGxvY2FsIHZlcnNpb24sIHJlc3RvcmUgdGhlIHNhdmVkCisgICAgICAgc2NvcGUgcG9pbnRlcikuICovCiAKLQljaGFyICpjbWQ7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgY2hhciAqY21kOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogCi0JQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CiAKLQljbWQgID0gTWVyZ2UoYXJncyk7Ci0JaWYgKGNtZCkgewotCQlpbnQgZXJyOwotCQlFTlRFUl9UQ0wKLQkJZXJyID0gVGNsX0dsb2JhbEV2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBjbWQpOwotCQlFTlRFUl9PVkVSTEFQCi0JCWlmIChlcnIgPT0gVENMX0VSUk9SKQotCQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQkJZWxzZQotCQkJcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhUa2FwcF9SZXN1bHQoc2VsZikpOwotCQlMRUFWRV9PVkVSTEFQX1RDTAotCQlja2ZyZWUoY21kKTsKLQl9CisgICAgY21kICA9IE1lcmdlKGFyZ3MpOworICAgIGlmIChjbWQpIHsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgRU5URVJfVENMCisgICAgICAgIGVyciA9IFRjbF9HbG9iYWxFdmFsKFRrYXBwX0ludGVycChzZWxmKSwgY21kKTsKKyAgICAgICAgRU5URVJfT1ZFUkxBUAorICAgICAgICBpZiAoZXJyID09IFRDTF9FUlJPUikKKyAgICAgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKKyAgICAgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICAgICAgY2tmcmVlKGNtZCk7CisgICAgfQogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfRXZhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc2NyaXB0OwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCBlcnI7CisgICAgY2hhciAqc2NyaXB0OworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXZhbCIsICZzY3JpcHQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXZhbCIsICZzY3JpcHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCi0JRU5URVJfVENMCi0JZXJyID0gVGNsX0V2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBzY3JpcHQpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAoZXJyID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQllbHNlCi0JCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKLQlMRUFWRV9PVkVSTEFQX1RDTAotCXJldHVybiByZXM7CisgICAgRU5URVJfVENMCisgICAgZXJyID0gVGNsX0V2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBzY3JpcHQpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAoZXJyID09IFRDTF9FUlJPUikKKyAgICAgICAgcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKKyAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HbG9iYWxFdmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzY3JpcHQ7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JaW50IGVycjsKKyAgICBjaGFyICpzY3JpcHQ7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgaW50IGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnbG9iYWxldmFsIiwgJnNjcmlwdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnbG9iYWxldmFsIiwgJnNjcmlwdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CiAKLQlFTlRFUl9UQ0wKLQllcnIgPSBUY2xfR2xvYmFsRXZhbChUa2FwcF9JbnRlcnAoc2VsZiksIHNjcmlwdCk7Ci0JRU5URVJfT1ZFUkxBUAotCWlmIChlcnIgPT0gVENMX0VSUk9SKQotCQlyZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOwotCWVsc2UKLQkJcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhUa2FwcF9SZXN1bHQoc2VsZikpOwotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBFTlRFUl9UQ0wKKyAgICBlcnIgPSBUY2xfR2xvYmFsRXZhbChUa2FwcF9JbnRlcnAoc2VsZiksIHNjcmlwdCk7CisgICAgRU5URVJfT1ZFUkxBUAorICAgIGlmIChlcnIgPT0gVENMX0VSUk9SKQorICAgICAgICByZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhUa2FwcF9SZXN1bHQoc2VsZikpOworICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0V2YWxGaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmaWxlTmFtZTsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlpbnQgZXJyOworICAgIGNoYXIgKmZpbGVOYW1lOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXZhbGZpbGUiLCAmZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXZhbGZpbGUiLCAmZmlsZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCi0JRU5URVJfVENMCi0JZXJyID0gVGNsX0V2YWxGaWxlKFRrYXBwX0ludGVycChzZWxmKSwgZmlsZU5hbWUpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAoZXJyID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICBFTlRFUl9UQ0wKKyAgICBlcnIgPSBUY2xfRXZhbEZpbGUoVGthcHBfSW50ZXJwKHNlbGYpLCBmaWxlTmFtZSk7CisgICAgRU5URVJfT1ZFUkxBUAorICAgIGlmIChlcnIgPT0gVENMX0VSUk9SKQorICAgICAgICByZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOwogCi0JZWxzZQotCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRrYXBwX1Jlc3VsdChzZWxmKSk7Ci0JTEVBVkVfT1ZFUkxBUF9UQ0wKLQlyZXR1cm4gcmVzOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhUa2FwcF9SZXN1bHQoc2VsZikpOworICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1JlY29yZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc2NyaXB0OwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCBlcnI7CisgICAgY2hhciAqc2NyaXB0OworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc2NyaXB0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnNjcmlwdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CiAKLQlFTlRFUl9UQ0wKLQllcnIgPSBUY2xfUmVjb3JkQW5kRXZhbChUa2FwcF9JbnRlcnAoc2VsZiksIHNjcmlwdCwgVENMX05PX0VWQUwpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAoZXJyID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQllbHNlCi0JCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGthcHBfUmVzdWx0KHNlbGYpKTsKLQlMRUFWRV9PVkVSTEFQX1RDTAotCXJldHVybiByZXM7CisgICAgRU5URVJfVENMCisgICAgZXJyID0gVGNsX1JlY29yZEFuZEV2YWwoVGthcHBfSW50ZXJwKHNlbGYpLCBzY3JpcHQsIFRDTF9OT19FVkFMKTsKKyAgICBFTlRFUl9PVkVSTEFQCisgICAgaWYgKGVyciA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFRrYXBwX1Jlc3VsdChzZWxmKSk7CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfQWRkRXJyb3JJbmZvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICptc2c7CisgICAgY2hhciAqbXNnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmFkZGVycm9yaW5mbyIsICZtc2cpKQotCQlyZXR1cm4gTlVMTDsKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6YWRkZXJyb3JpbmZvIiwgJm1zZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCi0JRU5URVJfVENMCi0JVGNsX0FkZEVycm9ySW5mbyhUa2FwcF9JbnRlcnAoc2VsZiksIG1zZyk7Ci0JTEVBVkVfVENMCisgICAgRU5URVJfVENMCisgICAgVGNsX0FkZEVycm9ySW5mbyhUa2FwcF9JbnRlcnAoc2VsZiksIG1zZyk7CisgICAgTEVBVkVfVENMCiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLQwKKwogLyoqIFRjbCBWYXJpYWJsZSAqKi8KIAogVENMX0RFQ0xBUkVfTVVURVgodmFyX211dGV4KQogCiB0eXBlZGVmIFB5T2JqZWN0KiAoKkV2ZW50RnVuYykoUHlPYmplY3QqLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKTsKIHR5cGVkZWYgc3RydWN0IFZhckV2ZW50IHsKLQlUY2xfRXZlbnQgZXY7IC8qIG11c3QgYmUgZmlyc3QgKi8KLQlQeU9iamVjdCAqc2VsZjsKLQlQeU9iamVjdCAqYXJnczsKLQlpbnQgZmxhZ3M7Ci0JRXZlbnRGdW5jIGZ1bmM7Ci0JUHlPYmplY3QgKipyZXM7Ci0JUHlPYmplY3QgKipleGNfdHlwZTsKLQlQeU9iamVjdCAqKmV4Y192YWw7Ci0JVGNsX0NvbmRpdGlvbiBjb25kOworICAgIFRjbF9FdmVudCBldjsgLyogbXVzdCBiZSBmaXJzdCAqLworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIGludCBmbGFnczsKKyAgICBFdmVudEZ1bmMgZnVuYzsKKyAgICBQeU9iamVjdCAqKnJlczsKKyAgICBQeU9iamVjdCAqKmV4Y190eXBlOworICAgIFB5T2JqZWN0ICoqZXhjX3ZhbDsKKyAgICBUY2xfQ29uZGl0aW9uIGNvbmQ7CiB9IFZhckV2ZW50OwogCiBzdGF0aWMgaW50CiB2YXJuYW1lX2NvbnZlcnRlcihQeU9iamVjdCAqaW4sIHZvaWQgKl9vdXQpCiB7Ci0JY2hhciAqKm91dCA9IChjaGFyKiopX291dDsKLQlpZiAoUHlTdHJpbmdfQ2hlY2soaW4pKSB7Ci0JCSpvdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhpbik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoUHlUY2xPYmplY3RfQ2hlY2soaW4pKSB7Ci0JCSpvdXQgPSBQeVRjbE9iamVjdF9UY2xTdHJpbmcoaW4pOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogWFhYOiBTaG91bGQgZ2l2ZSBkaWFnbm9zdGljcy4gKi8KLQlyZXR1cm4gMDsKLX0JCisgICAgY2hhciAqKm91dCA9IChjaGFyKiopX291dDsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soaW4pKSB7CisgICAgICAgICpvdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhpbik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlUY2xPYmplY3RfQ2hlY2soaW4pKSB7CisgICAgICAgICpvdXQgPSBQeVRjbE9iamVjdF9UY2xTdHJpbmcoaW4pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogWFhYOiBTaG91bGQgZ2l2ZSBkaWFnbm9zdGljcy4gKi8KKyAgICByZXR1cm4gMDsKK30KIAogc3RhdGljIHZvaWQKIHZhcl9wZXJmb3JtKFZhckV2ZW50ICpldikKIHsKLQkqKGV2LT5yZXMpID0gZXYtPmZ1bmMoZXYtPnNlbGYsIGV2LT5hcmdzLCBldi0+ZmxhZ3MpOwotCWlmICghKihldi0+cmVzKSkgewotCQlQeU9iamVjdCAqZXhjLCAqdmFsLCAqdGI7Ci0JCVB5RXJyX0ZldGNoKCZleGMsICZ2YWwsICZ0Yik7Ci0JCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmZXhjLCAmdmFsLCAmdGIpOwotCQkqKGV2LT5leGNfdHlwZSkgPSBleGM7Ci0JCSooZXYtPmV4Y192YWwpID0gdmFsOwotCQlQeV9ERUNSRUYodGIpOwotCX0KLQkJCisgICAgKihldi0+cmVzKSA9IGV2LT5mdW5jKGV2LT5zZWxmLCBldi0+YXJncywgZXYtPmZsYWdzKTsKKyAgICBpZiAoISooZXYtPnJlcykpIHsKKyAgICAgICAgUHlPYmplY3QgKmV4YywgKnZhbCwgKnRiOworICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOworICAgICAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJmV4YywgJnZhbCwgJnRiKTsKKyAgICAgICAgKihldi0+ZXhjX3R5cGUpID0gZXhjOworICAgICAgICAqKGV2LT5leGNfdmFsKSA9IHZhbDsKKyAgICAgICAgUHlfREVDUkVGKHRiKTsKKyAgICB9CisKIH0KIAogc3RhdGljIGludAogdmFyX3Byb2MoVmFyRXZlbnQqIGV2LCBpbnQgZmxhZ3MpCiB7Ci0JRU5URVJfUFlUSE9OCi0gICAgICAgIHZhcl9wZXJmb3JtKGV2KTsKLQlUY2xfTXV0ZXhMb2NrKCZ2YXJfbXV0ZXgpOwotCVRjbF9Db25kaXRpb25Ob3RpZnkoJmV2LT5jb25kKTsKLQlUY2xfTXV0ZXhVbmxvY2soJnZhcl9tdXRleCk7Ci0JTEVBVkVfUFlUSE9OCi0JcmV0dXJuIDE7CisgICAgRU5URVJfUFlUSE9OCisgICAgdmFyX3BlcmZvcm0oZXYpOworICAgIFRjbF9NdXRleExvY2soJnZhcl9tdXRleCk7CisgICAgVGNsX0NvbmRpdGlvbk5vdGlmeSgmZXYtPmNvbmQpOworICAgIFRjbF9NdXRleFVubG9jaygmdmFyX211dGV4KTsKKyAgICBMRUFWRV9QWVRIT04KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogdmFyX2ludm9rZShFdmVudEZ1bmMgZnVuYywgUHlPYmplY3QgKnNlbGZwdHIsIFB5T2JqZWN0ICphcmdzLCBpbnQgZmxhZ3MpCiB7Ci0JVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7CisgICAgVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+dGhyZWFkZWQgJiYgc2VsZi0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkpIHsKLQkJVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7Ci0JCVZhckV2ZW50ICpldjsKLQkJUHlPYmplY3QgKnJlcywgKmV4Y190eXBlLCAqZXhjX3ZhbDsKLQkJCi0JCS8qIFRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgdGhlIGludGVycHJldGVyIHRocmVhZC4gIE1hcnNoYWwKLQkJICAgdGhlIGNhbGwgdG8gdGhlIGludGVycHJldGVyIHRocmVhZCwgdGhlbiB3YWl0IGZvcgotCQkgICBjb21wbGV0aW9uLiAqLwotCQlpZiAoIVdhaXRGb3JNYWlubG9vcChzZWxmKSkKLQkJCXJldHVybiBOVUxMOworICAgIGlmIChzZWxmLT50aHJlYWRlZCAmJiBzZWxmLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICBUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKKyAgICAgICAgVmFyRXZlbnQgKmV2OworICAgICAgICBQeU9iamVjdCAqcmVzLCAqZXhjX3R5cGUsICpleGNfdmFsOwogCi0JCWV2ID0gKFZhckV2ZW50Kilja2FsbG9jKHNpemVvZihWYXJFdmVudCkpOworICAgICAgICAvKiBUaGUgY3VycmVudCB0aHJlYWQgaXMgbm90IHRoZSBpbnRlcnByZXRlciB0aHJlYWQuICBNYXJzaGFsCisgICAgICAgICAgIHRoZSBjYWxsIHRvIHRoZSBpbnRlcnByZXRlciB0aHJlYWQsIHRoZW4gd2FpdCBmb3IKKyAgICAgICAgICAgY29tcGxldGlvbi4gKi8KKyAgICAgICAgaWYgKCFXYWl0Rm9yTWFpbmxvb3Aoc2VsZikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlldi0+c2VsZiA9IHNlbGZwdHI7Ci0JCWV2LT5hcmdzID0gYXJnczsKLQkJZXYtPmZsYWdzID0gZmxhZ3M7Ci0JCWV2LT5mdW5jID0gZnVuYzsKLQkJZXYtPnJlcyA9ICZyZXM7Ci0JCWV2LT5leGNfdHlwZSA9ICZleGNfdHlwZTsKLQkJZXYtPmV4Y192YWwgPSAmZXhjX3ZhbDsKLQkJZXYtPmNvbmQgPSBOVUxMOwotCQlldi0+ZXYucHJvYyA9IChUY2xfRXZlbnRQcm9jKil2YXJfcHJvYzsKLQkJVGthcHBfVGhyZWFkU2VuZChzZWxmLCAoVGNsX0V2ZW50KilldiwgJmV2LT5jb25kLCAmdmFyX211dGV4KTsKLQkJaWYgKCFyZXMpIHsKLQkJCVB5RXJyX1NldE9iamVjdChleGNfdHlwZSwgZXhjX3ZhbCk7Ci0JCQlQeV9ERUNSRUYoZXhjX3R5cGUpOwotCQkJUHlfREVDUkVGKGV4Y192YWwpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9CisgICAgICAgIGV2ID0gKFZhckV2ZW50Kilja2FsbG9jKHNpemVvZihWYXJFdmVudCkpOworCisgICAgICAgIGV2LT5zZWxmID0gc2VsZnB0cjsKKyAgICAgICAgZXYtPmFyZ3MgPSBhcmdzOworICAgICAgICBldi0+ZmxhZ3MgPSBmbGFnczsKKyAgICAgICAgZXYtPmZ1bmMgPSBmdW5jOworICAgICAgICBldi0+cmVzID0gJnJlczsKKyAgICAgICAgZXYtPmV4Y190eXBlID0gJmV4Y190eXBlOworICAgICAgICBldi0+ZXhjX3ZhbCA9ICZleGNfdmFsOworICAgICAgICBldi0+Y29uZCA9IE5VTEw7CisgICAgICAgIGV2LT5ldi5wcm9jID0gKFRjbF9FdmVudFByb2MqKXZhcl9wcm9jOworICAgICAgICBUa2FwcF9UaHJlYWRTZW5kKHNlbGYsIChUY2xfRXZlbnQqKWV2LCAmZXYtPmNvbmQsICZ2YXJfbXV0ZXgpOworICAgICAgICBpZiAoIXJlcykgeworICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KGV4Y190eXBlLCBleGNfdmFsKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihleGNfdHlwZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXhjX3ZhbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KICNlbmRpZgotICAgICAgICAvKiBUY2wgaXMgbm90IHRocmVhZGVkLCBvciB0aGlzIGlzIHRoZSBpbnRlcnByZXRlciB0aHJlYWQuICovCi0JcmV0dXJuIGZ1bmMoc2VsZnB0ciwgYXJncywgZmxhZ3MpOworICAgIC8qIFRjbCBpcyBub3QgdGhyZWFkZWQsIG9yIHRoaXMgaXMgdGhlIGludGVycHJldGVyIHRocmVhZC4gKi8KKyAgICByZXR1cm4gZnVuYyhzZWxmcHRyLCBhcmdzLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBTZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgZmxhZ3MpCiB7Ci0JY2hhciAqbmFtZTEsICpuYW1lMjsKLQlQeU9iamVjdCAqbmV3VmFsdWU7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JVGNsX09iaiAqbmV3dmFsLCAqb2s7CisgICAgY2hhciAqbmFtZTEsICpuYW1lMjsKKyAgICBQeU9iamVjdCAqbmV3VmFsdWU7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgVGNsX09iaiAqbmV3dmFsLCAqb2s7CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPOnNldHZhciIsIAotCQkJICAgICB2YXJuYW1lX2NvbnZlcnRlciwgJm5hbWUxLCAmbmV3VmFsdWUpKSB7Ci0JCS8qIFhYWCBBY3F1aXJlIHRjbCBsb2NrPz8/ICovCi0JCW5ld3ZhbCA9IEFzT2JqKG5ld1ZhbHVlKTsKLQkJaWYgKG5ld3ZhbCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCUVOVEVSX1RDTAotCQlvayA9IFRjbF9TZXRWYXIyRXgoVGthcHBfSW50ZXJwKHNlbGYpLCBuYW1lMSwgTlVMTCwgCi0JCQkJICAgbmV3dmFsLCBmbGFncyk7Ci0JCUVOVEVSX09WRVJMQVAKLQkJaWYgKCFvaykKLQkJCVRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JCWVsc2UgewotCQkJcmVzID0gUHlfTm9uZTsKLQkJCVB5X0lOQ1JFRihyZXMpOwotCQl9Ci0JCUxFQVZFX09WRVJMQVBfVENMCi0JfQotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3NPOnNldHZhciIsCi0JCQkJICAgICAmbmFtZTEsICZuYW1lMiwgJm5ld1ZhbHVlKSkgewotCQkJLyogWFhYIG11c3QgaG9sZCB0Y2wgbG9jayBhbHJlYWR5Pz8/ICovCi0JCQluZXd2YWwgPSBBc09iaihuZXdWYWx1ZSk7Ci0JCQlFTlRFUl9UQ0wKLQkJCW9rID0gVGNsX1NldFZhcjJFeChUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgbmV3dmFsLCBmbGFncyk7Ci0JCQlFTlRFUl9PVkVSTEFQCi0JCQlpZiAoIW9rKQotCQkJCVRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JCQllbHNlIHsKLQkJCQlyZXMgPSBQeV9Ob25lOwotCQkJCVB5X0lOQ1JFRihyZXMpOwotCQkJfQotCQkJTEVBVkVfT1ZFUkxBUF9UQ0wKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiByZXM7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTzpzZXR2YXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhcm5hbWVfY29udmVydGVyLCAmbmFtZTEsICZuZXdWYWx1ZSkpIHsKKyAgICAgICAgLyogWFhYIEFjcXVpcmUgdGNsIGxvY2s/Pz8gKi8KKyAgICAgICAgbmV3dmFsID0gQXNPYmoobmV3VmFsdWUpOworICAgICAgICBpZiAobmV3dmFsID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgRU5URVJfVENMCisgICAgICAgIG9rID0gVGNsX1NldFZhcjJFeChUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsLCBmbGFncyk7CisgICAgICAgIEVOVEVSX09WRVJMQVAKKyAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgIFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICB9CisgICAgICAgIExFQVZFX09WRVJMQVBfVENMCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3NPOnNldHZhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lMSwgJm5hbWUyLCAmbmV3VmFsdWUpKSB7CisgICAgICAgICAgICAvKiBYWFggbXVzdCBob2xkIHRjbCBsb2NrIGFscmVhZHk/Pz8gKi8KKyAgICAgICAgICAgIG5ld3ZhbCA9IEFzT2JqKG5ld1ZhbHVlKTsKKyAgICAgICAgICAgIEVOVEVSX1RDTAorICAgICAgICAgICAgb2sgPSBUY2xfU2V0VmFyMkV4KFRrYXBwX0ludGVycChzZWxmKSwgbmFtZTEsIG5hbWUyLCBuZXd2YWwsIGZsYWdzKTsKKyAgICAgICAgICAgIEVOVEVSX09WRVJMQVAKKyAgICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IFB5X05vbmU7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1NldFZhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHZhcl9pbnZva2UoU2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyk7CisgICAgcmV0dXJuIHZhcl9pbnZva2UoU2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HbG9iYWxTZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiB2YXJfaW52b2tlKFNldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cgfCBUQ0xfR0xPQkFMX09OTFkpOworICAgIHJldHVybiB2YXJfaW52b2tlKFNldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cgfCBUQ0xfR0xPQkFMX09OTFkpOwogfQogCiAKLQwKKwogc3RhdGljIFB5T2JqZWN0ICoKIEdldFZhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBmbGFncykKIHsKLQljaGFyICpuYW1lMSwgKm5hbWUyPU5VTEw7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JVGNsX09iaiAqdHJlczsKKyAgICBjaGFyICpuYW1lMSwgKm5hbWUyPU5VTEw7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgVGNsX09iaiAqdHJlczsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ8czpnZXR2YXIiLCAKLQkJCSAgICAgIHZhcm5hbWVfY29udmVydGVyLCAmbmFtZTEsICZuYW1lMikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ8czpnZXR2YXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJuYW1lX2NvbnZlcnRlciwgJm5hbWUxLCAmbmFtZTIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUVOVEVSX1RDTAotCXRyZXMgPSBUY2xfR2V0VmFyMkV4KFRrYXBwX0ludGVycChzZWxmKSwgbmFtZTEsIG5hbWUyLCBmbGFncyk7Ci0JRU5URVJfT1ZFUkxBUAotCWlmICh0cmVzID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsIFRjbF9HZXRTdHJpbmdSZXN1bHQoVGthcHBfSW50ZXJwKHNlbGYpKSk7Ci0JfSBlbHNlIHsKLQkJaWYgKCgoVGthcHBPYmplY3QqKXNlbGYpLT53YW50b2JqZWN0cykgewotCQkJcmVzID0gRnJvbU9iaihzZWxmLCB0cmVzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGNsX0dldFN0cmluZyh0cmVzKSk7Ci0JCX0KLQl9Ci0JTEVBVkVfT1ZFUkxBUF9UQ0wKLQlyZXR1cm4gcmVzOworICAgIEVOVEVSX1RDTAorICAgIHRyZXMgPSBUY2xfR2V0VmFyMkV4KFRrYXBwX0ludGVycChzZWxmKSwgbmFtZTEsIG5hbWUyLCBmbGFncyk7CisgICAgRU5URVJfT1ZFUkxBUAorICAgIGlmICh0cmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsIFRjbF9HZXRTdHJpbmdSZXN1bHQoVGthcHBfSW50ZXJwKHNlbGYpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCgoVGthcHBPYmplY3QqKXNlbGYpLT53YW50b2JqZWN0cykgeworICAgICAgICAgICAgcmVzID0gRnJvbU9iaihzZWxmLCB0cmVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoVGNsX0dldFN0cmluZyh0cmVzKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gdmFyX2ludm9rZShHZXRWYXIsIHNlbGYsIGFyZ3MsIFRDTF9MRUFWRV9FUlJfTVNHKTsKKyAgICByZXR1cm4gdmFyX2ludm9rZShHZXRWYXIsIHNlbGYsIGFyZ3MsIFRDTF9MRUFWRV9FUlJfTVNHKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0dsb2JhbEdldFZhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHZhcl9pbnZva2UoR2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyB8IFRDTF9HTE9CQUxfT05MWSk7CisgICAgcmV0dXJuIHZhcl9pbnZva2UoR2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyB8IFRDTF9HTE9CQUxfT05MWSk7CiB9CiAKIAotDAorCiBzdGF0aWMgUHlPYmplY3QgKgogVW5zZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgZmxhZ3MpCiB7Ci0JY2hhciAqbmFtZTEsICpuYW1lMj1OVUxMOwotCWludCBjb2RlOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGNoYXIgKm5hbWUxLCAqbmFtZTI9TlVMTDsKKyAgICBpbnQgY29kZTsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOnVuc2V0dmFyIiwgJm5hbWUxLCAmbmFtZTIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8czp1bnNldHZhciIsICZuYW1lMSwgJm5hbWUyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlFTlRFUl9UQ0wKLQljb2RlID0gVGNsX1Vuc2V0VmFyMihUa2FwcF9JbnRlcnAoc2VsZiksIG5hbWUxLCBuYW1lMiwgZmxhZ3MpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAoY29kZSA9PSBUQ0xfRVJST1IpCi0JCXJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmVzID0gUHlfTm9uZTsKLQl9Ci0JTEVBVkVfT1ZFUkxBUF9UQ0wKLQlyZXR1cm4gcmVzOworICAgIEVOVEVSX1RDTAorICAgIGNvZGUgPSBUY2xfVW5zZXRWYXIyKFRrYXBwX0ludGVycChzZWxmKSwgbmFtZTEsIG5hbWUyLCBmbGFncyk7CisgICAgRU5URVJfT1ZFUkxBUAorICAgIGlmIChjb2RlID09IFRDTF9FUlJPUikKKyAgICAgICAgcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXMgPSBQeV9Ob25lOworICAgIH0KKyAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9VbnNldFZhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHZhcl9pbnZva2UoVW5zZXRWYXIsIHNlbGYsIGFyZ3MsIFRDTF9MRUFWRV9FUlJfTVNHKTsKKyAgICByZXR1cm4gdmFyX2ludm9rZShVbnNldFZhciwgc2VsZiwgYXJncywgVENMX0xFQVZFX0VSUl9NU0cpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2xvYmFsVW5zZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiB2YXJfaW52b2tlKFVuc2V0VmFyLCBzZWxmLCBhcmdzLCBUQ0xfTEVBVkVfRVJSX01TRyB8IFRDTF9HTE9CQUxfT05MWSk7CisgICAgcmV0dXJuIHZhcl9pbnZva2UoVW5zZXRWYXIsIHNlbGYsIGFyZ3MsIFRDTF9MRUFWRV9FUlJfTVNHIHwgVENMX0dMT0JBTF9PTkxZKTsKIH0KIAogCi0MCisKIC8qKiBUY2wgdG8gUHl0aG9uICoqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfR2V0SW50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzOwotCWludCB2OworICAgIGNoYXIgKnM7CisgICAgaW50IHY7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKLQkJUHlPYmplY3QqIG8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JCWlmIChQeUludF9DaGVjayhvKSkgewotCQkJUHlfSU5DUkVGKG8pOwotCQkJcmV0dXJuIG87Ci0JCX0KLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGludCIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFRjbF9HZXRJbnQoVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdikgPT0gVENMX0VSUk9SKQotCQlyZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHYpOworICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMSkgeworICAgICAgICBQeU9iamVjdCogbyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKG8pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0aW50IiwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoVGNsX0dldEludChUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KSA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJldHVybiBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgdik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HZXREb3VibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnM7Ci0JZG91YmxlIHY7CisgICAgY2hhciAqczsKKyAgICBkb3VibGUgdjsKIAotCWlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMSkgewotCQlQeU9iamVjdCAqbyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLQkJaWYgKFB5RmxvYXRfQ2hlY2sobykpIHsKLQkJCVB5X0lOQ1JFRihvKTsKLQkJCXJldHVybiBvOwotCQl9Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRkb3VibGUiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCWlmIChUY2xfR2V0RG91YmxlKFRrYXBwX0ludGVycChzZWxmKSwgcywgJnYpID09IFRDTF9FUlJPUikKLQkJcmV0dXJuIFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImQiLCB2KTsKKyAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKKyAgICAgICAgUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgIGlmIChQeUZsb2F0X0NoZWNrKG8pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICByZXR1cm4gbzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0ZG91YmxlIiwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoVGNsX0dldERvdWJsZShUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KSA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJldHVybiBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJkIiwgdik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HZXRCb29sZWFuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzOwotCWludCB2OworICAgIGNoYXIgKnM7CisgICAgaW50IHY7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKLQkJUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JCWlmIChQeUludF9DaGVjayhvKSkgewotCQkJUHlfSU5DUkVGKG8pOwotCQkJcmV0dXJuIG87Ci0JCX0KLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGJvb2xlYW4iLCAmcykpCi0JCXJldHVybiBOVUxMOwotCWlmIChUY2xfR2V0Qm9vbGVhbihUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KSA9PSBUQ0xfRVJST1IpCi0JCXJldHVybiBUa2ludGVyX0Vycm9yKHNlbGYpOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcodik7CisgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAxKSB7CisgICAgICAgIFB5T2JqZWN0ICpvID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOworICAgICAgICBpZiAoUHlJbnRfQ2hlY2sobykpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRib29sZWFuIiwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoVGNsX0dldEJvb2xlYW4oVGthcHBfSW50ZXJwKHNlbGYpLCBzLCAmdikgPT0gVENMX0VSUk9SKQorICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfRXhwclN0cmluZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqczsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlpbnQgcmV0dmFsOworICAgIGNoYXIgKnM7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgaW50IHJldHZhbDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpleHByc3RyaW5nIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwcnN0cmluZyIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlFTlRFUl9UQ0wKLQlyZXR2YWwgPSBUY2xfRXhwclN0cmluZyhUa2FwcF9JbnRlcnAoc2VsZiksIHMpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAocmV0dmFsID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQllbHNlCi0JCXJlcyA9IFB5X0J1aWxkVmFsdWUoInMiLCBUa2FwcF9SZXN1bHQoc2VsZikpOwotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKworICAgIEVOVEVSX1RDTAorICAgIHJldHZhbCA9IFRjbF9FeHByU3RyaW5nKFRrYXBwX0ludGVycChzZWxmKSwgcyk7CisgICAgRU5URVJfT1ZFUkxBUAorICAgIGlmIChyZXR2YWwgPT0gVENMX0VSUk9SKQorICAgICAgICByZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlfQnVpbGRWYWx1ZSgicyIsIFRrYXBwX1Jlc3VsdChzZWxmKSk7CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfRXhwckxvbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnM7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JaW50IHJldHZhbDsKLQlsb25nIHY7CisgICAgY2hhciAqczsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBpbnQgcmV0dmFsOworICAgIGxvbmcgdjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpleHBybG9uZyIsICZzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cHJsb25nIiwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOwogCi0JRU5URVJfVENMCi0JcmV0dmFsID0gVGNsX0V4cHJMb25nKFRrYXBwX0ludGVycChzZWxmKSwgcywgJnYpOwotCUVOVEVSX09WRVJMQVAKLQlpZiAocmV0dmFsID09IFRDTF9FUlJPUikKLQkJcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQllbHNlCi0JCXJlcyA9IFB5X0J1aWxkVmFsdWUoImwiLCB2KTsKLQlMRUFWRV9PVkVSTEFQX1RDTAotCXJldHVybiByZXM7CisgICAgRU5URVJfVENMCisgICAgcmV0dmFsID0gVGNsX0V4cHJMb25nKFRrYXBwX0ludGVycChzZWxmKSwgcywgJnYpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAocmV0dmFsID09IFRDTF9FUlJPUikKKyAgICAgICAgcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5X0J1aWxkVmFsdWUoImwiLCB2KTsKKyAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9FeHByRG91YmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWRvdWJsZSB2OwotCWludCByZXR2YWw7CisgICAgY2hhciAqczsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBkb3VibGUgdjsKKyAgICBpbnQgcmV0dmFsOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmV4cHJkb3VibGUiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoIlRrYXBwX0V4cHJEb3VibGUiLCByZXR1cm4gMCkKLQlFTlRFUl9UQ0wKLQlyZXR2YWwgPSBUY2xfRXhwckRvdWJsZShUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KTsKLQlFTlRFUl9PVkVSTEFQCi0JUHlGUEVfRU5EX1BST1RFQ1QocmV0dmFsKQotCWlmIChyZXR2YWwgPT0gVENMX0VSUk9SKQotCQlyZXMgPSBUa2ludGVyX0Vycm9yKHNlbGYpOwotCWVsc2UKLQkJcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsIHYpOwotCUxFQVZFX09WRVJMQVBfVENMCi0JcmV0dXJuIHJlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwcmRvdWJsZSIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiVGthcHBfRXhwckRvdWJsZSIsIHJldHVybiAwKQorICAgIEVOVEVSX1RDTAorICAgIHJldHZhbCA9IFRjbF9FeHByRG91YmxlKFRrYXBwX0ludGVycChzZWxmKSwgcywgJnYpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChyZXR2YWwpCisgICAgaWYgKHJldHZhbCA9PSBUQ0xfRVJST1IpCisgICAgICAgIHJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgZWxzZQorICAgICAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwgdik7CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfRXhwckJvb2xlYW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnM7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JaW50IHJldHZhbDsKLQlpbnQgdjsKKyAgICBjaGFyICpzOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIGludCByZXR2YWw7CisgICAgaW50IHY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwcmJvb2xlYW4iLCAmcykpCi0JCXJldHVybiBOVUxMOwotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOwotCUVOVEVSX1RDTAotCXJldHZhbCA9IFRjbF9FeHByQm9vbGVhbihUa2FwcF9JbnRlcnAoc2VsZiksIHMsICZ2KTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKHJldHZhbCA9PSBUQ0xfRVJST1IpCi0JCXJlcyA9IFRraW50ZXJfRXJyb3Ioc2VsZik7Ci0JZWxzZQotCQlyZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgdik7Ci0JTEVBVkVfT1ZFUkxBUF9UQ0wKLQlyZXR1cm4gcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpleHByYm9vbGVhbiIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgRU5URVJfVENMCisgICAgcmV0dmFsID0gVGNsX0V4cHJCb29sZWFuKFRrYXBwX0ludGVycChzZWxmKSwgcywgJnYpOworICAgIEVOVEVSX09WRVJMQVAKKyAgICBpZiAocmV0dmFsID09IFRDTF9FUlJPUikKKyAgICAgICAgcmVzID0gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCB2KTsKKyAgICBMRUFWRV9PVkVSTEFQX1RDTAorICAgIHJldHVybiByZXM7CiB9CiAKIAotDAorCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfU3BsaXRMaXN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpsaXN0OwotCWludCBhcmdjOwotCWNoYXIgKiphcmd2OwotCVB5T2JqZWN0ICp2OwotCWludCBpOworICAgIGNoYXIgKmxpc3Q7CisgICAgaW50IGFyZ2M7CisgICAgY2hhciAqKmFyZ3Y7CisgICAgUHlPYmplY3QgKnY7CisgICAgaW50IGk7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKLQkJdiA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLQkJaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKLQkJCVB5X0lOQ1JFRih2KTsKLQkJCXJldHVybiB2OwotCQl9Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXQ6c3BsaXRsaXN0IiwgInV0Zi04IiwgJmxpc3QpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID09IDEpIHsKKyAgICAgICAgdiA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKyAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXQ6c3BsaXRsaXN0IiwgInV0Zi04IiwgJmxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChUY2xfU3BsaXRMaXN0KFRrYXBwX0ludGVycChzZWxmKSwgbGlzdCwgCi0JCQkgICZhcmdjLCAmYXJndikgPT0gVENMX0VSUk9SKSAgewotCQlQeU1lbV9GcmVlKGxpc3QpOwotCQlyZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKLQl9CisgICAgaWYgKFRjbF9TcGxpdExpc3QoVGthcHBfSW50ZXJwKHNlbGYpLCBsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICZhcmdjLCAmYXJndikgPT0gVENMX0VSUk9SKSAgeworICAgICAgICBQeU1lbV9GcmVlKGxpc3QpOworICAgICAgICByZXR1cm4gVGtpbnRlcl9FcnJvcihzZWxmKTsKKyAgICB9CiAKLQlpZiAoISh2ID0gUHlUdXBsZV9OZXcoYXJnYykpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEodiA9IFB5VHVwbGVfTmV3KGFyZ2MpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewotCQlQeU9iamVjdCAqcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYXJndltpXSk7Ci0JCWlmICghcyB8fCBQeVR1cGxlX1NldEl0ZW0odiwgaSwgcykpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXYgPSBOVUxMOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbaV0pOworICAgICAgICBpZiAoIXMgfHwgUHlUdXBsZV9TZXRJdGVtKHYsIGksIHMpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KIAogICBmaW5hbGx5OgotCWNrZnJlZShGUkVFQ0FTVCBhcmd2KTsKLQlQeU1lbV9GcmVlKGxpc3QpOwotCXJldHVybiB2OworICAgIGNrZnJlZShGUkVFQ0FTVCBhcmd2KTsKKyAgICBQeU1lbV9GcmVlKGxpc3QpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfU3BsaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2OwotCWNoYXIgKmxpc3Q7CisgICAgUHlPYmplY3QgKnY7CisgICAgY2hhciAqbGlzdDsKIAotCWlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMSkgewotCQlQeU9iamVjdCogbyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLQkJaWYgKFB5VHVwbGVfQ2hlY2sobykpIHsKLQkJCW8gPSBTcGxpdE9iaihvKTsKLQkJCXJldHVybiBvOwotCQl9Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXQ6c3BsaXQiLCAidXRmLTgiLCAmbGlzdCkpCi0JCXJldHVybiBOVUxMOwotCXYgPSBTcGxpdChsaXN0KTsKLQlQeU1lbV9GcmVlKGxpc3QpOwotCXJldHVybiB2OworICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMSkgeworICAgICAgICBQeU9iamVjdCogbyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKyAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2sobykpIHsKKyAgICAgICAgICAgIG8gPSBTcGxpdE9iaihvKTsKKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXQ6c3BsaXQiLCAidXRmLTgiLCAmbGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYgPSBTcGxpdChsaXN0KTsKKyAgICBQeU1lbV9GcmVlKGxpc3QpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfTWVyZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMgPSBNZXJnZShhcmdzKTsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBjaGFyICpzID0gTWVyZ2UoYXJncyk7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAKLQlpZiAocykgewotCQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOwotCQlja2ZyZWUocyk7Ci0JfQorICAgIGlmIChzKSB7CisgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7CisgICAgICAgIGNrZnJlZShzKTsKKyAgICB9CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIAotDAorCiAvKiogVGNsIENvbW1hbmQgKiovCiAKIC8qIENsaWVudCBkYXRhIHN0cnVjdCAqLwogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpmdW5jOwogfSBQeXRob25DbWRfQ2xpZW50RGF0YTsKIAogc3RhdGljIGludAogUHl0aG9uQ21kX0Vycm9yKFRjbF9JbnRlcnAgKmludGVycCkKIHsKLQllcnJvckluQ21kID0gMTsKLQlQeUVycl9GZXRjaCgmZXhjSW5DbWQsICZ2YWxJbkNtZCwgJnRyYkluQ21kKTsKLQlMRUFWRV9QWVRIT04KLQlyZXR1cm4gVENMX0VSUk9SOworICAgIGVycm9ySW5DbWQgPSAxOworICAgIFB5RXJyX0ZldGNoKCZleGNJbkNtZCwgJnZhbEluQ21kLCAmdHJiSW5DbWQpOworICAgIExFQVZFX1BZVEhPTgorICAgIHJldHVybiBUQ0xfRVJST1I7CiB9CiAKIC8qIFRoaXMgaXMgdGhlIFRjbCBjb21tYW5kIHRoYXQgYWN0cyBhcyBhIHdyYXBwZXIgZm9yIFB5dGhvbgpAQCAtMTk5NCwxOTkgKzE5OTQsMTk5IEBACiBzdGF0aWMgaW50CiBQeXRob25DbWQoQ2xpZW50RGF0YSBjbGllbnREYXRhLCBUY2xfSW50ZXJwICppbnRlcnAsIGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7Ci0JUHl0aG9uQ21kX0NsaWVudERhdGEgKmRhdGEgPSAoUHl0aG9uQ21kX0NsaWVudERhdGEgKiljbGllbnREYXRhOwotCVB5T2JqZWN0ICpzZWxmLCAqZnVuYywgKmFyZywgKnJlczsKLQlpbnQgaSwgcnY7Ci0JVGNsX09iaiAqb2JqX3JlczsKKyAgICBQeXRob25DbWRfQ2xpZW50RGF0YSAqZGF0YSA9IChQeXRob25DbWRfQ2xpZW50RGF0YSAqKWNsaWVudERhdGE7CisgICAgUHlPYmplY3QgKnNlbGYsICpmdW5jLCAqYXJnLCAqcmVzOworICAgIGludCBpLCBydjsKKyAgICBUY2xfT2JqICpvYmpfcmVzOwogCi0JRU5URVJfUFlUSE9OCisgICAgRU5URVJfUFlUSE9OCiAKLQkvKiBUQkQ6IG5vIGVycm9yIGNoZWNraW5nIGhlcmUgc2luY2Ugd2Uga25vdywgdmlhIHRoZQotCSAqIFRrYXBwX0NyZWF0ZUNvbW1hbmQoKSB0aGF0IHRoZSBjbGllbnQgZGF0YSBpcyBhIHR3by10dXBsZQotCSAqLwotCXNlbGYgPSBkYXRhLT5zZWxmOwotCWZ1bmMgPSBkYXRhLT5mdW5jOworICAgIC8qIFRCRDogbm8gZXJyb3IgY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBrbm93LCB2aWEgdGhlCisgICAgICogVGthcHBfQ3JlYXRlQ29tbWFuZCgpIHRoYXQgdGhlIGNsaWVudCBkYXRhIGlzIGEgdHdvLXR1cGxlCisgICAgICovCisgICAgc2VsZiA9IGRhdGEtPnNlbGY7CisgICAgZnVuYyA9IGRhdGEtPmZ1bmM7CiAKLQkvKiBDcmVhdGUgYXJndW1lbnQgbGlzdCAoYXJndjEsIC4uLiwgYXJndk4pICovCi0JaWYgKCEoYXJnID0gUHlUdXBsZV9OZXcoYXJnYyAtIDEpKSkKLQkJcmV0dXJuIFB5dGhvbkNtZF9FcnJvcihpbnRlcnApOworICAgIC8qIENyZWF0ZSBhcmd1bWVudCBsaXN0IChhcmd2MSwgLi4uLCBhcmd2TikgKi8KKyAgICBpZiAoIShhcmcgPSBQeVR1cGxlX05ldyhhcmdjIC0gMSkpKQorICAgICAgICByZXR1cm4gUHl0aG9uQ21kX0Vycm9yKGludGVycCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgKGFyZ2MgLSAxKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2W2kgKyAxXSk7Ci0JCWlmICghcyB8fCBQeVR1cGxlX1NldEl0ZW0oYXJnLCBpLCBzKSkgewotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlyZXR1cm4gUHl0aG9uQ21kX0Vycm9yKGludGVycCk7Ci0JCX0KLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKLQlQeV9ERUNSRUYoYXJnKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGFyZ2MgLSAxKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2W2kgKyAxXSk7CisgICAgICAgIGlmICghcyB8fCBQeVR1cGxlX1NldEl0ZW0oYXJnLCBpLCBzKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICByZXR1cm4gUHl0aG9uQ21kX0Vycm9yKGludGVycCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKIAotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIFB5dGhvbkNtZF9FcnJvcihpbnRlcnApOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5dGhvbkNtZF9FcnJvcihpbnRlcnApOwogCi0Jb2JqX3JlcyA9IEFzT2JqKHJlcyk7Ci0JaWYgKG9ial9yZXMgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIFB5dGhvbkNtZF9FcnJvcihpbnRlcnApOwotCX0KLQllbHNlIHsKLQkJVGNsX1NldE9ialJlc3VsdChpbnRlcnAsIG9ial9yZXMpOwotCQlydiA9IFRDTF9PSzsKLQl9CisgICAgb2JqX3JlcyA9IEFzT2JqKHJlcyk7CisgICAgaWYgKG9ial9yZXMgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIFB5dGhvbkNtZF9FcnJvcihpbnRlcnApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgVGNsX1NldE9ialJlc3VsdChpbnRlcnAsIG9ial9yZXMpOworICAgICAgICBydiA9IFRDTF9PSzsKKyAgICB9CiAKLQlQeV9ERUNSRUYocmVzKTsKKyAgICBQeV9ERUNSRUYocmVzKTsKIAotCUxFQVZFX1BZVEhPTgorICAgIExFQVZFX1BZVEhPTgogCi0JcmV0dXJuIHJ2OworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIHZvaWQKIFB5dGhvbkNtZERlbGV0ZShDbGllbnREYXRhIGNsaWVudERhdGEpCiB7Ci0JUHl0aG9uQ21kX0NsaWVudERhdGEgKmRhdGEgPSAoUHl0aG9uQ21kX0NsaWVudERhdGEgKiljbGllbnREYXRhOworICAgIFB5dGhvbkNtZF9DbGllbnREYXRhICpkYXRhID0gKFB5dGhvbkNtZF9DbGllbnREYXRhICopY2xpZW50RGF0YTsKIAotCUVOVEVSX1BZVEhPTgotCVB5X1hERUNSRUYoZGF0YS0+c2VsZik7Ci0JUHlfWERFQ1JFRihkYXRhLT5mdW5jKTsKLQlQeU1lbV9ERUwoZGF0YSk7Ci0JTEVBVkVfUFlUSE9OCisgICAgRU5URVJfUFlUSE9OCisgICAgUHlfWERFQ1JFRihkYXRhLT5zZWxmKTsKKyAgICBQeV9YREVDUkVGKGRhdGEtPmZ1bmMpOworICAgIFB5TWVtX0RFTChkYXRhKTsKKyAgICBMRUFWRV9QWVRIT04KIH0KIAogCi0MCisKIAogVENMX0RFQ0xBUkVfTVVURVgoY29tbWFuZF9tdXRleCkKIAogdHlwZWRlZiBzdHJ1Y3QgQ29tbWFuZEV2ZW50ewotCVRjbF9FdmVudCBldjsKLQlUY2xfSW50ZXJwKiBpbnRlcnA7Ci0JY2hhciAqbmFtZTsKLQlpbnQgY3JlYXRlOwotCWludCAqc3RhdHVzOwotCUNsaWVudERhdGEgKmRhdGE7Ci0JVGNsX0NvbmRpdGlvbiBkb25lOworICAgIFRjbF9FdmVudCBldjsKKyAgICBUY2xfSW50ZXJwKiBpbnRlcnA7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgY3JlYXRlOworICAgIGludCAqc3RhdHVzOworICAgIENsaWVudERhdGEgKmRhdGE7CisgICAgVGNsX0NvbmRpdGlvbiBkb25lOwogfSBDb21tYW5kRXZlbnQ7CiAKIHN0YXRpYyBpbnQKIFRrYXBwX0NvbW1hbmRQcm9jKENvbW1hbmRFdmVudCAqZXYsIGludCBmbGFncykKIHsKLQlpZiAoZXYtPmNyZWF0ZSkKLQkJKmV2LT5zdGF0dXMgPSBUY2xfQ3JlYXRlQ29tbWFuZCgKLQkJCWV2LT5pbnRlcnAsIGV2LT5uYW1lLCBQeXRob25DbWQsCi0JCQlldi0+ZGF0YSwgUHl0aG9uQ21kRGVsZXRlKSA9PSBOVUxMOwotCWVsc2UKLQkJKmV2LT5zdGF0dXMgPSBUY2xfRGVsZXRlQ29tbWFuZChldi0+aW50ZXJwLCBldi0+bmFtZSk7Ci0JVGNsX011dGV4TG9jaygmY29tbWFuZF9tdXRleCk7Ci0JVGNsX0NvbmRpdGlvbk5vdGlmeSgmZXYtPmRvbmUpOwotCVRjbF9NdXRleFVubG9jaygmY29tbWFuZF9tdXRleCk7Ci0JcmV0dXJuIDE7CisgICAgaWYgKGV2LT5jcmVhdGUpCisgICAgICAgICpldi0+c3RhdHVzID0gVGNsX0NyZWF0ZUNvbW1hbmQoCisgICAgICAgICAgICBldi0+aW50ZXJwLCBldi0+bmFtZSwgUHl0aG9uQ21kLAorICAgICAgICAgICAgZXYtPmRhdGEsIFB5dGhvbkNtZERlbGV0ZSkgPT0gTlVMTDsKKyAgICBlbHNlCisgICAgICAgICpldi0+c3RhdHVzID0gVGNsX0RlbGV0ZUNvbW1hbmQoZXYtPmludGVycCwgZXYtPm5hbWUpOworICAgIFRjbF9NdXRleExvY2soJmNvbW1hbmRfbXV0ZXgpOworICAgIFRjbF9Db25kaXRpb25Ob3RpZnkoJmV2LT5kb25lKTsKKyAgICBUY2xfTXV0ZXhVbmxvY2soJmNvbW1hbmRfbXV0ZXgpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfQ3JlYXRlQ29tbWFuZChQeU9iamVjdCAqc2VsZnB0ciwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7Ci0JUHl0aG9uQ21kX0NsaWVudERhdGEgKmRhdGE7Ci0JY2hhciAqY21kTmFtZTsKLQlQeU9iamVjdCAqZnVuYzsKLQlpbnQgZXJyOworICAgIFRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOworICAgIFB5dGhvbkNtZF9DbGllbnREYXRhICpkYXRhOworICAgIGNoYXIgKmNtZE5hbWU7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgaW50IGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086Y3JlYXRlY29tbWFuZCIsICZjbWROYW1lLCAmZnVuYykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29tbWFuZCBub3QgY2FsbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086Y3JlYXRlY29tbWFuZCIsICZjbWROYW1lLCAmZnVuYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29tbWFuZCBub3QgY2FsbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+dGhyZWFkZWQgJiYgc2VsZi0+dGhyZWFkX2lkICE9IFRjbF9HZXRDdXJyZW50VGhyZWFkKCkgJiYKLQkgICAgIVdhaXRGb3JNYWlubG9vcChzZWxmKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpICYmCisgICAgICAgICFXYWl0Rm9yTWFpbmxvb3Aoc2VsZikpCisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCiAKLQlkYXRhID0gUHlNZW1fTkVXKFB5dGhvbkNtZF9DbGllbnREYXRhLCAxKTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlQeV9JTkNSRUYoZnVuYyk7Ci0JZGF0YS0+c2VsZiA9IHNlbGZwdHI7Ci0JZGF0YS0+ZnVuYyA9IGZ1bmM7Ci0JCi0JaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpKSB7Ci0JCUNvbW1hbmRFdmVudCAqZXYgPSAoQ29tbWFuZEV2ZW50Kilja2FsbG9jKHNpemVvZihDb21tYW5kRXZlbnQpKTsKLQkJZXYtPmV2LnByb2MgPSAoVGNsX0V2ZW50UHJvYyopVGthcHBfQ29tbWFuZFByb2M7Ci0JCWV2LT5pbnRlcnAgPSBzZWxmLT5pbnRlcnA7Ci0JCWV2LT5jcmVhdGUgPSAxOwotCQlldi0+bmFtZSA9IGNtZE5hbWU7Ci0JCWV2LT5kYXRhID0gKENsaWVudERhdGEpZGF0YTsKLQkJZXYtPnN0YXR1cyA9ICZlcnI7Ci0JCWV2LT5kb25lID0gTlVMTDsKLQkJVGthcHBfVGhyZWFkU2VuZChzZWxmLCAoVGNsX0V2ZW50KilldiwgJmV2LT5kb25lLCAmY29tbWFuZF9tdXRleCk7Ci0JfQotCWVsc2UgewotCQlFTlRFUl9UQ0wKLQkJZXJyID0gVGNsX0NyZWF0ZUNvbW1hbmQoCi0JCQlUa2FwcF9JbnRlcnAoc2VsZiksIGNtZE5hbWUsIFB5dGhvbkNtZCwKLQkJCShDbGllbnREYXRhKWRhdGEsIFB5dGhvbkNtZERlbGV0ZSkgPT0gTlVMTDsKLQkJTEVBVkVfVENMCi0JfQotCWlmIChlcnIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsICJjYW4ndCBjcmVhdGUgVGNsIGNvbW1hbmQiKTsKLQkJUHlNZW1fREVMKGRhdGEpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZGF0YSA9IFB5TWVtX05FVyhQeXRob25DbWRfQ2xpZW50RGF0YSwgMSk7CisgICAgaWYgKCFkYXRhKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIGRhdGEtPnNlbGYgPSBzZWxmcHRyOworICAgIGRhdGEtPmZ1bmMgPSBmdW5jOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChzZWxmLT50aHJlYWRlZCAmJiBzZWxmLT50aHJlYWRfaWQgIT0gVGNsX0dldEN1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICBDb21tYW5kRXZlbnQgKmV2ID0gKENvbW1hbmRFdmVudCopY2thbGxvYyhzaXplb2YoQ29tbWFuZEV2ZW50KSk7CisgICAgICAgIGV2LT5ldi5wcm9jID0gKFRjbF9FdmVudFByb2MqKVRrYXBwX0NvbW1hbmRQcm9jOworICAgICAgICBldi0+aW50ZXJwID0gc2VsZi0+aW50ZXJwOworICAgICAgICBldi0+Y3JlYXRlID0gMTsKKyAgICAgICAgZXYtPm5hbWUgPSBjbWROYW1lOworICAgICAgICBldi0+ZGF0YSA9IChDbGllbnREYXRhKWRhdGE7CisgICAgICAgIGV2LT5zdGF0dXMgPSAmZXJyOworICAgICAgICBldi0+ZG9uZSA9IE5VTEw7CisgICAgICAgIFRrYXBwX1RocmVhZFNlbmQoc2VsZiwgKFRjbF9FdmVudCopZXYsICZldi0+ZG9uZSwgJmNvbW1hbmRfbXV0ZXgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgRU5URVJfVENMCisgICAgICAgIGVyciA9IFRjbF9DcmVhdGVDb21tYW5kKAorICAgICAgICAgICAgVGthcHBfSW50ZXJwKHNlbGYpLCBjbWROYW1lLCBQeXRob25DbWQsCisgICAgICAgICAgICAoQ2xpZW50RGF0YSlkYXRhLCBQeXRob25DbWREZWxldGUpID09IE5VTEw7CisgICAgICAgIExFQVZFX1RDTAorICAgIH0KKyAgICBpZiAoZXJyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCAiY2FuJ3QgY3JlYXRlIFRjbCBjb21tYW5kIik7CisgICAgICAgIFB5TWVtX0RFTChkYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLQwKKwogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0RlbGV0ZUNvbW1hbmQoUHlPYmplY3QgKnNlbGZwdHIsIFB5T2JqZWN0ICphcmdzKQogewotCVRrYXBwT2JqZWN0ICpzZWxmID0gKFRrYXBwT2JqZWN0KilzZWxmcHRyOwotCWNoYXIgKmNtZE5hbWU7Ci0JaW50IGVycjsKKyAgICBUa2FwcE9iamVjdCAqc2VsZiA9IChUa2FwcE9iamVjdCopc2VsZnB0cjsKKyAgICBjaGFyICpjbWROYW1lOworICAgIGludCBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZGVsZXRlY29tbWFuZCIsICZjbWROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpKSB7Ci0JCUNvbW1hbmRFdmVudCAqZXY7Ci0JCWV2ID0gKENvbW1hbmRFdmVudCopY2thbGxvYyhzaXplb2YoQ29tbWFuZEV2ZW50KSk7Ci0JCWV2LT5ldi5wcm9jID0gKFRjbF9FdmVudFByb2MqKVRrYXBwX0NvbW1hbmRQcm9jOwotCQlldi0+aW50ZXJwID0gc2VsZi0+aW50ZXJwOwotCQlldi0+Y3JlYXRlID0gMDsKLQkJZXYtPm5hbWUgPSBjbWROYW1lOwotCQlldi0+c3RhdHVzID0gJmVycjsKLQkJZXYtPmRvbmUgPSBOVUxMOwotCQlUa2FwcF9UaHJlYWRTZW5kKHNlbGYsIChUY2xfRXZlbnQqKWV2LCAmZXYtPmRvbmUsIAotCQkJCSAmY29tbWFuZF9tdXRleCk7Ci0JfQotCWVsc2UgewotCQlFTlRFUl9UQ0wKLQkJZXJyID0gVGNsX0RlbGV0ZUNvbW1hbmQoc2VsZi0+aW50ZXJwLCBjbWROYW1lKTsKLQkJTEVBVkVfVENMCi0JfQotCWlmIChlcnIgPT0gLTEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsICJjYW4ndCBkZWxldGUgVGNsIGNvbW1hbmQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZGVsZXRlY29tbWFuZCIsICZjbWROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNlbGYtPnRocmVhZGVkICYmIHNlbGYtPnRocmVhZF9pZCAhPSBUY2xfR2V0Q3VycmVudFRocmVhZCgpKSB7CisgICAgICAgIENvbW1hbmRFdmVudCAqZXY7CisgICAgICAgIGV2ID0gKENvbW1hbmRFdmVudCopY2thbGxvYyhzaXplb2YoQ29tbWFuZEV2ZW50KSk7CisgICAgICAgIGV2LT5ldi5wcm9jID0gKFRjbF9FdmVudFByb2MqKVRrYXBwX0NvbW1hbmRQcm9jOworICAgICAgICBldi0+aW50ZXJwID0gc2VsZi0+aW50ZXJwOworICAgICAgICBldi0+Y3JlYXRlID0gMDsKKyAgICAgICAgZXYtPm5hbWUgPSBjbWROYW1lOworICAgICAgICBldi0+c3RhdHVzID0gJmVycjsKKyAgICAgICAgZXYtPmRvbmUgPSBOVUxMOworICAgICAgICBUa2FwcF9UaHJlYWRTZW5kKHNlbGYsIChUY2xfRXZlbnQqKWV2LCAmZXYtPmRvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmRfbXV0ZXgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgRU5URVJfVENMCisgICAgICAgIGVyciA9IFRjbF9EZWxldGVDb21tYW5kKHNlbGYtPmludGVycCwgY21kTmFtZSk7CisgICAgICAgIExFQVZFX1RDTAorICAgIH0KKyAgICBpZiAoZXJyID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCAiY2FuJ3QgZGVsZXRlIFRjbCBjb21tYW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotDAorCiAjaWZkZWYgSEFWRV9DUkVBVEVGSUxFSEFORExFUgogLyoqIEZpbGUgSGFuZGxlciAqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgX2ZoY2RhdGEgewotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICpmaWxlOwotCWludCBpZDsKLQlzdHJ1Y3QgX2ZoY2RhdGEgKm5leHQ7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgaW50IGlkOworICAgIHN0cnVjdCBfZmhjZGF0YSAqbmV4dDsKIH0gRmlsZUhhbmRsZXJfQ2xpZW50RGF0YTsKIAogc3RhdGljIEZpbGVIYW5kbGVyX0NsaWVudERhdGEgKkhlYWRGSENEOwpAQCAtMjE5NCw3NDcgKzIxOTQsNzQ3IEBACiBzdGF0aWMgRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqCiBOZXdGSENEKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqZmlsZSwgaW50IGlkKQogewotCUZpbGVIYW5kbGVyX0NsaWVudERhdGEgKnA7Ci0JcCA9IFB5TWVtX05FVyhGaWxlSGFuZGxlcl9DbGllbnREYXRhLCAxKTsKLQlpZiAocCAhPSBOVUxMKSB7Ci0JCVB5X1hJTkNSRUYoZnVuYyk7Ci0JCVB5X1hJTkNSRUYoZmlsZSk7Ci0JCXAtPmZ1bmMgPSBmdW5jOwotCQlwLT5maWxlID0gZmlsZTsKLQkJcC0+aWQgPSBpZDsKLQkJcC0+bmV4dCA9IEhlYWRGSENEOwotCQlIZWFkRkhDRCA9IHA7Ci0JfQotCXJldHVybiBwOworICAgIEZpbGVIYW5kbGVyX0NsaWVudERhdGEgKnA7CisgICAgcCA9IFB5TWVtX05FVyhGaWxlSGFuZGxlcl9DbGllbnREYXRhLCAxKTsKKyAgICBpZiAocCAhPSBOVUxMKSB7CisgICAgICAgIFB5X1hJTkNSRUYoZnVuYyk7CisgICAgICAgIFB5X1hJTkNSRUYoZmlsZSk7CisgICAgICAgIHAtPmZ1bmMgPSBmdW5jOworICAgICAgICBwLT5maWxlID0gZmlsZTsKKyAgICAgICAgcC0+aWQgPSBpZDsKKyAgICAgICAgcC0+bmV4dCA9IEhlYWRGSENEOworICAgICAgICBIZWFkRkhDRCA9IHA7CisgICAgfQorICAgIHJldHVybiBwOwogfQogCiBzdGF0aWMgdm9pZAogRGVsZXRlRkhDRChpbnQgaWQpCiB7Ci0JRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqcCwgKipwcDsKKyAgICBGaWxlSGFuZGxlcl9DbGllbnREYXRhICpwLCAqKnBwOwogCi0JcHAgPSAmSGVhZEZIQ0Q7Ci0Jd2hpbGUgKChwID0gKnBwKSAhPSBOVUxMKSB7Ci0JCWlmIChwLT5pZCA9PSBpZCkgewotCQkJKnBwID0gcC0+bmV4dDsKLQkJCVB5X1hERUNSRUYocC0+ZnVuYyk7Ci0JCQlQeV9YREVDUkVGKHAtPmZpbGUpOwotCQkJUHlNZW1fREVMKHApOwotCQl9Ci0JCWVsc2UKLQkJCXBwID0gJnAtPm5leHQ7Ci0JfQorICAgIHBwID0gJkhlYWRGSENEOworICAgIHdoaWxlICgocCA9ICpwcCkgIT0gTlVMTCkgeworICAgICAgICBpZiAocC0+aWQgPT0gaWQpIHsKKyAgICAgICAgICAgICpwcCA9IHAtPm5leHQ7CisgICAgICAgICAgICBQeV9YREVDUkVGKHAtPmZ1bmMpOworICAgICAgICAgICAgUHlfWERFQ1JFRihwLT5maWxlKTsKKyAgICAgICAgICAgIFB5TWVtX0RFTChwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBwcCA9ICZwLT5uZXh0OworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIEZpbGVIYW5kbGVyKENsaWVudERhdGEgY2xpZW50RGF0YSwgaW50IG1hc2spCiB7Ci0JRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqZGF0YSA9IChGaWxlSGFuZGxlcl9DbGllbnREYXRhICopY2xpZW50RGF0YTsKLQlQeU9iamVjdCAqZnVuYywgKmZpbGUsICphcmcsICpyZXM7CisgICAgRmlsZUhhbmRsZXJfQ2xpZW50RGF0YSAqZGF0YSA9IChGaWxlSGFuZGxlcl9DbGllbnREYXRhICopY2xpZW50RGF0YTsKKyAgICBQeU9iamVjdCAqZnVuYywgKmZpbGUsICphcmcsICpyZXM7CiAKLQlFTlRFUl9QWVRIT04KLQlmdW5jID0gZGF0YS0+ZnVuYzsKLQlmaWxlID0gZGF0YS0+ZmlsZTsKKyAgICBFTlRFUl9QWVRIT04KKyAgICBmdW5jID0gZGF0YS0+ZnVuYzsKKyAgICBmaWxlID0gZGF0YS0+ZmlsZTsKIAotCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihPaSkiLCBmaWxlLCAobG9uZykgbWFzayk7Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKLQlQeV9ERUNSRUYoYXJnKTsKKyAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIoT2kpIiwgZmlsZSwgKGxvbmcpIG1hc2spOworICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgUHlfREVDUkVGKGFyZyk7CiAKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJZXJyb3JJbkNtZCA9IDE7Ci0JCVB5RXJyX0ZldGNoKCZleGNJbkNtZCwgJnZhbEluQ21kLCAmdHJiSW5DbWQpOwotCX0KLQlQeV9YREVDUkVGKHJlcyk7Ci0JTEVBVkVfUFlUSE9OCisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIGVycm9ySW5DbWQgPSAxOworICAgICAgICBQeUVycl9GZXRjaCgmZXhjSW5DbWQsICZ2YWxJbkNtZCwgJnRyYkluQ21kKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihyZXMpOworICAgIExFQVZFX1BZVEhPTgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfQ3JlYXRlRmlsZUhhbmRsZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogICAgICAvKiBhcmdzIGlzIChmaWxlLCBtYXNrLCBmdW5jKSAqLwogewotCUZpbGVIYW5kbGVyX0NsaWVudERhdGEgKmRhdGE7Ci0JUHlPYmplY3QgKmZpbGUsICpmdW5jOwotCWludCBtYXNrLCB0ZmlsZTsKKyAgICBGaWxlSGFuZGxlcl9DbGllbnREYXRhICpkYXRhOworICAgIFB5T2JqZWN0ICpmaWxlLCAqZnVuYzsKKyAgICBpbnQgbWFzaywgdGZpbGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pTzpjcmVhdGVmaWxlaGFuZGxlciIsCi0JCQkgICAgICAmZmlsZSwgJm1hc2ssICZmdW5jKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaU86Y3JlYXRlZmlsZWhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZSwgJm1hc2ssICZmdW5jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmICghc2VsZiAmJiAhdGNsX2xvY2spIHsKLQkJLyogV2UgZG9uJ3QgaGF2ZSB0aGUgVGNsIGxvY2sgc2luY2UgVGNsIGlzIHRocmVhZGVkLiAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJfdGtpbnRlci5jcmVhdGVmaWxlaGFuZGxlciBub3Qgc3VwcG9ydGVkICIKLQkJCQkiZm9yIHRocmVhZGVkIFRjbCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFzZWxmICYmICF0Y2xfbG9jaykgeworICAgICAgICAvKiBXZSBkb24ndCBoYXZlIHRoZSBUY2wgbG9jayBzaW5jZSBUY2wgaXMgdGhyZWFkZWQuICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX3RraW50ZXIuY3JlYXRlZmlsZWhhbmRsZXIgbm90IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmVhZGVkIFRjbCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCWlmIChzZWxmKSB7Ci0JCUNIRUNLX1RDTF9BUFBBUlRNRU5UOwotCX0KKyAgICBpZiAoc2VsZikgeworICAgICAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICB9CiAKLQl0ZmlsZSA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IoZmlsZSk7Ci0JaWYgKHRmaWxlIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgYXJndW1lbnQgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgdGZpbGUgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKGZpbGUpOworICAgIGlmICh0ZmlsZSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIGFyZ3VtZW50IGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZGF0YSA9IE5ld0ZIQ0QoZnVuYywgZmlsZSwgdGZpbGUpOwotCWlmIChkYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGRhdGEgPSBOZXdGSENEKGZ1bmMsIGZpbGUsIHRmaWxlKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIE91Z2h0IHRvIGNoZWNrIGZvciBudWxsIFRjbF9GaWxlIG9iamVjdC4uLiAqLwotCUVOVEVSX1RDTAotCVRjbF9DcmVhdGVGaWxlSGFuZGxlcih0ZmlsZSwgbWFzaywgRmlsZUhhbmRsZXIsIChDbGllbnREYXRhKSBkYXRhKTsKLQlMRUFWRV9UQ0wKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgLyogT3VnaHQgdG8gY2hlY2sgZm9yIG51bGwgVGNsX0ZpbGUgb2JqZWN0Li4uICovCisgICAgRU5URVJfVENMCisgICAgVGNsX0NyZWF0ZUZpbGVIYW5kbGVyKHRmaWxlLCBtYXNrLCBGaWxlSGFuZGxlciwgKENsaWVudERhdGEpIGRhdGEpOworICAgIExFQVZFX1RDTAorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0RlbGV0ZUZpbGVIYW5kbGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZmlsZTsKLQlpbnQgdGZpbGU7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgaW50IHRmaWxlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOmRlbGV0ZWZpbGVoYW5kbGVyIiwgJmZpbGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86ZGVsZXRlZmlsZWhhbmRsZXIiLCAmZmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoIXNlbGYgJiYgIXRjbF9sb2NrKSB7Ci0JCS8qIFdlIGRvbid0IGhhdmUgdGhlIFRjbCBsb2NrIHNpbmNlIFRjbCBpcyB0aHJlYWRlZC4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiX3RraW50ZXIuZGVsZXRlZmlsZWhhbmRsZXIgbm90IHN1cHBvcnRlZCAiCi0JCQkJImZvciB0aHJlYWRlZCBUY2wiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghc2VsZiAmJiAhdGNsX2xvY2spIHsKKyAgICAgICAgLyogV2UgZG9uJ3QgaGF2ZSB0aGUgVGNsIGxvY2sgc2luY2UgVGNsIGlzIHRocmVhZGVkLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl90a2ludGVyLmRlbGV0ZWZpbGVoYW5kbGVyIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJlYWRlZCBUY2wiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlpZiAoc2VsZikgewotCQlDSEVDS19UQ0xfQVBQQVJUTUVOVDsKLQl9CisgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgfQogCi0JdGZpbGUgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKGZpbGUpOwotCWlmICh0ZmlsZSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIHRmaWxlID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihmaWxlKTsKKyAgICBpZiAodGZpbGUgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCURlbGV0ZUZIQ0QodGZpbGUpOworICAgIERlbGV0ZUZIQ0QodGZpbGUpOwogCi0JLyogT3VnaHQgdG8gY2hlY2sgZm9yIG51bGwgVGNsX0ZpbGUgb2JqZWN0Li4uICovCi0JRU5URVJfVENMCi0JVGNsX0RlbGV0ZUZpbGVIYW5kbGVyKHRmaWxlKTsKLQlMRUFWRV9UQ0wKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgLyogT3VnaHQgdG8gY2hlY2sgZm9yIG51bGwgVGNsX0ZpbGUgb2JqZWN0Li4uICovCisgICAgRU5URVJfVENMCisgICAgVGNsX0RlbGV0ZUZpbGVIYW5kbGVyKHRmaWxlKTsKKyAgICBMRUFWRV9UQ0wKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYgLyogSEFWRV9DUkVBVEVGSUxFSEFORExFUiAqLwogCi0MCisKIC8qKioqIFRrdHQgT2JqZWN0ICh0aW1lciB0b2tlbikgKioqKi8KIAogc3RhdGljIFB5VHlwZU9iamVjdCBUa3R0X1R5cGU7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVGNsX1RpbWVyVG9rZW4gdG9rZW47Ci0JUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFRjbF9UaW1lclRva2VuIHRva2VuOworICAgIFB5T2JqZWN0ICpmdW5jOwogfSBUa3R0T2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKgogVGt0dF9EZWxldGVUaW1lckhhbmRsZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKXNlbGY7Ci0JUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOworICAgIFRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKXNlbGY7CisgICAgUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZGVsZXRldGltZXJoYW5kbGVyIikpCi0JCXJldHVybiBOVUxMOwotCWlmICh2LT50b2tlbiAhPSBOVUxMKSB7Ci0JCVRjbF9EZWxldGVUaW1lckhhbmRsZXIodi0+dG9rZW4pOwotCQl2LT50b2tlbiA9IE5VTEw7Ci0JfQotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJdi0+ZnVuYyA9IE5VTEw7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJUHlfREVDUkVGKHYpOyAvKiBTZWUgVGt0dF9OZXcoKSAqLwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZGVsZXRldGltZXJoYW5kbGVyIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh2LT50b2tlbiAhPSBOVUxMKSB7CisgICAgICAgIFRjbF9EZWxldGVUaW1lckhhbmRsZXIodi0+dG9rZW4pOworICAgICAgICB2LT50b2tlbiA9IE5VTEw7CisgICAgfQorICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgdi0+ZnVuYyA9IE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgUHlfREVDUkVGKHYpOyAvKiBTZWUgVGt0dF9OZXcoKSAqLworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUa3R0X21ldGhvZHNbXSA9CiB7Ci0JeyJkZWxldGV0aW1lcmhhbmRsZXIiLCBUa3R0X0RlbGV0ZVRpbWVySGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwgTlVMTH0KKyAgICB7ImRlbGV0ZXRpbWVyaGFuZGxlciIsIFRrdHRfRGVsZXRlVGltZXJIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogc3RhdGljIFRrdHRPYmplY3QgKgogVGt0dF9OZXcoUHlPYmplY3QgKmZ1bmMpCiB7Ci0JVGt0dE9iamVjdCAqdjsKLSAgCi0JdiA9IFB5T2JqZWN0X05ldyhUa3R0T2JqZWN0LCAmVGt0dF9UeXBlKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBUa3R0T2JqZWN0ICp2OwogCi0JUHlfSU5DUkVGKGZ1bmMpOwotCXYtPnRva2VuID0gTlVMTDsKLQl2LT5mdW5jID0gZnVuYzsKKyAgICB2ID0gUHlPYmplY3RfTmV3KFRrdHRPYmplY3QsICZUa3R0X1R5cGUpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogRXh0cmEgcmVmZXJlbmNlLCBkZWxldGVkIHdoZW4gY2FsbGVkIG9yIHdoZW4gaGFuZGxlciBpcyBkZWxldGVkICovCi0JUHlfSU5DUkVGKHYpOwotCXJldHVybiB2OworICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICB2LT50b2tlbiA9IE5VTEw7CisgICAgdi0+ZnVuYyA9IGZ1bmM7CisKKyAgICAvKiBFeHRyYSByZWZlcmVuY2UsIGRlbGV0ZWQgd2hlbiBjYWxsZWQgb3Igd2hlbiBoYW5kbGVyIGlzIGRlbGV0ZWQgKi8KKyAgICBQeV9JTkNSRUYodik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyB2b2lkCiBUa3R0X0RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0JVGt0dE9iamVjdCAqdiA9IChUa3R0T2JqZWN0ICopc2VsZjsKLQlQeU9iamVjdCAqZnVuYyA9IHYtPmZ1bmM7CisgICAgVGt0dE9iamVjdCAqdiA9IChUa3R0T2JqZWN0ICopc2VsZjsKKyAgICBQeU9iamVjdCAqZnVuYyA9IHYtPmZ1bmM7CiAKLQlQeV9YREVDUkVGKGZ1bmMpOworICAgIFB5X1hERUNSRUYoZnVuYyk7CiAKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGt0dF9SZXByKFB5T2JqZWN0ICpzZWxmKQogewotCVRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKXNlbGY7Ci0JY2hhciBidWZbMTAwXTsKKyAgICBUa3R0T2JqZWN0ICp2ID0gKFRrdHRPYmplY3QgKilzZWxmOworICAgIGNoYXIgYnVmWzEwMF07CiAKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICI8dGt0aW1lcnRva2VuIGF0ICVwJXM+IiwgdiwKLQkgICAgICAgICAgICAgICAgdi0+ZnVuYyA9PSBOVUxMID8gIiwgaGFuZGxlciBkZWxldGVkIiA6ICIiKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjx0a3RpbWVydG9rZW4gYXQgJXAlcz4iLCB2LAorICAgICAgICAgICAgICAgICAgICB2LT5mdW5jID09IE5VTEwgPyAiLCBoYW5kbGVyIGRlbGV0ZWQiIDogIiIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa3R0X0dldEF0dHIoUHlPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoVGt0dF9tZXRob2RzLCBzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChUa3R0X21ldGhvZHMsIHNlbGYsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFRrdHRfVHlwZSA9CiB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInRrdGltZXJ0b2tlbiIsCQkJICAgICAvKnRwX25hbWUgKi8KLQlzaXplb2YoVGt0dE9iamVjdCksCQkgICAgIC8qdHBfYmFzaWNzaXplICovCi0JMCwJCQkJICAgICAvKnRwX2l0ZW1zaXplICovCi0JVGt0dF9EZWFsbG9jLAkJCSAgICAgLyp0cF9kZWFsbG9jICovCi0JMCwJCQkJICAgICAvKnRwX3ByaW50ICovCi0JVGt0dF9HZXRBdHRyLAkJCSAgICAgLyp0cF9nZXRhdHRyICovCi0JMCwJCQkJICAgICAvKnRwX3NldGF0dHIgKi8KLQkwLAkJCQkgICAgIC8qdHBfY29tcGFyZSAqLwotCVRrdHRfUmVwciwJCQkgICAgIC8qdHBfcmVwciAqLwotCTAsCQkJCSAgICAgLyp0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkgICAgIC8qdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkgICAgIC8qdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCSAgICAgLyp0cF9oYXNoICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInRrdGltZXJ0b2tlbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUgKi8KKyAgICBzaXplb2YoVGt0dE9iamVjdCksICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplICovCisgICAgVGt0dF9EZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQgKi8KKyAgICBUa3R0X0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUgKi8KKyAgICBUa3R0X1JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoICovCiB9OwogCiAKLQwKKwogLyoqIFRpbWVyIEhhbmRsZXIgKiovCiAKIHN0YXRpYyB2b2lkCiBUaW1lckhhbmRsZXIoQ2xpZW50RGF0YSBjbGllbnREYXRhKQogewotCVRrdHRPYmplY3QgKnYgPSAoVGt0dE9iamVjdCAqKWNsaWVudERhdGE7Ci0JUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOwotCVB5T2JqZWN0ICpyZXM7CisgICAgVGt0dE9iamVjdCAqdiA9IChUa3R0T2JqZWN0ICopY2xpZW50RGF0YTsKKyAgICBQeU9iamVjdCAqZnVuYyA9IHYtPmZ1bmM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQl2LT5mdW5jID0gTlVMTDsKKyAgICB2LT5mdW5jID0gTlVMTDsKIAotCUVOVEVSX1BZVEhPTgorICAgIEVOVEVSX1BZVEhPTgogCi0JcmVzICA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIE5VTEwpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlQeV9ERUNSRUYodik7IC8qIFNlZSBUa3R0X05ldygpICovCisgICAgcmVzICA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIE5VTEwpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYodik7IC8qIFNlZSBUa3R0X05ldygpICovCiAKLQlpZiAocmVzID09IE5VTEwpIHsKLQkJZXJyb3JJbkNtZCA9IDE7Ci0JCVB5RXJyX0ZldGNoKCZleGNJbkNtZCwgJnZhbEluQ21kLCAmdHJiSW5DbWQpOwotCX0KLQllbHNlCi0JCVB5X0RFQ1JFRihyZXMpOworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICBlcnJvckluQ21kID0gMTsKKyAgICAgICAgUHlFcnJfRmV0Y2goJmV4Y0luQ21kLCAmdmFsSW5DbWQsICZ0cmJJbkNtZCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAKLQlMRUFWRV9QWVRIT04KKyAgICBMRUFWRV9QWVRIT04KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0NyZWF0ZVRpbWVySGFuZGxlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG1pbGxpc2Vjb25kczsKLQlQeU9iamVjdCAqZnVuYzsKLQlUa3R0T2JqZWN0ICp2OworICAgIGludCBtaWxsaXNlY29uZHM7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgVGt0dE9iamVjdCAqdjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86Y3JlYXRldGltZXJoYW5kbGVyIiwKLQkJCSAgICAgICZtaWxsaXNlY29uZHMsICZmdW5jKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgYXJndW1lbnQgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpjcmVhdGV0aW1lcmhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlsbGlzZWNvbmRzLCAmZnVuYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIGFyZ3VtZW50IGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoIXNlbGYgJiYgIXRjbF9sb2NrKSB7Ci0JCS8qIFdlIGRvbid0IGhhdmUgdGhlIFRjbCBsb2NrIHNpbmNlIFRjbCBpcyB0aHJlYWRlZC4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiX3RraW50ZXIuY3JlYXRldGltZXJoYW5kbGVyIG5vdCBzdXBwb3J0ZWQgIgotCQkJCSJmb3IgdGhyZWFkZWQgVGNsIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIXNlbGYgJiYgIXRjbF9sb2NrKSB7CisgICAgICAgIC8qIFdlIGRvbid0IGhhdmUgdGhlIFRjbCBsb2NrIHNpbmNlIFRjbCBpcyB0aHJlYWRlZC4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfdGtpbnRlci5jcmVhdGV0aW1lcmhhbmRsZXIgbm90IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmVhZGVkIFRjbCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCWlmIChzZWxmKSB7Ci0JCUNIRUNLX1RDTF9BUFBBUlRNRU5UOwotCX0KKyAgICBpZiAoc2VsZikgeworICAgICAgICBDSEVDS19UQ0xfQVBQQVJUTUVOVDsKKyAgICB9CiAKLQl2ID0gVGt0dF9OZXcoZnVuYyk7Ci0JaWYgKHYpIHsKLQkJdi0+dG9rZW4gPSBUY2xfQ3JlYXRlVGltZXJIYW5kbGVyKG1pbGxpc2Vjb25kcywgVGltZXJIYW5kbGVyLAotCQkJCQkJICAoQ2xpZW50RGF0YSl2KTsKLQl9CisgICAgdiA9IFRrdHRfTmV3KGZ1bmMpOworICAgIGlmICh2KSB7CisgICAgICAgIHYtPnRva2VuID0gVGNsX0NyZWF0ZVRpbWVySGFuZGxlcihtaWxsaXNlY29uZHMsIFRpbWVySGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGllbnREYXRhKXYpOworICAgIH0KIAotCXJldHVybiAoUHlPYmplY3QgKikgdjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHY7CiB9CiAKLQwKKwogLyoqIEV2ZW50IExvb3AgKiovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9NYWluTG9vcChQeU9iamVjdCAqc2VsZnB0ciwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHRocmVzaG9sZCA9IDA7Ci0JVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7CisgICAgaW50IHRocmVzaG9sZCA9IDA7CisgICAgVGthcHBPYmplY3QgKnNlbGYgPSAoVGthcHBPYmplY3QqKXNlbGZwdHI7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7CiAjZW5kaWYKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6bWFpbmxvb3AiLCAmdGhyZXNob2xkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTptYWlubG9vcCIsICZ0aHJlc2hvbGQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKCFzZWxmICYmICF0Y2xfbG9jaykgewotCQkvKiBXZSBkb24ndCBoYXZlIHRoZSBUY2wgbG9jayBzaW5jZSBUY2wgaXMgdGhyZWFkZWQuICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJIl90a2ludGVyLm1haW5sb29wIG5vdCBzdXBwb3J0ZWQgIgotCQkJCSJmb3IgdGhyZWFkZWQgVGNsIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIXNlbGYgJiYgIXRjbF9sb2NrKSB7CisgICAgICAgIC8qIFdlIGRvbid0IGhhdmUgdGhlIFRjbCBsb2NrIHNpbmNlIFRjbCBpcyB0aHJlYWRlZC4gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfdGtpbnRlci5tYWlubG9vcCBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyZWFkZWQgVGNsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JaWYgKHNlbGYpIHsKLQkJQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7Ci0JCXNlbGYtPmRpc3BhdGNoaW5nID0gMTsKLQl9CisgICAgaWYgKHNlbGYpIHsKKyAgICAgICAgQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7CisgICAgICAgIHNlbGYtPmRpc3BhdGNoaW5nID0gMTsKKyAgICB9CiAKLQlxdWl0TWFpbkxvb3AgPSAwOwotCXdoaWxlIChUa19HZXROdW1NYWluV2luZG93cygpID4gdGhyZXNob2xkICYmCi0JICAgICAgICFxdWl0TWFpbkxvb3AgJiYKLQkgICAgICAgIWVycm9ySW5DbWQpCi0JewotCQlpbnQgcmVzdWx0OworICAgIHF1aXRNYWluTG9vcCA9IDA7CisgICAgd2hpbGUgKFRrX0dldE51bU1haW5XaW5kb3dzKCkgPiB0aHJlc2hvbGQgJiYKKyAgICAgICAgICAgIXF1aXRNYWluTG9vcCAmJgorICAgICAgICAgICAhZXJyb3JJbkNtZCkKKyAgICB7CisgICAgICAgIGludCByZXN1bHQ7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlpZiAoc2VsZiAmJiBzZWxmLT50aHJlYWRlZCkgewotCQkJLyogQWxsb3cgb3RoZXIgUHl0aG9uIHRocmVhZHMgdG8gcnVuLiAqLwotCQkJRU5URVJfVENMCi0JCQlyZXN1bHQgPSBUY2xfRG9PbmVFdmVudCgwKTsKLQkJCUxFQVZFX1RDTAotCQl9Ci0JCWVsc2UgewotCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkJaWYodGNsX2xvY2spUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRjbF9sb2NrLCAxKTsKLQkJCXRjbF90c3RhdGUgPSB0c3RhdGU7Ci0JCQlyZXN1bHQgPSBUY2xfRG9PbmVFdmVudChUQ0xfRE9OVF9XQUlUKTsKLQkJCXRjbF90c3RhdGUgPSBOVUxMOwotCQkJaWYodGNsX2xvY2spUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRjbF9sb2NrKTsKLQkJCWlmIChyZXN1bHQgPT0gMCkKLQkJCQlTbGVlcChUa2ludGVyX2J1c3l3YWl0aW50ZXJ2YWwpOwotCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJfQorICAgICAgICBpZiAoc2VsZiAmJiBzZWxmLT50aHJlYWRlZCkgeworICAgICAgICAgICAgLyogQWxsb3cgb3RoZXIgUHl0aG9uIHRocmVhZHMgdG8gcnVuLiAqLworICAgICAgICAgICAgRU5URVJfVENMCisgICAgICAgICAgICByZXN1bHQgPSBUY2xfRG9PbmVFdmVudCgwKTsKKyAgICAgICAgICAgIExFQVZFX1RDTAorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgaWYodGNsX2xvY2spUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRjbF9sb2NrLCAxKTsKKyAgICAgICAgICAgIHRjbF90c3RhdGUgPSB0c3RhdGU7CisgICAgICAgICAgICByZXN1bHQgPSBUY2xfRG9PbmVFdmVudChUQ0xfRE9OVF9XQUlUKTsKKyAgICAgICAgICAgIHRjbF90c3RhdGUgPSBOVUxMOworICAgICAgICAgICAgaWYodGNsX2xvY2spUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHRjbF9sb2NrKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgICAgICAgICAgICBTbGVlcChUa2ludGVyX2J1c3l3YWl0aW50ZXJ2YWwpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgfQogI2Vsc2UKLQkJcmVzdWx0ID0gVGNsX0RvT25lRXZlbnQoMCk7CisgICAgICAgIHJlc3VsdCA9IFRjbF9Eb09uZUV2ZW50KDApOwogI2VuZGlmCiAKLQkJaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpICE9IDApIHsKLQkJCWlmIChzZWxmKQotCQkJCXNlbGYtPmRpc3BhdGNoaW5nID0gMDsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChyZXN1bHQgPCAwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChzZWxmKQotCQlzZWxmLT5kaXNwYXRjaGluZyA9IDA7Ci0JcXVpdE1haW5Mb29wID0gMDsKKyAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpICE9IDApIHsKKyAgICAgICAgICAgIGlmIChzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYtPmRpc3BhdGNoaW5nID0gMDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzZWxmKQorICAgICAgICBzZWxmLT5kaXNwYXRjaGluZyA9IDA7CisgICAgcXVpdE1haW5Mb29wID0gMDsKIAotCWlmIChlcnJvckluQ21kKSB7Ci0JCWVycm9ySW5DbWQgPSAwOwotCQlQeUVycl9SZXN0b3JlKGV4Y0luQ21kLCB2YWxJbkNtZCwgdHJiSW5DbWQpOwotCQlleGNJbkNtZCA9IHZhbEluQ21kID0gdHJiSW5DbWQgPSBOVUxMOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChlcnJvckluQ21kKSB7CisgICAgICAgIGVycm9ySW5DbWQgPSAwOworICAgICAgICBQeUVycl9SZXN0b3JlKGV4Y0luQ21kLCB2YWxJbkNtZCwgdHJiSW5DbWQpOworICAgICAgICBleGNJbkNtZCA9IHZhbEluQ21kID0gdHJiSW5DbWQgPSBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfRG9PbmVFdmVudChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZsYWdzID0gMDsKLQlpbnQgcnY7CisgICAgaW50IGZsYWdzID0gMDsKKyAgICBpbnQgcnY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmRvb25lZXZlbnQiLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmRvb25lZXZlbnQiLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUVOVEVSX1RDTAotCXJ2ID0gVGNsX0RvT25lRXZlbnQoZmxhZ3MpOwotCUxFQVZFX1RDTAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgcnYpOworICAgIEVOVEVSX1RDTAorICAgIHJ2ID0gVGNsX0RvT25lRXZlbnQoZmxhZ3MpOworICAgIExFQVZFX1RDTAorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgcnYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfUXVpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpxdWl0IikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnF1aXQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlxdWl0TWFpbkxvb3AgPSAxOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBxdWl0TWFpbkxvb3AgPSAxOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX0ludGVycEFkZHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6aW50ZXJwYWRkciIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjppbnRlcnBhZGRyIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKVRrYXBwX0ludGVycChzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKVRrYXBwX0ludGVycChzZWxmKSk7CiB9CiAKLXN0YXRpYyBQeU9iamVjdAkqCitzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfVGtJbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdGF0aWMgaW50IGhhc19mYWlsZWQ7Ci0JVGNsX0ludGVycCAqaW50ZXJwID0gVGthcHBfSW50ZXJwKHNlbGYpOwotCVRrX1dpbmRvdyBtYWluX3dpbmRvdzsKLQljb25zdCBjaGFyICogX3RrX2V4aXN0cyA9IE5VTEw7Ci0JaW50IGVycjsKLQltYWluX3dpbmRvdyA9IFRrX01haW5XaW5kb3coaW50ZXJwKTsKKyAgICBzdGF0aWMgaW50IGhhc19mYWlsZWQ7CisgICAgVGNsX0ludGVycCAqaW50ZXJwID0gVGthcHBfSW50ZXJwKHNlbGYpOworICAgIFRrX1dpbmRvdyBtYWluX3dpbmRvdzsKKyAgICBjb25zdCBjaGFyICogX3RrX2V4aXN0cyA9IE5VTEw7CisgICAgaW50IGVycjsKKyAgICBtYWluX3dpbmRvdyA9IFRrX01haW5XaW5kb3coaW50ZXJwKTsKIAotCS8qIEluIGFsbCBjdXJyZW50IHZlcnNpb25zIG9mIFRrIChpbmNsdWRpbmcgOC40LjEzKSwgVGtfSW5pdAotCSAgIGRlYWRsb2NrcyBvbiB0aGUgc2Vjb25kIGNhbGwgd2hlbiB0aGUgZmlyc3QgY2FsbCBmYWlsZWQuCi0JICAgVG8gYXZvaWQgdGhlIGRlYWRsb2NrLCB3ZSBqdXN0IHJlZnVzZSB0aGUgc2Vjb25kIGNhbGwgdGhyb3VnaAotCSAgIGEgc3RhdGljIHZhcmlhYmxlLiAqLwotCWlmIChoYXNfZmFpbGVkKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLCAKLQkJCQkiQ2FsbGluZyBUa19Jbml0IGFnYWluIGFmdGVyIGEgcHJldmlvdXMgY2FsbCBmYWlsZWQgbWlnaHQgZGVhZGxvY2siKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSAgIAotCS8qIFdlIHdhbnQgdG8gZ3VhcmQgYWdhaW5zdCBjYWxsaW5nIFRrX0luaXQoKSBtdWx0aXBsZSB0aW1lcyAqLwotCUNIRUNLX1RDTF9BUFBBUlRNRU5UOwotCUVOVEVSX1RDTAotCWVyciA9IFRjbF9FdmFsKFRrYXBwX0ludGVycChzZWxmKSwgImluZm8gZXhpc3RzCXRrX3ZlcnNpb24iKTsKLQlFTlRFUl9PVkVSTEFQCi0JaWYgKGVyciA9PSBUQ0xfRVJST1IpIHsKLQkJLyogVGhpcyBzZXRzIGFuIGV4Y2VwdGlvbiwgYnV0IHdlIGNhbm5vdCByZXR1cm4gcmlnaHQKLQkJICAgYXdheSBiZWNhdXNlIHdlIG5lZWQgdG8gZXhpdCB0aGUgb3ZlcmxhcCBmaXJzdC4gKi8KLQkJVGtpbnRlcl9FcnJvcihzZWxmKTsKLQl9IGVsc2UgewotCQlfdGtfZXhpc3RzID0gVGthcHBfUmVzdWx0KHNlbGYpOwotCX0KLQlMRUFWRV9PVkVSTEFQX1RDTAotCWlmIChlcnIgPT0gVENMX0VSUk9SKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoX3RrX2V4aXN0cyA9PSBOVUxMIHx8IHN0cmNtcChfdGtfZXhpc3RzLCAiMSIpICE9IDApCXsKLQkJaWYgKFRrX0luaXQoaW50ZXJwKQk9PSBUQ0xfRVJST1IpIHsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGtpbnRlcl9UY2xFcnJvciwgVGNsX0dldFN0cmluZ1Jlc3VsdChUa2FwcF9JbnRlcnAoc2VsZikpKTsKLQkJCWhhc19mYWlsZWQgPSAxOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIC8qIEluIGFsbCBjdXJyZW50IHZlcnNpb25zIG9mIFRrIChpbmNsdWRpbmcgOC40LjEzKSwgVGtfSW5pdAorICAgICAgIGRlYWRsb2NrcyBvbiB0aGUgc2Vjb25kIGNhbGwgd2hlbiB0aGUgZmlyc3QgY2FsbCBmYWlsZWQuCisgICAgICAgVG8gYXZvaWQgdGhlIGRlYWRsb2NrLCB3ZSBqdXN0IHJlZnVzZSB0aGUgc2Vjb25kIGNhbGwgdGhyb3VnaAorICAgICAgIGEgc3RhdGljIHZhcmlhYmxlLiAqLworICAgIGlmIChoYXNfZmFpbGVkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUa2ludGVyX1RjbEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGxpbmcgVGtfSW5pdCBhZ2FpbiBhZnRlciBhIHByZXZpb3VzIGNhbGwgZmFpbGVkIG1pZ2h0IGRlYWRsb2NrIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIFdlIHdhbnQgdG8gZ3VhcmQgYWdhaW5zdCBjYWxsaW5nIFRrX0luaXQoKSBtdWx0aXBsZSB0aW1lcyAqLworICAgIENIRUNLX1RDTF9BUFBBUlRNRU5UOworICAgIEVOVEVSX1RDTAorICAgIGVyciA9IFRjbF9FdmFsKFRrYXBwX0ludGVycChzZWxmKSwgImluZm8gZXhpc3RzICAgICB0a192ZXJzaW9uIik7CisgICAgRU5URVJfT1ZFUkxBUAorICAgIGlmIChlcnIgPT0gVENMX0VSUk9SKSB7CisgICAgICAgIC8qIFRoaXMgc2V0cyBhbiBleGNlcHRpb24sIGJ1dCB3ZSBjYW5ub3QgcmV0dXJuIHJpZ2h0CisgICAgICAgICAgIGF3YXkgYmVjYXVzZSB3ZSBuZWVkIHRvIGV4aXQgdGhlIG92ZXJsYXAgZmlyc3QuICovCisgICAgICAgIFRraW50ZXJfRXJyb3Ioc2VsZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX3RrX2V4aXN0cyA9IFRrYXBwX1Jlc3VsdChzZWxmKTsKKyAgICB9CisgICAgTEVBVkVfT1ZFUkxBUF9UQ0wKKyAgICBpZiAoZXJyID09IFRDTF9FUlJPUikgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKF90a19leGlzdHMgPT0gTlVMTCB8fCBzdHJjbXAoX3RrX2V4aXN0cywgIjEiKSAhPSAwKSAgICAgeworICAgICAgICBpZiAoVGtfSW5pdChpbnRlcnApICAgICAgICAgICAgID09IFRDTF9FUlJPUikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRraW50ZXJfVGNsRXJyb3IsIFRjbF9HZXRTdHJpbmdSZXN1bHQoVGthcHBfSW50ZXJwKHNlbGYpKSk7CisgICAgICAgICAgICBoYXNfZmFpbGVkID0gMTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRrYXBwX1dhbnRPYmplY3RzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWludCB3YW50b2JqZWN0cyA9IC0xOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6d2FudG9iamVjdHMiLCAmd2FudG9iamVjdHMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAod2FudG9iamVjdHMgPT0gLTEpCi0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKChUa2FwcE9iamVjdCopc2VsZiktPndhbnRvYmplY3RzKTsKLQkoKFRrYXBwT2JqZWN0KilzZWxmKS0+d2FudG9iamVjdHMgPSB3YW50b2JqZWN0czsKKyAgICBpbnQgd2FudG9iamVjdHMgPSAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOndhbnRvYmplY3RzIiwgJndhbnRvYmplY3RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHdhbnRvYmplY3RzID09IC0xKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKCgoVGthcHBPYmplY3QqKXNlbGYpLT53YW50b2JqZWN0cyk7CisgICAgKChUa2FwcE9iamVjdCopc2VsZiktPndhbnRvYmplY3RzID0gd2FudG9iamVjdHM7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogVGthcHBfV2lsbERpc3BhdGNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCSgoVGthcHBPYmplY3QqKXNlbGYpLT5kaXNwYXRjaGluZyA9IDE7CisgICAgKChUa2FwcE9iamVjdCopc2VsZiktPmRpc3BhdGNoaW5nID0gMTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKLQwKKwogLyoqKiogVGthcHAgTWV0aG9kIExpc3QgKioqKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFRrYXBwX21ldGhvZHNbXSA9CiB7Ci0JeyJ3aWxsZGlzcGF0Y2giLCAgICAgICBUa2FwcF9XaWxsRGlzcGF0Y2gsIE1FVEhfTk9BUkdTfSwKLQl7IndhbnRvYmplY3RzIiwJICAgICAgIFRrYXBwX1dhbnRPYmplY3RzLCBNRVRIX1ZBUkFSR1N9LAotCXsiY2FsbCIsIAkgICAgICAgVGthcHBfQ2FsbCwgTUVUSF9WQVJBUkdTfSwKLQl7Imdsb2JhbGNhbGwiLCAJICAgICAgIFRrYXBwX0dsb2JhbENhbGwsIE1FVEhfVkFSQVJHU30sCi0JeyJldmFsIiwgCSAgICAgICBUa2FwcF9FdmFsLCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2xvYmFsZXZhbCIsIAkgICAgICAgVGthcHBfR2xvYmFsRXZhbCwgTUVUSF9WQVJBUkdTfSwKLQl7ImV2YWxmaWxlIiwgCSAgICAgICBUa2FwcF9FdmFsRmlsZSwgTUVUSF9WQVJBUkdTfSwKLQl7InJlY29yZCIsIAkgICAgICAgVGthcHBfUmVjb3JkLCBNRVRIX1ZBUkFSR1N9LAotCXsiYWRkZXJyb3JpbmZvIiwgICAgICAgVGthcHBfQWRkRXJyb3JJbmZvLCBNRVRIX1ZBUkFSR1N9LAotCXsic2V0dmFyIiwgCSAgICAgICBUa2FwcF9TZXRWYXIsIE1FVEhfVkFSQVJHU30sCi0JeyJnbG9iYWxzZXR2YXIiLCAgICAgICBUa2FwcF9HbG9iYWxTZXRWYXIsIE1FVEhfVkFSQVJHU30sCi0JeyJnZXR2YXIiLCAJICAgICAgIFRrYXBwX0dldFZhciwgTUVUSF9WQVJBUkdTfSwKLQl7Imdsb2JhbGdldHZhciIsICAgICAgIFRrYXBwX0dsb2JhbEdldFZhciwgTUVUSF9WQVJBUkdTfSwKLQl7InVuc2V0dmFyIiwgCSAgICAgICBUa2FwcF9VbnNldFZhciwgTUVUSF9WQVJBUkdTfSwKLQl7Imdsb2JhbHVuc2V0dmFyIiwgICAgIFRrYXBwX0dsb2JhbFVuc2V0VmFyLCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0aW50IiwgCSAgICAgICBUa2FwcF9HZXRJbnQsIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRkb3VibGUiLCAJICAgICAgIFRrYXBwX0dldERvdWJsZSwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGJvb2xlYW4iLCAJICAgICAgIFRrYXBwX0dldEJvb2xlYW4sIE1FVEhfVkFSQVJHU30sCi0JeyJleHByc3RyaW5nIiwgCSAgICAgICBUa2FwcF9FeHByU3RyaW5nLCBNRVRIX1ZBUkFSR1N9LAotCXsiZXhwcmxvbmciLCAJICAgICAgIFRrYXBwX0V4cHJMb25nLCBNRVRIX1ZBUkFSR1N9LAotCXsiZXhwcmRvdWJsZSIsIAkgICAgICAgVGthcHBfRXhwckRvdWJsZSwgTUVUSF9WQVJBUkdTfSwKLQl7ImV4cHJib29sZWFuIiwgICAgICAgIFRrYXBwX0V4cHJCb29sZWFuLCBNRVRIX1ZBUkFSR1N9LAotCXsic3BsaXRsaXN0IiwgCSAgICAgICBUa2FwcF9TcGxpdExpc3QsIE1FVEhfVkFSQVJHU30sCi0JeyJzcGxpdCIsIAkgICAgICAgVGthcHBfU3BsaXQsIE1FVEhfVkFSQVJHU30sCi0JeyJtZXJnZSIsIAkgICAgICAgVGthcHBfTWVyZ2UsIE1FVEhfVkFSQVJHU30sCi0JeyJjcmVhdGVjb21tYW5kIiwgICAgICBUa2FwcF9DcmVhdGVDb21tYW5kLCBNRVRIX1ZBUkFSR1N9LAotCXsiZGVsZXRlY29tbWFuZCIsICAgICAgVGthcHBfRGVsZXRlQ29tbWFuZCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IndpbGxkaXNwYXRjaCIsICAgICAgIFRrYXBwX1dpbGxEaXNwYXRjaCwgTUVUSF9OT0FSR1N9LAorICAgIHsid2FudG9iamVjdHMiLCAgICAgICAgICAgIFRrYXBwX1dhbnRPYmplY3RzLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2FsbCIsICAgICAgICAgICAgICAgICAgIFRrYXBwX0NhbGwsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnbG9iYWxjYWxsIiwgICAgICAgICAgICAgVGthcHBfR2xvYmFsQ2FsbCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImV2YWwiLCAgICAgICAgICAgICAgICAgICBUa2FwcF9FdmFsLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2xvYmFsZXZhbCIsICAgICAgICAgICAgIFRrYXBwX0dsb2JhbEV2YWwsIE1FVEhfVkFSQVJHU30sCisgICAgeyJldmFsZmlsZSIsICAgICAgICAgICAgICAgVGthcHBfRXZhbEZpbGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJyZWNvcmQiLCAgICAgICAgICAgICAgICAgVGthcHBfUmVjb3JkLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiYWRkZXJyb3JpbmZvIiwgICAgICAgVGthcHBfQWRkRXJyb3JJbmZvLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0dmFyIiwgICAgICAgICAgICAgICAgIFRrYXBwX1NldFZhciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Imdsb2JhbHNldHZhciIsICAgICAgIFRrYXBwX0dsb2JhbFNldFZhciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHZhciIsICAgICAgICAgICAgICAgICBUa2FwcF9HZXRWYXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnbG9iYWxnZXR2YXIiLCAgICAgICBUa2FwcF9HbG9iYWxHZXRWYXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJ1bnNldHZhciIsICAgICAgICAgICAgICAgVGthcHBfVW5zZXRWYXIsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnbG9iYWx1bnNldHZhciIsICAgICBUa2FwcF9HbG9iYWxVbnNldFZhciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGludCIsICAgICAgICAgICAgICAgICBUa2FwcF9HZXRJbnQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRkb3VibGUiLCAgICAgICAgICAgICAgVGthcHBfR2V0RG91YmxlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0Ym9vbGVhbiIsICAgICAgICAgICAgIFRrYXBwX0dldEJvb2xlYW4sIE1FVEhfVkFSQVJHU30sCisgICAgeyJleHByc3RyaW5nIiwgICAgICAgICAgICAgVGthcHBfRXhwclN0cmluZywgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImV4cHJsb25nIiwgICAgICAgICAgICAgICBUa2FwcF9FeHByTG9uZywgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImV4cHJkb3VibGUiLCAgICAgICAgICAgICBUa2FwcF9FeHByRG91YmxlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZXhwcmJvb2xlYW4iLCAgICAgICAgVGthcHBfRXhwckJvb2xlYW4sIE1FVEhfVkFSQVJHU30sCisgICAgeyJzcGxpdGxpc3QiLCAgICAgICAgICAgICAgVGthcHBfU3BsaXRMaXN0LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic3BsaXQiLCAgICAgICAgICAgICAgICAgIFRrYXBwX1NwbGl0LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsibWVyZ2UiLCAgICAgICAgICAgICAgICAgIFRrYXBwX01lcmdlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY3JlYXRlY29tbWFuZCIsICAgICAgVGthcHBfQ3JlYXRlQ29tbWFuZCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRlbGV0ZWNvbW1hbmQiLCAgICAgIFRrYXBwX0RlbGV0ZUNvbW1hbmQsIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgSEFWRV9DUkVBVEVGSUxFSEFORExFUgotCXsiY3JlYXRlZmlsZWhhbmRsZXIiLCAgVGthcHBfQ3JlYXRlRmlsZUhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCi0JeyJkZWxldGVmaWxlaGFuZGxlciIsICBUa2FwcF9EZWxldGVGaWxlSGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNyZWF0ZWZpbGVoYW5kbGVyIiwgIFRrYXBwX0NyZWF0ZUZpbGVIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZGVsZXRlZmlsZWhhbmRsZXIiLCAgVGthcHBfRGVsZXRlRmlsZUhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7ImNyZWF0ZXRpbWVyaGFuZGxlciIsIFRrYXBwX0NyZWF0ZVRpbWVySGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKLQl7Im1haW5sb29wIiwgCSAgICAgICBUa2FwcF9NYWluTG9vcCwgTUVUSF9WQVJBUkdTfSwKLQl7ImRvb25lZXZlbnQiLCAJICAgICAgIFRrYXBwX0RvT25lRXZlbnQsIE1FVEhfVkFSQVJHU30sCi0JeyJxdWl0IiwgCSAgICAgICBUa2FwcF9RdWl0LCBNRVRIX1ZBUkFSR1N9LAotCXsiaW50ZXJwYWRkciIsICAgICAgICAgVGthcHBfSW50ZXJwQWRkciwgTUVUSF9WQVJBUkdTfSwKLQl7ImxvYWR0ayIsCSAgICAgICBUa2FwcF9Ua0luaXQsIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwgCQkgICAgICAgTlVMTH0KKyAgICB7ImNyZWF0ZXRpbWVyaGFuZGxlciIsIFRrYXBwX0NyZWF0ZVRpbWVySGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1haW5sb29wIiwgICAgICAgICAgICAgICBUa2FwcF9NYWluTG9vcCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImRvb25lZXZlbnQiLCAgICAgICAgICAgICBUa2FwcF9Eb09uZUV2ZW50LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicXVpdCIsICAgICAgICAgICAgICAgICAgIFRrYXBwX1F1aXQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJpbnRlcnBhZGRyIiwgICAgICAgICBUa2FwcF9JbnRlcnBBZGRyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsibG9hZHRrIiwgICAgICAgICAgICAgICAgIFRrYXBwX1RrSW5pdCwgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgIE5VTEx9CiB9OwogCiAKLQwKKwogLyoqKiogVGthcHAgVHlwZSBNZXRob2RzICoqKiovCiAKIHN0YXRpYyB2b2lkCiBUa2FwcF9EZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCS8qQ0hFQ0tfVENMX0FQUEFSVE1FTlQ7Ki8KLQlFTlRFUl9UQ0wKLQlUY2xfRGVsZXRlSW50ZXJwKFRrYXBwX0ludGVycChzZWxmKSk7Ci0JTEVBVkVfVENMCi0JUHlPYmplY3RfRGVsKHNlbGYpOwotCURpc2FibGVFdmVudEhvb2soKTsKKyAgICAvKkNIRUNLX1RDTF9BUFBBUlRNRU5UOyovCisgICAgRU5URVJfVENMCisgICAgVGNsX0RlbGV0ZUludGVycChUa2FwcF9JbnRlcnAoc2VsZikpOworICAgIExFQVZFX1RDTAorICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBEaXNhYmxlRXZlbnRIb29rKCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2FwcF9HZXRBdHRyKFB5T2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeV9GaW5kTWV0aG9kKFRrYXBwX21ldGhvZHMsIHNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKFRrYXBwX21ldGhvZHMsIHNlbGYsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFRrYXBwX1R5cGUgPQogewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJ0a2FwcCIsCQkJICAgICAvKnRwX25hbWUgKi8KLQlzaXplb2YoVGthcHBPYmplY3QpLAkJICAgICAvKnRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCSAgICAgLyp0cF9pdGVtc2l6ZSAqLwotCVRrYXBwX0RlYWxsb2MsCQkJICAgICAvKnRwX2RlYWxsb2MgKi8KLQkwLAkJCQkgICAgIC8qdHBfcHJpbnQgKi8KLQlUa2FwcF9HZXRBdHRyLAkJCSAgICAgLyp0cF9nZXRhdHRyICovCi0JMCwJCQkJICAgICAvKnRwX3NldGF0dHIgKi8KLQkwLAkJCQkgICAgIC8qdHBfY29tcGFyZSAqLwotCTAsCQkJCSAgICAgLyp0cF9yZXByICovCi0JMCwJCQkJICAgICAvKnRwX2FzX251bWJlciAqLwotCTAsCQkJCSAgICAgLyp0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCSAgICAgLyp0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJICAgICAvKnRwX2hhc2ggKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAidGthcHAiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSAqLworICAgIHNpemVvZihUa2FwcE9iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUgKi8KKyAgICBUa2FwcF9EZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCAqLworICAgIFRrYXBwX0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KIH07CiAKIAotDAorCiAvKioqKiBUa2ludGVyIE1vZHVsZSAqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3QqIHR1cGxlOwotCWludCBzaXplOyAvKiBjdXJyZW50IHNpemUgKi8KLQlpbnQgbWF4c2l6ZTsgLyogYWxsb2NhdGVkIHNpemUgKi8KKyAgICBQeU9iamVjdCogdHVwbGU7CisgICAgaW50IHNpemU7IC8qIGN1cnJlbnQgc2l6ZSAqLworICAgIGludCBtYXhzaXplOyAvKiBhbGxvY2F0ZWQgc2l6ZSAqLwogfSBGbGF0dGVuQ29udGV4dDsKIAogc3RhdGljIGludAogX2J1bXAoRmxhdHRlbkNvbnRleHQqIGNvbnRleHQsIGludCBzaXplKQogewotCS8qIGV4cGFuZCB0dXBsZSB0byBob2xkIChhdCBsZWFzdCkgc2l6ZSBuZXcgaXRlbXMuCi0JICAgcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQgKi8KKyAgICAvKiBleHBhbmQgdHVwbGUgdG8gaG9sZCAoYXQgbGVhc3QpIHNpemUgbmV3IGl0ZW1zLgorICAgICAgIHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkICovCiAKLQlpbnQgbWF4c2l6ZSA9IGNvbnRleHQtPm1heHNpemUgKiAyOworICAgIGludCBtYXhzaXplID0gY29udGV4dC0+bWF4c2l6ZSAqIDI7CiAKLQlpZiAobWF4c2l6ZSA8IGNvbnRleHQtPnNpemUgKyBzaXplKQotCQltYXhzaXplID0gY29udGV4dC0+c2l6ZSArIHNpemU7CisgICAgaWYgKG1heHNpemUgPCBjb250ZXh0LT5zaXplICsgc2l6ZSkKKyAgICAgICAgbWF4c2l6ZSA9IGNvbnRleHQtPnNpemUgKyBzaXplOwogCi0JY29udGV4dC0+bWF4c2l6ZSA9IG1heHNpemU7CisgICAgY29udGV4dC0+bWF4c2l6ZSA9IG1heHNpemU7CiAKLQlyZXR1cm4gX1B5VHVwbGVfUmVzaXplKCZjb250ZXh0LT50dXBsZSwgbWF4c2l6ZSkgPj0gMDsKKyAgICByZXR1cm4gX1B5VHVwbGVfUmVzaXplKCZjb250ZXh0LT50dXBsZSwgbWF4c2l6ZSkgPj0gMDsKIH0KIAogc3RhdGljIGludAogX2ZsYXR0ZW4xKEZsYXR0ZW5Db250ZXh0KiBjb250ZXh0LCBQeU9iamVjdCogaXRlbSwgaW50IGRlcHRoKQogewotCS8qIGFkZCB0dXBsZSBvciBsaXN0IHRvIGFyZ3VtZW50IHR1cGxlIChyZWN1cnNpdmVseSkgKi8KKyAgICAvKiBhZGQgdHVwbGUgb3IgbGlzdCB0byBhcmd1bWVudCB0dXBsZSAocmVjdXJzaXZlbHkpICovCiAKLQlpbnQgaSwgc2l6ZTsKKyAgICBpbnQgaSwgc2l6ZTsKIAotCWlmIChkZXB0aCA+IDEwMDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm5lc3RpbmcgdG9vIGRlZXAgaW4gX2ZsYXR0ZW4iKTsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmIChQeUxpc3RfQ2hlY2soaXRlbSkpIHsKLQkJc2l6ZSA9IFB5TGlzdF9HRVRfU0laRShpdGVtKTsKLQkJLyogcHJlYWxsb2NhdGUgKGFzc3VtZSBubyBuZXN0aW5nKSAqLwotCQlpZiAoY29udGV4dC0+c2l6ZSArIHNpemUgPiBjb250ZXh0LT5tYXhzaXplICYmCi0JCSAgICAhX2J1bXAoY29udGV4dCwgc2l6ZSkpCi0JCQlyZXR1cm4gMDsKLQkJLyogY29weSBpdGVtcyB0byBvdXRwdXQgdHVwbGUgKi8KLQkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJUHlPYmplY3QgKm8gPSBQeUxpc3RfR0VUX0lURU0oaXRlbSwgaSk7Ci0JCQlpZiAoUHlMaXN0X0NoZWNrKG8pIHx8IFB5VHVwbGVfQ2hlY2sobykpIHsKLQkJCQlpZiAoIV9mbGF0dGVuMShjb250ZXh0LCBvLCBkZXB0aCArIDEpKQotCQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSBpZiAobyAhPSBQeV9Ob25lKSB7Ci0JCQkJaWYgKGNvbnRleHQtPnNpemUgKyAxID4gY29udGV4dC0+bWF4c2l6ZSAmJgotCQkJCSAgICAhX2J1bXAoY29udGV4dCwgMSkpCi0JCQkJCXJldHVybiAwOwotCQkJCVB5X0lOQ1JFRihvKTsKLQkJCQlQeVR1cGxlX1NFVF9JVEVNKGNvbnRleHQtPnR1cGxlLAotCQkJCQkJIGNvbnRleHQtPnNpemUrKywgbyk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soaXRlbSkpIHsKLQkJLyogc2FtZSwgZm9yIHR1cGxlcyAqLwotCQlzaXplID0gUHlUdXBsZV9HRVRfU0laRShpdGVtKTsKLQkJaWYgKGNvbnRleHQtPnNpemUgKyBzaXplID4gY29udGV4dC0+bWF4c2l6ZSAmJgotCQkgICAgIV9idW1wKGNvbnRleHQsIHNpemUpKQotCQkJcmV0dXJuIDA7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVB5T2JqZWN0ICpvID0gUHlUdXBsZV9HRVRfSVRFTShpdGVtLCBpKTsKLQkJCWlmIChQeUxpc3RfQ2hlY2sobykgfHwgUHlUdXBsZV9DaGVjayhvKSkgewotCQkJCWlmICghX2ZsYXR0ZW4xKGNvbnRleHQsIG8sIGRlcHRoICsgMSkpCi0JCQkJCXJldHVybiAwOwotCQkJfSBlbHNlIGlmIChvICE9IFB5X05vbmUpIHsKLQkJCQlpZiAoY29udGV4dC0+c2l6ZSArIDEgPiBjb250ZXh0LT5tYXhzaXplICYmCi0JCQkJICAgICFfYnVtcChjb250ZXh0LCAxKSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJUHlfSU5DUkVGKG8pOwotCQkJCVB5VHVwbGVfU0VUX0lURU0oY29udGV4dC0+dHVwbGUsCi0JCQkJCQkgY29udGV4dC0+c2l6ZSsrLCBvKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmd1bWVudCBtdXN0IGJlIHNlcXVlbmNlIik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAoZGVwdGggPiAxMDAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5lc3RpbmcgdG9vIGRlZXAgaW4gX2ZsYXR0ZW4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChQeUxpc3RfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgc2l6ZSA9IFB5TGlzdF9HRVRfU0laRShpdGVtKTsKKyAgICAgICAgLyogcHJlYWxsb2NhdGUgKGFzc3VtZSBubyBuZXN0aW5nKSAqLworICAgICAgICBpZiAoY29udGV4dC0+c2l6ZSArIHNpemUgPiBjb250ZXh0LT5tYXhzaXplICYmCisgICAgICAgICAgICAhX2J1bXAoY29udGV4dCwgc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgLyogY29weSBpdGVtcyB0byBvdXRwdXQgdHVwbGUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeUxpc3RfR0VUX0lURU0oaXRlbSwgaSk7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0NoZWNrKG8pIHx8IFB5VHVwbGVfQ2hlY2sobykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9mbGF0dGVuMShjb250ZXh0LCBvLCBkZXB0aCArIDEpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobyAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQtPnNpemUgKyAxID4gY29udGV4dC0+bWF4c2l6ZSAmJgorICAgICAgICAgICAgICAgICAgICAhX2J1bXAoY29udGV4dCwgMSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGNvbnRleHQtPnR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+c2l6ZSsrLCBvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoUHlUdXBsZV9DaGVjayhpdGVtKSkgeworICAgICAgICAvKiBzYW1lLCBmb3IgdHVwbGVzICovCisgICAgICAgIHNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGl0ZW0pOworICAgICAgICBpZiAoY29udGV4dC0+c2l6ZSArIHNpemUgPiBjb250ZXh0LT5tYXhzaXplICYmCisgICAgICAgICAgICAhX2J1bXAoY29udGV4dCwgc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dFVF9JVEVNKGl0ZW0sIGkpOworICAgICAgICAgICAgaWYgKFB5TGlzdF9DaGVjayhvKSB8fCBQeVR1cGxlX0NoZWNrKG8pKSB7CisgICAgICAgICAgICAgICAgaWYgKCFfZmxhdHRlbjEoY29udGV4dCwgbywgZGVwdGggKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG8gIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LT5zaXplICsgMSA+IGNvbnRleHQtPm1heHNpemUgJiYKKyAgICAgICAgICAgICAgICAgICAgIV9idW1wKGNvbnRleHQsIDEpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShjb250ZXh0LT50dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPnNpemUrKywgbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJndW1lbnQgbXVzdCBiZSBzZXF1ZW5jZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBUa2ludGVyX0ZsYXR0ZW4oUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUZsYXR0ZW5Db250ZXh0IGNvbnRleHQ7Ci0JUHlPYmplY3QqIGl0ZW07CisgICAgRmxhdHRlbkNvbnRleHQgY29udGV4dDsKKyAgICBQeU9iamVjdCogaXRlbTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfZmxhdHRlbiIsICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9mbGF0dGVuIiwgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvbnRleHQubWF4c2l6ZSA9IFB5U2VxdWVuY2VfU2l6ZShpdGVtKTsKLQlpZiAoY29udGV4dC5tYXhzaXplIDw9IDApCi0JCXJldHVybiBQeVR1cGxlX05ldygwKTsKLQkKLQljb250ZXh0LnR1cGxlID0gUHlUdXBsZV9OZXcoY29udGV4dC5tYXhzaXplKTsKLQlpZiAoIWNvbnRleHQudHVwbGUpCi0JCXJldHVybiBOVUxMOwotCQotCWNvbnRleHQuc2l6ZSA9IDA7CisgICAgY29udGV4dC5tYXhzaXplID0gUHlTZXF1ZW5jZV9TaXplKGl0ZW0pOworICAgIGlmIChjb250ZXh0Lm1heHNpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIFB5VHVwbGVfTmV3KDApOwogCi0JaWYgKCFfZmxhdHRlbjEoJmNvbnRleHQsIGl0ZW0sMCkpCi0JCXJldHVybiBOVUxMOworICAgIGNvbnRleHQudHVwbGUgPSBQeVR1cGxlX05ldyhjb250ZXh0Lm1heHNpemUpOworICAgIGlmICghY29udGV4dC50dXBsZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoX1B5VHVwbGVfUmVzaXplKCZjb250ZXh0LnR1cGxlLCBjb250ZXh0LnNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjb250ZXh0LnNpemUgPSAwOwogCi0JcmV0dXJuIGNvbnRleHQudHVwbGU7CisgICAgaWYgKCFfZmxhdHRlbjEoJmNvbnRleHQsIGl0ZW0sMCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKF9QeVR1cGxlX1Jlc2l6ZSgmY29udGV4dC50dXBsZSwgY29udGV4dC5zaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gY29udGV4dC50dXBsZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRraW50ZXJfQ3JlYXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzY3JlZW5OYW1lID0gTlVMTDsKLQljaGFyICpiYXNlTmFtZSA9IE5VTEw7Ci0JY2hhciAqY2xhc3NOYW1lID0gTlVMTDsKLQlpbnQgaW50ZXJhY3RpdmUgPSAwOwotCWludCB3YW50b2JqZWN0cyA9IDA7Ci0JaW50IHdhbnRUayA9IDE7CS8qIElmIGZhbHNlLCB0aGVuIFRrX0luaXQoKSBkb2Vzbid0IGdldAljYWxsZWQgKi8KLQlpbnQgc3luYyA9IDA7IC8qIHBhc3MgLXN5bmMgdG8gd2lzaCAqLwotCWNoYXIgKnVzZSA9IE5VTEw7IC8qIHBhc3MgLXVzZSB0byB3aXNoICovCisgICAgY2hhciAqc2NyZWVuTmFtZSA9IE5VTEw7CisgICAgY2hhciAqYmFzZU5hbWUgPSBOVUxMOworICAgIGNoYXIgKmNsYXNzTmFtZSA9IE5VTEw7CisgICAgaW50IGludGVyYWN0aXZlID0gMDsKKyAgICBpbnQgd2FudG9iamVjdHMgPSAwOworICAgIGludCB3YW50VGsgPSAxOyAgICAgLyogSWYgZmFsc2UsIHRoZW4gVGtfSW5pdCgpIGRvZXNuJ3QgZ2V0IGNhbGxlZCAqLworICAgIGludCBzeW5jID0gMDsgLyogcGFzcyAtc3luYyB0byB3aXNoICovCisgICAgY2hhciAqdXNlID0gTlVMTDsgLyogcGFzcyAtdXNlIHRvIHdpc2ggKi8KIAotCWJhc2VOYW1lID0gc3RycmNocihQeV9HZXRQcm9ncmFtTmFtZSgpLCAnLycpOwotCWlmIChiYXNlTmFtZSAhPSBOVUxMKQotCQliYXNlTmFtZSsrOwotCWVsc2UKLQkJYmFzZU5hbWUgPSBQeV9HZXRQcm9ncmFtTmFtZSgpOwotCWNsYXNzTmFtZSA9ICJUayI7Ci0gIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHpzc2lpaWl6OmNyZWF0ZSIsCi0JCQkgICAgICAmc2NyZWVuTmFtZSwgJmJhc2VOYW1lLCAmY2xhc3NOYW1lLAotCQkJICAgICAgJmludGVyYWN0aXZlLCAmd2FudG9iamVjdHMsICZ3YW50VGssCi0JCQkgICAgICAmc3luYywgJnVzZSkpCi0JCXJldHVybiBOVUxMOworICAgIGJhc2VOYW1lID0gc3RycmNocihQeV9HZXRQcm9ncmFtTmFtZSgpLCAnLycpOworICAgIGlmIChiYXNlTmFtZSAhPSBOVUxMKQorICAgICAgICBiYXNlTmFtZSsrOworICAgIGVsc2UKKyAgICAgICAgYmFzZU5hbWUgPSBQeV9HZXRQcm9ncmFtTmFtZSgpOworICAgIGNsYXNzTmFtZSA9ICJUayI7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopIFRrYXBwX05ldyhzY3JlZW5OYW1lLCBiYXNlTmFtZSwgY2xhc3NOYW1lLCAKLQkJCQkgICAgICBpbnRlcmFjdGl2ZSwgd2FudG9iamVjdHMsCXdhbnRUaywKLQkJCQkgICAgICBzeW5jLCB1c2UpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHpzc2lpaWl6OmNyZWF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JlZW5OYW1lLCAmYmFzZU5hbWUsICZjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmFjdGl2ZSwgJndhbnRvYmplY3RzLCAmd2FudFRrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3luYywgJnVzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBUa2FwcF9OZXcoc2NyZWVuTmFtZSwgYmFzZU5hbWUsIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZSwgd2FudG9iamVjdHMsICAgICB3YW50VGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luYywgdXNlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFRraW50ZXJfc2V0YnVzeXdhaXRpbnRlcnZhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG5ld192YWw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldGJ1c3l3YWl0aW50ZXJ2YWwiLCAmbmV3X3ZhbCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChuZXdfdmFsIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiYnVzeXdhaXRpbnRlcnZhbCBtdXN0IGJlID49IDAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVRraW50ZXJfYnVzeXdhaXRpbnRlcnZhbCA9IG5ld192YWw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGludCBuZXdfdmFsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRidXN5d2FpdGludGVydmFsIiwgJm5ld192YWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobmV3X3ZhbCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVzeXdhaXRpbnRlcnZhbCBtdXN0IGJlID49IDAiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFRraW50ZXJfYnVzeXdhaXRpbnRlcnZhbCA9IG5ld192YWw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBzZXRidXN5d2FpdGludGVydmFsX2RvY1tdID0KQEAgLTI5NDgsNyArMjk0OCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogVGtpbnRlcl9nZXRidXN5d2FpdGludGVydmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRraW50ZXJfYnVzeXdhaXRpbnRlcnZhbCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRraW50ZXJfYnVzeXdhaXRpbnRlcnZhbCk7CiB9CiAKIHN0YXRpYyBjaGFyIGdldGJ1c3l3YWl0aW50ZXJ2YWxfZG9jW10gPQpAQCAtMjk1OSwyMSArMjk1OSwyMSBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlTWV0aG9kc1tdID0KIHsKLQl7Il9mbGF0dGVuIiwgICAgICAgICAgIFRraW50ZXJfRmxhdHRlbiwgTUVUSF9WQVJBUkdTfSwKLQl7ImNyZWF0ZSIsICAgICAgICAgICAgIFRraW50ZXJfQ3JlYXRlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiX2ZsYXR0ZW4iLCAgICAgICAgICAgVGtpbnRlcl9GbGF0dGVuLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY3JlYXRlIiwgICAgICAgICAgICAgVGtpbnRlcl9DcmVhdGUsIE1FVEhfVkFSQVJHU30sCiAjaWZkZWYgSEFWRV9DUkVBVEVGSUxFSEFORExFUgotCXsiY3JlYXRlZmlsZWhhbmRsZXIiLCAgVGthcHBfQ3JlYXRlRmlsZUhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCi0JeyJkZWxldGVmaWxlaGFuZGxlciIsICBUa2FwcF9EZWxldGVGaWxlSGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNyZWF0ZWZpbGVoYW5kbGVyIiwgIFRrYXBwX0NyZWF0ZUZpbGVIYW5kbGVyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZGVsZXRlZmlsZWhhbmRsZXIiLCAgVGthcHBfRGVsZXRlRmlsZUhhbmRsZXIsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKLQl7ImNyZWF0ZXRpbWVyaGFuZGxlciIsIFRrYXBwX0NyZWF0ZVRpbWVySGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKLQl7Im1haW5sb29wIiwgICAgICAgICAgIFRrYXBwX01haW5Mb29wLCBNRVRIX1ZBUkFSR1N9LAotCXsiZG9vbmVldmVudCIsICAgICAgICAgVGthcHBfRG9PbmVFdmVudCwgTUVUSF9WQVJBUkdTfSwKLQl7InF1aXQiLCAgICAgICAgICAgICAgIFRrYXBwX1F1aXQsIE1FVEhfVkFSQVJHU30sCi0JeyJzZXRidXN5d2FpdGludGVydmFsIixUa2ludGVyX3NldGJ1c3l3YWl0aW50ZXJ2YWwsIE1FVEhfVkFSQVJHUywKLQkgICAgICAgICAgICAgICAgICAgICAgIHNldGJ1c3l3YWl0aW50ZXJ2YWxfZG9jfSwKLQl7ImdldGJ1c3l3YWl0aW50ZXJ2YWwiLChQeUNGdW5jdGlvbilUa2ludGVyX2dldGJ1c3l3YWl0aW50ZXJ2YWwsCi0JICAgICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgZ2V0YnVzeXdhaXRpbnRlcnZhbF9kb2N9LAotCXtOVUxMLCAgICAgICAgICAgICAgICAgTlVMTH0KKyAgICB7ImNyZWF0ZXRpbWVyaGFuZGxlciIsIFRrYXBwX0NyZWF0ZVRpbWVySGFuZGxlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1haW5sb29wIiwgICAgICAgICAgIFRrYXBwX01haW5Mb29wLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZG9vbmVldmVudCIsICAgICAgICAgVGthcHBfRG9PbmVFdmVudCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InF1aXQiLCAgICAgICAgICAgICAgIFRrYXBwX1F1aXQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRidXN5d2FpdGludGVydmFsIixUa2ludGVyX3NldGJ1c3l3YWl0aW50ZXJ2YWwsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGJ1c3l3YWl0aW50ZXJ2YWxfZG9jfSwKKyAgICB7ImdldGJ1c3l3YWl0aW50ZXJ2YWwiLChQeUNGdW5jdGlvbilUa2ludGVyX2dldGJ1c3l3YWl0aW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgZ2V0YnVzeXdhaXRpbnRlcnZhbF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgTlVMTH0KIH07CiAKICNpZmRlZiBXQUlUX0ZPUl9TVERJTgpAQCAtMjk4NCw3ICsyOTg0LDcgQEAKIHN0YXRpYyB2b2lkCiBNeUZpbGVQcm9jKHZvaWQgKmNsaWVudERhdGEsIGludCBtYXNrKQogewotCXN0ZGluX3JlYWR5ID0gMTsKKyAgICBzdGRpbl9yZWFkeSA9IDE7CiB9CiAjZW5kaWYKIApAQCAtMjk5Niw1NyArMjk5Niw1NyBAQAogRXZlbnRIb29rKHZvaWQpCiB7CiAjaWZuZGVmIE1TX1dJTkRPV1MKLQlpbnQgdGZpbGU7CisgICAgaW50IHRmaWxlOwogI2VuZGlmCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUV2YWxfUmVzdG9yZVRocmVhZChldmVudF90c3RhdGUpOworICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKGV2ZW50X3RzdGF0ZSk7CiAjZW5kaWYKLQlzdGRpbl9yZWFkeSA9IDA7Ci0JZXJyb3JJbkNtZCA9IDA7CisgICAgc3RkaW5fcmVhZHkgPSAwOworICAgIGVycm9ySW5DbWQgPSAwOwogI2lmbmRlZiBNU19XSU5ET1dTCi0JdGZpbGUgPSBmaWxlbm8oc3RkaW4pOwotCVRjbF9DcmVhdGVGaWxlSGFuZGxlcih0ZmlsZSwgVENMX1JFQURBQkxFLCBNeUZpbGVQcm9jLCBOVUxMKTsKKyAgICB0ZmlsZSA9IGZpbGVubyhzdGRpbik7CisgICAgVGNsX0NyZWF0ZUZpbGVIYW5kbGVyKHRmaWxlLCBUQ0xfUkVBREFCTEUsIE15RmlsZVByb2MsIE5VTEwpOwogI2VuZGlmCi0Jd2hpbGUgKCFlcnJvckluQ21kICYmICFzdGRpbl9yZWFkeSkgewotCQlpbnQgcmVzdWx0OworICAgIHdoaWxlICghZXJyb3JJbkNtZCAmJiAhc3RkaW5fcmVhZHkpIHsKKyAgICAgICAgaW50IHJlc3VsdDsKICNpZmRlZiBNU19XSU5ET1dTCi0JCWlmIChfa2JoaXQoKSkgewotCQkJc3RkaW5fcmVhZHkgPSAxOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaWYgKF9rYmhpdCgpKSB7CisgICAgICAgICAgICBzdGRpbl9yZWFkeSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogI2VuZGlmCiAjaWYgZGVmaW5lZChXSVRIX1RIUkVBRCkgfHwgZGVmaW5lZChNU19XSU5ET1dTKQotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWlmKHRjbF9sb2NrKVB5VGhyZWFkX2FjcXVpcmVfbG9jayh0Y2xfbG9jaywgMSk7Ci0JCXRjbF90c3RhdGUgPSBldmVudF90c3RhdGU7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYodGNsX2xvY2spUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHRjbF9sb2NrLCAxKTsKKyAgICAgICAgdGNsX3RzdGF0ZSA9IGV2ZW50X3RzdGF0ZTsKIAotCQlyZXN1bHQgPSBUY2xfRG9PbmVFdmVudChUQ0xfRE9OVF9XQUlUKTsKKyAgICAgICAgcmVzdWx0ID0gVGNsX0RvT25lRXZlbnQoVENMX0RPTlRfV0FJVCk7CiAKLQkJdGNsX3RzdGF0ZSA9IE5VTEw7Ci0JCWlmKHRjbF9sb2NrKVB5VGhyZWFkX3JlbGVhc2VfbG9jayh0Y2xfbG9jayk7Ci0JCWlmIChyZXN1bHQgPT0gMCkKLQkJCVNsZWVwKFRraW50ZXJfYnVzeXdhaXRpbnRlcnZhbCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHRjbF90c3RhdGUgPSBOVUxMOworICAgICAgICBpZih0Y2xfbG9jaylQeVRocmVhZF9yZWxlYXNlX2xvY2sodGNsX2xvY2spOworICAgICAgICBpZiAocmVzdWx0ID09IDApCisgICAgICAgICAgICBTbGVlcChUa2ludGVyX2J1c3l3YWl0aW50ZXJ2YWwpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogI2Vsc2UKLQkJcmVzdWx0ID0gVGNsX0RvT25lRXZlbnQoMCk7CisgICAgICAgIHJlc3VsdCA9IFRjbF9Eb09uZUV2ZW50KDApOwogI2VuZGlmCiAKLQkJaWYgKHJlc3VsdCA8IDApCi0JCQlicmVhazsKLQl9CisgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogI2lmbmRlZiBNU19XSU5ET1dTCi0JVGNsX0RlbGV0ZUZpbGVIYW5kbGVyKHRmaWxlKTsKKyAgICBUY2xfRGVsZXRlRmlsZUhhbmRsZXIodGZpbGUpOwogI2VuZGlmCi0JaWYgKGVycm9ySW5DbWQpIHsKLQkJZXJyb3JJbkNtZCA9IDA7Ci0JCVB5RXJyX1Jlc3RvcmUoZXhjSW5DbWQsIHZhbEluQ21kLCB0cmJJbkNtZCk7Ci0JCWV4Y0luQ21kID0gdmFsSW5DbWQgPSB0cmJJbkNtZCA9IE5VTEw7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQorICAgIGlmIChlcnJvckluQ21kKSB7CisgICAgICAgIGVycm9ySW5DbWQgPSAwOworICAgICAgICBQeUVycl9SZXN0b3JlKGV4Y0luQ21kLCB2YWxJbkNtZCwgdHJiSW5DbWQpOworICAgICAgICBleGNJbkNtZCA9IHZhbEluQ21kID0gdHJiSW5DbWQgPSBOVUxMOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5RXZhbF9TYXZlVGhyZWFkKCk7CisgICAgUHlFdmFsX1NhdmVUaHJlYWQoKTsKICNlbmRpZgotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAjZW5kaWYKQEAgLTMwNTUsMTIgKzMwNTUsMTIgQEAKIEVuYWJsZUV2ZW50SG9vayh2b2lkKQogewogI2lmZGVmIFdBSVRfRk9SX1NURElOCi0JaWYgKFB5T1NfSW5wdXRIb29rID09IE5VTEwpIHsKKyAgICBpZiAoUHlPU19JbnB1dEhvb2sgPT0gTlVMTCkgewogI2lmZGVmIFdJVEhfVEhSRUFECi0JCWV2ZW50X3RzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7CisgICAgICAgIGV2ZW50X3RzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7CiAjZW5kaWYKLQkJUHlPU19JbnB1dEhvb2sgPSBFdmVudEhvb2s7Ci0JfQorICAgICAgICBQeU9TX0lucHV0SG9vayA9IEV2ZW50SG9vazsKKyAgICB9CiAjZW5kaWYKIH0KIApAQCAtMzA2OCw5ICszMDY4LDkgQEAKIERpc2FibGVFdmVudEhvb2sodm9pZCkKIHsKICNpZmRlZiBXQUlUX0ZPUl9TVERJTgotCWlmIChUa19HZXROdW1NYWluV2luZG93cygpID09IDAgJiYgUHlPU19JbnB1dEhvb2sgPT0gRXZlbnRIb29rKSB7Ci0JCVB5T1NfSW5wdXRIb29rID0gTlVMTDsKLQl9CisgICAgaWYgKFRrX0dldE51bU1haW5XaW5kb3dzKCkgPT0gMCAmJiBQeU9TX0lucHV0SG9vayA9PSBFdmVudEhvb2spIHsKKyAgICAgICAgUHlPU19JbnB1dEhvb2sgPSBOVUxMOworICAgIH0KICNlbmRpZgogfQogCkBAIC0zMDc5LDg5ICszMDc5LDg5IEBACiBzdGF0aWMgdm9pZAogaW5zX2xvbmcoUHlPYmplY3QgKmQsIGNoYXIgKm5hbWUsIGxvbmcgdmFsKQogewotCVB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcodmFsKTsKLQlpZiAodikgewotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgaWYgKHYpIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiB9CiBzdGF0aWMgdm9pZAogaW5zX3N0cmluZyhQeU9iamVjdCAqZCwgY2hhciAqbmFtZSwgY2hhciAqdmFsKQogewotCVB5T2JqZWN0ICp2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWwpOwotCWlmICh2KSB7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpOwotCQlQeV9ERUNSRUYodik7Ci0JfQorICAgIFB5T2JqZWN0ICp2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWwpOworICAgIGlmICh2KSB7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQogfQogCiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X3RraW50ZXIodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JUHlfVFlQRSgmVGthcHBfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfVFlQRSgmVGthcHBfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCXRjbF9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIHRjbF9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwogI2VuZGlmCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX3RraW50ZXIiLCBtb2R1bGVNZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl90a2ludGVyIiwgbW9kdWxlTWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JVGtpbnRlcl9UY2xFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiX3RraW50ZXIuVGNsRXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVGNsRXJyb3IiLCBUa2ludGVyX1RjbEVycm9yKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBUa2ludGVyX1RjbEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJfdGtpbnRlci5UY2xFcnJvciIsIE5VTEwsIE5VTEwpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUY2xFcnJvciIsIFRraW50ZXJfVGNsRXJyb3IpOwogCi0JaW5zX2xvbmcoZCwgIlJFQURBQkxFIiwgVENMX1JFQURBQkxFKTsKLQlpbnNfbG9uZyhkLCAiV1JJVEFCTEUiLCBUQ0xfV1JJVEFCTEUpOwotCWluc19sb25nKGQsICJFWENFUFRJT04iLCBUQ0xfRVhDRVBUSU9OKTsKLQlpbnNfbG9uZyhkLCAiV0lORE9XX0VWRU5UUyIsIFRDTF9XSU5ET1dfRVZFTlRTKTsKLQlpbnNfbG9uZyhkLCAiRklMRV9FVkVOVFMiLCBUQ0xfRklMRV9FVkVOVFMpOwotCWluc19sb25nKGQsICJUSU1FUl9FVkVOVFMiLCBUQ0xfVElNRVJfRVZFTlRTKTsKLQlpbnNfbG9uZyhkLCAiSURMRV9FVkVOVFMiLCBUQ0xfSURMRV9FVkVOVFMpOwotCWluc19sb25nKGQsICJBTExfRVZFTlRTIiwgVENMX0FMTF9FVkVOVFMpOwotCWluc19sb25nKGQsICJET05UX1dBSVQiLCBUQ0xfRE9OVF9XQUlUKTsKLQlpbnNfc3RyaW5nKGQsICJUS19WRVJTSU9OIiwgVEtfVkVSU0lPTik7Ci0JaW5zX3N0cmluZyhkLCAiVENMX1ZFUlNJT04iLCBUQ0xfVkVSU0lPTik7CisgICAgaW5zX2xvbmcoZCwgIlJFQURBQkxFIiwgVENMX1JFQURBQkxFKTsKKyAgICBpbnNfbG9uZyhkLCAiV1JJVEFCTEUiLCBUQ0xfV1JJVEFCTEUpOworICAgIGluc19sb25nKGQsICJFWENFUFRJT04iLCBUQ0xfRVhDRVBUSU9OKTsKKyAgICBpbnNfbG9uZyhkLCAiV0lORE9XX0VWRU5UUyIsIFRDTF9XSU5ET1dfRVZFTlRTKTsKKyAgICBpbnNfbG9uZyhkLCAiRklMRV9FVkVOVFMiLCBUQ0xfRklMRV9FVkVOVFMpOworICAgIGluc19sb25nKGQsICJUSU1FUl9FVkVOVFMiLCBUQ0xfVElNRVJfRVZFTlRTKTsKKyAgICBpbnNfbG9uZyhkLCAiSURMRV9FVkVOVFMiLCBUQ0xfSURMRV9FVkVOVFMpOworICAgIGluc19sb25nKGQsICJBTExfRVZFTlRTIiwgVENMX0FMTF9FVkVOVFMpOworICAgIGluc19sb25nKGQsICJET05UX1dBSVQiLCBUQ0xfRE9OVF9XQUlUKTsKKyAgICBpbnNfc3RyaW5nKGQsICJUS19WRVJTSU9OIiwgVEtfVkVSU0lPTik7CisgICAgaW5zX3N0cmluZyhkLCAiVENMX1ZFUlNJT04iLCBUQ0xfVkVSU0lPTik7CiAKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVGthcHBUeXBlIiwgKFB5T2JqZWN0ICopJlRrYXBwX1R5cGUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUa2FwcFR5cGUiLCAoUHlPYmplY3QgKikmVGthcHBfVHlwZSk7CiAKLQlQeV9UWVBFKCZUa3R0X1R5cGUpID0gJlB5VHlwZV9UeXBlOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUa3R0VHlwZSIsIChQeU9iamVjdCAqKSZUa3R0X1R5cGUpOworICAgIFB5X1RZUEUoJlRrdHRfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRrdHRUeXBlIiwgKFB5T2JqZWN0ICopJlRrdHRfVHlwZSk7CiAKLQlQeV9UWVBFKCZQeVRjbE9iamVjdF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVGNsX09iaiIsIChQeU9iamVjdCAqKSZQeVRjbE9iamVjdF9UeXBlKTsKKyAgICBQeV9UWVBFKCZQeVRjbE9iamVjdF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVGNsX09iaiIsIChQeU9iamVjdCAqKSZQeVRjbE9iamVjdF9UeXBlKTsKIAogI2lmZGVmIFRLX0FRVUEKLQkvKiBUa19NYWNPU1hTZXR1cFRrTm90aWZpZXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIFRjbCdzIHN1YnN5c3RlbXMKLQkgKiBzdGFydCB3YWtpbmcgdXAuICBOb3RlIHRoYXQgVGNsX0ZpbmRFeGVjdXRhYmxlIHdpbGwgZG8gdGhpcywgdGhpcwotCSAqIGNvZGUgbXVzdCBiZSBhYm92ZSBpdCEgVGhlIG9yaWdpbmFsIHdhcm5pbmcgZnJvbQotCSAqIHRrTWFjT1NYQXBwSW5pdC5jIGlzIGNvcGllZCBiZWxvdy4KLQkgKgotCSAqIE5CIC0gWW91IGhhdmUgdG8gc3dhcCBpbiB0aGUgVGsgTm90aWZpZXIgQkVGT1JFIHlvdSBzdGFydCB1cCB0aGUKLQkgKiBUY2wgaW50ZXJwcmV0ZXIgZm9yIG5vdy4gIEl0IHByb2JhYmx5IHNob3VsZCB3b3JrIHRvIGRvIHRoaXMKLQkgKiBpbiB0aGUgb3RoZXIgb3JkZXIsIGJ1dCBmb3Igbm93IGl0IGRvZXNuJ3Qgc2VlbSB0by4KLQkgKgotCSAqLwotCVRrX01hY09TWFNldHVwVGtOb3RpZmllcigpOworICAgIC8qIFRrX01hY09TWFNldHVwVGtOb3RpZmllciBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgVGNsJ3Mgc3Vic3lzdGVtcworICAgICAqIHN0YXJ0IHdha2luZyB1cC4gIE5vdGUgdGhhdCBUY2xfRmluZEV4ZWN1dGFibGUgd2lsbCBkbyB0aGlzLCB0aGlzCisgICAgICogY29kZSBtdXN0IGJlIGFib3ZlIGl0ISBUaGUgb3JpZ2luYWwgd2FybmluZyBmcm9tCisgICAgICogdGtNYWNPU1hBcHBJbml0LmMgaXMgY29waWVkIGJlbG93LgorICAgICAqCisgICAgICogTkIgLSBZb3UgaGF2ZSB0byBzd2FwIGluIHRoZSBUayBOb3RpZmllciBCRUZPUkUgeW91IHN0YXJ0IHVwIHRoZQorICAgICAqIFRjbCBpbnRlcnByZXRlciBmb3Igbm93LiAgSXQgcHJvYmFibHkgc2hvdWxkIHdvcmsgdG8gZG8gdGhpcworICAgICAqIGluIHRoZSBvdGhlciBvcmRlciwgYnV0IGZvciBub3cgaXQgZG9lc24ndCBzZWVtIHRvLgorICAgICAqCisgICAgICovCisgICAgVGtfTWFjT1NYU2V0dXBUa05vdGlmaWVyKCk7CiAjZW5kaWYKIAogCi0JLyogVGhpcyBoZWxwcyB0aGUgZHluYW1pYyBsb2FkZXI7IGluIFVuaWNvZGUgYXdhcmUgVGNsIHZlcnNpb25zCi0JICAgaXQgYWxzbyBoZWxwcyBUY2wgZmluZCBpdHMgZW5jb2RpbmdzLiAqLwotCVRjbF9GaW5kRXhlY3V0YWJsZShQeV9HZXRQcm9ncmFtTmFtZSgpKTsKKyAgICAvKiBUaGlzIGhlbHBzIHRoZSBkeW5hbWljIGxvYWRlcjsgaW4gVW5pY29kZSBhd2FyZSBUY2wgdmVyc2lvbnMKKyAgICAgICBpdCBhbHNvIGhlbHBzIFRjbCBmaW5kIGl0cyBlbmNvZGluZ3MuICovCisgICAgVGNsX0ZpbmRFeGVjdXRhYmxlKFB5X0dldFByb2dyYW1OYW1lKCkpOwogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybjsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuOwogCiAjaWYgMAotCS8qIFRoaXMgd2FzIG5vdCBhIGdvb2QgaWRlYTsgdGhyb3VnaCA8RGVzdHJveT4gYmluZGluZ3MsCi0JICAgVGNsX0ZpbmFsaXplKCkgbWF5IGludm9rZSBQeXRob24gY29kZSBidXQgYXQgdGhhdCBwb2ludCB0aGUKLQkgICBpbnRlcnByZXRlciBhbmQgdGhyZWFkIHN0YXRlIGhhdmUgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCEgKi8KLQlQeV9BdEV4aXQoVGNsX0ZpbmFsaXplKTsKKyAgICAvKiBUaGlzIHdhcyBub3QgYSBnb29kIGlkZWE7IHRocm91Z2ggPERlc3Ryb3k+IGJpbmRpbmdzLAorICAgICAgIFRjbF9GaW5hbGl6ZSgpIG1heSBpbnZva2UgUHl0aG9uIGNvZGUgYnV0IGF0IHRoYXQgcG9pbnQgdGhlCisgICAgICAgaW50ZXJwcmV0ZXIgYW5kIHRocmVhZCBzdGF0ZSBoYXZlIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQhICovCisgICAgUHlfQXRFeGl0KFRjbF9GaW5hbGl6ZSk7CiAjZW5kaWYKIAogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hZGRyaW5mby5oIGIvTW9kdWxlcy9hZGRyaW5mby5oCmluZGV4IDZmNjdhMmUuLjY3MGIxNzMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYWRkcmluZm8uaAorKysgYi9Nb2R1bGVzL2FkZHJpbmZvLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCBhbmQgMTk5OSBXSURFIFByb2plY3QuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCisgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICAqIGFyZSBtZXQ6CkBAIC0xMyw3ICsxMyw3IEBACiAgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIAorICoKICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCkBAIC01NSwyMCArNTUsMjAgQEAKICNkZWZpbmUgZ2V0YWRkcmluZm8gZmFrZV9nZXRhZGRyaW5mbwogI2VuZGlmIC8qIEVBSV9BRERSRkFNSUxZICovCiAKLSNkZWZpbmUJRUFJX0FERFJGQU1JTFkJIDEJLyogYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUJRUFJX0FHQUlOCSAyCS8qIHRlbXBvcmFyeSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiAqLwotI2RlZmluZQlFQUlfQkFERkxBR1MJIDMJLyogaW52YWxpZCB2YWx1ZSBmb3IgYWlfZmxhZ3MgKi8KLSNkZWZpbmUJRUFJX0ZBSUwJIDQJLyogbm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uICovCi0jZGVmaW5lCUVBSV9GQU1JTFkJIDUJLyogYWlfZmFtaWx5IG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUJRUFJX01FTU9SWQkgNgkvKiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlICovCi0jZGVmaW5lCUVBSV9OT0RBVEEJIDcJLyogbm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaG9zdG5hbWUgKi8KLSNkZWZpbmUJRUFJX05PTkFNRQkgOAkvKiBob3N0bmFtZSBub3Igc2Vydm5hbWUgcHJvdmlkZWQsIG9yIG5vdCBrbm93biAqLwotI2RlZmluZQlFQUlfU0VSVklDRQkgOQkvKiBzZXJ2bmFtZSBub3Qgc3VwcG9ydGVkIGZvciBhaV9zb2NrdHlwZSAqLwotI2RlZmluZQlFQUlfU09DS1RZUEUJMTAJLyogYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZCAqLwotI2RlZmluZQlFQUlfU1lTVEVNCTExCS8qIHN5c3RlbSBlcnJvciByZXR1cm5lZCBpbiBlcnJubyAqLwotI2RlZmluZSBFQUlfQkFESElOVFMJMTIKLSNkZWZpbmUgRUFJX1BST1RPQ09MCTEzCi0jZGVmaW5lIEVBSV9NQVgJCTE0CisjZGVmaW5lIEVBSV9BRERSRkFNSUxZICAgMSAgICAgIC8qIGFkZHJlc3MgZmFtaWx5IGZvciBob3N0bmFtZSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEVBSV9BR0FJTiAgICAgICAgMiAgICAgIC8qIHRlbXBvcmFyeSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiAqLworI2RlZmluZSBFQUlfQkFERkxBR1MgICAgIDMgICAgICAvKiBpbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyAqLworI2RlZmluZSBFQUlfRkFJTCAgICAgICAgIDQgICAgICAvKiBub24tcmVjb3ZlcmFibGUgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24gKi8KKyNkZWZpbmUgRUFJX0ZBTUlMWSAgICAgICA1ICAgICAgLyogYWlfZmFtaWx5IG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgRUFJX01FTU9SWSAgICAgICA2ICAgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSAqLworI2RlZmluZSBFQUlfTk9EQVRBICAgICAgIDcgICAgICAvKiBubyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBob3N0bmFtZSAqLworI2RlZmluZSBFQUlfTk9OQU1FICAgICAgIDggICAgICAvKiBob3N0bmFtZSBub3Igc2Vydm5hbWUgcHJvdmlkZWQsIG9yIG5vdCBrbm93biAqLworI2RlZmluZSBFQUlfU0VSVklDRSAgICAgIDkgICAgICAvKiBzZXJ2bmFtZSBub3Qgc3VwcG9ydGVkIGZvciBhaV9zb2NrdHlwZSAqLworI2RlZmluZSBFQUlfU09DS1RZUEUgICAgMTAgICAgICAvKiBhaV9zb2NrdHlwZSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lIEVBSV9TWVNURU0gICAgICAxMSAgICAgIC8qIHN5c3RlbSBlcnJvciByZXR1cm5lZCBpbiBlcnJubyAqLworI2RlZmluZSBFQUlfQkFESElOVFMgICAgMTIKKyNkZWZpbmUgRUFJX1BST1RPQ09MICAgIDEzCisjZGVmaW5lIEVBSV9NQVggICAgICAgICAxNAogCiAvKgogICogRmxhZyB2YWx1ZXMgZm9yIGdldGFkZHJpbmZvKCkKQEAgLTg1LDE4ICs4NSwxOCBAQAogI3VuZGVmIEFJX0RFRkFVTFQKICNlbmRpZiAvKiBBSV9QQVNTSVZFICovCiAKLSNkZWZpbmUJQUlfUEFTU0lWRQkweDAwMDAwMDAxIC8qIGdldCBhZGRyZXNzIHRvIHVzZSBiaW5kKCkgKi8KLSNkZWZpbmUJQUlfQ0FOT05OQU1FCTB4MDAwMDAwMDIgLyogZmlsbCBhaV9jYW5vbm5hbWUgKi8KLSNkZWZpbmUJQUlfTlVNRVJJQ0hPU1QJMHgwMDAwMDAwNCAvKiBwcmV2ZW50IG5hbWUgcmVzb2x1dGlvbiAqLworI2RlZmluZSBBSV9QQVNTSVZFICAgICAgMHgwMDAwMDAwMSAvKiBnZXQgYWRkcmVzcyB0byB1c2UgYmluZCgpICovCisjZGVmaW5lIEFJX0NBTk9OTkFNRSAgICAweDAwMDAwMDAyIC8qIGZpbGwgYWlfY2Fub25uYW1lICovCisjZGVmaW5lIEFJX05VTUVSSUNIT1NUICAweDAwMDAwMDA0IC8qIHByZXZlbnQgbmFtZSByZXNvbHV0aW9uICovCiAvKiB2YWxpZCBmbGFncyBmb3IgYWRkcmluZm8gKi8KLSNkZWZpbmUJQUlfTUFTSwkJKEFJX1BBU1NJVkUgfCBBSV9DQU5PTk5BTUUgfCBBSV9OVU1FUklDSE9TVCkKKyNkZWZpbmUgQUlfTUFTSyAgICAgICAgIChBSV9QQVNTSVZFIHwgQUlfQ0FOT05OQU1FIHwgQUlfTlVNRVJJQ0hPU1QpCiAKLSNkZWZpbmUJQUlfQUxMCQkweDAwMDAwMTAwIC8qIElQdjYgYW5kIElQdjQtbWFwcGVkICh3aXRoIEFJX1Y0TUFQUEVEKSAqLwotI2RlZmluZQlBSV9WNE1BUFBFRF9DRkcJMHgwMDAwMDIwMCAvKiBhY2NlcHQgSVB2NC1tYXBwZWQgaWYga2VybmVsIHN1cHBvcnRzICovCi0jZGVmaW5lCUFJX0FERFJDT05GSUcJMHgwMDAwMDQwMCAvKiBvbmx5IGlmIGFueSBhZGRyZXNzIGlzIGFzc2lnbmVkICovCi0jZGVmaW5lCUFJX1Y0TUFQUEVECTB4MDAwMDA4MDAgLyogYWNjZXB0IElQdjQtbWFwcGVkIElQdjYgYWRkcmVzcyAqLworI2RlZmluZSBBSV9BTEwgICAgICAgICAgMHgwMDAwMDEwMCAvKiBJUHY2IGFuZCBJUHY0LW1hcHBlZCAod2l0aCBBSV9WNE1BUFBFRCkgKi8KKyNkZWZpbmUgQUlfVjRNQVBQRURfQ0ZHIDB4MDAwMDAyMDAgLyogYWNjZXB0IElQdjQtbWFwcGVkIGlmIGtlcm5lbCBzdXBwb3J0cyAqLworI2RlZmluZSBBSV9BRERSQ09ORklHICAgMHgwMDAwMDQwMCAvKiBvbmx5IGlmIGFueSBhZGRyZXNzIGlzIGFzc2lnbmVkICovCisjZGVmaW5lIEFJX1Y0TUFQUEVEICAgICAweDAwMDAwODAwIC8qIGFjY2VwdCBJUHY0LW1hcHBlZCBJUHY2IGFkZHJlc3MgKi8KIC8qIHNwZWNpYWwgcmVjb21tZW5kZWQgZmxhZ3MgZm9yIGdldGlwbm9kZWJ5bmFtZSAqLwotI2RlZmluZQlBSV9ERUZBVUxUCShBSV9WNE1BUFBFRF9DRkcgfCBBSV9BRERSQ09ORklHKQorI2RlZmluZSBBSV9ERUZBVUxUICAgICAgKEFJX1Y0TUFQUEVEX0NGRyB8IEFJX0FERFJDT05GSUcpCiAKICNlbmRpZiAvKiAhSEFWRV9HRVRBRERSSU5GTyAqLwogCkBAIC0xMDYsMzMgKzEwNiwzMyBAQAogICogQ29uc3RhbnRzIGZvciBnZXRuYW1laW5mbygpCiAgKi8KICNpZm5kZWYgTklfTUFYSE9TVAotI2RlZmluZQlOSV9NQVhIT1NUCTEwMjUKLSNkZWZpbmUJTklfTUFYU0VSVgkzMgorI2RlZmluZSBOSV9NQVhIT1NUICAgICAgMTAyNQorI2RlZmluZSBOSV9NQVhTRVJWICAgICAgMzIKICNlbmRpZiAvKiAhTklfTUFYSE9TVCAqLwogCiAvKgogICogRmxhZyB2YWx1ZXMgZm9yIGdldG5hbWVpbmZvKCkKICAqLwogI2lmbmRlZiBOSV9OT0ZRRE4KLSNkZWZpbmUJTklfTk9GUUROCTB4MDAwMDAwMDEKLSNkZWZpbmUJTklfTlVNRVJJQ0hPU1QJMHgwMDAwMDAwMgotI2RlZmluZQlOSV9OQU1FUkVRRAkweDAwMDAwMDA0Ci0jZGVmaW5lCU5JX05VTUVSSUNTRVJWCTB4MDAwMDAwMDgKLSNkZWZpbmUJTklfREdSQU0JMHgwMDAwMDAxMAorI2RlZmluZSBOSV9OT0ZRRE4gICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBOSV9OVU1FUklDSE9TVCAgMHgwMDAwMDAwMgorI2RlZmluZSBOSV9OQU1FUkVRRCAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBOSV9OVU1FUklDU0VSViAgMHgwMDAwMDAwOAorI2RlZmluZSBOSV9ER1JBTSAgICAgICAgMHgwMDAwMDAxMAogI2VuZGlmIC8qICFOSV9OT0ZRRE4gKi8KIAogI2VuZGlmIC8qICFIQVZFX0dFVE5BTUVJTkZPICovCiAKICNpZm5kZWYgSEFWRV9BRERSSU5GTwogc3RydWN0IGFkZHJpbmZvIHsKLQlpbnQJYWlfZmxhZ3M7CS8qIEFJX1BBU1NJVkUsIEFJX0NBTk9OTkFNRSAqLwotCWludAlhaV9mYW1pbHk7CS8qIFBGX3h4eCAqLwotCWludAlhaV9zb2NrdHlwZTsJLyogU09DS194eHggKi8KLQlpbnQJYWlfcHJvdG9jb2w7CS8qIDAgb3IgSVBQUk9UT194eHggZm9yIElQdjQgYW5kIElQdjYgKi8KLQlzaXplX3QJYWlfYWRkcmxlbjsJLyogbGVuZ3RoIG9mIGFpX2FkZHIgKi8KLQljaGFyCSphaV9jYW5vbm5hbWU7CS8qIGNhbm9uaWNhbCBuYW1lIGZvciBob3N0bmFtZSAqLwotCXN0cnVjdCBzb2NrYWRkciAqYWlfYWRkcjsJLyogYmluYXJ5IGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWRkcmluZm8gKmFpX25leHQ7CS8qIG5leHQgc3RydWN0dXJlIGluIGxpbmtlZCBsaXN0ICovCisgICAgaW50ICAgICAgICAgYWlfZmxhZ3M7ICAgICAgIC8qIEFJX1BBU1NJVkUsIEFJX0NBTk9OTkFNRSAqLworICAgIGludCAgICAgICAgIGFpX2ZhbWlseTsgICAgICAvKiBQRl94eHggKi8KKyAgICBpbnQgICAgICAgICBhaV9zb2NrdHlwZTsgICAgLyogU09DS194eHggKi8KKyAgICBpbnQgICAgICAgICBhaV9wcm90b2NvbDsgICAgLyogMCBvciBJUFBST1RPX3h4eCBmb3IgSVB2NCBhbmQgSVB2NiAqLworICAgIHNpemVfdCAgICAgIGFpX2FkZHJsZW47ICAgICAvKiBsZW5ndGggb2YgYWlfYWRkciAqLworICAgIGNoYXIgICAgICAgICphaV9jYW5vbm5hbWU7ICAvKiBjYW5vbmljYWwgbmFtZSBmb3IgaG9zdG5hbWUgKi8KKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFpX2FkZHI7ICAgICAgICAgICAvKiBiaW5hcnkgYWRkcmVzcyAqLworICAgIHN0cnVjdCBhZGRyaW5mbyAqYWlfbmV4dDsgICAgICAgICAgIC8qIG5leHQgc3RydWN0dXJlIGluIGxpbmtlZCBsaXN0ICovCiB9OwogI2VuZGlmIC8qICFIQVZFX0FERFJJTkZPICovCiAKQEAgLTE0MCwzMCArMTQwLDMwIEBACiAvKgogICogUkZDIDI1NTM6IHByb3RvY29sLWluZGVwZW5kZW50IHBsYWNlaG9sZGVyIGZvciBzb2NrZXQgYWRkcmVzc2VzCiAgKi8KLSNkZWZpbmUgX1NTX01BWFNJWkUJMTI4CisjZGVmaW5lIF9TU19NQVhTSVpFICAgICAxMjgKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotI2RlZmluZSBfU1NfQUxJR05TSVpFCShzaXplb2YoUFlfTE9OR19MT05HKSkKKyNkZWZpbmUgX1NTX0FMSUdOU0laRSAgIChzaXplb2YoUFlfTE9OR19MT05HKSkKICNlbHNlCi0jZGVmaW5lIF9TU19BTElHTlNJWkUJKHNpemVvZihkb3VibGUpKQorI2RlZmluZSBfU1NfQUxJR05TSVpFICAgKHNpemVvZihkb3VibGUpKQogI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCi0jZGVmaW5lIF9TU19QQUQxU0laRQkoX1NTX0FMSUdOU0laRSAtIHNpemVvZih1X2NoYXIpICogMikKLSNkZWZpbmUgX1NTX1BBRDJTSVpFCShfU1NfTUFYU0laRSAtIHNpemVvZih1X2NoYXIpICogMiAtIFwKLQkJCQlfU1NfUEFEMVNJWkUgLSBfU1NfQUxJR05TSVpFKQorI2RlZmluZSBfU1NfUEFEMVNJWkUgICAgKF9TU19BTElHTlNJWkUgLSBzaXplb2YodV9jaGFyKSAqIDIpCisjZGVmaW5lIF9TU19QQUQyU0laRSAgICAoX1NTX01BWFNJWkUgLSBzaXplb2YodV9jaGFyKSAqIDIgLSBcCisgICAgICAgICAgICAgICAgX1NTX1BBRDFTSVpFIC0gX1NTX0FMSUdOU0laRSkKIAogc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgewogI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCi0JdW5zaWduZWQgY2hhciBzc19sZW47CQkvKiBhZGRyZXNzIGxlbmd0aCAqLwotCXVuc2lnbmVkIGNoYXIgc3NfZmFtaWx5OwkvKiBhZGRyZXNzIGZhbWlseSAqLworICAgIHVuc2lnbmVkIGNoYXIgc3NfbGVuOyAgICAgICAgICAgICAgIC8qIGFkZHJlc3MgbGVuZ3RoICovCisgICAgdW5zaWduZWQgY2hhciBzc19mYW1pbHk7ICAgICAgICAgICAgLyogYWRkcmVzcyBmYW1pbHkgKi8KICNlbHNlCi0JdW5zaWduZWQgc2hvcnQgc3NfZmFtaWx5OwkvKiBhZGRyZXNzIGZhbWlseSAqLworICAgIHVuc2lnbmVkIHNob3J0IHNzX2ZhbWlseTsgICAgICAgICAgIC8qIGFkZHJlc3MgZmFtaWx5ICovCiAjZW5kaWYgLyogSEFWRV9TT0NLQUREUl9TQV9MRU4gKi8KLQljaGFyCV9fc3NfcGFkMVtfU1NfUEFEMVNJWkVdOworICAgIGNoYXIgICAgICAgIF9fc3NfcGFkMVtfU1NfUEFEMVNJWkVdOwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JUFlfTE9OR19MT05HIF9fc3NfYWxpZ247CS8qIGZvcmNlIGRlc2lyZWQgc3RydWN0dXJlIHN0b3JhZ2UgYWxpZ25tZW50ICovCisgICAgUFlfTE9OR19MT05HIF9fc3NfYWxpZ247ICAgICAgICAgICAgLyogZm9yY2UgZGVzaXJlZCBzdHJ1Y3R1cmUgc3RvcmFnZSBhbGlnbm1lbnQgKi8KICNlbHNlCi0JZG91YmxlIF9fc3NfYWxpZ247CS8qIGZvcmNlIGRlc2lyZWQgc3RydWN0dXJlIHN0b3JhZ2UgYWxpZ25tZW50ICovCisgICAgZG91YmxlIF9fc3NfYWxpZ247ICAgICAgICAgIC8qIGZvcmNlIGRlc2lyZWQgc3RydWN0dXJlIHN0b3JhZ2UgYWxpZ25tZW50ICovCiAjZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KLQljaGFyCV9fc3NfcGFkMltfU1NfUEFEMlNJWkVdOworICAgIGNoYXIgICAgICAgIF9fc3NfcGFkMltfU1NfUEFEMlNJWkVdOwogfTsKICNlbmRpZiAvKiAhSEFWRV9TT0NLQUREUl9TVE9SQUdFICovCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvYWxtb2R1bGUuYyBiL01vZHVsZXMvYWxtb2R1bGUuYwppbmRleCA5M2YyNmJkLi42OTExNzVlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2FsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9hbG1vZHVsZS5jCkBAIC0xLDUgKzEsNSBAQAogCi0jZGVmaW5lIE9MRF9JTlRFUkZBQ0UJCS8qIGRlZmluZSBmb3IgcHJlLUlyaXggNiBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgT0xEX0lOVEVSRkFDRSAgICAgICAgICAgLyogZGVmaW5lIGZvciBwcmUtSXJpeCA2IGludGVyZmFjZSAqLwogCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAic3RyaW5nb2JqZWN0LmgiCkBAIC0xOSw5ICsxOSw5IEBACiAvKiBEZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgb2YgdHlwZSBwb3J0ICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JLyogWFhYWCBBZGQgeW91ciBvd24gc3R1ZmYgaGVyZSAqLwotCUFMcG9ydCBwb3J0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICAvKiBYWFhYIEFkZCB5b3VyIG93biBzdHVmZiBoZXJlICovCisgICAgQUxwb3J0IHBvcnQ7CiB9IGFscG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBBbHB0eXBlOwpAQCAtMzMsOSArMzMsOSBAQAogLyogRGVjbGFyYXRpb25zIGZvciBvYmplY3RzIG9mIHR5cGUgY29uZmlnICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JLyogWFhYWCBBZGQgeW91ciBvd24gc3R1ZmYgaGVyZSAqLwotCUFMY29uZmlnIGNvbmZpZzsKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogWFhYWCBBZGQgeW91ciBvd24gc3R1ZmYgaGVyZSAqLworICAgIEFMY29uZmlnIGNvbmZpZzsKIH0gYWxjb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEFsY3R5cGU7CkBAIC00NCwxOTkgKzQ0LDE5OSBAQAogc3RhdGljIHZvaWQKIEVycm9ySGFuZGxlcihsb25nIGNvZGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewotCXZhX2xpc3QgYXJnczsKLQljaGFyIGJ1ZlsxMjhdOworICAgIHZhX2xpc3QgYXJnczsKKyAgICBjaGFyIGJ1ZlsxMjhdOwogCi0JdmFfc3RhcnQoYXJncywgZm10KTsKLQl2c3ByaW50ZihidWYsIGZtdCwgYXJncyk7Ci0JdmFfZW5kKGFyZ3MpOwotCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgYnVmKTsKKyAgICB2YV9zdGFydChhcmdzLCBmbXQpOworICAgIHZzcHJpbnRmKGJ1ZiwgZm10LCBhcmdzKTsKKyAgICB2YV9lbmQoYXJncyk7CisgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCBidWYpOwogfQogCi0jaWZkZWYgQUxfTk9fRUxFTQkJLyogSVJJWCA2ICovCisjaWZkZWYgQUxfTk9fRUxFTSAgICAgICAgICAgICAgIC8qIElSSVggNiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogcGFyYW0ycHl0aG9uKGludCByZXNvdXJjZSwgaW50IHBhcmFtLCBBTHZhbHVlIHZhbHVlLCBBTHBhcmFtSW5mbyAqcGluZm8pCiB7Ci0JQUxwYXJhbUluZm8gaW5mbzsKKyAgICBBTHBhcmFtSW5mbyBpbmZvOwogCi0JaWYgKHBpbmZvID09IE5VTEwpIHsKLQkJcGluZm8gPSAmaW5mbzsKLQkJaWYgKGFsR2V0UGFyYW1JbmZvKHJlc291cmNlLCBwYXJhbSwgJmluZm8pIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlzd2l0Y2ggKHBpbmZvLT5lbGVtZW50VHlwZSkgewotCWNhc2UgQUxfUFRSX0VMRU06Ci0JCS8qIFhYWFggZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoaXMgKi8KLQljYXNlIEFMX05PX0VMRU06Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JY2FzZSBBTF9JTlQzMl9FTEVNOgotCWNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKLQljYXNlIEFMX0VOVU1fRUxFTToKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZS5pKTsKLQljYXNlIEFMX0lOVDY0X0VMRU06Ci0JCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlLmxsKTsKLQljYXNlIEFMX0ZJWEVEX0VMRU06Ci0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYWxGaXhlZFRvRG91YmxlKHZhbHVlLmxsKSk7Ci0JY2FzZSBBTF9DSEFSX0VMRU06Ci0JCWlmICh2YWx1ZS5wdHIgPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoKGNoYXIgKikgdmFsdWUucHRyKTsKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJ1bmtub3duIGVsZW1lbnQgdHlwZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHBpbmZvID09IE5VTEwpIHsKKyAgICAgICAgcGluZm8gPSAmaW5mbzsKKyAgICAgICAgaWYgKGFsR2V0UGFyYW1JbmZvKHJlc291cmNlLCBwYXJhbSwgJmluZm8pIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzd2l0Y2ggKHBpbmZvLT5lbGVtZW50VHlwZSkgeworICAgIGNhc2UgQUxfUFRSX0VMRU06CisgICAgICAgIC8qIFhYWFggZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoaXMgKi8KKyAgICBjYXNlIEFMX05PX0VMRU06CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgY2FzZSBBTF9JTlQzMl9FTEVNOgorICAgIGNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKKyAgICBjYXNlIEFMX0VOVU1fRUxFTToKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZS5pKTsKKyAgICBjYXNlIEFMX0lOVDY0X0VMRU06CisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlLmxsKTsKKyAgICBjYXNlIEFMX0ZJWEVEX0VMRU06CisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYWxGaXhlZFRvRG91YmxlKHZhbHVlLmxsKSk7CisgICAgY2FzZSBBTF9DSEFSX0VMRU06CisgICAgICAgIGlmICh2YWx1ZS5wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoKGNoYXIgKikgdmFsdWUucHRyKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJ1bmtub3duIGVsZW1lbnQgdHlwZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIHB5dGhvbjJlbGVtKFB5T2JqZWN0ICppdGVtLCB2b2lkICpwdHIsIGludCBlbGVtZW50VHlwZSkKIHsKLQlzd2l0Y2ggKGVsZW1lbnRUeXBlKSB7Ci0JY2FzZSBBTF9JTlQzMl9FTEVNOgotCWNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKLQljYXNlIEFMX0VOVU1fRUxFTToKLQkJaWYgKCFQeUludF9DaGVjayhpdGVtKSkgewotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkqKChpbnQgKikgcHRyKSA9IFB5SW50X0FzTG9uZyhpdGVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBBTF9JTlQ2NF9FTEVNOgotCQlpZiAoUHlJbnRfQ2hlY2soaXRlbSkpCi0JCQkqKChsb25nIGxvbmcgKikgcHRyKSA9IFB5SW50X0FzTG9uZyhpdGVtKTsKLQkJZWxzZSBpZiAoUHlMb25nX0NoZWNrKGl0ZW0pKQotCQkJKigobG9uZyBsb25nICopIHB0cikgPSBQeUxvbmdfQXNMb25nTG9uZyhpdGVtKTsKLQkJZWxzZSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQUxfRklYRURfRUxFTToKLQkJaWYgKFB5SW50X0NoZWNrKGl0ZW0pKQotCQkJKigobG9uZyBsb25nICopIHB0cikgPSBhbERvdWJsZVRvRml4ZWQoKGRvdWJsZSkgUHlJbnRfQXNMb25nKGl0ZW0pKTsKLQkJZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhpdGVtKSkKLQkJCSooKGxvbmcgbG9uZyAqKSBwdHIpID0gYWxEb3VibGVUb0ZpeGVkKFB5RmxvYXRfQXNEb3VibGUoaXRlbSkpOwotCQllbHNlIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAidW5rbm93biBlbGVtZW50IHR5cGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBzd2l0Y2ggKGVsZW1lbnRUeXBlKSB7CisgICAgY2FzZSBBTF9JTlQzMl9FTEVNOgorICAgIGNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKKyAgICBjYXNlIEFMX0VOVU1fRUxFTToKKyAgICAgICAgaWYgKCFQeUludF9DaGVjayhpdGVtKSkgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAqKChpbnQgKikgcHRyKSA9IFB5SW50X0FzTG9uZyhpdGVtKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBTF9JTlQ2NF9FTEVNOgorICAgICAgICBpZiAoUHlJbnRfQ2hlY2soaXRlbSkpCisgICAgICAgICAgICAqKChsb25nIGxvbmcgKikgcHRyKSA9IFB5SW50X0FzTG9uZyhpdGVtKTsKKyAgICAgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKGl0ZW0pKQorICAgICAgICAgICAgKigobG9uZyBsb25nICopIHB0cikgPSBQeUxvbmdfQXNMb25nTG9uZyhpdGVtKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxfRklYRURfRUxFTToKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKGl0ZW0pKQorICAgICAgICAgICAgKigobG9uZyBsb25nICopIHB0cikgPSBhbERvdWJsZVRvRml4ZWQoKGRvdWJsZSkgUHlJbnRfQXNMb25nKGl0ZW0pKTsKKyAgICAgICAgZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhpdGVtKSkKKyAgICAgICAgICAgICooKGxvbmcgbG9uZyAqKSBwdHIpID0gYWxEb3VibGVUb0ZpeGVkKFB5RmxvYXRfQXNEb3VibGUoaXRlbSkpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAidW5rbm93biBlbGVtZW50IHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogcHl0aG9uMnBhcmFtKGludCByZXNvdXJjZSwgQUxwdiAqcGFyYW0sIFB5T2JqZWN0ICp2YWx1ZSwgQUxwYXJhbUluZm8gKnBpbmZvKQogewotCUFMcGFyYW1JbmZvIGluZm87Ci0JaW50IGksIHN0ZXBzaXplOwotCVB5T2JqZWN0ICppdGVtOworICAgIEFMcGFyYW1JbmZvIGluZm87CisgICAgaW50IGksIHN0ZXBzaXplOworICAgIFB5T2JqZWN0ICppdGVtOwogCi0JaWYgKHBpbmZvID09IE5VTEwpIHsKLQkJcGluZm8gPSAmaW5mbzsKLQkJaWYgKGFsR2V0UGFyYW1JbmZvKHJlc291cmNlLCBwYXJhbS0+cGFyYW0sICZpbmZvKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXN3aXRjaCAocGluZm8tPnZhbHVlVHlwZSkgewotCWNhc2UgQUxfU1RSSU5HX1ZBTDoKLQkJaWYgKHBpbmZvLT5lbGVtZW50VHlwZSAhPSBBTF9DSEFSX0VMRU0pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgInVua25vd24gZWxlbWVudCB0eXBlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcGFyYW0tPnZhbHVlLnB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSk7Ci0JCXBhcmFtLT5zaXplSW4gPSBQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSkrMTsgLyphY2NvdW50IGZvciBOVUwqLwotCQlicmVhazsKLQljYXNlIEFMX1NFVF9WQUw6Ci0JY2FzZSBBTF9WRUNUT1JfVkFMOgotCQlpZiAoIVB5TGlzdF9DaGVjayh2YWx1ZSkgJiYgIVB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXN3aXRjaCAocGluZm8tPmVsZW1lbnRUeXBlKSB7Ci0JCWNhc2UgQUxfSU5UMzJfRUxFTToKLQkJY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgotCQljYXNlIEFMX0VOVU1fRUxFTToKLQkJCXBhcmFtLT5zaXplSW4gPSBQeVNlcXVlbmNlX1NpemUodmFsdWUpOwotCQkJcGFyYW0tPnZhbHVlLnB0ciA9IFB5TWVtX05FVyhpbnQsIHBhcmFtLT5zaXplSW4pOwotCQkJc3RlcHNpemUgPSBzaXplb2YoaW50KTsKLQkJCWJyZWFrOwotCQljYXNlIEFMX0lOVDY0X0VMRU06Ci0JCWNhc2UgQUxfRklYRURfRUxFTToKLQkJCXBhcmFtLT5zaXplSW4gPSBQeVNlcXVlbmNlX1NpemUodmFsdWUpOwotCQkJcGFyYW0tPnZhbHVlLnB0ciA9IFB5TWVtX05FVyhsb25nIGxvbmcsIHBhcmFtLT5zaXplSW4pOwotCQkJc3RlcHNpemUgPSBzaXplb2YobG9uZyBsb25nKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBwYXJhbS0+c2l6ZUluOyBpKyspIHsKLQkJCWl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0odmFsdWUsIGkpOwotCQkJaWYgKHB5dGhvbjJlbGVtKGl0ZW0sICh2b2lkICopICgoY2hhciAqKSBwYXJhbS0+dmFsdWUucHRyICsgaSpzdGVwc2l6ZSksIHBpbmZvLT5lbGVtZW50VHlwZSkgPCAwKSB7Ci0JCQkJUHlNZW1fREVMKHBhcmFtLT52YWx1ZS5wdHIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQljYXNlIEFMX1NDQUxBUl9WQUw6Ci0JCXN3aXRjaCAocGluZm8tPmVsZW1lbnRUeXBlKSB7Ci0JCWNhc2UgQUxfSU5UMzJfRUxFTToKLQkJY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgotCQljYXNlIEFMX0VOVU1fRUxFTToKLQkJCXJldHVybiBweXRob24yZWxlbSh2YWx1ZSwgKHZvaWQgKikgJnBhcmFtLT52YWx1ZS5pLAotCQkJCQkgICBwaW5mby0+ZWxlbWVudFR5cGUpOwotCQljYXNlIEFMX0lOVDY0X0VMRU06Ci0JCWNhc2UgQUxfRklYRURfRUxFTToKLQkJCXJldHVybiBweXRob24yZWxlbSh2YWx1ZSwgKHZvaWQgKikgJnBhcmFtLT52YWx1ZS5sbCwKLQkJCQkJICAgcGluZm8tPmVsZW1lbnRUeXBlKTsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgInVua25vd24gZWxlbWVudCB0eXBlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKHBpbmZvID09IE5VTEwpIHsKKyAgICAgICAgcGluZm8gPSAmaW5mbzsKKyAgICAgICAgaWYgKGFsR2V0UGFyYW1JbmZvKHJlc291cmNlLCBwYXJhbS0+cGFyYW0sICZpbmZvKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHN3aXRjaCAocGluZm8tPnZhbHVlVHlwZSkgeworICAgIGNhc2UgQUxfU1RSSU5HX1ZBTDoKKyAgICAgICAgaWYgKHBpbmZvLT5lbGVtZW50VHlwZSAhPSBBTF9DSEFSX0VMRU0pIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgInVua25vd24gZWxlbWVudCB0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW0tPnZhbHVlLnB0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSk7CisgICAgICAgIHBhcmFtLT5zaXplSW4gPSBQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSkrMTsgLyphY2NvdW50IGZvciBOVUwqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFMX1NFVF9WQUw6CisgICAgY2FzZSBBTF9WRUNUT1JfVkFMOgorICAgICAgICBpZiAoIVB5TGlzdF9DaGVjayh2YWx1ZSkgJiYgIVB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAocGluZm8tPmVsZW1lbnRUeXBlKSB7CisgICAgICAgIGNhc2UgQUxfSU5UMzJfRUxFTToKKyAgICAgICAgY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgorICAgICAgICBjYXNlIEFMX0VOVU1fRUxFTToKKyAgICAgICAgICAgIHBhcmFtLT5zaXplSW4gPSBQeVNlcXVlbmNlX1NpemUodmFsdWUpOworICAgICAgICAgICAgcGFyYW0tPnZhbHVlLnB0ciA9IFB5TWVtX05FVyhpbnQsIHBhcmFtLT5zaXplSW4pOworICAgICAgICAgICAgc3RlcHNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMX0lOVDY0X0VMRU06CisgICAgICAgIGNhc2UgQUxfRklYRURfRUxFTToKKyAgICAgICAgICAgIHBhcmFtLT5zaXplSW4gPSBQeVNlcXVlbmNlX1NpemUodmFsdWUpOworICAgICAgICAgICAgcGFyYW0tPnZhbHVlLnB0ciA9IFB5TWVtX05FVyhsb25nIGxvbmcsIHBhcmFtLT5zaXplSW4pOworICAgICAgICAgICAgc3RlcHNpemUgPSBzaXplb2YobG9uZyBsb25nKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbS0+c2l6ZUluOyBpKyspIHsKKyAgICAgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0odmFsdWUsIGkpOworICAgICAgICAgICAgaWYgKHB5dGhvbjJlbGVtKGl0ZW0sICh2b2lkICopICgoY2hhciAqKSBwYXJhbS0+dmFsdWUucHRyICsgaSpzdGVwc2l6ZSksIHBpbmZvLT5lbGVtZW50VHlwZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlNZW1fREVMKHBhcmFtLT52YWx1ZS5wdHIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFMX1NDQUxBUl9WQUw6CisgICAgICAgIHN3aXRjaCAocGluZm8tPmVsZW1lbnRUeXBlKSB7CisgICAgICAgIGNhc2UgQUxfSU5UMzJfRUxFTToKKyAgICAgICAgY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgorICAgICAgICBjYXNlIEFMX0VOVU1fRUxFTToKKyAgICAgICAgICAgIHJldHVybiBweXRob24yZWxlbSh2YWx1ZSwgKHZvaWQgKikgJnBhcmFtLT52YWx1ZS5pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmZvLT5lbGVtZW50VHlwZSk7CisgICAgICAgIGNhc2UgQUxfSU5UNjRfRUxFTToKKyAgICAgICAgY2FzZSBBTF9GSVhFRF9FTEVNOgorICAgICAgICAgICAgcmV0dXJuIHB5dGhvbjJlbGVtKHZhbHVlLCAodm9pZCAqKSAmcGFyYW0tPnZhbHVlLmxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbmZvLT5lbGVtZW50VHlwZSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJ1bmtub3duIGVsZW1lbnQgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBweXRob24ycGFyYW1zKGludCByZXNvdXJjZTEsIGludCByZXNvdXJjZTIsIFB5T2JqZWN0ICpsaXN0LCBBTHB2ICoqcHZzcCwgQUxwYXJhbUluZm8gKipwaW5mb3ApCiB7Ci0JUHlPYmplY3QgKml0ZW07Ci0JQUxwdiAqcHZzOwotCUFMcGFyYW1JbmZvICpwaW5mbzsKLQlpbnQgbnB2cywgaTsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBBTHB2ICpwdnM7CisgICAgQUxwYXJhbUluZm8gKnBpbmZvOworICAgIGludCBucHZzLCBpOwogCi0JbnB2cyA9IFB5TGlzdF9TaXplKGxpc3QpOwotCXB2cyA9IFB5TWVtX05FVyhBTHB2LCBucHZzKTsKLQlwaW5mbyA9IFB5TWVtX05FVyhBTHBhcmFtSW5mbywgbnB2cyk7Ci0JZm9yIChpID0gMDsgaSA8IG5wdnM7IGkrKykgewotCQlpdGVtID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtLCAiaU8iLCAmcHZzW2ldLnBhcmFtLCAmaXRlbSkpCi0JCQlnb3RvIGVycm9yOwotCQlpZiAoYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UxLCBwdnNbaV0ucGFyYW0sICZwaW5mb1tpXSkgPCAwICYmCi0JCSAgICBhbEdldFBhcmFtSW5mbyhyZXNvdXJjZTIsIHB2c1tpXS5wYXJhbSwgJnBpbmZvW2ldKSA8IDApCi0JCQlnb3RvIGVycm9yOwotCQlpZiAocHl0aG9uMnBhcmFtKHJlc291cmNlMSwgJnB2c1tpXSwgaXRlbSwgJnBpbmZvW2ldKSA8IDApCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICBucHZzID0gUHlMaXN0X1NpemUobGlzdCk7CisgICAgcHZzID0gUHlNZW1fTkVXKEFMcHYsIG5wdnMpOworICAgIHBpbmZvID0gUHlNZW1fTkVXKEFMcGFyYW1JbmZvLCBucHZzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnB2czsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBQeUxpc3RfR2V0SXRlbShsaXN0LCBpKTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGl0ZW0sICJpTyIsICZwdnNbaV0ucGFyYW0sICZpdGVtKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChhbEdldFBhcmFtSW5mbyhyZXNvdXJjZTEsIHB2c1tpXS5wYXJhbSwgJnBpbmZvW2ldKSA8IDAgJiYKKyAgICAgICAgICAgIGFsR2V0UGFyYW1JbmZvKHJlc291cmNlMiwgcHZzW2ldLnBhcmFtLCAmcGluZm9baV0pIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChweXRob24ycGFyYW0ocmVzb3VyY2UxLCAmcHZzW2ldLCBpdGVtLCAmcGluZm9baV0pIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JKnB2c3AgPSBwdnM7Ci0JKnBpbmZvcCA9IHBpbmZvOwotCXJldHVybiBucHZzOworICAgICpwdnNwID0gcHZzOworICAgICpwaW5mb3AgPSBwaW5mbzsKKyAgICByZXR1cm4gbnB2czsKIAogICBlcnJvcjoKLQkvKiBYWFhYIHdlIHNob3VsZCBjbGVhbiB1cCBldmVyeXRoaW5nICovCi0JaWYgKHB2cykKLQkJUHlNZW1fREVMKHB2cyk7Ci0JaWYgKHBpbmZvKQotCQlQeU1lbV9ERUwocGluZm8pOwotCXJldHVybiAtMTsKKyAgICAvKiBYWFhYIHdlIHNob3VsZCBjbGVhbiB1cCBldmVyeXRoaW5nICovCisgICAgaWYgKHB2cykKKyAgICAgICAgUHlNZW1fREVMKHB2cyk7CisgICAgaWYgKHBpbmZvKQorICAgICAgICBQeU1lbV9ERUwocGluZm8pOworICAgIHJldHVybiAtMTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI0NSwzMCArMjQ1LDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogU2V0Q29uZmlnKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCAoKmZ1bmMpKEFMY29uZmlnLCBpbnQpKQogewotCWludCBwYXI7CisgICAgaW50IHBhcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpTZXRDb25maWciLCAmcGFyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOlNldENvbmZpZyIsICZwYXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgoKmZ1bmMpKHNlbGYtPmNvbmZpZywgcGFyKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCgqZnVuYykoc2VsZi0+Y29uZmlnLCBwYXIpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBHZXRDb25maWcoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50ICgqZnVuYykoQUxjb25maWcpKQotewkKLQlpbnQgcGFyOworeworICAgIGludCBwYXI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRDb25maWciKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYgKChwYXIgPSAoKmZ1bmMpKHNlbGYtPmNvbmZpZykpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRDb25maWciKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBhcik7CisgICAgaWYgKChwYXIgPSAoKmZ1bmMpKHNlbGYtPmNvbmZpZykpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcGFyKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsY19TZXRXaWR0aF9fZG9jX18sCkBAIC0yNzcsNyArMjc3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfU2V0V2lkdGgoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gU2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsU2V0V2lkdGgpOworICAgIHJldHVybiBTZXRDb25maWcoc2VsZiwgYXJncywgYWxTZXRXaWR0aCk7CiB9CiAKIApAQCAtMjg3LDcgKzI4Nyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX0dldFdpZHRoKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIEdldENvbmZpZyhzZWxmLCBhcmdzLCBhbEdldFdpZHRoKTsKKyAgICByZXR1cm4gR2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsR2V0V2lkdGgpOwogfQogCiAKQEAgLTI5OCw3ICsyOTgsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19TZXRTYW1wRm10KGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIFNldENvbmZpZyhzZWxmLCBhcmdzLCBhbFNldFNhbXBGbXQpOworICAgIHJldHVybiBTZXRDb25maWcoc2VsZiwgYXJncywgYWxTZXRTYW1wRm10KTsKIH0KIAogCkBAIC0zMDksNyArMzA5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfR2V0U2FtcEZtdChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBHZXRDb25maWcoc2VsZiwgYXJncywgYWxHZXRTYW1wRm10KTsKKyAgICByZXR1cm4gR2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsR2V0U2FtcEZtdCk7CiB9CiAKIApAQCAtMzE5LDcgKzMxOSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX1NldENoYW5uZWxzKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIFNldENvbmZpZyhzZWxmLCBhcmdzLCBhbFNldENoYW5uZWxzKTsKKyAgICByZXR1cm4gU2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsU2V0Q2hhbm5lbHMpOwogfQogCiAKQEAgLTMyOSw3ICszMjksNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19HZXRDaGFubmVscyhhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBHZXRDb25maWcoc2VsZiwgYXJncywgYWxHZXRDaGFubmVscyk7CisgICAgcmV0dXJuIEdldENvbmZpZyhzZWxmLCBhcmdzLCBhbEdldENoYW5uZWxzKTsKIH0KIAogCkBAIC0zMzksMTQgKzMzOSwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19TZXRGbG9hdE1heChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSBtYXhpbXVtX3ZhbHVlOworICAgIGRvdWJsZSBtYXhpbXVtX3ZhbHVlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkOlNldEZsb2F0TWF4IiwgJm1heGltdW1fdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYWxTZXRGbG9hdE1heChzZWxmLT5jb25maWcsIG1heGltdW1fdmFsdWUpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDpTZXRGbG9hdE1heCIsICZtYXhpbXVtX3ZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFsU2V0RmxvYXRNYXgoc2VsZi0+Y29uZmlnLCBtYXhpbXVtX3ZhbHVlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC0zNTYsMTMgKzM1NiwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19HZXRGbG9hdE1heChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSBtYXhpbXVtX3ZhbHVlOworICAgIGRvdWJsZSBtYXhpbXVtX3ZhbHVlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmxvYXRNYXgiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChtYXhpbXVtX3ZhbHVlID0gYWxHZXRGbG9hdE1heChzZWxmLT5jb25maWcpKSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKG1heGltdW1fdmFsdWUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZsb2F0TWF4IikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgobWF4aW11bV92YWx1ZSA9IGFsR2V0RmxvYXRNYXgoc2VsZi0+Y29uZmlnKSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShtYXhpbXVtX3ZhbHVlKTsKIH0KIAogCkBAIC0zNzIsNyArMzcyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfU2V0RGV2aWNlKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIFNldENvbmZpZyhzZWxmLCBhcmdzLCBhbFNldERldmljZSk7CisgICAgcmV0dXJuIFNldENvbmZpZyhzZWxmLCBhcmdzLCBhbFNldERldmljZSk7CiB9CiAKIApAQCAtMzgyLDcgKzM4Miw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX0dldERldmljZShhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBHZXRDb25maWcoc2VsZiwgYXJncywgYWxHZXREZXZpY2UpOworICAgIHJldHVybiBHZXRDb25maWcoc2VsZiwgYXJncywgYWxHZXREZXZpY2UpOwogfQogCiAKQEAgLTM5Miw3ICszOTIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19TZXRRdWV1ZVNpemUoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gU2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsU2V0UXVldWVTaXplKTsKKyAgICByZXR1cm4gU2V0Q29uZmlnKHNlbGYsIGFyZ3MsIGFsU2V0UXVldWVTaXplKTsKIH0KIAogCkBAIC00MDIsNyArNDAyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfR2V0UXVldWVTaXplKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIEdldENvbmZpZyhzZWxmLCBhcmdzLCBhbEdldFF1ZXVlU2l6ZSk7CisgICAgcmV0dXJuIEdldENvbmZpZyhzZWxmLCBhcmdzLCBhbEdldFF1ZXVlU2l6ZSk7CiB9CiAKICNlbmRpZiAvKiBBTF9OT19FTEVNICovCkBAIC00MTAsNjYgKzQxMCw2NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldGNvbmZpZyhhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgKCpmdW5jKShBTGNvbmZpZywgbG9uZykpCiB7Ci0JbG9uZyBwYXI7CisgICAgbG9uZyBwYXI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6U2V0Q29uZmlnIiwgJnBhcikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpTZXRDb25maWciLCAmcGFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKCpmdW5jKShzZWxmLT5jb25maWcsIHBhcikgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgoKmZ1bmMpKHNlbGYtPmNvbmZpZywgcGFyKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0Y29uZmlnKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGxvbmcgKCpmdW5jKShBTGNvbmZpZykpCi17CQotCWxvbmcgcGFyOworeworICAgIGxvbmcgcGFyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0Q29uZmlnIikpCi0JCXJldHVybiBOVUxMOwotCQotCWlmICgocGFyID0gKCpmdW5jKShzZWxmLT5jb25maWcpKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0Q29uZmlnIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBwYXIpOworICAgIGlmICgocGFyID0gKCpmdW5jKShzZWxmLT5jb25maWcpKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBhcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfc2V0cXVldWVzaXplIChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzZXRjb25maWcoc2VsZiwgYXJncywgQUxzZXRxdWV1ZXNpemUpOworICAgIHJldHVybiBzZXRjb25maWcoc2VsZiwgYXJncywgQUxzZXRxdWV1ZXNpemUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX2dldHF1ZXVlc2l6ZSAoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMZ2V0cXVldWVzaXplKTsKKyAgICByZXR1cm4gZ2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMZ2V0cXVldWVzaXplKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19zZXR3aWR0aCAoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMc2V0d2lkdGgpOworICAgIHJldHVybiBzZXRjb25maWcoc2VsZiwgYXJncywgQUxzZXR3aWR0aCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfZ2V0d2lkdGggKGFsY29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdldGNvbmZpZyhzZWxmLCBhcmdzLCBBTGdldHdpZHRoKTsJCisgICAgcmV0dXJuIGdldGNvbmZpZyhzZWxmLCBhcmdzLCBBTGdldHdpZHRoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19nZXRjaGFubmVscyAoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMZ2V0Y2hhbm5lbHMpOwkKKyAgICByZXR1cm4gZ2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMZ2V0Y2hhbm5lbHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX3NldGNoYW5uZWxzIChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzZXRjb25maWcoc2VsZiwgYXJncywgQUxzZXRjaGFubmVscyk7CisgICAgcmV0dXJuIHNldGNvbmZpZyhzZWxmLCBhcmdzLCBBTHNldGNoYW5uZWxzKTsKIH0KIAogI2lmZGVmIEFMXzQwNQpAQCAtNDc3LDcwICs0NzcsNzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfZ2V0c2FtcGZtdCAoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMZ2V0c2FtcGZtdCk7CQorICAgIHJldHVybiBnZXRjb25maWcoc2VsZiwgYXJncywgQUxnZXRzYW1wZm10KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsY19zZXRzYW1wZm10IChhbGNvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzZXRjb25maWcoc2VsZiwgYXJncywgQUxzZXRzYW1wZm10KTsKKyAgICByZXR1cm4gc2V0Y29uZmlnKHNlbGYsIGFyZ3MsIEFMc2V0c2FtcGZtdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfZ2V0ZmxvYXRtYXgoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgYXJnOworICAgIGRvdWJsZSBhcmc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGbG9hdE1heCIpKQotCQlyZXR1cm4gMDsKLQlpZiAoKGFyZyA9IEFMZ2V0ZmxvYXRtYXgoc2VsZi0+Y29uZmlnKSkgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhcmcpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZsb2F0TWF4IikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICgoYXJnID0gQUxnZXRmbG9hdG1heChzZWxmLT5jb25maWcpKSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGFyZyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbGNfc2V0ZmxvYXRtYXgoYWxjb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgYXJnOworICAgIGRvdWJsZSBhcmc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6U2V0RmxvYXRNYXgiLCAmYXJnKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKEFMc2V0ZmxvYXRtYXgoc2VsZi0+Y29uZmlnLCBhcmcpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkOlNldEZsb2F0TWF4IiwgJmFyZykpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChBTHNldGZsb2F0bWF4KHNlbGYtPmNvbmZpZywgYXJnKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmIC8qIEFMXzQwNSAqLwotCQorCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGFsY19tZXRob2RzW10gPSB7Ci0jaWZkZWYgQUxfTk9fRUxFTQkJLyogSVJJWCA2ICovCi0JeyJTZXRXaWR0aCIsCShQeUNGdW5jdGlvbilhbGNfU2V0V2lkdGgsCU1FVEhfVkFSQVJHUywJYWxjX1NldFdpZHRoX19kb2NfX30sCi0JeyJHZXRXaWR0aCIsCShQeUNGdW5jdGlvbilhbGNfR2V0V2lkdGgsCU1FVEhfVkFSQVJHUywJYWxjX0dldFdpZHRoX19kb2NfX30sCi0JeyJTZXRTYW1wRm10IiwJKFB5Q0Z1bmN0aW9uKWFsY19TZXRTYW1wRm10LAlNRVRIX1ZBUkFSR1MsCWFsY19TZXRTYW1wRm10X19kb2NfX30sCi0JeyJHZXRTYW1wRm10IiwJKFB5Q0Z1bmN0aW9uKWFsY19HZXRTYW1wRm10LAlNRVRIX1ZBUkFSR1MsCWFsY19HZXRTYW1wRm10X19kb2NfX30sCi0JeyJTZXRDaGFubmVscyIsCShQeUNGdW5jdGlvbilhbGNfU2V0Q2hhbm5lbHMsCU1FVEhfVkFSQVJHUywJYWxjX1NldENoYW5uZWxzX19kb2NfX30sCi0JeyJHZXRDaGFubmVscyIsCShQeUNGdW5jdGlvbilhbGNfR2V0Q2hhbm5lbHMsCU1FVEhfVkFSQVJHUywJYWxjX0dldENoYW5uZWxzX19kb2NfX30sCi0JeyJTZXRGbG9hdE1heCIsCShQeUNGdW5jdGlvbilhbGNfU2V0RmxvYXRNYXgsCU1FVEhfVkFSQVJHUywJYWxjX1NldEZsb2F0TWF4X19kb2NfX30sCi0JeyJHZXRGbG9hdE1heCIsCShQeUNGdW5jdGlvbilhbGNfR2V0RmxvYXRNYXgsCU1FVEhfVkFSQVJHUywJYWxjX0dldEZsb2F0TWF4X19kb2NfX30sCi0JeyJTZXREZXZpY2UiLAkoUHlDRnVuY3Rpb24pYWxjX1NldERldmljZSwJTUVUSF9WQVJBUkdTLAlhbGNfU2V0RGV2aWNlX19kb2NfX30sCi0JeyJHZXREZXZpY2UiLAkoUHlDRnVuY3Rpb24pYWxjX0dldERldmljZSwJTUVUSF9WQVJBUkdTLAlhbGNfR2V0RGV2aWNlX19kb2NfX30sCi0JeyJTZXRRdWV1ZVNpemUiLAkoUHlDRnVuY3Rpb24pYWxjX1NldFF1ZXVlU2l6ZSwJTUVUSF9WQVJBUkdTLAlhbGNfU2V0UXVldWVTaXplX19kb2NfX30sCi0JeyJHZXRRdWV1ZVNpemUiLAkoUHlDRnVuY3Rpb24pYWxjX0dldFF1ZXVlU2l6ZSwJTUVUSF9WQVJBUkdTLAlhbGNfR2V0UXVldWVTaXplX19kb2NfX30sCisjaWZkZWYgQUxfTk9fRUxFTSAgICAgICAgICAgICAgIC8qIElSSVggNiAqLworICAgIHsiU2V0V2lkdGgiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19TZXRXaWR0aCwgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxjX1NldFdpZHRoX19kb2NfX30sCisgICAgeyJHZXRXaWR0aCIsICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX0dldFdpZHRoLCAgICAgIE1FVEhfVkFSQVJHUywgICBhbGNfR2V0V2lkdGhfX2RvY19ffSwKKyAgICB7IlNldFNhbXBGbXQiLCAgICAgIChQeUNGdW5jdGlvbilhbGNfU2V0U2FtcEZtdCwgICAgTUVUSF9WQVJBUkdTLCAgIGFsY19TZXRTYW1wRm10X19kb2NfX30sCisgICAgeyJHZXRTYW1wRm10IiwgICAgICAoUHlDRnVuY3Rpb24pYWxjX0dldFNhbXBGbXQsICAgIE1FVEhfVkFSQVJHUywgICBhbGNfR2V0U2FtcEZtdF9fZG9jX199LAorICAgIHsiU2V0Q2hhbm5lbHMiLCAgICAgKFB5Q0Z1bmN0aW9uKWFsY19TZXRDaGFubmVscywgICBNRVRIX1ZBUkFSR1MsICAgYWxjX1NldENoYW5uZWxzX19kb2NfX30sCisgICAgeyJHZXRDaGFubmVscyIsICAgICAoUHlDRnVuY3Rpb24pYWxjX0dldENoYW5uZWxzLCAgIE1FVEhfVkFSQVJHUywgICBhbGNfR2V0Q2hhbm5lbHNfX2RvY19ffSwKKyAgICB7IlNldEZsb2F0TWF4IiwgICAgIChQeUNGdW5jdGlvbilhbGNfU2V0RmxvYXRNYXgsICAgTUVUSF9WQVJBUkdTLCAgIGFsY19TZXRGbG9hdE1heF9fZG9jX199LAorICAgIHsiR2V0RmxvYXRNYXgiLCAgICAgKFB5Q0Z1bmN0aW9uKWFsY19HZXRGbG9hdE1heCwgICBNRVRIX1ZBUkFSR1MsICAgYWxjX0dldEZsb2F0TWF4X19kb2NfX30sCisgICAgeyJTZXREZXZpY2UiLCAgICAgICAoUHlDRnVuY3Rpb24pYWxjX1NldERldmljZSwgICAgIE1FVEhfVkFSQVJHUywgICBhbGNfU2V0RGV2aWNlX19kb2NfX30sCisgICAgeyJHZXREZXZpY2UiLCAgICAgICAoUHlDRnVuY3Rpb24pYWxjX0dldERldmljZSwgICAgIE1FVEhfVkFSQVJHUywgICBhbGNfR2V0RGV2aWNlX19kb2NfX30sCisgICAgeyJTZXRRdWV1ZVNpemUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfU2V0UXVldWVTaXplLCAgTUVUSF9WQVJBUkdTLCAgIGFsY19TZXRRdWV1ZVNpemVfX2RvY19ffSwKKyAgICB7IkdldFF1ZXVlU2l6ZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19HZXRRdWV1ZVNpemUsICBNRVRIX1ZBUkFSR1MsICAgYWxjX0dldFF1ZXVlU2l6ZV9fZG9jX199LAogI2VuZGlmIC8qIEFMX05PX0VMRU0gKi8KLQl7ImdldHF1ZXVlc2l6ZSIsCShQeUNGdW5jdGlvbilhbGNfZ2V0cXVldWVzaXplLAlNRVRIX1ZBUkFSR1N9LAotCXsic2V0cXVldWVzaXplIiwJKFB5Q0Z1bmN0aW9uKWFsY19zZXRxdWV1ZXNpemUsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXR3aWR0aCIsCQkoUHlDRnVuY3Rpb24pYWxjX2dldHdpZHRoLAlNRVRIX1ZBUkFSR1N9LAotCXsic2V0d2lkdGgiLAkJKFB5Q0Z1bmN0aW9uKWFsY19zZXR3aWR0aCwJTUVUSF9WQVJBUkdTfSwKLQl7ImdldGNoYW5uZWxzIiwJCShQeUNGdW5jdGlvbilhbGNfZ2V0Y2hhbm5lbHMsCU1FVEhfVkFSQVJHU30sCi0JeyJzZXRjaGFubmVscyIsCQkoUHlDRnVuY3Rpb24pYWxjX3NldGNoYW5uZWxzLAlNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0cXVldWVzaXplIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX2dldHF1ZXVlc2l6ZSwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRxdWV1ZXNpemUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfc2V0cXVldWVzaXplLCAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHdpZHRoIiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19nZXR3aWR0aCwgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0d2lkdGgiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX3NldHdpZHRoLCAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRjaGFubmVscyIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfZ2V0Y2hhbm5lbHMsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldGNoYW5uZWxzIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19zZXRjaGFubmVscywgICBNRVRIX1ZBUkFSR1N9LAogI2lmZGVmIEFMXzQwNQotCXsiZ2V0c2FtcGZtdCIsCQkoUHlDRnVuY3Rpb24pYWxjX2dldHNhbXBmbXQsCU1FVEhfVkFSQVJHU30sCi0JeyJzZXRzYW1wZm10IiwJCShQeUNGdW5jdGlvbilhbGNfc2V0c2FtcGZtdCwJTUVUSF9WQVJBUkdTfSwKLQl7ImdldGZsb2F0bWF4IiwJCShQeUNGdW5jdGlvbilhbGNfZ2V0ZmxvYXRtYXgsCU1FVEhfVkFSQVJHU30sCi0JeyJzZXRmbG9hdG1heCIsCQkoUHlDRnVuY3Rpb24pYWxjX3NldGZsb2F0bWF4LAlNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0c2FtcGZtdCIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX2dldHNhbXBmbXQsICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRzYW1wZm10IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbGNfc2V0c2FtcGZtdCwgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGZsb2F0bWF4IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsY19nZXRmbG9hdG1heCwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0ZmxvYXRtYXgiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxjX3NldGZsb2F0bWF4LCAgIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYgLyogQUxfNDA1ICovCiAKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiAtLS0tLS0tLS0tICovCkBAIC01NDksNjcgKzU0OSw2NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2FsY29iamVjdChBTGNvbmZpZyBjb25maWcpCiB7Ci0JYWxjb2JqZWN0ICpzZWxmOwotCQotCXNlbGYgPSBQeU9iamVjdF9OZXcoYWxjb2JqZWN0LCAmQWxjdHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBBZGQgeW91ciBvd24gaW5pdGlhbGl6ZXJzIGhlcmUgKi8KLQlzZWxmLT5jb25maWcgPSBjb25maWc7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOworICAgIGFsY29iamVjdCAqc2VsZjsKKworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoYWxjb2JqZWN0LCAmQWxjdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBBZGQgeW91ciBvd24gaW5pdGlhbGl6ZXJzIGhlcmUgKi8KKyAgICBzZWxmLT5jb25maWcgPSBjb25maWc7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOwogfQogCiAKIHN0YXRpYyB2b2lkCiBhbGNfZGVhbGxvYyhhbGNvYmplY3QgKnNlbGYpCiB7Ci0JLyogWFhYWCBBZGQgeW91ciBvd24gY2xlYW51cCBjb2RlIGhlcmUgKi8KLSNpZmRlZiBBTF9OT19FTEVNCQkvKiBJUklYIDYgKi8KLQkodm9pZCkgYWxGcmVlQ29uZmlnKHNlbGYtPmNvbmZpZyk7CS8qIGlnbm9yZSBlcnJvcnMgKi8KKyAgICAvKiBYWFhYIEFkZCB5b3VyIG93biBjbGVhbnVwIGNvZGUgaGVyZSAqLworI2lmZGVmIEFMX05PX0VMRU0gICAgICAgICAgICAgICAvKiBJUklYIDYgKi8KKyAgICAodm9pZCkgYWxGcmVlQ29uZmlnKHNlbGYtPmNvbmZpZyk7ICAgICAgICAgIC8qIGlnbm9yZSBlcnJvcnMgKi8KICNlbHNlCi0JKHZvaWQpIEFMZnJlZWNvbmZpZyhzZWxmLT5jb25maWcpOwkvKiBpZ25vcmUgZXJyb3JzICovCisgICAgKHZvaWQpIEFMZnJlZWNvbmZpZyhzZWxmLT5jb25maWcpOyAgICAgICAgICAvKiBpZ25vcmUgZXJyb3JzICovCiAjZW5kaWYKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxjX2dldGF0dHIoYWxjb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCS8qIFhYWFggQWRkIHlvdXIgb3duIGdldGF0dHIgY29kZSBoZXJlICovCi0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoYWxjX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIGdldGF0dHIgY29kZSBoZXJlICovCisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoYWxjX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCiBQeURvY19TVFJWQVIoQWxjdHlwZV9fZG9jX18sICIiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBBbGN0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiYWwuY29uZmlnIiwJCQkvKnRwX25hbWUqLwotCXNpemVvZihhbGNvYmplY3QpLAkJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilhbGNfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkocHJpbnRmdW5jKTAsCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpYWxjX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsCS8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpMCwJCS8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpMCwJCS8qdHBfaGFzaCovCi0JKHRlcm5hcnlmdW5jKTAsCQkvKnRwX2NhbGwqLwotCShyZXByZnVuYykwLAkJLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiYWwuY29uZmlnIiwgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihhbGNvYmplY3QpLCAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpYWxjX2RlYWxsb2MsICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAocHJpbnRmdW5jKTAsICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWFsY19nZXRhdHRyLCAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgICAgIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpMCwgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwogCi0JLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KLQkwTCwwTCwwTCwwTCwKLQlBbGN0eXBlX19kb2NfXyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLworICAgIC8qIFNwYWNlIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCisgICAgMEwsMEwsMEwsMEwsCisgICAgQWxjdHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KIH07CiAKIC8qIEVuZCBvZiBjb2RlIGZvciBjb25maWcgb2JqZWN0cyAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWZkZWYgQUxfTk9fRUxFTQkJLyogSVJJWCA2ICovCisjaWZkZWYgQUxfTk9fRUxFTSAgICAgICAgICAgICAgIC8qIElSSVggNiAqLwogCiBQeURvY19TVFJWQVIoYWxwX1NldENvbmZpZ19fZG9jX18sCiAiYWxTZXRDb25maWc6IHNldCB0aGUgQUxjb25maWcgb2YgYW4gYXVkaW8gQUxwb3J0LiIpOwpAQCAtNjE3LDEzICs2MTcsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfU2V0Q29uZmlnKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JYWxjb2JqZWN0ICpjb25maWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpTZXRDb25maWciLCAmQWxjdHlwZSwgJmNvbmZpZykpCi0JCXJldHVybiBOVUxMOwotCWlmIChhbFNldENvbmZpZyhzZWxmLT5wb3J0LCBjb25maWctPmNvbmZpZykgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgYWxjb2JqZWN0ICpjb25maWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpTZXRDb25maWciLCAmQWxjdHlwZSwgJmNvbmZpZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhbFNldENvbmZpZyhzZWxmLT5wb3J0LCBjb25maWctPmNvbmZpZykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtNjMzLDEyICs2MzMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfR2V0Q29uZmlnKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQUxjb25maWcgY29uZmlnOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldENvbmZpZyIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGNvbmZpZyA9IGFsR2V0Q29uZmlnKHNlbGYtPnBvcnQpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbmV3YWxjb2JqZWN0KGNvbmZpZyk7CisgICAgQUxjb25maWcgY29uZmlnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldENvbmZpZyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGNvbmZpZyA9IGFsR2V0Q29uZmlnKHNlbGYtPnBvcnQpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3YWxjb2JqZWN0KGNvbmZpZyk7CiB9CiAKIApAQCAtNjQ4LDEzICs2NDgsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfR2V0UmVzb3VyY2UoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzb3VyY2U7CisgICAgaW50IHJlc291cmNlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0UmVzb3VyY2UiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChyZXNvdXJjZSA9IGFsR2V0UmVzb3VyY2Uoc2VsZi0+cG9ydCkpID09IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcmVzb3VyY2UpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldFJlc291cmNlIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgocmVzb3VyY2UgPSBhbEdldFJlc291cmNlKHNlbGYtPnBvcnQpKSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHJlc291cmNlKTsKIH0KIAogCkBAIC02NjQsMTUgKzY2NCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9HZXRGRChhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZDsKKyAgICBpbnQgZmQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGRCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGRCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgoZmQgPSBhbEdldEZEKHNlbGYtPnBvcnQpKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmICgoZmQgPSBhbEdldEZEKHNlbGYtPnBvcnQpKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmZCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmZCk7CiB9CiAKIApAQCAtNjgzLDEzICs2ODMsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfR2V0RmlsbGVkKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZpbGxlZDsKKyAgICBpbnQgZmlsbGVkOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbGVkIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZmlsbGVkID0gYWxHZXRGaWxsZWQoc2VsZi0+cG9ydCkpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmaWxsZWQpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZpbGxlZCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGZpbGxlZCA9IGFsR2V0RmlsbGVkKHNlbGYtPnBvcnQpKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZmlsbGVkKTsKIH0KIAogCkBAIC03MDAsMTMgKzcwMCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9HZXRGaWxsYWJsZShhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmaWxsYWJsZTsKKyAgICBpbnQgZmlsbGFibGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsYWJsZSIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGZpbGxhYmxlID0gYWxHZXRGaWxsYWJsZShzZWxmLT5wb3J0KSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZpbGxhYmxlKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsYWJsZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGZpbGxhYmxlID0gYWxHZXRGaWxsYWJsZShzZWxmLT5wb3J0KSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZpbGxhYmxlKTsKIH0KIAogCkBAIC03MTYsNjQgKzcxNiw2NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9SZWFkRnJhbWVzKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZyYW1lY291bnQ7Ci0JUHlPYmplY3QgKnY7Ci0JaW50IHNpemU7Ci0JaW50IGNoOwotCUFMY29uZmlnIGM7CisgICAgaW50IGZyYW1lY291bnQ7CisgICAgUHlPYmplY3QgKnY7CisgICAgaW50IHNpemU7CisgICAgaW50IGNoOworICAgIEFMY29uZmlnIGM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6UmVhZEZyYW1lcyIsICZmcmFtZWNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGZyYW1lY291bnQgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgIm5lZ2F0aXZlIGZyYW1lY291bnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWMgPSBhbEdldENvbmZpZyhzZWxmLT5wb3J0KTsKLQlzd2l0Y2ggKGFsR2V0U2FtcEZtdChjKSkgewotCWNhc2UgQUxfU0FNUEZNVF9UV09TQ09NUDoKLQkJc3dpdGNoIChhbEdldFdpZHRoKGMpKSB7Ci0JCWNhc2UgQUxfU0FNUExFXzg6Ci0JCQlzaXplID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIEFMX1NBTVBMRV8xNjoKLQkJCXNpemUgPSAyOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUxfU0FNUExFXzI0OgotCQkJc2l6ZSA9IDQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSB3aWR0aCIpOwotCQkJYWxGcmVlQ29uZmlnKGMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBTF9TQU1QRk1UX0ZMT0FUOgotCQlzaXplID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSBBTF9TQU1QRk1UX0RPVUJMRToKLQkJc2l6ZSA9IDg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSBmb3JtYXQiKTsKLQkJYWxGcmVlQ29uZmlnKGMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JY2ggPSBhbEdldENoYW5uZWxzKGMpOwotCWFsRnJlZUNvbmZpZyhjKTsKLQlpZiAoY2ggPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImNhbid0IGRldGVybWluZSAjIG9mIGNoYW5uZWxzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzaXplICo9IGNoOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSBOVUxMLCBzaXplICogZnJhbWVjb3VudCk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOlJlYWRGcmFtZXMiLCAmZnJhbWVjb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChmcmFtZWNvdW50IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJuZWdhdGl2ZSBmcmFtZWNvdW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjID0gYWxHZXRDb25maWcoc2VsZi0+cG9ydCk7CisgICAgc3dpdGNoIChhbEdldFNhbXBGbXQoYykpIHsKKyAgICBjYXNlIEFMX1NBTVBGTVRfVFdPU0NPTVA6CisgICAgICAgIHN3aXRjaCAoYWxHZXRXaWR0aChjKSkgeworICAgICAgICBjYXNlIEFMX1NBTVBMRV84OgorICAgICAgICAgICAgc2l6ZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTF9TQU1QTEVfMTY6CisgICAgICAgICAgICBzaXplID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMX1NBTVBMRV8yNDoKKyAgICAgICAgICAgIHNpemUgPSA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgd2lkdGgiKTsKKyAgICAgICAgICAgIGFsRnJlZUNvbmZpZyhjKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxfU0FNUEZNVF9GTE9BVDoKKyAgICAgICAgc2l6ZSA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUxfU0FNUEZNVF9ET1VCTEU6CisgICAgICAgIHNpemUgPSA4OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgZm9ybWF0Iik7CisgICAgICAgIGFsRnJlZUNvbmZpZyhjKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNoID0gYWxHZXRDaGFubmVscyhjKTsKKyAgICBhbEZyZWVDb25maWcoYyk7CisgICAgaWYgKGNoIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgIyBvZiBjaGFubmVscyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2l6ZSAqPSBjaDsKKyAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikgTlVMTCwgc2l6ZSAqIGZyYW1lY291bnQpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWFsUmVhZEZyYW1lcyhzZWxmLT5wb3J0LCAodm9pZCAqKSBQeVN0cmluZ19BU19TVFJJTkcodiksIGZyYW1lY291bnQpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGFsUmVhZEZyYW1lcyhzZWxmLT5wb3J0LCAodm9pZCAqKSBQeVN0cmluZ19BU19TVFJJTkcodiksIGZyYW1lY291bnQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlyZXR1cm4gdjsKKyAgICByZXR1cm4gdjsKIH0KIAogCkBAIC03ODMsMTkgKzc4MywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9EaXNjYXJkRnJhbWVzKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZyYW1lY291bnQ7CisgICAgaW50IGZyYW1lY291bnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6RGlzY2FyZEZyYW1lcyIsICZmcmFtZWNvdW50KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkRpc2NhcmRGcmFtZXMiLCAmZnJhbWVjb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZyYW1lY291bnQgPSBhbERpc2NhcmRGcmFtZXMoc2VsZi0+cG9ydCwgZnJhbWVjb3VudCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnJhbWVjb3VudCA9IGFsRGlzY2FyZEZyYW1lcyhzZWxmLT5wb3J0LCBmcmFtZWNvdW50KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKGZyYW1lY291bnQgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZnJhbWVjb3VudCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmcmFtZWNvdW50KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZyYW1lY291bnQpOwogfQogCiAKQEAgLTgwNSwyMiArODA1LDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX1plcm9GcmFtZXMoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZnJhbWVjb3VudDsKKyAgICBpbnQgZnJhbWVjb3VudDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpaZXJvRnJhbWVzIiwgJmZyYW1lY291bnQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6WmVyb0ZyYW1lcyIsICZmcmFtZWNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZnJhbWVjb3VudCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAibmVnYXRpdmUgZnJhbWVjb3VudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGZyYW1lY291bnQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgIm5lZ2F0aXZlIGZyYW1lY291bnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWFsWmVyb0ZyYW1lcyhzZWxmLT5wb3J0LCBmcmFtZWNvdW50KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBhbFplcm9GcmFtZXMoc2VsZi0+cG9ydCwgZnJhbWVjb3VudCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtODMwLDE2ICs4MzAsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfU2V0RmlsbFBvaW50KGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZpbGxwb2ludDsKKyAgICBpbnQgZmlsbHBvaW50OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOlNldEZpbGxQb2ludCIsICZmaWxscG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6U2V0RmlsbFBvaW50IiwgJmZpbGxwb2ludCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGFsU2V0RmlsbFBvaW50KHNlbGYtPnBvcnQsIGZpbGxwb2ludCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYWxTZXRGaWxsUG9pbnQoc2VsZi0+cG9ydCwgZmlsbHBvaW50KSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC04NDksMTUgKzg0OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9HZXRGaWxsUG9pbnQoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmlsbHBvaW50OworICAgIGludCBmaWxscG9pbnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsUG9pbnQiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbFBvaW50IikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKChmaWxscG9pbnQgPSBhbEdldEZpbGxQb2ludChzZWxmLT5wb3J0KSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKGZpbGxwb2ludCA9IGFsR2V0RmlsbFBvaW50KHNlbGYtPnBvcnQpKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBmaWxscG9pbnQpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZmlsbHBvaW50KTsKIH0KIAogCkBAIC04NjgsMTUgKzg2OCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9HZXRGcmFtZU51bWJlcihhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YW1wX3QgZm51bTsKKyAgICBzdGFtcF90IGZudW07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGcmFtZU51bWJlciIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGcmFtZU51bWJlciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChhbEdldEZyYW1lTnVtYmVyKHNlbGYtPnBvcnQsICZmbnVtKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChhbEdldEZyYW1lTnVtYmVyKHNlbGYtPnBvcnQsICZmbnVtKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgZm51bSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgZm51bSk7CiB9CiAKIApAQCAtODg3LDI0ICs4ODcsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfR2V0RnJhbWVUaW1lKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RhbXBfdCBmbnVtLCB0aW1lOwotCVB5T2JqZWN0ICpyZXQsICp2MCwgKnYxOworICAgIHN0YW1wX3QgZm51bSwgdGltZTsKKyAgICBQeU9iamVjdCAqcmV0LCAqdjAsICp2MTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZyYW1lVGltZSIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYWxHZXRGcmFtZVRpbWUoc2VsZi0+cG9ydCwgJmZudW0sICZ0aW1lKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXYwID0gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSBmbnVtKTsKLQl2MSA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKGxvbmcgbG9uZykgdGltZSk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfWERFQ1JFRih2MCk7Ci0JCVB5X1hERUNSRUYodjEpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0ID0gUHlUdXBsZV9QYWNrKDIsIHYwLCB2MSk7Ci0JUHlfREVDUkVGKHYwKTsKLQlQeV9ERUNSRUYodjEpOwotCXJldHVybiByZXQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RnJhbWVUaW1lIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhbEdldEZyYW1lVGltZShzZWxmLT5wb3J0LCAmZm51bSwgJnRpbWUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjAgPSBQeUxvbmdfRnJvbUxvbmdMb25nKChsb25nIGxvbmcpIGZudW0pOworICAgIHYxID0gUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSB0aW1lKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9YREVDUkVGKHYwKTsKKyAgICAgICAgUHlfWERFQ1JFRih2MSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXQgPSBQeVR1cGxlX1BhY2soMiwgdjAsIHYxKTsKKyAgICBQeV9ERUNSRUYodjApOworICAgIFB5X0RFQ1JFRih2MSk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogCkBAIC05MTQsNjIgKzkxNCw2MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9Xcml0ZUZyYW1lcyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnNhbXBsZXM7Ci0JaW50IGxlbmd0aDsKLQlpbnQgc2l6ZSwgY2g7Ci0JQUxjb25maWcgYzsKKyAgICBjaGFyICpzYW1wbGVzOworICAgIGludCBsZW5ndGg7CisgICAgaW50IHNpemUsIGNoOworICAgIEFMY29uZmlnIGM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOldyaXRlRnJhbWVzIiwgJnNhbXBsZXMsICZsZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKLQljID0gYWxHZXRDb25maWcoc2VsZi0+cG9ydCk7Ci0Jc3dpdGNoIChhbEdldFNhbXBGbXQoYykpIHsKLQljYXNlIEFMX1NBTVBGTVRfVFdPU0NPTVA6Ci0JCXN3aXRjaCAoYWxHZXRXaWR0aChjKSkgewotCQljYXNlIEFMX1NBTVBMRV84OgotCQkJc2l6ZSA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBBTF9TQU1QTEVfMTY6Ci0JCQlzaXplID0gMjsKLQkJCWJyZWFrOwotCQljYXNlIEFMX1NBTVBMRV8yNDoKLQkJCXNpemUgPSA0OwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgd2lkdGgiKTsKLQkJCWFsRnJlZUNvbmZpZyhjKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQUxfU0FNUEZNVF9GTE9BVDoKLQkJc2l6ZSA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgQUxfU0FNUEZNVF9ET1VCTEU6Ci0JCXNpemUgPSA4OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgZm9ybWF0Iik7Ci0JCWFsRnJlZUNvbmZpZyhjKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNoID0gYWxHZXRDaGFubmVscyhjKTsKLQlhbEZyZWVDb25maWcoYyk7Ci0JaWYgKGNoIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJjYW4ndCBkZXRlcm1pbmUgIyBvZiBjaGFubmVscyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2l6ZSAqPSBjaDsKLQlpZiAobGVuZ3RoICUgc2l6ZSAhPSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwKLQkJCQkiYnVmZmVyIGxlbmd0aCBub3Qgd2hvbGUgbnVtYmVyIG9mIGZyYW1lcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpXcml0ZUZyYW1lcyIsICZzYW1wbGVzLCAmbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYyA9IGFsR2V0Q29uZmlnKHNlbGYtPnBvcnQpOworICAgIHN3aXRjaCAoYWxHZXRTYW1wRm10KGMpKSB7CisgICAgY2FzZSBBTF9TQU1QRk1UX1RXT1NDT01QOgorICAgICAgICBzd2l0Y2ggKGFsR2V0V2lkdGgoYykpIHsKKyAgICAgICAgY2FzZSBBTF9TQU1QTEVfODoKKyAgICAgICAgICAgIHNpemUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxfU0FNUExFXzE2OgorICAgICAgICAgICAgc2l6ZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTF9TQU1QTEVfMjQ6CisgICAgICAgICAgICBzaXplID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lIHdpZHRoIik7CisgICAgICAgICAgICBhbEZyZWVDb25maWcoYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFMX1NBTVBGTVRfRkxPQVQ6CisgICAgICAgIHNpemUgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFMX1NBTVBGTVRfRE9VQkxFOgorICAgICAgICBzaXplID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lIGZvcm1hdCIpOworICAgICAgICBhbEZyZWVDb25maWcoYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjaCA9IGFsR2V0Q2hhbm5lbHMoYyk7CisgICAgYWxGcmVlQ29uZmlnKGMpOworICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiY2FuJ3QgZGV0ZXJtaW5lICMgb2YgY2hhbm5lbHMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNpemUgKj0gY2g7CisgICAgaWYgKGxlbmd0aCAlIHNpemUgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIGxlbmd0aCBub3Qgd2hvbGUgbnVtYmVyIG9mIGZyYW1lcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JYWxXcml0ZUZyYW1lcyhzZWxmLT5wb3J0LCAodm9pZCAqKSBzYW1wbGVzLCBsZW5ndGggLyBzaXplKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBhbFdyaXRlRnJhbWVzKHNlbGYtPnBvcnQsICh2b2lkICopIHNhbXBsZXMsIGxlbmd0aCAvIHNpemUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTk3OCwxMyArOTc4LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX0Nsb3NlUG9ydChhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkNsb3NlUG9ydCIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYWxDbG9zZVBvcnQoc2VsZi0+cG9ydCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5wb3J0ID0gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Q2xvc2VQb3J0IikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhbENsb3NlUG9ydChzZWxmLT5wb3J0KSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnBvcnQgPSBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2VuZGlmIC8qIEFMX05PX0VMRU0gKi8KQEAgLTk5MywyNTcgKzk5MywyNTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfY2xvc2Vwb3J0KGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Q2xvc2VQb3J0IikpCi0JCXJldHVybiBOVUxMOwotCWlmIChBTGNsb3NlcG9ydChzZWxmLT5wb3J0KSA8IDApCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnBvcnQgPSBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpDbG9zZVBvcnQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKEFMY2xvc2Vwb3J0KHNlbGYtPnBvcnQpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+cG9ydCA9IE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX2dldGZkKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkOworICAgIGludCBmZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldEZEIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZmQgPSBBTGdldGZkKHNlbGYtPiBwb3J0KSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhmZCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RkQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChmZCA9IEFMZ2V0ZmQoc2VsZi0+IHBvcnQpKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZkKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9nZXRmaWxsZWQoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGNvdW50OworICAgIGxvbmcgY291bnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsZWQiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChjb3VudCA9IEFMZ2V0ZmlsbGVkKHNlbGYtPiBwb3J0KSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhjb3VudCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbGVkIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoY291bnQgPSBBTGdldGZpbGxlZChzZWxmLT4gcG9ydCkpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoY291bnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX2dldGZpbGxhYmxlKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBjb3VudDsKKyAgICBsb25nIGNvdW50OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbGFibGUiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChjb3VudCA9IEFMZ2V0ZmlsbGFibGUoc2VsZi0+IHBvcnQpKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nIChjb3VudCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0RmlsbGFibGUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChjb3VudCA9IEFMZ2V0ZmlsbGFibGUoc2VsZi0+IHBvcnQpKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nIChjb3VudCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfcmVhZHNhbXBzKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBjb3VudDsKLQlQeU9iamVjdCAqdjsKLQlBTGNvbmZpZyBjOwotCWludCB3aWR0aDsKLQlpbnQgcmV0OworICAgIGxvbmcgY291bnQ7CisgICAgUHlPYmplY3QgKnY7CisgICAgQUxjb25maWcgYzsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IHJldDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpyZWFkc2FtcHMiLCAmY291bnQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cmVhZHNhbXBzIiwgJmNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoY291bnQgPD0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJhbC5yZWFkc2FtcHMgOiBhcmcgPD0gMCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGNvdW50IDw9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiYWwucmVhZHNhbXBzIDogYXJnIDw9IDAiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYyA9IEFMZ2V0Y29uZmlnKHNlbGYtPnBvcnQpOworICAgIGMgPSBBTGdldGNvbmZpZyhzZWxmLT5wb3J0KTsKICNpZmRlZiBBTF80MDUKLQl3aWR0aCA9IEFMZ2V0c2FtcGZtdChjKTsKLQlpZiAod2lkdGggPT0gQUxfU0FNUEZNVF9GTE9BVCkKLQkJd2lkdGggPSBzaXplb2YoZmxvYXQpOwotCWVsc2UgaWYgKHdpZHRoID09IEFMX1NBTVBGTVRfRE9VQkxFKQotCQl3aWR0aCA9IHNpemVvZihkb3VibGUpOwotCWVsc2UKLQkJd2lkdGggPSBBTGdldHdpZHRoKGMpOworICAgIHdpZHRoID0gQUxnZXRzYW1wZm10KGMpOworICAgIGlmICh3aWR0aCA9PSBBTF9TQU1QRk1UX0ZMT0FUKQorICAgICAgICB3aWR0aCA9IHNpemVvZihmbG9hdCk7CisgICAgZWxzZSBpZiAod2lkdGggPT0gQUxfU0FNUEZNVF9ET1VCTEUpCisgICAgICAgIHdpZHRoID0gc2l6ZW9mKGRvdWJsZSk7CisgICAgZWxzZQorICAgICAgICB3aWR0aCA9IEFMZ2V0d2lkdGgoYyk7CiAjZWxzZQotCXdpZHRoID0gQUxnZXR3aWR0aChjKTsKKyAgICB3aWR0aCA9IEFMZ2V0d2lkdGgoYyk7CiAjZW5kaWYgLyogQUxfNDA1ICovCi0JQUxmcmVlY29uZmlnKGMpOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHdpZHRoICogY291bnQpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIEFMZnJlZWNvbmZpZyhjKTsKKyAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCB3aWR0aCAqIGNvdW50KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBBTHJlYWRzYW1wcyhzZWxmLT5wb3J0LCAodm9pZCAqKSBQeVN0cmluZ19Bc1N0cmluZyh2KSwgY291bnQpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJldCA9PSAtMSkgewotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmV0ID0gQUxyZWFkc2FtcHMoc2VsZi0+cG9ydCwgKHZvaWQgKikgUHlTdHJpbmdfQXNTdHJpbmcodiksIGNvdW50KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXQgPT0gLTEpIHsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gKHYpOworICAgIHJldHVybiAodik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfd3JpdGVzYW1wcyhhbHBvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmJ1ZjsKLQlpbnQgc2l6ZSwgd2lkdGg7Ci0JQUxjb25maWcgYzsKLQlpbnQgcmV0OworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgc2l6ZSwgd2lkdGg7CisgICAgQUxjb25maWcgYzsKKyAgICBpbnQgcmV0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp3cml0ZXNhbXBzIiwgJmJ1ZiwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOndyaXRlc2FtcHMiLCAmYnVmLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JYyA9IEFMZ2V0Y29uZmlnKHNlbGYtPnBvcnQpOworICAgIGMgPSBBTGdldGNvbmZpZyhzZWxmLT5wb3J0KTsKICNpZmRlZiBBTF80MDUKLQl3aWR0aCA9IEFMZ2V0c2FtcGZtdChjKTsKLQlpZiAod2lkdGggPT0gQUxfU0FNUEZNVF9GTE9BVCkKLQkJd2lkdGggPSBzaXplb2YoZmxvYXQpOwotCWVsc2UgaWYgKHdpZHRoID09IEFMX1NBTVBGTVRfRE9VQkxFKQotCQl3aWR0aCA9IHNpemVvZihkb3VibGUpOwotCWVsc2UKLQkJd2lkdGggPSBBTGdldHdpZHRoKGMpOworICAgIHdpZHRoID0gQUxnZXRzYW1wZm10KGMpOworICAgIGlmICh3aWR0aCA9PSBBTF9TQU1QRk1UX0ZMT0FUKQorICAgICAgICB3aWR0aCA9IHNpemVvZihmbG9hdCk7CisgICAgZWxzZSBpZiAod2lkdGggPT0gQUxfU0FNUEZNVF9ET1VCTEUpCisgICAgICAgIHdpZHRoID0gc2l6ZW9mKGRvdWJsZSk7CisgICAgZWxzZQorICAgICAgICB3aWR0aCA9IEFMZ2V0d2lkdGgoYyk7CiAjZWxzZQotCXdpZHRoID0gQUxnZXR3aWR0aChjKTsKKyAgICB3aWR0aCA9IEFMZ2V0d2lkdGgoYyk7CiAjZW5kaWYgLyogQUxfNDA1ICovCi0JQUxmcmVlY29uZmlnKGMpOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBBTHdyaXRlc2FtcHMgKHNlbGYtPnBvcnQsICh2b2lkICopIGJ1ZiwgKGxvbmcpIHNpemUgLyB3aWR0aCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmV0ID09IC0xKQotCQlyZXR1cm4gTlVMTDsKKyAgICBBTGZyZWVjb25maWcoYyk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldCA9IEFMd3JpdGVzYW1wcyAoc2VsZi0+cG9ydCwgKHZvaWQgKikgYnVmLCAobG9uZykgc2l6ZSAvIHdpZHRoKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXQgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9nZXRmaWxscG9pbnQoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGNvdW50OworICAgIGxvbmcgY291bnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsUG9pbnQiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChjb3VudCA9IEFMZ2V0ZmlsbHBvaW50KHNlbGYtPnBvcnQpKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNvdW50KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRGaWxsUG9pbnQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChjb3VudCA9IEFMZ2V0ZmlsbHBvaW50KHNlbGYtPnBvcnQpKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNvdW50KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFscF9zZXRmaWxscG9pbnQoYWxwb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGNvdW50OworICAgIGxvbmcgY291bnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6U2V0RmlsbFBvaW50IiwgJmNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKEFMc2V0ZmlsbHBvaW50KHNlbGYtPnBvcnQsIGNvdW50KSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpTZXRGaWxsUG9pbnQiLCAmY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoQUxzZXRmaWxscG9pbnQoc2VsZi0+cG9ydCwgY291bnQpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfc2V0Y29uZmlnKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JYWxjb2JqZWN0ICpjb25maWc7CisgICAgYWxjb2JqZWN0ICpjb25maWc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOlNldENvbmZpZyIsICZBbGN0eXBlLCAmY29uZmlnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKEFMc2V0Y29uZmlnKHNlbGYtPnBvcnQsIGNvbmZpZy0+Y29uZmlnKSA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyE6U2V0Q29uZmlnIiwgJkFsY3R5cGUsICZjb25maWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoQUxzZXRjb25maWcoc2VsZi0+cG9ydCwgY29uZmlnLT5jb25maWcpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfZ2V0Y29uZmlnKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQUxjb25maWcgY29uZmlnOworICAgIEFMY29uZmlnIGNvbmZpZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkdldENvbmZpZyIpKQotCQlyZXR1cm4gTlVMTDsKLQljb25maWcgPSBBTGdldGNvbmZpZyhzZWxmLT5wb3J0KTsKLQlpZiAoY29uZmlnID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBuZXdhbGNvYmplY3QoY29uZmlnKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRDb25maWciKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29uZmlnID0gQUxnZXRjb25maWcoc2VsZi0+cG9ydCk7CisgICAgaWYgKGNvbmZpZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3YWxjb2JqZWN0KGNvbmZpZyk7CiB9CiAKICNpZmRlZiBBTF80MDUKIHN0YXRpYyBQeU9iamVjdCAqCiBhbHBfZ2V0c3RhdHVzKGFscG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmxpc3QsICp2OwotCWxvbmcgKlBWYnVmZmVyOwotCWxvbmcgbGVuZ3RoOwotCWludCBpOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlMaXN0X1R5cGUsICZsaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbGVuZ3RoID0gUHlMaXN0X1NpemUobGlzdCk7Ci0JUFZidWZmZXIgPSBQeU1lbV9ORVcobG9uZywgbGVuZ3RoKTsKLQlpZiAoUFZidWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCXYgPSBQeUxpc3RfR2V0SXRlbShsaXN0LCBpKTsKLQkJaWYgKCFQeUludF9DaGVjayh2KSkgewotCQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQVmJ1ZmZlcltpXSA9IFB5SW50X0FzTG9uZyh2KTsKLQl9CisgICAgUHlPYmplY3QgKmxpc3QsICp2OworICAgIGxvbmcgKlBWYnVmZmVyOworICAgIGxvbmcgbGVuZ3RoOworICAgIGludCBpOwogCi0JaWYgKEFMZ2V0c3RhdHVzKHNlbGYtPnBvcnQsIFBWYnVmZmVyLCBsZW5ndGgpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5TGlzdF9UeXBlLCAmbGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxlbmd0aCA9IFB5TGlzdF9TaXplKGxpc3QpOworICAgIFBWYnVmZmVyID0gUHlNZW1fTkVXKGxvbmcsIGxlbmd0aCk7CisgICAgaWYgKFBWYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICB2ID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7CisgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUFZidWZmZXJbaV0gPSBQeUludF9Bc0xvbmcodik7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotCQlQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSkpOworICAgIGlmIChBTGdldHN0YXR1cyhzZWxmLT5wb3J0LCBQVmJ1ZmZlciwgbGVuZ3RoKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeU1lbV9ERUwoUFZidWZmZXIpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmIC8qIEFMXzQwNSAqLwogCiAjZW5kaWYgLyogT0xEX0lOVEVSRkFDRSAqLwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGFscF9tZXRob2RzW10gPSB7Ci0jaWZkZWYgQUxfTk9fRUxFTQkJLyogSVJJWCA2ICovCi0JeyJTZXRDb25maWciLAkoUHlDRnVuY3Rpb24pYWxwX1NldENvbmZpZywJTUVUSF9WQVJBUkdTLAlhbHBfU2V0Q29uZmlnX19kb2NfX30sCi0JeyJHZXRDb25maWciLAkoUHlDRnVuY3Rpb24pYWxwX0dldENvbmZpZywJTUVUSF9WQVJBUkdTLAlhbHBfR2V0Q29uZmlnX19kb2NfX30sCi0JeyJHZXRSZXNvdXJjZSIsCShQeUNGdW5jdGlvbilhbHBfR2V0UmVzb3VyY2UsCU1FVEhfVkFSQVJHUywJYWxwX0dldFJlc291cmNlX19kb2NfX30sCi0JeyJHZXRGRCIsCShQeUNGdW5jdGlvbilhbHBfR2V0RkQsCU1FVEhfVkFSQVJHUywJYWxwX0dldEZEX19kb2NfX30sCi0JeyJHZXRGaWxsZWQiLAkoUHlDRnVuY3Rpb24pYWxwX0dldEZpbGxlZCwJTUVUSF9WQVJBUkdTLAlhbHBfR2V0RmlsbGVkX19kb2NfX30sCi0JeyJHZXRGaWxsYWJsZSIsCShQeUNGdW5jdGlvbilhbHBfR2V0RmlsbGFibGUsCU1FVEhfVkFSQVJHUywJYWxwX0dldEZpbGxhYmxlX19kb2NfX30sCi0JeyJSZWFkRnJhbWVzIiwJKFB5Q0Z1bmN0aW9uKWFscF9SZWFkRnJhbWVzLAlNRVRIX1ZBUkFSR1MsCWFscF9SZWFkRnJhbWVzX19kb2NfX30sCi0JeyJEaXNjYXJkRnJhbWVzIiwJKFB5Q0Z1bmN0aW9uKWFscF9EaXNjYXJkRnJhbWVzLAlNRVRIX1ZBUkFSR1MsCWFscF9EaXNjYXJkRnJhbWVzX19kb2NfX30sCi0JeyJaZXJvRnJhbWVzIiwJKFB5Q0Z1bmN0aW9uKWFscF9aZXJvRnJhbWVzLAlNRVRIX1ZBUkFSR1MsCWFscF9aZXJvRnJhbWVzX19kb2NfX30sCi0JeyJTZXRGaWxsUG9pbnQiLAkoUHlDRnVuY3Rpb24pYWxwX1NldEZpbGxQb2ludCwJTUVUSF9WQVJBUkdTLAlhbHBfU2V0RmlsbFBvaW50X19kb2NfX30sCi0JeyJHZXRGaWxsUG9pbnQiLAkoUHlDRnVuY3Rpb24pYWxwX0dldEZpbGxQb2ludCwJTUVUSF9WQVJBUkdTLAlhbHBfR2V0RmlsbFBvaW50X19kb2NfX30sCi0JeyJHZXRGcmFtZU51bWJlciIsCShQeUNGdW5jdGlvbilhbHBfR2V0RnJhbWVOdW1iZXIsCU1FVEhfVkFSQVJHUywJYWxwX0dldEZyYW1lTnVtYmVyX19kb2NfX30sCi0JeyJHZXRGcmFtZVRpbWUiLAkoUHlDRnVuY3Rpb24pYWxwX0dldEZyYW1lVGltZSwJTUVUSF9WQVJBUkdTLAlhbHBfR2V0RnJhbWVUaW1lX19kb2NfX30sCi0JeyJXcml0ZUZyYW1lcyIsCShQeUNGdW5jdGlvbilhbHBfV3JpdGVGcmFtZXMsCU1FVEhfVkFSQVJHUywJYWxwX1dyaXRlRnJhbWVzX19kb2NfX30sCi0JeyJDbG9zZVBvcnQiLAkoUHlDRnVuY3Rpb24pYWxwX0Nsb3NlUG9ydCwJTUVUSF9WQVJBUkdTLAlhbHBfQ2xvc2VQb3J0X19kb2NfX30sCisjaWZkZWYgQUxfTk9fRUxFTSAgICAgICAgICAgICAgIC8qIElSSVggNiAqLworICAgIHsiU2V0Q29uZmlnIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9TZXRDb25maWcsICAgICBNRVRIX1ZBUkFSR1MsICAgYWxwX1NldENvbmZpZ19fZG9jX199LAorICAgIHsiR2V0Q29uZmlnIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9HZXRDb25maWcsICAgICBNRVRIX1ZBUkFSR1MsICAgYWxwX0dldENvbmZpZ19fZG9jX199LAorICAgIHsiR2V0UmVzb3VyY2UiLCAgICAgKFB5Q0Z1bmN0aW9uKWFscF9HZXRSZXNvdXJjZSwgICBNRVRIX1ZBUkFSR1MsICAgYWxwX0dldFJlc291cmNlX19kb2NfX30sCisgICAgeyJHZXRGRCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX0dldEZELCBNRVRIX1ZBUkFSR1MsICAgYWxwX0dldEZEX19kb2NfX30sCisgICAgeyJHZXRGaWxsZWQiLCAgICAgICAoUHlDRnVuY3Rpb24pYWxwX0dldEZpbGxlZCwgICAgIE1FVEhfVkFSQVJHUywgICBhbHBfR2V0RmlsbGVkX19kb2NfX30sCisgICAgeyJHZXRGaWxsYWJsZSIsICAgICAoUHlDRnVuY3Rpb24pYWxwX0dldEZpbGxhYmxlLCAgIE1FVEhfVkFSQVJHUywgICBhbHBfR2V0RmlsbGFibGVfX2RvY19ffSwKKyAgICB7IlJlYWRGcmFtZXMiLCAgICAgIChQeUNGdW5jdGlvbilhbHBfUmVhZEZyYW1lcywgICAgTUVUSF9WQVJBUkdTLCAgIGFscF9SZWFkRnJhbWVzX19kb2NfX30sCisgICAgeyJEaXNjYXJkRnJhbWVzIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfRGlzY2FyZEZyYW1lcywgTUVUSF9WQVJBUkdTLCAgIGFscF9EaXNjYXJkRnJhbWVzX19kb2NfX30sCisgICAgeyJaZXJvRnJhbWVzIiwgICAgICAoUHlDRnVuY3Rpb24pYWxwX1plcm9GcmFtZXMsICAgIE1FVEhfVkFSQVJHUywgICBhbHBfWmVyb0ZyYW1lc19fZG9jX199LAorICAgIHsiU2V0RmlsbFBvaW50IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX1NldEZpbGxQb2ludCwgIE1FVEhfVkFSQVJHUywgICBhbHBfU2V0RmlsbFBvaW50X19kb2NfX30sCisgICAgeyJHZXRGaWxsUG9pbnQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfR2V0RmlsbFBvaW50LCAgTUVUSF9WQVJBUkdTLCAgIGFscF9HZXRGaWxsUG9pbnRfX2RvY19ffSwKKyAgICB7IkdldEZyYW1lTnVtYmVyIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9HZXRGcmFtZU51bWJlciwgICAgICAgIE1FVEhfVkFSQVJHUywgICBhbHBfR2V0RnJhbWVOdW1iZXJfX2RvY19ffSwKKyAgICB7IkdldEZyYW1lVGltZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9HZXRGcmFtZVRpbWUsICBNRVRIX1ZBUkFSR1MsICAgYWxwX0dldEZyYW1lVGltZV9fZG9jX199LAorICAgIHsiV3JpdGVGcmFtZXMiLCAgICAgKFB5Q0Z1bmN0aW9uKWFscF9Xcml0ZUZyYW1lcywgICBNRVRIX1ZBUkFSR1MsICAgYWxwX1dyaXRlRnJhbWVzX19kb2NfX30sCisgICAgeyJDbG9zZVBvcnQiLCAgICAgICAoUHlDRnVuY3Rpb24pYWxwX0Nsb3NlUG9ydCwgICAgIE1FVEhfVkFSQVJHUywgICBhbHBfQ2xvc2VQb3J0X19kb2NfX30sCiAjZW5kaWYgLyogQUxfTk9fRUxFTSAqLwogI2lmZGVmIE9MRF9JTlRFUkZBQ0UKLQl7ImNsb3NlcG9ydCIsCQkoUHlDRnVuY3Rpb24pYWxwX2Nsb3NlcG9ydCwJTUVUSF9WQVJBUkdTfSwKLQl7ImdldGZkIiwJCShQeUNGdW5jdGlvbilhbHBfZ2V0ZmQsCU1FVEhfVkFSQVJHU30sCi0gICAgICAgIHsiZmlsZW5vIiwJCShQeUNGdW5jdGlvbilhbHBfZ2V0ZmQsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRmaWxsZWQiLAkJKFB5Q0Z1bmN0aW9uKWFscF9nZXRmaWxsZWQsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRmaWxsYWJsZSIsCQkoUHlDRnVuY3Rpb24pYWxwX2dldGZpbGxhYmxlLAlNRVRIX1ZBUkFSR1N9LAotCXsicmVhZHNhbXBzIiwJCShQeUNGdW5jdGlvbilhbHBfcmVhZHNhbXBzLAlNRVRIX1ZBUkFSR1N9LAotCXsid3JpdGVzYW1wcyIsCQkoUHlDRnVuY3Rpb24pYWxwX3dyaXRlc2FtcHMsCU1FVEhfVkFSQVJHU30sCi0JeyJzZXRmaWxscG9pbnQiLAkoUHlDRnVuY3Rpb24pYWxwX3NldGZpbGxwb2ludCwJTUVUSF9WQVJBUkdTfSwKLQl7ImdldGZpbGxwb2ludCIsCShQeUNGdW5jdGlvbilhbHBfZ2V0ZmlsbHBvaW50LAlNRVRIX1ZBUkFSR1N9LAotCXsic2V0Y29uZmlnIiwJCShQeUNGdW5jdGlvbilhbHBfc2V0Y29uZmlnLAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0Y29uZmlnIiwJCShQeUNGdW5jdGlvbilhbHBfZ2V0Y29uZmlnLAlNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2xvc2Vwb3J0IiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX2Nsb3NlcG9ydCwgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRmZCIsICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfZ2V0ZmQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJmaWxlbm8iLCAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfZ2V0ZmQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRmaWxsZWQiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfZ2V0ZmlsbGVkLCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGZpbGxhYmxlIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9nZXRmaWxsYWJsZSwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicmVhZHNhbXBzIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX3JlYWRzYW1wcywgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ3cml0ZXNhbXBzIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfd3JpdGVzYW1wcywgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldGZpbGxwb2ludCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9zZXRmaWxscG9pbnQsICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0ZmlsbHBvaW50IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxwX2dldGZpbGxwb2ludCwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRjb25maWciLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfc2V0Y29uZmlnLCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGNvbmZpZyIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFscF9nZXRjb25maWcsICAgICBNRVRIX1ZBUkFSR1N9LAogI2lmZGVmIEFMXzQwNQotCXsiZ2V0c3RhdHVzIiwJCShQeUNGdW5jdGlvbilhbHBfZ2V0c3RhdHVzLAlNRVRIX1ZBUkFSR1N9LAotI2VuZGlmIC8qIEFMXzQwNSAqLwkgICAgCisgICAgeyJnZXRzdGF0dXMiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbHBfZ2V0c3RhdHVzLCAgICAgTUVUSF9WQVJBUkdTfSwKKyNlbmRpZiAvKiBBTF80MDUgKi8KICNlbmRpZiAvKiBPTERfSU5URVJGQUNFICovCi0gCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiAtLS0tLS0tLS0tICovCkBAIC0xMjUyLDc0ICsxMjUyLDc0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmV3YWxwb2JqZWN0KEFMcG9ydCBwb3J0KQogewotCWFscG9iamVjdCAqc2VsZjsKLQkKLQlzZWxmID0gUHlPYmplY3RfTmV3KGFscG9iamVjdCwgJkFscHR5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCS8qIFhYWFggQWRkIHlvdXIgb3duIGluaXRpYWxpemVycyBoZXJlICovCi0Jc2VsZi0+cG9ydCA9IHBvcnQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOworICAgIGFscG9iamVjdCAqc2VsZjsKKworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoYWxwb2JqZWN0LCAmQWxwdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBBZGQgeW91ciBvd24gaW5pdGlhbGl6ZXJzIGhlcmUgKi8KKyAgICBzZWxmLT5wb3J0ID0gcG9ydDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHNlbGY7CiB9CiAKIAogc3RhdGljIHZvaWQKIGFscF9kZWFsbG9jKGFscG9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIEFkZCB5b3VyIG93biBjbGVhbnVwIGNvZGUgaGVyZSAqLwotCWlmIChzZWxmLT5wb3J0KSB7Ci0jaWZkZWYgQUxfTk9fRUxFTQkJLyogSVJJWCA2ICovCi0JCWFsQ2xvc2VQb3J0KHNlbGYtPnBvcnQpOworICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIGNsZWFudXAgY29kZSBoZXJlICovCisgICAgaWYgKHNlbGYtPnBvcnQpIHsKKyNpZmRlZiBBTF9OT19FTEVNICAgICAgICAgICAgICAgLyogSVJJWCA2ICovCisgICAgICAgIGFsQ2xvc2VQb3J0KHNlbGYtPnBvcnQpOwogI2Vsc2UKLQkJQUxjbG9zZXBvcnQoc2VsZi0+cG9ydCk7CisgICAgICAgIEFMY2xvc2Vwb3J0KHNlbGYtPnBvcnQpOwogI2VuZGlmCi0JfQotCVB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICB9CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxwX2dldGF0dHIoYWxwb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCS8qIFhYWFggQWRkIHlvdXIgb3duIGdldGF0dHIgY29kZSBoZXJlICovCi0JaWYgKHNlbGYtPnBvcnQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJwb3J0IGFscmVhZHkgY2xvc2VkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfRmluZE1ldGhvZChhbHBfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgLyogWFhYWCBBZGQgeW91ciBvd24gZ2V0YXR0ciBjb2RlIGhlcmUgKi8KKyAgICBpZiAoc2VsZi0+cG9ydCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgInBvcnQgYWxyZWFkeSBjbG9zZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGFscF9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogUHlEb2NfU1RSVkFSKEFscHR5cGVfX2RvY19fLCAiIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQWxwdHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJCS8qb2Jfc2l6ZSovCi0JImFsLnBvcnQiLAkJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGFscG9iamVjdCksCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWFscF9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCShwcmludGZ1bmMpMCwJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylhbHBfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3N0ciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJhbC5wb3J0IiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKGFscG9iamVjdCksICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilhbHBfZGVhbGxvYywgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIChwcmludGZ1bmMpMCwgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpYWxwX2dldGF0dHIsICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAKLQkvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCTBMLDBMLDBMLDBMLAotCUFscHR5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCisgICAgLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgICAwTCwwTCwwTCwwTCwKKyAgICBBbHB0eXBlX19kb2NfXyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLwogfTsKIAogLyogRW5kIG9mIGNvZGUgZm9yIHBvcnQgb2JqZWN0cyAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogCi0jaWZkZWYgQUxfTk9fRUxFTQkJLyogSVJJWCA2ICovCisjaWZkZWYgQUxfTk9fRUxFTSAgICAgICAgICAgICAgIC8qIElSSVggNiAqLwogCiBQeURvY19TVFJWQVIoYWxfTmV3Q29uZmlnX19kb2NfXywKICJhbE5ld0NvbmZpZzogY3JlYXRlIGFuZCBpbml0aWFsaXplIGFuIGF1ZGlvIEFMY29uZmlnIHN0cnVjdHVyZS4iKTsKQEAgLTEzMjcsMTMgKzEzMjcsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9OZXdDb25maWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUFMY29uZmlnIGNvbmZpZzsKKyAgICBBTGNvbmZpZyBjb25maWc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpOZXdDb25maWciKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChjb25maWcgPSBhbE5ld0NvbmZpZygpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbmV3YWxjb2JqZWN0KGNvbmZpZyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6TmV3Q29uZmlnIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoY29uZmlnID0gYWxOZXdDb25maWcoKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG5ld2FsY29iamVjdChjb25maWcpOwogfQogCiBQeURvY19TVFJWQVIoYWxfT3BlblBvcnRfX2RvY19fLApAQCAtMTM0MiwxNSArMTM0MiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX09wZW5Qb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlBTHBvcnQgcG9ydDsKLQljaGFyICpuYW1lLCAqZGlyOwotCWFsY29iamVjdCAqY29uZmlnID0gTlVMTDsKKyAgICBBTHBvcnQgcG9ydDsKKyAgICBjaGFyICpuYW1lLCAqZGlyOworICAgIGFsY29iamVjdCAqY29uZmlnID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3N8TyE6T3BlblBvcnQiLCAmbmFtZSwgJmRpciwgJkFsY3R5cGUsICZjb25maWcpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHBvcnQgPSBhbE9wZW5Qb3J0KG5hbWUsIGRpciwgY29uZmlnID8gY29uZmlnLT5jb25maWcgOiBOVUxMKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG5ld2FscG9iamVjdChwb3J0KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzfE8hOk9wZW5Qb3J0IiwgJm5hbWUsICZkaXIsICZBbGN0eXBlLCAmY29uZmlnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChwb3J0ID0gYWxPcGVuUG9ydChuYW1lLCBkaXIsIGNvbmZpZyA/IGNvbmZpZy0+Y29uZmlnIDogTlVMTCkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBuZXdhbHBvYmplY3QocG9ydCk7CiB9CiAKIFB5RG9jX1NUUlZBUihhbF9Db25uZWN0X19kb2NfXywKQEAgLTEzNTksMzcgKzEzNTksMzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9Db25uZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc291cmNlLCBkZXN0LCBucHJvcHMgPSAwLCBpZCwgaTsKLQlBTHB2ICpwcm9wcyA9IE5VTEw7Ci0JQUxwYXJhbUluZm8gKnByb3BpbmZvID0gTlVMTDsKLQlQeU9iamVjdCAqcHJvcG9iaiA9IE5VTEw7CisgICAgaW50IHNvdXJjZSwgZGVzdCwgbnByb3BzID0gMCwgaWQsIGk7CisgICAgQUxwdiAqcHJvcHMgPSBOVUxMOworICAgIEFMcGFyYW1JbmZvICpwcm9waW5mbyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnByb3BvYmogPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaXxPITpDb25uZWN0IiwgJnNvdXJjZSwgJmRlc3QsICZQeUxpc3RfVHlwZSwgJnByb3BvYmopKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocHJvcG9iaiAhPSBOVUxMKSB7Ci0JCW5wcm9wcyA9IHB5dGhvbjJwYXJhbXMoc291cmNlLCBkZXN0LCBwcm9wb2JqLCAmcHJvcHMsICZwcm9waW5mbyk7Ci0JCWlmIChucHJvcHMgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWl8TyE6Q29ubmVjdCIsICZzb3VyY2UsICZkZXN0LCAmUHlMaXN0X1R5cGUsICZwcm9wb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHByb3BvYmogIT0gTlVMTCkgeworICAgICAgICBucHJvcHMgPSBweXRob24ycGFyYW1zKHNvdXJjZSwgZGVzdCwgcHJvcG9iaiwgJnByb3BzLCAmcHJvcGluZm8pOworICAgICAgICBpZiAobnByb3BzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlkID0gYWxDb25uZWN0KHNvdXJjZSwgZGVzdCwgcHJvcHMsIG5wcm9wcyk7CisgICAgaWQgPSBhbENvbm5lY3Qoc291cmNlLCBkZXN0LCBwcm9wcywgbnByb3BzKTsKIAotCWlmIChwcm9wcykgewotCQlmb3IgKGkgPSAwOyBpIDwgbnByb3BzOyBpKyspIHsKLQkJCXN3aXRjaCAocHJvcGluZm9baV0udmFsdWVUeXBlKSB7Ci0JCQljYXNlIEFMX1NFVF9WQUw6Ci0JCQljYXNlIEFMX1ZFQ1RPUl9WQUw6Ci0JCQkJUHlNZW1fREVMKHByb3BzW2ldLnZhbHVlLnB0cik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJUHlNZW1fREVMKHByb3BzKTsKLQkJUHlNZW1fREVMKHByb3BpbmZvKTsKLQl9CisgICAgaWYgKHByb3BzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucHJvcHM7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChwcm9waW5mb1tpXS52YWx1ZVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUxfU0VUX1ZBTDoKKyAgICAgICAgICAgIGNhc2UgQUxfVkVDVE9SX1ZBTDoKKyAgICAgICAgICAgICAgICBQeU1lbV9ERUwocHJvcHNbaV0udmFsdWUucHRyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeU1lbV9ERUwocHJvcHMpOworICAgICAgICBQeU1lbV9ERUwocHJvcGluZm8pOworICAgIH0KIAotCWlmIChpZCA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgaWQpOworICAgIGlmIChpZCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgaWQpOwogfQogCiBQeURvY19TVFJWQVIoYWxfRGlzY29ubmVjdF9fZG9jX18sCkBAIC0xMzk4LDE0ICsxMzk4LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfRGlzY29ubmVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJlczsKKyAgICBpbnQgcmVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkRpc2Nvbm5lY3QiLCAmcmVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFsRGlzY29ubmVjdChyZXMpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpEaXNjb25uZWN0IiwgJnJlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhbERpc2Nvbm5lY3QocmVzKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsX0dldFBhcmFtc19fZG9jX18sCkBAIC0xNDE0LDE0MyArMTQxNCwxNDMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9HZXRQYXJhbXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXNvdXJjZTsKLQlQeU9iamVjdCAqcHZzbGlzdCwgKml0ZW0gPSBOVUxMLCAqdiA9IE5VTEw7Ci0JQUxwdiAqcHZzOwotCWludCBpLCBqLCBucHZzOwotCUFMcGFyYW1JbmZvICpwaW5mbzsKKyAgICBpbnQgcmVzb3VyY2U7CisgICAgUHlPYmplY3QgKnB2c2xpc3QsICppdGVtID0gTlVMTCwgKnYgPSBOVUxMOworICAgIEFMcHYgKnB2czsKKyAgICBpbnQgaSwgaiwgbnB2czsKKyAgICBBTHBhcmFtSW5mbyAqcGluZm87CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPITpHZXRQYXJhbXMiLCAmcmVzb3VyY2UsICZQeUxpc3RfVHlwZSwgJnB2c2xpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlucHZzID0gUHlMaXN0X1NpemUocHZzbGlzdCk7Ci0JcHZzID0gUHlNZW1fTkVXKEFMcHYsIG5wdnMpOwotCXBpbmZvID0gUHlNZW1fTkVXKEFMcGFyYW1JbmZvLCBucHZzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnB2czsgaSsrKSB7Ci0JCWl0ZW0gPSBQeUxpc3RfR2V0SXRlbShwdnNsaXN0LCBpKTsKLQkJaWYgKCFQeUludF9DaGVjayhpdGVtKSkgewotCQkJaXRlbSA9IE5VTEw7Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJsaXN0IG9mIGludGVnZXJzIGV4cGVjdGVkIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCXB2c1tpXS5wYXJhbSA9IChpbnQpIFB5SW50X0FzTG9uZyhpdGVtKTsKLQkJaXRlbSA9IE5VTEw7CS8qIG5vdCBuZWVkZWQgYW55bW9yZSAqLwotCQlpZiAoYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UsIHB2c1tpXS5wYXJhbSwgJnBpbmZvW2ldKSA8IDApCi0JCQlnb3RvIGVycm9yOwotCQlzd2l0Y2ggKHBpbmZvW2ldLnZhbHVlVHlwZSkgewotCQljYXNlIEFMX05PX1ZBTDoKLQkJCWJyZWFrOwotCQljYXNlIEFMX01BVFJJWF9WQUw6Ci0JCQlwaW5mb1tpXS5tYXhFbGVtcyAqPSBwaW5mb1tpXS5tYXhFbGVtczI7Ci0JCQkvKiBmYWxsIHRocm91Z2ggKi8KLQkJY2FzZSBBTF9TVFJJTkdfVkFMOgotCQljYXNlIEFMX1NFVF9WQUw6Ci0JCWNhc2UgQUxfVkVDVE9SX1ZBTDoKLQkJCXN3aXRjaCAocGluZm9baV0uZWxlbWVudFR5cGUpIHsKLQkJCWNhc2UgQUxfSU5UMzJfRUxFTToKLQkJCWNhc2UgQUxfUkVTT1VSQ0VfRUxFTToKLQkJCWNhc2UgQUxfRU5VTV9FTEVNOgotCQkJCXB2c1tpXS52YWx1ZS5wdHIgPSBQeU1lbV9ORVcoaW50LCBwaW5mb1tpXS5tYXhFbGVtcyk7Ci0JCQkJcHZzW2ldLnNpemVJbiA9IHBpbmZvW2ldLm1heEVsZW1zOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBTF9JTlQ2NF9FTEVNOgotCQkJY2FzZSBBTF9GSVhFRF9FTEVNOgotCQkJCXB2c1tpXS52YWx1ZS5wdHIgPSBQeU1lbV9ORVcobG9uZyBsb25nLCBwaW5mb1tpXS5tYXhFbGVtcyk7Ci0JCQkJcHZzW2ldLnNpemVJbiA9IHBpbmZvW2ldLm1heEVsZW1zOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBTF9DSEFSX0VMRU06Ci0JCQkJcHZzW2ldLnZhbHVlLnB0ciA9IFB5TWVtX05FVyhjaGFyLCAzMik7Ci0JCQkJcHZzW2ldLnNpemVJbiA9IDMyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBTF9OT19FTEVNOgotCQkJY2FzZSBBTF9QVFJfRUxFTToKLQkJCWRlZmF1bHQ6Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiaW50ZXJuYWwgZXJyb3IiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgQUxfU0NBTEFSX1ZBTDoKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiaW50ZXJuYWwgZXJyb3IiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJaWYgKHBpbmZvW2ldLnZhbHVlVHlwZSA9PSBBTF9NQVRSSVhfVkFMKSB7Ci0JCQlwaW5mb1tpXS5tYXhFbGVtcyAvPSBwaW5mb1tpXS5tYXhFbGVtczI7Ci0JCQlwdnNbaV0uc2l6ZUluIC89IHBpbmZvW2ldLm1heEVsZW1zMjsKLQkJCXB2c1tpXS5zaXplMkluID0gcGluZm9baV0ubWF4RWxlbXMyOwotCQl9Ci0JfQotCWlmIChhbEdldFBhcmFtcyhyZXNvdXJjZSwgcHZzLCBucHZzKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JaWYgKCEodiA9IFB5TGlzdF9OZXcobnB2cykpKQotCQlnb3RvIGVycm9yOwotCWZvciAoaSA9IDA7IGkgPCBucHZzOyBpKyspIHsKLQkJaWYgKHB2c1tpXS5zaXplT3V0IDwgMCkgewotCQkJY2hhciBidWZbMzJdOwotCQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJCSAgICAgICJwcm9ibGVtIHdpdGggcGFyYW0gJWQiLCBpKTsKLQkJCVB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgYnVmKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJc3dpdGNoIChwaW5mb1tpXS52YWx1ZVR5cGUpIHsKLQkJY2FzZSBBTF9OT19WQUw6Ci0JCQlpdGVtID0gUHlfTm9uZTsKLQkJCVB5X0lOQ1JFRihpdGVtKTsKLQkJCWJyZWFrOwotCQljYXNlIEFMX1NUUklOR19WQUw6Ci0JCQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwdnNbaV0udmFsdWUucHRyKTsKLQkJCVB5TWVtX0RFTChwdnNbaV0udmFsdWUucHRyKTsKLQkJCWJyZWFrOwotCQljYXNlIEFMX01BVFJJWF9WQUw6Ci0JCQkvKiBYWFhYIHRoaXMgaXMgbm90IHJpZ2h0ICovCi0JCQlwdnNbaV0uc2l6ZU91dCAqPSBwdnNbaV0uc2l6ZTJPdXQ7Ci0JCQkvKiBmYWxsIHRocm91Z2ggKi8KLQkJY2FzZSBBTF9TRVRfVkFMOgotCQljYXNlIEFMX1ZFQ1RPUl9WQUw6Ci0JCQlpdGVtID0gUHlMaXN0X05ldyhwdnNbaV0uc2l6ZU91dCk7Ci0JCQlmb3IgKGogPSAwOyBqIDwgcHZzW2ldLnNpemVPdXQ7IGorKykgewotCQkJCXN3aXRjaCAocGluZm9baV0uZWxlbWVudFR5cGUpIHsKLQkJCQljYXNlIEFMX0lOVDMyX0VMRU06Ci0JCQkJY2FzZSBBTF9SRVNPVVJDRV9FTEVNOgotCQkJCWNhc2UgQUxfRU5VTV9FTEVNOgotCQkJCQlQeUxpc3RfU2V0SXRlbShpdGVtLCBqLCBQeUludF9Gcm9tTG9uZygobG9uZykgKChpbnQgKikgcHZzW2ldLnZhbHVlLnB0cilbal0pKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBBTF9JTlQ2NF9FTEVNOgotCQkJCQlQeUxpc3RfU2V0SXRlbShpdGVtLCBqLCBQeUxvbmdfRnJvbUxvbmdMb25nKCgobG9uZyBsb25nICopIHB2c1tpXS52YWx1ZS5wdHIpW2pdKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQUxfRklYRURfRUxFTToKLQkJCQkJUHlMaXN0X1NldEl0ZW0oaXRlbSwgaiwgUHlGbG9hdF9Gcm9tRG91YmxlKGFsRml4ZWRUb0RvdWJsZSgoKGxvbmcgbG9uZyAqKSBwdnNbaV0udmFsdWUucHRyKVtqXSkpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiaW50ZXJuYWwgZXJyb3IiKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQl9Ci0JCQlQeU1lbV9ERUwocHZzW2ldLnZhbHVlLnB0cik7Ci0JCQlicmVhazsKLQkJY2FzZSBBTF9TQ0FMQVJfVkFMOgotCQkJaXRlbSA9IHBhcmFtMnB5dGhvbihyZXNvdXJjZSwgcHZzW2ldLnBhcmFtLCBwdnNbaV0udmFsdWUsICZwaW5mb1tpXSk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSB8fAotCQkgICAgUHlMaXN0X1NldEl0ZW0odiwgaSwgUHlfQnVpbGRWYWx1ZSgiKGlPKSIsIHB2c1tpXS5wYXJhbSwKLQkJCQkJCSAgICAgICBpdGVtKSkgPCAwIHx8Ci0JCSAgICBQeUVycl9PY2N1cnJlZCgpKQotCQkJZ290byBlcnJvcjsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KLQlQeU1lbV9ERUwocHZzKTsKLQlQeU1lbV9ERUwocGluZm8pOwotCXJldHVybiB2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU8hOkdldFBhcmFtcyIsICZyZXNvdXJjZSwgJlB5TGlzdF9UeXBlLCAmcHZzbGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5wdnMgPSBQeUxpc3RfU2l6ZShwdnNsaXN0KTsKKyAgICBwdnMgPSBQeU1lbV9ORVcoQUxwdiwgbnB2cyk7CisgICAgcGluZm8gPSBQeU1lbV9ORVcoQUxwYXJhbUluZm8sIG5wdnMpOworICAgIGZvciAoaSA9IDA7IGkgPCBucHZzOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IFB5TGlzdF9HZXRJdGVtKHB2c2xpc3QsIGkpOworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgICAgICBpdGVtID0gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImxpc3Qgb2YgaW50ZWdlcnMgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcHZzW2ldLnBhcmFtID0gKGludCkgUHlJbnRfQXNMb25nKGl0ZW0pOworICAgICAgICBpdGVtID0gTlVMTDsgICAgICAgICAgICAvKiBub3QgbmVlZGVkIGFueW1vcmUgKi8KKyAgICAgICAgaWYgKGFsR2V0UGFyYW1JbmZvKHJlc291cmNlLCBwdnNbaV0ucGFyYW0sICZwaW5mb1tpXSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgc3dpdGNoIChwaW5mb1tpXS52YWx1ZVR5cGUpIHsKKyAgICAgICAgY2FzZSBBTF9OT19WQUw6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBTF9NQVRSSVhfVkFMOgorICAgICAgICAgICAgcGluZm9baV0ubWF4RWxlbXMgKj0gcGluZm9baV0ubWF4RWxlbXMyOworICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgQUxfU1RSSU5HX1ZBTDoKKyAgICAgICAgY2FzZSBBTF9TRVRfVkFMOgorICAgICAgICBjYXNlIEFMX1ZFQ1RPUl9WQUw6CisgICAgICAgICAgICBzd2l0Y2ggKHBpbmZvW2ldLmVsZW1lbnRUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEFMX0lOVDMyX0VMRU06CisgICAgICAgICAgICBjYXNlIEFMX1JFU09VUkNFX0VMRU06CisgICAgICAgICAgICBjYXNlIEFMX0VOVU1fRUxFTToKKyAgICAgICAgICAgICAgICBwdnNbaV0udmFsdWUucHRyID0gUHlNZW1fTkVXKGludCwgcGluZm9baV0ubWF4RWxlbXMpOworICAgICAgICAgICAgICAgIHB2c1tpXS5zaXplSW4gPSBwaW5mb1tpXS5tYXhFbGVtczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUxfSU5UNjRfRUxFTToKKyAgICAgICAgICAgIGNhc2UgQUxfRklYRURfRUxFTToKKyAgICAgICAgICAgICAgICBwdnNbaV0udmFsdWUucHRyID0gUHlNZW1fTkVXKGxvbmcgbG9uZywgcGluZm9baV0ubWF4RWxlbXMpOworICAgICAgICAgICAgICAgIHB2c1tpXS5zaXplSW4gPSBwaW5mb1tpXS5tYXhFbGVtczsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUxfQ0hBUl9FTEVNOgorICAgICAgICAgICAgICAgIHB2c1tpXS52YWx1ZS5wdHIgPSBQeU1lbV9ORVcoY2hhciwgMzIpOworICAgICAgICAgICAgICAgIHB2c1tpXS5zaXplSW4gPSAzMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUxfTk9fRUxFTToKKyAgICAgICAgICAgIGNhc2UgQUxfUFRSX0VMRU06CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMX1NDQUxBUl9WQUw6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvck9iamVjdCwgImludGVybmFsIGVycm9yIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChwaW5mb1tpXS52YWx1ZVR5cGUgPT0gQUxfTUFUUklYX1ZBTCkgeworICAgICAgICAgICAgcGluZm9baV0ubWF4RWxlbXMgLz0gcGluZm9baV0ubWF4RWxlbXMyOworICAgICAgICAgICAgcHZzW2ldLnNpemVJbiAvPSBwaW5mb1tpXS5tYXhFbGVtczI7CisgICAgICAgICAgICBwdnNbaV0uc2l6ZTJJbiA9IHBpbmZvW2ldLm1heEVsZW1zMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYWxHZXRQYXJhbXMocmVzb3VyY2UsIHB2cywgbnB2cykgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmICghKHYgPSBQeUxpc3RfTmV3KG5wdnMpKSkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnB2czsgaSsrKSB7CisgICAgICAgIGlmIChwdnNbaV0uc2l6ZU91dCA8IDApIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzMyXTsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2JsZW0gd2l0aCBwYXJhbSAlZCIsIGkpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCBidWYpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHBpbmZvW2ldLnZhbHVlVHlwZSkgeworICAgICAgICBjYXNlIEFMX05PX1ZBTDoKKyAgICAgICAgICAgIGl0ZW0gPSBQeV9Ob25lOworICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxfU1RSSU5HX1ZBTDoKKyAgICAgICAgICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHB2c1tpXS52YWx1ZS5wdHIpOworICAgICAgICAgICAgUHlNZW1fREVMKHB2c1tpXS52YWx1ZS5wdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxfTUFUUklYX1ZBTDoKKyAgICAgICAgICAgIC8qIFhYWFggdGhpcyBpcyBub3QgcmlnaHQgKi8KKyAgICAgICAgICAgIHB2c1tpXS5zaXplT3V0ICo9IHB2c1tpXS5zaXplMk91dDsKKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIEFMX1NFVF9WQUw6CisgICAgICAgIGNhc2UgQUxfVkVDVE9SX1ZBTDoKKyAgICAgICAgICAgIGl0ZW0gPSBQeUxpc3RfTmV3KHB2c1tpXS5zaXplT3V0KTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwdnNbaV0uc2l6ZU91dDsgaisrKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwaW5mb1tpXS5lbGVtZW50VHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQUxfSU5UMzJfRUxFTToKKyAgICAgICAgICAgICAgICBjYXNlIEFMX1JFU09VUkNFX0VMRU06CisgICAgICAgICAgICAgICAgY2FzZSBBTF9FTlVNX0VMRU06CisgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGl0ZW0sIGosIFB5SW50X0Zyb21Mb25nKChsb25nKSAoKGludCAqKSBwdnNbaV0udmFsdWUucHRyKVtqXSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFMX0lOVDY0X0VMRU06CisgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGl0ZW0sIGosIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKChsb25nIGxvbmcgKikgcHZzW2ldLnZhbHVlLnB0cilbal0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBTF9GSVhFRF9FTEVNOgorICAgICAgICAgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShpdGVtLCBqLCBQeUZsb2F0X0Zyb21Eb3VibGUoYWxGaXhlZFRvRG91YmxlKCgobG9uZyBsb25nICopIHB2c1tpXS52YWx1ZS5wdHIpW2pdKSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJpbnRlcm5hbCBlcnJvciIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5TWVtX0RFTChwdnNbaV0udmFsdWUucHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMX1NDQUxBUl9WQUw6CisgICAgICAgICAgICBpdGVtID0gcGFyYW0ycHl0aG9uKHJlc291cmNlLCBwdnNbaV0ucGFyYW0sIHB2c1tpXS52YWx1ZSwgJnBpbmZvW2ldKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpIHx8CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbSh2LCBpLCBQeV9CdWlsZFZhbHVlKCIoaU8pIiwgcHZzW2ldLnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKSkgPCAwIHx8CisgICAgICAgICAgICBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICBQeU1lbV9ERUwocHZzKTsKKyAgICBQeU1lbV9ERUwocGluZm8pOworICAgIHJldHVybiB2OwogCiAgIGVycm9yOgotCVB5X1hERUNSRUYodik7Ci0JUHlfWERFQ1JFRihpdGVtKTsKLQlpZiAocHZzKQotCQlQeU1lbV9ERUwocHZzKTsKLQlpZiAocGluZm8pCi0JCVB5TWVtX0RFTChwaW5mbyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICBQeV9YREVDUkVGKGl0ZW0pOworICAgIGlmIChwdnMpCisgICAgICAgIFB5TWVtX0RFTChwdnMpOworICAgIGlmIChwaW5mbykKKyAgICAgICAgUHlNZW1fREVMKHBpbmZvKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGFsX1NldFBhcmFtc19fZG9jX18sCkBAIC0xNTU5LDQzICsxNTU5LDQzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfU2V0UGFyYW1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzb3VyY2U7Ci0JUHlPYmplY3QgKnB2c2xpc3Q7Ci0JQUxwdiAqcHZzOwotCUFMcGFyYW1JbmZvICpwaW5mbzsKLQlpbnQgbnB2cywgaTsKKyAgICBpbnQgcmVzb3VyY2U7CisgICAgUHlPYmplY3QgKnB2c2xpc3Q7CisgICAgQUxwdiAqcHZzOworICAgIEFMcGFyYW1JbmZvICpwaW5mbzsKKyAgICBpbnQgbnB2cywgaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU8hOlNldFBhcmFtcyIsICZyZXNvdXJjZSwgJlB5TGlzdF9UeXBlLCAmcHZzbGlzdCkpCi0JCXJldHVybiBOVUxMOwotCW5wdnMgPSBweXRob24ycGFyYW1zKHJlc291cmNlLCAtMSwgcHZzbGlzdCwgJnB2cywgJnBpbmZvKTsKLQlpZiAobnB2cyA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU8hOlNldFBhcmFtcyIsICZyZXNvdXJjZSwgJlB5TGlzdF9UeXBlLCAmcHZzbGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5wdnMgPSBweXRob24ycGFyYW1zKHJlc291cmNlLCAtMSwgcHZzbGlzdCwgJnB2cywgJnBpbmZvKTsKKyAgICBpZiAobnB2cyA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGFsU2V0UGFyYW1zKHJlc291cmNlLCBwdnMsIG5wdnMpIDwgMCkKLQkJZ290byBlcnJvcjsKKyAgICBpZiAoYWxTZXRQYXJhbXMocmVzb3VyY2UsIHB2cywgbnB2cykgPCAwKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JLyogY2xlYW51cCAqLwotCWZvciAoaSA9IDA7IGkgPCBucHZzOyBpKyspIHsKLQkJc3dpdGNoIChwaW5mb1tpXS52YWx1ZVR5cGUpIHsKLQkJY2FzZSBBTF9TRVRfVkFMOgotCQljYXNlIEFMX1ZFQ1RPUl9WQUw6Ci0JCQlQeU1lbV9ERUwocHZzW2ldLnZhbHVlLnB0cik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlQeU1lbV9ERUwocHZzKTsKLQlQeU1lbV9ERUwocGluZm8pOworICAgIC8qIGNsZWFudXAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnB2czsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAocGluZm9baV0udmFsdWVUeXBlKSB7CisgICAgICAgIGNhc2UgQUxfU0VUX1ZBTDoKKyAgICAgICAgY2FzZSBBTF9WRUNUT1JfVkFMOgorICAgICAgICAgICAgUHlNZW1fREVMKHB2c1tpXS52YWx1ZS5wdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlNZW1fREVMKHB2cyk7CisgICAgUHlNZW1fREVMKHBpbmZvKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiAKICAgZXJyb3I6Ci0JLyogWFhYWCB3ZSBzaG91bGQgY2xlYW4gdXAgZXZlcnl0aGluZyAqLwotCWlmIChwdnMpCi0JCVB5TWVtX0RFTChwdnMpOwotCWlmIChwaW5mbykKLQkJUHlNZW1fREVMKHBpbmZvKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIHdlIHNob3VsZCBjbGVhbiB1cCBldmVyeXRoaW5nICovCisgICAgaWYgKHB2cykKKyAgICAgICAgUHlNZW1fREVMKHB2cyk7CisgICAgaWYgKHBpbmZvKQorICAgICAgICBQeU1lbV9ERUwocGluZm8pOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoYWxfUXVlcnlWYWx1ZXNfX2RvY19fLApAQCAtMTYwNCw3OSArMTYwNCw3OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX1F1ZXJ5VmFsdWVzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzb3VyY2UsIHBhcmFtOwotCUFMdmFsdWUgKnJldHVybl9zZXQgPSBOVUxMOwotCWludCBzZXRzaXplID0gMzIsIHF1YWxzaXplID0gMCwgbnZhbHMsIGk7Ci0JQUxwdiAqcXVhbHMgPSBOVUxMOwotCUFMcGFyYW1JbmZvIHBpbmZvOwotCUFMcGFyYW1JbmZvICpxdWFsaW5mbyA9IE5VTEw7Ci0JUHlPYmplY3QgKnF1YWxvYmogPSBOVUxMOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMLCAqaXRlbTsKKyAgICBpbnQgcmVzb3VyY2UsIHBhcmFtOworICAgIEFMdmFsdWUgKnJldHVybl9zZXQgPSBOVUxMOworICAgIGludCBzZXRzaXplID0gMzIsIHF1YWxzaXplID0gMCwgbnZhbHMsIGk7CisgICAgQUxwdiAqcXVhbHMgPSBOVUxMOworICAgIEFMcGFyYW1JbmZvIHBpbmZvOworICAgIEFMcGFyYW1JbmZvICpxdWFsaW5mbyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnF1YWxvYmogPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMLCAqaXRlbTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWl8TyE6UXVlcnlWYWx1ZXMiLCAmcmVzb3VyY2UsICZwYXJhbSwKLQkJCSAgICAgICZQeUxpc3RfVHlwZSwgJnF1YWxvYmopKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocXVhbG9iaiAhPSBOVUxMKSB7Ci0JCXF1YWxzaXplID0gcHl0aG9uMnBhcmFtcyhyZXNvdXJjZSwgcGFyYW0sIHF1YWxvYmosICZxdWFscywgJnF1YWxpbmZvKTsKLQkJaWYgKHF1YWxzaXplIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlzZXRzaXplID0gMzI7Ci0JcmV0dXJuX3NldCA9IFB5TWVtX05FVyhBTHZhbHVlLCBzZXRzaXplKTsKLQlpZiAocmV0dXJuX3NldCA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gY2xlYW51cDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaXxPITpRdWVyeVZhbHVlcyIsICZyZXNvdXJjZSwgJnBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlMaXN0X1R5cGUsICZxdWFsb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHF1YWxvYmogIT0gTlVMTCkgeworICAgICAgICBxdWFsc2l6ZSA9IHB5dGhvbjJwYXJhbXMocmVzb3VyY2UsIHBhcmFtLCBxdWFsb2JqLCAmcXVhbHMsICZxdWFsaW5mbyk7CisgICAgICAgIGlmIChxdWFsc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2V0c2l6ZSA9IDMyOworICAgIHJldHVybl9zZXQgPSBQeU1lbV9ORVcoQUx2YWx1ZSwgc2V0c2l6ZSk7CisgICAgaWYgKHJldHVybl9zZXQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCiAgIHJldHJ5OgotCW52YWxzID0gYWxRdWVyeVZhbHVlcyhyZXNvdXJjZSwgcGFyYW0sIHJldHVybl9zZXQsIHNldHNpemUsIHF1YWxzLCBxdWFsc2l6ZSk7Ci0JaWYgKG52YWxzIDwgMCkKLQkJZ290byBjbGVhbnVwOwotCWlmIChudmFscyA+IHNldHNpemUpIHsKLQkJQUx2YWx1ZSAqb2xkX3JldHVybl9zZXQgPSByZXR1cm5fc2V0OwotCQlzZXRzaXplID0gbnZhbHM7Ci0JCVB5TWVtX1JFU0laRShyZXR1cm5fc2V0LCBBTHZhbHVlLCBzZXRzaXplKTsKLQkJaWYgKHJldHVybl9zZXQgPT0gTlVMTCkgewotCQkJcmV0dXJuX3NldCA9IG9sZF9yZXR1cm5fc2V0OwotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQlnb3RvIHJldHJ5OwotCX0KKyAgICBudmFscyA9IGFsUXVlcnlWYWx1ZXMocmVzb3VyY2UsIHBhcmFtLCByZXR1cm5fc2V0LCBzZXRzaXplLCBxdWFscywgcXVhbHNpemUpOworICAgIGlmIChudmFscyA8IDApCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBpZiAobnZhbHMgPiBzZXRzaXplKSB7CisgICAgICAgIEFMdmFsdWUgKm9sZF9yZXR1cm5fc2V0ID0gcmV0dXJuX3NldDsKKyAgICAgICAgc2V0c2l6ZSA9IG52YWxzOworICAgICAgICBQeU1lbV9SRVNJWkUocmV0dXJuX3NldCwgQUx2YWx1ZSwgc2V0c2l6ZSk7CisgICAgICAgIGlmIChyZXR1cm5fc2V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybl9zZXQgPSBvbGRfcmV0dXJuX3NldDsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICAgICAgZ290byByZXRyeTsKKyAgICB9CiAKLQlpZiAoYWxHZXRQYXJhbUluZm8ocmVzb3VyY2UsIHBhcmFtLCAmcGluZm8pIDwgMCkKLQkJZ290byBjbGVhbnVwOworICAgIGlmIChhbEdldFBhcmFtSW5mbyhyZXNvdXJjZSwgcGFyYW0sICZwaW5mbykgPCAwKQorICAgICAgICBnb3RvIGNsZWFudXA7CiAKLQlyZXMgPSBQeUxpc3RfTmV3KG52YWxzKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCWdvdG8gY2xlYW51cDsKLQlmb3IgKGkgPSAwOyBpIDwgbnZhbHM7IGkrKykgewotCQlpdGVtID0gcGFyYW0ycHl0aG9uKHJlc291cmNlLCBwYXJhbSwgcmV0dXJuX3NldFtpXSwgJnBpbmZvKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCB8fAotCQkgICAgUHlMaXN0X1NldEl0ZW0ocmVzLCBpLCBpdGVtKSA8IDApIHsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJcmVzID0gTlVMTDsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCX0KKyAgICByZXMgPSBQeUxpc3RfTmV3KG52YWxzKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnZhbHM7IGkrKykgeworICAgICAgICBpdGVtID0gcGFyYW0ycHl0aG9uKHJlc291cmNlLCBwYXJhbSwgcmV0dXJuX3NldFtpXSwgJnBpbmZvKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCB8fAorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0ocmVzLCBpLCBpdGVtKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmVzID0gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgIH0KIAogICBjbGVhbnVwOgotCWlmIChyZXR1cm5fc2V0KQotCQlQeU1lbV9ERUwocmV0dXJuX3NldCk7Ci0JaWYgKHF1YWxzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBxdWFsc2l6ZTsgaSsrKSB7Ci0JCQlzd2l0Y2ggKHF1YWxpbmZvW2ldLnZhbHVlVHlwZSkgewotCQkJY2FzZSBBTF9TRVRfVkFMOgotCQkJY2FzZSBBTF9WRUNUT1JfVkFMOgotCQkJCVB5TWVtX0RFTChxdWFsc1tpXS52YWx1ZS5wdHIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCVB5TWVtX0RFTChxdWFscyk7Ci0JCVB5TWVtX0RFTChxdWFsaW5mbyk7Ci0JfQorICAgIGlmIChyZXR1cm5fc2V0KQorICAgICAgICBQeU1lbV9ERUwocmV0dXJuX3NldCk7CisgICAgaWYgKHF1YWxzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBxdWFsc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHF1YWxpbmZvW2ldLnZhbHVlVHlwZSkgeworICAgICAgICAgICAgY2FzZSBBTF9TRVRfVkFMOgorICAgICAgICAgICAgY2FzZSBBTF9WRUNUT1JfVkFMOgorICAgICAgICAgICAgICAgIFB5TWVtX0RFTChxdWFsc1tpXS52YWx1ZS5wdHIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5TWVtX0RFTChxdWFscyk7CisgICAgICAgIFB5TWVtX0RFTChxdWFsaW5mbyk7CisgICAgfQogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiBQeURvY19TVFJWQVIoYWxfR2V0UGFyYW1JbmZvX19kb2NfXywKQEAgLTE2ODYsODEgKzE2ODYsODEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9HZXRQYXJhbUluZm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXMsIHBhcmFtOwotCUFMcGFyYW1JbmZvIHBpbmZvOwotCVB5T2JqZWN0ICp2LCAqaXRlbTsKKyAgICBpbnQgcmVzLCBwYXJhbTsKKyAgICBBTHBhcmFtSW5mbyBwaW5mbzsKKyAgICBQeU9iamVjdCAqdiwgKml0ZW07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOkdldFBhcmFtSW5mbyIsICZyZXMsICZwYXJhbSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChhbEdldFBhcmFtSW5mbyhyZXMsIHBhcmFtLCAmcGluZm8pIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JdiA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIXYpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6R2V0UGFyYW1JbmZvIiwgJnJlcywgJnBhcmFtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFsR2V0UGFyYW1JbmZvKHJlcywgcGFyYW0sICZwaW5mbykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2ID0gUHlEaWN0X05ldygpOworICAgIGlmICghdikgcmV0dXJuIE5VTEw7CiAKLQlpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLnJlc291cmNlKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAicmVzb3VyY2UiLCBpdGVtKTsKLQlQeV9ERUNSRUYoaXRlbSk7CisgICAgaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5yZXNvdXJjZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgInJlc291cmNlIiwgaXRlbSk7CisgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5wYXJhbSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgInBhcmFtIiwgaXRlbSk7Ci0JUHlfREVDUkVGKGl0ZW0pOworICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8ucGFyYW0pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJwYXJhbSIsIGl0ZW0pOworICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCWl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8udmFsdWVUeXBlKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAidmFsdWVUeXBlIiwgaXRlbSk7Ci0JUHlfREVDUkVGKGl0ZW0pOworICAgIGl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8udmFsdWVUeXBlKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAidmFsdWVUeXBlIiwgaXRlbSk7CisgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JaWYgKHBpbmZvLnZhbHVlVHlwZSAhPSBBTF9OT19WQUwgJiYgcGluZm8udmFsdWVUeXBlICE9IEFMX1NDQUxBUl9WQUwpIHsKLQkJLyogbXVsdGlwbGUgdmFsdWVzICovCi0JCWl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8ubWF4RWxlbXMpOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWF4RWxlbXMiLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOworICAgIGlmIChwaW5mby52YWx1ZVR5cGUgIT0gQUxfTk9fVkFMICYmIHBpbmZvLnZhbHVlVHlwZSAhPSBBTF9TQ0FMQVJfVkFMKSB7CisgICAgICAgIC8qIG11bHRpcGxlIHZhbHVlcyAqLworICAgICAgICBpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLm1heEVsZW1zKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1heEVsZW1zIiwgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCQlpZiAocGluZm8udmFsdWVUeXBlID09IEFMX01BVFJJWF9WQUwpIHsKLQkJCS8qIDIgZGltZW5zaW9uYWwgKi8KLQkJCWl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8ubWF4RWxlbXMyKTsKLQkJCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtYXhFbGVtczIiLCBpdGVtKTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJfQotCX0KKyAgICAgICAgaWYgKHBpbmZvLnZhbHVlVHlwZSA9PSBBTF9NQVRSSVhfVkFMKSB7CisgICAgICAgICAgICAvKiAyIGRpbWVuc2lvbmFsICovCisgICAgICAgICAgICBpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLm1heEVsZW1zMik7CisgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWF4RWxlbXMyIiwgaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpdGVtID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHBpbmZvLmVsZW1lbnRUeXBlKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAiZWxlbWVudFR5cGUiLCBpdGVtKTsKLQlQeV9ERUNSRUYoaXRlbSk7CisgICAgaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5lbGVtZW50VHlwZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgImVsZW1lbnRUeXBlIiwgaXRlbSk7CisgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocGluZm8ubmFtZSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm5hbWUiLCBpdGVtKTsKLQlQeV9ERUNSRUYoaXRlbSk7CisgICAgaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocGluZm8ubmFtZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm5hbWUiLCBpdGVtKTsKKyAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQlpdGVtID0gcGFyYW0ycHl0aG9uKHJlcywgcGFyYW0sIHBpbmZvLmluaXRpYWwsICZwaW5mbyk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgImluaXRpYWwiLCBpdGVtKTsKLQlQeV9ERUNSRUYoaXRlbSk7CisgICAgaXRlbSA9IHBhcmFtMnB5dGhvbihyZXMsIHBhcmFtLCBwaW5mby5pbml0aWFsLCAmcGluZm8pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJpbml0aWFsIiwgaXRlbSk7CisgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JaWYgKHBpbmZvLmVsZW1lbnRUeXBlICE9IEFMX0VOVU1fRUxFTSAmJgotCSAgICBwaW5mby5lbGVtZW50VHlwZSAhPSBBTF9SRVNPVVJDRV9FTEVNICYmCi0JICAgIHBpbmZvLmVsZW1lbnRUeXBlICE9IEFMX0NIQVJfRUxFTSkgewotCQkvKiByYW5nZSBwYXJhbSAqLwotCQlpdGVtID0gcGFyYW0ycHl0aG9uKHJlcywgcGFyYW0sIHBpbmZvLm1pbiwgJnBpbmZvKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1pbiIsIGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7CisgICAgaWYgKHBpbmZvLmVsZW1lbnRUeXBlICE9IEFMX0VOVU1fRUxFTSAmJgorICAgICAgICBwaW5mby5lbGVtZW50VHlwZSAhPSBBTF9SRVNPVVJDRV9FTEVNICYmCisgICAgICAgIHBpbmZvLmVsZW1lbnRUeXBlICE9IEFMX0NIQVJfRUxFTSkgeworICAgICAgICAvKiByYW5nZSBwYXJhbSAqLworICAgICAgICBpdGVtID0gcGFyYW0ycHl0aG9uKHJlcywgcGFyYW0sIHBpbmZvLm1pbiwgJnBpbmZvKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1pbiIsIGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQkJaXRlbSA9IHBhcmFtMnB5dGhvbihyZXMsIHBhcmFtLCBwaW5mby5tYXgsICZwaW5mbyk7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJtYXgiLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpdGVtID0gcGFyYW0ycHl0aG9uKHJlcywgcGFyYW0sIHBpbmZvLm1heCwgJnBpbmZvKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1heCIsIGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAKLQkJaXRlbSA9IHBhcmFtMnB5dGhvbihyZXMsIHBhcmFtLCBwaW5mby5taW5EZWx0YSwgJnBpbmZvKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1pbkRlbHRhIiwgaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaXRlbSA9IHBhcmFtMnB5dGhvbihyZXMsIHBhcmFtLCBwaW5mby5taW5EZWx0YSwgJnBpbmZvKTsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodiwgIm1pbkRlbHRhIiwgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKIAotCQlpdGVtID0gcGFyYW0ycHl0aG9uKHJlcywgcGFyYW0sIHBpbmZvLm1heERlbHRhLCAmcGluZm8pOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWF4RGVsdGEiLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpdGVtID0gcGFyYW0ycHl0aG9uKHJlcywgcGFyYW0sIHBpbmZvLm1heERlbHRhLCAmcGluZm8pOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAibWF4RGVsdGEiLCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogCi0JCWl0ZW0gPSBQeUludF9Gcm9tTG9uZygobG9uZykgcGluZm8uc3BlY2lhbFZhbHMpOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyh2LCAic3BlY2lhbFZhbHMiLCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KKyAgICAgICAgaXRlbSA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBwaW5mby5zcGVjaWFsVmFscyk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHYsICJzcGVjaWFsVmFscyIsIGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQogCi0JcmV0dXJuIHY7CisgICAgcmV0dXJuIHY7CiB9CiAKIFB5RG9jX1NUUlZBUihhbF9HZXRSZXNvdXJjZUJ5TmFtZV9fZG9jX18sCkBAIC0xNzY5LDE0ICsxNzY5LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfR2V0UmVzb3VyY2VCeU5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXMsIHN0YXJ0X3JlcywgdHlwZTsKLQljaGFyICpuYW1lOworICAgIGludCByZXMsIHN0YXJ0X3JlcywgdHlwZTsKKyAgICBjaGFyICpuYW1lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpc2k6R2V0UmVzb3VyY2VCeU5hbWUiLCAmc3RhcnRfcmVzLCAmbmFtZSwgJnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHJlcyA9IGFsR2V0UmVzb3VyY2VCeU5hbWUoc3RhcnRfcmVzLCBuYW1lLCB0eXBlKSkgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSByZXMpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXNpOkdldFJlc291cmNlQnlOYW1lIiwgJnN0YXJ0X3JlcywgJm5hbWUsICZ0eXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChyZXMgPSBhbEdldFJlc291cmNlQnlOYW1lKHN0YXJ0X3JlcywgbmFtZSwgdHlwZSkpID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcmVzKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsX0lzU3VidHlwZV9fZG9jX18sCkBAIC0xNzg1LDExICsxNzg1LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWxfSXNTdWJ0eXBlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgdHlwZSwgc3VidHlwZTsKKyAgICBpbnQgdHlwZSwgc3VidHlwZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6SXNTdWJ0eXBlIiwgJnR5cGUsICZzdWJ0eXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBhbElzU3VidHlwZSh0eXBlLCBzdWJ0eXBlKSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpJc1N1YnR5cGUiLCAmdHlwZSwgJnN1YnR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGFsSXNTdWJ0eXBlKHR5cGUsIHN1YnR5cGUpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsX1NldEVycm9ySGFuZGxlcl9fZG9jX18sICIiKTsKQEAgLTE3OTgsMTAgKzE3OTgsMTAgQEAKIGFsX1NldEVycm9ySGFuZGxlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpTZXRFcnJvckhhbmRsZXIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOlNldEVycm9ySGFuZGxlciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKICNlbmRpZiAvKiBBTF9OT19FTEVNICovCkBAIC0xODExLDE0NCArMTgxMSwxNDQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9vcGVucG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZSwgKmRpcjsKLQlBTHBvcnQgcG9ydDsKLQlhbGNvYmplY3QgKmNvbmZpZyA9IE5VTEw7CisgICAgY2hhciAqbmFtZSwgKmRpcjsKKyAgICBBTHBvcnQgcG9ydDsKKyAgICBhbGNvYmplY3QgKmNvbmZpZyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzfE8hOk9wZW5Qb3J0IiwgJm5hbWUsICZkaXIsICZBbGN0eXBlLCAmY29uZmlnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChwb3J0ID0gQUxvcGVucG9ydChuYW1lLCBkaXIsIGNvbmZpZyA/IGNvbmZpZy0+Y29uZmlnIDogTlVMTCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBuZXdhbHBvYmplY3QocG9ydCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xPITpPcGVuUG9ydCIsICZuYW1lLCAmZGlyLCAmQWxjdHlwZSwgJmNvbmZpZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgocG9ydCA9IEFMb3BlbnBvcnQobmFtZSwgZGlyLCBjb25maWcgPyBjb25maWctPmNvbmZpZyA6IE5VTEwpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gbmV3YWxwb2JqZWN0KHBvcnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxfbmV3Y29uZmlnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlBTGNvbmZpZyBjb25maWc7CisgICAgQUxjb25maWcgY29uZmlnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6TmV3Q29uZmlnIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoY29uZmlnID0gQUxuZXdjb25maWcgKCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBuZXdhbGNvYmplY3QoY29uZmlnKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpOZXdDb25maWciKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChjb25maWcgPSBBTG5ld2NvbmZpZyAoKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG5ld2FsY29iamVjdChjb25maWcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxfcXVlcnlwYXJhbXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgZGV2aWNlOwotCWxvbmcgbGVuZ3RoOwotCWxvbmcgKlBWYnVmZmVyOwotCWxvbmcgUFZkdW1teVsyXTsKLQlQeU9iamVjdCAqdiA9IE5VTEw7Ci0JaW50IGk7CisgICAgbG9uZyBkZXZpY2U7CisgICAgbG9uZyBsZW5ndGg7CisgICAgbG9uZyAqUFZidWZmZXI7CisgICAgbG9uZyBQVmR1bW15WzJdOworICAgIFB5T2JqZWN0ICp2ID0gTlVMTDsKKyAgICBpbnQgaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpxdWVyeXBhcmFtcyIsICZkZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGxlbmd0aCA9IEFMcXVlcnlwYXJhbXMoZGV2aWNlLCBQVmR1bW15LCAyTCkpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKFBWYnVmZmVyID0gUHlNZW1fTkVXKGxvbmcsIGxlbmd0aCkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmIChBTHF1ZXJ5cGFyYW1zKGRldmljZSwgUFZidWZmZXIsIGxlbmd0aCkgPj0gMCAmJgotCSAgICAodiA9IFB5TGlzdF9OZXcoKGludClsZW5ndGgpKSAhPSBOVUxMKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJCVB5TGlzdF9TZXRJdGVtKHYsIGksIFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKSk7Ci0JfQotCVB5TWVtX0RFTChQVmJ1ZmZlcik7Ci0JcmV0dXJuIHY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOnF1ZXJ5cGFyYW1zIiwgJmRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgobGVuZ3RoID0gQUxxdWVyeXBhcmFtcyhkZXZpY2UsIFBWZHVtbXksIDJMKSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoUFZidWZmZXIgPSBQeU1lbV9ORVcobG9uZywgbGVuZ3RoKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKEFMcXVlcnlwYXJhbXMoZGV2aWNlLCBQVmJ1ZmZlciwgbGVuZ3RoKSA+PSAwICYmCisgICAgICAgICh2ID0gUHlMaXN0X05ldygoaW50KWxlbmd0aCkpICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0odiwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKKyAgICB9CisgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRvUGFyYW1zKFB5T2JqZWN0ICphcmdzLCBpbnQgKCpmdW5jKShsb25nLCBsb25nICosIGxvbmcpLCBpbnQgbW9kaWZpZWQpCiB7Ci0JbG9uZyBkZXZpY2U7Ci0JUHlPYmplY3QgKmxpc3QsICp2OwotCWxvbmcgKlBWYnVmZmVyOwotCWxvbmcgbGVuZ3RoOwotCWludCBpOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibE8hIiwgJmRldmljZSwgJlB5TGlzdF9UeXBlLCAmbGlzdCkpCi0JCXJldHVybiBOVUxMOwotCWxlbmd0aCA9IFB5TGlzdF9TaXplKGxpc3QpOwotCVBWYnVmZmVyID0gUHlNZW1fTkVXKGxvbmcsIGxlbmd0aCk7Ci0JaWYgKFBWYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQl2ID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7Ci0JCWlmICghUHlJbnRfQ2hlY2sodikpIHsKLQkJCVB5TWVtX0RFTChQVmJ1ZmZlcik7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUFZidWZmZXJbaV0gPSBQeUludF9Bc0xvbmcodik7Ci0JfQorICAgIGxvbmcgZGV2aWNlOworICAgIFB5T2JqZWN0ICpsaXN0LCAqdjsKKyAgICBsb25nICpQVmJ1ZmZlcjsKKyAgICBsb25nIGxlbmd0aDsKKyAgICBpbnQgaTsKIAotCWlmICgoKmZ1bmMpKGRldmljZSwgUFZidWZmZXIsIGxlbmd0aCkgPT0gLTEpIHsKLQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibE8hIiwgJmRldmljZSwgJlB5TGlzdF9UeXBlLCAmbGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxlbmd0aCA9IFB5TGlzdF9TaXplKGxpc3QpOworICAgIFBWYnVmZmVyID0gUHlNZW1fTkVXKGxvbmcsIGxlbmd0aCk7CisgICAgaWYgKFBWYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICB2ID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7CisgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUFZidWZmZXJbaV0gPSBQeUludF9Bc0xvbmcodik7CisgICAgfQogCi0JaWYgKG1vZGlmaWVkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKSk7Ci0JfQorICAgIGlmICgoKmZ1bmMpKGRldmljZSwgUFZidWZmZXIsIGxlbmd0aCkgPT0gLTEpIHsKKyAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICBpZiAobW9kaWZpZWQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX2dldHBhcmFtcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvUGFyYW1zKGFyZ3MsIEFMZ2V0cGFyYW1zLCAxKTsKKyAgICByZXR1cm4gZG9QYXJhbXMoYXJncywgQUxnZXRwYXJhbXMsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWxfc2V0cGFyYW1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9QYXJhbXMoYXJncywgQUxzZXRwYXJhbXMsIDApOworICAgIHJldHVybiBkb1BhcmFtcyhhcmdzLCBBTHNldHBhcmFtcywgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9nZXRuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGRldmljZSwgZGVzY3JpcHRvcjsKLQljaGFyICpuYW1lOworICAgIGxvbmcgZGV2aWNlLCBkZXNjcmlwdG9yOworICAgIGNoYXIgKm5hbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsOmdldG5hbWUiLCAmZGV2aWNlLCAmZGVzY3JpcHRvcikpCi0JCXJldHVybiBOVUxMOwotCWlmICgobmFtZSA9IEFMZ2V0bmFtZShkZXZpY2UsIGRlc2NyaXB0b3IpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsOmdldG5hbWUiLCAmZGV2aWNlLCAmZGVzY3JpcHRvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgobmFtZSA9IEFMZ2V0bmFtZShkZXZpY2UsIGRlc2NyaXB0b3IpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFsX2dldGRlZmF1bHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgZGV2aWNlLCBkZXNjcmlwdG9yLCB2YWx1ZTsKKyAgICBsb25nIGRldmljZSwgZGVzY3JpcHRvciwgdmFsdWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsOmdldGRlZmF1bHQiLCAmZGV2aWNlLCAmZGVzY3JpcHRvcikpCi0JCXJldHVybiBOVUxMOwotCWlmICgodmFsdWUgPSBBTGdldGRlZmF1bHQoZGV2aWNlLCBkZXNjcmlwdG9yKSkgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6Z2V0ZGVmYXVsdCIsICZkZXZpY2UsICZkZXNjcmlwdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCh2YWx1ZSA9IEFMZ2V0ZGVmYXVsdChkZXZpY2UsIGRlc2NyaXB0b3IpKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhbF9nZXRtaW5tYXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgZGV2aWNlLCBkZXNjcmlwdG9yLCBtaW4sIG1heDsKKyAgICBsb25nIGRldmljZSwgZGVzY3JpcHRvciwgbWluLCBtYXg7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsOmdldG1pbm1heCIsICZkZXZpY2UsICZkZXNjcmlwdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWluID0gLTE7Ci0JbWF4ID0gLTE7Ci0JaWYgKEFMZ2V0bWlubWF4KGRldmljZSwgZGVzY3JpcHRvciwgJm1pbiwgJm1heCkgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIG1pbiwgbWF4KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsOmdldG1pbm1heCIsICZkZXZpY2UsICZkZXNjcmlwdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWluID0gLTE7CisgICAgbWF4ID0gLTE7CisgICAgaWYgKEFMZ2V0bWlubWF4KGRldmljZSwgZGVzY3JpcHRvciwgJm1pbiwgJm1heCkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIG1pbiwgbWF4KTsKIH0KIAogI2VuZGlmIC8qIE9MRF9JTlRFUkZBQ0UgKi8KQEAgLTE5NTYsMzQgKzE5NTYsMzQgQEAKIC8qIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBhbF9tZXRob2RzW10gPSB7Ci0jaWZkZWYgQUxfTk9fRUxFTQkJLyogSVJJWCA2ICovCi0JeyJOZXdDb25maWciLAkoUHlDRnVuY3Rpb24pYWxfTmV3Q29uZmlnLAlNRVRIX1ZBUkFSR1MsCWFsX05ld0NvbmZpZ19fZG9jX199LAotCXsiT3BlblBvcnQiLAkoUHlDRnVuY3Rpb24pYWxfT3BlblBvcnQsCU1FVEhfVkFSQVJHUywJYWxfT3BlblBvcnRfX2RvY19ffSwKLQl7IkNvbm5lY3QiLAkoUHlDRnVuY3Rpb24pYWxfQ29ubmVjdCwJTUVUSF9WQVJBUkdTLAlhbF9Db25uZWN0X19kb2NfX30sCi0JeyJEaXNjb25uZWN0IiwJKFB5Q0Z1bmN0aW9uKWFsX0Rpc2Nvbm5lY3QsCU1FVEhfVkFSQVJHUywJYWxfRGlzY29ubmVjdF9fZG9jX199LAotCXsiR2V0UGFyYW1zIiwJKFB5Q0Z1bmN0aW9uKWFsX0dldFBhcmFtcywJTUVUSF9WQVJBUkdTLAlhbF9HZXRQYXJhbXNfX2RvY19ffSwKLQl7IlNldFBhcmFtcyIsCShQeUNGdW5jdGlvbilhbF9TZXRQYXJhbXMsCU1FVEhfVkFSQVJHUywJYWxfU2V0UGFyYW1zX19kb2NfX30sCi0JeyJRdWVyeVZhbHVlcyIsCShQeUNGdW5jdGlvbilhbF9RdWVyeVZhbHVlcywJTUVUSF9WQVJBUkdTLAlhbF9RdWVyeVZhbHVlc19fZG9jX199LAotCXsiR2V0UGFyYW1JbmZvIiwJKFB5Q0Z1bmN0aW9uKWFsX0dldFBhcmFtSW5mbywJTUVUSF9WQVJBUkdTLAlhbF9HZXRQYXJhbUluZm9fX2RvY19ffSwKLQl7IkdldFJlc291cmNlQnlOYW1lIiwJKFB5Q0Z1bmN0aW9uKWFsX0dldFJlc291cmNlQnlOYW1lLAlNRVRIX1ZBUkFSR1MsCWFsX0dldFJlc291cmNlQnlOYW1lX19kb2NfX30sCi0JeyJJc1N1YnR5cGUiLAkoUHlDRnVuY3Rpb24pYWxfSXNTdWJ0eXBlLAlNRVRIX1ZBUkFSR1MsCWFsX0lzU3VidHlwZV9fZG9jX199LAorI2lmZGVmIEFMX05PX0VMRU0gICAgICAgICAgICAgICAvKiBJUklYIDYgKi8KKyAgICB7Ik5ld0NvbmZpZyIsICAgICAgIChQeUNGdW5jdGlvbilhbF9OZXdDb25maWcsICAgICAgTUVUSF9WQVJBUkdTLCAgIGFsX05ld0NvbmZpZ19fZG9jX199LAorICAgIHsiT3BlblBvcnQiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX09wZW5Qb3J0LCAgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxfT3BlblBvcnRfX2RvY19ffSwKKyAgICB7IkNvbm5lY3QiLCAgICAgICAgIChQeUNGdW5jdGlvbilhbF9Db25uZWN0LCAgICAgICAgTUVUSF9WQVJBUkdTLCAgIGFsX0Nvbm5lY3RfX2RvY19ffSwKKyAgICB7IkRpc2Nvbm5lY3QiLCAgICAgIChQeUNGdW5jdGlvbilhbF9EaXNjb25uZWN0LCAgICAgTUVUSF9WQVJBUkdTLCAgIGFsX0Rpc2Nvbm5lY3RfX2RvY19ffSwKKyAgICB7IkdldFBhcmFtcyIsICAgICAgIChQeUNGdW5jdGlvbilhbF9HZXRQYXJhbXMsICAgICAgTUVUSF9WQVJBUkdTLCAgIGFsX0dldFBhcmFtc19fZG9jX199LAorICAgIHsiU2V0UGFyYW1zIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX1NldFBhcmFtcywgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxfU2V0UGFyYW1zX19kb2NfX30sCisgICAgeyJRdWVyeVZhbHVlcyIsICAgICAoUHlDRnVuY3Rpb24pYWxfUXVlcnlWYWx1ZXMsICAgIE1FVEhfVkFSQVJHUywgICBhbF9RdWVyeVZhbHVlc19fZG9jX199LAorICAgIHsiR2V0UGFyYW1JbmZvIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfR2V0UGFyYW1JbmZvLCAgIE1FVEhfVkFSQVJHUywgICBhbF9HZXRQYXJhbUluZm9fX2RvY19ffSwKKyAgICB7IkdldFJlc291cmNlQnlOYW1lIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX0dldFJlc291cmNlQnlOYW1lLCAgICAgIE1FVEhfVkFSQVJHUywgICBhbF9HZXRSZXNvdXJjZUJ5TmFtZV9fZG9jX199LAorICAgIHsiSXNTdWJ0eXBlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX0lzU3VidHlwZSwgICAgICBNRVRIX1ZBUkFSR1MsICAgYWxfSXNTdWJ0eXBlX19kb2NfX30sCiAjaWYgMAotCS8qIHRoaXMgb25lIG5vdCBzdXBwb3J0ZWQgKi8KLQl7IlNldEVycm9ySGFuZGxlciIsCShQeUNGdW5jdGlvbilhbF9TZXRFcnJvckhhbmRsZXIsCU1FVEhfVkFSQVJHUywJYWxfU2V0RXJyb3JIYW5kbGVyX19kb2NfX30sCisgICAgLyogdGhpcyBvbmUgbm90IHN1cHBvcnRlZCAqLworICAgIHsiU2V0RXJyb3JIYW5kbGVyIiwgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfU2V0RXJyb3JIYW5kbGVyLCAgICAgICAgTUVUSF9WQVJBUkdTLCAgIGFsX1NldEVycm9ySGFuZGxlcl9fZG9jX199LAogI2VuZGlmCiAjZW5kaWYgLyogQUxfTk9fRUxFTSAqLwogI2lmZGVmIE9MRF9JTlRFUkZBQ0UKLQl7Im9wZW5wb3J0IiwJCShQeUNGdW5jdGlvbilhbF9vcGVucG9ydCwJTUVUSF9WQVJBUkdTfSwKLQl7Im5ld2NvbmZpZyIsCQkoUHlDRnVuY3Rpb24pYWxfbmV3Y29uZmlnLAlNRVRIX1ZBUkFSR1N9LAotCXsicXVlcnlwYXJhbXMiLAkJKFB5Q0Z1bmN0aW9uKWFsX3F1ZXJ5cGFyYW1zLAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0cGFyYW1zIiwJCShQeUNGdW5jdGlvbilhbF9nZXRwYXJhbXMsCU1FVEhfVkFSQVJHU30sCi0JeyJzZXRwYXJhbXMiLAkJKFB5Q0Z1bmN0aW9uKWFsX3NldHBhcmFtcywJTUVUSF9WQVJBUkdTfSwKLQl7ImdldG5hbWUiLAkJKFB5Q0Z1bmN0aW9uKWFsX2dldG5hbWUsCU1FVEhfVkFSQVJHU30sCi0JeyJnZXRkZWZhdWx0IiwJCShQeUNGdW5jdGlvbilhbF9nZXRkZWZhdWx0LAlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0bWlubWF4IiwJCShQeUNGdW5jdGlvbilhbF9nZXRtaW5tYXgsCU1FVEhfVkFSQVJHU30sCisgICAgeyJvcGVucG9ydCIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbF9vcGVucG9ydCwgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im5ld2NvbmZpZyIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX25ld2NvbmZpZywgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicXVlcnlwYXJhbXMiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfcXVlcnlwYXJhbXMsICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRwYXJhbXMiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbF9nZXRwYXJhbXMsICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldHBhcmFtcyIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX3NldHBhcmFtcywgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0bmFtZSIsICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYWxfZ2V0bmFtZSwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRkZWZhdWx0IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhbF9nZXRkZWZhdWx0LCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldG1pbm1heCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFsX2dldG1pbm1heCwgICAgICBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmIC8qIE9MRF9JTlRFUkZBQ0UgKi8KIAotCXtOVUxMLAkgKFB5Q0Z1bmN0aW9uKU5VTEwsIDAsIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0gICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0xOTk0LDEyMzkgKzE5OTQsMTIzOSBAQAogdm9pZAogaW5pdGFsKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqeDsKKyAgICBQeU9iamVjdCAqbSwgKmQsICp4OwogCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgYWwgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgotCSAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKLQkgICAgcmV0dXJuOwkKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBhbCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQorICAgICAgICByZXR1cm47CiAKLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLQltID0gUHlfSW5pdE1vZHVsZTQoImFsIiwgYWxfbWV0aG9kcywKLQkJYWxfbW9kdWxlX2RvY3VtZW50YXRpb24sCi0JCShQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoImFsIiwgYWxfbWV0aG9kcywKKyAgICAgICAgYWxfbW9kdWxlX2RvY3VtZW50YXRpb24sCisgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRXJyb3JPYmplY3QgPSBQeUVycl9OZXdFeGNlcHRpb24oImFsLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpOworICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgRXJyb3JPYmplY3QgPSBQeUVycl9OZXdFeGNlcHRpb24oImFsLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpOwogCi0JLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KKyAgICAvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLwogI2lmZGVmIEFMXzRDSEFOTkVMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfNENIQU5ORUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPVVJDSEFOTkVMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF80Q0hBTk5FTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9VUkNIQU5ORUwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQURBVF9JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQURBVF9JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBREFUX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FEQVRfSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQURBVF9JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0FEQVRfTUNMS19UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQURBVF9NQ0xLX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFEQVRfTUNMS19UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BREFUX01DTEtfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQURBVF9NQ0xLX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQUVTX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BRVNfSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUVTX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FFU19JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBRVNfSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9BRVNfTUNMS19UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQUVTX01DTEtfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUVTX01DTEtfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQUVTX01DTEtfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUVTX01DTEtfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9BTkFMT0dfSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FOQUxPR19JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTkFMT0dfSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQU5BTE9HX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFOQUxPR19JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0FTU09DSUFURQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0FTU09DSUFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVNTT0NJQVRFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9BU1NPQ0lBVEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFTU09DSUFURSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfQlVGRkVSX05VTEwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQlVGRkVSX05VTEwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfTlVMTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0JVRkZFUl9OVUxMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX05VTEwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0JVRkZFUkxFTkdUSAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9CVUZGRVJMRU5HVEgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEgiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9CVUZGRVJMRU5HVEgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEgiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX0JVRkZFUkxFTkdUSF9ORUcKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQlVGRkVSTEVOR1RIX05FRyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUkxFTkdUSF9ORUciLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9CVUZGRVJMRU5HVEhfTkVHKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSTEVOR1RIX05FRyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfQlVGRkVSTEVOR1RIX09ERAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9CVUZGRVJMRU5HVEhfT0REKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSTEVOR1RIX09ERCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0JVRkZFUkxFTkdUSF9PREQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEhfT0REIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9DSEFOTkVMUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9DSEFOTkVMUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NIQU5ORUxTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfQ0hBTk5FTFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DSEFOTkVMUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfQ09ORklHCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0NPTkZJRyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NPTkZJRyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0NPTkZJRyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NPTkZJRyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfQ09VTlRfTkVHCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0NPVU5UX05FRyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NPVU5UX05FRyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0NPVU5UX05FRyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NPVU5UX05FRyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfREVWSUNFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0RFVklDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0RFVklDRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0RFVklDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0RFVklDRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfREVWSUNFX0FDQ0VTUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9ERVZJQ0VfQUNDRVNTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfREVWSUNFX0FDQ0VTUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0RFVklDRV9BQ0NFU1MpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9ERVZJQ0VfQUNDRVNTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9ESVJFQ1RJT04KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfRElSRUNUSU9OKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRElSRUNUSU9OIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfRElSRUNUSU9OKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRElSRUNUSU9OIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9GSUxMUE9JTlQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfRklMTFBPSU5UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRklMTFBPSU5UIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfRklMTFBPSU5UKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRklMTFBPSU5UIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9GTE9BVE1BWAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9GTE9BVE1BWCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0ZMT0FUTUFYIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfRkxPQVRNQVgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9GTE9BVE1BWCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfSUxMRUdBTF9TVEFURQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9JTExFR0FMX1NUQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfSUxMRUdBTF9TVEFURSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX0lMTEVHQUxfU1RBVEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9JTExFR0FMX1NUQVRFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9OT19QT1JUUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9OT19QT1JUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX05PX1BPUlRTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfTk9fUE9SVFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9OT19QT1JUUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfTk9UX0ZPVU5ECi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX05PVF9GT1VORCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX05PVF9GT1VORCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX05PVF9GT1VORCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX05PVF9GT1VORCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfTk9UX0lNUExFTUVOVEVECi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX05PVF9JTVBMRU1FTlRFRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX05PVF9JTVBMRU1FTlRFRCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX05PVF9JTVBMRU1FTlRFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX05PVF9JTVBMRU1FTlRFRCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfT1VUX09GX01FTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9PVVRfT0ZfTUVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfT1VUX09GX01FTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX09VVF9PRl9NRU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9PVVRfT0ZfTUVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9QQVJBTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9QQVJBTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BBUkFNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUEFSQU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QQVJBTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfUEVSTUlTU0lPTlMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUEVSTUlTU0lPTlMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QRVJNSVNTSU9OUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1BFUk1JU1NJT05TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEVSTUlTU0lPTlMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1BPUlQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUE9SVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BPUlQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9QT1JUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUE9SVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfUE9SVFNUWUxFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1BPUlRTVFlMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BPUlRTVFlMRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1BPUlRTVFlMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BPUlRTVFlMRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfUFZCVUZGRVIKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUFZCVUZGRVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QVkJVRkZFUiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1BWQlVGRkVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUFZCVUZGRVIiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1FTSVpFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1FTSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUVNJWkUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9RU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1FTSVpFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9SQVRFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1JBVEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9SQVRFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1JBVEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1JFU09VUkNFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1JFU09VUkNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUkVTT1VSQ0UiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9SRVNPVVJDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1JFU09VUkNFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0JBRF9TQU1QRk1UCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1NBTVBGTVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9TQU1QRk1UIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfU0FNUEZNVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1NBTVBGTVQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQkFEX1RSQU5TRkVSX1NJWkUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfVFJBTlNGRVJfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1RSQU5TRkVSX1NJWkUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0JBRF9UUkFOU0ZFUl9TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfVFJBTlNGRVJfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9CQURfV0lEVEgKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9CQURfV0lEVEgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9XSURUSCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQkFEX1dJRFRIKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfV0lEVEgiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQ0hBTk5FTF9NT0RFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ0hBTk5FTF9NT0RFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDSEFOTkVMX01PREUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NIQU5ORUxfTU9ERSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hBTk5FTF9NT0RFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0NIQU5ORUxTCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ0hBTk5FTFMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNIQU5ORUxTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DSEFOTkVMUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hBTk5FTFMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQ0hBUl9FTEVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ0hBUl9FTEVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDSEFSX0VMRU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NIQVJfRUxFTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hBUl9FTEVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0NMT0NLX0dFTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NMT0NLX0dFTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0xPQ0tfR0VOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DTE9DS19HRU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNMT0NLX0dFTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9DTE9DS0dFTl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ0xPQ0tHRU5fVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0xPQ0tHRU5fVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ0xPQ0tHRU5fVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0xPQ0tHRU5fVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9DT05ORUNUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ09OTkVDVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09OTkVDVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ09OTkVDVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09OTkVDVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9DT05ORUNUSU9OX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DT05ORUNUSU9OX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTk5FQ1RJT05fVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ09OTkVDVElPTl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT05ORUNUSU9OX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfQ09OTkVDVElPTlMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9DT05ORUNUSU9OUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09OTkVDVElPTlMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NPTk5FQ1RJT05TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT05ORUNUSU9OUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9DUllTVEFMX01DTEtfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0NSWVNUQUxfTUNMS19UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDUllTVEFMX01DTEtfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfQ1JZU1RBTF9NQ0xLX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNSWVNUQUxfTUNMS19UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0RFRkFVTFRfREVWSUNFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVGQVVMVF9ERVZJQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFRkFVTFRfREVWSUNFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERUZBVUxUX0RFVklDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVGQVVMVF9ERVZJQ0UiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfREVGQVVMVF9JTlBVVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFRkFVTFRfSU5QVVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFRkFVTFRfSU5QVVQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFRkFVTFRfSU5QVVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFRkFVTFRfSU5QVVQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfREVGQVVMVF9PVVRQVVQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERUZBVUxUX09VVFBVVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVGQVVMVF9PVVRQVVQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFRkFVTFRfT1VUUFVUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERUZBVUxUX09VVFBVVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ERVNUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVTVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVTVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVTVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREVTVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ERVZJQ0VfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RFVklDRV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERVZJQ0VfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfREVWSUNFX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFVklDRV9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0RFVklDRVMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERVZJQ0VTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERVZJQ0VTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ERVZJQ0VTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERVZJQ0VTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0RJR0lUQUxfSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RJR0lUQUxfSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRElHSVRBTF9JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ESUdJVEFMX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRJR0lUQUxfSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9ESUdJVEFMX0lOUFVUX1JBVEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ESUdJVEFMX0lOUFVUX1JBVEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRJR0lUQUxfSU5QVVRfUkFURSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRElHSVRBTF9JTlBVVF9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJESUdJVEFMX0lOUFVUX1JBVEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRElTQ09OTkVDVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RJU0NPTk5FQ1QpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRJU0NPTk5FQ1QiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0RJU0NPTk5FQ1QpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRJU0NPTk5FQ1QiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRU5VTV9FTEVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRU5VTV9FTEVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTlVNX0VMRU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VOVU1fRUxFTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRU5VTV9FTEVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0VOVU1fVkFMVUUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FTlVNX1ZBTFVFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTlVNX1ZBTFVFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FTlVNX1ZBTFVFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTlVNX1ZBTFVFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0VSUk9SX0lOUFVUX09WRVJGTE9XCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfSU5QVVRfT1ZFUkZMT1cpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX0lOUFVUX09WRVJGTE9XIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9JTlBVVF9PVkVSRkxPVyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfSU5QVVRfT1ZFUkZMT1ciLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRVJST1JfTEVOR1RICi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfTEVOR1RIKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9MRU5HVEgiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX0xFTkdUSCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfTEVOR1RIIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0VSUk9SX0xPQ0FUSU9OX0xTUAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX0xPQ0FUSU9OX0xTUCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfTE9DQVRJT05fTFNQIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9MT0NBVElPTl9MU1ApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX0xPQ0FUSU9OX0xTUCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9FUlJPUl9MT0NBVElPTl9NU1AKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9MT0NBVElPTl9NU1ApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SX0xPQ0FUSU9OX01TUCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfTE9DQVRJT05fTVNQKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9MT0NBVElPTl9NU1AiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfRVJST1JfTlVNQkVSCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfRVJST1JfTlVNQkVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9OVU1CRVIiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0VSUk9SX05VTUJFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVJST1JfTlVNQkVSIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0VSUk9SX09VVFBVVF9VTkRFUkZMT1cKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9PVVRQVVRfVU5ERVJGTE9XKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9PVVRQVVRfVU5ERVJGTE9XIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9PVVRQVVRfVU5ERVJGTE9XKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9PVVRQVVRfVU5ERVJGTE9XIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0VSUk9SX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9FUlJPUl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0ZJWEVEX0VMRU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9GSVhFRF9FTEVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGSVhFRF9FTEVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9GSVhFRF9FTEVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGSVhFRF9FTEVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0ZJWEVEX01DTEtfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0ZJWEVEX01DTEtfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRklYRURfTUNMS19UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9GSVhFRF9NQ0xLX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZJWEVEX01DTEtfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9HQUlOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfR0FJTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR0FJTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfR0FJTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiR0FJTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9HQUlOX1JFRgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0dBSU5fUkVGKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHQUlOX1JFRiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfR0FJTl9SRUYpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkdBSU5fUkVGIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0hSQl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSFJCX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhSQl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9IUkJfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSFJCX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5QVVRfQ09VTlQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9DT1VOVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfQ09VTlQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX0NPVU5UKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9DT1VOVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlBVVF9ERVZJQ0VfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX0RFVklDRV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9ERVZJQ0VfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfREVWSUNFX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX0RFVklDRV9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOUFVUX0RJR0lUQUwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9ESUdJVEFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9ESUdJVEFMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9ESUdJVEFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9ESUdJVEFMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOUFVUX0hSQl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfSFJCX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX0hSQl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9IUkJfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfSFJCX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5QVVRfTElORQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX0xJTkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX0xJTkUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX0xJTkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX0xJTkUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5QVVRfTUlDCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfTUlDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9NSUMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX01JQyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfTUlDIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOUFVUX1BPUlRfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOUFVUX1BPUlRfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfUE9SVF9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9QT1JUX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX1BPUlRfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlBVVF9SQVRFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfUkFURSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5QVVRfUkFURSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9JTlBVVF9TT1VSQ0UKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlBVVF9TT1VSQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOUFVUX1NPVVJDRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5QVVRfU09VUkNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlBVVF9TT1VSQ0UiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5UMzJfRUxFTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVDMyX0VMRU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVDMyX0VMRU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVDMyX0VMRU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVDMyX0VMRU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5UNjRfRUxFTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVDY0X0VMRU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVDY0X0VMRU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVDY0X0VMRU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVDY0X0VMRU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5URVJGQUNFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5URVJGQUNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRFUkZBQ0UiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVEVSRkFDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5URVJGQUNFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0lOVEVSRkFDRV9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSU5URVJGQUNFX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVEVSRkFDRV9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9JTlRFUkZBQ0VfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5URVJGQUNFX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5WQUxJRF9QQVJBTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVkFMSURfUEFSQU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVkFMSURfUEFSQU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVkFMSURfUEFSQU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVkFMSURfUEFSQU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSU5WQUxJRF9WQUxVRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVkFMSURfVkFMVUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVkFMSURfVkFMVUUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0lOVkFMSURfVkFMVUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVkFMSURfVkFMVUUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfSklUVEVSCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfSklUVEVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKSVRURVIiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0pJVFRFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSklUVEVSIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0xBQkVMCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEFCRUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxBQkVMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MQUJFTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEFCRUwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTEVGVF9JTlBVVF9BVFRFTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xFRlRfSU5QVVRfQVRURU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxFRlRfSU5QVVRfQVRURU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xFRlRfSU5QVVRfQVRURU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxFRlRfSU5QVVRfQVRURU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTEVGVF9NT05JVE9SX0FUVEVOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEVGVF9NT05JVE9SX0FUVEVOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMRUZUX01PTklUT1JfQVRURU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xFRlRfTU9OSVRPUl9BVFRFTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEVGVF9NT05JVE9SX0FUVEVOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0xFRlRfU1BFQUtFUl9HQUlOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEVGVF9TUEVBS0VSX0dBSU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxFRlRfU1BFQUtFUl9HQUlOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MRUZUX1NQRUFLRVJfR0FJTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEVGVF9TUEVBS0VSX0dBSU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTEVGVDFfSU5QVVRfQVRURU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MRUZUMV9JTlBVVF9BVFRFTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEVGVDFfSU5QVVRfQVRURU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xFRlQxX0lOUFVUX0FUVEVOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMRUZUMV9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9MRUZUMl9JTlBVVF9BVFRFTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xFRlQyX0lOUFVUX0FUVEVOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMRUZUMl9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTEVGVDJfSU5QVVRfQVRURU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxFRlQyX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX0xJTkVfSUZfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX0xJTkVfSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTElORV9JRl9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MSU5FX0lGX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxJTkVfSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9MT0NLRUQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9MT0NLRUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxPQ0tFRCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTE9DS0VEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMT0NLRUQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUFTVEVSX0NMT0NLCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFTVEVSX0NMT0NLKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVNURVJfQ0xPQ0siLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BU1RFUl9DTE9DSyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFTVEVSX0NMT0NLIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01BVFJJWF9WQUwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVRSSVhfVkFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVRSSVhfVkFMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVRSSVhfVkFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVRSSVhfVkFMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01BWF9FUlJPUgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX0VSUk9SIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfRVJST1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NQVhfRVZFTlRfUEFSQU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfRVZFTlRfUEFSQU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9FVkVOVF9QQVJBTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX0VWRU5UX1BBUkFNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfRVZFTlRfUEFSQU0iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUFYX1BCVUZTSVpFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX1BCVUZTSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfUEJVRlNJWkUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9QQlVGU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX1BCVUZTSVpFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01BWF9QT1JUUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9QT1JUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX1BPUlRTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfUE9SVFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9QT1JUUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NQVhfUkVTT1VSQ0VfSUQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfUkVTT1VSQ0VfSUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9SRVNPVVJDRV9JRCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX1JFU09VUkNFX0lEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfUkVTT1VSQ0VfSUQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUFYX1NFVFNJWkUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQVhfU0VUU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX1NFVFNJWkUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01BWF9TRVRTSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfU0VUU0laRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NQVhfU1RSTEVOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX1NUUkxFTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX1NUUkxFTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUFYX1NUUkxFTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX1NUUkxFTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NQ0xLX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NQ0xLX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1DTEtfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTUNMS19UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQ0xLX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTUlDX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NSUNfSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUlDX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01JQ19JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNSUNfSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9NT05JVE9SX0NUTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01PTklUT1JfQ1RMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNT05JVE9SX0NUTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTU9OSVRPUl9DVEwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1PTklUT1JfQ1RMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX01PTklUT1JfT0ZGCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTU9OSVRPUl9PRkYpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1PTklUT1JfT0ZGIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9NT05JVE9SX09GRik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OSVRPUl9PRkYiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTU9OSVRPUl9PTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01PTklUT1JfT04pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1PTklUT1JfT04iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01PTklUT1JfT04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1PTklUT1JfT04iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTU9OTwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01PTk8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1PTk8iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01PTk8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1PTk8iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTVVURQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01VVEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1VVEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX01VVEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1VVEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTkFNRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05BTUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5BTUUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05BTUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5BTUUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTkVHX0lORklOSVRZCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTkVHX0lORklOSVRZKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJORUdfSU5GSU5JVFkiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05FR19JTkZJTklUWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTkVHX0lORklOSVRZIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05FR19JTkZJTklUWV9CSVQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ORUdfSU5GSU5JVFlfQklUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJORUdfSU5GSU5JVFlfQklUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9ORUdfSU5GSU5JVFlfQklUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJORUdfSU5GSU5JVFlfQklUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX05PX0NIQU5HRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX0NIQU5HRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fQ0hBTkdFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19DSEFOR0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX0NIQU5HRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9OT19DSEFOR0VfQklUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fQ0hBTkdFX0JJVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fQ0hBTkdFX0JJVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fQ0hBTkdFX0JJVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fQ0hBTkdFX0JJVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9OT19FTEVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fRUxFTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fRUxFTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fRUxFTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fRUxFTSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9OT19FUlJPUlMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19FUlJPUlMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX0VSUk9SUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fRVJST1JTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19FUlJPUlMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTk9fT1AKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19PUCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9fT1AiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05PX09QKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19PUCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9OT19WQUwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OT19WQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PX1ZBTCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTk9fVkFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT19WQUwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfTlVMTF9JTlRFUkZBQ0UKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9OVUxMX0lOVEVSRkFDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVMTF9JTlRFUkZBQ0UiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX05VTExfSU5URVJGQUNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVUxMX0lOVEVSRkFDRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9OVUxMX1JFU09VUkNFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTlVMTF9SRVNPVVJDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVMTF9SRVNPVVJDRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfTlVMTF9SRVNPVVJDRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVMTF9SRVNPVVJDRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9PUFRJQ0FMX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PUFRJQ0FMX0lGX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9QVElDQUxfSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1BUSUNBTF9JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPUFRJQ0FMX0lGX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfT1VUUFVUX0NPVU5UCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1VUUFVUX0NPVU5UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPVVRQVVRfQ09VTlQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09VVFBVVF9DT1VOVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1VUUFVUX0NPVU5UIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX09VVFBVVF9ERVZJQ0VfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09VVFBVVF9ERVZJQ0VfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1VUUFVUX0RFVklDRV9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PVVRQVVRfREVWSUNFX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9VVFBVVF9ERVZJQ0VfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9PVVRQVVRfSFJCX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PVVRQVVRfSFJCX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9VVFBVVF9IUkJfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfT1VUUFVUX0hSQl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPVVRQVVRfSFJCX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfT1VUUFVUX1BPUlRfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09VVFBVVF9QT1JUX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9VVFBVVF9QT1JUX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09VVFBVVF9QT1JUX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9VVFBVVF9QT1JUX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfT1VUUFVUX1JBVEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9PVVRQVVRfUkFURSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1VUUFVUX1JBVEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX09VVFBVVF9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPVVRQVVRfUkFURSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9QQVJBTV9CSVQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QQVJBTV9CSVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBBUkFNX0JJVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUEFSQU1fQklUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQQVJBTV9CSVQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUEFSQU1TCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUEFSQU1TKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQQVJBTVMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BBUkFNUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUEFSQU1TIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1BPUlRfQ09VTlQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QT1JUX0NPVU5UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQT1JUX0NPVU5UIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QT1JUX0NPVU5UKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQT1JUX0NPVU5UIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1BPUlRfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BPUlRfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUE9SVF9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QT1JUX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBPUlRfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9QT1JUUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BPUlRTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQT1JUUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUE9SVFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBPUlRTIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1BPUlRTVFlMRV9ESVJFQ1QKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QT1JUU1RZTEVfRElSRUNUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQT1JUU1RZTEVfRElSRUNUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QT1JUU1RZTEVfRElSRUNUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQT1JUU1RZTEVfRElSRUNUIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1BPUlRTVFlMRV9TRVJJQUwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QT1JUU1RZTEVfU0VSSUFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQT1JUU1RZTEVfU0VSSUFMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QT1JUU1RZTEVfU0VSSUFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQT1JUU1RZTEVfU0VSSUFMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1BSSU5UX0VSUk9SUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BSSU5UX0VSUk9SUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUFJJTlRfRVJST1JTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9QUklOVF9FUlJPUlMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBSSU5UX0VSUk9SUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9QVFJfRUxFTQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1BUUl9FTEVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQVFJfRUxFTSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUFRSX0VMRU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBUUl9FTEVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBTkdFX1ZBTFVFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFOR0VfVkFMVUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBTkdFX1ZBTFVFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQU5HRV9WQUxVRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFOR0VfVkFMVUUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV8xMTAyNQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfMTEwMjUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfMTEwMjUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfMTEwMjUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfMTEwMjUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV8xNjAwMAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfMTYwMDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfMTYwMDAiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfMTYwMDApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfMTYwMDAiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV8yMjA1MAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfMjIwNTApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfMjIwNTAiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfMjIwNTApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfMjIwNTAiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV8zMjAwMAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfMzIwMDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfMzIwMDAiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfMzIwMDApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfMzIwMDAiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV80NDEwMAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfNDQxMDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfNDQxMDAiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfNDQxMDApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfNDQxMDAiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV80ODAwMAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfNDgwMDApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfNDgwMDAiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfNDgwMDApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfNDgwMDAiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV84MDAwCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV84MDAwKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFXzgwMDAiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfODAwMCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV84MDAwIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfQUVTXzEKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU18xKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU18xIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU18xKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0FFU18xIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfQUVTXzFzCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9BRVNfMXMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzFzIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0FFU18xcyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9BRVNfMXMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9BRVNfMgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzIiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzIiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9BRVNfMwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9BRVNfNAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9BRVNfNgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzYpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzYiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfQUVTXzYpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfQUVTXzYiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9GUkFDVElPTl9ECi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9GUkFDVElPTl9EKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0ZSQUNUSU9OX0QiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfRlJBQ1RJT05fRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9GUkFDVElPTl9EIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfRlJBQ1RJT05fTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfRlJBQ1RJT05fTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9GUkFDVElPTl9OIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX0ZSQUNUSU9OX04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfRlJBQ1RJT05fTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX0lOUFVUUkFURQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfSU5QVVRSQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX0lOUFVUUkFURSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9JTlBVVFJBVEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfSU5QVVRSQVRFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JBVEVfTk9fRElHSVRBTF9JTlBVVAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfTk9fRElHSVRBTF9JTlBVVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9OT19ESUdJVEFMX0lOUFVUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX05PX0RJR0lUQUxfSU5QVVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfTk9fRElHSVRBTF9JTlBVVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SQVRFX1VOQUNRVUlSRUQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX1VOQUNRVUlSRUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBVEVfVU5BQ1FVSVJFRCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkFURV9VTkFDUVVJUkVEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX1VOQUNRVUlSRUQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkFURV9VTkRFRklORUQKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SQVRFX1VOREVGSU5FRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkFURV9VTkRFRklORUQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JBVEVfVU5ERUZJTkVEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQVRFX1VOREVGSU5FRCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SRUZfMERCVgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFRl8wREJWKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRUZfMERCViIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVGXzBEQlYpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFRl8wREJWIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JFRl9OT05FCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVGX05PTkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFRl9OT05FIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRUZfTk9ORSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVGX05PTkUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkVTRVJWRUQxX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNFUlZFRDFfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTRVJWRUQxX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU0VSVkVEMV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNFUlZFRDFfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SRVNFUlZFRDJfVFlQRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU0VSVkVEMl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNFUlZFRDJfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTRVJWRUQyX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU0VSVkVEMl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JFU0VSVkVEM19UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTRVJWRUQzX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU0VSVkVEM19UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNFUlZFRDNfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTRVJWRUQzX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUkVTRVJWRUQ0X1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNFUlZFRDRfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVTRVJWRUQ0X1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU0VSVkVENF9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNFUlZFRDRfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SRVNPVVJDRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JFU09VUkNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNPVVJDRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUkVTT1VSQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFU09VUkNFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JFU09VUkNFX0VMRU0KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNPVVJDRV9FTEVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNPVVJDRV9FTEVNIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNPVVJDRV9FTEVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNPVVJDRV9FTEVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JFU09VUkNFX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNPVVJDRV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNPVVJDRV9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SRVNPVVJDRV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSRVNPVVJDRV9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JJR0hUX0lOUFVUX0FUVEVOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUklHSFRfSU5QVVRfQVRURU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJJR0hUX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SSUdIVF9JTlBVVF9BVFRFTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUklHSFRfSU5QVVRfQVRURU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUklHSFRfTU9OSVRPUl9BVFRFTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JJR0hUX01PTklUT1JfQVRURU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJJR0hUX01PTklUT1JfQVRURU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JJR0hUX01PTklUT1JfQVRURU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJJR0hUX01PTklUT1JfQVRURU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfUklHSFRfU1BFQUtFUl9HQUlOCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUklHSFRfU1BFQUtFUl9HQUlOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSSUdIVF9TUEVBS0VSX0dBSU4iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JJR0hUX1NQRUFLRVJfR0FJTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUklHSFRfU1BFQUtFUl9HQUlOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1JJR0hUMV9JTlBVVF9BVFRFTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1JJR0hUMV9JTlBVVF9BVFRFTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUklHSFQxX0lOUFVUX0FUVEVOIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SSUdIVDFfSU5QVVRfQVRURU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJJR0hUMV9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9SSUdIVDJfSU5QVVRfQVRURU4KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9SSUdIVDJfSU5QVVRfQVRURU4pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJJR0hUMl9JTlBVVF9BVFRFTiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfUklHSFQyX0lOUFVUX0FUVEVOKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSSUdIVDJfSU5QVVRfQVRURU4iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU0FNUEZNVF9ET1VCTEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QRk1UX0RPVUJMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUEZNVF9ET1VCTEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBGTVRfRE9VQkxFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QRk1UX0RPVUJMRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TQU1QRk1UX0ZMT0FUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUEZNVF9GTE9BVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUEZNVF9GTE9BVCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUEZNVF9GTE9BVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUEZNVF9GTE9BVCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TQU1QRk1UX1RXT1NDT01QCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUEZNVF9UV09TQ09NUCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUEZNVF9UV09TQ09NUCIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUEZNVF9UV09TQ09NUCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUEZNVF9UV09TQ09NUCIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TQU1QTEVfMTYKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QTEVfMTYpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBMRV8xNiIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUExFXzE2KTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QTEVfMTYiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU0FNUExFXzI0Ci0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUExFXzI0KTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQU1QTEVfMjQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NBTVBMRV8yNCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUExFXzI0IiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NBTVBMRV84Ci0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU0FNUExFXzgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBMRV84IiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TQU1QTEVfOCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0FNUExFXzgiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU0NBTEFSX1ZBTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NDQUxBUl9WQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNDQUxBUl9WQUwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NDQUxBUl9WQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNDQUxBUl9WQUwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU0VUX1ZBTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NFVF9WQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNFVF9WQUwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NFVF9WQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNFVF9WQUwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU0hPUlRfTkFNRQotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NIT1JUX05BTUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNIT1JUX05BTUUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NIT1JUX05BTUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNIT1JUX05BTUUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU01QVEUyNzJNX0lGX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TTVBURTI3Mk1fSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU01QVEUyNzJNX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NNUFRFMjcyTV9JRl9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTTVBURTI3Mk1fSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TT1VSQ0UKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TT1VSQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNPVVJDRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU09VUkNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTT1VSQ0UiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1BFQUtFUl9JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1BFQUtFUl9JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVBS0VSX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NQRUFLRVJfSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFQUtFUl9JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NQRUFLRVJfTVVURV9DVEwKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TUEVBS0VSX01VVEVfQ1RMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVBS0VSX01VVEVfQ1RMIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TUEVBS0VSX01VVEVfQ1RMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVBS0VSX01VVEVfQ1RMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NQRUFLRVJfTVVURV9PRkYKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TUEVBS0VSX01VVEVfT0ZGKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVBS0VSX01VVEVfT0ZGIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TUEVBS0VSX01VVEVfT0ZGKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTUEVBS0VSX01VVEVfT0ZGIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NQRUFLRVJfTVVURV9PTgotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NQRUFLRVJfTVVURV9PTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFQUtFUl9NVVRFX09OIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TUEVBS0VSX01VVEVfT04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUFLRVJfTVVURV9PTiIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TUEVBS0VSX1BMVVNfTElORV9JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1BFQUtFUl9QTFVTX0xJTkVfSUZfVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFQUtFUl9QTFVTX0xJTkVfSUZfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1BFQUtFUl9QTFVTX0xJTkVfSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFQUtFUl9QTFVTX0xJTkVfSUZfVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TVEVSRU8KLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TVEVSRU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNURVJFTyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1RFUkVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVEVSRU8iLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1RSSU5HX1ZBTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NUUklOR19WQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNUUklOR19WQUwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NUUklOR19WQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNUUklOR19WQUwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1VCU1lTVEVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1VCU1lTVEVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVUJTWVNURU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NVQlNZU1RFTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1VCU1lTVEVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NVQlNZU1RFTV9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1VCU1lTVEVNX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNVQlNZU1RFTV9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TVUJTWVNURU1fVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1VCU1lTVEVNX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1lOQ19JTlBVVF9UT19BRVMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TWU5DX0lOUFVUX1RPX0FFUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1lOQ19JTlBVVF9UT19BRVMiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NZTkNfSU5QVVRfVE9fQUVTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTWU5DX0lOUFVUX1RPX0FFUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9TWU5DX09VVFBVVF9UT19BRVMKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TWU5DX09VVFBVVF9UT19BRVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNZTkNfT1VUUFVUX1RPX0FFUyIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1lOQ19PVVRQVVRfVE9fQUVTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTWU5DX09VVFBVVF9UT19BRVMiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfU1lTVEVNCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1lTVEVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTWVNURU0iLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1NZU1RFTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1lTVEVNIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1NZU1RFTV9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfU1lTVEVNX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNZU1RFTV9UWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9TWVNURU1fVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1lTVEVNX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfVEVTVF9JRl9UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVEVTVF9JRl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJURVNUX0lGX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1RFU1RfSUZfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVEVTVF9JRl9UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUWVBFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1RZUEVfQklUCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVFlQRV9CSVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRZUEVfQklUIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9UWVBFX0JJVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVFlQRV9CSVQiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfVU5VU0VEX0NPVU5UCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVU5VU0VEX0NPVU5UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTlVTRURfQ09VTlQiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1VOVVNFRF9DT1VOVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5VU0VEX0NPVU5UIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1VOVVNFRF9QT1JUUwotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1VOVVNFRF9QT1JUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5VU0VEX1BPUlRTIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9VTlVTRURfUE9SVFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOVVNFRF9QT1JUUyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBTF9WQVJJQUJMRV9NQ0xLX1RZUEUKLQl4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9WQVJJQUJMRV9NQ0xLX1RZUEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlZBUklBQkxFX01DTEtfVFlQRSIsIHgpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVkFSSUFCTEVfTUNMS19UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJWQVJJQUJMRV9NQ0xLX1RZUEUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfVkVDVE9SX1ZBTAotCXggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1ZFQ1RPUl9WQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlZFQ1RPUl9WQUwiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1ZFQ1RPUl9WQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlZFQ1RPUl9WQUwiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQUxfVklERU9fTUNMS19UWVBFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfVklERU9fTUNMS19UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJWSURFT19NQ0xLX1RZUEUiLCB4KSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEFMX1ZJREVPX01DTEtfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVklERU9fTUNMS19UWVBFIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFMX1dPUkRTSVpFCi0JeCA9ICBQeUludF9Gcm9tTG9uZygobG9uZykgQUxfV09SRFNJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIldPUkRTSVpFIiwgeCkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gIFB5SW50X0Zyb21Mb25nKChsb25nKSBBTF9XT1JEU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiV09SRFNJWkUiLCB4KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAKLSNpZmRlZiBBTF9OT19FTEVNCQkvKiBJUklYIDYgKi8KLQkodm9pZCkgYWxTZXRFcnJvckhhbmRsZXIoRXJyb3JIYW5kbGVyKTsKKyNpZmRlZiBBTF9OT19FTEVNICAgICAgICAgICAgICAgLyogSVJJWCA2ICovCisgICAgKHZvaWQpIGFsU2V0RXJyb3JIYW5kbGVyKEVycm9ySGFuZGxlcik7CiAjZW5kaWYgLyogQUxfTk9fRUxFTSAqLwogI2lmZGVmIE9MRF9JTlRFUkZBQ0UKLQkodm9pZCkgQUxzZXRlcnJvcmhhbmRsZXIoRXJyb3JIYW5kbGVyKTsKKyAgICAodm9pZCkgQUxzZXRlcnJvcmhhbmRsZXIoRXJyb3JIYW5kbGVyKTsKICNlbmRpZiAvKiBPTERfSU5URVJGQUNFICovCi0JCisKICAgZXJyb3I6Ci0JcmV0dXJuOworICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvYXJyYXltb2R1bGUuYyBiL01vZHVsZXMvYXJyYXltb2R1bGUuYwppbmRleCBlMTFhNTk4Li5iNTcxZmU4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAjZWxzZSAvKiAhU1REQ19IRUFERVJTICovCiAjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJLyogRm9yIHNpemVfdCAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAgICAgICAvKiBGb3Igc2l6ZV90ICovCiAjZW5kaWYgLyogSEFWRV9TWVNfVFlQRVNfSCAqLwogI2VuZGlmIC8qICFTVERDX0hFQURFUlMgKi8KIApAQCAtMjIsMTggKzIyLDE4IEBACiAgKiBmdW5jdGlvbnMgYXJlbid0IHZpc2libGUgeWV0LgogICovCiBzdHJ1Y3QgYXJyYXlkZXNjciB7Ci0JaW50IHR5cGVjb2RlOwotCWludCBpdGVtc2l6ZTsKLQlQeU9iamVjdCAqICgqZ2V0aXRlbSkoc3RydWN0IGFycmF5b2JqZWN0ICosIFB5X3NzaXplX3QpOwotCWludCAoKnNldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90LCBQeU9iamVjdCAqKTsKKyAgICBpbnQgdHlwZWNvZGU7CisgICAgaW50IGl0ZW1zaXplOworICAgIFB5T2JqZWN0ICogKCpnZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCk7CisgICAgaW50ICgqc2V0aXRlbSkoc3RydWN0IGFycmF5b2JqZWN0ICosIFB5X3NzaXplX3QsIFB5T2JqZWN0ICopOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgYXJyYXlvYmplY3QgewotCVB5T2JqZWN0X1ZBUl9IRUFECi0JY2hhciAqb2JfaXRlbTsKLQlQeV9zc2l6ZV90IGFsbG9jYXRlZDsKLQlzdHJ1Y3QgYXJyYXlkZXNjciAqb2JfZGVzY3I7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgY2hhciAqb2JfaXRlbTsKKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsKKyAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqb2JfZGVzY3I7CisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogfSBhcnJheW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBBcnJheXR5cGU7CkBAIC00NCw0OSArNDQsNDkgQEAKIHN0YXRpYyBpbnQKIGFycmF5X3Jlc2l6ZShhcnJheW9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBuZXdzaXplKQogewotCWNoYXIgKml0ZW1zOwotCXNpemVfdCBfbmV3X3NpemU7CisgICAgY2hhciAqaXRlbXM7CisgICAgc2l6ZV90IF9uZXdfc2l6ZTsKIAotCS8qIEJ5cGFzcyByZWFsbG9jKCkgd2hlbiBhIHByZXZpb3VzIG92ZXJhbGxvY2F0aW9uIGlzIGxhcmdlIGVub3VnaAotCSAgIHRvIGFjY29tbW9kYXRlIHRoZSBuZXdzaXplLiAgSWYgdGhlIG5ld3NpemUgaXMgMTYgc21hbGxlciB0aGFuIHRoZQotCSAgIGN1cnJlbnQgc2l6ZSwgdGhlbiBwcm9jZWVkIHdpdGggdGhlIHJlYWxsb2MoKSB0byBzaHJpbmsgdGhlIGxpc3QuCi0JKi8KKyAgICAvKiBCeXBhc3MgcmVhbGxvYygpIHdoZW4gYSBwcmV2aW91cyBvdmVyYWxsb2NhdGlvbiBpcyBsYXJnZSBlbm91Z2gKKyAgICAgICB0byBhY2NvbW1vZGF0ZSB0aGUgbmV3c2l6ZS4gIElmIHRoZSBuZXdzaXplIGlzIDE2IHNtYWxsZXIgdGhhbiB0aGUKKyAgICAgICBjdXJyZW50IHNpemUsIHRoZW4gcHJvY2VlZCB3aXRoIHRoZSByZWFsbG9jKCkgdG8gc2hyaW5rIHRoZSBsaXN0LgorICAgICovCiAKLQlpZiAoc2VsZi0+YWxsb2NhdGVkID49IG5ld3NpemUgJiYKLQkgICAgUHlfU0laRShzZWxmKSA8IG5ld3NpemUgKyAxNiAmJgotCSAgICBzZWxmLT5vYl9pdGVtICE9IE5VTEwpIHsKLQkJUHlfU0laRShzZWxmKSA9IG5ld3NpemU7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoc2VsZi0+YWxsb2NhdGVkID49IG5ld3NpemUgJiYKKyAgICAgICAgUHlfU0laRShzZWxmKSA8IG5ld3NpemUgKyAxNiAmJgorICAgICAgICBzZWxmLT5vYl9pdGVtICE9IE5VTEwpIHsKKyAgICAgICAgUHlfU0laRShzZWxmKSA9IG5ld3NpemU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIFRoaXMgb3Zlci1hbGxvY2F0ZXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBhcnJheSBzaXplLCBtYWtpbmcgcm9vbQotCSAqIGZvciBhZGRpdGlvbmFsIGdyb3d0aC4gIFRoZSBvdmVyLWFsbG9jYXRpb24gaXMgbWlsZCwgYnV0IGlzCi0JICogZW5vdWdoIHRvIGdpdmUgbGluZWFyLXRpbWUgYW1vcnRpemVkIGJlaGF2aW9yIG92ZXIgYSBsb25nCi0JICogc2VxdWVuY2Ugb2YgYXBwZW5kcygpIGluIHRoZSBwcmVzZW5jZSBvZiBhIHBvb3JseS1wZXJmb3JtaW5nCi0JICogc3lzdGVtIHJlYWxsb2MoKS4KLQkgKiBUaGUgZ3Jvd3RoIHBhdHRlcm4gaXM6ICAwLCA0LCA4LCAxNiwgMjUsIDM0LCA0NiwgNTYsIDY3LCA3OSwgLi4uCi0JICogTm90ZSwgdGhlIHBhdHRlcm4gc3RhcnRzIG91dCB0aGUgc2FtZSBhcyBmb3IgbGlzdHMgYnV0IHRoZW4KLQkgKiBncm93cyBhdCBhIHNtYWxsZXIgcmF0ZSBzbyB0aGF0IGxhcmdlciBhcnJheXMgb25seSBvdmVyYWxsb2NhdGUKLQkgKiBieSBhYm91dCAxLzE2dGggLS0gdGhpcyBpcyBkb25lIGJlY2F1c2UgYXJyYXlzIGFyZSBwcmVzdW1lZCB0byBiZSBtb3JlCi0JICogbWVtb3J5IGNyaXRpY2FsLgotCSAqLworICAgIC8qIFRoaXMgb3Zlci1hbGxvY2F0ZXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBhcnJheSBzaXplLCBtYWtpbmcgcm9vbQorICAgICAqIGZvciBhZGRpdGlvbmFsIGdyb3d0aC4gIFRoZSBvdmVyLWFsbG9jYXRpb24gaXMgbWlsZCwgYnV0IGlzCisgICAgICogZW5vdWdoIHRvIGdpdmUgbGluZWFyLXRpbWUgYW1vcnRpemVkIGJlaGF2aW9yIG92ZXIgYSBsb25nCisgICAgICogc2VxdWVuY2Ugb2YgYXBwZW5kcygpIGluIHRoZSBwcmVzZW5jZSBvZiBhIHBvb3JseS1wZXJmb3JtaW5nCisgICAgICogc3lzdGVtIHJlYWxsb2MoKS4KKyAgICAgKiBUaGUgZ3Jvd3RoIHBhdHRlcm4gaXM6ICAwLCA0LCA4LCAxNiwgMjUsIDM0LCA0NiwgNTYsIDY3LCA3OSwgLi4uCisgICAgICogTm90ZSwgdGhlIHBhdHRlcm4gc3RhcnRzIG91dCB0aGUgc2FtZSBhcyBmb3IgbGlzdHMgYnV0IHRoZW4KKyAgICAgKiBncm93cyBhdCBhIHNtYWxsZXIgcmF0ZSBzbyB0aGF0IGxhcmdlciBhcnJheXMgb25seSBvdmVyYWxsb2NhdGUKKyAgICAgKiBieSBhYm91dCAxLzE2dGggLS0gdGhpcyBpcyBkb25lIGJlY2F1c2UgYXJyYXlzIGFyZSBwcmVzdW1lZCB0byBiZSBtb3JlCisgICAgICogbWVtb3J5IGNyaXRpY2FsLgorICAgICAqLwogCi0JX25ld19zaXplID0gKG5ld3NpemUgPj4gNCkgKyAoUHlfU0laRShzZWxmKSA8IDggPyAzIDogNykgKyBuZXdzaXplOwotCWl0ZW1zID0gc2VsZi0+b2JfaXRlbTsKLQkvKiBYWFggVGhlIGZvbGxvd2luZyBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gZG9lcyBub3Qgb3B0aW1pemUgYXdheSAKLQkgICBsaWtlIGl0IGRvZXMgZm9yIGxpc3RzIHNpbmNlIHRoZSBzaXplIGlzIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUgKi8KLQlpZiAoX25ld19zaXplIDw9ICgofihzaXplX3QpMCkgLyBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpKQotCQlQeU1lbV9SRVNJWkUoaXRlbXMsIGNoYXIsIChfbmV3X3NpemUgKiBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpKTsKLQllbHNlCi0JCWl0ZW1zID0gTlVMTDsKLQlpZiAoaXRlbXMgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNlbGYtPm9iX2l0ZW0gPSBpdGVtczsKLQlQeV9TSVpFKHNlbGYpID0gbmV3c2l6ZTsKLQlzZWxmLT5hbGxvY2F0ZWQgPSBfbmV3X3NpemU7Ci0JcmV0dXJuIDA7CisgICAgX25ld19zaXplID0gKG5ld3NpemUgPj4gNCkgKyAoUHlfU0laRShzZWxmKSA8IDggPyAzIDogNykgKyBuZXdzaXplOworICAgIGl0ZW1zID0gc2VsZi0+b2JfaXRlbTsKKyAgICAvKiBYWFggVGhlIGZvbGxvd2luZyBtdWx0aXBsaWNhdGlvbiBhbmQgZGl2aXNpb24gZG9lcyBub3Qgb3B0aW1pemUgYXdheQorICAgICAgIGxpa2UgaXQgZG9lcyBmb3IgbGlzdHMgc2luY2UgdGhlIHNpemUgaXMgbm90IGtub3duIGF0IGNvbXBpbGUgdGltZSAqLworICAgIGlmIChfbmV3X3NpemUgPD0gKCh+KHNpemVfdCkwKSAvIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkpCisgICAgICAgIFB5TWVtX1JFU0laRShpdGVtcywgY2hhciwgKF9uZXdfc2l6ZSAqIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkpOworICAgIGVsc2UKKyAgICAgICAgaXRlbXMgPSBOVUxMOworICAgIGlmIChpdGVtcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc2VsZi0+b2JfaXRlbSA9IGl0ZW1zOworICAgIFB5X1NJWkUoc2VsZikgPSBuZXdzaXplOworICAgIHNlbGYtPmFsbG9jYXRlZCA9IF9uZXdfc2l6ZTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwNCwzMDggKzEwNCwzMDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCYoKGNoYXIgKilhcC0+b2JfaXRlbSlbaV0sIDEpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgmKChjaGFyICopYXAtPm9iX2l0ZW0pW2ldLCAxKTsKIH0KIAogc3RhdGljIGludAogY19zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQljaGFyIHg7Ci0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiYzthcnJheSBpdGVtIG11c3QgYmUgY2hhciIsICZ4KSkKLQkJcmV0dXJuIC0xOwotCWlmIChpID49IDApCi0JCSgoY2hhciAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7Ci0JcmV0dXJuIDA7CisgICAgY2hhciB4OworICAgIGlmICghUHlBcmdfUGFyc2UodiwgImM7YXJyYXkgaXRlbSBtdXN0IGJlIGNoYXIiLCAmeCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAoKGNoYXIgKilhcC0+b2JfaXRlbSlbaV0gPSB4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYl9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCWxvbmcgeCA9ICgoY2hhciAqKWFwLT5vYl9pdGVtKVtpXTsKLQlpZiAoeCA+PSAxMjgpCi0JCXggLT0gMjU2OwotCXJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKKyAgICBsb25nIHggPSAoKGNoYXIgKilhcC0+b2JfaXRlbSlbaV07CisgICAgaWYgKHggPj0gMTI4KQorICAgICAgICB4IC09IDI1NjsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CiB9CiAKIHN0YXRpYyBpbnQKIGJfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0Jc2hvcnQgeDsKLQkvKiBQeUFyZ19QYXJzZSdzICdiJyBmb3JtYXR0ZXIgaXMgZm9yIGFuIHVuc2lnbmVkIGNoYXIsIHRoZXJlZm9yZQotCSAgIG11c3QgdXNlIHRoZSBuZXh0IHNpemUgdXAgdGhhdCBpcyBzaWduZWQgKCdoJykgYW5kIG1hbnVhbGx5IGRvCi0JICAgdGhlIG92ZXJmbG93IGNoZWNraW5nICovCi0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiaDthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKLQkJcmV0dXJuIC0xOwotCWVsc2UgaWYgKHggPCAtMTI4KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInNpZ25lZCBjaGFyIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAoeCA+IDEyNykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJzaWduZWQgY2hhciBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChpID49IDApCi0JCSgoY2hhciAqKWFwLT5vYl9pdGVtKVtpXSA9IChjaGFyKXg7Ci0JcmV0dXJuIDA7CisgICAgc2hvcnQgeDsKKyAgICAvKiBQeUFyZ19QYXJzZSdzICdiJyBmb3JtYXR0ZXIgaXMgZm9yIGFuIHVuc2lnbmVkIGNoYXIsIHRoZXJlZm9yZQorICAgICAgIG11c3QgdXNlIHRoZSBuZXh0IHNpemUgdXAgdGhhdCBpcyBzaWduZWQgKCdoJykgYW5kIG1hbnVhbGx5IGRvCisgICAgICAgdGhlIG92ZXJmbG93IGNoZWNraW5nICovCisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiaDthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UgaWYgKHggPCAtMTI4KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInNpZ25lZCBjaGFyIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoeCA+IDEyNykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJzaWduZWQgY2hhciBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChpID49IDApCisgICAgICAgICgoY2hhciAqKWFwLT5vYl9pdGVtKVtpXSA9IChjaGFyKXg7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBCQl9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCWxvbmcgeCA9ICgodW5zaWduZWQgY2hhciAqKWFwLT5vYl9pdGVtKVtpXTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgbG9uZyB4ID0gKCh1bnNpZ25lZCBjaGFyICopYXAtPm9iX2l0ZW0pW2ldOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4KTsKIH0KIAogc3RhdGljIGludAogQkJfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JdW5zaWduZWQgY2hhciB4OwotCS8qICdCJyA9PSB1bnNpZ25lZCBjaGFyLCBtYXBzIHRvIFB5QXJnX1BhcnNlJ3MgJ2InIGZvcm1hdHRlciAqLwotCWlmICghUHlBcmdfUGFyc2UodiwgImI7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCi0JCXJldHVybiAtMTsKLQlpZiAoaSA+PSAwKQotCQkoKGNoYXIgKilhcC0+b2JfaXRlbSlbaV0gPSB4OwotCXJldHVybiAwOworICAgIHVuc2lnbmVkIGNoYXIgeDsKKyAgICAvKiAnQicgPT0gdW5zaWduZWQgY2hhciwgbWFwcyB0byBQeUFyZ19QYXJzZSdzICdiJyBmb3JtYXR0ZXIgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJiO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgKChjaGFyICopYXAtPm9iX2l0ZW0pW2ldID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIHN0YXRpYyBQeU9iamVjdCAqCiB1X2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZSgmKChQeV9VTklDT0RFICopIGFwLT5vYl9pdGVtKVtpXSwgMSk7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZSgmKChQeV9VTklDT0RFICopIGFwLT5vYl9pdGVtKVtpXSwgMSk7CiB9CiAKIHN0YXRpYyBpbnQKIHVfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JUHlfVU5JQ09ERSAqcDsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeV9VTklDT0RFICpwOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKCFQeUFyZ19QYXJzZSh2LCAidSM7YXJyYXkgaXRlbSBtdXN0IGJlIHVuaWNvZGUgY2hhcmFjdGVyIiwgJnAsICZsZW4pKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGxlbiAhPSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFycmF5IGl0ZW0gbXVzdCBiZSB1bmljb2RlIGNoYXJhY3RlciIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChpID49IDApCi0JCSgoUHlfVU5JQ09ERSAqKWFwLT5vYl9pdGVtKVtpXSA9IHBbMF07Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAidSM7YXJyYXkgaXRlbSBtdXN0IGJlIHVuaWNvZGUgY2hhcmFjdGVyIiwgJnAsICZsZW4pKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGxlbiAhPSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgaXRlbSBtdXN0IGJlIHVuaWNvZGUgY2hhcmFjdGVyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgKChQeV9VTklDT0RFICopYXAtPm9iX2l0ZW0pW2ldID0gcFswXTsKKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogaF9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKChzaG9ydCAqKWFwLT5vYl9pdGVtKVtpXSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAoKHNob3J0ICopYXAtPm9iX2l0ZW0pW2ldKTsKIH0KIAogc3RhdGljIGludAogaF9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQlzaG9ydCB4OwotCS8qICdoJyA9PSBzaWduZWQgc2hvcnQsIG1hcHMgdG8gUHlBcmdfUGFyc2UncyAnaCcgZm9ybWF0dGVyICovCi0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiaDthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKLQkJcmV0dXJuIC0xOwotCWlmIChpID49IDApCi0JCSAgICAgKChzaG9ydCAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7Ci0JcmV0dXJuIDA7CisgICAgc2hvcnQgeDsKKyAgICAvKiAnaCcgPT0gc2lnbmVkIHNob3J0LCBtYXBzIHRvIFB5QXJnX1BhcnNlJ3MgJ2gnIGZvcm1hdHRlciAqLworICAgIGlmICghUHlBcmdfUGFyc2UodiwgImg7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgICAgICAoKHNob3J0ICopYXAtPm9iX2l0ZW0pW2ldID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEhIX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAoKHVuc2lnbmVkIHNob3J0ICopYXAtPm9iX2l0ZW0pW2ldKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpICgodW5zaWduZWQgc2hvcnQgKilhcC0+b2JfaXRlbSlbaV0pOwogfQogCiBzdGF0aWMgaW50CiBISF9zZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdikKIHsKLQlpbnQgeDsKLQkvKiBQeUFyZ19QYXJzZSdzICdoJyBmb3JtYXR0ZXIgaXMgZm9yIGEgc2lnbmVkIHNob3J0LCB0aGVyZWZvcmUKLQkgICBtdXN0IHVzZSB0aGUgbmV4dCBzaXplIHVwIGFuZCBtYW51YWxseSBkbyB0aGUgb3ZlcmZsb3cgY2hlY2tpbmcgKi8KLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJpO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQotCQlyZXR1cm4gLTE7Ci0JZWxzZSBpZiAoeCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkidW5zaWduZWQgc2hvcnQgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIGlmICh4ID4gVVNIUlRfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInVuc2lnbmVkIHNob3J0IGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGkgPj0gMCkKLQkJKChzaG9ydCAqKWFwLT5vYl9pdGVtKVtpXSA9IChzaG9ydCl4OwotCXJldHVybiAwOworICAgIGludCB4OworICAgIC8qIFB5QXJnX1BhcnNlJ3MgJ2gnIGZvcm1hdHRlciBpcyBmb3IgYSBzaWduZWQgc2hvcnQsIHRoZXJlZm9yZQorICAgICAgIG11c3QgdXNlIHRoZSBuZXh0IHNpemUgdXAgYW5kIG1hbnVhbGx5IGRvIHRoZSBvdmVyZmxvdyBjaGVja2luZyAqLworICAgIGlmICghUHlBcmdfUGFyc2UodiwgImk7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlIGlmICh4IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJ1bnNpZ25lZCBzaG9ydCBpcyBsZXNzIHRoYW4gbWluaW11bSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKHggPiBVU0hSVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAidW5zaWduZWQgc2hvcnQgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAoKHNob3J0ICopYXAtPm9iX2l0ZW0pW2ldID0gKHNob3J0KXg7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAoKGludCAqKWFwLT5vYl9pdGVtKVtpXSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAoKGludCAqKWFwLT5vYl9pdGVtKVtpXSk7CiB9CiAKIHN0YXRpYyBpbnQKIGlfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JaW50IHg7Ci0JLyogJ2knID09IHNpZ25lZCBpbnQsIG1hcHMgdG8gUHlBcmdfUGFyc2UncyAnaScgZm9ybWF0dGVyICovCi0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiaTthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ4KSkKLQkJcmV0dXJuIC0xOwotCWlmIChpID49IDApCi0JCSAgICAgKChpbnQgKilhcC0+b2JfaXRlbSlbaV0gPSB4OwotCXJldHVybiAwOworICAgIGludCB4OworICAgIC8qICdpJyA9PSBzaWduZWQgaW50LCBtYXBzIHRvIFB5QXJnX1BhcnNlJ3MgJ2knIGZvcm1hdHRlciAqLworICAgIGlmICghUHlBcmdfUGFyc2UodiwgImk7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgICAgICAoKGludCAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJSV9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygKLQkJKHVuc2lnbmVkIGxvbmcpICgodW5zaWduZWQgaW50ICopYXAtPm9iX2l0ZW0pW2ldKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoCisgICAgICAgICh1bnNpZ25lZCBsb25nKSAoKHVuc2lnbmVkIGludCAqKWFwLT5vYl9pdGVtKVtpXSk7CiB9CiAKIHN0YXRpYyBpbnQKIElJX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQlpZiAoUHlMb25nX0NoZWNrKHYpKSB7Ci0JCXggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7Ci0JCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIHsKLQkJbG9uZyB5OwotCQlpZiAoIVB5QXJnX1BhcnNlKHYsICJsO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJnkpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoeSA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJ1bnNpZ25lZCBpbnQgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQl4ID0gKHVuc2lnbmVkIGxvbmcpeTsKKyAgICB1bnNpZ25lZCBsb25nIHg7CisgICAgaWYgKFB5TG9uZ19DaGVjayh2KSkgeworICAgICAgICB4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHYpOworICAgICAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxvbmcgeTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAibDthcnJheSBpdGVtIG11c3QgYmUgaW50ZWdlciIsICZ5KSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHkgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAidW5zaWduZWQgaW50IGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgeCA9ICh1bnNpZ25lZCBsb25nKXk7CiAKLQl9Ci0JaWYgKHggPiBVSU5UX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJ1bnNpZ25lZCBpbnQgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICB9CisgICAgaWYgKHggPiBVSU5UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJ1bnNpZ25lZCBpbnQgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChpID49IDApCi0JCSgodW5zaWduZWQgaW50ICopYXAtPm9iX2l0ZW0pW2ldID0gKHVuc2lnbmVkIGludCl4OwotCXJldHVybiAwOworICAgIGlmIChpID49IDApCisgICAgICAgICgodW5zaWduZWQgaW50ICopYXAtPm9iX2l0ZW0pW2ldID0gKHVuc2lnbmVkIGludCl4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbF9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZygoKGxvbmcgKilhcC0+b2JfaXRlbSlbaV0pOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygoKGxvbmcgKilhcC0+b2JfaXRlbSlbaV0pOwogfQogCiBzdGF0aWMgaW50CiBsX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCWxvbmcgeDsKLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJsO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGkgPj0gMCkKLQkJICAgICAoKGxvbmcgKilhcC0+b2JfaXRlbSlbaV0gPSB4OwotCXJldHVybiAwOworICAgIGxvbmcgeDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJsO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJngpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgICAgICAgICAgKChsb25nICopYXAtPm9iX2l0ZW0pW2ldID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIExMX2dldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGkpCiB7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCgodW5zaWduZWQgbG9uZyAqKWFwLT5vYl9pdGVtKVtpXSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCgodW5zaWduZWQgbG9uZyAqKWFwLT5vYl9pdGVtKVtpXSk7CiB9CiAKIHN0YXRpYyBpbnQKIExMX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQlpZiAoUHlMb25nX0NoZWNrKHYpKSB7Ci0JCXggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7Ci0JCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIHsKLQkJbG9uZyB5OwotCQlpZiAoIVB5QXJnX1BhcnNlKHYsICJsO2FycmF5IGl0ZW0gbXVzdCBiZSBpbnRlZ2VyIiwgJnkpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoeSA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJ1bnNpZ25lZCBsb25nIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJeCA9ICh1bnNpZ25lZCBsb25nKXk7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKKyAgICAgICAgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2KTsKKyAgICAgICAgaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsb25nIHk7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UodiwgImw7YXJyYXkgaXRlbSBtdXN0IGJlIGludGVnZXIiLCAmeSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICh5IDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgInVuc2lnbmVkIGxvbmcgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB4ID0gKHVuc2lnbmVkIGxvbmcpeTsKIAotCX0KLQlpZiAoeCA+IFVMT05HX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJ1bnNpZ25lZCBsb25nIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgfQorICAgIGlmICh4ID4gVUxPTkdfTUFYKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInVuc2lnbmVkIGxvbmcgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChpID49IDApCi0JCSgodW5zaWduZWQgbG9uZyAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgKCh1bnNpZ25lZCBsb25nICopYXAtPm9iX2l0ZW0pW2ldID0geDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZfZ2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSkKIHsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpICgoZmxvYXQgKilhcC0+b2JfaXRlbSlbaV0pOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSkgKChmbG9hdCAqKWFwLT5vYl9pdGVtKVtpXSk7CiB9CiAKIHN0YXRpYyBpbnQKIGZfc2V0aXRlbShhcnJheW9iamVjdCAqYXAsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JZmxvYXQgeDsKLQlpZiAoIVB5QXJnX1BhcnNlKHYsICJmO2FycmF5IGl0ZW0gbXVzdCBiZSBmbG9hdCIsICZ4KSkKLQkJcmV0dXJuIC0xOwotCWlmIChpID49IDApCi0JCSAgICAgKChmbG9hdCAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7Ci0JcmV0dXJuIDA7CisgICAgZmxvYXQgeDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJmO2FycmF5IGl0ZW0gbXVzdCBiZSBmbG9hdCIsICZ4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChpID49IDApCisgICAgICAgICAgICAgICAgICgoZmxvYXQgKilhcC0+b2JfaXRlbSlbaV0gPSB4OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZF9nZXRpdGVtKGFycmF5b2JqZWN0ICphcCwgUHlfc3NpemVfdCBpKQogewotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKChkb3VibGUgKilhcC0+b2JfaXRlbSlbaV0pOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKChkb3VibGUgKilhcC0+b2JfaXRlbSlbaV0pOwogfQogCiBzdGF0aWMgaW50CiBkX3NldGl0ZW0oYXJyYXlvYmplY3QgKmFwLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICp2KQogewotCWRvdWJsZSB4OwotCWlmICghUHlBcmdfUGFyc2UodiwgImQ7YXJyYXkgaXRlbSBtdXN0IGJlIGZsb2F0IiwgJngpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGkgPj0gMCkKLQkJICAgICAoKGRvdWJsZSAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7Ci0JcmV0dXJuIDA7CisgICAgZG91YmxlIHg7CisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiZDthcnJheSBpdGVtIG11c3QgYmUgZmxvYXQiLCAmeCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgICAgICAoKGRvdWJsZSAqKWFwLT5vYl9pdGVtKVtpXSA9IHg7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIERlc2NyaXB0aW9uIG9mIHR5cGVzICovCiBzdGF0aWMgc3RydWN0IGFycmF5ZGVzY3IgZGVzY3JpcHRvcnNbXSA9IHsKLQl7J2MnLCBzaXplb2YoY2hhciksIGNfZ2V0aXRlbSwgY19zZXRpdGVtfSwKLQl7J2InLCBzaXplb2YoY2hhciksIGJfZ2V0aXRlbSwgYl9zZXRpdGVtfSwKLQl7J0InLCBzaXplb2YoY2hhciksIEJCX2dldGl0ZW0sIEJCX3NldGl0ZW19LAorICAgIHsnYycsIHNpemVvZihjaGFyKSwgY19nZXRpdGVtLCBjX3NldGl0ZW19LAorICAgIHsnYicsIHNpemVvZihjaGFyKSwgYl9nZXRpdGVtLCBiX3NldGl0ZW19LAorICAgIHsnQicsIHNpemVvZihjaGFyKSwgQkJfZ2V0aXRlbSwgQkJfc2V0aXRlbX0sCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCXsndScsIHNpemVvZihQeV9VTklDT0RFKSwgdV9nZXRpdGVtLCB1X3NldGl0ZW19LAorICAgIHsndScsIHNpemVvZihQeV9VTklDT0RFKSwgdV9nZXRpdGVtLCB1X3NldGl0ZW19LAogI2VuZGlmCi0JeydoJywgc2l6ZW9mKHNob3J0KSwgaF9nZXRpdGVtLCBoX3NldGl0ZW19LAotCXsnSCcsIHNpemVvZihzaG9ydCksIEhIX2dldGl0ZW0sIEhIX3NldGl0ZW19LAotCXsnaScsIHNpemVvZihpbnQpLCBpX2dldGl0ZW0sIGlfc2V0aXRlbX0sCi0JeydJJywgc2l6ZW9mKGludCksIElJX2dldGl0ZW0sIElJX3NldGl0ZW19LAotCXsnbCcsIHNpemVvZihsb25nKSwgbF9nZXRpdGVtLCBsX3NldGl0ZW19LAotCXsnTCcsIHNpemVvZihsb25nKSwgTExfZ2V0aXRlbSwgTExfc2V0aXRlbX0sCi0JeydmJywgc2l6ZW9mKGZsb2F0KSwgZl9nZXRpdGVtLCBmX3NldGl0ZW19LAotCXsnZCcsIHNpemVvZihkb3VibGUpLCBkX2dldGl0ZW0sIGRfc2V0aXRlbX0sCi0JeydcMCcsIDAsIDAsIDB9IC8qIFNlbnRpbmVsICovCisgICAgeydoJywgc2l6ZW9mKHNob3J0KSwgaF9nZXRpdGVtLCBoX3NldGl0ZW19LAorICAgIHsnSCcsIHNpemVvZihzaG9ydCksIEhIX2dldGl0ZW0sIEhIX3NldGl0ZW19LAorICAgIHsnaScsIHNpemVvZihpbnQpLCBpX2dldGl0ZW0sIGlfc2V0aXRlbX0sCisgICAgeydJJywgc2l6ZW9mKGludCksIElJX2dldGl0ZW0sIElJX3NldGl0ZW19LAorICAgIHsnbCcsIHNpemVvZihsb25nKSwgbF9nZXRpdGVtLCBsX3NldGl0ZW19LAorICAgIHsnTCcsIHNpemVvZihsb25nKSwgTExfZ2V0aXRlbSwgTExfc2V0aXRlbX0sCisgICAgeydmJywgc2l6ZW9mKGZsb2F0KSwgZl9nZXRpdGVtLCBmX3NldGl0ZW19LAorICAgIHsnZCcsIHNpemVvZihkb3VibGUpLCBkX2dldGl0ZW0sIGRfc2V0aXRlbX0sCisgICAgeydcMCcsIDAsIDAsIDB9IC8qIFNlbnRpbmVsICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDE1LDc4ICs0MTUsNzggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdhcnJheW9iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgc2l6ZSwgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyKQogewotCWFycmF5b2JqZWN0ICpvcDsKLQlzaXplX3QgbmJ5dGVzOworICAgIGFycmF5b2JqZWN0ICpvcDsKKyAgICBzaXplX3QgbmJ5dGVzOwogCi0JaWYgKHNpemUgPCAwKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluYnl0ZXMgPSBzaXplICogZGVzY3ItPml0ZW1zaXplOwotCS8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotCWlmIChuYnl0ZXMgLyBkZXNjci0+aXRlbXNpemUgIT0gKHNpemVfdClzaXplKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlvcCA9IChhcnJheW9iamVjdCAqKSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAob3AgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb3AtPm9iX2Rlc2NyID0gZGVzY3I7Ci0Jb3AtPmFsbG9jYXRlZCA9IHNpemU7Ci0Jb3AtPndlYWtyZWZsaXN0ID0gTlVMTDsKLQlQeV9TSVpFKG9wKSA9IHNpemU7Ci0JaWYgKHNpemUgPD0gMCkgewotCQlvcC0+b2JfaXRlbSA9IE5VTEw7Ci0JfQotCWVsc2UgewotCQlvcC0+b2JfaXRlbSA9IFB5TWVtX05FVyhjaGFyLCBuYnl0ZXMpOwotCQlpZiAob3AtPm9iX2l0ZW0gPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKG9wKTsKLQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQl9Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKikgb3A7CisgICAgbmJ5dGVzID0gc2l6ZSAqIGRlc2NyLT5pdGVtc2l6ZTsKKyAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICBpZiAobmJ5dGVzIC8gZGVzY3ItPml0ZW1zaXplICE9IChzaXplX3Qpc2l6ZSkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgb3AgPSAoYXJyYXlvYmplY3QgKikgdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKG9wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9wLT5vYl9kZXNjciA9IGRlc2NyOworICAgIG9wLT5hbGxvY2F0ZWQgPSBzaXplOworICAgIG9wLT53ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgUHlfU0laRShvcCkgPSBzaXplOworICAgIGlmIChzaXplIDw9IDApIHsKKyAgICAgICAgb3AtPm9iX2l0ZW0gPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgb3AtPm9iX2l0ZW0gPSBQeU1lbV9ORVcoY2hhciwgbmJ5dGVzKTsKKyAgICAgICAgaWYgKG9wLT5vYl9pdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvcCk7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9wOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0YXJyYXlpdGVtKFB5T2JqZWN0ICpvcCwgUHlfc3NpemVfdCBpKQogewotCXJlZ2lzdGVyIGFycmF5b2JqZWN0ICphcDsKLQlhc3NlcnQoYXJyYXlfQ2hlY2sob3ApKTsKLQlhcCA9IChhcnJheW9iamVjdCAqKW9wOwotCWFzc2VydChpPj0wICYmIGk8UHlfU0laRShhcCkpOwotCXJldHVybiAoKmFwLT5vYl9kZXNjci0+Z2V0aXRlbSkoYXAsIGkpOworICAgIHJlZ2lzdGVyIGFycmF5b2JqZWN0ICphcDsKKyAgICBhc3NlcnQoYXJyYXlfQ2hlY2sob3ApKTsKKyAgICBhcCA9IChhcnJheW9iamVjdCAqKW9wOworICAgIGFzc2VydChpPj0wICYmIGk8UHlfU0laRShhcCkpOworICAgIHJldHVybiAoKmFwLT5vYl9kZXNjci0+Z2V0aXRlbSkoYXAsIGkpOwogfQogCiBzdGF0aWMgaW50CiBpbnMxKGFycmF5b2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IHdoZXJlLCBQeU9iamVjdCAqdikKIHsKLQljaGFyICppdGVtczsKLQlQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKHNlbGYpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCgqc2VsZi0+b2JfZGVzY3ItPnNldGl0ZW0pKHNlbGYsIC0xLCB2KSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBjaGFyICppdGVtczsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKHNlbGYpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCgqc2VsZi0+b2JfZGVzY3ItPnNldGl0ZW0pKHNlbGYsIC0xLCB2KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmIChhcnJheV9yZXNpemUoc2VsZiwgbisxKSA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCWl0ZW1zID0gc2VsZi0+b2JfaXRlbTsKLQlpZiAod2hlcmUgPCAwKSB7Ci0JCXdoZXJlICs9IG47Ci0JCWlmICh3aGVyZSA8IDApCi0JCQl3aGVyZSA9IDA7Ci0JfQotCWlmICh3aGVyZSA+IG4pCi0JCXdoZXJlID0gbjsKLQkvKiBhcHBlbmRzIGRvbid0IG5lZWQgdG8gY2FsbCBtZW1tb3ZlKCkgKi8KLQlpZiAod2hlcmUgIT0gbikKLQkJbWVtbW92ZShpdGVtcyArICh3aGVyZSsxKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUsCi0JCQlpdGVtcyArIHdoZXJlKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLQkJCShuLXdoZXJlKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCXJldHVybiAoKnNlbGYtPm9iX2Rlc2NyLT5zZXRpdGVtKShzZWxmLCB3aGVyZSwgdik7CisgICAgaWYgKGFycmF5X3Jlc2l6ZShzZWxmLCBuKzEpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaXRlbXMgPSBzZWxmLT5vYl9pdGVtOworICAgIGlmICh3aGVyZSA8IDApIHsKKyAgICAgICAgd2hlcmUgKz0gbjsKKyAgICAgICAgaWYgKHdoZXJlIDwgMCkKKyAgICAgICAgICAgIHdoZXJlID0gMDsKKyAgICB9CisgICAgaWYgKHdoZXJlID4gbikKKyAgICAgICAgd2hlcmUgPSBuOworICAgIC8qIGFwcGVuZHMgZG9uJ3QgbmVlZCB0byBjYWxsIG1lbW1vdmUoKSAqLworICAgIGlmICh3aGVyZSAhPSBuKQorICAgICAgICBtZW1tb3ZlKGl0ZW1zICsgKHdoZXJlKzEpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgIGl0ZW1zICsgd2hlcmUqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplLAorICAgICAgICAgICAgKG4td2hlcmUpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgcmV0dXJuICgqc2VsZi0+b2JfZGVzY3ItPnNldGl0ZW0pKHNlbGYsIHdoZXJlLCB2KTsKIH0KIAogLyogTWV0aG9kcyAqLwpAQCAtNDk0LDE0MSArNDk0LDE0MSBAQAogc3RhdGljIHZvaWQKIGFycmF5X2RlYWxsb2MoYXJyYXlvYmplY3QgKm9wKQogewotCWlmIChvcC0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgb3ApOwotCWlmIChvcC0+b2JfaXRlbSAhPSBOVUxMKQotCQlQeU1lbV9ERUwob3AtPm9iX2l0ZW0pOwotCVB5X1RZUEUob3ApLT50cF9mcmVlKChQeU9iamVjdCAqKW9wKTsKKyAgICBpZiAob3AtPndlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIG9wKTsKKyAgICBpZiAob3AtPm9iX2l0ZW0gIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fREVMKG9wLT5vYl9pdGVtKTsKKyAgICBQeV9UWVBFKG9wKS0+dHBfZnJlZSgoUHlPYmplY3QgKilvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9yaWNoY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlhcnJheW9iamVjdCAqdmEsICp3YTsKLQlQeU9iamVjdCAqdmkgPSBOVUxMOwotCVB5T2JqZWN0ICp3aSA9IE5VTEw7Ci0JUHlfc3NpemVfdCBpLCBrOwotCVB5T2JqZWN0ICpyZXM7CisgICAgYXJyYXlvYmplY3QgKnZhLCAqd2E7CisgICAgUHlPYmplY3QgKnZpID0gTlVMTDsKKyAgICBQeU9iamVjdCAqd2kgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgazsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKCFhcnJheV9DaGVjayh2KSB8fCAhYXJyYXlfQ2hlY2sodykpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KKyAgICBpZiAoIWFycmF5X0NoZWNrKHYpIHx8ICFhcnJheV9DaGVjayh3KSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JdmEgPSAoYXJyYXlvYmplY3QgKil2OwotCXdhID0gKGFycmF5b2JqZWN0ICopdzsKKyAgICB2YSA9IChhcnJheW9iamVjdCAqKXY7CisgICAgd2EgPSAoYXJyYXlvYmplY3QgKil3OwogCi0JaWYgKFB5X1NJWkUodmEpICE9IFB5X1NJWkUod2EpICYmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkpIHsKLQkJLyogU2hvcnRjdXQ6IGlmIHRoZSBsZW5ndGhzIGRpZmZlciwgdGhlIGFycmF5cyBkaWZmZXIgKi8KLQkJaWYgKG9wID09IFB5X0VRKQotCQkJcmVzID0gUHlfRmFsc2U7Ci0JCWVsc2UKLQkJCXJlcyA9IFB5X1RydWU7Ci0JCVB5X0lOQ1JFRihyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KKyAgICBpZiAoUHlfU0laRSh2YSkgIT0gUHlfU0laRSh3YSkgJiYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSkgeworICAgICAgICAvKiBTaG9ydGN1dDogaWYgdGhlIGxlbmd0aHMgZGlmZmVyLCB0aGUgYXJyYXlzIGRpZmZlciAqLworICAgICAgICBpZiAob3AgPT0gUHlfRVEpCisgICAgICAgICAgICByZXMgPSBQeV9GYWxzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gUHlfVHJ1ZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCi0JLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgaW5kZXggd2hlcmUgaXRlbXMgYXJlIGRpZmZlcmVudCAqLwotCWsgPSAxOwotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHZhKSAmJiBpIDwgUHlfU0laRSh3YSk7IGkrKykgewotCQl2aSA9IGdldGFycmF5aXRlbSh2LCBpKTsKLQkJd2kgPSBnZXRhcnJheWl0ZW0odywgaSk7Ci0JCWlmICh2aSA9PSBOVUxMIHx8IHdpID09IE5VTEwpIHsKLQkJCVB5X1hERUNSRUYodmkpOwotCQkJUHlfWERFQ1JFRih3aSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlrID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHZpLCB3aSwgUHlfRVEpOwotCQlpZiAoayA9PSAwKQotCQkJYnJlYWs7IC8qIEtlZXBpbmcgdmkgYW5kIHdpIGFsaXZlISAqLwotCQlQeV9ERUNSRUYodmkpOwotCQlQeV9ERUNSRUYod2kpOwotCQlpZiAoayA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgaW5kZXggd2hlcmUgaXRlbXMgYXJlIGRpZmZlcmVudCAqLworICAgIGsgPSAxOworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHZhKSAmJiBpIDwgUHlfU0laRSh3YSk7IGkrKykgeworICAgICAgICB2aSA9IGdldGFycmF5aXRlbSh2LCBpKTsKKyAgICAgICAgd2kgPSBnZXRhcnJheWl0ZW0odywgaSk7CisgICAgICAgIGlmICh2aSA9PSBOVUxMIHx8IHdpID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodmkpOworICAgICAgICAgICAgUHlfWERFQ1JFRih3aSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBrID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHZpLCB3aSwgUHlfRVEpOworICAgICAgICBpZiAoayA9PSAwKQorICAgICAgICAgICAgYnJlYWs7IC8qIEtlZXBpbmcgdmkgYW5kIHdpIGFsaXZlISAqLworICAgICAgICBQeV9ERUNSRUYodmkpOworICAgICAgICBQeV9ERUNSRUYod2kpOworICAgICAgICBpZiAoayA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoaykgewotCQkvKiBObyBtb3JlIGl0ZW1zIHRvIGNvbXBhcmUgLS0gY29tcGFyZSBzaXplcyAqLwotCQlQeV9zc2l6ZV90IHZzID0gUHlfU0laRSh2YSk7Ci0JCVB5X3NzaXplX3Qgd3MgPSBQeV9TSVpFKHdhKTsKLQkJaW50IGNtcDsKLQkJc3dpdGNoIChvcCkgewotCQljYXNlIFB5X0xUOiBjbXAgPSB2cyA8ICB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfTEU6IGNtcCA9IHZzIDw9IHdzOyBicmVhazsKLQkJY2FzZSBQeV9FUTogY21wID0gdnMgPT0gd3M7IGJyZWFrOwotCQljYXNlIFB5X05FOiBjbXAgPSB2cyAhPSB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfR1Q6IGNtcCA9IHZzID4gIHdzOyBicmVhazsKLQkJY2FzZSBQeV9HRTogY21wID0gdnMgPj0gd3M7IGJyZWFrOwotCQlkZWZhdWx0OiByZXR1cm4gTlVMTDsgLyogY2Fubm90IGhhcHBlbiAqLwotCQl9Ci0JCWlmIChjbXApCi0JCQlyZXMgPSBQeV9UcnVlOwotCQllbHNlCi0JCQlyZXMgPSBQeV9GYWxzZTsKLQkJUHlfSU5DUkVGKHJlcyk7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIGlmIChrKSB7CisgICAgICAgIC8qIE5vIG1vcmUgaXRlbXMgdG8gY29tcGFyZSAtLSBjb21wYXJlIHNpemVzICovCisgICAgICAgIFB5X3NzaXplX3QgdnMgPSBQeV9TSVpFKHZhKTsKKyAgICAgICAgUHlfc3NpemVfdCB3cyA9IFB5X1NJWkUod2EpOworICAgICAgICBpbnQgY21wOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgUHlfTFQ6IGNtcCA9IHZzIDwgIHdzOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9MRTogY21wID0gdnMgPD0gd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0VROiBjbXAgPSB2cyA9PSB3czsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTkU6IGNtcCA9IHZzICE9IHdzOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9HVDogY21wID0gdnMgPiAgd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dFOiBjbXAgPSB2cyA+PSB3czsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBjYW5ub3QgaGFwcGVuICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCkKKyAgICAgICAgICAgIHJlcyA9IFB5X1RydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFB5X0ZhbHNlOworICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQkvKiBXZSBoYXZlIGFuIGl0ZW0gdGhhdCBkaWZmZXJzLiAgRmlyc3QsIHNob3J0Y3V0cyBmb3IgRVEvTkUgKi8KLQlpZiAob3AgPT0gUHlfRVEpIHsKLQkJUHlfSU5DUkVGKFB5X0ZhbHNlKTsKLQkJcmVzID0gUHlfRmFsc2U7Ci0JfQotCWVsc2UgaWYgKG9wID09IFB5X05FKSB7Ci0JCVB5X0lOQ1JFRihQeV9UcnVlKTsKLQkJcmVzID0gUHlfVHJ1ZTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIENvbXBhcmUgdGhlIGZpbmFsIGl0ZW0gYWdhaW4gdXNpbmcgdGhlIHByb3BlciBvcGVyYXRvciAqLwotCQlyZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZSh2aSwgd2ksIG9wKTsKLQl9Ci0JUHlfREVDUkVGKHZpKTsKLQlQeV9ERUNSRUYod2kpOwotCXJldHVybiByZXM7CisgICAgLyogV2UgaGF2ZSBhbiBpdGVtIHRoYXQgZGlmZmVycy4gIEZpcnN0LCBzaG9ydGN1dHMgZm9yIEVRL05FICovCisgICAgaWYgKG9wID09IFB5X0VRKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgICAgIHJlcyA9IFB5X0ZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmIChvcCA9PSBQeV9ORSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfVHJ1ZSk7CisgICAgICAgIHJlcyA9IFB5X1RydWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBDb21wYXJlIHRoZSBmaW5hbCBpdGVtIGFnYWluIHVzaW5nIHRoZSBwcm9wZXIgb3BlcmF0b3IgKi8KKyAgICAgICAgcmVzID0gUHlPYmplY3RfUmljaENvbXBhcmUodmksIHdpLCBvcCk7CisgICAgfQorICAgIFB5X0RFQ1JFRih2aSk7CisgICAgUHlfREVDUkVGKHdpKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogYXJyYXlfbGVuZ3RoKGFycmF5b2JqZWN0ICphKQogewotCXJldHVybiBQeV9TSVpFKGEpOworICAgIHJldHVybiBQeV9TSVpFKGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfaXRlbShhcnJheW9iamVjdCAqYSwgUHlfc3NpemVfdCBpKQogewotCWlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJhcnJheSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopYSwgaSk7CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImFycmF5IGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilhLCBpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3NsaWNlKGFycmF5b2JqZWN0ICphLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gpCiB7Ci0JYXJyYXlvYmplY3QgKm5wOwotCWlmIChpbG93IDwgMCkKLQkJaWxvdyA9IDA7Ci0JZWxzZSBpZiAoaWxvdyA+IFB5X1NJWkUoYSkpCi0JCWlsb3cgPSBQeV9TSVpFKGEpOwotCWlmIChpaGlnaCA8IDApCi0JCWloaWdoID0gMDsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JZWxzZSBpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQotCQlpaGlnaCA9IFB5X1NJWkUoYSk7Ci0JbnAgPSAoYXJyYXlvYmplY3QgKikgbmV3YXJyYXlvYmplY3QoJkFycmF5dHlwZSwgaWhpZ2ggLSBpbG93LCBhLT5vYl9kZXNjcik7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1lbWNweShucC0+b2JfaXRlbSwgYS0+b2JfaXRlbSArIGlsb3cgKiBhLT5vYl9kZXNjci0+aXRlbXNpemUsCi0JICAgICAgIChpaGlnaC1pbG93KSAqIGEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5wOworICAgIGFycmF5b2JqZWN0ICpucDsKKyAgICBpZiAoaWxvdyA8IDApCisgICAgICAgIGlsb3cgPSAwOworICAgIGVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQorICAgICAgICBpbG93ID0gUHlfU0laRShhKTsKKyAgICBpZiAoaWhpZ2ggPCAwKQorICAgICAgICBpaGlnaCA9IDA7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGVsc2UgaWYgKGloaWdoID4gUHlfU0laRShhKSkKKyAgICAgICAgaWhpZ2ggPSBQeV9TSVpFKGEpOworICAgIG5wID0gKGFycmF5b2JqZWN0ICopIG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIGloaWdoIC0gaWxvdywgYS0+b2JfZGVzY3IpOworICAgIGlmIChucCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1jcHkobnAtPm9iX2l0ZW0sIGEtPm9iX2l0ZW0gKyBpbG93ICogYS0+b2JfZGVzY3ItPml0ZW1zaXplLAorICAgICAgICAgICAoaWhpZ2gtaWxvdykgKiBhLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgIHJldHVybiAoUHlPYmplY3QgKilucDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2NvcHkoYXJyYXlvYmplY3QgKmEsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JcmV0dXJuIGFycmF5X3NsaWNlKGEsIDAsIFB5X1NJWkUoYSkpOworICAgIHJldHVybiBhcnJheV9zbGljZShhLCAwLCBQeV9TSVpFKGEpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvcHlfZG9jLApAQCAtNjM5LDI5NyArNjM5LDI5NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2NvbmNhdChhcnJheW9iamVjdCAqYSwgUHlPYmplY3QgKmJiKQogewotCVB5X3NzaXplX3Qgc2l6ZTsKLQlhcnJheW9iamVjdCAqbnA7Ci0JaWYgKCFhcnJheV9DaGVjayhiYikpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiY2FuIG9ubHkgYXBwZW5kIGFycmF5IChub3QgXCIlLjIwMHNcIikgdG8gYXJyYXkiLAotCQkJICAgICBQeV9UWVBFKGJiKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgYXJyYXlvYmplY3QgKm5wOworICAgIGlmICghYXJyYXlfQ2hlY2soYmIpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgImNhbiBvbmx5IGFwcGVuZCBhcnJheSAobm90IFwiJS4yMDBzXCIpIHRvIGFycmF5IiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRShiYiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZGVmaW5lIGIgKChhcnJheW9iamVjdCAqKWJiKQotCWlmIChhLT5vYl9kZXNjciAhPSBiLT5vYl9kZXNjcikgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5X1NJWkUoYSkgPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoYikpIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCXNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKLQlucCA9IChhcnJheW9iamVjdCAqKSBuZXdhcnJheW9iamVjdCgmQXJyYXl0eXBlLCBzaXplLCBhLT5vYl9kZXNjcik7Ci0JaWYgKG5wID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbWNweShucC0+b2JfaXRlbSwgYS0+b2JfaXRlbSwgUHlfU0laRShhKSphLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCW1lbWNweShucC0+b2JfaXRlbSArIFB5X1NJWkUoYSkqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAotCSAgICAgICBiLT5vYl9pdGVtLCBQeV9TSVpFKGIpKmItPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5wOworICAgIGlmIChhLT5vYl9kZXNjciAhPSBiLT5vYl9kZXNjcikgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5X1NJWkUoYSkgPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoYikpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIHNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKKyAgICBucCA9IChhcnJheW9iamVjdCAqKSBuZXdhcnJheW9iamVjdCgmQXJyYXl0eXBlLCBzaXplLCBhLT5vYl9kZXNjcik7CisgICAgaWYgKG5wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbWNweShucC0+b2JfaXRlbSwgYS0+b2JfaXRlbSwgUHlfU0laRShhKSphLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgIG1lbWNweShucC0+b2JfaXRlbSArIFB5X1NJWkUoYSkqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAorICAgICAgICAgICBiLT5vYl9pdGVtLCBQeV9TSVpFKGIpKmItPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5wOwogI3VuZGVmIGIKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3JlcGVhdChhcnJheW9iamVjdCAqYSwgUHlfc3NpemVfdCBuKQogewotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JYXJyYXlvYmplY3QgKm5wOwotCWNoYXIgKnA7Ci0JUHlfc3NpemVfdCBuYnl0ZXM7Ci0JaWYgKG4gPCAwKQotCQluID0gMDsKLQlpZiAoKFB5X1NJWkUoYSkgIT0gMCkgJiYgKG4gPiBQWV9TU0laRV9UX01BWCAvIFB5X1NJWkUoYSkpKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlzaXplID0gUHlfU0laRShhKSAqIG47Ci0JbnAgPSAoYXJyYXlvYmplY3QgKikgbmV3YXJyYXlvYmplY3QoJkFycmF5dHlwZSwgc2l6ZSwgYS0+b2JfZGVzY3IpOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gbnAtPm9iX2l0ZW07Ci0JbmJ5dGVzID0gUHlfU0laRShhKSAqIGEtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCW1lbWNweShwLCBhLT5vYl9pdGVtLCBuYnl0ZXMpOwotCQlwICs9IG5ieXRlczsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBucDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGFycmF5b2JqZWN0ICpucDsKKyAgICBjaGFyICpwOworICAgIFB5X3NzaXplX3QgbmJ5dGVzOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgbiA9IDA7CisgICAgaWYgKChQeV9TSVpFKGEpICE9IDApICYmIChuID4gUFlfU1NJWkVfVF9NQVggLyBQeV9TSVpFKGEpKSkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKiBuOworICAgIG5wID0gKGFycmF5b2JqZWN0ICopIG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIHNpemUsIGEtPm9iX2Rlc2NyKTsKKyAgICBpZiAobnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IG5wLT5vYl9pdGVtOworICAgIG5ieXRlcyA9IFB5X1NJWkUoYSkgKiBhLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBtZW1jcHkocCwgYS0+b2JfaXRlbSwgbmJ5dGVzKTsKKyAgICAgICAgcCArPSBuYnl0ZXM7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgbnA7CiB9CiAKIHN0YXRpYyBpbnQKIGFycmF5X2Fzc19zbGljZShhcnJheW9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoLCBQeU9iamVjdCAqdikKIHsKLQljaGFyICppdGVtOwotCVB5X3NzaXplX3QgbjsgLyogU2l6ZSBvZiByZXBsYWNlbWVudCBhcnJheSAqLwotCVB5X3NzaXplX3QgZDsgLyogQ2hhbmdlIGluIHNpemUgKi8KKyAgICBjaGFyICppdGVtOworICAgIFB5X3NzaXplX3QgbjsgLyogU2l6ZSBvZiByZXBsYWNlbWVudCBhcnJheSAqLworICAgIFB5X3NzaXplX3QgZDsgLyogQ2hhbmdlIGluIHNpemUgKi8KICNkZWZpbmUgYiAoKGFycmF5b2JqZWN0ICopdikKLQlpZiAodiA9PSBOVUxMKQotCQluID0gMDsKLQllbHNlIGlmIChhcnJheV9DaGVjayh2KSkgewotCQluID0gUHlfU0laRShiKTsKLQkJaWYgKGEgPT0gYikgewotCQkJLyogU3BlY2lhbCBjYXNlICJhW2k6al0gPSBhIiAtLSBjb3B5IGIgZmlyc3QgKi8KLQkJCWludCByZXQ7Ci0JCQl2ID0gYXJyYXlfc2xpY2UoYiwgMCwgbik7Ci0JCQlpZiAoIXYpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0ID0gYXJyYXlfYXNzX3NsaWNlKGEsIGlsb3csIGloaWdoLCB2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJaWYgKGItPm9iX2Rlc2NyICE9IGEtPm9iX2Rlc2NyKSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCSAgICAgImNhbiBvbmx5IGFzc2lnbiBhcnJheSAobm90IFwiJS4yMDBzXCIpIHRvIGFycmF5IHNsaWNlIiwKLQkJCSAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQllbHNlIGlmIChpbG93ID4gUHlfU0laRShhKSkKLQkJaWxvdyA9IFB5X1NJWkUoYSk7Ci0JaWYgKGloaWdoIDwgMCkKLQkJaWhpZ2ggPSAwOwotCWlmIChpaGlnaCA8IGlsb3cpCi0JCWloaWdoID0gaWxvdzsKLQllbHNlIGlmIChpaGlnaCA+IFB5X1NJWkUoYSkpCi0JCWloaWdoID0gUHlfU0laRShhKTsKLQlpdGVtID0gYS0+b2JfaXRlbTsKLQlkID0gbiAtIChpaGlnaC1pbG93KTsKLQlpZiAoZCA8IDApIHsgLyogRGVsZXRlIC1kIGl0ZW1zICovCi0JCW1lbW1vdmUoaXRlbSArIChpaGlnaCtkKSphLT5vYl9kZXNjci0+aXRlbXNpemUsCi0JCQlpdGVtICsgaWhpZ2gqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAotCQkJKFB5X1NJWkUoYSktaWhpZ2gpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0JCVB5X1NJWkUoYSkgKz0gZDsKLQkJUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIFB5X1NJWkUoYSkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQkJCQkJCS8qIENhbid0IGZhaWwgKi8KLQkJYS0+b2JfaXRlbSA9IGl0ZW07Ci0JCWEtPmFsbG9jYXRlZCA9IFB5X1NJWkUoYSk7Ci0JfQotCWVsc2UgaWYgKGQgPiAwKSB7IC8qIEluc2VydCBkIGl0ZW1zICovCi0JCVB5TWVtX1JFU0laRShpdGVtLCBjaGFyLAotCQkJICAgICAoUHlfU0laRShhKSArIGQpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbWVtbW92ZShpdGVtICsgKGloaWdoK2QpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLQkJCWl0ZW0gKyBpaGlnaCphLT5vYl9kZXNjci0+aXRlbXNpemUsCi0JCQkoUHlfU0laRShhKS1paGlnaCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKLQkJYS0+b2JfaXRlbSA9IGl0ZW07Ci0JCVB5X1NJWkUoYSkgKz0gZDsKLQkJYS0+YWxsb2NhdGVkID0gUHlfU0laRShhKTsKLQl9Ci0JaWYgKG4gPiAwKQotCQltZW1jcHkoaXRlbSArIGlsb3cqYS0+b2JfZGVzY3ItPml0ZW1zaXplLCBiLT5vYl9pdGVtLAotCQkgICAgICAgbipiLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCXJldHVybiAwOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIG4gPSAwOworICAgIGVsc2UgaWYgKGFycmF5X0NoZWNrKHYpKSB7CisgICAgICAgIG4gPSBQeV9TSVpFKGIpOworICAgICAgICBpZiAoYSA9PSBiKSB7CisgICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2UgImFbaTpqXSA9IGEiIC0tIGNvcHkgYiBmaXJzdCAqLworICAgICAgICAgICAgaW50IHJldDsKKyAgICAgICAgICAgIHYgPSBhcnJheV9zbGljZShiLCAwLCBuKTsKKyAgICAgICAgICAgIGlmICghdikKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXQgPSBhcnJheV9hc3Nfc2xpY2UoYSwgaWxvdywgaWhpZ2gsIHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYi0+b2JfZGVzY3IgIT0gYS0+b2JfZGVzY3IpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAiY2FuIG9ubHkgYXNzaWduIGFycmF5IChub3QgXCIlLjIwMHNcIikgdG8gYXJyYXkgc2xpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgZWxzZSBpZiAoaWxvdyA+IFB5X1NJWkUoYSkpCisgICAgICAgIGlsb3cgPSBQeV9TSVpFKGEpOworICAgIGlmIChpaGlnaCA8IDApCisgICAgICAgIGloaWdoID0gMDsKKyAgICBpZiAoaWhpZ2ggPCBpbG93KQorICAgICAgICBpaGlnaCA9IGlsb3c7CisgICAgZWxzZSBpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQorICAgICAgICBpaGlnaCA9IFB5X1NJWkUoYSk7CisgICAgaXRlbSA9IGEtPm9iX2l0ZW07CisgICAgZCA9IG4gLSAoaWhpZ2gtaWxvdyk7CisgICAgaWYgKGQgPCAwKSB7IC8qIERlbGV0ZSAtZCBpdGVtcyAqLworICAgICAgICBtZW1tb3ZlKGl0ZW0gKyAoaWhpZ2grZCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplLAorICAgICAgICAgICAgaXRlbSArIGloaWdoKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgIChQeV9TSVpFKGEpLWloaWdoKSphLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgICAgICBQeV9TSVpFKGEpICs9IGQ7CisgICAgICAgIFB5TWVtX1JFU0laRShpdGVtLCBjaGFyLCBQeV9TSVpFKGEpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgZmFpbCAqLworICAgICAgICBhLT5vYl9pdGVtID0gaXRlbTsKKyAgICAgICAgYS0+YWxsb2NhdGVkID0gUHlfU0laRShhKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZCA+IDApIHsgLyogSW5zZXJ0IGQgaXRlbXMgKi8KKyAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAoUHlfU0laRShhKSArIGQpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtbW92ZShpdGVtICsgKGloaWdoK2QpKmEtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgIGl0ZW0gKyBpaGlnaCphLT5vYl9kZXNjci0+aXRlbXNpemUsCisgICAgICAgICAgICAoUHlfU0laRShhKS1paGlnaCkqYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICAgICAgYS0+b2JfaXRlbSA9IGl0ZW07CisgICAgICAgIFB5X1NJWkUoYSkgKz0gZDsKKyAgICAgICAgYS0+YWxsb2NhdGVkID0gUHlfU0laRShhKTsKKyAgICB9CisgICAgaWYgKG4gPiAwKQorICAgICAgICBtZW1jcHkoaXRlbSArIGlsb3cqYS0+b2JfZGVzY3ItPml0ZW1zaXplLCBiLT5vYl9pdGVtLAorICAgICAgICAgICAgICAgbipiLT5vYl9kZXNjci0+aXRlbXNpemUpOworICAgIHJldHVybiAwOwogI3VuZGVmIGIKIH0KIAogc3RhdGljIGludAogYXJyYXlfYXNzX2l0ZW0oYXJyYXlvYmplY3QgKmEsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCSAgICAgICAgICJhcnJheSBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBhcnJheV9hc3Nfc2xpY2UoYSwgaSwgaSsxLCB2KTsKLQlyZXR1cm4gKCphLT5vYl9kZXNjci0+c2V0aXRlbSkoYSwgaSwgdik7CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gYXJyYXlfYXNzX3NsaWNlKGEsIGksIGkrMSwgdik7CisgICAgcmV0dXJuICgqYS0+b2JfZGVzY3ItPnNldGl0ZW0pKGEsIGksIHYpOwogfQogCiBzdGF0aWMgaW50CiBzZXRhcnJheWl0ZW0oUHlPYmplY3QgKmEsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JYXNzZXJ0KGFycmF5X0NoZWNrKGEpKTsKLQlyZXR1cm4gYXJyYXlfYXNzX2l0ZW0oKGFycmF5b2JqZWN0ICopYSwgaSwgdik7CisgICAgYXNzZXJ0KGFycmF5X0NoZWNrKGEpKTsKKyAgICByZXR1cm4gYXJyYXlfYXNzX2l0ZW0oKGFycmF5b2JqZWN0ICopYSwgaSwgdik7CiB9CiAKIHN0YXRpYyBpbnQKIGFycmF5X2l0ZXJfZXh0ZW5kKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYmIpCiB7Ci0JUHlPYmplY3QgKml0LCAqdjsKKyAgICBQeU9iamVjdCAqaXQsICp2OwogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKGJiKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihiYik7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXdoaWxlICgodiA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQlpZiAoaW5zMShzZWxmLCAoaW50KSBQeV9TSVpFKHNlbGYpLCB2KSAhPSAwKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JUHlfREVDUkVGKGl0KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIHdoaWxlICgodiA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoaW5zMShzZWxmLCAoaW50KSBQeV9TSVpFKHNlbGYpLCB2KSAhPSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBhcnJheV9kb19leHRlbmQoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpiYikKIHsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JY2hhciAqb2xkX2l0ZW07CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGNoYXIgKm9sZF9pdGVtOwogCi0JaWYgKCFhcnJheV9DaGVjayhiYikpCi0JCXJldHVybiBhcnJheV9pdGVyX2V4dGVuZChzZWxmLCBiYik7CisgICAgaWYgKCFhcnJheV9DaGVjayhiYikpCisgICAgICAgIHJldHVybiBhcnJheV9pdGVyX2V4dGVuZChzZWxmLCBiYik7CiAjZGVmaW5lIGIgKChhcnJheW9iamVjdCAqKWJiKQotCWlmIChzZWxmLT5vYl9kZXNjciAhPSBiLT5vYl9kZXNjcikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY2FuIG9ubHkgZXh0ZW5kIHdpdGggYXJyYXkgb2Ygc2FtZSBraW5kIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKChQeV9TSVpFKHNlbGYpID4gUFlfU1NJWkVfVF9NQVggLSBQeV9TSVpFKGIpKSB8fAotCQkoKFB5X1NJWkUoc2VsZikgKyBQeV9TSVpFKGIpKSA+IFBZX1NTSVpFX1RfTUFYIC8gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNpemUgPSBQeV9TSVpFKHNlbGYpICsgUHlfU0laRShiKTsKLQlvbGRfaXRlbSA9IHNlbGYtPm9iX2l0ZW07Ci0gICAgICAgIFB5TWVtX1JFU0laRShzZWxmLT5vYl9pdGVtLCBjaGFyLCBzaXplKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7Ci0gICAgICAgIGlmIChzZWxmLT5vYl9pdGVtID09IE5VTEwpIHsKLQkJc2VsZi0+b2JfaXRlbSA9IG9sZF9pdGVtOwotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gLTE7Ci0gICAgICAgIH0KLQltZW1jcHkoc2VsZi0+b2JfaXRlbSArIFB5X1NJWkUoc2VsZikqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplLAotICAgICAgICAgICAgICAgYi0+b2JfaXRlbSwgUHlfU0laRShiKSpiLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCVB5X1NJWkUoc2VsZikgPSBzaXplOwotCXNlbGYtPmFsbG9jYXRlZCA9IHNpemU7CisgICAgaWYgKHNlbGYtPm9iX2Rlc2NyICE9IGItPm9iX2Rlc2NyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuIG9ubHkgZXh0ZW5kIHdpdGggYXJyYXkgb2Ygc2FtZSBraW5kIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChQeV9TSVpFKHNlbGYpID4gUFlfU1NJWkVfVF9NQVggLSBQeV9TSVpFKGIpKSB8fAorICAgICAgICAoKFB5X1NJWkUoc2VsZikgKyBQeV9TSVpFKGIpKSA+IFBZX1NTSVpFX1RfTUFYIC8gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNpemUgPSBQeV9TSVpFKHNlbGYpICsgUHlfU0laRShiKTsKKyAgICBvbGRfaXRlbSA9IHNlbGYtPm9iX2l0ZW07CisgICAgUHlNZW1fUkVTSVpFKHNlbGYtPm9iX2l0ZW0sIGNoYXIsIHNpemUqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICBpZiAoc2VsZi0+b2JfaXRlbSA9PSBOVUxMKSB7CisgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBvbGRfaXRlbTsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1jcHkoc2VsZi0+b2JfaXRlbSArIFB5X1NJWkUoc2VsZikqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplLAorICAgICAgICAgICBiLT5vYl9pdGVtLCBQeV9TSVpFKGIpKmItPm9iX2Rlc2NyLT5pdGVtc2l6ZSk7CisgICAgUHlfU0laRShzZWxmKSA9IHNpemU7CisgICAgc2VsZi0+YWxsb2NhdGVkID0gc2l6ZTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogI3VuZGVmIGIKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2lucGxhY2VfY29uY2F0KGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYmIpCiB7Ci0JaWYgKCFhcnJheV9DaGVjayhiYikpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJjYW4gb25seSBleHRlbmQgYXJyYXkgd2l0aCBhcnJheSAobm90IFwiJS4yMDBzXCIpIiwKLQkJCVB5X1RZUEUoYmIpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChhcnJheV9kb19leHRlbmQoc2VsZiwgYmIpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoc2VsZik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgaWYgKCFhcnJheV9DaGVjayhiYikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJjYW4gb25seSBleHRlbmQgYXJyYXkgd2l0aCBhcnJheSAobm90IFwiJS4yMDBzXCIpIiwKKyAgICAgICAgICAgIFB5X1RZUEUoYmIpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChhcnJheV9kb19leHRlbmQoc2VsZiwgYmIpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9pbnBsYWNlX3JlcGVhdChhcnJheW9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBuKQogewotCWNoYXIgKml0ZW1zLCAqcDsKLQlQeV9zc2l6ZV90IHNpemUsIGk7CisgICAgY2hhciAqaXRlbXMsICpwOworICAgIFB5X3NzaXplX3Qgc2l6ZSwgaTsKIAotCWlmIChQeV9TSVpFKHNlbGYpID4gMCkgewotCQlpZiAobiA8IDApCi0JCQluID0gMDsKLQkJaXRlbXMgPSBzZWxmLT5vYl9pdGVtOwotCQlpZiAoKHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSAhPSAwKSAmJiAKLQkJCShQeV9TSVpFKHNlbGYpID4gUFlfU1NJWkVfVF9NQVggLyBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpKSB7Ci0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJfQotCQlzaXplID0gUHlfU0laRShzZWxmKSAqIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLQkJaWYgKG4gPT0gMCkgewotCQkJUHlNZW1fRlJFRShpdGVtcyk7Ci0JCQlzZWxmLT5vYl9pdGVtID0gTlVMTDsKLQkJCVB5X1NJWkUoc2VsZikgPSAwOwotCQkJc2VsZi0+YWxsb2NhdGVkID0gMDsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLyBuKSB7Ci0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCQl9Ci0JCQlQeU1lbV9SRVNJWkUoaXRlbXMsIGNoYXIsIG4gKiBzaXplKTsKLQkJCWlmIChpdGVtcyA9PSBOVUxMKQotCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQkJcCA9IGl0ZW1zOwotCQkJZm9yIChpID0gMTsgaSA8IG47IGkrKykgewotCQkJCXAgKz0gc2l6ZTsKLQkJCQltZW1jcHkocCwgaXRlbXMsIHNpemUpOwotCQkJfQotCQkJc2VsZi0+b2JfaXRlbSA9IGl0ZW1zOwotCQkJUHlfU0laRShzZWxmKSAqPSBuOwotCQkJc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKLQkJfQotCX0KLQlQeV9JTkNSRUYoc2VsZik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgaWYgKFB5X1NJWkUoc2VsZikgPiAwKSB7CisgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgIG4gPSAwOworICAgICAgICBpdGVtcyA9IHNlbGYtPm9iX2l0ZW07CisgICAgICAgIGlmICgoc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplICE9IDApICYmCisgICAgICAgICAgICAoUHlfU0laRShzZWxmKSA+IFBZX1NTSVpFX1RfTUFYIC8gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA9IFB5X1NJWkUoc2VsZikgKiBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIFB5TWVtX0ZSRUUoaXRlbXMpOworICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSA9IE5VTEw7CisgICAgICAgICAgICBQeV9TSVpFKHNlbGYpID0gMDsKKyAgICAgICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gbikgeworICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW1zLCBjaGFyLCBuICogc2l6ZSk7CisgICAgICAgICAgICBpZiAoaXRlbXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHAgPSBpdGVtczsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwICs9IHNpemU7CisgICAgICAgICAgICAgICAgbWVtY3B5KHAsIGl0ZW1zLCBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtczsKKyAgICAgICAgICAgIFB5X1NJWkUoc2VsZikgKj0gbjsKKyAgICAgICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnMoYXJyYXlvYmplY3QgKnNlbGYsIFB5X3NzaXplX3Qgd2hlcmUsIFB5T2JqZWN0ICp2KQogewotCWlmIChpbnMxKHNlbGYsIHdoZXJlLCB2KSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGluczEoc2VsZiwgd2hlcmUsIHYpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2NvdW50KGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IGNvdW50ID0gMDsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBjb3VudCA9IDA7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgewotCQlQeU9iamVjdCAqc2VsZmkgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSk7Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZmksIHYsIFB5X0VRKTsKLQkJUHlfREVDUkVGKHNlbGZpKTsKLQkJaWYgKGNtcCA+IDApCi0JCQljb3VudCsrOwotCQllbHNlIGlmIChjbXAgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqc2VsZmkgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSk7CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZmksIHYsIFB5X0VRKTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGZpKTsKKyAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb3VudF9kb2MsCkBAIC05NDAsMjAgKzk0MCwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2luZGV4KGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgewotCQlQeU9iamVjdCAqc2VsZmkgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSk7Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZmksIHYsIFB5X0VRKTsKLQkJUHlfREVDUkVGKHNlbGZpKTsKLQkJaWYgKGNtcCA+IDApIHsKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylpKTsKLQkJfQotCQllbHNlIGlmIChjbXAgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYXJyYXkuaW5kZXgoeCk6IHggbm90IGluIGxpc3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpzZWxmaSA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLCBpKTsKKyAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmaSwgdiwgUHlfRVEpOworICAgICAgICBQeV9ERUNSRUYoc2VsZmkpOworICAgICAgICBpZiAoY21wID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJhcnJheS5pbmRleCh4KTogeCBub3QgaW4gbGlzdCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoaW5kZXhfZG9jLApAQCAtOTY0LDM4ICs5NjQsMzggQEAKIHN0YXRpYyBpbnQKIGFycmF5X2NvbnRhaW5zKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IGNtcDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGNtcDsKIAotCWZvciAoaSA9IDAsIGNtcCA9IDAgOyBjbXAgPT0gMCAmJiBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpzZWxmaSA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLCBpKTsKLQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGZpLCB2LCBQeV9FUSk7Ci0JCVB5X0RFQ1JFRihzZWxmaSk7Ci0JfQotCXJldHVybiBjbXA7CisgICAgZm9yIChpID0gMCwgY21wID0gMCA7IGNtcCA9PSAwICYmIGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnNlbGZpID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsIGkpOworICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZmksIHYsIFB5X0VRKTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGZpKTsKKyAgICB9CisgICAgcmV0dXJuIGNtcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3JlbW92ZShhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JaW50IGk7CisgICAgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpzZWxmaSA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLGkpOwotCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGZpLCB2LCBQeV9FUSk7Ci0JCVB5X0RFQ1JFRihzZWxmaSk7Ci0JCWlmIChjbXAgPiAwKSB7Ci0JCQlpZiAoYXJyYXlfYXNzX3NsaWNlKHNlbGYsIGksIGkrMSwKLQkJCQkJICAgKFB5T2JqZWN0ICopTlVMTCkgIT0gMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JCWVsc2UgaWYgKGNtcCA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJhcnJheS5yZW1vdmUoeCk6IHggbm90IGluIGxpc3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpzZWxmaSA9IGdldGFycmF5aXRlbSgoUHlPYmplY3QgKilzZWxmLGkpOworICAgICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGZpLCB2LCBQeV9FUSk7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmaSk7CisgICAgICAgIGlmIChjbXAgPiAwKSB7CisgICAgICAgICAgICBpZiAoYXJyYXlfYXNzX3NsaWNlKHNlbGYsIGksIGkrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilOVUxMKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImFycmF5LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIocmVtb3ZlX2RvYywKQEAgLTEwMDYsMjcgKzEwMDYsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9wb3AoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgaSA9IC0xOwotCVB5T2JqZWN0ICp2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cG9wIiwgJmkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlfU0laRShzZWxmKSA9PSAwKSB7Ci0JCS8qIFNwZWNpYWwtY2FzZSBtb3N0IGNvbW1vbiBmYWlsdXJlIGNhdXNlICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGZyb20gZW1wdHkgYXJyYXkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChpIDwgMCkKLQkJaSArPSBQeV9TSVpFKHNlbGYpOwotCWlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoc2VsZikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2ID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsaSk7Ci0JaWYgKGFycmF5X2Fzc19zbGljZShzZWxmLCBpLCBpKzEsIChQeU9iamVjdCAqKU5VTEwpICE9IDApIHsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHY7CisgICAgUHlfc3NpemVfdCBpID0gLTE7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpwb3AiLCAmaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeV9TSVpFKHNlbGYpID09IDApIHsKKyAgICAgICAgLyogU3BlY2lhbC1jYXNlIG1vc3QgY29tbW9uIGZhaWx1cmUgY2F1c2UgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgZnJvbSBlbXB0eSBhcnJheSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGkgPCAwKQorICAgICAgICBpICs9IFB5X1NJWkUoc2VsZik7CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShzZWxmKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInBvcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHYgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZixpKTsKKyAgICBpZiAoYXJyYXlfYXNzX3NsaWNlKHNlbGYsIGksIGkrMSwgKFB5T2JqZWN0ICopTlVMTCkgIT0gMCkgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogUHlEb2NfU1RSVkFSKHBvcF9kb2MsCkBAIC0xMDM3LDEwICsxMDM3LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfZXh0ZW5kKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYmIpCiB7Ci0JaWYgKGFycmF5X2RvX2V4dGVuZChzZWxmLCBiYikgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoYXJyYXlfZG9fZXh0ZW5kKHNlbGYsIGJiKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZXh0ZW5kX2RvYywKQEAgLTEwNTEsMTEgKzEwNTEsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9pbnNlcnQoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqdjsKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzppbnNlcnQiLCAmaSwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gaW5zKHNlbGYsIGksIHYpOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POmluc2VydCIsICZpLCAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBpbnMoc2VsZiwgaSwgdik7CiB9CiAKIFB5RG9jX1NUUlZBUihpbnNlcnRfZG9jLApAQCAtMTA2NywxNSArMTA2NywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2J1ZmZlcl9pbmZvKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCVB5T2JqZWN0KiByZXR2YWwgPSBOVUxMOwotCXJldHZhbCA9IFB5VHVwbGVfTmV3KDIpOwotCWlmICghcmV0dmFsKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCogcmV0dmFsID0gTlVMTDsKKyAgICByZXR2YWwgPSBQeVR1cGxlX05ldygyKTsKKyAgICBpZiAoIXJldHZhbCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeVR1cGxlX1NFVF9JVEVNKHJldHZhbCwgMCwgUHlMb25nX0Zyb21Wb2lkUHRyKHNlbGYtPm9iX2l0ZW0pKTsKLQlQeVR1cGxlX1NFVF9JVEVNKHJldHZhbCwgMSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpKFB5X1NJWkUoc2VsZikpKSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXR2YWwsIDAsIFB5TG9uZ19Gcm9tVm9pZFB0cihzZWxmLT5vYl9pdGVtKSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXR2YWwsIDEsIFB5SW50X0Zyb21Mb25nKChsb25nKShQeV9TSVpFKHNlbGYpKSkpOwogCi0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBQeURvY19TVFJWQVIoYnVmZmVyX2luZm9fZG9jLApAQCAtMTA5MCw3ICsxMDkwLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9hcHBlbmQoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBpbnMoc2VsZiwgKGludCkgUHlfU0laRShzZWxmKSwgdik7CisgICAgcmV0dXJuIGlucyhzZWxmLCAoaW50KSBQeV9TSVpFKHNlbGYpLCB2KTsKIH0KIAogUHlEb2NfU1RSVkFSKGFwcGVuZF9kb2MsCkBAIC0xMTAyLDUyICsxMTAyLDUyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfYnl0ZXN3YXAoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JY2hhciAqcDsKLQlQeV9zc2l6ZV90IGk7CisgICAgY2hhciAqcDsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlzd2l0Y2ggKHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkgewotCWNhc2UgMToKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlmb3IgKHAgPSBzZWxmLT5vYl9pdGVtLCBpID0gUHlfU0laRShzZWxmKTsgLS1pID49IDA7IHAgKz0gMikgewotCQkJY2hhciBwMCA9IHBbMF07Ci0JCQlwWzBdID0gcFsxXTsKLQkJCXBbMV0gPSBwMDsKLQkJfQotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWZvciAocCA9IHNlbGYtPm9iX2l0ZW0sIGkgPSBQeV9TSVpFKHNlbGYpOyAtLWkgPj0gMDsgcCArPSA0KSB7Ci0JCQljaGFyIHAwID0gcFswXTsKLQkJCWNoYXIgcDEgPSBwWzFdOwotCQkJcFswXSA9IHBbM107Ci0JCQlwWzFdID0gcFsyXTsKLQkJCXBbMl0gPSBwMTsKLQkJCXBbM10gPSBwMDsKLQkJfQotCQlicmVhazsKLQljYXNlIDg6Ci0JCWZvciAocCA9IHNlbGYtPm9iX2l0ZW0sIGkgPSBQeV9TSVpFKHNlbGYpOyAtLWkgPj0gMDsgcCArPSA4KSB7Ci0JCQljaGFyIHAwID0gcFswXTsKLQkJCWNoYXIgcDEgPSBwWzFdOwotCQkJY2hhciBwMiA9IHBbMl07Ci0JCQljaGFyIHAzID0gcFszXTsKLQkJCXBbMF0gPSBwWzddOwotCQkJcFsxXSA9IHBbNl07Ci0JCQlwWzJdID0gcFs1XTsKLQkJCXBbM10gPSBwWzRdOwotCQkJcFs0XSA9IHAzOwotCQkJcFs1XSA9IHAyOwotCQkJcFs2XSA9IHAxOwotCQkJcFs3XSA9IHAwOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkgICAiZG9uJ3Qga25vdyBob3cgdG8gYnl0ZXN3YXAgdGhpcyBhcnJheSB0eXBlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc3dpdGNoIChzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZm9yIChwID0gc2VsZi0+b2JfaXRlbSwgaSA9IFB5X1NJWkUoc2VsZik7IC0taSA+PSAwOyBwICs9IDIpIHsKKyAgICAgICAgICAgIGNoYXIgcDAgPSBwWzBdOworICAgICAgICAgICAgcFswXSA9IHBbMV07CisgICAgICAgICAgICBwWzFdID0gcDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBmb3IgKHAgPSBzZWxmLT5vYl9pdGVtLCBpID0gUHlfU0laRShzZWxmKTsgLS1pID49IDA7IHAgKz0gNCkgeworICAgICAgICAgICAgY2hhciBwMCA9IHBbMF07CisgICAgICAgICAgICBjaGFyIHAxID0gcFsxXTsKKyAgICAgICAgICAgIHBbMF0gPSBwWzNdOworICAgICAgICAgICAgcFsxXSA9IHBbMl07CisgICAgICAgICAgICBwWzJdID0gcDE7CisgICAgICAgICAgICBwWzNdID0gcDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICBmb3IgKHAgPSBzZWxmLT5vYl9pdGVtLCBpID0gUHlfU0laRShzZWxmKTsgLS1pID49IDA7IHAgKz0gOCkgeworICAgICAgICAgICAgY2hhciBwMCA9IHBbMF07CisgICAgICAgICAgICBjaGFyIHAxID0gcFsxXTsKKyAgICAgICAgICAgIGNoYXIgcDIgPSBwWzJdOworICAgICAgICAgICAgY2hhciBwMyA9IHBbM107CisgICAgICAgICAgICBwWzBdID0gcFs3XTsKKyAgICAgICAgICAgIHBbMV0gPSBwWzZdOworICAgICAgICAgICAgcFsyXSA9IHBbNV07CisgICAgICAgICAgICBwWzNdID0gcFs0XTsKKyAgICAgICAgICAgIHBbNF0gPSBwMzsKKyAgICAgICAgICAgIHBbNV0gPSBwMjsKKyAgICAgICAgICAgIHBbNl0gPSBwMTsKKyAgICAgICAgICAgIHBbN10gPSBwMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJkb24ndCBrbm93IGhvdyB0byBieXRlc3dhcCB0aGlzIGFycmF5IHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGJ5dGVzd2FwX2RvYywKQEAgLTExNTksMzMgKzExNTksMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV9yZWR1Y2UoYXJyYXlvYmplY3QgKmFycmF5KQogewotCVB5T2JqZWN0ICpkaWN0LCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpkaWN0LCAqcmVzdWx0OwogCi0JZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopYXJyYXksICJfX2RpY3RfXyIpOwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJZGljdCA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihkaWN0KTsKLQl9Ci0JaWYgKFB5X1NJWkUoYXJyYXkpID4gMCkgewotCQlpZiAoYXJyYXktPm9iX2Rlc2NyLT5pdGVtc2l6ZSAKLQkJCQk+IFBZX1NTSVpFX1RfTUFYIC8gYXJyYXktPm9iX3NpemUpIHsKLQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQl9Ci0JCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oY3MjKU8iLCAKLQkJCVB5X1RZUEUoYXJyYXkpLCAKLQkJCWFycmF5LT5vYl9kZXNjci0+dHlwZWNvZGUsCi0JCQlhcnJheS0+b2JfaXRlbSwKLQkJCVB5X1NJWkUoYXJyYXkpICogYXJyYXktPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLQkJCWRpY3QpOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oYylPIiwgCi0JCQlQeV9UWVBFKGFycmF5KSwgCi0JCQlhcnJheS0+b2JfZGVzY3ItPnR5cGVjb2RlLAotCQkJZGljdCk7Ci0JfQotCVB5X0RFQ1JFRihkaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKWFycmF5LCAiX19kaWN0X18iKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGRpY3QgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgfQorICAgIGlmIChQeV9TSVpFKGFycmF5KSA+IDApIHsKKyAgICAgICAgaWYgKGFycmF5LT5vYl9kZXNjci0+aXRlbXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgID4gUFlfU1NJWkVfVF9NQVggLyBhcnJheS0+b2Jfc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhjcyMpTyIsCisgICAgICAgICAgICBQeV9UWVBFKGFycmF5KSwKKyAgICAgICAgICAgIGFycmF5LT5vYl9kZXNjci0+dHlwZWNvZGUsCisgICAgICAgICAgICBhcnJheS0+b2JfaXRlbSwKKyAgICAgICAgICAgIFB5X1NJWkUoYXJyYXkpICogYXJyYXktPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKKyAgICAgICAgICAgIGRpY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oYylPIiwKKyAgICAgICAgICAgIFB5X1RZUEUoYXJyYXkpLAorICAgICAgICAgICAgYXJyYXktPm9iX2Rlc2NyLT50eXBlY29kZSwKKyAgICAgICAgICAgIGRpY3QpOworICAgIH0KKyAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGFycmF5X2RvYywgIlJldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcuIik7CkBAIC0xMTkzLDI4ICsxMTkzLDI4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfcmV2ZXJzZShhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGl0ZW1zaXplID0gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOwotCXJlZ2lzdGVyIGNoYXIgKnAsICpxOwotCS8qIGxpdHRsZSBidWZmZXIgdG8gaG9sZCBpdGVtcyB3aGlsZSBzd2FwcGluZyAqLwotCWNoYXIgdG1wWzI1Nl07CS8qIDggaXMgcHJvYmFibHkgZW5vdWdoIC0tIGJ1dCB3aHkgc2tpbXAgKi8KLQlhc3NlcnQoKHNpemVfdClpdGVtc2l6ZSA8PSBzaXplb2YodG1wKSk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICByZWdpc3RlciBjaGFyICpwLCAqcTsKKyAgICAvKiBsaXR0bGUgYnVmZmVyIHRvIGhvbGQgaXRlbXMgd2hpbGUgc3dhcHBpbmcgKi8KKyAgICBjaGFyIHRtcFsyNTZdOyAgICAgIC8qIDggaXMgcHJvYmFibHkgZW5vdWdoIC0tIGJ1dCB3aHkgc2tpbXAgKi8KKyAgICBhc3NlcnQoKHNpemVfdClpdGVtc2l6ZSA8PSBzaXplb2YodG1wKSk7CiAKLQlpZiAoUHlfU0laRShzZWxmKSA+IDEpIHsKLQkJZm9yIChwID0gc2VsZi0+b2JfaXRlbSwKLQkJICAgICBxID0gc2VsZi0+b2JfaXRlbSArIChQeV9TSVpFKHNlbGYpIC0gMSkqaXRlbXNpemU7Ci0JCSAgICAgcCA8IHE7Ci0JCSAgICAgcCArPSBpdGVtc2l6ZSwgcSAtPSBpdGVtc2l6ZSkgewotCQkJLyogbWVtb3J5IGFyZWFzIGd1YXJhbnRlZWQgZGlzam9pbnQsIHNvIG1lbWNweQotCQkJICogaXMgc2FmZSAoJiBtZW1tb3ZlIG1heSBiZSBzbG93ZXIpLgotCQkJICovCi0JCQltZW1jcHkodG1wLCBwLCBpdGVtc2l6ZSk7Ci0JCQltZW1jcHkocCwgcSwgaXRlbXNpemUpOwotCQkJbWVtY3B5KHEsIHRtcCwgaXRlbXNpemUpOwotCQl9Ci0JfQorICAgIGlmIChQeV9TSVpFKHNlbGYpID4gMSkgeworICAgICAgICBmb3IgKHAgPSBzZWxmLT5vYl9pdGVtLAorICAgICAgICAgICAgIHEgPSBzZWxmLT5vYl9pdGVtICsgKFB5X1NJWkUoc2VsZikgLSAxKSppdGVtc2l6ZTsKKyAgICAgICAgICAgICBwIDwgcTsKKyAgICAgICAgICAgICBwICs9IGl0ZW1zaXplLCBxIC09IGl0ZW1zaXplKSB7CisgICAgICAgICAgICAvKiBtZW1vcnkgYXJlYXMgZ3VhcmFudGVlZCBkaXNqb2ludCwgc28gbWVtY3B5CisgICAgICAgICAgICAgKiBpcyBzYWZlICgmIG1lbW1vdmUgbWF5IGJlIHNsb3dlcikuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1lbWNweSh0bXAsIHAsIGl0ZW1zaXplKTsKKyAgICAgICAgICAgIG1lbWNweShwLCBxLCBpdGVtc2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkocSwgdG1wLCBpdGVtc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIocmV2ZXJzZV9kb2MsCkBAIC0xMjI1LDUwICsxMjI1LDUwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfZnJvbWZpbGUoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmOwotCVB5X3NzaXplX3QgbjsKLQlGSUxFICpmcDsKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPbjpmcm9tZmlsZSIsICZmLCAmbikpCi0JCXJldHVybiBOVUxMOwotCWZwID0gUHlGaWxlX0FzRmlsZShmKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnMSBtdXN0IGJlIG9wZW4gZmlsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG4gPiAwKSB7Ci0JCWNoYXIgKml0ZW0gPSBzZWxmLT5vYl9pdGVtOwotCQlQeV9zc2l6ZV90IGl0ZW1zaXplID0gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOwotCQlzaXplX3QgbnJlYWQ7Ci0JCVB5X3NzaXplX3QgbmV3bGVuZ3RoOwotCQlzaXplX3QgbmV3Ynl0ZXM7Ci0JCS8qIEJlIGNhcmVmdWwgaGVyZSBhYm91dCBvdmVyZmxvdyAqLwotCQlpZiAoKG5ld2xlbmd0aCA9IFB5X1NJWkUoc2VsZikgKyBuKSA8PSAwIHx8Ci0JCSAgICAobmV3Ynl0ZXMgPSBuZXdsZW5ndGggKiBpdGVtc2l6ZSkgLyBpdGVtc2l6ZSAhPQotCQkgICAgKHNpemVfdCluZXdsZW5ndGgpCi0JCQlnb3RvIG5vbWVtOwotCQlQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwgbmV3Ynl0ZXMpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCSAgbm9tZW06Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc2VsZi0+b2JfaXRlbSA9IGl0ZW07Ci0JCVB5X1NJWkUoc2VsZikgKz0gbjsKLQkJc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKLQkJbnJlYWQgPSBmcmVhZChpdGVtICsgKFB5X1NJWkUoc2VsZikgLSBuKSAqIGl0ZW1zaXplLAotCQkJICAgICAgaXRlbXNpemUsIG4sIGZwKTsKLQkJaWYgKG5yZWFkIDwgKHNpemVfdCluKSB7Ci0JCSAgUHlfU0laRShzZWxmKSAtPSAobiAtIG5yZWFkKTsKLQkJCVB5TWVtX1JFU0laRShpdGVtLCBjaGFyLCBQeV9TSVpFKHNlbGYpKml0ZW1zaXplKTsKLQkJCXNlbGYtPm9iX2l0ZW0gPSBpdGVtOwotCQkJc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkgICAgICAgICAibm90IGVub3VnaCBpdGVtcyBpbiBmaWxlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlPYmplY3QgKmY7CisgICAgUHlfc3NpemVfdCBuOworICAgIEZJTEUgKmZwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT246ZnJvbWZpbGUiLCAmZiwgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcCA9IFB5RmlsZV9Bc0ZpbGUoZik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZzEgbXVzdCBiZSBvcGVuIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuID4gMCkgeworICAgICAgICBjaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKKyAgICAgICAgUHlfc3NpemVfdCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICAgICAgc2l6ZV90IG5yZWFkOworICAgICAgICBQeV9zc2l6ZV90IG5ld2xlbmd0aDsKKyAgICAgICAgc2l6ZV90IG5ld2J5dGVzOworICAgICAgICAvKiBCZSBjYXJlZnVsIGhlcmUgYWJvdXQgb3ZlcmZsb3cgKi8KKyAgICAgICAgaWYgKChuZXdsZW5ndGggPSBQeV9TSVpFKHNlbGYpICsgbikgPD0gMCB8fAorICAgICAgICAgICAgKG5ld2J5dGVzID0gbmV3bGVuZ3RoICogaXRlbXNpemUpIC8gaXRlbXNpemUgIT0KKyAgICAgICAgICAgIChzaXplX3QpbmV3bGVuZ3RoKQorICAgICAgICAgICAgZ290byBub21lbTsKKyAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIG5ld2J5dGVzKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgIG5vbWVtOgorICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICBQeV9TSVpFKHNlbGYpICs9IG47CisgICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7CisgICAgICAgIG5yZWFkID0gZnJlYWQoaXRlbSArIChQeV9TSVpFKHNlbGYpIC0gbikgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpdGVtc2l6ZSwgbiwgZnApOworICAgICAgICBpZiAobnJlYWQgPCAoc2l6ZV90KW4pIHsKKyAgICAgICAgICBQeV9TSVpFKHNlbGYpIC09IChuIC0gbnJlYWQpOworICAgICAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW0sIGNoYXIsIFB5X1NJWkUoc2VsZikqaXRlbXNpemUpOworICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSA9IGl0ZW07CisgICAgICAgICAgICBzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBpdGVtcyBpbiBmaWxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihmcm9tZmlsZV9kb2MsCkBAIC0xMjgxLDMzICsxMjgxLDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfZnJvbWZpbGVfYXNfcmVhZChhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKFB5RXJyX1dhcm5QeTNrKCJhcnJheS5yZWFkKCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKLQkJCSAgICJ1c2UgYXJyYXkuZnJvbWZpbGUoKSIsIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGFycmF5X2Zyb21maWxlKHNlbGYsIGFyZ3MpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiYXJyYXkucmVhZCgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgYXJyYXkuZnJvbWZpbGUoKSIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGFycmF5X2Zyb21maWxlKHNlbGYsIGFyZ3MpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheV90b2ZpbGUoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpmKQogewotCUZJTEUgKmZwOworICAgIEZJTEUgKmZwOwogCi0JZnAgPSBQeUZpbGVfQXNGaWxlKGYpOwotCWlmIChmcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmcgbXVzdCBiZSBvcGVuIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzZWxmLT5vYl9zaXplID4gMCkgewotCQlpZiAoZndyaXRlKHNlbGYtPm9iX2l0ZW0sIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSwKLQkJCSAgIHNlbGYtPm9iX3NpemUsIGZwKSAhPSAoc2l6ZV90KXNlbGYtPm9iX3NpemUpIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCWNsZWFyZXJyKGZwKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmcCA9IFB5RmlsZV9Bc0ZpbGUoZik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZyBtdXN0IGJlIG9wZW4gZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHNlbGYtPm9iX3NpemUgPiAwKSB7CisgICAgICAgIGlmIChmd3JpdGUoc2VsZi0+b2JfaXRlbSwgc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX3NpemUsIGZwKSAhPSAoc2l6ZV90KXNlbGYtPm9iX3NpemUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIGNsZWFyZXJyKGZwKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHRvZmlsZV9kb2MsCkBAIC0xMzIwLDUzICsxMzIwLDUzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfdG9maWxlX2FzX3dyaXRlKGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZikKIHsKLQlpZiAoUHlFcnJfV2FyblB5M2soImFycmF5LndyaXRlKCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKLQkJCSAgICJ1c2UgYXJyYXkudG9maWxlKCkiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBhcnJheV90b2ZpbGUoc2VsZiwgZik7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJhcnJheS53cml0ZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgYXJyYXkudG9maWxlKCkiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBhcnJheV90b2ZpbGUoc2VsZiwgZik7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2Zyb21saXN0KGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbGlzdCkKIHsKLQlQeV9zc2l6ZV90IG47Ci0JUHlfc3NpemVfdCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlfc3NpemVfdCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKIAotCWlmICghUHlMaXN0X0NoZWNrKGxpc3QpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmcgbXVzdCBiZSBsaXN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQluID0gUHlMaXN0X1NpemUobGlzdCk7Ci0JaWYgKG4gPiAwKSB7Ci0JCWNoYXIgKml0ZW0gPSBzZWxmLT5vYl9pdGVtOwotCQlQeV9zc2l6ZV90IGk7Ci0JCVB5TWVtX1JFU0laRShpdGVtLCBjaGFyLCAoUHlfU0laRShzZWxmKSArIG4pICogaXRlbXNpemUpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc2VsZi0+b2JfaXRlbSA9IGl0ZW07Ci0JCVB5X1NJWkUoc2VsZikgKz0gbjsKLQkJc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBQeUxpc3RfR2V0SXRlbShsaXN0LCBpKTsKLQkJCWlmICgoKnNlbGYtPm9iX2Rlc2NyLT5zZXRpdGVtKShzZWxmLAotCQkJCQlQeV9TSVpFKHNlbGYpIC0gbiArIGksIHYpICE9IDApIHsKLQkJCQlQeV9TSVpFKHNlbGYpIC09IG47Ci0JCQkJaWYgKGl0ZW1zaXplICYmIChzZWxmLT5vYl9zaXplID4gUFlfU1NJWkVfVF9NQVggLyBpdGVtc2l6ZSkpIHsKLQkJCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJfQotCQkJCVB5TWVtX1JFU0laRShpdGVtLCBjaGFyLAotCQkJCQkgICAgICAgICAgUHlfU0laRShzZWxmKSAqIGl0ZW1zaXplKTsKLQkJCQlzZWxmLT5vYl9pdGVtID0gaXRlbTsKLQkJCQlzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhsaXN0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIG11c3QgYmUgbGlzdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbiA9IFB5TGlzdF9TaXplKGxpc3QpOworICAgIGlmIChuID4gMCkgeworICAgICAgICBjaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwgKFB5X1NJWkUoc2VsZikgKyBuKSAqIGl0ZW1zaXplKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICBQeV9TSVpFKHNlbGYpICs9IG47CisgICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7CisgICAgICAgICAgICBpZiAoKCpzZWxmLT5vYl9kZXNjci0+c2V0aXRlbSkoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9TSVpFKHNlbGYpIC0gbiArIGksIHYpICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeV9TSVpFKHNlbGYpIC09IG47CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1zaXplICYmIChzZWxmLT5vYl9zaXplID4gUFlfU1NJWkVfVF9NQVggLyBpdGVtc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5TWVtX1JFU0laRShpdGVtLCBjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1NJWkUoc2VsZikgKiBpdGVtc2l6ZSk7CisgICAgICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSA9IGl0ZW07CisgICAgICAgICAgICAgICAgc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihmcm9tbGlzdF9kb2MsCkBAIC0xMzc4LDIwICsxMzc4LDIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfdG9saXN0KGFycmF5b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCVB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQeV9TSVpFKHNlbGYpKTsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KFB5X1NJWkUoc2VsZikpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmIChsaXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBnZXRhcnJheWl0ZW0oKFB5T2JqZWN0ICopc2VsZiwgaSk7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIHYpOwotCX0KLQlyZXR1cm4gbGlzdDsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gZ2V0YXJyYXlpdGVtKChQeU9iamVjdCAqKXNlbGYsIGkpOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCB2KTsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CiB9CiAKIFB5RG9jX1NUUlZBUih0b2xpc3RfZG9jLApAQCAtMTQwMywzNiArMTQwMywzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2Zyb21zdHJpbmcoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnN0cjsKLQlQeV9zc2l6ZV90IG47Ci0JaW50IGl0ZW1zaXplID0gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOwotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmZyb21zdHJpbmciLCAmc3RyLCAmbikpCi0JCXJldHVybiBOVUxMOwotCWlmIChuICUgaXRlbXNpemUgIT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICJzdHJpbmcgbGVuZ3RoIG5vdCBhIG11bHRpcGxlIG9mIGl0ZW0gc2l6ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbiA9IG4gLyBpdGVtc2l6ZTsKLQlpZiAobiA+IDApIHsKLQkJY2hhciAqaXRlbSA9IHNlbGYtPm9iX2l0ZW07Ci0JCWlmICgobiA+IFBZX1NTSVpFX1RfTUFYIC0gUHlfU0laRShzZWxmKSkgfHwKLQkJCSgoUHlfU0laRShzZWxmKSArIG4pID4gUFlfU1NJWkVfVF9NQVggLyBpdGVtc2l6ZSkpIHsKLQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJfQotCQlQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwgKFB5X1NJWkUoc2VsZikgKyBuKSAqIGl0ZW1zaXplKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlbGYtPm9iX2l0ZW0gPSBpdGVtOwotCQlQeV9TSVpFKHNlbGYpICs9IG47Ci0JCXNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7Ci0JCW1lbWNweShpdGVtICsgKFB5X1NJWkUoc2VsZikgLSBuKSAqIGl0ZW1zaXplLAotCQkgICAgICAgc3RyLCBpdGVtc2l6ZSpuKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNoYXIgKnN0cjsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgaW50IGl0ZW1zaXplID0gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6ZnJvbXN0cmluZyIsICZzdHIsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG4gJSBpdGVtc2l6ZSAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJzdHJpbmcgbGVuZ3RoIG5vdCBhIG11bHRpcGxlIG9mIGl0ZW0gc2l6ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbiA9IG4gLyBpdGVtc2l6ZTsKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgY2hhciAqaXRlbSA9IHNlbGYtPm9iX2l0ZW07CisgICAgICAgIGlmICgobiA+IFBZX1NTSVpFX1RfTUFYIC0gUHlfU0laRShzZWxmKSkgfHwKKyAgICAgICAgICAgICgoUHlfU0laRShzZWxmKSArIG4pID4gUFlfU1NJWkVfVF9NQVggLyBpdGVtc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgfQorICAgICAgICBQeU1lbV9SRVNJWkUoaXRlbSwgY2hhciwgKFB5X1NJWkUoc2VsZikgKyBuKSAqIGl0ZW1zaXplKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICBQeV9TSVpFKHNlbGYpICs9IG47CisgICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7CisgICAgICAgIG1lbWNweShpdGVtICsgKFB5X1NJWkUoc2VsZikgLSBuKSAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgc3RyLCBpdGVtc2l6ZSpuKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZnJvbXN0cmluZ19kb2MsCkBAIC0xNDQ1LDEyICsxNDQ1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfdG9zdHJpbmcoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JaWYgKHNlbGYtPm9iX3NpemUgPD0gUFlfU1NJWkVfVF9NQVggLyBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPm9iX2l0ZW0sCi0JCQkJICAgIFB5X1NJWkUoc2VsZikgKiBzZWxmLT5vYl9kZXNjci0+aXRlbXNpemUpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KKyAgICBpZiAoc2VsZi0+b2Jfc2l6ZSA8PSBQWV9TU0laRV9UX01BWCAvIHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZSkgeworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+b2JfaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9TSVpFKHNlbGYpICogc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUih0b3N0cmluZ19kb2MsCkBAIC0xNDY1LDM2ICsxNDY1LDM2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfZnJvbXVuaWNvZGUoYXJyYXlvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X1VOSUNPREUgKnVzdHI7Ci0JUHlfc3NpemVfdCBuOworICAgIFB5X1VOSUNPREUgKnVzdHI7CisgICAgUHlfc3NpemVfdCBuOwogCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidSM6ZnJvbXVuaWNvZGUiLCAmdXN0ciwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc2VsZi0+b2JfZGVzY3ItPnR5cGVjb2RlICE9ICd1JykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJmcm9tdW5pY29kZSgpIG1heSBvbmx5IGJlIGNhbGxlZCBvbiAiCi0JCQkidHlwZSAndScgYXJyYXlzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobiA+IDApIHsKLQkJUHlfVU5JQ09ERSAqaXRlbSA9IChQeV9VTklDT0RFICopIHNlbGYtPm9iX2l0ZW07Ci0JCWlmIChQeV9TSVpFKHNlbGYpID4gUFlfU1NJWkVfVF9NQVggLSBuKSB7Ci0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJfQotCQlQeU1lbV9SRVNJWkUoaXRlbSwgUHlfVU5JQ09ERSwgUHlfU0laRShzZWxmKSArIG4pOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc2VsZi0+b2JfaXRlbSA9IChjaGFyICopIGl0ZW07Ci0JCVB5X1NJWkUoc2VsZikgKz0gbjsKLQkJc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKLQkJbWVtY3B5KGl0ZW0gKyBQeV9TSVpFKHNlbGYpIC0gbiwKLQkJICAgICAgIHVzdHIsIG4gKiBzaXplb2YoUHlfVU5JQ09ERSkpOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInUjOmZyb211bmljb2RlIiwgJnVzdHIsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNlbGYtPm9iX2Rlc2NyLT50eXBlY29kZSAhPSAndScpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAiZnJvbXVuaWNvZGUoKSBtYXkgb25seSBiZSBjYWxsZWQgb24gIgorICAgICAgICAgICAgInR5cGUgJ3UnIGFycmF5cyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIFB5X1VOSUNPREUgKml0ZW0gPSAoUHlfVU5JQ09ERSAqKSBzZWxmLT5vYl9pdGVtOworICAgICAgICBpZiAoUHlfU0laRShzZWxmKSA+IFBZX1NTSVpFX1RfTUFYIC0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgUHlNZW1fUkVTSVpFKGl0ZW0sIFB5X1VOSUNPREUsIFB5X1NJWkUoc2VsZikgKyBuKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSAoY2hhciAqKSBpdGVtOworICAgICAgICBQeV9TSVpFKHNlbGYpICs9IG47CisgICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9IFB5X1NJWkUoc2VsZik7CisgICAgICAgIG1lbWNweShpdGVtICsgUHlfU0laRShzZWxmKSAtIG4sCisgICAgICAgICAgICAgICB1c3RyLCBuICogc2l6ZW9mKFB5X1VOSUNPREUpKTsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZnJvbXVuaWNvZGVfZG9jLApAQCAtMTUwOSwxMiArMTUwOSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X3RvdW5pY29kZShhcnJheW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlpZiAoc2VsZi0+b2JfZGVzY3ItPnR5cGVjb2RlICE9ICd1JykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJ0b3VuaWNvZGUoKSBtYXkgb25seSBiZSBjYWxsZWQgb24gdHlwZSAndScgYXJyYXlzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKChQeV9VTklDT0RFICopIHNlbGYtPm9iX2l0ZW0sIFB5X1NJWkUoc2VsZikpOworICAgIGlmIChzZWxmLT5vYl9kZXNjci0+dHlwZWNvZGUgIT0gJ3UnKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgInRvdW5pY29kZSgpIG1heSBvbmx5IGJlIGNhbGxlZCBvbiB0eXBlICd1JyBhcnJheXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoKFB5X1VOSUNPREUgKikgc2VsZi0+b2JfaXRlbSwgUHlfU0laRShzZWxmKSk7CiB9CiAKIFB5RG9jX1NUUlZBUih0b3VuaWNvZGVfZG9jLApAQCAtMTUzMSwzMjEgKzE1MzEsMzIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfZ2V0X3R5cGVjb2RlKGFycmF5b2JqZWN0ICphLCB2b2lkICpjbG9zdXJlKQogewotCWNoYXIgdGMgPSBhLT5vYl9kZXNjci0+dHlwZWNvZGU7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCZ0YywgMSk7CisgICAgY2hhciB0YyA9IGEtPm9iX2Rlc2NyLT50eXBlY29kZTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoJnRjLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFycmF5X2dldF9pdGVtc2l6ZShhcnJheW9iamVjdCAqYSwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpYS0+b2JfZGVzY3ItPml0ZW1zaXplKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGFycmF5X2dldHNldHMgW10gPSB7Ci0JeyJ0eXBlY29kZSIsIChnZXR0ZXIpIGFycmF5X2dldF90eXBlY29kZSwgTlVMTCwKLQkgInRoZSB0eXBlY29kZSBjaGFyYWN0ZXIgdXNlZCB0byBjcmVhdGUgdGhlIGFycmF5In0sCi0JeyJpdGVtc2l6ZSIsIChnZXR0ZXIpIGFycmF5X2dldF9pdGVtc2l6ZSwgTlVMTCwKLQkgInRoZSBzaXplLCBpbiBieXRlcywgb2Ygb25lIGFycmF5IGl0ZW0ifSwKLQl7TlVMTH0KKyAgICB7InR5cGVjb2RlIiwgKGdldHRlcikgYXJyYXlfZ2V0X3R5cGVjb2RlLCBOVUxMLAorICAgICAidGhlIHR5cGVjb2RlIGNoYXJhY3RlciB1c2VkIHRvIGNyZWF0ZSB0aGUgYXJyYXkifSwKKyAgICB7Iml0ZW1zaXplIiwgKGdldHRlcikgYXJyYXlfZ2V0X2l0ZW1zaXplLCBOVUxMLAorICAgICAidGhlIHNpemUsIGluIGJ5dGVzLCBvZiBvbmUgYXJyYXkgaXRlbSJ9LAorICAgIHtOVUxMfQogfTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGFycmF5X21ldGhvZHNbXSA9IHsKLQl7ImFwcGVuZCIsCShQeUNGdW5jdGlvbilhcnJheV9hcHBlbmQsCU1FVEhfTywKLQkgYXBwZW5kX2RvY30sCi0JeyJidWZmZXJfaW5mbyIsIChQeUNGdW5jdGlvbilhcnJheV9idWZmZXJfaW5mbywgTUVUSF9OT0FSR1MsCi0JIGJ1ZmZlcl9pbmZvX2RvY30sCi0JeyJieXRlc3dhcCIsCShQeUNGdW5jdGlvbilhcnJheV9ieXRlc3dhcCwJTUVUSF9OT0FSR1MsCi0JIGJ5dGVzd2FwX2RvY30sCi0JeyJfX2NvcHlfXyIsCShQeUNGdW5jdGlvbilhcnJheV9jb3B5LAlNRVRIX05PQVJHUywKLQkgY29weV9kb2N9LAotCXsiY291bnQiLAkoUHlDRnVuY3Rpb24pYXJyYXlfY291bnQsCU1FVEhfTywKLQkgY291bnRfZG9jfSwKLQl7Il9fZGVlcGNvcHlfXyIsKFB5Q0Z1bmN0aW9uKWFycmF5X2NvcHksCU1FVEhfTywKLQkgY29weV9kb2N9LAotCXsiZXh0ZW5kIiwgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfZXh0ZW5kLAlNRVRIX08sCi0JIGV4dGVuZF9kb2N9LAotCXsiZnJvbWZpbGUiLAkoUHlDRnVuY3Rpb24pYXJyYXlfZnJvbWZpbGUsCU1FVEhfVkFSQVJHUywKLQkgZnJvbWZpbGVfZG9jfSwKLQl7ImZyb21saXN0IiwJKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb21saXN0LAlNRVRIX08sCi0JIGZyb21saXN0X2RvY30sCi0JeyJmcm9tc3RyaW5nIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb21zdHJpbmcsCU1FVEhfVkFSQVJHUywKLQkgZnJvbXN0cmluZ19kb2N9LAorICAgIHsiYXBwZW5kIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2FwcGVuZCwgICAgICBNRVRIX08sCisgICAgIGFwcGVuZF9kb2N9LAorICAgIHsiYnVmZmVyX2luZm8iLCAoUHlDRnVuY3Rpb24pYXJyYXlfYnVmZmVyX2luZm8sIE1FVEhfTk9BUkdTLAorICAgICBidWZmZXJfaW5mb19kb2N9LAorICAgIHsiYnl0ZXN3YXAiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2J5dGVzd2FwLCAgICBNRVRIX05PQVJHUywKKyAgICAgYnl0ZXN3YXBfZG9jfSwKKyAgICB7Il9fY29weV9fIiwgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9jb3B5LCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIGNvcHlfZG9jfSwKKyAgICB7ImNvdW50IiwgICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9jb3VudCwgICAgICAgTUVUSF9PLAorICAgICBjb3VudF9kb2N9LAorICAgIHsiX19kZWVwY29weV9fIiwoUHlDRnVuY3Rpb24pYXJyYXlfY29weSwgICAgICAgICAgICBNRVRIX08sCisgICAgIGNvcHlfZG9jfSwKKyAgICB7ImV4dGVuZCIsICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2V4dGVuZCwgICAgICAgICAgTUVUSF9PLAorICAgICBleHRlbmRfZG9jfSwKKyAgICB7ImZyb21maWxlIiwgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9mcm9tZmlsZSwgICAgTUVUSF9WQVJBUkdTLAorICAgICBmcm9tZmlsZV9kb2N9LAorICAgIHsiZnJvbWxpc3QiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb21saXN0LCAgICBNRVRIX08sCisgICAgIGZyb21saXN0X2RvY30sCisgICAgeyJmcm9tc3RyaW5nIiwgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfZnJvbXN0cmluZywgIE1FVEhfVkFSQVJHUywKKyAgICAgZnJvbXN0cmluZ19kb2N9LAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQl7ImZyb211bmljb2RlIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb211bmljb2RlLAlNRVRIX1ZBUkFSR1MsCi0JIGZyb211bmljb2RlX2RvY30sCisgICAgeyJmcm9tdW5pY29kZSIsICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfZnJvbXVuaWNvZGUsIE1FVEhfVkFSQVJHUywKKyAgICAgZnJvbXVuaWNvZGVfZG9jfSwKICNlbmRpZgotCXsiaW5kZXgiLAkoUHlDRnVuY3Rpb24pYXJyYXlfaW5kZXgsCU1FVEhfTywKLQkgaW5kZXhfZG9jfSwKLQl7Imluc2VydCIsCShQeUNGdW5jdGlvbilhcnJheV9pbnNlcnQsCU1FVEhfVkFSQVJHUywKLQkgaW5zZXJ0X2RvY30sCi0JeyJwb3AiLAkJKFB5Q0Z1bmN0aW9uKWFycmF5X3BvcCwJCU1FVEhfVkFSQVJHUywKLQkgcG9wX2RvY30sCi0JeyJyZWFkIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb21maWxlX2FzX3JlYWQsCU1FVEhfVkFSQVJHUywKLQkgZnJvbWZpbGVfZG9jfSwKLQl7Il9fcmVkdWNlX18iLAkoUHlDRnVuY3Rpb24pYXJyYXlfcmVkdWNlLAlNRVRIX05PQVJHUywKLQkgYXJyYXlfZG9jfSwKLQl7InJlbW92ZSIsCShQeUNGdW5jdGlvbilhcnJheV9yZW1vdmUsCU1FVEhfTywKLQkgcmVtb3ZlX2RvY30sCi0JeyJyZXZlcnNlIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X3JldmVyc2UsCU1FVEhfTk9BUkdTLAotCSByZXZlcnNlX2RvY30sCi0vKgl7InNvcnQiLAkoUHlDRnVuY3Rpb24pYXJyYXlfc29ydCwJTUVUSF9WQVJBUkdTLAotCXNvcnRfZG9jfSwqLwotCXsidG9maWxlIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X3RvZmlsZSwJTUVUSF9PLAotCSB0b2ZpbGVfZG9jfSwKLQl7InRvbGlzdCIsCShQeUNGdW5jdGlvbilhcnJheV90b2xpc3QsCU1FVEhfTk9BUkdTLAotCSB0b2xpc3RfZG9jfSwKLQl7InRvc3RyaW5nIiwJKFB5Q0Z1bmN0aW9uKWFycmF5X3Rvc3RyaW5nLAlNRVRIX05PQVJHUywKLQkgdG9zdHJpbmdfZG9jfSwKKyAgICB7ImluZGV4IiwgICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV9pbmRleCwgICAgICAgTUVUSF9PLAorICAgICBpbmRleF9kb2N9LAorICAgIHsiaW5zZXJ0IiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2luc2VydCwgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIGluc2VydF9kb2N9LAorICAgIHsicG9wIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X3BvcCwgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIHBvcF9kb2N9LAorICAgIHsicmVhZCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X2Zyb21maWxlX2FzX3JlYWQsICAgIE1FVEhfVkFSQVJHUywKKyAgICAgZnJvbWZpbGVfZG9jfSwKKyAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbilhcnJheV9yZWR1Y2UsICAgICAgTUVUSF9OT0FSR1MsCisgICAgIGFycmF5X2RvY30sCisgICAgeyJyZW1vdmUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfcmVtb3ZlLCAgICAgIE1FVEhfTywKKyAgICAgcmVtb3ZlX2RvY30sCisgICAgeyJyZXZlcnNlIiwgICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfcmV2ZXJzZSwgICAgIE1FVEhfTk9BUkdTLAorICAgICByZXZlcnNlX2RvY30sCisvKiAgICAgIHsic29ydCIsICAgICAgICAoUHlDRnVuY3Rpb24pYXJyYXlfc29ydCwgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICBzb3J0X2RvY30sKi8KKyAgICB7InRvZmlsZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV90b2ZpbGUsICAgICAgTUVUSF9PLAorICAgICB0b2ZpbGVfZG9jfSwKKyAgICB7InRvbGlzdCIsICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV90b2xpc3QsICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHRvbGlzdF9kb2N9LAorICAgIHsidG9zdHJpbmciLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWFycmF5X3Rvc3RyaW5nLCAgICBNRVRIX05PQVJHUywKKyAgICAgdG9zdHJpbmdfZG9jfSwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JeyJ0b3VuaWNvZGUiLCAgIChQeUNGdW5jdGlvbilhcnJheV90b3VuaWNvZGUsCU1FVEhfTk9BUkdTLAotCSB0b3VuaWNvZGVfZG9jfSwKKyAgICB7InRvdW5pY29kZSIsICAgKFB5Q0Z1bmN0aW9uKWFycmF5X3RvdW5pY29kZSwgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHRvdW5pY29kZV9kb2N9LAogI2VuZGlmCi0JeyJ3cml0ZSIsCShQeUNGdW5jdGlvbilhcnJheV90b2ZpbGVfYXNfd3JpdGUsCU1FVEhfTywKLQkgdG9maWxlX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7IndyaXRlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilhcnJheV90b2ZpbGVfYXNfd3JpdGUsICAgICBNRVRIX08sCisgICAgIHRvZmlsZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfcmVwcihhcnJheW9iamVjdCAqYSkKIHsKLQljaGFyIGJ1ZlsyNTZdLCB0eXBlY29kZTsKLQlQeU9iamVjdCAqcywgKnQsICp2ID0gTlVMTDsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBjaGFyIGJ1ZlsyNTZdLCB0eXBlY29kZTsKKyAgICBQeU9iamVjdCAqcywgKnQsICp2ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWxlbiA9IFB5X1NJWkUoYSk7Ci0JdHlwZWNvZGUgPSBhLT5vYl9kZXNjci0+dHlwZWNvZGU7Ci0JaWYgKGxlbiA9PSAwKSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImFycmF5KCclYycpIiwgdHlwZWNvZGUpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCX0KLQkJCi0JaWYgKHR5cGVjb2RlID09ICdjJykKLQkJdiA9IGFycmF5X3Rvc3RyaW5nKGEsIE5VTEwpOworICAgIGxlbiA9IFB5X1NJWkUoYSk7CisgICAgdHlwZWNvZGUgPSBhLT5vYl9kZXNjci0+dHlwZWNvZGU7CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImFycmF5KCclYycpIiwgdHlwZWNvZGUpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIH0KKworICAgIGlmICh0eXBlY29kZSA9PSAnYycpCisgICAgICAgIHYgPSBhcnJheV90b3N0cmluZyhhLCBOVUxMKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAodHlwZWNvZGUgPT0gJ3UnKQotCQl2ID0gYXJyYXlfdG91bmljb2RlKGEsIE5VTEwpOworICAgIGVsc2UgaWYgKHR5cGVjb2RlID09ICd1JykKKyAgICAgICAgdiA9IGFycmF5X3RvdW5pY29kZShhLCBOVUxMKTsKICNlbmRpZgotCWVsc2UKLQkJdiA9IGFycmF5X3RvbGlzdChhLCBOVUxMKTsKLQl0ID0gUHlPYmplY3RfUmVwcih2KTsKLQlQeV9YREVDUkVGKHYpOworICAgIGVsc2UKKyAgICAgICAgdiA9IGFycmF5X3RvbGlzdChhLCBOVUxMKTsKKyAgICB0ID0gUHlPYmplY3RfUmVwcih2KTsKKyAgICBQeV9YREVDUkVGKHYpOwogCi0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiYXJyYXkoJyVjJywgIiwgdHlwZWNvZGUpOwotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0KTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIikiKSk7Ci0JcmV0dXJuIHM7CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiYXJyYXkoJyVjJywgIiwgdHlwZWNvZGUpOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0KTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIikiKSk7CisgICAgcmV0dXJuIHM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGFycmF5X3N1YnNjcihhcnJheW9iamVjdCogc2VsZiwgUHlPYmplY3QqIGl0ZW0pCiB7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaT09LTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGkgPCAwKQotCQkJaSArPSBQeV9TSVpFKHNlbGYpOwotCQlyZXR1cm4gYXJyYXlfaXRlbShzZWxmLCBpKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOwotCQlQeU9iamVjdCogcmVzdWx0OwotCQlhcnJheW9iamVjdCogYXI7Ci0JCWludCBpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGlmIChpPT0tMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IFB5X1NJWkUoc2VsZik7CisgICAgICAgIHJldHVybiBhcnJheV9pdGVtKHNlbGYsIGkpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoLCBjdXIsIGk7CisgICAgICAgIFB5T2JqZWN0KiByZXN1bHQ7CisgICAgICAgIGFycmF5b2JqZWN0KiBhcjsKKyAgICAgICAgaW50IGl0ZW1zaXplID0gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOwogCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwgUHlfU0laRShzZWxmKSwKLQkJCQkgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIFB5X1NJWkUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWlmIChzbGljZWxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbmV3YXJyYXlvYmplY3QoJkFycmF5dHlwZSwgMCwgc2VsZi0+b2JfZGVzY3IpOwotCQl9Ci0JCWVsc2UgaWYgKHN0ZXAgPT0gMSkgewotCQkJUHlPYmplY3QgKnJlc3VsdCA9IG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsCi0JCQkJCQlzbGljZWxlbmd0aCwgc2VsZi0+b2JfZGVzY3IpOwotCQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJbWVtY3B5KCgoYXJyYXlvYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtLAotCQkJICAgICAgIHNlbGYtPm9iX2l0ZW0gKyBzdGFydCAqIGl0ZW1zaXplLAotCQkJICAgICAgIHNsaWNlbGVuZ3RoICogaXRlbXNpemUpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIHNsaWNlbGVuZ3RoLCBzZWxmLT5vYl9kZXNjcik7Ci0JCQlpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzbGljZWxlbmd0aCA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3YXJyYXlvYmplY3QoJkFycmF5dHlwZSwgMCwgc2VsZi0+b2JfZGVzY3IpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbmd0aCwgc2VsZi0+b2JfZGVzY3IpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgbWVtY3B5KCgoYXJyYXlvYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtLAorICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gKyBzdGFydCAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgIHNsaWNlbGVuZ3RoICogaXRlbXNpemUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ld2FycmF5b2JqZWN0KCZBcnJheXR5cGUsIHNsaWNlbGVuZ3RoLCBzZWxmLT5vYl9kZXNjcik7CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CiAKLQkJCWFyID0gKGFycmF5b2JqZWN0KilyZXN1bHQ7CisgICAgICAgICAgICBhciA9IChhcnJheW9iamVjdCopcmVzdWx0OwogCi0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOyAKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCW1lbWNweShhci0+b2JfaXRlbSArIGkqaXRlbXNpemUsCi0JCQkJICAgICAgIHNlbGYtPm9iX2l0ZW0gKyBjdXIqaXRlbXNpemUsCi0JCQkJICAgICAgIGl0ZW1zaXplKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQkJCi0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkiYXJyYXkgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYXItPm9iX2l0ZW0gKyBpKml0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9pdGVtICsgY3VyKml0ZW1zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpdGVtc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIGludAogYXJyYXlfYXNzX3N1YnNjcihhcnJheW9iamVjdCogc2VsZiwgUHlPYmplY3QqIGl0ZW0sIFB5T2JqZWN0KiB2YWx1ZSkKIHsKLQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgbmVlZGVkOwotCWFycmF5b2JqZWN0KiBvdGhlcjsKLQlpbnQgaXRlbXNpemU7CisgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIG5lZWRlZDsKKyAgICBhcnJheW9iamVjdCogb3RoZXI7CisgICAgaW50IGl0ZW1zaXplOwogCi0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQkKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBQeV9TSVpFKHNlbGYpOwotCQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKHNlbGYpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkiYXJyYXkgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQkJLyogRmFsbCB0aHJvdWdoIHRvIHNsaWNlIGFzc2lnbm1lbnQgKi8KLQkJCXN0YXJ0ID0gaTsKLQkJCXN0b3AgPSBpICsgMTsKLQkJCXN0ZXAgPSAxOwotCQkJc2xpY2VsZW5ndGggPSAxOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAoKnNlbGYtPm9iX2Rlc2NyLT5zZXRpdGVtKShzZWxmLCBpLCB2YWx1ZSk7Ci0JfQotCWVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwKLQkJCQkJIFB5X1NJWkUoc2VsZiksICZzdGFydCwgJnN0b3AsCi0JCQkJCSAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJyYXkgaW5kaWNlcyBtdXN0IGJlIGludGVnZXIiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlvdGhlciA9IE5VTEw7Ci0JCW5lZWRlZCA9IDA7Ci0JfQotCWVsc2UgaWYgKGFycmF5X0NoZWNrKHZhbHVlKSkgewotCQlvdGhlciA9IChhcnJheW9iamVjdCAqKXZhbHVlOwotCQluZWVkZWQgPSBQeV9TSVpFKG90aGVyKTsKLQkJaWYgKHNlbGYgPT0gb3RoZXIpIHsKLQkJCS8qIFNwZWNpYWwgY2FzZSAic2VsZltpOmpdID0gc2VsZiIgLS0gY29weSBzZWxmIGZpcnN0ICovCi0JCQlpbnQgcmV0OwotCQkJdmFsdWUgPSBhcnJheV9zbGljZShvdGhlciwgMCwgbmVlZGVkKTsKLQkJCWlmICh2YWx1ZSA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCXJldCA9IGFycmF5X2Fzc19zdWJzY3Ioc2VsZiwgaXRlbSwgdmFsdWUpOwotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJaWYgKG90aGVyLT5vYl9kZXNjciAhPSBzZWxmLT5vYl9kZXNjcikgewotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkgICAgICJjYW4gb25seSBhc3NpZ24gYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSB0byBhcnJheSBzbGljZSIsCi0JCQkgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpdGVtc2l6ZSA9IHNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLQkvKiBmb3IgJ2FbMjoxXSA9IC4uLicsIHRoZSBpbnNlcnRpb24gcG9pbnQgaXMgJ3N0YXJ0Jywgbm90ICdzdG9wJyAqLwotCWlmICgoc3RlcCA+IDAgJiYgc3RvcCA8IHN0YXJ0KSB8fAotCSAgICAoc3RlcCA8IDAgJiYgc3RvcCA+IHN0YXJ0KSkKLQkJc3RvcCA9IHN0YXJ0OwotCWlmIChzdGVwID09IDEpIHsKLQkJaWYgKHNsaWNlbGVuZ3RoID4gbmVlZGVkKSB7Ci0JCQltZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyAoc3RhcnQgKyBuZWVkZWQpICogaXRlbXNpemUsCi0JCQkJc2VsZi0+b2JfaXRlbSArIHN0b3AgKiBpdGVtc2l6ZSwKLQkJCQkoUHlfU0laRShzZWxmKSAtIHN0b3ApICogaXRlbXNpemUpOwotCQkJaWYgKGFycmF5X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpICsKLQkJCQkJIG5lZWRlZCAtIHNsaWNlbGVuZ3RoKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgaWYgKHNsaWNlbGVuZ3RoIDwgbmVlZGVkKSB7Ci0JCQlpZiAoYXJyYXlfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikgKwotCQkJCQkgbmVlZGVkIC0gc2xpY2VsZW5ndGgpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQltZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyAoc3RhcnQgKyBuZWVkZWQpICogaXRlbXNpemUsCi0JCQkJc2VsZi0+b2JfaXRlbSArIHN0b3AgKiBpdGVtc2l6ZSwKLQkJCQkoUHlfU0laRShzZWxmKSAtIHN0YXJ0IC0gbmVlZGVkKSAqIGl0ZW1zaXplKTsKLQkJfQotCQlpZiAobmVlZGVkID4gMCkKLQkJCW1lbWNweShzZWxmLT5vYl9pdGVtICsgc3RhcnQgKiBpdGVtc2l6ZSwKLQkJCSAgICAgICBvdGhlci0+b2JfaXRlbSwgbmVlZGVkICogaXRlbXNpemUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAobmVlZGVkID09IDApIHsKLQkJLyogRGVsZXRlIHNsaWNlICovCi0JCXNpemVfdCBjdXI7Ci0JCVB5X3NzaXplX3QgaTsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CiAKLQkJaWYgKHN0ZXAgPCAwKSB7Ci0JCQlzdG9wID0gc3RhcnQgKyAxOwotCQkJc3RhcnQgPSBzdG9wICsgc3RlcCAqIChzbGljZWxlbmd0aCAtIDEpIC0gMTsKLQkJCXN0ZXAgPSAtc3RlcDsKLQkJfQotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOwotCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCVB5X3NzaXplX3QgbGltID0gc3RlcCAtIDE7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShzZWxmKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgImFycmF5IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBzbGljZSBhc3NpZ25tZW50ICovCisgICAgICAgICAgICBzdGFydCA9IGk7CisgICAgICAgICAgICBzdG9wID0gaSArIDE7CisgICAgICAgICAgICBzdGVwID0gMTsKKyAgICAgICAgICAgIHNsaWNlbGVuZ3RoID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gKCpzZWxmLT5vYl9kZXNjci0+c2V0aXRlbSkoc2VsZiwgaSwgdmFsdWUpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9TSVpFKHNlbGYpLCAmc3RhcnQsICZzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJyYXkgaW5kaWNlcyBtdXN0IGJlIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBvdGhlciA9IE5VTEw7CisgICAgICAgIG5lZWRlZCA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKGFycmF5X0NoZWNrKHZhbHVlKSkgeworICAgICAgICBvdGhlciA9IChhcnJheW9iamVjdCAqKXZhbHVlOworICAgICAgICBuZWVkZWQgPSBQeV9TSVpFKG90aGVyKTsKKyAgICAgICAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSAic2VsZltpOmpdID0gc2VsZiIgLS0gY29weSBzZWxmIGZpcnN0ICovCisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgdmFsdWUgPSBhcnJheV9zbGljZShvdGhlciwgMCwgbmVlZGVkKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldCA9IGFycmF5X2Fzc19zdWJzY3Ioc2VsZiwgaXRlbSwgdmFsdWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG90aGVyLT5vYl9kZXNjciAhPSBzZWxmLT5vYl9kZXNjcikgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICJjYW4gb25seSBhc3NpZ24gYXJyYXkgKG5vdCBcIiUuMjAwc1wiKSB0byBhcnJheSBzbGljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGl0ZW1zaXplID0gc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOworICAgIC8qIGZvciAnYVsyOjFdID0gLi4uJywgdGhlIGluc2VydGlvbiBwb2ludCBpcyAnc3RhcnQnLCBub3QgJ3N0b3AnICovCisgICAgaWYgKChzdGVwID4gMCAmJiBzdG9wIDwgc3RhcnQpIHx8CisgICAgICAgIChzdGVwIDwgMCAmJiBzdG9wID4gc3RhcnQpKQorICAgICAgICBzdG9wID0gc3RhcnQ7CisgICAgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICBpZiAoc2xpY2VsZW5ndGggPiBuZWVkZWQpIHsKKyAgICAgICAgICAgIG1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIChzdGFydCArIG5lZWRlZCkgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICBzZWxmLT5vYl9pdGVtICsgc3RvcCAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgIChQeV9TSVpFKHNlbGYpIC0gc3RvcCkgKiBpdGVtc2l6ZSk7CisgICAgICAgICAgICBpZiAoYXJyYXlfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgLSBzbGljZWxlbmd0aCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzbGljZWxlbmd0aCA8IG5lZWRlZCkgeworICAgICAgICAgICAgaWYgKGFycmF5X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIC0gc2xpY2VsZW5ndGgpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBtZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyAoc3RhcnQgKyBuZWVkZWQpICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSArIHN0b3AgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAoUHlfU0laRShzZWxmKSAtIHN0YXJ0IC0gbmVlZGVkKSAqIGl0ZW1zaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZGVkID4gMCkKKyAgICAgICAgICAgIG1lbWNweShzZWxmLT5vYl9pdGVtICsgc3RhcnQgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBvdGhlci0+b2JfaXRlbSwgbmVlZGVkICogaXRlbXNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAobmVlZGVkID09IDApIHsKKyAgICAgICAgLyogRGVsZXRlIHNsaWNlICovCisgICAgICAgIHNpemVfdCBjdXI7CisgICAgICAgIFB5X3NzaXplX3QgaTsKIAotCQkJaWYgKGN1ciArIHN0ZXAgPj0gKHNpemVfdClQeV9TSVpFKHNlbGYpKQotCQkJCWxpbSA9IFB5X1NJWkUoc2VsZikgLSBjdXIgLSAxOwotCQkJbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgKGN1ciAtIGkpICogaXRlbXNpemUsCi0JCQkJc2VsZi0+b2JfaXRlbSArIChjdXIgKyAxKSAqIGl0ZW1zaXplLAotCQkJCWxpbSAqIGl0ZW1zaXplKTsKLQkJfQotCQljdXIgPSBzdGFydCArIHNsaWNlbGVuZ3RoICogc3RlcDsKLQkJaWYgKGN1ciA8IChzaXplX3QpUHlfU0laRShzZWxmKSkgewotCQkJbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgKGN1ci1zbGljZWxlbmd0aCkgKiBpdGVtc2l6ZSwKLQkJCQlzZWxmLT5vYl9pdGVtICsgY3VyICogaXRlbXNpemUsCi0JCQkJKFB5X1NJWkUoc2VsZikgLSBjdXIpICogaXRlbXNpemUpOwotCQl9Ci0JCWlmIChhcnJheV9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSAtIHNsaWNlbGVuZ3RoKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJUHlfc3NpemVfdCBjdXIsIGk7CisgICAgICAgIGlmIChzdGVwIDwgMCkgeworICAgICAgICAgICAgc3RvcCA9IHN0YXJ0ICsgMTsKKyAgICAgICAgICAgIHN0YXJ0ID0gc3RvcCArIHN0ZXAgKiAoc2xpY2VsZW5ndGggLSAxKSAtIDE7CisgICAgICAgICAgICBzdGVwID0gLXN0ZXA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKKyAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxpbSA9IHN0ZXAgLSAxOwogCi0JCWlmIChuZWVkZWQgIT0gc2xpY2VsZW5ndGgpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJhdHRlbXB0IHRvIGFzc2lnbiBhcnJheSBvZiBzaXplICV6ZCAiCi0JCQkJInRvIGV4dGVuZGVkIHNsaWNlIG9mIHNpemUgJXpkIiwKLQkJCQluZWVkZWQsIHNsaWNlbGVuZ3RoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOwotCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCW1lbWNweShzZWxmLT5vYl9pdGVtICsgY3VyICogaXRlbXNpemUsCi0JCQkgICAgICAgb3RoZXItPm9iX2l0ZW0gKyBpICogaXRlbXNpemUsCi0JCQkgICAgICAgaXRlbXNpemUpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgICAgIGlmIChjdXIgKyBzdGVwID49IChzaXplX3QpUHlfU0laRShzZWxmKSkKKyAgICAgICAgICAgICAgICBsaW0gPSBQeV9TSVpFKHNlbGYpIC0gY3VyIC0gMTsKKyAgICAgICAgICAgIG1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIChjdXIgLSBpKSAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gKyAoY3VyICsgMSkgKiBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICBsaW0gKiBpdGVtc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gc3RhcnQgKyBzbGljZWxlbmd0aCAqIHN0ZXA7CisgICAgICAgIGlmIChjdXIgPCAoc2l6ZV90KVB5X1NJWkUoc2VsZikpIHsKKyAgICAgICAgICAgIG1lbW1vdmUoc2VsZi0+b2JfaXRlbSArIChjdXItc2xpY2VsZW5ndGgpICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSArIGN1ciAqIGl0ZW1zaXplLAorICAgICAgICAgICAgICAgIChQeV9TSVpFKHNlbGYpIC0gY3VyKSAqIGl0ZW1zaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJyYXlfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikgLSBzbGljZWxlbmd0aCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgY3VyLCBpOworCisgICAgICAgIGlmIChuZWVkZWQgIT0gc2xpY2VsZW5ndGgpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJhdHRlbXB0IHRvIGFzc2lnbiBhcnJheSBvZiBzaXplICV6ZCAiCisgICAgICAgICAgICAgICAgInRvIGV4dGVuZGVkIHNsaWNlIG9mIHNpemUgJXpkIiwKKyAgICAgICAgICAgICAgICBuZWVkZWQsIHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgIG1lbWNweShzZWxmLT5vYl9pdGVtICsgY3VyICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgICAgb3RoZXItPm9iX2l0ZW0gKyBpICogaXRlbXNpemUsCisgICAgICAgICAgICAgICAgICAgaXRlbXNpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgYXJyYXlfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYylhcnJheV9sZW5ndGgsCi0JKGJpbmFyeWZ1bmMpYXJyYXlfc3Vic2NyLAotCShvYmpvYmphcmdwcm9jKWFycmF5X2Fzc19zdWJzY3IKKyAgICAobGVuZnVuYylhcnJheV9sZW5ndGgsCisgICAgKGJpbmFyeWZ1bmMpYXJyYXlfc3Vic2NyLAorICAgIChvYmpvYmphcmdwcm9jKWFycmF5X2Fzc19zdWJzY3IKIH07CiAKIHN0YXRpYyBjb25zdCB2b2lkICplbXB0eWJ1ZiA9ICIiOwpAQCAtMTg1MywxNjQgKzE4NTMsMTY0IEBACiBzdGF0aWMgUHlfc3NpemVfdAogYXJyYXlfYnVmZmVyX2dldHJlYWRidWYoYXJyYXlvYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JaWYgKCBpbmRleCAhPSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIkFjY2Vzc2luZyBub24tZXhpc3RlbnQgYXJyYXkgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwdHIgPSAodm9pZCAqKXNlbGYtPm9iX2l0ZW07Ci0JaWYgKCpwdHIgPT0gTlVMTCkKLQkJKnB0ciA9IGVtcHR5YnVmOwotCXJldHVybiBQeV9TSVpFKHNlbGYpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICBpZiAoIGluZGV4ICE9IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGFycmF5IHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHRyID0gKHZvaWQgKilzZWxmLT5vYl9pdGVtOworICAgIGlmICgqcHRyID09IE5VTEwpCisgICAgICAgICpwdHIgPSBlbXB0eWJ1ZjsKKyAgICByZXR1cm4gUHlfU0laRShzZWxmKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBhcnJheV9idWZmZXJfZ2V0d3JpdGVidWYoYXJyYXlvYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JaWYgKCBpbmRleCAhPSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIkFjY2Vzc2luZyBub24tZXhpc3RlbnQgYXJyYXkgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwdHIgPSAodm9pZCAqKXNlbGYtPm9iX2l0ZW07Ci0JaWYgKCpwdHIgPT0gTlVMTCkKLQkJKnB0ciA9IGVtcHR5YnVmOwotCXJldHVybiBQeV9TSVpFKHNlbGYpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKKyAgICBpZiAoIGluZGV4ICE9IDAgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGFycmF5IHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHRyID0gKHZvaWQgKilzZWxmLT5vYl9pdGVtOworICAgIGlmICgqcHRyID09IE5VTEwpCisgICAgICAgICpwdHIgPSBlbXB0eWJ1ZjsKKyAgICByZXR1cm4gUHlfU0laRShzZWxmKSpzZWxmLT5vYl9kZXNjci0+aXRlbXNpemU7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBhcnJheV9idWZmZXJfZ2V0c2VnY291bnQoYXJyYXlvYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgKmxlbnApCiB7Ci0JaWYgKCBsZW5wICkKLQkJKmxlbnAgPSBQeV9TSVpFKHNlbGYpKnNlbGYtPm9iX2Rlc2NyLT5pdGVtc2l6ZTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIGxlbnAgKQorICAgICAgICAqbGVucCA9IFB5X1NJWkUoc2VsZikqc2VsZi0+b2JfZGVzY3ItPml0ZW1zaXplOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgYXJyYXlfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpYXJyYXlfbGVuZ3RoLAkJICAgICAgICAvKnNxX2xlbmd0aCovCi0JKGJpbmFyeWZ1bmMpYXJyYXlfY29uY2F0LCAgICAgICAgICAgICAgIC8qc3FfY29uY2F0Ki8KLQkoc3NpemVhcmdmdW5jKWFycmF5X3JlcGVhdCwJCS8qc3FfcmVwZWF0Ki8KLQkoc3NpemVhcmdmdW5jKWFycmF5X2l0ZW0sCQkgICAgICAgIC8qc3FfaXRlbSovCi0JKHNzaXplc3NpemVhcmdmdW5jKWFycmF5X3NsaWNlLAkJLypzcV9zbGljZSovCi0JKHNzaXplb2JqYXJncHJvYylhcnJheV9hc3NfaXRlbSwJCS8qc3FfYXNzX2l0ZW0qLwotCShzc2l6ZXNzaXplb2JqYXJncHJvYylhcnJheV9hc3Nfc2xpY2UsCS8qc3FfYXNzX3NsaWNlKi8KLQkob2Jqb2JqcHJvYylhcnJheV9jb250YWlucywJCS8qc3FfY29udGFpbnMqLwotCShiaW5hcnlmdW5jKWFycmF5X2lucGxhY2VfY29uY2F0LAkvKnNxX2lucGxhY2VfY29uY2F0Ki8KLQkoc3NpemVhcmdmdW5jKWFycmF5X2lucGxhY2VfcmVwZWF0CS8qc3FfaW5wbGFjZV9yZXBlYXQqLworICAgIChsZW5mdW5jKWFycmF5X2xlbmd0aCwgICAgICAgICAgICAgICAgICAgICAgLypzcV9sZW5ndGgqLworICAgIChiaW5hcnlmdW5jKWFycmF5X2NvbmNhdCwgICAgICAgICAgICAgICAvKnNxX2NvbmNhdCovCisgICAgKHNzaXplYXJnZnVuYylhcnJheV9yZXBlYXQsICAgICAgICAgICAgICAgICAvKnNxX3JlcGVhdCovCisgICAgKHNzaXplYXJnZnVuYylhcnJheV9pdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qc3FfaXRlbSovCisgICAgKHNzaXplc3NpemVhcmdmdW5jKWFycmF5X3NsaWNlLCAgICAgICAgICAgICAvKnNxX3NsaWNlKi8KKyAgICAoc3NpemVvYmphcmdwcm9jKWFycmF5X2Fzc19pdGVtLCAgICAgICAgICAgICAgICAgICAgLypzcV9hc3NfaXRlbSovCisgICAgKHNzaXplc3NpemVvYmphcmdwcm9jKWFycmF5X2Fzc19zbGljZSwgICAgICAvKnNxX2Fzc19zbGljZSovCisgICAgKG9iam9ianByb2MpYXJyYXlfY29udGFpbnMsICAgICAgICAgICAgICAgICAvKnNxX2NvbnRhaW5zKi8KKyAgICAoYmluYXJ5ZnVuYylhcnJheV9pbnBsYWNlX2NvbmNhdCwgICAgICAgICAgIC8qc3FfaW5wbGFjZV9jb25jYXQqLworICAgIChzc2l6ZWFyZ2Z1bmMpYXJyYXlfaW5wbGFjZV9yZXBlYXQgICAgICAgICAgLypzcV9pbnBsYWNlX3JlcGVhdCovCiB9OwogCiBzdGF0aWMgUHlCdWZmZXJQcm9jcyBhcnJheV9hc19idWZmZXIgPSB7Ci0JKHJlYWRidWZmZXJwcm9jKWFycmF5X2J1ZmZlcl9nZXRyZWFkYnVmLAotCSh3cml0ZWJ1ZmZlcnByb2MpYXJyYXlfYnVmZmVyX2dldHdyaXRlYnVmLAotCShzZWdjb3VudHByb2MpYXJyYXlfYnVmZmVyX2dldHNlZ2NvdW50LAotCU5VTEwsCisgICAgKHJlYWRidWZmZXJwcm9jKWFycmF5X2J1ZmZlcl9nZXRyZWFkYnVmLAorICAgICh3cml0ZWJ1ZmZlcnByb2MpYXJyYXlfYnVmZmVyX2dldHdyaXRlYnVmLAorICAgIChzZWdjb3VudHByb2MpYXJyYXlfYnVmZmVyX2dldHNlZ2NvdW50LAorICAgIE5VTEwsCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWNoYXIgYzsKLQlQeU9iamVjdCAqaW5pdGlhbCA9IE5VTEwsICppdCA9IE5VTEw7Ci0Jc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwotCQotCWlmICh0eXBlID09ICZBcnJheXR5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJhcnJheS5hcnJheSgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGNoYXIgYzsKKyAgICBQeU9iamVjdCAqaW5pdGlhbCA9IE5VTEwsICppdCA9IE5VTEw7CisgICAgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjfE86YXJyYXkiLCAmYywgJmluaXRpYWwpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmQXJyYXl0eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiYXJyYXkuYXJyYXkoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghKGluaXRpYWwgPT0gTlVMTCB8fCBQeUxpc3RfQ2hlY2soaW5pdGlhbCkKLQkgICAgICB8fCBQeVN0cmluZ19DaGVjayhpbml0aWFsKSB8fCBQeVR1cGxlX0NoZWNrKGluaXRpYWwpCi0JICAgICAgfHwgKGMgPT0gJ3UnICYmIFB5VW5pY29kZV9DaGVjayhpbml0aWFsKSkpKSB7Ci0JCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpbml0aWFsKTsKLQkJaWYgKGl0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJLyogV2Ugc2V0IGluaXRpYWwgdG8gTlVMTCBzbyB0aGF0IHRoZSBzdWJzZXF1ZW50IGNvZGUKLQkJICAgd2lsbCBjcmVhdGUgYW4gZW1wdHkgYXJyYXkgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKLQkJICAgYW5kIGFmdGVyd2FyZHMgd2UgY2FuIHVzZSBhcnJheV9pdGVyX2V4dGVuZCB0byBwb3B1bGF0ZQotCQkgICB0aGUgYXJyYXkuCi0JCSovCi0JCWluaXRpYWwgPSBOVUxMOwotCX0KLQlmb3IgKGRlc2NyID0gZGVzY3JpcHRvcnM7IGRlc2NyLT50eXBlY29kZSAhPSAnXDAnOyBkZXNjcisrKSB7Ci0JCWlmIChkZXNjci0+dHlwZWNvZGUgPT0gYykgewotCQkJUHlPYmplY3QgKmE7Ci0JCQlQeV9zc2l6ZV90IGxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImN8TzphcnJheSIsICZjLCAmaW5pdGlhbCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JCQlpZiAoaW5pdGlhbCA9PSBOVUxMIHx8ICEoUHlMaXN0X0NoZWNrKGluaXRpYWwpIAotCQkJCXx8IFB5VHVwbGVfQ2hlY2soaW5pdGlhbCkpKQotCQkJCWxlbiA9IDA7Ci0JCQllbHNlCi0JCQkJbGVuID0gUHlTZXF1ZW5jZV9TaXplKGluaXRpYWwpOworICAgIGlmICghKGluaXRpYWwgPT0gTlVMTCB8fCBQeUxpc3RfQ2hlY2soaW5pdGlhbCkKKyAgICAgICAgICB8fCBQeVN0cmluZ19DaGVjayhpbml0aWFsKSB8fCBQeVR1cGxlX0NoZWNrKGluaXRpYWwpCisgICAgICAgICAgfHwgKGMgPT0gJ3UnICYmIFB5VW5pY29kZV9DaGVjayhpbml0aWFsKSkpKSB7CisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpbml0aWFsKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogV2Ugc2V0IGluaXRpYWwgdG8gTlVMTCBzbyB0aGF0IHRoZSBzdWJzZXF1ZW50IGNvZGUKKyAgICAgICAgICAgd2lsbCBjcmVhdGUgYW4gZW1wdHkgYXJyYXkgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAgICAgICAgICAgYW5kIGFmdGVyd2FyZHMgd2UgY2FuIHVzZSBhcnJheV9pdGVyX2V4dGVuZCB0byBwb3B1bGF0ZQorICAgICAgICAgICB0aGUgYXJyYXkuCisgICAgICAgICovCisgICAgICAgIGluaXRpYWwgPSBOVUxMOworICAgIH0KKyAgICBmb3IgKGRlc2NyID0gZGVzY3JpcHRvcnM7IGRlc2NyLT50eXBlY29kZSAhPSAnXDAnOyBkZXNjcisrKSB7CisgICAgICAgIGlmIChkZXNjci0+dHlwZWNvZGUgPT0gYykgeworICAgICAgICAgICAgUHlPYmplY3QgKmE7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbjsKIAotCQkJYSA9IG5ld2FycmF5b2JqZWN0KHR5cGUsIGxlbiwgZGVzY3IpOwotCQkJaWYgKGEgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmIChpbml0aWFsID09IE5VTEwgfHwgIShQeUxpc3RfQ2hlY2soaW5pdGlhbCkKKyAgICAgICAgICAgICAgICB8fCBQeVR1cGxlX0NoZWNrKGluaXRpYWwpKSkKKyAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxlbiA9IFB5U2VxdWVuY2VfU2l6ZShpbml0aWFsKTsKIAotCQkJaWYgKGxlbiA+IDApIHsKLQkJCQlQeV9zc2l6ZV90IGk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJCVB5T2JqZWN0ICp2ID0KLQkJCQkJICAgICAgICBQeVNlcXVlbmNlX0dldEl0ZW0oaW5pdGlhbCwgaSk7Ci0JCQkJCWlmICh2ID09IE5VTEwpIHsKLQkJCQkJCVB5X0RFQ1JFRihhKTsKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCQl9Ci0JCQkJCWlmIChzZXRhcnJheWl0ZW0oYSwgaSwgdikgIT0gMCkgewotCQkJCQkJUHlfREVDUkVGKHYpOwotCQkJCQkJUHlfREVDUkVGKGEpOwotCQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJCX0KLQkJCQkJUHlfREVDUkVGKHYpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaW5pdGlhbCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGluaXRpYWwpKSB7Ci0JCQkJUHlPYmplY3QgKnRfaW5pdGlhbCwgKnY7Ci0JCQkJdF9pbml0aWFsID0gUHlUdXBsZV9QYWNrKDEsIGluaXRpYWwpOwotCQkJCWlmICh0X2luaXRpYWwgPT0gTlVMTCkgewotCQkJCQlQeV9ERUNSRUYoYSk7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCQl2ID0gYXJyYXlfZnJvbXN0cmluZygoYXJyYXlvYmplY3QgKilhLAotCQkJCQkJCSB0X2luaXRpYWwpOwotCQkJCVB5X0RFQ1JFRih0X2luaXRpYWwpOwotCQkJCWlmICh2ID09IE5VTEwpIHsKLQkJCQkJUHlfREVDUkVGKGEpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKHYpOworICAgICAgICAgICAgYSA9IG5ld2FycmF5b2JqZWN0KHR5cGUsIGxlbiwgZGVzY3IpOworICAgICAgICAgICAgaWYgKGEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfR2V0SXRlbShpbml0aWFsLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNldGFycmF5aXRlbShhLCBpLCB2KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChpbml0aWFsICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2soaW5pdGlhbCkpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqdF9pbml0aWFsLCAqdjsKKyAgICAgICAgICAgICAgICB0X2luaXRpYWwgPSBQeVR1cGxlX1BhY2soMSwgaW5pdGlhbCk7CisgICAgICAgICAgICAgICAgaWYgKHRfaW5pdGlhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHYgPSBhcnJheV9mcm9tc3RyaW5nKChhcnJheW9iamVjdCAqKWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfaW5pdGlhbCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRfaW5pdGlhbCk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJfSBlbHNlIGlmIChpbml0aWFsICE9IE5VTEwgJiYgUHlVbmljb2RlX0NoZWNrKGluaXRpYWwpKSAgewotCQkJCVB5X3NzaXplX3QgbiA9IFB5VW5pY29kZV9HRVRfREFUQV9TSVpFKGluaXRpYWwpOwotCQkJCWlmIChuID4gMCkgewotCQkJCQlhcnJheW9iamVjdCAqc2VsZiA9IChhcnJheW9iamVjdCAqKWE7Ci0JCQkJCWNoYXIgKml0ZW0gPSBzZWxmLT5vYl9pdGVtOwotCQkJCQlpdGVtID0gKGNoYXIgKilQeU1lbV9SZWFsbG9jKGl0ZW0sIG4pOwotCQkJCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCQkJUHlfREVDUkVGKGEpOwotCQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJCX0KLQkJCQkJc2VsZi0+b2JfaXRlbSA9IGl0ZW07Ci0JCQkJCVB5X1NJWkUoc2VsZikgPSBuIC8gc2l6ZW9mKFB5X1VOSUNPREUpOwotCQkJCQltZW1jcHkoaXRlbSwgUHlVbmljb2RlX0FTX0RBVEEoaW5pdGlhbCksIG4pOwotCQkJCQlzZWxmLT5hbGxvY2F0ZWQgPSBQeV9TSVpFKHNlbGYpOwotCQkJCX0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbCAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayhpbml0aWFsKSkgIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG4gPSBQeVVuaWNvZGVfR0VUX0RBVEFfU0laRShpbml0aWFsKTsKKyAgICAgICAgICAgICAgICBpZiAobiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlvYmplY3QgKnNlbGYgPSAoYXJyYXlvYmplY3QgKilhOworICAgICAgICAgICAgICAgICAgICBjaGFyICppdGVtID0gc2VsZi0+b2JfaXRlbTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IChjaGFyICopUHlNZW1fUmVhbGxvYyhpdGVtLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW0gPSBpdGVtOworICAgICAgICAgICAgICAgICAgICBQeV9TSVpFKHNlbGYpID0gbiAvIHNpemVvZihQeV9VTklDT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGl0ZW0sIFB5VW5pY29kZV9BU19EQVRBKGluaXRpYWwpLCBuKTsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+YWxsb2NhdGVkID0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCX0KLQkJCWlmIChpdCAhPSBOVUxMKSB7Ci0JCQkJaWYgKGFycmF5X2l0ZXJfZXh0ZW5kKChhcnJheW9iamVjdCAqKWEsIGl0KSA9PSAtMSkgewotCQkJCQlQeV9ERUNSRUYoaXQpOwotCQkJCQlQeV9ERUNSRUYoYSk7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCQlQeV9ERUNSRUYoaXQpOwotCQkJfQotCQkJcmV0dXJuIGE7Ci0JCX0KLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSJiYWQgdHlwZWNvZGUgKG11c3QgYmUgYywgYiwgQiwgdSwgaCwgSCwgaSwgSSwgbCwgTCwgZiBvciBkKSIpOwotCXJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXJyYXlfaXRlcl9leHRlbmQoKGFycmF5b2JqZWN0ICopYSwgaXQpID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgImJhZCB0eXBlY29kZSAobXVzdCBiZSBjLCBiLCBCLCB1LCBoLCBILCBpLCBJLCBsLCBMLCBmIG9yIGQpIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMjA4MSw1NSArMjA4MSw1NSBAQAogc3RhdGljIFB5T2JqZWN0ICphcnJheV9pdGVyKGFycmF5b2JqZWN0ICphbyk7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQXJyYXl0eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJhcnJheS5hcnJheSIsCi0Jc2l6ZW9mKGFycmF5b2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWFycmF5X2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWFycmF5X3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIqLwotCSZhcnJheV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSovCi0JJmFycmF5X2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyovCi0JMCwgCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCSZhcnJheV9hc19idWZmZXIsCQkJLyogdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgLyogdHBfZmxhZ3MgKi8KLQlhcnJheXR5cGVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLSAJMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JYXJyYXlfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihhcnJheW9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylhcnJheV9pdGVyLAkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWFycmF5X21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCWFycmF5X2dldHNldHMsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JYXJyYXlfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiYXJyYXkuYXJyYXkiLAorICAgIHNpemVvZihhcnJheW9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilhcnJheV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWFycmF5X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIqLworICAgICZhcnJheV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UqLworICAgICZhcnJheV9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZhcnJheV9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgLyogdHBfZmxhZ3MgKi8KKyAgICBhcnJheXR5cGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgYXJyYXlfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKGFycmF5b2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAoZ2V0aXRlcmZ1bmMpYXJyYXlfaXRlciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgYXJyYXlfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgYXJyYXlfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGFycmF5X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiBBcnJheSBJdGVyYXRvciAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90CQkJaW5kZXg7Ci0JYXJyYXlvYmplY3QJCSphbzsKLQlQeU9iamVjdAkJKiAoKmdldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg7CisgICAgYXJyYXlvYmplY3QgICAgICAgICAgICAgICAgICphbzsKKyAgICBQeU9iamVjdCAgICAgICAgICAgICAgICAgICAgKiAoKmdldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKIH0gYXJyYXlpdGVyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5QXJyYXlJdGVyX1R5cGU7CkBAIC0yMTM5LDc5ICsyMTM5LDc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlfaXRlcihhcnJheW9iamVjdCAqYW8pCiB7Ci0JYXJyYXlpdGVyb2JqZWN0ICppdDsKKyAgICBhcnJheWl0ZXJvYmplY3QgKml0OwogCi0JaWYgKCFhcnJheV9DaGVjayhhbykpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIWFycmF5X0NoZWNrKGFvKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaXQgPSBQeU9iamVjdF9HQ19OZXcoYXJyYXlpdGVyb2JqZWN0LCAmUHlBcnJheUl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KGFycmF5aXRlcm9iamVjdCwgJlB5QXJyYXlJdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihhbyk7Ci0JaXQtPmFvID0gYW87Ci0JaXQtPmluZGV4ID0gMDsKLQlpdC0+Z2V0aXRlbSA9IGFvLT5vYl9kZXNjci0+Z2V0aXRlbTsKLQlQeU9iamVjdF9HQ19UcmFjayhpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFB5X0lOQ1JFRihhbyk7CisgICAgaXQtPmFvID0gYW87CisgICAgaXQtPmluZGV4ID0gMDsKKyAgICBpdC0+Z2V0aXRlbSA9IGFvLT5vYl9kZXNjci0+Z2V0aXRlbTsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhpdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlpdGVyX25leHQoYXJyYXlpdGVyb2JqZWN0ICppdCkKIHsKLQlhc3NlcnQoUHlBcnJheUl0ZXJfQ2hlY2soaXQpKTsKLQlpZiAoaXQtPmluZGV4IDwgUHlfU0laRShpdC0+YW8pKQotCQlyZXR1cm4gKCppdC0+Z2V0aXRlbSkoaXQtPmFvLCBpdC0+aW5kZXgrKyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5QXJyYXlJdGVyX0NoZWNrKGl0KSk7CisgICAgaWYgKGl0LT5pbmRleCA8IFB5X1NJWkUoaXQtPmFvKSkKKyAgICAgICAgcmV0dXJuICgqaXQtPmdldGl0ZW0pKGl0LT5hbywgaXQtPmluZGV4KyspOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAogYXJyYXlpdGVyX2RlYWxsb2MoYXJyYXlpdGVyb2JqZWN0ICppdCkKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGl0KTsKLQlQeV9YREVDUkVGKGl0LT5hbyk7Ci0JUHlPYmplY3RfR0NfRGVsKGl0KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGl0KTsKKyAgICBQeV9YREVDUkVGKGl0LT5hbyk7CisgICAgUHlPYmplY3RfR0NfRGVsKGl0KTsKIH0KIAogc3RhdGljIGludAogYXJyYXlpdGVyX3RyYXZlcnNlKGFycmF5aXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGl0LT5hbyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoaXQtPmFvKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeUFycmF5SXRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJhcnJheWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGFycmF5aXRlcm9iamVjdCksICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilhcnJheWl0ZXJfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWFycmF5aXRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylhcnJheWl0ZXJfbmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiYXJyYXlpdGVyYXRvciIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihhcnJheWl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpYXJyYXlpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylhcnJheWl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWFycmF5aXRlcl9uZXh0LCAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiB9OwogCiAKQEAgLTIyMjYsMTcgKzIyMjYsMTcgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0YXJyYXkodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCUFycmF5dHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCVB5QXJyYXlJdGVyX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQltID0gUHlfSW5pdE1vZHVsZTMoImFycmF5IiwgYV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgQXJyYXl0eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlBcnJheUl0ZXJfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiYXJyYXkiLCBhX21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotICAgICAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopJkFycmF5dHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBcnJheVR5cGUiLCAoUHlPYmplY3QgKikmQXJyYXl0eXBlKTsKLSAgICAgICAgUHlfSU5DUkVGKChQeU9iamVjdCAqKSZBcnJheXR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiYXJyYXkiLCAoUHlPYmplY3QgKikmQXJyYXl0eXBlKTsKLQkvKiBObyBuZWVkIHRvIGNoZWNrIHRoZSBlcnJvciBoZXJlLCB0aGUgY2FsbGVyIHdpbGwgZG8gdGhhdCAqLworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikmQXJyYXl0eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFycmF5VHlwZSIsIChQeU9iamVjdCAqKSZBcnJheXR5cGUpOworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikmQXJyYXl0eXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImFycmF5IiwgKFB5T2JqZWN0ICopJkFycmF5dHlwZSk7CisgICAgLyogTm8gbmVlZCB0byBjaGVjayB0aGUgZXJyb3IgaGVyZSwgdGhlIGNhbGxlciB3aWxsIGRvIHRoYXQgKi8KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvYXVkaW9vcC5jIGIvTW9kdWxlcy9hdWRpb29wLmMKaW5kZXggNzY3Y2FlNi4uZTFmODI4NCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9hdWRpb29wLmMKKysrIGIvTW9kdWxlcy9hdWRpb29wLmMKQEAgLTUzLDEzICs1MywxMyBAQAogc3RhdGljIFB5SW50MTYKIHNlYXJjaChQeUludDE2IHZhbCwgUHlJbnQxNiAqdGFibGUsIGludCBzaXplKQogewotICAgICAgICBpbnQgaTsKKyAgICBpbnQgaTsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbCA8PSAqdGFibGUrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChzaXplKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmICh2YWwgPD0gKnRhYmxlKyspCisgICAgICAgICAgICByZXR1cm4gKGkpOworICAgIH0KKyAgICByZXR1cm4gKHNpemUpOwogfQogI2RlZmluZSBzdF91bGF3MmxpbmVhcjE2KHVjKSAoX3N0X3VsYXcybGluZWFyMTZbdWNdKQogI2RlZmluZSBzdF9hbGF3MmxpbmVhcjE2KHVjKSAoX3N0X2FsYXcybGluZWFyMTZbdWNdKQpAQCAtODMsNyArODMsNyBAQAogICAgICAgLTIyOCwgICAgLTIxMiwgICAgLTE5NiwgICAgLTE4MCwgICAgLTE2NCwgICAgLTE0OCwgICAgLTEzMiwKICAgICAgIC0xMjAsICAgIC0xMTIsICAgIC0xMDQsICAgICAtOTYsICAgICAtODgsICAgICAtODAsICAgICAtNzIsCiAgICAgICAgLTY0LCAgICAgLTU2LCAgICAgLTQ4LCAgICAgLTQwLCAgICAgLTMyLCAgICAgLTI0LCAgICAgLTE2LAotICAgICAgICAtOCwgICAgICAgMCwgICAzMjEyNCwgICAzMTEwMCwgICAzMDA3NiwgICAyOTA1MiwgICAyODAyOCwKKyAgICAtOCwgICAgICAgMCwgICAzMjEyNCwgICAzMTEwMCwgICAzMDA3NiwgICAyOTA1MiwgICAyODAyOCwKICAgICAgMjcwMDQsICAgMjU5ODAsICAgMjQ5NTYsICAgMjM5MzIsICAgMjI5MDgsICAgMjE4ODQsICAgMjA4NjAsCiAgICAgIDE5ODM2LCAgIDE4ODEyLCAgIDE3Nzg4LCAgIDE2NzY0LCAgIDE1OTk2LCAgIDE1NDg0LCAgIDE0OTcyLAogICAgICAxNDQ2MCwgICAxMzk0OCwgICAxMzQzNiwgICAxMjkyNCwgICAxMjQxMiwgICAxMTkwMCwgICAxMTM4OCwKQEAgLTEwMCw4ICsxMDAsOCBAQAogICAgICAgIDM3MiwgICAgIDM1NiwgICAgIDM0MCwgICAgIDMyNCwgICAgIDMwOCwgICAgIDI5MiwgICAgIDI3NiwKICAgICAgICAyNjAsICAgICAyNDQsICAgICAyMjgsICAgICAyMTIsICAgICAxOTYsICAgICAxODAsICAgICAxNjQsCiAgICAgICAgMTQ4LCAgICAgMTMyLCAgICAgMTIwLCAgICAgMTEyLCAgICAgMTA0LCAgICAgIDk2LCAgICAgIDg4LAotICAgICAgICA4MCwgICAgICA3MiwgICAgICA2NCwgICAgICA1NiwgICAgICA0OCwgICAgICA0MCwgICAgICAzMiwKLSAgICAgICAgMjQsICAgICAgMTYsICAgICAgIDgsICAgICAgIDAKKyAgICA4MCwgICAgICA3MiwgICAgICA2NCwgICAgICA1NiwgICAgICA0OCwgICAgICA0MCwgICAgICAzMiwKKyAgICAyNCwgICAgICAxNiwgICAgICAgOCwgICAgICAgMAogfTsKIAogLyoKQEAgLTEzNywzOSArMTM3LDM5IEBACiAgKiBKb2huIFdpbGV5ICYgU29ucywgcHBzIDk4LTExMSBhbmQgNDcyLTQ3Ni4KICAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIKLXN0XzE0bGluZWFyMnVsYXcoUHlJbnQxNiBwY21fdmFsKQkvKiAyJ3MgY29tcGxlbWVudCAoMTQtYml0IHJhbmdlKSAqLworc3RfMTRsaW5lYXIydWxhdyhQeUludDE2IHBjbV92YWwpICAgICAgIC8qIDIncyBjb21wbGVtZW50ICgxNC1iaXQgcmFuZ2UpICovCiB7Ci0gICAgICAgIFB5SW50MTYgICAgICAgICBtYXNrOwotICAgICAgICBQeUludDE2ICAgICAgICAgc2VnOwotICAgICAgICB1bnNpZ25lZCBjaGFyICAgdXZhbDsKKyAgICBQeUludDE2ICAgICAgICAgbWFzazsKKyAgICBQeUludDE2ICAgICAgICAgc2VnOworICAgIHVuc2lnbmVkIGNoYXIgICB1dmFsOwogCi0gICAgICAgIC8qIFRoZSBvcmlnaW5hbCBzb3ggY29kZSBkb2VzIHRoaXMgaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24sIG5vdCBoZXJlICovCi0gICAgICAgIHBjbV92YWwgPSBwY21fdmFsID4+IDI7CisgICAgLyogVGhlIG9yaWdpbmFsIHNveCBjb2RlIGRvZXMgdGhpcyBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiwgbm90IGhlcmUgKi8KKyAgICBwY21fdmFsID0gcGNtX3ZhbCA+PiAyOwogCi0gICAgICAgIC8qIHUtbGF3IGludmVydHMgYWxsIGJpdHMgKi8KLSAgICAgICAgLyogR2V0IHRoZSBzaWduIGFuZCB0aGUgbWFnbml0dWRlIG9mIHRoZSB2YWx1ZS4gKi8KLSAgICAgICAgaWYgKHBjbV92YWwgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcGNtX3ZhbCA9IC1wY21fdmFsOwotICAgICAgICAgICAgICAgIG1hc2sgPSAweDdGOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1hc2sgPSAweEZGOwotICAgICAgICB9Ci0gICAgICAgIGlmICggcGNtX3ZhbCA+IENMSVAgKSBwY21fdmFsID0gQ0xJUDsgICAgICAgICAgIC8qIGNsaXAgdGhlIG1hZ25pdHVkZSAqLwotICAgICAgICBwY21fdmFsICs9IChCSUFTID4+IDIpOworICAgIC8qIHUtbGF3IGludmVydHMgYWxsIGJpdHMgKi8KKyAgICAvKiBHZXQgdGhlIHNpZ24gYW5kIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZhbHVlLiAqLworICAgIGlmIChwY21fdmFsIDwgMCkgeworICAgICAgICBwY21fdmFsID0gLXBjbV92YWw7CisgICAgICAgIG1hc2sgPSAweDdGOworICAgIH0gZWxzZSB7CisgICAgICAgIG1hc2sgPSAweEZGOworICAgIH0KKyAgICBpZiAoIHBjbV92YWwgPiBDTElQICkgcGNtX3ZhbCA9IENMSVA7ICAgICAgICAgICAvKiBjbGlwIHRoZSBtYWduaXR1ZGUgKi8KKyAgICBwY21fdmFsICs9IChCSUFTID4+IDIpOwogCi0gICAgICAgIC8qIENvbnZlcnQgdGhlIHNjYWxlZCBtYWduaXR1ZGUgdG8gc2VnbWVudCBudW1iZXIuICovCi0gICAgICAgIHNlZyA9IHNlYXJjaChwY21fdmFsLCBzZWdfdWVuZCwgOCk7CisgICAgLyogQ29udmVydCB0aGUgc2NhbGVkIG1hZ25pdHVkZSB0byBzZWdtZW50IG51bWJlci4gKi8KKyAgICBzZWcgPSBzZWFyY2gocGNtX3ZhbCwgc2VnX3VlbmQsIDgpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbWJpbmUgdGhlIHNpZ24sIHNlZ21lbnQsIHF1YW50aXphdGlvbiBiaXRzOwotICAgICAgICAgKiBhbmQgY29tcGxlbWVudCB0aGUgY29kZSB3b3JkLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHNlZyA+PSA4KSAgICAgICAgICAgLyogb3V0IG9mIHJhbmdlLCByZXR1cm4gbWF4aW11bSB2YWx1ZS4gKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICgweDdGIF4gbWFzayk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHV2YWwgPSAodW5zaWduZWQgY2hhcikgKHNlZyA8PCA0KSB8ICgocGNtX3ZhbCA+PiAoc2VnICsgMSkpICYgMHhGKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHV2YWwgXiBtYXNrKTsKLSAgICAgICAgfQorICAgIC8qCisgICAgICogQ29tYmluZSB0aGUgc2lnbiwgc2VnbWVudCwgcXVhbnRpemF0aW9uIGJpdHM7CisgICAgICogYW5kIGNvbXBsZW1lbnQgdGhlIGNvZGUgd29yZC4KKyAgICAgKi8KKyAgICBpZiAoc2VnID49IDgpICAgICAgICAgICAvKiBvdXQgb2YgcmFuZ2UsIHJldHVybiBtYXhpbXVtIHZhbHVlLiAqLworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGNoYXIpICgweDdGIF4gbWFzayk7CisgICAgZWxzZSB7CisgICAgICAgIHV2YWwgPSAodW5zaWduZWQgY2hhcikgKHNlZyA8PCA0KSB8ICgocGNtX3ZhbCA+PiAoc2VnICsgMSkpICYgMHhGKTsKKyAgICAgICAgcmV0dXJuICh1dmFsIF4gbWFzayk7CisgICAgfQogCiB9CiAKQEAgLTIzNCw1OSArMjM0LDU5IEBACiAgKiBKb2huIFdpbGV5ICYgU29ucywgcHBzIDk4LTExMSBhbmQgNDcyLTQ3Ni4KICAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIKLXN0X2xpbmVhcjJhbGF3KFB5SW50MTYgcGNtX3ZhbCkJLyogMidzIGNvbXBsZW1lbnQgKDEzLWJpdCByYW5nZSkgKi8KK3N0X2xpbmVhcjJhbGF3KFB5SW50MTYgcGNtX3ZhbCkgLyogMidzIGNvbXBsZW1lbnQgKDEzLWJpdCByYW5nZSkgKi8KIHsKLSAgICAgICAgUHlJbnQxNiAgICAgICAgIG1hc2s7Ci0gICAgICAgIHNob3J0ICAgICAgICAgICBzZWc7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICBhdmFsOworICAgIFB5SW50MTYgICAgICAgICBtYXNrOworICAgIHNob3J0ICAgICAgICAgICBzZWc7CisgICAgdW5zaWduZWQgY2hhciAgIGF2YWw7CiAKLSAgICAgICAgLyogVGhlIG9yaWdpbmFsIHNveCBjb2RlIGRvZXMgdGhpcyBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbiwgbm90IGhlcmUgKi8KLSAgICAgICAgcGNtX3ZhbCA9IHBjbV92YWwgPj4gMzsKKyAgICAvKiBUaGUgb3JpZ2luYWwgc294IGNvZGUgZG9lcyB0aGlzIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgaGVyZSAqLworICAgIHBjbV92YWwgPSBwY21fdmFsID4+IDM7CiAKLSAgICAgICAgLyogQS1sYXcgdXNpbmcgZXZlbiBiaXQgaW52ZXJzaW9uICovCi0gICAgICAgIGlmIChwY21fdmFsID49IDApIHsKLSAgICAgICAgICAgICAgICBtYXNrID0gMHhENTsgICAgICAgICAgICAvKiBzaWduICg3dGgpIGJpdCA9IDEgKi8KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtYXNrID0gMHg1NTsgICAgICAgICAgICAvKiBzaWduIGJpdCA9IDAgKi8KLSAgICAgICAgICAgICAgICBwY21fdmFsID0gLXBjbV92YWwgLSAxOwotICAgICAgICB9CisgICAgLyogQS1sYXcgdXNpbmcgZXZlbiBiaXQgaW52ZXJzaW9uICovCisgICAgaWYgKHBjbV92YWwgPj0gMCkgeworICAgICAgICBtYXNrID0gMHhENTsgICAgICAgICAgICAvKiBzaWduICg3dGgpIGJpdCA9IDEgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBtYXNrID0gMHg1NTsgICAgICAgICAgICAvKiBzaWduIGJpdCA9IDAgKi8KKyAgICAgICAgcGNtX3ZhbCA9IC1wY21fdmFsIC0gMTsKKyAgICB9CiAKLSAgICAgICAgLyogQ29udmVydCB0aGUgc2NhbGVkIG1hZ25pdHVkZSB0byBzZWdtZW50IG51bWJlci4gKi8KLSAgICAgICAgc2VnID0gc2VhcmNoKHBjbV92YWwsIHNlZ19hZW5kLCA4KTsKKyAgICAvKiBDb252ZXJ0IHRoZSBzY2FsZWQgbWFnbml0dWRlIHRvIHNlZ21lbnQgbnVtYmVyLiAqLworICAgIHNlZyA9IHNlYXJjaChwY21fdmFsLCBzZWdfYWVuZCwgOCk7CiAKLSAgICAgICAgLyogQ29tYmluZSB0aGUgc2lnbiwgc2VnbWVudCwgYW5kIHF1YW50aXphdGlvbiBiaXRzLiAqLworICAgIC8qIENvbWJpbmUgdGhlIHNpZ24sIHNlZ21lbnQsIGFuZCBxdWFudGl6YXRpb24gYml0cy4gKi8KIAotICAgICAgICBpZiAoc2VnID49IDgpICAgICAgICAgICAvKiBvdXQgb2YgcmFuZ2UsIHJldHVybiBtYXhpbXVtIHZhbHVlLiAqLwotICAgICAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgY2hhcikgKDB4N0YgXiBtYXNrKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXZhbCA9ICh1bnNpZ25lZCBjaGFyKSBzZWcgPDwgU0VHX1NISUZUOwotICAgICAgICAgICAgICAgIGlmIChzZWcgPCAyKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZhbCB8PSAocGNtX3ZhbCA+PiAxKSAmIFFVQU5UX01BU0s7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYXZhbCB8PSAocGNtX3ZhbCA+PiBzZWcpICYgUVVBTlRfTUFTSzsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGF2YWwgXiBtYXNrKTsKLSAgICAgICAgfQorICAgIGlmIChzZWcgPj0gOCkgICAgICAgICAgIC8qIG91dCBvZiByYW5nZSwgcmV0dXJuIG1heGltdW0gdmFsdWUuICovCisgICAgICAgIHJldHVybiAodW5zaWduZWQgY2hhcikgKDB4N0YgXiBtYXNrKTsKKyAgICBlbHNlIHsKKyAgICAgICAgYXZhbCA9ICh1bnNpZ25lZCBjaGFyKSBzZWcgPDwgU0VHX1NISUZUOworICAgICAgICBpZiAoc2VnIDwgMikKKyAgICAgICAgICAgIGF2YWwgfD0gKHBjbV92YWwgPj4gMSkgJiBRVUFOVF9NQVNLOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdmFsIHw9IChwY21fdmFsID4+IHNlZykgJiBRVUFOVF9NQVNLOworICAgICAgICByZXR1cm4gKGF2YWwgXiBtYXNrKTsKKyAgICB9CiB9CiAvKiBFbmQgb2YgY29kZSB0YWtlbiBmcm9tIHNveCAqLwogCiAvKiBJbnRlbCBBRFBDTSBzdGVwIHZhcmlhdGlvbiB0YWJsZSAqLwogc3RhdGljIGludCBpbmRleFRhYmxlWzE2XSA9IHsKLSAgICAgICAgLTEsIC0xLCAtMSwgLTEsIDIsIDQsIDYsIDgsCi0gICAgICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAorICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAorICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAogfTsKIAogc3RhdGljIGludCBzdGVwc2l6ZVRhYmxlWzg5XSA9IHsKLSAgICAgICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsCi0gICAgICAgIDE5LCAyMSwgMjMsIDI1LCAyOCwgMzEsIDM0LCAzNywgNDEsIDQ1LAotICAgICAgICA1MCwgNTUsIDYwLCA2NiwgNzMsIDgwLCA4OCwgOTcsIDEwNywgMTE4LAotICAgICAgICAxMzAsIDE0MywgMTU3LCAxNzMsIDE5MCwgMjA5LCAyMzAsIDI1MywgMjc5LCAzMDcsCi0gICAgICAgIDMzNywgMzcxLCA0MDgsIDQ0OSwgNDk0LCA1NDQsIDU5OCwgNjU4LCA3MjQsIDc5NiwKLSAgICAgICAgODc2LCA5NjMsIDEwNjAsIDExNjYsIDEyODIsIDE0MTEsIDE1NTIsIDE3MDcsIDE4NzgsIDIwNjYsCi0gICAgICAgIDIyNzIsIDI0OTksIDI3NDksIDMwMjQsIDMzMjcsIDM2NjAsIDQwMjYsIDQ0MjgsIDQ4NzEsIDUzNTgsCi0gICAgICAgIDU4OTQsIDY0ODQsIDcxMzIsIDc4NDUsIDg2MzAsIDk0OTMsIDEwNDQyLCAxMTQ4NywgMTI2MzUsIDEzODk5LAotICAgICAgICAxNTI4OSwgMTY4MTgsIDE4NTAwLCAyMDM1MCwgMjIzODUsIDI0NjIzLCAyNzA4NiwgMjk3OTQsIDMyNzY3CisgICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsCisgICAgMTksIDIxLCAyMywgMjUsIDI4LCAzMSwgMzQsIDM3LCA0MSwgNDUsCisgICAgNTAsIDU1LCA2MCwgNjYsIDczLCA4MCwgODgsIDk3LCAxMDcsIDExOCwKKyAgICAxMzAsIDE0MywgMTU3LCAxNzMsIDE5MCwgMjA5LCAyMzAsIDI1MywgMjc5LCAzMDcsCisgICAgMzM3LCAzNzEsIDQwOCwgNDQ5LCA0OTQsIDU0NCwgNTk4LCA2NTgsIDcyNCwgNzk2LAorICAgIDg3NiwgOTYzLCAxMDYwLCAxMTY2LCAxMjgyLCAxNDExLCAxNTUyLCAxNzA3LCAxODc4LCAyMDY2LAorICAgIDIyNzIsIDI0OTksIDI3NDksIDMwMjQsIDMzMjcsIDM2NjAsIDQwMjYsIDQ0MjgsIDQ4NzEsIDUzNTgsCisgICAgNTg5NCwgNjQ4NCwgNzEzMiwgNzg0NSwgODYzMCwgOTQ5MywgMTA0NDIsIDExNDg3LCAxMjYzNSwgMTM4OTksCisgICAgMTUyODksIDE2ODE4LCAxODUwMCwgMjAzNTAsIDIyMzg1LCAyNDYyMywgMjcwODYsIDI5Nzk0LCAzMjc2NwogfTsKLSAgICAKKwogI2RlZmluZSBDSEFSUChjcCwgaSkgKChzaWduZWQgY2hhciAqKShjcCtpKSkKICNkZWZpbmUgU0hPUlRQKGNwLCBpKSAoKHNob3J0ICopKGNwK2kpKQogI2RlZmluZSBMT05HUChjcCwgaSkgKChQeV9JbnQzMiAqKShjcCtpKSkKQEAgLTI5OCwxMzcgKzI5OCwxMzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2dldHNhbXBsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgaW50IGk7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaTpnZXRzYW1wbGUiLCAmY3AsICZsZW4sICZzaXplLCAmaSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIGkgPCAwIHx8IGkgPj0gbGVuL3NpemUgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIkluZGV4IG91dCBvZiByYW5nZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkqMik7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSo0KTsKLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaTpnZXRzYW1wbGUiLCAmY3AsICZsZW4sICZzaXplLCAmaSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIGkgPCAwIHx8IGkgPj0gbGVuL3NpemUgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSoyKTsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkqNCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX21heChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBtYXggPSAwOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIGludCBpOworICAgIGludCBtYXggPSAwOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTptYXgiLCAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICAgICAgICAgIGlmICggdmFsIDwgMCApIHZhbCA9ICgtdmFsKTsKLSAgICAgICAgICAgICAgICBpZiAoIHZhbCA+IG1heCApIG1heCA9IHZhbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobWF4KTsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWF4IiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgaWYgKCB2YWwgPCAwICkgdmFsID0gKC12YWwpOworICAgICAgICBpZiAoIHZhbCA+IG1heCApIG1heCA9IHZhbDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1heCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX21pbm1heChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBtaW4gPSAweDdmZmZmZmZmLCBtYXggPSAtMHg3ZmZmZmZmZjsKKyAgICBzaWduZWQgY2hhciAqY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBpbnQgaTsKKyAgICBpbnQgbWluID0gMHg3ZmZmZmZmZiwgbWF4ID0gLTB4N2ZmZmZmZmY7CiAKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWlubWF4IiwgJmNwLCAmbGVuLCAmc2l6ZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKSB2YWwgPSAoaW50KSAqQ0hBUlAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemUgPT0gMikgdmFsID0gKGludCkgKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KSB2YWwgPSAoaW50KSAqTE9OR1AoY3AsIGkpOwotICAgICAgICAgICAgICAgIGlmICh2YWwgPiBtYXgpIG1heCA9IHZhbDsKLSAgICAgICAgICAgICAgICBpZiAodmFsIDwgbWluKSBtaW4gPSB2YWw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaSkiLCBtaW4sIG1heCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bWlubWF4IiwgJmNwLCAmbGVuLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMSkgdmFsID0gKGludCkgKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKSB2YWwgPSAoaW50KSAqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KSB2YWwgPSAoaW50KSAqTE9OR1AoY3AsIGkpOworICAgICAgICBpZiAodmFsID4gbWF4KSBtYXggPSB2YWw7CisgICAgICAgIGlmICh2YWwgPCBtaW4pIG1pbiA9IHZhbDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaSkiLCBtaW4sIG1heCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2F2ZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGRvdWJsZSBhdmcgPSAwLjA7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgaW50IGk7CisgICAgZG91YmxlIGF2ZyA9IDAuMDsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6YXZnIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBhdmcgKz0gdmFsOwotICAgICAgICB9Ci0gICAgICAgIGlmICggbGVuID09IDAgKQotICAgICAgICAgICAgICAgIHZhbCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKShsZW4vc2l6ZSkpOwotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6YXZnIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgYXZnICs9IHZhbDsKKyAgICB9CisgICAgaWYgKCBsZW4gPT0gMCApCisgICAgICAgIHZhbCA9IDA7CisgICAgZWxzZQorICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKShsZW4vc2l6ZSkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9ybXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBkb3VibGUgc3VtX3NxdWFyZXMgPSAwLjA7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgaW50IGk7CisgICAgZG91YmxlIHN1bV9zcXVhcmVzID0gMC4wOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpybXMiLCAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICAgICAgICAgIHN1bV9zcXVhcmVzICs9IChkb3VibGUpdmFsKihkb3VibGUpdmFsOwotICAgICAgICB9Ci0gICAgICAgIGlmICggbGVuID09IDAgKQotICAgICAgICAgICAgICAgIHZhbCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2YWwgPSAoaW50KXNxcnQoc3VtX3NxdWFyZXMgLyAoZG91YmxlKShsZW4vc2l6ZSkpOwotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6cm1zIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKCBpPTA7IGk8bGVuOyBpKz0gc2l6ZSkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICAgICAgc3VtX3NxdWFyZXMgKz0gKGRvdWJsZSl2YWwqKGRvdWJsZSl2YWw7CisgICAgfQorICAgIGlmICggbGVuID09IDAgKQorICAgICAgICB2YWwgPSAwOworICAgIGVsc2UKKyAgICAgICAgdmFsID0gKGludClzcXJ0KHN1bV9zcXVhcmVzIC8gKGRvdWJsZSkobGVuL3NpemUpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsKTsKIH0KIAogc3RhdGljIGRvdWJsZSBfc3VtMihzaG9ydCAqYSwgc2hvcnQgKmIsIGludCBsZW4pCiB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBkb3VibGUgc3VtID0gMC4wOworICAgIGludCBpOworICAgIGRvdWJsZSBzdW0gPSAwLjA7CiAKLSAgICAgICAgZm9yKCBpPTA7IGk8bGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzdW0gPSBzdW0gKyAoZG91YmxlKWFbaV0qKGRvdWJsZSliW2ldOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdW07CisgICAgZm9yKCBpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgc3VtID0gc3VtICsgKGRvdWJsZSlhW2ldKihkb3VibGUpYltpXTsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKIH0KIAogLyoKQEAgLTQ2Niw2MCArNDY2LDYwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9maW5kZml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2hvcnQgKmNwMSwgKmNwMjsKLSAgICAgICAgaW50IGxlbjEsIGxlbjI7Ci0gICAgICAgIGludCBqLCBiZXN0X2o7Ci0gICAgICAgIGRvdWJsZSBhal9tMSwgYWpfbG0xOwotICAgICAgICBkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfMiwgc3VtX2Fpal9yaSwgcmVzdWx0LCBiZXN0X3Jlc3VsdCwgZmFjdG9yOworICAgIHNob3J0ICpjcDEsICpjcDI7CisgICAgaW50IGxlbjEsIGxlbjI7CisgICAgaW50IGosIGJlc3RfajsKKyAgICBkb3VibGUgYWpfbTEsIGFqX2xtMTsKKyAgICBkb3VibGUgc3VtX3JpXzIsIHN1bV9haWpfMiwgc3VtX2Fpal9yaSwgcmVzdWx0LCBiZXN0X3Jlc3VsdCwgZmFjdG9yOwogCi0JLyogUGFzc2luZyBhIHNob3J0KiogZm9yIGFuICdzJyBhcmd1bWVudCBpcyBjb3JyZWN0IG9ubHkKLQkgICBpZiB0aGUgc3RyaW5nIGNvbnRlbnRzIGlzIGFsaWduZWQgZm9yIGludGVycHJldGF0aW9uCi0JICAgYXMgc2hvcnRbXS4gRHVlIHRvIHRoZSBkZWZpbml0aW9uIG9mIFB5U3RyaW5nT2JqZWN0LAotCSAgIHRoaXMgaXMgY3VycmVudGx5IChQeXRob24gMi42KSB0aGUgY2FzZS4gKi8KLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNzIzpmaW5kZml0IiwKLQkgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKiopJmNwMSwgJmxlbjEsIChjaGFyKiopJmNwMiwgJmxlbjIpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBsZW4xICYgMSB8fCBsZW4yICYgMSApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGxlbjEgPj49IDE7Ci0gICAgICAgIGxlbjIgPj49IDE7Ci0gICAgCi0gICAgICAgIGlmICggbGVuMSA8IGxlbjIgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIkZpcnN0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7Ci0gICAgICAgIHN1bV9haWpfMiA9IF9zdW0yKGNwMSwgY3AxLCBsZW4yKTsKLSAgICAgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKKyAgICAvKiBQYXNzaW5nIGEgc2hvcnQqKiBmb3IgYW4gJ3MnIGFyZ3VtZW50IGlzIGNvcnJlY3Qgb25seQorICAgICAgIGlmIHRoZSBzdHJpbmcgY29udGVudHMgaXMgYWxpZ25lZCBmb3IgaW50ZXJwcmV0YXRpb24KKyAgICAgICBhcyBzaG9ydFtdLiBEdWUgdG8gdGhlIGRlZmluaXRpb24gb2YgUHlTdHJpbmdPYmplY3QsCisgICAgICAgdGhpcyBpcyBjdXJyZW50bHkgKFB5dGhvbiAyLjYpIHRoZSBjYXNlLiAqLworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjcyM6ZmluZGZpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhcioqKSZjcDEsICZsZW4xLCAoY2hhcioqKSZjcDIsICZsZW4yKSApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggbGVuMSAmIDEgfHwgbGVuMiAmIDEgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTdHJpbmdzIHNob3VsZCBiZSBldmVuLXNpemVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsZW4xID4+PSAxOworICAgIGxlbjIgPj49IDE7CiAKLSAgICAgICAgcmVzdWx0ID0gKHN1bV9yaV8yKnN1bV9haWpfMiAtIHN1bV9haWpfcmkqc3VtX2Fpal9yaSkgLyBzdW1fYWlqXzI7CisgICAgaWYgKCBsZW4xIDwgbGVuMiApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIkZpcnN0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzdW1fcmlfMiA9IF9zdW0yKGNwMiwgY3AyLCBsZW4yKTsKKyAgICBzdW1fYWlqXzIgPSBfc3VtMihjcDEsIGNwMSwgbGVuMik7CisgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKIAotICAgICAgICBiZXN0X3Jlc3VsdCA9IHJlc3VsdDsKLSAgICAgICAgYmVzdF9qID0gMDsKLSAgICAgICAgaiA9IDA7CisgICAgcmVzdWx0ID0gKHN1bV9yaV8yKnN1bV9haWpfMiAtIHN1bV9haWpfcmkqc3VtX2Fpal9yaSkgLyBzdW1fYWlqXzI7CiAKLSAgICAgICAgZm9yICggaj0xOyBqPD1sZW4xLWxlbjI7IGorKykgewotICAgICAgICAgICAgICAgIGFqX20xID0gKGRvdWJsZSljcDFbai0xXTsKLSAgICAgICAgICAgICAgICBhal9sbTEgPSAoZG91YmxlKWNwMVtqK2xlbjItMV07CisgICAgYmVzdF9yZXN1bHQgPSByZXN1bHQ7CisgICAgYmVzdF9qID0gMDsKKyAgICBqID0gMDsKIAotICAgICAgICAgICAgICAgIHN1bV9haWpfMiA9IHN1bV9haWpfMiArIGFqX2xtMSphal9sbTEgLSBhal9tMSphal9tMTsKLSAgICAgICAgICAgICAgICBzdW1fYWlqX3JpID0gX3N1bTIoY3AxK2osIGNwMiwgbGVuMik7CisgICAgZm9yICggaj0xOyBqPD1sZW4xLWxlbjI7IGorKykgeworICAgICAgICBhal9tMSA9IChkb3VibGUpY3AxW2otMV07CisgICAgICAgIGFqX2xtMSA9IChkb3VibGUpY3AxW2orbGVuMi0xXTsKIAotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpCi0gICAgICAgICAgICAgICAgICAgICAgICAvIHN1bV9haWpfMjsKKyAgICAgICAgc3VtX2Fpal8yID0gc3VtX2Fpal8yICsgYWpfbG0xKmFqX2xtMSAtIGFqX20xKmFqX20xOworICAgICAgICBzdW1fYWlqX3JpID0gX3N1bTIoY3AxK2osIGNwMiwgbGVuMik7CiAKLSAgICAgICAgICAgICAgICBpZiAoIHJlc3VsdCA8IGJlc3RfcmVzdWx0ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9yZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2ogPSBqOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCisgICAgICAgIHJlc3VsdCA9IChzdW1fcmlfMipzdW1fYWlqXzIgLSBzdW1fYWlqX3JpKnN1bV9haWpfcmkpCisgICAgICAgICAgICAvIHN1bV9haWpfMjsKKworICAgICAgICBpZiAoIHJlc3VsdCA8IGJlc3RfcmVzdWx0ICkgeworICAgICAgICAgICAgYmVzdF9yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBiZXN0X2ogPSBqOwogICAgICAgICB9CiAKLSAgICAgICAgZmFjdG9yID0gX3N1bTIoY3AxK2Jlc3RfaiwgY3AyLCBsZW4yKSAvIHN1bV9yaV8yOwotICAgIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlmKSIsIGJlc3RfaiwgZmFjdG9yKTsKKyAgICB9CisKKyAgICBmYWN0b3IgPSBfc3VtMihjcDErYmVzdF9qLCBjcDIsIGxlbjIpIC8gc3VtX3JpXzI7CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlmKSIsIGJlc3RfaiwgZmFjdG9yKTsKIH0KIAogLyoKQEAgLTUyOSwyOCArNTI5LDI4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9maW5kZmFjdG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2hvcnQgKmNwMSwgKmNwMjsKLSAgICAgICAgaW50IGxlbjEsIGxlbjI7Ci0gICAgICAgIGRvdWJsZSBzdW1fcmlfMiwgc3VtX2Fpal9yaSwgcmVzdWx0OworICAgIHNob3J0ICpjcDEsICpjcDI7CisgICAgaW50IGxlbjEsIGxlbjI7CisgICAgZG91YmxlIHN1bV9yaV8yLCBzdW1fYWlqX3JpLCByZXN1bHQ7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNzIzpmaW5kZmFjdG9yIiwKLQkgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKiopJmNwMSwgJmxlbjEsIChjaGFyKiopJmNwMiwgJmxlbjIpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBsZW4xICYgMSB8fCBsZW4yICYgMSApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICggbGVuMSAhPSBsZW4yICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTYW1wbGVzIHNob3VsZCBiZSBzYW1lIHNpemUiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBsZW4yID4+PSAxOwotICAgICAgICBzdW1fcmlfMiA9IF9zdW0yKGNwMiwgY3AyLCBsZW4yKTsKLSAgICAgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3MjOmZpbmRmYWN0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKikmY3AxLCAmbGVuMSwgKGNoYXIqKikmY3AyLCAmbGVuMikgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIGxlbjEgJiAxIHx8IGxlbjIgJiAxICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU3RyaW5ncyBzaG91bGQgYmUgZXZlbi1zaXplZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCBsZW4xICE9IGxlbjIgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTYW1wbGVzIHNob3VsZCBiZSBzYW1lIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGxlbjIgPj49IDE7CisgICAgc3VtX3JpXzIgPSBfc3VtMihjcDIsIGNwMiwgbGVuMik7CisgICAgc3VtX2Fpal9yaSA9IF9zdW0yKGNwMSwgY3AyLCBsZW4yKTsKIAotICAgICAgICByZXN1bHQgPSBzdW1fYWlqX3JpIC8gc3VtX3JpXzI7CisgICAgcmVzdWx0ID0gc3VtX2Fpal9yaSAvIHN1bV9yaV8yOwogCi0gICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocmVzdWx0KTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CiB9CiAKIC8qCkBAIC01NjAsMTA5NiArNTYwLDEwOTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2ZpbmRtYXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaG9ydCAqY3AxOwotICAgICAgICBpbnQgbGVuMSwgbGVuMjsKLSAgICAgICAgaW50IGosIGJlc3RfajsKLSAgICAgICAgZG91YmxlIGFqX20xLCBhal9sbTE7Ci0gICAgICAgIGRvdWJsZSByZXN1bHQsIGJlc3RfcmVzdWx0OworICAgIHNob3J0ICpjcDE7CisgICAgaW50IGxlbjEsIGxlbjI7CisgICAgaW50IGosIGJlc3RfajsKKyAgICBkb3VibGUgYWpfbTEsIGFqX2xtMTsKKyAgICBkb3VibGUgcmVzdWx0LCBiZXN0X3Jlc3VsdDsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6ZmluZG1heCIsIAotCQkJICAgICAgIChjaGFyKiopJmNwMSwgJmxlbjEsICZsZW4yKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmICggbGVuMSAmIDEgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlN0cmluZ3Mgc2hvdWxkIGJlIGV2ZW4tc2l6ZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBsZW4xID4+PSAxOwotICAgIAotICAgICAgICBpZiAoIGxlbjIgPCAwIHx8IGxlbjEgPCBsZW4yICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJJbnB1dCBzYW1wbGUgc2hvdWxkIGJlIGxvbmdlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpmaW5kbWF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKiopJmNwMSwgJmxlbjEsICZsZW4yKSApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggbGVuMSAmIDEgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTdHJpbmdzIHNob3VsZCBiZSBldmVuLXNpemVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsZW4xID4+PSAxOworCisgICAgaWYgKCBsZW4yIDwgMCB8fCBsZW4xIDwgbGVuMiApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIklucHV0IHNhbXBsZSBzaG91bGQgYmUgbG9uZ2VyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJlc3VsdCA9IF9zdW0yKGNwMSwgY3AxLCBsZW4yKTsKKworICAgIGJlc3RfcmVzdWx0ID0gcmVzdWx0OworICAgIGJlc3RfaiA9IDA7CisgICAgaiA9IDA7CisKKyAgICBmb3IgKCBqPTE7IGo8PWxlbjEtbGVuMjsgaisrKSB7CisgICAgICAgIGFqX20xID0gKGRvdWJsZSljcDFbai0xXTsKKyAgICAgICAgYWpfbG0xID0gKGRvdWJsZSljcDFbaitsZW4yLTFdOworCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGFqX2xtMSphal9sbTEgLSBhal9tMSphal9tMTsKKworICAgICAgICBpZiAoIHJlc3VsdCA+IGJlc3RfcmVzdWx0ICkgeworICAgICAgICAgICAgYmVzdF9yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBiZXN0X2ogPSBqOwogICAgICAgICB9CiAKLSAgICAgICAgcmVzdWx0ID0gX3N1bTIoY3AxLCBjcDEsIGxlbjIpOworICAgIH0KIAotICAgICAgICBiZXN0X3Jlc3VsdCA9IHJlc3VsdDsKLSAgICAgICAgYmVzdF9qID0gMDsKLSAgICAgICAgaiA9IDA7Ci0KLSAgICAgICAgZm9yICggaj0xOyBqPD1sZW4xLWxlbjI7IGorKykgewotICAgICAgICAgICAgICAgIGFqX20xID0gKGRvdWJsZSljcDFbai0xXTsKLSAgICAgICAgICAgICAgICBhal9sbTEgPSAoZG91YmxlKWNwMVtqK2xlbjItMV07Ci0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBhal9sbTEqYWpfbG0xIC0gYWpfbTEqYWpfbTE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIHJlc3VsdCA+IGJlc3RfcmVzdWx0ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9yZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2ogPSBqOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoYmVzdF9qKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoYmVzdF9qKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfYXZncHAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDAsIHByZXZ2YWwgPSAwLCBwcmV2ZXh0cmVtZXZhbGlkID0gMCwKLSAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZSA9IDA7Ci0gICAgICAgIGludCBpOwotICAgICAgICBkb3VibGUgYXZnID0gMC4wOwotICAgICAgICBpbnQgZGlmZiwgcHJldmRpZmYsIGV4dHJlbWVkaWZmLCBuZXh0cmVtZSA9IDA7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDAsIHByZXZ2YWwgPSAwLCBwcmV2ZXh0cmVtZXZhbGlkID0gMCwKKyAgICAgICAgcHJldmV4dHJlbWUgPSAwOworICAgIGludCBpOworICAgIGRvdWJsZSBhdmcgPSAwLjA7CisgICAgaW50IGRpZmYsIHByZXZkaWZmLCBleHRyZW1lZGlmZiwgbmV4dHJlbWUgPSAwOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTphdmdwcCIsICZjcCwgJmxlbiwgJnNpemUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmF2Z3BwIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBDb21wdXRlIGZpcnN0IGRlbHRhIHZhbHVlIGFoZWFkLiBBbHNvIGF1dG9tYXRpY2FsbHkgbWFrZXMgdXMKKyAgICAqKiBza2lwIHRoZSBmaXJzdCBleHRyZW1lIHZhbHVlCisgICAgKi8KKyAgICBpZiAoIHNpemUgPT0gMSApICAgICAgcHJldnZhbCA9IChpbnQpKkNIQVJQKGNwLCAwKTsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgcHJldnZhbCA9IChpbnQpKlNIT1JUUChjcCwgMCk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHByZXZ2YWwgPSAoaW50KSpMT05HUChjcCwgMCk7CisgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBzaXplKTsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBzaXplKTsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIHNpemUpOworICAgIHByZXZkaWZmID0gdmFsIC0gcHJldnZhbDsKKworICAgIGZvciAoIGk9c2l6ZTsgaTxsZW47IGkrPSBzaXplKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOworICAgICAgICBkaWZmID0gdmFsIC0gcHJldnZhbDsKKyAgICAgICAgaWYgKCBkaWZmKnByZXZkaWZmIDwgMCApIHsKKyAgICAgICAgICAgIC8qIERlcml2YXRpdmUgY2hhbmdlZCBzaWduLiBDb21wdXRlIGRpZmZlcmVuY2UgdG8gbGFzdAorICAgICAgICAgICAgKiogZXh0cmVtZSB2YWx1ZSBhbmQgcmVtZW1iZXIuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCBwcmV2ZXh0cmVtZXZhbGlkICkgeworICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gcHJldnZhbCAtIHByZXZleHRyZW1lOworICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSAtZXh0cmVtZWRpZmY7CisgICAgICAgICAgICAgICAgYXZnICs9IGV4dHJlbWVkaWZmOworICAgICAgICAgICAgICAgIG5leHRyZW1lKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2ZXh0cmVtZXZhbGlkID0gMTsKKyAgICAgICAgICAgIHByZXZleHRyZW1lID0gcHJldnZhbDsKICAgICAgICAgfQotICAgICAgICAvKiBDb21wdXRlIGZpcnN0IGRlbHRhIHZhbHVlIGFoZWFkLiBBbHNvIGF1dG9tYXRpY2FsbHkgbWFrZXMgdXMKLSAgICAgICAgKiogc2tpcCB0aGUgZmlyc3QgZXh0cmVtZSB2YWx1ZQotICAgICAgICAqLwotICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgcHJldnZhbCA9IChpbnQpKkNIQVJQKGNwLCAwKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHByZXZ2YWwgPSAoaW50KSpTSE9SVFAoY3AsIDApOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgcHJldnZhbCA9IChpbnQpKkxPTkdQKGNwLCAwKTsKLSAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBzaXplKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgc2l6ZSk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgc2l6ZSk7Ci0gICAgICAgIHByZXZkaWZmID0gdmFsIC0gcHJldnZhbDsKLSAgICAKLSAgICAgICAgZm9yICggaT1zaXplOyBpPGxlbjsgaSs9IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZGlmZiA9IHZhbCAtIHByZXZ2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCBkaWZmKnByZXZkaWZmIDwgMCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlcml2YXRpdmUgY2hhbmdlZCBzaWduLiBDb21wdXRlIGRpZmZlcmVuY2UgdG8gbGFzdAotICAgICAgICAgICAgICAgICAgICAgICAgKiogZXh0cmVtZSB2YWx1ZSBhbmQgcmVtZW1iZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwcmV2ZXh0cmVtZXZhbGlkICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyZW1lZGlmZiA9IHByZXZ2YWwgLSBwcmV2ZXh0cmVtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA8IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gLWV4dHJlbWVkaWZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmcgKz0gZXh0cmVtZWRpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRyZW1lKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZXZhbGlkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZleHRyZW1lID0gcHJldnZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldnZhbCA9IHZhbDsKLSAgICAgICAgICAgICAgICBpZiAoIGRpZmYgIT0gMCApCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZGlmZiA9IGRpZmY7ICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBpZiAoIG5leHRyZW1lID09IDAgKQotICAgICAgICAgICAgICAgIHZhbCA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2YWwgPSAoaW50KShhdmcgLyAoZG91YmxlKW5leHRyZW1lKTsKLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgICAgIHByZXZ2YWwgPSB2YWw7CisgICAgICAgIGlmICggZGlmZiAhPSAwICkKKyAgICAgICAgICAgIHByZXZkaWZmID0gZGlmZjsKKyAgICB9CisgICAgaWYgKCBuZXh0cmVtZSA9PSAwICkKKyAgICAgICAgdmFsID0gMDsKKyAgICBlbHNlCisgICAgICAgIHZhbCA9IChpbnQpKGF2ZyAvIChkb3VibGUpbmV4dHJlbWUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9tYXhwcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMCwgcHJldnZhbCA9IDAsIHByZXZleHRyZW1ldmFsaWQgPSAwLAotICAgICAgICAgICAgICAgIHByZXZleHRyZW1lID0gMDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBtYXggPSAwOwotICAgICAgICBpbnQgZGlmZiwgcHJldmRpZmYsIGV4dHJlbWVkaWZmOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwLCBwcmV2dmFsID0gMCwgcHJldmV4dHJlbWV2YWxpZCA9IDAsCisgICAgICAgIHByZXZleHRyZW1lID0gMDsKKyAgICBpbnQgaTsKKyAgICBpbnQgbWF4ID0gMDsKKyAgICBpbnQgZGlmZiwgcHJldmRpZmYsIGV4dHJlbWVkaWZmOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTptYXhwcCIsICZjcCwgJmxlbiwgJnNpemUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogQ29tcHV0ZSBmaXJzdCBkZWx0YSB2YWx1ZSBhaGVhZC4gQWxzbyBhdXRvbWF0aWNhbGx5IG1ha2VzIHVzCi0gICAgICAgICoqIHNraXAgdGhlIGZpcnN0IGV4dHJlbWUgdmFsdWUKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHByZXZ2YWwgPSAoaW50KSpDSEFSUChjcCwgMCk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBwcmV2dmFsID0gKGludCkqU0hPUlRQKGNwLCAwKTsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHByZXZ2YWwgPSAoaW50KSpMT05HUChjcCwgMCk7Ci0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgc2l6ZSk7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIHNpemUpOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIHNpemUpOwotICAgICAgICBwcmV2ZGlmZiA9IHZhbCAtIHByZXZ2YWw7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOm1heHBwIiwgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvKiBDb21wdXRlIGZpcnN0IGRlbHRhIHZhbHVlIGFoZWFkLiBBbHNvIGF1dG9tYXRpY2FsbHkgbWFrZXMgdXMKKyAgICAqKiBza2lwIHRoZSBmaXJzdCBleHRyZW1lIHZhbHVlCisgICAgKi8KKyAgICBpZiAoIHNpemUgPT0gMSApICAgICAgcHJldnZhbCA9IChpbnQpKkNIQVJQKGNwLCAwKTsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgcHJldnZhbCA9IChpbnQpKlNIT1JUUChjcCwgMCk7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHByZXZ2YWwgPSAoaW50KSpMT05HUChjcCwgMCk7CisgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBzaXplKTsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBzaXplKTsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIHNpemUpOworICAgIHByZXZkaWZmID0gdmFsIC0gcHJldnZhbDsKIAotICAgICAgICBmb3IgKCBpPXNpemU7IGk8bGVuOyBpKz0gc2l6ZSkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBkaWZmID0gdmFsIC0gcHJldnZhbDsKLSAgICAgICAgICAgICAgICBpZiAoIGRpZmYqcHJldmRpZmYgPCAwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVyaXZhdGl2ZSBjaGFuZ2VkIHNpZ24uIENvbXB1dGUgZGlmZmVyZW5jZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgKiogbGFzdCBleHRyZW1lIHZhbHVlIGFuZCByZW1lbWJlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByZXZleHRyZW1ldmFsaWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gcHJldnZhbCAtIHByZXZleHRyZW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGV4dHJlbWVkaWZmIDwgMCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSAtZXh0cmVtZWRpZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPiBtYXggKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IGV4dHJlbWVkaWZmOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmV4dHJlbWV2YWxpZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZXh0cmVtZSA9IHByZXZ2YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByZXZ2YWwgPSB2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCBkaWZmICE9IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJldmRpZmYgPSBkaWZmOworICAgIGZvciAoIGk9c2l6ZTsgaTxsZW47IGkrPSBzaXplKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOworICAgICAgICBkaWZmID0gdmFsIC0gcHJldnZhbDsKKyAgICAgICAgaWYgKCBkaWZmKnByZXZkaWZmIDwgMCApIHsKKyAgICAgICAgICAgIC8qIERlcml2YXRpdmUgY2hhbmdlZCBzaWduLiBDb21wdXRlIGRpZmZlcmVuY2UgdG8KKyAgICAgICAgICAgICoqIGxhc3QgZXh0cmVtZSB2YWx1ZSBhbmQgcmVtZW1iZXIuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCBwcmV2ZXh0cmVtZXZhbGlkICkgeworICAgICAgICAgICAgICAgIGV4dHJlbWVkaWZmID0gcHJldnZhbCAtIHByZXZleHRyZW1lOworICAgICAgICAgICAgICAgIGlmICggZXh0cmVtZWRpZmYgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgZXh0cmVtZWRpZmYgPSAtZXh0cmVtZWRpZmY7CisgICAgICAgICAgICAgICAgaWYgKCBleHRyZW1lZGlmZiA+IG1heCApCisgICAgICAgICAgICAgICAgICAgIG1heCA9IGV4dHJlbWVkaWZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldmV4dHJlbWV2YWxpZCA9IDE7CisgICAgICAgICAgICBwcmV2ZXh0cmVtZSA9IHByZXZ2YWw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1heCk7CisgICAgICAgIHByZXZ2YWwgPSB2YWw7CisgICAgICAgIGlmICggZGlmZiAhPSAwICkKKyAgICAgICAgICAgIHByZXZkaWZmID0gZGlmZjsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1heCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2Nyb3NzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaW50IHByZXZ2YWwsIG5jcm9zczsKKyAgICBzaWduZWQgY2hhciAqY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcHJldnZhbCwgbmNyb3NzOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpjcm9zcyIsICZjcCwgJmxlbiwgJnNpemUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbmNyb3NzID0gLTE7Ci0gICAgICAgIHByZXZ2YWwgPSAxNzsgLyogQW55dGhpbmcgPD4gMCwxICovCi0gICAgICAgIGZvciAoIGk9MDsgaTxsZW47IGkrPSBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpID4+IDc7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9ICgoaW50KSpTSE9SVFAoY3AsIGkpKSA+PiAxNTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMzE7Ci0gICAgICAgICAgICAgICAgdmFsID0gdmFsICYgMTsKLSAgICAgICAgICAgICAgICBpZiAoIHZhbCAhPSBwcmV2dmFsICkgbmNyb3NzKys7Ci0gICAgICAgICAgICAgICAgcHJldnZhbCA9IHZhbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobmNyb3NzKTsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6Y3Jvc3MiLCAmY3AsICZsZW4sICZzaXplKSApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG5jcm9zcyA9IC0xOworICAgIHByZXZ2YWwgPSAxNzsgLyogQW55dGhpbmcgPD4gMCwxICovCisgICAgZm9yICggaT0wOyBpPGxlbjsgaSs9IHNpemUpIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpID4+IDc7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoKGludCkqU0hPUlRQKGNwLCBpKSkgPj4gMTU7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAzMTsKKyAgICAgICAgdmFsID0gdmFsICYgMTsKKyAgICAgICAgaWYgKCB2YWwgIT0gcHJldnZhbCApIG5jcm9zcysrOworICAgICAgICBwcmV2dmFsID0gdmFsOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobmNyb3NzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfbXVsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOwotICAgICAgICBkb3VibGUgZmFjdG9yLCBmdmFsLCBtYXh2YWw7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGk7CisgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7CisgICAgZG91YmxlIGZhY3RvciwgZnZhbCwgbWF4dmFsOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lkOm11bCIsICZjcCwgJmxlbiwgJnNpemUsICZmYWN0b3IgKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZmZmZmY7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIAotICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLSAgICAKLSAgICAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOwotICAgICAgICAgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWN0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLSAgICAgICAgICAgICAgICB2YWwgPSAoaW50KWZ2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKXZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KXZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpdmFsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydjsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lkOm11bCIsICZjcCwgJmxlbiwgJnNpemUsICZmYWN0b3IgKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmOworICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZmZmZmY7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKworCisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKGludCkqTE9OR1AoY3AsIGkpOworICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwqZmFjdG9yOworICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOworICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKKyAgICAgICAgdmFsID0gKGludClmdmFsOworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpdmFsOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KXZhbDsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKXZhbDsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF90b21vbm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbDEgPSAwLCB2YWwyID0gMDsKLSAgICAgICAgZG91YmxlIGZhYzEsIGZhYzIsIGZ2YWwsIG1heHZhbDsKLSAgICAgICAgUHlPYmplY3QgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgaW50IGxlbiwgc2l6ZSwgdmFsMSA9IDAsIHZhbDIgPSAwOworICAgIGRvdWJsZSBmYWMxLCBmYWMyLCBmdmFsLCBtYXh2YWw7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWRkOnRvbW9ubyIsCi0JICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmZmFjMSwgJmZhYzIgKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKLSAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZmZmZmY7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIAotICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi8yKTsKLSAgICAgICAgaWYgKCBydiA9PSAwICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotICAgIAotICAgIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSoyICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwxID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMSA9IChpbnQpKkxPTkdQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMiA9IChpbnQpKkNIQVJQKGNwLCBpKzEpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwLCBpKzIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwyID0gKGludCkqTE9OR1AoY3AsIGkrNCk7Ci0gICAgICAgICAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsMSpmYWMxICsgKGRvdWJsZSl2YWwyKmZhYzI7Ci0gICAgICAgICAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLSAgICAgICAgICAgICAgICB2YWwxID0gKGludClmdmFsOwotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpLzIpID0gKHNpZ25lZCBjaGFyKXZhbDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpLzIpID0gKHNob3J0KXZhbDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkvMik9IChQeV9JbnQzMil2YWwxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydjsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lkZDp0b21vbm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhYzEsICZmYWMyICkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZjsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmOworICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLzIpOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKworCisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUqMiApIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDEgPSAoaW50KSpDSEFSUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwxID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDEgPSAoaW50KSpMT05HUChjcCwgaSk7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwyID0gKGludCkqQ0hBUlAoY3AsIGkrMSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwyID0gKGludCkqU0hPUlRQKGNwLCBpKzIpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMiA9IChpbnQpKkxPTkdQKGNwLCBpKzQpOworICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwxKmZhYzEgKyAoZG91YmxlKXZhbDIqZmFjMjsKKyAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKKyAgICAgICAgZWxzZSBpZiAoIGZ2YWwgPCAtbWF4dmFsICkgZnZhbCA9IC1tYXh2YWw7CisgICAgICAgIHZhbDEgPSAoaW50KWZ2YWw7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpLzIpID0gKHNpZ25lZCBjaGFyKXZhbDE7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaS8yKSA9IChzaG9ydCl2YWwxOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaS8yKT0gKFB5X0ludDMyKXZhbDE7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF1ZGlvb3BfdG9zdGVyZW8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7Ci0gICAgICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHZhbDEsIHZhbDIsIHZhbCA9IDA7Ci0gICAgICAgIGRvdWJsZSBmYWMxLCBmYWMyLCBmdmFsLCBtYXh2YWw7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGk7CisgICAgc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHZhbDEsIHZhbDIsIHZhbCA9IDA7CisgICAgZG91YmxlIGZhYzEsIGZhYzIsIGZ2YWwsIG1heHZhbDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpZGQ6dG9zdGVyZW8iLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhYzEsICZmYWMyICkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgIAotICAgICAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmY7Ci0gICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAoZG91YmxlKSAweDdmZmZmZmZmOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgbmV3X2xlbiA9IGxlbioyOwotICAgICAgICBpZiAobmV3X2xlbiA8IDApIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpZGQ6dG9zdGVyZW8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJmZhYzEsICZmYWMyICkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ld19sZW4pOwotICAgICAgICBpZiAoIHJ2ID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0gICAgCi0gICAgCi0gICAgICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoaW50KSpDSEFSUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKyAgICBpZiAoIHNpemUgPT0gMSApIG1heHZhbCA9IChkb3VibGUpIDB4N2Y7CisgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIG1heHZhbCA9IChkb3VibGUpIDB4N2ZmZjsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gKGRvdWJsZSkgMHg3ZmZmZmZmZjsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBmdmFsID0gKGRvdWJsZSl2YWwqZmFjMTsKLSAgICAgICAgICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOwotICAgICAgICAgICAgICAgIHZhbDEgPSAoaW50KWZ2YWw7CisgICAgbmV3X2xlbiA9IGxlbioyOworICAgIGlmIChuZXdfbGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgICAgICAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsKmZhYzI7Ci0gICAgICAgICAgICAgICAgaWYgKCBmdmFsID4gbWF4dmFsICkgZnZhbCA9IG1heHZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKLSAgICAgICAgICAgICAgICB2YWwyID0gKGludClmdmFsOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmV3X2xlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkqMikgPSAoc2lnbmVkIGNoYXIpdmFsMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMikgPSAoc2hvcnQpdmFsMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSoyKSA9IChQeV9JbnQzMil2YWwxOwogCi0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkqMisxKSA9IChzaWduZWQgY2hhcil2YWwyOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSoyKzIpID0gKHNob3J0KXZhbDI7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkqMis0KSA9IChQeV9JbnQzMil2YWwyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydjsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9IChpbnQpKkNIQVJQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7CisKKyAgICAgICAgZnZhbCA9IChkb3VibGUpdmFsKmZhYzE7CisgICAgICAgIGlmICggZnZhbCA+IG1heHZhbCApIGZ2YWwgPSBtYXh2YWw7CisgICAgICAgIGVsc2UgaWYgKCBmdmFsIDwgLW1heHZhbCApIGZ2YWwgPSAtbWF4dmFsOworICAgICAgICB2YWwxID0gKGludClmdmFsOworCisgICAgICAgIGZ2YWwgPSAoZG91YmxlKXZhbCpmYWMyOworICAgICAgICBpZiAoIGZ2YWwgPiBtYXh2YWwgKSBmdmFsID0gbWF4dmFsOworICAgICAgICBlbHNlIGlmICggZnZhbCA8IC1tYXh2YWwgKSBmdmFsID0gLW1heHZhbDsKKyAgICAgICAgdmFsMiA9IChpbnQpZnZhbDsKKworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKSA9IChzaWduZWQgY2hhcil2YWwxOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkqMikgPSAoc2hvcnQpdmFsMTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkqMikgPSAoUHlfSW50MzIpdmFsMTsKKworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSoyKzEpID0gKHNpZ25lZCBjaGFyKXZhbDI7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSoyKzIpID0gKHNob3J0KXZhbDI7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSAqTE9OR1AobmNwLCBpKjIrNCkgPSAoUHlfSW50MzIpdmFsMjsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9hZGQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3AxLCAqY3AyLCAqbmNwOwotICAgICAgICBpbnQgbGVuMSwgbGVuMiwgc2l6ZSwgdmFsMSA9IDAsIHZhbDIgPSAwLCBtYXh2YWwsIG5ld3ZhbDsKLSAgICAgICAgUHlPYmplY3QgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICBzaWduZWQgY2hhciAqY3AxLCAqY3AyLCAqbmNwOworICAgIGludCBsZW4xLCBsZW4yLCBzaXplLCB2YWwxID0gMCwgdmFsMiA9IDAsIG1heHZhbCwgbmV3dmFsOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3MjaTphZGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AxLCAmbGVuMSwgJmNwMiwgJmxlbjIsICZzaXplICkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjcyNpOmFkZCIsCisgICAgICAgICAgICAgICAgICAgICAgJmNwMSwgJmxlbjEsICZjcDIsICZsZW4yLCAmc2l6ZSApICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCBsZW4xICE9IGxlbjIgKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIkxlbmd0aHMgc2hvdWxkIGJlIHRoZSBzYW1lIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgaWYgKCBzaXplID09IDEgKSBtYXh2YWwgPSAweDdmOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gMHg3ZmZmOwotICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgbWF4dmFsID0gMHg3ZmZmZmZmZjsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisgICAgaWYgKCBsZW4xICE9IGxlbjIgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJMZW5ndGhzIHNob3VsZCBiZSB0aGUgc2FtZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4xKTsKLSAgICAgICAgaWYgKCBydiA9PSAwICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIGlmICggc2l6ZSA9PSAxICkgbWF4dmFsID0gMHg3ZjsKKyAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgbWF4dmFsID0gMHg3ZmZmOworICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSBtYXh2YWwgPSAweDdmZmZmZmZmOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW4xOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDEgPSAoaW50KSpDSEFSUChjcDEsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwxID0gKGludCkqU0hPUlRQKGNwMSwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDEgPSAoaW50KSpMT05HUChjcDEsIGkpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsMiA9IChpbnQpKkNIQVJQKGNwMiwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDIgPSAoaW50KSpTSE9SVFAoY3AyLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMiA9IChpbnQpKkxPTkdQKGNwMiwgaSk7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4xKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLSAgICAgICAgICAgICAgICBuZXd2YWwgPSB2YWwxICsgdmFsMjsKLSAgICAgICAgICAgICAgICAvKiB0cnVuY2F0ZSBpbiBjYXNlIG9mIG92ZXJmbG93ICovCi0gICAgICAgICAgICAgICAgaWYgKG5ld3ZhbCA+IG1heHZhbCkgbmV3dmFsID0gbWF4dmFsOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld3ZhbCA8IC1tYXh2YWwpIG5ld3ZhbCA9IC1tYXh2YWw7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0ICYmIChuZXd2YWxedmFsMSkgPCAwICYmIChuZXd2YWxedmFsMikgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsID0gdmFsMSA+IDAgPyBtYXh2YWwgOiAtIG1heHZhbDsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW4xOyBpICs9IHNpemUgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwxID0gKGludCkqQ0hBUlAoY3AxLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbDEgPSAoaW50KSpTSE9SVFAoY3AxLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbDEgPSAoaW50KSpMT05HUChjcDEsIGkpOwogCi0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKW5ld3ZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KW5ld3ZhbDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpbmV3dmFsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydjsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbDIgPSAoaW50KSpDSEFSUChjcDIsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsMiA9IChpbnQpKlNIT1JUUChjcDIsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsMiA9IChpbnQpKkxPTkdQKGNwMiwgaSk7CisKKyAgICAgICAgbmV3dmFsID0gdmFsMSArIHZhbDI7CisgICAgICAgIC8qIHRydW5jYXRlIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgKi8KKyAgICAgICAgaWYgKG5ld3ZhbCA+IG1heHZhbCkgbmV3dmFsID0gbWF4dmFsOworICAgICAgICBlbHNlIGlmIChuZXd2YWwgPCAtbWF4dmFsKSBuZXd2YWwgPSAtbWF4dmFsOworICAgICAgICBlbHNlIGlmIChzaXplID09IDQgJiYgKG5ld3ZhbF52YWwxKSA8IDAgJiYgKG5ld3ZhbF52YWwyKSA8IDApCisgICAgICAgICAgICBuZXd2YWwgPSB2YWwxID4gMCA/IG1heHZhbCA6IC0gbWF4dmFsOworCisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhciluZXd2YWw7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpbmV3dmFsOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpbmV3dmFsOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2JpYXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBzaWduZWQgY2hhciAqY3AsICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBiaWFzOworICAgIHNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKKyAgICBpbnQgYmlhczsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpOmJpYXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplICwgJmJpYXMpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpOmJpYXMiLAorICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUgLCAmYmlhcykgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKLSAgICAgICAgaWYgKCBydiA9PSAwICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotICAgIAotICAgIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoaW50KSpMT05HUChjcCwgaSk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsK2JpYXMpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCtiaWFzKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbCtiaWFzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisKKworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKGludCkqQ0hBUlAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9IChpbnQpKkxPTkdQKGNwLCBpKTsKKworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbCtiaWFzKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFsK2JpYXMpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbCtiaWFzKTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9yZXZlcnNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICB1bnNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGksIGo7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaSwgajsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6cmV2ZXJzZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6cmV2ZXJzZSIsCisgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0ICkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIAotICAgICAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotICAgIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBqID0gbGVuIC0gaSAtIHNpemU7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaikgPSAoc2hvcnQpKHZhbCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworCisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworCisgICAgICAgIGogPSBsZW4gLSBpIC0gc2l6ZTsKKworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgKkNIQVJQKG5jcCwgaikgPSAoc2lnbmVkIGNoYXIpKHZhbCA+PiA4KTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBqKSA9IChzaG9ydCkodmFsKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYXVkaW9vcF9saW4ybGluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICB1bnNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHNpemUyLCB2YWwgPSAwOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpLCBqOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgaW50IGxlbiwgbmV3X2xlbiwgc2l6ZSwgc2l6ZTIsIHZhbCA9IDA7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpLCBqOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWk6bGluMmxpbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUsICZzaXplMikgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWk6bGluMmxpbiIsCisgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSwgJnNpemUyKSApCisgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGlmICggKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB8fAotICAgICAgICAgICAgIChzaXplMiAhPSAxICYmIHNpemUyICE9IDIgJiYgc2l6ZTIgIT0gNCkpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgbmV3X2xlbiA9IChsZW4vc2l6ZSkqc2l6ZTI7Ci0gICAgICAgIGlmIChuZXdfbGVuIDwgMCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKLSAgICAgICAgaWYgKCBydiA9PSAwICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0gICAgCi0gICAgICAgIGZvciAoIGk9MCwgaj0wOyBpIDwgbGVuOyBpICs9IHNpemUsIGogKz0gc2l6ZTIgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworICAgIGlmICggKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB8fAorICAgICAgICAgKHNpemUyICE9IDEgJiYgc2l6ZTIgIT0gMiAmJiBzaXplMiAhPSA0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICggc2l6ZTIgPT0gMSApICAqQ0hBUlAobmNwLCBqKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplMiA9PSAyICkgKlNIT1JUUChuY3AsIGopID0gKHNob3J0KSh2YWwpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplMiA9PSA0ICkgKkxPTkdQKG5jcCwgaikgPSAoUHlfSW50MzIpKHZhbDw8MTYpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydjsKKyAgICBuZXdfbGVuID0gKGxlbi9zaXplKSpzaXplMjsKKyAgICBpZiAobmV3X2xlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ld19sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworCisgICAgZm9yICggaT0wLCBqPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSwgaiArPSBzaXplMiApIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CisKKyAgICAgICAgaWYgKCBzaXplMiA9PSAxICkgICpDSEFSUChuY3AsIGopID0gKHNpZ25lZCBjaGFyKSh2YWwgPj4gOCk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplMiA9PSAyICkgKlNIT1JUUChuY3AsIGopID0gKHNob3J0KSh2YWwpOworICAgICAgICBlbHNlIGlmICggc2l6ZTIgPT0gNCApICpMT05HUChuY3AsIGopID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgaW50CiBnY2QoaW50IGEsIGludCBiKQogewotICAgICAgICB3aGlsZSAoYiA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgdG1wID0gYSAlIGI7Ci0gICAgICAgICAgICAgICAgYSA9IGI7Ci0gICAgICAgICAgICAgICAgYiA9IHRtcDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYTsKKyAgICB3aGlsZSAoYiA+IDApIHsKKyAgICAgICAgaW50IHRtcCA9IGEgJSBiOworICAgICAgICBhID0gYjsKKyAgICAgICAgYiA9IHRtcDsKKyAgICB9CisgICAgcmV0dXJuIGE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3JhdGVjdihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIGNoYXIgKmNwLCAqbmNwOwotICAgICAgICBpbnQgbGVuLCBzaXplLCBuY2hhbm5lbHMsIGlucmF0ZSwgb3V0cmF0ZSwgd2VpZ2h0QSwgd2VpZ2h0QjsKLSAgICAgICAgaW50IGNoYW4sIGQsICpwcmV2X2ksICpjdXJfaSwgY3VyX287Ci0gICAgICAgIFB5T2JqZWN0ICpzdGF0ZSwgKnNhbXBzLCAqc3RyLCAqcnYgPSBOVUxMOwotICAgICAgICBpbnQgYnl0ZXNfcGVyX2ZyYW1lOwotICAgICAgICBzaXplX3QgYWxsb2Nfc2l6ZTsKKyAgICBjaGFyICpjcCwgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCBuY2hhbm5lbHMsIGlucmF0ZSwgb3V0cmF0ZSwgd2VpZ2h0QSwgd2VpZ2h0QjsKKyAgICBpbnQgY2hhbiwgZCwgKnByZXZfaSwgKmN1cl9pLCBjdXJfbzsKKyAgICBQeU9iamVjdCAqc3RhdGUsICpzYW1wcywgKnN0ciwgKnJ2ID0gTlVMTDsKKyAgICBpbnQgYnl0ZXNfcGVyX2ZyYW1lOworICAgIHNpemVfdCBhbGxvY19zaXplOwogCi0gICAgICAgIHdlaWdodEEgPSAxOwotICAgICAgICB3ZWlnaHRCID0gMDsKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlPfGlpOnJhdGVjdiIsICZjcCwgJmxlbiwgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZuY2hhbm5lbHMsICZpbnJhdGUsICZvdXRyYXRlLCAmc3RhdGUsCi0JCQkgICAgICAmd2VpZ2h0QSwgJndlaWdodEIpKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBpZiAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5jaGFubmVscyA8IDEpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiIyBvZiBjaGFubmVscyBzaG91bGQgYmUgPj0gMSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVzX3Blcl9mcmFtZSA9IHNpemUgKiBuY2hhbm5lbHM7Ci0gICAgICAgIGlmIChieXRlc19wZXJfZnJhbWUgLyBuY2hhbm5lbHMgIT0gc2l6ZSkgewotICAgICAgICAgICAgICAgIC8qIFRoaXMgb3ZlcmZsb3cgdGVzdCBpcyByaWdvcm91c2x5IGNvcnJlY3QgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgIGJvdGggbXVsdGlwbGljYW5kcyBhcmUgPj0gMS4gIFVzZSB0aGUgYXJndW1lbnQgbmFtZXMKLSAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBkb2NzIGZvciB0aGUgZXJyb3IgbXNnLiAqLwotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGggKiBuY2hhbm5lbHMgdG9vIGJpZyBmb3IgYSBDIGludCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3ZWlnaHRBIDwgMSB8fCB3ZWlnaHRCIDwgMCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAid2VpZ2h0QSBzaG91bGQgYmUgPj0gMSwgd2VpZ2h0QiBzaG91bGQgYmUgPj0gMCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsZW4gJSBieXRlc19wZXJfZnJhbWUgIT0gMCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJub3QgYSB3aG9sZSBudW1iZXIgb2YgZnJhbWVzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucmF0ZSA8PSAwIHx8IG91dHJhdGUgPD0gMCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJzYW1wbGluZyByYXRlIG5vdCA+IDAiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICAvKiBkaXZpZGUgaW5yYXRlIGFuZCBvdXRyYXRlIGJ5IHRoZWlyIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yICovCi0gICAgICAgIGQgPSBnY2QoaW5yYXRlLCBvdXRyYXRlKTsKLSAgICAgICAgaW5yYXRlIC89IGQ7Ci0gICAgICAgIG91dHJhdGUgLz0gZDsKKyAgICB3ZWlnaHRBID0gMTsKKyAgICB3ZWlnaHRCID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpaU98aWk6cmF0ZWN2IiwgJmNwLCAmbGVuLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5jaGFubmVscywgJmlucmF0ZSwgJm91dHJhdGUsICZzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndlaWdodEEsICZ3ZWlnaHRCKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuY2hhbm5lbHMgPCAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICIjIG9mIGNoYW5uZWxzIHNob3VsZCBiZSA+PSAxIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBieXRlc19wZXJfZnJhbWUgPSBzaXplICogbmNoYW5uZWxzOworICAgIGlmIChieXRlc19wZXJfZnJhbWUgLyBuY2hhbm5lbHMgIT0gc2l6ZSkgeworICAgICAgICAvKiBUaGlzIG92ZXJmbG93IHRlc3QgaXMgcmlnb3JvdXNseSBjb3JyZWN0IGJlY2F1c2UKKyAgICAgICAgICAgYm90aCBtdWx0aXBsaWNhbmRzIGFyZSA+PSAxLiAgVXNlIHRoZSBhcmd1bWVudCBuYW1lcworICAgICAgICAgICBmcm9tIHRoZSBkb2NzIGZvciB0aGUgZXJyb3IgbXNnLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCAqIG5jaGFubmVscyB0b28gYmlnIGZvciBhIEMgaW50Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAod2VpZ2h0QSA8IDEgfHwgd2VpZ2h0QiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwKKyAgICAgICAgICAgICJ3ZWlnaHRBIHNob3VsZCBiZSA+PSAxLCB3ZWlnaHRCIHNob3VsZCBiZSA+PSAwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobGVuICUgYnl0ZXNfcGVyX2ZyYW1lICE9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIm5vdCBhIHdob2xlIG51bWJlciBvZiBmcmFtZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpbnJhdGUgPD0gMCB8fCBvdXRyYXRlIDw9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgInNhbXBsaW5nIHJhdGUgbm90ID4gMCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogZGl2aWRlIGlucmF0ZSBhbmQgb3V0cmF0ZSBieSB0aGVpciBncmVhdGVzdCBjb21tb24gZGl2aXNvciAqLworICAgIGQgPSBnY2QoaW5yYXRlLCBvdXRyYXRlKTsKKyAgICBpbnJhdGUgLz0gZDsKKyAgICBvdXRyYXRlIC89IGQ7CiAKLSAgICAgICAgYWxsb2Nfc2l6ZSA9IHNpemVvZihpbnQpICogKHVuc2lnbmVkKW5jaGFubmVsczsKLSAgICAgICAgaWYgKGFsbG9jX3NpemUgPCBuY2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGFsbG9jX3NpemUgPSBzaXplb2YoaW50KSAqICh1bnNpZ25lZCluY2hhbm5lbHM7CisgICAgaWYgKGFsbG9jX3NpemUgPCBuY2hhbm5lbHMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwcmV2X2kgPSAoaW50ICopIG1hbGxvYyhhbGxvY19zaXplKTsKKyAgICBjdXJfaSA9IChpbnQgKikgbWFsbG9jKGFsbG9jX3NpemUpOworICAgIGlmIChwcmV2X2kgPT0gTlVMTCB8fCBjdXJfaSA9PSBOVUxMKSB7CisgICAgICAgICh2b2lkKSBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgbGVuIC89IGJ5dGVzX3Blcl9mcmFtZTsgLyogIyBvZiBmcmFtZXMgKi8KKworICAgIGlmIChzdGF0ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgIGQgPSAtb3V0cmF0ZTsKKyAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKQorICAgICAgICAgICAgcHJldl9pW2NoYW5dID0gY3VyX2lbY2hhbl0gPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgImlPITthdWRpb29wLnJhdGVjdjogaWxsZWdhbCBzdGF0ZSBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAmZCwgJlB5VHVwbGVfVHlwZSwgJnNhbXBzKSkKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZShzYW1wcykgIT0gbmNoYW5uZWxzKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHN0YXRlIGFyZ3VtZW50Iik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KLSAgICAgICAgcHJldl9pID0gKGludCAqKSBtYWxsb2MoYWxsb2Nfc2l6ZSk7Ci0gICAgICAgIGN1cl9pID0gKGludCAqKSBtYWxsb2MoYWxsb2Nfc2l6ZSk7Ci0gICAgICAgIGlmIChwcmV2X2kgPT0gTlVMTCB8fCBjdXJfaSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykgeworICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKFB5VHVwbGVfR2V0SXRlbShzYW1wcywgY2hhbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlpOnJhdGVjdiIsICZwcmV2X2lbY2hhbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJfaVtjaGFuXSkpCiAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGxlbiAvPSBieXRlc19wZXJfZnJhbWU7IC8qICMgb2YgZnJhbWVzICovCisgICAgLyogc3RyIDwtIFNwYWNlIGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4gKi8KKyAgICB7CisgICAgICAgIC8qIFRoZXJlIGFyZSBsZW4gaW5wdXQgZnJhbWVzLCBzbyB3ZSBuZWVkIChtYXRoZW1hdGljYWxseSkKKyAgICAgICAgICAgY2VpbGluZyhsZW4qb3V0cmF0ZS9pbnJhdGUpIG91dHB1dCBmcmFtZXMsIGFuZCBlYWNoIGZyYW1lCisgICAgICAgICAgIHJlcXVpcmVzIGJ5dGVzX3Blcl9mcmFtZSBieXRlcy4gIENvbXB1dGluZyB0aGlzCisgICAgICAgICAgIHdpdGhvdXQgc3B1cmlvdXMgb3ZlcmZsb3cgaXMgdGhlIGNoYWxsZW5nZTsgd2UgY2FuCisgICAgICAgICAgIHNldHRsZSBmb3IgYSByZWFzb25hYmxlIHVwcGVyIGJvdW5kLCB0aG91Z2guICovCisgICAgICAgIGludCBjZWlsaW5nOyAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyAqLworICAgICAgICBpbnQgbmJ5dGVzOyAgICAvKiB0aGUgbnVtYmVyIG9mIG91dHB1dCBieXRlcyBuZWVkZWQgKi8KKyAgICAgICAgaW50IHEgPSBsZW4gLyBpbnJhdGU7CisgICAgICAgIC8qIE5vdyBsZW4gPSBxICogaW5yYXRlICsgciBleGFjdGx5ICh3aXRoIHIgPSBsZW4gJSBpbnJhdGUpLAorICAgICAgICAgICBhbmQgdGhpcyBpcyBsZXNzIHRoYW4gcSAqIGlucmF0ZSArIGlucmF0ZSA9IChxKzEpKmlucmF0ZS4KKyAgICAgICAgICAgU28gYSByZWFzb25hYmxlIHVwcGVyIGJvdW5kIG9uIGxlbipvdXRyYXRlL2lucmF0ZSBpcworICAgICAgICAgICAoKHErMSkqaW5yYXRlKSpvdXRyYXRlL2lucmF0ZSA9CisgICAgICAgICAgIChxKzEpKm91dHJhdGUuCisgICAgICAgICovCisgICAgICAgIGNlaWxpbmcgPSAocSsxKSAqIG91dHJhdGU7CisgICAgICAgIG5ieXRlcyA9IGNlaWxpbmcgKiBieXRlc19wZXJfZnJhbWU7CisgICAgICAgIC8qIFNlZSB3aGV0aGVyIGFueXRoaW5nIG92ZXJmbG93ZWQ7IGlmIG5vdCwgZ2V0IHRoZSBzcGFjZS4gKi8KKyAgICAgICAgaWYgKHErMSA8IDAgfHwKKyAgICAgICAgICAgIGNlaWxpbmcgLyBvdXRyYXRlICE9IHErMSB8fAorICAgICAgICAgICAgbmJ5dGVzIC8gYnl0ZXNfcGVyX2ZyYW1lICE9IGNlaWxpbmcpCisgICAgICAgICAgICBzdHIgPSBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuYnl0ZXMpOwogCi0gICAgICAgIGlmIChzdGF0ZSA9PSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICAgICAgZCA9IC1vdXRyYXRlOworICAgICAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXIiKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBuY3AgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpOworCisgICAgZm9yICg7OykgeworICAgICAgICB3aGlsZSAoZCA8IDApIHsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIHNhbXBzID0gUHlUdXBsZV9OZXcobmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBpZiAoc2FtcHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfaVtjaGFuXSA9IGN1cl9pW2NoYW5dID0gMDsKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHNhbXBzLCBjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgiKGlpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfaVtjaGFuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0pKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgIC8qIFdlIGhhdmUgY2hlY2tlZCBiZWZvcmUgdGhhdCB0aGUgbGVuZ3RoCisgICAgICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyBmaXRzIGludG8gaW50LiAqLworICAgICAgICAgICAgICAgIGxlbiA9IChpbnQpKG5jcCAtIFB5U3RyaW5nX0FzU3RyaW5nKHN0cikpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKmRvbid0IHdhbnQgdG8gcmVzaXplIHRvIHplcm8gbGVuZ3RoKi8KKyAgICAgICAgICAgICAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICAgICAgICAgICAgICBzdHIgPSBydjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9QeVN0cmluZ19SZXNpemUoJnN0ciwgbGVuKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICBydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlPKSkiLCBzdHIsIGQsIHNhbXBzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2FtcHMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsgLyogcmV0dXJuIHJ2ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9ICgoaW50KSpDSEFSUChjcCwgMCkpIDw8IDg7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9IChpbnQpKlNIT1JUUChjcCwgMCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KQorICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9ICgoaW50KSpMT05HUChjcCwgMCkpID4+IDE2OworICAgICAgICAgICAgICAgIGNwICs9IHNpemU7CisgICAgICAgICAgICAgICAgLyogaW1wbGVtZW50cyBhIHNpbXBsZSBkaWdpdGFsIGZpbHRlciAqLworICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0KKyAgICAgICAgICAgICAgICAgICAgKHdlaWdodEEgKiBjdXJfaVtjaGFuXSArCisgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRCICogcHJldl9pW2NoYW5dKSAvCisgICAgICAgICAgICAgICAgICAgICh3ZWlnaHRBICsgd2VpZ2h0Qik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgIGQgKz0gb3V0cmF0ZTsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpTyE7YXVkaW9vcC5yYXRlY3Y6IGlsbGVnYWwgc3RhdGUgYXJndW1lbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZCwgJlB5VHVwbGVfVHlwZSwgJnNhbXBzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICBpZiAoUHlUdXBsZV9TaXplKHNhbXBzKSAhPSBuY2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgc3RhdGUgYXJndW1lbnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoUHlUdXBsZV9HZXRJdGVtKHNhbXBzLCBjaGFuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWk6cmF0ZWN2IiwgJnByZXZfaVtjaGFuXSwgCi0JCQkJCSAgICAgICAgICAgICAgICAgICAmY3VyX2lbY2hhbl0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICB3aGlsZSAoZCA+PSAwKSB7CisgICAgICAgICAgICBmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbmNoYW5uZWxzOyBjaGFuKyspIHsKKyAgICAgICAgICAgICAgICBjdXJfbyA9IChwcmV2X2lbY2hhbl0gKiBkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSAqIChvdXRyYXRlIC0gZCkpIC8KKyAgICAgICAgICAgICAgICAgICAgb3V0cmF0ZTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAqQ0hBUlAobmNwLCAwKSA9IChzaWduZWQgY2hhcikoY3VyX28gPj4gOCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQorICAgICAgICAgICAgICAgICAgICAqU0hPUlRQKG5jcCwgMCkgPSAoc2hvcnQpKGN1cl9vKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDQpCisgICAgICAgICAgICAgICAgICAgICpMT05HUChuY3AsIDApID0gKFB5X0ludDMyKShjdXJfbzw8MTYpOworICAgICAgICAgICAgICAgIG5jcCArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZCAtPSBpbnJhdGU7CiAgICAgICAgIH0KLQotICAgICAgICAvKiBzdHIgPC0gU3BhY2UgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGhlcmUgYXJlIGxlbiBpbnB1dCBmcmFtZXMsIHNvIHdlIG5lZWQgKG1hdGhlbWF0aWNhbGx5KQotICAgICAgICAgICAgICAgICAgIGNlaWxpbmcobGVuKm91dHJhdGUvaW5yYXRlKSBvdXRwdXQgZnJhbWVzLCBhbmQgZWFjaCBmcmFtZQotICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzIGJ5dGVzX3Blcl9mcmFtZSBieXRlcy4gIENvbXB1dGluZyB0aGlzCi0gICAgICAgICAgICAgICAgICAgd2l0aG91dCBzcHVyaW91cyBvdmVyZmxvdyBpcyB0aGUgY2hhbGxlbmdlOyB3ZSBjYW4KLSAgICAgICAgICAgICAgICAgICBzZXR0bGUgZm9yIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCwgdGhvdWdoLiAqLwotICAgICAgICAgICAgICAgIGludCBjZWlsaW5nOyAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyAqLwotICAgICAgICAgICAgICAgIGludCBuYnl0ZXM7ICAgIC8qIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIG5lZWRlZCAqLwotICAgICAgICAgICAgICAgIGludCBxID0gbGVuIC8gaW5yYXRlOwotICAgICAgICAgICAgICAgIC8qIE5vdyBsZW4gPSBxICogaW5yYXRlICsgciBleGFjdGx5ICh3aXRoIHIgPSBsZW4gJSBpbnJhdGUpLAotICAgICAgICAgICAgICAgICAgIGFuZCB0aGlzIGlzIGxlc3MgdGhhbiBxICogaW5yYXRlICsgaW5yYXRlID0gKHErMSkqaW5yYXRlLgotICAgICAgICAgICAgICAgICAgIFNvIGEgcmVhc29uYWJsZSB1cHBlciBib3VuZCBvbiBsZW4qb3V0cmF0ZS9pbnJhdGUgaXMKLSAgICAgICAgICAgICAgICAgICAoKHErMSkqaW5yYXRlKSpvdXRyYXRlL2lucmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgKHErMSkqb3V0cmF0ZS4KLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGNlaWxpbmcgPSAocSsxKSAqIG91dHJhdGU7Ci0gICAgICAgICAgICAgICAgbmJ5dGVzID0gY2VpbGluZyAqIGJ5dGVzX3Blcl9mcmFtZTsKLSAgICAgICAgICAgICAgICAvKiBTZWUgd2hldGhlciBhbnl0aGluZyBvdmVyZmxvd2VkOyBpZiBub3QsIGdldCB0aGUgc3BhY2UuICovCi0gICAgICAgICAgICAgICAgaWYgKHErMSA8IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgY2VpbGluZyAvIG91dHJhdGUgIT0gcSsxIHx8Ci0gICAgICAgICAgICAgICAgICAgIG5ieXRlcyAvIGJ5dGVzX3Blcl9mcmFtZSAhPSBjZWlsaW5nKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gTlVMTDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuYnl0ZXMpOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSBmb3Igb3V0cHV0IGJ1ZmZlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBuY3AgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpOwotCi0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wcyA9IFB5VHVwbGVfTmV3KG5jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYW1wcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShzYW1wcywgY2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIihpaSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBjaGVja2VkIGJlZm9yZSB0aGF0IHRoZSBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyBmaXRzIGludG8gaW50LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAoaW50KShuY3AgLSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypkb24ndCB3YW50IHRvIHJlc2l6ZSB0byB6ZXJvIGxlbmd0aCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gcnY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmc3RyLCBsZW4pIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKE8oaU8pKSIsIHN0ciwgZCwgc2FtcHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2FtcHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OyAvKiByZXR1cm4gcnYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBuY2hhbm5lbHM7IGNoYW4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2lbY2hhbl0gPSBjdXJfaVtjaGFuXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0gKChpbnQpKkNIQVJQKGNwLCAwKSkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2lbY2hhbl0gPSAoaW50KSpTSE9SVFAoY3AsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSA9ICgoaW50KSpMT05HUChjcCwgMCkpID4+IDE2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCArPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbXBsZW1lbnRzIGEgc2ltcGxlIGRpZ2l0YWwgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9pW2NoYW5dID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2VpZ2h0QSAqIGN1cl9pW2NoYW5dICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0QiAqIHByZXZfaVtjaGFuXSkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZWlnaHRBICsgd2VpZ2h0Qik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4tLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gb3V0cmF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IG5jaGFubmVsczsgY2hhbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9vID0gKHByZXZfaVtjaGFuXSAqIGQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfaVtjaGFuXSAqIChvdXRyYXRlIC0gZCkpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRyYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkNIQVJQKG5jcCwgMCkgPSAoc2lnbmVkIGNoYXIpKGN1cl9vID4+IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqU0hPUlRQKG5jcCwgMCkgPSAoc2hvcnQpKGN1cl9vKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkxPTkdQKG5jcCwgMCkgPSAoUHlfSW50MzIpKGN1cl9vPDwxNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jcCArPSBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZCAtPSBpbnJhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgfQogICBleGl0OgotICAgICAgICBpZiAocHJldl9pICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgZnJlZShwcmV2X2kpOwotICAgICAgICBpZiAoY3VyX2kgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBmcmVlKGN1cl9pKTsKLSAgICAgICAgcmV0dXJuIHJ2OworICAgIGlmIChwcmV2X2kgIT0gTlVMTCkKKyAgICAgICAgZnJlZShwcmV2X2kpOworICAgIGlmIChjdXJfaSAhPSBOVUxMKQorICAgICAgICBmcmVlKGN1cl9pKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2xpbjJ1bGF3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICB1bnNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGk7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bGluMnVsYXciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMCA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmxpbjJ1bGF3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDAgOwogCi0gICAgICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAKLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vc2l6ZSk7Ci0gICAgICAgIGlmICggcnYgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotICAgIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKLSAgICAgICAgICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotICAgICAgICAgICAgICAgICpuY3ArKyA9IHN0XzE0bGluZWFyMnVsYXcodmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vc2l6ZSk7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSB2YWwgPSAoaW50KSpTSE9SVFAoY3AsIGkpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgdmFsID0gKChpbnQpKkxPTkdQKGNwLCBpKSkgPj4gMTY7CisKKyAgICAgICAgKm5jcCsrID0gc3RfMTRsaW5lYXIydWxhdyh2YWwpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX3VsYXcybGluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgY3ZhbDsKLSAgICAgICAgc2lnbmVkIGNoYXIgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgbmV3X2xlbiwgc2l6ZSwgdmFsOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgY3ZhbDsKKyAgICBzaWduZWQgY2hhciAqbmNwOworICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHZhbDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOnVsYXcybGluIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOnVsYXcybGluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIAotICAgICAgICBuZXdfbGVuID0gbGVuKnNpemU7Ci0gICAgICAgIGlmIChuZXdfbGVuIDwgMCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKLSAgICAgICAgaWYgKCBydiA9PSAwICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotICAgIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBuZXdfbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgY3ZhbCA9ICpjcCsrOwotICAgICAgICAgICAgICAgIHZhbCA9IHN0X3VsYXcybGluZWFyMTYoY3ZhbCk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG5ld19sZW4gPSBsZW4qc2l6ZTsKKyAgICBpZiAobmV3X2xlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ld19sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKworICAgIGZvciAoIGk9MDsgaSA8IG5ld19sZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgY3ZhbCA9ICpjcCsrOworICAgICAgICB2YWwgPSBzdF91bGF3MmxpbmVhcjE2KGN2YWwpOworCisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbDw8MTYpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2xpbjJhbGF3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgc2lnbmVkIGNoYXIgKmNwOwotICAgICAgICB1bnNpZ25lZCBjaGFyICpuY3A7Ci0gICAgICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDA7Ci0gICAgICAgIFB5T2JqZWN0ICpydjsKLSAgICAgICAgaW50IGk7CisgICAgc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBpbnQgbGVuLCBzaXplLCB2YWwgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bGluMmFsYXciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2k6bGluMmFsYXciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwLCAmbGVuLCAmc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuL3NpemUpOwotICAgICAgICBpZiAoIHJ2ID09IDAgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLSAgICAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICAqbmNwKysgPSBzdF9saW5lYXIyYWxhdyh2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydjsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbi9zaXplKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSArPSBzaXplICkgeworICAgICAgICBpZiAoIHNpemUgPT0gMSApICAgICAgdmFsID0gKChpbnQpKkNIQVJQKGNwLCBpKSkgPDwgODsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7CisgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDQgKSB2YWwgPSAoKGludCkqTE9OR1AoY3AsIGkpKSA+PiAxNjsKKworICAgICAgICAqbmNwKysgPSBzdF9saW5lYXIyYWxhdyh2YWwpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2FsYXcybGluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqY3A7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgY3ZhbDsKLSAgICAgICAgc2lnbmVkIGNoYXIgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgbmV3X2xlbiwgc2l6ZSwgdmFsOwotICAgICAgICBQeU9iamVjdCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgY3ZhbDsKKyAgICBzaWduZWQgY2hhciAqbmNwOworICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHZhbDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmFsYXcybGluIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplKSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpOmFsYXcybGluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIAotICAgICAgICBuZXdfbGVuID0gbGVuKnNpemU7Ci0gICAgICAgIGlmIChuZXdfbGVuIDwgMCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKLSAgICAgICAgaWYgKCBydiA9PSAwICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotICAgIAotICAgICAgICBmb3IgKCBpPTA7IGkgPCBuZXdfbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgY3ZhbCA9ICpjcCsrOwotICAgICAgICAgICAgICAgIHZhbCA9IHN0X2FsYXcybGluZWFyMTYoY3ZhbCk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBzaXplID09IDIgKSAqU0hPUlRQKG5jcCwgaSkgPSAoc2hvcnQpKHZhbCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWw8PDE2KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQXVkaW9vcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSwgMiBvciA0Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG5ld19sZW4gPSBsZW4qc2l6ZTsKKyAgICBpZiAobmV3X2xlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5ld19sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKworICAgIGZvciAoIGk9MDsgaSA8IG5ld19sZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgY3ZhbCA9ICpjcCsrOworICAgICAgICB2YWwgPSBzdF9hbGF3MmxpbmVhcjE2KGN2YWwpOworCisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICAqQ0hBUlAobmNwLCBpKSA9IChzaWduZWQgY2hhcikodmFsID4+IDgpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWwpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSA0ICkgKkxPTkdQKG5jcCwgaSkgPSAoUHlfSW50MzIpKHZhbDw8MTYpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2xpbjJhZHBjbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgc2lnbmVkIGNoYXIgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgc2l6ZSwgdmFsID0gMCwgc3RlcCwgdmFscHJlZCwgZGVsdGEsCi0gICAgICAgICAgICAgICAgaW5kZXgsIHNpZ24sIHZwZGlmZiwgZGlmZjsKLSAgICAgICAgUHlPYmplY3QgKnJ2LCAqc3RhdGUsICpzdHI7Ci0gICAgICAgIGludCBpLCBvdXRwdXRidWZmZXIgPSAwLCBidWZmZXJzdGVwOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBzaWduZWQgY2hhciAqbmNwOworICAgIGludCBsZW4sIHNpemUsIHZhbCA9IDAsIHN0ZXAsIHZhbHByZWQsIGRlbHRhLAorICAgICAgICBpbmRleCwgc2lnbiwgdnBkaWZmLCBkaWZmOworICAgIFB5T2JqZWN0ICpydiwgKnN0YXRlLCAqc3RyOworICAgIGludCBpLCBvdXRwdXRidWZmZXIgPSAwLCBidWZmZXJzdGVwOwogCi0gICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaU86bGluMmFkcGNtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmc3RhdGUpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lPOmxpbjJhZHBjbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmc3RhdGUpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdWRpb29wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4vKHNpemUqMikpOworICAgIGlmICggc3RyID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhzdHIpOworCisgICAgLyogRGVjb2RlIHN0YXRlLCBzaG91bGQgaGF2ZSAodmFsdWUsIHN0ZXApICovCisgICAgaWYgKCBzdGF0ZSA9PSBQeV9Ob25lICkgeworICAgICAgICAvKiBGaXJzdCB0aW1lLCBpdCBzZWVtcy4gU2V0IGRlZmF1bHRzICovCisgICAgICAgIHZhbHByZWQgPSAwOworICAgICAgICBzdGVwID0gNzsKKyAgICAgICAgaW5kZXggPSAwOworICAgIH0gZWxzZSBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiaWkiLCAmdmFscHJlZCwgJmluZGV4KSApCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOworICAgIGJ1ZmZlcnN0ZXAgPSAxOworCisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7CisgICAgICAgIGlmICggc2l6ZSA9PSAxICkgICAgICB2YWwgPSAoKGludCkqQ0hBUlAoY3AsIGkpKSA8PCA4OworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgdmFsID0gKGludCkqU0hPUlRQKGNwLCBpKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OworCisgICAgICAgIC8qIFN0ZXAgMSAtIGNvbXB1dGUgZGlmZmVyZW5jZSB3aXRoIHByZXZpb3VzIHZhbHVlICovCisgICAgICAgIGRpZmYgPSB2YWwgLSB2YWxwcmVkOworICAgICAgICBzaWduID0gKGRpZmYgPCAwKSA/IDggOiAwOworICAgICAgICBpZiAoIHNpZ24gKSBkaWZmID0gKC1kaWZmKTsKKworICAgICAgICAvKiBTdGVwIDIgLSBEaXZpZGUgYW5kIGNsYW1wICovCisgICAgICAgIC8qIE5vdGU6CisgICAgICAgICoqIFRoaXMgY29kZSAqYXBwcm94aW1hdGVseSogY29tcHV0ZXM6CisgICAgICAgICoqICAgIGRlbHRhID0gZGlmZio0L3N0ZXA7CisgICAgICAgICoqICAgIHZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNDsKKyAgICAgICAgKiogYnV0IGluIHNoaWZ0IHN0ZXAgYml0cyBhcmUgZHJvcHBlZC4gVGhlIG5ldCByZXN1bHQgb2YgdGhpcworICAgICAgICAqKiBpcyB0aGF0IGV2ZW4gaWYgeW91IGhhdmUgZmFzdCBtdWwvZGl2IGhhcmR3YXJlIHlvdSBjYW5ub3QKKyAgICAgICAgKiogcHV0IGl0IHRvIGdvb2QgdXNlIHNpbmNlIHRoZSBmaXh1cCB3b3VsZCBiZSB0b28gZXhwZW5zaXZlLgorICAgICAgICAqLworICAgICAgICBkZWx0YSA9IDA7CisgICAgICAgIHZwZGlmZiA9IChzdGVwID4+IDMpOworCisgICAgICAgIGlmICggZGlmZiA+PSBzdGVwICkgeworICAgICAgICAgICAgZGVsdGEgPSA0OworICAgICAgICAgICAgZGlmZiAtPSBzdGVwOworICAgICAgICAgICAgdnBkaWZmICs9IHN0ZXA7CiAgICAgICAgIH0KLSAgICAKLSAgICAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuLyhzaXplKjIpKTsKLSAgICAgICAgaWYgKCBzdHIgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CisgICAgICAgIHN0ZXAgPj49IDE7CisgICAgICAgIGlmICggZGlmZiA+PSBzdGVwICApIHsKKyAgICAgICAgICAgIGRlbHRhIHw9IDI7CisgICAgICAgICAgICBkaWZmIC09IHN0ZXA7CisgICAgICAgICAgICB2cGRpZmYgKz0gc3RlcDsKKyAgICAgICAgfQorICAgICAgICBzdGVwID4+PSAxOworICAgICAgICBpZiAoIGRpZmYgPj0gc3RlcCApIHsKKyAgICAgICAgICAgIGRlbHRhIHw9IDE7CisgICAgICAgICAgICB2cGRpZmYgKz0gc3RlcDsKKyAgICAgICAgfQogCi0gICAgICAgIC8qIERlY29kZSBzdGF0ZSwgc2hvdWxkIGhhdmUgKHZhbHVlLCBzdGVwKSAqLwotICAgICAgICBpZiAoIHN0YXRlID09IFB5X05vbmUgKSB7Ci0gICAgICAgICAgICAgICAgLyogRmlyc3QgdGltZSwgaXQgc2VlbXMuIFNldCBkZWZhdWx0cyAqLwotICAgICAgICAgICAgICAgIHZhbHByZWQgPSAwOwotICAgICAgICAgICAgICAgIHN0ZXAgPSA3OwotICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKLSAgICAgICAgfSBlbHNlIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsICJpaSIsICZ2YWxwcmVkLCAmaW5kZXgpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgLyogU3RlcCAzIC0gVXBkYXRlIHByZXZpb3VzIHZhbHVlICovCisgICAgICAgIGlmICggc2lnbiApCisgICAgICAgICAgICB2YWxwcmVkIC09IHZwZGlmZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFscHJlZCArPSB2cGRpZmY7CiAKKyAgICAgICAgLyogU3RlcCA0IC0gQ2xhbXAgcHJldmlvdXMgdmFsdWUgdG8gMTYgYml0cyAqLworICAgICAgICBpZiAoIHZhbHByZWQgPiAzMjc2NyApCisgICAgICAgICAgICB2YWxwcmVkID0gMzI3Njc7CisgICAgICAgIGVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKKyAgICAgICAgICAgIHZhbHByZWQgPSAtMzI3Njg7CisKKyAgICAgICAgLyogU3RlcCA1IC0gQXNzZW1ibGUgdmFsdWUsIHVwZGF0ZSBpbmRleCBhbmQgc3RlcCB2YWx1ZXMgKi8KKyAgICAgICAgZGVsdGEgfD0gc2lnbjsKKworICAgICAgICBpbmRleCArPSBpbmRleFRhYmxlW2RlbHRhXTsKKyAgICAgICAgaWYgKCBpbmRleCA8IDAgKSBpbmRleCA9IDA7CisgICAgICAgIGlmICggaW5kZXggPiA4OCApIGluZGV4ID0gODg7CiAgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKLSAgICAgICAgYnVmZmVyc3RlcCA9IDE7CiAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpICs9IHNpemUgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKSAgICAgIHZhbCA9ICgoaW50KSpDSEFSUChjcCwgaSkpIDw8IDg7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApIHZhbCA9IChpbnQpKlNIT1JUUChjcCwgaSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApIHZhbCA9ICgoaW50KSpMT05HUChjcCwgaSkpID4+IDE2OwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCAxIC0gY29tcHV0ZSBkaWZmZXJlbmNlIHdpdGggcHJldmlvdXMgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBkaWZmID0gdmFsIC0gdmFscHJlZDsKLSAgICAgICAgICAgICAgICBzaWduID0gKGRpZmYgPCAwKSA/IDggOiAwOwotICAgICAgICAgICAgICAgIGlmICggc2lnbiApIGRpZmYgPSAoLWRpZmYpOwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCAyIC0gRGl2aWRlIGFuZCBjbGFtcCAqLwotICAgICAgICAgICAgICAgIC8qIE5vdGU6Ci0gICAgICAgICAgICAgICAgKiogVGhpcyBjb2RlICphcHByb3hpbWF0ZWx5KiBjb21wdXRlczoKLSAgICAgICAgICAgICAgICAqKiAgICBkZWx0YSA9IGRpZmYqNC9zdGVwOwotICAgICAgICAgICAgICAgICoqICAgIHZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNDsKLSAgICAgICAgICAgICAgICAqKiBidXQgaW4gc2hpZnQgc3RlcCBiaXRzIGFyZSBkcm9wcGVkLiBUaGUgbmV0IHJlc3VsdCBvZiB0aGlzCi0gICAgICAgICAgICAgICAgKiogaXMgdGhhdCBldmVuIGlmIHlvdSBoYXZlIGZhc3QgbXVsL2RpdiBoYXJkd2FyZSB5b3UgY2Fubm90Ci0gICAgICAgICAgICAgICAgKiogcHV0IGl0IHRvIGdvb2QgdXNlIHNpbmNlIHRoZSBmaXh1cCB3b3VsZCBiZSB0b28gZXhwZW5zaXZlLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgZGVsdGEgPSAwOwotICAgICAgICAgICAgICAgIHZwZGlmZiA9IChzdGVwID4+IDMpOwotICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoIGRpZmYgPj0gc3RlcCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgLT0gc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZwZGlmZiArPSBzdGVwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGVwID4+PSAxOwotICAgICAgICAgICAgICAgIGlmICggZGlmZiA+PSBzdGVwICApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhIHw9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWZmIC09IHN0ZXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cGRpZmYgKz0gc3RlcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RlcCA+Pj0gMTsKLSAgICAgICAgICAgICAgICBpZiAoIGRpZmYgPj0gc3RlcCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhIHw9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2cGRpZmYgKz0gc3RlcDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBTdGVwIDMgLSBVcGRhdGUgcHJldmlvdXMgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBpZiAoIHNpZ24gKQotICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCAtPSB2cGRpZmY7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCArPSB2cGRpZmY7Ci0KLSAgICAgICAgICAgICAgICAvKiBTdGVwIDQgLSBDbGFtcCBwcmV2aW91cyB2YWx1ZSB0byAxNiBiaXRzICovCi0gICAgICAgICAgICAgICAgaWYgKCB2YWxwcmVkID4gMzI3NjcgKQotICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCA9IDMyNzY3OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAtMzI3Njg7Ci0KLSAgICAgICAgICAgICAgICAvKiBTdGVwIDUgLSBBc3NlbWJsZSB2YWx1ZSwgdXBkYXRlIGluZGV4IGFuZCBzdGVwIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgIGRlbHRhIHw9IHNpZ247Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGluZGV4ICs9IGluZGV4VGFibGVbZGVsdGFdOwotICAgICAgICAgICAgICAgIGlmICggaW5kZXggPCAwICkgaW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGlmICggaW5kZXggPiA4OCApIGluZGV4ID0gODg7Ci0gICAgICAgICAgICAgICAgc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCA2IC0gT3V0cHV0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgaWYgKCBidWZmZXJzdGVwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0YnVmZmVyID0gKGRlbHRhIDw8IDQpICYgMHhmMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgKm5jcCsrID0gKGRlbHRhICYgMHgwZikgfCBvdXRwdXRidWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1ZmZlcnN0ZXAgPSAhYnVmZmVyc3RlcDsKKyAgICAgICAgLyogU3RlcCA2IC0gT3V0cHV0IHZhbHVlICovCisgICAgICAgIGlmICggYnVmZmVyc3RlcCApIHsKKyAgICAgICAgICAgIG91dHB1dGJ1ZmZlciA9IChkZWx0YSA8PCA0KSAmIDB4ZjA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqbmNwKysgPSAoZGVsdGEgJiAweDBmKSB8IG91dHB1dGJ1ZmZlcjsKICAgICAgICAgfQotICAgICAgICBydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlpKSkiLCBzdHIsIHZhbHByZWQsIGluZGV4KTsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBydjsKKyAgICAgICAgYnVmZmVyc3RlcCA9ICFidWZmZXJzdGVwOworICAgIH0KKyAgICBydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlpKSkiLCBzdHIsIHZhbHByZWQsIGluZGV4KTsKKyAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdWRpb29wX2FkcGNtMmxpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNpZ25lZCBjaGFyICpjcDsKLSAgICAgICAgc2lnbmVkIGNoYXIgKm5jcDsKLSAgICAgICAgaW50IGxlbiwgbmV3X2xlbiwgc2l6ZSwgdmFscHJlZCwgc3RlcCwgZGVsdGEsIGluZGV4LCBzaWduLCB2cGRpZmY7Ci0gICAgICAgIFB5T2JqZWN0ICpydiwgKnN0ciwgKnN0YXRlOwotICAgICAgICBpbnQgaSwgaW5wdXRidWZmZXIgPSAwLCBidWZmZXJzdGVwOworICAgIHNpZ25lZCBjaGFyICpjcDsKKyAgICBzaWduZWQgY2hhciAqbmNwOworICAgIGludCBsZW4sIG5ld19sZW4sIHNpemUsIHZhbHByZWQsIHN0ZXAsIGRlbHRhLCBpbmRleCwgc2lnbiwgdnBkaWZmOworICAgIFB5T2JqZWN0ICpydiwgKnN0ciwgKnN0YXRlOworICAgIGludCBpLCBpbnB1dGJ1ZmZlciA9IDAsIGJ1ZmZlcnN0ZXA7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpTzphZHBjbTJsaW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUsICZzdGF0ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaU86YWRwY20ybGluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcCwgJmxlbiwgJnNpemUsICZzdGF0ZSkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBpZiAoIHNpemUgIT0gMSAmJiBzaXplICE9IDIgJiYgc2l6ZSAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1ZGlvb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBEZWNvZGUgc3RhdGUsIHNob3VsZCBoYXZlICh2YWx1ZSwgc3RlcCkgKi8KKyAgICBpZiAoIHN0YXRlID09IFB5X05vbmUgKSB7CisgICAgICAgIC8qIEZpcnN0IHRpbWUsIGl0IHNlZW1zLiBTZXQgZGVmYXVsdHMgKi8KKyAgICAgICAgdmFscHJlZCA9IDA7CisgICAgICAgIHN0ZXAgPSA3OworICAgICAgICBpbmRleCA9IDA7CisgICAgfSBlbHNlIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoc3RhdGUsICJpaSIsICZ2YWxwcmVkLCAmaW5kZXgpICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBuZXdfbGVuID0gbGVuKnNpemUqMjsKKyAgICBpZiAobmV3X2xlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKKyAgICBpZiAoIHN0ciA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcoc3RyKTsKKworICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKKyAgICBidWZmZXJzdGVwID0gMDsKKworICAgIGZvciAoIGk9MDsgaSA8IG5ld19sZW47IGkgKz0gc2l6ZSApIHsKKyAgICAgICAgLyogU3RlcCAxIC0gZ2V0IHRoZSBkZWx0YSB2YWx1ZSBhbmQgY29tcHV0ZSBuZXh0IGluZGV4ICovCisgICAgICAgIGlmICggYnVmZmVyc3RlcCApIHsKKyAgICAgICAgICAgIGRlbHRhID0gaW5wdXRidWZmZXIgJiAweGY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnB1dGJ1ZmZlciA9ICpjcCsrOworICAgICAgICAgICAgZGVsdGEgPSAoaW5wdXRidWZmZXIgPj4gNCkgJiAweGY7CiAgICAgICAgIH0KLSAgICAKLSAgICAgICAgLyogRGVjb2RlIHN0YXRlLCBzaG91bGQgaGF2ZSAodmFsdWUsIHN0ZXApICovCi0gICAgICAgIGlmICggc3RhdGUgPT0gUHlfTm9uZSApIHsKLSAgICAgICAgICAgICAgICAvKiBGaXJzdCB0aW1lLCBpdCBzZWVtcy4gU2V0IGRlZmF1bHRzICovCi0gICAgICAgICAgICAgICAgdmFscHJlZCA9IDA7Ci0gICAgICAgICAgICAgICAgc3RlcCA9IDc7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAwOwotICAgICAgICB9IGVsc2UgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwgImlpIiwgJnZhbHByZWQsICZpbmRleCkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgIAotICAgICAgICBuZXdfbGVuID0gbGVuKnNpemUqMjsKLSAgICAgICAgaWYgKG5ld19sZW4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yIG91dHB1dCBidWZmZXIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuZXdfbGVuKTsKLSAgICAgICAgaWYgKCBzdHIgPT0gMCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG5jcCA9IChzaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CiAKKyAgICAgICAgYnVmZmVyc3RlcCA9ICFidWZmZXJzdGVwOworCisgICAgICAgIC8qIFN0ZXAgMiAtIEZpbmQgbmV3IGluZGV4IHZhbHVlIChmb3IgbGF0ZXIpICovCisgICAgICAgIGluZGV4ICs9IGluZGV4VGFibGVbZGVsdGFdOworICAgICAgICBpZiAoIGluZGV4IDwgMCApIGluZGV4ID0gMDsKKyAgICAgICAgaWYgKCBpbmRleCA+IDg4ICkgaW5kZXggPSA4ODsKKworICAgICAgICAvKiBTdGVwIDMgLSBTZXBhcmF0ZSBzaWduIGFuZCBtYWduaXR1ZGUgKi8KKyAgICAgICAgc2lnbiA9IGRlbHRhICYgODsKKyAgICAgICAgZGVsdGEgPSBkZWx0YSAmIDc7CisKKyAgICAgICAgLyogU3RlcCA0IC0gQ29tcHV0ZSBkaWZmZXJlbmNlIGFuZCBuZXcgcHJlZGljdGVkIHZhbHVlICovCisgICAgICAgIC8qCisgICAgICAgICoqIENvbXB1dGVzICd2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQnLCBidXQgc2VlIGNvbW1lbnQKKyAgICAgICAgKiogaW4gYWRwY21fY29kZXIuCisgICAgICAgICovCisgICAgICAgIHZwZGlmZiA9IHN0ZXAgPj4gMzsKKyAgICAgICAgaWYgKCBkZWx0YSAmIDQgKSB2cGRpZmYgKz0gc3RlcDsKKyAgICAgICAgaWYgKCBkZWx0YSAmIDIgKSB2cGRpZmYgKz0gc3RlcD4+MTsKKyAgICAgICAgaWYgKCBkZWx0YSAmIDEgKSB2cGRpZmYgKz0gc3RlcD4+MjsKKworICAgICAgICBpZiAoIHNpZ24gKQorICAgICAgICAgICAgdmFscHJlZCAtPSB2cGRpZmY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHByZWQgKz0gdnBkaWZmOworCisgICAgICAgIC8qIFN0ZXAgNSAtIGNsYW1wIG91dHB1dCB2YWx1ZSAqLworICAgICAgICBpZiAoIHZhbHByZWQgPiAzMjc2NyApCisgICAgICAgICAgICB2YWxwcmVkID0gMzI3Njc7CisgICAgICAgIGVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKKyAgICAgICAgICAgIHZhbHByZWQgPSAtMzI3Njg7CisKKyAgICAgICAgLyogU3RlcCA2IC0gVXBkYXRlIHN0ZXAgdmFsdWUgKi8KICAgICAgICAgc3RlcCA9IHN0ZXBzaXplVGFibGVbaW5kZXhdOwotICAgICAgICBidWZmZXJzdGVwID0gMDsKLSAgICAKLSAgICAgICAgZm9yICggaT0wOyBpIDwgbmV3X2xlbjsgaSArPSBzaXplICkgewotICAgICAgICAgICAgICAgIC8qIFN0ZXAgMSAtIGdldCB0aGUgZGVsdGEgdmFsdWUgYW5kIGNvbXB1dGUgbmV4dCBpbmRleCAqLwotICAgICAgICAgICAgICAgIGlmICggYnVmZmVyc3RlcCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gaW5wdXRidWZmZXIgJiAweGY7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0YnVmZmVyID0gKmNwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChpbnB1dGJ1ZmZlciA+PiA0KSAmIDB4ZjsKLSAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBidWZmZXJzdGVwID0gIWJ1ZmZlcnN0ZXA7CisgICAgICAgIC8qIFN0ZXAgNiAtIE91dHB1dCB2YWx1ZSAqLworICAgICAgICBpZiAoIHNpemUgPT0gMSApICpDSEFSUChuY3AsIGkpID0gKHNpZ25lZCBjaGFyKSh2YWxwcmVkID4+IDgpOworICAgICAgICBlbHNlIGlmICggc2l6ZSA9PSAyICkgKlNIT1JUUChuY3AsIGkpID0gKHNob3J0KSh2YWxwcmVkKTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWxwcmVkPDwxNik7CisgICAgfQogCi0gICAgICAgICAgICAgICAgLyogU3RlcCAyIC0gRmluZCBuZXcgaW5kZXggdmFsdWUgKGZvciBsYXRlcikgKi8KLSAgICAgICAgICAgICAgICBpbmRleCArPSBpbmRleFRhYmxlW2RlbHRhXTsKLSAgICAgICAgICAgICAgICBpZiAoIGluZGV4IDwgMCApIGluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoIGluZGV4ID4gODggKSBpbmRleCA9IDg4OwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCAzIC0gU2VwYXJhdGUgc2lnbiBhbmQgbWFnbml0dWRlICovCi0gICAgICAgICAgICAgICAgc2lnbiA9IGRlbHRhICYgODsKLSAgICAgICAgICAgICAgICBkZWx0YSA9IGRlbHRhICYgNzsKLQotICAgICAgICAgICAgICAgIC8qIFN0ZXAgNCAtIENvbXB1dGUgZGlmZmVyZW5jZSBhbmQgbmV3IHByZWRpY3RlZCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgKiogQ29tcHV0ZXMgJ3ZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNCcsIGJ1dCBzZWUgY29tbWVudAotICAgICAgICAgICAgICAgICoqIGluIGFkcGNtX2NvZGVyLgotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgdnBkaWZmID0gc3RlcCA+PiAzOwotICAgICAgICAgICAgICAgIGlmICggZGVsdGEgJiA0ICkgdnBkaWZmICs9IHN0ZXA7Ci0gICAgICAgICAgICAgICAgaWYgKCBkZWx0YSAmIDIgKSB2cGRpZmYgKz0gc3RlcD4+MTsKLSAgICAgICAgICAgICAgICBpZiAoIGRlbHRhICYgMSApIHZwZGlmZiArPSBzdGVwPj4yOwotCi0gICAgICAgICAgICAgICAgaWYgKCBzaWduICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgLT0gdnBkaWZmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgKz0gdnBkaWZmOwotCi0gICAgICAgICAgICAgICAgLyogU3RlcCA1IC0gY2xhbXAgb3V0cHV0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgaWYgKCB2YWxwcmVkID4gMzI3NjcgKQotICAgICAgICAgICAgICAgICAgICAgICAgdmFscHJlZCA9IDMyNzY3OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCB2YWxwcmVkIDwgLTMyNzY4ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHByZWQgPSAtMzI3Njg7Ci0KLSAgICAgICAgICAgICAgICAvKiBTdGVwIDYgLSBVcGRhdGUgc3RlcCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwc2l6ZVRhYmxlW2luZGV4XTsKLQotICAgICAgICAgICAgICAgIC8qIFN0ZXAgNiAtIE91dHB1dCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIGlmICggc2l6ZSA9PSAxICkgKkNIQVJQKG5jcCwgaSkgPSAoc2lnbmVkIGNoYXIpKHZhbHByZWQgPj4gOCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApICpTSE9SVFAobmNwLCBpKSA9IChzaG9ydCkodmFscHJlZCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gNCApICpMT05HUChuY3AsIGkpID0gKFB5X0ludDMyKSh2YWxwcmVkPDwxNik7Ci0gICAgICAgIH0KLQotICAgICAgICBydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlpKSkiLCBzdHIsIHZhbHByZWQsIGluZGV4KTsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBydjsKKyAgICBydiA9IFB5X0J1aWxkVmFsdWUoIihPKGlpKSkiLCBzdHIsIHZhbHByZWQsIGluZGV4KTsKKyAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBhdWRpb29wX21ldGhvZHNbXSA9IHsKLSAgICAgICAgeyAibWF4IiwgYXVkaW9vcF9tYXgsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJtaW5tYXgiLCBhdWRpb29wX21pbm1heCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImF2ZyIsIGF1ZGlvb3BfYXZnLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAibWF4cHAiLCBhdWRpb29wX21heHBwLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAiYXZncHAiLCBhdWRpb29wX2F2Z3BwLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAicm1zIiwgYXVkaW9vcF9ybXMsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJmaW5kZml0IiwgYXVkaW9vcF9maW5kZml0LCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAiZmluZG1heCIsIGF1ZGlvb3BfZmluZG1heCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImZpbmRmYWN0b3IiLCBhdWRpb29wX2ZpbmRmYWN0b3IsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJjcm9zcyIsIGF1ZGlvb3BfY3Jvc3MsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJtdWwiLCBhdWRpb29wX211bCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImFkZCIsIGF1ZGlvb3BfYWRkLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAiYmlhcyIsIGF1ZGlvb3BfYmlhcywgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgInVsYXcybGluIiwgYXVkaW9vcF91bGF3MmxpbiwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImxpbjJ1bGF3IiwgYXVkaW9vcF9saW4ydWxhdywgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImFsYXcybGluIiwgYXVkaW9vcF9hbGF3MmxpbiwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImxpbjJhbGF3IiwgYXVkaW9vcF9saW4yYWxhdywgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImxpbjJsaW4iLCBhdWRpb29wX2xpbjJsaW4sIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJhZHBjbTJsaW4iLCBhdWRpb29wX2FkcGNtMmxpbiwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImxpbjJhZHBjbSIsIGF1ZGlvb3BfbGluMmFkcGNtLCBNRVRIX1ZBUkFSR1MgfSwKLSAgICAgICAgeyAidG9tb25vIiwgYXVkaW9vcF90b21vbm8sIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJ0b3N0ZXJlbyIsIGF1ZGlvb3BfdG9zdGVyZW8sIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJnZXRzYW1wbGUiLCBhdWRpb29wX2dldHNhbXBsZSwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgInJldmVyc2UiLCBhdWRpb29wX3JldmVyc2UsIE1FVEhfVkFSQVJHUyB9LAotICAgICAgICB7ICJyYXRlY3YiLCBhdWRpb29wX3JhdGVjdiwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgMCwgICAgICAgICAgMCB9CisgICAgeyAibWF4IiwgYXVkaW9vcF9tYXgsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgIm1pbm1heCIsIGF1ZGlvb3BfbWlubWF4LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJhdmciLCBhdWRpb29wX2F2ZywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAibWF4cHAiLCBhdWRpb29wX21heHBwLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJhdmdwcCIsIGF1ZGlvb3BfYXZncHAsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInJtcyIsIGF1ZGlvb3Bfcm1zLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJmaW5kZml0IiwgYXVkaW9vcF9maW5kZml0LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJmaW5kbWF4IiwgYXVkaW9vcF9maW5kbWF4LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJmaW5kZmFjdG9yIiwgYXVkaW9vcF9maW5kZmFjdG9yLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJjcm9zcyIsIGF1ZGlvb3BfY3Jvc3MsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgIm11bCIsIGF1ZGlvb3BfbXVsLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJhZGQiLCBhdWRpb29wX2FkZCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiYmlhcyIsIGF1ZGlvb3BfYmlhcywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAidWxhdzJsaW4iLCBhdWRpb29wX3VsYXcybGluLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJsaW4ydWxhdyIsIGF1ZGlvb3BfbGluMnVsYXcsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImFsYXcybGluIiwgYXVkaW9vcF9hbGF3MmxpbiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAibGluMmFsYXciLCBhdWRpb29wX2xpbjJhbGF3LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJsaW4ybGluIiwgYXVkaW9vcF9saW4ybGluLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJhZHBjbTJsaW4iLCBhdWRpb29wX2FkcGNtMmxpbiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAibGluMmFkcGNtIiwgYXVkaW9vcF9saW4yYWRwY20sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInRvbW9ubyIsIGF1ZGlvb3BfdG9tb25vLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJ0b3N0ZXJlbyIsIGF1ZGlvb3BfdG9zdGVyZW8sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImdldHNhbXBsZSIsIGF1ZGlvb3BfZ2V0c2FtcGxlLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJyZXZlcnNlIiwgYXVkaW9vcF9yZXZlcnNlLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJyYXRlY3YiLCBhdWRpb29wX3JhdGVjdiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAwLCAgICAgICAgICAwIH0KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0YXVkaW9vcCh2b2lkKQogewotICAgICAgICBQeU9iamVjdCAqbSwgKmQ7Ci0gICAgICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJhdWRpb29wIiwgYXVkaW9vcF9tZXRob2RzKTsKLSAgICAgICAgaWYgKG0gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotICAgICAgICBpZiAoZCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgQXVkaW9vcEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhdWRpb29wLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIGlmIChBdWRpb29wRXJyb3IgIT0gTlVMTCkKLSAgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCJlcnJvciIsQXVkaW9vcEVycm9yKTsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoImF1ZGlvb3AiLCBhdWRpb29wX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgQXVkaW9vcEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhdWRpb29wLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKEF1ZGlvb3BFcnJvciAhPSBOVUxMKQorICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiZXJyb3IiLEF1ZGlvb3BFcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2JpbmFzY2lpLmMgYi9Nb2R1bGVzL2JpbmFzY2lpLmMKaW5kZXggNjU0NzFhNi4uZDk4NTc3MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9iaW5hc2NpaS5jCisrKyBiL01vZHVsZXMvYmluYXNjaWkuYwpAQCAtMyw0MCArMyw0MCBAQAogKioKICoqIFRoaXMgbW9kdWxlIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGVuY29kaW5nczoKICoqIHV1ZW5jb2RlOgotKiogICAgIAllYWNoIGxpbmUgZW5jb2RlcyA0NSBieXRlcyAoZXhjZXB0IHBvc3NpYmx5IHRoZSBsYXN0KQotKioJRmlyc3QgY2hhciBlbmNvZGVzIChiaW5hcnkpIGxlbmd0aCwgcmVzdCBkYXRhCi0qKgllYWNoIGNoYXIgZW5jb2RlcyA2IGJpdHMsIGFzIGZvbGxvd3M6Ci0qKgliaW5hcnk6IDAxMjM0NTY3IGFiY2RlZmdoIGlqa2xtbm9wCi0qKglhc2NpaTogIDAxMjM0NSA2N2FiY2QgZWZnaGlqIGtsbW5vcAotKioJQVNDSUkgZW5jb2RpbmcgbWV0aG9kIGlzICJleGNlc3Mtc3BhY2UiOiAwMDAwMDAgaXMgZW5jb2RlZCBhcyAnICcsIGV0Yy4KLSoqCXNob3J0IGJpbmFyeSBkYXRhIGlzIHplcm8tZXh0ZW5kZWQgKHNvIHRoZSBiaXRzIGFyZSBhbHdheXMgaW4gdGhlCi0qKglyaWdodCBwbGFjZSksIHRoaXMgZG9lcyAqbm90KiByZWZsZWN0IGluIHRoZSBsZW5ndGguCisqKiAgICAgIGVhY2ggbGluZSBlbmNvZGVzIDQ1IGJ5dGVzIChleGNlcHQgcG9zc2libHkgdGhlIGxhc3QpCisqKiAgICAgIEZpcnN0IGNoYXIgZW5jb2RlcyAoYmluYXJ5KSBsZW5ndGgsIHJlc3QgZGF0YQorKiogICAgICBlYWNoIGNoYXIgZW5jb2RlcyA2IGJpdHMsIGFzIGZvbGxvd3M6CisqKiAgICAgIGJpbmFyeTogMDEyMzQ1NjcgYWJjZGVmZ2ggaWprbG1ub3AKKyoqICAgICAgYXNjaWk6ICAwMTIzNDUgNjdhYmNkIGVmZ2hpaiBrbG1ub3AKKyoqICAgICAgQVNDSUkgZW5jb2RpbmcgbWV0aG9kIGlzICJleGNlc3Mtc3BhY2UiOiAwMDAwMDAgaXMgZW5jb2RlZCBhcyAnICcsIGV0Yy4KKyoqICAgICAgc2hvcnQgYmluYXJ5IGRhdGEgaXMgemVyby1leHRlbmRlZCAoc28gdGhlIGJpdHMgYXJlIGFsd2F5cyBpbiB0aGUKKyoqICAgICAgcmlnaHQgcGxhY2UpLCB0aGlzIGRvZXMgKm5vdCogcmVmbGVjdCBpbiB0aGUgbGVuZ3RoLgogKiogYmFzZTY0OgogKiogICAgICBMaW5lIGJyZWFrcyBhcmUgaW5zaWduaWZpY2FudCwgYnV0IGxpbmVzIGFyZSBhdCBtb3N0IDc2IGNoYXJzCiAqKiAgICAgIGVhY2ggY2hhciBlbmNvZGVzIDYgYml0cywgaW4gc2ltaWxhciBvcmRlciBhcyB1dWNvZGUvaHF4LiBFbmNvZGluZwogKiogICAgICBpcyBkb25lIHZpYSBhIHRhYmxlLgogKiogICAgICBTaG9ydCBiaW5hcnkgZGF0YSBpcyBmaWxsZWQgKGluIEFTQ0lJKSB3aXRoICc9Jy4KICoqIGhxeDoKLSoqCUZpbGUgc3RhcnRzIHdpdGggaW50cm9kdWN0b3J5IHRleHQsIHJlYWwgZGF0YSBzdGFydHMgYW5kIGVuZHMKLSoqCXdpdGggY29sb25zLgotKioJRGF0YSBjb25zaXN0cyBvZiB0aHJlZSBzaW1pbGFyIHBhcnRzOiBpbmZvLCBkYXRhZm9yaywgcmVzb3VyY2Vmb3JrLgotKioJRWFjaCBwYXJ0IGlzIHByb3RlY3RlZCAoYXQgdGhlIGVuZCkgd2l0aCBhIDE2LWJpdCBjcmMKLSoqCVRoZSBiaW5hcnkgZGF0YSBpcyBydW4tbGVuZ3RoIGVuY29kZWQsIGFuZCB0aGVuIGFzY2lpLWZpZWQ6Ci0qKgliaW5hcnk6IDAxMjM0NTY3IGFiY2RlZmdoIGlqa2xtbm9wCi0qKglhc2NpaTogIDAxMjM0NSA2N2FiY2QgZWZnaGlqIGtsbW5vcAotKioJQVNDSUkgZW5jb2RpbmcgaXMgdGFibGUtZHJpdmVuLCBzZWUgdGhlIGNvZGUuCi0qKglTaG9ydCBiaW5hcnkgZGF0YSByZXN1bHRzIGluIHRoZSBydW50IGFzY2lpLWJ5dGUgYmVpbmcgb3V0cHV0IHdpdGgKLSoqCXRoZSBiaXRzIGluIHRoZSByaWdodCBwbGFjZS4KKyoqICAgICAgRmlsZSBzdGFydHMgd2l0aCBpbnRyb2R1Y3RvcnkgdGV4dCwgcmVhbCBkYXRhIHN0YXJ0cyBhbmQgZW5kcworKiogICAgICB3aXRoIGNvbG9ucy4KKyoqICAgICAgRGF0YSBjb25zaXN0cyBvZiB0aHJlZSBzaW1pbGFyIHBhcnRzOiBpbmZvLCBkYXRhZm9yaywgcmVzb3VyY2Vmb3JrLgorKiogICAgICBFYWNoIHBhcnQgaXMgcHJvdGVjdGVkIChhdCB0aGUgZW5kKSB3aXRoIGEgMTYtYml0IGNyYworKiogICAgICBUaGUgYmluYXJ5IGRhdGEgaXMgcnVuLWxlbmd0aCBlbmNvZGVkLCBhbmQgdGhlbiBhc2NpaS1maWVkOgorKiogICAgICBiaW5hcnk6IDAxMjM0NTY3IGFiY2RlZmdoIGlqa2xtbm9wCisqKiAgICAgIGFzY2lpOiAgMDEyMzQ1IDY3YWJjZCBlZmdoaWoga2xtbm9wCisqKiAgICAgIEFTQ0lJIGVuY29kaW5nIGlzIHRhYmxlLWRyaXZlbiwgc2VlIHRoZSBjb2RlLgorKiogICAgICBTaG9ydCBiaW5hcnkgZGF0YSByZXN1bHRzIGluIHRoZSBydW50IGFzY2lpLWJ5dGUgYmVpbmcgb3V0cHV0IHdpdGgKKyoqICAgICAgdGhlIGJpdHMgaW4gdGhlIHJpZ2h0IHBsYWNlLgogKioKICoqIFdoaWxlIEkgd2FzIHJlYWRpbmcgZG96ZW5zIG9mIHByb2dyYW1zIHRoYXQgZW5jb2RlIG9yIGRlY29kZSB0aGUgZm9ybWF0cwogKiogaGVyZSAoZG9jdW1lbnRhdGlvbj8gaGloaTotKSBJIGhhdmUgZm9ybXVsYXRlZCBKYW5zZW4ncyBPYnNlcnZhdGlvbjoKICoqCi0qKglQcm9ncmFtcyB0aGF0IGVuY29kZSBiaW5hcnkgZGF0YSBpbiBBU0NJSSBhcmUgd3JpdHRlbiBpbgotKioJc3VjaCBhIHN0eWxlIHRoYXQgdGhleSBhcmUgYXMgdW5yZWFkYWJsZSBhcyBwb3NzaWJsZS4gRGV2aWNlcyB1c2VkCi0qKglpbmNsdWRlIHVubmVjZXNzYXJ5IGdsb2JhbCB2YXJpYWJsZXMsIGJ1cnlpbmcgaW1wb3J0YW50IHRhYmxlcwotKioJaW4gdW5yZWxhdGVkIHNvdXJjZWZpbGVzLCBwdXR0aW5nIGZ1bmN0aW9ucyBpbiBpbmNsdWRlIGZpbGVzLAotKioJdXNpbmcgc2VlbWluZ2x5LWRlc2NyaXB0aXZlIHZhcmlhYmxlIG5hbWVzIGZvciBkaWZmZXJlbnQgcHVycG9zZXMsCi0qKgljYWxscyB0byBlbXB0eSBzdWJyb3V0aW5lcyBhbmQgYSBob3N0IG9mIG90aGVycy4KKyoqICAgICAgUHJvZ3JhbXMgdGhhdCBlbmNvZGUgYmluYXJ5IGRhdGEgaW4gQVNDSUkgYXJlIHdyaXR0ZW4gaW4KKyoqICAgICAgc3VjaCBhIHN0eWxlIHRoYXQgdGhleSBhcmUgYXMgdW5yZWFkYWJsZSBhcyBwb3NzaWJsZS4gRGV2aWNlcyB1c2VkCisqKiAgICAgIGluY2x1ZGUgdW5uZWNlc3NhcnkgZ2xvYmFsIHZhcmlhYmxlcywgYnVyeWluZyBpbXBvcnRhbnQgdGFibGVzCisqKiAgICAgIGluIHVucmVsYXRlZCBzb3VyY2VmaWxlcywgcHV0dGluZyBmdW5jdGlvbnMgaW4gaW5jbHVkZSBmaWxlcywKKyoqICAgICAgdXNpbmcgc2VlbWluZ2x5LWRlc2NyaXB0aXZlIHZhcmlhYmxlIG5hbWVzIGZvciBkaWZmZXJlbnQgcHVycG9zZXMsCisqKiAgICAgIGNhbGxzIHRvIGVtcHR5IHN1YnJvdXRpbmVzIGFuZCBhIGhvc3Qgb2Ygb3RoZXJzLgogKioKICoqIEkgaGF2ZSBhdHRlbXB0ZWQgdG8gYnJlYWsgd2l0aCB0aGlzIHRyYWRpdGlvbiwgYnV0IEkgZ3Vlc3MgdGhhdCB0aGF0CiAqKiBkb2VzIG1ha2UgdGhlIHBlcmZvcm1hbmNlIHN1Yi1vcHRpbWFsLiBPaCB3ZWxsLCB0b28gYmFkLi4uCkBAIC03NSw2NyArNzUsNjcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVfYTJiX2hxeFsyNTZdID0gewogLyogICAgICAgXkAgICAgXkEgICAgXkIgICAgXkMgICAgXkQgICAgXkUgICAgXkYgICAgXkcgICAqLwotLyogMCovCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisvKiAwKi8gIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCiAvKiAgICAgICBcYiAgICBcdCAgICBcbiAgICBeSyAgICBeTCAgICBcciAgICBeTiAgICBeTyAgICovCi0vKiAxKi8JRkFJTCwgRkFJTCwgU0tJUCwgRkFJTCwgRkFJTCwgU0tJUCwgRkFJTCwgRkFJTCwKKy8qIDEqLyAgRkFJTCwgRkFJTCwgU0tJUCwgRkFJTCwgRkFJTCwgU0tJUCwgRkFJTCwgRkFJTCwKIC8qICAgICAgIF5QICAgIF5RICAgIF5SICAgIF5TICAgIF5UICAgIF5VICAgIF5WICAgIF5XICAgKi8KLS8qIDIqLwlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorLyogMiovICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgXlggICAgXlkgICAgXlogICAgXlsgICAgXlwgICAgXl0gICAgXl4gICAgXl8gICAqLwotLyogMyovCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisvKiAzKi8gIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCiAvKiAgICAgICAgICAgICAgISAgICAgIiAgICAgIyAgICAgJCAgICAgJSAgICAgJiAgICAgJyAgICovCi0vKiA0Ki8JRkFJTCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKKy8qIDQqLyAgRkFJTCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwKIC8qICAgICAgICAoICAgICApICAgICAqICAgICArICAgICAsICAgICAtICAgICAuICAgICAvICAgKi8KLS8qIDUqLwkweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCBGQUlMLCBGQUlMLAorLyogNSovICAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCBGQUlMLCBGQUlMLAogLyogICAgICAgIDAgICAgIDEgICAgIDIgICAgIDMgICAgIDQgICAgIDUgICAgIDYgICAgIDcgICAqLwotLyogNiovCTB4MEQsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIEZBSUwsCisvKiA2Ki8gIDB4MEQsIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIEZBSUwsCiAvKiAgICAgICAgOCAgICAgOSAgICAgOiAgICAgOyAgICAgPCAgICAgPSAgICAgPiAgICAgPyAgICovCi0vKiA3Ki8JMHgxNCwgMHgxNSwgRE9ORSwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKy8qIDcqLyAgMHgxNCwgMHgxNSwgRE9ORSwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIC8qICAgICAgICBAICAgICBBICAgICBCICAgICBDICAgICBEICAgICBFICAgICBGICAgICBHICAgKi8KLS8qIDgqLwkweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELAorLyogOCovICAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFBLCAweDFCLCAweDFDLCAweDFELAogLyogICAgICAgIEggICAgIEkgICAgIEogICAgIEsgICAgIEwgICAgIE0gICAgIE4gICAgIE8gICAqLwotLyogOSovCTB4MUUsIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIEZBSUwsCisvKiA5Ki8gIDB4MUUsIDB4MUYsIDB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIEZBSUwsCiAvKiAgICAgICAgUCAgICAgUSAgICAgUiAgICAgUyAgICAgVCAgICAgVSAgICAgViAgICAgVyAgICovCi0vKjEwKi8JMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgRkFJTCwKKy8qMTAqLyAgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwgRkFJTCwKIC8qICAgICAgICBYICAgICBZICAgICBaICAgICBbICAgICBcICAgICBdICAgICBeICAgICBfICAgKi8KLS8qMTEqLwkweDJDLCAweDJELCAweDJFLCAweDJGLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorLyoxMSovICAweDJDLCAweDJELCAweDJFLCAweDJGLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgIGAgICAgIGEgICAgIGIgICAgIGMgICAgIGQgICAgIGUgICAgIGYgICAgIGcgICAqLwotLyoxMiovCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIEZBSUwsCisvKjEyKi8gIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIEZBSUwsCiAvKiAgICAgICAgaCAgICAgaSAgICAgaiAgICAgayAgICAgbCAgICAgbSAgICAgbiAgICAgbyAgICovCi0vKjEzKi8JMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwgMHgzQywgRkFJTCwgRkFJTCwKKy8qMTMqLyAgMHgzNywgMHgzOCwgMHgzOSwgMHgzQSwgMHgzQiwgMHgzQywgRkFJTCwgRkFJTCwKIC8qICAgICAgICBwICAgICBxICAgICByICAgICBzICAgICB0ICAgICB1ICAgICB2ICAgICB3ICAgKi8KLS8qMTQqLwkweDNELCAweDNFLCAweDNGLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorLyoxNCovICAweDNELCAweDNFLCAweDNGLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgIHggICAgIHkgICAgIHogICAgIHsgICAgIHwgICAgIH0gICAgIH4gICAgXj8gICAqLwotLyoxNSovCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0vKjE2Ki8JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKLQlGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAotCUZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCi0JRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKy8qMTUqLyAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKy8qMTYqLyAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKKyAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAorICAgIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsIEZBSUwsCisgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9ocXhbXSA9CiAiIVwiIyQlJicoKSorLC0wMTIzNDU2ODlAQUJDREVGR0hJSktMTU5QUVJTVFVWWFlaW2BhYmNkZWZoaWprbG1wcXIiOwogCiBzdGF0aWMgY2hhciB0YWJsZV9hMmJfYmFzZTY0W10gPSB7Ci0JLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCi0JLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCi0JLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSw2MiwgLTEsLTEsLTEsNjMsCi0JNTIsNTMsNTQsNTUsIDU2LDU3LDU4LDU5LCA2MCw2MSwtMSwtMSwgLTEsIDAsLTEsLTEsIC8qIE5vdGUgUEFELT4wICovCi0JLTEsIDAsIDEsIDIsICAzLCA0LCA1LCA2LCAgNywgOCwgOSwxMCwgMTEsMTIsMTMsMTQsCi0JMTUsMTYsMTcsMTgsIDE5LDIwLDIxLDIyLCAyMywyNCwyNSwtMSwgLTEsLTEsLTEsLTEsCi0JLTEsMjYsMjcsMjgsIDI5LDMwLDMxLDMyLCAzMywzNCwzNSwzNiwgMzcsMzgsMzksNDAsCi0JNDEsNDIsNDMsNDQsIDQ1LDQ2LDQ3LDQ4LCA0OSw1MCw1MSwtMSwgLTEsLTEsLTEsLTEKKyAgICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKKyAgICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLDYyLCAtMSwtMSwtMSw2MywKKyAgICA1Miw1Myw1NCw1NSwgNTYsNTcsNTgsNTksIDYwLDYxLC0xLC0xLCAtMSwgMCwtMSwtMSwgLyogTm90ZSBQQUQtPjAgKi8KKyAgICAtMSwgMCwgMSwgMiwgIDMsIDQsIDUsIDYsICA3LCA4LCA5LDEwLCAxMSwxMiwxMywxNCwKKyAgICAxNSwxNiwxNywxOCwgMTksMjAsMjEsMjIsIDIzLDI0LDI1LC0xLCAtMSwtMSwtMSwtMSwKKyAgICAtMSwyNiwyNywyOCwgMjksMzAsMzEsMzIsIDMzLDM0LDM1LDM2LCAzNywzOCwzOSw0MCwKKyAgICA0MSw0Miw0Myw0NCwgNDUsNDYsNDcsNDgsIDQ5LDUwLDUxLC0xLCAtMSwtMSwtMSwtMQogfTsKIAogI2RlZmluZSBCQVNFNjRfUEFEICc9JwpAQCAtMTQ5LDM4ICsxNDksMzggQEAKIAogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgY3JjdGFiX2hxeFsyNTZdID0gewotCTB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwYTUsIDB4NjBjNiwgMHg3MGU3LAotCTB4ODEwOCwgMHg5MTI5LCAweGExNGEsIDB4YjE2YiwgMHhjMThjLCAweGQxYWQsIDB4ZTFjZSwgMHhmMWVmLAotCTB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MmI1LCAweDQyOTQsIDB4NzJmNywgMHg2MmQ2LAotCTB4OTMzOSwgMHg4MzE4LCAweGIzN2IsIDB4YTM1YSwgMHhkM2JkLCAweGMzOWMsIDB4ZjNmZiwgMHhlM2RlLAotCTB4MjQ2MiwgMHgzNDQzLCAweDA0MjAsIDB4MTQwMSwgMHg2NGU2LCAweDc0YzcsIDB4NDRhNCwgMHg1NDg1LAotCTB4YTU2YSwgMHhiNTRiLCAweDg1MjgsIDB4OTUwOSwgMHhlNWVlLCAweGY1Y2YsIDB4YzVhYywgMHhkNThkLAotCTB4MzY1MywgMHgyNjcyLCAweDE2MTEsIDB4MDYzMCwgMHg3NmQ3LCAweDY2ZjYsIDB4NTY5NSwgMHg0NmI0LAotCTB4Yjc1YiwgMHhhNzdhLCAweDk3MTksIDB4ODczOCwgMHhmN2RmLCAweGU3ZmUsIDB4ZDc5ZCwgMHhjN2JjLAotCTB4NDhjNCwgMHg1OGU1LCAweDY4ODYsIDB4NzhhNywgMHgwODQwLCAweDE4NjEsIDB4MjgwMiwgMHgzODIzLAotCTB4YzljYywgMHhkOWVkLCAweGU5OGUsIDB4ZjlhZiwgMHg4OTQ4LCAweDk5NjksIDB4YTkwYSwgMHhiOTJiLAotCTB4NWFmNSwgMHg0YWQ0LCAweDdhYjcsIDB4NmE5NiwgMHgxYTcxLCAweDBhNTAsIDB4M2EzMywgMHgyYTEyLAotCTB4ZGJmZCwgMHhjYmRjLCAweGZiYmYsIDB4ZWI5ZSwgMHg5Yjc5LCAweDhiNTgsIDB4YmIzYiwgMHhhYjFhLAotCTB4NmNhNiwgMHg3Yzg3LCAweDRjZTQsIDB4NWNjNSwgMHgyYzIyLCAweDNjMDMsIDB4MGM2MCwgMHgxYzQxLAotCTB4ZWRhZSwgMHhmZDhmLCAweGNkZWMsIDB4ZGRjZCwgMHhhZDJhLCAweGJkMGIsIDB4OGQ2OCwgMHg5ZDQ5LAotCTB4N2U5NywgMHg2ZWI2LCAweDVlZDUsIDB4NGVmNCwgMHgzZTEzLCAweDJlMzIsIDB4MWU1MSwgMHgwZTcwLAotCTB4ZmY5ZiwgMHhlZmJlLCAweGRmZGQsIDB4Y2ZmYywgMHhiZjFiLCAweGFmM2EsIDB4OWY1OSwgMHg4Zjc4LAotCTB4OTE4OCwgMHg4MWE5LCAweGIxY2EsIDB4YTFlYiwgMHhkMTBjLCAweGMxMmQsIDB4ZjE0ZSwgMHhlMTZmLAotCTB4MTA4MCwgMHgwMGExLCAweDMwYzIsIDB4MjBlMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAotCTB4ODNiOSwgMHg5Mzk4LCAweGEzZmIsIDB4YjNkYSwgMHhjMzNkLCAweGQzMWMsIDB4ZTM3ZiwgMHhmMzVlLAotCTB4MDJiMSwgMHgxMjkwLCAweDIyZjMsIDB4MzJkMiwgMHg0MjM1LCAweDUyMTQsIDB4NjI3NywgMHg3MjU2LAotCTB4YjVlYSwgMHhhNWNiLCAweDk1YTgsIDB4ODU4OSwgMHhmNTZlLCAweGU1NGYsIDB4ZDUyYywgMHhjNTBkLAotCTB4MzRlMiwgMHgyNGMzLCAweDE0YTAsIDB4MDQ4MSwgMHg3NDY2LCAweDY0NDcsIDB4NTQyNCwgMHg0NDA1LAotCTB4YTdkYiwgMHhiN2ZhLCAweDg3OTksIDB4OTdiOCwgMHhlNzVmLCAweGY3N2UsIDB4YzcxZCwgMHhkNzNjLAotCTB4MjZkMywgMHgzNmYyLCAweDA2OTEsIDB4MTZiMCwgMHg2NjU3LCAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LAotCTB4ZDk0YywgMHhjOTZkLCAweGY5MGUsIDB4ZTkyZiwgMHg5OWM4LCAweDg5ZTksIDB4Yjk4YSwgMHhhOWFiLAotCTB4NTg0NCwgMHg0ODY1LCAweDc4MDYsIDB4NjgyNywgMHgxOGMwLCAweDA4ZTEsIDB4Mzg4MiwgMHgyOGEzLAotCTB4Y2I3ZCwgMHhkYjVjLCAweGViM2YsIDB4ZmIxZSwgMHg4YmY5LCAweDliZDgsIDB4YWJiYiwgMHhiYjlhLAotCTB4NGE3NSwgMHg1YTU0LCAweDZhMzcsIDB4N2ExNiwgMHgwYWYxLCAweDFhZDAsIDB4MmFiMywgMHgzYTkyLAotCTB4ZmQyZSwgMHhlZDBmLCAweGRkNmMsIDB4Y2Q0ZCwgMHhiZGFhLCAweGFkOGIsIDB4OWRlOCwgMHg4ZGM5LAotCTB4N2MyNiwgMHg2YzA3LCAweDVjNjQsIDB4NGM0NSwgMHgzY2EyLCAweDJjODMsIDB4MWNlMCwgMHgwY2MxLAotCTB4ZWYxZiwgMHhmZjNlLCAweGNmNWQsIDB4ZGY3YywgMHhhZjliLCAweGJmYmEsIDB4OGZkOSwgMHg5ZmY4LAotCTB4NmUxNywgMHg3ZTM2LCAweDRlNTUsIDB4NWU3NCwgMHgyZTkzLCAweDNlYjIsIDB4MGVkMSwgMHgxZWYwLAorICAgIDB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwYTUsIDB4NjBjNiwgMHg3MGU3LAorICAgIDB4ODEwOCwgMHg5MTI5LCAweGExNGEsIDB4YjE2YiwgMHhjMThjLCAweGQxYWQsIDB4ZTFjZSwgMHhmMWVmLAorICAgIDB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MmI1LCAweDQyOTQsIDB4NzJmNywgMHg2MmQ2LAorICAgIDB4OTMzOSwgMHg4MzE4LCAweGIzN2IsIDB4YTM1YSwgMHhkM2JkLCAweGMzOWMsIDB4ZjNmZiwgMHhlM2RlLAorICAgIDB4MjQ2MiwgMHgzNDQzLCAweDA0MjAsIDB4MTQwMSwgMHg2NGU2LCAweDc0YzcsIDB4NDRhNCwgMHg1NDg1LAorICAgIDB4YTU2YSwgMHhiNTRiLCAweDg1MjgsIDB4OTUwOSwgMHhlNWVlLCAweGY1Y2YsIDB4YzVhYywgMHhkNThkLAorICAgIDB4MzY1MywgMHgyNjcyLCAweDE2MTEsIDB4MDYzMCwgMHg3NmQ3LCAweDY2ZjYsIDB4NTY5NSwgMHg0NmI0LAorICAgIDB4Yjc1YiwgMHhhNzdhLCAweDk3MTksIDB4ODczOCwgMHhmN2RmLCAweGU3ZmUsIDB4ZDc5ZCwgMHhjN2JjLAorICAgIDB4NDhjNCwgMHg1OGU1LCAweDY4ODYsIDB4NzhhNywgMHgwODQwLCAweDE4NjEsIDB4MjgwMiwgMHgzODIzLAorICAgIDB4YzljYywgMHhkOWVkLCAweGU5OGUsIDB4ZjlhZiwgMHg4OTQ4LCAweDk5NjksIDB4YTkwYSwgMHhiOTJiLAorICAgIDB4NWFmNSwgMHg0YWQ0LCAweDdhYjcsIDB4NmE5NiwgMHgxYTcxLCAweDBhNTAsIDB4M2EzMywgMHgyYTEyLAorICAgIDB4ZGJmZCwgMHhjYmRjLCAweGZiYmYsIDB4ZWI5ZSwgMHg5Yjc5LCAweDhiNTgsIDB4YmIzYiwgMHhhYjFhLAorICAgIDB4NmNhNiwgMHg3Yzg3LCAweDRjZTQsIDB4NWNjNSwgMHgyYzIyLCAweDNjMDMsIDB4MGM2MCwgMHgxYzQxLAorICAgIDB4ZWRhZSwgMHhmZDhmLCAweGNkZWMsIDB4ZGRjZCwgMHhhZDJhLCAweGJkMGIsIDB4OGQ2OCwgMHg5ZDQ5LAorICAgIDB4N2U5NywgMHg2ZWI2LCAweDVlZDUsIDB4NGVmNCwgMHgzZTEzLCAweDJlMzIsIDB4MWU1MSwgMHgwZTcwLAorICAgIDB4ZmY5ZiwgMHhlZmJlLCAweGRmZGQsIDB4Y2ZmYywgMHhiZjFiLCAweGFmM2EsIDB4OWY1OSwgMHg4Zjc4LAorICAgIDB4OTE4OCwgMHg4MWE5LCAweGIxY2EsIDB4YTFlYiwgMHhkMTBjLCAweGMxMmQsIDB4ZjE0ZSwgMHhlMTZmLAorICAgIDB4MTA4MCwgMHgwMGExLCAweDMwYzIsIDB4MjBlMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAorICAgIDB4ODNiOSwgMHg5Mzk4LCAweGEzZmIsIDB4YjNkYSwgMHhjMzNkLCAweGQzMWMsIDB4ZTM3ZiwgMHhmMzVlLAorICAgIDB4MDJiMSwgMHgxMjkwLCAweDIyZjMsIDB4MzJkMiwgMHg0MjM1LCAweDUyMTQsIDB4NjI3NywgMHg3MjU2LAorICAgIDB4YjVlYSwgMHhhNWNiLCAweDk1YTgsIDB4ODU4OSwgMHhmNTZlLCAweGU1NGYsIDB4ZDUyYywgMHhjNTBkLAorICAgIDB4MzRlMiwgMHgyNGMzLCAweDE0YTAsIDB4MDQ4MSwgMHg3NDY2LCAweDY0NDcsIDB4NTQyNCwgMHg0NDA1LAorICAgIDB4YTdkYiwgMHhiN2ZhLCAweDg3OTksIDB4OTdiOCwgMHhlNzVmLCAweGY3N2UsIDB4YzcxZCwgMHhkNzNjLAorICAgIDB4MjZkMywgMHgzNmYyLCAweDA2OTEsIDB4MTZiMCwgMHg2NjU3LCAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LAorICAgIDB4ZDk0YywgMHhjOTZkLCAweGY5MGUsIDB4ZTkyZiwgMHg5OWM4LCAweDg5ZTksIDB4Yjk4YSwgMHhhOWFiLAorICAgIDB4NTg0NCwgMHg0ODY1LCAweDc4MDYsIDB4NjgyNywgMHgxOGMwLCAweDA4ZTEsIDB4Mzg4MiwgMHgyOGEzLAorICAgIDB4Y2I3ZCwgMHhkYjVjLCAweGViM2YsIDB4ZmIxZSwgMHg4YmY5LCAweDliZDgsIDB4YWJiYiwgMHhiYjlhLAorICAgIDB4NGE3NSwgMHg1YTU0LCAweDZhMzcsIDB4N2ExNiwgMHgwYWYxLCAweDFhZDAsIDB4MmFiMywgMHgzYTkyLAorICAgIDB4ZmQyZSwgMHhlZDBmLCAweGRkNmMsIDB4Y2Q0ZCwgMHhiZGFhLCAweGFkOGIsIDB4OWRlOCwgMHg4ZGM5LAorICAgIDB4N2MyNiwgMHg2YzA3LCAweDVjNjQsIDB4NGM0NSwgMHgzY2EyLCAweDJjODMsIDB4MWNlMCwgMHgwY2MxLAorICAgIDB4ZWYxZiwgMHhmZjNlLCAweGNmNWQsIDB4ZGY3YywgMHhhZjliLCAweGJmYmEsIDB4OGZkOSwgMHg5ZmY4LAorICAgIDB4NmUxNywgMHg3ZTM2LCAweDRlNTUsIDB4NWU3NCwgMHgyZTkzLCAweDNlYjIsIDB4MGVkMSwgMHgxZWYwLAogfTsKIAogUHlEb2NfU1RSVkFSKGRvY19hMmJfdXUsICIoYXNjaWkpIC0+IGJpbi4gRGVjb2RlIGEgbGluZSBvZiB1dWVuY29kZWQgZGF0YSIpOwpAQCAtMTg4LDc3ICsxODgsNzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9hMmJfdXUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKLQlpbnQgbGVmdGJpdHMgPSAwOwotCXVuc2lnbmVkIGNoYXIgdGhpc19jaDsKLQl1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotCVB5T2JqZWN0ICpydjsKLQlQeV9zc2l6ZV90IGFzY2lpX2xlbiwgYmluX2xlbjsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgaW50IGxlZnRiaXRzID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CisgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgUHlfc3NpemVfdCBhc2NpaV9sZW4sIGJpbl9sZW47CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0IzphMmJfdXUiLCAmYXNjaWlfZGF0YSwgJmFzY2lpX2xlbikgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0IzphMmJfdXUiLCAmYXNjaWlfZGF0YSwgJmFzY2lpX2xlbikgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFzc2VydChhc2NpaV9sZW4gPj0gMCk7CisgICAgYXNzZXJ0KGFzY2lpX2xlbiA+PSAwKTsKIAotCS8qIEZpcnN0IGJ5dGU6IGJpbmFyeSBkYXRhIGxlbmd0aCAoaW4gYnl0ZXMpICovCi0JYmluX2xlbiA9ICgqYXNjaWlfZGF0YSsrIC0gJyAnKSAmIDA3NzsKLQlhc2NpaV9sZW4tLTsKKyAgICAvKiBGaXJzdCBieXRlOiBiaW5hcnkgZGF0YSBsZW5ndGggKGluIGJ5dGVzKSAqLworICAgIGJpbl9sZW4gPSAoKmFzY2lpX2RhdGErKyAtICcgJykgJiAwNzc7CisgICAgYXNjaWlfbGVuLS07CiAKLQkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCi0JaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYmluX2xlbikpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQliaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIC8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KKyAgICBpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJpbl9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLQlmb3IoIDsgYmluX2xlbiA+IDAgOyBhc2NpaV9sZW4tLSwgYXNjaWlfZGF0YSsrICkgewotCQkvKiBYWFggaXMgaXQgcmVhbGx5IGJlc3QgdG8gYWRkIE5VTHMgaWYgdGhlcmUncyBubyBtb3JlIGRhdGEgKi8KLQkJdGhpc19jaCA9IChhc2NpaV9sZW4gPiAwKSA/ICphc2NpaV9kYXRhIDogMDsKLQkJaWYgKCB0aGlzX2NoID09ICdcbicgfHwgdGhpc19jaCA9PSAnXHInIHx8IGFzY2lpX2xlbiA8PSAwKSB7Ci0JCQkvKgotCQkJKiogV2hpdGVzcGFjZS4gQXNzdW1lIHNvbWUgc3BhY2VzIGdvdCBlYXRlbiBhdAotCQkJKiogZW5kLW9mLWxpbmUuIChXZSBjaGVjayB0aGlzIGxhdGVyKQotCQkJKi8KLQkJCXRoaXNfY2ggPSAwOwotCSAgICAgICAgfSBlbHNlIHsKLQkJCS8qIENoZWNrIHRoZSBjaGFyYWN0ZXIgZm9yIGxlZ2FsaXR5Ci0JCQkqKiBUaGUgNjQgaW4gc3RlYWQgb2YgdGhlIGV4cGVjdGVkIDYzIGlzIGJlY2F1c2UKLQkJCSoqIHRoZXJlIGFyZSBhIGZldyB1dWVuY29kZXMgb3V0IHRoZXJlIHRoYXQgdXNlCi0JCQkqKiAnYCcgYXMgemVybyBpbnN0ZWFkIG9mIHNwYWNlLgotCQkJKi8KLQkJCWlmICggdGhpc19jaCA8ICcgJyB8fCB0aGlzX2NoID4gKCcgJyArIDY0KSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhFcnJvciwgIklsbGVnYWwgY2hhciIpOwotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQl0aGlzX2NoID0gKHRoaXNfY2ggLSAnICcpICYgMDc3OwotCQl9Ci0JCS8qCi0JCSoqIFNoaWZ0IGl0IGluIG9uIHRoZSBsb3cgZW5kLCBhbmQgc2VlIGlmIHRoZXJlJ3MKLQkJKiogYSBieXRlIHJlYWR5IGZvciBvdXRwdXQuCi0JCSovCi0JCWxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDYpIHwgKHRoaXNfY2gpOwotCQlsZWZ0Yml0cyArPSA2OwotCQlpZiAoIGxlZnRiaXRzID49IDggKSB7Ci0JCQlsZWZ0Yml0cyAtPSA4OwotCQkJKmJpbl9kYXRhKysgPSAobGVmdGNoYXIgPj4gbGVmdGJpdHMpICYgMHhmZjsKLQkJCWxlZnRjaGFyICY9ICgoMSA8PCBsZWZ0Yml0cykgLSAxKTsKLQkJCWJpbl9sZW4tLTsKLQkJfQotCX0KLQkvKgotCSoqIEZpbmFsbHksIGNoZWNrIHRoYXQgaWYgdGhlcmUncyBhbnl0aGluZyBsZWZ0IG9uIHRoZSBsaW5lCi0JKiogdGhhdCBpdCdzIHdoaXRlc3BhY2Ugb25seS4KLQkqLwotCXdoaWxlKCBhc2NpaV9sZW4tLSA+IDAgKSB7Ci0JCXRoaXNfY2ggPSAqYXNjaWlfZGF0YSsrOwotCQkvKiBFeHRyYSAnYCcgbWF5IGJlIHdyaXR0ZW4gYXMgcGFkZGluZyBpbiBzb21lIGNhc2VzICovCi0JCWlmICggdGhpc19jaCAhPSAnICcgJiYgdGhpc19jaCAhPSAnICcrNjQgJiYKLQkJICAgICB0aGlzX2NoICE9ICdcbicgJiYgdGhpc19jaCAhPSAnXHInICkgewotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiVHJhaWxpbmcgZ2FyYmFnZSIpOwotCQkJUHlfREVDUkVGKHJ2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBydjsKKyAgICBmb3IoIDsgYmluX2xlbiA+IDAgOyBhc2NpaV9sZW4tLSwgYXNjaWlfZGF0YSsrICkgeworICAgICAgICAvKiBYWFggaXMgaXQgcmVhbGx5IGJlc3QgdG8gYWRkIE5VTHMgaWYgdGhlcmUncyBubyBtb3JlIGRhdGEgKi8KKyAgICAgICAgdGhpc19jaCA9IChhc2NpaV9sZW4gPiAwKSA/ICphc2NpaV9kYXRhIDogMDsKKyAgICAgICAgaWYgKCB0aGlzX2NoID09ICdcbicgfHwgdGhpc19jaCA9PSAnXHInIHx8IGFzY2lpX2xlbiA8PSAwKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgKiogV2hpdGVzcGFjZS4gQXNzdW1lIHNvbWUgc3BhY2VzIGdvdCBlYXRlbiBhdAorICAgICAgICAgICAgKiogZW5kLW9mLWxpbmUuIChXZSBjaGVjayB0aGlzIGxhdGVyKQorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRoaXNfY2ggPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGNoYXJhY3RlciBmb3IgbGVnYWxpdHkKKyAgICAgICAgICAgICoqIFRoZSA2NCBpbiBzdGVhZCBvZiB0aGUgZXhwZWN0ZWQgNjMgaXMgYmVjYXVzZQorICAgICAgICAgICAgKiogdGhlcmUgYXJlIGEgZmV3IHV1ZW5jb2RlcyBvdXQgdGhlcmUgdGhhdCB1c2UKKyAgICAgICAgICAgICoqICdgJyBhcyB6ZXJvIGluc3RlYWQgb2Ygc3BhY2UuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCB0aGlzX2NoIDwgJyAnIHx8IHRoaXNfY2ggPiAoJyAnICsgNjQpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSWxsZWdhbCBjaGFyIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXNfY2ggPSAodGhpc19jaCAtICcgJykgJiAwNzc7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgKiogU2hpZnQgaXQgaW4gb24gdGhlIGxvdyBlbmQsIGFuZCBzZWUgaWYgdGhlcmUncworICAgICAgICAqKiBhIGJ5dGUgcmVhZHkgZm9yIG91dHB1dC4KKyAgICAgICAgKi8KKyAgICAgICAgbGVmdGNoYXIgPSAobGVmdGNoYXIgPDwgNikgfCAodGhpc19jaCk7CisgICAgICAgIGxlZnRiaXRzICs9IDY7CisgICAgICAgIGlmICggbGVmdGJpdHMgPj0gOCApIHsKKyAgICAgICAgICAgIGxlZnRiaXRzIC09IDg7CisgICAgICAgICAgICAqYmluX2RhdGErKyA9IChsZWZ0Y2hhciA+PiBsZWZ0Yml0cykgJiAweGZmOworICAgICAgICAgICAgbGVmdGNoYXIgJj0gKCgxIDw8IGxlZnRiaXRzKSAtIDEpOworICAgICAgICAgICAgYmluX2xlbi0tOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgKiogRmluYWxseSwgY2hlY2sgdGhhdCBpZiB0aGVyZSdzIGFueXRoaW5nIGxlZnQgb24gdGhlIGxpbmUKKyAgICAqKiB0aGF0IGl0J3Mgd2hpdGVzcGFjZSBvbmx5LgorICAgICovCisgICAgd2hpbGUoIGFzY2lpX2xlbi0tID4gMCApIHsKKyAgICAgICAgdGhpc19jaCA9ICphc2NpaV9kYXRhKys7CisgICAgICAgIC8qIEV4dHJhICdgJyBtYXkgYmUgd3JpdHRlbiBhcyBwYWRkaW5nIGluIHNvbWUgY2FzZXMgKi8KKyAgICAgICAgaWYgKCB0aGlzX2NoICE9ICcgJyAmJiB0aGlzX2NoICE9ICcgJys2NCAmJgorICAgICAgICAgICAgIHRoaXNfY2ggIT0gJ1xuJyAmJiB0aGlzX2NoICE9ICdccicgKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJUcmFpbGluZyBnYXJiYWdlIik7CisgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBQeURvY19TVFJWQVIoZG9jX2IyYV91dSwgIihiaW4pIC0+IGFzY2lpLiBVdWVuY29kZSBsaW5lIG9mIGRhdGEiKTsKQEAgLTI2Niw3NSArMjY2LDc1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXNjaWlfYjJhX3V1KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7Ci0JaW50IGxlZnRiaXRzID0gMDsKLQl1bnNpZ25lZCBjaGFyIHRoaXNfY2g7Ci0JdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JUHlfc3NpemVfdCBiaW5fbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKKyAgICBpbnQgbGVmdGJpdHMgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKKyAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeV9zc2l6ZV90IGJpbl9sZW47CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpiMmFfdXUiLCAmYmluX2RhdGEsICZiaW5fbGVuKSApCi0JCXJldHVybiBOVUxMOwotCWlmICggYmluX2xlbiA+IDQ1ICkgewotCQkvKiBUaGUgNDUgaXMgYSBsaW1pdCB0aGF0IGFwcGVhcnMgaW4gYWxsIHV1ZW5jb2RlJ3MgKi8KLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiQXQgbW9zdCA0NSBieXRlcyBhdCBvbmNlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpiMmFfdXUiLCAmYmluX2RhdGEsICZiaW5fbGVuKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggYmluX2xlbiA+IDQ1ICkgeworICAgICAgICAvKiBUaGUgNDUgaXMgYSBsaW1pdCB0aGF0IGFwcGVhcnMgaW4gYWxsIHV1ZW5jb2RlJ3MgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiQXQgbW9zdCA0NSBieXRlcyBhdCBvbmNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFdlJ3JlIGxhenkgYW5kIGFsbG9jYXRlIHRvIG11Y2ggKGZpeGVkIHVwIGxhdGVyKSAqLwotCWlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDIgKyAoYmluX2xlbisyKS8zKjQpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIC8qIFdlJ3JlIGxhenkgYW5kIGFsbG9jYXRlIHRvIG11Y2ggKGZpeGVkIHVwIGxhdGVyKSAqLworICAgIGlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDIgKyAoYmluX2xlbisyKS8zKjQpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JLyogU3RvcmUgdGhlIGxlbmd0aCAqLwotCSphc2NpaV9kYXRhKysgPSAnICcgKyAoYmluX2xlbiAmIDA3Nyk7CisgICAgLyogU3RvcmUgdGhlIGxlbmd0aCAqLworICAgICphc2NpaV9kYXRhKysgPSAnICcgKyAoYmluX2xlbiAmIDA3Nyk7CiAKLQlmb3IoIDsgYmluX2xlbiA+IDAgfHwgbGVmdGJpdHMgIT0gMCA7IGJpbl9sZW4tLSwgYmluX2RhdGErKyApIHsKLQkJLyogU2hpZnQgdGhlIGRhdGEgKG9yIHBhZGRpbmcpIGludG8gb3VyIGJ1ZmZlciAqLwotCQlpZiAoIGJpbl9sZW4gPiAwICkJLyogRGF0YSAqLwotCQkJbGVmdGNoYXIgPSAobGVmdGNoYXIgPDwgOCkgfCAqYmluX2RhdGE7Ci0JCWVsc2UJCQkvKiBQYWRkaW5nICovCi0JCQlsZWZ0Y2hhciA8PD0gODsKLQkJbGVmdGJpdHMgKz0gODsKKyAgICBmb3IoIDsgYmluX2xlbiA+IDAgfHwgbGVmdGJpdHMgIT0gMCA7IGJpbl9sZW4tLSwgYmluX2RhdGErKyApIHsKKyAgICAgICAgLyogU2hpZnQgdGhlIGRhdGEgKG9yIHBhZGRpbmcpIGludG8gb3VyIGJ1ZmZlciAqLworICAgICAgICBpZiAoIGJpbl9sZW4gPiAwICkgICAgICAgICAgICAgIC8qIERhdGEgKi8KKyAgICAgICAgICAgIGxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDgpIHwgKmJpbl9kYXRhOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhZGRpbmcgKi8KKyAgICAgICAgICAgIGxlZnRjaGFyIDw8PSA4OworICAgICAgICBsZWZ0Yml0cyArPSA4OwogCi0JCS8qIFNlZSBpZiB0aGVyZSBhcmUgNi1iaXQgZ3JvdXBzIHJlYWR5ICovCi0JCXdoaWxlICggbGVmdGJpdHMgPj0gNiApIHsKLQkJCXRoaXNfY2ggPSAobGVmdGNoYXIgPj4gKGxlZnRiaXRzLTYpKSAmIDB4M2Y7Ci0JCQlsZWZ0Yml0cyAtPSA2OwotCQkJKmFzY2lpX2RhdGErKyA9IHRoaXNfY2ggKyAnICc7Ci0JCX0KLQl9Ci0JKmFzY2lpX2RhdGErKyA9ICdcbic7CS8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KKyAgICAgICAgLyogU2VlIGlmIHRoZXJlIGFyZSA2LWJpdCBncm91cHMgcmVhZHkgKi8KKyAgICAgICAgd2hpbGUgKCBsZWZ0Yml0cyA+PSA2ICkgeworICAgICAgICAgICAgdGhpc19jaCA9IChsZWZ0Y2hhciA+PiAobGVmdGJpdHMtNikpICYgMHgzZjsKKyAgICAgICAgICAgIGxlZnRiaXRzIC09IDY7CisgICAgICAgICAgICAqYXNjaWlfZGF0YSsrID0gdGhpc19jaCArICcgJzsKKyAgICAgICAgfQorICAgIH0KKyAgICAqYXNjaWlfZGF0YSsrID0gJ1xuJzsgICAgICAgLyogQXBwZW5kIGEgY291cnRlc3kgbmV3bGluZSAqLwogCi0JX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIChhc2NpaV9kYXRhIC0KLQkJCSAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KSkpOwotCXJldHVybiBydjsKKyAgICBfUHlTdHJpbmdfUmVzaXplKCZydiwgKGFzY2lpX2RhdGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikpKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIAogc3RhdGljIGludAogYmluYXNjaWlfZmluZF92YWxpZCh1bnNpZ25lZCBjaGFyICpzLCBQeV9zc2l6ZV90IHNsZW4sIGludCBudW0pCiB7Ci0JLyogRmluZHMgJiByZXR1cm5zIHRoZSAobnVtKzEpdGgKLQkqKiB2YWxpZCBjaGFyYWN0ZXIgZm9yIGJhc2U2NCwgb3IgLTEgaWYgbm9uZS4KLQkqLworICAgIC8qIEZpbmRzICYgcmV0dXJucyB0aGUgKG51bSsxKXRoCisgICAgKiogdmFsaWQgY2hhcmFjdGVyIGZvciBiYXNlNjQsIG9yIC0xIGlmIG5vbmUuCisgICAgKi8KIAotCWludCByZXQgPSAtMTsKLQl1bnNpZ25lZCBjaGFyIGMsIGI2NHZhbDsKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgdW5zaWduZWQgY2hhciBjLCBiNjR2YWw7CiAKLQl3aGlsZSAoKHNsZW4gPiAwKSAmJiAocmV0ID09IC0xKSkgewotCQljID0gKnM7Ci0JCWI2NHZhbCA9IHRhYmxlX2EyYl9iYXNlNjRbYyAmIDB4N2ZdOwotCQlpZiAoICgoYyA8PSAweDdmKSAmJiAoYjY0dmFsICE9ICh1bnNpZ25lZCBjaGFyKS0xKSkgKSB7Ci0JCQlpZiAobnVtID09IDApCi0JCQkJcmV0ID0gKnM7Ci0JCQludW0tLTsKLQkJfQorICAgIHdoaWxlICgoc2xlbiA+IDApICYmIChyZXQgPT0gLTEpKSB7CisgICAgICAgIGMgPSAqczsKKyAgICAgICAgYjY0dmFsID0gdGFibGVfYTJiX2Jhc2U2NFtjICYgMHg3Zl07CisgICAgICAgIGlmICggKChjIDw9IDB4N2YpICYmIChiNjR2YWwgIT0gKHVuc2lnbmVkIGNoYXIpLTEpKSApIHsKKyAgICAgICAgICAgIGlmIChudW0gPT0gMCkKKyAgICAgICAgICAgICAgICByZXQgPSAqczsKKyAgICAgICAgICAgIG51bS0tOworICAgICAgICB9CiAKLQkJcysrOwotCQlzbGVuLS07Ci0JfQotCXJldHVybiByZXQ7CisgICAgICAgIHMrKzsKKyAgICAgICAgc2xlbi0tOworICAgIH0KKyAgICByZXR1cm4gcmV0OwogfQogCiBQeURvY19TVFJWQVIoZG9jX2EyYl9iYXNlNjQsICIoYXNjaWkpIC0+IGJpbi4gRGVjb2RlIGEgbGluZSBvZiBiYXNlNjQgZGF0YSIpOwpAQCAtMzQyLDk1ICszNDIsOTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9hMmJfYmFzZTY0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7Ci0JaW50IGxlZnRiaXRzID0gMDsKLQl1bnNpZ25lZCBjaGFyIHRoaXNfY2g7Ci0JdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JUHlfc3NpemVfdCBhc2NpaV9sZW4sIGJpbl9sZW47Ci0JaW50IHF1YWRfcG9zID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgaW50IGxlZnRiaXRzID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CisgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgUHlfc3NpemVfdCBhc2NpaV9sZW4sIGJpbl9sZW47CisgICAgaW50IHF1YWRfcG9zID0gMDsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjOmEyYl9iYXNlNjQiLCAmYXNjaWlfZGF0YSwgJmFzY2lpX2xlbikgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0IzphMmJfYmFzZTY0IiwgJmFzY2lpX2RhdGEsICZhc2NpaV9sZW4pICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQoYXNjaWlfbGVuID49IDApOworICAgIGFzc2VydChhc2NpaV9sZW4gPj0gMCk7CiAKLQlpZiAoYXNjaWlfbGVuID4gUFlfU1NJWkVfVF9NQVggLSAzKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoYXNjaWlfbGVuID4gUFlfU1NJWkVfVF9NQVggLSAzKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCWJpbl9sZW4gPSAoKGFzY2lpX2xlbiszKS80KSozOyAvKiBVcHBlciBib3VuZCwgY29ycmVjdGVkIGxhdGVyICovCisgICAgYmluX2xlbiA9ICgoYXNjaWlfbGVuKzMpLzQpKjM7IC8qIFVwcGVyIGJvdW5kLCBjb3JyZWN0ZWQgbGF0ZXIgKi8KIAotCS8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KLQlpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCWJpbl9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JYmluX2xlbiA9IDA7CisgICAgLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciAqLworICAgIGlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJpbl9sZW4pKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYmluX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBiaW5fbGVuID0gMDsKIAotCWZvciggOyBhc2NpaV9sZW4gPiAwOyBhc2NpaV9sZW4tLSwgYXNjaWlfZGF0YSsrKSB7Ci0JCXRoaXNfY2ggPSAqYXNjaWlfZGF0YTsKKyAgICBmb3IoIDsgYXNjaWlfbGVuID4gMDsgYXNjaWlfbGVuLS0sIGFzY2lpX2RhdGErKykgeworICAgICAgICB0aGlzX2NoID0gKmFzY2lpX2RhdGE7CiAKLQkJaWYgKHRoaXNfY2ggPiAweDdmIHx8Ci0JCSAgICB0aGlzX2NoID09ICdccicgfHwgdGhpc19jaCA9PSAnXG4nIHx8IHRoaXNfY2ggPT0gJyAnKQotCQkJY29udGludWU7CisgICAgICAgIGlmICh0aGlzX2NoID4gMHg3ZiB8fAorICAgICAgICAgICAgdGhpc19jaCA9PSAnXHInIHx8IHRoaXNfY2ggPT0gJ1xuJyB8fCB0aGlzX2NoID09ICcgJykKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCS8qIENoZWNrIGZvciBwYWQgc2VxdWVuY2VzIGFuZCBpZ25vcmUKLQkJKiogdGhlIGludmFsaWQgb25lcy4KLQkJKi8KLQkJaWYgKHRoaXNfY2ggPT0gQkFTRTY0X1BBRCkgewotCQkJaWYgKCAocXVhZF9wb3MgPCAyKSB8fAotCQkJICAgICAoKHF1YWRfcG9zID09IDIpICYmCi0JCQkgICAgICAoYmluYXNjaWlfZmluZF92YWxpZChhc2NpaV9kYXRhLCBhc2NpaV9sZW4sIDEpCi0JCQkgICAgICAgIT0gQkFTRTY0X1BBRCkpICkKLQkJCXsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIEEgcGFkIHNlcXVlbmNlIG1lYW5zIG5vIG1vcmUgaW5wdXQuCi0JCQkJKiogV2UndmUgYWxyZWFkeSBpbnRlcnByZXRlZCB0aGUgZGF0YQotCQkJCSoqIGZyb20gdGhlIHF1YWQgYXQgdGhpcyBwb2ludC4KLQkJCQkqLwotCQkJCWxlZnRiaXRzID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQorICAgICAgICAvKiBDaGVjayBmb3IgcGFkIHNlcXVlbmNlcyBhbmQgaWdub3JlCisgICAgICAgICoqIHRoZSBpbnZhbGlkIG9uZXMuCisgICAgICAgICovCisgICAgICAgIGlmICh0aGlzX2NoID09IEJBU0U2NF9QQUQpIHsKKyAgICAgICAgICAgIGlmICggKHF1YWRfcG9zIDwgMikgfHwKKyAgICAgICAgICAgICAgICAgKChxdWFkX3BvcyA9PSAyKSAmJgorICAgICAgICAgICAgICAgICAgKGJpbmFzY2lpX2ZpbmRfdmFsaWQoYXNjaWlfZGF0YSwgYXNjaWlfbGVuLCAxKQorICAgICAgICAgICAgICAgICAgICE9IEJBU0U2NF9QQUQpKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBBIHBhZCBzZXF1ZW5jZSBtZWFucyBubyBtb3JlIGlucHV0LgorICAgICAgICAgICAgICAgICoqIFdlJ3ZlIGFscmVhZHkgaW50ZXJwcmV0ZWQgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICAqKiBmcm9tIHRoZSBxdWFkIGF0IHRoaXMgcG9pbnQuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsZWZ0Yml0cyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQl0aGlzX2NoID0gdGFibGVfYTJiX2Jhc2U2NFsqYXNjaWlfZGF0YV07Ci0JCWlmICggdGhpc19jaCA9PSAodW5zaWduZWQgY2hhcikgLTEgKQotCQkJY29udGludWU7CisgICAgICAgIHRoaXNfY2ggPSB0YWJsZV9hMmJfYmFzZTY0Wyphc2NpaV9kYXRhXTsKKyAgICAgICAgaWYgKCB0aGlzX2NoID09ICh1bnNpZ25lZCBjaGFyKSAtMSApCisgICAgICAgICAgICBjb250aW51ZTsKIAotCQkvKgotCQkqKiBTaGlmdCBpdCBpbiBvbiB0aGUgbG93IGVuZCwgYW5kIHNlZSBpZiB0aGVyZSdzCi0JCSoqIGEgYnl0ZSByZWFkeSBmb3Igb3V0cHV0LgotCQkqLwotCQlxdWFkX3BvcyA9IChxdWFkX3BvcyArIDEpICYgMHgwMzsKLQkJbGVmdGNoYXIgPSAobGVmdGNoYXIgPDwgNikgfCAodGhpc19jaCk7Ci0JCWxlZnRiaXRzICs9IDY7CisgICAgICAgIC8qCisgICAgICAgICoqIFNoaWZ0IGl0IGluIG9uIHRoZSBsb3cgZW5kLCBhbmQgc2VlIGlmIHRoZXJlJ3MKKyAgICAgICAgKiogYSBieXRlIHJlYWR5IGZvciBvdXRwdXQuCisgICAgICAgICovCisgICAgICAgIHF1YWRfcG9zID0gKHF1YWRfcG9zICsgMSkgJiAweDAzOworICAgICAgICBsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA2KSB8ICh0aGlzX2NoKTsKKyAgICAgICAgbGVmdGJpdHMgKz0gNjsKIAotCQlpZiAoIGxlZnRiaXRzID49IDggKSB7Ci0JCQlsZWZ0Yml0cyAtPSA4OwotCQkJKmJpbl9kYXRhKysgPSAobGVmdGNoYXIgPj4gbGVmdGJpdHMpICYgMHhmZjsKLQkJCWJpbl9sZW4rKzsKLQkJCWxlZnRjaGFyICY9ICgoMSA8PCBsZWZ0Yml0cykgLSAxKTsKLQkJfQotIAl9CisgICAgICAgIGlmICggbGVmdGJpdHMgPj0gOCApIHsKKyAgICAgICAgICAgIGxlZnRiaXRzIC09IDg7CisgICAgICAgICAgICAqYmluX2RhdGErKyA9IChsZWZ0Y2hhciA+PiBsZWZ0Yml0cykgJiAweGZmOworICAgICAgICAgICAgYmluX2xlbisrOworICAgICAgICAgICAgbGVmdGNoYXIgJj0gKCgxIDw8IGxlZnRiaXRzKSAtIDEpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGxlZnRiaXRzICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSW5jb3JyZWN0IHBhZGRpbmciKTsKLQkJUHlfREVDUkVGKHJ2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChsZWZ0Yml0cyAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIkluY29ycmVjdCBwYWRkaW5nIik7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEFuZCBzZXQgc3RyaW5nIHNpemUgY29ycmVjdGx5LiBJZiB0aGUgcmVzdWx0IHN0cmluZyBpcyBlbXB0eQotCSoqIChiZWNhdXNlIHRoZSBpbnB1dCB3YXMgYWxsIGludmFsaWQpIHJldHVybiB0aGUgc2hhcmVkIGVtcHR5Ci0JKiogc3RyaW5nIGluc3RlYWQ7IF9QeVN0cmluZ19SZXNpemUoKSB3b24ndCBkbyB0aGlzIGZvciB1cy4KLQkqLwotCWlmIChiaW5fbGVuID4gMCkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIGJpbl9sZW4pOwotCWVsc2UgewotCQlQeV9ERUNSRUYocnYpOwotCQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgLyogQW5kIHNldCBzdHJpbmcgc2l6ZSBjb3JyZWN0bHkuIElmIHRoZSByZXN1bHQgc3RyaW5nIGlzIGVtcHR5CisgICAgKiogKGJlY2F1c2UgdGhlIGlucHV0IHdhcyBhbGwgaW52YWxpZCkgcmV0dXJuIHRoZSBzaGFyZWQgZW1wdHkKKyAgICAqKiBzdHJpbmcgaW5zdGVhZDsgX1B5U3RyaW5nX1Jlc2l6ZSgpIHdvbid0IGRvIHRoaXMgZm9yIHVzLgorICAgICovCisgICAgaWYgKGJpbl9sZW4gPiAwKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZydiwgYmluX2xlbik7CisgICAgZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19iMmFfYmFzZTY0LCAiKGJpbikgLT4gYXNjaWkuIEJhc2U2NC1jb2RlIGxpbmUgb2YgZGF0YSIpOwpAQCAtNDM4LDU1ICs0MzgsNTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV9iMmFfYmFzZTY0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7Ci0JaW50IGxlZnRiaXRzID0gMDsKLQl1bnNpZ25lZCBjaGFyIHRoaXNfY2g7Ci0JdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0JUHlfc3NpemVfdCBiaW5fbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKKyAgICBpbnQgbGVmdGJpdHMgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKKyAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeV9zc2l6ZV90IGJpbl9sZW47CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpiMmFfYmFzZTY0IiwgJmJpbl9kYXRhLCAmYmluX2xlbikgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpiMmFfYmFzZTY0IiwgJmJpbl9kYXRhLCAmYmluX2xlbikgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFzc2VydChiaW5fbGVuID49IDApOworICAgIGFzc2VydChiaW5fbGVuID49IDApOwogCi0JaWYgKCBiaW5fbGVuID4gQkFTRTY0X01BWEJJTiApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiVG9vIG11Y2ggZGF0YSBmb3IgYmFzZTY0IGxpbmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICggYmluX2xlbiA+IEJBU0U2NF9NQVhCSU4gKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIlRvbyBtdWNoIGRhdGEgZm9yIGJhc2U2NCBsaW5lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFdlJ3JlIGxhenkgYW5kIGFsbG9jYXRlIHRvbyBtdWNoIChmaXhlZCB1cCBsYXRlcikuCi0JICAgIiszIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzIGFuZCBhIHRyYWlsaW5nCi0JICAgbmV3bGluZS4gIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCi0JaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYmluX2xlbioyICsgMykpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQlhc2NpaV9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgLyogV2UncmUgbGF6eSBhbmQgYWxsb2NhdGUgdG9vIG11Y2ggKGZpeGVkIHVwIGxhdGVyKS4KKyAgICAgICAiKzMiIGxlYXZlcyByb29tIGZvciB1cCB0byB0d28gcGFkIGNoYXJhY3RlcnMgYW5kIGEgdHJhaWxpbmcKKyAgICAgICBuZXdsaW5lLiAgTm90ZSB0aGF0ICdiJyBnZXRzIGVuY29kZWQgYXMgJ1lnPT1cbicgKDEgaW4sIDUgb3V0KS4gKi8KKyAgICBpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKjIgKyAzKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCWZvciggOyBiaW5fbGVuID4gMCA7IGJpbl9sZW4tLSwgYmluX2RhdGErKyApIHsKLQkJLyogU2hpZnQgdGhlIGRhdGEgaW50byBvdXIgYnVmZmVyICovCi0JCWxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDgpIHwgKmJpbl9kYXRhOwotCQlsZWZ0Yml0cyArPSA4OworICAgIGZvciggOyBiaW5fbGVuID4gMCA7IGJpbl9sZW4tLSwgYmluX2RhdGErKyApIHsKKyAgICAgICAgLyogU2hpZnQgdGhlIGRhdGEgaW50byBvdXIgYnVmZmVyICovCisgICAgICAgIGxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDgpIHwgKmJpbl9kYXRhOworICAgICAgICBsZWZ0Yml0cyArPSA4OwogCi0JCS8qIFNlZSBpZiB0aGVyZSBhcmUgNi1iaXQgZ3JvdXBzIHJlYWR5ICovCi0JCXdoaWxlICggbGVmdGJpdHMgPj0gNiApIHsKLQkJCXRoaXNfY2ggPSAobGVmdGNoYXIgPj4gKGxlZnRiaXRzLTYpKSAmIDB4M2Y7Ci0JCQlsZWZ0Yml0cyAtPSA2OwotCQkJKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9iYXNlNjRbdGhpc19jaF07Ci0JCX0KLQl9Ci0JaWYgKCBsZWZ0Yml0cyA9PSAyICkgewotCQkqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2Jhc2U2NFsobGVmdGNoYXImMykgPDwgNF07Ci0JCSphc2NpaV9kYXRhKysgPSBCQVNFNjRfUEFEOwotCQkqYXNjaWlfZGF0YSsrID0gQkFTRTY0X1BBRDsKLQl9IGVsc2UgaWYgKCBsZWZ0Yml0cyA9PSA0ICkgewotCQkqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2Jhc2U2NFsobGVmdGNoYXImMHhmKSA8PCAyXTsKLQkJKmFzY2lpX2RhdGErKyA9IEJBU0U2NF9QQUQ7Ci0JfQotCSphc2NpaV9kYXRhKysgPSAnXG4nOwkvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCisgICAgICAgIC8qIFNlZSBpZiB0aGVyZSBhcmUgNi1iaXQgZ3JvdXBzIHJlYWR5ICovCisgICAgICAgIHdoaWxlICggbGVmdGJpdHMgPj0gNiApIHsKKyAgICAgICAgICAgIHRoaXNfY2ggPSAobGVmdGNoYXIgPj4gKGxlZnRiaXRzLTYpKSAmIDB4M2Y7CisgICAgICAgICAgICBsZWZ0Yml0cyAtPSA2OworICAgICAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9iYXNlNjRbdGhpc19jaF07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBsZWZ0Yml0cyA9PSAyICkgeworICAgICAgICAqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2Jhc2U2NFsobGVmdGNoYXImMykgPDwgNF07CisgICAgICAgICphc2NpaV9kYXRhKysgPSBCQVNFNjRfUEFEOworICAgICAgICAqYXNjaWlfZGF0YSsrID0gQkFTRTY0X1BBRDsKKyAgICB9IGVsc2UgaWYgKCBsZWZ0Yml0cyA9PSA0ICkgeworICAgICAgICAqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2Jhc2U2NFsobGVmdGNoYXImMHhmKSA8PCAyXTsKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9IEJBU0U2NF9QQUQ7CisgICAgfQorICAgICphc2NpaV9kYXRhKysgPSAnXG4nOyAgICAgICAvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCiAKLQlfUHlTdHJpbmdfUmVzaXplKCZydiwgKGFzY2lpX2RhdGEgLQotCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpKSk7Ci0JcmV0dXJuIHJ2OworICAgIF9QeVN0cmluZ19SZXNpemUoJnJ2LCAoYXNjaWlfZGF0YSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KSkpOworICAgIHJldHVybiBydjsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19hMmJfaHF4LCAiYXNjaWkgLT4gYmluLCBkb25lLiBEZWNvZGUgLmhxeCBjb2RpbmciKTsKQEAgLTQ5NCw3MCArNDk0LDcwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXNjaWlfYTJiX2hxeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOwotCWludCBsZWZ0Yml0cyA9IDA7Ci0JdW5zaWduZWQgY2hhciB0aGlzX2NoOwotCXVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCVB5X3NzaXplX3QgbGVuOwotCWludCBkb25lID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgaW50IGxlZnRiaXRzID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CisgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgaW50IGRvbmUgPSAwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCM6YTJiX2hxeCIsICZhc2NpaV9kYXRhLCAmbGVuKSApCi0JCXJldHVybiBOVUxMOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjOmEyYl9ocXgiLCAmYXNjaWlfZGF0YSwgJmxlbikgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFzc2VydChsZW4gPj0gMCk7CisgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIAotCWlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAtIDIpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAtIDIpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JLyogQWxsb2NhdGUgYSBzdHJpbmcgdGhhdCBpcyB0b28gYmlnIChmaXhlZCBsYXRlcikgCi0JICAgQWRkIHR3byB0byB0aGUgaW5pdGlhbCBsZW5ndGggdG8gcHJldmVudCBpbnRlcm5pbmcgd2hpY2gKLQkgICB3b3VsZCBwcmVjbHVkZSBzdWJzZXF1ZW50IHJlc2l6aW5nLiAgKi8KLQlpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4rMikpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQliaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIC8qIEFsbG9jYXRlIGEgc3RyaW5nIHRoYXQgaXMgdG9vIGJpZyAoZml4ZWQgbGF0ZXIpCisgICAgICAgQWRkIHR3byB0byB0aGUgaW5pdGlhbCBsZW5ndGggdG8gcHJldmVudCBpbnRlcm5pbmcgd2hpY2gKKyAgICAgICB3b3VsZCBwcmVjbHVkZSBzdWJzZXF1ZW50IHJlc2l6aW5nLiAgKi8KKyAgICBpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4rMikpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yKCA7IGxlbiA+IDAgOyBsZW4tLSwgYXNjaWlfZGF0YSsrICkgewotCQkvKiBHZXQgdGhlIGJ5dGUgYW5kIGxvb2sgaXQgdXAgKi8KLQkJdGhpc19jaCA9IHRhYmxlX2EyYl9ocXhbKmFzY2lpX2RhdGFdOwotCQlpZiAoIHRoaXNfY2ggPT0gU0tJUCApCi0JCQljb250aW51ZTsKLQkJaWYgKCB0aGlzX2NoID09IEZBSUwgKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJJbGxlZ2FsIGNoYXIiKTsKLQkJCVB5X0RFQ1JFRihydik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIHRoaXNfY2ggPT0gRE9ORSApIHsKLQkJCS8qIFRoZSB0ZXJtaW5hdGluZyBjb2xvbiAqLwotCQkJZG9uZSA9IDE7Ci0JCQlicmVhazsKLQkJfQorICAgIGZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGFzY2lpX2RhdGErKyApIHsKKyAgICAgICAgLyogR2V0IHRoZSBieXRlIGFuZCBsb29rIGl0IHVwICovCisgICAgICAgIHRoaXNfY2ggPSB0YWJsZV9hMmJfaHF4Wyphc2NpaV9kYXRhXTsKKyAgICAgICAgaWYgKCB0aGlzX2NoID09IFNLSVAgKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICggdGhpc19jaCA9PSBGQUlMICkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSWxsZWdhbCBjaGFyIik7CisgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCB0aGlzX2NoID09IERPTkUgKSB7CisgICAgICAgICAgICAvKiBUaGUgdGVybWluYXRpbmcgY29sb24gKi8KKyAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQkvKiBTaGlmdCBpdCBpbnRvIHRoZSBidWZmZXIgYW5kIHNlZSBpZiBhbnkgYnl0ZXMgYXJlIHJlYWR5ICovCi0JCWxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDYpIHwgKHRoaXNfY2gpOwotCQlsZWZ0Yml0cyArPSA2OwotCQlpZiAoIGxlZnRiaXRzID49IDggKSB7Ci0JCQlsZWZ0Yml0cyAtPSA4OwotCQkJKmJpbl9kYXRhKysgPSAobGVmdGNoYXIgPj4gbGVmdGJpdHMpICYgMHhmZjsKLQkJCWxlZnRjaGFyICY9ICgoMSA8PCBsZWZ0Yml0cykgLSAxKTsKLQkJfQotCX0KKyAgICAgICAgLyogU2hpZnQgaXQgaW50byB0aGUgYnVmZmVyIGFuZCBzZWUgaWYgYW55IGJ5dGVzIGFyZSByZWFkeSAqLworICAgICAgICBsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA2KSB8ICh0aGlzX2NoKTsKKyAgICAgICAgbGVmdGJpdHMgKz0gNjsKKyAgICAgICAgaWYgKCBsZWZ0Yml0cyA+PSA4ICkgeworICAgICAgICAgICAgbGVmdGJpdHMgLT0gODsKKyAgICAgICAgICAgICpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7CisgICAgICAgICAgICBsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoIGxlZnRiaXRzICYmICFkb25lICkgewotCQlQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwKLQkJCQkiU3RyaW5nIGhhcyBpbmNvbXBsZXRlIG51bWJlciBvZiBieXRlcyIpOwotCQlQeV9ERUNSRUYocnYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgKLQkJJnJ2LCAoYmluX2RhdGEgLSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KSkpOwotCWlmIChydikgewotCQlQeU9iamVjdCAqcnJ2ID0gUHlfQnVpbGRWYWx1ZSgiT2kiLCBydiwgZG9uZSk7Ci0JCVB5X0RFQ1JFRihydik7Ci0JCXJldHVybiBycnY7Ci0JfQorICAgIGlmICggbGVmdGJpdHMgJiYgIWRvbmUgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbmNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBoYXMgaW5jb21wbGV0ZSBudW1iZXIgb2YgYnl0ZXMiKTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIF9QeVN0cmluZ19SZXNpemUoCisgICAgICAgICZydiwgKGJpbl9kYXRhIC0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikpKTsKKyAgICBpZiAocnYpIHsKKyAgICAgICAgUHlPYmplY3QgKnJydiA9IFB5X0J1aWxkVmFsdWUoIk9pIiwgcnYsIGRvbmUpOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICByZXR1cm4gcnJ2OworICAgIH0KIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoZG9jX3JsZWNvZGVfaHF4LCAiQmluaGV4IFJMRS1jb2RlIGJpbmFyeSBkYXRhIik7CkBAIC01NjUsNTEgKzU2NSw1MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX3JsZWNvZGVfaHF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBjaGFyICppbl9kYXRhLCAqb3V0X2RhdGE7Ci0JUHlPYmplY3QgKnJ2OwotCXVuc2lnbmVkIGNoYXIgY2g7Ci0JUHlfc3NpemVfdCBpbiwgaW5lbmQsIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICppbl9kYXRhLCAqb3V0X2RhdGE7CisgICAgUHlPYmplY3QgKnJ2OworICAgIHVuc2lnbmVkIGNoYXIgY2g7CisgICAgUHlfc3NpemVfdCBpbiwgaW5lbmQsIGxlbjsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOnJsZWNvZGVfaHF4IiwgJmluX2RhdGEsICZsZW4pICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6cmxlY29kZV9ocXgiLCAmaW5fZGF0YSwgJmxlbikgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFzc2VydChsZW4gPj0gMCk7CisgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIAotCWlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIgLSAyKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLyAyIC0gMikKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQkvKiBXb3JzdCBjYXNlOiBvdXRwdXQgaXMgdHdpY2UgYXMgYmlnIGFzIGlucHV0IChmaXhlZCBsYXRlcikgKi8KLQlpZiAoIChydj1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qMisyKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCW91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgLyogV29yc3QgY2FzZTogb3V0cHV0IGlzIHR3aWNlIGFzIGJpZyBhcyBpbnB1dCAoZml4ZWQgbGF0ZXIpICovCisgICAgaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKjIrMikpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdXRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yKCBpbj0wOyBpbjxsZW47IGluKyspIHsKLQkJY2ggPSBpbl9kYXRhW2luXTsKLQkJaWYgKCBjaCA9PSBSVU5DSEFSICkgewotCQkJLyogUlVOQ0hBUi4gRXNjYXBlIGl0LiAqLwotCQkJKm91dF9kYXRhKysgPSBSVU5DSEFSOwotCQkJKm91dF9kYXRhKysgPSAwOwotCQl9IGVsc2UgewotCQkJLyogQ2hlY2sgaG93IG1hbnkgZm9sbG93aW5nIGFyZSB0aGUgc2FtZSAqLwotCQkJZm9yKGluZW5kPWluKzE7Ci0JCQkgICAgaW5lbmQ8bGVuICYmIGluX2RhdGFbaW5lbmRdID09IGNoICYmCi0JCQkJICAgIGluZW5kIDwgaW4rMjU1OwotCQkJICAgIGluZW5kKyspIDsKLQkJCWlmICggaW5lbmQgLSBpbiA+IDMgKSB7Ci0JCQkJLyogTW9yZSB0aGFuIDMgaW4gYSByb3cuIE91dHB1dCBSTEUuICovCi0JCQkJKm91dF9kYXRhKysgPSBjaDsKLQkJCQkqb3V0X2RhdGErKyA9IFJVTkNIQVI7Ci0JCQkJKm91dF9kYXRhKysgPSBpbmVuZC1pbjsKLQkJCQlpbiA9IGluZW5kLTE7Ci0JCQl9IGVsc2UgewotCQkJCS8qIExlc3MgdGhhbiAzLiBPdXRwdXQgdGhlIGJ5dGUgaXRzZWxmICovCi0JCQkJKm91dF9kYXRhKysgPSBjaDsKLQkJCX0KLQkJfQotCX0KLQlfUHlTdHJpbmdfUmVzaXplKCZydiwgKG91dF9kYXRhIC0KLQkJCSAgICAgICAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KSkpOwotCXJldHVybiBydjsKKyAgICBmb3IoIGluPTA7IGluPGxlbjsgaW4rKykgeworICAgICAgICBjaCA9IGluX2RhdGFbaW5dOworICAgICAgICBpZiAoIGNoID09IFJVTkNIQVIgKSB7CisgICAgICAgICAgICAvKiBSVU5DSEFSLiBFc2NhcGUgaXQuICovCisgICAgICAgICAgICAqb3V0X2RhdGErKyA9IFJVTkNIQVI7CisgICAgICAgICAgICAqb3V0X2RhdGErKyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDaGVjayBob3cgbWFueSBmb2xsb3dpbmcgYXJlIHRoZSBzYW1lICovCisgICAgICAgICAgICBmb3IoaW5lbmQ9aW4rMTsKKyAgICAgICAgICAgICAgICBpbmVuZDxsZW4gJiYgaW5fZGF0YVtpbmVuZF0gPT0gY2ggJiYKKyAgICAgICAgICAgICAgICAgICAgaW5lbmQgPCBpbisyNTU7CisgICAgICAgICAgICAgICAgaW5lbmQrKykgOworICAgICAgICAgICAgaWYgKCBpbmVuZCAtIGluID4gMyApIHsKKyAgICAgICAgICAgICAgICAvKiBNb3JlIHRoYW4gMyBpbiBhIHJvdy4gT3V0cHV0IFJMRS4gKi8KKyAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGNoOworICAgICAgICAgICAgICAgICpvdXRfZGF0YSsrID0gUlVOQ0hBUjsKKyAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGluZW5kLWluOworICAgICAgICAgICAgICAgIGluID0gaW5lbmQtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogTGVzcyB0aGFuIDMuIE91dHB1dCB0aGUgYnl0ZSBpdHNlbGYgKi8KKyAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGNoOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9QeVN0cmluZ19SZXNpemUoJnJ2LCAob3V0X2RhdGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikpKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfYjJhX2hxeCwgIkVuY29kZSAuaHF4IGRhdGEiKTsKQEAgLTYxNyw0NCArNjE3LDQ0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXNjaWlfYjJhX2hxeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOwotCWludCBsZWZ0Yml0cyA9IDA7Ci0JdW5zaWduZWQgY2hhciB0aGlzX2NoOwotCXVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCVB5X3NzaXplX3QgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKKyAgICBpbnQgbGVmdGJpdHMgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKKyAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmIyYV9ocXgiLCAmYmluX2RhdGEsICZsZW4pICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6YjJhX2hxeCIsICZiaW5fZGF0YSwgJmxlbikgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFzc2VydChsZW4gPj0gMCk7CisgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIAotCWlmIChsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIgLSAyKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLyAyIC0gMikKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0aGF0IGlzIGF0IGxlYXN0IGxhcmdlIGVub3VnaCAqLwotCWlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHRoYXQgaXMgYXQgbGVhc3QgbGFyZ2UgZW5vdWdoICovCisgICAgaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKjIrMikpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc2NpaV9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLQlmb3IoIDsgbGVuID4gMCA7IGxlbi0tLCBiaW5fZGF0YSsrICkgewotCQkvKiBTaGlmdCBpbnRvIG91ciBidWZmZXIsIGFuZCBvdXRwdXQgYW55IDZiaXRzIHJlYWR5ICovCi0JCWxlZnRjaGFyID0gKGxlZnRjaGFyIDw8IDgpIHwgKmJpbl9kYXRhOwotCQlsZWZ0Yml0cyArPSA4OwotCQl3aGlsZSAoIGxlZnRiaXRzID49IDYgKSB7Ci0JCQl0aGlzX2NoID0gKGxlZnRjaGFyID4+IChsZWZ0Yml0cy02KSkgJiAweDNmOwotCQkJbGVmdGJpdHMgLT0gNjsKLQkJCSphc2NpaV9kYXRhKysgPSB0YWJsZV9iMmFfaHF4W3RoaXNfY2hdOwotCQl9Ci0JfQotCS8qIE91dHB1dCBhIHBvc3NpYmxlIHJ1bnQgYnl0ZSAqLwotCWlmICggbGVmdGJpdHMgKSB7Ci0JCWxlZnRjaGFyIDw8PSAoNi1sZWZ0Yml0cyk7Ci0JCSphc2NpaV9kYXRhKysgPSB0YWJsZV9iMmFfaHF4W2xlZnRjaGFyICYgMHgzZl07Ci0JfQotCV9QeVN0cmluZ19SZXNpemUoJnJ2LCAoYXNjaWlfZGF0YSAtCi0JCQkgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikpKTsKLQlyZXR1cm4gcnY7CisgICAgZm9yKCA7IGxlbiA+IDAgOyBsZW4tLSwgYmluX2RhdGErKyApIHsKKyAgICAgICAgLyogU2hpZnQgaW50byBvdXIgYnVmZmVyLCBhbmQgb3V0cHV0IGFueSA2Yml0cyByZWFkeSAqLworICAgICAgICBsZWZ0Y2hhciA9IChsZWZ0Y2hhciA8PCA4KSB8ICpiaW5fZGF0YTsKKyAgICAgICAgbGVmdGJpdHMgKz0gODsKKyAgICAgICAgd2hpbGUgKCBsZWZ0Yml0cyA+PSA2ICkgeworICAgICAgICAgICAgdGhpc19jaCA9IChsZWZ0Y2hhciA+PiAobGVmdGJpdHMtNikpICYgMHgzZjsKKyAgICAgICAgICAgIGxlZnRiaXRzIC09IDY7CisgICAgICAgICAgICAqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2hxeFt0aGlzX2NoXTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBPdXRwdXQgYSBwb3NzaWJsZSBydW50IGJ5dGUgKi8KKyAgICBpZiAoIGxlZnRiaXRzICkgeworICAgICAgICBsZWZ0Y2hhciA8PD0gKDYtbGVmdGJpdHMpOworICAgICAgICAqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2hxeFtsZWZ0Y2hhciAmIDB4M2ZdOworICAgIH0KKyAgICBfUHlTdHJpbmdfUmVzaXplKCZydiwgKGFzY2lpX2RhdGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikpKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfcmxlZGVjb2RlX2hxeCwgIkRlY29kZSBoZXhiaW4gUkxFLWNvZGVkIHN0cmluZyIpOwpAQCAtNjYyLDEwMCArNjYyLDEwMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX3JsZWRlY29kZV9ocXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgKmluX2RhdGEsICpvdXRfZGF0YTsKLQl1bnNpZ25lZCBjaGFyIGluX2J5dGUsIGluX3JlcGVhdDsKLQlQeU9iamVjdCAqcnY7Ci0JUHlfc3NpemVfdCBpbl9sZW4sIG91dF9sZW4sIG91dF9sZW5fbGVmdDsKKyAgICB1bnNpZ25lZCBjaGFyICppbl9kYXRhLCAqb3V0X2RhdGE7CisgICAgdW5zaWduZWQgY2hhciBpbl9ieXRlLCBpbl9yZXBlYXQ7CisgICAgUHlPYmplY3QgKnJ2OworICAgIFB5X3NzaXplX3QgaW5fbGVuLCBvdXRfbGVuLCBvdXRfbGVuX2xlZnQ7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpybGVkZWNvZGVfaHF4IiwgJmluX2RhdGEsICZpbl9sZW4pICkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6cmxlZGVjb2RlX2hxeCIsICZpbl9kYXRhLCAmaW5fbGVuKSApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JYXNzZXJ0KGluX2xlbiA+PSAwKTsKKyAgICBhc3NlcnQoaW5fbGVuID49IDApOwogCi0JLyogRW1wdHkgc3RyaW5nIGlzIGEgc3BlY2lhbCBjYXNlICovCi0JaWYgKCBpbl9sZW4gPT0gMCApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAvKiBFbXB0eSBzdHJpbmcgaXMgYSBzcGVjaWFsIGNhc2UgKi8KKyAgICBpZiAoIGluX2xlbiA9PSAwICkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwogICAgIGVsc2UgaWYgKGluX2xlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBvZiByZWFzb25hYmxlIHNpemUuIFJlc2l6ZWQgd2hlbiBuZWVkZWQgKi8KLQlvdXRfbGVuID0gaW5fbGVuKjI7Ci0JaWYgKCAocnY9UHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgb3V0X2xlbikpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQlvdXRfbGVuX2xlZnQgPSBvdXRfbGVuOwotCW91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgb2YgcmVhc29uYWJsZSBzaXplLiBSZXNpemVkIHdoZW4gbmVlZGVkICovCisgICAgb3V0X2xlbiA9IGluX2xlbioyOworICAgIGlmICggKHJ2PVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG91dF9sZW4pKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbjsKKyAgICBvdXRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JLyoKLQkqKiBXZSBuZWVkIHR3byBtYWNyb3MgaGVyZSB0byBnZXQvcHV0IGJ5dGVzIGFuZCBoYW5kbGUKLQkqKiBlbmQtb2YtYnVmZmVyIGZvciBpbnB1dCBhbmQgb3V0cHV0IHN0cmluZ3MuCi0JKi8KKyAgICAvKgorICAgICoqIFdlIG5lZWQgdHdvIG1hY3JvcyBoZXJlIHRvIGdldC9wdXQgYnl0ZXMgYW5kIGhhbmRsZQorICAgICoqIGVuZC1vZi1idWZmZXIgZm9yIGlucHV0IGFuZCBvdXRwdXQgc3RyaW5ncy4KKyAgICAqLwogI2RlZmluZSBJTkJZVEUoYikgXAotCWRvIHsgXAotCSAgICAgICAgIGlmICggLS1pbl9sZW4gPCAwICkgeyBcCi0JCQkgICBQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwgIiIpOyBcCi0JCQkgICBQeV9ERUNSRUYocnYpOyBcCi0JCQkgICByZXR1cm4gTlVMTDsgXAotCQkgfSBcCi0JCSBiID0gKmluX2RhdGErKzsgXAotCX0gd2hpbGUoMCkKKyAgICBkbyB7IFwKKyAgICAgICAgICAgICBpZiAoIC0taW5fbGVuIDwgMCApIHsgXAorICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwgIiIpOyBcCisgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICBiID0gKmluX2RhdGErKzsgXAorICAgIH0gd2hpbGUoMCkKIAogI2RlZmluZSBPVVRCWVRFKGIpIFwKLQlkbyB7IFwKLQkJIGlmICggLS1vdXRfbGVuX2xlZnQgPCAwICkgeyBcCi0JCQkgIGlmICggb3V0X2xlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7IFwKLQkJCSAgX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIDIqb3V0X2xlbik7IFwKLQkJCSAgaWYgKCBydiA9PSBOVUxMICkgcmV0dXJuIE5VTEw7IFwKLQkJCSAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KSBcCi0JCQkJCQkJCSArIG91dF9sZW47IFwKLQkJCSAgb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbi0xOyBcCi0JCQkgIG91dF9sZW4gPSBvdXRfbGVuICogMjsgXAotCQkgfSBcCi0JCSAqb3V0X2RhdGErKyA9IGI7IFwKLQl9IHdoaWxlKDApCisgICAgZG8geyBcCisgICAgICAgICAgICAgaWYgKCAtLW91dF9sZW5fbGVmdCA8IDAgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIG91dF9sZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOyBcCisgICAgICAgICAgICAgICAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIDIqb3V0X2xlbik7IFwKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJ2ID09IE5VTEwgKSByZXR1cm4gTlVMTDsgXAorICAgICAgICAgICAgICAgICAgICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0X2xlbjsgXAorICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW5fbGVmdCA9IG91dF9sZW4tMTsgXAorICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4gPSBvdXRfbGVuICogMjsgXAorICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICpvdXRfZGF0YSsrID0gYjsgXAorICAgIH0gd2hpbGUoMCkKIAotCQkvKgotCQkqKiBIYW5kbGUgZmlyc3QgYnl0ZSBzZXBhcmF0ZWx5IChzaW5jZSB3ZSBoYXZlIHRvIGdldCBhbmdyeQotCQkqKiBpbiBjYXNlIG9mIGFuIG9ycGhhbmVkIFJMRSBjb2RlKS4KLQkJKi8KLQkJSU5CWVRFKGluX2J5dGUpOworICAgICAgICAvKgorICAgICAgICAqKiBIYW5kbGUgZmlyc3QgYnl0ZSBzZXBhcmF0ZWx5IChzaW5jZSB3ZSBoYXZlIHRvIGdldCBhbmdyeQorICAgICAgICAqKiBpbiBjYXNlIG9mIGFuIG9ycGhhbmVkIFJMRSBjb2RlKS4KKyAgICAgICAgKi8KKyAgICAgICAgSU5CWVRFKGluX2J5dGUpOwogCi0JaWYgKGluX2J5dGUgPT0gUlVOQ0hBUikgewotCQlJTkJZVEUoaW5fcmVwZWF0KTsKLQkJaWYgKGluX3JlcGVhdCAhPSAwKSB7Ci0JCQkvKiBOb3RlIEVycm9yLCBub3QgSW5jb21wbGV0ZSAod2hpY2ggaXMgYXQgdGhlIGVuZAotCQkJKiogb2YgdGhlIHN0cmluZyBvbmx5KS4gVGhpcyBpcyBhIHByb2dyYW1tZXIgZXJyb3IuCi0JCQkqLwotCQkJUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiT3JwaGFuZWQgUkxFIGNvZGUgYXQgc3RhcnQiKTsKLQkJCVB5X0RFQ1JFRihydik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlPVVRCWVRFKFJVTkNIQVIpOwotCX0gZWxzZSB7Ci0JCU9VVEJZVEUoaW5fYnl0ZSk7Ci0JfQorICAgIGlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKKyAgICAgICAgSU5CWVRFKGluX3JlcGVhdCk7CisgICAgICAgIGlmIChpbl9yZXBlYXQgIT0gMCkgeworICAgICAgICAgICAgLyogTm90ZSBFcnJvciwgbm90IEluY29tcGxldGUgKHdoaWNoIGlzIGF0IHRoZSBlbmQKKyAgICAgICAgICAgICoqIG9mIHRoZSBzdHJpbmcgb25seSkuIFRoaXMgaXMgYSBwcm9ncmFtbWVyIGVycm9yLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIk9ycGhhbmVkIFJMRSBjb2RlIGF0IHN0YXJ0Iik7CisgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgT1VUQllURShSVU5DSEFSKTsKKyAgICB9IGVsc2UgeworICAgICAgICBPVVRCWVRFKGluX2J5dGUpOworICAgIH0KIAotCXdoaWxlKCBpbl9sZW4gPiAwICkgewotCQlJTkJZVEUoaW5fYnl0ZSk7CisgICAgd2hpbGUoIGluX2xlbiA+IDAgKSB7CisgICAgICAgIElOQllURShpbl9ieXRlKTsKIAotCQlpZiAoaW5fYnl0ZSA9PSBSVU5DSEFSKSB7Ci0JCQlJTkJZVEUoaW5fcmVwZWF0KTsKLQkJCWlmICggaW5fcmVwZWF0ID09IDAgKSB7Ci0JCQkJLyogSnVzdCBhbiBlc2NhcGVkIFJVTkNIQVIgdmFsdWUgKi8KLQkJCQlPVVRCWVRFKFJVTkNIQVIpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBQaWNrIHVwIHZhbHVlIGFuZCBvdXRwdXQgYSBzZXF1ZW5jZSBvZiBpdCAqLwotCQkJCWluX2J5dGUgPSBvdXRfZGF0YVstMV07Ci0JCQkJd2hpbGUgKCAtLWluX3JlcGVhdCA+IDAgKQotCQkJCQlPVVRCWVRFKGluX2J5dGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogTm9ybWFsIGJ5dGUgKi8KLQkJCU9VVEJZVEUoaW5fYnl0ZSk7Ci0JCX0KLQl9Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmcnYsIChvdXRfZGF0YSAtCi0JCQkgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydikpKTsKLQlyZXR1cm4gcnY7CisgICAgICAgIGlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKKyAgICAgICAgICAgIElOQllURShpbl9yZXBlYXQpOworICAgICAgICAgICAgaWYgKCBpbl9yZXBlYXQgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAvKiBKdXN0IGFuIGVzY2FwZWQgUlVOQ0hBUiB2YWx1ZSAqLworICAgICAgICAgICAgICAgIE9VVEJZVEUoUlVOQ0hBUik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFBpY2sgdXAgdmFsdWUgYW5kIG91dHB1dCBhIHNlcXVlbmNlIG9mIGl0ICovCisgICAgICAgICAgICAgICAgaW5fYnl0ZSA9IG91dF9kYXRhWy0xXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIC0taW5fcmVwZWF0ID4gMCApCisgICAgICAgICAgICAgICAgICAgIE9VVEJZVEUoaW5fYnl0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBOb3JtYWwgYnl0ZSAqLworICAgICAgICAgICAgT1VUQllURShpbl9ieXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBfUHlTdHJpbmdfUmVzaXplKCZydiwgKG91dF9kYXRhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpKSk7CisgICAgcmV0dXJuIHJ2OwogfQogCiBQeURvY19TVFJWQVIoZG9jX2NyY19ocXgsCkBAIC03NjQsMTggKzc2NCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX2NyY19ocXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwotCXVuc2lnbmVkIGludCBjcmM7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgaW50IGNyYzsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpjcmNfaHF4IiwgJmJpbl9kYXRhLCAmbGVuLCAmY3JjKSApCi0JCXJldHVybiBOVUxMOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaTpjcmNfaHF4IiwgJmJpbl9kYXRhLCAmbGVuLCAmY3JjKSApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jd2hpbGUobGVuLS0gPiAwKSB7Ci0JCWNyYz0oKGNyYzw8OCkmMHhmZjAwKV5jcmN0YWJfaHF4WygoY3JjPj44KSYweGZmKV4qYmluX2RhdGErK107Ci0JfQorICAgIHdoaWxlKGxlbi0tID4gMCkgeworICAgICAgICBjcmM9KChjcmM8PDgpJjB4ZmYwMCleY3JjdGFiX2hxeFsoKGNyYz4+OCkmMHhmZileKmJpbl9kYXRhKytdOworICAgIH0KIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgY3JjKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGNyYyk7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfY3JjMzIsCkBAIC03OTIsNyArNzkyLDcgQEAKICAgICBpbnQgc2lnbmVkX3ZhbDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8STpjcmMzMiIsICZidWYsICZsZW4sICZjcmMzMnZhbCkpCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgLyogSW4gUHl0aG9uIDIueCB3ZSByZXR1cm4gYSBzaWduZWQgaW50ZWdlciByZWdhcmRsZXNzIG9mIG5hdGl2ZSBwbGF0Zm9ybQogICAgICAqIGxvbmcgc2l6ZSAodGhlIDMyYml0IHVuc2lnbmVkIGxvbmcgaXMgdHJlYXRlZCBhcyAzMi1iaXQgc2lnbmVkIGFuZCBzaWduCiAgICAgICogZXh0ZW5kZWQgaW50byBhIDY0LWJpdCBsb25nIGluc2lkZSB0aGUgaW50ZWdlciBvYmplY3QpLiAgMy4wIGRvZXMgdGhlCkBAIC05MjIsMjEgKzkyMiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFzY2lpX2NyYzMyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsgLyogQnkgSmltIEFobHN0cm9tOyBBbGwgcmlnaHRzIHRyYW5zZmVycmVkIHRvIENOUkkgKi8KLQl1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKLQl1bnNpZ25lZCBpbnQgY3JjID0gMFU7CS8qIGluaXRpYWwgdmFsdWUgb2YgQ1JDICovCi0JUHlfc3NpemVfdCBsZW47Ci0JaW50IHJlc3VsdDsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBpbnQgY3JjID0gMFU7ICAgICAgLyogaW5pdGlhbCB2YWx1ZSBvZiBDUkMgKi8KKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpbnQgcmVzdWx0OwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8STpjcmMzMiIsICZiaW5fZGF0YSwgJmxlbiwgJmNyYykgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xJOmNyYzMyIiwgJmJpbl9kYXRhLCAmbGVuLCAmY3JjKSApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY3JjID0gfiBjcmM7Ci0Jd2hpbGUgKGxlbi0tID4gMCkKLQkJY3JjID0gY3JjXzMyX3RhYlsoY3JjIF4gKmJpbl9kYXRhKyspICYgMHhmZlVdIF4gKGNyYyA+PiA4KTsKLQkJLyogTm90ZTogIChjcmMgPj4gOCkgTVVTVCB6ZXJvIGZpbGwgb24gbGVmdCAqLworICAgIGNyYyA9IH4gY3JjOworICAgIHdoaWxlIChsZW4tLSA+IDApCisgICAgICAgIGNyYyA9IGNyY18zMl90YWJbKGNyYyBeICpiaW5fZGF0YSsrKSAmIDB4ZmZVXSBeIChjcmMgPj4gOCk7CisgICAgICAgIC8qIE5vdGU6ICAoY3JjID4+IDgpIE1VU1QgemVybyBmaWxsIG9uIGxlZnQgKi8KIAotCXJlc3VsdCA9IChpbnQpKGNyYyBeIDB4RkZGRkZGRkZVKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzdWx0KTsKKyAgICByZXN1bHQgPSAoaW50KShjcmMgXiAweEZGRkZGRkZGVSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlc3VsdCk7CiB9CiAjZW5kaWYgIC8qIFVTRV9aTElCX0NSQzMyICovCiAKQEAgLTk0NCw0MSArOTQ0LDQxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYmluYXNjaWlfaGV4bGlmeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciogYXJnYnVmOwotCVB5X3NzaXplX3QgYXJnbGVuOwotCVB5T2JqZWN0ICpyZXR2YWw7Ci0JY2hhciogcmV0YnVmOwotCVB5X3NzaXplX3QgaSwgajsKKyAgICBjaGFyKiBhcmdidWY7CisgICAgUHlfc3NpemVfdCBhcmdsZW47CisgICAgUHlPYmplY3QgKnJldHZhbDsKKyAgICBjaGFyKiByZXRidWY7CisgICAgUHlfc3NpemVfdCBpLCBqOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpiMmFfaGV4IiwgJmFyZ2J1ZiwgJmFyZ2xlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6YjJhX2hleCIsICZhcmdidWYsICZhcmdsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFzc2VydChhcmdsZW4gPj0gMCk7Ci0JaWYgKGFyZ2xlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgYXNzZXJ0KGFyZ2xlbiA+PSAwKTsKKyAgICBpZiAoYXJnbGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCXJldHZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGFyZ2xlbioyKTsKLQlpZiAoIXJldHZhbCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0YnVmID0gUHlTdHJpbmdfQXNTdHJpbmcocmV0dmFsKTsKLQlpZiAoIXJldGJ1ZikKLQkJZ290byBmaW5hbGx5OworICAgIHJldHZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGFyZ2xlbioyKTsKKyAgICBpZiAoIXJldHZhbCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0YnVmID0gUHlTdHJpbmdfQXNTdHJpbmcocmV0dmFsKTsKKyAgICBpZiAoIXJldGJ1ZikKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JLyogbWFrZSBoZXggdmVyc2lvbiBvZiBzdHJpbmcsIHRha2VuIGZyb20gc2hhbW9kdWxlLmMgKi8KLQlmb3IgKGk9aj0wOyBpIDwgYXJnbGVuOyBpKyspIHsKLQkJY2hhciBjOwotCQljID0gKGFyZ2J1ZltpXSA+PiA0KSAmIDB4ZjsKLQkJYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwotCQlyZXRidWZbaisrXSA9IGM7Ci0JCWMgPSBhcmdidWZbaV0gJiAweGY7Ci0JCWMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKLQkJcmV0YnVmW2orK10gPSBjOwotCX0KLQlyZXR1cm4gcmV0dmFsOworICAgIC8qIG1ha2UgaGV4IHZlcnNpb24gb2Ygc3RyaW5nLCB0YWtlbiBmcm9tIHNoYW1vZHVsZS5jICovCisgICAgZm9yIChpPWo9MDsgaSA8IGFyZ2xlbjsgaSsrKSB7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgYyA9IChhcmdidWZbaV0gPj4gNCkgJiAweGY7CisgICAgICAgIGMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKKyAgICAgICAgcmV0YnVmW2orK10gPSBjOworICAgICAgICBjID0gYXJnYnVmW2ldICYgMHhmOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CisgICAgICAgIHJldGJ1ZltqKytdID0gYzsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKIAogICBmaW5hbGx5OgotCVB5X0RFQ1JFRihyZXR2YWwpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2hleGxpZnksCkBAIC05OTAsNjMgKzk5MCw2MyBAQAogc3RhdGljIGludAogdG9faW50KGludCBjKQogewotCWlmIChpc2RpZ2l0KGMpKQotCQlyZXR1cm4gYyAtICcwJzsKLQllbHNlIHsKLQkJaWYgKGlzdXBwZXIoYykpCi0JCQljID0gdG9sb3dlcihjKTsKLQkJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotCQkJcmV0dXJuIGMgLSAnYScgKyAxMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIGlmIChpc2RpZ2l0KGMpKQorICAgICAgICByZXR1cm4gYyAtICcwJzsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGlzdXBwZXIoYykpCisgICAgICAgICAgICBjID0gdG9sb3dlcihjKTsKKyAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQorICAgICAgICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hc2NpaV91bmhleGxpZnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIqIGFyZ2J1ZjsKLQlQeV9zc2l6ZV90IGFyZ2xlbjsKLQlQeU9iamVjdCAqcmV0dmFsOwotCWNoYXIqIHJldGJ1ZjsKLQlQeV9zc2l6ZV90IGksIGo7CisgICAgY2hhciogYXJnYnVmOworICAgIFB5X3NzaXplX3QgYXJnbGVuOworICAgIFB5T2JqZWN0ICpyZXR2YWw7CisgICAgY2hhciogcmV0YnVmOworICAgIFB5X3NzaXplX3QgaSwgajsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6YTJiX2hleCIsICZhcmdidWYsICZhcmdsZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmEyYl9oZXgiLCAmYXJnYnVmLCAmYXJnbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQoYXJnbGVuID49IDApOworICAgIGFzc2VydChhcmdsZW4gPj0gMCk7CiAKLQkvKiBYWFggV2hhdCBzaG91bGQgd2UgZG8gYWJvdXQgc3RyaW5ncyB3aXRoIGFuIG9kZCBsZW5ndGg/ICBTaG91bGQKLQkgKiB3ZSBhZGQgYW4gaW1wbGljaXQgbGVhZGluZyB6ZXJvLCBvciBhIHRyYWlsaW5nIHplcm8/ICBGb3Igbm93LAotCSAqIHJhaXNlIGFuIGV4Y2VwdGlvbi4KLQkgKi8KLQlpZiAoYXJnbGVuICUgMikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT2RkLWxlbmd0aCBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFhYWCBXaGF0IHNob3VsZCB3ZSBkbyBhYm91dCBzdHJpbmdzIHdpdGggYW4gb2RkIGxlbmd0aD8gIFNob3VsZAorICAgICAqIHdlIGFkZCBhbiBpbXBsaWNpdCBsZWFkaW5nIHplcm8sIG9yIGEgdHJhaWxpbmcgemVybz8gIEZvciBub3csCisgICAgICogcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIGlmIChhcmdsZW4gJSAyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPZGQtbGVuZ3RoIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoYXJnbGVuLzIpKTsKLQlpZiAoIXJldHZhbCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0YnVmID0gUHlTdHJpbmdfQXNTdHJpbmcocmV0dmFsKTsKLQlpZiAoIXJldGJ1ZikKLQkJZ290byBmaW5hbGx5OworICAgIHJldHZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChhcmdsZW4vMikpOworICAgIGlmICghcmV0dmFsKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXRidWYgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXR2YWwpOworICAgIGlmICghcmV0YnVmKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlmb3IgKGk9aj0wOyBpIDwgYXJnbGVuOyBpICs9IDIpIHsKLQkJaW50IHRvcCA9IHRvX2ludChQeV9DSEFSTUFTSyhhcmdidWZbaV0pKTsKLQkJaW50IGJvdCA9IHRvX2ludChQeV9DSEFSTUFTSyhhcmdidWZbaSsxXSkpOwotCQlpZiAodG9wID09IC0xIHx8IGJvdCA9PSAtMSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIk5vbi1oZXhhZGVjaW1hbCBkaWdpdCBmb3VuZCIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCXJldGJ1ZltqKytdID0gKHRvcCA8PCA0KSArIGJvdDsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBmb3IgKGk9aj0wOyBpIDwgYXJnbGVuOyBpICs9IDIpIHsKKyAgICAgICAgaW50IHRvcCA9IHRvX2ludChQeV9DSEFSTUFTSyhhcmdidWZbaV0pKTsKKyAgICAgICAgaW50IGJvdCA9IHRvX2ludChQeV9DSEFSTUFTSyhhcmdidWZbaSsxXSkpOworICAgICAgICBpZiAodG9wID09IC0xIHx8IGJvdCA9PSAtMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLWhleGFkZWNpbWFsIGRpZ2l0IGZvdW5kIik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgcmV0YnVmW2orK10gPSAodG9wIDw8IDQpICsgYm90OworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOwogCiAgIGZpbmFsbHk6Ci0JUHlfREVDUkVGKHJldHZhbCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfdW5oZXhsaWZ5LApAQCAtMTA3NSw5MCArMTA3NSw5MCBAQAogc3RhdGljIFB5T2JqZWN0KgogYmluYXNjaWlfYTJiX3FwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlQeV9zc2l6ZV90IGluLCBvdXQ7Ci0JY2hhciBjaDsKLQl1bnNpZ25lZCBjaGFyICpkYXRhLCAqb2RhdGE7Ci0JUHlfc3NpemVfdCBkYXRhbGVuID0gMDsKLQlQeU9iamVjdCAqcnY7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhIiwgImhlYWRlciIsIE5VTEx9OwotCWludCBoZWFkZXIgPSAwOworICAgIFB5X3NzaXplX3QgaW4sIG91dDsKKyAgICBjaGFyIGNoOworICAgIHVuc2lnbmVkIGNoYXIgKmRhdGEsICpvZGF0YTsKKyAgICBQeV9zc2l6ZV90IGRhdGFsZW4gPSAwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGEiLCAiaGVhZGVyIiwgTlVMTH07CisgICAgaW50IGhlYWRlciA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzI3xpIiwga3dsaXN0LCAmZGF0YSwKLQkgICAgICAmZGF0YWxlbiwgJmhlYWRlcikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMjfGkiLCBrd2xpc3QsICZkYXRhLAorICAgICAgICAgICZkYXRhbGVuLCAmaGVhZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBXZSBhbGxvY2F0ZSB0aGUgb3V0cHV0IHNhbWUgc2l6ZSBhcyBpbnB1dCwgdGhpcyBpcyBvdmVya2lsbC4KLQkgKiBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gdXNlZCBjYWxsb2MoKSBzbyB3ZSdsbCB6ZXJvIG91dCB0aGUKLQkgKiBtZW1vcnkgaGVyZSB0b28sIHNpbmNlIFB5TWVtX01hbGxvYygpIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0LgotCSAqLwotCW9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgUHlNZW1fTWFsbG9jKGRhdGFsZW4pOwotCWlmIChvZGF0YSA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltZW1zZXQob2RhdGEsIDAsIGRhdGFsZW4pOworICAgIC8qIFdlIGFsbG9jYXRlIHRoZSBvdXRwdXQgc2FtZSBzaXplIGFzIGlucHV0LCB0aGlzIGlzIG92ZXJraWxsLgorICAgICAqIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiB1c2VkIGNhbGxvYygpIHNvIHdlJ2xsIHplcm8gb3V0IHRoZQorICAgICAqIG1lbW9yeSBoZXJlIHRvbywgc2luY2UgUHlNZW1fTWFsbG9jKCkgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQuCisgICAgICovCisgICAgb2RhdGEgPSAodW5zaWduZWQgY2hhciAqKSBQeU1lbV9NYWxsb2MoZGF0YWxlbik7CisgICAgaWYgKG9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChvZGF0YSwgMCwgZGF0YWxlbik7CiAKLQlpbiA9IG91dCA9IDA7Ci0Jd2hpbGUgKGluIDwgZGF0YWxlbikgewotCQlpZiAoZGF0YVtpbl0gPT0gJz0nKSB7Ci0JCQlpbisrOwotCQkJaWYgKGluID49IGRhdGFsZW4pIGJyZWFrOwotCQkJLyogU29mdCBsaW5lIGJyZWFrcyAqLwotCQkJaWYgKChkYXRhW2luXSA9PSAnXG4nKSB8fCAoZGF0YVtpbl0gPT0gJ1xyJykpIHsKLQkJCQlpZiAoZGF0YVtpbl0gIT0gJ1xuJykgewotCQkJCQl3aGlsZSAoaW4gPCBkYXRhbGVuICYmIGRhdGFbaW5dICE9ICdcbicpIGluKys7Ci0JCQkJfQotCQkJCWlmIChpbiA8IGRhdGFsZW4pIGluKys7Ci0JCQl9Ci0JCQllbHNlIGlmIChkYXRhW2luXSA9PSAnPScpIHsKLQkJCQkvKiBicm9rZW4gY2FzZSBmcm9tIGJyb2tlbiBweXRob24gcXAgKi8KLQkJCQlvZGF0YVtvdXQrK10gPSAnPSc7Ci0JCQkJaW4rKzsKLQkJCX0KLQkJCWVsc2UgaWYgKCgoZGF0YVtpbl0gPj0gJ0EnICYmIGRhdGFbaW5dIDw9ICdGJykgfHwKLQkJCSAgICAgICAgICAoZGF0YVtpbl0gPj0gJ2EnICYmIGRhdGFbaW5dIDw9ICdmJykgfHwKLQkJCQkgIChkYXRhW2luXSA+PSAnMCcgJiYgZGF0YVtpbl0gPD0gJzknKSkgJiYKLQkJCSAgICAgICAgICgoZGF0YVtpbisxXSA+PSAnQScgJiYgZGF0YVtpbisxXSA8PSAnRicpIHx8Ci0JCQkJICAoZGF0YVtpbisxXSA+PSAnYScgJiYgZGF0YVtpbisxXSA8PSAnZicpIHx8Ci0JCQkJICAoZGF0YVtpbisxXSA+PSAnMCcgJiYgZGF0YVtpbisxXSA8PSAnOScpKSkgewotCQkJCS8qIGhleHZhbCAqLwotCQkJCWNoID0gaGV4dmFsKGRhdGFbaW5dKSA8PCA0OwotCQkJCWluKys7Ci0JCQkJY2ggfD0gaGV4dmFsKGRhdGFbaW5dKTsKLQkJCQlpbisrOwotCQkJCW9kYXRhW291dCsrXSA9IGNoOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkgIG9kYXRhW291dCsrXSA9ICc9JzsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChoZWFkZXIgJiYgZGF0YVtpbl0gPT0gJ18nKSB7Ci0JCQlvZGF0YVtvdXQrK10gPSAnICc7Ci0JCQlpbisrOwotCQl9Ci0JCWVsc2UgewotCQkJb2RhdGFbb3V0XSA9IGRhdGFbaW5dOwotCQkJaW4rKzsKLQkJCW91dCsrOwotCQl9Ci0JfQotCWlmICgocnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKW9kYXRhLCBvdXQpKSA9PSBOVUxMKSB7Ci0JCVB5TWVtX0ZyZWUob2RhdGEpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlNZW1fRnJlZShvZGF0YSk7Ci0JcmV0dXJuIHJ2OworICAgIGluID0gb3V0ID0gMDsKKyAgICB3aGlsZSAoaW4gPCBkYXRhbGVuKSB7CisgICAgICAgIGlmIChkYXRhW2luXSA9PSAnPScpIHsKKyAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICBpZiAoaW4gPj0gZGF0YWxlbikgYnJlYWs7CisgICAgICAgICAgICAvKiBTb2Z0IGxpbmUgYnJlYWtzICovCisgICAgICAgICAgICBpZiAoKGRhdGFbaW5dID09ICdcbicpIHx8IChkYXRhW2luXSA9PSAnXHInKSkgeworICAgICAgICAgICAgICAgIGlmIChkYXRhW2luXSAhPSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbiA8IGRhdGFsZW4gJiYgZGF0YVtpbl0gIT0gJ1xuJykgaW4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluIDwgZGF0YWxlbikgaW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFbaW5dID09ICc9JykgeworICAgICAgICAgICAgICAgIC8qIGJyb2tlbiBjYXNlIGZyb20gYnJva2VuIHB5dGhvbiBxcCAqLworICAgICAgICAgICAgICAgIG9kYXRhW291dCsrXSA9ICc9JzsKKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKChkYXRhW2luXSA+PSAnQScgJiYgZGF0YVtpbl0gPD0gJ0YnKSB8fAorICAgICAgICAgICAgICAgICAgICAgIChkYXRhW2luXSA+PSAnYScgJiYgZGF0YVtpbl0gPD0gJ2YnKSB8fAorICAgICAgICAgICAgICAgICAgICAgIChkYXRhW2luXSA+PSAnMCcgJiYgZGF0YVtpbl0gPD0gJzknKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICgoZGF0YVtpbisxXSA+PSAnQScgJiYgZGF0YVtpbisxXSA8PSAnRicpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKGRhdGFbaW4rMV0gPj0gJ2EnICYmIGRhdGFbaW4rMV0gPD0gJ2YnKSB8fAorICAgICAgICAgICAgICAgICAgICAgIChkYXRhW2luKzFdID49ICcwJyAmJiBkYXRhW2luKzFdIDw9ICc5JykpKSB7CisgICAgICAgICAgICAgICAgLyogaGV4dmFsICovCisgICAgICAgICAgICAgICAgY2ggPSBoZXh2YWwoZGF0YVtpbl0pIDw8IDQ7CisgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgICAgICBjaCB8PSBoZXh2YWwoZGF0YVtpbl0pOworICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gY2g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJz0nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGhlYWRlciAmJiBkYXRhW2luXSA9PSAnXycpIHsKKyAgICAgICAgICAgIG9kYXRhW291dCsrXSA9ICcgJzsKKyAgICAgICAgICAgIGluKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvZGF0YVtvdXRdID0gZGF0YVtpbl07CisgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgb3V0Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopb2RhdGEsIG91dCkpID09IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fRnJlZShvZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeU1lbV9GcmVlKG9kYXRhKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBpbnQKIHRvX2hleCAodW5zaWduZWQgY2hhciBjaCwgdW5zaWduZWQgY2hhciAqcykKIHsKLQl1bnNpZ25lZCBpbnQgdXZhbHVlID0gY2g7CisgICAgdW5zaWduZWQgaW50IHV2YWx1ZSA9IGNoOwogCi0Jc1sxXSA9ICIwMTIzNDU2Nzg5QUJDREVGIlt1dmFsdWUgJSAxNl07Ci0JdXZhbHVlID0gKHV2YWx1ZSAvIDE2KTsKLQlzWzBdID0gIjAxMjM0NTY3ODlBQkNERUYiW3V2YWx1ZSAlIDE2XTsKLQlyZXR1cm4gMDsKKyAgICBzWzFdID0gIjAxMjM0NTY3ODlBQkNERUYiW3V2YWx1ZSAlIDE2XTsKKyAgICB1dmFsdWUgPSAodXZhbHVlIC8gMTYpOworICAgIHNbMF0gPSAiMDEyMzQ1Njc4OUFCQ0RFRiJbdXZhbHVlICUgMTZdOworICAgIHJldHVybiAwOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2IyYV9xcCwKQEAgLTExNzUsMjA0ICsxMTc1LDIwNCBAQAogc3RhdGljIFB5T2JqZWN0KgogYmluYXNjaWlfYjJhX3FwIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpbiwgb3V0OwotCXVuc2lnbmVkIGNoYXIgKmRhdGEsICpvZGF0YTsKLQlQeV9zc2l6ZV90IGRhdGFsZW4gPSAwLCBvZGF0YWxlbiA9IDA7Ci0JUHlPYmplY3QgKnJ2OwotCXVuc2lnbmVkIGludCBsaW5lbGVuID0gMDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGEiLCAicXVvdGV0YWJzIiwgImlzdGV4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIiwgTlVMTH07Ci0JaW50IGlzdGV4dCA9IDE7Ci0JaW50IHF1b3RldGFicyA9IDA7Ci0JaW50IGhlYWRlciA9IDA7Ci0JdW5zaWduZWQgY2hhciBjaDsKLQlpbnQgY3JsZiA9IDA7Ci0JdW5zaWduZWQgY2hhciAqcDsKKyAgICBQeV9zc2l6ZV90IGluLCBvdXQ7CisgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgKm9kYXRhOworICAgIFB5X3NzaXplX3QgZGF0YWxlbiA9IDAsIG9kYXRhbGVuID0gMDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgdW5zaWduZWQgaW50IGxpbmVsZW4gPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZGF0YSIsICJxdW90ZXRhYnMiLCAiaXN0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciIsIE5VTEx9OworICAgIGludCBpc3RleHQgPSAxOworICAgIGludCBxdW90ZXRhYnMgPSAwOworICAgIGludCBoZWFkZXIgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgY2g7CisgICAgaW50IGNybGYgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgKnA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzI3xpaWkiLCBrd2xpc3QsICZkYXRhLAotCSAgICAgICZkYXRhbGVuLCAmcXVvdGV0YWJzLCAmaXN0ZXh0LCAmaGVhZGVyKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyN8aWlpIiwga3dsaXN0LCAmZGF0YSwKKyAgICAgICAgICAmZGF0YWxlbiwgJnF1b3RldGFicywgJmlzdGV4dCwgJmhlYWRlcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogU2VlIGlmIHRoaXMgc3RyaW5nIGlzIHVzaW5nIENSTEYgbGluZSBlbmRzICovCi0JLyogWFhYOiB0aGlzIGZ1bmN0aW9uIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY29udmVydGluZyBhbGwgb2YKLQkgKiB0aGUgZW5kIG9mIGxpbmVzIHRvIGJlIHRoZSBzYW1lIGRlcGVuZGluZyBvbiB0aGlzIGRldGVjdGlvbgotCSAqIGhlcmUgKi8KLQlwID0gKHVuc2lnbmVkIGNoYXIgKikgbWVtY2hyKGRhdGEsICdcbicsIGRhdGFsZW4pOwotCWlmICgocCAhPSBOVUxMKSAmJiAocCA+IGRhdGEpICYmICgqKHAtMSkgPT0gJ1xyJykpCi0JCWNybGYgPSAxOworICAgIC8qIFNlZSBpZiB0aGlzIHN0cmluZyBpcyB1c2luZyBDUkxGIGxpbmUgZW5kcyAqLworICAgIC8qIFhYWDogdGhpcyBmdW5jdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNvbnZlcnRpbmcgYWxsIG9mCisgICAgICogdGhlIGVuZCBvZiBsaW5lcyB0byBiZSB0aGUgc2FtZSBkZXBlbmRpbmcgb24gdGhpcyBkZXRlY3Rpb24KKyAgICAgKiBoZXJlICovCisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIG1lbWNocihkYXRhLCAnXG4nLCBkYXRhbGVuKTsKKyAgICBpZiAoKHAgIT0gTlVMTCkgJiYgKHAgPiBkYXRhKSAmJiAoKihwLTEpID09ICdccicpKQorICAgICAgICBjcmxmID0gMTsKIAotCS8qIEZpcnN0LCBzY2FuIHRvIHNlZSBob3cgbWFueSBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgZW5jb2RlZCAqLwotCWluID0gMDsKLQl3aGlsZSAoaW4gPCBkYXRhbGVuKSB7Ci0JCWlmICgoZGF0YVtpbl0gPiAxMjYpIHx8Ci0JCSAgICAoZGF0YVtpbl0gPT0gJz0nKSB8fAotCQkgICAgKGhlYWRlciAmJiBkYXRhW2luXSA9PSAnXycpIHx8Ci0JCSAgICAoKGRhdGFbaW5dID09ICcuJykgJiYgKGxpbmVsZW4gPT0gMCkgJiYKLQkJICAgICAoZGF0YVtpbisxXSA9PSAnXG4nIHx8IGRhdGFbaW4rMV0gPT0gJ1xyJyB8fCBkYXRhW2luKzFdID09IDApKSB8fAotCQkgICAgKCFpc3RleHQgJiYgKChkYXRhW2luXSA9PSAnXHInKSB8fCAoZGF0YVtpbl0gPT0gJ1xuJykpKSB8fAotCQkgICAgKChkYXRhW2luXSA9PSAnXHQnIHx8IGRhdGFbaW5dID09ICcgJykgJiYgKGluICsgMSA9PSBkYXRhbGVuKSkgfHwKLQkJICAgICgoZGF0YVtpbl0gPCAzMykgJiYKLQkJICAgICAoZGF0YVtpbl0gIT0gJ1xyJykgJiYgKGRhdGFbaW5dICE9ICdcbicpICYmCi0JCSAgICAgKHF1b3RldGFicyB8fAotCQkgICAgIAkoIXF1b3RldGFicyAmJiAoKGRhdGFbaW5dICE9ICdcdCcpICYmIChkYXRhW2luXSAhPSAnICcpKSkpKSkKLQkJewotCQkJaWYgKChsaW5lbGVuICsgMykgPj0gTUFYTElORVNJWkUpIHsKLQkJCQlsaW5lbGVuID0gMDsKLQkJCQlpZiAoY3JsZikKLQkJCQkJb2RhdGFsZW4gKz0gMzsKLQkJCQllbHNlCi0JCQkJCW9kYXRhbGVuICs9IDI7Ci0JCQl9Ci0JCQlsaW5lbGVuICs9IDM7Ci0JCQlvZGF0YWxlbiArPSAzOwotCQkJaW4rKzsKLQkJfQotCQllbHNlIHsKLQkJICAJaWYgKGlzdGV4dCAmJgotCQkJICAgICgoZGF0YVtpbl0gPT0gJ1xuJykgfHwKLQkJCSAgICAgKChpbisxIDwgZGF0YWxlbikgJiYgKGRhdGFbaW5dID09ICdccicpICYmCi0JCQkgICAgIChkYXRhW2luKzFdID09ICdcbicpKSkpCi0JCQl7Ci0JCQkgIAlsaW5lbGVuID0gMDsKLQkJCQkvKiBQcm90ZWN0IGFnYWluc3Qgd2hpdGVzcGFjZSBvbiBlbmQgb2YgbGluZSAqLwotCQkJCWlmIChpbiAmJiAoKGRhdGFbaW4tMV0gPT0gJyAnKSB8fCAoZGF0YVtpbi0xXSA9PSAnXHQnKSkpCi0JCQkJCW9kYXRhbGVuICs9IDI7Ci0JCQkJaWYgKGNybGYpCi0JCQkJCW9kYXRhbGVuICs9IDI7Ci0JCQkJZWxzZQotCQkJCQlvZGF0YWxlbiArPSAxOwotCQkJCWlmIChkYXRhW2luXSA9PSAnXHInKQotCQkJCQlpbiArPSAyOwotCQkJCWVsc2UKLQkJCQkJaW4rKzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICgoaW4gKyAxICE9IGRhdGFsZW4pICYmCi0JCQkJICAgIChkYXRhW2luKzFdICE9ICdcbicpICYmCi0JCQkJICAgIChsaW5lbGVuICsgMSkgPj0gTUFYTElORVNJWkUpIHsKLQkJCQkJbGluZWxlbiA9IDA7Ci0JCQkJCWlmIChjcmxmKQotCQkJCQkJb2RhdGFsZW4gKz0gMzsKLQkJCQkJZWxzZQotCQkJCQkJb2RhdGFsZW4gKz0gMjsKLQkJCQl9Ci0JCQkJbGluZWxlbisrOwotCQkJCW9kYXRhbGVuKys7Ci0JCQkJaW4rKzsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBGaXJzdCwgc2NhbiB0byBzZWUgaG93IG1hbnkgY2hhcmFjdGVycyBuZWVkIHRvIGJlIGVuY29kZWQgKi8KKyAgICBpbiA9IDA7CisgICAgd2hpbGUgKGluIDwgZGF0YWxlbikgeworICAgICAgICBpZiAoKGRhdGFbaW5dID4gMTI2KSB8fAorICAgICAgICAgICAgKGRhdGFbaW5dID09ICc9JykgfHwKKyAgICAgICAgICAgIChoZWFkZXIgJiYgZGF0YVtpbl0gPT0gJ18nKSB8fAorICAgICAgICAgICAgKChkYXRhW2luXSA9PSAnLicpICYmIChsaW5lbGVuID09IDApICYmCisgICAgICAgICAgICAgKGRhdGFbaW4rMV0gPT0gJ1xuJyB8fCBkYXRhW2luKzFdID09ICdccicgfHwgZGF0YVtpbisxXSA9PSAwKSkgfHwKKyAgICAgICAgICAgICghaXN0ZXh0ICYmICgoZGF0YVtpbl0gPT0gJ1xyJykgfHwgKGRhdGFbaW5dID09ICdcbicpKSkgfHwKKyAgICAgICAgICAgICgoZGF0YVtpbl0gPT0gJ1x0JyB8fCBkYXRhW2luXSA9PSAnICcpICYmIChpbiArIDEgPT0gZGF0YWxlbikpIHx8CisgICAgICAgICAgICAoKGRhdGFbaW5dIDwgMzMpICYmCisgICAgICAgICAgICAgKGRhdGFbaW5dICE9ICdccicpICYmIChkYXRhW2luXSAhPSAnXG4nKSAmJgorICAgICAgICAgICAgIChxdW90ZXRhYnMgfHwKKyAgICAgICAgICAgICghcXVvdGV0YWJzICYmICgoZGF0YVtpbl0gIT0gJ1x0JykgJiYgKGRhdGFbaW5dICE9ICcgJykpKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGxpbmVsZW4gKyAzKSA+PSBNQVhMSU5FU0laRSkgeworICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOworICAgICAgICAgICAgICAgIGlmIChjcmxmKQorICAgICAgICAgICAgICAgICAgICBvZGF0YWxlbiArPSAzOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFsZW4gKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVsZW4gKz0gMzsKKyAgICAgICAgICAgIG9kYXRhbGVuICs9IDM7CisgICAgICAgICAgICBpbisrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGlzdGV4dCAmJgorICAgICAgICAgICAgICAgICgoZGF0YVtpbl0gPT0gJ1xuJykgfHwKKyAgICAgICAgICAgICAgICAgKChpbisxIDwgZGF0YWxlbikgJiYgKGRhdGFbaW5dID09ICdccicpICYmCisgICAgICAgICAgICAgICAgIChkYXRhW2luKzFdID09ICdcbicpKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGluZWxlbiA9IDA7CisgICAgICAgICAgICAgICAgLyogUHJvdGVjdCBhZ2FpbnN0IHdoaXRlc3BhY2Ugb24gZW5kIG9mIGxpbmUgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW4gJiYgKChkYXRhW2luLTFdID09ICcgJykgfHwgKGRhdGFbaW4tMV0gPT0gJ1x0JykpKQorICAgICAgICAgICAgICAgICAgICBvZGF0YWxlbiArPSAyOworICAgICAgICAgICAgICAgIGlmIChjcmxmKQorICAgICAgICAgICAgICAgICAgICBvZGF0YWxlbiArPSAyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFsZW4gKz0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YVtpbl0gPT0gJ1xyJykKKyAgICAgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKGluICsgMSAhPSBkYXRhbGVuKSAmJgorICAgICAgICAgICAgICAgICAgICAoZGF0YVtpbisxXSAhPSAnXG4nKSAmJgorICAgICAgICAgICAgICAgICAgICAobGluZWxlbiArIDEpID49IE1BWExJTkVTSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoY3JsZikKKyAgICAgICAgICAgICAgICAgICAgICAgIG9kYXRhbGVuICs9IDM7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG9kYXRhbGVuICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmVsZW4rKzsKKyAgICAgICAgICAgICAgICBvZGF0YWxlbisrOworICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBXZSBhbGxvY2F0ZSB0aGUgb3V0cHV0IHNhbWUgc2l6ZSBhcyBpbnB1dCwgdGhpcyBpcyBvdmVya2lsbC4KLQkgKiBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gdXNlZCBjYWxsb2MoKSBzbyB3ZSdsbCB6ZXJvIG91dCB0aGUKLQkgKiBtZW1vcnkgaGVyZSB0b28sIHNpbmNlIFB5TWVtX01hbGxvYygpIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0LgotCSAqLwotCW9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgUHlNZW1fTWFsbG9jKG9kYXRhbGVuKTsKLQlpZiAob2RhdGEgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtc2V0KG9kYXRhLCAwLCBvZGF0YWxlbik7CisgICAgLyogV2UgYWxsb2NhdGUgdGhlIG91dHB1dCBzYW1lIHNpemUgYXMgaW5wdXQsIHRoaXMgaXMgb3ZlcmtpbGwuCisgICAgICogVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIHVzZWQgY2FsbG9jKCkgc28gd2UnbGwgemVybyBvdXQgdGhlCisgICAgICogbWVtb3J5IGhlcmUgdG9vLCBzaW5jZSBQeU1lbV9NYWxsb2MoKSBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdC4KKyAgICAgKi8KKyAgICBvZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIFB5TWVtX01hbGxvYyhvZGF0YWxlbik7CisgICAgaWYgKG9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChvZGF0YSwgMCwgb2RhdGFsZW4pOwogCi0JaW4gPSBvdXQgPSBsaW5lbGVuID0gMDsKLQl3aGlsZSAoaW4gPCBkYXRhbGVuKSB7Ci0JCWlmICgoZGF0YVtpbl0gPiAxMjYpIHx8Ci0JCSAgICAoZGF0YVtpbl0gPT0gJz0nKSB8fAotCQkgICAgKGhlYWRlciAmJiBkYXRhW2luXSA9PSAnXycpIHx8Ci0JCSAgICAoKGRhdGFbaW5dID09ICcuJykgJiYgKGxpbmVsZW4gPT0gMCkgJiYKLQkJICAgICAoZGF0YVtpbisxXSA9PSAnXG4nIHx8IGRhdGFbaW4rMV0gPT0gJ1xyJyB8fCBkYXRhW2luKzFdID09IDApKSB8fAotCQkgICAgKCFpc3RleHQgJiYgKChkYXRhW2luXSA9PSAnXHInKSB8fCAoZGF0YVtpbl0gPT0gJ1xuJykpKSB8fAotCQkgICAgKChkYXRhW2luXSA9PSAnXHQnIHx8IGRhdGFbaW5dID09ICcgJykgJiYgKGluICsgMSA9PSBkYXRhbGVuKSkgfHwKLQkJICAgICgoZGF0YVtpbl0gPCAzMykgJiYKLQkJICAgICAoZGF0YVtpbl0gIT0gJ1xyJykgJiYgKGRhdGFbaW5dICE9ICdcbicpICYmCi0JCSAgICAgKHF1b3RldGFicyB8fAotCQkgICAgIAkoIXF1b3RldGFicyAmJiAoKGRhdGFbaW5dICE9ICdcdCcpICYmIChkYXRhW2luXSAhPSAnICcpKSkpKSkKLQkJewotCQkJaWYgKChsaW5lbGVuICsgMyApPj0gTUFYTElORVNJWkUpIHsKLQkJCQlvZGF0YVtvdXQrK10gPSAnPSc7Ci0JCQkJaWYgKGNybGYpIG9kYXRhW291dCsrXSA9ICdccic7Ci0JCQkJb2RhdGFbb3V0KytdID0gJ1xuJzsKLQkJCQlsaW5lbGVuID0gMDsKLQkJCX0KLQkJCW9kYXRhW291dCsrXSA9ICc9JzsKLQkJCXRvX2hleChkYXRhW2luXSwgJm9kYXRhW291dF0pOwotCQkJb3V0ICs9IDI7Ci0JCQlpbisrOwotCQkJbGluZWxlbiArPSAzOwotCQl9Ci0JCWVsc2UgewotCQkgIAlpZiAoaXN0ZXh0ICYmCi0JCQkgICAgKChkYXRhW2luXSA9PSAnXG4nKSB8fAotCQkJICAgICAoKGluKzEgPCBkYXRhbGVuKSAmJiAoZGF0YVtpbl0gPT0gJ1xyJykgJiYKLQkJCSAgICAgKGRhdGFbaW4rMV0gPT0gJ1xuJykpKSkKLQkJCXsKLQkJCSAgCWxpbmVsZW4gPSAwOwotCQkJCS8qIFByb3RlY3QgYWdhaW5zdCB3aGl0ZXNwYWNlIG9uIGVuZCBvZiBsaW5lICovCi0JCQkJaWYgKG91dCAmJiAoKG9kYXRhW291dC0xXSA9PSAnICcpIHx8IChvZGF0YVtvdXQtMV0gPT0gJ1x0JykpKSB7Ci0JCQkJCWNoID0gb2RhdGFbb3V0LTFdOwotCQkJCQlvZGF0YVtvdXQtMV0gPSAnPSc7Ci0JCQkJCXRvX2hleChjaCwgJm9kYXRhW291dF0pOwotCQkJCQlvdXQgKz0gMjsKLQkJCQl9CisgICAgaW4gPSBvdXQgPSBsaW5lbGVuID0gMDsKKyAgICB3aGlsZSAoaW4gPCBkYXRhbGVuKSB7CisgICAgICAgIGlmICgoZGF0YVtpbl0gPiAxMjYpIHx8CisgICAgICAgICAgICAoZGF0YVtpbl0gPT0gJz0nKSB8fAorICAgICAgICAgICAgKGhlYWRlciAmJiBkYXRhW2luXSA9PSAnXycpIHx8CisgICAgICAgICAgICAoKGRhdGFbaW5dID09ICcuJykgJiYgKGxpbmVsZW4gPT0gMCkgJiYKKyAgICAgICAgICAgICAoZGF0YVtpbisxXSA9PSAnXG4nIHx8IGRhdGFbaW4rMV0gPT0gJ1xyJyB8fCBkYXRhW2luKzFdID09IDApKSB8fAorICAgICAgICAgICAgKCFpc3RleHQgJiYgKChkYXRhW2luXSA9PSAnXHInKSB8fCAoZGF0YVtpbl0gPT0gJ1xuJykpKSB8fAorICAgICAgICAgICAgKChkYXRhW2luXSA9PSAnXHQnIHx8IGRhdGFbaW5dID09ICcgJykgJiYgKGluICsgMSA9PSBkYXRhbGVuKSkgfHwKKyAgICAgICAgICAgICgoZGF0YVtpbl0gPCAzMykgJiYKKyAgICAgICAgICAgICAoZGF0YVtpbl0gIT0gJ1xyJykgJiYgKGRhdGFbaW5dICE9ICdcbicpICYmCisgICAgICAgICAgICAgKHF1b3RldGFicyB8fAorICAgICAgICAgICAgKCFxdW90ZXRhYnMgJiYgKChkYXRhW2luXSAhPSAnXHQnKSAmJiAoZGF0YVtpbl0gIT0gJyAnKSkpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobGluZWxlbiArIDMgKT49IE1BWExJTkVTSVpFKSB7CisgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJz0nOworICAgICAgICAgICAgICAgIGlmIChjcmxmKSBvZGF0YVtvdXQrK10gPSAnXHInOworICAgICAgICAgICAgICAgIG9kYXRhW291dCsrXSA9ICdcbic7CisgICAgICAgICAgICAgICAgbGluZWxlbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvZGF0YVtvdXQrK10gPSAnPSc7CisgICAgICAgICAgICB0b19oZXgoZGF0YVtpbl0sICZvZGF0YVtvdXRdKTsKKyAgICAgICAgICAgIG91dCArPSAyOworICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgIGxpbmVsZW4gKz0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpc3RleHQgJiYKKyAgICAgICAgICAgICAgICAoKGRhdGFbaW5dID09ICdcbicpIHx8CisgICAgICAgICAgICAgICAgICgoaW4rMSA8IGRhdGFsZW4pICYmIChkYXRhW2luXSA9PSAnXHInKSAmJgorICAgICAgICAgICAgICAgICAoZGF0YVtpbisxXSA9PSAnXG4nKSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbmVsZW4gPSAwOworICAgICAgICAgICAgICAgIC8qIFByb3RlY3QgYWdhaW5zdCB3aGl0ZXNwYWNlIG9uIGVuZCBvZiBsaW5lICovCisgICAgICAgICAgICAgICAgaWYgKG91dCAmJiAoKG9kYXRhW291dC0xXSA9PSAnICcpIHx8IChvZGF0YVtvdXQtMV0gPT0gJ1x0JykpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gb2RhdGFbb3V0LTFdOworICAgICAgICAgICAgICAgICAgICBvZGF0YVtvdXQtMV0gPSAnPSc7CisgICAgICAgICAgICAgICAgICAgIHRvX2hleChjaCwgJm9kYXRhW291dF0pOworICAgICAgICAgICAgICAgICAgICBvdXQgKz0gMjsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlpZiAoY3JsZikgb2RhdGFbb3V0KytdID0gJ1xyJzsKLQkJCQlvZGF0YVtvdXQrK10gPSAnXG4nOwotCQkJCWlmIChkYXRhW2luXSA9PSAnXHInKQotCQkJCQlpbiArPSAyOwotCQkJCWVsc2UKLQkJCQkJaW4rKzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICgoaW4gKyAxICE9IGRhdGFsZW4pICYmCi0JCQkJICAgIChkYXRhW2luKzFdICE9ICdcbicpICYmCi0JCQkJICAgIChsaW5lbGVuICsgMSkgPj0gTUFYTElORVNJWkUpIHsKLQkJCQkJb2RhdGFbb3V0KytdID0gJz0nOwotCQkJCQlpZiAoY3JsZikgb2RhdGFbb3V0KytdID0gJ1xyJzsKLQkJCQkJb2RhdGFbb3V0KytdID0gJ1xuJzsKLQkJCQkJbGluZWxlbiA9IDA7Ci0JCQkJfQotCQkJCWxpbmVsZW4rKzsKLQkJCQlpZiAoaGVhZGVyICYmIGRhdGFbaW5dID09ICcgJykgewotCQkJCQlvZGF0YVtvdXQrK10gPSAnXyc7Ci0JCQkJCWluKys7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvZGF0YVtvdXQrK10gPSBkYXRhW2luKytdOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlpZiAoKHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilvZGF0YSwgb3V0KSkgPT0gTlVMTCkgewotCQlQeU1lbV9GcmVlKG9kYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5TWVtX0ZyZWUob2RhdGEpOwotCXJldHVybiBydjsKKyAgICAgICAgICAgICAgICBpZiAoY3JsZikgb2RhdGFbb3V0KytdID0gJ1xyJzsKKyAgICAgICAgICAgICAgICBvZGF0YVtvdXQrK10gPSAnXG4nOworICAgICAgICAgICAgICAgIGlmIChkYXRhW2luXSA9PSAnXHInKQorICAgICAgICAgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoaW4gKyAxICE9IGRhdGFsZW4pICYmCisgICAgICAgICAgICAgICAgICAgIChkYXRhW2luKzFdICE9ICdcbicpICYmCisgICAgICAgICAgICAgICAgICAgIChsaW5lbGVuICsgMSkgPj0gTUFYTElORVNJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJz0nOworICAgICAgICAgICAgICAgICAgICBpZiAoY3JsZikgb2RhdGFbb3V0KytdID0gJ1xyJzsKKyAgICAgICAgICAgICAgICAgICAgb2RhdGFbb3V0KytdID0gJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgbGluZWxlbiA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmVsZW4rKzsKKyAgICAgICAgICAgICAgICBpZiAoaGVhZGVyICYmIGRhdGFbaW5dID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICBvZGF0YVtvdXQrK10gPSAnXyc7CisgICAgICAgICAgICAgICAgICAgIGluKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvZGF0YVtvdXQrK10gPSBkYXRhW2luKytdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilvZGF0YSwgb3V0KSkgPT0gTlVMTCkgeworICAgICAgICBQeU1lbV9GcmVlKG9kYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5TWVtX0ZyZWUob2RhdGEpOworICAgIHJldHVybiBydjsKIH0KIAogLyogTGlzdCBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgYmluYXNjaWlfbW9kdWxlX21ldGhvZHNbXSA9IHsKLQl7ImEyYl91dSIsICAgICBiaW5hc2NpaV9hMmJfdXUsICAgICBNRVRIX1ZBUkFSR1MsIGRvY19hMmJfdXV9LAotCXsiYjJhX3V1IiwgICAgIGJpbmFzY2lpX2IyYV91dSwgICAgIE1FVEhfVkFSQVJHUywgZG9jX2IyYV91dX0sCi0JeyJhMmJfYmFzZTY0IiwgYmluYXNjaWlfYTJiX2Jhc2U2NCwgTUVUSF9WQVJBUkdTLCBkb2NfYTJiX2Jhc2U2NH0sCi0JeyJiMmFfYmFzZTY0IiwgYmluYXNjaWlfYjJhX2Jhc2U2NCwgTUVUSF9WQVJBUkdTLCBkb2NfYjJhX2Jhc2U2NH0sCi0JeyJhMmJfaHF4IiwgICAgYmluYXNjaWlfYTJiX2hxeCwgICAgTUVUSF9WQVJBUkdTLCBkb2NfYTJiX2hxeH0sCi0JeyJiMmFfaHF4IiwgICAgYmluYXNjaWlfYjJhX2hxeCwgICAgTUVUSF9WQVJBUkdTLCBkb2NfYjJhX2hxeH0sCi0JeyJiMmFfaGV4IiwgICAgYmluYXNjaWlfaGV4bGlmeSwgICAgTUVUSF9WQVJBUkdTLCBkb2NfaGV4bGlmeX0sCi0JeyJhMmJfaGV4IiwgICAgYmluYXNjaWlfdW5oZXhsaWZ5LCAgTUVUSF9WQVJBUkdTLCBkb2NfdW5oZXhsaWZ5fSwKLQl7ImhleGxpZnkiLCAgICBiaW5hc2NpaV9oZXhsaWZ5LCAgICBNRVRIX1ZBUkFSR1MsIGRvY19oZXhsaWZ5fSwKLQl7InVuaGV4bGlmeSIsICBiaW5hc2NpaV91bmhleGxpZnksICBNRVRIX1ZBUkFSR1MsIGRvY191bmhleGxpZnl9LAotCXsicmxlY29kZV9ocXgiLCAgIGJpbmFzY2lpX3JsZWNvZGVfaHF4LCBNRVRIX1ZBUkFSR1MsIGRvY19ybGVjb2RlX2hxeH0sCi0JeyJybGVkZWNvZGVfaHF4IiwgYmluYXNjaWlfcmxlZGVjb2RlX2hxeCwgTUVUSF9WQVJBUkdTLAotCSBkb2NfcmxlZGVjb2RlX2hxeH0sCi0JeyJjcmNfaHF4IiwgICAgYmluYXNjaWlfY3JjX2hxeCwgICAgTUVUSF9WQVJBUkdTLCBkb2NfY3JjX2hxeH0sCi0JeyJjcmMzMiIsICAgICAgYmluYXNjaWlfY3JjMzIsICAgICAgTUVUSF9WQVJBUkdTLCBkb2NfY3JjMzJ9LAotCXsiYTJiX3FwIiwgKFB5Q0Z1bmN0aW9uKWJpbmFzY2lpX2EyYl9xcCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkgIGRvY19hMmJfcXB9LAotCXsiYjJhX3FwIiwgKFB5Q0Z1bmN0aW9uKWJpbmFzY2lpX2IyYV9xcCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLSAgICAgICAgICBkb2NfYjJhX3FwfSwKLQl7TlVMTCwgTlVMTH0JCQkgICAgIC8qIHNlbnRpbmVsICovCisgICAgeyJhMmJfdXUiLCAgICAgYmluYXNjaWlfYTJiX3V1LCAgICAgTUVUSF9WQVJBUkdTLCBkb2NfYTJiX3V1fSwKKyAgICB7ImIyYV91dSIsICAgICBiaW5hc2NpaV9iMmFfdXUsICAgICBNRVRIX1ZBUkFSR1MsIGRvY19iMmFfdXV9LAorICAgIHsiYTJiX2Jhc2U2NCIsIGJpbmFzY2lpX2EyYl9iYXNlNjQsIE1FVEhfVkFSQVJHUywgZG9jX2EyYl9iYXNlNjR9LAorICAgIHsiYjJhX2Jhc2U2NCIsIGJpbmFzY2lpX2IyYV9iYXNlNjQsIE1FVEhfVkFSQVJHUywgZG9jX2IyYV9iYXNlNjR9LAorICAgIHsiYTJiX2hxeCIsICAgIGJpbmFzY2lpX2EyYl9ocXgsICAgIE1FVEhfVkFSQVJHUywgZG9jX2EyYl9ocXh9LAorICAgIHsiYjJhX2hxeCIsICAgIGJpbmFzY2lpX2IyYV9ocXgsICAgIE1FVEhfVkFSQVJHUywgZG9jX2IyYV9ocXh9LAorICAgIHsiYjJhX2hleCIsICAgIGJpbmFzY2lpX2hleGxpZnksICAgIE1FVEhfVkFSQVJHUywgZG9jX2hleGxpZnl9LAorICAgIHsiYTJiX2hleCIsICAgIGJpbmFzY2lpX3VuaGV4bGlmeSwgIE1FVEhfVkFSQVJHUywgZG9jX3VuaGV4bGlmeX0sCisgICAgeyJoZXhsaWZ5IiwgICAgYmluYXNjaWlfaGV4bGlmeSwgICAgTUVUSF9WQVJBUkdTLCBkb2NfaGV4bGlmeX0sCisgICAgeyJ1bmhleGxpZnkiLCAgYmluYXNjaWlfdW5oZXhsaWZ5LCAgTUVUSF9WQVJBUkdTLCBkb2NfdW5oZXhsaWZ5fSwKKyAgICB7InJsZWNvZGVfaHF4IiwgICBiaW5hc2NpaV9ybGVjb2RlX2hxeCwgTUVUSF9WQVJBUkdTLCBkb2NfcmxlY29kZV9ocXh9LAorICAgIHsicmxlZGVjb2RlX2hxeCIsIGJpbmFzY2lpX3JsZWRlY29kZV9ocXgsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX3JsZWRlY29kZV9ocXh9LAorICAgIHsiY3JjX2hxeCIsICAgIGJpbmFzY2lpX2NyY19ocXgsICAgIE1FVEhfVkFSQVJHUywgZG9jX2NyY19ocXh9LAorICAgIHsiY3JjMzIiLCAgICAgIGJpbmFzY2lpX2NyYzMyLCAgICAgIE1FVEhfVkFSQVJHUywgZG9jX2NyYzMyfSwKKyAgICB7ImEyYl9xcCIsIChQeUNGdW5jdGlvbiliaW5hc2NpaV9hMmJfcXAsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICBkb2NfYTJiX3FwfSwKKyAgICB7ImIyYV9xcCIsIChQeUNGdW5jdGlvbiliaW5hc2NpaV9iMmFfcXAsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICBkb2NfYjJhX3FwfSwKKyAgICB7TlVMTCwgTlVMTH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTEzODIsMjAgKzEzODIsMjAgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0YmluYXNjaWkodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp4OworICAgIFB5T2JqZWN0ICptLCAqZCwgKng7CiAKLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLQltID0gUHlfSW5pdE1vZHVsZSgiYmluYXNjaWkiLCBiaW5hc2NpaV9tb2R1bGVfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJiaW5hc2NpaSIsIGJpbmFzY2lpX21vZHVsZV9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQl4ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2NfYmluYXNjaWkpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2RvY19fIiwgeCk7Ci0JUHlfWERFQ1JFRih4KTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICB4ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2NfYmluYXNjaWkpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2RvY19fIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKIAotCUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJiaW5hc2NpaS5FcnJvciIsIE5VTEwsIE5VTEwpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEVycm9yKTsKLQlJbmNvbXBsZXRlID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJiaW5hc2NpaS5JbmNvbXBsZXRlIiwgTlVMTCwgTlVMTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkluY29tcGxldGUiLCBJbmNvbXBsZXRlKTsKKyAgICBFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYmluYXNjaWkuRXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBFcnJvcik7CisgICAgSW5jb21wbGV0ZSA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYmluYXNjaWkuSW5jb21wbGV0ZSIsIE5VTEwsIE5VTEwpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJbmNvbXBsZXRlIiwgSW5jb21wbGV0ZSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2JzZGRibW9kdWxlLmMgYi9Nb2R1bGVzL2JzZGRibW9kdWxlLmMKaW5kZXggMDk3Mjg4Mi4uNWZkNGZiMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9ic2RkYm1vZHVsZS5jCisrKyBiL01vZHVsZXMvYnNkZGJtb2R1bGUuYwpAQCAtMzAsMTIgKzMwLDEyIEBACiAgICAoaXQgbWVzc2VzIHVwIHRoZSBpbmZvIHJlcXVpcmVkIGluIHRoZSBTZXR1cCBmaWxlKSAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCURCICpkaV9ic2RkYjsKLQlpbnQgZGlfc2l6ZTsJLyogLTEgbWVhbnMgcmVjb21wdXRlICovCi0JaW50IGRpX3R5cGU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIERCICpkaV9ic2RkYjsKKyAgICBpbnQgZGlfc2l6ZTsgICAgICAgIC8qIC0xIG1lYW5zIHJlY29tcHV0ZSAqLworICAgIGludCBkaV90eXBlOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlUaHJlYWRfdHlwZV9sb2NrIGRpX2xvY2s7CisgICAgUHlUaHJlYWRfdHlwZV9sb2NrIGRpX2xvY2s7CiAjZW5kaWYKIH0gYnNkZGJvYmplY3Q7CiAKQEAgLTQ0LDgxOSArNDQsODE5IEBACiAjZGVmaW5lIGlzX2JzZGRib2JqZWN0KHYpICgodiktPm9iX3R5cGUgPT0gJkJzZGRidHlwZSkKICNkZWZpbmUgY2hlY2tfYnNkZGJvYmplY3Rfb3Blbih2LCByKSBpZiAoKHYpLT5kaV9ic2RkYiA9PSBOVUxMKSBcCiAgICAgICAgICAgICAgICB7IFB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLCBcCi0JCQkJICJCU0REQiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTRERCIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIpOyBcCiAgICAgICAgICAgICAgICAgIHJldHVybiByOyB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQnNkZGJFcnJvcjsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2RiaGFzaG9iamVjdChjaGFyICpmaWxlLCBpbnQgZmxhZ3MsIGludCBtb2RlLAotCQlpbnQgYnNpemUsIGludCBmZmFjdG9yLCBpbnQgbmVsZW0sIGludCBjYWNoZXNpemUsCi0JCWludCBoYXNoLCBpbnQgbG9yZGVyKQorICAgICAgICAgICAgICAgIGludCBic2l6ZSwgaW50IGZmYWN0b3IsIGludCBuZWxlbSwgaW50IGNhY2hlc2l6ZSwKKyAgICAgICAgICAgICAgICBpbnQgaGFzaCwgaW50IGxvcmRlcikKIHsKLQlic2RkYm9iamVjdCAqZHA7Ci0JSEFTSElORk8gaW5mbzsKKyAgICBic2RkYm9iamVjdCAqZHA7CisgICAgSEFTSElORk8gaW5mbzsKIAotCWlmICgoZHAgPSBQeU9iamVjdF9OZXcoYnNkZGJvYmplY3QsICZCc2RkYnR5cGUpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKGRwID0gUHlPYmplY3RfTmV3KGJzZGRib2JqZWN0LCAmQnNkZGJ0eXBlKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpbmZvLmJzaXplID0gYnNpemU7Ci0JaW5mby5mZmFjdG9yID0gZmZhY3RvcjsKLQlpbmZvLm5lbGVtID0gbmVsZW07Ci0JaW5mby5jYWNoZXNpemUgPSBjYWNoZXNpemU7Ci0JaW5mby5oYXNoID0gTlVMTDsgLyogWFhYIHNob3VsZCBkZXJpdmUgZnJvbSBoYXNoIGFyZ3VtZW50ICovCi0JaW5mby5sb3JkZXIgPSBsb3JkZXI7CisgICAgaW5mby5ic2l6ZSA9IGJzaXplOworICAgIGluZm8uZmZhY3RvciA9IGZmYWN0b3I7CisgICAgaW5mby5uZWxlbSA9IG5lbGVtOworICAgIGluZm8uY2FjaGVzaXplID0gY2FjaGVzaXplOworICAgIGluZm8uaGFzaCA9IE5VTEw7IC8qIFhYWCBzaG91bGQgZGVyaXZlIGZyb20gaGFzaCBhcmd1bWVudCAqLworICAgIGluZm8ubG9yZGVyID0gbG9yZGVyOwogCiAjaWZkZWYgT19CSU5BUlkKLQlmbGFncyB8PSBPX0JJTkFSWTsKKyAgICBmbGFncyB8PSBPX0JJTkFSWTsKICNlbmRpZgotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlkcC0+ZGlfYnNkZGIgPSBkYm9wZW4oZmlsZSwgZmxhZ3MsIG1vZGUsIERCX0hBU0gsICZpbmZvKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChkcC0+ZGlfYnNkZGIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGRwLT5kaV9ic2RkYiA9IGRib3BlbihmaWxlLCBmbGFncywgbW9kZSwgREJfSEFTSCwgJmluZm8pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKGRwLT5kaV9ic2RkYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlkcC0+ZGlfbG9jayA9IE5VTEw7CisgICAgICAgIGRwLT5kaV9sb2NrID0gTlVMTDsKICNlbmRpZgotCQlQeV9ERUNSRUYoZHApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIFB5X0RFQ1JFRihkcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWRwLT5kaV9zaXplID0gLTE7Ci0JZHAtPmRpX3R5cGUgPSBEQl9IQVNIOworICAgIGRwLT5kaV9zaXplID0gLTE7CisgICAgZHAtPmRpX3R5cGUgPSBEQl9IQVNIOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlkcC0+ZGlfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKLQlpZiAoZHAtPmRpX2xvY2sgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKLQkJUHlfREVDUkVGKGRwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGRwLT5kaV9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmIChkcC0+ZGlfbG9jayA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLCAiY2FuJ3QgYWxsb2NhdGUgbG9jayIpOworICAgICAgICBQeV9ERUNSRUYoZHApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCXJldHVybiAoUHlPYmplY3QgKilkcDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZHA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdkYmJ0b2JqZWN0KGNoYXIgKmZpbGUsIGludCBmbGFncywgaW50IG1vZGUsCi0JICAgICAgaW50IGJ0ZmxhZ3MsIGludCBjYWNoZXNpemUsIGludCBtYXhrZXlwYWdlLAotCSAgICAgIGludCBtaW5rZXlwYWdlLCBpbnQgcHNpemUsIGludCBsb3JkZXIpCisgICAgICAgICAgICAgIGludCBidGZsYWdzLCBpbnQgY2FjaGVzaXplLCBpbnQgbWF4a2V5cGFnZSwKKyAgICAgICAgICAgICAgaW50IG1pbmtleXBhZ2UsIGludCBwc2l6ZSwgaW50IGxvcmRlcikKIHsKLQlic2RkYm9iamVjdCAqZHA7Ci0JQlRSRUVJTkZPIGluZm87CisgICAgYnNkZGJvYmplY3QgKmRwOworICAgIEJUUkVFSU5GTyBpbmZvOwogCi0JaWYgKChkcCA9IFB5T2JqZWN0X05ldyhic2RkYm9iamVjdCwgJkJzZGRidHlwZSkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgoZHAgPSBQeU9iamVjdF9OZXcoYnNkZGJvYmplY3QsICZCc2RkYnR5cGUpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWluZm8uZmxhZ3MgPSBidGZsYWdzOwotCWluZm8uY2FjaGVzaXplID0gY2FjaGVzaXplOwotCWluZm8ubWF4a2V5cGFnZSA9IG1heGtleXBhZ2U7Ci0JaW5mby5taW5rZXlwYWdlID0gbWlua2V5cGFnZTsKLQlpbmZvLnBzaXplID0gcHNpemU7Ci0JaW5mby5sb3JkZXIgPSBsb3JkZXI7Ci0JaW5mby5jb21wYXJlID0gMDsgLyogVXNlIGRlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbnMsIGZvciBub3cuLiovCi0JaW5mby5wcmVmaXggPSAwOworICAgIGluZm8uZmxhZ3MgPSBidGZsYWdzOworICAgIGluZm8uY2FjaGVzaXplID0gY2FjaGVzaXplOworICAgIGluZm8ubWF4a2V5cGFnZSA9IG1heGtleXBhZ2U7CisgICAgaW5mby5taW5rZXlwYWdlID0gbWlua2V5cGFnZTsKKyAgICBpbmZvLnBzaXplID0gcHNpemU7CisgICAgaW5mby5sb3JkZXIgPSBsb3JkZXI7CisgICAgaW5mby5jb21wYXJlID0gMDsgLyogVXNlIGRlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbnMsIGZvciBub3cuLiovCisgICAgaW5mby5wcmVmaXggPSAwOwogCiAjaWZkZWYgT19CSU5BUlkKLQlmbGFncyB8PSBPX0JJTkFSWTsKKyAgICBmbGFncyB8PSBPX0JJTkFSWTsKICNlbmRpZgotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlkcC0+ZGlfYnNkZGIgPSBkYm9wZW4oZmlsZSwgZmxhZ3MsIG1vZGUsIERCX0JUUkVFLCAmaW5mbyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoZHAtPmRpX2JzZGRiID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBkcC0+ZGlfYnNkZGIgPSBkYm9wZW4oZmlsZSwgZmxhZ3MsIG1vZGUsIERCX0JUUkVFLCAmaW5mbyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoZHAtPmRpX2JzZGRiID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCWRwLT5kaV9sb2NrID0gTlVMTDsKKyAgICAgICAgZHAtPmRpX2xvY2sgPSBOVUxMOwogI2VuZGlmCi0JCVB5X0RFQ1JFRihkcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgUHlfREVDUkVGKGRwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZHAtPmRpX3NpemUgPSAtMTsKLQlkcC0+ZGlfdHlwZSA9IERCX0JUUkVFOworICAgIGRwLT5kaV9zaXplID0gLTE7CisgICAgZHAtPmRpX3R5cGUgPSBEQl9CVFJFRTsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JZHAtPmRpX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKGRwLT5kaV9sb2NrID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7Ci0JCVB5X0RFQ1JFRihkcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBkcC0+ZGlfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpZiAoZHAtPmRpX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKKyAgICAgICAgUHlfREVDUkVGKGRwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopZHA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3ZGJybm9iamVjdChjaGFyICpmaWxlLCBpbnQgZmxhZ3MsIGludCBtb2RlLAotCSAgICAgIGludCBybmZsYWdzLCBpbnQgY2FjaGVzaXplLCBpbnQgcHNpemUsIGludCBsb3JkZXIsCi0JICAgICAgc2l6ZV90IHJlY2xlbiwgdV9jaGFyIGJ2YWwsIGNoYXIgKmJmbmFtZSkKKyAgICAgICAgICAgICAgaW50IHJuZmxhZ3MsIGludCBjYWNoZXNpemUsIGludCBwc2l6ZSwgaW50IGxvcmRlciwKKyAgICAgICAgICAgICAgc2l6ZV90IHJlY2xlbiwgdV9jaGFyIGJ2YWwsIGNoYXIgKmJmbmFtZSkKIHsKLQlic2RkYm9iamVjdCAqZHA7Ci0JUkVDTk9JTkZPIGluZm87Ci0JaW50IGZkOworICAgIGJzZGRib2JqZWN0ICpkcDsKKyAgICBSRUNOT0lORk8gaW5mbzsKKyAgICBpbnQgZmQ7CiAKLQlpZiAoKGRwID0gUHlPYmplY3RfTmV3KGJzZGRib2JqZWN0LCAmQnNkZGJ0eXBlKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKChkcCA9IFB5T2JqZWN0X05ldyhic2RkYm9iamVjdCwgJkJzZGRidHlwZSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaW5mby5mbGFncyA9IHJuZmxhZ3M7Ci0JaW5mby5jYWNoZXNpemUgPSBjYWNoZXNpemU7Ci0JaW5mby5wc2l6ZSA9IHBzaXplOwotCWluZm8ubG9yZGVyID0gbG9yZGVyOwotCWluZm8ucmVjbGVuID0gcmVjbGVuOwotCWluZm8uYnZhbCA9IGJ2YWw7Ci0JaW5mby5iZm5hbWUgPSBiZm5hbWU7CisgICAgaW5mby5mbGFncyA9IHJuZmxhZ3M7CisgICAgaW5mby5jYWNoZXNpemUgPSBjYWNoZXNpemU7CisgICAgaW5mby5wc2l6ZSA9IHBzaXplOworICAgIGluZm8ubG9yZGVyID0gbG9yZGVyOworICAgIGluZm8ucmVjbGVuID0gcmVjbGVuOworICAgIGluZm8uYnZhbCA9IGJ2YWw7CisgICAgaW5mby5iZm5hbWUgPSBiZm5hbWU7CiAKICNpZmRlZiBPX0JJTkFSWQotCWZsYWdzIHw9IE9fQklOQVJZOworICAgIGZsYWdzIHw9IE9fQklOQVJZOwogI2VuZGlmCi0JLyogVGhpcyBpcyBhIGhhY2sgdG8gYXZvaWQgYSBkYm9wZW4oKSBidWcgdGhhdCBoYXBwZW5zIHdoZW4KLQkgKiBpdCBmYWlscy4gKi8KLQlmZCA9IG9wZW4oZmlsZSwgZmxhZ3MpOwotCWlmIChmZCA9PSAtMSkgewotCQlkcC0+ZGlfYnNkZGIgPSBOVUxMOwotCX0KLQllbHNlIHsKLQkJY2xvc2UoZmQpOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWRwLT5kaV9ic2RkYiA9IGRib3BlbihmaWxlLCBmbGFncywgbW9kZSwgREJfUkVDTk8sICZpbmZvKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9Ci0JaWYgKGRwLT5kaV9ic2RkYiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAvKiBUaGlzIGlzIGEgaGFjayB0byBhdm9pZCBhIGRib3BlbigpIGJ1ZyB0aGF0IGhhcHBlbnMgd2hlbgorICAgICAqIGl0IGZhaWxzLiAqLworICAgIGZkID0gb3BlbihmaWxlLCBmbGFncyk7CisgICAgaWYgKGZkID09IC0xKSB7CisgICAgICAgIGRwLT5kaV9ic2RkYiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZHAtPmRpX2JzZGRiID0gZGJvcGVuKGZpbGUsIGZsYWdzLCBtb2RlLCBEQl9SRUNOTywgJmluZm8pOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBpZiAoZHAtPmRpX2JzZGRiID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCWRwLT5kaV9sb2NrID0gTlVMTDsKKyAgICAgICAgZHAtPmRpX2xvY2sgPSBOVUxMOwogI2VuZGlmCi0JCVB5X0RFQ1JFRihkcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgUHlfREVDUkVGKGRwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZHAtPmRpX3NpemUgPSAtMTsKLQlkcC0+ZGlfdHlwZSA9IERCX1JFQ05POworICAgIGRwLT5kaV9zaXplID0gLTE7CisgICAgZHAtPmRpX3R5cGUgPSBEQl9SRUNOTzsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JZHAtPmRpX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKGRwLT5kaV9sb2NrID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsICJjYW4ndCBhbGxvY2F0ZSBsb2NrIik7Ci0JCVB5X0RFQ1JFRihkcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBkcC0+ZGlfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpZiAoZHAtPmRpX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKKyAgICAgICAgUHlfREVDUkVGKGRwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopZHA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRwOwogfQogCiBzdGF0aWMgdm9pZAogYnNkZGJfZGVhbGxvYyhic2RkYm9iamVjdCAqZHApCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoZHAtPmRpX2xvY2spIHsKLQkJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGRwLT5kaV9sb2NrLCAwKTsKLQkJUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGRwLT5kaV9sb2NrKTsKLQkJUHlUaHJlYWRfZnJlZV9sb2NrKGRwLT5kaV9sb2NrKTsKLQkJZHAtPmRpX2xvY2sgPSBOVUxMOwotCX0KKyAgICBpZiAoZHAtPmRpX2xvY2spIHsKKyAgICAgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGRwLT5kaV9sb2NrLCAwKTsKKyAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGRwLT5kaV9sb2NrKTsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKGRwLT5kaV9sb2NrKTsKKyAgICAgICAgZHAtPmRpX2xvY2sgPSBOVUxMOworICAgIH0KICNlbmRpZgotCWlmIChkcC0+ZGlfYnNkZGIgIT0gTlVMTCkgewotCQlpbnQgc3RhdHVzOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPmNsb3NlKShkcC0+ZGlfYnNkZGIpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAoc3RhdHVzICE9IDApCi0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkiUHl0aG9uIGJzZGRiOiBjbG9zZSBlcnJubyAlZCBpbiBkZWFsbG9jXG4iLAotCQkJCWVycm5vKTsKLQl9Ci0JUHlPYmplY3RfRGVsKGRwKTsKKyAgICBpZiAoZHAtPmRpX2JzZGRiICE9IE5VTEwpIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5jbG9zZSkoZHAtPmRpX2JzZGRiKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKHN0YXR1cyAhPSAwKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIlB5dGhvbiBic2RkYjogY2xvc2UgZXJybm8gJWQgaW4gZGVhbGxvY1xuIiwKKyAgICAgICAgICAgICAgICBlcnJubyk7CisgICAgfQorICAgIFB5T2JqZWN0X0RlbChkcCk7CiB9CiAKICNpZmRlZiBXSVRIX1RIUkVBRAogI2RlZmluZSBCU0REQl9CR05fU0FWRShfZHApIFwKLQlQeV9CRUdJTl9BTExPV19USFJFQURTIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhfZHAtPmRpX2xvY2ssMSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBQeVRocmVhZF9hY3F1aXJlX2xvY2soX2RwLT5kaV9sb2NrLDEpOwogI2RlZmluZSBCU0REQl9FTkRfU0FWRShfZHApIFwKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soX2RwLT5kaV9sb2NrKTsgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soX2RwLT5kaV9sb2NrKTsgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICNlbHNlCi0jZGVmaW5lIEJTRERCX0JHTl9TQVZFKF9kcCkgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyAKKyNkZWZpbmUgQlNEREJfQkdOX1NBVkUoX2RwKSBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjZGVmaW5lIEJTRERCX0VORF9TQVZFKF9kcCkgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICNlbmRpZgogCiBzdGF0aWMgUHlfc3NpemVfdAogYnNkZGJfbGVuZ3RoKGJzZGRib2JqZWN0ICpkcCkKIHsKLQljaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCAtMSk7Ci0JaWYgKGRwLT5kaV9zaXplIDwgMCkgewotCQlEQlQga3JlYywgZHJlYzsKLQkJaW50IHN0YXR1czsKLQkJaW50IHNpemUgPSAwOwotCQlCU0REQl9CR05fU0FWRShkcCkKLQkJZm9yIChzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwKLQkJCQkJCSAgJmtyZWMsICZkcmVjLFJfRklSU1QpOwotCQkgICAgIHN0YXR1cyA9PSAwOwotCQkgICAgIHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnNlcSkoZHAtPmRpX2JzZGRiLAotCQkJCQkJICAma3JlYywgJmRyZWMsIFJfTkVYVCkpCi0JCQlzaXplKys7Ci0JCUJTRERCX0VORF9TQVZFKGRwKQotCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWRwLT5kaV9zaXplID0gc2l6ZTsKLQl9Ci0JcmV0dXJuIGRwLT5kaV9zaXplOworICAgIGNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIC0xKTsKKyAgICBpZiAoZHAtPmRpX3NpemUgPCAwKSB7CisgICAgICAgIERCVCBrcmVjLCBkcmVjOworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgIEJTRERCX0JHTl9TQVZFKGRwKQorICAgICAgICBmb3IgKHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnNlcSkoZHAtPmRpX2JzZGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtyZWMsICZkcmVjLFJfRklSU1QpOworICAgICAgICAgICAgIHN0YXR1cyA9PSAwOworICAgICAgICAgICAgIHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnNlcSkoZHAtPmRpX2JzZGRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtyZWMsICZkcmVjLCBSX05FWFQpKQorICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICBCU0REQl9FTkRfU0FWRShkcCkKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBkcC0+ZGlfc2l6ZSA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBkcC0+ZGlfc2l6ZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX3N1YnNjcmlwdChic2RkYm9iamVjdCAqZHAsIFB5T2JqZWN0ICprZXkpCiB7Ci0JaW50IHN0YXR1czsKLQlEQlQga3JlYywgZHJlYzsKLQljaGFyICpkYXRhLGJ1Zls0MDk2XTsKLQlpbnQgc2l6ZTsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXJlY25vX3QgcmVjbm87Ci0JCi0JaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKSB7Ci0JCWlmICghUHlBcmdfUGFyc2Uoa2V5LCAiaSIsICZyZWNubykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9ICZyZWNubzsKLQkJa3JlYy5zaXplID0gc2l6ZW9mKHJlY25vKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2Uoa2V5LCAicyMiLCAmZGF0YSwgJnNpemUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkia2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9IGRhdGE7Ci0JCWtyZWMuc2l6ZSA9IHNpemU7Ci0JfQotICAgICAgICBjaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCBOVUxMKTsKKyAgICBpbnQgc3RhdHVzOworICAgIERCVCBrcmVjLCBkcmVjOworICAgIGNoYXIgKmRhdGEsYnVmWzQwOTZdOworICAgIGludCBzaXplOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgcmVjbm9fdCByZWNubzsKIAotCUJTRERCX0JHTl9TQVZFKGRwKQotCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPmdldCkoZHAtPmRpX2JzZGRiLCAma3JlYywgJmRyZWMsIDApOwotCWlmIChzdGF0dXMgPT0gMCkgewotCQlpZiAoZHJlYy5zaXplID4gc2l6ZW9mKGJ1ZikpIGRhdGEgPSBtYWxsb2MoZHJlYy5zaXplKTsKLQkJZWxzZSBkYXRhID0gYnVmOwotCQlpZiAoZGF0YSE9TlVMTCkgbWVtY3B5KGRhdGEsZHJlYy5kYXRhLGRyZWMuc2l6ZSk7Ci0JfQotCUJTRERCX0VORF9TQVZFKGRwKQotCWlmIChkYXRhPT1OVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoc3RhdHVzICE9IDApIHsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwga2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKGtleSwgImkiLCAmcmVjbm8pKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGtyZWMuZGF0YSA9ICZyZWNubzsKKyAgICAgICAga3JlYy5zaXplID0gc2l6ZW9mKHJlY25vKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2Uoa2V5LCAicyMiLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXkgdHlwZSBtdXN0IGJlIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gZGF0YTsKKyAgICAgICAga3JlYy5zaXplID0gc2l6ZTsKKyAgICB9CisgICAgY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7CiAKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCAoaW50KWRyZWMuc2l6ZSk7Ci0JaWYgKGRhdGEgIT0gYnVmKSBmcmVlKGRhdGEpOwotCXJldHVybiByZXN1bHQ7CisgICAgQlNEREJfQkdOX1NBVkUoZHApCisgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+Z2V0KShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgMCk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGlmIChkcmVjLnNpemUgPiBzaXplb2YoYnVmKSkgZGF0YSA9IG1hbGxvYyhkcmVjLnNpemUpOworICAgICAgICBlbHNlIGRhdGEgPSBidWY7CisgICAgICAgIGlmIChkYXRhIT1OVUxMKSBtZW1jcHkoZGF0YSxkcmVjLmRhdGEsZHJlYy5zaXplKTsKKyAgICB9CisgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgaWYgKGRhdGE9PU5VTEwpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBrZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShkYXRhLCAoaW50KWRyZWMuc2l6ZSk7CisgICAgaWYgKGRhdGEgIT0gYnVmKSBmcmVlKGRhdGEpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQKIGJzZGRiX2Fzc19zdWIoYnNkZGJvYmplY3QgKmRwLCBQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JaW50IHN0YXR1czsKLQlEQlQga3JlYywgZHJlYzsKLQljaGFyICpkYXRhOwotCWludCBzaXplOwotCXJlY25vX3QgcmVjbm87CisgICAgaW50IHN0YXR1czsKKyAgICBEQlQga3JlYywgZHJlYzsKKyAgICBjaGFyICpkYXRhOworICAgIGludCBzaXplOworICAgIHJlY25vX3QgcmVjbm87CiAKLQlpZiAoZHAtPmRpX3R5cGUgPT0gREJfUkVDTk8pIHsKLQkJaWYgKCFQeUFyZ19QYXJzZShrZXksICJpIiwgJnJlY25vKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImJzZGRiIGtleSB0eXBlIG11c3QgYmUgaW50ZWdlciIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWtyZWMuZGF0YSA9ICZyZWNubzsKLQkJa3JlYy5zaXplID0gc2l6ZW9mKHJlY25vKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2Uoa2V5LCAicyMiLCAmZGF0YSwgJnNpemUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiYnNkZGIga2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlrcmVjLmRhdGEgPSBkYXRhOwotCQlrcmVjLnNpemUgPSBzaXplOwotCX0KLQljaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCAtMSk7Ci0JZHAtPmRpX3NpemUgPSAtMTsKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlCU0REQl9CR05fU0FWRShkcCkKLQkJc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+ZGVsKShkcC0+ZGlfYnNkZGIsICZrcmVjLCAwKTsKLQkJQlNEREJfRU5EX1NBVkUoZHApCi0JfQotCWVsc2UgewotCQlpZiAoIVB5QXJnX1BhcnNlKHZhbHVlLCAicyMiLCAmZGF0YSwgJnNpemUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiYnNkZGIgdmFsdWUgdHlwZSBtdXN0IGJlIHN0cmluZyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWRyZWMuZGF0YSA9IGRhdGE7Ci0JCWRyZWMuc2l6ZSA9IHNpemU7Ci0JCUJTRERCX0JHTl9TQVZFKGRwKQotCQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5wdXQpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCAwKTsKLQkJQlNEREJfRU5EX1NBVkUoZHApCi0JfQotCWlmIChzdGF0dXMgIT0gMCkgewotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBrZXkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKGtleSwgImkiLCAmcmVjbm8pKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJic2RkYiBrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBrcmVjLmRhdGEgPSAmcmVjbm87CisgICAgICAgIGtyZWMuc2l6ZSA9IHNpemVvZihyZWNubyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKGtleSwgInMjIiwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnNkZGIga2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBrcmVjLmRhdGEgPSBkYXRhOworICAgICAgICBrcmVjLnNpemUgPSBzaXplOworICAgIH0KKyAgICBjaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCAtMSk7CisgICAgZHAtPmRpX3NpemUgPSAtMTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICAgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+ZGVsKShkcC0+ZGlfYnNkZGIsICZrcmVjLCAwKTsKKyAgICAgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHZhbHVlLCAicyMiLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJic2RkYiB2YWx1ZSB0eXBlIG11c3QgYmUgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZHJlYy5kYXRhID0gZGF0YTsKKyAgICAgICAgZHJlYy5zaXplID0gc2l6ZTsKKyAgICAgICAgQlNEREJfQkdOX1NBVkUoZHApCisgICAgICAgIHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnB1dCkoZHAtPmRpX2JzZGRiLCAma3JlYywgJmRyZWMsIDApOworICAgICAgICBCU0REQl9FTkRfU0FWRShkcCkKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGtleSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIGJzZGRiX2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpYnNkZGJfbGVuZ3RoLAkJLyptcF9sZW5ndGgqLwotCShiaW5hcnlmdW5jKWJzZGRiX3N1YnNjcmlwdCwJLyptcF9zdWJzY3JpcHQqLwotCShvYmpvYmphcmdwcm9jKWJzZGRiX2Fzc19zdWIsCS8qbXBfYXNzX3N1YnNjcmlwdCovCisgICAgKGxlbmZ1bmMpYnNkZGJfbGVuZ3RoLCAgICAgICAgICAgICAgLyptcF9sZW5ndGgqLworICAgIChiaW5hcnlmdW5jKWJzZGRiX3N1YnNjcmlwdCwgICAgICAgIC8qbXBfc3Vic2NyaXB0Ki8KKyAgICAob2Jqb2JqYXJncHJvYylic2RkYl9hc3Nfc3ViLCAgICAgICAvKm1wX2Fzc19zdWJzY3JpcHQqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX2Nsb3NlKGJzZGRib2JqZWN0ICpkcCkKIHsKLQlpZiAoZHAtPmRpX2JzZGRiICE9IE5VTEwpIHsKLQkJaW50IHN0YXR1czsKLQkJQlNEREJfQkdOX1NBVkUoZHApCi0JCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPmNsb3NlKShkcC0+ZGlfYnNkZGIpOwotCQlCU0REQl9FTkRfU0FWRShkcCkKLQkJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCQlkcC0+ZGlfYnNkZGIgPSBOVUxMOwotCQkJUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZHAtPmRpX2JzZGRiID0gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGRwLT5kaV9ic2RkYiAhPSBOVUxMKSB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIEJTRERCX0JHTl9TQVZFKGRwKQorICAgICAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5jbG9zZSkoZHAtPmRpX2JzZGRiKTsKKyAgICAgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgZHAtPmRpX2JzZGRiID0gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGRwLT5kaV9ic2RkYiA9IE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfa2V5cyhic2RkYm9iamVjdCAqZHApCiB7Ci0JUHlPYmplY3QgKmxpc3QsICppdGVtPU5VTEw7Ci0JREJUIGtyZWMsIGRyZWM7Ci0JY2hhciAqZGF0YT1OVUxMLGJ1Zls0MDk2XTsKLQlpbnQgc3RhdHVzOwotCWludCBlcnI7CisgICAgUHlPYmplY3QgKmxpc3QsICppdGVtPU5VTEw7CisgICAgREJUIGtyZWMsIGRyZWM7CisgICAgY2hhciAqZGF0YT1OVUxMLGJ1Zls0MDk2XTsKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBlcnI7CiAKLQljaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCBOVUxMKTsKLQlsaXN0ID0gUHlMaXN0X05ldygwKTsKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlCU0REQl9CR05fU0FWRShkcCkKLQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCBSX0ZJUlNUKTsKLQlpZiAoc3RhdHVzID09IDApIHsKLQkJaWYgKGtyZWMuc2l6ZSA+IHNpemVvZihidWYpKSBkYXRhID0gbWFsbG9jKGtyZWMuc2l6ZSk7Ci0JCWVsc2UgZGF0YSA9IGJ1ZjsKLQkJaWYgKGRhdGEgIT0gTlVMTCkgbWVtY3B5KGRhdGEsa3JlYy5kYXRhLGtyZWMuc2l6ZSk7Ci0JfQotCUJTRERCX0VORF9TQVZFKGRwKQotCWlmIChzdGF0dXMgPT0gMCAmJiBkYXRhPT1OVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl3aGlsZSAoc3RhdHVzID09IDApIHsKLQkJaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKQotCQkJaXRlbSA9IFB5SW50X0Zyb21Mb25nKCooKGludCopZGF0YSkpOwotCQllbHNlCi0JCQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwKLQkJCQkJCQkgIChpbnQpa3JlYy5zaXplKTsKLQkJaWYgKGRhdGEgIT0gYnVmKSBmcmVlKGRhdGEpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYobGlzdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCWlmIChlcnIgIT0gMCkgewotCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJQlNEREJfQkdOX1NBVkUoZHApCi0JCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnNlcSkKLQkJCShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgUl9ORVhUKTsKLQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQlpZiAoa3JlYy5zaXplID4gc2l6ZW9mKGJ1ZikpCi0JCQkJZGF0YSA9IG1hbGxvYyhrcmVjLnNpemUpOwotCQkJZWxzZSBkYXRhID0gYnVmOwotCQkJaWYgKGRhdGEgIT0gTlVMTCkKLQkJCQltZW1jcHkoZGF0YSxrcmVjLmRhdGEsa3JlYy5zaXplKTsKLQkJfQotCQlCU0REQl9FTkRfU0FWRShkcCkKLQkJaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJUHlfREVDUkVGKGxpc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGRwLT5kaV9zaXplIDwgMCkKLQkJZHAtPmRpX3NpemUgPSBQeUxpc3RfU2l6ZShsaXN0KTsgLyogV2UganVzdCBkaWQgdGhlIHdvcmsgKi8KLQlyZXR1cm4gbGlzdDsKKyAgICBjaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCBOVUxMKTsKKyAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCBSX0ZJUlNUKTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaWYgKGtyZWMuc2l6ZSA+IHNpemVvZihidWYpKSBkYXRhID0gbWFsbG9jKGtyZWMuc2l6ZSk7CisgICAgICAgIGVsc2UgZGF0YSA9IGJ1ZjsKKyAgICAgICAgaWYgKGRhdGEgIT0gTlVMTCkgbWVtY3B5KGRhdGEsa3JlYy5kYXRhLGtyZWMuc2l6ZSk7CisgICAgfQorICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgIGlmIChzdGF0dXMgPT0gMCAmJiBkYXRhPT1OVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB3aGlsZSAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKQorICAgICAgICAgICAgaXRlbSA9IFB5SW50X0Zyb21Mb25nKCooKGludCopZGF0YSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWtyZWMuc2l6ZSk7CisgICAgICAgIGlmIChkYXRhICE9IGJ1ZikgZnJlZShkYXRhKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIEJTRERCX0JHTl9TQVZFKGRwKQorICAgICAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpCisgICAgICAgICAgICAoZHAtPmRpX2JzZGRiLCAma3JlYywgJmRyZWMsIFJfTkVYVCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgaWYgKGtyZWMuc2l6ZSA+IHNpemVvZihidWYpKQorICAgICAgICAgICAgICAgIGRhdGEgPSBtYWxsb2Moa3JlYy5zaXplKTsKKyAgICAgICAgICAgIGVsc2UgZGF0YSA9IGJ1ZjsKKyAgICAgICAgICAgIGlmIChkYXRhICE9IE5VTEwpCisgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGEsa3JlYy5kYXRhLGtyZWMuc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgIFB5X0RFQ1JFRihsaXN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkcC0+ZGlfc2l6ZSA8IDApCisgICAgICAgIGRwLT5kaV9zaXplID0gUHlMaXN0X1NpemUobGlzdCk7IC8qIFdlIGp1c3QgZGlkIHRoZSB3b3JrICovCisgICAgcmV0dXJuIGxpc3Q7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9oYXNfa2V5KGJzZGRib2JqZWN0ICpkcCwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JREJUIGtyZWMsIGRyZWM7Ci0JaW50IHN0YXR1czsKLQljaGFyICpkYXRhOwotCWludCBzaXplOwotCXJlY25vX3QgcmVjbm87CisgICAgREJUIGtyZWMsIGRyZWM7CisgICAgaW50IHN0YXR1czsKKyAgICBjaGFyICpkYXRhOworICAgIGludCBzaXplOworICAgIHJlY25vX3QgcmVjbm87CiAKLQlpZiAoZHAtPmRpX3R5cGUgPT0gREJfUkVDTk8pIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpO2tleSB0eXBlIG11c3QgYmUgaW50ZWdlciIsCi0JCQkJICAgICAgJnJlY25vKSkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJa3JlYy5kYXRhID0gJnJlY25vOwotCQlrcmVjLnNpemUgPSBzaXplb2YocmVjbm8pOwotCX0KLQllbHNlIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIztrZXkgdHlwZSBtdXN0IGJlIHN0cmluZyIsCi0JCQkJICAgICAgJmRhdGEsICZzaXplKSkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJa3JlYy5kYXRhID0gZGF0YTsKLQkJa3JlYy5zaXplID0gc2l6ZTsKLQl9Ci0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7CisgICAgaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTtrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY25vKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gJnJlY25vOworICAgICAgICBrcmVjLnNpemUgPSBzaXplb2YocmVjbm8pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIztrZXkgdHlwZSBtdXN0IGJlIHN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBrcmVjLmRhdGEgPSBkYXRhOworICAgICAgICBrcmVjLnNpemUgPSBzaXplOworICAgIH0KKyAgICBjaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCBOVUxMKTsKIAotCUJTRERCX0JHTl9TQVZFKGRwKQotCXN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPmdldCkoZHAtPmRpX2JzZGRiLCAma3JlYywgJmRyZWMsIDApOwotCUJTRERCX0VORF9TQVZFKGRwKQotCWlmIChzdGF0dXMgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIEJTRERCX0JHTl9TQVZFKGRwKQorICAgIHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPmdldCkoZHAtPmRpX2JzZGRiLCAma3JlYywgJmRyZWMsIDApOworICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHN0YXR1cyA9PSAwKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc3RhdHVzID09IDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfc2V0X2xvY2F0aW9uKGJzZGRib2JqZWN0ICpkcCwgUHlPYmplY3QgKmtleSkKIHsKLQlpbnQgc3RhdHVzOwotCURCVCBrcmVjLCBkcmVjOwotCWNoYXIgKmRhdGEsYnVmWzQwOTZdOwotCWludCBzaXplOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JcmVjbm9fdCByZWNubzsKKyAgICBpbnQgc3RhdHVzOworICAgIERCVCBrcmVjLCBkcmVjOworICAgIGNoYXIgKmRhdGEsYnVmWzQwOTZdOworICAgIGludCBzaXplOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgcmVjbm9fdCByZWNubzsKIAotCWlmIChkcC0+ZGlfdHlwZSA9PSBEQl9SRUNOTykgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoa2V5LCAiaTtrZXkgdHlwZSBtdXN0IGJlIGludGVnZXIiLAotCQkJCSAgICAgICZyZWNubykpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWtyZWMuZGF0YSA9ICZyZWNubzsKLQkJa3JlYy5zaXplID0gc2l6ZW9mKHJlY25vKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShrZXksICJzIztrZXkgdHlwZSBtdXN0IGJlIHN0cmluZyIsCi0JCQkJICAgICAgJmRhdGEsICZzaXplKSkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJa3JlYy5kYXRhID0gZGF0YTsKLQkJa3JlYy5zaXplID0gc2l6ZTsKLQl9Ci0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7CisgICAgaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShrZXksICJpO2tleSB0eXBlIG11c3QgYmUgaW50ZWdlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjbm8pKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBrcmVjLmRhdGEgPSAmcmVjbm87CisgICAgICAgIGtyZWMuc2l6ZSA9IHNpemVvZihyZWNubyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoa2V5LCAicyM7a2V5IHR5cGUgbXVzdCBiZSBzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAga3JlYy5kYXRhID0gZGF0YTsKKyAgICAgICAga3JlYy5zaXplID0gc2l6ZTsKKyAgICB9CisgICAgY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7CiAKLQlCU0REQl9CR05fU0FWRShkcCkKLQlzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwgJmtyZWMsICZkcmVjLCBSX0NVUlNPUik7Ci0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmIChkcmVjLnNpemUgPiBzaXplb2YoYnVmKSkgZGF0YSA9IG1hbGxvYyhkcmVjLnNpemUpOwotCQllbHNlIGRhdGEgPSBidWY7Ci0JCWlmIChkYXRhIT1OVUxMKSBtZW1jcHkoZGF0YSxkcmVjLmRhdGEsZHJlYy5zaXplKTsKLQl9Ci0JQlNEREJfRU5EX1NBVkUoZHApCi0JaWYgKGRhdGE9PU5VTEwpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlpZiAoc3RhdHVzIDwgMCkKLQkJCVB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBrZXkpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgQlNEREJfQkdOX1NBVkUoZHApCisgICAgc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsICZrcmVjLCAmZHJlYywgUl9DVVJTT1IpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpZiAoZHJlYy5zaXplID4gc2l6ZW9mKGJ1ZikpIGRhdGEgPSBtYWxsb2MoZHJlYy5zaXplKTsKKyAgICAgICAgZWxzZSBkYXRhID0gYnVmOworICAgICAgICBpZiAoZGF0YSE9TlVMTCkgbWVtY3B5KGRhdGEsZHJlYy5kYXRhLGRyZWMuc2l6ZSk7CisgICAgfQorICAgIEJTRERCX0VORF9TQVZFKGRwKQorICAgIGlmIChkYXRhPT1OVUxMKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwga2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKQotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJpcyMiLCAqKChpbnQqKWtyZWMuZGF0YSksCi0JCQkJICAgICAgIGRhdGEsIGRyZWMuc2l6ZSk7Ci0JZWxzZQotCQlyZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzI3MjIiwga3JlYy5kYXRhLCBrcmVjLnNpemUsCi0JCQkJICAgICAgIGRhdGEsIGRyZWMuc2l6ZSk7Ci0JaWYgKGRhdGEgIT0gYnVmKSBmcmVlKGRhdGEpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKQorICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJpcyMiLCAqKChpbnQqKWtyZWMuZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZHJlYy5zaXplKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoInMjcyMiLCBrcmVjLmRhdGEsIGtyZWMuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBkcmVjLnNpemUpOworICAgIGlmIChkYXRhICE9IGJ1ZikgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfc2VxKGJzZGRib2JqZWN0ICpkcCwgaW50IHNlcXVlbmNlX3JlcXVlc3QpCiB7Ci0JaW50IHN0YXR1czsKLQlEQlQga3JlYywgZHJlYzsKLQljaGFyICprZGF0YT1OVUxMLGtidWZbNDA5Nl07Ci0JY2hhciAqZGRhdGE9TlVMTCxkYnVmWzQwOTZdOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IHN0YXR1czsKKyAgICBEQlQga3JlYywgZHJlYzsKKyAgICBjaGFyICprZGF0YT1OVUxMLGtidWZbNDA5Nl07CisgICAgY2hhciAqZGRhdGE9TlVMTCxkYnVmWzQwOTZdOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQljaGVja19ic2RkYm9iamVjdF9vcGVuKGRwLCBOVUxMKTsKLQlrcmVjLmRhdGEgPSAwOwotCWtyZWMuc2l6ZSA9IDA7CisgICAgY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7CisgICAga3JlYy5kYXRhID0gMDsKKyAgICBrcmVjLnNpemUgPSAwOwogCi0JQlNEREJfQkdOX1NBVkUoZHApCi0Jc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c2VxKShkcC0+ZGlfYnNkZGIsICZrcmVjLAotCQkJCSAgICAgJmRyZWMsIHNlcXVlbmNlX3JlcXVlc3QpOwotCWlmIChzdGF0dXMgPT0gMCkgewotCQlpZiAoa3JlYy5zaXplID4gc2l6ZW9mKGtidWYpKSBrZGF0YSA9IG1hbGxvYyhrcmVjLnNpemUpOwotCQllbHNlIGtkYXRhID0ga2J1ZjsKLQkJaWYgKGtkYXRhICE9IE5VTEwpIG1lbWNweShrZGF0YSxrcmVjLmRhdGEsa3JlYy5zaXplKTsKLQkJaWYgKGRyZWMuc2l6ZSA+IHNpemVvZihkYnVmKSkgZGRhdGEgPSBtYWxsb2MoZHJlYy5zaXplKTsKLQkJZWxzZSBkZGF0YSA9IGRidWY7Ci0JCWlmIChkZGF0YSAhPSBOVUxMKSBtZW1jcHkoZGRhdGEsZHJlYy5kYXRhLGRyZWMuc2l6ZSk7Ci0JfQotCUJTRERCX0VORF9TQVZFKGRwKQotCWlmIChzdGF0dXMgPT0gMCkgewotCQlpZiAoKGtkYXRhID09IE5VTEwpIHx8IChkZGF0YSA9PSBOVUxMKSkgCi0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JZWxzZSB7IAotCQkvKiAoc3RhdHVzICE9IDApICovICAKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oQnNkZGJFcnJvcik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgIm5vIGtleS9kYXRhIHBhaXJzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBCU0REQl9CR05fU0FWRShkcCkKKyAgICBzdGF0dXMgPSAoZHAtPmRpX2JzZGRiLT5zZXEpKGRwLT5kaV9ic2RkYiwgJmtyZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJlYywgc2VxdWVuY2VfcmVxdWVzdCk7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGlmIChrcmVjLnNpemUgPiBzaXplb2Yoa2J1ZikpIGtkYXRhID0gbWFsbG9jKGtyZWMuc2l6ZSk7CisgICAgICAgIGVsc2Uga2RhdGEgPSBrYnVmOworICAgICAgICBpZiAoa2RhdGEgIT0gTlVMTCkgbWVtY3B5KGtkYXRhLGtyZWMuZGF0YSxrcmVjLnNpemUpOworICAgICAgICBpZiAoZHJlYy5zaXplID4gc2l6ZW9mKGRidWYpKSBkZGF0YSA9IG1hbGxvYyhkcmVjLnNpemUpOworICAgICAgICBlbHNlIGRkYXRhID0gZGJ1ZjsKKyAgICAgICAgaWYgKGRkYXRhICE9IE5VTEwpIG1lbWNweShkZGF0YSxkcmVjLmRhdGEsZHJlYy5zaXplKTsKKyAgICB9CisgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGlmICgoa2RhdGEgPT0gTlVMTCkgfHwgKGRkYXRhID09IE5VTEwpKQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiAoc3RhdHVzICE9IDApICovCisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJubyBrZXkvZGF0YSBwYWlycyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZHAtPmRpX3R5cGUgPT0gREJfUkVDTk8pCi0JCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoImlzIyIsICooKGludCopa2RhdGEpLAotCQkJCSAgICAgICBkZGF0YSwgZHJlYy5zaXplKTsKLQllbHNlCi0JCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoInMjcyMiLCBrZGF0YSwga3JlYy5zaXplLAotCQkJCSAgICAgICBkZGF0YSwgZHJlYy5zaXplKTsKLQlpZiAoa2RhdGEgIT0ga2J1ZikgZnJlZShrZGF0YSk7Ci0JaWYgKGRkYXRhICE9IGRidWYpIGZyZWUoZGRhdGEpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKGRwLT5kaV90eXBlID09IERCX1JFQ05PKQorICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJpcyMiLCAqKChpbnQqKWtkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZGF0YSwgZHJlYy5zaXplKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoInMjcyMiLCBrZGF0YSwga3JlYy5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkYXRhLCBkcmVjLnNpemUpOworICAgIGlmIChrZGF0YSAhPSBrYnVmKSBmcmVlKGtkYXRhKTsKKyAgICBpZiAoZGRhdGEgIT0gZGJ1ZikgZnJlZShkZGF0YSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX25leHQoYnNkZGJvYmplY3QgKmRwKQogewotCXJldHVybiBic2RkYl9zZXEoZHAsIFJfTkVYVCk7CisgICAgcmV0dXJuIGJzZGRiX3NlcShkcCwgUl9ORVhUKTsKIH0KIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9wcmV2aW91cyhic2RkYm9iamVjdCAqZHApCiB7Ci0JcmV0dXJuIGJzZGRiX3NlcShkcCwgUl9QUkVWKTsKKyAgICByZXR1cm4gYnNkZGJfc2VxKGRwLCBSX1BSRVYpOwogfQogc3RhdGljIFB5T2JqZWN0ICoKIGJzZGRiX2ZpcnN0KGJzZGRib2JqZWN0ICpkcCkKIHsKLQlyZXR1cm4gYnNkZGJfc2VxKGRwLCBSX0ZJUlNUKTsKKyAgICByZXR1cm4gYnNkZGJfc2VxKGRwLCBSX0ZJUlNUKTsKIH0KIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9sYXN0KGJzZGRib2JqZWN0ICpkcCkKIHsKLQlyZXR1cm4gYnNkZGJfc2VxKGRwLCBSX0xBU1QpOworICAgIHJldHVybiBic2RkYl9zZXEoZHAsIFJfTEFTVCk7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogYnNkZGJfc3luYyhic2RkYm9iamVjdCAqZHApCiB7Ci0JaW50IHN0YXR1czsKKyAgICBpbnQgc3RhdHVzOwogCi0JY2hlY2tfYnNkZGJvYmplY3Rfb3BlbihkcCwgTlVMTCk7Ci0JQlNEREJfQkdOX1NBVkUoZHApCi0Jc3RhdHVzID0gKGRwLT5kaV9ic2RkYi0+c3luYykoZHAtPmRpX2JzZGRiLCAwKTsKLQlCU0REQl9FTkRfU0FWRShkcCkKLQlpZiAoc3RhdHVzICE9IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKEJzZGRiRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHN0YXR1cyA9IDApOworICAgIGNoZWNrX2JzZGRib2JqZWN0X29wZW4oZHAsIE5VTEwpOworICAgIEJTRERCX0JHTl9TQVZFKGRwKQorICAgIHN0YXR1cyA9IChkcC0+ZGlfYnNkZGItPnN5bmMpKGRwLT5kaV9ic2RkYiwgMCk7CisgICAgQlNEREJfRU5EX1NBVkUoZHApCisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhCc2RkYkVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzdGF0dXMgPSAwKTsKIH0KIHN0YXRpYyBQeU1ldGhvZERlZiBic2RkYl9tZXRob2RzW10gPSB7Ci0JeyJjbG9zZSIsCQkoUHlDRnVuY3Rpb24pYnNkZGJfY2xvc2UsIE1FVEhfTk9BUkdTfSwKLQl7ImtleXMiLAkJKFB5Q0Z1bmN0aW9uKWJzZGRiX2tleXMsIE1FVEhfTk9BUkdTfSwKLQl7Imhhc19rZXkiLAkJKFB5Q0Z1bmN0aW9uKWJzZGRiX2hhc19rZXksIE1FVEhfVkFSQVJHU30sCi0JeyJzZXRfbG9jYXRpb24iLAkoUHlDRnVuY3Rpb24pYnNkZGJfc2V0X2xvY2F0aW9uLCBNRVRIX1ZBUkFSR1N9LAotCXsibmV4dCIsCQkoUHlDRnVuY3Rpb24pYnNkZGJfbmV4dCwgTUVUSF9OT0FSR1N9LAotCXsicHJldmlvdXMiLAkoUHlDRnVuY3Rpb24pYnNkZGJfcHJldmlvdXMsIE1FVEhfTk9BUkdTfSwKLQl7ImZpcnN0IiwJCShQeUNGdW5jdGlvbilic2RkYl9maXJzdCwgTUVUSF9OT0FSR1N9LAotCXsibGFzdCIsCQkoUHlDRnVuY3Rpb24pYnNkZGJfbGFzdCwgTUVUSF9OT0FSR1N9LAotCXsic3luYyIsCQkoUHlDRnVuY3Rpb24pYnNkZGJfc3luYywgTUVUSF9OT0FSR1N9LAotCXtOVUxMLAkgICAgICAgCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiY2xvc2UiLCAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfY2xvc2UsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImtleXMiLCAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJzZGRiX2tleXMsIE1FVEhfTk9BUkdTfSwKKyAgICB7Imhhc19rZXkiLCAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJzZGRiX2hhc19rZXksIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRfbG9jYXRpb24iLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RkYl9zZXRfbG9jYXRpb24sIE1FVEhfVkFSQVJHU30sCisgICAgeyJuZXh0IiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RkYl9uZXh0LCBNRVRIX05PQVJHU30sCisgICAgeyJwcmV2aW91cyIsICAgICAgICAoUHlDRnVuY3Rpb24pYnNkZGJfcHJldmlvdXMsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImZpcnN0IiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJzZGRiX2ZpcnN0LCBNRVRIX05PQVJHU30sCisgICAgeyJsYXN0IiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RkYl9sYXN0LCBNRVRIX05PQVJHU30sCisgICAgeyJzeW5jIiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilic2RkYl9zeW5jLCBNRVRIX05PQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBic2RkYl9nZXRhdHRyKFB5T2JqZWN0ICpkcCwgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChic2RkYl9tZXRob2RzLCBkcCwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoYnNkZGJfbWV0aG9kcywgZHAsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEJzZGRidHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLAotCSJic2RkYi5ic2RkYiIsCi0Jc2l6ZW9mKGJzZGRib2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWJzZGRiX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpYnNkZGJfZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCSZic2RkYl9hc19tYXBwaW5nLAkvKnRwX2FzX21hcHBpbmcqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsCisgICAgImJzZGRiLmJzZGRiIiwKKyAgICBzaXplb2YoYnNkZGJvYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpYnNkZGJfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWJzZGRiX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgJmJzZGRiX2FzX21hcHBpbmcsICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkaGFzaG9wZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmZpbGU7Ci0JY2hhciAqZmxhZyA9IE5VTEw7Ci0JaW50IGZsYWdzID0gT19SRE9OTFk7Ci0JaW50IG1vZGUgPSAwNjY2OwotCWludCBic2l6ZSA9IDA7Ci0JaW50IGZmYWN0b3IgPSAwOwotCWludCBuZWxlbSA9IDA7Ci0JaW50IGNhY2hlc2l6ZSA9IDA7Ci0JaW50IGhhc2ggPSAwOyAvKiBYWFggY3VycmVudGx5IGlnbm9yZWQgKi8KLQlpbnQgbG9yZGVyID0gMDsKKyAgICBjaGFyICpmaWxlOworICAgIGNoYXIgKmZsYWcgPSBOVUxMOworICAgIGludCBmbGFncyA9IE9fUkRPTkxZOworICAgIGludCBtb2RlID0gMDY2NjsKKyAgICBpbnQgYnNpemUgPSAwOworICAgIGludCBmZmFjdG9yID0gMDsKKyAgICBpbnQgbmVsZW0gPSAwOworICAgIGludCBjYWNoZXNpemUgPSAwOworICAgIGludCBoYXNoID0gMDsgLyogWFhYIGN1cnJlbnRseSBpZ25vcmVkICovCisgICAgaW50IGxvcmRlciA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp8c2lpaWlpaWk6aGFzaG9wZW4iLAotCQkJICAgICAgJmZpbGUsICZmbGFnLCAmbW9kZSwKLQkJCSAgICAgICZic2l6ZSwgJmZmYWN0b3IsICZuZWxlbSwgJmNhY2hlc2l6ZSwKLQkJCSAgICAgICZoYXNoLCAmbG9yZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGZsYWcgIT0gTlVMTCkgewotCQkvKiBYWFggbmVlZCB0byBwYXNzIE9fRVhDTCwgT19FWExPQ0ssIE9fTk9OQkxPQ0ssIE9fU0hMT0NLICovCi0JCWlmIChmbGFnWzBdID09ICdyJykKLQkJCWZsYWdzID0gT19SRE9OTFk7Ci0JCWVsc2UgaWYgKGZsYWdbMF0gPT0gJ3cnKQotCQkJZmxhZ3MgPSBPX1JEV1I7Ci0JCWVsc2UgaWYgKGZsYWdbMF0gPT0gJ2MnKQotCQkJZmxhZ3MgPSBPX1JEV1J8T19DUkVBVDsKLQkJZWxzZSBpZiAoZmxhZ1swXSA9PSAnbicpCi0JCQlmbGFncyA9IE9fUkRXUnxPX0NSRUFUfE9fVFJVTkM7Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCi0JCQkJIkZsYWcgc2hvdWxkIGJlZ2luIHdpdGggJ3InLCAndycsICdjJyBvciAnbiciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChmbGFnWzFdID09ICdsJykgeworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxzaWlpaWlpaTpoYXNob3BlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlLCAmZmxhZywgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZic2l6ZSwgJmZmYWN0b3IsICZuZWxlbSwgJmNhY2hlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc2gsICZsb3JkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgICAgIC8qIFhYWCBuZWVkIHRvIHBhc3MgT19FWENMLCBPX0VYTE9DSywgT19OT05CTE9DSywgT19TSExPQ0sgKi8KKyAgICAgICAgaWYgKGZsYWdbMF0gPT0gJ3InKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JET05MWTsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAndycpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUjsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAnYycpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUnxPX0NSRUFUOworICAgICAgICBlbHNlIGlmIChmbGFnWzBdID09ICduJykKKyAgICAgICAgICAgIGZsYWdzID0gT19SRFdSfE9fQ1JFQVR8T19UUlVOQzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKKyAgICAgICAgICAgICAgICAiRmxhZyBzaG91bGQgYmVnaW4gd2l0aCAncicsICd3JywgJ2MnIG9yICduJyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdbMV0gPT0gJ2wnKSB7CiAjaWYgZGVmaW5lZChPX0VYTE9DSykgJiYgZGVmaW5lZChPX1NITE9DSykKLQkJCWlmIChmbGFnWzBdID09ICdyJykKLQkJCQlmbGFncyB8PSBPX1NITE9DSzsKLQkJCWVsc2UKLQkJCQlmbGFncyB8PSBPX0VYTE9DSzsKKyAgICAgICAgICAgIGlmIChmbGFnWzBdID09ICdyJykKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBPX1NITE9DSzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBPX0VYTE9DSzsKICNlbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKLQkJCQkgICAgICJsb2NraW5nIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOwotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibG9ja2luZyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCi0JCX0KLQl9Ci0JcmV0dXJuIG5ld2RiaGFzaG9iamVjdChmaWxlLCBmbGFncywgbW9kZSwKLQkJCSAgICAgICBic2l6ZSwgZmZhY3RvciwgbmVsZW0sIGNhY2hlc2l6ZSwgaGFzaCwgbG9yZGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3ZGJoYXNob2JqZWN0KGZpbGUsIGZsYWdzLCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNpemUsIGZmYWN0b3IsIG5lbGVtLCBjYWNoZXNpemUsIGhhc2gsIGxvcmRlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBic2RidG9wZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmZpbGU7Ci0JY2hhciAqZmxhZyA9IE5VTEw7Ci0JaW50IGZsYWdzID0gT19SRE9OTFk7Ci0JaW50IG1vZGUgPSAwNjY2OwotCWludCBjYWNoZXNpemUgPSAwOwotCWludCBtYXhrZXlwYWdlID0gMDsKLQlpbnQgbWlua2V5cGFnZSA9IDA7Ci0JaW50IGJ0ZmxhZ3MgPSAwOwotCXVuc2lnbmVkIGludCBwc2l6ZSA9IDA7Ci0JaW50IGxvcmRlciA9IDA7CisgICAgY2hhciAqZmlsZTsKKyAgICBjaGFyICpmbGFnID0gTlVMTDsKKyAgICBpbnQgZmxhZ3MgPSBPX1JET05MWTsKKyAgICBpbnQgbW9kZSA9IDA2NjY7CisgICAgaW50IGNhY2hlc2l6ZSA9IDA7CisgICAgaW50IG1heGtleXBhZ2UgPSAwOworICAgIGludCBtaW5rZXlwYWdlID0gMDsKKyAgICBpbnQgYnRmbGFncyA9IDA7CisgICAgdW5zaWduZWQgaW50IHBzaXplID0gMDsKKyAgICBpbnQgbG9yZGVyID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxzaWlpaWlpaTpidG9wZW4iLAotCQkJICAgICAgJmZpbGUsICZmbGFnLCAmbW9kZSwKLQkJCSAgICAgICZidGZsYWdzLCAmY2FjaGVzaXplLCAmbWF4a2V5cGFnZSwgJm1pbmtleXBhZ2UsCi0JCQkgICAgICAmcHNpemUsICZsb3JkZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZmxhZyAhPSBOVUxMKSB7Ci0JCS8qIFhYWCBuZWVkIHRvIHBhc3MgT19FWENMLCBPX0VYTE9DSywgT19OT05CTE9DSywgT19TSExPQ0sgKi8KLQkJaWYgKGZsYWdbMF0gPT0gJ3InKQotCQkJZmxhZ3MgPSBPX1JET05MWTsKLQkJZWxzZSBpZiAoZmxhZ1swXSA9PSAndycpCi0JCQlmbGFncyA9IE9fUkRXUjsKLQkJZWxzZSBpZiAoZmxhZ1swXSA9PSAnYycpCi0JCQlmbGFncyA9IE9fUkRXUnxPX0NSRUFUOwotCQllbHNlIGlmIChmbGFnWzBdID09ICduJykKLQkJCWZsYWdzID0gT19SRFdSfE9fQ1JFQVR8T19UUlVOQzsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKLQkJCSAgICAgICAiRmxhZyBzaG91bGQgYmVnaW4gd2l0aCAncicsICd3JywgJ2MnIG9yICduJyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGZsYWdbMV0gPT0gJ2wnKSB7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6fHNpaWlpaWlpOmJ0b3BlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlLCAmZmxhZywgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidGZsYWdzLCAmY2FjaGVzaXplLCAmbWF4a2V5cGFnZSwgJm1pbmtleXBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwc2l6ZSwgJmxvcmRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChmbGFnICE9IE5VTEwpIHsKKyAgICAgICAgLyogWFhYIG5lZWQgdG8gcGFzcyBPX0VYQ0wsIE9fRVhMT0NLLCBPX05PTkJMT0NLLCBPX1NITE9DSyAqLworICAgICAgICBpZiAoZmxhZ1swXSA9PSAncicpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRPTkxZOworICAgICAgICBlbHNlIGlmIChmbGFnWzBdID09ICd3JykKKyAgICAgICAgICAgIGZsYWdzID0gT19SRFdSOworICAgICAgICBlbHNlIGlmIChmbGFnWzBdID09ICdjJykKKyAgICAgICAgICAgIGZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7CisgICAgICAgIGVsc2UgaWYgKGZsYWdbMF0gPT0gJ24nKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JEV1J8T19DUkVBVHxPX1RSVU5DOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAorICAgICAgICAgICAgICAgICAgICJGbGFnIHNob3VsZCBiZWdpbiB3aXRoICdyJywgJ3cnLCAnYycgb3IgJ24nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxhZ1sxXSA9PSAnbCcpIHsKICNpZiBkZWZpbmVkKE9fRVhMT0NLKSAmJiBkZWZpbmVkKE9fU0hMT0NLKQotCQkJaWYgKGZsYWdbMF0gPT0gJ3InKQotCQkJCWZsYWdzIHw9IE9fU0hMT0NLOwotCQkJZWxzZQotCQkJCWZsYWdzIHw9IE9fRVhMT0NLOworICAgICAgICAgICAgaWYgKGZsYWdbMF0gPT0gJ3InKQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IE9fU0hMT0NLOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZsYWdzIHw9IE9fRVhMT0NLOwogI2Vsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAotCQkJCSAgICAibG9ja2luZyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKLQkJCXJldHVybiBOVUxMOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibG9ja2luZyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmCi0JCX0KLQl9Ci0JcmV0dXJuIG5ld2RiYnRvYmplY3QoZmlsZSwgZmxhZ3MsIG1vZGUsCi0JCQkgICAgIGJ0ZmxhZ3MsIGNhY2hlc2l6ZSwgbWF4a2V5cGFnZSwgbWlua2V5cGFnZSwKLQkJCSAgICAgcHNpemUsIGxvcmRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ld2RiYnRvYmplY3QoZmlsZSwgZmxhZ3MsIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnRmbGFncywgY2FjaGVzaXplLCBtYXhrZXlwYWdlLCBtaW5rZXlwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBzaXplLCBsb3JkZXIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnNkcm5vcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmaWxlOwotCWNoYXIgKmZsYWcgPSBOVUxMOwotCWludCBmbGFncyA9IE9fUkRPTkxZOwotCWludCBtb2RlID0gMDY2NjsKLQlpbnQgY2FjaGVzaXplID0gMDsKLQlpbnQgcm5mbGFncyA9IDA7Ci0JdW5zaWduZWQgaW50IHBzaXplID0gMDsKLQlpbnQgbG9yZGVyID0gMDsKLQlzaXplX3QgcmVjbGVuID0gMDsKLQljaGFyICAqYnZhbCA9ICIiOwotCWNoYXIgKmJmbmFtZSA9IE5VTEw7CisgICAgY2hhciAqZmlsZTsKKyAgICBjaGFyICpmbGFnID0gTlVMTDsKKyAgICBpbnQgZmxhZ3MgPSBPX1JET05MWTsKKyAgICBpbnQgbW9kZSA9IDA2NjY7CisgICAgaW50IGNhY2hlc2l6ZSA9IDA7CisgICAgaW50IHJuZmxhZ3MgPSAwOworICAgIHVuc2lnbmVkIGludCBwc2l6ZSA9IDA7CisgICAgaW50IGxvcmRlciA9IDA7CisgICAgc2l6ZV90IHJlY2xlbiA9IDA7CisgICAgY2hhciAgKmJ2YWwgPSAiIjsKKyAgICBjaGFyICpiZm5hbWUgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6fHNpaWlpaWlzczpybm9wZW4iLAotCQkJICAgICAgJmZpbGUsICZmbGFnLCAmbW9kZSwKLQkJCSAgICAgICZybmZsYWdzLCAmY2FjaGVzaXplLCAmcHNpemUsICZsb3JkZXIsCi0JCQkgICAgICAmcmVjbGVuLCAmYnZhbCwgJmJmbmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienxzaWlpaWlpc3M6cm5vcGVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGUsICZmbGFnLCAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJuZmxhZ3MsICZjYWNoZXNpemUsICZwc2l6ZSwgJmxvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY2xlbiwgJmJ2YWwsICZiZm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChmbGFnICE9IE5VTEwpIHsKLQkJLyogWFhYIG5lZWQgdG8gcGFzcyBPX0VYQ0wsIE9fRVhMT0NLLCBPX05PTkJMT0NLLCBPX1NITE9DSyAqLwotCQlpZiAoZmxhZ1swXSA9PSAncicpCi0JCQlmbGFncyA9IE9fUkRPTkxZOwotCQllbHNlIGlmIChmbGFnWzBdID09ICd3JykKLQkJCWZsYWdzID0gT19SRFdSOwotCQllbHNlIGlmIChmbGFnWzBdID09ICdjJykKLQkJCWZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7Ci0JCWVsc2UgaWYgKGZsYWdbMF0gPT0gJ24nKQotCQkJZmxhZ3MgPSBPX1JEV1J8T19DUkVBVHxPX1RSVU5DOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAotCQkJICAgICAgICJGbGFnIHNob3VsZCBiZWdpbiB3aXRoICdyJywgJ3cnLCAnYycgb3IgJ24nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoZmxhZ1sxXSA9PSAnbCcpIHsKKyAgICBpZiAoZmxhZyAhPSBOVUxMKSB7CisgICAgICAgIC8qIFhYWCBuZWVkIHRvIHBhc3MgT19FWENMLCBPX0VYTE9DSywgT19OT05CTE9DSywgT19TSExPQ0sgKi8KKyAgICAgICAgaWYgKGZsYWdbMF0gPT0gJ3InKQorICAgICAgICAgICAgZmxhZ3MgPSBPX1JET05MWTsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAndycpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUjsKKyAgICAgICAgZWxzZSBpZiAoZmxhZ1swXSA9PSAnYycpCisgICAgICAgICAgICBmbGFncyA9IE9fUkRXUnxPX0NSRUFUOworICAgICAgICBlbHNlIGlmIChmbGFnWzBdID09ICduJykKKyAgICAgICAgICAgIGZsYWdzID0gT19SRFdSfE9fQ1JFQVR8T19UUlVOQzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiRmxhZyBzaG91bGQgYmVnaW4gd2l0aCAncicsICd3JywgJ2MnIG9yICduJyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZsYWdbMV0gPT0gJ2wnKSB7CiAjaWYgZGVmaW5lZChPX0VYTE9DSykgJiYgZGVmaW5lZChPX1NITE9DSykKLQkJCWlmIChmbGFnWzBdID09ICdyJykKLQkJCQlmbGFncyB8PSBPX1NITE9DSzsKLQkJCWVsc2UKLQkJCQlmbGFncyB8PSBPX0VYTE9DSzsKKyAgICAgICAgICAgIGlmIChmbGFnWzBdID09ICdyJykKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBPX1NITE9DSzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBPX0VYTE9DSzsKICNlbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQnNkZGJFcnJvciwKLQkJCQkgICAgImxvY2tpbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7Ci0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhCc2RkYkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvY2tpbmcgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgotCQl9Ci0JCWVsc2UgaWYgKGZsYWdbMV0gIT0gJ1wwJykgewotCQkJUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCi0JCQkJICAgICAgICJGbGFnIGNoYXIgMiBzaG91bGQgYmUgJ2wnIG9yIGFic2VudCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIG5ld2Ricm5vYmplY3QoZmlsZSwgZmxhZ3MsIG1vZGUsIHJuZmxhZ3MsIGNhY2hlc2l6ZSwKLQkJCSAgICAgcHNpemUsIGxvcmRlciwgcmVjbGVuLCBidmFsWzBdLCBiZm5hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGZsYWdbMV0gIT0gJ1wwJykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEJzZGRiRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmxhZyBjaGFyIDIgc2hvdWxkIGJlICdsJyBvciBhYnNlbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXdkYnJub2JqZWN0KGZpbGUsIGZsYWdzLCBtb2RlLCBybmZsYWdzLCBjYWNoZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHNpemUsIGxvcmRlciwgcmVjbGVuLCBidmFsWzBdLCBiZm5hbWUpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgYnNkZGJtb2R1bGVfbWV0aG9kc1tdID0gewotCXsiaGFzaG9wZW4iLAkoUHlDRnVuY3Rpb24pYnNkaGFzaG9wZW4sIE1FVEhfVkFSQVJHU30sCi0JeyJidG9wZW4iLAkoUHlDRnVuY3Rpb24pYnNkYnRvcGVuLCBNRVRIX1ZBUkFSR1N9LAotCXsicm5vcGVuIiwJKFB5Q0Z1bmN0aW9uKWJzZHJub3BlbiwgTUVUSF9WQVJBUkdTfSwKLQkvKiBzdHJpY3RseSBmb3IgdXNlIGJ5IGRiaGhhc2ghISEgKi8KLQl7Im9wZW4iLAkoUHlDRnVuY3Rpb24pYnNkaGFzaG9wZW4sIE1FVEhfVkFSQVJHU30sCi0JezAsCQkwfSwKKyAgICB7Imhhc2hvcGVuIiwgICAgICAgIChQeUNGdW5jdGlvbilic2RoYXNob3BlbiwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImJ0b3BlbiIsICAgICAgICAgIChQeUNGdW5jdGlvbilic2RidG9wZW4sIE1FVEhfVkFSQVJHU30sCisgICAgeyJybm9wZW4iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYnNkcm5vcGVuLCBNRVRIX1ZBUkFSR1N9LAorICAgIC8qIHN0cmljdGx5IGZvciB1c2UgYnkgZGJoaGFzaCEhISAqLworICAgIHsib3BlbiIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJzZGhhc2hvcGVuLCBNRVRIX1ZBUkFSR1N9LAorICAgIHswLCAgICAgICAgICAgICAgICAgMH0sCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdGJzZGRiMTg1KHZvaWQpIHsKLQlQeU9iamVjdCAqbSwgKmQ7CisgICAgUHlPYmplY3QgKm0sICpkOwogCiAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgYnNkZGIxODUgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKLSAgICAgICAgcmV0dXJuOyAgICAKKyAgICByZXR1cm47CiAKLQlCc2RkYnR5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQltID0gUHlfSW5pdE1vZHVsZSgiYnNkZGIxODUiLCBic2RkYm1vZHVsZV9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JQnNkZGJFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYnNkZGIuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlpZiAoQnNkZGJFcnJvciAhPSBOVUxMKQotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBCc2RkYkVycm9yKTsKKyAgICBCc2RkYnR5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiYnNkZGIxODUiLCBic2RkYm1vZHVsZV9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQnNkZGJFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiYnNkZGIuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoQnNkZGJFcnJvciAhPSBOVUxMKQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBCc2RkYkVycm9yKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvYnoybW9kdWxlLmMgYi9Nb2R1bGVzL2J6Mm1vZHVsZS5jCmluZGV4IGE1M2QxYTUuLmRjYjVkYzYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYnoybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9iejJtb2R1bGUuYwpAQCAtNDEsMjAgKzQxLDIwIEBACiAjZGVmaW5lIE1PREVfUkVBRF9FT0YgMgogI2RlZmluZSBNT0RFX1dSSVRFICAgIDMKIAotI2RlZmluZSBCWjJGaWxlT2JqZWN0X0NoZWNrKHYpCShQeV9UWVBFKHYpID09ICZCWjJGaWxlX1R5cGUpCisjZGVmaW5lIEJaMkZpbGVPYmplY3RfQ2hlY2sodikgIChQeV9UWVBFKHYpID09ICZCWjJGaWxlX1R5cGUpCiAKIAogI2lmZGVmIEJaX0NPTkZJR19FUlJPUgogCiAjaWYgU0laRU9GX0xPTkcgPj0gOAogI2RlZmluZSBCWlNfVE9UQUxfT1VUKGJ6cykgXAotCSgoKGxvbmcpYnpzLT50b3RhbF9vdXRfaGkzMiA8PCAzMikgKyBienMtPnRvdGFsX291dF9sbzMyKQorICAgICgoKGxvbmcpYnpzLT50b3RhbF9vdXRfaGkzMiA8PCAzMikgKyBienMtPnRvdGFsX291dF9sbzMyKQogI2VsaWYgU0laRU9GX0xPTkdfTE9ORyA+PSA4CiAjZGVmaW5lIEJaU19UT1RBTF9PVVQoYnpzKSBcCi0JKCgoUFlfTE9OR19MT05HKWJ6cy0+dG90YWxfb3V0X2hpMzIgPDwgMzIpICsgYnpzLT50b3RhbF9vdXRfbG8zMikKKyAgICAoKChQWV9MT05HX0xPTkcpYnpzLT50b3RhbF9vdXRfaGkzMiA8PCAzMikgKyBienMtPnRvdGFsX291dF9sbzMyKQogI2Vsc2UKICNkZWZpbmUgQlpTX1RPVEFMX09VVChienMpIFwKLQlienMtPnRvdGFsX291dF9sbzMyCisgICAgYnpzLT50b3RhbF9vdXRfbG8zMgogI2VuZGlmCiAKICNlbHNlIC8qICEgQlpfQ09ORklHX0VSUk9SICovCkBAIC03OSwxMSArNzksMTEgQEAKIAogI2lmZGVmIFdJVEhfVEhSRUFECiAjZGVmaW5lIEFDUVVJUkVfTE9DSyhvYmopIGRvIHsgXAotCWlmICghUHlUaHJlYWRfYWNxdWlyZV9sb2NrKG9iai0+bG9jaywgMCkpIHsgXAotCQlQeV9CRUdJTl9BTExPV19USFJFQURTIFwKLQkJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKG9iai0+bG9jaywgMSk7IFwKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMgXAotCX0gfSB3aGlsZSgwKQorICAgIGlmICghUHlUaHJlYWRfYWNxdWlyZV9sb2NrKG9iai0+bG9jaywgMCkpIHsgXAorICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTIFwKKyAgICAgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKG9iai0+bG9jaywgMSk7IFwKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMgXAorICAgIH0gfSB3aGlsZSgwKQogI2RlZmluZSBSRUxFQVNFX0xPQ0sob2JqKSBQeVRocmVhZF9yZWxlYXNlX2xvY2sob2JqLT5sb2NrKQogI2Vsc2UKICNkZWZpbmUgQUNRVUlSRV9MT0NLKG9iaikKQEAgLTkxLDUzICs5MSw1MyBAQAogI2VuZGlmCiAKIC8qIEJpdHMgaW4gZl9uZXdsaW5ldHlwZXMgKi8KLSNkZWZpbmUgTkVXTElORV9VTktOT1dOCTAJLyogTm8gbmV3bGluZSBzZWVuLCB5ZXQgKi8KLSNkZWZpbmUgTkVXTElORV9DUiAxCQkvKiBcciBuZXdsaW5lIHNlZW4gKi8KLSNkZWZpbmUgTkVXTElORV9MRiAyCQkvKiBcbiBuZXdsaW5lIHNlZW4gKi8KLSNkZWZpbmUgTkVXTElORV9DUkxGIDQJCS8qIFxyXG4gbmV3bGluZSBzZWVuICovCisjZGVmaW5lIE5FV0xJTkVfVU5LTk9XTiAwICAgICAgIC8qIE5vIG5ld2xpbmUgc2VlbiwgeWV0ICovCisjZGVmaW5lIE5FV0xJTkVfQ1IgMSAgICAgICAgICAgIC8qIFxyIG5ld2xpbmUgc2VlbiAqLworI2RlZmluZSBORVdMSU5FX0xGIDIgICAgICAgICAgICAvKiBcbiBuZXdsaW5lIHNlZW4gKi8KKyNkZWZpbmUgTkVXTElORV9DUkxGIDQgICAgICAgICAgLyogXHJcbiBuZXdsaW5lIHNlZW4gKi8KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAvKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZpbGU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpmaWxlOwogCi0JY2hhciogZl9idWY7CQkvKiBBbGxvY2F0ZWQgcmVhZGFoZWFkIGJ1ZmZlciAqLwotCWNoYXIqIGZfYnVmZW5kOwkJLyogUG9pbnRzIGFmdGVyIGxhc3Qgb2NjdXBpZWQgcG9zaXRpb24gKi8KLQljaGFyKiBmX2J1ZnB0cjsJCS8qIEN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uICovCisgICAgY2hhciogZl9idWY7ICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlZCByZWFkYWhlYWQgYnVmZmVyICovCisgICAgY2hhciogZl9idWZlbmQ7ICAgICAgICAgICAgIC8qIFBvaW50cyBhZnRlciBsYXN0IG9jY3VwaWVkIHBvc2l0aW9uICovCisgICAgY2hhciogZl9idWZwdHI7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uICovCiAKLQlpbnQgZl9zb2Z0c3BhY2U7CS8qIEZsYWcgdXNlZCBieSAncHJpbnQnIGNvbW1hbmQgKi8KKyAgICBpbnQgZl9zb2Z0c3BhY2U7ICAgICAgICAgICAgLyogRmxhZyB1c2VkIGJ5ICdwcmludCcgY29tbWFuZCAqLwogCi0JaW50IGZfdW5pdl9uZXdsaW5lOwkvKiBIYW5kbGUgYW55IG5ld2xpbmUgY29udmVudGlvbiAqLwotCWludCBmX25ld2xpbmV0eXBlczsJLyogVHlwZXMgb2YgbmV3bGluZXMgc2VlbiAqLwotCWludCBmX3NraXBuZXh0bGY7CS8qIFNraXAgbmV4dCBcbiAqLworICAgIGludCBmX3VuaXZfbmV3bGluZTsgICAgICAgICAvKiBIYW5kbGUgYW55IG5ld2xpbmUgY29udmVudGlvbiAqLworICAgIGludCBmX25ld2xpbmV0eXBlczsgICAgICAgICAvKiBUeXBlcyBvZiBuZXdsaW5lcyBzZWVuICovCisgICAgaW50IGZfc2tpcG5leHRsZjsgICAgICAgICAgIC8qIFNraXAgbmV4dCBcbiAqLwogCi0JQlpGSUxFICpmcDsKLQlpbnQgbW9kZTsKLQlQeV9vZmZfdCBwb3M7Ci0JUHlfb2ZmX3Qgc2l6ZTsKKyAgICBCWkZJTEUgKmZwOworICAgIGludCBtb2RlOworICAgIFB5X29mZl90IHBvczsKKyAgICBQeV9vZmZfdCBzaXplOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2s7CisgICAgUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2s7CiAjZW5kaWYKIH0gQloyRmlsZU9iamVjdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQliel9zdHJlYW0gYnpzOwotCWludCBydW5uaW5nOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBiel9zdHJlYW0gYnpzOworICAgIGludCBydW5uaW5nOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2s7CisgICAgUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2s7CiAjZW5kaWYKIH0gQloyQ29tcE9iamVjdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQliel9zdHJlYW0gYnpzOwotCWludCBydW5uaW5nOwotCVB5T2JqZWN0ICp1bnVzZWRfZGF0YTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgYnpfc3RyZWFtIGJ6czsKKyAgICBpbnQgcnVubmluZzsKKyAgICBQeU9iamVjdCAqdW51c2VkX2RhdGE7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeVRocmVhZF90eXBlX2xvY2sgbG9jazsKKyAgICBQeVRocmVhZF90eXBlX2xvY2sgbG9jazsKICNlbmRpZgogfSBCWjJEZWNvbXBPYmplY3Q7CiAKQEAgLTE0Nyw1OSArMTQ3LDU5IEBACiBzdGF0aWMgaW50CiBVdGlsX0NhdGNoQloyRXJyb3IoaW50IGJ6ZXJyb3IpCiB7Ci0JaW50IHJldCA9IDA7Ci0Jc3dpdGNoKGJ6ZXJyb3IpIHsKLQkJY2FzZSBCWl9PSzoKLQkJY2FzZSBCWl9TVFJFQU1fRU5EOgotCQkJYnJlYWs7CisgICAgaW50IHJldCA9IDA7CisgICAgc3dpdGNoKGJ6ZXJyb3IpIHsKKyAgICAgICAgY2FzZSBCWl9PSzoKKyAgICAgICAgY2FzZSBCWl9TVFJFQU1fRU5EOgorICAgICAgICAgICAgYnJlYWs7CiAKICNpZmRlZiBCWl9DT05GSUdfRVJST1IKLQkJY2FzZSBCWl9DT05GSUdfRVJST1I6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJ0aGUgYnoyIGxpYnJhcnkgd2FzIG5vdCBjb21waWxlZCAiCi0JCQkJCSJjb3JyZWN0bHkiKTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCWl9DT05GSUdfRVJST1I6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBiejIgbGlicmFyeSB3YXMgbm90IGNvbXBpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ycmVjdGx5Iik7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CiAjZW5kaWYKIAotCQljYXNlIEJaX1BBUkFNX0VSUk9SOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJ0aGUgYnoyIGxpYnJhcnkgaGFzIHJlY2VpdmVkIHdyb25nICIKLQkJCQkJInBhcmFtZXRlcnMiKTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCWl9QQVJBTV9FUlJPUjoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgYnoyIGxpYnJhcnkgaGFzIHJlY2VpdmVkIHdyb25nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1ldGVycyIpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlpfTUVNX0VSUk9SOgotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCWl9NRU1fRVJST1I6CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQlpfREFUQV9FUlJPUjoKLQkJY2FzZSBCWl9EQVRBX0VSUk9SX01BR0lDOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJpbnZhbGlkIGRhdGEgc3RyZWFtIik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQlpfREFUQV9FUlJPUjoKKyAgICAgICAgY2FzZSBCWl9EQVRBX0VSUk9SX01BR0lDOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJpbnZhbGlkIGRhdGEgc3RyZWFtIik7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCWl9JT19FUlJPUjoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLCAidW5rbm93biBJTyBlcnJvciIpOwotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJaX0lPX0VSUk9SOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJ1bmtub3duIElPIGVycm9yIik7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCWl9VTkVYUEVDVEVEX0VPRjoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkJImNvbXByZXNzZWQgZmlsZSBlbmRlZCBiZWZvcmUgdGhlICIKLQkJCQkJImxvZ2ljYWwgZW5kLW9mLXN0cmVhbSB3YXMgZGV0ZWN0ZWQiKTsKLQkJCXJldCA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCWl9VTkVYUEVDVEVEX0VPRjoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3NlZCBmaWxlIGVuZGVkIGJlZm9yZSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2dpY2FsIGVuZC1vZi1zdHJlYW0gd2FzIGRldGVjdGVkIik7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCWl9TRVFVRU5DRV9FUlJPUjoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJCSJ3cm9uZyBzZXF1ZW5jZSBvZiBiejIgbGlicmFyeSAiCi0JCQkJCSJjb21tYW5kcyB1c2VkIik7Ci0JCQlyZXQgPSAxOwotCQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXQ7CisgICAgICAgIGNhc2UgQlpfU0VRVUVOQ0VfRVJST1I6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBzZXF1ZW5jZSBvZiBiejIgbGlicmFyeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRzIHVzZWQiKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKIH0KIAogI2lmIEJVRlNJWiA8IDgxOTIKQEAgLTIxOCwyMjggKzIxOCwyMjggQEAKIHN0YXRpYyBzaXplX3QKIFV0aWxfTmV3QnVmZmVyU2l6ZShzaXplX3QgY3VycmVudHNpemUpCiB7Ci0JaWYgKGN1cnJlbnRzaXplID4gU01BTExDSFVOSykgewotCQkvKiBLZWVwIGRvdWJsaW5nIHVudGlsIHdlIHJlYWNoIEJJR0NIVU5LOwotCQkgICB0aGVuIGtlZXAgYWRkaW5nIEJJR0NIVU5LLiAqLwotCQlpZiAoY3VycmVudHNpemUgPD0gQklHQ0hVTkspCi0JCQlyZXR1cm4gY3VycmVudHNpemUgKyBjdXJyZW50c2l6ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGN1cnJlbnRzaXplICsgQklHQ0hVTks7Ci0JfQotCXJldHVybiBjdXJyZW50c2l6ZSArIFNNQUxMQ0hVTks7CisgICAgaWYgKGN1cnJlbnRzaXplID4gU01BTExDSFVOSykgeworICAgICAgICAvKiBLZWVwIGRvdWJsaW5nIHVudGlsIHdlIHJlYWNoIEJJR0NIVU5LOworICAgICAgICAgICB0aGVuIGtlZXAgYWRkaW5nIEJJR0NIVU5LLiAqLworICAgICAgICBpZiAoY3VycmVudHNpemUgPD0gQklHQ0hVTkspCisgICAgICAgICAgICByZXR1cm4gY3VycmVudHNpemUgKyBjdXJyZW50c2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRzaXplICsgQklHQ0hVTks7CisgICAgfQorICAgIHJldHVybiBjdXJyZW50c2l6ZSArIFNNQUxMQ0hVTks7CiB9CiAKIC8qIFRoaXMgaXMgYSBoYWNrZWQgdmVyc2lvbiBvZiBQeXRob24ncyBmaWxlb2JqZWN0LmM6Z2V0X2xpbmUoKS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBVdGlsX0dldExpbmUoQloyRmlsZU9iamVjdCAqZiwgaW50IG4pCiB7Ci0JY2hhciBjOwotCWNoYXIgKmJ1ZiwgKmVuZDsKLQlzaXplX3QgdG90YWxfdl9zaXplOwkvKiB0b3RhbCAjIG9mIHNsb3RzIGluIGJ1ZmZlciAqLwotCXNpemVfdCB1c2VkX3Zfc2l6ZTsJLyogIyB1c2VkIHNsb3RzIGluIGJ1ZmZlciAqLwotCXNpemVfdCBpbmNyZW1lbnQ7ICAgICAgIC8qIGFtb3VudCB0byBpbmNyZW1lbnQgdGhlIGJ1ZmZlciAqLwotCVB5T2JqZWN0ICp2OwotCWludCBiemVycm9yOwotCWludCBieXRlc19yZWFkOwotCWludCBuZXdsaW5ldHlwZXMgPSBmLT5mX25ld2xpbmV0eXBlczsKLQlpbnQgc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKLQlpbnQgdW5pdl9uZXdsaW5lID0gZi0+Zl91bml2X25ld2xpbmU7CisgICAgY2hhciBjOworICAgIGNoYXIgKmJ1ZiwgKmVuZDsKKyAgICBzaXplX3QgdG90YWxfdl9zaXplOyAgICAgICAgLyogdG90YWwgIyBvZiBzbG90cyBpbiBidWZmZXIgKi8KKyAgICBzaXplX3QgdXNlZF92X3NpemU7ICAgICAgICAgLyogIyB1c2VkIHNsb3RzIGluIGJ1ZmZlciAqLworICAgIHNpemVfdCBpbmNyZW1lbnQ7ICAgICAgIC8qIGFtb3VudCB0byBpbmNyZW1lbnQgdGhlIGJ1ZmZlciAqLworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBiemVycm9yOworICAgIGludCBieXRlc19yZWFkOworICAgIGludCBuZXdsaW5ldHlwZXMgPSBmLT5mX25ld2xpbmV0eXBlczsKKyAgICBpbnQgc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKKyAgICBpbnQgdW5pdl9uZXdsaW5lID0gZi0+Zl91bml2X25ld2xpbmU7CiAKLQl0b3RhbF92X3NpemUgPSBuID4gMCA/IG4gOiAxMDA7Ci0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgdG90YWxfdl9zaXplKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB0b3RhbF92X3NpemUgPSBuID4gMCA/IG4gOiAxMDA7CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgdG90YWxfdl9zaXplKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWJ1ZiA9IEJVRih2KTsKLQllbmQgPSBidWYgKyB0b3RhbF92X3NpemU7CisgICAgYnVmID0gQlVGKHYpOworICAgIGVuZCA9IGJ1ZiArIHRvdGFsX3Zfc2l6ZTsKIAotCWZvciAoOzspIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQl3aGlsZSAoYnVmICE9IGVuZCkgewotCQkJYnl0ZXNfcmVhZCA9IEJaMl9ielJlYWQoJmJ6ZXJyb3IsIGYtPmZwLCAmYywgMSk7Ci0JCQlmLT5wb3MrKzsKLQkJCWlmIChieXRlc19yZWFkID09IDApIGJyZWFrOwotCQkJaWYgKHVuaXZfbmV3bGluZSkgewotCQkJCWlmIChza2lwbmV4dGxmKSB7Ci0JCQkJCXNraXBuZXh0bGYgPSAwOwotCQkJCQlpZiAoYyA9PSAnXG4nKSB7Ci0JCQkJCQkvKiBTZWVpbmcgYSBcbiBoZXJlIHdpdGggc2tpcG5leHRsZiB0cnVlIG1lYW5zIHdlCi0JCQkJCQkgKiBzYXcgYSBcciBiZWZvcmUuCi0JCQkJCQkgKi8KLQkJCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7Ci0JCQkJCQlpZiAoYnplcnJvciAhPSBCWl9PSykgYnJlYWs7Ci0JCQkJCQlieXRlc19yZWFkID0gQloyX2J6UmVhZCgmYnplcnJvciwgZi0+ZnAsICZjLCAxKTsKLQkJCQkJCWYtPnBvcysrOwotCQkJCQkJaWYgKGJ5dGVzX3JlYWQgPT0gMCkgYnJlYWs7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoYyA9PSAnXHInKSB7Ci0JCQkJCXNraXBuZXh0bGYgPSAxOwotCQkJCQljID0gJ1xuJzsKLQkJCQl9IGVsc2UgaWYgKGMgPT0gJ1xuJykKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7Ci0JCQl9Ci0JCQkqYnVmKysgPSBjOwotCQkJaWYgKGJ6ZXJyb3IgIT0gQlpfT0sgfHwgYyA9PSAnXG4nKSBicmVhazsKLQkJfQotCQlpZiAodW5pdl9uZXdsaW5lICYmIGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCAmJiBza2lwbmV4dGxmKQotCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWYtPmZfbmV3bGluZXR5cGVzID0gbmV3bGluZXR5cGVzOwotCQlmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOwotCQlpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7Ci0JCQlmLT5zaXplID0gZi0+cG9zOwotCQkJZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoYyA9PSAnXG4nKQotCQkJYnJlYWs7Ci0JCS8qIE11c3QgYmUgYmVjYXVzZSBidWYgPT0gZW5kICovCi0JCWlmIChuID4gMCkKLQkJCWJyZWFrOwotCQl1c2VkX3Zfc2l6ZSA9IHRvdGFsX3Zfc2l6ZTsKLQkJaW5jcmVtZW50ID0gdG90YWxfdl9zaXplID4+IDI7IC8qIG1pbGQgZXhwb25lbnRpYWwgZ3Jvd3RoICovCi0JCXRvdGFsX3Zfc2l6ZSArPSBpbmNyZW1lbnQ7Ci0JCWlmICh0b3RhbF92X3NpemUgPiBJTlRfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSAgICAibGluZSBpcyBsb25nZXIgdGhhbiBhIFB5dGhvbiBzdHJpbmcgY2FuIGhvbGQiKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCB0b3RhbF92X3NpemUpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlidWYgPSBCVUYodikgKyB1c2VkX3Zfc2l6ZTsKLQkJZW5kID0gQlVGKHYpICsgdG90YWxfdl9zaXplOwotCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgd2hpbGUgKGJ1ZiAhPSBlbmQpIHsKKyAgICAgICAgICAgIGJ5dGVzX3JlYWQgPSBCWjJfYnpSZWFkKCZiemVycm9yLCBmLT5mcCwgJmMsIDEpOworICAgICAgICAgICAgZi0+cG9zKys7CisgICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA9PSAwKSBicmVhazsKKyAgICAgICAgICAgIGlmICh1bml2X25ld2xpbmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2tpcG5leHRsZikgeworICAgICAgICAgICAgICAgICAgICBza2lwbmV4dGxmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlaW5nIGEgXG4gaGVyZSB3aXRoIHNraXBuZXh0bGYgdHJ1ZSBtZWFucyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICogc2F3IGEgXHIgYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCA9IEJaMl9ielJlYWQoJmJ6ZXJyb3IsIGYtPmZwLCAmYywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmLT5wb3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc19yZWFkID09IDApIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgICAgICBza2lwbmV4dGxmID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYyA9ICdcbic7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcbicpCisgICAgICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0xGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmJ1ZisrID0gYzsKKyAgICAgICAgICAgIGlmIChiemVycm9yICE9IEJaX09LIHx8IGMgPT0gJ1xuJykgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVuaXZfbmV3bGluZSAmJiBiemVycm9yID09IEJaX1NUUkVBTV9FTkQgJiYgc2tpcG5leHRsZikKKyAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKKyAgICAgICAgZi0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKKyAgICAgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgZi0+c2l6ZSA9IGYtPnBvczsKKyAgICAgICAgICAgIGYtPm1vZGUgPSBNT0RFX1JFQURfRU9GOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJ1xuJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBNdXN0IGJlIGJlY2F1c2UgYnVmID09IGVuZCAqLworICAgICAgICBpZiAobiA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdXNlZF92X3NpemUgPSB0b3RhbF92X3NpemU7CisgICAgICAgIGluY3JlbWVudCA9IHRvdGFsX3Zfc2l6ZSA+PiAyOyAvKiBtaWxkIGV4cG9uZW50aWFsIGdyb3d0aCAqLworICAgICAgICB0b3RhbF92X3NpemUgKz0gaW5jcmVtZW50OworICAgICAgICBpZiAodG90YWxfdl9zaXplID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdG90YWxfdl9zaXplKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYnVmID0gQlVGKHYpICsgdXNlZF92X3NpemU7CisgICAgICAgIGVuZCA9IEJVRih2KSArIHRvdGFsX3Zfc2l6ZTsKKyAgICB9CiAKLQl1c2VkX3Zfc2l6ZSA9IGJ1ZiAtIEJVRih2KTsKLQlpZiAodXNlZF92X3NpemUgIT0gdG90YWxfdl9zaXplKQotCQlfUHlTdHJpbmdfUmVzaXplKCZ2LCB1c2VkX3Zfc2l6ZSk7Ci0JcmV0dXJuIHY7CisgICAgdXNlZF92X3NpemUgPSBidWYgLSBCVUYodik7CisgICAgaWYgKHVzZWRfdl9zaXplICE9IHRvdGFsX3Zfc2l6ZSkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdXNlZF92X3NpemUpOworICAgIHJldHVybiB2OwogfQogCiAvKiBUaGlzIGlzIGEgaGFja2VkIHZlcnNpb24gb2YgUHl0aG9uJ3MKICAqIGZpbGVvYmplY3QuYzpQeV9Vbml2ZXJzYWxOZXdsaW5lRnJlYWQoKS4gKi8KIHNpemVfdAogVXRpbF9Vbml2TmV3bGluZVJlYWQoaW50ICpiemVycm9yLCBCWkZJTEUgKnN0cmVhbSwKLQkJICAgICBjaGFyKiBidWYsIHNpemVfdCBuLCBCWjJGaWxlT2JqZWN0ICpmKQorICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmLCBzaXplX3QgbiwgQloyRmlsZU9iamVjdCAqZikKIHsKLQljaGFyICpkc3QgPSBidWY7Ci0JaW50IG5ld2xpbmV0eXBlcywgc2tpcG5leHRsZjsKKyAgICBjaGFyICpkc3QgPSBidWY7CisgICAgaW50IG5ld2xpbmV0eXBlcywgc2tpcG5leHRsZjsKIAotCWFzc2VydChidWYgIT0gTlVMTCk7Ci0JYXNzZXJ0KHN0cmVhbSAhPSBOVUxMKTsKKyAgICBhc3NlcnQoYnVmICE9IE5VTEwpOworICAgIGFzc2VydChzdHJlYW0gIT0gTlVMTCk7CiAKLQlpZiAoIWYtPmZfdW5pdl9uZXdsaW5lKQotCQlyZXR1cm4gQloyX2J6UmVhZChiemVycm9yLCBzdHJlYW0sIGJ1Ziwgbik7CisgICAgaWYgKCFmLT5mX3VuaXZfbmV3bGluZSkKKyAgICAgICAgcmV0dXJuIEJaMl9ielJlYWQoYnplcnJvciwgc3RyZWFtLCBidWYsIG4pOwogCi0JbmV3bGluZXR5cGVzID0gZi0+Zl9uZXdsaW5ldHlwZXM7Ci0Jc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKKyAgICBuZXdsaW5ldHlwZXMgPSBmLT5mX25ld2xpbmV0eXBlczsKKyAgICBza2lwbmV4dGxmID0gZi0+Zl9za2lwbmV4dGxmOwogCi0JLyogSW52YXJpYW50OiAgbiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyB0byBiZSBmaWxsZWQKLQkgKiBpbiB0aGUgYnVmZmVyLgotCSAqLwotCXdoaWxlIChuKSB7Ci0JCXNpemVfdCBucmVhZDsKLQkJaW50IHNob3J0cmVhZDsKLQkJY2hhciAqc3JjID0gZHN0OworICAgIC8qIEludmFyaWFudDogIG4gaXMgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgZmlsbGVkCisgICAgICogaW4gdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB3aGlsZSAobikgeworICAgICAgICBzaXplX3QgbnJlYWQ7CisgICAgICAgIGludCBzaG9ydHJlYWQ7CisgICAgICAgIGNoYXIgKnNyYyA9IGRzdDsKIAotCQlucmVhZCA9IEJaMl9ielJlYWQoYnplcnJvciwgc3RyZWFtLCBkc3QsIG4pOwotCQlhc3NlcnQobnJlYWQgPD0gbik7Ci0JCW4gLT0gbnJlYWQ7IC8qIGFzc3VtaW5nIDEgYnl0ZSBvdXQgZm9yIGVhY2ggaW47IHdpbGwgYWRqdXN0ICovCi0JCXNob3J0cmVhZCA9IG4gIT0gMDsJLyogdHJ1ZSBpZmYgRU9GIG9yIGVycm9yICovCi0JCXdoaWxlIChucmVhZC0tKSB7Ci0JCQljaGFyIGMgPSAqc3JjKys7Ci0JCQlpZiAoYyA9PSAnXHInKSB7Ci0JCQkJLyogU2F2ZSBhcyBMRiBhbmQgc2V0IGZsYWcgdG8gc2tpcCBuZXh0IExGLiAqLwotCQkJCSpkc3QrKyA9ICdcbic7Ci0JCQkJc2tpcG5leHRsZiA9IDE7Ci0JCQl9Ci0JCQllbHNlIGlmIChza2lwbmV4dGxmICYmIGMgPT0gJ1xuJykgewotCQkJCS8qIFNraXAgTEYsIGFuZCByZW1lbWJlciB3ZSBzYXcgQ1IgTEYuICovCi0JCQkJc2tpcG5leHRsZiA9IDA7Ci0JCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1JMRjsKLQkJCQkrK247Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBOb3JtYWwgY2hhciB0byBiZSBzdG9yZWQgaW4gYnVmZmVyLiAgQWxzbwotCQkJCSAqIHVwZGF0ZSB0aGUgbmV3bGluZXR5cGVzIGZsYWcgaWYgZWl0aGVyIHRoaXMKLQkJCQkgKiBpcyBhbiBMRiBvciB0aGUgcHJldmlvdXMgY2hhciB3YXMgYSBDUi4KLQkJCQkgKi8KLQkJCQlpZiAoYyA9PSAnXG4nKQotCQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9MRjsKLQkJCQllbHNlIGlmIChza2lwbmV4dGxmKQotCQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKLQkJCQkqZHN0KysgPSBjOwotCQkJCXNraXBuZXh0bGYgPSAwOwotCQkJfQotCQl9Ci0JCWlmIChzaG9ydHJlYWQpIHsKLQkJCS8qIElmIHRoaXMgaXMgRU9GLCB1cGRhdGUgdHlwZSBmbGFncy4gKi8KLQkJCWlmIChza2lwbmV4dGxmICYmICpiemVycm9yID09IEJaX1NUUkVBTV9FTkQpCi0JCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKLQlmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOwotCXJldHVybiBkc3QgLSBidWY7CisgICAgICAgIG5yZWFkID0gQloyX2J6UmVhZChiemVycm9yLCBzdHJlYW0sIGRzdCwgbik7CisgICAgICAgIGFzc2VydChucmVhZCA8PSBuKTsKKyAgICAgICAgbiAtPSBucmVhZDsgLyogYXNzdW1pbmcgMSBieXRlIG91dCBmb3IgZWFjaCBpbjsgd2lsbCBhZGp1c3QgKi8KKyAgICAgICAgc2hvcnRyZWFkID0gbiAhPSAwOyAgICAgICAgICAgICAvKiB0cnVlIGlmZiBFT0Ygb3IgZXJyb3IgKi8KKyAgICAgICAgd2hpbGUgKG5yZWFkLS0pIHsKKyAgICAgICAgICAgIGNoYXIgYyA9ICpzcmMrKzsKKyAgICAgICAgICAgIGlmIChjID09ICdccicpIHsKKyAgICAgICAgICAgICAgICAvKiBTYXZlIGFzIExGIGFuZCBzZXQgZmxhZyB0byBza2lwIG5leHQgTEYuICovCisgICAgICAgICAgICAgICAgKmRzdCsrID0gJ1xuJzsKKyAgICAgICAgICAgICAgICBza2lwbmV4dGxmID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNraXBuZXh0bGYgJiYgYyA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgLyogU2tpcCBMRiwgYW5kIHJlbWVtYmVyIHdlIHNhdyBDUiBMRi4gKi8KKyAgICAgICAgICAgICAgICBza2lwbmV4dGxmID0gMDsKKyAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOworICAgICAgICAgICAgICAgICsrbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIE5vcm1hbCBjaGFyIHRvIGJlIHN0b3JlZCBpbiBidWZmZXIuICBBbHNvCisgICAgICAgICAgICAgICAgICogdXBkYXRlIHRoZSBuZXdsaW5ldHlwZXMgZmxhZyBpZiBlaXRoZXIgdGhpcworICAgICAgICAgICAgICAgICAqIGlzIGFuIExGIG9yIHRoZSBwcmV2aW91cyBjaGFyIHdhcyBhIENSLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpCisgICAgICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0xGOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNraXBuZXh0bGYpCisgICAgICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSOworICAgICAgICAgICAgICAgICpkc3QrKyA9IGM7CisgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3J0cmVhZCkgeworICAgICAgICAgICAgLyogSWYgdGhpcyBpcyBFT0YsIHVwZGF0ZSB0eXBlIGZsYWdzLiAqLworICAgICAgICAgICAgaWYgKHNraXBuZXh0bGYgJiYgKmJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkKKyAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGYtPmZfbmV3bGluZXR5cGVzID0gbmV3bGluZXR5cGVzOworICAgIGYtPmZfc2tpcG5leHRsZiA9IHNraXBuZXh0bGY7CisgICAgcmV0dXJuIGRzdCAtIGJ1ZjsKIH0KIAogLyogVGhpcyBpcyBhIGhhY2tlZCB2ZXJzaW9uIG9mIFB5dGhvbidzIGZpbGVvYmplY3QuYzpkcm9wX3JlYWRhaGVhZCgpLiAqLwogc3RhdGljIHZvaWQKIFV0aWxfRHJvcFJlYWRBaGVhZChCWjJGaWxlT2JqZWN0ICpmKQogewotCWlmIChmLT5mX2J1ZiAhPSBOVUxMKSB7Ci0JCVB5TWVtX0ZyZWUoZi0+Zl9idWYpOwotCQlmLT5mX2J1ZiA9IE5VTEw7Ci0JfQorICAgIGlmIChmLT5mX2J1ZiAhPSBOVUxMKSB7CisgICAgICAgIFB5TWVtX0ZyZWUoZi0+Zl9idWYpOworICAgICAgICBmLT5mX2J1ZiA9IE5VTEw7CisgICAgfQogfQogCiAvKiBUaGlzIGlzIGEgaGFja2VkIHZlcnNpb24gb2YgUHl0aG9uJ3MgZmlsZW9iamVjdC5jOnJlYWRhaGVhZCgpLiAqLwogc3RhdGljIGludAogVXRpbF9SZWFkQWhlYWQoQloyRmlsZU9iamVjdCAqZiwgaW50IGJ1ZnNpemUpCiB7Ci0JaW50IGNodW5rc2l6ZTsKLQlpbnQgYnplcnJvcjsKKyAgICBpbnQgY2h1bmtzaXplOworICAgIGludCBiemVycm9yOwogCi0JaWYgKGYtPmZfYnVmICE9IE5VTEwpIHsKLQkJaWYoKGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHIpID49IDEpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJVXRpbF9Ecm9wUmVhZEFoZWFkKGYpOwotCX0KLQlpZiAoZi0+bW9kZSA9PSBNT0RFX1JFQURfRU9GKSB7Ci0JCWYtPmZfYnVmcHRyID0gZi0+Zl9idWY7Ci0JCWYtPmZfYnVmZW5kID0gZi0+Zl9idWY7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoKGYtPmZfYnVmID0gUHlNZW1fTWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWNodW5rc2l6ZSA9IFV0aWxfVW5pdk5ld2xpbmVSZWFkKCZiemVycm9yLCBmLT5mcCwgZi0+Zl9idWYsCi0JCQkJCSBidWZzaXplLCBmKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWYtPnBvcyArPSBjaHVua3NpemU7Ci0JaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotCQlmLT5zaXplID0gZi0+cG9zOwotCQlmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKLQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQlVdGlsX0Ryb3BSZWFkQWhlYWQoZik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZi0+Zl9idWZwdHIgPSBmLT5mX2J1ZjsKLQlmLT5mX2J1ZmVuZCA9IGYtPmZfYnVmICsgY2h1bmtzaXplOwotCXJldHVybiAwOworICAgIGlmIChmLT5mX2J1ZiAhPSBOVUxMKSB7CisgICAgICAgIGlmKChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+PSAxKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFV0aWxfRHJvcFJlYWRBaGVhZChmKTsKKyAgICB9CisgICAgaWYgKGYtPm1vZGUgPT0gTU9ERV9SRUFEX0VPRikgeworICAgICAgICBmLT5mX2J1ZnB0ciA9IGYtPmZfYnVmOworICAgICAgICBmLT5mX2J1ZmVuZCA9IGYtPmZfYnVmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKChmLT5mX2J1ZiA9IFB5TWVtX01hbGxvYyhidWZzaXplKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBjaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgZi0+ZnAsIGYtPmZfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUsIGYpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgZi0+cG9zICs9IGNodW5rc2l6ZTsKKyAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgIGYtPnNpemUgPSBmLT5wb3M7CisgICAgICAgIGYtPm1vZGUgPSBNT0RFX1JFQURfRU9GOworICAgIH0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgIFV0aWxfRHJvcFJlYWRBaGVhZChmKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmLT5mX2J1ZnB0ciA9IGYtPmZfYnVmOworICAgIGYtPmZfYnVmZW5kID0gZi0+Zl9idWYgKyBjaHVua3NpemU7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFRoaXMgaXMgYSBoYWNrZWQgdmVyc2lvbiBvZiBQeXRob24ncwpAQCAtNDQ3LDQ1ICs0NDcsNDUgQEAKIHN0YXRpYyBQeVN0cmluZ09iamVjdCAqCiBVdGlsX1JlYWRBaGVhZEdldExpbmVTa2lwKEJaMkZpbGVPYmplY3QgKmYsIGludCBza2lwLCBpbnQgYnVmc2l6ZSkKIHsKLQlQeVN0cmluZ09iamVjdCogczsKLQljaGFyICpidWZwdHI7Ci0JY2hhciAqYnVmOwotCWludCBsZW47CisgICAgUHlTdHJpbmdPYmplY3QqIHM7CisgICAgY2hhciAqYnVmcHRyOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOwogCi0JaWYgKGYtPmZfYnVmID09IE5VTEwpCi0JCWlmIChVdGlsX1JlYWRBaGVhZChmLCBidWZzaXplKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZi0+Zl9idWYgPT0gTlVMTCkKKyAgICAgICAgaWYgKFV0aWxfUmVhZEFoZWFkKGYsIGJ1ZnNpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JbGVuID0gZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cjsKLQlpZiAobGVuID09IDApCi0JCXJldHVybiAoUHlTdHJpbmdPYmplY3QgKikKLQkJCVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNraXApOwotCWJ1ZnB0ciA9IG1lbWNocihmLT5mX2J1ZnB0ciwgJ1xuJywgbGVuKTsKLQlpZiAoYnVmcHRyICE9IE5VTEwpIHsKLQkJYnVmcHRyKys7CQkJLyogQ291bnQgdGhlICdcbicgKi8KLQkJbGVuID0gYnVmcHRyIC0gZi0+Zl9idWZwdHI7Ci0JCXMgPSAoUHlTdHJpbmdPYmplY3QgKikKLQkJCVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNraXArbGVuKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQltZW1jcHkoUHlTdHJpbmdfQVNfU1RSSU5HKHMpK3NraXAsIGYtPmZfYnVmcHRyLCBsZW4pOwotCQlmLT5mX2J1ZnB0ciA9IGJ1ZnB0cjsKLQkJaWYgKGJ1ZnB0ciA9PSBmLT5mX2J1ZmVuZCkKLQkJCVV0aWxfRHJvcFJlYWRBaGVhZChmKTsKLQl9IGVsc2UgewotCQlidWZwdHIgPSBmLT5mX2J1ZnB0cjsKLQkJYnVmID0gZi0+Zl9idWY7Ci0JCWYtPmZfYnVmID0gTlVMTDsgCS8qIEZvcmNlIG5ldyByZWFkYWhlYWQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgcyA9IFV0aWxfUmVhZEFoZWFkR2V0TGluZVNraXAoZiwgc2tpcCtsZW4sCi0JCQkJCSAgICAgIGJ1ZnNpemUgKyAoYnVmc2l6ZT4+MikpOwotCQlpZiAocyA9PSBOVUxMKSB7Ci0JCSAgICAgICAgUHlNZW1fRnJlZShidWYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyhzKStza2lwLCBidWZwdHIsIGxlbik7Ci0JCVB5TWVtX0ZyZWUoYnVmKTsKLQl9Ci0JcmV0dXJuIHM7CisgICAgbGVuID0gZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cjsKKyAgICBpZiAobGVuID09IDApCisgICAgICAgIHJldHVybiAoUHlTdHJpbmdPYmplY3QgKikKKyAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNraXApOworICAgIGJ1ZnB0ciA9IG1lbWNocihmLT5mX2J1ZnB0ciwgJ1xuJywgbGVuKTsKKyAgICBpZiAoYnVmcHRyICE9IE5VTEwpIHsKKyAgICAgICAgYnVmcHRyKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvdW50IHRoZSAnXG4nICovCisgICAgICAgIGxlbiA9IGJ1ZnB0ciAtIGYtPmZfYnVmcHRyOworICAgICAgICBzID0gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwK2xlbik7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyhzKStza2lwLCBmLT5mX2J1ZnB0ciwgbGVuKTsKKyAgICAgICAgZi0+Zl9idWZwdHIgPSBidWZwdHI7CisgICAgICAgIGlmIChidWZwdHIgPT0gZi0+Zl9idWZlbmQpCisgICAgICAgICAgICBVdGlsX0Ryb3BSZWFkQWhlYWQoZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmcHRyID0gZi0+Zl9idWZwdHI7CisgICAgICAgIGJ1ZiA9IGYtPmZfYnVmOworICAgICAgICBmLT5mX2J1ZiA9IE5VTEw7ICAgICAgICAgICAgICAgIC8qIEZvcmNlIG5ldyByZWFkYWhlYWQgYnVmZmVyICovCisgICAgICAgIHMgPSBVdGlsX1JlYWRBaGVhZEdldExpbmVTa2lwKGYsIHNraXArbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplICsgKGJ1ZnNpemU+PjIpKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlNZW1fRnJlZShidWYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyhzKStza2lwLCBidWZwdHIsIGxlbik7CisgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICB9CisgICAgcmV0dXJuIHM7CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtNTAyLDc5ICs1MDIsNzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX3JlYWQoQloyRmlsZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBieXRlc3JlcXVlc3RlZCA9IC0xOwotCXNpemVfdCBieXRlc3JlYWQsIGJ1ZmZlcnNpemUsIGNodW5rc2l6ZTsKLQlpbnQgYnplcnJvcjsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBsb25nIGJ5dGVzcmVxdWVzdGVkID0gLTE7CisgICAgc2l6ZV90IGJ5dGVzcmVhZCwgYnVmZmVyc2l6ZSwgY2h1bmtzaXplOworICAgIGludCBiemVycm9yOworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bDpyZWFkIiwgJmJ5dGVzcmVxdWVzdGVkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bDpyZWFkIiwgJmJ5dGVzcmVxdWVzdGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlBQ1FVSVJFX0xPQ0soc2VsZik7Ci0Jc3dpdGNoIChzZWxmLT5tb2RlKSB7Ci0JCWNhc2UgTU9ERV9SRUFEOgotCQkJYnJlYWs7Ci0JCWNhc2UgTU9ERV9SRUFEX0VPRjoKLQkJCXJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwotCQkJZ290byBjbGVhbnVwOwotCQljYXNlIE1PREVfQ0xPU0VEOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJCQkJImZpbGUgaXMgbm90IHJlYWR5IGZvciByZWFkaW5nIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JfQorICAgIEFDUVVJUkVfTE9DSyhzZWxmKTsKKyAgICBzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBNT0RFX1JFQUQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX1JFQURfRU9GOgorICAgICAgICAgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIGNhc2UgTU9ERV9DTE9TRUQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgaXMgbm90IHJlYWR5IGZvciByZWFkaW5nIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCi0JaWYgKGJ5dGVzcmVxdWVzdGVkIDwgMCkKLQkJYnVmZmVyc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZSgoc2l6ZV90KTApOwotCWVsc2UKLQkJYnVmZmVyc2l6ZSA9IGJ5dGVzcmVxdWVzdGVkOwotCWlmIChidWZmZXJzaXplID4gSU5UX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkicmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBpcyAiCi0JCQkJIm1vcmUgdGhhbiBhIFB5dGhvbiBzdHJpbmcgY2FuIGhvbGQiKTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGJ1ZmZlcnNpemUpOwotCWlmIChyZXQgPT0gTlVMTCkKLQkJZ290byBjbGVhbnVwOwotCWJ5dGVzcmVhZCA9IDA7CisgICAgaWYgKGJ5dGVzcmVxdWVzdGVkIDwgMCkKKyAgICAgICAgYnVmZmVyc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZSgoc2l6ZV90KTApOworICAgIGVsc2UKKyAgICAgICAgYnVmZmVyc2l6ZSA9IGJ5dGVzcmVxdWVzdGVkOworICAgIGlmIChidWZmZXJzaXplID4gSU5UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb3JlIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBidWZmZXJzaXplKTsKKyAgICBpZiAocmV0ID09IE5VTEwpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBieXRlc3JlYWQgPSAwOwogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWNodW5rc2l6ZSA9IFV0aWxfVW5pdk5ld2xpbmVSZWFkKCZiemVycm9yLCBzZWxmLT5mcCwKLQkJCQkJCSBCVUYocmV0KStieXRlc3JlYWQsCi0JCQkJCQkgYnVmZmVyc2l6ZS1ieXRlc3JlYWQsCi0JCQkJCQkgc2VsZik7Ci0JCXNlbGYtPnBvcyArPSBjaHVua3NpemU7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWJ5dGVzcmVhZCArPSBjaHVua3NpemU7Ci0JCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJCXNlbGYtPnNpemUgPSBzZWxmLT5wb3M7Ci0JCQlzZWxmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCVB5X0RFQ1JFRihyZXQpOwotCQkJcmV0ID0gTlVMTDsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQlpZiAoYnl0ZXNyZXF1ZXN0ZWQgPCAwKSB7Ci0JCQlidWZmZXJzaXplID0gVXRpbF9OZXdCdWZmZXJTaXplKGJ1ZmZlcnNpemUpOwotCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgYnVmZmVyc2l6ZSkgPCAwKQotCQkJCWdvdG8gY2xlYW51cDsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChieXRlc3JlYWQgIT0gYnVmZmVyc2l6ZSkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBieXRlc3JlYWQpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBjaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVRihyZXQpK2J5dGVzcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyc2l6ZS1ieXRlc3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOworICAgICAgICBzZWxmLT5wb3MgKz0gY2h1bmtzaXplOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBieXRlc3JlYWQgKz0gY2h1bmtzaXplOworICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICBzZWxmLT5zaXplID0gc2VsZi0+cG9zOworICAgICAgICAgICAgc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgICBQeV9ERUNSRUYocmV0KTsKKyAgICAgICAgICAgIHJldCA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzcmVxdWVzdGVkIDwgMCkgeworICAgICAgICAgICAgYnVmZmVyc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZmZXJzaXplKTsKKyAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZmZlcnNpemUpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYnl0ZXNyZWFkICE9IGJ1ZmZlcnNpemUpCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgYnl0ZXNyZWFkKTsKIAogY2xlYW51cDoKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JcmV0dXJuIHJldDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKEJaMkZpbGVfcmVhZGxpbmVfX2RvY19fLApAQCAtNTg5LDM3ICs1ODksMzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX3JlYWRsaW5lKEJaMkZpbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCWludCBzaXplaGludCA9IC0xOworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIGludCBzaXplaGludCA9IC0xOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpyZWFkbGluZSIsICZzaXplaGludCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6cmVhZGxpbmUiLCAmc2l6ZWhpbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUFDUVVJUkVfTE9DSyhzZWxmKTsKLQlzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKLQkJY2FzZSBNT0RFX1JFQUQ6Ci0JCQlicmVhazsKLQkJY2FzZSBNT0RFX1JFQURfRU9GOgotCQkJcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCWNhc2UgTU9ERV9DTE9TRUQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAotCQkJCQkiZmlsZSBpcyBub3QgcmVhZHkgZm9yIHJlYWRpbmciKTsKLQkJCWdvdG8gY2xlYW51cDsKLQl9CisgICAgQUNRVUlSRV9MT0NLKHNlbGYpOworICAgIHN3aXRjaCAoc2VsZi0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUkVBRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfUkVBRF9FT0Y6CisgICAgICAgICAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgY2FzZSBNT0RFX0NMT1NFRDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBpcyBub3QgcmVhZHkgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKLQlpZiAoc2l6ZWhpbnQgPT0gMCkKLQkJcmV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JZWxzZQotCQlyZXQgPSBVdGlsX0dldExpbmUoc2VsZiwgKHNpemVoaW50IDwgMCkgPyAwIDogc2l6ZWhpbnQpOworICAgIGlmIChzaXplaGludCA9PSAwKQorICAgICAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IFV0aWxfR2V0TGluZShzZWxmLCAoc2l6ZWhpbnQgPCAwKSA/IDAgOiBzaXplaGludCk7CiAKIGNsZWFudXA6Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCXJldHVybiByZXQ7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihCWjJGaWxlX3JlYWRsaW5lc19fZG9jX18sCkBAIC02MzQsMTQ4ICs2MzQsMTQ4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9yZWFkbGluZXMoQloyRmlsZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBzaXplaGludCA9IDA7Ci0JUHlPYmplY3QgKmxpc3QgPSBOVUxMOwotCVB5T2JqZWN0ICpsaW5lOwotCWNoYXIgc21hbGxfYnVmZmVyW1NNQUxMQ0hVTktdOwotCWNoYXIgKmJ1ZmZlciA9IHNtYWxsX2J1ZmZlcjsKLQlzaXplX3QgYnVmZmVyc2l6ZSA9IFNNQUxMQ0hVTks7Ci0JUHlPYmplY3QgKmJpZ19idWZmZXIgPSBOVUxMOwotCXNpemVfdCBuZmlsbGVkID0gMDsKLQlzaXplX3QgbnJlYWQ7Ci0Jc2l6ZV90IHRvdGFscmVhZCA9IDA7Ci0JY2hhciAqcCwgKnEsICplbmQ7Ci0JaW50IGVycjsKLQlpbnQgc2hvcnRyZWFkID0gMDsKLQlpbnQgYnplcnJvcjsKKyAgICBsb25nIHNpemVoaW50ID0gMDsKKyAgICBQeU9iamVjdCAqbGlzdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmxpbmU7CisgICAgY2hhciBzbWFsbF9idWZmZXJbU01BTExDSFVOS107CisgICAgY2hhciAqYnVmZmVyID0gc21hbGxfYnVmZmVyOworICAgIHNpemVfdCBidWZmZXJzaXplID0gU01BTExDSFVOSzsKKyAgICBQeU9iamVjdCAqYmlnX2J1ZmZlciA9IE5VTEw7CisgICAgc2l6ZV90IG5maWxsZWQgPSAwOworICAgIHNpemVfdCBucmVhZDsKKyAgICBzaXplX3QgdG90YWxyZWFkID0gMDsKKyAgICBjaGFyICpwLCAqcSwgKmVuZDsKKyAgICBpbnQgZXJyOworICAgIGludCBzaG9ydHJlYWQgPSAwOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bDpyZWFkbGluZXMiLCAmc2l6ZWhpbnQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxsOnJlYWRsaW5lcyIsICZzaXplaGludCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCXN3aXRjaCAoc2VsZi0+bW9kZSkgewotCQljYXNlIE1PREVfUkVBRDoKLQkJCWJyZWFrOwotCQljYXNlIE1PREVfUkVBRF9FT0Y6Ci0JCQlsaXN0ID0gUHlMaXN0X05ldygwKTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJY2FzZSBNT0RFX0NMT1NFRDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBjbGVhbnVwOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJCSJmaWxlIGlzIG5vdCByZWFkeSBmb3IgcmVhZGluZyIpOwotCQkJZ290byBjbGVhbnVwOwotCX0KKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgc3dpdGNoIChzZWxmLT5tb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9SRUFEOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV9SRUFEX0VPRjoKKyAgICAgICAgICAgIGxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBjYXNlIE1PREVfQ0xPU0VEOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIGlzIG5vdCByZWFkeSBmb3IgcmVhZGluZyIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCWlmICgobGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0JCWdvdG8gY2xlYW51cDsKKyAgICBpZiAoKGxpc3QgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQorICAgICAgICBnb3RvIGNsZWFudXA7CiAKLQlmb3IgKDs7KSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJbnJlYWQgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCSAgICAgYnVmZmVyK25maWxsZWQsCi0JCQkJCSAgICAgYnVmZmVyc2l6ZS1uZmlsbGVkLCBzZWxmKTsKLQkJc2VsZi0+cG9zICs9IG5yZWFkOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7Ci0JCQlzZWxmLT5zaXplID0gc2VsZi0+cG9zOwotCQkJc2VsZi0+bW9kZSA9IE1PREVfUkVBRF9FT0Y7Ci0JCQlpZiAobnJlYWQgPT0gMCkgewotCQkJCXNpemVoaW50ID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNob3J0cmVhZCA9IDE7Ci0JCX0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkgIGVycm9yOgotCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJbGlzdCA9IE5VTEw7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJdG90YWxyZWFkICs9IG5yZWFkOwotCQlwID0gbWVtY2hyKGJ1ZmZlcituZmlsbGVkLCAnXG4nLCBucmVhZCk7Ci0JCWlmICghc2hvcnRyZWFkICYmIHAgPT0gTlVMTCkgewotCQkJLyogTmVlZCBhIGxhcmdlciBidWZmZXIgdG8gZml0IHRoaXMgbGluZSAqLwotCQkJbmZpbGxlZCArPSBucmVhZDsKLQkJCWJ1ZmZlcnNpemUgKj0gMjsKLQkJCWlmIChidWZmZXJzaXplID4gSU5UX01BWCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJLyogQ3JlYXRlIHRoZSBiaWcgYnVmZmVyICovCi0JCQkJYmlnX2J1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQkJCQlOVUxMLCBidWZmZXJzaXplKTsKLQkJCQlpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCWJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKLQkJCQltZW1jcHkoYnVmZmVyLCBzbWFsbF9idWZmZXIsIG5maWxsZWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogR3JvdyB0aGUgYmlnIGJ1ZmZlciAqLwotCQkJCV9QeVN0cmluZ19SZXNpemUoJmJpZ19idWZmZXIsIGJ1ZmZlcnNpemUpOwotCQkJCWJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKLQkJCX0KLQkJCWNvbnRpbnVlOwkJCQotCQl9Ci0JCWVuZCA9IGJ1ZmZlcituZmlsbGVkK25yZWFkOwotCQlxID0gYnVmZmVyOwotCQl3aGlsZSAocCAhPSBOVUxMKSB7Ci0JCQkvKiBQcm9jZXNzIGNvbXBsZXRlIGxpbmVzICovCi0JCQlwKys7Ci0JCQlsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocSwgcC1xKTsKLQkJCWlmIChsaW5lID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJCWVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbGluZSk7Ci0JCQlQeV9ERUNSRUYobGluZSk7Ci0JCQlpZiAoZXJyICE9IDApCi0JCQkJZ290byBlcnJvcjsKLQkJCXEgPSBwOwotCQkJcCA9IG1lbWNocihxLCAnXG4nLCBlbmQtcSk7Ci0JCX0KLQkJLyogTW92ZSB0aGUgcmVtYWluaW5nIGluY29tcGxldGUgbGluZSB0byB0aGUgc3RhcnQgKi8KLQkJbmZpbGxlZCA9IGVuZC1xOwotCQltZW1tb3ZlKGJ1ZmZlciwgcSwgbmZpbGxlZCk7Ci0JCWlmIChzaXplaGludCA+IDApCi0JCQlpZiAodG90YWxyZWFkID49IChzaXplX3Qpc2l6ZWhpbnQpCi0JCQkJYnJlYWs7Ci0JCWlmIChzaG9ydHJlYWQpIHsKLQkJCXNpemVoaW50ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChuZmlsbGVkICE9IDApIHsKLQkJLyogUGFydGlhbCBsYXN0IGxpbmUgKi8KLQkJbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwgbmZpbGxlZCk7Ci0JCWlmIChsaW5lID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQlpZiAoc2l6ZWhpbnQgPiAwKSB7Ci0JCQkvKiBOZWVkIHRvIGNvbXBsZXRlIHRoZSBsYXN0IGxpbmUgKi8KLQkJCVB5T2JqZWN0ICpyZXN0ID0gVXRpbF9HZXRMaW5lKHNlbGYsIDApOwotCQkJaWYgKHJlc3QgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihsaW5lKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJUHlTdHJpbmdfQ29uY2F0KCZsaW5lLCByZXN0KTsKLQkJCVB5X0RFQ1JFRihyZXN0KTsKLQkJCWlmIChsaW5lID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOwotCQlQeV9ERUNSRUYobGluZSk7Ci0JCWlmIChlcnIgIT0gMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBucmVhZCA9IFV0aWxfVW5pdk5ld2xpbmVSZWFkKCZiemVycm9yLCBzZWxmLT5mcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIrbmZpbGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzaXplLW5maWxsZWQsIHNlbGYpOworICAgICAgICBzZWxmLT5wb3MgKz0gbnJlYWQ7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSBzZWxmLT5wb3M7CisgICAgICAgICAgICBzZWxmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKKyAgICAgICAgICAgIGlmIChucmVhZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc2l6ZWhpbnQgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hvcnRyZWFkID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgZXJyb3I6CisgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICBsaXN0ID0gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgICAgICB0b3RhbHJlYWQgKz0gbnJlYWQ7CisgICAgICAgIHAgPSBtZW1jaHIoYnVmZmVyK25maWxsZWQsICdcbicsIG5yZWFkKTsKKyAgICAgICAgaWYgKCFzaG9ydHJlYWQgJiYgcCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBOZWVkIGEgbGFyZ2VyIGJ1ZmZlciB0byBmaXQgdGhpcyBsaW5lICovCisgICAgICAgICAgICBuZmlsbGVkICs9IG5yZWFkOworICAgICAgICAgICAgYnVmZmVyc2l6ZSAqPSAyOworICAgICAgICAgICAgaWYgKGJ1ZmZlcnNpemUgPiBJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaWdfYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgdGhlIGJpZyBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBiaWdfYnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIGJ1ZmZlcnNpemUpOworICAgICAgICAgICAgICAgIGlmIChiaWdfYnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gUHlTdHJpbmdfQVNfU1RSSU5HKGJpZ19idWZmZXIpOworICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXIsIHNtYWxsX2J1ZmZlciwgbmZpbGxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBHcm93IHRoZSBiaWcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmYmlnX2J1ZmZlciwgYnVmZmVyc2l6ZSk7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gUHlTdHJpbmdfQVNfU1RSSU5HKGJpZ19idWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZW5kID0gYnVmZmVyK25maWxsZWQrbnJlYWQ7CisgICAgICAgIHEgPSBidWZmZXI7CisgICAgICAgIHdoaWxlIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIFByb2Nlc3MgY29tcGxldGUgbGluZXMgKi8KKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShxLCBwLXEpOworICAgICAgICAgICAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBsaW5lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgcSA9IHA7CisgICAgICAgICAgICBwID0gbWVtY2hyKHEsICdcbicsIGVuZC1xKTsKKyAgICAgICAgfQorICAgICAgICAvKiBNb3ZlIHRoZSByZW1haW5pbmcgaW5jb21wbGV0ZSBsaW5lIHRvIHRoZSBzdGFydCAqLworICAgICAgICBuZmlsbGVkID0gZW5kLXE7CisgICAgICAgIG1lbW1vdmUoYnVmZmVyLCBxLCBuZmlsbGVkKTsKKyAgICAgICAgaWYgKHNpemVoaW50ID4gMCkKKyAgICAgICAgICAgIGlmICh0b3RhbHJlYWQgPj0gKHNpemVfdClzaXplaGludCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHNob3J0cmVhZCkgeworICAgICAgICAgICAgc2l6ZWhpbnQgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5maWxsZWQgIT0gMCkgeworICAgICAgICAvKiBQYXJ0aWFsIGxhc3QgbGluZSAqLworICAgICAgICBsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBuZmlsbGVkKTsKKyAgICAgICAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChzaXplaGludCA+IDApIHsKKyAgICAgICAgICAgIC8qIE5lZWQgdG8gY29tcGxldGUgdGhlIGxhc3QgbGluZSAqLworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3QgPSBVdGlsX0dldExpbmUoc2VsZiwgMCk7CisgICAgICAgICAgICBpZiAocmVzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxpbmUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVN0cmluZ19Db25jYXQoJmxpbmUsIHJlc3QpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3QpOworICAgICAgICAgICAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbGluZSk7CisgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKICAgY2xlYW51cDoKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JaWYgKGJpZ19idWZmZXIpIHsKLQkJUHlfREVDUkVGKGJpZ19idWZmZXIpOwotCX0KLQlyZXR1cm4gbGlzdDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgaWYgKGJpZ19idWZmZXIpIHsKKyAgICAgICAgUHlfREVDUkVGKGJpZ19idWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gbGlzdDsKIH0KIAogUHlEb2NfU1RSVkFSKEJaMkZpbGVfeHJlYWRsaW5lc19fZG9jX18sCkBAIC03OTYsNTIgKzc5Niw1MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfd3JpdGUoQloyRmlsZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JUHlfYnVmZmVyIHBidWY7Ci0JY2hhciAqYnVmOwotCWludCBsZW47Ci0JaW50IGJ6ZXJyb3I7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgUHlfYnVmZmVyIHBidWY7CisgICAgY2hhciAqYnVmOworICAgIGludCBsZW47CisgICAgaW50IGJ6ZXJyb3I7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOndyaXRlIiwgJnBidWYpKQotCQlyZXR1cm4gTlVMTDsKLQlidWYgPSBwYnVmLmJ1ZjsKLQlsZW4gPSBwYnVmLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOndyaXRlIiwgJnBidWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWYgPSBwYnVmLmJ1ZjsKKyAgICBsZW4gPSBwYnVmLmxlbjsKIAotCUFDUVVJUkVfTE9DSyhzZWxmKTsKLQlzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKLQkJY2FzZSBNT0RFX1dSSVRFOgotCQkJYnJlYWs7CisgICAgQUNRVUlSRV9MT0NLKHNlbGYpOworICAgIHN3aXRjaCAoc2VsZi0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfV1JJVEU6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIE1PREVfQ0xPU0VEOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCQlnb3RvIGNsZWFudXA7CisgICAgICAgIGNhc2UgTU9ERV9DTE9TRUQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOwogCi0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJCQkJImZpbGUgaXMgbm90IHJlYWR5IGZvciB3cml0aW5nIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgaXMgbm90IHJlYWR5IGZvciB3cml0aW5nIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCi0Jc2VsZi0+Zl9zb2Z0c3BhY2UgPSAwOworICAgIHNlbGYtPmZfc29mdHNwYWNlID0gMDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlCWjJfYnpXcml0ZSAoJmJ6ZXJyb3IsIHNlbGYtPmZwLCBidWYsIGxlbik7Ci0Jc2VsZi0+cG9zICs9IGxlbjsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBCWjJfYnpXcml0ZSAoJmJ6ZXJyb3IsIHNlbGYtPmZwLCBidWYsIGxlbik7CisgICAgc2VsZi0+cG9zICs9IGxlbjsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQorICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXQgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXQgPSBQeV9Ob25lOwogCiBjbGVhbnVwOgotCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlyZXR1cm4gcmV0OworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOworICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBQeURvY19TVFJWQVIoQloyRmlsZV93cml0ZWxpbmVzX19kb2NfXywKQEAgLTg1NywxMjQgKzg1NywxMjQgQEAKIEJaMkZpbGVfd3JpdGVsaW5lcyhCWjJGaWxlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VxKQogewogI2RlZmluZSBDSFVOS1NJWkUgMTAwMAotCVB5T2JqZWN0ICpsaXN0ID0gTlVMTDsKLQlQeU9iamVjdCAqaXRlciA9IE5VTEw7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JUHlPYmplY3QgKmxpbmU7Ci0JaW50IGksIGosIGluZGV4LCBsZW4sIGlzbGlzdDsKLQlpbnQgYnplcnJvcjsKKyAgICBQeU9iamVjdCAqbGlzdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsaW5lOworICAgIGludCBpLCBqLCBpbmRleCwgbGVuLCBpc2xpc3Q7CisgICAgaW50IGJ6ZXJyb3I7CiAKLQlBQ1FVSVJFX0xPQ0soc2VsZik7Ci0Jc3dpdGNoIChzZWxmLT5tb2RlKSB7Ci0JCWNhc2UgTU9ERV9XUklURToKLQkJCWJyZWFrOworICAgIEFDUVVJUkVfTE9DSyhzZWxmKTsKKyAgICBzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBNT0RFX1dSSVRFOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBNT0RFX0NMT1NFRDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCQkJZ290byBlcnJvcjsKKyAgICAgICAgY2FzZSBNT0RFX0NMT1NFRDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogCi0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJCQkJImZpbGUgaXMgbm90IHJlYWR5IGZvciB3cml0aW5nIik7Ci0JCQlnb3RvIGVycm9yOwotCX0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIGlzIG5vdCByZWFkeSBmb3Igd3JpdGluZyIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlpc2xpc3QgPSBQeUxpc3RfQ2hlY2soc2VxKTsKLQlpZiAgKCFpc2xpc3QpIHsKLQkJaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQkJaWYgKGl0ZXIgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkid3JpdGVsaW5lcygpIHJlcXVpcmVzIGFuIGl0ZXJhYmxlIGFyZ3VtZW50Iik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWxpc3QgPSBQeUxpc3RfTmV3KENIVU5LU0laRSk7Ci0JCWlmIChsaXN0ID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICBpc2xpc3QgPSBQeUxpc3RfQ2hlY2soc2VxKTsKKyAgICBpZiAgKCFpc2xpc3QpIHsKKyAgICAgICAgaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKKyAgICAgICAgaWYgKGl0ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAid3JpdGVsaW5lcygpIHJlcXVpcmVzIGFuIGl0ZXJhYmxlIGFyZ3VtZW50Iik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGxpc3QgPSBQeUxpc3RfTmV3KENIVU5LU0laRSk7CisgICAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIFN0cmF0ZWd5OiBzbHVycCBDSFVOS1NJWkUgbGluZXMgaW50byBhIHByaXZhdGUgbGlzdCwKLQkgICBjaGVja2luZyB0aGF0IHRoZXkgYXJlIGFsbCBzdHJpbmdzLCB0aGVuIHdyaXRlIHRoYXQgbGlzdAotCSAgIHdpdGhvdXQgaG9sZGluZyB0aGUgaW50ZXJwcmV0ZXIgbG9jaywgdGhlbiBjb21lIGJhY2sgZm9yIG1vcmUuICovCi0JZm9yIChpbmRleCA9IDA7IDsgaW5kZXggKz0gQ0hVTktTSVpFKSB7Ci0JCWlmIChpc2xpc3QpIHsKLQkJCVB5X1hERUNSRUYobGlzdCk7Ci0JCQlsaXN0ID0gUHlMaXN0X0dldFNsaWNlKHNlcSwgaW5kZXgsIGluZGV4K0NIVU5LU0laRSk7Ci0JCQlpZiAobGlzdCA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQlqID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChqID0gMDsgaiA8IENIVU5LU0laRTsgaisrKSB7Ci0JCQkJbGluZSA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQkJCWlmIChsaW5lID09IE5VTEwpIHsKLQkJCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCQlnb3RvIGVycm9yOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJUHlMaXN0X1NldEl0ZW0obGlzdCwgaiwgbGluZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gMCkKLQkJCWJyZWFrOworICAgIC8qIFN0cmF0ZWd5OiBzbHVycCBDSFVOS1NJWkUgbGluZXMgaW50byBhIHByaXZhdGUgbGlzdCwKKyAgICAgICBjaGVja2luZyB0aGF0IHRoZXkgYXJlIGFsbCBzdHJpbmdzLCB0aGVuIHdyaXRlIHRoYXQgbGlzdAorICAgICAgIHdpdGhvdXQgaG9sZGluZyB0aGUgaW50ZXJwcmV0ZXIgbG9jaywgdGhlbiBjb21lIGJhY2sgZm9yIG1vcmUuICovCisgICAgZm9yIChpbmRleCA9IDA7IDsgaW5kZXggKz0gQ0hVTktTSVpFKSB7CisgICAgICAgIGlmIChpc2xpc3QpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYobGlzdCk7CisgICAgICAgICAgICBsaXN0ID0gUHlMaXN0X0dldFNsaWNlKHNlcSwgaW5kZXgsIGluZGV4K0NIVU5LU0laRSk7CisgICAgICAgICAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBqID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IENIVU5LU0laRTsgaisrKSB7CisgICAgICAgICAgICAgICAgbGluZSA9IFB5SXRlcl9OZXh0KGl0ZXIpOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaiwgbGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCS8qIENoZWNrIHRoYXQgYWxsIGVudHJpZXMgYXJlIGluZGVlZCBzdHJpbmdzLiBJZiBub3QsCi0JCSAgIGFwcGx5IHRoZSBzYW1lIHJ1bGVzIGFzIGZvciBmaWxlLndyaXRlKCkgYW5kCi0JCSAgIGNvbnZlcnQgdGhlIHJldHMgdG8gc3RyaW5ncy4gVGhpcyBpcyBzbG93LCBidXQKLQkJICAgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHNpbmNlIGFsbCBjb252ZXJzaW9uIEFQSXMKLQkJICAgY291bGQgcG90ZW50aWFsbHkgZXhlY3V0ZSBQeXRob24gY29kZS4gKi8KLQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCQkgICAgCWNvbnN0IGNoYXIgKmJ1ZmZlcjsKLQkJCSAgICAJUHlfc3NpemVfdCBsZW47Ci0JCQkJaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih2LCAmYnVmZmVyLCAmbGVuKSkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkJCSJ3cml0ZWxpbmVzKCkgIgotCQkJCQkJCSJhcmd1bWVudCBtdXN0IGJlICIKLQkJCQkJCQkiYSBzZXF1ZW5jZSBvZiAiCi0JCQkJCQkJInN0cmluZ3MiKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwKLQkJCQkJCQkJICBsZW4pOwotCQkJCWlmIChsaW5lID09IE5VTEwpCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCVB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCBsaW5lKTsKLQkJCX0KLQkJfQorICAgICAgICAvKiBDaGVjayB0aGF0IGFsbCBlbnRyaWVzIGFyZSBpbmRlZWQgc3RyaW5ncy4gSWYgbm90LAorICAgICAgICAgICBhcHBseSB0aGUgc2FtZSBydWxlcyBhcyBmb3IgZmlsZS53cml0ZSgpIGFuZAorICAgICAgICAgICBjb252ZXJ0IHRoZSByZXRzIHRvIHN0cmluZ3MuIFRoaXMgaXMgc2xvdywgYnV0CisgICAgICAgICAgIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSBzaW5jZSBhbGwgY29udmVyc2lvbiBBUElzCisgICAgICAgICAgIGNvdWxkIHBvdGVudGlhbGx5IGV4ZWN1dGUgUHl0aG9uIGNvZGUuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOworICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICAgICAgICAgICAgICBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHYsICZidWZmZXIsICZsZW4pKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVsaW5lcygpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIHNlcXVlbmNlIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdzIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QsIGksIGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJc2VsZi0+Zl9zb2Z0c3BhY2UgPSAwOworICAgICAgICBzZWxmLT5mX3NvZnRzcGFjZSA9IDA7CiAKLQkJLyogU2luY2Ugd2UgYXJlIHJlbGVhc2luZyB0aGUgZ2xvYmFsIGxvY2ssIHRoZQotCQkgICBmb2xsb3dpbmcgY29kZSBtYXkgKm5vdCogZXhlY3V0ZSBQeXRob24gY29kZS4gKi8KLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCSAgICAJbGluZSA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKLQkJCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGxpbmUpOwotCQkJQloyX2J6V3JpdGUgKCZiemVycm9yLCBzZWxmLT5mcCwKLQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhsaW5lKSwgbGVuKTsKLQkJCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCQkJUHlfQkxPQ0tfVEhSRUFEUwotCQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQl9Ci0JCVB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIC8qIFNpbmNlIHdlIGFyZSByZWxlYXNpbmcgdGhlIGdsb2JhbCBsb2NrLCB0aGUKKyAgICAgICAgICAgZm9sbG93aW5nIGNvZGUgbWF5ICpub3QqIGV4ZWN1dGUgUHl0aG9uIGNvZGUuICovCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworICAgICAgICAgICAgbGluZSA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGxpbmUpOworICAgICAgICAgICAgQloyX2J6V3JpdGUgKCZiemVycm9yLCBzZWxmLT5mcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobGluZSksIGxlbik7CisgICAgICAgICAgICBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICAgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JCWlmIChqIDwgQ0hVTktTSVpFKQotCQkJYnJlYWs7Ci0JfQorICAgICAgICBpZiAoaiA8IENIVU5LU0laRSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXQgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXQgPSBQeV9Ob25lOwogCiAgIGVycm9yOgotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlQeV9YREVDUkVGKGxpc3QpOwotICAJUHlfWERFQ1JFRihpdGVyKTsKLQlyZXR1cm4gcmV0OworICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICBQeV9YREVDUkVGKGxpc3QpOworICAgIFB5X1hERUNSRUYoaXRlcik7CisgICAgcmV0dXJuIHJldDsKICN1bmRlZiBDSFVOS1NJWkUKIH0KIApAQCAtOTk0LDE0OCArOTk0LDE0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfc2VlayhCWjJGaWxlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgd2hlcmUgPSAwOwotCVB5T2JqZWN0ICpvZmZvYmo7Ci0JUHlfb2ZmX3Qgb2Zmc2V0OwotCWNoYXIgc21hbGxfYnVmZmVyW1NNQUxMQ0hVTktdOwotCWNoYXIgKmJ1ZmZlciA9IHNtYWxsX2J1ZmZlcjsKLQlzaXplX3QgYnVmZmVyc2l6ZSA9IFNNQUxMQ0hVTks7Ci0JUHlfb2ZmX3QgYnl0ZXNyZWFkID0gMDsKLQlzaXplX3QgcmVhZHNpemU7Ci0JaW50IGNodW5rc2l6ZTsKLQlpbnQgYnplcnJvcjsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBpbnQgd2hlcmUgPSAwOworICAgIFB5T2JqZWN0ICpvZmZvYmo7CisgICAgUHlfb2ZmX3Qgb2Zmc2V0OworICAgIGNoYXIgc21hbGxfYnVmZmVyW1NNQUxMQ0hVTktdOworICAgIGNoYXIgKmJ1ZmZlciA9IHNtYWxsX2J1ZmZlcjsKKyAgICBzaXplX3QgYnVmZmVyc2l6ZSA9IFNNQUxMQ0hVTks7CisgICAgUHlfb2ZmX3QgYnl0ZXNyZWFkID0gMDsKKyAgICBzaXplX3QgcmVhZHNpemU7CisgICAgaW50IGNodW5rc2l6ZTsKKyAgICBpbnQgYnplcnJvcjsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlZWsiLCAmb2Zmb2JqLCAmd2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpzZWVrIiwgJm9mZm9iaiwgJndoZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQlvZmZzZXQgPSBQeUludF9Bc0xvbmcob2Zmb2JqKTsKKyAgICBvZmZzZXQgPSBQeUludF9Bc0xvbmcob2Zmb2JqKTsKICNlbHNlCi0Jb2Zmc2V0ID0gUHlMb25nX0NoZWNrKG9mZm9iaikgPwotCQlQeUxvbmdfQXNMb25nTG9uZyhvZmZvYmopIDogUHlJbnRfQXNMb25nKG9mZm9iaik7CisgICAgb2Zmc2V0ID0gUHlMb25nX0NoZWNrKG9mZm9iaikgPworICAgICAgICBQeUxvbmdfQXNMb25nTG9uZyhvZmZvYmopIDogUHlJbnRfQXNMb25nKG9mZm9iaik7CiAjZW5kaWYKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCVV0aWxfRHJvcFJlYWRBaGVhZChzZWxmKTsKLQlzd2l0Y2ggKHNlbGYtPm1vZGUpIHsKLQkJY2FzZSBNT0RFX1JFQUQ6Ci0JCWNhc2UgTU9ERV9SRUFEX0VPRjoKLQkJCWJyZWFrOworICAgIEFDUVVJUkVfTE9DSyhzZWxmKTsKKyAgICBVdGlsX0Ryb3BSZWFkQWhlYWQoc2VsZik7CisgICAgc3dpdGNoIChzZWxmLT5tb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9SRUFEOgorICAgICAgICBjYXNlIE1PREVfUkVBRF9FT0Y6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIE1PREVfQ0xPU0VEOgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCQlnb3RvIGNsZWFudXA7CisgICAgICAgIGNhc2UgTU9ERV9DTE9TRUQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOwogCi0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJCQkJInNlZWsgd29ya3Mgb25seSB3aGlsZSByZWFkaW5nIik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlZWsgd29ya3Mgb25seSB3aGlsZSByZWFkaW5nIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCi0JaWYgKHdoZXJlID09IDIpIHsKLQkJaWYgKHNlbGYtPnNpemUgPT0gLTEpIHsKLQkJCWFzc2VydChzZWxmLT5tb2RlICE9IE1PREVfUkVBRF9FT0YpOwotCQkJZm9yICg7OykgewotCQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCQljaHVua3NpemUgPSBVdGlsX1VuaXZOZXdsaW5lUmVhZCgKLQkJCQkJCSZiemVycm9yLCBzZWxmLT5mcCwKLQkJCQkJCWJ1ZmZlciwgYnVmZmVyc2l6ZSwKLQkJCQkJCXNlbGYpOwotCQkJCXNlbGYtPnBvcyArPSBjaHVua3NpemU7Ci0JCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAod2hlcmUgPT0gMikgeworICAgICAgICBpZiAoc2VsZi0+c2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgYXNzZXJ0KHNlbGYtPm1vZGUgIT0gTU9ERV9SRUFEX0VPRik7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgICAgIGNodW5rc2l6ZSA9IFV0aWxfVW5pdk5ld2xpbmVSZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZik7CisgICAgICAgICAgICAgICAgc2VsZi0+cG9zICs9IGNodW5rc2l6ZTsKKyAgICAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JCQkJYnl0ZXNyZWFkICs9IGNodW5rc2l6ZTsKLQkJCQlpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCQkJCWdvdG8gY2xlYW51cDsKLQkJCQl9Ci0JCQl9Ci0JCQlzZWxmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKLQkJCXNlbGYtPnNpemUgPSBzZWxmLT5wb3M7Ci0JCQlieXRlc3JlYWQgPSAwOwotCQl9Ci0JCW9mZnNldCA9IHNlbGYtPnNpemUgKyBvZmZzZXQ7Ci0JfSBlbHNlIGlmICh3aGVyZSA9PSAxKSB7Ci0JCW9mZnNldCA9IHNlbGYtPnBvcyArIG9mZnNldDsKLQl9CisgICAgICAgICAgICAgICAgYnl0ZXNyZWFkICs9IGNodW5rc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoYnplcnJvciA9PSBCWl9TVFJFQU1fRU5EKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICAgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWxmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSBzZWxmLT5wb3M7CisgICAgICAgICAgICBieXRlc3JlYWQgPSAwOworICAgICAgICB9CisgICAgICAgIG9mZnNldCA9IHNlbGYtPnNpemUgKyBvZmZzZXQ7CisgICAgfSBlbHNlIGlmICh3aGVyZSA9PSAxKSB7CisgICAgICAgIG9mZnNldCA9IHNlbGYtPnBvcyArIG9mZnNldDsKKyAgICB9CiAKLQkvKiBCZWZvcmUgZ2V0dGluZyBoZXJlLCBvZmZzZXQgbXVzdCBiZSB0aGUgYWJzb2x1dGUgcG9zaXRpb24gdGhlIGZpbGUgCi0JICogcG9pbnRlciBzaG91bGQgYmUgc2V0IHRvLiAqLworICAgIC8qIEJlZm9yZSBnZXR0aW5nIGhlcmUsIG9mZnNldCBtdXN0IGJlIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiB0aGUgZmlsZQorICAgICAqIHBvaW50ZXIgc2hvdWxkIGJlIHNldCB0by4gKi8KIAotCWlmIChvZmZzZXQgPj0gc2VsZi0+cG9zKSB7Ci0JCS8qIHdlIGNhbiBtb3ZlIGZvcndhcmQgKi8KLQkJb2Zmc2V0IC09IHNlbGYtPnBvczsKLQl9IGVsc2UgewotCQkvKiB3ZSBjYW5ub3QgbW92ZSBiYWNrLCBzbyByZXdpbmQgdGhlIHN0cmVhbSAqLwotCQlCWjJfYnpSZWFkQ2xvc2UoJmJ6ZXJyb3IsIHNlbGYtPmZwKTsKLQkJaWYgKHNlbGYtPmZwKSB7Ci0JCQlQeUZpbGVfRGVjVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOwotCQkJc2VsZi0+ZnAgPSBOVUxMOwotCQl9Ci0JCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJcmV0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5maWxlLCAic2VlayIsICIoaSkiLCAwKTsKLQkJaWYgKCFyZXQpCi0JCQlnb3RvIGNsZWFudXA7Ci0JCVB5X0RFQ1JFRihyZXQpOwotCQlyZXQgPSBOVUxMOwotCQlzZWxmLT5wb3MgPSAwOwotCQlzZWxmLT5mcCA9IEJaMl9ielJlYWRPcGVuKCZiemVycm9yLCBQeUZpbGVfQXNGaWxlKHNlbGYtPmZpbGUpLAotCQkJCQkgIDAsIDAsIE5VTEwsIDApOwotCQlpZiAoc2VsZi0+ZnApCi0JCQlQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOwotCQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JCXNlbGYtPm1vZGUgPSBNT0RFX1JFQUQ7Ci0JfQorICAgIGlmIChvZmZzZXQgPj0gc2VsZi0+cG9zKSB7CisgICAgICAgIC8qIHdlIGNhbiBtb3ZlIGZvcndhcmQgKi8KKyAgICAgICAgb2Zmc2V0IC09IHNlbGYtPnBvczsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiB3ZSBjYW5ub3QgbW92ZSBiYWNrLCBzbyByZXdpbmQgdGhlIHN0cmVhbSAqLworICAgICAgICBCWjJfYnpSZWFkQ2xvc2UoJmJ6ZXJyb3IsIHNlbGYtPmZwKTsKKyAgICAgICAgaWYgKHNlbGYtPmZwKSB7CisgICAgICAgICAgICBQeUZpbGVfRGVjVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgICAgICAgICAgc2VsZi0+ZnAgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgICAgICBVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5maWxlLCAic2VlayIsICIoaSkiLCAwKTsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICByZXQgPSBOVUxMOworICAgICAgICBzZWxmLT5wb3MgPSAwOworICAgICAgICBzZWxmLT5mcCA9IEJaMl9ielJlYWRPcGVuKCZiemVycm9yLCBQeUZpbGVfQXNGaWxlKHNlbGYtPmZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwsIDApOworICAgICAgICBpZiAoc2VsZi0+ZnApCisgICAgICAgICAgICBQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgICAgICBpZiAoYnplcnJvciAhPSBCWl9PSykgeworICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisgICAgICAgIHNlbGYtPm1vZGUgPSBNT0RFX1JFQUQ7CisgICAgfQogCi0JaWYgKG9mZnNldCA8PSAwIHx8IHNlbGYtPm1vZGUgPT0gTU9ERV9SRUFEX0VPRikKLQkJZ290byBleGl0OworICAgIGlmIChvZmZzZXQgPD0gMCB8fCBzZWxmLT5tb2RlID09IE1PREVfUkVBRF9FT0YpCisgICAgICAgIGdvdG8gZXhpdDsKIAotCS8qIEJlZm9yZSBnZXR0aW5nIGhlcmUsIG9mZnNldCBtdXN0IGJlIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0JICogdG8gd2FsayBmb3J3YXJkLiAqLwotCWZvciAoOzspIHsKLQkJaWYgKG9mZnNldC1ieXRlc3JlYWQgPiBidWZmZXJzaXplKQotCQkJcmVhZHNpemUgPSBidWZmZXJzaXplOwotCQllbHNlCi0JCQkvKiBvZmZzZXQgbWlnaHQgYmUgd2lkZXIgdGhhdCByZWFkc2l6ZSwgYnV0IHRoZSByZXN1bHQKLQkJCSAqIG9mIHRoZSBzdWJ0cmFjdGlvbiBpcyBib3VuZCBieSBidWZmZXJzaXplIChzZWUgdGhlCi0JCQkgKiBjb25kaXRpb24gYWJvdmUpLiBidWZmZXJzaXplIGlzIDgxOTIuICovCi0JCQlyZWFkc2l6ZSA9IChzaXplX3QpKG9mZnNldC1ieXRlc3JlYWQpOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWNodW5rc2l6ZSA9IFV0aWxfVW5pdk5ld2xpbmVSZWFkKCZiemVycm9yLCBzZWxmLT5mcCwKLQkJCQkJCSBidWZmZXIsIHJlYWRzaXplLCBzZWxmKTsKLQkJc2VsZi0+cG9zICs9IGNodW5rc2l6ZTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJYnl0ZXNyZWFkICs9IGNodW5rc2l6ZTsKLQkJaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotCQkJc2VsZi0+c2l6ZSA9IHNlbGYtPnBvczsKLQkJCXNlbGYtPm1vZGUgPSBNT0RFX1JFQURfRU9GOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJZ290byBjbGVhbnVwOwotCQl9Ci0JCWlmIChieXRlc3JlYWQgPT0gb2Zmc2V0KQotCQkJYnJlYWs7Ci0JfQorICAgIC8qIEJlZm9yZSBnZXR0aW5nIGhlcmUsIG9mZnNldCBtdXN0IGJlIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgICAgICogdG8gd2FsayBmb3J3YXJkLiAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKG9mZnNldC1ieXRlc3JlYWQgPiBidWZmZXJzaXplKQorICAgICAgICAgICAgcmVhZHNpemUgPSBidWZmZXJzaXplOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiBvZmZzZXQgbWlnaHQgYmUgd2lkZXIgdGhhdCByZWFkc2l6ZSwgYnV0IHRoZSByZXN1bHQKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdWJ0cmFjdGlvbiBpcyBib3VuZCBieSBidWZmZXJzaXplIChzZWUgdGhlCisgICAgICAgICAgICAgKiBjb25kaXRpb24gYWJvdmUpLiBidWZmZXJzaXplIGlzIDgxOTIuICovCisgICAgICAgICAgICByZWFkc2l6ZSA9IChzaXplX3QpKG9mZnNldC1ieXRlc3JlYWQpOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGNodW5rc2l6ZSA9IFV0aWxfVW5pdk5ld2xpbmVSZWFkKCZiemVycm9yLCBzZWxmLT5mcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCByZWFkc2l6ZSwgc2VsZik7CisgICAgICAgIHNlbGYtPnBvcyArPSBjaHVua3NpemU7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGJ5dGVzcmVhZCArPSBjaHVua3NpemU7CisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIHNlbGYtPnNpemUgPSBzZWxmLT5wb3M7CisgICAgICAgICAgICBzZWxmLT5tb2RlID0gTU9ERV9SRUFEX0VPRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXNyZWFkID09IG9mZnNldCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAogZXhpdDoKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0ID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0ID0gUHlfTm9uZTsKIAogY2xlYW51cDoKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JcmV0dXJuIHJldDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKEJaMkZpbGVfdGVsbF9fZG9jX18sCkBAIC0xMTQ3LDIyICsxMTQ3LDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV90ZWxsKEJaMkZpbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOwogCi0JaWYgKHNlbGYtPm1vZGUgPT0gTU9ERV9DTE9TRUQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJZ290byBjbGVhbnVwOwotCX0KKyAgICBpZiAoc2VsZi0+bW9kZSA9PSBNT0RFX0NMT1NFRCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKICNpZiAhZGVmaW5lZChIQVZFX0xBUkdFRklMRV9TVVBQT1JUKQotCXJldCA9IFB5SW50X0Zyb21Mb25nKHNlbGYtPnBvcyk7CisgICAgcmV0ID0gUHlJbnRfRnJvbUxvbmcoc2VsZi0+cG9zKTsKICNlbHNlCi0JcmV0ID0gUHlMb25nX0Zyb21Mb25nTG9uZyhzZWxmLT5wb3MpOworICAgIHJldCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoc2VsZi0+cG9zKTsKICNlbmRpZgogCiBjbGVhbnVwOgotCXJldHVybiByZXQ7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKEJaMkZpbGVfY2xvc2VfX2RvY19fLApAQCAtMTE3Niw0OSArMTE3Niw0OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfY2xvc2UoQloyRmlsZU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlpbnQgYnplcnJvciA9IEJaX09LOworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIGludCBiemVycm9yID0gQlpfT0s7CiAKLQlBQ1FVSVJFX0xPQ0soc2VsZik7Ci0Jc3dpdGNoIChzZWxmLT5tb2RlKSB7Ci0JCWNhc2UgTU9ERV9SRUFEOgotCQljYXNlIE1PREVfUkVBRF9FT0Y6Ci0JCQlCWjJfYnpSZWFkQ2xvc2UoJmJ6ZXJyb3IsIHNlbGYtPmZwKTsKLQkJCWJyZWFrOwotCQljYXNlIE1PREVfV1JJVEU6Ci0JCQlCWjJfYnpXcml0ZUNsb3NlKCZiemVycm9yLCBzZWxmLT5mcCwKLQkJCQkJIDAsIE5VTEwsIE5VTEwpOwotCQkJYnJlYWs7Ci0JfQotCWlmIChzZWxmLT5mcCkgewotCQlQeUZpbGVfRGVjVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOwotCQlzZWxmLT5mcCA9IE5VTEw7Ci0JfQotCXNlbGYtPm1vZGUgPSBNT0RFX0NMT1NFRDsKLQlyZXQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPmZpbGUsICJjbG9zZSIsIE5VTEwpOwotCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJUHlfWERFQ1JFRihyZXQpOwotCQlyZXQgPSBOVUxMOwotCX0KKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgc3dpdGNoIChzZWxmLT5tb2RlKSB7CisgICAgICAgIGNhc2UgTU9ERV9SRUFEOgorICAgICAgICBjYXNlIE1PREVfUkVBRF9FT0Y6CisgICAgICAgICAgICBCWjJfYnpSZWFkQ2xvc2UoJmJ6ZXJyb3IsIHNlbGYtPmZwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1PREVfV1JJVEU6CisgICAgICAgICAgICBCWjJfYnpXcml0ZUNsb3NlKCZiemVycm9yLCBzZWxmLT5mcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHNlbGYtPmZwKSB7CisgICAgICAgIFB5RmlsZV9EZWNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7CisgICAgICAgIHNlbGYtPmZwID0gTlVMTDsKKyAgICB9CisgICAgc2VsZi0+bW9kZSA9IE1PREVfQ0xPU0VEOworICAgIHJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+ZmlsZSwgImNsb3NlIiwgTlVMTCk7CisgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICBQeV9YREVDUkVGKHJldCk7CisgICAgICAgIHJldCA9IE5VTEw7CisgICAgfQogCi0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCXJldHVybiByZXQ7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQloyRmlsZV9nZXRpdGVyKEJaMkZpbGVPYmplY3QgKnNlbGYpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgQloyRmlsZV9tZXRob2RzW10gPSB7Ci0JeyJyZWFkIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfcmVhZCwgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3JlYWRfX2RvY19ffSwKLQl7InJlYWRsaW5lIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfcmVhZGxpbmUsIE1FVEhfVkFSQVJHUywgQloyRmlsZV9yZWFkbGluZV9fZG9jX199LAotCXsicmVhZGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfcmVhZGxpbmVzLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfcmVhZGxpbmVzX19kb2NfX30sCi0JeyJ4cmVhZGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfZ2V0aXRlciwgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3hyZWFkbGluZXNfX2RvY19ffSwKLQl7IndyaXRlIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfd3JpdGUsIE1FVEhfVkFSQVJHUywgQloyRmlsZV93cml0ZV9fZG9jX199LAotCXsid3JpdGVsaW5lcyIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3dyaXRlbGluZXMsIE1FVEhfTywgQloyRmlsZV93cml0ZWxpbmVzX19kb2NfX30sCi0JeyJzZWVrIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfc2VlaywgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3NlZWtfX2RvY19ffSwKLQl7InRlbGwiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV90ZWxsLCBNRVRIX05PQVJHUywgQloyRmlsZV90ZWxsX19kb2NfX30sCi0JeyJjbG9zZSIsIChQeUNGdW5jdGlvbilCWjJGaWxlX2Nsb3NlLCBNRVRIX05PQVJHUywgQloyRmlsZV9jbG9zZV9fZG9jX199LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJyZWFkIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfcmVhZCwgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3JlYWRfX2RvY19ffSwKKyAgICB7InJlYWRsaW5lIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfcmVhZGxpbmUsIE1FVEhfVkFSQVJHUywgQloyRmlsZV9yZWFkbGluZV9fZG9jX199LAorICAgIHsicmVhZGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfcmVhZGxpbmVzLCBNRVRIX1ZBUkFSR1MsIEJaMkZpbGVfcmVhZGxpbmVzX19kb2NfX30sCisgICAgeyJ4cmVhZGxpbmVzIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfZ2V0aXRlciwgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3hyZWFkbGluZXNfX2RvY19ffSwKKyAgICB7IndyaXRlIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfd3JpdGUsIE1FVEhfVkFSQVJHUywgQloyRmlsZV93cml0ZV9fZG9jX199LAorICAgIHsid3JpdGVsaW5lcyIsIChQeUNGdW5jdGlvbilCWjJGaWxlX3dyaXRlbGluZXMsIE1FVEhfTywgQloyRmlsZV93cml0ZWxpbmVzX19kb2NfX30sCisgICAgeyJzZWVrIiwgKFB5Q0Z1bmN0aW9uKUJaMkZpbGVfc2VlaywgTUVUSF9WQVJBUkdTLCBCWjJGaWxlX3NlZWtfX2RvY19ffSwKKyAgICB7InRlbGwiLCAoUHlDRnVuY3Rpb24pQloyRmlsZV90ZWxsLCBNRVRIX05PQVJHUywgQloyRmlsZV90ZWxsX19kb2NfX30sCisgICAgeyJjbG9zZSIsIChQeUNGdW5jdGlvbilCWjJGaWxlX2Nsb3NlLCBNRVRIX05PQVJHUywgQloyRmlsZV9jbG9zZV9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTEyMjksNjAgKzEyMjksNjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX2dldF9uZXdsaW5lcyhCWjJGaWxlT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXN3aXRjaCAoc2VsZi0+Zl9uZXdsaW5ldHlwZXMpIHsKLQljYXNlIE5FV0xJTkVfVU5LTk9XTjoKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQljYXNlIE5FV0xJTkVfQ1I6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcciIpOwotCWNhc2UgTkVXTElORV9MRjoKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIlxuIik7Ci0JY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxuIik7Ci0JY2FzZSBORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcclxuIik7Ci0JY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfQ1JMRjoKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzcykiLCAiXHIiLCAiXHJcbiIpOwotCWNhc2UgTkVXTElORV9MRnxORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxuIiwgIlxyXG4iKTsKLQljYXNlIE5FV0xJTkVfQ1J8TkVXTElORV9MRnxORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3NzKSIsICJcciIsICJcbiIsICJcclxuIik7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAKLQkJCSAgICAgIlVua25vd24gbmV3bGluZXMgdmFsdWUgMHgleFxuIiwgCi0JCQkgICAgIHNlbGYtPmZfbmV3bGluZXR5cGVzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHN3aXRjaCAoc2VsZi0+Zl9uZXdsaW5ldHlwZXMpIHsKKyAgICBjYXNlIE5FV0xJTkVfVU5LTk9XTjoKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBjYXNlIE5FV0xJTkVfQ1I6CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcciIpOworICAgIGNhc2UgTkVXTElORV9MRjoKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIlxuIik7CisgICAgY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEY6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxuIik7CisgICAgY2FzZSBORVdMSU5FX0NSTEY6CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcclxuIik7CisgICAgY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfQ1JMRjoKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzcykiLCAiXHIiLCAiXHJcbiIpOworICAgIGNhc2UgTkVXTElORV9MRnxORVdMSU5FX0NSTEY6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxuIiwgIlxyXG4iKTsKKyAgICBjYXNlIE5FV0xJTkVfQ1J8TkVXTElORV9MRnxORVdMSU5FX0NSTEY6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3NzKSIsICJcciIsICJcbiIsICJcclxuIik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gbmV3bGluZXMgdmFsdWUgMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmZfbmV3bGluZXR5cGVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9nZXRfY2xvc2VkKEJaMkZpbGVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPm1vZGUgPT0gTU9ERV9DTE9TRUQpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIEJaMkZpbGVfZ2V0X21vZGUoQloyRmlsZU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLT5maWxlLCAibW9kZSIpOworICAgIHJldHVybiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYtPmZpbGUsICJtb2RlIik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX2dldF9uYW1lKEJaMkZpbGVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZi0+ZmlsZSwgIm5hbWUiKTsKKyAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLT5maWxlLCAibmFtZSIpOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgQloyRmlsZV9nZXRzZXRbXSA9IHsKLQl7ImNsb3NlZCIsIChnZXR0ZXIpQloyRmlsZV9nZXRfY2xvc2VkLCBOVUxMLAotCQkJIlRydWUgaWYgdGhlIGZpbGUgaXMgY2xvc2VkIn0sCi0JeyJuZXdsaW5lcyIsIChnZXR0ZXIpQloyRmlsZV9nZXRfbmV3bGluZXMsIE5VTEwsIAotCQkJImVuZC1vZi1saW5lIGNvbnZlbnRpb24gdXNlZCBpbiB0aGlzIGZpbGUifSwKLQl7Im1vZGUiLCAoZ2V0dGVyKUJaMkZpbGVfZ2V0X21vZGUsIE5VTEwsCi0JCQkiZmlsZSBtb2RlICgncicsICd3Jywgb3IgJ1UnKSJ9LAotCXsibmFtZSIsIChnZXR0ZXIpQloyRmlsZV9nZXRfbmFtZSwgTlVMTCwKLQkJCSJmaWxlIG5hbWUifSwKLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7ImNsb3NlZCIsIChnZXR0ZXIpQloyRmlsZV9nZXRfY2xvc2VkLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAiVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjbG9zZWQifSwKKyAgICB7Im5ld2xpbmVzIiwgKGdldHRlcilCWjJGaWxlX2dldF9uZXdsaW5lcywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgImVuZC1vZi1saW5lIGNvbnZlbnRpb24gdXNlZCBpbiB0aGlzIGZpbGUifSwKKyAgICB7Im1vZGUiLCAoZ2V0dGVyKUJaMkZpbGVfZ2V0X21vZGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICJmaWxlIG1vZGUgKCdyJywgJ3cnLCBvciAnVScpIn0sCisgICAgeyJuYW1lIiwgKGdldHRlcilCWjJGaWxlX2dldF9uYW1lLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAiZmlsZSBuYW1lIn0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIApAQCAtMTI5Myw5ICsxMjkzLDkgQEAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKEJaMkZpbGVPYmplY3QsIHgpCiAKIHN0YXRpYyBQeU1lbWJlckRlZiBCWjJGaWxlX21lbWJlcnNbXSA9IHsKLQl7InNvZnRzcGFjZSIsCVRfSU5ULAkJT0ZGKGZfc29mdHNwYWNlKSwgMCwKLQkgImZsYWcgaW5kaWNhdGluZyB0aGF0IGEgc3BhY2UgbmVlZHMgdG8gYmUgcHJpbnRlZDsgdXNlZCBieSBwcmludCJ9LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsic29mdHNwYWNlIiwgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihmX3NvZnRzcGFjZSksIDAsCisgICAgICJmbGFnIGluZGljYXRpbmcgdGhhdCBhIHNwYWNlIG5lZWRzIHRvIGJlIHByaW50ZWQ7IHVzZWQgYnkgcHJpbnQifSwKKyAgICB7TlVMTH0gICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCkBAIC0xMzA0LDE1MyArMTMwNCwxNTMgQEAKIHN0YXRpYyBpbnQKIEJaMkZpbGVfaW5pdChCWjJGaWxlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZpbGVuYW1lIiwgIm1vZGUiLCAiYnVmZmVyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2xldmVsIiwgMH07Ci0JUHlPYmplY3QgKm5hbWU7Ci0JY2hhciAqbW9kZSA9ICJyIjsKLQlpbnQgYnVmZmVyaW5nID0gLTE7Ci0JaW50IGNvbXByZXNzbGV2ZWwgPSA5OwotCWludCBiemVycm9yOwotCWludCBtb2RlX2NoYXIgPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmlsZW5hbWUiLCAibW9kZSIsICJidWZmZXJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3NsZXZlbCIsIDB9OworICAgIFB5T2JqZWN0ICpuYW1lOworICAgIGNoYXIgKm1vZGUgPSAiciI7CisgICAgaW50IGJ1ZmZlcmluZyA9IC0xOworICAgIGludCBjb21wcmVzc2xldmVsID0gOTsKKyAgICBpbnQgYnplcnJvcjsKKyAgICBpbnQgbW9kZV9jaGFyID0gMDsKIAotCXNlbGYtPnNpemUgPSAtMTsKKyAgICBzZWxmLT5zaXplID0gLTE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHNpaTpCWjJGaWxlIiwKLQkJCQkJIGt3bGlzdCwgJm5hbWUsICZtb2RlLCAmYnVmZmVyaW5nLAotCQkJCQkgJmNvbXByZXNzbGV2ZWwpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xzaWk6QloyRmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmbmFtZSwgJm1vZGUsICZidWZmZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzbGV2ZWwpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoY29tcHJlc3NsZXZlbCA8IDEgfHwgY29tcHJlc3NsZXZlbCA+IDkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNvbXByZXNzbGV2ZWwgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDkiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoY29tcHJlc3NsZXZlbCA8IDEgfHwgY29tcHJlc3NsZXZlbCA+IDkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3NsZXZlbCBtdXN0IGJlIGJldHdlZW4gMSBhbmQgOSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JZm9yICg7OykgewotCQlpbnQgZXJyb3IgPSAwOwotCQlzd2l0Y2ggKCptb2RlKSB7Ci0JCQljYXNlICdyJzoKLQkJCWNhc2UgJ3cnOgotCQkJCWlmIChtb2RlX2NoYXIpCi0JCQkJCWVycm9yID0gMTsKLQkJCQltb2RlX2NoYXIgPSAqbW9kZTsKLQkJCQlicmVhazsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBlcnJvciA9IDA7CisgICAgICAgIHN3aXRjaCAoKm1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICAgICAgaWYgKG1vZGVfY2hhcikKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAxOworICAgICAgICAgICAgICAgIG1vZGVfY2hhciA9ICptb2RlOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQljYXNlICdiJzoKLQkJCQlicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQljYXNlICdVJzoKKyAgICAgICAgICAgIGNhc2UgJ1UnOgogI2lmZGVmIF9fVk1TCi0JCQkJc2VsZi0+Zl91bml2X25ld2xpbmUgPSAwOworICAgICAgICAgICAgICAgIHNlbGYtPmZfdW5pdl9uZXdsaW5lID0gMDsKICNlbHNlCi0JCQkJc2VsZi0+Zl91bml2X25ld2xpbmUgPSAxOworICAgICAgICAgICAgICAgIHNlbGYtPmZfdW5pdl9uZXdsaW5lID0gMTsKICNlbmRpZgotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQlkZWZhdWx0OgotCQkJCWVycm9yID0gMTsKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoZXJyb3IpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgImludmFsaWQgbW9kZSBjaGFyICVjIiwgKm1vZGUpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1vZGUrKzsKLQkJaWYgKCptb2RlID09ICdcMCcpCi0JCQlicmVhazsKLQl9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG1vZGUgY2hhciAlYyIsICptb2RlKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtb2RlKys7CisgICAgICAgIGlmICgqbW9kZSA9PSAnXDAnKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogCi0JaWYgKG1vZGVfY2hhciA9PSAwKSB7Ci0JCW1vZGVfY2hhciA9ICdyJzsKLQl9CisgICAgaWYgKG1vZGVfY2hhciA9PSAwKSB7CisgICAgICAgIG1vZGVfY2hhciA9ICdyJzsKKyAgICB9CiAKLQltb2RlID0gKG1vZGVfY2hhciA9PSAncicpID8gInJiIiA6ICJ3YiI7CisgICAgbW9kZSA9IChtb2RlX2NoYXIgPT0gJ3InKSA/ICJyYiIgOiAid2IiOwogCi0Jc2VsZi0+ZmlsZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSZQeUZpbGVfVHlwZSwgIihPc2kpIiwKLQkJCQkJICAgbmFtZSwgbW9kZSwgYnVmZmVyaW5nKTsKLQlpZiAoc2VsZi0+ZmlsZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgc2VsZi0+ZmlsZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSZQeUZpbGVfVHlwZSwgIihPc2kpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1vZGUsIGJ1ZmZlcmluZyk7CisgICAgaWYgKHNlbGYtPmZpbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JLyogRnJvbSBub3cgb24sIHdlIGhhdmUgc3R1ZmYgdG8gZGVhbGxvYywgc28ganVtcCB0byBlcnJvciBsYWJlbAotCSAqIGluc3RlYWQgb2YgcmV0dXJuaW5nICovCisgICAgLyogRnJvbSBub3cgb24sIHdlIGhhdmUgc3R1ZmYgdG8gZGVhbGxvYywgc28ganVtcCB0byBlcnJvciBsYWJlbAorICAgICAqIGluc3RlYWQgb2YgcmV0dXJuaW5nICovCiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCXNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKCFzZWxmLT5sb2NrKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInVuYWJsZSB0byBhbGxvY2F0ZSBsb2NrIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIHNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgaWYgKCFzZWxmLT5sb2NrKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInVuYWJsZSB0byBhbGxvY2F0ZSBsb2NrIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogI2VuZGlmCiAKLQlpZiAobW9kZV9jaGFyID09ICdyJykKLQkJc2VsZi0+ZnAgPSBCWjJfYnpSZWFkT3BlbigmYnplcnJvciwKLQkJCQkJICBQeUZpbGVfQXNGaWxlKHNlbGYtPmZpbGUpLAotCQkJCQkgIDAsIDAsIE5VTEwsIDApOwotCWVsc2UKLQkJc2VsZi0+ZnAgPSBCWjJfYnpXcml0ZU9wZW4oJmJ6ZXJyb3IsCi0JCQkJCSAgIFB5RmlsZV9Bc0ZpbGUoc2VsZi0+ZmlsZSksCi0JCQkJCSAgIGNvbXByZXNzbGV2ZWwsIDAsIDApOworICAgIGlmIChtb2RlX2NoYXIgPT0gJ3InKQorICAgICAgICBzZWxmLT5mcCA9IEJaMl9ielJlYWRPcGVuKCZiemVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Bc0ZpbGUoc2VsZi0+ZmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgTlVMTCwgMCk7CisgICAgZWxzZQorICAgICAgICBzZWxmLT5mcCA9IEJaMl9ieldyaXRlT3BlbigmYnplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGaWxlX0FzRmlsZShzZWxmLT5maWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NsZXZlbCwgMCwgMCk7CiAKLQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCVB5RmlsZV9JbmNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7CisgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOwogCi0Jc2VsZi0+bW9kZSA9IChtb2RlX2NoYXIgPT0gJ3InKSA/IE1PREVfUkVBRCA6IE1PREVfV1JJVEU7CisgICAgc2VsZi0+bW9kZSA9IChtb2RlX2NoYXIgPT0gJ3InKSA/IE1PREVfUkVBRCA6IE1PREVfV1JJVEU7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAogZXJyb3I6Ci0JUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+bG9jaykgewotCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7Ci0JCXNlbGYtPmxvY2sgPSBOVUxMOwotCX0KKyAgICBpZiAoc2VsZi0+bG9jaykgeworICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisgICAgICAgIHNlbGYtPmxvY2sgPSBOVUxMOworICAgIH0KICNlbmRpZgotCXJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyB2b2lkCiBCWjJGaWxlX2RlYWxsb2MoQloyRmlsZU9iamVjdCAqc2VsZikKIHsKLQlpbnQgYnplcnJvcjsKKyAgICBpbnQgYnplcnJvcjsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChzZWxmLT5sb2NrKQotCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisgICAgaWYgKHNlbGYtPmxvY2spCisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrKTsKICNlbmRpZgotCXN3aXRjaCAoc2VsZi0+bW9kZSkgewotCQljYXNlIE1PREVfUkVBRDoKLQkJY2FzZSBNT0RFX1JFQURfRU9GOgotCQkJQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNT0RFX1dSSVRFOgotCQkJQloyX2J6V3JpdGVDbG9zZSgmYnplcnJvciwgc2VsZi0+ZnAsCi0JCQkJCSAwLCBOVUxMLCBOVUxMKTsKLQkJCWJyZWFrOwotCX0KLQlpZiAoc2VsZi0+ZnApIHsKLQkJUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQkJc2VsZi0+ZnAgPSBOVUxMOwotCX0KLQlVdGlsX0Ryb3BSZWFkQWhlYWQoc2VsZik7Ci0JUHlfWERFQ1JFRihzZWxmLT5maWxlKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIHN3aXRjaCAoc2VsZi0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUkVBRDoKKyAgICAgICAgY2FzZSBNT0RFX1JFQURfRU9GOgorICAgICAgICAgICAgQloyX2J6UmVhZENsb3NlKCZiemVycm9yLCBzZWxmLT5mcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX1dSSVRFOgorICAgICAgICAgICAgQloyX2J6V3JpdGVDbG9zZSgmYnplcnJvciwgc2VsZi0+ZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChzZWxmLT5mcCkgeworICAgICAgICBQeUZpbGVfRGVjVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgICAgICBzZWxmLT5mcCA9IE5VTEw7CisgICAgfQorICAgIFV0aWxfRHJvcFJlYWRBaGVhZChzZWxmKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmZpbGUpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIC8qIFRoaXMgaXMgYSBoYWNrZWQgdmVyc2lvbiBvZiBQeXRob24ncyBmaWxlb2JqZWN0LmM6ZmlsZV9nZXRpdGVyKCkuICovCiBzdGF0aWMgUHlPYmplY3QgKgogQloyRmlsZV9nZXRpdGVyKEJaMkZpbGVPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm1vZGUgPT0gTU9ERV9DTE9TRUQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRigoUHlPYmplY3QqKXNlbGYpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIGlmIChzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRigoUHlPYmplY3QqKXNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiAvKiBUaGlzIGlzIGEgaGFja2VkIHZlcnNpb24gb2YgUHl0aG9uJ3MgZmlsZW9iamVjdC5jOmZpbGVfaXRlcm5leHQoKS4gKi8KQEAgLTE0NTgsMjEgKzE0NTgsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBCWjJGaWxlX2l0ZXJuZXh0KEJaMkZpbGVPYmplY3QgKnNlbGYpCiB7Ci0JUHlTdHJpbmdPYmplY3QqIHJldDsKLQlBQ1FVSVJFX0xPQ0soc2VsZik7Ci0JaWYgKHNlbGYtPm1vZGUgPT0gTU9ERV9DTE9TRUQpIHsKLSAgICAgICAgICAgICAgICBSRUxFQVNFX0xPQ0soc2VsZik7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXQgPSBVdGlsX1JlYWRBaGVhZEdldExpbmVTa2lwKHNlbGYsIDAsIFJFQURBSEVBRF9CVUZTSVpFKTsKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JaWYgKHJldCA9PSBOVUxMIHx8IFB5U3RyaW5nX0dFVF9TSVpFKHJldCkgPT0gMCkgewotCQlQeV9YREVDUkVGKHJldCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmV0OworICAgIFB5U3RyaW5nT2JqZWN0KiByZXQ7CisgICAgQUNRVUlSRV9MT0NLKHNlbGYpOworICAgIGlmIChzZWxmLT5tb2RlID09IE1PREVfQ0xPU0VEKSB7CisgICAgICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gVXRpbF9SZWFkQWhlYWRHZXRMaW5lU2tpcChzZWxmLCAwLCBSRUFEQUhFQURfQlVGU0laRSk7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIGlmIChyZXQgPT0gTlVMTCB8fCBQeVN0cmluZ19HRVRfU0laRShyZXQpID09IDApIHsKKyAgICAgICAgUHlfWERFQ1JFRihyZXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJldDsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCkBAIC0xNTAwLDQ2ICsxNTAwLDQ2IEBACiA7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgQloyRmlsZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJiejIuQloyRmlsZSIsCQkvKnRwX25hbWUqLwotCXNpemVvZihCWjJGaWxlT2JqZWN0KSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JKGRlc3RydWN0b3IpQloyRmlsZV9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwJCQkvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwotICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KLSAgICAgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsLyp0cF9zZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLwotICAgICAgICBCWjJGaWxlX19kb2NfXywgICAgICAgICAvKnRwX2RvYyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgICAgICAoZ2V0aXRlcmZ1bmMpQloyRmlsZV9nZXRpdGVyLCAvKnRwX2l0ZXIqLwotICAgICAgICAoaXRlcm5leHRmdW5jKUJaMkZpbGVfaXRlcm5leHQsIC8qdHBfaXRlcm5leHQqLwotICAgICAgICBCWjJGaWxlX21ldGhvZHMsICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICBCWjJGaWxlX21lbWJlcnMsICAgICAgICAvKnRwX21lbWJlcnMqLwotICAgICAgICBCWjJGaWxlX2dldHNldCwgICAgICAgICAvKnRwX2dldHNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwotICAgICAgICAoaW5pdHByb2MpQloyRmlsZV9pbml0LCAvKnRwX2luaXQqLwotICAgICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAvKnRwX2FsbG9jKi8KLSAgICAgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgLyp0cF9uZXcqLwotICAgICAgCV9QeU9iamVjdF9EZWwsICAgICAgICAgIC8qdHBfZnJlZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJiejIuQloyRmlsZSIsICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihCWjJGaWxlT2JqZWN0KSwgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIChkZXN0cnVjdG9yKUJaMkZpbGVfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KKyAgICBCWjJGaWxlX19kb2NfXywgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgKGdldGl0ZXJmdW5jKUJaMkZpbGVfZ2V0aXRlciwgLyp0cF9pdGVyKi8KKyAgICAoaXRlcm5leHRmdW5jKUJaMkZpbGVfaXRlcm5leHQsIC8qdHBfaXRlcm5leHQqLworICAgIEJaMkZpbGVfbWV0aG9kcywgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgQloyRmlsZV9tZW1iZXJzLCAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICBCWjJGaWxlX2dldHNldCwgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAoaW5pdHByb2MpQloyRmlsZV9pbml0LCAvKnRwX2luaXQqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgIC8qdHBfYWxsb2MqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgIC8qdHBfbmV3Ki8KKyAgICBfUHlPYmplY3RfRGVsLCAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLwogfTsKIAogCkBAIC0xNTU4LDc2ICsxNTU4LDc2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyQ29tcF9jb21wcmVzcyhCWjJDb21wT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGRhdGE7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YXNpemU7Ci0JaW50IGJ1ZnNpemUgPSBTTUFMTENIVU5LOwotCVBZX0xPTkdfTE9ORyB0b3RhbG91dDsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQliel9zdHJlYW0gKmJ6cyA9ICZzZWxmLT5ienM7Ci0JaW50IGJ6ZXJyb3I7CisgICAgUHlfYnVmZmVyIHBkYXRhOworICAgIGNoYXIgKmRhdGE7CisgICAgaW50IGRhdGFzaXplOworICAgIGludCBidWZzaXplID0gU01BTExDSFVOSzsKKyAgICBQWV9MT05HX0xPTkcgdG90YWxvdXQ7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgYnpfc3RyZWFtICpienMgPSAmc2VsZi0+YnpzOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpjb21wcmVzcyIsICZwZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCWRhdGEgPSBwZGF0YS5idWY7Ci0JZGF0YXNpemUgPSBwZGF0YS5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpjb21wcmVzcyIsICZwZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGEgPSBwZGF0YS5idWY7CisgICAgZGF0YXNpemUgPSBwZGF0YS5sZW47CiAKLQlpZiAoZGF0YXNpemUgPT0gMCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQl9CisgICAgaWYgKGRhdGFzaXplID09IDApIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgfQogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCWlmICghc2VsZi0+cnVubmluZykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkidGhpcyBvYmplY3Qgd2FzIGFscmVhZHkgZmx1c2hlZCIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgaWYgKCFzZWxmLT5ydW5uaW5nKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgb2JqZWN0IHdhcyBhbHJlYWR5IGZsdXNoZWQiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKLQlpZiAoIXJldCkKLQkJZ290byBlcnJvcjsKKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWJ6cy0+bmV4dF9pbiA9IGRhdGE7Ci0JYnpzLT5hdmFpbF9pbiA9IGRhdGFzaXplOwotCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLQlienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CisgICAgYnpzLT5uZXh0X2luID0gZGF0YTsKKyAgICBienMtPmF2YWlsX2luID0gZGF0YXNpemU7CisgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOworICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKIAotCXRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOworICAgIHRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOwogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzcyhienMsIEJaX1JVTik7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChiemVycm9yICE9IEJaX1JVTl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlpZiAoYnpzLT5hdmFpbF9pbiA9PSAwKQotCQkJYnJlYWs7IC8qIG5vIG1vcmUgaW5wdXQgZGF0YSAqLwotCQlpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgewotCQkJYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgewotCQkJCUJaMl9iekNvbXByZXNzRW5kKGJ6cyk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIChCWlNfVE9UQUxfT1VUKGJ6cykKLQkJCQkJCSAgICAtIHRvdGFsb3V0KTsKLQkJCWJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOwotCQl9Ci0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBiemVycm9yID0gQloyX2J6Q29tcHJlc3MoYnpzLCBCWl9SVU4pOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAoYnplcnJvciAhPSBCWl9SVU5fT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfaW4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOyAvKiBubyBtb3JlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKKyAgICAgICAgICAgICAgICBCWjJfYnpDb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyAoQlpTX1RPVEFMX09VVChienMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB0b3RhbG91dCk7CisgICAgICAgICAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemUgLSAoYnpzLT5uZXh0X291dCAtIEJVRihyZXQpKTsKKyAgICAgICAgfQorICAgIH0KIAotCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdCkoQlpTX1RPVEFMX09VVChienMpIC0gdG90YWxvdXQpKTsKIAotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JcmV0dXJuIHJldDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIHJldHVybiByZXQ7CiAKIGVycm9yOgotCVJFTEVBU0VfTE9DSyhzZWxmKTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JUHlfWERFQ1JFRihyZXQpOwotCXJldHVybiBOVUxMOworICAgIFJFTEVBU0VfTE9DSyhzZWxmKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgUHlfWERFQ1JFRihyZXQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoQloyQ29tcF9mbHVzaF9fZG9jX18sCkBAIC0xNjQwLDY4ICsxNjQwLDY4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyQ29tcF9mbHVzaChCWjJDb21wT2JqZWN0ICpzZWxmKQogewotCWludCBidWZzaXplID0gU01BTExDSFVOSzsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQliel9zdHJlYW0gKmJ6cyA9ICZzZWxmLT5ienM7Ci0JUFlfTE9OR19MT05HIHRvdGFsb3V0OwotCWludCBiemVycm9yOworICAgIGludCBidWZzaXplID0gU01BTExDSFVOSzsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBiel9zdHJlYW0gKmJ6cyA9ICZzZWxmLT5ienM7CisgICAgUFlfTE9OR19MT05HIHRvdGFsb3V0OworICAgIGludCBiemVycm9yOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCWlmICghc2VsZi0+cnVubmluZykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm9iamVjdCB3YXMgYWxyZWFkeSAiCi0JCQkJCQkgICJmbHVzaGVkIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXNlbGYtPnJ1bm5pbmcgPSAwOworICAgIEFDUVVJUkVfTE9DSyhzZWxmKTsKKyAgICBpZiAoIXNlbGYtPnJ1bm5pbmcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvYmplY3Qgd2FzIGFscmVhZHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsdXNoZWQiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgc2VsZi0+cnVubmluZyA9IDA7CiAKLQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKLQlpZiAoIXJldCkKLQkJZ290byBlcnJvcjsKKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLQlienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CisgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOworICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKIAotCXRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOworICAgIHRvdGFsb3V0ID0gQlpTX1RPVEFMX09VVChienMpOwogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzcyhienMsIEJaX0ZJTklTSCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfRklOSVNIX09LKSB7Ci0JCQlVdGlsX0NhdGNoQloyRXJyb3IoYnplcnJvcik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWlmIChienMtPmF2YWlsX291dCA9PSAwKSB7Ci0JCQlidWZzaXplID0gVXRpbF9OZXdCdWZmZXJTaXplKGJ1ZnNpemUpOwotCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnJldCwgYnVmc2l6ZSkgPCAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQlienMtPm5leHRfb3V0ID0gQlVGKHJldCk7Ci0JCQlienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyAoQlpTX1RPVEFMX09VVChienMpCi0JCQkJCQkgICAgLSB0b3RhbG91dCk7Ci0JCQlienMtPmF2YWlsX291dCA9IGJ1ZnNpemUgLSAoYnpzLT5uZXh0X291dCAtIEJVRihyZXQpKTsKLQkJfQotCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgYnplcnJvciA9IEJaMl9iekNvbXByZXNzKGJ6cywgQlpfRklOSVNIKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoYnplcnJvciAhPSBCWl9GSU5JU0hfT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKKyAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIChCWlNfVE9UQUxfT1VUKGJ6cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRvdGFsb3V0KTsKKyAgICAgICAgICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CisgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CiAKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JcmV0dXJuIHJldDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgcmV0dXJuIHJldDsKIAogZXJyb3I6Ci0JUkVMRUFTRV9MT0NLKHNlbGYpOwotCVB5X1hERUNSRUYocmV0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgUHlfWERFQ1JFRihyZXQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQloyQ29tcF9tZXRob2RzW10gPSB7Ci0JeyJjb21wcmVzcyIsIChQeUNGdW5jdGlvbilCWjJDb21wX2NvbXByZXNzLCBNRVRIX1ZBUkFSR1MsCi0JIEJaMkNvbXBfY29tcHJlc3NfX2RvY19ffSwKLQl7ImZsdXNoIiwgKFB5Q0Z1bmN0aW9uKUJaMkNvbXBfZmx1c2gsIE1FVEhfTk9BUkdTLAotCSBCWjJDb21wX2ZsdXNoX19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKUJaMkNvbXBfY29tcHJlc3MsIE1FVEhfVkFSQVJHUywKKyAgICAgQloyQ29tcF9jb21wcmVzc19fZG9jX199LAorICAgIHsiZmx1c2giLCAoUHlDRnVuY3Rpb24pQloyQ29tcF9mbHVzaCwgTUVUSF9OT0FSR1MsCisgICAgIEJaMkNvbXBfZmx1c2hfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0xNzExLDU3ICsxNzExLDU3IEBACiBzdGF0aWMgaW50CiBCWjJDb21wX2luaXQoQloyQ29tcE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JaW50IGNvbXByZXNzbGV2ZWwgPSA5OwotCWludCBiemVycm9yOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiY29tcHJlc3NsZXZlbCIsIDB9OworICAgIGludCBjb21wcmVzc2xldmVsID0gOTsKKyAgICBpbnQgYnplcnJvcjsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImNvbXByZXNzbGV2ZWwiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpOkJaMkNvbXByZXNzb3IiLAotCQkJCQkga3dsaXN0LCAmY29tcHJlc3NsZXZlbCkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8aTpCWjJDb21wcmVzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZjb21wcmVzc2xldmVsKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKGNvbXByZXNzbGV2ZWwgPCAxIHx8IGNvbXByZXNzbGV2ZWwgPiA5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjb21wcmVzc2xldmVsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5Iik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGlmIChjb21wcmVzc2xldmVsIDwgMSB8fCBjb21wcmVzc2xldmVsID4gOSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2xldmVsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5Iik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmICghc2VsZi0+bG9jaykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmICghc2VsZi0+bG9jaykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KICNlbmRpZgogCi0JbWVtc2V0KCZzZWxmLT5ienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKLQliemVycm9yID0gQloyX2J6Q29tcHJlc3NJbml0KCZzZWxmLT5ienMsIGNvbXByZXNzbGV2ZWwsIDAsIDApOwotCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgbWVtc2V0KCZzZWxmLT5ienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKKyAgICBiemVycm9yID0gQloyX2J6Q29tcHJlc3NJbml0KCZzZWxmLT5ienMsIGNvbXByZXNzbGV2ZWwsIDAsIDApOworICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlzZWxmLT5ydW5uaW5nID0gMTsKKyAgICBzZWxmLT5ydW5uaW5nID0gMTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogZXJyb3I6CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+bG9jaykgewotCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7Ci0JCXNlbGYtPmxvY2sgPSBOVUxMOwotCX0KKyAgICBpZiAoc2VsZi0+bG9jaykgeworICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisgICAgICAgIHNlbGYtPmxvY2sgPSBOVUxMOworICAgIH0KICNlbmRpZgotCXJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyB2b2lkCiBCWjJDb21wX2RlYWxsb2MoQloyQ29tcE9iamVjdCAqc2VsZikKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChzZWxmLT5sb2NrKQotCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisgICAgaWYgKHNlbGYtPmxvY2spCisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrKTsKICNlbmRpZgotCUJaMl9iekNvbXByZXNzRW5kKCZzZWxmLT5ienMpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgQloyX2J6Q29tcHJlc3NFbmQoJnNlbGYtPmJ6cyk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogCkBAIC0xNzc4LDQ2ICsxNzc4LDQ2IEBACiAiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBCWjJDb21wX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImJ6Mi5CWjJDb21wcmVzc29yIiwJLyp0cF9uYW1lKi8KLQlzaXplb2YoQloyQ29tcE9iamVjdCksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCShkZXN0cnVjdG9yKUJaMkNvbXBfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KLSAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCi0gICAgICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLC8qdHBfc2V0YXR0cm8qLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCi0gICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KLSAgICAgICAgQloyQ29tcF9fZG9jX18sICAgICAgICAgLyp0cF9kb2MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCi0gICAgICAgIEJaMkNvbXBfbWV0aG9kcywgICAgICAgIC8qdHBfbWV0aG9kcyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCi0gICAgICAgIChpbml0cHJvYylCWjJDb21wX2luaXQsIC8qdHBfaW5pdCovCi0gICAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgIC8qdHBfYWxsb2MqLwotICAgICAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAvKnRwX25ldyovCi0gICAgICAJX1B5T2JqZWN0X0RlbCwgICAgICAgICAgLyp0cF9mcmVlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImJ6Mi5CWjJDb21wcmVzc29yIiwgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEJaMkNvbXBPYmplY3QpLCAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpQloyQ29tcF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLworICAgIEJaMkNvbXBfX2RvY19fLCAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIEJaMkNvbXBfbWV0aG9kcywgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAoaW5pdHByb2MpQloyQ29tcF9pbml0LCAvKnRwX2luaXQqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgIC8qdHBfYWxsb2MqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgIC8qdHBfbmV3Ki8KKyAgICBfUHlPYmplY3RfRGVsLCAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLwogfTsKIAogCkBAIC0xODI4LDggKzE4MjgsOCBAQAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoQloyRGVjb21wT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgQloyRGVjb21wX21lbWJlcnNbXSA9IHsKLQl7InVudXNlZF9kYXRhIiwgVF9PQkpFQ1QsIE9GRih1bnVzZWRfZGF0YSksIFJPfSwKLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7InVudXNlZF9kYXRhIiwgVF9PQkpFQ1QsIE9GRih1bnVzZWRfZGF0YSksIFJPfSwKKyAgICB7TlVMTH0gICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogCkBAIC0xODQ5LDg4ICsxODQ5LDg4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogQloyRGVjb21wX2RlY29tcHJlc3MoQloyRGVjb21wT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9idWZmZXIgcGRhdGE7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YXNpemU7Ci0JaW50IGJ1ZnNpemUgPSBTTUFMTENIVU5LOwotCVBZX0xPTkdfTE9ORyB0b3RhbG91dDsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQliel9zdHJlYW0gKmJ6cyA9ICZzZWxmLT5ienM7Ci0JaW50IGJ6ZXJyb3I7CisgICAgUHlfYnVmZmVyIHBkYXRhOworICAgIGNoYXIgKmRhdGE7CisgICAgaW50IGRhdGFzaXplOworICAgIGludCBidWZzaXplID0gU01BTExDSFVOSzsKKyAgICBQWV9MT05HX0xPTkcgdG90YWxvdXQ7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgYnpfc3RyZWFtICpienMgPSAmc2VsZi0+YnpzOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpkZWNvbXByZXNzIiwgJnBkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YSA9IHBkYXRhLmJ1ZjsKLQlkYXRhc2l6ZSA9IHBkYXRhLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmRlY29tcHJlc3MiLCAmcGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gcGRhdGEuYnVmOworICAgIGRhdGFzaXplID0gcGRhdGEubGVuOwogCi0JQUNRVUlSRV9MT0NLKHNlbGYpOwotCWlmICghc2VsZi0+cnVubmluZykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsICJlbmQgb2Ygc3RyZWFtIHdhcyAiCi0JCQkJCQkiYWxyZWFkeSBmb3VuZCIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBBQ1FVSVJFX0xPQ0soc2VsZik7CisgICAgaWYgKCFzZWxmLT5ydW5uaW5nKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwgImVuZCBvZiBzdHJlYW0gd2FzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxyZWFkeSBmb3VuZCIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCXJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpemUpOwotCWlmICghcmV0KQotCQlnb3RvIGVycm9yOworICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpemUpOworICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIGVycm9yOwogCi0JYnpzLT5uZXh0X2luID0gZGF0YTsKLQlienMtPmF2YWlsX2luID0gZGF0YXNpemU7Ci0JYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOwotCWJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKKyAgICBienMtPm5leHRfaW4gPSBkYXRhOworICAgIGJ6cy0+YXZhaWxfaW4gPSBkYXRhc2l6ZTsKKyAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCk7CisgICAgYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplOwogCi0JdG90YWxvdXQgPSBCWlNfVE9UQUxfT1VUKGJ6cyk7CisgICAgdG90YWxvdXQgPSBCWlNfVE9UQUxfT1VUKGJ6cyk7CiAKLQlmb3IgKDs7KSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJYnplcnJvciA9IEJaMl9iekRlY29tcHJlc3MoYnpzKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJaWYgKGJ6ZXJyb3IgPT0gQlpfU1RSRUFNX0VORCkgewotCQkJaWYgKGJ6cy0+YXZhaWxfaW4gIT0gMCkgewotCQkJCVB5X0RFQ1JFRihzZWxmLT51bnVzZWRfZGF0YSk7Ci0JCQkJc2VsZi0+dW51c2VkX2RhdGEgPQotCQkJCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShienMtPm5leHRfaW4sCi0JCQkJCQkJICAgICAgIGJ6cy0+YXZhaWxfaW4pOwotCQkJfQotCQkJc2VsZi0+cnVubmluZyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYnplcnJvciAhPSBCWl9PSykgewotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlpZiAoYnpzLT5hdmFpbF9pbiA9PSAwKQotCQkJYnJlYWs7IC8qIG5vIG1vcmUgaW5wdXQgZGF0YSAqLwotCQlpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgewotCQkJYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgewotCQkJCUJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOwotCQkJYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgKEJaU19UT1RBTF9PVVQoYnpzKQotCQkJCQkJICAgIC0gdG90YWxvdXQpOwotCQkJYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7Ci0JCX0KLQl9CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzKGJ6cyk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGlmIChienMtPmF2YWlsX2luICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOworICAgICAgICAgICAgICAgIHNlbGYtPnVudXNlZF9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnpzLT5uZXh0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBienMtPmF2YWlsX2luKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbGYtPnJ1bm5pbmcgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfaW4gPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOyAvKiBubyBtb3JlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKKyAgICAgICAgICAgICAgICBCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKKyAgICAgICAgICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KSArIChCWlNfVE9UQUxfT1VUKGJ6cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRvdGFsb3V0KTsKKyAgICAgICAgICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZSAtIChienMtPm5leHRfb3V0IC0gQlVGKHJldCkpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CisgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CiAKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCXJldHVybiByZXQ7CisgICAgUkVMRUFTRV9MT0NLKHNlbGYpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICByZXR1cm4gcmV0OwogCiBlcnJvcjoKLQlSRUxFQVNFX0xPQ0soc2VsZik7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCVB5X1hERUNSRUYocmV0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBSRUxFQVNFX0xPQ0soc2VsZik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIFB5X1hERUNSRUYocmV0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEJaMkRlY29tcF9tZXRob2RzW10gPSB7Ci0JeyJkZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKUJaMkRlY29tcF9kZWNvbXByZXNzLCBNRVRIX1ZBUkFSR1MsIEJaMkRlY29tcF9kZWNvbXByZXNzX19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImRlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pQloyRGVjb21wX2RlY29tcHJlc3MsIE1FVEhfVkFSQVJHUywgQloyRGVjb21wX2RlY29tcHJlc3NfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0xOTQwLDU1ICsxOTQwLDU1IEBACiBzdGF0aWMgaW50CiBCWjJEZWNvbXBfaW5pdChCWjJEZWNvbXBPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCWludCBiemVycm9yOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6QloyRGVjb21wcmVzc29yIikpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpCWjJEZWNvbXByZXNzb3IiKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCWlmICghc2VsZi0+bG9jaykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBzZWxmLT5sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmICghc2VsZi0+bG9jaykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KICNlbmRpZgogCi0Jc2VsZi0+dW51c2VkX2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQlpZiAoIXNlbGYtPnVudXNlZF9kYXRhKQotCQlnb3RvIGVycm9yOworICAgIHNlbGYtPnVudXNlZF9kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgaWYgKCFzZWxmLT51bnVzZWRfZGF0YSkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCW1lbXNldCgmc2VsZi0+YnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7Ci0JYnplcnJvciA9IEJaMl9iekRlY29tcHJlc3NJbml0KCZzZWxmLT5ienMsIDAsIDApOwotCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgbWVtc2V0KCZzZWxmLT5ienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKKyAgICBiemVycm9yID0gQloyX2J6RGVjb21wcmVzc0luaXQoJnNlbGYtPmJ6cywgMCwgMCk7CisgICAgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCXNlbGYtPnJ1bm5pbmcgPSAxOworICAgIHNlbGYtPnJ1bm5pbmcgPSAxOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKIGVycm9yOgogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPmxvY2spIHsKLQkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOwotCQlzZWxmLT5sb2NrID0gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPmxvY2spIHsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworICAgICAgICBzZWxmLT5sb2NrID0gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlQeV9DTEVBUihzZWxmLT51bnVzZWRfZGF0YSk7Ci0JcmV0dXJuIC0xOworICAgIFB5X0NMRUFSKHNlbGYtPnVudXNlZF9kYXRhKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyB2b2lkCiBCWjJEZWNvbXBfZGVhbGxvYyhCWjJEZWNvbXBPYmplY3QgKnNlbGYpCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+bG9jaykKLQkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworICAgIGlmIChzZWxmLT5sb2NrKQorICAgICAgICBQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CiAjZW5kaWYKLQlQeV9YREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKLQlCWjJfYnpEZWNvbXByZXNzRW5kKCZzZWxmLT5ienMpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT51bnVzZWRfZGF0YSk7CisgICAgQloyX2J6RGVjb21wcmVzc0VuZCgmc2VsZi0+YnpzKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiAKQEAgLTIwMDQsNDYgKzIwMDQsNDYgQEAKICIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEJaMkRlY29tcF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJiejIuQloyRGVjb21wcmVzc29yIiwJLyp0cF9uYW1lKi8KLQlzaXplb2YoQloyRGVjb21wT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JKGRlc3RydWN0b3IpQloyRGVjb21wX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLAkJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCi0gICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwotICAgICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCi0gICAgICAgIEJaMkRlY29tcF9fZG9jX18sICAgICAgIC8qdHBfZG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwotICAgICAgICBCWjJEZWNvbXBfbWV0aG9kcywgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICBCWjJEZWNvbXBfbWVtYmVycywgICAgICAvKnRwX21lbWJlcnMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwotICAgICAgICAoaW5pdHByb2MpQloyRGVjb21wX2luaXQsIC8qdHBfaW5pdCovCi0gICAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgIC8qdHBfYWxsb2MqLwotICAgICAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAvKnRwX25ldyovCi0gICAgICAJX1B5T2JqZWN0X0RlbCwgICAgICAgICAgLyp0cF9mcmVlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgImJ6Mi5CWjJEZWNvbXByZXNzb3IiLCAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEJaMkRlY29tcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgKGRlc3RydWN0b3IpQloyRGVjb21wX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCisgICAgQloyRGVjb21wX19kb2NfXywgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgQloyRGVjb21wX21ldGhvZHMsICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICBCWjJEZWNvbXBfbWVtYmVycywgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIChpbml0cHJvYylCWjJEZWNvbXBfaW5pdCwgLyp0cF9pbml0Ki8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAvKnRwX2FsbG9jKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAvKnRwX25ldyovCisgICAgX1B5T2JqZWN0X0RlbCwgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAKIApAQCAtMjA2MSw4OCArMjA2MSw4OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ6Ml9jb21wcmVzcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JaW50IGNvbXByZXNzbGV2ZWw9OTsKLQlQeV9idWZmZXIgcGRhdGE7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YXNpemU7Ci0JaW50IGJ1ZnNpemU7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JYnpfc3RyZWFtIF9ienM7Ci0JYnpfc3RyZWFtICpienMgPSAmX2J6czsKLQlpbnQgYnplcnJvcjsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGEiLCAiY29tcHJlc3NsZXZlbCIsIDB9OworICAgIGludCBjb21wcmVzc2xldmVsPTk7CisgICAgUHlfYnVmZmVyIHBkYXRhOworICAgIGNoYXIgKmRhdGE7CisgICAgaW50IGRhdGFzaXplOworICAgIGludCBidWZzaXplOworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIGJ6X3N0cmVhbSBfYnpzOworICAgIGJ6X3N0cmVhbSAqYnpzID0gJl9ienM7CisgICAgaW50IGJ6ZXJyb3I7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJkYXRhIiwgImNvbXByZXNzbGV2ZWwiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMqfGkiLAotCQkJCQkga3dsaXN0LCAmcGRhdGEsCi0JCQkJCSAmY29tcHJlc3NsZXZlbCkpCi0JCXJldHVybiBOVUxMOwotCWRhdGEgPSBwZGF0YS5idWY7Ci0JZGF0YXNpemUgPSBwZGF0YS5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyp8aSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmcGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzbGV2ZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gcGRhdGEuYnVmOworICAgIGRhdGFzaXplID0gcGRhdGEubGVuOwogCi0JaWYgKGNvbXByZXNzbGV2ZWwgPCAxIHx8IGNvbXByZXNzbGV2ZWwgPiA5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjb21wcmVzc2xldmVsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5Iik7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChjb21wcmVzc2xldmVsIDwgMSB8fCBjb21wcmVzc2xldmVsID4gOSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2xldmVsIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5Iik7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ29uZm9ybWluZyB0byBiejIgbWFudWFsLCB0aGlzIGlzIGxhcmdlIGVub3VnaCB0byBmaXQgY29tcHJlc3NlZAotCSAqIGRhdGEgaW4gb25lIHNob3QuIFdlIHdpbGwgY2hlY2sgaXQgbGF0ZXIgYW55d2F5LiAqLwotCWJ1ZnNpemUgPSBkYXRhc2l6ZSArIChkYXRhc2l6ZS8xMDArMSkgKyA2MDA7CisgICAgLyogQ29uZm9ybWluZyB0byBiejIgbWFudWFsLCB0aGlzIGlzIGxhcmdlIGVub3VnaCB0byBmaXQgY29tcHJlc3NlZAorICAgICAqIGRhdGEgaW4gb25lIHNob3QuIFdlIHdpbGwgY2hlY2sgaXQgbGF0ZXIgYW55d2F5LiAqLworICAgIGJ1ZnNpemUgPSBkYXRhc2l6ZSArIChkYXRhc2l6ZS8xMDArMSkgKyA2MDA7CiAKLQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKLQlpZiAoIXJldCkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBidWZzaXplKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW1lbXNldChienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKKyAgICBtZW1zZXQoYnpzLCAwLCBzaXplb2YoYnpfc3RyZWFtKSk7CiAKLQlienMtPm5leHRfaW4gPSBkYXRhOwotCWJ6cy0+YXZhaWxfaW4gPSBkYXRhc2l6ZTsKLQlienMtPm5leHRfb3V0ID0gQlVGKHJldCk7Ci0JYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplOworICAgIGJ6cy0+bmV4dF9pbiA9IGRhdGE7CisgICAgYnpzLT5hdmFpbF9pbiA9IGRhdGFzaXplOworICAgIGJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKKyAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CiAKLQliemVycm9yID0gQloyX2J6Q29tcHJlc3NJbml0KGJ6cywgY29tcHJlc3NsZXZlbCwgMCwgMCk7Ci0JaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JCVB5X0RFQ1JFRihyZXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYnplcnJvciA9IEJaMl9iekNvbXByZXNzSW5pdChienMsIGNvbXByZXNzbGV2ZWwsIDAsIDApOworICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICBQeV9ERUNSRUYocmV0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzcyhienMsIEJaX0ZJTklTSCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfRklOSVNIX09LKSB7Ci0JCQlCWjJfYnpDb21wcmVzc0VuZChienMpOwotCQkJVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOwotCQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQkJUHlfREVDUkVGKHJldCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgewotCQkJYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgewotCQkJCUJaMl9iekNvbXByZXNzRW5kKGJ6cyk7Ci0JCQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQkJCVB5X0RFQ1JFRihyZXQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgQlpTX1RPVEFMX09VVChienMpOwotCQkJYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7Ci0JCX0KLQl9CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGJ6ZXJyb3IgPSBCWjJfYnpDb21wcmVzcyhienMsIEJaX0ZJTklTSCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfRklOSVNIX09LKSB7CisgICAgICAgICAgICBCWjJfYnpDb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgVXRpbF9DYXRjaEJaMkVycm9yKGJ6ZXJyb3IpOworICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKKyAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgeworICAgICAgICAgICAgICAgIEJaMl9iekNvbXByZXNzRW5kKGJ6cyk7CisgICAgICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgQlpTX1RPVEFMX09VVChienMpOworICAgICAgICAgICAgYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoYnpzLT5hdmFpbF9vdXQgIT0gMCkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdClCWlNfVE9UQUxfT1VUKGJ6cykpOwotCUJaMl9iekNvbXByZXNzRW5kKGJ6cyk7CisgICAgaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCisgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpQlpTX1RPVEFMX09VVChienMpKTsKKyAgICBCWjJfYnpDb21wcmVzc0VuZChienMpOwogCi0JUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCXJldHVybiByZXQ7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgIHJldHVybiByZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihiejJfZGVjb21wcmVzc19fZG9jX18sCkBAIC0yMTU1LDk0ICsyMTU1LDk0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnoyX2RlY29tcHJlc3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwZGF0YTsKLQljaGFyICpkYXRhOwotCWludCBkYXRhc2l6ZTsKLQlpbnQgYnVmc2l6ZSA9IFNNQUxMQ0hVTks7Ci0JUHlPYmplY3QgKnJldDsKLQliel9zdHJlYW0gX2J6czsKLQliel9zdHJlYW0gKmJ6cyA9ICZfYnpzOwotCWludCBiemVycm9yOworICAgIFB5X2J1ZmZlciBwZGF0YTsKKyAgICBjaGFyICpkYXRhOworICAgIGludCBkYXRhc2l6ZTsKKyAgICBpbnQgYnVmc2l6ZSA9IFNNQUxMQ0hVTks7CisgICAgUHlPYmplY3QgKnJldDsKKyAgICBiel9zdHJlYW0gX2J6czsKKyAgICBiel9zdHJlYW0gKmJ6cyA9ICZfYnpzOworICAgIGludCBiemVycm9yOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKjpkZWNvbXByZXNzIiwgJnBkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YSA9IHBkYXRhLmJ1ZjsKLQlkYXRhc2l6ZSA9IHBkYXRhLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqOmRlY29tcHJlc3MiLCAmcGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gcGRhdGEuYnVmOworICAgIGRhdGFzaXplID0gcGRhdGEubGVuOwogCi0JaWYgKGRhdGFzaXplID09IDApIHsKLQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JfQorICAgIGlmIChkYXRhc2l6ZSA9PSAwKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIH0KIAotCXJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpemUpOwotCWlmICghcmV0KSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZnNpemUpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbWVtc2V0KGJ6cywgMCwgc2l6ZW9mKGJ6X3N0cmVhbSkpOworICAgIG1lbXNldChienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKIAotCWJ6cy0+bmV4dF9pbiA9IGRhdGE7Ci0JYnpzLT5hdmFpbF9pbiA9IGRhdGFzaXplOwotCWJ6cy0+bmV4dF9vdXQgPSBCVUYocmV0KTsKLQlienMtPmF2YWlsX291dCA9IGJ1ZnNpemU7CisgICAgYnpzLT5uZXh0X2luID0gZGF0YTsKKyAgICBienMtPmF2YWlsX2luID0gZGF0YXNpemU7CisgICAgYnpzLT5uZXh0X291dCA9IEJVRihyZXQpOworICAgIGJ6cy0+YXZhaWxfb3V0ID0gYnVmc2l6ZTsKIAotCWJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzSW5pdChienMsIDAsIDApOwotCWlmIChiemVycm9yICE9IEJaX09LKSB7Ci0JCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJUHlfREVDUkVGKHJldCk7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzSW5pdChienMsIDAsIDApOworICAgIGlmIChiemVycm9yICE9IEJaX09LKSB7CisgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yICg7OykgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzKGJ6cyk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKLQkJCUJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKLQkJCVV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKLQkJCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJCVB5X0RFQ1JFRihyZXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGJ6cy0+YXZhaWxfaW4gPT0gMCkgewotCQkJQloyX2J6RGVjb21wcmVzc0VuZChienMpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJjb3VsZG4ndCBmaW5kIGVuZCBvZiBzdHJlYW0iKTsKLQkJCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJCVB5X0RFQ1JFRihyZXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGJ6cy0+YXZhaWxfb3V0ID09IDApIHsKLQkJCWJ1ZnNpemUgPSBVdGlsX05ld0J1ZmZlclNpemUoYnVmc2l6ZSk7Ci0JCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCBidWZzaXplKSA8IDApIHsKLQkJCQlCWjJfYnpEZWNvbXByZXNzRW5kKGJ6cyk7Ci0JCQkJUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOwotCQkJCVB5X0RFQ1JFRihyZXQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJYnpzLT5uZXh0X291dCA9IEJVRihyZXQpICsgQlpTX1RPVEFMX09VVChienMpOwotCQkJYnpzLT5hdmFpbF9vdXQgPSBidWZzaXplIC0gKGJ6cy0+bmV4dF9vdXQgLSBCVUYocmV0KSk7Ci0JCX0KLQl9CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGJ6ZXJyb3IgPSBCWjJfYnpEZWNvbXByZXNzKGJ6cyk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChiemVycm9yID09IEJaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGJ6ZXJyb3IgIT0gQlpfT0spIHsKKyAgICAgICAgICAgIEJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKKyAgICAgICAgICAgIFV0aWxfQ2F0Y2hCWjJFcnJvcihiemVycm9yKTsKKyAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ6cy0+YXZhaWxfaW4gPT0gMCkgeworICAgICAgICAgICAgQloyX2J6RGVjb21wcmVzc0VuZChienMpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkbid0IGZpbmQgZW5kIG9mIHN0cmVhbSIpOworICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnpzLT5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICAgICAgYnVmc2l6ZSA9IFV0aWxfTmV3QnVmZmVyU2l6ZShidWZzaXplKTsKKyAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXQsIGJ1ZnNpemUpIDwgMCkgeworICAgICAgICAgICAgICAgIEJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBienMtPm5leHRfb3V0ID0gQlVGKHJldCkgKyBCWlNfVE9UQUxfT1VUKGJ6cyk7CisgICAgICAgICAgICBienMtPmF2YWlsX291dCA9IGJ1ZnNpemUgLSAoYnpzLT5uZXh0X291dCAtIEJVRihyZXQpKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChienMtPmF2YWlsX291dCAhPSAwKQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KUJaU19UT1RBTF9PVVQoYnpzKSk7Ci0JQloyX2J6RGVjb21wcmVzc0VuZChienMpOwotCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICBpZiAoYnpzLT5hdmFpbF9vdXQgIT0gMCkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdClCWlNfVE9UQUxfT1VUKGJ6cykpOworICAgIEJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CiAKLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBiejJfbWV0aG9kc1tdID0gewotCXsiY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pIGJ6Ml9jb21wcmVzcywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCi0JCWJ6Ml9jb21wcmVzc19fZG9jX199LAotCXsiZGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbikgYnoyX2RlY29tcHJlc3MsIE1FVEhfVkFSQVJHUywKLQkJYnoyX2RlY29tcHJlc3NfX2RvY19ffSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pIGJ6Ml9jb21wcmVzcywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgICAgIGJ6Ml9jb21wcmVzc19fZG9jX199LAorICAgIHsiZGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbikgYnoyX2RlY29tcHJlc3MsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgYnoyX2RlY29tcHJlc3NfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCkBAIC0yMjU4LDI0ICsyMjU4LDI0IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdGJ6Mih2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JUHlfVFlQRSgmQloyRmlsZV9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKLQlQeV9UWVBFKCZCWjJDb21wX1R5cGUpID0gJlB5VHlwZV9UeXBlOwotCVB5X1RZUEUoJkJaMkRlY29tcF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeV9UWVBFKCZCWjJGaWxlX1R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIFB5X1RZUEUoJkJaMkNvbXBfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfVFlQRSgmQloyRGVjb21wX1R5cGUpID0gJlB5VHlwZV9UeXBlOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJiejIiLCBiejJfbWV0aG9kcywgYnoyX19kb2NfXyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiYnoyIiwgYnoyX21ldGhvZHMsIGJ6Ml9fZG9jX18pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX19hdXRob3JfXyIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoX19hdXRob3JfXykpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiX19hdXRob3JfXyIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoX19hdXRob3JfXykpOwogCi0JUHlfSU5DUkVGKCZCWjJGaWxlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQloyRmlsZSIsIChQeU9iamVjdCAqKSZCWjJGaWxlX1R5cGUpOworICAgIFB5X0lOQ1JFRigmQloyRmlsZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJaMkZpbGUiLCAoUHlPYmplY3QgKikmQloyRmlsZV9UeXBlKTsKIAotCVB5X0lOQ1JFRigmQloyQ29tcF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJaMkNvbXByZXNzb3IiLCAoUHlPYmplY3QgKikmQloyQ29tcF9UeXBlKTsKKyAgICBQeV9JTkNSRUYoJkJaMkNvbXBfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCWjJDb21wcmVzc29yIiwgKFB5T2JqZWN0ICopJkJaMkNvbXBfVHlwZSk7CiAKLQlQeV9JTkNSRUYoJkJaMkRlY29tcF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJaMkRlY29tcHJlc3NvciIsIChQeU9iamVjdCAqKSZCWjJEZWNvbXBfVHlwZSk7CisgICAgUHlfSU5DUkVGKCZCWjJEZWNvbXBfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCWjJEZWNvbXByZXNzb3IiLCAoUHlPYmplY3QgKikmQloyRGVjb21wX1R5cGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jUGlja2xlLmMgYi9Nb2R1bGVzL2NQaWNrbGUuYwppbmRleCA5MzczMjliLi5kOWJmY2ViIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NQaWNrbGUuYworKysgYi9Nb2R1bGVzL2NQaWNrbGUuYwpAQCAtNzIsNyArNzIsNyBAQAogI2RlZmluZSBTRVRJVEVNUyAgICAndScKIAogLyogUHJvdG9jb2wgMi4gKi8KLSNkZWZpbmUgUFJPVE8JICdceDgwJyAvKiBpZGVudGlmeSBwaWNrbGUgcHJvdG9jb2wgKi8KKyNkZWZpbmUgUFJPVE8gICAgJ1x4ODAnIC8qIGlkZW50aWZ5IHBpY2tsZSBwcm90b2NvbCAqLwogI2RlZmluZSBORVdPQkogICAnXHg4MScgLyogYnVpbGQgb2JqZWN0IGJ5IGFwcGx5aW5nIGNscy5fX25ld19fIHRvIGFyZ3R1cGxlICovCiAjZGVmaW5lIEVYVDEgICAgICdceDgyJyAvKiBwdXNoIG9iamVjdCBmcm9tIGV4dGVuc2lvbiByZWdpc3RyeTsgMS1ieXRlIGluZGV4ICovCiAjZGVmaW5lIEVYVDIgICAgICdceDgzJyAvKiBkaXR0bywgYnV0IDItYnl0ZSBpbmRleCAqLwpAQCAtMTMxLDM3ICsxMzEsMzcgQEAKICAgKl9fZ2V0c3RhdGVfX19zdHIsICpfX3NldHN0YXRlX19fc3RyLCAqX19uYW1lX19fc3RyLCAqX19yZWR1Y2VfX19zdHIsCiAgICpfX3JlZHVjZV9leF9fX3N0ciwKICAgKndyaXRlX3N0ciwgKmFwcGVuZF9zdHIsCi0gICpyZWFkX3N0ciwgKnJlYWRsaW5lX3N0ciwgKl9fbWFpbl9fX3N0ciwgCisgICpyZWFkX3N0ciwgKnJlYWRsaW5lX3N0ciwgKl9fbWFpbl9fX3N0ciwKICAgKmRpc3BhdGNoX3RhYmxlX3N0cjsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBJbnRlcm5hbCBEYXRhIHR5cGUgZm9yIHBpY2tsZSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWludCBsZW5ndGg7CS8qIG51bWJlciBvZiBpbml0aWFsIHNsb3RzIGluIGRhdGEgY3VycmVudGx5IHVzZWQgKi8KLQlpbnQgc2l6ZTsJLyogbnVtYmVyIG9mIHNsb3RzIGluIGRhdGEgYWxsb2NhdGVkICovCi0JUHlPYmplY3QgKipkYXRhOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBpbnQgbGVuZ3RoOyAgICAgICAgIC8qIG51bWJlciBvZiBpbml0aWFsIHNsb3RzIGluIGRhdGEgY3VycmVudGx5IHVzZWQgKi8KKyAgICBpbnQgc2l6ZTsgICAgICAgICAgIC8qIG51bWJlciBvZiBzbG90cyBpbiBkYXRhIGFsbG9jYXRlZCAqLworICAgIFB5T2JqZWN0ICoqZGF0YTsKIH0gUGRhdGE7CiAKIHN0YXRpYyB2b2lkCiBQZGF0YV9kZWFsbG9jKFBkYXRhICpzZWxmKQogewotCWludCBpOwotCVB5T2JqZWN0ICoqcDsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqKnA7CiAKLQlmb3IgKGkgPSBzZWxmLT5sZW5ndGgsIHAgPSBzZWxmLT5kYXRhOyAtLWkgPj0gMDsgcCsrKSB7Ci0JCVB5X0RFQ1JFRigqcCk7Ci0JfQotCWlmIChzZWxmLT5kYXRhKQotCQlmcmVlKHNlbGYtPmRhdGEpOwotCVB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBmb3IgKGkgPSBzZWxmLT5sZW5ndGgsIHAgPSBzZWxmLT5kYXRhOyAtLWkgPj0gMDsgcCsrKSB7CisgICAgICAgIFB5X0RFQ1JFRigqcCk7CisgICAgfQorICAgIGlmIChzZWxmLT5kYXRhKQorICAgICAgICBmcmVlKHNlbGYtPmRhdGEpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBQZGF0YVR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApICJjUGlja2xlLlBkYXRhIiwgc2l6ZW9mKFBkYXRhKSwgMCwKLQkoZGVzdHJ1Y3RvcilQZGF0YV9kZWFsbG9jLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBMLDBMLDBMLDBMLCAiIgorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKSAiY1BpY2tsZS5QZGF0YSIsIHNpemVvZihQZGF0YSksIDAsCisgICAgKGRlc3RydWN0b3IpUGRhdGFfZGVhbGxvYywKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwTCwwTCwwTCwwTCwgIiIKIH07CiAKICNkZWZpbmUgUGRhdGFfQ2hlY2soTykgKFB5X1RZUEUoTykgPT0gJlBkYXRhVHlwZSkKQEAgLTE2OSwyNCArMTY5LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUGRhdGFfTmV3KHZvaWQpCiB7Ci0JUGRhdGEgKnNlbGY7CisgICAgUGRhdGEgKnNlbGY7CiAKLQlpZiAoIShzZWxmID0gUHlPYmplY3RfTmV3KFBkYXRhLCAmUGRhdGFUeXBlKSkpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnNpemUgPSA4OwotCXNlbGYtPmxlbmd0aCA9IDA7Ci0Jc2VsZi0+ZGF0YSA9IG1hbGxvYyhzZWxmLT5zaXplICogc2l6ZW9mKFB5T2JqZWN0KikpOwotCWlmIChzZWxmLT5kYXRhKQotCQlyZXR1cm4gKFB5T2JqZWN0KilzZWxmOwotCVB5X0RFQ1JFRihzZWxmKTsKLQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIShzZWxmID0gUHlPYmplY3RfTmV3KFBkYXRhLCAmUGRhdGFUeXBlKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnNpemUgPSA4OworICAgIHNlbGYtPmxlbmd0aCA9IDA7CisgICAgc2VsZi0+ZGF0YSA9IG1hbGxvYyhzZWxmLT5zaXplICogc2l6ZW9mKFB5T2JqZWN0KikpOworICAgIGlmIChzZWxmLT5kYXRhKQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIH0KIAogc3RhdGljIGludAogc3RhY2tVbmRlcmZsb3codm9pZCkKIHsKLQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAidW5waWNrbGluZyBzdGFjayB1bmRlcmZsb3ciKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgInVucGlja2xpbmcgc3RhY2sgdW5kZXJmbG93Iik7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBSZXRhaW4gb25seSB0aGUgaW5pdGlhbCBjbGVhcnRvIGl0ZW1zLiAgSWYgY2xlYXJ0byA+PSB0aGUgY3VycmVudApAQCAtMTk1LDYwICsxOTUsNjAgQEAKIHN0YXRpYyBpbnQKIFBkYXRhX2NsZWFyKFBkYXRhICpzZWxmLCBpbnQgY2xlYXJ0bykKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqKnA7CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKipwOwogCi0JaWYgKGNsZWFydG8gPCAwKSByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKLQlpZiAoY2xlYXJ0byA+PSBzZWxmLT5sZW5ndGgpIHJldHVybiAwOworICAgIGlmIChjbGVhcnRvIDwgMCkgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgaWYgKGNsZWFydG8gPj0gc2VsZi0+bGVuZ3RoKSByZXR1cm4gMDsKIAotCWZvciAoaSA9IHNlbGYtPmxlbmd0aCwgcCA9IHNlbGYtPmRhdGEgKyBjbGVhcnRvOwotCSAgICAgLS1pID49IGNsZWFydG87Ci0JICAgICBwKyspIHsKLQkJUHlfQ0xFQVIoKnApOwotCX0KLQlzZWxmLT5sZW5ndGggPSBjbGVhcnRvOworICAgIGZvciAoaSA9IHNlbGYtPmxlbmd0aCwgcCA9IHNlbGYtPmRhdGEgKyBjbGVhcnRvOworICAgICAgICAgLS1pID49IGNsZWFydG87CisgICAgICAgICBwKyspIHsKKyAgICAgICAgUHlfQ0xFQVIoKnApOworICAgIH0KKyAgICBzZWxmLT5sZW5ndGggPSBjbGVhcnRvOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFBkYXRhX2dyb3coUGRhdGEgKnNlbGYpCiB7Ci0JaW50IGJpZ2dlcjsKLQlzaXplX3QgbmJ5dGVzOwotCVB5T2JqZWN0ICoqdG1wOworICAgIGludCBiaWdnZXI7CisgICAgc2l6ZV90IG5ieXRlczsKKyAgICBQeU9iamVjdCAqKnRtcDsKIAotCWJpZ2dlciA9IHNlbGYtPnNpemUgPDwgMTsKLQlpZiAoYmlnZ2VyIDw9IDApCS8qIHdhcyAwLCBvciBuZXcgdmFsdWUgb3ZlcmZsb3dzICovCi0JCWdvdG8gbm9tZW1vcnk7Ci0JaWYgKChpbnQpKHNpemVfdCliaWdnZXIgIT0gYmlnZ2VyKQotCQlnb3RvIG5vbWVtb3J5OwotCW5ieXRlcyA9IChzaXplX3QpYmlnZ2VyICogc2l6ZW9mKFB5T2JqZWN0ICopOwotCWlmIChuYnl0ZXMgLyBzaXplb2YoUHlPYmplY3QgKikgIT0gKHNpemVfdCliaWdnZXIpCi0JCWdvdG8gbm9tZW1vcnk7Ci0JdG1wID0gcmVhbGxvYyhzZWxmLT5kYXRhLCBuYnl0ZXMpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJZ290byBub21lbW9yeTsKLQlzZWxmLT5kYXRhID0gdG1wOwotCXNlbGYtPnNpemUgPSBiaWdnZXI7Ci0JcmV0dXJuIDA7CisgICAgYmlnZ2VyID0gc2VsZi0+c2l6ZSA8PCAxOworICAgIGlmIChiaWdnZXIgPD0gMCkgICAgICAgICAgICAvKiB3YXMgMCwgb3IgbmV3IHZhbHVlIG92ZXJmbG93cyAqLworICAgICAgICBnb3RvIG5vbWVtb3J5OworICAgIGlmICgoaW50KShzaXplX3QpYmlnZ2VyICE9IGJpZ2dlcikKKyAgICAgICAgZ290byBub21lbW9yeTsKKyAgICBuYnl0ZXMgPSAoc2l6ZV90KWJpZ2dlciAqIHNpemVvZihQeU9iamVjdCAqKTsKKyAgICBpZiAobmJ5dGVzIC8gc2l6ZW9mKFB5T2JqZWN0ICopICE9IChzaXplX3QpYmlnZ2VyKQorICAgICAgICBnb3RvIG5vbWVtb3J5OworICAgIHRtcCA9IHJlYWxsb2Moc2VsZi0+ZGF0YSwgbmJ5dGVzKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIGdvdG8gbm9tZW1vcnk7CisgICAgc2VsZi0+ZGF0YSA9IHRtcDsKKyAgICBzZWxmLT5zaXplID0gYmlnZ2VyOworICAgIHJldHVybiAwOwogCiAgIG5vbWVtb3J5OgotCVB5RXJyX05vTWVtb3J5KCk7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBEIGlzIGEgUGRhdGEqLiAgUG9wIHRoZSB0b3Btb3N0IGVsZW1lbnQgYW5kIHN0b3JlIGl0IGludG8gViwgd2hpY2gKICAqIG11c3QgYmUgYW4gbHZhbHVlIGhvbGRpbmcgUHlPYmplY3QqLiAgT24gc3RhY2sgdW5kZXJmbG93LCBVbnBpY2tsaW5nRXJyb3IKICAqIGlzIHJhaXNlZCBhbmQgViBpcyBzZXQgdG8gTlVMTC4gIEQgYW5kIFYgbWF5IGJlIGV2YWx1YXRlZCBzZXZlcmFsIHRpbWVzLgogICovCi0jZGVmaW5lIFBEQVRBX1BPUChELCBWKSB7CQkJCQlcCi0JaWYgKChEKS0+bGVuZ3RoKQkJCQkJXAotCQkoVikgPSAoRCktPmRhdGFbLS0oKEQpLT5sZW5ndGgpXTsJCVwKLQllbHNlIHsJCQkJCQkJXAotCQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiYmFkIHBpY2tsZSBkYXRhIik7CVwKLQkJKFYpID0gTlVMTDsJCQkJCVwKLQl9CQkJCQkJCVwKKyNkZWZpbmUgUERBVEFfUE9QKEQsIFYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChEKS0+bGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoVikgPSAoRCktPmRhdGFbLS0oKEQpLT5sZW5ndGgpXTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJiYWQgcGlja2xlIGRhdGEiKTsgICAgICAgICAgICBcCisgICAgICAgIChWKSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogLyogUERBVEFfUFVTSCBhbmQgUERBVEFfQVBQRU5EIGJvdGggcHVzaCBydmFsdWUgUHlPYmplY3QqIE8gb24gdG8gUGRhdGEqCkBAIC0yNjAsNTUgKzI2MCw1NSBAQAogICovCiAKIC8qIFB1c2ggTyBvbiBzdGFjayBELCBnaXZpbmcgb3duZXJzaGlwIG9mIE8gdG8gdGhlIHN0YWNrLiAqLwotI2RlZmluZSBQREFUQV9QVVNIKEQsIE8sIEVSKSB7CQkJCQlcCi0JaWYgKCgoUGRhdGEqKShEKSktPmxlbmd0aCA9PSAoKFBkYXRhKikoRCkpLT5zaXplICYmCVwKLQkgICAgUGRhdGFfZ3JvdygoUGRhdGEqKShEKSkgPCAwKSB7CQkJXAotCQlQeV9ERUNSRUYoTyk7CQkJCQlcCi0JCXJldHVybiBFUjsJCQkJCVwKLQl9CQkJCQkJCVwKLQkoKFBkYXRhKikoRCkpLT5kYXRhWygoUGRhdGEqKShEKSktPmxlbmd0aCsrXSA9IChPKTsJXAorI2RlZmluZSBQREFUQV9QVVNIKEQsIE8sIEVSKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKChQZGF0YSopKEQpKS0+bGVuZ3RoID09ICgoUGRhdGEqKShEKSktPnNpemUgJiYgICAgICAgICBcCisgICAgICAgIFBkYXRhX2dyb3coKFBkYXRhKikoRCkpIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYoTyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIEVSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoUGRhdGEqKShEKSktPmRhdGFbKChQZGF0YSopKEQpKS0+bGVuZ3RoKytdID0gKE8pOyAgICAgICAgIFwKIH0KIAogLyogUHVzaCBPIG9uIHN0YWNrIEQsIHB1c2hpbmcgYSBuZXcgcmVmZXJlbmNlLiAqLwotI2RlZmluZSBQREFUQV9BUFBFTkQoRCwgTywgRVIpIHsJCQkJXAotCWlmICgoKFBkYXRhKikoRCkpLT5sZW5ndGggPT0gKChQZGF0YSopKEQpKS0+c2l6ZSAmJglcCi0JICAgIFBkYXRhX2dyb3coKFBkYXRhKikoRCkpIDwgMCkJCQlcCi0JCXJldHVybiBFUjsJCQkJCVwKLQlQeV9JTkNSRUYoTyk7CQkJCQkJXAotCSgoUGRhdGEqKShEKSktPmRhdGFbKChQZGF0YSopKEQpKS0+bGVuZ3RoKytdID0gKE8pOwlcCisjZGVmaW5lIFBEQVRBX0FQUEVORChELCBPLCBFUikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoKFBkYXRhKikoRCkpLT5sZW5ndGggPT0gKChQZGF0YSopKEQpKS0+c2l6ZSAmJiAgICAgICAgIFwKKyAgICAgICAgUGRhdGFfZ3JvdygoUGRhdGEqKShEKSkgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBFUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFB5X0lOQ1JFRihPKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKFBkYXRhKikoRCkpLT5kYXRhWygoUGRhdGEqKShEKSktPmxlbmd0aCsrXSA9IChPKTsgICAgICAgICBcCiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIFBkYXRhX3BvcFR1cGxlKFBkYXRhICpzZWxmLCBpbnQgc3RhcnQpCiB7Ci0JUHlPYmplY3QgKnI7Ci0JaW50IGksIGosIGw7CisgICAgUHlPYmplY3QgKnI7CisgICAgaW50IGksIGosIGw7CiAKLQlsID0gc2VsZi0+bGVuZ3RoLXN0YXJ0OwotCXIgPSBQeVR1cGxlX05ldyhsKTsKLQlpZiAociA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSBzdGFydCwgaiA9IDAgOyBqIDwgbDsgaSsrLCBqKyspCi0JCVB5VHVwbGVfU0VUX0lURU0ociwgaiwgc2VsZi0+ZGF0YVtpXSk7CisgICAgbCA9IHNlbGYtPmxlbmd0aC1zdGFydDsKKyAgICByID0gUHlUdXBsZV9OZXcobCk7CisgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gc3RhcnQsIGogPSAwIDsgaiA8IGw7IGkrKywgaisrKQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHIsIGosIHNlbGYtPmRhdGFbaV0pOwogCi0Jc2VsZi0+bGVuZ3RoID0gc3RhcnQ7Ci0JcmV0dXJuIHI7CisgICAgc2VsZi0+bGVuZ3RoID0gc3RhcnQ7CisgICAgcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQZGF0YV9wb3BMaXN0KFBkYXRhICpzZWxmLCBpbnQgc3RhcnQpCiB7Ci0JUHlPYmplY3QgKnI7Ci0JaW50IGksIGosIGw7CisgICAgUHlPYmplY3QgKnI7CisgICAgaW50IGksIGosIGw7CiAKLQlsPXNlbGYtPmxlbmd0aC1zdGFydDsKLQlpZiAoISggcj1QeUxpc3RfTmV3KGwpKSkgIHJldHVybiBOVUxMOwotCWZvciAoaT1zdGFydCwgaj0wIDsgaiA8IGw7IGkrKywgaisrKQotCQlQeUxpc3RfU0VUX0lURU0ociwgaiwgc2VsZi0+ZGF0YVtpXSk7CisgICAgbD1zZWxmLT5sZW5ndGgtc3RhcnQ7CisgICAgaWYgKCEoIHI9UHlMaXN0X05ldyhsKSkpICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGk9c3RhcnQsIGo9MCA7IGogPCBsOyBpKyssIGorKykKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHIsIGosIHNlbGYtPmRhdGFbaV0pOwogCi0Jc2VsZi0+bGVuZ3RoPXN0YXJ0OwotCXJldHVybiByOworICAgIHNlbGYtPmxlbmd0aD1zdGFydDsKKyAgICByZXR1cm4gcjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMzEsMjggKzMzMSwyOCBAQAogICB9CiAKIHR5cGVkZWYgc3RydWN0IFBpY2tsZXJvYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlGSUxFICpmcDsKLQlQeU9iamVjdCAqd3JpdGU7Ci0JUHlPYmplY3QgKmZpbGU7Ci0JUHlPYmplY3QgKm1lbW87Ci0JUHlPYmplY3QgKmFyZzsKLQlQeU9iamVjdCAqcGVyc19mdW5jOwotCVB5T2JqZWN0ICppbnN0X3BlcnNfZnVuYzsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRklMRSAqZnA7CisgICAgUHlPYmplY3QgKndyaXRlOworICAgIFB5T2JqZWN0ICpmaWxlOworICAgIFB5T2JqZWN0ICptZW1vOworICAgIFB5T2JqZWN0ICphcmc7CisgICAgUHlPYmplY3QgKnBlcnNfZnVuYzsKKyAgICBQeU9iamVjdCAqaW5zdF9wZXJzX2Z1bmM7CiAKLQkvKiBwaWNrbGUgcHJvdG9jb2wgbnVtYmVyLCA+PSAwICovCi0JaW50IHByb3RvOworICAgIC8qIHBpY2tsZSBwcm90b2NvbCBudW1iZXIsID49IDAgKi8KKyAgICBpbnQgcHJvdG87CiAKLQkvKiBib29sLCB0cnVlIGlmIHByb3RvID4gMCAqLwotCWludCBiaW47CisgICAgLyogYm9vbCwgdHJ1ZSBpZiBwcm90byA+IDAgKi8KKyAgICBpbnQgYmluOwogCi0JaW50IGZhc3Q7IC8qIEZhc3QgbW9kZSBkb2Vzbid0IHNhdmUgaW4gbWVtbywgZG9uJ3QgdXNlIGlmIGNpcmMgcmVmICovCi0JaW50ICgqd3JpdGVfZnVuYykoc3RydWN0IFBpY2tsZXJvYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90KTsKLQljaGFyICp3cml0ZV9idWY7Ci0JaW50IGJ1Zl9zaXplOwotCVB5T2JqZWN0ICpkaXNwYXRjaF90YWJsZTsKLQlpbnQgZmFzdF9jb250YWluZXI7IC8qIGNvdW50IG5lc3RlZCBjb250YWluZXIgZHVtcHMgKi8KLQlQeU9iamVjdCAqZmFzdF9tZW1vOworICAgIGludCBmYXN0OyAvKiBGYXN0IG1vZGUgZG9lc24ndCBzYXZlIGluIG1lbW8sIGRvbid0IHVzZSBpZiBjaXJjIHJlZiAqLworICAgIGludCAoKndyaXRlX2Z1bmMpKHN0cnVjdCBQaWNrbGVyb2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCk7CisgICAgY2hhciAqd3JpdGVfYnVmOworICAgIGludCBidWZfc2l6ZTsKKyAgICBQeU9iamVjdCAqZGlzcGF0Y2hfdGFibGU7CisgICAgaW50IGZhc3RfY29udGFpbmVyOyAvKiBjb3VudCBuZXN0ZWQgY29udGFpbmVyIGR1bXBzICovCisgICAgUHlPYmplY3QgKmZhc3RfbWVtbzsKIH0gUGlja2xlcm9iamVjdDsKIAogI2lmbmRlZiBQWV9DUElDS0xFX0ZBU1RfTElNSVQKQEAgLTM2MiwyNSArMzYyLDI1IEBACiBzdGF0aWMgUHlUeXBlT2JqZWN0IFBpY2tsZXJ0eXBlOwogCiB0eXBlZGVmIHN0cnVjdCBVbnBpY2tsZXJvYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlGSUxFICpmcDsKLQlQeU9iamVjdCAqZmlsZTsKLQlQeU9iamVjdCAqcmVhZGxpbmU7Ci0JUHlPYmplY3QgKnJlYWQ7Ci0JUHlPYmplY3QgKm1lbW87Ci0JUHlPYmplY3QgKmFyZzsKLQlQZGF0YSAqc3RhY2s7Ci0JUHlPYmplY3QgKm1hcms7Ci0JUHlPYmplY3QgKnBlcnNfZnVuYzsKLQlQeU9iamVjdCAqbGFzdF9zdHJpbmc7Ci0JaW50ICptYXJrczsKLQlpbnQgbnVtX21hcmtzOwotCWludCBtYXJrc19zaXplOwotCVB5X3NzaXplX3QgKCpyZWFkX2Z1bmMpKHN0cnVjdCBVbnBpY2tsZXJvYmplY3QgKiwgY2hhciAqKiwgUHlfc3NpemVfdCk7Ci0JUHlfc3NpemVfdCAoKnJlYWRsaW5lX2Z1bmMpKHN0cnVjdCBVbnBpY2tsZXJvYmplY3QgKiwgY2hhciAqKik7Ci0JaW50IGJ1Zl9zaXplOwotCWNoYXIgKmJ1ZjsKLQlQeU9iamVjdCAqZmluZF9jbGFzczsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRklMRSAqZnA7CisgICAgUHlPYmplY3QgKmZpbGU7CisgICAgUHlPYmplY3QgKnJlYWRsaW5lOworICAgIFB5T2JqZWN0ICpyZWFkOworICAgIFB5T2JqZWN0ICptZW1vOworICAgIFB5T2JqZWN0ICphcmc7CisgICAgUGRhdGEgKnN0YWNrOworICAgIFB5T2JqZWN0ICptYXJrOworICAgIFB5T2JqZWN0ICpwZXJzX2Z1bmM7CisgICAgUHlPYmplY3QgKmxhc3Rfc3RyaW5nOworICAgIGludCAqbWFya3M7CisgICAgaW50IG51bV9tYXJrczsKKyAgICBpbnQgbWFya3Nfc2l6ZTsKKyAgICBQeV9zc2l6ZV90ICgqcmVhZF9mdW5jKShzdHJ1Y3QgVW5waWNrbGVyb2JqZWN0ICosIGNoYXIgKiosIFB5X3NzaXplX3QpOworICAgIFB5X3NzaXplX3QgKCpyZWFkbGluZV9mdW5jKShzdHJ1Y3QgVW5waWNrbGVyb2JqZWN0ICosIGNoYXIgKiopOworICAgIGludCBidWZfc2l6ZTsKKyAgICBjaGFyICpidWY7CisgICAgUHlPYmplY3QgKmZpbmRfY2xhc3M7CiB9IFVucGlja2xlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBVbnBpY2tsZXJ0eXBlOwpAQCAtMzkzLDMwNiArMzkzLDMwNiBAQAogUHlPYmplY3QgKgogY1BpY2tsZV9FcnJGb3JtYXQoUHlPYmplY3QgKkVyclR5cGUsIGNoYXIgKnN0cmluZ2Zvcm1hdCwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCAqYXJncz0wLCAqcmV0dmFsPTA7Ci0JdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCAqYXJncz0wLCAqcmV0dmFsPTA7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CiAKLQlpZiAoZm9ybWF0KSBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOwotCXZhX2VuZCh2YSk7Ci0JaWYgKGZvcm1hdCAmJiAhIGFyZ3MpIHJldHVybiBOVUxMOwotCWlmIChzdHJpbmdmb3JtYXQgJiYgIShyZXR2YWw9UHlTdHJpbmdfRnJvbVN0cmluZyhzdHJpbmdmb3JtYXQpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGZvcm1hdCkgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKyAgICB2YV9lbmQodmEpOworICAgIGlmIChmb3JtYXQgJiYgISBhcmdzKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RyaW5nZm9ybWF0ICYmICEocmV0dmFsPVB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyaW5nZm9ybWF0KSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJldHZhbCkgewotCQlpZiAoYXJncykgewotCQkJUHlPYmplY3QgKnY7Ci0JCQl2PVB5U3RyaW5nX0Zvcm1hdChyZXR2YWwsIGFyZ3MpOwotCQkJUHlfREVDUkVGKHJldHZhbCk7Ci0JCQlQeV9ERUNSRUYoYXJncyk7Ci0JCQlpZiAoISB2KSByZXR1cm4gTlVMTDsKLQkJCXJldHZhbD12OwotCQl9Ci0JfQotCWVsc2UKLQkJaWYgKGFyZ3MpIHJldHZhbD1hcmdzOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldE9iamVjdChFcnJUeXBlLFB5X05vbmUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQlQeUVycl9TZXRPYmplY3QoRXJyVHlwZSxyZXR2YWwpOwotCVB5X0RFQ1JFRihyZXR2YWwpOwotCXJldHVybiBOVUxMOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgaWYgKGFyZ3MpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICAgICAgdj1QeVN0cmluZ19Gb3JtYXQocmV0dmFsLCBhcmdzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgaWYgKCEgdikgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR2YWw9djsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIGlmIChhcmdzKSByZXR2YWw9YXJnczsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoRXJyVHlwZSxQeV9Ob25lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgUHlFcnJfU2V0T2JqZWN0KEVyclR5cGUscmV0dmFsKTsKKyAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogd3JpdGVfZmlsZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90ICBuKQogewotCXNpemVfdCBuYnl0ZXN3cml0dGVuOworICAgIHNpemVfdCBuYnl0ZXN3cml0dGVuOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAobiA+IElOVF9NQVgpIHsKLQkJLyogU3RyaW5nIHRvbyBsYXJnZSAqLwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChuID4gSU5UX01BWCkgeworICAgICAgICAvKiBTdHJpbmcgdG9vIGxhcmdlICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlQeUZpbGVfSW5jVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQluYnl0ZXN3cml0dGVuID0gZndyaXRlKHMsIHNpemVvZihjaGFyKSwgbiwgc2VsZi0+ZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQlpZiAobmJ5dGVzd3JpdHRlbiAhPSAoc2l6ZV90KW4pIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIFB5RmlsZV9JbmNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIG5ieXRlc3dyaXR0ZW4gPSBmd3JpdGUocywgc2l6ZW9mKGNoYXIpLCBuLCBzZWxmLT5mcCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeUZpbGVfRGVjVXNlQ291bnQoKFB5RmlsZU9iamVjdCAqKXNlbGYtPmZpbGUpOworICAgIGlmIChuYnl0ZXN3cml0dGVuICE9IChzaXplX3QpbikgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gKGludCluOworICAgIHJldHVybiAoaW50KW47CiB9CiAKIHN0YXRpYyBpbnQKIHdyaXRlX2NTdHJpbmdJTyhQaWNrbGVyb2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90ICBuKQogewotCWlmIChzID09IE5VTEwpIHsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKFB5Y1N0cmluZ0lPLT5jd3JpdGUoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgcywgbikgIT0gbikgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeWNTdHJpbmdJTy0+Y3dyaXRlKChQeU9iamVjdCAqKXNlbGYtPmZpbGUsIHMsIG4pICE9IG4pIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJldHVybiAoaW50KW47CisgICAgcmV0dXJuIChpbnQpbjsKIH0KIAogc3RhdGljIGludAogd3JpdGVfbm9uZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90ICBuKQogewotCWlmIChzID09IE5VTEwpIHJldHVybiAwOwotCWlmIChuID4gSU5UX01BWCkgcmV0dXJuIC0xOwotCXJldHVybiAoaW50KW47CisgICAgaWYgKHMgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgaWYgKG4gPiBJTlRfTUFYKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIChpbnQpbjsKIH0KIAogc3RhdGljIGludAogd3JpdGVfb3RoZXIoUGlja2xlcm9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCAgX24pCiB7Ci0JUHlPYmplY3QgKnB5X3N0ciA9IDAsICpqdW5rID0gMDsKLQlpbnQgbjsKKyAgICBQeU9iamVjdCAqcHlfc3RyID0gMCwgKmp1bmsgPSAwOworICAgIGludCBuOwogCi0JaWYgKF9uID4gSU5UX01BWCkKLQkJcmV0dXJuIC0xOwotCW4gPSAoaW50KV9uOwotCWlmIChzID09IE5VTEwpIHsKLQkJaWYgKCEoIHNlbGYtPmJ1Zl9zaXplICkpICByZXR1cm4gMDsKLQkJcHlfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+d3JpdGVfYnVmLAotCQkJCQkJICAgIHNlbGYtPmJ1Zl9zaXplKTsKLQkJaWYgKCFweV9zdHIpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgewotCQlpZiAoc2VsZi0+YnVmX3NpemUgJiYgKG4gKyBzZWxmLT5idWZfc2l6ZSkgPiBXUklURV9CVUZfU0laRSkgewotCQkJaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICBpZiAoX24gPiBJTlRfTUFYKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbiA9IChpbnQpX247CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBpZiAoISggc2VsZi0+YnVmX3NpemUgKSkgIHJldHVybiAwOworICAgICAgICBweV9zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT53cml0ZV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKCFweV9zdHIpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc2VsZi0+YnVmX3NpemUgJiYgKG4gKyBzZWxmLT5idWZfc2l6ZSkgPiBXUklURV9CVUZfU0laRSkgeworICAgICAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQlpZiAobiA+IFdSSVRFX0JVRl9TSVpFKSB7Ci0JCQlpZiAoISggcHlfc3RyID0KLQkJCSAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBuKSkpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJbWVtY3B5KHNlbGYtPndyaXRlX2J1ZiArIHNlbGYtPmJ1Zl9zaXplLCBzLCBuKTsKLQkJCXNlbGYtPmJ1Zl9zaXplICs9IG47Ci0JCQlyZXR1cm4gbjsKLQkJfQotCX0KKyAgICAgICAgaWYgKG4gPiBXUklURV9CVUZfU0laRSkgeworICAgICAgICAgICAgaWYgKCEoIHB5X3N0ciA9CisgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbikpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShzZWxmLT53cml0ZV9idWYgKyBzZWxmLT5idWZfc2l6ZSwgcywgbik7CisgICAgICAgICAgICBzZWxmLT5idWZfc2l6ZSArPSBuOworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoc2VsZi0+d3JpdGUpIHsKLQkJLyogb2JqZWN0IHdpdGggd3JpdGUgbWV0aG9kICovCi0JCUFSR19UVVAoc2VsZiwgcHlfc3RyKTsKLQkJaWYgKHNlbGYtPmFyZykgewotCQkJanVuayA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+d3JpdGUsIHNlbGYtPmFyZywgTlVMTCk7Ci0JCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCX0KLQkJaWYgKGp1bmspIFB5X0RFQ1JFRihqdW5rKTsKLQkJZWxzZSByZXR1cm4gLTE7Ci0JfQotCWVsc2UKLQkgICAgUERBVEFfUFVTSChzZWxmLT5maWxlLCBweV9zdHIsIC0xKTsKKyAgICBpZiAoc2VsZi0+d3JpdGUpIHsKKyAgICAgICAgLyogb2JqZWN0IHdpdGggd3JpdGUgbWV0aG9kICovCisgICAgICAgIEFSR19UVVAoc2VsZiwgcHlfc3RyKTsKKyAgICAgICAgaWYgKHNlbGYtPmFyZykgeworICAgICAgICAgICAganVuayA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+d3JpdGUsIHNlbGYtPmFyZywgTlVMTCk7CisgICAgICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGp1bmspIFB5X0RFQ1JFRihqdW5rKTsKKyAgICAgICAgZWxzZSByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUERBVEFfUFVTSChzZWxmLT5maWxlLCBweV9zdHIsIC0xKTsKIAotCXNlbGYtPmJ1Zl9zaXplID0gMDsKLQlyZXR1cm4gbjsKKyAgICBzZWxmLT5idWZfc2l6ZSA9IDA7CisgICAgcmV0dXJuIG47CiB9CiAKIAogc3RhdGljIFB5X3NzaXplX3QKIHJlYWRfZmlsZShVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKipzLCBQeV9zc2l6ZV90IG4pCiB7Ci0Jc2l6ZV90IG5ieXRlc3JlYWQ7CisgICAgc2l6ZV90IG5ieXRlc3JlYWQ7CiAKLQlpZiAoc2VsZi0+YnVmX3NpemUgPT0gMCkgewotCQlpbnQgc2l6ZTsKKyAgICBpZiAoc2VsZi0+YnVmX3NpemUgPT0gMCkgeworICAgICAgICBpbnQgc2l6ZTsKIAotCQlzaXplID0gKChuIDwgMzIpID8gMzIgOiBuKTsKLQkJaWYgKCEoIHNlbGYtPmJ1ZiA9IChjaGFyICopbWFsbG9jKHNpemUpKSkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBzaXplID0gKChuIDwgMzIpID8gMzIgOiBuKTsKKyAgICAgICAgaWYgKCEoIHNlbGYtPmJ1ZiA9IChjaGFyICopbWFsbG9jKHNpemUpKSkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCXNlbGYtPmJ1Zl9zaXplID0gc2l6ZTsKLQl9Ci0JZWxzZSBpZiAobiA+IHNlbGYtPmJ1Zl9zaXplKSB7Ci0JCWNoYXIgKm5ld2J1ZiA9IChjaGFyICopcmVhbGxvYyhzZWxmLT5idWYsIG4pOwotCQlpZiAoIW5ld2J1ZikgIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc2VsZi0+YnVmID0gbmV3YnVmOwotCQlzZWxmLT5idWZfc2l6ZSA9IG47Ci0JfQorICAgICAgICBzZWxmLT5idWZfc2l6ZSA9IHNpemU7CisgICAgfQorICAgIGVsc2UgaWYgKG4gPiBzZWxmLT5idWZfc2l6ZSkgeworICAgICAgICBjaGFyICpuZXdidWYgPSAoY2hhciAqKXJlYWxsb2Moc2VsZi0+YnVmLCBuKTsKKyAgICAgICAgaWYgKCFuZXdidWYpICB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNlbGYtPmJ1ZiA9IG5ld2J1ZjsKKyAgICAgICAgc2VsZi0+YnVmX3NpemUgPSBuOworICAgIH0KIAotCVB5RmlsZV9JbmNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCW5ieXRlc3JlYWQgPSBmcmVhZChzZWxmLT5idWYsIHNpemVvZihjaGFyKSwgbiwgc2VsZi0+ZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKLQlpZiAobmJ5dGVzcmVhZCAhPSAoc2l6ZV90KW4pIHsKLQkJaWYgKGZlb2Yoc2VsZi0+ZnApKSB7Ci0JCQlQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgIFB5RmlsZV9JbmNVc2VDb3VudCgoUHlGaWxlT2JqZWN0ICopc2VsZi0+ZmlsZSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIG5ieXRlc3JlYWQgPSBmcmVhZChzZWxmLT5idWYsIHNpemVvZihjaGFyKSwgbiwgc2VsZi0+ZnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlGaWxlX0RlY1VzZUNvdW50KChQeUZpbGVPYmplY3QgKilzZWxmLT5maWxlKTsKKyAgICBpZiAobmJ5dGVzcmVhZCAhPSAoc2l6ZV90KW4pIHsKKyAgICAgICAgaWYgKGZlb2Yoc2VsZi0+ZnApKSB7CisgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JKnMgPSBzZWxmLT5idWY7CisgICAgKnMgPSBzZWxmLT5idWY7CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIH0KIAogCiBzdGF0aWMgUHlfc3NpemVfdAogcmVhZGxpbmVfZmlsZShVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKipzKQogewotCWludCBpOworICAgIGludCBpOwogCi0JaWYgKHNlbGYtPmJ1Zl9zaXplID09IDApIHsKLQkJaWYgKCEoIHNlbGYtPmJ1ZiA9IChjaGFyICopbWFsbG9jKDQwKSkpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc2VsZi0+YnVmX3NpemUgPSA0MDsKLQl9CisgICAgaWYgKHNlbGYtPmJ1Zl9zaXplID09IDApIHsKKyAgICAgICAgaWYgKCEoIHNlbGYtPmJ1ZiA9IChjaGFyICopbWFsbG9jKDQwKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+YnVmX3NpemUgPSA0MDsKKyAgICB9CiAKLQlpID0gMDsKLQl3aGlsZSAoMSkgewotCQlpbnQgYmlnZ2VyOwotCQljaGFyICpuZXdidWY7Ci0JCWZvciAoOyBpIDwgKHNlbGYtPmJ1Zl9zaXplIC0gMSk7IGkrKykgewotCQkJaWYgKGZlb2Yoc2VsZi0+ZnApIHx8Ci0JCQkgICAgKHNlbGYtPmJ1ZltpXSA9IGdldGMoc2VsZi0+ZnApKSA9PSAnXG4nKSB7Ci0JCQkJc2VsZi0+YnVmW2kgKyAxXSA9ICdcMCc7Ci0JCQkJKnMgPSBzZWxmLT5idWY7Ci0JCQkJcmV0dXJuIGkgKyAxOwotCQkJfQotCQl9Ci0JCWJpZ2dlciA9IHNlbGYtPmJ1Zl9zaXplIDw8IDE7Ci0JCWlmIChiaWdnZXIgPD0gMCkgewkvKiBvdmVyZmxvdyAqLwotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQluZXdidWYgPSAoY2hhciAqKXJlYWxsb2Moc2VsZi0+YnVmLCBiaWdnZXIpOwotCQlpZiAoIW5ld2J1ZikgIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc2VsZi0+YnVmID0gbmV3YnVmOwotCQlzZWxmLT5idWZfc2l6ZSA9IGJpZ2dlcjsKLQl9CisgICAgaSA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaW50IGJpZ2dlcjsKKyAgICAgICAgY2hhciAqbmV3YnVmOworICAgICAgICBmb3IgKDsgaSA8IChzZWxmLT5idWZfc2l6ZSAtIDEpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmZW9mKHNlbGYtPmZwKSB8fAorICAgICAgICAgICAgICAgIChzZWxmLT5idWZbaV0gPSBnZXRjKHNlbGYtPmZwKSkgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIHNlbGYtPmJ1ZltpICsgMV0gPSAnXDAnOworICAgICAgICAgICAgICAgICpzID0gc2VsZi0+YnVmOworICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiaWdnZXIgPSBzZWxmLT5idWZfc2l6ZSA8PCAxOworICAgICAgICBpZiAoYmlnZ2VyIDw9IDApIHsgICAgICAgICAgICAgIC8qIG92ZXJmbG93ICovCisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG5ld2J1ZiA9IChjaGFyICopcmVhbGxvYyhzZWxmLT5idWYsIGJpZ2dlcik7CisgICAgICAgIGlmICghbmV3YnVmKSAgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5idWYgPSBuZXdidWY7CisgICAgICAgIHNlbGYtPmJ1Zl9zaXplID0gYmlnZ2VyOworICAgIH0KIH0KIAogCiBzdGF0aWMgUHlfc3NpemVfdAogcmVhZF9jU3RyaW5nSU8oVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBjaGFyICoqcywgUHlfc3NpemVfdCAgbikKIHsKLQljaGFyICpwdHI7CisgICAgY2hhciAqcHRyOwogCi0JaWYgKFB5Y1N0cmluZ0lPLT5jcmVhZCgoUHlPYmplY3QgKilzZWxmLT5maWxlLCAmcHRyLCBuKSAhPSBuKSB7Ci0JCVB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeWNTdHJpbmdJTy0+Y3JlYWQoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgJnB0ciwgbikgIT0gbikgeworICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCSpzID0gcHRyOworICAgICpzID0gcHRyOwogCi0JcmV0dXJuIG47CisgICAgcmV0dXJuIG47CiB9CiAKIAogc3RhdGljIFB5X3NzaXplX3QKIHJlYWRsaW5lX2NTdHJpbmdJTyhVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKipzKQogewotCVB5X3NzaXplX3QgbjsKLQljaGFyICpwdHI7CisgICAgUHlfc3NpemVfdCBuOworICAgIGNoYXIgKnB0cjsKIAotCWlmICgobiA9IFB5Y1N0cmluZ0lPLT5jcmVhZGxpbmUoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgJnB0cikpIDwgMCkgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICgobiA9IFB5Y1N0cmluZ0lPLT5jcmVhZGxpbmUoKFB5T2JqZWN0ICopc2VsZi0+ZmlsZSwgJnB0cikpIDwgMCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JKnMgPSBwdHI7CisgICAgKnMgPSBwdHI7CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIH0KIAogCiBzdGF0aWMgUHlfc3NpemVfdAogcmVhZF9vdGhlcihVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGNoYXIgKipzLCBQeV9zc2l6ZV90ICBuKQogewotCVB5T2JqZWN0ICpieXRlcywgKnN0cj0wOworICAgIFB5T2JqZWN0ICpieXRlcywgKnN0cj0wOwogCi0JaWYgKCEoIGJ5dGVzID0gUHlJbnRfRnJvbVNzaXplX3QobikpKSAgcmV0dXJuIC0xOworICAgIGlmICghKCBieXRlcyA9IFB5SW50X0Zyb21Tc2l6ZV90KG4pKSkgIHJldHVybiAtMTsKIAotCUFSR19UVVAoc2VsZiwgYnl0ZXMpOwotCWlmIChzZWxmLT5hcmcpIHsKLQkJc3RyID0gUHlPYmplY3RfQ2FsbChzZWxmLT5yZWFkLCBzZWxmLT5hcmcsIE5VTEwpOwotCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JfQotCWlmICghIHN0cikgcmV0dXJuIC0xOworICAgIEFSR19UVVAoc2VsZiwgYnl0ZXMpOworICAgIGlmIChzZWxmLT5hcmcpIHsKKyAgICAgICAgc3RyID0gUHlPYmplY3RfQ2FsbChzZWxmLT5yZWFkLCBzZWxmLT5hcmcsIE5VTEwpOworICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgfQorICAgIGlmICghIHN0cikgcmV0dXJuIC0xOwogCi0JUHlfWERFQ1JFRihzZWxmLT5sYXN0X3N0cmluZyk7Ci0Jc2VsZi0+bGFzdF9zdHJpbmcgPSBzdHI7CisgICAgUHlfWERFQ1JFRihzZWxmLT5sYXN0X3N0cmluZyk7CisgICAgc2VsZi0+bGFzdF9zdHJpbmcgPSBzdHI7CiAKLQlpZiAoISAoKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKSkgcmV0dXJuIC0xOworICAgIGlmICghICgqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cikpKSByZXR1cm4gLTE7CiAKLQlpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc3RyKSAhPSBuKSB7Ci0JCVB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzdHIpICE9IG4pIHsKKyAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIH0KIAogCiBzdGF0aWMgUHlfc3NpemVfdAogcmVhZGxpbmVfb3RoZXIoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBjaGFyICoqcykKIHsKLQlQeU9iamVjdCAqc3RyOwotCVB5X3NzaXplX3Qgc3RyX3NpemU7CisgICAgUHlPYmplY3QgKnN0cjsKKyAgICBQeV9zc2l6ZV90IHN0cl9zaXplOwogCi0JaWYgKCEoIHN0ciA9IFB5T2JqZWN0X0NhbGxPYmplY3Qoc2VsZi0+cmVhZGxpbmUsIGVtcHR5X3R1cGxlKSkpICB7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCEoIHN0ciA9IFB5T2JqZWN0X0NhbGxPYmplY3Qoc2VsZi0+cmVhZGxpbmUsIGVtcHR5X3R1cGxlKSkpICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoKHN0cl9zaXplID0gUHlTdHJpbmdfU2l6ZShzdHIpKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoKHN0cl9zaXplID0gUHlTdHJpbmdfU2l6ZShzdHIpKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X1hERUNSRUYoc2VsZi0+bGFzdF9zdHJpbmcpOwotCXNlbGYtPmxhc3Rfc3RyaW5nID0gc3RyOworICAgIFB5X1hERUNSRUYoc2VsZi0+bGFzdF9zdHJpbmcpOworICAgIHNlbGYtPmxhc3Rfc3RyaW5nID0gc3RyOwogCi0JaWYgKCEgKCpzID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyKSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoISAoKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhzdHIpKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIHN0cl9zaXplOworICAgIHJldHVybiBzdHJfc2l6ZTsKIH0KIAogLyogQ29weSB0aGUgZmlyc3QgbiBieXRlcyBmcm9tIHMgaW50byBuZXdseSBtYWxsb2MnZWQgbWVtb3J5LCBwbHVzIGEKQEAgLTcwMiw1NjYgKzcwMiw1NjYgQEAKIHN0YXRpYyBjaGFyICoKIHB5c3RybmR1cChjb25zdCBjaGFyICpzLCBpbnQgbikKIHsKLQljaGFyICpyID0gKGNoYXIgKiltYWxsb2MobisxKTsKLQlpZiAociA9PSBOVUxMKQotCQlyZXR1cm4gKGNoYXIqKVB5RXJyX05vTWVtb3J5KCk7Ci0JbWVtY3B5KHIsIHMsIG4pOwotCXJbbl0gPSAwOwotCXJldHVybiByOworICAgIGNoYXIgKnIgPSAoY2hhciAqKW1hbGxvYyhuKzEpOworICAgIGlmIChyID09IE5VTEwpCisgICAgICAgIHJldHVybiAoY2hhciopUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBtZW1jcHkociwgcywgbik7CisgICAgcltuXSA9IDA7CisgICAgcmV0dXJuIHI7CiB9CiAKIAogc3RhdGljIGludAogZ2V0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppZCkKIHsKLQlQeU9iamVjdCAqdmFsdWUsICptdjsKLQlsb25nIGNfdmFsdWU7Ci0JY2hhciBzWzMwXTsKLQlzaXplX3QgbGVuOworICAgIFB5T2JqZWN0ICp2YWx1ZSwgKm12OworICAgIGxvbmcgY192YWx1ZTsKKyAgICBjaGFyIHNbMzBdOworICAgIHNpemVfdCBsZW47CiAKLQlpZiAoISggbXYgPSBQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBpZCkpKSAgewotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGlkKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoISggbXYgPSBQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBpZCkpKSAgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGlkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICghKCB2YWx1ZSA9IFB5VHVwbGVfR2V0SXRlbShtdiwgMCkpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoIHZhbHVlID0gUHlUdXBsZV9HZXRJdGVtKG12LCAwKSkpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghKCBQeUludF9DaGVjayh2YWx1ZSkpKSAgewotCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgIm5vIGludCB3aGVyZSBpbnQgZXhwZWN0ZWQgaW4gbWVtbyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWNfdmFsdWUgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCopdmFsdWUpOworICAgIGlmICghKCBQeUludF9DaGVjayh2YWx1ZSkpKSAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgIm5vIGludCB3aGVyZSBpbnQgZXhwZWN0ZWQgaW4gbWVtbyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGNfdmFsdWUgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCopdmFsdWUpOwogCi0JaWYgKCFzZWxmLT5iaW4pIHsKLQkJc1swXSA9IEdFVDsKLQkJUHlPU19zbnByaW50ZihzICsgMSwgc2l6ZW9mKHMpIC0gMSwgIiVsZFxuIiwgY192YWx1ZSk7Ci0JCWxlbiA9IHN0cmxlbihzKTsKLQl9Ci0JZWxzZSBpZiAoUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKLQkJaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOwotCQlQREFUQV9BUFBFTkQoc2VsZi0+ZmlsZSwgbXYsIC0xKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgewotCQlpZiAoY192YWx1ZSA8IDI1NikgewotCQkJc1swXSA9IEJJTkdFVDsKLQkJCXNbMV0gPSAoaW50KShjX3ZhbHVlICYgMHhmZik7Ci0JCQlsZW4gPSAyOwotCQl9Ci0JCWVsc2UgewotCQkJc1swXSA9IExPTkdfQklOR0VUOwotCQkJc1sxXSA9IChpbnQpKGNfdmFsdWUgJiAweGZmKTsKLQkJCXNbMl0gPSAoaW50KSgoY192YWx1ZSA+PiA4KSAgJiAweGZmKTsKLQkJCXNbM10gPSAoaW50KSgoY192YWx1ZSA+PiAxNikgJiAweGZmKTsKLQkJCXNbNF0gPSAoaW50KSgoY192YWx1ZSA+PiAyNCkgJiAweGZmKTsKLQkJCWxlbiA9IDU7Ci0JCX0KLQl9CisgICAgaWYgKCFzZWxmLT5iaW4pIHsKKyAgICAgICAgc1swXSA9IEdFVDsKKyAgICAgICAgUHlPU19zbnByaW50ZihzICsgMSwgc2l6ZW9mKHMpIC0gMSwgIiVsZFxuIiwgY192YWx1ZSk7CisgICAgICAgIGxlbiA9IHN0cmxlbihzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKKyAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOworICAgICAgICBQREFUQV9BUFBFTkQoc2VsZi0+ZmlsZSwgbXYsIC0xKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoY192YWx1ZSA8IDI1NikgeworICAgICAgICAgICAgc1swXSA9IEJJTkdFVDsKKyAgICAgICAgICAgIHNbMV0gPSAoaW50KShjX3ZhbHVlICYgMHhmZik7CisgICAgICAgICAgICBsZW4gPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc1swXSA9IExPTkdfQklOR0VUOworICAgICAgICAgICAgc1sxXSA9IChpbnQpKGNfdmFsdWUgJiAweGZmKTsKKyAgICAgICAgICAgIHNbMl0gPSAoaW50KSgoY192YWx1ZSA+PiA4KSAgJiAweGZmKTsKKyAgICAgICAgICAgIHNbM10gPSAoaW50KSgoY192YWx1ZSA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgIHNbNF0gPSAoaW50KSgoY192YWx1ZSA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgIGxlbiA9IDU7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBzLCBsZW4pIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHMsIGxlbikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBwdXQoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iKQogewotCWlmIChQeV9SRUZDTlQob2IpIDwgMiB8fCBzZWxmLT5mYXN0KQotCQlyZXR1cm4gMDsKKyAgICBpZiAoUHlfUkVGQ05UKG9iKSA8IDIgfHwgc2VsZi0+ZmFzdCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlyZXR1cm4gcHV0MihzZWxmLCBvYik7CisgICAgcmV0dXJuIHB1dDIoc2VsZiwgb2IpOwogfQogCiAKIHN0YXRpYyBpbnQKIHB1dDIoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iKQogewotCWNoYXIgY19zdHJbMzBdOwotCWludCBwOwotCXNpemVfdCBsZW47Ci0JaW50IHJlcyA9IC0xOwotCVB5T2JqZWN0ICpweV9vYl9pZCA9IDAsICptZW1vX2xlbiA9IDAsICp0ID0gMDsKKyAgICBjaGFyIGNfc3RyWzMwXTsKKyAgICBpbnQgcDsKKyAgICBzaXplX3QgbGVuOworICAgIGludCByZXMgPSAtMTsKKyAgICBQeU9iamVjdCAqcHlfb2JfaWQgPSAwLCAqbWVtb19sZW4gPSAwLCAqdCA9IDA7CiAKLQlpZiAoc2VsZi0+ZmFzdCkKLQkJcmV0dXJuIDA7CisgICAgaWYgKHNlbGYtPmZhc3QpCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKChwID0gUHlEaWN0X1NpemUoc2VsZi0+bWVtbykpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICgocCA9IFB5RGljdF9TaXplKHNlbGYtPm1lbW8pKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIE1ha2Ugc3VyZSBtZW1vIGtleXMgYXJlIHBvc2l0aXZlISAqLwotCS8qIFhYWCBXaHk/Ci0JICogWFhYIEFuZCBkb2VzICJwb3NpdGl2ZSIgcmVhbGx5IG1lYW4gbm9uLW5lZ2F0aXZlPwotCSAqIFhYWCBwaWNrbGUucHkgc3RhcnRzIHdpdGggUFVUIGluZGV4IDAsIG5vdCAxLiAgVGhpcyBtYWtlcyBmb3IKLQkgKiBYWFggZ3JhdHVpdG91cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwaWNrbGluZyBtb2R1bGVzLgotCSAqLwotCXArKzsKKyAgICAvKiBNYWtlIHN1cmUgbWVtbyBrZXlzIGFyZSBwb3NpdGl2ZSEgKi8KKyAgICAvKiBYWFggV2h5PworICAgICAqIFhYWCBBbmQgZG9lcyAicG9zaXRpdmUiIHJlYWxseSBtZWFuIG5vbi1uZWdhdGl2ZT8KKyAgICAgKiBYWFggcGlja2xlLnB5IHN0YXJ0cyB3aXRoIFBVVCBpbmRleCAwLCBub3QgMS4gIFRoaXMgbWFrZXMgZm9yCisgICAgICogWFhYIGdyYXR1aXRvdXMgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgcGlja2xpbmcgbW9kdWxlcy4KKyAgICAgKi8KKyAgICBwKys7CiAKLQlpZiAoISggcHlfb2JfaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIob2IpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBweV9vYl9pZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cihvYikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoISggbWVtb19sZW4gPSBQeUludF9Gcm9tTG9uZyhwKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggbWVtb19sZW4gPSBQeUludF9Gcm9tTG9uZyhwKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmICghKCB0ID0gUHlUdXBsZV9OZXcoMikpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIHQgPSBQeVR1cGxlX05ldygyKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCVB5VHVwbGVfU0VUX0lURU0odCwgMCwgbWVtb19sZW4pOwotCVB5X0lOQ1JFRihtZW1vX2xlbik7Ci0JUHlUdXBsZV9TRVRfSVRFTSh0LCAxLCBvYik7Ci0JUHlfSU5DUkVGKG9iKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHQsIDAsIG1lbW9fbGVuKTsKKyAgICBQeV9JTkNSRUYobWVtb19sZW4pOworICAgIFB5VHVwbGVfU0VUX0lURU0odCwgMSwgb2IpOworICAgIFB5X0lOQ1JFRihvYik7CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+bWVtbywgcHlfb2JfaWQsIHQpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5tZW1vLCBweV9vYl9pZCwgdCkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoIXNlbGYtPmJpbikgewotCQljX3N0clswXSA9IFBVVDsKLQkJUHlPU19zbnByaW50ZihjX3N0ciArIDEsIHNpemVvZihjX3N0cikgLSAxLCAiJWRcbiIsIHApOwotCQlsZW4gPSBzdHJsZW4oY19zdHIpOwotCX0KLQllbHNlIGlmIChQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgewotCQlpZiAod3JpdGVfb3RoZXIoc2VsZiwgTlVMTCwgMCkgPCAwKSByZXR1cm4gLTE7Ci0JCVBEQVRBX0FQUEVORChzZWxmLT5maWxlLCBtZW1vX2xlbiwgLTEpOwotCQlyZXM9MDsgICAgICAgICAgLyogSm9iIHdlbGwgZG9uZSA7KSAqLwotCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWVsc2UgewotCQlpZiAocCA+PSAyNTYpIHsKLQkJCWNfc3RyWzBdID0gTE9OR19CSU5QVVQ7Ci0JCQljX3N0clsxXSA9IChpbnQpKHAgJiAweGZmKTsKLQkJCWNfc3RyWzJdID0gKGludCkoKHAgPj4gOCkgICYgMHhmZik7Ci0JCQljX3N0clszXSA9IChpbnQpKChwID4+IDE2KSAmIDB4ZmYpOwotCQkJY19zdHJbNF0gPSAoaW50KSgocCA+PiAyNCkgJiAweGZmKTsKLQkJCWxlbiA9IDU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljX3N0clswXSA9IEJJTlBVVDsKLQkJCWNfc3RyWzFdID0gcDsKLQkJCWxlbiA9IDI7Ci0JCX0KLQl9CisgICAgaWYgKCFzZWxmLT5iaW4pIHsKKyAgICAgICAgY19zdHJbMF0gPSBQVVQ7CisgICAgICAgIFB5T1Nfc25wcmludGYoY19zdHIgKyAxLCBzaXplb2YoY19zdHIpIC0gMSwgIiVkXG4iLCBwKTsKKyAgICAgICAgbGVuID0gc3RybGVuKGNfc3RyKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKKyAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOworICAgICAgICBQREFUQV9BUFBFTkQoc2VsZi0+ZmlsZSwgbWVtb19sZW4sIC0xKTsKKyAgICAgICAgcmVzPTA7ICAgICAgICAgIC8qIEpvYiB3ZWxsIGRvbmUgOykgKi8KKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHAgPj0gMjU2KSB7CisgICAgICAgICAgICBjX3N0clswXSA9IExPTkdfQklOUFVUOworICAgICAgICAgICAgY19zdHJbMV0gPSAoaW50KShwICYgMHhmZik7CisgICAgICAgICAgICBjX3N0clsyXSA9IChpbnQpKChwID4+IDgpICAmIDB4ZmYpOworICAgICAgICAgICAgY19zdHJbM10gPSAoaW50KSgocCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgIGNfc3RyWzRdID0gKGludCkoKHAgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICBsZW4gPSA1OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY19zdHJbMF0gPSBCSU5QVVQ7CisgICAgICAgICAgICBjX3N0clsxXSA9IHA7CisgICAgICAgICAgICBsZW4gPSAyOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlyZXMgPSAwOworICAgIHJlcyA9IDA7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHB5X29iX2lkKTsKLQlQeV9YREVDUkVGKG1lbW9fbGVuKTsKLQlQeV9YREVDUkVGKHQpOworICAgIFB5X1hERUNSRUYocHlfb2JfaWQpOworICAgIFB5X1hERUNSRUYobWVtb19sZW4pOworICAgIFB5X1hERUNSRUYodCk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aGljaG1vZHVsZShQeU9iamVjdCAqZ2xvYmFsLCBQeU9iamVjdCAqZ2xvYmFsX25hbWUpCiB7Ci0JUHlfc3NpemVfdCBpLCBqOwotCVB5T2JqZWN0ICptb2R1bGUgPSAwLCAqbW9kdWxlc19kaWN0ID0gMCwKLQkJKmdsb2JhbF9uYW1lX2F0dHIgPSAwLCAqbmFtZSA9IDA7CisgICAgUHlfc3NpemVfdCBpLCBqOworICAgIFB5T2JqZWN0ICptb2R1bGUgPSAwLCAqbW9kdWxlc19kaWN0ID0gMCwKKyAgICAgICAgKmdsb2JhbF9uYW1lX2F0dHIgPSAwLCAqbmFtZSA9IDA7CiAKLQltb2R1bGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGdsb2JhbCwgIl9fbW9kdWxlX18iKTsKLQlpZiAobW9kdWxlKSAKLQkJcmV0dXJuIG1vZHVsZTsKLQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZQotCQlyZXR1cm4gTlVMTDsKKyAgICBtb2R1bGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGdsb2JhbCwgIl9fbW9kdWxlX18iKTsKKyAgICBpZiAobW9kdWxlKQorICAgICAgICByZXR1cm4gbW9kdWxlOworICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCEoIG1vZHVsZXNfZGljdCA9IFB5U3lzX0dldE9iamVjdCgibW9kdWxlcyIpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEoIG1vZHVsZXNfZGljdCA9IFB5U3lzX0dldE9iamVjdCgibW9kdWxlcyIpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gMDsKLQl3aGlsZSAoKGogPSBQeURpY3RfTmV4dChtb2R1bGVzX2RpY3QsICZpLCAmbmFtZSwgJm1vZHVsZSkpKSB7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKChqID0gUHlEaWN0X05leHQobW9kdWxlc19kaWN0LCAmaSwgJm5hbWUsICZtb2R1bGUpKSkgewogCi0JCWlmIChQeU9iamVjdF9Db21wYXJlKG5hbWUsIF9fbWFpbl9fX3N0cik9PTApIGNvbnRpbnVlOworICAgICAgICBpZiAoUHlPYmplY3RfQ29tcGFyZShuYW1lLCBfX21haW5fX19zdHIpPT0wKSBjb250aW51ZTsKIAotCQlnbG9iYWxfbmFtZV9hdHRyID0gUHlPYmplY3RfR2V0QXR0cihtb2R1bGUsIGdsb2JhbF9uYW1lKTsKLQkJaWYgKCFnbG9iYWxfbmFtZV9hdHRyKSAgewotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBnbG9iYWxfbmFtZV9hdHRyID0gUHlPYmplY3RfR2V0QXR0cihtb2R1bGUsIGdsb2JhbF9uYW1lKTsKKyAgICAgICAgaWYgKCFnbG9iYWxfbmFtZV9hdHRyKSAgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCWlmIChnbG9iYWxfbmFtZV9hdHRyICE9IGdsb2JhbCkgewotCQkJUHlfREVDUkVGKGdsb2JhbF9uYW1lX2F0dHIpOwotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGdsb2JhbF9uYW1lX2F0dHIgIT0gZ2xvYmFsKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZ2xvYmFsX25hbWVfYXR0cik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVB5X0RFQ1JFRihnbG9iYWxfbmFtZV9hdHRyKTsKKyAgICAgICAgUHlfREVDUkVGKGdsb2JhbF9uYW1lX2F0dHIpOwogCi0JCWJyZWFrOwotCX0KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JLyogVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRzIHRoZSBydWxlIGluIHBpY2tsZS5weSBhZGRlZCBpbiAxLjUKLQkgICB0aGF0IHVzZWQgX19tYWluX18gaWYgbm8gbW9kdWxlIGlzIGZvdW5kLiAgSSBkb24ndCBhY3R1YWxseQotCSAgIGxpa2UgdGhpcyBydWxlLiBqbGYKLQkqLwotCWlmICghaikgewotCQlqPTE7Ci0JCW5hbWU9X19tYWluX19fc3RyOwotCX0KKyAgICAvKiBUaGUgZm9sbG93aW5nIGltcGxlbWVudHMgdGhlIHJ1bGUgaW4gcGlja2xlLnB5IGFkZGVkIGluIDEuNQorICAgICAgIHRoYXQgdXNlZCBfX21haW5fXyBpZiBubyBtb2R1bGUgaXMgZm91bmQuICBJIGRvbid0IGFjdHVhbGx5CisgICAgICAgbGlrZSB0aGlzIHJ1bGUuIGpsZgorICAgICovCisgICAgaWYgKCFqKSB7CisgICAgICAgIGo9MTsKKyAgICAgICAgbmFtZT1fX21haW5fX19zdHI7CisgICAgfQogCi0JUHlfSU5DUkVGKG5hbWUpOwotCXJldHVybiBuYW1lOworICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gbmFtZTsKIH0KIAogCiBzdGF0aWMgaW50CiBmYXN0X3NhdmVfZW50ZXIoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaikKIHsKLQkvKiBpZiBmYXN0X2NvbnRhaW5lciA8IDAsIHdlJ3JlIGRvaW5nIGFuIGVycm9yIGV4aXQuICovCi0JaWYgKCsrc2VsZi0+ZmFzdF9jb250YWluZXIgPj0gUFlfQ1BJQ0tMRV9GQVNUX0xJTUlUKSB7Ci0JCVB5T2JqZWN0ICprZXkgPSBOVUxMOwotCQlpZiAoc2VsZi0+ZmFzdF9tZW1vID09IE5VTEwpIHsKLQkJCXNlbGYtPmZhc3RfbWVtbyA9IFB5RGljdF9OZXcoKTsKLQkJCWlmIChzZWxmLT5mYXN0X21lbW8gPT0gTlVMTCkgewotCQkJCXNlbGYtPmZhc3RfY29udGFpbmVyID0gLTE7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJa2V5ID0gUHlMb25nX0Zyb21Wb2lkUHRyKG9iaik7Ci0JCWlmIChrZXkgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCQlpZiAoUHlEaWN0X0dldEl0ZW0oc2VsZi0+ZmFzdF9tZW1vLCBrZXkpKSB7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgImZhc3QgbW9kZTogY2FuJ3QgcGlja2xlIGN5Y2xpYyBvYmplY3RzICIKLQkJCQkgICAgICJpbmNsdWRpbmcgb2JqZWN0IHR5cGUgJXMgYXQgJXAiLAotCQkJCSAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lLCBvYmopOwotCQkJc2VsZi0+ZmFzdF9jb250YWluZXIgPSAtMTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5mYXN0X21lbW8sIGtleSwgUHlfTm9uZSkgPCAwKSB7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCXNlbGYtPmZhc3RfY29udGFpbmVyID0gLTE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlQeV9ERUNSRUYoa2V5KTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgLyogaWYgZmFzdF9jb250YWluZXIgPCAwLCB3ZSdyZSBkb2luZyBhbiBlcnJvciBleGl0LiAqLworICAgIGlmICgrK3NlbGYtPmZhc3RfY29udGFpbmVyID49IFBZX0NQSUNLTEVfRkFTVF9MSU1JVCkgeworICAgICAgICBQeU9iamVjdCAqa2V5ID0gTlVMTDsKKyAgICAgICAgaWYgKHNlbGYtPmZhc3RfbWVtbyA9PSBOVUxMKSB7CisgICAgICAgICAgICBzZWxmLT5mYXN0X21lbW8gPSBQeURpY3RfTmV3KCk7CisgICAgICAgICAgICBpZiAoc2VsZi0+ZmFzdF9tZW1vID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5mYXN0X2NvbnRhaW5lciA9IC0xOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGtleSA9IFB5TG9uZ19Gcm9tVm9pZFB0cihvYmopOworICAgICAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPmZhc3RfbWVtbywga2V5KSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZmFzdCBtb2RlOiBjYW4ndCBwaWNrbGUgY3ljbGljIG9iamVjdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNsdWRpbmcgb2JqZWN0IHR5cGUgJXMgYXQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSwgb2JqKTsKKyAgICAgICAgICAgIHNlbGYtPmZhc3RfY29udGFpbmVyID0gLTE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZmFzdF9tZW1vLCBrZXksIFB5X05vbmUpIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICBzZWxmLT5mYXN0X2NvbnRhaW5lciA9IC0xOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBpbnQKIGZhc3Rfc2F2ZV9sZWF2ZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqKQogewotCWlmIChzZWxmLT5mYXN0X2NvbnRhaW5lci0tID49IFBZX0NQSUNLTEVfRkFTVF9MSU1JVCkgewotCQlQeU9iamVjdCAqa2V5ID0gUHlMb25nX0Zyb21Wb2lkUHRyKG9iaik7Ci0JCWlmIChrZXkgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCQlpZiAoUHlEaWN0X0RlbEl0ZW0oc2VsZi0+ZmFzdF9tZW1vLCBrZXkpIDwgMCkgewotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlQeV9ERUNSRUYoa2V5KTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKHNlbGYtPmZhc3RfY29udGFpbmVyLS0gPj0gUFlfQ1BJQ0tMRV9GQVNUX0xJTUlUKSB7CisgICAgICAgIFB5T2JqZWN0ICprZXkgPSBQeUxvbmdfRnJvbVZvaWRQdHIob2JqKTsKKyAgICAgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChQeURpY3RfRGVsSXRlbShzZWxmLT5mYXN0X21lbW8sIGtleSkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogc2F2ZV9ub25lKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YXRpYyBjaGFyIG5vbmUgPSBOT05FOwotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZub25lLCAxKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBzdGF0aWMgY2hhciBub25lID0gTk9ORTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmbm9uZSwgMSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogc2F2ZV9ib29sKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YXRpYyBjb25zdCBjaGFyICpidWZbMl0gPSB7RkFMU0UsIFRSVUV9OwotCXN0YXRpYyBjaGFyIGxlblsyXSA9IHtzaXplb2YoRkFMU0UpLTEsIHNpemVvZihUUlVFKS0xfTsKLQlsb25nIGwgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKWFyZ3MpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpidWZbMl0gPSB7RkFMU0UsIFRSVUV9OworICAgIHN0YXRpYyBjaGFyIGxlblsyXSA9IHtzaXplb2YoRkFMU0UpLTEsIHNpemVvZihUUlVFKS0xfTsKKyAgICBsb25nIGwgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKWFyZ3MpOwogCi0JaWYgKHNlbGYtPnByb3RvID49IDIpIHsKLQkJY2hhciBvcGNvZGUgPSBsID8gTkVXVFJVRSA6IE5FV0ZBTFNFOwotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmb3Bjb2RlLCAxKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgYnVmW2xdLCBsZW5bbF0pIDwgMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmIChzZWxmLT5wcm90byA+PSAyKSB7CisgICAgICAgIGNoYXIgb3Bjb2RlID0gbCA/IE5FV1RSVUUgOiBORVdGQUxTRTsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJm9wY29kZSwgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGJ1ZltsXSwgbGVuW2xdKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogc2F2ZV9pbnQoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciBjX3N0clszMl07Ci0JbG9uZyBsID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKilhcmdzKTsKLQlpbnQgbGVuID0gMDsKKyAgICBjaGFyIGNfc3RyWzMyXTsKKyAgICBsb25nIGwgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKWFyZ3MpOworICAgIGludCBsZW4gPSAwOwogCi0JaWYgKCFzZWxmLT5iaW4KKyAgICBpZiAoIXNlbGYtPmJpbgogI2lmIFNJWkVPRl9MT05HID4gNAotCSAgICB8fCBsID4gIDB4N2ZmZmZmZmZMCi0JICAgIHx8IGwgPCAtMHg4MDAwMDAwMEwKKyAgICAgICAgfHwgbCA+ICAweDdmZmZmZmZmTAorICAgICAgICB8fCBsIDwgLTB4ODAwMDAwMDBMCiAjZW5kaWYKLQkJKSB7Ci0JCS8qIFRleHQtbW9kZSBwaWNrbGUsIG9yIGxvbmcgdG9vIGJpZyB0byBmaXQgaW4gdGhlIDQtYnl0ZQotCQkgKiBzaWduZWQgQklOSU5UIGZvcm1hdDogIHN0b3JlIGFzIGEgc3RyaW5nLgotCQkgKi8KLQkJY19zdHJbMF0gPSBJTlQ7Ci0JCVB5T1Nfc25wcmludGYoY19zdHIgKyAxLCBzaXplb2YoY19zdHIpIC0gMSwgIiVsZFxuIiwgbCk7Ci0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBzdHJsZW4oY19zdHIpKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgewotCQkvKiBCaW5hcnkgcGlja2xlIGFuZCBsIGZpdHMgaW4gYSBzaWduZWQgNC1ieXRlIGludC4gKi8KLQkJY19zdHJbMV0gPSAoaW50KSggbCAgICAgICAgJiAweGZmKTsKLQkJY19zdHJbMl0gPSAoaW50KSgobCA+PiA4KSAgJiAweGZmKTsKLQkJY19zdHJbM10gPSAoaW50KSgobCA+PiAxNikgJiAweGZmKTsKLQkJY19zdHJbNF0gPSAoaW50KSgobCA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgKSB7CisgICAgICAgIC8qIFRleHQtbW9kZSBwaWNrbGUsIG9yIGxvbmcgdG9vIGJpZyB0byBmaXQgaW4gdGhlIDQtYnl0ZQorICAgICAgICAgKiBzaWduZWQgQklOSU5UIGZvcm1hdDogIHN0b3JlIGFzIGEgc3RyaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgY19zdHJbMF0gPSBJTlQ7CisgICAgICAgIFB5T1Nfc25wcmludGYoY19zdHIgKyAxLCBzaXplb2YoY19zdHIpIC0gMSwgIiVsZFxuIiwgbCk7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBzdHJsZW4oY19zdHIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBCaW5hcnkgcGlja2xlIGFuZCBsIGZpdHMgaW4gYSBzaWduZWQgNC1ieXRlIGludC4gKi8KKyAgICAgICAgY19zdHJbMV0gPSAoaW50KSggbCAgICAgICAgJiAweGZmKTsKKyAgICAgICAgY19zdHJbMl0gPSAoaW50KSgobCA+PiA4KSAgJiAweGZmKTsKKyAgICAgICAgY19zdHJbM10gPSAoaW50KSgobCA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgY19zdHJbNF0gPSAoaW50KSgobCA+PiAyNCkgJiAweGZmKTsKIAotCQlpZiAoKGNfc3RyWzRdID09IDApICYmIChjX3N0clszXSA9PSAwKSkgewotCQkJaWYgKGNfc3RyWzJdID09IDApIHsKLQkJCQljX3N0clswXSA9IEJJTklOVDE7Ci0JCQkJbGVuID0gMjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNfc3RyWzBdID0gQklOSU5UMjsKLQkJCQlsZW4gPSAzOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJY19zdHJbMF0gPSBCSU5JTlQ7Ci0JCQlsZW4gPSA1OwotCQl9CisgICAgICAgIGlmICgoY19zdHJbNF0gPT0gMCkgJiYgKGNfc3RyWzNdID09IDApKSB7CisgICAgICAgICAgICBpZiAoY19zdHJbMl0gPT0gMCkgeworICAgICAgICAgICAgICAgIGNfc3RyWzBdID0gQklOSU5UMTsKKyAgICAgICAgICAgICAgICBsZW4gPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY19zdHJbMF0gPSBCSU5JTlQyOworICAgICAgICAgICAgICAgIGxlbiA9IDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjX3N0clswXSA9IEJJTklOVDsKKyAgICAgICAgICAgIGxlbiA9IDU7CisgICAgICAgIH0KIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbGVuKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbGVuKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludAogc2F2ZV9sb25nKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpbnQgcmVzID0gLTE7Ci0JUHlPYmplY3QgKnJlcHIgPSBOVUxMOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpbnQgcmVzID0gLTE7CisgICAgUHlPYmplY3QgKnJlcHIgPSBOVUxMOwogCi0Jc3RhdGljIGNoYXIgbCA9IExPTkc7CisgICAgc3RhdGljIGNoYXIgbCA9IExPTkc7CiAKLQlpZiAoc2VsZi0+cHJvdG8gPj0gMikgewotCQkvKiBMaW5lYXItdGltZSBwaWNrbGluZy4gKi8KLQkJc2l6ZV90IG5iaXRzOwotCQlzaXplX3QgbmJ5dGVzOwotCQl1bnNpZ25lZCBjaGFyICpwZGF0YTsKLQkJY2hhciBjX3N0cls1XTsKLQkJaW50IGk7Ci0JCWludCBzaWduID0gX1B5TG9uZ19TaWduKGFyZ3MpOworICAgIGlmIChzZWxmLT5wcm90byA+PSAyKSB7CisgICAgICAgIC8qIExpbmVhci10aW1lIHBpY2tsaW5nLiAqLworICAgICAgICBzaXplX3QgbmJpdHM7CisgICAgICAgIHNpemVfdCBuYnl0ZXM7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBkYXRhOworICAgICAgICBjaGFyIGNfc3RyWzVdOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHNpZ24gPSBfUHlMb25nX1NpZ24oYXJncyk7CiAKLQkJaWYgKHNpZ24gPT0gMCkgewotCQkJLyogSXQncyAwIC0tIGFuIGVtcHR5IGJ5dGVzdHJpbmcuICovCi0JCQljX3N0clswXSA9IExPTkcxOwotCQkJY19zdHJbMV0gPSAwOwotCQkJaSA9IHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIDIpOwotCQkJaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7Ci0JCQlyZXMgPSAwOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCW5iaXRzID0gX1B5TG9uZ19OdW1CaXRzKGFyZ3MpOwotCQlpZiAobmJpdHMgPT0gKHNpemVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJZ290byBmaW5hbGx5OwotCQkvKiBIb3cgbWFueSBieXRlcyBkbyB3ZSBuZWVkPyAgVGhlcmUgYXJlIG5iaXRzID4+IDMgZnVsbAotCQkgKiBieXRlcyBvZiBkYXRhLCBhbmQgbmJpdHMgJiA3IGxlZnRvdmVyIGJpdHMuICBJZiB0aGVyZQotCQkgKiBhcmUgYW55IGxlZnRvdmVyIGJpdHMsIHRoZW4gd2UgY2xlYXJseSBuZWVkIGFub3RoZXIKLQkJICogYnl0ZS4gIFduYXQncyBub3Qgc28gb2J2aW91cyBpcyB0aGF0IHdlICpwcm9iYWJseSoKLQkJICogbmVlZCBhbm90aGVyIGJ5dGUgZXZlbiBpZiB0aGVyZSBhcmVuJ3QgYW55IGxlZnRvdmVyczoKLQkJICogdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBtb3N0LXNpZ25pZmljYW50IGJ5dGUKLQkJICogYWN0cyBsaWtlIGEgc2lnbiBiaXQsIGFuZCBpdCdzIHVzdWFsbHkgZ290IGEgc2Vuc2UKLQkJICogb3Bwb3NpdGUgb2YgdGhlIG9uZSB3ZSBuZWVkLiAgVGhlIGV4Y2VwdGlvbiBpcyBsb25ncwotCQkgKiBvZiB0aGUgZm9ybSAtKDIqKig4KmotMSkpIGZvciBqID4gMC4gIFN1Y2ggYSBsb25nIGlzCi0JCSAqIGl0cyBvd24gMjU2J3MtY29tcGxlbWVudCwgc28gaGFzIHRoZSByaWdodCBzaWduIGJpdAotCQkgKiBldmVuIHdpdGhvdXQgdGhlIGV4dHJhIGJ5dGUuICBUaGF0J3MgYSBwYWluIHRvIGNoZWNrCi0JCSAqIGZvciBpbiBhZHZhbmNlLCB0aG91Z2gsIHNvIHdlIGFsd2F5cyBncmFiIGFuIGV4dHJhCi0JCSAqIGJ5dGUgYXQgdGhlIHN0YXJ0LCBhbmQgY3V0IGl0IGJhY2sgbGF0ZXIgaWYgcG9zc2libGUuCi0JCSAqLwotCQluYnl0ZXMgPSAobmJpdHMgPj4gMykgKyAxOwotCQlpZiAobmJ5dGVzID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsb25nIHRvbyBsYXJnZSAiCi0JCQkJInRvIHBpY2tsZSIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCXJlcHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoaW50KW5ieXRlcyk7Ci0JCWlmIChyZXByID09IE5VTEwpIGdvdG8gZmluYWxseTsKLQkJcGRhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhyZXByKTsKLQkJaSA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoKFB5TG9uZ09iamVjdCAqKWFyZ3MsCi0JIAkJCXBkYXRhLCBuYnl0ZXMsCi0JCQkJMSAvKiBsaXR0bGUgZW5kaWFuICovLCAxIC8qIHNpZ25lZCAqLyk7Ci0JCWlmIChpIDwgMCkgZ290byBmaW5hbGx5OwotCQkvKiBJZiB0aGUgbG9uZyBpcyBuZWdhdGl2ZSwgdGhpcyBtYXkgYmUgYSBieXRlIG1vcmUgdGhhbgotCQkgKiBuZWVkZWQuICBUaGlzIGlzIHNvIGlmZiB0aGUgTVNCIGlzIGFsbCByZWR1bmRhbnQgc2lnbgotCQkgKiBiaXRzLgotCQkgKi8KLQkJaWYgKHNpZ24gPCAwICYmIG5ieXRlcyA+IDEgJiYgcGRhdGFbbmJ5dGVzIC0gMV0gPT0gMHhmZiAmJgotCQkgICAgKHBkYXRhW25ieXRlcyAtIDJdICYgMHg4MCkgIT0gMCkKLQkJCS0tbmJ5dGVzOworICAgICAgICBpZiAoc2lnbiA9PSAwKSB7CisgICAgICAgICAgICAvKiBJdCdzIDAgLS0gYW4gZW1wdHkgYnl0ZXN0cmluZy4gKi8KKyAgICAgICAgICAgIGNfc3RyWzBdID0gTE9ORzE7CisgICAgICAgICAgICBjX3N0clsxXSA9IDA7CisgICAgICAgICAgICBpID0gc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgMik7CisgICAgICAgICAgICBpZiAoaSA8IDApIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgbmJpdHMgPSBfUHlMb25nX051bUJpdHMoYXJncyk7CisgICAgICAgIGlmIChuYml0cyA9PSAoc2l6ZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIC8qIEhvdyBtYW55IGJ5dGVzIGRvIHdlIG5lZWQ/ICBUaGVyZSBhcmUgbmJpdHMgPj4gMyBmdWxsCisgICAgICAgICAqIGJ5dGVzIG9mIGRhdGEsIGFuZCBuYml0cyAmIDcgbGVmdG92ZXIgYml0cy4gIElmIHRoZXJlCisgICAgICAgICAqIGFyZSBhbnkgbGVmdG92ZXIgYml0cywgdGhlbiB3ZSBjbGVhcmx5IG5lZWQgYW5vdGhlcgorICAgICAgICAgKiBieXRlLiAgV25hdCdzIG5vdCBzbyBvYnZpb3VzIGlzIHRoYXQgd2UgKnByb2JhYmx5KgorICAgICAgICAgKiBuZWVkIGFub3RoZXIgYnl0ZSBldmVuIGlmIHRoZXJlIGFyZW4ndCBhbnkgbGVmdG92ZXJzOgorICAgICAgICAgKiB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXQgb2YgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYnl0ZQorICAgICAgICAgKiBhY3RzIGxpa2UgYSBzaWduIGJpdCwgYW5kIGl0J3MgdXN1YWxseSBnb3QgYSBzZW5zZQorICAgICAgICAgKiBvcHBvc2l0ZSBvZiB0aGUgb25lIHdlIG5lZWQuICBUaGUgZXhjZXB0aW9uIGlzIGxvbmdzCisgICAgICAgICAqIG9mIHRoZSBmb3JtIC0oMioqKDgqai0xKSkgZm9yIGogPiAwLiAgU3VjaCBhIGxvbmcgaXMKKyAgICAgICAgICogaXRzIG93biAyNTYncy1jb21wbGVtZW50LCBzbyBoYXMgdGhlIHJpZ2h0IHNpZ24gYml0CisgICAgICAgICAqIGV2ZW4gd2l0aG91dCB0aGUgZXh0cmEgYnl0ZS4gIFRoYXQncyBhIHBhaW4gdG8gY2hlY2sKKyAgICAgICAgICogZm9yIGluIGFkdmFuY2UsIHRob3VnaCwgc28gd2UgYWx3YXlzIGdyYWIgYW4gZXh0cmEKKyAgICAgICAgICogYnl0ZSBhdCB0aGUgc3RhcnQsIGFuZCBjdXQgaXQgYmFjayBsYXRlciBpZiBwb3NzaWJsZS4KKyAgICAgICAgICovCisgICAgICAgIG5ieXRlcyA9IChuYml0cyA+PiAzKSArIDE7CisgICAgICAgIGlmIChuYnl0ZXMgPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImxvbmcgdG9vIGxhcmdlICIKKyAgICAgICAgICAgICAgICAidG8gcGlja2xlIik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChpbnQpbmJ5dGVzKTsKKyAgICAgICAgaWYgKHJlcHIgPT0gTlVMTCkgZ290byBmaW5hbGx5OworICAgICAgICBwZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHJlcHIpOworICAgICAgICBpID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgoUHlMb25nT2JqZWN0ICopYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBkYXRhLCBuYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIGxpdHRsZSBlbmRpYW4gKi8sIDEgLyogc2lnbmVkICovKTsKKyAgICAgICAgaWYgKGkgPCAwKSBnb3RvIGZpbmFsbHk7CisgICAgICAgIC8qIElmIHRoZSBsb25nIGlzIG5lZ2F0aXZlLCB0aGlzIG1heSBiZSBhIGJ5dGUgbW9yZSB0aGFuCisgICAgICAgICAqIG5lZWRlZC4gIFRoaXMgaXMgc28gaWZmIHRoZSBNU0IgaXMgYWxsIHJlZHVuZGFudCBzaWduCisgICAgICAgICAqIGJpdHMuCisgICAgICAgICAqLworICAgICAgICBpZiAoc2lnbiA8IDAgJiYgbmJ5dGVzID4gMSAmJiBwZGF0YVtuYnl0ZXMgLSAxXSA9PSAweGZmICYmCisgICAgICAgICAgICAocGRhdGFbbmJ5dGVzIC0gMl0gJiAweDgwKSAhPSAwKQorICAgICAgICAgICAgLS1uYnl0ZXM7CiAKLQkJaWYgKG5ieXRlcyA8IDI1NikgewotCQkJY19zdHJbMF0gPSBMT05HMTsKLQkJCWNfc3RyWzFdID0gKGNoYXIpbmJ5dGVzOwotCQkJc2l6ZSA9IDI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljX3N0clswXSA9IExPTkc0OwotCQkJc2l6ZSA9IChpbnQpbmJ5dGVzOwotCQkJZm9yIChpID0gMTsgaSA8IDU7IGkrKykgewotCQkJCWNfc3RyW2ldID0gKGNoYXIpKHNpemUgJiAweGZmKTsKLQkJCQlzaXplID4+PSA4OwotCQkJfQotCQkJc2l6ZSA9IDU7Ci0JCX0KLQkJaSA9IHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIHNpemUpOwotCQlpZiAoaSA8IDApIGdvdG8gZmluYWxseTsKLQkJaSA9IHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgKGNoYXIgKilwZGF0YSwgKGludCluYnl0ZXMpOwotCQlpZiAoaSA8IDApIGdvdG8gZmluYWxseTsKLQkJcmVzID0gMDsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICAgICAgaWYgKG5ieXRlcyA8IDI1NikgeworICAgICAgICAgICAgY19zdHJbMF0gPSBMT05HMTsKKyAgICAgICAgICAgIGNfc3RyWzFdID0gKGNoYXIpbmJ5dGVzOworICAgICAgICAgICAgc2l6ZSA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjX3N0clswXSA9IExPTkc0OworICAgICAgICAgICAgc2l6ZSA9IChpbnQpbmJ5dGVzOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgICAgIGNfc3RyW2ldID0gKGNoYXIpKHNpemUgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBzaXplID4+PSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZSA9IDU7CisgICAgICAgIH0KKyAgICAgICAgaSA9IHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIHNpemUpOworICAgICAgICBpZiAoaSA8IDApIGdvdG8gZmluYWxseTsKKyAgICAgICAgaSA9IHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgKGNoYXIgKilwZGF0YSwgKGludCluYnl0ZXMpOworICAgICAgICBpZiAoaSA8IDApIGdvdG8gZmluYWxseTsKKyAgICAgICAgcmVzID0gMDsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCS8qIHByb3RvIDwgMjogIHdyaXRlIHRoZSByZXByIGFuZCBuZXdsaW5lLiAgVGhpcyBpcyBxdWFkcmF0aWMtdGltZQotCSAqIChpbiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyksIGluIGJvdGggZGlyZWN0aW9ucy4KLQkgKi8KLQlpZiAoISggcmVwciA9IFB5T2JqZWN0X1JlcHIoYXJncykpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogcHJvdG8gPCAyOiAgd3JpdGUgdGhlIHJlcHIgYW5kIG5ld2xpbmUuICBUaGlzIGlzIHF1YWRyYXRpYy10aW1lCisgICAgICogKGluIHRoZSBudW1iZXIgb2YgZGlnaXRzKSwgaW4gYm90aCBkaXJlY3Rpb25zLgorICAgICAqLworICAgIGlmICghKCByZXByID0gUHlPYmplY3RfUmVwcihhcmdzKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmICgoc2l6ZSA9IFB5U3RyaW5nX1NpemUocmVwcikpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICgoc2l6ZSA9IFB5U3RyaW5nX1NpemUocmVwcikpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmwsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZsLCAxKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsCi0JCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyZXByKSwKLQkJCSAgICAgCQkJc2l6ZSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopcmVwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlyZXMgPSAwOworICAgIHJlcyA9IDA7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHJlcHIpOwotCXJldHVybiByZXM7CisgICAgUHlfWERFQ1JFRihyZXByKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKIHN0YXRpYyBpbnQKIHNhdmVfZmxvYXQoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCAqKWFyZ3MpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QgKilhcmdzKTsKIAotCWlmIChzZWxmLT5iaW4pIHsKLQkJY2hhciBzdHJbOV07Ci0JCXN0clswXSA9IEJJTkZMT0FUOwotCQlpZiAoX1B5RmxvYXRfUGFjazgoeCwgKHVuc2lnbmVkIGNoYXIgKikmc3RyWzFdLCAwKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHN0ciwgOSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIHsKLQkJY2hhciBjX3N0clsyNTBdOwotCQljX3N0clswXSA9IEZMT0FUOwotCQlQeU9TX2FzY2lpX2Zvcm1hdGQoY19zdHIgKyAxLCBzaXplb2YoY19zdHIpIC0gMiwgIiUuMTdnIiwgeCk7Ci0JCS8qIEV4dGVuZCB0aGUgZm9ybWF0dGVkIHN0cmluZyB3aXRoIGEgbmV3bGluZSBjaGFyYWN0ZXIgKi8KLQkJc3RyY2F0KGNfc3RyLCAiXG4iKTsKKyAgICBpZiAoc2VsZi0+YmluKSB7CisgICAgICAgIGNoYXIgc3RyWzldOworICAgICAgICBzdHJbMF0gPSBCSU5GTE9BVDsKKyAgICAgICAgaWYgKF9QeUZsb2F0X1BhY2s4KHgsICh1bnNpZ25lZCBjaGFyICopJnN0clsxXSwgMCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBzdHIsIDkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNoYXIgY19zdHJbMjUwXTsKKyAgICAgICAgY19zdHJbMF0gPSBGTE9BVDsKKyAgICAgICAgUHlPU19hc2NpaV9mb3JtYXRkKGNfc3RyICsgMSwgc2l6ZW9mKGNfc3RyKSAtIDIsICIlLjE3ZyIsIHgpOworICAgICAgICAvKiBFeHRlbmQgdGhlIGZvcm1hdHRlZCBzdHJpbmcgd2l0aCBhIG5ld2xpbmUgY2hhcmFjdGVyICovCisgICAgICAgIHN0cmNhdChjX3N0ciwgIlxuIik7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIHN0cmxlbihjX3N0cikpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBzdHJsZW4oY19zdHIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludAogc2F2ZV9zdHJpbmcoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBkb3B1dCkKIHsKLQlpbnQgc2l6ZSwgbGVuOwotCVB5T2JqZWN0ICpyZXByPTA7CisgICAgaW50IHNpemUsIGxlbjsKKyAgICBQeU9iamVjdCAqcmVwcj0wOwogCi0JaWYgKChzaXplID0gUHlTdHJpbmdfU2l6ZShhcmdzKSkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKChzaXplID0gUHlTdHJpbmdfU2l6ZShhcmdzKSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoIXNlbGYtPmJpbikgewotCQljaGFyICpyZXByX3N0cjsKKyAgICBpZiAoIXNlbGYtPmJpbikgeworICAgICAgICBjaGFyICpyZXByX3N0cjsKIAotCQlzdGF0aWMgY2hhciBzdHJpbmcgPSBTVFJJTkc7CisgICAgICAgIHN0YXRpYyBjaGFyIHN0cmluZyA9IFNUUklORzsKIAotCQlpZiAoISggcmVwciA9IFB5T2JqZWN0X1JlcHIoYXJncykpKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoISggcmVwciA9IFB5T2JqZWN0X1JlcHIoYXJncykpKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWlmICgobGVuID0gUHlTdHJpbmdfU2l6ZShyZXByKSkgPCAwKQotCQkJZ290byBlcnI7Ci0JCXJlcHJfc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXJlcHIpOworICAgICAgICBpZiAoKGxlbiA9IFB5U3RyaW5nX1NpemUocmVwcikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICByZXByX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyZXByKTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc3RyaW5nLCAxKSA8IDApCi0JCQlnb3RvIGVycjsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnN0cmluZywgMSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgcmVwcl9zdHIsIGxlbikgPCAwKQotCQkJZ290byBlcnI7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHJlcHJfc3RyLCBsZW4pIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJCWdvdG8gZXJyOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKIAotCQlQeV9YREVDUkVGKHJlcHIpOwotCX0KLQllbHNlIHsKLQkJaW50IGk7Ci0JCWNoYXIgY19zdHJbNV07CisgICAgICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY2hhciBjX3N0cls1XTsKIAotCQlpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKGFyZ3MpKSA8IDApCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGlmICgoc2l6ZSA9IFB5U3RyaW5nX1NpemUoYXJncykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAoc2l6ZSA8IDI1NikgewotCQkJY19zdHJbMF0gPSBTSE9SVF9CSU5TVFJJTkc7Ci0JCQljX3N0clsxXSA9IHNpemU7Ci0JCQlsZW4gPSAyOwotCQl9Ci0JCWVsc2UgaWYgKHNpemUgPD0gSU5UX01BWCkgewotCQkJY19zdHJbMF0gPSBCSU5TVFJJTkc7Ci0JCQlmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQotCQkJCWNfc3RyW2ldID0gKGludCkoc2l6ZSA+PiAoKGkgLSAxKSAqIDgpKTsKLQkJCWxlbiA9IDU7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIC0xOyAgICAvKiBzdHJpbmcgdG9vIGxhcmdlICovCisgICAgICAgIGlmIChzaXplIDwgMjU2KSB7CisgICAgICAgICAgICBjX3N0clswXSA9IFNIT1JUX0JJTlNUUklORzsKKyAgICAgICAgICAgIGNfc3RyWzFdID0gc2l6ZTsKKyAgICAgICAgICAgIGxlbiA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc2l6ZSA8PSBJTlRfTUFYKSB7CisgICAgICAgICAgICBjX3N0clswXSA9IEJJTlNUUklORzsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICAgICAgY19zdHJbaV0gPSAoaW50KShzaXplID4+ICgoaSAtIDEpICogOCkpOworICAgICAgICAgICAgbGVuID0gNTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gLTE7ICAgIC8qIHN0cmluZyB0b28gbGFyZ2UgKi8KIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbGVuKSA8IDApCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBsZW4pIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAoc2l6ZSA+IDEyOCAmJiBQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgewotCQkJaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOwotCQkJUERBVEFfQVBQRU5EKHNlbGYtPmZpbGUsIGFyZ3MsIC0xKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsCi0JCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAotCQkJCQkgICAgIAkoUHlTdHJpbmdPYmplY3QgKilhcmdzKSwKLQkJCQkJICAgICBzaXplKSA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgICAgICBpZiAoc2l6ZSA+IDEyOCAmJiBQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgeworICAgICAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkgcmV0dXJuIC0xOworICAgICAgICAgICAgUERBVEFfQVBQRU5EKHNlbGYtPmZpbGUsIGFyZ3MsIC0xKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlTdHJpbmdPYmplY3QgKilhcmdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoZG9wdXQpCi0JCWlmIChwdXQoc2VsZiwgYXJncykgPCAwKQotCQkJcmV0dXJuIC0xOworICAgIGlmIChkb3B1dCkKKyAgICAgICAgaWYgKHB1dChzZWxmLCBhcmdzKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAogICBlcnI6Ci0JUHlfWERFQ1JFRihyZXByKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfWERFQ1JFRihyZXByKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIApAQCAtMTI4Myw3MSArMTI4Myw3MSBAQAogI2VuZGlmCiAKICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gZXhwYW5kc2l6ZSkKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICByZXByID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZXhwYW5kc2l6ZSAqIHNpemUpOwogICAgIGlmIChyZXByID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIGlmIChzaXplID09IDApCi0JcmV0dXJuIHJlcHI7CisgICAgcmV0dXJuIHJlcHI7CiAKICAgICBwID0gcSA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXByKTsKICAgICB3aGlsZSAoc2l6ZS0tID4gMCkgewotICAgICAgICBQeV9VTklDT0RFIGNoID0gKnMrKzsKKyAgICBQeV9VTklDT0RFIGNoID0gKnMrKzsKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKLQkvKiBNYXAgMzItYml0IGNoYXJhY3RlcnMgdG8gJ1xVeHh4eHh4eHgnICovCi0JaWYgKGNoID49IDB4MTAwMDApIHsKLSAgICAgICAgICAgICpwKysgPSAnXFwnOwotICAgICAgICAgICAgKnArKyA9ICdVJzsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMjgpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMjQpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMjApICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMTYpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMTIpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gOCkgJiAweGZdOwotICAgICAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiA0KSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbY2ggJiAxNV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQorICAgIC8qIE1hcCAzMi1iaXQgY2hhcmFjdGVycyB0byAnXFV4eHh4eHh4eCcgKi8KKyAgICBpZiAoY2ggPj0gMHgxMDAwMCkgeworICAgICAgICAqcCsrID0gJ1xcJzsKKyAgICAgICAgKnArKyA9ICdVJzsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiAyOCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDI0KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMjApICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiAxNikgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDEyKSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gOCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDQpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0W2NoICYgMTVdOworICAgIH0KKyAgICBlbHNlCiAjZWxzZQotCS8qIE1hcCBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzIHRvICdcVTAweHh4eHh4JyAqLwotCWlmIChjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERDMDApIHsKLQkgICAgUHlfVU5JQ09ERSBjaDI7Ci0JICAgIFB5X1VDUzQgdWNzOworICAgIC8qIE1hcCBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzIHRvICdcVTAweHh4eHh4JyAqLworICAgIGlmIChjaCA+PSAweEQ4MDAgJiYgY2ggPCAweERDMDApIHsKKyAgICAgICAgUHlfVU5JQ09ERSBjaDI7CisgICAgICAgIFB5X1VDUzQgdWNzOwogCi0JICAgIGNoMiA9ICpzKys7Ci0JICAgIHNpemUtLTsKLQkgICAgaWYgKGNoMiA+PSAweERDMDAgJiYgY2gyIDw9IDB4REZGRikgewotCQl1Y3MgPSAoKChjaCAmIDB4MDNGRikgPDwgMTApIHwgKGNoMiAmIDB4MDNGRikpICsgMHgwMDAxMDAwMDsKLQkJKnArKyA9ICdcXCc7Ci0JCSpwKysgPSAnVSc7Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDI4KSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDI0KSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDIwKSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDE2KSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDEyKSAmIDB4Zl07Ci0JCSpwKysgPSBoZXhkaWdpdFsodWNzID4+IDgpICYgMHhmXTsKLQkJKnArKyA9IGhleGRpZ2l0Wyh1Y3MgPj4gNCkgJiAweGZdOwotCQkqcCsrID0gaGV4ZGlnaXRbdWNzICYgMHhmXTsKLQkJY29udGludWU7Ci0JICAgIH0KLQkgICAgLyogRmFsbCB0aHJvdWdoOiBpc29sYXRlZCBzdXJyb2dhdGVzIGFyZSBjb3BpZWQgYXMtaXMgKi8KLQkgICAgcy0tOwotCSAgICBzaXplKys7Ci0JfQotI2VuZGlmCi0JLyogTWFwIDE2LWJpdCBjaGFyYWN0ZXJzIHRvICdcdXh4eHgnICovCi0JaWYgKGNoID49IDI1NiB8fCBjaCA9PSAnXFwnIHx8IGNoID09ICdcbicpIHsKLSAgICAgICAgICAgICpwKysgPSAnXFwnOwotICAgICAgICAgICAgKnArKyA9ICd1JzsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gMTIpICYgMHhmXTsKLSAgICAgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gOCkgJiAweGZdOwotICAgICAgICAgICAgKnArKyA9IGhleGRpZ2l0WyhjaCA+PiA0KSAmIDB4Zl07Ci0gICAgICAgICAgICAqcCsrID0gaGV4ZGlnaXRbY2ggJiAxNV07CisgICAgICAgIGNoMiA9ICpzKys7CisgICAgICAgIHNpemUtLTsKKyAgICAgICAgaWYgKGNoMiA+PSAweERDMDAgJiYgY2gyIDw9IDB4REZGRikgeworICAgICAgICB1Y3MgPSAoKChjaCAmIDB4MDNGRikgPDwgMTApIHwgKGNoMiAmIDB4MDNGRikpICsgMHgwMDAxMDAwMDsKKyAgICAgICAgKnArKyA9ICdcXCc7CisgICAgICAgICpwKysgPSAnVSc7CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDI4KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDI0KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDIwKSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDE2KSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDEyKSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsodWNzID4+IDgpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0Wyh1Y3MgPj4gNCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbdWNzICYgMHhmXTsKKyAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLQkvKiBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBhcy1pcyAqLwotCWVsc2UKLSAgICAgICAgICAgICpwKysgPSAoY2hhcikgY2g7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaDogaXNvbGF0ZWQgc3Vycm9nYXRlcyBhcmUgY29waWVkIGFzLWlzICovCisgICAgICAgIHMtLTsKKyAgICAgICAgc2l6ZSsrOworICAgIH0KKyNlbmRpZgorICAgIC8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHV4eHh4JyAqLworICAgIGlmIChjaCA+PSAyNTYgfHwgY2ggPT0gJ1xcJyB8fCBjaCA9PSAnXG4nKSB7CisgICAgICAgICpwKysgPSAnXFwnOworICAgICAgICAqcCsrID0gJ3UnOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDEyKSAmIDB4Zl07CisgICAgICAgICpwKysgPSBoZXhkaWdpdFsoY2ggPj4gOCkgJiAweGZdOworICAgICAgICAqcCsrID0gaGV4ZGlnaXRbKGNoID4+IDQpICYgMHhmXTsKKyAgICAgICAgKnArKyA9IGhleGRpZ2l0W2NoICYgMTVdOworICAgIH0KKyAgICAvKiBDb3B5IGV2ZXJ5dGhpbmcgZWxzZSBhcy1pcyAqLworICAgIGVsc2UKKyAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICB9CiAgICAgKnAgPSAnXDAnOwogICAgIF9QeVN0cmluZ19SZXNpemUoJnJlcHIsIHAgLSBxKTsKQEAgLTEzNTcsNzkgKzEzNTcsNzkgQEAKIHN0YXRpYyBpbnQKIHNhdmVfdW5pY29kZShQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRvcHV0KQogewotCVB5X3NzaXplX3Qgc2l6ZSwgbGVuOwotCVB5T2JqZWN0ICpyZXByPTA7CisgICAgUHlfc3NpemVfdCBzaXplLCBsZW47CisgICAgUHlPYmplY3QgKnJlcHI9MDsKIAotCWlmICghUHlVbmljb2RlX0NoZWNrKGFyZ3MpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soYXJncykpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghc2VsZi0+YmluKSB7Ci0JCWNoYXIgKnJlcHJfc3RyOwotCQlzdGF0aWMgY2hhciBzdHJpbmcgPSBVTklDT0RFOworICAgIGlmICghc2VsZi0+YmluKSB7CisgICAgICAgIGNoYXIgKnJlcHJfc3RyOworICAgICAgICBzdGF0aWMgY2hhciBzdHJpbmcgPSBVTklDT0RFOwogCi0JCXJlcHIgPSBtb2RpZmllZF9FbmNvZGVSYXdVbmljb2RlRXNjYXBlKAotCQkJUHlVbmljb2RlX0FTX1VOSUNPREUoYXJncyksIFB5VW5pY29kZV9HRVRfU0laRShhcmdzKSk7Ci0JCWlmICghcmVwcikKLQkJCXJldHVybiAtMTsKKyAgICAgICAgcmVwciA9IG1vZGlmaWVkX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUoCisgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmdzKSwgUHlVbmljb2RlX0dFVF9TSVpFKGFyZ3MpKTsKKyAgICAgICAgaWYgKCFyZXByKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWlmICgobGVuID0gUHlTdHJpbmdfU2l6ZShyZXByKSkgPCAwKQotCQkJZ290byBlcnI7Ci0JCXJlcHJfc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXJlcHIpOworICAgICAgICBpZiAoKGxlbiA9IFB5U3RyaW5nX1NpemUocmVwcikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICByZXByX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyZXByKTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc3RyaW5nLCAxKSA8IDApCi0JCQlnb3RvIGVycjsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnN0cmluZywgMSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgcmVwcl9zdHIsIGxlbikgPCAwKQotCQkJZ290byBlcnI7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHJlcHJfc3RyLCBsZW4pIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJCWdvdG8gZXJyOworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKIAotCQlQeV9YREVDUkVGKHJlcHIpOwotCX0KLQllbHNlIHsKLQkJaW50IGk7Ci0JCWNoYXIgY19zdHJbNV07CisgICAgICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY2hhciBjX3N0cls1XTsKIAotCQlpZiAoISggcmVwciA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoYXJncykpKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoISggcmVwciA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoYXJncykpKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWlmICgoc2l6ZSA9IFB5U3RyaW5nX1NpemUocmVwcikpIDwgMCkKLQkJCWdvdG8gZXJyOwotCQlpZiAoc2l6ZSA+IElOVF9NQVgpCi0JCQlyZXR1cm4gLTE7ICAgLyogc3RyaW5nIHRvbyBsYXJnZSAqLworICAgICAgICBpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKHJlcHIpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgaWYgKHNpemUgPiBJTlRfTUFYKQorICAgICAgICAgICAgcmV0dXJuIC0xOyAgIC8qIHN0cmluZyB0b28gbGFyZ2UgKi8KIAotCQljX3N0clswXSA9IEJJTlVOSUNPREU7Ci0JCWZvciAoaSA9IDE7IGkgPCA1OyBpKyspCi0JCQljX3N0cltpXSA9IChpbnQpKHNpemUgPj4gKChpIC0gMSkgKiA4KSk7Ci0JCWxlbiA9IDU7CisgICAgICAgIGNfc3RyWzBdID0gQklOVU5JQ09ERTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIGNfc3RyW2ldID0gKGludCkoc2l6ZSA+PiAoKGkgLSAxKSAqIDgpKTsKKyAgICAgICAgbGVuID0gNTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbGVuKSA8IDApCi0JCQlnb3RvIGVycjsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJaWYgKHNpemUgPiAxMjggJiYgUGRhdGFfQ2hlY2soc2VsZi0+ZmlsZSkpIHsKLQkJCWlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApCi0JCQkJZ290byBlcnI7Ci0JCQlQREFUQV9BUFBFTkQoc2VsZi0+ZmlsZSwgcmVwciwgLTEpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHJlcHIpLAotCQkJCQkgICAgIHNpemUpIDwgMCkKLQkJCQlnb3RvIGVycjsKLQkJfQorICAgICAgICBpZiAoc2l6ZSA+IDEyOCAmJiBQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgeworICAgICAgICAgICAgaWYgKHdyaXRlX290aGVyKHNlbGYsIE5VTEwsIDApIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIFBEQVRBX0FQUEVORChzZWxmLT5maWxlLCByZXByLCAtMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBQeVN0cmluZ19BU19TVFJJTkcocmVwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KIAotCQlQeV9ERUNSRUYocmVwcik7Ci0JfQorICAgICAgICBQeV9ERUNSRUYocmVwcik7CisgICAgfQogCi0JaWYgKGRvcHV0KQotCQlpZiAocHV0KHNlbGYsIGFyZ3MpIDwgMCkKLQkJCXJldHVybiAtMTsKKyAgICBpZiAoZG9wdXQpCisgICAgICAgIGlmIChwdXQoc2VsZiwgYXJncykgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKICAgZXJyOgotCVB5X1hERUNSRUYocmVwcik7Ci0JcmV0dXJuIC0xOworICAgIFB5X1hERUNSRUYocmVwcik7CisgICAgcmV0dXJuIC0xOwogfQogI2VuZGlmCiAKQEAgLTE0MzcsMjMgKzE0MzcsMjMgQEAKIHN0YXRpYyBpbnQKIHN0b3JlX3R1cGxlX2VsZW1lbnRzKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0LCBpbnQgbGVuKQogewotCWludCBpOwotCWludCByZXMgPSAtMTsJLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLworICAgIGludCBpOworICAgIGludCByZXMgPSAtMTsgICAgICAgLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLwogCi0JYXNzZXJ0KFB5VHVwbGVfU2l6ZSh0KSA9PSBsZW4pOworICAgIGFzc2VydChQeVR1cGxlX1NpemUodCkgPT0gbGVuKTsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqZWxlbWVudCA9IFB5VHVwbGVfR0VUX0lURU0odCwgaSk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICplbGVtZW50ID0gUHlUdXBsZV9HRVRfSVRFTSh0LCBpKTsKIAotCQlpZiAoZWxlbWVudCA9PSBOVUxMKQotCQkJZ290byBmaW5hbGx5OwotCQlpZiAoc2F2ZShzZWxmLCBlbGVtZW50LCAwKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQotCXJlcyA9IDA7CisgICAgICAgIGlmIChlbGVtZW50ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmIChzYXZlKHNlbGYsIGVsZW1lbnQsIDApIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgcmVzID0gMDsKIAogICBmaW5hbGx5OgotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogVHVwbGVzIGFyZSB1YmlxdWl0b3VzIGluIHRoZSBwaWNrbGUgcHJvdG9jb2xzLCBzbyBtYW55IHRlY2huaXF1ZXMgYXJlCkBAIC0xNDY1LDEwOCArMTQ2NSwxMDggQEAKIHN0YXRpYyBpbnQKIHNhdmVfdHVwbGUoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnB5X3R1cGxlX2lkID0gTlVMTDsKLQlpbnQgbGVuLCBpOwotCWludCByZXMgPSAtMTsKKyAgICBQeU9iamVjdCAqcHlfdHVwbGVfaWQgPSBOVUxMOworICAgIGludCBsZW4sIGk7CisgICAgaW50IHJlcyA9IC0xOwogCi0Jc3RhdGljIGNoYXIgdHVwbGUgPSBUVVBMRTsKLQlzdGF0aWMgY2hhciBwb3AgPSBQT1A7Ci0Jc3RhdGljIGNoYXIgcG9wX21hcmsgPSBQT1BfTUFSSzsKLQlzdGF0aWMgY2hhciBsZW4yb3Bjb2RlW10gPSB7RU1QVFlfVFVQTEUsIFRVUExFMSwgVFVQTEUyLCBUVVBMRTN9OworICAgIHN0YXRpYyBjaGFyIHR1cGxlID0gVFVQTEU7CisgICAgc3RhdGljIGNoYXIgcG9wID0gUE9QOworICAgIHN0YXRpYyBjaGFyIHBvcF9tYXJrID0gUE9QX01BUks7CisgICAgc3RhdGljIGNoYXIgbGVuMm9wY29kZVtdID0ge0VNUFRZX1RVUExFLCBUVVBMRTEsIFRVUExFMiwgVFVQTEUzfTsKIAotCWlmICgobGVuID0gUHlUdXBsZV9TaXplKGFyZ3MpKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoKGxlbiA9IFB5VHVwbGVfU2l6ZShhcmdzKSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAobGVuID09IDApIHsKLQkJY2hhciBjX3N0clsyXTsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgY2hhciBjX3N0clsyXTsKIAotCQlpZiAoc2VsZi0+cHJvdG8pIHsKLQkJCWNfc3RyWzBdID0gRU1QVFlfVFVQTEU7Ci0JCQlsZW4gPSAxOwotCQl9Ci0JCWVsc2UgewotCQkJY19zdHJbMF0gPSBNQVJLOwotCQkJY19zdHJbMV0gPSBUVVBMRTsKLQkJCWxlbiA9IDI7Ci0JCX0KLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgY19zdHIsIGxlbikgPj0gMCkKLQkJCXJlcyA9IDA7Ci0JCS8qIERvbid0IG1lbW9pemUgYW4gZW1wdHkgdHVwbGUuICovCi0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgICAgIGlmIChzZWxmLT5wcm90bykgeworICAgICAgICAgICAgY19zdHJbMF0gPSBFTVBUWV9UVVBMRTsKKyAgICAgICAgICAgIGxlbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjX3N0clswXSA9IE1BUks7CisgICAgICAgICAgICBjX3N0clsxXSA9IFRVUExFOworICAgICAgICAgICAgbGVuID0gMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbGVuKSA+PSAwKQorICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgLyogRG9uJ3QgbWVtb2l6ZSBhbiBlbXB0eSB0dXBsZS4gKi8KKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCS8qIEEgbm9uLWVtcHR5IHR1cGxlLiAqLworICAgIC8qIEEgbm9uLWVtcHR5IHR1cGxlLiAqLwogCi0JLyogaWQodHVwbGUpIGlzbid0IGluIHRoZSBtZW1vIG5vdy4gIElmIGl0IHNob3dzIHVwIHRoZXJlIGFmdGVyCi0JICogc2F2aW5nIHRoZSB0dXBsZSBlbGVtZW50cywgdGhlIHR1cGxlIG11c3QgYmUgcmVjdXJzaXZlLCBpbgotCSAqIHdoaWNoIGNhc2Ugd2UnbGwgcG9wIGV2ZXJ5dGhpbmcgd2UgcHV0IG9uIHRoZSBzdGFjaywgYW5kIGZldGNoCi0JICogaXRzIHZhbHVlIGZyb20gdGhlIG1lbW8uCi0JICovCi0JcHlfdHVwbGVfaWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoYXJncyk7Ci0JaWYgKHB5X3R1cGxlX2lkID09IE5VTEwpCi0JCWdvdG8gZmluYWxseTsKKyAgICAvKiBpZCh0dXBsZSkgaXNuJ3QgaW4gdGhlIG1lbW8gbm93LiAgSWYgaXQgc2hvd3MgdXAgdGhlcmUgYWZ0ZXIKKyAgICAgKiBzYXZpbmcgdGhlIHR1cGxlIGVsZW1lbnRzLCB0aGUgdHVwbGUgbXVzdCBiZSByZWN1cnNpdmUsIGluCisgICAgICogd2hpY2ggY2FzZSB3ZSdsbCBwb3AgZXZlcnl0aGluZyB3ZSBwdXQgb24gdGhlIHN0YWNrLCBhbmQgZmV0Y2gKKyAgICAgKiBpdHMgdmFsdWUgZnJvbSB0aGUgbWVtby4KKyAgICAgKi8KKyAgICBweV90dXBsZV9pZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cihhcmdzKTsKKyAgICBpZiAocHlfdHVwbGVfaWQgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKGxlbiA8PSAzICYmIHNlbGYtPnByb3RvID49IDIpIHsKLQkJLyogVXNlIFRVUExFezEsMiwzfSBvcGNvZGVzLiAqLwotCQlpZiAoc3RvcmVfdHVwbGVfZWxlbWVudHMoc2VsZiwgYXJncywgbGVuKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JCWlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV90dXBsZV9pZCkpIHsKLQkJCS8qIHBvcCB0aGUgbGVuIGVsZW1lbnRzICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCi0JCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcCwgMSkgPCAwKQotCQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQkvKiBmZXRjaCBmcm9tIG1lbW8gKi8KLQkJCWlmIChnZXQoc2VsZiwgcHlfdHVwbGVfaWQpIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQlyZXMgPSAwOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCS8qIE5vdCByZWN1cnNpdmUuICovCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGxlbjJvcGNvZGUgKyBsZW4sIDEpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKLQkJZ290byBtZW1vaXplOwotCX0KKyAgICBpZiAobGVuIDw9IDMgJiYgc2VsZi0+cHJvdG8gPj0gMikgeworICAgICAgICAvKiBVc2UgVFVQTEV7MSwyLDN9IG9wY29kZXMuICovCisgICAgICAgIGlmIChzdG9yZV90dXBsZV9lbGVtZW50cyhzZWxmLCBhcmdzLCBsZW4pIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X3R1cGxlX2lkKSkgeworICAgICAgICAgICAgLyogcG9wIHRoZSBsZW4gZWxlbWVudHMgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKKyAgICAgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmcG9wLCAxKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIC8qIGZldGNoIGZyb20gbWVtbyAqLworICAgICAgICAgICAgaWYgKGdldChzZWxmLCBweV90dXBsZV9pZCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgLyogTm90IHJlY3Vyc2l2ZS4gKi8KKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgbGVuMm9wY29kZSArIGxlbiwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICBnb3RvIG1lbW9pemU7CisgICAgfQogCi0JLyogcHJvdG8gPCAyIGFuZCBsZW4gPiAwLCBvciBwcm90byA+PSAyIGFuZCBsZW4gPiAzLgotCSAqIEdlbmVyYXRlIE1BUksgZWx0MSBlbHQyIC4uLiBUVVBMRQotCSAqLwotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZNQVJLdiwgMSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogcHJvdG8gPCAyIGFuZCBsZW4gPiAwLCBvciBwcm90byA+PSAyIGFuZCBsZW4gPiAzLgorICAgICAqIEdlbmVyYXRlIE1BUksgZWx0MSBlbHQyIC4uLiBUVVBMRQorICAgICAqLworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZNQVJLdiwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc3RvcmVfdHVwbGVfZWxlbWVudHMoc2VsZiwgYXJncywgbGVuKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc3RvcmVfdHVwbGVfZWxlbWVudHMoc2VsZiwgYXJncywgbGVuKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV90dXBsZV9pZCkpIHsKLQkJLyogcG9wIHRoZSBzdGFjayBzdHVmZiB3ZSBwdXNoZWQgKi8KLQkJaWYgKHNlbGYtPmJpbikgewotCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcF9tYXJrLCAxKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWVsc2UgewotCQkJLyogTm90ZSB0aGF0IHdlIHBvcCBvbmUgbW9yZSB0aGFuIGxlbiwgdG8gcmVtb3ZlCi0JCQkgKiB0aGUgTUFSSyB0b28uCi0JCQkgKi8KLQkJCWZvciAoaSA9IDA7IGkgPD0gbGVuOyBpKyspCi0JCQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcCwgMSkgPCAwKQotCQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJLyogZmV0Y2ggZnJvbSBtZW1vICovCi0JCWlmIChnZXQoc2VsZiwgcHlfdHVwbGVfaWQpID49IDApCi0JCQlyZXMgPSAwOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChQeURpY3RfR2V0SXRlbShzZWxmLT5tZW1vLCBweV90dXBsZV9pZCkpIHsKKyAgICAgICAgLyogcG9wIHRoZSBzdGFjayBzdHVmZiB3ZSBwdXNoZWQgKi8KKyAgICAgICAgaWYgKHNlbGYtPmJpbikgeworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcF9tYXJrLCAxKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogTm90ZSB0aGF0IHdlIHBvcCBvbmUgbW9yZSB0aGFuIGxlbiwgdG8gcmVtb3ZlCisgICAgICAgICAgICAgKiB0aGUgTUFSSyB0b28uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbGVuOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnBvcCwgMSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgLyogZmV0Y2ggZnJvbSBtZW1vICovCisgICAgICAgIGlmIChnZXQoc2VsZiwgcHlfdHVwbGVfaWQpID49IDApCisgICAgICAgICAgICByZXMgPSAwOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JLyogTm90IHJlY3Vyc2l2ZS4gKi8KLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmdHVwbGUsIDEpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIC8qIE5vdCByZWN1cnNpdmUuICovCisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnR1cGxlLCAxKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAogICBtZW1vaXplOgotCWlmIChwdXQoc2VsZiwgYXJncykgPj0gMCkKLQkJcmVzID0gMDsKKyAgICBpZiAocHV0KHNlbGYsIGFyZ3MpID49IDApCisgICAgICAgIHJlcyA9IDA7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHB5X3R1cGxlX2lkKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X1hERUNSRUYocHlfdHVwbGVfaWQpOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIGl0ZXIgaXMgYW4gaXRlcmF0b3IgZ2l2aW5nIGl0ZW1zLCBhbmQgd2UgYmF0Y2ggdXAgY2h1bmtzIG9mCkBAIC0xNTc4LDE1NyArMTU3OCwxNTcgQEAKIHN0YXRpYyBpbnQKIGJhdGNoX2xpc3QoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKml0ZXIpCiB7Ci0JUHlPYmplY3QgKm9iaiA9IE5VTEw7Ci0JUHlPYmplY3QgKmZpcnN0aXRlbSA9IE5VTEw7Ci0JaW50IGksIG47CisgICAgUHlPYmplY3QgKm9iaiA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZpcnN0aXRlbSA9IE5VTEw7CisgICAgaW50IGksIG47CiAKLQlzdGF0aWMgY2hhciBhcHBlbmQgPSBBUFBFTkQ7Ci0Jc3RhdGljIGNoYXIgYXBwZW5kcyA9IEFQUEVORFM7CisgICAgc3RhdGljIGNoYXIgYXBwZW5kID0gQVBQRU5EOworICAgIHN0YXRpYyBjaGFyIGFwcGVuZHMgPSBBUFBFTkRTOwogCi0JYXNzZXJ0KGl0ZXIgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGl0ZXIgIT0gTlVMTCk7CiAKLQlpZiAoc2VsZi0+cHJvdG8gPT0gMCkgewotCQkvKiBBUFBFTkRTIGlzbid0IGF2YWlsYWJsZTsgZG8gb25lIGF0IGEgdGltZS4gKi8KLQkJZm9yICg7OykgewotCQkJb2JqID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCQlpZiAob2JqID09IE5VTEwpIHsKLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaSA9IHNhdmUoc2VsZiwgb2JqLCAwKTsKLQkJCVB5X0RFQ1JFRihvYmopOwotCQkJaWYgKGkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZhcHBlbmQsIDEpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChzZWxmLT5wcm90byA9PSAwKSB7CisgICAgICAgIC8qIEFQUEVORFMgaXNuJ3QgYXZhaWxhYmxlOyBkbyBvbmUgYXQgYSB0aW1lLiAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBvYmogPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpID0gc2F2ZShzZWxmLCBvYmosIDApOworICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmFwcGVuZCwgMSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBwcm90byA+IDA6ICB3cml0ZSBpbiBiYXRjaGVzIG9mIEJBVENIU0laRS4gKi8KLQlkbyB7Ci0JCS8qIEdldCBmaXJzdCBpdGVtICovCi0JCWZpcnN0aXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQlpZiAoZmlyc3RpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgLyogcHJvdG8gPiAwOiAgd3JpdGUgaW4gYmF0Y2hlcyBvZiBCQVRDSFNJWkUuICovCisgICAgZG8geworICAgICAgICAvKiBHZXQgZmlyc3QgaXRlbSAqLworICAgICAgICBmaXJzdGl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgaWYgKGZpcnN0aXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOwogCi0JCQkvKiBub3RoaW5nIG1vcmUgdG8gYWRkICovCi0JCQlicmVhazsKLQkJfQorICAgICAgICAgICAgLyogbm90aGluZyBtb3JlIHRvIGFkZCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQkvKiBUcnkgdG8gZ2V0IGEgc2Vjb25kIGl0ZW0gKi8KLQkJb2JqID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCWlmIChvYmogPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgLyogVHJ5IHRvIGdldCBhIHNlY29uZCBpdGVtICovCisgICAgICAgIG9iaiA9IFB5SXRlcl9OZXh0KGl0ZXIpOworICAgICAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CiAKLQkJCS8qIE9ubHkgb25lIGl0ZW0gdG8gd3JpdGUgKi8KLQkJCWlmIChzYXZlKHNlbGYsIGZpcnN0aXRlbSwgMCkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYXBwZW5kLCAxKSA8IDApCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJCVB5X0NMRUFSKGZpcnN0aXRlbSk7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICAgICAgLyogT25seSBvbmUgaXRlbSB0byB3cml0ZSAqLworICAgICAgICAgICAgaWYgKHNhdmUoc2VsZiwgZmlyc3RpdGVtLCAwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZhcHBlbmQsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIoZmlyc3RpdGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJLyogTW9yZSB0aGFuIG9uZSBpdGVtIHRvIHdyaXRlICovCisgICAgICAgIC8qIE1vcmUgdGhhbiBvbmUgaXRlbSB0byB3cml0ZSAqLwogCi0JCS8qIFB1bXAgb3V0IE1BUkssIGl0ZW1zLCBBUFBFTkRTLiAqLwotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmTUFSS3YsIDEpIDwgMCkKLQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQotCQlpZiAoc2F2ZShzZWxmLCBmaXJzdGl0ZW0sIDApIDwgMCkKLQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCVB5X0NMRUFSKGZpcnN0aXRlbSk7Ci0JCW4gPSAxOwotCQkKLQkJLyogRmV0Y2ggYW5kIHNhdmUgdXAgdG8gQkFUQ0hTSVpFIGl0ZW1zICovCi0JCXdoaWxlIChvYmopIHsKLQkJCWlmIChzYXZlKHNlbGYsIG9iaiwgMCkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlQeV9DTEVBUihvYmopOwotCQkJbiArPSAxOwotCQkJCi0JCQlpZiAobiA9PSBCQVRDSFNJWkUpCi0JCQkJYnJlYWs7CisgICAgICAgIC8qIFB1bXAgb3V0IE1BUkssIGl0ZW1zLCBBUFBFTkRTLiAqLworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmTUFSS3YsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CiAKLQkJCW9iaiA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQkJaWYgKG9iaiA9PSBOVUxMKSB7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKHNhdmUoc2VsZiwgZmlyc3RpdGVtLCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICBQeV9DTEVBUihmaXJzdGl0ZW0pOworICAgICAgICBuID0gMTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYXBwZW5kcywgMSkgPCAwKQotCQkJZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgLyogRmV0Y2ggYW5kIHNhdmUgdXAgdG8gQkFUQ0hTSVpFIGl0ZW1zICovCisgICAgICAgIHdoaWxlIChvYmopIHsKKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIG9iaiwgMCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUihvYmopOworICAgICAgICAgICAgbiArPSAxOwogCi0JfSB3aGlsZSAobiA9PSBCQVRDSFNJWkUpOwotCXJldHVybiAwOworICAgICAgICAgICAgaWYgKG4gPT0gQkFUQ0hTSVpFKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBvYmogPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmFwcGVuZHMsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisKKyAgICB9IHdoaWxlIChuID09IEJBVENIU0laRSk7CisgICAgcmV0dXJuIDA7CiAKIEJhdGNoRmFpbGVkOgotCVB5X1hERUNSRUYoZmlyc3RpdGVtKTsKLQlQeV9YREVDUkVGKG9iaik7Ci0JcmV0dXJuIC0xOworICAgIFB5X1hERUNSRUYoZmlyc3RpdGVtKTsKKyAgICBQeV9YREVDUkVGKG9iaik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50CiBzYXZlX2xpc3QoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJlcyA9IC0xOwotCWNoYXIgc1szXTsKLQlpbnQgbGVuOwotCVB5T2JqZWN0ICppdGVyOworICAgIGludCByZXMgPSAtMTsKKyAgICBjaGFyIHNbM107CisgICAgaW50IGxlbjsKKyAgICBQeU9iamVjdCAqaXRlcjsKIAotCWlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfZW50ZXIoc2VsZiwgYXJncykpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+ZmFzdCAmJiAhZmFzdF9zYXZlX2VudGVyKHNlbGYsIGFyZ3MpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkvKiBDcmVhdGUgYW4gZW1wdHkgbGlzdC4gKi8KLQlpZiAoc2VsZi0+YmluKSB7Ci0JCXNbMF0gPSBFTVBUWV9MSVNUOwotCQlsZW4gPSAxOwotCX0KLQllbHNlIHsKLQkJc1swXSA9IE1BUks7Ci0JCXNbMV0gPSBMSVNUOwotCQlsZW4gPSAyOwotCX0KKyAgICAvKiBDcmVhdGUgYW4gZW1wdHkgbGlzdC4gKi8KKyAgICBpZiAoc2VsZi0+YmluKSB7CisgICAgICAgIHNbMF0gPSBFTVBUWV9MSVNUOworICAgICAgICBsZW4gPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc1swXSA9IE1BUks7CisgICAgICAgIHNbMV0gPSBMSVNUOworICAgICAgICBsZW4gPSAyOworICAgIH0KIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIHMsIGxlbikgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgcywgbGVuKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIEdldCBsaXN0IGxlbmd0aCwgYW5kIGJvdyBvdXQgZWFybHkgaWYgZW1wdHkuICovCi0JaWYgKChsZW4gPSBQeUxpc3RfU2l6ZShhcmdzKSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogR2V0IGxpc3QgbGVuZ3RoLCBhbmQgYm93IG91dCBlYXJseSBpZiBlbXB0eS4gKi8KKyAgICBpZiAoKGxlbiA9IFB5TGlzdF9TaXplKGFyZ3MpKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIE1lbW9pemUuICovCi0JaWYgKGxlbiA9PSAwKSB7Ci0JCWlmIChwdXQoc2VsZiwgYXJncykgPj0gMCkKLQkJCXJlcyA9IDA7Ci0JCWdvdG8gZmluYWxseTsKLQl9Ci0JaWYgKHB1dDIoc2VsZiwgYXJncykgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogTWVtb2l6ZS4gKi8KKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgaWYgKHB1dChzZWxmLCBhcmdzKSA+PSAwKQorICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBpZiAocHV0MihzZWxmLCBhcmdzKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIE1hdGVyaWFsaXplIHRoZSBsaXN0IGVsZW1lbnRzLiAqLwotCWl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKGFyZ3MpOwotCWlmIChpdGVyID09IE5VTEwpCi0JCWdvdG8gZmluYWxseTsKKyAgICAvKiBNYXRlcmlhbGl6ZSB0aGUgbGlzdCBlbGVtZW50cy4gKi8KKyAgICBpdGVyID0gUHlPYmplY3RfR2V0SXRlcihhcmdzKTsKKyAgICBpZiAoaXRlciA9PSBOVUxMKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgcGlja2xpbmcgYW4gb2JqZWN0IikgPT0gMCkKLQl7Ci0JCXJlcyA9IGJhdGNoX2xpc3Qoc2VsZiwgaXRlcik7Ci0JCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCX0KLQlQeV9ERUNSRUYoaXRlcik7CisgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIHBpY2tsaW5nIGFuIG9iamVjdCIpID09IDApCisgICAgeworICAgICAgICByZXMgPSBiYXRjaF9saXN0KHNlbGYsIGl0ZXIpOworICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0ZXIpOwogCiAgIGZpbmFsbHk6Ci0JaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9sZWF2ZShzZWxmLCBhcmdzKSkKLQkJcmVzID0gLTE7CisgICAgaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9sZWF2ZShzZWxmLCBhcmdzKSkKKyAgICAgICAgcmVzID0gLTE7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIApAQCAtMTc0Niw1MjMgKzE3NDYsNTIzIEBACiBzdGF0aWMgaW50CiBiYXRjaF9kaWN0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppdGVyKQogewotCVB5T2JqZWN0ICpwID0gTlVMTDsKLQlQeU9iamVjdCAqZmlyc3RpdGVtID0gTlVMTDsKLQlpbnQgaSwgbjsKKyAgICBQeU9iamVjdCAqcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZpcnN0aXRlbSA9IE5VTEw7CisgICAgaW50IGksIG47CiAKLQlzdGF0aWMgY2hhciBzZXRpdGVtID0gU0VUSVRFTTsKLQlzdGF0aWMgY2hhciBzZXRpdGVtcyA9IFNFVElURU1TOworICAgIHN0YXRpYyBjaGFyIHNldGl0ZW0gPSBTRVRJVEVNOworICAgIHN0YXRpYyBjaGFyIHNldGl0ZW1zID0gU0VUSVRFTVM7CiAKLQlhc3NlcnQoaXRlciAhPSBOVUxMKTsKKyAgICBhc3NlcnQoaXRlciAhPSBOVUxMKTsKIAotCWlmIChzZWxmLT5wcm90byA9PSAwKSB7Ci0JCS8qIFNFVElURU1TIGlzbid0IGF2YWlsYWJsZTsgZG8gb25lIGF0IGEgdGltZS4gKi8KLQkJZm9yICg7OykgewotCQkJcCA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQkJaWYgKHAgPT0gTlVMTCkgewotCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIVB5VHVwbGVfQ2hlY2socCkgfHwgUHlUdXBsZV9TaXplKHApICE9IDIpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGljdCBpdGVtcyAiCi0JCQkJCSJpdGVyYXRvciBtdXN0IHJldHVybiAyLXR1cGxlcyIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWkgPSBzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0ocCwgMCksIDApOwotCQkJaWYgKGkgPj0gMCkKLQkJCQlpID0gc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKHAsIDEpLCAwKTsKLQkJCVB5X0RFQ1JFRihwKTsKLQkJCWlmIChpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc2V0aXRlbSwgMSkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKHNlbGYtPnByb3RvID09IDApIHsKKyAgICAgICAgLyogU0VUSVRFTVMgaXNuJ3QgYXZhaWxhYmxlOyBkbyBvbmUgYXQgYSB0aW1lLiAqLworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBwID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghUHlUdXBsZV9DaGVjayhwKSB8fCBQeVR1cGxlX1NpemUocCkgIT0gMikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJkaWN0IGl0ZW1zICIKKyAgICAgICAgICAgICAgICAgICAgIml0ZXJhdG9yIG11c3QgcmV0dXJuIDItdHVwbGVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShwLCAwKSwgMCk7CisgICAgICAgICAgICBpZiAoaSA+PSAwKQorICAgICAgICAgICAgICAgIGkgPSBzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0ocCwgMSksIDApOworICAgICAgICAgICAgUHlfREVDUkVGKHApOworICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZzZXRpdGVtLCAxKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIHByb3RvID4gMDogIHdyaXRlIGluIGJhdGNoZXMgb2YgQkFUQ0hTSVpFLiAqLwotCWRvIHsKLQkJLyogR2V0IGZpcnN0IGl0ZW0gKi8KLQkJZmlyc3RpdGVtID0gUHlJdGVyX05leHQoaXRlcik7Ci0JCWlmIChmaXJzdGl0ZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKKyAgICAvKiBwcm90byA+IDA6ICB3cml0ZSBpbiBiYXRjaGVzIG9mIEJBVENIU0laRS4gKi8KKyAgICBkbyB7CisgICAgICAgIC8qIEdldCBmaXJzdCBpdGVtICovCisgICAgICAgIGZpcnN0aXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOworICAgICAgICBpZiAoZmlyc3RpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CiAKLQkJCS8qIG5vdGhpbmcgbW9yZSB0byBhZGQgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghUHlUdXBsZV9DaGVjayhmaXJzdGl0ZW0pIHx8IFB5VHVwbGVfU2l6ZShmaXJzdGl0ZW0pICE9IDIpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJkaWN0IGl0ZW1zICIKLQkJCQkJIml0ZXJhdG9yIG11c3QgcmV0dXJuIDItdHVwbGVzIik7Ci0JCQlnb3RvIEJhdGNoRmFpbGVkOwotCQl9CisgICAgICAgICAgICAvKiBub3RoaW5nIG1vcmUgdG8gYWRkICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soZmlyc3RpdGVtKSB8fCBQeVR1cGxlX1NpemUoZmlyc3RpdGVtKSAhPSAyKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGljdCBpdGVtcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdG9yIG11c3QgcmV0dXJuIDItdHVwbGVzIik7CisgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICB9CiAKLQkJLyogVHJ5IHRvIGdldCBhIHNlY29uZCBpdGVtICovCi0JCXAgPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJaWYgKHAgPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgLyogVHJ5IHRvIGdldCBhIHNlY29uZCBpdGVtICovCisgICAgICAgIHAgPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKIAotCQkJLyogT25seSBvbmUgaXRlbSB0byB3cml0ZSAqLwotCQkJaWYgKHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShmaXJzdGl0ZW0sIDApLCAwKSA8IDApCi0JCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJCWlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oZmlyc3RpdGVtLCAxKSwgMCkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc2V0aXRlbSwgMSkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlQeV9DTEVBUihmaXJzdGl0ZW0pOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgICAgIC8qIE9ubHkgb25lIGl0ZW0gdG8gd3JpdGUgKi8KKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oZmlyc3RpdGVtLCAwKSwgMCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKGZpcnN0aXRlbSwgMSksIDApIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJnNldGl0ZW0sIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIoZmlyc3RpdGVtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJLyogTW9yZSB0aGFuIG9uZSBpdGVtIHRvIHdyaXRlICovCisgICAgICAgIC8qIE1vcmUgdGhhbiBvbmUgaXRlbSB0byB3cml0ZSAqLwogCi0JCS8qIFB1bXAgb3V0IE1BUkssIGl0ZW1zLCBTRVRJVEVNUy4gKi8KLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJk1BUkt2LCAxKSA8IDApCi0JCQlnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAvKiBQdW1wIG91dCBNQVJLLCBpdGVtcywgU0VUSVRFTVMuICovCisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZNQVJLdiwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKIAotCQlpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKGZpcnN0aXRlbSwgMCksIDApIDwgMCkKLQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCWlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oZmlyc3RpdGVtLCAxKSwgMCkgPCAwKQotCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJUHlfQ0xFQVIoZmlyc3RpdGVtKTsKLQkJbiA9IDE7CisgICAgICAgIGlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0oZmlyc3RpdGVtLCAwKSwgMCkgPCAwKQorICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgaWYgKHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShmaXJzdGl0ZW0sIDEpLCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICBQeV9DTEVBUihmaXJzdGl0ZW0pOworICAgICAgICBuID0gMTsKIAotCQkvKiBGZXRjaCBhbmQgc2F2ZSB1cCB0byBCQVRDSFNJWkUgaXRlbXMgKi8KLQkJd2hpbGUgKHApIHsKLQkJCWlmICghUHlUdXBsZV9DaGVjayhwKSB8fCBQeVR1cGxlX1NpemUocCkgIT0gMikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJkaWN0IGl0ZW1zICIKLQkJCQkJIml0ZXJhdG9yIG11c3QgcmV0dXJuIDItdHVwbGVzIik7Ci0JCQkJZ290byBCYXRjaEZhaWxlZDsKLQkJCX0KLQkJCWlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0ocCwgMCksIDApIDwgMCkKLQkJCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkJaWYgKHNhdmUoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShwLCAxKSwgMCkgPCAwKQotCQkJCWdvdG8gQmF0Y2hGYWlsZWQ7Ci0JCQlQeV9DTEVBUihwKTsKLQkJCW4gKz0gMTsKKyAgICAgICAgLyogRmV0Y2ggYW5kIHNhdmUgdXAgdG8gQkFUQ0hTSVpFIGl0ZW1zICovCisgICAgICAgIHdoaWxlIChwKSB7CisgICAgICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2socCkgfHwgUHlUdXBsZV9TaXplKHApICE9IDIpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZGljdCBpdGVtcyAiCisgICAgICAgICAgICAgICAgICAgICJpdGVyYXRvciBtdXN0IHJldHVybiAyLXR1cGxlcyIpOworICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKHAsIDApLCAwKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIFB5VHVwbGVfR0VUX0lURU0ocCwgMSksIDApIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEJhdGNoRmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIocCk7CisgICAgICAgICAgICBuICs9IDE7CiAKLQkJCWlmIChuID09IEJBVENIU0laRSkKLQkJCQlicmVhazsKKyAgICAgICAgICAgIGlmIChuID09IEJBVENIU0laRSkKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJcCA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQkJaWYgKHAgPT0gTlVMTCkgewotCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQlnb3RvIEJhdGNoRmFpbGVkOwotCQkJCWJyZWFrOwotCQkJfQotCQl9CisgICAgICAgICAgICBwID0gUHlJdGVyX05leHQoaXRlcik7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc2V0aXRlbXMsIDEpIDwgMCkKLQkJCWdvdG8gQmF0Y2hGYWlsZWQ7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZzZXRpdGVtcywgMSkgPCAwKQorICAgICAgICAgICAgZ290byBCYXRjaEZhaWxlZDsKIAotCX0gd2hpbGUgKG4gPT0gQkFUQ0hTSVpFKTsKLQlyZXR1cm4gMDsKKyAgICB9IHdoaWxlIChuID09IEJBVENIU0laRSk7CisgICAgcmV0dXJuIDA7CiAKIEJhdGNoRmFpbGVkOgotCVB5X1hERUNSRUYoZmlyc3RpdGVtKTsKLQlQeV9YREVDUkVGKHApOwotCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKGZpcnN0aXRlbSk7CisgICAgUHlfWERFQ1JFRihwKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbnQKIHNhdmVfZGljdChQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcmVzID0gLTE7Ci0JY2hhciBzWzNdOwotCWludCBsZW47Ci0JUHlPYmplY3QgKml0ZXI7CisgICAgaW50IHJlcyA9IC0xOworICAgIGNoYXIgc1szXTsKKyAgICBpbnQgbGVuOworICAgIFB5T2JqZWN0ICppdGVyOwogCi0JaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9lbnRlcihzZWxmLCBhcmdzKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT5mYXN0ICYmICFmYXN0X3NhdmVfZW50ZXIoc2VsZiwgYXJncykpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIENyZWF0ZSBhbiBlbXB0eSBkaWN0LiAqLwotCWlmIChzZWxmLT5iaW4pIHsKLQkJc1swXSA9IEVNUFRZX0RJQ1Q7Ci0JCWxlbiA9IDE7Ci0JfQotCWVsc2UgewotCQlzWzBdID0gTUFSSzsKLQkJc1sxXSA9IERJQ1Q7Ci0JCWxlbiA9IDI7Ci0JfQorICAgIC8qIENyZWF0ZSBhbiBlbXB0eSBkaWN0LiAqLworICAgIGlmIChzZWxmLT5iaW4pIHsKKyAgICAgICAgc1swXSA9IEVNUFRZX0RJQ1Q7CisgICAgICAgIGxlbiA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzWzBdID0gTUFSSzsKKyAgICAgICAgc1sxXSA9IERJQ1Q7CisgICAgICAgIGxlbiA9IDI7CisgICAgfQogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgcywgbGVuKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBzLCBsZW4pIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JLyogR2V0IGRpY3Qgc2l6ZSwgYW5kIGJvdyBvdXQgZWFybHkgaWYgZW1wdHkuICovCi0JaWYgKChsZW4gPSBQeURpY3RfU2l6ZShhcmdzKSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgLyogR2V0IGRpY3Qgc2l6ZSwgYW5kIGJvdyBvdXQgZWFybHkgaWYgZW1wdHkuICovCisgICAgaWYgKChsZW4gPSBQeURpY3RfU2l6ZShhcmdzKSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAobGVuID09IDApIHsKLQkJaWYgKHB1dChzZWxmLCBhcmdzKSA+PSAwKQotCQkJcmVzID0gMDsKLQkJZ290byBmaW5hbGx5OwotCX0KLQlpZiAocHV0MihzZWxmLCBhcmdzKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgaWYgKHB1dChzZWxmLCBhcmdzKSA+PSAwKQorICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBpZiAocHV0MihzZWxmLCBhcmdzKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCS8qIE1hdGVyaWFsaXplIHRoZSBkaWN0IGl0ZW1zLiAqLwotCWl0ZXIgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGFyZ3MsICJpdGVyaXRlbXMiLCAiKCkiKTsKLQlpZiAoaXRlciA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7Ci0JaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIHBpY2tsaW5nIGFuIG9iamVjdCIpID09IDApCi0JewotCQlyZXMgPSBiYXRjaF9kaWN0KHNlbGYsIGl0ZXIpOwotCQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQl9Ci0JUHlfREVDUkVGKGl0ZXIpOworICAgIC8qIE1hdGVyaWFsaXplIHRoZSBkaWN0IGl0ZW1zLiAqLworICAgIGl0ZXIgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGFyZ3MsICJpdGVyaXRlbXMiLCAiKCkiKTsKKyAgICBpZiAoaXRlciA9PSBOVUxMKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIHBpY2tsaW5nIGFuIG9iamVjdCIpID09IDApCisgICAgeworICAgICAgICByZXMgPSBiYXRjaF9kaWN0KHNlbGYsIGl0ZXIpOworICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0ZXIpOwogCiAgIGZpbmFsbHk6Ci0JaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9sZWF2ZShzZWxmLCBhcmdzKSkKLQkJcmVzID0gLTE7CisgICAgaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9sZWF2ZShzZWxmLCBhcmdzKSkKKyAgICAgICAgcmVzID0gLTE7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIAogc3RhdGljIGludAogc2F2ZV9pbnN0KFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpjbGFzcyA9IDAsICptb2R1bGUgPSAwLCAqbmFtZSA9IDAsICpzdGF0ZSA9IDAsCi0JCSpnZXRpbml0YXJnc19mdW5jID0gMCwgKmdldHN0YXRlX2Z1bmMgPSAwLCAqY2xhc3NfYXJncyA9IDA7Ci0JY2hhciAqbW9kdWxlX3N0ciwgKm5hbWVfc3RyOwotCWludCBtb2R1bGVfc2l6ZSwgbmFtZV9zaXplLCByZXMgPSAtMTsKKyAgICBQeU9iamVjdCAqY2xhc3MgPSAwLCAqbW9kdWxlID0gMCwgKm5hbWUgPSAwLCAqc3RhdGUgPSAwLAorICAgICAgICAqZ2V0aW5pdGFyZ3NfZnVuYyA9IDAsICpnZXRzdGF0ZV9mdW5jID0gMCwgKmNsYXNzX2FyZ3MgPSAwOworICAgIGNoYXIgKm1vZHVsZV9zdHIsICpuYW1lX3N0cjsKKyAgICBpbnQgbW9kdWxlX3NpemUsIG5hbWVfc2l6ZSwgcmVzID0gLTE7CiAKLQlzdGF0aWMgY2hhciBpbnN0ID0gSU5TVCwgb2JqID0gT0JKLCBidWlsZCA9IEJVSUxEOworICAgIHN0YXRpYyBjaGFyIGluc3QgPSBJTlNULCBvYmogPSBPQkosIGJ1aWxkID0gQlVJTEQ7CiAKLQlpZiAoc2VsZi0+ZmFzdCAmJiAhZmFzdF9zYXZlX2VudGVyKHNlbGYsIGFyZ3MpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9lbnRlcihzZWxmLCBhcmdzKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJk1BUkt2LCAxKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmTUFSS3YsIDEpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKCEoIGNsYXNzID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX2NsYXNzX19fc3RyKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fY2xhc3NfX19zdHIpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHNlbGYtPmJpbikgewotCQlpZiAoc2F2ZShzZWxmLCBjbGFzcywgMCkgPCAwKQotCQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAoc2VsZi0+YmluKSB7CisgICAgICAgIGlmIChzYXZlKHNlbGYsIGNsYXNzLCAwKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JaWYgKChnZXRpbml0YXJnc19mdW5jID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX2dldGluaXRhcmdzX19fc3RyKSkpIHsKLQkJUHlPYmplY3QgKmVsZW1lbnQgPSAwOwotCQlpbnQgaSwgbGVuOworICAgIGlmICgoZ2V0aW5pdGFyZ3NfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19nZXRpbml0YXJnc19fX3N0cikpKSB7CisgICAgICAgIFB5T2JqZWN0ICplbGVtZW50ID0gMDsKKyAgICAgICAgaW50IGksIGxlbjsKIAotCQlpZiAoISggY2xhc3NfYXJncyA9Ci0JCSAgICAgICBQeU9iamVjdF9DYWxsKGdldGluaXRhcmdzX2Z1bmMsIGVtcHR5X3R1cGxlLCBOVUxMKSkpCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmICghKCBjbGFzc19hcmdzID0KKyAgICAgICAgICAgICAgIFB5T2JqZWN0X0NhbGwoZ2V0aW5pdGFyZ3NfZnVuYywgZW1wdHlfdHVwbGUsIE5VTEwpKSkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlpZiAoKGxlbiA9IFB5T2JqZWN0X1NpemUoY2xhc3NfYXJncykpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKChsZW4gPSBQeU9iamVjdF9TaXplKGNsYXNzX2FyZ3MpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoISggZWxlbWVudCA9IFB5U2VxdWVuY2VfR2V0SXRlbShjbGFzc19hcmdzLCBpKSkpCi0JCQkJZ290byBmaW5hbGx5OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghKCBlbGVtZW50ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGNsYXNzX2FyZ3MsIGkpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCWlmIChzYXZlKHNlbGYsIGVsZW1lbnQsIDApIDwgMCkgewotCQkJCVB5X0RFQ1JFRihlbGVtZW50KTsKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQl9CisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBlbGVtZW50LCAwKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbWVudCk7CisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgfQogCi0JCQlQeV9ERUNSRUYoZWxlbWVudCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UKLQkJCWdvdG8gZmluYWxseTsKLQl9CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbWVudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlpZiAoIXNlbGYtPmJpbikgewotCQlpZiAoISggbmFtZSA9ICgoUHlDbGFzc09iamVjdCAqKWNsYXNzKS0+Y2xfbmFtZSApKSAgewotCQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsICJjbGFzcyBoYXMgbm8gbmFtZSIpOwotCQkJZ290byBmaW5hbGx5OwotCQl9CisgICAgaWYgKCFzZWxmLT5iaW4pIHsKKyAgICAgICAgaWYgKCEoIG5hbWUgPSAoKFB5Q2xhc3NPYmplY3QgKiljbGFzcyktPmNsX25hbWUgKSkgIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLCAiY2xhc3MgaGFzIG5vIG5hbWUiKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQogCi0JCWlmICghKCBtb2R1bGUgPSB3aGljaG1vZHVsZShjbGFzcywgbmFtZSkpKQotCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoISggbW9kdWxlID0gd2hpY2htb2R1bGUoY2xhc3MsIG5hbWUpKSkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAogCi0JCWlmICgobW9kdWxlX3NpemUgPSBQeVN0cmluZ19TaXplKG1vZHVsZSkpIDwgMCB8fAotCQkgICAgKG5hbWVfc2l6ZSA9IFB5U3RyaW5nX1NpemUobmFtZSkpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKChtb2R1bGVfc2l6ZSA9IFB5U3RyaW5nX1NpemUobW9kdWxlKSkgPCAwIHx8CisgICAgICAgICAgICAobmFtZV9zaXplID0gUHlTdHJpbmdfU2l6ZShuYW1lKSkgPCAwKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCW1vZHVsZV9zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopbW9kdWxlKTsKLQkJbmFtZV9zdHIgICA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKiluYW1lKTsKKyAgICAgICAgbW9kdWxlX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKiltb2R1bGUpOworICAgICAgICBuYW1lX3N0ciAgID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKW5hbWUpOwogCi0JCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZpbnN0LCAxKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZpbnN0LCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgbW9kdWxlX3N0ciwgbW9kdWxlX3NpemUpIDwgMCkKLQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgbW9kdWxlX3N0ciwgbW9kdWxlX3NpemUpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBuYW1lX3N0ciwgbmFtZV9zaXplKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIG5hbWVfc3RyLCBuYW1lX3NpemUpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWVsc2UgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJm9iaiwgMSkgPCAwKSB7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmb2JqLCAxKSA8IDApIHsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmICgoZ2V0c3RhdGVfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19nZXRzdGF0ZV9fX3N0cikpKSB7Ci0JCXN0YXRlID0gUHlPYmplY3RfQ2FsbChnZXRzdGF0ZV9mdW5jLCBlbXB0eV90dXBsZSwgTlVMTCk7Ci0JCWlmICghc3RhdGUpCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWVsc2UgewotCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKChnZXRzdGF0ZV9mdW5jID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX2dldHN0YXRlX19fc3RyKSkpIHsKKyAgICAgICAgc3RhdGUgPSBQeU9iamVjdF9DYWxsKGdldHN0YXRlX2Z1bmMsIGVtcHR5X3R1cGxlLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdGF0ZSkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlpZiAoISggc3RhdGUgPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fZGljdF9fX3N0cikpKSAgewotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQllbHNlCi0JCQkJZ290byBmaW5hbGx5OwotCQkJcmVzID0gMDsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICAgICAgaWYgKCEoIHN0YXRlID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX2RpY3RfX19zdHIpKSkgIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIHJlcyA9IDA7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoIVB5RGljdF9DaGVjayhzdGF0ZSkpIHsKLQkJaWYgKHB1dDIoc2VsZiwgYXJncykgPCAwKQotCQkJZ290byBmaW5hbGx5OwotCX0KLQllbHNlIHsKLQkJaWYgKHB1dChzZWxmLCBhcmdzKSA8IDApCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmICghUHlEaWN0X0NoZWNrKHN0YXRlKSkgeworICAgICAgICBpZiAocHV0MihzZWxmLCBhcmdzKSA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAocHV0KHNlbGYsIGFyZ3MpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlpZiAoc2F2ZShzZWxmLCBzdGF0ZSwgMCkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNhdmUoc2VsZiwgc3RhdGUsIDApIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmJ1aWxkLCAxKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYnVpbGQsIDEpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JcmVzID0gMDsKKyAgICByZXMgPSAwOwogCiAgIGZpbmFsbHk6Ci0JaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9sZWF2ZShzZWxmLCBhcmdzKSkKLQkJcmVzID0gLTE7CisgICAgaWYgKHNlbGYtPmZhc3QgJiYgIWZhc3Rfc2F2ZV9sZWF2ZShzZWxmLCBhcmdzKSkKKyAgICAgICAgcmVzID0gLTE7CiAKLQlQeV9YREVDUkVGKG1vZHVsZSk7Ci0JUHlfWERFQ1JFRihjbGFzcyk7Ci0JUHlfWERFQ1JFRihzdGF0ZSk7Ci0JUHlfWERFQ1JFRihnZXRpbml0YXJnc19mdW5jKTsKLQlQeV9YREVDUkVGKGdldHN0YXRlX2Z1bmMpOwotCVB5X1hERUNSRUYoY2xhc3NfYXJncyk7CisgICAgUHlfWERFQ1JFRihtb2R1bGUpOworICAgIFB5X1hERUNSRUYoY2xhc3MpOworICAgIFB5X1hERUNSRUYoc3RhdGUpOworICAgIFB5X1hERUNSRUYoZ2V0aW5pdGFyZ3NfZnVuYyk7CisgICAgUHlfWERFQ1JFRihnZXRzdGF0ZV9mdW5jKTsKKyAgICBQeV9YREVDUkVGKGNsYXNzX2FyZ3MpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKIHN0YXRpYyBpbnQKIHNhdmVfZ2xvYmFsKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeU9iamVjdCAqZ2xvYmFsX25hbWUgPSAwLCAqbW9kdWxlID0gMCwgKm1vZCA9IDAsICprbGFzcyA9IDA7Ci0JY2hhciAqbmFtZV9zdHIsICptb2R1bGVfc3RyOwotCWludCBtb2R1bGVfc2l6ZSwgbmFtZV9zaXplLCByZXMgPSAtMTsKKyAgICBQeU9iamVjdCAqZ2xvYmFsX25hbWUgPSAwLCAqbW9kdWxlID0gMCwgKm1vZCA9IDAsICprbGFzcyA9IDA7CisgICAgY2hhciAqbmFtZV9zdHIsICptb2R1bGVfc3RyOworICAgIGludCBtb2R1bGVfc2l6ZSwgbmFtZV9zaXplLCByZXMgPSAtMTsKIAotCXN0YXRpYyBjaGFyIGdsb2JhbCA9IEdMT0JBTDsKKyAgICBzdGF0aWMgY2hhciBnbG9iYWwgPSBHTE9CQUw7CiAKLQlpZiAobmFtZSkgewotCQlnbG9iYWxfbmFtZSA9IG5hbWU7Ci0JCVB5X0lOQ1JFRihnbG9iYWxfbmFtZSk7Ci0JfQotCWVsc2UgewotCQlpZiAoISggZ2xvYmFsX25hbWUgPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fbmFtZV9fX3N0cikpKQotCQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAobmFtZSkgeworICAgICAgICBnbG9iYWxfbmFtZSA9IG5hbWU7CisgICAgICAgIFB5X0lOQ1JFRihnbG9iYWxfbmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoISggZ2xvYmFsX25hbWUgPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fbmFtZV9fX3N0cikpKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmICghKCBtb2R1bGUgPSB3aGljaG1vZHVsZShhcmdzLCBnbG9iYWxfbmFtZSkpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIG1vZHVsZSA9IHdoaWNobW9kdWxlKGFyZ3MsIGdsb2JhbF9uYW1lKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmICgobW9kdWxlX3NpemUgPSBQeVN0cmluZ19TaXplKG1vZHVsZSkpIDwgMCB8fAotCSAgICAobmFtZV9zaXplID0gUHlTdHJpbmdfU2l6ZShnbG9iYWxfbmFtZSkpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICgobW9kdWxlX3NpemUgPSBQeVN0cmluZ19TaXplKG1vZHVsZSkpIDwgMCB8fAorICAgICAgICAobmFtZV9zaXplID0gUHlTdHJpbmdfU2l6ZShnbG9iYWxfbmFtZSkpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JbW9kdWxlX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKiltb2R1bGUpOwotCW5hbWVfc3RyICAgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopZ2xvYmFsX25hbWUpOworICAgIG1vZHVsZV9zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopbW9kdWxlKTsKKyAgICBuYW1lX3N0ciAgID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKWdsb2JhbF9uYW1lKTsKIAotCS8qIFhYWCBUaGlzIGNhbiBiZSBkb2luZyBhIHJlbGF0aXZlIGltcG9ydC4gIENsZWFybHkgaXQgc2hvdWxkbid0LAotCSAgIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIHN0b3AgaXQuIDotKCAqLwotCW1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZShtb2R1bGVfc3RyKTsKLQlpZiAobW9kID09IE5VTEwpIHsKLQkJY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwKLQkJCQkgICJDYW4ndCBwaWNrbGUgJXM6IGltcG9ydCBvZiBtb2R1bGUgJXMgIgotCQkJCSAgImZhaWxlZCIsCi0JCQkJICAiT1MiLCBhcmdzLCBtb2R1bGUpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWtsYXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsIG5hbWVfc3RyKTsKLQlpZiAoa2xhc3MgPT0gTlVMTCkgewotCQljUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLAotCQkJCSAgIkNhbid0IHBpY2tsZSAlczogYXR0cmlidXRlIGxvb2t1cCAlcy4lcyAiCi0JCQkJICAiZmFpbGVkIiwKLQkJCQkgICJPU1MiLCBhcmdzLCBtb2R1bGUsIGdsb2JhbF9uYW1lKTsKLQkJZ290byBmaW5hbGx5OwotCX0KLQlpZiAoa2xhc3MgIT0gYXJncykgewotCQlQeV9ERUNSRUYoa2xhc3MpOwotCQljUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLAotCQkJCSAgIkNhbid0IHBpY2tsZSAlczogaXQncyBub3QgdGhlIHNhbWUgb2JqZWN0ICIKLQkJCQkgIAkiYXMgJXMuJXMiLAotCQkJCSAgIk9TUyIsIGFyZ3MsIG1vZHVsZSwgZ2xvYmFsX25hbWUpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQotCVB5X0RFQ1JFRihrbGFzcyk7CisgICAgLyogWFhYIFRoaXMgY2FuIGJlIGRvaW5nIGEgcmVsYXRpdmUgaW1wb3J0LiAgQ2xlYXJseSBpdCBzaG91bGRuJ3QsCisgICAgICAgYnV0IEkgZG9uJ3Qga25vdyBob3cgdG8gc3RvcCBpdC4gOi0oICovCisgICAgbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKG1vZHVsZV9zdHIpOworICAgIGlmIChtb2QgPT0gTlVMTCkgeworICAgICAgICBjUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgcGlja2xlICVzOiBpbXBvcnQgb2YgbW9kdWxlICVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJPUyIsIGFyZ3MsIG1vZHVsZSk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAga2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgbmFtZV9zdHIpOworICAgIGlmIChrbGFzcyA9PSBOVUxMKSB7CisgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBwaWNrbGUgJXM6IGF0dHJpYnV0ZSBsb29rdXAgJXMuJXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk9TUyIsIGFyZ3MsIG1vZHVsZSwgZ2xvYmFsX25hbWUpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIGlmIChrbGFzcyAhPSBhcmdzKSB7CisgICAgICAgIFB5X0RFQ1JFRihrbGFzcyk7CisgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBwaWNrbGUgJXM6IGl0J3Mgbm90IHRoZSBzYW1lIG9iamVjdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyAlcy4lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJPU1MiLCBhcmdzLCBtb2R1bGUsIGdsb2JhbF9uYW1lKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBQeV9ERUNSRUYoa2xhc3MpOwogCi0JaWYgKHNlbGYtPnByb3RvID49IDIpIHsKLQkJLyogU2VlIHdoZXRoZXIgdGhpcyBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5LCBhbmQgaWYKLQkJICogc28gZ2VuZXJhdGUgYW4gRVhUIG9wY29kZS4KLQkJICovCi0JCVB5T2JqZWN0ICpweV9jb2RlOwkvKiBleHRlbnNpb24gY29kZSBhcyBQeXRob24gb2JqZWN0ICovCi0JCWxvbmcgY29kZTsJCS8qIGV4dGVuc2lvbiBjb2RlIGFzIEMgdmFsdWUgKi8KLQkJY2hhciBjX3N0cls1XTsKLQkJaW50IG47CisgICAgaWYgKHNlbGYtPnByb3RvID49IDIpIHsKKyAgICAgICAgLyogU2VlIHdoZXRoZXIgdGhpcyBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5LCBhbmQgaWYKKyAgICAgICAgICogc28gZ2VuZXJhdGUgYW4gRVhUIG9wY29kZS4KKyAgICAgICAgICovCisgICAgICAgIFB5T2JqZWN0ICpweV9jb2RlOyAgICAgICAgICAgICAgLyogZXh0ZW5zaW9uIGNvZGUgYXMgUHl0aG9uIG9iamVjdCAqLworICAgICAgICBsb25nIGNvZGU7ICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dGVuc2lvbiBjb2RlIGFzIEMgdmFsdWUgKi8KKyAgICAgICAgY2hhciBjX3N0cls1XTsKKyAgICAgICAgaW50IG47CiAKLQkJUHlUdXBsZV9TRVRfSVRFTSh0d29fdHVwbGUsIDAsIG1vZHVsZSk7Ci0JCVB5VHVwbGVfU0VUX0lURU0odHdvX3R1cGxlLCAxLCBnbG9iYWxfbmFtZSk7Ci0JCXB5X2NvZGUgPSBQeURpY3RfR2V0SXRlbShleHRlbnNpb25fcmVnaXN0cnksIHR3b190dXBsZSk7Ci0JCWlmIChweV9jb2RlID09IE5VTEwpCi0JCQlnb3RvIGdlbl9nbG9iYWw7CS8qIG5vdCByZWdpc3RlcmVkICovCisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHdvX3R1cGxlLCAwLCBtb2R1bGUpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR3b190dXBsZSwgMSwgZ2xvYmFsX25hbWUpOworICAgICAgICBweV9jb2RlID0gUHlEaWN0X0dldEl0ZW0oZXh0ZW5zaW9uX3JlZ2lzdHJ5LCB0d29fdHVwbGUpOworICAgICAgICBpZiAocHlfY29kZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBnZW5fZ2xvYmFsOyAgICAgICAgICAgICAgICAgICAgLyogbm90IHJlZ2lzdGVyZWQgKi8KIAotCQkvKiBWZXJpZnkgcHlfY29kZSBoYXMgdGhlIHJpZ2h0IHR5cGUgYW5kIHZhbHVlLiAqLwotCQlpZiAoIVB5SW50X0NoZWNrKHB5X2NvZGUpKSB7Ci0JCQljUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiQ2FuJ3QgcGlja2xlICVzOiAiCi0JCQkJImV4dGVuc2lvbiBjb2RlICVzIGlzbid0IGFuIGludGVnZXIiLAotCQkJCSJPTyIsIGFyZ3MsIHB5X2NvZGUpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWNvZGUgPSBQeUludF9BU19MT05HKHB5X2NvZGUpOwotCQlpZiAoY29kZSA8PSAwIHx8ICBjb2RlID4gMHg3ZmZmZmZmZkwpIHsKLQkJCWNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJDYW4ndCBwaWNrbGUgJXM6ICIKLQkJCQkiZXh0ZW5zaW9uIGNvZGUgJWxkIGlzIG91dCBvZiByYW5nZSIsCi0JCQkJIk9sIiwgYXJncywgY29kZSk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KKyAgICAgICAgLyogVmVyaWZ5IHB5X2NvZGUgaGFzIHRoZSByaWdodCB0eXBlIGFuZCB2YWx1ZS4gKi8KKyAgICAgICAgaWYgKCFQeUludF9DaGVjayhweV9jb2RlKSkgeworICAgICAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIkNhbid0IHBpY2tsZSAlczogIgorICAgICAgICAgICAgICAgICJleHRlbnNpb24gY29kZSAlcyBpc24ndCBhbiBpbnRlZ2VyIiwKKyAgICAgICAgICAgICAgICAiT08iLCBhcmdzLCBweV9jb2RlKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBjb2RlID0gUHlJbnRfQVNfTE9ORyhweV9jb2RlKTsKKyAgICAgICAgaWYgKGNvZGUgPD0gMCB8fCAgY29kZSA+IDB4N2ZmZmZmZmZMKSB7CisgICAgICAgICAgICBjUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiQ2FuJ3QgcGlja2xlICVzOiAiCisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiBjb2RlICVsZCBpcyBvdXQgb2YgcmFuZ2UiLAorICAgICAgICAgICAgICAgICJPbCIsIGFyZ3MsIGNvZGUpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CiAKLQkJLyogR2VuZXJhdGUgYW4gRVhUIG9wY29kZS4gKi8KLQkJaWYgKGNvZGUgPD0gMHhmZikgewotCQkJY19zdHJbMF0gPSBFWFQxOwotCQkJY19zdHJbMV0gPSAoY2hhciljb2RlOwotCQkJbiA9IDI7Ci0JCX0KLQkJZWxzZSBpZiAoY29kZSA8PSAweGZmZmYpIHsKLQkJCWNfc3RyWzBdID0gRVhUMjsKLQkJCWNfc3RyWzFdID0gKGNoYXIpKGNvZGUgJiAweGZmKTsKLQkJCWNfc3RyWzJdID0gKGNoYXIpKChjb2RlID4+IDgpICYgMHhmZik7Ci0JCQluID0gMzsKLQkJfQotCQllbHNlIHsKLQkJCWNfc3RyWzBdID0gRVhUNDsKLQkJCWNfc3RyWzFdID0gKGNoYXIpKGNvZGUgJiAweGZmKTsKLQkJCWNfc3RyWzJdID0gKGNoYXIpKChjb2RlID4+IDgpICYgMHhmZik7Ci0JCQljX3N0clszXSA9IChjaGFyKSgoY29kZSA+PiAxNikgJiAweGZmKTsKLQkJCWNfc3RyWzRdID0gKGNoYXIpKChjb2RlID4+IDI0KSAmIDB4ZmYpOwotCQkJbiA9IDU7Ci0JCX0KKyAgICAgICAgLyogR2VuZXJhdGUgYW4gRVhUIG9wY29kZS4gKi8KKyAgICAgICAgaWYgKGNvZGUgPD0gMHhmZikgeworICAgICAgICAgICAgY19zdHJbMF0gPSBFWFQxOworICAgICAgICAgICAgY19zdHJbMV0gPSAoY2hhciljb2RlOworICAgICAgICAgICAgbiA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY29kZSA8PSAweGZmZmYpIHsKKyAgICAgICAgICAgIGNfc3RyWzBdID0gRVhUMjsKKyAgICAgICAgICAgIGNfc3RyWzFdID0gKGNoYXIpKGNvZGUgJiAweGZmKTsKKyAgICAgICAgICAgIGNfc3RyWzJdID0gKGNoYXIpKChjb2RlID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBuID0gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNfc3RyWzBdID0gRVhUNDsKKyAgICAgICAgICAgIGNfc3RyWzFdID0gKGNoYXIpKGNvZGUgJiAweGZmKTsKKyAgICAgICAgICAgIGNfc3RyWzJdID0gKGNoYXIpKChjb2RlID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBjX3N0clszXSA9IChjaGFyKSgoY29kZSA+PiAxNikgJiAweGZmKTsKKyAgICAgICAgICAgIGNfc3RyWzRdID0gKGNoYXIpKChjb2RlID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgbiA9IDU7CisgICAgICAgIH0KIAotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBjX3N0ciwgbikgPj0gMCkKLQkJCXJlcyA9IDA7Ci0JCWdvdG8gZmluYWxseTsJLyogYW5kIGRvbid0IG1lbW9pemUgKi8KLQl9CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIGNfc3RyLCBuKSA+PSAwKQorICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgZ290byBmaW5hbGx5OyAgICAgICAgICAgLyogYW5kIGRvbid0IG1lbW9pemUgKi8KKyAgICB9CiAKICAgZ2VuX2dsb2JhbDoKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmZ2xvYmFsLCAxKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmZ2xvYmFsLCAxKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIG1vZHVsZV9zdHIsIG1vZHVsZV9zaXplKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBtb2R1bGVfc3RyLCBtb2R1bGVfc2l6ZSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIG5hbWVfc3RyLCBuYW1lX3NpemUpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsIG5hbWVfc3RyLCBuYW1lX3NpemUpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgIlxuIiwgMSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAocHV0KHNlbGYsIGFyZ3MpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChwdXQoc2VsZiwgYXJncykgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlyZXMgPSAwOworICAgIHJlcyA9IDA7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKG1vZHVsZSk7Ci0JUHlfWERFQ1JFRihnbG9iYWxfbmFtZSk7Ci0JUHlfWERFQ1JFRihtb2QpOworICAgIFB5X1hERUNSRUYobW9kdWxlKTsKKyAgICBQeV9YREVDUkVGKGdsb2JhbF9uYW1lKTsKKyAgICBQeV9YREVDUkVGKG1vZCk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIHNhdmVfcGVycyhQaWNrbGVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmYpCiB7Ci0JUHlPYmplY3QgKnBpZCA9IDA7Ci0JaW50IHNpemUsIHJlcyA9IC0xOworICAgIFB5T2JqZWN0ICpwaWQgPSAwOworICAgIGludCBzaXplLCByZXMgPSAtMTsKIAotCXN0YXRpYyBjaGFyIHBlcnNpZCA9IFBFUlNJRCwgYmlucGVyc2lkID0gQklOUEVSU0lEOworICAgIHN0YXRpYyBjaGFyIHBlcnNpZCA9IFBFUlNJRCwgYmlucGVyc2lkID0gQklOUEVSU0lEOwogCi0JUHlfSU5DUkVGKGFyZ3MpOwotCUFSR19UVVAoc2VsZiwgYXJncyk7Ci0JaWYgKHNlbGYtPmFyZykgewotCQlwaWQgPSBQeU9iamVjdF9DYWxsKGYsIHNlbGYtPmFyZywgTlVMTCk7Ci0JCUZSRUVfQVJHX1RVUChzZWxmKTsKLQl9Ci0JaWYgKCEgcGlkKSByZXR1cm4gLTE7CisgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgIEFSR19UVVAoc2VsZiwgYXJncyk7CisgICAgaWYgKHNlbGYtPmFyZykgeworICAgICAgICBwaWQgPSBQeU9iamVjdF9DYWxsKGYsIHNlbGYtPmFyZywgTlVMTCk7CisgICAgICAgIEZSRUVfQVJHX1RVUChzZWxmKTsKKyAgICB9CisgICAgaWYgKCEgcGlkKSByZXR1cm4gLTE7CiAKLQlpZiAocGlkICE9IFB5X05vbmUpIHsKLQkJaWYgKCFzZWxmLT5iaW4pIHsKLQkJCWlmICghUHlTdHJpbmdfQ2hlY2socGlkKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLAotCQkJCQkJInBlcnNpc3RlbnQgaWQgbXVzdCBiZSBzdHJpbmciKTsKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQl9CisgICAgaWYgKHBpZCAhPSBQeV9Ob25lKSB7CisgICAgICAgIGlmICghc2VsZi0+YmluKSB7CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHBpZCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcnNpc3RlbnQgaWQgbXVzdCBiZSBzdHJpbmciKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZwZXJzaWQsIDEpIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmcGVyc2lkLCAxKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQlpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKHBpZCkpIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICBpZiAoKHNpemUgPSBQeVN0cmluZ19TaXplKHBpZCkpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsCi0JCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAotCQkJCQkgICAgIAkoUHlTdHJpbmdPYmplY3QgKilwaWQpLAotCQkJCQkgICAgIHNpemUpIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5U3RyaW5nT2JqZWN0ICopcGlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICJcbiIsIDEpIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAiXG4iLCAxKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQlyZXMgPSAxOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWVsc2UgaWYgKHNhdmUoc2VsZiwgcGlkLCAxKSA+PSAwKSB7Ci0JCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYmlucGVyc2lkLCAxKSA8IDApCi0JCQkJcmVzID0gLTE7Ci0JCQllbHNlCi0JCQkJcmVzID0gMTsKLQkJfQorICAgICAgICAgICAgcmVzID0gMTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzYXZlKHNlbGYsIHBpZCwgMSkgPj0gMCkgeworICAgICAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmJpbnBlcnNpZCwgMSkgPCAwKQorICAgICAgICAgICAgICAgIHJlcyA9IC0xOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlcyA9IDE7CisgICAgICAgIH0KIAotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JcmVzID0gMDsKKyAgICByZXMgPSAwOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihwaWQpOworICAgIFB5X1hERUNSRUYocGlkKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogV2UncmUgc2F2aW5nIG9iLCBhbmQgYXJncyBpcyB0aGUgMi10aHJ1LTUgdHVwbGUgcmV0dXJuZWQgYnkgdGhlCkBAIC0yMjcxLDYyMSArMjI3MSw2MjEgQEAKIHN0YXRpYyBpbnQKIHNhdmVfcmVkdWNlKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqZm4sIFB5T2JqZWN0ICpvYikKIHsKLQlQeU9iamVjdCAqY2FsbGFibGU7Ci0JUHlPYmplY3QgKmFyZ3R1cDsKLQlQeU9iamVjdCAqc3RhdGUgPSBOVUxMOwotCVB5T2JqZWN0ICpsaXN0aXRlbXMgPSBQeV9Ob25lOwotCVB5T2JqZWN0ICpkaWN0aXRlbXMgPSBQeV9Ob25lOwotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeU9iamVjdCAqY2FsbGFibGU7CisgICAgUHlPYmplY3QgKmFyZ3R1cDsKKyAgICBQeU9iamVjdCAqc3RhdGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsaXN0aXRlbXMgPSBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpkaWN0aXRlbXMgPSBQeV9Ob25lOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotCWludCB1c2VfbmV3b2JqID0gc2VsZi0+cHJvdG8gPj0gMjsKKyAgICBpbnQgdXNlX25ld29iaiA9IHNlbGYtPnByb3RvID49IDI7CiAKLQlzdGF0aWMgY2hhciByZWR1Y2UgPSBSRURVQ0U7Ci0Jc3RhdGljIGNoYXIgYnVpbGQgPSBCVUlMRDsKLQlzdGF0aWMgY2hhciBuZXdvYmogPSBORVdPQko7CisgICAgc3RhdGljIGNoYXIgcmVkdWNlID0gUkVEVUNFOworICAgIHN0YXRpYyBjaGFyIGJ1aWxkID0gQlVJTEQ7CisgICAgc3RhdGljIGNoYXIgbmV3b2JqID0gTkVXT0JKOwogCi0Jc2l6ZSA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKLQlpZiAoc2l6ZSA8IDIgfHwgc2l6ZSA+IDUpIHsKLQkJY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgInR1cGxlIHJldHVybmVkIGJ5ICIKLQkJCSIlcyBtdXN0IGNvbnRhaW4gMiB0aHJvdWdoIDUgZWxlbWVudHMiLAotCQkJIk8iLCBmbik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgc2l6ZSA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKKyAgICBpZiAoc2l6ZSA8IDIgfHwgc2l6ZSA+IDUpIHsKKyAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgInR1cGxlIHJldHVybmVkIGJ5ICIKKyAgICAgICAgICAgICIlcyBtdXN0IGNvbnRhaW4gMiB0aHJvdWdoIDUgZWxlbWVudHMiLAorICAgICAgICAgICAgIk8iLCBmbik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2F2ZV9yZWR1Y2UiLCAyLCA1LAotCQkJCSZjYWxsYWJsZSwKLQkJCQkmYXJndHVwLAotCQkJCSZzdGF0ZSwKLQkJCQkmbGlzdGl0ZW1zLAotCQkJCSZkaWN0aXRlbXMpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNhdmVfcmVkdWNlIiwgMiwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3R1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpc3RpdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGljdGl0ZW1zKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3R1cCkpIHsKLQkJY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIlNlY29uZCBlbGVtZW50IG9mICIKLQkJCSJ0dXBsZSByZXR1cm5lZCBieSAlcyBtdXN0IGJlIGEgdHVwbGUiLAotCQkJIk8iLCBmbik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3R1cCkpIHsKKyAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIlNlY29uZCBlbGVtZW50IG9mICIKKyAgICAgICAgICAgICJ0dXBsZSByZXR1cm5lZCBieSAlcyBtdXN0IGJlIGEgdHVwbGUiLAorICAgICAgICAgICAgIk8iLCBmbik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoc3RhdGUgPT0gUHlfTm9uZSkKLQkJc3RhdGUgPSBOVUxMOworICAgIGlmIChzdGF0ZSA9PSBQeV9Ob25lKQorICAgICAgICBzdGF0ZSA9IE5VTEw7CiAKLQlpZiAobGlzdGl0ZW1zID09IFB5X05vbmUpCi0JCWxpc3RpdGVtcyA9IE5VTEw7Ci0JZWxzZSBpZiAoIVB5SXRlcl9DaGVjayhsaXN0aXRlbXMpKSB7Ci0JCWNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJGb3VydGggZWxlbWVudCBvZiAiCi0JCQkidHVwbGUgcmV0dXJuZWQgYnkgJXMgbXVzdCBiZSBhbiBpdGVyYXRvciwgbm90ICVzIiwKLQkJCSJPcyIsIGZuLCBQeV9UWVBFKGxpc3RpdGVtcyktPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChsaXN0aXRlbXMgPT0gUHlfTm9uZSkKKyAgICAgICAgbGlzdGl0ZW1zID0gTlVMTDsKKyAgICBlbHNlIGlmICghUHlJdGVyX0NoZWNrKGxpc3RpdGVtcykpIHsKKyAgICAgICAgY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIkZvdXJ0aCBlbGVtZW50IG9mICIKKyAgICAgICAgICAgICJ0dXBsZSByZXR1cm5lZCBieSAlcyBtdXN0IGJlIGFuIGl0ZXJhdG9yLCBub3QgJXMiLAorICAgICAgICAgICAgIk9zIiwgZm4sIFB5X1RZUEUobGlzdGl0ZW1zKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoZGljdGl0ZW1zID09IFB5X05vbmUpCi0JCWRpY3RpdGVtcyA9IE5VTEw7Ci0JZWxzZSBpZiAoIVB5SXRlcl9DaGVjayhkaWN0aXRlbXMpKSB7Ci0JCWNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJGaWZ0aCBlbGVtZW50IG9mICIKLQkJCSJ0dXBsZSByZXR1cm5lZCBieSAlcyBtdXN0IGJlIGFuIGl0ZXJhdG9yLCBub3QgJXMiLAotCQkJIk9zIiwgZm4sIFB5X1RZUEUoZGljdGl0ZW1zKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKGRpY3RpdGVtcyA9PSBQeV9Ob25lKQorICAgICAgICBkaWN0aXRlbXMgPSBOVUxMOworICAgIGVsc2UgaWYgKCFQeUl0ZXJfQ2hlY2soZGljdGl0ZW1zKSkgeworICAgICAgICBjUGlja2xlX0VyckZvcm1hdChQaWNrbGluZ0Vycm9yLCAiRmlmdGggZWxlbWVudCBvZiAiCisgICAgICAgICAgICAidHVwbGUgcmV0dXJuZWQgYnkgJXMgbXVzdCBiZSBhbiBpdGVyYXRvciwgbm90ICVzIiwKKyAgICAgICAgICAgICJPcyIsIGZuLCBQeV9UWVBFKGRpY3RpdGVtcyktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0gICAgICAgIC8qIFByb3RvY29sIDIgc3BlY2lhbCBjYXNlOiBpZiBjYWxsYWJsZSdzIG5hbWUgaXMgX19uZXdvYmpfXywgdXNlCi0gICAgICAgICAqIE5FV09CSi4gIFRoaXMgY29uc3VtZXMgYSBsb3Qgb2YgY29kZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmICh1c2VfbmV3b2JqKSB7Ci0gICAgICAgIAlQeU9iamVjdCAqdGVtcCA9IFB5T2JqZWN0X0dldEF0dHIoY2FsbGFibGUsIF9fbmFtZV9fX3N0cik7CisgICAgLyogUHJvdG9jb2wgMiBzcGVjaWFsIGNhc2U6IGlmIGNhbGxhYmxlJ3MgbmFtZSBpcyBfX25ld29ial9fLCB1c2UKKyAgICAgKiBORVdPQkouICBUaGlzIGNvbnN1bWVzIGEgbG90IG9mIGNvZGUuCisgICAgICovCisgICAgaWYgKHVzZV9uZXdvYmopIHsKKyAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBQeU9iamVjdF9HZXRBdHRyKGNhbGxhYmxlLCBfX25hbWVfX19zdHIpOwogCi0JCWlmICh0ZW1wID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJZWxzZQotCQkJCXJldHVybiAtMTsKLQkJCXVzZV9uZXdvYmogPSAwOwotCQl9Ci0JCWVsc2UgewotCQkJdXNlX25ld29iaiA9IFB5U3RyaW5nX0NoZWNrKHRlbXApICYmCi0JCQkJICAgICBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKHRlbXApLAotCQkJCSAgICAgCSAgICAiX19uZXdvYmpfXyIpID09IDA7Ci0JCQlQeV9ERUNSRUYodGVtcCk7Ci0JCX0KLQl9Ci0JaWYgKHVzZV9uZXdvYmopIHsKLQkJUHlPYmplY3QgKmNsczsKLQkJUHlPYmplY3QgKm5ld2FyZ3R1cDsKLQkJaW50IG4sIGk7CisgICAgICAgIGlmICh0ZW1wID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHVzZV9uZXdvYmogPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdXNlX25ld29iaiA9IFB5U3RyaW5nX0NoZWNrKHRlbXApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyh0ZW1wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fbmV3b2JqX18iKSA9PSAwOworICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICB9CisgICAgfQorICAgIGlmICh1c2VfbmV3b2JqKSB7CisgICAgICAgIFB5T2JqZWN0ICpjbHM7CisgICAgICAgIFB5T2JqZWN0ICpuZXdhcmd0dXA7CisgICAgICAgIGludCBuLCBpOwogCi0JCS8qIFNhbml0eSBjaGVja3MuICovCi0JCW4gPSBQeVR1cGxlX1NpemUoYXJndHVwKTsKLQkJaWYgKG4gPCAxKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwgIl9fbmV3b2JqX18gYXJnbGlzdCAiCi0JCQkJImlzIGVtcHR5Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgLyogU2FuaXR5IGNoZWNrcy4gKi8KKyAgICAgICAgbiA9IFB5VHVwbGVfU2l6ZShhcmd0dXApOworICAgICAgICBpZiAobiA8IDEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLCAiX19uZXdvYmpfXyBhcmdsaXN0ICIKKyAgICAgICAgICAgICAgICAiaXMgZW1wdHkiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCWNscyA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHVwLCAwKTsKLQkJaWYgKCEgUHlPYmplY3RfSGFzQXR0clN0cmluZyhjbHMsICJfX25ld19fIikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLCAiYXJnc1swXSBmcm9tICIKLQkJCQkiX19uZXdvYmpfXyBhcmdzIGhhcyBubyBfX25ld19fIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgY2xzID0gUHlUdXBsZV9HRVRfSVRFTShhcmd0dXAsIDApOworICAgICAgICBpZiAoISBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKGNscywgIl9fbmV3X18iKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsICJhcmdzWzBdIGZyb20gIgorICAgICAgICAgICAgICAgICJfX25ld29ial9fIGFyZ3MgaGFzIG5vIF9fbmV3X18iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCS8qIFhYWCBIb3cgY291bGQgb2IgYmUgTlVMTD8gKi8KLQkJaWYgKG9iICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpvYl9kb3RfY2xhc3M7CisgICAgICAgIC8qIFhYWCBIb3cgY291bGQgb2IgYmUgTlVMTD8gKi8KKyAgICAgICAgaWYgKG9iICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvYl9kb3RfY2xhc3M7CiAKLQkJCW9iX2RvdF9jbGFzcyA9IFB5T2JqZWN0X0dldEF0dHIob2IsIF9fY2xhc3NfX19zdHIpOwotCQkJaWYgKG9iX2RvdF9jbGFzcyA9PSBOVUxMKSB7Ci0JCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoCi0JCQkJCSAgICBQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlpID0gb2JfZG90X2NsYXNzICE9IGNsczsgLyogdHJ1ZSBpZmYgYSBwcm9ibGVtICovCi0JCQlQeV9YREVDUkVGKG9iX2RvdF9jbGFzcyk7Ci0JCQlpZiAoaSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLCAiYXJnc1swXSBmcm9tICIKLQkJCQkJIl9fbmV3b2JqX18gYXJncyBoYXMgdGhlIHdyb25nIGNsYXNzIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9CisgICAgICAgICAgICBvYl9kb3RfY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyKG9iLCBfX2NsYXNzX19fc3RyKTsKKyAgICAgICAgICAgIGlmIChvYl9kb3RfY2xhc3MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgPSBvYl9kb3RfY2xhc3MgIT0gY2xzOyAvKiB0cnVlIGlmZiBhIHByb2JsZW0gKi8KKyAgICAgICAgICAgIFB5X1hERUNSRUYob2JfZG90X2NsYXNzKTsKKyAgICAgICAgICAgIGlmIChpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsICJhcmdzWzBdIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAiX19uZXdvYmpfXyBhcmdzIGhhcyB0aGUgd3JvbmcgY2xhc3MiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBTYXZlIHRoZSBjbGFzcyBhbmQgaXRzIF9fbmV3X18gYXJndW1lbnRzLiAqLwotCQlpZiAoc2F2ZShzZWxmLCBjbHMsIDApIDwgMCkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgLyogU2F2ZSB0aGUgY2xhc3MgYW5kIGl0cyBfX25ld19fIGFyZ3VtZW50cy4gKi8KKyAgICAgICAgaWYgKHNhdmUoc2VsZiwgY2xzLCAwKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJbmV3YXJndHVwID0gUHlUdXBsZV9OZXcobi0xKTsgIC8qIGFyZ3R1cFsxOl0gKi8KLQkJaWYgKG5ld2FyZ3R1cCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlmb3IgKGkgPSAxOyBpIDwgbjsgKytpKSB7Ci0JCQlQeU9iamVjdCAqdGVtcCA9IFB5VHVwbGVfR0VUX0lURU0oYXJndHVwLCBpKTsKLQkJCVB5X0lOQ1JFRih0ZW1wKTsKLQkJCVB5VHVwbGVfU0VUX0lURU0obmV3YXJndHVwLCBpLTEsIHRlbXApOwotCQl9Ci0JCWkgPSBzYXZlKHNlbGYsIG5ld2FyZ3R1cCwgMCk7Ci0JCVB5X0RFQ1JFRihuZXdhcmd0dXApOwotCQlpZiAoaSA8IDApCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIG5ld2FyZ3R1cCA9IFB5VHVwbGVfTmV3KG4tMSk7ICAvKiBhcmd0dXBbMTpdICovCisgICAgICAgIGlmIChuZXdhcmd0dXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3R1cCwgaSk7CisgICAgICAgICAgICBQeV9JTkNSRUYodGVtcCk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3R1cCwgaS0xLCB0ZW1wKTsKKyAgICAgICAgfQorICAgICAgICBpID0gc2F2ZShzZWxmLCBuZXdhcmd0dXAsIDApOworICAgICAgICBQeV9ERUNSRUYobmV3YXJndHVwKTsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCS8qIEFkZCBORVdPQkogb3Bjb2RlLiAqLwotCQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmbmV3b2JqLCAxKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgewotCQkvKiBOb3QgdXNpbmcgTkVXT0JKLiAqLwotCQlpZiAoc2F2ZShzZWxmLCBjYWxsYWJsZSwgMCkgPCAwIHx8Ci0JCSAgICBzYXZlKHNlbGYsIGFyZ3R1cCwgMCkgPCAwIHx8Ci0JCSAgICBzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZyZWR1Y2UsIDEpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9CisgICAgICAgIC8qIEFkZCBORVdPQkogb3Bjb2RlLiAqLworICAgICAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmbmV3b2JqLCAxKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBOb3QgdXNpbmcgTkVXT0JKLiAqLworICAgICAgICBpZiAoc2F2ZShzZWxmLCBjYWxsYWJsZSwgMCkgPCAwIHx8CisgICAgICAgICAgICBzYXZlKHNlbGYsIGFyZ3R1cCwgMCkgPCAwIHx8CisgICAgICAgICAgICBzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZyZWR1Y2UsIDEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBNZW1vaXplLiAqLwotCS8qIFhYWCBIb3cgY2FuIG9iIGJlIE5VTEw/ICovCi0JaWYgKG9iICE9IE5VTEwpIHsKLQkJaWYgKHN0YXRlICYmICFQeURpY3RfQ2hlY2soc3RhdGUpKSB7Ci0JCQlpZiAocHV0MihzZWxmLCBvYikgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIGlmIChwdXQoc2VsZiwgb2IpIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIE1lbW9pemUuICovCisgICAgLyogWFhYIEhvdyBjYW4gb2IgYmUgTlVMTD8gKi8KKyAgICBpZiAob2IgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RhdGUgJiYgIVB5RGljdF9DaGVjayhzdGF0ZSkpIHsKKyAgICAgICAgICAgIGlmIChwdXQyKHNlbGYsIG9iKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHB1dChzZWxmLCBvYikgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogCi0gICAgICAgIGlmIChsaXN0aXRlbXMgJiYgYmF0Y2hfbGlzdChzZWxmLCBsaXN0aXRlbXMpIDwgMCkKLSAgICAgICAgCXJldHVybiAtMTsKKyAgICBpZiAobGlzdGl0ZW1zICYmIGJhdGNoX2xpc3Qoc2VsZiwgbGlzdGl0ZW1zKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotICAgICAgICBpZiAoZGljdGl0ZW1zICYmIGJhdGNoX2RpY3Qoc2VsZiwgZGljdGl0ZW1zKSA8IDApCi0gICAgICAgIAlyZXR1cm4gLTE7CisgICAgaWYgKGRpY3RpdGVtcyAmJiBiYXRjaF9kaWN0KHNlbGYsIGRpY3RpdGVtcykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoc3RhdGUpIHsKLQkJaWYgKHNhdmUoc2VsZiwgc3RhdGUsIDApIDwgMCB8fAotCQkgICAgc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmYnVpbGQsIDEpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHN0YXRlKSB7CisgICAgICAgIGlmIChzYXZlKHNlbGYsIHN0YXRlLCAwKSA8IDAgfHwKKyAgICAgICAgICAgIHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgJmJ1aWxkLCAxKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNhdmUoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBwZXJzX3NhdmUpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlOwotCVB5T2JqZWN0ICpweV9vYl9pZCA9IDAsICpfX3JlZHVjZV9fID0gMCwgKnQgPSAwOwotCWludCByZXMgPSAtMTsKLQlpbnQgdG1wOworICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKKyAgICBQeU9iamVjdCAqcHlfb2JfaWQgPSAwLCAqX19yZWR1Y2VfXyA9IDAsICp0ID0gMDsKKyAgICBpbnQgcmVzID0gLTE7CisgICAgaW50IHRtcDsKIAotCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBwaWNrbGluZyBhbiBvYmplY3QiKSkKLQkJcmV0dXJuIC0xOworICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBwaWNrbGluZyBhbiBvYmplY3QiKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCFwZXJzX3NhdmUgJiYgc2VsZi0+cGVyc19mdW5jKSB7Ci0JCWlmICgodG1wID0gc2F2ZV9wZXJzKHNlbGYsIGFyZ3MsIHNlbGYtPnBlcnNfZnVuYykpICE9IDApIHsKLQkJCXJlcyA9IHRtcDsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICBpZiAoIXBlcnNfc2F2ZSAmJiBzZWxmLT5wZXJzX2Z1bmMpIHsKKyAgICAgICAgaWYgKCh0bXAgPSBzYXZlX3BlcnMoc2VsZiwgYXJncywgc2VsZi0+cGVyc19mdW5jKSkgIT0gMCkgeworICAgICAgICAgICAgcmVzID0gdG1wOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQogCi0JaWYgKGFyZ3MgPT0gUHlfTm9uZSkgewotCQlyZXMgPSBzYXZlX25vbmUoc2VsZiwgYXJncyk7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKGFyZ3MgPT0gUHlfTm9uZSkgeworICAgICAgICByZXMgPSBzYXZlX25vbmUoc2VsZiwgYXJncyk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQl0eXBlID0gUHlfVFlQRShhcmdzKTsKKyAgICB0eXBlID0gUHlfVFlQRShhcmdzKTsKIAotCXN3aXRjaCAodHlwZS0+dHBfbmFtZVswXSkgewotCWNhc2UgJ2InOgotCQlpZiAoYXJncyA9PSBQeV9GYWxzZSB8fCBhcmdzID09IFB5X1RydWUpIHsKLQkJCXJlcyA9IHNhdmVfYm9vbChzZWxmLCBhcmdzKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKLSAgICAgICAgY2FzZSAnaSc6Ci0JCWlmICh0eXBlID09ICZQeUludF9UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX2ludChzZWxmLCBhcmdzKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBzd2l0Y2ggKHR5cGUtPnRwX25hbWVbMF0pIHsKKyAgICBjYXNlICdiJzoKKyAgICAgICAgaWYgKGFyZ3MgPT0gUHlfRmFsc2UgfHwgYXJncyA9PSBQeV9UcnVlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2Jvb2woc2VsZiwgYXJncyk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnaSc6CisgICAgICAgIGlmICh0eXBlID09ICZQeUludF9UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2ludChzZWxmLCBhcmdzKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlICdsJzoKLQkJaWYgKHR5cGUgPT0gJlB5TG9uZ19UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX2xvbmcoc2VsZiwgYXJncyk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAnbCc6CisgICAgICAgIGlmICh0eXBlID09ICZQeUxvbmdfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9sb25nKHNlbGYsIGFyZ3MpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgJ2YnOgotCQlpZiAodHlwZSA9PSAmUHlGbG9hdF9UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX2Zsb2F0KHNlbGYsIGFyZ3MpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ2YnOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlGbG9hdF9UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX2Zsb2F0KHNlbGYsIGFyZ3MpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgJ3QnOgotCQlpZiAodHlwZSA9PSAmUHlUdXBsZV9UeXBlICYmIFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAwKSB7Ci0JCQlyZXMgPSBzYXZlX3R1cGxlKHNlbGYsIGFyZ3MpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ3QnOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlUdXBsZV9UeXBlICYmIFB5VHVwbGVfU2l6ZShhcmdzKSA9PSAwKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX3R1cGxlKHNlbGYsIGFyZ3MpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgJ3MnOgotCQlpZiAoKHR5cGUgPT0gJlB5U3RyaW5nX1R5cGUpICYmIChQeVN0cmluZ19HRVRfU0laRShhcmdzKSA8IDIpKSB7Ci0JCQlyZXMgPSBzYXZlX3N0cmluZyhzZWxmLCBhcmdzLCAwKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICdzJzoKKyAgICAgICAgaWYgKCh0eXBlID09ICZQeVN0cmluZ19UeXBlKSAmJiAoUHlTdHJpbmdfR0VUX1NJWkUoYXJncykgPCAyKSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9zdHJpbmcoc2VsZiwgYXJncywgMCk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0gICAgICAgIGNhc2UgJ3UnOgotCQlpZiAoKHR5cGUgPT0gJlB5VW5pY29kZV9UeXBlKSAmJiAoUHlTdHJpbmdfR0VUX1NJWkUoYXJncykgPCAyKSkgewotCQkJcmVzID0gc2F2ZV91bmljb2RlKHNlbGYsIGFyZ3MsIDApOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ3UnOgorICAgICAgICBpZiAoKHR5cGUgPT0gJlB5VW5pY29kZV9UeXBlKSAmJiAoUHlTdHJpbmdfR0VUX1NJWkUoYXJncykgPCAyKSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV91bmljb2RlKHNlbGYsIGFyZ3MsIDApOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogI2VuZGlmCi0JfQorICAgIH0KIAotCWlmIChQeV9SRUZDTlQoYXJncykgPiAxKSB7Ci0JCWlmICghKCBweV9vYl9pZCA9IFB5TG9uZ19Gcm9tVm9pZFB0cihhcmdzKSkpCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKFB5X1JFRkNOVChhcmdzKSA+IDEpIHsKKyAgICAgICAgaWYgKCEoIHB5X29iX2lkID0gUHlMb25nX0Zyb21Wb2lkUHRyKGFyZ3MpKSkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlpZiAoUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfb2JfaWQpKSB7Ci0JCQlpZiAoZ2V0KHNlbGYsIHB5X29iX2lkKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfb2JfaWQpKSB7CisgICAgICAgICAgICBpZiAoZ2V0KHNlbGYsIHB5X29iX2lkKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQlyZXMgPSAwOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfQorICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0KIAotCXN3aXRjaCAodHlwZS0+dHBfbmFtZVswXSkgewotICAgICAgICBjYXNlICdzJzoKLQkJaWYgKHR5cGUgPT0gJlB5U3RyaW5nX1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfc3RyaW5nKHNlbGYsIGFyZ3MsIDEpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIHN3aXRjaCAodHlwZS0+dHBfbmFtZVswXSkgeworICAgIGNhc2UgJ3MnOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlTdHJpbmdfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9zdHJpbmcoc2VsZiwgYXJncywgMSk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0gICAgICAgIGNhc2UgJ3UnOgotCQlpZiAodHlwZSA9PSAmUHlVbmljb2RlX1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfdW5pY29kZShzZWxmLCBhcmdzLCAxKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICd1JzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5VW5pY29kZV9UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX3VuaWNvZGUoc2VsZiwgYXJncywgMSk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAjZW5kaWYKIAotICAgICAgICBjYXNlICd0JzoKLQkJaWYgKHR5cGUgPT0gJlB5VHVwbGVfVHlwZSkgewotCQkJcmVzID0gc2F2ZV90dXBsZShzZWxmLCBhcmdzKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlpZiAodHlwZSA9PSAmUHlUeXBlX1R5cGUpIHsKLQkJCXJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIE5VTEwpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ3QnOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlUdXBsZV9UeXBlKSB7CisgICAgICAgICAgICByZXMgPSBzYXZlX3R1cGxlKHNlbGYsIGFyZ3MpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09ICZQeVR5cGVfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgTlVMTCk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAnbCc6Ci0JCWlmICh0eXBlID09ICZQeUxpc3RfVHlwZSkgewotCQkJcmVzID0gc2F2ZV9saXN0KHNlbGYsIGFyZ3MpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCWJyZWFrOworICAgIGNhc2UgJ2wnOgorICAgICAgICBpZiAodHlwZSA9PSAmUHlMaXN0X1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfbGlzdChzZWxmLCBhcmdzKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlICdkJzoKLQkJaWYgKHR5cGUgPT0gJlB5RGljdF9UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX2RpY3Qoc2VsZiwgYXJncyk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAnZCc6CisgICAgICAgIGlmICh0eXBlID09ICZQeURpY3RfVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9kaWN0KHNlbGYsIGFyZ3MpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgJ2knOgotCQlpZiAodHlwZSA9PSAmUHlJbnN0YW5jZV9UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX2luc3Qoc2VsZiwgYXJncyk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAnaSc6CisgICAgICAgIGlmICh0eXBlID09ICZQeUluc3RhbmNlX1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfaW5zdChzZWxmLCBhcmdzKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlICdjJzoKLQkJaWYgKHR5cGUgPT0gJlB5Q2xhc3NfVHlwZSkgewotCQkJcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgTlVMTCk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAnYyc6CisgICAgICAgIGlmICh0eXBlID09ICZQeUNsYXNzX1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIE5VTEwpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgJ2YnOgotCQlpZiAodHlwZSA9PSAmUHlGdW5jdGlvbl9UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCBOVUxMKTsKLQkJCWlmIChyZXMgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQaWNrbGVFcnJvcikpIHsKLQkJCQkvKiBmYWxsIGJhY2sgdG8gcmVkdWNlICovCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlicmVhazsKKyAgICBjYXNlICdmJzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5RnVuY3Rpb25fVHlwZSkgeworICAgICAgICAgICAgcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgTlVMTCk7CisgICAgICAgICAgICBpZiAocmVzICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUGlja2xlRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgLyogZmFsbCBiYWNrIHRvIHJlZHVjZSAqLworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSAnYic6Ci0JCWlmICh0eXBlID09ICZQeUNGdW5jdGlvbl9UeXBlKSB7Ci0JCQlyZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCBOVUxMKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICBjYXNlICdiJzoKKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5Q0Z1bmN0aW9uX1R5cGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIE5VTEwpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQogCi0JaWYgKCFwZXJzX3NhdmUgJiYgc2VsZi0+aW5zdF9wZXJzX2Z1bmMpIHsKLQkJaWYgKCh0bXAgPSBzYXZlX3BlcnMoc2VsZiwgYXJncywgc2VsZi0+aW5zdF9wZXJzX2Z1bmMpKSAhPSAwKSB7Ci0JCQlyZXMgPSB0bXA7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9CisgICAgaWYgKCFwZXJzX3NhdmUgJiYgc2VsZi0+aW5zdF9wZXJzX2Z1bmMpIHsKKyAgICAgICAgaWYgKCh0bXAgPSBzYXZlX3BlcnMoc2VsZiwgYXJncywgc2VsZi0+aW5zdF9wZXJzX2Z1bmMpKSAhPSAwKSB7CisgICAgICAgICAgICByZXMgPSB0bXA7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlUeXBlX1R5cGUpKSB7Ci0JCXJlcyA9IHNhdmVfZ2xvYmFsKHNlbGYsIGFyZ3MsIE5VTEwpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeVR5cGVfVHlwZSkpIHsKKyAgICAgICAgcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgTlVMTCk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQkvKiBHZXQgYSByZWR1Y3Rpb24gY2FsbGFibGUsIGFuZCBjYWxsIGl0LiAgVGhpcyBtYXkgY29tZSBmcm9tCi0JICogY29weV9yZWcuZGlzcGF0Y2hfdGFibGUsIHRoZSBvYmplY3QncyBfX3JlZHVjZV9leF9fIG1ldGhvZCwKLQkgKiBvciB0aGUgb2JqZWN0J3MgX19yZWR1Y2VfXyBtZXRob2QuCi0JICovCi0JX19yZWR1Y2VfXyA9IFB5RGljdF9HZXRJdGVtKGRpc3BhdGNoX3RhYmxlLCAoUHlPYmplY3QgKil0eXBlKTsKLQlpZiAoX19yZWR1Y2VfXyAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihfX3JlZHVjZV9fKTsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCQlBUkdfVFVQKHNlbGYsIGFyZ3MpOwotCQlpZiAoc2VsZi0+YXJnKSB7Ci0JCQl0ID0gUHlPYmplY3RfQ2FsbChfX3JlZHVjZV9fLCBzZWxmLT5hcmcsIE5VTEwpOwotCQkJRlJFRV9BUkdfVFVQKHNlbGYpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBDaGVjayBmb3IgYSBfX3JlZHVjZV9leF9fIG1ldGhvZC4gKi8KLQkJX19yZWR1Y2VfXyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19yZWR1Y2VfZXhfX19zdHIpOwotCQlpZiAoX19yZWR1Y2VfXyAhPSBOVUxMKSB7Ci0JCQl0ID0gUHlJbnRfRnJvbUxvbmcoc2VsZi0+cHJvdG8pOwotCQkJaWYgKHQgIT0gTlVMTCkgewotCQkJCUFSR19UVVAoc2VsZiwgdCk7Ci0JCQkJdCA9IE5VTEw7Ci0JCQkJaWYgKHNlbGYtPmFyZykgewotCQkJCQl0ID0gUHlPYmplY3RfQ2FsbChfX3JlZHVjZV9fLAotCQkJCQkJCSAgc2VsZi0+YXJnLCBOVUxMKTsKLQkJCQkJRlJFRV9BUkdfVFVQKHNlbGYpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJZWxzZQotCQkJCWdvdG8gZmluYWxseTsKLQkJCS8qIENoZWNrIGZvciBhIF9fcmVkdWNlX18gbWV0aG9kLiAqLwotCQkJX19yZWR1Y2VfXyA9IFB5T2JqZWN0X0dldEF0dHIoYXJncywgX19yZWR1Y2VfX19zdHIpOwotCQkJaWYgKF9fcmVkdWNlX18gIT0gTlVMTCkgewotCQkJCXQgPSBQeU9iamVjdF9DYWxsKF9fcmVkdWNlX18sCi0JCQkJCQkgIGVtcHR5X3R1cGxlLCBOVUxMKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVB5RXJyX1NldE9iamVjdChVbnBpY2tsZWFibGVFcnJvciwgYXJncyk7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQotCQl9Ci0JfQorICAgIC8qIEdldCBhIHJlZHVjdGlvbiBjYWxsYWJsZSwgYW5kIGNhbGwgaXQuICBUaGlzIG1heSBjb21lIGZyb20KKyAgICAgKiBjb3B5X3JlZy5kaXNwYXRjaF90YWJsZSwgdGhlIG9iamVjdCdzIF9fcmVkdWNlX2V4X18gbWV0aG9kLAorICAgICAqIG9yIHRoZSBvYmplY3QncyBfX3JlZHVjZV9fIG1ldGhvZC4KKyAgICAgKi8KKyAgICBfX3JlZHVjZV9fID0gUHlEaWN0X0dldEl0ZW0oZGlzcGF0Y2hfdGFibGUsIChQeU9iamVjdCAqKXR5cGUpOworICAgIGlmIChfX3JlZHVjZV9fICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKF9fcmVkdWNlX18pOworICAgICAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgICAgIEFSR19UVVAoc2VsZiwgYXJncyk7CisgICAgICAgIGlmIChzZWxmLT5hcmcpIHsKKyAgICAgICAgICAgIHQgPSBQeU9iamVjdF9DYWxsKF9fcmVkdWNlX18sIHNlbGYtPmFyZywgTlVMTCk7CisgICAgICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIENoZWNrIGZvciBhIF9fcmVkdWNlX2V4X18gbWV0aG9kLiAqLworICAgICAgICBfX3JlZHVjZV9fID0gUHlPYmplY3RfR2V0QXR0cihhcmdzLCBfX3JlZHVjZV9leF9fX3N0cik7CisgICAgICAgIGlmIChfX3JlZHVjZV9fICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHQgPSBQeUludF9Gcm9tTG9uZyhzZWxmLT5wcm90byk7CisgICAgICAgICAgICBpZiAodCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQVJHX1RVUChzZWxmLCB0KTsKKyAgICAgICAgICAgICAgICB0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAoc2VsZi0+YXJnKSB7CisgICAgICAgICAgICAgICAgICAgIHQgPSBQeU9iamVjdF9DYWxsKF9fcmVkdWNlX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmFyZywgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIEZSRUVfQVJHX1RVUChzZWxmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICAvKiBDaGVjayBmb3IgYSBfX3JlZHVjZV9fIG1ldGhvZC4gKi8KKyAgICAgICAgICAgIF9fcmVkdWNlX18gPSBQeU9iamVjdF9HZXRBdHRyKGFyZ3MsIF9fcmVkdWNlX19fc3RyKTsKKyAgICAgICAgICAgIGlmIChfX3JlZHVjZV9fICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB0ID0gUHlPYmplY3RfQ2FsbChfX3JlZHVjZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5X3R1cGxlLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChVbnBpY2tsZWFibGVFcnJvciwgYXJncyk7CisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKHQgPT0gTlVMTCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICh0ID09IE5VTEwpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChQeVN0cmluZ19DaGVjayh0KSkgewotCQlyZXMgPSBzYXZlX2dsb2JhbChzZWxmLCBhcmdzLCB0KTsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodCkpIHsKKyAgICAgICAgcmVzID0gc2F2ZV9nbG9iYWwoc2VsZiwgYXJncywgdCk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2sodCkpIHsKLQkJY1BpY2tsZV9FcnJGb3JtYXQoUGlja2xpbmdFcnJvciwgIlZhbHVlIHJldHVybmVkIGJ5ICIKLQkJCQkiJXMgbXVzdCBiZSBzdHJpbmcgb3IgdHVwbGUiLAotCQkJCSJPIiwgX19yZWR1Y2VfXyk7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHQpKSB7CisgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFBpY2tsaW5nRXJyb3IsICJWYWx1ZSByZXR1cm5lZCBieSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgbXVzdCBiZSBzdHJpbmcgb3IgdHVwbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIk8iLCBfX3JlZHVjZV9fKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCXJlcyA9IHNhdmVfcmVkdWNlKHNlbGYsIHQsIF9fcmVkdWNlX18sIGFyZ3MpOworICAgIHJlcyA9IHNhdmVfcmVkdWNlKHNlbGYsIHQsIF9fcmVkdWNlX18sIGFyZ3MpOwogCiAgIGZpbmFsbHk6Ci0JUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JUHlfWERFQ1JFRihweV9vYl9pZCk7Ci0JUHlfWERFQ1JFRihfX3JlZHVjZV9fKTsKLQlQeV9YREVDUkVGKHQpOworICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgIFB5X1hERUNSRUYocHlfb2JfaWQpOworICAgIFB5X1hERUNSRUYoX19yZWR1Y2VfXyk7CisgICAgUHlfWERFQ1JFRih0KTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCiBzdGF0aWMgaW50CiBkdW1wKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YXRpYyBjaGFyIHN0b3AgPSBTVE9QOworICAgIHN0YXRpYyBjaGFyIHN0b3AgPSBTVE9QOwogCi0JaWYgKHNlbGYtPnByb3RvID49IDIpIHsKLQkJY2hhciBieXRlc1syXTsKKyAgICBpZiAoc2VsZi0+cHJvdG8gPj0gMikgeworICAgICAgICBjaGFyIGJ5dGVzWzJdOwogCi0JCWJ5dGVzWzBdID0gUFJPVE87Ci0JCWFzc2VydChzZWxmLT5wcm90byA+PSAwICYmIHNlbGYtPnByb3RvIDwgMjU2KTsKLQkJYnl0ZXNbMV0gPSAoY2hhcilzZWxmLT5wcm90bzsKLQkJaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgYnl0ZXMsIDIpIDwgMCkKLQkJCXJldHVybiAtMTsKLQl9CisgICAgICAgIGJ5dGVzWzBdID0gUFJPVE87CisgICAgICAgIGFzc2VydChzZWxmLT5wcm90byA+PSAwICYmIHNlbGYtPnByb3RvIDwgMjU2KTsKKyAgICAgICAgYnl0ZXNbMV0gPSAoY2hhcilzZWxmLT5wcm90bzsKKyAgICAgICAgaWYgKHNlbGYtPndyaXRlX2Z1bmMoc2VsZiwgYnl0ZXMsIDIpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoc2F2ZShzZWxmLCBhcmdzLCAwKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2F2ZShzZWxmLCBhcmdzLCAwKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmIChzZWxmLT53cml0ZV9mdW5jKHNlbGYsICZzdG9wLCAxKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCAmc3RvcCwgMSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBOVUxMLCAwKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+d3JpdGVfZnVuYyhzZWxmLCBOVUxMLCAwKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUGlja2xlX2NsZWFyX21lbW8oUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKHNlbGYtPm1lbW8pCi0JCVB5RGljdF9DbGVhcihzZWxmLT5tZW1vKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHNlbGYtPm1lbW8pCisgICAgICAgIFB5RGljdF9DbGVhcihzZWxmLT5tZW1vKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQaWNrbGVfZ2V0dmFsdWUoUGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGwsIGksIHJzaXplLCBzc2l6ZSwgY2xlYXI9MSwgbG07Ci0JbG9uZyBpazsKLQlQeU9iamVjdCAqaywgKnI7Ci0JY2hhciAqcywgKnAsICpoYXZlX2dldDsKLQlQZGF0YSAqZGF0YTsKKyAgICBpbnQgbCwgaSwgcnNpemUsIHNzaXplLCBjbGVhcj0xLCBsbTsKKyAgICBsb25nIGlrOworICAgIFB5T2JqZWN0ICprLCAqcjsKKyAgICBjaGFyICpzLCAqcCwgKmhhdmVfZ2V0OworICAgIFBkYXRhICpkYXRhOwogCi0JLyogQ2FuIGJlIGNhbGxlZCBieSBQeXRob24gY29kZSBvciBDIGNvZGUgKi8KLQlpZiAoYXJncyAmJiAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6Z2V0dmFsdWUiLCAmY2xlYXIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBDYW4gYmUgY2FsbGVkIGJ5IFB5dGhvbiBjb2RlIG9yIEMgY29kZSAqLworICAgIGlmIChhcmdzICYmICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpnZXR2YWx1ZSIsICZjbGVhcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGFyZSBiYXNlZCBvbiBhIGxpc3QgKi8KLQlpZiAoISBQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKLQkJCQkiQXR0ZW1wdCB0byBnZXR2YWx1ZSgpIGEgbm9uLWxpc3QtYmFzZWQgcGlja2xlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGFyZSBiYXNlZCBvbiBhIGxpc3QgKi8KKyAgICBpZiAoISBQZGF0YV9DaGVjayhzZWxmLT5maWxlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIGdldHZhbHVlKCkgYSBub24tbGlzdC1iYXNlZCBwaWNrbGVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIGZsdXNoIHdyaXRlIGJ1ZmZlciAqLwotCWlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApIHJldHVybiBOVUxMOworICAgIC8qIGZsdXNoIHdyaXRlIGJ1ZmZlciAqLworICAgIGlmICh3cml0ZV9vdGhlcihzZWxmLCBOVUxMLCAwKSA8IDApIHJldHVybiBOVUxMOwogCi0JZGF0YT0oUGRhdGEqKXNlbGYtPmZpbGU7Ci0JbD1kYXRhLT5sZW5ndGg7CisgICAgZGF0YT0oUGRhdGEqKXNlbGYtPmZpbGU7CisgICAgbD1kYXRhLT5sZW5ndGg7CiAKLQkvKiBzZXQgdXAgYW4gYXJyYXkgdG8gaG9sZCBnZXQvcHV0IHN0YXR1cyAqLwotCWxtID0gUHlEaWN0X1NpemUoc2VsZi0+bWVtbyk7Ci0JaWYgKGxtIDwgMCkgcmV0dXJuIE5VTEw7Ci0JbG0rKzsKLQloYXZlX2dldCA9IG1hbGxvYyhsbSk7Ci0JaWYgKGhhdmVfZ2V0ID09IE5VTEwpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCW1lbXNldChoYXZlX2dldCwgMCwgbG0pOworICAgIC8qIHNldCB1cCBhbiBhcnJheSB0byBob2xkIGdldC9wdXQgc3RhdHVzICovCisgICAgbG0gPSBQeURpY3RfU2l6ZShzZWxmLT5tZW1vKTsKKyAgICBpZiAobG0gPCAwKSByZXR1cm4gTlVMTDsKKyAgICBsbSsrOworICAgIGhhdmVfZ2V0ID0gbWFsbG9jKGxtKTsKKyAgICBpZiAoaGF2ZV9nZXQgPT0gTlVMTCkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgbWVtc2V0KGhhdmVfZ2V0LCAwLCBsbSk7CiAKLQkvKiBTY2FuIGZvciBnZXRzLiAqLwotCWZvciAocnNpemUgPSAwLCBpID0gbDsgLS1pID49IDA7ICkgewotCQlrID0gZGF0YS0+ZGF0YVtpXTsKKyAgICAvKiBTY2FuIGZvciBnZXRzLiAqLworICAgIGZvciAocnNpemUgPSAwLCBpID0gbDsgLS1pID49IDA7ICkgeworICAgICAgICBrID0gZGF0YS0+ZGF0YVtpXTsKIAotCQlpZiAoUHlTdHJpbmdfQ2hlY2soaykpCi0JCQlyc2l6ZSArPSBQeVN0cmluZ19HRVRfU0laRShrKTsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGspKQorICAgICAgICAgICAgcnNpemUgKz0gUHlTdHJpbmdfR0VUX1NJWkUoayk7CiAKLQkJZWxzZSBpZiAoUHlJbnRfQ2hlY2soaykpIHsgLyogcHV0ICovCi0JCQlpayA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0KilrKTsKLQkJCWlmIChpayA+PSBsbSB8fCBpayA9PSAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCi0JCQkJCQkiSW52YWxpZCBnZXQgZGF0YSIpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQkJaWYgKGhhdmVfZ2V0W2lrXSkgLyogd2l0aCBtYXRjaGluZyBnZXQgKi8KLQkJCQlyc2l6ZSArPSBpayA8IDI1NiA/IDIgOiA1OwotCQl9CisgICAgICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKGspKSB7IC8qIHB1dCAqLworICAgICAgICAgICAgaWsgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCopayk7CisgICAgICAgICAgICBpZiAoaWsgPj0gbG0gfHwgaWsgPT0gMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQaWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBnZXQgZGF0YSIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhdmVfZ2V0W2lrXSkgLyogd2l0aCBtYXRjaGluZyBnZXQgKi8KKyAgICAgICAgICAgICAgICByc2l6ZSArPSBpayA8IDI1NiA/IDIgOiA1OworICAgICAgICB9CiAKLQkJZWxzZSBpZiAoISAoUHlUdXBsZV9DaGVjayhrKSAmJgotCQkJICAgIFB5VHVwbGVfR0VUX1NJWkUoaykgPT0gMiAmJgotCQkJICAgIFB5SW50X0NoZWNrKChrID0gUHlUdXBsZV9HRVRfSVRFTShrLCAwKSkpKQotCQkJKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKLQkJCQkJIlVuZXhwZWN0ZWQgZGF0YSBpbiBpbnRlcm5hbCBsaXN0Iik7Ci0JCQlnb3RvIGVycjsKLQkJfQorICAgICAgICBlbHNlIGlmICghIChQeVR1cGxlX0NoZWNrKGspICYmCisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoaykgPT0gMiAmJgorICAgICAgICAgICAgICAgICAgICBQeUludF9DaGVjaygoayA9IFB5VHVwbGVfR0VUX0lURU0oaywgMCkpKSkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZGF0YSBpbiBpbnRlcm5hbCBsaXN0Iik7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQogCi0JCWVsc2UgeyAvKiBwdXQgKi8KLQkJCWlrID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKilrKTsKLQkJCWlmIChpayA+PSBsbSB8fCBpayA9PSAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCi0JCQkJCQkiSW52YWxpZCBnZXQgZGF0YSIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaGF2ZV9nZXRbaWtdID0gMTsKLQkJCXJzaXplICs9IGlrIDwgMjU2ID8gMiA6IDU7Ci0JCX0KLQl9CisgICAgICAgIGVsc2UgeyAvKiBwdXQgKi8KKyAgICAgICAgICAgIGlrID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKilrKTsKKyAgICAgICAgICAgIGlmIChpayA+PSBsbSB8fCBpayA9PSAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGdldCBkYXRhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYXZlX2dldFtpa10gPSAxOworICAgICAgICAgICAgcnNpemUgKz0gaWsgPCAyNTYgPyAyIDogNTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIE5vdyBnZW5lcmF0ZSB0aGUgcmVzdWx0ICovCi0JciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJzaXplKTsKLQlpZiAociA9PSBOVUxMKSBnb3RvIGVycjsKLQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXIpOworICAgIC8qIE5vdyBnZW5lcmF0ZSB0aGUgcmVzdWx0ICovCisgICAgciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJzaXplKTsKKyAgICBpZiAociA9PSBOVUxMKSBnb3RvIGVycjsKKyAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXIpOwogCi0JZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewotCQlrID0gZGF0YS0+ZGF0YVtpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIGsgPSBkYXRhLT5kYXRhW2ldOwogCi0JCWlmIChQeVN0cmluZ19DaGVjayhrKSkgewotCQkJc3NpemUgPSBQeVN0cmluZ19HRVRfU0laRShrKTsKLQkJCWlmIChzc2l6ZSkgewotCQkJCXA9UHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKWspOwotCQkJCXdoaWxlICgtLXNzaXplID49IDApCi0JCQkJCSpzKysgPSAqcCsrOwotCQkJfQotCQl9CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhrKSkgeworICAgICAgICAgICAgc3NpemUgPSBQeVN0cmluZ19HRVRfU0laRShrKTsKKyAgICAgICAgICAgIGlmIChzc2l6ZSkgeworICAgICAgICAgICAgICAgIHA9UHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKWspOworICAgICAgICAgICAgICAgIHdoaWxlICgtLXNzaXplID49IDApCisgICAgICAgICAgICAgICAgICAgICpzKysgPSAqcCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJZWxzZSBpZiAoUHlUdXBsZV9DaGVjayhrKSkgeyAvKiBnZXQgKi8KLQkJCWlrID0gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKikKLQkJCQkJICAgIFB5VHVwbGVfR0VUX0lURU0oaywgMCkpOwotCQkJaWYgKGlrIDwgMjU2KSB7Ci0JCQkJKnMrKyA9IEJJTkdFVDsKLQkJCQkqcysrID0gKGludCkoaWsgJiAweGZmKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCSpzKysgPSBMT05HX0JJTkdFVDsKLQkJCQkqcysrID0gKGludCkoaWsgJiAweGZmKTsKLQkJCQkqcysrID0gKGludCkoKGlrID4+IDgpICAmIDB4ZmYpOwotCQkJCSpzKysgPSAoaW50KSgoaWsgPj4gMTYpICYgMHhmZik7Ci0JCQkJKnMrKyA9IChpbnQpKChpayA+PiAyNCkgJiAweGZmKTsKLQkJCX0KLQkJfQorICAgICAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKGspKSB7IC8qIGdldCAqLworICAgICAgICAgICAgaWsgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKGssIDApKTsKKyAgICAgICAgICAgIGlmIChpayA8IDI1NikgeworICAgICAgICAgICAgICAgICpzKysgPSBCSU5HRVQ7CisgICAgICAgICAgICAgICAgKnMrKyA9IChpbnQpKGlrICYgMHhmZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAqcysrID0gTE9OR19CSU5HRVQ7CisgICAgICAgICAgICAgICAgKnMrKyA9IChpbnQpKGlrICYgMHhmZik7CisgICAgICAgICAgICAgICAgKnMrKyA9IChpbnQpKChpayA+PiA4KSAgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAqcysrID0gKGludCkoKGlrID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICpzKysgPSAoaW50KSgoaWsgPj4gMjQpICYgMHhmZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQllbHNlIHsgLyogcHV0ICovCi0JCQlpayA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0KilrKTsKKyAgICAgICAgZWxzZSB7IC8qIHB1dCAqLworICAgICAgICAgICAgaWsgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCopayk7CiAKLQkJCWlmIChoYXZlX2dldFtpa10pIHsgLyogd2l0aCBtYXRjaGluZyBnZXQgKi8KLQkJCQlpZiAoaWsgPCAyNTYpIHsKLQkJCQkJKnMrKyA9IEJJTlBVVDsKLQkJCQkJKnMrKyA9IChpbnQpKGlrICYgMHhmZik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkqcysrID0gTE9OR19CSU5QVVQ7Ci0JCQkJCSpzKysgPSAoaW50KShpayAmIDB4ZmYpOwotCQkJCQkqcysrID0gKGludCkoKGlrID4+IDgpICAmIDB4ZmYpOwotCQkJCQkqcysrID0gKGludCkoKGlrID4+IDE2KSAmIDB4ZmYpOwotCQkJCQkqcysrID0gKGludCkoKGlrID4+IDI0KSAmIDB4ZmYpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIGlmIChoYXZlX2dldFtpa10pIHsgLyogd2l0aCBtYXRjaGluZyBnZXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoaWsgPCAyNTYpIHsKKyAgICAgICAgICAgICAgICAgICAgKnMrKyA9IEJJTlBVVDsKKyAgICAgICAgICAgICAgICAgICAgKnMrKyA9IChpbnQpKGlrICYgMHhmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAqcysrID0gTE9OR19CSU5QVVQ7CisgICAgICAgICAgICAgICAgICAgICpzKysgPSAoaW50KShpayAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqcysrID0gKGludCkoKGlrID4+IDgpICAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqcysrID0gKGludCkoKGlrID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgICAgICAqcysrID0gKGludCkoKGlrID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChjbGVhcikgewotCQlQeURpY3RfQ2xlYXIoc2VsZi0+bWVtbyk7Ci0JCVBkYXRhX2NsZWFyKGRhdGEsIDApOwotCX0KKyAgICBpZiAoY2xlYXIpIHsKKyAgICAgICAgUHlEaWN0X0NsZWFyKHNlbGYtPm1lbW8pOworICAgICAgICBQZGF0YV9jbGVhcihkYXRhLCAwKTsKKyAgICB9CiAKLQlmcmVlKGhhdmVfZ2V0KTsKLQlyZXR1cm4gcjsKKyAgICBmcmVlKGhhdmVfZ2V0KTsKKyAgICByZXR1cm4gcjsKICAgZXJyOgotCWZyZWUoaGF2ZV9nZXQpOwotCXJldHVybiBOVUxMOworICAgIGZyZWUoaGF2ZV9nZXQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUGlja2xlcl9kdW1wKFBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpvYjsKLQlpbnQgZ2V0PTA7CisgICAgUHlPYmplY3QgKm9iOworICAgIGludCBnZXQ9MDsKIAotCWlmICghKCBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6ZHVtcCIsICZvYiwgJmdldCkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISggUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOmR1bXAiLCAmb2IsICZnZXQpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZHVtcChzZWxmLCBvYikgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZHVtcChzZWxmLCBvYikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChnZXQpIHJldHVybiBQaWNrbGVfZ2V0dmFsdWUoc2VsZiwgTlVMTCk7CisgICAgaWYgKGdldCkgcmV0dXJuIFBpY2tsZV9nZXR2YWx1ZShzZWxmLCBOVUxMKTsKIAotCS8qIFhYWCBXaHkgZG9lcyBkdW1wKCkgcmV0dXJuIHNlbGY/ICovCi0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgLyogWFhYIFdoeSBkb2VzIGR1bXAoKSByZXR1cm4gc2VsZj8gKi8KKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKIH0KIAogCkBAIC0yOTA1LDI1MCArMjkwNSwyNTAgQEAKIHN0YXRpYyBQaWNrbGVyb2JqZWN0ICoKIG5ld1BpY2tsZXJvYmplY3QoUHlPYmplY3QgKmZpbGUsIGludCBwcm90bykKIHsKLQlQaWNrbGVyb2JqZWN0ICpzZWxmOworICAgIFBpY2tsZXJvYmplY3QgKnNlbGY7CiAKLQlpZiAocHJvdG8gPCAwKQotCQlwcm90byA9IEhJR0hFU1RfUFJPVE9DT0w7Ci0JaWYgKHByb3RvID4gSElHSEVTVF9QUk9UT0NPTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgInBpY2tsZSBwcm90b2NvbCAlZCBhc2tlZCBmb3I7ICIKLQkJCSAgICAgInRoZSBoaWdoZXN0IGF2YWlsYWJsZSBwcm90b2NvbCBpcyAlZCIsCi0JCQkgICAgIHByb3RvLCBISUdIRVNUX1BST1RPQ09MKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChwcm90byA8IDApCisgICAgICAgIHByb3RvID0gSElHSEVTVF9QUk9UT0NPTDsKKyAgICBpZiAocHJvdG8gPiBISUdIRVNUX1BST1RPQ09MKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAicGlja2xlIHByb3RvY29sICVkIGFza2VkIGZvcjsgIgorICAgICAgICAgICAgICAgICAgICAgInRoZSBoaWdoZXN0IGF2YWlsYWJsZSBwcm90b2NvbCBpcyAlZCIsCisgICAgICAgICAgICAgICAgICAgICBwcm90bywgSElHSEVTVF9QUk9UT0NPTCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNlbGYgPSBQeU9iamVjdF9HQ19OZXcoUGlja2xlcm9iamVjdCwgJlBpY2tsZXJ0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5wcm90byA9IHByb3RvOwotCXNlbGYtPmJpbiA9IHByb3RvID4gMDsKLQlzZWxmLT5mcCA9IE5VTEw7Ci0Jc2VsZi0+d3JpdGUgPSBOVUxMOwotCXNlbGYtPm1lbW8gPSBOVUxMOwotCXNlbGYtPmFyZyA9IE5VTEw7Ci0Jc2VsZi0+cGVyc19mdW5jID0gTlVMTDsKLQlzZWxmLT5pbnN0X3BlcnNfZnVuYyA9IE5VTEw7Ci0Jc2VsZi0+d3JpdGVfYnVmID0gTlVMTDsKLQlzZWxmLT5mYXN0ID0gMDsKLQlzZWxmLT5mYXN0X2NvbnRhaW5lciA9IDA7Ci0Jc2VsZi0+ZmFzdF9tZW1vID0gTlVMTDsKLQlzZWxmLT5idWZfc2l6ZSA9IDA7Ci0Jc2VsZi0+ZGlzcGF0Y2hfdGFibGUgPSBOVUxMOworICAgIHNlbGYgPSBQeU9iamVjdF9HQ19OZXcoUGlja2xlcm9iamVjdCwgJlBpY2tsZXJ0eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5wcm90byA9IHByb3RvOworICAgIHNlbGYtPmJpbiA9IHByb3RvID4gMDsKKyAgICBzZWxmLT5mcCA9IE5VTEw7CisgICAgc2VsZi0+d3JpdGUgPSBOVUxMOworICAgIHNlbGYtPm1lbW8gPSBOVUxMOworICAgIHNlbGYtPmFyZyA9IE5VTEw7CisgICAgc2VsZi0+cGVyc19mdW5jID0gTlVMTDsKKyAgICBzZWxmLT5pbnN0X3BlcnNfZnVuYyA9IE5VTEw7CisgICAgc2VsZi0+d3JpdGVfYnVmID0gTlVMTDsKKyAgICBzZWxmLT5mYXN0ID0gMDsKKyAgICBzZWxmLT5mYXN0X2NvbnRhaW5lciA9IDA7CisgICAgc2VsZi0+ZmFzdF9tZW1vID0gTlVMTDsKKyAgICBzZWxmLT5idWZfc2l6ZSA9IDA7CisgICAgc2VsZi0+ZGlzcGF0Y2hfdGFibGUgPSBOVUxMOwogCi0Jc2VsZi0+ZmlsZSA9IE5VTEw7Ci0JaWYgKGZpbGUpCi0JCVB5X0lOQ1JFRihmaWxlKTsKLQllbHNlIHsKLQkJZmlsZSA9IFBkYXRhX05ldygpOwotCQlpZiAoZmlsZSA9PSBOVUxMKQotCQkJZ290byBlcnI7Ci0JfQotCXNlbGYtPmZpbGUgPSBmaWxlOworICAgIHNlbGYtPmZpbGUgPSBOVUxMOworICAgIGlmIChmaWxlKQorICAgICAgICBQeV9JTkNSRUYoZmlsZSk7CisgICAgZWxzZSB7CisgICAgICAgIGZpbGUgPSBQZGF0YV9OZXcoKTsKKyAgICAgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBzZWxmLT5maWxlID0gZmlsZTsKIAotCWlmICghKCBzZWxmLT5tZW1vID0gUHlEaWN0X05ldygpKSkKLQkJZ290byBlcnI7CisgICAgaWYgKCEoIHNlbGYtPm1lbW8gPSBQeURpY3RfTmV3KCkpKQorICAgICAgICBnb3RvIGVycjsKIAotCWlmIChQeUZpbGVfQ2hlY2soZmlsZSkpIHsKLQkJc2VsZi0+ZnAgPSBQeUZpbGVfQXNGaWxlKGZpbGUpOwotCQlpZiAoc2VsZi0+ZnAgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlzZWxmLT53cml0ZV9mdW5jID0gd3JpdGVfZmlsZTsKLQl9Ci0JZWxzZSBpZiAoUHljU3RyaW5nSU9fT3V0cHV0Q2hlY2soZmlsZSkpIHsKLQkJc2VsZi0+d3JpdGVfZnVuYyA9IHdyaXRlX2NTdHJpbmdJTzsKLQl9Ci0JZWxzZSBpZiAoZmlsZSA9PSBQeV9Ob25lKSB7Ci0JCXNlbGYtPndyaXRlX2Z1bmMgPSB3cml0ZV9ub25lOwotCX0KLQllbHNlIHsKLQkJc2VsZi0+d3JpdGVfZnVuYyA9IHdyaXRlX290aGVyOworICAgIGlmIChQeUZpbGVfQ2hlY2soZmlsZSkpIHsKKyAgICAgICAgc2VsZi0+ZnAgPSBQeUZpbGVfQXNGaWxlKGZpbGUpOworICAgICAgICBpZiAoc2VsZi0+ZnAgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgICAgIHNlbGYtPndyaXRlX2Z1bmMgPSB3cml0ZV9maWxlOworICAgIH0KKyAgICBlbHNlIGlmIChQeWNTdHJpbmdJT19PdXRwdXRDaGVjayhmaWxlKSkgeworICAgICAgICBzZWxmLT53cml0ZV9mdW5jID0gd3JpdGVfY1N0cmluZ0lPOworICAgIH0KKyAgICBlbHNlIGlmIChmaWxlID09IFB5X05vbmUpIHsKKyAgICAgICAgc2VsZi0+d3JpdGVfZnVuYyA9IHdyaXRlX25vbmU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzZWxmLT53cml0ZV9mdW5jID0gd3JpdGVfb3RoZXI7CiAKLQkJaWYgKCEgUGRhdGFfQ2hlY2soZmlsZSkpIHsKLQkJCXNlbGYtPndyaXRlID0gUHlPYmplY3RfR2V0QXR0cihmaWxlLCB3cml0ZV9zdHIpOwotCQkJaWYgKCFzZWxmLT53cml0ZSkgIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkiYXJndW1lbnQgbXVzdCBoYXZlICd3cml0ZScgIgotCQkJCQkJImF0dHJpYnV0ZSIpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9CisgICAgICAgIGlmICghIFBkYXRhX0NoZWNrKGZpbGUpKSB7CisgICAgICAgICAgICBzZWxmLT53cml0ZSA9IFB5T2JqZWN0X0dldEF0dHIoZmlsZSwgd3JpdGVfc3RyKTsKKyAgICAgICAgICAgIGlmICghc2VsZi0+d3JpdGUpICB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgbXVzdCBoYXZlICd3cml0ZScgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIik7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlzZWxmLT53cml0ZV9idWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhXUklURV9CVUZfU0laRSk7Ci0JCWlmIChzZWxmLT53cml0ZV9idWYgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQorICAgICAgICBzZWxmLT53cml0ZV9idWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhXUklURV9CVUZfU0laRSk7CisgICAgICAgIGlmIChzZWxmLT53cml0ZV9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgfQogCi0JaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJLyogUmVzdHJpY3RlZCBleGVjdXRpb24sIGdldCBwcml2YXRlIHRhYmxlcyAqLwotCQlQeU9iamVjdCAqbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiY29weV9yZWciKTsKKyAgICBpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgeworICAgICAgICAvKiBSZXN0cmljdGVkIGV4ZWN1dGlvbiwgZ2V0IHByaXZhdGUgdGFibGVzICovCisgICAgICAgIFB5T2JqZWN0ICptID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJjb3B5X3JlZyIpOwogCi0JCWlmIChtID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQkJc2VsZi0+ZGlzcGF0Y2hfdGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKG0sIGRpc3BhdGNoX3RhYmxlX3N0cik7Ci0JCVB5X0RFQ1JFRihtKTsKLQkJaWYgKHNlbGYtPmRpc3BhdGNoX3RhYmxlID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQl9Ci0JZWxzZSB7Ci0JCXNlbGYtPmRpc3BhdGNoX3RhYmxlID0gZGlzcGF0Y2hfdGFibGU7Ci0JCVB5X0lOQ1JFRihkaXNwYXRjaF90YWJsZSk7Ci0JfQotCVB5T2JqZWN0X0dDX1RyYWNrKHNlbGYpOworICAgICAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIHNlbGYtPmRpc3BhdGNoX3RhYmxlID0gUHlPYmplY3RfR2V0QXR0cihtLCBkaXNwYXRjaF90YWJsZV9zdHIpOworICAgICAgICBQeV9ERUNSRUYobSk7CisgICAgICAgIGlmIChzZWxmLT5kaXNwYXRjaF90YWJsZSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzZWxmLT5kaXNwYXRjaF90YWJsZSA9IGRpc3BhdGNoX3RhYmxlOworICAgICAgICBQeV9JTkNSRUYoZGlzcGF0Y2hfdGFibGUpOworICAgIH0KKyAgICBQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKIAotCXJldHVybiBzZWxmOworICAgIHJldHVybiBzZWxmOwogCiAgIGVycjoKLQlQeV9ERUNSRUYoc2VsZik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHNlbGYpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfUGlja2xlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmlsZSIsICJwcm90b2NvbCIsIE5VTEx9OwotCVB5T2JqZWN0ICpmaWxlID0gTlVMTDsKLQlpbnQgcHJvdG8gPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmlsZSIsICJwcm90b2NvbCIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpmaWxlID0gTlVMTDsKKyAgICBpbnQgcHJvdG8gPSAwOwogCi0JLyogWFhYCi0JICogVGhlIGRvY3VtZW50ZWQgc2lnbmF0dXJlIGlzIFBpY2tsZXIoZmlsZSwgcHJvdG9jb2w9MCksIGJ1dCB0aGlzCi0JICogYWNjZXB0cyBQaWNrbGVyKCkgYW5kIFBpY2tsZXIoaW50ZWdlcikgdG9vLiAgVGhlIG1lYW5pbmcgdGhlbgotCSAqIGlzIGNsZWFyIGFzIG11ZCwgdW5kb2N1bWVudGVkLCBhbmQgbm90IHN1cHBvcnRlZCBieSBwaWNrbGUucHkuCi0JICogSSdtIHRvbGQgWm9wZSB1c2VzIHRoaXMsIGJ1dCBJIGhhdmVuJ3QgdHJhY2VkIGludG8gdGhpcyBjb2RlCi0JICogZmFyIGVub3VnaCB0byBmaWd1cmUgb3V0IHdoYXQgaXQgbWVhbnMuCi0JICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpQaWNrbGVyIiwgJnByb3RvKSkgewotCQlQeUVycl9DbGVhcigpOwotCQlwcm90byA9IDA7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfGk6UGlja2xlciIsCi0JCQkgICAga3dsaXN0LCAmZmlsZSwgJnByb3RvKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3UGlja2xlcm9iamVjdChmaWxlLCBwcm90byk7CisgICAgLyogWFhYCisgICAgICogVGhlIGRvY3VtZW50ZWQgc2lnbmF0dXJlIGlzIFBpY2tsZXIoZmlsZSwgcHJvdG9jb2w9MCksIGJ1dCB0aGlzCisgICAgICogYWNjZXB0cyBQaWNrbGVyKCkgYW5kIFBpY2tsZXIoaW50ZWdlcikgdG9vLiAgVGhlIG1lYW5pbmcgdGhlbgorICAgICAqIGlzIGNsZWFyIGFzIG11ZCwgdW5kb2N1bWVudGVkLCBhbmQgbm90IHN1cHBvcnRlZCBieSBwaWNrbGUucHkuCisgICAgICogSSdtIHRvbGQgWm9wZSB1c2VzIHRoaXMsIGJ1dCBJIGhhdmVuJ3QgdHJhY2VkIGludG8gdGhpcyBjb2RlCisgICAgICogZmFyIGVub3VnaCB0byBmaWd1cmUgb3V0IHdoYXQgaXQgbWVhbnMuCisgICAgICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpQaWNrbGVyIiwgJnByb3RvKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBwcm90byA9IDA7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfGk6UGlja2xlciIsCisgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmZpbGUsICZwcm90bykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld1BpY2tsZXJvYmplY3QoZmlsZSwgcHJvdG8pOwogfQogCiAKIHN0YXRpYyB2b2lkCiBQaWNrbGVyX2RlYWxsb2MoUGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOwotCVB5X1hERUNSRUYoc2VsZi0+d3JpdGUpOwotCVB5X1hERUNSRUYoc2VsZi0+bWVtbyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5mYXN0X21lbW8pOwotCVB5X1hERUNSRUYoc2VsZi0+YXJnKTsKLQlQeV9YREVDUkVGKHNlbGYtPmZpbGUpOwotCVB5X1hERUNSRUYoc2VsZi0+cGVyc19mdW5jKTsKLQlQeV9YREVDUkVGKHNlbGYtPmluc3RfcGVyc19mdW5jKTsKLQlQeV9YREVDUkVGKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKLQlQeU1lbV9GcmVlKHNlbGYtPndyaXRlX2J1Zik7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+d3JpdGUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+bWVtbyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5mYXN0X21lbW8pOworICAgIFB5X1hERUNSRUYoc2VsZi0+YXJnKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmZpbGUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cGVyc19mdW5jKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmluc3RfcGVyc19mdW5jKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKKyAgICBQeU1lbV9GcmVlKHNlbGYtPndyaXRlX2J1Zik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIGludAogUGlja2xlcl90cmF2ZXJzZShQaWNrbGVyb2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChzZWxmLT53cml0ZSk7Ci0JUHlfVklTSVQoc2VsZi0+bWVtbyk7Ci0JUHlfVklTSVQoc2VsZi0+ZmFzdF9tZW1vKTsKLQlQeV9WSVNJVChzZWxmLT5hcmcpOwotCVB5X1ZJU0lUKHNlbGYtPmZpbGUpOwotCVB5X1ZJU0lUKHNlbGYtPnBlcnNfZnVuYyk7Ci0JUHlfVklTSVQoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOwotCVB5X1ZJU0lUKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChzZWxmLT53cml0ZSk7CisgICAgUHlfVklTSVQoc2VsZi0+bWVtbyk7CisgICAgUHlfVklTSVQoc2VsZi0+ZmFzdF9tZW1vKTsKKyAgICBQeV9WSVNJVChzZWxmLT5hcmcpOworICAgIFB5X1ZJU0lUKHNlbGYtPmZpbGUpOworICAgIFB5X1ZJU0lUKHNlbGYtPnBlcnNfZnVuYyk7CisgICAgUHlfVklTSVQoc2VsZi0+aW5zdF9wZXJzX2Z1bmMpOworICAgIFB5X1ZJU0lUKHNlbGYtPmRpc3BhdGNoX3RhYmxlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogUGlja2xlcl9jbGVhcihQaWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5X0NMRUFSKHNlbGYtPndyaXRlKTsKLQlQeV9DTEVBUihzZWxmLT5tZW1vKTsKLQlQeV9DTEVBUihzZWxmLT5mYXN0X21lbW8pOwotCVB5X0NMRUFSKHNlbGYtPmFyZyk7Ci0JUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7Ci0JUHlfQ0xFQVIoc2VsZi0+cGVyc19mdW5jKTsKLQlQeV9DTEVBUihzZWxmLT5pbnN0X3BlcnNfZnVuYyk7Ci0JUHlfQ0xFQVIoc2VsZi0+ZGlzcGF0Y2hfdGFibGUpOwotCXJldHVybiAwOworICAgIFB5X0NMRUFSKHNlbGYtPndyaXRlKTsKKyAgICBQeV9DTEVBUihzZWxmLT5tZW1vKTsKKyAgICBQeV9DTEVBUihzZWxmLT5mYXN0X21lbW8pOworICAgIFB5X0NMRUFSKHNlbGYtPmFyZyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZmlsZSk7CisgICAgUHlfQ0xFQVIoc2VsZi0+cGVyc19mdW5jKTsKKyAgICBQeV9DTEVBUihzZWxmLT5pbnN0X3BlcnNfZnVuYyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZGlzcGF0Y2hfdGFibGUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUGlja2xlcl9nZXRfcGVyc19mdW5jKFBpY2tsZXJvYmplY3QgKnApCiB7Ci0JaWYgKHAtPnBlcnNfZnVuYyA9PSBOVUxMKQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJwZXJzaXN0ZW50X2lkIik7Ci0JZWxzZQotCQlQeV9JTkNSRUYocC0+cGVyc19mdW5jKTsKLQlyZXR1cm4gcC0+cGVyc19mdW5jOworICAgIGlmIChwLT5wZXJzX2Z1bmMgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAicGVyc2lzdGVudF9pZCIpOworICAgIGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKHAtPnBlcnNfZnVuYyk7CisgICAgcmV0dXJuIHAtPnBlcnNfZnVuYzsKIH0KIAogc3RhdGljIGludAogUGlja2xlcl9zZXRfcGVyc19mdW5jKFBpY2tsZXJvYmplY3QgKnAsIFB5T2JqZWN0ICp2KQogewotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXR0cmlidXRlIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9YREVDUkVGKHAtPnBlcnNfZnVuYyk7Ci0JUHlfSU5DUkVGKHYpOwotCXAtPnBlcnNfZnVuYyA9IHY7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihwLT5wZXJzX2Z1bmMpOworICAgIFB5X0lOQ1JFRih2KTsKKyAgICBwLT5wZXJzX2Z1bmMgPSB2OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBQaWNrbGVyX3NldF9pbnN0X3BlcnNfZnVuYyhQaWNrbGVyb2JqZWN0ICpwLCBQeU9iamVjdCAqdikKIHsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfWERFQ1JFRihwLT5pbnN0X3BlcnNfZnVuYyk7Ci0JUHlfSU5DUkVGKHYpOwotCXAtPmluc3RfcGVyc19mdW5jID0gdjsKLQlyZXR1cm4gMDsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9YREVDUkVGKHAtPmluc3RfcGVyc19mdW5jKTsKKyAgICBQeV9JTkNSRUYodik7CisgICAgcC0+aW5zdF9wZXJzX2Z1bmMgPSB2OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUGlja2xlcl9nZXRfbWVtbyhQaWNrbGVyb2JqZWN0ICpwKQogewotCWlmIChwLT5tZW1vID09IE5VTEwpCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIm1lbW8iKTsKLQllbHNlCi0JCVB5X0lOQ1JFRihwLT5tZW1vKTsKLQlyZXR1cm4gcC0+bWVtbzsKKyAgICBpZiAocC0+bWVtbyA9PSBOVUxMKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJtZW1vIik7CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYocC0+bWVtbyk7CisgICAgcmV0dXJuIHAtPm1lbW87CiB9CiAKIHN0YXRpYyBpbnQKIFBpY2tsZXJfc2V0X21lbW8oUGlja2xlcm9iamVjdCAqcCwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghUHlEaWN0X0NoZWNrKHYpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtZW1vIG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfWERFQ1JFRihwLT5tZW1vKTsKLQlQeV9JTkNSRUYodik7Ci0JcC0+bWVtbyA9IHY7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFQeURpY3RfQ2hlY2sodikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1lbW8gbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9YREVDUkVGKHAtPm1lbW8pOworICAgIFB5X0lOQ1JFRih2KTsKKyAgICBwLT5tZW1vID0gdjsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFBpY2tsZXJfZ2V0X2Vycm9yKFBpY2tsZXJvYmplY3QgKnApCiB7Ci0JLyogd2h5IGlzIHRoaXMgYW4gYXR0cmlidXRlIG9uIHRoZSBQaWNrbGVyPyAqLwotCVB5X0lOQ1JFRihQaWNrbGluZ0Vycm9yKTsKLQlyZXR1cm4gUGlja2xpbmdFcnJvcjsKKyAgICAvKiB3aHkgaXMgdGhpcyBhbiBhdHRyaWJ1dGUgb24gdGhlIFBpY2tsZXI/ICovCisgICAgUHlfSU5DUkVGKFBpY2tsaW5nRXJyb3IpOworICAgIHJldHVybiBQaWNrbGluZ0Vycm9yOwogfQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgUGlja2xlcl9tZW1iZXJzW10gPSB7CkBAIC0zMTc0LDE0MyArMzE3NCwxNDMgQEAKICAgICAiY1BpY2tsZS5QaWNrbGVyIiwgICAgICAgICAgICAvKnRwX25hbWUqLwogICAgIHNpemVvZihQaWNrbGVyb2JqZWN0KSwgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KICAgICAwLAotICAgIChkZXN0cnVjdG9yKVBpY2tsZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotICAgIDAsCQkJCQkvKiB0cF9wcmludCAqLwotICAgIDAsCQkJIAkJLyogdHBfZ2V0YXR0ciAqLwotICAgIDAsCQkJIAkJLyogdHBfc2V0YXR0ciAqLwotICAgIDAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0gICAgMCwJCSAJCQkvKiB0cF9yZXByICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwJCQkJCS8qIHRwX2hhc2ggKi8KLSAgICAwLAkJCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJCQkvKiB0cF9zdHIgKi8KLSAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0gICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsCQkvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KKyAgICAoZGVzdHJ1Y3RvcilQaWNrbGVyX2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywKLSAgICBQaWNrbGVydHlwZV9fZG9jX18sCQkJLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYylQaWNrbGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotICAgIChpbnF1aXJ5KVBpY2tsZXJfY2xlYXIsCQkvKiB0cF9jbGVhciAqLwotICAgIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotICAgIDAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotICAgIDAsCQkJCQkvKiB0cF9pdGVyICovCi0gICAgMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0gICAgUGlja2xlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLSAgICBQaWNrbGVyX21lbWJlcnMsCQkJLyogdHBfbWVtYmVycyAqLwotICAgIFBpY2tsZXJfZ2V0c2V0cywJCQkvKiB0cF9nZXRzZXQgKi8KKyAgICBQaWNrbGVydHlwZV9fZG9jX18sICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKVBpY2tsZXJfdHJhdmVyc2UsICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KVBpY2tsZXJfY2xlYXIsICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIFBpY2tsZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBQaWNrbGVyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgUGlja2xlcl9nZXRzZXRzLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZmluZF9jbGFzcyhQeU9iamVjdCAqcHlfbW9kdWxlX25hbWUsIFB5T2JqZWN0ICpweV9nbG9iYWxfbmFtZSwgUHlPYmplY3QgKmZjKQogewotCVB5T2JqZWN0ICpnbG9iYWwgPSAwLCAqbW9kdWxlOworICAgIFB5T2JqZWN0ICpnbG9iYWwgPSAwLCAqbW9kdWxlOwogCi0JaWYgKGZjKSB7Ci0JCWlmIChmYz09UHlfTm9uZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgIkdsb2JhbCBhbmQgaW5zdGFuY2UgIgotCQkJCQkicGlja2xlcyBhcmUgbm90IHN1cHBvcnRlZC4iKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZjLCBweV9tb2R1bGVfbmFtZSwKLQkJCQkJICAgICAgICAgICAgcHlfZ2xvYmFsX25hbWUsIE5VTEwpOwotCX0KKyAgICBpZiAoZmMpIHsKKyAgICAgICAgaWYgKGZjPT1QeV9Ob25lKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiR2xvYmFsIGFuZCBpbnN0YW5jZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBpY2tsZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmYywgcHlfbW9kdWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X2dsb2JhbF9uYW1lLCBOVUxMKTsKKyAgICB9CiAKLQltb2R1bGUgPSBQeVN5c19HZXRPYmplY3QoIm1vZHVsZXMiKTsKLQlpZiAobW9kdWxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG1vZHVsZSA9IFB5U3lzX0dldE9iamVjdCgibW9kdWxlcyIpOworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQltb2R1bGUgPSBQeURpY3RfR2V0SXRlbShtb2R1bGUsIHB5X21vZHVsZV9uYW1lKTsKLQlpZiAobW9kdWxlID09IE5VTEwpIHsKLQkJbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0KHB5X21vZHVsZV9uYW1lKTsKLQkJaWYgKCFtb2R1bGUpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZ2xvYmFsID0gUHlPYmplY3RfR2V0QXR0cihtb2R1bGUsIHB5X2dsb2JhbF9uYW1lKTsKLQkJUHlfREVDUkVGKG1vZHVsZSk7Ci0JfQotCWVsc2UKLQkJZ2xvYmFsID0gUHlPYmplY3RfR2V0QXR0cihtb2R1bGUsIHB5X2dsb2JhbF9uYW1lKTsKLQlyZXR1cm4gZ2xvYmFsOworICAgIG1vZHVsZSA9IFB5RGljdF9HZXRJdGVtKG1vZHVsZSwgcHlfbW9kdWxlX25hbWUpOworICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICBtb2R1bGUgPSBQeUltcG9ydF9JbXBvcnQocHlfbW9kdWxlX25hbWUpOworICAgICAgICBpZiAoIW1vZHVsZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnbG9iYWwgPSBQeU9iamVjdF9HZXRBdHRyKG1vZHVsZSwgcHlfZ2xvYmFsX25hbWUpOworICAgICAgICBQeV9ERUNSRUYobW9kdWxlKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBnbG9iYWwgPSBQeU9iamVjdF9HZXRBdHRyKG1vZHVsZSwgcHlfZ2xvYmFsX25hbWUpOworICAgIHJldHVybiBnbG9iYWw7CiB9CiAKIHN0YXRpYyBpbnQKIG1hcmtlcihVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm51bV9tYXJrcyA8IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgImNvdWxkIG5vdCBmaW5kIE1BUksiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoc2VsZi0+bnVtX21hcmtzIDwgMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiY291bGQgbm90IGZpbmQgTUFSSyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmV0dXJuIHNlbGYtPm1hcmtzWy0tc2VsZi0+bnVtX21hcmtzXTsKKyAgICByZXR1cm4gc2VsZi0+bWFya3NbLS1zZWxmLT5udW1fbWFya3NdOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfbm9uZShVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGJhZF9yZWFkbGluZSh2b2lkKQogewotCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJwaWNrbGUgZGF0YSB3YXMgdHJ1bmNhdGVkIik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJwaWNrbGUgZGF0YSB3YXMgdHJ1bmNhdGVkIik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX2ludChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X2ludCA9IDA7Ci0JY2hhciAqZW5kcHRyLCAqczsKLQlpbnQgbGVuLCByZXMgPSAtMTsKLQlsb25nIGw7CisgICAgUHlPYmplY3QgKnB5X2ludCA9IDA7CisgICAgY2hhciAqZW5kcHRyLCAqczsKKyAgICBpbnQgbGVuLCByZXMgPSAtMTsKKyAgICBsb25nIGw7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotCWlmICghKCBzPXB5c3RybmR1cChzLGxlbikpKSAgcmV0dXJuIC0xOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgaWYgKCEoIHM9cHlzdHJuZHVwKHMsbGVuKSkpICByZXR1cm4gLTE7CiAKLQllcnJubyA9IDA7Ci0JbCA9IHN0cnRvbChzLCAmZW5kcHRyLCAwKTsKKyAgICBlcnJubyA9IDA7CisgICAgbCA9IHN0cnRvbChzLCAmZW5kcHRyLCAwKTsKIAotCWlmIChlcnJubyB8fCAoKmVuZHB0ciAhPSAnXG4nKSB8fCAoZW5kcHRyWzFdICE9ICdcMCcpKSB7Ci0JCS8qIEhtLCBtYXliZSB3ZSd2ZSBnb3Qgc29tZXRoaW5nIGxvbmcuICBMZXQncyB0cnkgcmVhZGluZwotCQkgICBpdCBhcyBhIFB5dGhvbiBsb25nIG9iamVjdC4gKi8KLQkJZXJybm8gPSAwOwotCQlweV9pbnQgPSBQeUxvbmdfRnJvbVN0cmluZyhzLCBOVUxMLCAwKTsKLQkJaWYgKHB5X2ludCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJImNvdWxkIG5vdCBjb252ZXJ0IHN0cmluZyB0byBpbnQiKTsKLQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KLQllbHNlIHsKLQkJaWYgKGxlbiA9PSAzICYmIChsID09IDAgfHwgbCA9PSAxKSkgewotCQkJaWYgKCEoIHB5X2ludCA9IFB5Qm9vbF9Gcm9tTG9uZyhsKSkpICBnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoISggcHlfaW50ID0gUHlJbnRfRnJvbUxvbmcobCkpKSAgZ290byBmaW5hbGx5OwotCQl9Ci0JfQorICAgIGlmIChlcnJubyB8fCAoKmVuZHB0ciAhPSAnXG4nKSB8fCAoZW5kcHRyWzFdICE9ICdcMCcpKSB7CisgICAgICAgIC8qIEhtLCBtYXliZSB3ZSd2ZSBnb3Qgc29tZXRoaW5nIGxvbmcuICBMZXQncyB0cnkgcmVhZGluZworICAgICAgICAgICBpdCBhcyBhIFB5dGhvbiBsb25nIG9iamVjdC4gKi8KKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBweV9pbnQgPSBQeUxvbmdfRnJvbVN0cmluZyhzLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKHB5X2ludCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGludCIpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobGVuID09IDMgJiYgKGwgPT0gMCB8fCBsID09IDEpKSB7CisgICAgICAgICAgICBpZiAoISggcHlfaW50ID0gUHlCb29sX0Zyb21Mb25nKGwpKSkgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKCBweV9pbnQgPSBQeUludF9Gcm9tTG9uZyhsKSkpICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CiAKLQlmcmVlKHMpOwotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHB5X2ludCwgLTEpOwotCXJldHVybiAwOworICAgIGZyZWUocyk7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfaW50LCAtMSk7CisgICAgcmV0dXJuIDA7CiAKICAgZmluYWxseToKLQlmcmVlKHMpOworICAgIGZyZWUocyk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfYm9vbChVbnBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpib29sZWFuKQogewotCWFzc2VydChib29sZWFuID09IFB5X1RydWUgfHwgYm9vbGVhbiA9PSBQeV9GYWxzZSk7Ci0JUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBib29sZWFuLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgYXNzZXJ0KGJvb2xlYW4gPT0gUHlfVHJ1ZSB8fCBib29sZWFuID09IFB5X0ZhbHNlKTsKKyAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIGJvb2xlYW4sIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogcyBjb250YWlucyB4IGJ5dGVzIG9mIGEgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyLiAgUmV0dXJuIGl0cyB2YWx1ZSBhcyBhCkBAIC0zMzIxLDk5ICszMzIxLDk5IEBACiBzdGF0aWMgbG9uZwogY2FsY19iaW5pbnQoY2hhciAqcywgaW50IHgpCiB7Ci0JdW5zaWduZWQgY2hhciBjOwotCWludCBpOwotCWxvbmcgbDsKKyAgICB1bnNpZ25lZCBjaGFyIGM7CisgICAgaW50IGk7CisgICAgbG9uZyBsOwogCi0JZm9yIChpID0gMCwgbCA9IDBMOyBpIDwgeDsgaSsrKSB7Ci0JCWMgPSAodW5zaWduZWQgY2hhcilzW2ldOwotCQlsIHw9IChsb25nKWMgPDwgKGkgKiA4KTsKLQl9CisgICAgZm9yIChpID0gMCwgbCA9IDBMOyBpIDwgeDsgaSsrKSB7CisgICAgICAgIGMgPSAodW5zaWduZWQgY2hhcilzW2ldOworICAgICAgICBsIHw9IChsb25nKWMgPDwgKGkgKiA4KTsKKyAgICB9CiAjaWYgU0laRU9GX0xPTkcgPiA0Ci0JLyogVW5saWtlIEJJTklOVDEgYW5kIEJJTklOVDIsIEJJTklOVCAobW9yZSBhY2N1cmF0ZWx5IEJJTklOVDQpCi0JICogaXMgc2lnbmVkLCBzbyBvbiBhIGJveCB3aXRoIGxvbmdzIGJpZ2dlciB0aGFuIDQgYnl0ZXMgd2UgbmVlZAotCSAqIHRvIGV4dGVuZCBhIEJJTklOVCdzIHNpZ24gYml0IHRvIHRoZSBmdWxsIHdpZHRoLgotCSAqLwotCWlmICh4ID09IDQgJiYgbCAmICgxTCA8PCAzMSkpCi0JCWwgfD0gKH4wTCkgPDwgMzI7CisgICAgLyogVW5saWtlIEJJTklOVDEgYW5kIEJJTklOVDIsIEJJTklOVCAobW9yZSBhY2N1cmF0ZWx5IEJJTklOVDQpCisgICAgICogaXMgc2lnbmVkLCBzbyBvbiBhIGJveCB3aXRoIGxvbmdzIGJpZ2dlciB0aGFuIDQgYnl0ZXMgd2UgbmVlZAorICAgICAqIHRvIGV4dGVuZCBhIEJJTklOVCdzIHNpZ24gYml0IHRvIHRoZSBmdWxsIHdpZHRoLgorICAgICAqLworICAgIGlmICh4ID09IDQgJiYgbCAmICgxTCA8PCAzMSkpCisgICAgICAgIGwgfD0gKH4wTCkgPDwgMzI7CiAjZW5kaWYKLQlyZXR1cm4gbDsKKyAgICByZXR1cm4gbDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2JpbmludHgoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBjaGFyICpzLCBpbnQgIHgpCiB7Ci0JUHlPYmplY3QgKnB5X2ludCA9IDA7Ci0JbG9uZyBsOworICAgIFB5T2JqZWN0ICpweV9pbnQgPSAwOworICAgIGxvbmcgbDsKIAotCWwgPSBjYWxjX2JpbmludChzLCB4KTsKKyAgICBsID0gY2FsY19iaW5pbnQocywgeCk7CiAKLQlpZiAoISggcHlfaW50ID0gUHlJbnRfRnJvbUxvbmcobCkpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoIHB5X2ludCA9IFB5SW50X0Zyb21Mb25nKGwpKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfaW50LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfaW50LCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9iaW5pbnQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWNoYXIgKnM7CisgICAgY2hhciAqczsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcmV0dXJuIGxvYWRfYmluaW50eChzZWxmLCBzLCA0KTsKKyAgICByZXR1cm4gbG9hZF9iaW5pbnR4KHNlbGYsIHMsIDQpOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfYmluaW50MShVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqczsKKyAgICBjaGFyICpzOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlyZXR1cm4gbG9hZF9iaW5pbnR4KHNlbGYsIHMsIDEpOworICAgIHJldHVybiBsb2FkX2JpbmludHgoc2VsZiwgcywgMSk7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9iaW5pbnQyKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQljaGFyICpzOworICAgIGNoYXIgKnM7CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAyKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAyKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCXJldHVybiBsb2FkX2JpbmludHgoc2VsZiwgcywgMik7CisgICAgcmV0dXJuIGxvYWRfYmluaW50eChzZWxmLCBzLCAyKTsKIH0KIAogc3RhdGljIGludAogbG9hZF9sb25nKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqbCA9IDA7Ci0JY2hhciAqZW5kLCAqczsKLQlpbnQgbGVuLCByZXMgPSAtMTsKKyAgICBQeU9iamVjdCAqbCA9IDA7CisgICAgY2hhciAqZW5kLCAqczsKKyAgICBpbnQgbGVuLCByZXMgPSAtMTsKIAotCWlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOwotCWlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0JaWYgKCEoIHM9cHlzdHJuZHVwKHMsbGVuKSkpICByZXR1cm4gLTE7CisgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICBpZiAoISggcz1weXN0cm5kdXAocyxsZW4pKSkgIHJldHVybiAtMTsKIAotCWlmICghKCBsID0gUHlMb25nX0Zyb21TdHJpbmcocywgJmVuZCwgMCkpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIGwgPSBQeUxvbmdfRnJvbVN0cmluZyhzLCAmZW5kLCAwKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWZyZWUocyk7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgbCwgLTEpOwotCXJldHVybiAwOworICAgIGZyZWUocyk7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgbCwgLTEpOworICAgIHJldHVybiAwOwogCiAgIGZpbmFsbHk6Ci0JZnJlZShzKTsKKyAgICBmcmVlKHMpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiAnc2l6ZScgYnl0ZXMgY29udGFpbiB0aGUgIyBvZiBieXRlcyBvZiBsaXR0bGUtZW5kaWFuIDI1NidzLWNvbXBsZW1lbnQKQEAgLTM0MjIsMTg3ICszNDIyLDE4NyBAQAogc3RhdGljIGludAogbG9hZF9jb3VudGVkX2xvbmcoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBpbnQgc2l6ZSkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JY2hhciAqbmJ5dGVzOwotCXVuc2lnbmVkIGNoYXIgKnBkYXRhOwotCVB5T2JqZWN0ICphbG9uZzsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgY2hhciAqbmJ5dGVzOworICAgIHVuc2lnbmVkIGNoYXIgKnBkYXRhOworICAgIFB5T2JqZWN0ICphbG9uZzsKIAotCWFzc2VydChzaXplID09IDEgfHwgc2l6ZSA9PSA0KTsKLQlpID0gc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZuYnl0ZXMsIHNpemUpOwotCWlmIChpIDwgMCkgcmV0dXJuIC0xOworICAgIGFzc2VydChzaXplID09IDEgfHwgc2l6ZSA9PSA0KTsKKyAgICBpID0gc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZuYnl0ZXMsIHNpemUpOworICAgIGlmIChpIDwgMCkgcmV0dXJuIC0xOwogCi0Jc2l6ZSA9IGNhbGNfYmluaW50KG5ieXRlcywgc2l6ZSk7Ci0JaWYgKHNpemUgPCAwKSB7Ci0JCS8qIENvcnJ1cHQgb3IgaG9zdGlsZSBwaWNrbGUgLS0gd2UgbmV2ZXIgd3JpdGUgb25lIGxpa2UKLQkJICogdGhpcy4KLQkJICovCi0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJMT05HIHBpY2tsZSBoYXMgbmVnYXRpdmUgIgotCQkJCSJieXRlIGNvdW50Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgc2l6ZSA9IGNhbGNfYmluaW50KG5ieXRlcywgc2l6ZSk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIC8qIENvcnJ1cHQgb3IgaG9zdGlsZSBwaWNrbGUgLS0gd2UgbmV2ZXIgd3JpdGUgb25lIGxpa2UKKyAgICAgICAgICogdGhpcy4KKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJMT05HIHBpY2tsZSBoYXMgbmVnYXRpdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGUgY291bnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChzaXplID09IDApCi0JCWFsb25nID0gUHlMb25nX0Zyb21Mb25nKDBMKTsKLQllbHNlIHsKLQkJLyogUmVhZCB0aGUgcmF3IGxpdHRsZS1lbmRpYW4gYnl0ZXMgJiBjb252ZXJ0LiAqLwotCQlpID0gc2VsZi0+cmVhZF9mdW5jKHNlbGYsIChjaGFyICoqKSZwZGF0YSwgc2l6ZSk7Ci0JCWlmIChpIDwgMCkgcmV0dXJuIC0xOwotCQlhbG9uZyA9IF9QeUxvbmdfRnJvbUJ5dGVBcnJheShwZGF0YSwgKHNpemVfdClzaXplLAotCQkJCTEgLyogbGl0dGxlIGVuZGlhbiAqLywgMSAvKiBzaWduZWQgKi8pOwotCX0KLQlpZiAoYWxvbmcgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGFsb25nLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgYWxvbmcgPSBQeUxvbmdfRnJvbUxvbmcoMEwpOworICAgIGVsc2UgeworICAgICAgICAvKiBSZWFkIHRoZSByYXcgbGl0dGxlLWVuZGlhbiBieXRlcyAmIGNvbnZlcnQuICovCisgICAgICAgIGkgPSBzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgKGNoYXIgKiopJnBkYXRhLCBzaXplKTsKKyAgICAgICAgaWYgKGkgPCAwKSByZXR1cm4gLTE7CisgICAgICAgIGFsb25nID0gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KHBkYXRhLCAoc2l6ZV90KXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAxIC8qIGxpdHRsZSBlbmRpYW4gKi8sIDEgLyogc2lnbmVkICovKTsKKyAgICB9CisgICAgaWYgKGFsb25nID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBhbG9uZywgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX2Zsb2F0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfZmxvYXQgPSAwOwotCWNoYXIgKmVuZHB0ciwgKnM7Ci0JaW50IGxlbiwgcmVzID0gLTE7Ci0JZG91YmxlIGQ7CisgICAgUHlPYmplY3QgKnB5X2Zsb2F0ID0gMDsKKyAgICBjaGFyICplbmRwdHIsICpzOworICAgIGludCBsZW4sIHJlcyA9IC0xOworICAgIGRvdWJsZSBkOwogCi0JaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKLQlpZiAoISggcz1weXN0cm5kdXAocyxsZW4pKSkgIHJldHVybiAtMTsKKyAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOworICAgIGlmICghKCBzPXB5c3RybmR1cChzLGxlbikpKSAgcmV0dXJuIC0xOwogCi0JZXJybm8gPSAwOwotCWQgPSBQeU9TX2FzY2lpX3N0cnRvZChzLCAmZW5kcHRyKTsKKyAgICBlcnJubyA9IDA7CisgICAgZCA9IFB5T1NfYXNjaWlfc3RydG9kKHMsICZlbmRwdHIpOwogCi0JaWYgKChlcnJubyA9PSBFUkFOR0UgJiYgIShmYWJzKGQpIDw9IDEuMCkpIHx8Ci0JICAgIChlbmRwdHJbMF0gIT0gJ1xuJykgfHwgKGVuZHB0clsxXSAhPSAnXDAnKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY291bGQgbm90IGNvbnZlcnQgc3RyaW5nIHRvIGZsb2F0Iik7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKChlcnJubyA9PSBFUkFOR0UgJiYgIShmYWJzKGQpIDw9IDEuMCkpIHx8CisgICAgICAgIChlbmRwdHJbMF0gIT0gJ1xuJykgfHwgKGVuZHB0clsxXSAhPSAnXDAnKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY29udmVydCBzdHJpbmcgdG8gZmxvYXQiKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmICghKCBweV9mbG9hdCA9IFB5RmxvYXRfRnJvbURvdWJsZShkKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggcHlfZmxvYXQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoZCkpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlmcmVlKHMpOwotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHB5X2Zsb2F0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgZnJlZShzKTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9mbG9hdCwgLTEpOworICAgIHJldHVybiAwOwogCiAgIGZpbmFsbHk6Ci0JZnJlZShzKTsKKyAgICBmcmVlKHMpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX2JpbmZsb2F0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfZmxvYXQ7Ci0JZG91YmxlIHg7Ci0JY2hhciAqcDsKKyAgICBQeU9iamVjdCAqcHlfZmxvYXQ7CisgICAgZG91YmxlIHg7CisgICAgY2hhciAqcDsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnAsIDgpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnAsIDgpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JeCA9IF9QeUZsb2F0X1VucGFjazgoKHVuc2lnbmVkIGNoYXIgKilwLCAwKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKKyAgICB4ID0gX1B5RmxvYXRfVW5wYWNrOCgodW5zaWduZWQgY2hhciAqKXAsIDApOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JcHlfZmxvYXQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Ci0JaWYgKHB5X2Zsb2F0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBweV9mbG9hdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKyAgICBpZiAocHlfZmxvYXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcHlfZmxvYXQsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9mbG9hdCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX3N0cmluZyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnN0ciA9IDA7Ci0JaW50IGxlbiwgcmVzID0gLTE7Ci0JY2hhciAqcywgKnA7CisgICAgUHlPYmplY3QgKnN0ciA9IDA7CisgICAgaW50IGxlbiwgcmVzID0gLTE7CisgICAgY2hhciAqcywgKnA7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotCWlmICghKCBzPXB5c3RybmR1cChzLGxlbikpKSAgcmV0dXJuIC0xOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgaWYgKCEoIHM9cHlzdHJuZHVwKHMsbGVuKSkpICByZXR1cm4gLTE7CiAKIAotCS8qIFN0cmlwIG91dGVybW9zdCBxdW90ZXMgKi8KLQl3aGlsZSAoc1tsZW4tMV0gPD0gJyAnKQotCQlsZW4tLTsKLQlpZihzWzBdPT0nIicgJiYgc1tsZW4tMV09PSciJyl7Ci0JCXNbbGVuLTFdID0gJ1wwJzsKLQkJcCA9IHMgKyAxIDsKLQkJbGVuIC09IDI7Ci0JfSBlbHNlIGlmKHNbMF09PSdcJycgJiYgc1tsZW4tMV09PSdcJycpewotCQlzW2xlbi0xXSA9ICdcMCc7Ci0JCXAgPSBzICsgMSA7Ci0JCWxlbiAtPSAyOwotCX0gZWxzZQotCQlnb3RvIGluc2VjdXJlOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBTdHJpcCBvdXRlcm1vc3QgcXVvdGVzICovCisgICAgd2hpbGUgKHNbbGVuLTFdIDw9ICcgJykKKyAgICAgICAgbGVuLS07CisgICAgaWYoc1swXT09JyInICYmIHNbbGVuLTFdPT0nIicpeworICAgICAgICBzW2xlbi0xXSA9ICdcMCc7CisgICAgICAgIHAgPSBzICsgMSA7CisgICAgICAgIGxlbiAtPSAyOworICAgIH0gZWxzZSBpZihzWzBdPT0nXCcnICYmIHNbbGVuLTFdPT0nXCcnKXsKKyAgICAgICAgc1tsZW4tMV0gPSAnXDAnOworICAgICAgICBwID0gcyArIDEgOworICAgICAgICBsZW4gLT0gMjsKKyAgICB9IGVsc2UKKyAgICAgICAgZ290byBpbnNlY3VyZTsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQlzdHIgPSBQeVN0cmluZ19EZWNvZGVFc2NhcGUocCwgbGVuLCBOVUxMLCAwLCBOVUxMKTsKLQlmcmVlKHMpOwotCWlmIChzdHIpIHsKLQkJUERBVEFfUFVTSChzZWxmLT5zdGFjaywgc3RyLCAtMSk7Ci0JCXJlcyA9IDA7Ci0JfQotCXJldHVybiByZXM7CisgICAgc3RyID0gUHlTdHJpbmdfRGVjb2RlRXNjYXBlKHAsIGxlbiwgTlVMTCwgMCwgTlVMTCk7CisgICAgZnJlZShzKTsKKyAgICBpZiAoc3RyKSB7CisgICAgICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHN0ciwgLTEpOworICAgICAgICByZXMgPSAwOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogCiAgIGluc2VjdXJlOgotCWZyZWUocyk7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsImluc2VjdXJlIHN0cmluZyBwaWNrbGUiKTsKLQlyZXR1cm4gLTE7CisgICAgZnJlZShzKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwiaW5zZWN1cmUgc3RyaW5nIHBpY2tsZSIpOworICAgIHJldHVybiAtMTsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2JpbnN0cmluZyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X3N0cmluZyA9IDA7Ci0JbG9uZyBsOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKnB5X3N0cmluZyA9IDA7CisgICAgbG9uZyBsOworICAgIGNoYXIgKnM7CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCA0KSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCA0KSA8IDApIHJldHVybiAtMTsKIAotCWwgPSBjYWxjX2JpbmludChzLCA0KTsKLQlpZiAobCA8IDApIHsKLQkJLyogQ29ycnVwdCBvciBob3N0aWxlIHBpY2tsZSAtLSB3ZSBuZXZlciB3cml0ZSBvbmUgbGlrZQotCQkgKiB0aGlzLgotCQkgKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwKLQkJCQkiQklOU1RSSU5HIHBpY2tsZSBoYXMgbmVnYXRpdmUgYnl0ZSBjb3VudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGwgPSBjYWxjX2JpbmludChzLCA0KTsKKyAgICBpZiAobCA8IDApIHsKKyAgICAgICAgLyogQ29ycnVwdCBvciBob3N0aWxlIHBpY2tsZSAtLSB3ZSBuZXZlciB3cml0ZSBvbmUgbGlrZQorICAgICAgICAgKiB0aGlzLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCSU5TVFJJTkcgcGlja2xlIGhhcyBuZWdhdGl2ZSBieXRlIGNvdW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCBsKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCBsKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghKCBweV9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsKSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoISggcHlfc3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9zdHJpbmcsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9zdHJpbmcsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX3Nob3J0X2JpbnN0cmluZyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X3N0cmluZyA9IDA7Ci0JdW5zaWduZWQgY2hhciBsOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKnB5X3N0cmluZyA9IDA7CisgICAgdW5zaWduZWQgY2hhciBsOworICAgIGNoYXIgKnM7CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWwgPSAodW5zaWduZWQgY2hhcilzWzBdOworICAgIGwgPSAodW5zaWduZWQgY2hhcilzWzBdOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgbCkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgbCkgPCAwKSByZXR1cm4gLTE7CiAKLQlpZiAoISggcHlfc3RyaW5nID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbCkpKSAgcmV0dXJuIC0xOworICAgIGlmICghKCBweV9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsKSkpICByZXR1cm4gLTE7CiAKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9zdHJpbmcsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBweV9zdHJpbmcsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0zNjEwLDIxICszNjEwLDIxIEBACiBzdGF0aWMgaW50CiBsb2FkX3VuaWNvZGUoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpzdHIgPSAwOwotCWludCBsZW4sIHJlcyA9IC0xOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKnN0ciA9IDA7CisgICAgaW50IGxlbiwgcmVzID0gLTE7CisgICAgY2hhciAqczsKIAotCWlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOwotCWlmIChsZW4gPCAxKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGxlbiA8IDEpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKIAotCWlmICghKCBzdHIgPSBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZShzLCBsZW4gLSAxLCBOVUxMKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggc3RyID0gUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUocywgbGVuIC0gMSwgTlVMTCkpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBzdHIsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBzdHIsIC0xKTsKKyAgICByZXR1cm4gMDsKIAogICBmaW5hbGx5OgotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KICNlbmRpZgogCkBAIC0zNjMzLDMwICszNjMzLDMwIEBACiBzdGF0aWMgaW50CiBsb2FkX2JpbnVuaWNvZGUoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp1bmljb2RlOwotCWxvbmcgbDsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICp1bmljb2RlOworICAgIGxvbmcgbDsKKyAgICBjaGFyICpzOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CiAKLQlsID0gY2FsY19iaW5pbnQocywgNCk7Ci0JaWYgKGwgPCAwKSB7Ci0JCS8qIENvcnJ1cHQgb3IgaG9zdGlsZSBwaWNrbGUgLS0gd2UgbmV2ZXIgd3JpdGUgb25lIGxpa2UKLQkJICogdGhpcy4KLQkJICovCi0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsCi0JCQkJIkJJTlVOSUNPREUgcGlja2xlIGhhcyBuZWdhdGl2ZSBieXRlIGNvdW50Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgbCA9IGNhbGNfYmluaW50KHMsIDQpOworICAgIGlmIChsIDwgMCkgeworICAgICAgICAvKiBDb3JydXB0IG9yIGhvc3RpbGUgcGlja2xlIC0tIHdlIG5ldmVyIHdyaXRlIG9uZSBsaWtlCisgICAgICAgICAqIHRoaXMuCisgICAgICAgICAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJJTlVOSUNPREUgcGlja2xlIGhhcyBuZWdhdGl2ZSBieXRlIGNvdW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCBsKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCBsKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghKCB1bmljb2RlID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgbCwgTlVMTCkpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoIHVuaWNvZGUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCBsLCBOVUxMKSkpCisgICAgICAgIHJldHVybiAtMTsKIAotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHVuaWNvZGUsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCB1bmljb2RlLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApAQCAtMzY2NCw1MDQgKzM2NjQsNTA0IEBACiBzdGF0aWMgaW50CiBsb2FkX3R1cGxlKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdHVwOwotCWludCBpOworICAgIFB5T2JqZWN0ICp0dXA7CisgICAgaW50IGk7CiAKLQlpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwotCWlmICghKCB0dXA9UGRhdGFfcG9wVHVwbGUoc2VsZi0+c3RhY2ssIGkpKSkgIHJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCB0dXAsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmICghKCB0dXA9UGRhdGFfcG9wVHVwbGUoc2VsZi0+c3RhY2ssIGkpKSkgIHJldHVybiAtMTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCB0dXAsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbG9hZF9jb3VudGVkX3R1cGxlKFVucGlja2xlcm9iamVjdCAqc2VsZiwgaW50IGxlbikKIHsKLQlQeU9iamVjdCAqdHVwID0gUHlUdXBsZV9OZXcobGVuKTsKKyAgICBQeU9iamVjdCAqdHVwID0gUHlUdXBsZV9OZXcobGVuKTsKIAotCWlmICh0dXAgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGlmICh0dXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0Jd2hpbGUgKC0tbGVuID49IDApIHsKLQkJUHlPYmplY3QgKmVsZW1lbnQ7CisgICAgd2hpbGUgKC0tbGVuID49IDApIHsKKyAgICAgICAgUHlPYmplY3QgKmVsZW1lbnQ7CiAKLQkJUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlUdXBsZV9TRVRfSVRFTSh0dXAsIGxlbiwgZWxlbWVudCk7Ci0JfQotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHR1cCwgLTEpOwotCXJldHVybiAwOworICAgICAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGVsZW1lbnQpOworICAgICAgICBpZiAoZWxlbWVudCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cCwgbGVuLCBlbGVtZW50KTsKKyAgICB9CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgdHVwLCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfZW1wdHlfbGlzdChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmxpc3Q7CisgICAgUHlPYmplY3QgKmxpc3Q7CiAKLQlpZiAoISggbGlzdD1QeUxpc3RfTmV3KDApKSkgIHJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBsaXN0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCEoIGxpc3Q9UHlMaXN0X05ldygwKSkpICByZXR1cm4gLTE7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgbGlzdCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX2VtcHR5X2RpY3QoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICpkaWN0OwogCi0JaWYgKCEoIGRpY3Q9UHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBkaWN0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCEoIGRpY3Q9UHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBkaWN0LCAtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9saXN0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqbGlzdCA9IDA7Ci0JaW50IGk7CisgICAgUHlPYmplY3QgKmxpc3QgPSAwOworICAgIGludCBpOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKLQlpZiAoISggbGlzdD1QZGF0YV9wb3BMaXN0KHNlbGYtPnN0YWNrLCBpKSkpICByZXR1cm4gLTE7Ci0JUERBVEFfUFVTSChzZWxmLT5zdGFjaywgbGlzdCwgLTEpOwotCXJldHVybiAwOworICAgIGlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKCEoIGxpc3Q9UGRhdGFfcG9wTGlzdChzZWxmLT5zdGFjaywgaSkpKSAgcmV0dXJuIC0xOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIGxpc3QsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogbG9hZF9kaWN0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZGljdCwgKmtleSwgKnZhbHVlOwotCWludCBpLCBqLCBrOworICAgIFB5T2JqZWN0ICpkaWN0LCAqa2V5LCAqdmFsdWU7CisgICAgaW50IGksIGosIGs7CiAKLQlpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwotCWo9c2VsZi0+c3RhY2stPmxlbmd0aDsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOworICAgIGo9c2VsZi0+c3RhY2stPmxlbmd0aDsKIAotCWlmICghKCBkaWN0ID0gUHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKKyAgICBpZiAoISggZGljdCA9IFB5RGljdF9OZXcoKSkpICByZXR1cm4gLTE7CiAKLQlmb3IgKGsgPSBpKzE7IGsgPCBqOyBrICs9IDIpIHsKLQkJa2V5ICA9c2VsZi0+c3RhY2stPmRhdGFbay0xXTsKLQkJdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbayAgXTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIGtleSwgdmFsdWUpIDwgMCkgewotCQkJUHlfREVDUkVGKGRpY3QpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCVBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBkaWN0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgZm9yIChrID0gaSsxOyBrIDwgajsgayArPSAyKSB7CisgICAgICAgIGtleSAgPXNlbGYtPnN0YWNrLT5kYXRhW2stMV07CisgICAgICAgIHZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2sgIF07CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBrZXksIHZhbHVlKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSk7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgZGljdCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSW5zdGFuY2VfTmV3KFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyID0gMDsKKyAgICBQeU9iamVjdCAqciA9IDA7CiAKLQlpZiAoUHlDbGFzc19DaGVjayhjbHMpKSB7Ci0JCWludCBsOworICAgIGlmIChQeUNsYXNzX0NoZWNrKGNscykpIHsKKyAgICAgICAgaW50IGw7CiAKLQkJaWYgKChsPVB5T2JqZWN0X1NpemUoYXJncykpIDwgMCkgZ290byBlcnI7Ci0JCWlmICghKCBsICkpICB7Ci0JCQlQeU9iamVjdCAqX19nZXRpbml0YXJnc19fOworICAgICAgICBpZiAoKGw9UHlPYmplY3RfU2l6ZShhcmdzKSkgPCAwKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKCEoIGwgKSkgIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpfX2dldGluaXRhcmdzX187CiAKLQkJCV9fZ2V0aW5pdGFyZ3NfXyA9IFB5T2JqZWN0X0dldEF0dHIoY2xzLAotCQkJCQkJICAgX19nZXRpbml0YXJnc19fX3N0cik7Ci0JCQlpZiAoIV9fZ2V0aW5pdGFyZ3NfXykgIHsKLQkJCQkvKiBXZSBoYXZlIGEgY2xhc3Mgd2l0aCBubyBfX2dldGluaXRhcmdzX18sCi0JCQkJICAgc28gYnlwYXNzIHVzdWFsIGNvbnN0cnVjdGlvbiAgKi8KLQkJCQlQeU9iamVjdCAqaW5zdDsKKyAgICAgICAgICAgIF9fZ2V0aW5pdGFyZ3NfXyA9IFB5T2JqZWN0X0dldEF0dHIoY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19nZXRpbml0YXJnc19fX3N0cik7CisgICAgICAgICAgICBpZiAoIV9fZ2V0aW5pdGFyZ3NfXykgIHsKKyAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIGEgY2xhc3Mgd2l0aCBubyBfX2dldGluaXRhcmdzX18sCisgICAgICAgICAgICAgICAgICAgc28gYnlwYXNzIHVzdWFsIGNvbnN0cnVjdGlvbiAgKi8KKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqaW5zdDsKIAotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJaWYgKCEoIGluc3Q9UHlJbnN0YW5jZV9OZXdSYXcoY2xzLCBOVUxMKSkpCi0JCQkJCWdvdG8gZXJyOwotCQkJCXJldHVybiBpbnN0OwotCQkJfQotCQkJUHlfREVDUkVGKF9fZ2V0aW5pdGFyZ3NfXyk7Ci0JCX0KKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIGlmICghKCBpbnN0PVB5SW5zdGFuY2VfTmV3UmF3KGNscywgTlVMTCkpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihfX2dldGluaXRhcmdzX18pOworICAgICAgICB9CiAKLQkJaWYgKChyPVB5SW5zdGFuY2VfTmV3KGNscywgYXJncywgTlVMTCkpKSByZXR1cm4gcjsKLQkJZWxzZSBnb3RvIGVycjsKLQl9CisgICAgICAgIGlmICgocj1QeUluc3RhbmNlX05ldyhjbHMsIGFyZ3MsIE5VTEwpKSkgcmV0dXJuIHI7CisgICAgICAgIGVsc2UgZ290byBlcnI7CisgICAgfQogCi0JaWYgKChyPVB5T2JqZWN0X0NhbGxPYmplY3QoY2xzLCBhcmdzKSkpIHJldHVybiByOworICAgIGlmICgocj1QeU9iamVjdF9DYWxsT2JqZWN0KGNscywgYXJncykpKSByZXR1cm4gcjsKIAogICBlcnI6Ci0JewotCQlQeU9iamVjdCAqdHAsICp2LCAqdGIsICp0bXBfdmFsdWU7CisgICAgeworICAgICAgICBQeU9iamVjdCAqdHAsICp2LCAqdGIsICp0bXBfdmFsdWU7CiAKLQkJUHlFcnJfRmV0Y2goJnRwLCAmdiwgJnRiKTsKLQkJdG1wX3ZhbHVlID0gdjsKLQkJLyogTlVMTCBvY2N1cnMgd2hlbiB0aGVyZSB3YXMgYSBLZXlib2FyZEludGVycnVwdCAqLwotCQlpZiAodG1wX3ZhbHVlID09IE5VTEwpCi0JCQl0bXBfdmFsdWUgPSBQeV9Ob25lOwotCQlpZiAoKHIgPSBQeVR1cGxlX1BhY2soMywgdG1wX3ZhbHVlLCBjbHMsIGFyZ3MpKSkgewotCQkJUHlfWERFQ1JFRih2KTsKLQkJCXY9cjsKLQkJfQotCQlQeUVycl9SZXN0b3JlKHRwLHYsdGIpOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfRmV0Y2goJnRwLCAmdiwgJnRiKTsKKyAgICAgICAgdG1wX3ZhbHVlID0gdjsKKyAgICAgICAgLyogTlVMTCBvY2N1cnMgd2hlbiB0aGVyZSB3YXMgYSBLZXlib2FyZEludGVycnVwdCAqLworICAgICAgICBpZiAodG1wX3ZhbHVlID09IE5VTEwpCisgICAgICAgICAgICB0bXBfdmFsdWUgPSBQeV9Ob25lOworICAgICAgICBpZiAoKHIgPSBQeVR1cGxlX1BhY2soMywgdG1wX3ZhbHVlLCBjbHMsIGFyZ3MpKSkgeworICAgICAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICAgICAgICAgIHY9cjsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9SZXN0b3JlKHRwLHYsdGIpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX29iaihVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmNsYXNzLCAqdHVwLCAqb2JqPTA7Ci0JaW50IGk7CisgICAgUHlPYmplY3QgKmNsYXNzLCAqdHVwLCAqb2JqPTA7CisgICAgaW50IGk7CiAKLQlpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwotCWlmICghKCB0dXA9UGRhdGFfcG9wVHVwbGUoc2VsZi0+c3RhY2ssIGkrMSkpKSAgcmV0dXJuIC0xOwotCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgY2xhc3MpOwotCWlmIChjbGFzcykgewotCQlvYmogPSBJbnN0YW5jZV9OZXcoY2xhc3MsIHR1cCk7Ci0JCVB5X0RFQ1JFRihjbGFzcyk7Ci0JfQotCVB5X0RFQ1JFRih0dXApOworICAgIGlmICgoaSA9IG1hcmtlcihzZWxmKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKCEoIHR1cD1QZGF0YV9wb3BUdXBsZShzZWxmLT5zdGFjaywgaSsxKSkpICByZXR1cm4gLTE7CisgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBjbGFzcyk7CisgICAgaWYgKGNsYXNzKSB7CisgICAgICAgIG9iaiA9IEluc3RhbmNlX05ldyhjbGFzcywgdHVwKTsKKyAgICAgICAgUHlfREVDUkVGKGNsYXNzKTsKKyAgICB9CisgICAgUHlfREVDUkVGKHR1cCk7CiAKLQlpZiAoISBvYmopIHJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoISBvYmopIHJldHVybiAtMTsKKyAgICBQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2luc3QoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp0dXAsICpjbGFzcz0wLCAqb2JqPTAsICptb2R1bGVfbmFtZSwgKmNsYXNzX25hbWU7Ci0JaW50IGksIGxlbjsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICp0dXAsICpjbGFzcz0wLCAqb2JqPTAsICptb2R1bGVfbmFtZSwgKmNsYXNzX25hbWU7CisgICAgaW50IGksIGxlbjsKKyAgICBjaGFyICpzOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwogCi0JaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKLQltb2R1bGVfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpOwotCWlmICghbW9kdWxlX25hbWUpICByZXR1cm4gLTE7CisgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICBtb2R1bGVfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpOworICAgIGlmICghbW9kdWxlX25hbWUpICByZXR1cm4gLTE7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA+PSAwKSB7Ci0JCWlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0JCWlmICgoY2xhc3NfbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpKSkgewotCQkJY2xhc3MgPSBmaW5kX2NsYXNzKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lLAotCQkJCQkgICBzZWxmLT5maW5kX2NsYXNzKTsKLQkJCVB5X0RFQ1JFRihjbGFzc19uYW1lKTsKLQkJfQotCX0KLQlQeV9ERUNSRUYobW9kdWxlX25hbWUpOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpID49IDApIHsKKyAgICAgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICAgICAgaWYgKChjbGFzc19uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSkpKSB7CisgICAgICAgICAgICBjbGFzcyA9IGZpbmRfY2xhc3MobW9kdWxlX25hbWUsIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZmluZF9jbGFzcyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2xhc3NfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKG1vZHVsZV9uYW1lKTsKIAotCWlmICghIGNsYXNzKSByZXR1cm4gLTE7CisgICAgaWYgKCEgY2xhc3MpIHJldHVybiAtMTsKIAotCWlmICgodHVwPVBkYXRhX3BvcFR1cGxlKHNlbGYtPnN0YWNrLCBpKSkpIHsKLQkJb2JqID0gSW5zdGFuY2VfTmV3KGNsYXNzLCB0dXApOwotCQlQeV9ERUNSRUYodHVwKTsKLQl9Ci0JUHlfREVDUkVGKGNsYXNzKTsKKyAgICBpZiAoKHR1cD1QZGF0YV9wb3BUdXBsZShzZWxmLT5zdGFjaywgaSkpKSB7CisgICAgICAgIG9iaiA9IEluc3RhbmNlX05ldyhjbGFzcywgdHVwKTsKKyAgICAgICAgUHlfREVDUkVGKHR1cCk7CisgICAgfQorICAgIFB5X0RFQ1JFRihjbGFzcyk7CiAKLQlpZiAoISBvYmopIHJldHVybiAtMTsKKyAgICBpZiAoISBvYmopIHJldHVybiAtMTsKIAotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iaiwgLTEpOwotCXJldHVybiAwOworICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iaiwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX25ld29iaihVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmFyZ3MgPSBOVUxMOwotCVB5T2JqZWN0ICpjbHNyYXcgPSBOVUxMOwotCVB5VHlwZU9iamVjdCAqY2xzOwkvKiBjbHNyYXcgY2FzdCB0byBpdHMgdHJ1ZSB0eXBlICovCi0JUHlPYmplY3QgKm9iajsKKyAgICBQeU9iamVjdCAqYXJncyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNsc3JhdyA9IE5VTEw7CisgICAgUHlUeXBlT2JqZWN0ICpjbHM7ICAgICAgICAgIC8qIGNsc3JhdyBjYXN0IHRvIGl0cyB0cnVlIHR5cGUgKi8KKyAgICBQeU9iamVjdCAqb2JqOwogCi0JLyogU3RhY2sgaXMgLi4uIGNscyBhcmd0dXBsZSwgYW5kIHdlIHdhbnQgdG8gY2FsbAotCSAqIGNscy5fX25ld19fKGNscywgKmFyZ3R1cGxlKS4KLQkgKi8KLQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGFyZ3MpOwotCWlmIChhcmdzID09IE5VTEwpIGdvdG8gRmFpbDsKLQlpZiAoISBQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJORVdPQkogZXhwZWN0ZWQgYW4gYXJnICIKLQkJCQkJCSAidHVwbGUuIik7Ci0JCWdvdG8gRmFpbDsKLQl9CisgICAgLyogU3RhY2sgaXMgLi4uIGNscyBhcmd0dXBsZSwgYW5kIHdlIHdhbnQgdG8gY2FsbAorICAgICAqIGNscy5fX25ld19fKGNscywgKmFyZ3R1cGxlKS4KKyAgICAgKi8KKyAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIGFyZ3MpOworICAgIGlmIChhcmdzID09IE5VTEwpIGdvdG8gRmFpbDsKKyAgICBpZiAoISBQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJORVdPQkogZXhwZWN0ZWQgYW4gYXJnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR1cGxlLiIpOworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQogCi0JUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBjbHNyYXcpOwotCWNscyA9IChQeVR5cGVPYmplY3QgKiljbHNyYXc7Ci0JaWYgKGNscyA9PSBOVUxMKSBnb3RvIEZhaWw7Ci0JaWYgKCEgUHlUeXBlX0NoZWNrKGNscykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgIk5FV09CSiBjbGFzcyBhcmd1bWVudCAiCi0JCQkJCSAJICJpc24ndCBhIHR5cGUgb2JqZWN0Iik7Ci0JCWdvdG8gRmFpbDsKLQl9Ci0JaWYgKGNscy0+dHBfbmV3ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgIk5FV09CSiBjbGFzcyBhcmd1bWVudCAiCi0JCQkJCQkgImhhcyBOVUxMIHRwX25ldyIpOwotCQlnb3RvIEZhaWw7Ci0JfQorICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgY2xzcmF3KTsKKyAgICBjbHMgPSAoUHlUeXBlT2JqZWN0ICopY2xzcmF3OworICAgIGlmIChjbHMgPT0gTlVMTCkgZ290byBGYWlsOworICAgIGlmICghIFB5VHlwZV9DaGVjayhjbHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJORVdPQkogY2xhc3MgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNuJ3QgYSB0eXBlIG9iamVjdCIpOworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQorICAgIGlmIChjbHMtPnRwX25ldyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJORVdPQkogY2xhc3MgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIE5VTEwgdHBfbmV3Iik7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICB9CiAKLQkvKiBDYWxsIF9fbmV3X18uICovCi0Jb2JqID0gY2xzLT50cF9uZXcoY2xzLCBhcmdzLCBOVUxMKTsKLQlpZiAob2JqID09IE5VTEwpIGdvdG8gRmFpbDsKKyAgICAvKiBDYWxsIF9fbmV3X18uICovCisgICAgb2JqID0gY2xzLT50cF9uZXcoY2xzLCBhcmdzLCBOVUxMKTsKKyAgICBpZiAob2JqID09IE5VTEwpIGdvdG8gRmFpbDsKIAotIAlQeV9ERUNSRUYoYXJncyk7Ci0gCVB5X0RFQ1JFRihjbHNyYXcpOwotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iaiwgLTEpOwotIAlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGNsc3Jhdyk7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgb2JqLCAtMSk7CisgICAgcmV0dXJuIDA7CiAKICBGYWlsOgotIAlQeV9YREVDUkVGKGFyZ3MpOwotIAlQeV9YREVDUkVGKGNsc3Jhdyk7Ci0gCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKGFyZ3MpOworICAgIFB5X1hERUNSRUYoY2xzcmF3KTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfZ2xvYmFsKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqY2xhc3MgPSAwLCAqbW9kdWxlX25hbWUgPSAwLCAqY2xhc3NfbmFtZSA9IDA7Ci0JaW50IGxlbjsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICpjbGFzcyA9IDAsICptb2R1bGVfbmFtZSA9IDAsICpjbGFzc19uYW1lID0gMDsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKnM7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotCW1vZHVsZV9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSk7Ci0JaWYgKCFtb2R1bGVfbmFtZSkgIHJldHVybiAtMTsKKyAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOworICAgIG1vZHVsZV9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSk7CisgICAgaWYgKCFtb2R1bGVfbmFtZSkgIHJldHVybiAtMTsKIAotCWlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpID49IDApIHsKLQkJaWYgKGxlbiA8IDIpIHsKLQkJCVB5X0RFQ1JFRihtb2R1bGVfbmFtZSk7Ci0JCQlyZXR1cm4gYmFkX3JlYWRsaW5lKCk7Ci0JCX0KLQkJaWYgKChjbGFzc19uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSkpKSB7Ci0JCQljbGFzcyA9IGZpbmRfY2xhc3MobW9kdWxlX25hbWUsIGNsYXNzX25hbWUsCi0JCQkJCSAgIHNlbGYtPmZpbmRfY2xhc3MpOwotCQkJUHlfREVDUkVGKGNsYXNzX25hbWUpOwotCQl9Ci0JfQotCVB5X0RFQ1JFRihtb2R1bGVfbmFtZSk7CisgICAgaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPj0gMCkgeworICAgICAgICBpZiAobGVuIDwgMikgeworICAgICAgICAgICAgUHlfREVDUkVGKG1vZHVsZV9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNsYXNzX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4gLSAxKSkpIHsKKyAgICAgICAgICAgIGNsYXNzID0gZmluZF9jbGFzcyhtb2R1bGVfbmFtZSwgY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5maW5kX2NsYXNzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjbGFzc19uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYobW9kdWxlX25hbWUpOwogCi0JaWYgKCEgY2xhc3MpIHJldHVybiAtMTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBjbGFzcywgLTEpOwotCXJldHVybiAwOworICAgIGlmICghIGNsYXNzKSByZXR1cm4gLTE7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgY2xhc3MsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX3BlcnNpZChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnBpZCA9IDA7Ci0JaW50IGxlbjsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICpwaWQgPSAwOworICAgIGludCBsZW47CisgICAgY2hhciAqczsKIAotCWlmIChzZWxmLT5wZXJzX2Z1bmMpIHsKLQkJaWYgKChsZW4gPSBzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSkgPCAwKSByZXR1cm4gLTE7Ci0JCWlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CisgICAgaWYgKHNlbGYtPnBlcnNfZnVuYykgeworICAgICAgICBpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGxlbiA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKIAotCQlwaWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4gLSAxKTsKLQkJaWYgKCFwaWQpICByZXR1cm4gLTE7CisgICAgICAgIHBpZCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbiAtIDEpOworICAgICAgICBpZiAoIXBpZCkgIHJldHVybiAtMTsKIAotCQlpZiAoUHlMaXN0X0NoZWNrKHNlbGYtPnBlcnNfZnVuYykpIHsKLQkJCWlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPnBlcnNfZnVuYywgcGlkKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYocGlkKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBUkdfVFVQKHNlbGYsIHBpZCk7Ci0JCQlpZiAoc2VsZi0+YXJnKSB7Ci0JCQkJcGlkID0gUHlPYmplY3RfQ2FsbChzZWxmLT5wZXJzX2Z1bmMsIHNlbGYtPmFyZywKLQkJCQkJCSAgICBOVUxMKTsKLQkJCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKFB5TGlzdF9DaGVjayhzZWxmLT5wZXJzX2Z1bmMpKSB7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChzZWxmLT5wZXJzX2Z1bmMsIHBpZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHBpZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQVJHX1RVUChzZWxmLCBwaWQpOworICAgICAgICAgICAgaWYgKHNlbGYtPmFyZykgeworICAgICAgICAgICAgICAgIHBpZCA9IFB5T2JqZWN0X0NhbGwoc2VsZi0+cGVyc19mdW5jLCBzZWxmLT5hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoISBwaWQpIHJldHVybiAtMTsKKyAgICAgICAgaWYgKCEgcGlkKSByZXR1cm4gLTE7CiAKLQkJUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcGlkLCAtMSk7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwKLQkJCQkiQSBsb2FkIHBlcnNpc3RlbnQgaWQgaW5zdHJ1Y3Rpb24gd2FzIGVuY291bnRlcmVkLFxuIgotCQkJCSJidXQgbm8gcGVyc2lzdGVudF9sb2FkIGZ1bmN0aW9uIHdhcyBzcGVjaWZpZWQuIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHBpZCwgLTEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQSBsb2FkIHBlcnNpc3RlbnQgaWQgaW5zdHJ1Y3Rpb24gd2FzIGVuY291bnRlcmVkLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBubyBwZXJzaXN0ZW50X2xvYWQgZnVuY3Rpb24gd2FzIHNwZWNpZmllZC4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogc3RhdGljIGludAogbG9hZF9iaW5wZXJzaWQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpwaWQgPSAwOworICAgIFB5T2JqZWN0ICpwaWQgPSAwOwogCi0JaWYgKHNlbGYtPnBlcnNfZnVuYykgewotCQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHBpZCk7Ci0JCWlmICghIHBpZCkgcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5wZXJzX2Z1bmMpIHsKKyAgICAgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBwaWQpOworICAgICAgICBpZiAoISBwaWQpIHJldHVybiAtMTsKIAotCQlpZiAoUHlMaXN0X0NoZWNrKHNlbGYtPnBlcnNfZnVuYykpIHsKLQkJCWlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPnBlcnNfZnVuYywgcGlkKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYocGlkKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBUkdfVFVQKHNlbGYsIHBpZCk7Ci0JCQlpZiAoc2VsZi0+YXJnKSB7Ci0JCQkJcGlkID0gUHlPYmplY3RfQ2FsbChzZWxmLT5wZXJzX2Z1bmMsIHNlbGYtPmFyZywKLQkJCQkJCSAgICBOVUxMKTsKLQkJCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCQl9Ci0JCQlpZiAoISBwaWQpIHJldHVybiAtMTsKLQkJfQorICAgICAgICBpZiAoUHlMaXN0X0NoZWNrKHNlbGYtPnBlcnNfZnVuYykpIHsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPnBlcnNfZnVuYywgcGlkKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBUkdfVFVQKHNlbGYsIHBpZCk7CisgICAgICAgICAgICBpZiAoc2VsZi0+YXJnKSB7CisgICAgICAgICAgICAgICAgcGlkID0gUHlPYmplY3RfQ2FsbChzZWxmLT5wZXJzX2Z1bmMsIHNlbGYtPmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIEZSRUVfQVJHX1RVUChzZWxmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghIHBpZCkgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJUERBVEFfUFVTSChzZWxmLT5zdGFjaywgcGlkLCAtMSk7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwKLQkJCQkiQSBsb2FkIHBlcnNpc3RlbnQgaWQgaW5zdHJ1Y3Rpb24gd2FzIGVuY291bnRlcmVkLFxuIgotCQkJCSJidXQgbm8gcGVyc2lzdGVudF9sb2FkIGZ1bmN0aW9uIHdhcyBzcGVjaWZpZWQuIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIHBpZCwgLTEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQSBsb2FkIHBlcnNpc3RlbnQgaWQgaW5zdHJ1Y3Rpb24gd2FzIGVuY291bnRlcmVkLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBubyBwZXJzaXN0ZW50X2xvYWQgZnVuY3Rpb24gd2FzIHNwZWNpZmllZC4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX3BvcChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JaW50IGxlbiA9IHNlbGYtPnN0YWNrLT5sZW5ndGg7CisgICAgaW50IGxlbiA9IHNlbGYtPnN0YWNrLT5sZW5ndGg7CiAKLQkvKiBOb3RlIHRoYXQgd2Ugc3BsaXQgdGhlIChwaWNrbGUucHkpIHN0YWNrIGludG8gdHdvIHN0YWNrcywKLQkgICBhbiBvYmplY3Qgc3RhY2sgYW5kIGEgbWFyayBzdGFjay4gV2UgaGF2ZSB0byBiZSBjbGV2ZXIgYW5kCi0JICAgcG9wIHRoZSByaWdodCBvbmUuIFdlIGRvIHRoaXMgYnkgbG9va2luZyBhdCB0aGUgdG9wIG9mIHRoZQotCSAgIG1hcmsgc3RhY2sgZmlyc3QsIGFuZCBvbmx5IHNpZ25hbGxpbmcgYSBzdGFjayB1bmRlcmZsb3cgaWYKLQkgICB0aGUgb2JqZWN0IHN0YWNrIGlzIGVtcHR5IGFuZCB0aGUgbWFyayBzdGFjayBkb2Vzbid0IG1hdGNoCi0JICAgb3VyIGV4cGVjdGF0aW9ucy4KLQkqLwotCWlmIChzZWxmLT5udW1fbWFya3MgPiAwICYmIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcyAtIDFdID09IGxlbikgewotCQlzZWxmLT5udW1fbWFya3MtLTsKLQl9IGVsc2UgaWYgKGxlbiA+IDApIHsKLQkJbGVuLS07Ci0JCVB5X0RFQ1JFRihzZWxmLT5zdGFjay0+ZGF0YVtsZW5dKTsKLQkJc2VsZi0+c3RhY2stPmxlbmd0aCA9IGxlbjsKLQl9IGVsc2UgewotCQlyZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgLyogTm90ZSB0aGF0IHdlIHNwbGl0IHRoZSAocGlja2xlLnB5KSBzdGFjayBpbnRvIHR3byBzdGFja3MsCisgICAgICAgYW4gb2JqZWN0IHN0YWNrIGFuZCBhIG1hcmsgc3RhY2suIFdlIGhhdmUgdG8gYmUgY2xldmVyIGFuZAorICAgICAgIHBvcCB0aGUgcmlnaHQgb25lLiBXZSBkbyB0aGlzIGJ5IGxvb2tpbmcgYXQgdGhlIHRvcCBvZiB0aGUKKyAgICAgICBtYXJrIHN0YWNrIGZpcnN0LCBhbmQgb25seSBzaWduYWxsaW5nIGEgc3RhY2sgdW5kZXJmbG93IGlmCisgICAgICAgdGhlIG9iamVjdCBzdGFjayBpcyBlbXB0eSBhbmQgdGhlIG1hcmsgc3RhY2sgZG9lc24ndCBtYXRjaAorICAgICAgIG91ciBleHBlY3RhdGlvbnMuCisgICAgKi8KKyAgICBpZiAoc2VsZi0+bnVtX21hcmtzID4gMCAmJiBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MgLSAxXSA9PSBsZW4pIHsKKyAgICAgICAgc2VsZi0+bnVtX21hcmtzLS07CisgICAgfSBlbHNlIGlmIChsZW4gPiAwKSB7CisgICAgICAgIGxlbi0tOworICAgICAgICBQeV9ERUNSRUYoc2VsZi0+c3RhY2stPmRhdGFbbGVuXSk7CisgICAgICAgIHNlbGYtPnN0YWNrLT5sZW5ndGggPSBsZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfcG9wX21hcmsoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWludCBpOworICAgIGludCBpOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkpOworICAgIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfZHVwKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqbGFzdDsKLQlpbnQgbGVuOworICAgIFB5T2JqZWN0ICpsYXN0OworICAgIGludCBsZW47CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnN0YWNrLT5sZW5ndGgpIDw9IDApIHJldHVybiBzdGFja1VuZGVyZmxvdygpOwotCWxhc3Q9c2VsZi0+c3RhY2stPmRhdGFbbGVuLTFdOwotCVB5X0lOQ1JFRihsYXN0KTsKLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBsYXN0LCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKChsZW4gPSBzZWxmLT5zdGFjay0+bGVuZ3RoKSA8PSAwKSByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKKyAgICBsYXN0PXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKKyAgICBQeV9JTkNSRUYobGFzdCk7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgbGFzdCwgLTEpOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfZ2V0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfc3RyID0gMCwgKnZhbHVlID0gMDsKLQlpbnQgbGVuOwotCWNoYXIgKnM7Ci0JaW50IHJjOworICAgIFB5T2JqZWN0ICpweV9zdHIgPSAwLCAqdmFsdWUgPSAwOworICAgIGludCBsZW47CisgICAgY2hhciAqczsKKyAgICBpbnQgcmM7CiAKLQlpZiAoKGxlbiA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobGVuIDwgMikgcmV0dXJuIGJhZF9yZWFkbGluZSgpOworICAgIGlmICgobGVuID0gc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChsZW4gPCAyKSByZXR1cm4gYmFkX3JlYWRsaW5lKCk7CiAKLQlpZiAoISggcHlfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuIC0gMSkpKSAgcmV0dXJuIC0xOworICAgIGlmICghKCBweV9zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4gLSAxKSkpICByZXR1cm4gLTE7CiAKLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X3N0cik7Ci0JaWYgKCEgdmFsdWUpIHsKLQkJUHlFcnJfU2V0T2JqZWN0KEJhZFBpY2tsZUdldCwgcHlfc3RyKTsKLQkJcmMgPSAtMTsKLQl9Ci0JZWxzZSB7Ci0JCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgdmFsdWUsIC0xKTsKLQkJcmMgPSAwOwotCX0KKyAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKHNlbGYtPm1lbW8sIHB5X3N0cik7CisgICAgaWYgKCEgdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KEJhZFBpY2tsZUdldCwgcHlfc3RyKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgdmFsdWUsIC0xKTsKKyAgICAgICAgcmMgPSAwOworICAgIH0KIAotCVB5X0RFQ1JFRihweV9zdHIpOwotCXJldHVybiByYzsKKyAgICBQeV9ERUNSRUYocHlfc3RyKTsKKyAgICByZXR1cm4gcmM7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9iaW5nZXQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOwotCXVuc2lnbmVkIGNoYXIga2V5OwotCWNoYXIgKnM7Ci0JaW50IHJjOworICAgIFB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOworICAgIHVuc2lnbmVkIGNoYXIga2V5OworICAgIGNoYXIgKnM7CisgICAgaW50IHJjOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKSByZXR1cm4gLTE7CiAKLQlrZXkgPSAodW5zaWduZWQgY2hhcilzWzBdOwotCWlmICghKCBweV9rZXkgPSBQeUludF9Gcm9tTG9uZygobG9uZylrZXkpKSkgIHJldHVybiAtMTsKKyAgICBrZXkgPSAodW5zaWduZWQgY2hhcilzWzBdOworICAgIGlmICghKCBweV9rZXkgPSBQeUludF9Gcm9tTG9uZygobG9uZylrZXkpKSkgIHJldHVybiAtMTsKIAotCXZhbHVlID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5KTsKLQlpZiAoISB2YWx1ZSkgewotCQlQeUVycl9TZXRPYmplY3QoQmFkUGlja2xlR2V0LCBweV9rZXkpOwotCQlyYyA9IC0xOwotCX0KLQllbHNlIHsKLQkJUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCB2YWx1ZSwgLTEpOwotCQlyYyA9IDA7Ci0JfQorICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5KTsKKyAgICBpZiAoISB2YWx1ZSkgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoQmFkUGlja2xlR2V0LCBweV9rZXkpOworICAgICAgICByYyA9IC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCB2YWx1ZSwgLTEpOworICAgICAgICByYyA9IDA7CisgICAgfQogCi0JUHlfREVDUkVGKHB5X2tleSk7Ci0JcmV0dXJuIHJjOworICAgIFB5X0RFQ1JFRihweV9rZXkpOworICAgIHJldHVybiByYzsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2xvbmdfYmluZ2V0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfa2V5ID0gMCwgKnZhbHVlID0gMDsKLQl1bnNpZ25lZCBjaGFyIGM7Ci0JY2hhciAqczsKLQlsb25nIGtleTsKLQlpbnQgcmM7CisgICAgUHlPYmplY3QgKnB5X2tleSA9IDAsICp2YWx1ZSA9IDA7CisgICAgdW5zaWduZWQgY2hhciBjOworICAgIGNoYXIgKnM7CisgICAgbG9uZyBrZXk7CisgICAgaW50IHJjOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CiAKLQljID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKLQlrZXkgPSAobG9uZyljOwotCWMgPSAodW5zaWduZWQgY2hhcilzWzFdOwotCWtleSB8PSAobG9uZyljIDw8IDg7Ci0JYyA9ICh1bnNpZ25lZCBjaGFyKXNbMl07Ci0Ja2V5IHw9IChsb25nKWMgPDwgMTY7Ci0JYyA9ICh1bnNpZ25lZCBjaGFyKXNbM107Ci0Ja2V5IHw9IChsb25nKWMgPDwgMjQ7CisgICAgYyA9ICh1bnNpZ25lZCBjaGFyKXNbMF07CisgICAga2V5ID0gKGxvbmcpYzsKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIpc1sxXTsKKyAgICBrZXkgfD0gKGxvbmcpYyA8PCA4OworICAgIGMgPSAodW5zaWduZWQgY2hhcilzWzJdOworICAgIGtleSB8PSAobG9uZyljIDw8IDE2OworICAgIGMgPSAodW5zaWduZWQgY2hhcilzWzNdOworICAgIGtleSB8PSAobG9uZyljIDw8IDI0OwogCi0JaWYgKCEoIHB5X2tleSA9IFB5SW50X0Zyb21Mb25nKChsb25nKWtleSkpKSAgcmV0dXJuIC0xOworICAgIGlmICghKCBweV9rZXkgPSBQeUludF9Gcm9tTG9uZygobG9uZylrZXkpKSkgIHJldHVybiAtMTsKIAotCXZhbHVlID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5KTsKLQlpZiAoISB2YWx1ZSkgewotCQlQeUVycl9TZXRPYmplY3QoQmFkUGlja2xlR2V0LCBweV9rZXkpOwotCQlyYyA9IC0xOwotCX0KLQllbHNlIHsKLQkJUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCB2YWx1ZSwgLTEpOwotCQlyYyA9IDA7Ci0JfQorICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5KTsKKyAgICBpZiAoISB2YWx1ZSkgeworICAgICAgICBQeUVycl9TZXRPYmplY3QoQmFkUGlja2xlR2V0LCBweV9rZXkpOworICAgICAgICByYyA9IC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCB2YWx1ZSwgLTEpOworICAgICAgICByYyA9IDA7CisgICAgfQogCi0JUHlfREVDUkVGKHB5X2tleSk7Ci0JcmV0dXJuIHJjOworICAgIFB5X0RFQ1JFRihweV9rZXkpOworICAgIHJldHVybiByYzsKIH0KIAogLyogUHVzaCBhbiBvYmplY3QgZnJvbSB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IChFWFRbMTI0XSkuICBuYnl0ZXMgaXMKQEAgLTQxNzAsMzkxICs0MTcwLDM5MSBAQAogc3RhdGljIGludAogbG9hZF9leHRlbnNpb24oVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBpbnQgbmJ5dGVzKQogewotCWNoYXIgKmNvZGVieXRlczsJLyogdGhlIG5ieXRlcyBieXRlcyBhZnRlciB0aGUgb3Bjb2RlICovCi0JbG9uZyBjb2RlOwkJLyogY2FsY19iaW5pbnQgcmV0dXJucyBsb25nICovCi0JUHlPYmplY3QgKnB5X2NvZGU7CS8qIGNvZGUgYXMgYSBQeXRob24gaW50ICovCi0JUHlPYmplY3QgKm9iajsJCS8qIHRoZSBvYmplY3QgdG8gcHVzaCAqLwotCVB5T2JqZWN0ICpwYWlyOwkJLyogKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lKSAqLwotCVB5T2JqZWN0ICptb2R1bGVfbmFtZSwgKmNsYXNzX25hbWU7CisgICAgY2hhciAqY29kZWJ5dGVzOyAgICAgICAgICAgIC8qIHRoZSBuYnl0ZXMgYnl0ZXMgYWZ0ZXIgdGhlIG9wY29kZSAqLworICAgIGxvbmcgY29kZTsgICAgICAgICAgICAgICAgICAvKiBjYWxjX2JpbmludCByZXR1cm5zIGxvbmcgKi8KKyAgICBQeU9iamVjdCAqcHlfY29kZTsgICAgICAgICAgLyogY29kZSBhcyBhIFB5dGhvbiBpbnQgKi8KKyAgICBQeU9iamVjdCAqb2JqOyAgICAgICAgICAgICAgLyogdGhlIG9iamVjdCB0byBwdXNoICovCisgICAgUHlPYmplY3QgKnBhaXI7ICAgICAgICAgICAgIC8qIChtb2R1bGVfbmFtZSwgY2xhc3NfbmFtZSkgKi8KKyAgICBQeU9iamVjdCAqbW9kdWxlX25hbWUsICpjbGFzc19uYW1lOwogCi0JYXNzZXJ0KG5ieXRlcyA9PSAxIHx8IG5ieXRlcyA9PSAyIHx8IG5ieXRlcyA9PSA0KTsKLQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZjb2RlYnl0ZXMsIG5ieXRlcykgPCAwKSByZXR1cm4gLTE7Ci0JY29kZSA9IGNhbGNfYmluaW50KGNvZGVieXRlcywgIG5ieXRlcyk7Ci0JaWYgKGNvZGUgPD0gMCkgewkJLyogbm90ZSB0aGF0IDAgaXMgZm9yYmlkZGVuICovCi0JCS8qIENvcnJ1cHQgb3IgaG9zdGlsZSBwaWNrbGUuICovCi0JCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJFWFQgc3BlY2lmaWVzIGNvZGUgPD0gMCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGFzc2VydChuYnl0ZXMgPT0gMSB8fCBuYnl0ZXMgPT0gMiB8fCBuYnl0ZXMgPT0gNCk7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmY29kZWJ5dGVzLCBuYnl0ZXMpIDwgMCkgcmV0dXJuIC0xOworICAgIGNvZGUgPSBjYWxjX2JpbmludChjb2RlYnl0ZXMsICBuYnl0ZXMpOworICAgIGlmIChjb2RlIDw9IDApIHsgICAgICAgICAgICAgICAgICAgIC8qIG5vdGUgdGhhdCAwIGlzIGZvcmJpZGRlbiAqLworICAgICAgICAvKiBDb3JydXB0IG9yIGhvc3RpbGUgcGlja2xlLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAiRVhUIHNwZWNpZmllcyBjb2RlIDw9IDAiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIExvb2sgZm9yIHRoZSBjb2RlIGluIHRoZSBjYWNoZS4gKi8KLQlweV9jb2RlID0gUHlJbnRfRnJvbUxvbmcoY29kZSk7Ci0JaWYgKHB5X2NvZGUgPT0gTlVMTCkgcmV0dXJuIC0xOwotCW9iaiA9IFB5RGljdF9HZXRJdGVtKGV4dGVuc2lvbl9jYWNoZSwgcHlfY29kZSk7Ci0JaWYgKG9iaiAhPSBOVUxMKSB7Ci0JCS8qIEJpbmdvLiAqLwotCQlQeV9ERUNSRUYocHlfY29kZSk7Ci0JCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgb2JqLCAtMSk7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBMb29rIGZvciB0aGUgY29kZSBpbiB0aGUgY2FjaGUuICovCisgICAgcHlfY29kZSA9IFB5SW50X0Zyb21Mb25nKGNvZGUpOworICAgIGlmIChweV9jb2RlID09IE5VTEwpIHJldHVybiAtMTsKKyAgICBvYmogPSBQeURpY3RfR2V0SXRlbShleHRlbnNpb25fY2FjaGUsIHB5X2NvZGUpOworICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAvKiBCaW5nby4gKi8KKyAgICAgICAgUHlfREVDUkVGKHB5X2NvZGUpOworICAgICAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIG9iaiwgLTEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBMb29rIHVwIHRoZSAobW9kdWxlX25hbWUsIGNsYXNzX25hbWUpIHBhaXIuICovCi0JcGFpciA9IFB5RGljdF9HZXRJdGVtKGludmVydGVkX3JlZ2lzdHJ5LCBweV9jb2RlKTsKLQlpZiAocGFpciA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihweV9jb2RlKTsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bnJlZ2lzdGVyZWQgZXh0ZW5zaW9uICIKLQkJCSAgICAgImNvZGUgJWxkIiwgY29kZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogU2luY2UgdGhlIGV4dGVuc2lvbiByZWdpc3RyeSBpcyBtYW5pcHVsYWJsZSB2aWEgUHl0aG9uIGNvZGUsCi0JICogY29uZmlybSB0aGF0IHBhaXIgaXMgcmVhbGx5IGEgMi10dXBsZSBvZiBzdHJpbmdzLgotCSAqLwotCWlmICghUHlUdXBsZV9DaGVjayhwYWlyKSB8fCBQeVR1cGxlX1NpemUocGFpcikgIT0gMiB8fAotCSAgICAhUHlTdHJpbmdfQ2hlY2sobW9kdWxlX25hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHBhaXIsIDApKSB8fAotCSAgICAhUHlTdHJpbmdfQ2hlY2soY2xhc3NfbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0ocGFpciwgMSkpKSB7Ci0JCVB5X0RFQ1JFRihweV9jb2RlKTsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJfaW52ZXJ0ZWRfcmVnaXN0cnlbJWxkXSAiCi0JCQkgICAgICJpc24ndCBhIDItdHVwbGUgb2Ygc3RyaW5ncyIsIGNvZGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIExvYWQgdGhlIG9iamVjdC4gKi8KLQlvYmogPSBmaW5kX2NsYXNzKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lLCBzZWxmLT5maW5kX2NsYXNzKTsKLQlpZiAob2JqID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHB5X2NvZGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIENhY2hlIGNvZGUgLT4gb2JqLiAqLwotCWNvZGUgPSBQeURpY3RfU2V0SXRlbShleHRlbnNpb25fY2FjaGUsIHB5X2NvZGUsIG9iaik7Ci0JUHlfREVDUkVGKHB5X2NvZGUpOwotCWlmIChjb2RlIDwgMCkgewotCQlQeV9ERUNSRUYob2JqKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBvYmosIC0xKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBMb29rIHVwIHRoZSAobW9kdWxlX25hbWUsIGNsYXNzX25hbWUpIHBhaXIuICovCisgICAgcGFpciA9IFB5RGljdF9HZXRJdGVtKGludmVydGVkX3JlZ2lzdHJ5LCBweV9jb2RlKTsKKyAgICBpZiAocGFpciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihweV9jb2RlKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bnJlZ2lzdGVyZWQgZXh0ZW5zaW9uICIKKyAgICAgICAgICAgICAgICAgICAgICJjb2RlICVsZCIsIGNvZGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIFNpbmNlIHRoZSBleHRlbnNpb24gcmVnaXN0cnkgaXMgbWFuaXB1bGFibGUgdmlhIFB5dGhvbiBjb2RlLAorICAgICAqIGNvbmZpcm0gdGhhdCBwYWlyIGlzIHJlYWxseSBhIDItdHVwbGUgb2Ygc3RyaW5ncy4KKyAgICAgKi8KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2socGFpcikgfHwgUHlUdXBsZV9TaXplKHBhaXIpICE9IDIgfHwKKyAgICAgICAgIVB5U3RyaW5nX0NoZWNrKG1vZHVsZV9uYW1lID0gUHlUdXBsZV9HRVRfSVRFTShwYWlyLCAwKSkgfHwKKyAgICAgICAgIVB5U3RyaW5nX0NoZWNrKGNsYXNzX25hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHBhaXIsIDEpKSkgeworICAgICAgICBQeV9ERUNSRUYocHlfY29kZSk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiX2ludmVydGVkX3JlZ2lzdHJ5WyVsZF0gIgorICAgICAgICAgICAgICAgICAgICAgImlzbid0IGEgMi10dXBsZSBvZiBzdHJpbmdzIiwgY29kZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogTG9hZCB0aGUgb2JqZWN0LiAqLworICAgIG9iaiA9IGZpbmRfY2xhc3MobW9kdWxlX25hbWUsIGNsYXNzX25hbWUsIHNlbGYtPmZpbmRfY2xhc3MpOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocHlfY29kZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogQ2FjaGUgY29kZSAtPiBvYmouICovCisgICAgY29kZSA9IFB5RGljdF9TZXRJdGVtKGV4dGVuc2lvbl9jYWNoZSwgcHlfY29kZSwgb2JqKTsKKyAgICBQeV9ERUNSRUYocHlfY29kZSk7CisgICAgaWYgKGNvZGUgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iaiwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBsb2FkX3B1dChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnB5X3N0ciA9IDAsICp2YWx1ZSA9IDA7Ci0JaW50IGxlbiwgbDsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICpweV9zdHIgPSAwLCAqdmFsdWUgPSAwOworICAgIGludCBsZW4sIGw7CisgICAgY2hhciAqczsKIAotCWlmICgobCA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKLQlpZiAobCA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKLQlpZiAoISggbGVuPXNlbGYtPnN0YWNrLT5sZW5ndGggKSkgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOwotCWlmICghKCBweV9zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsIC0gMSkpKSAgcmV0dXJuIC0xOwotCXZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKLQlsPVB5RGljdF9TZXRJdGVtKHNlbGYtPm1lbW8sIHB5X3N0ciwgdmFsdWUpOwotCVB5X0RFQ1JFRihweV9zdHIpOwotCXJldHVybiBsOworICAgIGlmICgobCA9IHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAobCA8IDIpIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKKyAgICBpZiAoISggbGVuPXNlbGYtPnN0YWNrLT5sZW5ndGggKSkgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOworICAgIGlmICghKCBweV9zdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsIC0gMSkpKSAgcmV0dXJuIC0xOworICAgIHZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKKyAgICBsPVB5RGljdF9TZXRJdGVtKHNlbGYtPm1lbW8sIHB5X3N0ciwgdmFsdWUpOworICAgIFB5X0RFQ1JFRihweV9zdHIpOworICAgIHJldHVybiBsOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfYmlucHV0KFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcHlfa2V5ID0gMCwgKnZhbHVlID0gMDsKLQl1bnNpZ25lZCBjaGFyIGtleTsKLQljaGFyICpzOwotCWludCBsZW47CisgICAgUHlPYmplY3QgKnB5X2tleSA9IDAsICp2YWx1ZSA9IDA7CisgICAgdW5zaWduZWQgY2hhciBrZXk7CisgICAgY2hhciAqczsKKyAgICBpbnQgbGVuOwogCi0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKCEoIChsZW49c2VsZi0+c3RhY2stPmxlbmd0aCkgPiAwICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKKyAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApIHJldHVybiAtMTsKKyAgICBpZiAoISggKGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoKSA+IDAgKSkgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOwogCi0Ja2V5ID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKKyAgICBrZXkgPSAodW5zaWduZWQgY2hhcilzWzBdOwogCi0JaWYgKCEoIHB5X2tleSA9IFB5SW50X0Zyb21Mb25nKChsb25nKWtleSkpKSAgcmV0dXJuIC0xOwotCXZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2xlbi0xXTsKLQlsZW49UHlEaWN0X1NldEl0ZW0oc2VsZi0+bWVtbywgcHlfa2V5LCB2YWx1ZSk7Ci0JUHlfREVDUkVGKHB5X2tleSk7Ci0JcmV0dXJuIGxlbjsKKyAgICBpZiAoISggcHlfa2V5ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpa2V5KSkpICByZXR1cm4gLTE7CisgICAgdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbbGVuLTFdOworICAgIGxlbj1QeURpY3RfU2V0SXRlbShzZWxmLT5tZW1vLCBweV9rZXksIHZhbHVlKTsKKyAgICBQeV9ERUNSRUYocHlfa2V5KTsKKyAgICByZXR1cm4gbGVuOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfbG9uZ19iaW5wdXQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpweV9rZXkgPSAwLCAqdmFsdWUgPSAwOwotCWxvbmcga2V5OwotCXVuc2lnbmVkIGNoYXIgYzsKLQljaGFyICpzOwotCWludCBsZW47CisgICAgUHlPYmplY3QgKnB5X2tleSA9IDAsICp2YWx1ZSA9IDA7CisgICAgbG9uZyBrZXk7CisgICAgdW5zaWduZWQgY2hhciBjOworICAgIGNoYXIgKnM7CisgICAgaW50IGxlbjsKIAotCWlmIChzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnMsIDQpIDwgMCkgcmV0dXJuIC0xOwotCWlmICghKCBsZW49c2VsZi0+c3RhY2stPmxlbmd0aCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgNCkgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKCEoIGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKIAotCWMgPSAodW5zaWduZWQgY2hhcilzWzBdOwotCWtleSA9IChsb25nKWM7Ci0JYyA9ICh1bnNpZ25lZCBjaGFyKXNbMV07Ci0Ja2V5IHw9IChsb25nKWMgPDwgODsKLQljID0gKHVuc2lnbmVkIGNoYXIpc1syXTsKLQlrZXkgfD0gKGxvbmcpYyA8PCAxNjsKLQljID0gKHVuc2lnbmVkIGNoYXIpc1szXTsKLQlrZXkgfD0gKGxvbmcpYyA8PCAyNDsKKyAgICBjID0gKHVuc2lnbmVkIGNoYXIpc1swXTsKKyAgICBrZXkgPSAobG9uZyljOworICAgIGMgPSAodW5zaWduZWQgY2hhcilzWzFdOworICAgIGtleSB8PSAobG9uZyljIDw8IDg7CisgICAgYyA9ICh1bnNpZ25lZCBjaGFyKXNbMl07CisgICAga2V5IHw9IChsb25nKWMgPDwgMTY7CisgICAgYyA9ICh1bnNpZ25lZCBjaGFyKXNbM107CisgICAga2V5IHw9IChsb25nKWMgPDwgMjQ7CiAKLQlpZiAoISggcHlfa2V5ID0gUHlJbnRfRnJvbUxvbmcoa2V5KSkpICByZXR1cm4gLTE7Ci0JdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbbGVuLTFdOwotCWxlbj1QeURpY3RfU2V0SXRlbShzZWxmLT5tZW1vLCBweV9rZXksIHZhbHVlKTsKLQlQeV9ERUNSRUYocHlfa2V5KTsKLQlyZXR1cm4gbGVuOworICAgIGlmICghKCBweV9rZXkgPSBQeUludF9Gcm9tTG9uZyhrZXkpKSkgIHJldHVybiAtMTsKKyAgICB2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtsZW4tMV07CisgICAgbGVuPVB5RGljdF9TZXRJdGVtKHNlbGYtPm1lbW8sIHB5X2tleSwgdmFsdWUpOworICAgIFB5X0RFQ1JFRihweV9rZXkpOworICAgIHJldHVybiBsZW47CiB9CiAKIAogc3RhdGljIGludAogZG9fYXBwZW5kKFVucGlja2xlcm9iamVjdCAqc2VsZiwgaW50ICB4KQogewotCVB5T2JqZWN0ICp2YWx1ZSA9IDAsICpsaXN0ID0gMCwgKmFwcGVuZF9tZXRob2QgPSAwOwotCWludCBsZW4sIGk7CisgICAgUHlPYmplY3QgKnZhbHVlID0gMCwgKmxpc3QgPSAwLCAqYXBwZW5kX21ldGhvZCA9IDA7CisgICAgaW50IGxlbiwgaTsKIAotCWxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoOwotCWlmICghKCBsZW4gPj0geCAmJiB4ID4gMCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7Ci0JLyogbm90aGluZyB0byBkbyAqLwotCWlmIChsZW49PXgpIHJldHVybiAwOworICAgIGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoOworICAgIGlmICghKCBsZW4gPj0geCAmJiB4ID4gMCApKSAgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7CisgICAgLyogbm90aGluZyB0byBkbyAqLworICAgIGlmIChsZW49PXgpIHJldHVybiAwOwogCi0JbGlzdD1zZWxmLT5zdGFjay0+ZGF0YVt4LTFdOworICAgIGxpc3Q9c2VsZi0+c3RhY2stPmRhdGFbeC0xXTsKIAotCWlmIChQeUxpc3RfQ2hlY2sobGlzdCkpIHsKLQkJUHlPYmplY3QgKnNsaWNlOwotCQlpbnQgbGlzdF9sZW47CisgICAgaWYgKFB5TGlzdF9DaGVjayhsaXN0KSkgeworICAgICAgICBQeU9iamVjdCAqc2xpY2U7CisgICAgICAgIGludCBsaXN0X2xlbjsKIAotCQlzbGljZT1QZGF0YV9wb3BMaXN0KHNlbGYtPnN0YWNrLCB4KTsKLQkJaWYgKCEgc2xpY2UpIHJldHVybiAtMTsKLQkJbGlzdF9sZW4gPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7Ci0JCWk9UHlMaXN0X1NldFNsaWNlKGxpc3QsIGxpc3RfbGVuLCBsaXN0X2xlbiwgc2xpY2UpOwotCQlQeV9ERUNSRUYoc2xpY2UpOwotCQlyZXR1cm4gaTsKLQl9Ci0JZWxzZSB7CisgICAgICAgIHNsaWNlPVBkYXRhX3BvcExpc3Qoc2VsZi0+c3RhY2ssIHgpOworICAgICAgICBpZiAoISBzbGljZSkgcmV0dXJuIC0xOworICAgICAgICBsaXN0X2xlbiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKKyAgICAgICAgaT1QeUxpc3RfU2V0U2xpY2UobGlzdCwgbGlzdF9sZW4sIGxpc3RfbGVuLCBzbGljZSk7CisgICAgICAgIFB5X0RFQ1JFRihzbGljZSk7CisgICAgICAgIHJldHVybiBpOworICAgIH0KKyAgICBlbHNlIHsKIAotCQlpZiAoISggYXBwZW5kX21ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIobGlzdCwgYXBwZW5kX3N0cikpKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoISggYXBwZW5kX21ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIobGlzdCwgYXBwZW5kX3N0cikpKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWZvciAoaSA9IHg7IGkgPCBsZW47IGkrKykgewotCQkJUHlPYmplY3QgKmp1bms7CisgICAgICAgIGZvciAoaSA9IHg7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKmp1bms7CiAKLQkJCXZhbHVlPXNlbGYtPnN0YWNrLT5kYXRhW2ldOwotCQkJanVuaz0wOwotCQkJQVJHX1RVUChzZWxmLCB2YWx1ZSk7Ci0JCQlpZiAoc2VsZi0+YXJnKSB7Ci0JCQkJanVuayA9IFB5T2JqZWN0X0NhbGwoYXBwZW5kX21ldGhvZCwgc2VsZi0+YXJnLAotCQkJCQkJICAgICBOVUxMKTsKLQkJCQlGUkVFX0FSR19UVVAoc2VsZik7Ci0JCQl9Ci0JCQlpZiAoISBqdW5rKSB7Ci0JCQkJUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIGkrMSk7Ci0JCQkJc2VsZi0+c3RhY2stPmxlbmd0aD14OwotCQkJCVB5X0RFQ1JFRihhcHBlbmRfbWV0aG9kKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoanVuayk7Ci0JCX0KLQkJc2VsZi0+c3RhY2stPmxlbmd0aD14OwotCQlQeV9ERUNSRUYoYXBwZW5kX21ldGhvZCk7Ci0JfQorICAgICAgICAgICAgdmFsdWU9c2VsZi0+c3RhY2stPmRhdGFbaV07CisgICAgICAgICAgICBqdW5rPTA7CisgICAgICAgICAgICBBUkdfVFVQKHNlbGYsIHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5hcmcpIHsKKyAgICAgICAgICAgICAgICBqdW5rID0gUHlPYmplY3RfQ2FsbChhcHBlbmRfbWV0aG9kLCBzZWxmLT5hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgRlJFRV9BUkdfVFVQKHNlbGYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEganVuaykgeworICAgICAgICAgICAgICAgIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKzEpOworICAgICAgICAgICAgICAgIHNlbGYtPnN0YWNrLT5sZW5ndGg9eDsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXBwZW5kX21ldGhvZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGp1bmspOworICAgICAgICB9CisgICAgICAgIHNlbGYtPnN0YWNrLT5sZW5ndGg9eDsKKyAgICAgICAgUHlfREVDUkVGKGFwcGVuZF9tZXRob2QpOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBpbnQKIGxvYWRfYXBwZW5kKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZG9fYXBwZW5kKHNlbGYsIHNlbGYtPnN0YWNrLT5sZW5ndGggLSAxKTsKKyAgICByZXR1cm4gZG9fYXBwZW5kKHNlbGYsIHNlbGYtPnN0YWNrLT5sZW5ndGggLSAxKTsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX2FwcGVuZHMoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCXJldHVybiBkb19hcHBlbmQoc2VsZiwgbWFya2VyKHNlbGYpKTsKKyAgICByZXR1cm4gZG9fYXBwZW5kKHNlbGYsIG1hcmtlcihzZWxmKSk7CiB9CiAKIAogc3RhdGljIGludAogZG9fc2V0aXRlbXMoVW5waWNrbGVyb2JqZWN0ICpzZWxmLCBpbnQgIHgpCiB7Ci0JUHlPYmplY3QgKnZhbHVlID0gMCwgKmtleSA9IDAsICpkaWN0ID0gMDsKLQlpbnQgbGVuLCBpLCByPTA7CisgICAgUHlPYmplY3QgKnZhbHVlID0gMCwgKmtleSA9IDAsICpkaWN0ID0gMDsKKyAgICBpbnQgbGVuLCBpLCByPTA7CiAKLQlpZiAoISggKGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoKSA+PSB4Ci0JICAgICAgICYmIHggPiAwICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKKyAgICBpZiAoISggKGxlbj1zZWxmLT5zdGFjay0+bGVuZ3RoKSA+PSB4CisgICAgICAgICAgICYmIHggPiAwICkpICByZXR1cm4gc3RhY2tVbmRlcmZsb3coKTsKIAotCWRpY3Q9c2VsZi0+c3RhY2stPmRhdGFbeC0xXTsKKyAgICBkaWN0PXNlbGYtPnN0YWNrLT5kYXRhW3gtMV07CiAKLQlmb3IgKGkgPSB4KzE7IGkgPCBsZW47IGkgKz0gMikgewotCQlrZXkgID1zZWxmLT5zdGFjay0+ZGF0YVtpLTFdOwotCQl2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtpICBdOwotCQlpZiAoUHlPYmplY3RfU2V0SXRlbShkaWN0LCBrZXksIHZhbHVlKSA8IDApIHsKLQkJCXI9LTE7Ci0JCQlicmVhazsKLQkJfQotCX0KKyAgICBmb3IgKGkgPSB4KzE7IGkgPCBsZW47IGkgKz0gMikgeworICAgICAgICBrZXkgID1zZWxmLT5zdGFjay0+ZGF0YVtpLTFdOworICAgICAgICB2YWx1ZT1zZWxmLT5zdGFjay0+ZGF0YVtpICBdOworICAgICAgICBpZiAoUHlPYmplY3RfU2V0SXRlbShkaWN0LCBrZXksIHZhbHVlKSA8IDApIHsKKyAgICAgICAgICAgIHI9LTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIAotCVBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCB4KTsKKyAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgeCk7CiAKLQlyZXR1cm4gcjsKKyAgICByZXR1cm4gcjsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX3NldGl0ZW0oVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCXJldHVybiBkb19zZXRpdGVtcyhzZWxmLCBzZWxmLT5zdGFjay0+bGVuZ3RoIC0gMik7CisgICAgcmV0dXJuIGRvX3NldGl0ZW1zKHNlbGYsIHNlbGYtPnN0YWNrLT5sZW5ndGggLSAyKTsKIH0KIAogc3RhdGljIGludAogbG9hZF9zZXRpdGVtcyhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIGRvX3NldGl0ZW1zKHNlbGYsIG1hcmtlcihzZWxmKSk7CisgICAgcmV0dXJuIGRvX3NldGl0ZW1zKHNlbGYsIG1hcmtlcihzZWxmKSk7CiB9CiAKIAogc3RhdGljIGludAogbG9hZF9idWlsZChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnN0YXRlLCAqaW5zdCwgKnNsb3RzdGF0ZTsKLQlQeU9iamVjdCAqX19zZXRzdGF0ZV9fOwotCVB5T2JqZWN0ICpkX2tleSwgKmRfdmFsdWU7Ci0JUHlfc3NpemVfdCBpOwotCWludCByZXMgPSAtMTsKKyAgICBQeU9iamVjdCAqc3RhdGUsICppbnN0LCAqc2xvdHN0YXRlOworICAgIFB5T2JqZWN0ICpfX3NldHN0YXRlX187CisgICAgUHlPYmplY3QgKmRfa2V5LCAqZF92YWx1ZTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHJlcyA9IC0xOwogCi0JLyogU3RhY2sgaXMgLi4uIGluc3RhbmNlLCBzdGF0ZS4gIFdlIHdhbnQgdG8gbGVhdmUgaW5zdGFuY2UgYXQKLQkgKiB0aGUgc3RhY2sgdG9wLCBwb3NzaWJseSBtdXRhdGVkIHZpYSBpbnN0YW5jZS5fX3NldHN0YXRlX18oc3RhdGUpLgotCSAqLwotCWlmIChzZWxmLT5zdGFjay0+bGVuZ3RoIDwgMikKLQkJcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7Ci0JUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBzdGF0ZSk7Ci0JaWYgKHN0YXRlID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpbnN0ID0gc2VsZi0+c3RhY2stPmRhdGFbc2VsZi0+c3RhY2stPmxlbmd0aCAtIDFdOworICAgIC8qIFN0YWNrIGlzIC4uLiBpbnN0YW5jZSwgc3RhdGUuICBXZSB3YW50IHRvIGxlYXZlIGluc3RhbmNlIGF0CisgICAgICogdGhlIHN0YWNrIHRvcCwgcG9zc2libHkgbXV0YXRlZCB2aWEgaW5zdGFuY2UuX19zZXRzdGF0ZV9fKHN0YXRlKS4KKyAgICAgKi8KKyAgICBpZiAoc2VsZi0+c3RhY2stPmxlbmd0aCA8IDIpCisgICAgICAgIHJldHVybiBzdGFja1VuZGVyZmxvdygpOworICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgc3RhdGUpOworICAgIGlmIChzdGF0ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5zdCA9IHNlbGYtPnN0YWNrLT5kYXRhW3NlbGYtPnN0YWNrLT5sZW5ndGggLSAxXTsKIAotCV9fc2V0c3RhdGVfXyA9IFB5T2JqZWN0X0dldEF0dHIoaW5zdCwgX19zZXRzdGF0ZV9fX3N0cik7Ci0JaWYgKF9fc2V0c3RhdGVfXyAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpqdW5rID0gTlVMTDsKKyAgICBfX3NldHN0YXRlX18gPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fc2V0c3RhdGVfX19zdHIpOworICAgIGlmIChfX3NldHN0YXRlX18gIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqanVuayA9IE5VTEw7CiAKLQkJLyogVGhlIGV4cGxpY2l0IF9fc2V0c3RhdGVfXyBpcyByZXNwb25zaWJsZSBmb3IgZXZlcnl0aGluZy4gKi8KLQkJQVJHX1RVUChzZWxmLCBzdGF0ZSk7Ci0JCWlmIChzZWxmLT5hcmcpIHsKLQkJCWp1bmsgPSBQeU9iamVjdF9DYWxsKF9fc2V0c3RhdGVfXywgc2VsZi0+YXJnLCBOVUxMKTsKLQkJCUZSRUVfQVJHX1RVUChzZWxmKTsKLQkJfQotCQlQeV9ERUNSRUYoX19zZXRzdGF0ZV9fKTsKLQkJaWYgKGp1bmsgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGp1bmspOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJcmV0dXJuIC0xOwotCVB5RXJyX0NsZWFyKCk7CisgICAgICAgIC8qIFRoZSBleHBsaWNpdCBfX3NldHN0YXRlX18gaXMgcmVzcG9uc2libGUgZm9yIGV2ZXJ5dGhpbmcuICovCisgICAgICAgIEFSR19UVVAoc2VsZiwgc3RhdGUpOworICAgICAgICBpZiAoc2VsZi0+YXJnKSB7CisgICAgICAgICAgICBqdW5rID0gUHlPYmplY3RfQ2FsbChfX3NldHN0YXRlX18sIHNlbGYtPmFyZywgTlVMTCk7CisgICAgICAgICAgICBGUkVFX0FSR19UVVAoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKF9fc2V0c3RhdGVfXyk7CisgICAgICAgIGlmIChqdW5rID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihqdW5rKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeUVycl9DbGVhcigpOwogCi0JLyogQSBkZWZhdWx0IF9fc2V0c3RhdGVfXy4gIEZpcnN0IHNlZSB3aGV0aGVyIHN0YXRlIGVtYmVkcyBhCi0JICogc2xvdCBzdGF0ZSBkaWN0IHRvbyAoYSBwcm90byAyIGFkZGl0aW9uKS4KLQkgKi8KLQlpZiAoUHlUdXBsZV9DaGVjayhzdGF0ZSkgJiYgUHlUdXBsZV9TaXplKHN0YXRlKSA9PSAyKSB7Ci0JCVB5T2JqZWN0ICp0ZW1wID0gc3RhdGU7Ci0JCXN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTSh0ZW1wLCAwKTsKLQkJc2xvdHN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTSh0ZW1wLCAxKTsKLQkJUHlfSU5DUkVGKHN0YXRlKTsKLQkJUHlfSU5DUkVGKHNsb3RzdGF0ZSk7Ci0JCVB5X0RFQ1JFRih0ZW1wKTsKLQl9Ci0JZWxzZQotCQlzbG90c3RhdGUgPSBOVUxMOworICAgIC8qIEEgZGVmYXVsdCBfX3NldHN0YXRlX18uICBGaXJzdCBzZWUgd2hldGhlciBzdGF0ZSBlbWJlZHMgYQorICAgICAqIHNsb3Qgc3RhdGUgZGljdCB0b28gKGEgcHJvdG8gMiBhZGRpdGlvbikuCisgICAgICovCisgICAgaWYgKFB5VHVwbGVfQ2hlY2soc3RhdGUpICYmIFB5VHVwbGVfU2l6ZShzdGF0ZSkgPT0gMikgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IHN0YXRlOworICAgICAgICBzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0odGVtcCwgMCk7CisgICAgICAgIHNsb3RzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0odGVtcCwgMSk7CisgICAgICAgIFB5X0lOQ1JFRihzdGF0ZSk7CisgICAgICAgIFB5X0lOQ1JFRihzbG90c3RhdGUpOworICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc2xvdHN0YXRlID0gTlVMTDsKIAotCS8qIFNldCBpbnN0Ll9fZGljdF9fIGZyb20gdGhlIHN0YXRlIGRpY3QgKGlmIGFueSkuICovCi0JaWYgKHN0YXRlICE9IFB5X05vbmUpIHsKLQkJUHlPYmplY3QgKmRpY3Q7Ci0JCWlmICghIFB5RGljdF9DaGVjayhzdGF0ZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhVbnBpY2tsaW5nRXJyb3IsICJzdGF0ZSBpcyBub3QgYSAiCi0JCQkJCSJkaWN0aW9uYXJ5Iik7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJZGljdCA9IFB5T2JqZWN0X0dldEF0dHIoaW5zdCwgX19kaWN0X19fc3RyKTsKLQkJaWYgKGRpY3QgPT0gTlVMTCkKLQkJCWdvdG8gZmluYWxseTsKKyAgICAvKiBTZXQgaW5zdC5fX2RpY3RfXyBmcm9tIHRoZSBzdGF0ZSBkaWN0IChpZiBhbnkpLiAqLworICAgIGlmIChzdGF0ZSAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5T2JqZWN0ICpkaWN0OworICAgICAgICBpZiAoISBQeURpY3RfQ2hlY2soc3RhdGUpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAic3RhdGUgaXMgbm90IGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5Iik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgZGljdCA9IFB5T2JqZWN0X0dldEF0dHIoaW5zdCwgX19kaWN0X19fc3RyKTsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlpID0gMDsKLQkJd2hpbGUgKFB5RGljdF9OZXh0KHN0YXRlLCAmaSwgJmRfa2V5LCAmZF92YWx1ZSkpIHsKLQkJCWlmIChQeU9iamVjdF9TZXRJdGVtKGRpY3QsIGRfa2V5LCBkX3ZhbHVlKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCVB5X0RFQ1JFRihkaWN0KTsKLQl9CisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAoUHlEaWN0X05leHQoc3RhdGUsICZpLCAmZF9rZXksICZkX3ZhbHVlKSkgeworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0oZGljdCwgZF9rZXksIGRfdmFsdWUpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgIH0KIAotCS8qIEFsc28gc2V0IGluc3RhbmNlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2xvdHN0YXRlIGRpY3QgKGlmIGFueSkuICovCi0JaWYgKHNsb3RzdGF0ZSAhPSBOVUxMKSB7Ci0JCWlmICghIFB5RGljdF9DaGVjayhzbG90c3RhdGUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoVW5waWNrbGluZ0Vycm9yLCAic2xvdCBzdGF0ZSBpcyBub3QgIgotCQkJCQkiYSBkaWN0aW9uYXJ5Iik7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJaSA9IDA7Ci0JCXdoaWxlIChQeURpY3RfTmV4dChzbG90c3RhdGUsICZpLCAmZF9rZXksICZkX3ZhbHVlKSkgewotCQkJaWYgKFB5T2JqZWN0X1NldEF0dHIoaW5zdCwgZF9rZXksIGRfdmFsdWUpIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9Ci0JcmVzID0gMDsKKyAgICAvKiBBbHNvIHNldCBpbnN0YW5jZSBhdHRyaWJ1dGVzIGZyb20gdGhlIHNsb3RzdGF0ZSBkaWN0IChpZiBhbnkpLiAqLworICAgIGlmIChzbG90c3RhdGUgIT0gTlVMTCkgeworICAgICAgICBpZiAoISBQeURpY3RfQ2hlY2soc2xvdHN0YXRlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFVucGlja2xpbmdFcnJvciwgInNsb3Qgc3RhdGUgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBkaWN0aW9uYXJ5Iik7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlIChQeURpY3RfTmV4dChzbG90c3RhdGUsICZpLCAmZF9rZXksICZkX3ZhbHVlKSkgeworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHIoaW5zdCwgZF9rZXksIGRfdmFsdWUpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzID0gMDsKIAogICBmaW5hbGx5OgotCVB5X0RFQ1JFRihzdGF0ZSk7Ci0JUHlfWERFQ1JFRihzbG90c3RhdGUpOwotCXJldHVybiByZXM7CisgICAgUHlfREVDUkVGKHN0YXRlKTsKKyAgICBQeV9YREVDUkVGKHNsb3RzdGF0ZSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCiBzdGF0aWMgaW50CiBsb2FkX21hcmsoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCWludCBzOworICAgIGludCBzOwogCi0JLyogTm90ZSB0aGF0IHdlIHNwbGl0IHRoZSAocGlja2xlLnB5KSBzdGFjayBpbnRvIHR3byBzdGFja3MsIGFuCi0JICAgb2JqZWN0IHN0YWNrIGFuZCBhIG1hcmsgc3RhY2suIEhlcmUgd2UgcHVzaCBhIG1hcmsgb250byB0aGUKLQkgICBtYXJrIHN0YWNrLgotCSovCisgICAgLyogTm90ZSB0aGF0IHdlIHNwbGl0IHRoZSAocGlja2xlLnB5KSBzdGFjayBpbnRvIHR3byBzdGFja3MsIGFuCisgICAgICAgb2JqZWN0IHN0YWNrIGFuZCBhIG1hcmsgc3RhY2suIEhlcmUgd2UgcHVzaCBhIG1hcmsgb250byB0aGUKKyAgICAgICBtYXJrIHN0YWNrLgorICAgICovCiAKLQlpZiAoKHNlbGYtPm51bV9tYXJrcyArIDEpID49IHNlbGYtPm1hcmtzX3NpemUpIHsKLQkJaW50ICptYXJrczsKLQkJcz1zZWxmLT5tYXJrc19zaXplKzIwOwotCQlpZiAocyA8PSBzZWxmLT5udW1fbWFya3MpIHM9c2VsZi0+bnVtX21hcmtzICsgMTsKLQkJaWYgKHNlbGYtPm1hcmtzID09IE5VTEwpCi0JCQltYXJrcz0oaW50ICopbWFsbG9jKHMgKiBzaXplb2YoaW50KSk7Ci0JCWVsc2UKLQkJCW1hcmtzPShpbnQgKilyZWFsbG9jKHNlbGYtPm1hcmtzLAotCQkJCQkJICAgcyAqIHNpemVvZihpbnQpKTsKLQkJaWYgKCFtYXJrcykgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlzZWxmLT5tYXJrcyA9IG1hcmtzOwotCQlzZWxmLT5tYXJrc19zaXplID0gczsKLQl9CisgICAgaWYgKChzZWxmLT5udW1fbWFya3MgKyAxKSA+PSBzZWxmLT5tYXJrc19zaXplKSB7CisgICAgICAgIGludCAqbWFya3M7CisgICAgICAgIHM9c2VsZi0+bWFya3Nfc2l6ZSsyMDsKKyAgICAgICAgaWYgKHMgPD0gc2VsZi0+bnVtX21hcmtzKSBzPXNlbGYtPm51bV9tYXJrcyArIDE7CisgICAgICAgIGlmIChzZWxmLT5tYXJrcyA9PSBOVUxMKQorICAgICAgICAgICAgbWFya3M9KGludCAqKW1hbGxvYyhzICogc2l6ZW9mKGludCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtYXJrcz0oaW50ICopcmVhbGxvYyhzZWxmLT5tYXJrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKiBzaXplb2YoaW50KSk7CisgICAgICAgIGlmICghbWFya3MpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc2VsZi0+bWFya3MgPSBtYXJrczsKKyAgICAgICAgc2VsZi0+bWFya3Nfc2l6ZSA9IHM7CisgICAgfQogCi0Jc2VsZi0+bWFya3Nbc2VsZi0+bnVtX21hcmtzKytdID0gc2VsZi0+c3RhY2stPmxlbmd0aDsKKyAgICBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MrK10gPSBzZWxmLT5zdGFjay0+bGVuZ3RoOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxvYWRfcmVkdWNlKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqY2FsbGFibGUgPSAwLCAqYXJnX3R1cCA9IDAsICpvYiA9IDA7CisgICAgUHlPYmplY3QgKmNhbGxhYmxlID0gMCwgKmFyZ190dXAgPSAwLCAqb2IgPSAwOwogCi0JUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBhcmdfdHVwKTsKLQlpZiAoISBhcmdfdHVwKSByZXR1cm4gLTE7Ci0JUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBjYWxsYWJsZSk7Ci0JaWYgKGNhbGxhYmxlKSB7Ci0JCW9iID0gSW5zdGFuY2VfTmV3KGNhbGxhYmxlLCBhcmdfdHVwKTsKLQkJUHlfREVDUkVGKGNhbGxhYmxlKTsKLQl9Ci0JUHlfREVDUkVGKGFyZ190dXApOworICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgYXJnX3R1cCk7CisgICAgaWYgKCEgYXJnX3R1cCkgcmV0dXJuIC0xOworICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgY2FsbGFibGUpOworICAgIGlmIChjYWxsYWJsZSkgeworICAgICAgICBvYiA9IEluc3RhbmNlX05ldyhjYWxsYWJsZSwgYXJnX3R1cCk7CisgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihhcmdfdHVwKTsKIAotCWlmICghIG9iKSByZXR1cm4gLTE7CisgICAgaWYgKCEgb2IpIHJldHVybiAtMTsKIAotCVBEQVRBX1BVU0goc2VsZi0+c3RhY2ssIG9iLCAtMSk7Ci0JcmV0dXJuIDA7CisgICAgUERBVEFfUFVTSChzZWxmLT5zdGFjaywgb2IsIC0xKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogSnVzdCByYWlzZXMgYW4gZXJyb3IgaWYgd2UgZG9uJ3Qga25vdyB0aGUgcHJvdG9jb2wgc3BlY2lmaWVkLiAgUFJPVE8KQEAgLTQ1NjMsMzI3ICs0NTYzLDMyNyBAQAogc3RhdGljIGludAogbG9hZF9wcm90byhVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JaW50IGk7Ci0JY2hhciAqcHJvdG9ieXRlOworICAgIGludCBpOworICAgIGNoYXIgKnByb3RvYnl0ZTsKIAotCWkgPSBzZWxmLT5yZWFkX2Z1bmMoc2VsZiwgJnByb3RvYnl0ZSwgMSk7Ci0JaWYgKGkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaSA9IHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcHJvdG9ieXRlLCAxKTsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWkgPSBjYWxjX2JpbmludChwcm90b2J5dGUsIDEpOwotCS8qIE5vIHBvaW50IGNoZWNraW5nIGZvciA8IDAsIHNpbmNlIGNhbGNfYmluaW50IHJldHVybnMgYW4gdW5zaWduZWQKLQkgKiBpbnQgd2hlbiBjaGV3aW5nIG9uIDEgYnl0ZS4KLQkgKi8KLQlhc3NlcnQoaSA+PSAwKTsKLQlpZiAoaSA8PSBISUdIRVNUX1BST1RPQ09MKQotCQlyZXR1cm4gMDsKKyAgICBpID0gY2FsY19iaW5pbnQocHJvdG9ieXRlLCAxKTsKKyAgICAvKiBObyBwb2ludCBjaGVja2luZyBmb3IgPCAwLCBzaW5jZSBjYWxjX2JpbmludCByZXR1cm5zIGFuIHVuc2lnbmVkCisgICAgICogaW50IHdoZW4gY2hld2luZyBvbiAxIGJ5dGUuCisgICAgICovCisgICAgYXNzZXJ0KGkgPj0gMCk7CisgICAgaWYgKGkgPD0gSElHSEVTVF9QUk9UT0NPTCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgInVuc3VwcG9ydGVkIHBpY2tsZSBwcm90b2NvbDogJWQiLCBpKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bnN1cHBvcnRlZCBwaWNrbGUgcHJvdG9jb2w6ICVkIiwgaSk7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9hZChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmVyciA9IDAsICp2YWwgPSAwOwotCWNoYXIgKnM7CisgICAgUHlPYmplY3QgKmVyciA9IDAsICp2YWwgPSAwOworICAgIGNoYXIgKnM7CiAKLQlzZWxmLT5udW1fbWFya3MgPSAwOwotCWlmIChzZWxmLT5zdGFjay0+bGVuZ3RoKSBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgMCk7CisgICAgc2VsZi0+bnVtX21hcmtzID0gMDsKKyAgICBpZiAoc2VsZi0+c3RhY2stPmxlbmd0aCkgUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIDApOwogCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKQotCQkJYnJlYWs7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmcywgMSkgPCAwKQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJc3dpdGNoIChzWzBdKSB7Ci0JCWNhc2UgTk9ORToKLQkJCWlmIChsb2FkX25vbmUoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIHN3aXRjaCAoc1swXSkgeworICAgICAgICBjYXNlIE5PTkU6CisgICAgICAgICAgICBpZiAobG9hZF9ub25lKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOSU5UOgotCQkJaWYgKGxvYWRfYmluaW50KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTklOVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmludChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTklOVDE6Ci0JCQlpZiAobG9hZF9iaW5pbnQxKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTklOVDE6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5pbnQxKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOSU5UMjoKLQkJCWlmIChsb2FkX2JpbmludDIoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOSU5UMjoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmludDIoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBJTlQ6Ci0JCQlpZiAobG9hZF9pbnQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgaWYgKGxvYWRfaW50KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9ORzoKLQkJCWlmIChsb2FkX2xvbmcoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgICAgIGlmIChsb2FkX2xvbmcoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT05HMToKLQkJCWlmIChsb2FkX2NvdW50ZWRfbG9uZyhzZWxmLCAxKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT05HMToKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfbG9uZyhzZWxmLCAxKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPTkc0OgotCQkJaWYgKGxvYWRfY291bnRlZF9sb25nKHNlbGYsIDQpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPTkc0OgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF9sb25nKHNlbGYsIDQpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRkxPQVQ6Ci0JCQlpZiAobG9hZF9mbG9hdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2Zsb2F0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklORkxPQVQ6Ci0JCQlpZiAobG9hZF9iaW5mbG9hdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5GTE9BVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmZsb2F0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOU1RSSU5HOgotCQkJaWYgKGxvYWRfYmluc3RyaW5nKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTlNUUklORzoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbnN0cmluZyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFNIT1JUX0JJTlNUUklORzoKLQkJCWlmIChsb2FkX3Nob3J0X2JpbnN0cmluZyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBTSE9SVF9CSU5TVFJJTkc6CisgICAgICAgICAgICBpZiAobG9hZF9zaG9ydF9iaW5zdHJpbmcoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBTVFJJTkc6Ci0JCQlpZiAobG9hZF9zdHJpbmcoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgU1RSSU5HOgorICAgICAgICAgICAgaWYgKGxvYWRfc3RyaW5nKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQljYXNlIFVOSUNPREU6Ci0JCQlpZiAobG9hZF91bmljb2RlKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFVOSUNPREU6CisgICAgICAgICAgICBpZiAobG9hZF91bmljb2RlKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOVU5JQ09ERToKLQkJCWlmIChsb2FkX2JpbnVuaWNvZGUoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOVU5JQ09ERToKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbnVuaWNvZGUoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAjZW5kaWYKIAotCQljYXNlIEVNUFRZX1RVUExFOgotCQkJaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAwKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFTVBUWV9UVVBMRToKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMCkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBUVVBMRTE6Ci0JCQlpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDEpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFRVUExFMToKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBUVVBMRTI6Ci0JCQlpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDIpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFRVUExFMjoKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBUVVBMRTM6Ci0JCQlpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDMpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFRVUExFMzoKKyAgICAgICAgICAgIGlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMykgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBUVVBMRToKLQkJCWlmIChsb2FkX3R1cGxlKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFRVUExFOgorICAgICAgICAgICAgaWYgKGxvYWRfdHVwbGUoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFTVBUWV9MSVNUOgotCQkJaWYgKGxvYWRfZW1wdHlfbGlzdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFTVBUWV9MSVNUOgorICAgICAgICAgICAgaWYgKGxvYWRfZW1wdHlfbGlzdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExJU1Q6Ci0JCQlpZiAobG9hZF9saXN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExJU1Q6CisgICAgICAgICAgICBpZiAobG9hZF9saXN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRU1QVFlfRElDVDoKLQkJCWlmIChsb2FkX2VtcHR5X2RpY3Qoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRU1QVFlfRElDVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2VtcHR5X2RpY3Qoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBESUNUOgotCQkJaWYgKGxvYWRfZGljdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBESUNUOgorICAgICAgICAgICAgaWYgKGxvYWRfZGljdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIE9CSjoKLQkJCWlmIChsb2FkX29iaihzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBPQko6CisgICAgICAgICAgICBpZiAobG9hZF9vYmooc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBJTlNUOgotCQkJaWYgKGxvYWRfaW5zdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBJTlNUOgorICAgICAgICAgICAgaWYgKGxvYWRfaW5zdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIE5FV09CSjoKLQkJCWlmIChsb2FkX25ld29iaihzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBORVdPQko6CisgICAgICAgICAgICBpZiAobG9hZF9uZXdvYmooc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBHTE9CQUw6Ci0JCQlpZiAobG9hZF9nbG9iYWwoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgR0xPQkFMOgorICAgICAgICAgICAgaWYgKGxvYWRfZ2xvYmFsKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQVBQRU5EOgotCQkJaWYgKGxvYWRfYXBwZW5kKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEFQUEVORDoKKyAgICAgICAgICAgIGlmIChsb2FkX2FwcGVuZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEFQUEVORFM6Ci0JCQlpZiAobG9hZF9hcHBlbmRzKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEFQUEVORFM6CisgICAgICAgICAgICBpZiAobG9hZF9hcHBlbmRzKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQlVJTEQ6Ci0JCQlpZiAobG9hZF9idWlsZChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCVUlMRDoKKyAgICAgICAgICAgIGlmIChsb2FkX2J1aWxkKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRFVQOgotCQkJaWYgKGxvYWRfZHVwKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIERVUDoKKyAgICAgICAgICAgIGlmIChsb2FkX2R1cChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTkdFVDoKLQkJCWlmIChsb2FkX2JpbmdldChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5HRVQ6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5nZXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT05HX0JJTkdFVDoKLQkJCWlmIChsb2FkX2xvbmdfYmluZ2V0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPTkdfQklOR0VUOgorICAgICAgICAgICAgaWYgKGxvYWRfbG9uZ19iaW5nZXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBHRVQ6Ci0JCQlpZiAobG9hZF9nZXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgR0VUOgorICAgICAgICAgICAgaWYgKGxvYWRfZ2V0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRVhUMToKLQkJCWlmIChsb2FkX2V4dGVuc2lvbihzZWxmLCAxKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFWFQxOgorICAgICAgICAgICAgaWYgKGxvYWRfZXh0ZW5zaW9uKHNlbGYsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRVhUMjoKLQkJCWlmIChsb2FkX2V4dGVuc2lvbihzZWxmLCAyKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFWFQyOgorICAgICAgICAgICAgaWYgKGxvYWRfZXh0ZW5zaW9uKHNlbGYsIDIpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRVhUNDoKLQkJCWlmIChsb2FkX2V4dGVuc2lvbihzZWxmLCA0KSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKLQkJY2FzZSBNQVJLOgotCQkJaWYgKGxvYWRfbWFyayhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFWFQ0OgorICAgICAgICAgICAgaWYgKGxvYWRfZXh0ZW5zaW9uKHNlbGYsIDQpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjYXNlIE1BUks6CisgICAgICAgICAgICBpZiAobG9hZF9tYXJrKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOUFVUOgotCQkJaWYgKGxvYWRfYmlucHV0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTlBVVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbnB1dChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPTkdfQklOUFVUOgotCQkJaWYgKGxvYWRfbG9uZ19iaW5wdXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9OR19CSU5QVVQ6CisgICAgICAgICAgICBpZiAobG9hZF9sb25nX2JpbnB1dChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFBVVDoKLQkJCWlmIChsb2FkX3B1dChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBQVVQ6CisgICAgICAgICAgICBpZiAobG9hZF9wdXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBQT1A6Ci0JCQlpZiAobG9hZF9wb3Aoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUE9QOgorICAgICAgICAgICAgaWYgKGxvYWRfcG9wKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgUE9QX01BUks6Ci0JCQlpZiAobG9hZF9wb3BfbWFyayhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBQT1BfTUFSSzoKKyAgICAgICAgICAgIGlmIChsb2FkX3BvcF9tYXJrKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU0VUSVRFTToKLQkJCWlmIChsb2FkX3NldGl0ZW0oc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgU0VUSVRFTToKKyAgICAgICAgICAgIGlmIChsb2FkX3NldGl0ZW0oc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBTRVRJVEVNUzoKLQkJCWlmIChsb2FkX3NldGl0ZW1zKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFNFVElURU1TOgorICAgICAgICAgICAgaWYgKGxvYWRfc2V0aXRlbXMoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBTVE9QOgotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUDoKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUEVSU0lEOgotCQkJaWYgKGxvYWRfcGVyc2lkKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBFUlNJRDoKKyAgICAgICAgICAgIGlmIChsb2FkX3BlcnNpZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTlBFUlNJRDoKLQkJCWlmIChsb2FkX2JpbnBlcnNpZChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5QRVJTSUQ6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5wZXJzaWQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBSRURVQ0U6Ci0JCQlpZiAobG9hZF9yZWR1Y2Uoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUkVEVUNFOgorICAgICAgICAgICAgaWYgKGxvYWRfcmVkdWNlKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgUFJPVE86Ci0JCQlpZiAobG9hZF9wcm90byhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBQUk9UTzoKKyAgICAgICAgICAgIGlmIChsb2FkX3Byb3RvKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTkVXVFJVRToKLQkJCWlmIChsb2FkX2Jvb2woc2VsZiwgUHlfVHJ1ZSkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTkVXVFJVRToKKyAgICAgICAgICAgIGlmIChsb2FkX2Jvb2woc2VsZiwgUHlfVHJ1ZSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBORVdGQUxTRToKLQkJCWlmIChsb2FkX2Jvb2woc2VsZiwgUHlfRmFsc2UpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIE5FV0ZBTFNFOgorICAgICAgICAgICAgaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9GYWxzZSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSAnXDAnOgotCQkJLyogZW5kIG9mIGZpbGUgKi8KLQkJCVB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIC8qIGVuZCBvZiBmaWxlICovCisgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0VPRkVycm9yKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCQljUGlja2xlX0VyckZvcm1hdChVbnBpY2tsaW5nRXJyb3IsCi0JCQkJCSAgImludmFsaWQgbG9hZCBrZXksICclcycuIiwKLQkJCQkJICAiYyIsIHNbMF0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNQaWNrbGVfRXJyRm9ybWF0KFVucGlja2xpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGxvYWQga2V5LCAnJXMnLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYyIsIHNbMF0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlicmVhazsKLQl9CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCWlmICgoZXJyID0gUHlFcnJfT2NjdXJyZWQoKSkpIHsKLQkJaWYgKGVyciA9PSBQeUV4Y19FT0ZFcnJvcikgewotCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgoZXJyID0gUHlFcnJfT2NjdXJyZWQoKSkpIHsKKyAgICAgICAgaWYgKGVyciA9PSBQeUV4Y19FT0ZFcnJvcikgeworICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUERBVEFfUE9QKHNlbGYtPnN0YWNrLCB2YWwpOwotCXJldHVybiB2YWw7CisgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCB2YWwpOworICAgIHJldHVybiB2YWw7CiB9CiAKIApAQCAtNDg5Myw2MyArNDg5Myw2MyBAQAogc3RhdGljIGludAogbm9sb2FkX29iaihVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JaW50IGk7CisgICAgaW50IGk7CiAKLQlpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOwotCXJldHVybiBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSsxKTsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOworICAgIHJldHVybiBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSsxKTsKIH0KIAogCiBzdGF0aWMgaW50CiBub2xvYWRfaW5zdChVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JaW50IGk7Ci0JY2hhciAqczsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpzOwogCi0JaWYgKChpID0gbWFya2VyKHNlbGYpKSA8IDApIHJldHVybiAtMTsKLQlQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgaSk7Ci0JaWYgKHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpIDwgMCkgcmV0dXJuIC0xOwotCWlmIChzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSA8IDApIHJldHVybiAtMTsKLQlQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsIC0xKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoKGkgPSBtYXJrZXIoc2VsZikpIDwgMCkgcmV0dXJuIC0xOworICAgIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBpKTsKKyAgICBpZiAoc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykgPCAwKSByZXR1cm4gLTE7CisgICAgaWYgKHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpIDwgMCkgcmV0dXJuIC0xOworICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBub2xvYWRfbmV3b2JqKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqb2JqOworICAgIFB5T2JqZWN0ICpvYmo7CiAKLQlQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIG9iaik7CS8qIHBvcCBhcmd0dXBsZSAqLwotCWlmIChvYmogPT0gTlVMTCkgcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihvYmopOworICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgb2JqKTsgICAgICAgIC8qIHBvcCBhcmd0dXBsZSAqLworICAgIGlmIChvYmogPT0gTlVMTCkgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihvYmopOwogCi0JUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBvYmopOwkvKiBwb3AgY2xzICovCi0JaWYgKG9iaiA9PSBOVUxMKSByZXR1cm4gLTE7Ci0JUHlfREVDUkVGKG9iaik7CisgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBvYmopOyAgICAgICAgLyogcG9wIGNscyAqLworICAgIGlmIChvYmogPT0gTlVMTCkgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihvYmopOwogCi0JUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLCAtMSk7Ci0gCXJldHVybiAwOworICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwgLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBub2xvYWRfZ2xvYmFsKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKLQljaGFyICpzOworICAgIGNoYXIgKnM7CiAKLQlpZiAoc2VsZi0+cmVhZGxpbmVfZnVuYyhzZWxmLCAmcykgPCAwKSByZXR1cm4gLTE7Ci0JaWYgKHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpIDwgMCkgcmV0dXJuIC0xOwotCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwtMSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNlbGYtPnJlYWRsaW5lX2Z1bmMoc2VsZiwgJnMpIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChzZWxmLT5yZWFkbGluZV9mdW5jKHNlbGYsICZzKSA8IDApIHJldHVybiAtMTsKKyAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIFB5X05vbmUsLTEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBub2xvYWRfcmVkdWNlKFVucGlja2xlcm9iamVjdCAqc2VsZikKIHsKIAotCWlmIChzZWxmLT5zdGFjay0+bGVuZ3RoIDwgMikgcmV0dXJuIHN0YWNrVW5kZXJmbG93KCk7Ci0JUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIHNlbGYtPnN0YWNrLT5sZW5ndGgtMik7Ci0JUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBQeV9Ob25lLC0xKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc2VsZi0+c3RhY2stPmxlbmd0aCA8IDIpIHJldHVybiBzdGFja1VuZGVyZmxvdygpOworICAgIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCBzZWxmLT5zdGFjay0+bGVuZ3RoLTIpOworICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwtMSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQ5NjMsMzI1ICs0OTYzLDMyNSBAQAogc3RhdGljIGludAogbm9sb2FkX2V4dGVuc2lvbihVbnBpY2tsZXJvYmplY3QgKnNlbGYsIGludCBuYnl0ZXMpCiB7Ci0JY2hhciAqY29kZWJ5dGVzOworICAgIGNoYXIgKmNvZGVieXRlczsKIAotCWFzc2VydChuYnl0ZXMgPT0gMSB8fCBuYnl0ZXMgPT0gMiB8fCBuYnl0ZXMgPT0gNCk7Ci0JaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmY29kZWJ5dGVzLCBuYnl0ZXMpIDwgMCkgcmV0dXJuIC0xOwotCVBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwgLTEpOwotCXJldHVybiAwOworICAgIGFzc2VydChuYnl0ZXMgPT0gMSB8fCBuYnl0ZXMgPT0gMiB8fCBuYnl0ZXMgPT0gNCk7CisgICAgaWYgKHNlbGYtPnJlYWRfZnVuYyhzZWxmLCAmY29kZWJ5dGVzLCBuYnl0ZXMpIDwgMCkgcmV0dXJuIC0xOworICAgIFBEQVRBX0FQUEVORChzZWxmLT5zdGFjaywgUHlfTm9uZSwgLTEpOworICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBub2xvYWQoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICplcnIgPSAwLCAqdmFsID0gMDsKLQljaGFyICpzOworICAgIFB5T2JqZWN0ICplcnIgPSAwLCAqdmFsID0gMDsKKyAgICBjaGFyICpzOwogCi0Jc2VsZi0+bnVtX21hcmtzID0gMDsKLQlQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgMCk7CisgICAgc2VsZi0+bnVtX21hcmtzID0gMDsKKyAgICBQZGF0YV9jbGVhcihzZWxmLT5zdGFjaywgMCk7CiAKLQl3aGlsZSAoMSkgewotCQlpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCi0JCQlicmVhazsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoc2VsZi0+cmVhZF9mdW5jKHNlbGYsICZzLCAxKSA8IDApCisgICAgICAgICAgICBicmVhazsKIAotCQlzd2l0Y2ggKHNbMF0pIHsKLQkJY2FzZSBOT05FOgotCQkJaWYgKGxvYWRfbm9uZShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgc3dpdGNoIChzWzBdKSB7CisgICAgICAgIGNhc2UgTk9ORToKKyAgICAgICAgICAgIGlmIChsb2FkX25vbmUoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5JTlQ6Ci0JCQlpZiAobG9hZF9iaW5pbnQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOSU5UOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluaW50KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOSU5UMToKLQkJCWlmIChsb2FkX2JpbmludDEoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOSU5UMToKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbmludDEoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5JTlQyOgotCQkJaWYgKGxvYWRfYmluaW50MihzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5JTlQyOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluaW50MihzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIElOVDoKLQkJCWlmIChsb2FkX2ludChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICBpZiAobG9hZF9pbnQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBMT05HOgotCQkJaWYgKGxvYWRfbG9uZyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT05HOgorICAgICAgICAgICAgaWYgKGxvYWRfbG9uZyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPTkcxOgotCQkJaWYgKGxvYWRfY291bnRlZF9sb25nKHNlbGYsIDEpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIExPTkcxOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF9sb25nKHNlbGYsIDEpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9ORzQ6Ci0JCQlpZiAobG9hZF9jb3VudGVkX2xvbmcoc2VsZiwgNCkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9ORzQ6CisgICAgICAgICAgICBpZiAobG9hZF9jb3VudGVkX2xvbmcoc2VsZiwgNCkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBGTE9BVDoKLQkJCWlmIChsb2FkX2Zsb2F0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgaWYgKGxvYWRfZmxvYXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5GTE9BVDoKLQkJCWlmIChsb2FkX2JpbmZsb2F0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTkZMT0FUOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluZmxvYXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5TVFJJTkc6Ci0JCQlpZiAobG9hZF9iaW5zdHJpbmcoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOU1RSSU5HOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluc3RyaW5nKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU0hPUlRfQklOU1RSSU5HOgotCQkJaWYgKGxvYWRfc2hvcnRfYmluc3RyaW5nKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFNIT1JUX0JJTlNUUklORzoKKyAgICAgICAgICAgIGlmIChsb2FkX3Nob3J0X2JpbnN0cmluZyhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFNUUklORzoKLQkJCWlmIChsb2FkX3N0cmluZyhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBTVFJJTkc6CisgICAgICAgICAgICBpZiAobG9hZF9zdHJpbmcoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWNhc2UgVU5JQ09ERToKLQkJCWlmIChsb2FkX3VuaWNvZGUoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVU5JQ09ERToKKyAgICAgICAgICAgIGlmIChsb2FkX3VuaWNvZGUoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5VTklDT0RFOgotCQkJaWYgKGxvYWRfYmludW5pY29kZShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5VTklDT0RFOgorICAgICAgICAgICAgaWYgKGxvYWRfYmludW5pY29kZShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKICNlbmRpZgogCi0JCWNhc2UgRU1QVFlfVFVQTEU6Ci0JCQlpZiAobG9hZF9jb3VudGVkX3R1cGxlKHNlbGYsIDApIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVNUFRZX1RVUExFOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAwKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFMToKLQkJCWlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMSkgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEUxOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAxKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFMjoKLQkJCWlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEUyOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAyKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFMzoKLQkJCWlmIChsb2FkX2NvdW50ZWRfdHVwbGUoc2VsZiwgMykgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEUzOgorICAgICAgICAgICAgaWYgKGxvYWRfY291bnRlZF90dXBsZShzZWxmLCAzKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFRVUExFOgotCQkJaWYgKGxvYWRfdHVwbGUoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgVFVQTEU6CisgICAgICAgICAgICBpZiAobG9hZF90dXBsZShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEVNUFRZX0xJU1Q6Ci0JCQlpZiAobG9hZF9lbXB0eV9saXN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVNUFRZX0xJU1Q6CisgICAgICAgICAgICBpZiAobG9hZF9lbXB0eV9saXN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTElTVDoKLQkJCWlmIChsb2FkX2xpc3Qoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTElTVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2xpc3Qoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFTVBUWV9ESUNUOgotCQkJaWYgKGxvYWRfZW1wdHlfZGljdChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFTVBUWV9ESUNUOgorICAgICAgICAgICAgaWYgKGxvYWRfZW1wdHlfZGljdChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIERJQ1Q6Ci0JCQlpZiAobG9hZF9kaWN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIERJQ1Q6CisgICAgICAgICAgICBpZiAobG9hZF9kaWN0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgT0JKOgotCQkJaWYgKG5vbG9hZF9vYmooc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgT0JKOgorICAgICAgICAgICAgaWYgKG5vbG9hZF9vYmooc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBJTlNUOgotCQkJaWYgKG5vbG9hZF9pbnN0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIElOU1Q6CisgICAgICAgICAgICBpZiAobm9sb2FkX2luc3Qoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBORVdPQko6Ci0JCQlpZiAobm9sb2FkX25ld29iaihzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBORVdPQko6CisgICAgICAgICAgICBpZiAobm9sb2FkX25ld29iaihzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEdMT0JBTDoKLQkJCWlmIChub2xvYWRfZ2xvYmFsKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEdMT0JBTDoKKyAgICAgICAgICAgIGlmIChub2xvYWRfZ2xvYmFsKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQVBQRU5EOgotCQkJaWYgKGxvYWRfYXBwZW5kKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEFQUEVORDoKKyAgICAgICAgICAgIGlmIChsb2FkX2FwcGVuZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEFQUEVORFM6Ci0JCQlpZiAobG9hZF9hcHBlbmRzKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEFQUEVORFM6CisgICAgICAgICAgICBpZiAobG9hZF9hcHBlbmRzKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQlVJTEQ6Ci0JCQlpZiAobm9sb2FkX2J1aWxkKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJVSUxEOgorICAgICAgICAgICAgaWYgKG5vbG9hZF9idWlsZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIERVUDoKLQkJCWlmIChsb2FkX2R1cChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBEVVA6CisgICAgICAgICAgICBpZiAobG9hZF9kdXAoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCSU5HRVQ6Ci0JCQlpZiAobG9hZF9iaW5nZXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgQklOR0VUOgorICAgICAgICAgICAgaWYgKGxvYWRfYmluZ2V0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9OR19CSU5HRVQ6Ci0JCQlpZiAobG9hZF9sb25nX2JpbmdldChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBMT05HX0JJTkdFVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2xvbmdfYmluZ2V0KHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgR0VUOgotCQkJaWYgKGxvYWRfZ2V0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEdFVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2dldChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEVYVDE6Ci0JCQlpZiAobm9sb2FkX2V4dGVuc2lvbihzZWxmLCAxKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBFWFQxOgorICAgICAgICAgICAgaWYgKG5vbG9hZF9leHRlbnNpb24oc2VsZiwgMSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBFWFQyOgotCQkJaWYgKG5vbG9hZF9leHRlbnNpb24oc2VsZiwgMikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgRVhUMjoKKyAgICAgICAgICAgIGlmIChub2xvYWRfZXh0ZW5zaW9uKHNlbGYsIDIpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgRVhUNDoKLQkJCWlmIChub2xvYWRfZXh0ZW5zaW9uKHNlbGYsIDQpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEVYVDQ6CisgICAgICAgICAgICBpZiAobm9sb2FkX2V4dGVuc2lvbihzZWxmLCA0KSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIE1BUks6Ci0JCQlpZiAobG9hZF9tYXJrKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIE1BUks6CisgICAgICAgICAgICBpZiAobG9hZF9tYXJrKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQklOUFVUOgotCQkJaWYgKGxvYWRfYmlucHV0KHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIEJJTlBVVDoKKyAgICAgICAgICAgIGlmIChsb2FkX2JpbnB1dChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIExPTkdfQklOUFVUOgotCQkJaWYgKGxvYWRfbG9uZ19iaW5wdXQoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9OR19CSU5QVVQ6CisgICAgICAgICAgICBpZiAobG9hZF9sb25nX2JpbnB1dChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFBVVDoKLQkJCWlmIChsb2FkX3B1dChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBQVVQ6CisgICAgICAgICAgICBpZiAobG9hZF9wdXQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBQT1A6Ci0JCQlpZiAobG9hZF9wb3Aoc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUE9QOgorICAgICAgICAgICAgaWYgKGxvYWRfcG9wKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgUE9QX01BUks6Ci0JCQlpZiAobG9hZF9wb3BfbWFyayhzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBQT1BfTUFSSzoKKyAgICAgICAgICAgIGlmIChsb2FkX3BvcF9tYXJrKHNlbGYpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgU0VUSVRFTToKLQkJCWlmIChsb2FkX3NldGl0ZW0oc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgU0VUSVRFTToKKyAgICAgICAgICAgIGlmIChsb2FkX3NldGl0ZW0oc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBTRVRJVEVNUzoKLQkJCWlmIChsb2FkX3NldGl0ZW1zKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFNFVElURU1TOgorICAgICAgICAgICAgaWYgKGxvYWRfc2V0aXRlbXMoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBTVE9QOgotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUDoKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUEVSU0lEOgotCQkJaWYgKGxvYWRfcGVyc2lkKHNlbGYpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIFBFUlNJRDoKKyAgICAgICAgICAgIGlmIChsb2FkX3BlcnNpZChzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIEJJTlBFUlNJRDoKLQkJCWlmIChsb2FkX2JpbnBlcnNpZChzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBCSU5QRVJTSUQ6CisgICAgICAgICAgICBpZiAobG9hZF9iaW5wZXJzaWQoc2VsZikgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBSRURVQ0U6Ci0JCQlpZiAobm9sb2FkX3JlZHVjZShzZWxmKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBSRURVQ0U6CisgICAgICAgICAgICBpZiAobm9sb2FkX3JlZHVjZShzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFBST1RPOgotCQkJaWYgKGxvYWRfcHJvdG8oc2VsZikgPCAwKQotCQkJCWJyZWFrOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUFJPVE86CisgICAgICAgICAgICBpZiAobG9hZF9wcm90byhzZWxmKSA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIE5FV1RSVUU6Ci0JCQlpZiAobG9hZF9ib29sKHNlbGYsIFB5X1RydWUpIDwgMCkKLQkJCQlicmVhazsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIE5FV1RSVUU6CisgICAgICAgICAgICBpZiAobG9hZF9ib29sKHNlbGYsIFB5X1RydWUpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTkVXRkFMU0U6Ci0JCQlpZiAobG9hZF9ib29sKHNlbGYsIFB5X0ZhbHNlKSA8IDApCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKLQkJZGVmYXVsdDoKLQkJCWNQaWNrbGVfRXJyRm9ybWF0KFVucGlja2xpbmdFcnJvciwKLQkJCQkJICAiaW52YWxpZCBsb2FkIGtleSwgJyVzJy4iLAotCQkJCQkgICJjIiwgc1swXSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBjYXNlIE5FV0ZBTFNFOgorICAgICAgICAgICAgaWYgKGxvYWRfYm9vbChzZWxmLCBQeV9GYWxzZSkgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjUGlja2xlX0VyckZvcm1hdChVbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsb2FkIGtleSwgJyVzJy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiLCBzWzBdKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJYnJlYWs7Ci0JfQorICAgICAgICBicmVhazsKKyAgICB9CiAKLQlpZiAoKGVyciA9IFB5RXJyX09jY3VycmVkKCkpKSB7Ci0JCWlmIChlcnIgPT0gUHlFeGNfRU9GRXJyb3IpIHsKLQkJCVB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOwotCQl9Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKGVyciA9IFB5RXJyX09jY3VycmVkKCkpKSB7CisgICAgICAgIGlmIChlcnIgPT0gUHlFeGNfRU9GRXJyb3IpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfRU9GRXJyb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVBEQVRBX1BPUChzZWxmLT5zdGFjaywgdmFsKTsKLQlyZXR1cm4gdmFsOworICAgIFBEQVRBX1BPUChzZWxmLT5zdGFjaywgdmFsKTsKKyAgICByZXR1cm4gdmFsOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBVbnBpY2tsZXJfbG9hZChVbnBpY2tsZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JcmV0dXJuIGxvYWQoc2VsZik7CisgICAgcmV0dXJuIGxvYWQoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBVbnBpY2tsZXJfbm9sb2FkKFVucGlja2xlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlyZXR1cm4gbm9sb2FkKHNlbGYpOworICAgIHJldHVybiBub2xvYWQoc2VsZik7CiB9CiAKIApAQCAtNTMwNSwxNzUgKzUzMDUsMTc1IEBACiBzdGF0aWMgVW5waWNrbGVyb2JqZWN0ICoKIG5ld1VucGlja2xlcm9iamVjdChQeU9iamVjdCAqZikKIHsKLQlVbnBpY2tsZXJvYmplY3QgKnNlbGY7CisgICAgVW5waWNrbGVyb2JqZWN0ICpzZWxmOwogCi0JaWYgKCEoIHNlbGYgPSBQeU9iamVjdF9HQ19OZXcoVW5waWNrbGVyb2JqZWN0LCAmVW5waWNrbGVydHlwZSkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISggc2VsZiA9IFB5T2JqZWN0X0dDX05ldyhVbnBpY2tsZXJvYmplY3QsICZVbnBpY2tsZXJ0eXBlKSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZi0+ZmlsZSA9IE5VTEw7Ci0Jc2VsZi0+YXJnID0gTlVMTDsKLQlzZWxmLT5zdGFjayA9IChQZGF0YSopUGRhdGFfTmV3KCk7Ci0Jc2VsZi0+cGVyc19mdW5jID0gTlVMTDsKLQlzZWxmLT5sYXN0X3N0cmluZyA9IE5VTEw7Ci0Jc2VsZi0+bWFya3MgPSBOVUxMOwotCXNlbGYtPm51bV9tYXJrcyA9IDA7Ci0Jc2VsZi0+bWFya3Nfc2l6ZSA9IDA7Ci0Jc2VsZi0+YnVmX3NpemUgPSAwOwotCXNlbGYtPnJlYWQgPSBOVUxMOwotCXNlbGYtPnJlYWRsaW5lID0gTlVMTDsKLQlzZWxmLT5maW5kX2NsYXNzID0gTlVMTDsKKyAgICBzZWxmLT5maWxlID0gTlVMTDsKKyAgICBzZWxmLT5hcmcgPSBOVUxMOworICAgIHNlbGYtPnN0YWNrID0gKFBkYXRhKilQZGF0YV9OZXcoKTsKKyAgICBzZWxmLT5wZXJzX2Z1bmMgPSBOVUxMOworICAgIHNlbGYtPmxhc3Rfc3RyaW5nID0gTlVMTDsKKyAgICBzZWxmLT5tYXJrcyA9IE5VTEw7CisgICAgc2VsZi0+bnVtX21hcmtzID0gMDsKKyAgICBzZWxmLT5tYXJrc19zaXplID0gMDsKKyAgICBzZWxmLT5idWZfc2l6ZSA9IDA7CisgICAgc2VsZi0+cmVhZCA9IE5VTEw7CisgICAgc2VsZi0+cmVhZGxpbmUgPSBOVUxMOworICAgIHNlbGYtPmZpbmRfY2xhc3MgPSBOVUxMOwogCi0JaWYgKCEoIHNlbGYtPm1lbW8gPSBQeURpY3RfTmV3KCkpKQotCQlnb3RvIGVycjsKKyAgICBpZiAoISggc2VsZi0+bWVtbyA9IFB5RGljdF9OZXcoKSkpCisgICAgICAgIGdvdG8gZXJyOwogCi0JaWYgKCFzZWxmLT5zdGFjaykKLQkJZ290byBlcnI7CisgICAgaWYgKCFzZWxmLT5zdGFjaykKKyAgICAgICAgZ290byBlcnI7CiAKLQlQeV9JTkNSRUYoZik7Ci0Jc2VsZi0+ZmlsZSA9IGY7CisgICAgUHlfSU5DUkVGKGYpOworICAgIHNlbGYtPmZpbGUgPSBmOwogCi0JLyogU2V0IHJlYWQsIHJlYWRsaW5lIGJhc2VkIG9uIHR5cGUgb2YgZiAqLwotCWlmIChQeUZpbGVfQ2hlY2soZikpIHsKLQkJc2VsZi0+ZnAgPSBQeUZpbGVfQXNGaWxlKGYpOwotCQlpZiAoc2VsZi0+ZnAgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlzZWxmLT5yZWFkX2Z1bmMgPSByZWFkX2ZpbGU7Ci0JCXNlbGYtPnJlYWRsaW5lX2Z1bmMgPSByZWFkbGluZV9maWxlOwotCX0KLQllbHNlIGlmIChQeWNTdHJpbmdJT19JbnB1dENoZWNrKGYpKSB7Ci0JCXNlbGYtPmZwID0gTlVMTDsKLQkJc2VsZi0+cmVhZF9mdW5jID0gcmVhZF9jU3RyaW5nSU87Ci0JCXNlbGYtPnJlYWRsaW5lX2Z1bmMgPSByZWFkbGluZV9jU3RyaW5nSU87Ci0JfQotCWVsc2UgeworICAgIC8qIFNldCByZWFkLCByZWFkbGluZSBiYXNlZCBvbiB0eXBlIG9mIGYgKi8KKyAgICBpZiAoUHlGaWxlX0NoZWNrKGYpKSB7CisgICAgICAgIHNlbGYtPmZwID0gUHlGaWxlX0FzRmlsZShmKTsKKyAgICAgICAgaWYgKHNlbGYtPmZwID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5yZWFkX2Z1bmMgPSByZWFkX2ZpbGU7CisgICAgICAgIHNlbGYtPnJlYWRsaW5lX2Z1bmMgPSByZWFkbGluZV9maWxlOworICAgIH0KKyAgICBlbHNlIGlmIChQeWNTdHJpbmdJT19JbnB1dENoZWNrKGYpKSB7CisgICAgICAgIHNlbGYtPmZwID0gTlVMTDsKKyAgICAgICAgc2VsZi0+cmVhZF9mdW5jID0gcmVhZF9jU3RyaW5nSU87CisgICAgICAgIHNlbGYtPnJlYWRsaW5lX2Z1bmMgPSByZWFkbGluZV9jU3RyaW5nSU87CisgICAgfQorICAgIGVsc2UgewogCi0JCXNlbGYtPmZwID0gTlVMTDsKLQkJc2VsZi0+cmVhZF9mdW5jID0gcmVhZF9vdGhlcjsKLQkJc2VsZi0+cmVhZGxpbmVfZnVuYyA9IHJlYWRsaW5lX290aGVyOworICAgICAgICBzZWxmLT5mcCA9IE5VTEw7CisgICAgICAgIHNlbGYtPnJlYWRfZnVuYyA9IHJlYWRfb3RoZXI7CisgICAgICAgIHNlbGYtPnJlYWRsaW5lX2Z1bmMgPSByZWFkbGluZV9vdGhlcjsKIAotCQlpZiAoISggKHNlbGYtPnJlYWRsaW5lID0gUHlPYmplY3RfR2V0QXR0cihmLCByZWFkbGluZV9zdHIpKSAmJgotCQkgICAgICAgKHNlbGYtPnJlYWQgPSBQeU9iamVjdF9HZXRBdHRyKGYsIHJlYWRfc3RyKSkpKSAgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCVB5RXJyX1NldFN0cmluZyggUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgImFyZ3VtZW50IG11c3QgaGF2ZSAncmVhZCcgYW5kICIKLQkJCQkJICIncmVhZGxpbmUnIGF0dHJpYnV0ZXMiICk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQlQeU9iamVjdF9HQ19UcmFjayhzZWxmKTsKKyAgICAgICAgaWYgKCEoIChzZWxmLT5yZWFkbGluZSA9IFB5T2JqZWN0X0dldEF0dHIoZiwgcmVhZGxpbmVfc3RyKSkgJiYKKyAgICAgICAgICAgICAgIChzZWxmLT5yZWFkID0gUHlPYmplY3RfR2V0QXR0cihmLCByZWFkX3N0cikpKSkgIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IG11c3QgaGF2ZSAncmVhZCcgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidyZWFkbGluZScgYXR0cmlidXRlcyIgKTsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisgICAgfQorICAgIFB5T2JqZWN0X0dDX1RyYWNrKHNlbGYpOwogCi0JcmV0dXJuIHNlbGY7CisgICAgcmV0dXJuIHNlbGY7CiAKICAgZXJyOgotCVB5X0RFQ1JFRigoUHlPYmplY3QgKilzZWxmKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9VbnBpY2tsZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpmaWxlKQogewotCXJldHVybiAoUHlPYmplY3QgKiluZXdVbnBpY2tsZXJvYmplY3QoZmlsZSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld1VucGlja2xlcm9iamVjdChmaWxlKTsKIH0KIAogCiBzdGF0aWMgdm9pZAogVW5waWNrbGVyX2RlYWxsb2MoVW5waWNrbGVyb2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soKFB5T2JqZWN0ICopc2VsZik7Ci0JUHlfWERFQ1JFRihzZWxmLT5yZWFkbGluZSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5yZWFkKTsKLQlQeV9YREVDUkVGKHNlbGYtPmZpbGUpOwotCVB5X1hERUNSRUYoc2VsZi0+bWVtbyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5zdGFjayk7Ci0JUHlfWERFQ1JFRihzZWxmLT5wZXJzX2Z1bmMpOwotCVB5X1hERUNSRUYoc2VsZi0+YXJnKTsKLQlQeV9YREVDUkVGKHNlbGYtPmxhc3Rfc3RyaW5nKTsKLQlQeV9YREVDUkVGKHNlbGYtPmZpbmRfY2xhc3MpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5yZWFkbGluZSk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5yZWFkKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmZpbGUpOworICAgIFB5X1hERUNSRUYoc2VsZi0+bWVtbyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5zdGFjayk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5wZXJzX2Z1bmMpOworICAgIFB5X1hERUNSRUYoc2VsZi0+YXJnKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmxhc3Rfc3RyaW5nKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPmZpbmRfY2xhc3MpOwogCi0JaWYgKHNlbGYtPm1hcmtzKSB7Ci0JCWZyZWUoc2VsZi0+bWFya3MpOwotCX0KKyAgICBpZiAoc2VsZi0+bWFya3MpIHsKKyAgICAgICAgZnJlZShzZWxmLT5tYXJrcyk7CisgICAgfQogCi0JaWYgKHNlbGYtPmJ1Zl9zaXplKSB7Ci0JCWZyZWUoc2VsZi0+YnVmKTsKLQl9CisgICAgaWYgKHNlbGYtPmJ1Zl9zaXplKSB7CisgICAgICAgIGZyZWUoc2VsZi0+YnVmKTsKKyAgICB9CiAKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIFVucGlja2xlcl90cmF2ZXJzZShVbnBpY2tsZXJvYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNlbGYtPnJlYWRsaW5lKTsKLQlQeV9WSVNJVChzZWxmLT5yZWFkKTsKLQlQeV9WSVNJVChzZWxmLT5maWxlKTsKLQlQeV9WSVNJVChzZWxmLT5tZW1vKTsKLQlQeV9WSVNJVChzZWxmLT5zdGFjayk7Ci0JUHlfVklTSVQoc2VsZi0+cGVyc19mdW5jKTsKLQlQeV9WSVNJVChzZWxmLT5hcmcpOwotCVB5X1ZJU0lUKHNlbGYtPmxhc3Rfc3RyaW5nKTsKLQlQeV9WSVNJVChzZWxmLT5maW5kX2NsYXNzKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChzZWxmLT5yZWFkbGluZSk7CisgICAgUHlfVklTSVQoc2VsZi0+cmVhZCk7CisgICAgUHlfVklTSVQoc2VsZi0+ZmlsZSk7CisgICAgUHlfVklTSVQoc2VsZi0+bWVtbyk7CisgICAgUHlfVklTSVQoc2VsZi0+c3RhY2spOworICAgIFB5X1ZJU0lUKHNlbGYtPnBlcnNfZnVuYyk7CisgICAgUHlfVklTSVQoc2VsZi0+YXJnKTsKKyAgICBQeV9WSVNJVChzZWxmLT5sYXN0X3N0cmluZyk7CisgICAgUHlfVklTSVQoc2VsZi0+ZmluZF9jbGFzcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIFVucGlja2xlcl9jbGVhcihVbnBpY2tsZXJvYmplY3QgKnNlbGYpCiB7Ci0JUHlfQ0xFQVIoc2VsZi0+cmVhZGxpbmUpOwotCVB5X0NMRUFSKHNlbGYtPnJlYWQpOwotCVB5X0NMRUFSKHNlbGYtPmZpbGUpOwotCVB5X0NMRUFSKHNlbGYtPm1lbW8pOwotCVB5X0NMRUFSKHNlbGYtPnN0YWNrKTsKLQlQeV9DTEVBUihzZWxmLT5wZXJzX2Z1bmMpOwotCVB5X0NMRUFSKHNlbGYtPmFyZyk7Ci0JUHlfQ0xFQVIoc2VsZi0+bGFzdF9zdHJpbmcpOwotCVB5X0NMRUFSKHNlbGYtPmZpbmRfY2xhc3MpOwotCXJldHVybiAwOworICAgIFB5X0NMRUFSKHNlbGYtPnJlYWRsaW5lKTsKKyAgICBQeV9DTEVBUihzZWxmLT5yZWFkKTsKKyAgICBQeV9DTEVBUihzZWxmLT5maWxlKTsKKyAgICBQeV9DTEVBUihzZWxmLT5tZW1vKTsKKyAgICBQeV9DTEVBUihzZWxmLT5zdGFjayk7CisgICAgUHlfQ0xFQVIoc2VsZi0+cGVyc19mdW5jKTsKKyAgICBQeV9DTEVBUihzZWxmLT5hcmcpOworICAgIFB5X0NMRUFSKHNlbGYtPmxhc3Rfc3RyaW5nKTsKKyAgICBQeV9DTEVBUihzZWxmLT5maW5kX2NsYXNzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFVucGlja2xlcl9nZXRhdHRyKFVucGlja2xlcm9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQlpZiAoIXN0cmNtcChuYW1lLCAicGVyc2lzdGVudF9sb2FkIikpIHsKLQkJaWYgKCFzZWxmLT5wZXJzX2Z1bmMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIGlmICghc3RyY21wKG5hbWUsICJwZXJzaXN0ZW50X2xvYWQiKSkgeworICAgICAgICBpZiAoIXNlbGYtPnBlcnNfZnVuYykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJUHlfSU5DUkVGKHNlbGYtPnBlcnNfZnVuYyk7Ci0JCXJldHVybiBzZWxmLT5wZXJzX2Z1bmM7Ci0JfQorICAgICAgICBQeV9JTkNSRUYoc2VsZi0+cGVyc19mdW5jKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPnBlcnNfZnVuYzsKKyAgICB9CiAKLQlpZiAoIXN0cmNtcChuYW1lLCAiZmluZF9nbG9iYWwiKSkgewotCQlpZiAoIXNlbGYtPmZpbmRfY2xhc3MpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIGlmICghc3RyY21wKG5hbWUsICJmaW5kX2dsb2JhbCIpKSB7CisgICAgICAgIGlmICghc2VsZi0+ZmluZF9jbGFzcykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJUHlfSU5DUkVGKHNlbGYtPmZpbmRfY2xhc3MpOwotCQlyZXR1cm4gc2VsZi0+ZmluZF9jbGFzczsKLQl9CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5maW5kX2NsYXNzKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPmZpbmRfY2xhc3M7CisgICAgfQogCi0JaWYgKCFzdHJjbXAobmFtZSwgIm1lbW8iKSkgewotCQlpZiAoIXNlbGYtPm1lbW8pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIGlmICghc3RyY21wKG5hbWUsICJtZW1vIikpIHsKKyAgICAgICAgaWYgKCFzZWxmLT5tZW1vKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlQeV9JTkNSRUYoc2VsZi0+bWVtbyk7Ci0JCXJldHVybiBzZWxmLT5tZW1vOwotCX0KKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPm1lbW8pOworICAgICAgICByZXR1cm4gc2VsZi0+bWVtbzsKKyAgICB9CiAKLQlpZiAoIXN0cmNtcChuYW1lLCAiVW5waWNrbGluZ0Vycm9yIikpIHsKLQkJUHlfSU5DUkVGKFVucGlja2xpbmdFcnJvcik7Ci0JCXJldHVybiBVbnBpY2tsaW5nRXJyb3I7Ci0JfQorICAgIGlmICghc3RyY21wKG5hbWUsICJVbnBpY2tsaW5nRXJyb3IiKSkgeworICAgICAgICBQeV9JTkNSRUYoVW5waWNrbGluZ0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIFVucGlja2xpbmdFcnJvcjsKKyAgICB9CiAKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChVbnBpY2tsZXJfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoVW5waWNrbGVyX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCiAKQEAgLTU0ODEsNDAgKzU0ODEsNDAgQEAKIFVucGlja2xlcl9zZXRhdHRyKFVucGlja2xlcm9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnZhbHVlKQogewogCi0JaWYgKCFzdHJjbXAobmFtZSwgInBlcnNpc3RlbnRfbG9hZCIpKSB7Ci0JCVB5X1hERUNSRUYoc2VsZi0+cGVyc19mdW5jKTsKLQkJc2VsZi0+cGVyc19mdW5jID0gdmFsdWU7Ci0JCVB5X1hJTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKCFzdHJjbXAobmFtZSwgInBlcnNpc3RlbnRfbG9hZCIpKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+cGVyc19mdW5jKTsKKyAgICAgICAgc2VsZi0+cGVyc19mdW5jID0gdmFsdWU7CisgICAgICAgIFB5X1hJTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAoIXN0cmNtcChuYW1lLCAiZmluZF9nbG9iYWwiKSkgewotCQlQeV9YREVDUkVGKHNlbGYtPmZpbmRfY2xhc3MpOwotCQlzZWxmLT5maW5kX2NsYXNzID0gdmFsdWU7Ci0JCVB5X1hJTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKCFzdHJjbXAobmFtZSwgImZpbmRfZ2xvYmFsIikpIHsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5maW5kX2NsYXNzKTsKKyAgICAgICAgc2VsZi0+ZmluZF9jbGFzcyA9IHZhbHVlOworICAgICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKCEgdmFsdWUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXR0cmlidXRlIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoISB2YWx1ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoc3RyY21wKG5hbWUsICJtZW1vIikgPT0gMCkgewotCQlpZiAoIVB5RGljdF9DaGVjayh2YWx1ZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJtZW1vIG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfWERFQ1JFRihzZWxmLT5tZW1vKTsKLQkJc2VsZi0+bWVtbyA9IHZhbHVlOwotCQlQeV9JTkNSRUYodmFsdWUpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKHN0cmNtcChuYW1lLCAibWVtbyIpID09IDApIHsKKyAgICAgICAgaWYgKCFQeURpY3RfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZW1vIG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5tZW1vKTsKKyAgICAgICAgc2VsZi0+bWVtbyA9IHZhbHVlOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01NTI1LDI4ICs1NTI1LDI4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY3BtX2R1bXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im9iaiIsICJmaWxlIiwgInByb3RvY29sIiwgTlVMTH07Ci0JUHlPYmplY3QgKm9iLCAqZmlsZSwgKnJlcyA9IE5VTEw7Ci0JUGlja2xlcm9iamVjdCAqcGlja2xlciA9IDA7Ci0JaW50IHByb3RvID0gMDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im9iaiIsICJmaWxlIiwgInByb3RvY29sIiwgTlVMTH07CisgICAgUHlPYmplY3QgKm9iLCAqZmlsZSwgKnJlcyA9IE5VTEw7CisgICAgUGlja2xlcm9iamVjdCAqcGlja2xlciA9IDA7CisgICAgaW50IHByb3RvID0gMDsKIAotCWlmICghKCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9PfGkiLCBrd2xpc3QsCi0JCSAgICZvYiwgJmZpbGUsICZwcm90bykpKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT098aSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICZvYiwgJmZpbGUsICZwcm90bykpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoISggcGlja2xlciA9IG5ld1BpY2tsZXJvYmplY3QoZmlsZSwgcHJvdG8pKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBwaWNrbGVyID0gbmV3UGlja2xlcm9iamVjdChmaWxlLCBwcm90bykpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoZHVtcChwaWNrbGVyLCBvYikgPCAwKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKGR1bXAocGlja2xlciwgb2IpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJlcyA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJlcyA9IFB5X05vbmU7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKHBpY2tsZXIpOworICAgIFB5X1hERUNSRUYocGlja2xlcik7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIApAQCAtNTU1NCwzMSArNTU1NCwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNwbV9kdW1wcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsib2JqIiwgInByb3RvY29sIiwgTlVMTH07Ci0JUHlPYmplY3QgKm9iLCAqZmlsZSA9IDAsICpyZXMgPSBOVUxMOwotCVBpY2tsZXJvYmplY3QgKnBpY2tsZXIgPSAwOwotCWludCBwcm90byA9IDA7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJvYmoiLCAicHJvdG9jb2wiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqb2IsICpmaWxlID0gMCwgKnJlcyA9IE5VTEw7CisgICAgUGlja2xlcm9iamVjdCAqcGlja2xlciA9IDA7CisgICAgaW50IHByb3RvID0gMDsKIAotCWlmICghKCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98aTpkdW1wcyIsIGt3bGlzdCwKLQkJICAgJm9iLCAmcHJvdG8pKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98aTpkdW1wcyIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICZvYiwgJnByb3RvKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmICghKCBmaWxlID0gUHljU3RyaW5nSU8tPk5ld091dHB1dCgxMjgpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBmaWxlID0gUHljU3RyaW5nSU8tPk5ld091dHB1dCgxMjgpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKCEoIHBpY2tsZXIgPSBuZXdQaWNrbGVyb2JqZWN0KGZpbGUsIHByb3RvKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggcGlja2xlciA9IG5ld1BpY2tsZXJvYmplY3QoZmlsZSwgcHJvdG8pKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JaWYgKGR1bXAocGlja2xlciwgb2IpIDwgMCkKLQkJZ290byBmaW5hbGx5OworICAgIGlmIChkdW1wKHBpY2tsZXIsIG9iKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCXJlcyA9IFB5Y1N0cmluZ0lPLT5jZ2V0dmFsdWUoZmlsZSk7CisgICAgcmVzID0gUHljU3RyaW5nSU8tPmNnZXR2YWx1ZShmaWxlKTsKIAogICBmaW5hbGx5OgotCVB5X1hERUNSRUYocGlja2xlcik7Ci0JUHlfWERFQ1JFRihmaWxlKTsKKyAgICBQeV9YREVDUkVGKHBpY2tsZXIpOworICAgIFB5X1hERUNSRUYoZmlsZSk7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIApAQCAtNTU4NiwxOCArNTU4NiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNwbV9sb2FkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2IpCiB7Ci0JVW5waWNrbGVyb2JqZWN0ICp1bnBpY2tsZXIgPSAwOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIFVucGlja2xlcm9iamVjdCAqdW5waWNrbGVyID0gMDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKIAotCWlmICghKCB1bnBpY2tsZXIgPSBuZXdVbnBpY2tsZXJvYmplY3Qob2IpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCB1bnBpY2tsZXIgPSBuZXdVbnBpY2tsZXJvYmplY3Qob2IpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JcmVzID0gbG9hZCh1bnBpY2tsZXIpOworICAgIHJlcyA9IGxvYWQodW5waWNrbGVyKTsKIAogICBmaW5hbGx5OgotCVB5X1hERUNSRUYodW5waWNrbGVyKTsKKyAgICBQeV9YREVDUkVGKHVucGlja2xlcik7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIApAQCAtNTYwNSwyNSArNTYwNSwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNwbV9sb2FkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKm9iLCAqZmlsZSA9IDAsICpyZXMgPSBOVUxMOwotCVVucGlja2xlcm9iamVjdCAqdW5waWNrbGVyID0gMDsKKyAgICBQeU9iamVjdCAqb2IsICpmaWxlID0gMCwgKnJlcyA9IE5VTEw7CisgICAgVW5waWNrbGVyb2JqZWN0ICp1bnBpY2tsZXIgPSAwOwogCi0JaWYgKCEoIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlM6bG9hZHMiLCAmb2IpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTOmxvYWRzIiwgJm9iKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmICghKCBmaWxlID0gUHljU3RyaW5nSU8tPk5ld0lucHV0KG9iKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISggZmlsZSA9IFB5Y1N0cmluZ0lPLT5OZXdJbnB1dChvYikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlpZiAoISggdW5waWNrbGVyID0gbmV3VW5waWNrbGVyb2JqZWN0KGZpbGUpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKCB1bnBpY2tsZXIgPSBuZXdVbnBpY2tsZXJvYmplY3QoZmlsZSkpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQlyZXMgPSBsb2FkKHVucGlja2xlcik7CisgICAgcmVzID0gbG9hZCh1bnBpY2tsZXIpOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihmaWxlKTsKLQlQeV9YREVDUkVGKHVucGlja2xlcik7CisgICAgUHlfWERFQ1JFRihmaWxlKTsKKyAgICBQeV9YREVDUkVGKHVucGlja2xlcik7CiAKLQlyZXR1cm4gcmVzOworICAgIHJldHVybiByZXM7CiB9CiAKIApAQCAtNTYzMiwyOCArNTYzMiwyOCBAQAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFVucGlja2xlcnR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgImNQaWNrbGUuVW5waWNrbGVyIiwgCSAgICAgICAgIC8qdHBfbmFtZSovCisgICAgImNQaWNrbGUuVW5waWNrbGVyIiwgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCiAgICAgc2l6ZW9mKFVucGlja2xlcm9iamVjdCksICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KICAgICAwLAotICAgIChkZXN0cnVjdG9yKVVucGlja2xlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0gICAgMCwJCQkJCS8qIHRwX3ByaW50ICovCi0gICAgKGdldGF0dHJmdW5jKVVucGlja2xlcl9nZXRhdHRyLAkvKiB0cF9nZXRhdHRyICovCi0gICAgKHNldGF0dHJmdW5jKVVucGlja2xlcl9zZXRhdHRyLAkvKiB0cF9zZXRhdHRyICovCi0gICAgMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLSAgICAwLAkJIAkJCS8qIHRwX3JlcHIgKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLSAgICAwLAkJCQkJLyogdHBfaGFzaCAqLwotICAgIDAsCQkJCQkvKiB0cF9jYWxsICovCi0gICAgMCwJCQkJCS8qIHRwX3N0ciAqLwotICAgIDAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotICAgIDAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KKyAgICAoZGVzdHJ1Y3RvcilVbnBpY2tsZXJfZGVhbGxvYywgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAoZ2V0YXR0cmZ1bmMpVW5waWNrbGVyX2dldGF0dHIsICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgKHNldGF0dHJmdW5jKVVucGlja2xlcl9zZXRhdHRyLCAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywKLSAgICBVbnBpY2tsZXJ0eXBlX19kb2NfXywJCS8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpVW5waWNrbGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotICAgIChpbnF1aXJ5KVVucGlja2xlcl9jbGVhciwJCS8qIHRwX2NsZWFyICovCisgICAgVW5waWNrbGVydHlwZV9fZG9jX18sICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylVbnBpY2tsZXJfdHJhdmVyc2UsICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlVbnBpY2tsZXJfY2xlYXIsICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBjUGlja2xlX21ldGhvZHNbXSA9IHsKQEAgLTU3MTEsMTk4ICs1NzExLDE5OCBAQAogc3RhdGljIGludAogaW5pdF9zdHVmZihQeU9iamVjdCAqbW9kdWxlX2RpY3QpCiB7Ci0JUHlPYmplY3QgKmNvcHlyZWcsICp0LCAqcjsKKyAgICBQeU9iamVjdCAqY29weXJlZywgKnQsICpyOwogCiAjZGVmaW5lIElOSVRfU1RSKFMpIGlmICghKCBTICMjIF9zdHI9UHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygjUykpKSAgcmV0dXJuIC0xOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmVW5waWNrbGVydHlwZSkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUGlja2xlcnR5cGUpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlVucGlja2xlcnR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlBpY2tsZXJ0eXBlKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCUlOSVRfU1RSKF9fY2xhc3NfXyk7Ci0JSU5JVF9TVFIoX19nZXRpbml0YXJnc19fKTsKLQlJTklUX1NUUihfX2RpY3RfXyk7Ci0JSU5JVF9TVFIoX19nZXRzdGF0ZV9fKTsKLQlJTklUX1NUUihfX3NldHN0YXRlX18pOwotCUlOSVRfU1RSKF9fbmFtZV9fKTsKLQlJTklUX1NUUihfX21haW5fXyk7Ci0JSU5JVF9TVFIoX19yZWR1Y2VfXyk7Ci0JSU5JVF9TVFIoX19yZWR1Y2VfZXhfXyk7Ci0JSU5JVF9TVFIod3JpdGUpOwotCUlOSVRfU1RSKGFwcGVuZCk7Ci0JSU5JVF9TVFIocmVhZCk7Ci0JSU5JVF9TVFIocmVhZGxpbmUpOwotCUlOSVRfU1RSKGRpc3BhdGNoX3RhYmxlKTsKKyAgICBJTklUX1NUUihfX2NsYXNzX18pOworICAgIElOSVRfU1RSKF9fZ2V0aW5pdGFyZ3NfXyk7CisgICAgSU5JVF9TVFIoX19kaWN0X18pOworICAgIElOSVRfU1RSKF9fZ2V0c3RhdGVfXyk7CisgICAgSU5JVF9TVFIoX19zZXRzdGF0ZV9fKTsKKyAgICBJTklUX1NUUihfX25hbWVfXyk7CisgICAgSU5JVF9TVFIoX19tYWluX18pOworICAgIElOSVRfU1RSKF9fcmVkdWNlX18pOworICAgIElOSVRfU1RSKF9fcmVkdWNlX2V4X18pOworICAgIElOSVRfU1RSKHdyaXRlKTsKKyAgICBJTklUX1NUUihhcHBlbmQpOworICAgIElOSVRfU1RSKHJlYWQpOworICAgIElOSVRfU1RSKHJlYWRsaW5lKTsKKyAgICBJTklUX1NUUihkaXNwYXRjaF90YWJsZSk7CiAKLQlpZiAoISggY29weXJlZyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiY29weV9yZWciKSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoISggY29weXJlZyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiY29weV9yZWciKSkpCisgICAgICAgIHJldHVybiAtMTsKIAotCS8qIFRoaXMgaXMgc3BlY2lhbCBiZWNhdXNlIHdlIHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50Ci0JICAgb25lIGluIHJlc3RyaWN0ZWQgbW9kZS4gKi8KLQlkaXNwYXRjaF90YWJsZSA9IFB5T2JqZWN0X0dldEF0dHIoY29weXJlZywgZGlzcGF0Y2hfdGFibGVfc3RyKTsKLQlpZiAoIWRpc3BhdGNoX3RhYmxlKSByZXR1cm4gLTE7CisgICAgLyogVGhpcyBpcyBzcGVjaWFsIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQKKyAgICAgICBvbmUgaW4gcmVzdHJpY3RlZCBtb2RlLiAqLworICAgIGRpc3BhdGNoX3RhYmxlID0gUHlPYmplY3RfR2V0QXR0cihjb3B5cmVnLCBkaXNwYXRjaF90YWJsZV9zdHIpOworICAgIGlmICghZGlzcGF0Y2hfdGFibGUpIHJldHVybiAtMTsKIAotCWV4dGVuc2lvbl9yZWdpc3RyeSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29weXJlZywKLQkJCQkiX2V4dGVuc2lvbl9yZWdpc3RyeSIpOwotCWlmICghZXh0ZW5zaW9uX3JlZ2lzdHJ5KSByZXR1cm4gLTE7CisgICAgZXh0ZW5zaW9uX3JlZ2lzdHJ5ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb3B5cmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfZXh0ZW5zaW9uX3JlZ2lzdHJ5Iik7CisgICAgaWYgKCFleHRlbnNpb25fcmVnaXN0cnkpIHJldHVybiAtMTsKIAotCWludmVydGVkX3JlZ2lzdHJ5ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb3B5cmVnLAotCQkJCSJfaW52ZXJ0ZWRfcmVnaXN0cnkiKTsKLQlpZiAoIWludmVydGVkX3JlZ2lzdHJ5KSByZXR1cm4gLTE7CisgICAgaW52ZXJ0ZWRfcmVnaXN0cnkgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNvcHlyZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9pbnZlcnRlZF9yZWdpc3RyeSIpOworICAgIGlmICghaW52ZXJ0ZWRfcmVnaXN0cnkpIHJldHVybiAtMTsKIAotCWV4dGVuc2lvbl9jYWNoZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoY29weXJlZywKLQkJCQkiX2V4dGVuc2lvbl9jYWNoZSIpOwotCWlmICghZXh0ZW5zaW9uX2NhY2hlKSByZXR1cm4gLTE7CisgICAgZXh0ZW5zaW9uX2NhY2hlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb3B5cmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfZXh0ZW5zaW9uX2NhY2hlIik7CisgICAgaWYgKCFleHRlbnNpb25fY2FjaGUpIHJldHVybiAtMTsKIAotCVB5X0RFQ1JFRihjb3B5cmVnKTsKKyAgICBQeV9ERUNSRUYoY29weXJlZyk7CiAKLQlpZiAoIShlbXB0eV90dXBsZSA9IFB5VHVwbGVfTmV3KDApKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghKGVtcHR5X3R1cGxlID0gUHlUdXBsZV9OZXcoMCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQl0d29fdHVwbGUgPSBQeVR1cGxlX05ldygyKTsKLQlpZiAodHdvX3R1cGxlID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkvKiBXZSB1c2UgdGhpcyB0ZW1wIGNvbnRhaW5lciB3aXRoIG5vIHJlZ2FyZCB0byByZWZjb3VudHMsIG9yIHRvCi0JICoga2VlcGluZyBjb250YWluZWVzIGFsaXZlLiAgRXhlbXB0IGZyb20gR0MsIGJlY2F1c2Ugd2UgZG9uJ3QKLQkgKiB3YW50IGFueXRoaW5nIGxvb2tpbmcgYXQgdHdvX3R1cGxlKCkgYnkgbWFnaWMuCi0JICovCi0JUHlPYmplY3RfR0NfVW5UcmFjayh0d29fdHVwbGUpOworICAgIHR3b190dXBsZSA9IFB5VHVwbGVfTmV3KDIpOworICAgIGlmICh0d29fdHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIFdlIHVzZSB0aGlzIHRlbXAgY29udGFpbmVyIHdpdGggbm8gcmVnYXJkIHRvIHJlZmNvdW50cywgb3IgdG8KKyAgICAgKiBrZWVwaW5nIGNvbnRhaW5lZXMgYWxpdmUuICBFeGVtcHQgZnJvbSBHQywgYmVjYXVzZSB3ZSBkb24ndAorICAgICAqIHdhbnQgYW55dGhpbmcgbG9va2luZyBhdCB0d29fdHVwbGUoKSBieSBtYWdpYy4KKyAgICAgKi8KKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHR3b190dXBsZSk7CiAKLQkvKiBVZ2ggKi8KLQlpZiAoISggdD1QeUltcG9ydF9JbXBvcnRNb2R1bGUoIl9fYnVpbHRpbl9fIikpKSAgcmV0dXJuIC0xOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIl9fYnVpbHRpbnNfXyIsIHQpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIC8qIFVnaCAqLworICAgIGlmICghKCB0PVB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiX19idWlsdGluX18iKSkpICByZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiX19idWlsdGluc19fIiwgdCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoISggdD1QeURpY3RfTmV3KCkpKSAgcmV0dXJuIC0xOwotCWlmICghKCByPVB5UnVuX1N0cmluZygKLQkJICAgICAgICJkZWYgX19zdHJfXyhzZWxmKTpcbiIKLQkJICAgICAgICIgIHJldHVybiBzZWxmLmFyZ3MgYW5kICgnJXMnICUgc2VsZi5hcmdzWzBdKSBvciAnKHdoYXQpJ1xuIiwKLQkJICAgICAgIFB5X2ZpbGVfaW5wdXQsCi0JCSAgICAgICBtb2R1bGVfZGljdCwgdCkgICkpICByZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHIpOworICAgIGlmICghKCB0PVB5RGljdF9OZXcoKSkpICByZXR1cm4gLTE7CisgICAgaWYgKCEoIHI9UHlSdW5fU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICJkZWYgX19zdHJfXyhzZWxmKTpcbiIKKyAgICAgICAgICAgICAgICAgICAiICByZXR1cm4gc2VsZi5hcmdzIGFuZCAoJyVzJyAlIHNlbGYuYXJnc1swXSkgb3IgJyh3aGF0KSdcbiIsCisgICAgICAgICAgICAgICAgICAgUHlfZmlsZV9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICBtb2R1bGVfZGljdCwgdCkgICkpICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHIpOwogCi0JUGlja2xlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNQaWNrbGUuUGlja2xlRXJyb3IiLCBOVUxMLCB0KTsKLQlpZiAoIVBpY2tsZUVycm9yKQotCQlyZXR1cm4gLTE7CisgICAgUGlja2xlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNQaWNrbGUuUGlja2xlRXJyb3IiLCBOVUxMLCB0KTsKKyAgICBpZiAoIVBpY2tsZUVycm9yKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9ERUNSRUYodCk7CisgICAgUHlfREVDUkVGKHQpOwogCi0JUGlja2xpbmdFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiY1BpY2tsZS5QaWNrbGluZ0Vycm9yIiwKLQkJCQkJICAgUGlja2xlRXJyb3IsIE5VTEwpOwotCWlmICghUGlja2xpbmdFcnJvcikKLQkJcmV0dXJuIC0xOworICAgIFBpY2tsaW5nRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNQaWNrbGUuUGlja2xpbmdFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaWNrbGVFcnJvciwgTlVMTCk7CisgICAgaWYgKCFQaWNrbGluZ0Vycm9yKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoISggdD1QeURpY3RfTmV3KCkpKSAgcmV0dXJuIC0xOwotCWlmICghKCByPVB5UnVuX1N0cmluZygKLQkJICAgICAgICJkZWYgX19zdHJfXyhzZWxmKTpcbiIKLQkJICAgICAgICIgIGE9c2VsZi5hcmdzXG4iCi0JCSAgICAgICAiICBhPWEgYW5kIHR5cGUoYVswXSkgb3IgJyh3aGF0KSdcbiIKLQkJICAgICAgICIgIHJldHVybiAnQ2Fubm90IHBpY2tsZSAlcyBvYmplY3RzJyAlIGFcbiIKLQkJICAgICAgICwgUHlfZmlsZV9pbnB1dCwKLQkJICAgICAgIG1vZHVsZV9kaWN0LCB0KSAgKSkgIHJldHVybiAtMTsKLQlQeV9ERUNSRUYocik7CisgICAgaWYgKCEoIHQ9UHlEaWN0X05ldygpKSkgIHJldHVybiAtMTsKKyAgICBpZiAoISggcj1QeVJ1bl9TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgImRlZiBfX3N0cl9fKHNlbGYpOlxuIgorICAgICAgICAgICAgICAgICAgICIgIGE9c2VsZi5hcmdzXG4iCisgICAgICAgICAgICAgICAgICAgIiAgYT1hIGFuZCB0eXBlKGFbMF0pIG9yICcod2hhdCknXG4iCisgICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICdDYW5ub3QgcGlja2xlICVzIG9iamVjdHMnICUgYVxuIgorICAgICAgICAgICAgICAgICAgICwgUHlfZmlsZV9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICBtb2R1bGVfZGljdCwgdCkgICkpICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHIpOwogCi0JaWYgKCEoIFVucGlja2xlYWJsZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKAotCQkgICAgICAgImNQaWNrbGUuVW5waWNrbGVhYmxlRXJyb3IiLCBQaWNrbGluZ0Vycm9yLCB0KSkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoISggVW5waWNrbGVhYmxlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgImNQaWNrbGUuVW5waWNrbGVhYmxlRXJyb3IiLCBQaWNrbGluZ0Vycm9yLCB0KSkpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X0RFQ1JFRih0KTsKKyAgICBQeV9ERUNSRUYodCk7CiAKLQlpZiAoISggVW5waWNrbGluZ0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLlVucGlja2xpbmdFcnJvciIsCi0JCQkJCQkgICAgUGlja2xlRXJyb3IsIE5VTEwpKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghKCBVbnBpY2tsaW5nRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNQaWNrbGUuVW5waWNrbGluZ0Vycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpY2tsZUVycm9yLCBOVUxMKSkpCisgICAgICAgIHJldHVybiAtMTsKIAotICAgICAgICBpZiAoISggQmFkUGlja2xlR2V0ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJjUGlja2xlLkJhZFBpY2tsZUdldCIsCi0JCQkJCQkgVW5waWNrbGluZ0Vycm9yLCBOVUxMKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghKCBCYWRQaWNrbGVHZXQgPSBQeUVycl9OZXdFeGNlcHRpb24oImNQaWNrbGUuQmFkUGlja2xlR2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucGlja2xpbmdFcnJvciwgTlVMTCkpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJQaWNrbGVFcnJvciIsCi0JCQkJIFBpY2tsZUVycm9yKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJQaWNrbGVFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpY2tsZUVycm9yKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIlBpY2tsaW5nRXJyb3IiLAotCQkJCSBQaWNrbGluZ0Vycm9yKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJQaWNrbGluZ0Vycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGlja2xpbmdFcnJvcikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJVbnBpY2tsaW5nRXJyb3IiLAotCQkJCSBVbnBpY2tsaW5nRXJyb3IpIDwgMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIlVucGlja2xpbmdFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucGlja2xpbmdFcnJvcikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJVbnBpY2tsZWFibGVFcnJvciIsCi0JCQkJIFVucGlja2xlYWJsZUVycm9yKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlX2RpY3QsICJVbnBpY2tsZWFibGVFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVucGlja2xlYWJsZUVycm9yKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVfZGljdCwgIkJhZFBpY2tsZUdldCIsCi0JCQkJIEJhZFBpY2tsZUdldCkgPCAwKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZV9kaWN0LCAiQmFkUGlja2xlR2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFkUGlja2xlR2V0KSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5Y1N0cmluZ19JTVBPUlQ7CisgICAgUHljU3RyaW5nX0lNUE9SVDsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCi0jaWZuZGVmIFB5TU9ESU5JVF9GVU5DCS8qIGRlY2xhcmF0aW9ucyBmb3IgRExMIGltcG9ydC9leHBvcnQgKi8KKyNpZm5kZWYgUHlNT0RJTklUX0ZVTkMgIC8qIGRlY2xhcmF0aW9ucyBmb3IgRExMIGltcG9ydC9leHBvcnQgKi8KICNkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAogI2VuZGlmCiBQeU1PRElOSVRfRlVOQwogaW5pdGNQaWNrbGUodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQsICpkaSwgKnYsICprOwotCVB5X3NzaXplX3QgaTsKLQljaGFyICpyZXYgPSAiMS43MSI7CS8qIFhYWCB3aGVuIGRvZXMgdGhpcyBjaGFuZ2U/ICovCi0JUHlPYmplY3QgKmZvcm1hdF92ZXJzaW9uOwotCVB5T2JqZWN0ICpjb21wYXRpYmxlX2Zvcm1hdHM7CisgICAgUHlPYmplY3QgKm0sICpkLCAqZGksICp2LCAqazsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgY2hhciAqcmV2ID0gIjEuNzEiOyAgICAgICAgIC8qIFhYWCB3aGVuIGRvZXMgdGhpcyBjaGFuZ2U/ICovCisgICAgUHlPYmplY3QgKmZvcm1hdF92ZXJzaW9uOworICAgIFB5T2JqZWN0ICpjb21wYXRpYmxlX2Zvcm1hdHM7CiAKLQlQeV9UWVBFKCZQaWNrbGVydHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JUHlfVFlQRSgmVW5waWNrbGVydHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JUHlfVFlQRSgmUGRhdGFUeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeV9UWVBFKCZQaWNrbGVydHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfVFlQRSgmVW5waWNrbGVydHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfVFlQRSgmUGRhdGFUeXBlKSA9ICZQeVR5cGVfVHlwZTsKIAotCS8qIEluaXRpYWxpemUgc29tZSBwaWVjZXMuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgbW9kdWxlIGNyZWF0aW9uLAotCSAqIHNvIHdlJ3JlIGZvcmNlZCB0byB1c2UgYSB0ZW1wb3JhcnkgZGljdGlvbmFyeS4gOigKLQkgKi8KLQlkaSA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIWRpKSByZXR1cm47Ci0JaWYgKGluaXRfc3R1ZmYoZGkpIDwgMCkgcmV0dXJuOworICAgIC8qIEluaXRpYWxpemUgc29tZSBwaWVjZXMuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgbW9kdWxlIGNyZWF0aW9uLAorICAgICAqIHNvIHdlJ3JlIGZvcmNlZCB0byB1c2UgYSB0ZW1wb3JhcnkgZGljdGlvbmFyeS4gOigKKyAgICAgKi8KKyAgICBkaSA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIWRpKSByZXR1cm47CisgICAgaWYgKGluaXRfc3R1ZmYoZGkpIDwgMCkgcmV0dXJuOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJjUGlja2xlIiwgY1BpY2tsZV9tZXRob2RzLAotCQkJICAgY1BpY2tsZV9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKLQkJCSAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoImNQaWNrbGUiLCBjUGlja2xlX21ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNQaWNrbGVfbW9kdWxlX2RvY3VtZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocmV2KTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX192ZXJzaW9uX18iLCB2KTsKLQlQeV9YREVDUkVGKHYpOworICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocmV2KTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX192ZXJzaW9uX18iLCB2KTsKKyAgICBQeV9YREVDUkVGKHYpOwogCi0JLyogQ29weSBkYXRhIGZyb20gZGkuIFdhYWEuICovCi0JZm9yIChpPTA7IFB5RGljdF9OZXh0KGRpLCAmaSwgJmssICZ2KTsgKSB7Ci0JCWlmIChQeU9iamVjdF9TZXRJdGVtKGQsIGssIHYpIDwgMCkgewotCQkJUHlfREVDUkVGKGRpKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlQeV9ERUNSRUYoZGkpOworICAgIC8qIENvcHkgZGF0YSBmcm9tIGRpLiBXYWFhLiAqLworICAgIGZvciAoaT0wOyBQeURpY3RfTmV4dChkaSwgJmksICZrLCAmdik7ICkgeworICAgICAgICBpZiAoUHlPYmplY3RfU2V0SXRlbShkLCBrLCB2KSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkaSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKGRpKTsKIAotCWkgPSBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSElHSEVTVF9QUk9UT0NPTCIsIEhJR0hFU1RfUFJPVE9DT0wpOwotCWlmIChpIDwgMCkKLQkJcmV0dXJuOworICAgIGkgPSBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSElHSEVTVF9QUk9UT0NPTCIsIEhJR0hFU1RfUFJPVE9DT0wpOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogVGhlc2UgYXJlIHB1cmVseSBpbmZvcm1hdGlvbmFsOyBubyBjb2RlIHVzZXMgdGhlbS4gKi8KLQkvKiBGaWxlIGZvcm1hdCB2ZXJzaW9uIHdlIHdyaXRlLiAqLwotCWZvcm1hdF92ZXJzaW9uID0gUHlTdHJpbmdfRnJvbVN0cmluZygiMi4wIik7Ci0JLyogRm9ybWF0IHZlcnNpb25zIHdlIGNhbiByZWFkLiAqLwotCWNvbXBhdGlibGVfZm9ybWF0cyA9IFB5X0J1aWxkVmFsdWUoIltzc3Nzc10iLAotCQkiMS4wIiwJLyogT3JpZ2luYWwgcHJvdG9jb2wgMCAqLwotCQkiMS4xIiwJLyogUHJvdG9jb2wgMCArIElOU1QgKi8KLQkJIjEuMiIsCS8qIE9yaWdpbmFsIHByb3RvY29sIDEgKi8KLQkJIjEuMyIsCS8qIFByb3RvY29sIDEgKyBCSU5GTE9BVCAqLwotCQkiMi4wIik7CS8qIE9yaWdpbmFsIHByb3RvY29sIDIgKi8KLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZm9ybWF0X3ZlcnNpb24iLCBmb3JtYXRfdmVyc2lvbik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNvbXBhdGlibGVfZm9ybWF0cyIsIGNvbXBhdGlibGVfZm9ybWF0cyk7Ci0JUHlfWERFQ1JFRihmb3JtYXRfdmVyc2lvbik7Ci0JUHlfWERFQ1JFRihjb21wYXRpYmxlX2Zvcm1hdHMpOworICAgIC8qIFRoZXNlIGFyZSBwdXJlbHkgaW5mb3JtYXRpb25hbDsgbm8gY29kZSB1c2VzIHRoZW0uICovCisgICAgLyogRmlsZSBmb3JtYXQgdmVyc2lvbiB3ZSB3cml0ZS4gKi8KKyAgICBmb3JtYXRfdmVyc2lvbiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjIuMCIpOworICAgIC8qIEZvcm1hdCB2ZXJzaW9ucyB3ZSBjYW4gcmVhZC4gKi8KKyAgICBjb21wYXRpYmxlX2Zvcm1hdHMgPSBQeV9CdWlsZFZhbHVlKCJbc3Nzc3NdIiwKKyAgICAgICAgIjEuMCIsICAgICAgICAgIC8qIE9yaWdpbmFsIHByb3RvY29sIDAgKi8KKyAgICAgICAgIjEuMSIsICAgICAgICAgIC8qIFByb3RvY29sIDAgKyBJTlNUICovCisgICAgICAgICIxLjIiLCAgICAgICAgICAvKiBPcmlnaW5hbCBwcm90b2NvbCAxICovCisgICAgICAgICIxLjMiLCAgICAgICAgICAvKiBQcm90b2NvbCAxICsgQklORkxPQVQgKi8KKyAgICAgICAgIjIuMCIpOyAgICAgICAgIC8qIE9yaWdpbmFsIHByb3RvY29sIDIgKi8KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZm9ybWF0X3ZlcnNpb24iLCBmb3JtYXRfdmVyc2lvbik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNvbXBhdGlibGVfZm9ybWF0cyIsIGNvbXBhdGlibGVfZm9ybWF0cyk7CisgICAgUHlfWERFQ1JFRihmb3JtYXRfdmVyc2lvbik7CisgICAgUHlfWERFQ1JFRihjb21wYXRpYmxlX2Zvcm1hdHMpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jU3RyaW5nSU8uYyBiL01vZHVsZXMvY1N0cmluZ0lPLmMKaW5kZXggMjM3ZDhjMi4uN2UzMzAzMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jU3RyaW5nSU8uYworKysgYi9Nb2R1bGVzL2NTdHJpbmdJTy5jCkBAIC0zMyw3ICszMyw3IEBACiAiXG4iCiAiY1N0cmluZ0lPLmMsdiAxLjI5IDE5OTkvMDYvMTUgMTQ6MTA6MjcgamltIEV4cFxuIik7CiAKLS8qIERlY2xhcmF0aW9uIGZvciBmaWxlLWxpa2Ugb2JqZWN0cyB0aGF0IG1hbmFnZSBkYXRhIGFzIHN0cmluZ3MgCisvKiBEZWNsYXJhdGlvbiBmb3IgZmlsZS1saWtlIG9iamVjdHMgdGhhdCBtYW5hZ2UgZGF0YSBhcyBzdHJpbmdzCiAKICAgIFRoZSBJT29iamVjdCB0eXBlIHNob3VsZCBiZSB0aG91Z2ggb2YgYXMgYSBjb21tb24gYmFzZSB0eXBlIGZvcgogICAgSW9iamVjdHMsIHdoaWNoIHByb3ZpZGUgaW5wdXQgKHJlYWQtb25seSkgU3RyaW5nSU8gb2JqZWN0cyBhbmQKQEAgLTc3LDM3ICs3NywzNyBAQAogCiBzdGF0aWMgaW50CiBJT19fb3BlbmNoZWNrKElPb2JqZWN0ICpzZWxmKSB7Ci0gICAgICAgIGlmICghc2VsZi0+YnVmKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKCFzZWxmLT5idWYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJT19nZXRfY2xvc2VkKElPb2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeV9GYWxzZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlfRmFsc2U7CiAKLQlpZiAoc2VsZi0+YnVmID09IE5VTEwpCi0JCXJlc3VsdCA9IFB5X1RydWU7Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoc2VsZi0+YnVmID09IE5VTEwpCisgICAgICAgIHJlc3VsdCA9IFB5X1RydWU7CisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGZpbGVfZ2V0c2V0bGlzdFtdID0gewotCXsiY2xvc2VkIiwgKGdldHRlcilJT19nZXRfY2xvc2VkLCBOVUxMLCAiVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjbG9zZWQifSwKLQl7MH0sCisgICAgeyJjbG9zZWQiLCAoZ2V0dGVyKUlPX2dldF9jbG9zZWQsIE5VTEwsICJUcnVlIGlmIHRoZSBmaWxlIGlzIGNsb3NlZCJ9LAorICAgIHswfSwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJT19mbHVzaChJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewogCi0gICAgICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKHNlbGYpKSByZXR1cm4gTlVMTDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKElPX2dldHZhbF9fZG9jX18sCkBAIC0xMTgsMzcgKzExOCwzNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9fY2dldHZhbChQeU9iamVjdCAqc2VsZikgewotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKLSAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCgoSU9vYmplY3QqKXNlbGYpLT5idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElPb2JqZWN0KilzZWxmKS0+cG9zKTsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KElPT09CSkVDVChzZWxmKS0+cG9zID49IDApOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoKElPb2JqZWN0KilzZWxmKS0+YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKElPb2JqZWN0KilzZWxmKS0+cG9zKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIElPX2dldHZhbChJT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgICAgICAgUHlPYmplY3QgKnVzZV9wb3M9UHlfTm9uZTsKLSAgICAgICAgUHlfc3NpemVfdCBzOworICAgIFB5T2JqZWN0ICp1c2VfcG9zPVB5X05vbmU7CisgICAgUHlfc3NpemVfdCBzOwogCi0gICAgICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywiZ2V0dmFsIiwgMCwgMSwmdXNlX3BvcykpIHJldHVybiBOVUxMOworICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCJnZXR2YWwiLCAwLCAxLCZ1c2VfcG9zKSkgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKFB5T2JqZWN0X0lzVHJ1ZSh1c2VfcG9zKSkgewotICAgICAgICAgICAgICAgICAgcz1zZWxmLT5wb3M7Ci0gICAgICAgICAgICAgICAgICBpZiAocyA+IHNlbGYtPnN0cmluZ19zaXplKSBzPXNlbGYtPnN0cmluZ19zaXplOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIHM9c2VsZi0+c3RyaW5nX3NpemU7Ci0gICAgICAgIGFzc2VydChzZWxmLT5wb3MgPj0gMCk7Ci0gICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5idWYsIHMpOworICAgIGlmIChQeU9iamVjdF9Jc1RydWUodXNlX3BvcykpIHsKKyAgICAgICAgICAgICAgcz1zZWxmLT5wb3M7CisgICAgICAgICAgICAgIGlmIChzID4gc2VsZi0+c3RyaW5nX3NpemUpIHM9c2VsZi0+c3RyaW5nX3NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgICAgICAgcz1zZWxmLT5zdHJpbmdfc2l6ZTsKKyAgICBhc3NlcnQoc2VsZi0+cG9zID49IDApOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5idWYsIHMpOwogfQogCiBQeURvY19TVFJWQVIoSU9faXNhdHR5X19kb2NfXywgImlzYXR0eSgpOiBhbHdheXMgcmV0dXJucyAwIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJT19pc2F0dHkoSU9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKLSAgICAgICAgaWYgKCFJT19fb3BlbmNoZWNrKHNlbGYpKSByZXR1cm4gTlVMTDsKLSAgICAgICAgUHlfSU5DUkVGKFB5X0ZhbHNlKTsKLSAgICAgICAgcmV0dXJuIFB5X0ZhbHNlOworICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X0ZhbHNlKTsKKyAgICByZXR1cm4gUHlfRmFsc2U7CiB9CiAKIFB5RG9jX1NUUlZBUihJT19yZWFkX19kb2NfXywKQEAgLTE1NiwxMTQgKzE1NiwxMTQgQEAKIAogc3RhdGljIGludAogSU9fY3JlYWQoUHlPYmplY3QgKnNlbGYsIGNoYXIgKipvdXRwdXQsIFB5X3NzaXplX3QgIG4pIHsKLSAgICAgICAgUHlfc3NpemVfdCBsOworICAgIFB5X3NzaXplX3QgbDsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIC0xOwotICAgICAgICBhc3NlcnQoSU9PT0JKRUNUKHNlbGYpLT5wb3MgPj0gMCk7Ci0gICAgICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnN0cmluZ19zaXplID49IDApOwotICAgICAgICBsID0gKChJT29iamVjdCopc2VsZiktPnN0cmluZ19zaXplIC0gKChJT29iamVjdCopc2VsZiktPnBvczsgIAotICAgICAgICBpZiAobiA8IDAgfHwgbiA+IGwpIHsKLSAgICAgICAgICAgICAgICBuID0gbDsKLSAgICAgICAgICAgICAgICBpZiAobiA8IDApIG49MDsKLSAgICAgICAgfQorICAgIGlmICghSU9fX29wZW5jaGVjayhJT09PQkpFQ1Qoc2VsZikpKSByZXR1cm4gLTE7CisgICAgYXNzZXJ0KElPT09CSkVDVChzZWxmKS0+cG9zID49IDApOworICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnN0cmluZ19zaXplID49IDApOworICAgIGwgPSAoKElPb2JqZWN0KilzZWxmKS0+c3RyaW5nX3NpemUgLSAoKElPb2JqZWN0KilzZWxmKS0+cG9zOworICAgIGlmIChuIDwgMCB8fCBuID4gbCkgeworICAgICAgICBuID0gbDsKKyAgICAgICAgaWYgKG4gPCAwKSBuPTA7CisgICAgfQogCi0gICAgICAgICpvdXRwdXQ9KChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7Ci0gICAgICAgICgoSU9vYmplY3QqKXNlbGYpLT5wb3MgKz0gbjsKLSAgICAgICAgcmV0dXJuIG47CisgICAgKm91dHB1dD0oKElPb2JqZWN0KilzZWxmKS0+YnVmICsgKChJT29iamVjdCopc2VsZiktPnBvczsKKyAgICAoKElPb2JqZWN0KilzZWxmKS0+cG9zICs9IG47CisgICAgcmV0dXJuIG47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBJT19yZWFkKElPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICAgICAgICBQeV9zc2l6ZV90IG4gPSAtMTsKLSAgICAgICAgY2hhciAqb3V0cHV0ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IG4gPSAtMTsKKyAgICBjaGFyICpvdXRwdXQgPSBOVUxMOwogCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cmVhZCIsICZuKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpyZWFkIiwgJm4pKSByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAoIChuPUlPX2NyZWFkKChQeU9iamVjdCopc2VsZiwmb3V0cHV0LG4pKSA8IDApIHJldHVybiBOVUxMOworICAgIGlmICggKG49SU9fY3JlYWQoKFB5T2JqZWN0KilzZWxmLCZvdXRwdXQsbikpIDwgMCkgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG91dHB1dCwgbik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG91dHB1dCwgbik7CiB9CiAKIFB5RG9jX1NUUlZBUihJT19yZWFkbGluZV9fZG9jX18sICJyZWFkbGluZSgpIC0tIFJlYWQgb25lIGxpbmUiKTsKIAogc3RhdGljIGludAogSU9fY3JlYWRsaW5lKFB5T2JqZWN0ICpzZWxmLCBjaGFyICoqb3V0cHV0KSB7Ci0gICAgICAgIGNoYXIgKm4sICpzOwotICAgICAgICBQeV9zc2l6ZV90IGw7CisgICAgY2hhciAqbiwgKnM7CisgICAgUHlfc3NpemVfdCBsOwogCi0gICAgICAgIGlmICghSU9fX29wZW5jaGVjayhJT09PQkpFQ1Qoc2VsZikpKSByZXR1cm4gLTE7CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiAtMTsKIAotICAgICAgICBmb3IgKG4gPSAoKElPb2JqZWN0KilzZWxmKS0+YnVmICsgKChJT29iamVjdCopc2VsZiktPnBvcywKLSAgICAgICAgICAgICAgIHMgPSAoKElPb2JqZWN0KilzZWxmKS0+YnVmICsgKChJT29iamVjdCopc2VsZiktPnN0cmluZ19zaXplOyAKLSAgICAgICAgICAgICBuIDwgcyAmJiAqbiAhPSAnXG4nOyBuKyspOworICAgIGZvciAobiA9ICgoSU9vYmplY3QqKXNlbGYpLT5idWYgKyAoKElPb2JqZWN0KilzZWxmKS0+cG9zLAorICAgICAgICAgICBzID0gKChJT29iamVjdCopc2VsZiktPmJ1ZiArICgoSU9vYmplY3QqKXNlbGYpLT5zdHJpbmdfc2l6ZTsKKyAgICAgICAgIG4gPCBzICYmICpuICE9ICdcbic7IG4rKyk7CiAKLSAgICAgICAgaWYgKG4gPCBzKSBuKys7CisgICAgaWYgKG4gPCBzKSBuKys7CiAKLSAgICAgICAgKm91dHB1dD0oKElPb2JqZWN0KilzZWxmKS0+YnVmICsgKChJT29iamVjdCopc2VsZiktPnBvczsKLSAgICAgICAgbCA9IG4gLSAoKElPb2JqZWN0KilzZWxmKS0+YnVmIC0gKChJT29iamVjdCopc2VsZiktPnBvczsKKyAgICAqb3V0cHV0PSgoSU9vYmplY3QqKXNlbGYpLT5idWYgKyAoKElPb2JqZWN0KilzZWxmKS0+cG9zOworICAgIGwgPSBuIC0gKChJT29iamVjdCopc2VsZiktPmJ1ZiAtICgoSU9vYmplY3QqKXNlbGYpLT5wb3M7CiAKLSAgICAgICAgYXNzZXJ0KElPT09CSkVDVChzZWxmKS0+cG9zIDw9IFBZX1NTSVpFX1RfTUFYIC0gbCk7Ci0gICAgICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKLSAgICAgICAgYXNzZXJ0KElPT09CSkVDVChzZWxmKS0+c3RyaW5nX3NpemUgPj0gMCk7CisgICAgYXNzZXJ0KElPT09CSkVDVChzZWxmKS0+cG9zIDw9IFBZX1NTSVpFX1RfTUFYIC0gbCk7CisgICAgYXNzZXJ0KElPT09CSkVDVChzZWxmKS0+cG9zID49IDApOworICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnN0cmluZ19zaXplID49IDApOwogCi0gICAgICAgICgoSU9vYmplY3QqKXNlbGYpLT5wb3MgKz0gbDsKLSAgICAgICAgcmV0dXJuIChpbnQpbDsKKyAgICAoKElPb2JqZWN0KilzZWxmKS0+cG9zICs9IGw7CisgICAgcmV0dXJuIChpbnQpbDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIElPX3JlYWRsaW5lKElPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICAgICAgICBpbnQgbiwgbT0tMTsKLSAgICAgICAgY2hhciAqb3V0cHV0OworICAgIGludCBuLCBtPS0xOworICAgIGNoYXIgKm91dHB1dDsKIAotICAgICAgICBpZiAoYXJncykKLSAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWRsaW5lIiwgJm0pKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJncykKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpyZWFkbGluZSIsICZtKSkgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYoIChuPUlPX2NyZWFkbGluZSgoUHlPYmplY3QqKXNlbGYsJm91dHB1dCkpIDwgMCkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmIChtID49IDAgJiYgbSA8IG4pIHsKLSAgICAgICAgICAgICAgICBtID0gbiAtIG07Ci0gICAgICAgICAgICAgICAgbiAtPSBtOwotICAgICAgICAgICAgICAgIHNlbGYtPnBvcyAtPSBtOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKLSAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG91dHB1dCwgbik7CisgICAgaWYoIChuPUlPX2NyZWFkbGluZSgoUHlPYmplY3QqKXNlbGYsJm91dHB1dCkpIDwgMCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKG0gPj0gMCAmJiBtIDwgbikgeworICAgICAgICBtID0gbiAtIG07CisgICAgICAgIG4gLT0gbTsKKyAgICAgICAgc2VsZi0+cG9zIC09IG07CisgICAgfQorICAgIGFzc2VydChJT09PQkpFQ1Qoc2VsZiktPnBvcyA+PSAwKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUob3V0cHV0LCBuKTsKIH0KIAogUHlEb2NfU1RSVkFSKElPX3JlYWRsaW5lc19fZG9jX18sICJyZWFkbGluZXMoKSAtLSBSZWFkIGFsbCBsaW5lcyIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9fcmVhZGxpbmVzKElPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotCWludCBuOwotCWNoYXIgKm91dHB1dDsKLQlQeU9iamVjdCAqcmVzdWx0LCAqbGluZTsKLSAgICAgICAgaW50IGhpbnQgPSAwLCBsZW5ndGggPSAwOwotCQotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWRsaW5lcyIsICZoaW50KSkgcmV0dXJuIE5VTEw7CisgICAgaW50IG47CisgICAgY2hhciAqb3V0cHV0OworICAgIFB5T2JqZWN0ICpyZXN1bHQsICpsaW5lOworICAgIGludCBoaW50ID0gMCwgbGVuZ3RoID0gMDsKIAotCXJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKCFyZXN1bHQpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6cmVhZGxpbmVzIiwgJmhpbnQpKSByZXR1cm4gTlVMTDsKIAotCXdoaWxlICgxKXsKLQkJaWYgKCAobiA9IElPX2NyZWFkbGluZSgoUHlPYmplY3QqKXNlbGYsJm91dHB1dCkpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOwotCQlpZiAobiA9PSAwKQotCQkJYnJlYWs7Ci0JCWxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSAob3V0cHV0LCBuKTsKLQkJaWYgKCFsaW5lKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOwotCQlpZiAoUHlMaXN0X0FwcGVuZCAocmVzdWx0LCBsaW5lKSA9PSAtMSkgewotCQkJUHlfREVDUkVGIChsaW5lKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JCVB5X0RFQ1JFRiAobGluZSk7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IG47Ci0gICAgICAgICAgICAgICAgaWYgKGhpbnQgPiAwICYmIGxlbmd0aCA+PSBoaW50KQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci0gZXJyOgotICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXN1bHQgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICghcmVzdWx0KQogICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHdoaWxlICgxKXsKKyAgICAgICAgaWYgKCAobiA9IElPX2NyZWFkbGluZSgoUHlPYmplY3QqKXNlbGYsJm91dHB1dCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSAob3V0cHV0LCBuKTsKKyAgICAgICAgaWYgKCFsaW5lKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kIChyZXN1bHQsIGxpbmUpID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYgKGxpbmUpOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGIChsaW5lKTsKKyAgICAgICAgbGVuZ3RoICs9IG47CisgICAgICAgIGlmIChoaW50ID4gMCAmJiBsZW5ndGggPj0gaGludCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworIGVycjoKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKElPX3Jlc2V0X19kb2NfXywKQEAgLTI3MiwxMiArMjcyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogSU9fcmVzZXQoSU9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgc2VsZi0+cG9zID0gMDsKKyAgICBzZWxmLT5wb3MgPSAwOwogCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoSU9fdGVsbF9fZG9jX18sICJ0ZWxsKCkgLS0gZ2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uLiIpOwpAQCAtMjg1LDEwICsyODUsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBJT190ZWxsKElPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7CiAKLSAgICAgICAgaWYgKCFJT19fb3BlbmNoZWNrKHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOwogCi0gICAgICAgIGFzc2VydChzZWxmLT5wb3MgPj0gMCk7Ci0gICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChzZWxmLT5wb3MpOworICAgIGFzc2VydChzZWxmLT5wb3MgPj0gMCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHNlbGYtPnBvcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihJT190cnVuY2F0ZV9fZG9jX18sCkBAIC0yOTYsNDIgKzI5Niw0MiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9fdHJ1bmNhdGUoSU9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gICAgICAgIFB5X3NzaXplX3QgcG9zID0gLTE7Ci0JCi0gICAgICAgIGlmICghSU9fX29wZW5jaGVjayhzZWxmKSkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46dHJ1bmNhdGUiLCAmcG9zKSkgcmV0dXJuIE5VTEw7CisgICAgUHlfc3NpemVfdCBwb3MgPSAtMTsKIAotCWlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMCkgewotCQkvKiBObyBhcmd1bWVudCBwYXNzZWQsIHRydW5jYXRlIHRvIGN1cnJlbnQgcG9zaXRpb24gKi8KLQkJcG9zID0gc2VsZi0+cG9zOwotCX0KKyAgICBpZiAoIUlPX19vcGVuY2hlY2soc2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46dHJ1bmNhdGUiLCAmcG9zKSkgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKHBvcyA8IDApIHsKLQkJZXJybm8gPSBFSU5WQUw7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMCkgeworICAgICAgICAvKiBObyBhcmd1bWVudCBwYXNzZWQsIHRydW5jYXRlIHRvIGN1cnJlbnQgcG9zaXRpb24gKi8KKyAgICAgICAgcG9zID0gc2VsZi0+cG9zOworICAgIH0KIAotICAgICAgICBpZiAoc2VsZi0+c3RyaW5nX3NpemUgPiBwb3MpIHNlbGYtPnN0cmluZ19zaXplID0gcG9zOwotICAgICAgICBzZWxmLT5wb3MgPSBzZWxmLT5zdHJpbmdfc2l6ZTsKKyAgICBpZiAocG9zIDwgMCkgeworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoc2VsZi0+c3RyaW5nX3NpemUgPiBwb3MpIHNlbGYtPnN0cmluZ19zaXplID0gcG9zOworICAgIHNlbGYtPnBvcyA9IHNlbGYtPnN0cmluZ19zaXplOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogSU9faXRlcm5leHQoSW9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqbmV4dDsKLQluZXh0ID0gSU9fcmVhZGxpbmUoKElPb2JqZWN0ICopc2VsZiwgTlVMTCk7Ci0JaWYgKCFuZXh0KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5U3RyaW5nX0dFVF9TSVpFKG5leHQpKSB7Ci0JCVB5X0RFQ1JFRihuZXh0KTsKLQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBuZXh0OworICAgIFB5T2JqZWN0ICpuZXh0OworICAgIG5leHQgPSBJT19yZWFkbGluZSgoSU9vYmplY3QgKilzZWxmLCBOVUxMKTsKKyAgICBpZiAoIW5leHQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlTdHJpbmdfR0VUX1NJWkUobmV4dCkpIHsKKyAgICAgICAgUHlfREVDUkVGKG5leHQpOworICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5leHQ7CiB9CiAKIApAQCAtMzQ1LDQxICszNDUsNDEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIE9fc2VlayhPb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotCVB5X3NzaXplX3QgcG9zaXRpb247Ci0JaW50IG1vZGUgPSAwOworICAgIFB5X3NzaXplX3QgcG9zaXRpb247CisgICAgaW50IG1vZGUgPSAwOwogCi0gICAgICAgIGlmICghSU9fX29wZW5jaGVjayhJT09PQkpFQ1Qoc2VsZikpKSByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGk6c2VlayIsICZwb3NpdGlvbiwgJm1vZGUpKSAKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGk6c2VlayIsICZwb3NpdGlvbiwgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAobW9kZSA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gKz0gc2VsZi0+c3RyaW5nX3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobW9kZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgcG9zaXRpb24gKz0gc2VsZi0+cG9zOwotICAgICAgICB9CisgICAgaWYgKG1vZGUgPT0gMikgeworICAgICAgICBwb3NpdGlvbiArPSBzZWxmLT5zdHJpbmdfc2l6ZTsKKyAgICB9CisgICAgZWxzZSBpZiAobW9kZSA9PSAxKSB7CisgICAgICAgIHBvc2l0aW9uICs9IHNlbGYtPnBvczsKKyAgICB9CiAKLSAgICAgICAgaWYgKHBvc2l0aW9uID4gc2VsZi0+YnVmX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgIGNoYXIgKm5ld2J1ZjsKLSAgICAgICAgICAgICAgICAgIHNlbGYtPmJ1Zl9zaXplKj0yOwotICAgICAgICAgICAgICAgICAgaWYgKHNlbGYtPmJ1Zl9zaXplIDw9IHBvc2l0aW9uKSBzZWxmLT5idWZfc2l6ZT1wb3NpdGlvbisxOwotCQkgIG5ld2J1ZiA9IChjaGFyKikgcmVhbGxvYyhzZWxmLT5idWYsc2VsZi0+YnVmX3NpemUpOwotICAgICAgICAgICAgICAgICAgaWYgKCFuZXdidWYpIHsKLSAgICAgICAgICAgICAgICAgICAgICBmcmVlKHNlbGYtPmJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgc2VsZi0+YnVmID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5idWZfc2l6ZT1zZWxmLT5wb3M9MDsKLSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgc2VsZi0+YnVmID0gbmV3YnVmOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocG9zaXRpb24gPCAwKSBwb3NpdGlvbj0wOworICAgIGlmIChwb3NpdGlvbiA+IHNlbGYtPmJ1Zl9zaXplKSB7CisgICAgICAgICAgICAgIGNoYXIgKm5ld2J1ZjsKKyAgICAgICAgICAgICAgc2VsZi0+YnVmX3NpemUqPTI7CisgICAgICAgICAgICAgIGlmIChzZWxmLT5idWZfc2l6ZSA8PSBwb3NpdGlvbikgc2VsZi0+YnVmX3NpemU9cG9zaXRpb24rMTsKKyAgICAgICAgICAgICAgbmV3YnVmID0gKGNoYXIqKSByZWFsbG9jKHNlbGYtPmJ1ZixzZWxmLT5idWZfc2l6ZSk7CisgICAgICAgICAgICAgIGlmICghbmV3YnVmKSB7CisgICAgICAgICAgICAgICAgICBmcmVlKHNlbGYtPmJ1Zik7CisgICAgICAgICAgICAgICAgICBzZWxmLT5idWYgPSAwOworICAgICAgICAgICAgICAgICAgc2VsZi0+YnVmX3NpemU9c2VsZi0+cG9zPTA7CisgICAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHNlbGYtPmJ1ZiA9IG5ld2J1ZjsKKyAgICAgIH0KKyAgICBlbHNlIGlmIChwb3NpdGlvbiA8IDApIHBvc2l0aW9uPTA7CiAKLSAgICAgICAgc2VsZi0+cG9zPXBvc2l0aW9uOworICAgIHNlbGYtPnBvcz1wb3NpdGlvbjsKIAotICAgICAgICB3aGlsZSAoLS1wb3NpdGlvbiA+PSBzZWxmLT5zdHJpbmdfc2l6ZSkgc2VsZi0+YnVmW3Bvc2l0aW9uXT0wOworICAgIHdoaWxlICgtLXBvc2l0aW9uID49IHNlbGYtPnN0cmluZ19zaXplKSBzZWxmLT5idWZbcG9zaXRpb25dPTA7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihPX3dyaXRlX19kb2NfXywKQEAgLTM4OSw2NyArMzg5LDY3IEBACiAKIHN0YXRpYyBpbnQKIE9fY3dyaXRlKFB5T2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpjLCBQeV9zc2l6ZV90ICBsKSB7Ci0gICAgICAgIFB5X3NzaXplX3QgbmV3bDsKLSAgICAgICAgT29iamVjdCAqb3NlbGY7Ci0gICAgICAgIGNoYXIgKm5ld2J1ZjsKKyAgICBQeV9zc2l6ZV90IG5ld2w7CisgICAgT29iamVjdCAqb3NlbGY7CisgICAgY2hhciAqbmV3YnVmOwogCi0gICAgICAgIGlmICghSU9fX29wZW5jaGVjayhJT09PQkpFQ1Qoc2VsZikpKSByZXR1cm4gLTE7Ci0gICAgICAgIG9zZWxmID0gKE9vYmplY3QgKilzZWxmOworICAgIGlmICghSU9fX29wZW5jaGVjayhJT09PQkpFQ1Qoc2VsZikpKSByZXR1cm4gLTE7CisgICAgb3NlbGYgPSAoT29iamVjdCAqKXNlbGY7CiAKLSAgICAgICAgbmV3bCA9IG9zZWxmLT5wb3MrbDsKLSAgICAgICAgaWYgKG5ld2wgPj0gb3NlbGYtPmJ1Zl9zaXplKSB7Ci0gICAgICAgICAgICBvc2VsZi0+YnVmX3NpemUgKj0gMjsKLSAgICAgICAgICAgIGlmIChvc2VsZi0+YnVmX3NpemUgPD0gbmV3bCkgewotCQkgICAgYXNzZXJ0KG5ld2wgKyAxIDwgSU5UX01BWCk7Ci0gICAgICAgICAgICAgICAgICAgIG9zZWxmLT5idWZfc2l6ZSA9IChpbnQpKG5ld2wrMSk7Ci0JICAgIH0KLSAgICAgICAgICAgIG5ld2J1ZiA9IChjaGFyKilyZWFsbG9jKG9zZWxmLT5idWYsIG9zZWxmLT5idWZfc2l6ZSk7Ci0JICAgIGlmICghbmV3YnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwib3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgICAgICAgICBmcmVlKG9zZWxmLT5idWYpOwotICAgICAgICAgICAgICAgICAgICBvc2VsZi0+YnVmID0gMDsKLSAgICAgICAgICAgICAgICAgICAgb3NlbGYtPmJ1Zl9zaXplID0gb3NlbGYtPnBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgb3NlbGYtPmJ1ZiA9IG5ld2J1ZjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KG9zZWxmLT5idWYrb3NlbGYtPnBvcyxjLGwpOwotCi0JYXNzZXJ0KG9zZWxmLT5wb3MgKyBsIDwgSU5UX01BWCk7Ci0gICAgICAgIG9zZWxmLT5wb3MgKz0gKGludClsOwotCi0gICAgICAgIGlmIChvc2VsZi0+c3RyaW5nX3NpemUgPCBvc2VsZi0+cG9zKSB7Ci0gICAgICAgICAgICBvc2VsZi0+c3RyaW5nX3NpemUgPSBvc2VsZi0+cG9zOworICAgIG5ld2wgPSBvc2VsZi0+cG9zK2w7CisgICAgaWYgKG5ld2wgPj0gb3NlbGYtPmJ1Zl9zaXplKSB7CisgICAgICAgIG9zZWxmLT5idWZfc2l6ZSAqPSAyOworICAgICAgICBpZiAob3NlbGYtPmJ1Zl9zaXplIDw9IG5ld2wpIHsKKyAgICAgICAgICAgIGFzc2VydChuZXdsICsgMSA8IElOVF9NQVgpOworICAgICAgICAgICAgb3NlbGYtPmJ1Zl9zaXplID0gKGludCkobmV3bCsxKTsKICAgICAgICAgfQorICAgICAgICBuZXdidWYgPSAoY2hhciopcmVhbGxvYyhvc2VsZi0+YnVmLCBvc2VsZi0+YnVmX3NpemUpOworICAgICAgICBpZiAoIW5ld2J1ZikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCJvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgICAgICBmcmVlKG9zZWxmLT5idWYpOworICAgICAgICAgICAgb3NlbGYtPmJ1ZiA9IDA7CisgICAgICAgICAgICBvc2VsZi0+YnVmX3NpemUgPSBvc2VsZi0+cG9zID0gMDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgIG9zZWxmLT5idWYgPSBuZXdidWY7CisgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIChpbnQpbDsKKyAgICBtZW1jcHkob3NlbGYtPmJ1Zitvc2VsZi0+cG9zLGMsbCk7CisKKyAgICBhc3NlcnQob3NlbGYtPnBvcyArIGwgPCBJTlRfTUFYKTsKKyAgICBvc2VsZi0+cG9zICs9IChpbnQpbDsKKworICAgIGlmIChvc2VsZi0+c3RyaW5nX3NpemUgPCBvc2VsZi0+cG9zKSB7CisgICAgICAgIG9zZWxmLT5zdHJpbmdfc2l6ZSA9IG9zZWxmLT5wb3M7CisgICAgfQorCisgICAgcmV0dXJuIChpbnQpbDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIE9fd3JpdGUoT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgICAgICAgY2hhciAqYzsKLSAgICAgICAgaW50IGw7CisgICAgY2hhciAqYzsKKyAgICBpbnQgbDsKIAotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjOndyaXRlIiwgJmMsICZsKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0Izp3cml0ZSIsICZjLCAmbCkpIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmIChPX2N3cml0ZSgoUHlPYmplY3QqKXNlbGYsYyxsKSA8IDApIHJldHVybiBOVUxMOworICAgIGlmIChPX2N3cml0ZSgoUHlPYmplY3QqKXNlbGYsYyxsKSA8IDApIHJldHVybiBOVUxMOwogCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoT19jbG9zZV9fZG9jX18sICJjbG9zZSgpOiBleHBsaWNpdGx5IHJlbGVhc2UgcmVzb3VyY2VzIGhlbGQuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBPX2Nsb3NlKE9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKLSAgICAgICAgaWYgKHNlbGYtPmJ1ZiAhPSBOVUxMKSBmcmVlKHNlbGYtPmJ1Zik7Ci0gICAgICAgIHNlbGYtPmJ1ZiA9IE5VTEw7CisgICAgaWYgKHNlbGYtPmJ1ZiAhPSBOVUxMKSBmcmVlKHNlbGYtPmJ1Zik7CisgICAgc2VsZi0+YnVmID0gTlVMTDsKIAotICAgICAgICBzZWxmLT5wb3MgPSBzZWxmLT5zdHJpbmdfc2l6ZSA9IHNlbGYtPmJ1Zl9zaXplID0gMDsKKyAgICBzZWxmLT5wb3MgPSBzZWxmLT5zdHJpbmdfc2l6ZSA9IHNlbGYtPmJ1Zl9zaXplID0gMDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKE9fd3JpdGVsaW5lc19fZG9jX18sCkBAIC00NTksMzIgKzQ1OSwzMiBAQAogInByb2R1Y2luZyBzdHJpbmdzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB3cml0ZSgpIGZvciBlYWNoIHN0cmluZy4iKTsKIHN0YXRpYyBQeU9iamVjdCAqCiBPX3dyaXRlbGluZXMoT29iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLQlQeU9iamVjdCAqaXQsICpzOwotCQotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihhcmdzKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUgKChzID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCVB5X3NzaXplX3QgbjsKLQkJY2hhciAqYzsKLQkJaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShzLCAmYywgJm4pID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJUHlfREVDUkVGKHMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKE9fY3dyaXRlKChQeU9iamVjdCAqKXNlbGYsIGMsIG4pID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJUHlfREVDUkVGKHMpOwotCQkJcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgUHlPYmplY3QgKml0LCAqczsKKworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihhcmdzKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2hpbGUgKChzID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgIFB5X3NzaXplX3QgbjsKKyAgICAgICAgY2hhciAqYzsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShzLCAmYywgJm4pID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE9fY3dyaXRlKChQeU9iamVjdCAqKXNlbGYsIGMsIG4pID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgUHlfREVDUkVGKHMpOwogICAgICAgIH0KIAogICAgICAgIFB5X0RFQ1JFRihpdCk7CiAKICAgICAgICAvKiBTZWUgaWYgUHlJdGVyX05leHQgZmFpbGVkICovCiAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KQEAgLTQ5Myw5MiArNDkzLDkyIEBACiAgIHsiZmx1c2giLCAgICAgKFB5Q0Z1bmN0aW9uKUlPX2ZsdXNoLCAgICBNRVRIX05PQVJHUywgIElPX2ZsdXNoX19kb2NfX30sCiAgIHsiZ2V0dmFsdWUiLCAgKFB5Q0Z1bmN0aW9uKUlPX2dldHZhbCwgICBNRVRIX1ZBUkFSR1MsIElPX2dldHZhbF9fZG9jX199LAogICB7ImlzYXR0eSIsICAgIChQeUNGdW5jdGlvbilJT19pc2F0dHksICAgTUVUSF9OT0FSR1MsICBJT19pc2F0dHlfX2RvY19ffSwKLSAgeyJyZWFkIiwJKFB5Q0Z1bmN0aW9uKUlPX3JlYWQsICAgICBNRVRIX1ZBUkFSR1MsIElPX3JlYWRfX2RvY19ffSwKLSAgeyJyZWFkbGluZSIsCShQeUNGdW5jdGlvbilJT19yZWFkbGluZSwgTUVUSF9WQVJBUkdTLCBJT19yZWFkbGluZV9fZG9jX199LAotICB7InJlYWRsaW5lcyIsCShQeUNGdW5jdGlvbilJT19yZWFkbGluZXMsTUVUSF9WQVJBUkdTLCBJT19yZWFkbGluZXNfX2RvY19ffSwKLSAgeyJyZXNldCIsCShQeUNGdW5jdGlvbilJT19yZXNldCwJICBNRVRIX05PQVJHUywgIElPX3Jlc2V0X19kb2NfX30sCisgIHsicmVhZCIsICAgICAgKFB5Q0Z1bmN0aW9uKUlPX3JlYWQsICAgICBNRVRIX1ZBUkFSR1MsIElPX3JlYWRfX2RvY19ffSwKKyAgeyJyZWFkbGluZSIsICAoUHlDRnVuY3Rpb24pSU9fcmVhZGxpbmUsIE1FVEhfVkFSQVJHUywgSU9fcmVhZGxpbmVfX2RvY19ffSwKKyAgeyJyZWFkbGluZXMiLCAoUHlDRnVuY3Rpb24pSU9fcmVhZGxpbmVzLE1FVEhfVkFSQVJHUywgSU9fcmVhZGxpbmVzX19kb2NfX30sCisgIHsicmVzZXQiLCAgICAgKFB5Q0Z1bmN0aW9uKUlPX3Jlc2V0LCAgICBNRVRIX05PQVJHUywgIElPX3Jlc2V0X19kb2NfX30sCiAgIHsidGVsbCIsICAgICAgKFB5Q0Z1bmN0aW9uKUlPX3RlbGwsICAgICBNRVRIX05PQVJHUywgIElPX3RlbGxfX2RvY19ffSwKICAgeyJ0cnVuY2F0ZSIsICAoUHlDRnVuY3Rpb24pSU9fdHJ1bmNhdGUsIE1FVEhfVkFSQVJHUywgSU9fdHJ1bmNhdGVfX2RvY19ffSwKIAogICAvKiBSZWFkLXdyaXRlIFN0cmluZ0lPIHNwZWNpZmljICBtZXRob2RzOiAqLwogICB7ImNsb3NlIiwgICAgICAoUHlDRnVuY3Rpb24pT19jbG9zZSwgICAgICBNRVRIX05PQVJHUywgIE9fY2xvc2VfX2RvY19ffSwKICAgeyJzZWVrIiwgICAgICAgKFB5Q0Z1bmN0aW9uKU9fc2VlaywgICAgICAgTUVUSF9WQVJBUkdTLCBPX3NlZWtfX2RvY19ffSwKLSAgeyJ3cml0ZSIsCSAoUHlDRnVuY3Rpb24pT193cml0ZSwgICAgICBNRVRIX1ZBUkFSR1MsIE9fd3JpdGVfX2RvY19ffSwKLSAgeyJ3cml0ZWxpbmVzIiwgKFB5Q0Z1bmN0aW9uKU9fd3JpdGVsaW5lcywgTUVUSF9PLAkgIE9fd3JpdGVsaW5lc19fZG9jX199LAotICB7TlVMTCwJIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICB7IndyaXRlIiwgICAgICAoUHlDRnVuY3Rpb24pT193cml0ZSwgICAgICBNRVRIX1ZBUkFSR1MsIE9fd3JpdGVfX2RvY19ffSwKKyAgeyJ3cml0ZWxpbmVzIiwgKFB5Q0Z1bmN0aW9uKU9fd3JpdGVsaW5lcywgTUVUSF9PLCAgICAgICBPX3dyaXRlbGluZXNfX2RvY19ffSwKKyAge05VTEwsICAgICAgICAgTlVMTH0gICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBPX21lbWJlcmxpc3RbXSA9IHsKLQl7InNvZnRzcGFjZSIsCVRfSU5ULAlvZmZzZXRvZihPb2JqZWN0LCBzb2Z0c3BhY2UpLAkwLAotCSAiZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBzcGFjZSBuZWVkcyB0byBiZSBwcmludGVkOyB1c2VkIGJ5IHByaW50In0sCi0JIC8qIGdldGF0dHIoZiwgImNsb3NlZCIpIGlzIGltcGxlbWVudGVkIHdpdGhvdXQgdGhpcyB0YWJsZSAqLwotCXtOVUxMfSAvKiBTZW50aW5lbCAqLworICAgIHsic29mdHNwYWNlIiwgICAgICAgVF9JTlQsICBvZmZzZXRvZihPb2JqZWN0LCBzb2Z0c3BhY2UpLCAgIDAsCisgICAgICJmbGFnIGluZGljYXRpbmcgdGhhdCBhIHNwYWNlIG5lZWRzIHRvIGJlIHByaW50ZWQ7IHVzZWQgYnkgcHJpbnQifSwKKyAgICAgLyogZ2V0YXR0cihmLCAiY2xvc2VkIikgaXMgaW1wbGVtZW50ZWQgd2l0aG91dCB0aGlzIHRhYmxlICovCisgICAge05VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgdm9pZAogT19kZWFsbG9jKE9vYmplY3QgKnNlbGYpIHsKLSAgICAgICAgaWYgKHNlbGYtPmJ1ZiAhPSBOVUxMKQotICAgICAgICAgICAgICAgIGZyZWUoc2VsZi0+YnVmKTsKLSAgICAgICAgUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGlmIChzZWxmLT5idWYgIT0gTlVMTCkKKyAgICAgICAgZnJlZShzZWxmLT5idWYpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogUHlEb2NfU1RSVkFSKE90eXBlX19kb2NfXywgIlNpbXBsZSB0eXBlIGZvciBvdXRwdXQgdG8gc3RyaW5ncy4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBPdHlwZSA9IHsKICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICJjU3RyaW5nSU8uU3RyaW5nTyIsICAgCS8qdHBfbmFtZSovCi0gIHNpemVvZihPb2JqZWN0KSwgICAgICAgCS8qdHBfYmFzaWNzaXplKi8KLSAgMCwJICAgICAgIAkJCS8qdHBfaXRlbXNpemUqLworICAiY1N0cmluZ0lPLlN0cmluZ08iLCAgICAgICAgICAvKnRwX25hbWUqLworICBzaXplb2YoT29iamVjdCksICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwogICAvKiBtZXRob2RzICovCi0gIChkZXN0cnVjdG9yKU9fZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLSAgMCwJCQkJLyp0cF9wcmludCovCi0gIDAsCQkgCQkvKnRwX2dldGF0dHIgKi8KLSAgMCwJCSAJCS8qdHBfc2V0YXR0ciAqLwotICAwLAkJCQkvKnRwX2NvbXBhcmUqLwotICAwLAkJCQkvKnRwX3JlcHIqLwotICAwLAkJCQkvKnRwX2FzX251bWJlciovCi0gIDAsCQkJCS8qdHBfYXNfc2VxdWVuY2UqLwotICAwLAkJCQkvKnRwX2FzX21hcHBpbmcqLwotICAwLAkJCQkvKnRwX2hhc2gqLwotICAwCSwJCQkvKnRwX2NhbGwqLwotICAwLAkJCQkvKnRwX3N0ciovCi0gIDAsCQkJCS8qdHBfZ2V0YXR0cm8gKi8KLSAgMCwJCQkJLyp0cF9zZXRhdHRybyAqLwotICAwLAkJCQkvKnRwX2FzX2J1ZmZlciAqLwotICBQeV9UUEZMQUdTX0RFRkFVTFQsCQkvKnRwX2ZsYWdzKi8KLSAgT3R5cGVfX2RvY19fLCAJCS8qdHBfZG9jICovCi0gIDAsCQkJCS8qdHBfdHJhdmVyc2UgKi8KLSAgMCwJCQkJLyp0cF9jbGVhciAqLwotICAwLAkJCQkvKnRwX3JpY2hjb21wYXJlICovCi0gIDAsCQkJCS8qdHBfd2Vha2xpc3RvZmZzZXQgKi8KLSAgUHlPYmplY3RfU2VsZkl0ZXIsCQkvKnRwX2l0ZXIgKi8KLSAgKGl0ZXJuZXh0ZnVuYylJT19pdGVybmV4dCwJLyp0cF9pdGVybmV4dCAqLwotICBPX21ldGhvZHMsCQkJLyp0cF9tZXRob2RzICovCi0gIE9fbWVtYmVybGlzdCwJCQkvKnRwX21lbWJlcnMgKi8KLSAgZmlsZV9nZXRzZXRsaXN0LAkJLyp0cF9nZXRzZXQgKi8KKyAgKGRlc3RydWN0b3IpT19kZWFsbG9jLCAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgMCAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8gKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIgKi8KKyAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgLyp0cF9mbGFncyovCisgIE90eXBlX19kb2NfXywgICAgICAgICAgICAgICAgIC8qdHBfZG9jICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgLyp0cF9pdGVyICovCisgIChpdGVybmV4dGZ1bmMpSU9faXRlcm5leHQsICAgIC8qdHBfaXRlcm5leHQgKi8KKyAgT19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgLyp0cF9tZXRob2RzICovCisgIE9fbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyAqLworICBmaWxlX2dldHNldGxpc3QsICAgICAgICAgICAgICAvKnRwX2dldHNldCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld09vYmplY3QoaW50ICBzaXplKSB7Ci0gICAgICAgIE9vYmplY3QgKnNlbGY7CisgICAgT29iamVjdCAqc2VsZjsKIAotICAgICAgICBzZWxmID0gUHlPYmplY3RfTmV3KE9vYmplY3QsICZPdHlwZSk7Ci0gICAgICAgIGlmIChzZWxmID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHNlbGYtPnBvcz0wOwotICAgICAgICBzZWxmLT5zdHJpbmdfc2l6ZSA9IDA7Ci0gICAgICAgIHNlbGYtPnNvZnRzcGFjZSA9IDA7CisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhPb2JqZWN0LCAmT3R5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnBvcz0wOworICAgIHNlbGYtPnN0cmluZ19zaXplID0gMDsKKyAgICBzZWxmLT5zb2Z0c3BhY2UgPSAwOwogCi0gICAgICAgIHNlbGYtPmJ1ZiA9IChjaGFyICopbWFsbG9jKHNpemUpOwotCWlmICghc2VsZi0+YnVmKSB7Ci0gICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsIm91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgICAgICAgICAgIHNlbGYtPmJ1Zl9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgIH0KKyAgICBzZWxmLT5idWYgPSAoY2hhciAqKW1hbGxvYyhzaXplKTsKKyAgICBpZiAoIXNlbGYtPmJ1ZikgeworICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgICAgICAgc2VsZi0+YnVmX3NpemUgPSAwOworICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQogCi0gICAgICAgIHNlbGYtPmJ1Zl9zaXplPXNpemU7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgc2VsZi0+YnVmX3NpemU9c2l6ZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOwogfQogCiAvKiBFbmQgb2YgY29kZSBmb3IgU3RyaW5nTyBvYmplY3RzICovCkBAIC01ODYsMzMgKzU4NiwzMyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogSV9jbG9zZShJb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0gICAgICAgIFB5X0NMRUFSKHNlbGYtPnBidWYpOwotICAgICAgICBzZWxmLT5idWYgPSBOVUxMOworICAgIFB5X0NMRUFSKHNlbGYtPnBidWYpOworICAgIHNlbGYtPmJ1ZiA9IE5VTEw7CiAKLSAgICAgICAgc2VsZi0+cG9zID0gc2VsZi0+c3RyaW5nX3NpemUgPSAwOworICAgIHNlbGYtPnBvcyA9IHNlbGYtPnN0cmluZ19zaXplID0gMDsKIAotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIElfc2VlayhJb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgewotICAgICAgICBQeV9zc2l6ZV90IHBvc2l0aW9uOwotCWludCBtb2RlID0gMDsKKyAgICBQeV9zc2l6ZV90IHBvc2l0aW9uOworICAgIGludCBtb2RlID0gMDsKIAotICAgICAgICBpZiAoIUlPX19vcGVuY2hlY2soSU9PT0JKRUNUKHNlbGYpKSkgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxpOnNlZWsiLCAmcG9zaXRpb24sICZtb2RlKSkgCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFJT19fb3BlbmNoZWNrKElPT09CSkVDVChzZWxmKSkpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxpOnNlZWsiLCAmcG9zaXRpb24sICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKG1vZGUgPT0gMikgcG9zaXRpb24gKz0gc2VsZi0+c3RyaW5nX3NpemU7Ci0gICAgICAgIGVsc2UgaWYgKG1vZGUgPT0gMSkgcG9zaXRpb24gKz0gc2VsZi0+cG9zOworICAgIGlmIChtb2RlID09IDIpIHBvc2l0aW9uICs9IHNlbGYtPnN0cmluZ19zaXplOworICAgIGVsc2UgaWYgKG1vZGUgPT0gMSkgcG9zaXRpb24gKz0gc2VsZi0+cG9zOwogCi0gICAgICAgIGlmIChwb3NpdGlvbiA8IDApIHBvc2l0aW9uPTA7CisgICAgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb249MDsKIAotICAgICAgICBzZWxmLT5wb3M9cG9zaXRpb247CisgICAgc2VsZi0+cG9zPXBvc2l0aW9uOwogCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIElfbWV0aG9kc1tdID0gewpAQCAtNjIwLDE3ICs2MjAsMTcgQEAKICAgeyJmbHVzaCIsICAgICAoUHlDRnVuY3Rpb24pSU9fZmx1c2gsICAgIE1FVEhfTk9BUkdTLCAgSU9fZmx1c2hfX2RvY19ffSwKICAgeyJnZXR2YWx1ZSIsICAoUHlDRnVuY3Rpb24pSU9fZ2V0dmFsLCAgIE1FVEhfVkFSQVJHUywgSU9fZ2V0dmFsX19kb2NfX30sCiAgIHsiaXNhdHR5IiwgICAgKFB5Q0Z1bmN0aW9uKUlPX2lzYXR0eSwgICBNRVRIX05PQVJHUywgIElPX2lzYXR0eV9fZG9jX199LAotICB7InJlYWQiLAkoUHlDRnVuY3Rpb24pSU9fcmVhZCwgICAgIE1FVEhfVkFSQVJHUywgSU9fcmVhZF9fZG9jX199LAotICB7InJlYWRsaW5lIiwJKFB5Q0Z1bmN0aW9uKUlPX3JlYWRsaW5lLCBNRVRIX1ZBUkFSR1MsIElPX3JlYWRsaW5lX19kb2NfX30sCi0gIHsicmVhZGxpbmVzIiwJKFB5Q0Z1bmN0aW9uKUlPX3JlYWRsaW5lcyxNRVRIX1ZBUkFSR1MsIElPX3JlYWRsaW5lc19fZG9jX199LAotICB7InJlc2V0IiwJKFB5Q0Z1bmN0aW9uKUlPX3Jlc2V0LAkgIE1FVEhfTk9BUkdTLCAgSU9fcmVzZXRfX2RvY19ffSwKKyAgeyJyZWFkIiwgICAgICAoUHlDRnVuY3Rpb24pSU9fcmVhZCwgICAgIE1FVEhfVkFSQVJHUywgSU9fcmVhZF9fZG9jX199LAorICB7InJlYWRsaW5lIiwgIChQeUNGdW5jdGlvbilJT19yZWFkbGluZSwgTUVUSF9WQVJBUkdTLCBJT19yZWFkbGluZV9fZG9jX199LAorICB7InJlYWRsaW5lcyIsIChQeUNGdW5jdGlvbilJT19yZWFkbGluZXMsTUVUSF9WQVJBUkdTLCBJT19yZWFkbGluZXNfX2RvY19ffSwKKyAgeyJyZXNldCIsICAgICAoUHlDRnVuY3Rpb24pSU9fcmVzZXQsICAgIE1FVEhfTk9BUkdTLCAgSU9fcmVzZXRfX2RvY19ffSwKICAgeyJ0ZWxsIiwgICAgICAoUHlDRnVuY3Rpb24pSU9fdGVsbCwgICAgIE1FVEhfTk9BUkdTLCAgSU9fdGVsbF9fZG9jX199LAogICB7InRydW5jYXRlIiwgIChQeUNGdW5jdGlvbilJT190cnVuY2F0ZSwgTUVUSF9WQVJBUkdTLCBJT190cnVuY2F0ZV9fZG9jX199LAogCiAgIC8qIFJlYWQtb25seSBTdHJpbmdJTyBzcGVjaWZpYyAgbWV0aG9kczogKi8KICAgeyJjbG9zZSIsICAgICAoUHlDRnVuY3Rpb24pSV9jbG9zZSwgICAgTUVUSF9OT0FSR1MsICBPX2Nsb3NlX19kb2NfX30sCi0gIHsic2VlayIsICAgICAgKFB5Q0Z1bmN0aW9uKUlfc2VlaywgICAgIE1FVEhfVkFSQVJHUywgT19zZWVrX19kb2NfX30sICAKLSAge05VTEwsCU5VTEx9CisgIHsic2VlayIsICAgICAgKFB5Q0Z1bmN0aW9uKUlfc2VlaywgICAgIE1FVEhfVkFSQVJHUywgT19zZWVrX19kb2NfX30sCisgIHtOVUxMLCAgICAgICAgTlVMTH0KIH07CiAKIHN0YXRpYyB2b2lkCkBAIC02NDUsMzYgKzY0NSwzNiBAQAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEl0eXBlID0gewogICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLSAgImNTdHJpbmdJTy5TdHJpbmdJIiwJCQkvKnRwX25hbWUqLwotICBzaXplb2YoSW9iamVjdCksCQkJLyp0cF9iYXNpY3NpemUqLwotICAwLAkJCQkJLyp0cF9pdGVtc2l6ZSovCisgICJjU3RyaW5nSU8uU3RyaW5nSSIsICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgc2l6ZW9mKElvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgIC8qIG1ldGhvZHMgKi8KLSAgKGRlc3RydWN0b3IpSV9kZWFsbG9jLAkJLyp0cF9kZWFsbG9jKi8KLSAgMCwJCQkJCS8qdHBfcHJpbnQqLwotICAwLAkJIAkJCS8qIHRwX2dldGF0dHIgKi8KLSAgMCwJCQkJCS8qdHBfc2V0YXR0ciovCi0gIDAsCQkJCQkvKnRwX2NvbXBhcmUqLwotICAwLAkJCQkJLyp0cF9yZXByKi8KLSAgMCwJCQkJCS8qdHBfYXNfbnVtYmVyKi8KLSAgMCwJCQkJCS8qdHBfYXNfc2VxdWVuY2UqLwotICAwLAkJCQkJLyp0cF9hc19tYXBwaW5nKi8KLSAgMCwJCQkJCS8qdHBfaGFzaCovCi0gIDAsCQkJCQkvKnRwX2NhbGwqLwotICAwLAkJCQkJLyp0cF9zdHIqLwotICAwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLSAgMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0gIDAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLSAgUHlfVFBGTEFHU19ERUZBVUxULAkJCS8qIHRwX2ZsYWdzICovCi0gIEl0eXBlX19kb2NfXywJCQkJLyogdHBfZG9jICovCi0gIDAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotICAwLAkJCQkJLyogdHBfY2xlYXIgKi8KLSAgMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0gIDAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotICBQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0gIChpdGVybmV4dGZ1bmMpSU9faXRlcm5leHQsCQkvKiB0cF9pdGVybmV4dCAqLwotICBJX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLSAgMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLSAgZmlsZV9nZXRzZXRsaXN0LAkJCS8qIHRwX2dldHNldCAqLworICAoZGVzdHJ1Y3RvcilJX2RlYWxsb2MsICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgIEl0eXBlX19kb2NfXywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgIChpdGVybmV4dGZ1bmMpSU9faXRlcm5leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgSV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICBmaWxlX2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTY5Niw3ICs2OTYsNyBAQAogICBzZWxmLT5zdHJpbmdfc2l6ZT1zaXplOwogICBzZWxmLT5wYnVmPXM7CiAgIHNlbGYtPnBvcz0wOwotICAKKwogICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOwogfQogCkBAIC03MjAsOSArNzIwLDkgQEAKIC8qIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBJT19tZXRob2RzW10gPSB7Ci0gIHsiU3RyaW5nSU8iLAkoUHlDRnVuY3Rpb24pSU9fU3RyaW5nSU8sCQotICAgTUVUSF9WQVJBUkdTLAlJT19TdHJpbmdJT19fZG9jX199LAotICB7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICB7IlN0cmluZ0lPIiwgIChQeUNGdW5jdGlvbilJT19TdHJpbmdJTywKKyAgIE1FVEhfVkFSQVJHUywgICAgICAgIElPX1N0cmluZ0lPX19kb2NfX30sCisgIHtOVUxMLCAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtNzM5LDcgKzczOSw3IEBACiAgICZPdHlwZSwKIH07CiAKLSNpZm5kZWYgUHlNT0RJTklUX0ZVTkMJLyogZGVjbGFyYXRpb25zIGZvciBETEwgaW1wb3J0L2V4cG9ydCAqLworI2lmbmRlZiBQeU1PRElOSVRfRlVOQyAgLyogZGVjbGFyYXRpb25zIGZvciBETEwgaW1wb3J0L2V4cG9ydCAqLwogI2RlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCiAjZW5kaWYKIFB5TU9ESU5JVF9GVU5DCkBAIC03NDksMjAgKzc0OSwyMCBAQAogCiAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwogICBtID0gUHlfSW5pdE1vZHVsZTQoImNTdHJpbmdJTyIsIElPX21ldGhvZHMsCi0JCSAgICAgY1N0cmluZ0lPX21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOworICAgICAgICAgICAgICAgICAgICAgY1N0cmluZ0lPX21vZHVsZV9kb2N1bWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CiAgIGlmIChtID09IE5VTEwpIHJldHVybjsKIAogICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwogICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLSAgCisKICAgLyogRXhwb3J0IEMgQVBJICovCiAgIFB5X1RZUEUoJkl0eXBlKT0mUHlUeXBlX1R5cGU7CiAgIFB5X1RZUEUoJk90eXBlKT0mUHlUeXBlX1R5cGU7CiAgIGlmIChQeVR5cGVfUmVhZHkoJk90eXBlKSA8IDApIHJldHVybjsKICAgaWYgKFB5VHlwZV9SZWFkeSgmSXR5cGUpIDwgMCkgcmV0dXJuOwogICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCJjU3RyaW5nSU9fQ0FQSSIsCi0JCSAgICAgICB2ID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKCZDQVBJLE5VTEwpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgdiA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cigmQ0FQSSxOVUxMKSk7CiAgIFB5X1hERUNSRUYodik7CiAKICAgLyogRXhwb3J0IFR5cGVzICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NkbW9kdWxlLmMgYi9Nb2R1bGVzL2NkbW9kdWxlLmMKaW5kZXggZjA5YjBhNC4uOGRmYjc2OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvY2Rtb2R1bGUuYwpAQCAtNSw3OTYgKzUsNzk2IEBACiAjaW5jbHVkZSA8Y2RhdWRpby5oPgogI2luY2x1ZGUgIlB5dGhvbi5oIgogCi0jZGVmaW5lIE5DQUxMQkFDS1MJOAorI2RlZmluZSBOQ0FMTEJBQ0tTICAgICAgOAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNEUExBWUVSICpvYl9jZHBsYXllcjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0RQTEFZRVIgKm9iX2NkcGxheWVyOwogfSBjZHBsYXllcm9iamVjdDsKIAotc3RhdGljIFB5T2JqZWN0ICpDZEVycm9yOwkJLyogZXhjZXB0aW9uIGNkLmVycm9yICovCitzdGF0aWMgUHlPYmplY3QgKkNkRXJyb3I7ICAgICAgICAgICAgICAgLyogZXhjZXB0aW9uIGNkLmVycm9yICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9hbGxvd3JlbW92YWwoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmFsbG93cmVtb3ZhbCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjphbGxvd3JlbW92YWwiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlDRGFsbG93cmVtb3ZhbChzZWxmLT5vYl9jZHBsYXllcik7CisgICAgQ0RhbGxvd3JlbW92YWwoc2VsZi0+b2JfY2RwbGF5ZXIpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENEX3ByZXZlbnRyZW1vdmFsKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpwcmV2ZW50cmVtb3ZhbCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpwcmV2ZW50cmVtb3ZhbCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNEcHJldmVudHJlbW92YWwoc2VsZi0+b2JfY2RwbGF5ZXIpOworICAgIENEcHJldmVudHJlbW92YWwoc2VsZi0+b2JfY2RwbGF5ZXIpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENEX2Jlc3RyZWFkc2l6ZShjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6YmVzdHJlYWRzaXplIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmJlc3RyZWFkc2l6ZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RiZXN0cmVhZHNpemUoc2VsZi0+b2JfY2RwbGF5ZXIpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEYmVzdHJlYWRzaXplKHNlbGYtPm9iX2NkcGxheWVyKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9jbG9zZShjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Y2xvc2UiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Y2xvc2UiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUNEY2xvc2Uoc2VsZi0+b2JfY2RwbGF5ZXIpKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsgLyogWFhYIC0gPz8/ICovCi0JCXJldHVybiBOVUxMOwotCX0KLQlzZWxmLT5vYl9jZHBsYXllciA9IE5VTEw7CisgICAgaWYgKCFDRGNsb3NlKHNlbGYtPm9iX2NkcGxheWVyKSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7IC8qIFhYWCAtID8/PyAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2VsZi0+b2JfY2RwbGF5ZXIgPSBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENEX2VqZWN0KGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlDRFNUQVRVUyBzdGF0dXM7CisgICAgQ0RTVEFUVVMgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZWplY3QiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZWplY3QiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUNEZWplY3Qoc2VsZi0+b2JfY2RwbGF5ZXIpKSB7Ci0JCWlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKLQkJICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAiZWplY3QgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIUNEZWplY3Qoc2VsZi0+b2JfY2RwbGF5ZXIpKSB7CisgICAgICAgIGlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKKyAgICAgICAgICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAiZWplY3QgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9nZXRzdGF0dXMoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUNEU1RBVFVTIHN0YXR1czsKKyAgICBDRFNUQVRVUyBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRzdGF0dXMiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0c3RhdHVzIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOyAvKiBYWFggLSA/Pz8gKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsgLyogWFhYIC0gPz8/ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWkoaWlpKShpaWkpKGlpaSlpaWlpKSIsIHN0YXR1cy5zdGF0ZSwKLQkJICAgICAgIHN0YXR1cy50cmFjaywgc3RhdHVzLm1pbiwgc3RhdHVzLnNlYywgc3RhdHVzLmZyYW1lLAotCQkgICAgICAgc3RhdHVzLmFic19taW4sIHN0YXR1cy5hYnNfc2VjLCBzdGF0dXMuYWJzX2ZyYW1lLAotCQkgICAgICAgc3RhdHVzLnRvdGFsX21pbiwgc3RhdHVzLnRvdGFsX3NlYywgc3RhdHVzLnRvdGFsX2ZyYW1lLAotCQkgICAgICAgc3RhdHVzLmZpcnN0LCBzdGF0dXMubGFzdCwgc3RhdHVzLnNjc2lfYXVkaW8sCi0JCSAgICAgICBzdGF0dXMuY3VyX2Jsb2NrKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpKGlpaSkoaWlpKShpaWkpaWlpaSkiLCBzdGF0dXMuc3RhdGUsCisgICAgICAgICAgICAgICAgICAgc3RhdHVzLnRyYWNrLCBzdGF0dXMubWluLCBzdGF0dXMuc2VjLCBzdGF0dXMuZnJhbWUsCisgICAgICAgICAgICAgICAgICAgc3RhdHVzLmFic19taW4sIHN0YXR1cy5hYnNfc2VjLCBzdGF0dXMuYWJzX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgIHN0YXR1cy50b3RhbF9taW4sIHN0YXR1cy50b3RhbF9zZWMsIHN0YXR1cy50b3RhbF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICBzdGF0dXMuZmlyc3QsIHN0YXR1cy5sYXN0LCBzdGF0dXMuc2NzaV9hdWRpbywKKyAgICAgICAgICAgICAgICAgICBzdGF0dXMuY3VyX2Jsb2NrKTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX2dldHRyYWNraW5mbyhjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHRyYWNrOwotCUNEVFJBQ0tJTkZPIGluZm87Ci0JQ0RTVEFUVVMgc3RhdHVzOworICAgIGludCB0cmFjazsKKyAgICBDRFRSQUNLSU5GTyBpbmZvOworICAgIENEU1RBVFVTIHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXR0cmFja2luZm8iLCAmdHJhY2spKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0dHJhY2tpbmZvIiwgJnRyYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUNEZ2V0dHJhY2tpbmZvKHNlbGYtPm9iX2NkcGxheWVyLCB0cmFjaywgJmluZm8pKSB7Ci0JCWlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKLQkJICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAiZ2V0dHJhY2tpbmZvIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFDRGdldHRyYWNraW5mbyhzZWxmLT5vYl9jZHBsYXllciwgdHJhY2ssICZpbmZvKSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgImdldHRyYWNraW5mbyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIigoaWlpKShpaWkpKSIsCi0JCSAgICAgICBpbmZvLnN0YXJ0X21pbiwgaW5mby5zdGFydF9zZWMsIGluZm8uc3RhcnRfZnJhbWUsCi0JCSAgICAgICBpbmZvLnRvdGFsX21pbiwgaW5mby50b3RhbF9zZWMsIGluZm8udG90YWxfZnJhbWUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoKGlpaSkoaWlpKSkiLAorICAgICAgICAgICAgICAgICAgIGluZm8uc3RhcnRfbWluLCBpbmZvLnN0YXJ0X3NlYywgaW5mby5zdGFydF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICBpbmZvLnRvdGFsX21pbiwgaW5mby50b3RhbF9zZWMsIGluZm8udG90YWxfZnJhbWUpOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfbXNmdG9ibG9jayhjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG1pbiwgc2VjLCBmcmFtZTsKKyAgICBpbnQgbWluLCBzZWMsIGZyYW1lOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWk6bXNmdG9ibG9jayIsICZtaW4sICZzZWMsICZmcmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOm1zZnRvYmxvY2siLCAmbWluLCAmc2VjLCAmZnJhbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgQ0Rtc2Z0b2Jsb2NrKHNlbGYtPm9iX2NkcGxheWVyLAotCQkJCQkJbWluLCBzZWMsIGZyYW1lKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRG1zZnRvYmxvY2soc2VsZi0+b2JfY2RwbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiwgc2VjLCBmcmFtZSkpOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfcGxheShjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0YXJ0LCBwbGF5OwotCUNEU1RBVFVTIHN0YXR1czsKKyAgICBpbnQgc3RhcnQsIHBsYXk7CisgICAgQ0RTVEFUVVMgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpwbGF5IiwgJnN0YXJ0LCAmcGxheSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6cGxheSIsICZzdGFydCwgJnBsYXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghQ0RwbGF5KHNlbGYtPm9iX2NkcGxheWVyLCBzdGFydCwgcGxheSkpIHsKLQkJaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgotCQkgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5IGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFDRHBsYXkoc2VsZi0+b2JfY2RwbGF5ZXIsIHN0YXJ0LCBwbGF5KSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInBsYXkgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9wbGF5YWJzKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbWluLCBzZWMsIGZyYW1lLCBwbGF5OwotCUNEU1RBVFVTIHN0YXR1czsKKyAgICBpbnQgbWluLCBzZWMsIGZyYW1lLCBwbGF5OworICAgIENEU1RBVFVTIHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaTpwbGF5YWJzIiwgJm1pbiwgJnNlYywgJmZyYW1lLCAmcGxheSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaTpwbGF5YWJzIiwgJm1pbiwgJnNlYywgJmZyYW1lLCAmcGxheSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFDRHBsYXlhYnMoc2VsZi0+b2JfY2RwbGF5ZXIsIG1pbiwgc2VjLCBmcmFtZSwgcGxheSkpIHsKLQkJaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgotCQkgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5YWJzIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFDRHBsYXlhYnMoc2VsZi0+b2JfY2RwbGF5ZXIsIG1pbiwgc2VjLCBmcmFtZSwgcGxheSkpIHsKKyAgICAgICAgaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgorICAgICAgICAgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJwbGF5YWJzIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfcGxheXRyYWNrKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc3RhcnQsIHBsYXk7Ci0JQ0RTVEFUVVMgc3RhdHVzOworICAgIGludCBzdGFydCwgcGxheTsKKyAgICBDRFNUQVRVUyBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOnBsYXl0cmFjayIsICZzdGFydCwgJnBsYXkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOnBsYXl0cmFjayIsICZzdGFydCwgJnBsYXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghQ0RwbGF5dHJhY2soc2VsZi0+b2JfY2RwbGF5ZXIsIHN0YXJ0LCBwbGF5KSkgewotCQlpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCi0JCSAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInBsYXl0cmFjayBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RwbGF5dHJhY2soc2VsZi0+b2JfY2RwbGF5ZXIsIHN0YXJ0LCBwbGF5KSkgeworICAgICAgICBpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCisgICAgICAgICAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInBsYXl0cmFjayBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX3BsYXl0cmFja2FicyhjZHBsYXllcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHRyYWNrLCBtaW4sIHNlYywgZnJhbWUsIHBsYXk7Ci0JQ0RTVEFUVVMgc3RhdHVzOworICAgIGludCB0cmFjaywgbWluLCBzZWMsIGZyYW1lLCBwbGF5OworICAgIENEU1RBVFVTIHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaWk6cGxheXRyYWNrYWJzIiwgJnRyYWNrLCAmbWluLCAmc2VjLAotCQkJICAgICAgJmZyYW1lLCAmcGxheSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaWk6cGxheXRyYWNrYWJzIiwgJnRyYWNrLCAmbWluLCAmc2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWUsICZwbGF5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUNEcGxheXRyYWNrYWJzKHNlbGYtPm9iX2NkcGxheWVyLCB0cmFjaywgbWluLCBzZWMsIGZyYW1lLCBwbGF5KSkgewotCQlpZiAoQ0RnZXRzdGF0dXMoc2VsZi0+b2JfY2RwbGF5ZXIsICZzdGF0dXMpICYmCi0JCSAgICBzdGF0dXMuc3RhdGUgPT0gQ0RfTk9ESVNDKQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJubyBkaXNjIGluIHBsYXllciIpOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgInBsYXl0cmFja2FicyBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghQ0RwbGF5dHJhY2thYnMoc2VsZi0+b2JfY2RwbGF5ZXIsIHRyYWNrLCBtaW4sIHNlYywgZnJhbWUsIHBsYXkpKSB7CisgICAgICAgIGlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKKyAgICAgICAgICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAicGxheXRyYWNrYWJzIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogQ0RfcmVhZGRhKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbnVtZnJhbWVzLCBuOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IG51bWZyYW1lcywgbjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWRkYSIsICZudW1mcmFtZXMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVhZGRhIiwgJm51bWZyYW1lcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbnVtZnJhbWVzICogc2l6ZW9mKENERlJBTUUpKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG51bWZyYW1lcyAqIHNpemVvZihDREZSQU1FKSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW4gPSBDRHJlYWRkYShzZWxmLT5vYl9jZHBsYXllciwKLQkJICAgICAgIChDREZSQU1FICopIFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCksIG51bWZyYW1lcyk7Ci0JaWYgKG4gPT0gLTEpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuIDwgbnVtZnJhbWVzKQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIG4gKiBzaXplb2YoQ0RGUkFNRSkpOworICAgIG4gPSBDRHJlYWRkYShzZWxmLT5vYl9jZHBsYXllciwKKyAgICAgICAgICAgICAgICAgICAoQ0RGUkFNRSAqKSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpLCBudW1mcmFtZXMpOworICAgIGlmIChuID09IC0xKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobiA8IG51bWZyYW1lcykKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBuICogc2l6ZW9mKENERlJBTUUpKTsKIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENEX3NlZWsoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBtaW4sIHNlYywgZnJhbWU7Ci0JbG9uZyBQeVRyeUJsb2NrOworICAgIGludCBtaW4sIHNlYywgZnJhbWU7CisgICAgbG9uZyBQeVRyeUJsb2NrOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWk6c2VlayIsICZtaW4sICZzZWMsICZmcmFtZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOnNlZWsiLCAmbWluLCAmc2VjLCAmZnJhbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5VHJ5QmxvY2sgPSBDRHNlZWsoc2VsZi0+b2JfY2RwbGF5ZXIsIG1pbiwgc2VjLCBmcmFtZSk7Ci0JaWYgKFB5VHJ5QmxvY2sgPT0gLTEpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKENkRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlUcnlCbG9jayA9IENEc2VlayhzZWxmLT5vYl9jZHBsYXllciwgbWluLCBzZWMsIGZyYW1lKTsKKyAgICBpZiAoUHlUcnlCbG9jayA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeVRyeUJsb2NrKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlUcnlCbG9jayk7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9zZWVrdHJhY2soY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0cmFjazsKLQlsb25nIFB5VHJ5QmxvY2s7CisgICAgaW50IHRyYWNrOworICAgIGxvbmcgUHlUcnlCbG9jazsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZWVrdHJhY2siLCAmdHJhY2spKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2Vla3RyYWNrIiwgJnRyYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeVRyeUJsb2NrID0gQ0RzZWVrdHJhY2soc2VsZi0+b2JfY2RwbGF5ZXIsIHRyYWNrKTsKLQlpZiAoUHlUcnlCbG9jayA9PSAtMSkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeVRyeUJsb2NrID0gQ0RzZWVrdHJhY2soc2VsZi0+b2JfY2RwbGF5ZXIsIHRyYWNrKTsKKyAgICBpZiAoUHlUcnlCbG9jayA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oQ2RFcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeVRyeUJsb2NrKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlUcnlCbG9jayk7CiB9Ci0JCisKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9zZWVrYmxvY2soY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGxvbmcgUHlUcnlCbG9jazsKKyAgICB1bnNpZ25lZCBsb25nIFB5VHJ5QmxvY2s7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6c2Vla2Jsb2NrIiwgJlB5VHJ5QmxvY2spKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6c2Vla2Jsb2NrIiwgJlB5VHJ5QmxvY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5VHJ5QmxvY2sgPSBDRHNlZWtibG9jayhzZWxmLT5vYl9jZHBsYXllciwgUHlUcnlCbG9jayk7Ci0JaWYgKFB5VHJ5QmxvY2sgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5VHJ5QmxvY2sgPSBDRHNlZWtibG9jayhzZWxmLT5vYl9jZHBsYXllciwgUHlUcnlCbG9jayk7CisgICAgaWYgKFB5VHJ5QmxvY2sgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFB5VHJ5QmxvY2spOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhQeVRyeUJsb2NrKTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX3N0b3AoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUNEU1RBVFVTIHN0YXR1czsKKyAgICBDRFNUQVRVUyBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpzdG9wIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOnN0b3AiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUNEc3RvcChzZWxmLT5vYl9jZHBsYXllcikpIHsKLQkJaWYgKENEZ2V0c3RhdHVzKHNlbGYtPm9iX2NkcGxheWVyLCAmc3RhdHVzKSAmJgotCQkgICAgc3RhdHVzLnN0YXRlID09IENEX05PRElTQykKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAibm8gZGlzYyBpbiBwbGF5ZXIiKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0U3RyaW5nKENkRXJyb3IsICJzdG9wIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFDRHN0b3Aoc2VsZi0+b2JfY2RwbGF5ZXIpKSB7CisgICAgICAgIGlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKKyAgICAgICAgICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAic3RvcCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KLQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIENEX3RvZ2dsZXBhdXNlKGNkcGxheWVyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlDRFNUQVRVUyBzdGF0dXM7CisgICAgQ0RTVEFUVVMgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6dG9nZ2xlcGF1c2UiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6dG9nZ2xlcGF1c2UiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIUNEdG9nZ2xlcGF1c2Uoc2VsZi0+b2JfY2RwbGF5ZXIpKSB7Ci0JCWlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKLQkJICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAidG9nZ2xlcGF1c2UgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIUNEdG9nZ2xlcGF1c2Uoc2VsZi0+b2JfY2RwbGF5ZXIpKSB7CisgICAgICAgIGlmIChDRGdldHN0YXR1cyhzZWxmLT5vYl9jZHBsYXllciwgJnN0YXR1cykgJiYKKyAgICAgICAgICAgIHN0YXR1cy5zdGF0ZSA9PSBDRF9OT0RJU0MpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2RFcnJvciwgIm5vIGRpc2MgaW4gcGxheWVyIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAidG9nZ2xlcGF1c2UgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9Ci0JCisKIHN0YXRpYyBQeU1ldGhvZERlZiBjZHBsYXllcl9tZXRob2RzW10gPSB7Ci0JeyJhbGxvd3JlbW92YWwiLAkoUHlDRnVuY3Rpb24pQ0RfYWxsb3dyZW1vdmFsLAlNRVRIX1ZBUkFSR1N9LAotCXsiYmVzdHJlYWRzaXplIiwJKFB5Q0Z1bmN0aW9uKUNEX2Jlc3RyZWFkc2l6ZSwJTUVUSF9WQVJBUkdTfSwKLQl7ImNsb3NlIiwJCShQeUNGdW5jdGlvbilDRF9jbG9zZSwJCU1FVEhfVkFSQVJHU30sCi0JeyJlamVjdCIsCQkoUHlDRnVuY3Rpb24pQ0RfZWplY3QsCQlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0c3RhdHVzIiwJCShQeUNGdW5jdGlvbilDRF9nZXRzdGF0dXMsCQlNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0dHJhY2tpbmZvIiwJKFB5Q0Z1bmN0aW9uKUNEX2dldHRyYWNraW5mbywJTUVUSF9WQVJBUkdTfSwKLQl7Im1zZnRvYmxvY2siLAkJKFB5Q0Z1bmN0aW9uKUNEX21zZnRvYmxvY2ssCQlNRVRIX1ZBUkFSR1N9LAotCXsicGxheSIsCQkoUHlDRnVuY3Rpb24pQ0RfcGxheSwJCU1FVEhfVkFSQVJHU30sCi0JeyJwbGF5YWJzIiwJCShQeUNGdW5jdGlvbilDRF9wbGF5YWJzLAkJTUVUSF9WQVJBUkdTfSwKLQl7InBsYXl0cmFjayIsCQkoUHlDRnVuY3Rpb24pQ0RfcGxheXRyYWNrLAkJTUVUSF9WQVJBUkdTfSwKLQl7InBsYXl0cmFja2FicyIsCShQeUNGdW5jdGlvbilDRF9wbGF5dHJhY2thYnMsCU1FVEhfVkFSQVJHU30sCi0JeyJwcmV2ZW50cmVtb3ZhbCIsCShQeUNGdW5jdGlvbilDRF9wcmV2ZW50cmVtb3ZhbCwJTUVUSF9WQVJBUkdTfSwKLQl7InJlYWRkYSIsCQkoUHlDRnVuY3Rpb24pQ0RfcmVhZGRhLAkJTUVUSF9WQVJBUkdTfSwKLQl7InNlZWsiLAkJKFB5Q0Z1bmN0aW9uKUNEX3NlZWssCQlNRVRIX1ZBUkFSR1N9LAotCXsic2Vla2Jsb2NrIiwJCShQeUNGdW5jdGlvbilDRF9zZWVrYmxvY2ssCQlNRVRIX1ZBUkFSR1N9LAotCXsic2Vla3RyYWNrIiwJCShQeUNGdW5jdGlvbilDRF9zZWVrdHJhY2ssCQlNRVRIX1ZBUkFSR1N9LAotCXsic3RvcCIsCQkoUHlDRnVuY3Rpb24pQ0Rfc3RvcCwJCU1FVEhfVkFSQVJHU30sCi0JeyJ0b2dnbGVwYXVzZSIsCQkoUHlDRnVuY3Rpb24pQ0RfdG9nZ2xlcGF1c2UsICAgCU1FVEhfVkFSQVJHU30sCi0Je05VTEwsCQkJTlVMTH0gCQkvKiBzZW50aW5lbCAqLworICAgIHsiYWxsb3dyZW1vdmFsIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfYWxsb3dyZW1vdmFsLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJiZXN0cmVhZHNpemUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9iZXN0cmVhZHNpemUsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImNsb3NlIiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2Nsb3NlLCAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZWplY3QiLCAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfZWplY3QsICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRzdGF0dXMiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9nZXRzdGF0dXMsICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0dHJhY2tpbmZvIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfZ2V0dHJhY2tpbmZvLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJtc2Z0b2Jsb2NrIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9tc2Z0b2Jsb2NrLCAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicGxheSIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfcGxheSwgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJwbGF5YWJzIiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9wbGF5YWJzLCAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicGxheXRyYWNrIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfcGxheXRyYWNrLCAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InBsYXl0cmFja2FicyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3BsYXl0cmFja2FicywgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicHJldmVudHJlbW92YWwiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfcHJldmVudHJlbW92YWwsIE1FVEhfVkFSQVJHU30sCisgICAgeyJyZWFkZGEiLCAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9yZWFkZGEsICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNlZWsiLCAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3NlZWssICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2Vla2Jsb2NrIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0Rfc2Vla2Jsb2NrLCAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNlZWt0cmFjayIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3NlZWt0cmFjaywgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzdG9wIiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9zdG9wLCAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InRvZ2dsZXBhdXNlIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3RvZ2dsZXBhdXNlLCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyB2b2lkCiBjZHBsYXllcl9kZWFsbG9jKGNkcGxheWVyb2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9jZHBsYXllciAhPSBOVUxMKQotCQlDRGNsb3NlKHNlbGYtPm9iX2NkcGxheWVyKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2NkcGxheWVyICE9IE5VTEwpCisgICAgICAgIENEY2xvc2Uoc2VsZi0+b2JfY2RwbGF5ZXIpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNkcGxheWVyX2dldGF0dHIoY2RwbGF5ZXJvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JaWYgKHNlbGYtPm9iX2NkcGxheWVyID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIm5vIHBsYXllciBhY3RpdmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9GaW5kTWV0aG9kKGNkcGxheWVyX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIGlmIChzZWxmLT5vYl9jZHBsYXllciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJubyBwbGF5ZXIgYWN0aXZlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChjZHBsYXllcl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogUHlUeXBlT2JqZWN0IENkUGxheWVydHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJLypvYl9zaXplKi8KLQkiY2QuY2RwbGF5ZXIiLAkvKnRwX25hbWUqLwotCXNpemVvZihjZHBsYXllcm9iamVjdCksCS8qdHBfc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY2RwbGF5ZXJfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYyljZHBsYXllcl9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgImNkLmNkcGxheWVyIiwgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihjZHBsYXllcm9iamVjdCksICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpY2RwbGF5ZXJfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWNkcGxheWVyX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3Y2RwbGF5ZXJvYmplY3QoQ0RQTEFZRVIgKmNkcCkKIHsKLQljZHBsYXllcm9iamVjdCAqcDsKKyAgICBjZHBsYXllcm9iamVjdCAqcDsKIAotCXAgPSBQeU9iamVjdF9OZXcoY2RwbGF5ZXJvYmplY3QsICZDZFBsYXllcnR5cGUpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAtPm9iX2NkcGxheWVyID0gY2RwOwotCXJldHVybiAoUHlPYmplY3QgKikgcDsKKyAgICBwID0gUHlPYmplY3RfTmV3KGNkcGxheWVyb2JqZWN0LCAmQ2RQbGF5ZXJ0eXBlKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5vYl9jZHBsYXllciA9IGNkcDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9vcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpkZXYsICpkaXJlY3Rpb247Ci0JQ0RQTEFZRVIgKmNkcDsKKyAgICBjaGFyICpkZXYsICpkaXJlY3Rpb247CisgICAgQ0RQTEFZRVIgKmNkcDsKIAotCS8qCi0JICogVmFyaWFibGUgbnVtYmVyIG9mIGFyZ3MuCi0JICogRmlyc3QgZGVmYXVsdHMgdG8gIk5vbmUiLCBzZWNvbmQgZGVmYXVsdHMgdG8gInIiLgotCSAqLwotCWRldiA9IE5VTEw7Ci0JZGlyZWN0aW9uID0gInIiOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHpzOm9wZW4iLCAmZGV2LCAmZGlyZWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyoKKyAgICAgKiBWYXJpYWJsZSBudW1iZXIgb2YgYXJncy4KKyAgICAgKiBGaXJzdCBkZWZhdWx0cyB0byAiTm9uZSIsIHNlY29uZCBkZWZhdWx0cyB0byAiciIuCisgICAgICovCisgICAgZGV2ID0gTlVMTDsKKyAgICBkaXJlY3Rpb24gPSAiciI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8enM6b3BlbiIsICZkZXYsICZkaXJlY3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNkcCA9IENEb3BlbihkZXYsIGRpcmVjdGlvbik7Ci0JaWYgKGNkcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGNkcCA9IENEb3BlbihkZXYsIGRpcmVjdGlvbik7CisgICAgaWYgKGNkcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhDZEVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG5ld2NkcGxheWVyb2JqZWN0KGNkcCk7CisgICAgcmV0dXJuIG5ld2NkcGxheWVyb2JqZWN0KGNkcCk7CiB9CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0RQQVJTRVIgKm9iX2NkcGFyc2VyOwotCXN0cnVjdCB7Ci0JCVB5T2JqZWN0ICpvYl9jZGNhbGxiYWNrOwotCQlQeU9iamVjdCAqb2JfY2RjYWxsYmFja2FyZzsKLQl9IG9iX2NkY2FsbGJhY2tzW05DQUxMQkFDS1NdOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDRFBBUlNFUiAqb2JfY2RwYXJzZXI7CisgICAgc3RydWN0IHsKKyAgICAgICAgUHlPYmplY3QgKm9iX2NkY2FsbGJhY2s7CisgICAgICAgIFB5T2JqZWN0ICpvYl9jZGNhbGxiYWNrYXJnOworICAgIH0gb2JfY2RjYWxsYmFja3NbTkNBTExCQUNLU107CiB9IGNkcGFyc2Vyb2JqZWN0OwogCiBzdGF0aWMgdm9pZAogQ0RfY2FsbGJhY2sodm9pZCAqYXJnLCBDRERBVEFUWVBFUyB0eXBlLCB2b2lkICpkYXRhKQogewotCVB5T2JqZWN0ICpyZXN1bHQsICphcmdzLCAqdiA9IE5VTEw7Ci0JY2hhciAqcDsKLQlpbnQgaTsKLQljZHBhcnNlcm9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqcmVzdWx0LCAqYXJncywgKnYgPSBOVUxMOworICAgIGNoYXIgKnA7CisgICAgaW50IGk7CisgICAgY2RwYXJzZXJvYmplY3QgKnNlbGY7CiAKLQlzZWxmID0gKGNkcGFyc2Vyb2JqZWN0ICopIGFyZzsKLQlhcmdzID0gUHlUdXBsZV9OZXcoMyk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrYXJnKTsKLQlQeVR1cGxlX1NldEl0ZW0oYXJncywgMCwgc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7Ci0JUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDEsIFB5SW50X0Zyb21Mb25nKChsb25nKSB0eXBlKSk7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBjZF9hdWRpbzoKLQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIENEREFfREFUQVNJWkUpOwotCQlicmVhazsKLQljYXNlIGNkX3BudW06Ci0JY2FzZSBjZF9pbmRleDoKLQkJdiA9IFB5SW50X0Zyb21Mb25nKCgoQ0RQUk9HTlVNICopIGRhdGEpLT52YWx1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgY2RfcHRpbWU6Ci0JY2FzZSBjZF9hdGltZToKKyAgICBzZWxmID0gKGNkcGFyc2Vyb2JqZWN0ICopIGFyZzsKKyAgICBhcmdzID0gUHlUdXBsZV9OZXcoMyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrYXJnKTsKKyAgICBQeVR1cGxlX1NldEl0ZW0oYXJncywgMCwgc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyk7CisgICAgUHlUdXBsZV9TZXRJdGVtKGFyZ3MsIDEsIFB5SW50X0Zyb21Mb25nKChsb25nKSB0eXBlKSk7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBjZF9hdWRpbzoKKyAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIENEREFfREFUQVNJWkUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGNkX3BudW06CisgICAgY2FzZSBjZF9pbmRleDoKKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKCgoQ0RQUk9HTlVNICopIGRhdGEpLT52YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgY2RfcHRpbWU6CisgICAgY2FzZSBjZF9hdGltZToKICNkZWZpbmUgcHRyICgoc3RydWN0IGNkdGltZWNvZGUgKikgZGF0YSkKLQkJdiA9IFB5X0J1aWxkVmFsdWUoIihpaWkpIiwKLQkJCSAgICBwdHItPm1oaSAqIDEwICsgcHRyLT5tbG8sCi0JCQkgICAgcHRyLT5zaGkgKiAxMCArIHB0ci0+c2xvLAotCQkJICAgIHB0ci0+ZmhpICogMTAgKyBwdHItPmZsbyk7CisgICAgICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaWlpKSIsCisgICAgICAgICAgICAgICAgICAgIHB0ci0+bWhpICogMTAgKyBwdHItPm1sbywKKyAgICAgICAgICAgICAgICAgICAgcHRyLT5zaGkgKiAxMCArIHB0ci0+c2xvLAorICAgICAgICAgICAgICAgICAgICBwdHItPmZoaSAqIDEwICsgcHRyLT5mbG8pOwogI3VuZGVmIHB0cgotCQlicmVhazsKLQljYXNlIGNkX2NhdGFsb2c6Ci0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAxMyk7Ci0JCXAgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQkJZm9yIChpID0gMDsgaSA8IDEzOyBpKyspCi0JCQkqcCsrID0gKChjaGFyICopIGRhdGEpW2ldICsgJzAnOwotCQlicmVhazsKLQljYXNlIGNkX2lkZW50OgorICAgICAgICBicmVhazsKKyAgICBjYXNlIGNkX2NhdGFsb2c6CisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAxMyk7CisgICAgICAgIHAgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEzOyBpKyspCisgICAgICAgICAgICAqcCsrID0gKChjaGFyICopIGRhdGEpW2ldICsgJzAnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGNkX2lkZW50OgogI2RlZmluZSBwdHIgKChzdHJ1Y3QgY2RpZGVudCAqKSBkYXRhKQotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMTIpOwotCQlwID0gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JCUNEc2J0b2EocCwgcHRyLT5jb3VudHJ5LCAyKTsKLQkJcCArPSAyOwotCQlDRHNidG9hKHAsIHB0ci0+b3duZXIsIDMpOwotCQlwICs9IDM7Ci0JCSpwKysgPSBwdHItPnllYXJbMF0gKyAnMCc7Ci0JCSpwKysgPSBwdHItPnllYXJbMV0gKyAnMCc7Ci0JCSpwKysgPSBwdHItPnNlcmlhbFswXSArICcwJzsKLQkJKnArKyA9IHB0ci0+c2VyaWFsWzFdICsgJzAnOwotCQkqcCsrID0gcHRyLT5zZXJpYWxbMl0gKyAnMCc7Ci0JCSpwKysgPSBwdHItPnNlcmlhbFszXSArICcwJzsKLQkJKnArKyA9IHB0ci0+c2VyaWFsWzRdICsgJzAnOworICAgICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMTIpOworICAgICAgICBwID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgICAgIENEc2J0b2EocCwgcHRyLT5jb3VudHJ5LCAyKTsKKyAgICAgICAgcCArPSAyOworICAgICAgICBDRHNidG9hKHAsIHB0ci0+b3duZXIsIDMpOworICAgICAgICBwICs9IDM7CisgICAgICAgICpwKysgPSBwdHItPnllYXJbMF0gKyAnMCc7CisgICAgICAgICpwKysgPSBwdHItPnllYXJbMV0gKyAnMCc7CisgICAgICAgICpwKysgPSBwdHItPnNlcmlhbFswXSArICcwJzsKKyAgICAgICAgKnArKyA9IHB0ci0+c2VyaWFsWzFdICsgJzAnOworICAgICAgICAqcCsrID0gcHRyLT5zZXJpYWxbMl0gKyAnMCc7CisgICAgICAgICpwKysgPSBwdHItPnNlcmlhbFszXSArICcwJzsKKyAgICAgICAgKnArKyA9IHB0ci0+c2VyaWFsWzRdICsgJzAnOwogI3VuZGVmIHB0cgotCQlicmVhazsKLQljYXNlIGNkX2NvbnRyb2w6Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgKigodW5jaGFyICopIGRhdGEpKTsKLQkJYnJlYWs7Ci0JfQotCVB5VHVwbGVfU2V0SXRlbShhcmdzLCAyLCB2KTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjaywKLQkJCQkgICBhcmdzKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JUHlfWERFQ1JFRihyZXN1bHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGNkX2NvbnRyb2w6CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgKigodW5jaGFyICopIGRhdGEpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFB5VHVwbGVfU2V0SXRlbShhcmdzLCAyLCB2KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9YREVDUkVGKHJlc3VsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9kZWxldGVwYXJzZXIoY2RwYXJzZXJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBpOworICAgIGludCBpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZGVsZXRlcGFyc2VyIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmRlbGV0ZXBhcnNlciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNEZGVsZXRlcGFyc2VyKHNlbGYtPm9iX2NkcGFyc2VyKTsKLQlzZWxmLT5vYl9jZHBhcnNlciA9IE5VTEw7CisgICAgQ0RkZWxldGVwYXJzZXIoc2VsZi0+b2JfY2RwYXJzZXIpOworICAgIHNlbGYtPm9iX2NkcGFyc2VyID0gTlVMTDsKIAotCS8qIG5vIHNlbnNlIGluIGtlZXBpbmcgdGhlIGNhbGxiYWNrcywgc28gcmVtb3ZlIHRoZW0gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkNBTExCQUNLUzsgaSsrKSB7Ci0JCVB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayk7Ci0JCXNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2sgPSBOVUxMOwotCQlQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcpOwotCQlzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnID0gTlVMTDsKLQl9CisgICAgLyogbm8gc2Vuc2UgaW4ga2VlcGluZyB0aGUgY2FsbGJhY2tzLCBzbyByZW1vdmUgdGhlbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOQ0FMTEJBQ0tTOyBpKyspIHsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrKTsKKyAgICAgICAgc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyk7CisgICAgICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9wYXJzZWZyYW1lKGNkcGFyc2Vyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpjZGZwOwotCWludCBsZW5ndGg7Ci0JQ0RGUkFNRSAqcDsKKyAgICBjaGFyICpjZGZwOworICAgIGludCBsZW5ndGg7CisgICAgQ0RGUkFNRSAqcDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6cGFyc2VmcmFtZSIsICZjZGZwLCAmbGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpwYXJzZWZyYW1lIiwgJmNkZnAsICZsZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChsZW5ndGggJSBzaXplb2YoQ0RGUkFNRSkgIT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIGxlbmd0aCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGxlbmd0aCAlIHNpemVvZihDREZSQU1FKSAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXAgPSAoQ0RGUkFNRSAqKSBjZGZwOwotCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCUNEcGFyc2VmcmFtZShzZWxmLT5vYl9jZHBhcnNlciwgcCk7Ci0JCWxlbmd0aCAtPSBzaXplb2YoQ0RGUkFNRSk7Ci0JCXArKzsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcCA9IChDREZSQU1FICopIGNkZnA7CisgICAgd2hpbGUgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgQ0RwYXJzZWZyYW1lKHNlbGYtPm9iX2NkcGFyc2VyLCBwKTsKKyAgICAgICAgbGVuZ3RoIC09IHNpemVvZihDREZSQU1FKTsKKyAgICAgICAgcCsrOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRF9yZW1vdmVjYWxsYmFjayhjZHBhcnNlcm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHR5cGU7CisgICAgaW50IHR5cGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVtb3ZlY2FsbGJhY2siLCAmdHlwZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpyZW1vdmVjYWxsYmFjayIsICZ0eXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBOQ0FMTEJBQ0tTKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgdHlwZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gTkNBTExCQUNLUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYmFkIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JQ0RyZW1vdmVjYWxsYmFjayhzZWxmLT5vYl9jZHBhcnNlciwgKENEREFUQVRZUEVTKSB0eXBlKTsKKyAgICBDRHJlbW92ZWNhbGxiYWNrKHNlbGYtPm9iX2NkcGFyc2VyLCAoQ0REQVRBVFlQRVMpIHR5cGUpOwogCi0JUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrKTsKLQlzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrID0gTlVMTDsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2spOworICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2sgPSBOVUxMOwogCi0JUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrYXJnKTsKLQlzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrYXJnID0gTlVMTDsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcpOworICAgIHNlbGYtPm9iX2NkY2FsbGJhY2tzW3R5cGVdLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENEX3Jlc2V0cGFyc2VyKGNkcGFyc2Vyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpyZXNldHBhcnNlciIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpyZXNldHBhcnNlciIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNEcmVzZXRwYXJzZXIoc2VsZi0+b2JfY2RwYXJzZXIpOworICAgIENEcmVzZXRwYXJzZXIoc2VsZi0+b2JfY2RwYXJzZXIpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENEX2FkZGNhbGxiYWNrKGNkcGFyc2Vyb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgdHlwZTsKLQlQeU9iamVjdCAqZnVuYywgKmZ1bmNhcmc7CisgICAgaW50IHR5cGU7CisgICAgUHlPYmplY3QgKmZ1bmMsICpmdW5jYXJnOwogCi0JLyogWFhYIC0gbW9yZSB3b3JrIGhlcmUgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPTzphZGRjYWxsYmFjayIsICZ0eXBlLCAmZnVuYywgJmZ1bmNhcmcpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBYWFggLSBtb3JlIHdvcmsgaGVyZSAqLworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU9POmFkZGNhbGxiYWNrIiwgJnR5cGUsICZmdW5jLCAmZnVuY2FyZykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gTkNBTExCQUNLUykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJndW1lbnQgb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBOQ0FMTEJBQ0tTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmd1bWVudCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjaWZkZWYgQ0RzZXRjYWxsYmFjawotCUNEYWRkY2FsbGJhY2soc2VsZi0+b2JfY2RwYXJzZXIsIChDRERBVEFUWVBFUykgdHlwZSwgQ0RfY2FsbGJhY2ssCi0JCSAgICAgICh2b2lkICopIHNlbGYpOworICAgIENEYWRkY2FsbGJhY2soc2VsZi0+b2JfY2RwYXJzZXIsIChDRERBVEFUWVBFUykgdHlwZSwgQ0RfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAodm9pZCAqKSBzZWxmKTsKICNlbHNlCi0JQ0RzZXRjYWxsYmFjayhzZWxmLT5vYl9jZHBhcnNlciwgKENEREFUQVRZUEVTKSB0eXBlLCBDRF9jYWxsYmFjaywKLQkJICAgICAgKHZvaWQgKikgc2VsZik7CisgICAgQ0RzZXRjYWxsYmFjayhzZWxmLT5vYl9jZHBhcnNlciwgKENEREFUQVRZUEVTKSB0eXBlLCBDRF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICh2b2lkICopIHNlbGYpOwogI2VuZGlmCi0JUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrKTsKLQlQeV9JTkNSRUYoZnVuYyk7Ci0Jc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayA9IGZ1bmM7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrYXJnKTsKLQlQeV9JTkNSRUYoZnVuY2FyZyk7Ci0Jc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyA9IGZ1bmNhcmc7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrKTsKKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFjayA9IGZ1bmM7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1t0eXBlXS5vYl9jZGNhbGxiYWNrYXJnKTsKKyAgICBQeV9JTkNSRUYoZnVuY2FyZyk7CisgICAgc2VsZi0+b2JfY2RjYWxsYmFja3NbdHlwZV0ub2JfY2RjYWxsYmFja2FyZyA9IGZ1bmNhcmc7CiAKIC8qCi0JaWYgKHR5cGUgPT0gY2RfYXVkaW8pIHsKLQkJc2lnZnBlX1tfVU5ERVJGTF0ucmVwbHMgPSBfWkVSTzsKLQkJaGFuZGxlX3NpZ2ZwZXMoX09OLCBfRU5fVU5ERVJGTCwgTlVMTCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgX0FCT1JUX09OX0VSUk9SLCBOVUxMKTsKLQl9CisgICAgaWYgKHR5cGUgPT0gY2RfYXVkaW8pIHsKKyAgICAgICAgc2lnZnBlX1tfVU5ERVJGTF0ucmVwbHMgPSBfWkVSTzsKKyAgICAgICAgaGFuZGxlX3NpZ2ZwZXMoX09OLCBfRU5fVU5ERVJGTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FCT1JUX09OX0VSUk9SLCBOVUxMKTsKKyAgICB9CiAqLwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGNkcGFyc2VyX21ldGhvZHNbXSA9IHsKLQl7ImFkZGNhbGxiYWNrIiwJCShQeUNGdW5jdGlvbilDRF9hZGRjYWxsYmFjaywgICAJTUVUSF9WQVJBUkdTfSwKLQl7ImRlbGV0ZXBhcnNlciIsCShQeUNGdW5jdGlvbilDRF9kZWxldGVwYXJzZXIsCU1FVEhfVkFSQVJHU30sCi0JeyJwYXJzZWZyYW1lIiwJCShQeUNGdW5jdGlvbilDRF9wYXJzZWZyYW1lLAlNRVRIX1ZBUkFSR1N9LAotCXsicmVtb3ZlY2FsbGJhY2siLAkoUHlDRnVuY3Rpb24pQ0RfcmVtb3ZlY2FsbGJhY2ssCU1FVEhfVkFSQVJHU30sCi0JeyJyZXNldHBhcnNlciIsCQkoUHlDRnVuY3Rpb24pQ0RfcmVzZXRwYXJzZXIsCU1FVEhfVkFSQVJHU30sCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCXsic2V0Y2FsbGJhY2siLAkJKFB5Q0Z1bmN0aW9uKUNEX2FkZGNhbGxiYWNrLCAgIAlNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJCU5VTEx9IAkJLyogc2VudGluZWwgKi8KKyAgICB7ImFkZGNhbGxiYWNrIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2FkZGNhbGxiYWNrLCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZGVsZXRlcGFyc2VyIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfZGVsZXRlcGFyc2VyLCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJwYXJzZWZyYW1lIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9wYXJzZWZyYW1lLCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InJlbW92ZWNhbGxiYWNrIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX3JlbW92ZWNhbGxiYWNrLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicmVzZXRwYXJzZXIiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0RfcmVzZXRwYXJzZXIsICAgIE1FVEhfVkFSQVJHU30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyAgICB7InNldGNhbGxiYWNrIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX2FkZGNhbGxiYWNrLCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyB2b2lkCiBjZHBhcnNlcl9kZWFsbG9jKGNkcGFyc2Vyb2JqZWN0ICpzZWxmKQogewotCWludCBpOworICAgIGludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE5DQUxMQkFDS1M7IGkrKykgewotCQlQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2spOwotCQlzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrID0gTlVMTDsKLQkJUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnKTsKLQkJc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyA9IE5VTEw7Ci0JfQotCUNEZGVsZXRlcGFyc2VyKHNlbGYtPm9iX2NkcGFyc2VyKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgZm9yIChpID0gMDsgaSA8IE5DQUxMQkFDS1M7IGkrKykgeworICAgICAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2spOworICAgICAgICBzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrYXJnKTsKKyAgICAgICAgc2VsZi0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyA9IE5VTEw7CisgICAgfQorICAgIENEZGVsZXRlcGFyc2VyKHNlbGYtPm9iX2NkcGFyc2VyKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjZHBhcnNlcl9nZXRhdHRyKGNkcGFyc2Vyb2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCWlmIChzZWxmLT5vYl9jZHBhcnNlciA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJubyBwYXJzZXIgYWN0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2VsZi0+b2JfY2RwYXJzZXIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibm8gcGFyc2VyIGFjdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChjZHBhcnNlcl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChjZHBhcnNlcl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogUHlUeXBlT2JqZWN0IENkUGFyc2VydHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJLypvYl9zaXplKi8KLQkiY2QuY2RwYXJzZXIiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoY2RwYXJzZXJvYmplY3QpLAkvKnRwX3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWNkcGFyc2VyX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpY2RwYXJzZXJfZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJjZC5jZHBhcnNlciIsICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihjZHBhcnNlcm9iamVjdCksICAgICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpY2RwYXJzZXJfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWNkcGFyc2VyX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3Y2RwYXJzZXJvYmplY3QoQ0RQQVJTRVIgKmNkcCkKIHsKLQljZHBhcnNlcm9iamVjdCAqcDsKLQlpbnQgaTsKKyAgICBjZHBhcnNlcm9iamVjdCAqcDsKKyAgICBpbnQgaTsKIAotCXAgPSBQeU9iamVjdF9OZXcoY2RwYXJzZXJvYmplY3QsICZDZFBhcnNlcnR5cGUpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXAtPm9iX2NkcGFyc2VyID0gY2RwOwotCWZvciAoaSA9IDA7IGkgPCBOQ0FMTEJBQ0tTOyBpKyspIHsKLQkJcC0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFjayA9IE5VTEw7Ci0JCXAtPm9iX2NkY2FsbGJhY2tzW2ldLm9iX2NkY2FsbGJhY2thcmcgPSBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIHA7CisgICAgcCA9IFB5T2JqZWN0X05ldyhjZHBhcnNlcm9iamVjdCwgJkNkUGFyc2VydHlwZSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcC0+b2JfY2RwYXJzZXIgPSBjZHA7CisgICAgZm9yIChpID0gMDsgaSA8IE5DQUxMQkFDS1M7IGkrKykgeworICAgICAgICBwLT5vYl9jZGNhbGxiYWNrc1tpXS5vYl9jZGNhbGxiYWNrID0gTlVMTDsKKyAgICAgICAgcC0+b2JfY2RjYWxsYmFja3NbaV0ub2JfY2RjYWxsYmFja2FyZyA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENEX2NyZWF0ZXBhcnNlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JQ0RQQVJTRVIgKmNkcDsKKyAgICBDRFBBUlNFUiAqY2RwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Y3JlYXRlcGFyc2VyIikpCi0JCXJldHVybiBOVUxMOwotCWNkcCA9IENEY3JlYXRlcGFyc2VyKCk7Ci0JaWYgKGNkcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAiY3JlYXRlcGFyc2VyIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Y3JlYXRlcGFyc2VyIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNkcCA9IENEY3JlYXRlcGFyc2VyKCk7CisgICAgaWYgKGNkcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDZEVycm9yLCAiY3JlYXRlcGFyc2VyIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gbmV3Y2RwYXJzZXJvYmplY3QoY2RwKTsKKyAgICByZXR1cm4gbmV3Y2RwYXJzZXJvYmplY3QoY2RwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIENEX21zZnRvZnJhbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBtaW4sIHNlYywgZnJhbWU7CisgICAgaW50IG1pbiwgc2VjLCBmcmFtZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOm1zZnRvZnJhbWUiLCAmbWluLCAmc2VjLCAmZnJhbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTptc2Z0b2ZyYW1lIiwgJm1pbiwgJnNlYywgJmZyYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEbXNmdG9mcmFtZShtaW4sIHNlYywgZnJhbWUpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEbXNmdG9mcmFtZShtaW4sIHNlYywgZnJhbWUpKTsKIH0KLQkKKwogc3RhdGljIFB5TWV0aG9kRGVmIENEX21ldGhvZHNbXSA9IHsKLQl7Im9wZW4iLAkJKFB5Q0Z1bmN0aW9uKUNEX29wZW4sCQlNRVRIX1ZBUkFSR1N9LAotCXsiY3JlYXRlcGFyc2VyIiwJKFB5Q0Z1bmN0aW9uKUNEX2NyZWF0ZXBhcnNlciwJTUVUSF9WQVJBUkdTfSwKLQl7Im1zZnRvZnJhbWUiLAkJKFB5Q0Z1bmN0aW9uKUNEX21zZnRvZnJhbWUsCU1FVEhfVkFSQVJHU30sCi0Je05VTEwsCQlOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsib3BlbiIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pQ0Rfb3BlbiwgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJjcmVhdGVwYXJzZXIiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilDRF9jcmVhdGVwYXJzZXIsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1zZnRvZnJhbWUiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKUNEX21zZnRvZnJhbWUsICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBTZW50aW5lbCAqLwogfTsKIAogdm9pZAogaW5pdGNkKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygidGhlIGNkIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKLQkgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0JICAgIHJldHVybjsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CiAKLQltID0gUHlfSW5pdE1vZHVsZSgiY2QiLCBDRF9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgY2QgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JQ2RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiY2QuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBDZEVycm9yKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiY2QiLCBDRF9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CiAKLQkvKiBJZGVudGlmaWVycyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBjYWxsYmFja3MgZnJvbSB0aGUgcGFyc2VyICovCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImF1ZGlvIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2F1ZGlvKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInBudW0iLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfcG51bSkpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJpbmRleCIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9pbmRleCkpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJwdGltZSIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9wdGltZSkpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJhdGltZSIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9hdGltZSkpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJjYXRhbG9nIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2NhdGFsb2cpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiaWRlbnQiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfaWRlbnQpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY29udHJvbCIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9jb250cm9sKSk7CisgICAgQ2RFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiY2QuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBDZEVycm9yKTsKIAotCS8qIEJsb2NrIHNpemUgaW5mb3JtYXRpb24gZm9yIGRpZ2l0YWwgYXVkaW8gZGF0YSAqLwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJEQVRBU0laRSIsCi0JCQkgICBQeUludF9Gcm9tTG9uZygobG9uZykgQ0REQV9EQVRBU0laRSkpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCTE9DS1NJWkUiLAotCQkJICAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEREFfQkxPQ0tTSVpFKSk7CisgICAgLyogSWRlbnRpZmllcnMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgY2FsbGJhY2tzIGZyb20gdGhlIHBhcnNlciAqLworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJhdWRpbyIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9hdWRpbykpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJwbnVtIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX3BudW0pKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiaW5kZXgiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfaW5kZXgpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicHRpbWUiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfcHRpbWUpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiYXRpbWUiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfYXRpbWUpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY2F0YWxvZyIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBjZF9jYXRhbG9nKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImlkZW50IiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGNkX2lkZW50KSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNvbnRyb2wiLCBQeUludF9Gcm9tTG9uZygobG9uZykgY2RfY29udHJvbCkpOwogCi0JLyogUG9zc2libGUgc3RhdGVzIGZvciB0aGUgY2QgcGxheWVyICovCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVSUk9SIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX0VSUk9SKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PRElTQyIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRF9OT0RJU0MpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkVBRFkiLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfUkVBRFkpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUExBWUlORyIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRF9QTEFZSU5HKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBBVVNFRCIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRF9QQVVTRUQpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1RJTEwiLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfU1RJTEwpKTsKLSNpZmRlZiBDRF9DRFJPTQkJCS8qIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgKi8KLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0RST00iLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfQ0RST00pKTsKKyAgICAvKiBCbG9jayBzaXplIGluZm9ybWF0aW9uIGZvciBkaWdpdGFsIGF1ZGlvIGRhdGEgKi8KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREFUQVNJWkUiLAorICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZygobG9uZykgQ0REQV9EQVRBU0laRSkpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCTE9DS1NJWkUiLAorICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZygobG9uZykgQ0REQV9CTE9DS1NJWkUpKTsKKworICAgIC8qIFBvc3NpYmxlIHN0YXRlcyBmb3IgdGhlIGNkIHBsYXllciAqLworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFUlJPUiIsIFB5SW50X0Zyb21Mb25nKChsb25nKSBDRF9FUlJPUikpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOT0RJU0MiLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfTk9ESVNDKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJFQURZIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX1JFQURZKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBMQVlJTkciLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfUExBWUlORykpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQQVVTRUQiLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfUEFVU0VEKSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNUSUxMIiwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENEX1NUSUxMKSk7CisjaWZkZWYgQ0RfQ0RST00gICAgICAgICAgICAgICAgIC8qIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnkgKi8KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0RST00iLCBQeUludF9Gcm9tTG9uZygobG9uZykgQ0RfQ0RST00pKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jZ2Vuc3VwcG9ydC5jIGIvTW9kdWxlcy9jZ2Vuc3VwcG9ydC5jCmluZGV4IDdlN2QwZmYuLmFhZDQzYTIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2dlbnN1cHBvcnQuYworKysgYi9Nb2R1bGVzL2NnZW5zdXBwb3J0LmMKQEAgLTEzLDE1OCArMTMsMTU4IEBACiBpbnQKIFB5QXJnX0dldE9iamVjdChyZWdpc3RlciBQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLCBpbnQgaSwgUHlPYmplY3QgKipwX2FyZykKIHsKLQlpZiAobmFyZ3MgIT0gMSkgewotCQlpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpIHx8Ci0JCQkJbmFyZ3MgIT0gUHlUdXBsZV9TaXplKGFyZ3MpIHx8Ci0JCQkJaSA8IDAgfHwgaSA+PSBuYXJncykgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhcmdzID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGkpOwotCQl9Ci0JfQotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JfQotCSpwX2FyZyA9IGFyZ3M7Ci0JcmV0dXJuIDE7CisgICAgaWYgKG5hcmdzICE9IDEpIHsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbmFyZ3MgIT0gUHlUdXBsZV9TaXplKGFyZ3MpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpIDwgMCB8fCBpID49IG5hcmdzKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICB9CisgICAgKnBfYXJnID0gYXJnczsKKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBQeUFyZ19HZXRMb25nKHJlZ2lzdGVyIFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBsb25nICpwX2FyZykKIHsKLQlpZiAobmFyZ3MgIT0gMSkgewotCQlpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpIHx8Ci0JCQkJbmFyZ3MgIT0gUHlUdXBsZV9TaXplKGFyZ3MpIHx8Ci0JCQkJaSA8IDAgfHwgaSA+PSBuYXJncykgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJYXJncyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKTsKLQl9Ci0JaWYgKGFyZ3MgPT0gTlVMTCB8fCAhUHlJbnRfQ2hlY2soYXJncykpIHsKLQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JfQotCSpwX2FyZyA9IFB5SW50X0FzTG9uZyhhcmdzKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAobmFyZ3MgIT0gMSkgeworICAgICAgICBpZiAoYXJncyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGFyZ3MpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBuYXJncyAhPSBQeVR1cGxlX1NpemUoYXJncykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPCAwIHx8IGkgPj0gbmFyZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICB9CisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7CisgICAgfQorICAgIGlmIChhcmdzID09IE5VTEwgfHwgIVB5SW50X0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KKyAgICAqcF9hcmcgPSBQeUludF9Bc0xvbmcoYXJncyk7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludAogUHlBcmdfR2V0U2hvcnQocmVnaXN0ZXIgUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywgaW50IGksIHNob3J0ICpwX2FyZykKIHsKLQlsb25nIHg7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIG5hcmdzLCBpLCAmeCkpCi0JCXJldHVybiAwOwotCSpwX2FyZyA9IChzaG9ydCkgeDsKLQlyZXR1cm4gMTsKKyAgICBsb25nIHg7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIG5hcmdzLCBpLCAmeCkpCisgICAgICAgIHJldHVybiAwOworICAgICpwX2FyZyA9IChzaG9ydCkgeDsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogZXh0cmFjdGRvdWJsZShyZWdpc3RlciBQeU9iamVjdCAqdiwgZG91YmxlICpwX2FyZykKIHsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCS8qIEZhbGwgdGhyb3VnaCB0byBlcnJvciByZXR1cm4gYXQgZW5kIG9mIGZ1bmN0aW9uICovCi0JfQotCWVsc2UgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKLQkJKnBfYXJnID0gUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QgKil2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopdik7Ci0JCXJldHVybiAxOwotCX0KLQllbHNlIGlmIChQeUxvbmdfQ2hlY2sodikpIHsKLQkJKnBfYXJnID0gUHlMb25nX0FzRG91YmxlKHYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gZXJyb3IgcmV0dXJuIGF0IGVuZCBvZiBmdW5jdGlvbiAqLworICAgIH0KKyAgICBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7CisgICAgICAgICpwX2FyZyA9IFB5RmxvYXRfQVNfRE9VQkxFKChQeUZsb2F0T2JqZWN0ICopdik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKXYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKHYpKSB7CisgICAgICAgICpwX2FyZyA9IFB5TG9uZ19Bc0RvdWJsZSh2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwogfQogCiBzdGF0aWMgaW50CiBleHRyYWN0ZmxvYXQocmVnaXN0ZXIgUHlPYmplY3QgKnYsIGZsb2F0ICpwX2FyZykKIHsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCS8qIEZhbGwgdGhyb3VnaCB0byBlcnJvciByZXR1cm4gYXQgZW5kIG9mIGZ1bmN0aW9uICovCi0JfQotCWVsc2UgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKLQkJKnBfYXJnID0gKGZsb2F0KSBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCAqKXYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZSBpZiAoUHlJbnRfQ2hlY2sodikpIHsKLQkJKnBfYXJnID0gKGZsb2F0KSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKXYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IChmbG9hdCkgUHlMb25nX0FzRG91YmxlKHYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAvKiBGYWxsIHRocm91Z2ggdG8gZXJyb3IgcmV0dXJuIGF0IGVuZCBvZiBmdW5jdGlvbiAqLworICAgIH0KKyAgICBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKHYpKSB7CisgICAgICAgICpwX2FyZyA9IChmbG9hdCkgUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QgKil2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICpwX2FyZyA9IChmbG9hdCkgUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKil2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSAoZmxvYXQpIFB5TG9uZ19Bc0RvdWJsZSh2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwogfQogCiBpbnQKIFB5QXJnX0dldEZsb2F0KHJlZ2lzdGVyIFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBmbG9hdCAqcF9hcmcpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JZmxvYXQgeDsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQotCQlyZXR1cm4gMDsKLQlpZiAoIWV4dHJhY3RmbG9hdCh2LCAmeCkpCi0JCXJldHVybiAwOwotCSpwX2FyZyA9IHg7Ci0JcmV0dXJuIDE7CisgICAgUHlPYmplY3QgKnY7CisgICAgZmxvYXQgeDsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIWV4dHJhY3RmbG9hdCh2LCAmeCkpCisgICAgICAgIHJldHVybiAwOworICAgICpwX2FyZyA9IHg7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludAogUHlBcmdfR2V0U3RyaW5nKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBzdHJpbmcgKnBfYXJnKQogewotCVB5T2JqZWN0ICp2OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCi0JCXJldHVybiAwOwotCWlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JfQotCSpwX2FyZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCXJldHVybiAxOworICAgIFB5T2JqZWN0ICp2OworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgfQorICAgICpwX2FyZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgIHJldHVybiAxOwogfQogCiBpbnQKIFB5QXJnX0dldENoYXIoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywgaW50IGksIGNoYXIgKnBfYXJnKQogewotCXN0cmluZyB4OwotCWlmICghUHlBcmdfR2V0U3RyaW5nKGFyZ3MsIG5hcmdzLCBpLCAmeCkpCi0JCXJldHVybiAwOwotCWlmICh4WzBdID09ICdcMCcgfHwgeFsxXSAhPSAnXDAnKSB7Ci0JCS8qIE5vdCBleGFjdGx5IG9uZSBjaGFyICovCi0JCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCX0KLQkqcF9hcmcgPSB4WzBdOwotCXJldHVybiAxOworICAgIHN0cmluZyB4OworICAgIGlmICghUHlBcmdfR2V0U3RyaW5nKGFyZ3MsIG5hcmdzLCBpLCAmeCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICh4WzBdID09ICdcMCcgfHwgeFsxXSAhPSAnXDAnKSB7CisgICAgICAgIC8qIE5vdCBleGFjdGx5IG9uZSBjaGFyICovCisgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgIH0KKyAgICAqcF9hcmcgPSB4WzBdOworICAgIHJldHVybiAxOwogfQogCiBpbnQKIFB5QXJnX0dldExvbmdBcnJheVNpemUoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywgaW50IGksIGxvbmcgKnBfYXJnKQogewotCVB5T2JqZWN0ICp2OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCi0JCXJldHVybiAwOwotCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCSpwX2FyZyA9IFB5VHVwbGVfU2l6ZSh2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJKnBfYXJnID0gUHlMaXN0X1NpemUodik7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCBuYXJncywgaSwgJnYpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICAqcF9hcmcgPSBQeVR1cGxlX1NpemUodik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgICpwX2FyZyA9IFB5TGlzdF9TaXplKHYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CiB9CiAKIGludAogUHlBcmdfR2V0U2hvcnRBcnJheVNpemUoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywgaW50IGksIHNob3J0ICpwX2FyZykKIHsKLQlsb25nIHg7Ci0JaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIG5hcmdzLCBpLCAmeCkpCi0JCXJldHVybiAwOwotCSpwX2FyZyA9IChzaG9ydCkgeDsKLQlyZXR1cm4gMTsKKyAgICBsb25nIHg7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIG5hcmdzLCBpLCAmeCkpCisgICAgICAgIHJldHVybiAwOworICAgICpwX2FyZyA9IChzaG9ydCkgeDsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogWFhYIFRoZSBmb2xsb3dpbmcgZm91ciBhcmUgdG9vIHNpbWlsYXIuICBTaG91bGQgc2hhcmUgbW9yZSBjb2RlLiAqLwpAQCAtMTcyLDEzOSArMTcyLDEzOSBAQAogaW50CiBQeUFyZ19HZXRMb25nQXJyYXkoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywgaW50IGksIGludCBuLCBsb25nICpwX2FyZykKIHsKLQlQeU9iamVjdCAqdiwgKnc7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgbmFyZ3MsIGksICZ2KSkKLQkJcmV0dXJuIDA7Ci0JaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKLQkJaWYgKFB5VHVwbGVfU2l6ZSh2KSAhPSBuKSB7Ci0JCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl3ID0gUHlUdXBsZV9HZXRJdGVtKHYsIGkpOwotCQkJaWYgKCFQeUludF9DaGVjayh3KSkgewotCQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJfQotCQkJcF9hcmdbaV0gPSBQeUludF9Bc0xvbmcodyk7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgaWYgKFB5TGlzdF9DaGVjayh2KSkgewotCQlpZiAoUHlMaXN0X1NpemUodikgIT0gbikgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdyA9IFB5TGlzdF9HZXRJdGVtKHYsIGkpOwotCQkJaWYgKCFQeUludF9DaGVjayh3KSkgewotCQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJfQotCQkJcF9hcmdbaV0gPSBQeUludF9Bc0xvbmcodyk7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQl9CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeVR1cGxlX1NpemUodikgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKKyAgICAgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfYXJnW2ldID0gUHlJbnRfQXNMb25nKHcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxpc3RfQ2hlY2sodikpIHsKKyAgICAgICAgaWYgKFB5TGlzdF9TaXplKHYpICE9IG4pIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHcgPSBQeUxpc3RfR2V0SXRlbSh2LCBpKTsKKyAgICAgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfYXJnW2ldID0gUHlJbnRfQXNMb25nKHcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgfQogfQogCiBpbnQKIFB5QXJnX0dldFNob3J0QXJyYXkoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywgaW50IGksIGludCBuLCBzaG9ydCAqcF9hcmcpCiB7Ci0JUHlPYmplY3QgKnYsICp3OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCi0JCXJldHVybiAwOwotCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCWlmIChQeVR1cGxlX1NpemUodikgIT0gbikgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghUHlJbnRfQ2hlY2sodykpIHsKLQkJCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCX0KLQkJCXBfYXJnW2ldID0gKHNob3J0KSBQeUludF9Bc0xvbmcodyk7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgaWYgKFB5TGlzdF9DaGVjayh2KSkgewotCQlpZiAoUHlMaXN0X1NpemUodikgIT0gbikgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdyA9IFB5TGlzdF9HZXRJdGVtKHYsIGkpOwotCQkJaWYgKCFQeUludF9DaGVjayh3KSkgewotCQkJCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJfQotCQkJcF9hcmdbaV0gPSAoc2hvcnQpIFB5SW50X0FzTG9uZyh3KTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCX0KKyAgICBQeU9iamVjdCAqdiwgKnc7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgbmFyZ3MsIGksICZ2KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKKyAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZSh2KSAhPSBuKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB3ID0gUHlUdXBsZV9HZXRJdGVtKHYsIGkpOworICAgICAgICAgICAgaWYgKCFQeUludF9DaGVjayh3KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9hcmdbaV0gPSAoc2hvcnQpIFB5SW50X0FzTG9uZyh3KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeUxpc3RfU2l6ZSh2KSAhPSBuKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB3ID0gUHlMaXN0X0dldEl0ZW0odiwgaSk7CisgICAgICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHcpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2FyZ1tpXSA9IChzaG9ydCkgUHlJbnRfQXNMb25nKHcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgfQogfQogCiBpbnQKIFB5QXJnX0dldERvdWJsZUFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsIGludCBpLCBpbnQgbiwgZG91YmxlICpwX2FyZykKIHsKLQlQeU9iamVjdCAqdiwgKnc7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgbmFyZ3MsIGksICZ2KSkKLQkJcmV0dXJuIDA7Ci0JaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKLQkJaWYgKFB5VHVwbGVfU2l6ZSh2KSAhPSBuKSB7Ci0JCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl3ID0gUHlUdXBsZV9HZXRJdGVtKHYsIGkpOwotCQkJaWYgKCFleHRyYWN0ZG91YmxlKHcsICZwX2FyZ1tpXSkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgaWYgKFB5TGlzdF9DaGVjayh2KSkgewotCQlpZiAoUHlMaXN0X1NpemUodikgIT0gbikgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdyA9IFB5TGlzdF9HZXRJdGVtKHYsIGkpOwotCQkJaWYgKCFleHRyYWN0ZG91YmxlKHcsICZwX2FyZ1tpXSkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKLQl9CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeVR1cGxlX1NpemUodikgIT0gbikgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKKyAgICAgICAgICAgIGlmICghZXh0cmFjdGRvdWJsZSh3LCAmcF9hcmdbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxpc3RfQ2hlY2sodikpIHsKKyAgICAgICAgaWYgKFB5TGlzdF9TaXplKHYpICE9IG4pIHsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHcgPSBQeUxpc3RfR2V0SXRlbSh2LCBpKTsKKyAgICAgICAgICAgIGlmICghZXh0cmFjdGRvdWJsZSh3LCAmcF9hcmdbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgfQogfQogCiBpbnQKIFB5QXJnX0dldEZsb2F0QXJyYXkoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywgaW50IGksIGludCBuLCBmbG9hdCAqcF9hcmcpCiB7Ci0JUHlPYmplY3QgKnYsICp3OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIG5hcmdzLCBpLCAmdikpCi0JCXJldHVybiAwOwotCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCWlmIChQeVR1cGxlX1NpemUodikgIT0gbikgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdyA9IFB5VHVwbGVfR2V0SXRlbSh2LCBpKTsKLQkJCWlmICghZXh0cmFjdGZsb2F0KHcsICZwX2FyZ1tpXSkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgaWYgKFB5TGlzdF9DaGVjayh2KSkgewotCQlpZiAoUHlMaXN0X1NpemUodikgIT0gbikgewotCQkJcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdyA9IFB5TGlzdF9HZXRJdGVtKHYsIGkpOwotCQkJaWYgKCFleHRyYWN0ZmxvYXQodywgJnBfYXJnW2ldKSkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiBQeUVycl9CYWRBcmd1bWVudCgpOwotCX0KKyAgICBQeU9iamVjdCAqdiwgKnc7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgbmFyZ3MsIGksICZ2KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKKyAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZSh2KSAhPSBuKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB3ID0gUHlUdXBsZV9HZXRJdGVtKHYsIGkpOworICAgICAgICAgICAgaWYgKCFleHRyYWN0ZmxvYXQodywgJnBfYXJnW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeUxpc3RfU2l6ZSh2KSAhPSBuKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB3ID0gUHlMaXN0X0dldEl0ZW0odiwgaSk7CisgICAgICAgICAgICBpZiAoIWV4dHJhY3RmbG9hdCh3LCAmcF9hcmdbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jZ2Vuc3VwcG9ydC5oIGIvTW9kdWxlcy9jZ2Vuc3VwcG9ydC5oCmluZGV4IGJjOTAxZjYuLjI3ZTEyNjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2dlbnN1cHBvcnQuaAorKysgYi9Nb2R1bGVzL2NnZW5zdXBwb3J0LmgKQEAgLTMwLDMzICszMCwzMyBAQAogI2RlZmluZSBnZXRpc3RyaW5nYXJnIFB5QXJnX0dldFN0cmluZwogCiBleHRlcm4gaW50IFB5QXJnX0dldE9iamVjdChQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJICAgaW50IGksIFB5T2JqZWN0ICoqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBQeU9iamVjdCAqKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldExvbmcoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCSBpbnQgaSwgbG9uZyAqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgbG9uZyAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0U2hvcnQoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCSAgaW50IGksIHNob3J0ICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgc2hvcnQgKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldEZsb2F0KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgIGludCBpLCBmbG9hdCAqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGZsb2F0ICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRTdHJpbmcoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCSAgIGludCBpLCBzdHJpbmcgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgc3RyaW5nICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRDaGFyKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgaW50IGksIGNoYXIgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGNoYXIgKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldExvbmdBcnJheShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJICAgIGludCBpLCBpbnQgbiwgbG9uZyAqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IG4sIGxvbmcgKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldFNob3J0QXJyYXkoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCSAgICBpbnQgaSwgaW50IG4sIHNob3J0ICpwX2EpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgbiwgc2hvcnQgKnBfYSk7CiBleHRlcm4gaW50IFB5QXJnX0dldERvdWJsZUFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkJaW50IGksIGludCBuLCBkb3VibGUgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgbiwgZG91YmxlICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRGbG9hdEFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkgICAgICAgaW50IGksIGludCBuLCBmbG9hdCAqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IG4sIGZsb2F0ICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRMb25nQXJyYXlTaXplKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkJICBpbnQgaSwgbG9uZyAqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgbG9uZyAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0U2hvcnRBcnJheVNpemUoUHlPYmplY3QgKmFyZ3MsIGludCBuYXJncywKLQkJCQlpbnQgaSwgc2hvcnQgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBzaG9ydCAqcF9hKTsKIGV4dGVybiBpbnQgUHlBcmdfR2V0RG91YmxlQXJyYXlTaXplKFB5T2JqZWN0ICphcmdzLCBpbnQgbmFyZ3MsCi0JCQkJICAgIGludCBpLCBkb3VibGUgKnBfYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgZG91YmxlICpwX2EpOwogZXh0ZXJuIGludCBQeUFyZ19HZXRGbG9hdEFycmF5U2l6ZShQeU9iamVjdCAqYXJncywgaW50IG5hcmdzLAotCQkJCSAgIGludCBpLCBmbG9hdCAqcF9hKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGZsb2F0ICpwX2EpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfY24uYyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfY24uYwppbmRleCA0NTQyY2U2Li5hYjRlNjU5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2NuLmMKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19jbi5jCkBAIC0xNywyNCArMTcsMjQgQEAKIAogLyogR0JLIGFuZCBHQjIzMTIgbWFwIGRpZmZlcmVudGx5IGluIGZldyBjb2RlcG9pbnRzIHRoYXQgYXJlIGxpc3RlZCBiZWxvdzoKICAqCi0gKgkJZ2IyMzEyCQkJCWdiawotICogQTFBNAkJVSszMEZCIEtBVEFLQU5BIE1JRERMRSBET1QJVSswMEI3IE1JRERMRSBET1QKLSAqIEExQUEJCVUrMjAxNSBIT1JJWk9OVEFMIEJBUgkJVSsyMDE0IEVNIERBU0gKLSAqIEE4NDQJCXVuZGVmaW5lZAkJCVUrMjAxNSBIT1JJWk9OVEFMIEJBUgorICogICAgICAgICAgICAgIGdiMjMxMiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2JrCisgKiBBMUE0ICAgICAgICAgVSszMEZCIEtBVEFLQU5BIE1JRERMRSBET1QgICAgICBVKzAwQjcgTUlERExFIERPVAorICogQTFBQSAgICAgICAgIFUrMjAxNSBIT1JJWk9OVEFMIEJBUiAgICAgICAgICAgVSsyMDE0IEVNIERBU0gKKyAqIEE4NDQgICAgICAgICB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICAgIFUrMjAxNSBIT1JJWk9OVEFMIEJBUgogICovCiAKICNkZWZpbmUgR0JLX0RFQ09ERShkYzEsIGRjMiwgYXNzaSkgXAotCWlmICgoZGMxKSA9PSAweGExICYmIChkYzIpID09IDB4YWEpIChhc3NpKSA9IDB4MjAxNDsgXAotCWVsc2UgaWYgKChkYzEpID09IDB4YTggJiYgKGRjMikgPT0gMHg0NCkgKGFzc2kpID0gMHgyMDE1OyBcCi0JZWxzZSBpZiAoKGRjMSkgPT0gMHhhMSAmJiAoZGMyKSA9PSAweGE0KSAoYXNzaSkgPSAweDAwYjc7IFwKLQllbHNlIFRSWU1BUF9ERUMoZ2IyMzEyLCBhc3NpLCBkYzEgXiAweDgwLCBkYzIgXiAweDgwKTsgXAotCWVsc2UgVFJZTUFQX0RFQyhnYmtleHQsIGFzc2ksIGRjMSwgZGMyKTsKKyAgICBpZiAoKGRjMSkgPT0gMHhhMSAmJiAoZGMyKSA9PSAweGFhKSAoYXNzaSkgPSAweDIwMTQ7IFwKKyAgICBlbHNlIGlmICgoZGMxKSA9PSAweGE4ICYmIChkYzIpID09IDB4NDQpIChhc3NpKSA9IDB4MjAxNTsgXAorICAgIGVsc2UgaWYgKChkYzEpID09IDB4YTEgJiYgKGRjMikgPT0gMHhhNCkgKGFzc2kpID0gMHgwMGI3OyBcCisgICAgZWxzZSBUUllNQVBfREVDKGdiMjMxMiwgYXNzaSwgZGMxIF4gMHg4MCwgZGMyIF4gMHg4MCk7IFwKKyAgICBlbHNlIFRSWU1BUF9ERUMoZ2JrZXh0LCBhc3NpLCBkYzEsIGRjMik7CiAKICNkZWZpbmUgR0JLX0VOQ09ERShjb2RlLCBhc3NpKSBcCi0JaWYgKChjb2RlKSA9PSAweDIwMTQpIChhc3NpKSA9IDB4YTFhYTsgXAotCWVsc2UgaWYgKChjb2RlKSA9PSAweDIwMTUpIChhc3NpKSA9IDB4YTg0NDsgXAotCWVsc2UgaWYgKChjb2RlKSA9PSAweDAwYjcpIChhc3NpKSA9IDB4YTFhNDsgXAotCWVsc2UgaWYgKChjb2RlKSAhPSAweDMwZmIgJiYgVFJZTUFQX0VOQ19DT05EKGdiY29tbW9uLCBhc3NpLCBjb2RlKSk7CisgICAgaWYgKChjb2RlKSA9PSAweDIwMTQpIChhc3NpKSA9IDB4YTFhYTsgXAorICAgIGVsc2UgaWYgKChjb2RlKSA9PSAweDIwMTUpIChhc3NpKSA9IDB4YTg0NDsgXAorICAgIGVsc2UgaWYgKChjb2RlKSA9PSAweDAwYjcpIChhc3NpKSA9IDB4YTFhNDsgXAorICAgIGVsc2UgaWYgKChjb2RlKSAhPSAweDMwZmIgJiYgVFJZTUFQX0VOQ19DT05EKGdiY29tbW9uLCBhc3NpLCBjb2RlKSk7CiAKIC8qCiAgKiBHQjIzMTIgY29kZWMKQEAgLTQyLDUzICs0Miw1MyBAQAogCiBFTkNPREVSKGdiMjMxMikKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQlQeV9VTklDT0RFIGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIFB5X1VOSUNPREUgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCVVDUzRJTlZBTElEKGMpCisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBVQ1M0SU5WQUxJRChjKQogCi0JCVJFUVVJUkVfT1VUQlVGKDIpCi0JCVRSWU1BUF9FTkMoZ2Jjb21tb24sIGNvZGUsIGMpOwotCQllbHNlIHJldHVybiAxOworICAgICAgICBSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBUUllNQVBfRU5DKGdiY29tbW9uLCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMTsKIAotCQlpZiAoY29kZSAmIDB4ODAwMCkgLyogTVNCIHNldDogR0JLICovCi0JCQlyZXR1cm4gMTsKKyAgICAgICAgaWYgKGNvZGUgJiAweDgwMDApIC8qIE1TQiBzZXQ6IEdCSyAqLworICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJT1VUMSgoY29kZSA+PiA4KSB8IDB4ODApCi0JCU9VVDIoKGNvZGUgJiAweEZGKSB8IDB4ODApCi0JCU5FWFQoMSwgMikKLQl9CisgICAgICAgIE9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQorICAgICAgICBPVVQyKChjb2RlICYgMHhGRikgfCAweDgwKQorICAgICAgICBORVhUKDEsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoZ2IyMzEyKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9ICoqaW5idWY7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gKippbmJ1ZjsKIAotCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJT1VUMShjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBPVVQxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfSU5CVUYoMikKLQkJVFJZTUFQX0RFQyhnYjIzMTIsICoqb3V0YnVmLCBjIF4gMHg4MCwgSU4yIF4gMHg4MCkgewotCQkJTkVYVCgyLCAxKQotCQl9Ci0JCWVsc2UgcmV0dXJuIDI7Ci0JfQorICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIFRSWU1BUF9ERUMoZ2IyMzEyLCAqKm91dGJ1ZiwgYyBeIDB4ODAsIElOMiBeIDB4ODApIHsKKyAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgfQorICAgICAgICBlbHNlIHJldHVybiAyOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTk4LDU1ICs5OCw1NSBAQAogCiBFTkNPREVSKGdiaykKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQlQeV9VTklDT0RFIGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIFB5X1VOSUNPREUgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCVVDUzRJTlZBTElEKGMpCisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBVQ1M0SU5WQUxJRChjKQogCi0JCVJFUVVJUkVfT1VUQlVGKDIpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDIpCiAKLQkJR0JLX0VOQ09ERShjLCBjb2RlKQotCQllbHNlIHJldHVybiAxOworICAgICAgICBHQktfRU5DT0RFKGMsIGNvZGUpCisgICAgICAgIGVsc2UgcmV0dXJuIDE7CiAKLQkJT1VUMSgoY29kZSA+PiA4KSB8IDB4ODApCi0JCWlmIChjb2RlICYgMHg4MDAwKQotCQkJT1VUMigoY29kZSAmIDB4RkYpKSAvKiBNU0Igc2V0OiBHQksgKi8KLQkJZWxzZQotCQkJT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkgLyogTVNCIHVuc2V0OiBHQjIzMTIgKi8KLQkJTkVYVCgxLCAyKQotCX0KKyAgICAgICAgT1VUMSgoY29kZSA+PiA4KSB8IDB4ODApCisgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKQorICAgICAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpKSAvKiBNU0Igc2V0OiBHQksgKi8KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkgLyogTVNCIHVuc2V0OiBHQjIzMTIgKi8KKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGdiaykKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlPVVQxKGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIE9VVDEoYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJUkVRVUlSRV9JTkJVRigyKQorICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCiAKLQkJR0JLX0RFQ09ERShjLCBJTjIsICoqb3V0YnVmKQotCQllbHNlIHJldHVybiAyOworICAgICAgICBHQktfREVDT0RFKGMsIElOMiwgKipvdXRidWYpCisgICAgICAgIGVsc2UgcmV0dXJuIDI7CiAKLQkJTkVYVCgyLCAxKQotCX0KKyAgICAgICAgTkVYVCgyLCAxKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTE1NiwxNTMgKzE1NiwxNTMgQEAKIAogRU5DT0RFUihnYjE4MDMwKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVjczRfdCBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1Y3M0X3QgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlXUklURTEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgV1JJVEUxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCURFQ09ERV9TVVJST0dBVEUoYykKLQkJaWYgKGMgPiAweDEwRkZGRikKKyAgICAgICAgREVDT0RFX1NVUlJPR0FURShjKQorICAgICAgICBpZiAoYyA+IDB4MTBGRkZGKQogI2lmIFB5X1VOSUNPREVfU0laRSA9PSAyCi0JCQlyZXR1cm4gMjsgLyogc3Vycm9nYXRlcyBwYWlyICovCisgICAgICAgICAgICByZXR1cm4gMjsgLyogc3Vycm9nYXRlcyBwYWlyICovCiAjZWxzZQotCQkJcmV0dXJuIDE7CisgICAgICAgICAgICByZXR1cm4gMTsKICNlbmRpZgotCQllbHNlIGlmIChjID49IDB4MTAwMDApIHsKLQkJCXVjczRfdCB0YyA9IGMgLSAweDEwMDAwOworICAgICAgICBlbHNlIGlmIChjID49IDB4MTAwMDApIHsKKyAgICAgICAgICAgIHVjczRfdCB0YyA9IGMgLSAweDEwMDAwOwogCi0JCQlSRVFVSVJFX09VVEJVRig0KQorICAgICAgICAgICAgUkVRVUlSRV9PVVRCVUYoNCkKIAotCQkJT1VUNCgodW5zaWduZWQgY2hhcikodGMgJSAxMCkgKyAweDMwKQotCQkJdGMgLz0gMTA7Ci0JCQlPVVQzKCh1bnNpZ25lZCBjaGFyKSh0YyAlIDEyNikgKyAweDgxKQotCQkJdGMgLz0gMTI2OwotCQkJT1VUMigodW5zaWduZWQgY2hhcikodGMgJSAxMCkgKyAweDMwKQotCQkJdGMgLz0gMTA7Ci0JCQlPVVQxKCh1bnNpZ25lZCBjaGFyKSh0YyArIDB4OTApKQorICAgICAgICAgICAgT1VUNCgodW5zaWduZWQgY2hhcikodGMgJSAxMCkgKyAweDMwKQorICAgICAgICAgICAgdGMgLz0gMTA7CisgICAgICAgICAgICBPVVQzKCh1bnNpZ25lZCBjaGFyKSh0YyAlIDEyNikgKyAweDgxKQorICAgICAgICAgICAgdGMgLz0gMTI2OworICAgICAgICAgICAgT1VUMigodW5zaWduZWQgY2hhcikodGMgJSAxMCkgKyAweDMwKQorICAgICAgICAgICAgdGMgLz0gMTA7CisgICAgICAgICAgICBPVVQxKCh1bnNpZ25lZCBjaGFyKSh0YyArIDB4OTApKQogCiAjaWYgUHlfVU5JQ09ERV9TSVpFID09IDIKLQkJCU5FWFQoMiwgNCkgLyogc3Vycm9nYXRlcyBwYWlyICovCisgICAgICAgICAgICBORVhUKDIsIDQpIC8qIHN1cnJvZ2F0ZXMgcGFpciAqLwogI2Vsc2UKLQkJCU5FWFQoMSwgNCkKKyAgICAgICAgICAgIE5FWFQoMSwgNCkKICNlbmRpZgotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJUkVRVUlSRV9PVVRCVUYoMikKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMikKIAotCQlHQktfRU5DT0RFKGMsIGNvZGUpCi0JCWVsc2UgVFJZTUFQX0VOQyhnYjE4MDMwZXh0LCBjb2RlLCBjKTsKLQkJZWxzZSB7Ci0JCQljb25zdCBzdHJ1Y3QgX2diMTgwMzBfdG9fdW5pYm1wX3JhbmdlcyAqdXRycmFuZ2U7CisgICAgICAgIEdCS19FTkNPREUoYywgY29kZSkKKyAgICAgICAgZWxzZSBUUllNQVBfRU5DKGdiMTgwMzBleHQsIGNvZGUsIGMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfZ2IxODAzMF90b191bmlibXBfcmFuZ2VzICp1dHJyYW5nZTsKIAotCQkJUkVRVUlSRV9PVVRCVUYoNCkKKyAgICAgICAgICAgIFJFUVVJUkVfT1VUQlVGKDQpCiAKLQkJCWZvciAodXRycmFuZ2UgPSBnYjE4MDMwX3RvX3VuaWJtcF9yYW5nZXM7Ci0JCQkgICAgIHV0cnJhbmdlLT5maXJzdCAhPSAwOwotCQkJICAgICB1dHJyYW5nZSsrKQotCQkJCWlmICh1dHJyYW5nZS0+Zmlyc3QgPD0gYyAmJgotCQkJCSAgICBjIDw9IHV0cnJhbmdlLT5sYXN0KSB7Ci0JCQkJCVB5X1VOSUNPREUgdGM7CisgICAgICAgICAgICBmb3IgKHV0cnJhbmdlID0gZ2IxODAzMF90b191bmlibXBfcmFuZ2VzOworICAgICAgICAgICAgICAgICB1dHJyYW5nZS0+Zmlyc3QgIT0gMDsKKyAgICAgICAgICAgICAgICAgdXRycmFuZ2UrKykKKyAgICAgICAgICAgICAgICBpZiAodXRycmFuZ2UtPmZpcnN0IDw9IGMgJiYKKyAgICAgICAgICAgICAgICAgICAgYyA8PSB1dHJyYW5nZS0+bGFzdCkgeworICAgICAgICAgICAgICAgICAgICBQeV9VTklDT0RFIHRjOwogCi0JCQkJCXRjID0gYyAtIHV0cnJhbmdlLT5maXJzdCArCi0JCQkJCSAgICAgdXRycmFuZ2UtPmJhc2U7CisgICAgICAgICAgICAgICAgICAgIHRjID0gYyAtIHV0cnJhbmdlLT5maXJzdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRycmFuZ2UtPmJhc2U7CiAKLQkJCQkJT1VUNCgodW5zaWduZWQgY2hhcikodGMgJSAxMCkgKyAweDMwKQotCQkJCQl0YyAvPSAxMDsKLQkJCQkJT1VUMygodW5zaWduZWQgY2hhcikodGMgJSAxMjYpICsgMHg4MSkKLQkJCQkJdGMgLz0gMTI2OwotCQkJCQlPVVQyKCh1bnNpZ25lZCBjaGFyKSh0YyAlIDEwKSArIDB4MzApCi0JCQkJCXRjIC89IDEwOwotCQkJCQlPVVQxKCh1bnNpZ25lZCBjaGFyKXRjICsgMHg4MSkKKyAgICAgICAgICAgICAgICAgICAgT1VUNCgodW5zaWduZWQgY2hhcikodGMgJSAxMCkgKyAweDMwKQorICAgICAgICAgICAgICAgICAgICB0YyAvPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgT1VUMygodW5zaWduZWQgY2hhcikodGMgJSAxMjYpICsgMHg4MSkKKyAgICAgICAgICAgICAgICAgICAgdGMgLz0gMTI2OworICAgICAgICAgICAgICAgICAgICBPVVQyKCh1bnNpZ25lZCBjaGFyKSh0YyAlIDEwKSArIDB4MzApCisgICAgICAgICAgICAgICAgICAgIHRjIC89IDEwOworICAgICAgICAgICAgICAgICAgICBPVVQxKCh1bnNpZ25lZCBjaGFyKXRjICsgMHg4MSkKIAotCQkJCQlORVhUKDEsIDQpCi0JCQkJCWJyZWFrOwotCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgTkVYVCgxLCA0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCWlmICh1dHJyYW5nZS0+Zmlyc3QgPT0gMCkKLQkJCQlyZXR1cm4gMTsKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgICAgICBpZiAodXRycmFuZ2UtPmZpcnN0ID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCU9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQotCQlpZiAoY29kZSAmIDB4ODAwMCkKLQkJCU9VVDIoKGNvZGUgJiAweEZGKSkgLyogTVNCIHNldDogR0JLIG9yIEdCMTgwMzBleHQgKi8KLQkJZWxzZQotCQkJT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkgLyogTVNCIHVuc2V0OiBHQjIzMTIgKi8KKyAgICAgICAgT1VUMSgoY29kZSA+PiA4KSB8IDB4ODApCisgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKQorICAgICAgICAgICAgT1VUMigoY29kZSAmIDB4RkYpKSAvKiBNU0Igc2V0OiBHQksgb3IgR0IxODAzMGV4dCAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBPVVQyKChjb2RlICYgMHhGRikgfCAweDgwKSAvKiBNU0IgdW5zZXQ6IEdCMjMxMiAqLwogCi0JCU5FWFQoMSwgMikKLQl9CisgICAgICAgIE5FWFQoMSwgMikKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUihnYjE4MDMwKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMSwgYzI7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xLCBjMjsKIAotCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJT1VUMShjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBPVVQxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQogCi0JCWMyID0gSU4yOwotCQlpZiAoYzIgPj0gMHgzMCAmJiBjMiA8PSAweDM5KSB7IC8qIDQgYnl0ZXMgc2VxICovCi0JCQljb25zdCBzdHJ1Y3QgX2diMTgwMzBfdG9fdW5pYm1wX3JhbmdlcyAqdXRyOwotCQkJdW5zaWduZWQgY2hhciBjMywgYzQ7Ci0JCQl1Y3M0X3QgbHNlcTsKKyAgICAgICAgYzIgPSBJTjI7CisgICAgICAgIGlmIChjMiA+PSAweDMwICYmIGMyIDw9IDB4MzkpIHsgLyogNCBieXRlcyBzZXEgKi8KKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfZ2IxODAzMF90b191bmlibXBfcmFuZ2VzICp1dHI7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMzLCBjNDsKKyAgICAgICAgICAgIHVjczRfdCBsc2VxOwogCi0JCQlSRVFVSVJFX0lOQlVGKDQpCi0JCQljMyA9IElOMzsKLQkJCWM0ID0gSU40OwotCQkJaWYgKGMgPCAweDgxIHx8IGMzIDwgMHg4MSB8fCBjNCA8IDB4MzAgfHwgYzQgPiAweDM5KQotCQkJCXJldHVybiA0OwotCQkJYyAtPSAweDgxOyAgYzIgLT0gMHgzMDsKLQkJCWMzIC09IDB4ODE7IGM0IC09IDB4MzA7CisgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDQpCisgICAgICAgICAgICBjMyA9IElOMzsKKyAgICAgICAgICAgIGM0ID0gSU40OworICAgICAgICAgICAgaWYgKGMgPCAweDgxIHx8IGMzIDwgMHg4MSB8fCBjNCA8IDB4MzAgfHwgYzQgPiAweDM5KQorICAgICAgICAgICAgICAgIHJldHVybiA0OworICAgICAgICAgICAgYyAtPSAweDgxOyAgYzIgLT0gMHgzMDsKKyAgICAgICAgICAgIGMzIC09IDB4ODE7IGM0IC09IDB4MzA7CiAKLQkJCWlmIChjIDwgNCkgeyAvKiBVKzAwODAgLSBVK0ZGRkYgKi8KLQkJCQlsc2VxID0gKCh1Y3M0X3QpYyAqIDEwICsgYzIpICogMTI2MCArCi0JCQkJCSh1Y3M0X3QpYzMgKiAxMCArIGM0OwotCQkJCWlmIChsc2VxIDwgMzk0MjApIHsKLQkJCQkJZm9yICh1dHIgPSBnYjE4MDMwX3RvX3VuaWJtcF9yYW5nZXM7Ci0JCQkJCSAgICAgbHNlcSA+PSAodXRyICsgMSktPmJhc2U7Ci0JCQkJCSAgICAgdXRyKyspIDsKLQkJCQkJT1VUMSh1dHItPmZpcnN0IC0gdXRyLT5iYXNlICsgbHNlcSkKLQkJCQkJTkVYVCg0LCAxKQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjID49IDE1KSB7IC8qIFUrMTAwMDAgLSBVKzEwRkZGRiAqLwotCQkJCWxzZXEgPSAweDEwMDAwICsgKCgodWNzNF90KWMtMTUpICogMTAgKyBjMikKLQkJCQkJKiAxMjYwICsgKHVjczRfdCljMyAqIDEwICsgYzQ7Ci0JCQkJaWYgKGxzZXEgPD0gMHgxMEZGRkYpIHsKLQkJCQkJV1JJVEVVQ1M0KGxzZXEpOwotCQkJCQlORVhUX0lOKDQpCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiA0OwotCQl9CisgICAgICAgICAgICBpZiAoYyA8IDQpIHsgLyogVSswMDgwIC0gVStGRkZGICovCisgICAgICAgICAgICAgICAgbHNlcSA9ICgodWNzNF90KWMgKiAxMCArIGMyKSAqIDEyNjAgKworICAgICAgICAgICAgICAgICAgICAodWNzNF90KWMzICogMTAgKyBjNDsKKyAgICAgICAgICAgICAgICBpZiAobHNlcSA8IDM5NDIwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAodXRyID0gZ2IxODAzMF90b191bmlibXBfcmFuZ2VzOworICAgICAgICAgICAgICAgICAgICAgICAgIGxzZXEgPj0gKHV0ciArIDEpLT5iYXNlOworICAgICAgICAgICAgICAgICAgICAgICAgIHV0cisrKSA7CisgICAgICAgICAgICAgICAgICAgIE9VVDEodXRyLT5maXJzdCAtIHV0ci0+YmFzZSArIGxzZXEpCisgICAgICAgICAgICAgICAgICAgIE5FWFQoNCwgMSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAxNSkgeyAvKiBVKzEwMDAwIC0gVSsxMEZGRkYgKi8KKyAgICAgICAgICAgICAgICBsc2VxID0gMHgxMDAwMCArICgoKHVjczRfdCljLTE1KSAqIDEwICsgYzIpCisgICAgICAgICAgICAgICAgICAgICogMTI2MCArICh1Y3M0X3QpYzMgKiAxMCArIGM0OworICAgICAgICAgICAgICAgIGlmIChsc2VxIDw9IDB4MTBGRkZGKSB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFVUNTNChsc2VxKTsKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9JTig0KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gNDsKKyAgICAgICAgfQogCi0JCUdCS19ERUNPREUoYywgYzIsICoqb3V0YnVmKQotCQllbHNlIFRSWU1BUF9ERUMoZ2IxODAzMGV4dCwgKipvdXRidWYsIGMsIGMyKTsKLQkJZWxzZSByZXR1cm4gMjsKKyAgICAgICAgR0JLX0RFQ09ERShjLCBjMiwgKipvdXRidWYpCisgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhnYjE4MDMwZXh0LCAqKm91dGJ1ZiwgYywgYzIpOworICAgICAgICBlbHNlIHJldHVybiAyOwogCi0JCU5FWFQoMiwgMSkKLQl9CisgICAgICAgIE5FWFQoMiwgMSkKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0zMTIsMTE4ICszMTIsMTE4IEBACiAKIEVOQ09ERVJfSU5JVChoeikKIHsKLQlzdGF0ZS0+aSA9IDA7Ci0JcmV0dXJuIDA7CisgICAgc3RhdGUtPmkgPSAwOworICAgIHJldHVybiAwOwogfQogCiBFTkNPREVSX1JFU0VUKGh6KQogewotCWlmIChzdGF0ZS0+aSAhPSAwKSB7Ci0JCVdSSVRFMignficsICd9JykKLQkJc3RhdGUtPmkgPSAwOwotCQlORVhUX09VVCgyKQotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoc3RhdGUtPmkgIT0gMCkgeworICAgICAgICBXUklURTIoJ34nLCAnfScpCisgICAgICAgIHN0YXRlLT5pID0gMDsKKyAgICAgICAgTkVYVF9PVVQoMikKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIEVOQ09ERVIoaHopCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJaWYgKHN0YXRlLT5pID09IDApIHsKLQkJCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKLQkJCQlORVhUKDEsIDEpCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlXUklURTMoJ34nLCAnfScsICh1bnNpZ25lZCBjaGFyKWMpCi0JCQkJTkVYVCgxLCAzKQotCQkJCXN0YXRlLT5pID0gMDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgaWYgKHN0YXRlLT5pID09IDApIHsKKyAgICAgICAgICAgICAgICBXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKKyAgICAgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBXUklURTMoJ34nLCAnfScsICh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICAgICAgTkVYVCgxLCAzKQorICAgICAgICAgICAgICAgIHN0YXRlLT5pID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLQkJVUNTNElOVkFMSUQoYykKKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlUUllNQVBfRU5DKGdiY29tbW9uLCBjb2RlLCBjKTsKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgVFJZTUFQX0VOQyhnYmNvbW1vbiwgY29kZSwgYyk7CisgICAgICAgIGVsc2UgcmV0dXJuIDE7CiAKLQkJaWYgKGNvZGUgJiAweDgwMDApIC8qIE1TQiBzZXQ6IEdCSyAqLwotCQkJcmV0dXJuIDE7CisgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKSAvKiBNU0Igc2V0OiBHQksgKi8KKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCWlmIChzdGF0ZS0+aSA9PSAwKSB7Ci0JCQlXUklURTQoJ34nLCAneycsIGNvZGUgPj4gOCwgY29kZSAmIDB4ZmYpCi0JCQlORVhUKDEsIDQpCi0JCQlzdGF0ZS0+aSA9IDE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlXUklURTIoY29kZSA+PiA4LCBjb2RlICYgMHhmZikKLQkJCU5FWFQoMSwgMikKLQkJfQotCX0KKyAgICAgICAgaWYgKHN0YXRlLT5pID09IDApIHsKKyAgICAgICAgICAgIFdSSVRFNCgnficsICd7JywgY29kZSA+PiA4LCBjb2RlICYgMHhmZikKKyAgICAgICAgICAgIE5FWFQoMSwgNCkKKyAgICAgICAgICAgIHN0YXRlLT5pID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFdSSVRFMihjb2RlID4+IDgsIGNvZGUgJiAweGZmKQorICAgICAgICAgICAgTkVYVCgxLCAyKQorICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVJfSU5JVChoeikKIHsKLQlzdGF0ZS0+aSA9IDA7Ci0JcmV0dXJuIDA7CisgICAgc3RhdGUtPmkgPSAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSX1JFU0VUKGh6KQogewotCXN0YXRlLT5pID0gMDsKLQlyZXR1cm4gMDsKKyAgICBzdGF0ZS0+aSA9IDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoaHopCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKIAotCQlpZiAoYyA9PSAnficpIHsKLQkJCXVuc2lnbmVkIGNoYXIgYzIgPSBJTjI7CisgICAgICAgIGlmIChjID09ICd+JykgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjMiA9IElOMjsKIAotCQkJUkVRVUlSRV9JTkJVRigyKQotCQkJaWYgKGMyID09ICd+JykgewotCQkJCVdSSVRFMSgnficpCi0JCQkJTkVYVCgyLCAxKQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBpZiAoYzIgPT0gJ3snICYmIHN0YXRlLT5pID09IDApCi0JCQkJc3RhdGUtPmkgPSAxOyAvKiBzZXQgR0IgKi8KLQkJCWVsc2UgaWYgKGMyID09ICd9JyAmJiBzdGF0ZS0+aSA9PSAxKQotCQkJCXN0YXRlLT5pID0gMDsgLyogc2V0IEFTQ0lJICovCi0JCQllbHNlIGlmIChjMiA9PSAnXG4nKQotCQkJCTsgLyogbGluZS1jb250aW51YXRpb24gKi8KLQkJCWVsc2UKLQkJCQlyZXR1cm4gMjsKLQkJCU5FWFQoMiwgMCk7Ci0JCQljb250aW51ZTsKLQkJfQorICAgICAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICAgICAgaWYgKGMyID09ICd+JykgeworICAgICAgICAgICAgICAgIFdSSVRFMSgnficpCisgICAgICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYzIgPT0gJ3snICYmIHN0YXRlLT5pID09IDApCisgICAgICAgICAgICAgICAgc3RhdGUtPmkgPSAxOyAvKiBzZXQgR0IgKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKGMyID09ICd9JyAmJiBzdGF0ZS0+aSA9PSAxKQorICAgICAgICAgICAgICAgIHN0YXRlLT5pID0gMDsgLyogc2V0IEFTQ0lJICovCisgICAgICAgICAgICBlbHNlIGlmIChjMiA9PSAnXG4nKQorICAgICAgICAgICAgICAgIDsgLyogbGluZS1jb250aW51YXRpb24gKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgIE5FWFQoMiwgMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCWlmIChjICYgMHg4MCkKLQkJCXJldHVybiAxOworICAgICAgICBpZiAoYyAmIDB4ODApCisgICAgICAgICAgICByZXR1cm4gMTsKIAotCQlpZiAoc3RhdGUtPmkgPT0gMCkgeyAvKiBBU0NJSSBtb2RlICovCi0JCQlXUklURTEoYykKLQkJCU5FWFQoMSwgMSkKLQkJfQotCQllbHNlIHsgLyogR0IgbW9kZSAqLwotCQkJUkVRVUlSRV9JTkJVRigyKQotCQkJUkVRVUlSRV9PVVRCVUYoMSkKLQkJCVRSWU1BUF9ERUMoZ2IyMzEyLCAqKm91dGJ1ZiwgYywgSU4yKSB7Ci0JCQkJTkVYVCgyLCAxKQotCQkJfQotCQkJZWxzZQotCQkJCXJldHVybiAyOwotCQl9Ci0JfQorICAgICAgICBpZiAoc3RhdGUtPmkgPT0gMCkgeyAvKiBBU0NJSSBtb2RlICovCisgICAgICAgICAgICBXUklURTEoYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLyogR0IgbW9kZSAqLworICAgICAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgICAgIFRSWU1BUF9ERUMoZ2IyMzEyLCAqKm91dGJ1ZiwgYywgSU4yKSB7CisgICAgICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19oay5jIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19oay5jCmluZGV4IDRiYmQ2MjIuLmFhZjEwM2QgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfaGsuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2hrLmMKQEAgLTE4LDEyICsxOCwxMiBAQAogCiBDT0RFQ19JTklUKGJpZzVoa3NjcykKIHsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAotCWlmICghaW5pdGlhbGl6ZWQgJiYgSU1QT1JUX01BUCh0dywgYmlnNSwgJmJpZzVfZW5jbWFwLCAmYmlnNV9kZWNtYXApKQotCQlyZXR1cm4gLTE7Ci0JaW5pdGlhbGl6ZWQgPSAxOwotCXJldHVybiAwOworICAgIGlmICghaW5pdGlhbGl6ZWQgJiYgSU1QT1JUX01BUCh0dywgYmlnNSwgJmJpZzVfZW5jbWFwLCAmYmlnNV9kZWNtYXApKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIHJldHVybiAwOwogfQogCiAvKgpAQCAtMzgsMTM1ICszOCwxMzUgQEAKIAogRU5DT0RFUihiaWc1aGtzY3MpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdWNzNF90IGMgPSAqKmluYnVmOwotCQlEQkNIQVIgY29kZTsKLQkJUHlfc3NpemVfdCBpbnNpemU7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdWNzNF90IGMgPSAqKmluYnVmOworICAgICAgICBEQkNIQVIgY29kZTsKKyAgICAgICAgUHlfc3NpemVfdCBpbnNpemU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlSRVFVSVJFX09VVEJVRigxKQotCQkJKipvdXRidWYgPSAodW5zaWduZWQgY2hhciljOwotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBSRVFVSVJFX09VVEJVRigxKQorICAgICAgICAgICAgKipvdXRidWYgPSAodW5zaWduZWQgY2hhciljOworICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlERUNPREVfU1VSUk9HQVRFKGMpCi0JCWluc2l6ZSA9IEdFVF9JTlNJWkUoYyk7CisgICAgICAgIERFQ09ERV9TVVJST0dBVEUoYykKKyAgICAgICAgaW5zaXplID0gR0VUX0lOU0laRShjKTsKIAotCQlSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBSRVFVSVJFX09VVEJVRigyKQogCi0JCWlmIChjIDwgMHgxMDAwMCkgewotCQkJVFJZTUFQX0VOQyhiaWc1aGtzY3NfYm1wLCBjb2RlLCBjKSB7Ci0JCQkJaWYgKGNvZGUgPT0gTVVMVElDKSB7Ci0JCQkJCWlmIChpbmxlZnQgPj0gMiAmJgotCQkJCQkgICAgKChjICYgMHhmZmRmKSA9PSAweDAwY2EpICYmCi0JCQkJCSAgICAoKCgqaW5idWYpWzFdICYgMHhmZmY3KSA9PSAweDAzMDQpKSB7Ci0JCQkJCQljb2RlID0gYmlnNWhrc2NzX3BhaXJlbmNfdGFibGVbCi0JCQkJCQkJKChjID4+IDQpIHwKLQkJCQkJCQkgKCgqaW5idWYpWzFdID4+IDMpKSAmIDNdOwotCQkJCQkJaW5zaXplID0gMjsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpbmxlZnQgPCAyICYmCi0JCQkJCQkgIShmbGFncyAmIE1CRU5DX0ZMVVNIKSkKLQkJCQkJCXJldHVybiBNQkVSUl9UT09GRVc7Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGMgPT0gMHhjYSkKLQkJCQkJCQljb2RlID0gMHg4ODY2OwotCQkJCQkJZWxzZSAvKiBjID09IDB4ZWEgKi8KLQkJCQkJCQljb2RlID0gMHg4OGE3OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBUUllNQVBfRU5DKGJpZzUsIGNvZGUsIGMpOwotCQkJZWxzZSByZXR1cm4gMTsKLQkJfQotCQllbHNlIGlmIChjIDwgMHgyMDAwMCkKLQkJCXJldHVybiBpbnNpemU7Ci0JCWVsc2UgaWYgKGMgPCAweDMwMDAwKSB7Ci0JCQlUUllNQVBfRU5DKGJpZzVoa3Njc19ub25ibXAsIGNvZGUsIGMgJiAweGZmZmYpOwotCQkJZWxzZSByZXR1cm4gaW5zaXplOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBpbnNpemU7CisgICAgICAgIGlmIChjIDwgMHgxMDAwMCkgeworICAgICAgICAgICAgVFJZTUFQX0VOQyhiaWc1aGtzY3NfYm1wLCBjb2RlLCBjKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gTVVMVElDKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmxlZnQgPj0gMiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChjICYgMHhmZmRmKSA9PSAweDAwY2EpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKCgqaW5idWYpWzFdICYgMHhmZmY3KSA9PSAweDAzMDQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gYmlnNWhrc2NzX3BhaXJlbmNfdGFibGVbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjID4+IDQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgqaW5idWYpWzFdID4+IDMpKSAmIDNdOworICAgICAgICAgICAgICAgICAgICAgICAgaW5zaXplID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmxlZnQgPCAyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZmxhZ3MgJiBNQkVOQ19GTFVTSCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTUJFUlJfVE9PRkVXOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09IDB4Y2EpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IDB4ODg2NjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogYyA9PSAweGVhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IDB4ODhhNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhiaWc1LCBjb2RlLCBjKTsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA8IDB4MjAwMDApCisgICAgICAgICAgICByZXR1cm4gaW5zaXplOworICAgICAgICBlbHNlIGlmIChjIDwgMHgzMDAwMCkgeworICAgICAgICAgICAgVFJZTUFQX0VOQyhiaWc1aGtzY3Nfbm9uYm1wLCBjb2RlLCBjICYgMHhmZmZmKTsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIGluc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gaW5zaXplOwogCi0JCU9VVDEoY29kZSA+PiA4KQotCQlPVVQyKGNvZGUgJiAweEZGKQotCQlORVhUKGluc2l6ZSwgMikKLQl9CisgICAgICAgIE9VVDEoY29kZSA+PiA4KQorICAgICAgICBPVVQyKGNvZGUgJiAweEZGKQorICAgICAgICBORVhUKGluc2l6ZSwgMikKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogI2RlZmluZSBCSDJTKGMxLCBjMikgKCgoYzEpIC0gMHg4NykgKiAoMHhmZSAtIDB4NDAgKyAxKSArICgoYzIpIC0gMHg0MCkpCiAKIERFQ09ERVIoYmlnNWhrc2NzKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKLQkJdWNzNF90IGRlY29kZWQ7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xOworICAgICAgICB1Y3M0X3QgZGVjb2RlZDsKIAotCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJT1VUMShjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBPVVQxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQogCi0JCWlmICgweGM2IDw9IGMgJiYgYyA8PSAweGM4ICYmIChjID49IDB4YzcgfHwgSU4yID49IDB4YTEpKQotCQkJZ290byBoa3Njc2RlYzsKKyAgICAgICAgaWYgKDB4YzYgPD0gYyAmJiBjIDw9IDB4YzggJiYgKGMgPj0gMHhjNyB8fCBJTjIgPj0gMHhhMSkpCisgICAgICAgICAgICBnb3RvIGhrc2NzZGVjOwogCi0JCVRSWU1BUF9ERUMoYmlnNSwgKipvdXRidWYsIGMsIElOMikgewotCQkJTkVYVCgyLCAxKQotCQl9Ci0JCWVsc2UKLWhrc2NzZGVjOglUUllNQVBfREVDKGJpZzVoa3NjcywgZGVjb2RlZCwgYywgSU4yKSB7Ci0JCQlpbnQgcyA9IEJIMlMoYywgSU4yKTsKLQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmhpbnRiYXNlOworICAgICAgICBUUllNQVBfREVDKGJpZzUsICoqb3V0YnVmLCBjLCBJTjIpIHsKKyAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgfQorICAgICAgICBlbHNlCitoa3Njc2RlYzogICAgICAgVFJZTUFQX0RFQyhiaWc1aGtzY3MsIGRlY29kZWQsIGMsIElOMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHMgPSBCSDJTKGMsIElOMik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpoaW50YmFzZTsKIAotCQkJYXNzZXJ0KDB4ODcgPD0gYyAmJiBjIDw9IDB4ZmUpOwotCQkJYXNzZXJ0KDB4NDAgPD0gSU4yICYmIElOMiA8PSAweGZlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCgweDg3IDw9IGMgJiYgYyA8PSAweGZlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCgweDQwIDw9IElOMiAmJiBJTjIgPD0gMHhmZSk7CiAKLQkJCWlmIChCSDJTKDB4ODcsIDB4NDApIDw9IHMgJiYgcyA8PSBCSDJTKDB4YTAsIDB4ZmUpKSB7Ci0JCQkJaGludGJhc2UgPSBiaWc1aGtzY3NfcGhpbnRfMDsKLQkJCQlzIC09IEJIMlMoMHg4NywgMHg0MCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChCSDJTKDB4YzYsMHhhMSkgPD0gcyAmJiBzIDw9IEJIMlMoMHhjOCwweGZlKSl7Ci0JCQkJaGludGJhc2UgPSBiaWc1aGtzY3NfcGhpbnRfMTIxMzA7Ci0JCQkJcyAtPSBCSDJTKDB4YzYsIDB4YTEpOwotCQkJfQotCQkJZWxzZSBpZiAoQkgyUygweGY5LDB4ZDYpIDw9IHMgJiYgcyA8PSBCSDJTKDB4ZmUsMHhmZSkpewotCQkJCWhpbnRiYXNlID0gYmlnNWhrc2NzX3BoaW50XzIxOTI0OwotCQkJCXMgLT0gQkgyUygweGY5LCAweGQ2KTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gTUJFUlJfSU5URVJOQUw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQkgyUygweDg3LCAweDQwKSA8PSBzICYmIHMgPD0gQkgyUygweGEwLCAweGZlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50YmFzZSA9IGJpZzVoa3Njc19waGludF8wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzIC09IEJIMlMoMHg4NywgMHg0MCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChCSDJTKDB4YzYsMHhhMSkgPD0gcyAmJiBzIDw9IEJIMlMoMHhjOCwweGZlKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRiYXNlID0gYmlnNWhrc2NzX3BoaW50XzEyMTMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzIC09IEJIMlMoMHhjNiwgMHhhMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChCSDJTKDB4ZjksMHhkNikgPD0gcyAmJiBzIDw9IEJIMlMoMHhmZSwweGZlKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRiYXNlID0gYmlnNWhrc2NzX3BoaW50XzIxOTI0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzIC09IEJIMlMoMHhmOSwgMHhkNik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNQkVSUl9JTlRFUk5BTDsKIAotCQkJaWYgKGhpbnRiYXNlW3MgPj4gM10gJiAoMSA8PCAocyAmIDcpKSkgewotCQkJCVdSSVRFVUNTNChkZWNvZGVkIHwgMHgyMDAwMCkKLQkJCQlORVhUX0lOKDIpCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlPVVQxKGRlY29kZWQpCi0JCQkJTkVYVCgyLCAxKQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc3dpdGNoICgoYyA8PCA4KSB8IElOMikgewotCQkJY2FzZSAweDg4NjI6IFdSSVRFMigweDAwY2EsIDB4MDMwNCk7IGJyZWFrOwotCQkJY2FzZSAweDg4NjQ6IFdSSVRFMigweDAwY2EsIDB4MDMwYyk7IGJyZWFrOwotCQkJY2FzZSAweDg4YTM6IFdSSVRFMigweDAwZWEsIDB4MDMwNCk7IGJyZWFrOwotCQkJY2FzZSAweDg4YTU6IFdSSVRFMigweDAwZWEsIDB4MDMwYyk7IGJyZWFrOwotCQkJZGVmYXVsdDogcmV0dXJuIDI7Ci0JCQl9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGludGJhc2VbcyA+PiAzXSAmICgxIDw8IChzICYgNykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFVUNTNChkZWNvZGVkIHwgMHgyMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVYVF9JTigyKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVDEoZGVjb2RlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKGMgPDwgOCkgfCBJTjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg4ODYyOiBXUklURTIoMHgwMGNhLCAweDAzMDQpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg4ODY0OiBXUklURTIoMHgwMGNhLCAweDAzMGMpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg4OGEzOiBXUklURTIoMHgwMGVhLCAweDAzMDQpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMHg4OGE1OiBXUklURTIoMHgwMGVhLCAweDAzMGMpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0JCQlORVhUKDIsIDIpIC8qIGFsbCBkZWNvZGVkIGNvZGVwb2ludHMgYXJlIHBhaXJzLCBhYm92ZS4gKi8KLQkJfQotCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIE5FWFQoMiwgMikgLyogYWxsIGRlY29kZWQgY29kZXBvaW50cyBhcmUgcGFpcnMsIGFib3ZlLiAqLworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19pc28yMDIyLmMgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2lzbzIwMjIuYwppbmRleCA5Y2U3Yjc1Li4yNWMxYTM2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2lzbzIwMjIuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2lzbzIwMjIuYwpAQCAtMTksODUgKzE5LDg1IEBACiAKICAgIHN0YXRlLT5jWzAtM10KIAotCTAwMDAwMDAwCi0JfHxeXl5eXnwKLQl8Ky0tLS0tKy0tLS0gIEcwLTMgQ2hhcmFjdGVyIFNldAotCSstLS0tLS0tLS0tLSAgSXMgRzAtMyBkb3VibGUgYnl0ZT8KKyAgICAwMDAwMDAwMAorICAgIHx8Xl5eXl58CisgICAgfCstLS0tLSstLS0tICBHMC0zIENoYXJhY3RlciBTZXQKKyAgICArLS0tLS0tLS0tLS0gIElzIEcwLTMgZG91YmxlIGJ5dGU/CiAKICAgIHN0YXRlLT5jWzRdCiAKLQkwMDAwMDAwMAotCSAgICAgIHx8Ci0JICAgICAgfCstLS0tICBMb2NrZWQtU2hpZnQ/Ci0JICAgICAgKy0tLS0tICBFU0MgVGhyb3VnaG91dAorICAgIDAwMDAwMDAwCisgICAgICAgICAgfHwKKyAgICAgICAgICB8Ky0tLS0gIExvY2tlZC1TaGlmdD8KKyAgICAgICAgICArLS0tLS0gIEVTQyBUaHJvdWdob3V0CiAqLwogCi0jZGVmaW5lIEVTQwkJCTB4MUIKLSNkZWZpbmUgU08JCQkweDBFCi0jZGVmaW5lIFNJCQkJMHgwRgotI2RlZmluZSBMRgkJCTB4MEEKKyNkZWZpbmUgRVNDICAgICAgICAgICAgICAgICAgICAgMHgxQgorI2RlZmluZSBTTyAgICAgICAgICAgICAgICAgICAgICAweDBFCisjZGVmaW5lIFNJICAgICAgICAgICAgICAgICAgICAgIDB4MEYKKyNkZWZpbmUgTEYgICAgICAgICAgICAgICAgICAgICAgMHgwQQogCi0jZGVmaW5lIE1BWF9FU0NTRVFMRU4JCTE2CisjZGVmaW5lIE1BWF9FU0NTRVFMRU4gICAgICAgICAgIDE2CiAKLSNkZWZpbmUgQ0hBUlNFVF9JU084ODU5XzEJJ0EnCi0jZGVmaW5lIENIQVJTRVRfQVNDSUkJCSdCJwotI2RlZmluZSBDSEFSU0VUX0lTTzg4NTlfNwknRicKLSNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIwMV9LCSdJJwotI2RlZmluZSBDSEFSU0VUX0pJU1gwMjAxX1IJJ0onCisjZGVmaW5lIENIQVJTRVRfSVNPODg1OV8xICAgICAgICdBJworI2RlZmluZSBDSEFSU0VUX0FTQ0lJICAgICAgICAgICAnQicKKyNkZWZpbmUgQ0hBUlNFVF9JU084ODU5XzcgICAgICAgJ0YnCisjZGVmaW5lIENIQVJTRVRfSklTWDAyMDFfSyAgICAgICdJJworI2RlZmluZSBDSEFSU0VUX0pJU1gwMjAxX1IgICAgICAnSicKIAotI2RlZmluZSBDSEFSU0VUX0dCMjMxMgkJKCdBJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfSklTWDAyMDgJKCdCJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfS1NYMTAwMQkJKCdDJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfSklTWDAyMTIJKCdEJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfR0IyMzEyXzg1NjUJKCdFJ3xDSEFSU0VUX0RCQ1MpCi0jZGVmaW5lIENIQVJTRVRfQ05TMTE2NDNfMQkoJ0cnfENIQVJTRVRfREJDUykKLSNkZWZpbmUgQ0hBUlNFVF9DTlMxMTY0M18yCSgnSCd8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0pJU1gwMjEzXzIwMDBfMQkoJ08nfENIQVJTRVRfREJDUykKLSNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIxM18yCSgnUCd8Q0hBUlNFVF9EQkNTKQotI2RlZmluZSBDSEFSU0VUX0pJU1gwMjEzXzIwMDRfMQkoJ1EnfENIQVJTRVRfREJDUykKLSNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIwOF9PCSgnQCd8Q0hBUlNFVF9EQkNTKQorI2RlZmluZSBDSEFSU0VUX0dCMjMxMiAgICAgICAgICAoJ0EnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIwOCAgICAgICAgKCdCJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfS1NYMTAwMSAgICAgICAgICgnQyd8Q0hBUlNFVF9EQkNTKQorI2RlZmluZSBDSEFSU0VUX0pJU1gwMjEyICAgICAgICAoJ0QnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9HQjIzMTJfODU2NSAgICAgKCdFJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfQ05TMTE2NDNfMSAgICAgICgnRyd8Q0hBUlNFVF9EQkNTKQorI2RlZmluZSBDSEFSU0VUX0NOUzExNjQzXzIgICAgICAoJ0gnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIxM18yMDAwXzEgKCdPJ3xDSEFSU0VUX0RCQ1MpCisjZGVmaW5lIENIQVJTRVRfSklTWDAyMTNfMiAgICAgICgnUCd8Q0hBUlNFVF9EQkNTKQorI2RlZmluZSBDSEFSU0VUX0pJU1gwMjEzXzIwMDRfMSAoJ1EnfENIQVJTRVRfREJDUykKKyNkZWZpbmUgQ0hBUlNFVF9KSVNYMDIwOF9PICAgICAgKCdAJ3xDSEFSU0VUX0RCQ1MpCiAKLSNkZWZpbmUgQ0hBUlNFVF9EQkNTCQkweDgwCi0jZGVmaW5lIEVTQ01BUksobWFyaykJCSgobWFyaykgJiAweDdmKQorI2RlZmluZSBDSEFSU0VUX0RCQ1MgICAgICAgICAgICAweDgwCisjZGVmaW5lIEVTQ01BUksobWFyaykgICAgICAgICAgICgobWFyaykgJiAweDdmKQogCi0jZGVmaW5lIElTX0VTQ0VORChjKQkoKChjKSA+PSAnQScgJiYgKGMpIDw9ICdaJykgfHwgKGMpID09ICdAJykKKyNkZWZpbmUgSVNfRVNDRU5EKGMpICAgICgoKGMpID49ICdBJyAmJiAoYykgPD0gJ1onKSB8fCAoYykgPT0gJ0AnKQogI2RlZmluZSBJU19JU08yMDIyRVNDKGMyKSBcCi0JCSgoYzIpID09ICcoJyB8fCAoYzIpID09ICcpJyB8fCAoYzIpID09ICckJyB8fCBcCi0JCSAoYzIpID09ICcuJyB8fCAoYzIpID09ICcmJykKLQkvKiB0aGlzIGlzIG5vdCBhIGNvbXBsZXRlIGxpc3Qgb2YgSVNPLTIwMjIgZXNjYXBlIHNlcXVlbmNlIGhlYWRlcnMuCi0JICogYnV0LCBpdCdzIGVub3VnaCB0byBpbXBsZW1lbnQgQ0pLIGluc3RhbmNlcyBvZiBpc28tMjAyMi4gKi8KKyAgICAgICAgKChjMikgPT0gJygnIHx8IChjMikgPT0gJyknIHx8IChjMikgPT0gJyQnIHx8IFwKKyAgICAgICAgIChjMikgPT0gJy4nIHx8IChjMikgPT0gJyYnKQorICAgIC8qIHRoaXMgaXMgbm90IGEgY29tcGxldGUgbGlzdCBvZiBJU08tMjAyMiBlc2NhcGUgc2VxdWVuY2UgaGVhZGVycy4KKyAgICAgKiBidXQsIGl0J3MgZW5vdWdoIHRvIGltcGxlbWVudCBDSksgaW5zdGFuY2VzIG9mIGlzby0yMDIyLiAqLwogCi0jZGVmaW5lIE1BUF9VTk1BUFBBQkxFCQkweEZGRkYKLSNkZWZpbmUgTUFQX01VTFRJUExFX0FWQUlMCTB4RkZGRSAvKiBmb3IgSklTIFggMDIxMyAqLworI2RlZmluZSBNQVBfVU5NQVBQQUJMRSAgICAgICAgICAweEZGRkYKKyNkZWZpbmUgTUFQX01VTFRJUExFX0FWQUlMICAgICAgMHhGRkZFIC8qIGZvciBKSVMgWCAwMjEzICovCiAKLSNkZWZpbmUgRl9TSElGVEVECQkweDAxCi0jZGVmaW5lIEZfRVNDVEhST1VHSE9VVAkJMHgwMgorI2RlZmluZSBGX1NISUZURUQgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEZfRVNDVEhST1VHSE9VVCAgICAgICAgIDB4MDIKIAotI2RlZmluZSBTVEFURV9TRVRHKGRuLCB2KQkoKHN0YXRlKS0+Y1tkbl0pID0gKHYpOwotI2RlZmluZSBTVEFURV9HRVRHKGRuKQkJKChzdGF0ZSktPmNbZG5dKQorI2RlZmluZSBTVEFURV9TRVRHKGRuLCB2KSAgICAgICAoKHN0YXRlKS0+Y1tkbl0pID0gKHYpOworI2RlZmluZSBTVEFURV9HRVRHKGRuKSAgICAgICAgICAoKHN0YXRlKS0+Y1tkbl0pCiAKLSNkZWZpbmUgU1RBVEVfRzAJCVNUQVRFX0dFVEcoMCkKLSNkZWZpbmUgU1RBVEVfRzEJCVNUQVRFX0dFVEcoMSkKLSNkZWZpbmUgU1RBVEVfRzIJCVNUQVRFX0dFVEcoMikKLSNkZWZpbmUgU1RBVEVfRzMJCVNUQVRFX0dFVEcoMykKLSNkZWZpbmUgU1RBVEVfU0VURzAodikJCVNUQVRFX1NFVEcoMCwgdikKLSNkZWZpbmUgU1RBVEVfU0VURzEodikJCVNUQVRFX1NFVEcoMSwgdikKLSNkZWZpbmUgU1RBVEVfU0VURzIodikJCVNUQVRFX1NFVEcoMiwgdikKLSNkZWZpbmUgU1RBVEVfU0VURzModikJCVNUQVRFX1NFVEcoMywgdikKKyNkZWZpbmUgU1RBVEVfRzAgICAgICAgICAgICAgICAgU1RBVEVfR0VURygwKQorI2RlZmluZSBTVEFURV9HMSAgICAgICAgICAgICAgICBTVEFURV9HRVRHKDEpCisjZGVmaW5lIFNUQVRFX0cyICAgICAgICAgICAgICAgIFNUQVRFX0dFVEcoMikKKyNkZWZpbmUgU1RBVEVfRzMgICAgICAgICAgICAgICAgU1RBVEVfR0VURygzKQorI2RlZmluZSBTVEFURV9TRVRHMCh2KSAgICAgICAgICBTVEFURV9TRVRHKDAsIHYpCisjZGVmaW5lIFNUQVRFX1NFVEcxKHYpICAgICAgICAgIFNUQVRFX1NFVEcoMSwgdikKKyNkZWZpbmUgU1RBVEVfU0VURzIodikgICAgICAgICAgU1RBVEVfU0VURygyLCB2KQorI2RlZmluZSBTVEFURV9TRVRHMyh2KSAgICAgICAgICBTVEFURV9TRVRHKDMsIHYpCiAKLSNkZWZpbmUgU1RBVEVfU0VURkxBRyhmKQkoKHN0YXRlKS0+Y1s0XSkgfD0gKGYpOwotI2RlZmluZSBTVEFURV9HRVRGTEFHKGYpCSgoc3RhdGUpLT5jWzRdICYgKGYpKQotI2RlZmluZSBTVEFURV9DTEVBUkZMQUcoZikJKChzdGF0ZSktPmNbNF0pICY9IH4oZik7Ci0jZGVmaW5lIFNUQVRFX0NMRUFSRkxBR1MoKQkoKHN0YXRlKS0+Y1s0XSkgPSAwOworI2RlZmluZSBTVEFURV9TRVRGTEFHKGYpICAgICAgICAoKHN0YXRlKS0+Y1s0XSkgfD0gKGYpOworI2RlZmluZSBTVEFURV9HRVRGTEFHKGYpICAgICAgICAoKHN0YXRlKS0+Y1s0XSAmIChmKSkKKyNkZWZpbmUgU1RBVEVfQ0xFQVJGTEFHKGYpICAgICAgKChzdGF0ZSktPmNbNF0pICY9IH4oZik7CisjZGVmaW5lIFNUQVRFX0NMRUFSRkxBR1MoKSAgICAgICgoc3RhdGUpLT5jWzRdKSA9IDA7CiAKLSNkZWZpbmUgSVNPMjAyMl9DT05GSUcJCSgoY29uc3Qgc3RydWN0IGlzbzIwMjJfY29uZmlnICopY29uZmlnKQotI2RlZmluZSBDT05GSUdfSVNTRVQoZmxhZykJKElTTzIwMjJfQ09ORklHLT5mbGFncyAmIChmbGFnKSkKLSNkZWZpbmUgQ09ORklHX0RFU0lHTkFUSU9OUwkoSVNPMjAyMl9DT05GSUctPmRlc2lnbmF0aW9ucykKKyNkZWZpbmUgSVNPMjAyMl9DT05GSUcgICAgICAgICAgKChjb25zdCBzdHJ1Y3QgaXNvMjAyMl9jb25maWcgKiljb25maWcpCisjZGVmaW5lIENPTkZJR19JU1NFVChmbGFnKSAgICAgIChJU08yMDIyX0NPTkZJRy0+ZmxhZ3MgJiAoZmxhZykpCisjZGVmaW5lIENPTkZJR19ERVNJR05BVElPTlMgICAgIChJU08yMDIyX0NPTkZJRy0+ZGVzaWduYXRpb25zKQogCiAvKiBpc28yMDIyX2NvbmZpZy5mbGFncyAqLwotI2RlZmluZSBOT19TSElGVAkJMHgwMQotI2RlZmluZSBVU0VfRzIJCQkweDAyCi0jZGVmaW5lIFVTRV9KSVNYMDIwOF9FWFQJMHgwNAorI2RlZmluZSBOT19TSElGVCAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIFVTRV9HMiAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgVVNFX0pJU1gwMjA4X0VYVCAgICAgICAgMHgwNAogCiAvKi0qLSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgLSotKi8KIApAQCAtMTA2LDQzNCArMTA2LDQzNCBAQAogdHlwZWRlZiBEQkNIQVIgKCppc28yMDIyX2VuY29kZV9mdW5jKShjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCk7CiAKIHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uIHsKLQl1bnNpZ25lZCBjaGFyIG1hcms7Ci0JdW5zaWduZWQgY2hhciBwbGFuZTsKLQl1bnNpZ25lZCBjaGFyIHdpZHRoOwotCWlzbzIwMjJfaW5pdF9mdW5jIGluaXRpYWxpemVyOwotCWlzbzIwMjJfZGVjb2RlX2Z1bmMgZGVjb2RlcjsKLQlpc28yMDIyX2VuY29kZV9mdW5jIGVuY29kZXI7CisgICAgdW5zaWduZWQgY2hhciBtYXJrOworICAgIHVuc2lnbmVkIGNoYXIgcGxhbmU7CisgICAgdW5zaWduZWQgY2hhciB3aWR0aDsKKyAgICBpc28yMDIyX2luaXRfZnVuYyBpbml0aWFsaXplcjsKKyAgICBpc28yMDIyX2RlY29kZV9mdW5jIGRlY29kZXI7CisgICAgaXNvMjAyMl9lbmNvZGVfZnVuYyBlbmNvZGVyOwogfTsKIAogc3RydWN0IGlzbzIwMjJfY29uZmlnIHsKLQlpbnQgZmxhZ3M7Ci0JY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRlc2lnbmF0aW9uczsgLyogbm9uLWFzY2lpIGRlc2lncyAqLworICAgIGludCBmbGFnczsKKyAgICBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZGVzaWduYXRpb25zOyAvKiBub24tYXNjaWkgZGVzaWdzICovCiB9OwogCiAvKi0qLSBpc28tMjAyMiBjb2RlYyBpbXBsZW1lbnRhdGlvbiAtKi0qLwogCiBDT0RFQ19JTklUKGlzbzIwMjIpCiB7Ci0JY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRlc2lnID0gQ09ORklHX0RFU0lHTkFUSU9OUzsKLQlmb3IgKGRlc2lnID0gQ09ORklHX0RFU0lHTkFUSU9OUzsgZGVzaWctPm1hcms7IGRlc2lnKyspCi0JCWlmIChkZXNpZy0+aW5pdGlhbGl6ZXIgIT0gTlVMTCAmJiBkZXNpZy0+aW5pdGlhbGl6ZXIoKSAhPSAwKQotCQkJcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkZXNpZyA9IENPTkZJR19ERVNJR05BVElPTlM7CisgICAgZm9yIChkZXNpZyA9IENPTkZJR19ERVNJR05BVElPTlM7IGRlc2lnLT5tYXJrOyBkZXNpZysrKQorICAgICAgICBpZiAoZGVzaWctPmluaXRpYWxpemVyICE9IE5VTEwgJiYgZGVzaWctPmluaXRpYWxpemVyKCkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogRU5DT0RFUl9JTklUKGlzbzIwMjIpCiB7Ci0JU1RBVEVfQ0xFQVJGTEFHUygpCi0JU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKLQlTVEFURV9TRVRHMShDSEFSU0VUX0FTQ0lJKQotCXJldHVybiAwOworICAgIFNUQVRFX0NMRUFSRkxBR1MoKQorICAgIFNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCisgICAgU1RBVEVfU0VURzEoQ0hBUlNFVF9BU0NJSSkKKyAgICByZXR1cm4gMDsKIH0KIAogRU5DT0RFUl9SRVNFVChpc28yMDIyKQogewotCWlmIChTVEFURV9HRVRGTEFHKEZfU0hJRlRFRCkpIHsKLQkJV1JJVEUxKFNJKQotCQlORVhUX09VVCgxKQotCQlTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQotCX0KLQlpZiAoU1RBVEVfRzAgIT0gQ0hBUlNFVF9BU0NJSSkgewotCQlXUklURTMoRVNDLCAnKCcsICdCJykKLQkJTkVYVF9PVVQoMykKLQkJU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKFNUQVRFX0dFVEZMQUcoRl9TSElGVEVEKSkgeworICAgICAgICBXUklURTEoU0kpCisgICAgICAgIE5FWFRfT1VUKDEpCisgICAgICAgIFNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCisgICAgfQorICAgIGlmIChTVEFURV9HMCAhPSBDSEFSU0VUX0FTQ0lJKSB7CisgICAgICAgIFdSSVRFMyhFU0MsICcoJywgJ0InKQorICAgICAgICBORVhUX09VVCgzKQorICAgICAgICBTVEFURV9TRVRHMChDSEFSU0VUX0FTQ0lJKQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogRU5DT0RFUihpc28yMDIyKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCWNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkc2c7Ci0JCURCQ0hBUiBlbmNvZGVkOwotCQl1Y3M0X3QgYyA9ICoqaW5idWY7Ci0JCVB5X3NzaXplX3QgaW5zaXplOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkc2c7CisgICAgICAgIERCQ0hBUiBlbmNvZGVkOworICAgICAgICB1Y3M0X3QgYyA9ICoqaW5idWY7CisgICAgICAgIFB5X3NzaXplX3QgaW5zaXplOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJaWYgKFNUQVRFX0cwICE9IENIQVJTRVRfQVNDSUkpIHsKLQkJCQlXUklURTMoRVNDLCAnKCcsICdCJykKLQkJCQlTVEFURV9TRVRHMChDSEFSU0VUX0FTQ0lJKQotCQkJCU5FWFRfT1VUKDMpCi0JCQl9Ci0JCQlpZiAoU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKSB7Ci0JCQkJV1JJVEUxKFNJKQotCQkJCVNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCi0JCQkJTkVYVF9PVVQoMSkKLQkJCX0KLQkJCVdSSVRFMSgodW5zaWduZWQgY2hhciljKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBpZiAoU1RBVEVfRzAgIT0gQ0hBUlNFVF9BU0NJSSkgeworICAgICAgICAgICAgICAgIFdSSVRFMyhFU0MsICcoJywgJ0InKQorICAgICAgICAgICAgICAgIFNUQVRFX1NFVEcwKENIQVJTRVRfQVNDSUkpCisgICAgICAgICAgICAgICAgTkVYVF9PVVQoMykKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChTVEFURV9HRVRGTEFHKEZfU0hJRlRFRCkpIHsKKyAgICAgICAgICAgICAgICBXUklURTEoU0kpCisgICAgICAgICAgICAgICAgU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKKyAgICAgICAgICAgICAgICBORVhUX09VVCgxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCURFQ09ERV9TVVJST0dBVEUoYykKLQkJaW5zaXplID0gR0VUX0lOU0laRShjKTsKKyAgICAgICAgREVDT0RFX1NVUlJPR0FURShjKQorICAgICAgICBpbnNpemUgPSBHRVRfSU5TSVpFKGMpOwogCi0JCWVuY29kZWQgPSBNQVBfVU5NQVBQQUJMRTsKLQkJZm9yIChkc2cgPSBDT05GSUdfREVTSUdOQVRJT05TOyBkc2ctPm1hcms7IGRzZysrKSB7Ci0JCQlQeV9zc2l6ZV90IGxlbmd0aCA9IDE7Ci0JCQllbmNvZGVkID0gZHNnLT5lbmNvZGVyKCZjLCAmbGVuZ3RoKTsKLQkJCWlmIChlbmNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkgewotCQkJCS8qIHRoaXMgaW1wbGVtZW50YXRpb24gd29uJ3Qgd29yayBmb3IgcGFpcgotCQkJCSAqIG9mIG5vbi1ibXAgY2hhcmFjdGVycy4gKi8KLQkJCQlpZiAoaW5sZWZ0IDwgMikgewotCQkJCQlpZiAoIShmbGFncyAmIE1CRU5DX0ZMVVNIKSkKLQkJCQkJCXJldHVybiBNQkVSUl9UT09GRVc7Ci0JCQkJCWxlbmd0aCA9IC0xOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWxlbmd0aCA9IDI7CisgICAgICAgIGVuY29kZWQgPSBNQVBfVU5NQVBQQUJMRTsKKyAgICAgICAgZm9yIChkc2cgPSBDT05GSUdfREVTSUdOQVRJT05TOyBkc2ctPm1hcms7IGRzZysrKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbmd0aCA9IDE7CisgICAgICAgICAgICBlbmNvZGVkID0gZHNnLT5lbmNvZGVyKCZjLCAmbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkgeworICAgICAgICAgICAgICAgIC8qIHRoaXMgaW1wbGVtZW50YXRpb24gd29uJ3Qgd29yayBmb3IgcGFpcgorICAgICAgICAgICAgICAgICAqIG9mIG5vbi1ibXAgY2hhcmFjdGVycy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5sZWZ0IDwgMikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIShmbGFncyAmIE1CRU5DX0ZMVVNIKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNQkVSUl9UT09GRVc7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IDI7CiAjaWYgUHlfVU5JQ09ERV9TSVpFID09IDIKLQkJCQlpZiAobGVuZ3RoID09IDIpIHsKLQkJCQkJdWNzNF90IHU0aW5bMl07Ci0JCQkJCXU0aW5bMF0gPSAodWNzNF90KUlOMTsKLQkJCQkJdTRpblsxXSA9ICh1Y3M0X3QpSU4yOwotCQkJCQllbmNvZGVkID0gZHNnLT5lbmNvZGVyKHU0aW4sICZsZW5ndGgpOwotCQkJCX0gZWxzZQotCQkJCQllbmNvZGVkID0gZHNnLT5lbmNvZGVyKCZjLCAmbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgdWNzNF90IHU0aW5bMl07CisgICAgICAgICAgICAgICAgICAgIHU0aW5bMF0gPSAodWNzNF90KUlOMTsKKyAgICAgICAgICAgICAgICAgICAgdTRpblsxXSA9ICh1Y3M0X3QpSU4yOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVkID0gZHNnLT5lbmNvZGVyKHU0aW4sICZsZW5ndGgpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkID0gZHNnLT5lbmNvZGVyKCZjLCAmbGVuZ3RoKTsKICNlbHNlCi0JCQkJZW5jb2RlZCA9IGRzZy0+ZW5jb2RlcigmYywgJmxlbmd0aCk7CisgICAgICAgICAgICAgICAgZW5jb2RlZCA9IGRzZy0+ZW5jb2RlcigmYywgJmxlbmd0aCk7CiAjZW5kaWYKLQkJCQlpZiAoZW5jb2RlZCAhPSBNQVBfVU5NQVBQQUJMRSkgewotCQkJCQlpbnNpemUgPSBsZW5ndGg7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGVuY29kZWQgIT0gTUFQX1VOTUFQUEFCTEUpCi0JCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZCAhPSBNQVBfVU5NQVBQQUJMRSkgeworICAgICAgICAgICAgICAgICAgICBpbnNpemUgPSBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGVuY29kZWQgIT0gTUFQX1VOTUFQUEFCTEUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAoIWRzZy0+bWFyaykKLQkJCXJldHVybiAxOwotCQlhc3NlcnQoZHNnLT53aWR0aCA9PSAxIHx8IGRzZy0+d2lkdGggPT0gMik7CisgICAgICAgIGlmICghZHNnLT5tYXJrKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGFzc2VydChkc2ctPndpZHRoID09IDEgfHwgZHNnLT53aWR0aCA9PSAyKTsKIAotCQlzd2l0Y2ggKGRzZy0+cGxhbmUpIHsKLQkJY2FzZSAwOiAvKiBHMCAqLwotCQkJaWYgKFNUQVRFX0dFVEZMQUcoRl9TSElGVEVEKSkgewotCQkJCVdSSVRFMShTSSkKLQkJCQlTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQotCQkJCU5FWFRfT1VUKDEpCi0JCQl9Ci0JCQlpZiAoU1RBVEVfRzAgIT0gZHNnLT5tYXJrKSB7Ci0JCQkJaWYgKGRzZy0+d2lkdGggPT0gMSkgewotCQkJCQlXUklURTMoRVNDLCAnKCcsIEVTQ01BUksoZHNnLT5tYXJrKSkKLQkJCQkJU1RBVEVfU0VURzAoZHNnLT5tYXJrKQotCQkJCQlORVhUX09VVCgzKQotCQkJCX0KLQkJCQllbHNlIGlmIChkc2ctPm1hcmsgPT0gQ0hBUlNFVF9KSVNYMDIwOCkgewotCQkJCQlXUklURTMoRVNDLCAnJCcsIEVTQ01BUksoZHNnLT5tYXJrKSkKLQkJCQkJU1RBVEVfU0VURzAoZHNnLT5tYXJrKQotCQkJCQlORVhUX09VVCgzKQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJV1JJVEU0KEVTQywgJyQnLCAnKCcsCi0JCQkJCQlFU0NNQVJLKGRzZy0+bWFyaykpCi0JCQkJCVNUQVRFX1NFVEcwKGRzZy0+bWFyaykKLQkJCQkJTkVYVF9PVVQoNCkKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAxOiAvKiBHMSAqLwotCQkJaWYgKFNUQVRFX0cxICE9IGRzZy0+bWFyaykgewotCQkJCWlmIChkc2ctPndpZHRoID09IDEpIHsKLQkJCQkJV1JJVEUzKEVTQywgJyknLCBFU0NNQVJLKGRzZy0+bWFyaykpCi0JCQkJCVNUQVRFX1NFVEcxKGRzZy0+bWFyaykKLQkJCQkJTkVYVF9PVVQoMykKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVdSSVRFNChFU0MsICckJywgJyknLAotCQkJCQkJRVNDTUFSSyhkc2ctPm1hcmspKQotCQkJCQlTVEFURV9TRVRHMShkc2ctPm1hcmspCi0JCQkJCU5FWFRfT1VUKDQpCi0JCQkJfQotCQkJfQotCQkJaWYgKCFTVEFURV9HRVRGTEFHKEZfU0hJRlRFRCkpIHsKLQkJCQlXUklURTEoU08pCi0JCQkJU1RBVEVfU0VURkxBRyhGX1NISUZURUQpCi0JCQkJTkVYVF9PVVQoMSkKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAvKiBHMiBhbmQgRzMgaXMgbm90IHN1cHBvcnRlZDogbm8gZW5jb2RpbmcgaW4KLQkJCSAgKiBDSktDb2RlY3MgYXJlIHVzaW5nIHRoZW0geWV0ICovCi0JCQlyZXR1cm4gTUJFUlJfSU5URVJOQUw7Ci0JCX0KKyAgICAgICAgc3dpdGNoIChkc2ctPnBsYW5lKSB7CisgICAgICAgIGNhc2UgMDogLyogRzAgKi8KKyAgICAgICAgICAgIGlmIChTVEFURV9HRVRGTEFHKEZfU0hJRlRFRCkpIHsKKyAgICAgICAgICAgICAgICBXUklURTEoU0kpCisgICAgICAgICAgICAgICAgU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKKyAgICAgICAgICAgICAgICBORVhUX09VVCgxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFNUQVRFX0cwICE9IGRzZy0+bWFyaykgeworICAgICAgICAgICAgICAgIGlmIChkc2ctPndpZHRoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgV1JJVEUzKEVTQywgJygnLCBFU0NNQVJLKGRzZy0+bWFyaykpCisgICAgICAgICAgICAgICAgICAgIFNUQVRFX1NFVEcwKGRzZy0+bWFyaykKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9PVVQoMykKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZHNnLT5tYXJrID09IENIQVJTRVRfSklTWDAyMDgpIHsKKyAgICAgICAgICAgICAgICAgICAgV1JJVEUzKEVTQywgJyQnLCBFU0NNQVJLKGRzZy0+bWFyaykpCisgICAgICAgICAgICAgICAgICAgIFNUQVRFX1NFVEcwKGRzZy0+bWFyaykKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9PVVQoMykKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFNChFU0MsICckJywgJygnLAorICAgICAgICAgICAgICAgICAgICAgICAgRVNDTUFSSyhkc2ctPm1hcmspKQorICAgICAgICAgICAgICAgICAgICBTVEFURV9TRVRHMChkc2ctPm1hcmspCisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDQpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogLyogRzEgKi8KKyAgICAgICAgICAgIGlmIChTVEFURV9HMSAhPSBkc2ctPm1hcmspIHsKKyAgICAgICAgICAgICAgICBpZiAoZHNnLT53aWR0aCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFMyhFU0MsICcpJywgRVNDTUFSSyhkc2ctPm1hcmspKQorICAgICAgICAgICAgICAgICAgICBTVEFURV9TRVRHMShkc2ctPm1hcmspCisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDMpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBXUklURTQoRVNDLCAnJCcsICcpJywKKyAgICAgICAgICAgICAgICAgICAgICAgIEVTQ01BUksoZHNnLT5tYXJrKSkKKyAgICAgICAgICAgICAgICAgICAgU1RBVEVfU0VURzEoZHNnLT5tYXJrKQorICAgICAgICAgICAgICAgICAgICBORVhUX09VVCg0KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKSB7CisgICAgICAgICAgICAgICAgV1JJVEUxKFNPKQorICAgICAgICAgICAgICAgIFNUQVRFX1NFVEZMQUcoRl9TSElGVEVEKQorICAgICAgICAgICAgICAgIE5FWFRfT1VUKDEpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLyogRzIgYW5kIEczIGlzIG5vdCBzdXBwb3J0ZWQ6IG5vIGVuY29kaW5nIGluCisgICAgICAgICAgICAgICAgICAqIENKS0NvZGVjcyBhcmUgdXNpbmcgdGhlbSB5ZXQgKi8KKyAgICAgICAgICAgIHJldHVybiBNQkVSUl9JTlRFUk5BTDsKKyAgICAgICAgfQogCi0JCWlmIChkc2ctPndpZHRoID09IDEpIHsKLQkJCVdSSVRFMSgodW5zaWduZWQgY2hhcillbmNvZGVkKQotCQkJTkVYVF9PVVQoMSkKLQkJfQotCQllbHNlIHsKLQkJCVdSSVRFMihlbmNvZGVkID4+IDgsIGVuY29kZWQgJiAweGZmKQotCQkJTkVYVF9PVVQoMikKLQkJfQotCQlORVhUX0lOKGluc2l6ZSkKLQl9CisgICAgICAgIGlmIChkc2ctPndpZHRoID09IDEpIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhcillbmNvZGVkKQorICAgICAgICAgICAgTkVYVF9PVVQoMSkKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFdSSVRFMihlbmNvZGVkID4+IDgsIGVuY29kZWQgJiAweGZmKQorICAgICAgICAgICAgTkVYVF9PVVQoMikKKyAgICAgICAgfQorICAgICAgICBORVhUX0lOKGluc2l6ZSkKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUl9JTklUKGlzbzIwMjIpCiB7Ci0JU1RBVEVfQ0xFQVJGTEFHUygpCi0JU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKLQlTVEFURV9TRVRHMShDSEFSU0VUX0FTQ0lJKQotCVNUQVRFX1NFVEcyKENIQVJTRVRfQVNDSUkpCi0JcmV0dXJuIDA7CisgICAgU1RBVEVfQ0xFQVJGTEFHUygpCisgICAgU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKKyAgICBTVEFURV9TRVRHMShDSEFSU0VUX0FTQ0lJKQorICAgIFNUQVRFX1NFVEcyKENIQVJTRVRfQVNDSUkpCisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVJfUkVTRVQoaXNvMjAyMikKIHsKLQlTVEFURV9TRVRHMChDSEFSU0VUX0FTQ0lJKQotCVNUQVRFX0NMRUFSRkxBRyhGX1NISUZURUQpCi0JcmV0dXJuIDA7CisgICAgU1RBVEVfU0VURzAoQ0hBUlNFVF9BU0NJSSkKKyAgICBTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogaXNvMjAyMnByb2Nlc3Nlc2MoY29uc3Qgdm9pZCAqY29uZmlnLCBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCi0JCSAgY29uc3QgdW5zaWduZWQgY2hhciAqKmluYnVmLCBQeV9zc2l6ZV90ICppbmxlZnQpCisgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW5idWYsIFB5X3NzaXplX3QgKmlubGVmdCkKIHsKLQl1bnNpZ25lZCBjaGFyIGNoYXJzZXQsIGRlc2lnbmF0aW9uOwotCVB5X3NzaXplX3QgaSwgZXNjbGVuOworICAgIHVuc2lnbmVkIGNoYXIgY2hhcnNldCwgZGVzaWduYXRpb247CisgICAgUHlfc3NpemVfdCBpLCBlc2NsZW47CiAKLQlmb3IgKGkgPSAxO2kgPCBNQVhfRVNDU0VRTEVOO2krKykgewotCQlpZiAoaSA+PSAqaW5sZWZ0KQotCQkJcmV0dXJuIE1CRVJSX1RPT0ZFVzsKLQkJaWYgKElTX0VTQ0VORCgoKmluYnVmKVtpXSkpIHsKLQkJCWVzY2xlbiA9IGkgKyAxOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZiAoQ09ORklHX0lTU0VUKFVTRV9KSVNYMDIwOF9FWFQpICYmIGkrMSA8ICppbmxlZnQgJiYKLQkJCSAoKmluYnVmKVtpXSA9PSAnJicgJiYgKCppbmJ1ZilbaSsxXSA9PSAnQCcpCi0JCQlpICs9IDI7Ci0JfQorICAgIGZvciAoaSA9IDE7aSA8IE1BWF9FU0NTRVFMRU47aSsrKSB7CisgICAgICAgIGlmIChpID49ICppbmxlZnQpCisgICAgICAgICAgICByZXR1cm4gTUJFUlJfVE9PRkVXOworICAgICAgICBpZiAoSVNfRVNDRU5EKCgqaW5idWYpW2ldKSkgeworICAgICAgICAgICAgZXNjbGVuID0gaSArIDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChDT05GSUdfSVNTRVQoVVNFX0pJU1gwMjA4X0VYVCkgJiYgaSsxIDwgKmlubGVmdCAmJgorICAgICAgICAgICAgICAgICAoKmluYnVmKVtpXSA9PSAnJicgJiYgKCppbmJ1ZilbaSsxXSA9PSAnQCcpCisgICAgICAgICAgICBpICs9IDI7CisgICAgfQogCi0JaWYgKGkgPj0gTUFYX0VTQ1NFUUxFTikKLQkJcmV0dXJuIDE7IC8qIHVudGVybWluYXRlZCBlc2NhcGUgc2VxdWVuY2UgKi8KKyAgICBpZiAoaSA+PSBNQVhfRVNDU0VRTEVOKQorICAgICAgICByZXR1cm4gMTsgLyogdW50ZXJtaW5hdGVkIGVzY2FwZSBzZXF1ZW5jZSAqLwogCi0Jc3dpdGNoIChlc2NsZW4pIHsKLQljYXNlIDM6Ci0JCWlmIChJTjIgPT0gJyQnKSB7Ci0JCQljaGFyc2V0ID0gSU4zIHwgQ0hBUlNFVF9EQkNTOwotCQkJZGVzaWduYXRpb24gPSAwOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhcnNldCA9IElOMzsKLQkJCWlmIChJTjIgPT0gJygnKSBkZXNpZ25hdGlvbiA9IDA7Ci0JCQllbHNlIGlmIChJTjIgPT0gJyknKSBkZXNpZ25hdGlvbiA9IDE7Ci0JCQllbHNlIGlmIChDT05GSUdfSVNTRVQoVVNFX0cyKSAmJiBJTjIgPT0gJy4nKQotCQkJCWRlc2lnbmF0aW9uID0gMjsKLQkJCWVsc2UgcmV0dXJuIDM7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlpZiAoSU4yICE9ICckJykKLQkJCXJldHVybiA0OworICAgIHN3aXRjaCAoZXNjbGVuKSB7CisgICAgY2FzZSAzOgorICAgICAgICBpZiAoSU4yID09ICckJykgeworICAgICAgICAgICAgY2hhcnNldCA9IElOMyB8IENIQVJTRVRfREJDUzsKKyAgICAgICAgICAgIGRlc2lnbmF0aW9uID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJzZXQgPSBJTjM7CisgICAgICAgICAgICBpZiAoSU4yID09ICcoJykgZGVzaWduYXRpb24gPSAwOworICAgICAgICAgICAgZWxzZSBpZiAoSU4yID09ICcpJykgZGVzaWduYXRpb24gPSAxOworICAgICAgICAgICAgZWxzZSBpZiAoQ09ORklHX0lTU0VUKFVTRV9HMikgJiYgSU4yID09ICcuJykKKyAgICAgICAgICAgICAgICBkZXNpZ25hdGlvbiA9IDI7CisgICAgICAgICAgICBlbHNlIHJldHVybiAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgaWYgKElOMiAhPSAnJCcpCisgICAgICAgICAgICByZXR1cm4gNDsKIAotCQljaGFyc2V0ID0gSU40IHwgQ0hBUlNFVF9EQkNTOwotCQlpZiAoSU4zID09ICcoJykgZGVzaWduYXRpb24gPSAwOwotCQllbHNlIGlmIChJTjMgPT0gJyknKSBkZXNpZ25hdGlvbiA9IDE7Ci0JCWVsc2UgcmV0dXJuIDQ7Ci0JCWJyZWFrOwotCWNhc2UgNjogLyogZGVzaWduYXRpb24gd2l0aCBwcmVmaXggKi8KLQkJaWYgKENPTkZJR19JU1NFVChVU0VfSklTWDAyMDhfRVhUKSAmJgotCQkgICAgKCppbmJ1ZilbM10gPT0gRVNDICYmICgqaW5idWYpWzRdID09ICckJyAmJgotCQkgICAgKCppbmJ1ZilbNV0gPT0gJ0InKSB7Ci0JCQljaGFyc2V0ID0gJ0InIHwgQ0hBUlNFVF9EQkNTOwotCQkJZGVzaWduYXRpb24gPSAwOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiA2OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZXNjbGVuOwotCX0KKyAgICAgICAgY2hhcnNldCA9IElONCB8IENIQVJTRVRfREJDUzsKKyAgICAgICAgaWYgKElOMyA9PSAnKCcpIGRlc2lnbmF0aW9uID0gMDsKKyAgICAgICAgZWxzZSBpZiAoSU4zID09ICcpJykgZGVzaWduYXRpb24gPSAxOworICAgICAgICBlbHNlIHJldHVybiA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6IC8qIGRlc2lnbmF0aW9uIHdpdGggcHJlZml4ICovCisgICAgICAgIGlmIChDT05GSUdfSVNTRVQoVVNFX0pJU1gwMjA4X0VYVCkgJiYKKyAgICAgICAgICAgICgqaW5idWYpWzNdID09IEVTQyAmJiAoKmluYnVmKVs0XSA9PSAnJCcgJiYKKyAgICAgICAgICAgICgqaW5idWYpWzVdID09ICdCJykgeworICAgICAgICAgICAgY2hhcnNldCA9ICdCJyB8IENIQVJTRVRfREJDUzsKKyAgICAgICAgICAgIGRlc2lnbmF0aW9uID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gNjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGVzY2xlbjsKKyAgICB9CiAKLQkvKiByYWlzZSBlcnJvciB3aGVuIHRoZSBjaGFyc2V0IGlzIG5vdCBkZXNpZ25hdGVkIGZvciB0aGlzIGVuY29kaW5nICovCi0JaWYgKGNoYXJzZXQgIT0gQ0hBUlNFVF9BU0NJSSkgewotCQljb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnOworICAgIC8qIHJhaXNlIGVycm9yIHdoZW4gdGhlIGNoYXJzZXQgaXMgbm90IGRlc2lnbmF0ZWQgZm9yIHRoaXMgZW5jb2RpbmcgKi8KKyAgICBpZiAoY2hhcnNldCAhPSBDSEFSU0VUX0FTQ0lJKSB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkc2c7CiAKLQkJZm9yIChkc2cgPSBDT05GSUdfREVTSUdOQVRJT05TOyBkc2ctPm1hcms7IGRzZysrKQotCQkJaWYgKGRzZy0+bWFyayA9PSBjaGFyc2V0KQotCQkJCWJyZWFrOwotCQlpZiAoIWRzZy0+bWFyaykKLQkJCXJldHVybiBlc2NsZW47Ci0JfQorICAgICAgICBmb3IgKGRzZyA9IENPTkZJR19ERVNJR05BVElPTlM7IGRzZy0+bWFyazsgZHNnKyspCisgICAgICAgICAgICBpZiAoZHNnLT5tYXJrID09IGNoYXJzZXQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmICghZHNnLT5tYXJrKQorICAgICAgICAgICAgcmV0dXJuIGVzY2xlbjsKKyAgICB9CiAKLQlTVEFURV9TRVRHKGRlc2lnbmF0aW9uLCBjaGFyc2V0KQotCSppbmxlZnQgLT0gZXNjbGVuOwotCSgqaW5idWYpICs9IGVzY2xlbjsKLQlyZXR1cm4gMDsKKyAgICBTVEFURV9TRVRHKGRlc2lnbmF0aW9uLCBjaGFyc2V0KQorICAgICppbmxlZnQgLT0gZXNjbGVuOworICAgICgqaW5idWYpICs9IGVzY2xlbjsKKyAgICByZXR1cm4gMDsKIH0KIAotI2RlZmluZSBJU084ODU5XzdfREVDT0RFKGMsIGFzc2kpCQkJCQlcCi0JaWYgKChjKSA8IDB4YTApIChhc3NpKSA9IChjKTsJCQkJCVwKLQllbHNlIGlmICgoYykgPCAweGMwICYmICgweDI4OGYzYmM5TCAmICgxTCA8PCAoKGMpLTB4YTApKSkpCVwKLQkJKGFzc2kpID0gKGMpOwkJCQkJCVwKLQllbHNlIGlmICgoYykgPj0gMHhiNCAmJiAoYykgPD0gMHhmZSAmJiAoKGMpID49IDB4ZDQgfHwJCVwKLQkJICgweGJmZmZmZDc3TCAmICgxTCA8PCAoKGMpLTB4YjQpKSkpKQkJCVwKLQkJKGFzc2kpID0gMHgwMmQwICsgKGMpOwkJCQkJXAotCWVsc2UgaWYgKChjKSA9PSAweGExKSAoYXNzaSkgPSAweDIwMTg7CQkJCVwKLQllbHNlIGlmICgoYykgPT0gMHhhMikgKGFzc2kpID0gMHgyMDE5OwkJCQlcCi0JZWxzZSBpZiAoKGMpID09IDB4YWYpIChhc3NpKSA9IDB4MjAxNTsKKyNkZWZpbmUgSVNPODg1OV83X0RFQ09ERShjLCBhc3NpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKGMpIDwgMHhhMCkgKGFzc2kpID0gKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPCAweGMwICYmICgweDI4OGYzYmM5TCAmICgxTCA8PCAoKGMpLTB4YTApKSkpICAgICAgICAgIFwKKyAgICAgICAgKGFzc2kpID0gKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPj0gMHhiNCAmJiAoYykgPD0gMHhmZSAmJiAoKGMpID49IDB4ZDQgfHwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAoMHhiZmZmZmQ3N0wgJiAoMUwgPDwgKChjKS0weGI0KSkpKSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGFzc2kpID0gMHgwMmQwICsgKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPT0gMHhhMSkgKGFzc2kpID0gMHgyMDE4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPT0gMHhhMikgKGFzc2kpID0gMHgyMDE5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPT0gMHhhZikgKGFzc2kpID0gMHgyMDE1OwogCiBzdGF0aWMgUHlfc3NpemVfdAogaXNvMjAyMnByb2Nlc3NnMihjb25zdCB2b2lkICpjb25maWcsIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCAqaW5sZWZ0LAotCQkgUHlfVU5JQ09ERSAqKm91dGJ1ZiwgUHlfc3NpemVfdCAqb3V0bGVmdCkKKyAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKmluYnVmLCBQeV9zc2l6ZV90ICppbmxlZnQsCisgICAgICAgICAgICAgICAgIFB5X1VOSUNPREUgKipvdXRidWYsIFB5X3NzaXplX3QgKm91dGxlZnQpCiB7Ci0JLyogbm90IHdyaXR0ZW4gdG8gdXNlIGVuY29kZXIsIGRlY29kZXIgZnVuY3Rpb25zIGJlY2F1c2Ugb25seSBmZXcKLQkgKiBlbmNvZGluZ3MgdXNlIEcyIGRlc2lnbmF0aW9ucyBpbiBDSktDb2RlY3MgKi8KLQlpZiAoU1RBVEVfRzIgPT0gQ0hBUlNFVF9JU084ODU5XzEpIHsKLQkJaWYgKElOMyA8IDB4ODApCi0JCQlPVVQxKElOMyArIDB4ODApCi0JCWVsc2UKLQkJCXJldHVybiAzOwotCX0KLQllbHNlIGlmIChTVEFURV9HMiA9PSBDSEFSU0VUX0lTTzg4NTlfNykgewotCQlJU084ODU5XzdfREVDT0RFKElOMyBeIDB4ODAsICoqb3V0YnVmKQotCQllbHNlIHJldHVybiAzOwotCX0KLQllbHNlIGlmIChTVEFURV9HMiA9PSBDSEFSU0VUX0FTQ0lJKSB7Ci0JCWlmIChJTjMgJiAweDgwKSByZXR1cm4gMzsKLQkJZWxzZSAqKm91dGJ1ZiA9IElOMzsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gTUJFUlJfSU5URVJOQUw7CisgICAgLyogbm90IHdyaXR0ZW4gdG8gdXNlIGVuY29kZXIsIGRlY29kZXIgZnVuY3Rpb25zIGJlY2F1c2Ugb25seSBmZXcKKyAgICAgKiBlbmNvZGluZ3MgdXNlIEcyIGRlc2lnbmF0aW9ucyBpbiBDSktDb2RlY3MgKi8KKyAgICBpZiAoU1RBVEVfRzIgPT0gQ0hBUlNFVF9JU084ODU5XzEpIHsKKyAgICAgICAgaWYgKElOMyA8IDB4ODApCisgICAgICAgICAgICBPVVQxKElOMyArIDB4ODApCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAzOworICAgIH0KKyAgICBlbHNlIGlmIChTVEFURV9HMiA9PSBDSEFSU0VUX0lTTzg4NTlfNykgeworICAgICAgICBJU084ODU5XzdfREVDT0RFKElOMyBeIDB4ODAsICoqb3V0YnVmKQorICAgICAgICBlbHNlIHJldHVybiAzOworICAgIH0KKyAgICBlbHNlIGlmIChTVEFURV9HMiA9PSBDSEFSU0VUX0FTQ0lJKSB7CisgICAgICAgIGlmIChJTjMgJiAweDgwKSByZXR1cm4gMzsKKyAgICAgICAgZWxzZSAqKm91dGJ1ZiA9IElOMzsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUJFUlJfSU5URVJOQUw7CiAKLQkoKmluYnVmKSArPSAzOwotCSppbmxlZnQgLT0gMzsKLQkoKm91dGJ1ZikgKz0gMTsKLQkqb3V0bGVmdCAtPSAxOwotCXJldHVybiAwOworICAgICgqaW5idWYpICs9IDM7CisgICAgKmlubGVmdCAtPSAzOworICAgICgqb3V0YnVmKSArPSAxOworICAgICpvdXRsZWZ0IC09IDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoaXNvMjAyMikKIHsKLQljb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnY2FjaGUgPSBOVUxMOworICAgIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uICpkc2djYWNoZSA9IE5VTEw7CiAKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7Ci0JCVB5X3NzaXplX3QgZXJyOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICAgICAgUHlfc3NpemVfdCBlcnI7CiAKLQkJaWYgKFNUQVRFX0dFVEZMQUcoRl9FU0NUSFJPVUdIT1VUKSkgewotCQkJLyogRVNDIHRocm91Z2hvdXQgbW9kZToKLQkJCSAqIGZvciBub24taXNvMjAyMiBlc2NhcGUgc2VxdWVuY2VzICovCi0JCQlXUklURTEoYykgLyogYXNzdW1lIGFzIElTTy04ODU5LTEgKi8KLQkJCU5FWFQoMSwgMSkKLQkJCWlmIChJU19FU0NFTkQoYykpIHsKLQkJCQlTVEFURV9DTEVBUkZMQUcoRl9FU0NUSFJPVUdIT1VUKQotCQkJfQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKFNUQVRFX0dFVEZMQUcoRl9FU0NUSFJPVUdIT1VUKSkgeworICAgICAgICAgICAgLyogRVNDIHRocm91Z2hvdXQgbW9kZToKKyAgICAgICAgICAgICAqIGZvciBub24taXNvMjAyMiBlc2NhcGUgc2VxdWVuY2VzICovCisgICAgICAgICAgICBXUklURTEoYykgLyogYXNzdW1lIGFzIElTTy04ODU5LTEgKi8KKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGlmIChJU19FU0NFTkQoYykpIHsKKyAgICAgICAgICAgICAgICBTVEFURV9DTEVBUkZMQUcoRl9FU0NUSFJPVUdIT1VUKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSBFU0M6Ci0JCQlSRVFVSVJFX0lOQlVGKDIpCi0JCQlpZiAoSVNfSVNPMjAyMkVTQyhJTjIpKSB7Ci0JCQkJZXJyID0gaXNvMjAyMnByb2Nlc3Nlc2MoY29uZmlnLCBzdGF0ZSwKLQkJCQkJCQlpbmJ1ZiwgJmlubGVmdCk7Ci0JCQkJaWYgKGVyciAhPSAwKQotCQkJCQlyZXR1cm4gZXJyOwotCQkJfQotCQkJZWxzZSBpZiAoQ09ORklHX0lTU0VUKFVTRV9HMikgJiYgSU4yID09ICdOJykgey8qIFNTMiAqLwotCQkJCVJFUVVJUkVfSU5CVUYoMykKLQkJCQllcnIgPSBpc28yMDIycHJvY2Vzc2cyKGNvbmZpZywgc3RhdGUsCi0JCQkJCWluYnVmLCAmaW5sZWZ0LCBvdXRidWYsICZvdXRsZWZ0KTsKLQkJCQlpZiAoZXJyICE9IDApCi0JCQkJCXJldHVybiBlcnI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlXUklURTEoRVNDKQotCQkJCVNUQVRFX1NFVEZMQUcoRl9FU0NUSFJPVUdIT1VUKQotCQkJCU5FWFQoMSwgMSkKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFNJOgotCQkJaWYgKENPTkZJR19JU1NFVChOT19TSElGVCkpCi0JCQkJZ290byBieXBhc3M7Ci0JCQlTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQotCQkJTkVYVF9JTigxKQotCQkJYnJlYWs7Ci0JCWNhc2UgU086Ci0JCQlpZiAoQ09ORklHX0lTU0VUKE5PX1NISUZUKSkKLQkJCQlnb3RvIGJ5cGFzczsKLQkJCVNUQVRFX1NFVEZMQUcoRl9TSElGVEVEKQotCQkJTkVYVF9JTigxKQotCQkJYnJlYWs7Ci0JCWNhc2UgTEY6Ci0JCQlTVEFURV9DTEVBUkZMQUcoRl9TSElGVEVEKQotCQkJV1JJVEUxKExGKQotCQkJTkVYVCgxLCAxKQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoYyA8IDB4MjApIC8qIEMwICovCi0JCQkJZ290byBieXBhc3M7Ci0JCQllbHNlIGlmIChjID49IDB4ODApCi0JCQkJcmV0dXJuIDE7Ci0JCQllbHNlIHsKLQkJCQljb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiAqZHNnOwotCQkJCXVuc2lnbmVkIGNoYXIgY2hhcnNldDsKLQkJCQl1Y3M0X3QgZGVjb2RlZDsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgRVNDOgorICAgICAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICAgICAgaWYgKElTX0lTTzIwMjJFU0MoSU4yKSkgeworICAgICAgICAgICAgICAgIGVyciA9IGlzbzIwMjJwcm9jZXNzZXNjKGNvbmZpZywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5idWYsICZpbmxlZnQpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKENPTkZJR19JU1NFVChVU0VfRzIpICYmIElOMiA9PSAnTicpIHsvKiBTUzIgKi8KKyAgICAgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDMpCisgICAgICAgICAgICAgICAgZXJyID0gaXNvMjAyMnByb2Nlc3NnMihjb25maWcsIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICBpbmJ1ZiwgJmlubGVmdCwgb3V0YnVmLCAmb3V0bGVmdCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgV1JJVEUxKEVTQykKKyAgICAgICAgICAgICAgICBTVEFURV9TRVRGTEFHKEZfRVNDVEhST1VHSE9VVCkKKyAgICAgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSToKKyAgICAgICAgICAgIGlmIChDT05GSUdfSVNTRVQoTk9fU0hJRlQpKQorICAgICAgICAgICAgICAgIGdvdG8gYnlwYXNzOworICAgICAgICAgICAgU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKKyAgICAgICAgICAgIE5FWFRfSU4oMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNPOgorICAgICAgICAgICAgaWYgKENPTkZJR19JU1NFVChOT19TSElGVCkpCisgICAgICAgICAgICAgICAgZ290byBieXBhc3M7CisgICAgICAgICAgICBTVEFURV9TRVRGTEFHKEZfU0hJRlRFRCkKKyAgICAgICAgICAgIE5FWFRfSU4oMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExGOgorICAgICAgICAgICAgU1RBVEVfQ0xFQVJGTEFHKEZfU0hJRlRFRCkKKyAgICAgICAgICAgIFdSSVRFMShMRikKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKGMgPCAweDIwKSAvKiBDMCAqLworICAgICAgICAgICAgICAgIGdvdG8gYnlwYXNzOworICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAweDgwKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gKmRzZzsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNoYXJzZXQ7CisgICAgICAgICAgICAgICAgdWNzNF90IGRlY29kZWQ7CiAKLQkJCQlpZiAoU1RBVEVfR0VURkxBRyhGX1NISUZURUQpKQotCQkJCQljaGFyc2V0ID0gU1RBVEVfRzE7Ci0JCQkJZWxzZQotCQkJCQljaGFyc2V0ID0gU1RBVEVfRzA7CisgICAgICAgICAgICAgICAgaWYgKFNUQVRFX0dFVEZMQUcoRl9TSElGVEVEKSkKKyAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IFNUQVRFX0cxOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IFNUQVRFX0cwOwogCi0JCQkJaWYgKGNoYXJzZXQgPT0gQ0hBUlNFVF9BU0NJSSkgewotYnlwYXNzOgkJCQkJV1JJVEUxKGMpCi0JCQkJCU5FWFQoMSwgMSkKLQkJCQkJYnJlYWs7Ci0JCQkJfQorICAgICAgICAgICAgICAgIGlmIChjaGFyc2V0ID09IENIQVJTRVRfQVNDSUkpIHsKK2J5cGFzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURTEoYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCWlmIChkc2djYWNoZSAhPSBOVUxMICYmCi0JCQkJICAgIGRzZ2NhY2hlLT5tYXJrID09IGNoYXJzZXQpCi0JCQkJCWRzZyA9IGRzZ2NhY2hlOwotCQkJCWVsc2UgewotCQkJCQlmb3IgKGRzZyA9IENPTkZJR19ERVNJR05BVElPTlM7Ci0JCQkJCSAgICAgZHNnLT5tYXJrICE9IGNoYXJzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzZ2NhY2hlICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzZ2NhY2hlLT5tYXJrID09IGNoYXJzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNnID0gZHNnY2FjaGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZHNnID0gQ09ORklHX0RFU0lHTkFUSU9OUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzZy0+bWFyayAhPSBjaGFyc2V0CiAjaWZkZWYgUHlfREVCVUcKLQkJCQkJCSYmIGRzZy0+bWFyayAhPSAnXDAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkc2ctPm1hcmsgIT0gJ1wwJwogI2VuZGlmCi0JCQkJCSAgICAgO2RzZysrKQotCQkJCQkJLyogbm9vcCAqLzsKLQkJCQkJYXNzZXJ0KGRzZy0+bWFyayAhPSAnXDAnKTsKLQkJCQkJZHNnY2FjaGUgPSBkc2c7Ci0JCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgO2RzZysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9vcCAqLzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZHNnLT5tYXJrICE9ICdcMCcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzZ2NhY2hlID0gZHNnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQlSRVFVSVJFX0lOQlVGKGRzZy0+d2lkdGgpCi0JCQkJZGVjb2RlZCA9IGRzZy0+ZGVjb2RlcigqaW5idWYpOwotCQkJCWlmIChkZWNvZGVkID09IE1BUF9VTk1BUFBBQkxFKQotCQkJCQlyZXR1cm4gZHNnLT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUlSRV9JTkJVRihkc2ctPndpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkID0gZHNnLT5kZWNvZGVyKCppbmJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVkID09IE1BUF9VTk1BUFBBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkc2ctPndpZHRoOwogCi0JCQkJaWYgKGRlY29kZWQgPCAweDEwMDAwKSB7Ci0JCQkJCVdSSVRFMShkZWNvZGVkKQotCQkJCQlORVhUX09VVCgxKQotCQkJCX0KLQkJCQllbHNlIGlmIChkZWNvZGVkIDwgMHgzMDAwMCkgewotCQkJCQlXUklURVVDUzQoZGVjb2RlZCkKLQkJCQl9Ci0JCQkJZWxzZSB7IC8qIEpJUyBYIDAyMTMgcGFpcnMgKi8KLQkJCQkJV1JJVEUyKGRlY29kZWQgPj4gMTYsIGRlY29kZWQgJiAweGZmZmYpCi0JCQkJCU5FWFRfT1VUKDIpCi0JCQkJfQotCQkJCU5FWFRfSU4oZHNnLT53aWR0aCkKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlZCA8IDB4MTAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklURTEoZGVjb2RlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVhUX09VVCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlY29kZWQgPCAweDMwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVEVVQ1M0KGRlY29kZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8qIEpJUyBYIDAyMTMgcGFpcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgV1JJVEUyKGRlY29kZWQgPj4gMTYsIGRlY29kZWQgJiAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDIpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE5FWFRfSU4oZHNnLT53aWR0aCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKi0qLSBtYXBwaW5nIHRhYmxlIGhvbGRlcnMgLSotKi8KQEAgLTU2Nyw1NDIgKzU2Nyw1NDIgQEAKIHN0YXRpYyBpbnQKIGtzeDEwMDFfaW5pdCh2b2lkKQogewotCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwogCi0JaWYgKCFpbml0aWFsaXplZCAmJiAoCi0JCQlJTVBPUlRfTUFQKGtyLCBjcDk0OSwgJmNwOTQ5X2VuY21hcCwgTlVMTCkgfHwKLQkJCUlNUE9SVF9NQVAoa3IsIGtzeDEwMDEsIE5VTEwsICZrc3gxMDAxX2RlY21hcCkpKQotCQlyZXR1cm4gLTE7Ci0JaW5pdGlhbGl6ZWQgPSAxOwotCXJldHVybiAwOworICAgIGlmICghaW5pdGlhbGl6ZWQgJiYgKAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGtyLCBjcDk0OSwgJmNwOTQ5X2VuY21hcCwgTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChrciwga3N4MTAwMSwgTlVMTCwgJmtzeDEwMDFfZGVjbWFwKSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpbml0aWFsaXplZCA9IDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1Y3M0X3QKIGtzeDEwMDFfZGVjb2Rlcihjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewotCXVjczRfdCB1OwotCVRSWU1BUF9ERUMoa3N4MTAwMSwgdSwgZGF0YVswXSwgZGF0YVsxXSkKLQkJcmV0dXJuIHU7Ci0JZWxzZQotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgdWNzNF90IHU7CisgICAgVFJZTUFQX0RFQyhrc3gxMDAxLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQorICAgICAgICByZXR1cm4gdTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIERCQ0hBUgoga3N4MTAwMV9lbmNvZGVyKGNvbnN0IHVjczRfdCAqZGF0YSwgUHlfc3NpemVfdCAqbGVuZ3RoKQogewotCURCQ0hBUiBjb2RlZDsKLQlhc3NlcnQoKmxlbmd0aCA9PSAxKTsKLQlpZiAoKmRhdGEgPCAweDEwMDAwKSB7Ci0JCVRSWU1BUF9FTkMoY3A5NDksIGNvZGVkLCAqZGF0YSkKLQkJCWlmICghKGNvZGVkICYgMHg4MDAwKSkKLQkJCQlyZXR1cm4gY29kZWQ7Ci0JfQotCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBEQkNIQVIgY29kZWQ7CisgICAgYXNzZXJ0KCpsZW5ndGggPT0gMSk7CisgICAgaWYgKCpkYXRhIDwgMHgxMDAwMCkgeworICAgICAgICBUUllNQVBfRU5DKGNwOTQ5LCBjb2RlZCwgKmRhdGEpCisgICAgICAgICAgICBpZiAoIShjb2RlZCAmIDB4ODAwMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVkOworICAgIH0KKyAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIHN0YXRpYyBpbnQKIGppc3gwMjA4X2luaXQodm9pZCkKIHsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAotCWlmICghaW5pdGlhbGl6ZWQgJiYgKAotCQkJSU1QT1JUX01BUChqcCwgamlzeGNvbW1vbiwgJmppc3hjb21tb25fZW5jbWFwLCBOVUxMKSB8fAotCQkJSU1QT1JUX01BUChqcCwgamlzeDAyMDgsIE5VTEwsICZqaXN4MDIwOF9kZWNtYXApKSkKLQkJcmV0dXJuIC0xOwotCWluaXRpYWxpemVkID0gMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkICYmICgKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeGNvbW1vbiwgJmppc3hjb21tb25fZW5jbWFwLCBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGpwLCBqaXN4MDIwOCwgTlVMTCwgJmppc3gwMjA4X2RlY21hcCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdWNzNF90CiBqaXN4MDIwOF9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JaWYgKGRhdGFbMF0gPT0gMHgyMSAmJiBkYXRhWzFdID09IDB4NDApIC8qIEYvVyBSRVZFUlNFIFNPTElEVVMgKi8KLQkJcmV0dXJuIDB4ZmYzYzsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMDgsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCi0JCXJldHVybiB1OwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHVjczRfdCB1OworICAgIGlmIChkYXRhWzBdID09IDB4MjEgJiYgZGF0YVsxXSA9PSAweDQwKSAvKiBGL1cgUkVWRVJTRSBTT0xJRFVTICovCisgICAgICAgIHJldHVybiAweGZmM2M7CisgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCB1LCBkYXRhWzBdLCBkYXRhWzFdKQorICAgICAgICByZXR1cm4gdTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMDhfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQ7Ci0JYXNzZXJ0KCpsZW5ndGggPT0gMSk7Ci0JaWYgKCpkYXRhIDwgMHgxMDAwMCkgewotCQlpZiAoKmRhdGEgPT0gMHhmZjNjKSAvKiBGL1cgUkVWRVJTRSBTT0xJRFVTICovCi0JCQlyZXR1cm4gMHgyMTQwOwotCQllbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZWQsICpkYXRhKSB7Ci0JCQlpZiAoIShjb2RlZCAmIDB4ODAwMCkpCi0JCQkJcmV0dXJuIGNvZGVkOwotCQl9Ci0JfQotCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBEQkNIQVIgY29kZWQ7CisgICAgYXNzZXJ0KCpsZW5ndGggPT0gMSk7CisgICAgaWYgKCpkYXRhIDwgMHgxMDAwMCkgeworICAgICAgICBpZiAoKmRhdGEgPT0gMHhmZjNjKSAvKiBGL1cgUkVWRVJTRSBTT0xJRFVTICovCisgICAgICAgICAgICByZXR1cm4gMHgyMTQwOworICAgICAgICBlbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZWQsICpkYXRhKSB7CisgICAgICAgICAgICBpZiAoIShjb2RlZCAmIDB4ODAwMCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIGludAogamlzeDAyMTJfaW5pdCh2b2lkKQogewotCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOwogCi0JaWYgKCFpbml0aWFsaXplZCAmJiAoCi0JCQlJTVBPUlRfTUFQKGpwLCBqaXN4Y29tbW9uLCAmamlzeGNvbW1vbl9lbmNtYXAsIE5VTEwpIHx8Ci0JCQlJTVBPUlRfTUFQKGpwLCBqaXN4MDIxMiwgTlVMTCwgJmppc3gwMjEyX2RlY21hcCkpKQotCQlyZXR1cm4gLTE7Ci0JaW5pdGlhbGl6ZWQgPSAxOwotCXJldHVybiAwOworICAgIGlmICghaW5pdGlhbGl6ZWQgJiYgKAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGpwLCBqaXN4Y29tbW9uLCAmamlzeGNvbW1vbl9lbmNtYXAsIE5VTEwpIHx8CisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoanAsIGppc3gwMjEyLCBOVUxMLCAmamlzeDAyMTJfZGVjbWFwKSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpbml0aWFsaXplZCA9IDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1Y3M0X3QKIGppc3gwMjEyX2RlY29kZXIoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKLQl1Y3M0X3QgdTsKLQlUUllNQVBfREVDKGppc3gwMjEyLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQotCQlyZXR1cm4gdTsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICB1Y3M0X3QgdTsKKyAgICBUUllNQVBfREVDKGppc3gwMjEyLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQorICAgICAgICByZXR1cm4gdTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTJfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQ7Ci0JYXNzZXJ0KCpsZW5ndGggPT0gMSk7Ci0JaWYgKCpkYXRhIDwgMHgxMDAwMCkgewotCQlUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGVkLCAqZGF0YSkgewotCQkJaWYgKGNvZGVkICYgMHg4MDAwKQotCQkJCXJldHVybiBjb2RlZCAmIDB4N2ZmZjsKLQkJfQotCX0KLQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgREJDSEFSIGNvZGVkOworICAgIGFzc2VydCgqbGVuZ3RoID09IDEpOworICAgIGlmICgqZGF0YSA8IDB4MTAwMDApIHsKKyAgICAgICAgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlZCwgKmRhdGEpIHsKKyAgICAgICAgICAgIGlmIChjb2RlZCAmIDB4ODAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29kZWQgJiAweDdmZmY7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwogfQogCiBzdGF0aWMgaW50CiBqaXN4MDIxM19pbml0KHZvaWQpCiB7Ci0Jc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CiAKLQlpZiAoIWluaXRpYWxpemVkICYmICgKLQkJCWppc3gwMjA4X2luaXQoKSB8fAotCQkJSU1QT1JUX01BUChqcCwgamlzeDAyMTNfYm1wLAotCQkJCSAgICZqaXN4MDIxM19ibXBfZW5jbWFwLCBOVUxMKSB8fAotCQkJSU1QT1JUX01BUChqcCwgamlzeDAyMTNfMV9ibXAsCi0JCQkJICAgTlVMTCwgJmppc3gwMjEzXzFfYm1wX2RlY21hcCkgfHwKLQkJCUlNUE9SVF9NQVAoanAsIGppc3gwMjEzXzJfYm1wLAotCQkJCSAgIE5VTEwsICZqaXN4MDIxM18yX2JtcF9kZWNtYXApIHx8Ci0JCQlJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM19lbXAsCi0JCQkJICAgJmppc3gwMjEzX2VtcF9lbmNtYXAsIE5VTEwpIHx8Ci0JCQlJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM18xX2VtcCwKLQkJCQkgICBOVUxMLCAmamlzeDAyMTNfMV9lbXBfZGVjbWFwKSB8fAotCQkJSU1QT1JUX01BUChqcCwgamlzeDAyMTNfMl9lbXAsCi0JCQkJICAgTlVMTCwgJmppc3gwMjEzXzJfZW1wX2RlY21hcCkgfHwKLQkJCUlNUE9SVF9NQVAoanAsIGppc3gwMjEzX3BhaXIsICZqaXN4MDIxM19wYWlyX2VuY21hcCwKLQkJCQkgICAmamlzeDAyMTNfcGFpcl9kZWNtYXApKSkKLQkJcmV0dXJuIC0xOwotCWluaXRpYWxpemVkID0gMTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkICYmICgKKyAgICAgICAgICAgICAgICAgICAgamlzeDAyMDhfaW5pdCgpIHx8CisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoanAsIGppc3gwMjEzX2JtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamlzeDAyMTNfYm1wX2VuY21hcCwgTlVMTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMTNfMV9ibXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmppc3gwMjEzXzFfYm1wX2RlY21hcCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMTNfMl9ibXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmppc3gwMjEzXzJfYm1wX2RlY21hcCkgfHwKKyAgICAgICAgICAgICAgICAgICAgSU1QT1JUX01BUChqcCwgamlzeDAyMTNfZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqaXN4MDIxM19lbXBfZW5jbWFwLCBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM18xX2VtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmamlzeDAyMTNfMV9lbXBfZGVjbWFwKSB8fAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM18yX2VtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmamlzeDAyMTNfMl9lbXBfZGVjbWFwKSB8fAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGpwLCBqaXN4MDIxM19wYWlyLCAmamlzeDAyMTNfcGFpcl9lbmNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmppc3gwMjEzX3BhaXJfZGVjbWFwKSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpbml0aWFsaXplZCA9IDE7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgY29uZmlnICgodm9pZCAqKTIwMDApCiBzdGF0aWMgdWNzNF90CiBqaXN4MDIxM18yMDAwXzFfZGVjb2Rlcihjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewotCXVjczRfdCB1OwotCUVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKHUsIGRhdGFbMF0sIGRhdGFbMV0pCi0JZWxzZSBpZiAoZGF0YVswXSA9PSAweDIxICYmIGRhdGFbMV0gPT0gMHg0MCkgLyogRi9XIFJFVkVSU0UgU09MSURVUyAqLwotCQlyZXR1cm4gMHhmZjNjOwotCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfYm1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9lbXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCi0JCXUgfD0gMHgyMDAwMDsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfcGFpciwgdSwgZGF0YVswXSwgZGF0YVsxXSk7Ci0JZWxzZQotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JcmV0dXJuIHU7CisgICAgdWNzNF90IHU7CisgICAgRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTEodSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICBlbHNlIGlmIChkYXRhWzBdID09IDB4MjEgJiYgZGF0YVsxXSA9PSAweDQwKSAvKiBGL1cgUkVWRVJTRSBTT0xJRFVTICovCisgICAgICAgIHJldHVybiAweGZmM2M7CisgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9ibXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2VtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgdSB8PSAweDIwMDAwOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM19wYWlyLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICByZXR1cm4gdTsKIH0KIAogc3RhdGljIHVjczRfdAogamlzeDAyMTNfMjAwMF8yX2RlY29kZXIoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKLQl1Y3M0X3QgdTsKLQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMih1LCBkYXRhWzBdLCBkYXRhWzFdKQotCVRSWU1BUF9ERUMoamlzeDAyMTNfMl9ibXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOwotCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2VtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSkKLQkJdSB8PSAweDIwMDAwOwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCXJldHVybiB1OworICAgIHVjczRfdCB1OworICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUyKHUsIGRhdGFbMF0sIGRhdGFbMV0pCisgICAgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2JtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7CisgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfZW1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQorICAgICAgICB1IHw9IDB4MjAwMDA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIHU7CiB9CiAjdW5kZWYgY29uZmlnCiAKIHN0YXRpYyB1Y3M0X3QKIGppc3gwMjEzXzIwMDRfMV9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JaWYgKGRhdGFbMF0gPT0gMHgyMSAmJiBkYXRhWzFdID09IDB4NDApIC8qIEYvVyBSRVZFUlNFIFNPTElEVVMgKi8KLQkJcmV0dXJuIDB4ZmYzYzsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMDgsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOwotCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2JtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSk7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfZW1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQotCQl1IHw9IDB4MjAwMDA7Ci0JZWxzZSBUUllNQVBfREVDKGppc3gwMjEzX3BhaXIsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCXJldHVybiB1OworICAgIHVjczRfdCB1OworICAgIGlmIChkYXRhWzBdID09IDB4MjEgJiYgZGF0YVsxXSA9PSAweDQwKSAvKiBGL1cgUkVWRVJTRSBTT0xJRFVTICovCisgICAgICAgIHJldHVybiAweGZmM2M7CisgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMV9ibXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2VtcCwgdSwgZGF0YVswXSwgZGF0YVsxXSkKKyAgICAgICAgdSB8PSAweDIwMDAwOworICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM19wYWlyLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICByZXR1cm4gdTsKIH0KIAogc3RhdGljIHVjczRfdAogamlzeDAyMTNfMjAwNF8yX2RlY29kZXIoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKLQl1Y3M0X3QgdTsKLQlUUllNQVBfREVDKGppc3gwMjEzXzJfYm1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKLQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9lbXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCi0JCXUgfD0gMHgyMDAwMDsKLQllbHNlCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQlyZXR1cm4gdTsKKyAgICB1Y3M0X3QgdTsKKyAgICBUUllNQVBfREVDKGppc3gwMjEzXzJfYm1wLCB1LCBkYXRhWzBdLCBkYXRhWzFdKTsKKyAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9lbXAsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCisgICAgICAgIHUgfD0gMHgyMDAwMDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICByZXR1cm4gdTsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTNfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCwgdm9pZCAqY29uZmlnKQogewotCURCQ0hBUiBjb2RlZDsKKyAgICBEQkNIQVIgY29kZWQ7CiAKLQlzd2l0Y2ggKCpsZW5ndGgpIHsKLQljYXNlIDE6IC8qIGZpcnN0IGNoYXJhY3RlciAqLwotCQlpZiAoKmRhdGEgPj0gMHgxMDAwMCkgewotCQkJaWYgKCgqZGF0YSkgPj4gMTYgPT0gMHgyMDAwMCA+PiAxNikgewotCQkJCUVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGNvZGVkLCAqZGF0YSkKLQkJCQllbHNlIFRSWU1BUF9FTkMoamlzeDAyMTNfZW1wLCBjb2RlZCwKLQkJCQkJCSgqZGF0YSkgJiAweGZmZmYpCi0JCQkJCXJldHVybiBjb2RlZDsKLQkJCX0KLQkJCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQkJfQorICAgIHN3aXRjaCAoKmxlbmd0aCkgeworICAgIGNhc2UgMTogLyogZmlyc3QgY2hhcmFjdGVyICovCisgICAgICAgIGlmICgqZGF0YSA+PSAweDEwMDAwKSB7CisgICAgICAgICAgICBpZiAoKCpkYXRhKSA+PiAxNiA9PSAweDIwMDAwID4+IDE2KSB7CisgICAgICAgICAgICAgICAgRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9FTVAoY29kZWQsICpkYXRhKQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19lbXAsIGNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRhdGEpICYgMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgICAgIH0KIAotCQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0JNUChjb2RlZCwgKmRhdGEpCi0JCWVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19ibXAsIGNvZGVkLCAqZGF0YSkgewotCQkJaWYgKGNvZGVkID09IE1VTFRJQykKLQkJCQlyZXR1cm4gTUFQX01VTFRJUExFX0FWQUlMOwotCQl9Ci0JCWVsc2UgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlZCwgKmRhdGEpIHsKLQkJCWlmIChjb2RlZCAmIDB4ODAwMCkKLQkJCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwotCQlyZXR1cm4gY29kZWQ7Ci0JY2FzZSAyOiAvKiBzZWNvbmQgY2hhcmFjdGVyIG9mIHVuaWNvZGUgcGFpciAqLwotCQljb2RlZCA9IGZpbmRfcGFpcmVuY21hcCgodWNzMl90KWRhdGFbMF0sICh1Y3MyX3QpZGF0YVsxXSwKLQkJCQlqaXN4MDIxM19wYWlyX2VuY21hcCwgSklTWDAyMTNfRU5DUEFJUlMpOwotCQlpZiAoY29kZWQgPT0gREJDSU5WKSB7Ci0JCQkqbGVuZ3RoID0gMTsKLQkJCWNvZGVkID0gZmluZF9wYWlyZW5jbWFwKCh1Y3MyX3QpZGF0YVswXSwgMCwKLQkJCQkgIGppc3gwMjEzX3BhaXJfZW5jbWFwLCBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCQlpZiAoY29kZWQgPT0gREJDSU5WKQotCQkJCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gY29kZWQ7Ci0JY2FzZSAtMTogLyogZmx1c2ggdW50ZXJtaW5hdGVkICovCi0JCSpsZW5ndGggPSAxOwotCQljb2RlZCA9IGZpbmRfcGFpcmVuY21hcCgodWNzMl90KWRhdGFbMF0sIDAsCi0JCQkJamlzeDAyMTNfcGFpcl9lbmNtYXAsIEpJU1gwMjEzX0VOQ1BBSVJTKTsKLQkJaWYgKGNvZGVkID09IERCQ0lOVikKLQkJCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQkJZWxzZQotCQkJcmV0dXJuIGNvZGVkOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQl9CisgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfQk1QKGNvZGVkLCAqZGF0YSkKKyAgICAgICAgZWxzZSBUUllNQVBfRU5DKGppc3gwMjEzX2JtcCwgY29kZWQsICpkYXRhKSB7CisgICAgICAgICAgICBpZiAoY29kZWQgPT0gTVVMVElDKQorICAgICAgICAgICAgICAgIHJldHVybiBNQVBfTVVMVElQTEVfQVZBSUw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGVkLCAqZGF0YSkgeworICAgICAgICAgICAgaWYgKGNvZGVkICYgMHg4MDAwKQorICAgICAgICAgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICBjYXNlIDI6IC8qIHNlY29uZCBjaGFyYWN0ZXIgb2YgdW5pY29kZSBwYWlyICovCisgICAgICAgIGNvZGVkID0gZmluZF9wYWlyZW5jbWFwKCh1Y3MyX3QpZGF0YVswXSwgKHVjczJfdClkYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgamlzeDAyMTNfcGFpcl9lbmNtYXAsIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgaWYgKGNvZGVkID09IERCQ0lOVikgeworICAgICAgICAgICAgKmxlbmd0aCA9IDE7CisgICAgICAgICAgICBjb2RlZCA9IGZpbmRfcGFpcmVuY21hcCgodWNzMl90KWRhdGFbMF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgamlzeDAyMTNfcGFpcl9lbmNtYXAsIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgICAgIGlmIChjb2RlZCA9PSBEQkNJTlYpCisgICAgICAgICAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICBjYXNlIC0xOiAvKiBmbHVzaCB1bnRlcm1pbmF0ZWQgKi8KKyAgICAgICAgKmxlbmd0aCA9IDE7CisgICAgICAgIGNvZGVkID0gZmluZF9wYWlyZW5jbWFwKCh1Y3MyX3QpZGF0YVswXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGppc3gwMjEzX3BhaXJfZW5jbWFwLCBKSVNYMDIxM19FTkNQQUlSUyk7CisgICAgICAgIGlmIChjb2RlZCA9PSBEQkNJTlYpCisgICAgICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgfQogfQogCiBzdGF0aWMgREJDSEFSCiBqaXN4MDIxM18yMDAwXzFfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQgPSBqaXN4MDIxM19lbmNvZGVyKGRhdGEsIGxlbmd0aCwgKHZvaWQgKikyMDAwKTsKLQlpZiAoY29kZWQgPT0gTUFQX1VOTUFQUEFCTEUgfHwgY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQotCQlyZXR1cm4gY29kZWQ7Ci0JZWxzZSBpZiAoY29kZWQgJiAweDgwMDApCi0JCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQllbHNlCi0JCXJldHVybiBjb2RlZDsKKyAgICBEQkNIQVIgY29kZWQgPSBqaXN4MDIxM19lbmNvZGVyKGRhdGEsIGxlbmd0aCwgKHZvaWQgKikyMDAwKTsKKyAgICBpZiAoY29kZWQgPT0gTUFQX1VOTUFQUEFCTEUgfHwgY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQorICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgZWxzZSBpZiAoY29kZWQgJiAweDgwMDApCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBjb2RlZDsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMTNfMjAwMF8xX2VuY29kZXJfcGFpcm9ubHkoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkOwotCVB5X3NzaXplX3QgaWxlbmd0aCA9ICpsZW5ndGg7CisgICAgREJDSEFSIGNvZGVkOworICAgIFB5X3NzaXplX3QgaWxlbmd0aCA9ICpsZW5ndGg7CiAKLQljb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCAodm9pZCAqKTIwMDApOwotCXN3aXRjaCAoaWxlbmd0aCkgewotCWNhc2UgMToKLQkJaWYgKGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKLQkJCXJldHVybiBNQVBfTVVMVElQTEVfQVZBSUw7Ci0JCWVsc2UKLQkJCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQljYXNlIDI6Ci0JCWlmICgqbGVuZ3RoICE9IDIpCi0JCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JCWVsc2UKLQkJCXJldHVybiBjb2RlZDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JfQorICAgIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsICh2b2lkICopMjAwMCk7CisgICAgc3dpdGNoIChpbGVuZ3RoKSB7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoY29kZWQgPT0gTUFQX01VTFRJUExFX0FWQUlMKQorICAgICAgICAgICAgcmV0dXJuIE1BUF9NVUxUSVBMRV9BVkFJTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKCpsZW5ndGggIT0gMikKKyAgICAgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGNvZGVkOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICB9CiB9CiAKIHN0YXRpYyBEQkNIQVIKIGppc3gwMjEzXzIwMDBfMl9lbmNvZGVyKGNvbnN0IHVjczRfdCAqZGF0YSwgUHlfc3NpemVfdCAqbGVuZ3RoKQogewotCURCQ0hBUiBjb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCAodm9pZCAqKTIwMDApOwotCWlmIChjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSB8fCBjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCi0JCXJldHVybiBjb2RlZDsKLQllbHNlIGlmIChjb2RlZCAmIDB4ODAwMCkKLQkJcmV0dXJuIGNvZGVkICYgMHg3ZmZmOwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIERCQ0hBUiBjb2RlZCA9IGppc3gwMjEzX2VuY29kZXIoZGF0YSwgbGVuZ3RoLCAodm9pZCAqKTIwMDApOworICAgIGlmIChjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSB8fCBjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCisgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICBlbHNlIGlmIChjb2RlZCAmIDB4ODAwMCkKKyAgICAgICAgcmV0dXJuIGNvZGVkICYgMHg3ZmZmOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwogfQogCiBzdGF0aWMgREJDSEFSCiBqaXN4MDIxM18yMDA0XzFfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQgPSBqaXN4MDIxM19lbmNvZGVyKGRhdGEsIGxlbmd0aCwgTlVMTCk7Ci0JaWYgKGNvZGVkID09IE1BUF9VTk1BUFBBQkxFIHx8IGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKLQkJcmV0dXJuIGNvZGVkOwotCWVsc2UgaWYgKGNvZGVkICYgMHg4MDAwKQotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JZWxzZQotCQlyZXR1cm4gY29kZWQ7CisgICAgREJDSEFSIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsIE5VTEwpOworICAgIGlmIChjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSB8fCBjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCisgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICBlbHNlIGlmIChjb2RlZCAmIDB4ODAwMCkKKyAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGNvZGVkOwogfQogCiBzdGF0aWMgREJDSEFSCiBqaXN4MDIxM18yMDA0XzFfZW5jb2Rlcl9wYWlyb25seShjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQ7Ci0JUHlfc3NpemVfdCBpbGVuZ3RoID0gKmxlbmd0aDsKKyAgICBEQkNIQVIgY29kZWQ7CisgICAgUHlfc3NpemVfdCBpbGVuZ3RoID0gKmxlbmd0aDsKIAotCWNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsIE5VTEwpOwotCXN3aXRjaCAoaWxlbmd0aCkgewotCWNhc2UgMToKLQkJaWYgKGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKLQkJCXJldHVybiBNQVBfTVVMVElQTEVfQVZBSUw7Ci0JCWVsc2UKLQkJCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQljYXNlIDI6Ci0JCWlmICgqbGVuZ3RoICE9IDIpCi0JCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JCWVsc2UKLQkJCXJldHVybiBjb2RlZDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JfQorICAgIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsIE5VTEwpOworICAgIHN3aXRjaCAoaWxlbmd0aCkgeworICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKKyAgICAgICAgICAgIHJldHVybiBNQVBfTVVMVElQTEVfQVZBSUw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmICgqbGVuZ3RoICE9IDIpCisgICAgICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgfQogfQogCiBzdGF0aWMgREJDSEFSCiBqaXN4MDIxM18yMDA0XzJfZW5jb2Rlcihjb25zdCB1Y3M0X3QgKmRhdGEsIFB5X3NzaXplX3QgKmxlbmd0aCkKIHsKLQlEQkNIQVIgY29kZWQgPSBqaXN4MDIxM19lbmNvZGVyKGRhdGEsIGxlbmd0aCwgTlVMTCk7Ci0JaWYgKGNvZGVkID09IE1BUF9VTk1BUFBBQkxFIHx8IGNvZGVkID09IE1BUF9NVUxUSVBMRV9BVkFJTCkKLQkJcmV0dXJuIGNvZGVkOwotCWVsc2UgaWYgKGNvZGVkICYgMHg4MDAwKQotCQlyZXR1cm4gY29kZWQgJiAweDdmZmY7Ci0JZWxzZQotCQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgREJDSEFSIGNvZGVkID0gamlzeDAyMTNfZW5jb2RlcihkYXRhLCBsZW5ndGgsIE5VTEwpOworICAgIGlmIChjb2RlZCA9PSBNQVBfVU5NQVBQQUJMRSB8fCBjb2RlZCA9PSBNQVBfTVVMVElQTEVfQVZBSUwpCisgICAgICAgIHJldHVybiBjb2RlZDsKKyAgICBlbHNlIGlmIChjb2RlZCAmIDB4ODAwMCkKKyAgICAgICAgcmV0dXJuIGNvZGVkICYgMHg3ZmZmOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwogfQogCiBzdGF0aWMgdWNzNF90CiBqaXN4MDIwMV9yX2RlY29kZXIoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKLQl1Y3M0X3QgdTsKLQlKSVNYMDIwMV9SX0RFQ09ERSgqZGF0YSwgdSkKLQllbHNlIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQlyZXR1cm4gdTsKKyAgICB1Y3M0X3QgdTsKKyAgICBKSVNYMDIwMV9SX0RFQ09ERSgqZGF0YSwgdSkKKyAgICBlbHNlIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICByZXR1cm4gdTsKIH0KIAogc3RhdGljIERCQ0hBUgogamlzeDAyMDFfcl9lbmNvZGVyKGNvbnN0IHVjczRfdCAqZGF0YSwgUHlfc3NpemVfdCAqbGVuZ3RoKQogewotCURCQ0hBUiBjb2RlZDsKLQlKSVNYMDIwMV9SX0VOQ09ERSgqZGF0YSwgY29kZWQpCi0JZWxzZSByZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JcmV0dXJuIGNvZGVkOworICAgIERCQ0hBUiBjb2RlZDsKKyAgICBKSVNYMDIwMV9SX0VOQ09ERSgqZGF0YSwgY29kZWQpCisgICAgZWxzZSByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIGNvZGVkOwogfQogCiBzdGF0aWMgdWNzNF90CiBqaXN4MDIwMV9rX2RlY29kZXIoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKLQl1Y3M0X3QgdTsKLQlKSVNYMDIwMV9LX0RFQ09ERSgqZGF0YSBeIDB4ODAsIHUpCi0JZWxzZSByZXR1cm4gTUFQX1VOTUFQUEFCTEU7Ci0JcmV0dXJuIHU7CisgICAgdWNzNF90IHU7CisgICAgSklTWDAyMDFfS19ERUNPREUoKmRhdGEgXiAweDgwLCB1KQorICAgIGVsc2UgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHJldHVybiB1OwogfQogCiBzdGF0aWMgREJDSEFSCiBqaXN4MDIwMV9rX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkOwotCUpJU1gwMjAxX0tfRU5DT0RFKCpkYXRhLCBjb2RlZCkKLQllbHNlIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKLQlyZXR1cm4gY29kZWQgLSAweDgwOworICAgIERCQ0hBUiBjb2RlZDsKKyAgICBKSVNYMDIwMV9LX0VOQ09ERSgqZGF0YSwgY29kZWQpCisgICAgZWxzZSByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIGNvZGVkIC0gMHg4MDsKIH0KIAogc3RhdGljIGludAogZ2IyMzEyX2luaXQodm9pZCkKIHsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKIAotCWlmICghaW5pdGlhbGl6ZWQgJiYgKAotCQkJSU1QT1JUX01BUChjbiwgZ2Jjb21tb24sICZnYmNvbW1vbl9lbmNtYXAsIE5VTEwpIHx8Ci0JCQlJTVBPUlRfTUFQKGNuLCBnYjIzMTIsIE5VTEwsICZnYjIzMTJfZGVjbWFwKSkpCi0JCXJldHVybiAtMTsKLQlpbml0aWFsaXplZCA9IDE7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFpbml0aWFsaXplZCAmJiAoCisgICAgICAgICAgICAgICAgICAgIElNUE9SVF9NQVAoY24sIGdiY29tbW9uLCAmZ2Jjb21tb25fZW5jbWFwLCBOVUxMKSB8fAorICAgICAgICAgICAgICAgICAgICBJTVBPUlRfTUFQKGNuLCBnYjIzMTIsIE5VTEwsICZnYjIzMTJfZGVjbWFwKSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpbml0aWFsaXplZCA9IDE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1Y3M0X3QKIGdiMjMxMl9kZWNvZGVyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCiB7Ci0JdWNzNF90IHU7Ci0JVFJZTUFQX0RFQyhnYjIzMTIsIHUsIGRhdGFbMF0sIGRhdGFbMV0pCi0JCXJldHVybiB1OwotCWVsc2UKLQkJcmV0dXJuIE1BUF9VTk1BUFBBQkxFOworICAgIHVjczRfdCB1OworICAgIFRSWU1BUF9ERUMoZ2IyMzEyLCB1LCBkYXRhWzBdLCBkYXRhWzFdKQorICAgICAgICByZXR1cm4gdTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNQVBfVU5NQVBQQUJMRTsKIH0KIAogc3RhdGljIERCQ0hBUgogZ2IyMzEyX2VuY29kZXIoY29uc3QgdWNzNF90ICpkYXRhLCBQeV9zc2l6ZV90ICpsZW5ndGgpCiB7Ci0JREJDSEFSIGNvZGVkOwotCWFzc2VydCgqbGVuZ3RoID09IDEpOwotCWlmICgqZGF0YSA8IDB4MTAwMDApIHsKLQkJVFJZTUFQX0VOQyhnYmNvbW1vbiwgY29kZWQsICpkYXRhKSB7Ci0JCQlpZiAoIShjb2RlZCAmIDB4ODAwMCkpCi0JCQkJcmV0dXJuIGNvZGVkOwotCQl9Ci0JfQotCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICBEQkNIQVIgY29kZWQ7CisgICAgYXNzZXJ0KCpsZW5ndGggPT0gMSk7CisgICAgaWYgKCpkYXRhIDwgMHgxMDAwMCkgeworICAgICAgICBUUllNQVBfRU5DKGdiY29tbW9uLCBjb2RlZCwgKmRhdGEpIHsKKyAgICAgICAgICAgIGlmICghKGNvZGVkICYgMHg4MDAwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29kZWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwogfQogCiAKIHN0YXRpYyB1Y3M0X3QKIGR1bW15X2RlY29kZXIoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKLQlyZXR1cm4gTUFQX1VOTUFQUEFCTEU7CisgICAgcmV0dXJuIE1BUF9VTk1BUFBBQkxFOwogfQogCiBzdGF0aWMgREJDSEFSCiBkdW1teV9lbmNvZGVyKGNvbnN0IHVjczRfdCAqZGF0YSwgUHlfc3NpemVfdCAqbGVuZ3RoKQogewotCXJldHVybiBNQVBfVU5NQVBQQUJMRTsKKyAgICByZXR1cm4gTUFQX1VOTUFQUEFCTEU7CiB9CiAKIC8qLSotIHJlZ2lzdHJ5IHRhYmxlcyAtKi0qLwogCi0jZGVmaW5lIFJFR0lTVFJZX0tTWDEwMDFfRzAJeyBDSEFSU0VUX0tTWDEwMDEsIDAsIDIsCQlcCi0JCQkJICBrc3gxMDAxX2luaXQsCQkJCVwKLQkJCQkgIGtzeDEwMDFfZGVjb2Rlciwga3N4MTAwMV9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfS1NYMTAwMV9HMQl7IENIQVJTRVRfS1NYMTAwMSwgMSwgMiwJCVwKLQkJCQkgIGtzeDEwMDFfaW5pdCwJCQkJXAotCQkJCSAga3N4MTAwMV9kZWNvZGVyLCBrc3gxMDAxX2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIwMV9SCXsgQ0hBUlNFVF9KSVNYMDIwMV9SLCAwLCAxLAkJXAotCQkJCSAgTlVMTCwJCQkJCVwKLQkJCQkgIGppc3gwMjAxX3JfZGVjb2RlciwgamlzeDAyMDFfcl9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfSklTWDAyMDFfSwl7IENIQVJTRVRfSklTWDAyMDFfSywgMCwgMSwJCVwKLQkJCQkgIE5VTEwsCQkJCQlcCi0JCQkJICBqaXN4MDIwMV9rX2RlY29kZXIsIGppc3gwMjAxX2tfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjA4CXsgQ0hBUlNFVF9KSVNYMDIwOCwgMCwgMiwJCVwKLQkJCQkgIGppc3gwMjA4X2luaXQsCQkJXAotCQkJCSAgamlzeDAyMDhfZGVjb2RlciwgamlzeDAyMDhfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjA4X08JeyBDSEFSU0VUX0pJU1gwMjA4X08sIDAsIDIsCQlcCi0JCQkJICBqaXN4MDIwOF9pbml0LAkJCVwKLQkJCQkgIGppc3gwMjA4X2RlY29kZXIsIGppc3gwMjA4X2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxMgl7IENIQVJTRVRfSklTWDAyMTIsIDAsIDIsCQlcCi0JCQkJICBqaXN4MDIxMl9pbml0LAkJCVwKLQkJCQkgIGppc3gwMjEyX2RlY29kZXIsIGppc3gwMjEyX2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxM18yMDAwXzEgeyBDSEFSU0VUX0pJU1gwMjEzXzIwMDBfMSwgMCwgMiwJXAotCQkJCSAgamlzeDAyMTNfaW5pdCwJCQlcCi0JCQkJICBqaXN4MDIxM18yMDAwXzFfZGVjb2RlciwJCVwKLQkJCQkgIGppc3gwMjEzXzIwMDBfMV9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfS1NYMTAwMV9HMCAgICAgeyBDSEFSU0VUX0tTWDEwMDEsIDAsIDIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGtzeDEwMDFfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGtzeDEwMDFfZGVjb2Rlciwga3N4MTAwMV9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfS1NYMTAwMV9HMSAgICAgeyBDSEFSU0VUX0tTWDEwMDEsIDEsIDIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGtzeDEwMDFfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGtzeDEwMDFfZGVjb2Rlciwga3N4MTAwMV9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMDFfUiAgICAgeyBDSEFSU0VUX0pJU1gwMjAxX1IsIDAsIDEsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjAxX3JfZGVjb2RlciwgamlzeDAyMDFfcl9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMDFfSyAgICAgeyBDSEFSU0VUX0pJU1gwMjAxX0ssIDAsIDEsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjAxX2tfZGVjb2RlciwgamlzeDAyMDFfa19lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMDggICAgICAgeyBDSEFSU0VUX0pJU1gwMjA4LCAwLCAyLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjA4X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjA4X2RlY29kZXIsIGppc3gwMjA4X2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIwOF9PICAgICB7IENIQVJTRVRfSklTWDAyMDhfTywgMCwgMiwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMDhfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMDhfZGVjb2RlciwgamlzeDAyMDhfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEyICAgICAgIHsgQ0hBUlNFVF9KSVNYMDIxMiwgMCwgMiwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxMl9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBqaXN4MDIxMl9kZWNvZGVyLCBqaXN4MDIxMl9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwMF8xIHsgQ0hBUlNFVF9KSVNYMDIxM18yMDAwXzEsIDAsIDIsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDBfMV9kZWNvZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDBfMV9lbmNvZGVyIH0KICNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwMF8xX1BBSVJPTkxZIHsgQ0hBUlNFVF9KSVNYMDIxM18yMDAwXzEsIDAsIDIsIFwKLQkJCQkgIGppc3gwMjEzX2luaXQsCQkJXAotCQkJCSAgamlzeDAyMTNfMjAwMF8xX2RlY29kZXIsCQlcCi0JCQkJICBqaXN4MDIxM18yMDAwXzFfZW5jb2Rlcl9wYWlyb25seSB9Ci0jZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMiB7IENIQVJTRVRfSklTWDAyMTNfMiwgMCwgMiwJCVwKLQkJCQkgIGppc3gwMjEzX2luaXQsCQkJXAotCQkJCSAgamlzeDAyMTNfMjAwMF8yX2RlY29kZXIsCQlcCi0JCQkJICBqaXN4MDIxM18yMDAwXzJfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMSB7IENIQVJTRVRfSklTWDAyMTNfMjAwNF8xLCAwLCAyLAlcCi0JCQkJICBqaXN4MDIxM19pbml0LAkJCVwKLQkJCQkgIGppc3gwMjEzXzIwMDRfMV9kZWNvZGVyLAkJXAotCQkJCSAgamlzeDAyMTNfMjAwNF8xX2VuY29kZXIgfQorICAgICAgICAgICAgICAgICAgamlzeDAyMTNfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTNfMjAwMF8xX2RlY29kZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTNfMjAwMF8xX2VuY29kZXJfcGFpcm9ubHkgfQorI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxM18yMDAwXzIgeyBDSEFSU0VUX0pJU1gwMjEzXzIsIDAsIDIsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTNfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTNfMjAwMF8yX2RlY29kZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTNfMjAwMF8yX2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxM18yMDA0XzEgeyBDSEFSU0VUX0pJU1gwMjEzXzIwMDRfMSwgMCwgMiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTNfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTNfMjAwNF8xX2RlY29kZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgamlzeDAyMTNfMjAwNF8xX2VuY29kZXIgfQogI2RlZmluZSBSRUdJU1RSWV9KSVNYMDIxM18yMDA0XzFfUEFJUk9OTFkgeyBDSEFSU0VUX0pJU1gwMjEzXzIwMDRfMSwgMCwgMiwgXAotCQkJCSAgamlzeDAyMTNfaW5pdCwJCQlcCi0JCQkJICBqaXN4MDIxM18yMDA0XzFfZGVjb2RlciwJCVwKLQkJCQkgIGppc3gwMjEzXzIwMDRfMV9lbmNvZGVyX3BhaXJvbmx5IH0KLSNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwNF8yIHsgQ0hBUlNFVF9KSVNYMDIxM18yLCAwLCAyLAkJXAotCQkJCSAgamlzeDAyMTNfaW5pdCwJCQlcCi0JCQkJICBqaXN4MDIxM18yMDA0XzJfZGVjb2RlciwJCVwKLQkJCQkgIGppc3gwMjEzXzIwMDRfMl9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfR0IyMzEyCQl7IENIQVJTRVRfR0IyMzEyLCAwLCAyLAkJCVwKLQkJCQkgIGdiMjMxMl9pbml0LAkJCQlcCi0JCQkJICBnYjIzMTJfZGVjb2RlciwgZ2IyMzEyX2VuY29kZXIgfQotI2RlZmluZSBSRUdJU1RSWV9DTlMxMTY0M18xCXsgQ0hBUlNFVF9DTlMxMTY0M18xLCAxLCAyLAkJXAotCQkJCSAgY25zMTE2NDNfaW5pdCwJCQlcCi0JCQkJICBjbnMxMTY0M18xX2RlY29kZXIsIGNuczExNjQzXzFfZW5jb2RlciB9Ci0jZGVmaW5lIFJFR0lTVFJZX0NOUzExNjQzXzIJeyBDSEFSU0VUX0NOUzExNjQzXzIsIDIsIDIsCQlcCi0JCQkJICBjbnMxMTY0M19pbml0LAkJCVwKLQkJCQkgIGNuczExNjQzXzJfZGVjb2RlciwgY25zMTE2NDNfMl9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfSVNPODg1OV8xCXsgQ0hBUlNFVF9JU084ODU5XzEsIDIsIDEsCQlcCi0JCQkJICBOVUxMLCBkdW1teV9kZWNvZGVyLCBkdW1teV9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfSVNPODg1OV83CXsgQ0hBUlNFVF9JU084ODU5XzcsIDIsIDEsCQlcCi0JCQkJICBOVUxMLCBkdW1teV9kZWNvZGVyLCBkdW1teV9lbmNvZGVyIH0KLSNkZWZpbmUgUkVHSVNUUllfU0VOVElORUwJeyAwLCB9Ci0jZGVmaW5lIENPTkZJR0RFRih2YXIsIGF0dHJzKQkJCQkJCVwKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGlzbzIwMjJfY29uZmlnIGlzbzIwMjJfIyN2YXIjI19jb25maWcgPSB7CVwKLQkJYXR0cnMsIGlzbzIwMjJfIyN2YXIjI19kZXNpZ25hdGlvbnMJCQlcCi0JfTsKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDRfMV9kZWNvZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDRfMV9lbmNvZGVyX3BhaXJvbmx5IH0KKyNkZWZpbmUgUkVHSVNUUllfSklTWDAyMTNfMjAwNF8yIHsgQ0hBUlNFVF9KSVNYMDIxM18yLCAwLCAyLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDRfMl9kZWNvZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGppc3gwMjEzXzIwMDRfMl9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfR0IyMzEyICAgICAgICAgeyBDSEFSU0VUX0dCMjMxMiwgMCwgMiwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGdiMjMxMl9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIGdiMjMxMl9kZWNvZGVyLCBnYjIzMTJfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0NOUzExNjQzXzEgICAgIHsgQ0hBUlNFVF9DTlMxMTY0M18xLCAxLCAyLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBjbnMxMTY0M19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBjbnMxMTY0M18xX2RlY29kZXIsIGNuczExNjQzXzFfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0NOUzExNjQzXzIgICAgIHsgQ0hBUlNFVF9DTlMxMTY0M18yLCAyLCAyLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBjbnMxMTY0M19pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBjbnMxMTY0M18yX2RlY29kZXIsIGNuczExNjQzXzJfZW5jb2RlciB9CisjZGVmaW5lIFJFR0lTVFJZX0lTTzg4NTlfMSAgICAgIHsgQ0hBUlNFVF9JU084ODU5XzEsIDIsIDEsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICBOVUxMLCBkdW1teV9kZWNvZGVyLCBkdW1teV9lbmNvZGVyIH0KKyNkZWZpbmUgUkVHSVNUUllfSVNPODg1OV83ICAgICAgeyBDSEFSU0VUX0lTTzg4NTlfNywgMiwgMSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIE5VTEwsIGR1bW15X2RlY29kZXIsIGR1bW15X2VuY29kZXIgfQorI2RlZmluZSBSRUdJU1RSWV9TRU5USU5FTCAgICAgICB7IDAsIH0KKyNkZWZpbmUgQ09ORklHREVGKHZhciwgYXR0cnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IGlzbzIwMjJfY29uZmlnIGlzbzIwMjJfIyN2YXIjI19jb25maWcgPSB7ICAgICAgIFwKKyAgICAgICAgYXR0cnMsIGlzbzIwMjJfIyN2YXIjI19kZXNpZ25hdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gaXNvMjAyMl9rcl9kZXNpZ25hdGlvbnNbXSA9IHsKLQlSRUdJU1RSWV9LU1gxMDAxX0cxLCBSRUdJU1RSWV9TRU5USU5FTAorICAgIFJFR0lTVFJZX0tTWDEwMDFfRzEsIFJFR0lTVFJZX1NFTlRJTkVMCiB9OwogQ09ORklHREVGKGtyLCAwKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlzbzIwMjJfZGVzaWduYXRpb24gaXNvMjAyMl9qcF9kZXNpZ25hdGlvbnNbXSA9IHsKLQlSRUdJU1RSWV9KSVNYMDIwOCwgUkVHSVNUUllfSklTWDAyMDFfUiwgUkVHSVNUUllfSklTWDAyMDhfTywKLQlSRUdJU1RSWV9TRU5USU5FTAorICAgIFJFR0lTVFJZX0pJU1gwMjA4LCBSRUdJU1RSWV9KSVNYMDIwMV9SLCBSRUdJU1RSWV9KSVNYMDIwOF9PLAorICAgIFJFR0lTVFJZX1NFTlRJTkVMCiB9OwogQ09ORklHREVGKGpwLCBOT19TSElGVCB8IFVTRV9KSVNYMDIwOF9FWFQpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXNvMjAyMl9kZXNpZ25hdGlvbiBpc28yMDIyX2pwXzFfZGVzaWduYXRpb25zW10gPSB7Ci0JUkVHSVNUUllfSklTWDAyMDgsIFJFR0lTVFJZX0pJU1gwMjEyLCBSRUdJU1RSWV9KSVNYMDIwMV9SLAotCVJFR0lTVFJZX0pJU1gwMjA4X08sIFJFR0lTVFJZX1NFTlRJTkVMCisgICAgUkVHSVNUUllfSklTWDAyMDgsIFJFR0lTVFJZX0pJU1gwMjEyLCBSRUdJU1RSWV9KSVNYMDIwMV9SLAorICAgIFJFR0lTVFJZX0pJU1gwMjA4X08sIFJFR0lTVFJZX1NFTlRJTkVMCiB9OwogQ09ORklHREVGKGpwXzEsIE5PX1NISUZUIHwgVVNFX0pJU1gwMjA4X0VYVCkKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uIGlzbzIwMjJfanBfMl9kZXNpZ25hdGlvbnNbXSA9IHsKLQlSRUdJU1RSWV9KSVNYMDIwOCwgUkVHSVNUUllfSklTWDAyMTIsIFJFR0lTVFJZX0tTWDEwMDFfRzAsCi0JUkVHSVNUUllfR0IyMzEyLCBSRUdJU1RSWV9KSVNYMDIwMV9SLCBSRUdJU1RSWV9KSVNYMDIwOF9PLAotCVJFR0lTVFJZX0lTTzg4NTlfMSwgUkVHSVNUUllfSVNPODg1OV83LCBSRUdJU1RSWV9TRU5USU5FTAorICAgIFJFR0lTVFJZX0pJU1gwMjA4LCBSRUdJU1RSWV9KSVNYMDIxMiwgUkVHSVNUUllfS1NYMTAwMV9HMCwKKyAgICBSRUdJU1RSWV9HQjIzMTIsIFJFR0lTVFJZX0pJU1gwMjAxX1IsIFJFR0lTVFJZX0pJU1gwMjA4X08sCisgICAgUkVHSVNUUllfSVNPODg1OV8xLCBSRUdJU1RSWV9JU084ODU5XzcsIFJFR0lTVFJZX1NFTlRJTkVMCiB9OwogQ09ORklHREVGKGpwXzIsIE5PX1NISUZUIHwgVVNFX0cyIHwgVVNFX0pJU1gwMjA4X0VYVCkKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uIGlzbzIwMjJfanBfMjAwNF9kZXNpZ25hdGlvbnNbXSA9IHsKLQlSRUdJU1RSWV9KSVNYMDIxM18yMDA0XzFfUEFJUk9OTFksIFJFR0lTVFJZX0pJU1gwMjA4LAotCVJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMSwgUkVHSVNUUllfSklTWDAyMTNfMjAwNF8yLCBSRUdJU1RSWV9TRU5USU5FTAorICAgIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDRfMV9QQUlST05MWSwgUkVHSVNUUllfSklTWDAyMDgsCisgICAgUkVHSVNUUllfSklTWDAyMTNfMjAwNF8xLCBSRUdJU1RSWV9KSVNYMDIxM18yMDA0XzIsIFJFR0lTVFJZX1NFTlRJTkVMCiB9OwogQ09ORklHREVGKGpwXzIwMDQsIE5PX1NISUZUIHwgVVNFX0pJU1gwMjA4X0VYVCkKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uIGlzbzIwMjJfanBfM19kZXNpZ25hdGlvbnNbXSA9IHsKLQlSRUdJU1RSWV9KSVNYMDIxM18yMDAwXzFfUEFJUk9OTFksIFJFR0lTVFJZX0pJU1gwMjA4LAotCVJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMSwgUkVHSVNUUllfSklTWDAyMTNfMjAwMF8yLCBSRUdJU1RSWV9TRU5USU5FTAorICAgIFJFR0lTVFJZX0pJU1gwMjEzXzIwMDBfMV9QQUlST05MWSwgUkVHSVNUUllfSklTWDAyMDgsCisgICAgUkVHSVNUUllfSklTWDAyMTNfMjAwMF8xLCBSRUdJU1RSWV9KSVNYMDIxM18yMDAwXzIsIFJFR0lTVFJZX1NFTlRJTkVMCiB9OwogQ09ORklHREVGKGpwXzMsIE5PX1NISUZUIHwgVVNFX0pJU1gwMjA4X0VYVCkKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpc28yMDIyX2Rlc2lnbmF0aW9uIGlzbzIwMjJfanBfZXh0X2Rlc2lnbmF0aW9uc1tdID0gewotCVJFR0lTVFJZX0pJU1gwMjA4LCBSRUdJU1RSWV9KSVNYMDIxMiwgUkVHSVNUUllfSklTWDAyMDFfUiwKLQlSRUdJU1RSWV9KSVNYMDIwMV9LLCBSRUdJU1RSWV9KSVNYMDIwOF9PLCBSRUdJU1RSWV9TRU5USU5FTAorICAgIFJFR0lTVFJZX0pJU1gwMjA4LCBSRUdJU1RSWV9KSVNYMDIxMiwgUkVHSVNUUllfSklTWDAyMDFfUiwKKyAgICBSRUdJU1RSWV9KSVNYMDIwMV9LLCBSRUdJU1RSWV9KSVNYMDIwOF9PLCBSRUdJU1RSWV9TRU5USU5FTAogfTsKIENPTkZJR0RFRihqcF9leHQsIE5PX1NISUZUIHwgVVNFX0pJU1gwMjA4X0VYVCkKIApAQCAtMTExMSwxMSArMTExMSwxMSBAQAogICAvKiBubyBtYXBwaW5nIHRhYmxlIGhlcmUgKi8KIEVORF9NQVBQSU5HU19MSVNUCiAKLSNkZWZpbmUgSVNPMjAyMl9DT0RFQyh2YXJpYXRpb24pIHsJCVwKLQkiaXNvMjAyMl8iICN2YXJpYXRpb24sCQkJXAotCSZpc28yMDIyXyMjdmFyaWF0aW9uIyNfY29uZmlnLAkJXAotCWlzbzIwMjJfY29kZWNfaW5pdCwJCQlcCi0JX1NUQVRFRlVMX01FVEhPRFMoaXNvMjAyMikJCVwKKyNkZWZpbmUgSVNPMjAyMl9DT0RFQyh2YXJpYXRpb24pIHsgICAgICAgICAgICAgIFwKKyAgICAiaXNvMjAyMl8iICN2YXJpYXRpb24sICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAmaXNvMjAyMl8jI3ZhcmlhdGlvbiMjX2NvbmZpZywgICAgICAgICAgICAgIFwKKyAgICBpc28yMDIyX2NvZGVjX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfU1RBVEVGVUxfTUVUSE9EUyhpc28yMDIyKSAgICAgICAgICAgICAgICAgIFwKIH0sCiAKIEJFR0lOX0NPREVDU19MSVNUCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2pwLmMgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2pwLmMKaW5kZXggZjQ5YTEwYi4uOTAxZDNiZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19qcC5jCisrKyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfanAuYwpAQCAtMTksMTI0ICsxOSwxMjQgQEAKIAogRU5DT0RFUihjcDkzMikKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQlQeV9VTklDT0RFIGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOwotCQl1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOworICAgICAgICB1bnNpZ25lZCBjaGFyIGMxLCBjMjsKIAotCQlpZiAoYyA8PSAweDgwKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKGMgPj0gMHhmZjYxICYmIGMgPD0gMHhmZjlmKSB7Ci0JCQlXUklURTEoYyAtIDB4ZmVjMCkKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKGMgPj0gMHhmOGYwICYmIGMgPD0gMHhmOGYzKSB7Ci0JCQkvKiBXaW5kb3dzIGNvbXBhdGliaWxpdHkgKi8KLQkJCVJFUVVJUkVfT1VUQlVGKDEpCi0JCQlpZiAoYyA9PSAweGY4ZjApCi0JCQkJT1VUMSgweGEwKQotCQkJZWxzZQotCQkJCU9VVDEoYyAtIDB4ZmVmMSArIDB4ZmQpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBpZiAoYyA8PSAweDgwKSB7CisgICAgICAgICAgICBXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPj0gMHhmZjYxICYmIGMgPD0gMHhmZjlmKSB7CisgICAgICAgICAgICBXUklURTEoYyAtIDB4ZmVjMCkKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPj0gMHhmOGYwICYmIGMgPD0gMHhmOGYzKSB7CisgICAgICAgICAgICAvKiBXaW5kb3dzIGNvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgICAgICBpZiAoYyA9PSAweGY4ZjApCisgICAgICAgICAgICAgICAgT1VUMSgweGEwKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE9VVDEoYyAtIDB4ZmVmMSArIDB4ZmQpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVVDUzRJTlZBTElEKGMpCi0JCVJFUVVJUkVfT1VUQlVGKDIpCisgICAgICAgIFVDUzRJTlZBTElEKGMpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDIpCiAKLQkJVFJZTUFQX0VOQyhjcDkzMmV4dCwgY29kZSwgYykgewotCQkJT1VUMShjb2RlID4+IDgpCi0JCQlPVVQyKGNvZGUgJiAweGZmKQotCQl9Ci0JCWVsc2UgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKSB7Ci0JCQlpZiAoY29kZSAmIDB4ODAwMCkgLyogTVNCIHNldDogSklTIFggMDIxMiAqLwotCQkJCXJldHVybiAxOworICAgICAgICBUUllNQVBfRU5DKGNwOTMyZXh0LCBjb2RlLCBjKSB7CisgICAgICAgICAgICBPVVQxKGNvZGUgPj4gOCkKKyAgICAgICAgICAgIE9VVDIoY29kZSAmIDB4ZmYpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGUsIGMpIHsKKyAgICAgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKSAvKiBNU0Igc2V0OiBKSVMgWCAwMjEyICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJCS8qIEpJUyBYIDAyMDggKi8KLQkJCWMxID0gY29kZSA+PiA4OwotCQkJYzIgPSBjb2RlICYgMHhmZjsKLQkJCWMyID0gKCgoYzEgLSAweDIxKSAmIDEpID8gMHg1ZSA6IDApICsgKGMyIC0gMHgyMSk7Ci0JCQljMSA9IChjMSAtIDB4MjEpID4+IDE7Ci0JCQlPVVQxKGMxIDwgMHgxZiA/IGMxICsgMHg4MSA6IGMxICsgMHhjMSkKLQkJCU9VVDIoYzIgPCAweDNmID8gYzIgKyAweDQwIDogYzIgKyAweDQxKQotCQl9Ci0JCWVsc2UgaWYgKGMgPj0gMHhlMDAwICYmIGMgPCAweGU3NTgpIHsKLQkJCS8qIFVzZXItZGVmaW5lZCBhcmVhICovCi0JCQljMSA9IChQeV9VTklDT0RFKShjIC0gMHhlMDAwKSAvIDE4ODsKLQkJCWMyID0gKFB5X1VOSUNPREUpKGMgLSAweGUwMDApICUgMTg4OwotCQkJT1VUMShjMSArIDB4ZjApCi0JCQlPVVQyKGMyIDwgMHgzZiA/IGMyICsgMHg0MCA6IGMyICsgMHg0MSkKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMTsKKyAgICAgICAgICAgIC8qIEpJUyBYIDAyMDggKi8KKyAgICAgICAgICAgIGMxID0gY29kZSA+PiA4OworICAgICAgICAgICAgYzIgPSBjb2RlICYgMHhmZjsKKyAgICAgICAgICAgIGMyID0gKCgoYzEgLSAweDIxKSAmIDEpID8gMHg1ZSA6IDApICsgKGMyIC0gMHgyMSk7CisgICAgICAgICAgICBjMSA9IChjMSAtIDB4MjEpID4+IDE7CisgICAgICAgICAgICBPVVQxKGMxIDwgMHgxZiA/IGMxICsgMHg4MSA6IGMxICsgMHhjMSkKKyAgICAgICAgICAgIE9VVDIoYzIgPCAweDNmID8gYzIgKyAweDQwIDogYzIgKyAweDQxKQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPj0gMHhlMDAwICYmIGMgPCAweGU3NTgpIHsKKyAgICAgICAgICAgIC8qIFVzZXItZGVmaW5lZCBhcmVhICovCisgICAgICAgICAgICBjMSA9IChQeV9VTklDT0RFKShjIC0gMHhlMDAwKSAvIDE4ODsKKyAgICAgICAgICAgIGMyID0gKFB5X1VOSUNPREUpKGMgLSAweGUwMDApICUgMTg4OworICAgICAgICAgICAgT1VUMShjMSArIDB4ZjApCisgICAgICAgICAgICBPVVQyKGMyIDwgMHgzZiA/IGMyICsgMHg0MCA6IGMyICsgMHg0MSkKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMTsKIAotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBORVhUKDEsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoY3A5MzIpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xLCBjMjsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjEsIGMyOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCi0JCWlmIChjIDw9IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UgaWYgKGMgPj0gMHhhMCAmJiBjIDw9IDB4ZGYpIHsKLQkJCWlmIChjID09IDB4YTApCi0JCQkJT1VUMSgweGY4ZjApIC8qIGhhbGYtd2lkdGgga2F0YWthbmEgKi8KLQkJCWVsc2UKLQkJCQlPVVQxKDB4ZmVjMCArIGMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQllbHNlIGlmIChjID49IDB4ZmQvKiAmJiBjIDw9IDB4ZmYqLykgewotCQkJLyogV2luZG93cyBjb21wYXRpYmlsaXR5ICovCi0JCQlPVVQxKDB4ZjhmMSAtIDB4ZmQgKyBjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgaWYgKGMgPD0gMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA+PSAweGEwICYmIGMgPD0gMHhkZikgeworICAgICAgICAgICAgaWYgKGMgPT0gMHhhMCkKKyAgICAgICAgICAgICAgICBPVVQxKDB4ZjhmMCkgLyogaGFsZi13aWR0aCBrYXRha2FuYSAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE9VVDEoMHhmZWMwICsgYykKKyAgICAgICAgICAgIE5FWFQoMSwgMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPj0gMHhmZC8qICYmIGMgPD0gMHhmZiovKSB7CisgICAgICAgICAgICAvKiBXaW5kb3dzIGNvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgICAgIE9VVDEoMHhmOGYxIC0gMHhmZCArIGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfSU5CVUYoMikKLQkJYzIgPSBJTjI7CisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgYzIgPSBJTjI7CiAKLQkJVFJZTUFQX0RFQyhjcDkzMmV4dCwgKipvdXRidWYsIGMsIGMyKTsKLQkJZWxzZSBpZiAoKGMgPj0gMHg4MSAmJiBjIDw9IDB4OWYpIHx8IChjID49IDB4ZTAgJiYgYyA8PSAweGVhKSl7Ci0JCQlpZiAoYzIgPCAweDQwIHx8IChjMiA+IDB4N2UgJiYgYzIgPCAweDgwKSB8fCBjMiA+IDB4ZmMpCi0JCQkJcmV0dXJuIDI7CisgICAgICAgIFRSWU1BUF9ERUMoY3A5MzJleHQsICoqb3V0YnVmLCBjLCBjMik7CisgICAgICAgIGVsc2UgaWYgKChjID49IDB4ODEgJiYgYyA8PSAweDlmKSB8fCAoYyA+PSAweGUwICYmIGMgPD0gMHhlYSkpeworICAgICAgICAgICAgaWYgKGMyIDwgMHg0MCB8fCAoYzIgPiAweDdlICYmIGMyIDwgMHg4MCkgfHwgYzIgPiAweGZjKQorICAgICAgICAgICAgICAgIHJldHVybiAyOwogCi0JCQljID0gKGMgPCAweGUwID8gYyAtIDB4ODEgOiBjIC0gMHhjMSk7Ci0JCQljMiA9IChjMiA8IDB4ODAgPyBjMiAtIDB4NDAgOiBjMiAtIDB4NDEpOwotCQkJYyA9ICgyICogYyArIChjMiA8IDB4NWUgPyAwIDogMSkgKyAweDIxKTsKLQkJCWMyID0gKGMyIDwgMHg1ZSA/IGMyIDogYzIgLSAweDVlKSArIDB4MjE7CisgICAgICAgICAgICBjID0gKGMgPCAweGUwID8gYyAtIDB4ODEgOiBjIC0gMHhjMSk7CisgICAgICAgICAgICBjMiA9IChjMiA8IDB4ODAgPyBjMiAtIDB4NDAgOiBjMiAtIDB4NDEpOworICAgICAgICAgICAgYyA9ICgyICogYyArIChjMiA8IDB4NWUgPyAwIDogMSkgKyAweDIxKTsKKyAgICAgICAgICAgIGMyID0gKGMyIDwgMHg1ZSA/IGMyIDogYzIgLSAweDVlKSArIDB4MjE7CiAKLQkJCVRSWU1BUF9ERUMoamlzeDAyMDgsICoqb3V0YnVmLCBjLCBjMik7Ci0JCQllbHNlIHJldHVybiAyOwotCQl9Ci0JCWVsc2UgaWYgKGMgPj0gMHhmMCAmJiBjIDw9IDB4ZjkpIHsKLQkJCWlmICgoYzIgPj0gMHg0MCAmJiBjMiA8PSAweDdlKSB8fAotCQkJICAgIChjMiA+PSAweDgwICYmIGMyIDw9IDB4ZmMpKQotCQkJCU9VVDEoMHhlMDAwICsgMTg4ICogKGMgLSAweGYwKSArCi0JCQkJICAgICAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKSkKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMjsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMjsKKyAgICAgICAgICAgIFRSWU1BUF9ERUMoamlzeDAyMDgsICoqb3V0YnVmLCBjLCBjMik7CisgICAgICAgICAgICBlbHNlIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPj0gMHhmMCAmJiBjIDw9IDB4ZjkpIHsKKyAgICAgICAgICAgIGlmICgoYzIgPj0gMHg0MCAmJiBjMiA8PSAweDdlKSB8fAorICAgICAgICAgICAgICAgIChjMiA+PSAweDgwICYmIGMyIDw9IDB4ZmMpKQorICAgICAgICAgICAgICAgIE9VVDEoMHhlMDAwICsgMTg4ICogKGMgLSAweGYwKSArCisgICAgICAgICAgICAgICAgICAgICAoYzIgPCAweDgwID8gYzIgLSAweDQwIDogYzIgLSAweDQxKSkKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMjsKIAotCQlORVhUKDIsIDEpCi0JfQorICAgICAgICBORVhUKDIsIDEpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTQ2LDE2NiArMTQ2LDE2NiBAQAogCiBFTkNPREVSKGV1Y19qaXNfMjAwNCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1Y3M0X3QgYyA9IElOMTsKLQkJREJDSEFSIGNvZGU7Ci0JCVB5X3NzaXplX3QgaW5zaXplOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVjczRfdCBjID0gSU4xOworICAgICAgICBEQkNIQVIgY29kZTsKKyAgICAgICAgUHlfc3NpemVfdCBpbnNpemU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlXUklURTEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgV1JJVEUxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCURFQ09ERV9TVVJST0dBVEUoYykKLQkJaW5zaXplID0gR0VUX0lOU0laRShjKTsKKyAgICAgICAgREVDT0RFX1NVUlJPR0FURShjKQorICAgICAgICBpbnNpemUgPSBHRVRfSU5TSVpFKGMpOwogCi0JCWlmIChjIDw9IDB4RkZGRikgewotCQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9CTVAoY29kZSwgYykKLQkJCWVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19ibXAsIGNvZGUsIGMpIHsKLQkJCQlpZiAoY29kZSA9PSBNVUxUSUMpIHsKLQkJCQkJaWYgKGlubGVmdCA8IDIpIHsKLQkJCQkJCWlmIChmbGFncyAmIE1CRU5DX0ZMVVNIKSB7Ci0JCQkJCQkJY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKLQkJCQkJCQkgICAgKHVjczJfdCljLCAwLAotCQkJCQkJCSAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCi0JCQkJCQkJICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKLQkJCQkJCQlpZiAoY29kZSA9PSBEQkNJTlYpCi0JCQkJCQkJCXJldHVybiAxOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBNQkVSUl9UT09GRVc7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljb2RlID0gZmluZF9wYWlyZW5jbWFwKAotCQkJCQkJCSh1Y3MyX3QpYywgKCppbmJ1ZilbMV0sCi0JCQkJCQkJamlzeDAyMTNfcGFpcl9lbmNtYXAsCi0JCQkJCQkJSklTWDAyMTNfRU5DUEFJUlMpOwotCQkJCQkJaWYgKGNvZGUgPT0gREJDSU5WKSB7Ci0JCQkJCQkJY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKLQkJCQkJCQkgICAgKHVjczJfdCljLCAwLAotCQkJCQkJCSAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCi0JCQkJCQkJICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKLQkJCQkJCQlpZiAoY29kZSA9PSBEQkNJTlYpCi0JCQkJCQkJCXJldHVybiAxOwotCQkJCQkJfSBlbHNlCi0JCQkJCQkJaW5zaXplID0gMjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKTsKLQkJCWVsc2UgaWYgKGMgPj0gMHhmZjYxICYmIGMgPD0gMHhmZjlmKSB7Ci0JCQkJLyogSklTIFggMDIwMSBoYWxmLXdpZHRoIGthdGFrYW5hICovCi0JCQkJV1JJVEUyKDB4OGUsIGMgLSAweGZlYzApCi0JCQkJTkVYVCgxLCAyKQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBpZiAoYyA9PSAweGZmM2MpCi0JCQkJLyogRi9XIFJFVkVSU0UgU09MSURVUyAoc2VlIE5PVEVTKSAqLwotCQkJCWNvZGUgPSAweDIxNDA7Ci0JCQllbHNlIGlmIChjID09IDB4ZmY1ZSkKLQkJCQkvKiBGL1cgVElMREUgKHNlZSBOT1RFUykgKi8KLQkJCQljb2RlID0gMHgyMjMyOwotCQkJZWxzZQotCQkJCXJldHVybiAxOwotCQl9Ci0JCWVsc2UgaWYgKGMgPj4gMTYgPT0gRU1QQkFTRSA+PiAxNikgewotCQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9FTVAoY29kZSwgYykKLQkJCWVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19lbXAsIGNvZGUsIGMgJiAweGZmZmYpOwotCQkJZWxzZSByZXR1cm4gaW5zaXplOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBpbnNpemU7CisgICAgICAgIGlmIChjIDw9IDB4RkZGRikgeworICAgICAgICAgICAgRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9CTVAoY29kZSwgYykKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19ibXAsIGNvZGUsIGMpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBNVUxUSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlubGVmdCA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIE1CRU5DX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjczJfdCljLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBEQkNJTlYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNQkVSUl9UT09GRVc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gZmluZF9wYWlyZW5jbWFwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y3MyX3QpYywgKCppbmJ1ZilbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklTWDAyMTNfRU5DUEFJUlMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gREJDSU5WKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjczJfdCljLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBEQkNJTlYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaXplID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMHhmZjYxICYmIGMgPD0gMHhmZjlmKSB7CisgICAgICAgICAgICAgICAgLyogSklTIFggMDIwMSBoYWxmLXdpZHRoIGthdGFrYW5hICovCisgICAgICAgICAgICAgICAgV1JJVEUyKDB4OGUsIGMgLSAweGZlYzApCisgICAgICAgICAgICAgICAgTkVYVCgxLCAyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAweGZmM2MpCisgICAgICAgICAgICAgICAgLyogRi9XIFJFVkVSU0UgU09MSURVUyAoc2VlIE5PVEVTKSAqLworICAgICAgICAgICAgICAgIGNvZGUgPSAweDIxNDA7CisgICAgICAgICAgICBlbHNlIGlmIChjID09IDB4ZmY1ZSkKKyAgICAgICAgICAgICAgICAvKiBGL1cgVElMREUgKHNlZSBOT1RFUykgKi8KKyAgICAgICAgICAgICAgICBjb2RlID0gMHgyMjMyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPj4gMTYgPT0gRU1QQkFTRSA+PiAxNikgeworICAgICAgICAgICAgRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9FTVAoY29kZSwgYykKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19lbXAsIGNvZGUsIGMgJiAweGZmZmYpOworICAgICAgICAgICAgZWxzZSByZXR1cm4gaW5zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBpbnNpemU7CiAKLQkJaWYgKGNvZGUgJiAweDgwMDApIHsKLQkJCS8qIENvZGVzZXQgMiAqLwotCQkJV1JJVEUzKDB4OGYsIGNvZGUgPj4gOCwgKGNvZGUgJiAweEZGKSB8IDB4ODApCi0JCQlORVhUKGluc2l6ZSwgMykKLQkJfSBlbHNlIHsKLQkJCS8qIENvZGVzZXQgMSAqLwotCQkJV1JJVEUyKChjb2RlID4+IDgpIHwgMHg4MCwgKGNvZGUgJiAweEZGKSB8IDB4ODApCi0JCQlORVhUKGluc2l6ZSwgMikKLQkJfQotCX0KKyAgICAgICAgaWYgKGNvZGUgJiAweDgwMDApIHsKKyAgICAgICAgICAgIC8qIENvZGVzZXQgMiAqLworICAgICAgICAgICAgV1JJVEUzKDB4OGYsIGNvZGUgPj4gOCwgKGNvZGUgJiAweEZGKSB8IDB4ODApCisgICAgICAgICAgICBORVhUKGluc2l6ZSwgMykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIENvZGVzZXQgMSAqLworICAgICAgICAgICAgV1JJVEUyKChjb2RlID4+IDgpIHwgMHg4MCwgKGNvZGUgJiAweEZGKSB8IDB4ODApCisgICAgICAgICAgICBORVhUKGluc2l6ZSwgMikKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGV1Y19qaXNfMjAwNCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7Ci0JCXVjczRfdCBjb2RlOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICAgICAgdWNzNF90IGNvZGU7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlpZiAoYyA9PSAweDhlKSB7Ci0JCQkvKiBKSVMgWCAwMjAxIGhhbGYtd2lkdGgga2F0YWthbmEgKi8KLQkJCXVuc2lnbmVkIGNoYXIgYzI7CisgICAgICAgIGlmIChjID09IDB4OGUpIHsKKyAgICAgICAgICAgIC8qIEpJUyBYIDAyMDEgaGFsZi13aWR0aCBrYXRha2FuYSAqLworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjMjsKIAotCQkJUkVRVUlSRV9JTkJVRigyKQotCQkJYzIgPSBJTjI7Ci0JCQlpZiAoYzIgPj0gMHhhMSAmJiBjMiA8PSAweGRmKSB7Ci0JCQkJT1VUMSgweGZlYzAgKyBjMikKLQkJCQlORVhUKDIsIDEpCi0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIDI7Ci0JCX0KLQkJZWxzZSBpZiAoYyA9PSAweDhmKSB7Ci0JCQl1bnNpZ25lZCBjaGFyIGMyLCBjMzsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGMyID0gSU4yOworICAgICAgICAgICAgaWYgKGMyID49IDB4YTEgJiYgYzIgPD0gMHhkZikgeworICAgICAgICAgICAgICAgIE9VVDEoMHhmZWMwICsgYzIpCisgICAgICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gMHg4ZikgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjMiwgYzM7CiAKLQkJCVJFUVVJUkVfSU5CVUYoMykKLQkJCWMyID0gSU4yIF4gMHg4MDsKLQkJCWMzID0gSU4zIF4gMHg4MDsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMykKKyAgICAgICAgICAgIGMyID0gSU4yIF4gMHg4MDsKKyAgICAgICAgICAgIGMzID0gSU4zIF4gMHg4MDsKIAotCQkJLyogSklTIFggMDIxMyBQbGFuZSAyIG9yIEpJUyBYIDAyMTIgKHNlZSBOT1RFUykgKi8KLQkJCUVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUyKCoqb3V0YnVmLCBjMiwgYzMpCi0JCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9ibXAsICoqb3V0YnVmLCBjMiwgYzMpIDsKLQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2VtcCwgY29kZSwgYzIsIGMzKSB7Ci0JCQkJV1JJVEVVQ1M0KEVNUEJBU0UgfCBjb2RlKQotCQkJCU5FWFRfSU4oMykKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxMiwgKipvdXRidWYsIGMyLCBjMykgOwotCQkJZWxzZSByZXR1cm4gMzsKLQkJCU5FWFQoMywgMSkKLQkJfQotCQllbHNlIHsKLQkJCXVuc2lnbmVkIGNoYXIgYzI7CisgICAgICAgICAgICAvKiBKSVMgWCAwMjEzIFBsYW5lIDIgb3IgSklTIFggMDIxMiAoc2VlIE5PVEVTKSAqLworICAgICAgICAgICAgRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTIoKipvdXRidWYsIGMyLCBjMykKKyAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18yX2JtcCwgKipvdXRidWYsIGMyLCBjMykgOworICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfZW1wLCBjb2RlLCBjMiwgYzMpIHsKKyAgICAgICAgICAgICAgICBXUklURVVDUzQoRU1QQkFTRSB8IGNvZGUpCisgICAgICAgICAgICAgICAgTkVYVF9JTigzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEyLCAqKm91dGJ1ZiwgYzIsIGMzKSA7CisgICAgICAgICAgICBlbHNlIHJldHVybiAzOworICAgICAgICAgICAgTkVYVCgzLCAxKQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjMjsKIAotCQkJUkVRVUlSRV9JTkJVRigyKQotCQkJYyBePSAweDgwOwotCQkJYzIgPSBJTjIgXiAweDgwOworICAgICAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICAgICAgYyBePSAweDgwOworICAgICAgICAgICAgYzIgPSBJTjIgXiAweDgwOwogCi0JCQkvKiBKSVMgWCAwMjEzIFBsYW5lIDEgKi8KLQkJCUVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKCoqb3V0YnVmLCBjLCBjMikKLQkJCWVsc2UgaWYgKGMgPT0gMHgyMSAmJiBjMiA9PSAweDQwKSAqKm91dGJ1ZiA9IDB4ZmYzYzsKLQkJCWVsc2UgaWYgKGMgPT0gMHgyMiAmJiBjMiA9PSAweDMyKSAqKm91dGJ1ZiA9IDB4ZmY1ZTsKLQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIwOCwgKipvdXRidWYsIGMsIGMyKTsKLQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2JtcCwgKipvdXRidWYsIGMsIGMyKTsKLQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2VtcCwgY29kZSwgYywgYzIpIHsKLQkJCQlXUklURVVDUzQoRU1QQkFTRSB8IGNvZGUpCi0JCQkJTkVYVF9JTigyKQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBUUllNQVBfREVDKGppc3gwMjEzX3BhaXIsIGNvZGUsIGMsIGMyKSB7Ci0JCQkJV1JJVEUyKGNvZGUgPj4gMTYsIGNvZGUgJiAweGZmZmYpCi0JCQkJTkVYVCgyLCAyKQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSByZXR1cm4gMjsKLQkJCU5FWFQoMiwgMSkKLQkJfQotCX0KKyAgICAgICAgICAgIC8qIEpJUyBYIDAyMTMgUGxhbmUgMSAqLworICAgICAgICAgICAgRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTEoKipvdXRidWYsIGMsIGMyKQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAweDIxICYmIGMyID09IDB4NDApICoqb3V0YnVmID0gMHhmZjNjOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAweDIyICYmIGMyID09IDB4MzIpICoqb3V0YnVmID0gMHhmZjVlOworICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwgYywgYzIpOworICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfYm1wLCAqKm91dGJ1ZiwgYywgYzIpOworICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfZW1wLCBjb2RlLCBjLCBjMikgeworICAgICAgICAgICAgICAgIFdSSVRFVUNTNChFTVBCQVNFIHwgY29kZSkKKyAgICAgICAgICAgICAgICBORVhUX0lOKDIpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfcGFpciwgY29kZSwgYywgYzIpIHsKKyAgICAgICAgICAgICAgICBXUklURTIoY29kZSA+PiAxNiwgY29kZSAmIDB4ZmZmZikKKyAgICAgICAgICAgICAgICBORVhUKDIsIDIpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHJldHVybiAyOworICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMzE1LDExNCArMzE1LDExNCBAQAogCiBFTkNPREVSKGV1Y19qcCkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQlQeV9VTklDT0RFIGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIFB5X1VOSUNPREUgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVVDUzRJTlZBTElEKGMpCisgICAgICAgIFVDUzRJTlZBTElEKGMpCiAKLQkJVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKTsKLQkJZWxzZSBpZiAoYyA+PSAweGZmNjEgJiYgYyA8PSAweGZmOWYpIHsKLQkJCS8qIEpJUyBYIDAyMDEgaGFsZi13aWR0aCBrYXRha2FuYSAqLwotCQkJV1JJVEUyKDB4OGUsIGMgLSAweGZlYzApCi0JCQlORVhUKDEsIDIpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGUsIGMpOworICAgICAgICBlbHNlIGlmIChjID49IDB4ZmY2MSAmJiBjIDw9IDB4ZmY5ZikgeworICAgICAgICAgICAgLyogSklTIFggMDIwMSBoYWxmLXdpZHRoIGthdGFrYW5hICovCisgICAgICAgICAgICBXUklURTIoMHg4ZSwgYyAtIDB4ZmVjMCkKKyAgICAgICAgICAgIE5FWFQoMSwgMikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAjaWZuZGVmIFNUUklDVF9CVUlMRAotCQllbHNlIGlmIChjID09IDB4ZmYzYykgLyogRlVMTC1XSURUSCBSRVZFUlNFIFNPTElEVVMgKi8KLQkJCWNvZGUgPSAweDIxNDA7Ci0JCWVsc2UgaWYgKGMgPT0gMHhhNSkgeyAvKiBZRU4gU0lHTiAqLwotCQkJV1JJVEUxKDB4NWMpOwotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoYyA9PSAweDIwM2UpIHsgLyogT1ZFUkxJTkUgKi8KLQkJCVdSSVRFMSgweDdlKTsKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gMHhmZjNjKSAvKiBGVUxMLVdJRFRIIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICAgICAgY29kZSA9IDB4MjE0MDsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAweGE1KSB7IC8qIFlFTiBTSUdOICovCisgICAgICAgICAgICBXUklURTEoMHg1Yyk7CisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09IDB4MjAzZSkgeyAvKiBPVkVSTElORSAqLworICAgICAgICAgICAgV1JJVEUxKDB4N2UpOworICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICNlbmRpZgotCQllbHNlCi0JCQlyZXR1cm4gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJaWYgKGNvZGUgJiAweDgwMDApIHsKLQkJCS8qIEpJUyBYIDAyMTIgKi8KLQkJCVdSSVRFMygweDhmLCBjb2RlID4+IDgsIChjb2RlICYgMHhGRikgfCAweDgwKQotCQkJTkVYVCgxLCAzKQotCQl9IGVsc2UgewotCQkJLyogSklTIFggMDIwOCAqLwotCQkJV1JJVEUyKChjb2RlID4+IDgpIHwgMHg4MCwgKGNvZGUgJiAweEZGKSB8IDB4ODApCi0JCQlORVhUKDEsIDIpCi0JCX0KLQl9CisgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKSB7CisgICAgICAgICAgICAvKiBKSVMgWCAwMjEyICovCisgICAgICAgICAgICBXUklURTMoMHg4ZiwgY29kZSA+PiA4LCAoY29kZSAmIDB4RkYpIHwgMHg4MCkKKyAgICAgICAgICAgIE5FWFQoMSwgMykKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEpJUyBYIDAyMDggKi8KKyAgICAgICAgICAgIFdSSVRFMigoY29kZSA+PiA4KSB8IDB4ODAsIChjb2RlICYgMHhGRikgfCAweDgwKQorICAgICAgICAgICAgTkVYVCgxLCAyKQorICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoZXVjX2pwKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQkJaWYgKGMgPCAweDgwKSB7Ci0JCQkJT1VUMShjKQotCQkJCU5FWFQoMSwgMSkKLQkJCQljb250aW51ZTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgICAgIE9VVDEoYykKKyAgICAgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAKLQkJaWYgKGMgPT0gMHg4ZSkgewotCQkJLyogSklTIFggMDIwMSBoYWxmLXdpZHRoIGthdGFrYW5hICovCi0JCQl1bnNpZ25lZCBjaGFyIGMyOworICAgICAgICBpZiAoYyA9PSAweDhlKSB7CisgICAgICAgICAgICAvKiBKSVMgWCAwMjAxIGhhbGYtd2lkdGgga2F0YWthbmEgKi8KKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzI7CiAKLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCWMyID0gSU4yOwotCQkJaWYgKGMyID49IDB4YTEgJiYgYzIgPD0gMHhkZikgewotCQkJCU9VVDEoMHhmZWMwICsgYzIpCi0JCQkJTkVYVCgyLCAxKQotCQkJfQotCQkJZWxzZQotCQkJCXJldHVybiAyOwotCQl9Ci0JCWVsc2UgaWYgKGMgPT0gMHg4ZikgewotCQkJdW5zaWduZWQgY2hhciBjMiwgYzM7CisgICAgICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgICAgICBjMiA9IElOMjsKKyAgICAgICAgICAgIGlmIChjMiA+PSAweGExICYmIGMyIDw9IDB4ZGYpIHsKKyAgICAgICAgICAgICAgICBPVVQxKDB4ZmVjMCArIGMyKQorICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09IDB4OGYpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzIsIGMzOwogCi0JCQlSRVFVSVJFX0lOQlVGKDMpCi0JCQljMiA9IElOMjsKLQkJCWMzID0gSU4zOwotCQkJLyogSklTIFggMDIxMiAqLwotCQkJVFJZTUFQX0RFQyhqaXN4MDIxMiwgKipvdXRidWYsIGMyIF4gMHg4MCwgYzMgXiAweDgwKSB7Ci0JCQkJTkVYVCgzLCAxKQotCQkJfQotCQkJZWxzZQotCQkJCXJldHVybiAzOwotCQl9Ci0JCWVsc2UgewotCQkJdW5zaWduZWQgY2hhciBjMjsKKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMykKKyAgICAgICAgICAgIGMyID0gSU4yOworICAgICAgICAgICAgYzMgPSBJTjM7CisgICAgICAgICAgICAvKiBKSVMgWCAwMjEyICovCisgICAgICAgICAgICBUUllNQVBfREVDKGppc3gwMjEyLCAqKm91dGJ1ZiwgYzIgXiAweDgwLCBjMyBeIDB4ODApIHsKKyAgICAgICAgICAgICAgICBORVhUKDMsIDEpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMyOwogCi0JCQlSRVFVSVJFX0lOQlVGKDIpCi0JCQljMiA9IElOMjsKLQkJCS8qIEpJUyBYIDAyMDggKi8KKyAgICAgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgICAgIGMyID0gSU4yOworICAgICAgICAgICAgLyogSklTIFggMDIwOCAqLwogI2lmbmRlZiBTVFJJQ1RfQlVJTEQKLQkJCWlmIChjID09IDB4YTEgJiYgYzIgPT0gMHhjMCkKLQkJCQkvKiBGVUxMLVdJRFRIIFJFVkVSU0UgU09MSURVUyAqLwotCQkJCSoqb3V0YnVmID0gMHhmZjNjOwotCQkJZWxzZQorICAgICAgICAgICAgaWYgKGMgPT0gMHhhMSAmJiBjMiA9PSAweGMwKQorICAgICAgICAgICAgICAgIC8qIEZVTEwtV0lEVEggUkVWRVJTRSBTT0xJRFVTICovCisgICAgICAgICAgICAgICAgKipvdXRidWYgPSAweGZmM2M7CisgICAgICAgICAgICBlbHNlCiAjZW5kaWYKLQkJCQlUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwKLQkJCQkJICAgYyBeIDB4ODAsIGMyIF4gMHg4MCkgOwotCQkJZWxzZSByZXR1cm4gMjsKLQkJCU5FWFQoMiwgMSkKLQkJfQotCX0KKyAgICAgICAgICAgICAgICBUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgXiAweDgwLCBjMiBeIDB4ODApIDsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIDI7CisgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC00MzIsMTA1ICs0MzIsMTA1IEBACiAKIEVOQ09ERVIoc2hpZnRfamlzKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCVB5X1VOSUNPREUgYyA9IElOMTsKLQkJREJDSEFSIGNvZGU7Ci0JCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIFB5X1VOSUNPREUgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGU7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYzEsIGMyOwogCiAjaWZkZWYgU1RSSUNUX0JVSUxECi0JCUpJU1gwMjAxX1JfRU5DT0RFKGMsIGNvZGUpCisgICAgICAgIEpJU1gwMjAxX1JfRU5DT0RFKGMsIGNvZGUpCiAjZWxzZQotCQlpZiAoYyA8IDB4ODApIGNvZGUgPSBjOwotCQllbHNlIGlmIChjID09IDB4MDBhNSkgY29kZSA9IDB4NWM7IC8qIFlFTiBTSUdOICovCi0JCWVsc2UgaWYgKGMgPT0gMHgyMDNlKSBjb2RlID0gMHg3ZTsgLyogT1ZFUkxJTkUgKi8KKyAgICAgICAgaWYgKGMgPCAweDgwKSBjb2RlID0gYzsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAweDAwYTUpIGNvZGUgPSAweDVjOyAvKiBZRU4gU0lHTiAqLworICAgICAgICBlbHNlIGlmIChjID09IDB4MjAzZSkgY29kZSA9IDB4N2U7IC8qIE9WRVJMSU5FICovCiAjZW5kaWYKLQkJZWxzZSBKSVNYMDIwMV9LX0VOQ09ERShjLCBjb2RlKQotCQllbHNlIFVDUzRJTlZBTElEKGMpCi0JCWVsc2UgY29kZSA9IE5PQ0hBUjsKKyAgICAgICAgZWxzZSBKSVNYMDIwMV9LX0VOQ09ERShjLCBjb2RlKQorICAgICAgICBlbHNlIFVDUzRJTlZBTElEKGMpCisgICAgICAgIGVsc2UgY29kZSA9IE5PQ0hBUjsKIAotCQlpZiAoY29kZSA8IDB4ODAgfHwgKGNvZGUgPj0gMHhhMSAmJiBjb2RlIDw9IDB4ZGYpKSB7Ci0JCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBpZiAoY29kZSA8IDB4ODAgfHwgKGNvZGUgPj0gMHhhMSAmJiBjb2RlIDw9IDB4ZGYpKSB7CisgICAgICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCi0JCQlPVVQxKCh1bnNpZ25lZCBjaGFyKWNvZGUpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQorICAgICAgICAgICAgT1VUMSgodW5zaWduZWQgY2hhciljb2RlKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBSRVFVSVJFX09VVEJVRigyKQogCi0JCWlmIChjb2RlID09IE5PQ0hBUikgewotCQkJVFJZTUFQX0VOQyhqaXN4Y29tbW9uLCBjb2RlLCBjKTsKKyAgICAgICAgaWYgKGNvZGUgPT0gTk9DSEFSKSB7CisgICAgICAgICAgICBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGUsIGMpOwogI2lmbmRlZiBTVFJJQ1RfQlVJTEQKLQkJCWVsc2UgaWYgKGMgPT0gMHhmZjNjKQotCQkJCWNvZGUgPSAweDIxNDA7IC8qIEZVTEwtV0lEVEggUkVWRVJTRSBTT0xJRFVTICovCisgICAgICAgICAgICBlbHNlIGlmIChjID09IDB4ZmYzYykKKyAgICAgICAgICAgICAgICBjb2RlID0gMHgyMTQwOyAvKiBGVUxMLVdJRFRIIFJFVkVSU0UgU09MSURVUyAqLwogI2VuZGlmCi0JCQllbHNlCi0JCQkJcmV0dXJuIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJCWlmIChjb2RlICYgMHg4MDAwKSAvKiBNU0Igc2V0OiBKSVMgWCAwMjEyICovCi0JCQkJcmV0dXJuIDE7Ci0JCX0KKyAgICAgICAgICAgIGlmIChjb2RlICYgMHg4MDAwKSAvKiBNU0Igc2V0OiBKSVMgWCAwMjEyICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KIAotCQljMSA9IGNvZGUgPj4gODsKLQkJYzIgPSBjb2RlICYgMHhmZjsKLQkJYzIgPSAoKChjMSAtIDB4MjEpICYgMSkgPyAweDVlIDogMCkgKyAoYzIgLSAweDIxKTsKLQkJYzEgPSAoYzEgLSAweDIxKSA+PiAxOwotCQlPVVQxKGMxIDwgMHgxZiA/IGMxICsgMHg4MSA6IGMxICsgMHhjMSkKLQkJT1VUMihjMiA8IDB4M2YgPyBjMiArIDB4NDAgOiBjMiArIDB4NDEpCi0JCU5FWFQoMSwgMikKLQl9CisgICAgICAgIGMxID0gY29kZSA+PiA4OworICAgICAgICBjMiA9IGNvZGUgJiAweGZmOworICAgICAgICBjMiA9ICgoKGMxIC0gMHgyMSkgJiAxKSA/IDB4NWUgOiAwKSArIChjMiAtIDB4MjEpOworICAgICAgICBjMSA9IChjMSAtIDB4MjEpID4+IDE7CisgICAgICAgIE9VVDEoYzEgPCAweDFmID8gYzEgKyAweDgxIDogYzEgKyAweGMxKQorICAgICAgICBPVVQyKGMyIDwgMHgzZiA/IGMyICsgMHg0MCA6IGMyICsgMHg0MSkKKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKHNoaWZ0X2ppcykKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQl1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gSU4xOwogCi0JCVJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCiAKICNpZmRlZiBTVFJJQ1RfQlVJTEQKLQkJSklTWDAyMDFfUl9ERUNPREUoYywgKipvdXRidWYpCisgICAgICAgIEpJU1gwMjAxX1JfREVDT0RFKGMsICoqb3V0YnVmKQogI2Vsc2UKLQkJaWYgKGMgPCAweDgwKSAqKm91dGJ1ZiA9IGM7CisgICAgICAgIGlmIChjIDwgMHg4MCkgKipvdXRidWYgPSBjOwogI2VuZGlmCi0JCWVsc2UgSklTWDAyMDFfS19ERUNPREUoYywgKipvdXRidWYpCi0JCWVsc2UgaWYgKChjID49IDB4ODEgJiYgYyA8PSAweDlmKSB8fCAoYyA+PSAweGUwICYmIGMgPD0gMHhlYSkpewotCQkJdW5zaWduZWQgY2hhciBjMSwgYzI7CisgICAgICAgIGVsc2UgSklTWDAyMDFfS19ERUNPREUoYywgKipvdXRidWYpCisgICAgICAgIGVsc2UgaWYgKChjID49IDB4ODEgJiYgYyA8PSAweDlmKSB8fCAoYyA+PSAweGUwICYmIGMgPD0gMHhlYSkpeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjMSwgYzI7CiAKLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCWMyID0gSU4yOwotCQkJaWYgKGMyIDwgMHg0MCB8fCAoYzIgPiAweDdlICYmIGMyIDwgMHg4MCkgfHwgYzIgPiAweGZjKQotCQkJCXJldHVybiAyOworICAgICAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICAgICAgYzIgPSBJTjI7CisgICAgICAgICAgICBpZiAoYzIgPCAweDQwIHx8IChjMiA+IDB4N2UgJiYgYzIgPCAweDgwKSB8fCBjMiA+IDB4ZmMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAKLQkJCWMxID0gKGMgPCAweGUwID8gYyAtIDB4ODEgOiBjIC0gMHhjMSk7Ci0JCQljMiA9IChjMiA8IDB4ODAgPyBjMiAtIDB4NDAgOiBjMiAtIDB4NDEpOwotCQkJYzEgPSAoMiAqIGMxICsgKGMyIDwgMHg1ZSA/IDAgOiAxKSArIDB4MjEpOwotCQkJYzIgPSAoYzIgPCAweDVlID8gYzIgOiBjMiAtIDB4NWUpICsgMHgyMTsKKyAgICAgICAgICAgIGMxID0gKGMgPCAweGUwID8gYyAtIDB4ODEgOiBjIC0gMHhjMSk7CisgICAgICAgICAgICBjMiA9IChjMiA8IDB4ODAgPyBjMiAtIDB4NDAgOiBjMiAtIDB4NDEpOworICAgICAgICAgICAgYzEgPSAoMiAqIGMxICsgKGMyIDwgMHg1ZSA/IDAgOiAxKSArIDB4MjEpOworICAgICAgICAgICAgYzIgPSAoYzIgPCAweDVlID8gYzIgOiBjMiAtIDB4NWUpICsgMHgyMTsKIAogI2lmbmRlZiBTVFJJQ1RfQlVJTEQKLQkJCWlmIChjMSA9PSAweDIxICYmIGMyID09IDB4NDApIHsKLQkJCQkvKiBGVUxMLVdJRFRIIFJFVkVSU0UgU09MSURVUyAqLwotCQkJCU9VVDEoMHhmZjNjKQotCQkJCU5FWFQoMiwgMSkKLQkJCQljb250aW51ZTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChjMSA9PSAweDIxICYmIGMyID09IDB4NDApIHsKKyAgICAgICAgICAgICAgICAvKiBGVUxMLVdJRFRIIFJFVkVSU0UgU09MSURVUyAqLworICAgICAgICAgICAgICAgIE9VVDEoMHhmZjNjKQorICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJVFJZTUFQX0RFQyhqaXN4MDIwOCwgKipvdXRidWYsIGMxLCBjMikgewotCQkJCU5FWFQoMiwgMSkKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlyZXR1cm4gMjsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMjsKKyAgICAgICAgICAgIFRSWU1BUF9ERUMoamlzeDAyMDgsICoqb3V0YnVmLCBjMSwgYzIpIHsKKyAgICAgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDI7CiAKLQkJTkVYVCgxLCAxKSAvKiBKSVMgWCAwMjAxICovCi0JfQorICAgICAgICBORVhUKDEsIDEpIC8qIEpJUyBYIDAyMDEgKi8KKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC01NDAsMTY3ICs1NDAsMTY3IEBACiAKIEVOQ09ERVIoc2hpZnRfamlzXzIwMDQpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdWNzNF90IGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlID0gTk9DSEFSOwotCQlpbnQgYzEsIGMyOwotCQlQeV9zc2l6ZV90IGluc2l6ZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1Y3M0X3QgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGUgPSBOT0NIQVI7CisgICAgICAgIGludCBjMSwgYzI7CisgICAgICAgIFB5X3NzaXplX3QgaW5zaXplOwogCi0JCUpJU1gwMjAxX0VOQ09ERShjLCBjb2RlKQotCQllbHNlIERFQ09ERV9TVVJST0dBVEUoYykKKyAgICAgICAgSklTWDAyMDFfRU5DT0RFKGMsIGNvZGUpCisgICAgICAgIGVsc2UgREVDT0RFX1NVUlJPR0FURShjKQogCi0JCWlmIChjb2RlIDwgMHg4MCB8fCAoY29kZSA+PSAweGExICYmIGNvZGUgPD0gMHhkZikpIHsKLQkJCVdSSVRFMSgodW5zaWduZWQgY2hhciljb2RlKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGNvZGUgPCAweDgwIHx8IChjb2RlID49IDB4YTEgJiYgY29kZSA8PSAweGRmKSkgeworICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWNvZGUpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfT1VUQlVGKDIpCi0JCWluc2l6ZSA9IEdFVF9JTlNJWkUoYyk7CisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDIpCisgICAgICAgIGluc2l6ZSA9IEdFVF9JTlNJWkUoYyk7CiAKLQkJaWYgKGNvZGUgPT0gTk9DSEFSKSB7Ci0JCQlpZiAoYyA8PSAweGZmZmYpIHsKLQkJCQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0JNUChjb2RlLCBjKQotCQkJCWVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19ibXAsIGNvZGUsIGMpIHsKLQkJCQkJaWYgKGNvZGUgPT0gTVVMVElDKSB7Ci0JCQkJCQlpZiAoaW5sZWZ0IDwgMikgewotCQkJCQkJICAgIGlmIChmbGFncyAmIE1CRU5DX0ZMVVNIKSB7Ci0JCQkJCQkJY29kZSA9IGZpbmRfcGFpcmVuY21hcAotCQkJCQkJCSAgICAoKHVjczJfdCljLCAwLAotCQkJCQkJCSAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCi0JCQkJCQkJICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKLQkJCQkJCQlpZiAoY29kZSA9PSBEQkNJTlYpCi0JCQkJCQkJICAgIHJldHVybiAxOwotCQkJCQkJICAgIH0KLQkJCQkJCSAgICBlbHNlCi0JCQkJCQkJICAgIHJldHVybiBNQkVSUl9UT09GRVc7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCSAgICBjb2RlID0gZmluZF9wYWlyZW5jbWFwKAotCQkJCQkJCSAgICAodWNzMl90KWMsIElOMiwKLQkJCQkJCQkgIGppc3gwMjEzX3BhaXJfZW5jbWFwLAotCQkJCQkJCSAgICBKSVNYMDIxM19FTkNQQUlSUyk7Ci0JCQkJCQkgICAgaWYgKGNvZGUgPT0gREJDSU5WKSB7Ci0JCQkJCQkJY29kZSA9IGZpbmRfcGFpcmVuY21hcCgKLQkJCQkJCQkgICAgKHVjczJfdCljLCAwLAotCQkJCQkJCSAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCi0JCQkJCQkJICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKLQkJCQkJCQlpZiAoY29kZSA9PSBEQkNJTlYpCi0JCQkJCQkJICAgIHJldHVybiAxOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJICAgIGluc2l6ZSA9IDI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBUUllNQVBfRU5DKGppc3hjb21tb24sIGNvZGUsIGMpIHsKLQkJCQkJLyogYWJhbmRvbiBKSVMgWCAwMjEyIGNvZGVzICovCi0JCQkJCWlmIChjb2RlICYgMHg4MDAwKQotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWVsc2UgcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmIChjID4+IDE2ID09IEVNUEJBU0UgPj4gMTYpIHsKLQkJCQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0VNUChjb2RlLCBjKQotCQkJCWVsc2UgVFJZTUFQX0VOQyhqaXN4MDIxM19lbXAsIGNvZGUsIGMmMHhmZmZmKTsKLQkJCQllbHNlIHJldHVybiBpbnNpemU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGluc2l6ZTsKLQkJfQorICAgICAgICBpZiAoY29kZSA9PSBOT0NIQVIpIHsKKyAgICAgICAgICAgIGlmIChjIDw9IDB4ZmZmZikgeworICAgICAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfQk1QKGNvZGUsIGMpCisgICAgICAgICAgICAgICAgZWxzZSBUUllNQVBfRU5DKGppc3gwMjEzX2JtcCwgY29kZSwgYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBNVUxUSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmxlZnQgPCAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgTUJFTkNfRkxVU0gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gZmluZF9wYWlyZW5jbWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWNzMl90KWMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXN4MDIxM19wYWlyX2VuY21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklTWDAyMTNfRU5DUEFJUlMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IERCQ0lOVikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1CRVJSX1RPT0ZFVzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBmaW5kX3BhaXJlbmNtYXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y3MyX3QpYywgSU4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamlzeDAyMTNfcGFpcl9lbmNtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJU1gwMjEzX0VOQ1BBSVJTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PSBEQkNJTlYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gZmluZF9wYWlyZW5jbWFwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNzMl90KWMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqaXN4MDIxM19wYWlyX2VuY21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklTWDAyMTNfRU5DUEFJUlMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09IERCQ0lOVikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zaXplID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIFRSWU1BUF9FTkMoamlzeGNvbW1vbiwgY29kZSwgYykgeworICAgICAgICAgICAgICAgICAgICAvKiBhYmFuZG9uIEpJUyBYIDAyMTIgY29kZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgJiAweDgwMDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPj4gMTYgPT0gRU1QQkFTRSA+PiAxNikgeworICAgICAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGNvZGUsIGMpCisgICAgICAgICAgICAgICAgZWxzZSBUUllNQVBfRU5DKGppc3gwMjEzX2VtcCwgY29kZSwgYyYweGZmZmYpOworICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIGluc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zaXplOworICAgICAgICB9CiAKLQkJYzEgPSBjb2RlID4+IDg7Ci0JCWMyID0gKGNvZGUgJiAweGZmKSAtIDB4MjE7CisgICAgICAgIGMxID0gY29kZSA+PiA4OworICAgICAgICBjMiA9IChjb2RlICYgMHhmZikgLSAweDIxOwogCi0JCWlmIChjMSAmIDB4ODApIHsgLyogUGxhbmUgMiAqLwotCQkJaWYgKGMxID49IDB4ZWUpIGMxIC09IDB4ODc7Ci0JCQllbHNlIGlmIChjMSA+PSAweGFjIHx8IGMxID09IDB4YTgpIGMxIC09IDB4NDk7Ci0JCQllbHNlIGMxIC09IDB4NDM7Ci0JCX0KLQkJZWxzZSAvKiBQbGFuZSAxICovCi0JCQljMSAtPSAweDIxOworICAgICAgICBpZiAoYzEgJiAweDgwKSB7IC8qIFBsYW5lIDIgKi8KKyAgICAgICAgICAgIGlmIChjMSA+PSAweGVlKSBjMSAtPSAweDg3OworICAgICAgICAgICAgZWxzZSBpZiAoYzEgPj0gMHhhYyB8fCBjMSA9PSAweGE4KSBjMSAtPSAweDQ5OworICAgICAgICAgICAgZWxzZSBjMSAtPSAweDQzOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogUGxhbmUgMSAqLworICAgICAgICAgICAgYzEgLT0gMHgyMTsKIAotCQlpZiAoYzEgJiAxKSBjMiArPSAweDVlOwotCQljMSA+Pj0gMTsKLQkJT1VUMShjMSArIChjMSA8IDB4MWYgPyAweDgxIDogMHhjMSkpCi0JCU9VVDIoYzIgKyAoYzIgPCAweDNmID8gMHg0MCA6IDB4NDEpKQorICAgICAgICBpZiAoYzEgJiAxKSBjMiArPSAweDVlOworICAgICAgICBjMSA+Pj0gMTsKKyAgICAgICAgT1VUMShjMSArIChjMSA8IDB4MWYgPyAweDgxIDogMHhjMSkpCisgICAgICAgIE9VVDIoYzIgKyAoYzIgPCAweDNmID8gMHg0MCA6IDB4NDEpKQogCi0JCU5FWFQoaW5zaXplLCAyKQotCX0KKyAgICAgICAgTkVYVChpbnNpemUsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoc2hpZnRfamlzXzIwMDQpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKIAotCQlSRVFVSVJFX09VVEJVRigxKQotCQlKSVNYMDIwMV9ERUNPREUoYywgKipvdXRidWYpCi0JCWVsc2UgaWYgKChjID49IDB4ODEgJiYgYyA8PSAweDlmKSB8fCAoYyA+PSAweGUwICYmIGMgPD0gMHhmYykpewotCQkJdW5zaWduZWQgY2hhciBjMSwgYzI7Ci0JCQl1Y3M0X3QgY29kZTsKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgSklTWDAyMDFfREVDT0RFKGMsICoqb3V0YnVmKQorICAgICAgICBlbHNlIGlmICgoYyA+PSAweDgxICYmIGMgPD0gMHg5ZikgfHwgKGMgPj0gMHhlMCAmJiBjIDw9IDB4ZmMpKXsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYzEsIGMyOworICAgICAgICAgICAgdWNzNF90IGNvZGU7CiAKLQkJCVJFUVVJUkVfSU5CVUYoMikKLQkJCWMyID0gSU4yOwotCQkJaWYgKGMyIDwgMHg0MCB8fCAoYzIgPiAweDdlICYmIGMyIDwgMHg4MCkgfHwgYzIgPiAweGZjKQotCQkJCXJldHVybiAyOworICAgICAgICAgICAgUkVRVUlSRV9JTkJVRigyKQorICAgICAgICAgICAgYzIgPSBJTjI7CisgICAgICAgICAgICBpZiAoYzIgPCAweDQwIHx8IChjMiA+IDB4N2UgJiYgYzIgPCAweDgwKSB8fCBjMiA+IDB4ZmMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAKLQkJCWMxID0gKGMgPCAweGUwID8gYyAtIDB4ODEgOiBjIC0gMHhjMSk7Ci0JCQljMiA9IChjMiA8IDB4ODAgPyBjMiAtIDB4NDAgOiBjMiAtIDB4NDEpOwotCQkJYzEgPSAoMiAqIGMxICsgKGMyIDwgMHg1ZSA/IDAgOiAxKSk7Ci0JCQljMiA9IChjMiA8IDB4NWUgPyBjMiA6IGMyIC0gMHg1ZSkgKyAweDIxOworICAgICAgICAgICAgYzEgPSAoYyA8IDB4ZTAgPyBjIC0gMHg4MSA6IGMgLSAweGMxKTsKKyAgICAgICAgICAgIGMyID0gKGMyIDwgMHg4MCA/IGMyIC0gMHg0MCA6IGMyIC0gMHg0MSk7CisgICAgICAgICAgICBjMSA9ICgyICogYzEgKyAoYzIgPCAweDVlID8gMCA6IDEpKTsKKyAgICAgICAgICAgIGMyID0gKGMyIDwgMHg1ZSA/IGMyIDogYzIgLSAweDVlKSArIDB4MjE7CiAKLQkJCWlmIChjMSA8IDB4NWUpIHsgLyogUGxhbmUgMSAqLwotCQkJCWMxICs9IDB4MjE7Ci0JCQkJRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTEoKipvdXRidWYsCi0JCQkJCQljMSwgYzIpCi0JCQkJZWxzZSBUUllNQVBfREVDKGppc3gwMjA4LCAqKm91dGJ1ZiwgYzEsIGMyKSB7Ci0JCQkJCU5FWFRfT1VUKDEpCi0JCQkJfQotCQkJCWVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2JtcCwgKipvdXRidWYsCi0JCQkJCQljMSwgYzIpIHsKLQkJCQkJTkVYVF9PVVQoMSkKLQkJCQl9Ci0JCQkJZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfZW1wLCBjb2RlLCBjMSwgYzIpIHsKLQkJCQkJV1JJVEVVQ1M0KEVNUEJBU0UgfCBjb2RlKQotCQkJCX0KLQkJCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfcGFpciwgY29kZSwgYzEsIGMyKSB7Ci0JCQkJCVdSSVRFMihjb2RlID4+IDE2LCBjb2RlICYgMHhmZmZmKQotCQkJCQlORVhUX09VVCgyKQotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXJldHVybiAyOwotCQkJCU5FWFRfSU4oMikKLQkJCX0KLQkJCWVsc2UgeyAvKiBQbGFuZSAyICovCi0JCQkJaWYgKGMxID49IDB4NjcpIGMxICs9IDB4MDc7Ci0JCQkJZWxzZSBpZiAoYzEgPj0gMHg2MyB8fCBjMSA9PSAweDVmKSBjMSAtPSAweDM3OwotCQkJCWVsc2UgYzEgLT0gMHgzZDsKKyAgICAgICAgICAgIGlmIChjMSA8IDB4NWUpIHsgLyogUGxhbmUgMSAqLworICAgICAgICAgICAgICAgIGMxICs9IDB4MjE7CisgICAgICAgICAgICAgICAgRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTEoKipvdXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxLCBjMikKKyAgICAgICAgICAgICAgICBlbHNlIFRSWU1BUF9ERUMoamlzeDAyMDgsICoqb3V0YnVmLCBjMSwgYzIpIHsKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9PVVQoMSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzFfYm1wLCAqKm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEsIGMyKSB7CisgICAgICAgICAgICAgICAgICAgIE5FWFRfT1VUKDEpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgVFJZTUFQX0RFQyhqaXN4MDIxM18xX2VtcCwgY29kZSwgYzEsIGMyKSB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFVUNTNChFTVBCQVNFIHwgY29kZSkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzX3BhaXIsIGNvZGUsIGMxLCBjMikgeworICAgICAgICAgICAgICAgICAgICBXUklURTIoY29kZSA+PiAxNiwgY29kZSAmIDB4ZmZmZikKKyAgICAgICAgICAgICAgICAgICAgTkVYVF9PVVQoMikKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgICAgICBORVhUX0lOKDIpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgLyogUGxhbmUgMiAqLworICAgICAgICAgICAgICAgIGlmIChjMSA+PSAweDY3KSBjMSArPSAweDA3OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMxID49IDB4NjMgfHwgYzEgPT0gMHg1ZikgYzEgLT0gMHgzNzsKKyAgICAgICAgICAgICAgICBlbHNlIGMxIC09IDB4M2Q7CiAKLQkJCQlFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMigqKm91dGJ1ZiwKLQkJCQkJCWMxLCBjMikKLQkJCQllbHNlIFRSWU1BUF9ERUMoamlzeDAyMTNfMl9ibXAsICoqb3V0YnVmLAotCQkJCQkJYzEsIGMyKSA7Ci0JCQkJZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfZW1wLCBjb2RlLCBjMSwgYzIpIHsKLQkJCQkJV1JJVEVVQ1M0KEVNUEJBU0UgfCBjb2RlKQotCQkJCQlORVhUX0lOKDIpCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXJldHVybiAyOwotCQkJCU5FWFQoMiwgMSkKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAyOworICAgICAgICAgICAgICAgIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUyKCoqb3V0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMSwgYzIpCisgICAgICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfYm1wLCAqKm91dGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEsIGMyKSA7CisgICAgICAgICAgICAgICAgZWxzZSBUUllNQVBfREVDKGppc3gwMjEzXzJfZW1wLCBjb2RlLCBjMSwgYzIpIHsKKyAgICAgICAgICAgICAgICAgICAgV1JJVEVVQ1M0KEVNUEJBU0UgfCBjb2RlKQorICAgICAgICAgICAgICAgICAgICBORVhUX0lOKDIpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAyOwogCi0JCU5FWFQoMSwgMSkgLyogSklTIFggMDIwMSAqLwotCX0KKyAgICAgICAgTkVYVCgxLCAxKSAvKiBKSVMgWCAwMjAxICovCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19rci5jIGIvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc19rci5jCmluZGV4IDE2MTk2N2UuLjkyNzJlMzYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3Nfa3IuYworKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX2tyLmMKQEAgLTExLDE1MSArMTEsMTUxIEBACiAgKiBFVUMtS1IgY29kZWMKICAqLwogCi0jZGVmaW5lIEVVQ0tSX0pBTU9fRklSU1RCWVRFCTB4QTQKLSNkZWZpbmUgRVVDS1JfSkFNT19GSUxMRVIJMHhENAorI2RlZmluZSBFVUNLUl9KQU1PX0ZJUlNUQllURSAgICAweEE0CisjZGVmaW5lIEVVQ0tSX0pBTU9fRklMTEVSICAgICAgIDB4RDQKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdTJjZ2tfY2hvc2VvbmdbMTldID0gewotCTB4YTEsIDB4YTIsIDB4YTQsIDB4YTcsIDB4YTgsIDB4YTksIDB4YjEsIDB4YjIsCi0JMHhiMywgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwKLQkweGJjLCAweGJkLCAweGJlCisgICAgMHhhMSwgMHhhMiwgMHhhNCwgMHhhNywgMHhhOCwgMHhhOSwgMHhiMSwgMHhiMiwKKyAgICAweGIzLCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJiLAorICAgIDB4YmMsIDB4YmQsIDB4YmUKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB1MmNna19qdW5nc2VvbmdbMjFdID0gewotCTB4YmYsIDB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsCi0JMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwKLQkweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzCisgICAgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwKKyAgICAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLAorICAgIDB4Y2YsIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB1MmNna19qb25nc2VvbmdbMjhdID0gewotCTB4ZDQsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsCi0JMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgMHhiMCwKLQkweGIxLCAweGIyLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGJhLAotCTB4YmIsIDB4YmMsIDB4YmQsIDB4YmUKKyAgICAweGQ0LCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LAorICAgIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsCisgICAgMHhiMSwgMHhiMiwgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiYSwKKyAgICAweGJiLCAweGJjLCAweGJkLCAweGJlCiB9OwogCiBFTkNPREVSKGV1Y19rcikKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQlQeV9VTklDT0RFIGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIFB5X1VOSUNPREUgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCVVDUzRJTlZBTElEKGMpCisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBVQ1M0SU5WQUxJRChjKQogCi0JCVJFUVVJUkVfT1VUQlVGKDIpCi0JCVRSWU1BUF9FTkMoY3A5NDksIGNvZGUsIGMpOwotCQllbHNlIHJldHVybiAxOworICAgICAgICBSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBUUllNQVBfRU5DKGNwOTQ5LCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMTsKIAotCQlpZiAoKGNvZGUgJiAweDgwMDApID09IDApIHsKLQkJCS8qIEtTIFggMTAwMSBjb2RlZCBjaGFyYWN0ZXIgKi8KLQkJCU9VVDEoKGNvZGUgPj4gOCkgfCAweDgwKQotCQkJT1VUMigoY29kZSAmIDB4RkYpIHwgMHg4MCkKLQkJCU5FWFQoMSwgMikKLQkJfQotCQllbHNlIHsJLyogTWFwcGluZyBpcyBmb3VuZCBpbiBDUDk0OSBleHRlbnNpb24sCi0JCQkgKiBidXQgd2UgZW5jb2RlIGl0IGluIEtTIFggMTAwMToxOTk4IEFubmV4IDMsCi0JCQkgKiBtYWtlLXVwIHNlcXVlbmNlIGZvciBFVUMtS1IuICovCisgICAgICAgIGlmICgoY29kZSAmIDB4ODAwMCkgPT0gMCkgeworICAgICAgICAgICAgLyogS1MgWCAxMDAxIGNvZGVkIGNoYXJhY3RlciAqLworICAgICAgICAgICAgT1VUMSgoY29kZSA+PiA4KSB8IDB4ODApCisgICAgICAgICAgICBPVVQyKChjb2RlICYgMHhGRikgfCAweDgwKQorICAgICAgICAgICAgTkVYVCgxLCAyKQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAgICAgICAgICAvKiBNYXBwaW5nIGlzIGZvdW5kIGluIENQOTQ5IGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgKiBidXQgd2UgZW5jb2RlIGl0IGluIEtTIFggMTAwMToxOTk4IEFubmV4IDMsCisgICAgICAgICAgICAgICAgICogbWFrZS11cCBzZXF1ZW5jZSBmb3IgRVVDLUtSLiAqLwogCi0JCQlSRVFVSVJFX09VVEJVRig4KQorICAgICAgICAgICAgUkVRVUlSRV9PVVRCVUYoOCkKIAotCQkJLyogc3lsbGFibGUgY29tcG9zaXRpb24gcHJlY2VkZW5jZSAqLwotCQkJT1VUMShFVUNLUl9KQU1PX0ZJUlNUQllURSkKLQkJCU9VVDIoRVVDS1JfSkFNT19GSUxMRVIpCisgICAgICAgICAgICAvKiBzeWxsYWJsZSBjb21wb3NpdGlvbiBwcmVjZWRlbmNlICovCisgICAgICAgICAgICBPVVQxKEVVQ0tSX0pBTU9fRklSU1RCWVRFKQorICAgICAgICAgICAgT1VUMihFVUNLUl9KQU1PX0ZJTExFUikKIAotCQkJLyogQWxsIGNvZGVwb2ludHMgaW4gQ1A5NDkgZXh0ZW5zaW9uIGFyZSBpbiB1bmljb2RlCi0JCQkgKiBIYW5ndWwgU3lsbGFibGUgYXJlYS4gKi8KLQkJCWFzc2VydCgweGFjMDAgPD0gYyAmJiBjIDw9IDB4ZDdhMyk7Ci0JCQljIC09IDB4YWMwMDsKKyAgICAgICAgICAgIC8qIEFsbCBjb2RlcG9pbnRzIGluIENQOTQ5IGV4dGVuc2lvbiBhcmUgaW4gdW5pY29kZQorICAgICAgICAgICAgICogSGFuZ3VsIFN5bGxhYmxlIGFyZWEuICovCisgICAgICAgICAgICBhc3NlcnQoMHhhYzAwIDw9IGMgJiYgYyA8PSAweGQ3YTMpOworICAgICAgICAgICAgYyAtPSAweGFjMDA7CiAKLQkJCU9VVDMoRVVDS1JfSkFNT19GSVJTVEJZVEUpCi0JCQlPVVQ0KHUyY2drX2Nob3Nlb25nW2MgLyA1ODhdKQotCQkJTkVYVF9PVVQoNCkKKyAgICAgICAgICAgIE9VVDMoRVVDS1JfSkFNT19GSVJTVEJZVEUpCisgICAgICAgICAgICBPVVQ0KHUyY2drX2Nob3Nlb25nW2MgLyA1ODhdKQorICAgICAgICAgICAgTkVYVF9PVVQoNCkKIAotCQkJT1VUMShFVUNLUl9KQU1PX0ZJUlNUQllURSkKLQkJCU9VVDIodTJjZ2tfanVuZ3Nlb25nWyhjIC8gMjgpICUgMjFdKQotCQkJT1VUMyhFVUNLUl9KQU1PX0ZJUlNUQllURSkKLQkJCU9VVDQodTJjZ2tfam9uZ3Nlb25nW2MgJSAyOF0pCi0JCQlORVhUKDEsIDQpCi0JCX0KLQl9CisgICAgICAgICAgICBPVVQxKEVVQ0tSX0pBTU9fRklSU1RCWVRFKQorICAgICAgICAgICAgT1VUMih1MmNna19qdW5nc2VvbmdbKGMgLyAyOCkgJSAyMV0pCisgICAgICAgICAgICBPVVQzKEVVQ0tSX0pBTU9fRklSU1RCWVRFKQorICAgICAgICAgICAgT1VUNCh1MmNna19qb25nc2VvbmdbYyAlIDI4XSkKKyAgICAgICAgICAgIE5FWFQoMSwgNCkKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCi0jZGVmaW5lIE5PTkUJMTI3CisjZGVmaW5lIE5PTkUgICAgMTI3CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGNnazJ1X2Nob3Nlb25nW10gPSB7IC8qIFtBMSwgQkVdICovCi0JICAgMCwgICAgMSwgTk9ORSwgICAgMiwgTk9ORSwgTk9ORSwgICAgMywgICAgNCwKLQkgICA1LCBOT05FLCBOT05FLCBOT05FLCBOT05FLCBOT05FLCBOT05FLCBOT05FLAotCSAgIDYsICAgIDcsICAgIDgsIE5PTkUsICAgIDksICAgMTAsICAgMTEsICAgMTIsCi0JICAxMywgICAxNCwgICAxNSwgICAxNiwgICAxNywgICAxOAorICAgICAgIDAsICAgIDEsIE5PTkUsICAgIDIsIE5PTkUsIE5PTkUsICAgIDMsICAgIDQsCisgICAgICAgNSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwgTk9ORSwKKyAgICAgICA2LCAgICA3LCAgICA4LCBOT05FLCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLAorICAgICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgKIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBjZ2sydV9qb25nc2VvbmdbXSA9IHsgLyogW0ExLCBCRV0gKi8KLQkgICAxLCAgICAyLCAgICAzLCAgICA0LCAgICA1LCAgICA2LCAgICA3LCBOT05FLAotCSAgIDgsICAgIDksICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTUsCi0JICAxNiwgICAxNywgTk9ORSwgICAxOCwgICAxOSwgICAyMCwgICAyMSwgICAyMiwKLQlOT05FLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDI3CisgICAgICAgMSwgICAgMiwgICAgMywgICAgNCwgICAgNSwgICAgNiwgICAgNywgTk9ORSwKKyAgICAgICA4LCAgICA5LCAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LAorICAgICAgMTYsICAgMTcsIE5PTkUsICAgMTgsICAgMTksICAgMjAsICAgMjEsICAgMjIsCisgICAgTk9ORSwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNwogfTsKIAogREVDT0RFUihldWNfa3IpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKIAotCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJT1VUMShjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBPVVQxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKQogCi0JCWlmIChjID09IEVVQ0tSX0pBTU9fRklSU1RCWVRFICYmCi0JCSAgICBJTjIgPT0gRVVDS1JfSkFNT19GSUxMRVIpIHsKLQkJCS8qIEtTIFggMTAwMToxOTk4IEFubmV4IDMgbWFrZS11cCBzZXF1ZW5jZSAqLwotCQkJREJDSEFSIGNobywganVuZywgam9uZzsKKyAgICAgICAgaWYgKGMgPT0gRVVDS1JfSkFNT19GSVJTVEJZVEUgJiYKKyAgICAgICAgICAgIElOMiA9PSBFVUNLUl9KQU1PX0ZJTExFUikgeworICAgICAgICAgICAgLyogS1MgWCAxMDAxOjE5OTggQW5uZXggMyBtYWtlLXVwIHNlcXVlbmNlICovCisgICAgICAgICAgICBEQkNIQVIgY2hvLCBqdW5nLCBqb25nOwogCi0JCQlSRVFVSVJFX0lOQlVGKDgpCi0JCQlpZiAoKCppbmJ1ZilbMl0gIT0gRVVDS1JfSkFNT19GSVJTVEJZVEUgfHwKLQkJCSAgICAoKmluYnVmKVs0XSAhPSBFVUNLUl9KQU1PX0ZJUlNUQllURSB8fAotCQkJICAgICgqaW5idWYpWzZdICE9IEVVQ0tSX0pBTU9fRklSU1RCWVRFKQotCQkJCXJldHVybiA4OworICAgICAgICAgICAgUkVRVUlSRV9JTkJVRig4KQorICAgICAgICAgICAgaWYgKCgqaW5idWYpWzJdICE9IEVVQ0tSX0pBTU9fRklSU1RCWVRFIHx8CisgICAgICAgICAgICAgICAgKCppbmJ1ZilbNF0gIT0gRVVDS1JfSkFNT19GSVJTVEJZVEUgfHwKKyAgICAgICAgICAgICAgICAoKmluYnVmKVs2XSAhPSBFVUNLUl9KQU1PX0ZJUlNUQllURSkKKyAgICAgICAgICAgICAgICByZXR1cm4gODsKIAotCQkJYyA9ICgqaW5idWYpWzNdOwotCQkJaWYgKDB4YTEgPD0gYyAmJiBjIDw9IDB4YmUpCi0JCQkJY2hvID0gY2drMnVfY2hvc2VvbmdbYyAtIDB4YTFdOwotCQkJZWxzZQotCQkJCWNobyA9IE5PTkU7CisgICAgICAgICAgICBjID0gKCppbmJ1ZilbM107CisgICAgICAgICAgICBpZiAoMHhhMSA8PSBjICYmIGMgPD0gMHhiZSkKKyAgICAgICAgICAgICAgICBjaG8gPSBjZ2sydV9jaG9zZW9uZ1tjIC0gMHhhMV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY2hvID0gTk9ORTsKIAotCQkJYyA9ICgqaW5idWYpWzVdOwotCQkJanVuZyA9ICgweGJmIDw9IGMgJiYgYyA8PSAweGQzKSA/IGMgLSAweGJmIDogTk9ORTsKKyAgICAgICAgICAgIGMgPSAoKmluYnVmKVs1XTsKKyAgICAgICAgICAgIGp1bmcgPSAoMHhiZiA8PSBjICYmIGMgPD0gMHhkMykgPyBjIC0gMHhiZiA6IE5PTkU7CiAKLQkJCWMgPSAoKmluYnVmKVs3XTsKLQkJCWlmIChjID09IEVVQ0tSX0pBTU9fRklMTEVSKQotCQkJCWpvbmcgPSAwOwotCQkJZWxzZSBpZiAoMHhhMSA8PSBjICYmIGMgPD0gMHhiZSkKLQkJCQlqb25nID0gY2drMnVfam9uZ3Nlb25nW2MgLSAweGExXTsKLQkJCWVsc2UKLQkJCQlqb25nID0gTk9ORTsKKyAgICAgICAgICAgIGMgPSAoKmluYnVmKVs3XTsKKyAgICAgICAgICAgIGlmIChjID09IEVVQ0tSX0pBTU9fRklMTEVSKQorICAgICAgICAgICAgICAgIGpvbmcgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAoMHhhMSA8PSBjICYmIGMgPD0gMHhiZSkKKyAgICAgICAgICAgICAgICBqb25nID0gY2drMnVfam9uZ3Nlb25nW2MgLSAweGExXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBqb25nID0gTk9ORTsKIAotCQkJaWYgKGNobyA9PSBOT05FIHx8IGp1bmcgPT0gTk9ORSB8fCBqb25nID09IE5PTkUpCi0JCQkJcmV0dXJuIDg7CisgICAgICAgICAgICBpZiAoY2hvID09IE5PTkUgfHwganVuZyA9PSBOT05FIHx8IGpvbmcgPT0gTk9ORSkKKyAgICAgICAgICAgICAgICByZXR1cm4gODsKIAotCQkJT1VUMSgweGFjMDAgKyBjaG8qNTg4ICsganVuZyoyOCArIGpvbmcpOwotCQkJTkVYVCg4LCAxKQotCQl9Ci0JCWVsc2UgVFJZTUFQX0RFQyhrc3gxMDAxLCAqKm91dGJ1ZiwgYyBeIDB4ODAsIElOMiBeIDB4ODApIHsKLQkJCU5FWFQoMiwgMSkKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMjsKLQl9CisgICAgICAgICAgICBPVVQxKDB4YWMwMCArIGNobyo1ODggKyBqdW5nKjI4ICsgam9uZyk7CisgICAgICAgICAgICBORVhUKDgsIDEpCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBUUllNQVBfREVDKGtzeDEwMDEsICoqb3V0YnVmLCBjIF4gMHg4MCwgSU4yIF4gMHg4MCkgeworICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAyOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogI3VuZGVmIE5PTkUKIApAQCAtMTY2LDU0ICsxNjYsNTQgQEAKIAogRU5DT0RFUihjcDk0OSkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQlQeV9VTklDT0RFIGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIFB5X1VOSUNPREUgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCVVDUzRJTlZBTElEKGMpCisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBVQ1M0SU5WQUxJRChjKQogCi0JCVJFUVVJUkVfT1VUQlVGKDIpCi0JCVRSWU1BUF9FTkMoY3A5NDksIGNvZGUsIGMpOwotCQllbHNlIHJldHVybiAxOworICAgICAgICBSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBUUllNQVBfRU5DKGNwOTQ5LCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMTsKIAotCQlPVVQxKChjb2RlID4+IDgpIHwgMHg4MCkKLQkJaWYgKGNvZGUgJiAweDgwMDApCi0JCQlPVVQyKGNvZGUgJiAweEZGKSAvKiBNU0Igc2V0OiBDUDk0OSAqLwotCQllbHNlCi0JCQlPVVQyKChjb2RlICYgMHhGRikgfCAweDgwKSAvKiBNU0IgdW5zZXQ6IGtzIHggMTAwMSAqLwotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBPVVQxKChjb2RlID4+IDgpIHwgMHg4MCkKKyAgICAgICAgaWYgKGNvZGUgJiAweDgwMDApCisgICAgICAgICAgICBPVVQyKGNvZGUgJiAweEZGKSAvKiBNU0Igc2V0OiBDUDk0OSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBPVVQyKChjb2RlICYgMHhGRikgfCAweDgwKSAvKiBNU0IgdW5zZXQ6IGtzIHggMTAwMSAqLworICAgICAgICBORVhUKDEsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIERFQ09ERVIoY3A5NDkpCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJdW5zaWduZWQgY2hhciBjID0gSU4xOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IElOMTsKIAotCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJT1VUMShjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBPVVQxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfSU5CVUYoMikKLQkJVFJZTUFQX0RFQyhrc3gxMDAxLCAqKm91dGJ1ZiwgYyBeIDB4ODAsIElOMiBeIDB4ODApOwotCQllbHNlIFRSWU1BUF9ERUMoY3A5NDlleHQsICoqb3V0YnVmLCBjLCBJTjIpOwotCQllbHNlIHJldHVybiAyOworICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIFRSWU1BUF9ERUMoa3N4MTAwMSwgKipvdXRidWYsIGMgXiAweDgwLCBJTjIgXiAweDgwKTsKKyAgICAgICAgZWxzZSBUUllNQVBfREVDKGNwOTQ5ZXh0LCAqKm91dGJ1ZiwgYywgSU4yKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMjsKIAotCQlORVhUKDIsIDEpCi0JfQorICAgICAgICBORVhUKDIsIDEpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMjUwLDU4ICsyNTAsNTggQEAKIAogRU5DT0RFUihqb2hhYikKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQlQeV9VTklDT0RFIGMgPSBJTjE7Ci0JCURCQ0hBUiBjb2RlOworICAgIHdoaWxlIChpbmxlZnQgPiAwKSB7CisgICAgICAgIFB5X1VOSUNPREUgYyA9IElOMTsKKyAgICAgICAgREJDSEFSIGNvZGU7CiAKLQkJaWYgKGMgPCAweDgwKSB7Ci0JCQlXUklURTEoKHVuc2lnbmVkIGNoYXIpYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCVVDUzRJTlZBTElEKGMpCisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBVQ1M0SU5WQUxJRChjKQogCi0JCVJFUVVJUkVfT1VUQlVGKDIpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDIpCiAKLQkJaWYgKGMgPj0gMHhhYzAwICYmIGMgPD0gMHhkN2EzKSB7Ci0JCQljIC09IDB4YWMwMDsKLQkJCWNvZGUgPSAweDgwMDAgfAotCQkJCSh1MmpvaGFiaWR4X2Nob3Nlb25nW2MgLyA1ODhdIDw8IDEwKSB8Ci0JCQkJKHUyam9oYWJpZHhfanVuZ3Nlb25nWyhjIC8gMjgpICUgMjFdIDw8IDUpIHwKLQkJCQl1MmpvaGFiaWR4X2pvbmdzZW9uZ1tjICUgMjhdOwotCQl9Ci0JCWVsc2UgaWYgKGMgPj0gMHgzMTMxICYmIGMgPD0gMHgzMTYzKQotCQkJY29kZSA9IHUyam9oYWJqYW1vW2MgLSAweDMxMzFdOwotCQllbHNlIFRSWU1BUF9FTkMoY3A5NDksIGNvZGUsIGMpIHsKLQkJCXVuc2lnbmVkIGNoYXIgYzEsIGMyLCB0MjsKLQkJCXVuc2lnbmVkIHNob3J0IHQxOworICAgICAgICBpZiAoYyA+PSAweGFjMDAgJiYgYyA8PSAweGQ3YTMpIHsKKyAgICAgICAgICAgIGMgLT0gMHhhYzAwOworICAgICAgICAgICAgY29kZSA9IDB4ODAwMCB8CisgICAgICAgICAgICAgICAgKHUyam9oYWJpZHhfY2hvc2VvbmdbYyAvIDU4OF0gPDwgMTApIHwKKyAgICAgICAgICAgICAgICAodTJqb2hhYmlkeF9qdW5nc2VvbmdbKGMgLyAyOCkgJSAyMV0gPDwgNSkgfAorICAgICAgICAgICAgICAgIHUyam9oYWJpZHhfam9uZ3Nlb25nW2MgJSAyOF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoYyA+PSAweDMxMzEgJiYgYyA8PSAweDMxNjMpCisgICAgICAgICAgICBjb2RlID0gdTJqb2hhYmphbW9bYyAtIDB4MzEzMV07CisgICAgICAgIGVsc2UgVFJZTUFQX0VOQyhjcDk0OSwgY29kZSwgYykgeworICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjMSwgYzIsIHQyOworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdDE7CiAKLQkJCWFzc2VydCgoY29kZSAmIDB4ODAwMCkgPT0gMCk7Ci0JCQljMSA9IGNvZGUgPj4gODsKLQkJCWMyID0gY29kZSAmIDB4ZmY7Ci0JCQlpZiAoKChjMSA+PSAweDIxICYmIGMxIDw9IDB4MmMpIHx8Ci0JCQkgICAgKGMxID49IDB4NGEgJiYgYzEgPD0gMHg3ZCkpICYmCi0JCQkgICAgKGMyID49IDB4MjEgJiYgYzIgPD0gMHg3ZSkpIHsKLQkJCQl0MSA9IChjMSA8IDB4NGEgPyAoYzEgLSAweDIxICsgMHgxYjIpIDoKLQkJCQkJCSAgKGMxIC0gMHgyMSArIDB4MTk3KSk7Ci0JCQkJdDIgPSAoKHQxICYgMSkgPyAweDVlIDogMCkgKyAoYzIgLSAweDIxKTsKLQkJCQlPVVQxKHQxID4+IDEpCi0JCQkJT1VUMih0MiA8IDB4NGUgPyB0MiArIDB4MzEgOiB0MiArIDB4NDMpCi0JCQkJTkVYVCgxLCAyKQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZQotCQkJCXJldHVybiAxOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAxOworICAgICAgICAgICAgYXNzZXJ0KChjb2RlICYgMHg4MDAwKSA9PSAwKTsKKyAgICAgICAgICAgIGMxID0gY29kZSA+PiA4OworICAgICAgICAgICAgYzIgPSBjb2RlICYgMHhmZjsKKyAgICAgICAgICAgIGlmICgoKGMxID49IDB4MjEgJiYgYzEgPD0gMHgyYykgfHwKKyAgICAgICAgICAgICAgICAoYzEgPj0gMHg0YSAmJiBjMSA8PSAweDdkKSkgJiYKKyAgICAgICAgICAgICAgICAoYzIgPj0gMHgyMSAmJiBjMiA8PSAweDdlKSkgeworICAgICAgICAgICAgICAgIHQxID0gKGMxIDwgMHg0YSA/IChjMSAtIDB4MjEgKyAweDFiMikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAoYzEgLSAweDIxICsgMHgxOTcpKTsKKyAgICAgICAgICAgICAgICB0MiA9ICgodDEgJiAxKSA/IDB4NWUgOiAwKSArIChjMiAtIDB4MjEpOworICAgICAgICAgICAgICAgIE9VVDEodDEgPj4gMSkKKyAgICAgICAgICAgICAgICBPVVQyKHQyIDwgMHg0ZSA/IHQyICsgMHgzMSA6IHQyICsgMHg0MykKKyAgICAgICAgICAgICAgICBORVhUKDEsIDIpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJT1VUMShjb2RlID4+IDgpCi0JCU9VVDIoY29kZSAmIDB4ZmYpCi0JCU5FWFQoMSwgMikKLQl9CisgICAgICAgIE9VVDEoY29kZSA+PiA4KQorICAgICAgICBPVVQyKGNvZGUgJiAweGZmKQorICAgICAgICBORVhUKDEsIDIpCisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgRklMTCAweGZkCkBAIC0zNDcsOTEgKzM0Nyw5MSBAQAogCiBERUNPREVSKGpvaGFiKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgICAgYyA9IElOMSwgYzI7CisgICAgd2hpbGUgKGlubGVmdCA+IDApIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciAgICBjID0gSU4xLCBjMjsKIAotCQlSRVFVSVJFX09VVEJVRigxKQorICAgICAgICBSRVFVSVJFX09VVEJVRigxKQogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJT1VUMShjKQotCQkJTkVYVCgxLCAxKQotCQkJY29udGludWU7Ci0JCX0KKyAgICAgICAgaWYgKGMgPCAweDgwKSB7CisgICAgICAgICAgICBPVVQxKGMpCisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCVJFUVVJUkVfSU5CVUYoMikKLQkJYzIgPSBJTjI7CisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKKyAgICAgICAgYzIgPSBJTjI7CiAKLQkJaWYgKGMgPCAweGQ4KSB7Ci0JCQkvKiBqb2hhYiBoYW5ndWwgKi8KLQkJCXVuc2lnbmVkIGNoYXIgY19jaG8sIGNfanVuZywgY19qb25nOwotCQkJdW5zaWduZWQgY2hhciBpX2NobywgaV9qdW5nLCBpX2pvbmc7CisgICAgICAgIGlmIChjIDwgMHhkOCkgeworICAgICAgICAgICAgLyogam9oYWIgaGFuZ3VsICovCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGNfY2hvLCBjX2p1bmcsIGNfam9uZzsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaV9jaG8sIGlfanVuZywgaV9qb25nOwogCi0JCQljX2NobyA9IChjID4+IDIpICYgMHgxZjsKLQkJCWNfanVuZyA9ICgoYyA8PCAzKSB8IGMyID4+IDUpICYgMHgxZjsKLQkJCWNfam9uZyA9IGMyICYgMHgxZjsKKyAgICAgICAgICAgIGNfY2hvID0gKGMgPj4gMikgJiAweDFmOworICAgICAgICAgICAgY19qdW5nID0gKChjIDw8IDMpIHwgYzIgPj4gNSkgJiAweDFmOworICAgICAgICAgICAgY19qb25nID0gYzIgJiAweDFmOwogCi0JCQlpX2NobyA9IGpvaGFiaWR4X2Nob3Nlb25nW2NfY2hvXTsKLQkJCWlfanVuZyA9IGpvaGFiaWR4X2p1bmdzZW9uZ1tjX2p1bmddOwotCQkJaV9qb25nID0gam9oYWJpZHhfam9uZ3Nlb25nW2Nfam9uZ107CisgICAgICAgICAgICBpX2NobyA9IGpvaGFiaWR4X2Nob3Nlb25nW2NfY2hvXTsKKyAgICAgICAgICAgIGlfanVuZyA9IGpvaGFiaWR4X2p1bmdzZW9uZ1tjX2p1bmddOworICAgICAgICAgICAgaV9qb25nID0gam9oYWJpZHhfam9uZ3Nlb25nW2Nfam9uZ107CiAKLQkJCWlmIChpX2NobyA9PSBOT05FIHx8IGlfanVuZyA9PSBOT05FIHx8IGlfam9uZyA9PSBOT05FKQotCQkJCXJldHVybiAyOworICAgICAgICAgICAgaWYgKGlfY2hvID09IE5PTkUgfHwgaV9qdW5nID09IE5PTkUgfHwgaV9qb25nID09IE5PTkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAKLQkJCS8qIHdlIGRvbid0IHVzZSBVKzExMDAgaGFuZ3VsIGphbW8geWV0LiAqLwotCQkJaWYgKGlfY2hvID09IEZJTEwpIHsKLQkJCQlpZiAoaV9qdW5nID09IEZJTEwpIHsKLQkJCQkJaWYgKGlfam9uZyA9PSBGSUxMKQotCQkJCQkJT1VUMSgweDMwMDApCi0JCQkJCWVsc2UKLQkJCQkJCU9VVDEoMHgzMTAwIHwKLQkJCQkJCSAgam9oYWJqYW1vX2pvbmdzZW9uZ1tjX2pvbmddKQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGlfam9uZyA9PSBGSUxMKQotCQkJCQkJT1VUMSgweDMxMDAgfAotCQkJCQkJICBqb2hhYmphbW9fanVuZ3Nlb25nW2NfanVuZ10pCi0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiAyOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGlfanVuZyA9PSBGSUxMKSB7Ci0JCQkJCWlmIChpX2pvbmcgPT0gRklMTCkKLQkJCQkJCU9VVDEoMHgzMTAwIHwKLQkJCQkJCSAgam9oYWJqYW1vX2Nob3Nlb25nW2NfY2hvXSkKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIDI7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJT1VUMSgweGFjMDAgKwotCQkJCQkgICAgIGlfY2hvICogNTg4ICsKLQkJCQkJICAgICBpX2p1bmcgKiAyOCArCi0JCQkJCSAgICAgKGlfam9uZyA9PSBGSUxMID8gMCA6IGlfam9uZykpCi0JCQl9Ci0JCQlORVhUKDIsIDEpCi0JCX0gZWxzZSB7Ci0JCQkvKiBLUyBYIDEwMDEgZXhjZXB0IGhhbmd1bCBqYW1vcyBhbmQgc3lsbGFibGVzICovCi0JCQlpZiAoYyA9PSAweGRmIHx8IGMgPiAweGY5IHx8Ci0JCQkgICAgYzIgPCAweDMxIHx8IChjMiA+PSAweDgwICYmIGMyIDwgMHg5MSkgfHwKLQkJCSAgICAoYzIgJiAweDdmKSA9PSAweDdmIHx8Ci0JCQkgICAgKGMgPT0gMHhkYSAmJiAoYzIgPj0gMHhhMSAmJiBjMiA8PSAweGQzKSkpCi0JCQkJcmV0dXJuIDI7Ci0JCQllbHNlIHsKLQkJCQl1bnNpZ25lZCBjaGFyIHQxLCB0MjsKKyAgICAgICAgICAgIC8qIHdlIGRvbid0IHVzZSBVKzExMDAgaGFuZ3VsIGphbW8geWV0LiAqLworICAgICAgICAgICAgaWYgKGlfY2hvID09IEZJTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoaV9qdW5nID09IEZJTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlfam9uZyA9PSBGSUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgT1VUMSgweDMwMDApCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVDEoMHgzMTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgam9oYWJqYW1vX2pvbmdzZW9uZ1tjX2pvbmddKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlfam9uZyA9PSBGSUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgT1VUMSgweDMxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBqb2hhYmphbW9fanVuZ3Nlb25nW2NfanVuZ10pCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGlfanVuZyA9PSBGSUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpX2pvbmcgPT0gRklMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIE9VVDEoMHgzMTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgam9oYWJqYW1vX2Nob3Nlb25nW2NfY2hvXSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgT1VUMSgweGFjMDAgKworICAgICAgICAgICAgICAgICAgICAgICAgIGlfY2hvICogNTg4ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpX2p1bmcgKiAyOCArCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlfam9uZyA9PSBGSUxMID8gMCA6IGlfam9uZykpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBORVhUKDIsIDEpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBLUyBYIDEwMDEgZXhjZXB0IGhhbmd1bCBqYW1vcyBhbmQgc3lsbGFibGVzICovCisgICAgICAgICAgICBpZiAoYyA9PSAweGRmIHx8IGMgPiAweGY5IHx8CisgICAgICAgICAgICAgICAgYzIgPCAweDMxIHx8IChjMiA+PSAweDgwICYmIGMyIDwgMHg5MSkgfHwKKyAgICAgICAgICAgICAgICAoYzIgJiAweDdmKSA9PSAweDdmIHx8CisgICAgICAgICAgICAgICAgKGMgPT0gMHhkYSAmJiAoYzIgPj0gMHhhMSAmJiBjMiA8PSAweGQzKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHQxLCB0MjsKIAotCQkJCXQxID0gKGMgPCAweGUwID8gMiAqIChjIC0gMHhkOSkgOgotCQkJCQkJIDIgKiBjIC0gMHgxOTcpOwotCQkJCXQyID0gKGMyIDwgMHg5MSA/IGMyIC0gMHgzMSA6IGMyIC0gMHg0Myk7Ci0JCQkJdDEgPSB0MSArICh0MiA8IDB4NWUgPyAwIDogMSkgKyAweDIxOwotCQkJCXQyID0gKHQyIDwgMHg1ZSA/IHQyIDogdDIgLSAweDVlKSArIDB4MjE7CisgICAgICAgICAgICAgICAgdDEgPSAoYyA8IDB4ZTAgPyAyICogKGMgLSAweGQ5KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIGMgLSAweDE5Nyk7CisgICAgICAgICAgICAgICAgdDIgPSAoYzIgPCAweDkxID8gYzIgLSAweDMxIDogYzIgLSAweDQzKTsKKyAgICAgICAgICAgICAgICB0MSA9IHQxICsgKHQyIDwgMHg1ZSA/IDAgOiAxKSArIDB4MjE7CisgICAgICAgICAgICAgICAgdDIgPSAodDIgPCAweDVlID8gdDIgOiB0MiAtIDB4NWUpICsgMHgyMTsKIAotCQkJCVRSWU1BUF9ERUMoa3N4MTAwMSwgKipvdXRidWYsIHQxLCB0Mik7Ci0JCQkJZWxzZSByZXR1cm4gMjsKLQkJCQlORVhUKDIsIDEpCi0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgVFJZTUFQX0RFQyhrc3gxMDAxLCAqKm91dGJ1ZiwgdDEsIHQyKTsKKyAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAyOworICAgICAgICAgICAgICAgIE5FWFQoMiwgMSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogI3VuZGVmIE5PTkUKICN1bmRlZiBGSUxMCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX3R3LmMgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9fY29kZWNzX3R3LmMKaW5kZXggOGNjYmNhMS4uMzhjZjcyMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvX2NvZGVjc190dy5jCisrKyBiL01vZHVsZXMvY2prY29kZWNzL19jb2RlY3NfdHcuYwpAQCAtMTMsNTIgKzEzLDUyIEBACiAKIEVOQ09ERVIoYmlnNSkKIHsKLQl3aGlsZSAoaW5sZWZ0ID4gMCkgewotCQlQeV9VTklDT0RFIGMgPSAqKmluYnVmOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSAqKmluYnVmOworICAgICAgICBEQkNIQVIgY29kZTsKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCVJFUVVJUkVfT1VUQlVGKDEpCi0JCQkqKm91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKWM7Ci0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFJFUVVJUkVfT1VUQlVGKDEpCisgICAgICAgICAgICAqKm91dGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKWM7CisgICAgICAgICAgICBORVhUKDEsIDEpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBVQ1M0SU5WQUxJRChjKQogCi0JCVJFUVVJUkVfT1VUQlVGKDIpCisgICAgICAgIFJFUVVJUkVfT1VUQlVGKDIpCiAKLQkJVFJZTUFQX0VOQyhiaWc1LCBjb2RlLCBjKTsKLQkJZWxzZSByZXR1cm4gMTsKKyAgICAgICAgVFJZTUFQX0VOQyhiaWc1LCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSByZXR1cm4gMTsKIAotCQlPVVQxKGNvZGUgPj4gOCkKLQkJT1VUMihjb2RlICYgMHhGRikKLQkJTkVYVCgxLCAyKQotCX0KKyAgICAgICAgT1VUMShjb2RlID4+IDgpCisgICAgICAgIE9VVDIoY29kZSAmIDB4RkYpCisgICAgICAgIE5FWFQoMSwgMikKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogREVDT0RFUihiaWc1KQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCi0JCVRSWU1BUF9ERUMoYmlnNSwgKipvdXRidWYsIGMsIElOMikgewotCQkJTkVYVCgyLCAxKQotCQl9Ci0JCWVsc2UgcmV0dXJuIDI7Ci0JfQorICAgICAgICBSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIFRSWU1BUF9ERUMoYmlnNSwgKipvdXRidWYsIGMsIElOMikgeworICAgICAgICAgICAgTkVYVCgyLCAxKQorICAgICAgICB9CisgICAgICAgIGVsc2UgcmV0dXJuIDI7CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtNjgsNTMgKzY4LDUzIEBACiAKIEVOQ09ERVIoY3A5NTApCiB7Ci0Jd2hpbGUgKGlubGVmdCA+IDApIHsKLQkJUHlfVU5JQ09ERSBjID0gSU4xOwotCQlEQkNIQVIgY29kZTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICBQeV9VTklDT0RFIGMgPSBJTjE7CisgICAgICAgIERCQ0hBUiBjb2RlOwogCi0JCWlmIChjIDwgMHg4MCkgewotCQkJV1JJVEUxKCh1bnNpZ25lZCBjaGFyKWMpCi0JCQlORVhUKDEsIDEpCi0JCQljb250aW51ZTsKLQkJfQotCQlVQ1M0SU5WQUxJRChjKQorICAgICAgICBpZiAoYyA8IDB4ODApIHsKKyAgICAgICAgICAgIFdSSVRFMSgodW5zaWduZWQgY2hhciljKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgVUNTNElOVkFMSUQoYykKIAotCQlSRVFVSVJFX09VVEJVRigyKQotCQlUUllNQVBfRU5DKGNwOTUwZXh0LCBjb2RlLCBjKTsKLQkJZWxzZSBUUllNQVBfRU5DKGJpZzUsIGNvZGUsIGMpOwotCQllbHNlIHJldHVybiAxOworICAgICAgICBSRVFVSVJFX09VVEJVRigyKQorICAgICAgICBUUllNQVBfRU5DKGNwOTUwZXh0LCBjb2RlLCBjKTsKKyAgICAgICAgZWxzZSBUUllNQVBfRU5DKGJpZzUsIGNvZGUsIGMpOworICAgICAgICBlbHNlIHJldHVybiAxOwogCi0JCU9VVDEoY29kZSA+PiA4KQotCQlPVVQyKGNvZGUgJiAweEZGKQotCQlORVhUKDEsIDIpCi0JfQorICAgICAgICBPVVQxKGNvZGUgPj4gOCkKKyAgICAgICAgT1VUMihjb2RlICYgMHhGRikKKyAgICAgICAgTkVYVCgxLCAyKQorICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBERUNPREVSKGNwOTUwKQogewotCXdoaWxlIChpbmxlZnQgPiAwKSB7Ci0JCXVuc2lnbmVkIGNoYXIgYyA9IElOMTsKKyAgICB3aGlsZSAoaW5sZWZ0ID4gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBJTjE7CiAKLQkJUkVRVUlSRV9PVVRCVUYoMSkKKyAgICAgICAgUkVRVUlSRV9PVVRCVUYoMSkKIAotCQlpZiAoYyA8IDB4ODApIHsKLQkJCU9VVDEoYykKLQkJCU5FWFQoMSwgMSkKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChjIDwgMHg4MCkgeworICAgICAgICAgICAgT1VUMShjKQorICAgICAgICAgICAgTkVYVCgxLCAxKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQlSRVFVSVJFX0lOQlVGKDIpCisgICAgICAgIFJFUVVJUkVfSU5CVUYoMikKIAotCQlUUllNQVBfREVDKGNwOTUwZXh0LCAqKm91dGJ1ZiwgYywgSU4yKTsKLQkJZWxzZSBUUllNQVBfREVDKGJpZzUsICoqb3V0YnVmLCBjLCBJTjIpOwotCQllbHNlIHJldHVybiAyOworICAgICAgICBUUllNQVBfREVDKGNwOTUwZXh0LCAqKm91dGJ1ZiwgYywgSU4yKTsKKyAgICAgICAgZWxzZSBUUllNQVBfREVDKGJpZzUsICoqb3V0YnVmLCBjLCBJTjIpOworICAgICAgICBlbHNlIHJldHVybiAyOwogCi0JCU5FWFQoMiwgMSkKLQl9CisgICAgICAgIE5FWFQoMiwgMSkKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9hbGdfamlzeDAyMDEuaCBiL01vZHVsZXMvY2prY29kZWNzL2FsZ19qaXN4MDIwMS5oCmluZGV4IDFmY2EwNmIuLjBiYzdkYjUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL2FsZ19qaXN4MDIwMS5oCisrKyBiL01vZHVsZXMvY2prY29kZWNzL2FsZ19qaXN4MDIwMS5oCkBAIC0xLDI0ICsxLDI0IEBACi0jZGVmaW5lIEpJU1gwMjAxX1JfRU5DT0RFKGMsIGFzc2kpCQkJXAotCWlmICgoYykgPCAweDgwICYmIChjKSAhPSAweDVjICYmIChjKSAhPSAweDdlKQlcCi0JCShhc3NpKSA9IChjKTsJCQkJXAotCWVsc2UgaWYgKChjKSA9PSAweDAwYTUpIChhc3NpKSA9IDB4NWM7CQlcCi0JZWxzZSBpZiAoKGMpID09IDB4MjAzZSkgKGFzc2kpID0gMHg3ZTsKLSNkZWZpbmUgSklTWDAyMDFfS19FTkNPREUoYywgYXNzaSkJCQlcCi0JaWYgKChjKSA+PSAweGZmNjEgJiYgKGMpIDw9IDB4ZmY5ZikJCVwKLQkJKGFzc2kpID0gKGMpIC0gMHhmZWMwOwotI2RlZmluZSBKSVNYMDIwMV9FTkNPREUoYywgYXNzaSkJCQlcCi0JSklTWDAyMDFfUl9FTkNPREUoYywgYXNzaSkJCQlcCi0JZWxzZSBKSVNYMDIwMV9LX0VOQ09ERShjLCBhc3NpKQorI2RlZmluZSBKSVNYMDIwMV9SX0VOQ09ERShjLCBhc3NpKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChjKSA8IDB4ODAgJiYgKGMpICE9IDB4NWMgJiYgKGMpICE9IDB4N2UpICAgICAgIFwKKyAgICAgICAgKGFzc2kpID0gKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKChjKSA9PSAweDAwYTUpIChhc3NpKSA9IDB4NWM7ICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4MjAzZSkgKGFzc2kpID0gMHg3ZTsKKyNkZWZpbmUgSklTWDAyMDFfS19FTkNPREUoYywgYXNzaSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoYykgPj0gMHhmZjYxICYmIChjKSA8PSAweGZmOWYpICAgICAgICAgICAgICAgICBcCisgICAgICAgIChhc3NpKSA9IChjKSAtIDB4ZmVjMDsKKyNkZWZpbmUgSklTWDAyMDFfRU5DT0RFKGMsIGFzc2kpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEpJU1gwMjAxX1JfRU5DT0RFKGMsIGFzc2kpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBKSVNYMDIwMV9LX0VOQ09ERShjLCBhc3NpKQogCi0jZGVmaW5lIEpJU1gwMjAxX1JfREVDT0RFKGMsIGFzc2kpCQkJXAotCWlmICgoYykgPCAweDVjKSAoYXNzaSkgPSAoYyk7CQkJXAotCWVsc2UgaWYgKChjKSA9PSAweDVjKSAoYXNzaSkgPSAweDAwYTU7CQlcCi0JZWxzZSBpZiAoKGMpIDwgMHg3ZSkgKGFzc2kpID0gKGMpOwkJXAotCWVsc2UgaWYgKChjKSA9PSAweDdlKSAoYXNzaSkgPSAweDIwM2U7CQlcCi0JZWxzZSBpZiAoKGMpID09IDB4N2YpIChhc3NpKSA9IDB4N2Y7Ci0jZGVmaW5lIEpJU1gwMjAxX0tfREVDT0RFKGMsIGFzc2kpCQkJXAotCWlmICgoYykgPj0gMHhhMSAmJiAoYykgPD0gMHhkZikJCQlcCi0JKGFzc2kpID0gMHhmZWMwICsgKGMpOwotI2RlZmluZSBKSVNYMDIwMV9ERUNPREUoYywgYXNzaSkJCQlcCi0JSklTWDAyMDFfUl9ERUNPREUoYywgYXNzaSkJCQlcCi0JZWxzZSBKSVNYMDIwMV9LX0RFQ09ERShjLCBhc3NpKQorI2RlZmluZSBKSVNYMDIwMV9SX0RFQ09ERShjLCBhc3NpKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChjKSA8IDB4NWMpIChhc3NpKSA9IChjKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPT0gMHg1YykgKGFzc2kpID0gMHgwMGE1OyAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKChjKSA8IDB4N2UpIChhc3NpKSA9IChjKTsgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoKGMpID09IDB4N2UpIChhc3NpKSA9IDB4MjAzZTsgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmICgoYykgPT0gMHg3ZikgKGFzc2kpID0gMHg3ZjsKKyNkZWZpbmUgSklTWDAyMDFfS19ERUNPREUoYywgYXNzaSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoYykgPj0gMHhhMSAmJiAoYykgPD0gMHhkZikgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGFzc2kpID0gMHhmZWMwICsgKGMpOworI2RlZmluZSBKSVNYMDIwMV9ERUNPREUoYywgYXNzaSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSklTWDAyMDFfUl9ERUNPREUoYywgYXNzaSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIEpJU1gwMjAxX0tfREVDT0RFKGMsIGFzc2kpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9jamtjb2RlY3MuaCBiL01vZHVsZXMvY2prY29kZWNzL2Nqa2NvZGVjcy5oCmluZGV4IDQwMDViY2YuLmZhZTBjNjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL2Nqa2NvZGVjcy5oCisrKyBiL01vZHVsZXMvY2prY29kZWNzL2Nqa2NvZGVjcy5oCkBAIC0xMywxMiArMTMsMTIgQEAKIAogCiAvKiBhIHVuaWNvZGUgInVuZGVmaW5lZCIgY29kZXBvaW50ICovCi0jZGVmaW5lIFVOSUlOVgkweEZGRkUKKyNkZWZpbmUgVU5JSU5WICAweEZGRkUKIAogLyogaW50ZXJuYWwtdXNlIERCQ1MgY29kZXBvaW50cyB3aGljaCBhcmVuJ3QgdXNlZCBieSBhbnkgY2hhcnNldHMgKi8KLSNkZWZpbmUgTk9DSEFSCTB4RkZGRgotI2RlZmluZSBNVUxUSUMJMHhGRkZFCi0jZGVmaW5lIERCQ0lOVgkweEZGRkQKKyNkZWZpbmUgTk9DSEFSICAweEZGRkYKKyNkZWZpbmUgTVVMVElDICAweEZGRkUKKyNkZWZpbmUgREJDSU5WICAweEZGRkQKIAogLyogc2hvcnRlciBtYWNyb3MgdG8gc2F2ZSBzb3VyY2Ugc2l6ZSBvZiBtYXBwaW5nIHRhYmxlcyAqLwogI2RlZmluZSBVIFVOSUlOVgpAQCAtMjcsOTQgKzI3LDk0IEBACiAjZGVmaW5lIEQgREJDSU5WCiAKIHN0cnVjdCBkYmNzX2luZGV4IHsKLQljb25zdCB1Y3MyX3QgKm1hcDsKLQl1bnNpZ25lZCBjaGFyIGJvdHRvbSwgdG9wOworICAgIGNvbnN0IHVjczJfdCAqbWFwOworICAgIHVuc2lnbmVkIGNoYXIgYm90dG9tLCB0b3A7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgZGJjc19pbmRleCBkZWNvZGVfbWFwOwogCiBzdHJ1Y3Qgd2lkZWRiY3NfaW5kZXggewotCWNvbnN0IHVjczRfdCAqbWFwOwotCXVuc2lnbmVkIGNoYXIgYm90dG9tLCB0b3A7CisgICAgY29uc3QgdWNzNF90ICptYXA7CisgICAgdW5zaWduZWQgY2hhciBib3R0b20sIHRvcDsKIH07CiB0eXBlZGVmIHN0cnVjdCB3aWRlZGJjc19pbmRleCB3aWRlZGVjb2RlX21hcDsKIAogc3RydWN0IHVuaW1faW5kZXggewotCWNvbnN0IERCQ0hBUiAqbWFwOwotCXVuc2lnbmVkIGNoYXIgYm90dG9tLCB0b3A7CisgICAgY29uc3QgREJDSEFSICptYXA7CisgICAgdW5zaWduZWQgY2hhciBib3R0b20sIHRvcDsKIH07CiB0eXBlZGVmIHN0cnVjdCB1bmltX2luZGV4IGVuY29kZV9tYXA7CiAKIHN0cnVjdCB1bmltX2luZGV4X2J5dGViYXNlZCB7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqbWFwOwotCXVuc2lnbmVkIGNoYXIgYm90dG9tLCB0b3A7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbWFwOworICAgIHVuc2lnbmVkIGNoYXIgYm90dG9tLCB0b3A7CiB9OwogCiBzdHJ1Y3QgZGJjc19tYXAgewotCWNvbnN0IGNoYXIgKmNoYXJzZXQ7Ci0JY29uc3Qgc3RydWN0IHVuaW1faW5kZXggKmVuY21hcDsKLQljb25zdCBzdHJ1Y3QgZGJjc19pbmRleCAqZGVjbWFwOworICAgIGNvbnN0IGNoYXIgKmNoYXJzZXQ7CisgICAgY29uc3Qgc3RydWN0IHVuaW1faW5kZXggKmVuY21hcDsKKyAgICBjb25zdCBzdHJ1Y3QgZGJjc19pbmRleCAqZGVjbWFwOwogfTsKIAogc3RydWN0IHBhaXJfZW5jb2RlbWFwIHsKLQl1Y3M0X3QgdW5pc2VxOwotCURCQ0hBUiBjb2RlOworICAgIHVjczRfdCB1bmlzZXE7CisgICAgREJDSEFSIGNvZGU7CiB9OwogCiBzdGF0aWMgY29uc3QgTXVsdGlieXRlQ29kZWMgKmNvZGVjX2xpc3Q7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGRiY3NfbWFwICptYXBwaW5nX2xpc3Q7CiAKLSNkZWZpbmUgQ09ERUNfSU5JVChlbmNvZGluZykJCQkJCQlcCi0Jc3RhdGljIGludCBlbmNvZGluZyMjX2NvZGVjX2luaXQoY29uc3Qgdm9pZCAqY29uZmlnKQorI2RlZmluZSBDT0RFQ19JTklUKGVuY29kaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbnQgZW5jb2RpbmcjI19jb2RlY19pbml0KGNvbnN0IHZvaWQgKmNvbmZpZykKIAotI2RlZmluZSBFTkNPREVSX0lOSVQoZW5jb2RpbmcpCQkJCQkJXAotCXN0YXRpYyBpbnQgZW5jb2RpbmcjI19lbmNvZGVfaW5pdCgJCQkJXAotCQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmNvbmZpZykKLSNkZWZpbmUgRU5DT0RFUihlbmNvZGluZykJCQkJCQlcCi0Jc3RhdGljIFB5X3NzaXplX3QgZW5jb2RpbmcjI19lbmNvZGUoCQkJCVwKLQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcsCVwKLQkJY29uc3QgUHlfVU5JQ09ERSAqKmluYnVmLCBQeV9zc2l6ZV90IGlubGVmdCwJCVwKLQkJdW5zaWduZWQgY2hhciAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0LCBpbnQgZmxhZ3MpCi0jZGVmaW5lIEVOQ09ERVJfUkVTRVQoZW5jb2RpbmcpCQkJCQkJXAotCXN0YXRpYyBQeV9zc2l6ZV90IGVuY29kaW5nIyNfZW5jb2RlX3Jlc2V0KAkJCVwKLQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcsCVwKLQkJdW5zaWduZWQgY2hhciAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0KQorI2RlZmluZSBFTkNPREVSX0lOSVQoZW5jb2RpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbnQgZW5jb2RpbmcjI19lbmNvZGVfaW5pdCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmNvbmZpZykKKyNkZWZpbmUgRU5DT0RFUihlbmNvZGluZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgUHlfc3NpemVfdCBlbmNvZGluZyMjX2VuY29kZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgUHlfVU5JQ09ERSAqKmluYnVmLCBQeV9zc2l6ZV90IGlubGVmdCwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5zaWduZWQgY2hhciAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0LCBpbnQgZmxhZ3MpCisjZGVmaW5lIEVOQ09ERVJfUkVTRVQoZW5jb2RpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIFB5X3NzaXplX3QgZW5jb2RpbmcjI19lbmNvZGVfcmVzZXQoICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnLCAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCkKIAotI2RlZmluZSBERUNPREVSX0lOSVQoZW5jb2RpbmcpCQkJCQkJXAotCXN0YXRpYyBpbnQgZW5jb2RpbmcjI19kZWNvZGVfaW5pdCgJCQkJXAotCQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmNvbmZpZykKLSNkZWZpbmUgREVDT0RFUihlbmNvZGluZykJCQkJCQlcCi0Jc3RhdGljIFB5X3NzaXplX3QgZW5jb2RpbmcjI19kZWNvZGUoCQkJCVwKLQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcsCVwKLQkJY29uc3QgdW5zaWduZWQgY2hhciAqKmluYnVmLCBQeV9zc2l6ZV90IGlubGVmdCwJCVwKLQkJUHlfVU5JQ09ERSAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0KQotI2RlZmluZSBERUNPREVSX1JFU0VUKGVuY29kaW5nKQkJCQkJCVwKLQlzdGF0aWMgUHlfc3NpemVfdCBlbmNvZGluZyMjX2RlY29kZV9yZXNldCgJCQlcCi0JCU11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqY29uZmlnKQorI2RlZmluZSBERUNPREVSX0lOSVQoZW5jb2RpbmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbnQgZW5jb2RpbmcjI19kZWNvZGVfaW5pdCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmNvbmZpZykKKyNkZWZpbmUgREVDT0RFUihlbmNvZGluZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgUHlfc3NpemVfdCBlbmNvZGluZyMjX2RlY29kZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLCBjb25zdCB2b2lkICpjb25maWcsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKmluYnVmLCBQeV9zc2l6ZV90IGlubGVmdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfVU5JQ09ERSAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0KQorI2RlZmluZSBERUNPREVSX1JFU0VUKGVuY29kaW5nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBQeV9zc2l6ZV90IGVuY29kaW5nIyNfZGVjb2RlX3Jlc2V0KCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsIGNvbnN0IHZvaWQgKmNvbmZpZykKIAogI2lmIFB5X1VOSUNPREVfU0laRSA9PSA0Ci0jZGVmaW5lIFVDUzRJTlZBTElEKGNvZGUpCVwKLQlpZiAoKGNvZGUpID4gMHhGRkZGKQlcCi0JcmV0dXJuIDE7CisjZGVmaW5lIFVDUzRJTlZBTElEKGNvZGUpICAgICAgIFwKKyAgICBpZiAoKGNvZGUpID4gMHhGRkZGKSAgICAgICAgXAorICAgIHJldHVybiAxOwogI2Vsc2UKLSNkZWZpbmUgVUNTNElOVkFMSUQoY29kZSkJXAotCWlmICgwKSA7CisjZGVmaW5lIFVDUzRJTlZBTElEKGNvZGUpICAgICAgIFwKKyAgICBpZiAoMCkgOwogI2VuZGlmCiAKLSNkZWZpbmUgTkVYVF9JTihpKQkJCQlcCi0JKCppbmJ1ZikgKz0gKGkpOwkJCVwKLQkoaW5sZWZ0KSAtPSAoaSk7Ci0jZGVmaW5lIE5FWFRfT1VUKG8pCQkJCVwKLQkoKm91dGJ1ZikgKz0gKG8pOwkJCVwKLQkob3V0bGVmdCkgLT0gKG8pOwotI2RlZmluZSBORVhUKGksIG8pCQkJCVwKLQlORVhUX0lOKGkpIE5FWFRfT1VUKG8pCisjZGVmaW5lIE5FWFRfSU4oaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCppbmJ1ZikgKz0gKGkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGlubGVmdCkgLT0gKGkpOworI2RlZmluZSBORVhUX09VVChvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqb3V0YnVmKSArPSAobyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChvdXRsZWZ0KSAtPSAobyk7CisjZGVmaW5lIE5FWFQoaSwgbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTkVYVF9JTihpKSBORVhUX09VVChvKQogCi0jZGVmaW5lIFJFUVVJUkVfSU5CVUYobikJCQlcCi0JaWYgKGlubGVmdCA8IChuKSkJCQlcCi0JCXJldHVybiBNQkVSUl9UT09GRVc7Ci0jZGVmaW5lIFJFUVVJUkVfT1VUQlVGKG4pCQkJXAotCWlmIChvdXRsZWZ0IDwgKG4pKQkJCVwKLQkJcmV0dXJuIE1CRVJSX1RPT1NNQUxMOworI2RlZmluZSBSRVFVSVJFX0lOQlVGKG4pICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChpbmxlZnQgPCAobikpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gTUJFUlJfVE9PRkVXOworI2RlZmluZSBSRVFVSVJFX09VVEJVRihuKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChvdXRsZWZ0IDwgKG4pKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gTUJFUlJfVE9PU01BTEw7CiAKICNkZWZpbmUgSU4xICgoKmluYnVmKVswXSkKICNkZWZpbmUgSU4yICgoKmluYnVmKVsxXSkKQEAgLTEyNiwyNzMgKzEyNiwyNzMgQEAKICNkZWZpbmUgT1VUMyhjKSAoKCpvdXRidWYpWzJdKSA9IChjKTsKICNkZWZpbmUgT1VUNChjKSAoKCpvdXRidWYpWzNdKSA9IChjKTsKIAotI2RlZmluZSBXUklURTEoYzEpCQlcCi0JUkVRVUlSRV9PVVRCVUYoMSkJXAotCSgqb3V0YnVmKVswXSA9IChjMSk7Ci0jZGVmaW5lIFdSSVRFMihjMSwgYzIpCQlcCi0JUkVRVUlSRV9PVVRCVUYoMikJXAotCSgqb3V0YnVmKVswXSA9IChjMSk7CVwKLQkoKm91dGJ1ZilbMV0gPSAoYzIpOwotI2RlZmluZSBXUklURTMoYzEsIGMyLCBjMykJXAotCVJFUVVJUkVfT1VUQlVGKDMpCVwKLQkoKm91dGJ1ZilbMF0gPSAoYzEpOwlcCi0JKCpvdXRidWYpWzFdID0gKGMyKTsJXAotCSgqb3V0YnVmKVsyXSA9IChjMyk7Ci0jZGVmaW5lIFdSSVRFNChjMSwgYzIsIGMzLCBjNCkJXAotCVJFUVVJUkVfT1VUQlVGKDQpCVwKLQkoKm91dGJ1ZilbMF0gPSAoYzEpOwlcCi0JKCpvdXRidWYpWzFdID0gKGMyKTsJXAotCSgqb3V0YnVmKVsyXSA9IChjMyk7CVwKLQkoKm91dGJ1ZilbM10gPSAoYzQpOworI2RlZmluZSBXUklURTEoYzEpICAgICAgICAgICAgICBcCisgICAgUkVRVUlSRV9PVVRCVUYoMSkgICAgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMF0gPSAoYzEpOworI2RlZmluZSBXUklURTIoYzEsIGMyKSAgICAgICAgICBcCisgICAgUkVRVUlSRV9PVVRCVUYoMikgICAgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMF0gPSAoYzEpOyAgICAgICAgXAorICAgICgqb3V0YnVmKVsxXSA9IChjMik7CisjZGVmaW5lIFdSSVRFMyhjMSwgYzIsIGMzKSAgICAgIFwKKyAgICBSRVFVSVJFX09VVEJVRigzKSAgICAgICAgICAgXAorICAgICgqb3V0YnVmKVswXSA9IChjMSk7ICAgICAgICBcCisgICAgKCpvdXRidWYpWzFdID0gKGMyKTsgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMl0gPSAoYzMpOworI2RlZmluZSBXUklURTQoYzEsIGMyLCBjMywgYzQpICBcCisgICAgUkVRVUlSRV9PVVRCVUYoNCkgICAgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMF0gPSAoYzEpOyAgICAgICAgXAorICAgICgqb3V0YnVmKVsxXSA9IChjMik7ICAgICAgICBcCisgICAgKCpvdXRidWYpWzJdID0gKGMzKTsgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbM10gPSAoYzQpOwogCiAjaWYgUHlfVU5JQ09ERV9TSVpFID09IDIKLSMgZGVmaW5lIFdSSVRFVUNTNChjKQkJCQkJCVwKLQlSRVFVSVJFX09VVEJVRigyKQkJCQkJXAotCSgqb3V0YnVmKVswXSA9IDB4ZDgwMCArICgoKGMpIC0gMHgxMDAwMCkgPj4gMTApOwlcCi0JKCpvdXRidWYpWzFdID0gMHhkYzAwICsgKCgoYykgLSAweDEwMDAwKSAmIDB4M2ZmKTsJXAotCU5FWFRfT1VUKDIpCisjIGRlZmluZSBXUklURVVDUzQoYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJFUVVJUkVfT1VUQlVGKDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKm91dGJ1ZilbMF0gPSAweGQ4MDAgKyAoKChjKSAtIDB4MTAwMDApID4+IDEwKTsgICAgICAgICAgICBcCisgICAgKCpvdXRidWYpWzFdID0gMHhkYzAwICsgKCgoYykgLSAweDEwMDAwKSAmIDB4M2ZmKTsgICAgICAgICAgXAorICAgIE5FWFRfT1VUKDIpCiAjZWxzZQotIyBkZWZpbmUgV1JJVEVVQ1M0KGMpCQkJCQkJXAotCVJFUVVJUkVfT1VUQlVGKDEpCQkJCQlcCi0JKipvdXRidWYgPSAoUHlfVU5JQ09ERSkoYyk7CQkJCVwKLQlORVhUX09VVCgxKQorIyBkZWZpbmUgV1JJVEVVQ1M0KGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSRVFVSVJFX09VVEJVRigxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKipvdXRidWYgPSAoUHlfVU5JQ09ERSkoYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE5FWFRfT1VUKDEpCiAjZW5kaWYKIAotI2RlZmluZSBfVFJZTUFQX0VOQyhtLCBhc3NpLCB2YWwpCQkJCVwKLQkoKG0pLT5tYXAgIT0gTlVMTCAmJiAodmFsKSA+PSAobSktPmJvdHRvbSAmJgkJXAotCSAgICAodmFsKTw9IChtKS0+dG9wICYmICgoYXNzaSkgPSAobSktPm1hcFsodmFsKSAtCVwKLQkgICAgKG0pLT5ib3R0b21dKSAhPSBOT0NIQVIpCi0jZGVmaW5lIFRSWU1BUF9FTkNfQ09ORChjaGFyc2V0LCBhc3NpLCB1bmkpCQkJXAotCV9UUllNQVBfRU5DKCZjaGFyc2V0IyNfZW5jbWFwWyh1bmkpID4+IDhdLCBhc3NpLCAodW5pKSAmIDB4ZmYpCi0jZGVmaW5lIFRSWU1BUF9FTkMoY2hhcnNldCwgYXNzaSwgdW5pKQkJCQlcCi0JaWYgVFJZTUFQX0VOQ19DT05EKGNoYXJzZXQsIGFzc2ksIHVuaSkKKyNkZWZpbmUgX1RSWU1BUF9FTkMobSwgYXNzaSwgdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChtKS0+bWFwICE9IE5VTEwgJiYgKHZhbCkgPj0gKG0pLT5ib3R0b20gJiYgICAgICAgICAgICAgICAgXAorICAgICAgICAodmFsKTw9IChtKS0+dG9wICYmICgoYXNzaSkgPSAobSktPm1hcFsodmFsKSAtICAgICAgICAgIFwKKyAgICAgICAgKG0pLT5ib3R0b21dKSAhPSBOT0NIQVIpCisjZGVmaW5lIFRSWU1BUF9FTkNfQ09ORChjaGFyc2V0LCBhc3NpLCB1bmkpICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9UUllNQVBfRU5DKCZjaGFyc2V0IyNfZW5jbWFwWyh1bmkpID4+IDhdLCBhc3NpLCAodW5pKSAmIDB4ZmYpCisjZGVmaW5lIFRSWU1BUF9FTkMoY2hhcnNldCwgYXNzaSwgdW5pKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIFRSWU1BUF9FTkNfQ09ORChjaGFyc2V0LCBhc3NpLCB1bmkpCiAKLSNkZWZpbmUgX1RSWU1BUF9ERUMobSwgYXNzaSwgdmFsKQkJCQlcCi0JKChtKS0+bWFwICE9IE5VTEwgJiYgKHZhbCkgPj0gKG0pLT5ib3R0b20gJiYJCVwKLQkgICAgKHZhbCk8PSAobSktPnRvcCAmJiAoKGFzc2kpID0gKG0pLT5tYXBbKHZhbCkgLQlcCi0JICAgIChtKS0+Ym90dG9tXSkgIT0gVU5JSU5WKQotI2RlZmluZSBUUllNQVBfREVDKGNoYXJzZXQsIGFzc2ksIGMxLCBjMikJCQlcCi0JaWYgX1RSWU1BUF9ERUMoJmNoYXJzZXQjI19kZWNtYXBbYzFdLCBhc3NpLCBjMikKKyNkZWZpbmUgX1RSWU1BUF9ERUMobSwgYXNzaSwgdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChtKS0+bWFwICE9IE5VTEwgJiYgKHZhbCkgPj0gKG0pLT5ib3R0b20gJiYgICAgICAgICAgICAgICAgXAorICAgICAgICAodmFsKTw9IChtKS0+dG9wICYmICgoYXNzaSkgPSAobSktPm1hcFsodmFsKSAtICAgICAgICAgIFwKKyAgICAgICAgKG0pLT5ib3R0b21dKSAhPSBVTklJTlYpCisjZGVmaW5lIFRSWU1BUF9ERUMoY2hhcnNldCwgYXNzaSwgYzEsIGMyKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIF9UUllNQVBfREVDKCZjaGFyc2V0IyNfZGVjbWFwW2MxXSwgYXNzaSwgYzIpCiAKLSNkZWZpbmUgX1RSWU1BUF9FTkNfTVBMQU5FKG0sIGFzc3BsYW5lLCBhc3NoaSwgYXNzbG8sIHZhbCkJXAotCSgobSktPm1hcCAhPSBOVUxMICYmICh2YWwpID49IChtKS0+Ym90dG9tICYmCQlcCi0JICAgICh2YWwpPD0gKG0pLT50b3AgJiYJCQkJCVwKLQkgICAgKChhc3NwbGFuZSkgPSAobSktPm1hcFsoKHZhbCkgLSAobSktPmJvdHRvbSkqM10pICE9IDAgJiYgXAotCSAgICAoKChhc3NoaSkgPSAobSktPm1hcFsoKHZhbCkgLSAobSktPmJvdHRvbSkqMyArIDFdKSwgMSkgJiYgXAotCSAgICAoKChhc3NsbykgPSAobSktPm1hcFsoKHZhbCkgLSAobSktPmJvdHRvbSkqMyArIDJdKSwgMSkpCi0jZGVmaW5lIFRSWU1BUF9FTkNfTVBMQU5FKGNoYXJzZXQsIGFzc3BsYW5lLCBhc3NoaSwgYXNzbG8sIHVuaSkJXAotCWlmIF9UUllNQVBfRU5DX01QTEFORSgmY2hhcnNldCMjX2VuY21hcFsodW5pKSA+PiA4XSwgXAotCQkJICAgYXNzcGxhbmUsIGFzc2hpLCBhc3NsbywgKHVuaSkgJiAweGZmKQotI2RlZmluZSBUUllNQVBfREVDX01QTEFORShjaGFyc2V0LCBhc3NpLCBwbGFuZSwgYzEsIGMyKQkJXAotCWlmIF9UUllNQVBfREVDKCZjaGFyc2V0IyNfZGVjbWFwW3BsYW5lXVtjMV0sIGFzc2ksIGMyKQorI2RlZmluZSBfVFJZTUFQX0VOQ19NUExBTkUobSwgYXNzcGxhbmUsIGFzc2hpLCBhc3NsbywgdmFsKSAgICAgIFwKKyAgICAoKG0pLT5tYXAgIT0gTlVMTCAmJiAodmFsKSA+PSAobSktPmJvdHRvbSAmJiAgICAgICAgICAgICAgICBcCisgICAgICAgICh2YWwpPD0gKG0pLT50b3AgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKGFzc3BsYW5lKSA9IChtKS0+bWFwWygodmFsKSAtIChtKS0+Ym90dG9tKSozXSkgIT0gMCAmJiBcCisgICAgICAgICgoKGFzc2hpKSA9IChtKS0+bWFwWygodmFsKSAtIChtKS0+Ym90dG9tKSozICsgMV0pLCAxKSAmJiBcCisgICAgICAgICgoKGFzc2xvKSA9IChtKS0+bWFwWygodmFsKSAtIChtKS0+Ym90dG9tKSozICsgMl0pLCAxKSkKKyNkZWZpbmUgVFJZTUFQX0VOQ19NUExBTkUoY2hhcnNldCwgYXNzcGxhbmUsIGFzc2hpLCBhc3NsbywgdW5pKSBcCisgICAgaWYgX1RSWU1BUF9FTkNfTVBMQU5FKCZjaGFyc2V0IyNfZW5jbWFwWyh1bmkpID4+IDhdLCBcCisgICAgICAgICAgICAgICAgICAgICAgIGFzc3BsYW5lLCBhc3NoaSwgYXNzbG8sICh1bmkpICYgMHhmZikKKyNkZWZpbmUgVFJZTUFQX0RFQ19NUExBTkUoY2hhcnNldCwgYXNzaSwgcGxhbmUsIGMxLCBjMikgICAgICAgICBcCisgICAgaWYgX1RSWU1BUF9ERUMoJmNoYXJzZXQjI19kZWNtYXBbcGxhbmVdW2MxXSwgYXNzaSwgYzIpCiAKICNpZiBQeV9VTklDT0RFX1NJWkUgPT0gMgotI2RlZmluZSBERUNPREVfU1VSUk9HQVRFKGMpCQkJCQlcCi0JaWYgKGMgPj4gMTAgPT0gMHhkODAwID4+IDEwKSB7IC8qIGhpZ2ggc3Vycm9nYXRlICovCVwKLQkJUkVRVUlSRV9JTkJVRigyKQkJCQlcCi0JCWlmIChJTjIgPj4gMTAgPT0gMHhkYzAwID4+IDEwKSB7IC8qIGxvdyBzdXJyb2dhdGUgKi8gXAotCQkgICAgYyA9IDB4MTAwMDAgKyAoKHVjczRfdCkoYyAtIDB4ZDgwMCkgPDwgMTApICsgXAotCQkJKCh1Y3M0X3QpKElOMikgLSAweGRjMDApOwkJXAotCQl9CQkJCQkJXAotCX0KLSNkZWZpbmUgR0VUX0lOU0laRShjKQkoKGMpID4gMHhmZmZmID8gMiA6IDEpCisjZGVmaW5lIERFQ09ERV9TVVJST0dBVEUoYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjID4+IDEwID09IDB4ZDgwMCA+PiAxMCkgeyAvKiBoaWdoIHN1cnJvZ2F0ZSAqLyAgICAgICAgIFwKKyAgICAgICAgUkVRVUlSRV9JTkJVRigyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChJTjIgPj4gMTAgPT0gMHhkYzAwID4+IDEwKSB7IC8qIGxvdyBzdXJyb2dhdGUgKi8gXAorICAgICAgICAgICAgYyA9IDB4MTAwMDAgKyAoKHVjczRfdCkoYyAtIDB4ZDgwMCkgPDwgMTApICsgXAorICAgICAgICAgICAgKCh1Y3M0X3QpKElOMikgLSAweGRjMDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2RlZmluZSBHRVRfSU5TSVpFKGMpICAgKChjKSA+IDB4ZmZmZiA/IDIgOiAxKQogI2Vsc2UKICNkZWZpbmUgREVDT0RFX1NVUlJPR0FURShjKSB7O30KLSNkZWZpbmUgR0VUX0lOU0laRShjKQkxCisjZGVmaW5lIEdFVF9JTlNJWkUoYykgICAxCiAjZW5kaWYKIAogI2RlZmluZSBCRUdJTl9NQVBQSU5HU19MSVNUIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGJjc19tYXAgX21hcHBpbmdfbGlzdFtdID0gewogI2RlZmluZSBNQVBQSU5HX0VOQ09OTFkoZW5jKSB7I2VuYywgKHZvaWQqKWVuYyMjX2VuY21hcCwgTlVMTH0sCiAjZGVmaW5lIE1BUFBJTkdfREVDT05MWShlbmMpIHsjZW5jLCBOVUxMLCAodm9pZCopZW5jIyNfZGVjbWFwfSwKICNkZWZpbmUgTUFQUElOR19FTkNERUMoZW5jKSB7I2VuYywgKHZvaWQqKWVuYyMjX2VuY21hcCwgKHZvaWQqKWVuYyMjX2RlY21hcH0sCi0jZGVmaW5lIEVORF9NQVBQSU5HU19MSVNUCQkJCVwKLQl7IiIsIE5VTEwsIE5VTEx9IH07CQkJCVwKLQlzdGF0aWMgY29uc3Qgc3RydWN0IGRiY3NfbWFwICptYXBwaW5nX2xpc3QgPQlcCi0JCShjb25zdCBzdHJ1Y3QgZGJjc19tYXAgKilfbWFwcGluZ19saXN0OworI2RlZmluZSBFTkRfTUFQUElOR1NfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyIiLCBOVUxMLCBOVUxMfSB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IGRiY3NfbWFwICptYXBwaW5nX2xpc3QgPSAgICAgICAgXAorICAgICAgICAoY29uc3Qgc3RydWN0IGRiY3NfbWFwICopX21hcHBpbmdfbGlzdDsKIAogI2RlZmluZSBCRUdJTl9DT0RFQ1NfTElTVCBzdGF0aWMgY29uc3QgTXVsdGlieXRlQ29kZWMgX2NvZGVjX2xpc3RbXSA9IHsKLSNkZWZpbmUgX1NUQVRFRlVMX01FVEhPRFMoZW5jKQkJXAotCWVuYyMjX2VuY29kZSwJCQlcCi0JZW5jIyNfZW5jb2RlX2luaXQsCQlcCi0JZW5jIyNfZW5jb2RlX3Jlc2V0LAkJXAotCWVuYyMjX2RlY29kZSwJCQlcCi0JZW5jIyNfZGVjb2RlX2luaXQsCQlcCi0JZW5jIyNfZGVjb2RlX3Jlc2V0LAotI2RlZmluZSBfU1RBVEVMRVNTX01FVEhPRFMoZW5jKQkJXAotCWVuYyMjX2VuY29kZSwgTlVMTCwgTlVMTCwJXAotCWVuYyMjX2RlY29kZSwgTlVMTCwgTlVMTCwKLSNkZWZpbmUgQ09ERUNfU1RBVEVGVUwoZW5jKSB7CQlcCi0JI2VuYywgTlVMTCwgTlVMTCwJCVwKLQlfU1RBVEVGVUxfTUVUSE9EUyhlbmMpCQlcCisjZGVmaW5lIF9TVEFURUZVTF9NRVRIT0RTKGVuYykgICAgICAgICAgXAorICAgIGVuYyMjX2VuY29kZSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbmMjI19lbmNvZGVfaW5pdCwgICAgICAgICAgICAgICAgICBcCisgICAgZW5jIyNfZW5jb2RlX3Jlc2V0LCAgICAgICAgICAgICAgICAgXAorICAgIGVuYyMjX2RlY29kZSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbmMjI19kZWNvZGVfaW5pdCwgICAgICAgICAgICAgICAgICBcCisgICAgZW5jIyNfZGVjb2RlX3Jlc2V0LAorI2RlZmluZSBfU1RBVEVMRVNTX01FVEhPRFMoZW5jKSAgICAgICAgIFwKKyAgICBlbmMjI19lbmNvZGUsIE5VTEwsIE5VTEwsICAgICAgICAgICBcCisgICAgZW5jIyNfZGVjb2RlLCBOVUxMLCBOVUxMLAorI2RlZmluZSBDT0RFQ19TVEFURUZVTChlbmMpIHsgICAgICAgICAgIFwKKyAgICAjZW5jLCBOVUxMLCBOVUxMLCAgICAgICAgICAgICAgICAgICBcCisgICAgX1NUQVRFRlVMX01FVEhPRFMoZW5jKSAgICAgICAgICAgICAgXAogfSwKLSNkZWZpbmUgQ09ERUNfU1RBVEVMRVNTKGVuYykgewkJXAotCSNlbmMsIE5VTEwsIE5VTEwsCQlcCi0JX1NUQVRFTEVTU19NRVRIT0RTKGVuYykJCVwKKyNkZWZpbmUgQ09ERUNfU1RBVEVMRVNTKGVuYykgeyAgICAgICAgICBcCisgICAgI2VuYywgTlVMTCwgTlVMTCwgICAgICAgICAgICAgICAgICAgXAorICAgIF9TVEFURUxFU1NfTUVUSE9EUyhlbmMpICAgICAgICAgICAgIFwKIH0sCi0jZGVmaW5lIENPREVDX1NUQVRFTEVTU19XSU5JVChlbmMpIHsJXAotCSNlbmMsIE5VTEwsCQkJXAotCWVuYyMjX2NvZGVjX2luaXQsCQlcCi0JX1NUQVRFTEVTU19NRVRIT0RTKGVuYykJCVwKKyNkZWZpbmUgQ09ERUNfU1RBVEVMRVNTX1dJTklUKGVuYykgeyAgICBcCisgICAgI2VuYywgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVuYyMjX2NvZGVjX2luaXQsICAgICAgICAgICAgICAgICAgIFwKKyAgICBfU1RBVEVMRVNTX01FVEhPRFMoZW5jKSAgICAgICAgICAgICBcCiB9LAotI2RlZmluZSBFTkRfQ09ERUNTX0xJU1QJCQkJCVwKLQl7IiIsIE5VTEwsfSB9OwkJCQkJXAotCXN0YXRpYyBjb25zdCBNdWx0aWJ5dGVDb2RlYyAqY29kZWNfbGlzdCA9CVwKLQkJKGNvbnN0IE11bHRpYnl0ZUNvZGVjICopX2NvZGVjX2xpc3Q7CisjZGVmaW5lIEVORF9DT0RFQ1NfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7IiIsIE5VTEwsfSB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBjb25zdCBNdWx0aWJ5dGVDb2RlYyAqY29kZWNfbGlzdCA9ICAgICAgICAgICBcCisgICAgICAgIChjb25zdCBNdWx0aWJ5dGVDb2RlYyAqKV9jb2RlY19saXN0OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0bXVsdGlieXRlY29kZWModm9pZCkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmNvZnVuYyA9IE5VTEw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb2Z1bmMgPSBOVUxMOwogCi0JaWYgKGNvZnVuYyA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICptb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJfbXVsdGlieXRlY29kZWMiKTsKLQkJaWYgKG1vZCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWNvZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiX19jcmVhdGVfY29kZWMiKTsKLQkJUHlfREVDUkVGKG1vZCk7Ci0JfQotCXJldHVybiBjb2Z1bmM7CisgICAgaWYgKGNvZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICptb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJfbXVsdGlieXRlY29kZWMiKTsKKyAgICAgICAgaWYgKG1vZCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNvZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiX19jcmVhdGVfY29kZWMiKTsKKyAgICAgICAgUHlfREVDUkVGKG1vZCk7CisgICAgfQorICAgIHJldHVybiBjb2Z1bmM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRjb2RlYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmVuY29kaW5nKQogewotCVB5T2JqZWN0ICpjb2RlY29iaiwgKnIsICpjb2Z1bmM7Ci0JY29uc3QgTXVsdGlieXRlQ29kZWMgKmNvZGVjOwotCWNvbnN0IGNoYXIgKmVuYzsKKyAgICBQeU9iamVjdCAqY29kZWNvYmosICpyLCAqY29mdW5jOworICAgIGNvbnN0IE11bHRpYnl0ZUNvZGVjICpjb2RlYzsKKyAgICBjb25zdCBjaGFyICplbmM7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKGVuY29kaW5nKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJlbmNvZGluZyBuYW1lIG11c3QgYmUgYSBzdHJpbmcuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGVuY29kaW5nKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kaW5nIG5hbWUgbXVzdCBiZSBhIHN0cmluZy4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JY29mdW5jID0gZ2V0bXVsdGlieXRlY29kZWMoKTsKLQlpZiAoY29mdW5jID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGNvZnVuYyA9IGdldG11bHRpYnl0ZWNvZGVjKCk7CisgICAgaWYgKGNvZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVuYyA9IFB5U3RyaW5nX0FTX1NUUklORyhlbmNvZGluZyk7Ci0JZm9yIChjb2RlYyA9IGNvZGVjX2xpc3Q7IGNvZGVjLT5lbmNvZGluZ1swXTsgY29kZWMrKykKLQkJaWYgKHN0cmNtcChjb2RlYy0+ZW5jb2RpbmcsIGVuYykgPT0gMCkKLQkJCWJyZWFrOworICAgIGVuYyA9IFB5U3RyaW5nX0FTX1NUUklORyhlbmNvZGluZyk7CisgICAgZm9yIChjb2RlYyA9IGNvZGVjX2xpc3Q7IGNvZGVjLT5lbmNvZGluZ1swXTsgY29kZWMrKykKKyAgICAgICAgaWYgKHN0cmNtcChjb2RlYy0+ZW5jb2RpbmcsIGVuYykgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JaWYgKGNvZGVjLT5lbmNvZGluZ1swXSA9PSAnXDAnKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Mb29rdXBFcnJvciwKLQkJCQkibm8gc3VjaCBjb2RlYyBpcyBzdXBwb3J0ZWQuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoY29kZWMtPmVuY29kaW5nWzBdID09ICdcMCcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0xvb2t1cEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vIHN1Y2ggY29kZWMgaXMgc3VwcG9ydGVkLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQljb2RlY29iaiA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cigodm9pZCAqKWNvZGVjLCBOVUxMKTsKLQlpZiAoY29kZWNvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29kZWNvYmogPSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoKHZvaWQgKiljb2RlYywgTlVMTCk7CisgICAgaWYgKGNvZGVjb2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY29mdW5jLCBjb2RlY29iaiwgTlVMTCk7Ci0JUHlfREVDUkVGKGNvZGVjb2JqKTsKKyAgICByID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjb2Z1bmMsIGNvZGVjb2JqLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoY29kZWNvYmopOwogCi0JcmV0dXJuIHI7CisgICAgcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgX19tZXRob2RzW10gPSB7Ci0JeyJnZXRjb2RlYyIsIChQeUNGdW5jdGlvbilnZXRjb2RlYywgTUVUSF9PLCAiIn0sCi0Je05VTEwsIE5VTEx9LAorICAgIHsiZ2V0Y29kZWMiLCAoUHlDRnVuY3Rpb24pZ2V0Y29kZWMsIE1FVEhfTywgIiJ9LAorICAgIHtOVUxMLCBOVUxMfSwKIH07CiAKIHN0YXRpYyBpbnQKIHJlZ2lzdGVyX21hcHMoUHlPYmplY3QgKm1vZHVsZSkKIHsKLQljb25zdCBzdHJ1Y3QgZGJjc19tYXAgKmg7CisgICAgY29uc3Qgc3RydWN0IGRiY3NfbWFwICpoOwogCi0JZm9yIChoID0gbWFwcGluZ19saXN0OyBoLT5jaGFyc2V0WzBdICE9ICdcMCc7IGgrKykgewotCQljaGFyIG1obmFtZVsyNTZdID0gIl9fbWFwXyI7Ci0JCWludCByOwotCQlzdHJjcHkobWhuYW1lICsgc2l6ZW9mKCJfX21hcF8iKSAtIDEsIGgtPmNoYXJzZXQpOwotCQlyID0gUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgbWhuYW1lLAotCQkJCVB5Q09iamVjdF9Gcm9tVm9pZFB0cigodm9pZCAqKWgsIE5VTEwpKTsKLQkJaWYgKHIgPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGZvciAoaCA9IG1hcHBpbmdfbGlzdDsgaC0+Y2hhcnNldFswXSAhPSAnXDAnOyBoKyspIHsKKyAgICAgICAgY2hhciBtaG5hbWVbMjU2XSA9ICJfX21hcF8iOworICAgICAgICBpbnQgcjsKKyAgICAgICAgc3RyY3B5KG1obmFtZSArIHNpemVvZigiX19tYXBfIikgLSAxLCBoLT5jaGFyc2V0KTsKKyAgICAgICAgciA9IFB5TW9kdWxlX0FkZE9iamVjdChtb2R1bGUsIG1obmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5Q09iamVjdF9Gcm9tVm9pZFB0cigodm9pZCAqKWgsIE5VTEwpKTsKKyAgICAgICAgaWYgKHIgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAjaWZkZWYgVVNJTkdfQklOQVJZX1BBSVJfU0VBUkNICiBzdGF0aWMgREJDSEFSCiBmaW5kX3BhaXJlbmNtYXAodWNzMl90IGJvZHksIHVjczJfdCBtb2RpZmllciwKLQkJY29uc3Qgc3RydWN0IHBhaXJfZW5jb2RlbWFwICpoYXlzdGFjaywgaW50IGhheXN0YWNrc2l6ZSkKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcGFpcl9lbmNvZGVtYXAgKmhheXN0YWNrLCBpbnQgaGF5c3RhY2tzaXplKQogewotCWludCBwb3MsIG1pbiwgbWF4OwotCXVjczRfdCB2YWx1ZSA9IGJvZHkgPDwgMTYgfCBtb2RpZmllcjsKKyAgICBpbnQgcG9zLCBtaW4sIG1heDsKKyAgICB1Y3M0X3QgdmFsdWUgPSBib2R5IDw8IDE2IHwgbW9kaWZpZXI7CiAKLQltaW4gPSAwOwotCW1heCA9IGhheXN0YWNrc2l6ZTsKKyAgICBtaW4gPSAwOworICAgIG1heCA9IGhheXN0YWNrc2l6ZTsKIAotCWZvciAocG9zID0gaGF5c3RhY2tzaXplID4+IDE7IG1pbiAhPSBtYXg7IHBvcyA9IChtaW4gKyBtYXgpID4+IDEpCi0JCWlmICh2YWx1ZSA8IGhheXN0YWNrW3Bvc10udW5pc2VxKSB7Ci0JCQlpZiAobWF4ID09IHBvcykgYnJlYWs7Ci0JCQllbHNlIG1heCA9IHBvczsKLQkJfQotCQllbHNlIGlmICh2YWx1ZSA+IGhheXN0YWNrW3Bvc10udW5pc2VxKSB7Ci0JCQlpZiAobWluID09IHBvcykgYnJlYWs7Ci0JCQllbHNlIG1pbiA9IHBvczsKLQkJfQotCQllbHNlCi0JCQlicmVhazsKKyAgICBmb3IgKHBvcyA9IGhheXN0YWNrc2l6ZSA+PiAxOyBtaW4gIT0gbWF4OyBwb3MgPSAobWluICsgbWF4KSA+PiAxKQorICAgICAgICBpZiAodmFsdWUgPCBoYXlzdGFja1twb3NdLnVuaXNlcSkgeworICAgICAgICAgICAgaWYgKG1heCA9PSBwb3MpIGJyZWFrOworICAgICAgICAgICAgZWxzZSBtYXggPSBwb3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBoYXlzdGFja1twb3NdLnVuaXNlcSkgeworICAgICAgICAgICAgaWYgKG1pbiA9PSBwb3MpIGJyZWFrOworICAgICAgICAgICAgZWxzZSBtaW4gPSBwb3M7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJaWYgKHZhbHVlID09IGhheXN0YWNrW3Bvc10udW5pc2VxKQotCQkJcmV0dXJuIGhheXN0YWNrW3Bvc10uY29kZTsKLQkJZWxzZQotCQkJcmV0dXJuIERCQ0lOVjsKKyAgICAgICAgaWYgKHZhbHVlID09IGhheXN0YWNrW3Bvc10udW5pc2VxKQorICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrW3Bvc10uY29kZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIERCQ0lOVjsKIH0KICNlbmRpZgogCiAjaWZkZWYgVVNJTkdfSU1QT1JURURfTUFQUwogI2RlZmluZSBJTVBPUlRfTUFQKGxvY2FsZSwgY2hhcnNldCwgZW5jbWFwLCBkZWNtYXApIFwKLQlpbXBvcnRtYXAoIl9jb2RlY3NfIiAjbG9jYWxlLCAiX19tYXBfIiAjY2hhcnNldCwgXAotCQkgIChjb25zdCB2b2lkKiopZW5jbWFwLCAoY29uc3Qgdm9pZCoqKWRlY21hcCkKKyAgICBpbXBvcnRtYXAoIl9jb2RlY3NfIiAjbG9jYWxlLCAiX19tYXBfIiAjY2hhcnNldCwgXAorICAgICAgICAgICAgICAoY29uc3Qgdm9pZCoqKWVuY21hcCwgKGNvbnN0IHZvaWQqKilkZWNtYXApCiAKIHN0YXRpYyBpbnQKIGltcG9ydG1hcChjb25zdCBjaGFyICptb2RuYW1lLCBjb25zdCBjaGFyICpzeW1ib2wsCi0JICBjb25zdCB2b2lkICoqZW5jbWFwLCBjb25zdCB2b2lkICoqZGVjbWFwKQorICAgICAgICAgIGNvbnN0IHZvaWQgKiplbmNtYXAsIGNvbnN0IHZvaWQgKipkZWNtYXApCiB7Ci0JUHlPYmplY3QgKm8sICptb2Q7CisgICAgUHlPYmplY3QgKm8sICptb2Q7CiAKLQltb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoKGNoYXIgKiltb2RuYW1lKTsKLQlpZiAobW9kID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoKGNoYXIgKiltb2RuYW1lKTsKKyAgICBpZiAobW9kID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCW8gPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgKGNoYXIqKXN5bWJvbCk7Ci0JaWYgKG8gPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JZWxzZSBpZiAoIVB5Q09iamVjdF9DaGVjayhvKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibWFwIGRhdGEgbXVzdCBiZSBhIENPYmplY3QuIik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KLQllbHNlIHsKLQkJc3RydWN0IGRiY3NfbWFwICptYXA7Ci0JCW1hcCA9IFB5Q09iamVjdF9Bc1ZvaWRQdHIobyk7Ci0JCWlmIChlbmNtYXAgIT0gTlVMTCkKLQkJCSplbmNtYXAgPSBtYXAtPmVuY21hcDsKLQkJaWYgKGRlY21hcCAhPSBOVUxMKQotCQkJKmRlY21hcCA9IG1hcC0+ZGVjbWFwOwotCQlQeV9ERUNSRUYobyk7Ci0JfQorICAgIG8gPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgKGNoYXIqKXN5bWJvbCk7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgZWxzZSBpZiAoIVB5Q09iamVjdF9DaGVjayhvKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtYXAgZGF0YSBtdXN0IGJlIGEgQ09iamVjdC4iKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdHJ1Y3QgZGJjc19tYXAgKm1hcDsKKyAgICAgICAgbWFwID0gUHlDT2JqZWN0X0FzVm9pZFB0cihvKTsKKyAgICAgICAgaWYgKGVuY21hcCAhPSBOVUxMKQorICAgICAgICAgICAgKmVuY21hcCA9IG1hcC0+ZW5jbWFwOworICAgICAgICBpZiAoZGVjbWFwICE9IE5VTEwpCisgICAgICAgICAgICAqZGVjbWFwID0gbWFwLT5kZWNtYXA7CisgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICB9CiAKLQlQeV9ERUNSRUYobW9kKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYobW9kKTsKKyAgICByZXR1cm4gMDsKIAogZXJyb3JleGl0OgotCVB5X0RFQ1JFRihtb2QpOwotCXJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYobW9kKTsKKyAgICByZXR1cm4gLTE7CiB9CiAjZW5kaWYKIAotI2RlZmluZSBJX0FNX0FfTU9EVUxFX0ZPUihsb2MpCQkJCQkJXAotCXZvaWQJCQkJCQkJCVwKLQlpbml0X2NvZGVjc18jI2xvYyh2b2lkKQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCVB5T2JqZWN0ICptID0gUHlfSW5pdE1vZHVsZSgiX2NvZGVjc18iICNsb2MsIF9fbWV0aG9kcyk7XAotCQlpZiAobSAhPSBOVUxMKQkJCQkJCVwKLQkJCSh2b2lkKXJlZ2lzdGVyX21hcHMobSk7CQkJCVwKLQl9CisjZGVmaW5lIElfQU1fQV9NT0RVTEVfRk9SKGxvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW5pdF9jb2RlY3NfIyNsb2Modm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5T2JqZWN0ICptID0gUHlfSW5pdE1vZHVsZSgiX2NvZGVjc18iICNsb2MsIF9fbWV0aG9kcyk7XAorICAgICAgICBpZiAobSAhPSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKHZvaWQpcmVnaXN0ZXJfbWFwcyhtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9lbXVfamlzeDAyMTNfMjAwMC5oIGIvTW9kdWxlcy9jamtjb2RlY3MvZW11X2ppc3gwMjEzXzIwMDAuaAppbmRleCAyNTBjNjczLi40MjI3ZmIyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9lbXVfamlzeDAyMTNfMjAwMC5oCisrKyBiL01vZHVsZXMvY2prY29kZWNzL2VtdV9qaXN4MDIxM18yMDAwLmgKQEAgLTUsMzkgKzUsMzkgQEAKICNkZWZpbmUgRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9JTlZBTElEIDEKICNlbmRpZgogCi0jZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfQk1QKGFzc2ksIGMpCQkJXAotCWlmIChjb25maWcgPT0gKHZvaWQgKikyMDAwICYmICgJCQkJCVwKLQkJCShjKSA9PSAweDlCMUMgfHwgKGMpID09IDB4NEZGMSB8fAkJXAotCQkJKGMpID09IDB4NTI1RCB8fCAoYykgPT0gMHg1NDFFIHx8CQlcCi0JCQkoYykgPT0gMHg1NjUzIHx8IChjKSA9PSAweDU5RjggfHwJCVwKLQkJCShjKSA9PSAweDVDNUIgfHwgKGMpID09IDB4NUU3NyB8fAkJXAotCQkJKGMpID09IDB4NzYyNiB8fCAoYykgPT0gMHg3RTZCKSkJCVwKLQkJcmV0dXJuIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfSU5WQUxJRDsJCVwKLQllbHNlIGlmIChjb25maWcgPT0gKHZvaWQgKikyMDAwICYmIChjKSA9PSAweDlCMUQpCQlcCi0JCShhc3NpKSA9IDB4ODAwMCB8IDB4N2QzYjsJCQkJXAorI2RlZmluZSBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfRU5DT0RFX0JNUChhc3NpLCBjKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjb25maWcgPT0gKHZvaWQgKikyMDAwICYmICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoYykgPT0gMHg5QjFDIHx8IChjKSA9PSAweDRGRjEgfHwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoYykgPT0gMHg1MjVEIHx8IChjKSA9PSAweDU0MUUgfHwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoYykgPT0gMHg1NjUzIHx8IChjKSA9PSAweDU5RjggfHwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoYykgPT0gMHg1QzVCIHx8IChjKSA9PSAweDVFNzcgfHwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAoYykgPT0gMHg3NjI2IHx8IChjKSA9PSAweDdFNkIpKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9JTlZBTElEOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKGNvbmZpZyA9PSAodm9pZCAqKTIwMDAgJiYgKGMpID09IDB4OUIxRCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoYXNzaSkgPSAweDgwMDAgfCAweDdkM2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCi0jZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfRU1QKGFzc2ksIGMpCQkJXAotCWlmIChjb25maWcgPT0gKHZvaWQgKikyMDAwICYmIChjKSA9PSAweDIwQjlGKQkJCVwKLQkJcmV0dXJuIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfSU5WQUxJRDsKKyNkZWZpbmUgRU1VTEFURV9KSVNYMDIxM18yMDAwX0VOQ09ERV9FTVAoYXNzaSwgYykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJiAoYykgPT0gMHgyMEI5RikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9FTkNPREVfSU5WQUxJRDsKIAogI2lmbmRlZiBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX0lOVkFMSUQKICNkZWZpbmUgRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9JTlZBTElEIDIKICNlbmRpZgogCi0jZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKGFzc2ksIGMxLCBjMikJCVwKLQlpZiAoY29uZmlnID09ICh2b2lkICopMjAwMCAmJgkJCQkJXAotCQkJKCgoYzEpID09IDB4MkUgJiYgKGMyKSA9PSAweDIxKSB8fAkJXAotCQkJICgoYzEpID09IDB4MkYgJiYgKGMyKSA9PSAweDdFKSB8fAkJXAotCQkJICgoYzEpID09IDB4NEYgJiYgKGMyKSA9PSAweDU0KSB8fAkJXAotCQkJICgoYzEpID09IDB4NEYgJiYgKGMyKSA9PSAweDdFKSB8fAkJXAotCQkJICgoYzEpID09IDB4NzQgJiYgKGMyKSA9PSAweDI3KSB8fAkJXAotCQkJICgoYzEpID09IDB4N0UgJiYgKGMyKSA9PSAweDdBKSB8fAkJXAotCQkJICgoYzEpID09IDB4N0UgJiYgKGMyKSA9PSAweDdCKSB8fAkJXAotCQkJICgoYzEpID09IDB4N0UgJiYgKGMyKSA9PSAweDdDKSB8fAkJXAotCQkJICgoYzEpID09IDB4N0UgJiYgKGMyKSA9PSAweDdEKSB8fAkJXAotCQkJICgoYzEpID09IDB4N0UgJiYgKGMyKSA9PSAweDdFKSkpCQlcCi0JCXJldHVybiBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX0lOVkFMSUQ7CisjZGVmaW5lIEVNVUxBVEVfSklTWDAyMTNfMjAwMF9ERUNPREVfUExBTkUxKGFzc2ksIGMxLCBjMikgICAgICAgICAgICAgICBcCisgICAgaWYgKGNvbmZpZyA9PSAodm9pZCAqKTIwMDAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICgoKGMxKSA9PSAweDJFICYmIChjMikgPT0gMHgyMSkgfHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoKGMxKSA9PSAweDJGICYmIChjMikgPT0gMHg3RSkgfHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoKGMxKSA9PSAweDRGICYmIChjMikgPT0gMHg1NCkgfHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoKGMxKSA9PSAweDRGICYmIChjMikgPT0gMHg3RSkgfHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoKGMxKSA9PSAweDc0ICYmIChjMikgPT0gMHgyNykgfHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3QSkgfHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3QikgfHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3QykgfHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3RCkgfHwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAoKGMxKSA9PSAweDdFICYmIChjMikgPT0gMHg3RSkpKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX0lOVkFMSUQ7CiAKLSNkZWZpbmUgRU1VTEFURV9KSVNYMDIxM18yMDAwX0RFQ09ERV9QTEFORTIoYXNzaSwgYzEsIGMyKQkJXAotCWlmIChjb25maWcgPT0gKHZvaWQgKikyMDAwICYmIChjMSkgPT0gMHg3RCAmJiAoYzIpID09IDB4M0IpCVwKLQkJKGFzc2kpID0gMHg5QjFEOworI2RlZmluZSBFTVVMQVRFX0pJU1gwMjEzXzIwMDBfREVDT0RFX1BMQU5FMihhc3NpLCBjMSwgYzIpICAgICAgICAgICAgICAgXAorICAgIGlmIChjb25maWcgPT0gKHZvaWQgKikyMDAwICYmIChjMSkgPT0gMHg3RCAmJiAoYzIpID09IDB4M0IpICAgICAgICAgXAorICAgICAgICAoYXNzaSkgPSAweDlCMUQ7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jIGIvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYwppbmRleCA1ZmI1ZWMwLi45ODU2ZjA0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5jCisrKyBiL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmMKQEAgLTQ1LDE3MCArNDUsMTcwIEBACiBzdGF0aWMgY2hhciAqc3RyZWFta3dhcmdsaXN0W10gPSB7InN0cmVhbSIsICJlcnJvcnMiLCBOVUxMfTsKIAogc3RhdGljIFB5T2JqZWN0ICptdWx0aWJ5dGVjb2RlY19lbmNvZGUoTXVsdGlieXRlQ29kZWMgKiwKLQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKiwgY29uc3QgUHlfVU5JQ09ERSAqKiwgUHlfc3NpemVfdCwKLQkJUHlPYmplY3QgKiwgaW50KTsKKyAgICAgICAgICAgICAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqLCBjb25zdCBQeV9VTklDT0RFICoqLCBQeV9zc2l6ZV90LAorICAgICAgICAgICAgICAgIFB5T2JqZWN0ICosIGludCk7CiAKLSNkZWZpbmUgTUJFTkNfUkVTRVQJTUJFTkNfTUFYPDwxIC8qIHJlc2V0IGFmdGVyIGFuIGVuY29kaW5nIHNlc3Npb24gKi8KKyNkZWZpbmUgTUJFTkNfUkVTRVQgICAgIE1CRU5DX01BWDw8MSAvKiByZXNldCBhZnRlciBhbiBlbmNvZGluZyBzZXNzaW9uICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlX3R1cGxlKFB5T2JqZWN0ICpvYmplY3QsIFB5X3NzaXplX3QgbGVuKQogewotCVB5T2JqZWN0ICp2LCAqdzsKKyAgICBQeU9iamVjdCAqdiwgKnc7CiAKLQlpZiAob2JqZWN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChvYmplY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl2ID0gUHlUdXBsZV9OZXcoMik7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYob2JqZWN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5VHVwbGVfU0VUX0lURU0odiwgMCwgb2JqZWN0KTsKKyAgICB2ID0gUHlUdXBsZV9OZXcoMik7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYob2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5VHVwbGVfU0VUX0lURU0odiwgMCwgb2JqZWN0KTsKIAotCXcgPSBQeUludF9Gcm9tU3NpemVfdChsZW4pOwotCWlmICh3ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlUdXBsZV9TRVRfSVRFTSh2LCAxLCB3KTsKKyAgICB3ID0gUHlJbnRfRnJvbVNzaXplX3QobGVuKTsKKyAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5VHVwbGVfU0VUX0lURU0odiwgMSwgdyk7CiAKLQlyZXR1cm4gdjsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGNvbnN0IGNoYXIgKmVycm9ycykKIHsKLQlpZiAoZXJyb3JzID09IE5VTEwgfHwgc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApCi0JCXJldHVybiBFUlJPUl9TVFJJQ1Q7Ci0JZWxzZSBpZiAoc3RyY21wKGVycm9ycywgImlnbm9yZSIpID09IDApCi0JCXJldHVybiBFUlJPUl9JR05PUkU7Ci0JZWxzZSBpZiAoc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSA9PSAwKQotCQlyZXR1cm4gRVJST1JfUkVQTEFDRTsKLQllbHNlCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGVycm9ycyk7CisgICAgaWYgKGVycm9ycyA9PSBOVUxMIHx8IHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKQorICAgICAgICByZXR1cm4gRVJST1JfU1RSSUNUOworICAgIGVsc2UgaWYgKHN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSA9PSAwKQorICAgICAgICByZXR1cm4gRVJST1JfSUdOT1JFOworICAgIGVsc2UgaWYgKHN0cmNtcChlcnJvcnMsICJyZXBsYWNlIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX1JFUExBQ0U7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9lcnJvcl9jYWxsYmFjayhQeU9iamVjdCAqZXJyb3JzLCBQeU9iamVjdCAqZXhjKQogewotCVB5T2JqZWN0ICphcmdzLCAqY2IsICpyOworICAgIFB5T2JqZWN0ICphcmdzLCAqY2IsICpyOwogCi0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGVycm9ycykpOwotCWNiID0gUHlDb2RlY19Mb29rdXBFcnJvcihQeVN0cmluZ19BU19TVFJJTkcoZXJyb3JzKSk7Ci0JaWYgKGNiID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGFzc2VydChQeVN0cmluZ19DaGVjayhlcnJvcnMpKTsKKyAgICBjYiA9IFB5Q29kZWNfTG9va3VwRXJyb3IoUHlTdHJpbmdfQVNfU1RSSU5HKGVycm9ycykpOworICAgIGlmIChjYiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFyZ3MgPSBQeVR1cGxlX05ldygxKTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihjYik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBhcmdzID0gUHlUdXBsZV9OZXcoMSk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoY2IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIGV4Yyk7Ci0JUHlfSU5DUkVGKGV4Yyk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBleGMpOworICAgIFB5X0lOQ1JFRihleGMpOwogCi0JciA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2IsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoY2IpOwotCXJldHVybiByOworICAgIHIgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNiLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGNiKTsKKyAgICByZXR1cm4gcjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvZGVjY3R4X2Vycm9yc19nZXQoTXVsdGlieXRlU3RhdGVmdWxDb2RlY0NvbnRleHQgKnNlbGYpCiB7Ci0JY29uc3QgY2hhciAqZXJyb3JzOworICAgIGNvbnN0IGNoYXIgKmVycm9yczsKIAotCWlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfU1RSSUNUKQotCQllcnJvcnMgPSAic3RyaWN0IjsKLQllbHNlIGlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfSUdOT1JFKQotCQllcnJvcnMgPSAiaWdub3JlIjsKLQllbHNlIGlmIChzZWxmLT5lcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkKLQkJZXJyb3JzID0gInJlcGxhY2UiOwotCWVsc2UgewotCQlQeV9JTkNSRUYoc2VsZi0+ZXJyb3JzKTsKLQkJcmV0dXJuIHNlbGYtPmVycm9yczsKLQl9CisgICAgaWYgKHNlbGYtPmVycm9ycyA9PSBFUlJPUl9TVFJJQ1QpCisgICAgICAgIGVycm9ycyA9ICJzdHJpY3QiOworICAgIGVsc2UgaWYgKHNlbGYtPmVycm9ycyA9PSBFUlJPUl9JR05PUkUpCisgICAgICAgIGVycm9ycyA9ICJpZ25vcmUiOworICAgIGVsc2UgaWYgKHNlbGYtPmVycm9ycyA9PSBFUlJPUl9SRVBMQUNFKQorICAgICAgICBlcnJvcnMgPSAicmVwbGFjZSI7CisgICAgZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5lcnJvcnMpOworICAgICAgICByZXR1cm4gc2VsZi0+ZXJyb3JzOworICAgIH0KIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGVycm9ycyk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZXJyb3JzKTsKIH0KIAogc3RhdGljIGludAogY29kZWNjdHhfZXJyb3JzX3NldChNdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjQ29udGV4dCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAotCQkgICAgdm9pZCAqY2xvc3VyZSkKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeU9iamVjdCAqY2I7CisgICAgUHlPYmplY3QgKmNiOwogCi0JaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImVycm9ycyBtdXN0IGJlIGEgc3RyaW5nIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImVycm9ycyBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQljYiA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSkpOwotCWlmIChjYiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgY2IgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpKTsKKyAgICBpZiAoY2IgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7Ci0Jc2VsZi0+ZXJyb3JzID0gY2I7Ci0JcmV0dXJuIDA7CisgICAgRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7CisgICAgc2VsZi0+ZXJyb3JzID0gY2I7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFRoaXMgZ2V0c2V0IGhhbmRsZXJzIGxpc3QgaXMgdXNlZCBieSBhbGwgdGhlIHN0YXRlZnVsIGNvZGVjIG9iamVjdHMgKi8KIHN0YXRpYyBQeUdldFNldERlZiBjb2RlY2N0eF9nZXRzZXRzW10gPSB7Ci0JeyJlcnJvcnMiLAkoZ2V0dGVyKWNvZGVjY3R4X2Vycm9yc19nZXQsCi0JCQkoc2V0dGVyKWNvZGVjY3R4X2Vycm9yc19zZXQsCi0JCQlQeURvY19TVFIoImhvdyB0byB0cmVhdCBlcnJvcnMiKX0sCi0Je05VTEwsfQorICAgIHsiZXJyb3JzIiwgICAgICAgICAgKGdldHRlciljb2RlY2N0eF9lcnJvcnNfZ2V0LAorICAgICAgICAgICAgICAgICAgICAoc2V0dGVyKWNvZGVjY3R4X2Vycm9yc19zZXQsCisgICAgICAgICAgICAgICAgICAgIFB5RG9jX1NUUigiaG93IHRvIHRyZWF0IGVycm9ycyIpfSwKKyAgICB7TlVMTCx9CiB9OwogCiBzdGF0aWMgaW50CiBleHBhbmRfZW5jb2RlYnVmZmVyKE11bHRpYnl0ZUVuY29kZUJ1ZmZlciAqYnVmLCBQeV9zc2l6ZV90IGVzaXplKQogewotCVB5X3NzaXplX3Qgb3JncG9zLCBvcmdzaXplLCBpbmNzaXplOworICAgIFB5X3NzaXplX3Qgb3JncG9zLCBvcmdzaXplLCBpbmNzaXplOwogCi0Jb3JncG9zID0gKFB5X3NzaXplX3QpKChjaGFyICopYnVmLT5vdXRidWYgLQotCQkJCVB5U3RyaW5nX0FTX1NUUklORyhidWYtPm91dG9iaikpOwotCW9yZ3NpemUgPSBQeVN0cmluZ19HRVRfU0laRShidWYtPm91dG9iaik7Ci0JaW5jc2l6ZSA9IChlc2l6ZSA8IChvcmdzaXplID4+IDEpID8gKG9yZ3NpemUgPj4gMSkgfCAxIDogZXNpemUpOworICAgIG9yZ3BvcyA9IChQeV9zc2l6ZV90KSgoY2hhciAqKWJ1Zi0+b3V0YnVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYnVmLT5vdXRvYmopKTsKKyAgICBvcmdzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoYnVmLT5vdXRvYmopOworICAgIGluY3NpemUgPSAoZXNpemUgPCAob3Jnc2l6ZSA+PiAxKSA/IChvcmdzaXplID4+IDEpIHwgMSA6IGVzaXplKTsKIAotCWlmIChvcmdzaXplID4gUFlfU1NJWkVfVF9NQVggLSBpbmNzaXplKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKG9yZ3NpemUgPiBQWV9TU0laRV9UX01BWCAtIGluY3NpemUpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYtPm91dG9iaiwgb3Jnc2l6ZSArIGluY3NpemUpID09IC0xKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1Zi0+b3V0b2JqLCBvcmdzaXplICsgaW5jc2l6ZSkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKIAotCWJ1Zi0+b3V0YnVmID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoYnVmLT5vdXRvYmopICtvcmdwb3M7Ci0JYnVmLT5vdXRidWZfZW5kID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoYnVmLT5vdXRvYmopCi0JCSsgUHlTdHJpbmdfR0VUX1NJWkUoYnVmLT5vdXRvYmopOworICAgIGJ1Zi0+b3V0YnVmID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoYnVmLT5vdXRvYmopICtvcmdwb3M7CisgICAgYnVmLT5vdXRidWZfZW5kID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoYnVmLT5vdXRvYmopCisgICAgICAgICsgUHlTdHJpbmdfR0VUX1NJWkUoYnVmLT5vdXRvYmopOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9Ci0jZGVmaW5lIFJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgcykgewkJCQkJXAotCWlmICgocykgPCAxIHx8IChidWYpLT5vdXRidWYgKyAocykgPiAoYnVmKS0+b3V0YnVmX2VuZCkJCVwKLQkJaWYgKGV4cGFuZF9lbmNvZGVidWZmZXIoYnVmLCBzKSA9PSAtMSkJCQlcCi0JCQlnb3RvIGVycm9yZXhpdDsJCQkJCVwKKyNkZWZpbmUgUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCBzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKHMpIDwgMSB8fCAoYnVmKS0+b3V0YnVmICsgKHMpID4gKGJ1ZiktPm91dGJ1Zl9lbmQpICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGV4cGFuZF9lbmNvZGVidWZmZXIoYnVmLCBzKSA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogc3RhdGljIGludAogZXhwYW5kX2RlY29kZWJ1ZmZlcihNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZiwgUHlfc3NpemVfdCBlc2l6ZSkKIHsKLQlQeV9zc2l6ZV90IG9yZ3Bvcywgb3Jnc2l6ZTsKKyAgICBQeV9zc2l6ZV90IG9yZ3Bvcywgb3Jnc2l6ZTsKIAotCW9yZ3BvcyA9IChQeV9zc2l6ZV90KShidWYtPm91dGJ1ZiAtIFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi0+b3V0b2JqKSk7Ci0Jb3Jnc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShidWYtPm91dG9iaik7Ci0JaWYgKFB5VW5pY29kZV9SZXNpemUoJmJ1Zi0+b3V0b2JqLCBvcmdzaXplICsgKAotCSAgICBlc2l6ZSA8IChvcmdzaXplID4+IDEpID8gKG9yZ3NpemUgPj4gMSkgfCAxIDogZXNpemUpKSA9PSAtMSkKLQkJcmV0dXJuIC0xOworICAgIG9yZ3BvcyA9IChQeV9zc2l6ZV90KShidWYtPm91dGJ1ZiAtIFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi0+b3V0b2JqKSk7CisgICAgb3Jnc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRShidWYtPm91dG9iaik7CisgICAgaWYgKFB5VW5pY29kZV9SZXNpemUoJmJ1Zi0+b3V0b2JqLCBvcmdzaXplICsgKAorICAgICAgICBlc2l6ZSA8IChvcmdzaXplID4+IDEpID8gKG9yZ3NpemUgPj4gMSkgfCAxIDogZXNpemUpKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JYnVmLT5vdXRidWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikgKyBvcmdwb3M7Ci0JYnVmLT5vdXRidWZfZW5kID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopCi0JCQkgICsgUHlVbmljb2RlX0dFVF9TSVpFKGJ1Zi0+b3V0b2JqKTsKKyAgICBidWYtPm91dGJ1ZiA9IFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi0+b3V0b2JqKSArIG9yZ3BvczsKKyAgICBidWYtPm91dGJ1Zl9lbmQgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaikKKyAgICAgICAgICAgICAgICAgICAgICArIFB5VW5pY29kZV9HRVRfU0laRShidWYtPm91dG9iaik7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KLSNkZWZpbmUgUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCBzKSB7CQkJCQlcCi0JaWYgKChzKSA8IDEgfHwgKGJ1ZiktPm91dGJ1ZiArIChzKSA+IChidWYpLT5vdXRidWZfZW5kKQkJXAotCQlpZiAoZXhwYW5kX2RlY29kZWJ1ZmZlcihidWYsIHMpID09IC0xKQkJCVwKLQkJCWdvdG8gZXJyb3JleGl0OwkJCQkJXAorI2RlZmluZSBSRVFVSVJFX0RFQ09ERUJVRkZFUihidWYsIHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgocykgPCAxIHx8IChidWYpLT5vdXRidWYgKyAocykgPiAoYnVmKS0+b3V0YnVmX2VuZCkgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZXhwYW5kX2RlY29kZWJ1ZmZlcihidWYsIHMpID09IC0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCiAKQEAgLTIxOCw1MDUgKzIxOCw1MDUgQEAKIAogc3RhdGljIGludAogbXVsdGlieXRlY29kZWNfZW5jZXJyb3IoTXVsdGlieXRlQ29kZWMgKmNvZGVjLAotCQkJTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkJTXVsdGlieXRlRW5jb2RlQnVmZmVyICpidWYsCi0JCQlQeU9iamVjdCAqZXJyb3JzLCBQeV9zc2l6ZV90IGUpCisgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVFbmNvZGVCdWZmZXIgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICplcnJvcnMsIFB5X3NzaXplX3QgZSkKIHsKLQlQeU9iamVjdCAqcmV0b2JqID0gTlVMTCwgKnJldHN0ciA9IE5VTEwsICp0b2JqOwotCVB5X3NzaXplX3QgcmV0c3Ryc2l6ZSwgbmV3cG9zOwotCVB5X3NzaXplX3QgZXNpemUsIHN0YXJ0LCBlbmQ7Ci0JY29uc3QgY2hhciAqcmVhc29uOworICAgIFB5T2JqZWN0ICpyZXRvYmogPSBOVUxMLCAqcmV0c3RyID0gTlVMTCwgKnRvYmo7CisgICAgUHlfc3NpemVfdCByZXRzdHJzaXplLCBuZXdwb3M7CisgICAgUHlfc3NpemVfdCBlc2l6ZSwgc3RhcnQsIGVuZDsKKyAgICBjb25zdCBjaGFyICpyZWFzb247CiAKLQlpZiAoZSA+IDApIHsKLQkJcmVhc29uID0gImlsbGVnYWwgbXVsdGlieXRlIHNlcXVlbmNlIjsKLQkJZXNpemUgPSBlOwotCX0KLQllbHNlIHsKLQkJc3dpdGNoIChlKSB7Ci0JCWNhc2UgTUJFUlJfVE9PU01BTEw6Ci0JCQlSRVFVSVJFX0VOQ09ERUJVRkZFUihidWYsIC0xKTsKLQkJCXJldHVybiAwOyAvKiByZXRyeSBpdCAqLwotCQljYXNlIE1CRVJSX1RPT0ZFVzoKLQkJCXJlYXNvbiA9ICJpbmNvbXBsZXRlIG11bHRpYnl0ZSBzZXF1ZW5jZSI7Ci0JCQllc2l6ZSA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUJFUlJfSU5URVJOQUw6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkiaW50ZXJuYWwgY29kZWMgZXJyb3IiKTsKLQkJCXJldHVybiAtMTsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJCSJ1bmtub3duIHJ1bnRpbWUgZXJyb3IiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICBpZiAoZSA+IDApIHsKKyAgICAgICAgcmVhc29uID0gImlsbGVnYWwgbXVsdGlieXRlIHNlcXVlbmNlIjsKKyAgICAgICAgZXNpemUgPSBlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChlKSB7CisgICAgICAgIGNhc2UgTUJFUlJfVE9PU01BTEw6CisgICAgICAgICAgICBSRVFVSVJFX0VOQ09ERUJVRkZFUihidWYsIC0xKTsKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiByZXRyeSBpdCAqLworICAgICAgICBjYXNlIE1CRVJSX1RPT0ZFVzoKKyAgICAgICAgICAgIHJlYXNvbiA9ICJpbmNvbXBsZXRlIG11bHRpYnl0ZSBzZXF1ZW5jZSI7CisgICAgICAgICAgICBlc2l6ZSA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUJFUlJfSU5URVJOQUw6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBjb2RlYyBlcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBydW50aW1lIGVycm9yIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpIHsKLQkJY29uc3QgUHlfVU5JQ09ERSByZXBsY2hhciA9ICc/JywgKmluYnVmID0gJnJlcGxjaGFyOwotCQlQeV9zc2l6ZV90IHI7CisgICAgaWYgKGVycm9ycyA9PSBFUlJPUl9SRVBMQUNFKSB7CisgICAgICAgIGNvbnN0IFB5X1VOSUNPREUgcmVwbGNoYXIgPSAnPycsICppbmJ1ZiA9ICZyZXBsY2hhcjsKKyAgICAgICAgUHlfc3NpemVfdCByOwogCi0JCWZvciAoOzspIHsKLQkJCVB5X3NzaXplX3Qgb3V0bGVmdDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgUHlfc3NpemVfdCBvdXRsZWZ0OwogCi0JCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+b3V0YnVmX2VuZCAtIGJ1Zi0+b3V0YnVmKTsKLQkJCXIgPSBjb2RlYy0+ZW5jb2RlKHN0YXRlLCBjb2RlYy0+Y29uZmlnLCAmaW5idWYsIDEsCi0JCQkJCSAgJmJ1Zi0+b3V0YnVmLCBvdXRsZWZ0LCAwKTsKLQkJCWlmIChyID09IE1CRVJSX1RPT1NNQUxMKSB7Ci0JCQkJUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCAtMSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgICAgIG91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWZfZW5kIC0gYnVmLT5vdXRidWYpOworICAgICAgICAgICAgciA9IGNvZGVjLT5lbmNvZGUoc3RhdGUsIGNvZGVjLT5jb25maWcsICZpbmJ1ZiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYtPm91dGJ1Ziwgb3V0bGVmdCwgMCk7CisgICAgICAgICAgICBpZiAociA9PSBNQkVSUl9UT09TTUFMTCkgeworICAgICAgICAgICAgICAgIFJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgLTEpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJaWYgKHIgIT0gMCkgewotCQkJUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCAxKTsKLQkJCSpidWYtPm91dGJ1ZisrID0gJz8nOwotCQl9Ci0JfQotCWlmIChlcnJvcnMgPT0gRVJST1JfSUdOT1JFIHx8IGVycm9ycyA9PSBFUlJPUl9SRVBMQUNFKSB7Ci0JCWJ1Zi0+aW5idWYgKz0gZXNpemU7Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgaWYgKHIgIT0gMCkgeworICAgICAgICAgICAgUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCAxKTsKKyAgICAgICAgICAgICpidWYtPm91dGJ1ZisrID0gJz8nOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnJvcnMgPT0gRVJST1JfSUdOT1JFIHx8IGVycm9ycyA9PSBFUlJPUl9SRVBMQUNFKSB7CisgICAgICAgIGJ1Zi0+aW5idWYgKz0gZXNpemU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXN0YXJ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWYgLSBidWYtPmluYnVmX3RvcCk7Ci0JZW5kID0gc3RhcnQgKyBlc2l6ZTsKKyAgICBzdGFydCA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmIC0gYnVmLT5pbmJ1Zl90b3ApOworICAgIGVuZCA9IHN0YXJ0ICsgZXNpemU7CiAKLQkvKiB1c2UgY2FjaGVkIGV4Y2VwdGlvbiBvYmplY3QgaWYgYXZhaWxhYmxlICovCi0JaWYgKGJ1Zi0+ZXhjb2JqID09IE5VTEwpIHsKLQkJYnVmLT5leGNvYmogPSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9DcmVhdGUoY29kZWMtPmVuY29kaW5nLAotCQkJCWJ1Zi0+aW5idWZfdG9wLAotCQkJCWJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zl90b3AsCi0JCQkJc3RhcnQsIGVuZCwgcmVhc29uKTsKLQkJaWYgKGJ1Zi0+ZXhjb2JqID09IE5VTEwpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQl9Ci0JZWxzZQotCQlpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQoYnVmLT5leGNvYmosIHN0YXJ0KSAhPSAwIHx8Ci0JCSAgICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQoYnVmLT5leGNvYmosIGVuZCkgIT0gMCB8fAotCQkgICAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uKGJ1Zi0+ZXhjb2JqLCByZWFzb24pICE9IDApCi0JCQlnb3RvIGVycm9yZXhpdDsKKyAgICAvKiB1c2UgY2FjaGVkIGV4Y2VwdGlvbiBvYmplY3QgaWYgYXZhaWxhYmxlICovCisgICAgaWYgKGJ1Zi0+ZXhjb2JqID09IE5VTEwpIHsKKyAgICAgICAgYnVmLT5leGNvYmogPSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9DcmVhdGUoY29kZWMtPmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5pbmJ1Zl90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICBidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgcmVhc29uKTsKKyAgICAgICAgaWYgKGJ1Zi0+ZXhjb2JqID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQoYnVmLT5leGNvYmosIHN0YXJ0KSAhPSAwIHx8CisgICAgICAgICAgICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQoYnVmLT5leGNvYmosIGVuZCkgIT0gMCB8fAorICAgICAgICAgICAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uKGJ1Zi0+ZXhjb2JqLCByZWFzb24pICE9IDApCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCWlmIChlcnJvcnMgPT0gRVJST1JfU1RSSUNUKSB7Ci0JCVB5Q29kZWNfU3RyaWN0RXJyb3JzKGJ1Zi0+ZXhjb2JqKTsKLQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgIGlmIChlcnJvcnMgPT0gRVJST1JfU1RSSUNUKSB7CisgICAgICAgIFB5Q29kZWNfU3RyaWN0RXJyb3JzKGJ1Zi0+ZXhjb2JqKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQogCi0JcmV0b2JqID0gY2FsbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMsIGJ1Zi0+ZXhjb2JqKTsKLQlpZiAocmV0b2JqID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OworICAgIHJldG9iaiA9IGNhbGxfZXJyb3JfY2FsbGJhY2soZXJyb3JzLCBidWYtPmV4Y29iaik7CisgICAgaWYgKHJldG9iaiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCWlmICghUHlUdXBsZV9DaGVjayhyZXRvYmopIHx8IFB5VHVwbGVfR0VUX1NJWkUocmV0b2JqKSAhPSAyIHx8Ci0JICAgICFQeVVuaWNvZGVfQ2hlY2soKHRvYmogPSBQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMCkpKSB8fAotCSAgICAhKFB5SW50X0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkgfHwKLQkgICAgICBQeUxvbmdfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZW5jb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAiCi0JCQkJIih1bmljb2RlLCBpbnQpIHR1cGxlIik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2socmV0b2JqKSB8fCBQeVR1cGxlX0dFVF9TSVpFKHJldG9iaikgIT0gMiB8fAorICAgICAgICAhUHlVbmljb2RlX0NoZWNrKCh0b2JqID0gUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDApKSkgfHwKKyAgICAgICAgIShQeUludF9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpIHx8CisgICAgICAgICAgUHlMb25nX0NoZWNrKFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAxKSkpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiKHVuaWNvZGUsIGludCkgdHVwbGUiKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQogCi0JewotCQljb25zdCBQeV9VTklDT0RFICp1cmF3ID0gUHlVbmljb2RlX0FTX1VOSUNPREUodG9iaik7CisgICAgeworICAgICAgICBjb25zdCBQeV9VTklDT0RFICp1cmF3ID0gUHlVbmljb2RlX0FTX1VOSUNPREUodG9iaik7CiAKLQkJcmV0c3RyID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKGNvZGVjLCBzdGF0ZSwgJnVyYXcsCi0JCQkJUHlVbmljb2RlX0dFVF9TSVpFKHRvYmopLCBFUlJPUl9TVFJJQ1QsCi0JCQkJTUJFTkNfRkxVU0gpOwotCQlpZiAocmV0c3RyID09IE5VTEwpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgICAgIHJldHN0ciA9IG11bHRpYnl0ZWNvZGVjX2VuY29kZShjb2RlYywgc3RhdGUsICZ1cmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHRvYmopLCBFUlJPUl9TVFJJQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICBNQkVOQ19GTFVTSCk7CisgICAgICAgIGlmIChyZXRzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXJldHN0cnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShyZXRzdHIpOwotCVJFUVVJUkVfRU5DT0RFQlVGRkVSKGJ1ZiwgcmV0c3Ryc2l6ZSk7CisgICAgcmV0c3Ryc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHJldHN0cik7CisgICAgUkVRVUlSRV9FTkNPREVCVUZGRVIoYnVmLCByZXRzdHJzaXplKTsKIAotCW1lbWNweShidWYtPm91dGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHJldHN0ciksIHJldHN0cnNpemUpOwotCWJ1Zi0+b3V0YnVmICs9IHJldHN0cnNpemU7CisgICAgbWVtY3B5KGJ1Zi0+b3V0YnVmLCBQeVN0cmluZ19BU19TVFJJTkcocmV0c3RyKSwgcmV0c3Ryc2l6ZSk7CisgICAgYnVmLT5vdXRidWYgKz0gcmV0c3Ryc2l6ZTsKIAotCW5ld3BvcyA9IFB5SW50X0FzU3NpemVfdChQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpOwotCWlmIChuZXdwb3MgPCAwICYmICFQeUVycl9PY2N1cnJlZCgpKQotCQluZXdwb3MgKz0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zl90b3ApOwotCWlmIChuZXdwb3MgPCAwIHx8IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zID4gYnVmLT5pbmJ1Zl9lbmQpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsCi0JCQkgICAgICJwb3NpdGlvbiAlemQgZnJvbSBlcnJvciBoYW5kbGVyIG91dCBvZiBib3VuZHMiLAotCQkJICAgICBuZXdwb3MpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9Ci0JYnVmLT5pbmJ1ZiA9IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zOworICAgIG5ld3BvcyA9IFB5SW50X0FzU3NpemVfdChQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpOworICAgIGlmIChuZXdwb3MgPCAwICYmICFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBuZXdwb3MgKz0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zl90b3ApOworICAgIGlmIChuZXdwb3MgPCAwIHx8IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zID4gYnVmLT5pbmJ1Zl9lbmQpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAicG9zaXRpb24gJXpkIGZyb20gZXJyb3IgaGFuZGxlciBvdXQgb2YgYm91bmRzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ld3Bvcyk7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KKyAgICBidWYtPmluYnVmID0gYnVmLT5pbmJ1Zl90b3AgKyBuZXdwb3M7CiAKLQlQeV9ERUNSRUYocmV0b2JqKTsKLQlQeV9ERUNSRUYocmV0c3RyKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYocmV0b2JqKTsKKyAgICBQeV9ERUNSRUYocmV0c3RyKTsKKyAgICByZXR1cm4gMDsKIAogZXJyb3JleGl0OgotCVB5X1hERUNSRUYocmV0b2JqKTsKLQlQeV9YREVDUkVGKHJldHN0cik7Ci0JcmV0dXJuIC0xOworICAgIFB5X1hERUNSRUYocmV0b2JqKTsKKyAgICBQeV9YREVDUkVGKHJldHN0cik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50CiBtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihNdWx0aWJ5dGVDb2RlYyAqY29kZWMsCi0JCQlNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCi0JCQlNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZiwKLQkJCVB5T2JqZWN0ICplcnJvcnMsIFB5X3NzaXplX3QgZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmVycm9ycywgUHlfc3NpemVfdCBlKQogewotCVB5T2JqZWN0ICpyZXRvYmogPSBOVUxMLCAqcmV0dW5pID0gTlVMTDsKLQlQeV9zc2l6ZV90IHJldHVuaXNpemUsIG5ld3BvczsKLQljb25zdCBjaGFyICpyZWFzb247Ci0JUHlfc3NpemVfdCBlc2l6ZSwgc3RhcnQsIGVuZDsKKyAgICBQeU9iamVjdCAqcmV0b2JqID0gTlVMTCwgKnJldHVuaSA9IE5VTEw7CisgICAgUHlfc3NpemVfdCByZXR1bmlzaXplLCBuZXdwb3M7CisgICAgY29uc3QgY2hhciAqcmVhc29uOworICAgIFB5X3NzaXplX3QgZXNpemUsIHN0YXJ0LCBlbmQ7CiAKLQlpZiAoZSA+IDApIHsKLQkJcmVhc29uID0gImlsbGVnYWwgbXVsdGlieXRlIHNlcXVlbmNlIjsKLQkJZXNpemUgPSBlOwotCX0KLQllbHNlIHsKLQkJc3dpdGNoIChlKSB7Ci0JCWNhc2UgTUJFUlJfVE9PU01BTEw6Ci0JCQlSRVFVSVJFX0RFQ09ERUJVRkZFUihidWYsIC0xKTsKLQkJCXJldHVybiAwOyAvKiByZXRyeSBpdCAqLwotCQljYXNlIE1CRVJSX1RPT0ZFVzoKLQkJCXJlYXNvbiA9ICJpbmNvbXBsZXRlIG11bHRpYnl0ZSBzZXF1ZW5jZSI7Ci0JCQllc2l6ZSA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUJFUlJfSU5URVJOQUw6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkiaW50ZXJuYWwgY29kZWMgZXJyb3IiKTsKLQkJCXJldHVybiAtMTsKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJCSJ1bmtub3duIHJ1bnRpbWUgZXJyb3IiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICBpZiAoZSA+IDApIHsKKyAgICAgICAgcmVhc29uID0gImlsbGVnYWwgbXVsdGlieXRlIHNlcXVlbmNlIjsKKyAgICAgICAgZXNpemUgPSBlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChlKSB7CisgICAgICAgIGNhc2UgTUJFUlJfVE9PU01BTEw6CisgICAgICAgICAgICBSRVFVSVJFX0RFQ09ERUJVRkZFUihidWYsIC0xKTsKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiByZXRyeSBpdCAqLworICAgICAgICBjYXNlIE1CRVJSX1RPT0ZFVzoKKyAgICAgICAgICAgIHJlYXNvbiA9ICJpbmNvbXBsZXRlIG11bHRpYnl0ZSBzZXF1ZW5jZSI7CisgICAgICAgICAgICBlc2l6ZSA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUJFUlJfSU5URVJOQUw6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBjb2RlYyBlcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBydW50aW1lIGVycm9yIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpIHsKLQkJUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCAxKTsKLQkJKmJ1Zi0+b3V0YnVmKysgPSBQeV9VTklDT0RFX1JFUExBQ0VNRU5UX0NIQVJBQ1RFUjsKLQl9Ci0JaWYgKGVycm9ycyA9PSBFUlJPUl9JR05PUkUgfHwgZXJyb3JzID09IEVSUk9SX1JFUExBQ0UpIHsKLQkJYnVmLT5pbmJ1ZiArPSBlc2l6ZTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChlcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkgeworICAgICAgICBSRVFVSVJFX0RFQ09ERUJVRkZFUihidWYsIDEpOworICAgICAgICAqYnVmLT5vdXRidWYrKyA9IFB5X1VOSUNPREVfUkVQTEFDRU1FTlRfQ0hBUkFDVEVSOworICAgIH0KKyAgICBpZiAoZXJyb3JzID09IEVSUk9SX0lHTk9SRSB8fCBlcnJvcnMgPT0gRVJST1JfUkVQTEFDRSkgeworICAgICAgICBidWYtPmluYnVmICs9IGVzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlzdGFydCA9IChQeV9zc2l6ZV90KShidWYtPmluYnVmIC0gYnVmLT5pbmJ1Zl90b3ApOwotCWVuZCA9IHN0YXJ0ICsgZXNpemU7CisgICAgc3RhcnQgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1ZiAtIGJ1Zi0+aW5idWZfdG9wKTsKKyAgICBlbmQgPSBzdGFydCArIGVzaXplOwogCi0JLyogdXNlIGNhY2hlZCBleGNlcHRpb24gb2JqZWN0IGlmIGF2YWlsYWJsZSAqLwotCWlmIChidWYtPmV4Y29iaiA9PSBOVUxMKSB7Ci0JCWJ1Zi0+ZXhjb2JqID0gUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlKGNvZGVjLT5lbmNvZGluZywKLQkJCQkoY29uc3QgY2hhciAqKWJ1Zi0+aW5idWZfdG9wLAotCQkJCShQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKSwKLQkJCQlzdGFydCwgZW5kLCByZWFzb24pOwotCQlpZiAoYnVmLT5leGNvYmogPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JleGl0OwotCX0KLQllbHNlCi0JCWlmIChQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydChidWYtPmV4Y29iaiwgc3RhcnQpIHx8Ci0JCSAgICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQoYnVmLT5leGNvYmosIGVuZCkgfHwKLQkJICAgIFB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbihidWYtPmV4Y29iaiwgcmVhc29uKSkKLQkJCWdvdG8gZXJyb3JleGl0OworICAgIC8qIHVzZSBjYWNoZWQgZXhjZXB0aW9uIG9iamVjdCBpZiBhdmFpbGFibGUgKi8KKyAgICBpZiAoYnVmLT5leGNvYmogPT0gTlVMTCkgeworICAgICAgICBidWYtPmV4Y29iaiA9IFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZShjb2RlYy0+ZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKWJ1Zi0+aW5idWZfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zl90b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgcmVhc29uKTsKKyAgICAgICAgaWYgKGJ1Zi0+ZXhjb2JqID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBpZiAoUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQoYnVmLT5leGNvYmosIHN0YXJ0KSB8fAorICAgICAgICAgICAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kKGJ1Zi0+ZXhjb2JqLCBlbmQpIHx8CisgICAgICAgICAgICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb24oYnVmLT5leGNvYmosIHJlYXNvbikpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCWlmIChlcnJvcnMgPT0gRVJST1JfU1RSSUNUKSB7Ci0JCVB5Q29kZWNfU3RyaWN0RXJyb3JzKGJ1Zi0+ZXhjb2JqKTsKLQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgIGlmIChlcnJvcnMgPT0gRVJST1JfU1RSSUNUKSB7CisgICAgICAgIFB5Q29kZWNfU3RyaWN0RXJyb3JzKGJ1Zi0+ZXhjb2JqKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQogCi0JcmV0b2JqID0gY2FsbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMsIGJ1Zi0+ZXhjb2JqKTsKLQlpZiAocmV0b2JqID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OworICAgIHJldG9iaiA9IGNhbGxfZXJyb3JfY2FsbGJhY2soZXJyb3JzLCBidWYtPmV4Y29iaik7CisgICAgaWYgKHJldG9iaiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCWlmICghUHlUdXBsZV9DaGVjayhyZXRvYmopIHx8IFB5VHVwbGVfR0VUX1NJWkUocmV0b2JqKSAhPSAyIHx8Ci0JICAgICFQeVVuaWNvZGVfQ2hlY2soKHJldHVuaSA9IFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAwKSkpIHx8Ci0JICAgICEoUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSB8fAotCSAgICAgIFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuICIKLQkJCQkiKHVuaWNvZGUsIGludCkgdHVwbGUiKTsKLQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgIGlmICghUHlUdXBsZV9DaGVjayhyZXRvYmopIHx8IFB5VHVwbGVfR0VUX1NJWkUocmV0b2JqKSAhPSAyIHx8CisgICAgICAgICFQeVVuaWNvZGVfQ2hlY2soKHJldHVuaSA9IFB5VHVwbGVfR0VUX0lURU0ocmV0b2JqLCAwKSkpIHx8CisgICAgICAgICEoUHlJbnRfQ2hlY2soUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKSB8fAorICAgICAgICAgIFB5TG9uZ19DaGVjayhQeVR1cGxlX0dFVF9JVEVNKHJldG9iaiwgMSkpKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIih1bmljb2RlLCBpbnQpIHR1cGxlIik7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCXJldHVuaXNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUocmV0dW5pKTsKLQlpZiAocmV0dW5pc2l6ZSA+IDApIHsKLQkJUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCByZXR1bmlzaXplKTsKLQkJbWVtY3B5KChjaGFyICopYnVmLT5vdXRidWYsIFB5VW5pY29kZV9BU19EQVRBKHJldHVuaSksCi0JCQkJcmV0dW5pc2l6ZSAqIFB5X1VOSUNPREVfU0laRSk7Ci0JCWJ1Zi0+b3V0YnVmICs9IHJldHVuaXNpemU7Ci0JfQorICAgIHJldHVuaXNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUocmV0dW5pKTsKKyAgICBpZiAocmV0dW5pc2l6ZSA+IDApIHsKKyAgICAgICAgUkVRVUlSRV9ERUNPREVCVUZGRVIoYnVmLCByZXR1bmlzaXplKTsKKyAgICAgICAgbWVtY3B5KChjaGFyICopYnVmLT5vdXRidWYsIFB5VW5pY29kZV9BU19EQVRBKHJldHVuaSksCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1bmlzaXplICogUHlfVU5JQ09ERV9TSVpFKTsKKyAgICAgICAgYnVmLT5vdXRidWYgKz0gcmV0dW5pc2l6ZTsKKyAgICB9CiAKLQluZXdwb3MgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKTsKLQlpZiAobmV3cG9zIDwgMCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLQkJbmV3cG9zICs9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKTsKLQlpZiAobmV3cG9zIDwgMCB8fCBidWYtPmluYnVmX3RvcCArIG5ld3BvcyA+IGJ1Zi0+aW5idWZfZW5kKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAotCQkJICAgICAicG9zaXRpb24gJXpkIGZyb20gZXJyb3IgaGFuZGxlciBvdXQgb2YgYm91bmRzIiwKLQkJCSAgICAgbmV3cG9zKTsKLQkJZ290byBlcnJvcmV4aXQ7Ci0JfQotCWJ1Zi0+aW5idWYgPSBidWYtPmluYnVmX3RvcCArIG5ld3BvczsKLQlQeV9ERUNSRUYocmV0b2JqKTsKLQlyZXR1cm4gMDsKKyAgICBuZXdwb3MgPSBQeUludF9Bc1NzaXplX3QoUHlUdXBsZV9HRVRfSVRFTShyZXRvYmosIDEpKTsKKyAgICBpZiAobmV3cG9zIDwgMCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgbmV3cG9zICs9IChQeV9zc2l6ZV90KShidWYtPmluYnVmX2VuZCAtIGJ1Zi0+aW5idWZfdG9wKTsKKyAgICBpZiAobmV3cG9zIDwgMCB8fCBidWYtPmluYnVmX3RvcCArIG5ld3BvcyA+IGJ1Zi0+aW5idWZfZW5kKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uICV6ZCBmcm9tIGVycm9yIGhhbmRsZXIgb3V0IG9mIGJvdW5kcyIsCisgICAgICAgICAgICAgICAgICAgICBuZXdwb3MpOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CisgICAgYnVmLT5pbmJ1ZiA9IGJ1Zi0+aW5idWZfdG9wICsgbmV3cG9zOworICAgIFB5X0RFQ1JFRihyZXRvYmopOworICAgIHJldHVybiAwOwogCiBlcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihyZXRvYmopOwotCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKHJldG9iaik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbXVsdGlieXRlY29kZWNfZW5jb2RlKE11bHRpYnl0ZUNvZGVjICpjb2RlYywKLQkJICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAotCQkgICAgICBjb25zdCBQeV9VTklDT0RFICoqZGF0YSwgUHlfc3NpemVfdCBkYXRhbGVuLAotCQkgICAgICBQeU9iamVjdCAqZXJyb3JzLCBpbnQgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgTXVsdGlieXRlQ29kZWNfU3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFB5X1VOSUNPREUgKipkYXRhLCBQeV9zc2l6ZV90IGRhdGFsZW4sCisgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmVycm9ycywgaW50IGZsYWdzKQogewotCU11bHRpYnl0ZUVuY29kZUJ1ZmZlciBidWY7Ci0JUHlfc3NpemVfdCBmaW5hbHNpemUsIHIgPSAwOworICAgIE11bHRpYnl0ZUVuY29kZUJ1ZmZlciBidWY7CisgICAgUHlfc3NpemVfdCBmaW5hbHNpemUsIHIgPSAwOwogCi0JaWYgKGRhdGFsZW4gPT0gMCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIGlmIChkYXRhbGVuID09IDApCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKIAotCWJ1Zi5leGNvYmogPSBOVUxMOwotCWJ1Zi5pbmJ1ZiA9IGJ1Zi5pbmJ1Zl90b3AgPSAqZGF0YTsKLQlidWYuaW5idWZfZW5kID0gYnVmLmluYnVmX3RvcCArIGRhdGFsZW47CisgICAgYnVmLmV4Y29iaiA9IE5VTEw7CisgICAgYnVmLmluYnVmID0gYnVmLmluYnVmX3RvcCA9ICpkYXRhOworICAgIGJ1Zi5pbmJ1Zl9lbmQgPSBidWYuaW5idWZfdG9wICsgZGF0YWxlbjsKIAotCWlmIChkYXRhbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gMTYpIC8gMikgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgaWYgKGRhdGFsZW4gPiAoUFlfU1NJWkVfVF9NQVggLSAxNikgLyAyKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCWJ1Zi5vdXRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBkYXRhbGVuICogMiArIDE2KTsKLQlpZiAoYnVmLm91dG9iaiA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlidWYub3V0YnVmID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoYnVmLm91dG9iaik7Ci0JYnVmLm91dGJ1Zl9lbmQgPSBidWYub3V0YnVmICsgUHlTdHJpbmdfR0VUX1NJWkUoYnVmLm91dG9iaik7CisgICAgYnVmLm91dG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGRhdGFsZW4gKiAyICsgMTYpOworICAgIGlmIChidWYub3V0b2JqID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGJ1Zi5vdXRidWYgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhidWYub3V0b2JqKTsKKyAgICBidWYub3V0YnVmX2VuZCA9IGJ1Zi5vdXRidWYgKyBQeVN0cmluZ19HRVRfU0laRShidWYub3V0b2JqKTsKIAotCXdoaWxlIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kKSB7Ci0JCVB5X3NzaXplX3QgaW5sZWZ0LCBvdXRsZWZ0OworICAgIHdoaWxlIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kKSB7CisgICAgICAgIFB5X3NzaXplX3QgaW5sZWZ0LCBvdXRsZWZ0OwogCi0JCS8qIHdlIGRvbid0IHJldXNlIGlubGVmdCBhbmQgb3V0bGVmdCBoZXJlLgotCQkgKiBlcnJvciBjYWxsYmFja3MgY2FuIHJlbG9jYXRlIHRoZSBjdXJzb3IgYW55d2hlcmUgb24gYnVmZmVyKi8KLQkJaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5pbmJ1Zl9lbmQgLSBidWYuaW5idWYpOwotCQlvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWZfZW5kIC0gYnVmLm91dGJ1Zik7Ci0JCXIgPSBjb2RlYy0+ZW5jb2RlKHN0YXRlLCBjb2RlYy0+Y29uZmlnLCAmYnVmLmluYnVmLCBpbmxlZnQsCi0JCQkJICAmYnVmLm91dGJ1Ziwgb3V0bGVmdCwgZmxhZ3MpOwotCQkqZGF0YSA9IGJ1Zi5pbmJ1ZjsKLQkJaWYgKChyID09IDApIHx8IChyID09IE1CRVJSX1RPT0ZFVyAmJiAhKGZsYWdzICYgTUJFTkNfRkxVU0gpKSkKLQkJCWJyZWFrOwotCQllbHNlIGlmIChtdWx0aWJ5dGVjb2RlY19lbmNlcnJvcihjb2RlYywgc3RhdGUsICZidWYsIGVycm9ycyxyKSkKLQkJCWdvdG8gZXJyb3JleGl0OwotCQllbHNlIGlmIChyID09IE1CRVJSX1RPT0ZFVykKLQkJCWJyZWFrOwotCX0KKyAgICAgICAgLyogd2UgZG9uJ3QgcmV1c2UgaW5sZWZ0IGFuZCBvdXRsZWZ0IGhlcmUuCisgICAgICAgICAqIGVycm9yIGNhbGxiYWNrcyBjYW4gcmVsb2NhdGUgdGhlIGN1cnNvciBhbnl3aGVyZSBvbiBidWZmZXIqLworICAgICAgICBpbmxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLmluYnVmX2VuZCAtIGJ1Zi5pbmJ1Zik7CisgICAgICAgIG91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1Zl9lbmQgLSBidWYub3V0YnVmKTsKKyAgICAgICAgciA9IGNvZGVjLT5lbmNvZGUoc3RhdGUsIGNvZGVjLT5jb25maWcsICZidWYuaW5idWYsIGlubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zi5vdXRidWYsIG91dGxlZnQsIGZsYWdzKTsKKyAgICAgICAgKmRhdGEgPSBidWYuaW5idWY7CisgICAgICAgIGlmICgociA9PSAwKSB8fCAociA9PSBNQkVSUl9UT09GRVcgJiYgIShmbGFncyAmIE1CRU5DX0ZMVVNIKSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZW5jZXJyb3IoY29kZWMsIHN0YXRlLCAmYnVmLCBlcnJvcnMscikpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgZWxzZSBpZiAociA9PSBNQkVSUl9UT09GRVcpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQlpZiAoY29kZWMtPmVuY3Jlc2V0ICE9IE5VTEwpCi0JCWZvciAoOzspIHsKLQkJCVB5X3NzaXplX3Qgb3V0bGVmdDsKKyAgICBpZiAoY29kZWMtPmVuY3Jlc2V0ICE9IE5VTEwpCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qgb3V0bGVmdDsKIAotCQkJb3V0bGVmdCA9IChQeV9zc2l6ZV90KShidWYub3V0YnVmX2VuZCAtIGJ1Zi5vdXRidWYpOwotCQkJciA9IGNvZGVjLT5lbmNyZXNldChzdGF0ZSwgY29kZWMtPmNvbmZpZywgJmJ1Zi5vdXRidWYsCi0JCQkJCSAgICBvdXRsZWZ0KTsKLQkJCWlmIChyID09IDApCi0JCQkJYnJlYWs7Ci0JCQllbHNlIGlmIChtdWx0aWJ5dGVjb2RlY19lbmNlcnJvcihjb2RlYywgc3RhdGUsCi0JCQkJCQkJICZidWYsIGVycm9ycywgcikpCi0JCQkJZ290byBlcnJvcmV4aXQ7Ci0JCX0KKyAgICAgICAgICAgIG91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1Zl9lbmQgLSBidWYub3V0YnVmKTsKKyAgICAgICAgICAgIHIgPSBjb2RlYy0+ZW5jcmVzZXQoc3RhdGUsIGNvZGVjLT5jb25maWcsICZidWYub3V0YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsZWZ0KTsKKyAgICAgICAgICAgIGlmIChyID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlIGlmIChtdWx0aWJ5dGVjb2RlY19lbmNlcnJvcihjb2RlYywgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmLCBlcnJvcnMsIHIpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgICAgICB9CiAKLQlmaW5hbHNpemUgPSAoUHlfc3NpemVfdCkoKGNoYXIgKilidWYub3V0YnVmIC0KLQkJCQkgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi5vdXRvYmopKTsKKyAgICBmaW5hbHNpemUgPSAoUHlfc3NpemVfdCkoKGNoYXIgKilidWYub3V0YnVmIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1Zi5vdXRvYmopKTsKIAotCWlmIChmaW5hbHNpemUgIT0gUHlTdHJpbmdfR0VUX1NJWkUoYnVmLm91dG9iaikpCi0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKGZpbmFsc2l6ZSAhPSBQeVN0cmluZ19HRVRfU0laRShidWYub3V0b2JqKSkKKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1Zi5vdXRvYmosIGZpbmFsc2l6ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7Ci0JcmV0dXJuIGJ1Zi5vdXRvYmo7CisgICAgUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKKyAgICByZXR1cm4gYnVmLm91dG9iajsKIAogZXJyb3JleGl0OgotCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7Ci0JUHlfWERFQ1JFRihidWYub3V0b2JqKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGJ1Zi5leGNvYmopOworICAgIFB5X1hERUNSRUYoYnVmLm91dG9iaik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBNdWx0aWJ5dGVDb2RlY19FbmNvZGUoTXVsdGlieXRlQ29kZWNPYmplY3QgKnNlbGYsCi0JCSAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCU11bHRpYnl0ZUNvZGVjX1N0YXRlIHN0YXRlOwotCVB5X1VOSUNPREUgKmRhdGE7Ci0JUHlPYmplY3QgKmVycm9yY2IsICpyLCAqYXJnLCAqdWN2dDsKLQljb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwotCVB5X3NzaXplX3QgZGF0YWxlbjsKKyAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsKKyAgICBQeV9VTklDT0RFICpkYXRhOworICAgIFB5T2JqZWN0ICplcnJvcmNiLCAqciwgKmFyZywgKnVjdnQ7CisgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGRhdGFsZW47CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHo6ZW5jb2RlIiwKLQkJCQljb2RlY2t3YXJnbGlzdCwgJmFyZywgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98ejplbmNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVja3dhcmdsaXN0LCAmYXJnLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpCi0JCXVjdnQgPSBOVUxMOwotCWVsc2UgewotCQlhcmcgPSB1Y3Z0ID0gUHlPYmplY3RfVW5pY29kZShhcmcpOwotCQlpZiAoYXJnID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayhhcmcpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjb3VsZG4ndCBjb252ZXJ0IHRoZSBvYmplY3QgdG8gdW5pY29kZS4iKTsKLQkJCVB5X0RFQ1JFRih1Y3Z0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkKKyAgICAgICAgdWN2dCA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIGFyZyA9IHVjdnQgPSBQeU9iamVjdF9Vbmljb2RlKGFyZyk7CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImNvdWxkbid0IGNvbnZlcnQgdGhlIG9iamVjdCB0byB1bmljb2RlLiIpOworICAgICAgICAgICAgUHlfREVDUkVGKHVjdnQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlkYXRhID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYXJnKTsKLQlkYXRhbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKGFyZyk7CisgICAgZGF0YSA9IFB5VW5pY29kZV9BU19VTklDT0RFKGFyZyk7CisgICAgZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRShhcmcpOwogCi0JZXJyb3JjYiA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKGVycm9yY2IgPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKHVjdnQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXJyb3JjYiA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisgICAgaWYgKGVycm9yY2IgPT0gTlVMTCkgeworICAgICAgICBQeV9YREVDUkVGKHVjdnQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoc2VsZi0+Y29kZWMtPmVuY2luaXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZW5jaW5pdCgmc3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OwotCXIgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoc2VsZi0+Y29kZWMsICZzdGF0ZSwKLQkJCShjb25zdCBQeV9VTklDT0RFICoqKSZkYXRhLCBkYXRhbGVuLCBlcnJvcmNiLAotCQkJTUJFTkNfRkxVU0ggfCBNQkVOQ19SRVNFVCk7Ci0JaWYgKHIgPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKHNlbGYtPmNvZGVjLT5lbmNpbml0ICE9IE5VTEwgJiYKKyAgICAgICAgc2VsZi0+Y29kZWMtPmVuY2luaXQoJnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICByID0gbXVsdGlieXRlY29kZWNfZW5jb2RlKHNlbGYtPmNvZGVjLCAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBQeV9VTklDT0RFICoqKSZkYXRhLCBkYXRhbGVuLCBlcnJvcmNiLAorICAgICAgICAgICAgICAgICAgICBNQkVOQ19GTFVTSCB8IE1CRU5DX1JFU0VUKTsKKyAgICBpZiAociA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKLQlQeV9YREVDUkVGKHVjdnQpOwotCXJldHVybiBtYWtlX3R1cGxlKHIsIGRhdGFsZW4pOworICAgIEVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKKyAgICBQeV9YREVDUkVGKHVjdnQpOworICAgIHJldHVybiBtYWtlX3R1cGxlKHIsIGRhdGFsZW4pOwogCiBlcnJvcmV4aXQ6Ci0JRVJST1JfREVDUkVGKGVycm9yY2IpOwotCVB5X1hERUNSRUYodWN2dCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgRVJST1JfREVDUkVGKGVycm9yY2IpOworICAgIFB5X1hERUNSRUYodWN2dCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBNdWx0aWJ5dGVDb2RlY19EZWNvZGUoTXVsdGlieXRlQ29kZWNPYmplY3QgKnNlbGYsCi0JCSAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotCU11bHRpYnl0ZUNvZGVjX1N0YXRlIHN0YXRlOwotCU11bHRpYnl0ZURlY29kZUJ1ZmZlciBidWY7Ci0JUHlPYmplY3QgKmVycm9yY2I7Ci0JUHlfYnVmZmVyIHBkYXRhOwotCWNvbnN0IGNoYXIgKmRhdGEsICplcnJvcnMgPSBOVUxMOwotCVB5X3NzaXplX3QgZGF0YWxlbiwgZmluYWxzaXplOworICAgIE11bHRpYnl0ZUNvZGVjX1N0YXRlIHN0YXRlOworICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciBidWY7CisgICAgUHlPYmplY3QgKmVycm9yY2I7CisgICAgUHlfYnVmZmVyIHBkYXRhOworICAgIGNvbnN0IGNoYXIgKmRhdGEsICplcnJvcnMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgZGF0YWxlbiwgZmluYWxzaXplOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyp8ejpkZWNvZGUiLAotCQkJCWNvZGVja3dhcmdsaXN0LCAmcGRhdGEsICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhID0gcGRhdGEuYnVmOwotCWRhdGFsZW4gPSBwZGF0YS5sZW47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAicyp8ejpkZWNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVja3dhcmdsaXN0LCAmcGRhdGEsICZlcnJvcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhID0gcGRhdGEuYnVmOworICAgIGRhdGFsZW4gPSBwZGF0YS5sZW47CiAKLQllcnJvcmNiID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKLQlpZiAoZXJyb3JjYiA9PSBOVUxMKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yY2IgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOworICAgIGlmIChlcnJvcmNiID09IE5VTEwpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGRhdGEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZGF0YWxlbiA9PSAwKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQkJRVJST1JfREVDUkVGKGVycm9yY2IpOwotCQlyZXR1cm4gbWFrZV90dXBsZShQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCksIDApOwotCX0KKyAgICBpZiAoZGF0YWxlbiA9PSAwKSB7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKKyAgICAgICAgRVJST1JfREVDUkVGKGVycm9yY2IpOworICAgICAgICByZXR1cm4gbWFrZV90dXBsZShQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCksIDApOworICAgIH0KIAotCWJ1Zi5leGNvYmogPSBOVUxMOwotCWJ1Zi5pbmJ1ZiA9IGJ1Zi5pbmJ1Zl90b3AgPSAodW5zaWduZWQgY2hhciAqKWRhdGE7Ci0JYnVmLmluYnVmX2VuZCA9IGJ1Zi5pbmJ1Zl90b3AgKyBkYXRhbGVuOwotCWJ1Zi5vdXRvYmogPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgZGF0YWxlbik7Ci0JaWYgKGJ1Zi5vdXRvYmogPT0gTlVMTCkKLQkJZ290byBlcnJvcmV4aXQ7Ci0JYnVmLm91dGJ1ZiA9IFB5VW5pY29kZV9BU19VTklDT0RFKGJ1Zi5vdXRvYmopOwotCWJ1Zi5vdXRidWZfZW5kID0gYnVmLm91dGJ1ZiArIFB5VW5pY29kZV9HRVRfU0laRShidWYub3V0b2JqKTsKKyAgICBidWYuZXhjb2JqID0gTlVMTDsKKyAgICBidWYuaW5idWYgPSBidWYuaW5idWZfdG9wID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOworICAgIGJ1Zi5pbmJ1Zl9lbmQgPSBidWYuaW5idWZfdG9wICsgZGF0YWxlbjsKKyAgICBidWYub3V0b2JqID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGRhdGFsZW4pOworICAgIGlmIChidWYub3V0b2JqID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGJ1Zi5vdXRidWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYub3V0b2JqKTsKKyAgICBidWYub3V0YnVmX2VuZCA9IGJ1Zi5vdXRidWYgKyBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaik7CiAKLQlpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OworICAgIGlmIChzZWxmLT5jb2RlYy0+ZGVjaW5pdCAhPSBOVUxMICYmCisgICAgICAgIHNlbGYtPmNvZGVjLT5kZWNpbml0KCZzdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQl3aGlsZSAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgewotCQlQeV9zc2l6ZV90IGlubGVmdCwgb3V0bGVmdCwgcjsKKyAgICB3aGlsZSAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeworICAgICAgICBQeV9zc2l6ZV90IGlubGVmdCwgb3V0bGVmdCwgcjsKIAotCQlpbmxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLmluYnVmX2VuZCAtIGJ1Zi5pbmJ1Zik7Ci0JCW91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1Zl9lbmQgLSBidWYub3V0YnVmKTsKKyAgICAgICAgaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5pbmJ1Zl9lbmQgLSBidWYuaW5idWYpOworICAgICAgICBvdXRsZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWZfZW5kIC0gYnVmLm91dGJ1Zik7CiAKLQkJciA9IHNlbGYtPmNvZGVjLT5kZWNvZGUoJnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnLAotCQkJCSZidWYuaW5idWYsIGlubGVmdCwgJmJ1Zi5vdXRidWYsIG91dGxlZnQpOwotCQlpZiAociA9PSAwKQotCQkJYnJlYWs7Ci0JCWVsc2UgaWYgKG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKHNlbGYtPmNvZGVjLCAmc3RhdGUsCi0JCQkJCQkgJmJ1ZiwgZXJyb3JjYiwgcikpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQl9CisgICAgICAgIHIgPSBzZWxmLT5jb2RlYy0+ZGVjb2RlKCZzdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZidWYuaW5idWYsIGlubGVmdCwgJmJ1Zi5vdXRidWYsIG91dGxlZnQpOworICAgICAgICBpZiAociA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKHNlbGYtPmNvZGVjLCAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYsIGVycm9yY2IsIHIpKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQogCi0JZmluYWxzaXplID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWYgLQotCQkJCSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYub3V0b2JqKSk7CisgICAgZmluYWxzaXplID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWYgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYub3V0b2JqKSk7CiAKLQlpZiAoZmluYWxzaXplICE9IFB5VW5pY29kZV9HRVRfU0laRShidWYub3V0b2JqKSkKLQkJaWYgKFB5VW5pY29kZV9SZXNpemUoJmJ1Zi5vdXRvYmosIGZpbmFsc2l6ZSkgPT0gLTEpCi0JCQlnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoZmluYWxzaXplICE9IFB5VW5pY29kZV9HRVRfU0laRShidWYub3V0b2JqKSkKKyAgICAgICAgaWYgKFB5VW5pY29kZV9SZXNpemUoJmJ1Zi5vdXRvYmosIGZpbmFsc2l6ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQlQeV9YREVDUkVGKGJ1Zi5leGNvYmopOwotCUVSUk9SX0RFQ1JFRihlcnJvcmNiKTsKLQlyZXR1cm4gbWFrZV90dXBsZShidWYub3V0b2JqLCBkYXRhbGVuKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKKyAgICBFUlJPUl9ERUNSRUYoZXJyb3JjYik7CisgICAgcmV0dXJuIG1ha2VfdHVwbGUoYnVmLm91dG9iaiwgZGF0YWxlbik7CiAKIGVycm9yZXhpdDoKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JRVJST1JfREVDUkVGKGVycm9yY2IpOwotCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7Ci0JUHlfWERFQ1JFRihidWYub3V0b2JqKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgRVJST1JfREVDUkVGKGVycm9yY2IpOworICAgIFB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisgICAgUHlfWERFQ1JFRihidWYub3V0b2JqKTsKIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG11bHRpYnl0ZWNvZGVjX21ldGhvZHNbXSA9IHsKLQl7ImVuY29kZSIsCShQeUNGdW5jdGlvbilNdWx0aWJ5dGVDb2RlY19FbmNvZGUsCi0JCQlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCQkJTXVsdGlieXRlQ29kZWNfRW5jb2RlX19kb2NfX30sCi0JeyJkZWNvZGUiLAkoUHlDRnVuY3Rpb24pTXVsdGlieXRlQ29kZWNfRGVjb2RlLAotCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkJCU11bHRpYnl0ZUNvZGVjX0RlY29kZV9fZG9jX199LAotCXtOVUxMLAkJTlVMTH0sCisgICAgeyJlbmNvZGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pTXVsdGlieXRlQ29kZWNfRW5jb2RlLAorICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICBNdWx0aWJ5dGVDb2RlY19FbmNvZGVfX2RvY19ffSwKKyAgICB7ImRlY29kZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilNdWx0aWJ5dGVDb2RlY19EZWNvZGUsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgIE11bHRpYnl0ZUNvZGVjX0RlY29kZV9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgdm9pZAogbXVsdGlieXRlY29kZWNfZGVhbGxvYyhNdWx0aWJ5dGVDb2RlY09iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE11bHRpYnl0ZUNvZGVjX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIk11bHRpYnl0ZUNvZGVjIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoTXVsdGlieXRlQ29kZWNPYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciltdWx0aWJ5dGVjb2RlY19kZWFsbG9jLCAvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCS8qIHRwX2ZsYWdzICovCi0JMCwJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcmV4dCAqLwotCW11bHRpYnl0ZWNvZGVjX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIk11bHRpYnl0ZUNvZGVjIiwgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihNdWx0aWJ5dGVDb2RlY09iamVjdCksICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKW11bHRpYnl0ZWNvZGVjX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJleHQgKi8KKyAgICBtdWx0aWJ5dGVjb2RlY19tZXRob2RzLCAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiB9OwogCiAKQEAgLTcyNCwxNTAgKzcyNCwxNTAgQEAKICAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBzdGF0ZWZ1bCBjb2RlYyBtZWNoYW5pc20KICAqLwogCi0jZGVmaW5lIFNUQVRFRlVMX0RDVFgobykJKChNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0ICopKG8pKQotI2RlZmluZSBTVEFURUZVTF9FQ1RYKG8pCSgoTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyQ29udGV4dCAqKShvKSkKKyNkZWZpbmUgU1RBVEVGVUxfRENUWChvKSAgICAgICAgKChNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0ICopKG8pKQorI2RlZmluZSBTVEFURUZVTF9FQ1RYKG8pICAgICAgICAoKE11bHRpYnl0ZVN0YXRlZnVsRW5jb2RlckNvbnRleHQgKikobykpCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlbmNvZGVyX2VuY29kZV9zdGF0ZWZ1bChNdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJDb250ZXh0ICpjdHgsCi0JCQlQeU9iamVjdCAqdW5pc3RyLCBpbnQgZmluYWwpCisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdW5pc3RyLCBpbnQgZmluYWwpCiB7Ci0JUHlPYmplY3QgKnVjdnQsICpyID0gTlVMTDsKLQlQeV9VTklDT0RFICppbmJ1ZiwgKmluYnVmX2VuZCwgKmluYnVmX3RtcCA9IE5VTEw7Ci0JUHlfc3NpemVfdCBkYXRhbGVuLCBvcmlncGVuZGluZzsKKyAgICBQeU9iamVjdCAqdWN2dCwgKnIgPSBOVUxMOworICAgIFB5X1VOSUNPREUgKmluYnVmLCAqaW5idWZfZW5kLCAqaW5idWZfdG1wID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGRhdGFsZW4sIG9yaWdwZW5kaW5nOwogCi0JaWYgKFB5VW5pY29kZV9DaGVjayh1bmlzdHIpKQotCQl1Y3Z0ID0gTlVMTDsKLQllbHNlIHsKLQkJdW5pc3RyID0gdWN2dCA9IFB5T2JqZWN0X1VuaWNvZGUodW5pc3RyKTsKLQkJaWYgKHVuaXN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodW5pc3RyKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY291bGRuJ3QgY29udmVydCB0aGUgb2JqZWN0IHRvIHVuaWNvZGUuIik7Ci0JCQlQeV9ERUNSRUYodWN2dCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHVuaXN0cikpCisgICAgICAgIHVjdnQgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICB1bmlzdHIgPSB1Y3Z0ID0gUHlPYmplY3RfVW5pY29kZSh1bmlzdHIpOworICAgICAgICBpZiAodW5pc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayh1bmlzdHIpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJjb3VsZG4ndCBjb252ZXJ0IHRoZSBvYmplY3QgdG8gdW5pY29kZS4iKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1Y3Z0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JZGF0YWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh1bmlzdHIpOwotCW9yaWdwZW5kaW5nID0gY3R4LT5wZW5kaW5nc2l6ZTsKKyAgICBkYXRhbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKHVuaXN0cik7CisgICAgb3JpZ3BlbmRpbmcgPSBjdHgtPnBlbmRpbmdzaXplOwogCi0JaWYgKG9yaWdwZW5kaW5nID4gMCkgewotCQlpZiAoZGF0YWxlbiA+IFBZX1NTSVpFX1RfTUFYIC0gY3R4LT5wZW5kaW5nc2l6ZSkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCS8qIGluYnVmX3RtcCA9PSBOVUxMICovCi0JCQlnb3RvIGVycm9yZXhpdDsKLQkJfQotCQlpbmJ1Zl90bXAgPSBQeU1lbV9OZXcoUHlfVU5JQ09ERSwgZGF0YWxlbiArIGN0eC0+cGVuZGluZ3NpemUpOwotCQlpZiAoaW5idWZfdG1wID09IE5VTEwpCi0JCQlnb3RvIGVycm9yZXhpdDsKLQkJbWVtY3B5KGluYnVmX3RtcCwgY3R4LT5wZW5kaW5nLAotCQkJUHlfVU5JQ09ERV9TSVpFICogY3R4LT5wZW5kaW5nc2l6ZSk7Ci0JCW1lbWNweShpbmJ1Zl90bXAgKyBjdHgtPnBlbmRpbmdzaXplLAotCQkJUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKSwKLQkJCVB5X1VOSUNPREVfU0laRSAqIGRhdGFsZW4pOwotCQlkYXRhbGVuICs9IGN0eC0+cGVuZGluZ3NpemU7Ci0JCWN0eC0+cGVuZGluZ3NpemUgPSAwOwotCQlpbmJ1ZiA9IGluYnVmX3RtcDsKLQl9Ci0JZWxzZQotCQlpbmJ1ZiA9IChQeV9VTklDT0RFICopUHlVbmljb2RlX0FTX1VOSUNPREUodW5pc3RyKTsKKyAgICBpZiAob3JpZ3BlbmRpbmcgPiAwKSB7CisgICAgICAgIGlmIChkYXRhbGVuID4gUFlfU1NJWkVfVF9NQVggLSBjdHgtPnBlbmRpbmdzaXplKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgLyogaW5idWZfdG1wID09IE5VTEwgKi8KKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgICAgICB9CisgICAgICAgIGluYnVmX3RtcCA9IFB5TWVtX05ldyhQeV9VTklDT0RFLCBkYXRhbGVuICsgY3R4LT5wZW5kaW5nc2l6ZSk7CisgICAgICAgIGlmIChpbmJ1Zl90bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgICAgICBtZW1jcHkoaW5idWZfdG1wLCBjdHgtPnBlbmRpbmcsCisgICAgICAgICAgICBQeV9VTklDT0RFX1NJWkUgKiBjdHgtPnBlbmRpbmdzaXplKTsKKyAgICAgICAgbWVtY3B5KGluYnVmX3RtcCArIGN0eC0+cGVuZGluZ3NpemUsCisgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERSh1bmlzdHIpLAorICAgICAgICAgICAgUHlfVU5JQ09ERV9TSVpFICogZGF0YWxlbik7CisgICAgICAgIGRhdGFsZW4gKz0gY3R4LT5wZW5kaW5nc2l6ZTsKKyAgICAgICAgY3R4LT5wZW5kaW5nc2l6ZSA9IDA7CisgICAgICAgIGluYnVmID0gaW5idWZfdG1wOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGluYnVmID0gKFB5X1VOSUNPREUgKilQeVVuaWNvZGVfQVNfVU5JQ09ERSh1bmlzdHIpOwogCi0JaW5idWZfZW5kID0gaW5idWYgKyBkYXRhbGVuOworICAgIGluYnVmX2VuZCA9IGluYnVmICsgZGF0YWxlbjsKIAotCXIgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoY3R4LT5jb2RlYywgJmN0eC0+c3RhdGUsCi0JCQkoY29uc3QgUHlfVU5JQ09ERSAqKikmaW5idWYsCi0JCQlkYXRhbGVuLCBjdHgtPmVycm9ycywgZmluYWwgPyBNQkVOQ19GTFVTSCA6IDApOwotCWlmIChyID09IE5VTEwpIHsKLQkJLyogcmVjb3ZlciB0aGUgb3JpZ2luYWwgcGVuZGluZyBidWZmZXIgKi8KLQkJaWYgKG9yaWdwZW5kaW5nID4gMCkKLQkJCW1lbWNweShjdHgtPnBlbmRpbmcsIGluYnVmX3RtcCwKLQkJCQlQeV9VTklDT0RFX1NJWkUgKiBvcmlncGVuZGluZyk7Ci0JCWN0eC0+cGVuZGluZ3NpemUgPSBvcmlncGVuZGluZzsKLQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgIHIgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoY3R4LT5jb2RlYywgJmN0eC0+c3RhdGUsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBQeV9VTklDT0RFICoqKSZpbmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgZGF0YWxlbiwgY3R4LT5lcnJvcnMsIGZpbmFsID8gTUJFTkNfRkxVU0ggOiAwKTsKKyAgICBpZiAociA9PSBOVUxMKSB7CisgICAgICAgIC8qIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBlbmRpbmcgYnVmZmVyICovCisgICAgICAgIGlmIChvcmlncGVuZGluZyA+IDApCisgICAgICAgICAgICBtZW1jcHkoY3R4LT5wZW5kaW5nLCBpbmJ1Zl90bXAsCisgICAgICAgICAgICAgICAgUHlfVU5JQ09ERV9TSVpFICogb3JpZ3BlbmRpbmcpOworICAgICAgICBjdHgtPnBlbmRpbmdzaXplID0gb3JpZ3BlbmRpbmc7CisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIH0KIAotCWlmIChpbmJ1ZiA8IGluYnVmX2VuZCkgewotCQljdHgtPnBlbmRpbmdzaXplID0gKFB5X3NzaXplX3QpKGluYnVmX2VuZCAtIGluYnVmKTsKLQkJaWYgKGN0eC0+cGVuZGluZ3NpemUgPiBNQVhFTkNQRU5ESU5HKSB7Ci0JCQkvKiBub3JtYWwgY29kZWNzIGNhbid0IHJlYWNoIGhlcmUgKi8KLQkJCWN0eC0+cGVuZGluZ3NpemUgPSAwOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuaWNvZGVFcnJvciwKLQkJCQkJInBlbmRpbmcgYnVmZmVyIG92ZXJmbG93Iik7Ci0JCQlnb3RvIGVycm9yZXhpdDsKLQkJfQotCQltZW1jcHkoY3R4LT5wZW5kaW5nLCBpbmJ1ZiwKLQkJCWN0eC0+cGVuZGluZ3NpemUgKiBQeV9VTklDT0RFX1NJWkUpOwotCX0KKyAgICBpZiAoaW5idWYgPCBpbmJ1Zl9lbmQpIHsKKyAgICAgICAgY3R4LT5wZW5kaW5nc2l6ZSA9IChQeV9zc2l6ZV90KShpbmJ1Zl9lbmQgLSBpbmJ1Zik7CisgICAgICAgIGlmIChjdHgtPnBlbmRpbmdzaXplID4gTUFYRU5DUEVORElORykgeworICAgICAgICAgICAgLyogbm9ybWFsIGNvZGVjcyBjYW4ndCByZWFjaCBoZXJlICovCisgICAgICAgICAgICBjdHgtPnBlbmRpbmdzaXplID0gMDsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Vbmljb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlbmRpbmcgYnVmZmVyIG92ZXJmbG93Iik7CisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3R4LT5wZW5kaW5nLCBpbmJ1ZiwKKyAgICAgICAgICAgIGN0eC0+cGVuZGluZ3NpemUgKiBQeV9VTklDT0RFX1NJWkUpOworICAgIH0KIAotCWlmIChpbmJ1Zl90bXAgIT0gTlVMTCkKLQkJUHlNZW1fRGVsKGluYnVmX3RtcCk7Ci0JUHlfWERFQ1JFRih1Y3Z0KTsKLQlyZXR1cm4gcjsKKyAgICBpZiAoaW5idWZfdG1wICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0RlbChpbmJ1Zl90bXApOworICAgIFB5X1hERUNSRUYodWN2dCk7CisgICAgcmV0dXJuIHI7CiAKIGVycm9yZXhpdDoKLQlpZiAoaW5idWZfdG1wICE9IE5VTEwpCi0JCVB5TWVtX0RlbChpbmJ1Zl90bXApOwotCVB5X1hERUNSRUYocik7Ci0JUHlfWERFQ1JFRih1Y3Z0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoaW5idWZfdG1wICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0RlbChpbmJ1Zl90bXApOworICAgIFB5X1hERUNSRUYocik7CisgICAgUHlfWERFQ1JFRih1Y3Z0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogZGVjb2Rlcl9hcHBlbmRfcGVuZGluZyhNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0ICpjdHgsCi0JCSAgICAgICBNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgKmJ1ZikKKyAgICAgICAgICAgICAgICAgICAgICAgTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYpCiB7Ci0JUHlfc3NpemVfdCBucGVuZGluZ3M7CisgICAgUHlfc3NpemVfdCBucGVuZGluZ3M7CiAKLQlucGVuZGluZ3MgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKLQlpZiAobnBlbmRpbmdzICsgY3R4LT5wZW5kaW5nc2l6ZSA+IE1BWERFQ1BFTkRJTkcgfHwKLQkJbnBlbmRpbmdzID4gUFlfU1NJWkVfVF9NQVggLSBjdHgtPnBlbmRpbmdzaXplKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVW5pY29kZUVycm9yLCAicGVuZGluZyBidWZmZXIgb3ZlcmZsb3ciKTsKLQkJCXJldHVybiAtMTsKLQl9Ci0JbWVtY3B5KGN0eC0+cGVuZGluZyArIGN0eC0+cGVuZGluZ3NpemUsIGJ1Zi0+aW5idWYsIG5wZW5kaW5ncyk7Ci0JY3R4LT5wZW5kaW5nc2l6ZSArPSBucGVuZGluZ3M7Ci0JcmV0dXJuIDA7CisgICAgbnBlbmRpbmdzID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7CisgICAgaWYgKG5wZW5kaW5ncyArIGN0eC0+cGVuZGluZ3NpemUgPiBNQVhERUNQRU5ESU5HIHx8CisgICAgICAgIG5wZW5kaW5ncyA+IFBZX1NTSVpFX1RfTUFYIC0gY3R4LT5wZW5kaW5nc2l6ZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1VuaWNvZGVFcnJvciwgInBlbmRpbmcgYnVmZmVyIG92ZXJmbG93Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbWNweShjdHgtPnBlbmRpbmcgKyBjdHgtPnBlbmRpbmdzaXplLCBidWYtPmluYnVmLCBucGVuZGluZ3MpOworICAgIGN0eC0+cGVuZGluZ3NpemUgKz0gbnBlbmRpbmdzOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmLCBjb25zdCBjaGFyICpkYXRhLAotCQkgICAgICAgUHlfc3NpemVfdCBzaXplKQorICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JYnVmLT5pbmJ1ZiA9IGJ1Zi0+aW5idWZfdG9wID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilkYXRhOwotCWJ1Zi0+aW5idWZfZW5kID0gYnVmLT5pbmJ1Zl90b3AgKyBzaXplOwotCWlmIChidWYtPm91dG9iaiA9PSBOVUxMKSB7IC8qIG9ubHkgaWYgb3V0b2JqIGlzIG5vdCBhbGxvY2F0ZWQgeWV0ICovCi0JCWJ1Zi0+b3V0b2JqID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHNpemUpOwotCQlpZiAoYnVmLT5vdXRvYmogPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJYnVmLT5vdXRidWYgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYtPm91dG9iaik7Ci0JCWJ1Zi0+b3V0YnVmX2VuZCA9IGJ1Zi0+b3V0YnVmICsKLQkJCQkgIFB5VW5pY29kZV9HRVRfU0laRShidWYtPm91dG9iaik7Ci0JfQorICAgIGJ1Zi0+aW5idWYgPSBidWYtPmluYnVmX3RvcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopZGF0YTsKKyAgICBidWYtPmluYnVmX2VuZCA9IGJ1Zi0+aW5idWZfdG9wICsgc2l6ZTsKKyAgICBpZiAoYnVmLT5vdXRvYmogPT0gTlVMTCkgeyAvKiBvbmx5IGlmIG91dG9iaiBpcyBub3QgYWxsb2NhdGVkIHlldCAqLworICAgICAgICBidWYtPm91dG9iaiA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBzaXplKTsKKyAgICAgICAgaWYgKGJ1Zi0+b3V0b2JqID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJ1Zi0+b3V0YnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLT5vdXRvYmopOworICAgICAgICBidWYtPm91dGJ1Zl9lbmQgPSBidWYtPm91dGJ1ZiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShidWYtPm91dG9iaik7CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGRlY29kZXJfZmVlZF9idWZmZXIoTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyQ29udGV4dCAqY3R4LAotCQkgICAgTXVsdGlieXRlRGVjb2RlQnVmZmVyICpidWYpCisgICAgICAgICAgICAgICAgICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciAqYnVmKQogewotCXdoaWxlIChidWYtPmluYnVmIDwgYnVmLT5pbmJ1Zl9lbmQpIHsKLQkJUHlfc3NpemVfdCBpbmxlZnQsIG91dGxlZnQ7Ci0JCVB5X3NzaXplX3QgcjsKKyAgICB3aGlsZSAoYnVmLT5pbmJ1ZiA8IGJ1Zi0+aW5idWZfZW5kKSB7CisgICAgICAgIFB5X3NzaXplX3QgaW5sZWZ0LCBvdXRsZWZ0OworICAgICAgICBQeV9zc2l6ZV90IHI7CiAKLQkJaW5sZWZ0ID0gKFB5X3NzaXplX3QpKGJ1Zi0+aW5idWZfZW5kIC0gYnVmLT5pbmJ1Zik7Ci0JCW91dGxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLT5vdXRidWZfZW5kIC0gYnVmLT5vdXRidWYpOworICAgICAgICBpbmxlZnQgPSAoUHlfc3NpemVfdCkoYnVmLT5pbmJ1Zl9lbmQgLSBidWYtPmluYnVmKTsKKyAgICAgICAgb3V0bGVmdCA9IChQeV9zc2l6ZV90KShidWYtPm91dGJ1Zl9lbmQgLSBidWYtPm91dGJ1Zik7CiAKLQkJciA9IGN0eC0+Y29kZWMtPmRlY29kZSgmY3R4LT5zdGF0ZSwgY3R4LT5jb2RlYy0+Y29uZmlnLAotCQkJJmJ1Zi0+aW5idWYsIGlubGVmdCwgJmJ1Zi0+b3V0YnVmLCBvdXRsZWZ0KTsKLQkJaWYgKHIgPT0gMCB8fCByID09IE1CRVJSX1RPT0ZFVykKLQkJCWJyZWFrOwotCQllbHNlIGlmIChtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihjdHgtPmNvZGVjLCAmY3R4LT5zdGF0ZSwKLQkJCQkJCSBidWYsIGN0eC0+ZXJyb3JzLCByKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIHIgPSBjdHgtPmNvZGVjLT5kZWNvZGUoJmN0eC0+c3RhdGUsIGN0eC0+Y29kZWMtPmNvbmZpZywKKyAgICAgICAgICAgICZidWYtPmluYnVmLCBpbmxlZnQsICZidWYtPm91dGJ1Ziwgb3V0bGVmdCk7CisgICAgICAgIGlmIChyID09IDAgfHwgciA9PSBNQkVSUl9UT09GRVcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZSBpZiAobXVsdGlieXRlY29kZWNfZGVjZXJyb3IoY3R4LT5jb2RlYywgJmN0eC0+c3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgY3R4LT5lcnJvcnMsIHIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC04NzcsMTQyICs4NzcsMTQyIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYmllbmNvZGVyX2VuY29kZShNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYsCi0JCSAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLQlQeU9iamVjdCAqZGF0YTsKLQlpbnQgZmluYWwgPSAwOworICAgIFB5T2JqZWN0ICpkYXRhOworICAgIGludCBmaW5hbCA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfGk6ZW5jb2RlIiwKLQkJCWluY3JlbWVudGFsa3dhcmdsaXN0LCAmZGF0YSwgJmZpbmFsKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xpOmVuY29kZSIsCisgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudGFsa3dhcmdsaXN0LCAmZGF0YSwgJmZpbmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoU1RBVEVGVUxfRUNUWChzZWxmKSwgZGF0YSwgZmluYWwpOworICAgIHJldHVybiBlbmNvZGVyX2VuY29kZV9zdGF0ZWZ1bChTVEFURUZVTF9FQ1RYKHNlbGYpLCBkYXRhLCBmaW5hbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYmllbmNvZGVyX3Jlc2V0KE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+Y29kZWMtPmRlY3Jlc2V0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmRlY3Jlc2V0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIGlmIChzZWxmLT5jb2RlYy0+ZGVjcmVzZXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZGVjcmVzZXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYmllbmNvZGVyX21ldGhvZHNbXSA9IHsKLQl7ImVuY29kZSIsCShQeUNGdW5jdGlvbiltYmllbmNvZGVyX2VuY29kZSwKLQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIE5VTEx9LAotCXsicmVzZXQiLAkoUHlDRnVuY3Rpb24pbWJpZW5jb2Rlcl9yZXNldCwKLQkJCU1FVEhfTk9BUkdTLCBOVUxMfSwKLQl7TlVMTCwJCU5VTEx9LAorICAgIHsiZW5jb2RlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW1iaWVuY29kZXJfZW5jb2RlLAorICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBOVUxMfSwKKyAgICB7InJlc2V0IiwgICAgICAgICAgIChQeUNGdW5jdGlvbiltYmllbmNvZGVyX3Jlc2V0LAorICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgTlVMTH0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYmllbmNvZGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKmNvZGVjID0gTlVMTDsKLQljaGFyICplcnJvcnMgPSBOVUxMOworICAgIE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqY29kZWMgPSBOVUxMOworICAgIGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifHM6SW5jcmVtZW50YWxFbmNvZGVyIiwKLQkJCQkJIGluY25ld2t3YXJnbGlzdCwgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8czpJbmNyZW1lbnRhbEVuY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY25ld2t3YXJnbGlzdCwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZWxmID0gKE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOwotCWlmIChjb2RlYyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBjb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopdHlwZSwgImNvZGVjIik7CisgICAgaWYgKGNvZGVjID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGlmICghTXVsdGlieXRlQ29kZWNfQ2hlY2soY29kZWMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBpcyB1bmV4cGVjdGVkIHR5cGUiKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQogCi0Jc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKLQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7Ci0Jc2VsZi0+ZXJyb3JzID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKLQlpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCWlmIChzZWxmLT5jb2RlYy0+ZW5jaW5pdCAhPSBOVUxMICYmCi0JICAgIHNlbGYtPmNvZGVjLT5lbmNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKLQkJZ290byBlcnJvcmV4aXQ7CisgICAgc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKKyAgICBzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisgICAgc2VsZi0+ZXJyb3JzID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKKyAgICBpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGlmIChzZWxmLT5jb2RlYy0+ZW5jaW5pdCAhPSBOVUxMICYmCisgICAgICAgIHNlbGYtPmNvZGVjLT5lbmNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeV9ERUNSRUYoY29kZWMpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIFB5X0RFQ1JFRihjb2RlYyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiAKIGVycm9yZXhpdDoKLQlQeV9YREVDUkVGKHNlbGYpOwotCVB5X1hERUNSRUYoY29kZWMpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYoc2VsZik7CisgICAgUHlfWERFQ1JFRihjb2RlYyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIG1iaWVuY29kZXJfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBtYmllbmNvZGVyX3RyYXZlcnNlKE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdCAqc2VsZiwKLQkJICAgIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQorICAgICAgICAgICAgICAgICAgICB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpZiAoRVJST1JfSVNDVVNUT00oc2VsZi0+ZXJyb3JzKSkKLQkJUHlfVklTSVQoc2VsZi0+ZXJyb3JzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoRVJST1JfSVNDVVNUT00oc2VsZi0+ZXJyb3JzKSkKKyAgICAgICAgUHlfVklTSVQoc2VsZi0+ZXJyb3JzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIG1iaWVuY29kZXJfZGVhbGxvYyhNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKLQlFUlJPUl9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyIiwJLyogdHBfbmFtZSAqLwotCXNpemVvZihNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJPYmplY3QpLCAvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qICBtZXRob2RzICAqLwotCShkZXN0cnVjdG9yKW1iaWVuY29kZXJfZGVhbGxvYywgLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKLQkJfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCTAsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpbWJpZW5jb2Rlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcmV4dCAqLwotCW1iaWVuY29kZXJfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JY29kZWNjdHhfZ2V0c2V0cywJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCW1iaWVuY29kZXJfaW5pdCwJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCW1iaWVuY29kZXJfbmV3LAkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIiLCAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiAgbWV0aG9kcyAgKi8KKyAgICAoZGVzdHJ1Y3RvciltYmllbmNvZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKKyAgICAgICAgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbWJpZW5jb2Rlcl90cmF2ZXJzZSwgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcmV4dCAqLworICAgIG1iaWVuY29kZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgY29kZWNjdHhfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgbWJpZW5jb2Rlcl9pbml0LCAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgbWJpZW5jb2Rlcl9uZXcsICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAKQEAgLTEwMjIsMjA2ICsxMDIyLDIwNiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJpZGVjb2Rlcl9kZWNvZGUoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0ICpzZWxmLAotCQkgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7Ci0JTXVsdGlieXRlRGVjb2RlQnVmZmVyIGJ1ZjsKLQljaGFyICpkYXRhLCAqd2RhdGEgPSBOVUxMOwotCVB5X2J1ZmZlciBwZGF0YTsKLQlQeV9zc2l6ZV90IHdzaXplLCBmaW5hbHNpemUgPSAwLCBzaXplLCBvcmlncGVuZGluZzsKLQlpbnQgZmluYWwgPSAwOworICAgIE11bHRpYnl0ZURlY29kZUJ1ZmZlciBidWY7CisgICAgY2hhciAqZGF0YSwgKndkYXRhID0gTlVMTDsKKyAgICBQeV9idWZmZXIgcGRhdGE7CisgICAgUHlfc3NpemVfdCB3c2l6ZSwgZmluYWxzaXplID0gMCwgc2l6ZSwgb3JpZ3BlbmRpbmc7CisgICAgaW50IGZpbmFsID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInMqfGk6ZGVjb2RlIiwKLQkJCWluY3JlbWVudGFsa3dhcmdsaXN0LCAmcGRhdGEsICZmaW5hbCkpCi0JCXJldHVybiBOVUxMOwotCWRhdGEgPSBwZGF0YS5idWY7Ci0Jc2l6ZSA9IHBkYXRhLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzKnxpOmRlY29kZSIsCisgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudGFsa3dhcmdsaXN0LCAmcGRhdGEsICZmaW5hbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGEgPSBwZGF0YS5idWY7CisgICAgc2l6ZSA9IHBkYXRhLmxlbjsKIAotCWJ1Zi5vdXRvYmogPSBidWYuZXhjb2JqID0gTlVMTDsKLQlvcmlncGVuZGluZyA9IHNlbGYtPnBlbmRpbmdzaXplOworICAgIGJ1Zi5vdXRvYmogPSBidWYuZXhjb2JqID0gTlVMTDsKKyAgICBvcmlncGVuZGluZyA9IHNlbGYtPnBlbmRpbmdzaXplOwogCi0JaWYgKHNlbGYtPnBlbmRpbmdzaXplID09IDApIHsKLQkJd3NpemUgPSBzaXplOwotCQl3ZGF0YSA9IGRhdGE7Ci0JfQotCWVsc2UgewotCQlpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2VsZi0+cGVuZGluZ3NpemUpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlnb3RvIGVycm9yZXhpdDsKLQkJfQotCQl3c2l6ZSA9IHNpemUgKyBzZWxmLT5wZW5kaW5nc2l6ZTsKLQkJd2RhdGEgPSBQeU1lbV9NYWxsb2Mod3NpemUpOwotCQlpZiAod2RhdGEgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JleGl0OwotCQltZW1jcHkod2RhdGEsIHNlbGYtPnBlbmRpbmcsIHNlbGYtPnBlbmRpbmdzaXplKTsKLQkJbWVtY3B5KHdkYXRhICsgc2VsZi0+cGVuZGluZ3NpemUsIGRhdGEsIHNpemUpOwotCQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7Ci0JfQorICAgIGlmIChzZWxmLT5wZW5kaW5nc2l6ZSA9PSAwKSB7CisgICAgICAgIHdzaXplID0gc2l6ZTsKKyAgICAgICAgd2RhdGEgPSBkYXRhOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIHNlbGYtPnBlbmRpbmdzaXplKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgd3NpemUgPSBzaXplICsgc2VsZi0+cGVuZGluZ3NpemU7CisgICAgICAgIHdkYXRhID0gUHlNZW1fTWFsbG9jKHdzaXplKTsKKyAgICAgICAgaWYgKHdkYXRhID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgbWVtY3B5KHdkYXRhLCBzZWxmLT5wZW5kaW5nLCBzZWxmLT5wZW5kaW5nc2l6ZSk7CisgICAgICAgIG1lbWNweSh3ZGF0YSArIHNlbGYtPnBlbmRpbmdzaXplLCBkYXRhLCBzaXplKTsKKyAgICAgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIH0KIAotCWlmIChkZWNvZGVyX3ByZXBhcmVfYnVmZmVyKCZidWYsIHdkYXRhLCB3c2l6ZSkgIT0gMCkKLQkJZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKGRlY29kZXJfcHJlcGFyZV9idWZmZXIoJmJ1Ziwgd2RhdGEsIHdzaXplKSAhPSAwKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCWlmIChkZWNvZGVyX2ZlZWRfYnVmZmVyKFNUQVRFRlVMX0RDVFgoc2VsZiksICZidWYpKQotCQlnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoZGVjb2Rlcl9mZWVkX2J1ZmZlcihTVEFURUZVTF9EQ1RYKHNlbGYpLCAmYnVmKSkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlpZiAoZmluYWwgJiYgYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgewotCQlpZiAobXVsdGlieXRlY29kZWNfZGVjZXJyb3Ioc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKLQkJCQkmYnVmLCBzZWxmLT5lcnJvcnMsIE1CRVJSX1RPT0ZFVykpIHsKLQkJCS8qIHJlY292ZXIgdGhlIG9yaWdpbmFsIHBlbmRpbmcgYnVmZmVyICovCi0JCQltZW1jcHkoc2VsZi0+cGVuZGluZywgd2RhdGEsIG9yaWdwZW5kaW5nKTsKLQkJCXNlbGYtPnBlbmRpbmdzaXplID0gb3JpZ3BlbmRpbmc7Ci0JCQlnb3RvIGVycm9yZXhpdDsKLQkJfQotCX0KKyAgICBpZiAoZmluYWwgJiYgYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeworICAgICAgICBpZiAobXVsdGlieXRlY29kZWNfZGVjZXJyb3Ioc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZidWYsIHNlbGYtPmVycm9ycywgTUJFUlJfVE9PRkVXKSkgeworICAgICAgICAgICAgLyogcmVjb3ZlciB0aGUgb3JpZ2luYWwgcGVuZGluZyBidWZmZXIgKi8KKyAgICAgICAgICAgIG1lbWNweShzZWxmLT5wZW5kaW5nLCB3ZGF0YSwgb3JpZ3BlbmRpbmcpOworICAgICAgICAgICAgc2VsZi0+cGVuZGluZ3NpemUgPSBvcmlncGVuZGluZzsKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgICAgICB9CisgICAgfQogCi0JaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQpIHsgLyogcGVuZGluZyBzZXF1ZW5jZSBzdGlsbCBleGlzdHMgKi8KLQkJaWYgKGRlY29kZXJfYXBwZW5kX3BlbmRpbmcoU1RBVEVGVUxfRENUWChzZWxmKSwgJmJ1ZikgIT0gMCkKLQkJCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBpZiAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeyAvKiBwZW5kaW5nIHNlcXVlbmNlIHN0aWxsIGV4aXN0cyAqLworICAgICAgICBpZiAoZGVjb2Rlcl9hcHBlbmRfcGVuZGluZyhTVEFURUZVTF9EQ1RYKHNlbGYpLCAmYnVmKSAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQogCi0JZmluYWxzaXplID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWYgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYub3V0b2JqKSk7Ci0JaWYgKGZpbmFsc2l6ZSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaikpCi0JCWlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgZmluYWxzaXplID0gKFB5X3NzaXplX3QpKGJ1Zi5vdXRidWYgLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYub3V0b2JqKSk7CisgICAgaWYgKGZpbmFsc2l6ZSAhPSBQeVVuaWNvZGVfR0VUX1NJWkUoYnVmLm91dG9iaikpCisgICAgICAgIGlmIChQeVVuaWNvZGVfUmVzaXplKCZidWYub3V0b2JqLCBmaW5hbHNpemUpID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7Ci0JaWYgKHdkYXRhICE9IGRhdGEpCi0JCVB5TWVtX0RlbCh3ZGF0YSk7Ci0JUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKLQlyZXR1cm4gYnVmLm91dG9iajsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgaWYgKHdkYXRhICE9IGRhdGEpCisgICAgICAgIFB5TWVtX0RlbCh3ZGF0YSk7CisgICAgUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKKyAgICByZXR1cm4gYnVmLm91dG9iajsKIAogZXJyb3JleGl0OgotCVB5QnVmZmVyX1JlbGVhc2UoJnBkYXRhKTsKLQlpZiAod2RhdGEgIT0gTlVMTCAmJiB3ZGF0YSAhPSBkYXRhKQotCQlQeU1lbV9EZWwod2RhdGEpOwotCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7Ci0JUHlfWERFQ1JFRihidWYub3V0b2JqKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwZGF0YSk7CisgICAgaWYgKHdkYXRhICE9IE5VTEwgJiYgd2RhdGEgIT0gZGF0YSkKKyAgICAgICAgUHlNZW1fRGVsKHdkYXRhKTsKKyAgICBQeV9YREVDUkVGKGJ1Zi5leGNvYmopOworICAgIFB5X1hERUNSRUYoYnVmLm91dG9iaik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYmlkZWNvZGVyX3Jlc2V0KE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+Y29kZWMtPmRlY3Jlc2V0ICE9IE5VTEwgJiYKLQkgICAgc2VsZi0+Y29kZWMtPmRlY3Jlc2V0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIGlmIChzZWxmLT5jb2RlYy0+ZGVjcmVzZXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZGVjcmVzZXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYmlkZWNvZGVyX21ldGhvZHNbXSA9IHsKLQl7ImRlY29kZSIsCShQeUNGdW5jdGlvbiltYmlkZWNvZGVyX2RlY29kZSwKLQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIE5VTEx9LAotCXsicmVzZXQiLAkoUHlDRnVuY3Rpb24pbWJpZGVjb2Rlcl9yZXNldCwKLQkJCU1FVEhfTk9BUkdTLCBOVUxMfSwKLQl7TlVMTCwJCU5VTEx9LAorICAgIHsiZGVjb2RlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW1iaWRlY29kZXJfZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBOVUxMfSwKKyAgICB7InJlc2V0IiwgICAgICAgICAgIChQeUNGdW5jdGlvbiltYmlkZWNvZGVyX3Jlc2V0LAorICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgTlVMTH0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYmlkZWNvZGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKmNvZGVjID0gTlVMTDsKLQljaGFyICplcnJvcnMgPSBOVUxMOworICAgIE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqY29kZWMgPSBOVUxMOworICAgIGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifHM6SW5jcmVtZW50YWxEZWNvZGVyIiwKLQkJCQkJIGluY25ld2t3YXJnbGlzdCwgJmVycm9ycykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8czpJbmNyZW1lbnRhbERlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY25ld2t3YXJnbGlzdCwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZWxmID0gKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOwotCWlmIChjb2RlYyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBjb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopdHlwZSwgImNvZGVjIik7CisgICAgaWYgKGNvZGVjID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGlmICghTXVsdGlieXRlQ29kZWNfQ2hlY2soY29kZWMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBpcyB1bmV4cGVjdGVkIHR5cGUiKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQogCi0Jc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKLQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7Ci0Jc2VsZi0+ZXJyb3JzID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKLQlpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCWlmIChzZWxmLT5jb2RlYy0+ZGVjaW5pdCAhPSBOVUxMICYmCi0JICAgIHNlbGYtPmNvZGVjLT5kZWNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKLQkJZ290byBlcnJvcmV4aXQ7CisgICAgc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKKyAgICBzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisgICAgc2VsZi0+ZXJyb3JzID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKKyAgICBpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGlmIChzZWxmLT5jb2RlYy0+ZGVjaW5pdCAhPSBOVUxMICYmCisgICAgICAgIHNlbGYtPmNvZGVjLT5kZWNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQlQeV9ERUNSRUYoY29kZWMpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIFB5X0RFQ1JFRihjb2RlYyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiAKIGVycm9yZXhpdDoKLQlQeV9YREVDUkVGKHNlbGYpOwotCVB5X1hERUNSRUYoY29kZWMpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYoc2VsZik7CisgICAgUHlfWERFQ1JFRihjb2RlYyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIG1iaWRlY29kZXJfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBtYmlkZWNvZGVyX3RyYXZlcnNlKE11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlck9iamVjdCAqc2VsZiwKLQkJICAgIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQorICAgICAgICAgICAgICAgICAgICB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlpZiAoRVJST1JfSVNDVVNUT00oc2VsZi0+ZXJyb3JzKSkKLQkJUHlfVklTSVQoc2VsZi0+ZXJyb3JzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoRVJST1JfSVNDVVNUT00oc2VsZi0+ZXJyb3JzKSkKKyAgICAgICAgUHlfVklTSVQoc2VsZi0+ZXJyb3JzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIG1iaWRlY29kZXJfZGVhbGxvYyhNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKLQlFUlJPUl9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyIiwJLyogdHBfbmFtZSAqLwotCXNpemVvZihNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3QpLCAvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qICBtZXRob2RzICAqLwotCShkZXN0cnVjdG9yKW1iaWRlY29kZXJfZGVhbGxvYywgLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKLQkJfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCTAsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpbWJpZGVjb2Rlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcmV4dCAqLwotCW1iaWRlY29kZXJfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JY29kZWNjdHhfZ2V0c2V0cywJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCW1iaWRlY29kZXJfaW5pdCwJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCW1iaWRlY29kZXJfbmV3LAkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIiLCAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyT2JqZWN0KSwgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiAgbWV0aG9kcyAgKi8KKyAgICAoZGVzdHJ1Y3RvciltYmlkZWNvZGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKKyAgICAgICAgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbWJpZGVjb2Rlcl90cmF2ZXJzZSwgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcmV4dCAqLworICAgIG1iaWRlY29kZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgY29kZWNjdHhfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgbWJpZGVjb2Rlcl9pbml0LCAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgbWJpZGVjb2Rlcl9uZXcsICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAKQEAgLTEyMzEsMzE3ICsxMjMxLDMxNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJzdHJlYW1yZWFkZXJfaXJlYWQoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmLAotCQkgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCwgUHlfc3NpemVfdCBzaXplaGludCkKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCwgUHlfc3NpemVfdCBzaXplaGludCkKIHsKLQlNdWx0aWJ5dGVEZWNvZGVCdWZmZXIgYnVmOwotCVB5T2JqZWN0ICpjcmVzOwotCVB5X3NzaXplX3QgcnNpemUsIGZpbmFsc2l6ZSA9IDA7CisgICAgTXVsdGlieXRlRGVjb2RlQnVmZmVyIGJ1ZjsKKyAgICBQeU9iamVjdCAqY3JlczsKKyAgICBQeV9zc2l6ZV90IHJzaXplLCBmaW5hbHNpemUgPSAwOwogCi0JaWYgKHNpemVoaW50ID09IDApCi0JCXJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCk7CisgICAgaWYgKHNpemVoaW50ID09IDApCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgMCk7CiAKLQlidWYub3V0b2JqID0gYnVmLmV4Y29iaiA9IE5VTEw7Ci0JY3JlcyA9IE5VTEw7CisgICAgYnVmLm91dG9iaiA9IGJ1Zi5leGNvYmogPSBOVUxMOworICAgIGNyZXMgPSBOVUxMOwogCi0JZm9yICg7OykgewotCQlpbnQgZW5kb2ZmaWxlOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGVuZG9mZmlsZTsKIAotCQlpZiAoc2l6ZWhpbnQgPCAwKQotCQkJY3JlcyA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+c3RyZWFtLAotCQkJCQkoY2hhciAqKW1ldGhvZCwgTlVMTCk7Ci0JCWVsc2UKLQkJCWNyZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPnN0cmVhbSwKLQkJCQkJKGNoYXIgKiltZXRob2QsICJpIiwgc2l6ZWhpbnQpOwotCQlpZiAoY3JlcyA9PSBOVUxMKQotCQkJZ290byBlcnJvcmV4aXQ7CisgICAgICAgIGlmIChzaXplaGludCA8IDApCisgICAgICAgICAgICBjcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltZXRob2QsIE5VTEwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltZXRob2QsICJpIiwgc2l6ZWhpbnQpOworICAgICAgICBpZiAoY3JlcyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQkJaWYgKCFQeVN0cmluZ19DaGVjayhjcmVzKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJInN0cmVhbSBmdW5jdGlvbiByZXR1cm5lZCBhICIKLQkJCQkJIm5vbi1zdHJpbmcgb2JqZWN0Iik7Ci0JCQlnb3RvIGVycm9yZXhpdDsKLQkJfQorICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGNyZXMpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0gZnVuY3Rpb24gcmV0dXJuZWQgYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1zdHJpbmcgb2JqZWN0Iik7CisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgfQogCi0JCWVuZG9mZmlsZSA9IChQeVN0cmluZ19HRVRfU0laRShjcmVzKSA9PSAwKTsKKyAgICAgICAgZW5kb2ZmaWxlID0gKFB5U3RyaW5nX0dFVF9TSVpFKGNyZXMpID09IDApOwogCi0JCWlmIChzZWxmLT5wZW5kaW5nc2l6ZSA+IDApIHsKLQkJCVB5T2JqZWN0ICpjdHI7Ci0JCQljaGFyICpjdHJkYXRhOworICAgICAgICBpZiAoc2VsZi0+cGVuZGluZ3NpemUgPiAwKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqY3RyOworICAgICAgICAgICAgY2hhciAqY3RyZGF0YTsKIAotCQkJaWYgKFB5U3RyaW5nX0dFVF9TSVpFKGNyZXMpID4gUFlfU1NJWkVfVF9NQVggLSBzZWxmLT5wZW5kaW5nc2l6ZSkgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJZ290byBlcnJvcmV4aXQ7Ci0gICAgICAgICAgICB9Ci0JCQlyc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGNyZXMpICsgc2VsZi0+cGVuZGluZ3NpemU7Ci0JCQljdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByc2l6ZSk7Ci0JCQlpZiAoY3RyID09IE5VTEwpCi0JCQkJZ290byBlcnJvcmV4aXQ7Ci0JCQljdHJkYXRhID0gUHlTdHJpbmdfQVNfU1RSSU5HKGN0cik7Ci0JCQltZW1jcHkoY3RyZGF0YSwgc2VsZi0+cGVuZGluZywgc2VsZi0+cGVuZGluZ3NpemUpOwotCQkJbWVtY3B5KGN0cmRhdGEgKyBzZWxmLT5wZW5kaW5nc2l6ZSwKLQkJCQlQeVN0cmluZ19BU19TVFJJTkcoY3JlcyksCi0JCQkJUHlTdHJpbmdfR0VUX1NJWkUoY3JlcykpOwotCQkJUHlfREVDUkVGKGNyZXMpOwotCQkJY3JlcyA9IGN0cjsKLQkJCXNlbGYtPnBlbmRpbmdzaXplID0gMDsKLQkJfQorICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKGNyZXMpID4gUFlfU1NJWkVfVF9NQVggLSBzZWxmLT5wZW5kaW5nc2l6ZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjcmVzKSArIHNlbGYtPnBlbmRpbmdzaXplOworICAgICAgICAgICAgICAgICAgICBjdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgY3RyZGF0YSA9IFB5U3RyaW5nX0FTX1NUUklORyhjdHIpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY3RyZGF0YSwgc2VsZi0+cGVuZGluZywgc2VsZi0+cGVuZGluZ3NpemUpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY3RyZGF0YSArIHNlbGYtPnBlbmRpbmdzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhjcmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShjcmVzKSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgY3JlcyA9IGN0cjsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgICAgICB9CiAKLQkJcnNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjcmVzKTsKLQkJaWYgKGRlY29kZXJfcHJlcGFyZV9idWZmZXIoJmJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKGNyZXMpLAotCQkJCQkgICByc2l6ZSkgIT0gMCkKLQkJCWdvdG8gZXJyb3JleGl0OworICAgICAgICByc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGNyZXMpOworICAgICAgICBpZiAoZGVjb2Rlcl9wcmVwYXJlX2J1ZmZlcigmYnVmLCBQeVN0cmluZ19BU19TVFJJTkcoY3JlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaXplKSAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CiAKLQkJaWYgKHJzaXplID4gMCAmJiBkZWNvZGVyX2ZlZWRfYnVmZmVyKAotCQkJCShNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0ICopc2VsZiwgJmJ1ZikpCi0JCQlnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgaWYgKHJzaXplID4gMCAmJiBkZWNvZGVyX2ZlZWRfYnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgKE11bHRpYnl0ZVN0YXRlZnVsRGVjb2RlckNvbnRleHQgKilzZWxmLCAmYnVmKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JCWlmIChlbmRvZmZpbGUgfHwgc2l6ZWhpbnQgPCAwKSB7Ci0JCQlpZiAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCAmJgotCQkJICAgIG11bHRpYnl0ZWNvZGVjX2RlY2Vycm9yKHNlbGYtPmNvZGVjLCAmc2VsZi0+c3RhdGUsCi0JCQkJCSZidWYsIHNlbGYtPmVycm9ycywgTUJFUlJfVE9PRkVXKSkKLQkJCQlnb3RvIGVycm9yZXhpdDsKLQkJfQorICAgICAgICBpZiAoZW5kb2ZmaWxlIHx8IHNpemVoaW50IDwgMCkgeworICAgICAgICAgICAgaWYgKGJ1Zi5pbmJ1ZiA8IGJ1Zi5pbmJ1Zl9lbmQgJiYKKyAgICAgICAgICAgICAgICBtdWx0aWJ5dGVjb2RlY19kZWNlcnJvcihzZWxmLT5jb2RlYywgJnNlbGYtPnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYsIHNlbGYtPmVycm9ycywgTUJFUlJfVE9PRkVXKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICAgICAgfQogCi0JCWlmIChidWYuaW5idWYgPCBidWYuaW5idWZfZW5kKSB7IC8qIHBlbmRpbmcgc2VxdWVuY2UgZXhpc3RzICovCi0JCQlpZiAoZGVjb2Rlcl9hcHBlbmRfcGVuZGluZyhTVEFURUZVTF9EQ1RYKHNlbGYpLAotCQkJCQkJICAgJmJ1ZikgIT0gMCkKLQkJCQlnb3RvIGVycm9yZXhpdDsKLQkJfQorICAgICAgICBpZiAoYnVmLmluYnVmIDwgYnVmLmluYnVmX2VuZCkgeyAvKiBwZW5kaW5nIHNlcXVlbmNlIGV4aXN0cyAqLworICAgICAgICAgICAgaWYgKGRlY29kZXJfYXBwZW5kX3BlbmRpbmcoU1RBVEVGVUxfRENUWChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYpICE9IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgICAgIH0KIAotCQlmaW5hbHNpemUgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1ZiAtCi0JCQkJUHlVbmljb2RlX0FTX1VOSUNPREUoYnVmLm91dG9iaikpOwotCQlQeV9ERUNSRUYoY3Jlcyk7Ci0JCWNyZXMgPSBOVUxMOworICAgICAgICBmaW5hbHNpemUgPSAoUHlfc3NpemVfdCkoYnVmLm91dGJ1ZiAtCisgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQVNfVU5JQ09ERShidWYub3V0b2JqKSk7CisgICAgICAgIFB5X0RFQ1JFRihjcmVzKTsKKyAgICAgICAgY3JlcyA9IE5VTEw7CiAKLQkJaWYgKHNpemVoaW50IDwgMCB8fCBmaW5hbHNpemUgIT0gMCB8fCByc2l6ZSA9PSAwKQotCQkJYnJlYWs7CisgICAgICAgIGlmIChzaXplaGludCA8IDAgfHwgZmluYWxzaXplICE9IDAgfHwgcnNpemUgPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCXNpemVoaW50ID0gMTsgLyogcmVhZCAxIG1vcmUgYnl0ZSBhbmQgcmV0cnkgKi8KLQl9CisgICAgICAgIHNpemVoaW50ID0gMTsgLyogcmVhZCAxIG1vcmUgYnl0ZSBhbmQgcmV0cnkgKi8KKyAgICB9CiAKLQlpZiAoZmluYWxzaXplICE9IFB5VW5pY29kZV9HRVRfU0laRShidWYub3V0b2JqKSkKLQkJaWYgKFB5VW5pY29kZV9SZXNpemUoJmJ1Zi5vdXRvYmosIGZpbmFsc2l6ZSkgPT0gLTEpCi0JCQlnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoZmluYWxzaXplICE9IFB5VW5pY29kZV9HRVRfU0laRShidWYub3V0b2JqKSkKKyAgICAgICAgaWYgKFB5VW5pY29kZV9SZXNpemUoJmJ1Zi5vdXRvYmosIGZpbmFsc2l6ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCVB5X1hERUNSRUYoY3Jlcyk7Ci0JUHlfWERFQ1JFRihidWYuZXhjb2JqKTsKLQlyZXR1cm4gYnVmLm91dG9iajsKKyAgICBQeV9YREVDUkVGKGNyZXMpOworICAgIFB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisgICAgcmV0dXJuIGJ1Zi5vdXRvYmo7CiAKIGVycm9yZXhpdDoKLQlQeV9YREVDUkVGKGNyZXMpOwotCVB5X1hERUNSRUYoYnVmLmV4Y29iaik7Ci0JUHlfWERFQ1JFRihidWYub3V0b2JqKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGNyZXMpOworICAgIFB5X1hERUNSRUYoYnVmLmV4Y29iaik7CisgICAgUHlfWERFQ1JFRihidWYub3V0b2JqKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtcmVhZGVyX3JlYWQoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc2l6ZW9iaiA9IE5VTEw7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIFB5T2JqZWN0ICpzaXplb2JqID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkIiwgMCwgMSwgJnNpemVvYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkIiwgMCwgMSwgJnNpemVvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzaXplb2JqID09IFB5X05vbmUgfHwgc2l6ZW9iaiA9PSBOVUxMKQotCQlzaXplID0gLTE7Ci0JZWxzZSBpZiAoUHlJbnRfQ2hlY2soc2l6ZW9iaikpCi0JCXNpemUgPSBQeUludF9Bc1NzaXplX3Qoc2l6ZW9iaik7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmcgMSBtdXN0IGJlIGFuIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzaXplb2JqID09IFB5X05vbmUgfHwgc2l6ZW9iaiA9PSBOVUxMKQorICAgICAgICBzaXplID0gLTE7CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2soc2l6ZW9iaikpCisgICAgICAgIHNpemUgPSBQeUludF9Bc1NzaXplX3Qoc2l6ZW9iaik7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmcgMSBtdXN0IGJlIGFuIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG1ic3RyZWFtcmVhZGVyX2lyZWFkKHNlbGYsICJyZWFkIiwgc2l6ZSk7CisgICAgcmV0dXJuIG1ic3RyZWFtcmVhZGVyX2lyZWFkKHNlbGYsICJyZWFkIiwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXJlYWRlcl9yZWFkbGluZShNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpzaXplb2JqID0gTlVMTDsKLQlQeV9zc2l6ZV90IHNpemU7CisgICAgUHlPYmplY3QgKnNpemVvYmogPSBOVUxMOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lIiwgMCwgMSwgJnNpemVvYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZSIsIDAsIDEsICZzaXplb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2l6ZW9iaiA9PSBQeV9Ob25lIHx8IHNpemVvYmogPT0gTlVMTCkKLQkJc2l6ZSA9IC0xOwotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHNpemVvYmopKQotCQlzaXplID0gUHlJbnRfQXNTc2l6ZV90KHNpemVvYmopOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIDEgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2l6ZW9iaiA9PSBQeV9Ob25lIHx8IHNpemVvYmogPT0gTlVMTCkKKyAgICAgICAgc2l6ZSA9IC0xOworICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHNpemVvYmopKQorICAgICAgICBzaXplID0gUHlJbnRfQXNTc2l6ZV90KHNpemVvYmopOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIDEgbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBtYnN0cmVhbXJlYWRlcl9pcmVhZChzZWxmLCAicmVhZGxpbmUiLCBzaXplKTsKKyAgICByZXR1cm4gbWJzdHJlYW1yZWFkZXJfaXJlYWQoc2VsZiwgInJlYWRsaW5lIiwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXJlYWRlcl9yZWFkbGluZXMoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc2l6ZWhpbnRvYmogPSBOVUxMLCAqciwgKnNyOwotCVB5X3NzaXplX3Qgc2l6ZWhpbnQ7CisgICAgUHlPYmplY3QgKnNpemVoaW50b2JqID0gTlVMTCwgKnIsICpzcjsKKyAgICBQeV9zc2l6ZV90IHNpemVoaW50OwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZGxpbmVzIiwgMCwgMSwgJnNpemVoaW50b2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZGxpbmVzIiwgMCwgMSwgJnNpemVoaW50b2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2l6ZWhpbnRvYmogPT0gUHlfTm9uZSB8fCBzaXplaGludG9iaiA9PSBOVUxMKQotCQlzaXplaGludCA9IC0xOwotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHNpemVoaW50b2JqKSkKLQkJc2l6ZWhpbnQgPSBQeUludF9Bc1NzaXplX3Qoc2l6ZWhpbnRvYmopOwotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIDEgbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2l6ZWhpbnRvYmogPT0gUHlfTm9uZSB8fCBzaXplaGludG9iaiA9PSBOVUxMKQorICAgICAgICBzaXplaGludCA9IC0xOworICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHNpemVoaW50b2JqKSkKKyAgICAgICAgc2l6ZWhpbnQgPSBQeUludF9Bc1NzaXplX3Qoc2l6ZWhpbnRvYmopOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJnIDEgbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXIgPSBtYnN0cmVhbXJlYWRlcl9pcmVhZChzZWxmLCAicmVhZCIsIHNpemVoaW50KTsKLQlpZiAociA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICByID0gbWJzdHJlYW1yZWFkZXJfaXJlYWQoc2VsZiwgInJlYWQiLCBzaXplaGludCk7CisgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzciA9IFB5VW5pY29kZV9TcGxpdGxpbmVzKHIsIDEpOwotCVB5X0RFQ1JFRihyKTsKLQlyZXR1cm4gc3I7CisgICAgc3IgPSBQeVVuaWNvZGVfU3BsaXRsaW5lcyhyLCAxKTsKKyAgICBQeV9ERUNSRUYocik7CisgICAgcmV0dXJuIHNyOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJzdHJlYW1yZWFkZXJfcmVzZXQoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5jb2RlYy0+ZGVjcmVzZXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZGVjcmVzZXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisgICAgaWYgKHNlbGYtPmNvZGVjLT5kZWNyZXNldCAhPSBOVUxMICYmCisgICAgICAgIHNlbGYtPmNvZGVjLT5kZWNyZXNldCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnBlbmRpbmdzaXplID0gMDsKIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIG1ic3RyZWFtcmVhZGVyX21ldGhvZHNbXSA9IHsKLQl7InJlYWQiLAkoUHlDRnVuY3Rpb24pbWJzdHJlYW1yZWFkZXJfcmVhZCwKLQkJCU1FVEhfVkFSQVJHUywgTlVMTH0sCi0JeyJyZWFkbGluZSIsCShQeUNGdW5jdGlvbiltYnN0cmVhbXJlYWRlcl9yZWFkbGluZSwKLQkJCU1FVEhfVkFSQVJHUywgTlVMTH0sCi0JeyJyZWFkbGluZXMiLAkoUHlDRnVuY3Rpb24pbWJzdHJlYW1yZWFkZXJfcmVhZGxpbmVzLAotCQkJTUVUSF9WQVJBUkdTLCBOVUxMfSwKLQl7InJlc2V0IiwJKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtcmVhZGVyX3Jlc2V0LAotCQkJTUVUSF9OT0FSR1MsIE5VTEx9LAotCXtOVUxMLAkJTlVMTH0sCisgICAgeyJyZWFkIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pbWJzdHJlYW1yZWFkZXJfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLCBOVUxMfSwKKyAgICB7InJlYWRsaW5lIiwgICAgICAgIChQeUNGdW5jdGlvbiltYnN0cmVhbXJlYWRlcl9yZWFkbGluZSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLCBOVUxMfSwKKyAgICB7InJlYWRsaW5lcyIsICAgICAgIChQeUNGdW5jdGlvbiltYnN0cmVhbXJlYWRlcl9yZWFkbGluZXMsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAgeyJyZXNldCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pbWJzdHJlYW1yZWFkZXJfcmVzZXQsCisgICAgICAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTLCBOVUxMfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9LAogfTsKIAogc3RhdGljIFB5TWVtYmVyRGVmIG1ic3RyZWFtcmVhZGVyX21lbWJlcnNbXSA9IHsKLQl7InN0cmVhbSIsCVRfT0JKRUNULAotCQkJb2Zmc2V0b2YoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0LCBzdHJlYW0pLAotCQkJUkVBRE9OTFksIE5VTEx9LAotCXtOVUxMLH0KKyAgICB7InN0cmVhbSIsICAgICAgICAgIFRfT0JKRUNULAorICAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QsIHN0cmVhbSksCisgICAgICAgICAgICAgICAgICAgIFJFQURPTkxZLCBOVUxMfSwKKyAgICB7TlVMTCx9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJzdHJlYW1yZWFkZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCU11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZjsKLQlQeU9iamVjdCAqc3RyZWFtLCAqY29kZWMgPSBOVUxMOwotCWNoYXIgKmVycm9ycyA9IE5VTEw7CisgICAgTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpzdHJlYW0sICpjb2RlYyA9IE5VTEw7CisgICAgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfHM6U3RyZWFtUmVhZGVyIiwKLQkJCQlzdHJlYW1rd2FyZ2xpc3QsICZzdHJlYW0sICZlcnJvcnMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzOlN0cmVhbVJlYWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFta3dhcmdsaXN0LCAmc3RyZWFtLCAmZXJyb3JzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmID0gKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHNlbGYgPSAoTXVsdGlieXRlU3RyZWFtUmVhZGVyT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopdHlwZSwgImNvZGVjIik7Ci0JaWYgKGNvZGVjID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCWlmICghTXVsdGlieXRlQ29kZWNfQ2hlY2soY29kZWMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBpcyB1bmV4cGVjdGVkIHR5cGUiKTsKLQkJZ290byBlcnJvcmV4aXQ7Ci0JfQorICAgIGNvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKil0eXBlLCAiY29kZWMiKTsKKyAgICBpZiAoY29kZWMgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKCFNdWx0aWJ5dGVDb2RlY19DaGVjayhjb2RlYykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImNvZGVjIGlzIHVuZXhwZWN0ZWQgdHlwZSIpOworICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICB9CiAKLQlzZWxmLT5jb2RlYyA9ICgoTXVsdGlieXRlQ29kZWNPYmplY3QgKiljb2RlYyktPmNvZGVjOwotCXNlbGYtPnN0cmVhbSA9IHN0cmVhbTsKLQlQeV9JTkNSRUYoc3RyZWFtKTsKLQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7Ci0Jc2VsZi0+ZXJyb3JzID0gaW50ZXJuYWxfZXJyb3JfY2FsbGJhY2soZXJyb3JzKTsKLQlpZiAoc2VsZi0+ZXJyb3JzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JleGl0OwotCWlmIChzZWxmLT5jb2RlYy0+ZGVjaW5pdCAhPSBOVUxMICYmCi0JICAgIHNlbGYtPmNvZGVjLT5kZWNpbml0KCZzZWxmLT5zdGF0ZSwgc2VsZi0+Y29kZWMtPmNvbmZpZykgIT0gMCkKLQkJZ290byBlcnJvcmV4aXQ7CisgICAgc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKKyAgICBzZWxmLT5zdHJlYW0gPSBzdHJlYW07CisgICAgUHlfSU5DUkVGKHN0cmVhbSk7CisgICAgc2VsZi0+cGVuZGluZ3NpemUgPSAwOworICAgIHNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7CisgICAgaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKKyAgICBpZiAoc2VsZi0+Y29kZWMtPmRlY2luaXQgIT0gTlVMTCAmJgorICAgICAgICBzZWxmLT5jb2RlYy0+ZGVjaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCisgICAgICAgIGdvdG8gZXJyb3JleGl0OwogCi0JUHlfREVDUkVGKGNvZGVjKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeV9ERUNSRUYoY29kZWMpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogCiBlcnJvcmV4aXQ6Ci0JUHlfWERFQ1JFRihzZWxmKTsKLQlQeV9YREVDUkVGKGNvZGVjKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHNlbGYpOworICAgIFB5X1hERUNSRUYoY29kZWMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBtYnN0cmVhbXJlYWRlcl9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG1ic3RyZWFtcmVhZGVyX3RyYXZlcnNlKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCAqc2VsZiwKLQkJCXZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQorICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCi0JCVB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7Ci0JUHlfVklTSVQoc2VsZi0+c3RyZWFtKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoRVJST1JfSVNDVVNUT00oc2VsZi0+ZXJyb3JzKSkKKyAgICAgICAgUHlfVklTSVQoc2VsZi0+ZXJyb3JzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5zdHJlYW0pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogbWJzdHJlYW1yZWFkZXJfZGVhbGxvYyhNdWx0aWJ5dGVTdHJlYW1SZWFkZXJPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKLQlFUlJPUl9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKLQlQeV9YREVDUkVGKHNlbGYtPnN0cmVhbSk7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOworICAgIEVSUk9SX0RFQ1JFRihzZWxmLT5lcnJvcnMpOworICAgIFB5X1hERUNSRUYoc2VsZi0+c3RyZWFtKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE11bHRpYnl0ZVN0cmVhbVJlYWRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJNdWx0aWJ5dGVTdHJlYW1SZWFkZXIiLAkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCksIC8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogIG1ldGhvZHMgICovCi0JKGRlc3RydWN0b3IpbWJzdHJlYW1yZWFkZXJfZGVhbGxvYywgLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKLQkJfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCTAsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpbWJzdHJlYW1yZWFkZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJleHQgKi8KLQltYnN0cmVhbXJlYWRlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLwotCW1ic3RyZWFtcmVhZGVyX21lbWJlcnMsCQkvKiB0cF9tZW1iZXJzICovCi0JY29kZWNjdHhfZ2V0c2V0cywJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCW1ic3RyZWFtcmVhZGVyX2luaXQsCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQltYnN0cmVhbXJlYWRlcl9uZXcsCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiTXVsdGlieXRlU3RyZWFtUmVhZGVyIiwgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdCksIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogIG1ldGhvZHMgICovCisgICAgKGRlc3RydWN0b3IpbWJzdHJlYW1yZWFkZXJfZGVhbGxvYywgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQworICAgICAgICB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyltYnN0cmVhbXJlYWRlcl90cmF2ZXJzZSwgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyZXh0ICovCisgICAgbWJzdHJlYW1yZWFkZXJfbWV0aG9kcywgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIG1ic3RyZWFtcmVhZGVyX21lbWJlcnMsICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBjb2RlY2N0eF9nZXRzZXRzLCAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICBtYnN0cmVhbXJlYWRlcl9pbml0LCAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBtYnN0cmVhbXJlYWRlcl9uZXcsICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIApAQCAtMTU1MSwyMTYgKzE1NTEsMjE2IEBACiAKIHN0YXRpYyBpbnQKIG1ic3RyZWFtd3JpdGVyX2l3cml0ZShNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGYsCi0JCSAgICAgIFB5T2JqZWN0ICp1bmlzdHIpCisgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnVuaXN0cikKIHsKLQlQeU9iamVjdCAqc3RyLCAqd3I7CisgICAgUHlPYmplY3QgKnN0ciwgKndyOwogCi0Jc3RyID0gZW5jb2Rlcl9lbmNvZGVfc3RhdGVmdWwoU1RBVEVGVUxfRUNUWChzZWxmKSwgdW5pc3RyLCAwKTsKLQlpZiAoc3RyID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBzdHIgPSBlbmNvZGVyX2VuY29kZV9zdGF0ZWZ1bChTVEFURUZVTF9FQ1RYKHNlbGYpLCB1bmlzdHIsIDApOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0Jd3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPnN0cmVhbSwgIndyaXRlIiwgIk8iLCBzdHIpOwotCVB5X0RFQ1JFRihzdHIpOwotCWlmICh3ciA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisgICAgd3IgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNlbGYtPnN0cmVhbSwgIndyaXRlIiwgIk8iLCBzdHIpOworICAgIFB5X0RFQ1JFRihzdHIpOworICAgIGlmICh3ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9ERUNSRUYod3IpOwotCXJldHVybiAwOworICAgIFB5X0RFQ1JFRih3cik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYnN0cmVhbXdyaXRlcl93cml0ZShNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzdHJvYmopCiB7Ci0JaWYgKG1ic3RyZWFtd3JpdGVyX2l3cml0ZShzZWxmLCBzdHJvYmopKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCVB5X1JFVFVSTl9OT05FOworICAgIGlmIChtYnN0cmVhbXdyaXRlcl9pd3JpdGUoc2VsZiwgc3Ryb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtd3JpdGVyX3dyaXRlbGluZXMoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbGluZXMpCiB7Ci0JUHlPYmplY3QgKnN0cm9iajsKLQlpbnQgaSwgcjsKKyAgICBQeU9iamVjdCAqc3Ryb2JqOworICAgIGludCBpLCByOwogCi0JaWYgKCFQeVNlcXVlbmNlX0NoZWNrKGxpbmVzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhcmcgbXVzdCBiZSBhIHNlcXVlbmNlIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeVNlcXVlbmNlX0NoZWNrKGxpbmVzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZyBtdXN0IGJlIGEgc2VxdWVuY2Ugb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBQeVNlcXVlbmNlX0xlbmd0aChsaW5lcyk7IGkrKykgewotCQkvKiBsZW5ndGggY2FuIGJlIGNoYW5nZWQgZXZlbiB3aXRoaW4gdGhpcyBsb29wICovCi0JCXN0cm9iaiA9IFB5U2VxdWVuY2VfR2V0SXRlbShsaW5lcywgaSk7Ci0JCWlmIChzdHJvYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBQeVNlcXVlbmNlX0xlbmd0aChsaW5lcyk7IGkrKykgeworICAgICAgICAvKiBsZW5ndGggY2FuIGJlIGNoYW5nZWQgZXZlbiB3aXRoaW4gdGhpcyBsb29wICovCisgICAgICAgIHN0cm9iaiA9IFB5U2VxdWVuY2VfR2V0SXRlbShsaW5lcywgaSk7CisgICAgICAgIGlmIChzdHJvYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXIgPSBtYnN0cmVhbXdyaXRlcl9pd3JpdGUoc2VsZiwgc3Ryb2JqKTsKLQkJUHlfREVDUkVGKHN0cm9iaik7Ci0JCWlmIChyID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICByID0gbWJzdHJlYW13cml0ZXJfaXdyaXRlKHNlbGYsIHN0cm9iaik7CisgICAgICAgIFB5X0RFQ1JFRihzdHJvYmopOworICAgICAgICBpZiAociA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWJzdHJlYW13cml0ZXJfcmVzZXQoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmKQogewotCWNvbnN0IFB5X1VOSUNPREUgKnBlbmRpbmc7Ci0JUHlPYmplY3QgKnB3cnQ7CisgICAgY29uc3QgUHlfVU5JQ09ERSAqcGVuZGluZzsKKyAgICBQeU9iamVjdCAqcHdydDsKIAotCXBlbmRpbmcgPSBzZWxmLT5wZW5kaW5nOwotCXB3cnQgPSBtdWx0aWJ5dGVjb2RlY19lbmNvZGUoc2VsZi0+Y29kZWMsICZzZWxmLT5zdGF0ZSwKLQkJCSZwZW5kaW5nLCBzZWxmLT5wZW5kaW5nc2l6ZSwgc2VsZi0+ZXJyb3JzLAotCQkJTUJFTkNfRkxVU0ggfCBNQkVOQ19SRVNFVCk7Ci0JLyogc29tZSBwZW5kaW5nIGJ1ZmZlciBjYW4gYmUgdHJ1bmNhdGVkIHdoZW4gVW5pY29kZUVuY29kZUVycm9yIGlzCi0JICogcmFpc2VkIG9uICdzdHJpY3QnIG1vZGUuIGJ1dCwgJ3Jlc2V0JyBtZXRob2QgaXMgZGVzaWduZWQgdG8KLQkgKiByZXNldCB0aGUgcGVuZGluZyBidWZmZXIgb3Igc3RhdGVzIHNvIGZhaWxlZCBzdHJpbmcgc2VxdWVuY2UKLQkgKiBvdWdodCB0byBiZSBtaXNzZWQgKi8KLQlzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7Ci0JaWYgKHB3cnQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcGVuZGluZyA9IHNlbGYtPnBlbmRpbmc7CisgICAgcHdydCA9IG11bHRpYnl0ZWNvZGVjX2VuY29kZShzZWxmLT5jb2RlYywgJnNlbGYtPnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAmcGVuZGluZywgc2VsZi0+cGVuZGluZ3NpemUsIHNlbGYtPmVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgTUJFTkNfRkxVU0ggfCBNQkVOQ19SRVNFVCk7CisgICAgLyogc29tZSBwZW5kaW5nIGJ1ZmZlciBjYW4gYmUgdHJ1bmNhdGVkIHdoZW4gVW5pY29kZUVuY29kZUVycm9yIGlzCisgICAgICogcmFpc2VkIG9uICdzdHJpY3QnIG1vZGUuIGJ1dCwgJ3Jlc2V0JyBtZXRob2QgaXMgZGVzaWduZWQgdG8KKyAgICAgKiByZXNldCB0aGUgcGVuZGluZyBidWZmZXIgb3Igc3RhdGVzIHNvIGZhaWxlZCBzdHJpbmcgc2VxdWVuY2UKKyAgICAgKiBvdWdodCB0byBiZSBtaXNzZWQgKi8KKyAgICBzZWxmLT5wZW5kaW5nc2l6ZSA9IDA7CisgICAgaWYgKHB3cnQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlTdHJpbmdfU2l6ZShwd3J0KSA+IDApIHsKLQkJUHlPYmplY3QgKndyOwotCQl3ciA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VsZi0+c3RyZWFtLCAid3JpdGUiLCAiTyIsIHB3cnQpOwotCQlpZiAod3IgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHB3cnQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKHB3cnQpOworICAgIGlmIChQeVN0cmluZ19TaXplKHB3cnQpID4gMCkgeworICAgICAgICBQeU9iamVjdCAqd3I7CisgICAgICAgIHdyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzZWxmLT5zdHJlYW0sICJ3cml0ZSIsICJPIiwgcHdydCk7CisgICAgICAgIGlmICh3ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocHdydCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYocHdydCk7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ic3RyZWFtd3JpdGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKnN0cmVhbSwgKmNvZGVjID0gTlVMTDsKLQljaGFyICplcnJvcnMgPSBOVUxMOworICAgIE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc3RyZWFtLCAqY29kZWMgPSBOVUxMOworICAgIGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzOlN0cmVhbVdyaXRlciIsCi0JCQkJc3RyZWFta3dhcmdsaXN0LCAmc3RyZWFtLCAmZXJyb3JzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98czpTdHJlYW1Xcml0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbWt3YXJnbGlzdCwgJnN0cmVhbSwgJmVycm9ycykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZWxmID0gKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY29kZWMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKXR5cGUsICJjb2RlYyIpOwotCWlmIChjb2RlYyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoIU11bHRpYnl0ZUNvZGVjX0NoZWNrKGNvZGVjKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY29kZWMgaXMgdW5leHBlY3RlZCB0eXBlIik7Ci0JCWdvdG8gZXJyb3JleGl0OwotCX0KKyAgICBjb2RlYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopdHlwZSwgImNvZGVjIik7CisgICAgaWYgKGNvZGVjID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3JleGl0OworICAgIGlmICghTXVsdGlieXRlQ29kZWNfQ2hlY2soY29kZWMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBpcyB1bmV4cGVjdGVkIHR5cGUiKTsKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgfQogCi0Jc2VsZi0+Y29kZWMgPSAoKE11bHRpYnl0ZUNvZGVjT2JqZWN0ICopY29kZWMpLT5jb2RlYzsKLQlzZWxmLT5zdHJlYW0gPSBzdHJlYW07Ci0JUHlfSU5DUkVGKHN0cmVhbSk7Ci0Jc2VsZi0+cGVuZGluZ3NpemUgPSAwOwotCXNlbGYtPmVycm9ycyA9IGludGVybmFsX2Vycm9yX2NhbGxiYWNrKGVycm9ycyk7Ci0JaWYgKHNlbGYtPmVycm9ycyA9PSBOVUxMKQotCQlnb3RvIGVycm9yZXhpdDsKLQlpZiAoc2VsZi0+Y29kZWMtPmVuY2luaXQgIT0gTlVMTCAmJgotCSAgICBzZWxmLT5jb2RlYy0+ZW5jaW5pdCgmc2VsZi0+c3RhdGUsIHNlbGYtPmNvZGVjLT5jb25maWcpICE9IDApCi0JCWdvdG8gZXJyb3JleGl0OworICAgIHNlbGYtPmNvZGVjID0gKChNdWx0aWJ5dGVDb2RlY09iamVjdCAqKWNvZGVjKS0+Y29kZWM7CisgICAgc2VsZi0+c3RyZWFtID0gc3RyZWFtOworICAgIFB5X0lOQ1JFRihzdHJlYW0pOworICAgIHNlbGYtPnBlbmRpbmdzaXplID0gMDsKKyAgICBzZWxmLT5lcnJvcnMgPSBpbnRlcm5hbF9lcnJvcl9jYWxsYmFjayhlcnJvcnMpOworICAgIGlmIChzZWxmLT5lcnJvcnMgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcmV4aXQ7CisgICAgaWYgKHNlbGYtPmNvZGVjLT5lbmNpbml0ICE9IE5VTEwgJiYKKyAgICAgICAgc2VsZi0+Y29kZWMtPmVuY2luaXQoJnNlbGYtPnN0YXRlLCBzZWxmLT5jb2RlYy0+Y29uZmlnKSAhPSAwKQorICAgICAgICBnb3RvIGVycm9yZXhpdDsKIAotCVB5X0RFQ1JFRihjb2RlYyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgUHlfREVDUkVGKGNvZGVjKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIAogZXJyb3JleGl0OgotCVB5X1hERUNSRUYoc2VsZik7Ci0JUHlfWERFQ1JFRihjb2RlYyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihzZWxmKTsKKyAgICBQeV9YREVDUkVGKGNvZGVjKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogbWJzdHJlYW13cml0ZXJfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBtYnN0cmVhbXdyaXRlcl90cmF2ZXJzZShNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QgKnNlbGYsCi0JCQl2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCWlmIChFUlJPUl9JU0NVU1RPTShzZWxmLT5lcnJvcnMpKQotCQlQeV9WSVNJVChzZWxmLT5lcnJvcnMpOwotCVB5X1ZJU0lUKHNlbGYtPnN0cmVhbSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKEVSUk9SX0lTQ1VTVE9NKHNlbGYtPmVycm9ycykpCisgICAgICAgIFB5X1ZJU0lUKHNlbGYtPmVycm9ycyk7CisgICAgUHlfVklTSVQoc2VsZi0+c3RyZWFtKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIG1ic3RyZWFtd3JpdGVyX2RlYWxsb2MoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7Ci0JRVJST1JfREVDUkVGKHNlbGYtPmVycm9ycyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5zdHJlYW0pOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKyAgICBFUlJPUl9ERUNSRUYoc2VsZi0+ZXJyb3JzKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnN0cmVhbSk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBtYnN0cmVhbXdyaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJ3cml0ZSIsCShQeUNGdW5jdGlvbiltYnN0cmVhbXdyaXRlcl93cml0ZSwKLQkJCU1FVEhfTywgTlVMTH0sCi0JeyJ3cml0ZWxpbmVzIiwJKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtd3JpdGVyX3dyaXRlbGluZXMsCi0JCQlNRVRIX08sIE5VTEx9LAotCXsicmVzZXQiLAkoUHlDRnVuY3Rpb24pbWJzdHJlYW13cml0ZXJfcmVzZXQsCi0JCQlNRVRIX05PQVJHUywgTlVMTH0sCi0Je05VTEwsCQlOVUxMfSwKKyAgICB7IndyaXRlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbiltYnN0cmVhbXdyaXRlcl93cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgTUVUSF9PLCBOVUxMfSwKKyAgICB7IndyaXRlbGluZXMiLCAgICAgIChQeUNGdW5jdGlvbiltYnN0cmVhbXdyaXRlcl93cml0ZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICBNRVRIX08sIE5VTEx9LAorICAgIHsicmVzZXQiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW1ic3RyZWFtd3JpdGVyX3Jlc2V0LAorICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywgTlVMTH0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSwKIH07CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBtYnN0cmVhbXdyaXRlcl9tZW1iZXJzW10gPSB7Ci0JeyJzdHJlYW0iLAlUX09CSkVDVCwKLQkJCW9mZnNldG9mKE11bHRpYnl0ZVN0cmVhbVdyaXRlck9iamVjdCwgc3RyZWFtKSwKLQkJCVJFQURPTkxZLCBOVUxMfSwKLQl7TlVMTCx9CisgICAgeyJzdHJlYW0iLCAgICAgICAgICBUX09CSkVDVCwKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0LCBzdHJlYW0pLAorICAgICAgICAgICAgICAgICAgICBSRUFET05MWSwgTlVMTH0sCisgICAge05VTEwsfQogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiTXVsdGlieXRlU3RyZWFtV3JpdGVyIiwJLyogdHBfbmFtZSAqLwotCXNpemVvZihNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QpLCAvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qICBtZXRob2RzICAqLwotCShkZXN0cnVjdG9yKW1ic3RyZWFtd3JpdGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDCi0JCXwgUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKW1ic3RyZWFtd3JpdGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVyZXh0ICovCi0JbWJzdHJlYW13cml0ZXJfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KLQltYnN0cmVhbXdyaXRlcl9tZW1iZXJzLAkJLyogdHBfbWVtYmVycyAqLwotCWNvZGVjY3R4X2dldHNldHMsCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQltYnN0cmVhbXdyaXRlcl9pbml0LAkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JbWJzdHJlYW13cml0ZXJfbmV3LAkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIk11bHRpYnl0ZVN0cmVhbVdyaXRlciIsICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJPYmplY3QpLCAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qICBtZXRob2RzICAqLworICAgIChkZXN0cnVjdG9yKW1ic3RyZWFtd3JpdGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKKyAgICAgICAgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbWJzdHJlYW13cml0ZXJfdHJhdmVyc2UsICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcmV4dCAqLworICAgIG1ic3RyZWFtd3JpdGVyX21ldGhvZHMsICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBtYnN0cmVhbXdyaXRlcl9tZW1iZXJzLCAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgY29kZWNjdHhfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgbWJzdHJlYW13cml0ZXJfaW5pdCwgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgbWJzdHJlYW13cml0ZXJfbmV3LCAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAKQEAgLTE3NzEsNTkgKzE3NzEsNTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfX2NyZWF0ZV9jb2RlYyhQeU9iamVjdCAqaWdub3JlLCBQeU9iamVjdCAqYXJnKQogewotCU11bHRpYnl0ZUNvZGVjT2JqZWN0ICpzZWxmOwotCU11bHRpYnl0ZUNvZGVjICpjb2RlYzsKKyAgICBNdWx0aWJ5dGVDb2RlY09iamVjdCAqc2VsZjsKKyAgICBNdWx0aWJ5dGVDb2RlYyAqY29kZWM7CiAKLQlpZiAoIVB5Q09iamVjdF9DaGVjayhhcmcpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYXJndW1lbnQgdHlwZSBpbnZhbGlkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5Q09iamVjdF9DaGVjayhhcmcpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYXJndW1lbnQgdHlwZSBpbnZhbGlkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWNvZGVjID0gUHlDT2JqZWN0X0FzVm9pZFB0cihhcmcpOwotCWlmIChjb2RlYy0+Y29kZWNpbml0ICE9IE5VTEwgJiYgY29kZWMtPmNvZGVjaW5pdChjb2RlYy0+Y29uZmlnKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjb2RlYyA9IFB5Q09iamVjdF9Bc1ZvaWRQdHIoYXJnKTsKKyAgICBpZiAoY29kZWMtPmNvZGVjaW5pdCAhPSBOVUxMICYmIGNvZGVjLT5jb2RlY2luaXQoY29kZWMtPmNvbmZpZykgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmID0gUHlPYmplY3RfTmV3KE11bHRpYnl0ZUNvZGVjT2JqZWN0LCAmTXVsdGlieXRlQ29kZWNfVHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+Y29kZWMgPSBjb2RlYzsKKyAgICBzZWxmID0gUHlPYmplY3RfTmV3KE11bHRpYnl0ZUNvZGVjT2JqZWN0LCAmTXVsdGlieXRlQ29kZWNfVHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+Y29kZWMgPSBjb2RlYzsKIAotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIF9fbWV0aG9kc1tdID0gewotCXsiX19jcmVhdGVfY29kZWMiLCAoUHlDRnVuY3Rpb24pX19jcmVhdGVfY29kZWMsIE1FVEhfT30sCi0Je05VTEwsIE5VTEx9LAorICAgIHsiX19jcmVhdGVfY29kZWMiLCAoUHlDRnVuY3Rpb24pX19jcmVhdGVfY29kZWMsIE1FVEhfT30sCisgICAge05VTEwsIE5VTEx9LAogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRfbXVsdGlieXRlY29kZWModm9pZCkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbTsKLQlQeVR5cGVPYmplY3QgKnR5cGVsaXN0W10gPSB7Ci0JCSZNdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJfVHlwZSwKLQkJJk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2Rlcl9UeXBlLAotCQkmTXVsdGlieXRlU3RyZWFtUmVhZGVyX1R5cGUsCi0JCSZNdWx0aWJ5dGVTdHJlYW1Xcml0ZXJfVHlwZSwKLQkJTlVMTAotCX07CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlbGlzdFtdID0geworICAgICAgICAmTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyX1R5cGUsCisgICAgICAgICZNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJfVHlwZSwKKyAgICAgICAgJk11bHRpYnl0ZVN0cmVhbVJlYWRlcl9UeXBlLAorICAgICAgICAmTXVsdGlieXRlU3RyZWFtV3JpdGVyX1R5cGUsCisgICAgICAgIE5VTEwKKyAgICB9OwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmTXVsdGlieXRlQ29kZWNfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmTXVsdGlieXRlQ29kZWNfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX211bHRpYnl0ZWNvZGVjIiwgX19tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9tdWx0aWJ5dGVjb2RlYyIsIF9fbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JZm9yIChpID0gMDsgdHlwZWxpc3RbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JCWlmIChQeVR5cGVfUmVhZHkodHlwZWxpc3RbaV0pIDwgMCkKLQkJCXJldHVybjsKLQkJUHlfSU5DUkVGKHR5cGVsaXN0W2ldKTsKLQkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sIHR5cGVsaXN0W2ldLT50cF9uYW1lLAotCQkJCSAgIChQeU9iamVjdCAqKXR5cGVsaXN0W2ldKTsKLQl9CisgICAgZm9yIChpID0gMDsgdHlwZWxpc3RbaV0gIT0gTlVMTDsgaSsrKSB7CisgICAgICAgIGlmIChQeVR5cGVfUmVhZHkodHlwZWxpc3RbaV0pIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgUHlfSU5DUkVGKHR5cGVsaXN0W2ldKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sIHR5cGVsaXN0W2ldLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopdHlwZWxpc3RbaV0pOworICAgIH0KIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIHRoZSBfbXVsdGlieXRlY29kZWMgbW9kdWxlIik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgdGhlIF9tdWx0aWJ5dGVjb2RlYyBtb2R1bGUiKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmggYi9Nb2R1bGVzL2Nqa2NvZGVjcy9tdWx0aWJ5dGVjb2RlYy5oCmluZGV4IDIyZWE1ZDQuLmYyMGMwN2QgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2prY29kZWNzL211bHRpYnl0ZWNvZGVjLmgKKysrIGIvTW9kdWxlcy9jamtjb2RlY3MvbXVsdGlieXRlY29kZWMuaApAQCAtMjMsMTE0ICsyMywxMTQgQEAKICNlbmRpZgogCiB0eXBlZGVmIHVuaW9uIHsKLQl2b2lkICpwOwotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgY1s4XTsKLQl1Y3MyX3QgdTJbNF07Ci0JdWNzNF90IHU0WzJdOworICAgIHZvaWQgKnA7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBjWzhdOworICAgIHVjczJfdCB1Mls0XTsKKyAgICB1Y3M0X3QgdTRbMl07CiB9IE11bHRpYnl0ZUNvZGVjX1N0YXRlOwogCiB0eXBlZGVmIGludCAoKm1iY29kZWNfaW5pdCkoY29uc3Qgdm9pZCAqY29uZmlnKTsKIHR5cGVkZWYgUHlfc3NpemVfdCAoKm1iZW5jb2RlX2Z1bmMpKE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJCWNvbnN0IHZvaWQgKmNvbmZpZywKLQkJCWNvbnN0IFB5X1VOSUNPREUgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsCi0JCQl1bnNpZ25lZCBjaGFyICoqb3V0YnVmLCBQeV9zc2l6ZV90IG91dGxlZnQsCi0JCQlpbnQgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHlfVU5JQ09ERSAqKmluYnVmLCBQeV9zc2l6ZV90IGlubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CiB0eXBlZGVmIGludCAoKm1iZW5jb2RlaW5pdF9mdW5jKShNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCi0JCQkJIGNvbnN0IHZvaWQgKmNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb25maWcpOwogdHlwZWRlZiBQeV9zc2l6ZV90ICgqbWJlbmNvZGVyZXNldF9mdW5jKShNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCi0JCQljb25zdCB2b2lkICpjb25maWcsCi0JCQl1bnNpZ25lZCBjaGFyICoqb3V0YnVmLCBQeV9zc2l6ZV90IG91dGxlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKm91dGJ1ZiwgUHlfc3NpemVfdCBvdXRsZWZ0KTsKIHR5cGVkZWYgUHlfc3NpemVfdCAoKm1iZGVjb2RlX2Z1bmMpKE11bHRpYnl0ZUNvZGVjX1N0YXRlICpzdGF0ZSwKLQkJCWNvbnN0IHZvaWQgKmNvbmZpZywKLQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbmJ1ZiwgUHlfc3NpemVfdCBpbmxlZnQsCi0JCQlQeV9VTklDT0RFICoqb3V0YnVmLCBQeV9zc2l6ZV90IG91dGxlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKmluYnVmLCBQeV9zc2l6ZV90IGlubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X1VOSUNPREUgKipvdXRidWYsIFB5X3NzaXplX3Qgb3V0bGVmdCk7CiB0eXBlZGVmIGludCAoKm1iZGVjb2RlaW5pdF9mdW5jKShNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCi0JCQkJIGNvbnN0IHZvaWQgKmNvbmZpZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb25maWcpOwogdHlwZWRlZiBQeV9zc2l6ZV90ICgqbWJkZWNvZGVyZXNldF9mdW5jKShNdWx0aWJ5dGVDb2RlY19TdGF0ZSAqc3RhdGUsCi0JCQkJCSBjb25zdCB2b2lkICpjb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb25maWcpOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JY29uc3QgY2hhciAqZW5jb2Rpbmc7Ci0JY29uc3Qgdm9pZCAqY29uZmlnOwotCW1iY29kZWNfaW5pdCBjb2RlY2luaXQ7Ci0JbWJlbmNvZGVfZnVuYyBlbmNvZGU7Ci0JbWJlbmNvZGVpbml0X2Z1bmMgZW5jaW5pdDsKLQltYmVuY29kZXJlc2V0X2Z1bmMgZW5jcmVzZXQ7Ci0JbWJkZWNvZGVfZnVuYyBkZWNvZGU7Ci0JbWJkZWNvZGVpbml0X2Z1bmMgZGVjaW5pdDsKLQltYmRlY29kZXJlc2V0X2Z1bmMgZGVjcmVzZXQ7CisgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CisgICAgY29uc3Qgdm9pZCAqY29uZmlnOworICAgIG1iY29kZWNfaW5pdCBjb2RlY2luaXQ7CisgICAgbWJlbmNvZGVfZnVuYyBlbmNvZGU7CisgICAgbWJlbmNvZGVpbml0X2Z1bmMgZW5jaW5pdDsKKyAgICBtYmVuY29kZXJlc2V0X2Z1bmMgZW5jcmVzZXQ7CisgICAgbWJkZWNvZGVfZnVuYyBkZWNvZGU7CisgICAgbWJkZWNvZGVpbml0X2Z1bmMgZGVjaW5pdDsKKyAgICBtYmRlY29kZXJlc2V0X2Z1bmMgZGVjcmVzZXQ7CiB9IE11bHRpYnl0ZUNvZGVjOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCU11bHRpYnl0ZUNvZGVjICpjb2RlYzsKKyAgICBQeU9iamVjdF9IRUFECisgICAgTXVsdGlieXRlQ29kZWMgKmNvZGVjOwogfSBNdWx0aWJ5dGVDb2RlY09iamVjdDsKIAogI2RlZmluZSBNdWx0aWJ5dGVDb2RlY19DaGVjayhvcCkgKChvcCktPm9iX3R5cGUgPT0gJk11bHRpYnl0ZUNvZGVjX1R5cGUpCiAKLSNkZWZpbmUgX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRAkJXAotCVB5T2JqZWN0X0hFQUQJCQkJXAotCU11bHRpYnl0ZUNvZGVjICpjb2RlYzsJCQlcCi0JTXVsdGlieXRlQ29kZWNfU3RhdGUgc3RhdGU7CQlcCi0JUHlPYmplY3QgKmVycm9yczsKKyNkZWZpbmUgX011bHRpYnl0ZVN0YXRlZnVsQ29kZWNfSEVBRCAgICAgICAgICAgIFwKKyAgICBQeU9iamVjdF9IRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNdWx0aWJ5dGVDb2RlYyAqY29kZWM7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNdWx0aWJ5dGVDb2RlY19TdGF0ZSBzdGF0ZTsgICAgICAgICAgICAgICAgIFwKKyAgICBQeU9iamVjdCAqZXJyb3JzOwogdHlwZWRlZiBzdHJ1Y3QgewotCV9NdWx0aWJ5dGVTdGF0ZWZ1bENvZGVjX0hFQUQKKyAgICBfTXVsdGlieXRlU3RhdGVmdWxDb2RlY19IRUFECiB9IE11bHRpYnl0ZVN0YXRlZnVsQ29kZWNDb250ZXh0OwogCi0jZGVmaW5lIE1BWEVOQ1BFTkRJTkcJMgotI2RlZmluZSBfTXVsdGlieXRlU3RhdGVmdWxFbmNvZGVyX0hFQUQJCVwKLQlfTXVsdGlieXRlU3RhdGVmdWxDb2RlY19IRUFECQlcCi0JUHlfVU5JQ09ERSBwZW5kaW5nW01BWEVOQ1BFTkRJTkddOwlcCi0JUHlfc3NpemVfdCBwZW5kaW5nc2l6ZTsKKyNkZWZpbmUgTUFYRU5DUEVORElORyAgIDIKKyNkZWZpbmUgX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFEICAgICAgICAgIFwKKyAgICBfTXVsdGlieXRlU3RhdGVmdWxDb2RlY19IRUFEICAgICAgICAgICAgICAgIFwKKyAgICBQeV9VTklDT0RFIHBlbmRpbmdbTUFYRU5DUEVORElOR107ICAgICAgICAgIFwKKyAgICBQeV9zc2l6ZV90IHBlbmRpbmdzaXplOwogdHlwZWRlZiBzdHJ1Y3QgewotCV9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRAorICAgIF9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRAogfSBNdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJDb250ZXh0OwogCi0jZGVmaW5lIE1BWERFQ1BFTkRJTkcJOAotI2RlZmluZSBfTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyX0hFQUQJCVwKLQlfTXVsdGlieXRlU3RhdGVmdWxDb2RlY19IRUFECQlcCi0JdW5zaWduZWQgY2hhciBwZW5kaW5nW01BWERFQ1BFTkRJTkddOwlcCi0JUHlfc3NpemVfdCBwZW5kaW5nc2l6ZTsKKyNkZWZpbmUgTUFYREVDUEVORElORyAgIDgKKyNkZWZpbmUgX011bHRpYnl0ZVN0YXRlZnVsRGVjb2Rlcl9IRUFEICAgICAgICAgIFwKKyAgICBfTXVsdGlieXRlU3RhdGVmdWxDb2RlY19IRUFEICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBjaGFyIHBlbmRpbmdbTUFYREVDUEVORElOR107ICAgICAgIFwKKyAgICBQeV9zc2l6ZV90IHBlbmRpbmdzaXplOwogdHlwZWRlZiBzdHJ1Y3QgewotCV9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAorICAgIF9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAogfSBNdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJDb250ZXh0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECisgICAgX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECiB9IE11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2Rlck9iamVjdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCV9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAorICAgIF9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAogfSBNdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJPYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlfTXVsdGlieXRlU3RhdGVmdWxEZWNvZGVyX0hFQUQKLQlQeU9iamVjdCAqc3RyZWFtOworICAgIF9NdWx0aWJ5dGVTdGF0ZWZ1bERlY29kZXJfSEVBRAorICAgIFB5T2JqZWN0ICpzdHJlYW07CiB9IE11bHRpYnl0ZVN0cmVhbVJlYWRlck9iamVjdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCV9NdWx0aWJ5dGVTdGF0ZWZ1bEVuY29kZXJfSEVBRAotCVB5T2JqZWN0ICpzdHJlYW07CisgICAgX011bHRpYnl0ZVN0YXRlZnVsRW5jb2Rlcl9IRUFECisgICAgUHlPYmplY3QgKnN0cmVhbTsKIH0gTXVsdGlieXRlU3RyZWFtV3JpdGVyT2JqZWN0OwogCiAvKiBwb3NpdGl2ZSB2YWx1ZXMgZm9yIGlsbGVnYWwgc2VxdWVuY2VzICovCi0jZGVmaW5lIE1CRVJSX1RPT1NNQUxMCQkoLTEpIC8qIGluc3VmZmljaWVudCBvdXRwdXQgYnVmZmVyIHNwYWNlICovCi0jZGVmaW5lIE1CRVJSX1RPT0ZFVwkJKC0yKSAvKiBpbmNvbXBsZXRlIGlucHV0IGJ1ZmZlciAqLwotI2RlZmluZSBNQkVSUl9JTlRFUk5BTAkJKC0zKSAvKiBpbnRlcm5hbCBydW50aW1lIGVycm9yICovCisjZGVmaW5lIE1CRVJSX1RPT1NNQUxMICAgICAgICAgICgtMSkgLyogaW5zdWZmaWNpZW50IG91dHB1dCBidWZmZXIgc3BhY2UgKi8KKyNkZWZpbmUgTUJFUlJfVE9PRkVXICAgICAgICAgICAgKC0yKSAvKiBpbmNvbXBsZXRlIGlucHV0IGJ1ZmZlciAqLworI2RlZmluZSBNQkVSUl9JTlRFUk5BTCAgICAgICAgICAoLTMpIC8qIGludGVybmFsIHJ1bnRpbWUgZXJyb3IgKi8KIAotI2RlZmluZSBFUlJPUl9TVFJJQ1QJCShQeU9iamVjdCAqKSgxKQotI2RlZmluZSBFUlJPUl9JR05PUkUJCShQeU9iamVjdCAqKSgyKQotI2RlZmluZSBFUlJPUl9SRVBMQUNFCQkoUHlPYmplY3QgKikoMykKLSNkZWZpbmUgRVJST1JfSVNDVVNUT00ocCkJKChwKSA8IEVSUk9SX1NUUklDVCB8fCBFUlJPUl9SRVBMQUNFIDwgKHApKQotI2RlZmluZSBFUlJPUl9ERUNSRUYocCkgZG8gewkJCVwKLQlpZiAocCAhPSBOVUxMICYmIEVSUk9SX0lTQ1VTVE9NKHApKSB7CVwKLQkJUHlfREVDUkVGKHApOwkJCVwKLQl9CQkJCQlcCisjZGVmaW5lIEVSUk9SX1NUUklDVCAgICAgICAgICAgIChQeU9iamVjdCAqKSgxKQorI2RlZmluZSBFUlJPUl9JR05PUkUgICAgICAgICAgICAoUHlPYmplY3QgKikoMikKKyNkZWZpbmUgRVJST1JfUkVQTEFDRSAgICAgICAgICAgKFB5T2JqZWN0ICopKDMpCisjZGVmaW5lIEVSUk9SX0lTQ1VTVE9NKHApICAgICAgICgocCkgPCBFUlJPUl9TVFJJQ1QgfHwgRVJST1JfUkVQTEFDRSA8IChwKSkKKyNkZWZpbmUgRVJST1JfREVDUkVGKHApIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocCAhPSBOVUxMICYmIEVSUk9SX0lTQ1VTVE9NKHApKSB7ICAgICAgIFwKKyAgICAgICAgUHlfREVDUkVGKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gd2hpbGUgKDApOwogCi0jZGVmaW5lIE1CRU5DX0ZMVVNICQkweDAwMDEgLyogZW5jb2RlIGFsbCBjaGFyYWN0ZXJzIGVuY29kYWJsZSAqLwotI2RlZmluZSBNQkVOQ19NQVgJCU1CRU5DX0ZMVVNICisjZGVmaW5lIE1CRU5DX0ZMVVNIICAgICAgICAgICAgIDB4MDAwMSAvKiBlbmNvZGUgYWxsIGNoYXJhY3RlcnMgZW5jb2RhYmxlICovCisjZGVmaW5lIE1CRU5DX01BWCAgICAgICAgICAgICAgIE1CRU5DX0ZMVVNICiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbG1vZHVsZS5jIGIvTW9kdWxlcy9jbG1vZHVsZS5jCmluZGV4IGQzZTBlZGYuLmU1ZDU2OGYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xtb2R1bGUuYworKysgYi9Nb2R1bGVzL2NsbW9kdWxlLmMKQEAgLTEyLDE0ICsxMiwxNCBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWludCBvYl9pc0NvbXByZXNzb3I7CS8qIENvbXByZXNzb3Igb3IgRGVjb21wcmVzc29yICovCi0JQ0xfSGFuZGxlIG9iX2NvbXByZXNzb3JIZGw7Ci0JaW50ICpvYl9wYXJhbXR5cGVzOwotCWludCBvYl9ucGFyYW1zOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBpbnQgb2JfaXNDb21wcmVzc29yOyAgICAgICAgLyogQ29tcHJlc3NvciBvciBEZWNvbXByZXNzb3IgKi8KKyAgICBDTF9IYW5kbGUgb2JfY29tcHJlc3NvckhkbDsKKyAgICBpbnQgKm9iX3BhcmFtdHlwZXM7CisgICAgaW50IG9iX25wYXJhbXM7CiB9IGNsb2JqZWN0OwogCi1zdGF0aWMgUHlPYmplY3QgKkNsRXJyb3I7CQkvKiBleGNlcHRpb24gY2wuZXJyb3IgKi8KK3N0YXRpYyBQeU9iamVjdCAqQ2xFcnJvcjsgICAgICAgICAgICAgICAvKiBleGNlcHRpb24gY2wuZXJyb3IgKi8KIAogc3RhdGljIGludCBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CiAKQEAgLTMwLDI4ICszMCwyOCBAQAogICogZXZlbiB0aG91Z2ggdGhleSBhcmUgcmVhbGx5ICJjbG9iamVjdCAqIi4gIFRoZXJlZm9yZSB3ZSBjYXN0IHRoZQogICogYXJndW1lbnQgdG8gdGhlIHByb3BlciB0eXBlIHVzaW5nIHRoaXMgbWFjcm8uCiAgKi8KLSNkZWZpbmUgU0VMRgkoKGNsb2JqZWN0ICopIHNlbGYpCisjZGVmaW5lIFNFTEYgICAgKChjbG9iamVjdCAqKSBzZWxmKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCSAgVXRpbGl0eSByb3V0aW5lcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbGl0eSByb3V0aW5lcy4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQKIGNsX0Vycm9ySGFuZGxlcihDTF9IYW5kbGUgaGFuZGxlLCBpbnQgY29kZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7Ci0JdmFfbGlzdCBhcDsKLQljaGFyIGVycmJ1ZltCVUZTSVpdOwkvKiBob3BlZnVsbHkgYmlnIGVub3VnaCAqLwotCWNoYXIgKnA7CisgICAgdmFfbGlzdCBhcDsKKyAgICBjaGFyIGVycmJ1ZltCVUZTSVpdOyAgICAgICAgLyogaG9wZWZ1bGx5IGJpZyBlbm91Z2ggKi8KKyAgICBjaGFyICpwOwogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCS8qIGRvbid0IGNoYW5nZSBleGlzdGluZyBlcnJvciAqLwotCQlyZXR1cm47Ci0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAxOwotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCXZzcHJpbnRmKGVycmJ1ZiwgZm10LCBhcCk7Ci0JdmFfZW5kKGFwKTsKLQlwID0gJmVycmJ1ZltzdHJsZW4oZXJyYnVmKSAtIDFdOyAvKiBzd2F0IHRoZSBsaW5lIGZlZWQgKi8KLQlpZiAoKnAgPT0gJ1xuJykKLQkJKnAgPSAwOwotCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCBlcnJidWYpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSAgICAgICAvKiBkb24ndCBjaGFuZ2UgZXhpc3RpbmcgZXJyb3IgKi8KKyAgICAgICAgcmV0dXJuOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMTsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2c3ByaW50ZihlcnJidWYsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgcCA9ICZlcnJidWZbc3RybGVuKGVycmJ1ZikgLSAxXTsgLyogc3dhdCB0aGUgbGluZSBmZWVkICovCisgICAgaWYgKCpwID09ICdcbicpCisgICAgICAgICpwID0gMDsKKyAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgZXJyYnVmKTsKIH0KIAogLyoKQEAgLTYwLDgzOSArNjAsODM5IEBACiBzdGF0aWMgaW50CiBwYXJhbV90eXBlX2lzX2Zsb2F0KGNsb2JqZWN0ICpzZWxmLCBpbnQgcGFyYW0pCiB7Ci0JaW50IGJ1ZmZlcmxlbmd0aDsKKyAgICBpbnQgYnVmZmVybGVuZ3RoOwogCi0JaWYgKHNlbGYtPm9iX3BhcmFtdHlwZXMgPT0gTlVMTCkgewotCQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JCWJ1ZmZlcmxlbmd0aCA9IGNsUXVlcnlQYXJhbXMoc2VsZi0+b2JfY29tcHJlc3NvckhkbCwgMCwgMCk7Ci0JCWlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCXJldHVybiAtMTsKKyAgICBpZiAoc2VsZi0+b2JfcGFyYW10eXBlcyA9PSBOVUxMKSB7CisgICAgICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICAgICAgYnVmZmVybGVuZ3RoID0gY2xRdWVyeVBhcmFtcyhzZWxmLT5vYl9jb21wcmVzc29ySGRsLCAwLCAwKTsKKyAgICAgICAgaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCXNlbGYtPm9iX3BhcmFtdHlwZXMgPSBQeU1lbV9ORVcoaW50LCBidWZmZXJsZW5ndGgpOwotCQlpZiAoc2VsZi0+b2JfcGFyYW10eXBlcyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlzZWxmLT5vYl9ucGFyYW1zID0gYnVmZmVybGVuZ3RoIC8gMjsKKyAgICAgICAgc2VsZi0+b2JfcGFyYW10eXBlcyA9IFB5TWVtX05FVyhpbnQsIGJ1ZmZlcmxlbmd0aCk7CisgICAgICAgIGlmIChzZWxmLT5vYl9wYXJhbXR5cGVzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHNlbGYtPm9iX25wYXJhbXMgPSBidWZmZXJsZW5ndGggLyAyOwogCi0JCSh2b2lkKSBjbFF1ZXJ5UGFyYW1zKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwsCi0JCQkJICAgICBzZWxmLT5vYl9wYXJhbXR5cGVzLCBidWZmZXJsZW5ndGgpOwotCQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJCVB5TWVtX0RFTChzZWxmLT5vYl9wYXJhbXR5cGVzKTsKLQkJCXNlbGYtPm9iX3BhcmFtdHlwZXMgPSBOVUxMOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgICAgICAodm9pZCkgY2xRdWVyeVBhcmFtcyhzZWxmLT5vYl9jb21wcmVzc29ySGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9wYXJhbXR5cGVzLCBidWZmZXJsZW5ndGgpOworICAgICAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgICAgIFB5TWVtX0RFTChzZWxmLT5vYl9wYXJhbXR5cGVzKTsKKyAgICAgICAgICAgIHNlbGYtPm9iX3BhcmFtdHlwZXMgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHBhcmFtIDwgMCB8fCBwYXJhbSA+PSBzZWxmLT5vYl9ucGFyYW1zKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKHBhcmFtIDwgMCB8fCBwYXJhbSA+PSBzZWxmLT5vYl9ucGFyYW1zKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoc2VsZi0+b2JfcGFyYW10eXBlc1twYXJhbSoyICsgMV0gPT0gQ0xfRkxPQVRJTkdfRU5VTV9WQUxVRSB8fAotCSAgICBzZWxmLT5vYl9wYXJhbXR5cGVzW3BhcmFtKjIgKyAxXSA9PSBDTF9GTE9BVElOR19SQU5HRV9WQUxVRSkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKKyAgICBpZiAoc2VsZi0+b2JfcGFyYW10eXBlc1twYXJhbSoyICsgMV0gPT0gQ0xfRkxPQVRJTkdfRU5VTV9WQUxVRSB8fAorICAgICAgICBzZWxmLT5vYl9wYXJhbXR5cGVzW3BhcmFtKjIgKyAxXSA9PSBDTF9GTE9BVElOR19SQU5HRV9WQUxVRSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICAgICAgIFNpbmdsZSBpbWFnZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorICAgICAgICAgICAgICAgU2luZ2xlIGltYWdlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9Db21wcmVzc0ltYWdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgY29tcHJlc3Npb25TY2hlbWUsIHdpZHRoLCBoZWlnaHQsIG9yaWdpbmFsRm9ybWF0OwotCWZsb2F0IGNvbXByZXNzaW9uUmF0aW87Ci0JaW50IGZyYW1lQnVmZmVyU2l6ZSwgY29tcHJlc3NlZEJ1ZmZlclNpemU7Ci0JY2hhciAqZnJhbWVCdWZmZXI7Ci0JUHlPYmplY3QgKmNvbXByZXNzZWRCdWZmZXI7CisgICAgaW50IGNvbXByZXNzaW9uU2NoZW1lLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEZvcm1hdDsKKyAgICBmbG9hdCBjb21wcmVzc2lvblJhdGlvOworICAgIGludCBmcmFtZUJ1ZmZlclNpemUsIGNvbXByZXNzZWRCdWZmZXJTaXplOworICAgIGNoYXIgKmZyYW1lQnVmZmVyOworICAgIFB5T2JqZWN0ICpjb21wcmVzc2VkQnVmZmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWlpZnMjIiwgJmNvbXByZXNzaW9uU2NoZW1lLAotCQkJICZ3aWR0aCwgJmhlaWdodCwKLQkJCSAmb3JpZ2luYWxGb3JtYXQsICZjb21wcmVzc2lvblJhdGlvLCAmZnJhbWVCdWZmZXIsCi0JCQkgJmZyYW1lQnVmZmVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaWZzIyIsICZjb21wcmVzc2lvblNjaGVtZSwKKyAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwgJmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICZvcmlnaW5hbEZvcm1hdCwgJmNvbXByZXNzaW9uUmF0aW8sICZmcmFtZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICZmcmFtZUJ1ZmZlclNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICByZXRyeToKLQljb21wcmVzc2VkQnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZnJhbWVCdWZmZXJTaXplKTsKLQlpZiAoY29tcHJlc3NlZEJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjb21wcmVzc2VkQnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZnJhbWVCdWZmZXJTaXplKTsKKyAgICBpZiAoY29tcHJlc3NlZEJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNvbXByZXNzZWRCdWZmZXJTaXplID0gZnJhbWVCdWZmZXJTaXplOwotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQlpZiAoY2xDb21wcmVzc0ltYWdlKGNvbXByZXNzaW9uU2NoZW1lLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEZvcm1hdCwKLQkJCSAgICBjb21wcmVzc2lvblJhdGlvLCAodm9pZCAqKSBmcmFtZUJ1ZmZlciwKLQkJCSAgICAmY29tcHJlc3NlZEJ1ZmZlclNpemUsCi0JCQkgICAgKHZvaWQgKikgUHlTdHJpbmdfQXNTdHJpbmcoY29tcHJlc3NlZEJ1ZmZlcikpCi0JICAgID09IEZBSUxVUkUgfHwgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlfREVDUkVGKGNvbXByZXNzZWRCdWZmZXIpOwotCQlpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJjbENvbXByZXNzSW1hZ2UgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBjb21wcmVzc2VkQnVmZmVyU2l6ZSA9IGZyYW1lQnVmZmVyU2l6ZTsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgaWYgKGNsQ29tcHJlc3NJbWFnZShjb21wcmVzc2lvblNjaGVtZSwgd2lkdGgsIGhlaWdodCwgb3JpZ2luYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblJhdGlvLCAodm9pZCAqKSBmcmFtZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2VkQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKGNvbXByZXNzZWRCdWZmZXIpKQorICAgICAgICA9PSBGQUlMVVJFIHx8IGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihjb21wcmVzc2VkQnVmZmVyKTsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiY2xDb21wcmVzc0ltYWdlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoY29tcHJlc3NlZEJ1ZmZlclNpemUgPiBmcmFtZUJ1ZmZlclNpemUpIHsKLQkJZnJhbWVCdWZmZXJTaXplID0gY29tcHJlc3NlZEJ1ZmZlclNpemU7Ci0JCVB5X0RFQ1JFRihjb21wcmVzc2VkQnVmZmVyKTsKLQkJZ290byByZXRyeTsKLQl9CisgICAgaWYgKGNvbXByZXNzZWRCdWZmZXJTaXplID4gZnJhbWVCdWZmZXJTaXplKSB7CisgICAgICAgIGZyYW1lQnVmZmVyU2l6ZSA9IGNvbXByZXNzZWRCdWZmZXJTaXplOworICAgICAgICBQeV9ERUNSRUYoY29tcHJlc3NlZEJ1ZmZlcik7CisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQogCi0JaWYgKGNvbXByZXNzZWRCdWZmZXJTaXplIDwgZnJhbWVCdWZmZXJTaXplKQotCQlfUHlTdHJpbmdfUmVzaXplKCZjb21wcmVzc2VkQnVmZmVyLCBjb21wcmVzc2VkQnVmZmVyU2l6ZSk7CisgICAgaWYgKGNvbXByZXNzZWRCdWZmZXJTaXplIDwgZnJhbWVCdWZmZXJTaXplKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZjb21wcmVzc2VkQnVmZmVyLCBjb21wcmVzc2VkQnVmZmVyU2l6ZSk7CiAKLQlyZXR1cm4gY29tcHJlc3NlZEJ1ZmZlcjsKKyAgICByZXR1cm4gY29tcHJlc3NlZEJ1ZmZlcjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX0RlY29tcHJlc3NJbWFnZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGNvbXByZXNzaW9uU2NoZW1lLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEZvcm1hdDsKLQljaGFyICpjb21wcmVzc2VkQnVmZmVyOwotCWludCBjb21wcmVzc2VkQnVmZmVyU2l6ZSwgZnJhbWVCdWZmZXJTaXplOwotCVB5T2JqZWN0ICpmcmFtZUJ1ZmZlcjsKKyAgICBpbnQgY29tcHJlc3Npb25TY2hlbWUsIHdpZHRoLCBoZWlnaHQsIG9yaWdpbmFsRm9ybWF0OworICAgIGNoYXIgKmNvbXByZXNzZWRCdWZmZXI7CisgICAgaW50IGNvbXByZXNzZWRCdWZmZXJTaXplLCBmcmFtZUJ1ZmZlclNpemU7CisgICAgUHlPYmplY3QgKmZyYW1lQnVmZmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWlpcyMiLCAmY29tcHJlc3Npb25TY2hlbWUsICZ3aWR0aCwgJmhlaWdodCwKLQkJCSAmb3JpZ2luYWxGb3JtYXQsICZjb21wcmVzc2VkQnVmZmVyLAotCQkJICZjb21wcmVzc2VkQnVmZmVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaXMjIiwgJmNvbXByZXNzaW9uU2NoZW1lLCAmd2lkdGgsICZoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAmb3JpZ2luYWxGb3JtYXQsICZjb21wcmVzc2VkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzZWRCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmcmFtZUJ1ZmZlclNpemUgPSB3aWR0aCAqIGhlaWdodCAqIENMX0J5dGVzUGVyUGl4ZWwob3JpZ2luYWxGb3JtYXQpOworICAgIGZyYW1lQnVmZmVyU2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogQ0xfQnl0ZXNQZXJQaXhlbChvcmlnaW5hbEZvcm1hdCk7CiAKLQlmcmFtZUJ1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGZyYW1lQnVmZmVyU2l6ZSk7Ci0JaWYgKGZyYW1lQnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGZyYW1lQnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZnJhbWVCdWZmZXJTaXplKTsKKyAgICBpZiAoZnJhbWVCdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JaWYgKGNsRGVjb21wcmVzc0ltYWdlKGNvbXByZXNzaW9uU2NoZW1lLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5hbEZvcm1hdCwKLQkJCSAgICAgIGNvbXByZXNzZWRCdWZmZXJTaXplLCBjb21wcmVzc2VkQnVmZmVyLAotCQkJICAgICAgKHZvaWQgKikgUHlTdHJpbmdfQXNTdHJpbmcoZnJhbWVCdWZmZXIpKQotCSAgICA9PSBGQUlMVVJFIHx8IGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCVB5X0RFQ1JFRihmcmFtZUJ1ZmZlcik7Ci0JCWlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImNsRGVjb21wcmVzc0ltYWdlIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIGlmIChjbERlY29tcHJlc3NJbWFnZShjb21wcmVzc2lvblNjaGVtZSwgd2lkdGgsIGhlaWdodCwgb3JpZ2luYWxGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRCdWZmZXJTaXplLCBjb21wcmVzc2VkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBQeVN0cmluZ19Bc1N0cmluZyhmcmFtZUJ1ZmZlcikpCisgICAgICAgID09IEZBSUxVUkUgfHwgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKGZyYW1lQnVmZmVyKTsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiY2xEZWNvbXByZXNzSW1hZ2UgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBmcmFtZUJ1ZmZlcjsKKyAgICByZXR1cm4gZnJhbWVCdWZmZXI7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQlTZXF1ZW50aWFsIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uCisgICAgICAgICAgICAgICAgU2VxdWVudGlhbCBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIENoZWNrQ29tcHJlc3NvcihzZWxmKQlpZiAoKHNlbGYpLT5vYl9jb21wcmVzc29ySGRsID09IE5VTEwpIHsgXAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICIoZGUpY29tcHJlc3NvciBub3QgYWN0aXZlIik7IFwKLQlyZXR1cm4gTlVMTDsgXAorI2RlZmluZSBDaGVja0NvbXByZXNzb3Ioc2VsZikgICBpZiAoKHNlbGYpLT5vYl9jb21wcmVzc29ySGRsID09IE5VTEwpIHsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICIoZGUpY29tcHJlc3NvciBub3QgYWN0aXZlIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9DbG9zZShjbG9iamVjdCAqc2VsZiwgaW50ICgqY2xvc2VfZnVuYykoQ0xfSGFuZGxlKSkKIHsKLQlDaGVja0NvbXByZXNzb3Ioc2VsZik7CisgICAgQ2hlY2tDb21wcmVzc29yKHNlbGYpOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCWlmICgoKmNsb3NlX2Z1bmMpKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwpID09IEZBSUxVUkUgfHwKLQkgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiY2xvc2UgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgaWYgKCgqY2xvc2VfZnVuYykoc2VsZi0+b2JfY29tcHJlc3NvckhkbCkgPT0gRkFJTFVSRSB8fAorICAgICAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJjbG9zZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc2VsZi0+b2JfY29tcHJlc3NvckhkbCA9IE5VTEw7CisgICAgc2VsZi0+b2JfY29tcHJlc3NvckhkbCA9IE5VTEw7CiAKLQlpZiAoc2VsZi0+b2JfcGFyYW10eXBlcykKLQkJUHlNZW1fREVMKHNlbGYtPm9iX3BhcmFtdHlwZXMpOwotCXNlbGYtPm9iX3BhcmFtdHlwZXMgPSBOVUxMOworICAgIGlmIChzZWxmLT5vYl9wYXJhbXR5cGVzKQorICAgICAgICBQeU1lbV9ERUwoc2VsZi0+b2JfcGFyYW10eXBlcyk7CisgICAgc2VsZi0+b2JfcGFyYW10eXBlcyA9IE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0Nsb3NlQ29tcHJlc3NvcihQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZG9DbG9zZShTRUxGLCBjbENsb3NlQ29tcHJlc3Nvcik7CisgICAgcmV0dXJuIGRvQ2xvc2UoU0VMRiwgY2xDbG9zZUNvbXByZXNzb3IpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0Nsb3NlRGVjb21wcmVzc29yKFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBkb0Nsb3NlKFNFTEYsIGNsQ2xvc2VEZWNvbXByZXNzb3IpOworICAgIHJldHVybiBkb0Nsb3NlKFNFTEYsIGNsQ2xvc2VEZWNvbXByZXNzb3IpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0NvbXByZXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbnVtYmVyT2ZGcmFtZXM7Ci0JaW50IGZyYW1lQnVmZmVyU2l6ZSwgY29tcHJlc3NlZEJ1ZmZlclNpemUsIHNpemU7Ci0JY2hhciAqZnJhbWVCdWZmZXI7Ci0JUHlPYmplY3QgKmRhdGE7CisgICAgaW50IG51bWJlck9mRnJhbWVzOworICAgIGludCBmcmFtZUJ1ZmZlclNpemUsIGNvbXByZXNzZWRCdWZmZXJTaXplLCBzaXplOworICAgIGNoYXIgKmZyYW1lQnVmZmVyOworICAgIFB5T2JqZWN0ICpkYXRhOwogCi0JQ2hlY2tDb21wcmVzc29yKFNFTEYpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyMpIiwgJm51bWJlck9mRnJhbWVzLAotCQkJICZmcmFtZUJ1ZmZlciwgJmZyYW1lQnVmZmVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyMpIiwgJm51bWJlck9mRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQnVmZmVyLCAmZnJhbWVCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0Jc2l6ZSA9IGNsR2V0UGFyYW0oU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgQ0xfQ09NUFJFU1NFRF9CVUZGRVJfU0laRSk7Ci0JY29tcHJlc3NlZEJ1ZmZlclNpemUgPSBzaXplOwotCWlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIHNpemUgPSBjbEdldFBhcmFtKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIENMX0NPTVBSRVNTRURfQlVGRkVSX1NJWkUpOworICAgIGNvbXByZXNzZWRCdWZmZXJTaXplID0gc2l6ZTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpOwotCWlmIChkYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGRhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQlpZiAoY2xDb21wcmVzcyhTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBudW1iZXJPZkZyYW1lcywKLQkJICAgICAgICh2b2lkICopIGZyYW1lQnVmZmVyLCAmY29tcHJlc3NlZEJ1ZmZlclNpemUsCi0JCSAgICAgICAodm9pZCAqKSBQeVN0cmluZ19Bc1N0cmluZyhkYXRhKSkgPT0gRkFJTFVSRSB8fAotCSAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgewotCQlQeV9ERUNSRUYoZGF0YSk7Ci0JCWlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgImNvbXByZXNzIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIGlmIChjbENvbXByZXNzKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIG51bWJlck9mRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopIGZyYW1lQnVmZmVyLCAmY29tcHJlc3NlZEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgUHlTdHJpbmdfQXNTdHJpbmcoZGF0YSkpID09IEZBSUxVUkUgfHwKKyAgICAgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKGRhdGEpOworICAgICAgICBpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJjb21wcmVzcyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGNvbXByZXNzZWRCdWZmZXJTaXplIDwgc2l6ZSkKLQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmRhdGEsIGNvbXByZXNzZWRCdWZmZXJTaXplKSkKLQkJCXJldHVybiBOVUxMOworICAgIGlmIChjb21wcmVzc2VkQnVmZmVyU2l6ZSA8IHNpemUpCisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZkYXRhLCBjb21wcmVzc2VkQnVmZmVyU2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChjb21wcmVzc2VkQnVmZmVyU2l6ZSA+IHNpemUpIHsKLQkJLyogd2UgZGlkbid0IGdldCBhbGwgImNvbXByZXNzZWQiIGRhdGEgKi8KLQkJUHlfREVDUkVGKGRhdGEpOwotCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwKLQkJCQkiY29tcHJlc3NlZCBkYXRhIGlzIG1vcmUgdGhhbiBmaXR0ZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChjb21wcmVzc2VkQnVmZmVyU2l6ZSA+IHNpemUpIHsKKyAgICAgICAgLyogd2UgZGlkbid0IGdldCBhbGwgImNvbXByZXNzZWQiIGRhdGEgKi8KKyAgICAgICAgUHlfREVDUkVGKGRhdGEpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wcmVzc2VkIGRhdGEgaXMgbW9yZSB0aGFuIGZpdHRlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gZGF0YTsKKyAgICByZXR1cm4gZGF0YTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsbV9EZWNvbXByZXNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZGF0YTsKLQlpbnQgbnVtYmVyT2ZGcmFtZXM7Ci0JY2hhciAqY29tcHJlc3NlZERhdGE7Ci0JaW50IGNvbXByZXNzZWREYXRhU2l6ZSwgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKmRhdGE7CisgICAgaW50IG51bWJlck9mRnJhbWVzOworICAgIGNoYXIgKmNvbXByZXNzZWREYXRhOworICAgIGludCBjb21wcmVzc2VkRGF0YVNpemUsIGRhdGFTaXplOwogCi0JQ2hlY2tDb21wcmVzc29yKFNFTEYpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyMpIiwgJm51bWJlck9mRnJhbWVzLCAmY29tcHJlc3NlZERhdGEsCi0JCQkgJmNvbXByZXNzZWREYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyMpIiwgJm51bWJlck9mRnJhbWVzLCAmY29tcHJlc3NlZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NlZERhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JZGF0YVNpemUgPSBjbEdldFBhcmFtKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIENMX0ZSQU1FX0JVRkZFUl9TSVpFKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCXJldHVybiBOVUxMOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBkYXRhU2l6ZSA9IGNsR2V0UGFyYW0oU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgQ0xfRlJBTUVfQlVGRkVSX1NJWkUpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlkYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZGF0YVNpemUpOwotCWlmIChkYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGRhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBkYXRhU2l6ZSk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JaWYgKGNsRGVjb21wcmVzcyhTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBudW1iZXJPZkZyYW1lcywKLQkJCSBjb21wcmVzc2VkRGF0YVNpemUsICh2b2lkICopIGNvbXByZXNzZWREYXRhLAotCQkJICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKGRhdGEpKSA9PSBGQUlMVVJFIHx8Ci0JICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7Ci0JCVB5X0RFQ1JFRihkYXRhKTsKLQkJaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiZGVjb21wcmVzcyBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBpZiAoY2xEZWNvbXByZXNzKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIG51bWJlck9mRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZERhdGFTaXplLCAodm9pZCAqKSBjb21wcmVzc2VkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICh2b2lkICopIFB5U3RyaW5nX0FzU3RyaW5nKGRhdGEpKSA9PSBGQUlMVVJFIHx8CisgICAgICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkKSB7CisgICAgICAgIFB5X0RFQ1JFRihkYXRhKTsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiZGVjb21wcmVzcyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIGRhdGE7CisgICAgcmV0dXJuIGRhdGE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb1BhcmFtcyhjbG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCAoKmZ1bmMpKENMX0hhbmRsZSwgaW50ICosIGludCksCi0JIGludCBtb2RpZmllZCkKKyAgICAgICAgIGludCBtb2RpZmllZCkKIHsKLQlQeU9iamVjdCAqbGlzdCwgKnY7Ci0JaW50ICpQVmJ1ZmZlcjsKLQlpbnQgbGVuZ3RoOwotCWludCBpOwotCWZsb2F0IG51bWJlcjsKLQkKLQlDaGVja0NvbXByZXNzb3Ioc2VsZik7CisgICAgUHlPYmplY3QgKmxpc3QsICp2OworICAgIGludCAqUFZidWZmZXI7CisgICAgaW50IGxlbmd0aDsKKyAgICBpbnQgaTsKKyAgICBmbG9hdCBudW1iZXI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJPIiwgJmxpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5TGlzdF9DaGVjayhsaXN0KSkgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbGVuZ3RoID0gUHlMaXN0X1NpemUobGlzdCk7Ci0JUFZidWZmZXIgPSBQeU1lbV9ORVcoaW50LCBsZW5ndGgpOwotCWlmIChQVmJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJdiA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIGkpOwotCQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgewotCQkJbnVtYmVyID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQkJCVBWYnVmZmVyW2ldID0gQ0xfVHlwZUlzSW50KG51bWJlcik7Ci0JCX0gZWxzZSBpZiAoUHlJbnRfQ2hlY2sodikpIHsKLQkJCVBWYnVmZmVyW2ldID0gUHlJbnRfQXNMb25nKHYpOwotCQkJaWYgKChpICYgMSkgJiYKLQkJCSAgICBwYXJhbV90eXBlX2lzX2Zsb2F0KHNlbGYsIFBWYnVmZmVyW2ktMV0pID4gMCkgewotCQkJCW51bWJlciA9IFBWYnVmZmVyW2ldOwotCQkJCVBWYnVmZmVyW2ldID0gQ0xfVHlwZUlzSW50KG51bWJlcik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlQeU1lbV9ERUwoUFZidWZmZXIpOwotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIENoZWNrQ29tcHJlc3NvcihzZWxmKTsKIAotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQkoKmZ1bmMpKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwsIFBWYnVmZmVyLCBsZW5ndGgpOwotCWlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkgewotCQlQeU1lbV9ERUwoUFZidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiTyIsICZsaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sobGlzdCkpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGxlbmd0aCA9IFB5TGlzdF9TaXplKGxpc3QpOworICAgIFBWYnVmZmVyID0gUHlNZW1fTkVXKGludCwgbGVuZ3RoKTsKKyAgICBpZiAoUFZidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHYgPSBQeUxpc3RfR2V0SXRlbShsaXN0LCBpKTsKKyAgICAgICAgaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIG51bWJlciA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgICAgICAgICBQVmJ1ZmZlcltpXSA9IENMX1R5cGVJc0ludChudW1iZXIpOworICAgICAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgICAgICBQVmJ1ZmZlcltpXSA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgICAgIGlmICgoaSAmIDEpICYmCisgICAgICAgICAgICAgICAgcGFyYW1fdHlwZV9pc19mbG9hdChzZWxmLCBQVmJ1ZmZlcltpLTFdKSA+IDApIHsKKyAgICAgICAgICAgICAgICBudW1iZXIgPSBQVmJ1ZmZlcltpXTsKKyAgICAgICAgICAgICAgICBQVmJ1ZmZlcltpXSA9IENMX1R5cGVJc0ludChudW1iZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChtb2RpZmllZCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoaSAmIDEpICYmCi0JCQkgICAgcGFyYW1fdHlwZV9pc19mbG9hdChzZWxmLCBQVmJ1ZmZlcltpLTFdKSA+IDApIHsKLQkJCQludW1iZXIgPSBDTF9UeXBlSXNGbG9hdChQVmJ1ZmZlcltpXSk7Ci0JCQkJdiA9IFB5RmxvYXRfRnJvbURvdWJsZShudW1iZXIpOwotCQkJfSBlbHNlCi0JCQkJdiA9IFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKTsKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIHYpOwotCQl9Ci0JfQorICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICAoKmZ1bmMpKHNlbGYtPm9iX2NvbXByZXNzb3JIZGwsIFBWYnVmZmVyLCBsZW5ndGgpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeU1lbV9ERUwoUFZidWZmZXIpOworICAgIGlmIChtb2RpZmllZCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoaSAmIDEpICYmCisgICAgICAgICAgICAgICAgcGFyYW1fdHlwZV9pc19mbG9hdChzZWxmLCBQVmJ1ZmZlcltpLTFdKSA+IDApIHsKKyAgICAgICAgICAgICAgICBudW1iZXIgPSBDTF9UeXBlSXNGbG9hdChQVmJ1ZmZlcltpXSk7CisgICAgICAgICAgICAgICAgdiA9IFB5RmxvYXRfRnJvbURvdWJsZShudW1iZXIpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKTsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIHYpOworICAgICAgICB9CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5TWVtX0RFTChQVmJ1ZmZlcik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fR2V0UGFyYW1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9QYXJhbXMoU0VMRiwgYXJncywgY2xHZXRQYXJhbXMsIDEpOworICAgIHJldHVybiBkb1BhcmFtcyhTRUxGLCBhcmdzLCBjbEdldFBhcmFtcywgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fU2V0UGFyYW1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9QYXJhbXMoU0VMRiwgYXJncywgY2xTZXRQYXJhbXMsIDApOworICAgIHJldHVybiBkb1BhcmFtcyhTRUxGLCBhcmdzLCBjbFNldFBhcmFtcywgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb19nZXQoY2xvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgKCpmdW5jKShDTF9IYW5kbGUsIGludCkpCiB7Ci0JaW50IHBhcmFtSUQsIHZhbHVlOwotCWZsb2F0IGZ2YWx1ZTsKKyAgICBpbnQgcGFyYW1JRCwgdmFsdWU7CisgICAgZmxvYXQgZnZhbHVlOwogCi0JQ2hlY2tDb21wcmVzc29yKHNlbGYpOworICAgIENoZWNrQ29tcHJlc3NvcihzZWxmKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmcGFyYW1JRCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmcGFyYW1JRCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOwotCXZhbHVlID0gKCpmdW5jKShzZWxmLT5vYl9jb21wcmVzc29ySGRsLCBwYXJhbUlEKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCXJldHVybiBOVUxMOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICB2YWx1ZSA9ICgqZnVuYykoc2VsZi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW1JRCk7CisgICAgaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KHNlbGYsIHBhcmFtSUQpID4gMCkgewotCQlmdmFsdWUgPSBDTF9UeXBlSXNGbG9hdCh2YWx1ZSk7Ci0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZnZhbHVlKTsKLQl9CisgICAgaWYgKHBhcmFtX3R5cGVfaXNfZmxvYXQoc2VsZiwgcGFyYW1JRCkgPiAwKSB7CisgICAgICAgIGZ2YWx1ZSA9IENMX1R5cGVJc0Zsb2F0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmdmFsdWUpOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsbV9HZXRQYXJhbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvX2dldChTRUxGLCBhcmdzLCBjbEdldFBhcmFtKTsKKyAgICByZXR1cm4gZG9fZ2V0KFNFTEYsIGFyZ3MsIGNsR2V0UGFyYW0pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0dldERlZmF1bHQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb19nZXQoU0VMRiwgYXJncywgY2xHZXREZWZhdWx0KTsKKyAgICByZXR1cm4gZG9fZ2V0KFNFTEYsIGFyZ3MsIGNsR2V0RGVmYXVsdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fU2V0UGFyYW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBwYXJhbUlELCB2YWx1ZTsKLQlmbG9hdCBmdmFsdWU7CisgICAgaW50IHBhcmFtSUQsIHZhbHVlOworICAgIGZsb2F0IGZ2YWx1ZTsKIAotCUNoZWNrQ29tcHJlc3NvcihTRUxGKTsKKyAgICBDaGVja0NvbXByZXNzb3IoU0VMRik7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnBhcmFtSUQsICZ2YWx1ZSkpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlmKSIsICZwYXJhbUlELCAmZnZhbHVlKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICAgImJhZCBhcmd1bWVudCBsaXN0IChmb3JtYXQgJyhpaSknIG9yICcoaWYpJykiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXZhbHVlID0gQ0xfVHlwZUlzSW50KGZ2YWx1ZSk7Ci0JfSBlbHNlIHsKLQkJaWYgKHBhcmFtX3R5cGVfaXNfZmxvYXQoU0VMRiwgcGFyYW1JRCkgPiAwKSB7Ci0JCQlmdmFsdWUgPSB2YWx1ZTsKLQkJCXZhbHVlID0gQ0xfVHlwZUlzSW50KGZ2YWx1ZSk7Ci0JCX0KLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZwYXJhbUlELCAmdmFsdWUpKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpZikiLCAmcGFyYW1JRCwgJmZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJiYWQgYXJndW1lbnQgbGlzdCAoZm9ybWF0ICcoaWkpJyBvciAnKGlmKScpIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IENMX1R5cGVJc0ludChmdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KFNFTEYsIHBhcmFtSUQpID4gMCkgeworICAgICAgICAgICAgZnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB2YWx1ZSA9IENMX1R5cGVJc0ludChmdmFsdWUpOworICAgICAgICB9CisgICAgfQogCi0gCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQl2YWx1ZSA9IGNsU2V0UGFyYW0oU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW1JRCwgdmFsdWUpOwotCWlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIHZhbHVlID0gY2xTZXRQYXJhbShTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBwYXJhbUlELCB2YWx1ZSk7CisgICAgaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KFNFTEYsIHBhcmFtSUQpID4gMCkKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShDTF9UeXBlSXNGbG9hdCh2YWx1ZSkpOwotCWVsc2UKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKKyAgICBpZiAocGFyYW1fdHlwZV9pc19mbG9hdChTRUxGLCBwYXJhbUlEKSA+IDApCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoQ0xfVHlwZUlzRmxvYXQodmFsdWUpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fR2V0UGFyYW1JRChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgdmFsdWU7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgdmFsdWU7CiAKLQlDaGVja0NvbXByZXNzb3IoU0VMRik7CisgICAgQ2hlY2tDb21wcmVzc29yKFNFTEYpOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JdmFsdWUgPSBjbEdldFBhcmFtSUQoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgbmFtZSk7Ci0JaWYgKHZhbHVlID09IEZBSUxVUkUgfHwgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiZ2V0cGFyYW1pZCBmYWlsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICB2YWx1ZSA9IGNsR2V0UGFyYW1JRChTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBuYW1lKTsKKyAgICBpZiAodmFsdWUgPT0gRkFJTFVSRSB8fCBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJnZXRwYXJhbWlkIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fUXVlcnlQYXJhbXMoUHlPYmplY3QgKnNlbGYpCiB7Ci0JaW50IGJ1ZmZlcmxlbmd0aDsKLQlpbnQgKlBWYnVmZmVyOwotCVB5T2JqZWN0ICpsaXN0OwotCWludCBpOworICAgIGludCBidWZmZXJsZW5ndGg7CisgICAgaW50ICpQVmJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBpbnQgaTsKIAotCUNoZWNrQ29tcHJlc3NvcihTRUxGKTsKKyAgICBDaGVja0NvbXByZXNzb3IoU0VMRik7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JYnVmZmVybGVuZ3RoID0gY2xRdWVyeVBhcmFtcyhTRUxGLT5vYl9jb21wcmVzc29ySGRsLCAwLCAwKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCXJldHVybiBOVUxMOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBidWZmZXJsZW5ndGggPSBjbFF1ZXJ5UGFyYW1zKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIDAsIDApOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQVmJ1ZmZlciA9IFB5TWVtX05FVyhpbnQsIGJ1ZmZlcmxlbmd0aCk7Ci0JaWYgKFBWYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFBWYnVmZmVyID0gUHlNZW1fTkVXKGludCwgYnVmZmVybGVuZ3RoKTsKKyAgICBpZiAoUFZidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQlidWZmZXJsZW5ndGggPSBjbFF1ZXJ5UGFyYW1zKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwsIFBWYnVmZmVyLAotCQkJCSAgICAgYnVmZmVybGVuZ3RoKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGJ1ZmZlcmxlbmd0aCA9IGNsUXVlcnlQYXJhbXMoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgUFZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJsZW5ndGgpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlsaXN0ID0gUHlMaXN0X05ldyhidWZmZXJsZW5ndGgpOwotCWlmIChsaXN0ID09IE5VTEwpIHsKLQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGxpc3QgPSBQeUxpc3RfTmV3KGJ1ZmZlcmxlbmd0aCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgICBQeU1lbV9ERUwoUFZidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgYnVmZmVybGVuZ3RoOyBpKyspIHsKLQkJaWYgKGkgJiAxKQotCQkJUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKLQkJZWxzZSBpZiAoUFZidWZmZXJbaV0gPT0gMCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfTm9uZSk7Ci0JCX0gZWxzZQotCQkJUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwKLQkJCQkgICBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyICopIFBWYnVmZmVyW2ldKSk7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBidWZmZXJsZW5ndGg7IGkrKykgeworICAgICAgICBpZiAoaSAmIDEpCisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSkpOworICAgICAgICBlbHNlIGlmIChQVmJ1ZmZlcltpXSA9PSAwKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBQeV9Ob25lKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyICopIFBWYnVmZmVyW2ldKSk7CisgICAgfQogCi0JUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICBQeU1lbV9ERUwoUFZidWZmZXIpOwogCi0JcmV0dXJuIGxpc3Q7CisgICAgcmV0dXJuIGxpc3Q7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fR2V0TWluTWF4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcGFyYW0sIG1pbiwgbWF4OwotCWZsb2F0IGZtaW4sIGZtYXg7CisgICAgaW50IHBhcmFtLCBtaW4sIG1heDsKKyAgICBmbG9hdCBmbWluLCBmbWF4OwogCi0JQ2hlY2tDb21wcmVzc29yKFNFTEYpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmcGFyYW0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljbEdldE1pbk1heChTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBwYXJhbSwgJm1pbiwgJm1heCk7CisgICAgY2xHZXRNaW5NYXgoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW0sICZtaW4sICZtYXgpOwogCi0JaWYgKHBhcmFtX3R5cGVfaXNfZmxvYXQoU0VMRiwgcGFyYW0pID4gMCkgewotCQlmbWluID0gQ0xfVHlwZUlzRmxvYXQobWluKTsKLQkJZm1heCA9IENMX1R5cGVJc0Zsb2F0KG1heCk7Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmYpIiwgZm1pbiwgZm1heCk7Ci0JfQorICAgIGlmIChwYXJhbV90eXBlX2lzX2Zsb2F0KFNFTEYsIHBhcmFtKSA+IDApIHsKKyAgICAgICAgZm1pbiA9IENMX1R5cGVJc0Zsb2F0KG1pbik7CisgICAgICAgIGZtYXggPSBDTF9UeXBlSXNGbG9hdChtYXgpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsIGZtaW4sIGZtYXgpOworICAgIH0KIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgbWluLCBtYXgpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgbWluLCBtYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX0dldE5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBwYXJhbTsKLQljaGFyICpuYW1lOworICAgIGludCBwYXJhbTsKKyAgICBjaGFyICpuYW1lOwogCi0JQ2hlY2tDb21wcmVzc29yKFNFTEYpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmcGFyYW0pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JbmFtZSA9IGNsR2V0TmFtZShTRUxGLT5vYl9jb21wcmVzc29ySGRsLCBwYXJhbSk7Ci0JaWYgKG5hbWUgPT0gTlVMTCB8fCBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgewotCQlpZiAoIWVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJnZXRuYW1lIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIG5hbWUgPSBjbEdldE5hbWUoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwgcGFyYW0pOworICAgIGlmIChuYW1lID09IE5VTEwgfHwgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiZ2V0bmFtZSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbG1fUXVlcnlTY2hlbWVGcm9tSGFuZGxlKFB5T2JqZWN0ICpzZWxmKQogewotCUNoZWNrQ29tcHJlc3NvcihTRUxGKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoY2xRdWVyeVNjaGVtZUZyb21IYW5kbGUoU0VMRi0+b2JfY29tcHJlc3NvckhkbCkpOworICAgIENoZWNrQ29tcHJlc3NvcihTRUxGKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoY2xRdWVyeVNjaGVtZUZyb21IYW5kbGUoU0VMRi0+b2JfY29tcHJlc3NvckhkbCkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xtX1JlYWRIZWFkZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmhlYWRlcjsKLQlpbnQgaGVhZGVyU2l6ZTsKKyAgICBjaGFyICpoZWFkZXI7CisgICAgaW50IGhlYWRlclNpemU7CiAKLQlDaGVja0NvbXByZXNzb3IoU0VMRik7CisgICAgQ2hlY2tDb21wcmVzc29yKFNFTEYpOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyMiLCAmaGVhZGVyLCAmaGVhZGVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgInMjIiwgJmhlYWRlciwgJmhlYWRlclNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhjbFJlYWRIZWFkZXIoU0VMRi0+b2JfY29tcHJlc3NvckhkbCwKLQkJCQkJICAgaGVhZGVyU2l6ZSwgaGVhZGVyKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNsUmVhZEhlYWRlcihTRUxGLT5vYl9jb21wcmVzc29ySGRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyU2l6ZSwgaGVhZGVyKSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjb21wcmVzc29yX21ldGhvZHNbXSA9IHsKLQl7ImNsb3NlIiwJCWNsbV9DbG9zZUNvbXByZXNzb3IsIE1FVEhfTk9BUkdTfSwgLyogYWxpYXMgKi8KLQl7IkNsb3NlQ29tcHJlc3NvciIsCWNsbV9DbG9zZUNvbXByZXNzb3IsIE1FVEhfTk9BUkdTfSwKLQl7IkNvbXByZXNzIiwJCWNsbV9Db21wcmVzcywgTUVUSF9PTERBUkdTfSwKLQl7IkdldERlZmF1bHQiLAkJY2xtX0dldERlZmF1bHQsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRNaW5NYXgiLAkJY2xtX0dldE1pbk1heCwgTUVUSF9PTERBUkdTfSwKLQl7IkdldE5hbWUiLAkJY2xtX0dldE5hbWUsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRQYXJhbSIsCQljbG1fR2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRQYXJhbUlEIiwJCWNsbV9HZXRQYXJhbUlELCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW1zIiwJCWNsbV9HZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCi0JeyJRdWVyeVBhcmFtcyIsCQljbG1fUXVlcnlQYXJhbXMsIE1FVEhfTk9BUkdTfSwKLQl7IlF1ZXJ5U2NoZW1lRnJvbUhhbmRsZSIsY2xtX1F1ZXJ5U2NoZW1lRnJvbUhhbmRsZSwgTUVUSF9OT0FSR1N9LAotCXsiU2V0UGFyYW0iLAkJY2xtX1NldFBhcmFtLCBNRVRIX09MREFSR1N9LAotCXsiU2V0UGFyYW1zIiwJCWNsbV9TZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJjbG9zZSIsICAgICAgICAgICAgICAgICAgIGNsbV9DbG9zZUNvbXByZXNzb3IsIE1FVEhfTk9BUkdTfSwgLyogYWxpYXMgKi8KKyAgICB7IkNsb3NlQ29tcHJlc3NvciIsICAgICAgICAgY2xtX0Nsb3NlQ29tcHJlc3NvciwgTUVUSF9OT0FSR1N9LAorICAgIHsiQ29tcHJlc3MiLCAgICAgICAgICAgICAgICBjbG1fQ29tcHJlc3MsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXREZWZhdWx0IiwgICAgICAgICAgICAgIGNsbV9HZXREZWZhdWx0LCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0TWluTWF4IiwgICAgICAgICAgICAgICBjbG1fR2V0TWluTWF4LCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0TmFtZSIsICAgICAgICAgICAgICAgICBjbG1fR2V0TmFtZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldFBhcmFtIiwgICAgICAgICAgICAgICAgY2xtX0dldFBhcmFtLCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0UGFyYW1JRCIsICAgICAgICAgICAgICBjbG1fR2V0UGFyYW1JRCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldFBhcmFtcyIsICAgICAgICAgICAgICAgY2xtX0dldFBhcmFtcywgTUVUSF9PTERBUkdTfSwKKyAgICB7IlF1ZXJ5UGFyYW1zIiwgICAgICAgICAgICAgY2xtX1F1ZXJ5UGFyYW1zLCBNRVRIX05PQVJHU30sCisgICAgeyJRdWVyeVNjaGVtZUZyb21IYW5kbGUiLGNsbV9RdWVyeVNjaGVtZUZyb21IYW5kbGUsIE1FVEhfTk9BUkdTfSwKKyAgICB7IlNldFBhcmFtIiwgICAgICAgICAgICAgICAgY2xtX1NldFBhcmFtLCBNRVRIX09MREFSR1N9LAorICAgIHsiU2V0UGFyYW1zIiwgICAgICAgICAgICAgICBjbG1fU2V0UGFyYW1zLCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkZWNvbXByZXNzb3JfbWV0aG9kc1tdID0gewotCXsiY2xvc2UiLAkJY2xtX0Nsb3NlRGVjb21wcmVzc29yLCBNRVRIX05PQVJHU30sCS8qIGFsaWFzICovCi0JeyJDbG9zZURlY29tcHJlc3NvciIsCWNsbV9DbG9zZURlY29tcHJlc3NvciwgTUVUSF9OT0FSR1N9LAotCXsiRGVjb21wcmVzcyIsCQljbG1fRGVjb21wcmVzcywgTUVUSF9PTERBUkdTfSwKLQl7IkdldERlZmF1bHQiLAkJY2xtX0dldERlZmF1bHQsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRNaW5NYXgiLAkJY2xtX0dldE1pbk1heCwgTUVUSF9PTERBUkdTfSwKLQl7IkdldE5hbWUiLAkJY2xtX0dldE5hbWUsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRQYXJhbSIsCQljbG1fR2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRQYXJhbUlEIiwJCWNsbV9HZXRQYXJhbUlELCBNRVRIX09MREFSR1N9LAotCXsiR2V0UGFyYW1zIiwJCWNsbV9HZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCi0JeyJSZWFkSGVhZGVyIiwJCWNsbV9SZWFkSGVhZGVyLCBNRVRIX09MREFSR1N9LAotCXsiUXVlcnlQYXJhbXMiLAkJY2xtX1F1ZXJ5UGFyYW1zLCBNRVRIX05PQVJHU30sCi0JeyJRdWVyeVNjaGVtZUZyb21IYW5kbGUiLGNsbV9RdWVyeVNjaGVtZUZyb21IYW5kbGUsIE1FVEhfTk9BUkdTfSwKLQl7IlNldFBhcmFtIiwJCWNsbV9TZXRQYXJhbSwgTUVUSF9PTERBUkdTfSwKLQl7IlNldFBhcmFtcyIsCQljbG1fU2V0UGFyYW1zLCBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiY2xvc2UiLCAgICAgICAgICAgICAgICAgICBjbG1fQ2xvc2VEZWNvbXByZXNzb3IsIE1FVEhfTk9BUkdTfSwgICAgLyogYWxpYXMgKi8KKyAgICB7IkNsb3NlRGVjb21wcmVzc29yIiwgICAgICAgY2xtX0Nsb3NlRGVjb21wcmVzc29yLCBNRVRIX05PQVJHU30sCisgICAgeyJEZWNvbXByZXNzIiwgICAgICAgICAgICAgIGNsbV9EZWNvbXByZXNzLCBNRVRIX09MREFSR1N9LAorICAgIHsiR2V0RGVmYXVsdCIsICAgICAgICAgICAgICBjbG1fR2V0RGVmYXVsdCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldE1pbk1heCIsICAgICAgICAgICAgICAgY2xtX0dldE1pbk1heCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldE5hbWUiLCAgICAgICAgICAgICAgICAgY2xtX0dldE5hbWUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRQYXJhbSIsICAgICAgICAgICAgICAgIGNsbV9HZXRQYXJhbSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldFBhcmFtSUQiLCAgICAgICAgICAgICAgY2xtX0dldFBhcmFtSUQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRQYXJhbXMiLCAgICAgICAgICAgICAgIGNsbV9HZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJSZWFkSGVhZGVyIiwgICAgICAgICAgICAgIGNsbV9SZWFkSGVhZGVyLCBNRVRIX09MREFSR1N9LAorICAgIHsiUXVlcnlQYXJhbXMiLCAgICAgICAgICAgICBjbG1fUXVlcnlQYXJhbXMsIE1FVEhfTk9BUkdTfSwKKyAgICB7IlF1ZXJ5U2NoZW1lRnJvbUhhbmRsZSIsY2xtX1F1ZXJ5U2NoZW1lRnJvbUhhbmRsZSwgTUVUSF9OT0FSR1N9LAorICAgIHsiU2V0UGFyYW0iLCAgICAgICAgICAgICAgICBjbG1fU2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCisgICAgeyJTZXRQYXJhbXMiLCAgICAgICAgICAgICAgIGNsbV9TZXRQYXJhbXMsIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIHZvaWQKIGNsX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpIHsKLQkJaWYgKFNFTEYtPm9iX2lzQ29tcHJlc3NvcikKLQkJCWNsQ2xvc2VDb21wcmVzc29yKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpOwotCQllbHNlCi0JCQljbENsb3NlRGVjb21wcmVzc29yKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpOwotCX0KLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpIHsKKyAgICAgICAgaWYgKFNFTEYtPm9iX2lzQ29tcHJlc3NvcikKKyAgICAgICAgICAgIGNsQ2xvc2VDb21wcmVzc29yKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjbENsb3NlRGVjb21wcmVzc29yKFNFTEYtPm9iX2NvbXByZXNzb3JIZGwpOworICAgIH0KKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9nZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQogewotCWlmIChTRUxGLT5vYl9pc0NvbXByZXNzb3IpCi0JCXJldHVybiBQeV9GaW5kTWV0aG9kKGNvbXByZXNzb3JfbWV0aG9kcywgc2VsZiwgbmFtZSk7Ci0JZWxzZQotCQlyZXR1cm4gUHlfRmluZE1ldGhvZChkZWNvbXByZXNzb3JfbWV0aG9kcywgc2VsZiwgbmFtZSk7CisgICAgaWYgKFNFTEYtPm9iX2lzQ29tcHJlc3NvcikKKyAgICAgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoY29tcHJlc3Nvcl9tZXRob2RzLCBzZWxmLCBuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGRlY29tcHJlc3Nvcl9tZXRob2RzLCBzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBDbHR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCS8qb2Jfc2l6ZSovCi0JImNsLmNsIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGNsb2JqZWN0KSwJLyp0cF9zaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciljbF9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWNsX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiY2wuY2wiLCAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoY2xvYmplY3QpLCAgICAgICAgICAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWNsX2RlYWxsb2MsICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpY2xfZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb09wZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgKCpvcGVuX2Z1bmMpKGludCwgQ0xfSGFuZGxlICopLAogICAgICAgIGludCBpc2NvbXByZXNzb3IpCiB7Ci0JaW50IHNjaGVtZTsKLQljbG9iamVjdCAqbmV3OworICAgIGludCBzY2hlbWU7CisgICAgY2xvYmplY3QgKm5ldzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZzY2hlbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmc2NoZW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluZXcgPSBQeU9iamVjdF9OZXcoY2xvYmplY3QsICZDbHR5cGUpOwotCWlmIChuZXcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbmV3ID0gUHlPYmplY3RfTmV3KGNsb2JqZWN0LCAmQ2x0eXBlKTsKKyAgICBpZiAobmV3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbmV3LT5vYl9jb21wcmVzc29ySGRsID0gTlVMTDsKLQluZXctPm9iX2lzQ29tcHJlc3NvciA9IGlzY29tcHJlc3NvcjsKLQluZXctPm9iX3BhcmFtdHlwZXMgPSBOVUxMOworICAgIG5ldy0+b2JfY29tcHJlc3NvckhkbCA9IE5VTEw7CisgICAgbmV3LT5vYl9pc0NvbXByZXNzb3IgPSBpc2NvbXByZXNzb3I7CisgICAgbmV3LT5vYl9wYXJhbXR5cGVzID0gTlVMTDsKIAotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQlpZiAoKCpvcGVuX2Z1bmMpKHNjaGVtZSwgJm5ldy0+b2JfY29tcHJlc3NvckhkbCkgPT0gRkFJTFVSRSB8fAotCSAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCkgewotCQlQeV9ERUNSRUYobmV3KTsKLQkJaWYgKCFlcnJvcl9oYW5kbGVyX2NhbGxlZCkKLQkJCVB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAiT3BlbihEZSlDb21wcmVzc29yIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ldzsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgaWYgKCgqb3Blbl9mdW5jKShzY2hlbWUsICZuZXctPm9iX2NvbXByZXNzb3JIZGwpID09IEZBSUxVUkUgfHwKKyAgICAgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ldyk7CisgICAgICAgIGlmICghZXJyb3JfaGFuZGxlcl9jYWxsZWQpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgIk9wZW4oRGUpQ29tcHJlc3NvciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXc7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9PcGVuQ29tcHJlc3NvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvT3BlbihzZWxmLCBhcmdzLCBjbE9wZW5Db21wcmVzc29yLCAxKTsKKyAgICByZXR1cm4gZG9PcGVuKHNlbGYsIGFyZ3MsIGNsT3BlbkNvbXByZXNzb3IsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfT3BlbkRlY29tcHJlc3NvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvT3BlbihzZWxmLCBhcmdzLCBjbE9wZW5EZWNvbXByZXNzb3IsIDApOworICAgIHJldHVybiBkb09wZW4oc2VsZiwgYXJncywgY2xPcGVuRGVjb21wcmVzc29yLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX1F1ZXJ5U2NoZW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpoZWFkZXI7Ci0JaW50IGhlYWRlcmxlbjsKLQlpbnQgc2NoZW1lOworICAgIGNoYXIgKmhlYWRlcjsKKyAgICBpbnQgaGVhZGVybGVuOworICAgIGludCBzY2hlbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjIiwgJmhlYWRlciwgJmhlYWRlcmxlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyMiLCAmaGVhZGVyLCAmaGVhZGVybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzY2hlbWUgPSBjbFF1ZXJ5U2NoZW1lKGhlYWRlcik7Ci0JaWYgKHNjaGVtZSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJ1bmtub3duIGNvbXByZXNzaW9uIHNjaGVtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc2NoZW1lID0gY2xRdWVyeVNjaGVtZShoZWFkZXIpOworICAgIGlmIChzY2hlbWUgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbEVycm9yLCAidW5rbm93biBjb21wcmVzc2lvbiBzY2hlbWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNjaGVtZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNjaGVtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9RdWVyeU1heEhlYWRlclNpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzY2hlbWU7CisgICAgaW50IHNjaGVtZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZzY2hlbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmc2NoZW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoY2xRdWVyeU1heEhlYWRlclNpemUoc2NoZW1lKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGNsUXVlcnlNYXhIZWFkZXJTaXplKHNjaGVtZSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfUXVlcnlBbGdvcml0aG1zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYWxnb3JpdGhtTWVkaWFUeXBlOwotCWludCBidWZmZXJsZW5ndGg7Ci0JaW50ICpQVmJ1ZmZlcjsKLQlQeU9iamVjdCAqbGlzdDsKLQlpbnQgaTsKKyAgICBpbnQgYWxnb3JpdGhtTWVkaWFUeXBlOworICAgIGludCBidWZmZXJsZW5ndGg7CisgICAgaW50ICpQVmJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBpbnQgaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZhbGdvcml0aG1NZWRpYVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmYWxnb3JpdGhtTWVkaWFUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7Ci0JYnVmZmVybGVuZ3RoID0gY2xRdWVyeUFsZ29yaXRobXMoYWxnb3JpdGhtTWVkaWFUeXBlLCAwLCAwKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpCi0JCXJldHVybiBOVUxMOworICAgIGVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKKyAgICBidWZmZXJsZW5ndGggPSBjbFF1ZXJ5QWxnb3JpdGhtcyhhbGdvcml0aG1NZWRpYVR5cGUsIDAsIDApOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQVmJ1ZmZlciA9IFB5TWVtX05FVyhpbnQsIGJ1ZmZlcmxlbmd0aCk7Ci0JaWYgKFBWYnVmZmVyID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFBWYnVmZmVyID0gUHlNZW1fTkVXKGludCwgYnVmZmVybGVuZ3RoKTsKKyAgICBpZiAoUFZidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQlidWZmZXJsZW5ndGggPSBjbFF1ZXJ5QWxnb3JpdGhtcyhhbGdvcml0aG1NZWRpYVR5cGUsIFBWYnVmZmVyLAotCQkJCQkgYnVmZmVybGVuZ3RoKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlNZW1fREVMKFBWYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGJ1ZmZlcmxlbmd0aCA9IGNsUXVlcnlBbGdvcml0aG1zKGFsZ29yaXRobU1lZGlhVHlwZSwgUFZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVybGVuZ3RoKTsKKyAgICBpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKKyAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbGlzdCA9IFB5TGlzdF9OZXcoYnVmZmVybGVuZ3RoKTsKLQlpZiAobGlzdCA9PSBOVUxMKSB7Ci0JCVB5TWVtX0RFTChQVmJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsaXN0ID0gUHlMaXN0X05ldyhidWZmZXJsZW5ndGgpOworICAgIGlmIChsaXN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IGJ1ZmZlcmxlbmd0aDsgaSsrKSB7Ci0JCWlmIChpICYgMSkKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKSk7Ci0JCWVsc2UgaWYgKFBWYnVmZmVyW2ldID09IDApIHsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIFB5X05vbmUpOwotCQl9IGVsc2UKLQkJCVB5TGlzdF9TZXRJdGVtKGxpc3QsIGksCi0JCQkJICAgUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciAqKSBQVmJ1ZmZlcltpXSkpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmZmVybGVuZ3RoOyBpKyspIHsKKyAgICAgICAgaWYgKGkgJiAxKQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlJbnRfRnJvbUxvbmcoUFZidWZmZXJbaV0pKTsKKyAgICAgICAgZWxzZSBpZiAoUFZidWZmZXJbaV0gPT0gMCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgUHlfTm9uZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZygoY2hhciAqKSBQVmJ1ZmZlcltpXSkpOworICAgIH0KIAotCVB5TWVtX0RFTChQVmJ1ZmZlcik7CisgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKIAotCXJldHVybiBsaXN0OworICAgIHJldHVybiBsaXN0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfUXVlcnlTY2hlbWVGcm9tTmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGFsZ29yaXRobU1lZGlhVHlwZTsKLQljaGFyICpuYW1lOwotCWludCBzY2hlbWU7CisgICAgaW50IGFsZ29yaXRobU1lZGlhVHlwZTsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBzY2hlbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzIiwgJmFsZ29yaXRobU1lZGlhVHlwZSwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzIiwgJmFsZ29yaXRobU1lZGlhVHlwZSwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQlzY2hlbWUgPSBjbFF1ZXJ5U2NoZW1lRnJvbU5hbWUoYWxnb3JpdGhtTWVkaWFUeXBlLCBuYW1lKTsKLQlpZiAoZXJyb3JfaGFuZGxlcl9jYWxsZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKENsRXJyb3IsICJ1bmtub3duIGNvbXByZXNzaW9uIHNjaGVtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXJyb3JfaGFuZGxlcl9jYWxsZWQgPSAwOworICAgIHNjaGVtZSA9IGNsUXVlcnlTY2hlbWVGcm9tTmFtZShhbGdvcml0aG1NZWRpYVR5cGUsIG5hbWUpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgInVua25vd24gY29tcHJlc3Npb24gc2NoZW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzY2hlbWUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzY2hlbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfR2V0QWxnb3JpdGhtTmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHNjaGVtZTsKLQljaGFyICpuYW1lOworICAgIGludCBzY2hlbWU7CisgICAgY2hhciAqbmFtZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZzY2hlbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmc2NoZW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluYW1lID0gY2xHZXRBbGdvcml0aG1OYW1lKHNjaGVtZSk7Ci0JaWYgKG5hbWUgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgInVua25vd24gY29tcHJlc3Npb24gc2NoZW1lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBuYW1lID0gY2xHZXRBbGdvcml0aG1OYW1lKHNjaGVtZSk7CisgICAgaWYgKG5hbWUgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2xFcnJvciwgInVua25vd24gY29tcHJlc3Npb24gc2NoZW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9fc2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50ICgqZnVuYykoaW50LCBpbnQsIGludCkpCiB7Ci0JaW50IHNjaGVtZSwgcGFyYW1JRCwgdmFsdWU7Ci0JZmxvYXQgZnZhbHVlOwotCWludCBpc19mbG9hdCA9IDA7CisgICAgaW50IHNjaGVtZSwgcGFyYW1JRCwgdmFsdWU7CisgICAgZmxvYXQgZnZhbHVlOworICAgIGludCBpc19mbG9hdCA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaSIsICZzY2hlbWUsICZwYXJhbUlELCAmdmFsdWUpKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlmIiwgJnNjaGVtZSwgJnBhcmFtSUQsICZmdmFsdWUpKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImJhZCBhcmd1bWVudCBsaXN0IChmb3JtYXQgJyhpaWkpJyBvciAnKGlpZiknKSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJdmFsdWUgPSBDTF9UeXBlSXNJbnQoZnZhbHVlKTsKLQkJaXNfZmxvYXQgPSAxOwotCX0gZWxzZSB7Ci0JCS8qIGNoZWNrIHNvbWUgcGFyYW1ldGVycyB3aGljaCB3ZSBrbm93IHRvIGJlIGZsb2F0cyAqLwotCQlzd2l0Y2ggKHNjaGVtZSkgewotCQljYXNlIENMX0NPTVBSRVNTSU9OX1JBVElPOgotCQljYXNlIENMX1NQRUVEOgotCQkJZnZhbHVlID0gdmFsdWU7Ci0JCQl2YWx1ZSA9IENMX1R5cGVJc0ludChmdmFsdWUpOwotCQkJaXNfZmxvYXQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWkiLCAmc2NoZW1lLCAmcGFyYW1JRCwgJnZhbHVlKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpZiIsICZzY2hlbWUsICZwYXJhbUlELCAmZnZhbHVlKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJiYWQgYXJndW1lbnQgbGlzdCAoZm9ybWF0ICcoaWlpKScgb3IgJyhpaWYpJykiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHZhbHVlID0gQ0xfVHlwZUlzSW50KGZ2YWx1ZSk7CisgICAgICAgIGlzX2Zsb2F0ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBjaGVjayBzb21lIHBhcmFtZXRlcnMgd2hpY2ggd2Uga25vdyB0byBiZSBmbG9hdHMgKi8KKyAgICAgICAgc3dpdGNoIChzY2hlbWUpIHsKKyAgICAgICAgY2FzZSBDTF9DT01QUkVTU0lPTl9SQVRJTzoKKyAgICAgICAgY2FzZSBDTF9TUEVFRDoKKyAgICAgICAgICAgIGZ2YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgdmFsdWUgPSBDTF9UeXBlSXNJbnQoZnZhbHVlKTsKKyAgICAgICAgICAgIGlzX2Zsb2F0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogCi0gCWVycm9yX2hhbmRsZXJfY2FsbGVkID0gMDsKLQl2YWx1ZSA9ICgqZnVuYykoc2NoZW1lLCBwYXJhbUlELCB2YWx1ZSk7Ci0JaWYgKGVycm9yX2hhbmRsZXJfY2FsbGVkKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlcnJvcl9oYW5kbGVyX2NhbGxlZCA9IDA7CisgICAgdmFsdWUgPSAoKmZ1bmMpKHNjaGVtZSwgcGFyYW1JRCwgdmFsdWUpOworICAgIGlmIChlcnJvcl9oYW5kbGVyX2NhbGxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoaXNfZmxvYXQpCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoQ0xfVHlwZUlzRmxvYXQodmFsdWUpKTsKLQllbHNlCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisgICAgaWYgKGlzX2Zsb2F0KQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKENMX1R5cGVJc0Zsb2F0KHZhbHVlKSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xfU2V0RGVmYXVsdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvX3NldChzZWxmLCBhcmdzLCBjbFNldERlZmF1bHQpOworICAgIHJldHVybiBkb19zZXQoc2VsZiwgYXJncywgY2xTZXREZWZhdWx0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsX1NldE1pbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGRvX3NldChzZWxmLCBhcmdzLCBjbFNldE1pbik7CisgICAgcmV0dXJuIGRvX3NldChzZWxmLCBhcmdzLCBjbFNldE1pbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbF9TZXRNYXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb19zZXQoc2VsZiwgYXJncywgY2xTZXRNYXgpOworICAgIHJldHVybiBkb19zZXQoc2VsZiwgYXJncywgY2xTZXRNYXgpOwogfQogCi0jZGVmaW5lIGZ1bmMobmFtZSwgaGFuZGxlcikJXAorI2RlZmluZSBmdW5jKG5hbWUsIGhhbmRsZXIpICAgICBcCiBzdGF0aWMgUHlPYmplY3QgKmNsXyMjbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIFwKIHsgXAotCSAgaW50IHg7IFwKLQkgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZ4KSkgcmV0dXJuIE5VTEw7IFwKLQkgIHJldHVybiBQeSMjaGFuZGxlcihDTF8jI25hbWUoeCkpOyBcCisgICAgICAgICAgaW50IHg7IFwKKyAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmeCkpIHJldHVybiBOVUxMOyBcCisgICAgICAgICAgcmV0dXJuIFB5IyNoYW5kbGVyKENMXyMjbmFtZSh4KSk7IFwKIH0KIAotI2RlZmluZSBmdW5jMihuYW1lLCBoYW5kbGVyKQlcCisjZGVmaW5lIGZ1bmMyKG5hbWUsIGhhbmRsZXIpICAgIFwKIHN0YXRpYyBQeU9iamVjdCAqY2xfIyNuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgXAogeyBcCi0JICBpbnQgYTEsIGEyOyBcCi0JICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpIiwgJmExLCAmYTIpKSByZXR1cm4gTlVMTDsgXAotCSAgcmV0dXJuIFB5IyNoYW5kbGVyKENMXyMjbmFtZShhMSwgYTIpKTsgXAorICAgICAgICAgIGludCBhMSwgYTI7IFwKKyAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpIiwgJmExLCAmYTIpKSByZXR1cm4gTlVMTDsgXAorICAgICAgICAgIHJldHVybiBQeSMjaGFuZGxlcihDTF8jI25hbWUoYTEsIGEyKSk7IFwKIH0KIAogZnVuYyhCeXRlc1BlclNhbXBsZSwgSW50X0Zyb21Mb25nKQpAQCAtOTA3LDUwICs5MDcsNTAgQEAKIGZ1bmMyKFBhcmFtSUQsIEludF9Gcm9tTG9uZykKIAogI2lmZGVmIENMREVCVUcKLQlzdGF0aWMgUHlPYmplY3QgKgorICAgIHN0YXRpYyBQeU9iamVjdCAqCiBjdnRfdHlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG51bWJlcjsKLQlmbG9hdCBmbnVtYmVyOworICAgIGludCBudW1iZXI7CisgICAgZmxvYXQgZm51bWJlcjsKIAotCWlmIChQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZudW1iZXIpKQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKENMX1R5cGVJc0Zsb2F0KG51bWJlcikpOwotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoUHlBcmdfUGFyc2UoYXJncywgImYiLCAmZm51bWJlcikpCi0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoQ0xfVHlwZUlzSW50KGZudW1iZXIpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZudW1iZXIpKQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKENMX1R5cGVJc0Zsb2F0KG51bWJlcikpOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoUHlBcmdfUGFyc2UoYXJncywgImYiLCAmZm51bWJlcikpCisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoQ0xfVHlwZUlzSW50KGZudW1iZXIpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjbF9tZXRob2RzW10gPSB7Ci0JeyJDb21wcmVzc0ltYWdlIiwJY2xfQ29tcHJlc3NJbWFnZSwgTUVUSF9WQVJBUkdTfSwKLQl7IkRlY29tcHJlc3NJbWFnZSIsCWNsX0RlY29tcHJlc3NJbWFnZSwgTUVUSF9WQVJBUkdTfSwKLQl7IkdldEFsZ29yaXRobU5hbWUiLAljbF9HZXRBbGdvcml0aG1OYW1lLCBNRVRIX1ZBUkFSR1N9LAotCXsiT3BlbkNvbXByZXNzb3IiLAljbF9PcGVuQ29tcHJlc3NvciwgTUVUSF9WQVJBUkdTfSwKLQl7Ik9wZW5EZWNvbXByZXNzb3IiLAljbF9PcGVuRGVjb21wcmVzc29yLCBNRVRIX1ZBUkFSR1N9LAotCXsiUXVlcnlBbGdvcml0aG1zIiwJY2xfUXVlcnlBbGdvcml0aG1zLCBNRVRIX1ZBUkFSR1N9LAotCXsiUXVlcnlNYXhIZWFkZXJTaXplIiwJY2xfUXVlcnlNYXhIZWFkZXJTaXplLCBNRVRIX1ZBUkFSR1N9LAotCXsiUXVlcnlTY2hlbWUiLAkJY2xfUXVlcnlTY2hlbWUsIE1FVEhfVkFSQVJHU30sCi0JeyJRdWVyeVNjaGVtZUZyb21OYW1lIiwJY2xfUXVlcnlTY2hlbWVGcm9tTmFtZSwgTUVUSF9WQVJBUkdTfSwKLQl7IlNldERlZmF1bHQiLAkJY2xfU2V0RGVmYXVsdCwgTUVUSF9WQVJBUkdTfSwKLQl7IlNldE1heCIsCQljbF9TZXRNYXgsIE1FVEhfVkFSQVJHU30sCi0JeyJTZXRNaW4iLAkJY2xfU2V0TWluLCBNRVRIX1ZBUkFSR1N9LAotCXsiQnl0ZXNQZXJTYW1wbGUiLAljbF9CeXRlc1BlclNhbXBsZSwgTUVUSF9WQVJBUkdTfSwKLQl7IkJ5dGVzUGVyUGl4ZWwiLAljbF9CeXRlc1BlclBpeGVsLCBNRVRIX1ZBUkFSR1N9LAotCXsiQXVkaW9Gb3JtYXROYW1lIiwJY2xfQXVkaW9Gb3JtYXROYW1lLCBNRVRIX1ZBUkFSR1N9LAotCXsiVmlkZW9Gb3JtYXROYW1lIiwJY2xfVmlkZW9Gb3JtYXROYW1lLCBNRVRIX1ZBUkFSR1N9LAotCXsiQWxnb3JpdGhtTnVtYmVyIiwJY2xfQWxnb3JpdGhtTnVtYmVyLCBNRVRIX1ZBUkFSR1N9LAotCXsiQWxnb3JpdGhtVHlwZSIsCWNsX0FsZ29yaXRobVR5cGUsIE1FVEhfVkFSQVJHU30sCi0JeyJBbGdvcml0aG0iLAkJY2xfQWxnb3JpdGhtLCBNRVRIX1ZBUkFSR1N9LAotCXsiUGFyYW1OdW1iZXIiLAkJY2xfUGFyYW1OdW1iZXIsIE1FVEhfVkFSQVJHU30sCi0JeyJQYXJhbVR5cGUiLAkJY2xfUGFyYW1UeXBlLCBNRVRIX1ZBUkFSR1N9LAotCXsiUGFyYW1JRCIsCQljbF9QYXJhbUlELCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiQ29tcHJlc3NJbWFnZSIsICAgICAgICAgICBjbF9Db21wcmVzc0ltYWdlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiRGVjb21wcmVzc0ltYWdlIiwgICAgICAgICBjbF9EZWNvbXByZXNzSW1hZ2UsIE1FVEhfVkFSQVJHU30sCisgICAgeyJHZXRBbGdvcml0aG1OYW1lIiwgICAgICAgIGNsX0dldEFsZ29yaXRobU5hbWUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJPcGVuQ29tcHJlc3NvciIsICAgICAgICAgIGNsX09wZW5Db21wcmVzc29yLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiT3BlbkRlY29tcHJlc3NvciIsICAgICAgICBjbF9PcGVuRGVjb21wcmVzc29yLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiUXVlcnlBbGdvcml0aG1zIiwgICAgICAgICBjbF9RdWVyeUFsZ29yaXRobXMsIE1FVEhfVkFSQVJHU30sCisgICAgeyJRdWVyeU1heEhlYWRlclNpemUiLCAgICAgIGNsX1F1ZXJ5TWF4SGVhZGVyU2l6ZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlF1ZXJ5U2NoZW1lIiwgICAgICAgICAgICAgY2xfUXVlcnlTY2hlbWUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJRdWVyeVNjaGVtZUZyb21OYW1lIiwgICAgIGNsX1F1ZXJ5U2NoZW1lRnJvbU5hbWUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJTZXREZWZhdWx0IiwgICAgICAgICAgICAgIGNsX1NldERlZmF1bHQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJTZXRNYXgiLCAgICAgICAgICAgICAgICAgIGNsX1NldE1heCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlNldE1pbiIsICAgICAgICAgICAgICAgICAgY2xfU2V0TWluLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiQnl0ZXNQZXJTYW1wbGUiLCAgICAgICAgICBjbF9CeXRlc1BlclNhbXBsZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkJ5dGVzUGVyUGl4ZWwiLCAgICAgICAgICAgY2xfQnl0ZXNQZXJQaXhlbCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkF1ZGlvRm9ybWF0TmFtZSIsICAgICAgICAgY2xfQXVkaW9Gb3JtYXROYW1lLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiVmlkZW9Gb3JtYXROYW1lIiwgICAgICAgICBjbF9WaWRlb0Zvcm1hdE5hbWUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJBbGdvcml0aG1OdW1iZXIiLCAgICAgICAgIGNsX0FsZ29yaXRobU51bWJlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkFsZ29yaXRobVR5cGUiLCAgICAgICAgICAgY2xfQWxnb3JpdGhtVHlwZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkFsZ29yaXRobSIsICAgICAgICAgICAgICAgY2xfQWxnb3JpdGhtLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiUGFyYW1OdW1iZXIiLCAgICAgICAgICAgICBjbF9QYXJhbU51bWJlciwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IlBhcmFtVHlwZSIsICAgICAgICAgICAgICAgY2xfUGFyYW1UeXBlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiUGFyYW1JRCIsICAgICAgICAgICAgICAgICBjbF9QYXJhbUlELCBNRVRIX1ZBUkFSR1N9LAogI2lmZGVmIENMREVCVUcKLQl7ImN2dF90eXBlIiwJCWN2dF90eXBlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY3Z0X3R5cGUiLCAgICAgICAgICAgICAgICBjdnRfdHlwZSwgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgotCXtOVUxMLAkJCU5VTEx9IC8qIFNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogCiAjaWZkZWYgQ0xfSlBFR19TT0ZUV0FSRQpAQCAtOTYwLDE2MDQgKzk2MCwxNjA0IEBACiB2b2lkCiBpbml0Y2wodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp4OwotICAgIAorICAgIFB5T2JqZWN0ICptLCAqZCwgKng7CisKICAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBjbCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQotICAgICAgICByZXR1cm47Ci0gICAgCi0JbSA9IFB5X0luaXRNb2R1bGUoImNsIiwgY2xfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIHJldHVybjsKIAotCUNsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNsLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JKHZvaWQpIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIENsRXJyb3IpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJjbCIsIGNsX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKworICAgIENsRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImNsLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgKHZvaWQpIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIENsRXJyb3IpOwogCiAjaWZkZWYgQ0xfQURERURfQUxHT1JJVEhNX0VSUk9SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FEREVEX0FMR09SSVRITV9FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQURERURfQUxHT1JJVEhNX0VSUk9SIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BRERFRF9BTEdPUklUSE1fRVJST1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFEREVEX0FMR09SSVRITV9FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FMQVcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxBVyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxBVyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxBVyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxBVyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FMR09SSVRITV9JRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdPUklUSE1fSUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMR09SSVRITV9JRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxHT1JJVEhNX0lEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdPUklUSE1fSUQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BTEdPUklUSE1fVEFCTEVfRlVMTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdPUklUSE1fVEFCTEVfRlVMTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxHT1JJVEhNX1RBQkxFX0ZVTEwiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMR09SSVRITV9UQUJMRV9GVUxMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdPUklUSE1fVEFCTEVfRlVMTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FMR09SSVRITV9WRVJTSU9OCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMR09SSVRITV9WRVJTSU9OKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdPUklUSE1fVkVSU0lPTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxHT1JJVEhNX1ZFUlNJT04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMR09SSVRITV9WRVJTSU9OIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQUxHX0FVRElPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FMR19BVURJTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQUxHX0FVRElPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdfQVVESU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMR19BVURJTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FMR19WSURFTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BTEdfVklERU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFMR19WSURFTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQUxHX1ZJREVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBTEdfVklERU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BVURJTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BVURJTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVVESU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FVRElPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBVURJTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX0JJVFJBVEVfUE9MSUNZCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0JJVFJBVEVfUE9MSUNZKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9CSVRSQVRFX1BPTElDWSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfQklUUkFURV9QT0xJQ1kpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0JJVFJBVEVfUE9MSUNZIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfQklUUkFURV9UQVJHRVQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfQklUUkFURV9UQVJHRVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0JJVFJBVEVfVEFSR0VUIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9CSVRSQVRFX1RBUkdFVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfQklUUkFURV9UQVJHRVQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9DSEFOTkVMX1BPTElDWQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9DSEFOTkVMX1BPTElDWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfQ0hBTk5FTF9QT0xJQ1kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0NIQU5ORUxfUE9MSUNZKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9DSEFOTkVMX1BPTElDWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX0NPTlNUX1FVQUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfQ09OU1RfUVVBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfQ09OU1RfUVVBTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfQ09OU1RfUVVBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfQ09OU1RfUVVBTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX0VSUk9SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0VSUk9SKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9FUlJPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfRVJST1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0VSUk9SIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfRklYRURfUkFURQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9GSVhFRF9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9GSVhFRF9SQVRFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9GSVhFRF9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9GSVhFRF9SQVRFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfSU5ERVBFTkRFTlQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfSU5ERVBFTkRFTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0lOREVQRU5ERU5UIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9JTkRFUEVOREVOVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfSU5ERVBFTkRFTlQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9KT0lOVF9TVEVSRU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfSk9JTlRfU1RFUkVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9KT0lOVF9TVEVSRU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0pPSU5UX1NURVJFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfSk9JTlRfU1RFUkVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfTEFZRVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTEFZRVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX0xBWUVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9MQVlFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTEFZRVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9MT1NTTEVTUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9MT1NTTEVTUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTE9TU0xFU1MiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX0xPU1NMRVNTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9MT1NTTEVTUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX01QRUdfQVVESU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTVBFR19BVURJTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTVBFR19BVURJTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTVBFR19BVURJTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTVBFR19BVURJTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX01QRUdfTEFZRVJfSQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9NUEVHX0xBWUVSX0kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX01QRUdfTEFZRVJfSSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTVBFR19MQVlFUl9JKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9NUEVHX0xBWUVSX0kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9NUEVHX0xBWUVSX0lJCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX01QRUdfTEFZRVJfSUkpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX01QRUdfTEFZRVJfSUkiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX01QRUdfTEFZRVJfSUkpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX01QRUdfTEFZRVJfSUkiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9BV0FSRV9NVUxUSVJBVEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfTVVMVElSQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9NVUxUSVJBVEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX01VTFRJUkFURSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTVVMVElSQVRFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQVdBUkVfTk9JU0VfTUFSR0lOCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0FXQVJFX05PSVNFX01BUkdJTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdBUkVfTk9JU0VfTUFSR0lOIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9OT0lTRV9NQVJHSU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX05PSVNFX01BUkdJTiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0FXQVJFX1NURVJFTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9BV0FSRV9TVEVSRU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQVJFX1NURVJFTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQVdBUkVfU1RFUkVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0FSRV9TVEVSRU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQUxHT1JJVEhNX05BTUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0FMR09SSVRITV9OQU1FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQUxHT1JJVEhNX05BTUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9BTEdPUklUSE1fTkFNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0FMR09SSVRITV9OQU1FIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0FMR09SSVRITV9UWVBFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9BTEdPUklUSE1fVFlQRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0FMR09SSVRITV9UWVBFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQUxHT1JJVEhNX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9BTEdPUklUSE1fVFlQRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CTE9DS19TSVpFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CTE9DS19TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQkxPQ0tfU0laRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JMT0NLX1NJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CTE9DS19TSVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JPQVJECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CT0FSRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JPQVJEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQk9BUkQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CT0FSRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJJTkcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUklORyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUklORyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUklORyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUklORyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJMRU5HVEhfTkVHCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJMRU5HVEhfTkVHKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSTEVOR1RIX05FRyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUkxFTkdUSF9ORUcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEhfTkVHIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JVRkZFUkxFTkdUSF9PREQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUkxFTkdUSF9PREQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJMRU5HVEhfT0REIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSTEVOR1RIX09ERCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUkxFTkdUSF9PREQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQlVGRkVSX0VYSVNUUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX0VYSVNUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9FWElTVFMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfRVhJU1RTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX0VYSVNUUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJfSEFORExFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfSEFORExFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX0hBTkRMRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9IQU5ETEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfSEFORExFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JVRkZFUl9QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfUE9JTlRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfUE9JTlRFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9CVUZGRVJfUVVFUllfU0laRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX1FVRVJZX1NJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfUVVFUllfU0laRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9RVUVSWV9TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX1FVRVJZX1NJWkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQlVGRkVSX1NJWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX1NJWkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9TSVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0JVRkZFUl9TSVpFX1BPSU5URVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9TSVpFX1BPSU5URVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9CVUZGRVJfU0laRV9QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQlVGRkVSX1NJWkVfUE9JTlRFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9TSVpFX1BPSU5URVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfQlVGRkVSX1RZUEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0JVRkZFUl9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQlVGRkVSX1RZUEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9CVUZGRVJfVFlQRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0JVRkZFUl9UWVBFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0NPTVBSRVNTSU9OX1NDSEVNRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQ09NUFJFU1NJT05fU0NIRU1FKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09NUFJFU1NJT05fU0NIRU1FIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQ09NUFJFU1NJT05fU0NIRU1FKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09NUFJFU1NJT05fU0NIRU1FIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0NPTVBSRVNTT1JfSEFORExFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9DT01QUkVTU09SX0hBTkRMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0NPTVBSRVNTT1JfSEFORExFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfQ09NUFJFU1NPUl9IQU5ETEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DT01QUkVTU09SX0hBTkRMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9DT01QUkVTU09SX0hBTkRMRV9QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9DT01QUkVTU09SX0hBTkRMRV9QT0lOVEVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfQ09NUFJFU1NPUl9IQU5ETEVfUE9JTlRFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0NPTVBSRVNTT1JfSEFORExFX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9DT01QUkVTU09SX0hBTkRMRV9QT0lOVEVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0ZSQU1FX1NJWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0ZSQU1FX1NJWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9GUkFNRV9TSVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfRlJBTUVfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0ZSQU1FX1NJWkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfRlVOQ1RJT05BTElUWQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfRlVOQ1RJT05BTElUWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0ZVTkNUSU9OQUxJVFkiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9GVU5DVElPTkFMSVRZKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRlVOQ1RJT05BTElUWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9GVU5DVElPTl9QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9GVU5DVElPTl9QT0lOVEVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfRlVOQ1RJT05fUE9JTlRFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0ZVTkNUSU9OX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9GVU5DVElPTl9QT0lOVEVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0hFQURFUl9TSVpFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9IRUFERVJfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0hFQURFUl9TSVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfSEVBREVSX1NJWkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9IRUFERVJfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9JTklUSUFMX1ZBTFVFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9JTklUSUFMX1ZBTFVFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfSU5JVElBTF9WQUxVRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0lOSVRJQUxfVkFMVUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9JTklUSUFMX1ZBTFVFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0lOVEVSTkFMX0ZPUk1BVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfSU5URVJOQUxfRk9STUFUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfSU5URVJOQUxfRk9STUFUIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfSU5URVJOQUxfRk9STUFUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfSU5URVJOQUxfRk9STUFUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX0xJQ0VOU0UKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX0xJQ0VOU0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9MSUNFTlNFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfTElDRU5TRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX0xJQ0VOU0UiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfTUlOX0dUX01BWAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfTUlOX0dUX01BWCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX01JTl9HVF9NQVgiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9NSU5fR1RfTUFYKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTUlOX0dUX01BWCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9OT19CVUZGRVJTUEFDRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfTk9fQlVGRkVSU1BBQ0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9OT19CVUZGRVJTUEFDRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX05PX0JVRkZFUlNQQUNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTk9fQlVGRkVSU1BBQ0UiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfTlVNQkVSX09GX0JMT0NLUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfTlVNQkVSX09GX0JMT0NLUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX05VTUJFUl9PRl9CTE9DS1MiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9OVU1CRVJfT0ZfQkxPQ0tTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfTlVNQkVSX09GX0JMT0NLUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9QQVJBTQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfUEFSQU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QQVJBTSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BBUkFNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEFSQU0iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfUEFSQU1fSURfUE9JTlRFUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfUEFSQU1fSURfUE9JTlRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BBUkFNX0lEX1BPSU5URVIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9QQVJBTV9JRF9QT0lOVEVSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEFSQU1fSURfUE9JTlRFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9QQVJBTV9UWVBFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9QQVJBTV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUEFSQU1fVFlQRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BBUkFNX1RZUEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QQVJBTV9UWVBFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX1BPSU5URVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BPSU5URVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfUE9JTlRFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BPSU5URVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CQURfUFZCVUZGRVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1BWQlVGRkVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfUFZCVUZGRVIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9QVkJVRkZFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1BWQlVGRkVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX1NDSEVNRV9QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9TQ0hFTUVfUE9JTlRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1NDSEVNRV9QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfU0NIRU1FX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9TQ0hFTUVfUE9JTlRFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9TVFJFQU1fSEVBREVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9TVFJFQU1fSEVBREVSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCQURfU1RSRUFNX0hFQURFUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1NUUkVBTV9IRUFERVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9TVFJFQU1fSEVBREVSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQkFEX1NUUklOR19QT0lOVEVSCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JBRF9TVFJJTkdfUE9JTlRFUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1NUUklOR19QT0lOVEVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CQURfU1RSSU5HX1BPSU5URVIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJBRF9TVFJJTkdfUE9JTlRFUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JBRF9URVhUX1NUUklOR19QVFIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1RFWFRfU1RSSU5HX1BUUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1RFWFRfU1RSSU5HX1BUUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkFEX1RFWFRfU1RSSU5HX1BUUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkFEX1RFWFRfU1RSSU5HX1BUUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JFU1RfRklUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0JFU1RfRklUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCRVNUX0ZJVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkVTVF9GSVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJFU1RfRklUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQklESVJFQ1RJT05BTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CSURJUkVDVElPTkFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSURJUkVDVElPTkFMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CSURJUkVDVElPTkFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSURJUkVDVElPTkFMIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQklUUkFURQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRSQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSVRSQVRFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRSQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSVRSQVRFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQklUUkFURV9QT0xJQ1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklUUkFURV9QT0xJQ1kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJJVFJBVEVfUE9MSUNZIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRSQVRFX1BPTElDWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQklUUkFURV9QT0xJQ1kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CSVRSQVRFX1RBUkdFVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRSQVRFX1RBUkdFVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQklUUkFURV9UQVJHRVQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JJVFJBVEVfVEFSR0VUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSVRSQVRFX1RBUkdFVCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JJVFNfUEVSX0NPTVBPTkVOVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CSVRTX1BFUl9DT01QT05FTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJJVFNfUEVSX0NPTVBPTkVOVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQklUU19QRVJfQ09NUE9ORU5UKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCSVRTX1BFUl9DT01QT05FTlQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CTEVORElORwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CTEVORElORyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxFTkRJTkciLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JMRU5ESU5HKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCTEVORElORyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JMT0NLX1NJWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkxPQ0tfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxPQ0tfU0laRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQkxPQ0tfU0laRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQkxPQ0tfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JPVFRPTV9VUAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CT1RUT01fVVApOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJPVFRPTV9VUCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQk9UVE9NX1VQKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCT1RUT01fVVAiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CVUZGRVJfTk9UX0NSRUFURUQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQlVGRkVSX05PVF9DUkVBVEVEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCVUZGRVJfTk9UX0NSRUFURUQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JVRkZFUl9OT1RfQ1JFQVRFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQlVGRkVSX05PVF9DUkVBVEVEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQlVGX0NPTVBSRVNTRUQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQlVGX0NPTVBSRVNTRUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJVRl9DT01QUkVTU0VEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9CVUZfQ09NUFJFU1NFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQlVGX0NPTVBSRVNTRUQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9CVUZfREFUQQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CVUZfREFUQSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQlVGX0RBVEEiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0JVRl9EQVRBKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCVUZfREFUQSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0JVRl9GUkFNRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9CVUZfRlJBTUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkJVRl9GUkFNRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQlVGX0ZSQU1FKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCVUZfRlJBTUUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DSEFOTkVMX1BPTElDWQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DSEFOTkVMX1BPTElDWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hBTk5FTF9QT0xJQ1kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NIQU5ORUxfUE9MSUNZKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDSEFOTkVMX1BPTElDWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0NIUk9NQV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ0hST01BX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hST01BX1RIUkVTSE9MRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ0hST01BX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ0hST01BX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0NPREVDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPREVDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT0RFQyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09ERUMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPREVDIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09NUE9ORU5UUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QT05FTlRTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QT05FTlRTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QT05FTlRTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QT05FTlRTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09NUFJFU1NFRF9CVUZGRVJfU0laRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QUkVTU0VEX0JVRkZFUl9TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QUkVTU0VEX0JVRkZFUl9TSVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QUkVTU0VEX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT01QUkVTU0VEX0JVRkZFUl9TSVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfQ09NUFJFU1NJT05fUkFUSU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09NUFJFU1NJT05fUkFUSU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTVBSRVNTSU9OX1JBVElPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9DT01QUkVTU0lPTl9SQVRJTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09NUFJFU1NJT05fUkFUSU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT01QUkVTU09SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTVBSRVNTT1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTVBSRVNTT1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTVBSRVNTT1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTVBSRVNTT1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT05USU5VT1VTX0JMT0NLCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTlRJTlVPVVNfQkxPQ0spOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTlRJTlVPVVNfQkxPQ0siLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTlRJTlVPVVNfQkxPQ0spOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTlRJTlVPVVNfQkxPQ0siLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT05USU5VT1VTX05PTkJMT0NLCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTlRJTlVPVVNfTk9OQkxPQ0spOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTlRJTlVPVVNfTk9OQkxPQ0siLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPTlRJTlVPVVNfTk9OQkxPQ0spOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPTlRJTlVPVVNfTk9OQkxPQ0siLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT1NNT19DT0RFQ19DT05UUk9MCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX0NPREVDX0NPTlRST0wpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX0NPREVDX0NPTlRST0wiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX0NPREVDX0NPTlRST0wpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX0NPREVDX0NPTlRST0wiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT1NNT19OVU1fUEFSQU1TCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX05VTV9QQVJBTVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX05VTV9QQVJBTVMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX05VTV9QQVJBTVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX05VTV9QQVJBTVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT1NNT19WQUxVRV9CQVNFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX1ZBTFVFX0JBU0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX1ZBTFVFX0JBU0UiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX1ZBTFVFX0JBU0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNPU01PX1ZBTFVFX0JBU0UiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9DT1NNT19WSURFT19NQU5VQUxfQ09OVFJPTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9DT1NNT19WSURFT19NQU5VQUxfQ09OVFJPTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09TTU9fVklERU9fTUFOVUFMX0NPTlRST0wiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0NPU01PX1ZJREVPX01BTlVBTF9DT05UUk9MKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDT1NNT19WSURFT19NQU5VQUxfQ09OVFJPTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0NPU01PX1ZJREVPX1RSQU5TRkVSX01PREUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09TTU9fVklERU9fVFJBTlNGRVJfTU9ERSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09TTU9fVklERU9fVFJBTlNGRVJfTU9ERSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfQ09TTU9fVklERU9fVFJBTlNGRVJfTU9ERSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ09TTU9fVklERU9fVFJBTlNGRVJfTU9ERSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0RBVEEKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfREFUQSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREFUQSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfREFUQSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiREFUQSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0RFQ09NUFJFU1NPUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9ERUNPTVBSRVNTT1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkRFQ09NUFJFU1NPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfREVDT01QUkVTU09SKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJERUNPTVBSRVNTT1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9EU09fRVJST1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRFNPX0VSUk9SKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJEU09fRVJST1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0RTT19FUlJPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRFNPX0VSUk9SIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRURHRV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRURHRV9USFJFU0hPTEQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVER0VfVEhSRVNIT0xEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9FREdFX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRURHRV9USFJFU0hPTEQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9FTkFCTEVfSU1BR0VJTkZPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0VOQUJMRV9JTUFHRUlORk8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVOQUJMRV9JTUFHRUlORk8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0VOQUJMRV9JTUFHRUlORk8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVOQUJMRV9JTUFHRUlORk8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9FTkRfT0ZfU0VRVUVOQ0UKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRU5EX09GX1NFUVVFTkNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTkRfT0ZfU0VRVUVOQ0UiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0VORF9PRl9TRVFVRU5DRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRU5EX09GX1NFUVVFTkNFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRU5VTV9WQUxVRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9FTlVNX1ZBTFVFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTlVNX1ZBTFVFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9FTlVNX1ZBTFVFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFTlVNX1ZBTFVFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRVhBQ1RfQ09NUFJFU1NJT05fUkFUSU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRVhBQ1RfQ09NUFJFU1NJT05fUkFUSU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVYQUNUX0NPTVBSRVNTSU9OX1JBVElPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9FWEFDVF9DT01QUkVTU0lPTl9SQVRJTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVhBQ1RfQ09NUFJFU1NJT05fUkFUSU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9FWFRFUk5BTF9ERVZJQ0UKLQl4ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIENMX0VYVEVSTkFMX0RFVklDRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRVhURVJOQUxfREVWSUNFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZygobG9uZykgQ0xfRVhURVJOQUxfREVWSUNFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFWFRFUk5BTF9ERVZJQ0UiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GTE9BVElOR19FTlVNX1ZBTFVFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZMT0FUSU5HX0VOVU1fVkFMVUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZMT0FUSU5HX0VOVU1fVkFMVUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZMT0FUSU5HX0VOVU1fVkFMVUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZMT0FUSU5HX0VOVU1fVkFMVUUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GTE9BVElOR19SQU5HRV9WQUxVRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GTE9BVElOR19SQU5HRV9WQUxVRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRkxPQVRJTkdfUkFOR0VfVkFMVUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZMT0FUSU5HX1JBTkdFX1ZBTFVFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGTE9BVElOR19SQU5HRV9WQUxVRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GT1JNQVRfQUJHUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfQUJHUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0FCR1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9BQkdSKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfQUJHUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9CR1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0JHUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0JHUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0JHUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0JHUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9CR1IyMzMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0JHUjIzMyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0JHUjIzMyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0JHUjIzMyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0JHUjIzMyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9HUkFZU0NBTEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0dSQVlTQ0FMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0dSQVlTQ0FMRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX0dSQVlTQ0FMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX0dSQVlTQ0FMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9NT05PCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9NT05PKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfTU9OTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX01PTk8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9NT05PIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRk9STUFUX1JCRzMyMwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfUkJHMzIzKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfUkJHMzIzIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfUkJHMzIzKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfUkJHMzIzIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRk9STUFUX1NURVJFT19JTlRFUkxFQVZFRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfU1RFUkVPX0lOVEVSTEVBVkVEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfU1RFUkVPX0lOVEVSTEVBVkVEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfU1RFUkVPX0lOVEVSTEVBVkVEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfU1RFUkVPX0lOVEVSTEVBVkVEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRk9STUFUX1hCR1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1hCR1IpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9YQkdSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfWEJHUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1hCR1IiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GT1JNQVRfWUNiQ3IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1lDYkNyKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfWUNiQ3IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9ZQ2JDcik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1lDYkNyIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRk9STUFUX1lDYkNyNDIyCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9ZQ2JDcjQyMik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRk9STUFUX1lDYkNyNDIyIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GT1JNQVRfWUNiQ3I0MjIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9ZQ2JDcjQyMiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZPUk1BVF9ZQ2JDcjQyMkRDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZPUk1BVF9ZQ2JDcjQyMkRDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGT1JNQVRfWUNiQ3I0MjJEQyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRk9STUFUX1lDYkNyNDIyREMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZPUk1BVF9ZQ2JDcjQyMkRDIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRlJBTUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GUkFNRVNfUEVSX0NIVU5LCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FU19QRVJfQ0hVTkspOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FU19QRVJfQ0hVTksiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FU19QRVJfQ0hVTkspOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FU19QRVJfQ0hVTksiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9GUkFNRV9CVUZGRVJfU0laRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9CVUZGRVJfU0laRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfQlVGRkVSX1NJWkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FX0JVRkZFUl9TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9CVUZGRVJfU0laRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZSQU1FX0JVRkZFUl9TSVpFX1pFUk8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfQlVGRkVSX1NJWkVfWkVSTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfQlVGRkVSX1NJWkVfWkVSTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfQlVGRkVSX1NJWkVfWkVSTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRlJBTUVfQlVGRkVSX1NJWkVfWkVSTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0ZSQU1FX0lOREVYCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0ZSQU1FX0lOREVYKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9JTkRFWCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRlJBTUVfSU5ERVgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkZSQU1FX0lOREVYIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRlJBTUVfUkFURQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9SQVRFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9SQVRFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRlJBTUVfU0laRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9TSVpFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9TSVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9TSVpFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9TSVpFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRlJBTUVfVFlQRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9UWVBFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9UWVBFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9GUkFNRV9UWVBFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGUkFNRV9UWVBFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRzcxMV9BTEFXCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0c3MTFfQUxBVyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRzcxMV9BTEFXIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9HNzExX0FMQVcpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkc3MTFfQUxBVyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0c3MTFfQUxBV19TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9HNzExX0FMQVdfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkc3MTFfQUxBV19TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRzcxMV9BTEFXX1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHNzExX0FMQVdfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9HNzExX1VMQVcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfRzcxMV9VTEFXKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHNzExX1VMQVciLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0c3MTFfVUxBVyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRzcxMV9VTEFXIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfRzcxMV9VTEFXX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0c3MTFfVUxBV19TT0ZUV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRzcxMV9VTEFXX1NPRlRXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9HNzExX1VMQVdfU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkc3MTFfVUxBV19TT0ZUV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0dSQVlTQ0FMRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9HUkFZU0NBTEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkdSQVlTQ0FMRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfR1JBWVNDQUxFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJHUkFZU0NBTEUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9IRENDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0hEQ0MpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhEQ0MiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0hEQ0MpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhEQ0MiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9IRENDX1NBTVBMRVNfUEVSX1RJTEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSERDQ19TQU1QTEVTX1BFUl9USUxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDX1NBTVBMRVNfUEVSX1RJTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0hEQ0NfU0FNUExFU19QRVJfVElMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSERDQ19TQU1QTEVTX1BFUl9USUxFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSERDQ19TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDX1NPRlRXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDX1NPRlRXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDX1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDX1NPRlRXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSERDQ19USUxFX1RIUkVTSE9MRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDX1RJTEVfVEhSRVNIT0xEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDX1RJTEVfVEhSRVNIT0xEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9IRENDX1RJTEVfVEhSRVNIT0xEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJIRENDX1RJTEVfVEhSRVNIT0xEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSEVBREVSX1NUQVJUX0NPREUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSEVBREVSX1NUQVJUX0NPREUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkhFQURFUl9TVEFSVF9DT0RFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9IRUFERVJfU1RBUlRfQ09ERSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSEVBREVSX1NUQVJUX0NPREUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRUlORk9fRklFTERNQVNLCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFSU5GT19GSUVMRE1BU0spOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFSU5GT19GSUVMRE1BU0siLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFSU5GT19GSUVMRE1BU0spOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFSU5GT19GSUVMRE1BU0siLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRV9DUk9QX0JPVFRPTQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9DUk9QX0JPVFRPTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfQ1JPUF9CT1RUT00iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX0NST1BfQk9UVE9NKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9DUk9QX0JPVFRPTSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0lNQUdFX0NST1BfTEVGVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9DUk9QX0xFRlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX0NST1BfTEVGVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1BR0VfQ1JPUF9MRUZUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9DUk9QX0xFRlQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRV9DUk9QX1JJR0hUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX0NST1BfUklHSFQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX0NST1BfUklHSFQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX0NST1BfUklHSFQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX0NST1BfUklHSFQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRV9DUk9QX1RPUAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9DUk9QX1RPUCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfQ1JPUF9UT1AiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX0NST1BfVE9QKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9DUk9QX1RPUCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0lNQUdFX0hFSUdIVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9IRUlHSFQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNQUdFX0hFSUdIVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1BR0VfSEVJR0hUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9IRUlHSFQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTUFHRV9XSURUSAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTUFHRV9XSURUSCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1BR0VfV0lEVEgiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNQUdFX1dJRFRIKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTUFHRV9XSURUSCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0lNUEFDVF9DT0RFQ19DT05UUk9MCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNUEFDVF9DT0RFQ19DT05UUk9MKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTVBBQ1RfQ09ERUNfQ09OVFJPTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1QQUNUX0NPREVDX0NPTlRST0wpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNUEFDVF9DT0RFQ19DT05UUk9MIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU1QQUNUX0ZSQU1FX0lOVEVSTEVBVkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU1QQUNUX0ZSQU1FX0lOVEVSTEVBVkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklNUEFDVF9GUkFNRV9JTlRFUkxFQVZFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTVBBQ1RfRlJBTUVfSU5URVJMRUFWRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1QQUNUX0ZSQU1FX0lOVEVSTEVBVkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTVBBQ1RfTlVNX1BBUkFNUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTVBBQ1RfTlVNX1BBUkFNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU1QQUNUX05VTV9QQVJBTVMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lNUEFDVF9OVU1fUEFSQU1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTVBBQ1RfTlVNX1BBUkFNUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0lOVEVSTkFMX0ZPUk1BVAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTlRFUk5BTF9GT1JNQVQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVEVSTkFMX0ZPUk1BVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU5URVJOQUxfRk9STUFUKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRFUk5BTF9GT1JNQVQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTlRFUk5BTF9JTUFHRV9IRUlHSFQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU5URVJOQUxfSU1BR0VfSEVJR0hUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRFUk5BTF9JTUFHRV9IRUlHSFQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lOVEVSTkFMX0lNQUdFX0hFSUdIVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5URVJOQUxfSU1BR0VfSEVJR0hUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSU5URVJOQUxfSU1BR0VfV0lEVEgKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSU5URVJOQUxfSU1BR0VfV0lEVEgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIklOVEVSTkFMX0lNQUdFX1dJRFRIIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9JTlRFUk5BTF9JTUFHRV9XSURUSCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5URVJOQUxfSU1BR0VfV0lEVEgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9JTlRSQQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9JTlRSQSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSU5UUkEiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0lOVFJBKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJJTlRSQSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFRyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFRyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFRyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFRyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfQ09TTU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19DT1NNTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19DT1NNTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19DT1NNTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19DT1NNTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfRVJST1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19FUlJPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19FUlJPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfSU1QQUNUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfSU1QQUNUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX0lNUEFDVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19JTVBBQ1QpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfSU1QQUNUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfSlBFR19OVU1fUEFSQU1TCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfTlVNX1BBUkFNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19OVU1fUEFSQU1TIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9KUEVHX05VTV9QQVJBTVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfTlVNX1BBUkFNUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfUVVBTElUWV9GQUNUT1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19RVUFMSVRZX0ZBQ1RPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19RVUFMSVRZX0ZBQ1RPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19RVUFMSVRZX0ZBQ1RPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSlBFR19RVUFMSVRZX0ZBQ1RPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0pQRUdfUVVBTlRJWkFUSU9OX1RBQkxFUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9KUEVHX1FVQU5USVpBVElPTl9UQUJMRVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfUVVBTlRJWkFUSU9OX1RBQkxFUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfSlBFR19RVUFOVElaQVRJT05fVEFCTEVTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKUEVHX1FVQU5USVpBVElPTl9UQUJMRVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9KUEVHX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9KUEVHX1NUUkVBTV9IRUFERVJTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfU1RSRUFNX0hFQURFUlMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfU1RSRUFNX0hFQURFUlMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0pQRUdfU1RSRUFNX0hFQURFUlMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpQRUdfU1RSRUFNX0hFQURFUlMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9LRVlGUkFNRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9LRVlGUkFNRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiS0VZRlJBTUUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0tFWUZSQU1FKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJLRVlGUkFNRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX0tFWUZSQU1FX0RJU1RBTkNFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX0tFWUZSQU1FX0RJU1RBTkNFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJLRVlGUkFNRV9ESVNUQU5DRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfS0VZRlJBTUVfRElTVEFOQ0UpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIktFWUZSQU1FX0RJU1RBTkNFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTEFTVF9GUkFNRV9JTkRFWAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9MQVNUX0ZSQU1FX0lOREVYKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMQVNUX0ZSQU1FX0lOREVYIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9MQVNUX0ZSQU1FX0lOREVYKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMQVNUX0ZSQU1FX0lOREVYIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTEFZRVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTEFZRVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkxBWUVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9MQVlFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTEFZRVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9MVU1BX1RIUkVTSE9MRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9MVU1BX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTFVNQV9USFJFU0hPTEQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX0xVTUFfVEhSRVNIT0xEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMVU1BX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01BWF9OVU1CRVJfT0ZfQVVESU9fQUxHT1JJVEhNUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NQVhfTlVNQkVSX09GX0FVRElPX0FMR09SSVRITVMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfQVVESU9fQUxHT1JJVEhNUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTUFYX05VTUJFUl9PRl9BVURJT19BTEdPUklUSE1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfTlVNQkVSX09GX0FVRElPX0FMR09SSVRITVMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NQVhfTlVNQkVSX09GX0ZPUk1BVFMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTUFYX05VTUJFUl9PRl9GT1JNQVRTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfTlVNQkVSX09GX0ZPUk1BVFMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfRk9STUFUUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX05VTUJFUl9PRl9GT1JNQVRTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTUFYX05VTUJFUl9PRl9PUklHSU5BTF9GT1JNQVRTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfT1JJR0lOQUxfRk9STUFUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX05VTUJFUl9PRl9PUklHSU5BTF9GT1JNQVRTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NQVhfTlVNQkVSX09GX09SSUdJTkFMX0ZPUk1BVFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfT1JJR0lOQUxfRk9STUFUUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01BWF9OVU1CRVJfT0ZfUEFSQU1TCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfUEFSQU1TKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNQVhfTlVNQkVSX09GX1BBUkFNUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTUFYX05VTUJFUl9PRl9QQVJBTVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfUEFSQU1TIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTUFYX05VTUJFUl9PRl9WSURFT19BTEdPUklUSE1TCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01BWF9OVU1CRVJfT0ZfVklERU9fQUxHT1JJVEhNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUFYX05VTUJFUl9PRl9WSURFT19BTEdPUklUSE1TIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NQVhfTlVNQkVSX09GX1ZJREVPX0FMR09SSVRITVMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1BWF9OVU1CRVJfT0ZfVklERU9fQUxHT1JJVEhNUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01PTk8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTU9OTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTU9OTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTU9OTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX0FVRElPX0FXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX0FXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19BV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fQVdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX0FXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfQVVESU9fTEFZRVIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTEFZRVIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX0xBWUVSIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19MQVlFUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTEFZRVIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19MQVlFUl9JCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX0xBWUVSX0kpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX0xBWUVSX0kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX0xBWUVSX0kpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX0xBWUVSX0kiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19MQVlFUl9JSQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19MQVlFUl9JSSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTEFZRVJfSUkiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX0xBWUVSX0lJKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19MQVlFUl9JSSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX0FVRElPX01PREUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTU9ERSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTU9ERSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTU9ERSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTU9ERSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX0FVRElPX01PREVfRFVBTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19NT0RFX0RVQUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREVfRFVBTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTU9ERV9EVUFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19NT0RFX0RVQUwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19NT0RFX0pPSU5UCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREVfSk9JTlQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREVfSk9JTlQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREVfSk9JTlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREVfSk9JTlQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9BVURJT19NT0RFX1NJTkdMRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19NT0RFX1NJTkdMRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fTU9ERV9TSU5HTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREVfU0lOR0xFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19NT0RFX1NJTkdMRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX0FVRElPX01PREVfU1RFUkVPCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0FVRElPX01PREVfU1RFUkVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9BVURJT19NT0RFX1NURVJFTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fTU9ERV9TVEVSRU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX01PREVfU1RFUkVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfQVVESU9fU09GVFdBUkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfQVVESU9fU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0FVRElPX1NPRlRXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9BVURJT19TT0ZUV0FSRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfQVVESU9fU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9FTkRfT0ZfU1RSRUFNCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0VORF9PRl9TVFJFQU0pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0VORF9PRl9TVFJFQU0iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0VORF9PRl9TVFJFQU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX0VORF9PRl9TVFJFQU0iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NUEVHMV9FUlJPUgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfRVJST1IiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX0VSUk9SKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX05VTV9QQVJBTVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfTlVNX1BBUkFNUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfTlVNX1BBUkFNUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfTlVNX1BBUkFNUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfTlVNX1BBUkFNUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX00KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1gKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9CX1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX0JfWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1gKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX01BWF9NT1RJT05fVkVDVE9SX0xFTkdUSF9QX1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTUFYX01PVElPTl9WRUNUT1JfTEVOR1RIX1BfWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX04KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fTik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fTiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX1NPRlRORVNTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX1NPRlRORVNTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUTkVTUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVE5FU1MpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX1NPRlRORVNTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTUFYSU1VTQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9WSURFT19TT0ZUTkVTU19NQVhJTVVNKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUTkVTU19NQVhJTVVNIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9WSURFT19TT0ZUTkVTU19NQVhJTVVNKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUTkVTU19NQVhJTVVNIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTUVESVVNCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX1NPRlRORVNTX01FRElVTSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fU09GVE5FU1NfTUVESVVNIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHMV9WSURFT19TT0ZUTkVTU19NRURJVU0pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX1NPRlRORVNTX01FRElVTSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX1NPRlRORVNTX05PTkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTk9ORSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fU09GVE5FU1NfTk9ORSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVE5FU1NfTk9ORSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVBFRzFfVklERU9fU09GVE5FU1NfTk9ORSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01QRUcxX1ZJREVPX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01QRUcxX1ZJREVPX1NPRlRXQVJFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHMV9WSURFT19TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVBFRzFfVklERU9fU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1QRUcxX1ZJREVPX1NPRlRXQVJFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVBFR19WSURFTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHX1ZJREVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHX1ZJREVPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NUEVHX1ZJREVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNUEVHX1ZJREVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVVMVElSQVRFX0FXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01VTFRJUkFURV9BV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVVMVElSQVRFX0FXQVJFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NVUxUSVJBVEVfQVdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1VTFRJUkFURV9BV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzEKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzFfU09GVFdBUkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMV9TT0ZUV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMV9TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMV9TT0ZUV0FSRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMV9TT0ZUV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfQkxFTkRJTkcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9CTEVORElORyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9CTEVORElORyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9CTEVORElORyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9CTEVORElORyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfQkxFTkRJTkdfT0ZGCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfQkxFTkRJTkdfT0ZGKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMyX0JMRU5ESU5HX09GRiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9CTEVORElOR19PRkYpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfQkxFTkRJTkdfT0ZGIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVZDMl9CTEVORElOR19PTgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMyX0JMRU5ESU5HX09OKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMyX0JMRU5ESU5HX09OIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMyX0JMRU5ESU5HX09OKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMyX0JMRU5ESU5HX09OIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTVZDMl9DSFJPTUFfVEhSRVNIT0xECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzJfQ0hST01BX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9DSFJPTUFfVEhSRVNIT0xEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMyX0NIUk9NQV9USFJFU0hPTEQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzJfQ0hST01BX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfRURHRV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9FREdFX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9FREdFX1RIUkVTSE9MRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9FREdFX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9FREdFX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfRVJST1IKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9FUlJPUik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9FUlJPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9FUlJPUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9FUlJPUiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfTFVNQV9USFJFU0hPTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9MVU1BX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9MVU1BX1RIUkVTSE9MRCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9MVU1BX1RIUkVTSE9MRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9MVU1BX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzJfU09GVFdBUkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9TT0ZUV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDMl9TT0ZUV0FSRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTVZDMl9TT0ZUV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX01WQzNfUVVBTElUWV9MRVZFTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9NVkMzX1FVQUxJVFlfTEVWRUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzNfUVVBTElUWV9MRVZFTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTVZDM19RVUFMSVRZX0xFVkVMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJNVkMzX1FVQUxJVFlfTEVWRUwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9NVkMzX1NPRlRXQVJFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzNfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzNfU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX01WQzNfU09GVFdBUkUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1WQzNfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ORVhUX05PVF9BVkFJTEFCTEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTkVYVF9OT1RfQVZBSUxBQkxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJORVhUX05PVF9BVkFJTEFCTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX05FWFRfTk9UX0FWQUlMQUJMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTkVYVF9OT1RfQVZBSUxBQkxFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTk9JU0VfTUFSR0lOCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX05PSVNFX01BUkdJTik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9JU0VfTUFSR0lOIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9OT0lTRV9NQVJHSU4pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5PSVNFX01BUkdJTiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX05PTkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTk9ORSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9ORSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTk9ORSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTk9ORSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX05VTUJFUl9PRl9GT1JNQVRTCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX05VTUJFUl9PRl9GT1JNQVRTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfRk9STUFUUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTlVNQkVSX09GX0ZPUk1BVFMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5VTUJFUl9PRl9GT1JNQVRTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTlVNQkVSX09GX0ZSQU1FUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfRlJBTUVTKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfRlJBTUVTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfRlJBTUVTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfRlJBTUVTIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTlVNQkVSX09GX1BBUkFNUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfUEFSQU1TKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfUEFSQU1TIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfUEFSQU1TKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfUEFSQU1TIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfTlVNQkVSX09GX1BBUkFNU19GUkVFWkUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfTlVNQkVSX09GX1BBUkFNU19GUkVFWkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5VTUJFUl9PRl9QQVJBTVNfRlJFRVpFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfUEFSQU1TX0ZSRUVaRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVNQkVSX09GX1BBUkFNU19GUkVFWkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9OVU1CRVJfT0ZfVklERU9fRk9STUFUUwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9OVU1CRVJfT0ZfVklERU9fRk9STUFUUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlVNQkVSX09GX1ZJREVPX0ZPUk1BVFMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX05VTUJFUl9PRl9WSURFT19GT1JNQVRTKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOVU1CRVJfT0ZfVklERU9fRk9STUFUUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX09SSUVOVEFUSU9OCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX09SSUVOVEFUSU9OKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJPUklFTlRBVElPTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfT1JJRU5UQVRJT04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9SSUVOVEFUSU9OIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfT1JJR0lOQUxfRk9STUFUCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX09SSUdJTkFMX0ZPUk1BVCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiT1JJR0lOQUxfRk9STUFUIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9PUklHSU5BTF9GT1JNQVQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk9SSUdJTkFMX0ZPUk1BVCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1BBUkFNX09VVF9PRl9SQU5HRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9QQVJBTV9PVVRfT0ZfUkFOR0UpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBBUkFNX09VVF9PRl9SQU5HRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUEFSQU1fT1VUX09GX1JBTkdFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQQVJBTV9PVVRfT0ZfUkFOR0UiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9QSVhFTF9BU1BFQ1QKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUElYRUxfQVNQRUNUKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJQSVhFTF9BU1BFQ1QiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1BJWEVMX0FTUEVDVCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUElYRUxfQVNQRUNUIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUFJFRElDVEVECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1BSRURJQ1RFRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUFJFRElDVEVEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9QUkVESUNURUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBSRURJQ1RFRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1BSRVJPTEwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUFJFUk9MTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUFJFUk9MTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUFJFUk9MTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUFJFUk9MTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1FVQUxJVFlfRkFDVE9SCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1FVQUxJVFlfRkFDVE9SKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJRVUFMSVRZX0ZBQ1RPUiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTElUWV9GQUNUT1IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlFVQUxJVFlfRkFDVE9SIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUVVBTElUWV9MRVZFTAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9RVUFMSVRZX0xFVkVMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJRVUFMSVRZX0xFVkVMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9RVUFMSVRZX0xFVkVMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJRVUFMSVRZX0xFVkVMIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUVVBTElUWV9TUEFUSUFMCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1FVQUxJVFlfU1BBVElBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTElUWV9TUEFUSUFMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9RVUFMSVRZX1NQQVRJQUwpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlFVQUxJVFlfU1BBVElBTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1FVQUxJVFlfVEVNUE9SQUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTElUWV9URU1QT1JBTCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTElUWV9URU1QT1JBTCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTElUWV9URU1QT1JBTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTElUWV9URU1QT1JBTCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1FVQU5USVpBVElPTl9UQUJMRVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTlRJWkFUSU9OX1RBQkxFUyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTlRJWkFUSU9OX1RBQkxFUyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUVVBTlRJWkFUSU9OX1RBQkxFUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTlRJWkFUSU9OX1RBQkxFUyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1JBTkdFX1ZBTFVFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JBTkdFX1ZBTFVFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSQU5HRV9WQUxVRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkFOR0VfVkFMVUUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJBTkdFX1ZBTFVFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUkdCCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkdCIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1JHQjMzMgotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9SR0IzMzIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQjMzMiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkdCMzMyKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSR0IzMzIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9SR0I4Ci0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQjgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQjgiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQjgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQjgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9SR0JBCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQkEpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQkEiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQkEpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQkEiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9SR0JYCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQlgpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQlgiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JHQlgpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJHQlgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9STEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JMRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkxFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUkxFMjQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkxFMjQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJMRTI0IiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9STEUyNCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkxFMjQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9STEUyNF9TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9STEUyNF9TT0ZUV0FSRSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUkxFMjRfU09GVFdBUkUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JMRTI0X1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSTEUyNF9TT0ZUV0FSRSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1JMRV9TT0ZUV0FSRQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9STEVfU09GVFdBUkUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJMRV9TT0ZUV0FSRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUkxFX1NPRlRXQVJFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSTEVfU09GVFdBUkUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9SVFIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUlRSKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVFIiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1JUUik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUlRSIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUlRSMQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9SVFIxKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVFIxIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9SVFIxKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJSVFIxIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfUlRSX1FVQUxJVFlfTEVWRUwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfUlRSX1FVQUxJVFlfTEVWRUwpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJUUl9RVUFMSVRZX0xFVkVMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9SVFJfUVVBTElUWV9MRVZFTCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUlRSX1FVQUxJVFlfTEVWRUwiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9TQU1QTEVTX1BFUl9USUxFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1NBTVBMRVNfUEVSX1RJTEUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBMRVNfUEVSX1RJTEUiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1NBTVBMRVNfUEVSX1RJTEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNBTVBMRVNfUEVSX1RJTEUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9TQ0hFTUVfQlVTWQotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9TQ0hFTUVfQlVTWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0NIRU1FX0JVU1kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1NDSEVNRV9CVVNZKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQ0hFTUVfQlVTWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1NDSEVNRV9OT1RfQVZBSUxBQkxFCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1NDSEVNRV9OT1RfQVZBSUxBQkxFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTQ0hFTUVfTk9UX0FWQUlMQUJMRSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU0NIRU1FX05PVF9BVkFJTEFCTEUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNDSEVNRV9OT1RfQVZBSUxBQkxFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfU1BFRUQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU1BFRUQpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNQRUVEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9TUEVFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1BFRUQiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9TVEVSRU9fSU5URVJMRUFWRUQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU1RFUkVPX0lOVEVSTEVBVkVEKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTVEVSRU9fSU5URVJMRUFWRUQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1NURVJFT19JTlRFUkxFQVZFRCk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1RFUkVPX0lOVEVSTEVBVkVEIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfU1RSRUFNX0hFQURFUlMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfU1RSRUFNX0hFQURFUlMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNUUkVBTV9IRUFERVJTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9TVFJFQU1fSEVBREVSUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU1RSRUFNX0hFQURFUlMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9USUxFX1RIUkVTSE9MRAotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9USUxFX1RIUkVTSE9MRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVElMRV9USFJFU0hPTEQiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1RJTEVfVEhSRVNIT0xEKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUSUxFX1RIUkVTSE9MRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1RPUF9ET1dOCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1RPUF9ET1dOKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJUT1BfRE9XTiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVE9QX0RPV04pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlRPUF9ET1dOIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfVUxBVwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9VTEFXKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTEFXIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9VTEFXKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTEFXIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfVU5DT01QUkVTU0VECi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1VOQ09NUFJFU1NFRCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5DT01QUkVTU0VEIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9VTkNPTVBSRVNTRUQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOQ09NUFJFU1NFRCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1VOQ09NUFJFU1NFRF9BVURJTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9VTkNPTVBSRVNTRURfQVVESU8pOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOQ09NUFJFU1NFRF9BVURJTyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVU5DT01QUkVTU0VEX0FVRElPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTkNPTVBSRVNTRURfQVVESU8iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9VTkNPTVBSRVNTRURfVklERU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVU5DT01QUkVTU0VEX1ZJREVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJVTkNPTVBSRVNTRURfVklERU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1VOQ09NUFJFU1NFRF9WSURFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5DT01QUkVTU0VEX1ZJREVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfVU5LTk9XTl9TQ0hFTUUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfVU5LTk9XTl9TQ0hFTUUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlVOS05PV05fU0NIRU1FIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9VTktOT1dOX1NDSEVNRSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVU5LTk9XTl9TQ0hFTUUiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9WSURFTwotCXggPSBQeUludF9Gcm9tTG9uZyhDTF9WSURFTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiVklERU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1ZJREVPKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJWSURFTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWSIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWSIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1lDYkNyCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZQ2JDciIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWUNiQ3IpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfWUNiQ3I0MjIKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWUNiQ3I0MjIpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIyIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9ZQ2JDcjQyMik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWUNiQ3I0MjIiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ZQ2JDcjQyMkRDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyNDIyREMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIyREMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyNDIyREMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIyREMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ZQ2JDcjQyMkhDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyNDIySEMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIySEMiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1lDYkNyNDIySEMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllDYkNyNDIySEMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBDTF9ZVVYKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWVVWKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZVVYiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKENMX1lVVik7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWVVWIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfWVVWNDIyCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lVVjQyMik7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWVVWNDIyIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9ZVVY0MjIpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllVVjQyMiIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIENMX1lVVjQyMkRDCi0JeCA9IFB5SW50X0Zyb21Mb25nKENMX1lVVjQyMkRDKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJZVVY0MjJEQyIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWVVWNDIyREMpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllVVjQyMkRDIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQ0xfWVVWNDIySEMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQ0xfWVVWNDIySEMpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIllVVjQyMkhDIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhDTF9ZVVY0MjJIQyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiWVVWNDIySEMiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBV0NNUF9TVEVSRU8KLQl4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfU1RFUkVPKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9TVEVSRU8iLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX1NURVJFTyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfU1RFUkVPIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfSk9JTlRfU1RFUkVPCi0JeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX0pPSU5UX1NURVJFTyk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfSk9JTlRfU1RFUkVPIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9KT0lOVF9TVEVSRU8pOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQ01QX0pPSU5UX1NURVJFTyIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIEFXQ01QX0lOREVQRU5ERU5UCi0JeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX0lOREVQRU5ERU5UKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9JTkRFUEVOREVOVCIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfSU5ERVBFTkRFTlQpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQ01QX0lOREVQRU5ERU5UIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfRklYRURfUkFURQotCXggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9GSVhFRF9SQVRFKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9GSVhFRF9SQVRFIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9GSVhFRF9SQVRFKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9GSVhFRF9SQVRFIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfQ09OU1RfUVVBTAotCXggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9DT05TVF9RVUFMKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9DT05TVF9RVUFMIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9DT05TVF9RVUFMKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9DT05TVF9RVUFMIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfTE9TU0xFU1MKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfTE9TU0xFU1MpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkFXQ01QX0xPU1NMRVNTIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9MT1NTTEVTUyk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfTE9TU0xFU1MiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBBV0NNUF9NUEVHX0xBWUVSX0kKLQl4ID0gUHlJbnRfRnJvbUxvbmcoQVdDTVBfTVBFR19MQVlFUl9JKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9NUEVHX0xBWUVSX0kiLCB4KSA8IDApCi0JCXJldHVybjsKLQlQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKEFXQ01QX01QRUdfTEFZRVJfSSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQVdDTVBfTVBFR19MQVlFUl9JIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgQVdDTVBfTVBFR19MQVlFUl9JSQotCXggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9NUEVHX0xBWUVSX0lJKTsKLQlpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9NUEVHX0xBWUVSX0lJIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhBV0NNUF9NUEVHX0xBWUVSX0lJKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJBV0NNUF9NUEVHX0xBWUVSX0lJIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogI2VuZGlmCiAKLQkodm9pZCkgY2xTZXRFcnJvckhhbmRsZXIoY2xfRXJyb3JIYW5kbGVyKTsKKyAgICAodm9pZCkgY2xTZXRFcnJvckhhbmRsZXIoY2xfRXJyb3JIYW5kbGVyKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY21hdGhtb2R1bGUuYyBiL01vZHVsZXMvY21hdGhtb2R1bGUuYwppbmRleCA3YjJlMzE2Li5lZWM2MWMwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NtYXRobW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jbWF0aG1vZHVsZS5jCkBAIC0zMSw3ICszMSw3IEBACiAjZGVmaW5lIENNX0xPR19MQVJHRV9ET1VCTEUgKGxvZyhDTV9MQVJHRV9ET1VCTEUpKQogI2RlZmluZSBDTV9TUVJUX0RCTF9NSU4gKHNxcnQoREJMX01JTikpCiAKLS8qIAorLyoKICAgIENNX1NDQUxFX1VQIGlzIGFuIG9kZCBpbnRlZ2VyIGNob3NlbiBzdWNoIHRoYXQgbXVsdGlwbGljYXRpb24gYnkKICAgIDIqKkNNX1NDQUxFX1VQIGlzIHN1ZmZpY2llbnQgdG8gdHVybiBhIHN1Ym5vcm1hbCBpbnRvIGEgbm9ybWFsLgogICAgQ01fU0NBTEVfRE9XTiBpcyAoLShDTV9TQ0FMRV9VUCsxKS8yKS4gIFRoZXNlIHNjYWxpbmdzIGFyZSB1c2VkIHRvIGNvbXB1dGUKQEAgLTYyLDQ2ICs2Miw0NiBAQAogKi8KIAogZW51bSBzcGVjaWFsX3R5cGVzIHsKLQlTVF9OSU5GLAkvKiAwLCBuZWdhdGl2ZSBpbmZpbml0eSAqLwotCVNUX05FRywJCS8qIDEsIG5lZ2F0aXZlIGZpbml0ZSBudW1iZXIgKG5vbnplcm8pICovCi0JU1RfTlpFUk8sCS8qIDIsIC0wLiAqLwotCVNUX1BaRVJPLAkvKiAzLCArMC4gKi8KLQlTVF9QT1MsCQkvKiA0LCBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyIChub256ZXJvKSAqLwotCVNUX1BJTkYsCS8qIDUsIHBvc2l0aXZlIGluZmluaXR5ICovCi0JU1RfTkFOCQkvKiA2LCBOb3QgYSBOdW1iZXIgKi8KKyAgICBTVF9OSU5GLCAgICAgICAgICAgIC8qIDAsIG5lZ2F0aXZlIGluZmluaXR5ICovCisgICAgU1RfTkVHLCAgICAgICAgICAgICAvKiAxLCBuZWdhdGl2ZSBmaW5pdGUgbnVtYmVyIChub256ZXJvKSAqLworICAgIFNUX05aRVJPLCAgICAgICAgICAgLyogMiwgLTAuICovCisgICAgU1RfUFpFUk8sICAgICAgICAgICAvKiAzLCArMC4gKi8KKyAgICBTVF9QT1MsICAgICAgICAgICAgIC8qIDQsIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIgKG5vbnplcm8pICovCisgICAgU1RfUElORiwgICAgICAgICAgICAvKiA1LCBwb3NpdGl2ZSBpbmZpbml0eSAqLworICAgIFNUX05BTiAgICAgICAgICAgICAgLyogNiwgTm90IGEgTnVtYmVyICovCiB9OwogCiBzdGF0aWMgZW51bSBzcGVjaWFsX3R5cGVzCiBzcGVjaWFsX3R5cGUoZG91YmxlIGQpCiB7Ci0JaWYgKFB5X0lTX0ZJTklURShkKSkgewotCQlpZiAoZCAhPSAwKSB7Ci0JCQlpZiAoY29weXNpZ24oMS4sIGQpID09IDEuKQotCQkJCXJldHVybiBTVF9QT1M7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIFNUX05FRzsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChjb3B5c2lnbigxLiwgZCkgPT0gMS4pCi0JCQkJcmV0dXJuIFNUX1BaRVJPOwotCQkJZWxzZQotCQkJCXJldHVybiBTVF9OWkVSTzsKLQkJfQotCX0KLQlpZiAoUHlfSVNfTkFOKGQpKQotCQlyZXR1cm4gU1RfTkFOOwotCWlmIChjb3B5c2lnbigxLiwgZCkgPT0gMS4pCi0JCXJldHVybiBTVF9QSU5GOwotCWVsc2UKLQkJcmV0dXJuIFNUX05JTkY7CisgICAgaWYgKFB5X0lTX0ZJTklURShkKSkgeworICAgICAgICBpZiAoZCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY29weXNpZ24oMS4sIGQpID09IDEuKQorICAgICAgICAgICAgICAgIHJldHVybiBTVF9QT1M7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIFNUX05FRzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjb3B5c2lnbigxLiwgZCkgPT0gMS4pCisgICAgICAgICAgICAgICAgcmV0dXJuIFNUX1BaRVJPOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBTVF9OWkVSTzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoUHlfSVNfTkFOKGQpKQorICAgICAgICByZXR1cm4gU1RfTkFOOworICAgIGlmIChjb3B5c2lnbigxLiwgZCkgPT0gMS4pCisgICAgICAgIHJldHVybiBTVF9QSU5GOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFNUX05JTkY7CiB9CiAKLSNkZWZpbmUgU1BFQ0lBTF9WQUxVRSh6LCB0YWJsZSkJCQkJCQlcCi0JaWYgKCFQeV9JU19GSU5JVEUoKHopLnJlYWwpIHx8ICFQeV9JU19GSU5JVEUoKHopLmltYWcpKSB7CVwKLQkJZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXJldHVybiB0YWJsZVtzcGVjaWFsX3R5cGUoKHopLnJlYWwpXQkgICAgICAgICAgICAgICAgXAotCQkJICAgIFtzcGVjaWFsX3R5cGUoKHopLmltYWcpXTsJCQlcCi0JfQorI2RlZmluZSBTUEVDSUFMX1ZBTFVFKHosIHRhYmxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghUHlfSVNfRklOSVRFKCh6KS5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKCh6KS5pbWFnKSkgeyAgICAgICAgICAgXAorICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHRhYmxlW3NwZWNpYWxfdHlwZSgoeikucmVhbCldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSgoeikuaW1hZyldOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CiAKICNkZWZpbmUgUCBQeV9NQVRIX1BJCiAjZGVmaW5lIFAxNCAwLjI1KlB5X01BVEhfUEkKQEAgLTEyNSwzNCArMTI1LDM0IEBACiBzdGF0aWMgUHlfY29tcGxleAogY19hY29zKFB5X2NvbXBsZXggeikKIHsKLQlQeV9jb21wbGV4IHMxLCBzMiwgcjsKKyAgICBQeV9jb21wbGV4IHMxLCBzMiwgcjsKIAotCVNQRUNJQUxfVkFMVUUoeiwgYWNvc19zcGVjaWFsX3ZhbHVlcyk7CisgICAgU1BFQ0lBTF9WQUxVRSh6LCBhY29zX3NwZWNpYWxfdmFsdWVzKTsKIAotCWlmIChmYWJzKHoucmVhbCkgPiBDTV9MQVJHRV9ET1VCTEUgfHwgZmFicyh6LmltYWcpID4gQ01fTEFSR0VfRE9VQkxFKSB7Ci0JCS8qIGF2b2lkIHVubmVjZXNzYXJ5IG92ZXJmbG93IGZvciBsYXJnZSBhcmd1bWVudHMgKi8KLQkJci5yZWFsID0gYXRhbjIoZmFicyh6LmltYWcpLCB6LnJlYWwpOwotCQkvKiBzcGxpdCBpbnRvIGNhc2VzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBicmFuY2ggY3V0IGhhcyB0aGUKLQkJICAgY29ycmVjdCBjb250aW51aXR5IG9uIHN5c3RlbXMgd2l0aCB1bnNpZ25lZCB6ZXJvcyAqLwotCQlpZiAoei5yZWFsIDwgMC4pIHsKLQkJCXIuaW1hZyA9IC1jb3B5c2lnbihsb2coaHlwb3Qoei5yZWFsLzIuLCB6LmltYWcvMi4pKSArCi0JCQkJCSAgIE1fTE4yKjIuLCB6LmltYWcpOwotCQl9IGVsc2UgewotCQkJci5pbWFnID0gY29weXNpZ24obG9nKGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKSkgKwotCQkJCQkgIE1fTE4yKjIuLCAtei5pbWFnKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXMxLnJlYWwgPSAxLi16LnJlYWw7Ci0JCXMxLmltYWcgPSAtei5pbWFnOwotCQlzMSA9IGNfc3FydChzMSk7Ci0JCXMyLnJlYWwgPSAxLit6LnJlYWw7Ci0JCXMyLmltYWcgPSB6LmltYWc7Ci0JCXMyID0gY19zcXJ0KHMyKTsKLQkJci5yZWFsID0gMi4qYXRhbjIoczEucmVhbCwgczIucmVhbCk7Ci0JCXIuaW1hZyA9IGFzaW5oKHMyLnJlYWwqczEuaW1hZyAtIHMyLmltYWcqczEucmVhbCk7Ci0JfQotCWVycm5vID0gMDsKLQlyZXR1cm4gcjsKKyAgICBpZiAoZmFicyh6LnJlYWwpID4gQ01fTEFSR0VfRE9VQkxFIHx8IGZhYnMoei5pbWFnKSA+IENNX0xBUkdFX0RPVUJMRSkgeworICAgICAgICAvKiBhdm9pZCB1bm5lY2Vzc2FyeSBvdmVyZmxvdyBmb3IgbGFyZ2UgYXJndW1lbnRzICovCisgICAgICAgIHIucmVhbCA9IGF0YW4yKGZhYnMoei5pbWFnKSwgei5yZWFsKTsKKyAgICAgICAgLyogc3BsaXQgaW50byBjYXNlcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnJhbmNoIGN1dCBoYXMgdGhlCisgICAgICAgICAgIGNvcnJlY3QgY29udGludWl0eSBvbiBzeXN0ZW1zIHdpdGggdW5zaWduZWQgemVyb3MgKi8KKyAgICAgICAgaWYgKHoucmVhbCA8IDAuKSB7CisgICAgICAgICAgICByLmltYWcgPSAtY29weXNpZ24obG9nKGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1fTE4yKjIuLCB6LmltYWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgci5pbWFnID0gY29weXNpZ24obG9nKGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTV9MTjIqMi4sIC16LmltYWcpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgczEucmVhbCA9IDEuLXoucmVhbDsKKyAgICAgICAgczEuaW1hZyA9IC16LmltYWc7CisgICAgICAgIHMxID0gY19zcXJ0KHMxKTsKKyAgICAgICAgczIucmVhbCA9IDEuK3oucmVhbDsKKyAgICAgICAgczIuaW1hZyA9IHouaW1hZzsKKyAgICAgICAgczIgPSBjX3NxcnQoczIpOworICAgICAgICByLnJlYWwgPSAyLiphdGFuMihzMS5yZWFsLCBzMi5yZWFsKTsKKyAgICAgICAgci5pbWFnID0gYXNpbmgoczIucmVhbCpzMS5pbWFnIC0gczIuaW1hZypzMS5yZWFsKTsKKyAgICB9CisgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19hY29zX2RvYywKQEAgLTE2NiwyNiArMTY2LDI2IEBACiBzdGF0aWMgUHlfY29tcGxleAogY19hY29zaChQeV9jb21wbGV4IHopCiB7Ci0JUHlfY29tcGxleCBzMSwgczIsIHI7CisgICAgUHlfY29tcGxleCBzMSwgczIsIHI7CiAKLQlTUEVDSUFMX1ZBTFVFKHosIGFjb3NoX3NwZWNpYWxfdmFsdWVzKTsKKyAgICBTUEVDSUFMX1ZBTFVFKHosIGFjb3NoX3NwZWNpYWxfdmFsdWVzKTsKIAotCWlmIChmYWJzKHoucmVhbCkgPiBDTV9MQVJHRV9ET1VCTEUgfHwgZmFicyh6LmltYWcpID4gQ01fTEFSR0VfRE9VQkxFKSB7Ci0JCS8qIGF2b2lkIHVubmVjZXNzYXJ5IG92ZXJmbG93IGZvciBsYXJnZSBhcmd1bWVudHMgKi8KLQkJci5yZWFsID0gbG9nKGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKSkgKyBNX0xOMioyLjsKLQkJci5pbWFnID0gYXRhbjIoei5pbWFnLCB6LnJlYWwpOwotCX0gZWxzZSB7Ci0JCXMxLnJlYWwgPSB6LnJlYWwgLSAxLjsKLQkJczEuaW1hZyA9IHouaW1hZzsKLQkJczEgPSBjX3NxcnQoczEpOwotCQlzMi5yZWFsID0gei5yZWFsICsgMS47Ci0JCXMyLmltYWcgPSB6LmltYWc7Ci0JCXMyID0gY19zcXJ0KHMyKTsKLQkJci5yZWFsID0gYXNpbmgoczEucmVhbCpzMi5yZWFsICsgczEuaW1hZypzMi5pbWFnKTsKLQkJci5pbWFnID0gMi4qYXRhbjIoczEuaW1hZywgczIucmVhbCk7Ci0JfQotCWVycm5vID0gMDsKLQlyZXR1cm4gcjsKKyAgICBpZiAoZmFicyh6LnJlYWwpID4gQ01fTEFSR0VfRE9VQkxFIHx8IGZhYnMoei5pbWFnKSA+IENNX0xBUkdFX0RPVUJMRSkgeworICAgICAgICAvKiBhdm9pZCB1bm5lY2Vzc2FyeSBvdmVyZmxvdyBmb3IgbGFyZ2UgYXJndW1lbnRzICovCisgICAgICAgIHIucmVhbCA9IGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsgTV9MTjIqMi47CisgICAgICAgIHIuaW1hZyA9IGF0YW4yKHouaW1hZywgei5yZWFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzMS5yZWFsID0gei5yZWFsIC0gMS47CisgICAgICAgIHMxLmltYWcgPSB6LmltYWc7CisgICAgICAgIHMxID0gY19zcXJ0KHMxKTsKKyAgICAgICAgczIucmVhbCA9IHoucmVhbCArIDEuOworICAgICAgICBzMi5pbWFnID0gei5pbWFnOworICAgICAgICBzMiA9IGNfc3FydChzMik7CisgICAgICAgIHIucmVhbCA9IGFzaW5oKHMxLnJlYWwqczIucmVhbCArIHMxLmltYWcqczIuaW1hZyk7CisgICAgICAgIHIuaW1hZyA9IDIuKmF0YW4yKHMxLmltYWcsIHMyLnJlYWwpOworICAgIH0KKyAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX2Fjb3NoX2RvYywKQEAgLTE5NywxNCArMTk3LDE0IEBACiBzdGF0aWMgUHlfY29tcGxleAogY19hc2luKFB5X2NvbXBsZXggeikKIHsKLQkvKiBhc2luKHopID0gLWkgYXNpbmgoaXopICovCi0JUHlfY29tcGxleCBzLCByOwotCXMucmVhbCA9IC16LmltYWc7Ci0Jcy5pbWFnID0gei5yZWFsOwotCXMgPSBjX2FzaW5oKHMpOwotCXIucmVhbCA9IHMuaW1hZzsKLQlyLmltYWcgPSAtcy5yZWFsOwotCXJldHVybiByOworICAgIC8qIGFzaW4oeikgPSAtaSBhc2luaChpeikgKi8KKyAgICBQeV9jb21wbGV4IHMsIHI7CisgICAgcy5yZWFsID0gLXouaW1hZzsKKyAgICBzLmltYWcgPSB6LnJlYWw7CisgICAgcyA9IGNfYXNpbmgocyk7CisgICAgci5yZWFsID0gcy5pbWFnOworICAgIHIuaW1hZyA9IC1zLnJlYWw7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX2FzaW5fZG9jLApAQCAtMjE4LDMxICsyMTgsMzEgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2FzaW5oKFB5X2NvbXBsZXggeikKIHsKLQlQeV9jb21wbGV4IHMxLCBzMiwgcjsKKyAgICBQeV9jb21wbGV4IHMxLCBzMiwgcjsKIAotCVNQRUNJQUxfVkFMVUUoeiwgYXNpbmhfc3BlY2lhbF92YWx1ZXMpOworICAgIFNQRUNJQUxfVkFMVUUoeiwgYXNpbmhfc3BlY2lhbF92YWx1ZXMpOwogCi0JaWYgKGZhYnMoei5yZWFsKSA+IENNX0xBUkdFX0RPVUJMRSB8fCBmYWJzKHouaW1hZykgPiBDTV9MQVJHRV9ET1VCTEUpIHsKLQkJaWYgKHouaW1hZyA+PSAwLikgewotCQkJci5yZWFsID0gY29weXNpZ24obG9nKGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKSkgKwotCQkJCQkgIE1fTE4yKjIuLCB6LnJlYWwpOwotCQl9IGVsc2UgewotCQkJci5yZWFsID0gLWNvcHlzaWduKGxvZyhoeXBvdCh6LnJlYWwvMi4sIHouaW1hZy8yLikpICsKLQkJCQkJICAgTV9MTjIqMi4sIC16LnJlYWwpOwotCQl9Ci0JCXIuaW1hZyA9IGF0YW4yKHouaW1hZywgZmFicyh6LnJlYWwpKTsKLQl9IGVsc2UgewotCQlzMS5yZWFsID0gMS4rei5pbWFnOwotCQlzMS5pbWFnID0gLXoucmVhbDsKLQkJczEgPSBjX3NxcnQoczEpOwotCQlzMi5yZWFsID0gMS4tei5pbWFnOwotCQlzMi5pbWFnID0gei5yZWFsOwotCQlzMiA9IGNfc3FydChzMik7Ci0JCXIucmVhbCA9IGFzaW5oKHMxLnJlYWwqczIuaW1hZy1zMi5yZWFsKnMxLmltYWcpOwotCQlyLmltYWcgPSBhdGFuMih6LmltYWcsIHMxLnJlYWwqczIucmVhbC1zMS5pbWFnKnMyLmltYWcpOwotCX0KLQllcnJubyA9IDA7Ci0JcmV0dXJuIHI7CisgICAgaWYgKGZhYnMoei5yZWFsKSA+IENNX0xBUkdFX0RPVUJMRSB8fCBmYWJzKHouaW1hZykgPiBDTV9MQVJHRV9ET1VCTEUpIHsKKyAgICAgICAgaWYgKHouaW1hZyA+PSAwLikgeworICAgICAgICAgICAgci5yZWFsID0gY29weXNpZ24obG9nKGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTV9MTjIqMi4sIHoucmVhbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLnJlYWwgPSAtY29weXNpZ24obG9nKGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1fTE4yKjIuLCAtei5yZWFsKTsKKyAgICAgICAgfQorICAgICAgICByLmltYWcgPSBhdGFuMih6LmltYWcsIGZhYnMoei5yZWFsKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgczEucmVhbCA9IDEuK3ouaW1hZzsKKyAgICAgICAgczEuaW1hZyA9IC16LnJlYWw7CisgICAgICAgIHMxID0gY19zcXJ0KHMxKTsKKyAgICAgICAgczIucmVhbCA9IDEuLXouaW1hZzsKKyAgICAgICAgczIuaW1hZyA9IHoucmVhbDsKKyAgICAgICAgczIgPSBjX3NxcnQoczIpOworICAgICAgICByLnJlYWwgPSBhc2luaChzMS5yZWFsKnMyLmltYWctczIucmVhbCpzMS5pbWFnKTsKKyAgICAgICAgci5pbWFnID0gYXRhbjIoei5pbWFnLCBzMS5yZWFsKnMyLnJlYWwtczEuaW1hZypzMi5pbWFnKTsKKyAgICB9CisgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19hc2luaF9kb2MsCkBAIC0yNTQsMTQgKzI1NCwxNCBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfYXRhbihQeV9jb21wbGV4IHopCiB7Ci0JLyogYXRhbih6KSA9IC1pIGF0YW5oKGl6KSAqLwotCVB5X2NvbXBsZXggcywgcjsKLQlzLnJlYWwgPSAtei5pbWFnOwotCXMuaW1hZyA9IHoucmVhbDsKLQlzID0gY19hdGFuaChzKTsKLQlyLnJlYWwgPSBzLmltYWc7Ci0Jci5pbWFnID0gLXMucmVhbDsKLQlyZXR1cm4gcjsKKyAgICAvKiBhdGFuKHopID0gLWkgYXRhbmgoaXopICovCisgICAgUHlfY29tcGxleCBzLCByOworICAgIHMucmVhbCA9IC16LmltYWc7CisgICAgcy5pbWFnID0gei5yZWFsOworICAgIHMgPSBjX2F0YW5oKHMpOworICAgIHIucmVhbCA9IHMuaW1hZzsKKyAgICByLmltYWcgPSAtcy5yZWFsOworICAgIHJldHVybiByOwogfQogCiAvKiBXaW5kb3dzIHNjcmV3cyB1cCBhdGFuMiBmb3IgaW5mIGFuZCBuYW4sIGFuZCBhbHBoYSBUcnU2NCA1LjEgZG9lc24ndCBmb2xsb3cKQEAgLTI2OSwyOSArMjY5LDI5IEBACiBzdGF0aWMgZG91YmxlCiBjX2F0YW4yKFB5X2NvbXBsZXggeikKIHsKLQlpZiAoUHlfSVNfTkFOKHoucmVhbCkgfHwgUHlfSVNfTkFOKHouaW1hZykpCi0JCXJldHVybiBQeV9OQU47Ci0JaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykpIHsKLQkJaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkpIHsKLQkJCWlmIChjb3B5c2lnbigxLiwgei5yZWFsKSA9PSAxLikKLQkJCQkvKiBhdGFuMigrLWluZiwgK2luZikgPT0gKy1waS80ICovCi0JCQkJcmV0dXJuIGNvcHlzaWduKDAuMjUqUHlfTUFUSF9QSSwgei5pbWFnKTsKLQkJCWVsc2UKLQkJCQkvKiBhdGFuMigrLWluZiwgLWluZikgPT0gKy1waSozLzQgKi8KLQkJCQlyZXR1cm4gY29weXNpZ24oMC43NSpQeV9NQVRIX1BJLCB6LmltYWcpOwotCQl9Ci0JCS8qIGF0YW4yKCstaW5mLCB4KSA9PSArLXBpLzIgZm9yIGZpbml0ZSB4ICovCi0JCXJldHVybiBjb3B5c2lnbigwLjUqUHlfTUFUSF9QSSwgei5pbWFnKTsKLQl9Ci0JaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgfHwgei5pbWFnID09IDAuKSB7Ci0JCWlmIChjb3B5c2lnbigxLiwgei5yZWFsKSA9PSAxLikKLQkJCS8qIGF0YW4yKCsteSwgK2luZikgPSBhdGFuMigrLTAsICt4KSA9ICstMC4gKi8KLQkJCXJldHVybiBjb3B5c2lnbigwLiwgei5pbWFnKTsKLQkJZWxzZQotCQkJLyogYXRhbjIoKy15LCAtaW5mKSA9IGF0YW4yKCstMC4sIC14KSA9ICstcGkuICovCi0JCQlyZXR1cm4gY29weXNpZ24oUHlfTUFUSF9QSSwgei5pbWFnKTsKLQl9Ci0JcmV0dXJuIGF0YW4yKHouaW1hZywgei5yZWFsKTsKKyAgICBpZiAoUHlfSVNfTkFOKHoucmVhbCkgfHwgUHlfSVNfTkFOKHouaW1hZykpCisgICAgICAgIHJldHVybiBQeV9OQU47CisgICAgaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykpIHsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkpIHsKKyAgICAgICAgICAgIGlmIChjb3B5c2lnbigxLiwgei5yZWFsKSA9PSAxLikKKyAgICAgICAgICAgICAgICAvKiBhdGFuMigrLWluZiwgK2luZikgPT0gKy1waS80ICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlzaWduKDAuMjUqUHlfTUFUSF9QSSwgei5pbWFnKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvKiBhdGFuMigrLWluZiwgLWluZikgPT0gKy1waSozLzQgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oMC43NSpQeV9NQVRIX1BJLCB6LmltYWcpOworICAgICAgICB9CisgICAgICAgIC8qIGF0YW4yKCstaW5mLCB4KSA9PSArLXBpLzIgZm9yIGZpbml0ZSB4ICovCisgICAgICAgIHJldHVybiBjb3B5c2lnbigwLjUqUHlfTUFUSF9QSSwgei5pbWFnKTsKKyAgICB9CisgICAgaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgfHwgei5pbWFnID09IDAuKSB7CisgICAgICAgIGlmIChjb3B5c2lnbigxLiwgei5yZWFsKSA9PSAxLikKKyAgICAgICAgICAgIC8qIGF0YW4yKCsteSwgK2luZikgPSBhdGFuMigrLTAsICt4KSA9ICstMC4gKi8KKyAgICAgICAgICAgIHJldHVybiBjb3B5c2lnbigwLiwgei5pbWFnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLyogYXRhbjIoKy15LCAtaW5mKSA9IGF0YW4yKCstMC4sIC14KSA9ICstcGkuICovCisgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oUHlfTUFUSF9QSSwgei5pbWFnKTsKKyAgICB9CisgICAgcmV0dXJuIGF0YW4yKHouaW1hZywgei5yZWFsKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNfYXRhbl9kb2MsCkBAIC0zMDUsNDggKzMwNSw0OCBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfYXRhbmgoUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgYXksIGg7CisgICAgUHlfY29tcGxleCByOworICAgIGRvdWJsZSBheSwgaDsKIAotCVNQRUNJQUxfVkFMVUUoeiwgYXRhbmhfc3BlY2lhbF92YWx1ZXMpOworICAgIFNQRUNJQUxfVkFMVUUoeiwgYXRhbmhfc3BlY2lhbF92YWx1ZXMpOwogCi0JLyogUmVkdWNlIHRvIGNhc2Ugd2hlcmUgei5yZWFsID49IDAuLCB1c2luZyBhdGFuaCh6KSA9IC1hdGFuaCgteikuICovCi0JaWYgKHoucmVhbCA8IDAuKSB7Ci0JCXJldHVybiBjX25lZyhjX2F0YW5oKGNfbmVnKHopKSk7Ci0JfQorICAgIC8qIFJlZHVjZSB0byBjYXNlIHdoZXJlIHoucmVhbCA+PSAwLiwgdXNpbmcgYXRhbmgoeikgPSAtYXRhbmgoLXopLiAqLworICAgIGlmICh6LnJlYWwgPCAwLikgeworICAgICAgICByZXR1cm4gY19uZWcoY19hdGFuaChjX25lZyh6KSkpOworICAgIH0KIAotCWF5ID0gZmFicyh6LmltYWcpOwotCWlmICh6LnJlYWwgPiBDTV9TUVJUX0xBUkdFX0RPVUJMRSB8fCBheSA+IENNX1NRUlRfTEFSR0VfRE9VQkxFKSB7Ci0JCS8qCi0JCSAgIGlmIGFicyh6KSBpcyBsYXJnZSB0aGVuIHdlIHVzZSB0aGUgYXBwcm94aW1hdGlvbgotCQkgICBhdGFuaCh6KSB+IDEveiArLy0gaSpwaS8yICgrLy0gZGVwZW5kaW5nIG9uIHRoZSBzaWduCi0JCSAgIG9mIHouaW1hZykKLQkJKi8KLQkJaCA9IGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKTsgIC8qIHNhZmUgZnJvbSBvdmVyZmxvdyAqLwotCQlyLnJlYWwgPSB6LnJlYWwvNC4vaC9oOwotCQkvKiB0aGUgdHdvIG5lZ2F0aW9ucyBpbiB0aGUgbmV4dCBsaW5lIGNhbmNlbCBlYWNoIG90aGVyIG91dAotCQkgICBleGNlcHQgd2hlbiB3b3JraW5nIHdpdGggdW5zaWduZWQgemVyb3M6IHRoZXkncmUgdGhlcmUgdG8KLQkJICAgZW5zdXJlIHRoYXQgdGhlIGJyYW5jaCBjdXQgaGFzIHRoZSBjb3JyZWN0IGNvbnRpbnVpdHkgb24KLQkJICAgc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgc2lnbmVkIHplcm9zICovCi0JCXIuaW1hZyA9IC1jb3B5c2lnbihQeV9NQVRIX1BJLzIuLCAtei5pbWFnKTsKLQkJZXJybm8gPSAwOwotCX0gZWxzZSBpZiAoei5yZWFsID09IDEuICYmIGF5IDwgQ01fU1FSVF9EQkxfTUlOKSB7Ci0JCS8qIEM5OSBzdGFuZGFyZCBzYXlzOiAgYXRhbmgoMSsvLTAuKSBzaG91bGQgYmUgaW5mICsvLSAwaSAqLwotCQlpZiAoYXkgPT0gMC4pIHsKLQkJCXIucmVhbCA9IElORjsKLQkJCXIuaW1hZyA9IHouaW1hZzsKLQkJCWVycm5vID0gRURPTTsKLQkJfSBlbHNlIHsKLQkJCXIucmVhbCA9IC1sb2coc3FydChheSkvc3FydChoeXBvdChheSwgMi4pKSk7Ci0JCQlyLmltYWcgPSBjb3B5c2lnbihhdGFuMigyLiwgLWF5KS8yLCB6LmltYWcpOwotCQkJZXJybm8gPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJci5yZWFsID0gbG9nMXAoNC4qei5yZWFsLygoMS16LnJlYWwpKigxLXoucmVhbCkgKyBheSpheSkpLzQuOwotCQlyLmltYWcgPSAtYXRhbjIoLTIuKnouaW1hZywgKDEtei5yZWFsKSooMSt6LnJlYWwpIC0gYXkqYXkpLzIuOwotCQllcnJubyA9IDA7Ci0JfQotCXJldHVybiByOworICAgIGF5ID0gZmFicyh6LmltYWcpOworICAgIGlmICh6LnJlYWwgPiBDTV9TUVJUX0xBUkdFX0RPVUJMRSB8fCBheSA+IENNX1NRUlRfTEFSR0VfRE9VQkxFKSB7CisgICAgICAgIC8qCisgICAgICAgICAgIGlmIGFicyh6KSBpcyBsYXJnZSB0aGVuIHdlIHVzZSB0aGUgYXBwcm94aW1hdGlvbgorICAgICAgICAgICBhdGFuaCh6KSB+IDEveiArLy0gaSpwaS8yICgrLy0gZGVwZW5kaW5nIG9uIHRoZSBzaWduCisgICAgICAgICAgIG9mIHouaW1hZykKKyAgICAgICAgKi8KKyAgICAgICAgaCA9IGh5cG90KHoucmVhbC8yLiwgei5pbWFnLzIuKTsgIC8qIHNhZmUgZnJvbSBvdmVyZmxvdyAqLworICAgICAgICByLnJlYWwgPSB6LnJlYWwvNC4vaC9oOworICAgICAgICAvKiB0aGUgdHdvIG5lZ2F0aW9ucyBpbiB0aGUgbmV4dCBsaW5lIGNhbmNlbCBlYWNoIG90aGVyIG91dAorICAgICAgICAgICBleGNlcHQgd2hlbiB3b3JraW5nIHdpdGggdW5zaWduZWQgemVyb3M6IHRoZXkncmUgdGhlcmUgdG8KKyAgICAgICAgICAgZW5zdXJlIHRoYXQgdGhlIGJyYW5jaCBjdXQgaGFzIHRoZSBjb3JyZWN0IGNvbnRpbnVpdHkgb24KKyAgICAgICAgICAgc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgc2lnbmVkIHplcm9zICovCisgICAgICAgIHIuaW1hZyA9IC1jb3B5c2lnbihQeV9NQVRIX1BJLzIuLCAtei5pbWFnKTsKKyAgICAgICAgZXJybm8gPSAwOworICAgIH0gZWxzZSBpZiAoei5yZWFsID09IDEuICYmIGF5IDwgQ01fU1FSVF9EQkxfTUlOKSB7CisgICAgICAgIC8qIEM5OSBzdGFuZGFyZCBzYXlzOiAgYXRhbmgoMSsvLTAuKSBzaG91bGQgYmUgaW5mICsvLSAwaSAqLworICAgICAgICBpZiAoYXkgPT0gMC4pIHsKKyAgICAgICAgICAgIHIucmVhbCA9IElORjsKKyAgICAgICAgICAgIHIuaW1hZyA9IHouaW1hZzsKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHIucmVhbCA9IC1sb2coc3FydChheSkvc3FydChoeXBvdChheSwgMi4pKSk7CisgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbihhdGFuMigyLiwgLWF5KS8yLCB6LmltYWcpOworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgci5yZWFsID0gbG9nMXAoNC4qei5yZWFsLygoMS16LnJlYWwpKigxLXoucmVhbCkgKyBheSpheSkpLzQuOworICAgICAgICByLmltYWcgPSAtYXRhbjIoLTIuKnouaW1hZywgKDEtei5yZWFsKSooMSt6LnJlYWwpIC0gYXkqYXkpLzIuOworICAgICAgICBlcnJubyA9IDA7CisgICAgfQorICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19hdGFuaF9kb2MsCkBAIC0zNTgsMTIgKzM1OCwxMiBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfY29zKFB5X2NvbXBsZXggeikKIHsKLQkvKiBjb3MoeikgPSBjb3NoKGl6KSAqLwotCVB5X2NvbXBsZXggcjsKLQlyLnJlYWwgPSAtei5pbWFnOwotCXIuaW1hZyA9IHoucmVhbDsKLQlyID0gY19jb3NoKHIpOwotCXJldHVybiByOworICAgIC8qIGNvcyh6KSA9IGNvc2goaXopICovCisgICAgUHlfY29tcGxleCByOworICAgIHIucmVhbCA9IC16LmltYWc7CisgICAgci5pbWFnID0gei5yZWFsOworICAgIHIgPSBjX2Nvc2gocik7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX2Nvc19kb2MsCkBAIC0zNzgsNTEgKzM3OCw1MSBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfY29zaChQeV9jb21wbGV4IHopCiB7Ci0JUHlfY29tcGxleCByOwotCWRvdWJsZSB4X21pbnVzX29uZTsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgZG91YmxlIHhfbWludXNfb25lOwogCi0JLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGNvc2goKy8taW5mICsgaXkpIGlmIHkgaXMgbm90IGEgTmFOICovCi0JaWYgKCFQeV9JU19GSU5JVEUoei5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKHouaW1hZykpIHsKLQkJaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgJiYgUHlfSVNfRklOSVRFKHouaW1hZykgJiYKLQkJICAgICh6LmltYWcgIT0gMC4pKSB7Ci0JCQlpZiAoei5yZWFsID4gMCkgewotCQkJCXIucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHouaW1hZykpOwotCQkJCXIuaW1hZyA9IGNvcHlzaWduKElORiwgc2luKHouaW1hZykpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJci5yZWFsID0gY29weXNpZ24oSU5GLCBjb3Moei5pbWFnKSk7Ci0JCQkJci5pbWFnID0gLWNvcHlzaWduKElORiwgc2luKHouaW1hZykpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJciA9IGNvc2hfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHoucmVhbCldCi0JCQkJICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSh6LmltYWcpXTsKLQkJfQotCQkvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgeSBpcyArLy0gaW5maW5pdHkgYW5kIHggaXMgbm90Ci0JCSAgIGEgTmFOICovCi0JCWlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpICYmICFQeV9JU19OQU4oei5yZWFsKSkKLQkJCWVycm5vID0gRURPTTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCQlyZXR1cm4gcjsKLQl9CisgICAgLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGNvc2goKy8taW5mICsgaXkpIGlmIHkgaXMgbm90IGEgTmFOICovCisgICAgaWYgKCFQeV9JU19GSU5JVEUoei5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKHouaW1hZykpIHsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgJiYgUHlfSVNfRklOSVRFKHouaW1hZykgJiYKKyAgICAgICAgICAgICh6LmltYWcgIT0gMC4pKSB7CisgICAgICAgICAgICBpZiAoei5yZWFsID4gMCkgeworICAgICAgICAgICAgICAgIHIucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHouaW1hZykpOworICAgICAgICAgICAgICAgIHIuaW1hZyA9IGNvcHlzaWduKElORiwgc2luKHouaW1hZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgci5yZWFsID0gY29weXNpZ24oSU5GLCBjb3Moei5pbWFnKSk7CisgICAgICAgICAgICAgICAgci5pbWFnID0gLWNvcHlzaWduKElORiwgc2luKHouaW1hZykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgciA9IGNvc2hfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHoucmVhbCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcGVjaWFsX3R5cGUoei5pbWFnKV07CisgICAgICAgIH0KKyAgICAgICAgLyogbmVlZCB0byBzZXQgZXJybm8gPSBFRE9NIGlmIHkgaXMgKy8tIGluZmluaXR5IGFuZCB4IGlzIG5vdAorICAgICAgICAgICBhIE5hTiAqLworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoei5pbWFnKSAmJiAhUHlfSVNfTkFOKHoucmVhbCkpCisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQogCi0JaWYgKGZhYnMoei5yZWFsKSA+IENNX0xPR19MQVJHRV9ET1VCTEUpIHsKLQkJLyogZGVhbCBjb3JyZWN0bHkgd2l0aCBjYXNlcyB3aGVyZSBjb3NoKHoucmVhbCkgb3ZlcmZsb3dzIGJ1dAotCQkgICBjb3NoKHopIGRvZXMgbm90LiAqLwotCQl4X21pbnVzX29uZSA9IHoucmVhbCAtIGNvcHlzaWduKDEuLCB6LnJlYWwpOwotCQlyLnJlYWwgPSBjb3Moei5pbWFnKSAqIGNvc2goeF9taW51c19vbmUpICogUHlfTUFUSF9FOwotCQlyLmltYWcgPSBzaW4oei5pbWFnKSAqIHNpbmgoeF9taW51c19vbmUpICogUHlfTUFUSF9FOwotCX0gZWxzZSB7Ci0JCXIucmVhbCA9IGNvcyh6LmltYWcpICogY29zaCh6LnJlYWwpOwotCQlyLmltYWcgPSBzaW4oei5pbWFnKSAqIHNpbmgoei5yZWFsKTsKLQl9Ci0JLyogZGV0ZWN0IG92ZXJmbG93LCBhbmQgc2V0IGVycm5vIGFjY29yZGluZ2x5ICovCi0JaWYgKFB5X0lTX0lORklOSVRZKHIucmVhbCkgfHwgUHlfSVNfSU5GSU5JVFkoci5pbWFnKSkKLQkJZXJybm8gPSBFUkFOR0U7Ci0JZWxzZQotCQllcnJubyA9IDA7Ci0JcmV0dXJuIHI7CisgICAgaWYgKGZhYnMoei5yZWFsKSA+IENNX0xPR19MQVJHRV9ET1VCTEUpIHsKKyAgICAgICAgLyogZGVhbCBjb3JyZWN0bHkgd2l0aCBjYXNlcyB3aGVyZSBjb3NoKHoucmVhbCkgb3ZlcmZsb3dzIGJ1dAorICAgICAgICAgICBjb3NoKHopIGRvZXMgbm90LiAqLworICAgICAgICB4X21pbnVzX29uZSA9IHoucmVhbCAtIGNvcHlzaWduKDEuLCB6LnJlYWwpOworICAgICAgICByLnJlYWwgPSBjb3Moei5pbWFnKSAqIGNvc2goeF9taW51c19vbmUpICogUHlfTUFUSF9FOworICAgICAgICByLmltYWcgPSBzaW4oei5pbWFnKSAqIHNpbmgoeF9taW51c19vbmUpICogUHlfTUFUSF9FOworICAgIH0gZWxzZSB7CisgICAgICAgIHIucmVhbCA9IGNvcyh6LmltYWcpICogY29zaCh6LnJlYWwpOworICAgICAgICByLmltYWcgPSBzaW4oei5pbWFnKSAqIHNpbmgoei5yZWFsKTsKKyAgICB9CisgICAgLyogZGV0ZWN0IG92ZXJmbG93LCBhbmQgc2V0IGVycm5vIGFjY29yZGluZ2x5ICovCisgICAgaWYgKFB5X0lTX0lORklOSVRZKHIucmVhbCkgfHwgUHlfSVNfSU5GSU5JVFkoci5pbWFnKSkKKyAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgZWxzZQorICAgICAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX2Nvc2hfZG9jLApAQCAtNDM4LDUxICs0MzgsNTEgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX2V4cChQeV9jb21wbGV4IHopCiB7Ci0JUHlfY29tcGxleCByOwotCWRvdWJsZSBsOworICAgIFB5X2NvbXBsZXggcjsKKyAgICBkb3VibGUgbDsKIAotCWlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7Ci0JCWlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpCi0JCSAgICAmJiAoei5pbWFnICE9IDAuKSkgewotCQkJaWYgKHoucmVhbCA+IDApIHsKLQkJCQlyLnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyh6LmltYWcpKTsKLQkJCQlyLmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbih6LmltYWcpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXIucmVhbCA9IGNvcHlzaWduKDAuLCBjb3Moei5pbWFnKSk7Ci0JCQkJci5pbWFnID0gY29weXNpZ24oMC4sIHNpbih6LmltYWcpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXIgPSBleHBfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHoucmVhbCldCi0JCQkJICAgICAgICAgICAgICBbc3BlY2lhbF90eXBlKHouaW1hZyldOwotCQl9Ci0JCS8qIG5lZWQgdG8gc2V0IGVycm5vID0gRURPTSBpZiB5IGlzICsvLSBpbmZpbml0eSBhbmQgeCBpcyBub3QKLQkJICAgYSBOYU4gYW5kIG5vdCAtaW5maW5pdHkgKi8KLQkJaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykgJiYKLQkJICAgIChQeV9JU19GSU5JVEUoei5yZWFsKSB8fAotCQkgICAgIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIHoucmVhbCA+IDApKSkKLQkJCWVycm5vID0gRURPTTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCQlyZXR1cm4gcjsKLQl9CisgICAgaWYgKCFQeV9JU19GSU5JVEUoei5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKHouaW1hZykpIHsKKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgJiYgUHlfSVNfRklOSVRFKHouaW1hZykKKyAgICAgICAgICAgICYmICh6LmltYWcgIT0gMC4pKSB7CisgICAgICAgICAgICBpZiAoei5yZWFsID4gMCkgeworICAgICAgICAgICAgICAgIHIucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHouaW1hZykpOworICAgICAgICAgICAgICAgIHIuaW1hZyA9IGNvcHlzaWduKElORiwgc2luKHouaW1hZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgci5yZWFsID0gY29weXNpZ24oMC4sIGNvcyh6LmltYWcpKTsKKyAgICAgICAgICAgICAgICByLmltYWcgPSBjb3B5c2lnbigwLiwgc2luKHouaW1hZykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgciA9IGV4cF9zcGVjaWFsX3ZhbHVlc1tzcGVjaWFsX3R5cGUoei5yZWFsKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3BlY2lhbF90eXBlKHouaW1hZyldOworICAgICAgICB9CisgICAgICAgIC8qIG5lZWQgdG8gc2V0IGVycm5vID0gRURPTSBpZiB5IGlzICsvLSBpbmZpbml0eSBhbmQgeCBpcyBub3QKKyAgICAgICAgICAgYSBOYU4gYW5kIG5vdCAtaW5maW5pdHkgKi8KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykgJiYKKyAgICAgICAgICAgIChQeV9JU19GSU5JVEUoei5yZWFsKSB8fAorICAgICAgICAgICAgIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIHoucmVhbCA+IDApKSkKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CiAKLQlpZiAoei5yZWFsID4gQ01fTE9HX0xBUkdFX0RPVUJMRSkgewotCQlsID0gZXhwKHoucmVhbC0xLik7Ci0JCXIucmVhbCA9IGwqY29zKHouaW1hZykqUHlfTUFUSF9FOwotCQlyLmltYWcgPSBsKnNpbih6LmltYWcpKlB5X01BVEhfRTsKLQl9IGVsc2UgewotCQlsID0gZXhwKHoucmVhbCk7Ci0JCXIucmVhbCA9IGwqY29zKHouaW1hZyk7Ci0JCXIuaW1hZyA9IGwqc2luKHouaW1hZyk7Ci0JfQotCS8qIGRldGVjdCBvdmVyZmxvdywgYW5kIHNldCBlcnJubyBhY2NvcmRpbmdseSAqLwotCWlmIChQeV9JU19JTkZJTklUWShyLnJlYWwpIHx8IFB5X0lTX0lORklOSVRZKHIuaW1hZykpCi0JCWVycm5vID0gRVJBTkdFOwotCWVsc2UKLQkJZXJybm8gPSAwOwotCXJldHVybiByOworICAgIGlmICh6LnJlYWwgPiBDTV9MT0dfTEFSR0VfRE9VQkxFKSB7CisgICAgICAgIGwgPSBleHAoei5yZWFsLTEuKTsKKyAgICAgICAgci5yZWFsID0gbCpjb3Moei5pbWFnKSpQeV9NQVRIX0U7CisgICAgICAgIHIuaW1hZyA9IGwqc2luKHouaW1hZykqUHlfTUFUSF9FOworICAgIH0gZWxzZSB7CisgICAgICAgIGwgPSBleHAoei5yZWFsKTsKKyAgICAgICAgci5yZWFsID0gbCpjb3Moei5pbWFnKTsKKyAgICAgICAgci5pbWFnID0gbCpzaW4oei5pbWFnKTsKKyAgICB9CisgICAgLyogZGV0ZWN0IG92ZXJmbG93LCBhbmQgc2V0IGVycm5vIGFjY29yZGluZ2x5ICovCisgICAgaWYgKFB5X0lTX0lORklOSVRZKHIucmVhbCkgfHwgUHlfSVNfSU5GSU5JVFkoci5pbWFnKSkKKyAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgZWxzZQorICAgICAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX2V4cF9kb2MsCkBAIC00OTYsODUgKzQ5Niw4NSBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfbG9nKFB5X2NvbXBsZXggeikKIHsKLQkvKgotCSAgIFRoZSB1c3VhbCBmb3JtdWxhIGZvciB0aGUgcmVhbCBwYXJ0IGlzIGxvZyhoeXBvdCh6LnJlYWwsIHouaW1hZykpLgotCSAgIFRoZXJlIGFyZSBmb3VyIHNpdHVhdGlvbnMgd2hlcmUgdGhpcyBmb3JtdWxhIGlzIHBvdGVudGlhbGx5Ci0JICAgcHJvYmxlbWF0aWM6CisgICAgLyoKKyAgICAgICBUaGUgdXN1YWwgZm9ybXVsYSBmb3IgdGhlIHJlYWwgcGFydCBpcyBsb2coaHlwb3Qoei5yZWFsLCB6LmltYWcpKS4KKyAgICAgICBUaGVyZSBhcmUgZm91ciBzaXR1YXRpb25zIHdoZXJlIHRoaXMgZm9ybXVsYSBpcyBwb3RlbnRpYWxseQorICAgICAgIHByb2JsZW1hdGljOgogCi0JICAgKDEpIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB6IGlzIHN1Ym5vcm1hbC4gIFRoZW4gaHlwb3QgaXMgc3Vibm9ybWFsLAotCSAgIHNvIGhhcyBmZXdlciB0aGFuIHRoZSB1c3VhbCBudW1iZXIgb2YgYml0cyBvZiBhY2N1cmFjeSwgaGVuY2UgbWF5Ci0JICAgaGF2ZSBsYXJnZSByZWxhdGl2ZSBlcnJvci4gIFRoaXMgdGhlbiBnaXZlcyBhIGxhcmdlIGFic29sdXRlIGVycm9yCi0JICAgaW4gdGhlIGxvZy4gIFRoaXMgY2FuIGJlIHNvbHZlZCBieSByZXNjYWxpbmcgeiBieSBhIHN1aXRhYmxlIHBvd2VyCi0JICAgb2YgMi4KKyAgICAgICAoMSkgdGhlIGFic29sdXRlIHZhbHVlIG9mIHogaXMgc3Vibm9ybWFsLiAgVGhlbiBoeXBvdCBpcyBzdWJub3JtYWwsCisgICAgICAgc28gaGFzIGZld2VyIHRoYW4gdGhlIHVzdWFsIG51bWJlciBvZiBiaXRzIG9mIGFjY3VyYWN5LCBoZW5jZSBtYXkKKyAgICAgICBoYXZlIGxhcmdlIHJlbGF0aXZlIGVycm9yLiAgVGhpcyB0aGVuIGdpdmVzIGEgbGFyZ2UgYWJzb2x1dGUgZXJyb3IKKyAgICAgICBpbiB0aGUgbG9nLiAgVGhpcyBjYW4gYmUgc29sdmVkIGJ5IHJlc2NhbGluZyB6IGJ5IGEgc3VpdGFibGUgcG93ZXIKKyAgICAgICBvZiAyLgogCi0JICAgKDIpIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB6IGlzIGdyZWF0ZXIgdGhhbiBEQkxfTUFYIChlLmcuIHdoZW4gYm90aAotCSAgIHoucmVhbCBhbmQgei5pbWFnIGFyZSB3aXRoaW4gYSBmYWN0b3Igb2YgMS9zcXJ0KDIpIG9mIERCTF9NQVgpCi0JICAgQWdhaW4sIHJlc2NhbGluZyBzb2x2ZXMgdGhpcy4KKyAgICAgICAoMikgdGhlIGFic29sdXRlIHZhbHVlIG9mIHogaXMgZ3JlYXRlciB0aGFuIERCTF9NQVggKGUuZy4gd2hlbiBib3RoCisgICAgICAgei5yZWFsIGFuZCB6LmltYWcgYXJlIHdpdGhpbiBhIGZhY3RvciBvZiAxL3NxcnQoMikgb2YgREJMX01BWCkKKyAgICAgICBBZ2FpbiwgcmVzY2FsaW5nIHNvbHZlcyB0aGlzLgogCi0JICAgKDMpIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB6IGlzIGNsb3NlIHRvIDEuICBJbiB0aGlzIGNhc2UgaXQncwotCSAgIGRpZmZpY3VsdCB0byBhY2hpZXZlIGdvb2QgYWNjdXJhY3ksIGF0IGxlYXN0IGluIHBhcnQgYmVjYXVzZSBhCi0JICAgY2hhbmdlIG9mIDF1bHAgaW4gdGhlIHJlYWwgb3IgaW1hZ2luYXJ5IHBhcnQgb2YgeiBjYW4gcmVzdWx0IGluIGEKLQkgICBjaGFuZ2Ugb2YgYmlsbGlvbnMgb2YgdWxwcyBpbiB0aGUgY29ycmVjdGx5IHJvdW5kZWQgYW5zd2VyLgorICAgICAgICgzKSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgeiBpcyBjbG9zZSB0byAxLiAgSW4gdGhpcyBjYXNlIGl0J3MKKyAgICAgICBkaWZmaWN1bHQgdG8gYWNoaWV2ZSBnb29kIGFjY3VyYWN5LCBhdCBsZWFzdCBpbiBwYXJ0IGJlY2F1c2UgYQorICAgICAgIGNoYW5nZSBvZiAxdWxwIGluIHRoZSByZWFsIG9yIGltYWdpbmFyeSBwYXJ0IG9mIHogY2FuIHJlc3VsdCBpbiBhCisgICAgICAgY2hhbmdlIG9mIGJpbGxpb25zIG9mIHVscHMgaW4gdGhlIGNvcnJlY3RseSByb3VuZGVkIGFuc3dlci4KIAotCSAgICg0KSB6ID0gMC4gIFRoZSBzaW1wbGVzdCB0aGluZyB0byBkbyBoZXJlIGlzIHRvIGNhbGwgdGhlCi0JICAgZmxvYXRpbmctcG9pbnQgbG9nIHdpdGggYW4gYXJndW1lbnQgb2YgMCwgYW5kIGxldCBpdHMgYmVoYXZpb3VyCi0JICAgKHJldHVybmluZyAtaW5maW5pdHksIHNpZ25hbGluZyBhIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiwgc2V0dGluZwotCSAgIGVycm5vLCBvciB3aGF0ZXZlcikgZGV0ZXJtaW5lIHRoYXQgb2YgY19sb2cuICBTbyB0aGUgdXN1YWwgZm9ybXVsYQotCSAgIGlzIGZpbmUgaGVyZS4KKyAgICAgICAoNCkgeiA9IDAuICBUaGUgc2ltcGxlc3QgdGhpbmcgdG8gZG8gaGVyZSBpcyB0byBjYWxsIHRoZQorICAgICAgIGZsb2F0aW5nLXBvaW50IGxvZyB3aXRoIGFuIGFyZ3VtZW50IG9mIDAsIGFuZCBsZXQgaXRzIGJlaGF2aW91cgorICAgICAgIChyZXR1cm5pbmcgLWluZmluaXR5LCBzaWduYWxpbmcgYSBmbG9hdGluZy1wb2ludCBleGNlcHRpb24sIHNldHRpbmcKKyAgICAgICBlcnJubywgb3Igd2hhdGV2ZXIpIGRldGVybWluZSB0aGF0IG9mIGNfbG9nLiAgU28gdGhlIHVzdWFsIGZvcm11bGEKKyAgICAgICBpcyBmaW5lIGhlcmUuCiAKLQkgKi8KKyAgICAgKi8KIAotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgYXgsIGF5LCBhbSwgYW4sIGg7CisgICAgUHlfY29tcGxleCByOworICAgIGRvdWJsZSBheCwgYXksIGFtLCBhbiwgaDsKIAotCVNQRUNJQUxfVkFMVUUoeiwgbG9nX3NwZWNpYWxfdmFsdWVzKTsKKyAgICBTUEVDSUFMX1ZBTFVFKHosIGxvZ19zcGVjaWFsX3ZhbHVlcyk7CiAKLQlheCA9IGZhYnMoei5yZWFsKTsKLQlheSA9IGZhYnMoei5pbWFnKTsKKyAgICBheCA9IGZhYnMoei5yZWFsKTsKKyAgICBheSA9IGZhYnMoei5pbWFnKTsKIAotCWlmIChheCA+IENNX0xBUkdFX0RPVUJMRSB8fCBheSA+IENNX0xBUkdFX0RPVUJMRSkgewotCQlyLnJlYWwgPSBsb2coaHlwb3QoYXgvMi4sIGF5LzIuKSkgKyBNX0xOMjsKLQl9IGVsc2UgaWYgKGF4IDwgREJMX01JTiAmJiBheSA8IERCTF9NSU4pIHsKLQkJaWYgKGF4ID4gMC4gfHwgYXkgPiAwLikgewotCQkJLyogY2F0Y2ggY2FzZXMgd2hlcmUgaHlwb3QoYXgsIGF5KSBpcyBzdWJub3JtYWwgKi8KLQkJCXIucmVhbCA9IGxvZyhoeXBvdChsZGV4cChheCwgREJMX01BTlRfRElHKSwKLQkJCQkgbGRleHAoYXksIERCTF9NQU5UX0RJRykpKSAtIERCTF9NQU5UX0RJRypNX0xOMjsKLQkJfQotCQllbHNlIHsKLQkJCS8qIGxvZygrLy0wLiArLy0gMGkpICovCi0JCQlyLnJlYWwgPSAtSU5GOwotCQkJci5pbWFnID0gYXRhbjIoei5pbWFnLCB6LnJlYWwpOwotCQkJZXJybm8gPSBFRE9NOwotCQkJcmV0dXJuIHI7Ci0JCX0KLQl9IGVsc2UgewotCQloID0gaHlwb3QoYXgsIGF5KTsKLQkJaWYgKDAuNzEgPD0gaCAmJiBoIDw9IDEuNzMpIHsKLQkJCWFtID0gYXggPiBheSA/IGF4IDogYXk7ICAvKiBtYXgoYXgsIGF5KSAqLwotCQkJYW4gPSBheCA+IGF5ID8gYXkgOiBheDsgIC8qIG1pbihheCwgYXkpICovCi0JCQlyLnJlYWwgPSBsb2cxcCgoYW0tMSkqKGFtKzEpK2FuKmFuKS8yLjsKLQkJfSBlbHNlIHsKLQkJCXIucmVhbCA9IGxvZyhoKTsKLQkJfQotCX0KLQlyLmltYWcgPSBhdGFuMih6LmltYWcsIHoucmVhbCk7Ci0JZXJybm8gPSAwOwotCXJldHVybiByOworICAgIGlmIChheCA+IENNX0xBUkdFX0RPVUJMRSB8fCBheSA+IENNX0xBUkdFX0RPVUJMRSkgeworICAgICAgICByLnJlYWwgPSBsb2coaHlwb3QoYXgvMi4sIGF5LzIuKSkgKyBNX0xOMjsKKyAgICB9IGVsc2UgaWYgKGF4IDwgREJMX01JTiAmJiBheSA8IERCTF9NSU4pIHsKKyAgICAgICAgaWYgKGF4ID4gMC4gfHwgYXkgPiAwLikgeworICAgICAgICAgICAgLyogY2F0Y2ggY2FzZXMgd2hlcmUgaHlwb3QoYXgsIGF5KSBpcyBzdWJub3JtYWwgKi8KKyAgICAgICAgICAgIHIucmVhbCA9IGxvZyhoeXBvdChsZGV4cChheCwgREJMX01BTlRfRElHKSwKKyAgICAgICAgICAgICAgICAgICAgIGxkZXhwKGF5LCBEQkxfTUFOVF9ESUcpKSkgLSBEQkxfTUFOVF9ESUcqTV9MTjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBsb2coKy8tMC4gKy8tIDBpKSAqLworICAgICAgICAgICAgci5yZWFsID0gLUlORjsKKyAgICAgICAgICAgIHIuaW1hZyA9IGF0YW4yKHouaW1hZywgei5yZWFsKTsKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaCA9IGh5cG90KGF4LCBheSk7CisgICAgICAgIGlmICgwLjcxIDw9IGggJiYgaCA8PSAxLjczKSB7CisgICAgICAgICAgICBhbSA9IGF4ID4gYXkgPyBheCA6IGF5OyAgLyogbWF4KGF4LCBheSkgKi8KKyAgICAgICAgICAgIGFuID0gYXggPiBheSA/IGF5IDogYXg7ICAvKiBtaW4oYXgsIGF5KSAqLworICAgICAgICAgICAgci5yZWFsID0gbG9nMXAoKGFtLTEpKihhbSsxKSthbiphbikvMi47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLnJlYWwgPSBsb2coaCk7CisgICAgICAgIH0KKyAgICB9CisgICAgci5pbWFnID0gYXRhbjIoei5pbWFnLCB6LnJlYWwpOworICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gcjsKIH0KIAogCiBzdGF0aWMgUHlfY29tcGxleAogY19sb2cxMChQeV9jb21wbGV4IHopCiB7Ci0JUHlfY29tcGxleCByOwotCWludCBlcnJub19zYXZlOworICAgIFB5X2NvbXBsZXggcjsKKyAgICBpbnQgZXJybm9fc2F2ZTsKIAotCXIgPSBjX2xvZyh6KTsKLQllcnJub19zYXZlID0gZXJybm87IC8qIGp1c3QgaW4gY2FzZSB0aGUgZGl2aXNpb25zIGFmZmVjdCBlcnJubyAqLwotCXIucmVhbCA9IHIucmVhbCAvIE1fTE4xMDsKLQlyLmltYWcgPSByLmltYWcgLyBNX0xOMTA7Ci0JZXJybm8gPSBlcnJub19zYXZlOwotCXJldHVybiByOworICAgIHIgPSBjX2xvZyh6KTsKKyAgICBlcnJub19zYXZlID0gZXJybm87IC8qIGp1c3QgaW4gY2FzZSB0aGUgZGl2aXNpb25zIGFmZmVjdCBlcnJubyAqLworICAgIHIucmVhbCA9IHIucmVhbCAvIE1fTE4xMDsKKyAgICByLmltYWcgPSByLmltYWcgLyBNX0xOMTA7CisgICAgZXJybm8gPSBlcnJub19zYXZlOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19sb2cxMF9kb2MsCkBAIC01ODYsMTQgKzU4NiwxNCBAQAogc3RhdGljIFB5X2NvbXBsZXgKIGNfc2luKFB5X2NvbXBsZXggeikKIHsKLQkvKiBzaW4oeikgPSAtaSBzaW4oaXopICovCi0JUHlfY29tcGxleCBzLCByOwotCXMucmVhbCA9IC16LmltYWc7Ci0Jcy5pbWFnID0gei5yZWFsOwotCXMgPSBjX3Npbmgocyk7Ci0Jci5yZWFsID0gcy5pbWFnOwotCXIuaW1hZyA9IC1zLnJlYWw7Ci0JcmV0dXJuIHI7CisgICAgLyogc2luKHopID0gLWkgc2luKGl6KSAqLworICAgIFB5X2NvbXBsZXggcywgcjsKKyAgICBzLnJlYWwgPSAtei5pbWFnOworICAgIHMuaW1hZyA9IHoucmVhbDsKKyAgICBzID0gY19zaW5oKHMpOworICAgIHIucmVhbCA9IHMuaW1hZzsKKyAgICByLmltYWcgPSAtcy5yZWFsOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19zaW5fZG9jLApAQCAtNjA4LDUwICs2MDgsNTAgQEAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX3NpbmgoUHlfY29tcGxleCB6KQogewotCVB5X2NvbXBsZXggcjsKLQlkb3VibGUgeF9taW51c19vbmU7CisgICAgUHlfY29tcGxleCByOworICAgIGRvdWJsZSB4X21pbnVzX29uZTsKIAotCS8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciBzaW5oKCsvLWluZiArIGl5KSBpZiB5IGlzIGZpbml0ZSBhbmQKLQkgICBub256ZXJvICovCi0JaWYgKCFQeV9JU19GSU5JVEUoei5yZWFsKSB8fCAhUHlfSVNfRklOSVRFKHouaW1hZykpIHsKLQkJaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkgJiYgUHlfSVNfRklOSVRFKHouaW1hZykKLQkJICAgICYmICh6LmltYWcgIT0gMC4pKSB7Ci0JCQlpZiAoei5yZWFsID4gMCkgewotCQkJCXIucmVhbCA9IGNvcHlzaWduKElORiwgY29zKHouaW1hZykpOwotCQkJCXIuaW1hZyA9IGNvcHlzaWduKElORiwgc2luKHouaW1hZykpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJci5yZWFsID0gLWNvcHlzaWduKElORiwgY29zKHouaW1hZykpOwotCQkJCXIuaW1hZyA9IGNvcHlzaWduKElORiwgc2luKHouaW1hZykpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJciA9IHNpbmhfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHoucmVhbCldCi0JCQkJICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSh6LmltYWcpXTsKLQkJfQotCQkvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgeSBpcyArLy0gaW5maW5pdHkgYW5kIHggaXMgbm90Ci0JCSAgIGEgTmFOICovCi0JCWlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpICYmICFQeV9JU19OQU4oei5yZWFsKSkKLQkJCWVycm5vID0gRURPTTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCQlyZXR1cm4gcjsKLQl9CisgICAgLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHNpbmgoKy8taW5mICsgaXkpIGlmIHkgaXMgZmluaXRlIGFuZAorICAgICAgIG5vbnplcm8gKi8KKyAgICBpZiAoIVB5X0lTX0ZJTklURSh6LnJlYWwpIHx8ICFQeV9JU19GSU5JVEUoei5pbWFnKSkgeworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSAmJiBQeV9JU19GSU5JVEUoei5pbWFnKQorICAgICAgICAgICAgJiYgKHouaW1hZyAhPSAwLikpIHsKKyAgICAgICAgICAgIGlmICh6LnJlYWwgPiAwKSB7CisgICAgICAgICAgICAgICAgci5yZWFsID0gY29weXNpZ24oSU5GLCBjb3Moei5pbWFnKSk7CisgICAgICAgICAgICAgICAgci5pbWFnID0gY29weXNpZ24oSU5GLCBzaW4oei5pbWFnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByLnJlYWwgPSAtY29weXNpZ24oSU5GLCBjb3Moei5pbWFnKSk7CisgICAgICAgICAgICAgICAgci5pbWFnID0gY29weXNpZ24oSU5GLCBzaW4oei5pbWFnKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByID0gc2luaF9zcGVjaWFsX3ZhbHVlc1tzcGVjaWFsX3R5cGUoei5yZWFsKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZSh6LmltYWcpXTsKKyAgICAgICAgfQorICAgICAgICAvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgeSBpcyArLy0gaW5maW5pdHkgYW5kIHggaXMgbm90CisgICAgICAgICAgIGEgTmFOICovCisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh6LmltYWcpICYmICFQeV9JU19OQU4oei5yZWFsKSkKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CiAKLQlpZiAoZmFicyh6LnJlYWwpID4gQ01fTE9HX0xBUkdFX0RPVUJMRSkgewotCQl4X21pbnVzX29uZSA9IHoucmVhbCAtIGNvcHlzaWduKDEuLCB6LnJlYWwpOwotCQlyLnJlYWwgPSBjb3Moei5pbWFnKSAqIHNpbmgoeF9taW51c19vbmUpICogUHlfTUFUSF9FOwotCQlyLmltYWcgPSBzaW4oei5pbWFnKSAqIGNvc2goeF9taW51c19vbmUpICogUHlfTUFUSF9FOwotCX0gZWxzZSB7Ci0JCXIucmVhbCA9IGNvcyh6LmltYWcpICogc2luaCh6LnJlYWwpOwotCQlyLmltYWcgPSBzaW4oei5pbWFnKSAqIGNvc2goei5yZWFsKTsKLQl9Ci0JLyogZGV0ZWN0IG92ZXJmbG93LCBhbmQgc2V0IGVycm5vIGFjY29yZGluZ2x5ICovCi0JaWYgKFB5X0lTX0lORklOSVRZKHIucmVhbCkgfHwgUHlfSVNfSU5GSU5JVFkoci5pbWFnKSkKLQkJZXJybm8gPSBFUkFOR0U7Ci0JZWxzZQotCQllcnJubyA9IDA7Ci0JcmV0dXJuIHI7CisgICAgaWYgKGZhYnMoei5yZWFsKSA+IENNX0xPR19MQVJHRV9ET1VCTEUpIHsKKyAgICAgICAgeF9taW51c19vbmUgPSB6LnJlYWwgLSBjb3B5c2lnbigxLiwgei5yZWFsKTsKKyAgICAgICAgci5yZWFsID0gY29zKHouaW1hZykgKiBzaW5oKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKKyAgICAgICAgci5pbWFnID0gc2luKHouaW1hZykgKiBjb3NoKHhfbWludXNfb25lKSAqIFB5X01BVEhfRTsKKyAgICB9IGVsc2UgeworICAgICAgICByLnJlYWwgPSBjb3Moei5pbWFnKSAqIHNpbmgoei5yZWFsKTsKKyAgICAgICAgci5pbWFnID0gc2luKHouaW1hZykgKiBjb3NoKHoucmVhbCk7CisgICAgfQorICAgIC8qIGRldGVjdCBvdmVyZmxvdywgYW5kIHNldCBlcnJubyBhY2NvcmRpbmdseSAqLworICAgIGlmIChQeV9JU19JTkZJTklUWShyLnJlYWwpIHx8IFB5X0lTX0lORklOSVRZKHIuaW1hZykpCisgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgIGVsc2UKKyAgICAgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19zaW5oX2RvYywKQEAgLTY2NSw2OCArNjY1LDY4IEBACiBzdGF0aWMgUHlfY29tcGxleAogY19zcXJ0KFB5X2NvbXBsZXggeikKIHsKLQkvKgotCSAgIE1ldGhvZDogdXNlIHN5bW1ldHJpZXMgdG8gcmVkdWNlIHRvIHRoZSBjYXNlIHdoZW4geCA9IHoucmVhbCBhbmQgeQotCSAgID0gei5pbWFnIGFyZSBub25uZWdhdGl2ZS4gIFRoZW4gdGhlIHJlYWwgcGFydCBvZiB0aGUgcmVzdWx0IGlzCi0JICAgZ2l2ZW4gYnkKKyAgICAvKgorICAgICAgIE1ldGhvZDogdXNlIHN5bW1ldHJpZXMgdG8gcmVkdWNlIHRvIHRoZSBjYXNlIHdoZW4geCA9IHoucmVhbCBhbmQgeQorICAgICAgID0gei5pbWFnIGFyZSBub25uZWdhdGl2ZS4gIFRoZW4gdGhlIHJlYWwgcGFydCBvZiB0aGUgcmVzdWx0IGlzCisgICAgICAgZ2l2ZW4gYnkKIAotCSAgICAgcyA9IHNxcnQoKHggKyBoeXBvdCh4LCB5KSkvMikKKyAgICAgICAgIHMgPSBzcXJ0KCh4ICsgaHlwb3QoeCwgeSkpLzIpCiAKLQkgICBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IGlzCisgICAgICAgYW5kIHRoZSBpbWFnaW5hcnkgcGFydCBpcwogCi0JICAgICBkID0gKHkvMikvcworICAgICAgICAgZCA9ICh5LzIpL3MKIAotCSAgIElmIGVpdGhlciB4IG9yIHkgaXMgdmVyeSBsYXJnZSB0aGVuIHRoZXJlJ3MgYSByaXNrIG9mIG92ZXJmbG93IGluCi0JICAgY29tcHV0YXRpb24gb2YgdGhlIGV4cHJlc3Npb24geCArIGh5cG90KHgsIHkpLiAgV2UgY2FuIGF2b2lkIHRoaXMKLQkgICBieSByZXdyaXRpbmcgdGhlIGZvcm11bGEgZm9yIHMgYXM6CisgICAgICAgSWYgZWl0aGVyIHggb3IgeSBpcyB2ZXJ5IGxhcmdlIHRoZW4gdGhlcmUncyBhIHJpc2sgb2Ygb3ZlcmZsb3cgaW4KKyAgICAgICBjb21wdXRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiB4ICsgaHlwb3QoeCwgeSkuICBXZSBjYW4gYXZvaWQgdGhpcworICAgICAgIGJ5IHJld3JpdGluZyB0aGUgZm9ybXVsYSBmb3IgcyBhczoKIAotCSAgICAgcyA9IDIqc3FydCh4LzggKyBoeXBvdCh4LzgsIHkvOCkpCisgICAgICAgICBzID0gMipzcXJ0KHgvOCArIGh5cG90KHgvOCwgeS84KSkKIAotCSAgIFRoaXMgY29zdHMgdXMgdHdvIGV4dHJhIG11bHRpcGxpY2F0aW9ucy9kaXZpc2lvbnMsIGJ1dCBhdm9pZHMgdGhlCi0JICAgb3ZlcmhlYWQgb2YgY2hlY2tpbmcgZm9yIHggYW5kIHkgbGFyZ2UuCisgICAgICAgVGhpcyBjb3N0cyB1cyB0d28gZXh0cmEgbXVsdGlwbGljYXRpb25zL2RpdmlzaW9ucywgYnV0IGF2b2lkcyB0aGUKKyAgICAgICBvdmVyaGVhZCBvZiBjaGVja2luZyBmb3IgeCBhbmQgeSBsYXJnZS4KIAotCSAgIElmIGJvdGggeCBhbmQgeSBhcmUgc3Vibm9ybWFsIHRoZW4gaHlwb3QoeCwgeSkgbWF5IGFsc28gYmUKLQkgICBzdWJub3JtYWwsIHNvIHdpbGwgbGFjayBmdWxsIHByZWNpc2lvbi4gIFdlIHNvbHZlIHRoaXMgYnkgcmVzY2FsaW5nCi0JICAgeCBhbmQgeSBieSBhIHN1ZmZpY2llbnRseSBsYXJnZSBwb3dlciBvZiAyIHRvIGVuc3VyZSB0aGF0IHggYW5kIHkKLQkgICBhcmUgbm9ybWFsLgotCSovCisgICAgICAgSWYgYm90aCB4IGFuZCB5IGFyZSBzdWJub3JtYWwgdGhlbiBoeXBvdCh4LCB5KSBtYXkgYWxzbyBiZQorICAgICAgIHN1Ym5vcm1hbCwgc28gd2lsbCBsYWNrIGZ1bGwgcHJlY2lzaW9uLiAgV2Ugc29sdmUgdGhpcyBieSByZXNjYWxpbmcKKyAgICAgICB4IGFuZCB5IGJ5IGEgc3VmZmljaWVudGx5IGxhcmdlIHBvd2VyIG9mIDIgdG8gZW5zdXJlIHRoYXQgeCBhbmQgeQorICAgICAgIGFyZSBub3JtYWwuCisgICAgKi8KIAogCi0JUHlfY29tcGxleCByOwotCWRvdWJsZSBzLGQ7Ci0JZG91YmxlIGF4LCBheTsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgZG91YmxlIHMsZDsKKyAgICBkb3VibGUgYXgsIGF5OwogCi0JU1BFQ0lBTF9WQUxVRSh6LCBzcXJ0X3NwZWNpYWxfdmFsdWVzKTsKKyAgICBTUEVDSUFMX1ZBTFVFKHosIHNxcnRfc3BlY2lhbF92YWx1ZXMpOwogCi0JaWYgKHoucmVhbCA9PSAwLiAmJiB6LmltYWcgPT0gMC4pIHsKLQkJci5yZWFsID0gMC47Ci0JCXIuaW1hZyA9IHouaW1hZzsKLQkJcmV0dXJuIHI7Ci0JfQorICAgIGlmICh6LnJlYWwgPT0gMC4gJiYgei5pbWFnID09IDAuKSB7CisgICAgICAgIHIucmVhbCA9IDAuOworICAgICAgICByLmltYWcgPSB6LmltYWc7CisgICAgICAgIHJldHVybiByOworICAgIH0KIAotCWF4ID0gZmFicyh6LnJlYWwpOwotCWF5ID0gZmFicyh6LmltYWcpOworICAgIGF4ID0gZmFicyh6LnJlYWwpOworICAgIGF5ID0gZmFicyh6LmltYWcpOwogCi0JaWYgKGF4IDwgREJMX01JTiAmJiBheSA8IERCTF9NSU4gJiYgKGF4ID4gMC4gfHwgYXkgPiAwLikpIHsKLQkJLyogaGVyZSB3ZSBjYXRjaCBjYXNlcyB3aGVyZSBoeXBvdChheCwgYXkpIGlzIHN1Ym5vcm1hbCAqLwotCQlheCA9IGxkZXhwKGF4LCBDTV9TQ0FMRV9VUCk7Ci0JCXMgPSBsZGV4cChzcXJ0KGF4ICsgaHlwb3QoYXgsIGxkZXhwKGF5LCBDTV9TQ0FMRV9VUCkpKSwKLQkJCSAgQ01fU0NBTEVfRE9XTik7Ci0JfSBlbHNlIHsKLQkJYXggLz0gOC47Ci0JCXMgPSAyLipzcXJ0KGF4ICsgaHlwb3QoYXgsIGF5LzguKSk7Ci0JfQotCWQgPSBheS8oMi4qcyk7CisgICAgaWYgKGF4IDwgREJMX01JTiAmJiBheSA8IERCTF9NSU4gJiYgKGF4ID4gMC4gfHwgYXkgPiAwLikpIHsKKyAgICAgICAgLyogaGVyZSB3ZSBjYXRjaCBjYXNlcyB3aGVyZSBoeXBvdChheCwgYXkpIGlzIHN1Ym5vcm1hbCAqLworICAgICAgICBheCA9IGxkZXhwKGF4LCBDTV9TQ0FMRV9VUCk7CisgICAgICAgIHMgPSBsZGV4cChzcXJ0KGF4ICsgaHlwb3QoYXgsIGxkZXhwKGF5LCBDTV9TQ0FMRV9VUCkpKSwKKyAgICAgICAgICAgICAgICAgIENNX1NDQUxFX0RPV04pOworICAgIH0gZWxzZSB7CisgICAgICAgIGF4IC89IDguOworICAgICAgICBzID0gMi4qc3FydChheCArIGh5cG90KGF4LCBheS84LikpOworICAgIH0KKyAgICBkID0gYXkvKDIuKnMpOwogCi0JaWYgKHoucmVhbCA+PSAwLikgewotCQlyLnJlYWwgPSBzOwotCQlyLmltYWcgPSBjb3B5c2lnbihkLCB6LmltYWcpOwotCX0gZWxzZSB7Ci0JCXIucmVhbCA9IGQ7Ci0JCXIuaW1hZyA9IGNvcHlzaWduKHMsIHouaW1hZyk7Ci0JfQotCWVycm5vID0gMDsKLQlyZXR1cm4gcjsKKyAgICBpZiAoei5yZWFsID49IDAuKSB7CisgICAgICAgIHIucmVhbCA9IHM7CisgICAgICAgIHIuaW1hZyA9IGNvcHlzaWduKGQsIHouaW1hZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgci5yZWFsID0gZDsKKyAgICAgICAgci5pbWFnID0gY29weXNpZ24ocywgei5pbWFnKTsKKyAgICB9CisgICAgZXJybm8gPSAwOworICAgIHJldHVybiByOwogfQogCiBQeURvY19TVFJWQVIoY19zcXJ0X2RvYywKQEAgLTczOCwxNCArNzM4LDE0IEBACiBzdGF0aWMgUHlfY29tcGxleAogY190YW4oUHlfY29tcGxleCB6KQogewotCS8qIHRhbih6KSA9IC1pIHRhbmgoaXopICovCi0JUHlfY29tcGxleCBzLCByOwotCXMucmVhbCA9IC16LmltYWc7Ci0Jcy5pbWFnID0gei5yZWFsOwotCXMgPSBjX3Rhbmgocyk7Ci0Jci5yZWFsID0gcy5pbWFnOwotCXIuaW1hZyA9IC1zLnJlYWw7Ci0JcmV0dXJuIHI7CisgICAgLyogdGFuKHopID0gLWkgdGFuaChpeikgKi8KKyAgICBQeV9jb21wbGV4IHMsIHI7CisgICAgcy5yZWFsID0gLXouaW1hZzsKKyAgICBzLmltYWcgPSB6LnJlYWw7CisgICAgcyA9IGNfdGFuaChzKTsKKyAgICByLnJlYWwgPSBzLmltYWc7CisgICAgci5pbWFnID0gLXMucmVhbDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGNfdGFuX2RvYywKQEAgLTc2MCw2NSArNzYwLDY1IEBACiBzdGF0aWMgUHlfY29tcGxleAogY190YW5oKFB5X2NvbXBsZXggeikKIHsKLQkvKiBGb3JtdWxhOgorICAgIC8qIEZvcm11bGE6CiAKLQkgICB0YW5oKHgraXkpID0gKHRhbmgoeCkoMSt0YW4oeSleMikgKyBpIHRhbih5KSgxLXRhbmgoeCkpXjIpIC8KLQkgICAoMSt0YW4oeSleMiB0YW5oKHgpXjIpCisgICAgICAgdGFuaCh4K2l5KSA9ICh0YW5oKHgpKDErdGFuKHkpXjIpICsgaSB0YW4oeSkoMS10YW5oKHgpKV4yKSAvCisgICAgICAgKDErdGFuKHkpXjIgdGFuaCh4KV4yKQogCi0JICAgVG8gYXZvaWQgZXhjZXNzaXZlIHJvdW5kb2ZmIGVycm9yLCAxLXRhbmgoeCleMiBpcyBiZXR0ZXIgY29tcHV0ZWQKLQkgICBhcyAxL2Nvc2goeCleMi4gIFdoZW4gYWJzKHgpIGlzIGxhcmdlLCB3ZSBhcHByb3hpbWF0ZSAxLXRhbmgoeCleMgotCSAgIGJ5IDQgZXhwKC0yKngpIGluc3RlYWQsIHRvIGF2b2lkIHBvc3NpYmxlIG92ZXJmbG93IGluIHRoZQotCSAgIGNvbXB1dGF0aW9uIG9mIGNvc2goeCkuCisgICAgICAgVG8gYXZvaWQgZXhjZXNzaXZlIHJvdW5kb2ZmIGVycm9yLCAxLXRhbmgoeCleMiBpcyBiZXR0ZXIgY29tcHV0ZWQKKyAgICAgICBhcyAxL2Nvc2goeCleMi4gIFdoZW4gYWJzKHgpIGlzIGxhcmdlLCB3ZSBhcHByb3hpbWF0ZSAxLXRhbmgoeCleMgorICAgICAgIGJ5IDQgZXhwKC0yKngpIGluc3RlYWQsIHRvIGF2b2lkIHBvc3NpYmxlIG92ZXJmbG93IGluIHRoZQorICAgICAgIGNvbXB1dGF0aW9uIG9mIGNvc2goeCkuCiAKLQkqLworICAgICovCiAKLQlQeV9jb21wbGV4IHI7Ci0JZG91YmxlIHR4LCB0eSwgY3gsIHR4dHksIGRlbm9tOworICAgIFB5X2NvbXBsZXggcjsKKyAgICBkb3VibGUgdHgsIHR5LCBjeCwgdHh0eSwgZGVub207CiAKLQkvKiBzcGVjaWFsIHRyZWF0bWVudCBmb3IgdGFuaCgrLy1pbmYgKyBpeSkgaWYgeSBpcyBmaW5pdGUgYW5kCi0JICAgbm9uemVybyAqLwotCWlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7Ci0JCWlmIChQeV9JU19JTkZJTklUWSh6LnJlYWwpICYmIFB5X0lTX0ZJTklURSh6LmltYWcpCi0JCSAgICAmJiAoei5pbWFnICE9IDAuKSkgewotCQkJaWYgKHoucmVhbCA+IDApIHsKLQkJCQlyLnJlYWwgPSAxLjA7Ci0JCQkJci5pbWFnID0gY29weXNpZ24oMC4sCi0JCQkJCQkgIDIuKnNpbih6LmltYWcpKmNvcyh6LmltYWcpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXIucmVhbCA9IC0xLjA7Ci0JCQkJci5pbWFnID0gY29weXNpZ24oMC4sCi0JCQkJCQkgIDIuKnNpbih6LmltYWcpKmNvcyh6LmltYWcpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXIgPSB0YW5oX3NwZWNpYWxfdmFsdWVzW3NwZWNpYWxfdHlwZSh6LnJlYWwpXQotCQkJCSAgICAgICAgICAgICAgIFtzcGVjaWFsX3R5cGUoei5pbWFnKV07Ci0JCX0KLQkJLyogbmVlZCB0byBzZXQgZXJybm8gPSBFRE9NIGlmIHouaW1hZyBpcyArLy1pbmZpbml0eSBhbmQKLQkJICAgei5yZWFsIGlzIGZpbml0ZSAqLwotCQlpZiAoUHlfSVNfSU5GSU5JVFkoei5pbWFnKSAmJiBQeV9JU19GSU5JVEUoei5yZWFsKSkKLQkJCWVycm5vID0gRURPTTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCQlyZXR1cm4gcjsKLQl9CisgICAgLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHRhbmgoKy8taW5mICsgaXkpIGlmIHkgaXMgZmluaXRlIGFuZAorICAgICAgIG5vbnplcm8gKi8KKyAgICBpZiAoIVB5X0lTX0ZJTklURSh6LnJlYWwpIHx8ICFQeV9JU19GSU5JVEUoei5pbWFnKSkgeworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSAmJiBQeV9JU19GSU5JVEUoei5pbWFnKQorICAgICAgICAgICAgJiYgKHouaW1hZyAhPSAwLikpIHsKKyAgICAgICAgICAgIGlmICh6LnJlYWwgPiAwKSB7CisgICAgICAgICAgICAgICAgci5yZWFsID0gMS4wOworICAgICAgICAgICAgICAgIHIuaW1hZyA9IGNvcHlzaWduKDAuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuKnNpbih6LmltYWcpKmNvcyh6LmltYWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHIucmVhbCA9IC0xLjA7CisgICAgICAgICAgICAgICAgci5pbWFnID0gY29weXNpZ24oMC4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4qc2luKHouaW1hZykqY29zKHouaW1hZykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgciA9IHRhbmhfc3BlY2lhbF92YWx1ZXNbc3BlY2lhbF90eXBlKHoucmVhbCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcGVjaWFsX3R5cGUoei5pbWFnKV07CisgICAgICAgIH0KKyAgICAgICAgLyogbmVlZCB0byBzZXQgZXJybm8gPSBFRE9NIGlmIHouaW1hZyBpcyArLy1pbmZpbml0eSBhbmQKKyAgICAgICAgICAgei5yZWFsIGlzIGZpbml0ZSAqLworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoei5pbWFnKSAmJiBQeV9JU19GSU5JVEUoei5yZWFsKSkKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CiAKLQkvKiBkYW5nZXIgb2Ygb3ZlcmZsb3cgaW4gMi4qei5pbWFnICEqLwotCWlmIChmYWJzKHoucmVhbCkgPiBDTV9MT0dfTEFSR0VfRE9VQkxFKSB7Ci0JCXIucmVhbCA9IGNvcHlzaWduKDEuLCB6LnJlYWwpOwotCQlyLmltYWcgPSA0LipzaW4oei5pbWFnKSpjb3Moei5pbWFnKSpleHAoLTIuKmZhYnMoei5yZWFsKSk7Ci0JfSBlbHNlIHsKLQkJdHggPSB0YW5oKHoucmVhbCk7Ci0JCXR5ID0gdGFuKHouaW1hZyk7Ci0JCWN4ID0gMS4vY29zaCh6LnJlYWwpOwotCQl0eHR5ID0gdHgqdHk7Ci0JCWRlbm9tID0gMS4gKyB0eHR5KnR4dHk7Ci0JCXIucmVhbCA9IHR4KigxLit0eSp0eSkvZGVub207Ci0JCXIuaW1hZyA9ICgodHkvZGVub20pKmN4KSpjeDsKLQl9Ci0JZXJybm8gPSAwOwotCXJldHVybiByOworICAgIC8qIGRhbmdlciBvZiBvdmVyZmxvdyBpbiAyLip6LmltYWcgISovCisgICAgaWYgKGZhYnMoei5yZWFsKSA+IENNX0xPR19MQVJHRV9ET1VCTEUpIHsKKyAgICAgICAgci5yZWFsID0gY29weXNpZ24oMS4sIHoucmVhbCk7CisgICAgICAgIHIuaW1hZyA9IDQuKnNpbih6LmltYWcpKmNvcyh6LmltYWcpKmV4cCgtMi4qZmFicyh6LnJlYWwpKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0eCA9IHRhbmgoei5yZWFsKTsKKyAgICAgICAgdHkgPSB0YW4oei5pbWFnKTsKKyAgICAgICAgY3ggPSAxLi9jb3NoKHoucmVhbCk7CisgICAgICAgIHR4dHkgPSB0eCp0eTsKKyAgICAgICAgZGVub20gPSAxLiArIHR4dHkqdHh0eTsKKyAgICAgICAgci5yZWFsID0gdHgqKDEuK3R5KnR5KS9kZW5vbTsKKyAgICAgICAgci5pbWFnID0gKCh0eS9kZW5vbSkqY3gpKmN4OworICAgIH0KKyAgICBlcnJubyA9IDA7CisgICAgcmV0dXJuIHI7CiB9CiAKIFB5RG9jX1NUUlZBUihjX3RhbmhfZG9jLApAQCAtODMwLDIzICs4MzAsMjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbWF0aF9sb2coUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2NvbXBsZXggeDsKLQlQeV9jb21wbGV4IHk7CisgICAgUHlfY29tcGxleCB4OworICAgIFB5X2NvbXBsZXggeTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRHxEIiwgJngsICZ5KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEfEQiLCAmeCwgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgcmV0dXJuIDApCi0JeCA9IGNfbG9nKHgpOwotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDIpIHsKLQkJeSA9IGNfbG9nKHkpOwotCQl4ID0gY19xdW90KHgsIHkpOwotCX0KLQlQeUZQRV9FTkRfUFJPVEVDVCh4KQotCWlmIChlcnJubyAhPSAwKQotCQlyZXR1cm4gbWF0aF9lcnJvcigpOwotCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHgpOworICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgcmV0dXJuIDApCisgICAgeCA9IGNfbG9nKHgpOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDIpIHsKKyAgICAgICAgeSA9IGNfbG9nKHkpOworICAgICAgICB4ID0gY19xdW90KHgsIHkpOworICAgIH0KKyAgICBQeUZQRV9FTkRfUFJPVEVDVCh4KQorICAgIGlmIChlcnJubyAhPSAwKQorICAgICAgICByZXR1cm4gbWF0aF9lcnJvcigpOworICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHgpOwogfQogCiBQeURvY19TVFJWQVIoY21hdGhfbG9nX2RvYywKQEAgLTg1OSw0MiArODU5LDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9lcnJvcih2b2lkKQogewotCWlmIChlcnJubyA9PSBFRE9NKQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1hdGggZG9tYWluIGVycm9yIik7Ci0JZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm1hdGggcmFuZ2UgZXJyb3IiKTsKLQllbHNlICAgIC8qIFVuZXhwZWN0ZWQgbWF0aCBlcnJvciAqLwotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfVmFsdWVFcnJvcik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGVycm5vID09IEVET00pCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF0aCBkb21haW4gZXJyb3IiKTsKKyAgICBlbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibWF0aCByYW5nZSBlcnJvciIpOworICAgIGVsc2UgICAgLyogVW5leHBlY3RlZCBtYXRoIGVycm9yICovCisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19WYWx1ZUVycm9yKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfMShQeU9iamVjdCAqYXJncywgUHlfY29tcGxleCAoKmZ1bmMpKFB5X2NvbXBsZXgpKQogewotCVB5X2NvbXBsZXggeCxyIDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkQiLCAmeCkpCi0JCXJldHVybiBOVUxMOwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgcmV0dXJuIDApOwotCXIgPSAoKmZ1bmMpKHgpOwotCVB5RlBFX0VORF9QUk9URUNUKHIpOwotCWlmIChlcnJubyA9PSBFRE9NKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF0aCBkb21haW4gZXJyb3IiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgaWYgKGVycm5vID09IEVSQU5HRSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm1hdGggcmFuZ2UgZXJyb3IiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChyKTsKLQl9CisgICAgUHlfY29tcGxleCB4LHIgOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRCIsICZ4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCByZXR1cm4gMCk7CisgICAgciA9ICgqZnVuYykoeCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1Qocik7CisgICAgaWYgKGVycm5vID09IEVET00pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtYXRoIGRvbWFpbiBlcnJvciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibWF0aCByYW5nZSBlcnJvciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHIpOworICAgIH0KIH0KIAogI2RlZmluZSBGVU5DMShzdHVibmFtZSwgZnVuYykgXAotCXN0YXRpYyBQeU9iamVjdCAqIHN0dWJuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgeyBcCi0JCXJldHVybiBtYXRoXzEoYXJncywgZnVuYyk7IFwKLQl9CisgICAgc3RhdGljIFB5T2JqZWN0ICogc3R1Ym5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7IFwKKyAgICAgICAgcmV0dXJuIG1hdGhfMShhcmdzLCBmdW5jKTsgXAorICAgIH0KIAogRlVOQzEoY21hdGhfYWNvcywgY19hY29zKQogRlVOQzEoY21hdGhfYWNvc2gsIGNfYWNvc2gpCkBAIC05MTUsMTggKzkxNSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNtYXRoX3BoYXNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9jb21wbGV4IHo7Ci0JZG91YmxlIHBoaTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkQ6cGhhc2UiLCAmeikpCi0JCXJldHVybiBOVUxMOwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJhcmcgZnVuY3Rpb24iLCByZXR1cm4gMCkKLQlwaGkgPSBjX2F0YW4yKHopOwotCVB5RlBFX0VORF9QUk9URUNUKHBoaSkKLQlpZiAoZXJybm8gIT0gMCkKLQkJcmV0dXJuIG1hdGhfZXJyb3IoKTsKLQllbHNlCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocGhpKTsKKyAgICBQeV9jb21wbGV4IHo7CisgICAgZG91YmxlIHBoaTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkQ6cGhhc2UiLCAmeikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJhcmcgZnVuY3Rpb24iLCByZXR1cm4gMCkKKyAgICBwaGkgPSBjX2F0YW4yKHopOworICAgIFB5RlBFX0VORF9QUk9URUNUKHBoaSkKKyAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgcmV0dXJuIG1hdGhfZXJyb3IoKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocGhpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNtYXRoX3BoYXNlX2RvYywKQEAgLTkzNiwxOCArOTM2LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY21hdGhfcG9sYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2NvbXBsZXggejsKLQlkb3VibGUgciwgcGhpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRDpwb2xhciIsICZ6KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgicG9sYXIgZnVuY3Rpb24iLCByZXR1cm4gMCkKLQlwaGkgPSBjX2F0YW4yKHopOyAvKiBzaG91bGQgbm90IGNhdXNlIGFueSBleGNlcHRpb24gKi8KLQlyID0gY19hYnMoeik7IC8qIHNldHMgZXJybm8gdG8gRVJBTkdFIG9uIG92ZXJmbG93OyAgb3RoZXJ3aXNlIDAgKi8KLQlQeUZQRV9FTkRfUFJPVEVDVChyKQotCWlmIChlcnJubyAhPSAwKQotCQlyZXR1cm4gbWF0aF9lcnJvcigpOwotCWVsc2UKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImRkIiwgciwgcGhpKTsKKyAgICBQeV9jb21wbGV4IHo7CisgICAgZG91YmxlIHIsIHBoaTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkQ6cG9sYXIiLCAmeikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoInBvbGFyIGZ1bmN0aW9uIiwgcmV0dXJuIDApCisgICAgcGhpID0gY19hdGFuMih6KTsgLyogc2hvdWxkIG5vdCBjYXVzZSBhbnkgZXhjZXB0aW9uICovCisgICAgciA9IGNfYWJzKHopOyAvKiBzZXRzIGVycm5vIHRvIEVSQU5HRSBvbiBvdmVyZmxvdzsgIG90aGVyd2lzZSAwICovCisgICAgUHlGUEVfRU5EX1BST1RFQ1QocikKKyAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgcmV0dXJuIG1hdGhfZXJyb3IoKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJkZCIsIHIsIHBoaSk7CiB9CiAKIFB5RG9jX1NUUlZBUihjbWF0aF9wb2xhcl9kb2MsCkBAIC05NzEsNTEgKzk3MSw1MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNtYXRoX3JlY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2NvbXBsZXggejsKLQlkb3VibGUgciwgcGhpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZGQ6cmVjdCIsICZyLCAmcGhpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoInJlY3QgZnVuY3Rpb24iLCByZXR1cm4gMCkKKyAgICBQeV9jb21wbGV4IHo7CisgICAgZG91YmxlIHIsIHBoaTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImRkOnJlY3QiLCAmciwgJnBoaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gMDsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJyZWN0IGZ1bmN0aW9uIiwgcmV0dXJuIDApCiAKLQkvKiBkZWFsIHdpdGggc3BlY2lhbCB2YWx1ZXMgKi8KLQlpZiAoIVB5X0lTX0ZJTklURShyKSB8fCAhUHlfSVNfRklOSVRFKHBoaSkpIHsKLQkJLyogaWYgciBpcyArLy1pbmZpbml0eSBhbmQgcGhpIGlzIGZpbml0ZSBidXQgbm9uemVybyB0aGVuCi0JCSAgIHJlc3VsdCBpcyAoKy1JTkYgKy1JTkYgaSksIGJ1dCB3ZSBuZWVkIHRvIGNvbXB1dGUgY29zKHBoaSkKLQkJICAgYW5kIHNpbihwaGkpIHRvIGZpZ3VyZSBvdXQgdGhlIHNpZ25zLiAqLwotCQlpZiAoUHlfSVNfSU5GSU5JVFkocikgJiYgKFB5X0lTX0ZJTklURShwaGkpCi0JCQkJCSAgJiYgKHBoaSAhPSAwLikpKSB7Ci0JCQlpZiAociA+IDApIHsKLQkJCQl6LnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyhwaGkpKTsKLQkJCQl6LmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbihwaGkpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXoucmVhbCA9IC1jb3B5c2lnbihJTkYsIGNvcyhwaGkpKTsKLQkJCQl6LmltYWcgPSAtY29weXNpZ24oSU5GLCBzaW4ocGhpKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl6ID0gcmVjdF9zcGVjaWFsX3ZhbHVlc1tzcGVjaWFsX3R5cGUocildCi0JCQkJICAgICAgICAgICAgICAgW3NwZWNpYWxfdHlwZShwaGkpXTsKLQkJfQotCQkvKiBuZWVkIHRvIHNldCBlcnJubyA9IEVET00gaWYgciBpcyBhIG5vbnplcm8gbnVtYmVyIGFuZCBwaGkKLQkJICAgaXMgaW5maW5pdGUgKi8KLQkJaWYgKHIgIT0gMC4gJiYgIVB5X0lTX05BTihyKSAmJiBQeV9JU19JTkZJTklUWShwaGkpKQotCQkJZXJybm8gPSBFRE9NOwotCQllbHNlCi0JCQllcnJubyA9IDA7Ci0JfQotCWVsc2UgewotCQl6LnJlYWwgPSByICogY29zKHBoaSk7Ci0JCXouaW1hZyA9IHIgKiBzaW4ocGhpKTsKLQkJZXJybm8gPSAwOwotCX0KKyAgICAvKiBkZWFsIHdpdGggc3BlY2lhbCB2YWx1ZXMgKi8KKyAgICBpZiAoIVB5X0lTX0ZJTklURShyKSB8fCAhUHlfSVNfRklOSVRFKHBoaSkpIHsKKyAgICAgICAgLyogaWYgciBpcyArLy1pbmZpbml0eSBhbmQgcGhpIGlzIGZpbml0ZSBidXQgbm9uemVybyB0aGVuCisgICAgICAgICAgIHJlc3VsdCBpcyAoKy1JTkYgKy1JTkYgaSksIGJ1dCB3ZSBuZWVkIHRvIGNvbXB1dGUgY29zKHBoaSkKKyAgICAgICAgICAgYW5kIHNpbihwaGkpIHRvIGZpZ3VyZSBvdXQgdGhlIHNpZ25zLiAqLworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkocikgJiYgKFB5X0lTX0ZJTklURShwaGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBoaSAhPSAwLikpKSB7CisgICAgICAgICAgICBpZiAociA+IDApIHsKKyAgICAgICAgICAgICAgICB6LnJlYWwgPSBjb3B5c2lnbihJTkYsIGNvcyhwaGkpKTsKKyAgICAgICAgICAgICAgICB6LmltYWcgPSBjb3B5c2lnbihJTkYsIHNpbihwaGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHoucmVhbCA9IC1jb3B5c2lnbihJTkYsIGNvcyhwaGkpKTsKKyAgICAgICAgICAgICAgICB6LmltYWcgPSAtY29weXNpZ24oSU5GLCBzaW4ocGhpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB6ID0gcmVjdF9zcGVjaWFsX3ZhbHVlc1tzcGVjaWFsX3R5cGUocildCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcGVjaWFsX3R5cGUocGhpKV07CisgICAgICAgIH0KKyAgICAgICAgLyogbmVlZCB0byBzZXQgZXJybm8gPSBFRE9NIGlmIHIgaXMgYSBub256ZXJvIG51bWJlciBhbmQgcGhpCisgICAgICAgICAgIGlzIGluZmluaXRlICovCisgICAgICAgIGlmIChyICE9IDAuICYmICFQeV9JU19OQU4ocikgJiYgUHlfSVNfSU5GSU5JVFkocGhpKSkKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgei5yZWFsID0gciAqIGNvcyhwaGkpOworICAgICAgICB6LmltYWcgPSByICogc2luKHBoaSk7CisgICAgICAgIGVycm5vID0gMDsKKyAgICB9CiAKLQlQeUZQRV9FTkRfUFJPVEVDVCh6KQotCWlmIChlcnJubyAhPSAwKQotCQlyZXR1cm4gbWF0aF9lcnJvcigpOwotCWVsc2UKLQkJcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoeik7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoeikKKyAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgcmV0dXJuIG1hdGhfZXJyb3IoKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHopOwogfQogCiBQeURvY19TVFJWQVIoY21hdGhfcmVjdF9kb2MsCkBAIC0xMDI1LDEwICsxMDI1LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY21hdGhfaXNuYW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2NvbXBsZXggejsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkQ6aXNuYW4iLCAmeikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoUHlfSVNfTkFOKHoucmVhbCkgfHwgUHlfSVNfTkFOKHouaW1hZykpOworICAgIFB5X2NvbXBsZXggejsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkQ6aXNuYW4iLCAmeikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoUHlfSVNfTkFOKHoucmVhbCkgfHwgUHlfSVNfTkFOKHouaW1hZykpOwogfQogCiBQeURvY19TVFJWQVIoY21hdGhfaXNuYW5fZG9jLApAQCAtMTAzOCwxMSArMTAzOCwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNtYXRoX2lzaW5mKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9jb21wbGV4IHo7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEOmlzbmFuIiwgJnopKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5X0lTX0lORklOSVRZKHoucmVhbCkgfHwKLQkJCSAgICAgICBQeV9JU19JTkZJTklUWSh6LmltYWcpKTsKKyAgICBQeV9jb21wbGV4IHo7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJEOmlzbmFuIiwgJnopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5X0lTX0lORklOSVRZKHoucmVhbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lTX0lORklOSVRZKHouaW1hZykpOwogfQogCiBQeURvY19TVFJWQVIoY21hdGhfaXNpbmZfZG9jLApAQCAtMTA1NSwxNTUgKzEwNTUsMTU1IEBACiAiZnVuY3Rpb25zIGZvciBjb21wbGV4IG51bWJlcnMuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjbWF0aF9tZXRob2RzW10gPSB7Ci0JeyJhY29zIiwgICBjbWF0aF9hY29zLCAgTUVUSF9WQVJBUkdTLCBjX2Fjb3NfZG9jfSwKLQl7ImFjb3NoIiwgIGNtYXRoX2Fjb3NoLCBNRVRIX1ZBUkFSR1MsIGNfYWNvc2hfZG9jfSwKLQl7ImFzaW4iLCAgIGNtYXRoX2FzaW4sICBNRVRIX1ZBUkFSR1MsIGNfYXNpbl9kb2N9LAotCXsiYXNpbmgiLCAgY21hdGhfYXNpbmgsIE1FVEhfVkFSQVJHUywgY19hc2luaF9kb2N9LAotCXsiYXRhbiIsICAgY21hdGhfYXRhbiwgIE1FVEhfVkFSQVJHUywgY19hdGFuX2RvY30sCi0JeyJhdGFuaCIsICBjbWF0aF9hdGFuaCwgTUVUSF9WQVJBUkdTLCBjX2F0YW5oX2RvY30sCi0JeyJjb3MiLCAgICBjbWF0aF9jb3MsICAgTUVUSF9WQVJBUkdTLCBjX2Nvc19kb2N9LAotCXsiY29zaCIsICAgY21hdGhfY29zaCwgIE1FVEhfVkFSQVJHUywgY19jb3NoX2RvY30sCi0JeyJleHAiLCAgICBjbWF0aF9leHAsICAgTUVUSF9WQVJBUkdTLCBjX2V4cF9kb2N9LAotCXsiaXNpbmYiLCAgY21hdGhfaXNpbmYsIE1FVEhfVkFSQVJHUywgY21hdGhfaXNpbmZfZG9jfSwKLQl7ImlzbmFuIiwgIGNtYXRoX2lzbmFuLCBNRVRIX1ZBUkFSR1MsIGNtYXRoX2lzbmFuX2RvY30sCi0JeyJsb2ciLCAgICBjbWF0aF9sb2csICAgTUVUSF9WQVJBUkdTLCBjbWF0aF9sb2dfZG9jfSwKLQl7ImxvZzEwIiwgIGNtYXRoX2xvZzEwLCBNRVRIX1ZBUkFSR1MsIGNfbG9nMTBfZG9jfSwKLQl7InBoYXNlIiwgIGNtYXRoX3BoYXNlLCBNRVRIX1ZBUkFSR1MsIGNtYXRoX3BoYXNlX2RvY30sCi0JeyJwb2xhciIsICBjbWF0aF9wb2xhciwgTUVUSF9WQVJBUkdTLCBjbWF0aF9wb2xhcl9kb2N9LAotCXsicmVjdCIsICAgY21hdGhfcmVjdCwgIE1FVEhfVkFSQVJHUywgY21hdGhfcmVjdF9kb2N9LAotCXsic2luIiwgICAgY21hdGhfc2luLCAgIE1FVEhfVkFSQVJHUywgY19zaW5fZG9jfSwKLQl7InNpbmgiLCAgIGNtYXRoX3NpbmgsICBNRVRIX1ZBUkFSR1MsIGNfc2luaF9kb2N9LAotCXsic3FydCIsICAgY21hdGhfc3FydCwgIE1FVEhfVkFSQVJHUywgY19zcXJ0X2RvY30sCi0JeyJ0YW4iLCAgICBjbWF0aF90YW4sICAgTUVUSF9WQVJBUkdTLCBjX3Rhbl9kb2N9LAotCXsidGFuaCIsICAgY21hdGhfdGFuaCwgIE1FVEhfVkFSQVJHUywgY190YW5oX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImFjb3MiLCAgIGNtYXRoX2Fjb3MsICBNRVRIX1ZBUkFSR1MsIGNfYWNvc19kb2N9LAorICAgIHsiYWNvc2giLCAgY21hdGhfYWNvc2gsIE1FVEhfVkFSQVJHUywgY19hY29zaF9kb2N9LAorICAgIHsiYXNpbiIsICAgY21hdGhfYXNpbiwgIE1FVEhfVkFSQVJHUywgY19hc2luX2RvY30sCisgICAgeyJhc2luaCIsICBjbWF0aF9hc2luaCwgTUVUSF9WQVJBUkdTLCBjX2FzaW5oX2RvY30sCisgICAgeyJhdGFuIiwgICBjbWF0aF9hdGFuLCAgTUVUSF9WQVJBUkdTLCBjX2F0YW5fZG9jfSwKKyAgICB7ImF0YW5oIiwgIGNtYXRoX2F0YW5oLCBNRVRIX1ZBUkFSR1MsIGNfYXRhbmhfZG9jfSwKKyAgICB7ImNvcyIsICAgIGNtYXRoX2NvcywgICBNRVRIX1ZBUkFSR1MsIGNfY29zX2RvY30sCisgICAgeyJjb3NoIiwgICBjbWF0aF9jb3NoLCAgTUVUSF9WQVJBUkdTLCBjX2Nvc2hfZG9jfSwKKyAgICB7ImV4cCIsICAgIGNtYXRoX2V4cCwgICBNRVRIX1ZBUkFSR1MsIGNfZXhwX2RvY30sCisgICAgeyJpc2luZiIsICBjbWF0aF9pc2luZiwgTUVUSF9WQVJBUkdTLCBjbWF0aF9pc2luZl9kb2N9LAorICAgIHsiaXNuYW4iLCAgY21hdGhfaXNuYW4sIE1FVEhfVkFSQVJHUywgY21hdGhfaXNuYW5fZG9jfSwKKyAgICB7ImxvZyIsICAgIGNtYXRoX2xvZywgICBNRVRIX1ZBUkFSR1MsIGNtYXRoX2xvZ19kb2N9LAorICAgIHsibG9nMTAiLCAgY21hdGhfbG9nMTAsIE1FVEhfVkFSQVJHUywgY19sb2cxMF9kb2N9LAorICAgIHsicGhhc2UiLCAgY21hdGhfcGhhc2UsIE1FVEhfVkFSQVJHUywgY21hdGhfcGhhc2VfZG9jfSwKKyAgICB7InBvbGFyIiwgIGNtYXRoX3BvbGFyLCBNRVRIX1ZBUkFSR1MsIGNtYXRoX3BvbGFyX2RvY30sCisgICAgeyJyZWN0IiwgICBjbWF0aF9yZWN0LCAgTUVUSF9WQVJBUkdTLCBjbWF0aF9yZWN0X2RvY30sCisgICAgeyJzaW4iLCAgICBjbWF0aF9zaW4sICAgTUVUSF9WQVJBUkdTLCBjX3Npbl9kb2N9LAorICAgIHsic2luaCIsICAgY21hdGhfc2luaCwgIE1FVEhfVkFSQVJHUywgY19zaW5oX2RvY30sCisgICAgeyJzcXJ0IiwgICBjbWF0aF9zcXJ0LCAgTUVUSF9WQVJBUkdTLCBjX3NxcnRfZG9jfSwKKyAgICB7InRhbiIsICAgIGNtYXRoX3RhbiwgICBNRVRIX1ZBUkFSR1MsIGNfdGFuX2RvY30sCisgICAgeyJ0YW5oIiwgICBjbWF0aF90YW5oLCAgTUVUSF9WQVJBUkdTLCBjX3RhbmhfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRjbWF0aCh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJjbWF0aCIsIGNtYXRoX21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoImNtYXRoIiwgY21hdGhfbWV0aG9kcywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJwaSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9QSSkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZSIsIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX0UpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInBpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfUEkpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImUiLCBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9FKSk7CiAKLQkvKiBpbml0aWFsaXplIHNwZWNpYWwgdmFsdWUgdGFibGVzICovCisgICAgLyogaW5pdGlhbGl6ZSBzcGVjaWFsIHZhbHVlIHRhYmxlcyAqLwogCiAjZGVmaW5lIElOSVRfU1BFQ0lBTF9WQUxVRVMoTkFNRSwgQk9EWSkgeyBQeV9jb21wbGV4KiBwID0gKFB5X2NvbXBsZXgqKU5BTUU7IEJPRFkgfQogI2RlZmluZSBDKFJFQUwsIElNQUcpIHAtPnJlYWwgPSBSRUFMOyBwLT5pbWFnID0gSU1BRzsgKytwOwogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyhhY29zX3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKFAzNCxJTkYpIEMoUCxJTkYpICBDKFAsSU5GKSAgQyhQLC1JTkYpICBDKFAsLUlORikgIEMoUDM0LC1JTkYpIEMoTixJTkYpCi0JICBDKFAxMixJTkYpIEMoVSxVKSAgICBDKFUsVSkgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoUDEyLC1JTkYpIEMoTixOKQotCSAgQyhQMTIsSU5GKSBDKFUsVSkgICAgQyhQMTIsMC4pIEMoUDEyLC0wLikgQyhVLFUpICAgICBDKFAxMiwtSU5GKSBDKFAxMixOKQotCSAgQyhQMTIsSU5GKSBDKFUsVSkgICAgQyhQMTIsMC4pIEMoUDEyLC0wLikgQyhVLFUpICAgICBDKFAxMiwtSU5GKSBDKFAxMixOKQotCSAgQyhQMTIsSU5GKSBDKFUsVSkgICAgQyhVLFUpICAgIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFAxMiwtSU5GKSBDKE4sTikKLQkgIEMoUDE0LElORikgQygwLixJTkYpIEMoMC4sSU5GKSBDKDAuLC1JTkYpIEMoMC4sLUlORikgQyhQMTQsLUlORikgQyhOLElORikKLQkgIEMoTixJTkYpICAgQyhOLE4pICAgIEMoTixOKSAgICBDKE4sTikgICAgIEMoTixOKSAgICAgQyhOLC1JTkYpICAgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKGFjb3Nfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoUDM0LElORikgQyhQLElORikgIEMoUCxJTkYpICBDKFAsLUlORikgIEMoUCwtSU5GKSAgQyhQMzQsLUlORikgQyhOLElORikKKyAgICAgIEMoUDEyLElORikgQyhVLFUpICAgIEMoVSxVKSAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhQMTIsLUlORikgQyhOLE4pCisgICAgICBDKFAxMixJTkYpIEMoVSxVKSAgICBDKFAxMiwwLikgQyhQMTIsLTAuKSBDKFUsVSkgICAgIEMoUDEyLC1JTkYpIEMoUDEyLE4pCisgICAgICBDKFAxMixJTkYpIEMoVSxVKSAgICBDKFAxMiwwLikgQyhQMTIsLTAuKSBDKFUsVSkgICAgIEMoUDEyLC1JTkYpIEMoUDEyLE4pCisgICAgICBDKFAxMixJTkYpIEMoVSxVKSAgICBDKFUsVSkgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoUDEyLC1JTkYpIEMoTixOKQorICAgICAgQyhQMTQsSU5GKSBDKDAuLElORikgQygwLixJTkYpIEMoMC4sLUlORikgQygwLiwtSU5GKSBDKFAxNCwtSU5GKSBDKE4sSU5GKQorICAgICAgQyhOLElORikgICBDKE4sTikgICAgQyhOLE4pICAgIEMoTixOKSAgICAgQyhOLE4pICAgICBDKE4sLUlORikgICBDKE4sTikKKyAgICB9KQogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyhhY29zaF9zcGVjaWFsX3ZhbHVlcywgewotCSAgQyhJTkYsLVAzNCkgQyhJTkYsLVApICBDKElORiwtUCkgIEMoSU5GLFApICBDKElORixQKSAgQyhJTkYsUDM0KSBDKElORixOKQotCSAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgICAgQyhJTkYsUDEyKSBDKE4sTikKLQkgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQygwLiwtUDEyKSBDKDAuLFAxMikgQyhVLFUpICAgIEMoSU5GLFAxMikgQyhOLE4pCi0JICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoMC4sLVAxMikgQygwLixQMTIpIEMoVSxVKSAgICBDKElORixQMTIpIEMoTixOKQotCSAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgICAgQyhJTkYsUDEyKSBDKE4sTikKLQkgIEMoSU5GLC1QMTQpIEMoSU5GLC0wLikgQyhJTkYsLTAuKSBDKElORiwwLikgQyhJTkYsMC4pIEMoSU5GLFAxNCkgQyhJTkYsTikKLQkgIEMoSU5GLE4pICAgIEMoTixOKSAgICAgQyhOLE4pICAgICBDKE4sTikgICAgQyhOLE4pICAgIEMoSU5GLE4pICAgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKGFjb3NoX3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKElORiwtUDM0KSBDKElORiwtUCkgIEMoSU5GLC1QKSAgQyhJTkYsUCkgIEMoSU5GLFApICBDKElORixQMzQpIEMoSU5GLE4pCisgICAgICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSAgICBDKElORixQMTIpIEMoTixOKQorICAgICAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKDAuLC1QMTIpIEMoMC4sUDEyKSBDKFUsVSkgICAgQyhJTkYsUDEyKSBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQygwLiwtUDEyKSBDKDAuLFAxMikgQyhVLFUpICAgIEMoSU5GLFAxMikgQyhOLE4pCisgICAgICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSAgICBDKElORixQMTIpIEMoTixOKQorICAgICAgQyhJTkYsLVAxNCkgQyhJTkYsLTAuKSBDKElORiwtMC4pIEMoSU5GLDAuKSBDKElORiwwLikgQyhJTkYsUDE0KSBDKElORixOKQorICAgICAgQyhJTkYsTikgICAgQyhOLE4pICAgICBDKE4sTikgICAgIEMoTixOKSAgICBDKE4sTikgICAgQyhJTkYsTikgICBDKE4sTikKKyAgICB9KQogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyhhc2luaF9zcGVjaWFsX3ZhbHVlcywgewotCSAgQygtSU5GLC1QMTQpIEMoLUlORiwtMC4pIEMoLUlORiwtMC4pIEMoLUlORiwwLikgQygtSU5GLDAuKSBDKC1JTkYsUDE0KSBDKC1JTkYsTikKLQkgIEMoLUlORiwtUDEyKSBDKFUsVSkgICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQygtSU5GLFAxMikgQyhOLE4pCi0JICBDKC1JTkYsLVAxMikgQyhVLFUpICAgICAgQygtMC4sLTAuKSAgQygtMC4sMC4pICBDKFUsVSkgICAgIEMoLUlORixQMTIpIEMoTixOKQotCSAgQyhJTkYsLVAxMikgIEMoVSxVKSAgICAgIEMoMC4sLTAuKSAgIEMoMC4sMC4pICAgQyhVLFUpICAgICBDKElORixQMTIpICBDKE4sTikKLQkgIEMoSU5GLC1QMTIpICBDKFUsVSkgICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhJTkYsUDEyKSAgQyhOLE4pCi0JICBDKElORiwtUDE0KSAgQyhJTkYsLTAuKSAgQyhJTkYsLTAuKSAgQyhJTkYsMC4pICBDKElORiwwLikgIEMoSU5GLFAxNCkgIEMoSU5GLE4pCi0JICBDKElORixOKSAgICAgQyhOLE4pICAgICAgQyhOLC0wLikgICAgQyhOLDAuKSAgICBDKE4sTikgICAgIEMoSU5GLE4pICAgIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyhhc2luaF9zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQygtSU5GLC1QMTQpIEMoLUlORiwtMC4pIEMoLUlORiwtMC4pIEMoLUlORiwwLikgQygtSU5GLDAuKSBDKC1JTkYsUDE0KSBDKC1JTkYsTikKKyAgICAgIEMoLUlORiwtUDEyKSBDKFUsVSkgICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQygtSU5GLFAxMikgQyhOLE4pCisgICAgICBDKC1JTkYsLVAxMikgQyhVLFUpICAgICAgQygtMC4sLTAuKSAgQygtMC4sMC4pICBDKFUsVSkgICAgIEMoLUlORixQMTIpIEMoTixOKQorICAgICAgQyhJTkYsLVAxMikgIEMoVSxVKSAgICAgIEMoMC4sLTAuKSAgIEMoMC4sMC4pICAgQyhVLFUpICAgICBDKElORixQMTIpICBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTIpICBDKFUsVSkgICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhJTkYsUDEyKSAgQyhOLE4pCisgICAgICBDKElORiwtUDE0KSAgQyhJTkYsLTAuKSAgQyhJTkYsLTAuKSAgQyhJTkYsMC4pICBDKElORiwwLikgIEMoSU5GLFAxNCkgIEMoSU5GLE4pCisgICAgICBDKElORixOKSAgICAgQyhOLE4pICAgICAgQyhOLC0wLikgICAgQyhOLDAuKSAgICBDKE4sTikgICAgIEMoSU5GLE4pICAgIEMoTixOKQorICAgIH0pCiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKGF0YW5oX3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKC0wLiwtUDEyKSBDKC0wLiwtUDEyKSBDKC0wLiwtUDEyKSBDKC0wLixQMTIpIEMoLTAuLFAxMikgQygtMC4sUDEyKSBDKC0wLixOKQotCSAgQygtMC4sLVAxMikgQyhVLFUpICAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoLTAuLFAxMikgQyhOLE4pCi0JICBDKC0wLiwtUDEyKSBDKFUsVSkgICAgICBDKC0wLiwtMC4pICBDKC0wLiwwLikgIEMoVSxVKSAgICAgQygtMC4sUDEyKSBDKC0wLixOKQotCSAgQygwLiwtUDEyKSAgQyhVLFUpICAgICAgQygwLiwtMC4pICAgQygwLiwwLikgICBDKFUsVSkgICAgIEMoMC4sUDEyKSAgQygwLixOKQotCSAgQygwLiwtUDEyKSAgQyhVLFUpICAgICAgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoMC4sUDEyKSAgQyhOLE4pCi0JICBDKDAuLC1QMTIpICBDKDAuLC1QMTIpICBDKDAuLC1QMTIpICBDKDAuLFAxMikgIEMoMC4sUDEyKSAgQygwLixQMTIpICBDKDAuLE4pCi0JICBDKDAuLC1QMTIpICBDKE4sTikgICAgICBDKE4sTikgICAgICBDKE4sTikgICAgIEMoTixOKSAgICAgQygwLixQMTIpICBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVMoYXRhbmhfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoLTAuLC1QMTIpIEMoLTAuLC1QMTIpIEMoLTAuLC1QMTIpIEMoLTAuLFAxMikgQygtMC4sUDEyKSBDKC0wLixQMTIpIEMoLTAuLE4pCisgICAgICBDKC0wLiwtUDEyKSBDKFUsVSkgICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQygtMC4sUDEyKSBDKE4sTikKKyAgICAgIEMoLTAuLC1QMTIpIEMoVSxVKSAgICAgIEMoLTAuLC0wLikgIEMoLTAuLDAuKSAgQyhVLFUpICAgICBDKC0wLixQMTIpIEMoLTAuLE4pCisgICAgICBDKDAuLC1QMTIpICBDKFUsVSkgICAgICBDKDAuLC0wLikgICBDKDAuLDAuKSAgIEMoVSxVKSAgICAgQygwLixQMTIpICBDKDAuLE4pCisgICAgICBDKDAuLC1QMTIpICBDKFUsVSkgICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICAgQygwLixQMTIpICBDKE4sTikKKyAgICAgIEMoMC4sLVAxMikgIEMoMC4sLVAxMikgIEMoMC4sLVAxMikgIEMoMC4sUDEyKSAgQygwLixQMTIpICBDKDAuLFAxMikgIEMoMC4sTikKKyAgICAgIEMoMC4sLVAxMikgIEMoTixOKSAgICAgIEMoTixOKSAgICAgIEMoTixOKSAgICAgQyhOLE4pICAgICBDKDAuLFAxMikgIEMoTixOKQorICAgIH0pCiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKGNvc2hfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoSU5GLE4pIEMoVSxVKSBDKElORiwwLikgIEMoSU5GLC0wLikgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCi0JICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKLQkgIEMoTiwwLikgIEMoVSxVKSBDKDEuLDAuKSAgIEMoMS4sLTAuKSAgQyhVLFUpIEMoTiwwLikgIEMoTiwwLikKLQkgIEMoTiwwLikgIEMoVSxVKSBDKDEuLC0wLikgIEMoMS4sMC4pICAgQyhVLFUpIEMoTiwwLikgIEMoTiwwLikKLQkgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQotCSAgQyhJTkYsTikgQyhVLFUpIEMoSU5GLC0wLikgQyhJTkYsMC4pICBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKLQkgIEMoTixOKSAgIEMoTixOKSBDKE4sMC4pICAgIEMoTiwwLikgICAgQyhOLE4pIEMoTixOKSAgIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyhjb3NoX3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKElORixOKSBDKFUsVSkgQyhJTkYsMC4pICBDKElORiwtMC4pIEMoVSxVKSBDKElORixOKSBDKElORixOKQorICAgICAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCisgICAgICBDKE4sMC4pICBDKFUsVSkgQygxLiwwLikgICBDKDEuLC0wLikgIEMoVSxVKSBDKE4sMC4pICBDKE4sMC4pCisgICAgICBDKE4sMC4pICBDKFUsVSkgQygxLiwtMC4pICBDKDEuLDAuKSAgIEMoVSxVKSBDKE4sMC4pICBDKE4sMC4pCisgICAgICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKKyAgICAgIEMoSU5GLE4pIEMoVSxVKSBDKElORiwtMC4pIEMoSU5GLDAuKSAgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCisgICAgICBDKE4sTikgICBDKE4sTikgQyhOLDAuKSAgICBDKE4sMC4pICAgIEMoTixOKSBDKE4sTikgICBDKE4sTikKKyAgICB9KQogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyhleHBfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoMC4sMC4pIEMoVSxVKSBDKDAuLC0wLikgIEMoMC4sMC4pICBDKFUsVSkgQygwLiwwLikgQygwLiwwLikKLQkgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCi0JICBDKE4sTikgICBDKFUsVSkgQygxLiwtMC4pICBDKDEuLDAuKSAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQotCSAgQyhOLE4pICAgQyhVLFUpIEMoMS4sLTAuKSAgQygxLiwwLikgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKLQkgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCi0JICBDKElORixOKSBDKFUsVSkgQyhJTkYsLTAuKSBDKElORiwwLikgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCi0JICBDKE4sTikgICBDKE4sTikgQyhOLC0wLikgICBDKE4sMC4pICAgQyhOLE4pIEMoTixOKSAgIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyhleHBfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoMC4sMC4pIEMoVSxVKSBDKDAuLC0wLikgIEMoMC4sMC4pICBDKFUsVSkgQygwLiwwLikgQygwLiwwLikKKyAgICAgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCisgICAgICBDKE4sTikgICBDKFUsVSkgQygxLiwtMC4pICBDKDEuLDAuKSAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQorICAgICAgQyhOLE4pICAgQyhVLFUpIEMoMS4sLTAuKSAgQygxLiwwLikgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKKyAgICAgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCisgICAgICBDKElORixOKSBDKFUsVSkgQyhJTkYsLTAuKSBDKElORiwwLikgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCisgICAgICBDKE4sTikgICBDKE4sTikgQyhOLC0wLikgICBDKE4sMC4pICAgQyhOLE4pIEMoTixOKSAgIEMoTixOKQorICAgIH0pCiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKGxvZ19zcGVjaWFsX3ZhbHVlcywgewotCSAgQyhJTkYsLVAzNCkgQyhJTkYsLVApICBDKElORiwtUCkgICBDKElORixQKSAgIEMoSU5GLFApICBDKElORixQMzQpICBDKElORixOKQotCSAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKElORixQMTIpICBDKE4sTikKLQkgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQygtSU5GLC1QKSAgQygtSU5GLFApICBDKFUsVSkgICAgQyhJTkYsUDEyKSAgQyhOLE4pCi0JICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoLUlORiwtMC4pIEMoLUlORiwwLikgQyhVLFUpICAgIEMoSU5GLFAxMikgIEMoTixOKQotCSAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKElORixQMTIpICBDKE4sTikKLQkgIEMoSU5GLC1QMTQpIEMoSU5GLC0wLikgQyhJTkYsLTAuKSAgQyhJTkYsMC4pICBDKElORiwwLikgQyhJTkYsUDE0KSAgQyhJTkYsTikKLQkgIEMoSU5GLE4pICAgIEMoTixOKSAgICAgQyhOLE4pICAgICAgQyhOLE4pICAgICBDKE4sTikgICAgQyhJTkYsTikgICAgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKGxvZ19zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQyhJTkYsLVAzNCkgQyhJTkYsLVApICBDKElORiwtUCkgICBDKElORixQKSAgIEMoSU5GLFApICBDKElORixQMzQpICBDKElORixOKQorICAgICAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKElORixQMTIpICBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTIpIEMoVSxVKSAgICAgQygtSU5GLC1QKSAgQygtSU5GLFApICBDKFUsVSkgICAgQyhJTkYsUDEyKSAgQyhOLE4pCisgICAgICBDKElORiwtUDEyKSBDKFUsVSkgICAgIEMoLUlORiwtMC4pIEMoLUlORiwwLikgQyhVLFUpICAgIEMoSU5GLFAxMikgIEMoTixOKQorICAgICAgQyhJTkYsLVAxMikgQyhVLFUpICAgICBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKElORixQMTIpICBDKE4sTikKKyAgICAgIEMoSU5GLC1QMTQpIEMoSU5GLC0wLikgQyhJTkYsLTAuKSAgQyhJTkYsMC4pICBDKElORiwwLikgQyhJTkYsUDE0KSAgQyhJTkYsTikKKyAgICAgIEMoSU5GLE4pICAgIEMoTixOKSAgICAgQyhOLE4pICAgICAgQyhOLE4pICAgICBDKE4sTikgICAgQyhJTkYsTikgICAgQyhOLE4pCisgICAgfSkKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVMoc2luaF9zcGVjaWFsX3ZhbHVlcywgewotCSAgQyhJTkYsTikgQyhVLFUpIEMoLUlORiwtMC4pIEMoLUlORiwwLikgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCi0JICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICAgQyhVLFUpICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCi0JICBDKDAuLE4pICBDKFUsVSkgQygtMC4sLTAuKSAgQygtMC4sMC4pICBDKFUsVSkgQygwLixOKSAgQygwLixOKQotCSAgQygwLixOKSAgQyhVLFUpIEMoMC4sLTAuKSAgIEMoMC4sMC4pICAgQyhVLFUpIEMoMC4sTikgIEMoMC4sTikKLQkgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKLQkgIEMoSU5GLE4pIEMoVSxVKSBDKElORiwtMC4pICBDKElORiwwLikgIEMoVSxVKSBDKElORixOKSBDKElORixOKQotCSAgQyhOLE4pICAgQyhOLE4pIEMoTiwtMC4pICAgIEMoTiwwLikgICAgQyhOLE4pIEMoTixOKSAgIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyhzaW5oX3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKElORixOKSBDKFUsVSkgQygtSU5GLC0wLikgQygtSU5GLDAuKSBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKKyAgICAgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgICBDKFUsVSkgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKKyAgICAgIEMoMC4sTikgIEMoVSxVKSBDKC0wLiwtMC4pICBDKC0wLiwwLikgIEMoVSxVKSBDKDAuLE4pICBDKDAuLE4pCisgICAgICBDKDAuLE4pICBDKFUsVSkgQygwLiwtMC4pICAgQygwLiwwLikgICBDKFUsVSkgQygwLixOKSAgQygwLixOKQorICAgICAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgIEMoVSxVKSAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQorICAgICAgQyhJTkYsTikgQyhVLFUpIEMoSU5GLC0wLikgIEMoSU5GLDAuKSAgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCisgICAgICBDKE4sTikgICBDKE4sTikgQyhOLC0wLikgICAgQyhOLDAuKSAgICBDKE4sTikgQyhOLE4pICAgQyhOLE4pCisgICAgfSkKIAotCUlOSVRfU1BFQ0lBTF9WQUxVRVMoc3FydF9zcGVjaWFsX3ZhbHVlcywgewotCSAgQyhJTkYsLUlORikgQygwLiwtSU5GKSBDKDAuLC1JTkYpIEMoMC4sSU5GKSBDKDAuLElORikgQyhJTkYsSU5GKSBDKE4sSU5GKQotCSAgQyhJTkYsLUlORikgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgICAgQyhJTkYsSU5GKSBDKE4sTikKLQkgIEMoSU5GLC1JTkYpIEMoVSxVKSAgICAgQygwLiwtMC4pICBDKDAuLDAuKSAgQyhVLFUpICAgIEMoSU5GLElORikgQyhOLE4pCi0JICBDKElORiwtSU5GKSBDKFUsVSkgICAgIEMoMC4sLTAuKSAgQygwLiwwLikgIEMoVSxVKSAgICBDKElORixJTkYpIEMoTixOKQotCSAgQyhJTkYsLUlORikgQyhVLFUpICAgICBDKFUsVSkgICAgIEMoVSxVKSAgICBDKFUsVSkgICAgQyhJTkYsSU5GKSBDKE4sTikKLQkgIEMoSU5GLC1JTkYpIEMoSU5GLC0wLikgQyhJTkYsLTAuKSBDKElORiwwLikgQyhJTkYsMC4pIEMoSU5GLElORikgQyhJTkYsTikKLQkgIEMoSU5GLC1JTkYpIEMoTixOKSAgICAgQyhOLE4pICAgICBDKE4sTikgICAgQyhOLE4pICAgIEMoSU5GLElORikgQyhOLE4pCi0JfSkKKyAgICBJTklUX1NQRUNJQUxfVkFMVUVTKHNxcnRfc3BlY2lhbF92YWx1ZXMsIHsKKyAgICAgIEMoSU5GLC1JTkYpIEMoMC4sLUlORikgQygwLiwtSU5GKSBDKDAuLElORikgQygwLixJTkYpIEMoSU5GLElORikgQyhOLElORikKKyAgICAgIEMoSU5GLC1JTkYpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpICAgIEMoSU5GLElORikgQyhOLE4pCisgICAgICBDKElORiwtSU5GKSBDKFUsVSkgICAgIEMoMC4sLTAuKSAgQygwLiwwLikgIEMoVSxVKSAgICBDKElORixJTkYpIEMoTixOKQorICAgICAgQyhJTkYsLUlORikgQyhVLFUpICAgICBDKDAuLC0wLikgIEMoMC4sMC4pICBDKFUsVSkgICAgQyhJTkYsSU5GKSBDKE4sTikKKyAgICAgIEMoSU5GLC1JTkYpIEMoVSxVKSAgICAgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpICAgIEMoSU5GLElORikgQyhOLE4pCisgICAgICBDKElORiwtSU5GKSBDKElORiwtMC4pIEMoSU5GLC0wLikgQyhJTkYsMC4pIEMoSU5GLDAuKSBDKElORixJTkYpIEMoSU5GLE4pCisgICAgICBDKElORiwtSU5GKSBDKE4sTikgICAgIEMoTixOKSAgICAgQyhOLE4pICAgIEMoTixOKSAgICBDKElORixJTkYpIEMoTixOKQorICAgIH0pCiAKLQlJTklUX1NQRUNJQUxfVkFMVUVTKHRhbmhfc3BlY2lhbF92YWx1ZXMsIHsKLQkgIEMoLTEuLDAuKSBDKFUsVSkgQygtMS4sLTAuKSBDKC0xLiwwLikgQyhVLFUpIEMoLTEuLDAuKSBDKC0xLiwwLikKLQkgIEMoTixOKSAgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpIEMoTixOKSAgICBDKE4sTikKLQkgIEMoTixOKSAgICBDKFUsVSkgQygtMC4sLTAuKSBDKC0wLiwwLikgQyhVLFUpIEMoTixOKSAgICBDKE4sTikKLQkgIEMoTixOKSAgICBDKFUsVSkgQygwLiwtMC4pICBDKDAuLDAuKSAgQyhVLFUpIEMoTixOKSAgICBDKE4sTikKLQkgIEMoTixOKSAgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgQyhVLFUpIEMoTixOKSAgICBDKE4sTikKLQkgIEMoMS4sMC4pICBDKFUsVSkgQygxLiwtMC4pICBDKDEuLDAuKSAgQyhVLFUpIEMoMS4sMC4pICBDKDEuLDAuKQotCSAgQyhOLE4pICAgIEMoTixOKSBDKE4sLTAuKSAgIEMoTiwwLikgICBDKE4sTikgQyhOLE4pICAgIEMoTixOKQotCX0pCisgICAgSU5JVF9TUEVDSUFMX1ZBTFVFUyh0YW5oX3NwZWNpYWxfdmFsdWVzLCB7CisgICAgICBDKC0xLiwwLikgQyhVLFUpIEMoLTEuLC0wLikgQygtMS4sMC4pIEMoVSxVKSBDKC0xLiwwLikgQygtMS4sMC4pCisgICAgICBDKE4sTikgICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSBDKE4sTikgICAgQyhOLE4pCisgICAgICBDKE4sTikgICAgQyhVLFUpIEMoLTAuLC0wLikgQygtMC4sMC4pIEMoVSxVKSBDKE4sTikgICAgQyhOLE4pCisgICAgICBDKE4sTikgICAgQyhVLFUpIEMoMC4sLTAuKSAgQygwLiwwLikgIEMoVSxVKSBDKE4sTikgICAgQyhOLE4pCisgICAgICBDKE4sTikgICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgIEMoVSxVKSBDKE4sTikgICAgQyhOLE4pCisgICAgICBDKDEuLDAuKSAgQyhVLFUpIEMoMS4sLTAuKSAgQygxLiwwLikgIEMoVSxVKSBDKDEuLDAuKSAgQygxLiwwLikKKyAgICAgIEMoTixOKSAgICBDKE4sTikgQyhOLC0wLikgICBDKE4sMC4pICAgQyhOLE4pIEMoTixOKSAgICBDKE4sTikKKyAgICB9KQogCi0JSU5JVF9TUEVDSUFMX1ZBTFVFUyhyZWN0X3NwZWNpYWxfdmFsdWVzLCB7Ci0JICBDKElORixOKSBDKFUsVSkgQygtSU5GLDAuKSBDKC1JTkYsLTAuKSBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKLQkgIEMoTixOKSAgIEMoVSxVKSBDKFUsVSkgICAgIEMoVSxVKSAgICAgIEMoVSxVKSBDKE4sTikgICBDKE4sTikKLQkgIEMoMC4sMC4pIEMoVSxVKSBDKC0wLiwwLikgIEMoLTAuLC0wLikgIEMoVSxVKSBDKDAuLDAuKSBDKDAuLDAuKQotCSAgQygwLiwwLikgQyhVLFUpIEMoMC4sLTAuKSAgQygwLiwwLikgICAgQyhVLFUpIEMoMC4sMC4pIEMoMC4sMC4pCi0JICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCi0JICBDKElORixOKSBDKFUsVSkgQyhJTkYsLTAuKSBDKElORiwwLikgICBDKFUsVSkgQyhJTkYsTikgQyhJTkYsTikKLQkgIEMoTixOKSAgIEMoTixOKSBDKE4sMC4pICAgIEMoTiwwLikgICAgIEMoTixOKSBDKE4sTikgICBDKE4sTikKLQl9KQorICAgIElOSVRfU1BFQ0lBTF9WQUxVRVMocmVjdF9zcGVjaWFsX3ZhbHVlcywgeworICAgICAgQyhJTkYsTikgQyhVLFUpIEMoLUlORiwwLikgQygtSU5GLC0wLikgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCisgICAgICBDKE4sTikgICBDKFUsVSkgQyhVLFUpICAgICBDKFUsVSkgICAgICBDKFUsVSkgQyhOLE4pICAgQyhOLE4pCisgICAgICBDKDAuLDAuKSBDKFUsVSkgQygtMC4sMC4pICBDKC0wLiwtMC4pICBDKFUsVSkgQygwLiwwLikgQygwLiwwLikKKyAgICAgIEMoMC4sMC4pIEMoVSxVKSBDKDAuLC0wLikgIEMoMC4sMC4pICAgIEMoVSxVKSBDKDAuLDAuKSBDKDAuLDAuKQorICAgICAgQyhOLE4pICAgQyhVLFUpIEMoVSxVKSAgICAgQyhVLFUpICAgICAgQyhVLFUpIEMoTixOKSAgIEMoTixOKQorICAgICAgQyhJTkYsTikgQyhVLFUpIEMoSU5GLC0wLikgQyhJTkYsMC4pICAgQyhVLFUpIEMoSU5GLE4pIEMoSU5GLE4pCisgICAgICBDKE4sTikgICBDKE4sTikgQyhOLDAuKSAgICBDKE4sMC4pICAgICBDKE4sTikgQyhOLE4pICAgQyhOLE4pCisgICAgfSkKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY3J5cHRtb2R1bGUuYyBiL01vZHVsZXMvY3J5cHRtb2R1bGUuYwppbmRleCA2Mzc3Zjg0Li43NmRlNTRmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NyeXB0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9jcnlwdG1vZHVsZS5jCkBAIC0xNCwxNyArMTQsMTcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpjcnlwdF9jcnlwdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqd29yZCwgKnNhbHQ7IAorICAgIGNoYXIgKndvcmQsICpzYWx0OwogI2lmbmRlZiBfX1ZNUwotCWV4dGVybiBjaGFyICogY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworICAgIGV4dGVybiBjaGFyICogY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwogI2VuZGlmCiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOmNyeXB0IiwgJndvcmQsICZzYWx0KSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogT24gc29tZSBwbGF0Zm9ybXMgKEF0aGVPUykgY3J5cHQgcmV0dXJucyBOVUxMIGZvciBhbiBpbnZhbGlkCi0JICAgc2FsdC4gUmV0dXJuIE5vbmUgaW4gdGhhdCBjYXNlLiBYWFggTWF5YmUgcmFpc2UgYW4gZXhjZXB0aW9uPyAgKi8KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIGNyeXB0KHdvcmQsIHNhbHQpKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOmNyeXB0IiwgJndvcmQsICZzYWx0KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogT24gc29tZSBwbGF0Zm9ybXMgKEF0aGVPUykgY3J5cHQgcmV0dXJucyBOVUxMIGZvciBhbiBpbnZhbGlkCisgICAgICAgc2FsdC4gUmV0dXJuIE5vbmUgaW4gdGhhdCBjYXNlLiBYWFggTWF5YmUgcmFpc2UgYW4gZXhjZXB0aW9uPyAgKi8KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIGNyeXB0KHdvcmQsIHNhbHQpKTsKIAogfQogCkBAIC0zOCwxMiArMzgsMTIgQEAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYgY3J5cHRfbWV0aG9kc1tdID0gewotCXsiY3J5cHQiLAljcnlwdF9jcnlwdCwgTUVUSF9WQVJBUkdTLCBjcnlwdF9jcnlwdF9fZG9jX199LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJjcnlwdCIsICAgICAgICAgICBjcnlwdF9jcnlwdCwgTUVUSF9WQVJBUkdTLCBjcnlwdF9jcnlwdF9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdGNyeXB0KHZvaWQpCiB7Ci0JUHlfSW5pdE1vZHVsZSgiY3J5cHQiLCBjcnlwdF9tZXRob2RzKTsKKyAgICBQeV9Jbml0TW9kdWxlKCJjcnlwdCIsIGNyeXB0X21ldGhvZHMpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9kYXRldGltZW1vZHVsZS5jIGIvTW9kdWxlcy9kYXRldGltZW1vZHVsZS5jCmluZGV4IGVlNTU4Y2UuLmVjY2U1MmQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZGF0ZXRpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL2RhdGV0aW1lbW9kdWxlLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqIGZpbmFsIHJlc3VsdCBmaXRzIGluIGEgQyBpbnQgKHRoaXMgY2FuIGJlIGFuIGlzc3VlIG9uIDY0LWJpdCBib3hlcykuCiAgKi8KICNpZiBTSVpFT0ZfSU5UIDwgNAotIwllcnJvciAiZGF0ZXRpbWUuYyByZXF1aXJlcyB0aGF0IEMgaW50IGhhdmUgYXQgbGVhc3QgMzIgYml0cyIKKyMgICAgICAgZXJyb3IgImRhdGV0aW1lLmMgcmVxdWlyZXMgdGhhdCBDIGludCBoYXZlIGF0IGxlYXN0IDMyIGJpdHMiCiAjZW5kaWYKIAogI2RlZmluZSBNSU5ZRUFSIDEKQEAgLTQxLDU5ICs0MSw1OSBAQAogI2RlZmluZSBNQVhfREVMVEFfREFZUyA5OTk5OTk5OTkKIAogLyogUmVuYW1lIHRoZSBsb25nIG1hY3JvcyBpbiBkYXRldGltZS5oIHRvIG1vcmUgcmVhc29uYWJsZSBzaG9ydCBuYW1lcy4gKi8KLSNkZWZpbmUgR0VUX1lFQVIJCVB5RGF0ZVRpbWVfR0VUX1lFQVIKLSNkZWZpbmUgR0VUX01PTlRICQlQeURhdGVUaW1lX0dFVF9NT05USAotI2RlZmluZSBHRVRfREFZCQkJUHlEYXRlVGltZV9HRVRfREFZCi0jZGVmaW5lIERBVEVfR0VUX0hPVVIJCVB5RGF0ZVRpbWVfREFURV9HRVRfSE9VUgotI2RlZmluZSBEQVRFX0dFVF9NSU5VVEUJCVB5RGF0ZVRpbWVfREFURV9HRVRfTUlOVVRFCi0jZGVmaW5lIERBVEVfR0VUX1NFQ09ORAkJUHlEYXRlVGltZV9EQVRFX0dFVF9TRUNPTkQKLSNkZWZpbmUgREFURV9HRVRfTUlDUk9TRUNPTkQJUHlEYXRlVGltZV9EQVRFX0dFVF9NSUNST1NFQ09ORAorI2RlZmluZSBHRVRfWUVBUiAgICAgICAgICAgICAgICBQeURhdGVUaW1lX0dFVF9ZRUFSCisjZGVmaW5lIEdFVF9NT05USCAgICAgICAgICAgICAgIFB5RGF0ZVRpbWVfR0VUX01PTlRICisjZGVmaW5lIEdFVF9EQVkgICAgICAgICAgICAgICAgIFB5RGF0ZVRpbWVfR0VUX0RBWQorI2RlZmluZSBEQVRFX0dFVF9IT1VSICAgICAgICAgICBQeURhdGVUaW1lX0RBVEVfR0VUX0hPVVIKKyNkZWZpbmUgREFURV9HRVRfTUlOVVRFICAgICAgICAgUHlEYXRlVGltZV9EQVRFX0dFVF9NSU5VVEUKKyNkZWZpbmUgREFURV9HRVRfU0VDT05EICAgICAgICAgUHlEYXRlVGltZV9EQVRFX0dFVF9TRUNPTkQKKyNkZWZpbmUgREFURV9HRVRfTUlDUk9TRUNPTkQgICAgUHlEYXRlVGltZV9EQVRFX0dFVF9NSUNST1NFQ09ORAogCiAvKiBEYXRlIGFjY2Vzc29ycyBmb3IgZGF0ZSBhbmQgZGF0ZXRpbWUuICovCi0jZGVmaW5lIFNFVF9ZRUFSKG8sIHYpCQkoKChvKS0+ZGF0YVswXSA9ICgodikgJiAweGZmMDApID4+IDgpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG8pLT5kYXRhWzFdID0gKCh2KSAmIDB4MDBmZikpKQotI2RlZmluZSBTRVRfTU9OVEgobywgdikJCShQeURhdGVUaW1lX0dFVF9NT05USChvKSA9ICh2KSkKLSNkZWZpbmUgU0VUX0RBWShvLCB2KQkJKFB5RGF0ZVRpbWVfR0VUX0RBWShvKSA9ICh2KSkKKyNkZWZpbmUgU0VUX1lFQVIobywgdikgICAgICAgICAgKCgobyktPmRhdGFbMF0gPSAoKHYpICYgMHhmZjAwKSA+PiA4KSwgXAorICAgICAgICAgICAgICAgICAoKG8pLT5kYXRhWzFdID0gKCh2KSAmIDB4MDBmZikpKQorI2RlZmluZSBTRVRfTU9OVEgobywgdikgICAgICAgICAoUHlEYXRlVGltZV9HRVRfTU9OVEgobykgPSAodikpCisjZGVmaW5lIFNFVF9EQVkobywgdikgICAgICAgICAgIChQeURhdGVUaW1lX0dFVF9EQVkobykgPSAodikpCiAKIC8qIERhdGUvVGltZSBhY2Nlc3NvcnMgZm9yIGRhdGV0aW1lLiAqLwotI2RlZmluZSBEQVRFX1NFVF9IT1VSKG8sIHYpCShQeURhdGVUaW1lX0RBVEVfR0VUX0hPVVIobykgPSAodikpCi0jZGVmaW5lIERBVEVfU0VUX01JTlVURShvLCB2KQkoUHlEYXRlVGltZV9EQVRFX0dFVF9NSU5VVEUobykgPSAodikpCi0jZGVmaW5lIERBVEVfU0VUX1NFQ09ORChvLCB2KQkoUHlEYXRlVGltZV9EQVRFX0dFVF9TRUNPTkQobykgPSAodikpCi0jZGVmaW5lIERBVEVfU0VUX01JQ1JPU0VDT05EKG8sIHYpCVwKLQkoKChvKS0+ZGF0YVs3XSA9ICgodikgJiAweGZmMDAwMCkgPj4gMTYpLCBcCi0gICAgICAgICAoKG8pLT5kYXRhWzhdID0gKCh2KSAmIDB4MDBmZjAwKSA+PiA4KSwgXAotICAgICAgICAgKChvKS0+ZGF0YVs5XSA9ICgodikgJiAweDAwMDBmZikpKQorI2RlZmluZSBEQVRFX1NFVF9IT1VSKG8sIHYpICAgICAoUHlEYXRlVGltZV9EQVRFX0dFVF9IT1VSKG8pID0gKHYpKQorI2RlZmluZSBEQVRFX1NFVF9NSU5VVEUobywgdikgICAoUHlEYXRlVGltZV9EQVRFX0dFVF9NSU5VVEUobykgPSAodikpCisjZGVmaW5lIERBVEVfU0VUX1NFQ09ORChvLCB2KSAgIChQeURhdGVUaW1lX0RBVEVfR0VUX1NFQ09ORChvKSA9ICh2KSkKKyNkZWZpbmUgREFURV9TRVRfTUlDUk9TRUNPTkQobywgdikgICAgICBcCisgICAgKCgobyktPmRhdGFbN10gPSAoKHYpICYgMHhmZjAwMDApID4+IDE2KSwgXAorICAgICAoKG8pLT5kYXRhWzhdID0gKCh2KSAmIDB4MDBmZjAwKSA+PiA4KSwgXAorICAgICAoKG8pLT5kYXRhWzldID0gKCh2KSAmIDB4MDAwMGZmKSkpCiAKIC8qIFRpbWUgYWNjZXNzb3JzIGZvciB0aW1lLiAqLwotI2RlZmluZSBUSU1FX0dFVF9IT1VSCQlQeURhdGVUaW1lX1RJTUVfR0VUX0hPVVIKLSNkZWZpbmUgVElNRV9HRVRfTUlOVVRFCQlQeURhdGVUaW1lX1RJTUVfR0VUX01JTlVURQotI2RlZmluZSBUSU1FX0dFVF9TRUNPTkQJCVB5RGF0ZVRpbWVfVElNRV9HRVRfU0VDT05ECi0jZGVmaW5lIFRJTUVfR0VUX01JQ1JPU0VDT05ECVB5RGF0ZVRpbWVfVElNRV9HRVRfTUlDUk9TRUNPTkQKLSNkZWZpbmUgVElNRV9TRVRfSE9VUihvLCB2KQkoUHlEYXRlVGltZV9USU1FX0dFVF9IT1VSKG8pID0gKHYpKQotI2RlZmluZSBUSU1FX1NFVF9NSU5VVEUobywgdikJKFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlOVVRFKG8pID0gKHYpKQotI2RlZmluZSBUSU1FX1NFVF9TRUNPTkQobywgdikJKFB5RGF0ZVRpbWVfVElNRV9HRVRfU0VDT05EKG8pID0gKHYpKQotI2RlZmluZSBUSU1FX1NFVF9NSUNST1NFQ09ORChvLCB2KQlcCi0JKCgobyktPmRhdGFbM10gPSAoKHYpICYgMHhmZjAwMDApID4+IDE2KSwgXAotICAgICAgICAgKChvKS0+ZGF0YVs0XSA9ICgodikgJiAweDAwZmYwMCkgPj4gOCksIFwKLSAgICAgICAgICgobyktPmRhdGFbNV0gPSAoKHYpICYgMHgwMDAwZmYpKSkKKyNkZWZpbmUgVElNRV9HRVRfSE9VUiAgICAgICAgICAgUHlEYXRlVGltZV9USU1FX0dFVF9IT1VSCisjZGVmaW5lIFRJTUVfR0VUX01JTlVURSAgICAgICAgIFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlOVVRFCisjZGVmaW5lIFRJTUVfR0VUX1NFQ09ORCAgICAgICAgIFB5RGF0ZVRpbWVfVElNRV9HRVRfU0VDT05ECisjZGVmaW5lIFRJTUVfR0VUX01JQ1JPU0VDT05EICAgIFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlDUk9TRUNPTkQKKyNkZWZpbmUgVElNRV9TRVRfSE9VUihvLCB2KSAgICAgKFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUihvKSA9ICh2KSkKKyNkZWZpbmUgVElNRV9TRVRfTUlOVVRFKG8sIHYpICAgKFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlOVVRFKG8pID0gKHYpKQorI2RlZmluZSBUSU1FX1NFVF9TRUNPTkQobywgdikgICAoUHlEYXRlVGltZV9USU1FX0dFVF9TRUNPTkQobykgPSAodikpCisjZGVmaW5lIFRJTUVfU0VUX01JQ1JPU0VDT05EKG8sIHYpICAgICAgXAorICAgICgoKG8pLT5kYXRhWzNdID0gKCh2KSAmIDB4ZmYwMDAwKSA+PiAxNiksIFwKKyAgICAgKChvKS0+ZGF0YVs0XSA9ICgodikgJiAweDAwZmYwMCkgPj4gOCksIFwKKyAgICAgKChvKS0+ZGF0YVs1XSA9ICgodikgJiAweDAwMDBmZikpKQogCiAvKiBEZWx0YSBhY2Nlc3NvcnMgZm9yIHRpbWVkZWx0YS4gKi8KLSNkZWZpbmUgR0VUX1REX0RBWVMobykJCSgoKFB5RGF0ZVRpbWVfRGVsdGEgKikobykpLT5kYXlzKQotI2RlZmluZSBHRVRfVERfU0VDT05EUyhvKQkoKChQeURhdGVUaW1lX0RlbHRhICopKG8pKS0+c2Vjb25kcykKLSNkZWZpbmUgR0VUX1REX01JQ1JPU0VDT05EUyhvKQkoKChQeURhdGVUaW1lX0RlbHRhICopKG8pKS0+bWljcm9zZWNvbmRzKQorI2RlZmluZSBHRVRfVERfREFZUyhvKSAgICAgICAgICAoKChQeURhdGVUaW1lX0RlbHRhICopKG8pKS0+ZGF5cykKKyNkZWZpbmUgR0VUX1REX1NFQ09ORFMobykgICAgICAgKCgoUHlEYXRlVGltZV9EZWx0YSAqKShvKSktPnNlY29uZHMpCisjZGVmaW5lIEdFVF9URF9NSUNST1NFQ09ORFMobykgICgoKFB5RGF0ZVRpbWVfRGVsdGEgKikobykpLT5taWNyb3NlY29uZHMpCiAKLSNkZWZpbmUgU0VUX1REX0RBWVMobywgdikJKChvKS0+ZGF5cyA9ICh2KSkKLSNkZWZpbmUgU0VUX1REX1NFQ09ORFMobywgdikJKChvKS0+c2Vjb25kcyA9ICh2KSkKKyNkZWZpbmUgU0VUX1REX0RBWVMobywgdikgICAgICAgKChvKS0+ZGF5cyA9ICh2KSkKKyNkZWZpbmUgU0VUX1REX1NFQ09ORFMobywgdikgICAgKChvKS0+c2Vjb25kcyA9ICh2KSkKICNkZWZpbmUgU0VUX1REX01JQ1JPU0VDT05EUyhvLCB2KSAoKG8pLT5taWNyb3NlY29uZHMgPSAodikpCiAKIC8qIHAgaXMgYSBwb2ludGVyIHRvIGEgdGltZSBvciBhIGRhdGV0aW1lIG9iamVjdDsgSEFTVFpJTkZPKHApIHJldHVybnMKICAqIHAtPmhhc3R6aW5mby4KICAqLwotI2RlZmluZSBIQVNUWklORk8ocCkJCSgoKF9QeURhdGVUaW1lX0Jhc2VUWkluZm8gKikocCkpLT5oYXN0emluZm8pCisjZGVmaW5lIEhBU1RaSU5GTyhwKSAgICAgICAgICAgICgoKF9QeURhdGVUaW1lX0Jhc2VUWkluZm8gKikocCkpLT5oYXN0emluZm8pCiAKIC8qIE0gaXMgYSBjaGFyIG9yIGludCBjbGFpbWluZyB0byBiZSBhIHZhbGlkIG1vbnRoLiAgVGhlIG1hY3JvIGlzIGVxdWl2YWxlbnQKICAqIHRvIHRoZSB0d28tc2lkZWQgUHl0aG9uIHRlc3QKLSAqCTEgPD0gTSA8PSAxMgorICogICAgICAxIDw9IE0gPD0gMTIKICAqLwogI2RlZmluZSBNT05USF9JU19TQU5FKE0pICgodW5zaWduZWQgaW50KShNKSAtIDEgPCAxMikKIApAQCAtMTEzLDcgKzExMyw3IEBACiAgKiBpZmYgKGteaSkmKGteaikgaGFzIHNpZ24gYml0IHNldC4KICAqLwogI2RlZmluZSBTSUdORURfQUREX09WRVJGTE9XRUQoUkVTVUxULCBJLCBKKSBcCi0JKCgoKFJFU1VMVCkgXiAoSSkpICYgKChSRVNVTFQpIF4gKEopKSkgPCAwKQorICAgICgoKChSRVNVTFQpIF4gKEkpKSAmICgoUkVTVUxUKSBeIChKKSkpIDwgMCkKIAogLyogQ29tcHV0ZSBQeXRob24gZGl2bW9kKHgsIHkpLCByZXR1cm5pbmcgdGhlIHF1b3RpZW50IGFuZCBzdG9yaW5nIHRoZQogICogcmVtYWluZGVyIGludG8gKnIuICBUaGUgcXVvdGllbnQgaXMgdGhlIGZsb29yIG9mIHgveSwgYW5kIHRoYXQncwpAQCAtMTI3LDE3ICsxMjcsMTcgQEAKIHN0YXRpYyBpbnQKIGRpdm1vZChpbnQgeCwgaW50IHksIGludCAqcikKIHsKLQlpbnQgcXVvOworICAgIGludCBxdW87CiAKLQlhc3NlcnQoeSA+IDApOwotCXF1byA9IHggLyB5OwotCSpyID0geCAtIHF1byAqIHk7Ci0JaWYgKCpyIDwgMCkgewotCQktLXF1bzsKLQkJKnIgKz0geTsKLQl9Ci0JYXNzZXJ0KDAgPD0gKnIgJiYgKnIgPCB5KTsKLQlyZXR1cm4gcXVvOworICAgIGFzc2VydCh5ID4gMCk7CisgICAgcXVvID0geCAvIHk7CisgICAgKnIgPSB4IC0gcXVvICogeTsKKyAgICBpZiAoKnIgPCAwKSB7CisgICAgICAgIC0tcXVvOworICAgICAgICAqciArPSB5OworICAgIH0KKyAgICBhc3NlcnQoMCA8PSAqciAmJiAqciA8IHkpOworICAgIHJldHVybiBxdW87CiB9CiAKIC8qIFJvdW5kIGEgZG91YmxlIHRvIHRoZSBuZWFyZXN0IGxvbmcuICB8eHwgbXVzdCBiZSBzbWFsbCBlbm91Z2ggdG8gZml0CkBAIC0xNDYsMTEgKzE0NiwxMSBAQAogc3RhdGljIGxvbmcKIHJvdW5kX3RvX2xvbmcoZG91YmxlIHgpCiB7Ci0JaWYgKHggPj0gMC4wKQotCQl4ID0gZmxvb3IoeCArIDAuNSk7Ci0JZWxzZQotCQl4ID0gY2VpbCh4IC0gMC41KTsKLQlyZXR1cm4gKGxvbmcpeDsKKyAgICBpZiAoeCA+PSAwLjApCisgICAgICAgIHggPSBmbG9vcih4ICsgMC41KTsKKyAgICBlbHNlCisgICAgICAgIHggPSBjZWlsKHggLSAwLjUpOworICAgIHJldHVybiAobG9uZyl4OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE2Miw1MiArMTYyLDUyIEBACiAgKiBhcmUgY29ycmVjdCBmb3Igbm9uLWxlYXAgeWVhcnMgb25seS4KICAqLwogc3RhdGljIGludCBfZGF5c19pbl9tb250aFtdID0gewotCTAsIC8qIHVudXNlZDsgdGhpcyB2ZWN0b3IgdXNlcyAxLWJhc2VkIGluZGV4aW5nICovCi0JMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMQorICAgIDAsIC8qIHVudXNlZDsgdGhpcyB2ZWN0b3IgdXNlcyAxLWJhc2VkIGluZGV4aW5nICovCisgICAgMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMQogfTsKIAogc3RhdGljIGludCBfZGF5c19iZWZvcmVfbW9udGhbXSA9IHsKLQkwLCAvKiB1bnVzZWQ7IHRoaXMgdmVjdG9yIHVzZXMgMS1iYXNlZCBpbmRleGluZyAqLwotCTAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0CisgICAgMCwgLyogdW51c2VkOyB0aGlzIHZlY3RvciB1c2VzIDEtYmFzZWQgaW5kZXhpbmcgKi8KKyAgICAwLCAzMSwgNTksIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNAogfTsKIAogLyogeWVhciAtPiAxIGlmIGxlYXAgeWVhciwgZWxzZSAwLiAqLwogc3RhdGljIGludAogaXNfbGVhcChpbnQgeWVhcikKIHsKLQkvKiBDYXN0IHllYXIgdG8gdW5zaWduZWQuICBUaGUgcmVzdWx0IGlzIHRoZSBzYW1lIGVpdGhlciB3YXksIGJ1dAotCSAqIEMgY2FuIGdlbmVyYXRlIGZhc3RlciBjb2RlIGZvciB1bnNpZ25lZCBtb2QgdGhhbiBmb3Igc2lnbmVkCi0JICogbW9kIChlc3BlY2lhbGx5IGZvciAlIDQgLS0gYSBnb29kIGNvbXBpbGVyIHNob3VsZCBqdXN0IGdyYWIKLQkgKiB0aGUgbGFzdCAyIGJpdHMgd2hlbiB0aGUgTEhTIGlzIHVuc2lnbmVkKS4KLQkgKi8KLQljb25zdCB1bnNpZ25lZCBpbnQgYXllYXIgPSAodW5zaWduZWQgaW50KXllYXI7Ci0JcmV0dXJuIGF5ZWFyICUgNCA9PSAwICYmIChheWVhciAlIDEwMCAhPSAwIHx8IGF5ZWFyICUgNDAwID09IDApOworICAgIC8qIENhc3QgeWVhciB0byB1bnNpZ25lZC4gIFRoZSByZXN1bHQgaXMgdGhlIHNhbWUgZWl0aGVyIHdheSwgYnV0CisgICAgICogQyBjYW4gZ2VuZXJhdGUgZmFzdGVyIGNvZGUgZm9yIHVuc2lnbmVkIG1vZCB0aGFuIGZvciBzaWduZWQKKyAgICAgKiBtb2QgKGVzcGVjaWFsbHkgZm9yICUgNCAtLSBhIGdvb2QgY29tcGlsZXIgc2hvdWxkIGp1c3QgZ3JhYgorICAgICAqIHRoZSBsYXN0IDIgYml0cyB3aGVuIHRoZSBMSFMgaXMgdW5zaWduZWQpLgorICAgICAqLworICAgIGNvbnN0IHVuc2lnbmVkIGludCBheWVhciA9ICh1bnNpZ25lZCBpbnQpeWVhcjsKKyAgICByZXR1cm4gYXllYXIgJSA0ID09IDAgJiYgKGF5ZWFyICUgMTAwICE9IDAgfHwgYXllYXIgJSA0MDAgPT0gMCk7CiB9CiAKIC8qIHllYXIsIG1vbnRoIC0+IG51bWJlciBvZiBkYXlzIGluIHRoYXQgbW9udGggaW4gdGhhdCB5ZWFyICovCiBzdGF0aWMgaW50CiBkYXlzX2luX21vbnRoKGludCB5ZWFyLCBpbnQgbW9udGgpCiB7Ci0JYXNzZXJ0KG1vbnRoID49IDEpOwotCWFzc2VydChtb250aCA8PSAxMik7Ci0JaWYgKG1vbnRoID09IDIgJiYgaXNfbGVhcCh5ZWFyKSkKLQkJcmV0dXJuIDI5OwotCWVsc2UKLQkJcmV0dXJuIF9kYXlzX2luX21vbnRoW21vbnRoXTsKKyAgICBhc3NlcnQobW9udGggPj0gMSk7CisgICAgYXNzZXJ0KG1vbnRoIDw9IDEyKTsKKyAgICBpZiAobW9udGggPT0gMiAmJiBpc19sZWFwKHllYXIpKQorICAgICAgICByZXR1cm4gMjk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gX2RheXNfaW5fbW9udGhbbW9udGhdOwogfQogCiAvKiB5ZWFyLCBtb250aCAtPiBudW1iZXIgb2YgZGF5cyBpbiB5ZWFyIHByZWNlZWRpbmcgZmlyc3QgZGF5IG9mIG1vbnRoICovCiBzdGF0aWMgaW50CiBkYXlzX2JlZm9yZV9tb250aChpbnQgeWVhciwgaW50IG1vbnRoKQogewotCWludCBkYXlzOworICAgIGludCBkYXlzOwogCi0JYXNzZXJ0KG1vbnRoID49IDEpOwotCWFzc2VydChtb250aCA8PSAxMik7Ci0JZGF5cyA9IF9kYXlzX2JlZm9yZV9tb250aFttb250aF07Ci0JaWYgKG1vbnRoID4gMiAmJiBpc19sZWFwKHllYXIpKQotCQkrK2RheXM7Ci0JcmV0dXJuIGRheXM7CisgICAgYXNzZXJ0KG1vbnRoID49IDEpOworICAgIGFzc2VydChtb250aCA8PSAxMik7CisgICAgZGF5cyA9IF9kYXlzX2JlZm9yZV9tb250aFttb250aF07CisgICAgaWYgKG1vbnRoID4gMiAmJiBpc19sZWFwKHllYXIpKQorICAgICAgICArK2RheXM7CisgICAgcmV0dXJuIGRheXM7CiB9CiAKIC8qIHllYXIgLT4gbnVtYmVyIG9mIGRheXMgYmVmb3JlIEphbnVhcnkgMXN0IG9mIHllYXIuICBSZW1lbWJlciB0aGF0IHdlCkBAIC0yMTYsMTI0ICsyMTYsMTI0IEBACiBzdGF0aWMgaW50CiBkYXlzX2JlZm9yZV95ZWFyKGludCB5ZWFyKQogewotCWludCB5ID0geWVhciAtIDE7Ci0JLyogVGhpcyBpcyBpbmNvcnJlY3QgaWYgeWVhciA8PSAwOyB3ZSByZWFsbHkgd2FudCB0aGUgZmxvb3IKLQkgKiBoZXJlLiAgQnV0IHNvIGxvbmcgYXMgTUlOWUVBUiBpcyAxLCB0aGUgc21hbGxlc3QgeWVhciB0aGlzCi0JICogY2FuIHNlZSBpcyAwICh0aGlzIGNhbiBoYXBwZW4gaW4gc29tZSBub3JtYWxpemF0aW9uIGVuZGNhc2VzKSwKLQkgKiBzbyB3ZSdsbCBqdXN0IHNwZWNpYWwtY2FzZSB0aGF0LgotCSAqLwotCWFzc2VydCAoeWVhciA+PSAwKTsKLQlpZiAoeSA+PSAwKQotCQlyZXR1cm4geSozNjUgKyB5LzQgLSB5LzEwMCArIHkvNDAwOwotCWVsc2UgewotCQlhc3NlcnQoeSA9PSAtMSk7Ci0JCXJldHVybiAtMzY2OwotCX0KKyAgICBpbnQgeSA9IHllYXIgLSAxOworICAgIC8qIFRoaXMgaXMgaW5jb3JyZWN0IGlmIHllYXIgPD0gMDsgd2UgcmVhbGx5IHdhbnQgdGhlIGZsb29yCisgICAgICogaGVyZS4gIEJ1dCBzbyBsb25nIGFzIE1JTllFQVIgaXMgMSwgdGhlIHNtYWxsZXN0IHllYXIgdGhpcworICAgICAqIGNhbiBzZWUgaXMgMCAodGhpcyBjYW4gaGFwcGVuIGluIHNvbWUgbm9ybWFsaXphdGlvbiBlbmRjYXNlcyksCisgICAgICogc28gd2UnbGwganVzdCBzcGVjaWFsLWNhc2UgdGhhdC4KKyAgICAgKi8KKyAgICBhc3NlcnQgKHllYXIgPj0gMCk7CisgICAgaWYgKHkgPj0gMCkKKyAgICAgICAgcmV0dXJuIHkqMzY1ICsgeS80IC0geS8xMDAgKyB5LzQwMDsKKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KHkgPT0gLTEpOworICAgICAgICByZXR1cm4gLTM2NjsKKyAgICB9CiB9CiAKIC8qIE51bWJlciBvZiBkYXlzIGluIDQsIDEwMCwgYW5kIDQwMCB5ZWFyIGN5Y2xlcy4gIFRoYXQgdGhlc2UgaGF2ZQogICogdGhlIGNvcnJlY3QgdmFsdWVzIGlzIGFzc2VydGVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbi4KICAqLwotI2RlZmluZSBESTRZCTE0NjEJLyogZGF5c19iZWZvcmVfeWVhcig1KTsgZGF5cyBpbiA0IHllYXJzICovCi0jZGVmaW5lIERJMTAwWQkzNjUyNAkvKiBkYXlzX2JlZm9yZV95ZWFyKDEwMSk7IGRheXMgaW4gMTAwIHllYXJzICovCi0jZGVmaW5lIERJNDAwWQkxNDYwOTcJLyogZGF5c19iZWZvcmVfeWVhcig0MDEpOyBkYXlzIGluIDQwMCB5ZWFycyAgKi8KKyNkZWZpbmUgREk0WSAgICAxNDYxICAgIC8qIGRheXNfYmVmb3JlX3llYXIoNSk7IGRheXMgaW4gNCB5ZWFycyAqLworI2RlZmluZSBESTEwMFkgIDM2NTI0ICAgLyogZGF5c19iZWZvcmVfeWVhcigxMDEpOyBkYXlzIGluIDEwMCB5ZWFycyAqLworI2RlZmluZSBESTQwMFkgIDE0NjA5NyAgLyogZGF5c19iZWZvcmVfeWVhcig0MDEpOyBkYXlzIGluIDQwMCB5ZWFycyAgKi8KIAogLyogb3JkaW5hbCAtPiB5ZWFyLCBtb250aCwgZGF5LCBjb25zaWRlcmluZyAwMS1KYW4tMDAwMSBhcyBkYXkgMS4gKi8KIHN0YXRpYyB2b2lkCiBvcmRfdG9feW1kKGludCBvcmRpbmFsLCBpbnQgKnllYXIsIGludCAqbW9udGgsIGludCAqZGF5KQogewotCWludCBuLCBuMSwgbjQsIG4xMDAsIG40MDAsIGxlYXB5ZWFyLCBwcmVjZWRpbmc7CisgICAgaW50IG4sIG4xLCBuNCwgbjEwMCwgbjQwMCwgbGVhcHllYXIsIHByZWNlZGluZzsKIAotCS8qIG9yZGluYWwgaXMgYSAxLWJhc2VkIGluZGV4LCBzdGFydGluZyBhdCAxLUphbi0xLiAgVGhlIHBhdHRlcm4gb2YKLQkgKiBsZWFwIHllYXJzIHJlcGVhdHMgZXhhY3RseSBldmVyeSA0MDAgeWVhcnMuICBUaGUgYmFzaWMgc3RyYXRlZ3kgaXMKLQkgKiB0byBmaW5kIHRoZSBjbG9zZXN0IDQwMC15ZWFyIGJvdW5kYXJ5IGF0IG9yIGJlZm9yZSBvcmRpbmFsLCB0aGVuCi0JICogd29yayB3aXRoIHRoZSBvZmZzZXQgZnJvbSB0aGF0IGJvdW5kYXJ5IHRvIG9yZGluYWwuICBMaWZlIGlzIG11Y2gKLQkgKiBjbGVhcmVyIGlmIHdlIHN1YnRyYWN0IDEgZnJvbSBvcmRpbmFsIGZpcnN0IC0tIHRoZW4gdGhlIHZhbHVlcwotCSAqIG9mIG9yZGluYWwgYXQgNDAwLXllYXIgYm91bmRhcmllcyBhcmUgZXhhY3RseSB0aG9zZSBkaXZpc2libGUKLQkgKiBieSBESTQwMFk6Ci0JICoKLQkgKiAgICBEICBNICAgWSAgICAgICAgICAgIG4gICAgICAgICAgICAgIG4tMQotCSAqICAgIC0tIC0tLSAtLS0tICAgICAgICAtLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tCi0JICogICAgMzEgRGVjIC00MDAgICAgICAgIC1ESTQwMFkgICAgICAgLURJNDAwWSAtMQotCSAqICAgICAxIEphbiAtMzk5ICAgICAgICAgLURJNDAwWSArMSAgIC1ESTQwMFkgICAgICA0MDAteWVhciBib3VuZGFyeQotCSAqICAgIC4uLgotCSAqICAgIDMwIERlYyAgMDAwICAgICAgICAtMSAgICAgICAgICAgICAtMgotCSAqICAgIDMxIERlYyAgMDAwICAgICAgICAgMCAgICAgICAgICAgICAtMQotCSAqICAgICAxIEphbiAgMDAxICAgICAgICAgMSAgICAgICAgICAgICAgMCAgICAgICAgICA0MDAteWVhciBib3VuZGFyeQotCSAqICAgICAyIEphbiAgMDAxICAgICAgICAgMiAgICAgICAgICAgICAgMQotCSAqICAgICAzIEphbiAgMDAxICAgICAgICAgMyAgICAgICAgICAgICAgMgotCSAqICAgIC4uLgotCSAqICAgIDMxIERlYyAgNDAwICAgICAgICAgREk0MDBZICAgICAgICBESTQwMFkgLTEKLQkgKiAgICAgMSBKYW4gIDQwMSAgICAgICAgIERJNDAwWSArMSAgICAgREk0MDBZICAgICAgNDAwLXllYXIgYm91bmRhcnkKLQkgKi8KLQlhc3NlcnQob3JkaW5hbCA+PSAxKTsKLQktLW9yZGluYWw7Ci0JbjQwMCA9IG9yZGluYWwgLyBESTQwMFk7Ci0JbiA9IG9yZGluYWwgJSBESTQwMFk7Ci0JKnllYXIgPSBuNDAwICogNDAwICsgMTsKKyAgICAvKiBvcmRpbmFsIGlzIGEgMS1iYXNlZCBpbmRleCwgc3RhcnRpbmcgYXQgMS1KYW4tMS4gIFRoZSBwYXR0ZXJuIG9mCisgICAgICogbGVhcCB5ZWFycyByZXBlYXRzIGV4YWN0bHkgZXZlcnkgNDAwIHllYXJzLiAgVGhlIGJhc2ljIHN0cmF0ZWd5IGlzCisgICAgICogdG8gZmluZCB0aGUgY2xvc2VzdCA0MDAteWVhciBib3VuZGFyeSBhdCBvciBiZWZvcmUgb3JkaW5hbCwgdGhlbgorICAgICAqIHdvcmsgd2l0aCB0aGUgb2Zmc2V0IGZyb20gdGhhdCBib3VuZGFyeSB0byBvcmRpbmFsLiAgTGlmZSBpcyBtdWNoCisgICAgICogY2xlYXJlciBpZiB3ZSBzdWJ0cmFjdCAxIGZyb20gb3JkaW5hbCBmaXJzdCAtLSB0aGVuIHRoZSB2YWx1ZXMKKyAgICAgKiBvZiBvcmRpbmFsIGF0IDQwMC15ZWFyIGJvdW5kYXJpZXMgYXJlIGV4YWN0bHkgdGhvc2UgZGl2aXNpYmxlCisgICAgICogYnkgREk0MDBZOgorICAgICAqCisgICAgICogICAgRCAgTSAgIFkgICAgICAgICAgICBuICAgICAgICAgICAgICBuLTEKKyAgICAgKiAgICAtLSAtLS0gLS0tLSAgICAgICAgLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLQorICAgICAqICAgIDMxIERlYyAtNDAwICAgICAgICAtREk0MDBZICAgICAgIC1ESTQwMFkgLTEKKyAgICAgKiAgICAgMSBKYW4gLTM5OSAgICAgICAgIC1ESTQwMFkgKzEgICAtREk0MDBZICAgICAgNDAwLXllYXIgYm91bmRhcnkKKyAgICAgKiAgICAuLi4KKyAgICAgKiAgICAzMCBEZWMgIDAwMCAgICAgICAgLTEgICAgICAgICAgICAgLTIKKyAgICAgKiAgICAzMSBEZWMgIDAwMCAgICAgICAgIDAgICAgICAgICAgICAgLTEKKyAgICAgKiAgICAgMSBKYW4gIDAwMSAgICAgICAgIDEgICAgICAgICAgICAgIDAgICAgICAgICAgNDAwLXllYXIgYm91bmRhcnkKKyAgICAgKiAgICAgMiBKYW4gIDAwMSAgICAgICAgIDIgICAgICAgICAgICAgIDEKKyAgICAgKiAgICAgMyBKYW4gIDAwMSAgICAgICAgIDMgICAgICAgICAgICAgIDIKKyAgICAgKiAgICAuLi4KKyAgICAgKiAgICAzMSBEZWMgIDQwMCAgICAgICAgIERJNDAwWSAgICAgICAgREk0MDBZIC0xCisgICAgICogICAgIDEgSmFuICA0MDEgICAgICAgICBESTQwMFkgKzEgICAgIERJNDAwWSAgICAgIDQwMC15ZWFyIGJvdW5kYXJ5CisgICAgICovCisgICAgYXNzZXJ0KG9yZGluYWwgPj0gMSk7CisgICAgLS1vcmRpbmFsOworICAgIG40MDAgPSBvcmRpbmFsIC8gREk0MDBZOworICAgIG4gPSBvcmRpbmFsICUgREk0MDBZOworICAgICp5ZWFyID0gbjQwMCAqIDQwMCArIDE7CiAKLQkvKiBOb3cgbiBpcyB0aGUgKG5vbi1uZWdhdGl2ZSkgb2Zmc2V0LCBpbiBkYXlzLCBmcm9tIEphbnVhcnkgMSBvZgotCSAqIHllYXIsIHRvIHRoZSBkZXNpcmVkIGRhdGUuICBOb3cgY29tcHV0ZSBob3cgbWFueSAxMDAteWVhciBjeWNsZXMKLQkgKiBwcmVjZWRlIG4uCi0JICogTm90ZSB0aGF0IGl0J3MgcG9zc2libGUgZm9yIG4xMDAgdG8gZXF1YWwgNCEgIEluIHRoYXQgY2FzZSA0IGZ1bGwKLQkgKiAxMDAteWVhciBjeWNsZXMgcHJlY2VkZSB0aGUgZGVzaXJlZCBkYXksIHdoaWNoIGltcGxpZXMgdGhlCi0JICogZGVzaXJlZCBkYXkgaXMgRGVjZW1iZXIgMzEgYXQgdGhlIGVuZCBvZiBhIDQwMC15ZWFyIGN5Y2xlLgotCSAqLwotCW4xMDAgPSBuIC8gREkxMDBZOwotCW4gPSBuICUgREkxMDBZOworICAgIC8qIE5vdyBuIGlzIHRoZSAobm9uLW5lZ2F0aXZlKSBvZmZzZXQsIGluIGRheXMsIGZyb20gSmFudWFyeSAxIG9mCisgICAgICogeWVhciwgdG8gdGhlIGRlc2lyZWQgZGF0ZS4gIE5vdyBjb21wdXRlIGhvdyBtYW55IDEwMC15ZWFyIGN5Y2xlcworICAgICAqIHByZWNlZGUgbi4KKyAgICAgKiBOb3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3IgbjEwMCB0byBlcXVhbCA0ISAgSW4gdGhhdCBjYXNlIDQgZnVsbAorICAgICAqIDEwMC15ZWFyIGN5Y2xlcyBwcmVjZWRlIHRoZSBkZXNpcmVkIGRheSwgd2hpY2ggaW1wbGllcyB0aGUKKyAgICAgKiBkZXNpcmVkIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIGEgNDAwLXllYXIgY3ljbGUuCisgICAgICovCisgICAgbjEwMCA9IG4gLyBESTEwMFk7CisgICAgbiA9IG4gJSBESTEwMFk7CiAKLQkvKiBOb3cgY29tcHV0ZSBob3cgbWFueSA0LXllYXIgY3ljbGVzIHByZWNlZGUgaXQuICovCi0JbjQgPSBuIC8gREk0WTsKLQluID0gbiAlIERJNFk7CisgICAgLyogTm93IGNvbXB1dGUgaG93IG1hbnkgNC15ZWFyIGN5Y2xlcyBwcmVjZWRlIGl0LiAqLworICAgIG40ID0gbiAvIERJNFk7CisgICAgbiA9IG4gJSBESTRZOwogCi0JLyogQW5kIG5vdyBob3cgbWFueSBzaW5nbGUgeWVhcnMuICBBZ2FpbiBuMSBjYW4gYmUgNCwgYW5kIGFnYWluCi0JICogbWVhbmluZyB0aGF0IHRoZSBkZXNpcmVkIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIHRoZQotCSAqIDQteWVhciBjeWNsZS4KLQkgKi8KLQluMSA9IG4gLyAzNjU7Ci0JbiA9IG4gJSAzNjU7CisgICAgLyogQW5kIG5vdyBob3cgbWFueSBzaW5nbGUgeWVhcnMuICBBZ2FpbiBuMSBjYW4gYmUgNCwgYW5kIGFnYWluCisgICAgICogbWVhbmluZyB0aGF0IHRoZSBkZXNpcmVkIGRheSBpcyBEZWNlbWJlciAzMSBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAqIDQteWVhciBjeWNsZS4KKyAgICAgKi8KKyAgICBuMSA9IG4gLyAzNjU7CisgICAgbiA9IG4gJSAzNjU7CiAKLQkqeWVhciArPSBuMTAwICogMTAwICsgbjQgKiA0ICsgbjE7Ci0JaWYgKG4xID09IDQgfHwgbjEwMCA9PSA0KSB7Ci0JCWFzc2VydChuID09IDApOwotCQkqeWVhciAtPSAxOwotCQkqbW9udGggPSAxMjsKLQkJKmRheSA9IDMxOwotCQlyZXR1cm47Ci0JfQorICAgICp5ZWFyICs9IG4xMDAgKiAxMDAgKyBuNCAqIDQgKyBuMTsKKyAgICBpZiAobjEgPT0gNCB8fCBuMTAwID09IDQpIHsKKyAgICAgICAgYXNzZXJ0KG4gPT0gMCk7CisgICAgICAgICp5ZWFyIC09IDE7CisgICAgICAgICptb250aCA9IDEyOworICAgICAgICAqZGF5ID0gMzE7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQkvKiBOb3cgdGhlIHllYXIgaXMgY29ycmVjdCwgYW5kIG4gaXMgdGhlIG9mZnNldCBmcm9tIEphbnVhcnkgMS4gIFdlCi0JICogZmluZCB0aGUgbW9udGggdmlhIGFuIGVzdGltYXRlIHRoYXQncyBlaXRoZXIgZXhhY3Qgb3Igb25lIHRvbwotCSAqIGxhcmdlLgotCSAqLwotCWxlYXB5ZWFyID0gbjEgPT0gMyAmJiAobjQgIT0gMjQgfHwgbjEwMCA9PSAzKTsKLQlhc3NlcnQobGVhcHllYXIgPT0gaXNfbGVhcCgqeWVhcikpOwotCSptb250aCA9IChuICsgNTApID4+IDU7Ci0JcHJlY2VkaW5nID0gKF9kYXlzX2JlZm9yZV9tb250aFsqbW9udGhdICsgKCptb250aCA+IDIgJiYgbGVhcHllYXIpKTsKLQlpZiAocHJlY2VkaW5nID4gbikgewotCQkvKiBlc3RpbWF0ZSBpcyB0b28gbGFyZ2UgKi8KLQkJKm1vbnRoIC09IDE7Ci0JCXByZWNlZGluZyAtPSBkYXlzX2luX21vbnRoKCp5ZWFyLCAqbW9udGgpOwotCX0KLQluIC09IHByZWNlZGluZzsKLQlhc3NlcnQoMCA8PSBuKTsKLQlhc3NlcnQobiA8IGRheXNfaW5fbW9udGgoKnllYXIsICptb250aCkpOworICAgIC8qIE5vdyB0aGUgeWVhciBpcyBjb3JyZWN0LCBhbmQgbiBpcyB0aGUgb2Zmc2V0IGZyb20gSmFudWFyeSAxLiAgV2UKKyAgICAgKiBmaW5kIHRoZSBtb250aCB2aWEgYW4gZXN0aW1hdGUgdGhhdCdzIGVpdGhlciBleGFjdCBvciBvbmUgdG9vCisgICAgICogbGFyZ2UuCisgICAgICovCisgICAgbGVhcHllYXIgPSBuMSA9PSAzICYmIChuNCAhPSAyNCB8fCBuMTAwID09IDMpOworICAgIGFzc2VydChsZWFweWVhciA9PSBpc19sZWFwKCp5ZWFyKSk7CisgICAgKm1vbnRoID0gKG4gKyA1MCkgPj4gNTsKKyAgICBwcmVjZWRpbmcgPSAoX2RheXNfYmVmb3JlX21vbnRoWyptb250aF0gKyAoKm1vbnRoID4gMiAmJiBsZWFweWVhcikpOworICAgIGlmIChwcmVjZWRpbmcgPiBuKSB7CisgICAgICAgIC8qIGVzdGltYXRlIGlzIHRvbyBsYXJnZSAqLworICAgICAgICAqbW9udGggLT0gMTsKKyAgICAgICAgcHJlY2VkaW5nIC09IGRheXNfaW5fbW9udGgoKnllYXIsICptb250aCk7CisgICAgfQorICAgIG4gLT0gcHJlY2VkaW5nOworICAgIGFzc2VydCgwIDw9IG4pOworICAgIGFzc2VydChuIDwgZGF5c19pbl9tb250aCgqeWVhciwgKm1vbnRoKSk7CiAKLQkqZGF5ID0gbiArIDE7CisgICAgKmRheSA9IG4gKyAxOwogfQogCiAvKiB5ZWFyLCBtb250aCwgZGF5IC0+IG9yZGluYWwsIGNvbnNpZGVyaW5nIDAxLUphbi0wMDAxIGFzIGRheSAxLiAqLwogc3RhdGljIGludAogeW1kX3RvX29yZChpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KQogewotCXJldHVybiBkYXlzX2JlZm9yZV95ZWFyKHllYXIpICsgZGF5c19iZWZvcmVfbW9udGgoeWVhciwgbW9udGgpICsgZGF5OworICAgIHJldHVybiBkYXlzX2JlZm9yZV95ZWFyKHllYXIpICsgZGF5c19iZWZvcmVfbW9udGgoeWVhciwgbW9udGgpICsgZGF5OwogfQogCiAvKiBEYXkgb2Ygd2Vlaywgd2hlcmUgTW9uZGF5PT0wLCAuLi4sIFN1bmRheT09Ni4gIDEvMS8xIHdhcyBhIE1vbmRheS4gKi8KIHN0YXRpYyBpbnQKIHdlZWtkYXkoaW50IHllYXIsIGludCBtb250aCwgaW50IGRheSkKIHsKLQlyZXR1cm4gKHltZF90b19vcmQoeWVhciwgbW9udGgsIGRheSkgKyA2KSAlIDc7CisgICAgcmV0dXJuICh5bWRfdG9fb3JkKHllYXIsIG1vbnRoLCBkYXkpICsgNikgJSA3OwogfQogCiAvKiBPcmRpbmFsIG9mIHRoZSBNb25kYXkgc3RhcnRpbmcgd2VlayAxIG9mIHRoZSBJU08geWVhci4gIFdlZWsgMSBpcyB0aGUKQEAgLTM0MiwxNSArMzQyLDE1IEBACiBzdGF0aWMgaW50CiBpc29fd2VlazFfbW9uZGF5KGludCB5ZWFyKQogewotCWludCBmaXJzdF9kYXkgPSB5bWRfdG9fb3JkKHllYXIsIDEsIDEpOwkvKiBvcmQgb2YgMS8xICovCi0JLyogMCBpZiAxLzEgaXMgYSBNb25kYXksIDEgaWYgYSBUdWUsIGV0Yy4gKi8KLQlpbnQgZmlyc3Rfd2Vla2RheSA9IChmaXJzdF9kYXkgKyA2KSAlIDc7Ci0JLyogb3JkaW5hbCBvZiBjbG9zZXN0IE1vbmRheSBhdCBvciBiZWZvcmUgMS8xICovCi0JaW50IHdlZWsxX21vbmRheSAgPSBmaXJzdF9kYXkgLSBmaXJzdF93ZWVrZGF5OworICAgIGludCBmaXJzdF9kYXkgPSB5bWRfdG9fb3JkKHllYXIsIDEsIDEpOyAgICAgLyogb3JkIG9mIDEvMSAqLworICAgIC8qIDAgaWYgMS8xIGlzIGEgTW9uZGF5LCAxIGlmIGEgVHVlLCBldGMuICovCisgICAgaW50IGZpcnN0X3dlZWtkYXkgPSAoZmlyc3RfZGF5ICsgNikgJSA3OworICAgIC8qIG9yZGluYWwgb2YgY2xvc2VzdCBNb25kYXkgYXQgb3IgYmVmb3JlIDEvMSAqLworICAgIGludCB3ZWVrMV9tb25kYXkgID0gZmlyc3RfZGF5IC0gZmlyc3Rfd2Vla2RheTsKIAotCWlmIChmaXJzdF93ZWVrZGF5ID4gMykJLyogaWYgMS8xIHdhcyBGcmksIFNhdCwgU3VuICovCi0JCXdlZWsxX21vbmRheSArPSA3OwotCXJldHVybiB3ZWVrMV9tb25kYXk7CisgICAgaWYgKGZpcnN0X3dlZWtkYXkgPiAzKSAgICAgIC8qIGlmIDEvMSB3YXMgRnJpLCBTYXQsIFN1biAqLworICAgICAgICB3ZWVrMV9tb25kYXkgKz0gNzsKKyAgICByZXR1cm4gd2VlazFfbW9uZGF5OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM2MywxMiArMzYzLDEyIEBACiBzdGF0aWMgaW50CiBjaGVja19kZWx0YV9kYXlfcmFuZ2UoaW50IGRheXMpCiB7Ci0JaWYgKC1NQVhfREVMVEFfREFZUyA8PSBkYXlzICYmIGRheXMgPD0gTUFYX0RFTFRBX0RBWVMpCi0JCXJldHVybiAwOwotCVB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkgICAgICJkYXlzPSVkOyBtdXN0IGhhdmUgbWFnbml0dWRlIDw9ICVkIiwKLQkJICAgICBkYXlzLCBNQVhfREVMVEFfREFZUyk7Ci0JcmV0dXJuIC0xOworICAgIGlmICgtTUFYX0RFTFRBX0RBWVMgPD0gZGF5cyAmJiBkYXlzIDw9IE1BWF9ERUxUQV9EQVlTKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgImRheXM9JWQ7IG11c3QgaGF2ZSBtYWduaXR1ZGUgPD0gJWQiLAorICAgICAgICAgICAgICAgICBkYXlzLCBNQVhfREVMVEFfREFZUyk7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBDaGVjayB0aGF0IGRhdGUgYXJndW1lbnRzIGFyZSBpbiByYW5nZS4gIFJldHVybiAwIGlmIHRoZXkgYXJlLiAgSWYgdGhleQpAQCAtMzc4LDIyICszNzgsMjIgQEAKIGNoZWNrX2RhdGVfYXJncyhpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5KQogewogCi0JaWYgKHllYXIgPCBNSU5ZRUFSIHx8IHllYXIgPiBNQVhZRUFSKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJ5ZWFyIGlzIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibW9udGggbXVzdCBiZSBpbiAxLi4xMiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChkYXkgPCAxIHx8IGRheSA+IGRheXNfaW5fbW9udGgoeWVhciwgbW9udGgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJkYXkgaXMgb3V0IG9mIHJhbmdlIGZvciBtb250aCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmICh5ZWFyIDwgTUlOWUVBUiB8fCB5ZWFyID4gTUFYWUVBUikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ5ZWFyIGlzIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChtb250aCA8IDEgfHwgbW9udGggPiAxMikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtb250aCBtdXN0IGJlIGluIDEuLjEyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGRheSA8IDEgfHwgZGF5ID4gZGF5c19pbl9tb250aCh5ZWFyLCBtb250aCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGF5IGlzIG91dCBvZiByYW5nZSBmb3IgbW9udGgiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogQ2hlY2sgdGhhdCB0aW1lIGFyZ3VtZW50cyBhcmUgaW4gcmFuZ2UuICBSZXR1cm4gMCBpZiB0aGV5IGFyZS4gIElmIHRoZXkKQEAgLTQwMiwyNyArNDAyLDI3IEBACiBzdGF0aWMgaW50CiBjaGVja190aW1lX2FyZ3MoaW50IGgsIGludCBtLCBpbnQgcywgaW50IHVzKQogewotCWlmIChoIDwgMCB8fCBoID4gMjMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImhvdXIgbXVzdCBiZSBpbiAwLi4yMyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChtIDwgMCB8fCBtID4gNTkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm1pbnV0ZSBtdXN0IGJlIGluIDAuLjU5Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHMgPCAwIHx8IHMgPiA1OSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic2Vjb25kIG11c3QgYmUgaW4gMC4uNTkiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodXMgPCAwIHx8IHVzID4gOTk5OTk5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJtaWNyb3NlY29uZCBtdXN0IGJlIGluIDAuLjk5OTk5OSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmIChoIDwgMCB8fCBoID4gMjMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaG91ciBtdXN0IGJlIGluIDAuLjIzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG0gPCAwIHx8IG0gPiA1OSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtaW51dGUgbXVzdCBiZSBpbiAwLi41OSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzIDwgMCB8fCBzID4gNTkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2Vjb25kIG11c3QgYmUgaW4gMC4uNTkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodXMgPCAwIHx8IHVzID4gOTk5OTk5KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1pY3Jvc2Vjb25kIG11c3QgYmUgaW4gMC4uOTk5OTk5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDM4LDEwOSArNDM4LDEwOSBAQAogc3RhdGljIHZvaWQKIG5vcm1hbGl6ZV9wYWlyKGludCAqaGksIGludCAqbG8sIGludCBmYWN0b3IpCiB7Ci0JYXNzZXJ0KGZhY3RvciA+IDApOwotCWFzc2VydChsbyAhPSBoaSk7Ci0JaWYgKCpsbyA8IDAgfHwgKmxvID49IGZhY3RvcikgewotCQljb25zdCBpbnQgbnVtX2hpID0gZGl2bW9kKCpsbywgZmFjdG9yLCBsbyk7Ci0JCWNvbnN0IGludCBuZXdfaGkgPSAqaGkgKyBudW1faGk7Ci0JCWFzc2VydCghIFNJR05FRF9BRERfT1ZFUkZMT1dFRChuZXdfaGksICpoaSwgbnVtX2hpKSk7Ci0JCSpoaSA9IG5ld19oaTsKLQl9Ci0JYXNzZXJ0KDAgPD0gKmxvICYmICpsbyA8IGZhY3Rvcik7CisgICAgYXNzZXJ0KGZhY3RvciA+IDApOworICAgIGFzc2VydChsbyAhPSBoaSk7CisgICAgaWYgKCpsbyA8IDAgfHwgKmxvID49IGZhY3RvcikgeworICAgICAgICBjb25zdCBpbnQgbnVtX2hpID0gZGl2bW9kKCpsbywgZmFjdG9yLCBsbyk7CisgICAgICAgIGNvbnN0IGludCBuZXdfaGkgPSAqaGkgKyBudW1faGk7CisgICAgICAgIGFzc2VydCghIFNJR05FRF9BRERfT1ZFUkZMT1dFRChuZXdfaGksICpoaSwgbnVtX2hpKSk7CisgICAgICAgICpoaSA9IG5ld19oaTsKKyAgICB9CisgICAgYXNzZXJ0KDAgPD0gKmxvICYmICpsbyA8IGZhY3Rvcik7CiB9CiAKIC8qIEZpZGRsZSBkYXlzIChkKSwgc2Vjb25kcyAocyksIGFuZCBtaWNyb3NlY29uZHMgKHVzKSBzbyB0aGF0Ci0gKiAJMCA8PSAqcyA8IDI0KjM2MDAKLSAqIAkwIDw9ICp1cyA8IDEwMDAwMDAKKyAqICAgICAgMCA8PSAqcyA8IDI0KjM2MDAKKyAqICAgICAgMCA8PSAqdXMgPCAxMDAwMDAwCiAgKiBUaGUgaW5wdXQgdmFsdWVzIG11c3QgYmUgc3VjaCB0aGF0IHRoZSBpbnRlcm5hbHMgZG9uJ3Qgb3ZlcmZsb3cuCiAgKiBUaGUgd2F5IHRoaXMgcm91dGluZSBpcyB1c2VkLCB3ZSBkb24ndCBnZXQgY2xvc2UuCiAgKi8KIHN0YXRpYyB2b2lkCiBub3JtYWxpemVfZF9zX3VzKGludCAqZCwgaW50ICpzLCBpbnQgKnVzKQogewotCWlmICgqdXMgPCAwIHx8ICp1cyA+PSAxMDAwMDAwKSB7Ci0JCW5vcm1hbGl6ZV9wYWlyKHMsIHVzLCAxMDAwMDAwKTsKLQkJLyogfHN8IGNhbid0IGJlIGJpZ2dlciB0aGFuIGFib3V0Ci0JCSAqIHxvcmlnaW5hbCBzfCArIHxvcmlnaW5hbCB1c3wvMTAwMDAwMCBub3cuCi0JCSAqLworICAgIGlmICgqdXMgPCAwIHx8ICp1cyA+PSAxMDAwMDAwKSB7CisgICAgICAgIG5vcm1hbGl6ZV9wYWlyKHMsIHVzLCAxMDAwMDAwKTsKKyAgICAgICAgLyogfHN8IGNhbid0IGJlIGJpZ2dlciB0aGFuIGFib3V0CisgICAgICAgICAqIHxvcmlnaW5hbCBzfCArIHxvcmlnaW5hbCB1c3wvMTAwMDAwMCBub3cuCisgICAgICAgICAqLwogCi0JfQotCWlmICgqcyA8IDAgfHwgKnMgPj0gMjQqMzYwMCkgewotCQlub3JtYWxpemVfcGFpcihkLCBzLCAyNCozNjAwKTsKLQkJLyogfGR8IGNhbid0IGJlIGJpZ2dlciB0aGFuIGFib3V0Ci0JCSAqIHxvcmlnaW5hbCBkfCArCi0JCSAqICh8b3JpZ2luYWwgc3wgKyB8b3JpZ2luYWwgdXN8LzEwMDAwMDApIC8gKDI0KjM2MDApIG5vdy4KLQkJICovCi0JfQotCWFzc2VydCgwIDw9ICpzICYmICpzIDwgMjQqMzYwMCk7Ci0JYXNzZXJ0KDAgPD0gKnVzICYmICp1cyA8IDEwMDAwMDApOworICAgIH0KKyAgICBpZiAoKnMgPCAwIHx8ICpzID49IDI0KjM2MDApIHsKKyAgICAgICAgbm9ybWFsaXplX3BhaXIoZCwgcywgMjQqMzYwMCk7CisgICAgICAgIC8qIHxkfCBjYW4ndCBiZSBiaWdnZXIgdGhhbiBhYm91dAorICAgICAgICAgKiB8b3JpZ2luYWwgZHwgKworICAgICAgICAgKiAofG9yaWdpbmFsIHN8ICsgfG9yaWdpbmFsIHVzfC8xMDAwMDAwKSAvICgyNCozNjAwKSBub3cuCisgICAgICAgICAqLworICAgIH0KKyAgICBhc3NlcnQoMCA8PSAqcyAmJiAqcyA8IDI0KjM2MDApOworICAgIGFzc2VydCgwIDw9ICp1cyAmJiAqdXMgPCAxMDAwMDAwKTsKIH0KIAogLyogRmlkZGxlIHllYXJzICh5KSwgbW9udGhzIChtKSwgYW5kIGRheXMgKGQpIHNvIHRoYXQKLSAqIAkxIDw9ICptIDw9IDEyCi0gKiAJMSA8PSAqZCA8PSBkYXlzX2luX21vbnRoKCp5LCAqbSkKKyAqICAgICAgMSA8PSAqbSA8PSAxMgorICogICAgICAxIDw9ICpkIDw9IGRheXNfaW5fbW9udGgoKnksICptKQogICogVGhlIGlucHV0IHZhbHVlcyBtdXN0IGJlIHN1Y2ggdGhhdCB0aGUgaW50ZXJuYWxzIGRvbid0IG92ZXJmbG93LgogICogVGhlIHdheSB0aGlzIHJvdXRpbmUgaXMgdXNlZCwgd2UgZG9uJ3QgZ2V0IGNsb3NlLgogICovCiBzdGF0aWMgdm9pZAogbm9ybWFsaXplX3lfbV9kKGludCAqeSwgaW50ICptLCBpbnQgKmQpCiB7Ci0JaW50IGRpbTsJLyogIyBvZiBkYXlzIGluIG1vbnRoICovCisgICAgaW50IGRpbTsgICAgICAgICAgICAvKiAjIG9mIGRheXMgaW4gbW9udGggKi8KIAotCS8qIFRoaXMgZ2V0cyBtdWRkeTogIHRoZSBwcm9wZXIgcmFuZ2UgZm9yIGRheSBjYW4ndCBiZSBkZXRlcm1pbmVkCi0JICogd2l0aG91dCBrbm93aW5nIHRoZSBjb3JyZWN0IG1vbnRoIGFuZCB5ZWFyLCBidXQgaWYgZGF5IGlzLCBlLmcuLAotCSAqIHBsdXMgb3IgbWludXMgYSBtaWxsaW9uLCB0aGUgY3VycmVudCBtb250aCBhbmQgeWVhciB2YWx1ZXMgbWFrZQotCSAqIG5vIHNlbnNlIChhbmQgbWF5IGFsc28gYmUgb3V0IG9mIGJvdW5kcyB0aGVtc2VsdmVzKS4KLQkgKiBTYXlpbmcgMTIgbW9udGhzID09IDEgeWVhciBzaG91bGQgYmUgbm9uLWNvbnRyb3ZlcnNpYWwuCi0JICovCi0JaWYgKCptIDwgMSB8fCAqbSA+IDEyKSB7Ci0JCS0tKm07Ci0JCW5vcm1hbGl6ZV9wYWlyKHksIG0sIDEyKTsKLQkJKysqbTsKLQkJLyogfHl8IGNhbid0IGJlIGJpZ2dlciB0aGFuIGFib3V0Ci0JCSAqIHxvcmlnaW5hbCB5fCArIHxvcmlnaW5hbCBtfC8xMiBub3cuCi0JCSAqLwotCX0KLQlhc3NlcnQoMSA8PSAqbSAmJiAqbSA8PSAxMik7CisgICAgLyogVGhpcyBnZXRzIG11ZGR5OiAgdGhlIHByb3BlciByYW5nZSBmb3IgZGF5IGNhbid0IGJlIGRldGVybWluZWQKKyAgICAgKiB3aXRob3V0IGtub3dpbmcgdGhlIGNvcnJlY3QgbW9udGggYW5kIHllYXIsIGJ1dCBpZiBkYXkgaXMsIGUuZy4sCisgICAgICogcGx1cyBvciBtaW51cyBhIG1pbGxpb24sIHRoZSBjdXJyZW50IG1vbnRoIGFuZCB5ZWFyIHZhbHVlcyBtYWtlCisgICAgICogbm8gc2Vuc2UgKGFuZCBtYXkgYWxzbyBiZSBvdXQgb2YgYm91bmRzIHRoZW1zZWx2ZXMpLgorICAgICAqIFNheWluZyAxMiBtb250aHMgPT0gMSB5ZWFyIHNob3VsZCBiZSBub24tY29udHJvdmVyc2lhbC4KKyAgICAgKi8KKyAgICBpZiAoKm0gPCAxIHx8ICptID4gMTIpIHsKKyAgICAgICAgLS0qbTsKKyAgICAgICAgbm9ybWFsaXplX3BhaXIoeSwgbSwgMTIpOworICAgICAgICArKyptOworICAgICAgICAvKiB8eXwgY2FuJ3QgYmUgYmlnZ2VyIHRoYW4gYWJvdXQKKyAgICAgICAgICogfG9yaWdpbmFsIHl8ICsgfG9yaWdpbmFsIG18LzEyIG5vdy4KKyAgICAgICAgICovCisgICAgfQorICAgIGFzc2VydCgxIDw9ICptICYmICptIDw9IDEyKTsKIAotCS8qIE5vdyBvbmx5IGRheSBjYW4gYmUgb3V0IG9mIGJvdW5kcyAoeWVhciBtYXkgYWxzbyBiZSBvdXQgb2YgYm91bmRzCi0JICogZm9yIGEgZGF0ZXRpbWUgb2JqZWN0LCBidXQgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGF0IGhlcmUpLgotCSAqIElmIGRheSBpcyBvdXQgb2YgYm91bmRzLCB3aGF0IHRvIGRvIGlzIGFyZ3VhYmxlLCBidXQgYXQgbGVhc3QgdGhlCi0JICogbWV0aG9kIGhlcmUgaXMgcHJpbmNpcGxlZCBhbmQgZXhwbGFpbmFibGUuCi0JICovCi0JZGltID0gZGF5c19pbl9tb250aCgqeSwgKm0pOwotCWlmICgqZCA8IDEgfHwgKmQgPiBkaW0pIHsKLQkJLyogTW92ZSBkYXktMSBkYXlzIGZyb20gdGhlIGZpcnN0IG9mIHRoZSBtb250aC4gIEZpcnN0IHRyeSB0bwotCQkgKiBnZXQgb2ZmIGNoZWFwIGlmIHdlJ3JlIG9ubHkgb25lIGRheSBvdXQgb2YgcmFuZ2UKLQkJICogKGFkanVzdG1lbnRzIGZvciB0aW1lem9uZSBhbG9uZSBjYW4ndCBiZSB3b3JzZSB0aGFuIHRoYXQpLgotCQkgKi8KLQkJaWYgKCpkID09IDApIHsKLQkJCS0tKm07Ci0JCQlpZiAoKm0gPiAwKQotCQkJCSpkID0gZGF5c19pbl9tb250aCgqeSwgKm0pOwotCQkJZWxzZSB7Ci0JCQkJLS0qeTsKLQkJCQkqbSA9IDEyOwotCQkJCSpkID0gMzE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoKmQgPT0gZGltICsgMSkgewotCQkJLyogbW92ZSBmb3J3YXJkIGEgZGF5ICovCi0JCQkrKyptOwotCQkJKmQgPSAxOwotCQkJaWYgKCptID4gMTIpIHsKLQkJCQkqbSA9IDE7Ci0JCQkJKysqeTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWludCBvcmRpbmFsID0geW1kX3RvX29yZCgqeSwgKm0sIDEpICsKLQkJCQkJCSAgKmQgLSAxOwotCQkJb3JkX3RvX3ltZChvcmRpbmFsLCB5LCBtLCBkKTsKLQkJfQotCX0KLQlhc3NlcnQoKm0gPiAwKTsKLQlhc3NlcnQoKmQgPiAwKTsKKyAgICAvKiBOb3cgb25seSBkYXkgY2FuIGJlIG91dCBvZiBib3VuZHMgKHllYXIgbWF5IGFsc28gYmUgb3V0IG9mIGJvdW5kcworICAgICAqIGZvciBhIGRhdGV0aW1lIG9iamVjdCwgYnV0IHdlIGRvbid0IGNhcmUgYWJvdXQgdGhhdCBoZXJlKS4KKyAgICAgKiBJZiBkYXkgaXMgb3V0IG9mIGJvdW5kcywgd2hhdCB0byBkbyBpcyBhcmd1YWJsZSwgYnV0IGF0IGxlYXN0IHRoZQorICAgICAqIG1ldGhvZCBoZXJlIGlzIHByaW5jaXBsZWQgYW5kIGV4cGxhaW5hYmxlLgorICAgICAqLworICAgIGRpbSA9IGRheXNfaW5fbW9udGgoKnksICptKTsKKyAgICBpZiAoKmQgPCAxIHx8ICpkID4gZGltKSB7CisgICAgICAgIC8qIE1vdmUgZGF5LTEgZGF5cyBmcm9tIHRoZSBmaXJzdCBvZiB0aGUgbW9udGguICBGaXJzdCB0cnkgdG8KKyAgICAgICAgICogZ2V0IG9mZiBjaGVhcCBpZiB3ZSdyZSBvbmx5IG9uZSBkYXkgb3V0IG9mIHJhbmdlCisgICAgICAgICAqIChhZGp1c3RtZW50cyBmb3IgdGltZXpvbmUgYWxvbmUgY2FuJ3QgYmUgd29yc2UgdGhhbiB0aGF0KS4KKyAgICAgICAgICovCisgICAgICAgIGlmICgqZCA9PSAwKSB7CisgICAgICAgICAgICAtLSptOworICAgICAgICAgICAgaWYgKCptID4gMCkKKyAgICAgICAgICAgICAgICAqZCA9IGRheXNfaW5fbW9udGgoKnksICptKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC0tKnk7CisgICAgICAgICAgICAgICAgKm0gPSAxMjsKKyAgICAgICAgICAgICAgICAqZCA9IDMxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCpkID09IGRpbSArIDEpIHsKKyAgICAgICAgICAgIC8qIG1vdmUgZm9yd2FyZCBhIGRheSAqLworICAgICAgICAgICAgKysqbTsKKyAgICAgICAgICAgICpkID0gMTsKKyAgICAgICAgICAgIGlmICgqbSA+IDEyKSB7CisgICAgICAgICAgICAgICAgKm0gPSAxOworICAgICAgICAgICAgICAgICsrKnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgb3JkaW5hbCA9IHltZF90b19vcmQoKnksICptLCAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkIC0gMTsKKyAgICAgICAgICAgIG9yZF90b195bWQob3JkaW5hbCwgeSwgbSwgZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KCptID4gMCk7CisgICAgYXNzZXJ0KCpkID4gMCk7CiB9CiAKIC8qIEZpZGRsZSBvdXQtb2YtYm91bmRzIG1vbnRocyBhbmQgZGF5cyBzbyB0aGF0IHRoZSByZXN1bHQgbWFrZXMgc29tZSBraW5kCkBAIC01NTAsMTcgKzU1MCwxNyBAQAogc3RhdGljIGludAogbm9ybWFsaXplX2RhdGUoaW50ICp5ZWFyLCBpbnQgKm1vbnRoLCBpbnQgKmRheSkKIHsKLQlpbnQgcmVzdWx0OworICAgIGludCByZXN1bHQ7CiAKLQlub3JtYWxpemVfeV9tX2QoeWVhciwgbW9udGgsIGRheSk7Ci0JaWYgKE1JTllFQVIgPD0gKnllYXIgJiYgKnllYXIgPD0gTUFYWUVBUikKLQkJcmVzdWx0ID0gMDsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImRhdGUgdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0JCXJlc3VsdCA9IC0xOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIG5vcm1hbGl6ZV95X21fZCh5ZWFyLCBtb250aCwgZGF5KTsKKyAgICBpZiAoTUlOWUVBUiA8PSAqeWVhciAmJiAqeWVhciA8PSBNQVhZRUFSKQorICAgICAgICByZXN1bHQgPSAwOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYXRlIHZhbHVlIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXN1bHQgPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogRm9yY2UgYWxsIHRoZSBkYXRldGltZSBmaWVsZHMgaW50byByYW5nZS4gIFRoZSBwYXJhbWV0ZXJzIGFyZSBib3RoCkBAIC01NzEsMTEgKzU3MSwxMSBAQAogICAgICAgICAgICAgICAgICAgIGludCAqaG91ciwgaW50ICptaW51dGUsIGludCAqc2Vjb25kLAogICAgICAgICAgICAgICAgICAgIGludCAqbWljcm9zZWNvbmQpCiB7Ci0Jbm9ybWFsaXplX3BhaXIoc2Vjb25kLCBtaWNyb3NlY29uZCwgMTAwMDAwMCk7Ci0Jbm9ybWFsaXplX3BhaXIobWludXRlLCBzZWNvbmQsIDYwKTsKLQlub3JtYWxpemVfcGFpcihob3VyLCBtaW51dGUsIDYwKTsKLQlub3JtYWxpemVfcGFpcihkYXksIGhvdXIsIDI0KTsKLQlyZXR1cm4gbm9ybWFsaXplX2RhdGUoeWVhciwgbW9udGgsIGRheSk7CisgICAgbm9ybWFsaXplX3BhaXIoc2Vjb25kLCBtaWNyb3NlY29uZCwgMTAwMDAwMCk7CisgICAgbm9ybWFsaXplX3BhaXIobWludXRlLCBzZWNvbmQsIDYwKTsKKyAgICBub3JtYWxpemVfcGFpcihob3VyLCBtaW51dGUsIDYwKTsKKyAgICBub3JtYWxpemVfcGFpcihkYXksIGhvdXIsIDI0KTsKKyAgICByZXR1cm4gbm9ybWFsaXplX2RhdGUoeWVhciwgbW9udGgsIGRheSk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjAyLDMxICs2MDIsMzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2FsbG9jKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfc3NpemVfdCBhd2FyZSkKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCXNlbGYgPSAoUHlPYmplY3QgKikKLQkJUHlPYmplY3RfTUFMTE9DKGF3YXJlID8KLQkJCQlzaXplb2YoUHlEYXRlVGltZV9UaW1lKSA6Ci0JCQkJc2l6ZW9mKF9QeURhdGVUaW1lX0Jhc2VUaW1lKSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIChQeU9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7Ci0JUHlPYmplY3RfSU5JVChzZWxmLCB0eXBlKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBzZWxmID0gKFB5T2JqZWN0ICopCisgICAgICAgIFB5T2JqZWN0X01BTExPQyhhd2FyZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUHlEYXRlVGltZV9UaW1lKSA6CisgICAgICAgICAgICAgICAgc2l6ZW9mKF9QeURhdGVUaW1lX0Jhc2VUaW1lKSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7CisgICAgUHlPYmplY3RfSU5JVChzZWxmLCB0eXBlKTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2FsbG9jKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfc3NpemVfdCBhd2FyZSkKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCXNlbGYgPSAoUHlPYmplY3QgKikKLQkJUHlPYmplY3RfTUFMTE9DKGF3YXJlID8KLQkJCQlzaXplb2YoUHlEYXRlVGltZV9EYXRlVGltZSkgOgotCQkJCXNpemVvZihfUHlEYXRlVGltZV9CYXNlRGF0ZVRpbWUpKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gKFB5T2JqZWN0ICopUHlFcnJfTm9NZW1vcnkoKTsKLQlQeU9iamVjdF9JTklUKHNlbGYsIHR5cGUpOwotCXJldHVybiBzZWxmOworICAgIHNlbGYgPSAoUHlPYmplY3QgKikKKyAgICAgICAgUHlPYmplY3RfTUFMTE9DKGF3YXJlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQeURhdGVUaW1lX0RhdGVUaW1lKSA6CisgICAgICAgICAgICAgICAgc2l6ZW9mKF9QeURhdGVUaW1lX0Jhc2VEYXRlVGltZSkpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOworICAgIFB5T2JqZWN0X0lOSVQoc2VsZiwgdHlwZSk7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjM4LDEwICs2MzgsMTAgQEAKIHN0YXRpYyB2b2lkCiBzZXRfZGF0ZV9maWVsZHMoUHlEYXRlVGltZV9EYXRlICpzZWxmLCBpbnQgeSwgaW50IG0sIGludCBkKQogewotCXNlbGYtPmhhc2hjb2RlID0gLTE7Ci0JU0VUX1lFQVIoc2VsZiwgeSk7Ci0JU0VUX01PTlRIKHNlbGYsIG0pOwotCVNFVF9EQVkoc2VsZiwgZCk7CisgICAgc2VsZi0+aGFzaGNvZGUgPSAtMTsKKyAgICBTRVRfWUVBUihzZWxmLCB5KTsKKyAgICBTRVRfTU9OVEgoc2VsZiwgbSk7CisgICAgU0VUX0RBWShzZWxmLCBkKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02NTIsNzEgKzY1Miw3MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld19kYXRlX2V4KGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeURhdGVUaW1lX0RhdGUgKnNlbGY7CisgICAgUHlEYXRlVGltZV9EYXRlICpzZWxmOwogCi0Jc2VsZiA9IChQeURhdGVUaW1lX0RhdGUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKTsKLQlpZiAoc2VsZiAhPSBOVUxMKQotCQlzZXRfZGF0ZV9maWVsZHMoc2VsZiwgeWVhciwgbW9udGgsIGRheSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOworICAgIHNlbGYgPSAoUHlEYXRlVGltZV9EYXRlICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCkKKyAgICAgICAgc2V0X2RhdGVfZmllbGRzKHNlbGYsIHllYXIsIG1vbnRoLCBkYXkpOworICAgIHJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKIH0KIAogI2RlZmluZSBuZXdfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KSBcCi0JbmV3X2RhdGVfZXgoeWVhciwgbW9udGgsIGRheSwgJlB5RGF0ZVRpbWVfRGF0ZVR5cGUpCisgICAgbmV3X2RhdGVfZXgoeWVhciwgbW9udGgsIGRheSwgJlB5RGF0ZVRpbWVfRGF0ZVR5cGUpCiAKIC8qIENyZWF0ZSBhIGRhdGV0aW1lIGluc3RhbmNlIHdpdGggbm8gcmFuZ2UgY2hlY2tpbmcuICovCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3X2RhdGV0aW1lX2V4KGludCB5ZWFyLCBpbnQgbW9udGgsIGludCBkYXksIGludCBob3VyLCBpbnQgbWludXRlLAotCSAgICAgaW50IHNlY29uZCwgaW50IHVzZWNvbmQsIFB5T2JqZWN0ICp0emluZm8sIFB5VHlwZU9iamVjdCAqdHlwZSkKKyAgICAgICAgICAgICBpbnQgc2Vjb25kLCBpbnQgdXNlY29uZCwgUHlPYmplY3QgKnR6aW5mbywgUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGY7Ci0JY2hhciBhd2FyZSA9IHR6aW5mbyAhPSBQeV9Ob25lOworICAgIFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGY7CisgICAgY2hhciBhd2FyZSA9IHR6aW5mbyAhPSBQeV9Ob25lOwogCi0Jc2VsZiA9IChQeURhdGVUaW1lX0RhdGVUaW1lICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCBhd2FyZSkpOwotCWlmIChzZWxmICE9IE5VTEwpIHsKLQkJc2VsZi0+aGFzdHppbmZvID0gYXdhcmU7Ci0JCXNldF9kYXRlX2ZpZWxkcygoUHlEYXRlVGltZV9EYXRlICopc2VsZiwgeWVhciwgbW9udGgsIGRheSk7Ci0JCURBVEVfU0VUX0hPVVIoc2VsZiwgaG91cik7Ci0JCURBVEVfU0VUX01JTlVURShzZWxmLCBtaW51dGUpOwotCQlEQVRFX1NFVF9TRUNPTkQoc2VsZiwgc2Vjb25kKTsKLQkJREFURV9TRVRfTUlDUk9TRUNPTkQoc2VsZiwgdXNlY29uZCk7Ci0JCWlmIChhd2FyZSkgewotCQkJUHlfSU5DUkVGKHR6aW5mbyk7Ci0JCQlzZWxmLT50emluZm8gPSB0emluZm87Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgc2VsZiA9IChQeURhdGVUaW1lX0RhdGVUaW1lICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCBhd2FyZSkpOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+aGFzdHppbmZvID0gYXdhcmU7CisgICAgICAgIHNldF9kYXRlX2ZpZWxkcygoUHlEYXRlVGltZV9EYXRlICopc2VsZiwgeWVhciwgbW9udGgsIGRheSk7CisgICAgICAgIERBVEVfU0VUX0hPVVIoc2VsZiwgaG91cik7CisgICAgICAgIERBVEVfU0VUX01JTlVURShzZWxmLCBtaW51dGUpOworICAgICAgICBEQVRFX1NFVF9TRUNPTkQoc2VsZiwgc2Vjb25kKTsKKyAgICAgICAgREFURV9TRVRfTUlDUk9TRUNPTkQoc2VsZiwgdXNlY29uZCk7CisgICAgICAgIGlmIChhd2FyZSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHR6aW5mbyk7CisgICAgICAgICAgICBzZWxmLT50emluZm8gPSB0emluZm87CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKLSNkZWZpbmUgbmV3X2RhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pCQlcCi0JbmV3X2RhdGV0aW1lX2V4KHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8sCVwKLQkJCSZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSkKKyNkZWZpbmUgbmV3X2RhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pICAgICAgICAgICBcCisgICAgbmV3X2RhdGV0aW1lX2V4KHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8sICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAmUHlEYXRlVGltZV9EYXRlVGltZVR5cGUpCiAKIC8qIENyZWF0ZSBhIHRpbWUgaW5zdGFuY2Ugd2l0aCBubyByYW5nZSBjaGVja2luZy4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdfdGltZV9leChpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCwgaW50IHVzZWNvbmQsCi0JICAgIFB5T2JqZWN0ICp0emluZm8sIFB5VHlwZU9iamVjdCAqdHlwZSkKKyAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8sIFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeURhdGVUaW1lX1RpbWUgKnNlbGY7Ci0JY2hhciBhd2FyZSA9IHR6aW5mbyAhPSBQeV9Ob25lOworICAgIFB5RGF0ZVRpbWVfVGltZSAqc2VsZjsKKyAgICBjaGFyIGF3YXJlID0gdHppbmZvICE9IFB5X05vbmU7CiAKLQlzZWxmID0gKFB5RGF0ZVRpbWVfVGltZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgYXdhcmUpKTsKLQlpZiAoc2VsZiAhPSBOVUxMKSB7Ci0JCXNlbGYtPmhhc3R6aW5mbyA9IGF3YXJlOwotCQlzZWxmLT5oYXNoY29kZSA9IC0xOwotCQlUSU1FX1NFVF9IT1VSKHNlbGYsIGhvdXIpOwotCQlUSU1FX1NFVF9NSU5VVEUoc2VsZiwgbWludXRlKTsKLQkJVElNRV9TRVRfU0VDT05EKHNlbGYsIHNlY29uZCk7Ci0JCVRJTUVfU0VUX01JQ1JPU0VDT05EKHNlbGYsIHVzZWNvbmQpOwotCQlpZiAoYXdhcmUpIHsKLQkJCVB5X0lOQ1JFRih0emluZm8pOwotCQkJc2VsZi0+dHppbmZvID0gdHppbmZvOwotCQl9Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIHNlbGYgPSAoUHlEYXRlVGltZV9UaW1lICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCBhd2FyZSkpOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+aGFzdHppbmZvID0gYXdhcmU7CisgICAgICAgIHNlbGYtPmhhc2hjb2RlID0gLTE7CisgICAgICAgIFRJTUVfU0VUX0hPVVIoc2VsZiwgaG91cik7CisgICAgICAgIFRJTUVfU0VUX01JTlVURShzZWxmLCBtaW51dGUpOworICAgICAgICBUSU1FX1NFVF9TRUNPTkQoc2VsZiwgc2Vjb25kKTsKKyAgICAgICAgVElNRV9TRVRfTUlDUk9TRUNPTkQoc2VsZiwgdXNlY29uZCk7CisgICAgICAgIGlmIChhd2FyZSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHR6aW5mbyk7CisgICAgICAgICAgICBzZWxmLT50emluZm8gPSB0emluZm87CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiB9CiAKLSNkZWZpbmUgbmV3X3RpbWUoaGgsIG1tLCBzcywgdXMsIHR6aW5mbykJCVwKLQluZXdfdGltZV9leChoaCwgbW0sIHNzLCB1cywgdHppbmZvLCAmUHlEYXRlVGltZV9UaW1lVHlwZSkKKyNkZWZpbmUgbmV3X3RpbWUoaGgsIG1tLCBzcywgdXMsIHR6aW5mbykgICAgICAgICAgICAgICAgXAorICAgIG5ld190aW1lX2V4KGhoLCBtbSwgc3MsIHVzLCB0emluZm8sICZQeURhdGVUaW1lX1RpbWVUeXBlKQogCiAvKiBDcmVhdGUgYSB0aW1lZGVsdGEgaW5zdGFuY2UuICBOb3JtYWxpemUgdGhlIG1lbWJlcnMgaWZmIG5vcm1hbGl6ZSBpcwogICogdHJ1ZS4gIFBhc3NpbmcgZmFsc2UgaXMgYSBzcGVlZCBvcHRpbWl6YXRpb24sIGlmIHlvdSBrbm93IGZvciBzdXJlCkBAIC03MjYsMzAgKzcyNiwzMCBAQAogICovCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3X2RlbHRhX2V4KGludCBkYXlzLCBpbnQgc2Vjb25kcywgaW50IG1pY3Jvc2Vjb25kcywgaW50IG5vcm1hbGl6ZSwKLQkgICAgIFB5VHlwZU9iamVjdCAqdHlwZSkKKyAgICAgICAgICAgICBQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlEYXRlVGltZV9EZWx0YSAqc2VsZjsKKyAgICBQeURhdGVUaW1lX0RlbHRhICpzZWxmOwogCi0JaWYgKG5vcm1hbGl6ZSkKLQkJbm9ybWFsaXplX2Rfc191cygmZGF5cywgJnNlY29uZHMsICZtaWNyb3NlY29uZHMpOwotCWFzc2VydCgwIDw9IHNlY29uZHMgJiYgc2Vjb25kcyA8IDI0KjM2MDApOwotCWFzc2VydCgwIDw9IG1pY3Jvc2Vjb25kcyAmJiBtaWNyb3NlY29uZHMgPCAxMDAwMDAwKTsKKyAgICBpZiAobm9ybWFsaXplKQorICAgICAgICBub3JtYWxpemVfZF9zX3VzKCZkYXlzLCAmc2Vjb25kcywgJm1pY3Jvc2Vjb25kcyk7CisgICAgYXNzZXJ0KDAgPD0gc2Vjb25kcyAmJiBzZWNvbmRzIDwgMjQqMzYwMCk7CisgICAgYXNzZXJ0KDAgPD0gbWljcm9zZWNvbmRzICYmIG1pY3Jvc2Vjb25kcyA8IDEwMDAwMDApOwogCi0gCWlmIChjaGVja19kZWx0YV9kYXlfcmFuZ2UoZGF5cykgPCAwKQotIAkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGNoZWNrX2RlbHRhX2RheV9yYW5nZShkYXlzKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZiA9IChQeURhdGVUaW1lX0RlbHRhICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSk7Ci0JaWYgKHNlbGYgIT0gTlVMTCkgewotCQlzZWxmLT5oYXNoY29kZSA9IC0xOwotCQlTRVRfVERfREFZUyhzZWxmLCBkYXlzKTsKLQkJU0VUX1REX1NFQ09ORFMoc2VsZiwgc2Vjb25kcyk7Ci0JCVNFVF9URF9NSUNST1NFQ09ORFMoc2VsZiwgbWljcm9zZWNvbmRzKTsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOworICAgIHNlbGYgPSAoUHlEYXRlVGltZV9EZWx0YSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpOworICAgIGlmIChzZWxmICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+aGFzaGNvZGUgPSAtMTsKKyAgICAgICAgU0VUX1REX0RBWVMoc2VsZiwgZGF5cyk7CisgICAgICAgIFNFVF9URF9TRUNPTkRTKHNlbGYsIHNlY29uZHMpOworICAgICAgICBTRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYsIG1pY3Jvc2Vjb25kcyk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgc2VsZjsKIH0KIAotI2RlZmluZSBuZXdfZGVsdGEoZCwgcywgdXMsIG5vcm1hbGl6ZSkJXAotCW5ld19kZWx0YV9leChkLCBzLCB1cywgbm9ybWFsaXplLCAmUHlEYXRlVGltZV9EZWx0YVR5cGUpCisjZGVmaW5lIG5ld19kZWx0YShkLCBzLCB1cywgbm9ybWFsaXplKSAgXAorICAgIG5ld19kZWx0YV9leChkLCBzLCB1cywgbm9ybWFsaXplLCAmUHlEYXRlVGltZV9EZWx0YVR5cGUpCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogdHppbmZvIGhlbHBlcnMuCkBAIC03NjEsMTMgKzc2MSwxMyBAQAogc3RhdGljIGludAogY2hlY2tfdHppbmZvX3N1YmNsYXNzKFB5T2JqZWN0ICpwKQogewotCWlmIChwID09IFB5X05vbmUgfHwgUHlUWkluZm9fQ2hlY2socCkpCi0JCXJldHVybiAwOwotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgInR6aW5mbyBhcmd1bWVudCBtdXN0IGJlIE5vbmUgb3Igb2YgYSB0emluZm8gc3ViY2xhc3MsICIKLQkJICAgICAibm90IHR5cGUgJyVzJyIsCi0JCSAgICAgUHlfVFlQRShwKS0+dHBfbmFtZSk7Ci0JcmV0dXJuIC0xOworICAgIGlmIChwID09IFB5X05vbmUgfHwgUHlUWkluZm9fQ2hlY2socCkpCisgICAgICAgIHJldHVybiAwOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJ0emluZm8gYXJndW1lbnQgbXVzdCBiZSBOb25lIG9yIG9mIGEgdHppbmZvIHN1YmNsYXNzLCAiCisgICAgICAgICAgICAgICAgICJub3QgdHlwZSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRShwKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBSZXR1cm4gdHppbmZvLm1ldGhuYW1lKHR6aW5mb2FyZyksIHdpdGhvdXQgYW55IGNoZWNraW5nIG9mIHJlc3VsdHMuCkBAIC03NzYsMTcgKzc3NiwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfdHppbmZvX21ldGhvZChQeU9iamVjdCAqdHppbmZvLCBjaGFyICptZXRobmFtZSwgUHlPYmplY3QgKnR6aW5mb2FyZykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlhc3NlcnQodHppbmZvICYmIG1ldGhuYW1lICYmIHR6aW5mb2FyZyk7Ci0JYXNzZXJ0KGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pID49IDApOwotCWlmICh0emluZm8gPT0gUHlfTm9uZSkgewotCQlyZXN1bHQgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQl9Ci0JZWxzZQotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR6aW5mbywgbWV0aG5hbWUsICJPIiwgdHppbmZvYXJnKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGFzc2VydCh0emluZm8gJiYgbWV0aG5hbWUgJiYgdHppbmZvYXJnKTsKKyAgICBhc3NlcnQoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPj0gMCk7CisgICAgaWYgKHR6aW5mbyA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJlc3VsdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHppbmZvLCBtZXRobmFtZSwgIk8iLCB0emluZm9hcmcpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIElmIHNlbGYgaGFzIGEgdHppbmZvIG1lbWJlciwgcmV0dXJuIGEgQk9SUk9XRUQgcmVmZXJlbmNlIHRvIGl0LiAgRWxzZQpAQCAtNzk2LDE0ICs3OTYsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfdHppbmZvX21lbWJlcihQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdHppbmZvID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdHppbmZvID0gTlVMTDsKIAotCWlmIChQeURhdGVUaW1lX0NoZWNrKHNlbGYpICYmIEhBU1RaSU5GTyhzZWxmKSkKLQkJdHppbmZvID0gKChQeURhdGVUaW1lX0RhdGVUaW1lICopc2VsZiktPnR6aW5mbzsKLQllbHNlIGlmIChQeVRpbWVfQ2hlY2soc2VsZikgJiYgSEFTVFpJTkZPKHNlbGYpKQotCQl0emluZm8gPSAoKFB5RGF0ZVRpbWVfVGltZSAqKXNlbGYpLT50emluZm87CisgICAgaWYgKFB5RGF0ZVRpbWVfQ2hlY2soc2VsZikgJiYgSEFTVFpJTkZPKHNlbGYpKQorICAgICAgICB0emluZm8gPSAoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilzZWxmKS0+dHppbmZvOworICAgIGVsc2UgaWYgKFB5VGltZV9DaGVjayhzZWxmKSAmJiBIQVNUWklORk8oc2VsZikpCisgICAgICAgIHR6aW5mbyA9ICgoUHlEYXRlVGltZV9UaW1lICopc2VsZiktPnR6aW5mbzsKIAotCXJldHVybiB0emluZm87CisgICAgcmV0dXJuIHR6aW5mbzsKIH0KIAogLyogQ2FsbCBnZXRhdHRyKHR6aW5mbywgbmFtZSkodHppbmZvYXJnKSwgYW5kIGV4dHJhY3QgYW4gaW50IGZyb20gdGhlCkBAIC04MTYsNTkgKzgxNiw1OSBAQAogICovCiBzdGF0aWMgaW50CiBjYWxsX3V0Y190emluZm9fbWV0aG9kKFB5T2JqZWN0ICp0emluZm8sIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp0emluZm9hcmcsCi0JCSAgICAgICBpbnQgKm5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqbm9uZSkKIHsKLQlQeU9iamVjdCAqdTsKLQlpbnQgcmVzdWx0ID0gLTE7CisgICAgUHlPYmplY3QgKnU7CisgICAgaW50IHJlc3VsdCA9IC0xOwogCi0JYXNzZXJ0KHR6aW5mbyAhPSBOVUxMKTsKLQlhc3NlcnQoUHlUWkluZm9fQ2hlY2sodHppbmZvKSk7Ci0JYXNzZXJ0KHR6aW5mb2FyZyAhPSBOVUxMKTsKKyAgICBhc3NlcnQodHppbmZvICE9IE5VTEwpOworICAgIGFzc2VydChQeVRaSW5mb19DaGVjayh0emluZm8pKTsKKyAgICBhc3NlcnQodHppbmZvYXJnICE9IE5VTEwpOwogCi0JKm5vbmUgPSAwOwotCXUgPSBjYWxsX3R6aW5mb19tZXRob2QodHppbmZvLCBuYW1lLCB0emluZm9hcmcpOwotCWlmICh1ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICAqbm9uZSA9IDA7CisgICAgdSA9IGNhbGxfdHppbmZvX21ldGhvZCh0emluZm8sIG5hbWUsIHR6aW5mb2FyZyk7CisgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JZWxzZSBpZiAodSA9PSBQeV9Ob25lKSB7Ci0JCXJlc3VsdCA9IDA7Ci0JCSpub25lID0gMTsKLQl9Ci0JZWxzZSBpZiAoUHlEZWx0YV9DaGVjayh1KSkgewotCQljb25zdCBpbnQgZGF5cyA9IEdFVF9URF9EQVlTKHUpOwotCQlpZiAoZGF5cyA8IC0xIHx8IGRheXMgPiAwKQotCQkJcmVzdWx0ID0gMjQqNjA7CS8qIHRyaWdnZXIgVmFsdWVFcnJvciBiZWxvdyAqLwotCQllbHNlIHsKLQkJCS8qIG5leHQgbGluZSBjYW4ndCBvdmVyZmxvdyBiZWNhdXNlIHdlIGtub3cgZGF5cwotCQkJICogaXMgLTEgb3IgMCBub3cKLQkJCSAqLwotCQkJaW50IHNzID0gZGF5cyAqIDI0ICogMzYwMCArIEdFVF9URF9TRUNPTkRTKHUpOwotCQkJcmVzdWx0ID0gZGl2bW9kKHNzLCA2MCwgJnNzKTsKLQkJCWlmIChzcyB8fCBHRVRfVERfTUlDUk9TRUNPTkRTKHUpKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSAgICAgInR6aW5mby4lcygpIG11c3QgcmV0dXJuIGEgIgotCQkJCQkgICAgICJ3aG9sZSBudW1iZXIgb2YgbWludXRlcyIsCi0JCQkJCSAgICAgbmFtZSk7Ci0JCQkJcmVzdWx0ID0gLTE7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBOb25lIG9yICIKLQkJCSAgICAgInRpbWVkZWx0YSwgbm90ICclcyciLAotCQkJICAgICBuYW1lLCBQeV9UWVBFKHUpLT50cF9uYW1lKTsKLQl9CisgICAgZWxzZSBpZiAodSA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICpub25lID0gMTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlEZWx0YV9DaGVjayh1KSkgeworICAgICAgICBjb25zdCBpbnQgZGF5cyA9IEdFVF9URF9EQVlTKHUpOworICAgICAgICBpZiAoZGF5cyA8IC0xIHx8IGRheXMgPiAwKQorICAgICAgICAgICAgcmVzdWx0ID0gMjQqNjA7ICAgICAgICAgICAgIC8qIHRyaWdnZXIgVmFsdWVFcnJvciBiZWxvdyAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5leHQgbGluZSBjYW4ndCBvdmVyZmxvdyBiZWNhdXNlIHdlIGtub3cgZGF5cworICAgICAgICAgICAgICogaXMgLTEgb3IgMCBub3cKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaW50IHNzID0gZGF5cyAqIDI0ICogMzYwMCArIEdFVF9URF9TRUNPTkRTKHUpOworICAgICAgICAgICAgcmVzdWx0ID0gZGl2bW9kKHNzLCA2MCwgJnNzKTsKKyAgICAgICAgICAgIGlmIChzcyB8fCBHRVRfVERfTUlDUk9TRUNPTkRTKHUpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndob2xlIG51bWJlciBvZiBtaW51dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidHppbmZvLiVzKCkgbXVzdCByZXR1cm4gTm9uZSBvciAiCisgICAgICAgICAgICAgICAgICAgICAidGltZWRlbHRhLCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBuYW1lLCBQeV9UWVBFKHUpLT50cF9uYW1lKTsKKyAgICB9CiAKLQlQeV9ERUNSRUYodSk7Ci0JaWYgKHJlc3VsdCA8IC0xNDM5IHx8IHJlc3VsdCA+IDE0MzkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJ0emluZm8uJXMoKSByZXR1cm5lZCAlZDsgbXVzdCBiZSBpbiAiCi0JCQkgICAgICItMTQzOSAuLiAxNDM5IiwKLQkJCSAgICAgbmFtZSwgcmVzdWx0KTsKLQkJcmVzdWx0ID0gLTE7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlfREVDUkVGKHUpOworICAgIGlmIChyZXN1bHQgPCAtMTQzOSB8fCByZXN1bHQgPiAxNDM5KSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInR6aW5mby4lcygpIHJldHVybmVkICVkOyBtdXN0IGJlIGluICIKKyAgICAgICAgICAgICAgICAgICAgICItMTQzOSAuLiAxNDM5IiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBDYWxsIHR6aW5mby51dGNvZmZzZXQodHppbmZvYXJnKSwgYW5kIGV4dHJhY3QgYW4gaW50ZWdlciBmcm9tIHRoZQpAQCAtODgyLDM0ICs4ODIsMzQgQEAKIHN0YXRpYyBpbnQKIGNhbGxfdXRjb2Zmc2V0KFB5T2JqZWN0ICp0emluZm8sIFB5T2JqZWN0ICp0emluZm9hcmcsIGludCAqbm9uZSkKIHsKLQlyZXR1cm4gY2FsbF91dGNfdHppbmZvX21ldGhvZCh0emluZm8sICJ1dGNvZmZzZXQiLCB0emluZm9hcmcsIG5vbmUpOworICAgIHJldHVybiBjYWxsX3V0Y190emluZm9fbWV0aG9kKHR6aW5mbywgInV0Y29mZnNldCIsIHR6aW5mb2FyZywgbm9uZSk7CiB9CiAKIC8qIENhbGwgdHppbmZvLm5hbWUodHppbmZvYXJnKSwgYW5kIHJldHVybiB0aGUgb2Zmc2V0IGFzIGEgdGltZWRlbHRhIG9yIE5vbmUuCiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBvZmZzZXRfYXNfdGltZWRlbHRhKFB5T2JqZWN0ICp0emluZm8sIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp0emluZm9hcmcpIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlhc3NlcnQodHppbmZvICYmIG5hbWUgJiYgdHppbmZvYXJnKTsKLQlpZiAodHppbmZvID09IFB5X05vbmUpIHsKLQkJcmVzdWx0ID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JfQotCWVsc2UgewotCQlpbnQgbm9uZTsKLQkJaW50IG9mZnNldCA9IGNhbGxfdXRjX3R6aW5mb19tZXRob2QodHppbmZvLCBuYW1lLCB0emluZm9hcmcsCi0JCQkJCQkgICAgJm5vbmUpOwotCQlpZiAob2Zmc2V0IDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChub25lKSB7Ci0JCQlyZXN1bHQgPSBQeV9Ob25lOwotCQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCX0KLQkJZWxzZQotCQkJcmVzdWx0ID0gbmV3X2RlbHRhKDAsIG9mZnNldCAqIDYwLCAwLCAxKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBhc3NlcnQodHppbmZvICYmIG5hbWUgJiYgdHppbmZvYXJnKTsKKyAgICBpZiAodHppbmZvID09IFB5X05vbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnQgbm9uZTsKKyAgICAgICAgaW50IG9mZnNldCA9IGNhbGxfdXRjX3R6aW5mb19tZXRob2QodHppbmZvLCBuYW1lLCB0emluZm9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub25lKTsKKyAgICAgICAgaWYgKG9mZnNldCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAobm9uZSkgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ld19kZWx0YSgwLCBvZmZzZXQgKiA2MCwgMCwgMSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIENhbGwgdHppbmZvLmRzdCh0emluZm9hcmcpLCBhbmQgZXh0cmFjdCBhbiBpbnRlZ2VyIGZyb20gdGhlCkBAIC05MjMsNyArOTIzLDcgQEAKIHN0YXRpYyBpbnQKIGNhbGxfZHN0KFB5T2JqZWN0ICp0emluZm8sIFB5T2JqZWN0ICp0emluZm9hcmcsIGludCAqbm9uZSkKIHsKLQlyZXR1cm4gY2FsbF91dGNfdHppbmZvX21ldGhvZCh0emluZm8sICJkc3QiLCB0emluZm9hcmcsIG5vbmUpOworICAgIHJldHVybiBjYWxsX3V0Y190emluZm9fbWV0aG9kKHR6aW5mbywgImRzdCIsIHR6aW5mb2FyZywgbm9uZSk7CiB9CiAKIC8qIENhbGwgdHppbmZvLnR6bmFtZSh0emluZm9hcmcpLCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuICB0emluZm8gbXVzdCBiZQpAQCAtOTM0LDQ4ICs5MzQsNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX3R6bmFtZShQeU9iamVjdCAqdHppbmZvLCBQeU9iamVjdCAqdHppbmZvYXJnKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWFzc2VydCh0emluZm8gIT0gTlVMTCk7Ci0JYXNzZXJ0KGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pID49IDApOwotCWFzc2VydCh0emluZm9hcmcgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHR6aW5mbyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPj0gMCk7CisgICAgYXNzZXJ0KHR6aW5mb2FyZyAhPSBOVUxMKTsKIAotCWlmICh0emluZm8gPT0gUHlfTm9uZSkgewotCQlyZXN1bHQgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQl9Ci0JZWxzZQotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR6aW5mbywgInR6bmFtZSIsICJPIiwgdHppbmZvYXJnKTsKKyAgICBpZiAodHppbmZvID09IFB5X05vbmUpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0emluZm8sICJ0em5hbWUiLCAiTyIsIHR6aW5mb2FyZyk7CiAKLQlpZiAocmVzdWx0ICE9IE5VTEwgJiYgcmVzdWx0ICE9IFB5X05vbmUgJiYgISBQeVN0cmluZ19DaGVjayhyZXN1bHQpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJ0emluZm8udHpuYW1lKCkgbXVzdCAiCi0JCQkgICAgICJyZXR1cm4gTm9uZSBvciBhIHN0cmluZywgbm90ICclcyciLAotCQkJICAgICBQeV9UWVBFKHJlc3VsdCktPnRwX25hbWUpOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgcmVzdWx0ICE9IFB5X05vbmUgJiYgISBQeVN0cmluZ19DaGVjayhyZXN1bHQpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJ0emluZm8udHpuYW1lKCkgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAicmV0dXJuIE5vbmUgb3IgYSBzdHJpbmcsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocmVzdWx0KS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiB0eXBlZGVmIGVudW0gewotCSAgICAgIC8qIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBzZXQ7IHRoZSBjYWxsZXIgc2hvdWxkIHBhc3MgaXQgb24gKi8KLQkgICAgICBPRkZTRVRfRVJST1IsCisgICAgICAgICAgICAgIC8qIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBzZXQ7IHRoZSBjYWxsZXIgc2hvdWxkIHBhc3MgaXQgb24gKi8KKyAgICAgICAgICBPRkZTRVRfRVJST1IsCiAKLQkgICAgICAvKiB0eXBlIGlzbid0IGRhdGUsIGRhdGV0aW1lLCBvciB0aW1lIHN1YmNsYXNzICovCi0JICAgICAgT0ZGU0VUX1VOS05PV04sCisgICAgICAgICAgLyogdHlwZSBpc24ndCBkYXRlLCBkYXRldGltZSwgb3IgdGltZSBzdWJjbGFzcyAqLworICAgICAgICAgIE9GRlNFVF9VTktOT1dOLAogCi0JICAgICAgLyogZGF0ZSwKLQkgICAgICAgKiBkYXRldGltZSB3aXRoICFoYXN0emluZm8KLQkgICAgICAgKiBkYXRldGltZSB3aXRoIE5vbmUgdHppbmZvLAotCSAgICAgICAqIGRhdGV0aW1lIHdoZXJlIHV0Y29mZnNldCgpIHJldHVybnMgTm9uZQotCSAgICAgICAqIHRpbWUgd2l0aCAhaGFzdHppbmZvCi0JICAgICAgICogdGltZSB3aXRoIE5vbmUgdHppbmZvLAotCSAgICAgICAqIHRpbWUgd2hlcmUgdXRjb2Zmc2V0KCkgcmV0dXJucyBOb25lCi0JICAgICAgICovCi0JICAgICAgT0ZGU0VUX05BSVZFLAorICAgICAgICAgIC8qIGRhdGUsCisgICAgICAgICAgICogZGF0ZXRpbWUgd2l0aCAhaGFzdHppbmZvCisgICAgICAgICAgICogZGF0ZXRpbWUgd2l0aCBOb25lIHR6aW5mbywKKyAgICAgICAgICAgKiBkYXRldGltZSB3aGVyZSB1dGNvZmZzZXQoKSByZXR1cm5zIE5vbmUKKyAgICAgICAgICAgKiB0aW1lIHdpdGggIWhhc3R6aW5mbworICAgICAgICAgICAqIHRpbWUgd2l0aCBOb25lIHR6aW5mbywKKyAgICAgICAgICAgKiB0aW1lIHdoZXJlIHV0Y29mZnNldCgpIHJldHVybnMgTm9uZQorICAgICAgICAgICAqLworICAgICAgICAgIE9GRlNFVF9OQUlWRSwKIAotCSAgICAgIC8qIHRpbWUgb3IgZGF0ZXRpbWUgd2hlcmUgdXRjb2Zmc2V0KCkgZG9lc24ndCByZXR1cm4gTm9uZSAqLwotCSAgICAgIE9GRlNFVF9BV0FSRQorICAgICAgICAgIC8qIHRpbWUgb3IgZGF0ZXRpbWUgd2hlcmUgdXRjb2Zmc2V0KCkgZG9lc24ndCByZXR1cm4gTm9uZSAqLworICAgICAgICAgIE9GRlNFVF9BV0FSRQogfSBuYWl2ZXR5OwogCiAvKiBDbGFzc2lmeSBhbiBvYmplY3QgYXMgdG8gd2hldGhlciBpdCdzIG5haXZlIG9yIG9mZnNldC1hd2FyZS4gIFNlZQpAQCAtOTg3LDIzICs5ODcsMjMgQEAKIHN0YXRpYyBuYWl2ZXR5CiBjbGFzc2lmeV91dGNvZmZzZXQoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqdHppbmZvYXJnLCBpbnQgKm9mZnNldCkKIHsKLQlpbnQgbm9uZTsKLQlQeU9iamVjdCAqdHppbmZvOworICAgIGludCBub25lOworICAgIFB5T2JqZWN0ICp0emluZm87CiAKLQlhc3NlcnQodHppbmZvYXJnICE9IE5VTEwpOwotCSpvZmZzZXQgPSAwOwotCXR6aW5mbyA9IGdldF90emluZm9fbWVtYmVyKG9wKTsJLyogTlVMTCBtZWFucyBubyB0emluZm8sIG5vdCBlcnJvciAqLwotCWlmICh0emluZm8gPT0gUHlfTm9uZSkKLQkJcmV0dXJuIE9GRlNFVF9OQUlWRTsKLQlpZiAodHppbmZvID09IE5VTEwpIHsKLQkJLyogbm90ZSB0aGF0IGEgZGF0ZXRpbWUgcGFzc2VzIHRoZSBQeURhdGVfQ2hlY2sgdGVzdCAqLwotCQlyZXR1cm4gKFB5VGltZV9DaGVjayhvcCkgfHwgUHlEYXRlX0NoZWNrKG9wKSkgPwotCQkgICAgICAgT0ZGU0VUX05BSVZFIDogT0ZGU0VUX1VOS05PV047Ci0JfQotCSpvZmZzZXQgPSBjYWxsX3V0Y29mZnNldCh0emluZm8sIHR6aW5mb2FyZywgJm5vbmUpOwotCWlmICgqb2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBPRkZTRVRfRVJST1I7Ci0JcmV0dXJuIG5vbmUgPyBPRkZTRVRfTkFJVkUgOiBPRkZTRVRfQVdBUkU7CisgICAgYXNzZXJ0KHR6aW5mb2FyZyAhPSBOVUxMKTsKKyAgICAqb2Zmc2V0ID0gMDsKKyAgICB0emluZm8gPSBnZXRfdHppbmZvX21lbWJlcihvcCk7ICAgICAvKiBOVUxMIG1lYW5zIG5vIHR6aW5mbywgbm90IGVycm9yICovCisgICAgaWYgKHR6aW5mbyA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gT0ZGU0VUX05BSVZFOworICAgIGlmICh0emluZm8gPT0gTlVMTCkgeworICAgICAgICAvKiBub3RlIHRoYXQgYSBkYXRldGltZSBwYXNzZXMgdGhlIFB5RGF0ZV9DaGVjayB0ZXN0ICovCisgICAgICAgIHJldHVybiAoUHlUaW1lX0NoZWNrKG9wKSB8fCBQeURhdGVfQ2hlY2sob3ApKSA/CisgICAgICAgICAgICAgICBPRkZTRVRfTkFJVkUgOiBPRkZTRVRfVU5LTk9XTjsKKyAgICB9CisgICAgKm9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHR6aW5mbywgdHppbmZvYXJnLCAmbm9uZSk7CisgICAgaWYgKCpvZmZzZXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE9GRlNFVF9FUlJPUjsKKyAgICByZXR1cm4gbm9uZSA/IE9GRlNFVF9OQUlWRSA6IE9GRlNFVF9BV0FSRTsKIH0KIAogLyogQ2xhc3NpZnkgdHdvIG9iamVjdHMgYXMgdG8gd2hldGhlciB0aGV5J3JlIG5haXZlIG9yIG9mZnNldC1hd2FyZS4KQEAgLTEwMTcsMjMgKzEwMTcsMjMgQEAKICAqLwogc3RhdGljIGludAogY2xhc3NpZnlfdHdvX3V0Y29mZnNldHMoUHlPYmplY3QgKm8xLCBpbnQgKm9mZnNldDEsIG5haXZldHkgKm4xLAotCQkJUHlPYmplY3QgKnR6aW5mb2FyZzEsCi0JCQlQeU9iamVjdCAqbzIsIGludCAqb2Zmc2V0MiwgbmFpdmV0eSAqbjIsCi0JCQlQeU9iamVjdCAqdHppbmZvYXJnMikKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm9hcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yLCBpbnQgKm9mZnNldDIsIG5haXZldHkgKm4yLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mb2FyZzIpCiB7Ci0JaWYgKGdldF90emluZm9fbWVtYmVyKG8xKSA9PSBnZXRfdHppbmZvX21lbWJlcihvMikpIHsKLQkJKm9mZnNldDEgPSAqb2Zmc2V0MiA9IDA7Ci0JCSpuMSA9ICpuMiA9IE9GRlNFVF9OQUlWRTsKLQl9Ci0JZWxzZSB7Ci0JCSpuMSA9IGNsYXNzaWZ5X3V0Y29mZnNldChvMSwgdHppbmZvYXJnMSwgb2Zmc2V0MSk7Ci0JCWlmICgqbjEgPT0gT0ZGU0VUX0VSUk9SKQotCQkJcmV0dXJuIC0xOwotCQkqbjIgPSBjbGFzc2lmeV91dGNvZmZzZXQobzIsIHR6aW5mb2FyZzIsIG9mZnNldDIpOwotCQlpZiAoKm4yID09IE9GRlNFVF9FUlJPUikKLQkJCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgaWYgKGdldF90emluZm9fbWVtYmVyKG8xKSA9PSBnZXRfdHppbmZvX21lbWJlcihvMikpIHsKKyAgICAgICAgKm9mZnNldDEgPSAqb2Zmc2V0MiA9IDA7CisgICAgICAgICpuMSA9ICpuMiA9IE9GRlNFVF9OQUlWRTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpuMSA9IGNsYXNzaWZ5X3V0Y29mZnNldChvMSwgdHppbmZvYXJnMSwgb2Zmc2V0MSk7CisgICAgICAgIGlmICgqbjEgPT0gT0ZGU0VUX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqbjIgPSBjbGFzc2lmeV91dGNvZmZzZXQobzIsIHR6aW5mb2FyZzIsIG9mZnNldDIpOworICAgICAgICBpZiAoKm4yID09IE9GRlNFVF9FUlJPUikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIHJlcHIgaXMgbGlrZSAic29tZWNsYXNzKGFyZzEsIGFyZzIpIi4gIElmIHR6aW5mbyBpc24ndCBOb25lLApAQCAtMTA0NCwzMCArMTA0NCwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFwcGVuZF9rZXl3b3JkX3R6aW5mbyhQeU9iamVjdCAqcmVwciwgUHlPYmplY3QgKnR6aW5mbykKIHsKLQlQeU9iamVjdCAqdGVtcDsKKyAgICBQeU9iamVjdCAqdGVtcDsKIAotCWFzc2VydChQeVN0cmluZ19DaGVjayhyZXByKSk7Ci0JYXNzZXJ0KHR6aW5mbyk7Ci0JaWYgKHR6aW5mbyA9PSBQeV9Ob25lKQotCQlyZXR1cm4gcmVwcjsKLQkvKiBHZXQgcmlkIG9mIHRoZSB0cmFpbGluZyAnKScuICovCi0JYXNzZXJ0KFB5U3RyaW5nX0FzU3RyaW5nKHJlcHIpW1B5U3RyaW5nX1NpemUocmVwciktMV0gPT0gJyknKTsKLQl0ZW1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoUHlTdHJpbmdfQXNTdHJpbmcocmVwciksCi0JCQkJCSAgUHlTdHJpbmdfU2l6ZShyZXByKSAtIDEpOwotCVB5X0RFQ1JFRihyZXByKTsKLQlpZiAodGVtcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXByID0gdGVtcDsKKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2socmVwcikpOworICAgIGFzc2VydCh0emluZm8pOworICAgIGlmICh0emluZm8gPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIHJlcHI7CisgICAgLyogR2V0IHJpZCBvZiB0aGUgdHJhaWxpbmcgJyknLiAqLworICAgIGFzc2VydChQeVN0cmluZ19Bc1N0cmluZyhyZXByKVtQeVN0cmluZ19TaXplKHJlcHIpLTFdID09ICcpJyk7CisgICAgdGVtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKFB5U3RyaW5nX0FzU3RyaW5nKHJlcHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19TaXplKHJlcHIpIC0gMSk7CisgICAgUHlfREVDUkVGKHJlcHIpOworICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcHIgPSB0ZW1wOwogCi0JLyogQXBwZW5kICIsIHR6aW5mbz0iLiAqLwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVwciwgUHlTdHJpbmdfRnJvbVN0cmluZygiLCB0emluZm89IikpOworICAgIC8qIEFwcGVuZCAiLCB0emluZm89Ii4gKi8KKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlcHIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgdHppbmZvPSIpKTsKIAotCS8qIEFwcGVuZCByZXByKHR6aW5mbykuICovCi0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXByLCBQeU9iamVjdF9SZXByKHR6aW5mbykpOworICAgIC8qIEFwcGVuZCByZXByKHR6aW5mbykuICovCisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXByLCBQeU9iamVjdF9SZXByKHR6aW5mbykpOwogCi0JLyogQWRkIGEgY2xvc2luZyBwYXJlbi4gKi8KLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlcHIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIikiKSk7Ci0JcmV0dXJuIHJlcHI7CisgICAgLyogQWRkIGEgY2xvc2luZyBwYXJlbi4gKi8KKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlcHIsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIikiKSk7CisgICAgcmV0dXJuIHJlcHI7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTA3NywyMiArMTA3NywyMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1hdF9jdGltZShQeURhdGVUaW1lX0RhdGUgKmRhdGUsIGludCBob3VycywgaW50IG1pbnV0ZXMsIGludCBzZWNvbmRzKQogewotCXN0YXRpYyBjb25zdCBjaGFyICpEYXlOYW1lc1tdID0gewotCQkiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiLCAiU3VuIgotCX07Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKk1vbnRoTmFtZXNbXSA9IHsKLQkJIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKLQkJIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgotCX07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKkRheU5hbWVzW10gPSB7CisgICAgICAgICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqTW9udGhOYW1lc1tdID0geworICAgICAgICAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAorICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCisgICAgfTsKIAotCWNoYXIgYnVmZmVyWzEyOF07Ci0JaW50IHdkYXkgPSB3ZWVrZGF5KEdFVF9ZRUFSKGRhdGUpLCBHRVRfTU9OVEgoZGF0ZSksIEdFVF9EQVkoZGF0ZSkpOworICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgaW50IHdkYXkgPSB3ZWVrZGF5KEdFVF9ZRUFSKGRhdGUpLCBHRVRfTU9OVEgoZGF0ZSksIEdFVF9EQVkoZGF0ZSkpOwogCi0JUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMgJXMgJTJkICUwMmQ6JTAyZDolMDJkICUwNGQiLAotCQkgICAgICBEYXlOYW1lc1t3ZGF5XSwgTW9udGhOYW1lc1tHRVRfTU9OVEgoZGF0ZSkgLSAxXSwKLQkJICAgICAgR0VUX0RBWShkYXRlKSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsCi0JCSAgICAgIEdFVF9ZRUFSKGRhdGUpKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOworICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVzICVzICUyZCAlMDJkOiUwMmQ6JTAyZCAlMDRkIiwKKyAgICAgICAgICAgICAgICAgIERheU5hbWVzW3dkYXldLCBNb250aE5hbWVzW0dFVF9NT05USChkYXRlKSAtIDFdLAorICAgICAgICAgICAgICAgICAgR0VUX0RBWShkYXRlKSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICBHRVRfWUVBUihkYXRlKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKIH0KIAogLyogQWRkIGFuIGhvdXJzICYgbWludXRlcyBVVEMgb2Zmc2V0IHN0cmluZyB0byBidWYuICBidWYgaGFzIG5vIG1vcmUgdGhhbgpAQCAtMTEwNyw0NSArMTEwNyw0NSBAQAogICovCiBzdGF0aWMgaW50CiBmb3JtYXRfdXRjb2Zmc2V0KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgY29uc3QgY2hhciAqc2VwLAotCQlQeU9iamVjdCAqdHppbmZvLCBQeU9iamVjdCAqdHppbmZvYXJnKQorICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8sIFB5T2JqZWN0ICp0emluZm9hcmcpCiB7Ci0JaW50IG9mZnNldDsKLQlpbnQgaG91cnM7Ci0JaW50IG1pbnV0ZXM7Ci0JY2hhciBzaWduOwotCWludCBub25lOworICAgIGludCBvZmZzZXQ7CisgICAgaW50IGhvdXJzOworICAgIGludCBtaW51dGVzOworICAgIGNoYXIgc2lnbjsKKyAgICBpbnQgbm9uZTsKIAotCWFzc2VydChidWZsZW4gPj0gMSk7CisgICAgYXNzZXJ0KGJ1ZmxlbiA+PSAxKTsKIAotCW9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHR6aW5mbywgdHppbmZvYXJnLCAmbm9uZSk7Ci0JaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKG5vbmUpIHsKLQkJKmJ1ZiA9ICdcMCc7Ci0JCXJldHVybiAwOwotCX0KLQlzaWduID0gJysnOwotCWlmIChvZmZzZXQgPCAwKSB7Ci0JCXNpZ24gPSAnLSc7Ci0JCW9mZnNldCA9IC0gb2Zmc2V0OwotCX0KLQlob3VycyA9IGRpdm1vZChvZmZzZXQsIDYwLCAmbWludXRlcyk7Ci0JUHlPU19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVjJTAyZCVzJTAyZCIsIHNpZ24sIGhvdXJzLCBzZXAsIG1pbnV0ZXMpOwotCXJldHVybiAwOworICAgIG9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHR6aW5mbywgdHppbmZvYXJnLCAmbm9uZSk7CisgICAgaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKG5vbmUpIHsKKyAgICAgICAgKmJ1ZiA9ICdcMCc7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzaWduID0gJysnOworICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgIHNpZ24gPSAnLSc7CisgICAgICAgIG9mZnNldCA9IC0gb2Zmc2V0OworICAgIH0KKyAgICBob3VycyA9IGRpdm1vZChvZmZzZXQsIDYwLCAmbWludXRlcyk7CisgICAgUHlPU19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVjJTAyZCVzJTAyZCIsIHNpZ24sIGhvdXJzLCBzZXAsIG1pbnV0ZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWFrZV9mcmVwbGFjZW1lbnQoUHlPYmplY3QgKm9iamVjdCkKIHsKLQljaGFyIGZyZXBsYWNlbWVudFs2NF07Ci0JaWYgKFB5VGltZV9DaGVjayhvYmplY3QpKQotCSAgICBzcHJpbnRmKGZyZXBsYWNlbWVudCwgIiUwNmQiLCBUSU1FX0dFVF9NSUNST1NFQ09ORChvYmplY3QpKTsKLQllbHNlIGlmIChQeURhdGVUaW1lX0NoZWNrKG9iamVjdCkpCi0JICAgIHNwcmludGYoZnJlcGxhY2VtZW50LCAiJTA2ZCIsIERBVEVfR0VUX01JQ1JPU0VDT05EKG9iamVjdCkpOwotCWVsc2UKLQkgICAgc3ByaW50ZihmcmVwbGFjZW1lbnQsICIlMDZkIiwgMCk7CisgICAgY2hhciBmcmVwbGFjZW1lbnRbNjRdOworICAgIGlmIChQeVRpbWVfQ2hlY2sob2JqZWN0KSkKKyAgICAgICAgc3ByaW50ZihmcmVwbGFjZW1lbnQsICIlMDZkIiwgVElNRV9HRVRfTUlDUk9TRUNPTkQob2JqZWN0KSk7CisgICAgZWxzZSBpZiAoUHlEYXRlVGltZV9DaGVjayhvYmplY3QpKQorICAgICAgICBzcHJpbnRmKGZyZXBsYWNlbWVudCwgIiUwNmQiLCBEQVRFX0dFVF9NSUNST1NFQ09ORChvYmplY3QpKTsKKyAgICBlbHNlCisgICAgICAgIHNwcmludGYoZnJlcGxhY2VtZW50LCAiJTA2ZCIsIDApOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZyZXBsYWNlbWVudCwgc3RybGVuKGZyZXBsYWNlbWVudCkpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShmcmVwbGFjZW1lbnQsIHN0cmxlbihmcmVwbGFjZW1lbnQpKTsKIH0KIAogLyogSSBzdXJlIGRvbid0IHdhbnQgdG8gcmVwcm9kdWNlIHRoZSBzdHJmdGltZSBjb2RlIGZyb20gdGhlIHRpbWUgbW9kdWxlLApAQCAtMTE1NywyMzEgKzExNTcsMjMxIEBACiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3N0cmZ0aW1lKFB5T2JqZWN0ICpvYmplY3QsIGNvbnN0IGNoYXIgKmZvcm1hdCwgc2l6ZV90IGZvcm1hdF9sZW4sCi0JCVB5T2JqZWN0ICp0aW1ldHVwbGUsIFB5T2JqZWN0ICp0emluZm9hcmcpCisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnRpbWV0dXBsZSwgUHlPYmplY3QgKnR6aW5mb2FyZykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsJLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOyAgICAgICAgICAgIC8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KIAotCVB5T2JqZWN0ICp6cmVwbGFjZW1lbnQgPSBOVUxMOwkvKiBweSBzdHJpbmcsIHJlcGxhY2VtZW50IGZvciAleiAqLwotCVB5T2JqZWN0ICpacmVwbGFjZW1lbnQgPSBOVUxMOwkvKiBweSBzdHJpbmcsIHJlcGxhY2VtZW50IGZvciAlWiAqLwotCVB5T2JqZWN0ICpmcmVwbGFjZW1lbnQgPSBOVUxMOwkvKiBweSBzdHJpbmcsIHJlcGxhY2VtZW50IGZvciAlZiAqLworICAgIFB5T2JqZWN0ICp6cmVwbGFjZW1lbnQgPSBOVUxMOyAgICAgIC8qIHB5IHN0cmluZywgcmVwbGFjZW1lbnQgZm9yICV6ICovCisgICAgUHlPYmplY3QgKlpyZXBsYWNlbWVudCA9IE5VTEw7ICAgICAgLyogcHkgc3RyaW5nLCByZXBsYWNlbWVudCBmb3IgJVogKi8KKyAgICBQeU9iamVjdCAqZnJlcGxhY2VtZW50ID0gTlVMTDsgICAgICAvKiBweSBzdHJpbmcsIHJlcGxhY2VtZW50IGZvciAlZiAqLwogCi0JY29uc3QgY2hhciAqcGluOwkvKiBwb2ludGVyIHRvIG5leHQgY2hhciBpbiBpbnB1dCBmb3JtYXQgKi8KLQljaGFyIGNoOwkJLyogbmV4dCBjaGFyIGluIGlucHV0IGZvcm1hdCAqLworICAgIGNvbnN0IGNoYXIgKnBpbjsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIG5leHQgY2hhciBpbiBpbnB1dCBmb3JtYXQgKi8KKyAgICBjaGFyIGNoOyAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBjaGFyIGluIGlucHV0IGZvcm1hdCAqLwogCi0JUHlPYmplY3QgKm5ld2ZtdCA9IE5VTEw7CS8qIHB5IHN0cmluZywgdGhlIG91dHB1dCBmb3JtYXQgKi8KLQljaGFyICpwbmV3OwkvKiBwb2ludGVyIHRvIGF2YWlsYWJsZSBieXRlIGluIG91dHB1dCBmb3JtYXQgKi8KLQlzaXplX3QgdG90YWxuZXc7CS8qIG51bWJlciBieXRlcyB0b3RhbCBpbiBvdXRwdXQgZm9ybWF0IGJ1ZmZlciwKLQkJCQkgICBleGNsdXNpdmUgb2YgdHJhaWxpbmcgXDAgKi8KLQlzaXplX3QgdXNlZG5ldzsJLyogbnVtYmVyIGJ5dGVzIHVzZWQgc28gZmFyIGluIG91dHB1dCBmb3JtYXQgYnVmZmVyICovCisgICAgUHlPYmplY3QgKm5ld2ZtdCA9IE5VTEw7ICAgICAgICAgICAgLyogcHkgc3RyaW5nLCB0aGUgb3V0cHV0IGZvcm1hdCAqLworICAgIGNoYXIgKnBuZXc7ICAgICAgICAgLyogcG9pbnRlciB0byBhdmFpbGFibGUgYnl0ZSBpbiBvdXRwdXQgZm9ybWF0ICovCisgICAgc2l6ZV90IHRvdGFsbmV3OyAgICAgICAgICAgIC8qIG51bWJlciBieXRlcyB0b3RhbCBpbiBvdXRwdXQgZm9ybWF0IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdXNpdmUgb2YgdHJhaWxpbmcgXDAgKi8KKyAgICBzaXplX3QgdXNlZG5ldzsgICAgIC8qIG51bWJlciBieXRlcyB1c2VkIHNvIGZhciBpbiBvdXRwdXQgZm9ybWF0IGJ1ZmZlciAqLwogCi0JY29uc3QgY2hhciAqcHRvYXBwZW5kOwkvKiBwdHIgdG8gc3RyaW5nIHRvIGFwcGVuZCB0byBvdXRwdXQgYnVmZmVyICovCi0Jc2l6ZV90IG50b2FwcGVuZDsJLyogIyBvZiBieXRlcyB0byBhcHBlbmQgdG8gb3V0cHV0IGJ1ZmZlciAqLworICAgIGNvbnN0IGNoYXIgKnB0b2FwcGVuZDsgICAgICAvKiBwdHIgdG8gc3RyaW5nIHRvIGFwcGVuZCB0byBvdXRwdXQgYnVmZmVyICovCisgICAgc2l6ZV90IG50b2FwcGVuZDsgICAgICAgICAgIC8qICMgb2YgYnl0ZXMgdG8gYXBwZW5kIHRvIG91dHB1dCBidWZmZXIgKi8KIAotCWFzc2VydChvYmplY3QgJiYgZm9ybWF0ICYmIHRpbWV0dXBsZSk7CisgICAgYXNzZXJ0KG9iamVjdCAmJiBmb3JtYXQgJiYgdGltZXR1cGxlKTsKIAotCS8qIEdpdmUgdXAgaWYgdGhlIHllYXIgaXMgYmVmb3JlIDE5MDAuCi0JICogUHl0aG9uIHN0cmZ0aW1lKCkgcGxheXMgZ2FtZXMgd2l0aCB0aGUgeWVhciwgYW5kIGRpZmZlcmVudAotCSAqIGdhbWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIGVudmFyIFBZVEhPTjJLIGlzIHNldC4gIFRoaXMgbWFrZXMKLQkgKiB5ZWFycyBiZWZvcmUgMTkwMCBhIG5pZ2h0bWFyZSwgZXZlbiBpZiB0aGUgcGxhdGZvcm0gc3RyZnRpbWUKLQkgKiBzdXBwb3J0cyB0aGVtIChhbmQgbm90IGFsbCBkbykuCi0JICogV2UgY291bGQgZ2V0IGEgbG90IGZhcnRoZXIgaGVyZSBieSBhdm9pZGluZyBQeXRob24ncyBzdHJmdGltZQotCSAqIHdyYXBwZXIgYW5kIGNhbGxpbmcgdGhlIEMgc3RyZnRpbWUoKSBkaXJlY3RseSwgYnV0IHRoYXQgaXNuJ3QKLQkgKiBhbiBvcHRpb24gaW4gdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1vZHVsZS4KLQkgKi8KLQl7Ci0JCWxvbmcgeWVhcjsKLQkJUHlPYmplY3QgKnB5eWVhciA9IFB5U2VxdWVuY2VfR2V0SXRlbSh0aW1ldHVwbGUsIDApOwotCQlpZiAocHl5ZWFyID09IE5VTEwpIHJldHVybiBOVUxMOwotCQlhc3NlcnQoUHlJbnRfQ2hlY2socHl5ZWFyKSk7Ci0JCXllYXIgPSBQeUludF9Bc0xvbmcocHl5ZWFyKTsKLQkJUHlfREVDUkVGKHB5eWVhcik7Ci0JCWlmICh5ZWFyIDwgMTkwMCkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ5ZWFyPSVsZCBpcyBiZWZvcmUgIgotCQkJCSAgICAgIjE5MDA7IHRoZSBkYXRldGltZSBzdHJmdGltZSgpICIKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRob2RzIHJlcXVpcmUgeWVhciA+PSAxOTAwIiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIpOwotCSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICAvKiBHaXZlIHVwIGlmIHRoZSB5ZWFyIGlzIGJlZm9yZSAxOTAwLgorICAgICAqIFB5dGhvbiBzdHJmdGltZSgpIHBsYXlzIGdhbWVzIHdpdGggdGhlIHllYXIsIGFuZCBkaWZmZXJlbnQKKyAgICAgKiBnYW1lcyBkZXBlbmRpbmcgb24gd2hldGhlciBlbnZhciBQWVRIT04ySyBpcyBzZXQuICBUaGlzIG1ha2VzCisgICAgICogeWVhcnMgYmVmb3JlIDE5MDAgYSBuaWdodG1hcmUsIGV2ZW4gaWYgdGhlIHBsYXRmb3JtIHN0cmZ0aW1lCisgICAgICogc3VwcG9ydHMgdGhlbSAoYW5kIG5vdCBhbGwgZG8pLgorICAgICAqIFdlIGNvdWxkIGdldCBhIGxvdCBmYXJ0aGVyIGhlcmUgYnkgYXZvaWRpbmcgUHl0aG9uJ3Mgc3RyZnRpbWUKKyAgICAgKiB3cmFwcGVyIGFuZCBjYWxsaW5nIHRoZSBDIHN0cmZ0aW1lKCkgZGlyZWN0bHksIGJ1dCB0aGF0IGlzbid0CisgICAgICogYW4gb3B0aW9uIGluIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2R1bGUuCisgICAgICovCisgICAgeworICAgICAgICBsb25nIHllYXI7CisgICAgICAgIFB5T2JqZWN0ICpweXllYXIgPSBQeVNlcXVlbmNlX0dldEl0ZW0odGltZXR1cGxlLCAwKTsKKyAgICAgICAgaWYgKHB5eWVhciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgICAgYXNzZXJ0KFB5SW50X0NoZWNrKHB5eWVhcikpOworICAgICAgICB5ZWFyID0gUHlJbnRfQXNMb25nKHB5eWVhcik7CisgICAgICAgIFB5X0RFQ1JFRihweXllYXIpOworICAgICAgICBpZiAoeWVhciA8IDE5MDApIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAieWVhcj0lbGQgaXMgYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMTkwMDsgdGhlIGRhdGV0aW1lIHN0cmZ0aW1lKCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRob2RzIHJlcXVpcmUgeWVhciA+PSAxOTAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JLyogU2NhbiB0aGUgaW5wdXQgZm9ybWF0LCBsb29raW5nIGZvciAlei8lWi8lZiBlc2NhcGVzLCBidWlsZGluZwotCSAqIGEgbmV3IGZvcm1hdC4gIFNpbmNlIGNvbXB1dGluZyB0aGUgcmVwbGFjZW1lbnRzIGZvciB0aG9zZSBjb2RlcwotCSAqIGlzIGV4cGVuc2l2ZSwgZG9uJ3QgdW5sZXNzIHRoZXkncmUgYWN0dWFsbHkgdXNlZC4KLQkgKi8KLQlpZiAoZm9ybWF0X2xlbiA+IElOVF9NQVggLSAxKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gRG9uZTsKLQl9CisgICAgLyogU2NhbiB0aGUgaW5wdXQgZm9ybWF0LCBsb29raW5nIGZvciAlei8lWi8lZiBlc2NhcGVzLCBidWlsZGluZworICAgICAqIGEgbmV3IGZvcm1hdC4gIFNpbmNlIGNvbXB1dGluZyB0aGUgcmVwbGFjZW1lbnRzIGZvciB0aG9zZSBjb2RlcworICAgICAqIGlzIGV4cGVuc2l2ZSwgZG9uJ3QgdW5sZXNzIHRoZXkncmUgYWN0dWFsbHkgdXNlZC4KKyAgICAgKi8KKyAgICBpZiAoZm9ybWF0X2xlbiA+IElOVF9NQVggLSAxKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CiAKLQl0b3RhbG5ldyA9IGZvcm1hdF9sZW4gKyAxOwkvKiByZWFsaXN0aWMgaWYgbm8gJXovJVovJWYgKi8KLQluZXdmbXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCB0b3RhbG5ldyk7Ci0JaWYgKG5ld2ZtdCA9PSBOVUxMKSBnb3RvIERvbmU7Ci0JcG5ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld2ZtdCk7Ci0JdXNlZG5ldyA9IDA7CisgICAgdG90YWxuZXcgPSBmb3JtYXRfbGVuICsgMTsgICAgICAgICAgLyogcmVhbGlzdGljIGlmIG5vICV6LyVaLyVmICovCisgICAgbmV3Zm10ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgdG90YWxuZXcpOworICAgIGlmIChuZXdmbXQgPT0gTlVMTCkgZ290byBEb25lOworICAgIHBuZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdmbXQpOworICAgIHVzZWRuZXcgPSAwOwogCi0JcGluID0gZm9ybWF0OwotCXdoaWxlICgoY2ggPSAqcGluKyspICE9ICdcMCcpIHsKLQkJaWYgKGNoICE9ICclJykgewotCQkJcHRvYXBwZW5kID0gcGluIC0gMTsKLQkJCW50b2FwcGVuZCA9IDE7Ci0JCX0KLQkJZWxzZSBpZiAoKGNoID0gKnBpbisrKSA9PSAnXDAnKSB7Ci0JCQkvKiBUaGVyZSdzIGEgbG9uZSB0cmFpbGluZyAlOyBkb2Vzbid0IG1ha2Ugc2Vuc2UuICovCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInN0cmZ0aW1lIGZvcm1hdCAiCi0JCQkJCSJlbmRzIHdpdGggcmF3ICUiKTsKLQkJCWdvdG8gRG9uZTsKLQkJfQotCQkvKiBBICUgaGFzIGJlZW4gc2VlbiBhbmQgY2ggaXMgdGhlIGNoYXJhY3RlciBhZnRlciBpdC4gKi8KLQkJZWxzZSBpZiAoY2ggPT0gJ3onKSB7Ci0JCQlpZiAoenJlcGxhY2VtZW50ID09IE5VTEwpIHsKLQkJCQkvKiBmb3JtYXQgdXRjb2Zmc2V0ICovCi0JCQkJY2hhciBidWZbMTAwXTsKLQkJCQlQeU9iamVjdCAqdHppbmZvID0gZ2V0X3R6aW5mb19tZW1iZXIob2JqZWN0KTsKLQkJCQl6cmVwbGFjZW1lbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQkJCQlpZiAoenJlcGxhY2VtZW50ID09IE5VTEwpIGdvdG8gRG9uZTsKLQkJCQlpZiAodHppbmZvICE9IFB5X05vbmUgJiYgdHppbmZvICE9IE5VTEwpIHsKLQkJCQkJYXNzZXJ0KHR6aW5mb2FyZyAhPSBOVUxMKTsKLQkJCQkJaWYgKGZvcm1hdF91dGNvZmZzZXQoYnVmLAotCQkJCQkJCSAgICAgc2l6ZW9mKGJ1ZiksCi0JCQkJCQkJICAgICAiIiwKLQkJCQkJCQkgICAgIHR6aW5mbywKLQkJCQkJCQkgICAgIHR6aW5mb2FyZykgPCAwKQotCQkJCQkJZ290byBEb25lOwotCQkJCQlQeV9ERUNSRUYoenJlcGxhY2VtZW50KTsKLQkJCQkJenJlcGxhY2VtZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCQkJCQlpZiAoenJlcGxhY2VtZW50ID09IE5VTEwpIGdvdG8gRG9uZTsKLQkJCQl9Ci0JCQl9Ci0JCQlhc3NlcnQoenJlcGxhY2VtZW50ICE9IE5VTEwpOwotCQkJcHRvYXBwZW5kID0gUHlTdHJpbmdfQVNfU1RSSU5HKHpyZXBsYWNlbWVudCk7Ci0JCQludG9hcHBlbmQgPSBQeVN0cmluZ19HRVRfU0laRSh6cmVwbGFjZW1lbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNoID09ICdaJykgewotCQkJLyogZm9ybWF0IHR6bmFtZSAqLwotCQkJaWYgKFpyZXBsYWNlbWVudCA9PSBOVUxMKSB7Ci0JCQkJUHlPYmplY3QgKnR6aW5mbyA9IGdldF90emluZm9fbWVtYmVyKG9iamVjdCk7Ci0JCQkJWnJlcGxhY2VtZW50ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JCQkJaWYgKFpyZXBsYWNlbWVudCA9PSBOVUxMKSBnb3RvIERvbmU7Ci0JCQkJaWYgKHR6aW5mbyAhPSBQeV9Ob25lICYmIHR6aW5mbyAhPSBOVUxMKSB7Ci0JCQkJCVB5T2JqZWN0ICp0ZW1wOwotCQkJCQlhc3NlcnQodHppbmZvYXJnICE9IE5VTEwpOwotCQkJCQl0ZW1wID0gY2FsbF90em5hbWUodHppbmZvLCB0emluZm9hcmcpOwotCQkJCQlpZiAodGVtcCA9PSBOVUxMKSBnb3RvIERvbmU7Ci0JCQkJCWlmICh0ZW1wICE9IFB5X05vbmUpIHsKLQkJCQkJCWFzc2VydChQeVN0cmluZ19DaGVjayh0ZW1wKSk7Ci0JCQkJCQkvKiBTaW5jZSB0aGUgdHpuYW1lIGlzIGdldHRpbmcKLQkJCQkJCSAqIHN0dWZmZWQgaW50byB0aGUgZm9ybWF0LCB3ZQotCQkJCQkJICogaGF2ZSB0byBkb3VibGUgYW55ICUgc2lnbnMKLQkJCQkJCSAqIHNvIHRoYXQgc3RyZnRpbWUgZG9lc24ndAotCQkJCQkJICogdHJlYXQgdGhlbSBhcyBmb3JtYXQgY29kZXMuCi0JCQkJCQkgKi8KLQkJCQkJCVB5X0RFQ1JFRihacmVwbGFjZW1lbnQpOwotCQkJCQkJWnJlcGxhY2VtZW50ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCgKLQkJCQkJCQl0ZW1wLCAicmVwbGFjZSIsCi0JCQkJCQkJInNzIiwgIiUiLCAiJSUiKTsKLQkJCQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJCQkJCWlmIChacmVwbGFjZW1lbnQgPT0gTlVMTCkKLQkJCQkJCQlnb3RvIERvbmU7Ci0JCQkJCQlpZiAoIVB5U3RyaW5nX0NoZWNrKFpyZXBsYWNlbWVudCkpIHsKLQkJCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAidHpuYW1lLnJlcGxhY2UoKSBkaWQgbm90IHJldHVybiBhIHN0cmluZyIpOwotCQkJCQkJCWdvdG8gRG9uZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlQeV9ERUNSRUYodGVtcCk7Ci0JCQkJfQotCQkJfQotCQkJYXNzZXJ0KFpyZXBsYWNlbWVudCAhPSBOVUxMKTsKLQkJCXB0b2FwcGVuZCA9IFB5U3RyaW5nX0FTX1NUUklORyhacmVwbGFjZW1lbnQpOwotCQkJbnRvYXBwZW5kID0gUHlTdHJpbmdfR0VUX1NJWkUoWnJlcGxhY2VtZW50KTsKLQkJfQotCQllbHNlIGlmIChjaCA9PSAnZicpIHsKLQkJCS8qIGZvcm1hdCBtaWNyb3NlY29uZHMgKi8KLQkJCWlmIChmcmVwbGFjZW1lbnQgPT0gTlVMTCkgewotCQkJCWZyZXBsYWNlbWVudCA9IG1ha2VfZnJlcGxhY2VtZW50KG9iamVjdCk7Ci0JCQkJaWYgKGZyZXBsYWNlbWVudCA9PSBOVUxMKQotCQkJCQlnb3RvIERvbmU7Ci0JCQl9Ci0JCQlhc3NlcnQoZnJlcGxhY2VtZW50ICE9IE5VTEwpOwotCQkJYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGZyZXBsYWNlbWVudCkpOwotCQkJcHRvYXBwZW5kID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZyZXBsYWNlbWVudCk7Ci0JCQludG9hcHBlbmQgPSBQeVN0cmluZ19HRVRfU0laRShmcmVwbGFjZW1lbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJLyogcGVyY2VudCBmb2xsb3dlZCBieSBuZWl0aGVyIHogbm9yIFogKi8KLQkJCXB0b2FwcGVuZCA9IHBpbiAtIDI7Ci0JCQludG9hcHBlbmQgPSAyOwotCQl9CisgICAgcGluID0gZm9ybWF0OworICAgIHdoaWxlICgoY2ggPSAqcGluKyspICE9ICdcMCcpIHsKKyAgICAgICAgaWYgKGNoICE9ICclJykgeworICAgICAgICAgICAgcHRvYXBwZW5kID0gcGluIC0gMTsKKyAgICAgICAgICAgIG50b2FwcGVuZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGNoID0gKnBpbisrKSA9PSAnXDAnKSB7CisgICAgICAgICAgICAvKiBUaGVyZSdzIGEgbG9uZSB0cmFpbGluZyAlOyBkb2Vzbid0IG1ha2Ugc2Vuc2UuICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInN0cmZ0aW1lIGZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuZHMgd2l0aCByYXcgJSIpOworICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICB9CisgICAgICAgIC8qIEEgJSBoYXMgYmVlbiBzZWVuIGFuZCBjaCBpcyB0aGUgY2hhcmFjdGVyIGFmdGVyIGl0LiAqLworICAgICAgICBlbHNlIGlmIChjaCA9PSAneicpIHsKKyAgICAgICAgICAgIGlmICh6cmVwbGFjZW1lbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8qIGZvcm1hdCB1dGNvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8gPSBnZXRfdHppbmZvX21lbWJlcihvYmplY3QpOworICAgICAgICAgICAgICAgIHpyZXBsYWNlbWVudCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICAgICAgICAgIGlmICh6cmVwbGFjZW1lbnQgPT0gTlVMTCkgZ290byBEb25lOworICAgICAgICAgICAgICAgIGlmICh0emluZm8gIT0gUHlfTm9uZSAmJiB0emluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQodHppbmZvYXJnICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0X3V0Y29mZnNldChidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm9hcmcpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHpyZXBsYWNlbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHpyZXBsYWNlbWVudCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHpyZXBsYWNlbWVudCA9PSBOVUxMKSBnb3RvIERvbmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0KHpyZXBsYWNlbWVudCAhPSBOVUxMKTsKKyAgICAgICAgICAgIHB0b2FwcGVuZCA9IFB5U3RyaW5nX0FTX1NUUklORyh6cmVwbGFjZW1lbnQpOworICAgICAgICAgICAgbnRvYXBwZW5kID0gUHlTdHJpbmdfR0VUX1NJWkUoenJlcGxhY2VtZW50KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjaCA9PSAnWicpIHsKKyAgICAgICAgICAgIC8qIGZvcm1hdCB0em5hbWUgKi8KKyAgICAgICAgICAgIGlmIChacmVwbGFjZW1lbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0emluZm8gPSBnZXRfdHppbmZvX21lbWJlcihvYmplY3QpOworICAgICAgICAgICAgICAgIFpyZXBsYWNlbWVudCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgICAgICAgICAgICAgIGlmIChacmVwbGFjZW1lbnQgPT0gTlVMTCkgZ290byBEb25lOworICAgICAgICAgICAgICAgIGlmICh0emluZm8gIT0gUHlfTm9uZSAmJiB0emluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHR6aW5mb2FyZyAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGNhbGxfdHpuYW1lKHR6aW5mbywgdHppbmZvYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkgZ290byBEb25lOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcCAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2sodGVtcCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLyogU2luY2UgdGhlIHR6bmFtZSBpcyBnZXR0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHVmZmVkIGludG8gdGhlIGZvcm1hdCwgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGhhdmUgdG8gZG91YmxlIGFueSAlIHNpZ25zCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB0aGF0IHN0cmZ0aW1lIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHRyZWF0IHRoZW0gYXMgZm9ybWF0IGNvZGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoWnJlcGxhY2VtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFpyZXBsYWNlbWVudCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCwgInJlcGxhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcyIsICIlIiwgIiUlIik7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWnJlcGxhY2VtZW50ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhacmVwbGFjZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInR6bmFtZS5yZXBsYWNlKCkgZGlkIG5vdCByZXR1cm4gYSBzdHJpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydChacmVwbGFjZW1lbnQgIT0gTlVMTCk7CisgICAgICAgICAgICBwdG9hcHBlbmQgPSBQeVN0cmluZ19BU19TVFJJTkcoWnJlcGxhY2VtZW50KTsKKyAgICAgICAgICAgIG50b2FwcGVuZCA9IFB5U3RyaW5nX0dFVF9TSVpFKFpyZXBsYWNlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ2YnKSB7CisgICAgICAgICAgICAvKiBmb3JtYXQgbWljcm9zZWNvbmRzICovCisgICAgICAgICAgICBpZiAoZnJlcGxhY2VtZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcmVwbGFjZW1lbnQgPSBtYWtlX2ZyZXBsYWNlbWVudChvYmplY3QpOworICAgICAgICAgICAgICAgIGlmIChmcmVwbGFjZW1lbnQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0KGZyZXBsYWNlbWVudCAhPSBOVUxMKTsKKyAgICAgICAgICAgIGFzc2VydChQeVN0cmluZ19DaGVjayhmcmVwbGFjZW1lbnQpKTsKKyAgICAgICAgICAgIHB0b2FwcGVuZCA9IFB5U3RyaW5nX0FTX1NUUklORyhmcmVwbGFjZW1lbnQpOworICAgICAgICAgICAgbnRvYXBwZW5kID0gUHlTdHJpbmdfR0VUX1NJWkUoZnJlcGxhY2VtZW50KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIHBlcmNlbnQgZm9sbG93ZWQgYnkgbmVpdGhlciB6IG5vciBaICovCisgICAgICAgICAgICBwdG9hcHBlbmQgPSBwaW4gLSAyOworICAgICAgICAgICAgbnRvYXBwZW5kID0gMjsKKyAgICAgICAgfQogCi0gCQkvKiBBcHBlbmQgdGhlIG50b2FwcGVuZCBjaGFycyBzdGFydGluZyBhdCBwdG9hcHBlbmQgdG8KLSAJCSAqIHRoZSBuZXcgZm9ybWF0LgotIAkJICovCi0gCQlhc3NlcnQocHRvYXBwZW5kICE9IE5VTEwpOwotIAkJYXNzZXJ0KG50b2FwcGVuZCA+PSAwKTsKLSAJCWlmIChudG9hcHBlbmQgPT0gMCkKLSAJCQljb250aW51ZTsKLSAJCXdoaWxlICh1c2VkbmV3ICsgbnRvYXBwZW5kID4gdG90YWxuZXcpIHsKLSAJCQlzaXplX3QgYmlnZ2VyID0gdG90YWxuZXcgPDwgMTsKLSAJCQlpZiAoKGJpZ2dlciA+PiAxKSAhPSB0b3RhbG5ldykgeyAvKiBvdmVyZmxvdyAqLwotIAkJCQlQeUVycl9Ob01lbW9yeSgpOwotIAkJCQlnb3RvIERvbmU7Ci0gCQkJfQotIAkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZuZXdmbXQsIGJpZ2dlcikgPCAwKQotIAkJCQlnb3RvIERvbmU7Ci0gCQkJdG90YWxuZXcgPSBiaWdnZXI7Ci0gCQkJcG5ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld2ZtdCkgKyB1c2VkbmV3OwotIAkJfQotCQltZW1jcHkocG5ldywgcHRvYXBwZW5kLCBudG9hcHBlbmQpOwotCQlwbmV3ICs9IG50b2FwcGVuZDsKLQkJdXNlZG5ldyArPSBudG9hcHBlbmQ7Ci0JCWFzc2VydCh1c2VkbmV3IDw9IHRvdGFsbmV3KTsKLQl9ICAvKiBlbmQgd2hpbGUoKSAqLworICAgICAgICAvKiBBcHBlbmQgdGhlIG50b2FwcGVuZCBjaGFycyBzdGFydGluZyBhdCBwdG9hcHBlbmQgdG8KKyAgICAgICAgICogdGhlIG5ldyBmb3JtYXQuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQocHRvYXBwZW5kICE9IE5VTEwpOworICAgICAgICBhc3NlcnQobnRvYXBwZW5kID49IDApOworICAgICAgICBpZiAobnRvYXBwZW5kID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgd2hpbGUgKHVzZWRuZXcgKyBudG9hcHBlbmQgPiB0b3RhbG5ldykgeworICAgICAgICAgICAgc2l6ZV90IGJpZ2dlciA9IHRvdGFsbmV3IDw8IDE7CisgICAgICAgICAgICBpZiAoKGJpZ2dlciA+PiAxKSAhPSB0b3RhbG5ldykgeyAvKiBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJm5ld2ZtdCwgYmlnZ2VyKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgdG90YWxuZXcgPSBiaWdnZXI7CisgICAgICAgICAgICBwbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3Zm10KSArIHVzZWRuZXc7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHBuZXcsIHB0b2FwcGVuZCwgbnRvYXBwZW5kKTsKKyAgICAgICAgcG5ldyArPSBudG9hcHBlbmQ7CisgICAgICAgIHVzZWRuZXcgKz0gbnRvYXBwZW5kOworICAgICAgICBhc3NlcnQodXNlZG5ldyA8PSB0b3RhbG5ldyk7CisgICAgfSAgLyogZW5kIHdoaWxlKCkgKi8KIAotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZuZXdmbXQsIHVzZWRuZXcpIDwgMCkKLQkJZ290byBEb25lOwotCXsKLQkJUHlPYmplY3QgKnRpbWUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ0aW1lIik7Ci0JCWlmICh0aW1lID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGltZSwgInN0cmZ0aW1lIiwgIk9PIiwKLQkJCQkJICAgICBuZXdmbXQsIHRpbWV0dXBsZSk7Ci0JCVB5X0RFQ1JFRih0aW1lKTsKLSAgICAJfQorICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZuZXdmbXQsIHVzZWRuZXcpIDwgMCkKKyAgICAgICAgZ290byBEb25lOworICAgIHsKKyAgICAgICAgUHlPYmplY3QgKnRpbWUgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ0aW1lIik7CisgICAgICAgIGlmICh0aW1lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGltZSwgInN0cmZ0aW1lIiwgIk9PIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdmbXQsIHRpbWV0dXBsZSk7CisgICAgICAgIFB5X0RFQ1JFRih0aW1lKTsKKyAgICB9CiAgRG9uZToKLQlQeV9YREVDUkVGKGZyZXBsYWNlbWVudCk7Ci0JUHlfWERFQ1JFRih6cmVwbGFjZW1lbnQpOwotCVB5X1hERUNSRUYoWnJlcGxhY2VtZW50KTsKLQlQeV9YREVDUkVGKG5ld2ZtdCk7Ci0gICAgCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihmcmVwbGFjZW1lbnQpOworICAgIFB5X1hERUNSRUYoenJlcGxhY2VtZW50KTsKKyAgICBQeV9YREVDUkVGKFpyZXBsYWNlbWVudCk7CisgICAgUHlfWERFQ1JFRihuZXdmbXQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBjaGFyICoKIGlzb2Zvcm1hdF9kYXRlKFB5RGF0ZVRpbWVfRGF0ZSAqZHQsIGNoYXIgYnVmZmVyW10sIGludCBidWZmbGVuKQogewotCWludCB4OwotCXggPSBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgYnVmZmxlbiwKLQkJCSAgIiUwNGQtJTAyZC0lMDJkIiwKLQkJCSAgR0VUX1lFQVIoZHQpLCBHRVRfTU9OVEgoZHQpLCBHRVRfREFZKGR0KSk7Ci0JYXNzZXJ0KGJ1ZmZsZW4gPj0geCk7Ci0JcmV0dXJuIGJ1ZmZlciArIHg7CisgICAgaW50IHg7CisgICAgeCA9IFB5T1Nfc25wcmludGYoYnVmZmVyLCBidWZmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCIsCisgICAgICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoZHQpLCBHRVRfTU9OVEgoZHQpLCBHRVRfREFZKGR0KSk7CisgICAgYXNzZXJ0KGJ1ZmZsZW4gPj0geCk7CisgICAgcmV0dXJuIGJ1ZmZlciArIHg7CiB9CiAKIHN0YXRpYyBjaGFyICoKIGlzb2Zvcm1hdF90aW1lKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKmR0LCBjaGFyIGJ1ZmZlcltdLCBpbnQgYnVmZmxlbikKIHsKLQlpbnQgeDsKLQlpbnQgdXMgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChkdCk7CisgICAgaW50IHg7CisgICAgaW50IHVzID0gREFURV9HRVRfTUlDUk9TRUNPTkQoZHQpOwogCi0JeCA9IFB5T1Nfc25wcmludGYoYnVmZmVyLCBidWZmbGVuLAotCQkJICAiJTAyZDolMDJkOiUwMmQiLAotCQkJICBEQVRFX0dFVF9IT1VSKGR0KSwKLQkJCSAgREFURV9HRVRfTUlOVVRFKGR0KSwKLQkJCSAgREFURV9HRVRfU0VDT05EKGR0KSk7Ci0JYXNzZXJ0KGJ1ZmZsZW4gPj0geCk7Ci0JaWYgKHVzKQotCQl4ICs9IFB5T1Nfc25wcmludGYoYnVmZmVyICsgeCwgYnVmZmxlbiAtIHgsICIuJTA2ZCIsIHVzKTsKLQlhc3NlcnQoYnVmZmxlbiA+PSB4KTsKLQlyZXR1cm4gYnVmZmVyICsgeDsKKyAgICB4ID0gUHlPU19zbnByaW50ZihidWZmZXIsIGJ1ZmZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgIiUwMmQ6JTAyZDolMDJkIiwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKGR0KSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUoZHQpLAorICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChkdCkpOworICAgIGFzc2VydChidWZmbGVuID49IHgpOworICAgIGlmICh1cykKKyAgICAgICAgeCArPSBQeU9TX3NucHJpbnRmKGJ1ZmZlciArIHgsIGJ1ZmZsZW4gLSB4LCAiLiUwNmQiLCB1cyk7CisgICAgYXNzZXJ0KGJ1ZmZsZW4gPj0geCk7CisgICAgcmV0dXJuIGJ1ZmZlciArIHg7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTM5MywxNCArMTM5MywxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfdGltZSh2b2lkKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCVB5T2JqZWN0ICp0aW1lID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0aW1lID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOwogCi0JaWYgKHRpbWUgIT0gTlVMTCkgewotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRpbWUsICJ0aW1lIiwgIigpIik7Ci0JCVB5X0RFQ1JFRih0aW1lKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAodGltZSAhPSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGltZSwgInRpbWUiLCAiKCkiKTsKKyAgICAgICAgUHlfREVDUkVGKHRpbWUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBCdWlsZCBhIHRpbWUuc3RydWN0X3RpbWUuICBUaGUgd2Vla2RheSBhbmQgZGF5IG51bWJlciBhcmUgYXV0b21hdGljYWxseQpAQCAtMTQwOSwyMSArMTQwOSwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWxkX3N0cnVjdF90aW1lKGludCB5LCBpbnQgbSwgaW50IGQsIGludCBoaCwgaW50IG1tLCBpbnQgc3MsIGludCBkc3RmbGFnKQogewotCVB5T2JqZWN0ICp0aW1lOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0aW1lOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JdGltZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInRpbWUiKTsKLQlpZiAodGltZSAhPSBOVUxMKSB7Ci0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGltZSwgInN0cnVjdF90aW1lIiwKLQkJCQkJICAgICAiKChpaWlpaWlpaWkpKSIsCi0JCQkJCSAgICAgeSwgbSwgZCwKLQkJCQkJICAgICBoaCwgbW0sIHNzLAotCQkJCSAJICAgICB3ZWVrZGF5KHksIG0sIGQpLAotCQkJCSAJICAgICBkYXlzX2JlZm9yZV9tb250aCh5LCBtKSArIGQsCi0JCQkJIAkgICAgIGRzdGZsYWcpOwotCQlQeV9ERUNSRUYodGltZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgdGltZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInRpbWUiKTsKKyAgICBpZiAodGltZSAhPSBOVUxMKSB7CisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGltZSwgInN0cnVjdF90aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKChpaWlpaWlpaWkpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwgbSwgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaCwgbW0sIHNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtkYXkoeSwgbSwgZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5c19iZWZvcmVfbW9udGgoeSwgbSkgKyBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGZsYWcpOworICAgICAgICBQeV9ERUNSRUYodGltZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQzNywzMyArMTQzNywzMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRpZmZfdG9fYm9vbChpbnQgZGlmZiwgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaW50IGlzdHJ1ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBpc3RydWU7CiAKLQlzd2l0Y2ggKG9wKSB7Ci0JCWNhc2UgUHlfRVE6IGlzdHJ1ZSA9IGRpZmYgPT0gMDsgYnJlYWs7Ci0JCWNhc2UgUHlfTkU6IGlzdHJ1ZSA9IGRpZmYgIT0gMDsgYnJlYWs7Ci0JCWNhc2UgUHlfTEU6IGlzdHJ1ZSA9IGRpZmYgPD0gMDsgYnJlYWs7Ci0JCWNhc2UgUHlfR0U6IGlzdHJ1ZSA9IGRpZmYgPj0gMDsgYnJlYWs7Ci0JCWNhc2UgUHlfTFQ6IGlzdHJ1ZSA9IGRpZmYgPCAwOyBicmVhazsKLQkJY2FzZSBQeV9HVDogaXN0cnVlID0gZGlmZiA+IDA7IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJYXNzZXJ0KCEgIm9wIHVua25vd24iKTsKLQkJCWlzdHJ1ZSA9IDA7IC8qIFRvIHNodXQgdXAgY29tcGlsZXIgKi8KLQl9Ci0JcmVzdWx0ID0gaXN0cnVlID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIFB5X0VROiBpc3RydWUgPSBkaWZmID09IDA7IGJyZWFrOworICAgICAgICBjYXNlIFB5X05FOiBpc3RydWUgPSBkaWZmICE9IDA7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0xFOiBpc3RydWUgPSBkaWZmIDw9IDA7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dFOiBpc3RydWUgPSBkaWZmID49IDA7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0xUOiBpc3RydWUgPSBkaWZmIDwgMDsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfR1Q6IGlzdHJ1ZSA9IGRpZmYgPiAwOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCghICJvcCB1bmtub3duIik7CisgICAgICAgICAgICBpc3RydWUgPSAwOyAvKiBUbyBzaHV0IHVwIGNvbXBpbGVyICovCisgICAgfQorICAgIHJlc3VsdCA9IGlzdHJ1ZSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBSYWlzZXMgYSAiY2FuJ3QgY29tcGFyZSIgVHlwZUVycm9yIGFuZCByZXR1cm5zIE5VTEwuICovCiBzdGF0aWMgUHlPYmplY3QgKgogY21wZXJyb3IoUHlPYmplY3QgKmEsIFB5T2JqZWN0ICpiKQogewotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgImNhbid0IGNvbXBhcmUgJXMgdG8gJXMiLAotCQkgICAgIFB5X1RZUEUoYSktPnRwX25hbWUsIFB5X1RZUEUoYiktPnRwX25hbWUpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJjYW4ndCBjb21wYXJlICVzIHRvICVzIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRShhKS0+dHBfbmFtZSwgUHlfVFlQRShiKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTQ3MSwxMyArMTQ3MSwxMyBAQAogICovCiAKIC8qIENvbnZlcnNpb24gZmFjdG9ycy4gKi8KLXN0YXRpYyBQeU9iamVjdCAqdXNfcGVyX3VzID0gTlVMTDsJLyogMSAqLwotc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfbXMgPSBOVUxMOwkvKiAxMDAwICovCi1zdGF0aWMgUHlPYmplY3QgKnVzX3Blcl9zZWNvbmQgPSBOVUxMOwkvKiAxMDAwMDAwICovCi1zdGF0aWMgUHlPYmplY3QgKnVzX3Blcl9taW51dGUgPSBOVUxMOwkvKiAxZTYgKiA2MCBhcyBQeXRob24gaW50ICovCi1zdGF0aWMgUHlPYmplY3QgKnVzX3Blcl9ob3VyID0gTlVMTDsJLyogMWU2ICogMzYwMCBhcyBQeXRob24gbG9uZyAqLwotc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfZGF5ID0gTlVMTDsJLyogMWU2ICogMzYwMCAqIDI0IGFzIFB5dGhvbiBsb25nICovCi1zdGF0aWMgUHlPYmplY3QgKnVzX3Blcl93ZWVrID0gTlVMTDsJLyogMWU2KjM2MDAqMjQqNyBhcyBQeXRob24gbG9uZyAqLworc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfdXMgPSBOVUxMOyAgICAgIC8qIDEgKi8KK3N0YXRpYyBQeU9iamVjdCAqdXNfcGVyX21zID0gTlVMTDsgICAgICAvKiAxMDAwICovCitzdGF0aWMgUHlPYmplY3QgKnVzX3Blcl9zZWNvbmQgPSBOVUxMOyAgLyogMTAwMDAwMCAqLworc3RhdGljIFB5T2JqZWN0ICp1c19wZXJfbWludXRlID0gTlVMTDsgIC8qIDFlNiAqIDYwIGFzIFB5dGhvbiBpbnQgKi8KK3N0YXRpYyBQeU9iamVjdCAqdXNfcGVyX2hvdXIgPSBOVUxMOyAgICAvKiAxZTYgKiAzNjAwIGFzIFB5dGhvbiBsb25nICovCitzdGF0aWMgUHlPYmplY3QgKnVzX3Blcl9kYXkgPSBOVUxMOyAgICAgLyogMWU2ICogMzYwMCAqIDI0IGFzIFB5dGhvbiBsb25nICovCitzdGF0aWMgUHlPYmplY3QgKnVzX3Blcl93ZWVrID0gTlVMTDsgICAgLyogMWU2KjM2MDAqMjQqNyBhcyBQeXRob24gbG9uZyAqLwogc3RhdGljIFB5T2JqZWN0ICpzZWNvbmRzX3Blcl9kYXkgPSBOVUxMOyAvKiAzNjAwKjI0IGFzIFB5dGhvbiBpbnQgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDg5LDcgKzE0ODksNyBAQAogICovCiAKIC8qIENvbnZlcnQgYSB0aW1lZGVsdGEgdG8gYSBudW1iZXIgb2YgdXMsCi0gKiAJKDI0KjM2MDAqc2VsZi5kYXlzICsgc2VsZi5zZWNvbmRzKSoxMDAwMDAwICsgc2VsZi5taWNyb3NlY29uZHMKKyAqICAgICAgKDI0KjM2MDAqc2VsZi5kYXlzICsgc2VsZi5zZWNvbmRzKSoxMDAwMDAwICsgc2VsZi5taWNyb3NlY29uZHMKICAqIGFzIGEgUHl0aG9uIGludCBvciBsb25nLgogICogRG9pbmcgbWl4ZWQtcmFkaXggYXJpdGhtZXRpYyBieSBoYW5kIGluc3RlYWQgaXMgZXhjcnVjaWF0aW5nIGluIEMsCiAgKiBkdWUgdG8gdWJpcXVpdG91cyBvdmVyZmxvdyBwb3NzaWJpbGl0aWVzLgpAQCAtMTQ5Nyw0OSArMTQ5Nyw0OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX3RvX21pY3Jvc2Vjb25kcyhQeURhdGVUaW1lX0RlbHRhICpzZWxmKQogewotCVB5T2JqZWN0ICp4MSA9IE5VTEw7Ci0JUHlPYmplY3QgKngyID0gTlVMTDsKLQlQeU9iamVjdCAqeDMgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICp4MSA9IE5VTEw7CisgICAgUHlPYmplY3QgKngyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqeDMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JeDEgPSBQeUludF9Gcm9tTG9uZyhHRVRfVERfREFZUyhzZWxmKSk7Ci0JaWYgKHgxID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl4MiA9IFB5TnVtYmVyX011bHRpcGx5KHgxLCBzZWNvbmRzX3Blcl9kYXkpOwkvKiBkYXlzIGluIHNlY29uZHMgKi8KLQlpZiAoeDIgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCVB5X0RFQ1JFRih4MSk7Ci0JeDEgPSBOVUxMOworICAgIHgxID0gUHlJbnRfRnJvbUxvbmcoR0VUX1REX0RBWVMoc2VsZikpOworICAgIGlmICh4MSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgeDIgPSBQeU51bWJlcl9NdWx0aXBseSh4MSwgc2Vjb25kc19wZXJfZGF5KTsgICAgICAgIC8qIGRheXMgaW4gc2Vjb25kcyAqLworICAgIGlmICh4MiA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgUHlfREVDUkVGKHgxKTsKKyAgICB4MSA9IE5VTEw7CiAKLQkvKiB4MiBoYXMgZGF5cyBpbiBzZWNvbmRzICovCi0JeDEgPSBQeUludF9Gcm9tTG9uZyhHRVRfVERfU0VDT05EUyhzZWxmKSk7CS8qIHNlY29uZHMgKi8KLQlpZiAoeDEgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXgzID0gUHlOdW1iZXJfQWRkKHgxLCB4Mik7CS8qIGRheXMgYW5kIHNlY29uZHMgaW4gc2Vjb25kcyAqLwotCWlmICh4MyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JUHlfREVDUkVGKHgxKTsKLQlQeV9ERUNSRUYoeDIpOwotCXgxID0geDIgPSBOVUxMOworICAgIC8qIHgyIGhhcyBkYXlzIGluIHNlY29uZHMgKi8KKyAgICB4MSA9IFB5SW50X0Zyb21Mb25nKEdFVF9URF9TRUNPTkRTKHNlbGYpKTsgICAgICAgICAgLyogc2Vjb25kcyAqLworICAgIGlmICh4MSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgeDMgPSBQeU51bWJlcl9BZGQoeDEsIHgyKTsgICAgICAgICAgLyogZGF5cyBhbmQgc2Vjb25kcyBpbiBzZWNvbmRzICovCisgICAgaWYgKHgzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICBQeV9ERUNSRUYoeDEpOworICAgIFB5X0RFQ1JFRih4Mik7CisgICAgeDEgPSB4MiA9IE5VTEw7CiAKLQkvKiB4MyBoYXMgZGF5cytzZWNvbmRzIGluIHNlY29uZHMgKi8KLQl4MSA9IFB5TnVtYmVyX011bHRpcGx5KHgzLCB1c19wZXJfc2Vjb25kKTsJLyogdXMgKi8KLQlpZiAoeDEgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCVB5X0RFQ1JFRih4Myk7Ci0JeDMgPSBOVUxMOworICAgIC8qIHgzIGhhcyBkYXlzK3NlY29uZHMgaW4gc2Vjb25kcyAqLworICAgIHgxID0gUHlOdW1iZXJfTXVsdGlwbHkoeDMsIHVzX3Blcl9zZWNvbmQpOyAgICAgICAgICAvKiB1cyAqLworICAgIGlmICh4MSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgUHlfREVDUkVGKHgzKTsKKyAgICB4MyA9IE5VTEw7CiAKLQkvKiB4MSBoYXMgZGF5cytzZWNvbmRzIGluIHVzICovCi0JeDIgPSBQeUludF9Gcm9tTG9uZyhHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpKTsKLQlpZiAoeDIgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXJlc3VsdCA9IFB5TnVtYmVyX0FkZCh4MSwgeDIpOworICAgIC8qIHgxIGhhcyBkYXlzK3NlY29uZHMgaW4gdXMgKi8KKyAgICB4MiA9IFB5SW50X0Zyb21Mb25nKEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikpOworICAgIGlmICh4MiA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgcmVzdWx0ID0gUHlOdW1iZXJfQWRkKHgxLCB4Mik7CiAKIERvbmU6Ci0JUHlfWERFQ1JFRih4MSk7Ci0JUHlfWERFQ1JFRih4Mik7Ci0JUHlfWERFQ1JFRih4Myk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKHgxKTsKKyAgICBQeV9YREVDUkVGKHgyKTsKKyAgICBQeV9YREVDUkVGKHgzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBDb252ZXJ0IGEgbnVtYmVyIG9mIHVzIChhcyBhIFB5dGhvbiBpbnQgb3IgbG9uZykgdG8gYSB0aW1lZGVsdGEuCkBAIC0xNTQ3LDIwNSArMTU0NywyMDUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtaWNyb3NlY29uZHNfdG9fZGVsdGFfZXgoUHlPYmplY3QgKnB5dXMsIFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlpbnQgdXM7Ci0JaW50IHM7Ci0JaW50IGQ7Ci0JbG9uZyB0ZW1wOworICAgIGludCB1czsKKyAgICBpbnQgczsKKyAgICBpbnQgZDsKKyAgICBsb25nIHRlbXA7CiAKLQlQeU9iamVjdCAqdHVwbGUgPSBOVUxMOwotCVB5T2JqZWN0ICpudW0gPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0dXBsZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm51bSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQl0dXBsZSA9IFB5TnVtYmVyX0Rpdm1vZChweXVzLCB1c19wZXJfc2Vjb25kKTsKLQlpZiAodHVwbGUgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIHR1cGxlID0gUHlOdW1iZXJfRGl2bW9kKHB5dXMsIHVzX3Blcl9zZWNvbmQpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQludW0gPSBQeVR1cGxlX0dldEl0ZW0odHVwbGUsIDEpOwkvKiB1cyAqLwotCWlmIChudW0gPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXRlbXAgPSBQeUxvbmdfQXNMb25nKG51bSk7Ci0JbnVtID0gTlVMTDsKLQlpZiAodGVtcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlnb3RvIERvbmU7Ci0JYXNzZXJ0KDAgPD0gdGVtcCAmJiB0ZW1wIDwgMTAwMDAwMCk7Ci0JdXMgPSAoaW50KXRlbXA7Ci0JaWYgKHVzIDwgMCkgewotCQkvKiBUaGUgZGl2aXNvciB3YXMgcG9zaXRpdmUsIHNvIHRoaXMgbXVzdCBiZSBhbiBlcnJvci4gKi8KLQkJYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOwotCQlnb3RvIERvbmU7Ci0JfQorICAgIG51bSA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMSk7ICAgICAgICAgICAgLyogdXMgKi8KKyAgICBpZiAobnVtID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB0ZW1wID0gUHlMb25nX0FzTG9uZyhudW0pOworICAgIG51bSA9IE5VTEw7CisgICAgaWYgKHRlbXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBEb25lOworICAgIGFzc2VydCgwIDw9IHRlbXAgJiYgdGVtcCA8IDEwMDAwMDApOworICAgIHVzID0gKGludCl0ZW1wOworICAgIGlmICh1cyA8IDApIHsKKyAgICAgICAgLyogVGhlIGRpdmlzb3Igd2FzIHBvc2l0aXZlLCBzbyB0aGlzIG11c3QgYmUgYW4gZXJyb3IuICovCisgICAgICAgIGFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KIAotCW51bSA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMCk7CS8qIGxlZnRvdmVyIHNlY29uZHMgKi8KLQlpZiAobnVtID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlQeV9JTkNSRUYobnVtKTsKLQlQeV9ERUNSRUYodHVwbGUpOworICAgIG51bSA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMCk7ICAgICAgICAgICAgLyogbGVmdG92ZXIgc2Vjb25kcyAqLworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIFB5X0lOQ1JFRihudW0pOworICAgIFB5X0RFQ1JFRih0dXBsZSk7CiAKLQl0dXBsZSA9IFB5TnVtYmVyX0Rpdm1vZChudW0sIHNlY29uZHNfcGVyX2RheSk7Ci0JaWYgKHR1cGxlID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlQeV9ERUNSRUYobnVtKTsKKyAgICB0dXBsZSA9IFB5TnVtYmVyX0Rpdm1vZChudW0sIHNlY29uZHNfcGVyX2RheSk7CisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICBQeV9ERUNSRUYobnVtKTsKIAotCW51bSA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMSk7IAkvKiBzZWNvbmRzICovCi0JaWYgKG51bSA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JdGVtcCA9IFB5TG9uZ19Bc0xvbmcobnVtKTsKLQludW0gPSBOVUxMOwotCWlmICh0ZW1wID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCWdvdG8gRG9uZTsKLQlhc3NlcnQoMCA8PSB0ZW1wICYmIHRlbXAgPCAyNCozNjAwKTsKLQlzID0gKGludCl0ZW1wOworICAgIG51bSA9IFB5VHVwbGVfR2V0SXRlbSh0dXBsZSwgMSk7ICAgICAgICAgICAgLyogc2Vjb25kcyAqLworICAgIGlmIChudW0gPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHRlbXAgPSBQeUxvbmdfQXNMb25nKG51bSk7CisgICAgbnVtID0gTlVMTDsKKyAgICBpZiAodGVtcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIERvbmU7CisgICAgYXNzZXJ0KDAgPD0gdGVtcCAmJiB0ZW1wIDwgMjQqMzYwMCk7CisgICAgcyA9IChpbnQpdGVtcDsKIAotCWlmIChzIDwgMCkgewotCQkvKiBUaGUgZGl2aXNvciB3YXMgcG9zaXRpdmUsIHNvIHRoaXMgbXVzdCBiZSBhbiBlcnJvci4gKi8KLQkJYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOwotCQlnb3RvIERvbmU7Ci0JfQorICAgIGlmIChzIDwgMCkgeworICAgICAgICAvKiBUaGUgZGl2aXNvciB3YXMgcG9zaXRpdmUsIHNvIHRoaXMgbXVzdCBiZSBhbiBlcnJvci4gKi8KKyAgICAgICAgYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQogCi0JbnVtID0gUHlUdXBsZV9HZXRJdGVtKHR1cGxlLCAwKTsJLyogbGVmdG92ZXIgZGF5cyAqLwotCWlmIChudW0gPT0gTlVMTCkKLQkJZ290byBEb25lOwotCVB5X0lOQ1JFRihudW0pOwotCXRlbXAgPSBQeUxvbmdfQXNMb25nKG51bSk7Ci0JaWYgKHRlbXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBEb25lOwotCWQgPSAoaW50KXRlbXA7Ci0JaWYgKChsb25nKWQgIT0gdGVtcCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5vcm1hbGl6ZWQgZGF5cyB0b28gIgotCQkJCSJsYXJnZSB0byBmaXQgaW4gYSBDIGludCIpOwotCQlnb3RvIERvbmU7Ci0JfQotCXJlc3VsdCA9IG5ld19kZWx0YV9leChkLCBzLCB1cywgMCwgdHlwZSk7CisgICAgbnVtID0gUHlUdXBsZV9HZXRJdGVtKHR1cGxlLCAwKTsgICAgICAgICAgICAvKiBsZWZ0b3ZlciBkYXlzICovCisgICAgaWYgKG51bSA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgUHlfSU5DUkVGKG51bSk7CisgICAgdGVtcCA9IFB5TG9uZ19Bc0xvbmcobnVtKTsKKyAgICBpZiAodGVtcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIERvbmU7CisgICAgZCA9IChpbnQpdGVtcDsKKyAgICBpZiAoKGxvbmcpZCAhPSB0ZW1wKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAibm9ybWFsaXplZCBkYXlzIHRvbyAiCisgICAgICAgICAgICAgICAgICAgICAgICAibGFyZ2UgdG8gZml0IGluIGEgQyBpbnQiKTsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KKyAgICByZXN1bHQgPSBuZXdfZGVsdGFfZXgoZCwgcywgdXMsIDAsIHR5cGUpOwogCiBEb25lOgotCVB5X1hERUNSRUYodHVwbGUpOwotCVB5X1hERUNSRUYobnVtKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYodHVwbGUpOworICAgIFB5X1hERUNSRUYobnVtKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi0jZGVmaW5lIG1pY3Jvc2Vjb25kc190b19kZWx0YShweW1pY3JvcykJXAotCW1pY3Jvc2Vjb25kc190b19kZWx0YV9leChweW1pY3JvcywgJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKQorI2RlZmluZSBtaWNyb3NlY29uZHNfdG9fZGVsdGEocHltaWNyb3MpIFwKKyAgICBtaWNyb3NlY29uZHNfdG9fZGVsdGFfZXgocHltaWNyb3MsICZQeURhdGVUaW1lX0RlbHRhVHlwZSkKIAogc3RhdGljIFB5T2JqZWN0ICoKIG11bHRpcGx5X2ludF90aW1lZGVsdGEoUHlPYmplY3QgKmludG9iaiwgUHlEYXRlVGltZV9EZWx0YSAqZGVsdGEpCiB7Ci0JUHlPYmplY3QgKnB5dXNfaW47Ci0JUHlPYmplY3QgKnB5dXNfb3V0OwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnB5dXNfaW47CisgICAgUHlPYmplY3QgKnB5dXNfb3V0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlweXVzX2luID0gZGVsdGFfdG9fbWljcm9zZWNvbmRzKGRlbHRhKTsKLQlpZiAocHl1c19pbiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBweXVzX2luID0gZGVsdGFfdG9fbWljcm9zZWNvbmRzKGRlbHRhKTsKKyAgICBpZiAocHl1c19pbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXB5dXNfb3V0ID0gUHlOdW1iZXJfTXVsdGlwbHkocHl1c19pbiwgaW50b2JqKTsKLQlQeV9ERUNSRUYocHl1c19pbik7Ci0JaWYgKHB5dXNfb3V0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHB5dXNfb3V0ID0gUHlOdW1iZXJfTXVsdGlwbHkocHl1c19pbiwgaW50b2JqKTsKKyAgICBQeV9ERUNSRUYocHl1c19pbik7CisgICAgaWYgKHB5dXNfb3V0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gbWljcm9zZWNvbmRzX3RvX2RlbHRhKHB5dXNfb3V0KTsKLQlQeV9ERUNSRUYocHl1c19vdXQpOwotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gbWljcm9zZWNvbmRzX3RvX2RlbHRhKHB5dXNfb3V0KTsKKyAgICBQeV9ERUNSRUYocHl1c19vdXQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaXZpZGVfdGltZWRlbHRhX2ludChQeURhdGVUaW1lX0RlbHRhICpkZWx0YSwgUHlPYmplY3QgKmludG9iaikKIHsKLQlQeU9iamVjdCAqcHl1c19pbjsKLQlQeU9iamVjdCAqcHl1c19vdXQ7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcHl1c19pbjsKKyAgICBQeU9iamVjdCAqcHl1c19vdXQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCXB5dXNfaW4gPSBkZWx0YV90b19taWNyb3NlY29uZHMoZGVsdGEpOwotCWlmIChweXVzX2luID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHB5dXNfaW4gPSBkZWx0YV90b19taWNyb3NlY29uZHMoZGVsdGEpOworICAgIGlmIChweXVzX2luID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcHl1c19vdXQgPSBQeU51bWJlcl9GbG9vckRpdmlkZShweXVzX2luLCBpbnRvYmopOwotCVB5X0RFQ1JFRihweXVzX2luKTsKLQlpZiAocHl1c19vdXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcHl1c19vdXQgPSBQeU51bWJlcl9GbG9vckRpdmlkZShweXVzX2luLCBpbnRvYmopOworICAgIFB5X0RFQ1JFRihweXVzX2luKTsKKyAgICBpZiAocHl1c19vdXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHQgPSBtaWNyb3NlY29uZHNfdG9fZGVsdGEocHl1c19vdXQpOwotCVB5X0RFQ1JFRihweXVzX291dCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBtaWNyb3NlY29uZHNfdG9fZGVsdGEocHl1c19vdXQpOworICAgIFB5X0RFQ1JFRihweXVzX291dCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX2FkZChQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CiAKLQlpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSAmJiBQeURlbHRhX0NoZWNrKHJpZ2h0KSkgewotCQkvKiBkZWx0YSArIGRlbHRhICovCi0JCS8qIFRoZSBDLWxldmVsIGFkZGl0aW9ucyBjYW4ndCBvdmVyZmxvdyBiZWNhdXNlIG9mIHRoZQotCQkgKiBpbnZhcmlhbnQgYm91bmRzLgotCQkgKi8KLQkJaW50IGRheXMgPSBHRVRfVERfREFZUyhsZWZ0KSArIEdFVF9URF9EQVlTKHJpZ2h0KTsKLQkJaW50IHNlY29uZHMgPSBHRVRfVERfU0VDT05EUyhsZWZ0KSArIEdFVF9URF9TRUNPTkRTKHJpZ2h0KTsKLQkJaW50IG1pY3Jvc2Vjb25kcyA9IEdFVF9URF9NSUNST1NFQ09ORFMobGVmdCkgKwotCQkJCSAgIEdFVF9URF9NSUNST1NFQ09ORFMocmlnaHQpOwotCQlyZXN1bHQgPSBuZXdfZGVsdGEoZGF5cywgc2Vjb25kcywgbWljcm9zZWNvbmRzLCAxKTsKLQl9CisgICAgaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkgJiYgUHlEZWx0YV9DaGVjayhyaWdodCkpIHsKKyAgICAgICAgLyogZGVsdGEgKyBkZWx0YSAqLworICAgICAgICAvKiBUaGUgQy1sZXZlbCBhZGRpdGlvbnMgY2FuJ3Qgb3ZlcmZsb3cgYmVjYXVzZSBvZiB0aGUKKyAgICAgICAgICogaW52YXJpYW50IGJvdW5kcy4KKyAgICAgICAgICovCisgICAgICAgIGludCBkYXlzID0gR0VUX1REX0RBWVMobGVmdCkgKyBHRVRfVERfREFZUyhyaWdodCk7CisgICAgICAgIGludCBzZWNvbmRzID0gR0VUX1REX1NFQ09ORFMobGVmdCkgKyBHRVRfVERfU0VDT05EUyhyaWdodCk7CisgICAgICAgIGludCBtaWNyb3NlY29uZHMgPSBHRVRfVERfTUlDUk9TRUNPTkRTKGxlZnQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMocmlnaHQpOworICAgICAgICByZXN1bHQgPSBuZXdfZGVsdGEoZGF5cywgc2Vjb25kcywgbWljcm9zZWNvbmRzLCAxKTsKKyAgICB9CiAKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKQotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9uZWdhdGl2ZShQeURhdGVUaW1lX0RlbHRhICpzZWxmKQogewotCXJldHVybiBuZXdfZGVsdGEoLUdFVF9URF9EQVlTKHNlbGYpLAotCQkJIC1HRVRfVERfU0VDT05EUyhzZWxmKSwKLQkJCSAtR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSwKLQkJCSAxKTsKKyAgICByZXR1cm4gbmV3X2RlbHRhKC1HRVRfVERfREFZUyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgIC1HRVRfVERfU0VDT05EUyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgIC1HRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9wb3NpdGl2ZShQeURhdGVUaW1lX0RlbHRhICpzZWxmKQogewotCS8qIENvdWxkIG9wdGltaXplIHRoaXMgKGJ5IHJldHVybmluZyBzZWxmKSBpZiB0aGlzIGlzbid0IGEKLQkgKiBzdWJjbGFzcyAtLSBidXQgd2hvIHVzZXMgdW5hcnkgKyA/ICBBcHByb3hpbWF0ZWx5IG5vYm9keS4KLQkgKi8KLQlyZXR1cm4gbmV3X2RlbHRhKEdFVF9URF9EQVlTKHNlbGYpLAotCQkJIEdFVF9URF9TRUNPTkRTKHNlbGYpLAotCQkJIEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZiksCi0JCQkgMCk7CisgICAgLyogQ291bGQgb3B0aW1pemUgdGhpcyAoYnkgcmV0dXJuaW5nIHNlbGYpIGlmIHRoaXMgaXNuJ3QgYQorICAgICAqIHN1YmNsYXNzIC0tIGJ1dCB3aG8gdXNlcyB1bmFyeSArID8gIEFwcHJveGltYXRlbHkgbm9ib2R5LgorICAgICAqLworICAgIHJldHVybiBuZXdfZGVsdGEoR0VUX1REX0RBWVMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICBHRVRfVERfU0VDT05EUyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX2FicyhQeURhdGVUaW1lX0RlbHRhICpzZWxmKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWFzc2VydChHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpID49IDApOwotCWFzc2VydChHRVRfVERfU0VDT05EUyhzZWxmKSA+PSAwKTsKKyAgICBhc3NlcnQoR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSA+PSAwKTsKKyAgICBhc3NlcnQoR0VUX1REX1NFQ09ORFMoc2VsZikgPj0gMCk7CiAKLQlpZiAoR0VUX1REX0RBWVMoc2VsZikgPCAwKQotCQlyZXN1bHQgPSBkZWx0YV9uZWdhdGl2ZShzZWxmKTsKLQllbHNlCi0JCXJlc3VsdCA9IGRlbHRhX3Bvc2l0aXZlKHNlbGYpOworICAgIGlmIChHRVRfVERfREFZUyhzZWxmKSA8IDApCisgICAgICAgIHJlc3VsdCA9IGRlbHRhX25lZ2F0aXZlKHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gZGVsdGFfcG9zaXRpdmUoc2VsZik7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9zdWJ0cmFjdChQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CiAKLQlpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSAmJiBQeURlbHRhX0NoZWNrKHJpZ2h0KSkgewotCSAgICAJLyogZGVsdGEgLSBkZWx0YSAqLwotCSAgICAJUHlPYmplY3QgKm1pbnVzX3JpZ2h0ID0gUHlOdW1iZXJfTmVnYXRpdmUocmlnaHQpOwotCSAgICAJaWYgKG1pbnVzX3JpZ2h0KSB7Ci0JICAgIAkJcmVzdWx0ID0gZGVsdGFfYWRkKGxlZnQsIG1pbnVzX3JpZ2h0KTsKLQkgICAgCQlQeV9ERUNSRUYobWludXNfcmlnaHQpOwotCSAgICAJfQotCSAgICAJZWxzZQotCSAgICAJCXJlc3VsdCA9IE5VTEw7Ci0JfQorICAgIGlmIChQeURlbHRhX0NoZWNrKGxlZnQpICYmIFB5RGVsdGFfQ2hlY2socmlnaHQpKSB7CisgICAgICAgIC8qIGRlbHRhIC0gZGVsdGEgKi8KKyAgICAgICAgUHlPYmplY3QgKm1pbnVzX3JpZ2h0ID0gUHlOdW1iZXJfTmVnYXRpdmUocmlnaHQpOworICAgICAgICBpZiAobWludXNfcmlnaHQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGRlbHRhX2FkZChsZWZ0LCBtaW51c19yaWdodCk7CisgICAgICAgICAgICBQeV9ERUNSRUYobWludXNfcmlnaHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgfQogCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBUaGlzIGlzIG1vcmUgbmF0dXJhbCBhcyBhIHRwX2NvbXBhcmUsIGJ1dCBkb2Vzbid0IHdvcmsgdGhlbjogIGZvciB3aGF0ZXZlcgpAQCAtMTc1NSwyNCArMTc1NSwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX3JpY2hjb21wYXJlKFB5RGF0ZVRpbWVfRGVsdGEgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewotCWludCBkaWZmID0gNDI7CS8qIG5vbnNlbnNlICovCisgICAgaW50IGRpZmYgPSA0MjsgICAgICAvKiBub25zZW5zZSAqLwogCi0JaWYgKFB5RGVsdGFfQ2hlY2sob3RoZXIpKSB7Ci0JCWRpZmYgPSBHRVRfVERfREFZUyhzZWxmKSAtIEdFVF9URF9EQVlTKG90aGVyKTsKLQkJaWYgKGRpZmYgPT0gMCkgewotCQkJZGlmZiA9IEdFVF9URF9TRUNPTkRTKHNlbGYpIC0gR0VUX1REX1NFQ09ORFMob3RoZXIpOwotCQkJaWYgKGRpZmYgPT0gMCkKLQkJCQlkaWZmID0gR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSAtCi0JCQkJICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMob3RoZXIpOwotCQl9Ci0JfQotCWVsc2UgaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKQotCQlkaWZmID0gMTsJLyogYW55IG5vbi16ZXJvIHZhbHVlIHdpbGwgZG8gKi8KKyAgICBpZiAoUHlEZWx0YV9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgZGlmZiA9IEdFVF9URF9EQVlTKHNlbGYpIC0gR0VUX1REX0RBWVMob3RoZXIpOworICAgICAgICBpZiAoZGlmZiA9PSAwKSB7CisgICAgICAgICAgICBkaWZmID0gR0VUX1REX1NFQ09ORFMoc2VsZikgLSBHRVRfVERfU0VDT05EUyhvdGhlcik7CisgICAgICAgICAgICBpZiAoZGlmZiA9PSAwKQorICAgICAgICAgICAgICAgIGRpZmYgPSBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgR0VUX1REX01JQ1JPU0VDT05EUyhvdGhlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpCisgICAgICAgIGRpZmYgPSAxOyAgICAgICAgICAgICAgIC8qIGFueSBub24temVybyB2YWx1ZSB3aWxsIGRvICovCiAKLQllbHNlIC8qIHN0b3AgdGhpcyBmcm9tIGZhbGxpbmcgYmFjayB0byBhZGRyZXNzIGNvbXBhcmlzb24gKi8KLQkJcmV0dXJuIGNtcGVycm9yKChQeU9iamVjdCAqKXNlbGYsIG90aGVyKTsKKyAgICBlbHNlIC8qIHN0b3AgdGhpcyBmcm9tIGZhbGxpbmcgYmFjayB0byBhZGRyZXNzIGNvbXBhcmlzb24gKi8KKyAgICAgICAgcmV0dXJuIGNtcGVycm9yKChQeU9iamVjdCAqKXNlbGYsIG90aGVyKTsKIAotCXJldHVybiBkaWZmX3RvX2Jvb2woZGlmZiwgb3ApOworICAgIHJldHVybiBkaWZmX3RvX2Jvb2woZGlmZiwgb3ApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKmRlbHRhX2dldHN0YXRlKFB5RGF0ZVRpbWVfRGVsdGEgKnNlbGYpOwpAQCAtMTc4MCw1MiArMTc4MCw1MiBAQAogc3RhdGljIGxvbmcKIGRlbHRhX2hhc2goUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKLQkJUHlPYmplY3QgKnRlbXAgPSBkZWx0YV9nZXRzdGF0ZShzZWxmKTsKLQkJaWYgKHRlbXAgIT0gTlVMTCkgewotCQkJc2VsZi0+aGFzaGNvZGUgPSBQeU9iamVjdF9IYXNoKHRlbXApOwotCQkJUHlfREVDUkVGKHRlbXApOwotCQl9Ci0JfQotCXJldHVybiBzZWxmLT5oYXNoY29kZTsKKyAgICBpZiAoc2VsZi0+aGFzaGNvZGUgPT0gLTEpIHsKKyAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBkZWx0YV9nZXRzdGF0ZShzZWxmKTsKKyAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCkgeworICAgICAgICAgICAgc2VsZi0+aGFzaGNvZGUgPSBQeU9iamVjdF9IYXNoKHRlbXApOworICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZWxmLT5oYXNoY29kZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX211bHRpcGx5KFB5T2JqZWN0ICpsZWZ0LCBQeU9iamVjdCAqcmlnaHQpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKIAotCWlmIChQeURlbHRhX0NoZWNrKGxlZnQpKSB7Ci0JCS8qIGRlbHRhICogPz8/ICovCi0JCWlmIChQeUludF9DaGVjayhyaWdodCkgfHwgUHlMb25nX0NoZWNrKHJpZ2h0KSkKLQkJCXJlc3VsdCA9IG11bHRpcGx5X2ludF90aW1lZGVsdGEocmlnaHQsCi0JCQkJCShQeURhdGVUaW1lX0RlbHRhICopIGxlZnQpOwotCX0KLQllbHNlIGlmIChQeUludF9DaGVjayhsZWZ0KSB8fCBQeUxvbmdfQ2hlY2sobGVmdCkpCi0JCXJlc3VsdCA9IG11bHRpcGx5X2ludF90aW1lZGVsdGEobGVmdCwKLQkJCQkJCShQeURhdGVUaW1lX0RlbHRhICopIHJpZ2h0KTsKKyAgICBpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSkgeworICAgICAgICAvKiBkZWx0YSAqID8/PyAqLworICAgICAgICBpZiAoUHlJbnRfQ2hlY2socmlnaHQpIHx8IFB5TG9uZ19DaGVjayhyaWdodCkpCisgICAgICAgICAgICByZXN1bHQgPSBtdWx0aXBseV9pbnRfdGltZWRlbHRhKHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopIGxlZnQpOworICAgIH0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayhsZWZ0KSB8fCBQeUxvbmdfQ2hlY2sobGVmdCkpCisgICAgICAgIHJlc3VsdCA9IG11bHRpcGx5X2ludF90aW1lZGVsdGEobGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKSByaWdodCk7CiAKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKQotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9kaXZpZGUoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwogCi0JaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkpIHsKLQkJLyogZGVsdGEgKiA/Pz8gKi8KLQkJaWYgKFB5SW50X0NoZWNrKHJpZ2h0KSB8fCBQeUxvbmdfQ2hlY2socmlnaHQpKQotCQkJcmVzdWx0ID0gZGl2aWRlX3RpbWVkZWx0YV9pbnQoCi0JCQkJCShQeURhdGVUaW1lX0RlbHRhICopbGVmdCwKLQkJCQkJcmlnaHQpOwotCX0KKyAgICBpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSkgeworICAgICAgICAvKiBkZWx0YSAqID8/PyAqLworICAgICAgICBpZiAoUHlJbnRfQ2hlY2socmlnaHQpIHx8IFB5TG9uZ19DaGVjayhyaWdodCkpCisgICAgICAgICAgICByZXN1bHQgPSBkaXZpZGVfdGltZWRlbHRhX2ludCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKWxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQpOworICAgIH0KIAotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogRm9sZCBpbiB0aGUgdmFsdWUgb2YgdGhlIHRhZyAoInNlY29uZHMiLCAid2Vla3MiLCBldGMpIGNvbXBvbmVudCBvZiBhCkBAIC0xODQxLDE2OSArMTg0MSwxNjkgQEAKIGFjY3VtKGNvbnN0IGNoYXIqIHRhZywgUHlPYmplY3QgKnNvZmFyLCBQeU9iamVjdCAqbnVtLCBQeU9iamVjdCAqZmFjdG9yLAogICAgICAgZG91YmxlICpsZWZ0b3ZlcikKIHsKLQlQeU9iamVjdCAqcHJvZDsKLQlQeU9iamVjdCAqc3VtOworICAgIFB5T2JqZWN0ICpwcm9kOworICAgIFB5T2JqZWN0ICpzdW07CiAKLQlhc3NlcnQobnVtICE9IE5VTEwpOworICAgIGFzc2VydChudW0gIT0gTlVMTCk7CiAKLQlpZiAoUHlJbnRfQ2hlY2sobnVtKSB8fCBQeUxvbmdfQ2hlY2sobnVtKSkgewotCQlwcm9kID0gUHlOdW1iZXJfTXVsdGlwbHkobnVtLCBmYWN0b3IpOwotCQlpZiAocHJvZCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXN1bSA9IFB5TnVtYmVyX0FkZChzb2ZhciwgcHJvZCk7Ci0JCVB5X0RFQ1JFRihwcm9kKTsKLQkJcmV0dXJuIHN1bTsKLQl9CisgICAgaWYgKFB5SW50X0NoZWNrKG51bSkgfHwgUHlMb25nX0NoZWNrKG51bSkpIHsKKyAgICAgICAgcHJvZCA9IFB5TnVtYmVyX011bHRpcGx5KG51bSwgZmFjdG9yKTsKKyAgICAgICAgaWYgKHByb2QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzdW0gPSBQeU51bWJlcl9BZGQoc29mYXIsIHByb2QpOworICAgICAgICBQeV9ERUNSRUYocHJvZCk7CisgICAgICAgIHJldHVybiBzdW07CisgICAgfQogCi0JaWYgKFB5RmxvYXRfQ2hlY2sobnVtKSkgewotCQlkb3VibGUgZG51bTsKLQkJZG91YmxlIGZyYWNwYXJ0OwotCQlkb3VibGUgaW50cGFydDsKLQkJUHlPYmplY3QgKng7Ci0JCVB5T2JqZWN0ICp5OworICAgIGlmIChQeUZsb2F0X0NoZWNrKG51bSkpIHsKKyAgICAgICAgZG91YmxlIGRudW07CisgICAgICAgIGRvdWJsZSBmcmFjcGFydDsKKyAgICAgICAgZG91YmxlIGludHBhcnQ7CisgICAgICAgIFB5T2JqZWN0ICp4OworICAgICAgICBQeU9iamVjdCAqeTsKIAotCQkvKiBUaGUgUGxhbjogIGRlY29tcG9zZSBudW0gaW50byBhbiBpbnRlZ2VyIHBhcnQgYW5kIGEKLQkJICogZnJhY3Rpb25hbCBwYXJ0LCBudW0gPSBpbnRwYXJ0ICsgZnJhY3BhcnQuCi0JCSAqIFRoZW4gbnVtICogZmFjdG9yID09Ci0JCSAqICAgICAgaW50cGFydCAqIGZhY3RvciArIGZyYWNwYXJ0ICogZmFjdG9yCi0JCSAqIGFuZCB0aGUgTEhTIGNhbiBiZSBjb21wdXRlZCBleGFjdGx5IGluIGxvbmcgYXJpdGhtZXRpYy4KLQkJICogVGhlIFJIUyBpcyBhZ2FpbiBicm9rZW4gaW50byBhbiBpbnQgcGFydCBhbmQgZnJhYyBwYXJ0LgotCQkgKiBhbmQgdGhlIGZyYWMgcGFydCBpcyBhZGRlZCBpbnRvICpsZWZ0b3Zlci4KLQkJICovCi0JCWRudW0gPSBQeUZsb2F0X0FzRG91YmxlKG51bSk7Ci0JCWlmIChkbnVtID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlmcmFjcGFydCA9IG1vZGYoZG51bSwgJmludHBhcnQpOwotCQl4ID0gUHlMb25nX0Zyb21Eb3VibGUoaW50cGFydCk7Ci0JCWlmICh4ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgLyogVGhlIFBsYW46ICBkZWNvbXBvc2UgbnVtIGludG8gYW4gaW50ZWdlciBwYXJ0IGFuZCBhCisgICAgICAgICAqIGZyYWN0aW9uYWwgcGFydCwgbnVtID0gaW50cGFydCArIGZyYWNwYXJ0LgorICAgICAgICAgKiBUaGVuIG51bSAqIGZhY3RvciA9PQorICAgICAgICAgKiAgICAgIGludHBhcnQgKiBmYWN0b3IgKyBmcmFjcGFydCAqIGZhY3RvcgorICAgICAgICAgKiBhbmQgdGhlIExIUyBjYW4gYmUgY29tcHV0ZWQgZXhhY3RseSBpbiBsb25nIGFyaXRobWV0aWMuCisgICAgICAgICAqIFRoZSBSSFMgaXMgYWdhaW4gYnJva2VuIGludG8gYW4gaW50IHBhcnQgYW5kIGZyYWMgcGFydC4KKyAgICAgICAgICogYW5kIHRoZSBmcmFjIHBhcnQgaXMgYWRkZWQgaW50byAqbGVmdG92ZXIuCisgICAgICAgICAqLworICAgICAgICBkbnVtID0gUHlGbG9hdF9Bc0RvdWJsZShudW0pOworICAgICAgICBpZiAoZG51bSA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZnJhY3BhcnQgPSBtb2RmKGRudW0sICZpbnRwYXJ0KTsKKyAgICAgICAgeCA9IFB5TG9uZ19Gcm9tRG91YmxlKGludHBhcnQpOworICAgICAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJcHJvZCA9IFB5TnVtYmVyX011bHRpcGx5KHgsIGZhY3Rvcik7Ci0JCVB5X0RFQ1JFRih4KTsKLQkJaWYgKHByb2QgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgICAgICBwcm9kID0gUHlOdW1iZXJfTXVsdGlwbHkoeCwgZmFjdG9yKTsKKyAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICBpZiAocHJvZCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJc3VtID0gUHlOdW1iZXJfQWRkKHNvZmFyLCBwcm9kKTsKLQkJUHlfREVDUkVGKHByb2QpOwotCQlpZiAoc3VtID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgc3VtID0gUHlOdW1iZXJfQWRkKHNvZmFyLCBwcm9kKTsKKyAgICAgICAgUHlfREVDUkVGKHByb2QpOworICAgICAgICBpZiAoc3VtID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlpZiAoZnJhY3BhcnQgPT0gMC4wKQotCQkJcmV0dXJuIHN1bTsKLQkJLyogU28gZmFyIHdlJ3ZlIGxvc3Qgbm8gaW5mb3JtYXRpb24uICBEZWFsaW5nIHdpdGggdGhlCi0JCSAqIGZyYWN0aW9uYWwgcGFydCByZXF1aXJlcyBmbG9hdCBhcml0aG1ldGljLCBhbmQgbWF5Ci0JCSAqIGxvc2UgYSBsaXR0bGUgaW5mby4KLQkJICovCi0JCWFzc2VydChQeUludF9DaGVjayhmYWN0b3IpIHx8IFB5TG9uZ19DaGVjayhmYWN0b3IpKTsKLQkJaWYgKFB5SW50X0NoZWNrKGZhY3RvcikpCi0JCQlkbnVtID0gKGRvdWJsZSlQeUludF9Bc0xvbmcoZmFjdG9yKTsKLQkJZWxzZQotCQkJZG51bSA9IFB5TG9uZ19Bc0RvdWJsZShmYWN0b3IpOworICAgICAgICBpZiAoZnJhY3BhcnQgPT0gMC4wKQorICAgICAgICAgICAgcmV0dXJuIHN1bTsKKyAgICAgICAgLyogU28gZmFyIHdlJ3ZlIGxvc3Qgbm8gaW5mb3JtYXRpb24uICBEZWFsaW5nIHdpdGggdGhlCisgICAgICAgICAqIGZyYWN0aW9uYWwgcGFydCByZXF1aXJlcyBmbG9hdCBhcml0aG1ldGljLCBhbmQgbWF5CisgICAgICAgICAqIGxvc2UgYSBsaXR0bGUgaW5mby4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydChQeUludF9DaGVjayhmYWN0b3IpIHx8IFB5TG9uZ19DaGVjayhmYWN0b3IpKTsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKGZhY3RvcikpCisgICAgICAgICAgICBkbnVtID0gKGRvdWJsZSlQeUludF9Bc0xvbmcoZmFjdG9yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZG51bSA9IFB5TG9uZ19Bc0RvdWJsZShmYWN0b3IpOwogCi0JCWRudW0gKj0gZnJhY3BhcnQ7Ci0JCWZyYWNwYXJ0ID0gbW9kZihkbnVtLCAmaW50cGFydCk7Ci0JCXggPSBQeUxvbmdfRnJvbURvdWJsZShpbnRwYXJ0KTsKLQkJaWYgKHggPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHN1bSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBkbnVtICo9IGZyYWNwYXJ0OworICAgICAgICBmcmFjcGFydCA9IG1vZGYoZG51bSwgJmludHBhcnQpOworICAgICAgICB4ID0gUHlMb25nX0Zyb21Eb3VibGUoaW50cGFydCk7CisgICAgICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQl5ID0gUHlOdW1iZXJfQWRkKHN1bSwgeCk7Ci0JCVB5X0RFQ1JFRihzdW0pOwotCQlQeV9ERUNSRUYoeCk7Ci0JCSpsZWZ0b3ZlciArPSBmcmFjcGFydDsKLQkJcmV0dXJuIHk7Ci0JfQorICAgICAgICB5ID0gUHlOdW1iZXJfQWRkKHN1bSwgeCk7CisgICAgICAgIFB5X0RFQ1JFRihzdW0pOworICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgICpsZWZ0b3ZlciArPSBmcmFjcGFydDsKKyAgICAgICAgcmV0dXJuIHk7CisgICAgfQogCi0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAidW5zdXBwb3J0ZWQgdHlwZSBmb3IgdGltZWRlbHRhICVzIGNvbXBvbmVudDogJXMiLAotCQkgICAgIHRhZywgUHlfVFlQRShudW0pLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgdHlwZSBmb3IgdGltZWRlbHRhICVzIGNvbXBvbmVudDogJXMiLAorICAgICAgICAgICAgICAgICB0YWcsIFB5X1RZUEUobnVtKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWx0YV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpzZWxmID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc2VsZiA9IE5VTEw7CiAKLQkvKiBBcmd1bWVudCBvYmplY3RzLiAqLwotCVB5T2JqZWN0ICpkYXkgPSBOVUxMOwotCVB5T2JqZWN0ICpzZWNvbmQgPSBOVUxMOwotCVB5T2JqZWN0ICp1cyA9IE5VTEw7Ci0JUHlPYmplY3QgKm1zID0gTlVMTDsKLQlQeU9iamVjdCAqbWludXRlID0gTlVMTDsKLQlQeU9iamVjdCAqaG91ciA9IE5VTEw7Ci0JUHlPYmplY3QgKndlZWsgPSBOVUxMOworICAgIC8qIEFyZ3VtZW50IG9iamVjdHMuICovCisgICAgUHlPYmplY3QgKmRheSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnNlY29uZCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICptaW51dGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpob3VyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqd2VlayA9IE5VTEw7CiAKLQlQeU9iamVjdCAqeCA9IE5VTEw7CS8qIHJ1bm5pbmcgc3VtIG9mIG1pY3Jvc2Vjb25kcyAqLwotCVB5T2JqZWN0ICp5ID0gTlVMTDsJLyogdGVtcCBzdW0gb2YgbWljcm9zZWNvbmRzICovCi0JZG91YmxlIGxlZnRvdmVyX3VzID0gMC4wOworICAgIFB5T2JqZWN0ICp4ID0gTlVMTDsgICAgICAgICAvKiBydW5uaW5nIHN1bSBvZiBtaWNyb3NlY29uZHMgKi8KKyAgICBQeU9iamVjdCAqeSA9IE5VTEw7ICAgICAgICAgLyogdGVtcCBzdW0gb2YgbWljcm9zZWNvbmRzICovCisgICAgZG91YmxlIGxlZnRvdmVyX3VzID0gMC4wOwogCi0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7Ci0JCSJkYXlzIiwgInNlY29uZHMiLCAibWljcm9zZWNvbmRzIiwgIm1pbGxpc2Vjb25kcyIsCi0JCSJtaW51dGVzIiwgImhvdXJzIiwgIndlZWtzIiwgTlVMTAotCX07CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7CisgICAgICAgICJkYXlzIiwgInNlY29uZHMiLCAibWljcm9zZWNvbmRzIiwgIm1pbGxpc2Vjb25kcyIsCisgICAgICAgICJtaW51dGVzIiwgImhvdXJzIiwgIndlZWtzIiwgTlVMTAorICAgIH07CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifE9PT09PT086X19uZXdfXyIsCi0JCQkJCWtleXdvcmRzLAotCQkJCQkmZGF5LCAmc2Vjb25kLCAmdXMsCi0JCQkJCSZtcywgJm1pbnV0ZSwgJmhvdXIsICZ3ZWVrKSA9PSAwKQotCQlnb3RvIERvbmU7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPT09PT09POl9fbmV3X18iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF5LCAmc2Vjb25kLCAmdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXMsICZtaW51dGUsICZob3VyLCAmd2VlaykgPT0gMCkKKyAgICAgICAgZ290byBEb25lOwogCi0JeCA9IFB5SW50X0Zyb21Mb25nKDApOwotCWlmICh4ID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0jZGVmaW5lIENMRUFOVVAgCVwKLQlQeV9ERUNSRUYoeCk7CVwKLQl4ID0geTsJCVwKLQlpZiAoeCA9PSBOVUxMKQlcCi0JCWdvdG8gRG9uZQorI2RlZmluZSBDTEVBTlVQICAgICAgICAgXAorICAgIFB5X0RFQ1JFRih4KTsgICAgICAgXAorICAgIHggPSB5OyAgICAgICAgICAgICAgXAorICAgIGlmICh4ID09IE5VTEwpICAgICAgXAorICAgICAgICBnb3RvIERvbmUKIAotCWlmICh1cykgewotCQl5ID0gYWNjdW0oIm1pY3Jvc2Vjb25kcyIsIHgsIHVzLCB1c19wZXJfdXMsICZsZWZ0b3Zlcl91cyk7Ci0JCUNMRUFOVVA7Ci0JfQotCWlmIChtcykgewotCQl5ID0gYWNjdW0oIm1pbGxpc2Vjb25kcyIsIHgsIG1zLCB1c19wZXJfbXMsICZsZWZ0b3Zlcl91cyk7Ci0JCUNMRUFOVVA7Ci0JfQotCWlmIChzZWNvbmQpIHsKLQkJeSA9IGFjY3VtKCJzZWNvbmRzIiwgeCwgc2Vjb25kLCB1c19wZXJfc2Vjb25kLCAmbGVmdG92ZXJfdXMpOwotCQlDTEVBTlVQOwotCX0KLQlpZiAobWludXRlKSB7Ci0JCXkgPSBhY2N1bSgibWludXRlcyIsIHgsIG1pbnV0ZSwgdXNfcGVyX21pbnV0ZSwgJmxlZnRvdmVyX3VzKTsKLQkJQ0xFQU5VUDsKLQl9Ci0JaWYgKGhvdXIpIHsKLQkJeSA9IGFjY3VtKCJob3VycyIsIHgsIGhvdXIsIHVzX3Blcl9ob3VyLCAmbGVmdG92ZXJfdXMpOwotCQlDTEVBTlVQOwotCX0KLQlpZiAoZGF5KSB7Ci0JCXkgPSBhY2N1bSgiZGF5cyIsIHgsIGRheSwgdXNfcGVyX2RheSwgJmxlZnRvdmVyX3VzKTsKLQkJQ0xFQU5VUDsKLQl9Ci0JaWYgKHdlZWspIHsKLQkJeSA9IGFjY3VtKCJ3ZWVrcyIsIHgsIHdlZWssIHVzX3Blcl93ZWVrLCAmbGVmdG92ZXJfdXMpOwotCQlDTEVBTlVQOwotCX0KLQlpZiAobGVmdG92ZXJfdXMpIHsKLQkJLyogUm91bmQgdG8gbmVhcmVzdCB3aG9sZSAjIG9mIHVzLCBhbmQgYWRkIGludG8geC4gKi8KLQkJUHlPYmplY3QgKnRlbXAgPSBQeUxvbmdfRnJvbUxvbmcocm91bmRfdG9fbG9uZyhsZWZ0b3Zlcl91cykpOwotCQlpZiAodGVtcCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoeCk7Ci0JCQlnb3RvIERvbmU7Ci0JCX0KLQkJeSA9IFB5TnVtYmVyX0FkZCh4LCB0ZW1wKTsKLQkJUHlfREVDUkVGKHRlbXApOwotCQlDTEVBTlVQOwotCX0KKyAgICBpZiAodXMpIHsKKyAgICAgICAgeSA9IGFjY3VtKCJtaWNyb3NlY29uZHMiLCB4LCB1cywgdXNfcGVyX3VzLCAmbGVmdG92ZXJfdXMpOworICAgICAgICBDTEVBTlVQOworICAgIH0KKyAgICBpZiAobXMpIHsKKyAgICAgICAgeSA9IGFjY3VtKCJtaWxsaXNlY29uZHMiLCB4LCBtcywgdXNfcGVyX21zLCAmbGVmdG92ZXJfdXMpOworICAgICAgICBDTEVBTlVQOworICAgIH0KKyAgICBpZiAoc2Vjb25kKSB7CisgICAgICAgIHkgPSBhY2N1bSgic2Vjb25kcyIsIHgsIHNlY29uZCwgdXNfcGVyX3NlY29uZCwgJmxlZnRvdmVyX3VzKTsKKyAgICAgICAgQ0xFQU5VUDsKKyAgICB9CisgICAgaWYgKG1pbnV0ZSkgeworICAgICAgICB5ID0gYWNjdW0oIm1pbnV0ZXMiLCB4LCBtaW51dGUsIHVzX3Blcl9taW51dGUsICZsZWZ0b3Zlcl91cyk7CisgICAgICAgIENMRUFOVVA7CisgICAgfQorICAgIGlmIChob3VyKSB7CisgICAgICAgIHkgPSBhY2N1bSgiaG91cnMiLCB4LCBob3VyLCB1c19wZXJfaG91ciwgJmxlZnRvdmVyX3VzKTsKKyAgICAgICAgQ0xFQU5VUDsKKyAgICB9CisgICAgaWYgKGRheSkgeworICAgICAgICB5ID0gYWNjdW0oImRheXMiLCB4LCBkYXksIHVzX3Blcl9kYXksICZsZWZ0b3Zlcl91cyk7CisgICAgICAgIENMRUFOVVA7CisgICAgfQorICAgIGlmICh3ZWVrKSB7CisgICAgICAgIHkgPSBhY2N1bSgid2Vla3MiLCB4LCB3ZWVrLCB1c19wZXJfd2VlaywgJmxlZnRvdmVyX3VzKTsKKyAgICAgICAgQ0xFQU5VUDsKKyAgICB9CisgICAgaWYgKGxlZnRvdmVyX3VzKSB7CisgICAgICAgIC8qIFJvdW5kIHRvIG5lYXJlc3Qgd2hvbGUgIyBvZiB1cywgYW5kIGFkZCBpbnRvIHguICovCisgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gUHlMb25nX0Zyb21Mb25nKHJvdW5kX3RvX2xvbmcobGVmdG92ZXJfdXMpKTsKKyAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICB9CisgICAgICAgIHkgPSBQeU51bWJlcl9BZGQoeCwgdGVtcCk7CisgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgQ0xFQU5VUDsKKyAgICB9CiAKLQlzZWxmID0gbWljcm9zZWNvbmRzX3RvX2RlbHRhX2V4KHgsIHR5cGUpOwotCVB5X0RFQ1JFRih4KTsKKyAgICBzZWxmID0gbWljcm9zZWNvbmRzX3RvX2RlbHRhX2V4KHgsIHR5cGUpOworICAgIFB5X0RFQ1JFRih4KTsKIERvbmU6Ci0JcmV0dXJuIHNlbGY7CisgICAgcmV0dXJuIHNlbGY7CiAKICN1bmRlZiBDTEVBTlVQCiB9CkBAIC0yMDExLDc1ICsyMDExLDc1IEBACiBzdGF0aWMgaW50CiBkZWx0YV9ub256ZXJvKFB5RGF0ZVRpbWVfRGVsdGEgKnNlbGYpCiB7Ci0JcmV0dXJuIChHRVRfVERfREFZUyhzZWxmKSAhPSAwCi0JCXx8IEdFVF9URF9TRUNPTkRTKHNlbGYpICE9IDAKLQkJfHwgR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSAhPSAwKTsKKyAgICByZXR1cm4gKEdFVF9URF9EQVlTKHNlbGYpICE9IDAKKyAgICAgICAgfHwgR0VUX1REX1NFQ09ORFMoc2VsZikgIT0gMAorICAgICAgICB8fCBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpICE9IDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfcmVwcihQeURhdGVUaW1lX0RlbHRhICpzZWxmKQogewotCWlmIChHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpICE9IDApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCIlcyglZCwgJWQsICVkKSIsCi0JCQkJCSAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsCi0JCQkJCSAgIEdFVF9URF9EQVlTKHNlbGYpLAotCQkJCQkgICBHRVRfVERfU0VDT05EUyhzZWxmKSwKLQkJCQkJICAgR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSk7Ci0JaWYgKEdFVF9URF9TRUNPTkRTKHNlbGYpICE9IDApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCIlcyglZCwgJWQpIiwKLQkJCQkJICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKLQkJCQkJICAgR0VUX1REX0RBWVMoc2VsZiksCi0JCQkJCSAgIEdFVF9URF9TRUNPTkRTKHNlbGYpKTsKKyAgICBpZiAoR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmKSAhPSAwKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJWQsICVkLCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfREFZUyhzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1REX1NFQ09ORFMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9NSUNST1NFQ09ORFMoc2VsZikpOworICAgIGlmIChHRVRfVERfU0VDT05EUyhzZWxmKSAhPSAwKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9EQVlTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfU0VDT05EUyhzZWxmKSk7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJWQpIiwKLQkJCQkgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAotCQkJCSAgIEdFVF9URF9EQVlTKHNlbGYpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9EQVlTKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX3N0cihQeURhdGVUaW1lX0RlbHRhICpzZWxmKQogewotCWludCBkYXlzID0gR0VUX1REX0RBWVMoc2VsZik7Ci0JaW50IHNlY29uZHMgPSBHRVRfVERfU0VDT05EUyhzZWxmKTsKLQlpbnQgdXMgPSBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpOwotCWludCBob3VyczsKLQlpbnQgbWludXRlczsKLQljaGFyIGJ1ZlsxMDBdOwotCWNoYXIgKnBidWYgPSBidWY7Ci0Jc2l6ZV90IGJ1ZmxlbiA9IHNpemVvZihidWYpOwotCWludCBuOworICAgIGludCBkYXlzID0gR0VUX1REX0RBWVMoc2VsZik7CisgICAgaW50IHNlY29uZHMgPSBHRVRfVERfU0VDT05EUyhzZWxmKTsKKyAgICBpbnQgdXMgPSBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpOworICAgIGludCBob3VyczsKKyAgICBpbnQgbWludXRlczsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIGNoYXIgKnBidWYgPSBidWY7CisgICAgc2l6ZV90IGJ1ZmxlbiA9IHNpemVvZihidWYpOworICAgIGludCBuOwogCi0JbWludXRlcyA9IGRpdm1vZChzZWNvbmRzLCA2MCwgJnNlY29uZHMpOwotCWhvdXJzID0gZGl2bW9kKG1pbnV0ZXMsIDYwLCAmbWludXRlcyk7CisgICAgbWludXRlcyA9IGRpdm1vZChzZWNvbmRzLCA2MCwgJnNlY29uZHMpOworICAgIGhvdXJzID0gZGl2bW9kKG1pbnV0ZXMsIDYwLCAmbWludXRlcyk7CiAKLQlpZiAoZGF5cykgewotCQluID0gUHlPU19zbnByaW50ZihwYnVmLCBidWZsZW4sICIlZCBkYXklcywgIiwgZGF5cywKLQkJCQkgIChkYXlzID09IDEgfHwgZGF5cyA9PSAtMSkgPyAiIiA6ICJzIik7Ci0JCWlmIChuIDwgMCB8fCAoc2l6ZV90KW4gPj0gYnVmbGVuKQotCQkJZ290byBGYWlsOwotCQlwYnVmICs9IG47Ci0JCWJ1ZmxlbiAtPSAoc2l6ZV90KW47Ci0JfQorICAgIGlmIChkYXlzKSB7CisgICAgICAgIG4gPSBQeU9TX3NucHJpbnRmKHBidWYsIGJ1ZmxlbiwgIiVkIGRheSVzLCAiLCBkYXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF5cyA9PSAxIHx8IGRheXMgPT0gLTEpID8gIiIgOiAicyIpOworICAgICAgICBpZiAobiA8IDAgfHwgKHNpemVfdCluID49IGJ1ZmxlbikKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgcGJ1ZiArPSBuOworICAgICAgICBidWZsZW4gLT0gKHNpemVfdCluOworICAgIH0KIAotCW4gPSBQeU9TX3NucHJpbnRmKHBidWYsIGJ1ZmxlbiwgIiVkOiUwMmQ6JTAyZCIsCi0JCQkgIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKTsKLQlpZiAobiA8IDAgfHwgKHNpemVfdCluID49IGJ1ZmxlbikKLQkJZ290byBGYWlsOwotCXBidWYgKz0gbjsKLQlidWZsZW4gLT0gKHNpemVfdCluOworICAgIG4gPSBQeU9TX3NucHJpbnRmKHBidWYsIGJ1ZmxlbiwgIiVkOiUwMmQ6JTAyZCIsCisgICAgICAgICAgICAgICAgICAgICAgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpOworICAgIGlmIChuIDwgMCB8fCAoc2l6ZV90KW4gPj0gYnVmbGVuKQorICAgICAgICBnb3RvIEZhaWw7CisgICAgcGJ1ZiArPSBuOworICAgIGJ1ZmxlbiAtPSAoc2l6ZV90KW47CiAKLQlpZiAodXMpIHsKLQkJbiA9IFB5T1Nfc25wcmludGYocGJ1ZiwgYnVmbGVuLCAiLiUwNmQiLCB1cyk7Ci0JCWlmIChuIDwgMCB8fCAoc2l6ZV90KW4gPj0gYnVmbGVuKQotCQkJZ290byBGYWlsOwotCQlwYnVmICs9IG47Ci0JfQorICAgIGlmICh1cykgeworICAgICAgICBuID0gUHlPU19zbnByaW50ZihwYnVmLCBidWZsZW4sICIuJTA2ZCIsIHVzKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IChzaXplX3QpbiA+PSBidWZsZW4pCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIHBidWYgKz0gbjsKKyAgICB9CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBwYnVmIC0gYnVmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBwYnVmIC0gYnVmKTsKIAogIEZhaWw6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiZ29vZnkgcmVzdWx0IGZyb20gUHlPU19zbnByaW50ZiIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgImdvb2Z5IHJlc3VsdCBmcm9tIFB5T1Nfc25wcmludGYiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogUGlja2xlIHN1cHBvcnQsIGEgc2ltcGxlIHVzZSBvZiBfX3JlZHVjZV9fLiAqLwpAQCAtMjA4OCwxMjQgKzIwODgsMTI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVsdGFfZ2V0c3RhdGUoUHlEYXRlVGltZV9EZWx0YSAqc2VsZikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpIiwgR0VUX1REX0RBWVMoc2VsZiksCi0JCQkJICAgIEdFVF9URF9TRUNPTkRTKHNlbGYpLAotCQkJCSAgICBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpIiwgR0VUX1REX0RBWVMoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9URF9TRUNPTkRTKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlbHRhX3JlZHVjZShQeURhdGVUaW1lX0RlbHRhKiBzZWxmKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPTiIsIFB5X1RZUEUoc2VsZiksIGRlbHRhX2dldHN0YXRlKHNlbGYpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiT04iLCBQeV9UWVBFKHNlbGYpLCBkZWx0YV9nZXRzdGF0ZShzZWxmKSk7CiB9CiAKICNkZWZpbmUgT0ZGU0VUKGZpZWxkKSAgb2Zmc2V0b2YoUHlEYXRlVGltZV9EZWx0YSwgZmllbGQpCiAKIHN0YXRpYyBQeU1lbWJlckRlZiBkZWx0YV9tZW1iZXJzW10gPSB7CiAKLQl7ImRheXMiLCAgICAgICAgIFRfSU5ULCBPRkZTRVQoZGF5cyksICAgICAgICAgUkVBRE9OTFksCi0JIFB5RG9jX1NUUigiTnVtYmVyIG9mIGRheXMuIil9LAorICAgIHsiZGF5cyIsICAgICAgICAgVF9JTlQsIE9GRlNFVChkYXlzKSwgICAgICAgICBSRUFET05MWSwKKyAgICAgUHlEb2NfU1RSKCJOdW1iZXIgb2YgZGF5cy4iKX0sCiAKLQl7InNlY29uZHMiLCAgICAgIFRfSU5ULCBPRkZTRVQoc2Vjb25kcyksICAgICAgUkVBRE9OTFksCi0JIFB5RG9jX1NUUigiTnVtYmVyIG9mIHNlY29uZHMgKD49IDAgYW5kIGxlc3MgdGhhbiAxIGRheSkuIil9LAorICAgIHsic2Vjb25kcyIsICAgICAgVF9JTlQsIE9GRlNFVChzZWNvbmRzKSwgICAgICBSRUFET05MWSwKKyAgICAgUHlEb2NfU1RSKCJOdW1iZXIgb2Ygc2Vjb25kcyAoPj0gMCBhbmQgbGVzcyB0aGFuIDEgZGF5KS4iKX0sCiAKLQl7Im1pY3Jvc2Vjb25kcyIsIFRfSU5ULCBPRkZTRVQobWljcm9zZWNvbmRzKSwgUkVBRE9OTFksCi0JIFB5RG9jX1NUUigiTnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyAoPj0gMCBhbmQgbGVzcyB0aGFuIDEgc2Vjb25kKS4iKX0sCi0Je05VTEx9CisgICAgeyJtaWNyb3NlY29uZHMiLCBUX0lOVCwgT0ZGU0VUKG1pY3Jvc2Vjb25kcyksIFJFQURPTkxZLAorICAgICBQeURvY19TVFIoIk51bWJlciBvZiBtaWNyb3NlY29uZHMgKD49IDAgYW5kIGxlc3MgdGhhbiAxIHNlY29uZCkuIil9LAorICAgIHtOVUxMfQogfTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGRlbHRhX21ldGhvZHNbXSA9IHsKLQl7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pZGVsdGFfcmVkdWNlLCAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKKyAgICB7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pZGVsdGFfcmVkdWNlLCAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKIAotCXtOVUxMLAlOVUxMfSwKKyAgICB7TlVMTCwgICAgICBOVUxMfSwKIH07CiAKIHN0YXRpYyBjaGFyIGRlbHRhX2RvY1tdID0KIFB5RG9jX1NUUigiRGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRldGltZSB2YWx1ZXMuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgZGVsdGFfYXNfbnVtYmVyID0gewotCWRlbHRhX2FkZCwJCQkJLyogbmJfYWRkICovCi0JZGVsdGFfc3VidHJhY3QsCQkJCS8qIG5iX3N1YnRyYWN0ICovCi0JZGVsdGFfbXVsdGlwbHksCQkJCS8qIG5iX211bHRpcGx5ICovCi0JZGVsdGFfZGl2aWRlLAkJCQkvKiBuYl9kaXZpZGUgKi8KLQkwLAkJCQkJLyogbmJfcmVtYWluZGVyICovCi0JMCwJCQkJCS8qIG5iX2Rpdm1vZCAqLwotCTAsCQkJCQkvKiBuYl9wb3dlciAqLwotCSh1bmFyeWZ1bmMpZGVsdGFfbmVnYXRpdmUsCQkvKiBuYl9uZWdhdGl2ZSAqLwotCSh1bmFyeWZ1bmMpZGVsdGFfcG9zaXRpdmUsCQkvKiBuYl9wb3NpdGl2ZSAqLwotCSh1bmFyeWZ1bmMpZGVsdGFfYWJzLAkJCS8qIG5iX2Fic29sdXRlICovCi0JKGlucXVpcnkpZGVsdGFfbm9uemVybywJCQkvKiBuYl9ub256ZXJvICovCi0JMCwJCQkJCS8qbmJfaW52ZXJ0Ki8KLQkwLAkJCQkJLypuYl9sc2hpZnQqLwotCTAsCQkJCQkvKm5iX3JzaGlmdCovCi0JMCwJCQkJCS8qbmJfYW5kKi8KLQkwLAkJCQkJLypuYl94b3IqLwotCTAsCQkJCQkvKm5iX29yKi8KLQkwLAkJCQkJLypuYl9jb2VyY2UqLwotCTAsCQkJCQkvKm5iX2ludCovCi0JMCwJCQkJCS8qbmJfbG9uZyovCi0JMCwJCQkJCS8qbmJfZmxvYXQqLwotCTAsCQkJCQkvKm5iX29jdCovCi0JMCwgCQkJCQkvKm5iX2hleCovCi0JMCwJCQkJCS8qbmJfaW5wbGFjZV9hZGQqLwotCTAsCQkJCQkvKm5iX2lucGxhY2Vfc3VidHJhY3QqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfbXVsdGlwbHkqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfZGl2aWRlKi8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX3JlbWFpbmRlciovCi0JMCwJCQkJCS8qbmJfaW5wbGFjZV9wb3dlciovCi0JMCwJCQkJCS8qbmJfaW5wbGFjZV9sc2hpZnQqLwotCTAsCQkJCQkvKm5iX2lucGxhY2VfcnNoaWZ0Ki8KLQkwLAkJCQkJLypuYl9pbnBsYWNlX2FuZCovCi0JMCwJCQkJCS8qbmJfaW5wbGFjZV94b3IqLwotCTAsCQkJCQkvKm5iX2lucGxhY2Vfb3IqLwotCWRlbHRhX2RpdmlkZSwJCQkJLyogbmJfZmxvb3JfZGl2aWRlICovCi0JMCwJCQkJCS8qIG5iX3RydWVfZGl2aWRlICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KKyAgICBkZWx0YV9hZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2FkZCAqLworICAgIGRlbHRhX3N1YnRyYWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfc3VidHJhY3QgKi8KKyAgICBkZWx0YV9tdWx0aXBseSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX211bHRpcGx5ICovCisgICAgZGVsdGFfZGl2aWRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2bW9kICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3dlciAqLworICAgICh1bmFyeWZ1bmMpZGVsdGFfbmVnYXRpdmUsICAgICAgICAgICAgICAgICAgLyogbmJfbmVnYXRpdmUgKi8KKyAgICAodW5hcnlmdW5jKWRlbHRhX3Bvc2l0aXZlLCAgICAgICAgICAgICAgICAgIC8qIG5iX3Bvc2l0aXZlICovCisgICAgKHVuYXJ5ZnVuYylkZWx0YV9hYnMsICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hYnNvbHV0ZSAqLworICAgIChpbnF1aXJ5KWRlbHRhX25vbnplcm8sICAgICAgICAgICAgICAgICAgICAgLyogbmJfbm9uemVybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnZlcnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9sc2hpZnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9yc2hpZnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9hbmQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl94b3IqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9vciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2NvZXJjZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2ludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2xvbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9mbG9hdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX29jdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2hleCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfYWRkKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9zdWJ0cmFjdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfbXVsdGlwbHkqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2RpdmlkZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcmVtYWluZGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9wb3dlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfbHNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9yc2hpZnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2FuZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfeG9yKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9vciovCisgICAgZGVsdGFfZGl2aWRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9mbG9vcl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3RydWVfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeURhdGVUaW1lX0RlbHRhVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiZGF0ZXRpbWUudGltZWRlbHRhIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeURhdGVUaW1lX0RlbHRhKSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylkZWx0YV9yZXByLAkJCQkvKiB0cF9yZXByICovCi0JJmRlbHRhX2FzX251bWJlciwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylkZWx0YV9oYXNoLAkJCQkvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgIAkJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKWRlbHRhX3N0ciwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotCSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwJCQkvKiB0cF9mbGFncyAqLwotCWRlbHRhX2RvYywJCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKWRlbHRhX3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlkZWx0YV9tZXRob2RzLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCWRlbHRhX21lbWJlcnMsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCQkvKiB0cF9hbGxvYyAqLwotCWRlbHRhX25ldywJCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJkYXRldGltZS50aW1lZGVsdGEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5RGF0ZVRpbWVfRGVsdGEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWRlbHRhX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmZGVsdGFfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpZGVsdGFfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKWRlbHRhX3N0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGRlbHRhX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAocmljaGNtcGZ1bmMpZGVsdGFfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGRlbHRhX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZGVsdGFfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGRlbHRhX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoKQEAgLTIyMTcsMjYgKzIyMTcsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3llYXIoUHlEYXRlVGltZV9EYXRlICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKEdFVF9ZRUFSKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoR0VUX1lFQVIoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9tb250aChQeURhdGVUaW1lX0RhdGUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoR0VUX01PTlRIKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoR0VUX01PTlRIKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfZGF5KFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhHRVRfREFZKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoR0VUX0RBWShzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBkYXRlX2dldHNldFtdID0gewotCXsieWVhciIsICAgICAgICAoZ2V0dGVyKWRhdGVfeWVhcn0sCi0JeyJtb250aCIsICAgICAgIChnZXR0ZXIpZGF0ZV9tb250aH0sCi0JeyJkYXkiLCAgICAgICAgIChnZXR0ZXIpZGF0ZV9kYXl9LAotCXtOVUxMfQorICAgIHsieWVhciIsICAgICAgICAoZ2V0dGVyKWRhdGVfeWVhcn0sCisgICAgeyJtb250aCIsICAgICAgIChnZXR0ZXIpZGF0ZV9tb250aH0sCisgICAgeyJkYXkiLCAgICAgICAgIChnZXR0ZXIpZGF0ZV9kYXl9LAorICAgIHtOVUxMfQogfTsKIAogLyogQ29uc3RydWN0b3JzLiAqLwpAQCAtMjI0Niw2MCArMjI0Niw2MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqc2VsZiA9IE5VTEw7Ci0JUHlPYmplY3QgKnN0YXRlOwotCWludCB5ZWFyOwotCWludCBtb250aDsKLQlpbnQgZGF5OworICAgIFB5T2JqZWN0ICpzZWxmID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RhdGU7CisgICAgaW50IHllYXI7CisgICAgaW50IG1vbnRoOworICAgIGludCBkYXk7CiAKLQkvKiBDaGVjayBmb3IgaW52b2NhdGlvbiBmcm9tIHBpY2tsZSB3aXRoIF9fZ2V0c3RhdGVfXyBzdGF0ZSAqLwotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDEgJiYKLQkgICAgUHlTdHJpbmdfQ2hlY2soc3RhdGUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApKSAmJgotCSAgICBQeVN0cmluZ19HRVRfU0laRShzdGF0ZSkgPT0gX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSAmJgotCSAgICBNT05USF9JU19TQU5FKFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSlbMl0pKQotCXsKLQkgICAgCVB5RGF0ZVRpbWVfRGF0ZSAqbWU7CisgICAgLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCisgICAgICAgIFB5U3RyaW5nX0NoZWNrKHN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkgJiYKKyAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoc3RhdGUpID09IF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUgJiYKKyAgICAgICAgTU9OVEhfSVNfU0FORShQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpWzJdKSkKKyAgICB7CisgICAgICAgIFB5RGF0ZVRpbWVfRGF0ZSAqbWU7CiAKLQkJbWUgPSAoUHlEYXRlVGltZV9EYXRlICopICh0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSk7Ci0JCWlmIChtZSAhPSBOVUxMKSB7Ci0JCQljaGFyICpwZGF0YSA9IFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSk7Ci0JCQltZW1jcHkobWUtPmRhdGEsIHBkYXRhLCBfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFKTsKLQkJCW1lLT5oYXNoY29kZSA9IC0xOwotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKiltZTsKLQl9CisgICAgICAgIG1lID0gKFB5RGF0ZVRpbWVfRGF0ZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpOworICAgICAgICBpZiAobWUgIT0gTlVMTCkgeworICAgICAgICAgICAgY2hhciAqcGRhdGEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RhdGUpOworICAgICAgICAgICAgbWVtY3B5KG1lLT5kYXRhLCBwZGF0YSwgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSk7CisgICAgICAgICAgICBtZS0+aGFzaGNvZGUgPSAtMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopbWU7CisgICAgfQogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgImlpaSIsIGRhdGVfa3dzLAotCQkJCQkmeWVhciwgJm1vbnRoLCAmZGF5KSkgewotCQlpZiAoY2hlY2tfZGF0ZV9hcmdzKHllYXIsIG1vbnRoLCBkYXkpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlzZWxmID0gbmV3X2RhdGVfZXgoeWVhciwgbW9udGgsIGRheSwgdHlwZSk7Ci0JfQotCXJldHVybiBzZWxmOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJpaWkiLCBkYXRlX2t3cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5ZWFyLCAmbW9udGgsICZkYXkpKSB7CisgICAgICAgIGlmIChjaGVja19kYXRlX2FyZ3MoeWVhciwgbW9udGgsIGRheSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNlbGYgPSBuZXdfZGF0ZV9leCh5ZWFyLCBtb250aCwgZGF5LCB0eXBlKTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIC8qIFJldHVybiBuZXcgZGF0ZSBmcm9tIGxvY2FsdGltZSh0KS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2xvY2FsX2Zyb21fdGltZV90KFB5T2JqZWN0ICpjbHMsIGRvdWJsZSB0cykKIHsKLQlzdHJ1Y3QgdG0gKnRtOwotCXRpbWVfdCB0OwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIHN0cnVjdCB0bSAqdG07CisgICAgdGltZV90IHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQl0ID0gX1B5VGltZV9Eb3VibGVUb1RpbWV0KHRzKTsKLQlpZiAodCA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXRtID0gbG9jYWx0aW1lKCZ0KTsKLQlpZiAodG0pCi0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjbHMsICJpaWkiLAotCQkJCQkgICAgICAgdG0tPnRtX3llYXIgKyAxOTAwLAotCQkJCQkgICAgICAgdG0tPnRtX21vbiArIDEsCi0JCQkJCSAgICAgICB0bS0+dG1fbWRheSk7Ci0JZWxzZQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkidGltZXN0YW1wIG91dCBvZiByYW5nZSBmb3IgIgotCQkJCSJwbGF0Zm9ybSBsb2NhbHRpbWUoKSBmdW5jdGlvbiIpOwotCXJldHVybiByZXN1bHQ7CisgICAgdCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh0cyk7CisgICAgaWYgKHQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0bSA9IGxvY2FsdGltZSgmdCk7CisgICAgaWYgKHRtKQorICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9tb24gKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX21kYXkpOworICAgIGVsc2UKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIG91dCBvZiByYW5nZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtIGxvY2FsdGltZSgpIGZ1bmN0aW9uIik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIG5ldyBkYXRlIGZyb20gY3VycmVudCB0aW1lLgpAQCAtMjMxMCwzNCArMjMxMCwzNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfdG9kYXkoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmR1bW15KQogewotCVB5T2JqZWN0ICp0aW1lOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnRpbWU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCXRpbWUgPSB0aW1lX3RpbWUoKTsKLQlpZiAodGltZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB0aW1lID0gdGltZV90aW1lKCk7CisgICAgaWYgKHRpbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBOb3RlIHdlbGw6ICB0b2RheSgpIGlzIGEgY2xhc3MgbWV0aG9kLCBzbyB0aGlzIG1heSBub3QgY2FsbAotCSAqIGRhdGUuZnJvbXRpbWVzdGFtcC4gIEZvciBleGFtcGxlLCBpdCBtYXkgY2FsbAotCSAqIGRhdGV0aW1lLmZyb210aW1lc3RhbXAuICBUaGF0J3Mgd2h5IHdlIG5lZWQgYWxsIHRoZSBhY2N1cmFjeQotCSAqIHRpbWUudGltZSgpIGRlbGl2ZXJzOyBpZiBzb21lb25lIHdlcmUgZ29uem8gYWJvdXQgb3B0aW1pemF0aW9uLAotCSAqIGRhdGUudG9kYXkoKSBjb3VsZCBnZXQgYXdheSB3aXRoIHBsYWluIEMgdGltZSgpLgotCSAqLwotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoY2xzLCAiZnJvbXRpbWVzdGFtcCIsICJPIiwgdGltZSk7Ci0JUHlfREVDUkVGKHRpbWUpOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogTm90ZSB3ZWxsOiAgdG9kYXkoKSBpcyBhIGNsYXNzIG1ldGhvZCwgc28gdGhpcyBtYXkgbm90IGNhbGwKKyAgICAgKiBkYXRlLmZyb210aW1lc3RhbXAuICBGb3IgZXhhbXBsZSwgaXQgbWF5IGNhbGwKKyAgICAgKiBkYXRldGltZS5mcm9tdGltZXN0YW1wLiAgVGhhdCdzIHdoeSB3ZSBuZWVkIGFsbCB0aGUgYWNjdXJhY3kKKyAgICAgKiB0aW1lLnRpbWUoKSBkZWxpdmVyczsgaWYgc29tZW9uZSB3ZXJlIGdvbnpvIGFib3V0IG9wdGltaXphdGlvbiwKKyAgICAgKiBkYXRlLnRvZGF5KCkgY291bGQgZ2V0IGF3YXkgd2l0aCBwbGFpbiBDIHRpbWUoKS4KKyAgICAgKi8KKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGNscywgImZyb210aW1lc3RhbXAiLCAiTyIsIHRpbWUpOworICAgIFB5X0RFQ1JFRih0aW1lKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBSZXR1cm4gbmV3IGRhdGUgZnJvbSBnaXZlbiB0aW1lc3RhbXAgKFB5dGhvbiB0aW1lc3RhbXAgLS0gYSBkb3VibGUpLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfZnJvbXRpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgdGltZXN0YW1wOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIGRvdWJsZSB0aW1lc3RhbXA7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDpmcm9tdGltZXN0YW1wIiwgJnRpbWVzdGFtcCkpCi0JCXJlc3VsdCA9IGRhdGVfbG9jYWxfZnJvbV90aW1lX3QoY2xzLCB0aW1lc3RhbXApOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6ZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQorICAgICAgICByZXN1bHQgPSBkYXRlX2xvY2FsX2Zyb21fdGltZV90KGNscywgdGltZXN0YW1wKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBSZXR1cm4gbmV3IGRhdGUgZnJvbSBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwuICBSYWlzZXMgVmFsdWVFcnJvciBpZgpAQCAtMjM0NiwyNCArMjM0NiwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfZnJvbW9yZGluYWwoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JaW50IG9yZGluYWw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgaW50IG9yZGluYWw7CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpmcm9tb3JkaW5hbCIsICZvcmRpbmFsKSkgewotCQlpbnQgeWVhcjsKLQkJaW50IG1vbnRoOwotCQlpbnQgZGF5OworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmZyb21vcmRpbmFsIiwgJm9yZGluYWwpKSB7CisgICAgICAgIGludCB5ZWFyOworICAgICAgICBpbnQgbW9udGg7CisgICAgICAgIGludCBkYXk7CiAKLQkJaWYgKG9yZGluYWwgPCAxKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvcmRpbmFsIG11c3QgYmUgIgotCQkJCQkJCSAgIj49IDEiKTsKLQkJZWxzZSB7Ci0JCQlvcmRfdG9feW1kKG9yZGluYWwsICZ5ZWFyLCAmbW9udGgsICZkYXkpOwotCQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNscywgImlpaSIsCi0JCQkJCQkgICAgICAgeWVhciwgbW9udGgsIGRheSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgaWYgKG9yZGluYWwgPCAxKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJvcmRpbmFsIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PSAxIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb3JkX3RvX3ltZChvcmRpbmFsLCAmeWVhciwgJm1vbnRoLCAmZGF5KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjbHMsICJpaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIsIG1vbnRoLCBkYXkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qCkBAIC0yMzc2LDc0ICsyMzc2LDc0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWRkX2RhdGVfdGltZWRlbHRhKFB5RGF0ZVRpbWVfRGF0ZSAqZGF0ZSwgUHlEYXRlVGltZV9EZWx0YSAqZGVsdGEsIGludCBuZWdhdGUpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JaW50IHllYXIgPSBHRVRfWUVBUihkYXRlKTsKLQlpbnQgbW9udGggPSBHRVRfTU9OVEgoZGF0ZSk7Ci0JaW50IGRlbHRhZGF5cyA9IEdFVF9URF9EQVlTKGRlbHRhKTsKLQkvKiBDLWxldmVsIG92ZXJmbG93IGlzIGltcG9zc2libGUgYmVjYXVzZSB8ZGVsdGFkYXlzfCA8IDFlOS4gKi8KLQlpbnQgZGF5ID0gR0VUX0RBWShkYXRlKSArIChuZWdhdGUgPyAtZGVsdGFkYXlzIDogZGVsdGFkYXlzKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBpbnQgeWVhciA9IEdFVF9ZRUFSKGRhdGUpOworICAgIGludCBtb250aCA9IEdFVF9NT05USChkYXRlKTsKKyAgICBpbnQgZGVsdGFkYXlzID0gR0VUX1REX0RBWVMoZGVsdGEpOworICAgIC8qIEMtbGV2ZWwgb3ZlcmZsb3cgaXMgaW1wb3NzaWJsZSBiZWNhdXNlIHxkZWx0YWRheXN8IDwgMWU5LiAqLworICAgIGludCBkYXkgPSBHRVRfREFZKGRhdGUpICsgKG5lZ2F0ZSA/IC1kZWx0YWRheXMgOiBkZWx0YWRheXMpOwogCi0JaWYgKG5vcm1hbGl6ZV9kYXRlKCZ5ZWFyLCAmbW9udGgsICZkYXkpID49IDApCi0JCXJlc3VsdCA9IG5ld19kYXRlKHllYXIsIG1vbnRoLCBkYXkpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKG5vcm1hbGl6ZV9kYXRlKCZ5ZWFyLCAmbW9udGgsICZkYXkpID49IDApCisgICAgICAgIHJlc3VsdCA9IG5ld19kYXRlKHllYXIsIG1vbnRoLCBkYXkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2FkZChQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQogewotCWlmIChQeURhdGVUaW1lX0NoZWNrKGxlZnQpIHx8IFB5RGF0ZVRpbWVfQ2hlY2socmlnaHQpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JaWYgKFB5RGF0ZV9DaGVjayhsZWZ0KSkgewotCQkvKiBkYXRlICsgPz8/ICovCi0JCWlmIChQeURlbHRhX0NoZWNrKHJpZ2h0KSkKLQkJCS8qIGRhdGUgKyBkZWx0YSAqLwotCQkJcmV0dXJuIGFkZF9kYXRlX3RpbWVkZWx0YSgoUHlEYXRlVGltZV9EYXRlICopIGxlZnQsCi0JCQkJCQkgIChQeURhdGVUaW1lX0RlbHRhICopIHJpZ2h0LAotCQkJCQkJICAwKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qID8/PyArIGRhdGUKLQkJICogJ3JpZ2h0JyBtdXN0IGJlIG9uZSBvZiB1cywgb3Igd2Ugd291bGRuJ3QgaGF2ZSBiZWVuIGNhbGxlZAotCQkgKi8KLQkJaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkpCi0JCQkvKiBkZWx0YSArIGRhdGUgKi8KLQkJCXJldHVybiBhZGRfZGF0ZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZSAqKSByaWdodCwKLQkJCQkJCSAgKFB5RGF0ZVRpbWVfRGVsdGEgKikgbGVmdCwKLQkJCQkJCSAgMCk7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIGlmIChQeURhdGVUaW1lX0NoZWNrKGxlZnQpIHx8IFB5RGF0ZVRpbWVfQ2hlY2socmlnaHQpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgaWYgKFB5RGF0ZV9DaGVjayhsZWZ0KSkgeworICAgICAgICAvKiBkYXRlICsgPz8/ICovCisgICAgICAgIGlmIChQeURlbHRhX0NoZWNrKHJpZ2h0KSkKKyAgICAgICAgICAgIC8qIGRhdGUgKyBkZWx0YSAqLworICAgICAgICAgICAgcmV0dXJuIGFkZF9kYXRlX3RpbWVkZWx0YSgoUHlEYXRlVGltZV9EYXRlICopIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qID8/PyArIGRhdGUKKyAgICAgICAgICogJ3JpZ2h0JyBtdXN0IGJlIG9uZSBvZiB1cywgb3Igd2Ugd291bGRuJ3QgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKFB5RGVsdGFfQ2hlY2sobGVmdCkpCisgICAgICAgICAgICAvKiBkZWx0YSArIGRhdGUgKi8KKyAgICAgICAgICAgIHJldHVybiBhZGRfZGF0ZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZSAqKSByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKikgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9zdWJ0cmFjdChQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQogewotCWlmIChQeURhdGVUaW1lX0NoZWNrKGxlZnQpIHx8IFB5RGF0ZVRpbWVfQ2hlY2socmlnaHQpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JaWYgKFB5RGF0ZV9DaGVjayhsZWZ0KSkgewotCQlpZiAoUHlEYXRlX0NoZWNrKHJpZ2h0KSkgewotCQkJLyogZGF0ZSAtIGRhdGUgKi8KLQkJCWludCBsZWZ0X29yZCA9IHltZF90b19vcmQoR0VUX1lFQVIobGVmdCksCi0JCQkJCQkgIEdFVF9NT05USChsZWZ0KSwKLQkJCQkJCSAgR0VUX0RBWShsZWZ0KSk7Ci0JCQlpbnQgcmlnaHRfb3JkID0geW1kX3RvX29yZChHRVRfWUVBUihyaWdodCksCi0JCQkJCQkgICBHRVRfTU9OVEgocmlnaHQpLAotCQkJCQkJICAgR0VUX0RBWShyaWdodCkpOwotCQkJcmV0dXJuIG5ld19kZWx0YShsZWZ0X29yZCAtIHJpZ2h0X29yZCwgMCwgMCwgMCk7Ci0JCX0KLQkJaWYgKFB5RGVsdGFfQ2hlY2socmlnaHQpKSB7Ci0JCQkvKiBkYXRlIC0gZGVsdGEgKi8KLQkJCXJldHVybiBhZGRfZGF0ZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZSAqKSBsZWZ0LAotCQkJCQkJICAoUHlEYXRlVGltZV9EZWx0YSAqKSByaWdodCwKLQkJCQkJCSAgMSk7Ci0JCX0KLQl9Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgaWYgKFB5RGF0ZVRpbWVfQ2hlY2sobGVmdCkgfHwgUHlEYXRlVGltZV9DaGVjayhyaWdodCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICBpZiAoUHlEYXRlX0NoZWNrKGxlZnQpKSB7CisgICAgICAgIGlmIChQeURhdGVfQ2hlY2socmlnaHQpKSB7CisgICAgICAgICAgICAvKiBkYXRlIC0gZGF0ZSAqLworICAgICAgICAgICAgaW50IGxlZnRfb3JkID0geW1kX3RvX29yZChHRVRfWUVBUihsZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01PTlRIKGxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKGxlZnQpKTsKKyAgICAgICAgICAgIGludCByaWdodF9vcmQgPSB5bWRfdG9fb3JkKEdFVF9ZRUFSKHJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChyaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHJpZ2h0KSk7CisgICAgICAgICAgICByZXR1cm4gbmV3X2RlbHRhKGxlZnRfb3JkIC0gcmlnaHRfb3JkLCAwLCAwLCAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpIHsKKyAgICAgICAgICAgIC8qIGRhdGUgLSBkZWx0YSAqLworICAgICAgICAgICAgcmV0dXJuIGFkZF9kYXRlX3RpbWVkZWx0YSgoUHlEYXRlVGltZV9EYXRlICopIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKIH0KIAogCkBAIC0yNDUyLDg5ICsyNDUyLDg5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9yZXByKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQljaGFyIGJ1ZmZlclsxMDI4XTsKLQljb25zdCBjaGFyICp0eXBlX25hbWU7CisgICAgY2hhciBidWZmZXJbMTAyOF07CisgICAgY29uc3QgY2hhciAqdHlwZV9uYW1lOwogCi0JdHlwZV9uYW1lID0gUHlfVFlQRShzZWxmKS0+dHBfbmFtZTsKLQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyglZCwgJWQsICVkKSIsCi0JCSAgICAgIHR5cGVfbmFtZSwKLQkJICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CisgICAgdHlwZV9uYW1lID0gUHlfVFlQRShzZWxmKS0+dHBfbmFtZTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyglZCwgJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICB0eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpKTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfaXNvZm9ybWF0KFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQljaGFyIGJ1ZmZlclsxMjhdOworICAgIGNoYXIgYnVmZmVyWzEyOF07CiAKLQlpc29mb3JtYXRfZGF0ZShzZWxmLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWZmZXIpOworICAgIGlzb2Zvcm1hdF9kYXRlKHNlbGYsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CiB9CiAKIC8qIHN0cigpIGNhbGxzIHRoZSBhcHByb3ByaWF0ZSBpc29mb3JtYXQoKSBtZXRob2QuICovCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9zdHIoUHlEYXRlVGltZV9EYXRlICpzZWxmKQogewotCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKXNlbGYsICJpc29mb3JtYXQiLCAiKCkiKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAiaXNvZm9ybWF0IiwgIigpIik7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfY3RpbWUoUHlEYXRlVGltZV9EYXRlICpzZWxmKQogewotCXJldHVybiBmb3JtYXRfY3RpbWUoc2VsZiwgMCwgMCwgMCk7CisgICAgcmV0dXJuIGZvcm1hdF9jdGltZShzZWxmLCAwLCAwLCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfc3RyZnRpbWUoUHlEYXRlVGltZV9EYXRlICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCS8qIFRoaXMgbWV0aG9kIGNhbiBiZSBpbmhlcml0ZWQsIGFuZCBuZWVkcyB0byBjYWxsIHRoZQotCSAqIHRpbWV0dXBsZSgpIG1ldGhvZCBhcHByb3ByaWF0ZSB0byBzZWxmJ3MgY2xhc3MuCi0JICovCi0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqdHVwbGU7Ci0JY29uc3QgY2hhciAqZm9ybWF0OwotCVB5X3NzaXplX3QgZm9ybWF0X2xlbjsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZm9ybWF0IiwgTlVMTH07CisgICAgLyogVGhpcyBtZXRob2QgY2FuIGJlIGluaGVyaXRlZCwgYW5kIG5lZWRzIHRvIGNhbGwgdGhlCisgICAgICogdGltZXR1cGxlKCkgbWV0aG9kIGFwcHJvcHJpYXRlIHRvIHNlbGYncyBjbGFzcy4KKyAgICAgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp0dXBsZTsKKyAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgUHlfc3NpemVfdCBmb3JtYXRfbGVuOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJmb3JtYXQiLCBOVUxMfTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInMjOnN0cmZ0aW1lIiwga2V5d29yZHMsCi0JCQkJCSAgJmZvcm1hdCwgJmZvcm1hdF9sZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJzIzpzdHJmdGltZSIsIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LCAmZm9ybWF0X2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdHVwbGUgPSBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKXNlbGYsICJ0aW1ldHVwbGUiLCAiKCkiKTsKLQlpZiAodHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gd3JhcF9zdHJmdGltZSgoUHlPYmplY3QgKilzZWxmLCBmb3JtYXQsIGZvcm1hdF9sZW4sIHR1cGxlLAotCQkJICAgICAgIChQeU9iamVjdCAqKXNlbGYpOwotCVB5X0RFQ1JFRih0dXBsZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB0dXBsZSA9IFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopc2VsZiwgInRpbWV0dXBsZSIsICIoKSIpOworICAgIGlmICh0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSB3cmFwX3N0cmZ0aW1lKChQeU9iamVjdCAqKXNlbGYsIGZvcm1hdCwgZm9ybWF0X2xlbiwgdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilzZWxmKTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2Zvcm1hdChQeURhdGVUaW1lX0RhdGUgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpmb3JtYXQ7CisgICAgUHlPYmplY3QgKmZvcm1hdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpfX2Zvcm1hdF9fIiwgJmZvcm1hdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogQ2hlY2sgZm9yIHN0ciBvciB1bmljb2RlICovCi0JaWYgKFB5U3RyaW5nX0NoZWNrKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAvKiBJZiBmb3JtYXQgaXMgemVybyBsZW5ndGgsIHJldHVybiBzdHIoc2VsZikgKi8KLQkJaWYgKFB5U3RyaW5nX0dFVF9TSVpFKGZvcm1hdCkgPT0gMCkKLQkJCXJldHVybiBQeU9iamVjdF9TdHIoKFB5T2JqZWN0ICopc2VsZik7Ci0JfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0KSkgewotICAgICAgICAgICAgICAgIC8qIElmIGZvcm1hdCBpcyB6ZXJvIGxlbmd0aCwgcmV0dXJuIHN0cihzZWxmKSAqLwotCQlpZiAoUHlVbmljb2RlX0dFVF9TSVpFKGZvcm1hdCkgPT0gMCkKLQkJCXJldHVybiBQeU9iamVjdF9Vbmljb2RlKChQeU9iamVjdCAqKXNlbGYpOwotCX0gZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiX19mb3JtYXRfXyBleHBlY3RzIHN0ciBvciB1bmljb2RlLCBub3QgJS4yMDBzIiwKLQkJCSAgICAgUHlfVFlQRShmb3JtYXQpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKXNlbGYsICJzdHJmdGltZSIsICJPIiwgZm9ybWF0KTsKKyAgICAvKiBDaGVjayBmb3Igc3RyIG9yIHVuaWNvZGUgKi8KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZm9ybWF0KSkgeworICAgICAgICAvKiBJZiBmb3JtYXQgaXMgemVybyBsZW5ndGgsIHJldHVybiBzdHIoc2VsZikgKi8KKyAgICAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKGZvcm1hdCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBQeU9iamVjdF9TdHIoKFB5T2JqZWN0ICopc2VsZik7CisgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0KSkgeworICAgICAgICAvKiBJZiBmb3JtYXQgaXMgemVybyBsZW5ndGgsIHJldHVybiBzdHIoc2VsZikgKi8KKyAgICAgICAgaWYgKFB5VW5pY29kZV9HRVRfU0laRShmb3JtYXQpID09IDApCisgICAgICAgICAgICByZXR1cm4gUHlPYmplY3RfVW5pY29kZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJfX2Zvcm1hdF9fIGV4cGVjdHMgc3RyIG9yIHVuaWNvZGUsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShmb3JtYXQpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKXNlbGYsICJzdHJmdGltZSIsICJPIiwgZm9ybWF0KTsKIH0KIAogLyogSVNPIG1ldGhvZHMuICovCkBAIC0yNTQyLDMxICsyNTQyLDMxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9pc293ZWVrZGF5KFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlpbnQgZG93ID0gd2Vla2RheShHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpKTsKKyAgICBpbnQgZG93ID0gd2Vla2RheShHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhkb3cgKyAxKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZG93ICsgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2lzb2NhbGVuZGFyKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlpbnQgIHllYXIgICAgICAgICA9IEdFVF9ZRUFSKHNlbGYpOwotCWludCAgd2VlazFfbW9uZGF5ID0gaXNvX3dlZWsxX21vbmRheSh5ZWFyKTsKLQlpbnQgdG9kYXkgICAgICAgICA9IHltZF90b19vcmQoeWVhciwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpKTsKLQlpbnQgIHdlZWs7Ci0JaW50ICBkYXk7CisgICAgaW50ICB5ZWFyICAgICAgICAgPSBHRVRfWUVBUihzZWxmKTsKKyAgICBpbnQgIHdlZWsxX21vbmRheSA9IGlzb193ZWVrMV9tb25kYXkoeWVhcik7CisgICAgaW50IHRvZGF5ICAgICAgICAgPSB5bWRfdG9fb3JkKHllYXIsIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSk7CisgICAgaW50ICB3ZWVrOworICAgIGludCAgZGF5OwogCi0Jd2VlayA9IGRpdm1vZCh0b2RheSAtIHdlZWsxX21vbmRheSwgNywgJmRheSk7Ci0JaWYgKHdlZWsgPCAwKSB7Ci0JCS0teWVhcjsKLQkJd2VlazFfbW9uZGF5ID0gaXNvX3dlZWsxX21vbmRheSh5ZWFyKTsKLQkJd2VlayA9IGRpdm1vZCh0b2RheSAtIHdlZWsxX21vbmRheSwgNywgJmRheSk7Ci0JfQotCWVsc2UgaWYgKHdlZWsgPj0gNTIgJiYgdG9kYXkgPj0gaXNvX3dlZWsxX21vbmRheSh5ZWFyICsgMSkpIHsKLQkJKyt5ZWFyOwotCQl3ZWVrID0gMDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIHllYXIsIHdlZWsgKyAxLCBkYXkgKyAxKTsKKyAgICB3ZWVrID0gZGl2bW9kKHRvZGF5IC0gd2VlazFfbW9uZGF5LCA3LCAmZGF5KTsKKyAgICBpZiAod2VlayA8IDApIHsKKyAgICAgICAgLS15ZWFyOworICAgICAgICB3ZWVrMV9tb25kYXkgPSBpc29fd2VlazFfbW9uZGF5KHllYXIpOworICAgICAgICB3ZWVrID0gZGl2bW9kKHRvZGF5IC0gd2VlazFfbW9uZGF5LCA3LCAmZGF5KTsKKyAgICB9CisgICAgZWxzZSBpZiAod2VlayA+PSA1MiAmJiB0b2RheSA+PSBpc29fd2VlazFfbW9uZGF5KHllYXIgKyAxKSkgeworICAgICAgICArK3llYXI7CisgICAgICAgIHdlZWsgPSAwOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpIiwgeWVhciwgd2VlayArIDEsIGRheSArIDEpOwogfQogCiAvKiBNaXNjZWxsYW5lb3VzIG1ldGhvZHMuICovCkBAIC0yNTc4LDUzICsyNTc4LDUzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV9yaWNoY29tcGFyZShQeURhdGVUaW1lX0RhdGUgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewotCWludCBkaWZmID0gNDI7CS8qIG5vbnNlbnNlICovCisgICAgaW50IGRpZmYgPSA0MjsgICAgICAvKiBub25zZW5zZSAqLwogCi0JaWYgKFB5RGF0ZV9DaGVjayhvdGhlcikpCi0JCWRpZmYgPSBtZW1jbXAoc2VsZi0+ZGF0YSwgKChQeURhdGVUaW1lX0RhdGUgKilvdGhlciktPmRhdGEsCi0JCQkgICAgICBfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFKTsKKyAgICBpZiAoUHlEYXRlX0NoZWNrKG90aGVyKSkKKyAgICAgICAgZGlmZiA9IG1lbWNtcChzZWxmLT5kYXRhLCAoKFB5RGF0ZVRpbWVfRGF0ZSAqKW90aGVyKS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFKTsKIAotCWVsc2UgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcob3RoZXIsICJ0aW1ldHVwbGUiKSkgewotCQkvKiBBIGhvb2sgZm9yIG90aGVyIGtpbmRzIG9mIGRhdGUgb2JqZWN0cy4gKi8KLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQllbHNlIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkKLQkJZGlmZiA9IDE7CS8qIGFueSBub24temVybyB2YWx1ZSB3aWxsIGRvICovCisgICAgZWxzZSBpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhvdGhlciwgInRpbWV0dXBsZSIpKSB7CisgICAgICAgIC8qIEEgaG9vayBmb3Igb3RoZXIga2luZHMgb2YgZGF0ZSBvYmplY3RzLiAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKQorICAgICAgICBkaWZmID0gMTsgICAgICAgICAgICAgICAvKiBhbnkgbm9uLXplcm8gdmFsdWUgd2lsbCBkbyAqLwogCi0JZWxzZSAvKiBzdG9wIHRoaXMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uICovCi0JCXJldHVybiBjbXBlcnJvcigoUHlPYmplY3QgKilzZWxmLCBvdGhlcik7CisgICAgZWxzZSAvKiBzdG9wIHRoaXMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uICovCisgICAgICAgIHJldHVybiBjbXBlcnJvcigoUHlPYmplY3QgKilzZWxmLCBvdGhlcik7CiAKLQlyZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKKyAgICByZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfdGltZXR1cGxlKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlyZXR1cm4gYnVpbGRfc3RydWN0X3RpbWUoR0VUX1lFQVIoc2VsZiksCi0JCQkJIEdFVF9NT05USChzZWxmKSwKLQkJCQkgR0VUX0RBWShzZWxmKSwKLQkJCQkgMCwgMCwgMCwgLTEpOworICAgIHJldHVybiBidWlsZF9zdHJ1Y3RfdGltZShHRVRfWUVBUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01PTlRIKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAtMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3JlcGxhY2UoUHlEYXRlVGltZV9EYXRlICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpjbG9uZTsKLQlQeU9iamVjdCAqdHVwbGU7Ci0JaW50IHllYXIgPSBHRVRfWUVBUihzZWxmKTsKLQlpbnQgbW9udGggPSBHRVRfTU9OVEgoc2VsZik7Ci0JaW50IGRheSA9IEdFVF9EQVkoc2VsZik7CisgICAgUHlPYmplY3QgKmNsb25lOworICAgIFB5T2JqZWN0ICp0dXBsZTsKKyAgICBpbnQgeWVhciA9IEdFVF9ZRUFSKHNlbGYpOworICAgIGludCBtb250aCA9IEdFVF9NT05USChzZWxmKTsKKyAgICBpbnQgZGF5ID0gR0VUX0RBWShzZWxmKTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWk6cmVwbGFjZSIsIGRhdGVfa3dzLAotCQkJCQkgICZ5ZWFyLCAmbW9udGgsICZkYXkpKQotCQlyZXR1cm4gTlVMTDsKLQl0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaSIsIHllYXIsIG1vbnRoLCBkYXkpOwotCWlmICh0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQljbG9uZSA9IGRhdGVfbmV3KFB5X1RZUEUoc2VsZiksIHR1cGxlLCBOVUxMKTsKLQlQeV9ERUNSRUYodHVwbGUpOwotCXJldHVybiBjbG9uZTsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8aWlpOnJlcGxhY2UiLCBkYXRlX2t3cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnllYXIsICZtb250aCwgJmRheSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiaWlpIiwgeWVhciwgbW9udGgsIGRheSk7CisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNsb25lID0gZGF0ZV9uZXcoUHlfVFlQRShzZWxmKSwgdHVwbGUsIE5VTEwpOworICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgcmV0dXJuIGNsb25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKmRhdGVfZ2V0c3RhdGUoUHlEYXRlVGltZV9EYXRlICpzZWxmKTsKQEAgLTI2MzIsMjkgKzI2MzIsMjkgQEAKIHN0YXRpYyBsb25nCiBkYXRlX2hhc2goUHlEYXRlVGltZV9EYXRlICpzZWxmKQogewotCWlmIChzZWxmLT5oYXNoY29kZSA9PSAtMSkgewotCQlQeU9iamVjdCAqdGVtcCA9IGRhdGVfZ2V0c3RhdGUoc2VsZik7Ci0JCWlmICh0ZW1wICE9IE5VTEwpIHsKLQkJCXNlbGYtPmhhc2hjb2RlID0gUHlPYmplY3RfSGFzaCh0ZW1wKTsKLQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJfQotCX0KLQlyZXR1cm4gc2VsZi0+aGFzaGNvZGU7CisgICAgaWYgKHNlbGYtPmhhc2hjb2RlID09IC0xKSB7CisgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gZGF0ZV9nZXRzdGF0ZShzZWxmKTsKKyAgICAgICAgaWYgKHRlbXAgIT0gTlVMTCkgeworICAgICAgICAgICAgc2VsZi0+aGFzaGNvZGUgPSBQeU9iamVjdF9IYXNoKHRlbXApOworICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZWxmLT5oYXNoY29kZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGVfdG9vcmRpbmFsKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeW1kX3RvX29yZChHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLAotCQkJCQkgR0VUX0RBWShzZWxmKSkpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh5bWRfdG9fb3JkKEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShzZWxmKSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZV93ZWVrZGF5KFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlpbnQgZG93ID0gd2Vla2RheShHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpKTsKKyAgICBpbnQgZG93ID0gd2Vla2RheShHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhkb3cpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhkb3cpOwogfQogCiAvKiBQaWNrbGUgc3VwcG9ydCwgYSBzaW1wbGUgdXNlIG9mIF9fcmVkdWNlX18uICovCkBAIC0yNjYzLDEzNiArMjY2MywxMzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX2dldHN0YXRlKFB5RGF0ZVRpbWVfRGF0ZSAqc2VsZikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgKLQkJIihOKSIsCi0JCVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+ZGF0YSwKLQkJCQkJICAgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKAorICAgICAgICAiKE4pIiwKKyAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRlX3JlZHVjZShQeURhdGVUaW1lX0RhdGUgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTikiLCBQeV9UWVBFKHNlbGYpLCBkYXRlX2dldHN0YXRlKHNlbGYpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIGRhdGVfZ2V0c3RhdGUoc2VsZikpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGF0ZV9tZXRob2RzW10gPSB7CiAKLQkvKiBDbGFzcyBtZXRob2RzOiAqLworICAgIC8qIENsYXNzIG1ldGhvZHM6ICovCiAKLQl7ImZyb210aW1lc3RhbXAiLCAoUHlDRnVuY3Rpb24pZGF0ZV9mcm9tdGltZXN0YW1wLCBNRVRIX1ZBUkFSR1MgfAotCQkJCQkJCSAgIE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigidGltZXN0YW1wIC0+IGxvY2FsIGRhdGUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSAiCi0JIAkgICAidGltZS50aW1lKCkpLiIpfSwKKyAgICB7ImZyb210aW1lc3RhbXAiLCAoUHlDRnVuY3Rpb24pZGF0ZV9mcm9tdGltZXN0YW1wLCBNRVRIX1ZBUkFSR1MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfQ0xBU1MsCisgICAgIFB5RG9jX1NUUigidGltZXN0YW1wIC0+IGxvY2FsIGRhdGUgZnJvbSBhIFBPU0lYIHRpbWVzdGFtcCAobGlrZSAiCisgICAgICAgICAgICAgICAidGltZS50aW1lKCkpLiIpfSwKIAotCXsiZnJvbW9yZGluYWwiLCAoUHlDRnVuY3Rpb24pZGF0ZV9mcm9tb3JkaW5hbCwJTUVUSF9WQVJBUkdTIHwKLQkJCQkJCQlNRVRIX0NMQVNTLAotCSBQeURvY19TVFIoImludCAtPiBkYXRlIGNvcnJlc3BvbmRpbmcgdG8gYSBwcm9sZXB0aWMgR3JlZ29yaWFuICIKLQkgCSAgICJvcmRpbmFsLiIpfSwKKyAgICB7ImZyb21vcmRpbmFsIiwgKFB5Q0Z1bmN0aW9uKWRhdGVfZnJvbW9yZGluYWwsICAgICAgTUVUSF9WQVJBUkdTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoImludCAtPiBkYXRlIGNvcnJlc3BvbmRpbmcgdG8gYSBwcm9sZXB0aWMgR3JlZ29yaWFuICIKKyAgICAgICAgICAgICAgICJvcmRpbmFsLiIpfSwKIAotCXsidG9kYXkiLCAgICAgICAgIChQeUNGdW5jdGlvbilkYXRlX3RvZGF5LCAgIE1FVEhfTk9BUkdTIHwgTUVUSF9DTEFTUywKLQkgUHlEb2NfU1RSKCJDdXJyZW50IGRhdGUgb3IgZGF0ZXRpbWU6ICBzYW1lIGFzICIKLQkgCSAgICJzZWxmLl9fY2xhc3NfXy5mcm9tdGltZXN0YW1wKHRpbWUudGltZSgpKS4iKX0sCisgICAgeyJ0b2RheSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfdG9kYXksICAgTUVUSF9OT0FSR1MgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoIkN1cnJlbnQgZGF0ZSBvciBkYXRldGltZTogIHNhbWUgYXMgIgorICAgICAgICAgICAgICAgInNlbGYuX19jbGFzc19fLmZyb210aW1lc3RhbXAodGltZS50aW1lKCkpLiIpfSwKIAotCS8qIEluc3RhbmNlIG1ldGhvZHM6ICovCisgICAgLyogSW5zdGFuY2UgbWV0aG9kczogKi8KIAotCXsiY3RpbWUiLCAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZV9jdGltZSwgICAgICAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBjdGltZSgpIHN0eWxlIHN0cmluZy4iKX0sCisgICAgeyJjdGltZSIsICAgICAgIChQeUNGdW5jdGlvbilkYXRlX2N0aW1lLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIGN0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKIAotCXsic3RyZnRpbWUiLCAgIAkoUHlDRnVuY3Rpb24pZGF0ZV9zdHJmdGltZSwJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkgUHlEb2NfU1RSKCJmb3JtYXQgLT4gc3RyZnRpbWUoKSBzdHlsZSBzdHJpbmcuIil9LAorICAgIHsic3RyZnRpbWUiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfc3RyZnRpbWUsICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICBQeURvY19TVFIoImZvcm1hdCAtPiBzdHJmdGltZSgpIHN0eWxlIHN0cmluZy4iKX0sCiAKLQl7Il9fZm9ybWF0X18iLCAJKFB5Q0Z1bmN0aW9uKWRhdGVfZm9ybWF0LAlNRVRIX1ZBUkFSR1MsCi0JIFB5RG9jX1NUUigiRm9ybWF0cyBzZWxmIHdpdGggc3RyZnRpbWUuIil9LAorICAgIHsiX19mb3JtYXRfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGVfZm9ybWF0LCAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIFB5RG9jX1NUUigiRm9ybWF0cyBzZWxmIHdpdGggc3RyZnRpbWUuIil9LAogCi0JeyJ0aW1ldHVwbGUiLCAgIChQeUNGdW5jdGlvbilkYXRlX3RpbWV0dXBsZSwgICAgTUVUSF9OT0FSR1MsCi0gICAgICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIHR1cGxlLCBjb21wYXRpYmxlIHdpdGggdGltZS5sb2NhbHRpbWUoKS4iKX0sCisgICAgeyJ0aW1ldHVwbGUiLCAgIChQeUNGdW5jdGlvbilkYXRlX3RpbWV0dXBsZSwgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgdHVwbGUsIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLiIpfSwKIAotCXsiaXNvY2FsZW5kYXIiLCAoUHlDRnVuY3Rpb24pZGF0ZV9pc29jYWxlbmRhciwgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyBJU08geWVhciwgd2VlayBudW1iZXIsIGFuZCAiCi0JIAkgICAid2Vla2RheS4iKX0sCisgICAgeyJpc29jYWxlbmRhciIsIChQeUNGdW5jdGlvbilkYXRlX2lzb2NhbGVuZGFyLCAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIElTTyB5ZWFyLCB3ZWVrIG51bWJlciwgYW5kICIKKyAgICAgICAgICAgICAgICJ3ZWVrZGF5LiIpfSwKIAotCXsiaXNvZm9ybWF0IiwgICAoUHlDRnVuY3Rpb24pZGF0ZV9pc29mb3JtYXQsCU1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCBZWVlZLU1NLURELiIpfSwKKyAgICB7Imlzb2Zvcm1hdCIsICAgKFB5Q0Z1bmN0aW9uKWRhdGVfaXNvZm9ybWF0LCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQsIFlZWVktTU0tREQuIil9LAogCi0JeyJpc293ZWVrZGF5IiwgIChQeUNGdW5jdGlvbilkYXRlX2lzb3dlZWtkYXksICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIHRoZSBkYXkgb2YgdGhlIHdlZWsgcmVwcmVzZW50ZWQgYnkgdGhlIGRhdGUuXG4iCi0JIAkgICAiTW9uZGF5ID09IDEgLi4uIFN1bmRheSA9PSA3Iil9LAorICAgIHsiaXNvd2Vla2RheSIsICAoUHlDRnVuY3Rpb24pZGF0ZV9pc293ZWVrZGF5LCAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiB0aGUgZGF5IG9mIHRoZSB3ZWVrIHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRlLlxuIgorICAgICAgICAgICAgICAgIk1vbmRheSA9PSAxIC4uLiBTdW5kYXkgPT0gNyIpfSwKIAotCXsidG9vcmRpbmFsIiwgICAoUHlDRnVuY3Rpb24pZGF0ZV90b29yZGluYWwsICAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBwcm9sZXB0aWMgR3JlZ29yaWFuIG9yZGluYWwuICBKYW51YXJ5IDEgb2YgeWVhciAiCi0JIAkgICAiMSBpcyBkYXkgMS4iKX0sCisgICAgeyJ0b29yZGluYWwiLCAgIChQeUNGdW5jdGlvbilkYXRlX3Rvb3JkaW5hbCwgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHByb2xlcHRpYyBHcmVnb3JpYW4gb3JkaW5hbC4gIEphbnVhcnkgMSBvZiB5ZWFyICIKKyAgICAgICAgICAgICAgICIxIGlzIGRheSAxLiIpfSwKIAotCXsid2Vla2RheSIsICAgICAoUHlDRnVuY3Rpb24pZGF0ZV93ZWVrZGF5LCAgICAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiB0aGUgZGF5IG9mIHRoZSB3ZWVrIHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRlLlxuIgotCQkgICAiTW9uZGF5ID09IDAgLi4uIFN1bmRheSA9PSA2Iil9LAorICAgIHsid2Vla2RheSIsICAgICAoUHlDRnVuY3Rpb24pZGF0ZV93ZWVrZGF5LCAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiB0aGUgZGF5IG9mIHRoZSB3ZWVrIHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRlLlxuIgorICAgICAgICAgICAgICAgIk1vbmRheSA9PSAwIC4uLiBTdW5kYXkgPT0gNiIpfSwKIAotCXsicmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24pZGF0ZV9yZXBsYWNlLCAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigiUmV0dXJuIGRhdGUgd2l0aCBuZXcgc3BlY2lmaWVkIGZpZWxkcy4iKX0sCisgICAgeyJyZXBsYWNlIiwgICAgIChQeUNGdW5jdGlvbilkYXRlX3JlcGxhY2UsICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gZGF0ZSB3aXRoIG5ldyBzcGVjaWZpZWQgZmllbGRzLiIpfSwKIAotCXsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilkYXRlX3JlZHVjZSwgICAgICAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIl9fcmVkdWNlX18oKSAtPiAoY2xzLCBzdGF0ZSkiKX0sCisgICAgeyJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKWRhdGVfcmVkdWNlLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiX19yZWR1Y2VfXygpIC0+IChjbHMsIHN0YXRlKSIpfSwKIAotCXtOVUxMLAlOVUxMfQorICAgIHtOVUxMLCAgICAgIE5VTEx9CiB9OwogCiBzdGF0aWMgY2hhciBkYXRlX2RvY1tdID0KIFB5RG9jX1NUUigiZGF0ZSh5ZWFyLCBtb250aCwgZGF5KSAtLT4gZGF0ZSBvYmplY3QiKTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBkYXRlX2FzX251bWJlciA9IHsKLQlkYXRlX2FkZCwJCQkJCS8qIG5iX2FkZCAqLwotCWRhdGVfc3VidHJhY3QsCQkJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCTAsCQkJCQkJLyogbmJfbXVsdGlwbHkgKi8KLQkwLAkJCQkJCS8qIG5iX2RpdmlkZSAqLwotCTAsCQkJCQkJLyogbmJfcmVtYWluZGVyICovCi0JMCwJCQkJCQkvKiBuYl9kaXZtb2QgKi8KLQkwLAkJCQkJCS8qIG5iX3Bvd2VyICovCi0JMCwJCQkJCQkvKiBuYl9uZWdhdGl2ZSAqLwotCTAsCQkJCQkJLyogbmJfcG9zaXRpdmUgKi8KLQkwLAkJCQkJCS8qIG5iX2Fic29sdXRlICovCi0JMCwJCQkJCQkvKiBuYl9ub256ZXJvICovCisgICAgZGF0ZV9hZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2FkZCAqLworICAgIGRhdGVfc3VidHJhY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9zdWJ0cmFjdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcmVtYWluZGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3dlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9uZWdhdGl2ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hYnNvbHV0ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9ub256ZXJvICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5RGF0ZVRpbWVfRGF0ZVR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImRhdGV0aW1lLmRhdGUiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5RGF0ZVRpbWVfRGF0ZSksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsCQkJCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZGF0ZV9yZXByLAkJCQkvKiB0cF9yZXByICovCi0JJmRhdGVfYXNfbnVtYmVyLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWRhdGVfaGFzaCwJCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkJLyogdHBfY2FsbCAqLwotCShyZXByZnVuYylkYXRlX3N0ciwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLAkJCQkvKiB0cF9mbGFncyAqLwotCWRhdGVfZG9jLAkJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkJLyogdHBfY2xlYXIgKi8KLQkocmljaGNtcGZ1bmMpZGF0ZV9yaWNoY29tcGFyZSwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGF0ZV9tZXRob2RzLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkJLyogdHBfbWVtYmVycyAqLwotCWRhdGVfZ2V0c2V0LAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkJLyogdHBfYWxsb2MgKi8KLQlkYXRlX25ldywJCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJkYXRldGltZS5kYXRlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5RGF0ZVRpbWVfRGF0ZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWRhdGVfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmZGF0ZV9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpZGF0ZV9oYXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKWRhdGVfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGRhdGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAocmljaGNtcGZ1bmMpZGF0ZV9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGRhdGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBkYXRlX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGRhdGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyoKQEAgLTI4MTUsMTAgKzI4MTUsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0emluZm9fbm9nbyhjb25zdCBjaGFyKiBtZXRob2RuYW1lKQogewotCVB5RXJyX0Zvcm1hdChQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAotCQkgICAgICJhIHR6aW5mbyBzdWJjbGFzcyBtdXN0IGltcGxlbWVudCAlcygpIiwKLQkJICAgICBtZXRob2RuYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKKyAgICAgICAgICAgICAgICAgImEgdHppbmZvIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50ICVzKCkiLAorICAgICAgICAgICAgICAgICBtZXRob2RuYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogTWV0aG9kcy4gIEEgc3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlc2UuICovCkBAIC0yODI2LDEwMSArMjgyNiwxMDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0emluZm9fdHpuYW1lKFB5RGF0ZVRpbWVfVFpJbmZvICpzZWxmLCBQeU9iamVjdCAqZHQpCiB7Ci0JcmV0dXJuIHR6aW5mb19ub2dvKCJ0em5hbWUiKTsKKyAgICByZXR1cm4gdHppbmZvX25vZ28oInR6bmFtZSIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHppbmZvX3V0Y29mZnNldChQeURhdGVUaW1lX1RaSW5mbyAqc2VsZiwgUHlPYmplY3QgKmR0KQogewotCXJldHVybiB0emluZm9fbm9nbygidXRjb2Zmc2V0Iik7CisgICAgcmV0dXJuIHR6aW5mb19ub2dvKCJ1dGNvZmZzZXQiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR6aW5mb19kc3QoUHlEYXRlVGltZV9UWkluZm8gKnNlbGYsIFB5T2JqZWN0ICpkdCkKIHsKLQlyZXR1cm4gdHppbmZvX25vZ28oImRzdCIpOworICAgIHJldHVybiB0emluZm9fbm9nbygiZHN0Iik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0emluZm9fZnJvbXV0YyhQeURhdGVUaW1lX1RaSW5mbyAqc2VsZiwgUHlEYXRlVGltZV9EYXRlVGltZSAqZHQpCiB7Ci0JaW50IHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzOworICAgIGludCB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1czsKIAotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaW50IG9mZiwgZHN0OwotCWludCBub25lOwotCWludCBkZWx0YTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBvZmYsIGRzdDsKKyAgICBpbnQgbm9uZTsKKyAgICBpbnQgZGVsdGE7CiAKLQlpZiAoISBQeURhdGVUaW1lX0NoZWNrKGR0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJmcm9tdXRjOiBhcmd1bWVudCBtdXN0IGJlIGEgZGF0ZXRpbWUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghIEhBU1RaSU5GTyhkdCkgfHwgZHQtPnR6aW5mbyAhPSAoUHlPYmplY3QgKilzZWxmKSB7Ci0JICAgIAlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZyb211dGM6IGR0LnR6aW5mbyAiCi0JICAgIAkJCSJpcyBub3Qgc2VsZiIpOwotCSAgICAJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghIFB5RGF0ZVRpbWVfQ2hlY2soZHQpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbXV0YzogYXJndW1lbnQgbXVzdCBiZSBhIGRhdGV0aW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoISBIQVNUWklORk8oZHQpIHx8IGR0LT50emluZm8gIT0gKFB5T2JqZWN0ICopc2VsZikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZyb211dGM6IGR0LnR6aW5mbyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IHNlbGYiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jb2ZmID0gY2FsbF91dGNvZmZzZXQoZHQtPnR6aW5mbywgKFB5T2JqZWN0ICopZHQsICZub25lKTsKLQlpZiAob2ZmID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChub25lKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZnJvbXV0Yzogbm9uLU5vbmUgIgotCQkJCSJ1dGNvZmZzZXQoKSByZXN1bHQgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG9mZiA9IGNhbGxfdXRjb2Zmc2V0KGR0LT50emluZm8sIChQeU9iamVjdCAqKWR0LCAmbm9uZSk7CisgICAgaWYgKG9mZiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobm9uZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZyb211dGM6IG5vbi1Ob25lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1dGNvZmZzZXQoKSByZXN1bHQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZHN0ID0gY2FsbF9kc3QoZHQtPnR6aW5mbywgKFB5T2JqZWN0ICopZHQsICZub25lKTsKLQlpZiAoZHN0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChub25lKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZnJvbXV0Yzogbm9uLU5vbmUgIgotCQkJCSJkc3QoKSByZXN1bHQgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGRzdCA9IGNhbGxfZHN0KGR0LT50emluZm8sIChQeU9iamVjdCAqKWR0LCAmbm9uZSk7CisgICAgaWYgKGRzdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobm9uZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZyb211dGM6IG5vbi1Ob25lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkc3QoKSByZXN1bHQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JeSA9IEdFVF9ZRUFSKGR0KTsKLQltID0gR0VUX01PTlRIKGR0KTsKLQlkID0gR0VUX0RBWShkdCk7Ci0JaGggPSBEQVRFX0dFVF9IT1VSKGR0KTsKLQltbSA9IERBVEVfR0VUX01JTlVURShkdCk7Ci0Jc3MgPSBEQVRFX0dFVF9TRUNPTkQoZHQpOwotCXVzID0gREFURV9HRVRfTUlDUk9TRUNPTkQoZHQpOworICAgIHkgPSBHRVRfWUVBUihkdCk7CisgICAgbSA9IEdFVF9NT05USChkdCk7CisgICAgZCA9IEdFVF9EQVkoZHQpOworICAgIGhoID0gREFURV9HRVRfSE9VUihkdCk7CisgICAgbW0gPSBEQVRFX0dFVF9NSU5VVEUoZHQpOworICAgIHNzID0gREFURV9HRVRfU0VDT05EKGR0KTsKKyAgICB1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKGR0KTsKIAotCWRlbHRhID0gb2ZmIC0gZHN0OwotCW1tICs9IGRlbHRhOwotCWlmICgobW0gPCAwIHx8IG1tID49IDYwKSAmJgotCSAgICBub3JtYWxpemVfZGF0ZXRpbWUoJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IG5ld19kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgZHQtPnR6aW5mbyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gcmVzdWx0OworICAgIGRlbHRhID0gb2ZmIC0gZHN0OworICAgIG1tICs9IGRlbHRhOworICAgIGlmICgobW0gPCAwIHx8IG1tID49IDYwKSAmJgorICAgICAgICBub3JtYWxpemVfZGF0ZXRpbWUoJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IG5ld19kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgZHQtPnR6aW5mbyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gcmVzdWx0OwogCi0JZHN0ID0gY2FsbF9kc3QoZHQtPnR6aW5mbywgcmVzdWx0LCAmbm9uZSk7Ci0JaWYgKGRzdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlnb3RvIEZhaWw7Ci0JaWYgKG5vbmUpCi0JCWdvdG8gSW5jb25zaXN0ZW50OwotCWlmIChkc3QgPT0gMCkKLQkJcmV0dXJuIHJlc3VsdDsKKyAgICBkc3QgPSBjYWxsX2RzdChkdC0+dHppbmZvLCByZXN1bHQsICZub25lKTsKKyAgICBpZiAoZHN0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGdvdG8gRmFpbDsKKyAgICBpZiAobm9uZSkKKyAgICAgICAgZ290byBJbmNvbnNpc3RlbnQ7CisgICAgaWYgKGRzdCA9PSAwKQorICAgICAgICByZXR1cm4gcmVzdWx0OwogCi0JbW0gKz0gZHN0OwotCWlmICgobW0gPCAwIHx8IG1tID49IDYwKSAmJgotCSAgICBub3JtYWxpemVfZGF0ZXRpbWUoJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzKSA8IDApCi0JCWdvdG8gRmFpbDsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXN1bHQgPSBuZXdfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGR0LT50emluZm8pOwotCXJldHVybiByZXN1bHQ7CisgICAgbW0gKz0gZHN0OworICAgIGlmICgobW0gPCAwIHx8IG1tID49IDYwKSAmJgorICAgICAgICBub3JtYWxpemVfZGF0ZXRpbWUoJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzKSA8IDApCisgICAgICAgIGdvdG8gRmFpbDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXN1bHQgPSBuZXdfZGF0ZXRpbWUoeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIGR0LT50emluZm8pOworICAgIHJldHVybiByZXN1bHQ7CiAKIEluY29uc2lzdGVudDoKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImZyb211dGM6IHR6LmRzdCgpIGdhdmUiCi0JCQkiaW5jb25zaXN0ZW50IHJlc3VsdHM7IGNhbm5vdCBjb252ZXJ0Iik7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmcm9tdXRjOiB0ei5kc3QoKSBnYXZlIgorICAgICAgICAgICAgICAgICAgICAiaW5jb25zaXN0ZW50IHJlc3VsdHM7IGNhbm5vdCBjb252ZXJ0Iik7CiAKLQkvKiBmYWxsIHRocnUgdG8gZmFpbHVyZSAqLworICAgIC8qIGZhbGwgdGhydSB0byBmYWlsdXJlICovCiBGYWlsOgotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKgpAQCAtMjkzMSwxMjQgKzI5MzEsMTI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHppbmZvX3JlZHVjZShQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqYXJncywgKnN0YXRlLCAqdG1wOwotCVB5T2JqZWN0ICpnZXRpbml0YXJncywgKmdldHN0YXRlOworICAgIFB5T2JqZWN0ICphcmdzLCAqc3RhdGUsICp0bXA7CisgICAgUHlPYmplY3QgKmdldGluaXRhcmdzLCAqZ2V0c3RhdGU7CiAKLQl0bXAgPSBQeVR1cGxlX05ldygwKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHRtcCA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlnZXRpbml0YXJncyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZiwgIl9fZ2V0aW5pdGFyZ3NfXyIpOwotCWlmIChnZXRpbml0YXJncyAhPSBOVUxMKSB7Ci0JCWFyZ3MgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldGluaXRhcmdzLCB0bXApOwotCQlQeV9ERUNSRUYoZ2V0aW5pdGFyZ3MpOwotCQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodG1wKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9DbGVhcigpOwotCQlhcmdzID0gdG1wOwotCQlQeV9JTkNSRUYoYXJncyk7Ci0JfQorICAgIGdldGluaXRhcmdzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAiX19nZXRpbml0YXJnc19fIik7CisgICAgaWYgKGdldGluaXRhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgYXJncyA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZ2V0aW5pdGFyZ3MsIHRtcCk7CisgICAgICAgIFB5X0RFQ1JFRihnZXRpbml0YXJncyk7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGFyZ3MgPSB0bXA7CisgICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICB9CiAKLQlnZXRzdGF0ZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZiwgIl9fZ2V0c3RhdGVfXyIpOwotCWlmIChnZXRzdGF0ZSAhPSBOVUxMKSB7Ci0JCXN0YXRlID0gUHlPYmplY3RfQ2FsbE9iamVjdChnZXRzdGF0ZSwgdG1wKTsKLQkJUHlfREVDUkVGKGdldHN0YXRlKTsKLQkJaWYgKHN0YXRlID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJCVB5X0RFQ1JFRih0bXApOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICoqZGljdHB0cjsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJc3RhdGUgPSBQeV9Ob25lOwotCQlkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoc2VsZik7Ci0JCWlmIChkaWN0cHRyICYmICpkaWN0cHRyICYmIFB5RGljdF9TaXplKCpkaWN0cHRyKSkKLQkJCXN0YXRlID0gKmRpY3RwdHI7Ci0JCVB5X0lOQ1JFRihzdGF0ZSk7Ci0JfQorICAgIGdldHN0YXRlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLCAiX19nZXRzdGF0ZV9fIik7CisgICAgaWYgKGdldHN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdGUgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldHN0YXRlLCB0bXApOworICAgICAgICBQeV9ERUNSRUYoZ2V0c3RhdGUpOworICAgICAgICBpZiAoc3RhdGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKipkaWN0cHRyOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBzdGF0ZSA9IFB5X05vbmU7CisgICAgICAgIGRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihzZWxmKTsKKyAgICAgICAgaWYgKGRpY3RwdHIgJiYgKmRpY3RwdHIgJiYgUHlEaWN0X1NpemUoKmRpY3RwdHIpKQorICAgICAgICAgICAgc3RhdGUgPSAqZGljdHB0cjsKKyAgICAgICAgUHlfSU5DUkVGKHN0YXRlKTsKKyAgICB9CiAKLQlQeV9ERUNSRUYodG1wKTsKKyAgICBQeV9ERUNSRUYodG1wKTsKIAotCWlmIChzdGF0ZSA9PSBQeV9Ob25lKSB7Ci0JCVB5X0RFQ1JFRihzdGF0ZSk7Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgYXJncyk7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTk4pIiwgUHlfVFlQRShzZWxmKSwgYXJncywgc3RhdGUpOworICAgIGlmIChzdGF0ZSA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0RFQ1JFRihzdGF0ZSk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgYXJncyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTk4pIiwgUHlfVFlQRShzZWxmKSwgYXJncywgc3RhdGUpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgdHppbmZvX21ldGhvZHNbXSA9IHsKIAotCXsidHpuYW1lIiwJKFB5Q0Z1bmN0aW9uKXR6aW5mb190em5hbWUsCQlNRVRIX08sCi0JIFB5RG9jX1NUUigiZGF0ZXRpbWUgLT4gc3RyaW5nIG5hbWUgb2YgdGltZSB6b25lLiIpfSwKKyAgICB7InR6bmFtZSIsICAgICAgICAgIChQeUNGdW5jdGlvbil0emluZm9fdHpuYW1lLCAgICAgICAgICAgICBNRVRIX08sCisgICAgIFB5RG9jX1NUUigiZGF0ZXRpbWUgLT4gc3RyaW5nIG5hbWUgb2YgdGltZSB6b25lLiIpfSwKIAotCXsidXRjb2Zmc2V0IiwJKFB5Q0Z1bmN0aW9uKXR6aW5mb191dGNvZmZzZXQsCQlNRVRIX08sCi0JIFB5RG9jX1NUUigiZGF0ZXRpbWUgLT4gbWludXRlcyBlYXN0IG9mIFVUQyAobmVnYXRpdmUgZm9yICIKLQkgCSAgICJ3ZXN0IG9mIFVUQykuIil9LAorICAgIHsidXRjb2Zmc2V0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKXR6aW5mb191dGNvZmZzZXQsICAgICAgICAgIE1FVEhfTywKKyAgICAgUHlEb2NfU1RSKCJkYXRldGltZSAtPiBtaW51dGVzIGVhc3Qgb2YgVVRDIChuZWdhdGl2ZSBmb3IgIgorICAgICAgICAgICAgICAgIndlc3Qgb2YgVVRDKS4iKX0sCiAKLQl7ImRzdCIsCQkoUHlDRnVuY3Rpb24pdHppbmZvX2RzdCwJCU1FVEhfTywKLQkgUHlEb2NfU1RSKCJkYXRldGltZSAtPiBEU1Qgb2Zmc2V0IGluIG1pbnV0ZXMgZWFzdCBvZiBVVEMuIil9LAorICAgIHsiZHN0IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXR6aW5mb19kc3QsICAgICAgICAgICAgICAgIE1FVEhfTywKKyAgICAgUHlEb2NfU1RSKCJkYXRldGltZSAtPiBEU1Qgb2Zmc2V0IGluIG1pbnV0ZXMgZWFzdCBvZiBVVEMuIil9LAogCi0JeyJmcm9tdXRjIiwJKFB5Q0Z1bmN0aW9uKXR6aW5mb19mcm9tdXRjLAkJTUVUSF9PLAotCSBQeURvY19TVFIoImRhdGV0aW1lIGluIFVUQyAtPiBkYXRldGltZSBpbiBsb2NhbCB0aW1lLiIpfSwKKyAgICB7ImZyb211dGMiLCAgICAgICAgIChQeUNGdW5jdGlvbil0emluZm9fZnJvbXV0YywgICAgICAgICAgICBNRVRIX08sCisgICAgIFB5RG9jX1NUUigiZGF0ZXRpbWUgaW4gVVRDIC0+IGRhdGV0aW1lIGluIGxvY2FsIHRpbWUuIil9LAogCi0JeyJfX3JlZHVjZV9fIiwgIChQeUNGdW5jdGlvbil0emluZm9fcmVkdWNlLCAgICAgICAgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCItPiAoY2xzLCBzdGF0ZSkiKX0sCisgICAgeyJfX3JlZHVjZV9fIiwgIChQeUNGdW5jdGlvbil0emluZm9fcmVkdWNlLCAgICAgICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCItPiAoY2xzLCBzdGF0ZSkiKX0sCiAKLQl7TlVMTCwgTlVMTH0KKyAgICB7TlVMTCwgTlVMTH0KIH07CiAKIHN0YXRpYyBjaGFyIHR6aW5mb19kb2NbXSA9CiBQeURvY19TVFIoIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRpbWUgem9uZSBpbmZvIG9iamVjdHMuIik7CiAKIHN0YXRpY2hlcmUgUHlUeXBlT2JqZWN0IFB5RGF0ZVRpbWVfVFpJbmZvVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLAkJCQkJLyogb2Jfc2l6ZSAqLwotCSJkYXRldGltZS50emluZm8iLAkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHlEYXRlVGltZV9UWkluZm8pLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgIAkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLAkJCS8qIHRwX2ZsYWdzICovCi0JdHppbmZvX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQl0emluZm9fbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlQeVR5cGVfR2VuZXJpY05ldywJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICJkYXRldGltZS50emluZm8iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeURhdGVUaW1lX1RaSW5mbyksICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICB0emluZm9fZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgdHppbmZvX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAvKgpAQCAtMzA2MSw0MyArMzA2MSw0MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfaG91cihQeURhdGVUaW1lX1RpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNRV9HRVRfSE9VUihzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUVfR0VUX0hPVVIoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9taW51dGUoUHlEYXRlVGltZV9UaW1lICpzZWxmLCB2b2lkICp1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUVfR0VUX01JTlVURShzZWxmKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUVfR0VUX01JTlVURShzZWxmKSk7CiB9CiAKIC8qIFRoZSBuYW1lIHRpbWVfc2Vjb25kIGNvbmZsaWN0ZWQgd2l0aCBzb21lIHBsYXRmb3JtIGhlYWRlciBmaWxlLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHB5X3RpbWVfc2Vjb25kKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1FX0dFVF9TRUNPTkQoc2VsZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1FX0dFVF9TRUNPTkQoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9taWNyb3NlY29uZChQeURhdGVUaW1lX1RpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3R6aW5mbyhQeURhdGVUaW1lX1RpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiB0aW1lX2dldHNldFtdID0gewotCXsiaG91ciIsICAgICAgICAoZ2V0dGVyKXRpbWVfaG91cn0sCi0JeyJtaW51dGUiLCAgICAgIChnZXR0ZXIpdGltZV9taW51dGV9LAotCXsic2Vjb25kIiwgICAgICAoZ2V0dGVyKXB5X3RpbWVfc2Vjb25kfSwKLQl7Im1pY3Jvc2Vjb25kIiwgKGdldHRlcil0aW1lX21pY3Jvc2Vjb25kfSwKLQl7InR6aW5mbyIsCShnZXR0ZXIpdGltZV90emluZm99LAotCXtOVUxMfQorICAgIHsiaG91ciIsICAgICAgICAoZ2V0dGVyKXRpbWVfaG91cn0sCisgICAgeyJtaW51dGUiLCAgICAgIChnZXR0ZXIpdGltZV9taW51dGV9LAorICAgIHsic2Vjb25kIiwgICAgICAoZ2V0dGVyKXB5X3RpbWVfc2Vjb25kfSwKKyAgICB7Im1pY3Jvc2Vjb25kIiwgKGdldHRlcil0aW1lX21pY3Jvc2Vjb25kfSwKKyAgICB7InR6aW5mbyIsICAgICAgICAgIChnZXR0ZXIpdGltZV90emluZm99LAorICAgIHtOVUxMfQogfTsKIAogLyoKQEAgLTMxMDUsNjQgKzMxMDUsNjQgQEAKICAqLwogCiBzdGF0aWMgY2hhciAqdGltZV9rd3NbXSA9IHsiaG91ciIsICJtaW51dGUiLCAic2Vjb25kIiwgIm1pY3Jvc2Vjb25kIiwKLQkJCSAgICJ0emluZm8iLCBOVUxMfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0emluZm8iLCBOVUxMfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqc2VsZiA9IE5VTEw7Ci0JUHlPYmplY3QgKnN0YXRlOwotCWludCBob3VyID0gMDsKLQlpbnQgbWludXRlID0gMDsKLQlpbnQgc2Vjb25kID0gMDsKLQlpbnQgdXNlY29uZCA9IDA7Ci0JUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnNlbGYgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzdGF0ZTsKKyAgICBpbnQgaG91ciA9IDA7CisgICAgaW50IG1pbnV0ZSA9IDA7CisgICAgaW50IHNlY29uZCA9IDA7CisgICAgaW50IHVzZWNvbmQgPSAwOworICAgIFB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOwogCi0JLyogQ2hlY2sgZm9yIGludm9jYXRpb24gZnJvbSBwaWNrbGUgd2l0aCBfX2dldHN0YXRlX18gc3RhdGUgKi8KLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA+PSAxICYmCi0JICAgIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPD0gMiAmJgotCSAgICBQeVN0cmluZ19DaGVjayhzdGF0ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCkpICYmCi0JICAgIFB5U3RyaW5nX0dFVF9TSVpFKHN0YXRlKSA9PSBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFICYmCi0JICAgICgodW5zaWduZWQgY2hhcikgKFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSlbMF0pKSA8IDI0KQotCXsKLQkJUHlEYXRlVGltZV9UaW1lICptZTsKLQkJY2hhciBhd2FyZTsKKyAgICAvKiBDaGVjayBmb3IgaW52b2NhdGlvbiBmcm9tIHBpY2tsZSB3aXRoIF9fZ2V0c3RhdGVfXyBzdGF0ZSAqLworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID49IDEgJiYKKyAgICAgICAgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8PSAyICYmCisgICAgICAgIFB5U3RyaW5nX0NoZWNrKHN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkgJiYKKyAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoc3RhdGUpID09IF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUgJiYKKyAgICAgICAgKCh1bnNpZ25lZCBjaGFyKSAoUHlTdHJpbmdfQVNfU1RSSU5HKHN0YXRlKVswXSkpIDwgMjQpCisgICAgeworICAgICAgICBQeURhdGVUaW1lX1RpbWUgKm1lOworICAgICAgICBjaGFyIGF3YXJlOwogCi0JCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDIpIHsKLQkJCXR6aW5mbyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMSk7Ci0JCQlpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJhZCAiCi0JCQkJCSJ0emluZm8gc3RhdGUgYXJnIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJYXdhcmUgPSAoY2hhcikodHppbmZvICE9IFB5X05vbmUpOwotCQltZSA9IChQeURhdGVUaW1lX1RpbWUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIGF3YXJlKSk7Ci0JCWlmIChtZSAhPSBOVUxMKSB7Ci0JCQljaGFyICpwZGF0YSA9IFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSk7CisgICAgICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDIpIHsKKyAgICAgICAgICAgIHR6aW5mbyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMSk7CisgICAgICAgICAgICBpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJhZCAiCisgICAgICAgICAgICAgICAgICAgICJ0emluZm8gc3RhdGUgYXJnIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXdhcmUgPSAoY2hhcikodHppbmZvICE9IFB5X05vbmUpOworICAgICAgICBtZSA9IChQeURhdGVUaW1lX1RpbWUgKikgKHR5cGUtPnRwX2FsbG9jKHR5cGUsIGF3YXJlKSk7CisgICAgICAgIGlmIChtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjaGFyICpwZGF0YSA9IFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSk7CiAKLQkJCW1lbWNweShtZS0+ZGF0YSwgcGRhdGEsIF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUpOwotCQkJbWUtPmhhc2hjb2RlID0gLTE7Ci0JCQltZS0+aGFzdHppbmZvID0gYXdhcmU7Ci0JCQlpZiAoYXdhcmUpIHsKLQkJCQlQeV9JTkNSRUYodHppbmZvKTsKLQkJCQltZS0+dHppbmZvID0gdHppbmZvOwotCQkJfQotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKiltZTsKLQl9CisgICAgICAgICAgICBtZW1jcHkobWUtPmRhdGEsIHBkYXRhLCBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKKyAgICAgICAgICAgIG1lLT5oYXNoY29kZSA9IC0xOworICAgICAgICAgICAgbWUtPmhhc3R6aW5mbyA9IGF3YXJlOworICAgICAgICAgICAgaWYgKGF3YXJlKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHR6aW5mbyk7CisgICAgICAgICAgICAgICAgbWUtPnR6aW5mbyA9IHR6aW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopbWU7CisgICAgfQogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpTyIsIHRpbWVfa3dzLAotCQkJCQkmaG91ciwgJm1pbnV0ZSwgJnNlY29uZCwgJnVzZWNvbmQsCi0JCQkJCSZ0emluZm8pKSB7Ci0JCWlmIChjaGVja190aW1lX2FyZ3MoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXNlbGYgPSBuZXdfdGltZV9leChob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCwgdHppbmZvLAotCQkJCSAgIHR5cGUpOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGlpaWlPIiwgdGltZV9rd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG91ciwgJm1pbnV0ZSwgJnNlY29uZCwgJnVzZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHppbmZvKSkgeworICAgICAgICBpZiAoY2hlY2tfdGltZV9hcmdzKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzZWxmID0gbmV3X3RpbWVfZXgoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIHR6aW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogLyoKQEAgLTMxNzIsMTAgKzMxNzIsMTAgQEAKIHN0YXRpYyB2b2lkCiB0aW1lX2RlYWxsb2MoUHlEYXRlVGltZV9UaW1lICpzZWxmKQogewotCWlmIChIQVNUWklORk8oc2VsZikpIHsKLQkJUHlfWERFQ1JFRihzZWxmLT50emluZm8pOwotCX0KLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChIQVNUWklORk8oc2VsZikpIHsKKyAgICAgICAgUHlfWERFQ1JFRihzZWxmLT50emluZm8pOworICAgIH0KKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiAvKgpAQCAtMzE4NSwyMCArMzE4NSwyMCBAQAogLyogVGhlc2UgYXJlIGFsbCBNRVRIX05PQVJHUywgc28gZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgYXJnbGlzdC4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3V0Y29mZnNldChQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKLQlyZXR1cm4gb2Zmc2V0X2FzX3RpbWVkZWx0YShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAotCQkJCSAgICJ1dGNvZmZzZXQiLCBQeV9Ob25lKTsKKyAgICByZXR1cm4gb2Zmc2V0X2FzX3RpbWVkZWx0YShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1dGNvZmZzZXQiLCBQeV9Ob25lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfZHN0KFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewotCXJldHVybiBvZmZzZXRfYXNfdGltZWRlbHRhKEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCi0JCQkJICAgImRzdCIsIFB5X05vbmUpOworICAgIHJldHVybiBvZmZzZXRfYXNfdGltZWRlbHRhKEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRzdCIsIFB5X05vbmUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV90em5hbWUoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0JcmV0dXJuIGNhbGxfdHpuYW1lKEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCi0JCQkgICBQeV9Ob25lKTsKKyAgICByZXR1cm4gY2FsbF90em5hbWUoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CiB9CiAKIC8qCkBAIC0zMjA4LDk0ICszMjA4LDk0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9yZXByKFB5RGF0ZVRpbWVfVGltZSAqc2VsZikKIHsKLQljaGFyIGJ1ZmZlclsxMDBdOwotCWNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IFB5X1RZUEUoc2VsZiktPnRwX25hbWU7Ci0JaW50IGggPSBUSU1FX0dFVF9IT1VSKHNlbGYpOwotCWludCBtID0gVElNRV9HRVRfTUlOVVRFKHNlbGYpOwotCWludCBzID0gVElNRV9HRVRfU0VDT05EKHNlbGYpOwotCWludCB1cyA9IFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIGNoYXIgYnVmZmVyWzEwMF07CisgICAgY29uc3QgY2hhciAqdHlwZV9uYW1lID0gUHlfVFlQRShzZWxmKS0+dHBfbmFtZTsKKyAgICBpbnQgaCA9IFRJTUVfR0VUX0hPVVIoc2VsZik7CisgICAgaW50IG0gPSBUSU1FX0dFVF9NSU5VVEUoc2VsZik7CisgICAgaW50IHMgPSBUSU1FX0dFVF9TRUNPTkQoc2VsZik7CisgICAgaW50IHVzID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQlpZiAodXMpCi0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICIlcyglZCwgJWQsICVkLCAlZCkiLCB0eXBlX25hbWUsIGgsIG0sIHMsIHVzKTsKLQllbHNlIGlmIChzKQotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCi0JCQkgICAgICAiJXMoJWQsICVkLCAlZCkiLCB0eXBlX25hbWUsIGgsIG0sIHMpOwotCWVsc2UKLQkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICAgICAgIiVzKCVkLCAlZCkiLCB0eXBlX25hbWUsIGgsIG0pOwotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKLQlpZiAocmVzdWx0ICE9IE5VTEwgJiYgSEFTVFpJTkZPKHNlbGYpKQotCQlyZXN1bHQgPSBhcHBlbmRfa2V5d29yZF90emluZm8ocmVzdWx0LCBzZWxmLT50emluZm8pOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHVzKQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkLCAlZCwgJWQsICVkKSIsIHR5cGVfbmFtZSwgaCwgbSwgcywgdXMpOworICAgIGVsc2UgaWYgKHMpCisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQsICVkLCAlZCkiLCB0eXBlX25hbWUsIGgsIG0sIHMpOworICAgIGVsc2UKKyAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICIlcyglZCwgJWQpIiwgdHlwZV9uYW1lLCBoLCBtKTsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIEhBU1RaSU5GTyhzZWxmKSkKKyAgICAgICAgcmVzdWx0ID0gYXBwZW5kX2tleXdvcmRfdHppbmZvKHJlc3VsdCwgc2VsZi0+dHppbmZvKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9zdHIoUHlEYXRlVGltZV9UaW1lICpzZWxmKQogewotCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKChQeU9iamVjdCAqKXNlbGYsICJpc29mb3JtYXQiLCAiKCkiKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAiaXNvZm9ybWF0IiwgIigpIik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2lzb2Zvcm1hdChQeURhdGVUaW1lX1RpbWUgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlQeU9iamVjdCAqcmVzdWx0OwotCS8qIFJldXNlIHRoZSB0aW1lIGZvcm1hdCBjb2RlIGZyb20gdGhlIGRhdGV0aW1lIHR5cGUuICovCi0JUHlEYXRlVGltZV9EYXRlVGltZSBkYXRldGltZTsKLQlQeURhdGVUaW1lX0RhdGVUaW1lICpwZGF0ZXRpbWUgPSAmZGF0ZXRpbWU7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIC8qIFJldXNlIHRoZSB0aW1lIGZvcm1hdCBjb2RlIGZyb20gdGhlIGRhdGV0aW1lIHR5cGUuICovCisgICAgUHlEYXRlVGltZV9EYXRlVGltZSBkYXRldGltZTsKKyAgICBQeURhdGVUaW1lX0RhdGVUaW1lICpwZGF0ZXRpbWUgPSAmZGF0ZXRpbWU7CiAKLQkvKiBDb3B5IG92ZXIganVzdCB0aGUgdGltZSBieXRlcy4gKi8KLQltZW1jcHkocGRhdGV0aW1lLT5kYXRhICsgX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRSwKLQkgICAgICAgc2VsZi0+ZGF0YSwKLQkgICAgICAgX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSk7CisgICAgLyogQ29weSBvdmVyIGp1c3QgdGhlIHRpbWUgYnl0ZXMuICovCisgICAgbWVtY3B5KHBkYXRldGltZS0+ZGF0YSArIF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUsCisgICAgICAgICAgIHNlbGYtPmRhdGEsCisgICAgICAgICAgIF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUpOwogCi0JaXNvZm9ybWF0X3RpbWUocGRhdGV0aW1lLCBidWYsIHNpemVvZihidWYpKTsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICEgSEFTVFpJTkZPKHNlbGYpIHx8IHNlbGYtPnR6aW5mbyA9PSBQeV9Ob25lKQotCQlyZXR1cm4gcmVzdWx0OworICAgIGlzb2Zvcm1hdF90aW1lKHBkYXRldGltZSwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCAhIEhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAotCS8qIFdlIG5lZWQgdG8gYXBwZW5kIHRoZSBVVEMgb2Zmc2V0LiAqLwotCWlmIChmb3JtYXRfdXRjb2Zmc2V0KGJ1Ziwgc2l6ZW9mKGJ1ZiksICI6Iiwgc2VsZi0+dHppbmZvLAotCQkJICAgICBQeV9Ob25lKSA8IDApIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnJlc3VsdCwgUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIFdlIG5lZWQgdG8gYXBwZW5kIHRoZSBVVEMgb2Zmc2V0LiAqLworICAgIGlmIChmb3JtYXRfdXRjb2Zmc2V0KGJ1Ziwgc2l6ZW9mKGJ1ZiksICI6Iiwgc2VsZi0+dHppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVzdWx0LCBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZikpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX3N0cmZ0aW1lKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICp0dXBsZTsKLQljb25zdCBjaGFyICpmb3JtYXQ7Ci0JUHlfc3NpemVfdCBmb3JtYXRfbGVuOwotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJmb3JtYXQiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp0dXBsZTsKKyAgICBjb25zdCBjaGFyICpmb3JtYXQ7CisgICAgUHlfc3NpemVfdCBmb3JtYXRfbGVuOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJmb3JtYXQiLCBOVUxMfTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInMjOnN0cmZ0aW1lIiwga2V5d29yZHMsCi0JCQkJCSAgJmZvcm1hdCwgJmZvcm1hdF9sZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJzIzpzdHJmdGltZSIsIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LCAmZm9ybWF0X2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogUHl0aG9uJ3Mgc3RyZnRpbWUgZG9lcyBpbnNhbmUgdGhpbmdzIHdpdGggdGhlIHllYXIgcGFydCBvZiB0aGUKLQkgKiB0aW1ldHVwbGUuICBUaGUgeWVhciBpcyBmb3JjZWQgdG8gKHRoZSBvdGhlcndpc2Ugbm9uc2Vuc2ljYWwpCi0JICogMTkwMCB0byB3b3JtIGFyb3VuZCB0aGF0LgotCSAqLwotCXR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiaWlpaWlpaWlpIiwKLQkJICAgICAgICAgICAgICAxOTAwLCAxLCAxLCAvKiB5ZWFyLCBtb250aCwgZGF5ICovCi0JCQkgICAgICBUSU1FX0dFVF9IT1VSKHNlbGYpLAotCQkJICAgICAgVElNRV9HRVRfTUlOVVRFKHNlbGYpLAotCQkJICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpLAotCQkJICAgICAgMCwgMSwgLTEpOyAvKiB3ZWVrZGF5LCBkYXludW0sIGRzdCAqLwotCWlmICh0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoUHlUdXBsZV9TaXplKHR1cGxlKSA9PSA5KTsKLQlyZXN1bHQgPSB3cmFwX3N0cmZ0aW1lKChQeU9iamVjdCAqKXNlbGYsIGZvcm1hdCwgZm9ybWF0X2xlbiwgdHVwbGUsCi0JCQkgICAgICAgUHlfTm9uZSk7Ci0JUHlfREVDUkVGKHR1cGxlKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIFB5dGhvbidzIHN0cmZ0aW1lIGRvZXMgaW5zYW5lIHRoaW5ncyB3aXRoIHRoZSB5ZWFyIHBhcnQgb2YgdGhlCisgICAgICogdGltZXR1cGxlLiAgVGhlIHllYXIgaXMgZm9yY2VkIHRvICh0aGUgb3RoZXJ3aXNlIG5vbnNlbnNpY2FsKQorICAgICAqIDE5MDAgdG8gd29ybSBhcm91bmQgdGhhdC4KKyAgICAgKi8KKyAgICB0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaWlpaWlpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MDAsIDEsIDEsIC8qIHllYXIsIG1vbnRoLCBkYXkgKi8KKyAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX0hPVVIoc2VsZiksCisgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAwLCAxLCAtMSk7IC8qIHdlZWtkYXksIGRheW51bSwgZHN0ICovCisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChQeVR1cGxlX1NpemUodHVwbGUpID09IDkpOworICAgIHJlc3VsdCA9IHdyYXBfc3RyZnRpbWUoKFB5T2JqZWN0ICopc2VsZiwgZm9ybWF0LCBmb3JtYXRfbGVuLCB0dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpOworICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTMzMDksMTQ2ICszMzA5LDE0NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfcmljaGNvbXBhcmUoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlpbnQgZGlmZjsKLQluYWl2ZXR5IG4xLCBuMjsKLQlpbnQgb2Zmc2V0MSwgb2Zmc2V0MjsKKyAgICBpbnQgZGlmZjsKKyAgICBuYWl2ZXR5IG4xLCBuMjsKKyAgICBpbnQgb2Zmc2V0MSwgb2Zmc2V0MjsKIAotCWlmICghIFB5VGltZV9DaGVjayhvdGhlcikpIHsKLQkJaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSB7Ci0JCQlQeU9iamVjdCAqcmVzdWx0ID0gb3AgPT0gUHlfRVEgPyBQeV9GYWxzZSA6IFB5X1RydWU7Ci0JCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJLyogU3RvcCB0aGlzIGZyb20gZmFsbGluZyBiYWNrIHRvIGFkZHJlc3MgY29tcGFyaXNvbi4gKi8KLQkJcmV0dXJuIGNtcGVycm9yKChQeU9iamVjdCAqKXNlbGYsIG90aGVyKTsKLQl9Ci0JaWYgKGNsYXNzaWZ5X3R3b191dGNvZmZzZXRzKChQeU9iamVjdCAqKXNlbGYsICZvZmZzZXQxLCAmbjEsIFB5X05vbmUsCi0JCQkJICAgICBvdGhlciwgJm9mZnNldDIsICZuMiwgUHlfTm9uZSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQobjEgIT0gT0ZGU0VUX1VOS05PV04gJiYgbjIgIT0gT0ZGU0VUX1VOS05PV04pOwotCS8qIElmIHRoZXkncmUgYm90aCBuYWl2ZSwgb3IgYm90aCBhd2FyZSBhbmQgaGF2ZSB0aGUgc2FtZSBvZmZzZXRzLAotCSAqIHdlIGdldCBvZmYgY2hlYXAuICBOb3RlIHRoYXQgaWYgdGhleSdyZSBib3RoIG5haXZlLCBvZmZzZXQxID09Ci0JICogb2Zmc2V0MiA9PSAwIGF0IHRoaXMgcG9pbnQuCi0JICovCi0JaWYgKG4xID09IG4yICYmIG9mZnNldDEgPT0gb2Zmc2V0MikgewotCQlkaWZmID0gbWVtY21wKHNlbGYtPmRhdGEsICgoUHlEYXRlVGltZV9UaW1lICopb3RoZXIpLT5kYXRhLAotCQkJICAgICAgX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSk7Ci0JCXJldHVybiBkaWZmX3RvX2Jvb2woZGlmZiwgb3ApOwotCX0KKyAgICBpZiAoISBQeVRpbWVfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IG9wID09IFB5X0VRID8gUHlfRmFsc2UgOiBQeV9UcnVlOworICAgICAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIC8qIFN0b3AgdGhpcyBmcm9tIGZhbGxpbmcgYmFjayB0byBhZGRyZXNzIGNvbXBhcmlzb24uICovCisgICAgICAgIHJldHVybiBjbXBlcnJvcigoUHlPYmplY3QgKilzZWxmLCBvdGhlcik7CisgICAgfQorICAgIGlmIChjbGFzc2lmeV90d29fdXRjb2Zmc2V0cygoUHlPYmplY3QgKilzZWxmLCAmb2Zmc2V0MSwgJm4xLCBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIsICZvZmZzZXQyLCAmbjIsIFB5X05vbmUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KG4xICE9IE9GRlNFVF9VTktOT1dOICYmIG4yICE9IE9GRlNFVF9VTktOT1dOKTsKKyAgICAvKiBJZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9yIGJvdGggYXdhcmUgYW5kIGhhdmUgdGhlIHNhbWUgb2Zmc2V0cywKKyAgICAgKiB3ZSBnZXQgb2ZmIGNoZWFwLiAgTm90ZSB0aGF0IGlmIHRoZXkncmUgYm90aCBuYWl2ZSwgb2Zmc2V0MSA9PQorICAgICAqIG9mZnNldDIgPT0gMCBhdCB0aGlzIHBvaW50LgorICAgICAqLworICAgIGlmIChuMSA9PSBuMiAmJiBvZmZzZXQxID09IG9mZnNldDIpIHsKKyAgICAgICAgZGlmZiA9IG1lbWNtcChzZWxmLT5kYXRhLCAoKFB5RGF0ZVRpbWVfVGltZSAqKW90aGVyKS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKKyAgICAgICAgcmV0dXJuIGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7CisgICAgfQogCi0JaWYgKG4xID09IE9GRlNFVF9BV0FSRSAmJiBuMiA9PSBPRkZTRVRfQVdBUkUpIHsKLQkJYXNzZXJ0KG9mZnNldDEgIT0gb2Zmc2V0Mik7CS8qIGVsc2UgbGFzdCAiaWYiIGhhbmRsZWQgaXQgKi8KLQkJLyogQ29udmVydCBldmVyeXRoaW5nIGV4Y2VwdCBtaWNyb3NlY29uZHMgdG8gc2Vjb25kcy4gIFRoZXNlCi0JCSAqIGNhbid0IG92ZXJmbG93IChubyBtb3JlIHRoYW4gdGhlICMgb2Ygc2Vjb25kcyBpbiAyIGRheXMpLgotCQkgKi8KLQkJb2Zmc2V0MSA9IFRJTUVfR0VUX0hPVVIoc2VsZikgKiAzNjAwICsKLQkJCSAgKFRJTUVfR0VUX01JTlVURShzZWxmKSAtIG9mZnNldDEpICogNjAgKwotCQkJICBUSU1FX0dFVF9TRUNPTkQoc2VsZik7Ci0JCW9mZnNldDIgPSBUSU1FX0dFVF9IT1VSKG90aGVyKSAqIDM2MDAgKwotCQkJICAoVElNRV9HRVRfTUlOVVRFKG90aGVyKSAtIG9mZnNldDIpICogNjAgKwotCQkJICBUSU1FX0dFVF9TRUNPTkQob3RoZXIpOwotCQlkaWZmID0gb2Zmc2V0MSAtIG9mZnNldDI7Ci0JCWlmIChkaWZmID09IDApCi0JCQlkaWZmID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZikgLQotCQkJICAgICAgIFRJTUVfR0VUX01JQ1JPU0VDT05EKG90aGVyKTsKLQkJcmV0dXJuIGRpZmZfdG9fYm9vbChkaWZmLCBvcCk7Ci0JfQorICAgIGlmIChuMSA9PSBPRkZTRVRfQVdBUkUgJiYgbjIgPT0gT0ZGU0VUX0FXQVJFKSB7CisgICAgICAgIGFzc2VydChvZmZzZXQxICE9IG9mZnNldDIpOyAgICAgICAgICAgICAvKiBlbHNlIGxhc3QgImlmIiBoYW5kbGVkIGl0ICovCisgICAgICAgIC8qIENvbnZlcnQgZXZlcnl0aGluZyBleGNlcHQgbWljcm9zZWNvbmRzIHRvIHNlY29uZHMuICBUaGVzZQorICAgICAgICAgKiBjYW4ndCBvdmVyZmxvdyAobm8gbW9yZSB0aGFuIHRoZSAjIG9mIHNlY29uZHMgaW4gMiBkYXlzKS4KKyAgICAgICAgICovCisgICAgICAgIG9mZnNldDEgPSBUSU1FX0dFVF9IT1VSKHNlbGYpICogMzYwMCArCisgICAgICAgICAgICAgICAgICAoVElNRV9HRVRfTUlOVVRFKHNlbGYpIC0gb2Zmc2V0MSkgKiA2MCArCisgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQoc2VsZik7CisgICAgICAgIG9mZnNldDIgPSBUSU1FX0dFVF9IT1VSKG90aGVyKSAqIDM2MDAgKworICAgICAgICAgICAgICAgICAgKFRJTUVfR0VUX01JTlVURShvdGhlcikgLSBvZmZzZXQyKSAqIDYwICsKKyAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORChvdGhlcik7CisgICAgICAgIGRpZmYgPSBvZmZzZXQxIC0gb2Zmc2V0MjsKKyAgICAgICAgaWYgKGRpZmYgPT0gMCkKKyAgICAgICAgICAgIGRpZmYgPSBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKSAtCisgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlDUk9TRUNPTkQob3RoZXIpOworICAgICAgICByZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKKyAgICB9CiAKLQlhc3NlcnQobjEgIT0gbjIpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiY2FuJ3QgY29tcGFyZSBvZmZzZXQtbmFpdmUgYW5kICIKLQkJCSJvZmZzZXQtYXdhcmUgdGltZXMiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQobjEgIT0gbjIpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjYW4ndCBjb21wYXJlIG9mZnNldC1uYWl2ZSBhbmQgIgorICAgICAgICAgICAgICAgICAgICAib2Zmc2V0LWF3YXJlIHRpbWVzIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBsb25nCiB0aW1lX2hhc2goUHlEYXRlVGltZV9UaW1lICpzZWxmKQogewotCWlmIChzZWxmLT5oYXNoY29kZSA9PSAtMSkgewotCQluYWl2ZXR5IG47Ci0JCWludCBvZmZzZXQ7Ci0JCVB5T2JqZWN0ICp0ZW1wOworICAgIGlmIChzZWxmLT5oYXNoY29kZSA9PSAtMSkgeworICAgICAgICBuYWl2ZXR5IG47CisgICAgICAgIGludCBvZmZzZXQ7CisgICAgICAgIFB5T2JqZWN0ICp0ZW1wOwogCi0JCW4gPSBjbGFzc2lmeV91dGNvZmZzZXQoKFB5T2JqZWN0ICopc2VsZiwgUHlfTm9uZSwgJm9mZnNldCk7Ci0JCWFzc2VydChuICE9IE9GRlNFVF9VTktOT1dOKTsKLQkJaWYgKG4gPT0gT0ZGU0VUX0VSUk9SKQotCQkJcmV0dXJuIC0xOworICAgICAgICBuID0gY2xhc3NpZnlfdXRjb2Zmc2V0KChQeU9iamVjdCAqKXNlbGYsIFB5X05vbmUsICZvZmZzZXQpOworICAgICAgICBhc3NlcnQobiAhPSBPRkZTRVRfVU5LTk9XTik7CisgICAgICAgIGlmIChuID09IE9GRlNFVF9FUlJPUikKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQkvKiBSZWR1Y2UgdGhpcyB0byBhIGhhc2ggb2YgYW5vdGhlciBvYmplY3QuICovCi0JCWlmIChvZmZzZXQgPT0gMCkKLQkJCXRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCi0JCQkJCQlfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFKTsKLQkJZWxzZSB7Ci0JCQlpbnQgaG91cjsKLQkJCWludCBtaW51dGU7CisgICAgICAgIC8qIFJlZHVjZSB0aGlzIHRvIGEgaGFzaCBvZiBhbm90aGVyIG9iamVjdC4gKi8KKyAgICAgICAgaWYgKG9mZnNldCA9PSAwKQorICAgICAgICAgICAgdGVtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBob3VyOworICAgICAgICAgICAgaW50IG1pbnV0ZTsKIAotCQkJYXNzZXJ0KG4gPT0gT0ZGU0VUX0FXQVJFKTsKLQkJCWFzc2VydChIQVNUWklORk8oc2VsZikpOwotCQkJaG91ciA9IGRpdm1vZChUSU1FX0dFVF9IT1VSKHNlbGYpICogNjAgKwotCQkJCQlUSU1FX0dFVF9NSU5VVEUoc2VsZikgLSBvZmZzZXQsCi0JCQkJICAgICAgNjAsCi0JCQkJICAgICAgJm1pbnV0ZSk7Ci0JCQlpZiAoMCA8PSBob3VyICYmIGhvdXIgPCAyNCkKLQkJCQl0ZW1wID0gbmV3X3RpbWUoaG91ciwgbWludXRlLAotCQkJCQkJVElNRV9HRVRfU0VDT05EKHNlbGYpLAotCQkJCQkJVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCi0JCQkJCQlQeV9Ob25lKTsKLQkJCWVsc2UKLQkJCQl0ZW1wID0gUHlfQnVpbGRWYWx1ZSgiaWlpaSIsCi0JCQkJCSAgIGhvdXIsIG1pbnV0ZSwKLQkJCQkJICAgVElNRV9HRVRfU0VDT05EKHNlbGYpLAotCQkJCQkgICBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKSk7Ci0JCX0KLQkJaWYgKHRlbXAgIT0gTlVMTCkgewotCQkJc2VsZi0+aGFzaGNvZGUgPSBQeU9iamVjdF9IYXNoKHRlbXApOwotCQkJUHlfREVDUkVGKHRlbXApOwotCQl9Ci0JfQotCXJldHVybiBzZWxmLT5oYXNoY29kZTsKKyAgICAgICAgICAgIGFzc2VydChuID09IE9GRlNFVF9BV0FSRSk7CisgICAgICAgICAgICBhc3NlcnQoSEFTVFpJTkZPKHNlbGYpKTsKKyAgICAgICAgICAgIGhvdXIgPSBkaXZtb2QoVElNRV9HRVRfSE9VUihzZWxmKSAqIDYwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSU5VVEUoc2VsZikgLSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWludXRlKTsKKyAgICAgICAgICAgIGlmICgwIDw9IGhvdXIgJiYgaG91ciA8IDI0KQorICAgICAgICAgICAgICAgIHRlbXAgPSBuZXdfdGltZShob3VyLCBtaW51dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRlbXAgPSBQeV9CdWlsZFZhbHVlKCJpaWlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGVtcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBzZWxmLT5oYXNoY29kZSA9IFB5T2JqZWN0X0hhc2godGVtcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNlbGYtPmhhc2hjb2RlOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9yZXBsYWNlKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqY2xvbmU7Ci0JUHlPYmplY3QgKnR1cGxlOwotCWludCBoaCA9IFRJTUVfR0VUX0hPVVIoc2VsZik7Ci0JaW50IG1tID0gVElNRV9HRVRfTUlOVVRFKHNlbGYpOwotCWludCBzcyA9IFRJTUVfR0VUX1NFQ09ORChzZWxmKTsKLQlpbnQgdXMgPSBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKLQlQeU9iamVjdCAqdHppbmZvID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqY2xvbmU7CisgICAgUHlPYmplY3QgKnR1cGxlOworICAgIGludCBoaCA9IFRJTUVfR0VUX0hPVVIoc2VsZik7CisgICAgaW50IG1tID0gVElNRV9HRVRfTUlOVVRFKHNlbGYpOworICAgIGludCBzcyA9IFRJTUVfR0VUX1NFQ09ORChzZWxmKTsKKyAgICBpbnQgdXMgPSBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKTsKKyAgICBQeU9iamVjdCAqdHppbmZvID0gSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpTzpyZXBsYWNlIiwKLQkJCQkJICB0aW1lX2t3cywKLQkJCQkJICAmaGgsICZtbSwgJnNzLCAmdXMsICZ0emluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQl0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaWlPIiwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbyk7Ci0JaWYgKHR1cGxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWNsb25lID0gdGltZV9uZXcoUHlfVFlQRShzZWxmKSwgdHVwbGUsIE5VTEwpOwotCVB5X0RFQ1JFRih0dXBsZSk7Ci0JcmV0dXJuIGNsb25lOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpTzpyZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9rd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoaCwgJm1tLCAmc3MsICZ1cywgJnR6aW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiaWlpaU8iLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKTsKKyAgICBpZiAodHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2xvbmUgPSB0aW1lX25ldyhQeV9UWVBFKHNlbGYpLCB0dXBsZSwgTlVMTCk7CisgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICByZXR1cm4gY2xvbmU7CiB9CiAKIHN0YXRpYyBpbnQKIHRpbWVfbm9uemVybyhQeURhdGVUaW1lX1RpbWUgKnNlbGYpCiB7Ci0JaW50IG9mZnNldDsKLQlpbnQgbm9uZTsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBub25lOwogCi0JaWYgKFRJTUVfR0VUX1NFQ09ORChzZWxmKSB8fCBUSU1FX0dFVF9NSUNST1NFQ09ORChzZWxmKSkgewotCQkvKiBTaW5jZSB1dGNvZmZzZXQgaXMgaW4gd2hvbGUgbWludXRlcywgbm90aGluZyBjYW4KLQkJICogYWx0ZXIgdGhlIGNvbmNsdXNpb24gdGhhdCB0aGlzIGlzIG5vbnplcm8uCi0JCSAqLwotCQlyZXR1cm4gMTsKLQl9Ci0Jb2Zmc2V0ID0gMDsKLQlpZiAoSEFTVFpJTkZPKHNlbGYpICYmIHNlbGYtPnR6aW5mbyAhPSBQeV9Ob25lKSB7Ci0JCW9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHNlbGYtPnR6aW5mbywgUHlfTm9uZSwgJm5vbmUpOwotCQlpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAoVElNRV9HRVRfTUlOVVRFKHNlbGYpIC0gb2Zmc2V0ICsgVElNRV9HRVRfSE9VUihzZWxmKSo2MCkgIT0gMDsKKyAgICBpZiAoVElNRV9HRVRfU0VDT05EKHNlbGYpIHx8IFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpKSB7CisgICAgICAgIC8qIFNpbmNlIHV0Y29mZnNldCBpcyBpbiB3aG9sZSBtaW51dGVzLCBub3RoaW5nIGNhbgorICAgICAgICAgKiBhbHRlciB0aGUgY29uY2x1c2lvbiB0aGF0IHRoaXMgaXMgbm9uemVyby4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBvZmZzZXQgPSAwOworICAgIGlmIChIQVNUWklORk8oc2VsZikgJiYgc2VsZi0+dHppbmZvICE9IFB5X05vbmUpIHsKKyAgICAgICAgb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQoc2VsZi0+dHppbmZvLCBQeV9Ob25lLCAmbm9uZSk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIChUSU1FX0dFVF9NSU5VVEUoc2VsZikgLSBvZmZzZXQgKyBUSU1FX0dFVF9IT1VSKHNlbGYpKjYwKSAhPSAwOwogfQogCiAvKiBQaWNrbGUgc3VwcG9ydCwgYSBzaW1wbGUgdXNlIG9mIF9fcmVkdWNlX18uICovCkBAIC0zNDYxLDU1ICszNDYxLDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9nZXRzdGF0ZShQeURhdGVUaW1lX1RpbWUgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmJhc2VzdGF0ZTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYmFzZXN0YXRlOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JYmFzZXN0YXRlID0gIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+ZGF0YSwKLQkJCQkJCV9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUpOwotCWlmIChiYXNlc3RhdGUgIT0gTlVMTCkgewotCQlpZiAoISBIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCi0JCQlyZXN1bHQgPSBQeVR1cGxlX1BhY2soMSwgYmFzZXN0YXRlKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIGJhc2VzdGF0ZSwgc2VsZi0+dHppbmZvKTsKLQkJUHlfREVDUkVGKGJhc2VzdGF0ZSk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgYmFzZXN0YXRlID0gIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRSk7CisgICAgaWYgKGJhc2VzdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghIEhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfUGFjaygxLCBiYXNlc3RhdGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soMiwgYmFzZXN0YXRlLCBzZWxmLT50emluZm8pOworICAgICAgICBQeV9ERUNSRUYoYmFzZXN0YXRlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfcmVkdWNlKFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE9OKSIsIFB5X1RZUEUoc2VsZiksIHRpbWVfZ2V0c3RhdGUoc2VsZikpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoT04pIiwgUHlfVFlQRShzZWxmKSwgdGltZV9nZXRzdGF0ZShzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0aW1lX21ldGhvZHNbXSA9IHsKIAotCXsiaXNvZm9ybWF0IiwgICAoUHlDRnVuY3Rpb24pdGltZV9pc29mb3JtYXQsCU1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCBISDpNTTpTU1subW1tbW1tXSIKLQkgCSAgICJbK0hIOk1NXS4iKX0sCisgICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbil0aW1lX2lzb2Zvcm1hdCwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCBISDpNTTpTU1subW1tbW1tXSIKKyAgICAgICAgICAgICAgICJbK0hIOk1NXS4iKX0sCiAKLQl7InN0cmZ0aW1lIiwgICAJKFB5Q0Z1bmN0aW9uKXRpbWVfc3RyZnRpbWUsCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigiZm9ybWF0IC0+IHN0cmZ0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKKyAgICB7InN0cmZ0aW1lIiwgICAgICAgIChQeUNGdW5jdGlvbil0aW1lX3N0cmZ0aW1lLCAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgUHlEb2NfU1RSKCJmb3JtYXQgLT4gc3RyZnRpbWUoKSBzdHlsZSBzdHJpbmcuIil9LAogCi0JeyJfX2Zvcm1hdF9fIiwgCShQeUNGdW5jdGlvbilkYXRlX2Zvcm1hdCwJTUVUSF9WQVJBUkdTLAotCSBQeURvY19TVFIoIkZvcm1hdHMgc2VsZiB3aXRoIHN0cmZ0aW1lLiIpfSwKKyAgICB7Il9fZm9ybWF0X18iLCAgICAgIChQeUNGdW5jdGlvbilkYXRlX2Zvcm1hdCwgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBQeURvY19TVFIoIkZvcm1hdHMgc2VsZiB3aXRoIHN0cmZ0aW1lLiIpfSwKIAotCXsidXRjb2Zmc2V0IiwJKFB5Q0Z1bmN0aW9uKXRpbWVfdXRjb2Zmc2V0LAlNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8udXRjb2Zmc2V0KHNlbGYpLiIpfSwKKyAgICB7InV0Y29mZnNldCIsICAgICAgIChQeUNGdW5jdGlvbil0aW1lX3V0Y29mZnNldCwgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLnV0Y29mZnNldChzZWxmKS4iKX0sCiAKLQl7InR6bmFtZSIsCShQeUNGdW5jdGlvbil0aW1lX3R6bmFtZSwJTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLnR6bmFtZShzZWxmKS4iKX0sCisgICAgeyJ0em5hbWUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pdGltZV90em5hbWUsICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby50em5hbWUoc2VsZikuIil9LAogCi0JeyJkc3QiLAkJKFB5Q0Z1bmN0aW9uKXRpbWVfZHN0LAkJTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLmRzdChzZWxmKS4iKX0sCisgICAgeyJkc3QiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGltZV9kc3QsICAgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby5kc3Qoc2VsZikuIil9LAogCi0JeyJyZXBsYWNlIiwgICAgIChQeUNGdW5jdGlvbil0aW1lX3JlcGxhY2UsCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgd2l0aCBuZXcgc3BlY2lmaWVkIGZpZWxkcy4iKX0sCisgICAgeyJyZXBsYWNlIiwgICAgIChQeUNGdW5jdGlvbil0aW1lX3JlcGxhY2UsICAgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgd2l0aCBuZXcgc3BlY2lmaWVkIGZpZWxkcy4iKX0sCiAKLQl7Il9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pdGltZV9yZWR1Y2UsICAgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJfX3JlZHVjZV9fKCkgLT4gKGNscywgc3RhdGUpIil9LAorICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbil0aW1lX3JlZHVjZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIl9fcmVkdWNlX18oKSAtPiAoY2xzLCBzdGF0ZSkiKX0sCiAKLQl7TlVMTCwJTlVMTH0KKyAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAogc3RhdGljIGNoYXIgdGltZV9kb2NbXSA9CkBAIC0zNTE5LDYxICszNTE5LDYxIEBACiBhIHR6aW5mbyBzdWJjbGFzcy4gVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgbWF5IGJlIGludHMgb3IgbG9uZ3MuXG4iKTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyB0aW1lX2FzX251bWJlciA9IHsKLQkwLAkJCQkJLyogbmJfYWRkICovCi0JMCwJCQkJCS8qIG5iX3N1YnRyYWN0ICovCi0JMCwJCQkJCS8qIG5iX211bHRpcGx5ICovCi0JMCwJCQkJCS8qIG5iX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9yZW1haW5kZXIgKi8KLQkwLAkJCQkJLyogbmJfZGl2bW9kICovCi0JMCwJCQkJCS8qIG5iX3Bvd2VyICovCi0JMCwJCQkJCS8qIG5iX25lZ2F0aXZlICovCi0JMCwJCQkJCS8qIG5iX3Bvc2l0aXZlICovCi0JMCwJCQkJCS8qIG5iX2Fic29sdXRlICovCi0JKGlucXVpcnkpdGltZV9ub256ZXJvLAkJCS8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2FkZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2bW9kICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3dlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbmVnYXRpdmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hYnNvbHV0ZSAqLworICAgIChpbnF1aXJ5KXRpbWVfbm9uemVybywgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbm9uemVybyAqLwogfTsKIAogc3RhdGljaGVyZSBQeVR5cGVPYmplY3QgUHlEYXRlVGltZV9UaW1lVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLAkJCQkJLyogb2Jfc2l6ZSAqLwotCSJkYXRldGltZS50aW1lIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5RGF0ZVRpbWVfVGltZSksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkoZGVzdHJ1Y3Rvcil0aW1lX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXRpbWVfcmVwciwJCQkvKiB0cF9yZXByICovCi0JJnRpbWVfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKXRpbWVfaGFzaCwJCQkvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgIAkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpdGltZV9zdHIsCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLAkJCS8qIHRwX2ZsYWdzICovCi0JdGltZV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYyl0aW1lX3JpY2hjb21wYXJlLAkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXRpbWVfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JdGltZV9nZXRzZXQsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQl0aW1lX2FsbG9jLAkJCQkvKiB0cF9hbGxvYyAqLwotCXRpbWVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICJkYXRldGltZS50aW1lIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeURhdGVUaW1lX1RpbWUpLCAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKXRpbWVfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpdGltZV9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmdGltZV9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpdGltZV9oYXNoLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpdGltZV9zdHIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICB0aW1lX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKXRpbWVfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgdGltZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgdGltZV9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgdGltZV9hbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHRpbWVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAvKgpAQCAtMzU4Nyw0MiArMzU4Nyw0MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2hvdXIoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhEQVRFX0dFVF9IT1VSKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfSE9VUihzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9taW51dGUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhEQVRFX0dFVF9NSU5VVEUoc2VsZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhEQVRFX0dFVF9NSU5VVEUoc2VsZikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfc2Vjb25kKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfU0VDT05EKHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfU0VDT05EKHNlbGYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX21pY3Jvc2Vjb25kKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIHZvaWQgKnVudXNlZCkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZikpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV90emluZm8oUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgdm9pZCAqdW51c2VkKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lOwotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGRhdGV0aW1lX2dldHNldFtdID0gewotCXsiaG91ciIsICAgICAgICAoZ2V0dGVyKWRhdGV0aW1lX2hvdXJ9LAotCXsibWludXRlIiwgICAgICAoZ2V0dGVyKWRhdGV0aW1lX21pbnV0ZX0sCi0JeyJzZWNvbmQiLCAgICAgIChnZXR0ZXIpZGF0ZXRpbWVfc2Vjb25kfSwKLQl7Im1pY3Jvc2Vjb25kIiwgKGdldHRlcilkYXRldGltZV9taWNyb3NlY29uZH0sCi0JeyJ0emluZm8iLAkoZ2V0dGVyKWRhdGV0aW1lX3R6aW5mb30sCi0Je05VTEx9CisgICAgeyJob3VyIiwgICAgICAgIChnZXR0ZXIpZGF0ZXRpbWVfaG91cn0sCisgICAgeyJtaW51dGUiLCAgICAgIChnZXR0ZXIpZGF0ZXRpbWVfbWludXRlfSwKKyAgICB7InNlY29uZCIsICAgICAgKGdldHRlcilkYXRldGltZV9zZWNvbmR9LAorICAgIHsibWljcm9zZWNvbmQiLCAoZ2V0dGVyKWRhdGV0aW1lX21pY3Jvc2Vjb25kfSwKKyAgICB7InR6aW5mbyIsICAgICAgICAgIChnZXR0ZXIpZGF0ZXRpbWVfdHppbmZvfSwKKyAgICB7TlVMTH0KIH07CiAKIC8qCkBAIC0zNjMwLDcyICszNjMwLDcyIEBACiAgKi8KIAogc3RhdGljIGNoYXIgKmRhdGV0aW1lX2t3c1tdID0gewotCSJ5ZWFyIiwgIm1vbnRoIiwgImRheSIsICJob3VyIiwgIm1pbnV0ZSIsICJzZWNvbmQiLAotCSJtaWNyb3NlY29uZCIsICJ0emluZm8iLCBOVUxMCisgICAgInllYXIiLCAibW9udGgiLCAiZGF5IiwgImhvdXIiLCAibWludXRlIiwgInNlY29uZCIsCisgICAgIm1pY3Jvc2Vjb25kIiwgInR6aW5mbyIsIE5VTEwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpzZWxmID0gTlVMTDsKLQlQeU9iamVjdCAqc3RhdGU7Ci0JaW50IHllYXI7Ci0JaW50IG1vbnRoOwotCWludCBkYXk7Ci0JaW50IGhvdXIgPSAwOwotCWludCBtaW51dGUgPSAwOwotCWludCBzZWNvbmQgPSAwOwotCWludCB1c2Vjb25kID0gMDsKLQlQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqc2VsZiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnN0YXRlOworICAgIGludCB5ZWFyOworICAgIGludCBtb250aDsKKyAgICBpbnQgZGF5OworICAgIGludCBob3VyID0gMDsKKyAgICBpbnQgbWludXRlID0gMDsKKyAgICBpbnQgc2Vjb25kID0gMDsKKyAgICBpbnQgdXNlY29uZCA9IDA7CisgICAgUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CiAKLQkvKiBDaGVjayBmb3IgaW52b2NhdGlvbiBmcm9tIHBpY2tsZSB3aXRoIF9fZ2V0c3RhdGVfXyBzdGF0ZSAqLwotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID49IDEgJiYKLQkgICAgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8PSAyICYmCi0JICAgIFB5U3RyaW5nX0NoZWNrKHN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkgJiYKLQkgICAgUHlTdHJpbmdfR0VUX1NJWkUoc3RhdGUpID09IF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFICYmCi0JICAgIE1PTlRIX0lTX1NBTkUoUHlTdHJpbmdfQVNfU1RSSU5HKHN0YXRlKVsyXSkpCi0JewotCQlQeURhdGVUaW1lX0RhdGVUaW1lICptZTsKLQkJY2hhciBhd2FyZTsKKyAgICAvKiBDaGVjayBmb3IgaW52b2NhdGlvbiBmcm9tIHBpY2tsZSB3aXRoIF9fZ2V0c3RhdGVfXyBzdGF0ZSAqLworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID49IDEgJiYKKyAgICAgICAgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8PSAyICYmCisgICAgICAgIFB5U3RyaW5nX0NoZWNrKHN0YXRlID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKSkgJiYKKyAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoc3RhdGUpID09IF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFICYmCisgICAgICAgIE1PTlRIX0lTX1NBTkUoUHlTdHJpbmdfQVNfU1RSSU5HKHN0YXRlKVsyXSkpCisgICAgeworICAgICAgICBQeURhdGVUaW1lX0RhdGVUaW1lICptZTsKKyAgICAgICAgY2hhciBhd2FyZTsKIAotCQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAyKSB7Ci0JCQl0emluZm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDEpOwotCQkJaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgIgotCQkJCQkidHppbmZvIHN0YXRlIGFyZyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCWF3YXJlID0gKGNoYXIpKHR6aW5mbyAhPSBQeV9Ob25lKTsKLQkJbWUgPSAoUHlEYXRlVGltZV9EYXRlVGltZSAqKSAodHlwZS0+dHBfYWxsb2ModHlwZSAsIGF3YXJlKSk7Ci0JCWlmIChtZSAhPSBOVUxMKSB7Ci0JCQljaGFyICpwZGF0YSA9IFB5U3RyaW5nX0FTX1NUUklORyhzdGF0ZSk7CisgICAgICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDIpIHsKKyAgICAgICAgICAgIHR6aW5mbyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMSk7CisgICAgICAgICAgICBpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJhZCAiCisgICAgICAgICAgICAgICAgICAgICJ0emluZm8gc3RhdGUgYXJnIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXdhcmUgPSAoY2hhcikodHppbmZvICE9IFB5X05vbmUpOworICAgICAgICBtZSA9IChQeURhdGVUaW1lX0RhdGVUaW1lICopICh0eXBlLT50cF9hbGxvYyh0eXBlICwgYXdhcmUpKTsKKyAgICAgICAgaWYgKG1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoYXIgKnBkYXRhID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0YXRlKTsKIAotCQkJbWVtY3B5KG1lLT5kYXRhLCBwZGF0YSwgX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUpOwotCQkJbWUtPmhhc2hjb2RlID0gLTE7Ci0JCQltZS0+aGFzdHppbmZvID0gYXdhcmU7Ci0JCQlpZiAoYXdhcmUpIHsKLQkJCQlQeV9JTkNSRUYodHppbmZvKTsKLQkJCQltZS0+dHppbmZvID0gdHppbmZvOwotCQkJfQotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKiltZTsKLQl9CisgICAgICAgICAgICBtZW1jcHkobWUtPmRhdGEsIHBkYXRhLCBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSk7CisgICAgICAgICAgICBtZS0+aGFzaGNvZGUgPSAtMTsKKyAgICAgICAgICAgIG1lLT5oYXN0emluZm8gPSBhd2FyZTsKKyAgICAgICAgICAgIGlmIChhd2FyZSkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0emluZm8pOworICAgICAgICAgICAgICAgIG1lLT50emluZm8gPSB0emluZm87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW1lOworICAgIH0KIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJpaWl8aWlpaU8iLCBkYXRldGltZV9rd3MsCi0JCQkJCSZ5ZWFyLCAmbW9udGgsICZkYXksICZob3VyLCAmbWludXRlLAotCQkJCQkmc2Vjb25kLCAmdXNlY29uZCwgJnR6aW5mbykpIHsKLQkJaWYgKGNoZWNrX2RhdGVfYXJncyh5ZWFyLCBtb250aCwgZGF5KSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKGNoZWNrX3RpbWVfYXJncyhob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJc2VsZiA9IG5ld19kYXRldGltZV9leCh5ZWFyLCBtb250aCwgZGF5LAotCQkJCSAgICAJaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsCi0JCQkJICAgIAl0emluZm8sIHR5cGUpOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiaWlpfGlpaWlPIiwgZGF0ZXRpbWVfa3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsICZtaW51dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vjb25kLCAmdXNlY29uZCwgJnR6aW5mbykpIHsKKyAgICAgICAgaWYgKGNoZWNrX2RhdGVfYXJncyh5ZWFyLCBtb250aCwgZGF5KSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGNoZWNrX3RpbWVfYXJncyhob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc2VsZiA9IG5ld19kYXRldGltZV9leCh5ZWFyLCBtb250aCwgZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvLCB0eXBlKTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIC8qIFRNX0ZVTkMgaXMgdGhlIHNoYXJlZCB0eXBlIG9mIGxvY2FsdGltZSgpIGFuZCBnbXRpbWUoKS4gKi8KQEAgLTM3MDcsMzYgKzM3MDcsMzYgQEAKICAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2Zyb21fdGltZXRfYW5kX3VzKFB5T2JqZWN0ICpjbHMsIFRNX0ZVTkMgZiwgdGltZV90IHRpbWV0LCBpbnQgdXMsCi0JCQkgICBQeU9iamVjdCAqdHppbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbykKIHsKLQlzdHJ1Y3QgdG0gKnRtOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIHN0cnVjdCB0bSAqdG07CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQl0bSA9IGYoJnRpbWV0KTsKLQlpZiAodG0pIHsKLQkJLyogVGhlIHBsYXRmb3JtIGxvY2FsdGltZS9nbXRpbWUgbWF5IGluc2VydCBsZWFwIHNlY29uZHMsCi0JCSAqIGluZGljYXRlZCBieSB0bS0+dG1fc2VjID4gNTkuICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZW0sCi0JCSAqIGV4Y2VwdCB0byB0aGUgZXh0ZW50IHRoYXQgcGFzc2luZyB0aGVtIG9uIHRvIHRoZSBkYXRldGltZQotCQkgKiBjb25zdHJ1Y3RvciB3b3VsZCByYWlzZSBWYWx1ZUVycm9yIGZvciBhIHJlYXNvbiB0aGF0Ci0JCSAqIG1hZGUgbm8gc2Vuc2UgdG8gdGhlIHVzZXIuCi0JCSAqLwotCQlpZiAodG0tPnRtX3NlYyA+IDU5KQotCQkJdG0tPnRtX3NlYyA9IDU5OwotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpaWlpaU8iLAotCQkJCQkgICAgICAgdG0tPnRtX3llYXIgKyAxOTAwLAotCQkJCQkgICAgICAgdG0tPnRtX21vbiArIDEsCi0JCQkJCSAgICAgICB0bS0+dG1fbWRheSwKLQkJCQkJICAgICAgIHRtLT50bV9ob3VyLAotCQkJCQkgICAgICAgdG0tPnRtX21pbiwKLQkJCQkJICAgICAgIHRtLT50bV9zZWMsCi0JCQkJCSAgICAgICB1cywKLQkJCQkJICAgICAgIHR6aW5mbyk7Ci0JfQotCWVsc2UKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UgZm9yICIKLQkJCQkicGxhdGZvcm0gbG9jYWx0aW1lKCkvZ210aW1lKCkgZnVuY3Rpb24iKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHRtID0gZigmdGltZXQpOworICAgIGlmICh0bSkgeworICAgICAgICAvKiBUaGUgcGxhdGZvcm0gbG9jYWx0aW1lL2dtdGltZSBtYXkgaW5zZXJ0IGxlYXAgc2Vjb25kcywKKyAgICAgICAgICogaW5kaWNhdGVkIGJ5IHRtLT50bV9zZWMgPiA1OS4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlbSwKKyAgICAgICAgICogZXhjZXB0IHRvIHRoZSBleHRlbnQgdGhhdCBwYXNzaW5nIHRoZW0gb24gdG8gdGhlIGRhdGV0aW1lCisgICAgICAgICAqIGNvbnN0cnVjdG9yIHdvdWxkIHJhaXNlIFZhbHVlRXJyb3IgZm9yIGEgcmVhc29uIHRoYXQKKyAgICAgICAgICogbWFkZSBubyBzZW5zZSB0byB0aGUgdXNlci4KKyAgICAgICAgICovCisgICAgICAgIGlmICh0bS0+dG1fc2VjID4gNTkpCisgICAgICAgICAgICB0bS0+dG1fc2VjID0gNTk7CisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjbHMsICJpaWlpaWlpTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1feWVhciArIDE5MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbW9uICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9tZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX2hvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1fbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX3NlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgb3V0IG9mIHJhbmdlIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm0gbG9jYWx0aW1lKCkvZ210aW1lKCkgZnVuY3Rpb24iKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBJbnRlcm5hbCBoZWxwZXIuCkBAIC0zNzQ4LDMxICszNzQ4LDMxIEBACiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9mcm9tX3RpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBUTV9GVU5DIGYsIGRvdWJsZSB0aW1lc3RhbXAsCi0JCQlQeU9iamVjdCAqdHppbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbykKIHsKLQl0aW1lX3QgdGltZXQ7Ci0JZG91YmxlIGZyYWN0aW9uOwotCWludCB1czsKKyAgICB0aW1lX3QgdGltZXQ7CisgICAgZG91YmxlIGZyYWN0aW9uOworICAgIGludCB1czsKIAotCXRpbWV0ID0gX1B5VGltZV9Eb3VibGVUb1RpbWV0KHRpbWVzdGFtcCk7Ci0JaWYgKHRpbWV0ID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZnJhY3Rpb24gPSB0aW1lc3RhbXAgLSAoZG91YmxlKXRpbWV0OwotCXVzID0gKGludClyb3VuZF90b19sb25nKGZyYWN0aW9uICogMWU2KTsKLQlpZiAodXMgPCAwKSB7Ci0JCS8qIFRydW5jYXRpb24gdG93YXJkcyB6ZXJvIGlzIG5vdCB3aGF0IHdlIHdhbnRlZAotCQkgICBmb3IgbmVnYXRpdmUgbnVtYmVycyAoUHl0aG9uJ3MgbW9kIHNlbWFudGljcykgKi8KLQkJdGltZXQgLT0gMTsKLQkJdXMgKz0gMTAwMDAwMDsKLQl9Ci0JLyogSWYgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBvbmUgbWljcm9zZWNvbmQgc21hbGxlciB0aGFuIGEKLQkgKiBmdWxsIHNlY29uZCwgcm91bmQgdXAuIE90aGVyd2lzZSwgVmFsdWVFcnJvcnMgYXJlIHJhaXNlZAotCSAqIGZvciBzb21lIGZsb2F0cy4gKi8KLQlpZiAodXMgPT0gMTAwMDAwMCkgewotCQl0aW1ldCArPSAxOwotCQl1cyA9IDA7Ci0JfQotCXJldHVybiBkYXRldGltZV9mcm9tX3RpbWV0X2FuZF91cyhjbHMsIGYsIHRpbWV0LCB1cywgdHppbmZvKTsKKyAgICB0aW1ldCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh0aW1lc3RhbXApOworICAgIGlmICh0aW1ldCA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZyYWN0aW9uID0gdGltZXN0YW1wIC0gKGRvdWJsZSl0aW1ldDsKKyAgICB1cyA9IChpbnQpcm91bmRfdG9fbG9uZyhmcmFjdGlvbiAqIDFlNik7CisgICAgaWYgKHVzIDwgMCkgeworICAgICAgICAvKiBUcnVuY2F0aW9uIHRvd2FyZHMgemVybyBpcyBub3Qgd2hhdCB3ZSB3YW50ZWQKKyAgICAgICAgICAgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKFB5dGhvbidzIG1vZCBzZW1hbnRpY3MpICovCisgICAgICAgIHRpbWV0IC09IDE7CisgICAgICAgIHVzICs9IDEwMDAwMDA7CisgICAgfQorICAgIC8qIElmIHRpbWVzdGFtcCBpcyBsZXNzIHRoYW4gb25lIG1pY3Jvc2Vjb25kIHNtYWxsZXIgdGhhbiBhCisgICAgICogZnVsbCBzZWNvbmQsIHJvdW5kIHVwLiBPdGhlcndpc2UsIFZhbHVlRXJyb3JzIGFyZSByYWlzZWQKKyAgICAgKiBmb3Igc29tZSBmbG9hdHMuICovCisgICAgaWYgKHVzID09IDEwMDAwMDApIHsKKyAgICAgICAgdGltZXQgKz0gMTsKKyAgICAgICAgdXMgPSAwOworICAgIH0KKyAgICByZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1ldF9hbmRfdXMoY2xzLCBmLCB0aW1ldCwgdXMsIHR6aW5mbyk7CiB9CiAKIC8qIEludGVybmFsIGhlbHBlci4KQEAgLTM3ODMsMzYgKzM3ODMsMzYgQEAKIGRhdGV0aW1lX2Jlc3RfcG9zc2libGUoUHlPYmplY3QgKmNscywgVE1fRlVOQyBmLCBQeU9iamVjdCAqdHppbmZvKQogewogI2lmZGVmIEhBVkVfR0VUVElNRU9GREFZCi0Jc3RydWN0IHRpbWV2YWwgdDsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0OwogCiAjaWZkZWYgR0VUVElNRU9GREFZX05PX1RaCi0JZ2V0dGltZW9mZGF5KCZ0KTsKKyAgICBnZXR0aW1lb2ZkYXkoJnQpOwogI2Vsc2UKLQlnZXR0aW1lb2ZkYXkoJnQsIChzdHJ1Y3QgdGltZXpvbmUgKilOVUxMKTsKKyAgICBnZXR0aW1lb2ZkYXkoJnQsIChzdHJ1Y3QgdGltZXpvbmUgKilOVUxMKTsKICNlbmRpZgotCXJldHVybiBkYXRldGltZV9mcm9tX3RpbWV0X2FuZF91cyhjbHMsIGYsIHQudHZfc2VjLCAoaW50KXQudHZfdXNlYywKLQkJCQkJICB0emluZm8pOworICAgIHJldHVybiBkYXRldGltZV9mcm9tX3RpbWV0X2FuZF91cyhjbHMsIGYsIHQudHZfc2VjLCAoaW50KXQudHZfdXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvKTsKIAotI2Vsc2UJLyogISBIQVZFX0dFVFRJTUVPRkRBWSAqLwotCS8qIE5vIGZsYXZvciBvZiBnZXR0aW1lb2ZkYXkgZXhpc3RzIG9uIHRoaXMgcGxhdGZvcm0uICBQeXRob24ncwotCSAqIHRpbWUudGltZSgpIGRvZXMgYSBsb3Qgb2Ygb3RoZXIgcGxhdGZvcm0gdHJpY2tzIHRvIGdldCB0aGUKLQkgKiBiZXN0IHRpbWUgaXQgY2FuIG9uIHRoZSBwbGF0Zm9ybSwgYW5kIHdlJ3JlIG5vdCBnb2luZyB0byBkbwotCSAqIGJldHRlciB0aGFuIHRoYXQgKGlmIHdlIGNvdWxkLCB0aGUgYmV0dGVyIGNvZGUgd291bGQgYmVsb25nCi0JICogaW4gdGltZS50aW1lKCkhKSAgV2UncmUgbGltaXRlZCBieSB0aGUgcHJlY2lzaW9uIG9mIGEgZG91YmxlLAotCSAqIHRob3VnaC4KLQkgKi8KLQlQeU9iamVjdCAqdGltZTsKLQlkb3VibGUgZHRpbWU7CisjZWxzZSAgIC8qICEgSEFWRV9HRVRUSU1FT0ZEQVkgKi8KKyAgICAvKiBObyBmbGF2b3Igb2YgZ2V0dGltZW9mZGF5IGV4aXN0cyBvbiB0aGlzIHBsYXRmb3JtLiAgUHl0aG9uJ3MKKyAgICAgKiB0aW1lLnRpbWUoKSBkb2VzIGEgbG90IG9mIG90aGVyIHBsYXRmb3JtIHRyaWNrcyB0byBnZXQgdGhlCisgICAgICogYmVzdCB0aW1lIGl0IGNhbiBvbiB0aGUgcGxhdGZvcm0sIGFuZCB3ZSdyZSBub3QgZ29pbmcgdG8gZG8KKyAgICAgKiBiZXR0ZXIgdGhhbiB0aGF0IChpZiB3ZSBjb3VsZCwgdGhlIGJldHRlciBjb2RlIHdvdWxkIGJlbG9uZworICAgICAqIGluIHRpbWUudGltZSgpISkgIFdlJ3JlIGxpbWl0ZWQgYnkgdGhlIHByZWNpc2lvbiBvZiBhIGRvdWJsZSwKKyAgICAgKiB0aG91Z2guCisgICAgICovCisgICAgUHlPYmplY3QgKnRpbWU7CisgICAgZG91YmxlIGR0aW1lOwogCi0JdGltZSA9IHRpbWVfdGltZSgpOwotICAgIAlpZiAodGltZSA9PSBOVUxMKQotICAgIAkJcmV0dXJuIE5VTEw7Ci0JZHRpbWUgPSBQeUZsb2F0X0FzRG91YmxlKHRpbWUpOwotCVB5X0RFQ1JFRih0aW1lKTsKLQlpZiAoZHRpbWUgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoY2xzLCBmLCBkdGltZSwgdHppbmZvKTsKLSNlbmRpZgkvKiAhIEhBVkVfR0VUVElNRU9GREFZICovCisgICAgdGltZSA9IHRpbWVfdGltZSgpOworICAgIGlmICh0aW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGR0aW1lID0gUHlGbG9hdF9Bc0RvdWJsZSh0aW1lKTsKKyAgICBQeV9ERUNSRUYodGltZSk7CisgICAgaWYgKGR0aW1lID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXN0YW1wKGNscywgZiwgZHRpbWUsIHR6aW5mbyk7CisjZW5kaWYgIC8qICEgSEFWRV9HRVRUSU1FT0ZEQVkgKi8KIH0KIAogLyogUmV0dXJuIGJlc3QgcG9zc2libGUgbG9jYWwgdGltZSAtLSB0aGlzIGlzbid0IGNvbnN0cmFpbmVkIGJ5IHRoZQpAQCAtMzgyMSwyNiArMzgyMSwyNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX25vdyhQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOwotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJ0eiIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJ0eiIsIE5VTEx9OwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifE86bm93Iiwga2V5d29yZHMsCi0JCQkJCSAgJnR6aW5mbykpCi0JCXJldHVybiBOVUxMOwotCWlmIChjaGVja190emluZm9fc3ViY2xhc3ModHppbmZvKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPOm5vdyIsIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHppbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmID0gZGF0ZXRpbWVfYmVzdF9wb3NzaWJsZShjbHMsCi0JCQkJICAgICAgdHppbmZvID09IFB5X05vbmUgPyBsb2NhbHRpbWUgOiBnbXRpbWUsCi0JCQkJICAgICAgdHppbmZvKTsKLQlpZiAoc2VsZiAhPSBOVUxMICYmIHR6aW5mbyAhPSBQeV9Ob25lKSB7Ci0JCS8qIENvbnZlcnQgVVRDIHRvIHR6aW5mbydzIHpvbmUuICovCi0JCVB5T2JqZWN0ICp0ZW1wID0gc2VsZjsKLQkJc2VsZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHppbmZvLCAiZnJvbXV0YyIsICJPIiwgc2VsZik7Ci0JCVB5X0RFQ1JFRih0ZW1wKTsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgc2VsZiA9IGRhdGV0aW1lX2Jlc3RfcG9zc2libGUoY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyA9PSBQeV9Ob25lID8gbG9jYWx0aW1lIDogZ210aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CisgICAgaWYgKHNlbGYgIT0gTlVMTCAmJiB0emluZm8gIT0gUHlfTm9uZSkgeworICAgICAgICAvKiBDb252ZXJ0IFVUQyB0byB0emluZm8ncyB6b25lLiAqLworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IHNlbGY7CisgICAgICAgIHNlbGYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR6aW5mbywgImZyb211dGMiLCAiTyIsIHNlbGYpOworICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiAvKiBSZXR1cm4gYmVzdCBwb3NzaWJsZSBVVEMgdGltZSAtLSB0aGlzIGlzbid0IGNvbnN0cmFpbmVkIGJ5IHRoZQpAQCAtMzg0OSwxNDcgKzM4NDksMTQ3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdXRjbm93KFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICpkdW1teSkKIHsKLQlyZXR1cm4gZGF0ZXRpbWVfYmVzdF9wb3NzaWJsZShjbHMsIGdtdGltZSwgUHlfTm9uZSk7CisgICAgcmV0dXJuIGRhdGV0aW1lX2Jlc3RfcG9zc2libGUoY2xzLCBnbXRpbWUsIFB5X05vbmUpOwogfQogCiAvKiBSZXR1cm4gbmV3IGxvY2FsIGRhdGV0aW1lIGZyb20gdGltZXN0YW1wIChQeXRob24gdGltZXN0YW1wIC0tIGEgZG91YmxlKS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9mcm9tdGltZXN0YW1wKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JZG91YmxlIHRpbWVzdGFtcDsKLQlQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidGltZXN0YW1wIiwgInR6IiwgTlVMTH07CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgZG91YmxlIHRpbWVzdGFtcDsKKyAgICBQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidGltZXN0YW1wIiwgInR6IiwgTlVMTH07CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJkfE86ZnJvbXRpbWVzdGFtcCIsCi0JCQkJCSAga2V5d29yZHMsICZ0aW1lc3RhbXAsICZ0emluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJkfE86ZnJvbXRpbWVzdGFtcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLCAmdGltZXN0YW1wLCAmdHppbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzZWxmID0gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoY2xzLAotCQkJCSAgICAgICB0emluZm8gPT0gUHlfTm9uZSA/IGxvY2FsdGltZSA6IGdtdGltZSwKLQkJCQkgICAgICAgdGltZXN0YW1wLAotCQkJCSAgICAgICB0emluZm8pOwotCWlmIChzZWxmICE9IE5VTEwgJiYgdHppbmZvICE9IFB5X05vbmUpIHsKLQkJLyogQ29udmVydCBVVEMgdG8gdHppbmZvJ3Mgem9uZS4gKi8KLQkJUHlPYmplY3QgKnRlbXAgPSBzZWxmOwotCQlzZWxmID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0emluZm8sICJmcm9tdXRjIiwgIk8iLCBzZWxmKTsKLQkJUHlfREVDUkVGKHRlbXApOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBzZWxmID0gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoY2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8gPT0gUHlfTm9uZSA/IGxvY2FsdGltZSA6IGdtdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pOworICAgIGlmIChzZWxmICE9IE5VTEwgJiYgdHppbmZvICE9IFB5X05vbmUpIHsKKyAgICAgICAgLyogQ29udmVydCBVVEMgdG8gdHppbmZvJ3Mgem9uZS4gKi8KKyAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBzZWxmOworICAgICAgICBzZWxmID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0emluZm8sICJmcm9tdXRjIiwgIk8iLCBzZWxmKTsKKyAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogLyogUmV0dXJuIG5ldyBVVEMgZGF0ZXRpbWUgZnJvbSB0aW1lc3RhbXAgKFB5dGhvbiB0aW1lc3RhbXAgLS0gYSBkb3VibGUpLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3V0Y2Zyb210aW1lc3RhbXAoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIHRpbWVzdGFtcDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBkb3VibGUgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6dXRjZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQotCQlyZXN1bHQgPSBkYXRldGltZV9mcm9tX3RpbWVzdGFtcChjbHMsIGdtdGltZSwgdGltZXN0YW1wLAotCQkJCQkJIFB5X05vbmUpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6dXRjZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQorICAgICAgICByZXN1bHQgPSBkYXRldGltZV9mcm9tX3RpbWVzdGFtcChjbHMsIGdtdGltZSwgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBSZXR1cm4gbmV3IGRhdGV0aW1lIGZyb20gdGltZS5zdHJwdGltZSgpLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3N0cnB0aW1lKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzKQogewotCXN0YXRpYyBQeU9iamVjdCAqbW9kdWxlID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTCwgKm9iaiwgKnN0ID0gTlVMTCwgKmZyYWMgPSBOVUxMOwotCWNvbnN0IGNoYXIgKnN0cmluZywgKmZvcm1hdDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm1vZHVsZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEwsICpvYmosICpzdCA9IE5VTEwsICpmcmFjID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICpmb3JtYXQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOnN0cnB0aW1lIiwgJnN0cmluZywgJmZvcm1hdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6c3RycHRpbWUiLCAmc3RyaW5nLCAmZm9ybWF0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobW9kdWxlID09IE5VTEwgJiYKLQkgICAgKG1vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIl9zdHJwdGltZSIpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobW9kdWxlID09IE5VTEwgJiYKKyAgICAgICAgKG1vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIl9zdHJwdGltZSIpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIF9zdHJwdGltZS5fc3RycHRpbWUgcmV0dXJucyBhIHR3by1lbGVtZW50IHR1cGxlLiAgVGhlIGZpcnN0Ci0JICAgZWxlbWVudCBpcyBhIHRpbWUuc3RydWN0X3RpbWUgb2JqZWN0LiAgVGhlIHNlY29uZCBpcyB0aGUKLQkgICBtaWNyb3NlY29uZHMgKHdoaWNoIGFyZSBub3QgZGVmaW5lZCBmb3IgdGltZS5zdHJ1Y3RfdGltZSkuICovCi0Jb2JqID0gUHlPYmplY3RfQ2FsbE1ldGhvZChtb2R1bGUsICJfc3RycHRpbWUiLCAic3MiLCBzdHJpbmcsIGZvcm1hdCk7Ci0JaWYgKG9iaiAhPSBOVUxMKSB7Ci0JCWludCBpLCBnb29kX3RpbWV0dXBsZSA9IDE7Ci0JCWxvbmcgaW50IGlhWzddOwotCQlpZiAoUHlTZXF1ZW5jZV9DaGVjayhvYmopICYmIFB5U2VxdWVuY2VfU2l6ZShvYmopID09IDIpIHsKLQkJCXN0ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKG9iaiwgMCk7Ci0JCQlmcmFjID0gUHlTZXF1ZW5jZV9HZXRJdGVtKG9iaiwgMSk7Ci0JCQlpZiAoc3QgPT0gTlVMTCB8fCBmcmFjID09IE5VTEwpCi0JCQkJZ29vZF90aW1ldHVwbGUgPSAwOwotCQkJLyogY29weSB5L20vZC9oL20vcyB2YWx1ZXMgb3V0IG9mIHRoZQotCQkJICAgdGltZS5zdHJ1Y3RfdGltZSAqLwotCQkJaWYgKGdvb2RfdGltZXR1cGxlICYmCi0JCQkgICAgUHlTZXF1ZW5jZV9DaGVjayhzdCkgJiYKLQkJCSAgICBQeVNlcXVlbmNlX1NpemUoc3QpID49IDYpIHsKLQkJCQlmb3IgKGk9MDsgaSA8IDY7IGkrKykgewotCQkJCQlQeU9iamVjdCAqcCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzdCwgaSk7Ci0JCQkJCWlmIChwID09IE5VTEwpIHsKLQkJCQkJCWdvb2RfdGltZXR1cGxlID0gMDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmIChQeUludF9DaGVjayhwKSkKLQkJCQkJCWlhW2ldID0gUHlJbnRfQXNMb25nKHApOwotCQkJCQllbHNlCi0JCQkJCQlnb29kX3RpbWV0dXBsZSA9IDA7Ci0JCQkJCVB5X0RFQ1JFRihwKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJZ29vZF90aW1ldHVwbGUgPSAwOwotCQkJLyogZm9sbG93IHRoYXQgdXAgd2l0aCBhIGxpdHRsZSBkb3NlIG9mIG1pY3Jvc2Vjb25kcyAqLwotCQkJaWYgKFB5SW50X0NoZWNrKGZyYWMpKQotCQkJCWlhWzZdID0gUHlJbnRfQXNMb25nKGZyYWMpOwotCQkJZWxzZQotCQkJCWdvb2RfdGltZXR1cGxlID0gMDsKLQkJfQotCQllbHNlCi0JCQlnb29kX3RpbWV0dXBsZSA9IDA7Ci0JCWlmIChnb29kX3RpbWV0dXBsZSkKLQkJCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjbHMsICJpaWlpaWlpIiwKLQkJCQkJCSAgICAgICBpYVswXSwgaWFbMV0sIGlhWzJdLAotCQkJCQkJICAgICAgIGlhWzNdLCBpYVs0XSwgaWFbNV0sCi0JCQkJCQkgICAgICAgaWFbNl0pOwotCQllbHNlCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkidW5leHBlY3RlZCB2YWx1ZSBmcm9tIF9zdHJwdGltZS5fc3RycHRpbWUiKTsKLQl9Ci0JUHlfWERFQ1JFRihvYmopOwotCVB5X1hERUNSRUYoc3QpOwotCVB5X1hERUNSRUYoZnJhYyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBfc3RycHRpbWUuX3N0cnB0aW1lIHJldHVybnMgYSB0d28tZWxlbWVudCB0dXBsZS4gIFRoZSBmaXJzdAorICAgICAgIGVsZW1lbnQgaXMgYSB0aW1lLnN0cnVjdF90aW1lIG9iamVjdC4gIFRoZSBzZWNvbmQgaXMgdGhlCisgICAgICAgbWljcm9zZWNvbmRzICh3aGljaCBhcmUgbm90IGRlZmluZWQgZm9yIHRpbWUuc3RydWN0X3RpbWUpLiAqLworICAgIG9iaiA9IFB5T2JqZWN0X0NhbGxNZXRob2QobW9kdWxlLCAiX3N0cnB0aW1lIiwgInNzIiwgc3RyaW5nLCBmb3JtYXQpOworICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICBpbnQgaSwgZ29vZF90aW1ldHVwbGUgPSAxOworICAgICAgICBsb25nIGludCBpYVs3XTsKKyAgICAgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2sob2JqKSAmJiBQeVNlcXVlbmNlX1NpemUob2JqKSA9PSAyKSB7CisgICAgICAgICAgICBzdCA9IFB5U2VxdWVuY2VfR2V0SXRlbShvYmosIDApOworICAgICAgICAgICAgZnJhYyA9IFB5U2VxdWVuY2VfR2V0SXRlbShvYmosIDEpOworICAgICAgICAgICAgaWYgKHN0ID09IE5VTEwgfHwgZnJhYyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvb2RfdGltZXR1cGxlID0gMDsKKyAgICAgICAgICAgIC8qIGNvcHkgeS9tL2QvaC9tL3MgdmFsdWVzIG91dCBvZiB0aGUKKyAgICAgICAgICAgICAgIHRpbWUuc3RydWN0X3RpbWUgKi8KKyAgICAgICAgICAgIGlmIChnb29kX3RpbWV0dXBsZSAmJgorICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfQ2hlY2soc3QpICYmCisgICAgICAgICAgICAgICAgUHlTZXF1ZW5jZV9TaXplKHN0KSA+PSA2KSB7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnAgPSBQeVNlcXVlbmNlX0dldEl0ZW0oc3QsIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb29kX3RpbWV0dXBsZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2socCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpYVtpXSA9IFB5SW50X0FzTG9uZyhwKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZ29vZF90aW1ldHVwbGUgPSAwOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvb2RfdGltZXR1cGxlID0gMDsKKyAgICAgICAgICAgIC8qIGZvbGxvdyB0aGF0IHVwIHdpdGggYSBsaXR0bGUgZG9zZSBvZiBtaWNyb3NlY29uZHMgKi8KKyAgICAgICAgICAgIGlmIChQeUludF9DaGVjayhmcmFjKSkKKyAgICAgICAgICAgICAgICBpYVs2XSA9IFB5SW50X0FzTG9uZyhmcmFjKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb29kX3RpbWV0dXBsZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZ29vZF90aW1ldHVwbGUgPSAwOworICAgICAgICBpZiAoZ29vZF90aW1ldHVwbGUpCisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpaWlpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWFbMF0sIGlhWzFdLCBpYVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYVszXSwgaWFbNF0sIGlhWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhWzZdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgdmFsdWUgZnJvbSBfc3RycHRpbWUuX3N0cnB0aW1lIik7CisgICAgfQorICAgIFB5X1hERUNSRUYob2JqKTsKKyAgICBQeV9YREVDUkVGKHN0KTsKKyAgICBQeV9YREVDUkVGKGZyYWMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFJldHVybiBuZXcgZGF0ZXRpbWUgZnJvbSBkYXRlL2RhdGV0aW1lIGFuZCB0aW1lIGFyZ3VtZW50cy4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9jb21iaW5lKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0gCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJkYXRlIiwgInRpbWUiLCBOVUxMfTsKLQlQeU9iamVjdCAqZGF0ZTsKLQlQeU9iamVjdCAqdGltZTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZGF0ZSIsICJ0aW1lIiwgTlVMTH07CisgICAgUHlPYmplY3QgKmRhdGU7CisgICAgUHlPYmplY3QgKnRpbWU7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiTyFPITpjb21iaW5lIiwga2V5d29yZHMsCi0JCQkJCSZQeURhdGVUaW1lX0RhdGVUeXBlLCAmZGF0ZSwKLQkJCQkJJlB5RGF0ZVRpbWVfVGltZVR5cGUsICZ0aW1lKSkgewotCQlQeU9iamVjdCAqdHppbmZvID0gUHlfTm9uZTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiTyFPITpjb21iaW5lIiwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlEYXRlVGltZV9EYXRlVHlwZSwgJmRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlEYXRlVGltZV9UaW1lVHlwZSwgJnRpbWUpKSB7CisgICAgICAgIFB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOwogCi0JCWlmIChIQVNUWklORk8odGltZSkpCi0JCQl0emluZm8gPSAoKFB5RGF0ZVRpbWVfVGltZSAqKXRpbWUpLT50emluZm87Ci0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjbHMsICJpaWlpaWlpTyIsCi0JCQkJCQlHRVRfWUVBUihkYXRlKSwKLQkJCQkgICAgCQlHRVRfTU9OVEgoZGF0ZSksCi0JCQkJCQlHRVRfREFZKGRhdGUpLAotCQkJCSAgICAJCVRJTUVfR0VUX0hPVVIodGltZSksCi0JCQkJICAgIAkJVElNRV9HRVRfTUlOVVRFKHRpbWUpLAotCQkJCSAgICAJCVRJTUVfR0VUX1NFQ09ORCh0aW1lKSwKLQkJCQkgICAgCQlUSU1FX0dFVF9NSUNST1NFQ09ORCh0aW1lKSwKLQkJCQkgICAgCQl0emluZm8pOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAoSEFTVFpJTkZPKHRpbWUpKQorICAgICAgICAgICAgdHppbmZvID0gKChQeURhdGVUaW1lX1RpbWUgKil0aW1lKS0+dHppbmZvOworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY2xzLCAiaWlpaWlpaU8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKGRhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChkYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKGRhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX0hPVVIodGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlOVVRFKHRpbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORCh0aW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSUNST1NFQ09ORCh0aW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKgpAQCAtMzk5OSwxMCArMzk5OSwxMCBAQAogc3RhdGljIHZvaWQKIGRhdGV0aW1lX2RlYWxsb2MoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQlpZiAoSEFTVFpJTkZPKHNlbGYpKSB7Ci0JCVB5X1hERUNSRUYoc2VsZi0+dHppbmZvKTsKLQl9Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoSEFTVFpJTkZPKHNlbGYpKSB7CisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+dHppbmZvKTsKKyAgICB9CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogLyoKQEAgLTQwMTIsMjAgKzQwMTIsMjAgQEAKIC8qIFRoZXNlIGFyZSBhbGwgTUVUSF9OT0FSR1MsIHNvIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlIGFyZ2xpc3QuICovCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdXRjb2Zmc2V0KFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpIHsKLQlyZXR1cm4gb2Zmc2V0X2FzX3RpbWVkZWx0YShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAotCQkJCSAgICJ1dGNvZmZzZXQiLCAoUHlPYmplY3QgKilzZWxmKTsKKyAgICByZXR1cm4gb2Zmc2V0X2FzX3RpbWVkZWx0YShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1dGNvZmZzZXQiLCAoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2RzdChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKSB7Ci0JcmV0dXJuIG9mZnNldF9hc190aW1lZGVsdGEoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKLQkJCQkgICAiZHN0IiwgKFB5T2JqZWN0ICopc2VsZik7CisgICAgcmV0dXJuIG9mZnNldF9hc190aW1lZGVsdGEoSEFTVFpJTkZPKHNlbGYpID8gc2VsZi0+dHppbmZvIDogUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHN0IiwgKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV90em5hbWUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkgewotCXJldHVybiBjYWxsX3R6bmFtZShIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lLAotCQkJICAgKFB5T2JqZWN0ICopc2VsZik7CisgICAgcmV0dXJuIGNhbGxfdHpuYW1lKEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXNlbGYpOwogfQogCiAvKgpAQCAtNDAzNywxMTIgKzQwMzcsMTEyIEBACiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKmRhdGUsIFB5RGF0ZVRpbWVfRGVsdGEgKmRlbHRhLAotCQkgICAgICAgaW50IGZhY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhY3RvcikKIHsKLQkvKiBOb3RlIHRoYXQgdGhlIEMtbGV2ZWwgYWRkaXRpb25zIGNhbid0IG92ZXJmbG93LCBiZWNhdXNlIG9mCi0JICogaW52YXJpYW50IGJvdW5kcyBvbiB0aGUgbWVtYmVyIHZhbHVlcy4KLQkgKi8KLQlpbnQgeWVhciA9IEdFVF9ZRUFSKGRhdGUpOwotCWludCBtb250aCA9IEdFVF9NT05USChkYXRlKTsKLQlpbnQgZGF5ID0gR0VUX0RBWShkYXRlKSArIEdFVF9URF9EQVlTKGRlbHRhKSAqIGZhY3RvcjsKLQlpbnQgaG91ciA9IERBVEVfR0VUX0hPVVIoZGF0ZSk7Ci0JaW50IG1pbnV0ZSA9IERBVEVfR0VUX01JTlVURShkYXRlKTsKLQlpbnQgc2Vjb25kID0gREFURV9HRVRfU0VDT05EKGRhdGUpICsgR0VUX1REX1NFQ09ORFMoZGVsdGEpICogZmFjdG9yOwotCWludCBtaWNyb3NlY29uZCA9IERBVEVfR0VUX01JQ1JPU0VDT05EKGRhdGUpICsKLQkJCSAgR0VUX1REX01JQ1JPU0VDT05EUyhkZWx0YSkgKiBmYWN0b3I7CisgICAgLyogTm90ZSB0aGF0IHRoZSBDLWxldmVsIGFkZGl0aW9ucyBjYW4ndCBvdmVyZmxvdywgYmVjYXVzZSBvZgorICAgICAqIGludmFyaWFudCBib3VuZHMgb24gdGhlIG1lbWJlciB2YWx1ZXMuCisgICAgICovCisgICAgaW50IHllYXIgPSBHRVRfWUVBUihkYXRlKTsKKyAgICBpbnQgbW9udGggPSBHRVRfTU9OVEgoZGF0ZSk7CisgICAgaW50IGRheSA9IEdFVF9EQVkoZGF0ZSkgKyBHRVRfVERfREFZUyhkZWx0YSkgKiBmYWN0b3I7CisgICAgaW50IGhvdXIgPSBEQVRFX0dFVF9IT1VSKGRhdGUpOworICAgIGludCBtaW51dGUgPSBEQVRFX0dFVF9NSU5VVEUoZGF0ZSk7CisgICAgaW50IHNlY29uZCA9IERBVEVfR0VUX1NFQ09ORChkYXRlKSArIEdFVF9URF9TRUNPTkRTKGRlbHRhKSAqIGZhY3RvcjsKKyAgICBpbnQgbWljcm9zZWNvbmQgPSBEQVRFX0dFVF9NSUNST1NFQ09ORChkYXRlKSArCisgICAgICAgICAgICAgICAgICAgICAgR0VUX1REX01JQ1JPU0VDT05EUyhkZWx0YSkgKiBmYWN0b3I7CiAKLQlhc3NlcnQoZmFjdG9yID09IDEgfHwgZmFjdG9yID09IC0xKTsKLQlpZiAobm9ybWFsaXplX2RhdGV0aW1lKCZ5ZWFyLCAmbW9udGgsICZkYXksCi0JCQkgICAgICAgJmhvdXIsICZtaW51dGUsICZzZWNvbmQsICZtaWNyb3NlY29uZCkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBuZXdfZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheSwKLQkJCQkgICAgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pY3Jvc2Vjb25kLAotCQkJCSAgICBIQVNUWklORk8oZGF0ZSkgPyBkYXRlLT50emluZm8gOiBQeV9Ob25lKTsKKyAgICBhc3NlcnQoZmFjdG9yID09IDEgfHwgZmFjdG9yID09IC0xKTsKKyAgICBpZiAobm9ybWFsaXplX2RhdGV0aW1lKCZ5ZWFyLCAmbW9udGgsICZkYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG91ciwgJm1pbnV0ZSwgJnNlY29uZCwgJm1pY3Jvc2Vjb25kKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG5ld19kYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWNyb3NlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQVNUWklORk8oZGF0ZSkgPyBkYXRlLT50emluZm8gOiBQeV9Ob25lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2FkZChQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQogewotCWlmIChQeURhdGVUaW1lX0NoZWNrKGxlZnQpKSB7Ci0JCS8qIGRhdGV0aW1lICsgPz8/ICovCi0JCWlmIChQeURlbHRhX0NoZWNrKHJpZ2h0KSkKLQkJCS8qIGRhdGV0aW1lICsgZGVsdGEgKi8KLQkJCXJldHVybiBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKAotCQkJCQkoUHlEYXRlVGltZV9EYXRlVGltZSAqKWxlZnQsCi0JCQkJCShQeURhdGVUaW1lX0RlbHRhICopcmlnaHQsCi0JCQkJCTEpOwotCX0KLQllbHNlIGlmIChQeURlbHRhX0NoZWNrKGxlZnQpKSB7Ci0JCS8qIGRlbHRhICsgZGF0ZXRpbWUgKi8KLQkJcmV0dXJuIGFkZF9kYXRldGltZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKikgcmlnaHQsCi0JCQkJCSAgICAgIChQeURhdGVUaW1lX0RlbHRhICopIGxlZnQsCi0JCQkJCSAgICAgIDEpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBpZiAoUHlEYXRlVGltZV9DaGVjayhsZWZ0KSkgeworICAgICAgICAvKiBkYXRldGltZSArID8/PyAqLworICAgICAgICBpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpCisgICAgICAgICAgICAvKiBkYXRldGltZSArIGRlbHRhICovCisgICAgICAgICAgICByZXR1cm4gYWRkX2RhdGV0aW1lX3RpbWVkZWx0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EYXRlVGltZSAqKWxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKilyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlEZWx0YV9DaGVjayhsZWZ0KSkgeworICAgICAgICAvKiBkZWx0YSArIGRhdGV0aW1lICovCisgICAgICAgIHJldHVybiBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGVUaW1lICopIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlEYXRlVGltZV9EZWx0YSAqKSBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9zdWJ0cmFjdChQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CiAKLQlpZiAoUHlEYXRlVGltZV9DaGVjayhsZWZ0KSkgewotCQkvKiBkYXRldGltZSAtID8/PyAqLwotCQlpZiAoUHlEYXRlVGltZV9DaGVjayhyaWdodCkpIHsKLQkJCS8qIGRhdGV0aW1lIC0gZGF0ZXRpbWUgKi8KLQkJCW5haXZldHkgbjEsIG4yOwotCQkJaW50IG9mZnNldDEsIG9mZnNldDI7Ci0JCQlpbnQgZGVsdGFfZCwgZGVsdGFfcywgZGVsdGFfdXM7CisgICAgaWYgKFB5RGF0ZVRpbWVfQ2hlY2sobGVmdCkpIHsKKyAgICAgICAgLyogZGF0ZXRpbWUgLSA/Pz8gKi8KKyAgICAgICAgaWYgKFB5RGF0ZVRpbWVfQ2hlY2socmlnaHQpKSB7CisgICAgICAgICAgICAvKiBkYXRldGltZSAtIGRhdGV0aW1lICovCisgICAgICAgICAgICBuYWl2ZXR5IG4xLCBuMjsKKyAgICAgICAgICAgIGludCBvZmZzZXQxLCBvZmZzZXQyOworICAgICAgICAgICAgaW50IGRlbHRhX2QsIGRlbHRhX3MsIGRlbHRhX3VzOwogCi0JCQlpZiAoY2xhc3NpZnlfdHdvX3V0Y29mZnNldHMobGVmdCwgJm9mZnNldDEsICZuMSwgbGVmdCwKLQkJCQkJCSAgICByaWdodCwgJm9mZnNldDIsICZuMiwKLQkJCQkJCSAgICByaWdodCkgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJYXNzZXJ0KG4xICE9IE9GRlNFVF9VTktOT1dOICYmIG4yICE9IE9GRlNFVF9VTktOT1dOKTsKLQkJCWlmIChuMSAhPSBuMikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJjYW4ndCBzdWJ0cmFjdCBvZmZzZXQtbmFpdmUgYW5kICIKLQkJCQkJIm9mZnNldC1hd2FyZSBkYXRldGltZXMiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWRlbHRhX2QgPSB5bWRfdG9fb3JkKEdFVF9ZRUFSKGxlZnQpLAotCQkJCQkgICAgIEdFVF9NT05USChsZWZ0KSwKLQkJCQkJICAgICBHRVRfREFZKGxlZnQpKSAtCi0JCQkJICB5bWRfdG9fb3JkKEdFVF9ZRUFSKHJpZ2h0KSwKLQkJCQkJICAgICBHRVRfTU9OVEgocmlnaHQpLAotCQkJCQkgICAgIEdFVF9EQVkocmlnaHQpKTsKLQkJCS8qIFRoZXNlIGNhbid0IG92ZXJmbG93LCBzaW5jZSB0aGUgdmFsdWVzIGFyZQotCQkJICogbm9ybWFsaXplZC4gIEF0IG1vc3QgdGhpcyBnaXZlcyB0aGUgbnVtYmVyIG9mCi0JCQkgKiBzZWNvbmRzIGluIG9uZSBkYXkuCi0JCQkgKi8KLQkJCWRlbHRhX3MgPSAoREFURV9HRVRfSE9VUihsZWZ0KSAtCi0JCQkJICAgREFURV9HRVRfSE9VUihyaWdodCkpICogMzYwMCArCi0JCQkgICAgICAgICAgKERBVEVfR0VUX01JTlVURShsZWZ0KSAtCi0JCQkgICAgICAgICAgIERBVEVfR0VUX01JTlVURShyaWdodCkpICogNjAgKwotCQkJCSAgKERBVEVfR0VUX1NFQ09ORChsZWZ0KSAtCi0JCQkJICAgREFURV9HRVRfU0VDT05EKHJpZ2h0KSk7Ci0JCQlkZWx0YV91cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKGxlZnQpIC0KLQkJCQkgICBEQVRFX0dFVF9NSUNST1NFQ09ORChyaWdodCk7Ci0JCQkvKiAobGVmdCAtIG9mZnNldDEpIC0gKHJpZ2h0IC0gb2Zmc2V0MikgPQotCQkJICogKGxlZnQgLSByaWdodCkgKyAob2Zmc2V0MiAtIG9mZnNldDEpCi0JCQkgKi8KLQkJCWRlbHRhX3MgKz0gKG9mZnNldDIgLSBvZmZzZXQxKSAqIDYwOwotCQkJcmVzdWx0ID0gbmV3X2RlbHRhKGRlbHRhX2QsIGRlbHRhX3MsIGRlbHRhX3VzLCAxKTsKLQkJfQotCQllbHNlIGlmIChQeURlbHRhX0NoZWNrKHJpZ2h0KSkgewotCQkJLyogZGF0ZXRpbWUgLSBkZWx0YSAqLwotCQkJcmVzdWx0ID0gYWRkX2RhdGV0aW1lX3RpbWVkZWx0YSgKLQkJCQkJKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilsZWZ0LAotCQkJCQkoUHlEYXRlVGltZV9EZWx0YSAqKXJpZ2h0LAotCQkJCQktMSk7Ci0JCX0KLQl9CisgICAgICAgICAgICBpZiAoY2xhc3NpZnlfdHdvX3V0Y29mZnNldHMobGVmdCwgJm9mZnNldDEsICZuMSwgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCwgJm9mZnNldDIsICZuMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgYXNzZXJ0KG4xICE9IE9GRlNFVF9VTktOT1dOICYmIG4yICE9IE9GRlNFVF9VTktOT1dOKTsKKyAgICAgICAgICAgIGlmIChuMSAhPSBuMikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjYW4ndCBzdWJ0cmFjdCBvZmZzZXQtbmFpdmUgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgIm9mZnNldC1hd2FyZSBkYXRldGltZXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbHRhX2QgPSB5bWRfdG9fb3JkKEdFVF9ZRUFSKGxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01PTlRIKGxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShsZWZ0KSkgLQorICAgICAgICAgICAgICAgICAgICAgIHltZF90b19vcmQoR0VUX1lFQVIocmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX01PTlRIKHJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkocmlnaHQpKTsKKyAgICAgICAgICAgIC8qIFRoZXNlIGNhbid0IG92ZXJmbG93LCBzaW5jZSB0aGUgdmFsdWVzIGFyZQorICAgICAgICAgICAgICogbm9ybWFsaXplZC4gIEF0IG1vc3QgdGhpcyBnaXZlcyB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgICAgKiBzZWNvbmRzIGluIG9uZSBkYXkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRlbHRhX3MgPSAoREFURV9HRVRfSE9VUihsZWZ0KSAtCisgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIocmlnaHQpKSAqIDM2MDAgKworICAgICAgICAgICAgICAgICAgICAgIChEQVRFX0dFVF9NSU5VVEUobGVmdCkgLQorICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUocmlnaHQpKSAqIDYwICsKKyAgICAgICAgICAgICAgICAgICAgICAoREFURV9HRVRfU0VDT05EKGxlZnQpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHJpZ2h0KSk7CisgICAgICAgICAgICBkZWx0YV91cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKGxlZnQpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlDUk9TRUNPTkQocmlnaHQpOworICAgICAgICAgICAgLyogKGxlZnQgLSBvZmZzZXQxKSAtIChyaWdodCAtIG9mZnNldDIpID0KKyAgICAgICAgICAgICAqIChsZWZ0IC0gcmlnaHQpICsgKG9mZnNldDIgLSBvZmZzZXQxKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkZWx0YV9zICs9IChvZmZzZXQyIC0gb2Zmc2V0MSkgKiA2MDsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ld19kZWx0YShkZWx0YV9kLCBkZWx0YV9zLCBkZWx0YV91cywgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlEZWx0YV9DaGVjayhyaWdodCkpIHsKKyAgICAgICAgICAgIC8qIGRhdGV0aW1lIC0gZGVsdGEgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IGFkZF9kYXRldGltZV90aW1lZGVsdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBWYXJpb3VzIHdheXMgdG8gdHVybiBhIGRhdGV0aW1lIGludG8gYSBzdHJpbmcuICovCkBAIC00MTUwLDgzICs0MTUwLDgzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfcmVwcihQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCWNoYXIgYnVmZmVyWzEwMDBdOwotCWNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IFB5X1RZUEUoc2VsZiktPnRwX25hbWU7Ci0JUHlPYmplY3QgKmJhc2VyZXByOworICAgIGNoYXIgYnVmZmVyWzEwMDBdOworICAgIGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IFB5X1RZUEUoc2VsZiktPnRwX25hbWU7CisgICAgUHlPYmplY3QgKmJhc2VyZXByOwogCi0JaWYgKERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpKSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICIlcyglZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCkiLAotCQkJICAgICAgdHlwZV9uYW1lLAotCQkJICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSwKLQkJCSAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksIERBVEVfR0VUX01JTlVURShzZWxmKSwKLQkJCSAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKLQkJCSAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpKTsKLQl9Ci0JZWxzZSBpZiAoREFURV9HRVRfU0VDT05EKHNlbGYpKSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICIlcyglZCwgJWQsICVkLCAlZCwgJWQsICVkKSIsCi0JCQkgICAgICB0eXBlX25hbWUsCi0JCQkgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpLAotCQkJICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpLAotCQkJICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICIlcyglZCwgJWQsICVkLCAlZCwgJWQpIiwKLQkJCSAgICAgIHR5cGVfbmFtZSwKLQkJCSAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksIEdFVF9EQVkoc2VsZiksCi0JCQkgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZikpOwotCX0KLQliYXNlcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKLQlpZiAoYmFzZXJlcHIgPT0gTlVMTCB8fCAhIEhBU1RaSU5GTyhzZWxmKSkKLQkJcmV0dXJuIGJhc2VyZXByOwotCXJldHVybiBhcHBlbmRfa2V5d29yZF90emluZm8oYmFzZXJlcHIsIHNlbGYtPnR6aW5mbyk7CisgICAgaWYgKERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpKSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoREFURV9HRVRfU0VDT05EKHNlbGYpKSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQsICVkLCAlZCwgJWQsICVkLCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLCBHRVRfREFZKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksIERBVEVfR0VUX01JTlVURShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZikpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICIlcyglZCwgJWQsICVkLCAlZCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgR0VUX1lFQVIoc2VsZiksIEdFVF9NT05USChzZWxmKSwgR0VUX0RBWShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZikpOworICAgIH0KKyAgICBiYXNlcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKKyAgICBpZiAoYmFzZXJlcHIgPT0gTlVMTCB8fCAhIEhBU1RaSU5GTyhzZWxmKSkKKyAgICAgICAgcmV0dXJuIGJhc2VyZXByOworICAgIHJldHVybiBhcHBlbmRfa2V5d29yZF90emluZm8oYmFzZXJlcHIsIHNlbGYtPnR6aW5mbyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9zdHIoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZCgoUHlPYmplY3QgKilzZWxmLCAiaXNvZm9ybWF0IiwgIihzKSIsICIgIik7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QoKFB5T2JqZWN0ICopc2VsZiwgImlzb2Zvcm1hdCIsICIocykiLCAiICIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfaXNvZm9ybWF0KFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JY2hhciBzZXAgPSAnVCc7Ci0Jc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InNlcCIsIE5VTEx9OwotCWNoYXIgYnVmZmVyWzEwMF07Ci0JY2hhciAqY3A7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBjaGFyIHNlcCA9ICdUJzsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsic2VwIiwgTlVMTH07CisgICAgY2hhciBidWZmZXJbMTAwXTsKKyAgICBjaGFyICpjcDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8Yzppc29mb3JtYXQiLCBrZXl3b3JkcywKLQkJCQkJICZzZXApKQotCQlyZXR1cm4gTlVMTDsKLQljcCA9IGlzb2Zvcm1hdF9kYXRlKChQeURhdGVUaW1lX0RhdGUgKilzZWxmLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLQlhc3NlcnQoY3AgIT0gTlVMTCk7Ci0JKmNwKysgPSBzZXA7Ci0JY3AgPSBpc29mb3JtYXRfdGltZShzZWxmLCBjcCwgc2l6ZW9mKGJ1ZmZlcikgLSAoY3AgLSBidWZmZXIpKTsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIGNwIC0gYnVmZmVyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwgfHwgISBIQVNUWklORk8oc2VsZikpCi0JCXJldHVybiByZXN1bHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8Yzppc29mb3JtYXQiLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3AgPSBpc29mb3JtYXRfZGF0ZSgoUHlEYXRlVGltZV9EYXRlICopc2VsZiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgYXNzZXJ0KGNwICE9IE5VTEwpOworICAgICpjcCsrID0gc2VwOworICAgIGNwID0gaXNvZm9ybWF0X3RpbWUoc2VsZiwgY3AsIHNpemVvZihidWZmZXIpIC0gKGNwIC0gYnVmZmVyKSk7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmZmVyLCBjcCAtIGJ1ZmZlcik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICEgSEFTVFpJTkZPKHNlbGYpKQorICAgICAgICByZXR1cm4gcmVzdWx0OwogCi0JLyogV2UgbmVlZCB0byBhcHBlbmQgdGhlIFVUQyBvZmZzZXQuICovCi0JaWYgKGZvcm1hdF91dGNvZmZzZXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIjoiLCBzZWxmLT50emluZm8sCi0JCQkgICAgIChQeU9iamVjdCAqKXNlbGYpIDwgMCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcmVzdWx0LCBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcikpOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogV2UgbmVlZCB0byBhcHBlbmQgdGhlIFVUQyBvZmZzZXQuICovCisgICAgaWYgKGZvcm1hdF91dGNvZmZzZXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIjoiLCBzZWxmLT50emluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopc2VsZikgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXN1bHQsIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2N0aW1lKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCiB7Ci0JcmV0dXJuIGZvcm1hdF9jdGltZSgoUHlEYXRlVGltZV9EYXRlICopc2VsZiwKLQkJCSAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLAotCQkJICAgIERBVEVfR0VUX01JTlVURShzZWxmKSwKLQkJCSAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZikpOworICAgIHJldHVybiBmb3JtYXRfY3RpbWUoKFB5RGF0ZVRpbWVfRGF0ZSAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlOVVRFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpKTsKIH0KIAogLyogTWlzY2VsbGFuZW91cyBtZXRob2RzLiAqLwpAQCAtNDIzOCwyOTggKzQyMzgsMjk4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfcmljaGNvbXBhcmUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgUHlPYmplY3QgKm90aGVyLCBpbnQgb3ApCiB7Ci0JaW50IGRpZmY7Ci0JbmFpdmV0eSBuMSwgbjI7Ci0JaW50IG9mZnNldDEsIG9mZnNldDI7CisgICAgaW50IGRpZmY7CisgICAgbmFpdmV0eSBuMSwgbjI7CisgICAgaW50IG9mZnNldDEsIG9mZnNldDI7CiAKLQlpZiAoISBQeURhdGVUaW1lX0NoZWNrKG90aGVyKSkgewotCQkvKiBJZiBvdGhlciBoYXMgYSAidGltZXR1cGxlIiBhdHRyLCB0aGF0J3MgYW4gYWR2ZXJ0aXNlZAotCQkgKiBob29rIGZvciBvdGhlciBjbGFzc2VzIHRvIGFzayB0byBnZXQgY29tcGFyaXNvbiBjb250cm9sLgotCQkgKiBIb3dldmVyLCBkYXRlIGluc3RhbmNlcyBoYXZlIGEgdGltZXR1cGxlIGF0dHIsIGFuZCB3ZQotCQkgKiBkb24ndCB3YW50IHRvIGFsbG93IHRoYXQgY29tcGFyaXNvbi4gIEJlY2F1c2UgZGF0ZXRpbWUKLQkJICogaXMgYSBzdWJjbGFzcyBvZiBkYXRlLCB3aGVuIG1peGluZyBkYXRlIGFuZCBkYXRldGltZQotCQkgKiBpbiBhIGNvbXBhcmlzb24sIFB5dGhvbiBnaXZlcyBkYXRldGltZSB0aGUgZmlyc3Qgc2hvdAotCQkgKiAoaXQncyB0aGUgbW9yZSBzcGVjaWZpYyBzdWJ0eXBlKS4gIFNvIHdlIGNhbiBzdG9wIHRoYXQKLQkJICogY29tYmluYXRpb24gaGVyZSByZWxpYWJseS4KLQkJICovCi0JCWlmIChQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG90aGVyLCAidGltZXR1cGxlIikgJiYKLQkJICAgICEgUHlEYXRlX0NoZWNrKG90aGVyKSkgewotCQkJLyogQSBob29rIGZvciBvdGhlciBraW5kcyBvZiBkYXRldGltZSBvYmplY3RzLiAqLwotCQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQkJfQotCQlpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpIHsKLQkJCVB5T2JqZWN0ICpyZXN1bHQgPSBvcCA9PSBQeV9FUSA/IFB5X0ZhbHNlIDogUHlfVHJ1ZTsKLQkJCVB5X0lOQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkvKiBTdG9wIHRoaXMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uLiAqLwotCQlyZXR1cm4gY21wZXJyb3IoKFB5T2JqZWN0ICopc2VsZiwgb3RoZXIpOwotCX0KKyAgICBpZiAoISBQeURhdGVUaW1lX0NoZWNrKG90aGVyKSkgeworICAgICAgICAvKiBJZiBvdGhlciBoYXMgYSAidGltZXR1cGxlIiBhdHRyLCB0aGF0J3MgYW4gYWR2ZXJ0aXNlZAorICAgICAgICAgKiBob29rIGZvciBvdGhlciBjbGFzc2VzIHRvIGFzayB0byBnZXQgY29tcGFyaXNvbiBjb250cm9sLgorICAgICAgICAgKiBIb3dldmVyLCBkYXRlIGluc3RhbmNlcyBoYXZlIGEgdGltZXR1cGxlIGF0dHIsIGFuZCB3ZQorICAgICAgICAgKiBkb24ndCB3YW50IHRvIGFsbG93IHRoYXQgY29tcGFyaXNvbi4gIEJlY2F1c2UgZGF0ZXRpbWUKKyAgICAgICAgICogaXMgYSBzdWJjbGFzcyBvZiBkYXRlLCB3aGVuIG1peGluZyBkYXRlIGFuZCBkYXRldGltZQorICAgICAgICAgKiBpbiBhIGNvbXBhcmlzb24sIFB5dGhvbiBnaXZlcyBkYXRldGltZSB0aGUgZmlyc3Qgc2hvdAorICAgICAgICAgKiAoaXQncyB0aGUgbW9yZSBzcGVjaWZpYyBzdWJ0eXBlKS4gIFNvIHdlIGNhbiBzdG9wIHRoYXQKKyAgICAgICAgICogY29tYmluYXRpb24gaGVyZSByZWxpYWJseS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG90aGVyLCAidGltZXR1cGxlIikgJiYKKyAgICAgICAgICAgICEgUHlEYXRlX0NoZWNrKG90aGVyKSkgeworICAgICAgICAgICAgLyogQSBob29rIGZvciBvdGhlciBraW5kcyBvZiBkYXRldGltZSBvYmplY3RzLiAqLworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICAgICAgfQorICAgICAgICBpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBvcCA9PSBQeV9FUSA/IFB5X0ZhbHNlIDogUHlfVHJ1ZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAvKiBTdG9wIHRoaXMgZnJvbSBmYWxsaW5nIGJhY2sgdG8gYWRkcmVzcyBjb21wYXJpc29uLiAqLworICAgICAgICByZXR1cm4gY21wZXJyb3IoKFB5T2JqZWN0ICopc2VsZiwgb3RoZXIpOworICAgIH0KIAotCWlmIChjbGFzc2lmeV90d29fdXRjb2Zmc2V0cygoUHlPYmplY3QgKilzZWxmLCAmb2Zmc2V0MSwgJm4xLAotCQkJCSAgICAoUHlPYmplY3QgKilzZWxmLAotCQkJCSAgICAgb3RoZXIsICZvZmZzZXQyLCAmbjIsCi0JCQkJICAgICBvdGhlcikgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQobjEgIT0gT0ZGU0VUX1VOS05PV04gJiYgbjIgIT0gT0ZGU0VUX1VOS05PV04pOwotIAkvKiBJZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9yIGJvdGggYXdhcmUgYW5kIGhhdmUgdGhlIHNhbWUgb2Zmc2V0cywKLQkgKiB3ZSBnZXQgb2ZmIGNoZWFwLiAgTm90ZSB0aGF0IGlmIHRoZXkncmUgYm90aCBuYWl2ZSwgb2Zmc2V0MSA9PQotCSAqIG9mZnNldDIgPT0gMCBhdCB0aGlzIHBvaW50LgotCSAqLwotCWlmIChuMSA9PSBuMiAmJiBvZmZzZXQxID09IG9mZnNldDIpIHsKLQkJZGlmZiA9IG1lbWNtcChzZWxmLT5kYXRhLCAoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilvdGhlciktPmRhdGEsCi0JCQkgICAgICBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSk7Ci0JCXJldHVybiBkaWZmX3RvX2Jvb2woZGlmZiwgb3ApOwotCX0KKyAgICBpZiAoY2xhc3NpZnlfdHdvX3V0Y29mZnNldHMoKFB5T2JqZWN0ICopc2VsZiwgJm9mZnNldDEsICZuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLCAmb2Zmc2V0MiwgJm4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KG4xICE9IE9GRlNFVF9VTktOT1dOICYmIG4yICE9IE9GRlNFVF9VTktOT1dOKTsKKyAgICAvKiBJZiB0aGV5J3JlIGJvdGggbmFpdmUsIG9yIGJvdGggYXdhcmUgYW5kIGhhdmUgdGhlIHNhbWUgb2Zmc2V0cywKKyAgICAgKiB3ZSBnZXQgb2ZmIGNoZWFwLiAgTm90ZSB0aGF0IGlmIHRoZXkncmUgYm90aCBuYWl2ZSwgb2Zmc2V0MSA9PQorICAgICAqIG9mZnNldDIgPT0gMCBhdCB0aGlzIHBvaW50LgorICAgICAqLworICAgIGlmIChuMSA9PSBuMiAmJiBvZmZzZXQxID09IG9mZnNldDIpIHsKKyAgICAgICAgZGlmZiA9IG1lbWNtcChzZWxmLT5kYXRhLCAoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilvdGhlciktPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUpOworICAgICAgICByZXR1cm4gZGlmZl90b19ib29sKGRpZmYsIG9wKTsKKyAgICB9CiAKLQlpZiAobjEgPT0gT0ZGU0VUX0FXQVJFICYmIG4yID09IE9GRlNFVF9BV0FSRSkgewotCQlQeURhdGVUaW1lX0RlbHRhICpkZWx0YTsKKyAgICBpZiAobjEgPT0gT0ZGU0VUX0FXQVJFICYmIG4yID09IE9GRlNFVF9BV0FSRSkgeworICAgICAgICBQeURhdGVUaW1lX0RlbHRhICpkZWx0YTsKIAotCQlhc3NlcnQob2Zmc2V0MSAhPSBvZmZzZXQyKTsJLyogZWxzZSBsYXN0ICJpZiIgaGFuZGxlZCBpdCAqLwotCQlkZWx0YSA9IChQeURhdGVUaW1lX0RlbHRhICopZGF0ZXRpbWVfc3VidHJhY3QoKFB5T2JqZWN0ICopc2VsZiwKLQkJCQkJCQkgICAgICAgb3RoZXIpOwotCQlpZiAoZGVsdGEgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlkaWZmID0gR0VUX1REX0RBWVMoZGVsdGEpOwotCQlpZiAoZGlmZiA9PSAwKQotCQkJZGlmZiA9IEdFVF9URF9TRUNPTkRTKGRlbHRhKSB8Ci0JCQkgICAgICAgR0VUX1REX01JQ1JPU0VDT05EUyhkZWx0YSk7Ci0JCVB5X0RFQ1JFRihkZWx0YSk7Ci0JCXJldHVybiBkaWZmX3RvX2Jvb2woZGlmZiwgb3ApOwotCX0KKyAgICAgICAgYXNzZXJ0KG9mZnNldDEgIT0gb2Zmc2V0Mik7ICAgICAgICAgICAgIC8qIGVsc2UgbGFzdCAiaWYiIGhhbmRsZWQgaXQgKi8KKyAgICAgICAgZGVsdGEgPSAoUHlEYXRlVGltZV9EZWx0YSAqKWRhdGV0aW1lX3N1YnRyYWN0KChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIpOworICAgICAgICBpZiAoZGVsdGEgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBkaWZmID0gR0VUX1REX0RBWVMoZGVsdGEpOworICAgICAgICBpZiAoZGlmZiA9PSAwKQorICAgICAgICAgICAgZGlmZiA9IEdFVF9URF9TRUNPTkRTKGRlbHRhKSB8CisgICAgICAgICAgICAgICAgICAgR0VUX1REX01JQ1JPU0VDT05EUyhkZWx0YSk7CisgICAgICAgIFB5X0RFQ1JFRihkZWx0YSk7CisgICAgICAgIHJldHVybiBkaWZmX3RvX2Jvb2woZGlmZiwgb3ApOworICAgIH0KIAotCWFzc2VydChuMSAhPSBuMik7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJjYW4ndCBjb21wYXJlIG9mZnNldC1uYWl2ZSBhbmQgIgotCQkJIm9mZnNldC1hd2FyZSBkYXRldGltZXMiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQobjEgIT0gbjIpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjYW4ndCBjb21wYXJlIG9mZnNldC1uYWl2ZSBhbmQgIgorICAgICAgICAgICAgICAgICAgICAib2Zmc2V0LWF3YXJlIGRhdGV0aW1lcyIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgbG9uZwogZGF0ZXRpbWVfaGFzaChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCWlmIChzZWxmLT5oYXNoY29kZSA9PSAtMSkgewotCQluYWl2ZXR5IG47Ci0JCWludCBvZmZzZXQ7Ci0JCVB5T2JqZWN0ICp0ZW1wOworICAgIGlmIChzZWxmLT5oYXNoY29kZSA9PSAtMSkgeworICAgICAgICBuYWl2ZXR5IG47CisgICAgICAgIGludCBvZmZzZXQ7CisgICAgICAgIFB5T2JqZWN0ICp0ZW1wOwogCi0JCW4gPSBjbGFzc2lmeV91dGNvZmZzZXQoKFB5T2JqZWN0ICopc2VsZiwgKFB5T2JqZWN0ICopc2VsZiwKLQkJCQkgICAgICAgJm9mZnNldCk7Ci0JCWFzc2VydChuICE9IE9GRlNFVF9VTktOT1dOKTsKLQkJaWYgKG4gPT0gT0ZGU0VUX0VSUk9SKQotCQkJcmV0dXJuIC0xOworICAgICAgICBuID0gY2xhc3NpZnlfdXRjb2Zmc2V0KChQeU9iamVjdCAqKXNlbGYsIChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7CisgICAgICAgIGFzc2VydChuICE9IE9GRlNFVF9VTktOT1dOKTsKKyAgICAgICAgaWYgKG4gPT0gT0ZGU0VUX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCS8qIFJlZHVjZSB0aGlzIHRvIGEgaGFzaCBvZiBhbm90aGVyIG9iamVjdC4gKi8KLQkJaWYgKG4gPT0gT0ZGU0VUX05BSVZFKQotCQkJdGVtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQkJCQkoY2hhciAqKXNlbGYtPmRhdGEsCi0JCQkJCV9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFKTsKLQkJZWxzZSB7Ci0JCQlpbnQgZGF5czsKLQkJCWludCBzZWNvbmRzOworICAgICAgICAvKiBSZWR1Y2UgdGhpcyB0byBhIGhhc2ggb2YgYW5vdGhlciBvYmplY3QuICovCisgICAgICAgIGlmIChuID09IE9GRlNFVF9OQUlWRSkKKyAgICAgICAgICAgIHRlbXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKXNlbGYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkUpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBkYXlzOworICAgICAgICAgICAgaW50IHNlY29uZHM7CiAKLQkJCWFzc2VydChuID09IE9GRlNFVF9BV0FSRSk7Ci0JCQlhc3NlcnQoSEFTVFpJTkZPKHNlbGYpKTsKLQkJCWRheXMgPSB5bWRfdG9fb3JkKEdFVF9ZRUFSKHNlbGYpLAotCQkJCQkgIEdFVF9NT05USChzZWxmKSwKLQkJCQkJICBHRVRfREFZKHNlbGYpKTsKLQkJCXNlY29uZHMgPSBEQVRFX0dFVF9IT1VSKHNlbGYpICogMzYwMCArCi0JCQkJICAoREFURV9HRVRfTUlOVVRFKHNlbGYpIC0gb2Zmc2V0KSAqIDYwICsKLQkJCQkgIERBVEVfR0VUX1NFQ09ORChzZWxmKTsKLQkJCXRlbXAgPSBuZXdfZGVsdGEoZGF5cywKLQkJCQkJIHNlY29uZHMsCi0JCQkJCSBEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSwKLQkJCQkJIDEpOwotCQl9Ci0JCWlmICh0ZW1wICE9IE5VTEwpIHsKLQkJCXNlbGYtPmhhc2hjb2RlID0gUHlPYmplY3RfSGFzaCh0ZW1wKTsKLQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJfQotCX0KLQlyZXR1cm4gc2VsZi0+aGFzaGNvZGU7CisgICAgICAgICAgICBhc3NlcnQobiA9PSBPRkZTRVRfQVdBUkUpOworICAgICAgICAgICAgYXNzZXJ0KEhBU1RaSU5GTyhzZWxmKSk7CisgICAgICAgICAgICBkYXlzID0geW1kX3RvX29yZChHRVRfWUVBUihzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZikpOworICAgICAgICAgICAgc2Vjb25kcyA9IERBVEVfR0VUX0hPVVIoc2VsZikgKiAzNjAwICsKKyAgICAgICAgICAgICAgICAgICAgICAoREFURV9HRVRfTUlOVVRFKHNlbGYpIC0gb2Zmc2V0KSAqIDYwICsKKyAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZik7CisgICAgICAgICAgICB0ZW1wID0gbmV3X2RlbHRhKGRheXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGVtcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBzZWxmLT5oYXNoY29kZSA9IFB5T2JqZWN0X0hhc2godGVtcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNlbGYtPmhhc2hjb2RlOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfcmVwbGFjZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpjbG9uZTsKLQlQeU9iamVjdCAqdHVwbGU7Ci0JaW50IHkgPSBHRVRfWUVBUihzZWxmKTsKLQlpbnQgbSA9IEdFVF9NT05USChzZWxmKTsKLQlpbnQgZCA9IEdFVF9EQVkoc2VsZik7Ci0JaW50IGhoID0gREFURV9HRVRfSE9VUihzZWxmKTsKLQlpbnQgbW0gPSBEQVRFX0dFVF9NSU5VVEUoc2VsZik7Ci0JaW50IHNzID0gREFURV9HRVRfU0VDT05EKHNlbGYpOwotCWludCB1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOwotCVB5T2JqZWN0ICp0emluZm8gPSBIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpjbG9uZTsKKyAgICBQeU9iamVjdCAqdHVwbGU7CisgICAgaW50IHkgPSBHRVRfWUVBUihzZWxmKTsKKyAgICBpbnQgbSA9IEdFVF9NT05USChzZWxmKTsKKyAgICBpbnQgZCA9IEdFVF9EQVkoc2VsZik7CisgICAgaW50IGhoID0gREFURV9HRVRfSE9VUihzZWxmKTsKKyAgICBpbnQgbW0gPSBEQVRFX0dFVF9NSU5VVEUoc2VsZik7CisgICAgaW50IHNzID0gREFURV9HRVRfU0VDT05EKHNlbGYpOworICAgIGludCB1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOworICAgIFB5T2JqZWN0ICp0emluZm8gPSBIQVNUWklORk8oc2VsZikgPyBzZWxmLT50emluZm8gOiBQeV9Ob25lOwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifGlpaWlpaWlPOnJlcGxhY2UiLAotCQkJCQkgIGRhdGV0aW1lX2t3cywKLQkJCQkJICAmeSwgJm0sICZkLCAmaGgsICZtbSwgJnNzLCAmdXMsCi0JCQkJCSAgJnR6aW5mbykpCi0JCXJldHVybiBOVUxMOwotCXR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiaWlpaWlpaU8iLCB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKTsKLQlpZiAodHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JY2xvbmUgPSBkYXRldGltZV9uZXcoUHlfVFlQRShzZWxmKSwgdHVwbGUsIE5VTEwpOwotCVB5X0RFQ1JFRih0dXBsZSk7Ci0JcmV0dXJuIGNsb25lOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxpaWlpaWlpTzpyZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWVfa3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeSwgJm0sICZkLCAmaGgsICZtbSwgJnNzLCAmdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0emluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0dXBsZSA9IFB5X0J1aWxkVmFsdWUoImlpaWlpaWlPIiwgeSwgbSwgZCwgaGgsIG1tLCBzcywgdXMsIHR6aW5mbyk7CisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNsb25lID0gZGF0ZXRpbWVfbmV3KFB5X1RZUEUoc2VsZiksIHR1cGxlLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYodHVwbGUpOworICAgIHJldHVybiBjbG9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2FzdGltZXpvbmUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlpbnQgeSwgbSwgZCwgaGgsIG1tLCBzcywgdXM7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlpbnQgb2Zmc2V0LCBub25lOworICAgIGludCB5LCBtLCBkLCBoaCwgbW0sIHNzLCB1czsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBvZmZzZXQsIG5vbmU7CiAKLQlQeU9iamVjdCAqdHppbmZvOwotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJ0eiIsIE5VTEx9OworICAgIFB5T2JqZWN0ICp0emluZm87CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InR6IiwgTlVMTH07CiAKLQlpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPITphc3RpbWV6b25lIiwga2V5d29yZHMsCi0JCQkJCSAgJlB5RGF0ZVRpbWVfVFpJbmZvVHlwZSwgJnR6aW5mbykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk8hOmFzdGltZXpvbmUiLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5RGF0ZVRpbWVfVFpJbmZvVHlwZSwgJnR6aW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmICghSEFTVFpJTkZPKHNlbGYpIHx8IHNlbGYtPnR6aW5mbyA9PSBQeV9Ob25lKQotICAgICAgICAJZ290byBOZWVkQXdhcmU7CisgICAgaWYgKCFIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCisgICAgICAgIGdvdG8gTmVlZEF3YXJlOwogCi0gICAgICAgIC8qIENvbnZlcnNpb24gdG8gc2VsZidzIG93biB0aW1lIHpvbmUgaXMgYSBOT1AuICovCi0JaWYgKHNlbGYtPnR6aW5mbyA9PSB0emluZm8pIHsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKLQl9CisgICAgLyogQ29udmVyc2lvbiB0byBzZWxmJ3Mgb3duIHRpbWUgem9uZSBpcyBhIE5PUC4gKi8KKyAgICBpZiAoc2VsZi0+dHppbmZvID09IHR6aW5mbykgeworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIH0KIAotICAgICAgICAvKiBDb252ZXJ0IHNlbGYgdG8gVVRDLiAqLwotICAgICAgICBvZmZzZXQgPSBjYWxsX3V0Y29mZnNldChzZWxmLT50emluZm8sIChQeU9iamVjdCAqKXNlbGYsICZub25lKTsKLSAgICAgICAgaWYgKG9mZnNldCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAJcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmIChub25lKQotICAgICAgICAJZ290byBOZWVkQXdhcmU7CisgICAgLyogQ29udmVydCBzZWxmIHRvIFVUQy4gKi8KKyAgICBvZmZzZXQgPSBjYWxsX3V0Y29mZnNldChzZWxmLT50emluZm8sIChQeU9iamVjdCAqKXNlbGYsICZub25lKTsKKyAgICBpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChub25lKQorICAgICAgICBnb3RvIE5lZWRBd2FyZTsKIAotCXkgPSBHRVRfWUVBUihzZWxmKTsKLQltID0gR0VUX01PTlRIKHNlbGYpOwotCWQgPSBHRVRfREFZKHNlbGYpOwotCWhoID0gREFURV9HRVRfSE9VUihzZWxmKTsKLQltbSA9IERBVEVfR0VUX01JTlVURShzZWxmKTsKLQlzcyA9IERBVEVfR0VUX1NFQ09ORChzZWxmKTsKLQl1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOworICAgIHkgPSBHRVRfWUVBUihzZWxmKTsKKyAgICBtID0gR0VUX01PTlRIKHNlbGYpOworICAgIGQgPSBHRVRfREFZKHNlbGYpOworICAgIGhoID0gREFURV9HRVRfSE9VUihzZWxmKTsKKyAgICBtbSA9IERBVEVfR0VUX01JTlVURShzZWxmKTsKKyAgICBzcyA9IERBVEVfR0VUX1NFQ09ORChzZWxmKTsKKyAgICB1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOwogCi0JbW0gLT0gb2Zmc2V0OwotCWlmICgobW0gPCAwIHx8IG1tID49IDYwKSAmJgotCSAgICBub3JtYWxpemVfZGF0ZXRpbWUoJnksICZtLCAmZCwgJmhoLCAmbW0sICZzcywgJnVzKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIG1tIC09IG9mZnNldDsKKyAgICBpZiAoKG1tIDwgMCB8fCBtbSA+PSA2MCkgJiYKKyAgICAgICAgbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEF0dGFjaCBuZXcgdHppbmZvIGFuZCBsZXQgZnJvbXV0YygpIGRvIHRoZSByZXN0LiAqLwotCXJlc3VsdCA9IG5ld19kYXRldGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCB1cywgdHppbmZvKTsKLQlpZiAocmVzdWx0ICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnRlbXAgPSByZXN1bHQ7CisgICAgLyogQXR0YWNoIG5ldyB0emluZm8gYW5kIGxldCBmcm9tdXRjKCkgZG8gdGhlIHJlc3QuICovCisgICAgcmVzdWx0ID0gbmV3X2RhdGV0aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIHVzLCB0emluZm8pOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IHJlc3VsdDsKIAotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHR6aW5mbywgImZyb211dGMiLCAiTyIsIHRlbXApOwotCQlQeV9ERUNSRUYodGVtcCk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodHppbmZvLCAiZnJvbXV0YyIsICJPIiwgdGVtcCk7CisgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIAogTmVlZEF3YXJlOgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYXN0aW1lem9uZSgpIGNhbm5vdCBiZSBhcHBsaWVkIHRvICIKLQkJCQkJICAiYSBuYWl2ZSBkYXRldGltZSIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYXN0aW1lem9uZSgpIGNhbm5vdCBiZSBhcHBsaWVkIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgbmFpdmUgZGF0ZXRpbWUiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3RpbWV0dXBsZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCWludCBkc3RmbGFnID0gLTE7CisgICAgaW50IGRzdGZsYWcgPSAtMTsKIAotCWlmIChIQVNUWklORk8oc2VsZikgJiYgc2VsZi0+dHppbmZvICE9IFB5X05vbmUpIHsKLQkJaW50IG5vbmU7CisgICAgaWYgKEhBU1RaSU5GTyhzZWxmKSAmJiBzZWxmLT50emluZm8gIT0gUHlfTm9uZSkgeworICAgICAgICBpbnQgbm9uZTsKIAotCQlkc3RmbGFnID0gY2FsbF9kc3Qoc2VsZi0+dHppbmZvLCAoUHlPYmplY3QgKilzZWxmLCAmbm9uZSk7Ci0JCWlmIChkc3RmbGFnID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgZHN0ZmxhZyA9IGNhbGxfZHN0KHNlbGYtPnR6aW5mbywgKFB5T2JqZWN0ICopc2VsZiwgJm5vbmUpOworICAgICAgICBpZiAoZHN0ZmxhZyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKG5vbmUpCi0JCQlkc3RmbGFnID0gLTE7Ci0JCWVsc2UgaWYgKGRzdGZsYWcgIT0gMCkKLQkJCWRzdGZsYWcgPSAxOworICAgICAgICBpZiAobm9uZSkKKyAgICAgICAgICAgIGRzdGZsYWcgPSAtMTsKKyAgICAgICAgZWxzZSBpZiAoZHN0ZmxhZyAhPSAwKQorICAgICAgICAgICAgZHN0ZmxhZyA9IDE7CiAKLQl9Ci0JcmV0dXJuIGJ1aWxkX3N0cnVjdF90aW1lKEdFVF9ZRUFSKHNlbGYpLAotCQkJCSBHRVRfTU9OVEgoc2VsZiksCi0JCQkJIEdFVF9EQVkoc2VsZiksCi0JCQkJIERBVEVfR0VUX0hPVVIoc2VsZiksCi0JCQkJIERBVEVfR0VUX01JTlVURShzZWxmKSwKLQkJCQkgREFURV9HRVRfU0VDT05EKHNlbGYpLAotCQkJCSBkc3RmbGFnKTsKKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkX3N0cnVjdF90aW1lKEdFVF9ZRUFSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfTU9OVEgoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX0hPVVIoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX01JTlVURShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfU0VDT05EKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RmbGFnKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX2dldGRhdGUoUHlEYXRlVGltZV9EYXRlVGltZSAqc2VsZikKIHsKLQlyZXR1cm4gbmV3X2RhdGUoR0VUX1lFQVIoc2VsZiksCi0JCQlHRVRfTU9OVEgoc2VsZiksCi0JCQlHRVRfREFZKHNlbGYpKTsKKyAgICByZXR1cm4gbmV3X2RhdGUoR0VUX1lFQVIoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIEdFVF9NT05USChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgR0VUX0RBWShzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9nZXR0aW1lKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCiB7Ci0JcmV0dXJuIG5ld190aW1lKERBVEVfR0VUX0hPVVIoc2VsZiksCi0JCQlEQVRFX0dFVF9NSU5VVEUoc2VsZiksCi0JCQlEQVRFX0dFVF9TRUNPTkQoc2VsZiksCi0JCQlEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSwKLQkJCVB5X05vbmUpOworICAgIHJldHVybiBuZXdfdGltZShEQVRFX0dFVF9IT1VSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIFB5X05vbmUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfZ2V0dGltZXR6KFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCiB7Ci0JcmV0dXJuIG5ld190aW1lKERBVEVfR0VUX0hPVVIoc2VsZiksCi0JCQlEQVRFX0dFVF9NSU5VVEUoc2VsZiksCi0JCQlEQVRFX0dFVF9TRUNPTkQoc2VsZiksCi0JCQlEQVRFX0dFVF9NSUNST1NFQ09ORChzZWxmKSwKLQkJCUhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUpOworICAgIHJldHVybiBuZXdfdGltZShEQVRFX0dFVF9IT1VSKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZiksCisgICAgICAgICAgICAgICAgICAgIEhBU1RaSU5GTyhzZWxmKSA/IHNlbGYtPnR6aW5mbyA6IFB5X05vbmUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdXRjdGltZXR1cGxlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYpCiB7Ci0JaW50IHkgPSBHRVRfWUVBUihzZWxmKTsKLQlpbnQgbSA9IEdFVF9NT05USChzZWxmKTsKLQlpbnQgZCA9IEdFVF9EQVkoc2VsZik7Ci0JaW50IGhoID0gREFURV9HRVRfSE9VUihzZWxmKTsKLQlpbnQgbW0gPSBEQVRFX0dFVF9NSU5VVEUoc2VsZik7Ci0JaW50IHNzID0gREFURV9HRVRfU0VDT05EKHNlbGYpOwotCWludCB1cyA9IDA7CS8qIG1pY3Jvc2Vjb25kcyBhcmUgaWdub3JlZCBpbiBhIHRpbWV0dXBsZSAqLwotCWludCBvZmZzZXQgPSAwOworICAgIGludCB5ID0gR0VUX1lFQVIoc2VsZik7CisgICAgaW50IG0gPSBHRVRfTU9OVEgoc2VsZik7CisgICAgaW50IGQgPSBHRVRfREFZKHNlbGYpOworICAgIGludCBoaCA9IERBVEVfR0VUX0hPVVIoc2VsZik7CisgICAgaW50IG1tID0gREFURV9HRVRfTUlOVVRFKHNlbGYpOworICAgIGludCBzcyA9IERBVEVfR0VUX1NFQ09ORChzZWxmKTsKKyAgICBpbnQgdXMgPSAwOyAgICAgICAgIC8qIG1pY3Jvc2Vjb25kcyBhcmUgaWdub3JlZCBpbiBhIHRpbWV0dXBsZSAqLworICAgIGludCBvZmZzZXQgPSAwOwogCi0JaWYgKEhBU1RaSU5GTyhzZWxmKSAmJiBzZWxmLT50emluZm8gIT0gUHlfTm9uZSkgewotCQlpbnQgbm9uZTsKKyAgICBpZiAoSEFTVFpJTkZPKHNlbGYpICYmIHNlbGYtPnR6aW5mbyAhPSBQeV9Ob25lKSB7CisgICAgICAgIGludCBub25lOwogCi0JCW9mZnNldCA9IGNhbGxfdXRjb2Zmc2V0KHNlbGYtPnR6aW5mbywgKFB5T2JqZWN0ICopc2VsZiwgJm5vbmUpOwotCQlpZiAob2Zmc2V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogRXZlbiBpZiBvZmZzZXQgaXMgMCwgZG9uJ3QgY2FsbCB0aW1ldHVwbGUoKSAtLSB0bV9pc2RzdCBzaG91bGQgYmUKLQkgKiAwIGluIGEgVVRDIHRpbWV0dXBsZSByZWdhcmRsZXNzIG9mIHdoYXQgZHN0KCkgc2F5cy4KLQkgKi8KLQlpZiAob2Zmc2V0KSB7Ci0JCS8qIFN1YnRyYWN0IG9mZnNldCBtaW51dGVzICYgbm9ybWFsaXplLiAqLwotCQlpbnQgc3RhdDsKKyAgICAgICAgb2Zmc2V0ID0gY2FsbF91dGNvZmZzZXQoc2VsZi0+dHppbmZvLCAoUHlPYmplY3QgKilzZWxmLCAmbm9uZSk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBFdmVuIGlmIG9mZnNldCBpcyAwLCBkb24ndCBjYWxsIHRpbWV0dXBsZSgpIC0tIHRtX2lzZHN0IHNob3VsZCBiZQorICAgICAqIDAgaW4gYSBVVEMgdGltZXR1cGxlIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBkc3QoKSBzYXlzLgorICAgICAqLworICAgIGlmIChvZmZzZXQpIHsKKyAgICAgICAgLyogU3VidHJhY3Qgb2Zmc2V0IG1pbnV0ZXMgJiBub3JtYWxpemUuICovCisgICAgICAgIGludCBzdGF0OwogCi0JCW1tIC09IG9mZnNldDsKLQkJc3RhdCA9IG5vcm1hbGl6ZV9kYXRldGltZSgmeSwgJm0sICZkLCAmaGgsICZtbSwgJnNzLCAmdXMpOwotCQlpZiAoc3RhdCA8IDApIHsKLQkJCS8qIEF0IHRoZSBlZGdlcywgaXQncyBwb3NzaWJsZSB3ZSBvdmVyZmxvd2VkCi0JCQkgKiBiZXlvbmQgTUlOWUVBUiBvciBNQVhZRUFSLgotCQkJICovCi0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19PdmVyZmxvd0Vycm9yKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJZWxzZQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBidWlsZF9zdHJ1Y3RfdGltZSh5LCBtLCBkLCBoaCwgbW0sIHNzLCAwKTsKKyAgICAgICAgbW0gLT0gb2Zmc2V0OworICAgICAgICBzdGF0ID0gbm9ybWFsaXplX2RhdGV0aW1lKCZ5LCAmbSwgJmQsICZoaCwgJm1tLCAmc3MsICZ1cyk7CisgICAgICAgIGlmIChzdGF0IDwgMCkgeworICAgICAgICAgICAgLyogQXQgdGhlIGVkZ2VzLCBpdCdzIHBvc3NpYmxlIHdlIG92ZXJmbG93ZWQKKyAgICAgICAgICAgICAqIGJleW9uZCBNSU5ZRUFSIG9yIE1BWFlFQVIuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJ1aWxkX3N0cnVjdF90aW1lKHksIG0sIGQsIGhoLCBtbSwgc3MsIDApOwogfQogCiAvKiBQaWNrbGUgc3VwcG9ydCwgYSBzaW1wbGUgdXNlIG9mIF9fcmVkdWNlX18uICovCkBAIC00NTQyLDEwMiArNDU0MiwxMDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYXRldGltZV9nZXRzdGF0ZShQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmKQogewotCVB5T2JqZWN0ICpiYXNlc3RhdGU7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmJhc2VzdGF0ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIAotCWJhc2VzdGF0ZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+ZGF0YSwKLQkJCQkJICBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSk7Ci0JaWYgKGJhc2VzdGF0ZSAhPSBOVUxMKSB7Ci0JCWlmICghIEhBU1RaSU5GTyhzZWxmKSB8fCBzZWxmLT50emluZm8gPT0gUHlfTm9uZSkKLQkJCXJlc3VsdCA9IFB5VHVwbGVfUGFjaygxLCBiYXNlc3RhdGUpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBQeVR1cGxlX1BhY2soMiwgYmFzZXN0YXRlLCBzZWxmLT50emluZm8pOwotCQlQeV9ERUNSRUYoYmFzZXN0YXRlKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBiYXNlc3RhdGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFKTsKKyAgICBpZiAoYmFzZXN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCEgSEFTVFpJTkZPKHNlbGYpIHx8IHNlbGYtPnR6aW5mbyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDEsIGJhc2VzdGF0ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfUGFjaygyLCBiYXNlc3RhdGUsIHNlbGYtPnR6aW5mbyk7CisgICAgICAgIFB5X0RFQ1JFRihiYXNlc3RhdGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfcmVkdWNlKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTikiLCBQeV9UWVBFKHNlbGYpLCBkYXRldGltZV9nZXRzdGF0ZShzZWxmKSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihPTikiLCBQeV9UWVBFKHNlbGYpLCBkYXRldGltZV9nZXRzdGF0ZShzZWxmKSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkYXRldGltZV9tZXRob2RzW10gPSB7CiAKLQkvKiBDbGFzcyBtZXRob2RzOiAqLworICAgIC8qIENsYXNzIG1ldGhvZHM6ICovCiAKLQl7Im5vdyIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX25vdywKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUyB8IE1FVEhfQ0xBU1MsCi0JIFB5RG9jX1NUUigiW3R6XSAtPiBuZXcgZGF0ZXRpbWUgd2l0aCB0eidzIGxvY2FsIGRheSBhbmQgdGltZS4iKX0sCisgICAgeyJub3ciLCAgICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV9ub3csCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAorICAgICBQeURvY19TVFIoIlt0el0gLT4gbmV3IGRhdGV0aW1lIHdpdGggdHoncyBsb2NhbCBkYXkgYW5kIHRpbWUuIil9LAogCi0JeyJ1dGNub3ciLCAgICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV91dGNub3csCi0JIE1FVEhfTk9BUkdTIHwgTUVUSF9DTEFTUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gYSBuZXcgZGF0ZXRpbWUgcmVwcmVzZW50aW5nIFVUQyBkYXkgYW5kIHRpbWUuIil9LAorICAgIHsidXRjbm93IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdXRjbm93LAorICAgICBNRVRIX05PQVJHUyB8IE1FVEhfQ0xBU1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIGEgbmV3IGRhdGV0aW1lIHJlcHJlc2VudGluZyBVVEMgZGF5IGFuZCB0aW1lLiIpfSwKIAotCXsiZnJvbXRpbWVzdGFtcCIsIChQeUNGdW5jdGlvbilkYXRldGltZV9mcm9tdGltZXN0YW1wLAotCSBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTIHwgTUVUSF9DTEFTUywKLQkgUHlEb2NfU1RSKCJ0aW1lc3RhbXBbLCB0el0gLT4gdHoncyBsb2NhbCB0aW1lIGZyb20gUE9TSVggdGltZXN0YW1wLiIpfSwKKyAgICB7ImZyb210aW1lc3RhbXAiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZnJvbXRpbWVzdGFtcCwKKyAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUyB8IE1FVEhfQ0xBU1MsCisgICAgIFB5RG9jX1NUUigidGltZXN0YW1wWywgdHpdIC0+IHR6J3MgbG9jYWwgdGltZSBmcm9tIFBPU0lYIHRpbWVzdGFtcC4iKX0sCiAKLQl7InV0Y2Zyb210aW1lc3RhbXAiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdXRjZnJvbXRpbWVzdGFtcCwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywKLQkgUHlEb2NfU1RSKCJ0aW1lc3RhbXAgLT4gVVRDIGRhdGV0aW1lIGZyb20gYSBQT1NJWCB0aW1lc3RhbXAgIgotCSAJICAgIihsaWtlIHRpbWUudGltZSgpKS4iKX0sCisgICAgeyJ1dGNmcm9tdGltZXN0YW1wIiwgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3V0Y2Zyb210aW1lc3RhbXAsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsCisgICAgIFB5RG9jX1NUUigidGltZXN0YW1wIC0+IFVUQyBkYXRldGltZSBmcm9tIGEgUE9TSVggdGltZXN0YW1wICIKKyAgICAgICAgICAgICAgICIobGlrZSB0aW1lLnRpbWUoKSkuIil9LAogCi0JeyJzdHJwdGltZSIsIChQeUNGdW5jdGlvbilkYXRldGltZV9zdHJwdGltZSwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9DTEFTUywKLQkgUHlEb2NfU1RSKCJzdHJpbmcsIGZvcm1hdCAtPiBuZXcgZGF0ZXRpbWUgcGFyc2VkIGZyb20gYSBzdHJpbmcgIgotCSAJICAgIihsaWtlIHRpbWUuc3RycHRpbWUoKSkuIil9LAorICAgIHsic3RycHRpbWUiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfc3RycHRpbWUsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsCisgICAgIFB5RG9jX1NUUigic3RyaW5nLCBmb3JtYXQgLT4gbmV3IGRhdGV0aW1lIHBhcnNlZCBmcm9tIGEgc3RyaW5nICIKKyAgICAgICAgICAgICAgICIobGlrZSB0aW1lLnN0cnB0aW1lKCkpLiIpfSwKIAotCXsiY29tYmluZSIsIChQeUNGdW5jdGlvbilkYXRldGltZV9jb21iaW5lLAotCSBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTIHwgTUVUSF9DTEFTUywKLQkgUHlEb2NfU1RSKCJkYXRlLCB0aW1lIC0+IGRhdGV0aW1lIHdpdGggc2FtZSBkYXRlIGFuZCB0aW1lIGZpZWxkcyIpfSwKKyAgICB7ImNvbWJpbmUiLCAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfY29tYmluZSwKKyAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUyB8IE1FVEhfQ0xBU1MsCisgICAgIFB5RG9jX1NUUigiZGF0ZSwgdGltZSAtPiBkYXRldGltZSB3aXRoIHNhbWUgZGF0ZSBhbmQgdGltZSBmaWVsZHMiKX0sCiAKLQkvKiBJbnN0YW5jZSBtZXRob2RzOiAqLworICAgIC8qIEluc3RhbmNlIG1ldGhvZHM6ICovCiAKLQl7ImRhdGUiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV9nZXRkYXRlLCBNRVRIX05PQVJHUywKLSAgICAgICAgIFB5RG9jX1NUUigiUmV0dXJuIGRhdGUgb2JqZWN0IHdpdGggc2FtZSB5ZWFyLCBtb250aCBhbmQgZGF5LiIpfSwKKyAgICB7ImRhdGUiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV9nZXRkYXRlLCBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gZGF0ZSBvYmplY3Qgd2l0aCBzYW1lIHllYXIsIG1vbnRoIGFuZCBkYXkuIil9LAogCi0JeyJ0aW1lIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZ2V0dGltZSwgTUVUSF9OT0FSR1MsCi0gICAgICAgICBQeURvY19TVFIoIlJldHVybiB0aW1lIG9iamVjdCB3aXRoIHNhbWUgdGltZSBidXQgd2l0aCB0emluZm89Tm9uZS4iKX0sCisgICAgeyJ0aW1lIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZ2V0dGltZSwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgb2JqZWN0IHdpdGggc2FtZSB0aW1lIGJ1dCB3aXRoIHR6aW5mbz1Ob25lLiIpfSwKIAotCXsidGltZXR6IiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZ2V0dGltZXR6LCBNRVRIX05PQVJHUywKLSAgICAgICAgIFB5RG9jX1NUUigiUmV0dXJuIHRpbWUgb2JqZWN0IHdpdGggc2FtZSB0aW1lIGFuZCB0emluZm8uIil9LAorICAgIHsidGltZXR6IiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfZ2V0dGltZXR6LCBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGltZSBvYmplY3Qgd2l0aCBzYW1lIHRpbWUgYW5kIHR6aW5mby4iKX0sCiAKLQl7ImN0aW1lIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2N0aW1lLAlNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gY3RpbWUoKSBzdHlsZSBzdHJpbmcuIil9LAorICAgIHsiY3RpbWUiLCAgICAgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfY3RpbWUsICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gY3RpbWUoKSBzdHlsZSBzdHJpbmcuIil9LAogCi0JeyJ0aW1ldHVwbGUiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV90aW1ldHVwbGUsIE1FVEhfTk9BUkdTLAotICAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGltZSB0dXBsZSwgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuIil9LAorICAgIHsidGltZXR1cGxlIiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfdGltZXR1cGxlLCBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGltZSB0dXBsZSwgY29tcGF0aWJsZSB3aXRoIHRpbWUubG9jYWx0aW1lKCkuIil9LAogCi0JeyJ1dGN0aW1ldHVwbGUiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV91dGN0aW1ldHVwbGUsIE1FVEhfTk9BUkdTLAotICAgICAgICAgUHlEb2NfU1RSKCJSZXR1cm4gVVRDIHRpbWUgdHVwbGUsIGNvbXBhdGlibGUgd2l0aCB0aW1lLmxvY2FsdGltZSgpLiIpfSwKKyAgICB7InV0Y3RpbWV0dXBsZSIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3V0Y3RpbWV0dXBsZSwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIFVUQyB0aW1lIHR1cGxlLCBjb21wYXRpYmxlIHdpdGggdGltZS5sb2NhbHRpbWUoKS4iKX0sCiAKLQl7Imlzb2Zvcm1hdCIsICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2lzb2Zvcm1hdCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkgUHlEb2NfU1RSKCJbc2VwXSAtPiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCAiCi0JIAkgICAiWVlZWS1NTS1ERFRISDpNTTpTU1subW1tbW1tXVsrSEg6TU1dLlxuXG4iCi0JIAkgICAic2VwIGlzIHVzZWQgdG8gc2VwYXJhdGUgdGhlIHllYXIgZnJvbSB0aGUgdGltZSwgYW5kICIKLQkgCSAgICJkZWZhdWx0cyB0byAnVCcuIil9LAorICAgIHsiaXNvZm9ybWF0IiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfaXNvZm9ybWF0LCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICBQeURvY19TVFIoIltzZXBdIC0+IHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQsICIKKyAgICAgICAgICAgICAgICJZWVlZLU1NLUREVEhIOk1NOlNTWy5tbW1tbW1dWytISDpNTV0uXG5cbiIKKyAgICAgICAgICAgICAgICJzZXAgaXMgdXNlZCB0byBzZXBhcmF0ZSB0aGUgeWVhciBmcm9tIHRoZSB0aW1lLCBhbmQgIgorICAgICAgICAgICAgICAgImRlZmF1bHRzIHRvICdUJy4iKX0sCiAKLQl7InV0Y29mZnNldCIsCShQeUNGdW5jdGlvbilkYXRldGltZV91dGNvZmZzZXQsIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby51dGNvZmZzZXQoc2VsZikuIil9LAorICAgIHsidXRjb2Zmc2V0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3V0Y29mZnNldCwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLnV0Y29mZnNldChzZWxmKS4iKX0sCiAKLQl7InR6bmFtZSIsCShQeUNGdW5jdGlvbilkYXRldGltZV90em5hbWUsCU1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby50em5hbWUoc2VsZikuIil9LAorICAgIHsidHpuYW1lIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3R6bmFtZSwgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gc2VsZi50emluZm8udHpuYW1lKHNlbGYpLiIpfSwKIAotCXsiZHN0IiwJCShQeUNGdW5jdGlvbilkYXRldGltZV9kc3QsIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby5kc3Qoc2VsZikuIil9LAorICAgIHsiZHN0IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX2RzdCwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLmRzdChzZWxmKS4iKX0sCiAKLQl7InJlcGxhY2UiLCAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3JlcGxhY2UsCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JIFB5RG9jX1NUUigiUmV0dXJuIGRhdGV0aW1lIHdpdGggbmV3IHNwZWNpZmllZCBmaWVsZHMuIil9LAorICAgIHsicmVwbGFjZSIsICAgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfcmVwbGFjZSwgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICBQeURvY19TVFIoIlJldHVybiBkYXRldGltZSB3aXRoIG5ldyBzcGVjaWZpZWQgZmllbGRzLiIpfSwKIAotCXsiYXN0aW1lem9uZSIsICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfYXN0aW1lem9uZSwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkgUHlEb2NfU1RSKCJ0eiAtPiBjb252ZXJ0IHRvIGxvY2FsIHRpbWUgaW4gbmV3IHRpbWV6b25lIHR6XG4iKX0sCisgICAgeyJhc3RpbWV6b25lIiwgIChQeUNGdW5jdGlvbilkYXRldGltZV9hc3RpbWV6b25lLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICBQeURvY19TVFIoInR6IC0+IGNvbnZlcnQgdG8gbG9jYWwgdGltZSBpbiBuZXcgdGltZXpvbmUgdHpcbiIpfSwKIAotCXsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilkYXRldGltZV9yZWR1Y2UsICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJfX3JlZHVjZV9fKCkgLT4gKGNscywgc3RhdGUpIil9LAorICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilkYXRldGltZV9yZWR1Y2UsICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJfX3JlZHVjZV9fKCkgLT4gKGNscywgc3RhdGUpIil9LAogCi0Je05VTEwsCU5VTEx9CisgICAge05VTEwsICAgICAgTlVMTH0KIH07CiAKIHN0YXRpYyBjaGFyIGRhdGV0aW1lX2RvY1tdID0KQEAgLTQ2NDcsNjEgKzQ2NDcsNjEgQEAKIGluc3RhbmNlIG9mIGEgdHppbmZvIHN1YmNsYXNzLiBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBtYXkgYmUgaW50cyBvciBsb25ncy5cbiIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGRhdGV0aW1lX2FzX251bWJlciA9IHsKLQlkYXRldGltZV9hZGQsCQkJCS8qIG5iX2FkZCAqLwotCWRhdGV0aW1lX3N1YnRyYWN0LAkJCS8qIG5iX3N1YnRyYWN0ICovCi0JMCwJCQkJCS8qIG5iX211bHRpcGx5ICovCi0JMCwJCQkJCS8qIG5iX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9yZW1haW5kZXIgKi8KLQkwLAkJCQkJLyogbmJfZGl2bW9kICovCi0JMCwJCQkJCS8qIG5iX3Bvd2VyICovCi0JMCwJCQkJCS8qIG5iX25lZ2F0aXZlICovCi0JMCwJCQkJCS8qIG5iX3Bvc2l0aXZlICovCi0JMCwJCQkJCS8qIG5iX2Fic29sdXRlICovCi0JMCwJCQkJCS8qIG5iX25vbnplcm8gKi8KKyAgICBkYXRldGltZV9hZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2FkZCAqLworICAgIGRhdGV0aW1lX3N1YnRyYWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX211bHRpcGx5ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2bW9kICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3dlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbmVnYXRpdmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3Bvc2l0aXZlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hYnNvbHV0ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbm9uemVybyAqLwogfTsKIAogc3RhdGljaGVyZSBQeVR5cGVPYmplY3QgUHlEYXRlVGltZV9EYXRlVGltZVR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwJCQkJCS8qIG9iX3NpemUgKi8KLQkiZGF0ZXRpbWUuZGF0ZXRpbWUiLAkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHlEYXRlVGltZV9EYXRlVGltZSksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkoZGVzdHJ1Y3RvcilkYXRldGltZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylkYXRldGltZV9yZXByLAkJLyogdHBfcmVwciAqLwotCSZkYXRldGltZV9hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpZGF0ZXRpbWVfaGFzaCwJCS8qIHRwX2hhc2ggKi8KLQkwLCAgICAgICAgICAgICAgCQkJLyogdHBfY2FsbCAqLwotCShyZXByZnVuYylkYXRldGltZV9zdHIsCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLAkJCS8qIHRwX2ZsYWdzICovCi0JZGF0ZXRpbWVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkocmljaGNtcGZ1bmMpZGF0ZXRpbWVfcmljaGNvbXBhcmUsCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlkYXRldGltZV9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCWRhdGV0aW1lX2dldHNldCwJCQkvKiB0cF9nZXRzZXQgKi8KLQkmUHlEYXRlVGltZV9EYXRlVHlwZSwJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQlkYXRldGltZV9hbGxvYywJCQkJLyogdHBfYWxsb2MgKi8KLQlkYXRldGltZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCTAsCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisgICAgImRhdGV0aW1lLmRhdGV0aW1lIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5RGF0ZVRpbWVfRGF0ZVRpbWUpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3IpZGF0ZXRpbWVfZGVhbGxvYywgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylkYXRldGltZV9yZXByLCAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZkYXRldGltZV9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylkYXRldGltZV9oYXNoLCAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYylkYXRldGltZV9zdHIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8CisgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGRhdGV0aW1lX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAocmljaGNtcGZ1bmMpZGF0ZXRpbWVfcmljaGNvbXBhcmUsICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkYXRldGltZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBkYXRldGltZV9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICZQeURhdGVUaW1lX0RhdGVUeXBlLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBkYXRldGltZV9hbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZGF0ZXRpbWVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDcwOSwxOTIgKzQ3MDksMTkyIEBACiAgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEx9CisgICAge05VTEwsIE5VTEx9CiB9OwogCiAvKiBDIEFQSS4gIENsaWVudHMgZ2V0IGF0IHRoaXMgdmlhIFB5RGF0ZVRpbWVfSU1QT1JULCBkZWZpbmVkIGluCiAgKiBkYXRldGltZS5oLgogICovCiBzdGF0aWMgUHlEYXRlVGltZV9DQVBJIENBUEkgPSB7Ci0gICAgICAgICZQeURhdGVUaW1lX0RhdGVUeXBlLAotICAgICAgICAmUHlEYXRlVGltZV9EYXRlVGltZVR5cGUsCi0gICAgICAgICZQeURhdGVUaW1lX1RpbWVUeXBlLAotICAgICAgICAmUHlEYXRlVGltZV9EZWx0YVR5cGUsCi0gICAgICAgICZQeURhdGVUaW1lX1RaSW5mb1R5cGUsCi0gICAgICAgIG5ld19kYXRlX2V4LAotICAgICAgICBuZXdfZGF0ZXRpbWVfZXgsCi0gICAgICAgIG5ld190aW1lX2V4LAotICAgICAgICBuZXdfZGVsdGFfZXgsCi0gICAgICAgIGRhdGV0aW1lX2Zyb210aW1lc3RhbXAsCi0gICAgICAgIGRhdGVfZnJvbXRpbWVzdGFtcAorICAgICZQeURhdGVUaW1lX0RhdGVUeXBlLAorICAgICZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSwKKyAgICAmUHlEYXRlVGltZV9UaW1lVHlwZSwKKyAgICAmUHlEYXRlVGltZV9EZWx0YVR5cGUsCisgICAgJlB5RGF0ZVRpbWVfVFpJbmZvVHlwZSwKKyAgICBuZXdfZGF0ZV9leCwKKyAgICBuZXdfZGF0ZXRpbWVfZXgsCisgICAgbmV3X3RpbWVfZXgsCisgICAgbmV3X2RlbHRhX2V4LAorICAgIGRhdGV0aW1lX2Zyb210aW1lc3RhbXAsCisgICAgZGF0ZV9mcm9tdGltZXN0YW1wCiB9OwogCiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0ZGF0ZXRpbWUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsJLyogYSBtb2R1bGUgb2JqZWN0ICovCi0JUHlPYmplY3QgKmQ7CS8qIGl0cyBkaWN0ICovCi0JUHlPYmplY3QgKng7CisgICAgUHlPYmplY3QgKm07ICAgICAgICAvKiBhIG1vZHVsZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqZDsgICAgICAgIC8qIGl0cyBkaWN0ICovCisgICAgUHlPYmplY3QgKng7CiAKLQltID0gUHlfSW5pdE1vZHVsZTMoImRhdGV0aW1lIiwgbW9kdWxlX21ldGhvZHMsCi0JCQkgICAiRmFzdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGF0ZXRpbWUgdHlwZS4iKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJkYXRldGltZSIsIG1vZHVsZV9tZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFzdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGF0ZXRpbWUgdHlwZS4iKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeURhdGVUaW1lX0RhdGVUeXBlKSA8IDApCi0JCXJldHVybjsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9EZWx0YVR5cGUpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChQeVR5cGVfUmVhZHkoJlB5RGF0ZVRpbWVfVGltZVR5cGUpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChQeVR5cGVfUmVhZHkoJlB5RGF0ZVRpbWVfVFpJbmZvVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9EYXRlVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlEYXRlVGltZV9EYXRlVGltZVR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeURhdGVUaW1lX1RpbWVUeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeURhdGVUaW1lX1RaSW5mb1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogdGltZWRlbHRhIHZhbHVlcyAqLwotCWQgPSBQeURhdGVUaW1lX0RlbHRhVHlwZS50cF9kaWN0OworICAgIC8qIHRpbWVkZWx0YSB2YWx1ZXMgKi8KKyAgICBkID0gUHlEYXRlVGltZV9EZWx0YVR5cGUudHBfZGljdDsKIAotCXggPSBuZXdfZGVsdGEoMCwgMCwgMSwgMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicmVzb2x1dGlvbiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RlbHRhKDAsIDAsIDEsIDApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQl4ID0gbmV3X2RlbHRhKC1NQVhfREVMVEFfREFZUywgMCwgMCwgMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWluIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBuZXdfZGVsdGEoLU1BWF9ERUxUQV9EQVlTLCAwLCAwLCAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtaW4iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQl4ID0gbmV3X2RlbHRhKE1BWF9ERUxUQV9EQVlTLCAyNCozNjAwLTEsIDEwMDAwMDAtMSwgMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWF4IiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBuZXdfZGVsdGEoTUFYX0RFTFRBX0RBWVMsIDI0KjM2MDAtMSwgMTAwMDAwMC0xLCAwKTsKKyAgICBpZiAoeCA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJtYXgiLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQkvKiBkYXRlIHZhbHVlcyAqLwotCWQgPSBQeURhdGVUaW1lX0RhdGVUeXBlLnRwX2RpY3Q7CisgICAgLyogZGF0ZSB2YWx1ZXMgKi8KKyAgICBkID0gUHlEYXRlVGltZV9EYXRlVHlwZS50cF9kaWN0OwogCi0JeCA9IG5ld19kYXRlKDEsIDEsIDEpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RhdGUoMSwgMSwgMSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWluIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JeCA9IG5ld19kYXRlKE1BWFlFQVIsIDEyLCAzMSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWF4IiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBuZXdfZGF0ZShNQVhZRUFSLCAxMiwgMzEpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKIAotCXggPSBuZXdfZGVsdGEoMSwgMCwgMCwgMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicmVzb2x1dGlvbiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RlbHRhKDEsIDAsIDAsIDApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQkvKiB0aW1lIHZhbHVlcyAqLwotCWQgPSBQeURhdGVUaW1lX1RpbWVUeXBlLnRwX2RpY3Q7CisgICAgLyogdGltZSB2YWx1ZXMgKi8KKyAgICBkID0gUHlEYXRlVGltZV9UaW1lVHlwZS50cF9kaWN0OwogCi0JeCA9IG5ld190aW1lKDAsIDAsIDAsIDAsIFB5X05vbmUpOwotCWlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1pbiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X3RpbWUoMCwgMCwgMCwgMCwgUHlfTm9uZSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWluIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JeCA9IG5ld190aW1lKDIzLCA1OSwgNTksIDk5OTk5OSwgUHlfTm9uZSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWF4IiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBuZXdfdGltZSgyMywgNTksIDU5LCA5OTk5OTksIFB5X05vbmUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKIAotCXggPSBuZXdfZGVsdGEoMCwgMCwgMSwgMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicmVzb2x1dGlvbiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RlbHRhKDAsIDAsIDEsIDApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQkvKiBkYXRldGltZSB2YWx1ZXMgKi8KLQlkID0gUHlEYXRlVGltZV9EYXRlVGltZVR5cGUudHBfZGljdDsKKyAgICAvKiBkYXRldGltZSB2YWx1ZXMgKi8KKyAgICBkID0gUHlEYXRlVGltZV9EYXRlVGltZVR5cGUudHBfZGljdDsKIAotCXggPSBuZXdfZGF0ZXRpbWUoMSwgMSwgMSwgMCwgMCwgMCwgMCwgUHlfTm9uZSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWluIiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBuZXdfZGF0ZXRpbWUoMSwgMSwgMSwgMCwgMCwgMCwgMCwgUHlfTm9uZSk7CisgICAgaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWluIiwgeCkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfREVDUkVGKHgpOwogCi0JeCA9IG5ld19kYXRldGltZShNQVhZRUFSLCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSwgUHlfTm9uZSk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibWF4IiwgeCkgPCAwKQotCQlyZXR1cm47Ci0JUHlfREVDUkVGKHgpOworICAgIHggPSBuZXdfZGF0ZXRpbWUoTUFYWUVBUiwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTk5OTksIFB5X05vbmUpOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIm1heCIsIHgpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0RFQ1JFRih4KTsKIAotCXggPSBuZXdfZGVsdGEoMCwgMCwgMSwgMCk7Ci0JaWYgKHggPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicmVzb2x1dGlvbiIsIHgpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0RFQ1JFRih4KTsKKyAgICB4ID0gbmV3X2RlbHRhKDAsIDAsIDEsIDApOworICAgIGlmICh4ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInJlc29sdXRpb24iLCB4KSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9ERUNSRUYoeCk7CiAKLQkvKiBtb2R1bGUgaW5pdGlhbGl6YXRpb24gKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTUlOWUVBUiIsIE1JTllFQVIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNQVhZRUFSIiwgTUFYWUVBUik7CisgICAgLyogbW9kdWxlIGluaXRpYWxpemF0aW9uICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1JTllFQVIiLCBNSU5ZRUFSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTUFYWUVBUiIsIE1BWFlFQVIpOwogCi0JUHlfSU5DUkVGKCZQeURhdGVUaW1lX0RhdGVUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImRhdGUiLCAoUHlPYmplY3QgKikgJlB5RGF0ZVRpbWVfRGF0ZVR5cGUpOworICAgIFB5X0lOQ1JFRigmUHlEYXRlVGltZV9EYXRlVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkYXRlIiwgKFB5T2JqZWN0ICopICZQeURhdGVUaW1lX0RhdGVUeXBlKTsKIAotCVB5X0lOQ1JFRigmUHlEYXRlVGltZV9EYXRlVGltZVR5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZGF0ZXRpbWUiLAotCQkJICAgKFB5T2JqZWN0ICopJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKTsKKyAgICBQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImRhdGV0aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKTsKIAotCVB5X0lOQ1JFRigmUHlEYXRlVGltZV9UaW1lVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0aW1lIiwgKFB5T2JqZWN0ICopICZQeURhdGVUaW1lX1RpbWVUeXBlKTsKKyAgICBQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfVGltZVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAidGltZSIsIChQeU9iamVjdCAqKSAmUHlEYXRlVGltZV9UaW1lVHlwZSk7CiAKLQlQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInRpbWVkZWx0YSIsIChQeU9iamVjdCAqKSAmUHlEYXRlVGltZV9EZWx0YVR5cGUpOworICAgIFB5X0lOQ1JFRigmUHlEYXRlVGltZV9EZWx0YVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAidGltZWRlbHRhIiwgKFB5T2JqZWN0ICopICZQeURhdGVUaW1lX0RlbHRhVHlwZSk7CiAKLQlQeV9JTkNSRUYoJlB5RGF0ZVRpbWVfVFpJbmZvVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0emluZm8iLCAoUHlPYmplY3QgKikgJlB5RGF0ZVRpbWVfVFpJbmZvVHlwZSk7CisgICAgUHlfSU5DUkVGKCZQeURhdGVUaW1lX1RaSW5mb1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAidHppbmZvIiwgKFB5T2JqZWN0ICopICZQeURhdGVUaW1lX1RaSW5mb1R5cGUpOwogCi0gICAgICAgIHggPSBQeUNPYmplY3RfRnJvbVZvaWRQdHJBbmREZXNjKCZDQVBJLCAodm9pZCopIERBVEVUSU1FX0FQSV9NQUdJQywKLSAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgaWYgKHggPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkYXRldGltZV9DQVBJIiwgeCk7CisgICAgeCA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0ckFuZERlc2MoJkNBUEksICh2b2lkKikgREFURVRJTUVfQVBJX01BR0lDLAorICAgICAgICBOVUxMKTsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkYXRldGltZV9DQVBJIiwgeCk7CiAKLQkvKiBBIDQteWVhciBjeWNsZSBoYXMgYW4gZXh0cmEgbGVhcCBkYXkgb3ZlciB3aGF0IHdlJ2QgZ2V0IGZyb20KLQkgKiBwYXN0aW5nIHRvZ2V0aGVyIDQgc2luZ2xlIHllYXJzLgotCSAqLwotCWFzc2VydChESTRZID09IDQgKiAzNjUgKyAxKTsKLQlhc3NlcnQoREk0WSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQrMSkpOworICAgIC8qIEEgNC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZCBnZXQgZnJvbQorICAgICAqIHBhc3RpbmcgdG9nZXRoZXIgNCBzaW5nbGUgeWVhcnMuCisgICAgICovCisgICAgYXNzZXJ0KERJNFkgPT0gNCAqIDM2NSArIDEpOworICAgIGFzc2VydChESTRZID09IGRheXNfYmVmb3JlX3llYXIoNCsxKSk7CiAKLQkvKiBTaW1pbGFybHksIGEgNDAwLXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkCi0JICogZ2V0IGZyb20gcGFzdGluZyB0b2dldGhlciA0IDEwMC15ZWFyIGN5Y2xlcy4KLQkgKi8KLQlhc3NlcnQoREk0MDBZID09IDQgKiBESTEwMFkgKyAxKTsKLQlhc3NlcnQoREk0MDBZID09IGRheXNfYmVmb3JlX3llYXIoNDAwKzEpKTsKKyAgICAvKiBTaW1pbGFybHksIGEgNDAwLXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkCisgICAgICogZ2V0IGZyb20gcGFzdGluZyB0b2dldGhlciA0IDEwMC15ZWFyIGN5Y2xlcy4KKyAgICAgKi8KKyAgICBhc3NlcnQoREk0MDBZID09IDQgKiBESTEwMFkgKyAxKTsKKyAgICBhc3NlcnQoREk0MDBZID09IGRheXNfYmVmb3JlX3llYXIoNDAwKzEpKTsKIAotCS8qIE9UT0gsIGEgMTAwLXllYXIgY3ljbGUgaGFzIG9uZSBmZXdlciBsZWFwIGRheSB0aGFuIHdlJ2QgZ2V0IGZyb20KLQkgKiBwYXN0aW5nIHRvZ2V0aGVyIDI1IDQteWVhciBjeWNsZXMuCi0JICovCi0JYXNzZXJ0KERJMTAwWSA9PSAyNSAqIERJNFkgLSAxKTsKLQlhc3NlcnQoREkxMDBZID09IGRheXNfYmVmb3JlX3llYXIoMTAwKzEpKTsKKyAgICAvKiBPVE9ILCBhIDEwMC15ZWFyIGN5Y2xlIGhhcyBvbmUgZmV3ZXIgbGVhcCBkYXkgdGhhbiB3ZSdkIGdldCBmcm9tCisgICAgICogcGFzdGluZyB0b2dldGhlciAyNSA0LXllYXIgY3ljbGVzLgorICAgICAqLworICAgIGFzc2VydChESTEwMFkgPT0gMjUgKiBESTRZIC0gMSk7CisgICAgYXNzZXJ0KERJMTAwWSA9PSBkYXlzX2JlZm9yZV95ZWFyKDEwMCsxKSk7CiAKLQl1c19wZXJfdXMgPSBQeUludF9Gcm9tTG9uZygxKTsKLQl1c19wZXJfbXMgPSBQeUludF9Gcm9tTG9uZygxMDAwKTsKLQl1c19wZXJfc2Vjb25kID0gUHlJbnRfRnJvbUxvbmcoMTAwMDAwMCk7Ci0JdXNfcGVyX21pbnV0ZSA9IFB5SW50X0Zyb21Mb25nKDYwMDAwMDAwKTsKLQlzZWNvbmRzX3Blcl9kYXkgPSBQeUludF9Gcm9tTG9uZygyNCAqIDM2MDApOwotCWlmICh1c19wZXJfdXMgPT0gTlVMTCB8fCB1c19wZXJfbXMgPT0gTlVMTCB8fCB1c19wZXJfc2Vjb25kID09IE5VTEwgfHwKLQkgICAgdXNfcGVyX21pbnV0ZSA9PSBOVUxMIHx8IHNlY29uZHNfcGVyX2RheSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgdXNfcGVyX3VzID0gUHlJbnRfRnJvbUxvbmcoMSk7CisgICAgdXNfcGVyX21zID0gUHlJbnRfRnJvbUxvbmcoMTAwMCk7CisgICAgdXNfcGVyX3NlY29uZCA9IFB5SW50X0Zyb21Mb25nKDEwMDAwMDApOworICAgIHVzX3Blcl9taW51dGUgPSBQeUludF9Gcm9tTG9uZyg2MDAwMDAwMCk7CisgICAgc2Vjb25kc19wZXJfZGF5ID0gUHlJbnRfRnJvbUxvbmcoMjQgKiAzNjAwKTsKKyAgICBpZiAodXNfcGVyX3VzID09IE5VTEwgfHwgdXNfcGVyX21zID09IE5VTEwgfHwgdXNfcGVyX3NlY29uZCA9PSBOVUxMIHx8CisgICAgICAgIHVzX3Blcl9taW51dGUgPT0gTlVMTCB8fCBzZWNvbmRzX3Blcl9kYXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogVGhlIHJlc3QgYXJlIHRvbyBiaWcgZm9yIDMyLWJpdCBpbnRzLCBidXQgZXZlbgotCSAqIHVzX3Blcl93ZWVrIGZpdHMgaW4gNDAgYml0cywgc28gZG91YmxlcyBzaG91bGQgYmUgZXhhY3QuCi0JICovCi0JdXNfcGVyX2hvdXIgPSBQeUxvbmdfRnJvbURvdWJsZSgzNjAwMDAwMDAwLjApOwotCXVzX3Blcl9kYXkgPSBQeUxvbmdfRnJvbURvdWJsZSg4NjQwMDAwMDAwMC4wKTsKLQl1c19wZXJfd2VlayA9IFB5TG9uZ19Gcm9tRG91YmxlKDYwNDgwMDAwMDAwMC4wKTsKLQlpZiAodXNfcGVyX2hvdXIgPT0gTlVMTCB8fCB1c19wZXJfZGF5ID09IE5VTEwgfHwgdXNfcGVyX3dlZWsgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIC8qIFRoZSByZXN0IGFyZSB0b28gYmlnIGZvciAzMi1iaXQgaW50cywgYnV0IGV2ZW4KKyAgICAgKiB1c19wZXJfd2VlayBmaXRzIGluIDQwIGJpdHMsIHNvIGRvdWJsZXMgc2hvdWxkIGJlIGV4YWN0LgorICAgICAqLworICAgIHVzX3Blcl9ob3VyID0gUHlMb25nX0Zyb21Eb3VibGUoMzYwMDAwMDAwMC4wKTsKKyAgICB1c19wZXJfZGF5ID0gUHlMb25nX0Zyb21Eb3VibGUoODY0MDAwMDAwMDAuMCk7CisgICAgdXNfcGVyX3dlZWsgPSBQeUxvbmdfRnJvbURvdWJsZSg2MDQ4MDAwMDAwMDAuMCk7CisgICAgaWYgKHVzX3Blcl9ob3VyID09IE5VTEwgfHwgdXNfcGVyX2RheSA9PSBOVUxMIHx8IHVzX3Blcl93ZWVrID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb21lIHRpbWUgem9uZSBhbGdlYnJhLiAgRm9yIGEgZGF0ZXRpbWUgeCwgbGV0CiAgICAgeC5uID0geCBzdHJpcHBlZCBvZiBpdHMgdGltZXpvbmUgLS0gaXRzIG5haXZlIHRpbWUuCiAgICAgeC5vID0geC51dGNvZmZzZXQoKSwgYW5kIGFzc3VtaW5nIHRoYXQgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24gb3IKLSAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgcmV0dXJuIE5vbmUKICAgICB4LmQgPSB4LmRzdCgpLCBhbmQgYXNzdW1pbmcgdGhhdCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBvcgotICAgICAgICAgIHJldHVybiBOb25lCisgICAgICByZXR1cm4gTm9uZQogICAgIHgucyA9IHgncyBzdGFuZGFyZCBvZmZzZXQsIHgubyAtIHguZAogCiBOb3cgc29tZSBkZXJpdmVkIHJ1bGVzLCB3aGVyZSBrIGlzIGEgZHVyYXRpb24gKHRpbWVkZWx0YSkuCkBAIC01MDE2LDEzICs1MDE2LDEzIEBACiBhbHJlYWR5KToKIAogICAgIGRpZmYnID0geC5uIC0gKHonLm4gLSB6Jy5vKSA9ICAgICAgICAgICByZXBsYWNpbmcgeicubiB2aWEgWzddCi0gICAgICAgICAgICB4Lm4gIC0gKHoubiArIGRpZmYgLSB6Jy5vKSA9ICAgIHJlcGxhY2luZyBkaWZmIHZpYSBbNl0KLSAgICAgICAgICAgIHgubiAtICh6Lm4gKyB4Lm4gLSAoei5uIC0gei5vKSAtIHonLm8pID0KLSAgICAgICAgICAgIHgubiAtIHoubiAtIHgubiArIHoubiAtIHoubyArIHonLm8gPSAgICBjYW5jZWwgeC5uCi0gICAgICAgICAgICAtIHoubiArIHoubiAtIHoubyArIHonLm8gPSAgICAgICAgICAgICAgY2FuY2VsIHoubgotICAgICAgICAgICAgLSB6Lm8gKyB6Jy5vID0gICAgICAgICAgICAgICAgICAgICAgIzEgdHdpY2UKLSAgICAgICAgICAgIC16LnMgLSB6LmQgKyB6Jy5zICsgeicuZCA9ICAgICAgICAgIHogYW5kIHonIGhhdmUgc2FtZSB0emluZm8KLSAgICAgICAgICAgIHonLmQgLSB6LmQKKyAgICAgICAgeC5uICAtICh6Lm4gKyBkaWZmIC0geicubykgPSAgICByZXBsYWNpbmcgZGlmZiB2aWEgWzZdCisgICAgICAgIHgubiAtICh6Lm4gKyB4Lm4gLSAoei5uIC0gei5vKSAtIHonLm8pID0KKyAgICAgICAgeC5uIC0gei5uIC0geC5uICsgei5uIC0gei5vICsgeicubyA9ICAgIGNhbmNlbCB4Lm4KKyAgICAgICAgLSB6Lm4gKyB6Lm4gLSB6Lm8gKyB6Jy5vID0gICAgICAgICAgICAgIGNhbmNlbCB6Lm4KKyAgICAgICAgLSB6Lm8gKyB6Jy5vID0gICAgICAgICAgICAgICAgICAgICAgIzEgdHdpY2UKKyAgICAgICAgLXoucyAtIHouZCArIHonLnMgKyB6Jy5kID0gICAgICAgICAgeiBhbmQgeicgaGF2ZSBzYW1lIHR6aW5mbworICAgICAgICB6Jy5kIC0gei5kCiAKIFNvIHonIGlzIFVUQy1lcXVpdmFsZW50IHRvIHggaWZmIHonLmQgPSB6LmQgYXQgdGhpcyBwb2ludC4gIElmIHRoZXkgYXJlIGVxdWFsLAogd2UndmUgZm91bmQgdGhlIFVUQy1lcXVpdmFsZW50IHNvIGFyZSBkb25lLiAgSW4gZmFjdCwgd2Ugc3RvcCB3aXRoIFs3XSBhbmQKZGlmZiAtLWdpdCBhL01vZHVsZXMvZGJtbW9kdWxlLmMgYi9Nb2R1bGVzL2RibW1vZHVsZS5jCmluZGV4IDBjNTBiNTQuLmY5Yzk5YTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZGJtbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9kYm1tb2R1bGUuYwpAQCAtMzIsOSArMzIsOSBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JaW50IGRpX3NpemU7CS8qIC0xIG1lYW5zIHJlY29tcHV0ZSAqLwotCURCTSAqZGlfZGJtOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBpbnQgZGlfc2l6ZTsgICAgICAgIC8qIC0xIG1lYW5zIHJlY29tcHV0ZSAqLworICAgIERCTSAqZGlfZGJtOwogfSBkYm1vYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRGJtdHlwZTsKQEAgLTQ5LDE4ICs0OSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2RibW9iamVjdChjaGFyICpmaWxlLCBpbnQgZmxhZ3MsIGludCBtb2RlKQogewotICAgICAgICBkYm1vYmplY3QgKmRwOworICAgIGRibW9iamVjdCAqZHA7CiAKLQlkcCA9IFB5T2JqZWN0X05ldyhkYm1vYmplY3QsICZEYm10eXBlKTsKLQlpZiAoZHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZHAtPmRpX3NpemUgPSAtMTsKLQlpZiAoIChkcC0+ZGlfZGJtID0gZGJtX29wZW4oZmlsZSwgZmxhZ3MsIG1vZGUpKSA9PSAwICkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oRGJtRXJyb3IpOwotCQlQeV9ERUNSRUYoZHApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKWRwOworICAgIGRwID0gUHlPYmplY3RfTmV3KGRibW9iamVjdCwgJkRibXR5cGUpOworICAgIGlmIChkcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkcC0+ZGlfc2l6ZSA9IC0xOworICAgIGlmICggKGRwLT5kaV9kYm0gPSBkYm1fb3BlbihmaWxlLCBmbGFncywgbW9kZSkpID09IDAgKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhEYm1FcnJvcik7CisgICAgICAgIFB5X0RFQ1JFRihkcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZHA7CiB9CiAKIC8qIE1ldGhvZHMgKi8KQEAgLTY4LDExOSArNjgsMTE5IEBACiBzdGF0aWMgdm9pZAogZGJtX2RlYWxsb2MocmVnaXN0ZXIgZGJtb2JqZWN0ICpkcCkKIHsKLSAgICAgICAgaWYgKCBkcC0+ZGlfZGJtICkKLQkJZGJtX2Nsb3NlKGRwLT5kaV9kYm0pOwotCVB5T2JqZWN0X0RlbChkcCk7CisgICAgaWYgKCBkcC0+ZGlfZGJtICkKKyAgICAgICAgZGJtX2Nsb3NlKGRwLT5kaV9kYm0pOworICAgIFB5T2JqZWN0X0RlbChkcCk7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBkYm1fbGVuZ3RoKGRibW9iamVjdCAqZHApCiB7Ci0gICAgICAgIGlmIChkcC0+ZGlfZGJtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiREJNIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIpOyAKLSAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOyAKLSAgICAgICAgfQotICAgICAgICBpZiAoIGRwLT5kaV9zaXplIDwgMCApIHsKLQkJZGF0dW0ga2V5OwotCQlpbnQgc2l6ZTsKKyAgICBpZiAoZHAtPmRpX2RibSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiREJNIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIpOworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCBkcC0+ZGlfc2l6ZSA8IDAgKSB7CisgICAgICAgIGRhdHVtIGtleTsKKyAgICAgICAgaW50IHNpemU7CiAKLQkJc2l6ZSA9IDA7Ci0JCWZvciAoIGtleT1kYm1fZmlyc3RrZXkoZHAtPmRpX2RibSk7IGtleS5kcHRyOwotCQkgICAgICBrZXkgPSBkYm1fbmV4dGtleShkcC0+ZGlfZGJtKSkKLQkJCXNpemUrKzsKLQkJZHAtPmRpX3NpemUgPSBzaXplOwotCX0KLQlyZXR1cm4gZHAtPmRpX3NpemU7CisgICAgICAgIHNpemUgPSAwOworICAgICAgICBmb3IgKCBrZXk9ZGJtX2ZpcnN0a2V5KGRwLT5kaV9kYm0pOyBrZXkuZHB0cjsKKyAgICAgICAgICAgICAga2V5ID0gZGJtX25leHRrZXkoZHAtPmRpX2RibSkpCisgICAgICAgICAgICBzaXplKys7CisgICAgICAgIGRwLT5kaV9zaXplID0gc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIGRwLT5kaV9zaXplOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGJtX3N1YnNjcmlwdChkYm1vYmplY3QgKmRwLCByZWdpc3RlciBQeU9iamVjdCAqa2V5KQogewotCWRhdHVtIGRyZWMsIGtyZWM7Ci0JaW50IHRtcF9zaXplOwotCQotCWlmICghUHlBcmdfUGFyc2Uoa2V5LCAicyMiLCAma3JlYy5kcHRyLCAmdG1wX3NpemUpICkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0Ja3JlYy5kc2l6ZSA9IHRtcF9zaXplOwotICAgICAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7Ci0JZHJlYyA9IGRibV9mZXRjaChkcC0+ZGlfZGJtLCBrcmVjKTsKLQlpZiAoIGRyZWMuZHB0ciA9PSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKWtleSkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCBkYm1fZXJyb3IoZHAtPmRpX2RibSkgKSB7Ci0JCWRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKLQkJUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZHJlYy5kcHRyLCBkcmVjLmRzaXplKTsKKyAgICBkYXR1bSBkcmVjLCBrcmVjOworICAgIGludCB0bXBfc2l6ZTsKKworICAgIGlmICghUHlBcmdfUGFyc2Uoa2V5LCAicyMiLCAma3JlYy5kcHRyLCAmdG1wX3NpemUpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBrcmVjLmRzaXplID0gdG1wX3NpemU7CisgICAgY2hlY2tfZGJtb2JqZWN0X29wZW4oZHApOworICAgIGRyZWMgPSBkYm1fZmV0Y2goZHAtPmRpX2RibSwga3JlYyk7CisgICAgaWYgKCBkcmVjLmRwdHIgPT0gMCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKWtleSkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCBkYm1fZXJyb3IoZHAtPmRpX2RibSkgKSB7CisgICAgICAgIGRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZHJlYy5kcHRyLCBkcmVjLmRzaXplKTsKIH0KIAogc3RhdGljIGludAogZGJtX2Fzc19zdWIoZGJtb2JqZWN0ICpkcCwgUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotICAgICAgICBkYXR1bSBrcmVjLCBkcmVjOwotCWludCB0bXBfc2l6ZTsKLQkKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodiwgInMjIiwgJmtyZWMuZHB0ciwgJnRtcF9zaXplKSApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZGJtIG1hcHBpbmdzIGhhdmUgc3RyaW5nIGluZGljZXMgb25seSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWtyZWMuZHNpemUgPSB0bXBfc2l6ZTsKLSAgICAgICAgaWYgKGRwLT5kaV9kYm0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGJtRXJyb3IsICJEQk0gb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIik7IAotICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgZGF0dW0ga3JlYywgZHJlYzsKKyAgICBpbnQgdG1wX3NpemU7CisKKyAgICBpZiAoICFQeUFyZ19QYXJzZSh2LCAicyMiLCAma3JlYy5kcHRyLCAmdG1wX3NpemUpICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRibSBtYXBwaW5ncyBoYXZlIHN0cmluZyBpbmRpY2VzIG9ubHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBrcmVjLmRzaXplID0gdG1wX3NpemU7CisgICAgaWYgKGRwLT5kaV9kYm0gPT0gTlVMTCkgeworICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhEYm1FcnJvciwgIkRCTSBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQiKTsKKyAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGRwLT5kaV9zaXplID0gLTE7CisgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICBpZiAoIGRibV9kZWxldGUoZHAtPmRpX2RibSwga3JlYykgPCAwICkgeworICAgICAgICAgICAgZGJtX2NsZWFyZXJyKGRwLT5kaV9kYm0pOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoKFB5U3RyaW5nT2JqZWN0ICopdikpOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0JZHAtPmRpX3NpemUgPSAtMTsKLQlpZiAodyA9PSBOVUxMKSB7Ci0JCWlmICggZGJtX2RlbGV0ZShkcC0+ZGlfZGJtLCBrcmVjKSA8IDAgKSB7Ci0JCQlkYm1fY2xlYXJlcnIoZHAtPmRpX2RibSk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCi0JCQkJICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXYpKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICggIVB5QXJnX1BhcnNlKHcsICJzIyIsICZkcmVjLmRwdHIsICZ0bXBfc2l6ZSkgKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgImRibSBtYXBwaW5ncyBoYXZlIHN0cmluZyBlbGVtZW50cyBvbmx5Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZHJlYy5kc2l6ZSA9IHRtcF9zaXplOwotCQlpZiAoIGRibV9zdG9yZShkcC0+ZGlfZGJtLCBrcmVjLCBkcmVjLCBEQk1fUkVQTEFDRSkgPCAwICkgewotCQkJZGJtX2NsZWFyZXJyKGRwLT5kaV9kYm0pOwotCQkJUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLAotCQkJCQkiY2Fubm90IGFkZCBpdGVtIHRvIGRhdGFiYXNlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JaWYgKCBkYm1fZXJyb3IoZHAtPmRpX2RibSkgKSB7Ci0JCWRibV9jbGVhcmVycihkcC0+ZGlfZGJtKTsKLQkJUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodywgInMjIiwgJmRyZWMuZHB0ciwgJnRtcF9zaXplKSApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImRibSBtYXBwaW5ncyBoYXZlIHN0cmluZyBlbGVtZW50cyBvbmx5Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZHJlYy5kc2l6ZSA9IHRtcF9zaXplOworICAgICAgICBpZiAoIGRibV9zdG9yZShkcC0+ZGlfZGJtLCBrcmVjLCBkcmVjLCBEQk1fUkVQTEFDRSkgPCAwICkgeworICAgICAgICAgICAgZGJtX2NsZWFyZXJyKGRwLT5kaV9kYm0pOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYWRkIGl0ZW0gdG8gZGF0YWJhc2UiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIGRibV9lcnJvcihkcC0+ZGlfZGJtKSApIHsKKyAgICAgICAgZGJtX2NsZWFyZXJyKGRwLT5kaV9kYm0pOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGJtRXJyb3IsICIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogZGJtX2NvbnRhaW5zKHJlZ2lzdGVyIGRibW9iamVjdCAqZHAsIFB5T2JqZWN0ICp2KQogewotCWRhdHVtIGtleSwgdmFsOworICAgIGRhdHVtIGtleSwgdmFsOwogCi0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSh2LCAoY2hhciAqKikma2V5LmRwdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlfc3NpemVfdCAqKSZrZXkuZHNpemUpKSB7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSh2LCAoY2hhciAqKikma2V5LmRwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlfc3NpemVfdCAqKSZrZXkuZHNpemUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBFeHBhbmQgY2hlY2tfZGJtb2JqZWN0X29wZW4gdG8gcmV0dXJuIC0xICovCi0JaWYgKGRwLT5kaV9kYm0gPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoRGJtRXJyb3IsICJEQk0gb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdmFsID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtleSk7Ci0JcmV0dXJuIHZhbC5kcHRyICE9IE5VTEw7CisgICAgLyogRXhwYW5kIGNoZWNrX2RibW9iamVjdF9vcGVuIHRvIHJldHVybiAtMSAqLworICAgIGlmIChkcC0+ZGlfZGJtID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLCAiREJNIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHZhbCA9IGRibV9mZXRjaChkcC0+ZGlfZGJtLCBrZXkpOworICAgIHJldHVybiB2YWwuZHB0ciAhPSBOVUxMOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgZGJtX2FzX3NlcXVlbmNlID0gewpAQCAtMTk3LDE1OSArMTk3LDE1OSBAQAogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgZGJtX2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpZGJtX2xlbmd0aCwJCS8qbXBfbGVuZ3RoKi8KLQkoYmluYXJ5ZnVuYylkYm1fc3Vic2NyaXB0LAkvKm1wX3N1YnNjcmlwdCovCi0JKG9iam9iamFyZ3Byb2MpZGJtX2Fzc19zdWIsCS8qbXBfYXNzX3N1YnNjcmlwdCovCisgICAgKGxlbmZ1bmMpZGJtX2xlbmd0aCwgICAgICAgICAgICAgICAgLyptcF9sZW5ndGgqLworICAgIChiaW5hcnlmdW5jKWRibV9zdWJzY3JpcHQsICAgICAgICAgIC8qbXBfc3Vic2NyaXB0Ki8KKyAgICAob2Jqb2JqYXJncHJvYylkYm1fYXNzX3N1YiwgICAgICAgICAvKm1wX2Fzc19zdWJzY3JpcHQqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRibV9fY2xvc2UocmVnaXN0ZXIgZGJtb2JqZWN0ICpkcCwgUHlPYmplY3QgKnVudXNlZCkKIHsKLSAgICAgICAgaWYgKGRwLT5kaV9kYm0pCi0JCWRibV9jbG9zZShkcC0+ZGlfZGJtKTsKLQlkcC0+ZGlfZGJtID0gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGRwLT5kaV9kYm0pCisgICAgICAgIGRibV9jbG9zZShkcC0+ZGlfZGJtKTsKKyAgICBkcC0+ZGlfZGJtID0gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYm1fa2V5cyhyZWdpc3RlciBkYm1vYmplY3QgKmRwLCBQeU9iamVjdCAqdW51c2VkKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2LCAqaXRlbTsKLQlkYXR1bSBrZXk7Ci0JaW50IGVycjsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqdiwgKml0ZW07CisgICAgZGF0dW0ga2V5OworICAgIGludCBlcnI7CiAKLSAgICAgICAgY2hlY2tfZGJtb2JqZWN0X29wZW4oZHApOwotCXYgPSBQeUxpc3RfTmV3KDApOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoa2V5ID0gZGJtX2ZpcnN0a2V5KGRwLT5kaV9kYm0pOyBrZXkuZHB0cjsKLQkgICAgIGtleSA9IGRibV9uZXh0a2V5KGRwLT5kaV9kYm0pKSB7Ci0JCWl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShrZXkuZHB0ciwga2V5LmRzaXplKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZXJyID0gUHlMaXN0X0FwcGVuZCh2LCBpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAoZXJyICE9IDApIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiB2OworICAgIGNoZWNrX2RibW9iamVjdF9vcGVuKGRwKTsKKyAgICB2ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGtleSA9IGRibV9maXJzdGtleShkcC0+ZGlfZGJtKTsga2V5LmRwdHI7CisgICAgICAgICBrZXkgPSBkYm1fbmV4dGtleShkcC0+ZGlfZGJtKSkgeworICAgICAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoa2V5LmRwdHIsIGtleS5kc2l6ZSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQodiwgaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRibV9oYXNfa2V5KHJlZ2lzdGVyIGRibW9iamVjdCAqZHAsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnRtcF9wdHI7Ci0JZGF0dW0ga2V5LCB2YWw7Ci0JaW50IHRtcF9zaXplOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6aGFzX2tleSIsICZ0bXBfcHRyLCAmdG1wX3NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlrZXkuZHB0ciA9IHRtcF9wdHI7Ci0Ja2V5LmRzaXplID0gdG1wX3NpemU7Ci0gICAgICAgIGNoZWNrX2RibW9iamVjdF9vcGVuKGRwKTsKLQl2YWwgPSBkYm1fZmV0Y2goZHAtPmRpX2RibSwga2V5KTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsLmRwdHIgIT0gTlVMTCk7CisgICAgY2hhciAqdG1wX3B0cjsKKyAgICBkYXR1bSBrZXksIHZhbDsKKyAgICBpbnQgdG1wX3NpemU7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmhhc19rZXkiLCAmdG1wX3B0ciwgJnRtcF9zaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAga2V5LmRwdHIgPSB0bXBfcHRyOworICAgIGtleS5kc2l6ZSA9IHRtcF9zaXplOworICAgIGNoZWNrX2RibW9iamVjdF9vcGVuKGRwKTsKKyAgICB2YWwgPSBkYm1fZmV0Y2goZHAtPmRpX2RibSwga2V5KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsLmRwdHIgIT0gTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYm1fZ2V0KHJlZ2lzdGVyIGRibW9iamVjdCAqZHAsIFB5T2JqZWN0ICphcmdzKQogewotCWRhdHVtIGtleSwgdmFsOwotCVB5T2JqZWN0ICpkZWZ2YWx1ZSA9IFB5X05vbmU7Ci0JY2hhciAqdG1wX3B0cjsKLQlpbnQgdG1wX3NpemU7CisgICAgZGF0dW0ga2V5LCB2YWw7CisgICAgUHlPYmplY3QgKmRlZnZhbHVlID0gUHlfTm9uZTsKKyAgICBjaGFyICp0bXBfcHRyOworICAgIGludCB0bXBfc2l6ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8TzpnZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcF9wdHIsICZ0bXBfc2l6ZSwgJmRlZnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0Ja2V5LmRwdHIgPSB0bXBfcHRyOwotCWtleS5kc2l6ZSA9IHRtcF9zaXplOwotICAgICAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7Ci0JdmFsID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtleSk7Ci0JaWYgKHZhbC5kcHRyICE9IE5VTEwpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWwuZHB0ciwgdmFsLmRzaXplKTsKLQllbHNlIHsKLQkJUHlfSU5DUkVGKGRlZnZhbHVlKTsKLQkJcmV0dXJuIGRlZnZhbHVlOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfE86Z2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcF9wdHIsICZ0bXBfc2l6ZSwgJmRlZnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAga2V5LmRwdHIgPSB0bXBfcHRyOworICAgIGtleS5kc2l6ZSA9IHRtcF9zaXplOworICAgIGNoZWNrX2RibW9iamVjdF9vcGVuKGRwKTsKKyAgICB2YWwgPSBkYm1fZmV0Y2goZHAtPmRpX2RibSwga2V5KTsKKyAgICBpZiAodmFsLmRwdHIgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHZhbC5kcHRyLCB2YWwuZHNpemUpOworICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoZGVmdmFsdWUpOworICAgICAgICByZXR1cm4gZGVmdmFsdWU7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGJtX3NldGRlZmF1bHQocmVnaXN0ZXIgZGJtb2JqZWN0ICpkcCwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZGF0dW0ga2V5LCB2YWw7Ci0JUHlPYmplY3QgKmRlZnZhbHVlID0gTlVMTDsKLQljaGFyICp0bXBfcHRyOwotCWludCB0bXBfc2l6ZTsKKyAgICBkYXR1bSBrZXksIHZhbDsKKyAgICBQeU9iamVjdCAqZGVmdmFsdWUgPSBOVUxMOworICAgIGNoYXIgKnRtcF9wdHI7CisgICAgaW50IHRtcF9zaXplOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xTOnNldGRlZmF1bHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcF9wdHIsICZ0bXBfc2l6ZSwgJmRlZnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0Ja2V5LmRwdHIgPSB0bXBfcHRyOwotCWtleS5kc2l6ZSA9IHRtcF9zaXplOwotICAgICAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7Ci0JdmFsID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtleSk7Ci0JaWYgKHZhbC5kcHRyICE9IE5VTEwpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWwuZHB0ciwgdmFsLmRzaXplKTsKLQlpZiAoZGVmdmFsdWUgPT0gTlVMTCkgewotCQlkZWZ2YWx1ZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOwotCQlpZiAoZGVmdmFsdWUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRihkZWZ2YWx1ZSk7Ci0JdmFsLmRwdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoZGVmdmFsdWUpOwotCXZhbC5kc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGRlZnZhbHVlKTsKLQlpZiAoZGJtX3N0b3JlKGRwLT5kaV9kYm0sIGtleSwgdmFsLCBEQk1fSU5TRVJUKSA8IDApIHsKLQkJZGJtX2NsZWFyZXJyKGRwLT5kaV9kYm0pOwotCQlQeUVycl9TZXRTdHJpbmcoRGJtRXJyb3IsICJjYW5ub3QgYWRkIGl0ZW0gdG8gZGF0YWJhc2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBkZWZ2YWx1ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfFM6c2V0ZGVmYXVsdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfcHRyLCAmdG1wX3NpemUsICZkZWZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGtleS5kcHRyID0gdG1wX3B0cjsKKyAgICBrZXkuZHNpemUgPSB0bXBfc2l6ZTsKKyAgICBjaGVja19kYm1vYmplY3Rfb3BlbihkcCk7CisgICAgdmFsID0gZGJtX2ZldGNoKGRwLT5kaV9kYm0sIGtleSk7CisgICAgaWYgKHZhbC5kcHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWwuZHB0ciwgdmFsLmRzaXplKTsKKyAgICBpZiAoZGVmdmFsdWUgPT0gTlVMTCkgeworICAgICAgICBkZWZ2YWx1ZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOworICAgICAgICBpZiAoZGVmdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRihkZWZ2YWx1ZSk7CisgICAgdmFsLmRwdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoZGVmdmFsdWUpOworICAgIHZhbC5kc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKGRlZnZhbHVlKTsKKyAgICBpZiAoZGJtX3N0b3JlKGRwLT5kaV9kYm0sIGtleSwgdmFsLCBEQk1fSU5TRVJUKSA8IDApIHsKKyAgICAgICAgZGJtX2NsZWFyZXJyKGRwLT5kaV9kYm0pOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGJtRXJyb3IsICJjYW5ub3QgYWRkIGl0ZW0gdG8gZGF0YWJhc2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkZWZ2YWx1ZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGRibV9tZXRob2RzW10gPSB7Ci0JeyJjbG9zZSIsCShQeUNGdW5jdGlvbilkYm1fX2Nsb3NlLAlNRVRIX05PQVJHUywKLQkgImNsb3NlKClcbkNsb3NlIHRoZSBkYXRhYmFzZS4ifSwKLQl7ImtleXMiLAkoUHlDRnVuY3Rpb24pZGJtX2tleXMsCQlNRVRIX05PQVJHUywKLQkgImtleXMoKSAtPiBsaXN0XG5SZXR1cm4gYSBsaXN0IG9mIGFsbCBrZXlzIGluIHRoZSBkYXRhYmFzZS4ifSwKLQl7Imhhc19rZXkiLAkoUHlDRnVuY3Rpb24pZGJtX2hhc19rZXksCU1FVEhfVkFSQVJHUywKLQkgImhhc19rZXkoa2V5fSAtPiBib29sZWFuXG5SZXR1cm4gdHJ1ZSBpZmYga2V5IGlzIGluIHRoZSBkYXRhYmFzZS4ifSwKLQl7ImdldCIsCQkoUHlDRnVuY3Rpb24pZGJtX2dldCwJCU1FVEhfVkFSQVJHUywKLQkgImdldChrZXlbLCBkZWZhdWx0XSkgLT4gdmFsdWVcbiIKLQkgIlJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZGVmYXVsdC4ifSwKLQl7InNldGRlZmF1bHQiLAkoUHlDRnVuY3Rpb24pZGJtX3NldGRlZmF1bHQsCU1FVEhfVkFSQVJHUywKLQkgInNldGRlZmF1bHQoa2V5WywgZGVmYXVsdF0pIC0+IHZhbHVlXG4iCi0JICJSZXR1cm4gdGhlIHZhbHVlIGZvciBrZXkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRlZmF1bHQuICBJZiBrZXlcbiIKLQkgImlzIG5vdCBpbiB0aGUgZGF0YWJhc2UsIGl0IGlzIGluc2VydGVkIHdpdGggZGVmYXVsdCBhcyB0aGUgdmFsdWUuIn0sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImNsb3NlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilkYm1fX2Nsb3NlLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgICJjbG9zZSgpXG5DbG9zZSB0aGUgZGF0YWJhc2UuIn0sCisgICAgeyJrZXlzIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGJtX2tleXMsICAgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICAia2V5cygpIC0+IGxpc3RcblJldHVybiBhIGxpc3Qgb2YgYWxsIGtleXMgaW4gdGhlIGRhdGFiYXNlLiJ9LAorICAgIHsiaGFzX2tleSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRibV9oYXNfa2V5LCAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICJoYXNfa2V5KGtleX0gLT4gYm9vbGVhblxuUmV0dXJuIHRydWUgaWZmIGtleSBpcyBpbiB0aGUgZGF0YWJhc2UuIn0sCisgICAgeyJnZXQiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGJtX2dldCwgICAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgImdldChrZXlbLCBkZWZhdWx0XSkgLT4gdmFsdWVcbiIKKyAgICAgIlJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZGVmYXVsdC4ifSwKKyAgICB7InNldGRlZmF1bHQiLCAgICAgIChQeUNGdW5jdGlvbilkYm1fc2V0ZGVmYXVsdCwgICAgTUVUSF9WQVJBUkdTLAorICAgICAic2V0ZGVmYXVsdChrZXlbLCBkZWZhdWx0XSkgLT4gdmFsdWVcbiIKKyAgICAgIlJldHVybiB0aGUgdmFsdWUgZm9yIGtleSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZGVmYXVsdC4gIElmIGtleVxuIgorICAgICAiaXMgbm90IGluIHRoZSBkYXRhYmFzZSwgaXQgaXMgaW5zZXJ0ZWQgd2l0aCBkZWZhdWx0IGFzIHRoZSB2YWx1ZS4ifSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRibV9nZXRhdHRyKGRibW9iamVjdCAqZHAsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoZGJtX21ldGhvZHMsIChQeU9iamVjdCAqKWRwLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChkYm1fbWV0aG9kcywgKFB5T2JqZWN0ICopZHAsIG5hbWUpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IERibXR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImRibS5kYm0iLAotCXNpemVvZihkYm1vYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZGJtX2RlYWxsb2MsICAvKnRwX2RlYWxsb2MqLwotCTAsCQkJICAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpZGJtX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkgIC8qdHBfc2V0YXR0ciovCi0JMCwJCQkgIC8qdHBfY29tcGFyZSovCi0JMCwJCQkgIC8qdHBfcmVwciovCi0JMCwJCQkgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiZGJtLmRibSIsCisgICAgc2l6ZW9mKGRibW9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilkYm1fZGVhbGxvYywgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWRibV9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KICAgICAmZGJtX2FzX3NlcXVlbmNlLCAgICAgLyp0cF9hc19zZXF1ZW5jZSovCi0JJmRibV9hc19tYXBwaW5nLAkgIC8qdHBfYXNfbWFwcGluZyovCisgICAgJmRibV9hc19tYXBwaW5nLCAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwpAQCAtMzY0LDU0ICszNjQsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkYm1vcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWNoYXIgKmZsYWdzID0gInIiOwotCWludCBpZmxhZ3M7Ci0JaW50IG1vZGUgPSAwNjY2OworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciAqZmxhZ3MgPSAiciI7CisgICAgaW50IGlmbGFnczsKKyAgICBpbnQgbW9kZSA9IDA2NjY7CiAKLSAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzaTpvcGVuIiwgJm5hbWUsICZmbGFncywgJm1vZGUpICkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCBzdHJjbXAoZmxhZ3MsICJyIikgPT0gMCApCi0JCWlmbGFncyA9IE9fUkRPTkxZOwotCWVsc2UgaWYgKCBzdHJjbXAoZmxhZ3MsICJ3IikgPT0gMCApCi0JCWlmbGFncyA9IE9fUkRXUjsKLQllbHNlIGlmICggc3RyY21wKGZsYWdzLCAicnciKSA9PSAwICkgLyogQi9XIGNvbXBhdCAqLwotCQlpZmxhZ3MgPSBPX1JEV1J8T19DUkVBVDsgCi0JZWxzZSBpZiAoIHN0cmNtcChmbGFncywgImMiKSA9PSAwICkKLQkJaWZsYWdzID0gT19SRFdSfE9fQ1JFQVQ7Ci0JZWxzZSBpZiAoIHN0cmNtcChmbGFncywgIm4iKSA9PSAwICkKLQkJaWZsYWdzID0gT19SRFdSfE9fQ1JFQVR8T19UUlVOQzsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKERibUVycm9yLAotCQkJCSJhcmcgMiB0byBvcGVuIHNob3VsZCBiZSAncicsICd3JywgJ2MnLCBvciAnbiciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgICByZXR1cm4gbmV3ZGJtb2JqZWN0KG5hbWUsIGlmbGFncywgbW9kZSk7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzaTpvcGVuIiwgJm5hbWUsICZmbGFncywgJm1vZGUpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCBzdHJjbXAoZmxhZ3MsICJyIikgPT0gMCApCisgICAgICAgIGlmbGFncyA9IE9fUkRPTkxZOworICAgIGVsc2UgaWYgKCBzdHJjbXAoZmxhZ3MsICJ3IikgPT0gMCApCisgICAgICAgIGlmbGFncyA9IE9fUkRXUjsKKyAgICBlbHNlIGlmICggc3RyY21wKGZsYWdzLCAicnciKSA9PSAwICkgLyogQi9XIGNvbXBhdCAqLworICAgICAgICBpZmxhZ3MgPSBPX1JEV1J8T19DUkVBVDsKKyAgICBlbHNlIGlmICggc3RyY21wKGZsYWdzLCAiYyIpID09IDAgKQorICAgICAgICBpZmxhZ3MgPSBPX1JEV1J8T19DUkVBVDsKKyAgICBlbHNlIGlmICggc3RyY21wKGZsYWdzLCAibiIpID09IDAgKQorICAgICAgICBpZmxhZ3MgPSBPX1JEV1J8T19DUkVBVHxPX1RSVU5DOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGJtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJnIDIgdG8gb3BlbiBzaG91bGQgYmUgJ3InLCAndycsICdjJywgb3IgJ24nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3ZGJtb2JqZWN0KG5hbWUsIGlmbGFncywgbW9kZSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkYm1tb2R1bGVfbWV0aG9kc1tdID0gewotCXsgIm9wZW4iLCAoUHlDRnVuY3Rpb24pZGJtb3BlbiwgTUVUSF9WQVJBUkdTLAotCSAgIm9wZW4ocGF0aFssIGZsYWdbLCBtb2RlXV0pIC0+IG1hcHBpbmdcbiIKLQkgICJSZXR1cm4gYSBkYXRhYmFzZSBvYmplY3QuIn0sCi0JeyAwLCAwIH0sCisgICAgeyAib3BlbiIsIChQeUNGdW5jdGlvbilkYm1vcGVuLCBNRVRIX1ZBUkFSR1MsCisgICAgICAib3BlbihwYXRoWywgZmxhZ1ssIG1vZGVdXSkgLT4gbWFwcGluZ1xuIgorICAgICAgIlJldHVybiBhIGRhdGFiYXNlIG9iamVjdC4ifSwKKyAgICB7IDAsIDAgfSwKIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0ZGJtKHZvaWQpIHsKLQlQeU9iamVjdCAqbSwgKmQsICpzOworICAgIFB5T2JqZWN0ICptLCAqZCwgKnM7CiAKLQlEYm10eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JbSA9IFB5X0luaXRNb2R1bGUoImRibSIsIGRibW1vZHVsZV9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JaWYgKERibUVycm9yID09IE5VTEwpCi0JCURibUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJkYm0uZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZyh3aGljaF9kYm0pOwotCWlmIChzICE9IE5VTEwpIHsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImxpYnJhcnkiLCBzKTsKLQkJUHlfREVDUkVGKHMpOwotCX0KLQlpZiAoRGJtRXJyb3IgIT0gTlVMTCkKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRGJtRXJyb3IpOworICAgIERibXR5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiZGJtIiwgZGJtbW9kdWxlX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoRGJtRXJyb3IgPT0gTlVMTCkKKyAgICAgICAgRGJtRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImRibS5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHdoaWNoX2RibSk7CisgICAgaWYgKHMgIT0gTlVMTCkgeworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibGlicmFyeSIsIHMpOworICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgfQorICAgIGlmIChEYm1FcnJvciAhPSBOVUxMKQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBEYm1FcnJvcik7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2RsbW9kdWxlLmMgYi9Nb2R1bGVzL2RsbW9kdWxlLmMKaW5kZXggYjJlYTRmNS4uYzM0OWFkMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9kbG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZGxtb2R1bGUuYwpAQCAtMTUsOCArMTUsOCBAQAogCiB0eXBlZGVmIHZvaWQgKlB5VW5pdlB0cjsKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlVbml2UHRyICpkbF9oYW5kbGU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5VW5pdlB0ciAqZGxfaGFuZGxlOwogfSBkbG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBEbHR5cGU7CkBAIC0yNiwxOTYgKzI2LDE5NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2Rsb2JqZWN0KFB5VW5pdlB0ciAqaGFuZGxlKQogewotCWRsb2JqZWN0ICp4cDsKLQl4cCA9IFB5T2JqZWN0X05ldyhkbG9iamVjdCwgJkRsdHlwZSk7Ci0JaWYgKHhwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXhwLT5kbF9oYW5kbGUgPSBoYW5kbGU7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXhwOworICAgIGRsb2JqZWN0ICp4cDsKKyAgICB4cCA9IFB5T2JqZWN0X05ldyhkbG9iamVjdCwgJkRsdHlwZSk7CisgICAgaWYgKHhwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHhwLT5kbF9oYW5kbGUgPSBoYW5kbGU7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXhwOwogfQogCiBzdGF0aWMgdm9pZAogZGxfZGVhbGxvYyhkbG9iamVjdCAqeHApCiB7Ci0JaWYgKHhwLT5kbF9oYW5kbGUgIT0gTlVMTCkKLQkJZGxjbG9zZSh4cC0+ZGxfaGFuZGxlKTsKLQlQeU9iamVjdF9EZWwoeHApOworICAgIGlmICh4cC0+ZGxfaGFuZGxlICE9IE5VTEwpCisgICAgICAgIGRsY2xvc2UoeHAtPmRsX2hhbmRsZSk7CisgICAgUHlPYmplY3RfRGVsKHhwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRsX2Nsb3NlKGRsb2JqZWN0ICp4cCkKIHsKLQlpZiAoeHAtPmRsX2hhbmRsZSAhPSBOVUxMKSB7Ci0JCWRsY2xvc2UoeHAtPmRsX2hhbmRsZSk7Ci0JCXhwLT5kbF9oYW5kbGUgPSBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHhwLT5kbF9oYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBkbGNsb3NlKHhwLT5kbF9oYW5kbGUpOworICAgICAgICB4cC0+ZGxfaGFuZGxlID0gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGxfc3ltKGRsb2JqZWN0ICp4cCwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlQeVVuaXZQdHIgKmZ1bmM7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKGFyZ3MpKSB7Ci0JCW5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJncyk7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGVkIHN0cmluZywgZm91bmQgJS4yMDBzIiwKLQkJCSAgICAgUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gZGxzeW0oeHAtPmRsX2hhbmRsZSwgbmFtZSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpZnVuYyk7CisgICAgY2hhciAqbmFtZTsKKyAgICBQeVVuaXZQdHIgKmZ1bmM7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZ3MpKSB7CisgICAgICAgIG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGVkIHN0cmluZywgZm91bmQgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJncyktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnVuYyA9IGRsc3ltKHhwLT5kbF9oYW5kbGUsIG5hbWUpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWZ1bmMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGxfY2FsbChkbG9iamVjdCAqeHAsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpuYW1lOwotCWxvbmcgKCpmdW5jKShsb25nLCBsb25nLCBsb25nLCBsb25nLCBsb25nLAotICAgICAgICAgICAgICAgICAgICAgbG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZyk7Ci0JbG9uZyBhbGlzdFsxMF07Ci0JbG9uZyByZXM7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3QgbiA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKLQlpZiAobiA8IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImF0IGxlYXN0IGEgbmFtZSBpcyBuZWVkZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5hbWUgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZ1bmMgPSAobG9uZyAoKikobG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgbG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZykpIAotICAgICAgICAgIGRsc3ltKHhwLT5kbF9oYW5kbGUsIFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBkbGVycm9yKCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG4tMSA+IDEwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInRvbyBtYW55IGFyZ3VtZW50cyAobWF4IDEwKSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm9yIChpID0gMTsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqdiA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKTsKLQkJaWYgKFB5SW50X0NoZWNrKHYpKQotCQkJYWxpc3RbaS0xXSA9IFB5SW50X0FzTG9uZyh2KTsKLQkJZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sodikpCi0JCQlhbGlzdFtpLTFdID0gKGxvbmcpUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JCWVsc2UgaWYgKHYgPT0gUHlfTm9uZSkKLQkJCWFsaXN0W2ktMV0gPSAobG9uZykgKChjaGFyICopTlVMTCk7Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAiYXJndW1lbnRzIG11c3QgYmUgaW50LCBzdHJpbmcgb3IgTm9uZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZm9yICg7IGkgPD0gMTA7IGkrKykKLQkJYWxpc3RbaS0xXSA9IDA7Ci0JcmVzID0gKCpmdW5jKShhbGlzdFswXSwgYWxpc3RbMV0sIGFsaXN0WzJdLCBhbGlzdFszXSwgYWxpc3RbNF0sCi0JCSAgICAgIGFsaXN0WzVdLCBhbGlzdFs2XSwgYWxpc3RbN10sIGFsaXN0WzhdLCBhbGlzdFs5XSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlcyk7CisgICAgUHlPYmplY3QgKm5hbWU7CisgICAgbG9uZyAoKmZ1bmMpKGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsCisgICAgICAgICAgICAgICAgIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcpOworICAgIGxvbmcgYWxpc3RbMTBdOworICAgIGxvbmcgcmVzOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX1NpemUoYXJncyk7CisgICAgaWYgKG4gPCAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhdCBsZWFzdCBhIG5hbWUgaXMgbmVlZGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBuYW1lID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSAobG9uZyAoKikobG9uZywgbG9uZywgbG9uZywgbG9uZywgbG9uZywKKyAgICAgICAgICAgICAgICAgICAgIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcpKQorICAgICAgZGxzeW0oeHAtPmRsX2hhbmRsZSwgUHlTdHJpbmdfQXNTdHJpbmcobmFtZSkpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobi0xID4gMTApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBhcmd1bWVudHMgKG1heCAxMCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgaSk7CisgICAgICAgIGlmIChQeUludF9DaGVjayh2KSkKKyAgICAgICAgICAgIGFsaXN0W2ktMV0gPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKQorICAgICAgICAgICAgYWxpc3RbaS0xXSA9IChsb25nKVB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgICAgICBlbHNlIGlmICh2ID09IFB5X05vbmUpCisgICAgICAgICAgICBhbGlzdFtpLTFdID0gKGxvbmcpICgoY2hhciAqKU5VTEwpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudHMgbXVzdCBiZSBpbnQsIHN0cmluZyBvciBOb25lIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKDsgaSA8PSAxMDsgaSsrKQorICAgICAgICBhbGlzdFtpLTFdID0gMDsKKyAgICByZXMgPSAoKmZ1bmMpKGFsaXN0WzBdLCBhbGlzdFsxXSwgYWxpc3RbMl0sIGFsaXN0WzNdLCBhbGlzdFs0XSwKKyAgICAgICAgICAgICAgICAgIGFsaXN0WzVdLCBhbGlzdFs2XSwgYWxpc3RbN10sIGFsaXN0WzhdLCBhbGlzdFs5XSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlcyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkbG9iamVjdF9tZXRob2RzW10gPSB7Ci0JeyJjYWxsIiwJKFB5Q0Z1bmN0aW9uKWRsX2NhbGwsIE1FVEhfVkFSQVJHU30sCi0JeyJzeW0iLCAJKFB5Q0Z1bmN0aW9uKWRsX3N5bSwgTUVUSF9PfSwKLQl7ImNsb3NlIiwJKFB5Q0Z1bmN0aW9uKWRsX2Nsb3NlLCBNRVRIX05PQVJHU30sCi0Je05VTEwsICAJTlVMTH0JCQkgLyogU2VudGluZWwgKi8KKyAgICB7ImNhbGwiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilkbF9jYWxsLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic3ltIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRsX3N5bSwgTUVUSF9PfSwKKyAgICB7ImNsb3NlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilkbF9jbG9zZSwgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZGxfZ2V0YXR0cihkbG9iamVjdCAqeHAsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoZGxvYmplY3RfbWV0aG9kcywgKFB5T2JqZWN0ICopeHAsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGRsb2JqZWN0X21ldGhvZHMsIChQeU9iamVjdCAqKXhwLCBuYW1lKTsKIH0KIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IERsdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiZGwuZGwiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoZGxvYmplY3QpLAkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGxfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylkbF9nZXRhdHRyLC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJkbC5kbCIsICAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihkbG9iamVjdCksICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilkbF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpZGxfZ2V0YXR0ciwvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRsX29wZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JaW50IG1vZGU7Ci0JUHlVbml2UHRyICpoYW5kbGU7Ci0JaWYgKHNpemVvZihpbnQpICE9IHNpemVvZihsb25nKSB8fAotCSAgICBzaXplb2YobG9uZykgIT0gc2l6ZW9mKGNoYXIgKikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgIGNoYXIgKm5hbWU7CisgICAgaW50IG1vZGU7CisgICAgUHlVbml2UHRyICpoYW5kbGU7CisgICAgaWYgKHNpemVvZihpbnQpICE9IHNpemVvZihsb25nKSB8fAorICAgICAgICBzaXplb2YobG9uZykgIT0gc2l6ZW9mKGNoYXIgKikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICJtb2R1bGUgZGwgcmVxdWlyZXMgc2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpID09IHNpemVvZihjaGFyKikiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6Om9wZW4iLCAmbmFtZSkpCi0JCW1vZGUgPSBSVExEX0xBWlk7Ci0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiemk6b3BlbiIsICZuYW1lLCAmbW9kZSkpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiejpvcGVuIiwgJm5hbWUpKQorICAgICAgICBtb2RlID0gUlRMRF9MQVpZOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInppOm9wZW4iLCAmbmFtZSwgJm1vZGUpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZuZGVmIFJUTERfTk9XCi0JCWlmIChtb2RlICE9IFJUTERfTEFaWSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtb2RlIG11c3QgYmUgMSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKG1vZGUgIT0gUlRMRF9MQVpZKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1vZGUgbXVzdCBiZSAxIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JfQotCWhhbmRsZSA9IGRsb3BlbihuYW1lLCBtb2RlKTsKLQlpZiAoaGFuZGxlID09IE5VTEwpIHsKLQkJY2hhciAqZXJybXNnID0gZGxlcnJvcigpOwotCQlpZiAoIWVycm1zZykKLQkJCWVycm1zZyA9ICJkbG9wZW4oKSBlcnJvciI7Ci0JCVB5RXJyX1NldFN0cmluZyhEbGVycm9yLCBlcnJtc2cpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfQorICAgIGhhbmRsZSA9IGRsb3BlbihuYW1lLCBtb2RlKTsKKyAgICBpZiAoaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgY2hhciAqZXJybXNnID0gZGxlcnJvcigpOworICAgICAgICBpZiAoIWVycm1zZykKKyAgICAgICAgICAgIGVycm1zZyA9ICJkbG9wZW4oKSBlcnJvciI7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhEbGVycm9yLCBlcnJtc2cpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWZkZWYgX19WTVMKLQkvKiAgIFVuZGVyIE9wZW5WTVMgZGxvcGVuIGRvZXNuJ3QgZG8gYW55IGNoZWNrLCBqdXN0IHNhdmUgdGhlIG5hbWUKLQkgKiBmb3IgbGF0ZXIgdXNlLCBzbyB3ZSBoYXZlIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGlzIHJlYWRhYmxlLAotCSAqIHRoZSBuYW1lIGNhbiBiZSBhIGxvZ2ljYWwgb3IgYSBmaWxlIGZyb20gU1lTJFNIQVJFLgotCSAqLwotCWlmIChhY2Nlc3MobmFtZSwgUl9PSykpIHsKLQkJY2hhciBmbmFtZVtzdHJsZW4obmFtZSkgKyAyMF07Ci0JCXN0cmNweShmbmFtZSwgIlNZUyRTSEFSRToiKTsKLQkJc3RyY2F0KGZuYW1lLCBuYW1lKTsKLQkJc3RyY2F0KGZuYW1lLCAiLkVYRSIpOwotCQlpZiAoYWNjZXNzKGZuYW1lLCBSX09LKSkgewotCQkJZGxjbG9zZShoYW5kbGUpOwotCQkJUHlFcnJfU2V0U3RyaW5nKERsZXJyb3IsCi0JCQkJIkZpbGUgbm90IGZvdW5kIG9yIHByb3RlY3Rpb24gdmlvbGF0aW9uIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICAvKiAgIFVuZGVyIE9wZW5WTVMgZGxvcGVuIGRvZXNuJ3QgZG8gYW55IGNoZWNrLCBqdXN0IHNhdmUgdGhlIG5hbWUKKyAgICAgKiBmb3IgbGF0ZXIgdXNlLCBzbyB3ZSBoYXZlIHRvIGNoZWNrIGlmIHRoZSBmaWxlIGlzIHJlYWRhYmxlLAorICAgICAqIHRoZSBuYW1lIGNhbiBiZSBhIGxvZ2ljYWwgb3IgYSBmaWxlIGZyb20gU1lTJFNIQVJFLgorICAgICAqLworICAgIGlmIChhY2Nlc3MobmFtZSwgUl9PSykpIHsKKyAgICAgICAgY2hhciBmbmFtZVtzdHJsZW4obmFtZSkgKyAyMF07CisgICAgICAgIHN0cmNweShmbmFtZSwgIlNZUyRTSEFSRToiKTsKKyAgICAgICAgc3RyY2F0KGZuYW1lLCBuYW1lKTsKKyAgICAgICAgc3RyY2F0KGZuYW1lLCAiLkVYRSIpOworICAgICAgICBpZiAoYWNjZXNzKGZuYW1lLCBSX09LKSkgeworICAgICAgICAgICAgZGxjbG9zZShoYW5kbGUpOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERsZXJyb3IsCisgICAgICAgICAgICAgICAgIkZpbGUgbm90IGZvdW5kIG9yIHByb3RlY3Rpb24gdmlvbGF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgotCXJldHVybiBuZXdkbG9iamVjdChoYW5kbGUpOworICAgIHJldHVybiBuZXdkbG9iamVjdChoYW5kbGUpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZGxfbWV0aG9kc1tdID0gewotCXsib3BlbiIsCWRsX29wZW4sIE1FVEhfVkFSQVJHU30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Im9wZW4iLCAgICAgICAgICAgIGRsX29wZW4sIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIEZyb20gc29ja2V0bW9kdWxlLmMKQEAgLTIyNiw1OSArMjI2LDU5IEBACiBzdGF0aWMgdm9pZAogaW5zaW50KFB5T2JqZWN0ICpkLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOwotCWlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KSkKLQkJUHlFcnJfQ2xlYXIoKTsKKyAgICBQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7CisgICAgaWYgKCF2IHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpKQorICAgICAgICBQeUVycl9DbGVhcigpOwogCi0JUHlfWERFQ1JFRih2KTsKKyAgICBQeV9YREVDUkVGKHYpOwogfQogCiBQeU1PRElOSVRfRlVOQwogaW5pdGRsKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqeDsKKyAgICBQeU9iamVjdCAqbSwgKmQsICp4OwogCiAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgZGwgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjA7IHVzZSB0aGUgY3R5cGVzIG1vZHVsZSBpbnN0ZWFkIiwgMikgPCAwKQotICAgICAgICByZXR1cm47ICAgIAorICAgIHJldHVybjsKIAotCS8qIEluaXRpYWxpemUgb2JqZWN0IHR5cGUgKi8KLQlQeV9UWVBFKCZEbHR5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIC8qIEluaXRpYWxpemUgb2JqZWN0IHR5cGUgKi8KKyAgICBQeV9UWVBFKCZEbHR5cGUpID0gJlB5VHlwZV9UeXBlOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGUoImRsIiwgZGxfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJkbCIsIGRsX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRGxlcnJvciA9IHggPSBQeUVycl9OZXdFeGNlcHRpb24oImRsLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgeCk7Ci0JeCA9IFB5SW50X0Zyb21Mb25nKChsb25nKVJUTERfTEFaWSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJUTERfTEFaWSIsIHgpOworICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgRGxlcnJvciA9IHggPSBQeUVycl9OZXdFeGNlcHRpb24oImRsLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKChsb25nKVJUTERfTEFaWSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlJUTERfTEFaWSIsIHgpOwogI2RlZmluZSBJTlNJTlQoWCkgICAgaW5zaW50KGQsI1gsWCkKICNpZmRlZiBSVExEX05PVwotICAgICAgICBJTlNJTlQoUlRMRF9OT1cpOworICAgIElOU0lOVChSVExEX05PVyk7CiAjZW5kaWYKICNpZmRlZiBSVExEX05PTE9BRAotICAgICAgICBJTlNJTlQoUlRMRF9OT0xPQUQpOworICAgIElOU0lOVChSVExEX05PTE9BRCk7CiAjZW5kaWYKICNpZmRlZiBSVExEX0dMT0JBTAotICAgICAgICBJTlNJTlQoUlRMRF9HTE9CQUwpOworICAgIElOU0lOVChSVExEX0dMT0JBTCk7CiAjZW5kaWYKICNpZmRlZiBSVExEX0xPQ0FMCi0gICAgICAgIElOU0lOVChSVExEX0xPQ0FMKTsKKyAgICBJTlNJTlQoUlRMRF9MT0NBTCk7CiAjZW5kaWYKICNpZmRlZiBSVExEX1BBUkVOVAotICAgICAgICBJTlNJTlQoUlRMRF9QQVJFTlQpOworICAgIElOU0lOVChSVExEX1BBUkVOVCk7CiAjZW5kaWYKICNpZmRlZiBSVExEX0dST1VQCi0gICAgICAgIElOU0lOVChSVExEX0dST1VQKTsKKyAgICBJTlNJTlQoUlRMRF9HUk9VUCk7CiAjZW5kaWYKICNpZmRlZiBSVExEX1dPUkxECi0gICAgICAgIElOU0lOVChSVExEX1dPUkxEKTsKKyAgICBJTlNJTlQoUlRMRF9XT1JMRCk7CiAjZW5kaWYKICNpZmRlZiBSVExEX05PREVMRVRFCi0gICAgICAgIElOU0lOVChSVExEX05PREVMRVRFKTsKKyAgICBJTlNJTlQoUlRMRF9OT0RFTEVURSk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvZXJybm9tb2R1bGUuYyBiL01vZHVsZXMvZXJybm9tb2R1bGUuYwppbmRleCA2NDJkNzIxLi42OGMzYzQ5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Vycm5vbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9lcnJub21vZHVsZS5jCkBAIC0xMCwxMCArMTAsMTAgQEAKIAogLyoKICAqIFB1bGwgaW4gdGhlIHN5c3RlbSBlcnJvciBkZWZpbml0aW9ucwotICovIAorICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBlcnJub19tZXRob2RzW10gPSB7Ci0Je05VTEwsCSAgICAgIAlOVUxMfQorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0KIH07CiAKIC8qIEhlbHBlciBmdW5jdGlvbiBkb2luZyB0aGUgZGljdGlvbmFyeSBpbnNlcnRpbmcgKi8KQEAgLTIxLDIxICsyMSwyMSBAQAogc3RhdGljIHZvaWQKIF9pbnNjb2RlKFB5T2JqZWN0ICpkLCBQeU9iamVjdCAqZGUsIGNoYXIgKm5hbWUsIGludCBjb2RlKQogewotCVB5T2JqZWN0ICp1ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKLQlQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBjb2RlKTsKKyAgICBQeU9iamVjdCAqdSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7CisgICAgUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgY29kZSk7CiAKLQkvKiBEb24ndCBib3RoZXIgY2hlY2tpbmcgZm9yIGVycm9yczsgdGhleSdsbCBiZSBjYXVnaHQgYXQgdGhlIGVuZAotCSAqIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gYnkgdGhlIGNhbGxlciBvZgotCSAqIGluaXRlcnJubygpLgotCSAqLwotCWlmICh1ICYmIHYpIHsKLQkJLyogaW5zZXJ0IGluIG1vZHVsZXMgZGljdCAqLwotCQlQeURpY3RfU2V0SXRlbShkLCB1LCB2KTsKLQkJLyogaW5zZXJ0IGluIGVycm9yY29kZSBkaWN0ICovCi0JCVB5RGljdF9TZXRJdGVtKGRlLCB2LCB1KTsKLQl9Ci0JUHlfWERFQ1JFRih1KTsKLQlQeV9YREVDUkVGKHYpOworICAgIC8qIERvbid0IGJvdGhlciBjaGVja2luZyBmb3IgZXJyb3JzOyB0aGV5J2xsIGJlIGNhdWdodCBhdCB0aGUgZW5kCisgICAgICogb2YgdGhlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBieSB0aGUgY2FsbGVyIG9mCisgICAgICogaW5pdGVycm5vKCkuCisgICAgICovCisgICAgaWYgKHUgJiYgdikgeworICAgICAgICAvKiBpbnNlcnQgaW4gbW9kdWxlcyBkaWN0ICovCisgICAgICAgIFB5RGljdF9TZXRJdGVtKGQsIHUsIHYpOworICAgICAgICAvKiBpbnNlcnQgaW4gZXJyb3Jjb2RlIGRpY3QgKi8KKyAgICAgICAgUHlEaWN0X1NldEl0ZW0oZGUsIHYsIHUpOworICAgIH0KKyAgICBQeV9YREVDUkVGKHUpOworICAgIFB5X1hERUNSRUYodik7CiB9CiAKIFB5RG9jX1NUUlZBUihlcnJub19fZG9jX18sCkBAIC01NSw3MzQgKzU1LDczNCBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRlcnJubyh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZCwgKmRlOwotCW0gPSBQeV9Jbml0TW9kdWxlMygiZXJybm8iLCBlcnJub19tZXRob2RzLCBlcnJub19fZG9jX18pOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlkZSA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIWQgfHwgIWRlIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvcmNvZGUiLCBkZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkLCAqZGU7CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJlcnJubyIsIGVycm5vX21ldGhvZHMsIGVycm5vX19kb2NfXyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGRlID0gUHlEaWN0X05ldygpOworICAgIGlmICghZCB8fCAhZGUgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yY29kZSIsIGRlKSA8IDApCisgICAgICAgIHJldHVybjsKIAogLyogTWFjcm8gc28gSSBkb24ndCBoYXZlIHRvIGVkaXQgZWFjaCBhbmQgZXZlcnkgbGluZSBiZWxvdy4uLiAqLwogI2RlZmluZSBpbnNjb2RlKGQsIGRzLCBkZSwgbmFtZSwgY29kZSwgY29tbWVudCkgX2luc2NvZGUoZCwgZGUsIG5hbWUsIGNvZGUpCiAKLQkvKgotCSAqIFRoZSBuYW1lcyBhbmQgY29tbWVudHMgYXJlIGJvcnJvd2VkIGZyb20gbGludXgvaW5jbHVkZS9lcnJuby5oLAotCSAqIHdoaWNoIHNob3VsZCBiZSBwcmV0dHkgYWxsLWluY2x1c2l2ZQotCSAqLyAKKyAgICAvKgorICAgICAqIFRoZSBuYW1lcyBhbmQgY29tbWVudHMgYXJlIGJvcnJvd2VkIGZyb20gbGludXgvaW5jbHVkZS9lcnJuby5oLAorICAgICAqIHdoaWNoIHNob3VsZCBiZSBwcmV0dHkgYWxsLWluY2x1c2l2ZQorICAgICAqLwogCiAjaWZkZWYgRU5PREVWCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9ERVYiLCBFTk9ERVYsICJObyBzdWNoIGRldmljZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PREVWIiwgRU5PREVWLCAiTm8gc3VjaCBkZXZpY2UiKTsKICNlbmRpZgogI2lmZGVmIEVOT0NTSQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PQ1NJIiwgRU5PQ1NJLCAiTm8gQ1NJIHN0cnVjdHVyZSBhdmFpbGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0NTSSIsIEVOT0NTSSwgIk5vIENTSSBzdHJ1Y3R1cmUgYXZhaWxhYmxlIik7CiAjZW5kaWYKICNpZmRlZiBFSE9TVFVOUkVBQ0gKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVIT1NUVU5SRUFDSCIsIEVIT1NUVU5SRUFDSCwgIk5vIHJvdXRlIHRvIGhvc3QiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVIT1NUVU5SRUFDSCIsIEVIT1NUVU5SRUFDSCwgIk5vIHJvdXRlIHRvIGhvc3QiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUhPU1RVTlJFQUNICi0JaW5zY29kZShkLCBkcywgZGUsICJFSE9TVFVOUkVBQ0giLCBXU0FFSE9TVFVOUkVBQ0gsICJObyByb3V0ZSB0byBob3N0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSE9TVFVOUkVBQ0giLCBXU0FFSE9TVFVOUkVBQ0gsICJObyByb3V0ZSB0byBob3N0Iik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT01TRwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTVNHIiwgRU5PTVNHLCAiTm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT01TRyIsIEVOT01TRywgIk5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlIik7CiAjZW5kaWYKICNpZmRlZiBFVUNMRUFOCi0JaW5zY29kZShkLCBkcywgZGUsICJFVUNMRUFOIiwgRVVDTEVBTiwgIlN0cnVjdHVyZSBuZWVkcyBjbGVhbmluZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVVDTEVBTiIsIEVVQ0xFQU4sICJTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmciKTsKICNlbmRpZgogI2lmZGVmIEVMMk5TWU5DCi0JaW5zY29kZShkLCBkcywgZGUsICJFTDJOU1lOQyIsIEVMMk5TWU5DLCAiTGV2ZWwgMiBub3Qgc3luY2hyb25pemVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTDJOU1lOQyIsIEVMMk5TWU5DLCAiTGV2ZWwgMiBub3Qgc3luY2hyb25pemVkIik7CiAjZW5kaWYKICNpZmRlZiBFTDJITFQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVMMkhMVCIsIEVMMkhMVCwgIkxldmVsIDIgaGFsdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTDJITFQiLCBFTDJITFQsICJMZXZlbCAyIGhhbHRlZCIpOwogI2VuZGlmCiAjaWZkZWYgRU5PREFUQQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PREFUQSIsIEVOT0RBVEEsICJObyBkYXRhIGF2YWlsYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PREFUQSIsIEVOT0RBVEEsICJObyBkYXRhIGF2YWlsYWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgRU5PVEJMSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVEJMSyIsIEVOT1RCTEssICJCbG9jayBkZXZpY2UgcmVxdWlyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RCTEsiLCBFTk9UQkxLLCAiQmxvY2sgZGV2aWNlIHJlcXVpcmVkIik7CiAjZW5kaWYKICNpZmRlZiBFTk9TWVMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1NZUyIsIEVOT1NZUywgIkZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PU1lTIiwgRU5PU1lTLCAiRnVuY3Rpb24gbm90IGltcGxlbWVudGVkIik7CiAjZW5kaWYKICNpZmRlZiBFUElQRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVBJUEUiLCBFUElQRSwgIkJyb2tlbiBwaXBlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUElQRSIsIEVQSVBFLCAiQnJva2VuIHBpcGUiKTsKICNlbmRpZgogI2lmZGVmIEVJTlZBTAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUlOVkFMIiwgRUlOVkFMLCAiSW52YWxpZCBhcmd1bWVudCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlOVkFMIiwgRUlOVkFMLCAiSW52YWxpZCBhcmd1bWVudCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFSU5WQUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlZBTCIsIFdTQUVJTlZBTCwgIkludmFsaWQgYXJndW1lbnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlZBTCIsIFdTQUVJTlZBTCwgIkludmFsaWQgYXJndW1lbnQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU9WRVJGTE9XCi0JaW5zY29kZShkLCBkcywgZGUsICJFT1ZFUkZMT1ciLCBFT1ZFUkZMT1csICJWYWx1ZSB0b28gbGFyZ2UgZm9yIGRlZmluZWQgZGF0YSB0eXBlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFT1ZFUkZMT1ciLCBFT1ZFUkZMT1csICJWYWx1ZSB0b28gbGFyZ2UgZm9yIGRlZmluZWQgZGF0YSB0eXBlIik7CiAjZW5kaWYKICNpZmRlZiBFQURWCi0JaW5zY29kZShkLCBkcywgZGUsICJFQURWIiwgRUFEViwgIkFkdmVydGlzZSBlcnJvciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFEViIsIEVBRFYsICJBZHZlcnRpc2UgZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVJTlRSCi0JaW5zY29kZShkLCBkcywgZGUsICJFSU5UUiIsIEVJTlRSLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlRSIiwgRUlOVFIsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFSU5UUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUlOVFIiLCBXU0FFSU5UUiwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSU5UUiIsIFdTQUVJTlRSLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRVVTRVJTCi0JaW5zY29kZShkLCBkcywgZGUsICJFVVNFUlMiLCBFVVNFUlMsICJUb28gbWFueSB1c2VycyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVVTRVJTIiwgRVVTRVJTLCAiVG9vIG1hbnkgdXNlcnMiKTsKICNlbHNlCiAjaWZkZWYgV1NBRVVTRVJTCi0JaW5zY29kZShkLCBkcywgZGUsICJFVVNFUlMiLCBXU0FFVVNFUlMsICJUb28gbWFueSB1c2VycyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVVTRVJTIiwgV1NBRVVTRVJTLCAiVG9vIG1hbnkgdXNlcnMiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5PVEVNUFRZCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9URU1QVFkiLCBFTk9URU1QVFksICJEaXJlY3Rvcnkgbm90IGVtcHR5Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9URU1QVFkiLCBFTk9URU1QVFksICJEaXJlY3Rvcnkgbm90IGVtcHR5Iik7CiAjZWxzZQogI2lmZGVmIFdTQUVOT1RFTVBUWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVEVNUFRZIiwgV1NBRU5PVEVNUFRZLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVEVNUFRZIiwgV1NBRU5PVEVNUFRZLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9CVUZTCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9CVUZTIiwgRU5PQlVGUywgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0JVRlMiLCBFTk9CVUZTLCAiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTk9CVUZTCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9CVUZTIiwgV1NBRU5PQlVGUywgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0JVRlMiLCBXU0FFTk9CVUZTLCAiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFUFJPVE8KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQUk9UTyIsIEVQUk9UTywgIlByb3RvY29sIGVycm9yIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUFJPVE8iLCBFUFJPVE8sICJQcm90b2NvbCBlcnJvciIpOwogI2VuZGlmCiAjaWZkZWYgRVJFTU9URQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVJFTU9URSIsIEVSRU1PVEUsICJPYmplY3QgaXMgcmVtb3RlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUkVNT1RFIiwgRVJFTU9URSwgIk9iamVjdCBpcyByZW1vdGUiKTsKICNlbHNlCiAjaWZkZWYgV1NBRVJFTU9URQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVJFTU9URSIsIFdTQUVSRU1PVEUsICJPYmplY3QgaXMgcmVtb3RlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUkVNT1RFIiwgV1NBRVJFTU9URSwgIk9iamVjdCBpcyByZW1vdGUiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5BVkFJTAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5BVkFJTCIsIEVOQVZBSUwsICJObyBYRU5JWCBzZW1hcGhvcmVzIGF2YWlsYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5BVkFJTCIsIEVOQVZBSUwsICJObyBYRU5JWCBzZW1hcGhvcmVzIGF2YWlsYWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgRUNISUxECi0JaW5zY29kZShkLCBkcywgZGUsICJFQ0hJTEQiLCBFQ0hJTEQsICJObyBjaGlsZCBwcm9jZXNzZXMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVDSElMRCIsIEVDSElMRCwgIk5vIGNoaWxkIHByb2Nlc3NlcyIpOwogI2VuZGlmCiAjaWZkZWYgRUxPT1AKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVMT09QIiwgRUxPT1AsICJUb28gbWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUxPT1AiLCBFTE9PUCwgIlRvbyBtYW55IHN5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVMT09QCi0JaW5zY29kZShkLCBkcywgZGUsICJFTE9PUCIsIFdTQUVMT09QLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVMT09QIiwgV1NBRUxPT1AsICJUb28gbWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFWERFVgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVhERVYiLCBFWERFViwgIkNyb3NzLWRldmljZSBsaW5rIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFWERFViIsIEVYREVWLCAiQ3Jvc3MtZGV2aWNlIGxpbmsiKTsKICNlbmRpZgogI2lmZGVmIEUyQklHCi0JaW5zY29kZShkLCBkcywgZGUsICJFMkJJRyIsIEUyQklHLCAiQXJnIGxpc3QgdG9vIGxvbmciKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkUyQklHIiwgRTJCSUcsICJBcmcgbGlzdCB0b28gbG9uZyIpOwogI2VuZGlmCiAjaWZkZWYgRVNSQ0gKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVTUkNIIiwgRVNSQ0gsICJObyBzdWNoIHByb2Nlc3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVTUkNIIiwgRVNSQ0gsICJObyBzdWNoIHByb2Nlc3MiKTsKICNlbmRpZgogI2lmZGVmIEVNU0dTSVpFCi0JaW5zY29kZShkLCBkcywgZGUsICJFTVNHU0laRSIsIEVNU0dTSVpFLCAiTWVzc2FnZSB0b28gbG9uZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU1TR1NJWkUiLCBFTVNHU0laRSwgIk1lc3NhZ2UgdG9vIGxvbmciKTsKICNlbHNlCiAjaWZkZWYgV1NBRU1TR1NJWkUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVNU0dTSVpFIiwgV1NBRU1TR1NJWkUsICJNZXNzYWdlIHRvbyBsb25nIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTVNHU0laRSIsIFdTQUVNU0dTSVpFLCAiTWVzc2FnZSB0b28gbG9uZyIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFQUZOT1NVUFBPUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVBRk5PU1VQUE9SVCIsIEVBRk5PU1VQUE9SVCwgIkFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVBRk5PU1VQUE9SVCIsIEVBRk5PU1VQUE9SVCwgIkFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUFGTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUZOT1NVUFBPUlQiLCBXU0FFQUZOT1NVUFBPUlQsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUZOT1NVUFBPUlQiLCBXU0FFQUZOT1NVUFBPUlQsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVCQURSCi0JaW5zY29kZShkLCBkcywgZGUsICJFQkFEUiIsIEVCQURSLCAiSW52YWxpZCByZXF1ZXN0IGRlc2NyaXB0b3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURSIiwgRUJBRFIsICJJbnZhbGlkIHJlcXVlc3QgZGVzY3JpcHRvciIpOwogI2VuZGlmCiAjaWZkZWYgRUhPU1RET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJFSE9TVERPV04iLCBFSE9TVERPV04sICJIb3N0IGlzIGRvd24iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVIT1NURE9XTiIsIEVIT1NURE9XTiwgIkhvc3QgaXMgZG93biIpOwogI2Vsc2UKICNpZmRlZiBXU0FFSE9TVERPV04KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVIT1NURE9XTiIsIFdTQUVIT1NURE9XTiwgIkhvc3QgaXMgZG93biIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUhPU1RET1dOIiwgV1NBRUhPU1RET1dOLCAiSG9zdCBpcyBkb3duIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVQRk5PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVBGTk9TVVBQT1JUIiwgRVBGTk9TVVBQT1JULCAiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVQRk5PU1VQUE9SVCIsIEVQRk5PU1VQUE9SVCwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVQRk5PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVBGTk9TVVBQT1JUIiwgV1NBRVBGTk9TVVBQT1JULCAiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVQRk5PU1VQUE9SVCIsIFdTQUVQRk5PU1VQUE9SVCwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT1BST1RPT1BUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9QUk9UT09QVCIsIEVOT1BST1RPT1BULCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PUFJPVE9PUFQiLCBFTk9QUk9UT09QVCwgIlByb3RvY29sIG5vdCBhdmFpbGFibGUiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5PUFJPVE9PUFQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1BST1RPT1BUIiwgV1NBRU5PUFJPVE9PUFQsICJQcm90b2NvbCBub3QgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9QUk9UT09QVCIsIFdTQUVOT1BST1RPT1BULCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFQlVTWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUJVU1kiLCBFQlVTWSwgIkRldmljZSBvciByZXNvdXJjZSBidXN5Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQlVTWSIsIEVCVVNZLCAiRGV2aWNlIG9yIHJlc291cmNlIGJ1c3kiKTsKICNlbmRpZgogI2lmZGVmIEVXT1VMREJMT0NLCi0JaW5zY29kZShkLCBkcywgZGUsICJFV09VTERCTE9DSyIsIEVXT1VMREJMT0NLLCAiT3BlcmF0aW9uIHdvdWxkIGJsb2NrIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFV09VTERCTE9DSyIsIEVXT1VMREJMT0NLLCAiT3BlcmF0aW9uIHdvdWxkIGJsb2NrIik7CiAjZWxzZQogI2lmZGVmIFdTQUVXT1VMREJMT0NLCi0JaW5zY29kZShkLCBkcywgZGUsICJFV09VTERCTE9DSyIsIFdTQUVXT1VMREJMT0NLLCAiT3BlcmF0aW9uIHdvdWxkIGJsb2NrIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFV09VTERCTE9DSyIsIFdTQUVXT1VMREJMT0NLLCAiT3BlcmF0aW9uIHdvdWxkIGJsb2NrIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVCQURGRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUJBREZEIiwgRUJBREZELCAiRmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUJBREZEIiwgRUJBREZELCAiRmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZSIpOwogI2VuZGlmCiAjaWZkZWYgRURPVERPVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRURPVERPVCIsIEVET1RET1QsICJSRlMgc3BlY2lmaWMgZXJyb3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVET1RET1QiLCBFRE9URE9ULCAiUkZTIHNwZWNpZmljIGVycm9yIik7CiAjZW5kaWYKICNpZmRlZiBFSVNDT05OCi0JaW5zY29kZShkLCBkcywgZGUsICJFSVNDT05OIiwgRUlTQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlTQ09OTiIsIEVJU0NPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUlTQ09OTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUlTQ09OTiIsIFdTQUVJU0NPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJU0NPTk4iLCBXU0FFSVNDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIGFscmVhZHkgY29ubmVjdGVkIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT0FOTwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PQU5PIiwgRU5PQU5PLCAiTm8gYW5vZGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0FOTyIsIEVOT0FOTywgIk5vIGFub2RlIik7CiAjZW5kaWYKICNpZmRlZiBFU0hVVERPV04KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVTSFVURE9XTiIsIEVTSFVURE9XTiwgIkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVNIVVRET1dOIiwgRVNIVVRET1dOLCAiQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duIik7CiAjZWxzZQogI2lmZGVmIFdTQUVTSFVURE9XTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVNIVVRET1dOIiwgV1NBRVNIVVRET1dOLCAiQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU0hVVERPV04iLCBXU0FFU0hVVERPV04sICJDYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24iKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUNIUk5HCi0JaW5zY29kZShkLCBkcywgZGUsICJFQ0hSTkciLCBFQ0hSTkcsICJDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVDSFJORyIsIEVDSFJORywgIkNoYW5uZWwgbnVtYmVyIG91dCBvZiByYW5nZSIpOwogI2VuZGlmCiAjaWZkZWYgRUxJQkJBRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUxJQkJBRCIsIEVMSUJCQUQsICJBY2Nlc3NpbmcgYSBjb3JydXB0ZWQgc2hhcmVkIGxpYnJhcnkiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJCQUQiLCBFTElCQkFELCAiQWNjZXNzaW5nIGEgY29ycnVwdGVkIHNoYXJlZCBsaWJyYXJ5Iik7CiAjZW5kaWYKICNpZmRlZiBFTk9ORVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT05FVCIsIEVOT05FVCwgIk1hY2hpbmUgaXMgbm90IG9uIHRoZSBuZXR3b3JrIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9ORVQiLCBFTk9ORVQsICJNYWNoaW5lIGlzIG5vdCBvbiB0aGUgbmV0d29yayIpOwogI2VuZGlmCiAjaWZkZWYgRUJBREUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURFIiwgRUJBREUsICJJbnZhbGlkIGV4Y2hhbmdlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkFERSIsIEVCQURFLCAiSW52YWxpZCBleGNoYW5nZSIpOwogI2VuZGlmCiAjaWZkZWYgRUJBREYKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURGIiwgRUJBREYsICJCYWQgZmlsZSBudW1iZXIiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURGIiwgRUJBREYsICJCYWQgZmlsZSBudW1iZXIiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUJBREYKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURGIiwgV1NBRUJBREYsICJCYWQgZmlsZSBudW1iZXIiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURGIiwgV1NBRUJBREYsICJCYWQgZmlsZSBudW1iZXIiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU1VTFRJSE9QCi0JaW5zY29kZShkLCBkcywgZGUsICJFTVVMVElIT1AiLCBFTVVMVElIT1AsICJNdWx0aWhvcCBhdHRlbXB0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVNVUxUSUhPUCIsIEVNVUxUSUhPUCwgIk11bHRpaG9wIGF0dGVtcHRlZCIpOwogI2VuZGlmCiAjaWZkZWYgRUlPCi0JaW5zY29kZShkLCBkcywgZGUsICJFSU8iLCBFSU8sICJJL08gZXJyb3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTyIsIEVJTywgIkkvTyBlcnJvciIpOwogI2VuZGlmCiAjaWZkZWYgRVVOQVRDSAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVVOQVRDSCIsIEVVTkFUQ0gsICJQcm90b2NvbCBkcml2ZXIgbm90IGF0dGFjaGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFVU5BVENIIiwgRVVOQVRDSCwgIlByb3RvY29sIGRyaXZlciBub3QgYXR0YWNoZWQiKTsKICNlbmRpZgogI2lmZGVmIEVQUk9UT1RZUEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQUk9UT1RZUEUiLCBFUFJPVE9UWVBFLCAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUFJPVE9UWVBFIiwgRVBST1RPVFlQRSwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFUFJPVE9UWVBFCi0JaW5zY29kZShkLCBkcywgZGUsICJFUFJPVE9UWVBFIiwgV1NBRVBST1RPVFlQRSwgIlByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPVFlQRSIsIFdTQUVQUk9UT1RZUEUsICJQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5PU1BDCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9TUEMiLCBFTk9TUEMsICJObyBzcGFjZSBsZWZ0IG9uIGRldmljZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PU1BDIiwgRU5PU1BDLCAiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiKTsKICNlbmRpZgogI2lmZGVmIEVOT0VYRUMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0VYRUMiLCBFTk9FWEVDLCAiRXhlYyBmb3JtYXQgZXJyb3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0VYRUMiLCBFTk9FWEVDLCAiRXhlYyBmb3JtYXQgZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVBTFJFQURZCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUxSRUFEWSIsIEVBTFJFQURZLCAiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVBTFJFQURZIiwgRUFMUkVBRFksICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIpOwogI2Vsc2UKICNpZmRlZiBXU0FFQUxSRUFEWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFMUkVBRFkiLCBXU0FFQUxSRUFEWSwgIk9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUxSRUFEWSIsIFdTQUVBTFJFQURZLCAiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5FVERPV04KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVORVRET1dOIiwgRU5FVERPV04sICJOZXR3b3JrIGlzIGRvd24iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVORVRET1dOIiwgRU5FVERPV04sICJOZXR3b3JrIGlzIGRvd24iKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5FVERPV04KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVORVRET1dOIiwgV1NBRU5FVERPV04sICJOZXR3b3JrIGlzIGRvd24iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVORVRET1dOIiwgV1NBRU5FVERPV04sICJOZXR3b3JrIGlzIGRvd24iKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5PVE5BTQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVE5BTSIsIEVOT1ROQU0sICJOb3QgYSBYRU5JWCBuYW1lZCB0eXBlIGZpbGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1ROQU0iLCBFTk9UTkFNLCAiTm90IGEgWEVOSVggbmFtZWQgdHlwZSBmaWxlIik7CiAjZW5kaWYKICNpZmRlZiBFQUNDRVMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVBQ0NFUyIsIEVBQ0NFUywgIlBlcm1pc3Npb24gZGVuaWVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUNDRVMiLCBFQUNDRVMsICJQZXJtaXNzaW9uIGRlbmllZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFQUNDRVMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVBQ0NFUyIsIFdTQUVBQ0NFUywgIlBlcm1pc3Npb24gZGVuaWVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUNDRVMiLCBXU0FFQUNDRVMsICJQZXJtaXNzaW9uIGRlbmllZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTE5STkcKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVMTlJORyIsIEVMTlJORywgIkxpbmsgbnVtYmVyIG91dCBvZiByYW5nZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUxOUk5HIiwgRUxOUk5HLCAiTGluayBudW1iZXIgb3V0IG9mIHJhbmdlIik7CiAjZW5kaWYKICNpZmRlZiBFSUxTRVEKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTFNFUSIsIEVJTFNFUSwgIklsbGVnYWwgYnl0ZSBzZXF1ZW5jZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUlMU0VRIiwgRUlMU0VRLCAiSWxsZWdhbCBieXRlIHNlcXVlbmNlIik7CiAjZW5kaWYKICNpZmRlZiBFTk9URElSCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9URElSIiwgRU5PVERJUiwgIk5vdCBhIGRpcmVjdG9yeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVERJUiIsIEVOT1RESVIsICJOb3QgYSBkaXJlY3RvcnkiKTsKICNlbmRpZgogI2lmZGVmIEVOT1RVTklRCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9UVU5JUSIsIEVOT1RVTklRLCAiTmFtZSBub3QgdW5pcXVlIG9uIG5ldHdvcmsiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RVTklRIiwgRU5PVFVOSVEsICJOYW1lIG5vdCB1bmlxdWUgb24gbmV0d29yayIpOwogI2VuZGlmCiAjaWZkZWYgRVBFUk0KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVQRVJNIiwgRVBFUk0sICJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBFUk0iLCBFUEVSTSwgIk9wZXJhdGlvbiBub3QgcGVybWl0dGVkIik7CiAjZW5kaWYKICNpZmRlZiBFRE9NCi0JaW5zY29kZShkLCBkcywgZGUsICJFRE9NIiwgRURPTSwgIk1hdGggYXJndW1lbnQgb3V0IG9mIGRvbWFpbiBvZiBmdW5jIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFRE9NIiwgRURPTSwgIk1hdGggYXJndW1lbnQgb3V0IG9mIGRvbWFpbiBvZiBmdW5jIik7CiAjZW5kaWYKICNpZmRlZiBFWEZVTEwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVYRlVMTCIsIEVYRlVMTCwgIkV4Y2hhbmdlIGZ1bGwiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVYRlVMTCIsIEVYRlVMTCwgIkV4Y2hhbmdlIGZ1bGwiKTsKICNlbmRpZgogI2lmZGVmIEVDT05OUkVGVVNFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5SRUZVU0VEIiwgRUNPTk5SRUZVU0VELCAiQ29ubmVjdGlvbiByZWZ1c2VkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ09OTlJFRlVTRUQiLCBFQ09OTlJFRlVTRUQsICJDb25uZWN0aW9uIHJlZnVzZWQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUNPTk5SRUZVU0VECi0JaW5zY29kZShkLCBkcywgZGUsICJFQ09OTlJFRlVTRUQiLCBXU0FFQ09OTlJFRlVTRUQsICJDb25uZWN0aW9uIHJlZnVzZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OUkVGVVNFRCIsIFdTQUVDT05OUkVGVVNFRCwgIkNvbm5lY3Rpb24gcmVmdXNlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFSVNESVIKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJU0RJUiIsIEVJU0RJUiwgIklzIGEgZGlyZWN0b3J5Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSVNESVIiLCBFSVNESVIsICJJcyBhIGRpcmVjdG9yeSIpOwogI2VuZGlmCiAjaWZkZWYgRVBST1RPTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJFUFJPVE9OT1NVUFBPUlQiLCBFUFJPVE9OT1NVUFBPUlQsICJQcm90b2NvbCBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFUFJPVE9OT1NVUFBPUlQiLCBFUFJPVE9OT1NVUFBPUlQsICJQcm90b2NvbCBub3Qgc3VwcG9ydGVkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVQUk9UT05PU1VQUE9SVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPTk9TVVBQT1JUIiwgV1NBRVBST1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVBST1RPTk9TVVBQT1JUIiwgV1NBRVBST1RPTk9TVVBQT1JULCAiUHJvdG9jb2wgbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFUk9GUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVJPRlMiLCBFUk9GUywgIlJlYWQtb25seSBmaWxlIHN5c3RlbSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVJPRlMiLCBFUk9GUywgIlJlYWQtb25seSBmaWxlIHN5c3RlbSIpOwogI2VuZGlmCiAjaWZkZWYgRUFERFJOT1RBVkFJTAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFERFJOT1RBVkFJTCIsIEVBRERSTk9UQVZBSUwsICJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUREUk5PVEFWQUlMIiwgRUFERFJOT1RBVkFJTCwgIkNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUFERFJOT1RBVkFJTAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUFERFJOT1RBVkFJTCIsIFdTQUVBRERSTk9UQVZBSUwsICJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQUREUk5PVEFWQUlMIiwgV1NBRUFERFJOT1RBVkFJTCwgIkNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRUlEUk0KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJRFJNIiwgRUlEUk0sICJJZGVudGlmaWVyIHJlbW92ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJRFJNIiwgRUlEUk0sICJJZGVudGlmaWVyIHJlbW92ZWQiKTsKICNlbmRpZgogI2lmZGVmIEVDT01NCi0JaW5zY29kZShkLCBkcywgZGUsICJFQ09NTSIsIEVDT01NLCAiQ29tbXVuaWNhdGlvbiBlcnJvciBvbiBzZW5kIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ09NTSIsIEVDT01NLCAiQ29tbXVuaWNhdGlvbiBlcnJvciBvbiBzZW5kIik7CiAjZW5kaWYKICNpZmRlZiBFU1JNTlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVTUk1OVCIsIEVTUk1OVCwgIlNybW91bnQgZXJyb3IiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVTUk1OVCIsIEVTUk1OVCwgIlNybW91bnQgZXJyb3IiKTsKICNlbmRpZgogI2lmZGVmIEVSRU1PVEVJTwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVJFTU9URUlPIiwgRVJFTU9URUlPLCAiUmVtb3RlIEkvTyBlcnJvciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVJFTU9URUlPIiwgRVJFTU9URUlPLCAiUmVtb3RlIEkvTyBlcnJvciIpOwogI2VuZGlmCiAjaWZkZWYgRUwzUlNUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTDNSU1QiLCBFTDNSU1QsICJMZXZlbCAzIHJlc2V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTDNSU1QiLCBFTDNSU1QsICJMZXZlbCAzIHJlc2V0Iik7CiAjZW5kaWYKICNpZmRlZiBFQkFETVNHCi0JaW5zY29kZShkLCBkcywgZGUsICJFQkFETVNHIiwgRUJBRE1TRywgIk5vdCBhIGRhdGEgbWVzc2FnZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUJBRE1TRyIsIEVCQURNU0csICJOb3QgYSBkYXRhIG1lc3NhZ2UiKTsKICNlbmRpZgogI2lmZGVmIEVORklMRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5GSUxFIiwgRU5GSUxFLCAiRmlsZSB0YWJsZSBvdmVyZmxvdyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5GSUxFIiwgRU5GSUxFLCAiRmlsZSB0YWJsZSBvdmVyZmxvdyIpOwogI2VuZGlmCiAjaWZkZWYgRUxJQk1BWAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUxJQk1BWCIsIEVMSUJNQVgsICJBdHRlbXB0aW5nIHRvIGxpbmsgaW4gdG9vIG1hbnkgc2hhcmVkIGxpYnJhcmllcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUxJQk1BWCIsIEVMSUJNQVgsICJBdHRlbXB0aW5nIHRvIGxpbmsgaW4gdG9vIG1hbnkgc2hhcmVkIGxpYnJhcmllcyIpOwogI2VuZGlmCiAjaWZkZWYgRVNQSVBFCi0JaW5zY29kZShkLCBkcywgZGUsICJFU1BJUEUiLCBFU1BJUEUsICJJbGxlZ2FsIHNlZWsiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVTUElQRSIsIEVTUElQRSwgIklsbGVnYWwgc2VlayIpOwogI2VuZGlmCiAjaWZkZWYgRU5PTElOSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PTElOSyIsIEVOT0xJTkssICJMaW5rIGhhcyBiZWVuIHNldmVyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT0xJTksiLCBFTk9MSU5LLCAiTGluayBoYXMgYmVlbiBzZXZlcmVkIik7CiAjZW5kaWYKICNpZmRlZiBFTkVUUkVTRVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVORVRSRVNFVCIsIEVORVRSRVNFVCwgIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgcmVzZXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVORVRSRVNFVCIsIEVORVRSRVNFVCwgIk5ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIGJlY2F1c2Ugb2YgcmVzZXQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU5FVFJFU0VUCi0JaW5zY29kZShkLCBkcywgZGUsICJFTkVUUkVTRVQiLCBXU0FFTkVUUkVTRVQsICJOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkVUUkVTRVQiLCBXU0FFTkVUUkVTRVQsICJOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0Iik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVUSU1FRE9VVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVRJTUVET1VUIiwgRVRJTUVET1VULCAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVUSU1FRE9VVCIsIEVUSU1FRE9VVCwgIkNvbm5lY3Rpb24gdGltZWQgb3V0Iik7CiAjZWxzZQogI2lmZGVmIFdTQUVUSU1FRE9VVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVRJTUVET1VUIiwgV1NBRVRJTUVET1VULCAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVUSU1FRE9VVCIsIFdTQUVUSU1FRE9VVCwgIkNvbm5lY3Rpb24gdGltZWQgb3V0Iik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT0VOVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PRU5UIiwgRU5PRU5ULCAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PRU5UIiwgRU5PRU5ULCAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOwogI2VuZGlmCiAjaWZkZWYgRUVYSVNUCi0JaW5zY29kZShkLCBkcywgZGUsICJFRVhJU1QiLCBFRVhJU1QsICJGaWxlIGV4aXN0cyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUVYSVNUIiwgRUVYSVNULCAiRmlsZSBleGlzdHMiKTsKICNlbmRpZgogI2lmZGVmIEVEUVVPVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRURRVU9UIiwgRURRVU9ULCAiUXVvdGEgZXhjZWVkZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVEUVVPVCIsIEVEUVVPVCwgIlF1b3RhIGV4Y2VlZGVkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVEUVVPVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRURRVU9UIiwgV1NBRURRVU9ULCAiUXVvdGEgZXhjZWVkZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVEUVVPVCIsIFdTQUVEUVVPVCwgIlF1b3RhIGV4Y2VlZGVkIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOT1NUUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PU1RSIiwgRU5PU1RSLCAiRGV2aWNlIG5vdCBhIHN0cmVhbSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PU1RSIiwgRU5PU1RSLCAiRGV2aWNlIG5vdCBhIHN0cmVhbSIpOwogI2VuZGlmCiAjaWZkZWYgRUJBRFNMVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUJBRFNMVCIsIEVCQURTTFQsICJJbnZhbGlkIHNsb3QiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVCQURTTFQiLCBFQkFEU0xULCAiSW52YWxpZCBzbG90Iik7CiAjZW5kaWYKICNpZmRlZiBFQkFEUlFDCi0JaW5zY29kZShkLCBkcywgZGUsICJFQkFEUlFDIiwgRUJBRFJRQywgIkludmFsaWQgcmVxdWVzdCBjb2RlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQkFEUlFDIiwgRUJBRFJRQywgIkludmFsaWQgcmVxdWVzdCBjb2RlIik7CiAjZW5kaWYKICNpZmRlZiBFTElCQUNDCi0JaW5zY29kZShkLCBkcywgZGUsICJFTElCQUNDIiwgRUxJQkFDQywgIkNhbiBub3QgYWNjZXNzIGEgbmVlZGVkIHNoYXJlZCBsaWJyYXJ5Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTElCQUNDIiwgRUxJQkFDQywgIkNhbiBub3QgYWNjZXNzIGEgbmVlZGVkIHNoYXJlZCBsaWJyYXJ5Iik7CiAjZW5kaWYKICNpZmRlZiBFRkFVTFQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVGQVVMVCIsIEVGQVVMVCwgIkJhZCBhZGRyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFRkFVTFQiLCBFRkFVTFQsICJCYWQgYWRkcmVzcyIpOwogI2Vsc2UKICNpZmRlZiBXU0FFRkFVTFQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVGQVVMVCIsIFdTQUVGQVVMVCwgIkJhZCBhZGRyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFRkFVTFQiLCBXU0FFRkFVTFQsICJCYWQgYWRkcmVzcyIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFRkJJRwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUZCSUciLCBFRkJJRywgIkZpbGUgdG9vIGxhcmdlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFRkJJRyIsIEVGQklHLCAiRmlsZSB0b28gbGFyZ2UiKTsKICNlbmRpZgogI2lmZGVmIEVERUFETEsKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVERUFETEsiLCBFREVBRExLLCAiUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVERUFETEsiLCBFREVBRExLLCAiUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIiKTsKICNlbmRpZgogI2lmZGVmIEVOT1RDT05OCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9UQ09OTiIsIEVOT1RDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVOT1RDT05OIiwgRU5PVENPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgbm90IGNvbm5lY3RlZCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTk9UQ09OTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVENPTk4iLCBXU0FFTk9UQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9UQ09OTiIsIFdTQUVOT1RDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRURFU1RBRERSUkVRCi0JaW5zY29kZShkLCBkcywgZGUsICJFREVTVEFERFJSRVEiLCBFREVTVEFERFJSRVEsICJEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFREVTVEFERFJSRVEiLCBFREVTVEFERFJSRVEsICJEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkIik7CiAjZWxzZQogI2lmZGVmIFdTQUVERVNUQUREUlJFUQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRURFU1RBRERSUkVRIiwgV1NBRURFU1RBRERSUkVRLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRURFU1RBRERSUkVRIiwgV1NBRURFU1RBRERSUkVRLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTElCU0NOCi0JaW5zY29kZShkLCBkcywgZGUsICJFTElCU0NOIiwgRUxJQlNDTiwgIi5saWIgc2VjdGlvbiBpbiBhLm91dCBjb3JydXB0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJTQ04iLCBFTElCU0NOLCAiLmxpYiBzZWN0aW9uIGluIGEub3V0IGNvcnJ1cHRlZCIpOwogI2VuZGlmCiAjaWZkZWYgRU5PTENLCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9MQ0siLCBFTk9MQ0ssICJObyByZWNvcmQgbG9ja3MgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9MQ0siLCBFTk9MQ0ssICJObyByZWNvcmQgbG9ja3MgYXZhaWxhYmxlIik7CiAjZW5kaWYKICNpZmRlZiBFSVNOQU0KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJU05BTSIsIEVJU05BTSwgIklzIGEgbmFtZWQgdHlwZSBmaWxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSVNOQU0iLCBFSVNOQU0sICJJcyBhIG5hbWVkIHR5cGUgZmlsZSIpOwogI2VuZGlmCiAjaWZkZWYgRUNPTk5BQk9SVEVECi0JaW5zY29kZShkLCBkcywgZGUsICJFQ09OTkFCT1JURUQiLCBFQ09OTkFCT1JURUQsICJTb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5BQk9SVEVEIiwgRUNPTk5BQk9SVEVELCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRUNPTk5BQk9SVEVECi0JaW5zY29kZShkLCBkcywgZGUsICJFQ09OTkFCT1JURUQiLCBXU0FFQ09OTkFCT1JURUQsICJTb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5BQk9SVEVEIiwgV1NBRUNPTk5BQk9SVEVELCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5FVFVOUkVBQ0gKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVORVRVTlJFQUNIIiwgRU5FVFVOUkVBQ0gsICJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkVUVU5SRUFDSCIsIEVORVRVTlJFQUNILCAiTmV0d29yayBpcyB1bnJlYWNoYWJsZSIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTkVUVU5SRUFDSAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5FVFVOUkVBQ0giLCBXU0FFTkVUVU5SRUFDSCwgIk5ldHdvcmsgaXMgdW5yZWFjaGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVORVRVTlJFQUNIIiwgV1NBRU5FVFVOUkVBQ0gsICJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVTVEFMRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVNUQUxFIiwgRVNUQUxFLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU1RBTEUiLCBFU1RBTEUsICJTdGFsZSBORlMgZmlsZSBoYW5kbGUiKTsKICNlbHNlCiAjaWZkZWYgV1NBRVNUQUxFCi0JaW5zY29kZShkLCBkcywgZGUsICJFU1RBTEUiLCBXU0FFU1RBTEUsICJTdGFsZSBORlMgZmlsZSBoYW5kbGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVTVEFMRSIsIFdTQUVTVEFMRSwgIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFTk9TUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PU1IiLCBFTk9TUiwgIk91dCBvZiBzdHJlYW1zIHJlc291cmNlcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PU1IiLCBFTk9TUiwgIk91dCBvZiBzdHJlYW1zIHJlc291cmNlcyIpOwogI2VuZGlmCiAjaWZkZWYgRU5PTUVNCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9NRU0iLCBFTk9NRU0sICJPdXQgb2YgbWVtb3J5Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9NRU0iLCBFTk9NRU0sICJPdXQgb2YgbWVtb3J5Iik7CiAjZW5kaWYKICNpZmRlZiBFTk9UU09DSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVFNPQ0siLCBFTk9UU09DSywgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVFNPQ0siLCBFTk9UU09DSywgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTk9UU09DSwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVFNPQ0siLCBXU0FFTk9UU09DSywgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5PVFNPQ0siLCBXU0FFTk9UU09DSywgIlNvY2tldCBvcGVyYXRpb24gb24gbm9uLXNvY2tldCIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFU1RSUElQRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVNUUlBJUEUiLCBFU1RSUElQRSwgIlN0cmVhbXMgcGlwZSBlcnJvciIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVNUUlBJUEUiLCBFU1RSUElQRSwgIlN0cmVhbXMgcGlwZSBlcnJvciIpOwogI2VuZGlmCiAjaWZkZWYgRU1MSU5LCi0JaW5zY29kZShkLCBkcywgZGUsICJFTUxJTksiLCBFTUxJTkssICJUb28gbWFueSBsaW5rcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU1MSU5LIiwgRU1MSU5LLCAiVG9vIG1hbnkgbGlua3MiKTsKICNlbmRpZgogI2lmZGVmIEVSQU5HRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVJBTkdFIiwgRVJBTkdFLCAiTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVSQU5HRSIsIEVSQU5HRSwgIk1hdGggcmVzdWx0IG5vdCByZXByZXNlbnRhYmxlIik7CiAjZW5kaWYKICNpZmRlZiBFTElCRVhFQwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUxJQkVYRUMiLCBFTElCRVhFQywgIkNhbm5vdCBleGVjIGEgc2hhcmVkIGxpYnJhcnkgZGlyZWN0bHkiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVMSUJFWEVDIiwgRUxJQkVYRUMsICJDYW5ub3QgZXhlYyBhIHNoYXJlZCBsaWJyYXJ5IGRpcmVjdGx5Iik7CiAjZW5kaWYKICNpZmRlZiBFTDNITFQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVMM0hMVCIsIEVMM0hMVCwgIkxldmVsIDMgaGFsdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTDNITFQiLCBFTDNITFQsICJMZXZlbCAzIGhhbHRlZCIpOwogI2VuZGlmCiAjaWZkZWYgRUNPTk5SRVNFVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUNPTk5SRVNFVCIsIEVDT05OUkVTRVQsICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OUkVTRVQiLCBFQ09OTlJFU0VULCAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIik7CiAjZWxzZQogI2lmZGVmIFdTQUVDT05OUkVTRVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVDT05OUkVTRVQiLCBXU0FFQ09OTlJFU0VULCAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFQ09OTlJFU0VUIiwgV1NBRUNPTk5SRVNFVCwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFQUREUklOVVNFCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUREUklOVVNFIiwgRUFERFJJTlVTRSwgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVBRERSSU5VU0UiLCBFQUREUklOVVNFLCAiQWRkcmVzcyBhbHJlYWR5IGluIHVzZSIpOwogI2Vsc2UKICNpZmRlZiBXU0FFQUREUklOVVNFCi0JaW5zY29kZShkLCBkcywgZGUsICJFQUREUklOVVNFIiwgV1NBRUFERFJJTlVTRSwgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVBRERSSU5VU0UiLCBXU0FFQUREUklOVVNFLCAiQWRkcmVzcyBhbHJlYWR5IGluIHVzZSIpOwogI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBFT1BOT1RTVVBQCi0JaW5zY29kZShkLCBkcywgZGUsICJFT1BOT1RTVVBQIiwgRU9QTk9UU1VQUCwgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRyYW5zcG9ydCBlbmRwb2ludCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU9QTk9UU1VQUCIsIEVPUE5PVFNVUFAsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0cmFuc3BvcnQgZW5kcG9pbnQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRU9QTk9UU1VQUAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU9QTk9UU1VQUCIsIFdTQUVPUE5PVFNVUFAsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0cmFuc3BvcnQgZW5kcG9pbnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVPUE5PVFNVUFAiLCBXU0FFT1BOT1RTVVBQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50Iik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVSRU1DSEcKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRU1DSEciLCBFUkVNQ0hHLCAiUmVtb3RlIGFkZHJlc3MgY2hhbmdlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVJFTUNIRyIsIEVSRU1DSEcsICJSZW1vdGUgYWRkcmVzcyBjaGFuZ2VkIik7CiAjZW5kaWYKICNpZmRlZiBFQUdBSU4KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVBR0FJTiIsIEVBR0FJTiwgIlRyeSBhZ2FpbiIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRUFHQUlOIiwgRUFHQUlOLCAiVHJ5IGFnYWluIik7CiAjZW5kaWYKICNpZmRlZiBFTkFNRVRPT0xPTkcKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVOQU1FVE9PTE9ORyIsIEVOQU1FVE9PTE9ORywgIkZpbGUgbmFtZSB0b28gbG9uZyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5BTUVUT09MT05HIiwgRU5BTUVUT09MT05HLCAiRmlsZSBuYW1lIHRvbyBsb25nIik7CiAjZWxzZQogI2lmZGVmIFdTQUVOQU1FVE9PTE9ORwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5BTUVUT09MT05HIiwgV1NBRU5BTUVUT09MT05HLCAiRmlsZSBuYW1lIHRvbyBsb25nIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTkFNRVRPT0xPTkciLCBXU0FFTkFNRVRPT0xPTkcsICJGaWxlIG5hbWUgdG9vIGxvbmciKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRU5PVFRZCi0JaW5zY29kZShkLCBkcywgZGUsICJFTk9UVFkiLCBFTk9UVFksICJOb3QgYSB0eXBld3JpdGVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9UVFkiLCBFTk9UVFksICJOb3QgYSB0eXBld3JpdGVyIik7CiAjZW5kaWYKICNpZmRlZiBFUkVTVEFSVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVJFU1RBUlQiLCBFUkVTVEFSVCwgIkludGVycnVwdGVkIHN5c3RlbSBjYWxsIHNob3VsZCBiZSByZXN0YXJ0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVSRVNUQVJUIiwgRVJFU1RBUlQsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCBzaG91bGQgYmUgcmVzdGFydGVkIik7CiAjZW5kaWYKICNpZmRlZiBFU09DS1ROT1NVUFBPUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVTT0NLVE5PU1VQUE9SVCIsIEVTT0NLVE5PU1VQUE9SVCwgIlNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVTT0NLVE5PU1VQUE9SVCIsIEVTT0NLVE5PU1VQUE9SVCwgIlNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKICNlbHNlCiAjaWZkZWYgV1NBRVNPQ0tUTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJFU09DS1ROT1NVUFBPUlQiLCBXU0FFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFU09DS1ROT1NVUFBPUlQiLCBXU0FFU09DS1ROT1NVUFBPUlQsICJTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVUSU1FCi0JaW5zY29kZShkLCBkcywgZGUsICJFVElNRSIsIEVUSU1FLCAiVGltZXIgZXhwaXJlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVRJTUUiLCBFVElNRSwgIlRpbWVyIGV4cGlyZWQiKTsKICNlbmRpZgogI2lmZGVmIEVCRk9OVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUJGT05UIiwgRUJGT05ULCAiQmFkIGZvbnQgZmlsZSBmb3JtYXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVCRk9OVCIsIEVCRk9OVCwgIkJhZCBmb250IGZpbGUgZm9ybWF0Iik7CiAjZW5kaWYKICNpZmRlZiBFREVBRExPQ0sKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVERUFETE9DSyIsIEVERUFETE9DSywgIkVycm9yIEVERUFETE9DSyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRURFQURMT0NLIiwgRURFQURMT0NLLCAiRXJyb3IgRURFQURMT0NLIik7CiAjZW5kaWYKICNpZmRlZiBFVE9PTUFOWVJFRlMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVUT09NQU5ZUkVGUyIsIEVUT09NQU5ZUkVGUywgIlRvbyBtYW55IHJlZmVyZW5jZXM6IGNhbm5vdCBzcGxpY2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVUT09NQU5ZUkVGUyIsIEVUT09NQU5ZUkVGUywgIlRvbyBtYW55IHJlZmVyZW5jZXM6IGNhbm5vdCBzcGxpY2UiKTsKICNlbHNlCiAjaWZkZWYgV1NBRVRPT01BTllSRUZTCi0JaW5zY29kZShkLCBkcywgZGUsICJFVE9PTUFOWVJFRlMiLCBXU0FFVE9PTUFOWVJFRlMsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFVE9PTUFOWVJFRlMiLCBXU0FFVE9PTUFOWVJFRlMsICJUb28gbWFueSByZWZlcmVuY2VzOiBjYW5ub3Qgc3BsaWNlIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVNRklMRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU1GSUxFIiwgRU1GSUxFLCAiVG9vIG1hbnkgb3BlbiBmaWxlcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU1GSUxFIiwgRU1GSUxFLCAiVG9vIG1hbnkgb3BlbiBmaWxlcyIpOwogI2Vsc2UKICNpZmRlZiBXU0FFTUZJTEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVNRklMRSIsIFdTQUVNRklMRSwgIlRvbyBtYW55IG9wZW4gZmlsZXMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVNRklMRSIsIFdTQUVNRklMRSwgIlRvbyBtYW55IG9wZW4gZmlsZXMiKTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgRVRYVEJTWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiRVRYVEJTWSIsIEVUWFRCU1ksICJUZXh0IGZpbGUgYnVzeSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRVRYVEJTWSIsIEVUWFRCU1ksICJUZXh0IGZpbGUgYnVzeSIpOwogI2VuZGlmCiAjaWZkZWYgRUlOUFJPR1JFU1MKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlBST0dSRVNTIiwgRUlOUFJPR1JFU1MsICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFSU5QUk9HUkVTUyIsIEVJTlBST0dSRVNTLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpOwogI2Vsc2UKICNpZmRlZiBXU0FFSU5QUk9HUkVTUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRUlOUFJPR1JFU1MiLCBXU0FFSU5QUk9HUkVTUywgIk9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIkVJTlBST0dSRVNTIiwgV1NBRUlOUFJPR1JFU1MsICJPcGVyYXRpb24gbm93IGluIHByb2dyZXNzIik7CiAjZW5kaWYKICNlbmRpZgogI2lmZGVmIEVOWElPCi0JaW5zY29kZShkLCBkcywgZGUsICJFTlhJTyIsIEVOWElPLCAiTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiRU5YSU8iLCBFTlhJTywgIk5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MiKTsKICNlbmRpZgogI2lmZGVmIEVOT1BLRwotCWluc2NvZGUoZCwgZHMsIGRlLCAiRU5PUEtHIiwgRU5PUEtHLCAiUGFja2FnZSBub3QgaW5zdGFsbGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJFTk9QS0ciLCBFTk9QS0csICJQYWNrYWdlIG5vdCBpbnN0YWxsZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQVNZCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FTWSIsIFdTQVNZLCAiRXJyb3IgV1NBU1kiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQVNZIiwgV1NBU1ksICJFcnJvciBXU0FTWSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUhPU1RET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFSE9TVERPV04iLCBXU0FFSE9TVERPV04sICJIb3N0IGlzIGRvd24iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVIT1NURE9XTiIsIFdTQUVIT1NURE9XTiwgIkhvc3QgaXMgZG93biIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU5FVERPV04KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVORVRET1dOIiwgV1NBRU5FVERPV04sICJOZXR3b3JrIGlzIGRvd24iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVORVRET1dOIiwgV1NBRU5FVERPV04sICJOZXR3b3JrIGlzIGRvd24iKTsKICNlbmRpZgogI2lmZGVmIFdTQUVOT1RTT0NLCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTk9UU09DSyIsIFdTQUVOT1RTT0NLLCAiU29ja2V0IG9wZXJhdGlvbiBvbiBub24tc29ja2V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTk9UU09DSyIsIFdTQUVOT1RTT0NLLCAiU29ja2V0IG9wZXJhdGlvbiBvbiBub24tc29ja2V0Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FFSE9TVFVOUkVBQ0gKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVIT1NUVU5SRUFDSCIsIFdTQUVIT1NUVU5SRUFDSCwgIk5vIHJvdXRlIHRvIGhvc3QiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVIT1NUVU5SRUFDSCIsIFdTQUVIT1NUVU5SRUFDSCwgIk5vIHJvdXRlIHRvIGhvc3QiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVMT09QCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTE9PUCIsIFdTQUVMT09QLCAiVG9vIG1hbnkgc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVMT09QIiwgV1NBRUxPT1AsICJUb28gbWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU1GSUxFCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTUZJTEUiLCBXU0FFTUZJTEUsICJUb28gbWFueSBvcGVuIGZpbGVzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTUZJTEUiLCBXU0FFTUZJTEUsICJUb28gbWFueSBvcGVuIGZpbGVzIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFU1RBTEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVTVEFMRSIsIFdTQUVTVEFMRSwgIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVNUQUxFIiwgV1NBRVNUQUxFLCAiU3RhbGUgTkZTIGZpbGUgaGFuZGxlIik7CiAjZW5kaWYKICNpZmRlZiBXU0FWRVJOT1RTVVBQT1JURUQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQVZFUk5PVFNVUFBPUlRFRCIsIFdTQVZFUk5PVFNVUFBPUlRFRCwgIkVycm9yIFdTQVZFUk5PVFNVUFBPUlRFRCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBVkVSTk9UU1VQUE9SVEVEIiwgV1NBVkVSTk9UU1VQUE9SVEVELCAiRXJyb3IgV1NBVkVSTk9UU1VQUE9SVEVEIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTkVUVU5SRUFDSAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5FVFVOUkVBQ0giLCBXU0FFTkVUVU5SRUFDSCwgIk5ldHdvcmsgaXMgdW5yZWFjaGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVORVRVTlJFQUNIIiwgV1NBRU5FVFVOUkVBQ0gsICJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFUFJPQ0xJTQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVBST0NMSU0iLCBXU0FFUFJPQ0xJTSwgIkVycm9yIFdTQUVQUk9DTElNIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFUFJPQ0xJTSIsIFdTQUVQUk9DTElNLCAiRXJyb3IgV1NBRVBST0NMSU0iKTsKICNlbmRpZgogI2lmZGVmIFdTQUVGQVVMVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUZBVUxUIiwgV1NBRUZBVUxULCAiQmFkIGFkZHJlc3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVGQVVMVCIsIFdTQUVGQVVMVCwgIkJhZCBhZGRyZXNzIik7CiAjZW5kaWYKICNpZmRlZiBXU0FOT1RJTklUSUFMSVNFRAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBTk9USU5JVElBTElTRUQiLCBXU0FOT1RJTklUSUFMSVNFRCwgIkVycm9yIFdTQU5PVElOSVRJQUxJU0VEIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FOT1RJTklUSUFMSVNFRCIsIFdTQU5PVElOSVRJQUxJU0VELCAiRXJyb3IgV1NBTk9USU5JVElBTElTRUQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVVU0VSUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVVTRVJTIiwgV1NBRVVTRVJTLCAiVG9vIG1hbnkgdXNlcnMiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVVU0VSUyIsIFdTQUVVU0VSUywgIlRvbyBtYW55IHVzZXJzIik7CiAjZW5kaWYKICNpZmRlZiBXU0FNQUtFQVNZTkNSRVBMCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FNQUtFQVNZTkNSRVBMIiwgV1NBTUFLRUFTWU5DUkVQTCwgIkVycm9yIFdTQU1BS0VBU1lOQ1JFUEwiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQU1BS0VBU1lOQ1JFUEwiLCBXU0FNQUtFQVNZTkNSRVBMLCAiRXJyb3IgV1NBTUFLRUFTWU5DUkVQTCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU5PUFJPVE9PUFQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVOT1BST1RPT1BUIiwgV1NBRU5PUFJPVE9PUFQsICJQcm90b2NvbCBub3QgYXZhaWxhYmxlIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTk9QUk9UT09QVCIsIFdTQUVOT1BST1RPT1BULCAiUHJvdG9jb2wgbm90IGF2YWlsYWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUNPTk5BQk9SVEVECi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFQ09OTkFCT1JURUQiLCBXU0FFQ09OTkFCT1JURUQsICJTb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUNPTk5BQk9SVEVEIiwgV1NBRUNPTk5BQk9SVEVELCAiU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVOQU1FVE9PTE9ORwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5BTUVUT09MT05HIiwgV1NBRU5BTUVUT09MT05HLCAiRmlsZSBuYW1lIHRvbyBsb25nIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTkFNRVRPT0xPTkciLCBXU0FFTkFNRVRPT0xPTkcsICJGaWxlIG5hbWUgdG9vIGxvbmciKTsKICNlbmRpZgogI2lmZGVmIFdTQUVOT1RFTVBUWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PVEVNUFRZIiwgV1NBRU5PVEVNUFRZLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PVEVNUFRZIiwgV1NBRU5PVEVNUFRZLCAiRGlyZWN0b3J5IG5vdCBlbXB0eSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVNIVVRET1dOCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFU0hVVERPV04iLCBXU0FFU0hVVERPV04sICJDYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVTSFVURE9XTiIsIFdTQUVTSFVURE9XTiwgIkNhbm5vdCBzZW5kIGFmdGVyIHRyYW5zcG9ydCBlbmRwb2ludCBzaHV0ZG93biIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUFGTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUZOT1NVUFBPUlQiLCBXU0FFQUZOT1NVUFBPUlQsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUZOT1NVUFBPUlQiLCBXU0FFQUZOT1NVUFBPUlQsICJBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFVE9PTUFOWVJFRlMKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVUT09NQU5ZUkVGUyIsIFdTQUVUT09NQU5ZUkVGUywgIlRvbyBtYW55IHJlZmVyZW5jZXM6IGNhbm5vdCBzcGxpY2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVUT09NQU5ZUkVGUyIsIFdTQUVUT09NQU5ZUkVGUywgIlRvbyBtYW55IHJlZmVyZW5jZXM6IGNhbm5vdCBzcGxpY2UiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVBQ0NFUwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFDQ0VTIiwgV1NBRUFDQ0VTLCAiUGVybWlzc2lvbiBkZW5pZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVBQ0NFUyIsIFdTQUVBQ0NFUywgIlBlcm1pc3Npb24gZGVuaWVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FUUgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBVFIiLCBXU0FUUiwgIkVycm9yIFdTQVRSIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FUUiIsIFdTQVRSLCAiRXJyb3IgV1NBVFIiKTsKICNlbmRpZgogI2lmZGVmIFdTQUJBU0VFUlIKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUJBU0VFUlIiLCBXU0FCQVNFRVJSLCAiRXJyb3IgV1NBQkFTRUVSUiIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBQkFTRUVSUiIsIFdTQUJBU0VFUlIsICJFcnJvciBXU0FCQVNFRVJSIik7CiAjZW5kaWYKICNpZmRlZiBXU0FERVNDUklQVElPCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FERVNDUklQVElPIiwgV1NBREVTQ1JJUFRJTywgIkVycm9yIFdTQURFU0NSSVBUSU8iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQURFU0NSSVBUSU8iLCBXU0FERVNDUklQVElPLCAiRXJyb3IgV1NBREVTQ1JJUFRJTyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU1TR1NJWkUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVNU0dTSVpFIiwgV1NBRU1TR1NJWkUsICJNZXNzYWdlIHRvbyBsb25nIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTVNHU0laRSIsIFdTQUVNU0dTSVpFLCAiTWVzc2FnZSB0b28gbG9uZyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUJBREYKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVCQURGIiwgV1NBRUJBREYsICJCYWQgZmlsZSBudW1iZXIiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVCQURGIiwgV1NBRUJBREYsICJCYWQgZmlsZSBudW1iZXIiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVDT05OUkVTRVQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVDT05OUkVTRVQiLCBXU0FFQ09OTlJFU0VULCAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQ09OTlJFU0VUIiwgV1NBRUNPTk5SRVNFVCwgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIpOwogI2VuZGlmCiAjaWZkZWYgV1NBR0VUU0VMRUNURVJSTwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBR0VUU0VMRUNURVJSTyIsIFdTQUdFVFNFTEVDVEVSUk8sICJFcnJvciBXU0FHRVRTRUxFQ1RFUlJPIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FHRVRTRUxFQ1RFUlJPIiwgV1NBR0VUU0VMRUNURVJSTywgIkVycm9yIFdTQUdFVFNFTEVDVEVSUk8iKTsKICNlbmRpZgogI2lmZGVmIFdTQUVUSU1FRE9VVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVRJTUVET1VUIiwgV1NBRVRJTUVET1VULCAiQ29ubmVjdGlvbiB0aW1lZCBvdXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVUSU1FRE9VVCIsIFdTQUVUSU1FRE9VVCwgIkNvbm5lY3Rpb24gdGltZWQgb3V0Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTk9CVUZTCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTk9CVUZTIiwgV1NBRU5PQlVGUywgIk5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVOT0JVRlMiLCBXU0FFTk9CVUZTLCAiTm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRURJU0NPTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRURJU0NPTiIsIFdTQUVESVNDT04sICJFcnJvciBXU0FFRElTQ09OIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFRElTQ09OIiwgV1NBRURJU0NPTiwgIkVycm9yIFdTQUVESVNDT04iKTsKICNlbmRpZgogI2lmZGVmIFdTQUVJTlRSCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFSU5UUiIsIFdTQUVJTlRSLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVJTlRSIiwgV1NBRUlOVFIsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVBST1RPVFlQRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVBST1RPVFlQRSIsIFdTQUVQUk9UT1RZUEUsICJQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVQUk9UT1RZUEUiLCBXU0FFUFJPVE9UWVBFLCAiUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FIT1MKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUhPUyIsIFdTQUhPUywgIkVycm9yIFdTQUhPUyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBSE9TIiwgV1NBSE9TLCAiRXJyb3IgV1NBSE9TIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFQUREUklOVVNFCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUREUklOVVNFIiwgV1NBRUFERFJJTlVTRSwgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVBRERSSU5VU0UiLCBXU0FFQUREUklOVVNFLCAiQWRkcmVzcyBhbHJlYWR5IGluIHVzZSIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUFERFJOT1RBVkFJTAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUFERFJOT1RBVkFJTCIsIFdTQUVBRERSTk9UQVZBSUwsICJDYW5ub3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUREUk5PVEFWQUlMIiwgV1NBRUFERFJOT1RBVkFJTCwgIkNhbm5vdCBhc3NpZ24gcmVxdWVzdGVkIGFkZHJlc3MiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVBTFJFQURZCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFQUxSRUFEWSIsIFdTQUVBTFJFQURZLCAiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVBTFJFQURZIiwgV1NBRUFMUkVBRFksICJPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcyIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRVBST1RPTk9TVVBQT1JUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFUFJPVE9OT1NVUFBPUlQiLCBXU0FFUFJPVE9OT1NVUFBPUlQsICJQcm90b2NvbCBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFUFJPVE9OT1NVUFBPUlQiLCBXU0FFUFJPVE9OT1NVUFBPUlQsICJQcm90b2NvbCBub3Qgc3VwcG9ydGVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FTWVNOT1RSRUFEWQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBU1lTTk9UUkVBRFkiLCBXU0FTWVNOT1RSRUFEWSwgIkVycm9yIFdTQVNZU05PVFJFQURZIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FTWVNOT1RSRUFEWSIsIFdTQVNZU05PVFJFQURZLCAiRXJyb3IgV1NBU1lTTk9UUkVBRFkiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVXT1VMREJMT0NLCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFV09VTERCTE9DSyIsIFdTQUVXT1VMREJMT0NLLCAiT3BlcmF0aW9uIHdvdWxkIGJsb2NrIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFV09VTERCTE9DSyIsIFdTQUVXT1VMREJMT0NLLCAiT3BlcmF0aW9uIHdvdWxkIGJsb2NrIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFUEZOT1NVUFBPUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVQRk5PU1VQUE9SVCIsIFdTQUVQRk5PU1VQUE9SVCwgIlByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFUEZOT1NVUFBPUlQiLCBXU0FFUEZOT1NVUFBPUlQsICJQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU9QTk9UU1VQUAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU9QTk9UU1VQUCIsIFdTQUVPUE5PVFNVUFAsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBvbiB0cmFuc3BvcnQgZW5kcG9pbnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVPUE5PVFNVUFAiLCBXU0FFT1BOT1RTVVBQLCAiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdHJhbnNwb3J0IGVuZHBvaW50Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FFSVNDT05OCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFSVNDT05OIiwgV1NBRUlTQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUlTQ09OTiIsIFdTQUVJU0NPTk4sICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVEUVVPVAotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRURRVU9UIiwgV1NBRURRVU9ULCAiUXVvdGEgZXhjZWVkZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVEUVVPVCIsIFdTQUVEUVVPVCwgIlF1b3RhIGV4Y2VlZGVkIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFTk9UQ09OTgotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRU5PVENPTk4iLCBXU0FFTk9UQ09OTiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTk9UQ09OTiIsIFdTQUVOT1RDT05OLCAiVHJhbnNwb3J0IGVuZHBvaW50IGlzIG5vdCBjb25uZWN0ZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVSRU1PVEUKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVSRU1PVEUiLCBXU0FFUkVNT1RFLCAiT2JqZWN0IGlzIHJlbW90ZSIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRVJFTU9URSIsIFdTQUVSRU1PVEUsICJPYmplY3QgaXMgcmVtb3RlIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFSU5WQUwKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVJTlZBTCIsIFdTQUVJTlZBTCwgIkludmFsaWQgYXJndW1lbnQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVJTlZBTCIsIFdTQUVJTlZBTCwgIkludmFsaWQgYXJndW1lbnQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVJTlBST0dSRVNTCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFSU5QUk9HUkVTUyIsIFdTQUVJTlBST0dSRVNTLCAiT3BlcmF0aW9uIG5vdyBpbiBwcm9ncmVzcyIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRUlOUFJPR1JFU1MiLCBXU0FFSU5QUk9HUkVTUywgIk9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MiKTsKICNlbmRpZgogI2lmZGVmIFdTQUdFVFNFTEVDVEVWRU4KLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUdFVFNFTEVDVEVWRU4iLCBXU0FHRVRTRUxFQ1RFVkVOLCAiRXJyb3IgV1NBR0VUU0VMRUNURVZFTiIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBR0VUU0VMRUNURVZFTiIsIFdTQUdFVFNFTEVDVEVWRU4sICJFcnJvciBXU0FHRVRTRUxFQ1RFVkVOIik7CiAjZW5kaWYKICNpZmRlZiBXU0FFU09DS1ROT1NVUFBPUlQKLQlpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVTT0NLVE5PU1VQUE9SVCIsIFdTQUVTT0NLVE5PU1VQUE9SVCwgIlNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVTT0NLVE5PU1VQUE9SVCIsIFdTQUVTT0NLVE5PU1VQUE9SVCwgIlNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKICNlbmRpZgogI2lmZGVmIFdTQUdFVEFTWU5DRVJSTwotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBR0VUQVNZTkNFUlJPIiwgV1NBR0VUQVNZTkNFUlJPLCAiRXJyb3IgV1NBR0VUQVNZTkNFUlJPIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FHRVRBU1lOQ0VSUk8iLCBXU0FHRVRBU1lOQ0VSUk8sICJFcnJvciBXU0FHRVRBU1lOQ0VSUk8iKTsKICNlbmRpZgogI2lmZGVmIFdTQU1BS0VTRUxFQ1RSRVBMCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FNQUtFU0VMRUNUUkVQTCIsIFdTQU1BS0VTRUxFQ1RSRVBMLCAiRXJyb3IgV1NBTUFLRVNFTEVDVFJFUEwiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQU1BS0VTRUxFQ1RSRVBMIiwgV1NBTUFLRVNFTEVDVFJFUEwsICJFcnJvciBXU0FNQUtFU0VMRUNUUkVQTCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBR0VUQVNZTkNCVUZMRQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBR0VUQVNZTkNCVUZMRSIsIFdTQUdFVEFTWU5DQlVGTEUsICJFcnJvciBXU0FHRVRBU1lOQ0JVRkxFIik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FHRVRBU1lOQ0JVRkxFIiwgV1NBR0VUQVNZTkNCVUZMRSwgIkVycm9yIFdTQUdFVEFTWU5DQlVGTEUiKTsKICNlbmRpZgogI2lmZGVmIFdTQUVERVNUQUREUlJFUQotCWluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRURFU1RBRERSUkVRIiwgV1NBRURFU1RBRERSUkVRLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpOworICAgIGluc2NvZGUoZCwgZHMsIGRlLCAiV1NBRURFU1RBRERSUkVRIiwgV1NBRURFU1RBRERSUkVRLCAiRGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRUNPTk5SRUZVU0VECi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFQ09OTlJFRlVTRUQiLCBXU0FFQ09OTlJFRlVTRUQsICJDb25uZWN0aW9uIHJlZnVzZWQiKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQUVDT05OUkVGVVNFRCIsIFdTQUVDT05OUkVGVVNFRCwgIkNvbm5lY3Rpb24gcmVmdXNlZCIpOwogI2VuZGlmCiAjaWZkZWYgV1NBRU5FVFJFU0VUCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FFTkVUUkVTRVQiLCBXU0FFTkVUUkVTRVQsICJOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0Iik7CisgICAgaW5zY29kZShkLCBkcywgZGUsICJXU0FFTkVUUkVTRVQiLCBXU0FFTkVUUkVTRVQsICJOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0Iik7CiAjZW5kaWYKICNpZmRlZiBXU0FOCi0JaW5zY29kZShkLCBkcywgZGUsICJXU0FOIiwgV1NBTiwgIkVycm9yIFdTQU4iKTsKKyAgICBpbnNjb2RlKGQsIGRzLCBkZSwgIldTQU4iLCBXU0FOLCAiRXJyb3IgV1NBTiIpOwogI2VuZGlmCiAKLQlQeV9ERUNSRUYoZGUpOworICAgIFB5X0RFQ1JFRihkZSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMgYi9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMKaW5kZXggYTMzM2EzNC4uNjNkMDZkMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9mY250bG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZmNudGxtb2R1bGUuYwpAQCAtMjEsNyArMjEsNyBAQAogICAgIGludCBmZCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3Iob2JqZWN0KTsKIAogICAgIGlmIChmZCA8IDApCi0gICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAwOwogICAgICp0YXJnZXQgPSBmZDsKICAgICByZXR1cm4gMTsKIH0KQEAgLTMyLDQ4ICszMiw0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZjbnRsX2ZjbnRsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQ7Ci0JaW50IGNvZGU7Ci0JbG9uZyBhcmc7Ci0JaW50IHJldDsKLQljaGFyICpzdHI7Ci0JUHlfc3NpemVfdCBsZW47Ci0JY2hhciBidWZbMTAyNF07CisgICAgaW50IGZkOworICAgIGludCBjb2RlOworICAgIGxvbmcgYXJnOworICAgIGludCByZXQ7CisgICAgY2hhciAqc3RyOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGNoYXIgYnVmWzEwMjRdOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maXMjOmZjbnRsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmc3RyLCAmbGVuKSkgewotCQlpZiAobGVuID4gc2l6ZW9mIGJ1ZikgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJmY250bCBzdHJpbmcgYXJnIHRvbyBsb25nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQltZW1jcHkoYnVmLCBzdHIsIGxlbik7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJcmV0ID0gZmNudGwoZmQsIGNvZGUsIGJ1Zik7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChyZXQgPCAwKSB7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpcyM6ZmNudGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJnN0ciwgJmxlbikpIHsKKyAgICAgICAgaWYgKGxlbiA+IHNpemVvZiBidWYpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmY250bCBzdHJpbmcgYXJnIHRvbyBsb25nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmLCBzdHIsIGxlbik7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0ID0gZmNudGwoZmQsIGNvZGUsIGJ1Zik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOworICAgIH0KIAotCVB5RXJyX0NsZWFyKCk7Ci0JYXJnID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKLSAgICAgICAgICAgICAiTyZpfGw7ZmNudGwgcmVxdWlyZXMgYSBmaWxlIG9yIGZpbGUgZGVzY3JpcHRvciwiCi0gICAgICAgICAgICAgIiBhbiBpbnRlZ2VyIGFuZCBvcHRpb25hbGx5IGEgdGhpcmQgaW50ZWdlciBvciBhIHN0cmluZyIsIAotCQkJICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmYXJnKSkgewotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBmY250bChmZCwgY29kZSwgYXJnKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXQgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXQpOworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgYXJnID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICJPJml8bDtmY250bCByZXF1aXJlcyBhIGZpbGUgb3IgZmlsZSBkZXNjcmlwdG9yLCIKKyAgICAgICAgICIgYW4gaW50ZWdlciBhbmQgb3B0aW9uYWxseSBhIHRoaXJkIGludGVnZXIgb3IgYSBzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZhcmcpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldCA9IGZjbnRsKGZkLCBjb2RlLCBhcmcpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXJldCk7CiB9CiAKIFB5RG9jX1NUUlZBUihmY250bF9kb2MsCkBAIC05NiwxMTggKzk2LDExOCBAQAogZmNudGxfaW9jdGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogI2RlZmluZSBJT0NUTF9CVUZTWiAxMDI0Ci0JaW50IGZkOwotCS8qIEluIFB5QXJnX1BhcnNlVHVwbGUgYmVsb3csIHdlIHVzZSB0aGUgdW5zaWduZWQgbm9uLWNoZWNrZWQgJ0knCi0JICAgZm9ybWF0IGZvciB0aGUgJ2NvZGUnIHBhcmFtZXRlciBiZWNhdXNlIFB5dGhvbiB0dXJucyAweDgwMDAwMDAKLQkgICBpbnRvIGVpdGhlciBhIGxhcmdlIHBvc2l0aXZlIG51bWJlciAoUHlMb25nIG9yIFB5SW50IG9uIDY0LWJpdAotCSAgIHBsYXRmb3Jtcykgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gb3RoZXJzICgzMi1iaXQgUHlJbnQpCi0JICAgd2hlcmVhcyB0aGUgc3lzdGVtIGV4cGVjdHMgaXQgdG8gYmUgYSAzMmJpdCBiaXQgZmllbGQgdmFsdWUKLQkgICByZWdhcmRsZXNzIG9mIGl0IGJlaW5nIHBhc3NlZCBhcyBhbiBpbnQgb3IgdW5zaWduZWQgbG9uZyBvbgotCSAgIHZhcmlvdXMgcGxhdGZvcm1zLiAgU2VlIHRoZSB0ZXJtaW9zLlRJT0NTV0lOU1ogY29uc3RhbnQgYWNyb3NzCi0JICAgcGxhdGZvcm1zIGZvciBhbiBleGFtcGxlIG9mIHRoaXNlLgorICAgIGludCBmZDsKKyAgICAvKiBJbiBQeUFyZ19QYXJzZVR1cGxlIGJlbG93LCB3ZSB1c2UgdGhlIHVuc2lnbmVkIG5vbi1jaGVja2VkICdJJworICAgICAgIGZvcm1hdCBmb3IgdGhlICdjb2RlJyBwYXJhbWV0ZXIgYmVjYXVzZSBQeXRob24gdHVybnMgMHg4MDAwMDAwCisgICAgICAgaW50byBlaXRoZXIgYSBsYXJnZSBwb3NpdGl2ZSBudW1iZXIgKFB5TG9uZyBvciBQeUludCBvbiA2NC1iaXQKKyAgICAgICBwbGF0Zm9ybXMpIG9yIGEgbmVnYXRpdmUgbnVtYmVyIG9uIG90aGVycyAoMzItYml0IFB5SW50KQorICAgICAgIHdoZXJlYXMgdGhlIHN5c3RlbSBleHBlY3RzIGl0IHRvIGJlIGEgMzJiaXQgYml0IGZpZWxkIHZhbHVlCisgICAgICAgcmVnYXJkbGVzcyBvZiBpdCBiZWluZyBwYXNzZWQgYXMgYW4gaW50IG9yIHVuc2lnbmVkIGxvbmcgb24KKyAgICAgICB2YXJpb3VzIHBsYXRmb3Jtcy4gIFNlZSB0aGUgdGVybWlvcy5USU9DU1dJTlNaIGNvbnN0YW50IGFjcm9zcworICAgICAgIHBsYXRmb3JtcyBmb3IgYW4gZXhhbXBsZSBvZiB0aGlzZS4KIAotCSAgIElmIGFueSBvZiB0aGUgNjRiaXQgcGxhdGZvcm1zIGV2ZXIgZGVjaWRlIHRvIHVzZSBtb3JlIHRoYW4gMzJiaXRzCi0JICAgaW4gdGhlaXIgdW5zaWduZWQgbG9uZyBpb2N0bCBjb2RlcyB0aGlzIHdpbGwgYnJlYWsgYW5kIG5lZWQKLQkgICBzcGVjaWFsIGNhc2luZyBiYXNlZCBvbiB0aGUgcGxhdGZvcm0gYmVpbmcgYnVpbHQgb24uCi0JICovCi0JdW5zaWduZWQgaW50IGNvZGU7Ci0JaW50IGFyZzsKLQlpbnQgcmV0OwotCWNoYXIgKnN0cjsKLQlQeV9zc2l6ZV90IGxlbjsKLQlpbnQgbXV0YXRlX2FyZyA9IDE7Ci0gCWNoYXIgYnVmW0lPQ1RMX0JVRlNaKzFdOyAgLyogYXJndW1lbnQgcGx1cyBOVUwgYnl0ZSAqLworICAgICAgIElmIGFueSBvZiB0aGUgNjRiaXQgcGxhdGZvcm1zIGV2ZXIgZGVjaWRlIHRvIHVzZSBtb3JlIHRoYW4gMzJiaXRzCisgICAgICAgaW4gdGhlaXIgdW5zaWduZWQgbG9uZyBpb2N0bCBjb2RlcyB0aGlzIHdpbGwgYnJlYWsgYW5kIG5lZWQKKyAgICAgICBzcGVjaWFsIGNhc2luZyBiYXNlZCBvbiB0aGUgcGxhdGZvcm0gYmVpbmcgYnVpbHQgb24uCisgICAgICovCisgICAgdW5zaWduZWQgaW50IGNvZGU7CisgICAgaW50IGFyZzsKKyAgICBpbnQgcmV0OworICAgIGNoYXIgKnN0cjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBpbnQgbXV0YXRlX2FyZyA9IDE7CisgICAgY2hhciBidWZbSU9DVExfQlVGU1orMV07ICAvKiBhcmd1bWVudCBwbHVzIE5VTCBieXRlICovCiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZJdyN8aTppb2N0bCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgCi0JCQkgICAgICZzdHIsICZsZW4sICZtdXRhdGVfYXJnKSkgewotCQljaGFyICphcmc7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mSXcjfGk6aW9jdGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyLCAmbGVuLCAmbXV0YXRlX2FyZykpIHsKKyAgICAgICAgY2hhciAqYXJnOwogCi0JICAgICAgIAlpZiAobXV0YXRlX2FyZykgewotCQkJaWYgKGxlbiA8PSBJT0NUTF9CVUZTWikgewotCQkJCW1lbWNweShidWYsIHN0ciwgbGVuKTsKLQkJCQlidWZbbGVuXSA9ICdcMCc7Ci0JCQkJYXJnID0gYnVmOwotCQkJfSAKLQkJCWVsc2UgewotCQkJCWFyZyA9IHN0cjsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChsZW4gPiBJT0NUTF9CVUZTWikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiaW9jdGwgc3RyaW5nIGFyZyB0b28gbG9uZyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOwotCQkJCWJ1ZltsZW5dID0gJ1wwJzsKLQkJCQlhcmcgPSBidWY7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJ1ZiA9PSBhcmcpIHsKLQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgLyogdGhpbmsgYXJyYXkucmVzaXplKCkgKi8KLQkJCXJldCA9IGlvY3RsKGZkLCBjb2RlLCBhcmcpOwotCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJfQotCQllbHNlIHsKLQkJCXJldCA9IGlvY3RsKGZkLCBjb2RlLCBhcmcpOwotCQl9Ci0JCWlmIChtdXRhdGVfYXJnICYmIChsZW4gPCBJT0NUTF9CVUZTWikpIHsKLQkJCW1lbWNweShzdHIsIGJ1ZiwgbGVuKTsKLQkJfQotCQlpZiAocmV0IDwgMCkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKG11dGF0ZV9hcmcpIHsKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgbGVuKTsKLQkJfQotCX0KKyAgICAgICAgaWYgKG11dGF0ZV9hcmcpIHsKKyAgICAgICAgICAgIGlmIChsZW4gPD0gSU9DVExfQlVGU1opIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYnVmLCBzdHIsIGxlbik7CisgICAgICAgICAgICAgICAgYnVmW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgICAgIGFyZyA9IGJ1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGFyZyA9IHN0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsZW4gPiBJT0NUTF9CVUZTWikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiaW9jdGwgc3RyaW5nIGFyZyB0b28gbG9uZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOworICAgICAgICAgICAgICAgIGJ1ZltsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBhcmcgPSBidWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZiA9PSBhcmcpIHsKKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgLyogdGhpbmsgYXJyYXkucmVzaXplKCkgKi8KKyAgICAgICAgICAgIHJldCA9IGlvY3RsKGZkLCBjb2RlLCBhcmcpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGlvY3RsKGZkLCBjb2RlLCBhcmcpOworICAgICAgICB9CisgICAgICAgIGlmIChtdXRhdGVfYXJnICYmIChsZW4gPCBJT0NUTF9CVUZTWikpIHsKKyAgICAgICAgICAgIG1lbWNweShzdHIsIGJ1ZiwgbGVuKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG11dGF0ZV9hcmcpIHsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyZXQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgbGVuKTsKKyAgICAgICAgfQorICAgIH0KIAotCVB5RXJyX0NsZWFyKCk7Ci0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mSXMjOmlvY3RsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmc3RyLCAmbGVuKSkgewotCQlpZiAobGVuID4gSU9DVExfQlVGU1opIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiaW9jdGwgc3RyaW5nIGFyZyB0b28gbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbWVtY3B5KGJ1Ziwgc3RyLCBsZW4pOwotCQlidWZbbGVuXSA9ICdcMCc7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJcmV0ID0gaW9jdGwoZmQsIGNvZGUsIGJ1Zik7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWlmIChyZXQgPCAwKSB7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOwotCX0KKyAgICBQeUVycl9DbGVhcigpOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJklzIzppb2N0bCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmc3RyLCAmbGVuKSkgeworICAgICAgICBpZiAobGVuID4gSU9DVExfQlVGU1opIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpb2N0bCBzdHJpbmcgYXJnIHRvbyBsb25nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmLCBzdHIsIGxlbik7CisgICAgICAgIGJ1ZltsZW5dID0gJ1wwJzsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXQgPSBpb2N0bChmZCwgY29kZSwgYnVmKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIGxlbik7CisgICAgfQogCi0JUHlFcnJfQ2xlYXIoKTsKLQlhcmcgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAotCSAgICAgIk8mSXxpO2lvY3RsIHJlcXVpcmVzIGEgZmlsZSBvciBmaWxlIGRlc2NyaXB0b3IsIgotCSAgICAgIiBhbiBpbnRlZ2VyIGFuZCBvcHRpb25hbGx5IGFuIGludGVnZXIgb3IgYnVmZmVyIGFyZ3VtZW50IiwKLQkJCSAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmFyZykpIHsKLQkgIHJldHVybiBOVUxMOwotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBhcmcgPSAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgIk8mSXxpO2lvY3RsIHJlcXVpcmVzIGEgZmlsZSBvciBmaWxlIGRlc2NyaXB0b3IsIgorICAgICAgICAgIiBhbiBpbnRlZ2VyIGFuZCBvcHRpb25hbGx5IGFuIGludGVnZXIgb3IgYnVmZmVyIGFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmYXJnKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICNpZmRlZiBfX1ZNUwotCXJldCA9IGlvY3RsKGZkLCBjb2RlLCAodm9pZCAqKWFyZyk7CisgICAgcmV0ID0gaW9jdGwoZmQsIGNvZGUsICh2b2lkICopYXJnKTsKICNlbHNlCi0JcmV0ID0gaW9jdGwoZmQsIGNvZGUsIGFyZyk7CisgICAgcmV0ID0gaW9jdGwoZmQsIGNvZGUsIGFyZyk7CiAjZW5kaWYKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXQgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXJldCk7CiAjdW5kZWYgSU9DVExfQlVGU1oKIH0KIApAQCAtMjQ4LDUxICsyNDgsNTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmY250bF9mbG9jayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkOwotCWludCBjb2RlOwotCWludCByZXQ7CisgICAgaW50IGZkOworICAgIGludCBjb2RlOworICAgIGludCByZXQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTpmbG9jayIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTpmbG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgSEFWRV9GTE9DSwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBmbG9jayhmZCwgY29kZSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmV0ID0gZmxvY2soZmQsIGNvZGUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZWxzZQogCiAjaWZuZGVmIExPQ0tfU0gKLSNkZWZpbmUgTE9DS19TSAkJMQkvKiBzaGFyZWQgbG9jayAqLwotI2RlZmluZSBMT0NLX0VYCQkyCS8qIGV4Y2x1c2l2ZSBsb2NrICovCi0jZGVmaW5lIExPQ0tfTkIJCTQJLyogZG9uJ3QgYmxvY2sgd2hlbiBsb2NraW5nICovCi0jZGVmaW5lIExPQ0tfVU4JCTgJLyogdW5sb2NrICovCisjZGVmaW5lIExPQ0tfU0ggICAgICAgICAxICAgICAgIC8qIHNoYXJlZCBsb2NrICovCisjZGVmaW5lIExPQ0tfRVggICAgICAgICAyICAgICAgIC8qIGV4Y2x1c2l2ZSBsb2NrICovCisjZGVmaW5lIExPQ0tfTkIgICAgICAgICA0ICAgICAgIC8qIGRvbid0IGJsb2NrIHdoZW4gbG9ja2luZyAqLworI2RlZmluZSBMT0NLX1VOICAgICAgICAgOCAgICAgICAvKiB1bmxvY2sgKi8KICNlbmRpZgotCXsKLQkJc3RydWN0IGZsb2NrIGw7Ci0JCWlmIChjb2RlID09IExPQ0tfVU4pCi0JCQlsLmxfdHlwZSA9IEZfVU5MQ0s7Ci0JCWVsc2UgaWYgKGNvZGUgJiBMT0NLX1NIKQotCQkJbC5sX3R5cGUgPSBGX1JETENLOwotCQllbHNlIGlmIChjb2RlICYgTE9DS19FWCkKLQkJCWwubF90eXBlID0gRl9XUkxDSzsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInVucmVjb2duaXplZCBmbG9jayBhcmd1bWVudCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbC5sX3doZW5jZSA9IGwubF9zdGFydCA9IGwubF9sZW4gPSAwOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJldCA9IGZjbnRsKGZkLCAoY29kZSAmIExPQ0tfTkIpID8gRl9TRVRMSyA6IEZfU0VUTEtXLCAmbCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQorICAgIHsKKyAgICAgICAgc3RydWN0IGZsb2NrIGw7CisgICAgICAgIGlmIChjb2RlID09IExPQ0tfVU4pCisgICAgICAgICAgICBsLmxfdHlwZSA9IEZfVU5MQ0s7CisgICAgICAgIGVsc2UgaWYgKGNvZGUgJiBMT0NLX1NIKQorICAgICAgICAgICAgbC5sX3R5cGUgPSBGX1JETENLOworICAgICAgICBlbHNlIGlmIChjb2RlICYgTE9DS19FWCkKKyAgICAgICAgICAgIGwubF90eXBlID0gRl9XUkxDSzsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIGZsb2NrIGFyZ3VtZW50Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBsLmxfd2hlbmNlID0gbC5sX3N0YXJ0ID0gbC5sX2xlbiA9IDA7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0ID0gZmNudGwoZmQsIChjb2RlICYgTE9DS19OQikgPyBGX1NFVExLIDogRl9TRVRMS1csICZsKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CiAjZW5kaWYgLyogSEFWRV9GTE9DSyAqLwotCWlmIChyZXQgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihmbG9ja19kb2MsCkBAIC0zMDcsNzIgKzMwNyw3MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZjbnRsX2xvY2tmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQsIGNvZGUsIHJldCwgd2hlbmNlID0gMDsKLQlQeU9iamVjdCAqbGVub2JqID0gTlVMTCwgKnN0YXJ0b2JqID0gTlVMTDsKKyAgICBpbnQgZmQsIGNvZGUsIHJldCwgd2hlbmNlID0gMDsKKyAgICBQeU9iamVjdCAqbGVub2JqID0gTlVMTCwgKnN0YXJ0b2JqID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpfE9PaTpsb2NrZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsCi0JCQkgICAgICAmbGVub2JqLCAmc3RhcnRvYmosICZ3aGVuY2UpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maXxPT2k6bG9ja2YiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW5vYmosICZzdGFydG9iaiwgJndoZW5jZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKLQkJCSJsb2NrZiBub3Qgc3VwcG9ydGVkIG9uIE9TLzIgKEVNWCkiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImxvY2tmIG5vdCBzdXBwb3J0ZWQgb24gT1MvMiAoRU1YKSIpOworICAgIHJldHVybiBOVUxMOwogI2Vsc2UKICNpZm5kZWYgTE9DS19TSAotI2RlZmluZSBMT0NLX1NICQkxCS8qIHNoYXJlZCBsb2NrICovCi0jZGVmaW5lIExPQ0tfRVgJCTIJLyogZXhjbHVzaXZlIGxvY2sgKi8KLSNkZWZpbmUgTE9DS19OQgkJNAkvKiBkb24ndCBibG9jayB3aGVuIGxvY2tpbmcgKi8KLSNkZWZpbmUgTE9DS19VTgkJOAkvKiB1bmxvY2sgKi8KKyNkZWZpbmUgTE9DS19TSCAgICAgICAgIDEgICAgICAgLyogc2hhcmVkIGxvY2sgKi8KKyNkZWZpbmUgTE9DS19FWCAgICAgICAgIDIgICAgICAgLyogZXhjbHVzaXZlIGxvY2sgKi8KKyNkZWZpbmUgTE9DS19OQiAgICAgICAgIDQgICAgICAgLyogZG9uJ3QgYmxvY2sgd2hlbiBsb2NraW5nICovCisjZGVmaW5lIExPQ0tfVU4gICAgICAgICA4ICAgICAgIC8qIHVubG9jayAqLwogI2VuZGlmICAvKiBMT0NLX1NIICovCi0JewotCQlzdHJ1Y3QgZmxvY2sgbDsKLQkJaWYgKGNvZGUgPT0gTE9DS19VTikKLQkJCWwubF90eXBlID0gRl9VTkxDSzsKLQkJZWxzZSBpZiAoY29kZSAmIExPQ0tfU0gpCi0JCQlsLmxfdHlwZSA9IEZfUkRMQ0s7Ci0JCWVsc2UgaWYgKGNvZGUgJiBMT0NLX0VYKQotCQkJbC5sX3R5cGUgPSBGX1dSTENLOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkidW5yZWNvZ25pemVkIGxvY2tmIGFyZ3VtZW50Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlsLmxfc3RhcnQgPSBsLmxfbGVuID0gMDsKLQkJaWYgKHN0YXJ0b2JqICE9IE5VTEwpIHsKKyAgICB7CisgICAgICAgIHN0cnVjdCBmbG9jayBsOworICAgICAgICBpZiAoY29kZSA9PSBMT0NLX1VOKQorICAgICAgICAgICAgbC5sX3R5cGUgPSBGX1VOTENLOworICAgICAgICBlbHNlIGlmIChjb2RlICYgTE9DS19TSCkKKyAgICAgICAgICAgIGwubF90eXBlID0gRl9SRExDSzsKKyAgICAgICAgZWxzZSBpZiAoY29kZSAmIExPQ0tfRVgpCisgICAgICAgICAgICBsLmxfdHlwZSA9IEZfV1JMQ0s7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBsb2NrZiBhcmd1bWVudCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbC5sX3N0YXJ0ID0gbC5sX2xlbiA9IDA7CisgICAgICAgIGlmIChzdGFydG9iaiAhPSBOVUxMKSB7CiAjaWYgIWRlZmluZWQoSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCkKLQkJCWwubF9zdGFydCA9IFB5SW50X0FzTG9uZyhzdGFydG9iaik7CisgICAgICAgICAgICBsLmxfc3RhcnQgPSBQeUludF9Bc0xvbmcoc3RhcnRvYmopOwogI2Vsc2UKLQkJCWwubF9zdGFydCA9IFB5TG9uZ19DaGVjayhzdGFydG9iaikgPwotCQkJCQlQeUxvbmdfQXNMb25nTG9uZyhzdGFydG9iaikgOgotCQkJCQlQeUludF9Bc0xvbmcoc3RhcnRvYmopOworICAgICAgICAgICAgbC5sX3N0YXJ0ID0gUHlMb25nX0NoZWNrKHN0YXJ0b2JqKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0FzTG9uZ0xvbmcoc3RhcnRvYmopIDoKKyAgICAgICAgICAgICAgICAgICAgUHlJbnRfQXNMb25nKHN0YXJ0b2JqKTsKICNlbmRpZgotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKGxlbm9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVub2JqICE9IE5VTEwpIHsKICNpZiAhZGVmaW5lZChIQVZFX0xBUkdFRklMRV9TVVBQT1JUKQotCQkJbC5sX2xlbiA9IFB5SW50X0FzTG9uZyhsZW5vYmopOworICAgICAgICAgICAgbC5sX2xlbiA9IFB5SW50X0FzTG9uZyhsZW5vYmopOwogI2Vsc2UKLQkJCWwubF9sZW4gPSBQeUxvbmdfQ2hlY2sobGVub2JqKSA/Ci0JCQkJCVB5TG9uZ19Bc0xvbmdMb25nKGxlbm9iaikgOgotCQkJCQlQeUludF9Bc0xvbmcobGVub2JqKTsKKyAgICAgICAgICAgIGwubF9sZW4gPSBQeUxvbmdfQ2hlY2sobGVub2JqKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlMb25nX0FzTG9uZ0xvbmcobGVub2JqKSA6CisgICAgICAgICAgICAgICAgICAgIFB5SW50X0FzTG9uZyhsZW5vYmopOwogI2VuZGlmCi0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlsLmxfd2hlbmNlID0gd2hlbmNlOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJldCA9IGZjbnRsKGZkLCAoY29kZSAmIExPQ0tfTkIpID8gRl9TRVRMSyA6IEZfU0VUTEtXLCAmbCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCWlmIChyZXQgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGwubF93aGVuY2UgPSB3aGVuY2U7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0ID0gZmNudGwoZmQsIChjb2RlICYgTE9DS19OQikgPyBGX1NFVExLIDogRl9TRVRMS1csICZsKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogI2VuZGlmICAvKiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKSAqLwogfQogCkBAIC00MDQsMTEgKzQwNCwxMSBAQAogLyogTGlzdCBvZiBmdW5jdGlvbnMgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIGZjbnRsX21ldGhvZHNbXSA9IHsKLQl7ImZjbnRsIiwJZmNudGxfZmNudGwsIE1FVEhfVkFSQVJHUywgZmNudGxfZG9jfSwKLQl7ImlvY3RsIiwJZmNudGxfaW9jdGwsIE1FVEhfVkFSQVJHUywgaW9jdGxfZG9jfSwKLQl7ImZsb2NrIiwJZmNudGxfZmxvY2ssIE1FVEhfVkFSQVJHUywgZmxvY2tfZG9jfSwKLQl7ImxvY2tmIiwgICAgICAgZmNudGxfbG9ja2YsIE1FVEhfVkFSQVJHUywgbG9ja2ZfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiZmNudGwiLCAgICAgICAgICAgZmNudGxfZmNudGwsIE1FVEhfVkFSQVJHUywgZmNudGxfZG9jfSwKKyAgICB7ImlvY3RsIiwgICAgICAgICAgIGZjbnRsX2lvY3RsLCBNRVRIX1ZBUkFSR1MsIGlvY3RsX2RvY30sCisgICAgeyJmbG9jayIsICAgICAgICAgICBmY250bF9mbG9jaywgTUVUSF9WQVJBUkdTLCBmbG9ja19kb2N9LAorICAgIHsibG9ja2YiLCAgICAgICBmY250bF9sb2NrZiwgTUVUSF9WQVJBUkdTLCBsb2NrZl9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTQyMywxMiArNDIzLDEyIEBACiBzdGF0aWMgaW50CiBpbnMoUHlPYmplY3QqIGQsIGNoYXIqIHN5bWJvbCwgbG9uZyB2YWx1ZSkKIHsKLSAgICAgICAgUHlPYmplY3QqIHYgPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7Ci0gICAgICAgIGlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBzeW1ib2wsIHYpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgUHlPYmplY3QqIHYgPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7CisgICAgaWYgKCF2IHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIHN5bWJvbCwgdikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICByZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgSU5TKHgpIGlmIChpbnMoZCwgI3gsIChsb25nKXgpKSByZXR1cm4gLTEKQEAgLTQzNiwxODUgKzQzNiwxODUgQEAKIHN0YXRpYyBpbnQKIGFsbF9pbnMoUHlPYmplY3QqIGQpCiB7Ci0gICAgICAgIGlmIChpbnMoZCwgIkxPQ0tfU0giLCAobG9uZylMT0NLX1NIKSkgcmV0dXJuIC0xOwotICAgICAgICBpZiAoaW5zKGQsICJMT0NLX0VYIiwgKGxvbmcpTE9DS19FWCkpIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGlucyhkLCAiTE9DS19OQiIsIChsb25nKUxPQ0tfTkIpKSByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChpbnMoZCwgIkxPQ0tfVU4iLCAobG9uZylMT0NLX1VOKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkxPQ0tfU0giLCAobG9uZylMT0NLX1NIKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkxPQ0tfRVgiLCAobG9uZylMT0NLX0VYKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkxPQ0tfTkIiLCAobG9uZylMT0NLX05CKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkxPQ0tfVU4iLCAobG9uZylMT0NLX1VOKSkgcmV0dXJuIC0xOwogLyogR05VIGV4dGVuc2lvbnMsIGFzIG9mIGdsaWJjIDIuMi40ICovCiAjaWZkZWYgTE9DS19NQU5ECi0gICAgICAgIGlmIChpbnMoZCwgIkxPQ0tfTUFORCIsIChsb25nKUxPQ0tfTUFORCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJMT0NLX01BTkQiLCAobG9uZylMT0NLX01BTkQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBMT0NLX1JFQUQKLSAgICAgICAgaWYgKGlucyhkLCAiTE9DS19SRUFEIiwgKGxvbmcpTE9DS19SRUFEKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkxPQ0tfUkVBRCIsIChsb25nKUxPQ0tfUkVBRCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIExPQ0tfV1JJVEUKLSAgICAgICAgaWYgKGlucyhkLCAiTE9DS19XUklURSIsIChsb25nKUxPQ0tfV1JJVEUpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiTE9DS19XUklURSIsIChsb25nKUxPQ0tfV1JJVEUpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBMT0NLX1JXCi0gICAgICAgIGlmIChpbnMoZCwgIkxPQ0tfUlciLCAobG9uZylMT0NLX1JXKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkxPQ0tfUlciLCAobG9uZylMT0NLX1JXKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKICNpZmRlZiBGX0RVUEZECi0gICAgICAgIGlmIChpbnMoZCwgIkZfRFVQRkQiLCAobG9uZylGX0RVUEZEKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfRFVQRkQiLCAobG9uZylGX0RVUEZEKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9HRVRGRAotICAgICAgICBpZiAoaW5zKGQsICJGX0dFVEZEIiwgKGxvbmcpRl9HRVRGRCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0dFVEZEIiwgKGxvbmcpRl9HRVRGRCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VURkQKLSAgICAgICAgaWYgKGlucyhkLCAiRl9TRVRGRCIsIChsb25nKUZfU0VURkQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRGRCIsIChsb25nKUZfU0VURkQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX0dFVEZMCi0gICAgICAgIGlmIChpbnMoZCwgIkZfR0VURkwiLCAobG9uZylGX0dFVEZMKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfR0VURkwiLCAobG9uZylGX0dFVEZMKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9TRVRGTAotICAgICAgICBpZiAoaW5zKGQsICJGX1NFVEZMIiwgKGxvbmcpRl9TRVRGTCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1NFVEZMIiwgKGxvbmcpRl9TRVRGTCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfR0VUTEsKLSAgICAgICAgaWYgKGlucyhkLCAiRl9HRVRMSyIsIChsb25nKUZfR0VUTEspKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9HRVRMSyIsIChsb25nKUZfR0VUTEspKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1NFVExLCi0gICAgICAgIGlmIChpbnMoZCwgIkZfU0VUTEsiLCAobG9uZylGX1NFVExLKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfU0VUTEsiLCAobG9uZylGX1NFVExLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9TRVRMS1cKLSAgICAgICAgaWYgKGlucyhkLCAiRl9TRVRMS1ciLCAobG9uZylGX1NFVExLVykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1NFVExLVyIsIChsb25nKUZfU0VUTEtXKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9HRVRPV04KLSAgICAgICAgaWYgKGlucyhkLCAiRl9HRVRPV04iLCAobG9uZylGX0dFVE9XTikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0dFVE9XTiIsIChsb25nKUZfR0VUT1dOKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9TRVRPV04KLSAgICAgICAgaWYgKGlucyhkLCAiRl9TRVRPV04iLCAobG9uZylGX1NFVE9XTikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1NFVE9XTiIsIChsb25nKUZfU0VUT1dOKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9HRVRTSUcKLSAgICAgICAgaWYgKGlucyhkLCAiRl9HRVRTSUciLCAobG9uZylGX0dFVFNJRykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0dFVFNJRyIsIChsb25nKUZfR0VUU0lHKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9TRVRTSUcKLSAgICAgICAgaWYgKGlucyhkLCAiRl9TRVRTSUciLCAobG9uZylGX1NFVFNJRykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1NFVFNJRyIsIChsb25nKUZfU0VUU0lHKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9SRExDSwotICAgICAgICBpZiAoaW5zKGQsICJGX1JETENLIiwgKGxvbmcpRl9SRExDSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX1JETENLIiwgKGxvbmcpRl9SRExDSykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfV1JMQ0sKLSAgICAgICAgaWYgKGlucyhkLCAiRl9XUkxDSyIsIChsb25nKUZfV1JMQ0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9XUkxDSyIsIChsb25nKUZfV1JMQ0spKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1VOTENLCi0gICAgICAgIGlmIChpbnMoZCwgIkZfVU5MQ0siLCAobG9uZylGX1VOTENLKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfVU5MQ0siLCAobG9uZylGX1VOTENLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAvKiBMRlMgY29uc3RhbnRzICovCiAjaWZkZWYgRl9HRVRMSzY0Ci0gICAgICAgIGlmIChpbnMoZCwgIkZfR0VUTEs2NCIsIChsb25nKUZfR0VUTEs2NCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0dFVExLNjQiLCAobG9uZylGX0dFVExLNjQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX1NFVExLNjQKLSAgICAgICAgaWYgKGlucyhkLCAiRl9TRVRMSzY0IiwgKGxvbmcpRl9TRVRMSzY0KSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfU0VUTEs2NCIsIChsb25nKUZfU0VUTEs2NCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VUTEtXNjQKLSAgICAgICAgaWYgKGlucyhkLCAiRl9TRVRMS1c2NCIsIChsb25nKUZfU0VUTEtXNjQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRMS1c2NCIsIChsb25nKUZfU0VUTEtXNjQpKSByZXR1cm4gLTE7CiAjZW5kaWYKIC8qIEdOVSBleHRlbnNpb25zLCBhcyBvZiBnbGliYyAyLjIuNC4gKi8KICNpZmRlZiBGQVNZTkMKLSAgICAgICAgaWYgKGlucyhkLCAiRkFTWU5DIiwgKGxvbmcpRkFTWU5DKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZBU1lOQyIsIChsb25nKUZBU1lOQykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0VUTEVBU0UKLSAgICAgICAgaWYgKGlucyhkLCAiRl9TRVRMRUFTRSIsIChsb25nKUZfU0VUTEVBU0UpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TRVRMRUFTRSIsIChsb25nKUZfU0VUTEVBU0UpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBGX0dFVExFQVNFCi0gICAgICAgIGlmIChpbnMoZCwgIkZfR0VUTEVBU0UiLCAobG9uZylGX0dFVExFQVNFKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfR0VUTEVBU0UiLCAobG9uZylGX0dFVExFQVNFKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRl9OT1RJRlkKLSAgICAgICAgaWYgKGlucyhkLCAiRl9OT1RJRlkiLCAobG9uZylGX05PVElGWSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX05PVElGWSIsIChsb25nKUZfTk9USUZZKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAvKiBPbGQgQlNEIGZsb2NrKCkuICovCiAjaWZkZWYgRl9FWExDSwotICAgICAgICBpZiAoaW5zKGQsICJGX0VYTENLIiwgKGxvbmcpRl9FWExDSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJGX0VYTENLIiwgKGxvbmcpRl9FWExDSykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEZfU0hMQ0sKLSAgICAgICAgaWYgKGlucyhkLCAiRl9TSExDSyIsIChsb25nKUZfU0hMQ0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9TSExDSyIsIChsb25nKUZfU0hMQ0spKSByZXR1cm4gLTE7CiAjZW5kaWYKIAogLyogT1MgWCAoYW5kIG1heWJlIG90aGVycykgbGV0IHlvdSB0ZWxsIHRoZSBzdG9yYWdlIGRldmljZSB0byBmbHVzaCB0byBwaHlzaWNhbCBtZWRpYSAqLwogI2lmZGVmIEZfRlVMTEZTWU5DCi0gICAgICAgIGlmIChpbnMoZCwgIkZfRlVMTEZTWU5DIiwgKGxvbmcpRl9GVUxMRlNZTkMpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRl9GVUxMRlNZTkMiLCAobG9uZylGX0ZVTExGU1lOQykpIHJldHVybiAtMTsKICNlbmRpZgogCiAvKiBGb3IgRl97R0VUfFNFVH1GTCAqLwogI2lmZGVmIEZEX0NMT0VYRUMKLSAgICAgICAgaWYgKGlucyhkLCAiRkRfQ0xPRVhFQyIsIChsb25nKUZEX0NMT0VYRUMpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRkRfQ0xPRVhFQyIsIChsb25nKUZEX0NMT0VYRUMpKSByZXR1cm4gLTE7CiAjZW5kaWYKIAogLyogRm9yIEZfTk9USUZZICovCiAjaWZkZWYgRE5fQUNDRVNTCi0gICAgICAgIGlmIChpbnMoZCwgIkROX0FDQ0VTUyIsIChsb25nKUROX0FDQ0VTUykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJETl9BQ0NFU1MiLCAobG9uZylETl9BQ0NFU1MpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBETl9NT0RJRlkKLSAgICAgICAgaWYgKGlucyhkLCAiRE5fTU9ESUZZIiwgKGxvbmcpRE5fTU9ESUZZKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkROX01PRElGWSIsIChsb25nKUROX01PRElGWSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEROX0NSRUFURQotICAgICAgICBpZiAoaW5zKGQsICJETl9DUkVBVEUiLCAobG9uZylETl9DUkVBVEUpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRE5fQ1JFQVRFIiwgKGxvbmcpRE5fQ1JFQVRFKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRE5fREVMRVRFCi0gICAgICAgIGlmIChpbnMoZCwgIkROX0RFTEVURSIsIChsb25nKUROX0RFTEVURSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJETl9ERUxFVEUiLCAobG9uZylETl9ERUxFVEUpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBETl9SRU5BTUUKLSAgICAgICAgaWYgKGlucyhkLCAiRE5fUkVOQU1FIiwgKGxvbmcpRE5fUkVOQU1FKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkROX1JFTkFNRSIsIChsb25nKUROX1JFTkFNRSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIEROX0FUVFJJQgotICAgICAgICBpZiAoaW5zKGQsICJETl9BVFRSSUIiLCAobG9uZylETl9BVFRSSUIpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRE5fQVRUUklCIiwgKGxvbmcpRE5fQVRUUklCKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgRE5fTVVMVElTSE9UCi0gICAgICAgIGlmIChpbnMoZCwgIkROX01VTFRJU0hPVCIsIChsb25nKUROX01VTFRJU0hPVCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJETl9NVUxUSVNIT1QiLCAobG9uZylETl9NVUxUSVNIT1QpKSByZXR1cm4gLTE7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfU1RST1BUU19ICi0JLyogVW5peCA5OCBndWFyYW50ZWVzIHRoYXQgdGhlc2UgYXJlIGluIHN0cm9wdHMuaC4gKi8KLQlJTlMoSV9QVVNIKTsKLQlJTlMoSV9QT1ApOwotCUlOUyhJX0xPT0spOwotCUlOUyhJX0ZMVVNIKTsKLQlJTlMoSV9GTFVTSEJBTkQpOwotCUlOUyhJX1NFVFNJRyk7Ci0JSU5TKElfR0VUU0lHKTsKLQlJTlMoSV9GSU5EKTsKLQlJTlMoSV9QRUVLKTsKLQlJTlMoSV9TUkRPUFQpOwotCUlOUyhJX0dSRE9QVCk7Ci0JSU5TKElfTlJFQUQpOwotCUlOUyhJX0ZESU5TRVJUKTsKLQlJTlMoSV9TVFIpOwotCUlOUyhJX1NXUk9QVCk7CisgICAgLyogVW5peCA5OCBndWFyYW50ZWVzIHRoYXQgdGhlc2UgYXJlIGluIHN0cm9wdHMuaC4gKi8KKyAgICBJTlMoSV9QVVNIKTsKKyAgICBJTlMoSV9QT1ApOworICAgIElOUyhJX0xPT0spOworICAgIElOUyhJX0ZMVVNIKTsKKyAgICBJTlMoSV9GTFVTSEJBTkQpOworICAgIElOUyhJX1NFVFNJRyk7CisgICAgSU5TKElfR0VUU0lHKTsKKyAgICBJTlMoSV9GSU5EKTsKKyAgICBJTlMoSV9QRUVLKTsKKyAgICBJTlMoSV9TUkRPUFQpOworICAgIElOUyhJX0dSRE9QVCk7CisgICAgSU5TKElfTlJFQUQpOworICAgIElOUyhJX0ZESU5TRVJUKTsKKyAgICBJTlMoSV9TVFIpOworICAgIElOUyhJX1NXUk9QVCk7CiAjaWZkZWYgSV9HV1JPUFQKLQkvKiBkZXNwaXRlIHRoZSBjb21tZW50IGFib3ZlLCBvbGQtaXNoIGdsaWJjcyBtaXNzIGEgY291cGxlLi4uICovCi0JSU5TKElfR1dST1BUKTsKKyAgICAvKiBkZXNwaXRlIHRoZSBjb21tZW50IGFib3ZlLCBvbGQtaXNoIGdsaWJjcyBtaXNzIGEgY291cGxlLi4uICovCisgICAgSU5TKElfR1dST1BUKTsKICNlbmRpZgotCUlOUyhJX1NFTkRGRCk7Ci0JSU5TKElfUkVDVkZEKTsKLQlJTlMoSV9MSVNUKTsKLQlJTlMoSV9BVE1BUkspOwotCUlOUyhJX0NLQkFORCk7Ci0JSU5TKElfR0VUQkFORCk7Ci0JSU5TKElfQ0FOUFVUKTsKLQlJTlMoSV9TRVRDTFRJTUUpOworICAgIElOUyhJX1NFTkRGRCk7CisgICAgSU5TKElfUkVDVkZEKTsKKyAgICBJTlMoSV9MSVNUKTsKKyAgICBJTlMoSV9BVE1BUkspOworICAgIElOUyhJX0NLQkFORCk7CisgICAgSU5TKElfR0VUQkFORCk7CisgICAgSU5TKElfQ0FOUFVUKTsKKyAgICBJTlMoSV9TRVRDTFRJTUUpOwogI2lmZGVmIElfR0VUQ0xUSU1FCi0JSU5TKElfR0VUQ0xUSU1FKTsKKyAgICBJTlMoSV9HRVRDTFRJTUUpOwogI2VuZGlmCi0JSU5TKElfTElOSyk7Ci0JSU5TKElfVU5MSU5LKTsKLQlJTlMoSV9QTElOSyk7Ci0JSU5TKElfUFVOTElOSyk7CisgICAgSU5TKElfTElOSyk7CisgICAgSU5TKElfVU5MSU5LKTsKKyAgICBJTlMoSV9QTElOSyk7CisgICAgSU5TKElfUFVOTElOSyk7CiAjZW5kaWYKLQkKLQlyZXR1cm4gMDsKKworICAgIHJldHVybiAwOwogfQogCiBQeU1PRElOSVRfRlVOQwogaW5pdGZjbnRsKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyBhbmQgZG9jdW1lbnRhdGlvbiAqLwotCW0gPSBQeV9Jbml0TW9kdWxlMygiZmNudGwiLCBmY250bF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zIGFuZCBkb2N1bWVudGF0aW9uICovCisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJmY250bCIsIGZjbnRsX21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JYWxsX2lucyhkKTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGFsbF9pbnMoZCk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2ZsbW9kdWxlLmMgYi9Nb2R1bGVzL2ZsbW9kdWxlLmMKaW5kZXggZDJjMjUwNi4uYjVhNzhjZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9mbG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZmxtb2R1bGUuYwpAQCAtMjIsMTEgKzIyLDExIEBACiAvKiBHZW5lcmljIEZvcm1zIE9iamVjdHMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlGTF9PQkpFQ1QgKm9iX2dlbmVyaWM7Ci0JUHlNZXRob2REZWYgKm9iX21ldGhvZHM7Ci0JUHlPYmplY3QgKm9iX2NhbGxiYWNrOwotCVB5T2JqZWN0ICpvYl9jYWxsYmFja19hcmc7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZMX09CSkVDVCAqb2JfZ2VuZXJpYzsKKyAgICBQeU1ldGhvZERlZiAqb2JfbWV0aG9kczsKKyAgICBQeU9iamVjdCAqb2JfY2FsbGJhY2s7CisgICAgUHlPYmplY3QgKm9iX2NhbGxiYWNrX2FyZzsKIH0gZ2VuZXJpY29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBHZW5lcmljT2JqZWN0dHlwZTsKQEAgLTQzLDMyICs0MywzMiBAQAogc3RhdGljIHZvaWQKIGtub3dnZW5lcmljKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JaW50IGksIG47Ci0JLyogQ3JlYXRlIHRoZSBsaXN0IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCAqLwotCWlmIChhbGxnZW5lcmljcyA9PSBOVUxMKSB7Ci0JCWFsbGdlbmVyaWNzID0gUHlMaXN0X05ldygwKTsKLQkJaWYgKGFsbGdlbmVyaWNzID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR1cm47IC8qIFRvbyBiYWQsIGxpdmUgd2l0aG91dCBhbGxnZW5lcmljcy4uLiAqLwotCQl9Ci0JfQotCWlmIChuZnJlZXNsb3RzID4gMCkgewotCQkvKiBTZWFyY2ggdGhlIGxpc3QgZm9yIHJldXNhYmxlIHNsb3RzIChOVUxMIGl0ZW1zKSAqLwotCQkvKiBYWFggVGhpcyBjYW4gYmUgbWFkZSBmYXN0ZXIhICovCi0JCW4gPSBQeUxpc3RfU2l6ZShhbGxnZW5lcmljcyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWlmIChQeUxpc3RfR2V0SXRlbShhbGxnZW5lcmljcywgaSkgPT0gTlVMTCkgewotCQkJCVB5X0lOQ1JFRihnKTsKLQkJCQlQeUxpc3RfU2V0SXRlbShhbGxnZW5lcmljcywgaSwgKFB5T2JqZWN0ICopZyk7Ci0JCQkJbmZyZWVzbG90cy0tOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvKiBTdHJhbmdlLi4uIG5vIGZyZWUgc2xvdHMgZm91bmQuLi4gKi8KLQkJbmZyZWVzbG90cyA9IDA7Ci0JfQotCS8qIE5vIGZyZWUgZW50cmllcywgYXBwZW5kIG5ldyBpdGVtIHRvIHRoZSBlbmQgKi8KLQlQeUxpc3RfQXBwZW5kKGFsbGdlbmVyaWNzLCAoUHlPYmplY3QgKilnKTsKKyAgICBpbnQgaSwgbjsKKyAgICAvKiBDcmVhdGUgdGhlIGxpc3QgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0ICovCisgICAgaWYgKGFsbGdlbmVyaWNzID09IE5VTEwpIHsKKyAgICAgICAgYWxsZ2VuZXJpY3MgPSBQeUxpc3RfTmV3KDApOworICAgICAgICBpZiAoYWxsZ2VuZXJpY3MgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybjsgLyogVG9vIGJhZCwgbGl2ZSB3aXRob3V0IGFsbGdlbmVyaWNzLi4uICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5mcmVlc2xvdHMgPiAwKSB7CisgICAgICAgIC8qIFNlYXJjaCB0aGUgbGlzdCBmb3IgcmV1c2FibGUgc2xvdHMgKE5VTEwgaXRlbXMpICovCisgICAgICAgIC8qIFhYWCBUaGlzIGNhbiBiZSBtYWRlIGZhc3RlciEgKi8KKyAgICAgICAgbiA9IFB5TGlzdF9TaXplKGFsbGdlbmVyaWNzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgaWYgKFB5TGlzdF9HZXRJdGVtKGFsbGdlbmVyaWNzLCBpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGcpOworICAgICAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGFsbGdlbmVyaWNzLCBpLCAoUHlPYmplY3QgKilnKTsKKyAgICAgICAgICAgICAgICBuZnJlZXNsb3RzLS07CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFN0cmFuZ2UuLi4gbm8gZnJlZSBzbG90cyBmb3VuZC4uLiAqLworICAgICAgICBuZnJlZXNsb3RzID0gMDsKKyAgICB9CisgICAgLyogTm8gZnJlZSBlbnRyaWVzLCBhcHBlbmQgbmV3IGl0ZW0gdG8gdGhlIGVuZCAqLworICAgIFB5TGlzdF9BcHBlbmQoYWxsZ2VuZXJpY3MsIChQeU9iamVjdCAqKWcpOwogfQogCiAvKiBGaW5kIGFuIG9iamVjdCBpbiB0aGUgbGlzdCBvZiBrbm93biBvYmplY3RzICovCkBAIC03NiwxOCArNzYsMTggQEAKIHN0YXRpYyBnZW5lcmljb2JqZWN0ICoKIGZpbmRnZW5lcmljKEZMX09CSkVDVCAqZ2VuZXJpYykKIHsKLQlpbnQgaSwgbjsKLQlnZW5lcmljb2JqZWN0ICpnOwotCQotCWlmIChhbGxnZW5lcmljcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsgLyogTm8gb2JqZWN0cyBrbm93biB5ZXQgKi8KLQluID0gUHlMaXN0X1NpemUoYWxsZ2VuZXJpY3MpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZyA9IChnZW5lcmljb2JqZWN0ICopUHlMaXN0X0dldEl0ZW0oYWxsZ2VuZXJpY3MsIGkpOwotCQlpZiAoZyAhPSBOVUxMICYmIGctPm9iX2dlbmVyaWMgPT0gZ2VuZXJpYykKLQkJCXJldHVybiBnOwotCX0KLQlyZXR1cm4gTlVMTDsgLyogVW5rbm93biBvYmplY3QgKi8KKyAgICBpbnQgaSwgbjsKKyAgICBnZW5lcmljb2JqZWN0ICpnOworCisgICAgaWYgKGFsbGdlbmVyaWNzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOyAvKiBObyBvYmplY3RzIGtub3duIHlldCAqLworICAgIG4gPSBQeUxpc3RfU2l6ZShhbGxnZW5lcmljcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBnID0gKGdlbmVyaWNvYmplY3QgKilQeUxpc3RfR2V0SXRlbShhbGxnZW5lcmljcywgaSk7CisgICAgICAgIGlmIChnICE9IE5VTEwgJiYgZy0+b2JfZ2VuZXJpYyA9PSBnZW5lcmljKQorICAgICAgICAgICAgcmV0dXJuIGc7CisgICAgfQorICAgIHJldHVybiBOVUxMOyAvKiBVbmtub3duIG9iamVjdCAqLwogfQogCiAvKiBSZW1vdmUgYW4gb2JqZWN0IGZyb20gdGhlIGxpc3Qgb2Yga25vd24gb2JqZWN0cyAqLwpAQCAtOTUsMjIgKzk1LDIyIEBACiBzdGF0aWMgdm9pZAogZm9yZ2V0Z2VuZXJpYyhnZW5lcmljb2JqZWN0ICpnKQogewotCWludCBpLCBuOwotCQotCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOwotCWctPm9iX2NhbGxiYWNrID0gTlVMTDsKLQlQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrX2FyZyk7Ci0JZy0+b2JfY2FsbGJhY2tfYXJnID0gTlVMTDsKLQlpZiAoYWxsZ2VuZXJpY3MgPT0gTlVMTCkKLQkJcmV0dXJuOyAvKiBObyBvYmplY3RzIGtub3duIHlldCAqLwotCW4gPSBQeUxpc3RfU2l6ZShhbGxnZW5lcmljcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpZiAoZyA9PSAoZ2VuZXJpY29iamVjdCAqKVB5TGlzdF9HZXRJdGVtKGFsbGdlbmVyaWNzLCBpKSkgewotCQkJUHlMaXN0X1NldEl0ZW0oYWxsZ2VuZXJpY3MsIGksIChQeU9iamVjdCAqKU5VTEwpOwotCQkJbmZyZWVzbG90cysrOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgaW50IGksIG47CisKKyAgICBQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrKTsKKyAgICBnLT5vYl9jYWxsYmFjayA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOworICAgIGctPm9iX2NhbGxiYWNrX2FyZyA9IE5VTEw7CisgICAgaWYgKGFsbGdlbmVyaWNzID09IE5VTEwpCisgICAgICAgIHJldHVybjsgLyogTm8gb2JqZWN0cyBrbm93biB5ZXQgKi8KKyAgICBuID0gUHlMaXN0X1NpemUoYWxsZ2VuZXJpY3MpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKGcgPT0gKGdlbmVyaWNvYmplY3QgKilQeUxpc3RfR2V0SXRlbShhbGxnZW5lcmljcywgaSkpIHsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKGFsbGdlbmVyaWNzLCBpLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICAgICAgICAgIG5mcmVlc2xvdHMrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogfQogCiAvKiBDYWxsZWQgd2hlbiBhIGZvcm0gaXMgYWJvdXQgdG8gYmUgZnJlZWQgLS0KQEAgLTExOSwyNyArMTE5LDI3IEBACiBzdGF0aWMgdm9pZAogcmVsZWFzZW9iamVjdHMoRkxfRk9STSAqZm9ybSkKIHsKLQlpbnQgaSwgbjsKLQlnZW5lcmljb2JqZWN0ICpnOwotCQotCWlmIChhbGxnZW5lcmljcyA9PSBOVUxMKQotCQlyZXR1cm47IC8qIE5vIG9iamVjdHMga25vd24geWV0ICovCi0JbiA9IFB5TGlzdF9TaXplKGFsbGdlbmVyaWNzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWcgPSAoZ2VuZXJpY29iamVjdCAqKVB5TGlzdF9HZXRJdGVtKGFsbGdlbmVyaWNzLCBpKTsKLQkJaWYgKGcgIT0gTlVMTCAmJiBnLT5vYl9nZW5lcmljLT5mb3JtID09IGZvcm0pIHsKLQkJCWZsX2RlbGV0ZV9vYmplY3QoZy0+b2JfZ2VuZXJpYyk7Ci0JCQkvKiBUaGUgb2JqZWN0IGlzIG5vdyB1bnJlYWNoYWJsZSBmb3IKLQkJCSAgIGRvX2Zvcm1zIGFuZCBjaGVja19mb3Jtcywgc28KLQkJCSAgIGRlbGV0ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGtub3duIG9iamVjdHMgKi8KLQkJCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOwotCQkJZy0+b2JfY2FsbGJhY2sgPSBOVUxMOwotCQkJUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOwotCQkJZy0+b2JfY2FsbGJhY2tfYXJnID0gTlVMTDsKLQkJCVB5TGlzdF9TZXRJdGVtKGFsbGdlbmVyaWNzLCBpLCAoUHlPYmplY3QgKilOVUxMKTsKLQkJCW5mcmVlc2xvdHMrKzsKLQkJfQotCX0KKyAgICBpbnQgaSwgbjsKKyAgICBnZW5lcmljb2JqZWN0ICpnOworCisgICAgaWYgKGFsbGdlbmVyaWNzID09IE5VTEwpCisgICAgICAgIHJldHVybjsgLyogTm8gb2JqZWN0cyBrbm93biB5ZXQgKi8KKyAgICBuID0gUHlMaXN0X1NpemUoYWxsZ2VuZXJpY3MpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZyA9IChnZW5lcmljb2JqZWN0ICopUHlMaXN0X0dldEl0ZW0oYWxsZ2VuZXJpY3MsIGkpOworICAgICAgICBpZiAoZyAhPSBOVUxMICYmIGctPm9iX2dlbmVyaWMtPmZvcm0gPT0gZm9ybSkgeworICAgICAgICAgICAgZmxfZGVsZXRlX29iamVjdChnLT5vYl9nZW5lcmljKTsKKyAgICAgICAgICAgIC8qIFRoZSBvYmplY3QgaXMgbm93IHVucmVhY2hhYmxlIGZvcgorICAgICAgICAgICAgICAgZG9fZm9ybXMgYW5kIGNoZWNrX2Zvcm1zLCBzbworICAgICAgICAgICAgICAgZGVsZXRlIGl0IGZyb20gdGhlIGxpc3Qgb2Yga25vd24gb2JqZWN0cyAqLworICAgICAgICAgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7CisgICAgICAgICAgICBnLT5vYl9jYWxsYmFjayA9IE5VTEw7CisgICAgICAgICAgICBQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrX2FyZyk7CisgICAgICAgICAgICBnLT5vYl9jYWxsYmFja19hcmcgPSBOVUxMOworICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0oYWxsZ2VuZXJpY3MsIGksIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICAgICAgbmZyZWVzbG90cysrOworICAgICAgICB9CisgICAgfQogfQogCiAKQEAgLTE0OCw3OSArMTQ4LDc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19zZXRfY2FsbF9iYWNrKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApIHsKLQkJUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7Ci0JCVB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2tfYXJnKTsKLQkJZy0+b2JfY2FsbGJhY2sgPSBOVUxMOwotCQlnLT5vYl9jYWxsYmFja19hcmcgPSBOVUxMOwotCX0KLQllbHNlIHsKLSAgICAgICAgUHlPYmplY3QgKmEsICpiOwotICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZXRfY2FsbF9iYWNrIiwgMiwgMiwgJmEsICZiKSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCQlQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrKTsKLQkJUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOwotCQlnLT5vYl9jYWxsYmFjayA9IGE7Ci0JCVB5X0lOQ1JFRihnLT5vYl9jYWxsYmFjayk7Ci0JCWctPm9iX2NhbGxiYWNrX2FyZyA9IGI7Ci0JCVB5X0lOQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkgeworICAgICAgICBQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrKTsKKyAgICAgICAgUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOworICAgICAgICBnLT5vYl9jYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGctPm9iX2NhbGxiYWNrX2FyZyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgIFB5T2JqZWN0ICphLCAqYjsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZXRfY2FsbF9iYWNrIiwgMiwgMiwgJmEsICZiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X1hERUNSRUYoZy0+b2JfY2FsbGJhY2spOworICAgICAgICBQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrX2FyZyk7CisgICAgICAgIGctPm9iX2NhbGxiYWNrID0gYTsKKyAgICAgICAgUHlfSU5DUkVGKGctPm9iX2NhbGxiYWNrKTsKKyAgICAgICAgZy0+b2JfY2FsbGJhY2tfYXJnID0gYjsKKyAgICAgICAgUHlfSU5DUkVGKGctPm9iX2NhbGxiYWNrX2FyZyk7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfY2FsbChnZW5lcmljb2JqZWN0ICpnLCB2b2lkICgqZnVuYykoRkxfT0JKRUNUICopKQogewotCSgqZnVuYykoZy0+b2JfZ2VuZXJpYyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgICgqZnVuYykoZy0+b2JfZ2VuZXJpYyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19kZWxldGVfb2JqZWN0KGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlyZXMgPSBnZW5lcmljX2NhbGwoZywgZmxfZGVsZXRlX29iamVjdCk7Ci0JaWYgKHJlcyAhPSBOVUxMKQotCQlmb3JnZXRnZW5lcmljKGcpOwotCXJldHVybiByZXM7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICByZXMgPSBnZW5lcmljX2NhbGwoZywgZmxfZGVsZXRlX29iamVjdCk7CisgICAgaWYgKHJlcyAhPSBOVUxMKQorICAgICAgICBmb3JnZXRnZW5lcmljKGcpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX3Nob3dfb2JqZWN0KGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9zaG93X29iamVjdCk7CisgICAgcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9zaG93X29iamVjdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX2hpZGVfb2JqZWN0KGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9oaWRlX29iamVjdCk7CisgICAgcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9oaWRlX29iamVjdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX3JlZHJhd19vYmplY3QoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX3JlZHJhd19vYmplY3QpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfcmVkcmF3X29iamVjdCk7CiB9CiAKICNpZmRlZiBPQlNPTEVURV9GT1JNU19DQUxMUwotIAorCiAgLyogKHVuKWZyZWV6ZV9vYmplY3QoKSBhcmUgb2Jzb2xldGUgaW4gRk9STVMgMi4yIGFuZCB1bnN1cHBvcnRlZAogICAgIGluIDIuMy4gIFNpbmNlIHRoZXJlJ3Mgbm8gZm9vbHByb29mIHdheSB0byB0ZWxsIHdoaWNoIHZlcnNpb24gd2UncmUKICAgICB1c2luZywgd2Ugb21pdCB0aGVtIHVuY29uZGl0aW9uYWxseS4gKi8KLSAKKwogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfZnJlZXplX29iamVjdChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfZnJlZXplX29iamVjdCk7CisgICAgcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9mcmVlemVfb2JqZWN0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfdW5mcmVlemVfb2JqZWN0KGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF91bmZyZWV6ZV9vYmplY3QpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfdW5mcmVlemVfb2JqZWN0KTsKIH0KIAogI2VuZGlmIC8qIE9CU09MRVRFX0ZPUk1TX0NBTExTICovCkBAIC0yMjgsNzggKzIyOCw3OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfYWN0aXZhdGVfb2JqZWN0KGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfY2FsbChnLCBmbF9hY3RpdmF0ZV9vYmplY3QpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwoZywgZmxfYWN0aXZhdGVfb2JqZWN0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfZGVhY3RpdmF0ZV9vYmplY3QoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX2RlYWN0aXZhdGVfb2JqZWN0KTsKKyAgICByZXR1cm4gZ2VuZXJpY19jYWxsKGcsIGZsX2RlYWN0aXZhdGVfb2JqZWN0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfc2V0X29iamVjdF9zaG9ydGN1dChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzdHI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnNldF9vYmplY3Rfc2hvcnRjdXQiLCAmc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZmxfc2V0X29iamVjdF9zaG9ydGN1dChnLT5vYl9nZW5lcmljLCBzdHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjaGFyICpzdHI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnNldF9vYmplY3Rfc2hvcnRjdXQiLCAmc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxfc2V0X29iamVjdF9zaG9ydGN1dChnLT5vYl9nZW5lcmljLCBzdHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGdlbmVyaWNfbWV0aG9kc1tdID0gewotCXsic2V0X2NhbGxfYmFjayIsCShQeUNGdW5jdGlvbilnZW5lcmljX3NldF9jYWxsX2JhY2ssIE1FVEhfVkFSQVJHU30sCi0JeyJkZWxldGVfb2JqZWN0IiwJKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfZGVsZXRlX29iamVjdCwgTUVUSF9OT0FSR1N9LAotCXsic2hvd19vYmplY3QiLAkJKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfc2hvd19vYmplY3QsIE1FVEhfTk9BUkdTfSwKLQl7ImhpZGVfb2JqZWN0IiwJCShQeUNGdW5jdGlvbilnZW5lcmljX2hpZGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCi0JeyJyZWRyYXdfb2JqZWN0IiwJKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfcmVkcmF3X29iamVjdCwgTUVUSF9OT0FSR1N9LAorICAgIHsic2V0X2NhbGxfYmFjayIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY19zZXRfY2FsbF9iYWNrLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZGVsZXRlX29iamVjdCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY19kZWxldGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCisgICAgeyJzaG93X29iamVjdCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilnZW5lcmljX3Nob3dfb2JqZWN0LCBNRVRIX05PQVJHU30sCisgICAgeyJoaWRlX29iamVjdCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilnZW5lcmljX2hpZGVfb2JqZWN0LCBNRVRIX05PQVJHU30sCisgICAgeyJyZWRyYXdfb2JqZWN0IiwgICAgICAgICAgIChQeUNGdW5jdGlvbilnZW5lcmljX3JlZHJhd19vYmplY3QsIE1FVEhfTk9BUkdTfSwKICNpZmRlZiBPQlNPTEVURV9GT1JNU19DQUxMUwotCXsiZnJlZXplX29iamVjdCIsCShQeUNGdW5jdGlvbilnZW5lcmljX2ZyZWV6ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKLQl7InVuZnJlZXplX29iamVjdCIsCShQeUNGdW5jdGlvbilnZW5lcmljX3VuZnJlZXplX29iamVjdCwgTUVUSF9OT0FSR1N9LAorICAgIHsiZnJlZXplX29iamVjdCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY19mcmVlemVfb2JqZWN0LCBNRVRIX05PQVJHU30sCisgICAgeyJ1bmZyZWV6ZV9vYmplY3QiLCAgICAgICAgIChQeUNGdW5jdGlvbilnZW5lcmljX3VuZnJlZXplX29iamVjdCwgTUVUSF9OT0FSR1N9LAogI2VuZGlmCi0JeyJhY3RpdmF0ZV9vYmplY3QiLAkoUHlDRnVuY3Rpb24pZ2VuZXJpY19hY3RpdmF0ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKLQl7ImRlYWN0aXZhdGVfb2JqZWN0IiwJKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfZGVhY3RpdmF0ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKLQl7InNldF9vYmplY3Rfc2hvcnRjdXQiLAkoUHlDRnVuY3Rpb24pZ2VuZXJpY19zZXRfb2JqZWN0X3Nob3J0Y3V0LCBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiYWN0aXZhdGVfb2JqZWN0IiwgICAgICAgICAoUHlDRnVuY3Rpb24pZ2VuZXJpY19hY3RpdmF0ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImRlYWN0aXZhdGVfb2JqZWN0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfZGVhY3RpdmF0ZV9vYmplY3QsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9vYmplY3Rfc2hvcnRjdXQiLCAgICAgKFB5Q0Z1bmN0aW9uKWdlbmVyaWNfc2V0X29iamVjdF9zaG9ydGN1dCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgdm9pZAogZ2VuZXJpY19kZWFsbG9jKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JZmxfZnJlZV9vYmplY3QoZy0+b2JfZ2VuZXJpYyk7Ci0JUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFjayk7Ci0JUHlfWERFQ1JFRihnLT5vYl9jYWxsYmFja19hcmcpOwotCVB5T2JqZWN0X0RlbChnKTsKKyAgICBmbF9mcmVlX29iamVjdChnLT5vYl9nZW5lcmljKTsKKyAgICBQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrKTsKKyAgICBQeV9YREVDUkVGKGctPm9iX2NhbGxiYWNrX2FyZyk7CisgICAgUHlPYmplY3RfRGVsKGcpOwogfQogCiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihGTF9PQkpFQ1QsIHgpCiAKIHN0YXRpYyBzdHJ1Y3QgbWVtYmVybGlzdCBnZW5lcmljX21lbWJlcmxpc3RbXSA9IHsKLQl7Im9iamNsYXNzIiwJVF9JTlQsCQlPRkYob2JqY2xhc3MpLAlST30sCi0JeyJ0eXBlIiwJVF9JTlQsCQlPRkYodHlwZSksCVJPfSwKLQl7ImJveHR5cGUiLAlUX0lOVCwJCU9GRihib3h0eXBlKX0sCi0JeyJ4IiwJCVRfRkxPQVQsCU9GRih4KX0sCi0JeyJ5IiwJCVRfRkxPQVQsCU9GRih5KX0sCi0JeyJ3IiwJCVRfRkxPQVQsCU9GRih3KX0sCi0JeyJoIiwJCVRfRkxPQVQsCU9GRihoKX0sCi0JeyJjb2wxIiwJVF9JTlQsCQlPRkYoY29sMSl9LAotCXsiY29sMiIsCVRfSU5ULAkJT0ZGKGNvbDIpfSwKLQl7ImFsaWduIiwJVF9JTlQsCQlPRkYoYWxpZ24pfSwKLQl7Imxjb2wiLAlUX0lOVCwJCU9GRihsY29sKX0sCi0JeyJsc2l6ZSIsCVRfRkxPQVQsCU9GRihsc2l6ZSl9LAotCS8qICJsYWJlbCIgaXMgdHJlYXRlZCBzcGVjaWFsbHkhICovCi0JeyJsc3R5bGUiLAlUX0lOVCwJCU9GRihsc3R5bGUpfSwKLQl7InB1c2hlZCIsCVRfSU5ULAkJT0ZGKHB1c2hlZCksCVJPfSwKLQl7ImZvY3VzIiwJVF9JTlQsCQlPRkYoZm9jdXMpLAlST30sCi0JeyJiZWxvd21vdXNlIiwJVF9JTlQsCQlPRkYoYmVsb3dtb3VzZSksUk99LAotLyoJeyJmcm96ZW4iLAlUX0lOVCwJCU9GRihmcm96ZW4pLAlST30sCSovCi0JeyJhY3RpdmUiLAlUX0lOVCwJCU9GRihhY3RpdmUpfSwKLQl7ImlucHV0IiwJVF9JTlQsCQlPRkYoaW5wdXQpfSwKLQl7InZpc2libGUiLAlUX0lOVCwJCU9GRih2aXNpYmxlKSwJUk99LAotCXsicmFkaW8iLAlUX0lOVCwJCU9GRihyYWRpbyl9LAotCXsiYXV0b21hdGljIiwJVF9JTlQsCQlPRkYoYXV0b21hdGljKX0sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJvYmpjbGFzcyIsICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKG9iamNsYXNzKSwgIFJPfSwKKyAgICB7InR5cGUiLCAgICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYodHlwZSksICAgICAgUk99LAorICAgIHsiYm94dHlwZSIsICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihib3h0eXBlKX0sCisgICAgeyJ4IiwgICAgICAgICAgICAgICBUX0ZMT0FULCAgICAgICAgT0ZGKHgpfSwKKyAgICB7InkiLCAgICAgICAgICAgICAgIFRfRkxPQVQsICAgICAgICBPRkYoeSl9LAorICAgIHsidyIsICAgICAgICAgICAgICAgVF9GTE9BVCwgICAgICAgIE9GRih3KX0sCisgICAgeyJoIiwgICAgICAgICAgICAgICBUX0ZMT0FULCAgICAgICAgT0ZGKGgpfSwKKyAgICB7ImNvbDEiLCAgICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoY29sMSl9LAorICAgIHsiY29sMiIsICAgICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihjb2wyKX0sCisgICAgeyJhbGlnbiIsICAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGFsaWduKX0sCisgICAgeyJsY29sIiwgICAgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGxjb2wpfSwKKyAgICB7ImxzaXplIiwgICAgICAgICAgIFRfRkxPQVQsICAgICAgICBPRkYobHNpemUpfSwKKyAgICAvKiAibGFiZWwiIGlzIHRyZWF0ZWQgc3BlY2lhbGx5ISAqLworICAgIHsibHN0eWxlIiwgICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihsc3R5bGUpfSwKKyAgICB7InB1c2hlZCIsICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYocHVzaGVkKSwgICAgUk99LAorICAgIHsiZm9jdXMiLCAgICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihmb2N1cyksICAgICBST30sCisgICAgeyJiZWxvd21vdXNlIiwgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGJlbG93bW91c2UpLFJPfSwKKy8qICAgICAgeyJmcm96ZW4iLCAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoZnJvemVuKSwgICAgUk99LCAgICAqLworICAgIHsiYWN0aXZlIiwgICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihhY3RpdmUpfSwKKyAgICB7ImlucHV0IiwgICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoaW5wdXQpfSwKKyAgICB7InZpc2libGUiLCAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYodmlzaWJsZSksICAgUk99LAorICAgIHsicmFkaW8iLCAgICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihyYWRpbyl9LAorICAgIHsiYXV0b21hdGljIiwgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihhdXRvbWF0aWMpfSwKKyAgICB7TlVMTH0gICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogI3VuZGVmIE9GRgpAQCAtMzA3LDk5ICszMDcsOTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZW5lcmljX2dldGF0dHIoZ2VuZXJpY29iamVjdCAqZywgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqbWV0aDsKKyAgICBQeU9iamVjdCAqbWV0aDsKIAotCS8qIFhYWCBPdWdodCB0byBzcGVjaWFsLWNhc2UgbmFtZSAiX19tZXRob2RzX18iICovCi0JaWYgKGctPiBvYl9tZXRob2RzKSB7Ci0JCW1ldGggPSBQeV9GaW5kTWV0aG9kKGctPm9iX21ldGhvZHMsIChQeU9iamVjdCAqKWcsIG5hbWUpOwotCQlpZiAobWV0aCAhPSBOVUxMKSByZXR1cm4gbWV0aDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQl9CisgICAgLyogWFhYIE91Z2h0IHRvIHNwZWNpYWwtY2FzZSBuYW1lICJfX21ldGhvZHNfXyIgKi8KKyAgICBpZiAoZy0+IG9iX21ldGhvZHMpIHsKKyAgICAgICAgbWV0aCA9IFB5X0ZpbmRNZXRob2QoZy0+b2JfbWV0aG9kcywgKFB5T2JqZWN0ICopZywgbmFtZSk7CisgICAgICAgIGlmIChtZXRoICE9IE5VTEwpIHJldHVybiBtZXRoOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KIAotCW1ldGggPSBQeV9GaW5kTWV0aG9kKGdlbmVyaWNfbWV0aG9kcywgKFB5T2JqZWN0ICopZywgbmFtZSk7Ci0JaWYgKG1ldGggIT0gTlVMTCkKLQkJcmV0dXJuIG1ldGg7Ci0JUHlFcnJfQ2xlYXIoKTsKKyAgICBtZXRoID0gUHlfRmluZE1ldGhvZChnZW5lcmljX21ldGhvZHMsIChQeU9iamVjdCAqKWcsIG5hbWUpOworICAgIGlmIChtZXRoICE9IE5VTEwpCisgICAgICAgIHJldHVybiBtZXRoOworICAgIFB5RXJyX0NsZWFyKCk7CiAKLQkvKiAibGFiZWwiIGlzIGFuIGV4Y2VwdGlvbiwgZ2V0bWVtYmVyIG9ubHkgd29ya3MgZm9yIGNoYXIgcG9pbnRlcnMsCi0JICAgbm90IGZvciBjaGFyIGFycmF5cyAqLwotCWlmIChzdHJjbXAobmFtZSwgImxhYmVsIikgPT0gMCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZy0+b2JfZ2VuZXJpYy0+bGFiZWwpOworICAgIC8qICJsYWJlbCIgaXMgYW4gZXhjZXB0aW9uLCBnZXRtZW1iZXIgb25seSB3b3JrcyBmb3IgY2hhciBwb2ludGVycywKKyAgICAgICBub3QgZm9yIGNoYXIgYXJyYXlzICovCisgICAgaWYgKHN0cmNtcChuYW1lLCAibGFiZWwiKSA9PSAwKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhnLT5vYl9nZW5lcmljLT5sYWJlbCk7CiAKLQlyZXR1cm4gUHlNZW1iZXJfR2V0KChjaGFyICopZy0+b2JfZ2VuZXJpYywgZ2VuZXJpY19tZW1iZXJsaXN0LCBuYW1lKTsKKyAgICByZXR1cm4gUHlNZW1iZXJfR2V0KChjaGFyICopZy0+b2JfZ2VuZXJpYywgZ2VuZXJpY19tZW1iZXJsaXN0LCBuYW1lKTsKIH0KIAogc3RhdGljIGludAogZ2VuZXJpY19zZXRhdHRyKGdlbmVyaWNvYmplY3QgKmcsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewotCWludCByZXQ7CisgICAgaW50IHJldDsKIAotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3QgZGVsZXRlIGZvcm1zIG9iamVjdCBhdHRyaWJ1dGVzIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRlbGV0ZSBmb3JtcyBvYmplY3QgYXR0cmlidXRlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogImxhYmVsIiBpcyBhbiBleGNlcHRpb246IHNldG1lbWJlciBkb2Vzbid0IHNldCBzdHJpbmdzOwotCSAgIGFuZCBGT1JNUyB3YW50cyB5b3UgdG8gY2FsbCBhIGZ1bmN0aW9uIHRvIHNldCB0aGUgbGFiZWwgKi8KLQlpZiAoc3RyY21wKG5hbWUsICJsYWJlbCIpID09IDApIHsKLQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImxhYmVsIGF0dHIgbXVzdCBiZSBzdHJpbmciKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlmbF9zZXRfb2JqZWN0X2xhYmVsKGctPm9iX2dlbmVyaWMsIFB5U3RyaW5nX0FzU3RyaW5nKHYpKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qICJsYWJlbCIgaXMgYW4gZXhjZXB0aW9uOiBzZXRtZW1iZXIgZG9lc24ndCBzZXQgc3RyaW5nczsKKyAgICAgICBhbmQgRk9STVMgd2FudHMgeW91IHRvIGNhbGwgYSBmdW5jdGlvbiB0byBzZXQgdGhlIGxhYmVsICovCisgICAgaWYgKHN0cmNtcChuYW1lLCAibGFiZWwiKSA9PSAwKSB7CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhYmVsIGF0dHIgbXVzdCBiZSBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmbF9zZXRfb2JqZWN0X2xhYmVsKGctPm9iX2dlbmVyaWMsIFB5U3RyaW5nX0FzU3RyaW5nKHYpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JcmV0ID0gUHlNZW1iZXJfU2V0KChjaGFyICopZy0+b2JfZ2VuZXJpYywgZ2VuZXJpY19tZW1iZXJsaXN0LCBuYW1lLCB2KTsKKyAgICByZXQgPSBQeU1lbWJlcl9TZXQoKGNoYXIgKilnLT5vYl9nZW5lcmljLCBnZW5lcmljX21lbWJlcmxpc3QsIG5hbWUsIHYpOwogCi0JLyogUmF0aGVyIHRoYW4gY2FsbGluZyBhbGwgdGhlIHZhcmlvdXMgc2V0X29iamVjdF8qIGZ1bmN0aW9ucywKLQkgICB3ZSBjYWxsIGZsX3JlZHJhd19vYmplY3QgaGVyZS4gIFRoaXMgaXMgc29tZXRpbWVzIHJlZHVuZGFudAotCSAgIGJ1dCBJIGRvdWJ0IHRoYXQncyBhIGJpZyBwcm9ibGVtICovCi0JaWYgKHJldCA9PSAwKQotCQlmbF9yZWRyYXdfb2JqZWN0KGctPm9iX2dlbmVyaWMpOworICAgIC8qIFJhdGhlciB0aGFuIGNhbGxpbmcgYWxsIHRoZSB2YXJpb3VzIHNldF9vYmplY3RfKiBmdW5jdGlvbnMsCisgICAgICAgd2UgY2FsbCBmbF9yZWRyYXdfb2JqZWN0IGhlcmUuICBUaGlzIGlzIHNvbWV0aW1lcyByZWR1bmRhbnQKKyAgICAgICBidXQgSSBkb3VidCB0aGF0J3MgYSBiaWcgcHJvYmxlbSAqLworICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgZmxfcmVkcmF3X29iamVjdChnLT5vYl9nZW5lcmljKTsKIAotCXJldHVybiByZXQ7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbmVyaWNfcmVwcihnZW5lcmljb2JqZWN0ICpnKQogewotCWNoYXIgYnVmWzEwMF07Ci0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiPEZPUk1TX29iamVjdCBhdCAlcCwgb2JqY2xhc3M9JWQ+IiwKLQkJICAgICAgZywgZy0+b2JfZ2VuZXJpYy0+b2JqY2xhc3MpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICI8Rk9STVNfb2JqZWN0IGF0ICVwLCBvYmpjbGFzcz0lZD4iLAorICAgICAgICAgICAgICAgICAgZywgZy0+b2JfZ2VuZXJpYy0+b2JqY2xhc3MpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgR2VuZXJpY09iamVjdHR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJmbC5GT1JNU19vYmplY3QiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoZ2VuZXJpY29iamVjdCksCQkvKnRwX3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilnZW5lcmljX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JMCwJCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWdlbmVyaWNfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpZ2VuZXJpY19zZXRhdHRyLAkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKWdlbmVyaWNfcmVwciwJCS8qdHBfcmVwciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJmbC5GT1JNU19vYmplY3QiLCAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKGdlbmVyaWNvYmplY3QpLCAgICAgICAgICAgICAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZ2VuZXJpY19kZWFsbG9jLCAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpZ2VuZXJpY19nZXRhdHRyLCAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYylnZW5lcmljX3NldGF0dHIsICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpZ2VuZXJpY19yZXByLCAgICAgICAgICAgICAvKnRwX3JlcHIqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2dlbmVyaWNvYmplY3QoRkxfT0JKRUNUICpnZW5lcmljLCBQeU1ldGhvZERlZiAqbWV0aG9kcykKIHsKLQlnZW5lcmljb2JqZWN0ICpnOwotCWcgPSBQeU9iamVjdF9OZXcoZ2VuZXJpY29iamVjdCwgJkdlbmVyaWNPYmplY3R0eXBlKTsKLQlpZiAoZyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlnLT4gb2JfZ2VuZXJpYyA9IGdlbmVyaWM7Ci0JZy0+b2JfbWV0aG9kcyA9IG1ldGhvZHM7Ci0JZy0+b2JfY2FsbGJhY2sgPSBOVUxMOwotCWctPm9iX2NhbGxiYWNrX2FyZyA9IE5VTEw7Ci0Ja25vd2dlbmVyaWMoZyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWc7CisgICAgZ2VuZXJpY29iamVjdCAqZzsKKyAgICBnID0gUHlPYmplY3RfTmV3KGdlbmVyaWNvYmplY3QsICZHZW5lcmljT2JqZWN0dHlwZSk7CisgICAgaWYgKGcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZy0+IG9iX2dlbmVyaWMgPSBnZW5lcmljOworICAgIGctPm9iX21ldGhvZHMgPSBtZXRob2RzOworICAgIGctPm9iX2NhbGxiYWNrID0gTlVMTDsKKyAgICBnLT5vYl9jYWxsYmFja19hcmcgPSBOVUxMOworICAgIGtub3dnZW5lcmljKGcpOworICAgIHJldHVybiAoUHlPYmplY3QgKilnOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQwOSw3MCArNDA5LDcwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19JTmYgKHZvaWQgKCpmdW5jKShGTF9PQkpFQ1QgKiwgZmxvYXQpLCBGTF9PQkpFQ1QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgcGFyYW1ldGVyOworICAgIGZsb2F0IHBhcmFtZXRlcjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImYiLCAmcGFyYW1ldGVyKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiZiIsICZwYXJhbWV0ZXIpKSByZXR1cm4gTlVMTDsKIAotCSgqZnVuYykgKG9iaiwgcGFyYW1ldGVyKTsKKyAgICAoKmZ1bmMpIChvYmosIHBhcmFtZXRlcik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZ1bmMgKG9iamVjdCwgZmxvYXQpICovCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19JTmZJTmYgKHZvaWQgKCpmdW5jKShGTF9PQkpFQ1QgKiwgZmxvYXQsIGZsb2F0KSwgRkxfT0JKRUNUICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IHBhcjEsIHBhcjI7CisgICAgZmxvYXQgcGFyMSwgcGFyMjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihmZikiLCAmcGFyMSwgJnBhcjIpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoZmYpIiwgJnBhcjEsICZwYXIyKSkgcmV0dXJuIE5VTEw7CiAKLQkoKmZ1bmMpIChvYmosIHBhcjEsIHBhcjIpOworICAgICgqZnVuYykgKG9iaiwgcGFyMSwgcGFyMik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZ1bmMgKG9iamVjdCwgaW50KSAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfSU5pICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGludCksIEZMX09CSkVDVCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcGFyYW1ldGVyOworICAgIGludCBwYXJhbWV0ZXI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJnBhcmFtZXRlcikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmcGFyYW1ldGVyKSkgcmV0dXJuIE5VTEw7CiAKLQkoKmZ1bmMpIChvYmosIHBhcmFtZXRlcik7CisgICAgKCpmdW5jKSAob2JqLCBwYXJhbWV0ZXIpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBmdW5jIChvYmplY3QsIGNoYXIpICovCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19JTmMgKHZvaWQgKCpmdW5jKShGTF9PQkpFQ1QgKiwgaW50KSwgRkxfT0JKRUNUICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmE7CisgICAgY2hhciAqYTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgInMiLCAmYSkpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgInMiLCAmYSkpIHJldHVybiBOVUxMOwogCi0JKCpmdW5jKSAob2JqLCBhWzBdKTsKKyAgICAoKmZ1bmMpIChvYmosIGFbMF0pOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBmdW5jIChvYmplY3QsIHN0cmluZykgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Zvcm1zX0lOc3RyICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGNoYXIgKiksIEZMX09CSkVDVCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICphOworICAgIGNoYXIgKmE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJzIiwgJmEpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJzIiwgJmEpKSByZXR1cm4gTlVMTDsKIAotCSgqZnVuYykgKG9iaiwgYSk7CisgICAgKCpmdW5jKSAob2JqLCBhKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtNDgwLDE1ICs0ODAsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Zvcm1zX0lOaUlOc3RyICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGludCwgY2hhciAqKSwgRkxfT0JKRUNUICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmI7Ci0JaW50IGE7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlzKSIsICZhLCAmYikpIHJldHVybiBOVUxMOwotCQotCSgqZnVuYykgKG9iaiwgYSwgYik7Ci0JCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNoYXIgKmI7CisgICAgaW50IGE7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaXMpIiwgJmEsICZiKSkgcmV0dXJuIE5VTEw7CisKKyAgICAoKmZ1bmMpIChvYmosIGEsIGIpOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAjaWZkZWYgVU5VU0VECkBAIC00OTYsMTQgKzQ5NiwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZm9ybXNfSU5pSU5pICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGludCwgaW50KSwgRkxfT0JKRUNUICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCWludCBwYXIxLCBwYXIyOwotCQotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmcGFyMSwgJnBhcjIpKSByZXR1cm4gTlVMTDsKLQkKLQkoKmZ1bmMpIChvYmosIHBhcjEsIHBhcjIpOwotCQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgcGFyMSwgcGFyMjsKKworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmcGFyMSwgJnBhcjIpKSByZXR1cm4gTlVMTDsKKworICAgICgqZnVuYykgKG9iaiwgcGFyMSwgcGFyMik7CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYKIApAQCAtNTExLDU4ICs1MTEsNTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Zvcm1zX1JpIChpbnQgKCpmdW5jKShGTF9PQkpFQ1QgKiksIEZMX09CSkVDVCAqb2JqKQogewotCWludCByZXR2YWw7CisgICAgaW50IHJldHZhbDsKIAotCXJldHZhbCA9ICgqZnVuYykgKG9iaik7CisgICAgcmV0dmFsID0gKCpmdW5jKSAob2JqKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyAoKGxvbmcpIHJldHZhbCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nICgobG9uZykgcmV0dmFsKTsKIH0KIAogLyogY2hhciAqIGZ1bmMgKG9iamVjdCkgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Zvcm1zX1JzdHIgKGNoYXIgKiAoKmZ1bmMpKEZMX09CSkVDVCAqKSwgRkxfT0JKRUNUICpvYmopCiB7Ci0JY2hhciAqc3RyOworICAgIGNoYXIgKnN0cjsKIAotCXN0ciA9ICgqZnVuYykgKG9iaik7CisgICAgc3RyID0gKCpmdW5jKSAob2JqKTsKIAotCWlmIChzdHIgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyAoc3RyKTsKKyAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcgKHN0cik7CiB9CiAKIC8qIGludCBmdW5jIChvYmplY3QpICovCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19SZiAoZmxvYXQgKCpmdW5jKShGTF9PQkpFQ1QgKiksIEZMX09CSkVDVCAqb2JqKQogewotCWZsb2F0IHJldHZhbDsKKyAgICBmbG9hdCByZXR2YWw7CiAKLQlyZXR2YWwgPSAoKmZ1bmMpIChvYmopOworICAgIHJldHZhbCA9ICgqZnVuYykgKG9iaik7CiAKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlIChyZXR2YWwpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUgKHJldHZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX2Zvcm1zX09VVGZPVVRmICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGZsb2F0ICosIGZsb2F0ICopLCBGTF9PQkpFQ1QgKm9iaikKIHsKLQlmbG9hdCBmMSwgZjI7CisgICAgZmxvYXQgZjEsIGYyOwogCi0JKCpmdW5jKSAob2JqLCAmZjEsICZmMik7CisgICAgKCpmdW5jKSAob2JqLCAmZjEsICZmMik7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsIGYxLCBmMik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZikiLCBmMSwgZjIpOwogfQogCiAjaWZkZWYgVU5VU0VECiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9mb3Jtc19PVVRmICh2b2lkICgqZnVuYykoRkxfT0JKRUNUICosIGZsb2F0ICopLCBGTF9PQkpFQ1QgKm9iaikKIHsKLQlmbG9hdCBmOworICAgIGZsb2F0IGY7CiAKLQkoKmZ1bmMpIChvYmosICZmKTsKKyAgICAoKmZ1bmMpIChvYmosICZmKTsKIAotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUgKGYpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUgKGYpOwogfQogI2VuZGlmCiAKQEAgLTU3MiwxNzIgKzU3MiwxNzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfYnJvd3Nlcl90b3BsaW5lKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2Jyb3dzZXJfdG9wbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2Jyb3dzZXJfdG9wbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xlYXJfYnJvd3NlcihnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwgKGcsIGZsX2NsZWFyX2Jyb3dzZXIpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwgKGcsIGZsX2NsZWFyX2Jyb3dzZXIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWRkX2Jyb3dzZXJfbGluZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX2FkZF9icm93c2VyX2xpbmUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfYWRkX2Jyb3dzZXJfbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWRkdG9fYnJvd3NlciAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX2FkZHRvX2Jyb3dzZXIsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfYWRkdG9fYnJvd3NlciwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zZXJ0X2Jyb3dzZXJfbGluZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pSU5zdHIgKGZsX2luc2VydF9icm93c2VyX2xpbmUsCi0JCQkJICAgIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmlJTnN0ciAoZmxfaW5zZXJ0X2Jyb3dzZXJfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVsZXRlX2Jyb3dzZXJfbGluZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9kZWxldGVfYnJvd3Nlcl9saW5lLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9kZWxldGVfYnJvd3Nlcl9saW5lLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXBsYWNlX2Jyb3dzZXJfbGluZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pSU5zdHIgKGZsX3JlcGxhY2VfYnJvd3Nlcl9saW5lLAotCQkJCSAgICBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pSU5zdHIgKGZsX3JlcGxhY2VfYnJvd3Nlcl9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfYnJvd3Nlcl9saW5lKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBpOwotCWNoYXIgKnN0cjsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpzdHI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0ciA9IGZsX2dldF9icm93c2VyX2xpbmUgKGctPm9iX2dlbmVyaWMsIGkpOworICAgIHN0ciA9IGZsX2dldF9icm93c2VyX2xpbmUgKGctPm9iX2dlbmVyaWMsIGkpOwogCi0JaWYgKHN0ciA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nIChzdHIpOworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyAoc3RyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvYWRfYnJvd3NlciAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JLyogWFhYIHN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXMgd3Jvbmcgc2luY2UgZmxfbG9hZF9icm93c2VyCi0JICAgWFhYIHJldHVybnMgaW50LCBub3Qgdm9pZCAqLwotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9sb2FkX2Jyb3dzZXIsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICAvKiBYWFggc3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpcyB3cm9uZyBzaW5jZSBmbF9sb2FkX2Jyb3dzZXIKKyAgICAgICBYWFggcmV0dXJucyBpbnQsIG5vdCB2b2lkICovCisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX2xvYWRfYnJvd3NlciwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Jyb3dzZXJfbWF4bGluZShnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JpIChmbF9nZXRfYnJvd3Nlcl9tYXhsaW5lLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9icm93c2VyX21heGxpbmUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNlbGVjdF9icm93c2VyX2xpbmUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2VsZWN0X2Jyb3dzZXJfbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2VsZWN0X2Jyb3dzZXJfbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVzZWxlY3RfYnJvd3Nlcl9saW5lIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX2Rlc2VsZWN0X2Jyb3dzZXJfbGluZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfZGVzZWxlY3RfYnJvd3Nlcl9saW5lLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXNlbGVjdF9icm93c2VyIChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBnZW5lcmljX2NhbGwgKGcsIGZsX2Rlc2VsZWN0X2Jyb3dzZXIpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwgKGcsIGZsX2Rlc2VsZWN0X2Jyb3dzZXIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaXNzZWxlY3RlZF9icm93c2VyX2xpbmUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBpLCBqOwotCQotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmaSkpCi0JCXJldHVybiBOVUxMOwotCQotCWogPSBmbF9pc3NlbGVjdGVkX2Jyb3dzZXJfbGluZSAoZy0+b2JfZ2VuZXJpYywgaSk7Ci0JCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nIChqKTsKKyAgICBpbnQgaSwgajsKKworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmaSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaiA9IGZsX2lzc2VsZWN0ZWRfYnJvd3Nlcl9saW5lIChnLT5vYl9nZW5lcmljLCBpKTsKKworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyAoaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfYnJvd3NlciAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X2Jyb3dzZXIsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X2Jyb3dzZXIsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9icm93c2VyX2ZvbnRzaXplIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9icm93c2VyX2ZvbnRzaXplLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfYnJvd3Nlcl9mb250c2l6ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Jyb3dzZXJfZm9udHN0eWxlIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9icm93c2VyX2ZvbnRzdHlsZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2Jyb3dzZXJfZm9udHN0eWxlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfYnJvd3Nlcl9zcGVjaWFsa2V5IChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmMoZmxfc2V0X2Jyb3dzZXJfc3BlY2lhbGtleSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOYyhmbF9zZXRfYnJvd3Nlcl9zcGVjaWFsa2V5LCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBicm93c2VyX21ldGhvZHNbXSA9IHsKLQl7InNldF9icm93c2VyX3RvcGxpbmUiLAkJKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX3RvcGxpbmUsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJjbGVhcl9icm93c2VyIiwJCShQeUNGdW5jdGlvbiljbGVhcl9icm93c2VyLAotCSBNRVRIX05PQVJHU30sCi0JeyJhZGRfYnJvd3Nlcl9saW5lIiwJCShQeUNGdW5jdGlvbilhZGRfYnJvd3Nlcl9saW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsiYWRkdG9fYnJvd3NlciIsCQkoUHlDRnVuY3Rpb24pYWRkdG9fYnJvd3NlciwKLQkgTUVUSF9PTERBUkdTfSwKLQl7Imluc2VydF9icm93c2VyX2xpbmUiLAkJKFB5Q0Z1bmN0aW9uKWluc2VydF9icm93c2VyX2xpbmUsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJkZWxldGVfYnJvd3Nlcl9saW5lIiwJCShQeUNGdW5jdGlvbilkZWxldGVfYnJvd3Nlcl9saW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsicmVwbGFjZV9icm93c2VyX2xpbmUiLAkoUHlDRnVuY3Rpb24pcmVwbGFjZV9icm93c2VyX2xpbmUsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfYnJvd3Nlcl9saW5lIiwJCShQeUNGdW5jdGlvbilnZXRfYnJvd3Nlcl9saW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsibG9hZF9icm93c2VyIiwJCShQeUNGdW5jdGlvbilsb2FkX2Jyb3dzZXIsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfYnJvd3Nlcl9tYXhsaW5lIiwJCShQeUNGdW5jdGlvbilnZXRfYnJvd3Nlcl9tYXhsaW5lLAotCSBNRVRIX05PQVJHUyx9Ci0JeyJzZWxlY3RfYnJvd3Nlcl9saW5lIiwJCShQeUNGdW5jdGlvbilzZWxlY3RfYnJvd3Nlcl9saW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsiZGVzZWxlY3RfYnJvd3Nlcl9saW5lIiwJKFB5Q0Z1bmN0aW9uKWRlc2VsZWN0X2Jyb3dzZXJfbGluZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImRlc2VsZWN0X2Jyb3dzZXIiLAkJKFB5Q0Z1bmN0aW9uKWRlc2VsZWN0X2Jyb3dzZXIsCi0JIE1FVEhfTk9BUkdTLH0KLQl7Imlzc2VsZWN0ZWRfYnJvd3Nlcl9saW5lIiwJKFB5Q0Z1bmN0aW9uKWlzc2VsZWN0ZWRfYnJvd3Nlcl9saW5lLAotCSBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2Jyb3dzZXIiLAkJCShQeUNGdW5jdGlvbilnZXRfYnJvd3NlciwKLQkgTUVUSF9OT0FSR1MsfQotCXsic2V0X2Jyb3dzZXJfZm9udHNpemUiLAkoUHlDRnVuY3Rpb24pc2V0X2Jyb3dzZXJfZm9udHNpemUsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfYnJvd3Nlcl9mb250c3R5bGUiLAkoUHlDRnVuY3Rpb24pc2V0X2Jyb3dzZXJfZm9udHN0eWxlLAotCSBNRVRIX09MREFSR1N9LAotCXsic2V0X2Jyb3dzZXJfc3BlY2lhbGtleSIsCShQeUNGdW5jdGlvbilzZXRfYnJvd3Nlcl9zcGVjaWFsa2V5LAotCSBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9icm93c2VyX3RvcGxpbmUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2Jyb3dzZXJfdG9wbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsZWFyX2Jyb3dzZXIiLCAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pY2xlYXJfYnJvd3NlciwKKyAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiYWRkX2Jyb3dzZXJfbGluZSIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhZGRfYnJvd3Nlcl9saW5lLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkdG9fYnJvd3NlciIsICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilhZGR0b19icm93c2VyLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaW5zZXJ0X2Jyb3dzZXJfbGluZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilpbnNlcnRfYnJvd3Nlcl9saW5lLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVsZXRlX2Jyb3dzZXJfbGluZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilkZWxldGVfYnJvd3Nlcl9saW5lLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVwbGFjZV9icm93c2VyX2xpbmUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilyZXBsYWNlX2Jyb3dzZXJfbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9icm93c2VyX2xpbmUiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2Jyb3dzZXJfbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxvYWRfYnJvd3NlciIsICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pbG9hZF9icm93c2VyLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X2Jyb3dzZXJfbWF4bGluZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfYnJvd3Nlcl9tYXhsaW5lLAorICAgICBNRVRIX05PQVJHUyx9CisgICAgeyJzZWxlY3RfYnJvd3Nlcl9saW5lIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNlbGVjdF9icm93c2VyX2xpbmUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZXNlbGVjdF9icm93c2VyX2xpbmUiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlc2VsZWN0X2Jyb3dzZXJfbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRlc2VsZWN0X2Jyb3dzZXIiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGVzZWxlY3RfYnJvd3NlciwKKyAgICAgTUVUSF9OT0FSR1MsfQorICAgIHsiaXNzZWxlY3RlZF9icm93c2VyX2xpbmUiLCAgICAgICAgIChQeUNGdW5jdGlvbilpc3NlbGVjdGVkX2Jyb3dzZXJfbGluZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9icm93c2VyIiwgICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2Jyb3dzZXIsCisgICAgIE1FVEhfTk9BUkdTLH0KKyAgICB7InNldF9icm93c2VyX2ZvbnRzaXplIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2Jyb3dzZXJfZm9udHNpemUsCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfYnJvd3Nlcl9mb250c3R5bGUiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9icm93c2VyX2ZvbnRzdHlsZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9icm93c2VyX3NwZWNpYWxrZXkiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2Jyb3dzZXJfc3BlY2lhbGtleSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIENsYXNzOiBidXR0b24gKi8KQEAgLTc0NSwzMyArNzQ1LDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2J1dHRvbihnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9idXR0b24sIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9idXR0b24sIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9idXR0b24oZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X2J1dHRvbiwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JpIChmbF9nZXRfYnV0dG9uLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfYnV0dG9uX251bWIoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X2J1dHRvbl9udW1iLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9idXR0b25fbnVtYiwgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2J1dHRvbl9zaG9ydGN1dChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfc2V0X2J1dHRvbl9zaG9ydGN1dCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9zZXRfYnV0dG9uX3Nob3J0Y3V0LCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBidXR0b25fbWV0aG9kc1tdID0gewotCXsic2V0X2J1dHRvbiIsCQkoUHlDRnVuY3Rpb24pc2V0X2J1dHRvbiwgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9idXR0b24iLAkJKFB5Q0Z1bmN0aW9uKWdldF9idXR0b24sIE1FVEhfTk9BUkdTfSwKLQl7ImdldF9idXR0b25fbnVtYiIsCShQeUNGdW5jdGlvbilnZXRfYnV0dG9uX251bWIsIE1FVEhfTk9BUkdTfSwKLQl7InNldF9idXR0b25fc2hvcnRjdXQiLAkoUHlDRnVuY3Rpb24pc2V0X2J1dHRvbl9zaG9ydGN1dCwgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9idXR0b24iLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9idXR0b24sIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfYnV0dG9uIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfYnV0dG9uLCBNRVRIX05PQVJHU30sCisgICAgeyJnZXRfYnV0dG9uX251bWIiLCAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfYnV0dG9uX251bWIsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9idXR0b25fc2hvcnRjdXQiLCAgICAgKFB5Q0Z1bmN0aW9uKXNldF9idXR0b25fc2hvcnRjdXQsIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogQ2xhc3M6IGNob2ljZSAqLwpAQCAtNzc5LDY4ICs3NzksNjggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY2hvaWNlKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2Nob2ljZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2Nob2ljZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Nob2ljZShnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JpIChmbF9nZXRfY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUmkgKGZsX2dldF9jaG9pY2UsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsZWFyX2Nob2ljZSAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gZ2VuZXJpY19jYWxsIChnLCBmbF9jbGVhcl9jaG9pY2UpOworICAgIHJldHVybiBnZW5lcmljX2NhbGwgKGcsIGZsX2NsZWFyX2Nob2ljZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhZGR0b19jaG9pY2UgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9hZGR0b19jaG9pY2UsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTnN0ciAoZmxfYWRkdG9fY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXBsYWNlX2Nob2ljZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pSU5zdHIgKGZsX3JlcGxhY2VfY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pSU5zdHIgKGZsX3JlcGxhY2VfY2hvaWNlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWxldGVfY2hvaWNlIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX2RlbGV0ZV9jaG9pY2UsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX2RlbGV0ZV9jaG9pY2UsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9jaG9pY2VfdGV4dCAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19Sc3RyIChmbF9nZXRfY2hvaWNlX3RleHQsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19Sc3RyIChmbF9nZXRfY2hvaWNlX3RleHQsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jaG9pY2VfZm9udHNpemUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X2Nob2ljZV9mb250c2l6ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X2Nob2ljZV9mb250c2l6ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2Nob2ljZV9mb250c3R5bGUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2Nob2ljZV9mb250c3R5bGUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmkgKGZsX3NldF9jaG9pY2VfZm9udHN0eWxlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjaG9pY2VfbWV0aG9kc1tdID0gewotCXsic2V0X2Nob2ljZSIsCQkoUHlDRnVuY3Rpb24pc2V0X2Nob2ljZSwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2Nob2ljZSIsCQkoUHlDRnVuY3Rpb24pZ2V0X2Nob2ljZSwgICAgICBNRVRIX05PQVJHU30sCi0JeyJjbGVhcl9jaG9pY2UiLAkoUHlDRnVuY3Rpb24pY2xlYXJfY2hvaWNlLCAgICBNRVRIX05PQVJHU30sCi0JeyJhZGR0b19jaG9pY2UiLAkoUHlDRnVuY3Rpb24pYWRkdG9fY2hvaWNlLCAgICBNRVRIX09MREFSR1N9LAotCXsicmVwbGFjZV9jaG9pY2UiLAkoUHlDRnVuY3Rpb24pcmVwbGFjZV9jaG9pY2UsICBNRVRIX09MREFSR1N9LAotCXsiZGVsZXRlX2Nob2ljZSIsCShQeUNGdW5jdGlvbilkZWxldGVfY2hvaWNlLCAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfY2hvaWNlX3RleHQiLAkoUHlDRnVuY3Rpb24pZ2V0X2Nob2ljZV90ZXh0LCBNRVRIX05PQVJHU30sCi0JeyJzZXRfY2hvaWNlX2ZvbnRzaXplIiwgKFB5Q0Z1bmN0aW9uKXNldF9jaG9pY2VfZm9udHNpemUsIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfY2hvaWNlX2ZvbnRzdHlsZSIsKFB5Q0Z1bmN0aW9uKXNldF9jaG9pY2VfZm9udHN0eWxlLCBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsic2V0X2Nob2ljZSIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2Nob2ljZSwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X2Nob2ljZSIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2Nob2ljZSwgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJjbGVhcl9jaG9pY2UiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbiljbGVhcl9jaG9pY2UsICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImFkZHRvX2Nob2ljZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFkZHRvX2Nob2ljZSwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlcGxhY2VfY2hvaWNlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXJlcGxhY2VfY2hvaWNlLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRlbGV0ZV9jaG9pY2UiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRlbGV0ZV9jaG9pY2UsICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9jaG9pY2VfdGV4dCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9jaG9pY2VfdGV4dCwgTUVUSF9OT0FSR1N9LAorICAgIHsic2V0X2Nob2ljZV9mb250c2l6ZSIsIChQeUNGdW5jdGlvbilzZXRfY2hvaWNlX2ZvbnRzaXplLCBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2Nob2ljZV9mb250c3R5bGUiLChQeUNGdW5jdGlvbilzZXRfY2hvaWNlX2ZvbnRzdHlsZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBDbGFzcyA6IENsb2NrICovCkBAIC04NDgsMTYgKzg0OCwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9jbG9jayhnZW5lcmljb2JqZWN0ICpnKQogewotCWludCBpMCwgaTEsIGkyOworICAgIGludCBpMCwgaTEsIGkyOwogCi0JZmxfZ2V0X2Nsb2NrIChnLT5vYl9nZW5lcmljLCAmaTAsICZpMSwgJmkyKTsKKyAgICBmbF9nZXRfY2xvY2sgKGctPm9iX2dlbmVyaWMsICZpMCwgJmkxLCAmaTIpOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWkpIiwgaTAsIGkxLCBpMik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWkpIiwgaTAsIGkxLCBpMik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjbG9ja19tZXRob2RzW10gPSB7Ci0JeyJnZXRfY2xvY2siLAkJKFB5Q0Z1bmN0aW9uKWdldF9jbG9jaywgTUVUSF9OT0FSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiZ2V0X2Nsb2NrIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2Nsb2NrLCBNRVRIX05PQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogQ0xhc3MgOiBDb3VudGVycyAqLwpAQCAtODY1LDUzICs4NjUsNTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY291bnRlcl92YWx1ZShnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfY291bnRlcl92YWx1ZSwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfY291bnRlcl92YWx1ZSwgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvdW50ZXJfdmFsdWUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X2NvdW50ZXJfdmFsdWUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9jb3VudGVyX3ZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY291bnRlcl9wcmVjaXNpb24gKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2NvdW50ZXJfcHJlY2lzaW9uLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfY291bnRlcl9wcmVjaXNpb24sIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jb3VudGVyX2JvdW5kcyAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfY291bnRlcl9ib3VuZHMsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmZJTmYgKGZsX3NldF9jb3VudGVyX2JvdW5kcywgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2NvdW50ZXJfc3RlcCAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfY291bnRlcl9zdGVwLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfY291bnRlcl9zdGVwLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY291bnRlcl9yZXR1cm4gKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X2NvdW50ZXJfcmV0dXJuLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfY291bnRlcl9yZXR1cm4sIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGNvdW50ZXJfbWV0aG9kc1tdID0gewotCXsic2V0X2NvdW50ZXJfdmFsdWUiLAkJKFB5Q0Z1bmN0aW9uKXNldF9jb3VudGVyX3ZhbHVlLAotCSBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2NvdW50ZXJfdmFsdWUiLAkJKFB5Q0Z1bmN0aW9uKWdldF9jb3VudGVyX3ZhbHVlLAotCSBNRVRIX05PQVJHU30sCi0JeyJzZXRfY291bnRlcl9ib3VuZHMiLAkJKFB5Q0Z1bmN0aW9uKXNldF9jb3VudGVyX2JvdW5kcywKLQkgTUVUSF9PTERBUkdTfSwKLQl7InNldF9jb3VudGVyX3N0ZXAiLAkJKFB5Q0Z1bmN0aW9uKXNldF9jb3VudGVyX3N0ZXAsCi0JIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfY291bnRlcl9wcmVjaXNpb24iLAkoUHlDRnVuY3Rpb24pc2V0X2NvdW50ZXJfcHJlY2lzaW9uLAotCSBNRVRIX09MREFSR1N9LAotCXsic2V0X2NvdW50ZXJfcmV0dXJuIiwJCShQeUNGdW5jdGlvbilzZXRfY291bnRlcl9yZXR1cm4sCi0JIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsic2V0X2NvdW50ZXJfdmFsdWUiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfY291bnRlcl92YWx1ZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9jb3VudGVyX3ZhbHVlIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2NvdW50ZXJfdmFsdWUsCisgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9jb3VudGVyX2JvdW5kcyIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2NvdW50ZXJfYm91bmRzLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2NvdW50ZXJfc3RlcCIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfY291bnRlcl9zdGVwLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2NvdW50ZXJfcHJlY2lzaW9uIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfY291bnRlcl9wcmVjaXNpb24sCisgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfY291bnRlcl9yZXR1cm4iLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9jb3VudGVyX3JldHVybiwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtOTIwLDQwICs5MjAsNDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfZGlhbF92YWx1ZShnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfZGlhbF92YWx1ZSwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfZGlhbF92YWx1ZSwgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpYWxfdmFsdWUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X2RpYWxfdmFsdWUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9kaWFsX3ZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZGlhbF9ib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X2RpYWxfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfZGlhbF9ib3VuZHMsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9kaWFsX2JvdW5kcyAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19PVVRmT1VUZiAoZmxfZ2V0X2RpYWxfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfT1VUZk9VVGYgKGZsX2dldF9kaWFsX2JvdW5kcywgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpYWxfc3RlcCAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfZGlhbF9zdGVwLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfZGlhbF9zdGVwLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkaWFsX21ldGhvZHNbXSA9IHsKLQl7InNldF9kaWFsX3ZhbHVlIiwJKFB5Q0Z1bmN0aW9uKXNldF9kaWFsX3ZhbHVlLCAgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9kaWFsX3ZhbHVlIiwJKFB5Q0Z1bmN0aW9uKWdldF9kaWFsX3ZhbHVlLCAgTUVUSF9OT0FSR1N9LAotCXsic2V0X2RpYWxfYm91bmRzIiwJKFB5Q0Z1bmN0aW9uKXNldF9kaWFsX2JvdW5kcywgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9kaWFsX2JvdW5kcyIsCShQeUNGdW5jdGlvbilnZXRfZGlhbF9ib3VuZHMsIE1FVEhfTk9BUkdTfSwKLQl7InNldF9kaWFsX3N0ZXAiLAkoUHlDRnVuY3Rpb24pc2V0X2RpYWxfc3RlcCwgICBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsic2V0X2RpYWxfdmFsdWUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2RpYWxfdmFsdWUsICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X2RpYWxfdmFsdWUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X2RpYWxfdmFsdWUsICBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfZGlhbF9ib3VuZHMiLCAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfZGlhbF9ib3VuZHMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfZGlhbF9ib3VuZHMiLCAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfZGlhbF9ib3VuZHMsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9kaWFsX3N0ZXAiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9kaWFsX3N0ZXAsICAgTUVUSF9PTERBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBDbGFzcyA6IElucHV0ICovCkBAIC05NjEsMzMgKzk2MSwzMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pbnB1dCAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX3NldF9pbnB1dCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9zZXRfaW5wdXQsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9pbnB1dCAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19Sc3RyIChmbF9nZXRfaW5wdXQsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19Sc3RyIChmbF9nZXRfaW5wdXQsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pbnB1dF9jb2xvciAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfaW5wdXRfY29sb3IsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmZJTmYgKGZsX3NldF9pbnB1dF9jb2xvciwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2lucHV0X3JldHVybiAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfaW5wdXRfcmV0dXJuLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfaW5wdXRfcmV0dXJuLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBpbnB1dF9tZXRob2RzW10gPSB7Ci0JeyJzZXRfaW5wdXQiLAkJKFB5Q0Z1bmN0aW9uKXNldF9pbnB1dCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfaW5wdXQiLAkJKFB5Q0Z1bmN0aW9uKWdldF9pbnB1dCwgICAgICAgIE1FVEhfTk9BUkdTfSwKLQl7InNldF9pbnB1dF9jb2xvciIsCShQeUNGdW5jdGlvbilzZXRfaW5wdXRfY29sb3IsICBNRVRIX09MREFSR1N9LAotCXsic2V0X2lucHV0X3JldHVybiIsCShQeUNGdW5jdGlvbilzZXRfaW5wdXRfcmV0dXJuLCBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsic2V0X2lucHV0IiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lucHV0LCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9pbnB1dCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9pbnB1dCwgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9pbnB1dF9jb2xvciIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pbnB1dF9jb2xvciwgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfaW5wdXRfcmV0dXJuIiwgICAgICAgIChQeUNGdW5jdGlvbilzZXRfaW5wdXRfcmV0dXJuLCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtOTk2LDM1ICs5OTYsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfbWVudSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX3NldF9tZW51LCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX3NldF9tZW51LCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfbWVudSAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQkvKiBYWFggc3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpcyB3cm9uZyBzaW5jZSBmbF9nZXRfbWVudQotCSAgIFhYWCByZXR1cm5zIGxvbmcsIG5vdCBpbnQgKi8KLQlyZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X21lbnUsIGctPiBvYl9nZW5lcmljKTsKKyAgICAvKiBYWFggc3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpcyB3cm9uZyBzaW5jZSBmbF9nZXRfbWVudQorICAgICAgIFhYWCByZXR1cm5zIGxvbmcsIG5vdCBpbnQgKi8KKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SaSAoZmxfZ2V0X21lbnUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9tZW51X3RleHQgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUnN0ciAoZmxfZ2V0X21lbnVfdGV4dCwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JzdHIgKGZsX2dldF9tZW51X3RleHQsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGFkZHRvX21lbnUgKGdlbmVyaWNvYmplY3QgKmcsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2Zvcm1zX0lOc3RyIChmbF9hZGR0b19tZW51LCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5zdHIgKGZsX2FkZHRvX21lbnUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIG1lbnVfbWV0aG9kc1tdID0gewotCXsic2V0X21lbnUiLAkJKFB5Q0Z1bmN0aW9uKXNldF9tZW51LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRfbWVudSIsCQkoUHlDRnVuY3Rpb24pZ2V0X21lbnUsICAgICAgTUVUSF9OT0FSR1N9LAotCXsiZ2V0X21lbnVfdGV4dCIsCShQeUNGdW5jdGlvbilnZXRfbWVudV90ZXh0LCBNRVRIX05PQVJHU30sCi0JeyJhZGR0b19tZW51IiwJCShQeUNGdW5jdGlvbilhZGR0b19tZW51LCAgICBNRVRIX09MREFSR1N9LAotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsic2V0X21lbnUiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X21lbnUsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF9tZW51IiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9tZW51LCAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldF9tZW51X3RleHQiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9tZW51X3RleHQsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImFkZHRvX21lbnUiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWFkZHRvX21lbnUsICAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0xMDMzLDEzMiArMTAzMywxMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfc2xpZGVyX3ZhbHVlKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmYgKGZsX2dldF9zbGlkZXJfdmFsdWUsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X3NsaWRlcl92YWx1ZSwgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3NsaWRlcl92YWx1ZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfc2xpZGVyX3ZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfc2xpZGVyX3ZhbHVlLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc2xpZGVyX2JvdW5kcyAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfc2xpZGVyX2JvdW5kcywgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X3NsaWRlcl9ib3VuZHMsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9zbGlkZXJfYm91bmRzIChnZW5lcmljb2JqZWN0ICpnKQogewotCXJldHVybiBjYWxsX2Zvcm1zX09VVGZPVVRmKGZsX2dldF9zbGlkZXJfYm91bmRzLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfT1VUZk9VVGYoZmxfZ2V0X3NsaWRlcl9ib3VuZHMsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9zbGlkZXJfcmV0dXJuIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9zbGlkZXJfcmV0dXJuLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfc2xpZGVyX3JldHVybiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3NsaWRlcl9zaXplIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9zbGlkZXJfc2l6ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3NsaWRlcl9zaXplLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc2xpZGVyX3ByZWNpc2lvbiAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5pIChmbF9zZXRfc2xpZGVyX3ByZWNpc2lvbiwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOaSAoZmxfc2V0X3NsaWRlcl9wcmVjaXNpb24sIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9zbGlkZXJfc3RlcCAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfc2xpZGVyX3N0ZXAsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9zbGlkZXJfc3RlcCwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzbGlkZXJfbWV0aG9kc1tdID0gewotCXsic2V0X3NsaWRlcl92YWx1ZSIsCShQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3ZhbHVlLCAgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9zbGlkZXJfdmFsdWUiLAkoUHlDRnVuY3Rpb24pZ2V0X3NsaWRlcl92YWx1ZSwgIE1FVEhfTk9BUkdTfSwKLQl7InNldF9zbGlkZXJfYm91bmRzIiwJKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfYm91bmRzLCBNRVRIX09MREFSR1N9LAotCXsiZ2V0X3NsaWRlcl9ib3VuZHMiLAkoUHlDRnVuY3Rpb24pZ2V0X3NsaWRlcl9ib3VuZHMsIE1FVEhfTk9BUkdTfSwKLQl7InNldF9zbGlkZXJfcmV0dXJuIiwJKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfcmV0dXJuLCBNRVRIX09MREFSR1N9LAotCXsic2V0X3NsaWRlcl9zaXplIiwJKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfc2l6ZSwgICBNRVRIX09MREFSR1N9LAotCXsic2V0X3NsaWRlcl9wcmVjaXNpb24iLChQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3ByZWNpc2lvbiwgTUVUSF9PTERBUkdTfSwKLQl7InNldF9zbGlkZXJfc3RlcCIsCShQeUNGdW5jdGlvbilzZXRfc2xpZGVyX3N0ZXAsICAgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF9zbGlkZXJfdmFsdWUiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfdmFsdWUsICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X3NsaWRlcl92YWx1ZSIsICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X3NsaWRlcl92YWx1ZSwgIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9zbGlkZXJfYm91bmRzIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfYm91bmRzLCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X3NsaWRlcl9ib3VuZHMiLCAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X3NsaWRlcl9ib3VuZHMsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNldF9zbGlkZXJfcmV0dXJuIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfcmV0dXJuLCBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X3NsaWRlcl9zaXplIiwgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3NsaWRlcl9zaXplLCAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfc2xpZGVyX3ByZWNpc2lvbiIsKFB5Q0Z1bmN0aW9uKXNldF9zbGlkZXJfcHJlY2lzaW9uLCBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X3NsaWRlcl9zdGVwIiwgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3NsaWRlcl9zdGVwLCAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wb3NpdGlvbmVyX3h2YWx1ZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfcG9zaXRpb25lcl94dmFsdWUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9wb3NpdGlvbmVyX3h2YWx1ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3Bvc2l0aW9uZXJfeGJvdW5kcyAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfcG9zaXRpb25lcl94Ym91bmRzLAotCQkJCSAgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X3Bvc2l0aW9uZXJfeGJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wb3NpdGlvbmVyX3l2YWx1ZSAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mIChmbF9zZXRfcG9zaXRpb25lcl95dmFsdWUsIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF9wb3NpdGlvbmVyX3l2YWx1ZSwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3Bvc2l0aW9uZXJfeWJvdW5kcyAoZ2VuZXJpY29iamVjdCAqZywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfSU5mSU5mIChmbF9zZXRfcG9zaXRpb25lcl95Ym91bmRzLAotCQkJCSAgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZklOZiAoZmxfc2V0X3Bvc2l0aW9uZXJfeWJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGctPiBvYl9nZW5lcmljLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9wb3NpdGlvbmVyX3h2YWx1ZSAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19SZiAoZmxfZ2V0X3Bvc2l0aW9uZXJfeHZhbHVlLCBnLT4gb2JfZ2VuZXJpYyk7CisgICAgcmV0dXJuIGNhbGxfZm9ybXNfUmYgKGZsX2dldF9wb3NpdGlvbmVyX3h2YWx1ZSwgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X3Bvc2l0aW9uZXJfeGJvdW5kcyAoZ2VuZXJpY29iamVjdCAqZykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19PVVRmT1VUZiAoZmxfZ2V0X3Bvc2l0aW9uZXJfeGJvdW5kcywgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX09VVGZPVVRmIChmbF9nZXRfcG9zaXRpb25lcl94Ym91bmRzLCBnLT4gb2JfZ2VuZXJpYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcG9zaXRpb25lcl95dmFsdWUgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmYgKGZsX2dldF9wb3NpdGlvbmVyX3l2YWx1ZSwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfcG9zaXRpb25lcl95dmFsdWUsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9wb3NpdGlvbmVyX3lib3VuZHMgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfT1VUZk9VVGYgKGZsX2dldF9wb3NpdGlvbmVyX3lib3VuZHMsIGctPiBvYl9nZW5lcmljKTsKKyAgICByZXR1cm4gY2FsbF9mb3Jtc19PVVRmT1VUZiAoZmxfZ2V0X3Bvc2l0aW9uZXJfeWJvdW5kcywgZy0+IG9iX2dlbmVyaWMpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgcG9zaXRpb25lcl9tZXRob2RzW10gPSB7Ci0JeyJzZXRfcG9zaXRpb25lcl94dmFsdWUiLAkoUHlDRnVuY3Rpb24pc2V0X3Bvc2l0aW9uZXJfeHZhbHVlLAotCSBNRVRIX09MREFSR1N9LAotCXsic2V0X3Bvc2l0aW9uZXJfeXZhbHVlIiwJKFB5Q0Z1bmN0aW9uKXNldF9wb3NpdGlvbmVyX3l2YWx1ZSwKLQkgTUVUSF9PTERBUkdTfSwKLQl7InNldF9wb3NpdGlvbmVyX3hib3VuZHMiLAkoUHlDRnVuY3Rpb24pc2V0X3Bvc2l0aW9uZXJfeGJvdW5kcywKLQkgTUVUSF9PTERBUkdTfSwKLQl7InNldF9wb3NpdGlvbmVyX3lib3VuZHMiLAkoUHlDRnVuY3Rpb24pc2V0X3Bvc2l0aW9uZXJfeWJvdW5kcywKLQkgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9wb3NpdGlvbmVyX3h2YWx1ZSIsCShQeUNGdW5jdGlvbilnZXRfcG9zaXRpb25lcl94dmFsdWUsCi0JIE1FVEhfTk9BUkdTfSwKLQl7ImdldF9wb3NpdGlvbmVyX3l2YWx1ZSIsCShQeUNGdW5jdGlvbilnZXRfcG9zaXRpb25lcl95dmFsdWUsCi0JIE1FVEhfTk9BUkdTfSwKLQl7ImdldF9wb3NpdGlvbmVyX3hib3VuZHMiLAkoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeGJvdW5kcywKLQkgTUVUSF9OT0FSR1N9LAotCXsiZ2V0X3Bvc2l0aW9uZXJfeWJvdW5kcyIsCShQeUNGdW5jdGlvbilnZXRfcG9zaXRpb25lcl95Ym91bmRzLAotCSBNRVRIX05PQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJzZXRfcG9zaXRpb25lcl94dmFsdWUiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9wb3NpdGlvbmVyX3h2YWx1ZSwKKyAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9wb3NpdGlvbmVyX3l2YWx1ZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3Bvc2l0aW9uZXJfeXZhbHVlLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X3Bvc2l0aW9uZXJfeGJvdW5kcyIsICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfcG9zaXRpb25lcl94Ym91bmRzLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X3Bvc2l0aW9uZXJfeWJvdW5kcyIsICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfcG9zaXRpb25lcl95Ym91bmRzLAorICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X3Bvc2l0aW9uZXJfeHZhbHVlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilnZXRfcG9zaXRpb25lcl94dmFsdWUsCisgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldF9wb3NpdGlvbmVyX3l2YWx1ZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeXZhbHVlLAorICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnZXRfcG9zaXRpb25lcl94Ym91bmRzIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9wb3NpdGlvbmVyX3hib3VuZHMsCisgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldF9wb3NpdGlvbmVyX3lib3VuZHMiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pZ2V0X3Bvc2l0aW9uZXJfeWJvdW5kcywKKyAgICAgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIENsYXNzIHRpbWVyICovCkBAIC0xMTY2LDI2ICsxMTY2LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3RpbWVyIChnZW5lcmljb2JqZWN0ICpnLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9mb3Jtc19JTmYgKGZsX3NldF90aW1lciwgZy0+IG9iX2dlbmVyaWMsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX0lOZiAoZmxfc2V0X3RpbWVyLCBnLT4gb2JfZ2VuZXJpYywgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfdGltZXIgKGdlbmVyaWNvYmplY3QgKmcpCiB7Ci0JcmV0dXJuIGNhbGxfZm9ybXNfUmYgKGZsX2dldF90aW1lciwgZy0+IG9iX2dlbmVyaWMpOworICAgIHJldHVybiBjYWxsX2Zvcm1zX1JmIChmbF9nZXRfdGltZXIsIGctPiBvYl9nZW5lcmljKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHRpbWVyX21ldGhvZHNbXSA9IHsKLQl7InNldF90aW1lciIsCQkoUHlDRnVuY3Rpb24pc2V0X3RpbWVyLCBNRVRIX09MREFSR1N9LAotCXsiZ2V0X3RpbWVyIiwJCShQeUNGdW5jdGlvbilnZXRfdGltZXIsIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldF90aW1lciIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF90aW1lciwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldF90aW1lciIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF90aW1lciwgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIEZvcm0gb2JqZWN0cyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUZMX0ZPUk0gKm9iX2Zvcm07CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZMX0ZPUk0gKm9iX2Zvcm07CiB9IGZvcm1vYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRm9ybXR5cGU7CkBAIC0xMTk1LDM3MSArMTE5NSwzNzEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3Nob3dfZm9ybShmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgcGxhY2UsIGJvcmRlcjsKLQljaGFyICpuYW1lOwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaXMpIiwgJnBsYWNlLCAmYm9yZGVyLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWZsX3Nob3dfZm9ybShmLT5vYl9mb3JtLCBwbGFjZSwgYm9yZGVyLCBuYW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IHBsYWNlLCBib3JkZXI7CisgICAgY2hhciAqbmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlzKSIsICZwbGFjZSwgJmJvcmRlciwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbF9zaG93X2Zvcm0oZi0+b2JfZm9ybSwgcGxhY2UsIGJvcmRlciwgbmFtZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9jYWxsKHZvaWQgKCpmdW5jKShGTF9GT1JNICopLCBGTF9GT1JNICpmKQogewotCSgqZnVuYykoZik7CisgICAgKCpmdW5jKShmKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2NhbGxfSU5pSU5pKHZvaWQgKCpmdW5jKShGTF9GT1JNICosIGludCwgaW50KSwgRkxfRk9STSAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGEsIGI7CisgICAgaW50IGEsIGI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJmEsICZiKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZhLCAmYikpIHJldHVybiBOVUxMOwogCi0JKCpmdW5jKShmLCBhLCBiKTsKKyAgICAoKmZ1bmMpKGYsIGEsIGIpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fY2FsbF9JTmZJTmYodm9pZCAoKmZ1bmMpKEZMX0ZPUk0gKiwgZmxvYXQsIGZsb2F0KSwgRkxfRk9STSAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYSwgYjsKKyAgICBmbG9hdCBhLCBiOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGZmKSIsICZhLCAmYikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihmZikiLCAmYSwgJmIpKSByZXR1cm4gTlVMTDsKIAotCSgqZnVuYykoZiwgYSwgYik7CisgICAgKCpmdW5jKShmLCBhLCBiKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2hpZGVfZm9ybShmb3Jtb2JqZWN0ICpmKQogewotCXJldHVybiBmb3JtX2NhbGwoZmxfaGlkZV9mb3JtLCBmLT4gb2JfZm9ybSk7CisgICAgcmV0dXJuIGZvcm1fY2FsbChmbF9oaWRlX2Zvcm0sIGYtPiBvYl9mb3JtKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fcmVkcmF3X2Zvcm0oZm9ybW9iamVjdCAqZikKIHsKLQlyZXR1cm4gZm9ybV9jYWxsKGZsX3JlZHJhd19mb3JtLCBmLT4gb2JfZm9ybSk7CisgICAgcmV0dXJuIGZvcm1fY2FsbChmbF9yZWRyYXdfZm9ybSwgZi0+IG9iX2Zvcm0pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9zZXRfZm9ybV9wb3NpdGlvbihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZm9ybV9jYWxsX0lOaUlOaShmbF9zZXRfZm9ybV9wb3NpdGlvbiwgZi0+IG9iX2Zvcm0sIGFyZ3MpOworICAgIHJldHVybiBmb3JtX2NhbGxfSU5pSU5pKGZsX3NldF9mb3JtX3Bvc2l0aW9uLCBmLT4gb2JfZm9ybSwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX3NldF9mb3JtX3NpemUoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGZvcm1fY2FsbF9JTmlJTmkoZmxfc2V0X2Zvcm1fc2l6ZSwgZi0+IG9iX2Zvcm0sIGFyZ3MpOworICAgIHJldHVybiBmb3JtX2NhbGxfSU5pSU5pKGZsX3NldF9mb3JtX3NpemUsIGYtPiBvYl9mb3JtLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fc2NhbGVfZm9ybShmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZm9ybV9jYWxsX0lOZklOZihmbF9zY2FsZV9mb3JtLCBmLT4gb2JfZm9ybSwgYXJncyk7CisgICAgcmV0dXJuIGZvcm1fY2FsbF9JTmZJTmYoZmxfc2NhbGVfZm9ybSwgZi0+IG9iX2Zvcm0sIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19hZGRfb2JqZWN0KGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzLCBGTF9PQkpFQ1QgKigqZnVuYykoaW50LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgY2hhciopLCBQeU1ldGhvZERlZiAqaW50ZXJuYWxfbWV0aG9kcykKIHsKLQlpbnQgdHlwZTsKLQlmbG9hdCB4LCB5LCB3LCBoOwotCWNoYXIgKm5hbWU7Ci0JRkxfT0JKRUNUICpvYmo7CisgICAgaW50IHR5cGU7CisgICAgZmxvYXQgeCwgeSwgdywgaDsKKyAgICBjaGFyICpuYW1lOworICAgIEZMX09CSkVDVCAqb2JqOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCIoaWZmZmZzKSIsICZ0eXBlLCZ4LCZ5LCZ3LCZoLCZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCIoaWZmZmZzKSIsICZ0eXBlLCZ4LCZ5LCZ3LCZoLCZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmbF9hZGR0b19mb3JtIChmLT4gb2JfZm9ybSk7CisgICAgZmxfYWRkdG9fZm9ybSAoZi0+IG9iX2Zvcm0pOwogCi0Jb2JqID0gKCpmdW5jKSAodHlwZSwgeCwgeSwgdywgaCwgbmFtZSk7CisgICAgb2JqID0gKCpmdW5jKSAodHlwZSwgeCwgeSwgdywgaCwgbmFtZSk7CiAKLQlmbF9lbmRfZm9ybSgpOworICAgIGZsX2VuZF9mb3JtKCk7CiAKLQlpZiAob2JqID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gbmV3Z2VuZXJpY29iamVjdCAob2JqLCBpbnRlcm5hbF9tZXRob2RzKTsKKyAgICByZXR1cm4gbmV3Z2VuZXJpY29iamVjdCAob2JqLCBpbnRlcm5hbF9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2J1dHRvbihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9idXR0b24sIGJ1dHRvbl9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9idXR0b24sIGJ1dHRvbl9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2xpZ2h0YnV0dG9uKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2xpZ2h0YnV0dG9uLCBidXR0b25fbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfbGlnaHRidXR0b24sIGJ1dHRvbl9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX3JvdW5kYnV0dG9uKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX3JvdW5kYnV0dG9uLCBidXR0b25fbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfcm91bmRidXR0b24sIGJ1dHRvbl9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX21lbnUgKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX21lbnUsIG1lbnVfbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfbWVudSwgbWVudV9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX3NsaWRlcihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9zbGlkZXIsIHNsaWRlcl9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9zbGlkZXIsIHNsaWRlcl9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX3ZhbHNsaWRlcihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF92YWxzbGlkZXIsIHNsaWRlcl9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF92YWxzbGlkZXIsIHNsaWRlcl9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX2RpYWwoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfZGlhbCwgZGlhbF9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9kaWFsLCBkaWFsX21ldGhvZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9hZGRfY291bnRlcihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9jb3VudGVyLCBjb3VudGVyX21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2NvdW50ZXIsIGNvdW50ZXJfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9jbG9jayhmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9jbG9jaywgY2xvY2tfbWV0aG9kcyk7CisgICAgcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfY2xvY2ssIGNsb2NrX21ldGhvZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9hZGRfYm94KGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2JveCwKLQkJCQkgIChQeU1ldGhvZERlZiAqKU5VTEwpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU1ldGhvZERlZiAqKU5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9hZGRfY2hvaWNlKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2Nob2ljZSwgY2hvaWNlX21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2Nob2ljZSwgY2hvaWNlX21ldGhvZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9hZGRfYnJvd3Nlcihmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF9icm93c2VyLCBicm93c2VyX21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2Jyb3dzZXIsIGJyb3dzZXJfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2FkZF9wb3NpdGlvbmVyKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX3Bvc2l0aW9uZXIsCi0JCQkJICBwb3NpdGlvbmVyX21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX3Bvc2l0aW9uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbmVyX21ldGhvZHMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9hZGRfaW5wdXQoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfaW5wdXQsIGlucHV0X21ldGhvZHMpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX2lucHV0LCBpbnB1dF9tZXRob2RzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX3RleHQoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGdlbmVyaWNfYWRkX29iamVjdChmLCBhcmdzLCBmbF9hZGRfdGV4dCwKLQkJCQkgIChQeU1ldGhvZERlZiAqKU5VTEwpOworICAgIHJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX3RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlNZXRob2REZWYgKilOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYWRkX3RpbWVyKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5lcmljX2FkZF9vYmplY3QoZiwgYXJncywgZmxfYWRkX3RpbWVyLCB0aW1lcl9tZXRob2RzKTsKKyAgICByZXR1cm4gZ2VuZXJpY19hZGRfb2JqZWN0KGYsIGFyZ3MsIGZsX2FkZF90aW1lciwgdGltZXJfbWV0aG9kcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2ZyZWV6ZV9mb3JtKGZvcm1vYmplY3QgKmYpCiB7Ci0JcmV0dXJuIGZvcm1fY2FsbChmbF9mcmVlemVfZm9ybSwgZi0+IG9iX2Zvcm0pOworICAgIHJldHVybiBmb3JtX2NhbGwoZmxfZnJlZXplX2Zvcm0sIGYtPiBvYl9mb3JtKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fdW5mcmVlemVfZm9ybShmb3Jtb2JqZWN0ICpmKQogewotCXJldHVybiBmb3JtX2NhbGwoZmxfdW5mcmVlemVfZm9ybSwgZi0+IG9iX2Zvcm0pOworICAgIHJldHVybiBmb3JtX2NhbGwoZmxfdW5mcmVlemVfZm9ybSwgZi0+IG9iX2Zvcm0pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9hY3RpdmF0ZV9mb3JtKGZvcm1vYmplY3QgKmYpCiB7Ci0JcmV0dXJuIGZvcm1fY2FsbChmbF9hY3RpdmF0ZV9mb3JtLCBmLT4gb2JfZm9ybSk7CisgICAgcmV0dXJuIGZvcm1fY2FsbChmbF9hY3RpdmF0ZV9mb3JtLCBmLT4gb2JfZm9ybSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2RlYWN0aXZhdGVfZm9ybShmb3Jtb2JqZWN0ICpmKQogewotCXJldHVybiBmb3JtX2NhbGwoZmxfZGVhY3RpdmF0ZV9mb3JtLCBmLT4gb2JfZm9ybSk7CisgICAgcmV0dXJuIGZvcm1fY2FsbChmbF9kZWFjdGl2YXRlX2Zvcm0sIGYtPiBvYl9mb3JtKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fYmduX2dyb3VwKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCUZMX09CSkVDVCAqb2JqOworICAgIEZMX09CSkVDVCAqb2JqOwogCi0JZmxfYWRkdG9fZm9ybShmLT4gb2JfZm9ybSk7Ci0Jb2JqID0gZmxfYmduX2dyb3VwKCk7Ci0JZmxfZW5kX2Zvcm0oKTsKKyAgICBmbF9hZGR0b19mb3JtKGYtPiBvYl9mb3JtKTsKKyAgICBvYmogPSBmbF9iZ25fZ3JvdXAoKTsKKyAgICBmbF9lbmRfZm9ybSgpOwogCi0JaWYgKG9iaiA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIG5ld2dlbmVyaWNvYmplY3QgKG9iaiwgKFB5TWV0aG9kRGVmICopIE5VTEwpOworICAgIHJldHVybiBuZXdnZW5lcmljb2JqZWN0IChvYmosIChQeU1ldGhvZERlZiAqKSBOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fZW5kX2dyb3VwKGZvcm1vYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsX2FkZHRvX2Zvcm0oZi0+IG9iX2Zvcm0pOwotCWZsX2VuZF9ncm91cCgpOwotCWZsX2VuZF9mb3JtKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsX2FkZHRvX2Zvcm0oZi0+IG9iX2Zvcm0pOworICAgIGZsX2VuZF9ncm91cCgpOworICAgIGZsX2VuZF9mb3JtKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZmluZF9maXJzdF9vcl9sYXN0KEZMX09CSkVDVCAqKCpmdW5jKShGTF9GT1JNICosIGludCwgZmxvYXQsIGZsb2F0KSwgZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHR5cGU7Ci0JZmxvYXQgbXgsIG15OwotCUZMX09CSkVDVCAqZ2VuZXJpYzsKLQlnZW5lcmljb2JqZWN0ICpnOwotCQotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpZmYpIiwgJnR5cGUsICZteCwgJm15KSkgcmV0dXJuIE5VTEw7CisgICAgaW50IHR5cGU7CisgICAgZmxvYXQgbXgsIG15OworICAgIEZMX09CSkVDVCAqZ2VuZXJpYzsKKyAgICBnZW5lcmljb2JqZWN0ICpnOwogCi0JZ2VuZXJpYyA9ICgqZnVuYykgKGYtPiBvYl9mb3JtLCB0eXBlLCBteCwgbXkpOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpZmYpIiwgJnR5cGUsICZteCwgJm15KSkgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZ2VuZXJpYyA9PSBOVUxMKQotCXsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgZ2VuZXJpYyA9ICgqZnVuYykgKGYtPiBvYl9mb3JtLCB0eXBlLCBteCwgbXkpOwogCi0JZyA9IGZpbmRnZW5lcmljKGdlbmVyaWMpOwotCWlmIChnID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJmb3Jtc19maW5kX3tmaXJzdHxsYXN0fSByZXR1cm5zIHVua25vd24gb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoZyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBnOworICAgIGlmIChnZW5lcmljID09IE5VTEwpCisgICAgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKworICAgIGcgPSBmaW5kZ2VuZXJpYyhnZW5lcmljKTsKKyAgICBpZiAoZyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgImZvcm1zX2ZpbmRfe2ZpcnN0fGxhc3R9IHJldHVybnMgdW5rbm93biBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihnKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIGc7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtX2ZpbmRfZmlyc3QoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGZvcm1zX2ZpbmRfZmlyc3Rfb3JfbGFzdChmbF9maW5kX2ZpcnN0LCBmLCBhcmdzKTsKKyAgICByZXR1cm4gZm9ybXNfZmluZF9maXJzdF9vcl9sYXN0KGZsX2ZpbmRfZmlyc3QsIGYsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybV9maW5kX2xhc3QoZm9ybW9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGZvcm1zX2ZpbmRfZmlyc3Rfb3JfbGFzdChmbF9maW5kX2xhc3QsIGYsIGFyZ3MpOworICAgIHJldHVybiBmb3Jtc19maW5kX2ZpcnN0X29yX2xhc3QoZmxfZmluZF9sYXN0LCBmLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fc2V0X29iamVjdF9mb2N1cyhmb3Jtb2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlnZW5lcmljb2JqZWN0ICpnOwotCWlmIChhcmdzID09IE5VTEwgfHwgIWlzX2dlbmVyaWNvYmplY3QoYXJncykpIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWcgPSAoZ2VuZXJpY29iamVjdCAqKWFyZ3M7Ci0JZmxfc2V0X29iamVjdF9mb2N1cyhmLT5vYl9mb3JtLCBnLT5vYl9nZW5lcmljKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZ2VuZXJpY29iamVjdCAqZzsKKyAgICBpZiAoYXJncyA9PSBOVUxMIHx8ICFpc19nZW5lcmljb2JqZWN0KGFyZ3MpKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBnID0gKGdlbmVyaWNvYmplY3QgKilhcmdzOworICAgIGZsX3NldF9vYmplY3RfZm9jdXMoZi0+b2JfZm9ybSwgZy0+b2JfZ2VuZXJpYyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZm9ybV9tZXRob2RzW10gPSB7CiAvKiBhZG0gKi8KLQl7InNob3dfZm9ybSIsCQkoUHlDRnVuY3Rpb24pZm9ybV9zaG93X2Zvcm0sICAgICBNRVRIX09MREFSR1N9LAotCXsiaGlkZV9mb3JtIiwJCShQeUNGdW5jdGlvbilmb3JtX2hpZGVfZm9ybSwgICAgIE1FVEhfTk9BUkdTfSwKLQl7InJlZHJhd19mb3JtIiwJCShQeUNGdW5jdGlvbilmb3JtX3JlZHJhd19mb3JtLCAgIE1FVEhfTk9BUkdTfSwKLQl7InNldF9mb3JtX3Bvc2l0aW9uIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fc2V0X2Zvcm1fcG9zaXRpb24sIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfZm9ybV9zaXplIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fc2V0X2Zvcm1fc2l6ZSwgTUVUSF9PTERBUkdTfSwKLQl7InNjYWxlX2Zvcm0iLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fc2NhbGVfZm9ybSwgICAgTUVUSF9PTERBUkdTfSwKLQl7ImZyZWV6ZV9mb3JtIiwJCShQeUNGdW5jdGlvbilmb3JtX2ZyZWV6ZV9mb3JtLCAgIE1FVEhfTk9BUkdTfSwKLQl7InVuZnJlZXplX2Zvcm0iLAkoUHlDRnVuY3Rpb24pZm9ybV91bmZyZWV6ZV9mb3JtLCBNRVRIX05PQVJHU30sCi0JeyJhY3RpdmF0ZV9mb3JtIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fYWN0aXZhdGVfZm9ybSwgTUVUSF9OT0FSR1N9LAotCXsiZGVhY3RpdmF0ZV9mb3JtIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fZGVhY3RpdmF0ZV9mb3JtLCBNRVRIX05PQVJHU30sCi0JeyJiZ25fZ3JvdXAiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYmduX2dyb3VwLCAgTUVUSF9PTERBUkdTfSwKLQl7ImVuZF9ncm91cCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9lbmRfZ3JvdXAsICBNRVRIX09MREFSR1N9LAotCXsiZmluZF9maXJzdCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9maW5kX2ZpcnN0LCBNRVRIX09MREFSR1N9LAotCXsiZmluZF9sYXN0IiwJCShQeUNGdW5jdGlvbilmb3JtX2ZpbmRfbGFzdCwgIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfb2JqZWN0X2ZvY3VzIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fc2V0X29iamVjdF9mb2N1cywgTUVUSF9PTERBUkdTfSwKKyAgICB7InNob3dfZm9ybSIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fc2hvd19mb3JtLCAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImhpZGVfZm9ybSIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1faGlkZV9mb3JtLCAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsicmVkcmF3X2Zvcm0iLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9yZWRyYXdfZm9ybSwgICBNRVRIX05PQVJHU30sCisgICAgeyJzZXRfZm9ybV9wb3NpdGlvbiIsICAgICAgIChQeUNGdW5jdGlvbilmb3JtX3NldF9mb3JtX3Bvc2l0aW9uLCBNRVRIX09MREFSR1N9LAorICAgIHsic2V0X2Zvcm1fc2l6ZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9zZXRfZm9ybV9zaXplLCBNRVRIX09MREFSR1N9LAorICAgIHsic2NhbGVfZm9ybSIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9zY2FsZV9mb3JtLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZnJlZXplX2Zvcm0iLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9mcmVlemVfZm9ybSwgICBNRVRIX05PQVJHU30sCisgICAgeyJ1bmZyZWV6ZV9mb3JtIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX3VuZnJlZXplX2Zvcm0sIE1FVEhfTk9BUkdTfSwKKyAgICB7ImFjdGl2YXRlX2Zvcm0iLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fYWN0aXZhdGVfZm9ybSwgTUVUSF9OT0FSR1N9LAorICAgIHsiZGVhY3RpdmF0ZV9mb3JtIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9kZWFjdGl2YXRlX2Zvcm0sIE1FVEhfTk9BUkdTfSwKKyAgICB7ImJnbl9ncm91cCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fYmduX2dyb3VwLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZF9ncm91cCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fZW5kX2dyb3VwLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZpbmRfZmlyc3QiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fZmluZF9maXJzdCwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZpbmRfbGFzdCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fZmluZF9sYXN0LCAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldF9vYmplY3RfZm9jdXMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fc2V0X29iamVjdF9mb2N1cywgTUVUSF9PTERBUkdTfSwKIAogLyogYmFzaWMgb2JqZWN0cyAqLwotCXsiYWRkX2J1dHRvbiIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfYnV0dG9uLCBNRVRIX09MREFSR1N9LAotLyoJeyJhZGRfYml0bWFwIiwJCShtZXRob2QpZm9ybV9hZGRfYml0bWFwLCBNRVRIX09MREFSR1N9LCAqLwotCXsiYWRkX2xpZ2h0YnV0dG9uIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX2xpZ2h0YnV0dG9uLCBNRVRIX09MREFSR1N9LAotCXsiYWRkX3JvdW5kYnV0dG9uIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX3JvdW5kYnV0dG9uLCBNRVRIX09MREFSR1N9LAotCXsiYWRkX21lbnUiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX21lbnUsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9zbGlkZXIiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX3NsaWRlciwgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9wb3NpdGlvbmVyIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX3Bvc2l0aW9uZXIsIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfdmFsc2xpZGVyIiwJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX3ZhbHNsaWRlciwgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF9kaWFsIiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF9kaWFsLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfY291bnRlciIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfY291bnRlciwgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX2JveCIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfYm94LCAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX2Nsb2NrIiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF9jbG9jaywgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfY2hvaWNlIiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF9jaG9pY2UsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfYnJvd3NlciIsCQkoUHlDRnVuY3Rpb24pZm9ybV9hZGRfYnJvd3NlciwgICBNRVRIX09MREFSR1N9LAotCXsiYWRkX2lucHV0IiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF9pbnB1dCwgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhZGRfdGltZXIiLAkJKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX3RpbWVyLCAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZF90ZXh0IiwJCShQeUNGdW5jdGlvbilmb3JtX2FkZF90ZXh0LCAgICAgIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJhZGRfYnV0dG9uIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9idXR0b24sIE1FVEhfT0xEQVJHU30sCisvKiAgICAgIHsiYWRkX2JpdG1hcCIsICAgICAgICAgIChtZXRob2QpZm9ybV9hZGRfYml0bWFwLCBNRVRIX09MREFSR1N9LCAqLworICAgIHsiYWRkX2xpZ2h0YnV0dG9uIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZm9ybV9hZGRfbGlnaHRidXR0b24sIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfcm91bmRidXR0b24iLCAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9yb3VuZGJ1dHRvbiwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFkZF9tZW51IiwgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX21lbnUsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFkZF9zbGlkZXIiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX3NsaWRlciwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFkZF9wb3NpdGlvbmVyIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZvcm1fYWRkX3Bvc2l0aW9uZXIsIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfdmFsc2xpZGVyIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF92YWxzbGlkZXIsIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfZGlhbCIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9kaWFsLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfY291bnRlciIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9jb3VudGVyLCAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfYm94IiwgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9ib3gsICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfY2xvY2siLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9jbG9jaywgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfY2hvaWNlIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9jaG9pY2UsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfYnJvd3NlciIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9icm93c2VyLCAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfaW5wdXQiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF9pbnB1dCwgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfdGltZXIiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF90aW1lciwgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJhZGRfdGV4dCIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilmb3JtX2FkZF90ZXh0LCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIHZvaWQKIGZvcm1fZGVhbGxvYyhmb3Jtb2JqZWN0ICpmKQogewotCXJlbGVhc2VvYmplY3RzKGYtPm9iX2Zvcm0pOwotCWlmIChmLT5vYl9mb3JtLT52aXNpYmxlKQotCQlmbF9oaWRlX2Zvcm0oZi0+b2JfZm9ybSk7Ci0JZmxfZnJlZV9mb3JtKGYtPm9iX2Zvcm0pOwotCVB5T2JqZWN0X0RlbChmKTsKKyAgICByZWxlYXNlb2JqZWN0cyhmLT5vYl9mb3JtKTsKKyAgICBpZiAoZi0+b2JfZm9ybS0+dmlzaWJsZSkKKyAgICAgICAgZmxfaGlkZV9mb3JtKGYtPm9iX2Zvcm0pOworICAgIGZsX2ZyZWVfZm9ybShmLT5vYl9mb3JtKTsKKyAgICBQeU9iamVjdF9EZWwoZik7CiB9CiAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKEZMX0ZPUk0sIHgpCiAKIHN0YXRpYyBzdHJ1Y3QgbWVtYmVybGlzdCBmb3JtX21lbWJlcmxpc3RbXSA9IHsKLQl7IndpbmRvdyIsCVRfTE9ORywJCU9GRih3aW5kb3cpLAlST30sCi0JeyJ3IiwJCVRfRkxPQVQsCU9GRih3KX0sCi0JeyJoIiwJCVRfRkxPQVQsCU9GRihoKX0sCi0JeyJ4IiwJCVRfRkxPQVQsCU9GRih4KSwJCVJPfSwKLQl7InkiLAkJVF9GTE9BVCwJT0ZGKHkpLAkJUk99LAotCXsiZGVhY3RpdmF0ZWQiLAlUX0lOVCwJCU9GRihkZWFjdGl2YXRlZCl9LAotCXsidmlzaWJsZSIsCVRfSU5ULAkJT0ZGKHZpc2libGUpLAlST30sCi0JeyJmcm96ZW4iLAlUX0lOVCwJCU9GRihmcm96ZW4pLAlST30sCi0JeyJkb3VibGVidWYiLAlUX0lOVCwJCU9GRihkb3VibGVidWYpfSwKLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7IndpbmRvdyIsICAgICAgICAgIFRfTE9ORywgICAgICAgICBPRkYod2luZG93KSwgICAgUk99LAorICAgIHsidyIsICAgICAgICAgICAgICAgVF9GTE9BVCwgICAgICAgIE9GRih3KX0sCisgICAgeyJoIiwgICAgICAgICAgICAgICBUX0ZMT0FULCAgICAgICAgT0ZGKGgpfSwKKyAgICB7IngiLCAgICAgICAgICAgICAgIFRfRkxPQVQsICAgICAgICBPRkYoeCksICAgICAgICAgUk99LAorICAgIHsieSIsICAgICAgICAgICAgICAgVF9GTE9BVCwgICAgICAgIE9GRih5KSwgICAgICAgICBST30sCisgICAgeyJkZWFjdGl2YXRlZCIsICAgICBUX0lOVCwgICAgICAgICAgT0ZGKGRlYWN0aXZhdGVkKX0sCisgICAgeyJ2aXNpYmxlIiwgICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKHZpc2libGUpLCAgIFJPfSwKKyAgICB7ImZyb3plbiIsICAgICAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoZnJvemVuKSwgICAgUk99LAorICAgIHsiZG91YmxlYnVmIiwgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihkb3VibGVidWYpfSwKKyAgICB7TlVMTH0gICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogI3VuZGVmIE9GRgpAQCAtMTU2Nyw2MCArMTU2Nyw2MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fZ2V0YXR0cihmb3Jtb2JqZWN0ICpmLCBjaGFyICpuYW1lKQogewotCVB5T2JqZWN0ICptZXRoOworICAgIFB5T2JqZWN0ICptZXRoOwogCi0JbWV0aCA9IFB5X0ZpbmRNZXRob2QoZm9ybV9tZXRob2RzLCAoUHlPYmplY3QgKilmLCBuYW1lKTsKLQlpZiAobWV0aCAhPSBOVUxMKQotCQlyZXR1cm4gbWV0aDsKLQlQeUVycl9DbGVhcigpOwotCXJldHVybiBQeU1lbWJlcl9HZXQoKGNoYXIgKilmLT5vYl9mb3JtLCBmb3JtX21lbWJlcmxpc3QsIG5hbWUpOworICAgIG1ldGggPSBQeV9GaW5kTWV0aG9kKGZvcm1fbWV0aG9kcywgKFB5T2JqZWN0ICopZiwgbmFtZSk7CisgICAgaWYgKG1ldGggIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG1ldGg7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gUHlNZW1iZXJfR2V0KChjaGFyICopZi0+b2JfZm9ybSwgZm9ybV9tZW1iZXJsaXN0LCBuYW1lKTsKIH0KIAogc3RhdGljIGludAogZm9ybV9zZXRhdHRyKGZvcm1vYmplY3QgKmYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3QgZGVsZXRlIGZvcm0gYXR0cmlidXRlcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgZm9ybSBhdHRyaWJ1dGVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlyZXR1cm4gUHlNZW1iZXJfU2V0KChjaGFyICopZi0+b2JfZm9ybSwgZm9ybV9tZW1iZXJsaXN0LCBuYW1lLCB2KTsKKyAgICByZXR1cm4gUHlNZW1iZXJfU2V0KChjaGFyICopZi0+b2JfZm9ybSwgZm9ybV9tZW1iZXJsaXN0LCBuYW1lLCB2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1fcmVwcihmb3Jtb2JqZWN0ICpmKQogewotCWNoYXIgYnVmWzEwMF07Ci0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiPEZPUk1TX2Zvcm0gYXQgJXAsIHdpbmRvdz0lbGQ+IiwKLQkJICAgICAgZiwgZi0+b2JfZm9ybS0+d2luZG93KTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiPEZPUk1TX2Zvcm0gYXQgJXAsIHdpbmRvdz0lbGQ+IiwKKyAgICAgICAgICAgICAgICAgIGYsIGYtPm9iX2Zvcm0tPndpbmRvdyk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBGb3JtdHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJCS8qb2Jfc2l6ZSovCi0JImZsLkZPUk1TX2Zvcm0iLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoZm9ybW9iamVjdCksCQkvKnRwX3NpemUqLwotCTAsCQkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcilmb3JtX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JMCwJCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWZvcm1fZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpZm9ybV9zZXRhdHRyLAkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKWZvcm1fcmVwciwJCS8qdHBfcmVwciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJmbC5GT1JNU19mb3JtIiwgICAgICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKGZvcm1vYmplY3QpLCAgICAgICAgICAgICAgICAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZm9ybV9kZWFsbG9jLCAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpZm9ybV9nZXRhdHRyLCAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYylmb3JtX3NldGF0dHIsICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpZm9ybV9yZXByLCAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld2Zvcm1vYmplY3QoRkxfRk9STSAqZm9ybSkKIHsKLQlmb3Jtb2JqZWN0ICpmOwotCWYgPSBQeU9iamVjdF9OZXcoZm9ybW9iamVjdCwgJkZvcm10eXBlKTsKLQlpZiAoZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmLT5vYl9mb3JtID0gZm9ybTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZjsKKyAgICBmb3Jtb2JqZWN0ICpmOworICAgIGYgPSBQeU9iamVjdF9OZXcoZm9ybW9iamVjdCwgJkZvcm10eXBlKTsKKyAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmLT5vYl9mb3JtID0gZm9ybTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZjsKIH0KIAogCkBAIC0xNjI5LDM1ICsxNjI5LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfbWFrZV9mb3JtKFB5T2JqZWN0ICpkdW1teSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHR5cGU7Ci0JZmxvYXQgdywgaDsKLQlGTF9GT1JNICpmb3JtOwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpZmYpIiwgJnR5cGUsICZ3LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCWZvcm0gPSBmbF9iZ25fZm9ybSh0eXBlLCB3LCBoKTsKLQlpZiAoZm9ybSA9PSBOVUxMKSB7Ci0JCS8qIFhYWCBBY3R1YWxseSwgY2Fubm90IGhhcHBlbiEgKi8KLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZsX2VuZF9mb3JtKCk7Ci0JcmV0dXJuIG5ld2Zvcm1vYmplY3QoZm9ybSk7CisgICAgaW50IHR5cGU7CisgICAgZmxvYXQgdywgaDsKKyAgICBGTF9GT1JNICpmb3JtOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpZmYpIiwgJnR5cGUsICZ3LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvcm0gPSBmbF9iZ25fZm9ybSh0eXBlLCB3LCBoKTsKKyAgICBpZiAoZm9ybSA9PSBOVUxMKSB7CisgICAgICAgIC8qIFhYWCBBY3R1YWxseSwgY2Fubm90IGhhcHBlbiEgKi8KKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZsX2VuZF9mb3JtKCk7CisgICAgcmV0dXJuIG5ld2Zvcm1vYmplY3QoZm9ybSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19hY3RpdmF0ZV9hbGxfZm9ybXMoUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsX2FjdGl2YXRlX2FsbF9mb3JtcygpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbF9hY3RpdmF0ZV9hbGxfZm9ybXMoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19kZWFjdGl2YXRlX2FsbF9mb3JtcyhQeU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxfZGVhY3RpdmF0ZV9hbGxfZm9ybXMoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxfZGVhY3RpdmF0ZV9hbGxfZm9ybXMoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqbXlfZXZlbnRfY2FsbGJhY2sgPSBOVUxMOwpAQCAtMTY2NSw0NzkgKzE2NjUsNDc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfc2V0X2V2ZW50X2NhbGxfYmFjayhQeU9iamVjdCAqZHVtbXksIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChhcmdzID09IFB5X05vbmUpCi0JCWFyZ3MgPSBOVUxMOwotCW15X2V2ZW50X2NhbGxiYWNrID0gYXJnczsKLQlQeV9YSU5DUkVGKGFyZ3MpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoYXJncyA9PSBQeV9Ob25lKQorICAgICAgICBhcmdzID0gTlVMTDsKKyAgICBteV9ldmVudF9jYWxsYmFjayA9IGFyZ3M7CisgICAgUHlfWElOQ1JFRihhcmdzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhQeU9iamVjdCAqZHVtbXksIEZMX09CSkVDVCAqKCpmdW5jKSh2b2lkKSkKIHsKLQlGTF9PQkpFQ1QgKmdlbmVyaWM7Ci0JZ2VuZXJpY29iamVjdCAqZzsKLQlQeU9iamVjdCAqYXJnLCAqcmVzOworICAgIEZMX09CSkVDVCAqZ2VuZXJpYzsKKyAgICBnZW5lcmljb2JqZWN0ICpnOworICAgIFB5T2JqZWN0ICphcmcsICpyZXM7CiAKLQlmb3IgKDs7KSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZ2VuZXJpYyA9ICgqZnVuYykoKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJaWYgKGdlbmVyaWMgPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJaWYgKGdlbmVyaWMgPT0gRkxfRVZFTlQpIHsKLQkJCWludCBkZXY7Ci0JCQlzaG9ydCB2YWw7Ci0JCQlpZiAobXlfZXZlbnRfY2FsbGJhY2sgPT0gTlVMTCkKLQkJCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoLTFMKTsKLQkJCWRldiA9IGZsX3FyZWFkKCZ2YWwpOwotCQkJYXJnID0gUHlfQnVpbGRWYWx1ZSgiKGloKSIsIGRldiwgdmFsKTsKLQkJCWlmIChhcmcgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KG15X2V2ZW50X2NhbGxiYWNrLCBhcmcpOwotCQkJUHlfWERFQ1JFRihyZXMpOwotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlpZiAocmVzID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7IC8qIENhbGxiYWNrIHJhaXNlZCBleGNlcHRpb24gKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWcgPSBmaW5kZ2VuZXJpYyhnZW5lcmljKTsKLQkJaWYgKGcgPT0gTlVMTCkgewotCQkJLyogT2JqZWN0IG5vdCBrbm93biB0byB1cyAoc29tZSBkaWFsb2dzIGNhdXNlIHRoaXMpICovCi0JCQljb250aW51ZTsgLyogSWdub3JlIGl0ICovCi0JCX0KLQkJaWYgKGctPm9iX2NhbGxiYWNrID09IE5VTEwpIHsKLQkJCVB5X0lOQ1JFRihnKTsKLQkJCXJldHVybiAoKFB5T2JqZWN0ICopIGcpOwotCQl9Ci0JCWFyZyA9IFB5VHVwbGVfUGFjaygyLCAoUHlPYmplY3QgKilnLCBnLT5vYl9jYWxsYmFja19hcmcpOwotCQlpZiAoYXJnID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZy0+b2JfY2FsbGJhY2ssIGFyZyk7Ci0JCVB5X1hERUNSRUYocmVzKTsKLQkJUHlfREVDUkVGKGFyZyk7Ci0JCWlmIChyZXMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOyAvKiBDYWxsYmFjayByYWlzZWQgZXhjZXB0aW9uICovCi0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBnZW5lcmljID0gKCpmdW5jKSgpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAoZ2VuZXJpYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2VuZXJpYyA9PSBGTF9FVkVOVCkgeworICAgICAgICAgICAgaW50IGRldjsKKyAgICAgICAgICAgIHNob3J0IHZhbDsKKyAgICAgICAgICAgIGlmIChteV9ldmVudF9jYWxsYmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygtMUwpOworICAgICAgICAgICAgZGV2ID0gZmxfcXJlYWQoJnZhbCk7CisgICAgICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIoaWgpIiwgZGV2LCB2YWwpOworICAgICAgICAgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QobXlfZXZlbnRfY2FsbGJhY2ssIGFyZyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgLyogQ2FsbGJhY2sgcmFpc2VkIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZyA9IGZpbmRnZW5lcmljKGdlbmVyaWMpOworICAgICAgICBpZiAoZyA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBPYmplY3Qgbm90IGtub3duIHRvIHVzIChzb21lIGRpYWxvZ3MgY2F1c2UgdGhpcykgKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBJZ25vcmUgaXQgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoZy0+b2JfY2FsbGJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGcpOworICAgICAgICAgICAgcmV0dXJuICgoUHlPYmplY3QgKikgZyk7CisgICAgICAgIH0KKyAgICAgICAgYXJnID0gUHlUdXBsZV9QYWNrKDIsIChQeU9iamVjdCAqKWcsIGctPm9iX2NhbGxiYWNrX2FyZyk7CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChnLT5vYl9jYWxsYmFjaywgYXJnKTsKKyAgICAgICAgUHlfWERFQ1JFRihyZXMpOworICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8qIENhbGxiYWNrIHJhaXNlZCBleGNlcHRpb24gKi8KKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19kb19mb3JtcyhQeU9iamVjdCAqZHVtbXkpCiB7Ci0JcmV0dXJuIGZvcm1zX2RvX29yX2NoZWNrX2Zvcm1zKGR1bW15LCBmbF9kb19mb3Jtcyk7CisgICAgcmV0dXJuIGZvcm1zX2RvX29yX2NoZWNrX2Zvcm1zKGR1bW15LCBmbF9kb19mb3Jtcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19jaGVja19mb3JtcyhQeU9iamVjdCAqZHVtbXkpCiB7Ci0JcmV0dXJuIGZvcm1zX2RvX29yX2NoZWNrX2Zvcm1zKGR1bW15LCBmbF9jaGVja19mb3Jtcyk7CisgICAgcmV0dXJuIGZvcm1zX2RvX29yX2NoZWNrX2Zvcm1zKGR1bW15LCBmbF9jaGVja19mb3Jtcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19kb19vbmx5X2Zvcm1zKFB5T2JqZWN0ICpkdW1teSkKIHsKLQlyZXR1cm4gZm9ybXNfZG9fb3JfY2hlY2tfZm9ybXMoZHVtbXksIGZsX2RvX29ubHlfZm9ybXMpOworICAgIHJldHVybiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhkdW1teSwgZmxfZG9fb25seV9mb3Jtcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19jaGVja19vbmx5X2Zvcm1zKFB5T2JqZWN0ICpkdW1teSkKIHsKLQlyZXR1cm4gZm9ybXNfZG9fb3JfY2hlY2tfZm9ybXMoZHVtbXksIGZsX2NoZWNrX29ubHlfZm9ybXMpOworICAgIHJldHVybiBmb3Jtc19kb19vcl9jaGVja19mb3JtcyhkdW1teSwgZmxfY2hlY2tfb25seV9mb3Jtcyk7CiB9CiAKICNpZmRlZiBVTlVTRUQKIHN0YXRpYyBQeU9iamVjdCAqCiBmbF9jYWxsKHZvaWQgKCpmdW5jKSh2b2lkKSkKIHsKLQkoKmZ1bmMpKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgICgqZnVuYykoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3NldF9ncmFwaGljc19tb2RlKFB5T2JqZWN0ICpkdW1teSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJnYm1vZGUsIGRvdWJsZWJ1ZjsKKyAgICBpbnQgcmdibW9kZSwgZG91YmxlYnVmOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZyZ2Jtb2RlLCAmZG91YmxlYnVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZmxfc2V0X2dyYXBoaWNzX21vZGUocmdibW9kZSxkb3VibGVidWYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnJnYm1vZGUsICZkb3VibGVidWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbF9zZXRfZ3JhcGhpY3NfbW9kZShyZ2Jtb2RlLGRvdWJsZWJ1Zik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZ2V0X3JnYm1vZGUoUHlPYmplY3QgKmR1bW15LCBQeU9iamVjdCAqYXJncykKIHsKLQlleHRlcm4gaW50IGZsX3JnYm1vZGU7CisgICAgZXh0ZXJuIGludCBmbF9yZ2Jtb2RlOwogCi0JaWYgKGFyZ3MgIT0gTlVMTCkgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWZsX3JnYm1vZGUpOworICAgIGlmIChhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylmbF9yZ2Jtb2RlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3Nob3dfZXJyb3JzKFB5T2JqZWN0ICpkdW1teSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHNob3c7Ci0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZzaG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JZmxfc2hvd19lcnJvcnMoc2hvdyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGludCBzaG93OworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmc2hvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZsX3Nob3dfZXJyb3JzKHNob3cpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX3NldF9mb250X25hbWUoUHlPYmplY3QgKmR1bW15LCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbnVtYjsKLQljaGFyICpuYW1lOwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcykiLCAmbnVtYiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlmbF9zZXRfZm9udF9uYW1lKG51bWIsIG5hbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgbnVtYjsKKyAgICBjaGFyICpuYW1lOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcykiLCAmbnVtYiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbF9zZXRfZm9udF9uYW1lKG51bWIsIG5hbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfcWRldmljZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMTsKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJoIiwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlmbF9xZGV2aWNlKGFyZzEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImgiLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZsX3FkZXZpY2UoYXJnMSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfdW5xZGV2aWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxOwotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImgiLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWZsX3VucWRldmljZShhcmcxKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJoIiwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbF91bnFkZXZpY2UoYXJnMSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfaXNxdWV1ZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXNob3J0IGFyZzE7Ci0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaCIsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gZmxfaXNxdWV1ZWQoYXJnMSk7CisgICAgbG9uZyByZXR2YWw7CisgICAgc2hvcnQgYXJnMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJoIiwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBmbF9pc3F1ZXVlZChhcmcxKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhyZXR2YWwpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyZXR2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfcXRlc3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGZsX3F0ZXN0KCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZmxfcXRlc3QoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmV0dmFsKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfcXJlYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBkZXY7Ci0Jc2hvcnQgdmFsOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlkZXYgPSBmbF9xcmVhZCgmdmFsKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWgpIiwgZGV2LCB2YWwpOworICAgIGludCBkZXY7CisgICAgc2hvcnQgdmFsOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBkZXYgPSBmbF9xcmVhZCgmdmFsKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWgpIiwgZGV2LCB2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfcXJlc2V0KFB5T2JqZWN0ICpzZWxmKQogewotCWZsX3FyZXNldCgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbF9xcmVzZXQoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19xZW50ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEsIGFyZzI7Ci0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGhoKSIsICZhcmcxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWZsX3FlbnRlcihhcmcxLCBhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSwgYXJnMjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaGgpIiwgJmFyZzEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmxfcWVudGVyKGFyZzEsIGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2NvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYXJnOworICAgIGludCBhcmc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmFyZykpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmYXJnKSkgcmV0dXJuIE5VTEw7CiAKLQlmbF9jb2xvcigoc2hvcnQpIGFyZyk7CisgICAgZmxfY29sb3IoKHNob3J0KSBhcmcpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX21hcGNvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMzsKKyAgICBpbnQgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMzsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWlpKSIsICZhcmcwLCAmYXJnMSwgJmFyZzIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpaWkpIiwgJmFyZzAsICZhcmcxLCAmYXJnMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZsX21hcGNvbG9yKGFyZzAsIChzaG9ydCkgYXJnMSwgKHNob3J0KSBhcmcyLCAoc2hvcnQpIGFyZzMpOworICAgIGZsX21hcGNvbG9yKGFyZzAsIChzaG9ydCkgYXJnMSwgKHNob3J0KSBhcmcyLCAoc2hvcnQpIGFyZzMpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2dldG1jb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGFyZzsKLQlzaG9ydCByLCBnLCBiOworICAgIGludCBhcmc7CisgICAgc2hvcnQgciwgZywgYjsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgImkiLCAmYXJnKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZhcmcpKSByZXR1cm4gTlVMTDsKIAotCWZsX2dldG1jb2xvcihhcmcsICZyLCAmZywgJmIpOworICAgIGZsX2dldG1jb2xvcihhcmcsICZyLCAmZywgJmIpOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihoaGgpIiwgciwgZywgYik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihoaGgpIiwgciwgZywgYik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19nZXRfbW91c2UoUHlPYmplY3QgKnNlbGYpCiB7Ci0JZmxvYXQgeCwgeTsKKyAgICBmbG9hdCB4LCB5OwogCi0JZmxfZ2V0X21vdXNlKCZ4LCAmeSk7CisgICAgZmxfZ2V0X21vdXNlKCZ4LCAmeSk7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsIHgsIHkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmYpIiwgeCwgeSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc190aWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEsIGFyZzIsIGFyZzM7Ci0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGhoaCkiLCAmYXJnMSwgJmFyZzIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZmxfdGllKGFyZzEsIGFyZzIsIGFyZzMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxLCBhcmcyLCBhcmczOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihoaGgpIiwgJmFyZzEsICZhcmcyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZsX3RpZShhcmcxLCBhcmcyLCBhcmczKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19zaG93X21lc3NhZ2UoUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmEsICpiLCAqYzsKKyAgICBjaGFyICphLCAqYiwgKmM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoc3NzKSIsICZhLCAmYiwgJmMpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoc3NzKSIsICZhLCAmYiwgJmMpKSByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmbF9zaG93X21lc3NhZ2UoYSwgYiwgYyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZmxfc2hvd19tZXNzYWdlKGEsIGIsIGMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfc2hvd19jaG9pY2UoUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm0xLCAqbTIsICptMywgKmIxLCAqYjIsICpiMzsKLQlpbnQgbmI7Ci0JY2hhciAqZm9ybWF0OwotCWxvbmcgcnY7CisgICAgY2hhciAqbTEsICptMiwgKm0zLCAqYjEsICpiMiwgKmIzOworICAgIGludCBuYjsKKyAgICBjaGFyICpmb3JtYXQ7CisgICAgbG9uZyBydjsKIAotCWlmIChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5iID0gUHlUdXBsZV9TaXplKGFyZ3MpIC0gMzsKLQlpZiAobmIgPD0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJuZWVkIGF0IGxlYXN0IG9uZSBidXR0b24gbGFiZWwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeUludF9DaGVjayhQeVR1cGxlX0dldEl0ZW0oYXJncywgMykpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAiJ251bWJlci1vZi1idXR0b25zJyBhcmd1bWVudCBub3QgbmVlZGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzd2l0Y2ggKG5iKSB7Ci0JY2FzZSAxOiBmb3JtYXQgPSAiKHNzc3MpIjsgYnJlYWs7Ci0JY2FzZSAyOiBmb3JtYXQgPSAiKHNzc3NzKSI7IGJyZWFrOwotCWNhc2UgMzogZm9ybWF0ID0gIihzc3Nzc3MpIjsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInRvbyBtYW55IGJ1dHRvbiBsYWJlbHMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5iID0gUHlUdXBsZV9TaXplKGFyZ3MpIC0gMzsKKyAgICBpZiAobmIgPD0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWQgYXQgbGVhc3Qgb25lIGJ1dHRvbiBsYWJlbCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5SW50X0NoZWNrKFB5VHVwbGVfR2V0SXRlbShhcmdzLCAzKSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiJ251bWJlci1vZi1idXR0b25zJyBhcmd1bWVudCBub3QgbmVlZGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzd2l0Y2ggKG5iKSB7CisgICAgY2FzZSAxOiBmb3JtYXQgPSAiKHNzc3MpIjsgYnJlYWs7CisgICAgY2FzZSAyOiBmb3JtYXQgPSAiKHNzc3NzKSI7IGJyZWFrOworICAgIGNhc2UgMzogZm9ybWF0ID0gIihzc3Nzc3MpIjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInRvbyBtYW55IGJ1dHRvbiBsYWJlbHMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCBmb3JtYXQsICZtMSwgJm0yLCAmbTMsICZiMSwgJmIyLCAmYjMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsIGZvcm1hdCwgJm0xLCAmbTIsICZtMywgJmIxLCAmYjIsICZiMykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJ2ID0gZmxfc2hvd19jaG9pY2UobTEsIG0yLCBtMywgbmIsIGIxLCBiMiwgYjMpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJ2KTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcnYgPSBmbF9zaG93X2Nob2ljZShtMSwgbTIsIG0zLCBuYiwgYjEsIGIyLCBiMyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocnYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfc2hvd19xdWVzdGlvbihQeU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJldDsKLQljaGFyICphLCAqYiwgKmM7CisgICAgaW50IHJldDsKKyAgICBjaGFyICphLCAqYiwgKmM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoc3NzKSIsICZhLCAmYiwgJmMpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoc3NzKSIsICZhLCAmYiwgJmMpKSByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBmbF9zaG93X3F1ZXN0aW9uKGEsIGIsIGMpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldCA9IGZsX3Nob3dfcXVlc3Rpb24oYSwgYiwgYyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcmV0KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHJldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19zaG93X2lucHV0KFB5T2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzdHI7Ci0JY2hhciAqYSwgKmI7CisgICAgY2hhciAqc3RyOworICAgIGNoYXIgKmEsICpiOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKHNzKSIsICZhLCAmYikpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihzcykiLCAmYSwgJmIpKSByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzdHIgPSBmbF9zaG93X2lucHV0KGEsIGIpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHN0ciA9IGZsX3Nob3dfaW5wdXQoYSwgYik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChzdHIgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybXNfZmlsZV9zZWxlY3RvcihQeU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyOwotCWNoYXIgKmEsICpiLCAqYywgKmQ7CisgICAgY2hhciAqc3RyOworICAgIGNoYXIgKmEsICpiLCAqYywgKmQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoc3NzcykiLCAmYSwgJmIsICZjLCAmZCkpIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihzc3NzKSIsICZhLCAmYiwgJmMsICZkKSkgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc3RyID0gZmxfc2hvd19maWxlX3NlbGVjdG9yKGEsIGIsIGMsIGQpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHN0ciA9IGZsX3Nob3dfZmlsZV9zZWxlY3RvcihhLCBiLCBjLCBkKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHN0ciA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHN0cik7CisgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHN0cik7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1zX2ZpbGVfc2VsZWN0b3JfZnVuYyhQeU9iamVjdCAqYXJncywgY2hhciAqKCpmdW5jKSh2b2lkKSkKIHsKLQljaGFyICpzdHI7CisgICAgY2hhciAqc3RyOwogCi0Jc3RyID0gKCpmdW5jKSAoKTsKKyAgICBzdHIgPSAoKmZ1bmMpICgpOwogCi0JaWYgKHN0ciA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHN0cik7CisgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHN0cik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19nZXRfZGlyZWN0b3J5KFB5T2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZm9ybXNfZmlsZV9zZWxlY3Rvcl9mdW5jKGFyZ3MsIGZsX2dldF9kaXJlY3RvcnkpOworICAgIHJldHVybiBmb3Jtc19maWxlX3NlbGVjdG9yX2Z1bmMoYXJncywgZmxfZ2V0X2RpcmVjdG9yeSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19nZXRfcGF0dGVybihQeU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGZvcm1zX2ZpbGVfc2VsZWN0b3JfZnVuYyhhcmdzLCBmbF9nZXRfcGF0dGVybik7CisgICAgcmV0dXJuIGZvcm1zX2ZpbGVfc2VsZWN0b3JfZnVuYyhhcmdzLCBmbF9nZXRfcGF0dGVybik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3Jtc19nZXRfZmlsZW5hbWUoUHlPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBmb3Jtc19maWxlX3NlbGVjdG9yX2Z1bmMoYXJncywgZmxfZ2V0X2ZpbGVuYW1lKTsKKyAgICByZXR1cm4gZm9ybXNfZmlsZV9zZWxlY3Rvcl9mdW5jKGFyZ3MsIGZsX2dldF9maWxlbmFtZSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmb3Jtc19tZXRob2RzW10gPSB7CiAvKiBhZG0gKi8KLQl7Im1ha2VfZm9ybSIsCQlmb3Jtc19tYWtlX2Zvcm0sIE1FVEhfT0xEQVJHU30sCi0JeyJhY3RpdmF0ZV9hbGxfZm9ybXMiLAlmb3Jtc19hY3RpdmF0ZV9hbGxfZm9ybXMsIE1FVEhfT0xEQVJHU30sCi0JeyJkZWFjdGl2YXRlX2FsbF9mb3JtcyIsZm9ybXNfZGVhY3RpdmF0ZV9hbGxfZm9ybXMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJtYWtlX2Zvcm0iLCAgICAgICAgICAgICAgIGZvcm1zX21ha2VfZm9ybSwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFjdGl2YXRlX2FsbF9mb3JtcyIsICAgICAgZm9ybXNfYWN0aXZhdGVfYWxsX2Zvcm1zLCBNRVRIX09MREFSR1N9LAorICAgIHsiZGVhY3RpdmF0ZV9hbGxfZm9ybXMiLGZvcm1zX2RlYWN0aXZhdGVfYWxsX2Zvcm1zLCBNRVRIX09MREFSR1N9LAogLyogZ2wgc3VwcG9ydCB3cmFwcGVycyAqLwotCXsicWRldmljZSIsCQlmb3Jtc19xZGV2aWNlLCBNRVRIX09MREFSR1N9LAotCXsidW5xZGV2aWNlIiwJCWZvcm1zX3VucWRldmljZSwgTUVUSF9PTERBUkdTfSwKLQl7ImlzcXVldWVkIiwJCWZvcm1zX2lzcXVldWVkLCBNRVRIX09MREFSR1N9LAotCXsicXRlc3QiLAkJZm9ybXNfcXRlc3QsIE1FVEhfT0xEQVJHU30sCi0JeyJxcmVhZCIsCQlmb3Jtc19xcmVhZCwgTUVUSF9PTERBUkdTfSwKLS8qCXsiYmxrcXJlYWQiLAkJZm9ybXNfYmxrcXJlYWQsIE1FVEhfT0xEQVJHU30sICovCi0JeyJxcmVzZXQiLAkJZm9ybXNfcXJlc2V0LCBNRVRIX05PQVJHU30sCi0JeyJxZW50ZXIiLAkJZm9ybXNfcWVudGVyLCBNRVRIX09MREFSR1N9LAotCXsiZ2V0X21vdXNlIiwJCWZvcm1zX2dldF9tb3VzZSwgTUVUSF9OT0FSR1N9LAotCXsidGllIiwJCQlmb3Jtc190aWUsIE1FVEhfT0xEQVJHU30sCi0vKgl7Im5ld19ldmVudHMiLAkJZm9ybXNfbmV3X2V2ZW50cywgTUVUSF9PTERBUkdTfSwgKi8KLQl7ImNvbG9yIiwJCWZvcm1zX2NvbG9yLCBNRVRIX09MREFSR1N9LAotCXsibWFwY29sb3IiLAkJZm9ybXNfbWFwY29sb3IsIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRtY29sb3IiLAkJZm9ybXNfZ2V0bWNvbG9yLCBNRVRIX09MREFSR1N9LAorICAgIHsicWRldmljZSIsICAgICAgICAgICAgICAgICBmb3Jtc19xZGV2aWNlLCBNRVRIX09MREFSR1N9LAorICAgIHsidW5xZGV2aWNlIiwgICAgICAgICAgICAgICBmb3Jtc191bnFkZXZpY2UsIE1FVEhfT0xEQVJHU30sCisgICAgeyJpc3F1ZXVlZCIsICAgICAgICAgICAgICAgIGZvcm1zX2lzcXVldWVkLCBNRVRIX09MREFSR1N9LAorICAgIHsicXRlc3QiLCAgICAgICAgICAgICAgICAgICBmb3Jtc19xdGVzdCwgTUVUSF9PTERBUkdTfSwKKyAgICB7InFyZWFkIiwgICAgICAgICAgICAgICAgICAgZm9ybXNfcXJlYWQsIE1FVEhfT0xEQVJHU30sCisvKiAgICAgIHsiYmxrcXJlYWQiLCAgICAgICAgICAgIGZvcm1zX2Jsa3FyZWFkLCBNRVRIX09MREFSR1N9LCAqLworICAgIHsicXJlc2V0IiwgICAgICAgICAgICAgICAgICBmb3Jtc19xcmVzZXQsIE1FVEhfTk9BUkdTfSwKKyAgICB7InFlbnRlciIsICAgICAgICAgICAgICAgICAgZm9ybXNfcWVudGVyLCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X21vdXNlIiwgICAgICAgICAgICAgICBmb3Jtc19nZXRfbW91c2UsIE1FVEhfTk9BUkdTfSwKKyAgICB7InRpZSIsICAgICAgICAgICAgICAgICAgICAgZm9ybXNfdGllLCBNRVRIX09MREFSR1N9LAorLyogICAgICB7Im5ld19ldmVudHMiLCAgICAgICAgICBmb3Jtc19uZXdfZXZlbnRzLCBNRVRIX09MREFSR1N9LCAqLworICAgIHsiY29sb3IiLCAgICAgICAgICAgICAgICAgICBmb3Jtc19jb2xvciwgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1hcGNvbG9yIiwgICAgICAgICAgICAgICAgZm9ybXNfbWFwY29sb3IsIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRtY29sb3IiLCAgICAgICAgICAgICAgIGZvcm1zX2dldG1jb2xvciwgTUVUSF9PTERBUkdTfSwKIC8qIGludGVyYWN0aW9uICovCi0JeyJkb19mb3JtcyIsCQlmb3Jtc19kb19mb3JtcywgTUVUSF9OT0FSR1N9LAotCXsiZG9fb25seV9mb3JtcyIsCWZvcm1zX2RvX29ubHlfZm9ybXMsIE1FVEhfTk9BUkdTfSwKLQl7ImNoZWNrX2Zvcm1zIiwJCWZvcm1zX2NoZWNrX2Zvcm1zLCBNRVRIX05PQVJHU30sCi0JeyJjaGVja19vbmx5X2Zvcm1zIiwJZm9ybXNfY2hlY2tfb25seV9mb3JtcywgTUVUSF9OT0FSR1N9LAotCXsic2V0X2V2ZW50X2NhbGxfYmFjayIsCWZvcm1zX3NldF9ldmVudF9jYWxsX2JhY2ssIE1FVEhfT0xEQVJHU30sCisgICAgeyJkb19mb3JtcyIsICAgICAgICAgICAgICAgIGZvcm1zX2RvX2Zvcm1zLCBNRVRIX05PQVJHU30sCisgICAgeyJkb19vbmx5X2Zvcm1zIiwgICAgICAgICAgIGZvcm1zX2RvX29ubHlfZm9ybXMsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImNoZWNrX2Zvcm1zIiwgICAgICAgICAgICAgZm9ybXNfY2hlY2tfZm9ybXMsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImNoZWNrX29ubHlfZm9ybXMiLCAgICAgICAgZm9ybXNfY2hlY2tfb25seV9mb3JtcywgTUVUSF9OT0FSR1N9LAorICAgIHsic2V0X2V2ZW50X2NhbGxfYmFjayIsICAgICBmb3Jtc19zZXRfZXZlbnRfY2FsbF9iYWNrLCBNRVRIX09MREFSR1N9LAogLyogZ29vZGllcyAqLwotCXsic2hvd19tZXNzYWdlIiwJZm9ybXNfc2hvd19tZXNzYWdlLCBNRVRIX09MREFSR1N9LAotCXsic2hvd19xdWVzdGlvbiIsCWZvcm1zX3Nob3dfcXVlc3Rpb24sIE1FVEhfT0xEQVJHU30sCi0JeyJzaG93X2Nob2ljZSIsCQlmb3Jtc19zaG93X2Nob2ljZSwgTUVUSF9PTERBUkdTfSwKLQl7InNob3dfaW5wdXQiLAkJZm9ybXNfc2hvd19pbnB1dCwgTUVUSF9PTERBUkdTfSwKLQl7InNob3dfZmlsZV9zZWxlY3RvciIsCWZvcm1zX2ZpbGVfc2VsZWN0b3IsIE1FVEhfT0xEQVJHU30sCi0JeyJmaWxlX3NlbGVjdG9yIiwJZm9ybXNfZmlsZV9zZWxlY3RvciwgTUVUSF9PTERBUkdTfSwgLyogQlcgY29tcGF0ICovCi0JeyJnZXRfZGlyZWN0b3J5IiwJZm9ybXNfZ2V0X2RpcmVjdG9yeSwgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9wYXR0ZXJuIiwJCWZvcm1zX2dldF9wYXR0ZXJuLCBNRVRIX09MREFSR1N9LAotCXsiZ2V0X2ZpbGVuYW1lIiwJZm9ybXNfZ2V0X2ZpbGVuYW1lLCBNRVRIX09MREFSR1N9LAotCXsic2V0X2dyYXBoaWNzX21vZGUiLAlmb3Jtc19zZXRfZ3JhcGhpY3NfbW9kZSwgTUVUSF9PTERBUkdTfSwKLQl7ImdldF9yZ2Jtb2RlIiwJCWZvcm1zX2dldF9yZ2Jtb2RlLCBNRVRIX09MREFSR1N9LAotCXsic2hvd19lcnJvcnMiLAkJZm9ybXNfc2hvd19lcnJvcnMsIE1FVEhfT0xEQVJHU30sCi0JeyJzZXRfZm9udF9uYW1lIiwJZm9ybXNfc2V0X2ZvbnRfbmFtZSwgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNob3dfbWVzc2FnZSIsICAgICAgICAgICAgZm9ybXNfc2hvd19tZXNzYWdlLCBNRVRIX09MREFSR1N9LAorICAgIHsic2hvd19xdWVzdGlvbiIsICAgICAgICAgICBmb3Jtc19zaG93X3F1ZXN0aW9uLCBNRVRIX09MREFSR1N9LAorICAgIHsic2hvd19jaG9pY2UiLCAgICAgICAgICAgICBmb3Jtc19zaG93X2Nob2ljZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNob3dfaW5wdXQiLCAgICAgICAgICAgICAgZm9ybXNfc2hvd19pbnB1dCwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNob3dfZmlsZV9zZWxlY3RvciIsICAgICAgZm9ybXNfZmlsZV9zZWxlY3RvciwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZpbGVfc2VsZWN0b3IiLCAgICAgICAgICAgZm9ybXNfZmlsZV9zZWxlY3RvciwgTUVUSF9PTERBUkdTfSwgLyogQlcgY29tcGF0ICovCisgICAgeyJnZXRfZGlyZWN0b3J5IiwgICAgICAgICAgIGZvcm1zX2dldF9kaXJlY3RvcnksIE1FVEhfT0xEQVJHU30sCisgICAgeyJnZXRfcGF0dGVybiIsICAgICAgICAgICAgIGZvcm1zX2dldF9wYXR0ZXJuLCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X2ZpbGVuYW1lIiwgICAgICAgICAgICBmb3Jtc19nZXRfZmlsZW5hbWUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfZ3JhcGhpY3NfbW9kZSIsICAgICAgIGZvcm1zX3NldF9ncmFwaGljc19tb2RlLCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0X3JnYm1vZGUiLCAgICAgICAgICAgICBmb3Jtc19nZXRfcmdibW9kZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7InNob3dfZXJyb3JzIiwgICAgICAgICAgICAgZm9ybXNfc2hvd19lcnJvcnMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRfZm9udF9uYW1lIiwgICAgICAgICAgIGZvcm1zX3NldF9mb250X25hbWUsIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRmbCh2b2lkKQogewotICAgIAorCiAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgZmwgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKKyAgICByZXR1cm47CisKKyAgICBQeV9Jbml0TW9kdWxlKCJmbCIsIGZvcm1zX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCiAgICAgICAgIHJldHVybjsKLSAgICAKLQlQeV9Jbml0TW9kdWxlKCJmbCIsIGZvcm1zX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlmb3JlZ3JvdW5kKCk7Ci0JZmxfaW5pdCgpOworICAgIGZvcmVncm91bmQoKTsKKyAgICBmbF9pbml0KCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9mbW1vZHVsZS5jIGIvTW9kdWxlcy9mbW1vZHVsZS5jCmluZGV4IGYzZjBkYzUuLjNhNzQxMDcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZm1tb2R1bGUuYworKysgYi9Nb2R1bGVzL2ZtbW9kdWxlLmMKQEAgLTExLDI4ICsxMSwyOCBAQAogLyogRm9udCBIYW5kbGUgb2JqZWN0IGltcGxlbWVudGF0aW9uICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JZm1mb250aGFuZGxlIGZoX2ZoOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBmbWZvbnRoYW5kbGUgZmhfZmg7CiB9IGZob2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZodHlwZTsKIAotI2RlZmluZSBpc19maG9iamVjdCh2KQkJKCh2KS0+b2JfdHlwZSA9PSAmRmh0eXBlKQorI2RlZmluZSBpc19maG9iamVjdCh2KSAgICAgICAgICAoKHYpLT5vYl90eXBlID09ICZGaHR5cGUpCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdmaG9iamVjdChmbWZvbnRoYW5kbGUgZmgpCiB7Ci0JZmhvYmplY3QgKmZocDsKLQlpZiAoZmggPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJlcnJvciBjcmVhdGluZyBuZXcgZm9udCBoYW5kbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZocCA9IFB5T2JqZWN0X05ldyhmaG9iamVjdCwgJkZodHlwZSk7Ci0JaWYgKGZocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmaHAtPmZoX2ZoID0gZmg7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWZocDsKKyAgICBmaG9iamVjdCAqZmhwOworICAgIGlmIChmaCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgY3JlYXRpbmcgbmV3IGZvbnQgaGFuZGxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmaHAgPSBQeU9iamVjdF9OZXcoZmhvYmplY3QsICZGaHR5cGUpOworICAgIGlmIChmaHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmhwLT5maF9maCA9IGZoOworICAgIHJldHVybiAoUHlPYmplY3QgKilmaHA7CiB9CiAKIC8qIEZvbnQgSGFuZGxlIG1ldGhvZHMgKi8KQEAgLTQwLDEwICs0MCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZoX3NjYWxlZm9udChmaG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIHNpemU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkIiwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbmV3ZmhvYmplY3QoZm1zY2FsZWZvbnQoc2VsZi0+ZmhfZmgsIHNpemUpKTsKKyAgICBkb3VibGUgc2l6ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQiLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBuZXdmaG9iamVjdChmbXNjYWxlZm9udChzZWxmLT5maF9maCwgc2l6ZSkpOwogfQogCiAvKiBYWFggZm1tYWtlZm9udCAqLwpAQCAtNTEsNTQgKzUxLDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmhfc2V0Zm9udChmaG9iamVjdCAqc2VsZikKIHsKLQlmbXNldGZvbnQoc2VsZi0+ZmhfZmgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbXNldGZvbnQoc2VsZi0+ZmhfZmgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZoX2dldGZvbnRuYW1lKGZob2JqZWN0ICpzZWxmKQogewotCWNoYXIgZm9udG5hbWVbMjU2XTsKLQlpbnQgbGVuOwotCWxlbiA9IGZtZ2V0Zm9udG5hbWUoc2VsZi0+ZmhfZmgsIHNpemVvZiBmb250bmFtZSwgZm9udG5hbWUpOwotCWlmIChsZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJlcnJvciBpbiBmbWdldGZvbnRuYW1lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZm9udG5hbWUsIGxlbik7CisgICAgY2hhciBmb250bmFtZVsyNTZdOworICAgIGludCBsZW47CisgICAgbGVuID0gZm1nZXRmb250bmFtZShzZWxmLT5maF9maCwgc2l6ZW9mIGZvbnRuYW1lLCBmb250bmFtZSk7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImVycm9yIGluIGZtZ2V0Zm9udG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShmb250bmFtZSwgbGVuKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZoX2dldGNvbW1lbnQoZmhvYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBjb21tZW50WzI1Nl07Ci0JaW50IGxlbjsKLQlsZW4gPSBmbWdldGNvbW1lbnQoc2VsZi0+ZmhfZmgsIHNpemVvZiBjb21tZW50LCBjb21tZW50KTsKLQlpZiAobGVuIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiZXJyb3IgaW4gZm1nZXRjb21tZW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29tbWVudCwgbGVuKTsKKyAgICBjaGFyIGNvbW1lbnRbMjU2XTsKKyAgICBpbnQgbGVuOworICAgIGxlbiA9IGZtZ2V0Y29tbWVudChzZWxmLT5maF9maCwgc2l6ZW9mIGNvbW1lbnQsIGNvbW1lbnQpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJlcnJvciBpbiBmbWdldGNvbW1lbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjb21tZW50LCBsZW4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmhfZ2V0Zm9udGluZm8oZmhvYmplY3QgKnNlbGYpCiB7Ci0JZm1mb250aW5mbyBpbmZvOwotCWlmIChmbWdldGZvbnRpbmZvKHNlbGYtPmZoX2ZoLCAmaW5mbykgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJlcnJvciBpbiBmbWdldGZvbnRpbmZvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGxsbGxsbGxsKSIsCi0JCQkgICAgIGluZm8ucHJpbnRlcm1hdGNoZWQsCi0JCQkgICAgIGluZm8uZml4ZWRfd2lkdGgsCi0JCQkgICAgIGluZm8ueG9yaWcsCi0JCQkgICAgIGluZm8ueW9yaWcsCi0JCQkgICAgIGluZm8ueHNpemUsCi0JCQkgICAgIGluZm8ueXNpemUsCi0JCQkgICAgIGluZm8uaGVpZ2h0LAotCQkJICAgICBpbmZvLm5nbHlwaHMpOworICAgIGZtZm9udGluZm8gaW5mbzsKKyAgICBpZiAoZm1nZXRmb250aW5mbyhzZWxmLT5maF9maCwgJmluZm8pIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiZXJyb3IgaW4gZm1nZXRmb250aW5mbyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsbGxsbGxsbCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ucHJpbnRlcm1hdGNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5maXhlZF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnhvcmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ueW9yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby54c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubmdseXBocyk7CiB9CiAKICNpZiAwCkBAIC0xMTEsNTEgKzExMSw1MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZoX2dldHN0cndpZHRoKGZob2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzdHI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnN0cikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhmbWdldHN0cndpZHRoKHNlbGYtPmZoX2ZoLCBzdHIpKTsKKyAgICBjaGFyICpzdHI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnN0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhmbWdldHN0cndpZHRoKHNlbGYtPmZoX2ZoLCBzdHIpKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGZoX21ldGhvZHNbXSA9IHsKLQl7InNjYWxlZm9udCIsCShQeUNGdW5jdGlvbilmaF9zY2FsZWZvbnQsICAgTUVUSF9WQVJBUkdTfSwKLQl7InNldGZvbnQiLAkoUHlDRnVuY3Rpb24pZmhfc2V0Zm9udCwgICAgIE1FVEhfTk9BUkdTfSwKLQl7ImdldGZvbnRuYW1lIiwJKFB5Q0Z1bmN0aW9uKWZoX2dldGZvbnRuYW1lLCBNRVRIX05PQVJHU30sCi0JeyJnZXRjb21tZW50IiwJKFB5Q0Z1bmN0aW9uKWZoX2dldGNvbW1lbnQsICBNRVRIX05PQVJHU30sCi0JeyJnZXRmb250aW5mbyIsCShQeUNGdW5jdGlvbilmaF9nZXRmb250aW5mbywgTUVUSF9OT0FSR1N9LAorICAgIHsic2NhbGVmb250IiwgICAgICAgKFB5Q0Z1bmN0aW9uKWZoX3NjYWxlZm9udCwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0Zm9udCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZoX3NldGZvbnQsICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnZXRmb250bmFtZSIsICAgICAoUHlDRnVuY3Rpb24pZmhfZ2V0Zm9udG5hbWUsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldGNvbW1lbnQiLCAgICAgIChQeUNGdW5jdGlvbilmaF9nZXRjb21tZW50LCAgTUVUSF9OT0FSR1N9LAorICAgIHsiZ2V0Zm9udGluZm8iLCAgICAgKFB5Q0Z1bmN0aW9uKWZoX2dldGZvbnRpbmZvLCBNRVRIX05PQVJHU30sCiAjaWYgMAotCXsiZ2V0d2hvbGVtZXRyaWNzIiwJKFB5Q0Z1bmN0aW9uKWZoX2dldHdob2xlbWV0cmljcywgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHdob2xlbWV0cmljcyIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZoX2dldHdob2xlbWV0cmljcywgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgotCXsiZ2V0c3Ryd2lkdGgiLAkoUHlDRnVuY3Rpb24pZmhfZ2V0c3Ryd2lkdGgsIE1FVEhfVkFSQVJHU30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImdldHN0cndpZHRoIiwgICAgIChQeUNGdW5jdGlvbilmaF9nZXRzdHJ3aWR0aCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZoX2dldGF0dHIoZmhvYmplY3QgKmZocCwgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChmaF9tZXRob2RzLCAoUHlPYmplY3QgKilmaHAsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGZoX21ldGhvZHMsIChQeU9iamVjdCAqKWZocCwgbmFtZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBmaF9kZWFsbG9jKGZob2JqZWN0ICpmaHApCiB7Ci0JZm1mcmVlZm9udChmaHAtPmZoX2ZoKTsKLQlQeU9iamVjdF9EZWwoZmhwKTsKKyAgICBmbWZyZWVmb250KGZocC0+ZmhfZmgpOworICAgIFB5T2JqZWN0X0RlbChmaHApOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZodHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJCS8qb2Jfc2l6ZSovCi0JImZtLmZvbnQgaGFuZGxlIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGZob2JqZWN0KSwJCS8qdHBfc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWZoX2RlYWxsb2MsCQkvKnRwX2RlYWxsb2MqLwotCTAsCQkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylmaF9nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCTAsCQkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCQkvKnRwX3JlcHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiZm0uZm9udCBoYW5kbGUiLCAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihmaG9iamVjdCksICAgICAgICAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWZoX2RlYWxsb2MsICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWZoX2dldGF0dHIsICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIApAQCAtMTY0LDI5ICsxNjQsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbV9pbml0KFB5T2JqZWN0ICpzZWxmKQogewotCWZtaW5pdCgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbWluaXQoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbV9maW5kZm9udChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbmV3ZmhvYmplY3QoZm1maW5kZm9udChzdHIpKTsKKyAgICBjaGFyICpzdHI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnN0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBuZXdmaG9iamVjdChmbWZpbmRmb250KHN0cikpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm1fcHJzdHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnN0cjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm1wcnN0cihzdHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjaGFyICpzdHI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnN0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZtcHJzdHIoc3RyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIFhYWCBUaGlzIHVzZXMgYSBnbG9iYWwgdmFyaWFibGUgYXMgdGVtcG9yYXJ5ISBOb3QgcmUtZW50cmFudCEgKi8KQEAgLTE5Niw3NCArMTk2LDc0IEBACiBzdGF0aWMgdm9pZAogY2xpZW50cHJvYyhjaGFyICpmb250bmFtZSkKIHsKLQlpbnQgZXJyOwotCVB5T2JqZWN0ICp2OwotCWlmIChmb250bGlzdCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZm9udG5hbWUpOwotCWlmICh2ID09IE5VTEwpCi0JCWVyciA9IC0xOwotCWVsc2UgewotCQllcnIgPSBQeUxpc3RfQXBwZW5kKGZvbnRsaXN0LCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KLQlpZiAoZXJyICE9IDApIHsKLQkJUHlfREVDUkVGKGZvbnRsaXN0KTsKLQkJZm9udGxpc3QgPSBOVUxMOwotCX0KKyAgICBpbnQgZXJyOworICAgIFB5T2JqZWN0ICp2OworICAgIGlmIChmb250bGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZm9udG5hbWUpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIGVyciA9IC0xOworICAgIGVsc2UgeworICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKGZvbnRsaXN0LCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGZvbnRsaXN0KTsKKyAgICAgICAgZm9udGxpc3QgPSBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZtX2VudW1lcmF0ZShQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqcmVzOwotCWZvbnRsaXN0ID0gUHlMaXN0X05ldygwKTsKLQlpZiAoZm9udGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm1lbnVtZXJhdGUoY2xpZW50cHJvYyk7Ci0JcmVzID0gZm9udGxpc3Q7Ci0JZm9udGxpc3QgPSBOVUxMOwotCXJldHVybiByZXM7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBmb250bGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGZvbnRsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZtZW51bWVyYXRlKGNsaWVudHByb2MpOworICAgIHJlcyA9IGZvbnRsaXN0OworICAgIGZvbnRsaXN0ID0gTlVMTDsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZm1fc2V0cGF0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqc3RyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlmbXNldHBhdGgoc3RyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqc3RyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmbXNldHBhdGgoc3RyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbV9mb250cGF0aChQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhmbWZvbnRwYXRoKCkpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGZtZm9udHBhdGgoKSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmbV9tZXRob2RzW10gPSB7Ci0JeyJpbml0IiwJZm1faW5pdCwgICAgICBNRVRIX05PQVJHU30sCi0JeyJmaW5kZm9udCIsCWZtX2ZpbmRmb250LCAgTUVUSF9WQVJBUkdTfSwKLQl7ImVudW1lcmF0ZSIsCWZtX2VudW1lcmF0ZSwgTUVUSF9OT0FSR1N9LAotCXsicHJzdHIiLAlmbV9wcnN0ciwgICAgIE1FVEhfVkFSQVJHU30sCi0JeyJzZXRwYXRoIiwJZm1fc2V0cGF0aCwgICBNRVRIX1ZBUkFSR1N9LAotCXsiZm9udHBhdGgiLAlmbV9mb250cGF0aCwgIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiaW5pdCIsICAgICAgICAgICAgZm1faW5pdCwgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJmaW5kZm9udCIsICAgICAgICBmbV9maW5kZm9udCwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJlbnVtZXJhdGUiLCAgICAgICBmbV9lbnVtZXJhdGUsIE1FVEhfTk9BUkdTfSwKKyAgICB7InByc3RyIiwgICAgICAgICAgIGZtX3Byc3RyLCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InNldHBhdGgiLCAgICAgICAgIGZtX3NldHBhdGgsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImZvbnRwYXRoIiwgICAgICAgIGZtX2ZvbnRwYXRoLCAgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIHZvaWQKIGluaXRmbSh2b2lkKQogewotICAgIAorCiAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgZm0gbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKKyAgICByZXR1cm47CisKKyAgICBQeV9Jbml0TW9kdWxlKCJmbSIsIGZtX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCiAgICAgICAgIHJldHVybjsKLSAgICAKLQlQeV9Jbml0TW9kdWxlKCJmbSIsIGZtX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlmbWluaXQoKTsKKyAgICBmbWluaXQoKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvZnBlY3RsbW9kdWxlLmMgYi9Nb2R1bGVzL2ZwZWN0bG1vZHVsZS5jCmluZGV4IDc0MzU0YmEuLmZhYTI3OWIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZnBlY3RsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9mcGVjdGxtb2R1bGUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgCi0gICAgLyAgICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8gICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5Ni4gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICB8ICAgICAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICAgICAgICAgICAgICAgICB8CiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CkBAIC0zMiwxMiArMzIsMTIgQEAKICAgIHwgICBvcGluaW9ucyAgb2YgYXV0aG9ycyBleHByZXNzZWQgaGVyZWluIGRvIG5vdCBuZWNlc3NhcmlseSBzdGF0ZSBvciAgIHwKICAgIHwgICByZWZsZWN0IHRob3NlIG9mIHRoZSBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgb3IgIHRoZSAgVW5pdmVyc2l0eSAgIHwKICAgIHwgICBvZiAgQ2FsaWZvcm5pYSwgIGFuZCBzaGFsbCBub3QgYmUgdXNlZCBmb3IgYWR2ZXJ0aXNpbmcgb3IgcHJvZHVjdCAgIHwKLSAgICBcICBlbmRvcnNlbWVudCBwdXJwb3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAKKyAgICBcICBlbmRvcnNlbWVudCBwdXJwb3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiAKIC8qCi0JCSAgRmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIGNvbnRyb2wgbW9kdWxlLgorICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIGNvbnRyb2wgbW9kdWxlLgogCiAgICBUaGlzIFB5dGhvbiBtb2R1bGUgcHJvdmlkZXMgYmFyZS1ib25lcyBjb250cm9sIG92ZXIgZmxvYXRpbmcgcG9pbnQKICAgIHVuaXRzIGZyb20gc2V2ZXJhbCBoYXJkd2FyZSBtYW51ZmFjdHVyZXJzLiAgU3BlY2lmaWNhbGx5LCBpdCBhbGxvd3MKQEAgLTk1LDggKzk1LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqdHVybm9mZl9zaWdmcGUgICAgICAgICAgIChQeU9iamVjdCAqc2VsZixQeU9iamVjdCAqYXJncyk7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmcGVjdGxfbWV0aG9kc1tdID0gewotICAgIHsidHVybm9uX3NpZ2ZwZSIsCQkgKFB5Q0Z1bmN0aW9uKSB0dXJub25fc2lnZnBlLAkJIE1FVEhfVkFSQVJHU30sCi0gICAgeyJ0dXJub2ZmX3NpZ2ZwZSIsCQkgKFB5Q0Z1bmN0aW9uKSB0dXJub2ZmX3NpZ2ZwZSwgCSAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJ0dXJub25fc2lnZnBlIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pIHR1cm5vbl9zaWdmcGUsICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InR1cm5vZmZfc2lnZnBlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbikgdHVybm9mZl9zaWdmcGUsICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAogICAgIHswLDB9CiB9OwogCkBAIC0xMjEsMTkgKzEyMSwxOSBAQAogICAgICAqIE15IHVzYWdlIGRvZXNuJ3QgZm9sbG93IHRoZSBtYW4gcGFnZSBleGFjdGx5LiAgTWF5YmUgc29tZWJvZHkKICAgICAgKiBlbHNlIGNhbiBleHBsYWluIGhhbmRsZV9zaWdmcGVzIHRvIG1lLi4uLgogICAgICAqIGNjIC1jIC1JL3Vzci9sb2NhbC9weXRob24vaW5jbHVkZSBmcGVjdGxtb2R1bGUuYwotICAgICAqIGxkIC1zaGFyZWQgLW8gZnBlY3RsbW9kdWxlLnNvIGZwZWN0bG1vZHVsZS5vIC1sZnBlIAorICAgICAqIGxkIC1zaGFyZWQgLW8gZnBlY3RsbW9kdWxlLnNvIGZwZWN0bG1vZHVsZS5vIC1sZnBlCiAgICAgICovCiAjaW5jbHVkZSA8c2lnZnBlLmg+CiAgICAgdHlwZWRlZiB2b2lkIHVzZXJfcm91dGluZSAodW5zaWduZWRbNV0sIGludFsyXSk7CiAgICAgdHlwZWRlZiB2b2lkIGFib3J0X3JvdXRpbmUgKHVuc2lnbmVkIGxvbmcpOwogICAgIGhhbmRsZV9zaWdmcGVzKF9PRkYsIDAsCi0JCSAodXNlcl9yb3V0aW5lICopMCwKLQkJIF9UVVJOX09GRl9IQU5ETEVSX09OX0VSUk9SLAotCQkgTlVMTCk7CisgICAgICAgICAgICAgICAgICh1c2VyX3JvdXRpbmUgKikwLAorICAgICAgICAgICAgICAgICBfVFVSTl9PRkZfSEFORExFUl9PTl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgaGFuZGxlX3NpZ2ZwZXMoX09OLCBfRU5fT1ZFUkZMIHwgX0VOX0RJVlpFUk8gfCBfRU5fSU5WQUxJRCwKLQkJICh1c2VyX3JvdXRpbmUgKikwLAotCQkgX0FCT1JUX09OX0VSUk9SLAotCQkgTlVMTCk7CisgICAgICAgICAgICAgICAgICh1c2VyX3JvdXRpbmUgKikwLAorICAgICAgICAgICAgICAgICBfQUJPUlRfT05fRVJST1IsCisgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgIFB5T1Nfc2V0c2lnKFNJR0ZQRSwgaGFuZGxlcik7CiAKIC8qLS0gU3VuT1MgYW5kIFNvbGFyaXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xOTQsMTYgKzE5NCwxNiBAQAogCiAvKi0tIERFQyBBTFBIQSBWTVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2VsaWYgZGVmaW5lZChfX0FMUEhBKSAmJiBkZWZpbmVkKF9fVk1TKQotCUlFRUUgY2xybXNrOwotCUlFRUUgc2V0bXNrOwotCWNscm1zay5pZWVlJHFfZmxhZ3MgPQotCQlJRUVFJE1fVFJBUF9FTkFCTEVfVU5GIHwgIElFRUUkTV9UUkFQX0VOQUJMRV9JTkUgfAotCQkgSUVFRSRNX01BUF9VTVo7Ci0Jc2V0bXNrLmllZWUkcV9mbGFncyA9Ci0JCUlFRUUkTV9UUkFQX0VOQUJMRV9JTlYgfCBJRUVFJE1fVFJBUF9FTkFCTEVfRFpFIHwKLQkJSUVFRSRNX1RSQVBfRU5BQkxFX09WRjsKLQlzeXMkaWVlZV9zZXRfZnBfY29udHJvbCgmY2xybXNrLCAmc2V0bXNrLCAwKTsKLQlQeU9TX3NldHNpZyhTSUdGUEUsIGhhbmRsZXIpOworICAgICAgICBJRUVFIGNscm1zazsKKyAgICAgICAgSUVFRSBzZXRtc2s7CisgICAgICAgIGNscm1zay5pZWVlJHFfZmxhZ3MgPQorICAgICAgICAgICAgICAgIElFRUUkTV9UUkFQX0VOQUJMRV9VTkYgfCAgSUVFRSRNX1RSQVBfRU5BQkxFX0lORSB8CisgICAgICAgICAgICAgICAgIElFRUUkTV9NQVBfVU1aOworICAgICAgICBzZXRtc2suaWVlZSRxX2ZsYWdzID0KKyAgICAgICAgICAgICAgICBJRUVFJE1fVFJBUF9FTkFCTEVfSU5WIHwgSUVFRSRNX1RSQVBfRU5BQkxFX0RaRSB8CisgICAgICAgICAgICAgICAgSUVFRSRNX1RSQVBfRU5BQkxFX09WRjsKKyAgICAgICAgc3lzJGllZWVfc2V0X2ZwX2NvbnRyb2woJmNscm1zaywgJnNldG1zaywgMCk7CisgICAgICAgIFB5T1Nfc2V0c2lnKFNJR0ZQRSwgaGFuZGxlcik7CiAKIC8qLS0gSFAgSUE2NCBWTVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2VsaWYgZGVmaW5lZChfX2lhNjQpICYmIGRlZmluZWQoX19WTVMpCkBAIC0yNjIsMTMgKzI2MiwxMyBAQAogICAgIGZwcmVzZXRzdGlja3koZnBnZXRzdGlja3koKSk7CiAgICAgZnBzZXRtYXNrKDApOwogI2VsaWYgZGVmaW5lZChfX1ZNUykKLQlJRUVFIGNscm1zazsKLQkgY2xybXNrLmllZWUkcV9mbGFncyA9Ci0JCUlFRUUkTV9UUkFQX0VOQUJMRV9VTkYgfCAgSUVFRSRNX1RSQVBfRU5BQkxFX0lORSB8Ci0JCUlFRUUkTV9NQVBfVU1aIHwgSUVFRSRNX1RSQVBfRU5BQkxFX0lOViB8Ci0JCUlFRUUkTV9UUkFQX0VOQUJMRV9EWkUgfCBJRUVFJE1fVFJBUF9FTkFCTEVfT1ZGIHwKLQkJSUVFRSRNX0lOSEVSSVQ7Ci0Jc3lzJGllZWVfc2V0X2ZwX2NvbnRyb2woJmNscm1zaywgMCwgMCk7CisgICAgICAgIElFRUUgY2xybXNrOworICAgICAgICAgY2xybXNrLmllZWUkcV9mbGFncyA9CisgICAgICAgICAgICAgICAgSUVFRSRNX1RSQVBfRU5BQkxFX1VORiB8ICBJRUVFJE1fVFJBUF9FTkFCTEVfSU5FIHwKKyAgICAgICAgICAgICAgICBJRUVFJE1fTUFQX1VNWiB8IElFRUUkTV9UUkFQX0VOQUJMRV9JTlYgfAorICAgICAgICAgICAgICAgIElFRUUkTV9UUkFQX0VOQUJMRV9EWkUgfCBJRUVFJE1fVFJBUF9FTkFCTEVfT1ZGIHwKKyAgICAgICAgICAgICAgICBJRUVFJE1fSU5IRVJJVDsKKyAgICAgICAgc3lzJGllZWVfc2V0X2ZwX2NvbnRyb2woJmNscm1zaywgMCwgMCk7CiAjZWxzZQogICAgIGZwdXRzKCJPcGVyYXRpb24gbm90IGltcGxlbWVudGVkXG4iLCBzdGRlcnIpOwogI2VuZGlmCkBAIC0yOTEsMTEgKzI5MSwxMSBAQAogICAgIFB5T2JqZWN0ICptLCAqZDsKICAgICBtID0gUHlfSW5pdE1vZHVsZSgiZnBlY3RsIiwgZnBlY3RsX21ldGhvZHMpOwogICAgIGlmIChtID09IE5VTEwpCi0gICAgCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogICAgIGZwZV9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiZnBlY3RsLmVycm9yIiwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKGZwZV9lcnJvciAhPSBOVUxMKQotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIGZwZV9lcnJvcik7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIGZwZV9lcnJvcik7CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9mdXR1cmVfYnVpbHRpbnMuYyBiL01vZHVsZXMvZnV0dXJlX2J1aWx0aW5zLmMKaW5kZXggNGM4NDBmYi4uMWFhZTJjYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9mdXR1cmVfYnVpbHRpbnMuYworKysgYi9Nb2R1bGVzL2Z1dHVyZV9idWlsdGlucy5jCkBAIC0yNCw3ICsyNCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9oZXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBQeU51bWJlcl9Ub0Jhc2UodiwgMTYpOworICAgIHJldHVybiBQeU51bWJlcl9Ub0Jhc2UodiwgMTYpOwogfQogCiBQeURvY19TVFJWQVIoaGV4X2RvYywKQEAgLTM2LDcgKzM2LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX29jdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5TnVtYmVyX1RvQmFzZSh2LCA4KTsKKyAgICByZXR1cm4gUHlOdW1iZXJfVG9CYXNlKHYsIDgpOwogfQogCiBQeURvY19TVFJWQVIob2N0X2RvYywKQEAgLTQ4LDcgKzQ4LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2FzY2lpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlPYmplY3RfUmVwcih2KTsKKyAgICByZXR1cm4gUHlPYmplY3RfUmVwcih2KTsKIH0KIAogUHlEb2NfU1RSVkFSKGFzY2lpX2RvYywKQEAgLTYxLDEwICs2MSwxMCBAQAogLyogTGlzdCBvZiBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9mdW5jdGlvbnNbXSA9IHsKLSAJeyJoZXgiLAkJYnVpbHRpbl9oZXgsICAgICAgICBNRVRIX08sIGhleF9kb2N9LAotIAl7Im9jdCIsCQlidWlsdGluX29jdCwgICAgICAgIE1FVEhfTywgb2N0X2RvY30sCi0JeyJhc2NpaSIsCWJ1aWx0aW5fYXNjaWksICAgICAgTUVUSF9PLCBhc2NpaV9kb2N9LAotCXtOVUxMLAkJTlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7ImhleCIsICAgICAgICAgICAgIGJ1aWx0aW5faGV4LCAgICAgICAgTUVUSF9PLCBoZXhfZG9jfSwKKyAgICB7Im9jdCIsICAgICAgICAgICAgIGJ1aWx0aW5fb2N0LCAgICAgICAgTUVUSF9PLCBvY3RfZG9jfSwKKyAgICB7ImFzY2lpIiwgICAgICAgICAgIGJ1aWx0aW5fYXNjaWksICAgICAgTUVUSF9PLCBhc2NpaV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBTZW50aW5lbCAqLwogfTsKIAogCkBAIC03MywyNCArNzMsMjQgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0ZnV0dXJlX2J1aWx0aW5zKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICppdGVydG9vbHMsICppdGVyX2Z1bmM7Ci0JY2hhciAqaXRfZnVuY3NbXSA9IHsiaW1hcCIsICJpZmlsdGVyIiwgIml6aXAiLCBOVUxMfTsKLQljaGFyICoqY3VyX2Z1bmM7CisgICAgUHlPYmplY3QgKm0sICppdGVydG9vbHMsICppdGVyX2Z1bmM7CisgICAgY2hhciAqaXRfZnVuY3NbXSA9IHsiaW1hcCIsICJpZmlsdGVyIiwgIml6aXAiLCBOVUxMfTsKKyAgICBjaGFyICoqY3VyX2Z1bmM7CiAKLQltID0gUHlfSW5pdE1vZHVsZTMoImZ1dHVyZV9idWlsdGlucyIsIG1vZHVsZV9mdW5jdGlvbnMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoImZ1dHVyZV9idWlsdGlucyIsIG1vZHVsZV9mdW5jdGlvbnMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWl0ZXJ0b29scyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIml0ZXJ0b29scyIpOwotCWlmIChpdGVydG9vbHMgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIGl0ZXJ0b29scyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIml0ZXJ0b29scyIpOworICAgIGlmIChpdGVydG9vbHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JZm9yIChjdXJfZnVuYyA9IGl0X2Z1bmNzOyAqY3VyX2Z1bmM7ICsrY3VyX2Z1bmMpewotCQlpdGVyX2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGl0ZXJ0b29scywgKmN1cl9mdW5jKTsKLQkJaWYgKGl0ZXJfZnVuYyA9PSBOVUxMKQotCQkJcmV0dXJuOwotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgKmN1cl9mdW5jKzEsIGl0ZXJfZnVuYyk7Ci0JfQotCVB5X0RFQ1JFRihpdGVydG9vbHMpOwotCS8qIGFueSBvdGhlciBpbml0aWFsaXphdGlvbiBuZWVkZWQgKi8KKyAgICBmb3IgKGN1cl9mdW5jID0gaXRfZnVuY3M7ICpjdXJfZnVuYzsgKytjdXJfZnVuYyl7CisgICAgICAgIGl0ZXJfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoaXRlcnRvb2xzLCAqY3VyX2Z1bmMpOworICAgICAgICBpZiAoaXRlcl9mdW5jID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAqY3VyX2Z1bmMrMSwgaXRlcl9mdW5jKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0ZXJ0b29scyk7CisgICAgLyogYW55IG90aGVyIGluaXRpYWxpemF0aW9uIG5lZWRlZCAqLwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nY21vZHVsZS5jIGIvTW9kdWxlcy9nY21vZHVsZS5jCmluZGV4IDQ5Y2Y3MTYuLjNjY2JhNTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2Ntb2R1bGUuYworKysgYi9Nb2R1bGVzL2djbW9kdWxlLmMKQEAgLTE5LDcgKzE5LDcgQEAKICovCiAKICNpbmNsdWRlICJQeXRob24uaCIKLSNpbmNsdWRlICJmcmFtZW9iamVjdC5oIgkvKiBmb3IgUHlGcmFtZV9DbGVhckZyZWVMaXN0ICovCisjaW5jbHVkZSAiZnJhbWVvYmplY3QuaCIgICAgICAgIC8qIGZvciBQeUZyYW1lX0NsZWFyRnJlZUxpc3QgKi8KIAogLyogR2V0IGFuIG9iamVjdCdzIEdDIGhlYWQgKi8KICNkZWZpbmUgQVNfR0MobykgKChQeUdDX0hlYWQgKikobyktMSkKQEAgLTMwLDEwICszMCwxMCBAQAogLyoqKiBHbG9iYWwgR0Mgc3RhdGUgKioqLwogCiBzdHJ1Y3QgZ2NfZ2VuZXJhdGlvbiB7Ci0JUHlHQ19IZWFkIGhlYWQ7Ci0JaW50IHRocmVzaG9sZDsgLyogY29sbGVjdGlvbiB0aHJlc2hvbGQgKi8KLQlpbnQgY291bnQ7IC8qIGNvdW50IG9mIGFsbG9jYXRpb25zIG9yIGNvbGxlY3Rpb25zIG9mIHlvdW5nZXIKLQkJICAgICAgZ2VuZXJhdGlvbnMgKi8KKyAgICBQeUdDX0hlYWQgaGVhZDsKKyAgICBpbnQgdGhyZXNob2xkOyAvKiBjb2xsZWN0aW9uIHRocmVzaG9sZCAqLworICAgIGludCBjb3VudDsgLyogY291bnQgb2YgYWxsb2NhdGlvbnMgb3IgY29sbGVjdGlvbnMgb2YgeW91bmdlcgorICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnMgKi8KIH07CiAKICNkZWZpbmUgTlVNX0dFTkVSQVRJT05TIDMKQEAgLTQxLDEwICs0MSwxMCBAQAogCiAvKiBsaW5rZWQgbGlzdHMgb2YgY29udGFpbmVyIG9iamVjdHMgKi8KIHN0YXRpYyBzdHJ1Y3QgZ2NfZ2VuZXJhdGlvbiBnZW5lcmF0aW9uc1tOVU1fR0VORVJBVElPTlNdID0gewotCS8qIFB5R0NfSGVhZCwJCQkJdGhyZXNob2xkLAljb3VudCAqLwotCXt7e0dFTl9IRUFEKDApLCBHRU5fSEVBRCgwKSwgMH19LAk3MDAsCQkwfSwKLQl7e3tHRU5fSEVBRCgxKSwgR0VOX0hFQUQoMSksIDB9fSwJMTAsCQkwfSwKLQl7e3tHRU5fSEVBRCgyKSwgR0VOX0hFQUQoMiksIDB9fSwJMTAsCQkwfSwKKyAgICAvKiBQeUdDX0hlYWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCwgICAgICBjb3VudCAqLworICAgIHt7e0dFTl9IRUFEKDApLCBHRU5fSEVBRCgwKSwgMH19LCAgICAgICAgICAgNzAwLCAgICAgICAgICAgIDB9LAorICAgIHt7e0dFTl9IRUFEKDEpLCBHRU5fSEVBRCgxKSwgMH19LCAgICAgICAgICAgMTAsICAgICAgICAgICAgIDB9LAorICAgIHt7e0dFTl9IRUFEKDIpLCBHRU5fSEVBRCgyKSwgMH19LCAgICAgICAgICAgMTAsICAgICAgICAgICAgIDB9LAogfTsKIAogUHlHQ19IZWFkICpfUHlHQ19nZW5lcmF0aW9uMCA9IEdFTl9IRUFEKDApOwpAQCAtNjQsMTcgKzY0LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKmRlbHN0ciA9IE5VTEw7CiAKIC8qIHNldCBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIERFQlVHX1NUQVRTCQkoMTw8MCkgLyogcHJpbnQgY29sbGVjdGlvbiBzdGF0aXN0aWNzICovCi0jZGVmaW5lIERFQlVHX0NPTExFQ1RBQkxFCSgxPDwxKSAvKiBwcmludCBjb2xsZWN0YWJsZSBvYmplY3RzICovCi0jZGVmaW5lIERFQlVHX1VOQ09MTEVDVEFCTEUJKDE8PDIpIC8qIHByaW50IHVuY29sbGVjdGFibGUgb2JqZWN0cyAqLwotI2RlZmluZSBERUJVR19JTlNUQU5DRVMJCSgxPDwzKSAvKiBwcmludCBpbnN0YW5jZXMgKi8KLSNkZWZpbmUgREVCVUdfT0JKRUNUUwkJKDE8PDQpIC8qIHByaW50IG90aGVyIG9iamVjdHMgKi8KLSNkZWZpbmUgREVCVUdfU0FWRUFMTAkJKDE8PDUpIC8qIHNhdmUgYWxsIGdhcmJhZ2UgaW4gZ2MuZ2FyYmFnZSAqLwotI2RlZmluZSBERUJVR19MRUFLCQlERUJVR19DT0xMRUNUQUJMRSB8IFwKLQkJCQlERUJVR19VTkNPTExFQ1RBQkxFIHwgXAotCQkJCURFQlVHX0lOU1RBTkNFUyB8IFwKLQkJCQlERUJVR19PQkpFQ1RTIHwgXAotCQkJCURFQlVHX1NBVkVBTEwKKyNkZWZpbmUgREVCVUdfU1RBVFMgICAgICAgICAgICAgKDE8PDApIC8qIHByaW50IGNvbGxlY3Rpb24gc3RhdGlzdGljcyAqLworI2RlZmluZSBERUJVR19DT0xMRUNUQUJMRSAgICAgICAoMTw8MSkgLyogcHJpbnQgY29sbGVjdGFibGUgb2JqZWN0cyAqLworI2RlZmluZSBERUJVR19VTkNPTExFQ1RBQkxFICAgICAoMTw8MikgLyogcHJpbnQgdW5jb2xsZWN0YWJsZSBvYmplY3RzICovCisjZGVmaW5lIERFQlVHX0lOU1RBTkNFUyAgICAgICAgICgxPDwzKSAvKiBwcmludCBpbnN0YW5jZXMgKi8KKyNkZWZpbmUgREVCVUdfT0JKRUNUUyAgICAgICAgICAgKDE8PDQpIC8qIHByaW50IG90aGVyIG9iamVjdHMgKi8KKyNkZWZpbmUgREVCVUdfU0FWRUFMTCAgICAgICAgICAgKDE8PDUpIC8qIHNhdmUgYWxsIGdhcmJhZ2UgaW4gZ2MuZ2FyYmFnZSAqLworI2RlZmluZSBERUJVR19MRUFLICAgICAgICAgICAgICBERUJVR19DT0xMRUNUQUJMRSB8IFwKKyAgICAgICAgICAgICAgICBERUJVR19VTkNPTExFQ1RBQkxFIHwgXAorICAgICAgICAgICAgICAgIERFQlVHX0lOU1RBTkNFUyB8IFwKKyAgICAgICAgICAgICAgICBERUJVR19PQkpFQ1RTIHwgXAorICAgICAgICAgICAgICAgIERFQlVHX1NBVkVBTEwKIHN0YXRpYyBpbnQgZGVidWc7CiBzdGF0aWMgUHlPYmplY3QgKnRtb2QgPSBOVUxMOwogCkBAIC0xMTcsMjggKzExNywyOCBAQAogICAgIGl0IGhhcyBhIF9fZGVsX18gbWV0aG9kKSwgaXRzIGdjX3JlZnMgaXMgcmVzdG9yZWQgdG8gR0NfUkVBQ0hBQkxFIGFnYWluLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8KLSNkZWZpbmUgR0NfVU5UUkFDS0VECQkJX1B5R0NfUkVGU19VTlRSQUNLRUQKLSNkZWZpbmUgR0NfUkVBQ0hBQkxFCQkJX1B5R0NfUkVGU19SRUFDSEFCTEUKLSNkZWZpbmUgR0NfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUJX1B5R0NfUkVGU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRQorI2RlZmluZSBHQ19VTlRSQUNLRUQgICAgICAgICAgICAgICAgICAgIF9QeUdDX1JFRlNfVU5UUkFDS0VECisjZGVmaW5lIEdDX1JFQUNIQUJMRSAgICAgICAgICAgICAgICAgICAgX1B5R0NfUkVGU19SRUFDSEFCTEUKKyNkZWZpbmUgR0NfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUgICAgICBfUHlHQ19SRUZTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFCiAKICNkZWZpbmUgSVNfVFJBQ0tFRChvKSAoKEFTX0dDKG8pKS0+Z2MuZ2NfcmVmcyAhPSBHQ19VTlRSQUNLRUQpCiAjZGVmaW5lIElTX1JFQUNIQUJMRShvKSAoKEFTX0dDKG8pKS0+Z2MuZ2NfcmVmcyA9PSBHQ19SRUFDSEFCTEUpCiAjZGVmaW5lIElTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKG8pICggXAotCShBU19HQyhvKSktPmdjLmdjX3JlZnMgPT0gR0NfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUpCisgICAgKEFTX0dDKG8pKS0+Z2MuZ2NfcmVmcyA9PSBHQ19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRSkKIAogLyoqKiBsaXN0IGZ1bmN0aW9ucyAqKiovCiAKIHN0YXRpYyB2b2lkCiBnY19saXN0X2luaXQoUHlHQ19IZWFkICpsaXN0KQogewotCWxpc3QtPmdjLmdjX3ByZXYgPSBsaXN0OwotCWxpc3QtPmdjLmdjX25leHQgPSBsaXN0OworICAgIGxpc3QtPmdjLmdjX3ByZXYgPSBsaXN0OworICAgIGxpc3QtPmdjLmdjX25leHQgPSBsaXN0OwogfQogCiBzdGF0aWMgaW50CiBnY19saXN0X2lzX2VtcHR5KFB5R0NfSGVhZCAqbGlzdCkKIHsKLQlyZXR1cm4gKGxpc3QtPmdjLmdjX25leHQgPT0gbGlzdCk7CisgICAgcmV0dXJuIChsaXN0LT5nYy5nY19uZXh0ID09IGxpc3QpOwogfQogCiAjaWYgMApAQCAtMTQ3LDEwICsxNDcsMTAgQEAKIHN0YXRpYyB2b2lkCiBnY19saXN0X2FwcGVuZChQeUdDX0hlYWQgKm5vZGUsIFB5R0NfSGVhZCAqbGlzdCkKIHsKLQlub2RlLT5nYy5nY19uZXh0ID0gbGlzdDsKLQlub2RlLT5nYy5nY19wcmV2ID0gbGlzdC0+Z2MuZ2NfcHJldjsKLQlub2RlLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gbm9kZTsKLQlsaXN0LT5nYy5nY19wcmV2ID0gbm9kZTsKKyAgICBub2RlLT5nYy5nY19uZXh0ID0gbGlzdDsKKyAgICBub2RlLT5nYy5nY19wcmV2ID0gbGlzdC0+Z2MuZ2NfcHJldjsKKyAgICBub2RlLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gbm9kZTsKKyAgICBsaXN0LT5nYy5nY19wcmV2ID0gbm9kZTsKIH0KICNlbmRpZgogCkBAIC0xNTgsOSArMTU4LDkgQEAKIHN0YXRpYyB2b2lkCiBnY19saXN0X3JlbW92ZShQeUdDX0hlYWQgKm5vZGUpCiB7Ci0Jbm9kZS0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IG5vZGUtPmdjLmdjX25leHQ7Ci0Jbm9kZS0+Z2MuZ2NfbmV4dC0+Z2MuZ2NfcHJldiA9IG5vZGUtPmdjLmdjX3ByZXY7Ci0Jbm9kZS0+Z2MuZ2NfbmV4dCA9IE5VTEw7IC8qIG9iamVjdCBpcyBub3QgY3VycmVudGx5IHRyYWNrZWQgKi8KKyAgICBub2RlLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gbm9kZS0+Z2MuZ2NfbmV4dDsKKyAgICBub2RlLT5nYy5nY19uZXh0LT5nYy5nY19wcmV2ID0gbm9kZS0+Z2MuZ2NfcHJldjsKKyAgICBub2RlLT5nYy5nY19uZXh0ID0gTlVMTDsgLyogb2JqZWN0IGlzIG5vdCBjdXJyZW50bHkgdHJhY2tlZCAqLwogfQogCiAvKiBNb3ZlIGBub2RlYCBmcm9tIHRoZSBnYyBsaXN0IGl0J3MgY3VycmVudGx5IGluICh3aGljaCBpcyBub3QgZXhwbGljaXRseQpAQCAtMTcwLDQzICsxNzAsNDMgQEAKIHN0YXRpYyB2b2lkCiBnY19saXN0X21vdmUoUHlHQ19IZWFkICpub2RlLCBQeUdDX0hlYWQgKmxpc3QpCiB7Ci0JUHlHQ19IZWFkICpuZXdfcHJldjsKLQlQeUdDX0hlYWQgKmN1cnJlbnRfcHJldiA9IG5vZGUtPmdjLmdjX3ByZXY7Ci0JUHlHQ19IZWFkICpjdXJyZW50X25leHQgPSBub2RlLT5nYy5nY19uZXh0OwotCS8qIFVubGluayBmcm9tIGN1cnJlbnQgbGlzdC4gKi8KLQljdXJyZW50X3ByZXYtPmdjLmdjX25leHQgPSBjdXJyZW50X25leHQ7Ci0JY3VycmVudF9uZXh0LT5nYy5nY19wcmV2ID0gY3VycmVudF9wcmV2OwotCS8qIFJlbGluayBhdCBlbmQgb2YgbmV3IGxpc3QuICovCi0JbmV3X3ByZXYgPSBub2RlLT5nYy5nY19wcmV2ID0gbGlzdC0+Z2MuZ2NfcHJldjsKLQluZXdfcHJldi0+Z2MuZ2NfbmV4dCA9IGxpc3QtPmdjLmdjX3ByZXYgPSBub2RlOwotCW5vZGUtPmdjLmdjX25leHQgPSBsaXN0OworICAgIFB5R0NfSGVhZCAqbmV3X3ByZXY7CisgICAgUHlHQ19IZWFkICpjdXJyZW50X3ByZXYgPSBub2RlLT5nYy5nY19wcmV2OworICAgIFB5R0NfSGVhZCAqY3VycmVudF9uZXh0ID0gbm9kZS0+Z2MuZ2NfbmV4dDsKKyAgICAvKiBVbmxpbmsgZnJvbSBjdXJyZW50IGxpc3QuICovCisgICAgY3VycmVudF9wcmV2LT5nYy5nY19uZXh0ID0gY3VycmVudF9uZXh0OworICAgIGN1cnJlbnRfbmV4dC0+Z2MuZ2NfcHJldiA9IGN1cnJlbnRfcHJldjsKKyAgICAvKiBSZWxpbmsgYXQgZW5kIG9mIG5ldyBsaXN0LiAqLworICAgIG5ld19wcmV2ID0gbm9kZS0+Z2MuZ2NfcHJldiA9IGxpc3QtPmdjLmdjX3ByZXY7CisgICAgbmV3X3ByZXYtPmdjLmdjX25leHQgPSBsaXN0LT5nYy5nY19wcmV2ID0gbm9kZTsKKyAgICBub2RlLT5nYy5nY19uZXh0ID0gbGlzdDsKIH0KIAogLyogYXBwZW5kIGxpc3QgYGZyb21gIG9udG8gbGlzdCBgdG9gOyBgZnJvbWAgYmVjb21lcyBhbiBlbXB0eSBsaXN0ICovCiBzdGF0aWMgdm9pZAogZ2NfbGlzdF9tZXJnZShQeUdDX0hlYWQgKmZyb20sIFB5R0NfSGVhZCAqdG8pCiB7Ci0JUHlHQ19IZWFkICp0YWlsOwotCWFzc2VydChmcm9tICE9IHRvKTsKLQlpZiAoIWdjX2xpc3RfaXNfZW1wdHkoZnJvbSkpIHsKLQkJdGFpbCA9IHRvLT5nYy5nY19wcmV2OwotCQl0YWlsLT5nYy5nY19uZXh0ID0gZnJvbS0+Z2MuZ2NfbmV4dDsKLQkJdGFpbC0+Z2MuZ2NfbmV4dC0+Z2MuZ2NfcHJldiA9IHRhaWw7Ci0JCXRvLT5nYy5nY19wcmV2ID0gZnJvbS0+Z2MuZ2NfcHJldjsKLQkJdG8tPmdjLmdjX3ByZXYtPmdjLmdjX25leHQgPSB0bzsKLQl9Ci0JZ2NfbGlzdF9pbml0KGZyb20pOworICAgIFB5R0NfSGVhZCAqdGFpbDsKKyAgICBhc3NlcnQoZnJvbSAhPSB0byk7CisgICAgaWYgKCFnY19saXN0X2lzX2VtcHR5KGZyb20pKSB7CisgICAgICAgIHRhaWwgPSB0by0+Z2MuZ2NfcHJldjsKKyAgICAgICAgdGFpbC0+Z2MuZ2NfbmV4dCA9IGZyb20tPmdjLmdjX25leHQ7CisgICAgICAgIHRhaWwtPmdjLmdjX25leHQtPmdjLmdjX3ByZXYgPSB0YWlsOworICAgICAgICB0by0+Z2MuZ2NfcHJldiA9IGZyb20tPmdjLmdjX3ByZXY7CisgICAgICAgIHRvLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gdG87CisgICAgfQorICAgIGdjX2xpc3RfaW5pdChmcm9tKTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGdjX2xpc3Rfc2l6ZShQeUdDX0hlYWQgKmxpc3QpCiB7Ci0JUHlHQ19IZWFkICpnYzsKLQlQeV9zc2l6ZV90IG4gPSAwOwotCWZvciAoZ2MgPSBsaXN0LT5nYy5nY19uZXh0OyBnYyAhPSBsaXN0OyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7Ci0JCW4rKzsKLQl9Ci0JcmV0dXJuIG47CisgICAgUHlHQ19IZWFkICpnYzsKKyAgICBQeV9zc2l6ZV90IG4gPSAwOworICAgIGZvciAoZ2MgPSBsaXN0LT5nYy5nY19uZXh0OyBnYyAhPSBsaXN0OyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7CisgICAgICAgIG4rKzsKKyAgICB9CisgICAgcmV0dXJuIG47CiB9CiAKIC8qIEFwcGVuZCBvYmplY3RzIGluIGEgR0MgbGlzdCB0byBhIFB5dGhvbiBsaXN0LgpAQCAtMjE1LDE2ICsyMTUsMTYgQEAKIHN0YXRpYyBpbnQKIGFwcGVuZF9vYmplY3RzKFB5T2JqZWN0ICpweV9saXN0LCBQeUdDX0hlYWQgKmdjX2xpc3QpCiB7Ci0JUHlHQ19IZWFkICpnYzsKLQlmb3IgKGdjID0gZ2NfbGlzdC0+Z2MuZ2NfbmV4dDsgZ2MgIT0gZ2NfbGlzdDsgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgewotCQlQeU9iamVjdCAqb3AgPSBGUk9NX0dDKGdjKTsKLQkJaWYgKG9wICE9IHB5X2xpc3QpIHsKLQkJCWlmIChQeUxpc3RfQXBwZW5kKHB5X2xpc3QsIG9wKSkgewotCQkJCXJldHVybiAtMTsgLyogZXhjZXB0aW9uICovCi0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgUHlHQ19IZWFkICpnYzsKKyAgICBmb3IgKGdjID0gZ2NfbGlzdC0+Z2MuZ2NfbmV4dDsgZ2MgIT0gZ2NfbGlzdDsgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgeworICAgICAgICBQeU9iamVjdCAqb3AgPSBGUk9NX0dDKGdjKTsKKyAgICAgICAgaWYgKG9wICE9IHB5X2xpc3QpIHsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHB5X2xpc3QsIG9wKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLyogZXhjZXB0aW9uICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKiogZW5kIG9mIGxpc3Qgc3R1ZmYgKioqLwpAQCAtMjM3LDQ4ICsyMzcsNDggQEAKIHN0YXRpYyB2b2lkCiB1cGRhdGVfcmVmcyhQeUdDX0hlYWQgKmNvbnRhaW5lcnMpCiB7Ci0JUHlHQ19IZWFkICpnYyA9IGNvbnRhaW5lcnMtPmdjLmdjX25leHQ7Ci0JZm9yICg7IGdjICE9IGNvbnRhaW5lcnM7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKLQkJYXNzZXJ0KGdjLT5nYy5nY19yZWZzID09IEdDX1JFQUNIQUJMRSk7Ci0JCWdjLT5nYy5nY19yZWZzID0gUHlfUkVGQ05UKEZST01fR0MoZ2MpKTsKLQkJLyogUHl0aG9uJ3MgY3ljbGljIGdjIHNob3VsZCBuZXZlciBzZWUgYW4gaW5jb21pbmcgcmVmY291bnQKLQkJICogb2YgMDogIGlmIHNvbWV0aGluZyBkZWNyZWYnZWQgdG8gMCwgaXQgc2hvdWxkIGhhdmUgYmVlbgotCQkgKiBkZWFsbG9jYXRlZCBpbW1lZGlhdGVseSBhdCB0aGF0IHRpbWUuCi0JCSAqIFBvc3NpYmxlIGNhdXNlIChpZiB0aGUgYXNzZXJ0IHRyaWdnZXJzKTogIGEgdHBfZGVhbGxvYwotCQkgKiByb3V0aW5lIGxlZnQgYSBnYy1hd2FyZSBvYmplY3QgdHJhY2tlZCBkdXJpbmcgaXRzIHRlYXJkb3duCi0JCSAqIHBoYXNlLCBhbmQgZGlkIHNvbWV0aGluZy0tIG9yIGFsbG93ZWQgc29tZXRoaW5nIHRvIGhhcHBlbiAtLQotCQkgKiB0aGF0IGNhbGxlZCBiYWNrIGludG8gUHl0aG9uLiAgZ2MgY2FuIHRyaWdnZXIgdGhlbiwgYW5kIG1heQotCQkgKiBzZWUgdGhlIHN0aWxsLXRyYWNrZWQgZHlpbmcgb2JqZWN0LiAgQmVmb3JlIHRoaXMgYXNzZXJ0Ci0JCSAqIHdhcyBhZGRlZCwgc3VjaCBtaXN0YWtlcyB3ZW50IG9uIHRvIGFsbG93IGdjIHRvIHRyeSB0bwotCQkgKiBkZWxldGUgdGhlIG9iamVjdCBhZ2Fpbi4gIEluIGEgZGVidWcgYnVpbGQsIHRoYXQgY2F1c2VkCi0JCSAqIGEgbXlzdGVyaW91cyBzZWdmYXVsdCwgd2hlbiBfUHlfRm9yZ2V0UmVmZXJlbmNlIHRyaWVkCi0JCSAqIHRvIHJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGRvdWJseS1saW5rZWQgbGlzdCBvZiBhbGwKLQkJICogb2JqZWN0cyBhIHNlY29uZCB0aW1lLiAgSW4gYSByZWxlYXNlIGJ1aWxkLCBhbiBhY3R1YWwKLQkJICogZG91YmxlIGRlYWxsb2NhdGlvbiBvY2N1cnJlZCwgd2hpY2ggbGVhZHMgdG8gY29ycnVwdGlvbgotCQkgKiBvZiB0aGUgYWxsb2NhdG9yJ3MgaW50ZXJuYWwgYm9va2tlZXBpbmcgcG9pbnRlcnMuICBUaGF0J3MKLQkJICogc28gc2VyaW91cyB0aGF0IG1heWJlIHRoaXMgc2hvdWxkIGJlIGEgcmVsZWFzZS1idWlsZAotCQkgKiBjaGVjayBpbnN0ZWFkIG9mIGFuIGFzc2VydD8KLQkJICovCi0JCWFzc2VydChnYy0+Z2MuZ2NfcmVmcyAhPSAwKTsKLQl9CisgICAgUHlHQ19IZWFkICpnYyA9IGNvbnRhaW5lcnMtPmdjLmdjX25leHQ7CisgICAgZm9yICg7IGdjICE9IGNvbnRhaW5lcnM7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKKyAgICAgICAgYXNzZXJ0KGdjLT5nYy5nY19yZWZzID09IEdDX1JFQUNIQUJMRSk7CisgICAgICAgIGdjLT5nYy5nY19yZWZzID0gUHlfUkVGQ05UKEZST01fR0MoZ2MpKTsKKyAgICAgICAgLyogUHl0aG9uJ3MgY3ljbGljIGdjIHNob3VsZCBuZXZlciBzZWUgYW4gaW5jb21pbmcgcmVmY291bnQKKyAgICAgICAgICogb2YgMDogIGlmIHNvbWV0aGluZyBkZWNyZWYnZWQgdG8gMCwgaXQgc2hvdWxkIGhhdmUgYmVlbgorICAgICAgICAgKiBkZWFsbG9jYXRlZCBpbW1lZGlhdGVseSBhdCB0aGF0IHRpbWUuCisgICAgICAgICAqIFBvc3NpYmxlIGNhdXNlIChpZiB0aGUgYXNzZXJ0IHRyaWdnZXJzKTogIGEgdHBfZGVhbGxvYworICAgICAgICAgKiByb3V0aW5lIGxlZnQgYSBnYy1hd2FyZSBvYmplY3QgdHJhY2tlZCBkdXJpbmcgaXRzIHRlYXJkb3duCisgICAgICAgICAqIHBoYXNlLCBhbmQgZGlkIHNvbWV0aGluZy0tIG9yIGFsbG93ZWQgc29tZXRoaW5nIHRvIGhhcHBlbiAtLQorICAgICAgICAgKiB0aGF0IGNhbGxlZCBiYWNrIGludG8gUHl0aG9uLiAgZ2MgY2FuIHRyaWdnZXIgdGhlbiwgYW5kIG1heQorICAgICAgICAgKiBzZWUgdGhlIHN0aWxsLXRyYWNrZWQgZHlpbmcgb2JqZWN0LiAgQmVmb3JlIHRoaXMgYXNzZXJ0CisgICAgICAgICAqIHdhcyBhZGRlZCwgc3VjaCBtaXN0YWtlcyB3ZW50IG9uIHRvIGFsbG93IGdjIHRvIHRyeSB0bworICAgICAgICAgKiBkZWxldGUgdGhlIG9iamVjdCBhZ2Fpbi4gIEluIGEgZGVidWcgYnVpbGQsIHRoYXQgY2F1c2VkCisgICAgICAgICAqIGEgbXlzdGVyaW91cyBzZWdmYXVsdCwgd2hlbiBfUHlfRm9yZ2V0UmVmZXJlbmNlIHRyaWVkCisgICAgICAgICAqIHRvIHJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGRvdWJseS1saW5rZWQgbGlzdCBvZiBhbGwKKyAgICAgICAgICogb2JqZWN0cyBhIHNlY29uZCB0aW1lLiAgSW4gYSByZWxlYXNlIGJ1aWxkLCBhbiBhY3R1YWwKKyAgICAgICAgICogZG91YmxlIGRlYWxsb2NhdGlvbiBvY2N1cnJlZCwgd2hpY2ggbGVhZHMgdG8gY29ycnVwdGlvbgorICAgICAgICAgKiBvZiB0aGUgYWxsb2NhdG9yJ3MgaW50ZXJuYWwgYm9va2tlZXBpbmcgcG9pbnRlcnMuICBUaGF0J3MKKyAgICAgICAgICogc28gc2VyaW91cyB0aGF0IG1heWJlIHRoaXMgc2hvdWxkIGJlIGEgcmVsZWFzZS1idWlsZAorICAgICAgICAgKiBjaGVjayBpbnN0ZWFkIG9mIGFuIGFzc2VydD8KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydChnYy0+Z2MuZ2NfcmVmcyAhPSAwKTsKKyAgICB9CiB9CiAKIC8qIEEgdHJhdmVyc2FsIGNhbGxiYWNrIGZvciBzdWJ0cmFjdF9yZWZzLiAqLwogc3RhdGljIGludAogdmlzaXRfZGVjcmVmKFB5T2JqZWN0ICpvcCwgdm9pZCAqZGF0YSkKIHsKLSAgICAgICAgYXNzZXJ0KG9wICE9IE5VTEwpOwotCWlmIChQeU9iamVjdF9JU19HQyhvcCkpIHsKLQkJUHlHQ19IZWFkICpnYyA9IEFTX0dDKG9wKTsKLQkJLyogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGdjX3JlZnMgZm9yIG9iamVjdHMgaW4gdGhlCi0JCSAqIGdlbmVyYXRpb24gYmVpbmcgY29sbGVjdGVkLCB3aGljaCBjYW4gYmUgcmVjb2duaXplZAotCQkgKiBiZWNhdXNlIG9ubHkgdGhleSBoYXZlIHBvc2l0aXZlIGdjX3JlZnMuCi0JCSAqLwotCQlhc3NlcnQoZ2MtPmdjLmdjX3JlZnMgIT0gMCk7IC8qIGVsc2UgcmVmY291bnQgd2FzIHRvbyBzbWFsbCAqLwotCQlpZiAoZ2MtPmdjLmdjX3JlZnMgPiAwKQotCQkJZ2MtPmdjLmdjX3JlZnMtLTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgYXNzZXJ0KG9wICE9IE5VTEwpOworICAgIGlmIChQeU9iamVjdF9JU19HQyhvcCkpIHsKKyAgICAgICAgUHlHQ19IZWFkICpnYyA9IEFTX0dDKG9wKTsKKyAgICAgICAgLyogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGdjX3JlZnMgZm9yIG9iamVjdHMgaW4gdGhlCisgICAgICAgICAqIGdlbmVyYXRpb24gYmVpbmcgY29sbGVjdGVkLCB3aGljaCBjYW4gYmUgcmVjb2duaXplZAorICAgICAgICAgKiBiZWNhdXNlIG9ubHkgdGhleSBoYXZlIHBvc2l0aXZlIGdjX3JlZnMuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQoZ2MtPmdjLmdjX3JlZnMgIT0gMCk7IC8qIGVsc2UgcmVmY291bnQgd2FzIHRvbyBzbWFsbCAqLworICAgICAgICBpZiAoZ2MtPmdjLmdjX3JlZnMgPiAwKQorICAgICAgICAgICAgZ2MtPmdjLmdjX3JlZnMtLTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFN1YnRyYWN0IGludGVybmFsIHJlZmVyZW5jZXMgZnJvbSBnY19yZWZzLiAgQWZ0ZXIgdGhpcywgZ2NfcmVmcyBpcyA+PSAwCkBAIC0yODksNTcgKzI4OSw1NyBAQAogc3RhdGljIHZvaWQKIHN1YnRyYWN0X3JlZnMoUHlHQ19IZWFkICpjb250YWluZXJzKQogewotCXRyYXZlcnNlcHJvYyB0cmF2ZXJzZTsKLQlQeUdDX0hlYWQgKmdjID0gY29udGFpbmVycy0+Z2MuZ2NfbmV4dDsKLQlmb3IgKDsgZ2MgIT0gY29udGFpbmVyczsgZ2M9Z2MtPmdjLmdjX25leHQpIHsKLQkJdHJhdmVyc2UgPSBQeV9UWVBFKEZST01fR0MoZ2MpKS0+dHBfdHJhdmVyc2U7Ci0JCSh2b2lkKSB0cmF2ZXJzZShGUk9NX0dDKGdjKSwKLQkJCSAgICAgICAodmlzaXRwcm9jKXZpc2l0X2RlY3JlZiwKLQkJCSAgICAgICBOVUxMKTsKLQl9CisgICAgdHJhdmVyc2Vwcm9jIHRyYXZlcnNlOworICAgIFB5R0NfSGVhZCAqZ2MgPSBjb250YWluZXJzLT5nYy5nY19uZXh0OworICAgIGZvciAoOyBnYyAhPSBjb250YWluZXJzOyBnYz1nYy0+Z2MuZ2NfbmV4dCkgeworICAgICAgICB0cmF2ZXJzZSA9IFB5X1RZUEUoRlJPTV9HQyhnYykpLT50cF90cmF2ZXJzZTsKKyAgICAgICAgKHZvaWQpIHRyYXZlcnNlKEZST01fR0MoZ2MpLAorICAgICAgICAgICAgICAgICAgICAgICAodmlzaXRwcm9jKXZpc2l0X2RlY3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQogfQogCiAvKiBBIHRyYXZlcnNhbCBjYWxsYmFjayBmb3IgbW92ZV91bnJlYWNoYWJsZS4gKi8KIHN0YXRpYyBpbnQKIHZpc2l0X3JlYWNoYWJsZShQeU9iamVjdCAqb3AsIFB5R0NfSGVhZCAqcmVhY2hhYmxlKQogewotCWlmIChQeU9iamVjdF9JU19HQyhvcCkpIHsKLQkJUHlHQ19IZWFkICpnYyA9IEFTX0dDKG9wKTsKLQkJY29uc3QgUHlfc3NpemVfdCBnY19yZWZzID0gZ2MtPmdjLmdjX3JlZnM7CisgICAgaWYgKFB5T2JqZWN0X0lTX0dDKG9wKSkgeworICAgICAgICBQeUdDX0hlYWQgKmdjID0gQVNfR0Mob3ApOworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IGdjX3JlZnMgPSBnYy0+Z2MuZ2NfcmVmczsKIAotCQlpZiAoZ2NfcmVmcyA9PSAwKSB7Ci0JCQkvKiBUaGlzIGlzIGluIG1vdmVfdW5yZWFjaGFibGUncyAneW91bmcnIGxpc3QsIGJ1dAotCQkJICogdGhlIHRyYXZlcnNhbCBoYXNuJ3QgeWV0IGdvdHRlbiB0byBpdC4gIEFsbAotCQkJICogd2UgbmVlZCB0byBkbyBpcyB0ZWxsIG1vdmVfdW5yZWFjaGFibGUgdGhhdCBpdCdzCi0JCQkgKiByZWFjaGFibGUuCi0JCQkgKi8KLQkJCWdjLT5nYy5nY19yZWZzID0gMTsKLQkJfQotCQllbHNlIGlmIChnY19yZWZzID09IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKSB7Ci0JCQkvKiBUaGlzIGhhZCBnY19yZWZzID0gMCB3aGVuIG1vdmVfdW5yZWFjaGFibGUgZ290Ci0JCQkgKiB0byBpdCwgYnV0IHR1cm5zIG91dCBpdCdzIHJlYWNoYWJsZSBhZnRlciBhbGwuCi0JCQkgKiBNb3ZlIGl0IGJhY2sgdG8gbW92ZV91bnJlYWNoYWJsZSdzICd5b3VuZycgbGlzdCwKLQkJCSAqIGFuZCBtb3ZlX3VucmVhY2hhYmxlIHdpbGwgZXZlbnR1YWxseSBnZXQgdG8gaXQKLQkJCSAqIGFnYWluLgotCQkJICovCi0JCQlnY19saXN0X21vdmUoZ2MsIHJlYWNoYWJsZSk7Ci0JCQlnYy0+Z2MuZ2NfcmVmcyA9IDE7Ci0JCX0KLQkJLyogRWxzZSB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCi0JCSAqIElmIGdjX3JlZnMgPiAwLCBpdCBtdXN0IGJlIGluIG1vdmVfdW5yZWFjaGFibGUncyAneW91bmcnCi0JCSAqIGxpc3QsIGFuZCBtb3ZlX3VucmVhY2hhYmxlIHdpbGwgZXZlbnR1YWxseSBnZXQgdG8gaXQuCi0JCSAqIElmIGdjX3JlZnMgPT0gR0NfUkVBQ0hBQkxFLCBpdCdzIGVpdGhlciBpbiBzb21lIG90aGVyCi0JCSAqIGdlbmVyYXRpb24gc28gd2UgZG9uJ3QgY2FyZSBhYm91dCBpdCwgb3IgbW92ZV91bnJlYWNoYWJsZQotCQkgKiBhbHJlYWR5IGRlYWx0IHdpdGggaXQuCi0JCSAqIElmIGdjX3JlZnMgPT0gR0NfVU5UUkFDS0VELCBpdCBtdXN0IGJlIGlnbm9yZWQuCi0JCSAqLwotCQkgZWxzZSB7Ci0JCSAJYXNzZXJ0KGdjX3JlZnMgPiAwCi0JCSAJICAgICAgIHx8IGdjX3JlZnMgPT0gR0NfUkVBQ0hBQkxFCi0JCSAJICAgICAgIHx8IGdjX3JlZnMgPT0gR0NfVU5UUkFDS0VEKTsKLQkJIH0KLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGlmIChnY19yZWZzID09IDApIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgaW4gbW92ZV91bnJlYWNoYWJsZSdzICd5b3VuZycgbGlzdCwgYnV0CisgICAgICAgICAgICAgKiB0aGUgdHJhdmVyc2FsIGhhc24ndCB5ZXQgZ290dGVuIHRvIGl0LiAgQWxsCisgICAgICAgICAgICAgKiB3ZSBuZWVkIHRvIGRvIGlzIHRlbGwgbW92ZV91bnJlYWNoYWJsZSB0aGF0IGl0J3MKKyAgICAgICAgICAgICAqIHJlYWNoYWJsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZ2MtPmdjLmdjX3JlZnMgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGdjX3JlZnMgPT0gR0NfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaGFkIGdjX3JlZnMgPSAwIHdoZW4gbW92ZV91bnJlYWNoYWJsZSBnb3QKKyAgICAgICAgICAgICAqIHRvIGl0LCBidXQgdHVybnMgb3V0IGl0J3MgcmVhY2hhYmxlIGFmdGVyIGFsbC4KKyAgICAgICAgICAgICAqIE1vdmUgaXQgYmFjayB0byBtb3ZlX3VucmVhY2hhYmxlJ3MgJ3lvdW5nJyBsaXN0LAorICAgICAgICAgICAgICogYW5kIG1vdmVfdW5yZWFjaGFibGUgd2lsbCBldmVudHVhbGx5IGdldCB0byBpdAorICAgICAgICAgICAgICogYWdhaW4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGdjX2xpc3RfbW92ZShnYywgcmVhY2hhYmxlKTsKKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzID0gMTsKKyAgICAgICAgfQorICAgICAgICAvKiBFbHNlIHRoZXJlJ3Mgbm90aGluZyB0byBkby4KKyAgICAgICAgICogSWYgZ2NfcmVmcyA+IDAsIGl0IG11c3QgYmUgaW4gbW92ZV91bnJlYWNoYWJsZSdzICd5b3VuZycKKyAgICAgICAgICogbGlzdCwgYW5kIG1vdmVfdW5yZWFjaGFibGUgd2lsbCBldmVudHVhbGx5IGdldCB0byBpdC4KKyAgICAgICAgICogSWYgZ2NfcmVmcyA9PSBHQ19SRUFDSEFCTEUsIGl0J3MgZWl0aGVyIGluIHNvbWUgb3RoZXIKKyAgICAgICAgICogZ2VuZXJhdGlvbiBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IGl0LCBvciBtb3ZlX3VucmVhY2hhYmxlCisgICAgICAgICAqIGFscmVhZHkgZGVhbHQgd2l0aCBpdC4KKyAgICAgICAgICogSWYgZ2NfcmVmcyA9PSBHQ19VTlRSQUNLRUQsIGl0IG11c3QgYmUgaWdub3JlZC4KKyAgICAgICAgICovCisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChnY19yZWZzID4gMAorICAgICAgICAgICAgICAgICAgIHx8IGdjX3JlZnMgPT0gR0NfUkVBQ0hBQkxFCisgICAgICAgICAgICAgICAgICAgfHwgZ2NfcmVmcyA9PSBHQ19VTlRSQUNLRUQpOworICAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogTW92ZSB0aGUgdW5yZWFjaGFibGUgb2JqZWN0cyBmcm9tIHlvdW5nIHRvIHVucmVhY2hhYmxlLiAgQWZ0ZXIgdGhpcywKQEAgLTM1Myw1MiArMzUzLDUyIEBACiBzdGF0aWMgdm9pZAogbW92ZV91bnJlYWNoYWJsZShQeUdDX0hlYWQgKnlvdW5nLCBQeUdDX0hlYWQgKnVucmVhY2hhYmxlKQogewotCVB5R0NfSGVhZCAqZ2MgPSB5b3VuZy0+Z2MuZ2NfbmV4dDsKKyAgICBQeUdDX0hlYWQgKmdjID0geW91bmctPmdjLmdjX25leHQ7CiAKLQkvKiBJbnZhcmlhbnRzOiAgYWxsIG9iamVjdHMgInRvIHRoZSBsZWZ0IiBvZiB1cyBpbiB5b3VuZyBoYXZlIGdjX3JlZnMKLQkgKiA9IEdDX1JFQUNIQUJMRSwgYW5kIGFyZSBpbmRlZWQgcmVhY2hhYmxlIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KQotCSAqIGZyb20gb3V0c2lkZSB0aGUgeW91bmcgbGlzdCBhcyBpdCB3YXMgYXQgZW50cnkuICBBbGwgb3RoZXIgb2JqZWN0cwotCSAqIGZyb20gdGhlIG9yaWdpbmFsIHlvdW5nICJ0byB0aGUgbGVmdCIgb2YgdXMgYXJlIGluIHVucmVhY2hhYmxlIG5vdywKLQkgKiBhbmQgaGF2ZSBnY19yZWZzID0gR0NfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUuICBBbGwgb2JqZWN0cyB0byB0aGUKLQkgKiBsZWZ0IG9mIHVzIGluICd5b3VuZycgbm93IGhhdmUgYmVlbiBzY2FubmVkLCBhbmQgbm8gb2JqZWN0cyBoZXJlCi0JICogb3IgdG8gdGhlIHJpZ2h0IGhhdmUgYmVlbiBzY2FubmVkIHlldC4KLQkgKi8KKyAgICAvKiBJbnZhcmlhbnRzOiAgYWxsIG9iamVjdHMgInRvIHRoZSBsZWZ0IiBvZiB1cyBpbiB5b3VuZyBoYXZlIGdjX3JlZnMKKyAgICAgKiA9IEdDX1JFQUNIQUJMRSwgYW5kIGFyZSBpbmRlZWQgcmVhY2hhYmxlIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KQorICAgICAqIGZyb20gb3V0c2lkZSB0aGUgeW91bmcgbGlzdCBhcyBpdCB3YXMgYXQgZW50cnkuICBBbGwgb3RoZXIgb2JqZWN0cworICAgICAqIGZyb20gdGhlIG9yaWdpbmFsIHlvdW5nICJ0byB0aGUgbGVmdCIgb2YgdXMgYXJlIGluIHVucmVhY2hhYmxlIG5vdywKKyAgICAgKiBhbmQgaGF2ZSBnY19yZWZzID0gR0NfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUuICBBbGwgb2JqZWN0cyB0byB0aGUKKyAgICAgKiBsZWZ0IG9mIHVzIGluICd5b3VuZycgbm93IGhhdmUgYmVlbiBzY2FubmVkLCBhbmQgbm8gb2JqZWN0cyBoZXJlCisgICAgICogb3IgdG8gdGhlIHJpZ2h0IGhhdmUgYmVlbiBzY2FubmVkIHlldC4KKyAgICAgKi8KIAotCXdoaWxlIChnYyAhPSB5b3VuZykgewotCQlQeUdDX0hlYWQgKm5leHQ7CisgICAgd2hpbGUgKGdjICE9IHlvdW5nKSB7CisgICAgICAgIFB5R0NfSGVhZCAqbmV4dDsKIAotCQlpZiAoZ2MtPmdjLmdjX3JlZnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdjIGlzIGRlZmluaXRlbHkgcmVhY2hhYmxlIGZyb20gb3V0c2lkZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG9yaWdpbmFsICd5b3VuZycuICBNYXJrIGl0IGFzIHN1Y2gsIGFuZCB0cmF2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgICogaXRzIHBvaW50ZXJzIHRvIGZpbmQgYW55IG90aGVyIG9iamVjdHMgdGhhdCBtYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlIGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tIGl0LiAgTm90ZSB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICogY2FsbCB0byB0cF90cmF2ZXJzZSBtYXkgYXBwZW5kIG9iamVjdHMgdG8geW91bmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBzbyB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgaXQgcmV0dXJucyB0byBkZXRlcm1pbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBuZXh0IG9iamVjdCB0byB2aXNpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9wID0gRlJPTV9HQyhnYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZXByb2MgdHJhdmVyc2UgPSBQeV9UWVBFKG9wKS0+dHBfdHJhdmVyc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZ2MtPmdjLmdjX3JlZnMgPiAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzID0gR0NfUkVBQ0hBQkxFOwotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHRyYXZlcnNlKG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2aXNpdHByb2MpdmlzaXRfcmVhY2hhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopeW91bmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGdjLT5nYy5nY19uZXh0OwotCQl9Ci0JCWVsc2UgewotCQkJLyogVGhpcyAqbWF5KiBiZSB1bnJlYWNoYWJsZS4gIFRvIG1ha2UgcHJvZ3Jlc3MsCi0JCQkgKiBhc3N1bWUgaXQgaXMuICBnYyBpc24ndCBkaXJlY3RseSByZWFjaGFibGUgZnJvbQotCQkJICogYW55IG9iamVjdCB3ZSd2ZSBhbHJlYWR5IHRyYXZlcnNlZCwgYnV0IG1heSBiZQotCQkJICogcmVhY2hhYmxlIGZyb20gYW4gb2JqZWN0IHdlIGhhdmVuJ3QgZ290dGVuIHRvIHlldC4KLQkJCSAqIHZpc2l0X3JlYWNoYWJsZSB3aWxsIGV2ZW50dWFsbHkgbW92ZSBnYyBiYWNrIGludG8KLQkJCSAqIHlvdW5nIGlmIHRoYXQncyBzbywgYW5kIHdlJ2xsIHNlZSBpdCBhZ2Fpbi4KLQkJCSAqLwotCQkJbmV4dCA9IGdjLT5nYy5nY19uZXh0OwotCQkJZ2NfbGlzdF9tb3ZlKGdjLCB1bnJlYWNoYWJsZSk7Ci0JCQlnYy0+Z2MuZ2NfcmVmcyA9IEdDX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFOwotCQl9Ci0JCWdjID0gbmV4dDsKLQl9CisgICAgICAgIGlmIChnYy0+Z2MuZ2NfcmVmcykgeworICAgICAgICAgICAgLyogZ2MgaXMgZGVmaW5pdGVseSByZWFjaGFibGUgZnJvbSBvdXRzaWRlIHRoZQorICAgICAgICAgICAgICogb3JpZ2luYWwgJ3lvdW5nJy4gIE1hcmsgaXQgYXMgc3VjaCwgYW5kIHRyYXZlcnNlCisgICAgICAgICAgICAgKiBpdHMgcG9pbnRlcnMgdG8gZmluZCBhbnkgb3RoZXIgb2JqZWN0cyB0aGF0IG1heQorICAgICAgICAgICAgICogYmUgZGlyZWN0bHkgcmVhY2hhYmxlIGZyb20gaXQuICBOb3RlIHRoYXQgdGhlCisgICAgICAgICAgICAgKiBjYWxsIHRvIHRwX3RyYXZlcnNlIG1heSBhcHBlbmQgb2JqZWN0cyB0byB5b3VuZywKKyAgICAgICAgICAgICAqIHNvIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCBpdCByZXR1cm5zIHRvIGRldGVybWluZQorICAgICAgICAgICAgICogdGhlIG5leHQgb2JqZWN0IHRvIHZpc2l0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBQeU9iamVjdCAqb3AgPSBGUk9NX0dDKGdjKTsKKyAgICAgICAgICAgIHRyYXZlcnNlcHJvYyB0cmF2ZXJzZSA9IFB5X1RZUEUob3ApLT50cF90cmF2ZXJzZTsKKyAgICAgICAgICAgIGFzc2VydChnYy0+Z2MuZ2NfcmVmcyA+IDApOworICAgICAgICAgICAgZ2MtPmdjLmdjX3JlZnMgPSBHQ19SRUFDSEFCTEU7CisgICAgICAgICAgICAodm9pZCkgdHJhdmVyc2Uob3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZpc2l0cHJvYyl2aXNpdF9yZWFjaGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKil5b3VuZyk7CisgICAgICAgICAgICBuZXh0ID0gZ2MtPmdjLmdjX25leHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBUaGlzICptYXkqIGJlIHVucmVhY2hhYmxlLiAgVG8gbWFrZSBwcm9ncmVzcywKKyAgICAgICAgICAgICAqIGFzc3VtZSBpdCBpcy4gIGdjIGlzbid0IGRpcmVjdGx5IHJlYWNoYWJsZSBmcm9tCisgICAgICAgICAgICAgKiBhbnkgb2JqZWN0IHdlJ3ZlIGFscmVhZHkgdHJhdmVyc2VkLCBidXQgbWF5IGJlCisgICAgICAgICAgICAgKiByZWFjaGFibGUgZnJvbSBhbiBvYmplY3Qgd2UgaGF2ZW4ndCBnb3R0ZW4gdG8geWV0LgorICAgICAgICAgICAgICogdmlzaXRfcmVhY2hhYmxlIHdpbGwgZXZlbnR1YWxseSBtb3ZlIGdjIGJhY2sgaW50bworICAgICAgICAgICAgICogeW91bmcgaWYgdGhhdCdzIHNvLCBhbmQgd2UnbGwgc2VlIGl0IGFnYWluLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBuZXh0ID0gZ2MtPmdjLmdjX25leHQ7CisgICAgICAgICAgICBnY19saXN0X21vdmUoZ2MsIHVucmVhY2hhYmxlKTsKKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzID0gR0NfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEU7CisgICAgICAgIH0KKyAgICAgICAgZ2MgPSBuZXh0OworICAgIH0KIH0KIAogLyogUmV0dXJuIHRydWUgaWYgb2JqZWN0IGhhcyBhIGZpbmFsaXphdGlvbiBtZXRob2QuCkBAIC00MTEsMTYgKzQxMSwxNiBAQAogc3RhdGljIGludAogaGFzX2ZpbmFsaXplcihQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKFB5SW5zdGFuY2VfQ2hlY2sob3ApKSB7Ci0JCWFzc2VydChkZWxzdHIgIT0gTlVMTCk7Ci0JCXJldHVybiBfUHlJbnN0YW5jZV9Mb29rdXAob3AsIGRlbHN0cikgIT0gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoUHlUeXBlX0hhc0ZlYXR1cmUob3AtPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQotCQlyZXR1cm4gb3AtPm9iX3R5cGUtPnRwX2RlbCAhPSBOVUxMOwotCWVsc2UgaWYgKFB5R2VuX0NoZWNrRXhhY3Qob3ApKQotCQlyZXR1cm4gUHlHZW5fTmVlZHNGaW5hbGl6aW5nKChQeUdlbk9iamVjdCAqKW9wKTsKLQllbHNlCi0JCXJldHVybiAwOworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKG9wKSkgeworICAgICAgICBhc3NlcnQoZGVsc3RyICE9IE5VTEwpOworICAgICAgICByZXR1cm4gX1B5SW5zdGFuY2VfTG9va3VwKG9wLCBkZWxzdHIpICE9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKG9wLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hFQVBUWVBFKSkKKyAgICAgICAgcmV0dXJuIG9wLT5vYl90eXBlLT50cF9kZWwgIT0gTlVMTDsKKyAgICBlbHNlIGlmIChQeUdlbl9DaGVja0V4YWN0KG9wKSkKKyAgICAgICAgcmV0dXJuIFB5R2VuX05lZWRzRmluYWxpemluZygoUHlHZW5PYmplY3QgKilvcCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKIH0KIAogLyogTW92ZSB0aGUgb2JqZWN0cyBpbiB1bnJlYWNoYWJsZSB3aXRoIF9fZGVsX18gbWV0aG9kcyBpbnRvIGBmaW5hbGl6ZXJzYC4KQEAgLTQzMCwzNyArNDMwLDM3IEBACiBzdGF0aWMgdm9pZAogbW92ZV9maW5hbGl6ZXJzKFB5R0NfSGVhZCAqdW5yZWFjaGFibGUsIFB5R0NfSGVhZCAqZmluYWxpemVycykKIHsKLQlQeUdDX0hlYWQgKmdjOwotCVB5R0NfSGVhZCAqbmV4dDsKKyAgICBQeUdDX0hlYWQgKmdjOworICAgIFB5R0NfSGVhZCAqbmV4dDsKIAotCS8qIE1hcmNoIG92ZXIgdW5yZWFjaGFibGUuICBNb3ZlIG9iamVjdHMgd2l0aCBmaW5hbGl6ZXJzIGludG8KLQkgKiBgZmluYWxpemVyc2AuCi0JICovCi0JZm9yIChnYyA9IHVucmVhY2hhYmxlLT5nYy5nY19uZXh0OyBnYyAhPSB1bnJlYWNoYWJsZTsgZ2MgPSBuZXh0KSB7Ci0JCVB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOworICAgIC8qIE1hcmNoIG92ZXIgdW5yZWFjaGFibGUuICBNb3ZlIG9iamVjdHMgd2l0aCBmaW5hbGl6ZXJzIGludG8KKyAgICAgKiBgZmluYWxpemVyc2AuCisgICAgICovCisgICAgZm9yIChnYyA9IHVucmVhY2hhYmxlLT5nYy5nY19uZXh0OyBnYyAhPSB1bnJlYWNoYWJsZTsgZ2MgPSBuZXh0KSB7CisgICAgICAgIFB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOwogCi0JCWFzc2VydChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpOwotCQluZXh0ID0gZ2MtPmdjLmdjX25leHQ7CisgICAgICAgIGFzc2VydChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpOworICAgICAgICBuZXh0ID0gZ2MtPmdjLmdjX25leHQ7CiAKLQkJaWYgKGhhc19maW5hbGl6ZXIob3ApKSB7Ci0JCQlnY19saXN0X21vdmUoZ2MsIGZpbmFsaXplcnMpOwotCQkJZ2MtPmdjLmdjX3JlZnMgPSBHQ19SRUFDSEFCTEU7Ci0JCX0KLQl9CisgICAgICAgIGlmIChoYXNfZmluYWxpemVyKG9wKSkgeworICAgICAgICAgICAgZ2NfbGlzdF9tb3ZlKGdjLCBmaW5hbGl6ZXJzKTsKKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzID0gR0NfUkVBQ0hBQkxFOworICAgICAgICB9CisgICAgfQogfQogCiAvKiBBIHRyYXZlcnNhbCBjYWxsYmFjayBmb3IgbW92ZV9maW5hbGl6ZXJfcmVhY2hhYmxlLiAqLwogc3RhdGljIGludAogdmlzaXRfbW92ZShQeU9iamVjdCAqb3AsIFB5R0NfSGVhZCAqdG9saXN0KQogewotCWlmIChQeU9iamVjdF9JU19HQyhvcCkpIHsKLQkJaWYgKElTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKG9wKSkgewotCQkJUHlHQ19IZWFkICpnYyA9IEFTX0dDKG9wKTsKLQkJCWdjX2xpc3RfbW92ZShnYywgdG9saXN0KTsKLQkJCWdjLT5nYy5nY19yZWZzID0gR0NfUkVBQ0hBQkxFOwotCQl9Ci0JfQotCXJldHVybiAwOworICAgIGlmIChQeU9iamVjdF9JU19HQyhvcCkpIHsKKyAgICAgICAgaWYgKElTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKG9wKSkgeworICAgICAgICAgICAgUHlHQ19IZWFkICpnYyA9IEFTX0dDKG9wKTsKKyAgICAgICAgICAgIGdjX2xpc3RfbW92ZShnYywgdG9saXN0KTsKKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzID0gR0NfUkVBQ0hBQkxFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBNb3ZlIG9iamVjdHMgdGhhdCBhcmUgcmVhY2hhYmxlIGZyb20gZmluYWxpemVycywgZnJvbSB0aGUgdW5yZWFjaGFibGUgc2V0CkBAIC00NjksMTUgKzQ2OSwxNSBAQAogc3RhdGljIHZvaWQKIG1vdmVfZmluYWxpemVyX3JlYWNoYWJsZShQeUdDX0hlYWQgKmZpbmFsaXplcnMpCiB7Ci0JdHJhdmVyc2Vwcm9jIHRyYXZlcnNlOwotCVB5R0NfSGVhZCAqZ2MgPSBmaW5hbGl6ZXJzLT5nYy5nY19uZXh0OwotCWZvciAoOyBnYyAhPSBmaW5hbGl6ZXJzOyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7Ci0JCS8qIE5vdGUgdGhhdCB0aGUgZmluYWxpemVycyBsaXN0IG1heSBncm93IGR1cmluZyB0aGlzLiAqLwotCQl0cmF2ZXJzZSA9IFB5X1RZUEUoRlJPTV9HQyhnYykpLT50cF90cmF2ZXJzZTsKLQkJKHZvaWQpIHRyYXZlcnNlKEZST01fR0MoZ2MpLAotCQkJCSh2aXNpdHByb2MpdmlzaXRfbW92ZSwKLQkJCQkodm9pZCAqKWZpbmFsaXplcnMpOwotCX0KKyAgICB0cmF2ZXJzZXByb2MgdHJhdmVyc2U7CisgICAgUHlHQ19IZWFkICpnYyA9IGZpbmFsaXplcnMtPmdjLmdjX25leHQ7CisgICAgZm9yICg7IGdjICE9IGZpbmFsaXplcnM7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKKyAgICAgICAgLyogTm90ZSB0aGF0IHRoZSBmaW5hbGl6ZXJzIGxpc3QgbWF5IGdyb3cgZHVyaW5nIHRoaXMuICovCisgICAgICAgIHRyYXZlcnNlID0gUHlfVFlQRShGUk9NX0dDKGdjKSktPnRwX3RyYXZlcnNlOworICAgICAgICAodm9pZCkgdHJhdmVyc2UoRlJPTV9HQyhnYyksCisgICAgICAgICAgICAgICAgICAgICAgICAodmlzaXRwcm9jKXZpc2l0X21vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWZpbmFsaXplcnMpOworICAgIH0KIH0KIAogLyogQ2xlYXIgYWxsIHdlYWtyZWZzIHRvIHVucmVhY2hhYmxlIG9iamVjdHMsIGFuZCBpZiBzdWNoIGEgd2Vha3JlZiBoYXMgYQpAQCAtNDk0LDE2OSArNDk0LDE2OSBAQAogc3RhdGljIGludAogaGFuZGxlX3dlYWtyZWZzKFB5R0NfSGVhZCAqdW5yZWFjaGFibGUsIFB5R0NfSGVhZCAqb2xkKQogewotCVB5R0NfSGVhZCAqZ2M7Ci0JUHlPYmplY3QgKm9wOwkJLyogZ2VuZXJhbGx5IEZST01fR0MoZ2MpICovCi0JUHlXZWFrUmVmZXJlbmNlICp3cjsJLyogZ2VuZXJhbGx5IGEgY2FzdCBvZiBvcCAqLwotCVB5R0NfSGVhZCB3cmNiX3RvX2NhbGw7CS8qIHdlYWtyZWZzIHdpdGggY2FsbGJhY2tzIHRvIGNhbGwgKi8KLQlQeUdDX0hlYWQgKm5leHQ7Ci0JaW50IG51bV9mcmVlZCA9IDA7CisgICAgUHlHQ19IZWFkICpnYzsKKyAgICBQeU9iamVjdCAqb3A7ICAgICAgICAgICAgICAgLyogZ2VuZXJhbGx5IEZST01fR0MoZ2MpICovCisgICAgUHlXZWFrUmVmZXJlbmNlICp3cjsgICAgICAgIC8qIGdlbmVyYWxseSBhIGNhc3Qgb2Ygb3AgKi8KKyAgICBQeUdDX0hlYWQgd3JjYl90b19jYWxsOyAgICAgLyogd2Vha3JlZnMgd2l0aCBjYWxsYmFja3MgdG8gY2FsbCAqLworICAgIFB5R0NfSGVhZCAqbmV4dDsKKyAgICBpbnQgbnVtX2ZyZWVkID0gMDsKIAotCWdjX2xpc3RfaW5pdCgmd3JjYl90b19jYWxsKTsKKyAgICBnY19saXN0X2luaXQoJndyY2JfdG9fY2FsbCk7CiAKLQkvKiBDbGVhciBhbGwgd2Vha3JlZnMgdG8gdGhlIG9iamVjdHMgaW4gdW5yZWFjaGFibGUuICBJZiBzdWNoIGEgd2Vha3JlZgotCSAqIGFsc28gaGFzIGEgY2FsbGJhY2ssIG1vdmUgaXQgaW50byBgd3JjYl90b19jYWxsYCBpZiB0aGUgY2FsbGJhY2sKLQkgKiBuZWVkcyB0byBiZSBpbnZva2VkLiAgTm90ZSB0aGF0IHdlIGNhbm5vdCBpbnZva2UgYW55IGNhbGxiYWNrcyB1bnRpbAotCSAqIGFsbCB3ZWFrcmVmcyB0byB1bnJlYWNoYWJsZSBvYmplY3RzIGFyZSBjbGVhcmVkLCBsZXN0IHRoZSBjYWxsYmFjawotCSAqIHJlc3VycmVjdCBhbiB1bnJlYWNoYWJsZSBvYmplY3QgdmlhIGEgc3RpbGwtYWN0aXZlIHdlYWtyZWYuICBXZQotCSAqIG1ha2UgYW5vdGhlciBwYXNzIG92ZXIgd3JjYl90b19jYWxsLCBpbnZva2luZyBjYWxsYmFja3MsIGFmdGVyIHRoaXMKLQkgKiBwYXNzIGNvbXBsZXRlcy4KLQkgKi8KLQlmb3IgKGdjID0gdW5yZWFjaGFibGUtPmdjLmdjX25leHQ7IGdjICE9IHVucmVhY2hhYmxlOyBnYyA9IG5leHQpIHsKLQkJUHlXZWFrUmVmZXJlbmNlICoqd3JsaXN0OworICAgIC8qIENsZWFyIGFsbCB3ZWFrcmVmcyB0byB0aGUgb2JqZWN0cyBpbiB1bnJlYWNoYWJsZS4gIElmIHN1Y2ggYSB3ZWFrcmVmCisgICAgICogYWxzbyBoYXMgYSBjYWxsYmFjaywgbW92ZSBpdCBpbnRvIGB3cmNiX3RvX2NhbGxgIGlmIHRoZSBjYWxsYmFjaworICAgICAqIG5lZWRzIHRvIGJlIGludm9rZWQuICBOb3RlIHRoYXQgd2UgY2Fubm90IGludm9rZSBhbnkgY2FsbGJhY2tzIHVudGlsCisgICAgICogYWxsIHdlYWtyZWZzIHRvIHVucmVhY2hhYmxlIG9iamVjdHMgYXJlIGNsZWFyZWQsIGxlc3QgdGhlIGNhbGxiYWNrCisgICAgICogcmVzdXJyZWN0IGFuIHVucmVhY2hhYmxlIG9iamVjdCB2aWEgYSBzdGlsbC1hY3RpdmUgd2Vha3JlZi4gIFdlCisgICAgICogbWFrZSBhbm90aGVyIHBhc3Mgb3ZlciB3cmNiX3RvX2NhbGwsIGludm9raW5nIGNhbGxiYWNrcywgYWZ0ZXIgdGhpcworICAgICAqIHBhc3MgY29tcGxldGVzLgorICAgICAqLworICAgIGZvciAoZ2MgPSB1bnJlYWNoYWJsZS0+Z2MuZ2NfbmV4dDsgZ2MgIT0gdW5yZWFjaGFibGU7IGdjID0gbmV4dCkgeworICAgICAgICBQeVdlYWtSZWZlcmVuY2UgKip3cmxpc3Q7CiAKLQkJb3AgPSBGUk9NX0dDKGdjKTsKLQkJYXNzZXJ0KElTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKG9wKSk7Ci0JCW5leHQgPSBnYy0+Z2MuZ2NfbmV4dDsKKyAgICAgICAgb3AgPSBGUk9NX0dDKGdjKTsKKyAgICAgICAgYXNzZXJ0KElTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKG9wKSk7CisgICAgICAgIG5leHQgPSBnYy0+Z2MuZ2NfbmV4dDsKIAotCQlpZiAoISBQeVR5cGVfU1VQUE9SVFNfV0VBS1JFRlMoUHlfVFlQRShvcCkpKQotCQkJY29udGludWU7CisgICAgICAgIGlmICghIFB5VHlwZV9TVVBQT1JUU19XRUFLUkVGUyhQeV9UWVBFKG9wKSkpCisgICAgICAgICAgICBjb250aW51ZTsKIAotCQkvKiBJdCBzdXBwb3J0cyB3ZWFrcmVmcy4gIERvZXMgaXQgaGF2ZSBhbnk/ICovCi0JCXdybGlzdCA9IChQeVdlYWtSZWZlcmVuY2UgKiopCi0JCQkgICAgIAkJUHlPYmplY3RfR0VUX1dFQUtSRUZTX0xJU1RQVFIob3ApOworICAgICAgICAvKiBJdCBzdXBwb3J0cyB3ZWFrcmVmcy4gIERvZXMgaXQgaGF2ZSBhbnk/ICovCisgICAgICAgIHdybGlzdCA9IChQeVdlYWtSZWZlcmVuY2UgKiopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X0dFVF9XRUFLUkVGU19MSVNUUFRSKG9wKTsKIAotCQkvKiBgb3BgIG1heSBoYXZlIHNvbWUgd2Vha3JlZnMuICBNYXJjaCBvdmVyIHRoZSBsaXN0LCBjbGVhcgotCQkgKiBhbGwgdGhlIHdlYWtyZWZzLCBhbmQgbW92ZSB0aGUgd2Vha3JlZnMgd2l0aCBjYWxsYmFja3MKLQkJICogdGhhdCBtdXN0IGJlIGNhbGxlZCBpbnRvIHdyY2JfdG9fY2FsbC4KLQkJICovCi0JCWZvciAod3IgPSAqd3JsaXN0OyB3ciAhPSBOVUxMOyB3ciA9ICp3cmxpc3QpIHsKLQkJCVB5R0NfSGVhZCAqd3Jhc2djOwkvKiBBU19HQyh3cikgKi8KKyAgICAgICAgLyogYG9wYCBtYXkgaGF2ZSBzb21lIHdlYWtyZWZzLiAgTWFyY2ggb3ZlciB0aGUgbGlzdCwgY2xlYXIKKyAgICAgICAgICogYWxsIHRoZSB3ZWFrcmVmcywgYW5kIG1vdmUgdGhlIHdlYWtyZWZzIHdpdGggY2FsbGJhY2tzCisgICAgICAgICAqIHRoYXQgbXVzdCBiZSBjYWxsZWQgaW50byB3cmNiX3RvX2NhbGwuCisgICAgICAgICAqLworICAgICAgICBmb3IgKHdyID0gKndybGlzdDsgd3IgIT0gTlVMTDsgd3IgPSAqd3JsaXN0KSB7CisgICAgICAgICAgICBQeUdDX0hlYWQgKndyYXNnYzsgICAgICAgICAgICAgICAgICAvKiBBU19HQyh3cikgKi8KIAotCQkJLyogX1B5V2Vha3JlZl9DbGVhclJlZiBjbGVhcnMgdGhlIHdlYWtyZWYgYnV0IGxlYXZlcwotCQkJICogdGhlIGNhbGxiYWNrIHBvaW50ZXIgaW50YWN0LiAgT2JzY3VyZTogIGl0IGFsc28KLQkJCSAqIGNoYW5nZXMgKndybGlzdC4KLQkJCSAqLwotCQkJYXNzZXJ0KHdyLT53cl9vYmplY3QgPT0gb3ApOwotCQkJX1B5V2Vha3JlZl9DbGVhclJlZih3cik7Ci0JCQlhc3NlcnQod3ItPndyX29iamVjdCA9PSBQeV9Ob25lKTsKLQkJCWlmICh3ci0+d3JfY2FsbGJhY2sgPT0gTlVMTCkKLQkJCQljb250aW51ZTsJLyogbm8gY2FsbGJhY2sgKi8KKyAgICAgICAgICAgIC8qIF9QeVdlYWtyZWZfQ2xlYXJSZWYgY2xlYXJzIHRoZSB3ZWFrcmVmIGJ1dCBsZWF2ZXMKKyAgICAgICAgICAgICAqIHRoZSBjYWxsYmFjayBwb2ludGVyIGludGFjdC4gIE9ic2N1cmU6ICBpdCBhbHNvCisgICAgICAgICAgICAgKiBjaGFuZ2VzICp3cmxpc3QuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFzc2VydCh3ci0+d3Jfb2JqZWN0ID09IG9wKTsKKyAgICAgICAgICAgIF9QeVdlYWtyZWZfQ2xlYXJSZWYod3IpOworICAgICAgICAgICAgYXNzZXJ0KHdyLT53cl9vYmplY3QgPT0gUHlfTm9uZSk7CisgICAgICAgICAgICBpZiAod3ItPndyX2NhbGxiYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBjYWxsYmFjayAqLwogCi0JLyogSGVhZGFjaGUgdGltZS4gIGBvcGAgaXMgZ29pbmcgYXdheSwgYW5kIGlzIHdlYWtseSByZWZlcmVuY2VkIGJ5Ci0JICogYHdyYCwgd2hpY2ggaGFzIGEgY2FsbGJhY2suICBTaG91bGQgdGhlIGNhbGxiYWNrIGJlIGludm9rZWQ/ICBJZiB3cgotCSAqIGlzIGFsc28gdHJhc2gsIG5vOgotCSAqCi0JICogMS4gVGhlcmUncyBubyBuZWVkIHRvIGNhbGwgaXQuICBUaGUgb2JqZWN0IGFuZCB0aGUgd2Vha3JlZiBhcmUKLQkgKiAgICBib3RoIGdvaW5nIGF3YXksIHNvIGl0J3MgbGVnaXRpbWF0ZSB0byBwcmV0ZW5kIHRoZSB3ZWFrcmVmIGlzCi0JICogICAgZ29pbmcgYXdheSBmaXJzdC4gIFRoZSB1c2VyIGhhcyB0byBlbnN1cmUgYSB3ZWFrcmVmIG91dGxpdmVzIGl0cwotCSAqICAgIHJlZmVyZW50IGlmIHRoZXkgd2FudCBhIGd1YXJhbnRlZSB0aGF0IHRoZSB3ciBjYWxsYmFjayB3aWxsIGdldAotCSAqICAgIGludm9rZWQuCi0JICoKLQkgKiAyLiBJdCBtYXkgYmUgY2F0YXN0cm9waGljIHRvIGNhbGwgaXQuICBJZiB0aGUgY2FsbGJhY2sgaXMgYWxzbyBpbgotCSAqICAgIGN5Y2xpYyB0cmFzaCAoQ1QpLCB0aGVuIGFsdGhvdWdoIHRoZSBDVCBpcyB1bnJlYWNoYWJsZSBmcm9tCi0JICogICAgb3V0c2lkZSB0aGUgY3VycmVudCBnZW5lcmF0aW9uLCBDVCBtYXkgYmUgcmVhY2hhYmxlIGZyb20gdGhlCi0JICogICAgY2FsbGJhY2suICBUaGVuIHRoZSBjYWxsYmFjayBjb3VsZCByZXN1cnJlY3QgaW5zYW5lIG9iamVjdHMuCi0JICoKLQkgKiBTaW5jZSB0aGUgY2FsbGJhY2sgaXMgbmV2ZXIgbmVlZGVkIGFuZCBtYXkgYmUgdW5zYWZlIGluIHRoaXMgY2FzZSwKLQkgKiB3ciBpcyBzaW1wbHkgbGVmdCBpbiB0aGUgdW5yZWFjaGFibGUgc2V0LiAgTm90ZSB0aGF0IGJlY2F1c2Ugd2UKLQkgKiBhbHJlYWR5IGNhbGxlZCBfUHlXZWFrcmVmX0NsZWFyUmVmKHdyKSwgaXRzIGNhbGxiYWNrIHdpbGwgbmV2ZXIKLQkgKiB0cmlnZ2VyLgotCSAqCi0JICogT1RPSCwgaWYgd3IgaXNuJ3QgcGFydCBvZiBDVCwgd2Ugc2hvdWxkIGludm9rZSB0aGUgY2FsbGJhY2s6ICB0aGUKLQkgKiB3ZWFrcmVmIG91dGxpdmVkIHRoZSB0cmFzaC4gIE5vdGUgdGhhdCBzaW5jZSB3ciBpc24ndCBDVCBpbiB0aGlzCi0JICogY2FzZSwgaXRzIGNhbGxiYWNrIGNhbid0IGJlIENUIGVpdGhlciAtLSB3ciBhY3RlZCBhcyBhbiBleHRlcm5hbAotCSAqIHJvb3QgdG8gdGhpcyBnZW5lcmF0aW9uLCBhbmQgdGhlcmVmb3JlIGl0cyBjYWxsYmFjayBkaWQgdG9vLiAgU28KLQkgKiBub3RoaW5nIGluIENUIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBjYWxsYmFjayBlaXRoZXIsIHNvIGl0J3MgaGFyZAotCSAqIHRvIGltYWdpbmUgaG93IGNhbGxpbmcgaXQgbGF0ZXIgY291bGQgY3JlYXRlIGEgcHJvYmxlbSBmb3IgdXMuICB3cgotCSAqIGlzIG1vdmVkIHRvIHdyY2JfdG9fY2FsbCBpbiB0aGlzIGNhc2UuCi0JICovCi0JIAkJaWYgKElTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKHdyKSkKLQkgCQkJY29udGludWU7Ci0JCQlhc3NlcnQoSVNfUkVBQ0hBQkxFKHdyKSk7CisgICAgLyogSGVhZGFjaGUgdGltZS4gIGBvcGAgaXMgZ29pbmcgYXdheSwgYW5kIGlzIHdlYWtseSByZWZlcmVuY2VkIGJ5CisgICAgICogYHdyYCwgd2hpY2ggaGFzIGEgY2FsbGJhY2suICBTaG91bGQgdGhlIGNhbGxiYWNrIGJlIGludm9rZWQ/ICBJZiB3cgorICAgICAqIGlzIGFsc28gdHJhc2gsIG5vOgorICAgICAqCisgICAgICogMS4gVGhlcmUncyBubyBuZWVkIHRvIGNhbGwgaXQuICBUaGUgb2JqZWN0IGFuZCB0aGUgd2Vha3JlZiBhcmUKKyAgICAgKiAgICBib3RoIGdvaW5nIGF3YXksIHNvIGl0J3MgbGVnaXRpbWF0ZSB0byBwcmV0ZW5kIHRoZSB3ZWFrcmVmIGlzCisgICAgICogICAgZ29pbmcgYXdheSBmaXJzdC4gIFRoZSB1c2VyIGhhcyB0byBlbnN1cmUgYSB3ZWFrcmVmIG91dGxpdmVzIGl0cworICAgICAqICAgIHJlZmVyZW50IGlmIHRoZXkgd2FudCBhIGd1YXJhbnRlZSB0aGF0IHRoZSB3ciBjYWxsYmFjayB3aWxsIGdldAorICAgICAqICAgIGludm9rZWQuCisgICAgICoKKyAgICAgKiAyLiBJdCBtYXkgYmUgY2F0YXN0cm9waGljIHRvIGNhbGwgaXQuICBJZiB0aGUgY2FsbGJhY2sgaXMgYWxzbyBpbgorICAgICAqICAgIGN5Y2xpYyB0cmFzaCAoQ1QpLCB0aGVuIGFsdGhvdWdoIHRoZSBDVCBpcyB1bnJlYWNoYWJsZSBmcm9tCisgICAgICogICAgb3V0c2lkZSB0aGUgY3VycmVudCBnZW5lcmF0aW9uLCBDVCBtYXkgYmUgcmVhY2hhYmxlIGZyb20gdGhlCisgICAgICogICAgY2FsbGJhY2suICBUaGVuIHRoZSBjYWxsYmFjayBjb3VsZCByZXN1cnJlY3QgaW5zYW5lIG9iamVjdHMuCisgICAgICoKKyAgICAgKiBTaW5jZSB0aGUgY2FsbGJhY2sgaXMgbmV2ZXIgbmVlZGVkIGFuZCBtYXkgYmUgdW5zYWZlIGluIHRoaXMgY2FzZSwKKyAgICAgKiB3ciBpcyBzaW1wbHkgbGVmdCBpbiB0aGUgdW5yZWFjaGFibGUgc2V0LiAgTm90ZSB0aGF0IGJlY2F1c2Ugd2UKKyAgICAgKiBhbHJlYWR5IGNhbGxlZCBfUHlXZWFrcmVmX0NsZWFyUmVmKHdyKSwgaXRzIGNhbGxiYWNrIHdpbGwgbmV2ZXIKKyAgICAgKiB0cmlnZ2VyLgorICAgICAqCisgICAgICogT1RPSCwgaWYgd3IgaXNuJ3QgcGFydCBvZiBDVCwgd2Ugc2hvdWxkIGludm9rZSB0aGUgY2FsbGJhY2s6ICB0aGUKKyAgICAgKiB3ZWFrcmVmIG91dGxpdmVkIHRoZSB0cmFzaC4gIE5vdGUgdGhhdCBzaW5jZSB3ciBpc24ndCBDVCBpbiB0aGlzCisgICAgICogY2FzZSwgaXRzIGNhbGxiYWNrIGNhbid0IGJlIENUIGVpdGhlciAtLSB3ciBhY3RlZCBhcyBhbiBleHRlcm5hbAorICAgICAqIHJvb3QgdG8gdGhpcyBnZW5lcmF0aW9uLCBhbmQgdGhlcmVmb3JlIGl0cyBjYWxsYmFjayBkaWQgdG9vLiAgU28KKyAgICAgKiBub3RoaW5nIGluIENUIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBjYWxsYmFjayBlaXRoZXIsIHNvIGl0J3MgaGFyZAorICAgICAqIHRvIGltYWdpbmUgaG93IGNhbGxpbmcgaXQgbGF0ZXIgY291bGQgY3JlYXRlIGEgcHJvYmxlbSBmb3IgdXMuICB3cgorICAgICAqIGlzIG1vdmVkIHRvIHdyY2JfdG9fY2FsbCBpbiB0aGlzIGNhc2UuCisgICAgICovCisgICAgICAgICAgICBpZiAoSVNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUod3IpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYXNzZXJ0KElTX1JFQUNIQUJMRSh3cikpOwogCi0JCQkvKiBDcmVhdGUgYSBuZXcgcmVmZXJlbmNlIHNvIHRoYXQgd3IgY2FuJ3QgZ28gYXdheQotCQkJICogYmVmb3JlIHdlIGNhbiBwcm9jZXNzIGl0IGFnYWluLgotCQkJICovCi0JCQlQeV9JTkNSRUYod3IpOworICAgICAgICAgICAgLyogQ3JlYXRlIGEgbmV3IHJlZmVyZW5jZSBzbyB0aGF0IHdyIGNhbid0IGdvIGF3YXkKKyAgICAgICAgICAgICAqIGJlZm9yZSB3ZSBjYW4gcHJvY2VzcyBpdCBhZ2Fpbi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUHlfSU5DUkVGKHdyKTsKIAotCQkJLyogTW92ZSB3ciB0byB3cmNiX3RvX2NhbGwsIGZvciB0aGUgbmV4dCBwYXNzLiAqLwotCQkJd3Jhc2djID0gQVNfR0Mod3IpOwotCQkJYXNzZXJ0KHdyYXNnYyAhPSBuZXh0KTsgLyogd3Jhc2djIGlzIHJlYWNoYWJsZSwgYnV0Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlzbid0LCBzbyB0aGV5IGNhbid0Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB0aGUgc2FtZSAqLwotCQkJZ2NfbGlzdF9tb3ZlKHdyYXNnYywgJndyY2JfdG9fY2FsbCk7Ci0JCX0KLQl9CisgICAgICAgICAgICAvKiBNb3ZlIHdyIHRvIHdyY2JfdG9fY2FsbCwgZm9yIHRoZSBuZXh0IHBhc3MuICovCisgICAgICAgICAgICB3cmFzZ2MgPSBBU19HQyh3cik7CisgICAgICAgICAgICBhc3NlcnQod3Jhc2djICE9IG5leHQpOyAvKiB3cmFzZ2MgaXMgcmVhY2hhYmxlLCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgaXNuJ3QsIHNvIHRoZXkgY2FuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHRoZSBzYW1lICovCisgICAgICAgICAgICBnY19saXN0X21vdmUod3Jhc2djLCAmd3JjYl90b19jYWxsKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIEludm9rZSB0aGUgY2FsbGJhY2tzIHdlIGRlY2lkZWQgdG8gaG9ub3IuICBJdCdzIHNhZmUgdG8gaW52b2tlIHRoZW0KLQkgKiBiZWNhdXNlIHRoZXkgY2FuJ3QgcmVmZXJlbmNlIHVucmVhY2hhYmxlIG9iamVjdHMuCi0JICovCi0Jd2hpbGUgKCEgZ2NfbGlzdF9pc19lbXB0eSgmd3JjYl90b19jYWxsKSkgewotCQlQeU9iamVjdCAqdGVtcDsKLQkJUHlPYmplY3QgKmNhbGxiYWNrOworICAgIC8qIEludm9rZSB0aGUgY2FsbGJhY2tzIHdlIGRlY2lkZWQgdG8gaG9ub3IuICBJdCdzIHNhZmUgdG8gaW52b2tlIHRoZW0KKyAgICAgKiBiZWNhdXNlIHRoZXkgY2FuJ3QgcmVmZXJlbmNlIHVucmVhY2hhYmxlIG9iamVjdHMuCisgICAgICovCisgICAgd2hpbGUgKCEgZ2NfbGlzdF9pc19lbXB0eSgmd3JjYl90b19jYWxsKSkgeworICAgICAgICBQeU9iamVjdCAqdGVtcDsKKyAgICAgICAgUHlPYmplY3QgKmNhbGxiYWNrOwogCi0JCWdjID0gd3JjYl90b19jYWxsLmdjLmdjX25leHQ7Ci0JCW9wID0gRlJPTV9HQyhnYyk7Ci0JCWFzc2VydChJU19SRUFDSEFCTEUob3ApKTsKLQkJYXNzZXJ0KFB5V2Vha3JlZl9DaGVjayhvcCkpOwotCQl3ciA9IChQeVdlYWtSZWZlcmVuY2UgKilvcDsKLQkJY2FsbGJhY2sgPSB3ci0+d3JfY2FsbGJhY2s7Ci0JCWFzc2VydChjYWxsYmFjayAhPSBOVUxMKTsKKyAgICAgICAgZ2MgPSB3cmNiX3RvX2NhbGwuZ2MuZ2NfbmV4dDsKKyAgICAgICAgb3AgPSBGUk9NX0dDKGdjKTsKKyAgICAgICAgYXNzZXJ0KElTX1JFQUNIQUJMRShvcCkpOworICAgICAgICBhc3NlcnQoUHlXZWFrcmVmX0NoZWNrKG9wKSk7CisgICAgICAgIHdyID0gKFB5V2Vha1JlZmVyZW5jZSAqKW9wOworICAgICAgICBjYWxsYmFjayA9IHdyLT53cl9jYWxsYmFjazsKKyAgICAgICAgYXNzZXJ0KGNhbGxiYWNrICE9IE5VTEwpOwogCi0JCS8qIGNvcHktcGFzdGUgb2Ygd2Vha3JlZm9iamVjdC5jJ3MgaGFuZGxlX2NhbGxiYWNrKCkgKi8KLQkJdGVtcCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2FsbGJhY2ssIHdyLCBOVUxMKTsKLQkJaWYgKHRlbXAgPT0gTlVMTCkKLQkJCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShjYWxsYmFjayk7Ci0JCWVsc2UKLQkJCVB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgLyogY29weS1wYXN0ZSBvZiB3ZWFrcmVmb2JqZWN0LmMncyBoYW5kbGVfY2FsbGJhY2soKSAqLworICAgICAgICB0ZW1wID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjYWxsYmFjaywgd3IsIE5VTEwpOworICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGNhbGxiYWNrKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOwogCi0JCS8qIEdpdmUgdXAgdGhlIHJlZmVyZW5jZSB3ZSBjcmVhdGVkIGluIHRoZSBmaXJzdCBwYXNzLiAgV2hlbgotCQkgKiBvcCdzIHJlZmNvdW50IGhpdHMgMCAod2hpY2ggaXQgbWF5IG9yIG1heSBub3QgZG8gcmlnaHQgbm93KSwKLQkJICogb3AncyB0cF9kZWFsbG9jIHdpbGwgZGVjcmVmIG9wLT53cl9jYWxsYmFjayB0b28uICBOb3RlCi0JCSAqIHRoYXQgdGhlIHJlZmNvdW50IHByb2JhYmx5IHdpbGwgaGl0IDAgbm93LCBhbmQgYmVjYXVzZSB0aGlzCi0JCSAqIHdlYWtyZWYgd2FzIHJlYWNoYWJsZSB0byBiZWdpbiB3aXRoLCBnYyBkaWRuJ3QgYWxyZWFkeQotCQkgKiBhZGQgaXQgdG8gaXRzIGNvdW50IG9mIGZyZWVkIG9iamVjdHMuICBFeGFtcGxlOiAgYSByZWFjaGFibGUKLQkJICogd2VhayB2YWx1ZSBkaWN0IG1hcHMgc29tZSBrZXkgdG8gdGhpcyByZWFjaGFibGUgd2Vha3JlZi4KLQkJICogVGhlIGNhbGxiYWNrIHJlbW92ZXMgdGhpcyBrZXktPndlYWtyZWYgbWFwcGluZyBmcm9tIHRoZQotCQkgKiBkaWN0LCBsZWF2aW5nIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlIHdlYWtyZWYgKGV4Y2VwdGluZwotCQkgKiBvdXJzKS4KLQkJICovCi0JCVB5X0RFQ1JFRihvcCk7Ci0JCWlmICh3cmNiX3RvX2NhbGwuZ2MuZ2NfbmV4dCA9PSBnYykgewotCQkJLyogb2JqZWN0IGlzIHN0aWxsIGFsaXZlIC0tIG1vdmUgaXQgKi8KLQkJCWdjX2xpc3RfbW92ZShnYywgb2xkKTsKLQkJfQotCQllbHNlCi0JCQkrK251bV9mcmVlZDsKLQl9CisgICAgICAgIC8qIEdpdmUgdXAgdGhlIHJlZmVyZW5jZSB3ZSBjcmVhdGVkIGluIHRoZSBmaXJzdCBwYXNzLiAgV2hlbgorICAgICAgICAgKiBvcCdzIHJlZmNvdW50IGhpdHMgMCAod2hpY2ggaXQgbWF5IG9yIG1heSBub3QgZG8gcmlnaHQgbm93KSwKKyAgICAgICAgICogb3AncyB0cF9kZWFsbG9jIHdpbGwgZGVjcmVmIG9wLT53cl9jYWxsYmFjayB0b28uICBOb3RlCisgICAgICAgICAqIHRoYXQgdGhlIHJlZmNvdW50IHByb2JhYmx5IHdpbGwgaGl0IDAgbm93LCBhbmQgYmVjYXVzZSB0aGlzCisgICAgICAgICAqIHdlYWtyZWYgd2FzIHJlYWNoYWJsZSB0byBiZWdpbiB3aXRoLCBnYyBkaWRuJ3QgYWxyZWFkeQorICAgICAgICAgKiBhZGQgaXQgdG8gaXRzIGNvdW50IG9mIGZyZWVkIG9iamVjdHMuICBFeGFtcGxlOiAgYSByZWFjaGFibGUKKyAgICAgICAgICogd2VhayB2YWx1ZSBkaWN0IG1hcHMgc29tZSBrZXkgdG8gdGhpcyByZWFjaGFibGUgd2Vha3JlZi4KKyAgICAgICAgICogVGhlIGNhbGxiYWNrIHJlbW92ZXMgdGhpcyBrZXktPndlYWtyZWYgbWFwcGluZyBmcm9tIHRoZQorICAgICAgICAgKiBkaWN0LCBsZWF2aW5nIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlIHdlYWtyZWYgKGV4Y2VwdGluZworICAgICAgICAgKiBvdXJzKS4KKyAgICAgICAgICovCisgICAgICAgIFB5X0RFQ1JFRihvcCk7CisgICAgICAgIGlmICh3cmNiX3RvX2NhbGwuZ2MuZ2NfbmV4dCA9PSBnYykgeworICAgICAgICAgICAgLyogb2JqZWN0IGlzIHN0aWxsIGFsaXZlIC0tIG1vdmUgaXQgKi8KKyAgICAgICAgICAgIGdjX2xpc3RfbW92ZShnYywgb2xkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICArK251bV9mcmVlZDsKKyAgICB9CiAKLQlyZXR1cm4gbnVtX2ZyZWVkOworICAgIHJldHVybiBudW1fZnJlZWQ7CiB9CiAKIHN0YXRpYyB2b2lkCiBkZWJ1Z19pbnN0YW5jZShjaGFyICptc2csIFB5SW5zdGFuY2VPYmplY3QgKmluc3QpCiB7Ci0JY2hhciAqY25hbWU7Ci0JLyogc2ltcGxlIHZlcnNpb24gb2YgaW5zdGFuY2VfcmVwciAqLwotCVB5T2JqZWN0ICpjbGFzc25hbWUgPSBpbnN0LT5pbl9jbGFzcy0+Y2xfbmFtZTsKLQlpZiAoY2xhc3NuYW1lICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2soY2xhc3NuYW1lKSkKLQkJY25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhjbGFzc25hbWUpOwotCWVsc2UKLQkJY25hbWUgPSAiPyI7Ci0JUHlTeXNfV3JpdGVTdGRlcnIoImdjOiAlLjEwMHMgPCUuMTAwcyBpbnN0YW5jZSBhdCAlcD5cbiIsCi0JCQkgIG1zZywgY25hbWUsIGluc3QpOworICAgIGNoYXIgKmNuYW1lOworICAgIC8qIHNpbXBsZSB2ZXJzaW9uIG9mIGluc3RhbmNlX3JlcHIgKi8KKyAgICBQeU9iamVjdCAqY2xhc3NuYW1lID0gaW5zdC0+aW5fY2xhc3MtPmNsX25hbWU7CisgICAgaWYgKGNsYXNzbmFtZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGNsYXNzbmFtZSkpCisgICAgICAgIGNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoY2xhc3NuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIGNuYW1lID0gIj8iOworICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJnYzogJS4xMDBzIDwlLjEwMHMgaW5zdGFuY2UgYXQgJXA+XG4iLAorICAgICAgICAgICAgICAgICAgICAgIG1zZywgY25hbWUsIGluc3QpOwogfQogCiBzdGF0aWMgdm9pZAogZGVidWdfY3ljbGUoY2hhciAqbXNnLCBQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKChkZWJ1ZyAmIERFQlVHX0lOU1RBTkNFUykgJiYgUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsKLQkJZGVidWdfaW5zdGFuY2UobXNnLCAoUHlJbnN0YW5jZU9iamVjdCAqKW9wKTsKLQl9Ci0JZWxzZSBpZiAoZGVidWcgJiBERUJVR19PQkpFQ1RTKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJnYzogJS4xMDBzIDwlLjEwMHMgJXA+XG4iLAotCQkJCSAgbXNnLCBQeV9UWVBFKG9wKS0+dHBfbmFtZSwgb3ApOwotCX0KKyAgICBpZiAoKGRlYnVnICYgREVCVUdfSU5TVEFOQ0VTKSAmJiBQeUluc3RhbmNlX0NoZWNrKG9wKSkgeworICAgICAgICBkZWJ1Z19pbnN0YW5jZShtc2csIChQeUluc3RhbmNlT2JqZWN0ICopb3ApOworICAgIH0KKyAgICBlbHNlIGlmIChkZWJ1ZyAmIERFQlVHX09CSkVDVFMpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImdjOiAlLjEwMHMgPCUuMTAwcyAlcD5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgUHlfVFlQRShvcCktPnRwX25hbWUsIG9wKTsKKyAgICB9CiB9CiAKIC8qIEhhbmRsZSB1bmNvbGxlY3RhYmxlIGdhcmJhZ2UgKGN5Y2xlcyB3aXRoIGZpbmFsaXplcnMsIGFuZCBzdHVmZiByZWFjaGFibGUKQEAgLTY3MSw1NiArNjcxLDU2IEBACiBzdGF0aWMgaW50CiBoYW5kbGVfZmluYWxpemVycyhQeUdDX0hlYWQgKmZpbmFsaXplcnMsIFB5R0NfSGVhZCAqb2xkKQogewotCVB5R0NfSGVhZCAqZ2MgPSBmaW5hbGl6ZXJzLT5nYy5nY19uZXh0OworICAgIFB5R0NfSGVhZCAqZ2MgPSBmaW5hbGl6ZXJzLT5nYy5nY19uZXh0OwogCi0JaWYgKGdhcmJhZ2UgPT0gTlVMTCkgewotCQlnYXJiYWdlID0gUHlMaXN0X05ldygwKTsKLQkJaWYgKGdhcmJhZ2UgPT0gTlVMTCkKLQkJCVB5X0ZhdGFsRXJyb3IoImdjIGNvdWxkbid0IGNyZWF0ZSBnYy5nYXJiYWdlIGxpc3QiKTsKLQl9Ci0JZm9yICg7IGdjICE9IGZpbmFsaXplcnM7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKLQkJUHlPYmplY3QgKm9wID0gRlJPTV9HQyhnYyk7CisgICAgaWYgKGdhcmJhZ2UgPT0gTlVMTCkgeworICAgICAgICBnYXJiYWdlID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgaWYgKGdhcmJhZ2UgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImdjIGNvdWxkbid0IGNyZWF0ZSBnYy5nYXJiYWdlIGxpc3QiKTsKKyAgICB9CisgICAgZm9yICg7IGdjICE9IGZpbmFsaXplcnM7IGdjID0gZ2MtPmdjLmdjX25leHQpIHsKKyAgICAgICAgUHlPYmplY3QgKm9wID0gRlJPTV9HQyhnYyk7CiAKLQkJaWYgKChkZWJ1ZyAmIERFQlVHX1NBVkVBTEwpIHx8IGhhc19maW5hbGl6ZXIob3ApKSB7Ci0JCQlpZiAoUHlMaXN0X0FwcGVuZChnYXJiYWdlLCBvcCkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICAgICAgaWYgKChkZWJ1ZyAmIERFQlVHX1NBVkVBTEwpIHx8IGhhc19maW5hbGl6ZXIob3ApKSB7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChnYXJiYWdlLCBvcCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCWdjX2xpc3RfbWVyZ2UoZmluYWxpemVycywgb2xkKTsKLQlyZXR1cm4gMDsKKyAgICBnY19saXN0X21lcmdlKGZpbmFsaXplcnMsIG9sZCk7CisgICAgcmV0dXJuIDA7CiB9CiAKLS8qIEJyZWFrIHJlZmVyZW5jZSBjeWNsZXMgYnkgY2xlYXJpbmcgdGhlIGNvbnRhaW5lcnMgaW52b2x2ZWQuCVRoaXMgaXMKKy8qIEJyZWFrIHJlZmVyZW5jZSBjeWNsZXMgYnkgY2xlYXJpbmcgdGhlIGNvbnRhaW5lcnMgaW52b2x2ZWQuICBUaGlzIGlzCiAgKiB0cmlja3kgYnVzaW5lc3MgYXMgdGhlIGxpc3RzIGNhbiBiZSBjaGFuZ2luZyBhbmQgd2UgZG9uJ3Qga25vdyB3aGljaAogICogb2JqZWN0cyBtYXkgYmUgZnJlZWQuICBJdCBpcyBwb3NzaWJsZSBJIHNjcmV3ZWQgc29tZXRoaW5nIHVwIGhlcmUuCiAgKi8KIHN0YXRpYyB2b2lkCiBkZWxldGVfZ2FyYmFnZShQeUdDX0hlYWQgKmNvbGxlY3RhYmxlLCBQeUdDX0hlYWQgKm9sZCkKIHsKLQlpbnF1aXJ5IGNsZWFyOworICAgIGlucXVpcnkgY2xlYXI7CiAKLQl3aGlsZSAoIWdjX2xpc3RfaXNfZW1wdHkoY29sbGVjdGFibGUpKSB7Ci0JCVB5R0NfSGVhZCAqZ2MgPSBjb2xsZWN0YWJsZS0+Z2MuZ2NfbmV4dDsKLQkJUHlPYmplY3QgKm9wID0gRlJPTV9HQyhnYyk7CisgICAgd2hpbGUgKCFnY19saXN0X2lzX2VtcHR5KGNvbGxlY3RhYmxlKSkgeworICAgICAgICBQeUdDX0hlYWQgKmdjID0gY29sbGVjdGFibGUtPmdjLmdjX25leHQ7CisgICAgICAgIFB5T2JqZWN0ICpvcCA9IEZST01fR0MoZ2MpOwogCi0JCWFzc2VydChJU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRShvcCkpOwotCQlpZiAoZGVidWcgJiBERUJVR19TQVZFQUxMKSB7Ci0JCQlQeUxpc3RfQXBwZW5kKGdhcmJhZ2UsIG9wKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICgoY2xlYXIgPSBQeV9UWVBFKG9wKS0+dHBfY2xlYXIpICE9IE5VTEwpIHsKLQkJCQlQeV9JTkNSRUYob3ApOwotCQkJCWNsZWFyKG9wKTsKLQkJCQlQeV9ERUNSRUYob3ApOwotCQkJfQotCQl9Ci0JCWlmIChjb2xsZWN0YWJsZS0+Z2MuZ2NfbmV4dCA9PSBnYykgewotCQkJLyogb2JqZWN0IGlzIHN0aWxsIGFsaXZlLCBtb3ZlIGl0LCBpdCBtYXkgZGllIGxhdGVyICovCi0JCQlnY19saXN0X21vdmUoZ2MsIG9sZCk7Ci0JCQlnYy0+Z2MuZ2NfcmVmcyA9IEdDX1JFQUNIQUJMRTsKLQkJfQotCX0KKyAgICAgICAgYXNzZXJ0KElTX1RFTlRBVElWRUxZX1VOUkVBQ0hBQkxFKG9wKSk7CisgICAgICAgIGlmIChkZWJ1ZyAmIERFQlVHX1NBVkVBTEwpIHsKKyAgICAgICAgICAgIFB5TGlzdF9BcHBlbmQoZ2FyYmFnZSwgb3ApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKChjbGVhciA9IFB5X1RZUEUob3ApLT50cF9jbGVhcikgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihvcCk7CisgICAgICAgICAgICAgICAgY2xlYXIob3ApOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbGxlY3RhYmxlLT5nYy5nY19uZXh0ID09IGdjKSB7CisgICAgICAgICAgICAvKiBvYmplY3QgaXMgc3RpbGwgYWxpdmUsIG1vdmUgaXQsIGl0IG1heSBkaWUgbGF0ZXIgKi8KKyAgICAgICAgICAgIGdjX2xpc3RfbW92ZShnYywgb2xkKTsKKyAgICAgICAgICAgIGdjLT5nYy5nY19yZWZzID0gR0NfUkVBQ0hBQkxFOworICAgICAgICB9CisgICAgfQogfQogCiAvKiBDbGVhciBhbGwgZnJlZSBsaXN0cwpAQCAtNzMxLDMxICs3MzEsMzEgQEAKIHN0YXRpYyB2b2lkCiBjbGVhcl9mcmVlbGlzdHModm9pZCkKIHsKLQkodm9pZClQeU1ldGhvZF9DbGVhckZyZWVMaXN0KCk7Ci0JKHZvaWQpUHlGcmFtZV9DbGVhckZyZWVMaXN0KCk7Ci0JKHZvaWQpUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdCgpOwotCSh2b2lkKVB5VHVwbGVfQ2xlYXJGcmVlTGlzdCgpOwotCSh2b2lkKVB5VW5pY29kZV9DbGVhckZyZWVMaXN0KCk7Ci0JKHZvaWQpUHlJbnRfQ2xlYXJGcmVlTGlzdCgpOwotCSh2b2lkKVB5RmxvYXRfQ2xlYXJGcmVlTGlzdCgpOworICAgICh2b2lkKVB5TWV0aG9kX0NsZWFyRnJlZUxpc3QoKTsKKyAgICAodm9pZClQeUZyYW1lX0NsZWFyRnJlZUxpc3QoKTsKKyAgICAodm9pZClQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlUdXBsZV9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlVbmljb2RlX0NsZWFyRnJlZUxpc3QoKTsKKyAgICAodm9pZClQeUludF9DbGVhckZyZWVMaXN0KCk7CisgICAgKHZvaWQpUHlGbG9hdF9DbGVhckZyZWVMaXN0KCk7CiB9CiAKIHN0YXRpYyBkb3VibGUKIGdldF90aW1lKHZvaWQpCiB7Ci0JZG91YmxlIHJlc3VsdCA9IDA7Ci0JaWYgKHRtb2QgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqZiA9IFB5T2JqZWN0X0NhbGxNZXRob2QodG1vZCwgInRpbWUiLCBOVUxMKTsKLQkJaWYgKGYgPT0gTlVMTCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChQeUZsb2F0X0NoZWNrKGYpKQotCQkJCXJlc3VsdCA9IFB5RmxvYXRfQXNEb3VibGUoZik7Ci0JCQlQeV9ERUNSRUYoZik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBkb3VibGUgcmVzdWx0ID0gMDsKKyAgICBpZiAodG1vZCAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpmID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0bW9kLCAidGltZSIsIE5VTEwpOworICAgICAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5RmxvYXRfQ2hlY2soZikpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Bc0RvdWJsZShmKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uLiAgUmVhZCB0aGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoZQpAQCAtNzYzLDE2OSArNzYzLDE2OSBAQAogc3RhdGljIFB5X3NzaXplX3QKIGNvbGxlY3QoaW50IGdlbmVyYXRpb24pCiB7Ci0JaW50IGk7Ci0JUHlfc3NpemVfdCBtID0gMDsgLyogIyBvYmplY3RzIGNvbGxlY3RlZCAqLwotCVB5X3NzaXplX3QgbiA9IDA7IC8qICMgdW5yZWFjaGFibGUgb2JqZWN0cyB0aGF0IGNvdWxkbid0IGJlIGNvbGxlY3RlZCAqLwotCVB5R0NfSGVhZCAqeW91bmc7IC8qIHRoZSBnZW5lcmF0aW9uIHdlIGFyZSBleGFtaW5pbmcgKi8KLQlQeUdDX0hlYWQgKm9sZDsgLyogbmV4dCBvbGRlciBnZW5lcmF0aW9uICovCi0JUHlHQ19IZWFkIHVucmVhY2hhYmxlOyAvKiBub24tcHJvYmxlbWF0aWMgdW5yZWFjaGFibGUgdHJhc2ggKi8KLQlQeUdDX0hlYWQgZmluYWxpemVyczsgIC8qIG9iamVjdHMgd2l0aCwgJiByZWFjaGFibGUgZnJvbSwgX19kZWxfXyAqLwotCVB5R0NfSGVhZCAqZ2M7Ci0JZG91YmxlIHQxID0gMC4wOworICAgIGludCBpOworICAgIFB5X3NzaXplX3QgbSA9IDA7IC8qICMgb2JqZWN0cyBjb2xsZWN0ZWQgKi8KKyAgICBQeV9zc2l6ZV90IG4gPSAwOyAvKiAjIHVucmVhY2hhYmxlIG9iamVjdHMgdGhhdCBjb3VsZG4ndCBiZSBjb2xsZWN0ZWQgKi8KKyAgICBQeUdDX0hlYWQgKnlvdW5nOyAvKiB0aGUgZ2VuZXJhdGlvbiB3ZSBhcmUgZXhhbWluaW5nICovCisgICAgUHlHQ19IZWFkICpvbGQ7IC8qIG5leHQgb2xkZXIgZ2VuZXJhdGlvbiAqLworICAgIFB5R0NfSGVhZCB1bnJlYWNoYWJsZTsgLyogbm9uLXByb2JsZW1hdGljIHVucmVhY2hhYmxlIHRyYXNoICovCisgICAgUHlHQ19IZWFkIGZpbmFsaXplcnM7ICAvKiBvYmplY3RzIHdpdGgsICYgcmVhY2hhYmxlIGZyb20sIF9fZGVsX18gKi8KKyAgICBQeUdDX0hlYWQgKmdjOworICAgIGRvdWJsZSB0MSA9IDAuMDsKIAotCWlmIChkZWxzdHIgPT0gTlVMTCkgewotCQlkZWxzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbF9fIik7Ci0JCWlmIChkZWxzdHIgPT0gTlVMTCkKLQkJCVB5X0ZhdGFsRXJyb3IoImdjIGNvdWxkbid0IGFsbG9jYXRlIFwiX19kZWxfX1wiIik7Ci0JfQorICAgIGlmIChkZWxzdHIgPT0gTlVMTCkgeworICAgICAgICBkZWxzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbF9fIik7CisgICAgICAgIGlmIChkZWxzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImdjIGNvdWxkbid0IGFsbG9jYXRlIFwiX19kZWxfX1wiIik7CisgICAgfQogCi0JaWYgKGRlYnVnICYgREVCVUdfU1RBVFMpIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBjb2xsZWN0aW5nIGdlbmVyYXRpb24gJWQuLi5cbiIsCi0JCQkJICBnZW5lcmF0aW9uKTsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBvYmplY3RzIGluIGVhY2ggZ2VuZXJhdGlvbjoiKTsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiAlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKLQkJCQkJICBnY19saXN0X3NpemUoR0VOX0hFQUQoaSkpKTsKLQkJdDEgPSBnZXRfdGltZSgpOwotCQlQeVN5c19Xcml0ZVN0ZGVycigiXG4iKTsKLQl9CisgICAgaWYgKGRlYnVnICYgREVCVUdfU1RBVFMpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImdjOiBjb2xsZWN0aW5nIGdlbmVyYXRpb24gJWQuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24pOworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiZ2M6IG9iamVjdHMgaW4gZWFjaCBnZW5lcmF0aW9uOiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0dFTkVSQVRJT05TOyBpKyspCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiICUiIFBZX0ZPUk1BVF9TSVpFX1QgImQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NfbGlzdF9zaXplKEdFTl9IRUFEKGkpKSk7CisgICAgICAgIHQxID0gZ2V0X3RpbWUoKTsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlxuIik7CisgICAgfQogCi0JLyogdXBkYXRlIGNvbGxlY3Rpb24gYW5kIGFsbG9jYXRpb24gY291bnRlcnMgKi8KLQlpZiAoZ2VuZXJhdGlvbisxIDwgTlVNX0dFTkVSQVRJT05TKQotCQlnZW5lcmF0aW9uc1tnZW5lcmF0aW9uKzFdLmNvdW50ICs9IDE7Ci0JZm9yIChpID0gMDsgaSA8PSBnZW5lcmF0aW9uOyBpKyspCi0JCWdlbmVyYXRpb25zW2ldLmNvdW50ID0gMDsKKyAgICAvKiB1cGRhdGUgY29sbGVjdGlvbiBhbmQgYWxsb2NhdGlvbiBjb3VudGVycyAqLworICAgIGlmIChnZW5lcmF0aW9uKzEgPCBOVU1fR0VORVJBVElPTlMpCisgICAgICAgIGdlbmVyYXRpb25zW2dlbmVyYXRpb24rMV0uY291bnQgKz0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IGdlbmVyYXRpb247IGkrKykKKyAgICAgICAgZ2VuZXJhdGlvbnNbaV0uY291bnQgPSAwOwogCi0JLyogbWVyZ2UgeW91bmdlciBnZW5lcmF0aW9ucyB3aXRoIG9uZSB3ZSBhcmUgY3VycmVudGx5IGNvbGxlY3RpbmcgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZ2VuZXJhdGlvbjsgaSsrKSB7Ci0JCWdjX2xpc3RfbWVyZ2UoR0VOX0hFQUQoaSksIEdFTl9IRUFEKGdlbmVyYXRpb24pKTsKLQl9CisgICAgLyogbWVyZ2UgeW91bmdlciBnZW5lcmF0aW9ucyB3aXRoIG9uZSB3ZSBhcmUgY3VycmVudGx5IGNvbGxlY3RpbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2VuZXJhdGlvbjsgaSsrKSB7CisgICAgICAgIGdjX2xpc3RfbWVyZ2UoR0VOX0hFQUQoaSksIEdFTl9IRUFEKGdlbmVyYXRpb24pKTsKKyAgICB9CiAKLQkvKiBoYW5keSByZWZlcmVuY2VzICovCi0JeW91bmcgPSBHRU5fSEVBRChnZW5lcmF0aW9uKTsKLQlpZiAoZ2VuZXJhdGlvbiA8IE5VTV9HRU5FUkFUSU9OUy0xKQotCQlvbGQgPSBHRU5fSEVBRChnZW5lcmF0aW9uKzEpOwotCWVsc2UKLQkJb2xkID0geW91bmc7CisgICAgLyogaGFuZHkgcmVmZXJlbmNlcyAqLworICAgIHlvdW5nID0gR0VOX0hFQUQoZ2VuZXJhdGlvbik7CisgICAgaWYgKGdlbmVyYXRpb24gPCBOVU1fR0VORVJBVElPTlMtMSkKKyAgICAgICAgb2xkID0gR0VOX0hFQUQoZ2VuZXJhdGlvbisxKTsKKyAgICBlbHNlCisgICAgICAgIG9sZCA9IHlvdW5nOwogCi0JLyogVXNpbmcgb2JfcmVmY250IGFuZCBnY19yZWZzLCBjYWxjdWxhdGUgd2hpY2ggb2JqZWN0cyBpbiB0aGUKLQkgKiBjb250YWluZXIgc2V0IGFyZSByZWFjaGFibGUgZnJvbSBvdXRzaWRlIHRoZSBzZXQgKGkuZS4sIGhhdmUgYQotCSAqIHJlZmNvdW50IGdyZWF0ZXIgdGhhbiAwIHdoZW4gYWxsIHRoZSByZWZlcmVuY2VzIHdpdGhpbiB0aGUKLQkgKiBzZXQgYXJlIHRha2VuIGludG8gYWNjb3VudCkuCi0JICovCi0JdXBkYXRlX3JlZnMoeW91bmcpOwotCXN1YnRyYWN0X3JlZnMoeW91bmcpOworICAgIC8qIFVzaW5nIG9iX3JlZmNudCBhbmQgZ2NfcmVmcywgY2FsY3VsYXRlIHdoaWNoIG9iamVjdHMgaW4gdGhlCisgICAgICogY29udGFpbmVyIHNldCBhcmUgcmVhY2hhYmxlIGZyb20gb3V0c2lkZSB0aGUgc2V0IChpLmUuLCBoYXZlIGEKKyAgICAgKiByZWZjb3VudCBncmVhdGVyIHRoYW4gMCB3aGVuIGFsbCB0aGUgcmVmZXJlbmNlcyB3aXRoaW4gdGhlCisgICAgICogc2V0IGFyZSB0YWtlbiBpbnRvIGFjY291bnQpLgorICAgICAqLworICAgIHVwZGF0ZV9yZWZzKHlvdW5nKTsKKyAgICBzdWJ0cmFjdF9yZWZzKHlvdW5nKTsKIAotCS8qIExlYXZlIGV2ZXJ5dGhpbmcgcmVhY2hhYmxlIGZyb20gb3V0c2lkZSB5b3VuZyBpbiB5b3VuZywgYW5kIG1vdmUKLQkgKiBldmVyeXRoaW5nIGVsc2UgKGluIHlvdW5nKSB0byB1bnJlYWNoYWJsZS4KLQkgKiBOT1RFOiAgVGhpcyB1c2VkIHRvIG1vdmUgdGhlIHJlYWNoYWJsZSBvYmplY3RzIGludG8gYSByZWFjaGFibGUKLQkgKiBzZXQgaW5zdGVhZC4gIEJ1dCBtb3N0IHRoaW5ncyB1c3VhbGx5IHR1cm4gb3V0IHRvIGJlIHJlYWNoYWJsZSwKLQkgKiBzbyBpdCdzIG1vcmUgZWZmaWNpZW50IHRvIG1vdmUgdGhlIHVucmVhY2hhYmxlIHRoaW5ncy4KLQkgKi8KLQlnY19saXN0X2luaXQoJnVucmVhY2hhYmxlKTsKLQltb3ZlX3VucmVhY2hhYmxlKHlvdW5nLCAmdW5yZWFjaGFibGUpOworICAgIC8qIExlYXZlIGV2ZXJ5dGhpbmcgcmVhY2hhYmxlIGZyb20gb3V0c2lkZSB5b3VuZyBpbiB5b3VuZywgYW5kIG1vdmUKKyAgICAgKiBldmVyeXRoaW5nIGVsc2UgKGluIHlvdW5nKSB0byB1bnJlYWNoYWJsZS4KKyAgICAgKiBOT1RFOiAgVGhpcyB1c2VkIHRvIG1vdmUgdGhlIHJlYWNoYWJsZSBvYmplY3RzIGludG8gYSByZWFjaGFibGUKKyAgICAgKiBzZXQgaW5zdGVhZC4gIEJ1dCBtb3N0IHRoaW5ncyB1c3VhbGx5IHR1cm4gb3V0IHRvIGJlIHJlYWNoYWJsZSwKKyAgICAgKiBzbyBpdCdzIG1vcmUgZWZmaWNpZW50IHRvIG1vdmUgdGhlIHVucmVhY2hhYmxlIHRoaW5ncy4KKyAgICAgKi8KKyAgICBnY19saXN0X2luaXQoJnVucmVhY2hhYmxlKTsKKyAgICBtb3ZlX3VucmVhY2hhYmxlKHlvdW5nLCAmdW5yZWFjaGFibGUpOwogCi0JLyogTW92ZSByZWFjaGFibGUgb2JqZWN0cyB0byBuZXh0IGdlbmVyYXRpb24uICovCi0JaWYgKHlvdW5nICE9IG9sZCkKLQkJZ2NfbGlzdF9tZXJnZSh5b3VuZywgb2xkKTsKKyAgICAvKiBNb3ZlIHJlYWNoYWJsZSBvYmplY3RzIHRvIG5leHQgZ2VuZXJhdGlvbi4gKi8KKyAgICBpZiAoeW91bmcgIT0gb2xkKQorICAgICAgICBnY19saXN0X21lcmdlKHlvdW5nLCBvbGQpOwogCi0JLyogQWxsIG9iamVjdHMgaW4gdW5yZWFjaGFibGUgYXJlIHRyYXNoLCBidXQgb2JqZWN0cyByZWFjaGFibGUgZnJvbQotCSAqIGZpbmFsaXplcnMgY2FuJ3Qgc2FmZWx5IGJlIGRlbGV0ZWQuICBQeXRob24gcHJvZ3JhbW1lcnMgc2hvdWxkIHRha2UKLQkgKiBjYXJlIG5vdCB0byBjcmVhdGUgc3VjaCB0aGluZ3MuICBGb3IgUHl0aG9uLCBmaW5hbGl6ZXJzIG1lYW5zCi0JICogaW5zdGFuY2Ugb2JqZWN0cyB3aXRoIF9fZGVsX18gbWV0aG9kcy4gIFdlYWtyZWZzIHdpdGggY2FsbGJhY2tzCi0JICogY2FuIGFsc28gY2FsbCBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgYnV0IHRoZXkgd2lsbCBiZSBkZWFsdCB3aXRoIGJ5Ci0JICogaGFuZGxlX3dlYWtyZWZzKCkuCi0gCSAqLwotCWdjX2xpc3RfaW5pdCgmZmluYWxpemVycyk7Ci0JbW92ZV9maW5hbGl6ZXJzKCZ1bnJlYWNoYWJsZSwgJmZpbmFsaXplcnMpOwotCS8qIGZpbmFsaXplcnMgY29udGFpbnMgdGhlIHVucmVhY2hhYmxlIG9iamVjdHMgd2l0aCBhIGZpbmFsaXplcjsKLQkgKiB1bnJlYWNoYWJsZSBvYmplY3RzIHJlYWNoYWJsZSAqZnJvbSogdGhvc2UgYXJlIGFsc28gdW5jb2xsZWN0YWJsZSwKLQkgKiBhbmQgd2UgbW92ZSB0aG9zZSBpbnRvIHRoZSBmaW5hbGl6ZXJzIGxpc3QgdG9vLgotCSAqLwotCW1vdmVfZmluYWxpemVyX3JlYWNoYWJsZSgmZmluYWxpemVycyk7CisgICAgLyogQWxsIG9iamVjdHMgaW4gdW5yZWFjaGFibGUgYXJlIHRyYXNoLCBidXQgb2JqZWN0cyByZWFjaGFibGUgZnJvbQorICAgICAqIGZpbmFsaXplcnMgY2FuJ3Qgc2FmZWx5IGJlIGRlbGV0ZWQuICBQeXRob24gcHJvZ3JhbW1lcnMgc2hvdWxkIHRha2UKKyAgICAgKiBjYXJlIG5vdCB0byBjcmVhdGUgc3VjaCB0aGluZ3MuICBGb3IgUHl0aG9uLCBmaW5hbGl6ZXJzIG1lYW5zCisgICAgICogaW5zdGFuY2Ugb2JqZWN0cyB3aXRoIF9fZGVsX18gbWV0aG9kcy4gIFdlYWtyZWZzIHdpdGggY2FsbGJhY2tzCisgICAgICogY2FuIGFsc28gY2FsbCBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgYnV0IHRoZXkgd2lsbCBiZSBkZWFsdCB3aXRoIGJ5CisgICAgICogaGFuZGxlX3dlYWtyZWZzKCkuCisgICAgICovCisgICAgZ2NfbGlzdF9pbml0KCZmaW5hbGl6ZXJzKTsKKyAgICBtb3ZlX2ZpbmFsaXplcnMoJnVucmVhY2hhYmxlLCAmZmluYWxpemVycyk7CisgICAgLyogZmluYWxpemVycyBjb250YWlucyB0aGUgdW5yZWFjaGFibGUgb2JqZWN0cyB3aXRoIGEgZmluYWxpemVyOworICAgICAqIHVucmVhY2hhYmxlIG9iamVjdHMgcmVhY2hhYmxlICpmcm9tKiB0aG9zZSBhcmUgYWxzbyB1bmNvbGxlY3RhYmxlLAorICAgICAqIGFuZCB3ZSBtb3ZlIHRob3NlIGludG8gdGhlIGZpbmFsaXplcnMgbGlzdCB0b28uCisgICAgICovCisgICAgbW92ZV9maW5hbGl6ZXJfcmVhY2hhYmxlKCZmaW5hbGl6ZXJzKTsKIAotCS8qIENvbGxlY3Qgc3RhdGlzdGljcyBvbiBjb2xsZWN0YWJsZSBvYmplY3RzIGZvdW5kIGFuZCBwcmludAotCSAqIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkgKi8KLQlmb3IgKGdjID0gdW5yZWFjaGFibGUuZ2MuZ2NfbmV4dDsgZ2MgIT0gJnVucmVhY2hhYmxlOwotCQkJZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgewotCQltKys7Ci0JCWlmIChkZWJ1ZyAmIERFQlVHX0NPTExFQ1RBQkxFKSB7Ci0JCQlkZWJ1Z19jeWNsZSgiY29sbGVjdGFibGUiLCBGUk9NX0dDKGdjKSk7Ci0JCX0KLQl9CisgICAgLyogQ29sbGVjdCBzdGF0aXN0aWNzIG9uIGNvbGxlY3RhYmxlIG9iamVjdHMgZm91bmQgYW5kIHByaW50CisgICAgICogZGVidWdnaW5nIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIGZvciAoZ2MgPSB1bnJlYWNoYWJsZS5nYy5nY19uZXh0OyBnYyAhPSAmdW5yZWFjaGFibGU7CisgICAgICAgICAgICAgICAgICAgIGdjID0gZ2MtPmdjLmdjX25leHQpIHsKKyAgICAgICAgbSsrOworICAgICAgICBpZiAoZGVidWcgJiBERUJVR19DT0xMRUNUQUJMRSkgeworICAgICAgICAgICAgZGVidWdfY3ljbGUoImNvbGxlY3RhYmxlIiwgRlJPTV9HQyhnYykpOworICAgICAgICB9CisgICAgfQogCi0JLyogQ2xlYXIgd2Vha3JlZnMgYW5kIGludm9rZSBjYWxsYmFja3MgYXMgbmVjZXNzYXJ5LiAqLwotCW0gKz0gaGFuZGxlX3dlYWtyZWZzKCZ1bnJlYWNoYWJsZSwgb2xkKTsKKyAgICAvKiBDbGVhciB3ZWFrcmVmcyBhbmQgaW52b2tlIGNhbGxiYWNrcyBhcyBuZWNlc3NhcnkuICovCisgICAgbSArPSBoYW5kbGVfd2Vha3JlZnMoJnVucmVhY2hhYmxlLCBvbGQpOwogCi0JLyogQ2FsbCB0cF9jbGVhciBvbiBvYmplY3RzIGluIHRoZSB1bnJlYWNoYWJsZSBzZXQuICBUaGlzIHdpbGwgY2F1c2UKLQkgKiB0aGUgcmVmZXJlbmNlIGN5Y2xlcyB0byBiZSBicm9rZW4uICBJdCBtYXkgYWxzbyBjYXVzZSBzb21lIG9iamVjdHMKLQkgKiBpbiBmaW5hbGl6ZXJzIHRvIGJlIGZyZWVkLgotCSAqLwotCWRlbGV0ZV9nYXJiYWdlKCZ1bnJlYWNoYWJsZSwgb2xkKTsKKyAgICAvKiBDYWxsIHRwX2NsZWFyIG9uIG9iamVjdHMgaW4gdGhlIHVucmVhY2hhYmxlIHNldC4gIFRoaXMgd2lsbCBjYXVzZQorICAgICAqIHRoZSByZWZlcmVuY2UgY3ljbGVzIHRvIGJlIGJyb2tlbi4gIEl0IG1heSBhbHNvIGNhdXNlIHNvbWUgb2JqZWN0cworICAgICAqIGluIGZpbmFsaXplcnMgdG8gYmUgZnJlZWQuCisgICAgICovCisgICAgZGVsZXRlX2dhcmJhZ2UoJnVucmVhY2hhYmxlLCBvbGQpOwogCi0JLyogQ29sbGVjdCBzdGF0aXN0aWNzIG9uIHVuY29sbGVjdGFibGUgb2JqZWN0cyBmb3VuZCBhbmQgcHJpbnQKLQkgKiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICovCi0JZm9yIChnYyA9IGZpbmFsaXplcnMuZ2MuZ2NfbmV4dDsKLQkgICAgIGdjICE9ICZmaW5hbGl6ZXJzOwotCSAgICAgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgewotCQluKys7Ci0JCWlmIChkZWJ1ZyAmIERFQlVHX1VOQ09MTEVDVEFCTEUpCi0JCQlkZWJ1Z19jeWNsZSgidW5jb2xsZWN0YWJsZSIsIEZST01fR0MoZ2MpKTsKLQl9Ci0JaWYgKGRlYnVnICYgREVCVUdfU1RBVFMpIHsKLQkJZG91YmxlIHQyID0gZ2V0X3RpbWUoKTsKLQkJaWYgKG0gPT0gMCAmJiBuID09IDApCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiZ2M6IGRvbmUiKTsKLQkJZWxzZQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkgICAgImdjOiBkb25lLCAiCi0JCQkgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgdW5yZWFjaGFibGUsICIKLQkJCSAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCB1bmNvbGxlY3RhYmxlIiwKLQkJCSAgICBuK20sIG4pOwotCQlpZiAodDEgJiYgdDIpIHsKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIsICUuNGZzIGVsYXBzZWQiLCB0Mi10MSk7Ci0JCX0KLQkJUHlTeXNfV3JpdGVTdGRlcnIoIi5cbiIpOwotCX0KKyAgICAvKiBDb2xsZWN0IHN0YXRpc3RpY3Mgb24gdW5jb2xsZWN0YWJsZSBvYmplY3RzIGZvdW5kIGFuZCBwcmludAorICAgICAqIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gKi8KKyAgICBmb3IgKGdjID0gZmluYWxpemVycy5nYy5nY19uZXh0OworICAgICAgICAgZ2MgIT0gJmZpbmFsaXplcnM7CisgICAgICAgICBnYyA9IGdjLT5nYy5nY19uZXh0KSB7CisgICAgICAgIG4rKzsKKyAgICAgICAgaWYgKGRlYnVnICYgREVCVUdfVU5DT0xMRUNUQUJMRSkKKyAgICAgICAgICAgIGRlYnVnX2N5Y2xlKCJ1bmNvbGxlY3RhYmxlIiwgRlJPTV9HQyhnYykpOworICAgIH0KKyAgICBpZiAoZGVidWcgJiBERUJVR19TVEFUUykgeworICAgICAgICBkb3VibGUgdDIgPSBnZXRfdGltZSgpOworICAgICAgICBpZiAobSA9PSAwICYmIG4gPT0gMCkKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJnYzogZG9uZSIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigKKyAgICAgICAgICAgICAgICAiZ2M6IGRvbmUsICIKKyAgICAgICAgICAgICAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCB1bnJlYWNoYWJsZSwgIgorICAgICAgICAgICAgICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIHVuY29sbGVjdGFibGUiLAorICAgICAgICAgICAgICAgIG4rbSwgbik7CisgICAgICAgIGlmICh0MSAmJiB0MikgeworICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiwgJS40ZnMgZWxhcHNlZCIsIHQyLXQxKTsKKyAgICAgICAgfQorICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiLlxuIik7CisgICAgfQogCi0JLyogQXBwZW5kIGluc3RhbmNlcyBpbiB0aGUgdW5jb2xsZWN0YWJsZSBzZXQgdG8gYSBQeXRob24KLQkgKiByZWFjaGFibGUgbGlzdCBvZiBnYXJiYWdlLiAgVGhlIHByb2dyYW1tZXIgaGFzIHRvIGRlYWwgd2l0aAotCSAqIHRoaXMgaWYgdGhleSBpbnNpc3Qgb24gY3JlYXRpbmcgdGhpcyB0eXBlIG9mIHN0cnVjdHVyZS4KLQkgKi8KLQkodm9pZCloYW5kbGVfZmluYWxpemVycygmZmluYWxpemVycywgb2xkKTsKKyAgICAvKiBBcHBlbmQgaW5zdGFuY2VzIGluIHRoZSB1bmNvbGxlY3RhYmxlIHNldCB0byBhIFB5dGhvbgorICAgICAqIHJlYWNoYWJsZSBsaXN0IG9mIGdhcmJhZ2UuICBUaGUgcHJvZ3JhbW1lciBoYXMgdG8gZGVhbCB3aXRoCisgICAgICogdGhpcyBpZiB0aGV5IGluc2lzdCBvbiBjcmVhdGluZyB0aGlzIHR5cGUgb2Ygc3RydWN0dXJlLgorICAgICAqLworICAgICh2b2lkKWhhbmRsZV9maW5hbGl6ZXJzKCZmaW5hbGl6ZXJzLCBvbGQpOwogCi0JLyogQ2xlYXIgZnJlZSBsaXN0IG9ubHkgZHVyaW5nIHRoZSBjb2xsZWN0aW9uIG9mIHRoZSBoaWdlc3QKLQkgKiBnZW5lcmF0aW9uICovCi0JaWYgKGdlbmVyYXRpb24gPT0gTlVNX0dFTkVSQVRJT05TLTEpIHsKLQkJY2xlYXJfZnJlZWxpc3RzKCk7Ci0JfQorICAgIC8qIENsZWFyIGZyZWUgbGlzdCBvbmx5IGR1cmluZyB0aGUgY29sbGVjdGlvbiBvZiB0aGUgaGlnZXN0CisgICAgICogZ2VuZXJhdGlvbiAqLworICAgIGlmIChnZW5lcmF0aW9uID09IE5VTV9HRU5FUkFUSU9OUy0xKSB7CisgICAgICAgIGNsZWFyX2ZyZWVsaXN0cygpOworICAgIH0KIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWlmIChnY19zdHIgPT0gTlVMTCkKLQkJCWdjX3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoImdhcmJhZ2UgY29sbGVjdGlvbiIpOwotCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoZ2Nfc3RyKTsKLQkJUHlfRmF0YWxFcnJvcigidW5leHBlY3RlZCBleGNlcHRpb24gZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbiIpOwotCX0KLQlyZXR1cm4gbittOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmIChnY19zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdjX3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoImdhcmJhZ2UgY29sbGVjdGlvbiIpOworICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoZ2Nfc3RyKTsKKyAgICAgICAgUHlfRmF0YWxFcnJvcigidW5leHBlY3RlZCBleGNlcHRpb24gZHVyaW5nIGdhcmJhZ2UgY29sbGVjdGlvbiIpOworICAgIH0KKyAgICByZXR1cm4gbittOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogY29sbGVjdF9nZW5lcmF0aW9ucyh2b2lkKQogewotCWludCBpOwotCVB5X3NzaXplX3QgbiA9IDA7CisgICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBuID0gMDsKIAotCS8qIEZpbmQgdGhlIG9sZGVzdCBnZW5lcmF0aW9uIChoaWdlc3QgbnVtYmVyZWQpIHdoZXJlIHRoZSBjb3VudAotCSAqIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC4gIE9iamVjdHMgaW4gdGhlIHRoYXQgZ2VuZXJhdGlvbiBhbmQKLQkgKiBnZW5lcmF0aW9ucyB5b3VuZ2VyIHRoYW4gaXQgd2lsbCBiZSBjb2xsZWN0ZWQuICovCi0JZm9yIChpID0gTlVNX0dFTkVSQVRJT05TLTE7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmIChnZW5lcmF0aW9uc1tpXS5jb3VudCA+IGdlbmVyYXRpb25zW2ldLnRocmVzaG9sZCkgewotCQkJbiA9IGNvbGxlY3QoaSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gbjsKKyAgICAvKiBGaW5kIHRoZSBvbGRlc3QgZ2VuZXJhdGlvbiAoaGlnZXN0IG51bWJlcmVkKSB3aGVyZSB0aGUgY291bnQKKyAgICAgKiBleGNlZWRzIHRoZSB0aHJlc2hvbGQuICBPYmplY3RzIGluIHRoZSB0aGF0IGdlbmVyYXRpb24gYW5kCisgICAgICogZ2VuZXJhdGlvbnMgeW91bmdlciB0aGFuIGl0IHdpbGwgYmUgY29sbGVjdGVkLiAqLworICAgIGZvciAoaSA9IE5VTV9HRU5FUkFUSU9OUy0xOyBpID49IDA7IGktLSkgeworICAgICAgICBpZiAoZ2VuZXJhdGlvbnNbaV0uY291bnQgPiBnZW5lcmF0aW9uc1tpXS50aHJlc2hvbGQpIHsKKyAgICAgICAgICAgIG4gPSBjb2xsZWN0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG47CiB9CiAKIFB5RG9jX1NUUlZBUihnY19lbmFibGVfX2RvY19fLApAQCAtOTM2LDkgKzkzNiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfZW5hYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCWVuYWJsZWQgPSAxOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmFibGVkID0gMTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19kaXNhYmxlX19kb2NfXywKQEAgLTk0OSw5ICs5NDksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX2Rpc2FibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JZW5hYmxlZCA9IDA7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuYWJsZWQgPSAwOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGdjX2lzZW5hYmxlZF9fZG9jX18sCkBAIC05NjIsNyArOTYyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnY19pc2VuYWJsZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZyllbmFibGVkKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKWVuYWJsZWQpOwogfQogCiBQeURvY19TVFJWQVIoZ2NfY29sbGVjdF9fZG9jX18sCkBAIC05NzYsMjcgKzk3NiwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX2NvbGxlY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dzKQogewotCXN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJnZW5lcmF0aW9uIiwgTlVMTH07Ci0JaW50IGdlbmFyZyA9IE5VTV9HRU5FUkFUSU9OUyAtIDE7Ci0JUHlfc3NpemVfdCBuOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJnZW5lcmF0aW9uIiwgTlVMTH07CisgICAgaW50IGdlbmFyZyA9IE5VTV9HRU5FUkFUSU9OUyAtIDE7CisgICAgUHlfc3NpemVfdCBuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dzLCAifGkiLCBrZXl3b3JkcywgJmdlbmFyZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3cywgInxpIiwga2V5d29yZHMsICZnZW5hcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVsc2UgaWYgKGdlbmFyZyA8IDAgfHwgZ2VuYXJnID49IE5VTV9HRU5FUkFUSU9OUykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgZ2VuZXJhdGlvbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZWxzZSBpZiAoZ2VuYXJnIDwgMCB8fCBnZW5hcmcgPj0gTlVNX0dFTkVSQVRJT05TKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBnZW5lcmF0aW9uIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChjb2xsZWN0aW5nKQotCQluID0gMDsgLyogYWxyZWFkeSBjb2xsZWN0aW5nLCBkb24ndCBkbyBhbnl0aGluZyAqLwotCWVsc2UgewotCQljb2xsZWN0aW5nID0gMTsKLQkJbiA9IGNvbGxlY3QoZ2VuYXJnKTsKLQkJY29sbGVjdGluZyA9IDA7Ci0JfQorICAgIGlmIChjb2xsZWN0aW5nKQorICAgICAgICBuID0gMDsgLyogYWxyZWFkeSBjb2xsZWN0aW5nLCBkb24ndCBkbyBhbnl0aGluZyAqLworICAgIGVsc2UgeworICAgICAgICBjb2xsZWN0aW5nID0gMTsKKyAgICAgICAgbiA9IGNvbGxlY3QoZ2VuYXJnKTsKKyAgICAgICAgY29sbGVjdGluZyA9IDA7CisgICAgfQogCi0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KG4pOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChuKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdjX3NldF9kZWJ1Z19fZG9jX18sCkBAIC0xMDE4LDExICsxMDE4LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2Nfc2V0X2RlYnVnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0X2RlYnVnIiwgJmRlYnVnKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldF9kZWJ1ZyIsICZkZWJ1ZykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGdjX2dldF9kZWJ1Z19fZG9jX18sCkBAIC0xMDMzLDcgKzEwMzMsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX2dldF9kZWJ1ZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGRlYnVnKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIGRlYnVnKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdjX3NldF90aHJlc2hfX2RvY19fLApAQCAtMTA0NSwxOSArMTA0NSwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX3NldF90aHJlc2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpaTpzZXRfdGhyZXNob2xkIiwKLQkJCSAgICAgICZnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQsCi0JCQkgICAgICAmZ2VuZXJhdGlvbnNbMV0udGhyZXNob2xkLAotCQkJICAgICAgJmdlbmVyYXRpb25zWzJdLnRocmVzaG9sZCkpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDI7IGkgPCBOVU1fR0VORVJBVElPTlM7IGkrKykgewotIAkJLyogZ2VuZXJhdGlvbnMgaGlnaGVyIHRoYW4gMiBnZXQgdGhlIHNhbWUgdGhyZXNob2xkICovCi0JCWdlbmVyYXRpb25zW2ldLnRocmVzaG9sZCA9IGdlbmVyYXRpb25zWzJdLnRocmVzaG9sZDsKLQl9CisgICAgaW50IGk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfGlpOnNldF90aHJlc2hvbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2VuZXJhdGlvbnNbMF0udGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2VuZXJhdGlvbnNbMV0udGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2VuZXJhdGlvbnNbMl0udGhyZXNob2xkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMjsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKSB7CisgICAgICAgIC8qIGdlbmVyYXRpb25zIGhpZ2hlciB0aGFuIDIgZ2V0IHRoZSBzYW1lIHRocmVzaG9sZCAqLworICAgICAgICBnZW5lcmF0aW9uc1tpXS50aHJlc2hvbGQgPSBnZW5lcmF0aW9uc1syXS50aHJlc2hvbGQ7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGdjX2dldF90aHJlc2hfX2RvY19fLApAQCAtMTA2OCwxMCArMTA2OCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX2dldF90aHJlc2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWkpIiwKLQkJCSAgICAgZ2VuZXJhdGlvbnNbMF0udGhyZXNob2xkLAotCQkJICAgICBnZW5lcmF0aW9uc1sxXS50aHJlc2hvbGQsCi0JCQkgICAgIGdlbmVyYXRpb25zWzJdLnRocmVzaG9sZCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihpaWkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbnNbMV0udGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zWzJdLnRocmVzaG9sZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19nZXRfY291bnRfX2RvY19fLApAQCAtMTA4MiwzOSArMTA4MiwzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX2dldF9jb3VudChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLAotCQkJICAgICBnZW5lcmF0aW9uc1swXS5jb3VudCwKLQkJCSAgICAgZ2VuZXJhdGlvbnNbMV0uY291bnQsCi0JCQkgICAgIGdlbmVyYXRpb25zWzJdLmNvdW50KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zWzBdLmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zWzFdLmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zWzJdLmNvdW50KTsKIH0KIAogc3RhdGljIGludAogcmVmZXJyZXJzdmlzaXQoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QgKm9ianMpCiB7Ci0JUHlfc3NpemVfdCBpOwotCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKG9ianMpOyBpKyspCi0JCWlmIChQeVR1cGxlX0dFVF9JVEVNKG9ianMsIGkpID09IG9iaikKLQkJCXJldHVybiAxOwotCXJldHVybiAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShvYmpzKTsgaSsrKQorICAgICAgICBpZiAoUHlUdXBsZV9HRVRfSVRFTShvYmpzLCBpKSA9PSBvYmopCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogZ2NfcmVmZXJyZXJzX2ZvcihQeU9iamVjdCAqb2JqcywgUHlHQ19IZWFkICpsaXN0LCBQeU9iamVjdCAqcmVzdWx0bGlzdCkKIHsKLQlQeUdDX0hlYWQgKmdjOwotCVB5T2JqZWN0ICpvYmo7Ci0JdHJhdmVyc2Vwcm9jIHRyYXZlcnNlOwotCWZvciAoZ2MgPSBsaXN0LT5nYy5nY19uZXh0OyBnYyAhPSBsaXN0OyBnYyA9IGdjLT5nYy5nY19uZXh0KSB7Ci0JCW9iaiA9IEZST01fR0MoZ2MpOwotCQl0cmF2ZXJzZSA9IFB5X1RZUEUob2JqKS0+dHBfdHJhdmVyc2U7Ci0JCWlmIChvYmogPT0gb2JqcyB8fCBvYmogPT0gcmVzdWx0bGlzdCkKLQkJCWNvbnRpbnVlOwotCQlpZiAodHJhdmVyc2Uob2JqLCAodmlzaXRwcm9jKXJlZmVycmVyc3Zpc2l0LCBvYmpzKSkgewotCQkJaWYgKFB5TGlzdF9BcHBlbmQocmVzdWx0bGlzdCwgb2JqKSA8IDApCi0JCQkJcmV0dXJuIDA7IC8qIGVycm9yICovCi0JCX0KLQl9Ci0JcmV0dXJuIDE7IC8qIG5vIGVycm9yICovCisgICAgUHlHQ19IZWFkICpnYzsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIHRyYXZlcnNlcHJvYyB0cmF2ZXJzZTsKKyAgICBmb3IgKGdjID0gbGlzdC0+Z2MuZ2NfbmV4dDsgZ2MgIT0gbGlzdDsgZ2MgPSBnYy0+Z2MuZ2NfbmV4dCkgeworICAgICAgICBvYmogPSBGUk9NX0dDKGdjKTsKKyAgICAgICAgdHJhdmVyc2UgPSBQeV9UWVBFKG9iaiktPnRwX3RyYXZlcnNlOworICAgICAgICBpZiAob2JqID09IG9ianMgfHwgb2JqID09IHJlc3VsdGxpc3QpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHRyYXZlcnNlKG9iaiwgKHZpc2l0cHJvYylyZWZlcnJlcnN2aXNpdCwgb2JqcykpIHsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHJlc3VsdGxpc3QsIG9iaikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOyAvKiBlcnJvciAqLworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOyAvKiBubyBlcnJvciAqLwogfQogCiBQeURvY19TVFJWQVIoZ2NfZ2V0X3JlZmVycmVyc19fZG9jX18sCkBAIC0xMTI0LDI0ICsxMTI0LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfZ2V0X3JlZmVycmVycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKCFyZXN1bHQpIHJldHVybiBOVUxMOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICghcmVzdWx0KSByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBOVU1fR0VORVJBVElPTlM7IGkrKykgewotCQlpZiAoIShnY19yZWZlcnJlcnNfZm9yKGFyZ3MsIEdFTl9IRUFEKGkpLCByZXN1bHQpKSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fR0VORVJBVElPTlM7IGkrKykgeworICAgICAgICBpZiAoIShnY19yZWZlcnJlcnNfZm9yKGFyZ3MsIEdFTl9IRUFEKGkpLCByZXN1bHQpKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBBcHBlbmQgb2JqIHRvIGxpc3Q7IHJldHVybiB0cnVlIGlmIGVycm9yIChvdXQgb2YgbWVtb3J5KSwgZmFsc2UgaWYgT0suICovCiBzdGF0aWMgaW50CiByZWZlcmVudHN2aXNpdChQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqbGlzdCkKIHsKLQlyZXR1cm4gUHlMaXN0X0FwcGVuZChsaXN0LCBvYmopIDwgMDsKKyAgICByZXR1cm4gUHlMaXN0X0FwcGVuZChsaXN0LCBvYmopIDwgMDsKIH0KIAogUHlEb2NfU1RSVkFSKGdjX2dldF9yZWZlcmVudHNfX2RvY19fLApAQCAtMTE1MSwyNyArMTE1MSwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdjX2dldF9yZWZlcmVudHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7CiAKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShhcmdzKTsgaSsrKSB7Ci0JCXRyYXZlcnNlcHJvYyB0cmF2ZXJzZTsKLQkJUHlPYmplY3QgKm9iaiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7IGkrKykgeworICAgICAgICB0cmF2ZXJzZXByb2MgdHJhdmVyc2U7CisgICAgICAgIFB5T2JqZWN0ICpvYmogPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwogCi0JCWlmICghIFB5T2JqZWN0X0lTX0dDKG9iaikpCi0JCQljb250aW51ZTsKLQkJdHJhdmVyc2UgPSBQeV9UWVBFKG9iaiktPnRwX3RyYXZlcnNlOwotCQlpZiAoISB0cmF2ZXJzZSkKLQkJCWNvbnRpbnVlOwotCQlpZiAodHJhdmVyc2Uob2JqLCAodmlzaXRwcm9jKXJlZmVyZW50c3Zpc2l0LCByZXN1bHQpKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgICAgIGlmICghIFB5T2JqZWN0X0lTX0dDKG9iaikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdHJhdmVyc2UgPSBQeV9UWVBFKG9iaiktPnRwX3RyYXZlcnNlOworICAgICAgICBpZiAoISB0cmF2ZXJzZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAodHJhdmVyc2Uob2JqLCAodmlzaXRwcm9jKXJlZmVyZW50c3Zpc2l0LCByZXN1bHQpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihnY19nZXRfb2JqZWN0c19fZG9jX18sCkBAIC0xMTgzLDE5ICsxMTgzLDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2NfZ2V0X29iamVjdHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JaW50IGk7Ci0JUHlPYmplY3QqIHJlc3VsdDsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCogcmVzdWx0OwogCi0JcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBOVU1fR0VORVJBVElPTlM7IGkrKykgewotCQlpZiAoYXBwZW5kX29iamVjdHMocmVzdWx0LCBHRU5fSEVBRChpKSkpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9HRU5FUkFUSU9OUzsgaSsrKSB7CisgICAgICAgIGlmIChhcHBlbmRfb2JqZWN0cyhyZXN1bHQsIEdFTl9IRUFEKGkpKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTEyMTYsNjYgKzEyMTYsNjYgQEAKICJnZXRfcmVmZXJlbnRzKCkgLS0gUmV0dXJuIHRoZSBsaXN0IG9mIG9iamVjdHMgdGhhdCBhbiBvYmplY3QgcmVmZXJzIHRvLlxuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBHY01ldGhvZHNbXSA9IHsKLQl7ImVuYWJsZSIsCSAgIGdjX2VuYWJsZSwJICBNRVRIX05PQVJHUywgIGdjX2VuYWJsZV9fZG9jX199LAotCXsiZGlzYWJsZSIsCSAgIGdjX2Rpc2FibGUsCSAgTUVUSF9OT0FSR1MsICBnY19kaXNhYmxlX19kb2NfX30sCi0JeyJpc2VuYWJsZWQiLAkgICBnY19pc2VuYWJsZWQsICBNRVRIX05PQVJHUywgIGdjX2lzZW5hYmxlZF9fZG9jX199LAotCXsic2V0X2RlYnVnIiwJICAgZ2Nfc2V0X2RlYnVnLCAgTUVUSF9WQVJBUkdTLCBnY19zZXRfZGVidWdfX2RvY19ffSwKLQl7ImdldF9kZWJ1ZyIsCSAgIGdjX2dldF9kZWJ1ZywgIE1FVEhfTk9BUkdTLCAgZ2NfZ2V0X2RlYnVnX19kb2NfX30sCi0JeyJnZXRfY291bnQiLAkgICBnY19nZXRfY291bnQsICBNRVRIX05PQVJHUywgIGdjX2dldF9jb3VudF9fZG9jX199LAotCXsic2V0X3RocmVzaG9sZCIsICBnY19zZXRfdGhyZXNoLCBNRVRIX1ZBUkFSR1MsIGdjX3NldF90aHJlc2hfX2RvY19ffSwKLQl7ImdldF90aHJlc2hvbGQiLCAgZ2NfZ2V0X3RocmVzaCwgTUVUSF9OT0FSR1MsICBnY19nZXRfdGhyZXNoX19kb2NfX30sCi0JeyJjb2xsZWN0IiwJICAgKFB5Q0Z1bmN0aW9uKWdjX2NvbGxlY3QsCi0gICAgICAgICAJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgICAgICAgICAgIGdjX2NvbGxlY3RfX2RvY19ffSwKLQl7ImdldF9vYmplY3RzIiwgICAgZ2NfZ2V0X29iamVjdHMsTUVUSF9OT0FSR1MsICBnY19nZXRfb2JqZWN0c19fZG9jX199LAotCXsiZ2V0X3JlZmVycmVycyIsICBnY19nZXRfcmVmZXJyZXJzLCBNRVRIX1ZBUkFSR1MsCi0JCWdjX2dldF9yZWZlcnJlcnNfX2RvY19ffSwKLQl7ImdldF9yZWZlcmVudHMiLCAgZ2NfZ2V0X3JlZmVyZW50cywgTUVUSF9WQVJBUkdTLAotCQlnY19nZXRfcmVmZXJlbnRzX19kb2NfX30sCi0Je05VTEwsCU5VTEx9CQkvKiBTZW50aW5lbCAqLworICAgIHsiZW5hYmxlIiwgICAgICAgICAgICAgZ2NfZW5hYmxlLCAgICAgTUVUSF9OT0FSR1MsICBnY19lbmFibGVfX2RvY19ffSwKKyAgICB7ImRpc2FibGUiLCAgICAgICAgICAgIGdjX2Rpc2FibGUsICAgIE1FVEhfTk9BUkdTLCAgZ2NfZGlzYWJsZV9fZG9jX199LAorICAgIHsiaXNlbmFibGVkIiwgICAgICAgICAgZ2NfaXNlbmFibGVkLCAgTUVUSF9OT0FSR1MsICBnY19pc2VuYWJsZWRfX2RvY19ffSwKKyAgICB7InNldF9kZWJ1ZyIsICAgICAgICAgIGdjX3NldF9kZWJ1ZywgIE1FVEhfVkFSQVJHUywgZ2Nfc2V0X2RlYnVnX19kb2NfX30sCisgICAgeyJnZXRfZGVidWciLCAgICAgICAgICBnY19nZXRfZGVidWcsICBNRVRIX05PQVJHUywgIGdjX2dldF9kZWJ1Z19fZG9jX199LAorICAgIHsiZ2V0X2NvdW50IiwgICAgICAgICAgZ2NfZ2V0X2NvdW50LCAgTUVUSF9OT0FSR1MsICBnY19nZXRfY291bnRfX2RvY19ffSwKKyAgICB7InNldF90aHJlc2hvbGQiLCAgZ2Nfc2V0X3RocmVzaCwgTUVUSF9WQVJBUkdTLCBnY19zZXRfdGhyZXNoX19kb2NfX30sCisgICAgeyJnZXRfdGhyZXNob2xkIiwgIGdjX2dldF90aHJlc2gsIE1FVEhfTk9BUkdTLCAgZ2NfZ2V0X3RocmVzaF9fZG9jX199LAorICAgIHsiY29sbGVjdCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWdjX2NvbGxlY3QsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgICAgICBnY19jb2xsZWN0X19kb2NfX30sCisgICAgeyJnZXRfb2JqZWN0cyIsICAgIGdjX2dldF9vYmplY3RzLE1FVEhfTk9BUkdTLCAgZ2NfZ2V0X29iamVjdHNfX2RvY19ffSwKKyAgICB7ImdldF9yZWZlcnJlcnMiLCAgZ2NfZ2V0X3JlZmVycmVycywgTUVUSF9WQVJBUkdTLAorICAgICAgICBnY19nZXRfcmVmZXJyZXJzX19kb2NfX30sCisgICAgeyJnZXRfcmVmZXJlbnRzIiwgIGdjX2dldF9yZWZlcmVudHMsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgZ2NfZ2V0X3JlZmVyZW50c19fZG9jX199LAorICAgIHtOVUxMLCAgICAgIE5VTEx9ICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRnYyh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJnYyIsCi0JCQkgICAgICBHY01ldGhvZHMsCi0JCQkgICAgICBnY19fZG9jX18sCi0JCQkgICAgICBOVUxMLAotCQkJICAgICAgUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJnYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdjTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NfX2RvY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWlmIChnYXJiYWdlID09IE5VTEwpIHsKLQkJZ2FyYmFnZSA9IFB5TGlzdF9OZXcoMCk7Ci0JCWlmIChnYXJiYWdlID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfQotCVB5X0lOQ1JFRihnYXJiYWdlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJnYXJiYWdlIiwgZ2FyYmFnZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKGdhcmJhZ2UgPT0gTlVMTCkgeworICAgICAgICBnYXJiYWdlID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgaWYgKGdhcmJhZ2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUHlfSU5DUkVGKGdhcmJhZ2UpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgImdhcmJhZ2UiLCBnYXJiYWdlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIEltcG9ydGluZyBjYW4ndCBiZSBkb25lIGluIGNvbGxlY3QoKSBiZWNhdXNlIGNvbGxlY3QoKQotCSAqIGNhbiBiZSBjYWxsZWQgdmlhIFB5R0NfQ29sbGVjdCgpIGluIFB5X0ZpbmFsaXplKCkuCi0JICogVGhpcyB3b3VsZG4ndCBiZSBhIHByb2JsZW0sIGV4Y2VwdCB0aGF0IDxpbml0aWFsaXplZD4gaXMKLQkgKiByZXNldCB0byAwIGJlZm9yZSBjYWxsaW5nIGNvbGxlY3Qgd2hpY2ggdHJpcHMgdXAKLQkgKiB0aGUgaW1wb3J0IGFuZCB0cmlnZ2VycyBhbiBhc3NlcnRpb24uCi0JICovCi0JaWYgKHRtb2QgPT0gTlVMTCkgewotCQl0bW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOwotCQlpZiAodG1vZCA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9CisgICAgLyogSW1wb3J0aW5nIGNhbid0IGJlIGRvbmUgaW4gY29sbGVjdCgpIGJlY2F1c2UgY29sbGVjdCgpCisgICAgICogY2FuIGJlIGNhbGxlZCB2aWEgUHlHQ19Db2xsZWN0KCkgaW4gUHlfRmluYWxpemUoKS4KKyAgICAgKiBUaGlzIHdvdWxkbid0IGJlIGEgcHJvYmxlbSwgZXhjZXB0IHRoYXQgPGluaXRpYWxpemVkPiBpcworICAgICAqIHJlc2V0IHRvIDAgYmVmb3JlIGNhbGxpbmcgY29sbGVjdCB3aGljaCB0cmlwcyB1cAorICAgICAqIHRoZSBpbXBvcnQgYW5kIHRyaWdnZXJzIGFuIGFzc2VydGlvbi4KKyAgICAgKi8KKyAgICBpZiAodG1vZCA9PSBOVUxMKSB7CisgICAgICAgIHRtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ0aW1lIik7CisgICAgICAgIGlmICh0bW9kID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KIAogI2RlZmluZSBBRERfSU5UKE5BTUUpIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAjTkFNRSwgTkFNRSkgPCAwKSByZXR1cm4KLQlBRERfSU5UKERFQlVHX1NUQVRTKTsKLQlBRERfSU5UKERFQlVHX0NPTExFQ1RBQkxFKTsKLQlBRERfSU5UKERFQlVHX1VOQ09MTEVDVEFCTEUpOwotCUFERF9JTlQoREVCVUdfSU5TVEFOQ0VTKTsKLQlBRERfSU5UKERFQlVHX09CSkVDVFMpOwotCUFERF9JTlQoREVCVUdfU0FWRUFMTCk7Ci0JQUREX0lOVChERUJVR19MRUFLKTsKKyAgICBBRERfSU5UKERFQlVHX1NUQVRTKTsKKyAgICBBRERfSU5UKERFQlVHX0NPTExFQ1RBQkxFKTsKKyAgICBBRERfSU5UKERFQlVHX1VOQ09MTEVDVEFCTEUpOworICAgIEFERF9JTlQoREVCVUdfSU5TVEFOQ0VTKTsKKyAgICBBRERfSU5UKERFQlVHX09CSkVDVFMpOworICAgIEFERF9JTlQoREVCVUdfU0FWRUFMTCk7CisgICAgQUREX0lOVChERUJVR19MRUFLKTsKICN1bmRlZiBBRERfSU5UCiB9CiAKQEAgLTEyODMsMjQgKzEyODMsMjQgQEAKIFB5X3NzaXplX3QKIFB5R0NfQ29sbGVjdCh2b2lkKQogewotCVB5X3NzaXplX3QgbjsKKyAgICBQeV9zc2l6ZV90IG47CiAKLQlpZiAoY29sbGVjdGluZykKLQkJbiA9IDA7IC8qIGFscmVhZHkgY29sbGVjdGluZywgZG9uJ3QgZG8gYW55dGhpbmcgKi8KLQllbHNlIHsKLQkJY29sbGVjdGluZyA9IDE7Ci0JCW4gPSBjb2xsZWN0KE5VTV9HRU5FUkFUSU9OUyAtIDEpOwotCQljb2xsZWN0aW5nID0gMDsKLQl9CisgICAgaWYgKGNvbGxlY3RpbmcpCisgICAgICAgIG4gPSAwOyAvKiBhbHJlYWR5IGNvbGxlY3RpbmcsIGRvbid0IGRvIGFueXRoaW5nICovCisgICAgZWxzZSB7CisgICAgICAgIGNvbGxlY3RpbmcgPSAxOworICAgICAgICBuID0gY29sbGVjdChOVU1fR0VORVJBVElPTlMgLSAxKTsKKyAgICAgICAgY29sbGVjdGluZyA9IDA7CisgICAgfQogCi0JcmV0dXJuIG47CisgICAgcmV0dXJuIG47CiB9CiAKIC8qIGZvciBkZWJ1Z2dpbmcgKi8KIHZvaWQKIF9QeUdDX0R1bXAoUHlHQ19IZWFkICpnKQogewotCV9QeU9iamVjdF9EdW1wKEZST01fR0MoZykpOworICAgIF9QeU9iamVjdF9EdW1wKEZST01fR0MoZykpOwogfQogCiAvKiBleHRlbnNpb24gbW9kdWxlcyBtaWdodCBiZSBjb21waWxlZCB3aXRoIEdDIHN1cHBvcnQgc28gdGhlc2UKQEAgLTEzMTQsNyArMTMxNCw3IEBACiB2b2lkCiBQeU9iamVjdF9HQ19UcmFjayh2b2lkICpvcCkKIHsKLQlfUHlPYmplY3RfR0NfVFJBQ0sob3ApOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CiB9CiAKIC8qIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLwpAQCAtMTMyNywxMSArMTMyNywxMSBAQAogdm9pZAogUHlPYmplY3RfR0NfVW5UcmFjayh2b2lkICpvcCkKIHsKLQkvKiBPYnNjdXJlOiAgdGhlIFB5X1RSQVNIQ0FOIG1lY2hhbmlzbSByZXF1aXJlcyB0aGF0IHdlIGJlIGFibGUgdG8KLQkgKiBjYWxsIFB5T2JqZWN0X0dDX1VuVHJhY2sgdHdpY2Ugb24gYW4gb2JqZWN0LgotCSAqLwotCWlmIChJU19UUkFDS0VEKG9wKSkKLQkJX1B5T2JqZWN0X0dDX1VOVFJBQ0sob3ApOworICAgIC8qIE9ic2N1cmU6ICB0aGUgUHlfVFJBU0hDQU4gbWVjaGFuaXNtIHJlcXVpcmVzIHRoYXQgd2UgYmUgYWJsZSB0bworICAgICAqIGNhbGwgUHlPYmplY3RfR0NfVW5UcmFjayB0d2ljZSBvbiBhbiBvYmplY3QuCisgICAgICovCisgICAgaWYgKElTX1RSQUNLRUQob3ApKQorICAgICAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhvcCk7CiB9CiAKIC8qIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLwpAQCAtMTM0NCw3MyArMTM0NCw3MyBAQAogUHlPYmplY3QgKgogX1B5T2JqZWN0X0dDX01hbGxvYyhzaXplX3QgYmFzaWNzaXplKQogewotCVB5T2JqZWN0ICpvcDsKLQlQeUdDX0hlYWQgKmc7Ci0JaWYgKGJhc2ljc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5R0NfSGVhZCkpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfTUFMTE9DKAotICAgICAgICAgICAgICAgIHNpemVvZihQeUdDX0hlYWQpICsgYmFzaWNzaXplKTsKLQlpZiAoZyA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlnLT5nYy5nY19yZWZzID0gR0NfVU5UUkFDS0VEOwotCWdlbmVyYXRpb25zWzBdLmNvdW50Kys7IC8qIG51bWJlciBvZiBhbGxvY2F0ZWQgR0Mgb2JqZWN0cyAqLwotIAlpZiAoZ2VuZXJhdGlvbnNbMF0uY291bnQgPiBnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQgJiYKLSAJICAgIGVuYWJsZWQgJiYKLSAJICAgIGdlbmVyYXRpb25zWzBdLnRocmVzaG9sZCAmJgotIAkgICAgIWNvbGxlY3RpbmcgJiYKLSAJICAgICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWNvbGxlY3RpbmcgPSAxOwotCQljb2xsZWN0X2dlbmVyYXRpb25zKCk7Ci0JCWNvbGxlY3RpbmcgPSAwOwotCX0KLQlvcCA9IEZST01fR0MoZyk7Ci0JcmV0dXJuIG9wOworICAgIFB5T2JqZWN0ICpvcDsKKyAgICBQeUdDX0hlYWQgKmc7CisgICAgaWYgKGJhc2ljc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5R0NfSGVhZCkpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfTUFMTE9DKAorICAgICAgICBzaXplb2YoUHlHQ19IZWFkKSArIGJhc2ljc2l6ZSk7CisgICAgaWYgKGcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgZy0+Z2MuZ2NfcmVmcyA9IEdDX1VOVFJBQ0tFRDsKKyAgICBnZW5lcmF0aW9uc1swXS5jb3VudCsrOyAvKiBudW1iZXIgb2YgYWxsb2NhdGVkIEdDIG9iamVjdHMgKi8KKyAgICBpZiAoZ2VuZXJhdGlvbnNbMF0uY291bnQgPiBnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQgJiYKKyAgICAgICAgZW5hYmxlZCAmJgorICAgICAgICBnZW5lcmF0aW9uc1swXS50aHJlc2hvbGQgJiYKKyAgICAgICAgIWNvbGxlY3RpbmcgJiYKKyAgICAgICAgIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgY29sbGVjdGluZyA9IDE7CisgICAgICAgIGNvbGxlY3RfZ2VuZXJhdGlvbnMoKTsKKyAgICAgICAgY29sbGVjdGluZyA9IDA7CisgICAgfQorICAgIG9wID0gRlJPTV9HQyhnKTsKKyAgICByZXR1cm4gb3A7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9HQ19OZXcoUHlUeXBlT2JqZWN0ICp0cCkKIHsKLQlQeU9iamVjdCAqb3AgPSBfUHlPYmplY3RfR0NfTWFsbG9jKF9QeU9iamVjdF9TSVpFKHRwKSk7Ci0JaWYgKG9wICE9IE5VTEwpCi0JCW9wID0gUHlPYmplY3RfSU5JVChvcCwgdHApOwotCXJldHVybiBvcDsKKyAgICBQeU9iamVjdCAqb3AgPSBfUHlPYmplY3RfR0NfTWFsbG9jKF9QeU9iamVjdF9TSVpFKHRwKSk7CisgICAgaWYgKG9wICE9IE5VTEwpCisgICAgICAgIG9wID0gUHlPYmplY3RfSU5JVChvcCwgdHApOworICAgIHJldHVybiBvcDsKIH0KIAogUHlWYXJPYmplY3QgKgogX1B5T2JqZWN0X0dDX05ld1ZhcihQeVR5cGVPYmplY3QgKnRwLCBQeV9zc2l6ZV90IG5pdGVtcykKIHsKLQljb25zdCBzaXplX3Qgc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0cCwgbml0ZW1zKTsKLQlQeVZhck9iamVjdCAqb3AgPSAoUHlWYXJPYmplY3QgKikgX1B5T2JqZWN0X0dDX01hbGxvYyhzaXplKTsKLQlpZiAob3AgIT0gTlVMTCkKLQkJb3AgPSBQeU9iamVjdF9JTklUX1ZBUihvcCwgdHAsIG5pdGVtcyk7Ci0JcmV0dXJuIG9wOworICAgIGNvbnN0IHNpemVfdCBzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHRwLCBuaXRlbXMpOworICAgIFB5VmFyT2JqZWN0ICpvcCA9IChQeVZhck9iamVjdCAqKSBfUHlPYmplY3RfR0NfTWFsbG9jKHNpemUpOworICAgIGlmIChvcCAhPSBOVUxMKQorICAgICAgICBvcCA9IFB5T2JqZWN0X0lOSVRfVkFSKG9wLCB0cCwgbml0ZW1zKTsKKyAgICByZXR1cm4gb3A7CiB9CiAKIFB5VmFyT2JqZWN0ICoKIF9QeU9iamVjdF9HQ19SZXNpemUoUHlWYXJPYmplY3QgKm9wLCBQeV9zc2l6ZV90IG5pdGVtcykKIHsKLQljb25zdCBzaXplX3QgYmFzaWNzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKFB5X1RZUEUob3ApLCBuaXRlbXMpOwotCVB5R0NfSGVhZCAqZyA9IEFTX0dDKG9wKTsKLQlpZiAoYmFzaWNzaXplID4gUFlfU1NJWkVfVF9NQVggLSBzaXplb2YoUHlHQ19IZWFkKSkKLQkJcmV0dXJuIChQeVZhck9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7Ci0JZyA9IChQeUdDX0hlYWQgKilQeU9iamVjdF9SRUFMTE9DKGcsICBzaXplb2YoUHlHQ19IZWFkKSArIGJhc2ljc2l6ZSk7Ci0JaWYgKGcgPT0gTlVMTCkKLQkJcmV0dXJuIChQeVZhck9iamVjdCAqKVB5RXJyX05vTWVtb3J5KCk7Ci0Jb3AgPSAoUHlWYXJPYmplY3QgKikgRlJPTV9HQyhnKTsKLQlQeV9TSVpFKG9wKSA9IG5pdGVtczsKLQlyZXR1cm4gb3A7CisgICAgY29uc3Qgc2l6ZV90IGJhc2ljc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRShQeV9UWVBFKG9wKSwgbml0ZW1zKTsKKyAgICBQeUdDX0hlYWQgKmcgPSBBU19HQyhvcCk7CisgICAgaWYgKGJhc2ljc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5R0NfSGVhZCkpCisgICAgICAgIHJldHVybiAoUHlWYXJPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOworICAgIGcgPSAoUHlHQ19IZWFkICopUHlPYmplY3RfUkVBTExPQyhnLCAgc2l6ZW9mKFB5R0NfSGVhZCkgKyBiYXNpY3NpemUpOworICAgIGlmIChnID09IE5VTEwpCisgICAgICAgIHJldHVybiAoUHlWYXJPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOworICAgIG9wID0gKFB5VmFyT2JqZWN0ICopIEZST01fR0MoZyk7CisgICAgUHlfU0laRShvcCkgPSBuaXRlbXM7CisgICAgcmV0dXJuIG9wOwogfQogCiB2b2lkCiBQeU9iamVjdF9HQ19EZWwodm9pZCAqb3ApCiB7Ci0JUHlHQ19IZWFkICpnID0gQVNfR0Mob3ApOwotCWlmIChJU19UUkFDS0VEKG9wKSkKLQkJZ2NfbGlzdF9yZW1vdmUoZyk7Ci0JaWYgKGdlbmVyYXRpb25zWzBdLmNvdW50ID4gMCkgewotCQlnZW5lcmF0aW9uc1swXS5jb3VudC0tOwotCX0KLQlQeU9iamVjdF9GUkVFKGcpOworICAgIFB5R0NfSGVhZCAqZyA9IEFTX0dDKG9wKTsKKyAgICBpZiAoSVNfVFJBQ0tFRChvcCkpCisgICAgICAgIGdjX2xpc3RfcmVtb3ZlKGcpOworICAgIGlmIChnZW5lcmF0aW9uc1swXS5jb3VudCA+IDApIHsKKyAgICAgICAgZ2VuZXJhdGlvbnNbMF0uY291bnQtLTsKKyAgICB9CisgICAgUHlPYmplY3RfRlJFRShnKTsKIH0KIAogLyogZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggMi4yICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldGFkZHJpbmZvLmMgYi9Nb2R1bGVzL2dldGFkZHJpbmZvLmMKaW5kZXggNGQxOWMzNC4uMWQwYmZiYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRhZGRyaW5mby5jCisrKyBiL01vZHVsZXMvZ2V0YWRkcmluZm8uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKKyAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICogYXJlIG1ldDoKQEAgLTEzLDcgKzEzLDcgQEAKICAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCisgKgogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICAqIEdBSV9BTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCkBAIC03Myw1MiArNzMsNTIgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgaW5fYWRkcmFueVtdID0geyAwLCAwLCAwLCAwIH07CiBzdGF0aWMgY29uc3QgY2hhciBpbjZfYWRkcmFueVtdID0gewotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCiB9Owotc3RhdGljIGNvbnN0IGNoYXIgaW5fbG9vcGJhY2tbXSA9IHsgMTI3LCAwLCAwLCAxIH07IAorc3RhdGljIGNvbnN0IGNoYXIgaW5fbG9vcGJhY2tbXSA9IHsgMTI3LCAwLCAwLCAxIH07CiBzdGF0aWMgY29uc3QgY2hhciBpbjZfbG9vcGJhY2tbXSA9IHsKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMQogfTsKIAogc3RydWN0IHNvY2tpbmV0IHsKLQl1X2NoYXIJc2lfbGVuOwotCXVfY2hhcglzaV9mYW1pbHk7Ci0JdV9zaG9ydAlzaV9wb3J0OworICAgIHVfY2hhciAgICAgIHNpX2xlbjsKKyAgICB1X2NoYXIgICAgICBzaV9mYW1pbHk7CisgICAgdV9zaG9ydCAgICAgc2lfcG9ydDsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZ2FpX2FmZCB7Ci0JaW50IGFfYWY7Ci0JaW50IGFfYWRkcmxlbjsKLQlpbnQgYV9zb2NrbGVuOwotCWludCBhX29mZjsKLQljb25zdCBjaGFyICphX2FkZHJhbnk7Ci0JY29uc3QgY2hhciAqYV9sb29wYmFjazsJCisgICAgaW50IGFfYWY7CisgICAgaW50IGFfYWRkcmxlbjsKKyAgICBpbnQgYV9zb2NrbGVuOworICAgIGludCBhX29mZjsKKyAgICBjb25zdCBjaGFyICphX2FkZHJhbnk7CisgICAgY29uc3QgY2hhciAqYV9sb29wYmFjazsKIH0gZ2FpX2FmZGwgW10gPSB7CiAjaWZkZWYgRU5BQkxFX0lQVjYKICNkZWZpbmUgTl9JTkVUNiAwCi0Je1BGX0lORVQ2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKLQkgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLAotCSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW42LCBzaW42X2FkZHIpLAotCSBpbjZfYWRkcmFueSwgaW42X2xvb3BiYWNrfSwKKyAgICB7UEZfSU5FVDYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAorICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNiksCisgICAgIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbjYsIHNpbjZfYWRkciksCisgICAgIGluNl9hZGRyYW55LCBpbjZfbG9vcGJhY2t9LAogI2RlZmluZSBOX0lORVQgIDEKICNlbHNlCiAjZGVmaW5lIE5fSU5FVCAgMAogI2VuZGlmCi0Je1BGX0lORVQsIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksCi0JIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLAotCSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW4sIHNpbl9hZGRyKSwKLQkgaW5fYWRkcmFueSwgaW5fbG9vcGJhY2t9LAotCXswLCAwLCAwLCAwLCBOVUxMLCBOVUxMfSwKKyAgICB7UEZfSU5FVCwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwKKyAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksCisgICAgIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbiwgc2luX2FkZHIpLAorICAgICBpbl9hZGRyYW55LCBpbl9sb29wYmFja30sCisgICAgezAsIDAsIDAsIDAsIE5VTEwsIE5VTEx9LAogfTsKIAogI2lmZGVmIEVOQUJMRV9JUFY2Ci0jZGVmaW5lIFBUT05fTUFYCTE2CisjZGVmaW5lIFBUT05fTUFYICAgICAgICAxNgogI2Vsc2UKLSNkZWZpbmUgUFRPTl9NQVgJNAorI2RlZmluZSBQVE9OX01BWCAgICAgICAgNAogI2VuZGlmCiAKICNpZm5kZWYgSU5fTVVMVElDQVNUCi0jZGVmaW5lIElOX01VTFRJQ0FTVChpKQkgICAgKCgoaSkgJiAweGYwMDAwMDAwVSkgPT0gMHhlMDAwMDAwMFUpCisjZGVmaW5lIElOX01VTFRJQ0FTVChpKSAgICAgKCgoaSkgJiAweGYwMDAwMDAwVSkgPT0gMHhlMDAwMDAwMFUpCiAjZW5kaWYKIAogI2lmbmRlZiBJTl9FWFBFUklNRU5UQUwKQEAgLTEyNiw3MyArMTI2LDczIEBACiAjZW5kaWYKIAogI2lmbmRlZiBJTl9MT09QQkFDS05FVAotI2RlZmluZSBJTl9MT09QQkFDS05FVAkgICAgMTI3CisjZGVmaW5lIElOX0xPT1BCQUNLTkVUICAgICAgMTI3CiAjZW5kaWYKIAogc3RhdGljIGludCBnZXRfbmFtZSBQeV9QUk9UTygoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZ2FpX2FmZCAqLAotCQkJICBzdHJ1Y3QgYWRkcmluZm8gKiosIGNoYXIgKiwgc3RydWN0IGFkZHJpbmZvICosCi0JCQkgIGludCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWRkcmluZm8gKiosIGNoYXIgKiwgc3RydWN0IGFkZHJpbmZvICosCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCkpOwogc3RhdGljIGludCBnZXRfYWRkciBQeV9QUk9UTygoY29uc3QgY2hhciAqLCBpbnQsIHN0cnVjdCBhZGRyaW5mbyAqKiwKLQkJCXN0cnVjdCBhZGRyaW5mbyAqLCBpbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhZGRyaW5mbyAqLCBpbnQpKTsKIHN0YXRpYyBpbnQgc3RyX2lzbnVtYmVyIFB5X1BST1RPKChjb25zdCBjaGFyICopKTsKLQkKKwogc3RhdGljIGNoYXIgKmFpX2Vycmxpc3RbXSA9IHsKLQkic3VjY2Vzcy4iLAotCSJhZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZC4iLAkvKiBFQUlfQUREUkZBTUlMWSAqLwotCSJ0ZW1wb3JhcnkgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24uIiwJLyogRUFJX0FHQUlOICAgICAgKi8KLQkiaW52YWxpZCB2YWx1ZSBmb3IgYWlfZmxhZ3MuIiwJCSAgICAgICAJLyogRUFJX0JBREZMQUdTICAgKi8KLQkibm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsIAkvKiBFQUlfRkFJTCAgICAgICAqLwotCSJhaV9mYW1pbHkgbm90IHN1cHBvcnRlZC4iLAkJCS8qIEVBSV9GQU1JTFkgICAgICovCi0JIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuIiwgCQkJLyogRUFJX01FTU9SWSAgICAgKi8KLQkibm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaG9zdG5hbWUuIiwgCS8qIEVBSV9OT0RBVEEgICAgICovCi0JImhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duLiIsLyogRUFJX05PTkFNRSAgICAgKi8KLQkic2Vydm5hbWUgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUuIiwJLyogRUFJX1NFUlZJQ0UgICAgKi8KLQkiYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZC4iLCAJCQkvKiBFQUlfU09DS1RZUEUgICAqLwotCSJzeXN0ZW0gZXJyb3IgcmV0dXJuZWQgaW4gZXJybm8uIiwgCQkvKiBFQUlfU1lTVEVNICAgICAqLwotCSJpbnZhbGlkIHZhbHVlIGZvciBoaW50cy4iLAkJCS8qIEVBSV9CQURISU5UUwkgICovCi0JInJlc29sdmVkIHByb3RvY29sIGlzIHVua25vd24uIiwJCS8qIEVBSV9QUk9UT0NPTCAgICovCi0JInVua25vd24gZXJyb3IuIiwgCQkJCS8qIEVBSV9NQVggICAgICAgICovCisgICAgInN1Y2Nlc3MuIiwKKyAgICAiYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQuIiwgICAgICAgLyogRUFJX0FERFJGQU1JTFkgKi8KKyAgICAidGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsICAgICAgICAgICAgLyogRUFJX0FHQUlOICAgICAgKi8KKyAgICAiaW52YWxpZCB2YWx1ZSBmb3IgYWlfZmxhZ3MuIiwgICAgICAgICAgICAgICAgICAgICAgLyogRUFJX0JBREZMQUdTICAgKi8KKyAgICAibm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsICAgICAgLyogRUFJX0ZBSUwgICAgICAgKi8KKyAgICAiYWlfZmFtaWx5IG5vdCBzdXBwb3J0ZWQuIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRUFJX0ZBTUlMWSAgICAgKi8KKyAgICAibWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4iLCAgICAgICAgICAgICAgICAgICAgICAgLyogRUFJX01FTU9SWSAgICAgKi8KKyAgICAibm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaG9zdG5hbWUuIiwgICAgICAgICAgICAgLyogRUFJX05PREFUQSAgICAgKi8KKyAgICAiaG9zdG5hbWUgbm9yIHNlcnZuYW1lIHByb3ZpZGVkLCBvciBub3Qga25vd24uIiwvKiBFQUlfTk9OQU1FICAgICAqLworICAgICJzZXJ2bmFtZSBub3Qgc3VwcG9ydGVkIGZvciBhaV9zb2NrdHlwZS4iLCAgICAgICAgICAvKiBFQUlfU0VSVklDRSAgICAqLworICAgICJhaV9zb2NrdHlwZSBub3Qgc3VwcG9ydGVkLiIsICAgICAgICAgICAgICAgICAgICAgICAvKiBFQUlfU09DS1RZUEUgICAqLworICAgICJzeXN0ZW0gZXJyb3IgcmV0dXJuZWQgaW4gZXJybm8uIiwgICAgICAgICAgICAgICAgICAvKiBFQUlfU1lTVEVNICAgICAqLworICAgICJpbnZhbGlkIHZhbHVlIGZvciBoaW50cy4iLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFQUlfQkFESElOVFMgICAqLworICAgICJyZXNvbHZlZCBwcm90b2NvbCBpcyB1bmtub3duLiIsICAgICAgICAgICAgICAgICAgICAvKiBFQUlfUFJPVE9DT0wgICAqLworICAgICJ1bmtub3duIGVycm9yLiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFQUlfTUFYICAgICAgICAqLwogfTsKIAogI2RlZmluZSBHRVRfQ0FOT05OQU1FKGFpLCBzdHIpIFwKIGlmIChwYWktPmFpX2ZsYWdzICYgQUlfQ0FOT05OQU1FKSB7XAotCWlmICgoKGFpKS0+YWlfY2Fub25uYW1lID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHN0cikgKyAxKSkgIT0gTlVMTCkge1wKLQkJc3RyY3B5KChhaSktPmFpX2Nhbm9ubmFtZSwgKHN0cikpO1wKLQl9IGVsc2Uge1wKLQkJZXJyb3IgPSBFQUlfTUVNT1JZO1wKLQkJZ290byBmcmVlO1wKLQl9XAorICAgIGlmICgoKGFpKS0+YWlfY2Fub25uYW1lID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKHN0cikgKyAxKSkgIT0gTlVMTCkge1wKKyAgICAgICAgc3RyY3B5KChhaSktPmFpX2Nhbm9ubmFtZSwgKHN0cikpO1wKKyAgICB9IGVsc2Uge1wKKyAgICAgICAgZXJyb3IgPSBFQUlfTUVNT1JZO1wKKyAgICAgICAgZ290byBmcmVlO1wKKyAgICB9XAogfQogCiAjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KICNkZWZpbmUgR0VUX0FJKGFpLCBnYWlfYWZkLCBhZGRyLCBwb3J0KSB7XAotCWNoYXIgKnA7XAotCWlmICgoKGFpKSA9IChzdHJ1Y3QgYWRkcmluZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykgK1wKLQkJCQkJICAgICAgKChnYWlfYWZkKS0+YV9zb2NrbGVuKSkpXAotCSAgICA9PSBOVUxMKSBnb3RvIGZyZWU7XAotCW1lbWNweShhaSwgcGFpLCBzaXplb2Yoc3RydWN0IGFkZHJpbmZvKSk7XAotCShhaSktPmFpX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopKChhaSkgKyAxKTtcCi0JbWVtc2V0KChhaSktPmFpX2FkZHIsIDAsIChnYWlfYWZkKS0+YV9zb2NrbGVuKTtcCi0JKGFpKS0+YWlfYWRkci0+c2FfbGVuID0gKGFpKS0+YWlfYWRkcmxlbiA9IChnYWlfYWZkKS0+YV9zb2NrbGVuO1wKLQkoYWkpLT5haV9hZGRyLT5zYV9mYW1pbHkgPSAoYWkpLT5haV9mYW1pbHkgPSAoZ2FpX2FmZCktPmFfYWY7XAotCSgoc3RydWN0IHNvY2tpbmV0ICopKGFpKS0+YWlfYWRkciktPnNpX3BvcnQgPSBwb3J0O1wKLQlwID0gKGNoYXIgKikoKGFpKS0+YWlfYWRkcik7XAotCW1lbWNweShwICsgKGdhaV9hZmQpLT5hX29mZiwgKGFkZHIpLCAoZ2FpX2FmZCktPmFfYWRkcmxlbik7XAorICAgIGNoYXIgKnA7XAorICAgIGlmICgoKGFpKSA9IChzdHJ1Y3QgYWRkcmluZm8gKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykgK1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZ2FpX2FmZCktPmFfc29ja2xlbikpKVwKKyAgICAgICAgPT0gTlVMTCkgZ290byBmcmVlO1wKKyAgICBtZW1jcHkoYWksIHBhaSwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpO1wKKyAgICAoYWkpLT5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSgoYWkpICsgMSk7XAorICAgIG1lbXNldCgoYWkpLT5haV9hZGRyLCAwLCAoZ2FpX2FmZCktPmFfc29ja2xlbik7XAorICAgIChhaSktPmFpX2FkZHItPnNhX2xlbiA9IChhaSktPmFpX2FkZHJsZW4gPSAoZ2FpX2FmZCktPmFfc29ja2xlbjtcCisgICAgKGFpKS0+YWlfYWRkci0+c2FfZmFtaWx5ID0gKGFpKS0+YWlfZmFtaWx5ID0gKGdhaV9hZmQpLT5hX2FmO1wKKyAgICAoKHN0cnVjdCBzb2NraW5ldCAqKShhaSktPmFpX2FkZHIpLT5zaV9wb3J0ID0gcG9ydDtcCisgICAgcCA9IChjaGFyICopKChhaSktPmFpX2FkZHIpO1wKKyAgICBtZW1jcHkocCArIChnYWlfYWZkKS0+YV9vZmYsIChhZGRyKSwgKGdhaV9hZmQpLT5hX2FkZHJsZW4pO1wKIH0KICNlbHNlCiAjZGVmaW5lIEdFVF9BSShhaSwgZ2FpX2FmZCwgYWRkciwgcG9ydCkge1wKLQljaGFyICpwO1wKLQlpZiAoKChhaSkgPSAoc3RydWN0IGFkZHJpbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pICtcCi0JCQkJCSAgICAgICgoZ2FpX2FmZCktPmFfc29ja2xlbikpKVwKLQkgICAgPT0gTlVMTCkgZ290byBmcmVlO1wKLQltZW1jcHkoYWksIHBhaSwgc2l6ZW9mKHN0cnVjdCBhZGRyaW5mbykpO1wKLQkoYWkpLT5haV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKSgoYWkpICsgMSk7XAotCW1lbXNldCgoYWkpLT5haV9hZGRyLCAwLCAoZ2FpX2FmZCktPmFfc29ja2xlbik7XAotCShhaSktPmFpX2FkZHJsZW4gPSAoZ2FpX2FmZCktPmFfc29ja2xlbjtcCi0JKGFpKS0+YWlfYWRkci0+c2FfZmFtaWx5ID0gKGFpKS0+YWlfZmFtaWx5ID0gKGdhaV9hZmQpLT5hX2FmO1wKLQkoKHN0cnVjdCBzb2NraW5ldCAqKShhaSktPmFpX2FkZHIpLT5zaV9wb3J0ID0gcG9ydDtcCi0JcCA9IChjaGFyICopKChhaSktPmFpX2FkZHIpO1wKLQltZW1jcHkocCArIChnYWlfYWZkKS0+YV9vZmYsIChhZGRyKSwgKGdhaV9hZmQpLT5hX2FkZHJsZW4pO1wKKyAgICBjaGFyICpwO1wKKyAgICBpZiAoKChhaSkgPSAoc3RydWN0IGFkZHJpbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pICtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdhaV9hZmQpLT5hX3NvY2tsZW4pKSlcCisgICAgICAgID09IE5VTEwpIGdvdG8gZnJlZTtcCisgICAgbWVtY3B5KGFpLCBwYWksIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTtcCisgICAgKGFpKS0+YWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikoKGFpKSArIDEpO1wKKyAgICBtZW1zZXQoKGFpKS0+YWlfYWRkciwgMCwgKGdhaV9hZmQpLT5hX3NvY2tsZW4pO1wKKyAgICAoYWkpLT5haV9hZGRybGVuID0gKGdhaV9hZmQpLT5hX3NvY2tsZW47XAorICAgIChhaSktPmFpX2FkZHItPnNhX2ZhbWlseSA9IChhaSktPmFpX2ZhbWlseSA9IChnYWlfYWZkKS0+YV9hZjtcCisgICAgKChzdHJ1Y3Qgc29ja2luZXQgKikoYWkpLT5haV9hZGRyKS0+c2lfcG9ydCA9IHBvcnQ7XAorICAgIHAgPSAoY2hhciAqKSgoYWkpLT5haV9hZGRyKTtcCisgICAgbWVtY3B5KHAgKyAoZ2FpX2FmZCktPmFfb2ZmLCAoYWRkciksIChnYWlfYWZkKS0+YV9hZGRybGVuKTtcCiB9CiAjZW5kaWYKIApAQCAtMjAxLDQzOCArMjAxLDQzOCBAQAogY2hhciAqCiBnYWlfc3RyZXJyb3IoaW50IGVjb2RlKQogewotCWlmIChlY29kZSA8IDAgfHwgZWNvZGUgPiBFQUlfTUFYKQotCQllY29kZSA9IEVBSV9NQVg7Ci0JcmV0dXJuIGFpX2Vycmxpc3RbZWNvZGVdOworICAgIGlmIChlY29kZSA8IDAgfHwgZWNvZGUgPiBFQUlfTUFYKQorICAgICAgICBlY29kZSA9IEVBSV9NQVg7CisgICAgcmV0dXJuIGFpX2Vycmxpc3RbZWNvZGVdOwogfQogCiB2b2lkCiBmcmVlYWRkcmluZm8oc3RydWN0IGFkZHJpbmZvICphaSkKIHsKLQlzdHJ1Y3QgYWRkcmluZm8gKm5leHQ7CisgICAgc3RydWN0IGFkZHJpbmZvICpuZXh0OwogCi0JZG8gewotCQluZXh0ID0gYWktPmFpX25leHQ7Ci0JCWlmIChhaS0+YWlfY2Fub25uYW1lKQotCQkJZnJlZShhaS0+YWlfY2Fub25uYW1lKTsKLQkJLyogbm8gbmVlZCB0byBmcmVlKGFpLT5haV9hZGRyKSAqLwotCQlmcmVlKGFpKTsKLQl9IHdoaWxlICgoYWkgPSBuZXh0KSAhPSBOVUxMKTsKKyAgICBkbyB7CisgICAgICAgIG5leHQgPSBhaS0+YWlfbmV4dDsKKyAgICAgICAgaWYgKGFpLT5haV9jYW5vbm5hbWUpCisgICAgICAgICAgICBmcmVlKGFpLT5haV9jYW5vbm5hbWUpOworICAgICAgICAvKiBubyBuZWVkIHRvIGZyZWUoYWktPmFpX2FkZHIpICovCisgICAgICAgIGZyZWUoYWkpOworICAgIH0gd2hpbGUgKChhaSA9IG5leHQpICE9IE5VTEwpOwogfQogCiBzdGF0aWMgaW50CiBzdHJfaXNudW1iZXIoY29uc3QgY2hhciAqcCkKIHsKLQl1bnNpZ25lZCBjaGFyICpxID0gKHVuc2lnbmVkIGNoYXIgKilwOwotCXdoaWxlICgqcSkgewotCQlpZiAoISBpc2RpZ2l0KCpxKSkKLQkJCXJldHVybiBOTzsKLQkJcSsrOwotCX0KLQlyZXR1cm4gWUVTOworICAgIHVuc2lnbmVkIGNoYXIgKnEgPSAodW5zaWduZWQgY2hhciAqKXA7CisgICAgd2hpbGUgKCpxKSB7CisgICAgICAgIGlmICghIGlzZGlnaXQoKnEpKQorICAgICAgICAgICAgcmV0dXJuIE5POworICAgICAgICBxKys7CisgICAgfQorICAgIHJldHVybiBZRVM7CiB9CiAKIGludAogZ2V0YWRkcmluZm8oY29uc3QgY2hhcipob3N0bmFtZSwgY29uc3QgY2hhcipzZXJ2bmFtZSwKICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqaGludHMsIHN0cnVjdCBhZGRyaW5mbyAqKnJlcykKIHsKLQlzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7Ci0Jc3RydWN0IGFkZHJpbmZvICp0b3AgPSBOVUxMOwotCXN0cnVjdCBhZGRyaW5mbyAqY3VyOwotCWludCBpLCBlcnJvciA9IDA7Ci0JY2hhciBwdG9uW1BUT05fTUFYXTsKLQlzdHJ1Y3QgYWRkcmluZm8gYWk7Ci0Jc3RydWN0IGFkZHJpbmZvICpwYWk7Ci0JdV9zaG9ydCBwb3J0OworICAgIHN0cnVjdCBhZGRyaW5mbyBzZW50aW5lbDsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKnRvcCA9IE5VTEw7CisgICAgc3RydWN0IGFkZHJpbmZvICpjdXI7CisgICAgaW50IGksIGVycm9yID0gMDsKKyAgICBjaGFyIHB0b25bUFRPTl9NQVhdOworICAgIHN0cnVjdCBhZGRyaW5mbyBhaTsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKyAgICB1X3Nob3J0IHBvcnQ7CiAKICNpZmRlZiBGQUlUSAotCXN0YXRpYyBpbnQgZmlyc3R0aW1lID0gMTsKKyAgICBzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7CiAKLQlpZiAoZmlyc3R0aW1lKSB7Ci0JCS8qIHRyYW5zbGF0b3IgaGFjayAqLwotCQl7Ci0JCQljaGFyICpxID0gZ2V0ZW52KCJHQUkiKTsKLQkJCWlmIChxICYmIGluZXRfcHRvbihBRl9JTkVUNiwgcSwgJmZhaXRoX3ByZWZpeCkgPT0gMSkKLQkJCQl0cmFuc2xhdGUgPSBZRVM7Ci0JCX0KLQkJZmlyc3R0aW1lID0gMDsKLQl9CisgICAgaWYgKGZpcnN0dGltZSkgeworICAgICAgICAvKiB0cmFuc2xhdG9yIGhhY2sgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqcSA9IGdldGVudigiR0FJIik7CisgICAgICAgICAgICBpZiAocSAmJiBpbmV0X3B0b24oQUZfSU5FVDYsIHEsICZmYWl0aF9wcmVmaXgpID09IDEpCisgICAgICAgICAgICAgICAgdHJhbnNsYXRlID0gWUVTOworICAgICAgICB9CisgICAgICAgIGZpcnN0dGltZSA9IDA7CisgICAgfQogI2VuZGlmCiAKLQkvKiBpbml0aWFsaXplIGZpbGUgc3RhdGljIHZhcnMgKi8KLQlzZW50aW5lbC5haV9uZXh0ID0gTlVMTDsKLQljdXIgPSAmc2VudGluZWw7Ci0JcGFpID0gJmFpOwotCXBhaS0+YWlfZmxhZ3MgPSAwOwotCXBhaS0+YWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotCXBhaS0+YWlfc29ja3R5cGUgPSBHQUlfQU5ZOwotCXBhaS0+YWlfcHJvdG9jb2wgPSBHQUlfQU5ZOwotCXBhaS0+YWlfYWRkcmxlbiA9IDA7Ci0JcGFpLT5haV9jYW5vbm5hbWUgPSBOVUxMOwotCXBhaS0+YWlfYWRkciA9IE5VTEw7Ci0JcGFpLT5haV9uZXh0ID0gTlVMTDsKLQlwb3J0ID0gR0FJX0FOWTsKLQkKLQlpZiAoaG9zdG5hbWUgPT0gTlVMTCAmJiBzZXJ2bmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gRUFJX05PTkFNRTsKLQlpZiAoaGludHMpIHsKLQkJLyogZXJyb3IgY2hlY2sgZm9yIGhpbnRzICovCi0JCWlmIChoaW50cy0+YWlfYWRkcmxlbiB8fCBoaW50cy0+YWlfY2Fub25uYW1lIHx8Ci0JCSAgICBoaW50cy0+YWlfYWRkciB8fCBoaW50cy0+YWlfbmV4dCkKLQkJCUVSUihFQUlfQkFESElOVFMpOyAvKiB4eHggKi8KLQkJaWYgKGhpbnRzLT5haV9mbGFncyAmIH5BSV9NQVNLKQotCQkJRVJSKEVBSV9CQURGTEFHUyk7Ci0JCXN3aXRjaCAoaGludHMtPmFpX2ZhbWlseSkgewotCQljYXNlIFBGX1VOU1BFQzoKLQkJY2FzZSBQRl9JTkVUOgorICAgIC8qIGluaXRpYWxpemUgZmlsZSBzdGF0aWMgdmFycyAqLworICAgIHNlbnRpbmVsLmFpX25leHQgPSBOVUxMOworICAgIGN1ciA9ICZzZW50aW5lbDsKKyAgICBwYWkgPSAmYWk7CisgICAgcGFpLT5haV9mbGFncyA9IDA7CisgICAgcGFpLT5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgICAgcGFpLT5haV9zb2NrdHlwZSA9IEdBSV9BTlk7CisgICAgcGFpLT5haV9wcm90b2NvbCA9IEdBSV9BTlk7CisgICAgcGFpLT5haV9hZGRybGVuID0gMDsKKyAgICBwYWktPmFpX2Nhbm9ubmFtZSA9IE5VTEw7CisgICAgcGFpLT5haV9hZGRyID0gTlVMTDsKKyAgICBwYWktPmFpX25leHQgPSBOVUxMOworICAgIHBvcnQgPSBHQUlfQU5ZOworCisgICAgaWYgKGhvc3RuYW1lID09IE5VTEwgJiYgc2Vydm5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVBSV9OT05BTUU7CisgICAgaWYgKGhpbnRzKSB7CisgICAgICAgIC8qIGVycm9yIGNoZWNrIGZvciBoaW50cyAqLworICAgICAgICBpZiAoaGludHMtPmFpX2FkZHJsZW4gfHwgaGludHMtPmFpX2Nhbm9ubmFtZSB8fAorICAgICAgICAgICAgaGludHMtPmFpX2FkZHIgfHwgaGludHMtPmFpX25leHQpCisgICAgICAgICAgICBFUlIoRUFJX0JBREhJTlRTKTsgLyogeHh4ICovCisgICAgICAgIGlmIChoaW50cy0+YWlfZmxhZ3MgJiB+QUlfTUFTSykKKyAgICAgICAgICAgIEVSUihFQUlfQkFERkxBR1MpOworICAgICAgICBzd2l0Y2ggKGhpbnRzLT5haV9mYW1pbHkpIHsKKyAgICAgICAgY2FzZSBQRl9VTlNQRUM6CisgICAgICAgIGNhc2UgUEZfSU5FVDoKICNpZmRlZiBFTkFCTEVfSVBWNgotCQljYXNlIFBGX0lORVQ2OgorICAgICAgICBjYXNlIFBGX0lORVQ2OgogI2VuZGlmCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUVSUihFQUlfRkFNSUxZKTsKLQkJfQotCQltZW1jcHkocGFpLCBoaW50cywgc2l6ZW9mKCpwYWkpKTsKLQkJc3dpdGNoIChwYWktPmFpX3NvY2t0eXBlKSB7Ci0JCWNhc2UgR0FJX0FOWToKLQkJCXN3aXRjaCAocGFpLT5haV9wcm90b2NvbCkgewotCQkJY2FzZSBHQUlfQU5ZOgotCQkJCWJyZWFrOwotCQkJY2FzZSBJUFBST1RPX1VEUDoKLQkJCQlwYWktPmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCQkJcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwYWktPmFpX3NvY2t0eXBlID0gU09DS19SQVc7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTT0NLX1JBVzoKLQkJCWJyZWFrOwotCQljYXNlIFNPQ0tfREdSQU06Ci0JCQlpZiAocGFpLT5haV9wcm90b2NvbCAhPSBJUFBST1RPX1VEUCAmJgotCQkJICAgIHBhaS0+YWlfcHJvdG9jb2wgIT0gR0FJX0FOWSkKLQkJCQlFUlIoRUFJX0JBREhJTlRTKTsJLyp4eHgqLwotCQkJcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09DS19TVFJFQU06Ci0JCQlpZiAocGFpLT5haV9wcm90b2NvbCAhPSBJUFBST1RPX1RDUCAmJgotCQkJICAgIHBhaS0+YWlfcHJvdG9jb2wgIT0gR0FJX0FOWSkKLQkJCQlFUlIoRUFJX0JBREhJTlRTKTsJLyp4eHgqLwotCQkJcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlFUlIoRUFJX1NPQ0tUWVBFKTsKLQkJCS8qIHVucmVhY2hhYmxlICovCi0JCX0KLQl9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEVSUihFQUlfRkFNSUxZKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocGFpLCBoaW50cywgc2l6ZW9mKCpwYWkpKTsKKyAgICAgICAgc3dpdGNoIChwYWktPmFpX3NvY2t0eXBlKSB7CisgICAgICAgIGNhc2UgR0FJX0FOWToKKyAgICAgICAgICAgIHN3aXRjaCAocGFpLT5haV9wcm90b2NvbCkgeworICAgICAgICAgICAgY2FzZSBHQUlfQU5ZOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJUFBST1RPX1VEUDoKKyAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSVBQUk9UT19UQ1A6CisgICAgICAgICAgICAgICAgcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19SQVc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTT0NLX1JBVzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNPQ0tfREdSQU06CisgICAgICAgICAgICBpZiAocGFpLT5haV9wcm90b2NvbCAhPSBJUFBST1RPX1VEUCAmJgorICAgICAgICAgICAgICAgIHBhaS0+YWlfcHJvdG9jb2wgIT0gR0FJX0FOWSkKKyAgICAgICAgICAgICAgICBFUlIoRUFJX0JBREhJTlRTKTsgICAgICAgICAgICAgICAgICAgICAgLyp4eHgqLworICAgICAgICAgICAgcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU09DS19TVFJFQU06CisgICAgICAgICAgICBpZiAocGFpLT5haV9wcm90b2NvbCAhPSBJUFBST1RPX1RDUCAmJgorICAgICAgICAgICAgICAgIHBhaS0+YWlfcHJvdG9jb2wgIT0gR0FJX0FOWSkKKyAgICAgICAgICAgICAgICBFUlIoRUFJX0JBREhJTlRTKTsgICAgICAgICAgICAgICAgICAgICAgLyp4eHgqLworICAgICAgICAgICAgcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVENQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBFUlIoRUFJX1NPQ0tUWVBFKTsKKyAgICAgICAgICAgIC8qIHVucmVhY2hhYmxlICovCisgICAgICAgIH0KKyAgICB9CiAKLQkvKgotCSAqIHNlcnZpY2UgcG9ydAotCSAqLwotCWlmIChzZXJ2bmFtZSkgewotCQlpZiAoc3RyX2lzbnVtYmVyKHNlcnZuYW1lKSkgewotCQkJaWYgKHBhaS0+YWlfc29ja3R5cGUgPT0gR0FJX0FOWSkgewotCQkJCS8qIGNhbGxlciBhY2NlcHQgKkdBSV9BTlkqIHNvY2t0eXBlICovCi0JCQkJcGFpLT5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07Ci0JCQkJcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOwotCQkJfQotCQkJcG9ydCA9IGh0b25zKCh1X3Nob3J0KWF0b2koc2Vydm5hbWUpKTsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBzZXJ2ZW50ICpzcDsKLQkJCWNoYXIgKnByb3RvOworICAgIC8qCisgICAgICogc2VydmljZSBwb3J0CisgICAgICovCisgICAgaWYgKHNlcnZuYW1lKSB7CisgICAgICAgIGlmIChzdHJfaXNudW1iZXIoc2Vydm5hbWUpKSB7CisgICAgICAgICAgICBpZiAocGFpLT5haV9zb2NrdHlwZSA9PSBHQUlfQU5ZKSB7CisgICAgICAgICAgICAgICAgLyogY2FsbGVyIGFjY2VwdCAqR0FJX0FOWSogc29ja3R5cGUgKi8KKyAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgICAgICAgICAgICAgICBwYWktPmFpX3Byb3RvY29sID0gSVBQUk9UT19VRFA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwb3J0ID0gaHRvbnMoKHVfc2hvcnQpYXRvaShzZXJ2bmFtZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RydWN0IHNlcnZlbnQgKnNwOworICAgICAgICAgICAgY2hhciAqcHJvdG87CiAKLQkJCXByb3RvID0gTlVMTDsKLQkJCXN3aXRjaCAocGFpLT5haV9zb2NrdHlwZSkgewotCQkJY2FzZSBHQUlfQU5ZOgotCQkJCXByb3RvID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU09DS19ER1JBTToKLQkJCQlwcm90byA9ICJ1ZHAiOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTT0NLX1NUUkVBTToKLQkJCQlwcm90byA9ICJ0Y3AiOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlmcHJpbnRmKHN0ZGVyciwgInBhbmljIVxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoKHNwID0gZ2V0c2VydmJ5bmFtZShzZXJ2bmFtZSwgcHJvdG8pKSA9PSBOVUxMKQotCQkJCUVSUihFQUlfU0VSVklDRSk7Ci0JCQlwb3J0ID0gc3AtPnNfcG9ydDsKLQkJCWlmIChwYWktPmFpX3NvY2t0eXBlID09IEdBSV9BTlkpIHsKLQkJCQlpZiAoc3RyY21wKHNwLT5zX3Byb3RvLCAidWRwIikgPT0gMCkgewotCQkJCQlwYWktPmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKLQkJCQkJcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOwotCQkJCX0gZWxzZSBpZiAoc3RyY21wKHNwLT5zX3Byb3RvLCAidGNwIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhaS0+YWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWktPmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUihFQUlfUFJPVE9DT0wpOwkvKnh4eCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBob3N0bmFtZSA9PSBOVUxMLgotCSAqIHBhc3NpdmUgc29ja2V0IC0+IGFueWFkZHIgKDAuMC4wLjAgb3IgOjopCi0JICogbm9uLXBhc3NpdmUgc29ja2V0IC0+IGxvY2FsaG9zdCAoMTI3LjAuMC4xIG9yIDo6MSkKLQkgKi8KLQlpZiAoaG9zdG5hbWUgPT0gTlVMTCkgewotCQlzdHJ1Y3QgZ2FpX2FmZCAqZ2FpX2FmZDsKKyAgICAgICAgICAgIHByb3RvID0gTlVMTDsKKyAgICAgICAgICAgIHN3aXRjaCAocGFpLT5haV9zb2NrdHlwZSkgeworICAgICAgICAgICAgY2FzZSBHQUlfQU5ZOgorICAgICAgICAgICAgICAgIHByb3RvID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU09DS19ER1JBTToKKyAgICAgICAgICAgICAgICBwcm90byA9ICJ1ZHAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTT0NLX1NUUkVBTToKKyAgICAgICAgICAgICAgICBwcm90byA9ICJ0Y3AiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBhbmljIVxuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHNwID0gZ2V0c2VydmJ5bmFtZShzZXJ2bmFtZSwgcHJvdG8pKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIEVSUihFQUlfU0VSVklDRSk7CisgICAgICAgICAgICBwb3J0ID0gc3AtPnNfcG9ydDsKKyAgICAgICAgICAgIGlmIChwYWktPmFpX3NvY2t0eXBlID09IEdBSV9BTlkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHNwLT5zX3Byb3RvLCAidWRwIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKyAgICAgICAgICAgICAgICAgICAgcGFpLT5haV9wcm90b2NvbCA9IElQUFJPVE9fVURQOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKHNwLT5zX3Byb3RvLCAidGNwIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYWktPmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIHBhaS0+YWlfcHJvdG9jb2wgPSBJUFBST1RPX1RDUDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgRVJSKEVBSV9QUk9UT0NPTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKnh4eCovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkJZm9yIChnYWlfYWZkID0gJmdhaV9hZmRsWzBdOyBnYWlfYWZkLT5hX2FmOyBnYWlfYWZkKyspIHsKLQkJCWlmICghKHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQwotCQkJICAgfHwgcGFpLT5haV9mYW1pbHkgPT0gZ2FpX2FmZC0+YV9hZikpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KKyAgICAvKgorICAgICAqIGhvc3RuYW1lID09IE5VTEwuCisgICAgICogcGFzc2l2ZSBzb2NrZXQgLT4gYW55YWRkciAoMC4wLjAuMCBvciA6OikKKyAgICAgKiBub24tcGFzc2l2ZSBzb2NrZXQgLT4gbG9jYWxob3N0ICgxMjcuMC4wLjEgb3IgOjoxKQorICAgICAqLworICAgIGlmIChob3N0bmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHN0cnVjdCBnYWlfYWZkICpnYWlfYWZkOwogCi0JCQlpZiAocGFpLT5haV9mbGFncyAmIEFJX1BBU1NJVkUpIHsKLQkJCQlHRVRfQUkoY3VyLT5haV9uZXh0LCBnYWlfYWZkLCBnYWlfYWZkLT5hX2FkZHJhbnksIHBvcnQpOwotCQkJCS8qIHh4eCBtZWFuaW5nbGVzcz8KLQkJCQkgKiBHRVRfQ0FOT05OQU1FKGN1ci0+YWlfbmV4dCwgImFueWFkZHIiKTsKLQkJCQkgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgZ2FpX2FmZCwgZ2FpX2FmZC0+YV9sb29wYmFjaywKLQkJCQkJcG9ydCk7Ci0JCQkJLyogeHh4IG1lYW5pbmdsZXNzPwotCQkJCSAqIEdFVF9DQU5PTk5BTUUoY3VyLT5haV9uZXh0LCAibG9jYWxob3N0Iik7Ci0JCQkJICovCi0JCQl9Ci0JCQljdXIgPSBjdXItPmFpX25leHQ7Ci0JCX0KLQkJdG9wID0gc2VudGluZWwuYWlfbmV4dDsKLQkJaWYgKHRvcCkKLQkJCWdvdG8gZ29vZDsKLQkJZWxzZQotCQkJRVJSKEVBSV9GQU1JTFkpOwotCX0KLQkKLQkvKiBob3N0bmFtZSBhcyBudW1lcmljIG5hbWUgKi8KLQlmb3IgKGkgPSAwOyBnYWlfYWZkbFtpXS5hX2FmOyBpKyspIHsKLQkJaWYgKGluZXRfcHRvbihnYWlfYWZkbFtpXS5hX2FmLCBob3N0bmFtZSwgcHRvbikpIHsKLQkJCXVfbG9uZyB2NGE7CisgICAgICAgIGZvciAoZ2FpX2FmZCA9ICZnYWlfYWZkbFswXTsgZ2FpX2FmZC0+YV9hZjsgZ2FpX2FmZCsrKSB7CisgICAgICAgICAgICBpZiAoIShwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMKKyAgICAgICAgICAgICAgIHx8IHBhaS0+YWlfZmFtaWx5ID09IGdhaV9hZmQtPmFfYWYpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYWktPmFpX2ZsYWdzICYgQUlfUEFTU0lWRSkgeworICAgICAgICAgICAgICAgIEdFVF9BSShjdXItPmFpX25leHQsIGdhaV9hZmQsIGdhaV9hZmQtPmFfYWRkcmFueSwgcG9ydCk7CisgICAgICAgICAgICAgICAgLyogeHh4IG1lYW5pbmdsZXNzPworICAgICAgICAgICAgICAgICAqIEdFVF9DQU5PTk5BTUUoY3VyLT5haV9uZXh0LCAiYW55YWRkciIpOworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBHRVRfQUkoY3VyLT5haV9uZXh0LCBnYWlfYWZkLCBnYWlfYWZkLT5hX2xvb3BiYWNrLAorICAgICAgICAgICAgICAgICAgICBwb3J0KTsKKyAgICAgICAgICAgICAgICAvKiB4eHggbWVhbmluZ2xlc3M/CisgICAgICAgICAgICAgICAgICogR0VUX0NBTk9OTkFNRShjdXItPmFpX25leHQsICJsb2NhbGhvc3QiKTsKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1ciA9IGN1ci0+YWlfbmV4dDsKKyAgICAgICAgfQorICAgICAgICB0b3AgPSBzZW50aW5lbC5haV9uZXh0OworICAgICAgICBpZiAodG9wKQorICAgICAgICAgICAgZ290byBnb29kOworICAgICAgICBlbHNlCisgICAgICAgICAgICBFUlIoRUFJX0ZBTUlMWSk7CisgICAgfQorCisgICAgLyogaG9zdG5hbWUgYXMgbnVtZXJpYyBuYW1lICovCisgICAgZm9yIChpID0gMDsgZ2FpX2FmZGxbaV0uYV9hZjsgaSsrKSB7CisgICAgICAgIGlmIChpbmV0X3B0b24oZ2FpX2FmZGxbaV0uYV9hZiwgaG9zdG5hbWUsIHB0b24pKSB7CisgICAgICAgICAgICB1X2xvbmcgdjRhOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCQl1X2NoYXIgcGZ4OworICAgICAgICAgICAgdV9jaGFyIHBmeDsKICNlbmRpZgogCi0JCQlzd2l0Y2ggKGdhaV9hZmRsW2ldLmFfYWYpIHsKLQkJCWNhc2UgQUZfSU5FVDoKLQkJCQl2NGEgPSAoKHN0cnVjdCBpbl9hZGRyICopcHRvbiktPnNfYWRkcjsKLQkJCQl2NGEgPSBudG9obCh2NGEpOwotCQkJCWlmIChJTl9NVUxUSUNBU1QodjRhKSB8fCBJTl9FWFBFUklNRU5UQUwodjRhKSkKLQkJCQkJcGFpLT5haV9mbGFncyAmPSB+QUlfQ0FOT05OQU1FOwotCQkJCXY0YSA+Pj0gSU5fQ0xBU1NBX05TSElGVDsKLQkJCQlpZiAodjRhID09IDAgfHwgdjRhID09IElOX0xPT1BCQUNLTkVUKQotCQkJCQlwYWktPmFpX2ZsYWdzICY9IH5BSV9DQU5PTk5BTUU7Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICBzd2l0Y2ggKGdhaV9hZmRsW2ldLmFfYWYpIHsKKyAgICAgICAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgICAgICAgICB2NGEgPSAoKHN0cnVjdCBpbl9hZGRyICopcHRvbiktPnNfYWRkcjsKKyAgICAgICAgICAgICAgICB2NGEgPSBudG9obCh2NGEpOworICAgICAgICAgICAgICAgIGlmIChJTl9NVUxUSUNBU1QodjRhKSB8fCBJTl9FWFBFUklNRU5UQUwodjRhKSkKKyAgICAgICAgICAgICAgICAgICAgcGFpLT5haV9mbGFncyAmPSB+QUlfQ0FOT05OQU1FOworICAgICAgICAgICAgICAgIHY0YSA+Pj0gSU5fQ0xBU1NBX05TSElGVDsKKyAgICAgICAgICAgICAgICBpZiAodjRhID09IDAgfHwgdjRhID09IElOX0xPT1BCQUNLTkVUKQorICAgICAgICAgICAgICAgICAgICBwYWktPmFpX2ZsYWdzICY9IH5BSV9DQU5PTk5BTUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQkJCWNhc2UgQUZfSU5FVDY6Ci0JCQkJcGZ4ID0gKChzdHJ1Y3QgaW42X2FkZHIgKilwdG9uKS0+czZfYWRkcjhbMF07Ci0JCQkJaWYgKHBmeCA9PSAwIHx8IHBmeCA9PSAweGZlIHx8IHBmeCA9PSAweGZmKQotCQkJCQlwYWktPmFpX2ZsYWdzICY9IH5BSV9DQU5PTk5BTUU7Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICAgICAgICAgIHBmeCA9ICgoc3RydWN0IGluNl9hZGRyICopcHRvbiktPnM2X2FkZHI4WzBdOworICAgICAgICAgICAgICAgIGlmIChwZnggPT0gMCB8fCBwZnggPT0gMHhmZSB8fCBwZnggPT0gMHhmZikKKyAgICAgICAgICAgICAgICAgICAgcGFpLT5haV9mbGFncyAmPSB+QUlfQ0FOT05OQU1FOworICAgICAgICAgICAgICAgIGJyZWFrOwogI2VuZGlmCi0JCQl9Ci0JCQkKLQkJCWlmIChwYWktPmFpX2ZhbWlseSA9PSBnYWlfYWZkbFtpXS5hX2FmIHx8Ci0JCQkgICAgcGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKSB7Ci0JCQkJaWYgKCEgKHBhaS0+YWlfZmxhZ3MgJiBBSV9DQU5PTk5BTUUpKSB7Ci0JCQkJCUdFVF9BSSh0b3AsICZnYWlfYWZkbFtpXSwgcHRvbiwgcG9ydCk7Ci0JCQkJCWdvdG8gZ29vZDsKLQkJCQl9Ci0JCQkJLyoKLQkJCQkgKiBpZiBBSV9DQU5PTk5BTUUgYW5kIGlmIHJldmVyc2UgbG9va3VwCi0JCQkJICogZmFpbCwgcmV0dXJuIGFpIGFueXdheSB0byBwYWNpZnkKLQkJCQkgKiBjYWxsaW5nIGFwcGxpY2F0aW9uLgotCQkJCSAqCi0JCQkJICogWFhYIGdldGFkZHJpbmZvKCkgaXMgYSBuYW1lLT5hZGRyZXNzCi0JCQkJICogdHJhbnNsYXRpb24gZnVuY3Rpb24sIGFuZCBpdCBsb29rcyBzdHJhbmdlCi0JCQkJICogdGhhdCB3ZSBkbyBhZGRyLT5uYW1lIHRyYW5zbGF0aW9uIGhlcmUuCi0JCQkJICovCi0JCQkJZ2V0X25hbWUocHRvbiwgJmdhaV9hZmRsW2ldLCAmdG9wLCBwdG9uLCBwYWksIHBvcnQpOwotCQkJCWdvdG8gZ29vZDsKLQkJCX0gZWxzZSAKLQkJCQlFUlIoRUFJX0ZBTUlMWSk7CS8qeHh4Ki8KLQkJfQotCX0KKyAgICAgICAgICAgIH0KIAotCWlmIChwYWktPmFpX2ZsYWdzICYgQUlfTlVNRVJJQ0hPU1QpCi0JCUVSUihFQUlfTk9OQU1FKTsKKyAgICAgICAgICAgIGlmIChwYWktPmFpX2ZhbWlseSA9PSBnYWlfYWZkbFtpXS5hX2FmIHx8CisgICAgICAgICAgICAgICAgcGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgKHBhaS0+YWlfZmxhZ3MgJiBBSV9DQU5PTk5BTUUpKSB7CisgICAgICAgICAgICAgICAgICAgIEdFVF9BSSh0b3AsICZnYWlfYWZkbFtpXSwgcHRvbiwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZ29vZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBpZiBBSV9DQU5PTk5BTUUgYW5kIGlmIHJldmVyc2UgbG9va3VwCisgICAgICAgICAgICAgICAgICogZmFpbCwgcmV0dXJuIGFpIGFueXdheSB0byBwYWNpZnkKKyAgICAgICAgICAgICAgICAgKiBjYWxsaW5nIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogWFhYIGdldGFkZHJpbmZvKCkgaXMgYSBuYW1lLT5hZGRyZXNzCisgICAgICAgICAgICAgICAgICogdHJhbnNsYXRpb24gZnVuY3Rpb24sIGFuZCBpdCBsb29rcyBzdHJhbmdlCisgICAgICAgICAgICAgICAgICogdGhhdCB3ZSBkbyBhZGRyLT5uYW1lIHRyYW5zbGF0aW9uIGhlcmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZ2V0X25hbWUocHRvbiwgJmdhaV9hZmRsW2ldLCAmdG9wLCBwdG9uLCBwYWksIHBvcnQpOworICAgICAgICAgICAgICAgIGdvdG8gZ29vZDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIEVSUihFQUlfRkFNSUxZKTsgICAgICAgICAgICAgICAgICAgICAgICAvKnh4eCovCisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBob3N0bmFtZSBhcyBhbHBoYWJldGljYWwgbmFtZSAqLwotCWVycm9yID0gZ2V0X2FkZHIoaG9zdG5hbWUsIHBhaS0+YWlfZmFtaWx5LCAmdG9wLCBwYWksIHBvcnQpOwotCWlmIChlcnJvciA9PSAwKSB7Ci0JCWlmICh0b3ApIHsKKyAgICBpZiAocGFpLT5haV9mbGFncyAmIEFJX05VTUVSSUNIT1NUKQorICAgICAgICBFUlIoRUFJX05PTkFNRSk7CisKKyAgICAvKiBob3N0bmFtZSBhcyBhbHBoYWJldGljYWwgbmFtZSAqLworICAgIGVycm9yID0gZ2V0X2FkZHIoaG9zdG5hbWUsIHBhaS0+YWlfZmFtaWx5LCAmdG9wLCBwYWksIHBvcnQpOworICAgIGlmIChlcnJvciA9PSAwKSB7CisgICAgICAgIGlmICh0b3ApIHsKICBnb29kOgotCQkJKnJlcyA9IHRvcDsKLQkJCXJldHVybiBTVUNDRVNTOwotCQl9IGVsc2UKLQkJCWVycm9yID0gRUFJX0ZBSUw7Ci0JfQorICAgICAgICAgICAgKnJlcyA9IHRvcDsKKyAgICAgICAgICAgIHJldHVybiBTVUNDRVNTOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGVycm9yID0gRUFJX0ZBSUw7CisgICAgfQogIGZyZWU6Ci0JaWYgKHRvcCkKLQkJZnJlZWFkZHJpbmZvKHRvcCk7CisgICAgaWYgKHRvcCkKKyAgICAgICAgZnJlZWFkZHJpbmZvKHRvcCk7CiAgYmFkOgotCSpyZXMgPSBOVUxMOwotCXJldHVybiBlcnJvcjsKKyAgICAqcmVzID0gTlVMTDsKKyAgICByZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQKIGdldF9uYW1lKGFkZHIsIGdhaV9hZmQsIHJlcywgbnVtYWRkciwgcGFpLCBwb3J0MCkKLQljb25zdCBjaGFyICphZGRyOwotCXN0cnVjdCBnYWlfYWZkICpnYWlfYWZkOwotCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKLQljaGFyICpudW1hZGRyOwotCXN0cnVjdCBhZGRyaW5mbyAqcGFpOwotCWludCBwb3J0MDsKKyAgICBjb25zdCBjaGFyICphZGRyOworICAgIHN0cnVjdCBnYWlfYWZkICpnYWlfYWZkOworICAgIHN0cnVjdCBhZGRyaW5mbyAqKnJlczsKKyAgICBjaGFyICpudW1hZGRyOworICAgIHN0cnVjdCBhZGRyaW5mbyAqcGFpOworICAgIGludCBwb3J0MDsKIHsKLQl1X3Nob3J0IHBvcnQgPSBwb3J0MCAmIDB4ZmZmZjsKLQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0Jc3RydWN0IGFkZHJpbmZvICpjdXI7Ci0JaW50IGVycm9yID0gMDsKKyAgICB1X3Nob3J0IHBvcnQgPSBwb3J0MCAmIDB4ZmZmZjsKKyAgICBzdHJ1Y3QgaG9zdGVudCAqaHA7CisgICAgc3RydWN0IGFkZHJpbmZvICpjdXI7CisgICAgaW50IGVycm9yID0gMDsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWludCBoX2Vycm9yOworICAgIGludCBoX2Vycm9yOwogI2VuZGlmCi0JCisKICNpZmRlZiBFTkFCTEVfSVBWNgotCWhwID0gZ2V0aXBub2RlYnlhZGRyKGFkZHIsIGdhaV9hZmQtPmFfYWRkcmxlbiwgZ2FpX2FmZC0+YV9hZiwgJmhfZXJyb3IpOworICAgIGhwID0gZ2V0aXBub2RlYnlhZGRyKGFkZHIsIGdhaV9hZmQtPmFfYWRkcmxlbiwgZ2FpX2FmZC0+YV9hZiwgJmhfZXJyb3IpOwogI2Vsc2UKLQlocCA9IGdldGhvc3RieWFkZHIoYWRkciwgZ2FpX2FmZC0+YV9hZGRybGVuLCBBRl9JTkVUKTsKKyAgICBocCA9IGdldGhvc3RieWFkZHIoYWRkciwgZ2FpX2FmZC0+YV9hZGRybGVuLCBBRl9JTkVUKTsKICNlbmRpZgotCWlmIChocCAmJiBocC0+aF9uYW1lICYmIGhwLT5oX25hbWVbMF0gJiYgaHAtPmhfYWRkcl9saXN0WzBdKSB7Ci0JCUdFVF9BSShjdXIsIGdhaV9hZmQsIGhwLT5oX2FkZHJfbGlzdFswXSwgcG9ydCk7Ci0JCUdFVF9DQU5PTk5BTUUoY3VyLCBocC0+aF9uYW1lKTsKLQl9IGVsc2UKLQkJR0VUX0FJKGN1ciwgZ2FpX2FmZCwgbnVtYWRkciwgcG9ydCk7Ci0JCisgICAgaWYgKGhwICYmIGhwLT5oX25hbWUgJiYgaHAtPmhfbmFtZVswXSAmJiBocC0+aF9hZGRyX2xpc3RbMF0pIHsKKyAgICAgICAgR0VUX0FJKGN1ciwgZ2FpX2FmZCwgaHAtPmhfYWRkcl9saXN0WzBdLCBwb3J0KTsKKyAgICAgICAgR0VUX0NBTk9OTkFNRShjdXIsIGhwLT5oX25hbWUpOworICAgIH0gZWxzZQorICAgICAgICBHRVRfQUkoY3VyLCBnYWlfYWZkLCBudW1hZGRyLCBwb3J0KTsKKwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JaWYgKGhwKQotCQlmcmVlaG9zdGVudChocCk7CisgICAgaWYgKGhwKQorICAgICAgICBmcmVlaG9zdGVudChocCk7CiAjZW5kaWYKLQkqcmVzID0gY3VyOwotCXJldHVybiBTVUNDRVNTOworICAgICpyZXMgPSBjdXI7CisgICAgcmV0dXJuIFNVQ0NFU1M7CiAgZnJlZToKLQlpZiAoY3VyKQotCQlmcmVlYWRkcmluZm8oY3VyKTsKKyAgICBpZiAoY3VyKQorICAgICAgICBmcmVlYWRkcmluZm8oY3VyKTsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWlmIChocCkKLQkJZnJlZWhvc3RlbnQoaHApOworICAgIGlmIChocCkKKyAgICAgICAgZnJlZWhvc3RlbnQoaHApOwogI2VuZGlmCiAgLyogYmFkOiAqLwotCSpyZXMgPSBOVUxMOwotCXJldHVybiBlcnJvcjsKKyAgICAqcmVzID0gTlVMTDsKKyAgICByZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQKIGdldF9hZGRyKGhvc3RuYW1lLCBhZiwgcmVzLCBwYWksIHBvcnQwKQotCWNvbnN0IGNoYXIgKmhvc3RuYW1lOwotCWludCBhZjsKLQlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Ci0Jc3RydWN0IGFkZHJpbmZvICpwYWk7Ci0JaW50IHBvcnQwOworICAgIGNvbnN0IGNoYXIgKmhvc3RuYW1lOworICAgIGludCBhZjsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gKipyZXM7CisgICAgc3RydWN0IGFkZHJpbmZvICpwYWk7CisgICAgaW50IHBvcnQwOwogewotCXVfc2hvcnQgcG9ydCA9IHBvcnQwICYgMHhmZmZmOwotCXN0cnVjdCBhZGRyaW5mbyBzZW50aW5lbDsKLQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0Jc3RydWN0IGFkZHJpbmZvICp0b3AsICpjdXI7Ci0Jc3RydWN0IGdhaV9hZmQgKmdhaV9hZmQ7Ci0JaW50IGksIGVycm9yID0gMCwgaF9lcnJvcjsKLQljaGFyICphcDsKKyAgICB1X3Nob3J0IHBvcnQgPSBwb3J0MCAmIDB4ZmZmZjsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7CisgICAgc3RydWN0IGhvc3RlbnQgKmhwOworICAgIHN0cnVjdCBhZGRyaW5mbyAqdG9wLCAqY3VyOworICAgIHN0cnVjdCBnYWlfYWZkICpnYWlfYWZkOworICAgIGludCBpLCBlcnJvciA9IDAsIGhfZXJyb3I7CisgICAgY2hhciAqYXA7CiAKLQl0b3AgPSBOVUxMOwotCXNlbnRpbmVsLmFpX25leHQgPSBOVUxMOwotCWN1ciA9ICZzZW50aW5lbDsKKyAgICB0b3AgPSBOVUxMOworICAgIHNlbnRpbmVsLmFpX25leHQgPSBOVUxMOworICAgIGN1ciA9ICZzZW50aW5lbDsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWlmIChhZiA9PSBBRl9VTlNQRUMpIHsKLQkJaHAgPSBnZXRpcG5vZGVieW5hbWUoaG9zdG5hbWUsIEFGX0lORVQ2LAotCQkJCUFJX0FERFJDT05GSUd8QUlfQUxMfEFJX1Y0TUFQUEVELCAmaF9lcnJvcik7Ci0JfSBlbHNlCi0JCWhwID0gZ2V0aXBub2RlYnluYW1lKGhvc3RuYW1lLCBhZiwgQUlfQUREUkNPTkZJRywgJmhfZXJyb3IpOworICAgIGlmIChhZiA9PSBBRl9VTlNQRUMpIHsKKyAgICAgICAgaHAgPSBnZXRpcG5vZGVieW5hbWUoaG9zdG5hbWUsIEFGX0lORVQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgQUlfQUREUkNPTkZJR3xBSV9BTEx8QUlfVjRNQVBQRUQsICZoX2Vycm9yKTsKKyAgICB9IGVsc2UKKyAgICAgICAgaHAgPSBnZXRpcG5vZGVieW5hbWUoaG9zdG5hbWUsIGFmLCBBSV9BRERSQ09ORklHLCAmaF9lcnJvcik7CiAjZWxzZQotCWhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7Ci0JaF9lcnJvciA9IGhfZXJybm87CisgICAgaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lKTsKKyAgICBoX2Vycm9yID0gaF9lcnJubzsKICNlbmRpZgotCWlmIChocCA9PSBOVUxMKSB7Ci0JCXN3aXRjaCAoaF9lcnJvcikgewotCQljYXNlIEhPU1RfTk9UX0ZPVU5EOgotCQljYXNlIE5PX0RBVEE6Ci0JCQllcnJvciA9IEVBSV9OT0RBVEE7Ci0JCQlicmVhazsKLQkJY2FzZSBUUllfQUdBSU46Ci0JCQllcnJvciA9IEVBSV9BR0FJTjsKLQkJCWJyZWFrOwotCQljYXNlIE5PX1JFQ09WRVJZOgotCQlkZWZhdWx0OgotCQkJZXJyb3IgPSBFQUlfRkFJTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWdvdG8gZnJlZTsKLQl9CisgICAgaWYgKGhwID09IE5VTEwpIHsKKyAgICAgICAgc3dpdGNoIChoX2Vycm9yKSB7CisgICAgICAgIGNhc2UgSE9TVF9OT1RfRk9VTkQ6CisgICAgICAgIGNhc2UgTk9fREFUQToKKyAgICAgICAgICAgIGVycm9yID0gRUFJX05PREFUQTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRSWV9BR0FJTjoKKyAgICAgICAgICAgIGVycm9yID0gRUFJX0FHQUlOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTk9fUkVDT1ZFUlk6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnJvciA9IEVBSV9GQUlMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZ290byBmcmVlOworICAgIH0KIAotCWlmICgoaHAtPmhfbmFtZSA9PSBOVUxMKSB8fCAoaHAtPmhfbmFtZVswXSA9PSAwKSB8fAotCSAgICAoaHAtPmhfYWRkcl9saXN0WzBdID09IE5VTEwpKSB7Ci0JCWVycm9yID0gRUFJX0ZBSUw7Ci0JCWdvdG8gZnJlZTsKLQl9Ci0JCi0JZm9yIChpID0gMDsgKGFwID0gaHAtPmhfYWRkcl9saXN0W2ldKSAhPSBOVUxMOyBpKyspIHsKLQkJc3dpdGNoIChhZikgeworICAgIGlmICgoaHAtPmhfbmFtZSA9PSBOVUxMKSB8fCAoaHAtPmhfbmFtZVswXSA9PSAwKSB8fAorICAgICAgICAoaHAtPmhfYWRkcl9saXN0WzBdID09IE5VTEwpKSB7CisgICAgICAgIGVycm9yID0gRUFJX0ZBSUw7CisgICAgICAgIGdvdG8gZnJlZTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyAoYXAgPSBocC0+aF9hZGRyX2xpc3RbaV0pICE9IE5VTEw7IGkrKykgeworICAgICAgICBzd2l0Y2ggKGFmKSB7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQkJY2FzZSBBRl9JTkVUNjoKLQkJCWdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUNl07Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgICAgIGdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUNl07CisgICAgICAgICAgICBicmVhazsKICNlbmRpZgogI2lmbmRlZiBFTkFCTEVfSVBWNgotCQlkZWZhdWx0OgkvKiBBRl9VTlNQRUMgKi8KKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgLyogQUZfVU5TUEVDICovCiAjZW5kaWYKLQkJY2FzZSBBRl9JTkVUOgotCQkJZ2FpX2FmZCA9ICZnYWlfYWZkbFtOX0lORVRdOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgICAgIGdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUXTsKKyAgICAgICAgICAgIGJyZWFrOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCWRlZmF1bHQ6CS8qIEFGX1VOU1BFQyAqLwotCQkJaWYgKElONl9JU19BRERSX1Y0TUFQUEVEKChzdHJ1Y3QgaW42X2FkZHIgKilhcCkpIHsKLQkJCQlhcCArPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSAtCi0JCQkJCXNpemVvZihzdHJ1Y3QgaW5fYWRkcik7Ci0JCQkJZ2FpX2FmZCA9ICZnYWlfYWZkbFtOX0lORVRdOwotCQkJfSBlbHNlCi0JCQkJZ2FpX2FmZCA9ICZnYWlfYWZkbFtOX0lORVQ2XTsKLQkJCWJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiBBRl9VTlNQRUMgKi8KKyAgICAgICAgICAgIGlmIChJTjZfSVNfQUREUl9WNE1BUFBFRCgoc3RydWN0IGluNl9hZGRyICopYXApKSB7CisgICAgICAgICAgICAgICAgYXAgKz0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgLQorICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpOworICAgICAgICAgICAgICAgIGdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUXTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGdhaV9hZmQgPSAmZ2FpX2FmZGxbTl9JTkVUNl07CisgICAgICAgICAgICBicmVhazsKICNlbmRpZgotCQl9CisgICAgICAgIH0KICNpZmRlZiBGQUlUSAotCQlpZiAodHJhbnNsYXRlICYmIGdhaV9hZmQtPmFfYWYgPT0gQUZfSU5FVCkgewotCQkJc3RydWN0IGluNl9hZGRyICppbjY7CisgICAgICAgIGlmICh0cmFuc2xhdGUgJiYgZ2FpX2FmZC0+YV9hZiA9PSBBRl9JTkVUKSB7CisgICAgICAgICAgICBzdHJ1Y3QgaW42X2FkZHIgKmluNjsKIAotCQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgJmdhaV9hZmRsW05fSU5FVDZdLCBhcCwgcG9ydCk7Ci0JCQlpbjYgPSAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopY3VyLT5haV9uZXh0LT5haV9hZGRyKS0+c2luNl9hZGRyOwotCQkJbWVtY3B5KCZpbjYtPnM2X2FkZHIzMlswXSwgJmZhaXRoX3ByZWZpeCwKLQkJCSAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSAtIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCQkJbWVtY3B5KCZpbjYtPnM2X2FkZHIzMlszXSwgYXAsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCQl9IGVsc2UKKyAgICAgICAgICAgIEdFVF9BSShjdXItPmFpX25leHQsICZnYWlfYWZkbFtOX0lORVQ2XSwgYXAsIHBvcnQpOworICAgICAgICAgICAgaW42ID0gJigoc3RydWN0IHNvY2thZGRyX2luNiAqKWN1ci0+YWlfbmV4dC0+YWlfYWRkciktPnNpbjZfYWRkcjsKKyAgICAgICAgICAgIG1lbWNweSgmaW42LT5zNl9hZGRyMzJbMF0sICZmYWl0aF9wcmVmaXgsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgLSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgICAgICAgICAgIG1lbWNweSgmaW42LT5zNl9hZGRyMzJbM10sIGFwLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKyAgICAgICAgfSBlbHNlCiAjZW5kaWYgLyogRkFJVEggKi8KLQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgZ2FpX2FmZCwgYXAsIHBvcnQpOwotCQlpZiAoY3VyID09ICZzZW50aW5lbCkgewotCQkJdG9wID0gY3VyLT5haV9uZXh0OwotCQkJR0VUX0NBTk9OTkFNRSh0b3AsIGhwLT5oX25hbWUpOwotCQl9Ci0JCWN1ciA9IGN1ci0+YWlfbmV4dDsKLQl9CisgICAgICAgIEdFVF9BSShjdXItPmFpX25leHQsIGdhaV9hZmQsIGFwLCBwb3J0KTsKKyAgICAgICAgaWYgKGN1ciA9PSAmc2VudGluZWwpIHsKKyAgICAgICAgICAgIHRvcCA9IGN1ci0+YWlfbmV4dDsKKyAgICAgICAgICAgIEdFVF9DQU5PTk5BTUUodG9wLCBocC0+aF9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPmFpX25leHQ7CisgICAgfQogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JZnJlZWhvc3RlbnQoaHApOworICAgIGZyZWVob3N0ZW50KGhwKTsKICNlbmRpZgotCSpyZXMgPSB0b3A7Ci0JcmV0dXJuIFNVQ0NFU1M7CisgICAgKnJlcyA9IHRvcDsKKyAgICByZXR1cm4gU1VDQ0VTUzsKICBmcmVlOgotCWlmICh0b3ApCi0JCWZyZWVhZGRyaW5mbyh0b3ApOworICAgIGlmICh0b3ApCisgICAgICAgIGZyZWVhZGRyaW5mbyh0b3ApOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JaWYgKGhwKQotCQlmcmVlaG9zdGVudChocCk7CisgICAgaWYgKGhwKQorICAgICAgICBmcmVlaG9zdGVudChocCk7CiAjZW5kaWYKIC8qIGJhZDogKi8KLQkqcmVzID0gTlVMTDsKLQlyZXR1cm4gZXJyb3I7CisgICAgKnJlcyA9IE5VTEw7CisgICAgcmV0dXJuIGVycm9yOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRidWlsZGluZm8uYyBiL01vZHVsZXMvZ2V0YnVpbGRpbmZvLmMKaW5kZXggZjRiZDE0YS4uM2JhYzFjNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRidWlsZGluZm8uYworKysgYi9Nb2R1bGVzL2dldGJ1aWxkaW5mby5jCkBAIC0zMSwyMiArMzEsMjIgQEAKIGNvbnN0IGNoYXIgKgogUHlfR2V0QnVpbGRJbmZvKHZvaWQpCiB7Ci0Jc3RhdGljIGNoYXIgYnVpbGRpbmZvWzUwXTsKLQljb25zdCBjaGFyICpyZXZpc2lvbiA9IFB5X1N1YnZlcnNpb25SZXZpc2lvbigpOwotCWNvbnN0IGNoYXIgKnNlcCA9ICpyZXZpc2lvbiA/ICI6IiA6ICIiOwotCWNvbnN0IGNoYXIgKmJyYW5jaCA9IFB5X1N1YnZlcnNpb25TaG9ydEJyYW5jaCgpOwotCVB5T1Nfc25wcmludGYoYnVpbGRpbmZvLCBzaXplb2YoYnVpbGRpbmZvKSwKLQkJICAgICAgIiVzJXMlcywgJS4yMHMsICUuOXMiLCBicmFuY2gsIHNlcCwgcmV2aXNpb24sIAotCQkgICAgICBEQVRFLCBUSU1FKTsKLQlyZXR1cm4gYnVpbGRpbmZvOworICAgIHN0YXRpYyBjaGFyIGJ1aWxkaW5mb1s1MF07CisgICAgY29uc3QgY2hhciAqcmV2aXNpb24gPSBQeV9TdWJ2ZXJzaW9uUmV2aXNpb24oKTsKKyAgICBjb25zdCBjaGFyICpzZXAgPSAqcmV2aXNpb24gPyAiOiIgOiAiIjsKKyAgICBjb25zdCBjaGFyICpicmFuY2ggPSBQeV9TdWJ2ZXJzaW9uU2hvcnRCcmFuY2goKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1aWxkaW5mbywgc2l6ZW9mKGJ1aWxkaW5mbyksCisgICAgICAgICAgICAgICAgICAiJXMlcyVzLCAlLjIwcywgJS45cyIsIGJyYW5jaCwgc2VwLCByZXZpc2lvbiwKKyAgICAgICAgICAgICAgICAgIERBVEUsIFRJTUUpOworICAgIHJldHVybiBidWlsZGluZm87CiB9CiAKIGNvbnN0IGNoYXIgKgogX1B5X3N2bnZlcnNpb24odm9pZCkKIHsKLQkvKiB0aGUgZm9sbG93aW5nIHN0cmluZyBjYW4gYmUgbW9kaWZpZWQgYnkgc3Vid2NyZXYuZXhlICovCi0Jc3RhdGljIGNvbnN0IGNoYXIgc3ZudmVyc2lvbltdID0gU1ZOVkVSU0lPTjsKLQlpZiAoc3ZudmVyc2lvblswXSAhPSAnJCcpCi0JCXJldHVybiBzdm52ZXJzaW9uOyAvKiBpdCB3YXMgaW50ZXJwb2xhdGVkLCBvciBwYXNzZWQgb24gY29tbWFuZCBsaW5lICovCi0JcmV0dXJuICJVbnZlcnNpb25lZCBkaXJlY3RvcnkiOworICAgIC8qIHRoZSBmb2xsb3dpbmcgc3RyaW5nIGNhbiBiZSBtb2RpZmllZCBieSBzdWJ3Y3Jldi5leGUgKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciBzdm52ZXJzaW9uW10gPSBTVk5WRVJTSU9OOworICAgIGlmIChzdm52ZXJzaW9uWzBdICE9ICckJykKKyAgICAgICAgcmV0dXJuIHN2bnZlcnNpb247IC8qIGl0IHdhcyBpbnRlcnBvbGF0ZWQsIG9yIHBhc3NlZCBvbiBjb21tYW5kIGxpbmUgKi8KKyAgICByZXR1cm4gIlVudmVyc2lvbmVkIGRpcmVjdG9yeSI7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldG5hbWVpbmZvLmMgYi9Nb2R1bGVzL2dldG5hbWVpbmZvLmMKaW5kZXggZDNjMGFjNS4uNzg5MmFlOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nZXRuYW1laW5mby5jCisrKyBiL01vZHVsZXMvZ2V0bmFtZWluZm8uYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKKyAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICogYXJlIG1ldDoKQEAgLTEzLDcgKzEzLDcgQEAKICAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCisgKgogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKICAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKQEAgLTUzLDE2MiArNTMsMTYyIEBACiAjZGVmaW5lIE5PICAwCiAKIHN0YXRpYyBzdHJ1Y3QgZ25pX2FmZCB7Ci0JaW50IGFfYWY7Ci0JaW50IGFfYWRkcmxlbjsKLQlpbnQgYV9zb2NrbGVuOwotCWludCBhX29mZjsKKyAgICBpbnQgYV9hZjsKKyAgICBpbnQgYV9hZGRybGVuOworICAgIGludCBhX3NvY2tsZW47CisgICAgaW50IGFfb2ZmOwogfSBnbmlfYWZkbCBbXSA9IHsKICNpZmRlZiBFTkFCTEVfSVBWNgotCXtQRl9JTkVUNiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSwKLQkJb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luNiwgc2luNl9hZGRyKX0sCisgICAge1BGX0lORVQ2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpLAorICAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW42LCBzaW42X2FkZHIpfSwKICNlbmRpZgotCXtQRl9JTkVULCBzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSwKLQkJb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luLCBzaW5fYWRkcil9LAotCXswLCAwLCAwfSwKKyAgICB7UEZfSU5FVCwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksCisgICAgICAgIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbiwgc2luX2FkZHIpfSwKKyAgICB7MCwgMCwgMH0sCiB9OwogCiBzdHJ1Y3QgZ25pX3NvY2tpbmV0IHsKLQl1X2NoYXIJc2lfbGVuOwotCXVfY2hhcglzaV9mYW1pbHk7Ci0JdV9zaG9ydAlzaV9wb3J0OworICAgIHVfY2hhciAgICAgIHNpX2xlbjsKKyAgICB1X2NoYXIgICAgICBzaV9mYW1pbHk7CisgICAgdV9zaG9ydCAgICAgc2lfcG9ydDsKIH07CiAKLSNkZWZpbmUgRU5JX05PU09DS0VUIAkwCi0jZGVmaW5lIEVOSV9OT1NFUlZOQU1FCTEKLSNkZWZpbmUgRU5JX05PSE9TVE5BTUUJMgotI2RlZmluZSBFTklfTUVNT1JZCTMKLSNkZWZpbmUgRU5JX1NZU1RFTQk0Ci0jZGVmaW5lIEVOSV9GQU1JTFkJNQotI2RlZmluZSBFTklfU0FMRU4JNgorI2RlZmluZSBFTklfTk9TT0NLRVQgICAgMAorI2RlZmluZSBFTklfTk9TRVJWTkFNRSAgMQorI2RlZmluZSBFTklfTk9IT1NUTkFNRSAgMgorI2RlZmluZSBFTklfTUVNT1JZICAgICAgMworI2RlZmluZSBFTklfU1lTVEVNICAgICAgNAorI2RlZmluZSBFTklfRkFNSUxZICAgICAgNQorI2RlZmluZSBFTklfU0FMRU4gICAgICAgNgogCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIHRvIG1ha2UgZ2NjIGhhcHB5ICovCiBpbnQgZ2V0bmFtZWluZm8gUHlfUFJPVE8oKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqLCBzaXplX3QsIGNoYXIgKiwgc2l6ZV90LAotCQkJICBjaGFyICosIHNpemVfdCwgaW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBpbnQpKTsKIAogaW50CiBnZXRuYW1laW5mbyhzYSwgc2FsZW4sIGhvc3QsIGhvc3RsZW4sIHNlcnYsIHNlcnZsZW4sIGZsYWdzKQotCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2E7Ci0Jc2l6ZV90IHNhbGVuOwotCWNoYXIgKmhvc3Q7Ci0Jc2l6ZV90IGhvc3RsZW47Ci0JY2hhciAqc2VydjsKLQlzaXplX3Qgc2VydmxlbjsKLQlpbnQgZmxhZ3M7CisgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYTsKKyAgICBzaXplX3Qgc2FsZW47CisgICAgY2hhciAqaG9zdDsKKyAgICBzaXplX3QgaG9zdGxlbjsKKyAgICBjaGFyICpzZXJ2OworICAgIHNpemVfdCBzZXJ2bGVuOworICAgIGludCBmbGFnczsKIHsKLQlzdHJ1Y3QgZ25pX2FmZCAqZ25pX2FmZDsKLQlzdHJ1Y3Qgc2VydmVudCAqc3A7Ci0Jc3RydWN0IGhvc3RlbnQgKmhwOwotCXVfc2hvcnQgcG9ydDsKLQlpbnQgZmFtaWx5LCBsZW4sIGk7Ci0JY2hhciAqYWRkciwgKnA7Ci0JdV9sb25nIHY0YTsKKyAgICBzdHJ1Y3QgZ25pX2FmZCAqZ25pX2FmZDsKKyAgICBzdHJ1Y3Qgc2VydmVudCAqc3A7CisgICAgc3RydWN0IGhvc3RlbnQgKmhwOworICAgIHVfc2hvcnQgcG9ydDsKKyAgICBpbnQgZmFtaWx5LCBsZW4sIGk7CisgICAgY2hhciAqYWRkciwgKnA7CisgICAgdV9sb25nIHY0YTsKICNpZmRlZiBFTkFCTEVfSVBWNgotCXVfY2hhciBwZng7CisgICAgdV9jaGFyIHBmeDsKICNlbmRpZgotCWludCBoX2Vycm9yOwotCWNoYXIgbnVtc2Vydls1MTJdOwotCWNoYXIgbnVtYWRkcls1MTJdOworICAgIGludCBoX2Vycm9yOworICAgIGNoYXIgbnVtc2Vydls1MTJdOworICAgIGNoYXIgbnVtYWRkcls1MTJdOwogCi0JaWYgKHNhID09IE5VTEwpCi0JCXJldHVybiBFTklfTk9TT0NLRVQ7CisgICAgaWYgKHNhID09IE5VTEwpCisgICAgICAgIHJldHVybiBFTklfTk9TT0NLRVQ7CiAKICNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCWxlbiA9IHNhLT5zYV9sZW47Ci0JaWYgKGxlbiAhPSBzYWxlbikgcmV0dXJuIEVOSV9TQUxFTjsKKyAgICBsZW4gPSBzYS0+c2FfbGVuOworICAgIGlmIChsZW4gIT0gc2FsZW4pIHJldHVybiBFTklfU0FMRU47CiAjZWxzZQotCWxlbiA9IHNhbGVuOworICAgIGxlbiA9IHNhbGVuOwogI2VuZGlmCi0JCi0JZmFtaWx5ID0gc2EtPnNhX2ZhbWlseTsKLQlmb3IgKGkgPSAwOyBnbmlfYWZkbFtpXS5hX2FmOyBpKyspCi0JCWlmIChnbmlfYWZkbFtpXS5hX2FmID09IGZhbWlseSkgewotCQkJZ25pX2FmZCA9ICZnbmlfYWZkbFtpXTsKLQkJCWdvdG8gZm91bmQ7Ci0JCX0KLQlyZXR1cm4gRU5JX0ZBTUlMWTsKLQkKKworICAgIGZhbWlseSA9IHNhLT5zYV9mYW1pbHk7CisgICAgZm9yIChpID0gMDsgZ25pX2FmZGxbaV0uYV9hZjsgaSsrKQorICAgICAgICBpZiAoZ25pX2FmZGxbaV0uYV9hZiA9PSBmYW1pbHkpIHsKKyAgICAgICAgICAgIGduaV9hZmQgPSAmZ25pX2FmZGxbaV07CisgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgICAgICB9CisgICAgcmV0dXJuIEVOSV9GQU1JTFk7CisKICBmb3VuZDoKLQlpZiAobGVuICE9IGduaV9hZmQtPmFfc29ja2xlbikgcmV0dXJuIEVOSV9TQUxFTjsKLQkKLQlwb3J0ID0gKChzdHJ1Y3QgZ25pX3NvY2tpbmV0ICopc2EpLT5zaV9wb3J0OyAvKiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KLQlhZGRyID0gKGNoYXIgKilzYSArIGduaV9hZmQtPmFfb2ZmOworICAgIGlmIChsZW4gIT0gZ25pX2FmZC0+YV9zb2NrbGVuKSByZXR1cm4gRU5JX1NBTEVOOwogCi0JaWYgKHNlcnYgPT0gTlVMTCB8fCBzZXJ2bGVuID09IDApIHsKLQkJLyogd2hhdCB3ZSBzaG91bGQgZG8/ICovCi0JfSBlbHNlIGlmIChmbGFncyAmIE5JX05VTUVSSUNTRVJWKSB7Ci0JCXNwcmludGYobnVtc2VydiwgIiVkIiwgbnRvaHMocG9ydCkpOwotCQlpZiAoc3RybGVuKG51bXNlcnYpID4gc2VydmxlbikKLQkJCXJldHVybiBFTklfTUVNT1JZOwotCQlzdHJjcHkoc2VydiwgbnVtc2Vydik7Ci0JfSBlbHNlIHsKLQkJc3AgPSBnZXRzZXJ2Ynlwb3J0KHBvcnQsIChmbGFncyAmIE5JX0RHUkFNKSA/ICJ1ZHAiIDogInRjcCIpOwotCQlpZiAoc3ApIHsKLQkJCWlmIChzdHJsZW4oc3AtPnNfbmFtZSkgPiBzZXJ2bGVuKQotCQkJCXJldHVybiBFTklfTUVNT1JZOwotCQkJc3RyY3B5KHNlcnYsIHNwLT5zX25hbWUpOwotCQl9IGVsc2UKLQkJCXJldHVybiBFTklfTk9TRVJWTkFNRTsKLQl9CisgICAgcG9ydCA9ICgoc3RydWN0IGduaV9zb2NraW5ldCAqKXNhKS0+c2lfcG9ydDsgLyogbmV0d29yayBieXRlIG9yZGVyICovCisgICAgYWRkciA9IChjaGFyICopc2EgKyBnbmlfYWZkLT5hX29mZjsKIAotCXN3aXRjaCAoc2EtPnNhX2ZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkJdjRhID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9hZGRyLnNfYWRkcjsKLQkJaWYgKElOX01VTFRJQ0FTVCh2NGEpIHx8IElOX0VYUEVSSU1FTlRBTCh2NGEpKQotCQkJZmxhZ3MgfD0gTklfTlVNRVJJQ0hPU1Q7Ci0JCXY0YSA+Pj0gSU5fQ0xBU1NBX05TSElGVDsKLQkJaWYgKHY0YSA9PSAwIHx8IHY0YSA9PSBJTl9MT09QQkFDS05FVCkKLQkJCWZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOwkJCQotCQlicmVhazsKKyAgICBpZiAoc2VydiA9PSBOVUxMIHx8IHNlcnZsZW4gPT0gMCkgeworICAgICAgICAvKiB3aGF0IHdlIHNob3VsZCBkbz8gKi8KKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgTklfTlVNRVJJQ1NFUlYpIHsKKyAgICAgICAgc3ByaW50ZihudW1zZXJ2LCAiJWQiLCBudG9ocyhwb3J0KSk7CisgICAgICAgIGlmIChzdHJsZW4obnVtc2VydikgPiBzZXJ2bGVuKQorICAgICAgICAgICAgcmV0dXJuIEVOSV9NRU1PUlk7CisgICAgICAgIHN0cmNweShzZXJ2LCBudW1zZXJ2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcCA9IGdldHNlcnZieXBvcnQocG9ydCwgKGZsYWdzICYgTklfREdSQU0pID8gInVkcCIgOiAidGNwIik7CisgICAgICAgIGlmIChzcCkgeworICAgICAgICAgICAgaWYgKHN0cmxlbihzcC0+c19uYW1lKSA+IHNlcnZsZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIEVOSV9NRU1PUlk7CisgICAgICAgICAgICBzdHJjcHkoc2Vydiwgc3AtPnNfbmFtZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIEVOSV9OT1NFUlZOQU1FOworICAgIH0KKworICAgIHN3aXRjaCAoc2EtPnNhX2ZhbWlseSkgeworICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgdjRhID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9hZGRyLnNfYWRkcjsKKyAgICAgICAgaWYgKElOX01VTFRJQ0FTVCh2NGEpIHx8IElOX0VYUEVSSU1FTlRBTCh2NGEpKQorICAgICAgICAgICAgZmxhZ3MgfD0gTklfTlVNRVJJQ0hPU1Q7CisgICAgICAgIHY0YSA+Pj0gSU5fQ0xBU1NBX05TSElGVDsKKyAgICAgICAgaWYgKHY0YSA9PSAwIHx8IHY0YSA9PSBJTl9MT09QQkFDS05FVCkKKyAgICAgICAgICAgIGZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOworICAgICAgICBicmVhazsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JCXBmeCA9ICgoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhKS0+c2luNl9hZGRyLnM2X2FkZHI4WzBdOwotCQlpZiAocGZ4ID09IDAgfHwgcGZ4ID09IDB4ZmUgfHwgcGZ4ID09IDB4ZmYpCi0JCQlmbGFncyB8PSBOSV9OVU1FUklDSE9TVDsKLQkJYnJlYWs7CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICAgICAgcGZ4ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X2FkZHIuczZfYWRkcjhbMF07CisgICAgICAgIGlmIChwZnggPT0gMCB8fCBwZnggPT0gMHhmZSB8fCBwZnggPT0gMHhmZikKKyAgICAgICAgICAgIGZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOworICAgICAgICBicmVhazsKICNlbmRpZgotCX0KLQlpZiAoaG9zdCA9PSBOVUxMIHx8IGhvc3RsZW4gPT0gMCkgewotCQkvKiB3aGF0IHNob3VsZCB3ZSBkbz8gKi8KLQl9IGVsc2UgaWYgKGZsYWdzICYgTklfTlVNRVJJQ0hPU1QpIHsKLQkJaWYgKGluZXRfbnRvcChnbmlfYWZkLT5hX2FmLCBhZGRyLCBudW1hZGRyLCBzaXplb2YobnVtYWRkcikpCi0JCSAgICA9PSBOVUxMKQotCQkJcmV0dXJuIEVOSV9TWVNURU07Ci0JCWlmIChzdHJsZW4obnVtYWRkcikgPiBob3N0bGVuKQotCQkJcmV0dXJuIEVOSV9NRU1PUlk7Ci0JCXN0cmNweShob3N0LCBudW1hZGRyKTsKLQl9IGVsc2UgeworICAgIH0KKyAgICBpZiAoaG9zdCA9PSBOVUxMIHx8IGhvc3RsZW4gPT0gMCkgeworICAgICAgICAvKiB3aGF0IHNob3VsZCB3ZSBkbz8gKi8KKyAgICB9IGVsc2UgaWYgKGZsYWdzICYgTklfTlVNRVJJQ0hPU1QpIHsKKyAgICAgICAgaWYgKGluZXRfbnRvcChnbmlfYWZkLT5hX2FmLCBhZGRyLCBudW1hZGRyLCBzaXplb2YobnVtYWRkcikpCisgICAgICAgICAgICA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIEVOSV9TWVNURU07CisgICAgICAgIGlmIChzdHJsZW4obnVtYWRkcikgPiBob3N0bGVuKQorICAgICAgICAgICAgcmV0dXJuIEVOSV9NRU1PUlk7CisgICAgICAgIHN0cmNweShob3N0LCBudW1hZGRyKTsKKyAgICB9IGVsc2UgewogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCWhwID0gZ2V0aXBub2RlYnlhZGRyKGFkZHIsIGduaV9hZmQtPmFfYWRkcmxlbiwgZ25pX2FmZC0+YV9hZiwgJmhfZXJyb3IpOworICAgICAgICBocCA9IGdldGlwbm9kZWJ5YWRkcihhZGRyLCBnbmlfYWZkLT5hX2FkZHJsZW4sIGduaV9hZmQtPmFfYWYsICZoX2Vycm9yKTsKICNlbHNlCi0JCWhwID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBnbmlfYWZkLT5hX2FkZHJsZW4sIGduaV9hZmQtPmFfYWYpOwotCQloX2Vycm9yID0gaF9lcnJubzsKKyAgICAgICAgaHAgPSBnZXRob3N0YnlhZGRyKGFkZHIsIGduaV9hZmQtPmFfYWRkcmxlbiwgZ25pX2FmZC0+YV9hZik7CisgICAgICAgIGhfZXJyb3IgPSBoX2Vycm5vOwogI2VuZGlmCiAKLQkJaWYgKGhwKSB7Ci0JCQlpZiAoZmxhZ3MgJiBOSV9OT0ZRRE4pIHsKLQkJCQlwID0gc3RyY2hyKGhwLT5oX25hbWUsICcuJyk7Ci0JCQkJaWYgKHApICpwID0gJ1wwJzsKLQkJCX0KLQkJCWlmIChzdHJsZW4oaHAtPmhfbmFtZSkgPiBob3N0bGVuKSB7CisgICAgICAgIGlmIChocCkgeworICAgICAgICAgICAgaWYgKGZsYWdzICYgTklfTk9GUUROKSB7CisgICAgICAgICAgICAgICAgcCA9IHN0cmNocihocC0+aF9uYW1lLCAnLicpOworICAgICAgICAgICAgICAgIGlmIChwKSAqcCA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RybGVuKGhwLT5oX25hbWUpID4gaG9zdGxlbikgewogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCQkJZnJlZWhvc3RlbnQoaHApOworICAgICAgICAgICAgICAgIGZyZWVob3N0ZW50KGhwKTsKICNlbmRpZgotCQkJCXJldHVybiBFTklfTUVNT1JZOwotCQkJfQotCQkJc3RyY3B5KGhvc3QsIGhwLT5oX25hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBFTklfTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyY3B5KGhvc3QsIGhwLT5oX25hbWUpOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCQlmcmVlaG9zdGVudChocCk7CisgICAgICAgICAgICBmcmVlaG9zdGVudChocCk7CiAjZW5kaWYKLQkJfSBlbHNlIHsKLQkJCWlmIChmbGFncyAmIE5JX05BTUVSRVFEKQotCQkJCXJldHVybiBFTklfTk9IT1NUTkFNRTsKLQkJCWlmIChpbmV0X250b3AoZ25pX2FmZC0+YV9hZiwgYWRkciwgbnVtYWRkciwgc2l6ZW9mKG51bWFkZHIpKQotCQkJICAgID09IE5VTEwpCi0JCQkJcmV0dXJuIEVOSV9OT0hPU1ROQU1FOwotCQkJaWYgKHN0cmxlbihudW1hZGRyKSA+IGhvc3RsZW4pCi0JCQkJcmV0dXJuIEVOSV9NRU1PUlk7Ci0JCQlzdHJjcHkoaG9zdCwgbnVtYWRkcik7Ci0JCX0KLQl9Ci0JcmV0dXJuIFNVQ0NFU1M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBOSV9OQU1FUkVRRCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRU5JX05PSE9TVE5BTUU7CisgICAgICAgICAgICBpZiAoaW5ldF9udG9wKGduaV9hZmQtPmFfYWYsIGFkZHIsIG51bWFkZHIsIHNpemVvZihudW1hZGRyKSkKKyAgICAgICAgICAgICAgICA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFTklfTk9IT1NUTkFNRTsKKyAgICAgICAgICAgIGlmIChzdHJsZW4obnVtYWRkcikgPiBob3N0bGVuKQorICAgICAgICAgICAgICAgIHJldHVybiBFTklfTUVNT1JZOworICAgICAgICAgICAgc3RyY3B5KGhvc3QsIG51bWFkZHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRwYXRoLmMgYi9Nb2R1bGVzL2dldHBhdGguYwppbmRleCA2ODJhZDNlLi45NjUzZDNlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2dldHBhdGguYworKysgYi9Nb2R1bGVzL2dldHBhdGguYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAgICAgICAgICAgICBidWZmZXJbbisrXSA9IFNFUDsKICAgICB9CiAgICAgaWYgKG4gPiBNQVhQQVRITEVOKQotICAgIAlQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aC5jJ3Mgam9pbnBhdGgoKSIpOworICAgICAgICBQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aC5jJ3Mgam9pbnBhdGgoKSIpOwogICAgIGsgPSBzdHJsZW4oc3R1ZmYpOwogICAgIGlmIChuICsgayA+IE1BWFBBVEhMRU4pCiAgICAgICAgIGsgPSBNQVhQQVRITEVOIC0gbjsKQEAgLTM5MywxMyArMzkzLDEzIEBACiAjZW5kaWYKICNlbmRpZgogCi0JLyogSWYgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIGFyZ3YwIHBhdGgsIHRoZW4gd2UgaGF2ZSB0bwotCSAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubwotCSAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCi0JICogJFBBVEggaXNuJ3QgZXhwb3J0ZWQsIHlvdSBsb3NlLgotCSAqLwotCWlmIChzdHJjaHIocHJvZywgU0VQKSkKLQkJc3RybmNweShwcm9ncGF0aCwgcHJvZywgTUFYUEFUSExFTik7CisgICAgICAgIC8qIElmIHRoZXJlIGlzIG5vIHNsYXNoIGluIHRoZSBhcmd2MCBwYXRoLCB0aGVuIHdlIGhhdmUgdG8KKyAgICAgICAgICogYXNzdW1lIHB5dGhvbiBpcyBvbiB0aGUgdXNlcidzICRQQVRILCBzaW5jZSB0aGVyZSdzIG5vCisgICAgICAgICAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCisgICAgICAgICAqICRQQVRIIGlzbid0IGV4cG9ydGVkLCB5b3UgbG9zZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzdHJjaHIocHJvZywgU0VQKSkKKyAgICAgICAgICAgICAgICBzdHJuY3B5KHByb2dwYXRoLCBwcm9nLCBNQVhQQVRITEVOKTsKICNpZmRlZiBfX0FQUExFX18KICAgICAgLyogT24gTWFjIE9TIFgsIGlmIGEgc2NyaXB0IHVzZXMgYW4gaW50ZXJwcmV0ZXIgb2YgdGhlIGZvcm0KICAgICAgICogIiMhL29wdC9weXRob24yLjMvYmluL3B5dGhvbiIsIHRoZSBrZXJuZWwgb25seSBwYXNzZXMgInB5dGhvbiIKQEAgLTQxNCw0NCArNDE0LDQ0IEBACiAgICAgIGVsc2UgaWYoMCA9PSBfTlNHZXRFeGVjdXRhYmxlUGF0aChwcm9ncGF0aCwgJm5zZXhlY2xlbmd0aCkgJiYgcHJvZ3BhdGhbMF0gPT0gU0VQKQogICAgICAgIDsKICNlbmRpZiAvKiBfX0FQUExFX18gKi8KLQllbHNlIGlmIChwYXRoKSB7Ci0JCXdoaWxlICgxKSB7Ci0JCQljaGFyICpkZWxpbSA9IHN0cmNocihwYXRoLCBERUxJTSk7CisgICAgICAgIGVsc2UgaWYgKHBhdGgpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOwogCi0JCQlpZiAoZGVsaW0pIHsKLQkJCQlzaXplX3QgbGVuID0gZGVsaW0gLSBwYXRoOwotCQkJCWlmIChsZW4gPiBNQVhQQVRITEVOKQotCQkJCQlsZW4gPSBNQVhQQVRITEVOOwotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7Ci0JCQkJKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOwotCQkJfQotCQkJZWxzZQotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIE1BWFBBVEhMRU4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGltKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBkZWxpbSAtIHBhdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiBNQVhQQVRITEVOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IE1BWFBBVEhMRU47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHJvZ3BhdGggKyBsZW4pID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcGF0aCwgTUFYUEFUSExFTik7CiAKLQkJCWpvaW5wYXRoKHByb2dwYXRoLCBwcm9nKTsKLQkJCWlmIChpc3hmaWxlKHByb2dwYXRoKSkKLQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5wYXRoKHByb2dwYXRoLCBwcm9nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3hmaWxlKHByb2dwYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCWlmICghZGVsaW0pIHsKLQkJCQlwcm9ncGF0aFswXSA9ICdcMCc7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwYXRoID0gZGVsaW0gKyAxOwotCQl9Ci0JfQotCWVsc2UKLQkJcHJvZ3BhdGhbMF0gPSAnXDAnOwotCWlmIChwcm9ncGF0aFswXSAhPSBTRVAgJiYgcHJvZ3BhdGhbMF0gIT0gJ1wwJykKLQkJYWJzb2x1dGl6ZShwcm9ncGF0aCk7Ci0Jc3RybmNweShhcmd2MF9wYXRoLCBwcm9ncGF0aCwgTUFYUEFUSExFTik7Ci0JYXJndjBfcGF0aFtNQVhQQVRITEVOXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbGltKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dwYXRoWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gZGVsaW0gKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJvZ3BhdGhbMF0gPSAnXDAnOworICAgICAgICBpZiAocHJvZ3BhdGhbMF0gIT0gU0VQICYmIHByb2dwYXRoWzBdICE9ICdcMCcpCisgICAgICAgICAgICAgICAgYWJzb2x1dGl6ZShwcm9ncGF0aCk7CisgICAgICAgIHN0cm5jcHkoYXJndjBfcGF0aCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pOworICAgICAgICBhcmd2MF9wYXRoW01BWFBBVEhMRU5dID0gJ1wwJzsKIAogI2lmZGVmIFdJVEhfTkVYVF9GUkFNRVdPUksKLQkvKiBPbiBNYWMgT1MgWCB3ZSBoYXZlIGEgc3BlY2lhbCBjYXNlIGlmIHdlJ3JlIHJ1bm5pbmcgZnJvbSBhIGZyYW1ld29yay4KLQkqKiBUaGlzIGlzIGJlY2F1c2UgdGhlIHB5dGhvbiBob21lIHNob3VsZCBiZSBzZXQgcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnksCi0JKiogd2hpY2ggaXMgaW4gdGhlIGZyYW1ld29yaywgbm90IHJlbGF0aXZlIHRvIHRoZSBleGVjdXRhYmxlLCB3aGljaCBtYXkKLQkqKiBiZSBvdXRzaWRlIG9mIHRoZSBmcmFtZXdvcmsuIEV4Y2VwdCB3aGVuIHdlJ3JlIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuLi4KLQkqLworICAgICAgICAvKiBPbiBNYWMgT1MgWCB3ZSBoYXZlIGEgc3BlY2lhbCBjYXNlIGlmIHdlJ3JlIHJ1bm5pbmcgZnJvbSBhIGZyYW1ld29yay4KKyAgICAgICAgKiogVGhpcyBpcyBiZWNhdXNlIHRoZSBweXRob24gaG9tZSBzaG91bGQgYmUgc2V0IHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5LAorICAgICAgICAqKiB3aGljaCBpcyBpbiB0aGUgZnJhbWV3b3JrLCBub3QgcmVsYXRpdmUgdG8gdGhlIGV4ZWN1dGFibGUsIHdoaWNoIG1heQorICAgICAgICAqKiBiZSBvdXRzaWRlIG9mIHRoZSBmcmFtZXdvcmsuIEV4Y2VwdCB3aGVuIHdlJ3JlIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuLi4KKyAgICAgICAgKi8KICAgICBweXRob25Nb2R1bGUgPSBOU01vZHVsZUZvclN5bWJvbChOU0xvb2t1cEFuZEJpbmRTeW1ib2woIl9QeV9Jbml0aWFsaXplIikpOwogICAgIC8qIFVzZSBkeWxpYiBmdW5jdGlvbnMgdG8gZmluZCBvdXQgd2hlcmUgdGhlIGZyYW1ld29yayB3YXMgbG9hZGVkIGZyb20gKi8KICAgICBidWYgPSAoY2hhciAqKU5TTGlicmFyeU5hbWVGb3JNb2R1bGUocHl0aG9uTW9kdWxlKTsKQEAgLTUyNSw3ICs1MjUsNyBAQAogICAgIGVsc2UKICAgICAgICAgc3RybmNweSh6aXBfcGF0aCwgUFJFRklYLCBNQVhQQVRITEVOKTsKICAgICBqb2lucGF0aCh6aXBfcGF0aCwgImxpYi9weXRob24wMC56aXAiKTsKLSAgICBidWZzeiA9IHN0cmxlbih6aXBfcGF0aCk7CS8qIFJlcGxhY2UgIjAwIiB3aXRoIHZlcnNpb24gKi8KKyAgICBidWZzeiA9IHN0cmxlbih6aXBfcGF0aCk7ICAgLyogUmVwbGFjZSAiMDAiIHdpdGggdmVyc2lvbiAqLwogICAgIHppcF9wYXRoW2J1ZnN6IC0gNl0gPSBWRVJTSU9OWzBdOwogICAgIHppcF9wYXRoW2J1ZnN6IC0gNV0gPSBWRVJTSU9OWzJdOwogCkBAIC02MzMsMTAgKzYzMywxMCBAQAogICAgIGlmIChwZm91bmQgPiAwKSB7CiAgICAgICAgIHJlZHVjZShwcmVmaXgpOwogICAgICAgICByZWR1Y2UocHJlZml4KTsKLQkvKiBUaGUgcHJlZml4IGlzIHRoZSByb290IGRpcmVjdG9yeSwgYnV0IHJlZHVjZSgpIGNob3BwZWQKLQkgKiBvZmYgdGhlICIvIi4gKi8KLQlpZiAoIXByZWZpeFswXSkKLQkJc3RyY3B5KHByZWZpeCwgc2VwYXJhdG9yKTsKKyAgICAgICAgLyogVGhlIHByZWZpeCBpcyB0aGUgcm9vdCBkaXJlY3RvcnksIGJ1dCByZWR1Y2UoKSBjaG9wcGVkCisgICAgICAgICAqIG9mZiB0aGUgIi8iLiAqLworICAgICAgICBpZiAoIXByZWZpeFswXSkKKyAgICAgICAgICAgICAgICBzdHJjcHkocHJlZml4LCBzZXBhcmF0b3IpOwogICAgIH0KICAgICBlbHNlCiAgICAgICAgIHN0cm5jcHkocHJlZml4LCBQUkVGSVgsIE1BWFBBVEhMRU4pOwpAQCAtNjQ1LDggKzY0NSw4IEBACiAgICAgICAgIHJlZHVjZShleGVjX3ByZWZpeCk7CiAgICAgICAgIHJlZHVjZShleGVjX3ByZWZpeCk7CiAgICAgICAgIHJlZHVjZShleGVjX3ByZWZpeCk7Ci0JaWYgKCFleGVjX3ByZWZpeFswXSkKLQkJc3RyY3B5KGV4ZWNfcHJlZml4LCBzZXBhcmF0b3IpOworICAgICAgICBpZiAoIWV4ZWNfcHJlZml4WzBdKQorICAgICAgICAgICAgICAgIHN0cmNweShleGVjX3ByZWZpeCwgc2VwYXJhdG9yKTsKICAgICB9CiAgICAgZWxzZQogICAgICAgICBzdHJuY3B5KGV4ZWNfcHJlZml4LCBFWEVDX1BSRUZJWCwgTUFYUEFUSExFTik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dsbW9kdWxlLmMgYi9Nb2R1bGVzL2dsbW9kdWxlLmMKaW5kZXggMDFkYjlmYy4uYjljNjRmYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9nbG1vZHVsZS5jCisrKyBiL01vZHVsZXMvZ2xtb2R1bGUuYwpAQCAtMTAsMjYgKzEwLDI2IEBACiA8cmV0dXJudHlwZT4gY2FuIGJlOiB2b2lkLCBzaG9ydCwgbG9uZyAoWFhYIG1heWJlIG90aGVycz8pCiAKIDx0eXBlPiBjYW4gYmU6IGNoYXIsIHN0cmluZywgc2hvcnQsIGZsb2F0LCBsb25nLCBvciBkb3VibGUKLQlzdHJpbmcgaW5kaWNhdGVzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZzsKLQlpZiA8dHlwZT4gaXMgY2hhciBhbmQgPGFyZz4gYmVnaW5zIHdpdGggYSAqLCB0aGUgKiBpcyBzdHJpcHBlZAotCWFuZCA8dHlwZT4gaXMgY2hhbmdlZCBpbnRvIHN0cmluZworICAgIHN0cmluZyBpbmRpY2F0ZXMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nOworICAgIGlmIDx0eXBlPiBpcyBjaGFyIGFuZCA8YXJnPiBiZWdpbnMgd2l0aCBhICosIHRoZSAqIGlzIHN0cmlwcGVkCisgICAgYW5kIDx0eXBlPiBpcyBjaGFuZ2VkIGludG8gc3RyaW5nCiAKIDxhcmc+IGhhcyB0aGUgZm9ybSA8bW9kZT4gb3IgPG1vZGU+WzxzdWJzY3JpcHQ+XQotCXdoZXJlIDxtb2RlPiBjYW4gYmUKLQkJczogYXJnIGlzIHNlbnQKLQkJcjogYXJnIGlzIHJlY2VpdmVkCQkoYXJnIGlzIGEgcG9pbnRlcikKLQlhbmQgPHN1YnNjcmlwdD4gY2FuIGJlIChOIGFuZCBJIGFyZSBudW1iZXJzKToKLQkJTgotCQlhcmdJCi0JCXJldHZhbAotCQlOKmFyZ0kKLQkJTipJCi0JCU4qcmV0dmFsCi0JSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHN1YnNjcmlwdCBjb25zaXN0cyBvZiB0d28gcGFydHMKLQlzZXBhcmF0ZWQgYnkgKiwgdGhlIGZpcnN0IHBhcnQgaXMgdGhlIHdpZHRoIG9mIHRoZSBtYXRyaXgsIGFuZAotCXRoZSBzZWNvbmQgcGFydCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRyaXguICBUaGlzIG9yZGVyIGlzCi0Jb3Bwb3NpdGUgZnJvbSB0aGUgb3JkZXIgdXNlZCBpbiBDIHRvIGRlY2xhcmUgYSB0d28tZGltZW5zaW9uYWwKLQltYXRyaXguCisgICAgd2hlcmUgPG1vZGU+IGNhbiBiZQorICAgICAgICBzOiBhcmcgaXMgc2VudAorICAgICAgICByOiBhcmcgaXMgcmVjZWl2ZWQgICAgICAgICAgICAgICAgICAgICAgKGFyZyBpcyBhIHBvaW50ZXIpCisgICAgYW5kIDxzdWJzY3JpcHQ+IGNhbiBiZSAoTiBhbmQgSSBhcmUgbnVtYmVycyk6CisgICAgICAgIE4KKyAgICAgICAgYXJnSQorICAgICAgICByZXR2YWwKKyAgICAgICAgTiphcmdJCisgICAgICAgIE4qSQorICAgICAgICBOKnJldHZhbAorICAgIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBzdWJzY3JpcHQgY29uc2lzdHMgb2YgdHdvIHBhcnRzCisgICAgc2VwYXJhdGVkIGJ5ICosIHRoZSBmaXJzdCBwYXJ0IGlzIHRoZSB3aWR0aCBvZiB0aGUgbWF0cml4LCBhbmQKKyAgICB0aGUgc2Vjb25kIHBhcnQgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0cml4LiAgVGhpcyBvcmRlciBpcworICAgIG9wcG9zaXRlIGZyb20gdGhlIG9yZGVyIHVzZWQgaW4gQyB0byBkZWNsYXJlIGEgdHdvLWRpbWVuc2lvbmFsCisgICAgbWF0cml4LgogKi8KIAogLyoKQEAgLTYyLDE3ICs2MiwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3FyZWFkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlzaG9ydCBhcmcxIDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmV0dmFsID0gcXJlYWQoICYgYXJnMSApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAyICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2xvbmdvYmplY3QocmV0dmFsKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgbG9uZyByZXR2YWw7CisgICAgc2hvcnQgYXJnMSA7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJldHZhbCA9IHFyZWFkKCAmIGFyZzEgKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdsb25nb2JqZWN0KHJldHZhbCkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAKQEAgLTkxLDY0ICs5MSw2NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3ZhcnJheShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnYsICp3PU5VTEw7Ci0JaW50IGksIG4sIHdpZHRoOwotCWRvdWJsZSB2ZWNbM107Ci0JUHlPYmplY3QgKiAoKmdldGl0ZW0pKFB5T2JqZWN0ICosIGludCk7Ci0JCi0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgMSwgMCwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiAoUHlMaXN0X0NoZWNrKHYpKSB7Ci0JCW4gPSBQeUxpc3RfU2l6ZSh2KTsKLQkJZ2V0aXRlbSA9IFB5TGlzdF9HZXRJdGVtOwotCX0KLQllbHNlIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCW4gPSBQeVR1cGxlX1NpemUodik7Ci0JCWdldGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW07Ci0JfQotCWVsc2UgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCi0JaWYgKG4gPT0gMCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlpZiAobiA+IDApCi0JCXcgPSAoKmdldGl0ZW0pKHYsIDApOwotCQotCXdpZHRoID0gMDsKLQlpZiAodyA9PSBOVUxMKSB7Ci0JfQotCWVsc2UgaWYgKFB5TGlzdF9DaGVjayh3KSkgewotCQl3aWR0aCA9IFB5TGlzdF9TaXplKHcpOwotCX0KLQllbHNlIGlmIChQeVR1cGxlX0NoZWNrKHcpKSB7Ci0JCXdpZHRoID0gUHlUdXBsZV9TaXplKHcpOwotCX0KLQkKLQlzd2l0Y2ggKHdpZHRoKSB7Ci0JY2FzZSAyOgotCQl2ZWNbMl0gPSAwLjA7Ci0JCS8qIEZhbGwgdGhyb3VnaCAqLwotCWNhc2UgMzoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJdyA9ICgqZ2V0aXRlbSkodiwgaSk7Ci0JCWlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkodywgMSwgMCwgd2lkdGgsIHZlYykpCi0JCQlyZXR1cm4gTlVMTDsKLQkJdjNkKHZlYyk7Ci0JfQotCQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqdiwgKnc9TlVMTDsKKyAgICBpbnQgaSwgbiwgd2lkdGg7CisgICAgZG91YmxlIHZlY1szXTsKKyAgICBQeU9iamVjdCAqICgqZ2V0aXRlbSkoUHlPYmplY3QgKiwgaW50KTsKKworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDEsIDAsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIG4gPSBQeUxpc3RfU2l6ZSh2KTsKKyAgICAgICAgZ2V0aXRlbSA9IFB5TGlzdF9HZXRJdGVtOworICAgIH0KKyAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgIG4gPSBQeVR1cGxlX1NpemUodik7CisgICAgICAgIGdldGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGlmIChuID4gMCkKKyAgICAgICAgdyA9ICgqZ2V0aXRlbSkodiwgMCk7CisKKyAgICB3aWR0aCA9IDA7CisgICAgaWYgKHcgPT0gTlVMTCkgeworICAgIH0KKyAgICBlbHNlIGlmIChQeUxpc3RfQ2hlY2sodykpIHsKKyAgICAgICAgd2lkdGggPSBQeUxpc3RfU2l6ZSh3KTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh3KSkgeworICAgICAgICB3aWR0aCA9IFB5VHVwbGVfU2l6ZSh3KTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHdpZHRoKSB7CisgICAgY2FzZSAyOgorICAgICAgICB2ZWNbMl0gPSAwLjA7CisgICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgMzoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICB3ID0gKCpnZXRpdGVtKSh2LCBpKTsKKyAgICAgICAgaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheSh3LCAxLCAwLCB3aWR0aCwgdmVjKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB2M2QodmVjKTsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qCkBAIC0xNzAsMTQgKzE3MCwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX252YXJyYXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5fbnZhcnJheShhcmdzLCAwKTsKKyAgICByZXR1cm4gZ2VuX252YXJyYXkoYXJncywgMCk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3ZuYXJyYXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBnZW5fbnZhcnJheShhcmdzLCAxKTsKKyAgICByZXR1cm4gZ2VuX252YXJyYXkoYXJncywgMSk7CiB9CiAKIC8qIEdlbmVyaWMsIGludGVybmFsIHZlcnNpb24gb2Yge252LG52fWFycmF5OiBpbm9ybSBpbmRpY2F0ZXMgdGhlCkBAIC0xODYsNDQgKzE4Niw0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9udmFycmF5KFB5T2JqZWN0ICphcmdzLCBpbnQgaW5vcm0pCiB7Ci0JUHlPYmplY3QgKnYsICp3LCAqd25vcm0sICp3dmVjOwotCWludCBpLCBuOwotCWZsb2F0IG5vcm1bM10sIHZlY1szXTsKLQlQeU9iamVjdCAqICgqZ2V0aXRlbSkoUHlPYmplY3QgKiwgaW50KTsKLQkKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCAxLCAwLCAmdikpCi0JCXJldHVybiBOVUxMOwotCQotCWlmIChQeUxpc3RfQ2hlY2sodikpIHsKLQkJbiA9IFB5TGlzdF9TaXplKHYpOwotCQlnZXRpdGVtID0gUHlMaXN0X0dldEl0ZW07Ci0JfQotCWVsc2UgaWYgKFB5VHVwbGVfQ2hlY2sodikpIHsKLQkJbiA9IFB5VHVwbGVfU2l6ZSh2KTsKLQkJZ2V0aXRlbSA9IFB5VHVwbGVfR2V0SXRlbTsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXcgPSAoKmdldGl0ZW0pKHYsIGkpOwotCQlpZiAoIVB5VHVwbGVfQ2hlY2sodykgfHwgUHlUdXBsZV9TaXplKHcpICE9IDIpIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQl3bm9ybSA9IFB5VHVwbGVfR2V0SXRlbSh3LCBpbm9ybSk7Ci0JCXd2ZWMgPSBQeVR1cGxlX0dldEl0ZW0odywgMSAtIGlub3JtKTsKLQkJaWYgKCFQeUFyZ19HZXRGbG9hdEFycmF5KHdub3JtLCAxLCAwLCAzLCBub3JtKSB8fAotCQkJIVB5QXJnX0dldEZsb2F0QXJyYXkod3ZlYywgMSwgMCwgMywgdmVjKSkKLQkJCXJldHVybiBOVUxMOwotCQluM2Yobm9ybSk7Ci0JCXYzZih2ZWMpOwotCX0KLQkKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlPYmplY3QgKnYsICp3LCAqd25vcm0sICp3dmVjOworICAgIGludCBpLCBuOworICAgIGZsb2F0IG5vcm1bM10sIHZlY1szXTsKKyAgICBQeU9iamVjdCAqICgqZ2V0aXRlbSkoUHlPYmplY3QgKiwgaW50KTsKKworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDEsIDAsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIG4gPSBQeUxpc3RfU2l6ZSh2KTsKKyAgICAgICAgZ2V0aXRlbSA9IFB5TGlzdF9HZXRJdGVtOworICAgIH0KKyAgICBlbHNlIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgIG4gPSBQeVR1cGxlX1NpemUodik7CisgICAgICAgIGdldGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHcgPSAoKmdldGl0ZW0pKHYsIGkpOworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2sodykgfHwgUHlUdXBsZV9TaXplKHcpICE9IDIpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB3bm9ybSA9IFB5VHVwbGVfR2V0SXRlbSh3LCBpbm9ybSk7CisgICAgICAgIHd2ZWMgPSBQeVR1cGxlX0dldEl0ZW0odywgMSAtIGlub3JtKTsKKyAgICAgICAgaWYgKCFQeUFyZ19HZXRGbG9hdEFycmF5KHdub3JtLCAxLCAwLCAzLCBub3JtKSB8fAorICAgICAgICAgICAgIVB5QXJnX0dldEZsb2F0QXJyYXkod3ZlYywgMSwgMCwgMywgdmVjKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBuM2Yobm9ybSk7CisgICAgICAgIHYzZih2ZWMpOworICAgIH0KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogbnVyYnNzdXJmYWNlKHNfa25vdHNbXSwgdF9rbm90c1tdLCBjdGxbXVtdLCBzX29yZGVyLCB0X29yZGVyLCB0eXBlKS4KQEAgLTIzNSw4MyArMjM1LDgzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbnVyYnNzdXJmYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWRvdWJsZSAqIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JZG91YmxlICogYXJnNCA7Ci0JZG91YmxlICphcmc1IDsKLQlsb25nIGFyZzYgOwotCWxvbmcgYXJnNyA7Ci0JbG9uZyBhcmc4IDsKLQlsb25nIG5jb29yZHM7Ci0JbG9uZyBzX2J5dGVfc3RyaWRlLCB0X2J5dGVfc3RyaWRlOwotCWxvbmcgc19uY3RsLCB0X25jdGw7Ci0JbG9uZyBzLCB0OwotCVB5T2JqZWN0ICp2LCAqdywgKnB0OwotCWRvdWJsZSAqcG5leHQ7Ci0JaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIDYsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmcyID0gUHlNZW1fTkVXKGRvdWJsZSwgYXJnMSApKSA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KGFyZ3MsIDYsIDAsIGFyZzEgLCBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIDYsIDEsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmc0ID0gUHlNZW1fTkVXKGRvdWJsZSwgYXJnMyApKSA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KGFyZ3MsIDYsIDEsIGFyZzMgLCBhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDYsIDMsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDYsIDQsICZhcmc3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDYsIDUsICZhcmc4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFyZzggPT0gTl9YWVopCi0JCW5jb29yZHMgPSAzOwotCWVsc2UgaWYgKGFyZzggPT0gTl9YWVpXKQotCQluY29vcmRzID0gNDsKLQllbHNlIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNfbmN0bCA9IGFyZzEgLSBhcmc2OwotCXRfbmN0bCA9IGFyZzMgLSBhcmc3OwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDYsIDIsICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sodikgfHwgUHlMaXN0X1NpemUodikgIT0gc19uY3RsKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoKGFyZzUgPSBQeU1lbV9ORVcoZG91YmxlLCBzX25jdGwqdF9uY3RsKm5jb29yZHMgKSkgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JcG5leHQgPSBhcmc1OwotCWZvciAocyA9IDA7IHMgPCBzX25jdGw7IHMrKykgewotCQl3ID0gUHlMaXN0X0dldEl0ZW0odiwgcyk7Ci0JCWlmICh3ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh3KSB8fAotCQkJCQlQeUxpc3RfU2l6ZSh3KSAhPSB0X25jdGwpIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmb3IgKHQgPSAwOyB0IDwgdF9uY3RsOyB0KyspIHsKLQkJCXB0ID0gUHlMaXN0X0dldEl0ZW0odywgdCk7Ci0JCQlpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KHB0LCAxLCAwLCBuY29vcmRzLCBwbmV4dCkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlwbmV4dCArPSBuY29vcmRzOwotCQl9Ci0JfQotCXNfYnl0ZV9zdHJpZGUgPSBzaXplb2YoZG91YmxlKSAqIG5jb29yZHM7Ci0JdF9ieXRlX3N0cmlkZSA9IHNfYnl0ZV9zdHJpZGUgKiBzX25jdGw7Ci0JbnVyYnNzdXJmYWNlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwKLQkJc19ieXRlX3N0cmlkZSAsIHRfYnl0ZV9zdHJpZGUgLCBhcmc1ICwgYXJnNiAsIGFyZzcgLCBhcmc4ICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmc0KTsKLQlQeU1lbV9ERUwoYXJnNSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZG91YmxlICogYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBkb3VibGUgKiBhcmc0IDsKKyAgICBkb3VibGUgKmFyZzUgOworICAgIGxvbmcgYXJnNiA7CisgICAgbG9uZyBhcmc3IDsKKyAgICBsb25nIGFyZzggOworICAgIGxvbmcgbmNvb3JkczsKKyAgICBsb25nIHNfYnl0ZV9zdHJpZGUsIHRfYnl0ZV9zdHJpZGU7CisgICAgbG9uZyBzX25jdGwsIHRfbmN0bDsKKyAgICBsb25nIHMsIHQ7CisgICAgUHlPYmplY3QgKnYsICp3LCAqcHQ7CisgICAgZG91YmxlICpwbmV4dDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmdBcnJheVNpemUoYXJncywgNiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzIgPSBQeU1lbV9ORVcoZG91YmxlLCBhcmcxICkpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIGlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkoYXJncywgNiwgMCwgYXJnMSAsIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmdBcnJheVNpemUoYXJncywgNiwgMSwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzQgPSBQeU1lbV9ORVcoZG91YmxlLCBhcmczICkpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIGlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkoYXJncywgNiwgMSwgYXJnMyAsIGFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNiwgMywgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNiwgNCwgJmFyZzcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNiwgNSwgJmFyZzgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJnOCA9PSBOX1hZWikKKyAgICAgICAgbmNvb3JkcyA9IDM7CisgICAgZWxzZSBpZiAoYXJnOCA9PSBOX1hZWlcpCisgICAgICAgIG5jb29yZHMgPSA0OworICAgIGVsc2UgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc19uY3RsID0gYXJnMSAtIGFyZzY7CisgICAgdF9uY3RsID0gYXJnMyAtIGFyZzc7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNiwgMiwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayh2KSB8fCBQeUxpc3RfU2l6ZSh2KSAhPSBzX25jdGwpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoYXJnNSA9IFB5TWVtX05FVyhkb3VibGUsIHNfbmN0bCp0X25jdGwqbmNvb3JkcyApKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBwbmV4dCA9IGFyZzU7CisgICAgZm9yIChzID0gMDsgcyA8IHNfbmN0bDsgcysrKSB7CisgICAgICAgIHcgPSBQeUxpc3RfR2V0SXRlbSh2LCBzKTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9TaXplKHcpICE9IHRfbmN0bCkgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGZvciAodCA9IDA7IHQgPCB0X25jdGw7IHQrKykgeworICAgICAgICAgICAgcHQgPSBQeUxpc3RfR2V0SXRlbSh3LCB0KTsKKyAgICAgICAgICAgIGlmICghUHlBcmdfR2V0RG91YmxlQXJyYXkocHQsIDEsIDAsIG5jb29yZHMsIHBuZXh0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHBuZXh0ICs9IG5jb29yZHM7CisgICAgICAgIH0KKyAgICB9CisgICAgc19ieXRlX3N0cmlkZSA9IHNpemVvZihkb3VibGUpICogbmNvb3JkczsKKyAgICB0X2J5dGVfc3RyaWRlID0gc19ieXRlX3N0cmlkZSAqIHNfbmN0bDsKKyAgICBudXJic3N1cmZhY2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLAorICAgICAgICBzX2J5dGVfc3RyaWRlICwgdF9ieXRlX3N0cmlkZSAsIGFyZzUgLCBhcmc2ICwgYXJnNyAsIGFyZzggKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlNZW1fREVMKGFyZzQpOworICAgIFB5TWVtX0RFTChhcmc1KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIG51cmJzY3VydmUoa25vdHMsIGN0bHBvaW50cywgb3JkZXIsIHR5cGUpLgpAQCAtMzIxLDU3ICszMjEsNTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9udXJic2N1cnZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWRvdWJsZSAqIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JZG91YmxlICogYXJnNCA7Ci0JbG9uZyBhcmc1IDsKLQlsb25nIGFyZzYgOwotCWludCBuY29vcmRzLCBucG9pbnRzOwotCWludCBpOwotCVB5T2JqZWN0ICp2OwotCWRvdWJsZSAqcG5leHQ7Ci0JaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmcyID0gUHlNZW1fTkVXKGRvdWJsZSwgYXJnMSApKSA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KLQlpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KGFyZ3MsIDQsIDAsIGFyZzEgLCBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDIsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDMsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFyZzYgPT0gTl9TVCkKLQkJbmNvb3JkcyA9IDI7Ci0JZWxzZSBpZiAoYXJnNiA9PSBOX1NUVykKLQkJbmNvb3JkcyA9IDM7Ci0JZWxzZSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlucG9pbnRzID0gYXJnMSAtIGFyZzU7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNCwgMSwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5TGlzdF9DaGVjayh2KSB8fCBQeUxpc3RfU2l6ZSh2KSAhPSBucG9pbnRzKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoKGFyZzQgPSBQeU1lbV9ORVcoZG91YmxlLCBucG9pbnRzKm5jb29yZHMgKSkgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JcG5leHQgPSBhcmc0OwotCWZvciAoaSA9IDA7IGkgPCBucG9pbnRzOyBpKyspIHsKLQkJaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShQeUxpc3RfR2V0SXRlbSh2LCBpKSwgMSwgMCwgbmNvb3JkcywgcG5leHQpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBuZXh0ICs9IG5jb29yZHM7Ci0JfQotCWFyZzMgPSAoc2l6ZW9mKGRvdWJsZSkpICogbmNvb3JkczsKLQludXJic2N1cnZlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlNZW1fREVMKGFyZzQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGRvdWJsZSAqIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgZG91YmxlICogYXJnNCA7CisgICAgbG9uZyBhcmc1IDsKKyAgICBsb25nIGFyZzYgOworICAgIGludCBuY29vcmRzLCBucG9pbnRzOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICp2OworICAgIGRvdWJsZSAqcG5leHQ7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nQXJyYXlTaXplKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmcyID0gUHlNZW1fTkVXKGRvdWJsZSwgYXJnMSApKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KGFyZ3MsIDQsIDAsIGFyZzEgLCBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDIsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDMsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZzYgPT0gTl9TVCkKKyAgICAgICAgbmNvb3JkcyA9IDI7CisgICAgZWxzZSBpZiAoYXJnNiA9PSBOX1NUVykKKyAgICAgICAgbmNvb3JkcyA9IDM7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBucG9pbnRzID0gYXJnMSAtIGFyZzU7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNCwgMSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayh2KSB8fCBQeUxpc3RfU2l6ZSh2KSAhPSBucG9pbnRzKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoKGFyZzQgPSBQeU1lbV9ORVcoZG91YmxlLCBucG9pbnRzKm5jb29yZHMgKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgcG5leHQgPSBhcmc0OworICAgIGZvciAoaSA9IDA7IGkgPCBucG9pbnRzOyBpKyspIHsKKyAgICAgICAgaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShQeUxpc3RfR2V0SXRlbSh2LCBpKSwgMSwgMCwgbmNvb3JkcywgcG5leHQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHBuZXh0ICs9IG5jb29yZHM7CisgICAgfQorICAgIGFyZzMgPSAoc2l6ZW9mKGRvdWJsZSkpICogbmNvb3JkczsKKyAgICBudXJic2N1cnZlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlNZW1fREVMKGFyZzQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogcHdsY3VydmUocG9pbnRzLCB0eXBlKS4KQEAgLTM4MSwzOSArMzgxLDM5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHdsY3VydmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2OwotCWxvbmcgdHlwZTsKLQlkb3VibGUgKmRhdGEsICpwbmV4dDsKLQlsb25nIG5wb2ludHMsIG5jb29yZHM7Ci0JaW50IGk7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgMiwgMCwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldExvbmcoYXJncywgMiwgMSwgJnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5TGlzdF9DaGVjayh2KSkgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbnBvaW50cyA9IFB5TGlzdF9TaXplKHYpOwotCWlmICh0eXBlID09IE5fU1QpCi0JCW5jb29yZHMgPSAyOwotCWVsc2UgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChkYXRhID0gUHlNZW1fTkVXKGRvdWJsZSwgbnBvaW50cypuY29vcmRzKSkgPT0gTlVMTCkgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JcG5leHQgPSBkYXRhOwotCWZvciAoaSA9IDA7IGkgPCBucG9pbnRzOyBpKyspIHsKLQkJaWYgKCFQeUFyZ19HZXREb3VibGVBcnJheShQeUxpc3RfR2V0SXRlbSh2LCBpKSwgMSwgMCwgbmNvb3JkcywgcG5leHQpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBuZXh0ICs9IG5jb29yZHM7Ci0JfQotCXB3bGN1cnZlKG5wb2ludHMsIGRhdGEsIHNpemVvZihkb3VibGUpKm5jb29yZHMsIHR5cGUpOwotCVB5TWVtX0RFTChkYXRhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlPYmplY3QgKnY7CisgICAgbG9uZyB0eXBlOworICAgIGRvdWJsZSAqZGF0YSwgKnBuZXh0OworICAgIGxvbmcgbnBvaW50cywgbmNvb3JkczsKKyAgICBpbnQgaTsKKyAgICBpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCAyLCAwLCAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCAyLCAxLCAmdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBucG9pbnRzID0gUHlMaXN0X1NpemUodik7CisgICAgaWYgKHR5cGUgPT0gTl9TVCkKKyAgICAgICAgbmNvb3JkcyA9IDI7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoKGRhdGEgPSBQeU1lbV9ORVcoZG91YmxlLCBucG9pbnRzKm5jb29yZHMpKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBwbmV4dCA9IGRhdGE7CisgICAgZm9yIChpID0gMDsgaSA8IG5wb2ludHM7IGkrKykgeworICAgICAgICBpZiAoIVB5QXJnX0dldERvdWJsZUFycmF5KFB5TGlzdF9HZXRJdGVtKHYsIGkpLCAxLCAwLCBuY29vcmRzLCBwbmV4dCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcG5leHQgKz0gbmNvb3JkczsKKyAgICB9CisgICAgcHdsY3VydmUobnBvaW50cywgZGF0YSwgc2l6ZW9mKGRvdWJsZSkqbmNvb3JkcywgdHlwZSk7CisgICAgUHlNZW1fREVMKGRhdGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC00MjUsNTYgKzQyNSw1NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBpY2tfc2VsZWN0KFB5T2JqZWN0ICphcmdzLCB2b2lkICgqZnVuYykoKSkKIHsKLQlpZiAoIVB5QXJnX0dldExvbmcoYXJncywgMSwgMCwgJnBpY2tidWZmZXJzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBpY2tidWZmZXIgIT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJInBpY2svZ3NlbGVjdDogYWxyZWFkeSBwaWNraW5nL3NlbGVjdGluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChwaWNrYnVmZmVyID0gUHlNZW1fTkVXKHNob3J0LCBwaWNrYnVmZmVyc2l6ZSkpID09IE5VTEwpIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCSgqZnVuYykocGlja2J1ZmZlciwgcGlja2J1ZmZlcnNpemUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgMSwgMCwgJnBpY2tidWZmZXJzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBpY2tidWZmZXIgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgInBpY2svZ3NlbGVjdDogYWxyZWFkeSBwaWNraW5nL3NlbGVjdGluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKChwaWNrYnVmZmVyID0gUHlNZW1fTkVXKHNob3J0LCBwaWNrYnVmZmVyc2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgICgqZnVuYykocGlja2J1ZmZlciwgcGlja2J1ZmZlcnNpemUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGVuZHBpY2tfc2VsZWN0KGxvbmcgKCpmdW5jKSgpKQogewotCVB5T2JqZWN0ICp2LCAqdzsKLQlpbnQgaSwgbmhpdHMsIG47Ci0JaWYgKHBpY2tidWZmZXIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJImVuZHBpY2svZW5kc2VsZWN0OiBub3QgaW4gcGljay9zZWxlY3QgbW9kZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbmhpdHMgPSAoKmZ1bmMpKHBpY2tidWZmZXIpOwotCWlmIChuaGl0cyA8IDApIHsKLQkJbmhpdHMgPSAtbmhpdHM7IC8qIEhvdyB0byByZXBvcnQgYnVmZmVyIG92ZXJmbG93IG90aGVyd2lzZT8gKi8KLQl9Ci0JLyogU2NhbiB0aGUgYnVmZmVyIHRvIHNlZSBob3cgbWFueSBpbnRlZ2VycyAqLwotCW4gPSAwOwotCWZvciAoOyBuaGl0cyA+IDA7IG5oaXRzLS0pIHsKLQkJbiArPSAxICsgcGlja2J1ZmZlcltuXTsKLQl9Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogWFhYIENvdWxkIGRvIGl0IG5pY2VyIGFuZCBpbnRlcnByZXQgdGhlIGRhdGEgc3RydWN0dXJlIGhlcmUsCi0JICAgcmV0dXJuaW5nIGEgbGlzdCBvZiBsaXN0cy4gQnV0IHRoaXMgY2FuIGJlIGRvbmUgaW4gUHl0aG9uLi4uICovCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQl3ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcGlja2J1ZmZlcltpXSk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKHYsIGksIHcpOwotCX0KLQlQeU1lbV9ERUwocGlja2J1ZmZlcik7Ci0JcGlja2J1ZmZlciA9IE5VTEw7Ci0JcmV0dXJuIHY7CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIGludCBpLCBuaGl0cywgbjsKKyAgICBpZiAocGlja2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAiZW5kcGljay9lbmRzZWxlY3Q6IG5vdCBpbiBwaWNrL3NlbGVjdCBtb2RlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBuaGl0cyA9ICgqZnVuYykocGlja2J1ZmZlcik7CisgICAgaWYgKG5oaXRzIDwgMCkgeworICAgICAgICBuaGl0cyA9IC1uaGl0czsgLyogSG93IHRvIHJlcG9ydCBidWZmZXIgb3ZlcmZsb3cgb3RoZXJ3aXNlPyAqLworICAgIH0KKyAgICAvKiBTY2FuIHRoZSBidWZmZXIgdG8gc2VlIGhvdyBtYW55IGludGVnZXJzICovCisgICAgbiA9IDA7CisgICAgZm9yICg7IG5oaXRzID4gMDsgbmhpdHMtLSkgeworICAgICAgICBuICs9IDEgKyBwaWNrYnVmZmVyW25dOworICAgIH0KKyAgICB2ID0gUHlMaXN0X05ldyhuKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFggQ291bGQgZG8gaXQgbmljZXIgYW5kIGludGVycHJldCB0aGUgZGF0YSBzdHJ1Y3R1cmUgaGVyZSwKKyAgICAgICByZXR1cm5pbmcgYSBsaXN0IG9mIGxpc3RzLiBCdXQgdGhpcyBjYW4gYmUgZG9uZSBpbiBQeXRob24uLi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHcgPSBQeUludF9Gcm9tTG9uZygobG9uZylwaWNrYnVmZmVyW2ldKTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NldEl0ZW0odiwgaSwgdyk7CisgICAgfQorICAgIFB5TWVtX0RFTChwaWNrYnVmZmVyKTsKKyAgICBwaWNrYnVmZmVyID0gTlVMTDsKKyAgICByZXR1cm4gdjsKIH0KIAogZXh0ZXJuIHZvaWQgcGljaygpLCBnc2VsZWN0KCk7CkBAIC00ODIsMjIgKzQ4MiwyMiBAQAogCiBzdGF0aWMgUHlPYmplY3QgKmdsX3BpY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBwaWNrX3NlbGVjdChhcmdzLCBwaWNrKTsKKyAgICByZXR1cm4gcGlja19zZWxlY3QoYXJncywgcGljayk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqZ2xfZW5kcGljayhQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gZW5kcGlja19zZWxlY3QoZW5kcGljayk7CisgICAgcmV0dXJuIGVuZHBpY2tfc2VsZWN0KGVuZHBpY2spOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKmdsX2dzZWxlY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBwaWNrX3NlbGVjdChhcmdzLCBnc2VsZWN0KTsKKyAgICByZXR1cm4gcGlja19zZWxlY3QoYXJncywgZ3NlbGVjdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqZ2xfZW5kc2VsZWN0KFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBlbmRwaWNrX3NlbGVjdChlbmRzZWxlY3QpOworICAgIHJldHVybiBlbmRwaWNrX3NlbGVjdChlbmRzZWxlY3QpOwogfQogCiAKQEAgLTUwOSwyMyArNTA5LDIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0bWF0cml4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlNYXRyaXggYXJnMTsKLQlQeU9iamVjdCAqdiwgKnc7Ci0JaW50IGksIGo7Ci0JZ2V0bWF0cml4KCBhcmcxICk7Ci0JdiA9IFB5TGlzdF9OZXcoMTYpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLQkJdyA9IG1rbmV3ZmxvYXRvYmplY3QoYXJnMVtpXVtqXSk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKHYsIGkqNCtqLCB3KTsKLQl9Ci0JcmV0dXJuIHY7CisgICAgTWF0cml4IGFyZzE7CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIGludCBpLCBqOworICAgIGdldG1hdHJpeCggYXJnMSApOworICAgIHYgPSBQeUxpc3RfTmV3KDE2KTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIHcgPSBta25ld2Zsb2F0b2JqZWN0KGFyZzFbaV1bal0pOworICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU2V0SXRlbSh2LCBpKjQraiwgdyk7CisgICAgfQorICAgIHJldHVybiB2OwogfQogCiAvKiBIZXJlJ3MgYW4gYWx0ZXJuYXRlIHZlcnNpb24gdGhhdCByZXR1cm5zIGEgNHg0IG1hdHJpeCBpbnN0ZWFkIG9mCkBAIC01MzYsMTM3ICs1MzYsMTM3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYWx0Z2V0bWF0cml4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlNYXRyaXggYXJnMTsKLQlQeU9iamVjdCAqdiwgKnc7Ci0JaW50IGksIGo7Ci0JZ2V0bWF0cml4KCBhcmcxICk7Ci0JdiA9IFB5TGlzdF9OZXcoNCk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQl3ID0gUHlMaXN0X05ldyg0KTsKLQkJaWYgKHcgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlMaXN0X1NldEl0ZW0odiwgaSwgdyk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotCQkJdyA9IG1rbmV3ZmxvYXRvYmplY3QoYXJnMVtpXVtqXSk7Ci0JCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlMaXN0X1NldEl0ZW0oUHlMaXN0X0dldEl0ZW0odiwgaSksIGosIHcpOwotCQl9Ci0JfQotCXJldHVybiB2OworICAgIE1hdHJpeCBhcmcxOworICAgIFB5T2JqZWN0ICp2LCAqdzsKKyAgICBpbnQgaSwgajsKKyAgICBnZXRtYXRyaXgoIGFyZzEgKTsKKyAgICB2ID0gUHlMaXN0X05ldyg0KTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHcgPSBQeUxpc3RfTmV3KDQpOworICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU2V0SXRlbSh2LCBpLCB3KTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICB3ID0gbWtuZXdmbG9hdG9iamVjdChhcmcxW2ldW2pdKTsKKyAgICAgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShQeUxpc3RfR2V0SXRlbSh2LCBpKSwgaiwgdyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHY7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xyZWN0d3JpdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IHgxIDsKLQlzaG9ydCB5MSA7Ci0Jc2hvcnQgeDIgOwotCXNob3J0IHkyIDsKLQlzdHJpbmcgcGFycmF5IDsKLQlQeU9iamVjdCAqczsKKyAgICBzaG9ydCB4MSA7CisgICAgc2hvcnQgeTEgOworICAgIHNob3J0IHgyIDsKKyAgICBzaG9ydCB5MiA7CisgICAgc3RyaW5nIHBhcnJheSA7CisgICAgUHlPYmplY3QgKnM7CiAjaWYgMAotCWludCBwaXhjb3VudDsKKyAgICBpbnQgcGl4Y291bnQ7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDUsIDAsICZ4MSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNSwgMSwgJnkxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA1LCAyLCAmeDIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDUsIDMsICZ5MikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0U3RyaW5nKGFyZ3MsIDUsIDQsICZwYXJyYXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldE9iamVjdChhcmdzLCA1LCA0LCAmcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNSwgMCwgJngxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA1LCAxLCAmeTEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDUsIDIsICZ4MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNSwgMywgJnkyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTdHJpbmcoYXJncywgNSwgNCwgJnBhcnJheSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDUsIDQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWYgMAogLyogRG9uJ3QgY2hlY2sgdGhpcywgaXQgYnJlYWtzIGV4cGVyaW1lbnRzIHdpdGggcGl4bW9kZShQTV9TSVpFLCAuLi4pICovCi0JcGl4Y291bnQgPSAobG9uZykoeDIrMS14MSkgKiAobG9uZykoeTIrMS15MSk7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayhzKSB8fCBQeVN0cmluZ19TaXplKHMpICE9IHBpeGNvdW50KnNpemVvZihsb25nKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgInN0cmluZyBhcmcgdG8gbHJlY3R3cml0ZSBoYXMgd3Jvbmcgc2l6ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcGl4Y291bnQgPSAobG9uZykoeDIrMS14MSkgKiAobG9uZykoeTIrMS15MSk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhzKSB8fCBQeVN0cmluZ19TaXplKHMpICE9IHBpeGNvdW50KnNpemVvZihsb25nKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJzdHJpbmcgYXJnIHRvIGxyZWN0d3JpdGUgaGFzIHdyb25nIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JbHJlY3R3cml0ZSggeDEgLCB5MSAsIHgyICwgeTIgLCAodW5zaWduZWQgbG9uZyAqKSBwYXJyYXkgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbHJlY3R3cml0ZSggeDEgLCB5MSAsIHgyICwgeTIgLCAodW5zaWduZWQgbG9uZyAqKSBwYXJyYXkgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xyZWN0cmVhZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgeDEgOwotCXNob3J0IHkxIDsKLQlzaG9ydCB4MiA7Ci0Jc2hvcnQgeTIgOwotCVB5T2JqZWN0ICpwYXJyYXk7Ci0JaW50IHBpeGNvdW50OwotCWlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNCwgMCwgJngxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA0LCAxLCAmeTEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDQsIDIsICZ4MikpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNCwgMywgJnkyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGl4Y291bnQgPSAobG9uZykoeDIrMS14MSkgKiAobG9uZykoeTIrMS15MSk7Ci0JcGFycmF5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBwaXhjb3VudCpzaXplb2YobG9uZykpOwotCWlmIChwYXJyYXkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7IC8qIE5vIG1lbW9yeSAqLwotCWxyZWN0cmVhZCh4MSwgeTEsIHgyLCB5MiwgKHVuc2lnbmVkIGxvbmcgKikgUHlTdHJpbmdfQXNTdHJpbmcocGFycmF5KSk7Ci0JcmV0dXJuIHBhcnJheTsKKyAgICBzaG9ydCB4MSA7CisgICAgc2hvcnQgeTEgOworICAgIHNob3J0IHgyIDsKKyAgICBzaG9ydCB5MiA7CisgICAgUHlPYmplY3QgKnBhcnJheTsKKyAgICBpbnQgcGl4Y291bnQ7CisgICAgaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA0LCAwLCAmeDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldFNob3J0KGFyZ3MsIDQsIDEsICZ5MSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0U2hvcnQoYXJncywgNCwgMiwgJngyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTaG9ydChhcmdzLCA0LCAzLCAmeTIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwaXhjb3VudCA9IChsb25nKSh4MisxLXgxKSAqIChsb25nKSh5MisxLXkxKTsKKyAgICBwYXJyYXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHBpeGNvdW50KnNpemVvZihsb25nKSk7CisgICAgaWYgKHBhcnJheSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsgLyogTm8gbWVtb3J5ICovCisgICAgbHJlY3RyZWFkKHgxLCB5MSwgeDIsIHkyLCAodW5zaWduZWQgbG9uZyAqKSBQeVN0cmluZ19Bc1N0cmluZyhwYXJyYXkpKTsKKyAgICByZXR1cm4gcGFycmF5OwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZWFkZGlzcGxheShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIHNob3J0IHgxLCB5MSwgeDIsIHkyOwotCXVuc2lnbmVkIGxvbmcgKnBhcnJheSwgaGludHM7Ci0JbG9uZyBzaXplLCBzaXplX3JldDsKLQlQeU9iamVjdCAqcnY7CisgICAgc2hvcnQgeDEsIHkxLCB4MiwgeTI7CisgICAgdW5zaWduZWQgbG9uZyAqcGFycmF5LCBoaW50czsKKyAgICBsb25nIHNpemUsIHNpemVfcmV0OworICAgIFB5T2JqZWN0ICpydjsKIAotCWlmICggIVB5QXJnX1BhcnNlKGFyZ3MsICJoaGhobCIsICZ4MSwgJnkxLCAmeDIsICZ5MiwgJmhpbnRzKSApCi0JICByZXR1cm4gMDsKLQlzaXplID0gKGxvbmcpKHgyKzEteDEpICogKGxvbmcpKHkyKzEteTEpOwotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBzaXplKnNpemVvZihsb25nKSk7Ci0JaWYgKCBydiA9PSBOVUxMICkKLQkgIHJldHVybiBOVUxMOwotCXBhcnJheSA9ICh1bnNpZ25lZCBsb25nICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwotCXNpemVfcmV0ID0gcmVhZGRpc3BsYXkoeDEsIHkxLCB4MiwgeTIsIHBhcnJheSwgaGludHMpOwotCWlmICggc2l6ZV9yZXQgIT0gc2l6ZSApIHsKLQkgICAgcHJpbnRmKCJnbF9yZWFkZGlzcGxheTogZ290ICVsZCBwaXhlbHMsIGV4cGVjdGVkICVsZFxuIiwKLQkJICAgc2l6ZV9yZXQsIHNpemUpOwotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicmVhZGRpc3BsYXkgcmV0dXJuZWQgdW5leHBlY3RlZCBsZW5ndGgiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBydjsKKyAgICBpZiAoICFQeUFyZ19QYXJzZShhcmdzLCAiaGhoaGwiLCAmeDEsICZ5MSwgJngyLCAmeTIsICZoaW50cykgKQorICAgICAgcmV0dXJuIDA7CisgICAgc2l6ZSA9IChsb25nKSh4MisxLXgxKSAqIChsb25nKSh5MisxLXkxKTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgc2l6ZSpzaXplb2YobG9uZykpOworICAgIGlmICggcnYgPT0gTlVMTCApCisgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYXJyYXkgPSAodW5zaWduZWQgbG9uZyAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBzaXplX3JldCA9IHJlYWRkaXNwbGF5KHgxLCB5MSwgeDIsIHkyLCBwYXJyYXksIGhpbnRzKTsKKyAgICBpZiAoIHNpemVfcmV0ICE9IHNpemUgKSB7CisgICAgICAgIHByaW50ZigiZ2xfcmVhZGRpc3BsYXk6IGdvdCAlbGQgcGl4ZWxzLCBleHBlY3RlZCAlbGRcbiIsCisgICAgICAgICAgIHNpemVfcmV0LCBzaXplKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInJlYWRkaXNwbGF5IHJldHVybmVkIHVuZXhwZWN0ZWQgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIC8qIERlc3BlcmF0ZWx5IG5lZWRlZCwgaGVyZSBhcmUgdG9vbHMgdG8gY29tcHJlc3MgYW5kIGRlY29tcHJlc3MKICAgIHRoZSBkYXRhIG1hbmlwdWxhdGVkIGJ5IGxyZWN0cmVhZC9scmVjdHdyaXRlLgogCiAgICBnbC5wYWNrcmVjdCh3aWR0aCwgaGVpZ2h0LCBwYWNrZmFjdG9yLCBiaWdkYXRhKSAtLT4gc21hbGxkYXRhCi0JCW1ha2VzICdiaWdkYXRhJyA0KihwYWNrZmFjdG9yKioyKSB0aW1lcyBzbWFsbGVyIGJ5OgotCQktIHR1cm5pbmcgaXQgaW50byBCL1cgKGEgZmFjdG9yIDQpCi0JCS0gcmVwbGFjaW5nIHNxdWFyZXMgb2Ygc2l6ZSBwYWNmYWN0b3IgYnkgb25lCi0JCSAgcmVwcmVzZW50YXRpdmUKKyAgICAgICAgICAgICAgICBtYWtlcyAnYmlnZGF0YScgNCoocGFja2ZhY3RvcioqMikgdGltZXMgc21hbGxlciBieToKKyAgICAgICAgLSB0dXJuaW5nIGl0IGludG8gQi9XIChhIGZhY3RvciA0KQorICAgICAgICAtIHJlcGxhY2luZyBzcXVhcmVzIG9mIHNpemUgcGFjZmFjdG9yIGJ5IG9uZQorICAgICAgICAgIHJlcHJlc2VudGF0aXZlCiAKICAgIGdsLnVucGFja3JlY3Qod2lkdGgsIGhlaWdodCwgcGFja2ZhY3Rvciwgc21hbGxkYXRhKSAtLT4gYmlnZGF0YQotCQlpcyB0aGUgaW52ZXJzZTsgdGhlIG51bWVyaWMgYXJndW1lbnRzIG11c3QgYmUgKnRoZSBzYW1lKi4KKyAgICAgICAgICAgICAgICBpcyB0aGUgaW52ZXJzZTsgdGhlIG51bWVyaWMgYXJndW1lbnRzIG11c3QgYmUgKnRoZSBzYW1lKi4KIAogICAgQm90aCB3b3JrIGJlc3QgaWYgd2lkdGggYW5kIGhlaWdodCBhcmUgbXVsdGlwbGVzIG9mIHBhY2tmYWN0b3IKICAgIChpbiBmYWN0IHVucGFja3JlY3Qgd2lsbCBsZWF2ZSBnYXJiYWdlIGJ5dGVzKS4KQEAgLTY3Niw1MCArNjc2LDUwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGFja3JlY3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgd2lkdGgsIGhlaWdodCwgcGFja2ZhY3RvcjsKLQljaGFyICpzOwotCVB5T2JqZWN0ICp1bnBhY2tlZCwgKnBhY2tlZDsKLQlpbnQgcGl4Y291bnQsIHBhY2tlZGNvdW50LCB4LCB5LCByLCBnLCBiOwotCXVuc2lnbmVkIGxvbmcgcGl4ZWw7Ci0JdW5zaWduZWQgY2hhciAqcDsKLQl1bnNpZ25lZCBsb25nICpwYXJyYXk7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDAsICZ3aWR0aCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAxLCAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDIsICZwYWNrZmFjdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRTdHJpbmcoYXJncywgNCwgMywgJnMpKSAvKiBGb3IgdHlwZSBjaGVja2luZyBvbmx5ICovCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDQsIDMsICZ1bnBhY2tlZCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8IHBhY2tmYWN0b3IgPD0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicGFja3JlY3QgYXJncyBtdXN0IGJlID4gMCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGl4Y291bnQgPSB3aWR0aCpoZWlnaHQ7Ci0JcGFja2VkY291bnQgPSAoKHdpZHRoK3BhY2tmYWN0b3ItMSkvcGFja2ZhY3RvcikgKgotCQkoKGhlaWdodCtwYWNrZmFjdG9yLTEpL3BhY2tmYWN0b3IpOwotCWlmIChQeVN0cmluZ19TaXplKHVucGFja2VkKSAhPSBwaXhjb3VudCpzaXplb2YobG9uZykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJzdHJpbmcgYXJnIHRvIHBhY2tyZWN0IGhhcyB3cm9uZyBzaXplIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlwYWNrZWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHBhY2tlZGNvdW50KTsKLQlpZiAocGFja2VkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXBhcnJheSA9ICh1bnNpZ25lZCBsb25nICopIFB5U3RyaW5nX0FzU3RyaW5nKHVucGFja2VkKTsKLQlwID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQXNTdHJpbmcocGFja2VkKTsKLQlmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IHBhY2tmYWN0b3IsIHBhcnJheSArPSBwYWNrZmFjdG9yKndpZHRoKSB7Ci0JCWZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCArPSBwYWNrZmFjdG9yKSB7Ci0JCQlwaXhlbCA9IHBhcnJheVt4XTsKLQkJCXIgPSBwaXhlbCAmIDB4ZmY7Ci0JCQlnID0gKHBpeGVsID4+IDgpICYgMHhmZjsKLQkJCWIgPSAocGl4ZWwgPj4gMTYpICYgMHhmZjsKLQkJCSpwKysgPSAoMzAqcis1OSpnKzExKmIpIC8gMTAwOwotCQl9Ci0JfQotCXJldHVybiBwYWNrZWQ7CisgICAgbG9uZyB3aWR0aCwgaGVpZ2h0LCBwYWNrZmFjdG9yOworICAgIGNoYXIgKnM7CisgICAgUHlPYmplY3QgKnVucGFja2VkLCAqcGFja2VkOworICAgIGludCBwaXhjb3VudCwgcGFja2VkY291bnQsIHgsIHksIHIsIGcsIGI7CisgICAgdW5zaWduZWQgbG9uZyBwaXhlbDsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIHVuc2lnbmVkIGxvbmcgKnBhcnJheTsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNCwgMCwgJndpZHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDEsICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNCwgMiwgJnBhY2tmYWN0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX0dldFN0cmluZyhhcmdzLCA0LCAzLCAmcykpIC8qIEZvciB0eXBlIGNoZWNraW5nIG9ubHkgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNCwgMywgJnVucGFja2VkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgcGFja2ZhY3RvciA8PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJwYWNrcmVjdCBhcmdzIG11c3QgYmUgPiAwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwaXhjb3VudCA9IHdpZHRoKmhlaWdodDsKKyAgICBwYWNrZWRjb3VudCA9ICgod2lkdGgrcGFja2ZhY3Rvci0xKS9wYWNrZmFjdG9yKSAqCisgICAgICAgICgoaGVpZ2h0K3BhY2tmYWN0b3ItMSkvcGFja2ZhY3Rvcik7CisgICAgaWYgKFB5U3RyaW5nX1NpemUodW5wYWNrZWQpICE9IHBpeGNvdW50KnNpemVvZihsb25nKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJzdHJpbmcgYXJnIHRvIHBhY2tyZWN0IGhhcyB3cm9uZyBzaXplIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwYWNrZWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHBhY2tlZGNvdW50KTsKKyAgICBpZiAocGFja2VkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhcnJheSA9ICh1bnNpZ25lZCBsb25nICopIFB5U3RyaW5nX0FzU3RyaW5nKHVucGFja2VkKTsKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQXNTdHJpbmcocGFja2VkKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IHBhY2tmYWN0b3IsIHBhcnJheSArPSBwYWNrZmFjdG9yKndpZHRoKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCArPSBwYWNrZmFjdG9yKSB7CisgICAgICAgICAgICBwaXhlbCA9IHBhcnJheVt4XTsKKyAgICAgICAgICAgIHIgPSBwaXhlbCAmIDB4ZmY7CisgICAgICAgICAgICBnID0gKHBpeGVsID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIGIgPSAocGl4ZWwgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgICpwKysgPSAoMzAqcis1OSpnKzExKmIpIC8gMTAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYWNrZWQ7CiB9CiAKIApAQCAtNzI5LDc3ICs3MjksNzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF91bnBhY2tyZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHdpZHRoLCBoZWlnaHQsIHBhY2tmYWN0b3I7Ci0JY2hhciAqczsKLQlQeU9iamVjdCAqdW5wYWNrZWQsICpwYWNrZWQ7Ci0JaW50IHBpeGNvdW50LCBwYWNrZWRjb3VudDsKLQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgKnBhcnJheTsKLQlpZiAoIXVucGFja3RhYl9pbml0ZWQpIHsKLQkJcmVnaXN0ZXIgaW50IHdoaXRlOwotCQlmb3IgKHdoaXRlID0gMjU2OyAtLXdoaXRlID49IDA7ICkKLQkJCXVucGFja3RhYlt3aGl0ZV0gPSB3aGl0ZSAqIDB4MDEwMTAxTDsKLQkJdW5wYWNrdGFiX2luaXRlZCsrOwotCX0KLQlpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNCwgMCwgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDEsICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldExvbmcoYXJncywgNCwgMiwgJnBhY2tmYWN0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5QXJnX0dldFN0cmluZyhhcmdzLCA0LCAzLCAmcykpIC8qIEZvciB0eXBlIGNoZWNraW5nIG9ubHkgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19HZXRPYmplY3QoYXJncywgNCwgMywgJnBhY2tlZCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8IHBhY2tmYWN0b3IgPD0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAicGFja3JlY3QgYXJncyBtdXN0IGJlID4gMCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGl4Y291bnQgPSB3aWR0aCpoZWlnaHQ7Ci0JcGFja2VkY291bnQgPSAoKHdpZHRoK3BhY2tmYWN0b3ItMSkvcGFja2ZhY3RvcikgKgotCQkoKGhlaWdodCtwYWNrZmFjdG9yLTEpL3BhY2tmYWN0b3IpOwotCWlmIChQeVN0cmluZ19TaXplKHBhY2tlZCkgIT0gcGFja2VkY291bnQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJzdHJpbmcgYXJnIHRvIHVucGFja3JlY3QgaGFzIHdyb25nIHNpemUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXVucGFja2VkID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBwaXhjb3VudCpzaXplb2YobG9uZykpOwotCWlmICh1bnBhY2tlZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwYXJyYXkgPSAodW5zaWduZWQgbG9uZyAqKSBQeVN0cmluZ19Bc1N0cmluZyh1bnBhY2tlZCk7Ci0JcCA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FzU3RyaW5nKHBhY2tlZCk7Ci0JaWYgKHBhY2tmYWN0b3IgPT0gMSAmJiB3aWR0aCpoZWlnaHQgPiAwKSB7Ci0JCS8qIEp1c3QgZXhwYW5kIGJ5dGVzIHRvIGxvbmdzICovCi0JCXJlZ2lzdGVyIGludCB4ID0gd2lkdGggKiBoZWlnaHQ7Ci0JCWRvIHsKLQkJCSpwYXJyYXkrKyA9IHVucGFja3RhYlsqcCsrXTsKLQkJfSB3aGlsZSAoLS14ID49IDApOwotCX0KLQllbHNlIHsKLQkJcmVnaXN0ZXIgaW50IHk7Ci0JCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQtcGFja2ZhY3RvcisxOwotCQkgICAgIHkgKz0gcGFja2ZhY3RvciwgcGFycmF5ICs9IHBhY2tmYWN0b3Iqd2lkdGgpIHsKLQkJCXJlZ2lzdGVyIGludCB4OwotCQkJZm9yICh4ID0gMDsgeCA8IHdpZHRoLXBhY2tmYWN0b3IrMTsgeCArPSBwYWNrZmFjdG9yKSB7Ci0JCQkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBwaXhlbCA9IHVucGFja3RhYlsqcCsrXTsKLQkJCQlyZWdpc3RlciBpbnQgaTsKLQkJCQlmb3IgKGkgPSBwYWNrZmFjdG9yKndpZHRoOyAoaS09d2lkdGgpID49IDA7KSB7Ci0JCQkJCXJlZ2lzdGVyIGludCBqOwotCQkJCQlmb3IgKGogPSBwYWNrZmFjdG9yOyAtLWogPj0gMDsgKQotCQkJCQkJcGFycmF5W2kreCtqXSA9IHBpeGVsOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gdW5wYWNrZWQ7CisgICAgbG9uZyB3aWR0aCwgaGVpZ2h0LCBwYWNrZmFjdG9yOworICAgIGNoYXIgKnM7CisgICAgUHlPYmplY3QgKnVucGFja2VkLCAqcGFja2VkOworICAgIGludCBwaXhjb3VudCwgcGFja2VkY291bnQ7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nICpwYXJyYXk7CisgICAgaWYgKCF1bnBhY2t0YWJfaW5pdGVkKSB7CisgICAgICAgIHJlZ2lzdGVyIGludCB3aGl0ZTsKKyAgICAgICAgZm9yICh3aGl0ZSA9IDI1NjsgLS13aGl0ZSA+PSAwOyApCisgICAgICAgICAgICB1bnBhY2t0YWJbd2hpdGVdID0gd2hpdGUgKiAweDAxMDEwMUw7CisgICAgICAgIHVucGFja3RhYl9pbml0ZWQrKzsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDAsICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0TG9uZyhhcmdzLCA0LCAxLCAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRMb25nKGFyZ3MsIDQsIDIsICZwYWNrZmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19HZXRTdHJpbmcoYXJncywgNCwgMywgJnMpKSAvKiBGb3IgdHlwZSBjaGVja2luZyBvbmx5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfR2V0T2JqZWN0KGFyZ3MsIDQsIDMsICZwYWNrZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCB8fCBwYWNrZmFjdG9yIDw9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInBhY2tyZWN0IGFyZ3MgbXVzdCBiZSA+IDAiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBpeGNvdW50ID0gd2lkdGgqaGVpZ2h0OworICAgIHBhY2tlZGNvdW50ID0gKCh3aWR0aCtwYWNrZmFjdG9yLTEpL3BhY2tmYWN0b3IpICoKKyAgICAgICAgKChoZWlnaHQrcGFja2ZhY3Rvci0xKS9wYWNrZmFjdG9yKTsKKyAgICBpZiAoUHlTdHJpbmdfU2l6ZShwYWNrZWQpICE9IHBhY2tlZGNvdW50KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgInN0cmluZyBhcmcgdG8gdW5wYWNrcmVjdCBoYXMgd3Jvbmcgc2l6ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdW5wYWNrZWQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHBpeGNvdW50KnNpemVvZihsb25nKSk7CisgICAgaWYgKHVucGFja2VkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhcnJheSA9ICh1bnNpZ25lZCBsb25nICopIFB5U3RyaW5nX0FzU3RyaW5nKHVucGFja2VkKTsKKyAgICBwID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQXNTdHJpbmcocGFja2VkKTsKKyAgICBpZiAocGFja2ZhY3RvciA9PSAxICYmIHdpZHRoKmhlaWdodCA+IDApIHsKKyAgICAgICAgLyogSnVzdCBleHBhbmQgYnl0ZXMgdG8gbG9uZ3MgKi8KKyAgICAgICAgcmVnaXN0ZXIgaW50IHggPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgKnBhcnJheSsrID0gdW5wYWNrdGFiWypwKytdOworICAgICAgICB9IHdoaWxlICgtLXggPj0gMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZWdpc3RlciBpbnQgeTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodC1wYWNrZmFjdG9yKzE7CisgICAgICAgICAgICAgeSArPSBwYWNrZmFjdG9yLCBwYXJyYXkgKz0gcGFja2ZhY3Rvcip3aWR0aCkgeworICAgICAgICAgICAgcmVnaXN0ZXIgaW50IHg7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGgtcGFja2ZhY3RvcisxOyB4ICs9IHBhY2tmYWN0b3IpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHBpeGVsID0gdW5wYWNrdGFiWypwKytdOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IHBhY2tmYWN0b3Iqd2lkdGg7IChpLT13aWR0aCkgPj0gMDspIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgaW50IGo7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IHBhY2tmYWN0b3I7IC0taiA+PSAwOyApCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJyYXlbaSt4K2pdID0gcGl4ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB1bnBhY2tlZDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2d2ZXJzaW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyIGJ1ZlsyMF07Ci0JZ3ZlcnNpb24oYnVmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzIwXTsKKyAgICBndmVyc2lvbihidWYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIApAQCAtODA3LDkgKzgwNyw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2xlYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCV9fR0xjbGVhciggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgX19HTGNsZWFyKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogRW5kIG9mIG1hbnVhbGx5IHdyaXR0ZW4gc3R1YnMgKi8KQEAgLTgyMCw5ICs4MjAsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHNoYWRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRzaGFkZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0c2hhZGUoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiB2b2lkIGRldnBvcnQgc2hvcnQgcyBsb25nIHMgKi8KQEAgLTgzMCwxNSArODMwLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGV2cG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlkZXZwb3J0KCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRldnBvcnQoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJkcjJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTg0NiwxNSArODQ2LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmRyMmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJkcjJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZHIyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmVjdGZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTg2MiwyMSArODYyLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdGZzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXJlY3RmcyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlY3RmcyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZWN0cyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC04ODQsMjEgKzg4NCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JlY3RzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXJlY3RzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVjdHMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcm12MmkgbG9uZyBzIGxvbmcgcyAqLwpAQCAtOTA2LDE1ICs5MDYsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ybXYyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm12MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJtdjJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBub3BvcnQgKi8KQEAgLTkyMiw5ICs5MjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX25vcG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jbm9wb3J0KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBub3BvcnQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvcHZpZXdwb3J0ICovCkBAIC05MzIsOSArOTMyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb3B2aWV3cG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcG9wdmlld3BvcnQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHBvcHZpZXdwb3J0KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjbGVhcmhpdGNvZGUgKi8KQEAgLTk0Miw5ICs5NDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NsZWFyaGl0Y29kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2xlYXJoaXRjb2RlKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjbGVhcmhpdGNvZGUoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNsb3Nlb2JqICovCkBAIC05NTIsOSArOTUyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbG9zZW9iaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2xvc2VvYmooICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNsb3Nlb2JqKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJzb2ZmICovCkBAIC05NjIsOSArOTYyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJzb2ZmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljdXJzb2ZmKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjdXJzb2ZmKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJzb24gKi8KQEAgLTk3Miw5ICs5NzIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2N1cnNvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY3Vyc29uKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjdXJzb24oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRvdWJsZWJ1ZmZlciAqLwpAQCAtOTgyLDkgKzk4Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZG91YmxlYnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGVidWZmZXIoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGRvdWJsZWJ1ZmZlciggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZmluaXNoICovCkBAIC05OTIsOSArOTkyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9maW5pc2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZpbmlzaCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmluaXNoKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnY29uZmlnICovCkBAIC0xMDAyLDkgKzEwMDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2djb25maWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWdjb25maWcoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGdjb25maWcoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdpbml0ICovCkBAIC0xMDEyLDkgKzEwMTIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dpbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlnaW5pdCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZ2luaXQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdyZXNldCAqLwpAQCAtMTAyMiw5ICsxMDIyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ncmVzZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWdyZXNldCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZ3Jlc2V0KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtdWx0aW1hcCAqLwpAQCAtMTAzMiw5ICsxMDMyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tdWx0aW1hcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbXVsdGltYXAoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIG11bHRpbWFwKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvbmVtYXAgKi8KQEAgLTEwNDIsOSArMTA0Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfb25lbWFwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlvbmVtYXAoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIG9uZW1hcCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9wYXR0cmlidXRlcyAqLwpAQCAtMTA1Miw5ICsxMDUyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb3BhdHRyaWJ1dGVzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwb3BhdHRyaWJ1dGVzKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBwb3BhdHRyaWJ1dGVzKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb3BtYXRyaXggKi8KQEAgLTEwNjIsOSArMTA2Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9wbWF0cml4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwb3BtYXRyaXgoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHBvcG1hdHJpeCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcHVzaGF0dHJpYnV0ZXMgKi8KQEAgLTEwNzIsOSArMTA3Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHVzaGF0dHJpYnV0ZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXB1c2hhdHRyaWJ1dGVzKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBwdXNoYXR0cmlidXRlcyggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcHVzaG1hdHJpeCAqLwpAQCAtMTA4Miw5ICsxMDgyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wdXNobWF0cml4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwdXNobWF0cml4KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBwdXNobWF0cml4KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwdXNodmlld3BvcnQgKi8KQEAgLTEwOTIsOSArMTA5Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHVzaHZpZXdwb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwdXNodmlld3BvcnQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHB1c2h2aWV3cG9ydCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcXJlc2V0ICovCkBAIC0xMTAyLDkgKzExMDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3FyZXNldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcXJlc2V0KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBxcmVzZXQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIFJHQm1vZGUgKi8KQEAgLTExMTIsOSArMTExMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfUkdCbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUkdCbW9kZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUkdCbW9kZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2luZ2xlYnVmZmVyICovCkBAIC0xMTIyLDkgKzExMjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NpbmdsZWJ1ZmZlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2luZ2xlYnVmZmVyKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaW5nbGVidWZmZXIoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHN3YXBidWZmZXJzICovCkBAIC0xMTMyLDkgKzExMzIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3N3YXBidWZmZXJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzd2FwYnVmZmVycyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc3dhcGJ1ZmZlcnMoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdzeW5jICovCkBAIC0xMTQyLDkgKzExNDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dzeW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlnc3luYyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZ3N5bmMoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdmbHVzaCAqLwpAQCAtMTE1Miw5ICsxMTUyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZmx1c2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWdmbHVzaCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZ2ZsdXNoKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB0cG9uICovCkBAIC0xMTYyLDkgKzExNjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Rwb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXRwb24oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHRwb24oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHRwb2ZmICovCkBAIC0xMTcyLDkgKzExNzIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Rwb2ZmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl0cG9mZiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgdHBvZmYoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNsa29uICovCkBAIC0xMTgyLDkgKzExODIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Nsa29uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljbGtvbiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2xrb24oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNsa29mZiAqLwpAQCAtMTE5Miw5ICsxMTkyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbGtvZmYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNsa29mZiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2xrb2ZmKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByaW5nYmVsbCAqLwpAQCAtMTIwMiw5ICsxMjAyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yaW5nYmVsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmluZ2JlbGwoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHJpbmdiZWxsKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnYmVnaW4gKi8KQEAgLTEyMTIsOSArMTIxMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2JlZ2luKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlnYmVnaW4oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGdiZWdpbiggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdGV4dGluaXQgKi8KQEAgLTEyMjIsOSArMTIyMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdGV4dGluaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXRleHRpbml0KCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB0ZXh0aW5pdCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgaW5pdG5hbWVzICovCkBAIC0xMjMyLDkgKzEyMzIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2luaXRuYW1lcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW5pdG5hbWVzKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbml0bmFtZXMoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBjbG9zICovCkBAIC0xMjQyLDkgKzEyNDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BjbG9zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlwY2xvcyggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcGNsb3MoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvcG5hbWUgKi8KQEAgLTEyNTIsOSArMTI1Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9wbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcG9wbmFtZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcG9wbmFtZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3BjbG9zICovCkBAIC0xMjYyLDkgKzEyNjIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NwY2xvcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3BjbG9zKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzcGNsb3MoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHpjbGVhciAqLwpAQCAtMTI3Miw5ICsxMjcyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF96Y2xlYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXpjbGVhciggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgemNsZWFyKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzY3JlZW5zcGFjZSAqLwpAQCAtMTI4Miw5ICsxMjgyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zY3JlZW5zcGFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2NyZWVuc3BhY2UoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNjcmVlbnNwYWNlKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZXNoYXBldmlld3BvcnQgKi8KQEAgLTEyOTIsOSArMTI5Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVzaGFwZXZpZXdwb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXNoYXBldmlld3BvcnQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHJlc2hhcGV2aWV3cG9ydCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgd2lucHVzaCAqLwpAQCAtMTMwMiw5ICsxMzAyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW5wdXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl3aW5wdXNoKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB3aW5wdXNoKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB3aW5wb3AgKi8KQEAgLTEzMTIsOSArMTMxMiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2lucG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl3aW5wb3AoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHdpbnBvcCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZm9yZWdyb3VuZCAqLwpAQCAtMTMyMiw5ICsxMzIyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9mb3JlZ3JvdW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmb3JlZ3JvdW5kKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmb3JlZ3JvdW5kKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlbmRmdWxsc2NybiAqLwpAQCAtMTMzMiw5ICsxMzMyLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lbmRmdWxsc2NybihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZW5kZnVsbHNjcm4oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuZGZ1bGxzY3JuKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlbmRwdXBtb2RlICovCkBAIC0xMzQyLDkgKzEzNDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2VuZHB1cG1vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWVuZHB1cG1vZGUoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuZHB1cG1vZGUoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZ1bGxzY3JuICovCkBAIC0xMzUyLDkgKzEzNTIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Z1bGxzY3JuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmdWxsc2NybiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZnVsbHNjcm4oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHB1cG1vZGUgKi8KQEAgLTEzNjIsOSArMTM2Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHVwbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcHVwbW9kZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcHVwbW9kZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgd2luY29uc3RyYWludHMgKi8KQEAgLTEzNzIsOSArMTM3Miw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luY29uc3RyYWludHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXdpbmNvbnN0cmFpbnRzKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB3aW5jb25zdHJhaW50cyggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGFnZWNvbG9yIHNob3J0IHMgKi8KQEAgLTEzODIsMTIgKzEzODIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wYWdlY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGFnZWNvbG9yKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGFnZWNvbG9yKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHRleHRjb2xvciBzaG9ydCBzICovCkBAIC0xMzk1LDEyICsxMzk1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdGV4dGNvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXRleHRjb2xvciggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRleHRjb2xvciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjb2xvciBzaG9ydCBzICovCkBAIC0xNDA4LDEyICsxNDA4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY29sb3IoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjb2xvciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJ2ZWl0IHNob3J0IHMgKi8KQEAgLTE0MjEsMTIgKzE0MjEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJ2ZWl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWN1cnZlaXQoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjdXJ2ZWl0KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZvbnQgc2hvcnQgcyAqLwpAQCAtMTQzNCwxMiArMTQzNCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2ZvbnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9udCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvbnQoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbGluZXdpZHRoIHNob3J0IHMgKi8KQEAgLTE0NDcsMTIgKzE0NDcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9saW5ld2lkdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbGluZXdpZHRoKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGluZXdpZHRoKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldGxpbmVzdHlsZSBzaG9ydCBzICovCkBAIC0xNDYwLDEyICsxNDYwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0bGluZXN0eWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXNldGxpbmVzdHlsZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldGxpbmVzdHlsZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRtYXAgc2hvcnQgcyAqLwpAQCAtMTQ3MywxMiArMTQ3MywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldG1hcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRtYXAoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRtYXAoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3dhcGludGVydmFsIHNob3J0IHMgKi8KQEAgLTE0ODYsMTIgKzE0ODYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zd2FwaW50ZXJ2YWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3dhcGludGVydmFsKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3dhcGludGVydmFsKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHdyaXRlbWFzayBzaG9ydCBzICovCkBAIC0xNDk5LDEyICsxNDk5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd3JpdGVtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXdyaXRlbWFzayggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdyaXRlbWFzayggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB0ZXh0d3JpdGVtYXNrIHNob3J0IHMgKi8KQEAgLTE1MTIsMTIgKzE1MTIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF90ZXh0d3JpdGVtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXRleHR3cml0ZW1hc2soIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0d3JpdGVtYXNrKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHFkZXZpY2Ugc2hvcnQgcyAqLwpAQCAtMTUyNSwxMiArMTUyNSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3FkZXZpY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcWRldmljZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHFkZXZpY2UoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdW5xZGV2aWNlIHNob3J0IHMgKi8KQEAgLTE1MzgsMTIgKzE1MzgsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF91bnFkZXZpY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdW5xZGV2aWNlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdW5xZGV2aWNlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGN1cnZlYmFzaXMgc2hvcnQgcyAqLwpAQCAtMTU1MSwxMiArMTU1MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2N1cnZlYmFzaXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3VydmViYXNpcyggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGN1cnZlYmFzaXMoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3VydmVwcmVjaXNpb24gc2hvcnQgcyAqLwpAQCAtMTU2NCwxMiArMTU2NCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2N1cnZlcHJlY2lzaW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWN1cnZlcHJlY2lzaW9uKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3VydmVwcmVjaXNpb24oIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbG9hZG5hbWUgc2hvcnQgcyAqLwpAQCAtMTU3NywxMiArMTU3NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xvYWRuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxvYWRuYW1lKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbG9hZG5hbWUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGFzc3Rocm91Z2ggc2hvcnQgcyAqLwpAQCAtMTU5MCwxMiArMTU5MCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Bhc3N0aHJvdWdoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXBhc3N0aHJvdWdoKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGFzc3Rocm91Z2goIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcHVzaG5hbWUgc2hvcnQgcyAqLwpAQCAtMTYwMywxMiArMTYwMywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3B1c2huYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXB1c2huYW1lKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHVzaG5hbWUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2V0bW9uaXRvciBzaG9ydCBzICovCkBAIC0xNjE2LDEyICsxNjE2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0bW9uaXRvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRtb25pdG9yKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0bW9uaXRvciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRzaGFkZSBzaG9ydCBzICovCkBAIC0xNjI5LDEyICsxNjI5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0c2hhZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0c2hhZGUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRzaGFkZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRwYXR0ZXJuIHNob3J0IHMgKi8KQEAgLTE2NDIsMTIgKzE2NDIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXRwYXR0ZXJuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXNldHBhdHRlcm4oIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRwYXR0ZXJuKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBhZ2V3cml0ZW1hc2sgc2hvcnQgcyAqLwpAQCAtMTY1NSwxMiArMTY1NSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BhZ2V3cml0ZW1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGFnZXdyaXRlbWFzayggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhZ2V3cml0ZW1hc2soIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2FsbG9iaiBsb25nIHMgKi8KQEAgLTE2NjgsMTIgKzE2NjgsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jYWxsb2JqKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljYWxsb2JqKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhbGxvYmooIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZGVsb2JqIGxvbmcgcyAqLwpAQCAtMTY4MSwxMiArMTY4MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RlbG9iaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGVsb2JqKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRlbG9iaiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlZGl0b2JqIGxvbmcgcyAqLwpAQCAtMTY5NCwxMiArMTY5NCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2VkaXRvYmooUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWVkaXRvYmooIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWRpdG9iaiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtYWtlb2JqIGxvbmcgcyAqLwpAQCAtMTcwNywxMiArMTcwNywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21ha2VvYmooUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW1ha2VvYmooIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFrZW9iaiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtYWtldGFnIGxvbmcgcyAqLwpAQCAtMTcyMCwxMiArMTcyMCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21ha2V0YWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW1ha2V0YWcoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFrZXRhZyggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaHVua3NpemUgbG9uZyBzICovCkBAIC0xNzMzLDEyICsxNzMzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2h1bmtzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljaHVua3NpemUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2h1bmtzaXplKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNvbXBhY3RpZnkgbG9uZyBzICovCkBAIC0xNzQ2LDEyICsxNzQ2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY29tcGFjdGlmeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY29tcGFjdGlmeSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjb21wYWN0aWZ5KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRlbHRhZyBsb25nIHMgKi8KQEAgLTE3NTksMTIgKzE3NTksMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kZWx0YWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWRlbHRhZyggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkZWx0YWcoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbHNyZXBlYXQgbG9uZyBzICovCkBAIC0xNzcyLDEyICsxNzcyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbHNyZXBlYXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxzcmVwZWF0KCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxzcmVwZWF0KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG9iamluc2VydCBsb25nIHMgKi8KQEAgLTE3ODUsMTIgKzE3ODUsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9vYmppbnNlcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW9iamluc2VydCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvYmppbnNlcnQoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgb2JqcmVwbGFjZSBsb25nIHMgKi8KQEAgLTE3OTgsMTIgKzE3OTgsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9vYmpyZXBsYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlvYmpyZXBsYWNlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9ianJlcGxhY2UoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgd2luY2xvc2UgbG9uZyBzICovCkBAIC0xODExLDEyICsxODExLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luY2xvc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXdpbmNsb3NlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdpbmNsb3NlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJsYW5rdGltZSBsb25nIHMgKi8KQEAgLTE4MjQsMTIgKzE4MjQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ibGFua3RpbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWJsYW5rdGltZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBibGFua3RpbWUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZnJlZXB1cCBsb25nIHMgKi8KQEAgLTE4MzcsMTIgKzE4MzcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9mcmVlcHVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlmcmVlcHVwKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZyZWVwdXAoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmFja2J1ZmZlciBsb25nIHMgKi8KQEAgLTE4NTAsMTIgKzE4NTAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iYWNrYnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQliYWNrYnVmZmVyKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJhY2tidWZmZXIoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZnJvbnRidWZmZXIgbG9uZyBzICovCkBAIC0xODYzLDEyICsxODYzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZnJvbnRidWZmZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWZyb250YnVmZmVyKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZyb250YnVmZmVyKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxzYmFja3VwIGxvbmcgcyAqLwpAQCAtMTg3NiwxMiArMTg3NiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xzYmFja3VwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlsc2JhY2t1cCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsc2JhY2t1cCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZXNldGxzIGxvbmcgcyAqLwpAQCAtMTg4OSwxMiArMTg4OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Jlc2V0bHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJlc2V0bHMoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzZXRscyggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsYW1wb24gbG9uZyBzICovCkBAIC0xOTAyLDEyICsxOTAyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbGFtcG9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlsYW1wb24oIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGFtcG9uKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxhbXBvZmYgbG9uZyBzICovCkBAIC0xOTE1LDEyICsxOTE1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbGFtcG9mZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbGFtcG9mZiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsYW1wb2ZmKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldGJlbGwgbG9uZyBzICovCkBAIC0xOTI4LDEyICsxOTI4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0YmVsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0YmVsbCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRiZWxsKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJsYW5rc2NyZWVuIGxvbmcgcyAqLwpAQCAtMTk0MSwxMiArMTk0MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JsYW5rc2NyZWVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlibGFua3NjcmVlbiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBibGFua3NjcmVlbiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkZXB0aGN1ZSBsb25nIHMgKi8KQEAgLTE5NTQsMTIgKzE5NTQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kZXB0aGN1ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGVwdGhjdWUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVwdGhjdWUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgemJ1ZmZlciBsb25nIHMgKi8KQEAgLTE5NjcsMTIgKzE5NjcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF96YnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl6YnVmZmVyKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHpidWZmZXIoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmFja2ZhY2UgbG9uZyBzICovCkBAIC0xOTgwLDEyICsxOTgwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmFja2ZhY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWJhY2tmYWNlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJhY2tmYWNlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNtb3YyaSBsb25nIHMgbG9uZyBzICovCkBAIC0xOTkzLDE1ICsxOTkzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY21vdjJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQljbW92MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNtb3YyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZHJhdzJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIwMDksMTUgKzIwMDksMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kcmF3MmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWRyYXcyaSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHJhdzJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtb3ZlMmkgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjAyNSwxNSArMjAyNSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21vdmUyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbW92ZTJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtb3ZlMmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBudDJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIwNDEsMTUgKzIwNDEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wbnQyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG50MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBudDJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwYXRjaGJhc2lzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIwNTcsMTUgKzIwNTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wYXRjaGJhc2lzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwYXRjaGJhc2lzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYXRjaGJhc2lzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwYXRjaHByZWNpc2lvbiBsb25nIHMgbG9uZyBzICovCkBAIC0yMDczLDE1ICsyMDczLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGF0Y2hwcmVjaXNpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBhdGNocHJlY2lzaW9uKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwYXRjaHByZWNpc2lvbiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGRyMmkgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjA4OSwxNSArMjA4OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BkcjJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwZHIyaSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGRyMmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBtdjJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIxMDUsMTUgKzIxMDUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wbXYyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBtdjJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycGRyMmkgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjEyMSwxNSArMjEyMSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwZHIyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBkcjJpKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycGRyMmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwbXYyaSBsb25nIHMgbG9uZyBzICovCkBAIC0yMTM3LDE1ICsyMTM3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcnBtdjJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlycG12MmkoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwbXYyaSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgeGZwdDJpIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIxNTMsMTUgKzIxNTMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF94ZnB0MmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXhmcHQyaSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdDJpKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvYmpkZWxldGUgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjE2OSwxNSArMjE2OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX29iamRlbGV0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb2JqZGVsZXRlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvYmpkZWxldGUoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBhdGNoY3VydmVzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIxODUsMTUgKzIxODUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wYXRjaGN1cnZlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGF0Y2hjdXJ2ZXMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhdGNoY3VydmVzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtaW5zaXplIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyMDEsMTUgKzIyMDEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9taW5zaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQltaW5zaXplKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtaW5zaXplKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtYXhzaXplIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyMTcsMTUgKzIyMTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tYXhzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQltYXhzaXplKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtYXhzaXplKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBrZWVwYXNwZWN0IGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyMzMsMTUgKzIyMzMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9rZWVwYXNwZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlrZWVwYXNwZWN0KCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBrZWVwYXNwZWN0KCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwcmVmc2l6ZSBsb25nIHMgbG9uZyBzICovCkBAIC0yMjQ5LDE1ICsyMjQ5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcHJlZnNpemUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXByZWZzaXplKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwcmVmc2l6ZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3RlcHVuaXQgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMjI2NSwxNSArMjI2NSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3N0ZXB1bml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlzdGVwdW5pdCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3RlcHVuaXQoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGZ1ZGdlIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyODEsMTUgKzIyODEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9mdWRnZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZnVkZ2UoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZ1ZGdlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB3aW5tb3ZlIGxvbmcgcyBsb25nIHMgKi8KQEAgLTIyOTcsMTUgKzIyOTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW5tb3ZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQl3aW5tb3ZlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aW5tb3ZlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBhdHRhY2hjdXJzb3Igc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yMzEzLDE1ICsyMzEzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYXR0YWNoY3Vyc29yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXR0YWNoY3Vyc29yKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXR0YWNoY3Vyc29yKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkZWZsaW5lc3R5bGUgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yMzI5LDE1ICsyMzI5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGVmbGluZXN0eWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGVmbGluZXN0eWxlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVmbGluZXN0eWxlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBub2lzZSBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTIzNDUsMTUgKzIzNDUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ub2lzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCW5vaXNlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbm9pc2UoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBpY2tzaXplIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjM2MSwxNSArMjM2MSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BpY2tzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGlja3NpemUoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwaWNrc2l6ZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcWVudGVyIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjM3NywxNSArMjM3NywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3FlbnRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXFlbnRlciggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHFlbnRlciggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2V0ZGVwdGggc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yMzkzLDE1ICsyMzkzLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2V0ZGVwdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXRkZXB0aCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldGRlcHRoKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjbW92MnMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yNDA5LDE1ICsyNDA5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY21vdjJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY21vdjJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY21vdjJzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkcmF3MnMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yNDI1LDE1ICsyNDI1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZHJhdzJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZHJhdzJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHJhdzJzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtb3ZlMnMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yNDQxLDE1ICsyNDQxLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbW92ZTJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbW92ZTJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW92ZTJzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwZHIycyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTI0NTcsMTUgKzI0NTcsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wZHIycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBkcjJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGRyMnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBtdjJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjQ3MywxNSArMjQ3MywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BtdjJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12MnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbXYycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG50MnMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0yNDg5LDE1ICsyNDg5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG50MnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwbnQycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBudDJzKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZHIycyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTI1MDUsMTUgKzI1MDUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZHIycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJkcjJzKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmRyMnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJtdjJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjUyMSwxNSArMjUyMSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JtdjJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm12MnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybXYycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBkcjJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjUzNywxNSArMjUzNywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwZHIycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJwZHIycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwZHIycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBtdjJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjU1MywxNSArMjU1MywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwbXYycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJwbXYycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwbXYycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgeGZwdDJzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMjU2OSwxNSArMjU2OSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3hmcHQycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXhmcHQycyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHhmcHQycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY21vdjIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNTg1LDE1ICsyNTg1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY21vdjIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQljbW92MiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNtb3YyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBkcmF3MiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI2MDEsMTUgKzI2MDEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kcmF3MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWRyYXcyKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHJhdzIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG1vdmUyIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMjYxNywxNSArMjYxNywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21vdmUyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbW92ZTIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtb3ZlMiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG50MiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI2MzMsMTUgKzI2MzMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wbnQyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG50MiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBudDIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBkcjIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNjQ5LDE1ICsyNjQ5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGRyMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBkcjIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwZHIyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbXYyIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMjY2NSwxNSArMjY2NSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BtdjIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwbXYyKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG12MiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmRyMiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI2ODEsMTUgKzI2ODEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZHIyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmRyMiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJkcjIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJtdjIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNjk3LDE1ICsyNjk3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcm12MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJtdjIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBybXYyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycGRyMiBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTI3MTMsMTUgKzI3MTMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycGRyMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXJwZHIyKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnBkcjIoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwbXYyIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMjcyOSwxNSArMjcyOSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwbXYyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBtdjIoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycG12MiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgeGZwdDIgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0yNzQ1LDE1ICsyNzQ1LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdDIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQl4ZnB0MiggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHhmcHQyKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsb2FkbWF0cml4IGZsb2F0IHNbNCo0XSAqLwpAQCAtMjc2MSwxMiArMjc2MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xvYWRtYXRyaXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxvYWRtYXRyaXgoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSBbIDQgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICogNCAsIChmbG9hdCAqKSBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbG9hZG1hdHJpeCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtdWx0bWF0cml4IGZsb2F0IHNbNCo0XSAqLwpAQCAtMjc3NCwxMiArMjc3NCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX211bHRtYXRyaXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW11bHRtYXRyaXgoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSBbIDQgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICogNCAsIChmbG9hdCAqKSBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbXVsdG1hdHJpeCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjcnYgZmxvYXQgc1szKjRdICovCkBAIC0yNzg3LDEyICsyNzg3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3J2KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgNCBdIFsgMyBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiA0ICwgKGZsb2F0ICopIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljcnYoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSBbIDMgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICogNCAsIChmbG9hdCAqKSBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3J2KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJjcnYgZmxvYXQgc1s0KjRdICovCkBAIC0yODAwLDEyICsyODAwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmNydihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDQgXSBbIDQgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICogNCAsIChmbG9hdCAqKSBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmNydiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIFsgNCBdIFsgNCBdIDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByY3J2KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGFkZHRvcHVwIGxvbmcgcyBjaGFyICpzIGxvbmcgcyAqLwpAQCAtMjgxMywxOCArMjgxMywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FkZHRvcHVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXN0cmluZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYWRkdG9wdXAoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIHN0cmluZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYWRkdG9wdXAoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaGFyc3RyIGNoYXIgKnMgKi8KQEAgLTI4MzIsMTIgKzI4MzIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jaGFyc3RyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJpbmcgYXJnMSA7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2hhcnN0ciggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzdHJpbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2hhcnN0ciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBnZXRwb3J0IGNoYXIgKnMgKi8KQEAgLTI4NDUsMTIgKzI4NDUsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRwb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJpbmcgYXJnMSA7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZ2V0cG9ydCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzdHJpbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2V0cG9ydCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogbG9uZyBzdHJ3aWR0aCBjaGFyICpzICovCkBAIC0yODU4LDEyICsyODU4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3Ryd2lkdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXN0cmluZyBhcmcxIDsKLQlpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBzdHJ3aWR0aCggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBzdHJpbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gc3Ryd2lkdGgoIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgd2lub3BlbiBjaGFyICpzICovCkBAIC0yODcxLDEyICsyODcxLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2lub3BlbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0Jc3RyaW5nIGFyZzEgOwotCWlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IHdpbm9wZW4oIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RyaW5nIGFyZzEgOworICAgIGlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHZhbCA9IHdpbm9wZW4oIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIHZvaWQgd2ludGl0bGUgY2hhciAqcyAqLwpAQCAtMjg4NCwxMiArMjg4NCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dpbnRpdGxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJpbmcgYXJnMSA7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2ludGl0bGUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc3RyaW5nIGFyZzEgOworICAgIGlmICghZ2V0aXN0cmluZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdpbnRpdGxlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbGYgbG9uZyBzIGZsb2F0IHNbMyphcmcxXSAqLwpAQCAtMjg5NywxOSArMjg5NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2xmKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCAoKiBhcmcyKSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMzsKKyAgICBpZiAoKGFyZzIgPSAoZmxvYXQoKilbM10pIFB5TWVtX05FVyhmbG9hdCAsIDMgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbGYoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2xmMiBsb25nIHMgZmxvYXQgc1syKmFyZzFdICovCkBAIC0yOTE3LDE5ICsyOTE3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9sZjIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAyIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDI7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzJdKSBQeU1lbV9ORVcoZmxvYXQgLCAyICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2xmMiggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgKCogYXJnMikgWyAyIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDI7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzJdKSBQeU1lbV9ORVcoZmxvYXQgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2xmMiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbHkgbG9uZyBzIGZsb2F0IHNbMyphcmcxXSAqLwpAQCAtMjkzNywxOSArMjkzNywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbHkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2x5KCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCAoKiBhcmcyKSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMzsKKyAgICBpZiAoKGFyZzIgPSAoZmxvYXQoKilbM10pIFB5TWVtX05FVyhmbG9hdCAsIDMgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbHkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2x5MiBsb25nIHMgZmxvYXQgc1syKmFyZzFdICovCkBAIC0yOTU3LDE5ICsyOTU3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9seTIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAyIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDI7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzJdKSBQeU1lbV9ORVcoZmxvYXQgLCAyICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2x5MiggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgKCogYXJnMikgWyAyIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDI7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzJdKSBQeU1lbV9ORVcoZmxvYXQgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2x5MiggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNydm4gbG9uZyBzIGZsb2F0IHNbMyphcmcxXSAqLwpAQCAtMjk3NywxOSArMjk3NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Nydm4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQljcnZuKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCAoKiBhcmcyKSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMzsKKyAgICBpZiAoKGFyZzIgPSAoZmxvYXQoKilbM10pIFB5TWVtX05FVyhmbG9hdCAsIDMgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNydm4oIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByY3J2biBsb25nIHMgZmxvYXQgc1s0KmFyZzFdICovCkBAIC0yOTk3LDE5ICsyOTk3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmNydm4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyA0IF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDQ7Ci0JaWYgKChhcmcyID0gKGZsb2F0KCopWzRdKSBQeU1lbV9ORVcoZmxvYXQgLCA0ICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDQgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlyY3J2biggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgKCogYXJnMikgWyA0IF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDQ7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzRdKSBQeU1lbV9ORVcoZmxvYXQgLCA0ICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDQgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByY3J2biggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbGYyaSBsb25nIHMgbG9uZyBzWzIqYXJnMV0gKi8KQEAgLTMwMTcsMTkgKzMwMTcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2xmMmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyAoKiBhcmcyKSBbIDIgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMjsKLQlpZiAoKGFyZzIgPSAobG9uZygqKVsyXSkgUHlNZW1fTkVXKGxvbmcgLCAyICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMiAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9sZjJpKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nICgqIGFyZzIpIFsgMiBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAyOworICAgIGlmICgoYXJnMiA9IChsb25nKCopWzJdKSBQeU1lbV9ORVcobG9uZyAsIDIgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChsb25nICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2xmMmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2xmaSBsb25nIHMgbG9uZyBzWzMqYXJnMV0gKi8KQEAgLTMwMzcsMTkgKzMwMzcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2xmaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nICgqIGFyZzIpIFsgMyBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChsb25nKCopWzNdKSBQeU1lbV9ORVcobG9uZyAsIDMgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChsb25nICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2xmaSggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyAoKiBhcmcyKSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMzsKKyAgICBpZiAoKGFyZzIgPSAobG9uZygqKVszXSkgUHlNZW1fTkVXKGxvbmcgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9sZmkoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2x5MmkgbG9uZyBzIGxvbmcgc1syKmFyZzFdICovCkBAIC0zMDU3LDE5ICszMDU3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9seTJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgKCogYXJnMikgWyAyIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDI7Ci0JaWYgKChhcmcyID0gKGxvbmcoKilbMl0pIFB5TWVtX05FVyhsb25nICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCXBvbHkyaSggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyAoKiBhcmcyKSBbIDIgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMjsKKyAgICBpZiAoKGFyZzIgPSAobG9uZygqKVsyXSkgUHlNZW1fTkVXKGxvbmcgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMiAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9seTJpKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9seWkgbG9uZyBzIGxvbmcgc1szKmFyZzFdICovCkBAIC0zMDc3LDE5ICszMDc3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9seWkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyAoKiBhcmcyKSBbIDMgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMzsKLQlpZiAoKGFyZzIgPSAobG9uZygqKVszXSkgUHlNZW1fTkVXKGxvbmcgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMyAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9seWkoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgKCogYXJnMikgWyAzIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKGxvbmcoKilbM10pIFB5TWVtX05FVyhsb25nICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbHlpKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9sZjJzIGxvbmcgcyBzaG9ydCBzWzIqYXJnMV0gKi8KQEAgLTMwOTcsMTkgKzMwOTcsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2xmMnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0Jc2hvcnQgKCogYXJnMikgWyAyIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDI7Ci0JaWYgKChhcmcyID0gKHNob3J0KCopWzJdKSBQeU1lbV9ORVcoc2hvcnQgLCAyICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDIgKiBhcmcxICwgKHNob3J0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2xmMnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIHNob3J0ICgqIGFyZzIpIFsgMiBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAyOworICAgIGlmICgoYXJnMiA9IChzaG9ydCgqKVsyXSkgUHlNZW1fTkVXKHNob3J0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9sZjJzKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9sZnMgbG9uZyBzIHNob3J0IHNbMyphcmcxXSAqLwpAQCAtMzExNywxOSArMzExNywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BvbGZzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXNob3J0ICgqIGFyZzIpIFsgMyBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChzaG9ydCgqKVszXSkgUHlNZW1fTkVXKHNob3J0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9sZnMoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIHNob3J0ICgqIGFyZzIpIFsgMyBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAzOworICAgIGlmICgoYXJnMiA9IChzaG9ydCgqKVszXSkgUHlNZW1fTkVXKHNob3J0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAzICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9sZnMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwb2x5cyBsb25nIHMgc2hvcnQgc1szKmFyZzFdICovCkBAIC0zMTM3LDE5ICszMTM3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9seXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0Jc2hvcnQgKCogYXJnMikgWyAzIF0gOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKHNob3J0KCopWzNdKSBQeU1lbV9ORVcoc2hvcnQgLCAzICogYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKHNob3J0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwb2x5cyggYXJnMSAsIGFyZzIgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgc2hvcnQgKCogYXJnMikgWyAzIF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKHNob3J0KCopWzNdKSBQeU1lbV9ORVcoc2hvcnQgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDMgKiBhcmcxICwgKHNob3J0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwb2x5cyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBvbHkycyBsb25nIHMgc2hvcnQgc1syKmFyZzFdICovCkBAIC0zMTU3LDE5ICszMTU3LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG9seTJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXNob3J0ICgqIGFyZzIpIFsgMiBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChzaG9ydCgqKVsyXSkgUHlNZW1fTkVXKHNob3J0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAyICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9seTJzKCBhcmcxICwgYXJnMiApOwotCVB5TWVtX0RFTChhcmcyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBzaG9ydCAoKiBhcmcyKSBbIDIgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMjsKKyAgICBpZiAoKGFyZzIgPSAoc2hvcnQoKilbMl0pIFB5TWVtX05FVyhzaG9ydCAsIDIgKiBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMiAqIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBvbHkycyggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRlZmN1cnNvciBzaG9ydCBzIHVfc2hvcnQgc1sxMjhdICovCkBAIC0zMTc3LDE1ICszMTc3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGVmY3Vyc29yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQl1bnNpZ25lZCBzaG9ydCBhcmcyIFsgMTI4IF0gOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCAxMjggLCAoc2hvcnQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWRlZmN1cnNvciggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgdW5zaWduZWQgc2hvcnQgYXJnMiBbIDEyOCBdIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgMTI4ICwgKHNob3J0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkZWZjdXJzb3IoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHdyaXRlcGl4ZWxzIHNob3J0IHMgdV9zaG9ydCBzW2FyZzFdICovCkBAIC0zMTkzLDE4ICszMTkzLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd3JpdGVwaXhlbHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXVuc2lnbmVkIHNob3J0ICogYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheXNpemUoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGFyZzIgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd3JpdGVwaXhlbHMoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmcyID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIGFyZzEgLCAoc2hvcnQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdyaXRlcGl4ZWxzKCBhcmcxICwgYXJnMiApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZGVmYmFzaXMgbG9uZyBzIGZsb2F0IHNbNCo0XSAqLwpAQCAtMzIxMiwxNSArMzIxMiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RlZmJhc2lzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWZsb2F0IGFyZzIgWyA0IF0gWyA0IF0gOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDIsIDEsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlkZWZiYXNpcyggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIFsgNCBdIFsgNCBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAyLCAxLCA0ICogNCAsIChmbG9hdCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVmYmFzaXMoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdld3JpdGUgc2hvcnQgcyBzaG9ydCBzW2FyZzFdICovCkBAIC0zMjI4LDE4ICszMjI4LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V3cml0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgKiBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFycmF5c2l6ZShhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMiA9IFB5TWVtX05FVyhzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCBhcmcxICwgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWdld3JpdGUoIGFyZzEgLCBhcmcyICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCAqIGFyZzIgOworICAgIGlmICghZ2V0aXNob3J0YXJyYXlzaXplKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmcyID0gUHlNZW1fTkVXKHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIGFyZzEgLCBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2V3cml0ZSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeU1lbV9ERUwoYXJnMik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJvdGF0ZSBzaG9ydCBzIGNoYXIgcyAqLwpAQCAtMzI0NywxNSArMzI0NywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JvdGF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0JY2hhciBhcmcyIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWNoYXJhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlyb3RhdGUoIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGNoYXIgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGljaGFyYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcm90YXRlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByb3QgZmxvYXQgcyBjaGFyIHMgKi8KQEAgLTMyNjMsMTUgKzMyNjMsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yb3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWNoYXIgYXJnMiA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGljaGFyYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm90KCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBjaGFyIGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpY2hhcmFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJvdCggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY2lyY2ZpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zMjc5LDE4ICszMjc5LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2lyY2ZpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljaXJjZmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjaXJjZmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaXJjaSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzI5OCwxOCArMzI5OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NpcmNpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljaXJjaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNpcmNpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY21vdmkgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTMzMTcsMTggKzMzMTcsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbW92aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY21vdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbW92aSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGRyYXdpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zMzM2LDE4ICszMzM2LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZHJhd2koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWRyYXdpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZHJhd2koIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtb3ZlaSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzM1NSwxOCArMzM1NSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21vdmVpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQltb3ZlaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1vdmVpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG50aSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzM3NCwxOCArMzM3NCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BudGkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXBudGkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbnRpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbmV3dGFnIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zMzkzLDE4ICszMzkzLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbmV3dGFnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQluZXd0YWcoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXd0YWcoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwZHJpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNDEyLDE4ICszNDEyLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGRyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGRyaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBkcmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbXZpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNDMxLDE4ICszNDMxLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG12aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12aSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBtdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZHJpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNDUwLDE4ICszNDUwLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmRyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmRyaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJkcmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBybXZpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNDY5LDE4ICszNDY5LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcm12aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm12aSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJtdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycGRyaSBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtMzQ4OCwxOCArMzQ4OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwZHJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlycGRyaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwZHJpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBtdmkgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTM1MDcsMTggKzM1MDcsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycG12aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBtdmkoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycG12aSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHRpIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC0zNTI2LDE4ICszNTI2LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdGkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXhmcHRpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdGkoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaXJjIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNTQ1LDE4ICszNTQ1LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2lyYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2lyYyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNpcmMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaXJjZiBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzU2NCwxOCArMzU2NCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NpcmNmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljaXJjZiggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNpcmNmKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY21vdiBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzU4MywxOCArMzU4MywxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Ntb3YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWNtb3YoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjbW92KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZHJhdyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzYwMiwxOCArMzYwMiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RyYXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWRyYXcoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkcmF3KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbW92ZSBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzYyMSwxOCArMzYyMSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21vdmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCW1vdmUoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtb3ZlKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG50IGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNjQwLDE4ICszNjQwLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlwbnQoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwbnQoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzY2FsZSBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzY1OSwxOCArMzY1OSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NjYWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlzY2FsZSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNjYWxlKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdHJhbnNsYXRlIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNjc4LDE4ICszNjc4LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdHJhbnNsYXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQl0cmFuc2xhdGUoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0cmFuc2xhdGUoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwZHIgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM2OTcsMTggKzM2OTcsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wZHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXBkciggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBkciggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHBtdiBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtMzcxNiwxOCArMzcxNiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BtdihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG12KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmRyIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC0zNzM1LDE4ICszNzM1LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlyZHIoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZHIoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBybXYgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM3NTQsMTggKzM3NTQsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ybXYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXJtdiggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJtdiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwZHIgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM3NzMsMTggKzM3NzMsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycGRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlycGRyKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnBkciggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJwbXYgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM3OTIsMTggKzM3OTIsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycG12KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlycG12KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnBtdiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHQgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTM4MTEsMTggKzM4MTEsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF94ZnB0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQl4ZnB0KCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdCggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIFJHQmNvbG9yIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zODMwLDE4ICszODMwLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfUkdCY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCVJHQmNvbG9yKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUkdCY29sb3IoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBSR0J3cml0ZW1hc2sgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTM4NDksMTggKzM4NDksMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9SR0J3cml0ZW1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCVJHQndyaXRlbWFzayggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJHQndyaXRlbWFzayggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldGN1cnNvciBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMzg2OCwxOCArMzg2OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldGN1cnNvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0Y3Vyc29yKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0Y3Vyc29yKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdGllIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zODg3LDE4ICszODg3LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdGllKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQl0aWUoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0aWUoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjaXJjZnMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTM5MDYsMTggKzM5MDYsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jaXJjZnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWNpcmNmcyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNpcmNmcyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNpcmNzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zOTI1LDE4ICszOTI1LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY2lyY3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWNpcmNzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2lyY3MoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjbW92cyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtMzk0NCwxOCArMzk0NCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Ntb3ZzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQljbW92cyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNtb3ZzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZHJhd3Mgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTM5NjMsMTggKzM5NjMsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kcmF3cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZHJhd3MoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkcmF3cyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIG1vdmVzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC0zOTgyLDE4ICszOTgyLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbW92ZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCW1vdmVzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW92ZXMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwZHJzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MDAxLDE4ICs0MDAxLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcGRycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcGRycyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBkcnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbXZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MDIwLDE4ICs0MDIwLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG12cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG12cyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBtdnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbnRzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MDM5LDE4ICs0MDM5LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG50cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG50cyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBudHMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZHJzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MDU4LDE4ICs0MDU4LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmRycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmRycyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJkcnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBybXZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MDc3LDE4ICs0MDc3LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcm12cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jcm12cyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJtdnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBycGRycyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDA5NiwxOCArNDA5NiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwZHJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlycGRycyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwZHJzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBtdnMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQxMTUsMTggKzQxMTUsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ycG12cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBtdnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBycG12cyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHRzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MTM0LDE4ICs0MTM0LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXhmcHRzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdHMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJvcmlnaW4gc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQxNTMsMTggKzQxNTMsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJvcmlnaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWN1cm9yaWdpbiggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGN1cm9yaWdpbiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGN5Y2xlbWFwIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00MTcyLDE4ICs0MTcyLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3ljbGVtYXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWN5Y2xlbWFwKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3ljbGVtYXAoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwYXRjaCBmbG9hdCBzWzQqNF0gZmxvYXQgc1s0KjRdIGZsb2F0IHNbNCo0XSAqLwpAQCAtNDE5MSwxOCArNDE5MSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BhdGNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgNCBdIFsgNCBdIDsKLQlmbG9hdCBhcmcyIFsgNCBdIFsgNCBdIDsKLQlmbG9hdCBhcmczIFsgNCBdIFsgNCBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDMsIDAsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDMsIDEsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDMsIDIsIDQgKiA0ICwgKGZsb2F0ICopIGFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlwYXRjaCggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOworICAgIGZsb2F0IGFyZzIgWyA0IF0gWyA0IF0gOworICAgIGZsb2F0IGFyZzMgWyA0IF0gWyA0IF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMywgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMywgMSwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMywgMiwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBhdGNoKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3BsZiBsb25nIHMgZmxvYXQgc1szKmFyZzFdIHVfc2hvcnQgc1thcmcxXSAqLwpAQCAtNDIxMCwyNSArNDIxMCwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NwbGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgKCogYXJnMikgWyAzIF0gOwotCXVuc2lnbmVkIHNob3J0ICogYXJnMyA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWFyZzEgPSBhcmcxIC8gMzsKLQlpZiAoKGFyZzIgPSAoZmxvYXQoKilbM10pIFB5TWVtX05FVyhmbG9hdCAsIDMgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMiwgMCwgMyAqIGFyZzEgLCAoZmxvYXQgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlzcGxmKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlNZW1fREVMKGFyZzMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGZsb2F0ICgqIGFyZzIpIFsgMyBdIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzNdKSBQeU1lbV9ORVcoZmxvYXQgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDIsIDAsIDMgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3BsZiggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5TWVtX0RFTChhcmczKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3BsZjIgbG9uZyBzIGZsb2F0IHNbMiphcmcxXSB1X3Nob3J0IHNbYXJnMV0gKi8KQEAgLTQyMzYsMjUgKzQyMzYsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGxmMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlmbG9hdCAoKiBhcmcyKSBbIDIgXSA7Ci0JdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChmbG9hdCgqKVsyXSkgUHlNZW1fTkVXKGZsb2F0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAyLCAwLCAyICogYXJnMSAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXNwbGYyKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlNZW1fREVMKGFyZzMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGZsb2F0ICgqIGFyZzIpIFsgMiBdIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDI7CisgICAgaWYgKChhcmcyID0gKGZsb2F0KCopWzJdKSBQeU1lbV9ORVcoZmxvYXQgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDIsIDAsIDIgKiBhcmcxICwgKGZsb2F0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3BsZjIoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeU1lbV9ERUwoYXJnMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNwbGZpIGxvbmcgcyBsb25nIHNbMyphcmcxXSB1X3Nob3J0IHNbYXJnMV0gKi8KQEAgLTQyNjIsMjUgKzQyNjIsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGxmaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nICgqIGFyZzIpIFsgMyBdIDsKLQl1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcxID0gYXJnMSAvIDM7Ci0JaWYgKChhcmcyID0gKGxvbmcoKilbM10pIFB5TWVtX05FVyhsb25nICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDIsIDAsIDMgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlzcGxmaSggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmczKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nICgqIGFyZzIpIFsgMyBdIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKGxvbmcoKilbM10pIFB5TWVtX05FVyhsb25nICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDIsIDAsIDMgKiBhcmcxICwgKGxvbmcgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoYXJnMyA9IFB5TWVtX05FVyh1bnNpZ25lZCBzaG9ydCAsIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAxLCBhcmcxICwgKHNob3J0ICopIGFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzcGxmaSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5TWVtX0RFTChhcmczKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3BsZjJpIGxvbmcgcyBsb25nIHNbMiphcmcxXSB1X3Nob3J0IHNbYXJnMV0gKi8KQEAgLTQyODgsMjUgKzQyODgsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGxmMmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyAoKiBhcmcyKSBbIDIgXSA7Ci0JdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChsb25nKCopWzJdKSBQeU1lbV9ORVcobG9uZyAsIDIgKiBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAyLCAwLCAyICogYXJnMSAsIChsb25nICopIGFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3BsZjJpKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlNZW1fREVMKGFyZzMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgKCogYXJnMikgWyAyIF0gOworICAgIHVuc2lnbmVkIHNob3J0ICogYXJnMyA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZzEgPSBhcmcxIC8gMjsKKyAgICBpZiAoKGFyZzIgPSAobG9uZygqKVsyXSkgUHlNZW1fTkVXKGxvbmcgLCAyICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMiwgMCwgMiAqIGFyZzEgLCAobG9uZyAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNwbGYyaSggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5TWVtX0RFTChhcmczKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc3BsZnMgbG9uZyBzIHNob3J0IHNbMyphcmcxXSB1X3Nob3J0IHNbYXJnMV0gKi8KQEAgLTQzMTQsMjUgKzQzMTQsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zcGxmcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlzaG9ydCAoKiBhcmcyKSBbIDMgXSA7Ci0JdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAzOwotCWlmICgoYXJnMiA9IChzaG9ydCgqKVszXSkgUHlNZW1fTkVXKHNob3J0ICwgMyAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAwLCAzICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXNwbGZzKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeU1lbV9ERUwoYXJnMik7Ci0JUHlNZW1fREVMKGFyZzMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIHNob3J0ICgqIGFyZzIpIFsgMyBdIDsKKyAgICB1bnNpZ25lZCBzaG9ydCAqIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcnJheXNpemUoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmcxID0gYXJnMSAvIDM7CisgICAgaWYgKChhcmcyID0gKHNob3J0KCopWzNdKSBQeU1lbV9ORVcoc2hvcnQgLCAzICogYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDAsIDMgKiBhcmcxICwgKHNob3J0ICopIGFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGFyZzMgPSBQeU1lbV9ORVcodW5zaWduZWQgc2hvcnQgLCBhcmcxICkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMiwgMSwgYXJnMSAsIChzaG9ydCAqKSBhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3BsZnMoIGFyZzEgLCBhcmcyICwgYXJnMyApOworICAgIFB5TWVtX0RFTChhcmcyKTsKKyAgICBQeU1lbV9ERUwoYXJnMyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNwbGYycyBsb25nIHMgc2hvcnQgc1syKmFyZzFdIHVfc2hvcnQgc1thcmcxXSAqLwpAQCAtNDM0MCwyNSArNDM0MCwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NwbGYycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlzaG9ydCAoKiBhcmcyKSBbIDIgXSA7Ci0JdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKLQlpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnMSA9IGFyZzEgLyAyOwotCWlmICgoYXJnMiA9IChzaG9ydCgqKVsyXSkgUHlNZW1fTkVXKHNob3J0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAwLCAyICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXNwbGYycyggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlNZW1fREVMKGFyZzIpOwotCVB5TWVtX0RFTChhcmczKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBzaG9ydCAoKiBhcmcyKSBbIDIgXSA7CisgICAgdW5zaWduZWQgc2hvcnQgKiBhcmczIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXlzaXplKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJnMSA9IGFyZzEgLyAyOworICAgIGlmICgoYXJnMiA9IChzaG9ydCgqKVsyXSkgUHlNZW1fTkVXKHNob3J0ICwgMiAqIGFyZzEgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAyLCAwLCAyICogYXJnMSAsIChzaG9ydCAqKSBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChhcmczID0gUHlNZW1fTkVXKHVuc2lnbmVkIHNob3J0ICwgYXJnMSApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDIsIDEsIGFyZzEgLCAoc2hvcnQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNwbGYycyggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlNZW1fREVMKGFyZzIpOworICAgIFB5TWVtX0RFTChhcmczKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcnBhdGNoIGZsb2F0IHNbNCo0XSBmbG9hdCBzWzQqNF0gZmxvYXQgc1s0KjRdIGZsb2F0IHNbNCo0XSAqLwpAQCAtNDM2NiwyMSArNDM2NiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JwYXRjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDQgXSBbIDQgXSA7Ci0JZmxvYXQgYXJnMiBbIDQgXSBbIDQgXSA7Ci0JZmxvYXQgYXJnMyBbIDQgXSBbIDQgXSA7Ci0JZmxvYXQgYXJnNCBbIDQgXSBbIDQgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCA0LCAwLCA0ICogNCAsIChmbG9hdCAqKSBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCA0LCAxLCA0ICogNCAsIChmbG9hdCAqKSBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCA0LCAyLCA0ICogNCAsIChmbG9hdCAqKSBhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCA0LCAzLCA0ICogNCAsIChmbG9hdCAqKSBhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnBhdGNoKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyA0IF0gWyA0IF0gOworICAgIGZsb2F0IGFyZzIgWyA0IF0gWyA0IF0gOworICAgIGZsb2F0IGFyZzMgWyA0IF0gWyA0IF0gOworICAgIGZsb2F0IGFyZzQgWyA0IF0gWyA0IF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMCwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMSwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMiwgNCAqIDQgLCAoZmxvYXQgKikgYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgNCwgMywgNCAqIDQgLCAoZmxvYXQgKikgYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJwYXRjaCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvcnRobzIgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNDM4OCwyMSArNDM4OCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX29ydGhvMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlvcnRobzIoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvcnRobzIoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmVjdCBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC00NDEwLDIxICs0NDEwLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlyZWN0KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVjdCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCByZWN0ZiBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC00NDMyLDIxICs0NDMyLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVjdGYoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZWN0ZiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB4ZnB0NCBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC00NDU0LDIxICs0NDU0LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfeGZwdDQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JeGZwdDQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ZnB0NCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB0ZXh0cG9ydCBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NDc2LDIxICs0NDc2LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdGV4dHBvcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JdGV4dHBvcnQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0cG9ydCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtYXBjb2xvciBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NDk4LDIxICs0NDk4LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbWFwY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFwY29sb3IoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtYXBjb2xvciggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzY3JtYXNrIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ1MjAsMjEgKzQ1MjAsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zY3JtYXNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXNjcm1hc2soIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzY3JtYXNrKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldHZhbHVhdG9yIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ1NDIsMjEgKzQ1NDIsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXR2YWx1YXRvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlzZXR2YWx1YXRvciggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldHZhbHVhdG9yKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHZpZXdwb3J0IHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ1NjQsMjEgKzQ1NjQsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92aWV3cG9ydChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQl2aWV3cG9ydCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHZpZXdwb3J0KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNoYWRlcmFuZ2Ugc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDU4NiwyMSArNDU4NiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NoYWRlcmFuZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2hhZGVyYW5nZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNoYWRlcmFuZ2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgeGZwdDRzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTQ2MDgsMjEgKzQ2MDgsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF94ZnB0NHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JeGZwdDRzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeGZwdDRzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlY3RmaSBsb25nIHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTQ2MzAsMjEgKzQ2MzAsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9yZWN0ZmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXJlY3RmaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZWN0ZmkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcmVjdGkgbG9uZyBzIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC00NjUyLDIxICs0NjUyLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdGkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXJlY3RpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGxvbmcgYXJnNCA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlY3RpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHhmcHQ0aSBsb25nIHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTQ2NzQsMjEgKzQ2NzQsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF94ZnB0NGkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXhmcHQ0aSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ZnB0NGkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcHJlZnBvc2l0aW9uIGxvbmcgcyBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNDY5NiwyMSArNDY5NiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3ByZWZwb3NpdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcHJlZnBvc2l0aW9uKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGxvbmcgYXJnNCA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHByZWZwb3NpdGlvbiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBhcmMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NzE4LDI0ICs0NzE4LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYXJjKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJjKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBzaG9ydCBhcmc1IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJjKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBhcmNmIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDc0MywyNCArNDc0MywyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FyY2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmNmKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBzaG9ydCBhcmc1IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJjZiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYXJjZmkgbG9uZyBzIGxvbmcgcyBsb25nIHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00NzY4LDI0ICs0NzY4LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYXJjZmkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmNmaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyY2ZpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBhcmNpIGxvbmcgcyBsb25nIHMgbG9uZyBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDc5MywyNCArNDc5MywyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FyY2koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlhcmNpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBzaG9ydCBhcmc1IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA1LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNSwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJjaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmJveDIgc2hvcnQgcyBzaG9ydCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgKi8KQEAgLTQ4MTgsMjcgKzQ4MTgsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iYm94MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JZmxvYXQgYXJnNSA7Ci0JZmxvYXQgYXJnNiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYmJveDIoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBmbG9hdCBhcmc1IDsKKyAgICBmbG9hdCBhcmc2IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNSwgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBiYm94MiggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJib3gyaSBzaG9ydCBzIHNob3J0IHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgbG9uZyBzICovCkBAIC00ODQ2LDI3ICs0ODQ2LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmJveDJpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWxvbmcgYXJnNCA7Ci0JbG9uZyBhcmc1IDsKLQlsb25nIGFyZzYgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNiwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYmJveDJpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGxvbmcgYXJnNSA7CisgICAgbG9uZyBhcmc2IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA2LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNiwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA2LCA1LCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJib3gyaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJib3gycyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNDg3NCwyNyArNDg3NCwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2Jib3gycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0Jc2hvcnQgYXJnNSA7Ci0Jc2hvcnQgYXJnNiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYmJveDJzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgc2hvcnQgYXJnNiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYmJveDJzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmxpbmsgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC00OTAyLDI0ICs0OTAyLDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmxpbmsoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlibGluayggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJsaW5rKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvcnRobyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNDkyNywyNyArNDkyNywyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX29ydGhvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlmbG9hdCBhcmc1IDsKLQlmbG9hdCBhcmc2IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNSwgJmFyZzYpKQotCQlyZXR1cm4gTlVMTDsKLQlvcnRobyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGZsb2F0IGFyZzUgOworICAgIGZsb2F0IGFyZzYgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCA1LCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9ydGhvKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgd2luZG93IGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC00OTU1LDI3ICs0OTU1LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luZG93KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlmbG9hdCBhcmc1IDsKLQlmbG9hdCBhcmc2IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNSwgJmFyZzYpKQotCQlyZXR1cm4gTlVMTDsKLQl3aW5kb3coIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBmbG9hdCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBmbG9hdCBhcmc1IDsKKyAgICBmbG9hdCBhcmc2IDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA2LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDYsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNiwgNSwgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aW5kb3coIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsb29rYXQgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgc2hvcnQgcyAqLwpAQCAtNDk4MywzMCArNDk4MywzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xvb2thdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JZmxvYXQgYXJnNSA7Ci0JZmxvYXQgYXJnNiA7Ci0Jc2hvcnQgYXJnNyA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgNiwgJmFyZzcpKQotCQlyZXR1cm4gTlVMTDsKLQlsb29rYXQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgZmxvYXQgYXJnNSA7CisgICAgZmxvYXQgYXJnNiA7CisgICAgc2hvcnQgYXJnNyA7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNywgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA3LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDcsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgNiwgJmFyZzcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsb29rYXQoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcGVyc3BlY3RpdmUgc2hvcnQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNTAxNCwyMSArNTAxNCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3BlcnNwZWN0aXZlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXBlcnNwZWN0aXZlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcGVyc3BlY3RpdmUoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgcG9sYXJ2aWV3IGZsb2F0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTUwMzYsMjEgKzUwMzYsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9wb2xhcnZpZXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcG9sYXJ2aWV3KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9sYXJ2aWV3KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGFyY2ZzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNTA1OCwyNCArNTA1OCwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2FyY2ZzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJjZnMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIHNob3J0IGFyZzUgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmNmcyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYXJjcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTUwODMsMjQgKzUwODMsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9hcmNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlzaG9ydCBhcmc1IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJjcyggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDUsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNSwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA1LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyY3MoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlY3Rjb3B5IHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzICovCkBAIC01MTA4LDI3ICs1MTA4LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVjdGNvcHkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCXNob3J0IGFyZzYgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgNCwgJmFyZzUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA1LCAmYXJnNikpCi0JCXJldHVybiBOVUxMOwotCXJlY3Rjb3B5KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgc2hvcnQgYXJnNiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNiwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA2LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDYsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVjdGNvcHkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBSR0JjdXJzb3Igc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNTEzNiwzMCArNTEzNiwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX1JHQmN1cnNvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0Jc2hvcnQgYXJnNSA7Ci0Jc2hvcnQgYXJnNiA7Ci0Jc2hvcnQgYXJnNyA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgNiwgJmFyZzcpKQotCQlyZXR1cm4gTlVMTDsKLQlSR0JjdXJzb3IoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgc2hvcnQgYXJnNiA7CisgICAgc2hvcnQgYXJnNyA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA3LCA0LCAmYXJnNSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDcsIDUsICZhcmc2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNywgNiwgJmFyZzcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSR0JjdXJzb3IoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIGxvbmcgZ2V0YnV0dG9uIHNob3J0IHMgKi8KQEAgLTUxNjcsMTIgKzUxNjcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRidXR0b24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gZ2V0YnV0dG9uKCBhcmcxICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHNob3J0IGFyZzEgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gZ2V0YnV0dG9uKCBhcmcxICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGNtbW9kZSAqLwpAQCAtNTE4MCw5ICs1MTgwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRjbW1vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGNtbW9kZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0Y21tb2RlKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRsc2JhY2t1cCAqLwpAQCAtNTE5MCw5ICs1MTkwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRsc2JhY2t1cChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0bHNiYWNrdXAoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGxzYmFja3VwKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRyZXNldGxzICovCkBAIC01MjAwLDkgKzUyMDAsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHJlc2V0bHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldHJlc2V0bHMoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldHJlc2V0bHMoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGRjbSAqLwpAQCAtNTIxMCw5ICs1MjEwLDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRkY20oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGRjbSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0ZGNtKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXR6YnVmZmVyICovCkBAIC01MjIwLDkgKzUyMjAsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHpidWZmZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldHpidWZmZXIoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldHpidWZmZXIoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGlzbWV4ICovCkBAIC01MjMwLDkgKzUyMzAsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2lzbWV4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBpc21leCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gaXNtZXgoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGlzb2JqIGxvbmcgcyAqLwpAQCAtNTI0MCwxMiArNTI0MCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2lzb2JqKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBpc29iaiggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBpc29iaiggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBpc3F1ZXVlZCBzaG9ydCBzICovCkBAIC01MjUzLDEyICs1MjUzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfaXNxdWV1ZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gaXNxdWV1ZWQoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBpc3F1ZXVlZCggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBpc3RhZyBsb25nIHMgKi8KQEAgLTUyNjYsMTIgKzUyNjYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9pc3RhZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gaXN0YWcoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gaXN0YWcoIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2Vub2JqICovCkBAIC01Mjc5LDkgKzUyNzksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dlbm9iaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2Vub2JqKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZW5vYmooICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdlbnRhZyAqLwpAQCAtNTI4OSw5ICs1Mjg5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZW50YWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdlbnRhZyggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2VudGFnKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRidWZmZXIgKi8KQEAgLTUyOTksOSArNTI5OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0YnVmZmVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRidWZmZXIoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGJ1ZmZlciggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0Y29sb3IgKi8KQEAgLTUzMDksOSArNTMwOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0Y29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGNvbG9yKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRjb2xvciggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0ZGlzcGxheW1vZGUgKi8KQEAgLTUzMTksOSArNTMxOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0ZGlzcGxheW1vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGRpc3BsYXltb2RlKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRkaXNwbGF5bW9kZSggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0Zm9udCAqLwpAQCAtNTMyOSw5ICs1MzI5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRmb250KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRmb250KCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRmb250KCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRoZWlnaHQgKi8KQEAgLTUzMzksOSArNTMzOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0aGVpZ2h0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRoZWlnaHQoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGhlaWdodCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0aGl0Y29kZSAqLwpAQCAtNTM0OSw5ICs1MzQ5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRoaXRjb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRoaXRjb2RlKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRoaXRjb2RlKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRsc3R5bGUgKi8KQEAgLTUzNTksOSArNTM1OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0bHN0eWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRsc3R5bGUoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldGxzdHlsZSggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0bHdpZHRoICovCkBAIC01MzY5LDkgKzUzNjksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGx3aWR0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0bHdpZHRoKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRsd2lkdGgoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldG1hcCAqLwpAQCAtNTM3OSw5ICs1Mzc5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRtYXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldG1hcCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0bWFwKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRwbGFuZXMgKi8KQEAgLTUzODksOSArNTM4OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0cGxhbmVzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRwbGFuZXMoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldHBsYW5lcyggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0d3JpdGVtYXNrICovCkBAIC01Mzk5LDkgKzUzOTksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHdyaXRlbWFzayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0d3JpdGVtYXNrKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXR3cml0ZW1hc2soICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIHF0ZXN0ICovCkBAIC01NDA5LDkgKzU0MDksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3F0ZXN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBxdGVzdCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gcXRlc3QoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGxzcmVwZWF0ICovCkBAIC01NDE5LDkgKzU0MTksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGxzcmVwZWF0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRsc3JlcGVhdCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0bHNyZXBlYXQoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldG1vbml0b3IgKi8KQEAgLTU0MjksOSArNTQyOSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0bW9uaXRvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0bW9uaXRvciggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0bW9uaXRvciggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0b3Blbm9iaiAqLwpAQCAtNTQzOSw5ICs1NDM5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRvcGVub2JqKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRvcGVub2JqKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRvcGVub2JqKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXRwYXR0ZXJuICovCkBAIC01NDQ5LDkgKzU0NDksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHBhdHRlcm4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldHBhdHRlcm4oICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IGdldHBhdHRlcm4oICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIHdpbmdldCAqLwpAQCAtNTQ1OSw5ICs1NDU5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW5nZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IHdpbmdldCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gd2luZ2V0KCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyB3aW5hdHRhY2ggKi8KQEAgLTU0NjksOSArNTQ2OSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luYXR0YWNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSB3aW5hdHRhY2goICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IHdpbmF0dGFjaCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0b3RoZXJtb25pdG9yICovCkBAIC01NDc5LDkgKzU0NzksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG90aGVybW9uaXRvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0b3RoZXJtb25pdG9yKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRvdGhlcm1vbml0b3IoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIG5ld3B1cCAqLwpAQCAtNTQ4OSw5ICs1NDg5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9uZXdwdXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IG5ld3B1cCggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gbmV3cHVwKCApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogbG9uZyBnZXR2YWx1YXRvciBzaG9ydCBzICovCkBAIC01NDk5LDEyICs1NDk5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0dmFsdWF0b3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXNob3J0IGFyZzEgOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gZ2V0dmFsdWF0b3IoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgc2hvcnQgYXJnMSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBnZXR2YWx1YXRvciggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogdm9pZCB3aW5zZXQgbG9uZyBzICovCkBAIC01NTEyLDEyICs1NTEyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfd2luc2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl3aW5zZXQoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2luc2V0KCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBsb25nIGRvcHVwIGxvbmcgcyAqLwpAQCAtNTUyNSwxMiArNTUyNSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2RvcHVwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBkb3B1cCggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBkb3B1cCggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogdm9pZCBnZXRkZXB0aCBzaG9ydCByIHNob3J0IHIgKi8KQEAgLTU1MzgsMTUgKzU1MzgsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRkZXB0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JZ2V0ZGVwdGgoICYgYXJnMSAsICYgYXJnMiApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgZ2V0ZGVwdGgoICYgYXJnMSAsICYgYXJnMiApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgZ2V0Y3BvcyBzaG9ydCByIHNob3J0IHIgKi8KQEAgLTU1NTQsMTUgKzU1NTQsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9nZXRjcG9zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlnZXRjcG9zKCAmIGFyZzEgLCAmIGFyZzIgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIGdldGNwb3MoICYgYXJnMSAsICYgYXJnMiApOworICAgIHsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOworICAgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgZ2V0c2l6ZSBsb25nIHIgbG9uZyByICovCkBAIC01NTcwLDE1ICs1NTcwLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0c2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWdldHNpemUoICYgYXJnMSAsICYgYXJnMiApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdsb25nb2JqZWN0KGFyZzEpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2xvbmdvYmplY3QoYXJnMikpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBnZXRzaXplKCAmIGFyZzEgLCAmIGFyZzIgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3bG9uZ29iamVjdChhcmcxKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdsb25nb2JqZWN0KGFyZzIpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBnZXRvcmlnaW4gbG9uZyByIGxvbmcgciAqLwpAQCAtNTU4NiwxNSArNTU4NiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG9yaWdpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWdldG9yaWdpbiggJiBhcmcxICwgJiBhcmcyICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAyICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2xvbmdvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3bG9uZ29iamVjdChhcmcyKSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGdldG9yaWdpbiggJiBhcmcxICwgJiBhcmcyICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAyICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2xvbmdvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3bG9uZ29iamVjdChhcmcyKSk7CisgICAgICByZXR1cm4gdjsKKyAgICB9CiB9CiAKIC8qIHZvaWQgZ2V0dmlld3BvcnQgc2hvcnQgciBzaG9ydCByIHNob3J0IHIgc2hvcnQgciAqLwpAQCAtNTYwMiwxOSArNTYwMiwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHZpZXdwb3J0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlnZXR2aWV3cG9ydCggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBnZXR2aWV3cG9ydCggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBnZXR0cCBzaG9ydCByIHNob3J0IHIgc2hvcnQgciBzaG9ydCByICovCkBAIC01NjIyLDE5ICs1NjIyLDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0dHAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWdldHRwKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgLCAmIGFyZzQgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDQgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDMsIG1rbmV3c2hvcnRvYmplY3QoYXJnNCkpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGdldHRwKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgLCAmIGFyZzQgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDQgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDMsIG1rbmV3c2hvcnRvYmplY3QoYXJnNCkpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdldGdwb3MgZmxvYXQgciBmbG9hdCByIGZsb2F0IHIgZmxvYXQgciAqLwpAQCAtNTY0MiwxOSArNTY0MiwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGdwb3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgOwotCWZsb2F0IGFyZzIgOwotCWZsb2F0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWdldGdwb3MoICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNCApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdmbG9hdG9iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdmbG9hdG9iamVjdChhcmcyKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdmbG9hdG9iamVjdChhcmczKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdmbG9hdG9iamVjdChhcmc0KSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgZmxvYXQgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgZmxvYXQgYXJnMyA7CisgICAgZmxvYXQgYXJnNCA7CisgICAgZ2V0Z3BvcyggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2Zsb2F0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2Zsb2F0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld2Zsb2F0b2JqZWN0KGFyZzMpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld2Zsb2F0b2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCB3aW5wb3NpdGlvbiBsb25nIHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTU2NjIsMjEgKzU2NjIsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW5wb3NpdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2lucG9zaXRpb24oIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgbG9uZyBhcmc0IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2lucG9zaXRpb24oIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZ1JHQmNvbG9yIHNob3J0IHIgc2hvcnQgciBzaG9ydCByICovCkBAIC01Njg0LDE3ICs1Njg0LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ1JHQmNvbG9yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlnUkdCY29sb3IoICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMyApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdzaG9ydG9iamVjdChhcmczKSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgZ1JHQmNvbG9yKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDMgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdSR0JtYXNrIHNob3J0IHIgc2hvcnQgciBzaG9ydCByICovCkBAIC01NzAyLDE3ICs1NzAyLDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ1JHQm1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWdSR0JtYXNrKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDMgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGdSR0JtYXNrKCAmIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDMgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMSkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdldHNjcm1hc2sgc2hvcnQgciBzaG9ydCByIHNob3J0IHIgc2hvcnQgciAqLwpAQCAtNTcyMCwxOSArNTcyMCwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHNjcm1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCWdldHNjcm1hc2soICYgYXJnMSAsICYgYXJnMiAsICYgYXJnMyAsICYgYXJnNCApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggNCApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdzaG9ydG9iamVjdChhcmcxKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdzaG9ydG9iamVjdChhcmcyKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMiwgbWtuZXdzaG9ydG9iamVjdChhcmczKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdzaG9ydG9iamVjdChhcmc0KSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgZ2V0c2NybWFzayggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBnZXRtY29sb3Igc2hvcnQgcyBzaG9ydCByIHNob3J0IHIgc2hvcnQgciAqLwpAQCAtNTc0MCwyMCArNTc0MCwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG1jb2xvcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlnZXRtY29sb3IoIGFyZzEgLCAmIGFyZzIgLCAmIGFyZzMgLCAmIGFyZzQgKTsKLQl7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDMgKTsKLQkgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3c2hvcnRvYmplY3QoYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3c2hvcnRvYmplY3QoYXJnMykpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoYXJnNCkpOwotCSAgcmV0dXJuIHY7Ci0JfQorICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2V0bWNvbG9yKCBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCAzICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzIpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KGFyZzMpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld3Nob3J0b2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBtYXB3IGxvbmcgcyBzaG9ydCBzIHNob3J0IHMgZmxvYXQgciBmbG9hdCByIGZsb2F0IHIgZmxvYXQgciBmbG9hdCByIGZsb2F0IHIgKi8KQEAgLTU3NjEsMzIgKzU3NjEsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tYXB3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWZsb2F0IGFyZzUgOwotCWZsb2F0IGFyZzYgOwotCWZsb2F0IGFyZzcgOwotCWZsb2F0IGFyZzggOwotCWZsb2F0IGFyZzkgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFwdyggYXJnMSAsIGFyZzIgLCBhcmczICwgJiBhcmc0ICwgJiBhcmc1ICwgJiBhcmc2ICwgJiBhcmc3ICwgJiBhcmc4ICwgJiBhcmc5ICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA2ICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2Zsb2F0b2JqZWN0KGFyZzQpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2Zsb2F0b2JqZWN0KGFyZzUpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld2Zsb2F0b2JqZWN0KGFyZzYpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld2Zsb2F0b2JqZWN0KGFyZzcpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCA0LCBta25ld2Zsb2F0b2JqZWN0KGFyZzgpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCA1LCBta25ld2Zsb2F0b2JqZWN0KGFyZzkpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBsb25nIGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGZsb2F0IGFyZzUgOworICAgIGZsb2F0IGFyZzYgOworICAgIGZsb2F0IGFyZzcgOworICAgIGZsb2F0IGFyZzggOworICAgIGZsb2F0IGFyZzkgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFwdyggYXJnMSAsIGFyZzIgLCBhcmczICwgJiBhcmc0ICwgJiBhcmc1ICwgJiBhcmc2ICwgJiBhcmc3ICwgJiBhcmc4ICwgJiBhcmc5ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA2ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld2Zsb2F0b2JqZWN0KGFyZzQpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld2Zsb2F0b2JqZWN0KGFyZzUpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAyLCBta25ld2Zsb2F0b2JqZWN0KGFyZzYpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAzLCBta25ld2Zsb2F0b2JqZWN0KGFyZzcpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCA0LCBta25ld2Zsb2F0b2JqZWN0KGFyZzgpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCA1LCBta25ld2Zsb2F0b2JqZWN0KGFyZzkpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBtYXB3MiBsb25nIHMgc2hvcnQgcyBzaG9ydCBzIGZsb2F0IHIgZmxvYXQgciAqLwpAQCAtNTc5NCwyNCArNTc5NCwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX21hcHcyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCWZsb2F0IGFyZzQgOwotCWZsb2F0IGFyZzUgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDMsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFwdzIoIGFyZzEgLCBhcmcyICwgYXJnMyAsICYgYXJnNCAsICYgYXJnNSApOwotCXsgUHlPYmplY3QgKnYgPSBQeVR1cGxlX05ldyggMiApOwotCSAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMCwgbWtuZXdmbG9hdG9iamVjdChhcmc0KSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMSwgbWtuZXdmbG9hdG9iamVjdChhcmc1KSk7Ci0JICByZXR1cm4gdjsKLQl9CisgICAgbG9uZyBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBmbG9hdCBhcmc0IDsKKyAgICBmbG9hdCBhcmc1IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMywgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hcHcyKCBhcmcxICwgYXJnMiAsIGFyZzMgLCAmIGFyZzQgLCAmIGFyZzUgKTsKKyAgICB7IFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9OZXcoIDIgKTsKKyAgICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDAsIG1rbmV3ZmxvYXRvYmplY3QoYXJnNCkpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDEsIG1rbmV3ZmxvYXRvYmplY3QoYXJnNSkpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogfQogCiAvKiB2b2lkIGdldGN1cnNvciBzaG9ydCByIHVfc2hvcnQgciB1X3Nob3J0IHIgbG9uZyByICovCkBAIC01ODE5LDE5ICs1ODE5LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0Y3Vyc29yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQl1bnNpZ25lZCBzaG9ydCBhcmcyIDsKLQl1bnNpZ25lZCBzaG9ydCBhcmczIDsKLQlsb25nIGFyZzQgOwotCWdldGN1cnNvciggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7Ci0JeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7Ci0JICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKLQkgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KChzaG9ydCkgYXJnMikpOwotCSAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoKHNob3J0KSBhcmczKSk7Ci0JICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdsb25nb2JqZWN0KGFyZzQpKTsKLQkgIHJldHVybiB2OwotCX0KKyAgICBzaG9ydCBhcmcxIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBhcmcyIDsKKyAgICB1bnNpZ25lZCBzaG9ydCBhcmczIDsKKyAgICBsb25nIGFyZzQgOworICAgIGdldGN1cnNvciggJiBhcmcxICwgJiBhcmcyICwgJiBhcmczICwgJiBhcmc0ICk7CisgICAgeyBQeU9iamVjdCAqdiA9IFB5VHVwbGVfTmV3KCA0ICk7CisgICAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAwLCBta25ld3Nob3J0b2JqZWN0KGFyZzEpKTsKKyAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCAxLCBta25ld3Nob3J0b2JqZWN0KChzaG9ydCkgYXJnMikpOworICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIDIsIG1rbmV3c2hvcnRvYmplY3QoKHNob3J0KSBhcmczKSk7CisgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgMywgbWtuZXdsb25nb2JqZWN0KGFyZzQpKTsKKyAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogLyogdm9pZCBjbW9kZSAqLwpAQCAtNTgzOSw5ICs1ODM5LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY21vZGUoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNtb2RlKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjb25jYXZlIGxvbmcgcyAqLwpAQCAtNTg0OSwxMiArNTg0OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2NvbmNhdmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWNvbmNhdmUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29uY2F2ZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjdXJzdHlwZSBsb25nIHMgKi8KQEAgLTU4NjIsMTIgKzU4NjIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jdXJzdHlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3Vyc3R5cGUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3Vyc3R5cGUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZHJhd21vZGUgbG9uZyBzICovCkBAIC01ODc1LDEyICs1ODc1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZHJhd21vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWRyYXdtb2RlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRyYXdtb2RlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGdhbW1hcmFtcCBzaG9ydCBzWzI1Nl0gc2hvcnQgc1syNTZdIHNob3J0IHNbMjU2XSAqLwpAQCAtNTg4OCwxOCArNTg4OCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dhbW1hcmFtcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSBbIDI1NiBdIDsKLQlzaG9ydCBhcmcyIFsgMjU2IF0gOwotCXNob3J0IGFyZzMgWyAyNTYgXSA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAwLCAyNTYgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAxLCAyNTYgLCBhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAyLCAyNTYgLCBhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZ2FtbWFyYW1wKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSBbIDI1NiBdIDsKKyAgICBzaG9ydCBhcmcyIFsgMjU2IF0gOworICAgIHNob3J0IGFyZzMgWyAyNTYgXSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAwLCAyNTYgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAxLCAyNTYgLCBhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAzLCAyLCAyNTYgLCBhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2FtbWFyYW1wKCBhcmcxICwgYXJnMiAsIGFyZzMgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIGxvbmcgZ2V0YmFja2ZhY2UgKi8KQEAgLTU5MDcsOSArNTkwNyw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0YmFja2ZhY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCXJldHZhbCA9IGdldGJhY2tmYWNlKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRiYWNrZmFjZSggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIGxvbmcgZ2V0ZGVzY2VuZGVyICovCkBAIC01OTE3LDkgKzU5MTcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGRlc2NlbmRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JcmV0dmFsID0gZ2V0ZGVzY2VuZGVyKCApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICByZXR2YWwgPSBnZXRkZXNjZW5kZXIoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGRyYXdtb2RlICovCkBAIC01OTI3LDkgKzU5MjcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGRyYXdtb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRkcmF3bW9kZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0ZHJhd21vZGUoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldG1tb2RlICovCkBAIC01OTM3LDkgKzU5MzcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldG1tb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRtbW9kZSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0bW1vZGUoICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldHNtICovCkBAIC01OTQ3LDkgKzU5NDcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHNtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBnZXRzbSggKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgcmV0dmFsID0gZ2V0c20oICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldHZpZGVvIGxvbmcgcyAqLwpAQCAtNTk1NywxMiArNTk1NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldHZpZGVvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBnZXR2aWRlbyggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBnZXR2aWRlbyggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogdm9pZCBpbWFrZWJhY2tncm91bmQgKi8KQEAgLTU5NzAsOSArNTk3MCw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfaW1ha2ViYWNrZ3JvdW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbWFrZWJhY2tncm91bmQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGltYWtlYmFja2dyb3VuZCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbG1iaW5kIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNTk4MCwxNSArNTk4MCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xtYmluZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWxtYmluZCggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxtYmluZCggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbG1kZWYgbG9uZyBzIGxvbmcgcyBsb25nIHMgZmxvYXQgc1thcmczXSAqLwpAQCAtNTk5NiwyNCArNTk5NiwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xtZGVmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JbG9uZyBhcmczIDsKLQlmbG9hdCAqIGFyZzQgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICgoYXJnNCA9IFB5TWVtX05FVyhmbG9hdCAsIGFyZzMgKSkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAzLCAyLCBhcmczICwgYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWxtZGVmKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlNZW1fREVMKGFyZzQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgbG9uZyBhcmczIDsKKyAgICBmbG9hdCAqIGFyZzQgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5c2l6ZShhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoYXJnNCA9IFB5TWVtX05FVyhmbG9hdCAsIGFyZzMgKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAzLCAyLCBhcmczICwgYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGxtZGVmKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7CisgICAgUHlNZW1fREVMKGFyZzQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBtbW9kZSBsb25nIHMgKi8KQEAgLTYwMjEsMTIgKzYwMjEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9tbW9kZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbW1vZGUoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW1vZGUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbm9ybWFsIGZsb2F0IHNbM10gKi8KQEAgLTYwMzQsMTIgKzYwMzQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ub3JtYWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyAzIF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlub3JtYWwoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDMgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5vcm1hbCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBvdmVybGF5IGxvbmcgcyAqLwpAQCAtNjA0NywxMiArNjA0NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX292ZXJsYXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCW92ZXJsYXkoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3ZlcmxheSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBSR0JyYW5nZSBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgKi8KQEAgLTYwNjAsMzMgKzYwNjAsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9SR0JyYW5nZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0Jc2hvcnQgYXJnNSA7Ci0Jc2hvcnQgYXJnNiA7Ci0Jc2hvcnQgYXJnNyA7Ci0Jc2hvcnQgYXJnOCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA0LCAmYXJnNSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDUsICZhcmc2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNiwgJmFyZzcpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA3LCAmYXJnOCkpCi0JCXJldHVybiBOVUxMOwotCVJHQnJhbmdlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgLCBhcmc3ICwgYXJnOCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBzaG9ydCBhcmczIDsKKyAgICBzaG9ydCBhcmc0IDsKKyAgICBzaG9ydCBhcmc1IDsKKyAgICBzaG9ydCBhcmc2IDsKKyAgICBzaG9ydCBhcmc3IDsKKyAgICBzaG9ydCBhcmc4IDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDQsICZhcmc1KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNSwgJmFyZzYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA2LCAmYXJnNykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDcsICZhcmc4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUkdCcmFuZ2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgLCBhcmc1ICwgYXJnNiAsIGFyZzcgLCBhcmc4ICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNldHZpZGVvIGxvbmcgcyBsb25nIHMgKi8KQEAgLTYwOTQsMTUgKzYwOTQsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXR2aWRlbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0dmlkZW8oIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldHZpZGVvKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzaGFkZW1vZGVsIGxvbmcgcyAqLwpAQCAtNjExMCwxMiArNjExMCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NoYWRlbW9kZWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXNoYWRlbW9kZWwoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2hhZGVtb2RlbCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB1bmRlcmxheSBsb25nIHMgKi8KQEAgLTYxMjMsMTIgKzYxMjMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF91bmRlcmxheShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdW5kZXJsYXkoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdW5kZXJsYXkoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmduY2xvc2VkbGluZSAqLwpAQCAtNjEzNiw5ICs2MTM2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iZ25jbG9zZWRsaW5lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQliZ25jbG9zZWRsaW5lKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBiZ25jbG9zZWRsaW5lKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBiZ25saW5lICovCkBAIC02MTQ2LDkgKzYxNDYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JnbmxpbmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWJnbmxpbmUoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGJnbmxpbmUoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJnbnBvaW50ICovCkBAIC02MTU2LDkgKzYxNTYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JnbnBvaW50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQliZ25wb2ludCggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgYmducG9pbnQoICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGJnbnBvbHlnb24gKi8KQEAgLTYxNjYsOSArNjE2Niw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYmducG9seWdvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JYmducG9seWdvbiggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgYmducG9seWdvbiggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYmduc3VyZmFjZSAqLwpAQCAtNjE3Niw5ICs2MTc2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iZ25zdXJmYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQliZ25zdXJmYWNlKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBiZ25zdXJmYWNlKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBiZ250bWVzaCAqLwpAQCAtNjE4Niw5ICs2MTg2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9iZ250bWVzaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JYmdudG1lc2goICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGJnbnRtZXNoKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBiZ250cmltICovCkBAIC02MTk2LDkgKzYxOTYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2JnbnRyaW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWJnbnRyaW0oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGJnbnRyaW0oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGVuZGNsb3NlZGxpbmUgKi8KQEAgLTYyMDYsOSArNjIwNiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZW5kY2xvc2VkbGluZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZW5kY2xvc2VkbGluZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZW5kY2xvc2VkbGluZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZW5kbGluZSAqLwpAQCAtNjIxNiw5ICs2MjE2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lbmRsaW5lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQllbmRsaW5lKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmRsaW5lKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlbmRwb2ludCAqLwpAQCAtNjIyNiw5ICs2MjI2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lbmRwb2ludChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZW5kcG9pbnQoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuZHBvaW50KCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBlbmRwb2x5Z29uICovCkBAIC02MjM2LDkgKzYyMzYsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2VuZHBvbHlnb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWVuZHBvbHlnb24oICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGVuZHBvbHlnb24oICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGVuZHN1cmZhY2UgKi8KQEAgLTYyNDYsOSArNjI0Niw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZW5kc3VyZmFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZW5kc3VyZmFjZSggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZW5kc3VyZmFjZSggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZW5kdG1lc2ggKi8KQEAgLTYyNTYsOSArNjI1Niw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZW5kdG1lc2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWVuZHRtZXNoKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmR0bWVzaCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZW5kdHJpbSAqLwpAQCAtNjI2Niw5ICs2MjY2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9lbmR0cmltKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQllbmR0cmltKCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlbmR0cmltKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBibGVuZGZ1bmN0aW9uIGxvbmcgcyBsb25nIHMgKi8KQEAgLTYyNzYsMTUgKzYyNzYsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ibGVuZGZ1bmN0aW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlibGVuZGZ1bmN0aW9uKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBibGVuZGZ1bmN0aW9uKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjM2YgZmxvYXQgc1szXSAqLwpAQCAtNjI5MiwxMiArNjI5MiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2MzZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWMzZiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIFsgMyBdIDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYzNmKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGMzaSBsb25nIHNbM10gKi8KQEAgLTYzMDUsMTIgKzYzMDUsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jM2koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYzNpKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYzNpKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGMzcyBzaG9ydCBzWzNdICovCkBAIC02MzE4LDEyICs2MzE4LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYzNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIFsgMyBdIDsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYzNzKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgWyAzIF0gOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjM3MoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgYzRmIGZsb2F0IHNbNF0gKi8KQEAgLTYzMzEsMTIgKzYzMzEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jNGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQljNGYoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGM0ZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjNGkgbG9uZyBzWzRdICovCkBAIC02MzQ0LDEyICs2MzQ0LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfYzRpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWM0aSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgWyA0IF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGM0aSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjNHMgc2hvcnQgc1s0XSAqLwpAQCAtNjM1NywxMiArNjM1NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2M0cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSBbIDQgXSA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWM0cyggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIFsgNCBdIDsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDQgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYzRzKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGNvbG9yZiBmbG9hdCBzICovCkBAIC02MzcwLDEyICs2MzcwLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY29sb3JmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWNvbG9yZiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNvbG9yZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBjcGFjayBsb25nIHMgKi8KQEAgLTYzODMsMTIgKzYzODMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9jcGFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3BhY2soIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3BhY2soIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgY3pjbGVhciBsb25nIHMgbG9uZyBzICovCkBAIC02Mzk2LDE1ICs2Mzk2LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfY3pjbGVhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3pjbGVhciggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3pjbGVhciggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgZGdsY2xvc2UgbG9uZyBzICovCkBAIC02NDEyLDEyICs2NDEyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGdsY2xvc2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWRnbGNsb3NlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRnbGNsb3NlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiBsb25nIGRnbG9wZW4gY2hhciAqcyBsb25nIHMgKi8KQEAgLTY0MjUsMTUgKzY0MjUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9kZ2xvcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlzdHJpbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gZGdsb3BlbiggYXJnMSAsIGFyZzIgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgc3RyaW5nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHZhbCA9IGRnbG9wZW4oIGFyZzEgLCBhcmcyICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiBsb25nIGdldGdkZXNjIGxvbmcgcyAqLwpAQCAtNjQ0MSwxMiArNjQ0MSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2dldGdkZXNjKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR2YWwgPSBnZXRnZGVzYyggYXJnMSApOwotCXJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKKyAgICBsb25nIHJldHZhbDsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR2YWwgPSBnZXRnZGVzYyggYXJnMSApOworICAgIHJldHVybiBta25ld2xvbmdvYmplY3QocmV0dmFsKTsKIH0KIAogLyogdm9pZCBnZXRudXJic3Byb3BlcnR5IGxvbmcgcyBmbG9hdCByICovCkBAIC02NDU0LDEyICs2NDU0LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2V0bnVyYnNwcm9wZXJ0eShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZ2V0bnVyYnNwcm9wZXJ0eSggYXJnMSAsICYgYXJnMiApOwotCXJldHVybiBta25ld2Zsb2F0b2JqZWN0KGFyZzIpOworICAgIGxvbmcgYXJnMSA7CisgICAgZmxvYXQgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGdldG51cmJzcHJvcGVydHkoIGFyZzEgLCAmIGFyZzIgKTsKKyAgICByZXR1cm4gbWtuZXdmbG9hdG9iamVjdChhcmcyKTsKIH0KIAogLyogdm9pZCBnbGNvbXBhdCBsb25nIHMgbG9uZyBzICovCkBAIC02NDY3LDE1ICs2NDY3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZ2xjb21wYXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWdsY29tcGF0KCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBnbGNvbXBhdCggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgaWNvbnNpemUgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNjQ4MywxNSArNjQ4MywxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2ljb25zaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlpY29uc2l6ZSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWNvbnNpemUoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGljb250aXRsZSBjaGFyICpzICovCkBAIC02NDk5LDEyICs2NDk5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfaWNvbnRpdGxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJpbmcgYXJnMSA7Ci0JaWYgKCFnZXRpc3RyaW5nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWNvbnRpdGxlKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHN0cmluZyBhcmcxIDsKKyAgICBpZiAoIWdldGlzdHJpbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpY29udGl0bGUoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbFJHQnJhbmdlIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyBzaG9ydCBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTY1MTIsMzMgKzY1MTIsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9sUkdCcmFuZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCXNob3J0IGFyZzMgOwotCXNob3J0IGFyZzQgOwotCXNob3J0IGFyZzUgOwotCXNob3J0IGFyZzYgOwotCWxvbmcgYXJnNyA7Ci0JbG9uZyBhcmc4IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDQsICZhcmc1KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNSwgJmFyZzYpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDgsIDYsICZhcmc3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA4LCA3LCAmYXJnOCkpCi0JCXJldHVybiBOVUxMOwotCWxSR0JyYW5nZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCAsIGFyZzUgLCBhcmc2ICwgYXJnNyAsIGFyZzggKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgc2hvcnQgYXJnNSA7CisgICAgc2hvcnQgYXJnNiA7CisgICAgbG9uZyBhcmc3IDsKKyAgICBsb25nIGFyZzggOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDgsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgOCwgNCwgJmFyZzUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA4LCA1LCAmYXJnNikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgOCwgNiwgJmFyZzcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDgsIDcsICZhcmc4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbFJHQnJhbmdlKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICwgYXJnNSAsIGFyZzYgLCBhcmc3ICwgYXJnOCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsaW5lc21vb3RoIGxvbmcgcyAqLwpAQCAtNjU0NiwxMiArNjU0NiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xpbmVzbW9vdGgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxpbmVzbW9vdGgoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGluZXNtb290aCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsbWNvbG9yIGxvbmcgcyAqLwpAQCAtNjU1OSwxMiArNjU1OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xtY29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxtY29sb3IoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbG1jb2xvciggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsb2dpY29wIGxvbmcgcyAqLwpAQCAtNjU3MiwxMiArNjU3MiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xvZ2ljb3AoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWxvZ2ljb3AoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbG9naWNvcCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBsc2V0ZGVwdGggbG9uZyBzIGxvbmcgcyAqLwpAQCAtNjU4NSwxNSArNjU4NSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX2xzZXRkZXB0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbHNldGRlcHRoKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBsc2V0ZGVwdGgoIGFyZzEgLCBhcmcyICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIGxzaGFkZXJhbmdlIHNob3J0IHMgc2hvcnQgcyBsb25nIHMgbG9uZyBzICovCkBAIC02NjAxLDIxICs2NjAxLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfbHNoYWRlcmFuZ2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgOwotCXNob3J0IGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlsc2hhZGVyYW5nZSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIDsKKyAgICBzaG9ydCBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGxvbmcgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbHNoYWRlcmFuZ2UoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgbjNmIGZsb2F0IHNbM10gKi8KQEAgLTY2MjMsMTIgKzY2MjMsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9uM2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyAzIF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQluM2YoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDMgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG4zZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBub2JvcmRlciAqLwpAQCAtNjYzNiw5ICs2NjM2LDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9ub2JvcmRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jbm9ib3JkZXIoICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIG5vYm9yZGVyKCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwbnRzbW9vdGggbG9uZyBzICovCkBAIC02NjQ2LDEyICs2NjQ2LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcG50c21vb3RoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlwbnRzbW9vdGgoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG50c21vb3RoKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlYWRzb3VyY2UgbG9uZyBzICovCkBAIC02NjU5LDEyICs2NjU5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcmVhZHNvdXJjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVhZHNvdXJjZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZWFkc291cmNlKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHJlY3R6b29tIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNjY3MiwxNSArNjY3MiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3JlY3R6b29tKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVjdHpvb20oIGFyZzEgLCBhcmcyICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZWN0em9vbSggYXJnMSAsIGFyZzIgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2JveCBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyBmbG9hdCBzICovCkBAIC02Njg4LDIxICs2Njg4LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc2JveChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JZmxvYXQgYXJnMyA7Ci0JZmxvYXQgYXJnNCA7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlzYm94KCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2JveCggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzYm94aSBsb25nIHMgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTY3MTAsMjEgKzY3MTAsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zYm94aShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2JveGkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBsb25nIGFyZzIgOworICAgIGxvbmcgYXJnMyA7CisgICAgbG9uZyBhcmc0IDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2JveGkoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2JveHMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNjczMiwyMSArNjczMiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Nib3hzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIDsKLQlzaG9ydCBhcmcyIDsKLQlzaG9ydCBhcmczIDsKLQlzaG9ydCBhcmc0IDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXNib3hzKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgOworICAgIHNob3J0IGFyZzIgOworICAgIHNob3J0IGFyZzMgOworICAgIHNob3J0IGFyZzQgOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2JveHMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2JveGYgZmxvYXQgcyBmbG9hdCBzIGZsb2F0IHMgZmxvYXQgcyAqLwpAQCAtNjc1NCwyMSArNjc1NCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Nib3hmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIDsKLQlmbG9hdCBhcmcyIDsKLQlmbG9hdCBhcmczIDsKLQlmbG9hdCBhcmc0IDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCi0JCXJldHVybiBOVUxMOwotCXNib3hmKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgOworICAgIGZsb2F0IGFyZzIgOworICAgIGZsb2F0IGFyZzMgOworICAgIGZsb2F0IGFyZzQgOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlmbG9hdGFyZyhhcmdzLCA0LCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2JveGYoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2JveGZpIGxvbmcgcyBsb25nIHMgbG9uZyBzIGxvbmcgcyAqLwpAQCAtNjc3NiwyMSArNjc3NiwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Nib3hmaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlsb25nIGFyZzIgOwotCWxvbmcgYXJnMyA7Ci0JbG9uZyBhcmc0IDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMiwgJmFyZzMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDMsICZhcmc0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2JveGZpKCBhcmcxICwgYXJnMiAsIGFyZzMgLCBhcmc0ICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGxvbmcgYXJnNCA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgNCwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCA0LCAzLCAmYXJnNCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNib3hmaSggYXJnMSAsIGFyZzIgLCBhcmczICwgYXJnNCApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzYm94ZnMgc2hvcnQgcyBzaG9ydCBzIHNob3J0IHMgc2hvcnQgcyAqLwpAQCAtNjc5OCwyMSArNjc5OCwyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Nib3hmcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSA7Ci0Jc2hvcnQgYXJnMiA7Ci0Jc2hvcnQgYXJnMyA7Ci0Jc2hvcnQgYXJnNCA7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQotCQlyZXR1cm4gTlVMTDsKLQlzYm94ZnMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSA7CisgICAgc2hvcnQgYXJnMiA7CisgICAgc2hvcnQgYXJnMyA7CisgICAgc2hvcnQgYXJnNCA7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlzaG9ydGFyZyhhcmdzLCA0LCAxLCAmYXJnMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aXNob3J0YXJnKGFyZ3MsIDQsIDIsICZhcmczKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpc2hvcnRhcmcoYXJncywgNCwgMywgJmFyZzQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzYm94ZnMoIGFyZzEgLCBhcmcyICwgYXJnMyAsIGFyZzQgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgc2V0bnVyYnNwcm9wZXJ0eSBsb25nIHMgZmxvYXQgcyAqLwpAQCAtNjgyMCwxNSArNjgyMCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3NldG51cmJzcHJvcGVydHkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JZmxvYXQgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWZsb2F0YXJnKGFyZ3MsIDIsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0bnVyYnNwcm9wZXJ0eSggYXJnMSAsIGFyZzIgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBmbG9hdCBhcmcyIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDIsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpZmxvYXRhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRudXJic3Byb3BlcnR5KCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzZXRwdXAgbG9uZyBzIGxvbmcgcyBsb25nIHMgKi8KQEAgLTY4MzYsMTggKzY4MzYsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9zZXRwdXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JbG9uZyBhcmcyIDsKLQlsb25nIGFyZzMgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCi0JCXJldHVybiBOVUxMOwotCXNldHB1cCggYXJnMSAsIGFyZzIgLCBhcmczICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgbG9uZyBhcmcyIDsKKyAgICBsb25nIGFyZzMgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMywgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDMsIDEsICZhcmcyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAzLCAyLCAmYXJnMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNldHB1cCggYXJnMSAsIGFyZzIgLCBhcmczICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHNtb290aGxpbmUgbG9uZyBzICovCkBAIC02ODU1LDEyICs2ODU1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc21vb3RobGluZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc21vb3RobGluZSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzbW9vdGhsaW5lKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHN1YnBpeGVsIGxvbmcgcyAqLwpAQCAtNjg2OCwxMiArNjg2OCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3N1YnBpeGVsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlzdWJwaXhlbCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdWJwaXhlbCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBzd2FwdG1lc2ggKi8KQEAgLTY4ODEsOSArNjg4MSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3dhcHRtZXNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzd2FwdG1lc2goICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHN3YXB0bWVzaCggKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIGxvbmcgc3dpbm9wZW4gbG9uZyBzICovCkBAIC02ODkxLDEyICs2ODkxLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfc3dpbm9wZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgcmV0dmFsOwotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXJldHZhbCA9IHN3aW5vcGVuKCBhcmcxICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHZhbCA9IHN3aW5vcGVuKCBhcmcxICk7CisgICAgcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOwogfQogCiAvKiB2b2lkIHYyZiBmbG9hdCBzWzJdICovCkBAIC02OTA0LDEyICs2OTA0LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjJmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlmbG9hdCBhcmcxIFsgMiBdIDsKLQlpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDIgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjJmKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGZsb2F0IGFyZzEgWyAyIF0gOworICAgIGlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2MmYoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjJpIGxvbmcgc1syXSAqLwpAQCAtNjkxNywxMiArNjkxNywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3YyaShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIFsgMiBdIDsKLQlpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2MmkoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIFsgMiBdIDsKKyAgICBpZiAoIWdldGlsb25nYXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2MmkoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjJzIHNob3J0IHNbMl0gKi8KQEAgLTY5MzAsMTIgKzY5MzAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92MnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXNob3J0IGFyZzEgWyAyIF0gOwotCWlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2MnMoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2hvcnQgYXJnMSBbIDIgXSA7CisgICAgaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCAyICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHYycyggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2M2YgZmxvYXQgc1szXSAqLwpAQCAtNjk0MywxMiArNjk0MywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3YzZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZmxvYXQgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCAzICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXYzZiggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBmbG9hdCBhcmcxIFsgMyBdIDsKKyAgICBpZiAoIWdldGlmbG9hdGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjNmKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHYzaSBsb25nIHNbM10gKi8KQEAgLTY5NTYsMTIgKzY5NTYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92M2koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjNpKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSBbIDMgXSA7CisgICAgaWYgKCFnZXRpbG9uZ2FycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjNpKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHYzcyBzaG9ydCBzWzNdICovCkBAIC02OTY5LDEyICs2OTY5LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjNzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaG9ydCBhcmcxIFsgMyBdIDsKLQlpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjNzKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHNob3J0IGFyZzEgWyAzIF0gOworICAgIGlmICghZ2V0aXNob3J0YXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2M3MoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjRmIGZsb2F0IHNbNF0gKi8KQEAgLTY5ODIsMTIgKzY5ODIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92NGYoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWZsb2F0IGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aWZsb2F0YXJyYXkoYXJncywgMSwgMCwgNCAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2NGYoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZmxvYXQgYXJnMSBbIDQgXSA7CisgICAgaWYgKCFnZXRpZmxvYXRhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHY0ZiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2NGkgbG9uZyBzWzRdICovCkBAIC02OTk1LDEyICs2OTk1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjRpKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXY0aSggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgWyA0IF0gOworICAgIGlmICghZ2V0aWxvbmdhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHY0aSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2NHMgc2hvcnQgc1s0XSAqLwpAQCAtNzAwOCwxMiArNzAwOCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Y0cyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2hvcnQgYXJnMSBbIDQgXSA7Ci0JaWYgKCFnZXRpc2hvcnRhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXY0cyggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzaG9ydCBhcmcxIFsgNCBdIDsKKyAgICBpZiAoIWdldGlzaG9ydGFycmF5KGFyZ3MsIDEsIDAsIDQgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjRzKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHZpZGVvY21kIGxvbmcgcyAqLwpAQCAtNzAyMSwxMiArNzAyMSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3ZpZGVvY21kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2aWRlb2NtZCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2aWRlb2NtZCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogbG9uZyB3aW5kZXB0aCBsb25nIHMgKi8KQEAgLTcwMzQsMTIgKzcwMzQsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF93aW5kZXB0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyByZXR2YWw7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dmFsID0gd2luZGVwdGgoIGFyZzEgKTsKLQlyZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CisgICAgbG9uZyByZXR2YWw7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dmFsID0gd2luZGVwdGgoIGFyZzEgKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIHZvaWQgd21wYWNrIGxvbmcgcyAqLwpAQCAtNzA0NywxMiArNzA0NywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3dtcGFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd21wYWNrKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdtcGFjayggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB6ZHJhdyBsb25nIHMgKi8KQEAgLTcwNjAsMTIgKzcwNjAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF96ZHJhdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JemRyYXcoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgemRyYXcoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgemZ1bmN0aW9uIGxvbmcgcyAqLwpAQCAtNzA3MywxMiArNzA3MywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3pmdW5jdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhcmcxIDsKLQlpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JemZ1bmN0aW9uKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgYXJnMSA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHpmdW5jdGlvbiggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB6c291cmNlIGxvbmcgcyAqLwpAQCAtNzA4NiwxMiArNzA4NiwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3pzb3VyY2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXpzb3VyY2UoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgenNvdXJjZSggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB6d3JpdGVtYXNrIGxvbmcgcyAqLwpAQCAtNzA5OSwxMiArNzA5OSwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3p3cml0ZW1hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgYXJnMSA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAxLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXp3cml0ZW1hc2soIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgendyaXRlbWFzayggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCB2MmQgZG91YmxlIHNbMl0gKi8KQEAgLTcxMTIsMTIgKzcxMTIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF92MmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSBhcmcxIFsgMiBdIDsKLQlpZiAoIWdldGlkb3VibGVhcnJheShhcmdzLCAxLCAwLCAyICwgYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCXYyZCggYXJnMSApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBkb3VibGUgYXJnMSBbIDIgXSA7CisgICAgaWYgKCFnZXRpZG91YmxlYXJyYXkoYXJncywgMSwgMCwgMiAsIGFyZzEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2MmQoIGFyZzEgKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIHZvaWQgdjNkIGRvdWJsZSBzWzNdICovCkBAIC03MTI1LDEyICs3MTI1LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfdjNkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgYXJnMSBbIDMgXSA7Ci0JaWYgKCFnZXRpZG91YmxlYXJyYXkoYXJncywgMSwgMCwgMyAsIGFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQl2M2QoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgZG91YmxlIGFyZzEgWyAzIF0gOworICAgIGlmICghZ2V0aWRvdWJsZWFycmF5KGFyZ3MsIDEsIDAsIDMgLCBhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdjNkKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvKiB2b2lkIHY0ZCBkb3VibGUgc1s0XSAqLwpAQCAtNzEzOCwxMiArNzEzOCwxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdsX3Y0ZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIGFyZzEgWyA0IF0gOwotCWlmICghZ2V0aWRvdWJsZWFycmF5KGFyZ3MsIDEsIDAsIDQgLCBhcmcxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdjRkKCBhcmcxICk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGRvdWJsZSBhcmcxIFsgNCBdIDsKKyAgICBpZiAoIWdldGlkb3VibGVhcnJheShhcmdzLCAxLCAwLCA0ICwgYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHY0ZCggYXJnMSApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogdm9pZCBwaXhtb2RlIGxvbmcgcyBsb25nIHMgKi8KQEAgLTcxNTEsMTUgKzcxNTEsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnbF9waXhtb2RlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWxvbmcgYXJnMiA7Ci0JaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQotCQlyZXR1cm4gTlVMTDsKLQlwaXhtb2RlKCBhcmcxICwgYXJnMiApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIGFyZzEgOworICAgIGxvbmcgYXJnMiA7CisgICAgaWYgKCFnZXRpbG9uZ2FyZyhhcmdzLCAyLCAwLCAmYXJnMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZ2V0aWxvbmdhcmcoYXJncywgMiwgMSwgJmFyZzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwaXhtb2RlKCBhcmcxICwgYXJnMiApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogLyogbG9uZyBxZ2V0ZmQgKi8KQEAgLTcxNjcsOSArNzE2Nyw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfcWdldGZkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHJldHZhbDsKLQlyZXR2YWwgPSBxZ2V0ZmQoICk7Ci0JcmV0dXJuIG1rbmV3bG9uZ29iamVjdChyZXR2YWwpOworICAgIGxvbmcgcmV0dmFsOworICAgIHJldHZhbCA9IHFnZXRmZCggKTsKKyAgICByZXR1cm4gbWtuZXdsb25nb2JqZWN0KHJldHZhbCk7CiB9CiAKIC8qIHZvaWQgZGl0aGVyIGxvbmcgcyAqLwpAQCAtNzE3Nyw0NTcgKzcxNzcsNDU3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2xfZGl0aGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFyZzEgOwotCWlmICghZ2V0aWxvbmdhcmcoYXJncywgMSwgMCwgJmFyZzEpKQotCQlyZXR1cm4gTlVMTDsKLQlkaXRoZXIoIGFyZzEgKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgbG9uZyBhcmcxIDsKKyAgICBpZiAoIWdldGlsb25nYXJnKGFyZ3MsIDEsIDAsICZhcmcxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGl0aGVyKCBhcmcxICk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGdsX21ldGhvZHNbXSA9IHsKLQl7InFyZWFkIiwgZ2xfcXJlYWQsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InZhcnJheSIsIGdsX3ZhcnJheSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im52YXJyYXkiLCBnbF9udmFycmF5LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InZuYXJyYXkiLCBnbF92bmFycmF5LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im51cmJzc3VyZmFjZSIsIGdsX251cmJzc3VyZmFjZSwgICAgTUVUSF9PTERBUkdTfSwKLQl7Im51cmJzY3VydmUiLCBnbF9udXJic2N1cnZlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InB3bGN1cnZlIiwgZ2xfcHdsY3VydmUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBpY2siLCBnbF9waWNrLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImVuZHBpY2siLCBnbF9lbmRwaWNrLCAgICAgICAgICAgICAgTUVUSF9OT0FSR1N9LAotCXsiZ3NlbGVjdCIsIGdsX2dzZWxlY3QsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZW5kc2VsZWN0IiwgZ2xfZW5kc2VsZWN0LCAgICAgICAgICBNRVRIX05PQVJHU30sCi0JeyJnZXRtYXRyaXgiLCBnbF9nZXRtYXRyaXgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJhbHRnZXRtYXRyaXgiLCBnbF9hbHRnZXRtYXRyaXgsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJscmVjdHdyaXRlIiwgZ2xfbHJlY3R3cml0ZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJscmVjdHJlYWQiLCBnbF9scmVjdHJlYWQsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWFkZGlzcGxheSIsIGdsX3JlYWRkaXNwbGF5LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwYWNrcmVjdCIsIGdsX3BhY2tyZWN0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ1bnBhY2tyZWN0IiwgZ2xfdW5wYWNrcmVjdCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJndmVyc2lvbiIsIGdsX2d2ZXJzaW9uLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbGVhciIsIGdsX2NsZWFyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRzaGFkZSIsIGdsX2dldHNoYWRlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkZXZwb3J0IiwgZ2xfZGV2cG9ydCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZHIyaSIsIGdsX3JkcjJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWN0ZnMiLCBnbF9yZWN0ZnMsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZWN0cyIsIGdsX3JlY3RzLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJybXYyaSIsIGdsX3JtdjJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJub3BvcnQiLCBnbF9ub3BvcnQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb3B2aWV3cG9ydCIsIGdsX3BvcHZpZXdwb3J0LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbGVhcmhpdGNvZGUiLCBnbF9jbGVhcmhpdGNvZGUsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbG9zZW9iaiIsIGdsX2Nsb3Nlb2JqLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjdXJzb2ZmIiwgZ2xfY3Vyc29mZiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjdXJzb24iLCBnbF9jdXJzb24sICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkb3VibGVidWZmZXIiLCBnbF9kb3VibGVidWZmZXIsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJmaW5pc2giLCBnbF9maW5pc2gsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnY29uZmlnIiwgZ2xfZ2NvbmZpZywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnaW5pdCIsIGdsX2dpbml0LCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJncmVzZXQiLCBnbF9ncmVzZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtdWx0aW1hcCIsIGdsX211bHRpbWFwLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJvbmVtYXAiLCBnbF9vbmVtYXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb3BhdHRyaWJ1dGVzIiwgZ2xfcG9wYXR0cmlidXRlcywgIE1FVEhfT0xEQVJHU30sCi0JeyJwb3BtYXRyaXgiLCBnbF9wb3BtYXRyaXgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwdXNoYXR0cmlidXRlcyIsIGdsX3B1c2hhdHRyaWJ1dGVzLE1FVEhfT0xEQVJHU30sCi0JeyJwdXNobWF0cml4IiwgZ2xfcHVzaG1hdHJpeCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwdXNodmlld3BvcnQiLCBnbF9wdXNodmlld3BvcnQsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJxcmVzZXQiLCBnbF9xcmVzZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJSR0Jtb2RlIiwgZ2xfUkdCbW9kZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzaW5nbGVidWZmZXIiLCBnbF9zaW5nbGVidWZmZXIsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzd2FwYnVmZmVycyIsIGdsX3N3YXBidWZmZXJzLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnc3luYyIsIGdsX2dzeW5jLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZmx1c2giLCBnbF9nZmx1c2gsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ0cG9uIiwgZ2xfdHBvbiwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ0cG9mZiIsIGdsX3Rwb2ZmLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbGtvbiIsIGdsX2Nsa29uLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbGtvZmYiLCBnbF9jbGtvZmYsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyaW5nYmVsbCIsIGdsX3JpbmdiZWxsLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnYmVnaW4iLCBnbF9nYmVnaW4sICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ0ZXh0aW5pdCIsIGdsX3RleHRpbml0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJpbml0bmFtZXMiLCBnbF9pbml0bmFtZXMsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwY2xvcyIsIGdsX3BjbG9zLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwb3BuYW1lIiwgZ2xfcG9wbmFtZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzcGNsb3MiLCBnbF9zcGNsb3MsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ6Y2xlYXIiLCBnbF96Y2xlYXIsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzY3JlZW5zcGFjZSIsIGdsX3NjcmVlbnNwYWNlLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJyZXNoYXBldmlld3BvcnQiLCBnbF9yZXNoYXBldmlld3BvcnQsIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5wdXNoIiwgZ2xfd2lucHVzaCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5wb3AiLCBnbF93aW5wb3AsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJmb3JlZ3JvdW5kIiwgZ2xfZm9yZWdyb3VuZCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRmdWxsc2NybiIsIGdsX2VuZGZ1bGxzY3JuLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRwdXBtb2RlIiwgZ2xfZW5kcHVwbW9kZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJmdWxsc2NybiIsIGdsX2Z1bGxzY3JuLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJwdXBtb2RlIiwgZ2xfcHVwbW9kZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5jb25zdHJhaW50cyIsIGdsX3dpbmNvbnN0cmFpbnRzLCBNRVRIX09MREFSR1N9LAotCXsicGFnZWNvbG9yIiwgZ2xfcGFnZWNvbG9yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidGV4dGNvbG9yIiwgZ2xfdGV4dGNvbG9yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY29sb3IiLCBnbF9jb2xvciwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3VydmVpdCIsIGdsX2N1cnZlaXQsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZm9udCIsIGdsX2ZvbnQsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibGluZXdpZHRoIiwgZ2xfbGluZXdpZHRoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0bGluZXN0eWxlIiwgZ2xfc2V0bGluZXN0eWxlLCAgICBNRVRIX09MREFSR1N9LAotCXsic2V0bWFwIiwgZ2xfc2V0bWFwLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic3dhcGludGVydmFsIiwgZ2xfc3dhcGludGVydmFsLCAgICBNRVRIX09MREFSR1N9LAotCXsid3JpdGVtYXNrIiwgZ2xfd3JpdGVtYXNrLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidGV4dHdyaXRlbWFzayIsIGdsX3RleHR3cml0ZW1hc2ssICBNRVRIX09MREFSR1N9LAotCXsicWRldmljZSIsIGdsX3FkZXZpY2UsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidW5xZGV2aWNlIiwgZ2xfdW5xZGV2aWNlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3VydmViYXNpcyIsIGdsX2N1cnZlYmFzaXMsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY3VydmVwcmVjaXNpb24iLCBnbF9jdXJ2ZXByZWNpc2lvbixNRVRIX09MREFSR1N9LAotCXsibG9hZG5hbWUiLCBnbF9sb2FkbmFtZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGFzc3Rocm91Z2giLCBnbF9wYXNzdGhyb3VnaCwgICAgICBNRVRIX09MREFSR1N9LAotCXsicHVzaG5hbWUiLCBnbF9wdXNobmFtZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0bW9uaXRvciIsIGdsX3NldG1vbml0b3IsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0c2hhZGUiLCBnbF9zZXRzaGFkZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0cGF0dGVybiIsIGdsX3NldHBhdHRlcm4sICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGFnZXdyaXRlbWFzayIsIGdsX3BhZ2V3cml0ZW1hc2ssICBNRVRIX09MREFSR1N9LAotCXsiY2FsbG9iaiIsIGdsX2NhbGxvYmosICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGVsb2JqIiwgZ2xfZGVsb2JqLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZWRpdG9iaiIsIGdsX2VkaXRvYmosICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibWFrZW9iaiIsIGdsX21ha2VvYmosICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibWFrZXRhZyIsIGdsX21ha2V0YWcsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY2h1bmtzaXplIiwgZ2xfY2h1bmtzaXplLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY29tcGFjdGlmeSIsIGdsX2NvbXBhY3RpZnksICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGVsdGFnIiwgZ2xfZGVsdGFnLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibHNyZXBlYXQiLCBnbF9sc3JlcGVhdCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsib2JqaW5zZXJ0IiwgZ2xfb2JqaW5zZXJ0LCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsib2JqcmVwbGFjZSIsIGdsX29ianJlcGxhY2UsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid2luY2xvc2UiLCBnbF93aW5jbG9zZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmxhbmt0aW1lIiwgZ2xfYmxhbmt0aW1lLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZnJlZXB1cCIsIGdsX2ZyZWVwdXAsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmFja2J1ZmZlciIsIGdsX2JhY2tidWZmZXIsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZnJvbnRidWZmZXIiLCBnbF9mcm9udGJ1ZmZlciwgICAgICBNRVRIX09MREFSR1N9LAotCXsibHNiYWNrdXAiLCBnbF9sc2JhY2t1cCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicmVzZXRscyIsIGdsX3Jlc2V0bHMsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibGFtcG9uIiwgZ2xfbGFtcG9uLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibGFtcG9mZiIsIGdsX2xhbXBvZmYsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic2V0YmVsbCIsIGdsX3NldGJlbGwsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmxhbmtzY3JlZW4iLCBnbF9ibGFua3NjcmVlbiwgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGVwdGhjdWUiLCBnbF9kZXB0aGN1ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiemJ1ZmZlciIsIGdsX3pidWZmZXIsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiYmFja2ZhY2UiLCBnbF9iYWNrZmFjZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiY21vdjJpIiwgZ2xfY21vdjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZHJhdzJpIiwgZ2xfZHJhdzJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsibW92ZTJpIiwgZ2xfbW92ZTJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicG50MmkiLCBnbF9wbnQyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGF0Y2hiYXNpcyIsIGdsX3BhdGNoYmFzaXMsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGF0Y2hwcmVjaXNpb24iLCBnbF9wYXRjaHByZWNpc2lvbiwgTUVUSF9PTERBUkdTfSwKLQl7InBkcjJpIiwgZ2xfcGRyMmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdjJpIiwgZ2xfcG12MmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHIyaSIsIGdsX3JwZHIyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXYyaSIsIGdsX3JwbXYyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQyaSIsIGdsX3hmcHQyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im9iamRlbGV0ZSIsIGdsX29iamRlbGV0ZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBhdGNoY3VydmVzIiwgZ2xfcGF0Y2hjdXJ2ZXMsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1pbnNpemUiLCBnbF9taW5zaXplLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1heHNpemUiLCBnbF9tYXhzaXplLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImtlZXBhc3BlY3QiLCBnbF9rZWVwYXNwZWN0LCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InByZWZzaXplIiwgZ2xfcHJlZnNpemUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InN0ZXB1bml0IiwgZ2xfc3RlcHVuaXQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImZ1ZGdlIiwgZ2xfZnVkZ2UsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Indpbm1vdmUiLCBnbF93aW5tb3ZlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImF0dGFjaGN1cnNvciIsIGdsX2F0dGFjaGN1cnNvciwgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRlZmxpbmVzdHlsZSIsIGdsX2RlZmxpbmVzdHlsZSwgICAgTUVUSF9PTERBUkdTfSwKLQl7Im5vaXNlIiwgZ2xfbm9pc2UsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBpY2tzaXplIiwgZ2xfcGlja3NpemUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InFlbnRlciIsIGdsX3FlbnRlciwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldGRlcHRoIiwgZ2xfc2V0ZGVwdGgsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3YycyIsIGdsX2Ntb3YycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXcycyIsIGdsX2RyYXcycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmUycyIsIGdsX21vdmUycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBkcjJzIiwgZ2xfcGRyMnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdjJzIiwgZ2xfcG12MnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudDJzIiwgZ2xfcG50MnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJkcjJzIiwgZ2xfcmRyMnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJtdjJzIiwgZ2xfcm12MnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHIycyIsIGdsX3JwZHIycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXYycyIsIGdsX3JwbXYycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQycyIsIGdsX3hmcHQycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3YyIiwgZ2xfY21vdjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXcyIiwgZ2xfZHJhdzIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmUyIiwgZ2xfbW92ZTIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudDIiLCBnbF9wbnQyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBkcjIiLCBnbF9wZHIyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdjIiLCBnbF9wbXYyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJkcjIiLCBnbF9yZHIyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJtdjIiLCBnbF9ybXYyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHIyIiwgZ2xfcnBkcjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXYyIiwgZ2xfcnBtdjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQyIiwgZ2xfeGZwdDIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxvYWRtYXRyaXgiLCBnbF9sb2FkbWF0cml4LCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im11bHRtYXRyaXgiLCBnbF9tdWx0bWF0cml4LCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNydiIsIGdsX2NydiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJjcnYiLCBnbF9yY3J2LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFkZHRvcHVwIiwgZ2xfYWRkdG9wdXAsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNoYXJzdHIiLCBnbF9jaGFyc3RyLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldHBvcnQiLCBnbF9nZXRwb3J0LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InN0cndpZHRoIiwgZ2xfc3Ryd2lkdGgsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Indpbm9wZW4iLCBnbF93aW5vcGVuLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IndpbnRpdGxlIiwgZ2xfd2ludGl0bGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGYiLCBnbF9wb2xmLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGYyIiwgZ2xfcG9sZjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHkiLCBnbF9wb2x5LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHkyIiwgZ2xfcG9seTIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNydm4iLCBnbF9jcnZuLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJjcnZuIiwgZ2xfcmNydm4sICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGYyaSIsIGdsX3BvbGYyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGZpIiwgZ2xfcG9sZmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHkyaSIsIGdsX3BvbHkyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHlpIiwgZ2xfcG9seWksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGYycyIsIGdsX3BvbGYycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGZzIiwgZ2xfcG9sZnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHlzIiwgZ2xfcG9seXMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbHkycyIsIGdsX3BvbHkycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRlZmN1cnNvciIsIGdsX2RlZmN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IndyaXRlcGl4ZWxzIiwgZ2xfd3JpdGVwaXhlbHMsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRlZmJhc2lzIiwgZ2xfZGVmYmFzaXMsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imdld3JpdGUiLCBnbF9nZXdyaXRlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJvdGF0ZSIsIGdsX3JvdGF0ZSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJvdCIsIGdsX3JvdCwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmNmaSIsIGdsX2NpcmNmaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmNpIiwgZ2xfY2lyY2ksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3ZpIiwgZ2xfY21vdmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXdpIiwgZ2xfZHJhd2ksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmVpIiwgZ2xfbW92ZWksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudGkiLCBnbF9wbnRpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im5ld3RhZyIsIGdsX25ld3RhZywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBkcmkiLCBnbF9wZHJpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdmkiLCBnbF9wbXZpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJkcmkiLCBnbF9yZHJpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJtdmkiLCBnbF9ybXZpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHJpIiwgZ2xfcnBkcmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXZpIiwgZ2xfcnBtdmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHRpIiwgZ2xfeGZwdGksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmMiLCBnbF9jaXJjLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmNmIiwgZ2xfY2lyY2YsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3YiLCBnbF9jbW92LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXciLCBnbF9kcmF3LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmUiLCBnbF9tb3ZlLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudCIsIGdsX3BudCwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNjYWxlIiwgZ2xfc2NhbGUsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InRyYW5zbGF0ZSIsIGdsX3RyYW5zbGF0ZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBkciIsIGdsX3BkciwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdiIsIGdsX3BtdiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJkciIsIGdsX3JkciwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJtdiIsIGdsX3JtdiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHIiLCBnbF9ycGRyLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXYiLCBnbF9ycG12LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQiLCBnbF94ZnB0LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IlJHQmNvbG9yIiwgZ2xfUkdCY29sb3IsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IlJHQndyaXRlbWFzayIsIGdsX1JHQndyaXRlbWFzaywgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldGN1cnNvciIsIGdsX3NldGN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InRpZSIsIGdsX3RpZSwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmNmcyIsIGdsX2NpcmNmcywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNpcmNzIiwgZ2xfY2lyY3MsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImNtb3ZzIiwgZ2xfY21vdnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImRyYXdzIiwgZ2xfZHJhd3MsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1vdmVzIiwgZ2xfbW92ZXMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBkcnMiLCBnbF9wZHJzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBtdnMiLCBnbF9wbXZzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudHMiLCBnbF9wbnRzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJkcnMiLCBnbF9yZHJzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJtdnMiLCBnbF9ybXZzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwZHJzIiwgZ2xfcnBkcnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwbXZzIiwgZ2xfcnBtdnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHRzIiwgZ2xfeGZwdHMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImN1cm9yaWdpbiIsIGdsX2N1cm9yaWdpbiwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImN5Y2xlbWFwIiwgZ2xfY3ljbGVtYXAsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBhdGNoIiwgZ2xfcGF0Y2gsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGYiLCBnbF9zcGxmLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGYyIiwgZ2xfc3BsZjIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGZpIiwgZ2xfc3BsZmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGYyaSIsIGdsX3NwbGYyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGZzIiwgZ2xfc3BsZnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNwbGYycyIsIGdsX3NwbGYycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJwYXRjaCIsIGdsX3JwYXRjaCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im9ydGhvMiIsIGdsX29ydGhvMiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3QiLCBnbF9yZWN0LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3RmIiwgZ2xfcmVjdGYsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQ0IiwgZ2xfeGZwdDQsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InRleHRwb3J0IiwgZ2xfdGV4dHBvcnQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im1hcGNvbG9yIiwgZ2xfbWFwY29sb3IsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNjcm1hc2siLCBnbF9zY3JtYXNrLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldHZhbHVhdG9yIiwgZ2xfc2V0dmFsdWF0b3IsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InZpZXdwb3J0IiwgZ2xfdmlld3BvcnQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNoYWRlcmFuZ2UiLCBnbF9zaGFkZXJhbmdlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQ0cyIsIGdsX3hmcHQ0cywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3RmaSIsIGdsX3JlY3RmaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3RpIiwgZ2xfcmVjdGksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InhmcHQ0aSIsIGdsX3hmcHQ0aSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InByZWZwb3NpdGlvbiIsIGdsX3ByZWZwb3NpdGlvbiwgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyYyIsIGdsX2FyYywgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyY2YiLCBnbF9hcmNmLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyY2ZpIiwgZ2xfYXJjZmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyY2kiLCBnbF9hcmNpLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJib3gyIiwgZ2xfYmJveDIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJib3gyaSIsIGdsX2Jib3gyaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJib3gycyIsIGdsX2Jib3gycywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImJsaW5rIiwgZ2xfYmxpbmssICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im9ydGhvIiwgZ2xfb3J0aG8sICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IndpbmRvdyIsIGdsX3dpbmRvdywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imxvb2thdCIsIGdsX2xvb2thdCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBlcnNwZWN0aXZlIiwgZ2xfcGVyc3BlY3RpdmUsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBvbGFydmlldyIsIGdsX3BvbGFydmlldywgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyY2ZzIiwgZ2xfYXJjZnMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImFyY3MiLCBnbF9hcmNzLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3Rjb3B5IiwgZ2xfcmVjdGNvcHksICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7IlJHQmN1cnNvciIsIGdsX1JHQmN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGJ1dHRvbiIsIGdsX2dldGJ1dHRvbiwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGNtbW9kZSIsIGdsX2dldGNtbW9kZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGxzYmFja3VwIiwgZ2xfZ2V0bHNiYWNrdXAsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldHJlc2V0bHMiLCBnbF9nZXRyZXNldGxzLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGRjbSIsIGdsX2dldGRjbSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldHpidWZmZXIiLCBnbF9nZXR6YnVmZmVyLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImlzbWV4IiwgZ2xfaXNtZXgsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imlzb2JqIiwgZ2xfaXNvYmosICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImlzcXVldWVkIiwgZ2xfaXNxdWV1ZWQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImlzdGFnIiwgZ2xfaXN0YWcsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imdlbm9iaiIsIGdsX2dlbm9iaiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdlbnRhZyIsIGdsX2dlbnRhZywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGJ1ZmZlciIsIGdsX2dldGJ1ZmZlciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGNvbG9yIiwgZ2xfZ2V0Y29sb3IsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImdldGRpc3BsYXltb2RlIiwgZ2xfZ2V0ZGlzcGxheW1vZGUsIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRmb250IiwgZ2xfZ2V0Zm9udCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRoZWlnaHQiLCBnbF9nZXRoZWlnaHQsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRoaXRjb2RlIiwgZ2xfZ2V0aGl0Y29kZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRsc3R5bGUiLCBnbF9nZXRsc3R5bGUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRsd2lkdGgiLCBnbF9nZXRsd2lkdGgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRtYXAiLCBnbF9nZXRtYXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRwbGFuZXMiLCBnbF9nZXRwbGFuZXMsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR3cml0ZW1hc2siLCBnbF9nZXR3cml0ZW1hc2ssICAgIE1FVEhfT0xEQVJHU30sCi0JeyJxdGVzdCIsIGdsX3F0ZXN0LCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRsc3JlcGVhdCIsIGdsX2dldGxzcmVwZWF0LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRtb25pdG9yIiwgZ2xfZ2V0bW9uaXRvciwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRvcGVub2JqIiwgZ2xfZ2V0b3Blbm9iaiwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRwYXR0ZXJuIiwgZ2xfZ2V0cGF0dGVybiwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5nZXQiLCBnbF93aW5nZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5hdHRhY2giLCBnbF93aW5hdHRhY2gsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRvdGhlcm1vbml0b3IiLCBnbF9nZXRvdGhlcm1vbml0b3IsIE1FVEhfT0xEQVJHU30sCi0JeyJuZXdwdXAiLCBnbF9uZXdwdXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR2YWx1YXRvciIsIGdsX2dldHZhbHVhdG9yLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5zZXQiLCBnbF93aW5zZXQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkb3B1cCIsIGdsX2RvcHVwLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRkZXB0aCIsIGdsX2dldGRlcHRoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRjcG9zIiwgZ2xfZ2V0Y3BvcywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRzaXplIiwgZ2xfZ2V0c2l6ZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRvcmlnaW4iLCBnbF9nZXRvcmlnaW4sICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR2aWV3cG9ydCIsIGdsX2dldHZpZXdwb3J0LCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR0cCIsIGdsX2dldHRwLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRncG9zIiwgZ2xfZ2V0Z3BvcywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ3aW5wb3NpdGlvbiIsIGdsX3dpbnBvc2l0aW9uLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnUkdCY29sb3IiLCBnbF9nUkdCY29sb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnUkdCbWFzayIsIGdsX2dSR0JtYXNrLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRzY3JtYXNrIiwgZ2xfZ2V0c2NybWFzaywgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRtY29sb3IiLCBnbF9nZXRtY29sb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtYXB3IiwgZ2xfbWFwdywgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtYXB3MiIsIGdsX21hcHcyLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRjdXJzb3IiLCBnbF9nZXRjdXJzb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjbW9kZSIsIGdsX2Ntb2RlLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjb25jYXZlIiwgZ2xfY29uY2F2ZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjdXJzdHlwZSIsIGdsX2N1cnN0eXBlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkcmF3bW9kZSIsIGdsX2RyYXdtb2RlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnYW1tYXJhbXAiLCBnbF9nYW1tYXJhbXAsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRiYWNrZmFjZSIsIGdsX2dldGJhY2tmYWNlLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRkZXNjZW5kZXIiLCBnbF9nZXRkZXNjZW5kZXIsICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRkcmF3bW9kZSIsIGdsX2dldGRyYXdtb2RlLCAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRtbW9kZSIsIGdsX2dldG1tb2RlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRzbSIsIGdsX2dldHNtLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXR2aWRlbyIsIGdsX2dldHZpZGVvLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJpbWFrZWJhY2tncm91bmQiLCBnbF9pbWFrZWJhY2tncm91bmQsIE1FVEhfT0xEQVJHU30sCi0JeyJsbWJpbmQiLCBnbF9sbWJpbmQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJsbWRlZiIsIGdsX2xtZGVmLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJtbW9kZSIsIGdsX21tb2RlLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJub3JtYWwiLCBnbF9ub3JtYWwsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJvdmVybGF5IiwgZ2xfb3ZlcmxheSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJSR0JyYW5nZSIsIGdsX1JHQnJhbmdlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzZXR2aWRlbyIsIGdsX3NldHZpZGVvLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJzaGFkZW1vZGVsIiwgZ2xfc2hhZGVtb2RlbCwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJ1bmRlcmxheSIsIGdsX3VuZGVybGF5LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ25jbG9zZWRsaW5lIiwgZ2xfYmduY2xvc2VkbGluZSwgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ25saW5lIiwgZ2xfYmdubGluZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ25wb2ludCIsIGdsX2JnbnBvaW50LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ25wb2x5Z29uIiwgZ2xfYmducG9seWdvbiwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ25zdXJmYWNlIiwgZ2xfYmduc3VyZmFjZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ250bWVzaCIsIGdsX2JnbnRtZXNoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJiZ250cmltIiwgZ2xfYmdudHJpbSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRjbG9zZWRsaW5lIiwgZ2xfZW5kY2xvc2VkbGluZSwgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRsaW5lIiwgZ2xfZW5kbGluZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRwb2ludCIsIGdsX2VuZHBvaW50LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRwb2x5Z29uIiwgZ2xfZW5kcG9seWdvbiwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmRzdXJmYWNlIiwgZ2xfZW5kc3VyZmFjZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmR0bWVzaCIsIGdsX2VuZHRtZXNoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJlbmR0cmltIiwgZ2xfZW5kdHJpbSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJibGVuZGZ1bmN0aW9uIiwgZ2xfYmxlbmRmdW5jdGlvbiwgIE1FVEhfT0xEQVJHU30sCi0JeyJjM2YiLCBnbF9jM2YsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjM2kiLCBnbF9jM2ksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjM3MiLCBnbF9jM3MsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjNGYiLCBnbF9jNGYsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjNGkiLCBnbF9jNGksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjNHMiLCBnbF9jNHMsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjb2xvcmYiLCBnbF9jb2xvcmYsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjcGFjayIsIGdsX2NwYWNrLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJjemNsZWFyIiwgZ2xfY3pjbGVhciwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkZ2xjbG9zZSIsIGdsX2RnbGNsb3NlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJkZ2xvcGVuIiwgZ2xfZGdsb3BlbiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRnZGVzYyIsIGdsX2dldGdkZXNjLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCi0JeyJnZXRudXJic3Byb3BlcnR5IiwgZ2xfZ2V0bnVyYnNwcm9wZXJ0eSwgTUVUSF9PTERBUkdTfSwKLQl7ImdsY29tcGF0IiwgZ2xfZ2xjb21wYXQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imljb25zaXplIiwgZ2xfaWNvbnNpemUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Imljb250aXRsZSIsIGdsX2ljb250aXRsZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxSR0JyYW5nZSIsIGdsX2xSR0JyYW5nZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxpbmVzbW9vdGgiLCBnbF9saW5lc21vb3RoLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxtY29sb3IiLCBnbF9sbWNvbG9yLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxvZ2ljb3AiLCBnbF9sb2dpY29wLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxzZXRkZXB0aCIsIGdsX2xzZXRkZXB0aCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7ImxzaGFkZXJhbmdlIiwgZ2xfbHNoYWRlcmFuZ2UsICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im4zZiIsIGdsX24zZiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7Im5vYm9yZGVyIiwgZ2xfbm9ib3JkZXIsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InBudHNtb290aCIsIGdsX3BudHNtb290aCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlYWRzb3VyY2UiLCBnbF9yZWFkc291cmNlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InJlY3R6b29tIiwgZ2xfcmVjdHpvb20sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3giLCBnbF9zYm94LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3hpIiwgZ2xfc2JveGksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3hzIiwgZ2xfc2JveHMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3hmIiwgZ2xfc2JveGYsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3hmaSIsIGdsX3Nib3hmaSwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNib3hmcyIsIGdsX3Nib3hmcywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKLQl7InNldG51cmJzcHJvcGVydHkiLCBnbF9zZXRudXJic3Byb3BlcnR5LCBNRVRIX09MREFSR1N9LAotCXsic2V0cHVwIiwgZ2xfc2V0cHVwLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic21vb3RobGluZSIsIGdsX3Ntb290aGxpbmUsICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic3VicGl4ZWwiLCBnbF9zdWJwaXhlbCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic3dhcHRtZXNoIiwgZ2xfc3dhcHRtZXNoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsic3dpbm9wZW4iLCBnbF9zd2lub3BlbiwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjJmIiwgZ2xfdjJmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjJpIiwgZ2xfdjJpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjJzIiwgZ2xfdjJzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjNmIiwgZ2xfdjNmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjNpIiwgZ2xfdjNpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjNzIiwgZ2xfdjNzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjRmIiwgZ2xfdjRmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjRpIiwgZ2xfdjRpLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjRzIiwgZ2xfdjRzLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidmlkZW9jbWQiLCBnbF92aWRlb2NtZCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid2luZGVwdGgiLCBnbF93aW5kZXB0aCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsid21wYWNrIiwgZ2xfd21wYWNrLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiemRyYXciLCBnbF96ZHJhdywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiemZ1bmN0aW9uIiwgZ2xfemZ1bmN0aW9uLCAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsienNvdXJjZSIsIGdsX3pzb3VyY2UsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiendyaXRlbWFzayIsIGdsX3p3cml0ZW1hc2ssICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjJkIiwgZ2xfdjJkLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjNkIiwgZ2xfdjNkLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsidjRkIiwgZ2xfdjRkLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicGl4bW9kZSIsIGdsX3BpeG1vZGUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsicWdldGZkIiwgZ2xfcWdldGZkLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXsiZGl0aGVyIiwgZ2xfZGl0aGVyLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAotCXtOVUxMLCBOVUxMfSAvKiBTZW50aW5lbCAqLworICAgIHsicXJlYWQiLCBnbF9xcmVhZCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidmFycmF5IiwgZ2xfdmFycmF5LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibnZhcnJheSIsIGdsX252YXJyYXksICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidm5hcnJheSIsIGdsX3ZuYXJyYXksICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibnVyYnNzdXJmYWNlIiwgZ2xfbnVyYnNzdXJmYWNlLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsibnVyYnNjdXJ2ZSIsIGdsX251cmJzY3VydmUsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicHdsY3VydmUiLCBnbF9wd2xjdXJ2ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGljayIsIGdsX3BpY2ssICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZW5kcGljayIsIGdsX2VuZHBpY2ssICAgICAgICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJnc2VsZWN0IiwgZ2xfZ3NlbGVjdCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlbmRzZWxlY3QiLCBnbF9lbmRzZWxlY3QsICAgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldG1hdHJpeCIsIGdsX2dldG1hdHJpeCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImFsdGdldG1hdHJpeCIsIGdsX2FsdGdldG1hdHJpeCwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxyZWN0d3JpdGUiLCBnbF9scmVjdHdyaXRlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxyZWN0cmVhZCIsIGdsX2xyZWN0cmVhZCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlYWRkaXNwbGF5IiwgZ2xfcmVhZGRpc3BsYXksICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBhY2tyZWN0IiwgZ2xfcGFja3JlY3QsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InVucGFja3JlY3QiLCBnbF91bnBhY2tyZWN0LCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imd2ZXJzaW9uIiwgZ2xfZ3ZlcnNpb24sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsZWFyIiwgZ2xfY2xlYXIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHNoYWRlIiwgZ2xfZ2V0c2hhZGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRldnBvcnQiLCBnbF9kZXZwb3J0LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJkcjJpIiwgZ2xfcmRyMmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlY3RmcyIsIGdsX3JlY3RmcywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlY3RzIiwgZ2xfcmVjdHMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJtdjJpIiwgZ2xfcm12MmksICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im5vcG9ydCIsIGdsX25vcG9ydCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvcHZpZXdwb3J0IiwgZ2xfcG9wdmlld3BvcnQsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsZWFyaGl0Y29kZSIsIGdsX2NsZWFyaGl0Y29kZSwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsb3Nlb2JqIiwgZ2xfY2xvc2VvYmosICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImN1cnNvZmYiLCBnbF9jdXJzb2ZmLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImN1cnNvbiIsIGdsX2N1cnNvbiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRvdWJsZWJ1ZmZlciIsIGdsX2RvdWJsZWJ1ZmZlciwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZpbmlzaCIsIGdsX2ZpbmlzaCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imdjb25maWciLCBnbF9nY29uZmlnLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Imdpbml0IiwgZ2xfZ2luaXQsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdyZXNldCIsIGdsX2dyZXNldCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im11bHRpbWFwIiwgZ2xfbXVsdGltYXAsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im9uZW1hcCIsIGdsX29uZW1hcCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvcGF0dHJpYnV0ZXMiLCBnbF9wb3BhdHRyaWJ1dGVzLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvcG1hdHJpeCIsIGdsX3BvcG1hdHJpeCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InB1c2hhdHRyaWJ1dGVzIiwgZ2xfcHVzaGF0dHJpYnV0ZXMsTUVUSF9PTERBUkdTfSwKKyAgICB7InB1c2htYXRyaXgiLCBnbF9wdXNobWF0cml4LCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InB1c2h2aWV3cG9ydCIsIGdsX3B1c2h2aWV3cG9ydCwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InFyZXNldCIsIGdsX3FyZXNldCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IlJHQm1vZGUiLCBnbF9SR0Jtb2RlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNpbmdsZWJ1ZmZlciIsIGdsX3NpbmdsZWJ1ZmZlciwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InN3YXBidWZmZXJzIiwgZ2xfc3dhcGJ1ZmZlcnMsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdzeW5jIiwgZ2xfZ3N5bmMsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdmbHVzaCIsIGdsX2dmbHVzaCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InRwb24iLCBnbF90cG9uLCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InRwb2ZmIiwgZ2xfdHBvZmYsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsa29uIiwgZ2xfY2xrb24sICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNsa29mZiIsIGdsX2Nsa29mZiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJpbmdiZWxsIiwgZ2xfcmluZ2JlbGwsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdiZWdpbiIsIGdsX2diZWdpbiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InRleHRpbml0IiwgZ2xfdGV4dGluaXQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImluaXRuYW1lcyIsIGdsX2luaXRuYW1lcywgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBjbG9zIiwgZ2xfcGNsb3MsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InBvcG5hbWUiLCBnbF9wb3BuYW1lLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNwY2xvcyIsIGdsX3NwY2xvcywgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InpjbGVhciIsIGdsX3pjbGVhciwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNjcmVlbnNwYWNlIiwgZ2xfc2NyZWVuc3BhY2UsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InJlc2hhcGV2aWV3cG9ydCIsIGdsX3Jlc2hhcGV2aWV3cG9ydCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbnB1c2giLCBnbF93aW5wdXNoLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbnBvcCIsIGdsX3dpbnBvcCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZvcmVncm91bmQiLCBnbF9mb3JlZ3JvdW5kLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZGZ1bGxzY3JuIiwgZ2xfZW5kZnVsbHNjcm4sICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHB1cG1vZGUiLCBnbF9lbmRwdXBtb2RlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImZ1bGxzY3JuIiwgZ2xfZnVsbHNjcm4sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InB1cG1vZGUiLCBnbF9wdXBtb2RlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbmNvbnN0cmFpbnRzIiwgZ2xfd2luY29uc3RyYWludHMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYWdlY29sb3IiLCBnbF9wYWdlY29sb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ0ZXh0Y29sb3IiLCBnbF90ZXh0Y29sb3IsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjb2xvciIsIGdsX2NvbG9yLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjdXJ2ZWl0IiwgZ2xfY3VydmVpdCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmb250IiwgZ2xfZm9udCwgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsaW5ld2lkdGgiLCBnbF9saW5ld2lkdGgsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRsaW5lc3R5bGUiLCBnbF9zZXRsaW5lc3R5bGUsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRtYXAiLCBnbF9zZXRtYXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzd2FwaW50ZXJ2YWwiLCBnbF9zd2FwaW50ZXJ2YWwsICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3cml0ZW1hc2siLCBnbF93cml0ZW1hc2ssICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ0ZXh0d3JpdGVtYXNrIiwgZ2xfdGV4dHdyaXRlbWFzaywgIE1FVEhfT0xEQVJHU30sCisgICAgeyJxZGV2aWNlIiwgZ2xfcWRldmljZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ1bnFkZXZpY2UiLCBnbF91bnFkZXZpY2UsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjdXJ2ZWJhc2lzIiwgZ2xfY3VydmViYXNpcywgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjdXJ2ZXByZWNpc2lvbiIsIGdsX2N1cnZlcHJlY2lzaW9uLE1FVEhfT0xEQVJHU30sCisgICAgeyJsb2FkbmFtZSIsIGdsX2xvYWRuYW1lLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYXNzdGhyb3VnaCIsIGdsX3Bhc3N0aHJvdWdoLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwdXNobmFtZSIsIGdsX3B1c2huYW1lLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRtb25pdG9yIiwgZ2xfc2V0bW9uaXRvciwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRzaGFkZSIsIGdsX3NldHNoYWRlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRwYXR0ZXJuIiwgZ2xfc2V0cGF0dGVybiwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYWdld3JpdGVtYXNrIiwgZ2xfcGFnZXdyaXRlbWFzaywgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjYWxsb2JqIiwgZ2xfY2FsbG9iaiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZWxvYmoiLCBnbF9kZWxvYmosICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJlZGl0b2JqIiwgZ2xfZWRpdG9iaiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJtYWtlb2JqIiwgZ2xfbWFrZW9iaiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJtYWtldGFnIiwgZ2xfbWFrZXRhZywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjaHVua3NpemUiLCBnbF9jaHVua3NpemUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjb21wYWN0aWZ5IiwgZ2xfY29tcGFjdGlmeSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZWx0YWciLCBnbF9kZWx0YWcsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsc3JlcGVhdCIsIGdsX2xzcmVwZWF0LCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJvYmppbnNlcnQiLCBnbF9vYmppbnNlcnQsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJvYmpyZXBsYWNlIiwgZ2xfb2JqcmVwbGFjZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5jbG9zZSIsIGdsX3dpbmNsb3NlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJibGFua3RpbWUiLCBnbF9ibGFua3RpbWUsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmcmVlcHVwIiwgZ2xfZnJlZXB1cCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiYWNrYnVmZmVyIiwgZ2xfYmFja2J1ZmZlciwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJmcm9udGJ1ZmZlciIsIGdsX2Zyb250YnVmZmVyLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsc2JhY2t1cCIsIGdsX2xzYmFja3VwLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJyZXNldGxzIiwgZ2xfcmVzZXRscywgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsYW1wb24iLCBnbF9sYW1wb24sICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJsYW1wb2ZmIiwgZ2xfbGFtcG9mZiwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRiZWxsIiwgZ2xfc2V0YmVsbCwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJibGFua3NjcmVlbiIsIGdsX2JsYW5rc2NyZWVuLCAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkZXB0aGN1ZSIsIGdsX2RlcHRoY3VlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6YnVmZmVyIiwgZ2xfemJ1ZmZlciwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJiYWNrZmFjZSIsIGdsX2JhY2tmYWNlLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJjbW92MmkiLCBnbF9jbW92MmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkcmF3MmkiLCBnbF9kcmF3MmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJtb3ZlMmkiLCBnbF9tb3ZlMmksICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwbnQyaSIsIGdsX3BudDJpLCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYXRjaGJhc2lzIiwgZ2xfcGF0Y2hiYXNpcywgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwYXRjaHByZWNpc2lvbiIsIGdsX3BhdGNocHJlY2lzaW9uLCBNRVRIX09MREFSR1N9LAorICAgIHsicGRyMmkiLCBnbF9wZHIyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12MmkiLCBnbF9wbXYyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkcjJpIiwgZ2xfcnBkcjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdjJpIiwgZ2xfcnBtdjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDJpIiwgZ2xfeGZwdDJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsib2JqZGVsZXRlIiwgZ2xfb2JqZGVsZXRlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGF0Y2hjdXJ2ZXMiLCBnbF9wYXRjaGN1cnZlcywgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibWluc2l6ZSIsIGdsX21pbnNpemUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibWF4c2l6ZSIsIGdsX21heHNpemUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsia2VlcGFzcGVjdCIsIGdsX2tlZXBhc3BlY3QsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicHJlZnNpemUiLCBnbF9wcmVmc2l6ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3RlcHVuaXQiLCBnbF9zdGVwdW5pdCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZnVkZ2UiLCBnbF9mdWRnZSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid2lubW92ZSIsIGdsX3dpbm1vdmUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXR0YWNoY3Vyc29yIiwgZ2xfYXR0YWNoY3Vyc29yLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVmbGluZXN0eWxlIiwgZ2xfZGVmbGluZXN0eWxlLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsibm9pc2UiLCBnbF9ub2lzZSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGlja3NpemUiLCBnbF9waWNrc2l6ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicWVudGVyIiwgZ2xfcWVudGVyLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0ZGVwdGgiLCBnbF9zZXRkZXB0aCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdjJzIiwgZ2xfY21vdjJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhdzJzIiwgZ2xfZHJhdzJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZTJzIiwgZ2xfbW92ZTJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGRyMnMiLCBnbF9wZHIycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12MnMiLCBnbF9wbXYycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50MnMiLCBnbF9wbnQycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmRyMnMiLCBnbF9yZHIycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm12MnMiLCBnbF9ybXYycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkcjJzIiwgZ2xfcnBkcjJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdjJzIiwgZ2xfcnBtdjJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDJzIiwgZ2xfeGZwdDJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdjIiLCBnbF9jbW92MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhdzIiLCBnbF9kcmF3MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZTIiLCBnbF9tb3ZlMiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50MiIsIGdsX3BudDIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGRyMiIsIGdsX3BkcjIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12MiIsIGdsX3BtdjIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmRyMiIsIGdsX3JkcjIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm12MiIsIGdsX3JtdjIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkcjIiLCBnbF9ycGRyMiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdjIiLCBnbF9ycG12MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDIiLCBnbF94ZnB0MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibG9hZG1hdHJpeCIsIGdsX2xvYWRtYXRyaXgsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibXVsdG1hdHJpeCIsIGdsX211bHRtYXRyaXgsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3J2IiwgZ2xfY3J2LCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmNydiIsIGdsX3JjcnYsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYWRkdG9wdXAiLCBnbF9hZGR0b3B1cCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2hhcnN0ciIsIGdsX2NoYXJzdHIsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0cG9ydCIsIGdsX2dldHBvcnQsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3Ryd2lkdGgiLCBnbF9zdHJ3aWR0aCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid2lub3BlbiIsIGdsX3dpbm9wZW4sICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid2ludGl0bGUiLCBnbF93aW50aXRsZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZiIsIGdsX3BvbGYsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZjIiLCBnbF9wb2xmMiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seSIsIGdsX3BvbHksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seTIiLCBnbF9wb2x5MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3J2biIsIGdsX2Nydm4sICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmNydm4iLCBnbF9yY3J2biwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZjJpIiwgZ2xfcG9sZjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZmkiLCBnbF9wb2xmaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seTJpIiwgZ2xfcG9seTJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seWkiLCBnbF9wb2x5aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZjJzIiwgZ2xfcG9sZjJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sZnMiLCBnbF9wb2xmcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seXMiLCBnbF9wb2x5cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9seTJzIiwgZ2xfcG9seTJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVmY3Vyc29yIiwgZ2xfZGVmY3Vyc29yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid3JpdGVwaXhlbHMiLCBnbF93cml0ZXBpeGVscywgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZGVmYmFzaXMiLCBnbF9kZWZiYXNpcywgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V3cml0ZSIsIGdsX2dld3JpdGUsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm90YXRlIiwgZ2xfcm90YXRlLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm90IiwgZ2xfcm90LCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyY2ZpIiwgZ2xfY2lyY2ZpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyY2kiLCBnbF9jaXJjaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdmkiLCBnbF9jbW92aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhd2kiLCBnbF9kcmF3aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZWkiLCBnbF9tb3ZlaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50aSIsIGdsX3BudGksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibmV3dGFnIiwgZ2xfbmV3dGFnLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGRyaSIsIGdsX3BkcmksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12aSIsIGdsX3BtdmksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmRyaSIsIGdsX3JkcmksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm12aSIsIGdsX3JtdmksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkcmkiLCBnbF9ycGRyaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdmkiLCBnbF9ycG12aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdGkiLCBnbF94ZnB0aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyYyIsIGdsX2NpcmMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyY2YiLCBnbF9jaXJjZiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdiIsIGdsX2Ntb3YsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhdyIsIGdsX2RyYXcsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZSIsIGdsX21vdmUsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50IiwgZ2xfcG50LCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2NhbGUiLCBnbF9zY2FsZSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidHJhbnNsYXRlIiwgZ2xfdHJhbnNsYXRlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGRyIiwgZ2xfcGRyLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12IiwgZ2xfcG12LCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmRyIiwgZ2xfcmRyLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm12IiwgZ2xfcm12LCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkciIsIGdsX3JwZHIsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdiIsIGdsX3JwbXYsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdCIsIGdsX3hmcHQsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiUkdCY29sb3IiLCBnbF9SR0Jjb2xvciwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiUkdCd3JpdGVtYXNrIiwgZ2xfUkdCd3JpdGVtYXNrLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0Y3Vyc29yIiwgZ2xfc2V0Y3Vyc29yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidGllIiwgZ2xfdGllLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyY2ZzIiwgZ2xfY2lyY2ZzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY2lyY3MiLCBnbF9jaXJjcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY21vdnMiLCBnbF9jbW92cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZHJhd3MiLCBnbF9kcmF3cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibW92ZXMiLCBnbF9tb3ZlcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGRycyIsIGdsX3BkcnMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG12cyIsIGdsX3BtdnMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50cyIsIGdsX3BudHMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmRycyIsIGdsX3JkcnMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicm12cyIsIGdsX3JtdnMsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBkcnMiLCBnbF9ycGRycywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBtdnMiLCBnbF9ycG12cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdHMiLCBnbF94ZnB0cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3Vyb3JpZ2luIiwgZ2xfY3Vyb3JpZ2luLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiY3ljbGVtYXAiLCBnbF9jeWNsZW1hcCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGF0Y2giLCBnbF9wYXRjaCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZiIsIGdsX3NwbGYsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZjIiLCBnbF9zcGxmMiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZmkiLCBnbF9zcGxmaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZjJpIiwgZ2xfc3BsZjJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZnMiLCBnbF9zcGxmcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic3BsZjJzIiwgZ2xfc3BsZjJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicnBhdGNoIiwgZ2xfcnBhdGNoLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsib3J0aG8yIiwgZ2xfb3J0aG8yLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdCIsIGdsX3JlY3QsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdGYiLCBnbF9yZWN0ZiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDQiLCBnbF94ZnB0NCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidGV4dHBvcnQiLCBnbF90ZXh0cG9ydCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibWFwY29sb3IiLCBnbF9tYXBjb2xvciwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2NybWFzayIsIGdsX3Njcm1hc2ssICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0dmFsdWF0b3IiLCBnbF9zZXR2YWx1YXRvciwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsidmlld3BvcnQiLCBnbF92aWV3cG9ydCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2hhZGVyYW5nZSIsIGdsX3NoYWRlcmFuZ2UsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDRzIiwgZ2xfeGZwdDRzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdGZpIiwgZ2xfcmVjdGZpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdGkiLCBnbF9yZWN0aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsieGZwdDRpIiwgZ2xfeGZwdDRpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicHJlZnBvc2l0aW9uIiwgZ2xfcHJlZnBvc2l0aW9uLCAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjIiwgZ2xfYXJjLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjZiIsIGdsX2FyY2YsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjZmkiLCBnbF9hcmNmaSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjaSIsIGdsX2FyY2ksICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmJveDIiLCBnbF9iYm94MiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmJveDJpIiwgZ2xfYmJveDJpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmJveDJzIiwgZ2xfYmJveDJzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYmxpbmsiLCBnbF9ibGluaywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsib3J0aG8iLCBnbF9vcnRobywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsid2luZG93IiwgZ2xfd2luZG93LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibG9va2F0IiwgZ2xfbG9va2F0LCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicGVyc3BlY3RpdmUiLCBnbF9wZXJzcGVjdGl2ZSwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG9sYXJ2aWV3IiwgZ2xfcG9sYXJ2aWV3LCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjZnMiLCBnbF9hcmNmcywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiYXJjcyIsIGdsX2FyY3MsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdGNvcHkiLCBnbF9yZWN0Y29weSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiUkdCY3Vyc29yIiwgZ2xfUkdCY3Vyc29yLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0YnV0dG9uIiwgZ2xfZ2V0YnV0dG9uLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0Y21tb2RlIiwgZ2xfZ2V0Y21tb2RlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0bHNiYWNrdXAiLCBnbF9nZXRsc2JhY2t1cCwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0cmVzZXRscyIsIGdsX2dldHJlc2V0bHMsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0ZGNtIiwgZ2xfZ2V0ZGNtLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0emJ1ZmZlciIsIGdsX2dldHpidWZmZXIsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaXNtZXgiLCBnbF9pc21leCwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaXNvYmoiLCBnbF9pc29iaiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaXNxdWV1ZWQiLCBnbF9pc3F1ZXVlZCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaXN0YWciLCBnbF9pc3RhZywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2Vub2JqIiwgZ2xfZ2Vub2JqLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2VudGFnIiwgZ2xfZ2VudGFnLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0YnVmZmVyIiwgZ2xfZ2V0YnVmZmVyLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0Y29sb3IiLCBnbF9nZXRjb2xvciwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiZ2V0ZGlzcGxheW1vZGUiLCBnbF9nZXRkaXNwbGF5bW9kZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGZvbnQiLCBnbF9nZXRmb250LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGhlaWdodCIsIGdsX2dldGhlaWdodCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGhpdGNvZGUiLCBnbF9nZXRoaXRjb2RlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGxzdHlsZSIsIGdsX2dldGxzdHlsZSwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGx3aWR0aCIsIGdsX2dldGx3aWR0aCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG1hcCIsIGdsX2dldG1hcCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHBsYW5lcyIsIGdsX2dldHBsYW5lcywgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHdyaXRlbWFzayIsIGdsX2dldHdyaXRlbWFzaywgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InF0ZXN0IiwgZ2xfcXRlc3QsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGxzcmVwZWF0IiwgZ2xfZ2V0bHNyZXBlYXQsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG1vbml0b3IiLCBnbF9nZXRtb25pdG9yLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG9wZW5vYmoiLCBnbF9nZXRvcGVub2JqLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHBhdHRlcm4iLCBnbF9nZXRwYXR0ZXJuLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbmdldCIsIGdsX3dpbmdldCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbmF0dGFjaCIsIGdsX3dpbmF0dGFjaCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG90aGVybW9uaXRvciIsIGdsX2dldG90aGVybW9uaXRvciwgTUVUSF9PTERBUkdTfSwKKyAgICB7Im5ld3B1cCIsIGdsX25ld3B1cCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHZhbHVhdG9yIiwgZ2xfZ2V0dmFsdWF0b3IsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbnNldCIsIGdsX3dpbnNldCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRvcHVwIiwgZ2xfZG9wdXAsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGRlcHRoIiwgZ2xfZ2V0ZGVwdGgsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGNwb3MiLCBnbF9nZXRjcG9zLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHNpemUiLCBnbF9nZXRzaXplLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG9yaWdpbiIsIGdsX2dldG9yaWdpbiwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHZpZXdwb3J0IiwgZ2xfZ2V0dmlld3BvcnQsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHRwIiwgZ2xfZ2V0dHAsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGdwb3MiLCBnbF9nZXRncG9zLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IndpbnBvc2l0aW9uIiwgZ2xfd2lucG9zaXRpb24sICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdSR0Jjb2xvciIsIGdsX2dSR0Jjb2xvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdSR0JtYXNrIiwgZ2xfZ1JHQm1hc2ssICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHNjcm1hc2siLCBnbF9nZXRzY3JtYXNrLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG1jb2xvciIsIGdsX2dldG1jb2xvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1hcHciLCBnbF9tYXB3LCAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1hcHcyIiwgZ2xfbWFwdzIsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGN1cnNvciIsIGdsX2dldGN1cnNvciwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNtb2RlIiwgZ2xfY21vZGUsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNvbmNhdmUiLCBnbF9jb25jYXZlLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImN1cnN0eXBlIiwgZ2xfY3Vyc3R5cGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRyYXdtb2RlIiwgZ2xfZHJhd21vZGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdhbW1hcmFtcCIsIGdsX2dhbW1hcmFtcCwgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGJhY2tmYWNlIiwgZ2xfZ2V0YmFja2ZhY2UsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGRlc2NlbmRlciIsIGdsX2dldGRlc2NlbmRlciwgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGRyYXdtb2RlIiwgZ2xfZ2V0ZHJhd21vZGUsICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG1tb2RlIiwgZ2xfZ2V0bW1vZGUsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHNtIiwgZ2xfZ2V0c20sICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldHZpZGVvIiwgZ2xfZ2V0dmlkZW8sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImltYWtlYmFja2dyb3VuZCIsIGdsX2ltYWtlYmFja2dyb3VuZCwgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxtYmluZCIsIGdsX2xtYmluZCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImxtZGVmIiwgZ2xfbG1kZWYsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im1tb2RlIiwgZ2xfbW1vZGUsICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im5vcm1hbCIsIGdsX25vcm1hbCwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7Im92ZXJsYXkiLCBnbF9vdmVybGF5LCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7IlJHQnJhbmdlIiwgZ2xfUkdCcmFuZ2UsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNldHZpZGVvIiwgZ2xfc2V0dmlkZW8sICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InNoYWRlbW9kZWwiLCBnbF9zaGFkZW1vZGVsLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7InVuZGVybGF5IiwgZ2xfdW5kZXJsYXksICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbmNsb3NlZGxpbmUiLCBnbF9iZ25jbG9zZWRsaW5lLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbmxpbmUiLCBnbF9iZ25saW5lLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbnBvaW50IiwgZ2xfYmducG9pbnQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbnBvbHlnb24iLCBnbF9iZ25wb2x5Z29uLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbnN1cmZhY2UiLCBnbF9iZ25zdXJmYWNlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbnRtZXNoIiwgZ2xfYmdudG1lc2gsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJnbnRyaW0iLCBnbF9iZ250cmltLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZGNsb3NlZGxpbmUiLCBnbF9lbmRjbG9zZWRsaW5lLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZGxpbmUiLCBnbF9lbmRsaW5lLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHBvaW50IiwgZ2xfZW5kcG9pbnQsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHBvbHlnb24iLCBnbF9lbmRwb2x5Z29uLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHN1cmZhY2UiLCBnbF9lbmRzdXJmYWNlLCAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHRtZXNoIiwgZ2xfZW5kdG1lc2gsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImVuZHRyaW0iLCBnbF9lbmR0cmltLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImJsZW5kZnVuY3Rpb24iLCBnbF9ibGVuZGZ1bmN0aW9uLCAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImMzZiIsIGdsX2MzZiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImMzaSIsIGdsX2MzaSwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImMzcyIsIGdsX2MzcywgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImM0ZiIsIGdsX2M0ZiwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImM0aSIsIGdsX2M0aSwgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImM0cyIsIGdsX2M0cywgICAgICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNvbG9yZiIsIGdsX2NvbG9yZiwgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImNwYWNrIiwgZ2xfY3BhY2ssICAgICAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImN6Y2xlYXIiLCBnbF9jemNsZWFyLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRnbGNsb3NlIiwgZ2xfZGdsY2xvc2UsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImRnbG9wZW4iLCBnbF9kZ2xvcGVuLCAgICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldGdkZXNjIiwgZ2xfZ2V0Z2Rlc2MsICAgICAgICAgICAgTUVUSF9PTERBUkdTfSwKKyAgICB7ImdldG51cmJzcHJvcGVydHkiLCBnbF9nZXRudXJic3Byb3BlcnR5LCBNRVRIX09MREFSR1N9LAorICAgIHsiZ2xjb21wYXQiLCBnbF9nbGNvbXBhdCwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaWNvbnNpemUiLCBnbF9pY29uc2l6ZSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsiaWNvbnRpdGxlIiwgZ2xfaWNvbnRpdGxlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibFJHQnJhbmdlIiwgZ2xfbFJHQnJhbmdlLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibGluZXNtb290aCIsIGdsX2xpbmVzbW9vdGgsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibG1jb2xvciIsIGdsX2xtY29sb3IsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibG9naWNvcCIsIGdsX2xvZ2ljb3AsICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibHNldGRlcHRoIiwgZ2xfbHNldGRlcHRoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibHNoYWRlcmFuZ2UiLCBnbF9sc2hhZGVyYW5nZSwgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibjNmIiwgZ2xfbjNmLCAgICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsibm9ib3JkZXIiLCBnbF9ub2JvcmRlciwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicG50c21vb3RoIiwgZ2xfcG50c21vb3RoLCAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVhZHNvdXJjZSIsIGdsX3JlYWRzb3VyY2UsICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsicmVjdHpvb20iLCBnbF9yZWN0em9vbSwgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveCIsIGdsX3Nib3gsICAgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveGkiLCBnbF9zYm94aSwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveHMiLCBnbF9zYm94cywgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveGYiLCBnbF9zYm94ZiwgICAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveGZpIiwgZ2xfc2JveGZpLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2JveGZzIiwgZ2xfc2JveGZzLCAgICAgICAgICAgICAgICBNRVRIX09MREFSR1N9LAorICAgIHsic2V0bnVyYnNwcm9wZXJ0eSIsIGdsX3NldG51cmJzcHJvcGVydHksIE1FVEhfT0xEQVJHU30sCisgICAgeyJzZXRwdXAiLCBnbF9zZXRwdXAsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzbW9vdGhsaW5lIiwgZ2xfc21vb3RobGluZSwgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzdWJwaXhlbCIsIGdsX3N1YnBpeGVsLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzd2FwdG1lc2giLCBnbF9zd2FwdG1lc2gsICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJzd2lub3BlbiIsIGdsX3N3aW5vcGVuLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2MmYiLCBnbF92MmYsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2MmkiLCBnbF92MmksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2MnMiLCBnbF92MnMsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2M2YiLCBnbF92M2YsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2M2kiLCBnbF92M2ksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2M3MiLCBnbF92M3MsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2NGYiLCBnbF92NGYsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2NGkiLCBnbF92NGksICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2NHMiLCBnbF92NHMsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2aWRlb2NtZCIsIGdsX3ZpZGVvY21kLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3aW5kZXB0aCIsIGdsX3dpbmRlcHRoLCAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ3bXBhY2siLCBnbF93bXBhY2ssICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6ZHJhdyIsIGdsX3pkcmF3LCAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6ZnVuY3Rpb24iLCBnbF96ZnVuY3Rpb24sICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6c291cmNlIiwgZ2xfenNvdXJjZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ6d3JpdGVtYXNrIiwgZ2xfendyaXRlbWFzaywgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2MmQiLCBnbF92MmQsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2M2QiLCBnbF92M2QsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJ2NGQiLCBnbF92NGQsICAgICAgICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJwaXhtb2RlIiwgZ2xfcGl4bW9kZSwgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJxZ2V0ZmQiLCBnbF9xZ2V0ZmQsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAgeyJkaXRoZXIiLCBnbF9kaXRoZXIsICAgICAgICAgICAgICAgIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsIE5VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogCiB2b2lkCiBpbml0Z2wodm9pZCkKIHsKLSAgICAKKwogICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGdsIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0gICAgICAgIHJldHVybjsKLSAgICAKLQkodm9pZCkgUHlfSW5pdE1vZHVsZSgiZ2wiLCBnbF9tZXRob2RzKTsKKyAgICByZXR1cm47CisKKyAgICAodm9pZCkgUHlfSW5pdE1vZHVsZSgiZ2wiLCBnbF9tZXRob2RzKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvaW1hZ2VvcC5jIGIvTW9kdWxlcy9pbWFnZW9wLmMKaW5kZXggOGQwZDY4Zi4uOGJkMTFiMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9pbWFnZW9wLmMKKysrIGIvTW9kdWxlcy9pbWFnZW9wLmMKQEAgLTMzLDEwICszMywxMCBAQAogc3RhdGljIGludAogY2hlY2tfY29vcmRvbm5hdGUoaW50IHZhbHVlLCBjb25zdCBjaGFyKiBuYW1lKQogewotCWlmICggMCA8IHZhbHVlKQotCQlyZXR1cm4gMTsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIiVzIHZhbHVlIGlzIG5lZ2F0aXZlIG9yIG51bCIsIG5hbWUpOwotCXJldHVybiAwOworICAgIGlmICggMCA8IHZhbHVlKQorICAgICAgICByZXR1cm4gMTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIiVzIHZhbHVlIGlzIG5lZ2F0aXZlIG9yIG51bCIsIG5hbWUpOworICAgIHJldHVybiAwOwogfQogCiAvKioKQEAgLTQ2LDE0ICs0NiwxNCBAQAogc3RhdGljIGludAogY2hlY2tfbXVsdGlwbHlfc2l6ZShpbnQgcHJvZHVjdCwgaW50IHgsIGNvbnN0IGNoYXIqIHhuYW1lLCBpbnQgeSwgY29uc3QgY2hhciogeW5hbWUsIGludCBzaXplKQogewotCWlmICggIWNoZWNrX2Nvb3Jkb25uYXRlKHgsIHhuYW1lKSApCi0JCXJldHVybiAwOwotCWlmICggIWNoZWNrX2Nvb3Jkb25uYXRlKHksIHluYW1lKSApCi0JCXJldHVybiAwOwotCWlmICggc2l6ZSA9PSAocHJvZHVjdCAvIHkpIC8geCApCi0JCXJldHVybiAxOwotCVB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTdHJpbmcgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19jb29yZG9ubmF0ZSh4LCB4bmFtZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19jb29yZG9ubmF0ZSh5LCB5bmFtZSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIHNpemUgPT0gKHByb2R1Y3QgLyB5KSAvIHggKQorICAgICAgICByZXR1cm4gMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU3RyaW5nIGhhcyBpbmNvcnJlY3QgbGVuZ3RoIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNjMsNyArNjMsNyBAQAogc3RhdGljIGludAogY2hlY2tfbXVsdGlwbHkoaW50IHByb2R1Y3QsIGludCB4LCBpbnQgeSkKIHsKLQlyZXR1cm4gY2hlY2tfbXVsdGlwbHlfc2l6ZShwcm9kdWN0LCB4LCAieCIsIHksICJ5IiwgMSk7CisgICAgcmV0dXJuIGNoZWNrX211bHRpcGx5X3NpemUocHJvZHVjdCwgeCwgIngiLCB5LCAieSIsIDEpOwogfQogCiAvKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSAodGhlIGRlZmF1bHQgaWYgYW55dGhpbmcgZ29lcyB3cm9uZyksIHdlJ3JlCkBAIC04NiwxMzEgKzg2LDEzMSBAQAogc3RhdGljIGludAogaW1hZ2VvcF9iYWNrd2FyZF9jb21wYXRpYmxlKHZvaWQpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpiY29zOwotCVB5T2JqZWN0ICpiY287Ci0JbG9uZyByYzsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmJjb3M7CisgICAgUHlPYmplY3QgKmJjbzsKKyAgICBsb25nIHJjOwogCi0JaWYgKEltYWdlb3BEaWN0ID09IE5VTEwpIC8qICJjYW5ub3QgaGFwcGVuIiAqLwotCQlyZXR1cm4gMTsKLQlpZiAoYmNvcyA9PSBOVUxMKSB7Ci0JCS8qIGNhY2hlIHN0cmluZyBvYmplY3QgZm9yIGZ1dHVyZSB1c2UgKi8KLQkJYmNvcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoImJhY2t3YXJkX2NvbXBhdGlibGUiKTsKLQkJaWYgKGJjb3MgPT0gTlVMTCkKLQkJCXJldHVybiAxOwotCX0KLQliY28gPSBQeURpY3RfR2V0SXRlbShJbWFnZW9wRGljdCwgYmNvcyk7Ci0JaWYgKGJjbyA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQlpZiAoIVB5SW50X0NoZWNrKGJjbykpCi0JCXJldHVybiAxOwotCXJjID0gUHlJbnRfQXNMb25nKGJjbyk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJLyogbm90IGFuIGludGVnZXIsIG9yIHRvbyBsYXJnZSwgb3Igc29tZXRoaW5nICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJjID0gMTsKLQl9Ci0JcmV0dXJuIHJjICE9IDA7CQkvKiBjb252ZXJ0IHRvIHZhbHVlcyAwLCAxICovCisgICAgaWYgKEltYWdlb3BEaWN0ID09IE5VTEwpIC8qICJjYW5ub3QgaGFwcGVuIiAqLworICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoYmNvcyA9PSBOVUxMKSB7CisgICAgICAgIC8qIGNhY2hlIHN0cmluZyBvYmplY3QgZm9yIGZ1dHVyZSB1c2UgKi8KKyAgICAgICAgYmNvcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoImJhY2t3YXJkX2NvbXBhdGlibGUiKTsKKyAgICAgICAgaWYgKGJjb3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBiY28gPSBQeURpY3RfR2V0SXRlbShJbWFnZW9wRGljdCwgYmNvcyk7CisgICAgaWYgKGJjbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIVB5SW50X0NoZWNrKGJjbykpCisgICAgICAgIHJldHVybiAxOworICAgIHJjID0gUHlJbnRfQXNMb25nKGJjbyk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgLyogbm90IGFuIGludGVnZXIsIG9yIHRvbyBsYXJnZSwgb3Igc29tZXRoaW5nICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJjID0gMTsKKyAgICB9CisgICAgcmV0dXJuIHJjICE9IDA7ICAgICAgICAgICAgIC8qIGNvbnZlcnQgdG8gdmFsdWVzIDAsIDEgKi8KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfY3JvcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqY3AsICpuY3A7Ci0Jc2hvcnQgKm5zcDsKLQlQeV9JbnQzMiAqbmxwOwotCWludCBsZW4sIHNpemUsIHgsIHksIG5ld3gxLCBuZXd4MiwgbmV3eTEsIG5ld3kyLCBubGVuOwotCWludCBpeCwgaXksIHhzdGVwLCB5c3RlcDsKLQlQeU9iamVjdCAqcnY7CisgICAgY2hhciAqY3AsICpuY3A7CisgICAgc2hvcnQgKm5zcDsKKyAgICBQeV9JbnQzMiAqbmxwOworICAgIGludCBsZW4sIHNpemUsIHgsIHksIG5ld3gxLCBuZXd4MiwgbmV3eTEsIG5ld3kyLCBubGVuOworICAgIGludCBpeCwgaXksIHhzdGVwLCB5c3RlcDsKKyAgICBQeU9iamVjdCAqcnY7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlpaWkiLCAmY3AsICZsZW4sICZzaXplLCAmeCwgJnksCi0JCQkgICZuZXd4MSwgJm5ld3kxLCAmbmV3eDIsICZuZXd5MikgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlpaWkiLCAmY3AsICZsZW4sICZzaXplLCAmeCwgJnksCisgICAgICAgICAgICAgICAgICAgICAgJm5ld3gxLCAmbmV3eTEsICZuZXd4MiwgJm5ld3kyKSApCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShsZW4sIHgsICJ4IiwgeSwgInkiLCBzaXplKSApCi0JCXJldHVybiAwOworICAgIGlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5Iiwgc2l6ZSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXhzdGVwID0gKG5ld3gxIDwgbmV3eDIpPyAxIDogLTE7Ci0JeXN0ZXAgPSAobmV3eTEgPCBuZXd5Mik/IDEgOiAtMTsKKyAgICB4c3RlcCA9IChuZXd4MSA8IG5ld3gyKT8gMSA6IC0xOworICAgIHlzdGVwID0gKG5ld3kxIDwgbmV3eTIpPyAxIDogLTE7CiAKLSAgICAgICAgbmxlbiA9IChhYnMobmV3eDItbmV3eDEpKzEpKihhYnMobmV3eTItbmV3eTEpKzEpKnNpemU7Ci0JaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShubGVuLCBhYnMobmV3eDItbmV3eDEpKzEsICJhYnMobmV3eDItbmV3eDEpKzEiLCBhYnMobmV3eTItbmV3eTEpKzEsICJhYnMobmV3eTItbmV3eTEpKzEiLCBzaXplKSApCi0JCXJldHVybiAwOwotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JbnNwID0gKHNob3J0ICopbmNwOwotCW5scCA9IChQeV9JbnQzMiAqKW5jcDsKLQluZXd5MiArPSB5c3RlcDsKLQluZXd4MiArPSB4c3RlcDsKLQlmb3IoIGl5ID0gbmV3eTE7IGl5ICE9IG5ld3kyOyBpeSs9eXN0ZXAgKSB7Ci0JCWZvciAoIGl4ID0gbmV3eDE7IGl4ICE9IG5ld3gyOyBpeCs9eHN0ZXAgKSB7Ci0JCQlpZiAoIGl5IDwgMCB8fCBpeSA+PSB5IHx8IGl4IDwgMCB8fCBpeCA+PSB4ICkgewotCQkJCWlmICggc2l6ZSA9PSAxICkKLQkJCQkJKm5jcCsrID0gMDsKLQkJCQllbHNlCi0JCQkJCSpubHArKyA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmICggc2l6ZSA9PSAxICkKLQkJCQkJKm5jcCsrID0gKkNIQVJQKGNwLCB4LCBpeCwgaXkpOwotCQkJCWVsc2UgaWYgKCBzaXplID09IDIgKQotCQkJCQkqbnNwKysgPSAqU0hPUlRQKGNwLCB4LCBpeCwgaXkpOwotCQkJCWVsc2UKLQkJCQkJKm5scCsrID0gKkxPTkdQKGNwLCB4LCBpeCwgaXkpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBydjsKKyAgICBubGVuID0gKGFicyhuZXd4Mi1uZXd4MSkrMSkqKGFicyhuZXd5Mi1uZXd5MSkrMSkqc2l6ZTsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIGFicyhuZXd4Mi1uZXd4MSkrMSwgImFicyhuZXd4Mi1uZXd4MSkrMSIsIGFicyhuZXd5Mi1uZXd5MSkrMSwgImFicyhuZXd5Mi1uZXd5MSkrMSIsIHNpemUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAoY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBuc3AgPSAoc2hvcnQgKiluY3A7CisgICAgbmxwID0gKFB5X0ludDMyICopbmNwOworICAgIG5ld3kyICs9IHlzdGVwOworICAgIG5ld3gyICs9IHhzdGVwOworICAgIGZvciggaXkgPSBuZXd5MTsgaXkgIT0gbmV3eTI7IGl5Kz15c3RlcCApIHsKKyAgICAgICAgZm9yICggaXggPSBuZXd4MTsgaXggIT0gbmV3eDI7IGl4Kz14c3RlcCApIHsKKyAgICAgICAgICAgIGlmICggaXkgPCAwIHx8IGl5ID49IHkgfHwgaXggPCAwIHx8IGl4ID49IHggKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKQorICAgICAgICAgICAgICAgICAgICAqbmNwKysgPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKm5scCsrID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKQorICAgICAgICAgICAgICAgICAgICAqbmNwKysgPSAqQ0hBUlAoY3AsIHgsIGl4LCBpeSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApCisgICAgICAgICAgICAgICAgICAgICpuc3ArKyA9ICpTSE9SVFAoY3AsIHgsIGl4LCBpeSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqbmxwKysgPSAqTE9OR1AoY3AsIHgsIGl4LCBpeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9zY2FsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqY3AsICpuY3A7Ci0Jc2hvcnQgKm5zcDsKLQlQeV9JbnQzMiAqbmxwOwotCWludCBsZW4sIHNpemUsIHgsIHksIG5ld3gsIG5ld3ksIG5sZW47Ci0JaW50IGl4LCBpeTsKLQlpbnQgb2l4LCBvaXk7Ci0JUHlPYmplY3QgKnJ2OworICAgIGNoYXIgKmNwLCAqbmNwOworICAgIHNob3J0ICpuc3A7CisgICAgUHlfSW50MzIgKm5scDsKKyAgICBpbnQgbGVuLCBzaXplLCB4LCB5LCBuZXd4LCBuZXd5LCBubGVuOworICAgIGludCBpeCwgaXk7CisgICAgaW50IG9peCwgb2l5OworICAgIFB5T2JqZWN0ICpydjsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpaWkiLAotCQkJICAmY3AsICZsZW4sICZzaXplLCAmeCwgJnksICZuZXd4LCAmbmV3eSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaWlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAmY3AsICZsZW4sICZzaXplLCAmeCwgJnksICZuZXd4LCAmbmV3eSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggc2l6ZSAhPSAxICYmIHNpemUgIT0gMiAmJiBzaXplICE9IDQgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxLCAyIG9yIDQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5Iiwgc2l6ZSkgKQotCQlyZXR1cm4gMDsKLSAgICAgICAgbmxlbiA9IG5ld3gqbmV3eSpzaXplOwotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobmxlbiwgbmV3eCwgIm5ld3giLCBuZXd5LCAibmV3eSIsIHNpemUpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCBzaXplICE9IDEgJiYgc2l6ZSAhPSAyICYmIHNpemUgIT0gNCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlNpemUgc2hvdWxkIGJlIDEsIDIgb3IgNCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShsZW4sIHgsICJ4IiwgeSwgInkiLCBzaXplKSApCisgICAgICAgIHJldHVybiAwOworICAgIG5sZW4gPSBuZXd4Km5ld3kqc2l6ZTsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIG5ld3gsICJuZXd4IiwgbmV3eSwgIm5ld3kiLCBzaXplKSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAoY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLQluc3AgPSAoc2hvcnQgKiluY3A7Ci0JbmxwID0gKFB5X0ludDMyICopbmNwOwotCWZvciggaXkgPSAwOyBpeSA8IG5ld3k7IGl5KysgKSB7Ci0JCWZvciAoIGl4ID0gMDsgaXggPCBuZXd4OyBpeCsrICkgewotCQkJb2l4ID0gaXggKiB4IC8gbmV3eDsKLQkJCW9peSA9IGl5ICogeSAvIG5ld3k7Ci0JCQlpZiAoIHNpemUgPT0gMSApCi0JCQkJKm5jcCsrID0gKkNIQVJQKGNwLCB4LCBvaXgsIG9peSk7Ci0JCQllbHNlIGlmICggc2l6ZSA9PSAyICkKLQkJCQkqbnNwKysgPSAqU0hPUlRQKGNwLCB4LCBvaXgsIG9peSk7Ci0JCQllbHNlCi0JCQkJKm5scCsrID0gKkxPTkdQKGNwLCB4LCBvaXgsIG9peSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJ2OworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgbnNwID0gKHNob3J0ICopbmNwOworICAgIG5scCA9IChQeV9JbnQzMiAqKW5jcDsKKyAgICBmb3IoIGl5ID0gMDsgaXkgPCBuZXd5OyBpeSsrICkgeworICAgICAgICBmb3IgKCBpeCA9IDA7IGl4IDwgbmV3eDsgaXgrKyApIHsKKyAgICAgICAgICAgIG9peCA9IGl4ICogeCAvIG5ld3g7CisgICAgICAgICAgICBvaXkgPSBpeSAqIHkgLyBuZXd5OworICAgICAgICAgICAgaWYgKCBzaXplID09IDEgKQorICAgICAgICAgICAgICAgICpuY3ArKyA9ICpDSEFSUChjcCwgeCwgb2l4LCBvaXkpOworICAgICAgICAgICAgZWxzZSBpZiAoIHNpemUgPT0gMiApCisgICAgICAgICAgICAgICAgKm5zcCsrID0gKlNIT1JUUChjcCwgeCwgb2l4LCBvaXkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpubHArKyA9ICpMT05HUChjcCwgeCwgb2l4LCBvaXkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogLyogTm90ZTogdGhpcyByb3V0aW5lIGNhbiB1c2UgYSBiaXQgb2Ygb3B0aW1pemluZyAqLwpAQCAtMjE4LDU3NyArMjE4LDU3NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfdG92aWRlbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG1heHgsIG1heHksIHgsIHksIGxlbjsKLQlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQlpbnQgd2lkdGg7Ci0JUHlPYmplY3QgKnJ2OworICAgIGludCBtYXh4LCBtYXh5LCB4LCB5LCBsZW47CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgaW50IHdpZHRoOworICAgIFB5T2JqZWN0ICpydjsKIAogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWkiLCAmY3AsICZsZW4sICZ3aWR0aCwgJm1heHgsICZtYXh5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpIiwgJmNwLCAmbGVuLCAmd2lkdGgsICZtYXh4LCAmbWF4eSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggd2lkdGggIT0gMSAmJiB3aWR0aCAhPSA0ICkgewotCQlQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU2l6ZSBzaG91bGQgYmUgMSBvciA0Iik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoICFjaGVja19tdWx0aXBseV9zaXplKGxlbiwgbWF4eCwgIm1heCIsIG1heHksICJtYXh5Iiwgd2lkdGgpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCB3aWR0aCAhPSAxICYmIHdpZHRoICE9IDQgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTaXplIHNob3VsZCBiZSAxIG9yIDQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCBtYXh4LCAibWF4IiwgbWF4eSwgIm1heHkiLCB3aWR0aCkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLQlpZiAoIHdpZHRoID09IDEgKSB7Ci0JCW1lbWNweShuY3AsIGNwLCBtYXh4KTsJCS8qIENvcHkgZmlyc3QgbGluZSAqLwotCQluY3AgKz0gbWF4eDsKLQkJZm9yICh5PTE7IHk8bWF4eTsgeSsrKSB7CS8qIEludGVycG9sYXRlIG90aGVyIGxpbmVzICovCi0JCQlmb3IoeD0wOyB4PG1heHg7IHgrKykgewotCQkJCWkgPSB5Km1heHggKyB4OwotCQkJCSpuY3ArKyA9ICgoaW50KWNwW2ldICsgKGludCljcFtpLW1heHhdKSA+PiAxOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KG5jcCwgY3AsIG1heHgqNCk7CQkvKiBDb3B5IGZpcnN0IGxpbmUgKi8KLQkJbmNwICs9IG1heHgqNDsKLQkJZm9yICh5PTE7IHk8bWF4eTsgeSsrKSB7CS8qIEludGVycG9sYXRlIG90aGVyIGxpbmVzICovCi0JCQlmb3IoeD0wOyB4PG1heHg7IHgrKykgewotCQkJCWkgPSAoeSptYXh4ICsgeCkqNCArIDE7Ci0JCQkJKm5jcCsrID0gMDsJLyogU2tpcCBhbGZhIGNvbXAgKi8KLQkJCQkqbmNwKysgPSAoKGludCljcFtpXSArIChpbnQpY3BbaS00Km1heHhdKSA+PiAxOwotCQkJCWkrKzsKLQkJCQkqbmNwKysgPSAoKGludCljcFtpXSArIChpbnQpY3BbaS00Km1heHhdKSA+PiAxOwotCQkJCWkrKzsKLQkJCQkqbmNwKysgPSAoKGludCljcFtpXSArIChpbnQpY3BbaS00Km1heHhdKSA+PiAxOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiBydjsKKyAgICBpZiAoIHdpZHRoID09IDEgKSB7CisgICAgICAgIG1lbWNweShuY3AsIGNwLCBtYXh4KTsgICAgICAgICAgICAgICAgICAvKiBDb3B5IGZpcnN0IGxpbmUgKi8KKyAgICAgICAgbmNwICs9IG1heHg7CisgICAgICAgIGZvciAoeT0xOyB5PG1heHk7IHkrKykgeyAgICAgICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSBvdGhlciBsaW5lcyAqLworICAgICAgICAgICAgZm9yKHg9MDsgeDxtYXh4OyB4KyspIHsKKyAgICAgICAgICAgICAgICBpID0geSptYXh4ICsgeDsKKyAgICAgICAgICAgICAgICAqbmNwKysgPSAoKGludCljcFtpXSArIChpbnQpY3BbaS1tYXh4XSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShuY3AsIGNwLCBtYXh4KjQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgZmlyc3QgbGluZSAqLworICAgICAgICBuY3AgKz0gbWF4eCo0OworICAgICAgICBmb3IgKHk9MTsgeTxtYXh5OyB5KyspIHsgICAgICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgb3RoZXIgbGluZXMgKi8KKyAgICAgICAgICAgIGZvcih4PTA7IHg8bWF4eDsgeCsrKSB7CisgICAgICAgICAgICAgICAgaSA9ICh5Km1heHggKyB4KSo0ICsgMTsKKyAgICAgICAgICAgICAgICAqbmNwKysgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgYWxmYSBjb21wICovCisgICAgICAgICAgICAgICAgKm5jcCsrID0gKChpbnQpY3BbaV0gKyAoaW50KWNwW2ktNCptYXh4XSkgPj4gMTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgKm5jcCsrID0gKChpbnQpY3BbaV0gKyAoaW50KWNwW2ktNCptYXh4XSkgPj4gMTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgKm5jcCsrID0gKChpbnQpY3BbaV0gKyAoaW50KWNwW2ktNCptYXh4XSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX2dyZXkybW9ubyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHRyZXMsIHgsIHksIGxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQl1bnNpZ25lZCBjaGFyIG92YWx1ZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIGJpdDsKKyAgICBpbnQgdHJlcywgeCwgeSwgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIHVuc2lnbmVkIGNoYXIgb3ZhbHVlOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaSwgYml0OwogCiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaSIsICZjcCwgJmxlbiwgJngsICZ5LCAmdHJlcykgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpaSIsICZjcCwgJmxlbiwgJngsICZ5LCAmdHJlcykgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rNykvOCk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzcpLzgpOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JYml0ID0gMHg4MDsKLQlvdmFsdWUgPSAwOwotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgewotCQlpZiAoIChpbnQpY3BbaV0gPiB0cmVzICkKLQkJCW92YWx1ZSB8PSBiaXQ7Ci0JCWJpdCA+Pj0gMTsKLQkJaWYgKCBiaXQgPT0gMCApIHsKLQkJCSpuY3ArKyA9IG92YWx1ZTsKLQkJCWJpdCA9IDB4ODA7Ci0JCQlvdmFsdWUgPSAwOwotCQl9Ci0JfQotCWlmICggYml0ICE9IDB4ODAgKQotCQkqbmNwKysgPSBvdmFsdWU7Ci0JcmV0dXJuIHJ2OworICAgIGJpdCA9IDB4ODA7CisgICAgb3ZhbHVlID0gMDsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgaWYgKCAoaW50KWNwW2ldID4gdHJlcyApCisgICAgICAgICAgICBvdmFsdWUgfD0gYml0OworICAgICAgICBiaXQgPj49IDE7CisgICAgICAgIGlmICggYml0ID09IDAgKSB7CisgICAgICAgICAgICAqbmNwKysgPSBvdmFsdWU7CisgICAgICAgICAgICBiaXQgPSAweDgwOworICAgICAgICAgICAgb3ZhbHVlID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIGJpdCAhPSAweDgwICkKKyAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfZ3JleTJncmV5NChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQl1bnNpZ25lZCBjaGFyIG92YWx1ZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7Ci0JaW50IHBvczsKKyAgICBpbnQgeCwgeSwgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIHVuc2lnbmVkIGNoYXIgb3ZhbHVlOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaTsKKyAgICBpbnQgcG9zOwogCiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGxlbisxKS8yKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKLQlwb3MgPSAwOwotCW92YWx1ZSA9IDA7Ci0JZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7Ci0JCW92YWx1ZSB8PSAoKGludCljcFtpXSAmIDB4ZjApID4+IHBvczsKLQkJcG9zICs9IDQ7Ci0JCWlmICggcG9zID09IDggKSB7Ci0JCQkqbmNwKysgPSBvdmFsdWU7Ci0JCQlvdmFsdWUgPSAwOwotCQkJcG9zID0gMDsKLQkJfQotCX0KLQlpZiAoIHBvcyAhPSAwICkKLQkJKm5jcCsrID0gb3ZhbHVlOwotCXJldHVybiBydjsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rMSkvMik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcG9zID0gMDsKKyAgICBvdmFsdWUgPSAwOworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICBvdmFsdWUgfD0gKChpbnQpY3BbaV0gJiAweGYwKSA+PiBwb3M7CisgICAgICAgIHBvcyArPSA0OworICAgICAgICBpZiAoIHBvcyA9PSA4ICkgeworICAgICAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgICAgICAgICAgb3ZhbHVlID0gMDsKKyAgICAgICAgICAgIHBvcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBwb3MgIT0gMCApCisgICAgICAgICpuY3ArKyA9IG92YWx1ZTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX2dyZXkyZ3JleTIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4LCB5LCBsZW47Ci0JdW5zaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JdW5zaWduZWQgY2hhciBvdmFsdWU7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOwotCWludCBwb3M7CisgICAgaW50IHgsIHksIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICB1bnNpZ25lZCBjaGFyIG92YWx1ZTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CisgICAgaW50IHBvczsKIAogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rMykvNCk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JcG9zID0gMDsKLQlvdmFsdWUgPSAwOwotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgewotCQlvdmFsdWUgfD0gKChpbnQpY3BbaV0gJiAweGMwKSA+PiBwb3M7Ci0JCXBvcyArPSAyOwotCQlpZiAoIHBvcyA9PSA4ICkgewotCQkJKm5jcCsrID0gb3ZhbHVlOwotCQkJb3ZhbHVlID0gMDsKLQkJCXBvcyA9IDA7Ci0JCX0KLQl9Ci0JaWYgKCBwb3MgIT0gMCApCi0JCSpuY3ArKyA9IG92YWx1ZTsKLQlyZXR1cm4gcnY7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzMpLzQpOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIHBvcyA9IDA7CisgICAgb3ZhbHVlID0gMDsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgb3ZhbHVlIHw9ICgoaW50KWNwW2ldICYgMHhjMCkgPj4gcG9zOworICAgICAgICBwb3MgKz0gMjsKKyAgICAgICAgaWYgKCBwb3MgPT0gOCApIHsKKyAgICAgICAgICAgICpuY3ArKyA9IG92YWx1ZTsKKyAgICAgICAgICAgIG92YWx1ZSA9IDA7CisgICAgICAgICAgICBwb3MgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmICggcG9zICE9IDAgKQorICAgICAgICAqbmNwKysgPSBvdmFsdWU7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9kaXRoZXIybW9ubyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN1bSwgeCwgeSwgbGVuOwotCXVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotCXVuc2lnbmVkIGNoYXIgb3ZhbHVlOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaSwgYml0OworICAgIGludCBzdW0sIHgsIHksIGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICB1bnNpZ25lZCBjaGFyIG92YWx1ZTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIGJpdDsKIAogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rNykvOCk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAobGVuKzcpLzgpOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JYml0ID0gMHg4MDsKLQlvdmFsdWUgPSAwOwotCXN1bSA9IDA7Ci0JZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7Ci0JCXN1bSArPSBjcFtpXTsKLQkJaWYgKCBzdW0gPj0gMjU2ICkgewotCQkJc3VtIC09IDI1NjsKLQkJCW92YWx1ZSB8PSBiaXQ7Ci0JCX0KLQkJYml0ID4+PSAxOwotCQlpZiAoIGJpdCA9PSAwICkgewotCQkJKm5jcCsrID0gb3ZhbHVlOwotCQkJYml0ID0gMHg4MDsKLQkJCW92YWx1ZSA9IDA7Ci0JCX0KLQl9Ci0JaWYgKCBiaXQgIT0gMHg4MCApCi0JCSpuY3ArKyA9IG92YWx1ZTsKLQlyZXR1cm4gcnY7CisgICAgYml0ID0gMHg4MDsKKyAgICBvdmFsdWUgPSAwOworICAgIHN1bSA9IDA7CisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgIHN1bSArPSBjcFtpXTsKKyAgICAgICAgaWYgKCBzdW0gPj0gMjU2ICkgeworICAgICAgICAgICAgc3VtIC09IDI1NjsKKyAgICAgICAgICAgIG92YWx1ZSB8PSBiaXQ7CisgICAgICAgIH0KKyAgICAgICAgYml0ID4+PSAxOworICAgICAgICBpZiAoIGJpdCA9PSAwICkgeworICAgICAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgICAgICAgICAgYml0ID0gMHg4MDsKKyAgICAgICAgICAgIG92YWx1ZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCBiaXQgIT0gMHg4MCApCisgICAgICAgICpuY3ArKyA9IG92YWx1ZTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX2RpdGhlcjJncmV5MihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQl1bnNpZ25lZCBjaGFyIG92YWx1ZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGk7Ci0JaW50IHBvczsKLQlpbnQgc3VtID0gMCwgbnZhbHVlOworICAgIGludCB4LCB5LCBsZW47CisgICAgdW5zaWduZWQgY2hhciAqY3AsICpuY3A7CisgICAgdW5zaWduZWQgY2hhciBvdmFsdWU7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpOworICAgIGludCBwb3M7CisgICAgaW50IHN1bSA9IDAsIG52YWx1ZTsKIAogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rMykvNCk7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JcG9zID0gMTsKLQlvdmFsdWUgPSAwOwotCWZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgewotCQlzdW0gKz0gY3BbaV07Ci0JCW52YWx1ZSA9IHN1bSAmIDB4MTgwOwotCQlzdW0gLT0gbnZhbHVlOwotCQlvdmFsdWUgfD0gbnZhbHVlID4+IHBvczsKLQkJcG9zICs9IDI7Ci0JCWlmICggcG9zID09IDkgKSB7Ci0JCQkqbmNwKysgPSBvdmFsdWU7Ci0JCQlvdmFsdWUgPSAwOwotCQkJcG9zID0gMTsKLQkJfQotCX0KLQlpZiAoIHBvcyAhPSAwICkKLQkJKm5jcCsrID0gb3ZhbHVlOwotCXJldHVybiBydjsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIChsZW4rMykvNCk7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcG9zID0gMTsKKyAgICBvdmFsdWUgPSAwOworICAgIGZvciAoIGk9MDsgaSA8IGxlbjsgaSsrICkgeworICAgICAgICBzdW0gKz0gY3BbaV07CisgICAgICAgIG52YWx1ZSA9IHN1bSAmIDB4MTgwOworICAgICAgICBzdW0gLT0gbnZhbHVlOworICAgICAgICBvdmFsdWUgfD0gbnZhbHVlID4+IHBvczsKKyAgICAgICAgcG9zICs9IDI7CisgICAgICAgIGlmICggcG9zID09IDkgKSB7CisgICAgICAgICAgICAqbmNwKysgPSBvdmFsdWU7CisgICAgICAgICAgICBvdmFsdWUgPSAwOworICAgICAgICAgICAgcG9zID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIHBvcyAhPSAwICkKKyAgICAgICAgKm5jcCsrID0gb3ZhbHVlOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfbW9ubzJncmV5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgdjAsIHYxLCB4LCB5LCBsZW4sIG5sZW47Ci0JdW5zaWduZWQgY2hhciAqY3AsICpuY3A7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpLCBiaXQ7CisgICAgaW50IHYwLCB2MSwgeCwgeSwgbGVuLCBubGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaSwgYml0OwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaWlpIiwgJmNwLCAmbGVuLCAmeCwgJnksICZ2MCwgJnYxKSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWlpaSIsICZjcCwgJmxlbiwgJngsICZ5LCAmdjAsICZ2MSkgKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICAgICBubGVuID0geCp5OwotCWlmICggIWNoZWNrX211bHRpcGx5KG5sZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCAobmxlbis3KS84ICE9IGxlbiApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlN0cmluZyBoYXMgaW5jb3JyZWN0IGxlbmd0aCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgbmxlbiA9IHgqeTsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggKG5sZW4rNykvOCAhPSBsZW4gKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTdHJpbmcgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JYml0ID0gMHg4MDsKLQlmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7Ci0JCWlmICggKmNwICYgYml0ICkKLQkJCSpuY3ArKyA9IHYxOwotCQllbHNlCi0JCQkqbmNwKysgPSB2MDsKLQkJYml0ID4+PSAxOwotCQlpZiAoIGJpdCA9PSAwICkgewotCQkJYml0ID0gMHg4MDsKLQkJCWNwKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJ2OworICAgIGJpdCA9IDB4ODA7CisgICAgZm9yICggaT0wOyBpIDwgbmxlbjsgaSsrICkgeworICAgICAgICBpZiAoICpjcCAmIGJpdCApCisgICAgICAgICAgICAqbmNwKysgPSB2MTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKm5jcCsrID0gdjA7CisgICAgICAgIGJpdCA+Pj0gMTsKKyAgICAgICAgaWYgKCBiaXQgPT0gMCApIHsKKyAgICAgICAgICAgIGJpdCA9IDB4ODA7CisgICAgICAgICAgICBjcCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfZ3JleTIyZ3JleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbiwgbmxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIHBvcywgdmFsdWUgPSAwLCBudmFsdWU7CisgICAgaW50IHgsIHksIGxlbiwgbmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCwgKm5jcDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIHBvcywgdmFsdWUgPSAwLCBudmFsdWU7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCisgICAgICAgIHJldHVybiAwOwogCi0JbmxlbiA9IHgqeTsKLQlpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApIHsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICggKG5sZW4rMykvNCAhPSBsZW4gKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTdHJpbmcgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIG5sZW4gPSB4Knk7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobmxlbiwgeCwgeSkgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoIChubGVuKzMpLzQgIT0gbGVuICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1hZ2VvcEVycm9yLCAiU3RyaW5nIGhhcyBpbmNvcnJlY3QgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCXBvcyA9IDA7Ci0JZm9yICggaT0wOyBpIDwgbmxlbjsgaSsrICkgewotCQlpZiAoIHBvcyA9PSAwICkgewotCQkJdmFsdWUgPSAqY3ArKzsKLQkJCXBvcyA9IDg7Ci0JCX0KLQkJcG9zIC09IDI7Ci0JCW52YWx1ZSA9ICh2YWx1ZSA+PiBwb3MpICYgMHgwMzsKLQkJKm5jcCsrID0gbnZhbHVlIHwgKG52YWx1ZSA8PCAyKSB8Ci0JCQkgKG52YWx1ZSA8PCA0KSB8IChudmFsdWUgPDwgNik7Ci0JfQotCXJldHVybiBydjsKKyAgICBwb3MgPSAwOworICAgIGZvciAoIGk9MDsgaSA8IG5sZW47IGkrKyApIHsKKyAgICAgICAgaWYgKCBwb3MgPT0gMCApIHsKKyAgICAgICAgICAgIHZhbHVlID0gKmNwKys7CisgICAgICAgICAgICBwb3MgPSA4OworICAgICAgICB9CisgICAgICAgIHBvcyAtPSAyOworICAgICAgICBudmFsdWUgPSAodmFsdWUgPj4gcG9zKSAmIDB4MDM7CisgICAgICAgICpuY3ArKyA9IG52YWx1ZSB8IChudmFsdWUgPDwgMikgfAorICAgICAgICAgICAgICAgICAobnZhbHVlIDw8IDQpIHwgKG52YWx1ZSA8PCA2KTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9ncmV5NDJncmV5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeCwgeSwgbGVuLCBubGVuOwotCXVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaSwgcG9zLCB2YWx1ZSA9IDAsIG52YWx1ZTsKKyAgICBpbnQgeCwgeSwgbGVuLCBubGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwLCAqbmNwOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgaSwgcG9zLCB2YWx1ZSA9IDAsIG52YWx1ZTsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlubGVuID0geCp5OwotCWlmICggIWNoZWNrX211bHRpcGx5KG5sZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKCAobmxlbisxKS8yICE9IGxlbiApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEltYWdlb3BFcnJvciwgIlN0cmluZyBoYXMgaW5jb3JyZWN0IGxlbmd0aCIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgbmxlbiA9IHgqeTsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOworICAgIGlmICggKG5sZW4rMSkvMiAhPSBsZW4gKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWFnZW9wRXJyb3IsICJTdHJpbmcgaGFzIGluY29ycmVjdCBsZW5ndGgiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JcG9zID0gMDsKLQlmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7Ci0JCWlmICggcG9zID09IDAgKSB7Ci0JCQl2YWx1ZSA9ICpjcCsrOwotCQkJcG9zID0gODsKLQkJfQotCQlwb3MgLT0gNDsKLQkJbnZhbHVlID0gKHZhbHVlID4+IHBvcykgJiAweDBmOwotCQkqbmNwKysgPSBudmFsdWUgfCAobnZhbHVlIDw8IDQpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgcG9zID0gMDsKKyAgICBmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7CisgICAgICAgIGlmICggcG9zID09IDAgKSB7CisgICAgICAgICAgICB2YWx1ZSA9ICpjcCsrOworICAgICAgICAgICAgcG9zID0gODsKKyAgICAgICAgfQorICAgICAgICBwb3MgLT0gNDsKKyAgICAgICAgbnZhbHVlID0gKHZhbHVlID4+IHBvcykgJiAweDBmOworICAgICAgICAqbmNwKysgPSBudmFsdWUgfCAobnZhbHVlIDw8IDQpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFnZW9wX3JnYjJyZ2I4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeCwgeSwgbGVuLCBubGVuOwotCXVuc2lnbmVkIGNoYXIgKmNwOwotCXVuc2lnbmVkIGNoYXIgKm5jcDsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IGksIHIsIGcsIGI7Ci0JaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKKyAgICBpbnQgeCwgeSwgbGVuLCBubGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIHIsIGcsIGI7CisgICAgaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoICFjaGVja19tdWx0aXBseV9zaXplKGxlbiwgeCwgIngiLCB5LCAieSIsIDQpICkKLQkJcmV0dXJuIDA7Ci0JbmxlbiA9IHgqeTsKLQlpZiAoICFjaGVja19tdWx0aXBseShubGVuLCB4LCB5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5IiwgNCkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBubGVuID0geCp5OworICAgIGlmICggIWNoZWNrX211bHRpcGx5KG5sZW4sIHgsIHkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOwotCWlmICggcnYgPT0gMCApCi0JCXJldHVybiAwOwotCW5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7CisgICAgaWYgKCBydiA9PSAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CiAKLQlmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7Ci0JCS8qIEJpdHMgaW4gc291cmNlOiBhYWFhYWFhYSBCQmJiYmJiYiBHR0dnZ2dnZyBSUlJycnJyciAqLwotCQlpZiAoYmFja3dhcmRfY29tcGF0aWJsZSkgewotCQkJUHlfVUludDMyIHZhbHVlID0gKiAoUHlfVUludDMyICopIGNwOwotCQkJY3AgKz0gNDsKLQkJCXIgPSAoaW50KSAoKHZhbHVlICYgMHhmZikgLyAyNTUuICogNy4gKyAuNSk7Ci0JCQlnID0gKGludCkgKCgodmFsdWUgPj4gOCkgJiAweGZmKSAvIDI1NS4gKiA3LiArIC41KTsKLQkJCWIgPSAoaW50KSAoKCh2YWx1ZSA+PiAxNikgJiAweGZmKSAvIDI1NS4gKiAzLiArIC41KTsKLQkJfSBlbHNlIHsKLQkJCWNwKys7CQkvKiBza2lwIGFscGhhIGNoYW5uZWwgKi8KLQkJCWIgPSAoaW50KSAoKmNwKysgLyAyNTUuICogMy4gKyAuNSk7Ci0JCQlnID0gKGludCkgKCpjcCsrIC8gMjU1LiAqIDcuICsgLjUpOwotCQkJciA9IChpbnQpICgqY3ArKyAvIDI1NS4gKiA3LiArIC41KTsKLQkJfQotCQkqbmNwKysgPSAodW5zaWduZWQgY2hhcikoKHI8PDUpIHwgKGI8PDMpIHwgZyk7Ci0JfQotCXJldHVybiBydjsKKyAgICBmb3IgKCBpPTA7IGkgPCBubGVuOyBpKysgKSB7CisgICAgICAgIC8qIEJpdHMgaW4gc291cmNlOiBhYWFhYWFhYSBCQmJiYmJiYiBHR0dnZ2dnZyBSUlJycnJyciAqLworICAgICAgICBpZiAoYmFja3dhcmRfY29tcGF0aWJsZSkgeworICAgICAgICAgICAgUHlfVUludDMyIHZhbHVlID0gKiAoUHlfVUludDMyICopIGNwOworICAgICAgICAgICAgY3AgKz0gNDsKKyAgICAgICAgICAgIHIgPSAoaW50KSAoKHZhbHVlICYgMHhmZikgLyAyNTUuICogNy4gKyAuNSk7CisgICAgICAgICAgICBnID0gKGludCkgKCgodmFsdWUgPj4gOCkgJiAweGZmKSAvIDI1NS4gKiA3LiArIC41KTsKKyAgICAgICAgICAgIGIgPSAoaW50KSAoKCh2YWx1ZSA+PiAxNikgJiAweGZmKSAvIDI1NS4gKiAzLiArIC41KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNwKys7ICAgICAgICAgICAgICAgICAgICAgICAvKiBza2lwIGFscGhhIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGIgPSAoaW50KSAoKmNwKysgLyAyNTUuICogMy4gKyAuNSk7CisgICAgICAgICAgICBnID0gKGludCkgKCpjcCsrIC8gMjU1LiAqIDcuICsgLjUpOworICAgICAgICAgICAgciA9IChpbnQpICgqY3ArKyAvIDI1NS4gKiA3LiArIC41KTsKKyAgICAgICAgfQorICAgICAgICAqbmNwKysgPSAodW5zaWduZWQgY2hhcikoKHI8PDUpIHwgKGI8PDMpIHwgZyk7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltYWdlb3BfcmdiODJyZ2IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4LCB5LCBsZW4sIG5sZW47Ci0JdW5zaWduZWQgY2hhciAqY3A7Ci0JdW5zaWduZWQgY2hhciAqbmNwOwotCVB5T2JqZWN0ICpydjsKLQlpbnQgaSwgciwgZywgYjsKLQl1bnNpZ25lZCBjaGFyIHZhbHVlOwotCWludCBiYWNrd2FyZF9jb21wYXRpYmxlID0gaW1hZ2VvcF9iYWNrd2FyZF9jb21wYXRpYmxlKCk7CisgICAgaW50IHgsIHksIGxlbiwgbmxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICB1bnNpZ25lZCBjaGFyICpuY3A7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCBpLCByLCBnLCBiOworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWU7CisgICAgaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI2lpIiwgJmNwLCAmbGVuLCAmeCwgJnkpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoICFjaGVja19tdWx0aXBseShsZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7Ci0JbmxlbiA9IHgqeSo0OwotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobmxlbiwgeCwgIngiLCB5LCAieSIsIDQpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOworICAgIG5sZW4gPSB4KnkqNDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIHgsICJ4IiwgeSwgInkiLCA0KSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7Ci0JCS8qIEJpdHMgaW4gc291cmNlOiBSUlJCQkdHRwotCQkqKiBSZWQgYW5kIEdyZWVuIGFyZSBtdWx0aXBsaWVkIGJ5IDM2LjUsIEJsdWUgYnkgODUKLQkJKi8KLQkJdmFsdWUgPSAqY3ArKzsKLQkJciA9ICh2YWx1ZSA+PiA1KSAmIDc7Ci0JCWcgPSAodmFsdWUgICAgICkgJiA3OwotCQliID0gKHZhbHVlID4+IDMpICYgMzsKLQkJciA9IChyPDw1KSB8IChyPDwzKSB8IChyPj4xKTsKLQkJZyA9IChnPDw1KSB8IChnPDwzKSB8IChnPj4xKTsKLQkJYiA9IChiPDw2KSB8IChiPDw0KSB8IChiPDwyKSB8IGI7Ci0JCWlmIChiYWNrd2FyZF9jb21wYXRpYmxlKSB7Ci0JCQlQeV9VSW50MzIgbnZhbHVlID0gciB8IChnPDw4KSB8IChiPDwxNik7Ci0JCQkqIChQeV9VSW50MzIgKikgbmNwID0gbnZhbHVlOwotCQkJbmNwICs9IDQ7Ci0JCX0gZWxzZSB7Ci0JCQkqbmNwKysgPSAwOwotCQkJKm5jcCsrID0gYjsKLQkJCSpuY3ArKyA9IGc7Ci0JCQkqbmNwKysgPSByOwotCQl9Ci0JfQotCXJldHVybiBydjsKKyAgICBmb3IgKCBpPTA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgLyogQml0cyBpbiBzb3VyY2U6IFJSUkJCR0dHCisgICAgICAgICoqIFJlZCBhbmQgR3JlZW4gYXJlIG11bHRpcGxpZWQgYnkgMzYuNSwgQmx1ZSBieSA4NQorICAgICAgICAqLworICAgICAgICB2YWx1ZSA9ICpjcCsrOworICAgICAgICByID0gKHZhbHVlID4+IDUpICYgNzsKKyAgICAgICAgZyA9ICh2YWx1ZSAgICAgKSAmIDc7CisgICAgICAgIGIgPSAodmFsdWUgPj4gMykgJiAzOworICAgICAgICByID0gKHI8PDUpIHwgKHI8PDMpIHwgKHI+PjEpOworICAgICAgICBnID0gKGc8PDUpIHwgKGc8PDMpIHwgKGc+PjEpOworICAgICAgICBiID0gKGI8PDYpIHwgKGI8PDQpIHwgKGI8PDIpIHwgYjsKKyAgICAgICAgaWYgKGJhY2t3YXJkX2NvbXBhdGlibGUpIHsKKyAgICAgICAgICAgIFB5X1VJbnQzMiBudmFsdWUgPSByIHwgKGc8PDgpIHwgKGI8PDE2KTsKKyAgICAgICAgICAgICogKFB5X1VJbnQzMiAqKSBuY3AgPSBudmFsdWU7CisgICAgICAgICAgICBuY3AgKz0gNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpuY3ArKyA9IDA7CisgICAgICAgICAgICAqbmNwKysgPSBiOworICAgICAgICAgICAgKm5jcCsrID0gZzsKKyAgICAgICAgICAgICpuY3ArKyA9IHI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9yZ2IyZ3JleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbiwgbmxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpLCByLCBnLCBiOwotCWludCBudmFsdWU7Ci0JaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKKyAgICBpbnQgeCwgeSwgbGVuLCBubGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGksIHIsIGcsIGI7CisgICAgaW50IG52YWx1ZTsKKyAgICBpbnQgYmFja3dhcmRfY29tcGF0aWJsZSA9IGltYWdlb3BfYmFja3dhcmRfY29tcGF0aWJsZSgpOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobGVuLCB4LCAieCIsIHksICJ5IiwgNCkgKQotCQlyZXR1cm4gMDsKLQlubGVuID0geCp5OwotCWlmICggIWNoZWNrX211bHRpcGx5KG5sZW4sIHgsIHkpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHlfc2l6ZShsZW4sIHgsICJ4IiwgeSwgInkiLCA0KSApCisgICAgICAgIHJldHVybiAwOworICAgIG5sZW4gPSB4Knk7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobmxlbiwgeCwgeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbmxlbik7Ci0JaWYgKCBydiA9PSAwICkKLQkJcmV0dXJuIDA7Ci0JbmNwID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKKyAgICBpZiAoIHJ2ID09IDAgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKIAotCWZvciAoIGk9MDsgaSA8IG5sZW47IGkrKyApIHsKLQkJaWYgKGJhY2t3YXJkX2NvbXBhdGlibGUpIHsKLQkJCVB5X1VJbnQzMiB2YWx1ZSA9ICogKFB5X1VJbnQzMiAqKSBjcDsKLQkJCWNwICs9IDQ7Ci0JCQlyID0gKGludCkgKCh2YWx1ZSAmIDB4ZmYpIC8gMjU1LiAqIDcuICsgLjUpOwotCQkJZyA9IChpbnQpICgoKHZhbHVlID4+IDgpICYgMHhmZikgLyAyNTUuICogNy4gKyAuNSk7Ci0JCQliID0gKGludCkgKCgodmFsdWUgPj4gMTYpICYgMHhmZikgLyAyNTUuICogMy4gKyAuNSk7Ci0JCX0gZWxzZSB7Ci0JCQljcCsrOwkJLyogc2tpcCBhbHBoYSBjaGFubmVsICovCi0JCQliID0gKmNwKys7Ci0JCQlnID0gKmNwKys7Ci0JCQlyID0gKmNwKys7Ci0JCX0KLQkJbnZhbHVlID0gKGludCkoMC4zMCpyICsgMC41OSpnICsgMC4xMSpiKTsKLQkJaWYgKCBudmFsdWUgPiAyNTUgKSBudmFsdWUgPSAyNTU7Ci0JCSpuY3ArKyA9ICh1bnNpZ25lZCBjaGFyKW52YWx1ZTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgIGZvciAoIGk9MDsgaSA8IG5sZW47IGkrKyApIHsKKyAgICAgICAgaWYgKGJhY2t3YXJkX2NvbXBhdGlibGUpIHsKKyAgICAgICAgICAgIFB5X1VJbnQzMiB2YWx1ZSA9ICogKFB5X1VJbnQzMiAqKSBjcDsKKyAgICAgICAgICAgIGNwICs9IDQ7CisgICAgICAgICAgICByID0gKGludCkgKCh2YWx1ZSAmIDB4ZmYpIC8gMjU1LiAqIDcuICsgLjUpOworICAgICAgICAgICAgZyA9IChpbnQpICgoKHZhbHVlID4+IDgpICYgMHhmZikgLyAyNTUuICogNy4gKyAuNSk7CisgICAgICAgICAgICBiID0gKGludCkgKCgodmFsdWUgPj4gMTYpICYgMHhmZikgLyAyNTUuICogMy4gKyAuNSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjcCsrOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2tpcCBhbHBoYSBjaGFubmVsICovCisgICAgICAgICAgICBiID0gKmNwKys7CisgICAgICAgICAgICBnID0gKmNwKys7CisgICAgICAgICAgICByID0gKmNwKys7CisgICAgICAgIH0KKyAgICAgICAgbnZhbHVlID0gKGludCkoMC4zMCpyICsgMC41OSpnICsgMC4xMSpiKTsKKyAgICAgICAgaWYgKCBudmFsdWUgPiAyNTUgKSBudmFsdWUgPSAyNTU7CisgICAgICAgICpuY3ArKyA9ICh1bnNpZ25lZCBjaGFyKW52YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1hZ2VvcF9ncmV5MnJnYihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgsIHksIGxlbiwgbmxlbjsKLQl1bnNpZ25lZCBjaGFyICpjcDsKLQl1bnNpZ25lZCBjaGFyICpuY3A7Ci0JUHlPYmplY3QgKnJ2OwotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgdmFsdWU7Ci0JaW50IGJhY2t3YXJkX2NvbXBhdGlibGUgPSBpbWFnZW9wX2JhY2t3YXJkX2NvbXBhdGlibGUoKTsKKyAgICBpbnQgeCwgeSwgbGVuLCBubGVuOworICAgIHVuc2lnbmVkIGNoYXIgKmNwOworICAgIHVuc2lnbmVkIGNoYXIgKm5jcDsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciB2YWx1ZTsKKyAgICBpbnQgYmFja3dhcmRfY29tcGF0aWJsZSA9IGltYWdlb3BfYmFja3dhcmRfY29tcGF0aWJsZSgpOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNpaSIsICZjcCwgJmxlbiwgJngsICZ5KSApCi0JCXJldHVybiAwOworICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjaWkiLCAmY3AsICZsZW4sICZ4LCAmeSkgKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICggIWNoZWNrX211bHRpcGx5KGxlbiwgeCwgeSkgKQotCQlyZXR1cm4gMDsKLSAgICAgICAgbmxlbiA9IHgqeSo0OwotCWlmICggIWNoZWNrX211bHRpcGx5X3NpemUobmxlbiwgeCwgIngiLCB5LCAieSIsIDQpICkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCAhY2hlY2tfbXVsdGlwbHkobGVuLCB4LCB5KSApCisgICAgICAgIHJldHVybiAwOworICAgIG5sZW4gPSB4KnkqNDsKKyAgICBpZiAoICFjaGVja19tdWx0aXBseV9zaXplKG5sZW4sIHgsICJ4IiwgeSwgInkiLCA0KSApCisgICAgICAgIHJldHVybiAwOwogCi0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBubGVuKTsKLQlpZiAoIHJ2ID09IDAgKQotCQlyZXR1cm4gMDsKLQluY3AgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBydiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5sZW4pOworICAgIGlmICggcnYgPT0gMCApCisgICAgICAgIHJldHVybiAwOworICAgIG5jcCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQXNTdHJpbmcocnYpOwogCi0JZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7Ci0JCXZhbHVlID0gKmNwKys7Ci0JCWlmIChiYWNrd2FyZF9jb21wYXRpYmxlKSB7Ci0JCQkqIChQeV9VSW50MzIgKikgbmNwID0gKFB5X1VJbnQzMikgdmFsdWUgfCAoKFB5X1VJbnQzMikgdmFsdWUgPDwgOCApIHwgKChQeV9VSW50MzIpIHZhbHVlIDw8IDE2KTsKLQkJCW5jcCArPSA0OwotCQl9IGVsc2UgewotCQkJKm5jcCsrID0gMDsKLQkJCSpuY3ArKyA9IHZhbHVlOwotCQkJKm5jcCsrID0gdmFsdWU7Ci0JCQkqbmNwKysgPSB2YWx1ZTsKLQkJfQotCX0KLQlyZXR1cm4gcnY7CisgICAgZm9yICggaT0wOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgIHZhbHVlID0gKmNwKys7CisgICAgICAgIGlmIChiYWNrd2FyZF9jb21wYXRpYmxlKSB7CisgICAgICAgICAgICAqIChQeV9VSW50MzIgKikgbmNwID0gKFB5X1VJbnQzMikgdmFsdWUgfCAoKFB5X1VJbnQzMikgdmFsdWUgPDwgOCApIHwgKChQeV9VSW50MzIpIHZhbHVlIDw8IDE2KTsKKyAgICAgICAgICAgIG5jcCArPSA0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm5jcCsrID0gMDsKKyAgICAgICAgICAgICpuY3ArKyA9IHZhbHVlOworICAgICAgICAgICAgKm5jcCsrID0gdmFsdWU7CisgICAgICAgICAgICAqbmNwKysgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBpbWFnZW9wX21ldGhvZHNbXSA9IHsKLQl7ICJjcm9wIiwJCWltYWdlb3BfY3JvcCwgTUVUSF9WQVJBUkdTIH0sCi0JeyAic2NhbGUiLAkJaW1hZ2VvcF9zY2FsZSwgTUVUSF9WQVJBUkdTIH0sCi0JeyAiZ3JleTJtb25vIiwJICAgICAgICBpbWFnZW9wX2dyZXkybW9ubywgTUVUSF9WQVJBUkdTIH0sCi0JeyAiZ3JleTJncmV5MiIsCSAgICAgICAgaW1hZ2VvcF9ncmV5MmdyZXkyLCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJncmV5MmdyZXk0IiwJICAgICAgICBpbWFnZW9wX2dyZXkyZ3JleTQsIE1FVEhfVkFSQVJHUyB9LAotCXsgImRpdGhlcjJtb25vIiwJaW1hZ2VvcF9kaXRoZXIybW9ubywgTUVUSF9WQVJBUkdTIH0sCi0JeyAiZGl0aGVyMmdyZXkyIiwJaW1hZ2VvcF9kaXRoZXIyZ3JleTIsIE1FVEhfVkFSQVJHUyB9LAotCXsgIm1vbm8yZ3JleSIsCSAgICAgICAgaW1hZ2VvcF9tb25vMmdyZXksIE1FVEhfVkFSQVJHUyB9LAotCXsgImdyZXkyMmdyZXkiLAkgICAgICAgIGltYWdlb3BfZ3JleTIyZ3JleSwgTUVUSF9WQVJBUkdTIH0sCi0JeyAiZ3JleTQyZ3JleSIsCSAgICAgICAgaW1hZ2VvcF9ncmV5NDJncmV5LCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJ0b3ZpZGVvIiwJICAgICAgICBpbWFnZW9wX3RvdmlkZW8sIE1FVEhfVkFSQVJHUyB9LAotCXsgInJnYjJyZ2I4IiwJICAgICAgICBpbWFnZW9wX3JnYjJyZ2I4LCBNRVRIX1ZBUkFSR1MgfSwKLQl7ICJyZ2I4MnJnYiIsCSAgICAgICAgaW1hZ2VvcF9yZ2I4MnJnYiwgTUVUSF9WQVJBUkdTIH0sCi0JeyAicmdiMmdyZXkiLAkgICAgICAgIGltYWdlb3BfcmdiMmdyZXksIE1FVEhfVkFSQVJHUyB9LAotCXsgImdyZXkycmdiIiwJICAgICAgICBpbWFnZW9wX2dyZXkycmdiLCBNRVRIX1ZBUkFSR1MgfSwKLQl7IDAsICAgICAgICAgICAgICAgICAgICAwIH0KKyAgICB7ICJjcm9wIiwgICAgICAgICAgICAgICAgICAgaW1hZ2VvcF9jcm9wLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJzY2FsZSIsICAgICAgICAgICAgICAgICAgaW1hZ2VvcF9zY2FsZSwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiZ3JleTJtb25vIiwgICAgICAgICAgICAgIGltYWdlb3BfZ3JleTJtb25vLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJncmV5MmdyZXkyIiwgICAgICAgICAgICAgaW1hZ2VvcF9ncmV5MmdyZXkyLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJncmV5MmdyZXk0IiwgICAgICAgICAgICAgaW1hZ2VvcF9ncmV5MmdyZXk0LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJkaXRoZXIybW9ubyIsICAgICAgICAgICAgaW1hZ2VvcF9kaXRoZXIybW9ubywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiZGl0aGVyMmdyZXkyIiwgICAgICAgICAgIGltYWdlb3BfZGl0aGVyMmdyZXkyLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJtb25vMmdyZXkiLCAgICAgICAgICAgICAgaW1hZ2VvcF9tb25vMmdyZXksIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImdyZXkyMmdyZXkiLCAgICAgICAgICAgICBpbWFnZW9wX2dyZXkyMmdyZXksIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImdyZXk0MmdyZXkiLCAgICAgICAgICAgICBpbWFnZW9wX2dyZXk0MmdyZXksIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInRvdmlkZW8iLCAgICAgICAgICAgICAgICBpbWFnZW9wX3RvdmlkZW8sIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInJnYjJyZ2I4IiwgICAgICAgICAgICAgICBpbWFnZW9wX3JnYjJyZ2I4LCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJyZ2I4MnJnYiIsICAgICAgICAgICAgICAgaW1hZ2VvcF9yZ2I4MnJnYiwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAicmdiMmdyZXkiLCAgICAgICAgICAgICAgIGltYWdlb3BfcmdiMmdyZXksIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgImdyZXkycmdiIiwgICAgICAgICAgICAgICBpbWFnZW9wX2dyZXkycmdiLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAwIH0KIH07CiAKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRpbWFnZW9wKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQlpZiAoUHlFcnJfV2FyblB5M2soInRoZSBpbWFnZW9wIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKLQkgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0JICAgIHJldHVybjsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSBpbWFnZW9wIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJpbWFnZW9wIiwgaW1hZ2VvcF9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JSW1hZ2VvcERpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUltYWdlb3BFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiaW1hZ2VvcC5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChJbWFnZW9wRXJyb3IgIT0gTlVMTCkKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoSW1hZ2VvcERpY3QsICJlcnJvciIsIEltYWdlb3BFcnJvcik7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoImltYWdlb3AiLCBpbWFnZW9wX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBJbWFnZW9wRGljdCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgSW1hZ2VvcEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJpbWFnZW9wLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKEltYWdlb3BFcnJvciAhPSBOVUxMKQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhJbWFnZW9wRGljdCwgImVycm9yIiwgSW1hZ2VvcEVycm9yKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvaW1nZmlsZS5jIGIvTW9kdWxlcy9pbWdmaWxlLmMKaW5kZXggYmFhNmVhZC4uNzBkMzA3YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9pbWdmaWxlLmMKKysrIGIvTW9kdWxlcy9pbWdmaWxlLmMKQEAgLTI1LDcgKzI1LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICogSW1nZmlsZUVycm9yOyAvKiBFeGNlcHRpb24gd2UgcmFpc2UgZm9yIHZhcmlvdXMgdHJvdWJsZSAqLwogCi1zdGF0aWMgaW50IHRvcF90b19ib3R0b207CS8qIFRydWUgaWYgd2Ugd2FudCB0b3AtdG8tYm90dG9tIGltYWdlcyAqLworc3RhdGljIGludCB0b3BfdG9fYm90dG9tOyAgICAgICAvKiBUcnVlIGlmIHdlIHdhbnQgdG9wLXRvLWJvdHRvbSBpbWFnZXMgKi8KIAogLyogVGhlIGltYWdlIGxpYnJhcnkgZG9lcyBub3QgYWx3YXlzIGNhbGwgdGhlIGVycm9yIGhhbmRlciA6LSgsCiAgICB0aGVyZWZvcmUgd2UgaGF2ZSBhIGdsb2JhbCB2YXJpYWJsZSBpbmRpY2F0aW5nIHRoYXQgaXQgd2FzIGNhbGxlZC4KQEAgLTM5LDkgKzM5LDkgQEAKIHN0YXRpYyB2b2lkCiBpbWdmaWxlX2Vycm9yKGNoYXIgKnN0cikKIHsKLQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLCBzdHIpOwotCWVycm9yX2NhbGxlZCA9IDE7Ci0JcmV0dXJuOwkvKiBUbyBpbWdsaWIsIHdoaWNoIHdpbGwgcmV0dXJuIGEgZmFpbHVyZSBpbmRpY2F0b3IgKi8KKyAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLCBzdHIpOworICAgIGVycm9yX2NhbGxlZCA9IDE7CisgICAgcmV0dXJuOyAgICAgLyogVG8gaW1nbGliLCB3aGljaCB3aWxsIHJldHVybiBhIGZhaWx1cmUgaW5kaWNhdG9yICovCiB9CiAKIApAQCAtNTEsMTIzICs1MSwxMjMgQEAKIHN0YXRpYyBJTUFHRSAqCiBpbWdmaWxlX29wZW4oY2hhciAqZm5hbWUpCiB7Ci0JSU1BR0UgKmltYWdlOwotCWlfc2V0ZXJyb3IoaW1nZmlsZV9lcnJvcik7Ci0JZXJyb3JfY2FsbGVkID0gMDsKLQllcnJubyA9IDA7Ci0JaWYgKCAoaW1hZ2UgPSBpb3BlbihmbmFtZSwgInIiKSkgPT0gTlVMTCApIHsKLQkJLyogRXJyb3IgbWF5IGFscmVhZHkgYmUgc2V0IGJ5IGltZ2ZpbGVfZXJyb3IgKi8KLQkJaWYgKCAhZXJyb3JfY2FsbGVkICkgewotCQkJaWYgKGVycm5vKQotCQkJCVB5RXJyX1NldEZyb21FcnJubyhJbWdmaWxlRXJyb3IpOwotCQkJZWxzZQotCQkJCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJCQkiQ2FuJ3Qgb3BlbiBpbWFnZSBmaWxlIik7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBpbWFnZTsKKyAgICBJTUFHRSAqaW1hZ2U7CisgICAgaV9zZXRlcnJvcihpbWdmaWxlX2Vycm9yKTsKKyAgICBlcnJvcl9jYWxsZWQgPSAwOworICAgIGVycm5vID0gMDsKKyAgICBpZiAoIChpbWFnZSA9IGlvcGVuKGZuYW1lLCAiciIpKSA9PSBOVUxMICkgeworICAgICAgICAvKiBFcnJvciBtYXkgYWxyZWFkeSBiZSBzZXQgYnkgaW1nZmlsZV9lcnJvciAqLworICAgICAgICBpZiAoICFlcnJvcl9jYWxsZWQgKSB7CisgICAgICAgICAgICBpZiAoZXJybm8pCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEltZ2ZpbGVFcnJvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IG9wZW4gaW1hZ2UgZmlsZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gaW1hZ2U7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWdmaWxlX3R0b2IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBuZXd2YWw7Ci0JUHlPYmplY3QgKnJ2OwotICAgIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTp0dG9iIiwgJm5ld3ZhbCkpCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gUHlJbnRfRnJvbUxvbmcodG9wX3RvX2JvdHRvbSk7Ci0JdG9wX3RvX2JvdHRvbSA9IG5ld3ZhbDsKLQlyZXR1cm4gcnY7CisgICAgaW50IG5ld3ZhbDsKKyAgICBQeU9iamVjdCAqcnY7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6dHRvYiIsICZuZXd2YWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IFB5SW50X0Zyb21Mb25nKHRvcF90b19ib3R0b20pOworICAgIHRvcF90b19ib3R0b20gPSBuZXd2YWw7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1nZmlsZV9yZWFkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmbmFtZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IHhzaXplLCB5c2l6ZSwgenNpemU7Ci0JY2hhciAqY2RhdGFwOwotCWxvbmcgKmlkYXRhcDsKLQlzdGF0aWMgc2hvcnQgcnNbODE5Ml0sIGdzWzgxOTJdLCBic1s4MTkyXTsKLQlpbnQgeCwgeTsKLQlJTUFHRSAqaW1hZ2U7Ci0JaW50IHlmaXJzdCwgeWxhc3QsIHlzdGVwOworICAgIGNoYXIgKmZuYW1lOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBpbnQgeHNpemUsIHlzaXplLCB6c2l6ZTsKKyAgICBjaGFyICpjZGF0YXA7CisgICAgbG9uZyAqaWRhdGFwOworICAgIHN0YXRpYyBzaG9ydCByc1s4MTkyXSwgZ3NbODE5Ml0sIGJzWzgxOTJdOworICAgIGludCB4LCB5OworICAgIElNQUdFICppbWFnZTsKKyAgICBpbnQgeWZpcnN0LCB5bGFzdCwgeXN0ZXA7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnJlYWQiLCAmZm5hbWUpICkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgCi0JaWYgKCAoaW1hZ2UgPSBpbWdmaWxlX29wZW4oZm5hbWUpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgCi0JaWYgKCBpbWFnZS0+Y29sb3JtYXAgIT0gQ01fTk9STUFMICkgewotCQlpY2xvc2UoaW1hZ2UpOwotCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCSJDYW4gb25seSBoYW5kbGUgQ01fTk9STUFMIGltYWdlcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCBCUFAoaW1hZ2UtPnR5cGUpICE9IDEgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbid0IGhhbmRsZSBpbWdmaWxlcyB3aXRoIGJwcCE9MSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeHNpemUgPSBpbWFnZS0+eHNpemU7Ci0JeXNpemUgPSBpbWFnZS0+eXNpemU7Ci0JenNpemUgPSBpbWFnZS0+enNpemU7Ci0JaWYgKCB6c2l6ZSAhPSAxICYmIHpzaXplICE9IDMpIHsKLQkJaWNsb3NlKGltYWdlKTsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkiQ2FuIG9ubHkgaGFuZGxlIDEgb3IgMyBieXRlIHBpeGVscyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCB4c2l6ZSA+IDgxOTIgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbid0IGhhbmRsZSBpbWFnZSB3aXRoID4gODE5MiBjb2x1bW5zIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnJlYWQiLCAmZm5hbWUpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIHpzaXplID09IDMgKSB6c2l6ZSA9IDQ7Ci0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHhzaXplKnlzaXplKnpzaXplKTsKLQlpZiAoIHJ2ID09IE5VTEwgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljZGF0YXAgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JaWRhdGFwID0gKGxvbmcgKiljZGF0YXA7CisgICAgaWYgKCAoaW1hZ2UgPSBpbWdmaWxlX29wZW4oZm5hbWUpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodG9wX3RvX2JvdHRvbSkgewotCQl5Zmlyc3QgPSB5c2l6ZS0xOwotCQl5bGFzdCA9IC0xOwotCQl5c3RlcCA9IC0xOwotCX0gZWxzZSB7Ci0JCXlmaXJzdCA9IDA7Ci0JCXlsYXN0ID0geXNpemU7Ci0JCXlzdGVwID0gMTsKLQl9Ci0JZm9yICggeT15Zmlyc3Q7IHkgIT0geWxhc3QgJiYgIWVycm9yX2NhbGxlZDsgeSArPSB5c3RlcCApIHsKLQkJaWYgKCB6c2l6ZSA9PSAxICkgewotCQkJZ2V0cm93KGltYWdlLCBycywgeSwgMCk7Ci0JCQlmb3IoeD0wOyB4PHhzaXplOyB4KysgKQotCQkJCSpjZGF0YXArKyA9IHJzW3hdOwotCQl9IGVsc2UgewotCQkJZ2V0cm93KGltYWdlLCBycywgeSwgMCk7Ci0JCQlnZXRyb3coaW1hZ2UsIGdzLCB5LCAxKTsKLQkJCWdldHJvdyhpbWFnZSwgYnMsIHksIDIpOwotCQkJZm9yKHg9MDsgeDx4c2l6ZTsgeCsrICkKLQkJCQkqaWRhdGFwKysgPSAocnNbeF0gJiAweGZmKSAgfAotCQkJCQkoKGdzW3hdICYgMHhmZik8PDgpIHwKLQkJCQkJKChic1t4XSAmIDB4ZmYpPDwxNik7Ci0JCX0KLQl9Ci0JaWNsb3NlKGltYWdlKTsKLQlpZiAoIGVycm9yX2NhbGxlZCApIHsKLQkJUHlfREVDUkVGKHJ2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBydjsKKyAgICBpZiAoIGltYWdlLT5jb2xvcm1hcCAhPSBDTV9OT1JNQUwgKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG9ubHkgaGFuZGxlIENNX05PUk1BTCBpbWFnZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggQlBQKGltYWdlLT50eXBlKSAhPSAxICkgeworICAgICAgICBpY2xvc2UoaW1hZ2UpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGhhbmRsZSBpbWdmaWxlcyB3aXRoIGJwcCE9MSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgeHNpemUgPSBpbWFnZS0+eHNpemU7CisgICAgeXNpemUgPSBpbWFnZS0+eXNpemU7CisgICAgenNpemUgPSBpbWFnZS0+enNpemU7CisgICAgaWYgKCB6c2l6ZSAhPSAxICYmIHpzaXplICE9IDMpIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBoYW5kbGUgMSBvciAzIGJ5dGUgcGl4ZWxzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIHhzaXplID4gODE5MiApIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBoYW5kbGUgaW1hZ2Ugd2l0aCA+IDgxOTIgY29sdW1ucyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIHpzaXplID09IDMgKSB6c2l6ZSA9IDQ7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHhzaXplKnlzaXplKnpzaXplKTsKKyAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjZGF0YXAgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgaWRhdGFwID0gKGxvbmcgKiljZGF0YXA7CisKKyAgICBpZiAodG9wX3RvX2JvdHRvbSkgeworICAgICAgICB5Zmlyc3QgPSB5c2l6ZS0xOworICAgICAgICB5bGFzdCA9IC0xOworICAgICAgICB5c3RlcCA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHlmaXJzdCA9IDA7CisgICAgICAgIHlsYXN0ID0geXNpemU7CisgICAgICAgIHlzdGVwID0gMTsKKyAgICB9CisgICAgZm9yICggeT15Zmlyc3Q7IHkgIT0geWxhc3QgJiYgIWVycm9yX2NhbGxlZDsgeSArPSB5c3RlcCApIHsKKyAgICAgICAgaWYgKCB6c2l6ZSA9PSAxICkgeworICAgICAgICAgICAgZ2V0cm93KGltYWdlLCBycywgeSwgMCk7CisgICAgICAgICAgICBmb3IoeD0wOyB4PHhzaXplOyB4KysgKQorICAgICAgICAgICAgICAgICpjZGF0YXArKyA9IHJzW3hdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0cm93KGltYWdlLCBycywgeSwgMCk7CisgICAgICAgICAgICBnZXRyb3coaW1hZ2UsIGdzLCB5LCAxKTsKKyAgICAgICAgICAgIGdldHJvdyhpbWFnZSwgYnMsIHksIDIpOworICAgICAgICAgICAgZm9yKHg9MDsgeDx4c2l6ZTsgeCsrICkKKyAgICAgICAgICAgICAgICAqaWRhdGFwKysgPSAocnNbeF0gJiAweGZmKSAgfAorICAgICAgICAgICAgICAgICAgICAoKGdzW3hdICYgMHhmZik8PDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKChic1t4XSAmIDB4ZmYpPDwxNik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWNsb3NlKGltYWdlKTsKKyAgICBpZiAoIGVycm9yX2NhbGxlZCApIHsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIElNQUdFICpnbG9iX2ltYWdlOwpAQCAtMTc3LDMzMiArMTc3LDMzMiBAQAogc3RhdGljIHZvaWQKIHhzX2dldChzaG9ydCAqYnVmLCBpbnQgeSkKIHsKLQlpZiAodG9wX3RvX2JvdHRvbSkKLQkJZ2V0cm93KGdsb2JfaW1hZ2UsIGJ1ZiwgKGdsb2JfeXNpemUtMS15KSwgZ2xvYl96KTsKLQllbHNlCi0JCWdldHJvdyhnbG9iX2ltYWdlLCBidWYsIHksIGdsb2Jfeik7CisgICAgaWYgKHRvcF90b19ib3R0b20pCisgICAgICAgIGdldHJvdyhnbG9iX2ltYWdlLCBidWYsIChnbG9iX3lzaXplLTEteSksIGdsb2Jfeik7CisgICAgZWxzZQorICAgICAgICBnZXRyb3coZ2xvYl9pbWFnZSwgYnVmLCB5LCBnbG9iX3opOwogfQogCiBzdGF0aWMgdm9pZAogeHNfcHV0X2Moc2hvcnQgKmJ1ZiwgaW50IHkpCiB7Ci0JY2hhciAqZGF0YXAgPSAoY2hhciAqKWdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7Ci0JaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKKyAgICBjaGFyICpkYXRhcCA9IChjaGFyICopZ2xvYl9kYXRhcCArIHkqZ2xvYl93aWR0aDsKKyAgICBpbnQgd2lkdGggPSBnbG9iX3dpZHRoOwogCi0Jd2hpbGUgKCB3aWR0aC0tICkKLQkJKmRhdGFwKysgPSAoKmJ1ZisrKSAmIDB4ZmY7CisgICAgd2hpbGUgKCB3aWR0aC0tICkKKyAgICAgICAgKmRhdGFwKysgPSAoKmJ1ZisrKSAmIDB4ZmY7CiB9CiAKIHN0YXRpYyB2b2lkCiB4c19wdXRfMChzaG9ydCAqYnVmLCBpbnQgeSkKIHsKLQlsb25nICpkYXRhcCA9IGdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7Ci0JaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKKyAgICBsb25nICpkYXRhcCA9IGdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7CisgICAgaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKIAotCXdoaWxlICggd2lkdGgtLSApCi0JCSpkYXRhcCsrID0gKCpidWYrKykgJiAweGZmOworICAgIHdoaWxlICggd2lkdGgtLSApCisgICAgICAgICpkYXRhcCsrID0gKCpidWYrKykgJiAweGZmOwogfQogc3RhdGljIHZvaWQKIHhzX3B1dF8xMihzaG9ydCAqYnVmLCBpbnQgeSkKIHsKLQlsb25nICpkYXRhcCA9IGdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7Ci0JaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKKyAgICBsb25nICpkYXRhcCA9IGdsb2JfZGF0YXAgKyB5Kmdsb2Jfd2lkdGg7CisgICAgaW50IHdpZHRoID0gZ2xvYl93aWR0aDsKIAotCXdoaWxlICggd2lkdGgtLSApCi0JCSpkYXRhcCsrIHw9ICgoKmJ1ZisrKSAmIDB4ZmYpIDw8IChnbG9iX3oqOCk7CisgICAgd2hpbGUgKCB3aWR0aC0tICkKKyAgICAgICAgKmRhdGFwKysgfD0gKCgqYnVmKyspICYgMHhmZikgPDwgKGdsb2Jfeio4KTsKIH0KIAogc3RhdGljIHZvaWQKIHhzY2FsZShJTUFHRSAqaW1hZ2UsIGludCB4c2l6ZSwgaW50IHlzaXplLCBpbnQgenNpemUsCiAgICAgICAgbG9uZyAqZGF0YXAsIGludCB4bmV3LCBpbnQgeW5ldywgaW50IGZtb2RlLCBkb3VibGUgYmx1cikKIHsKLQlnbG9iX2ltYWdlID0gaW1hZ2U7Ci0JZ2xvYl9kYXRhcCA9IGRhdGFwOwotCWdsb2Jfd2lkdGggPSB4bmV3OwotCWdsb2JfeXNpemUgPSB5c2l6ZTsKLQlpZiAoIHpzaXplID09IDEgKSB7Ci0JCWdsb2JfeiA9IDA7Ci0JCWZpbHRlcnpvb20oeHNfZ2V0LCB4c19wdXRfYywgeHNpemUsIHlzaXplLAotCQkJICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOwotCX0gZWxzZSB7Ci0JCWdsb2JfeiA9IDA7Ci0JCWZpbHRlcnpvb20oeHNfZ2V0LCB4c19wdXRfMCwgeHNpemUsIHlzaXplLAotCQkJICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOwotCQlnbG9iX3ogPSAxOwotCQlmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0XzEyLCB4c2l6ZSwgeXNpemUsCi0JCQkgICB4bmV3LCB5bmV3LCBmbW9kZSwgYmx1cik7Ci0JCWdsb2JfeiA9IDI7Ci0JCWZpbHRlcnpvb20oeHNfZ2V0LCB4c19wdXRfMTIsIHhzaXplLCB5c2l6ZSwKLQkJCSAgIHhuZXcsIHluZXcsIGZtb2RlLCBibHVyKTsKLQl9CisgICAgZ2xvYl9pbWFnZSA9IGltYWdlOworICAgIGdsb2JfZGF0YXAgPSBkYXRhcDsKKyAgICBnbG9iX3dpZHRoID0geG5ldzsKKyAgICBnbG9iX3lzaXplID0geXNpemU7CisgICAgaWYgKCB6c2l6ZSA9PSAxICkgeworICAgICAgICBnbG9iX3ogPSAwOworICAgICAgICBmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0X2MsIHhzaXplLCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICB4bmV3LCB5bmV3LCBmbW9kZSwgYmx1cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ2xvYl96ID0gMDsKKyAgICAgICAgZmlsdGVyem9vbSh4c19nZXQsIHhzX3B1dF8wLCB4c2l6ZSwgeXNpemUsCisgICAgICAgICAgICAgICAgICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOworICAgICAgICBnbG9iX3ogPSAxOworICAgICAgICBmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0XzEyLCB4c2l6ZSwgeXNpemUsCisgICAgICAgICAgICAgICAgICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOworICAgICAgICBnbG9iX3ogPSAyOworICAgICAgICBmaWx0ZXJ6b29tKHhzX2dldCwgeHNfcHV0XzEyLCB4c2l6ZSwgeXNpemUsCisgICAgICAgICAgICAgICAgICAgeG5ldywgeW5ldywgZm1vZGUsIGJsdXIpOworICAgIH0KIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1nZmlsZV9yZWFkc2NhbGVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpmbmFtZTsKLQlQeU9iamVjdCAqcnY7Ci0JaW50IHhzaXplLCB5c2l6ZSwgenNpemU7Ci0JY2hhciAqY2RhdGFwOwotCWxvbmcgKmlkYXRhcDsKLQlzdGF0aWMgc2hvcnQgcnNbODE5Ml0sIGdzWzgxOTJdLCBic1s4MTkyXTsKLQlpbnQgeCwgeTsKLQlpbnQgeHd0ZCwgeXd0ZCwgeG9yaWcsIHlvcmlnOwotCWZsb2F0IHhmYWMsIHlmYWM7Ci0JSU1BR0UgKmltYWdlOwotCWNoYXIgKmZpbHRlcjsKLQlkb3VibGUgYmx1ciA9IDEuMDsKLQlpbnQgZXh0ZW5kZWQ7Ci0JaW50IGZtb2RlID0gMDsKLQlpbnQgeWZpcnN0LCB5bGFzdCwgeXN0ZXA7CisgICAgY2hhciAqZm5hbWU7CisgICAgUHlPYmplY3QgKnJ2OworICAgIGludCB4c2l6ZSwgeXNpemUsIHpzaXplOworICAgIGNoYXIgKmNkYXRhcDsKKyAgICBsb25nICppZGF0YXA7CisgICAgc3RhdGljIHNob3J0IHJzWzgxOTJdLCBnc1s4MTkyXSwgYnNbODE5Ml07CisgICAgaW50IHgsIHk7CisgICAgaW50IHh3dGQsIHl3dGQsIHhvcmlnLCB5b3JpZzsKKyAgICBmbG9hdCB4ZmFjLCB5ZmFjOworICAgIElNQUdFICppbWFnZTsKKyAgICBjaGFyICpmaWx0ZXI7CisgICAgZG91YmxlIGJsdXIgPSAxLjA7CisgICAgaW50IGV4dGVuZGVkOworICAgIGludCBmbW9kZSA9IDA7CisgICAgaW50IHlmaXJzdCwgeWxhc3QsIHlzdGVwOwogCi0JLyoKLQkqKiBQYXJzZSBhcmdzLiBGdW5ueSwgc2luY2UgYXJnIDQgYW5kIDUgYXJlIG9wdGlvbmFsCi0JKiogKGZpbHRlciBuYW1lIGFuZCBibHVyIGZhY3RvcikuIEFsc28sIDQgb3IgNSBhcmd1bWVudHMgaW5kaWNhdGVzCi0JKiogZXh0ZW5kZWQgc2NhbGUgYWxnb3JpdGhtIGluIHN0ZWFkIG9mIHNpbXBsZS1taW5kZWQgcGl4ZWwgZHJvcC9kdXAuCi0JKi8KLQlleHRlbmRlZCA9IFB5VHVwbGVfU2l6ZShhcmdzKSA+PSA0OwotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpaXxzZCIsCi0JCQkgICAgICAgJmZuYW1lLCAmeHd0ZCwgJnl3dGQsICZmaWx0ZXIsICZibHVyKSApCi0JCXJldHVybiBOVUxMOworICAgIC8qCisgICAgKiogUGFyc2UgYXJncy4gRnVubnksIHNpbmNlIGFyZyA0IGFuZCA1IGFyZSBvcHRpb25hbAorICAgICoqIChmaWx0ZXIgbmFtZSBhbmQgYmx1ciBmYWN0b3IpLiBBbHNvLCA0IG9yIDUgYXJndW1lbnRzIGluZGljYXRlcworICAgICoqIGV4dGVuZGVkIHNjYWxlIGFsZ29yaXRobSBpbiBzdGVhZCBvZiBzaW1wbGUtbWluZGVkIHBpeGVsIGRyb3AvZHVwLgorICAgICovCisgICAgZXh0ZW5kZWQgPSBQeVR1cGxlX1NpemUoYXJncykgPj0gNDsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaWl8c2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZuYW1lLCAmeHd0ZCwgJnl3dGQsICZmaWx0ZXIsICZibHVyKSApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyoKLQkqKiBDaGVjayBwYXJhbWV0ZXJzLCBvcGVuIGZpbGUgYW5kIGNoZWNrIHR5cGUsIHJvd3MsIGV0Yy4KLQkqLwotCWlmICggZXh0ZW5kZWQgKSB7Ci0JCWlmICggc3RyY21wKGZpbHRlciwgImltcHVsc2UiKSA9PSAwICkKLQkJCWZtb2RlID0gSU1QVUxTRTsKLQkJZWxzZSBpZiAoIHN0cmNtcCggZmlsdGVyLCAiYm94IikgPT0gMCApCi0JCQlmbW9kZSA9IEJPWDsKLQkJZWxzZSBpZiAoIHN0cmNtcCggZmlsdGVyLCAidHJpYW5nbGUiKSA9PSAwICkKLQkJCWZtb2RlID0gVFJJQU5HTEU7Ci0JCWVsc2UgaWYgKCBzdHJjbXAoIGZpbHRlciwgInF1YWRyYXRpYyIpID09IDAgKQotCQkJZm1vZGUgPSBRVUFEUkFUSUM7Ci0JCWVsc2UgaWYgKCBzdHJjbXAoIGZpbHRlciwgImdhdXNzaWFuIikgPT0gMCApCi0JCQlmbW9kZSA9IEdBVVNTSUFOOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsICJVbmtub3duIGZpbHRlciB0eXBlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLSAgICAKLQlpZiAoIChpbWFnZSA9IGltZ2ZpbGVfb3BlbihmbmFtZSkpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLSAgICAKLQlpZiAoIGltYWdlLT5jb2xvcm1hcCAhPSBDTV9OT1JNQUwgKSB7Ci0JCWljbG9zZShpbWFnZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbiBvbmx5IGhhbmRsZSBDTV9OT1JNQUwgaW1hZ2VzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIEJQUChpbWFnZS0+dHlwZSkgIT0gMSApIHsKLQkJaWNsb3NlKGltYWdlKTsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkiQ2FuJ3QgaGFuZGxlIGltZ2ZpbGVzIHdpdGggYnBwIT0xIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl4c2l6ZSA9IGltYWdlLT54c2l6ZTsKLQl5c2l6ZSA9IGltYWdlLT55c2l6ZTsKLQl6c2l6ZSA9IGltYWdlLT56c2l6ZTsKLQlpZiAoIHpzaXplICE9IDEgJiYgenNpemUgIT0gMykgewotCQlpY2xvc2UoaW1hZ2UpOwotCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCSJDYW4gb25seSBoYW5kbGUgMSBvciAzIGJ5dGUgcGl4ZWxzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIHhzaXplID4gODE5MiApIHsKLQkJaWNsb3NlKGltYWdlKTsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkiQ2FuJ3QgaGFuZGxlIGltYWdlIHdpdGggPiA4MTkyIGNvbHVtbnMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qCisgICAgKiogQ2hlY2sgcGFyYW1ldGVycywgb3BlbiBmaWxlIGFuZCBjaGVjayB0eXBlLCByb3dzLCBldGMuCisgICAgKi8KKyAgICBpZiAoIGV4dGVuZGVkICkgeworICAgICAgICBpZiAoIHN0cmNtcChmaWx0ZXIsICJpbXB1bHNlIikgPT0gMCApCisgICAgICAgICAgICBmbW9kZSA9IElNUFVMU0U7CisgICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoIGZpbHRlciwgImJveCIpID09IDAgKQorICAgICAgICAgICAgZm1vZGUgPSBCT1g7CisgICAgICAgIGVsc2UgaWYgKCBzdHJjbXAoIGZpbHRlciwgInRyaWFuZ2xlIikgPT0gMCApCisgICAgICAgICAgICBmbW9kZSA9IFRSSUFOR0xFOworICAgICAgICBlbHNlIGlmICggc3RyY21wKCBmaWx0ZXIsICJxdWFkcmF0aWMiKSA9PSAwICkKKyAgICAgICAgICAgIGZtb2RlID0gUVVBRFJBVElDOworICAgICAgICBlbHNlIGlmICggc3RyY21wKCBmaWx0ZXIsICJnYXVzc2lhbiIpID09IDAgKQorICAgICAgICAgICAgZm1vZGUgPSBHQVVTU0lBTjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLCAiVW5rbm93biBmaWx0ZXIgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoIHpzaXplID09IDMgKSB6c2l6ZSA9IDQ7Ci0JcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCB4d3RkKnl3dGQqenNpemUpOwotCWlmICggcnYgPT0gTlVMTCApIHsKLQkJaWNsb3NlKGltYWdlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RlBFX1NUQVJUX1BST1RFQ1QoInJlYWRzY2FsZWQiLCByZXR1cm4gMCkKLQl4ZmFjID0gKGZsb2F0KXhzaXplLyhmbG9hdCl4d3RkOwotCXlmYWMgPSAoZmxvYXQpeXNpemUvKGZsb2F0KXl3dGQ7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoeWZhYykKLQljZGF0YXAgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JaWRhdGFwID0gKGxvbmcgKiljZGF0YXA7CisgICAgaWYgKCAoaW1hZ2UgPSBpbWdmaWxlX29wZW4oZm5hbWUpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIGV4dGVuZGVkICkgewotCQl4c2NhbGUoaW1hZ2UsIHhzaXplLCB5c2l6ZSwgenNpemUsCi0JCSAgICAgICBpZGF0YXAsIHh3dGQsIHl3dGQsIGZtb2RlLCBibHVyKTsKLQl9IGVsc2UgewotCQlpZiAodG9wX3RvX2JvdHRvbSkgewotCQkJeWZpcnN0ID0geXd0ZC0xOwotCQkJeWxhc3QgPSAtMTsKLQkJCXlzdGVwID0gLTE7Ci0JCX0gZWxzZSB7Ci0JCQl5Zmlyc3QgPSAwOwotCQkJeWxhc3QgPSB5d3RkOwotCQkJeXN0ZXAgPSAxOwotCQl9Ci0JCWZvciAoIHk9eWZpcnN0OyB5ICE9IHlsYXN0ICYmICFlcnJvcl9jYWxsZWQ7IHkgKz0geXN0ZXAgKSB7Ci0JCQl5b3JpZyA9IChpbnQpKHkqeWZhYyk7Ci0JCQlpZiAoIHpzaXplID09IDEgKSB7Ci0JCQkJZ2V0cm93KGltYWdlLCBycywgeW9yaWcsIDApOwotCQkJCWZvcih4PTA7IHg8eHd0ZDsgeCsrICkgewotCQkJCQkqY2RhdGFwKysgPSByc1soaW50KSh4KnhmYWMpXTsJCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlnZXRyb3coaW1hZ2UsIHJzLCB5b3JpZywgMCk7Ci0JCQkJZ2V0cm93KGltYWdlLCBncywgeW9yaWcsIDEpOwotCQkJCWdldHJvdyhpbWFnZSwgYnMsIHlvcmlnLCAyKTsKLQkJCQlmb3IoeD0wOyB4PHh3dGQ7IHgrKyApIHsKLQkJCQkJeG9yaWcgPSAoaW50KSh4KnhmYWMpOwotCQkJCQkqaWRhdGFwKysgPSAocnNbeG9yaWddICYgMHhmZikgIHwKLQkJCQkJCSgoZ3NbeG9yaWddICYgMHhmZik8PDgpIHwKLQkJCQkJCSgoYnNbeG9yaWddICYgMHhmZik8PDE2KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JaWNsb3NlKGltYWdlKTsKLQlpZiAoIGVycm9yX2NhbGxlZCApIHsKLQkJUHlfREVDUkVGKHJ2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBydjsKKyAgICBpZiAoIGltYWdlLT5jb2xvcm1hcCAhPSBDTV9OT1JNQUwgKSB7CisgICAgICAgIGljbG9zZShpbWFnZSk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG9ubHkgaGFuZGxlIENNX05PUk1BTCBpbWFnZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggQlBQKGltYWdlLT50eXBlKSAhPSAxICkgeworICAgICAgICBpY2xvc2UoaW1hZ2UpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGhhbmRsZSBpbWdmaWxlcyB3aXRoIGJwcCE9MSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgeHNpemUgPSBpbWFnZS0+eHNpemU7CisgICAgeXNpemUgPSBpbWFnZS0+eXNpemU7CisgICAgenNpemUgPSBpbWFnZS0+enNpemU7CisgICAgaWYgKCB6c2l6ZSAhPSAxICYmIHpzaXplICE9IDMpIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBoYW5kbGUgMSBvciAzIGJ5dGUgcGl4ZWxzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIHhzaXplID4gODE5MiApIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBoYW5kbGUgaW1hZ2Ugd2l0aCA+IDgxOTIgY29sdW1ucyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIHpzaXplID09IDMgKSB6c2l6ZSA9IDQ7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCB4d3RkKnl3dGQqenNpemUpOworICAgIGlmICggcnYgPT0gTlVMTCApIHsKKyAgICAgICAgaWNsb3NlKGltYWdlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoInJlYWRzY2FsZWQiLCByZXR1cm4gMCkKKyAgICB4ZmFjID0gKGZsb2F0KXhzaXplLyhmbG9hdCl4d3RkOworICAgIHlmYWMgPSAoZmxvYXQpeXNpemUvKGZsb2F0KXl3dGQ7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoeWZhYykKKyAgICBjZGF0YXAgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7CisgICAgaWRhdGFwID0gKGxvbmcgKiljZGF0YXA7CisKKyAgICBpZiAoIGV4dGVuZGVkICkgeworICAgICAgICB4c2NhbGUoaW1hZ2UsIHhzaXplLCB5c2l6ZSwgenNpemUsCisgICAgICAgICAgICAgICBpZGF0YXAsIHh3dGQsIHl3dGQsIGZtb2RlLCBibHVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodG9wX3RvX2JvdHRvbSkgeworICAgICAgICAgICAgeWZpcnN0ID0geXd0ZC0xOworICAgICAgICAgICAgeWxhc3QgPSAtMTsKKyAgICAgICAgICAgIHlzdGVwID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB5Zmlyc3QgPSAwOworICAgICAgICAgICAgeWxhc3QgPSB5d3RkOworICAgICAgICAgICAgeXN0ZXAgPSAxOworICAgICAgICB9CisgICAgICAgIGZvciAoIHk9eWZpcnN0OyB5ICE9IHlsYXN0ICYmICFlcnJvcl9jYWxsZWQ7IHkgKz0geXN0ZXAgKSB7CisgICAgICAgICAgICB5b3JpZyA9IChpbnQpKHkqeWZhYyk7CisgICAgICAgICAgICBpZiAoIHpzaXplID09IDEgKSB7CisgICAgICAgICAgICAgICAgZ2V0cm93KGltYWdlLCBycywgeW9yaWcsIDApOworICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8eHd0ZDsgeCsrICkgeworICAgICAgICAgICAgICAgICAgICAqY2RhdGFwKysgPSByc1soaW50KSh4KnhmYWMpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdldHJvdyhpbWFnZSwgcnMsIHlvcmlnLCAwKTsKKyAgICAgICAgICAgICAgICBnZXRyb3coaW1hZ2UsIGdzLCB5b3JpZywgMSk7CisgICAgICAgICAgICAgICAgZ2V0cm93KGltYWdlLCBicywgeW9yaWcsIDIpOworICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8eHd0ZDsgeCsrICkgeworICAgICAgICAgICAgICAgICAgICB4b3JpZyA9IChpbnQpKHgqeGZhYyk7CisgICAgICAgICAgICAgICAgICAgICppZGF0YXArKyA9IChyc1t4b3JpZ10gJiAweGZmKSAgfAorICAgICAgICAgICAgICAgICAgICAgICAgKChnc1t4b3JpZ10gJiAweGZmKTw8OCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKChic1t4b3JpZ10gJiAweGZmKTw8MTYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpY2xvc2UoaW1hZ2UpOworICAgIGlmICggZXJyb3JfY2FsbGVkICkgeworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1nZmlsZV9nZXRzaXplcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZm5hbWU7Ci0JUHlPYmplY3QgKnJ2OwotCUlNQUdFICppbWFnZTsKLSAgICAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldHNpemVzIiwgJmZuYW1lKSApCi0JCXJldHVybiBOVUxMOwotICAgIAotCWlmICggKGltYWdlID0gaW1nZmlsZV9vcGVuKGZuYW1lKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLCBpbWFnZS0+eHNpemUsIGltYWdlLT55c2l6ZSwgaW1hZ2UtPnpzaXplKTsKLQlpY2xvc2UoaW1hZ2UpOwotCXJldHVybiBydjsKKyAgICBjaGFyICpmbmFtZTsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgSU1BR0UgKmltYWdlOworCisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRzaXplcyIsICZmbmFtZSkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICggKGltYWdlID0gaW1nZmlsZV9vcGVuKGZuYW1lKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gUHlfQnVpbGRWYWx1ZSgiKGlpaSkiLCBpbWFnZS0+eHNpemUsIGltYWdlLT55c2l6ZSwgaW1hZ2UtPnpzaXplKTsKKyAgICBpY2xvc2UoaW1hZ2UpOworICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltZ2ZpbGVfd3JpdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUlNQUdFICppbWFnZTsKLQljaGFyICpmbmFtZTsKLQlpbnQgeHNpemUsIHlzaXplLCB6c2l6ZSwgbGVuOwotCWNoYXIgKmNkYXRhcDsKLQlsb25nICppZGF0YXA7Ci0Jc2hvcnQgcnNbODE5Ml0sIGdzWzgxOTJdLCBic1s4MTkyXTsKLQlzaG9ydCByLCBnLCBiOwotCWxvbmcgcmdiOwotCWludCB4LCB5OwotCWludCB5Zmlyc3QsIHlsYXN0LCB5c3RlcDsKKyAgICBJTUFHRSAqaW1hZ2U7CisgICAgY2hhciAqZm5hbWU7CisgICAgaW50IHhzaXplLCB5c2l6ZSwgenNpemUsIGxlbjsKKyAgICBjaGFyICpjZGF0YXA7CisgICAgbG9uZyAqaWRhdGFwOworICAgIHNob3J0IHJzWzgxOTJdLCBnc1s4MTkyXSwgYnNbODE5Ml07CisgICAgc2hvcnQgciwgZywgYjsKKyAgICBsb25nIHJnYjsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgeWZpcnN0LCB5bGFzdCwgeXN0ZXA7CiAKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzI2lpaTp3cml0ZSIsCi0JCQkgICZmbmFtZSwgJmNkYXRhcCwgJmxlbiwgJnhzaXplLCAmeXNpemUsICZ6c2l6ZSkgKQotCQlyZXR1cm4gTlVMTDsKLSAgICAKLQlpZiAoIHpzaXplICE9IDEgJiYgenNpemUgIT0gMyApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwKLQkJCQkiQ2FuIG9ubHkgaGFuZGxlIDEgb3IgMyBieXRlIHBpeGVscyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCBsZW4gIT0geHNpemUgKiB5c2l6ZSAqICh6c2l6ZSA9PSAxID8gMSA6IDQpICkgewotCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLCAiRGF0YSBkb2VzIG5vdCBtYXRjaCBzaXplcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCB4c2l6ZSA+IDgxOTIgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhJbWdmaWxlRXJyb3IsCi0JCQkJIkNhbid0IGhhbmRsZSBpbWFnZSB3aXRoID4gODE5MiBjb2x1bW5zIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzcyNpaWk6d3JpdGUiLAorICAgICAgICAgICAgICAgICAgICAgICZmbmFtZSwgJmNkYXRhcCwgJmxlbiwgJnhzaXplLCAmeXNpemUsICZ6c2l6ZSkgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm9yX2NhbGxlZCA9IDA7Ci0JZXJybm8gPSAwOwotCWltYWdlID1pb3BlbihmbmFtZSwgInciLCBSTEUoMSksIDMsIHhzaXplLCB5c2l6ZSwgenNpemUpOwotCWlmICggaW1hZ2UgPT0gMCApIHsKLQkJaWYgKCAhIGVycm9yX2NhbGxlZCApIHsKLQkJCWlmIChlcnJubykKLQkJCQlQeUVycl9TZXRGcm9tRXJybm8oSW1nZmlsZUVycm9yKTsKLQkJCWVsc2UKLQkJCQlQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAotCQkJCQkJIkNhbid0IGNyZWF0ZSBpbWFnZSBmaWxlIik7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICggenNpemUgIT0gMSAmJiB6c2l6ZSAhPSAzICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbiBvbmx5IGhhbmRsZSAxIG9yIDMgYnl0ZSBwaXhlbHMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggbGVuICE9IHhzaXplICogeXNpemUgKiAoenNpemUgPT0gMSA/IDEgOiA0KSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEltZ2ZpbGVFcnJvciwgIkRhdGEgZG9lcyBub3QgbWF0Y2ggc2l6ZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggeHNpemUgPiA4MTkyICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGhhbmRsZSBpbWFnZSB3aXRoID4gODE5MiBjb2x1bW5zIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlkYXRhcCA9IChsb25nICopY2RhdGFwOwotICAgIAotCWlmICh0b3BfdG9fYm90dG9tKSB7Ci0JCXlmaXJzdCA9IHlzaXplLTE7Ci0JCXlsYXN0ID0gLTE7Ci0JCXlzdGVwID0gLTE7Ci0JfSBlbHNlIHsKLQkJeWZpcnN0ID0gMDsKLQkJeWxhc3QgPSB5c2l6ZTsKLQkJeXN0ZXAgPSAxOwotCX0KLQlmb3IgKCB5PXlmaXJzdDsgeSAhPSB5bGFzdCAmJiAhZXJyb3JfY2FsbGVkOyB5ICs9IHlzdGVwICkgewotCQlpZiAoIHpzaXplID09IDEgKSB7Ci0JCQlmb3IoIHg9MDsgeDx4c2l6ZTsgeCsrICkKLQkJCQlyc1t4XSA9ICpjZGF0YXArKzsKLQkJCXB1dHJvdyhpbWFnZSwgcnMsIHksIDApOwotCQl9IGVsc2UgewotCQkJZm9yKCB4PTA7IHg8eHNpemU7IHgrKyApIHsKLQkJCQlyZ2IgPSAqaWRhdGFwKys7Ci0JCQkJciA9IHJnYiAmIDB4ZmY7Ci0JCQkJZyA9IChyZ2IgPj4gOCApICYgMHhmZjsKLQkJCQliID0gKHJnYiA+PiAxNiApICYgMHhmZjsKLQkJCQlyc1t4XSA9IHI7Ci0JCQkJZ3NbeF0gPSBnOwotCQkJCWJzW3hdID0gYjsKLQkJCX0KLQkJCXB1dHJvdyhpbWFnZSwgcnMsIHksIDApOwotCQkJcHV0cm93KGltYWdlLCBncywgeSwgMSk7Ci0JCQlwdXRyb3coaW1hZ2UsIGJzLCB5LCAyKTsKLQkJfQotCX0KLQlpY2xvc2UoaW1hZ2UpOwotCWlmICggZXJyb3JfY2FsbGVkICkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOwotICAgIAorICAgIGVycm9yX2NhbGxlZCA9IDA7CisgICAgZXJybm8gPSAwOworICAgIGltYWdlID1pb3BlbihmbmFtZSwgInciLCBSTEUoMSksIDMsIHhzaXplLCB5c2l6ZSwgenNpemUpOworICAgIGlmICggaW1hZ2UgPT0gMCApIHsKKyAgICAgICAgaWYgKCAhIGVycm9yX2NhbGxlZCApIHsKKyAgICAgICAgICAgIGlmIChlcnJubykKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oSW1nZmlsZUVycm9yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW1nZmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgY3JlYXRlIGltYWdlIGZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZGF0YXAgPSAobG9uZyAqKWNkYXRhcDsKKworICAgIGlmICh0b3BfdG9fYm90dG9tKSB7CisgICAgICAgIHlmaXJzdCA9IHlzaXplLTE7CisgICAgICAgIHlsYXN0ID0gLTE7CisgICAgICAgIHlzdGVwID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgeWZpcnN0ID0gMDsKKyAgICAgICAgeWxhc3QgPSB5c2l6ZTsKKyAgICAgICAgeXN0ZXAgPSAxOworICAgIH0KKyAgICBmb3IgKCB5PXlmaXJzdDsgeSAhPSB5bGFzdCAmJiAhZXJyb3JfY2FsbGVkOyB5ICs9IHlzdGVwICkgeworICAgICAgICBpZiAoIHpzaXplID09IDEgKSB7CisgICAgICAgICAgICBmb3IoIHg9MDsgeDx4c2l6ZTsgeCsrICkKKyAgICAgICAgICAgICAgICByc1t4XSA9ICpjZGF0YXArKzsKKyAgICAgICAgICAgIHB1dHJvdyhpbWFnZSwgcnMsIHksIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yKCB4PTA7IHg8eHNpemU7IHgrKyApIHsKKyAgICAgICAgICAgICAgICByZ2IgPSAqaWRhdGFwKys7CisgICAgICAgICAgICAgICAgciA9IHJnYiAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZyA9IChyZ2IgPj4gOCApICYgMHhmZjsKKyAgICAgICAgICAgICAgICBiID0gKHJnYiA+PiAxNiApICYgMHhmZjsKKyAgICAgICAgICAgICAgICByc1t4XSA9IHI7CisgICAgICAgICAgICAgICAgZ3NbeF0gPSBnOworICAgICAgICAgICAgICAgIGJzW3hdID0gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1dHJvdyhpbWFnZSwgcnMsIHksIDApOworICAgICAgICAgICAgcHV0cm93KGltYWdlLCBncywgeSwgMSk7CisgICAgICAgICAgICBwdXRyb3coaW1hZ2UsIGJzLCB5LCAyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpY2xvc2UoaW1hZ2UpOworICAgIGlmICggZXJyb3JfY2FsbGVkICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworCiB9CiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIGltZ2ZpbGVfbWV0aG9kc1tdID0gewotCXsgImdldHNpemVzIiwJaW1nZmlsZV9nZXRzaXplcywgTUVUSF9WQVJBUkdTIH0sCi0JeyAicmVhZCIsCWltZ2ZpbGVfcmVhZCwgTUVUSF9WQVJBUkdTIH0sCi0JeyAicmVhZHNjYWxlZCIsCWltZ2ZpbGVfcmVhZHNjYWxlZCwgTUVUSF9WQVJBUkdTfSwKLQl7ICJ3cml0ZSIsCWltZ2ZpbGVfd3JpdGUsIE1FVEhfVkFSQVJHUyB9LAotCXsgInR0b2IiLAlpbWdmaWxlX3R0b2IsIE1FVEhfVkFSQVJHUyB9LAotCXsgTlVMTCwJCU5VTEwgfSAvKiBTZW50aW5lbCAqLworICAgIHsgImdldHNpemVzIiwgICAgICAgaW1nZmlsZV9nZXRzaXplcywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAicmVhZCIsICAgICAgICAgICBpbWdmaWxlX3JlYWQsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgInJlYWRzY2FsZWQiLCAgICAgaW1nZmlsZV9yZWFkc2NhbGVkLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsgIndyaXRlIiwgICAgICAgICAgaW1nZmlsZV93cml0ZSwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAidHRvYiIsICAgICAgICAgICBpbWdmaWxlX3R0b2IsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgTlVMTCwgICAgICAgICAgICAgTlVMTCB9IC8qIFNlbnRpbmVsICovCiB9OwogCiAKIHZvaWQKIGluaXRpbWdmaWxlKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygidGhlIGltZ2ZpbGUgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgotCSAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKLQkgICAgcmV0dXJuOwotCQotCW0gPSBQeV9Jbml0TW9kdWxlKCJpbWdmaWxlIiwgaW1nZmlsZV9tZXRob2RzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JSW1nZmlsZUVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJpbWdmaWxlLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JaWYgKEltZ2ZpbGVFcnJvciAhPSBOVUxMKQotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBJbWdmaWxlRXJyb3IpOworICAgIFB5T2JqZWN0ICptLCAqZDsKKworICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIGltZ2ZpbGUgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIDMuMCIsIDIpIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbSA9IFB5X0luaXRNb2R1bGUoImltZ2ZpbGUiLCBpbWdmaWxlX21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBJbWdmaWxlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImltZ2ZpbGUuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoSW1nZmlsZUVycm9yICE9IE5VTEwpCisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEltZ2ZpbGVFcnJvcik7CiB9CiAKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYyBiL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKaW5kZXggNWYxYjE2Ny4uOTFiNDgyZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYworKysgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCi0vKiBJdGVydG9vbHMgbW9kdWxlIHdyaXR0ZW4gYW5kIG1haW50YWluZWQgCisvKiBJdGVydG9vbHMgbW9kdWxlIHdyaXR0ZW4gYW5kIG1haW50YWluZWQKICAgIGJ5IFJheW1vbmQgRC4gSGV0dGluZ2VyIDxweXRob25AcmNuLmNvbT4KICAgIENvcHlyaWdodCAoYykgMjAwMyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC0xMiwxMiArMTIsMTIgQEAKIC8qIGdyb3VwYnkgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICppdDsKLQlQeU9iamVjdCAqa2V5ZnVuYzsKLQlQeU9iamVjdCAqdGd0a2V5OwotCVB5T2JqZWN0ICpjdXJya2V5OwotCVB5T2JqZWN0ICpjdXJydmFsdWU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqa2V5ZnVuYzsKKyAgICBQeU9iamVjdCAqdGd0a2V5OworICAgIFB5T2JqZWN0ICpjdXJya2V5OworICAgIFB5T2JqZWN0ICpjdXJydmFsdWU7CiB9IGdyb3VwYnlvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZ3JvdXBieV90eXBlOwpAQCAtMjYsMTEyICsyNiwxMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBncm91cGJ5X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgImtleSIsIE5VTEx9OwotCWdyb3VwYnlvYmplY3QgKmdibzsKLSAJUHlPYmplY3QgKml0LCAqa2V5ZnVuYyA9IFB5X05vbmU7Ci0gCi0gCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86Z3JvdXBieSIsIGt3YXJncywKLQkJCQkJICZpdCwgJmtleWZ1bmMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgImtleSIsIE5VTEx9OworICAgIGdyb3VwYnlvYmplY3QgKmdibzsKKyAgICBQeU9iamVjdCAqaXQsICprZXlmdW5jID0gUHlfTm9uZTsKIAotCWdibyA9IChncm91cGJ5b2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGdibyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlnYm8tPnRndGtleSA9IE5VTEw7Ci0JZ2JvLT5jdXJya2V5ID0gTlVMTDsKLQlnYm8tPmN1cnJ2YWx1ZSA9IE5VTEw7Ci0JZ2JvLT5rZXlmdW5jID0ga2V5ZnVuYzsKLQlQeV9JTkNSRUYoa2V5ZnVuYyk7Ci0JZ2JvLT5pdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXQpOwotCWlmIChnYm8tPml0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGdibyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopZ2JvOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86Z3JvdXBieSIsIGt3YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXQsICZrZXlmdW5jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBnYm8gPSAoZ3JvdXBieW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChnYm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ2JvLT50Z3RrZXkgPSBOVUxMOworICAgIGdiby0+Y3VycmtleSA9IE5VTEw7CisgICAgZ2JvLT5jdXJydmFsdWUgPSBOVUxMOworICAgIGdiby0+a2V5ZnVuYyA9IGtleWZ1bmM7CisgICAgUHlfSU5DUkVGKGtleWZ1bmMpOworICAgIGdiby0+aXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0KTsKKyAgICBpZiAoZ2JvLT5pdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihnYm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWdibzsKIH0KIAogc3RhdGljIHZvaWQKIGdyb3VwYnlfZGVhbGxvYyhncm91cGJ5b2JqZWN0ICpnYm8pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhnYm8pOwotCVB5X1hERUNSRUYoZ2JvLT5pdCk7Ci0JUHlfWERFQ1JFRihnYm8tPmtleWZ1bmMpOwotCVB5X1hERUNSRUYoZ2JvLT50Z3RrZXkpOwotCVB5X1hERUNSRUYoZ2JvLT5jdXJya2V5KTsKLQlQeV9YREVDUkVGKGdiby0+Y3VycnZhbHVlKTsKLQlQeV9UWVBFKGdibyktPnRwX2ZyZWUoZ2JvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGdibyk7CisgICAgUHlfWERFQ1JFRihnYm8tPml0KTsKKyAgICBQeV9YREVDUkVGKGdiby0+a2V5ZnVuYyk7CisgICAgUHlfWERFQ1JFRihnYm8tPnRndGtleSk7CisgICAgUHlfWERFQ1JFRihnYm8tPmN1cnJrZXkpOworICAgIFB5X1hERUNSRUYoZ2JvLT5jdXJydmFsdWUpOworICAgIFB5X1RZUEUoZ2JvKS0+dHBfZnJlZShnYm8pOwogfQogCiBzdGF0aWMgaW50CiBncm91cGJ5X3RyYXZlcnNlKGdyb3VwYnlvYmplY3QgKmdibywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoZ2JvLT5pdCk7Ci0JUHlfVklTSVQoZ2JvLT5rZXlmdW5jKTsKLQlQeV9WSVNJVChnYm8tPnRndGtleSk7Ci0JUHlfVklTSVQoZ2JvLT5jdXJya2V5KTsKLQlQeV9WSVNJVChnYm8tPmN1cnJ2YWx1ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoZ2JvLT5pdCk7CisgICAgUHlfVklTSVQoZ2JvLT5rZXlmdW5jKTsKKyAgICBQeV9WSVNJVChnYm8tPnRndGtleSk7CisgICAgUHlfVklTSVQoZ2JvLT5jdXJya2V5KTsKKyAgICBQeV9WSVNJVChnYm8tPmN1cnJ2YWx1ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBncm91cGJ5X25leHQoZ3JvdXBieW9iamVjdCAqZ2JvKQogewotCVB5T2JqZWN0ICpuZXd2YWx1ZSwgKm5ld2tleSwgKnIsICpncm91cGVyLCAqdG1wOworICAgIFB5T2JqZWN0ICpuZXd2YWx1ZSwgKm5ld2tleSwgKnIsICpncm91cGVyLCAqdG1wOwogCi0JLyogc2tpcCB0byBuZXh0IGl0ZXJhdGlvbiBncm91cCAqLwotCWZvciAoOzspIHsKLQkJaWYgKGdiby0+Y3VycmtleSA9PSBOVUxMKQotCQkJLyogcGFzcyAqLzsKLQkJZWxzZSBpZiAoZ2JvLT50Z3RrZXkgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQllbHNlIHsKLQkJCWludCByY21wOworICAgIC8qIHNraXAgdG8gbmV4dCBpdGVyYXRpb24gZ3JvdXAgKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChnYm8tPmN1cnJrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIC8qIHBhc3MgKi87CisgICAgICAgIGVsc2UgaWYgKGdiby0+dGd0a2V5ID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgcmNtcDsKIAotCQkJcmNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChnYm8tPnRndGtleSwKLQkJCQkJCQlnYm8tPmN1cnJrZXksIFB5X0VRKTsKLQkJCWlmIChyY21wID09IC0xKQotCQkJCXJldHVybiBOVUxMOwotCQkJZWxzZSBpZiAocmNtcCA9PSAwKQotCQkJCWJyZWFrOwotCQl9CisgICAgICAgICAgICByY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGdiby0+dGd0a2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm8tPmN1cnJrZXksIFB5X0VRKTsKKyAgICAgICAgICAgIGlmIChyY21wID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZWxzZSBpZiAocmNtcCA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJbmV3dmFsdWUgPSBQeUl0ZXJfTmV4dChnYm8tPml0KTsKLQkJaWYgKG5ld3ZhbHVlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgbmV3dmFsdWUgPSBQeUl0ZXJfTmV4dChnYm8tPml0KTsKKyAgICAgICAgaWYgKG5ld3ZhbHVlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlpZiAoZ2JvLT5rZXlmdW5jID09IFB5X05vbmUpIHsKLQkJCW5ld2tleSA9IG5ld3ZhbHVlOwotCQkJUHlfSU5DUkVGKG5ld3ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCW5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLAotCQkJCQkJCSAgICAgIG5ld3ZhbHVlLCBOVUxMKTsKLQkJCWlmIChuZXdrZXkgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihuZXd2YWx1ZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKGdiby0+a2V5ZnVuYyA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBuZXdrZXkgPSBuZXd2YWx1ZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihuZXd2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsdWUsIE5VTEwpOworICAgICAgICAgICAgaWYgKG5ld2tleSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld3ZhbHVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXRtcCA9IGdiby0+Y3VycmtleTsKLQkJZ2JvLT5jdXJya2V5ID0gbmV3a2V5OwotCQlQeV9YREVDUkVGKHRtcCk7CisgICAgICAgIHRtcCA9IGdiby0+Y3VycmtleTsKKyAgICAgICAgZ2JvLT5jdXJya2V5ID0gbmV3a2V5OworICAgICAgICBQeV9YREVDUkVGKHRtcCk7CiAKLQkJdG1wID0gZ2JvLT5jdXJydmFsdWU7Ci0JCWdiby0+Y3VycnZhbHVlID0gbmV3dmFsdWU7Ci0JCVB5X1hERUNSRUYodG1wKTsKLQl9CisgICAgICAgIHRtcCA9IGdiby0+Y3VycnZhbHVlOworICAgICAgICBnYm8tPmN1cnJ2YWx1ZSA9IG5ld3ZhbHVlOworICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgfQogCi0JUHlfSU5DUkVGKGdiby0+Y3VycmtleSk7Ci0JdG1wID0gZ2JvLT50Z3RrZXk7Ci0JZ2JvLT50Z3RrZXkgPSBnYm8tPmN1cnJrZXk7Ci0JUHlfWERFQ1JFRih0bXApOworICAgIFB5X0lOQ1JFRihnYm8tPmN1cnJrZXkpOworICAgIHRtcCA9IGdiby0+dGd0a2V5OworICAgIGdiby0+dGd0a2V5ID0gZ2JvLT5jdXJya2V5OworICAgIFB5X1hERUNSRUYodG1wKTsKIAotCWdyb3VwZXIgPSBfZ3JvdXBlcl9jcmVhdGUoZ2JvLCBnYm8tPnRndGtleSk7Ci0JaWYgKGdyb3VwZXIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZ3JvdXBlciA9IF9ncm91cGVyX2NyZWF0ZShnYm8sIGdiby0+dGd0a2V5KTsKKyAgICBpZiAoZ3JvdXBlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXIgPSBQeVR1cGxlX1BhY2soMiwgZ2JvLT5jdXJya2V5LCBncm91cGVyKTsKLQlQeV9ERUNSRUYoZ3JvdXBlcik7Ci0JcmV0dXJuIHI7CisgICAgciA9IFB5VHVwbGVfUGFjaygyLCBnYm8tPmN1cnJrZXksIGdyb3VwZXIpOworICAgIFB5X0RFQ1JFRihncm91cGVyKTsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlEb2NfU1RSVkFSKGdyb3VwYnlfZG9jLApAQCAtMTM5LDU2ICsxMzksNTYgQEAKIChrZXksIHN1Yi1pdGVyYXRvcikgZ3JvdXBlZCBieSBlYWNoIHZhbHVlIG9mIGtleSh2YWx1ZSkuXG4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBncm91cGJ5X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5ncm91cGJ5IiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoZ3JvdXBieW9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcilncm91cGJ5X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlncm91cGJ5X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWdyb3VwYnlfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylncm91cGJ5X25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlncm91cGJ5X25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5ncm91cGJ5IiwgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihncm91cGJ5b2JqZWN0KSwgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWdyb3VwYnlfZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZ3JvdXBieV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylncm91cGJ5X3RyYXZlcnNlLCAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylncm91cGJ5X25leHQsICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGdyb3VwYnlfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogX2dyb3VwZXIgb2JqZWN0IChpbnRlcm5hbCkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpwYXJlbnQ7Ci0JUHlPYmplY3QgKnRndGtleTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnBhcmVudDsKKyAgICBQeU9iamVjdCAqdGd0a2V5OwogfSBfZ3JvdXBlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBfZ3JvdXBlcl90eXBlOwpAQCAtMTk2LDEyOSArMTk2LDEyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9ncm91cGVyX2NyZWF0ZShncm91cGJ5b2JqZWN0ICpwYXJlbnQsIFB5T2JqZWN0ICp0Z3RrZXkpCiB7Ci0JX2dyb3VwZXJvYmplY3QgKmlnbzsKKyAgICBfZ3JvdXBlcm9iamVjdCAqaWdvOwogCi0JaWdvID0gUHlPYmplY3RfR0NfTmV3KF9ncm91cGVyb2JqZWN0LCAmX2dyb3VwZXJfdHlwZSk7Ci0JaWYgKGlnbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZ28tPnBhcmVudCA9IChQeU9iamVjdCAqKXBhcmVudDsKLQlQeV9JTkNSRUYocGFyZW50KTsKLQlpZ28tPnRndGtleSA9IHRndGtleTsKLQlQeV9JTkNSRUYodGd0a2V5KTsKKyAgICBpZ28gPSBQeU9iamVjdF9HQ19OZXcoX2dyb3VwZXJvYmplY3QsICZfZ3JvdXBlcl90eXBlKTsKKyAgICBpZiAoaWdvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlnby0+cGFyZW50ID0gKFB5T2JqZWN0ICopcGFyZW50OworICAgIFB5X0lOQ1JFRihwYXJlbnQpOworICAgIGlnby0+dGd0a2V5ID0gdGd0a2V5OworICAgIFB5X0lOQ1JFRih0Z3RrZXkpOwogCi0JUHlPYmplY3RfR0NfVHJhY2soaWdvKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaWdvOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKGlnbyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWlnbzsKIH0KIAogc3RhdGljIHZvaWQKIF9ncm91cGVyX2RlYWxsb2MoX2dyb3VwZXJvYmplY3QgKmlnbykKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGlnbyk7Ci0JUHlfREVDUkVGKGlnby0+cGFyZW50KTsKLQlQeV9ERUNSRUYoaWdvLT50Z3RrZXkpOwotCVB5T2JqZWN0X0dDX0RlbChpZ28pOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soaWdvKTsKKyAgICBQeV9ERUNSRUYoaWdvLT5wYXJlbnQpOworICAgIFB5X0RFQ1JFRihpZ28tPnRndGtleSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGlnbyk7CiB9CiAKIHN0YXRpYyBpbnQKIF9ncm91cGVyX3RyYXZlcnNlKF9ncm91cGVyb2JqZWN0ICppZ28sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGlnby0+cGFyZW50KTsKLQlQeV9WSVNJVChpZ28tPnRndGtleSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoaWdvLT5wYXJlbnQpOworICAgIFB5X1ZJU0lUKGlnby0+dGd0a2V5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIF9ncm91cGVyX25leHQoX2dyb3VwZXJvYmplY3QgKmlnbykKIHsKLQlncm91cGJ5b2JqZWN0ICpnYm8gPSAoZ3JvdXBieW9iamVjdCAqKWlnby0+cGFyZW50OwotCVB5T2JqZWN0ICpuZXd2YWx1ZSwgKm5ld2tleSwgKnI7Ci0JaW50IHJjbXA7CisgICAgZ3JvdXBieW9iamVjdCAqZ2JvID0gKGdyb3VwYnlvYmplY3QgKilpZ28tPnBhcmVudDsKKyAgICBQeU9iamVjdCAqbmV3dmFsdWUsICpuZXdrZXksICpyOworICAgIGludCByY21wOwogCi0JaWYgKGdiby0+Y3VycnZhbHVlID09IE5VTEwpIHsKLQkJbmV3dmFsdWUgPSBQeUl0ZXJfTmV4dChnYm8tPml0KTsKLQkJaWYgKG5ld3ZhbHVlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZ2JvLT5jdXJydmFsdWUgPT0gTlVMTCkgeworICAgICAgICBuZXd2YWx1ZSA9IFB5SXRlcl9OZXh0KGdiby0+aXQpOworICAgICAgICBpZiAobmV3dmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCWlmIChnYm8tPmtleWZ1bmMgPT0gUHlfTm9uZSkgewotCQkJbmV3a2V5ID0gbmV3dmFsdWU7Ci0JCQlQeV9JTkNSRUYobmV3dmFsdWUpOwotCQl9IGVsc2UgewotCQkJbmV3a2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnYm8tPmtleWZ1bmMsCi0JCQkJCQkJICAgICAgbmV3dmFsdWUsIE5VTEwpOwotCQkJaWYgKG5ld2tleSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKG5ld3ZhbHVlKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQorICAgICAgICBpZiAoZ2JvLT5rZXlmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIG5ld2tleSA9IG5ld3ZhbHVlOworICAgICAgICAgICAgUHlfSU5DUkVGKG5ld3ZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXd2YWx1ZSwgTlVMTCk7CisgICAgICAgICAgICBpZiAobmV3a2V5ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3dmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJYXNzZXJ0KGdiby0+Y3VycmtleSA9PSBOVUxMKTsKLQkJZ2JvLT5jdXJya2V5ID0gbmV3a2V5OwotCQlnYm8tPmN1cnJ2YWx1ZSA9IG5ld3ZhbHVlOwotCX0KKyAgICAgICAgYXNzZXJ0KGdiby0+Y3VycmtleSA9PSBOVUxMKTsKKyAgICAgICAgZ2JvLT5jdXJya2V5ID0gbmV3a2V5OworICAgICAgICBnYm8tPmN1cnJ2YWx1ZSA9IG5ld3ZhbHVlOworICAgIH0KIAotCWFzc2VydChnYm8tPmN1cnJrZXkgIT0gTlVMTCk7Ci0JcmNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpZ28tPnRndGtleSwgZ2JvLT5jdXJya2V5LCBQeV9FUSk7Ci0JaWYgKHJjbXAgPD0gMCkKLQkJLyogZ290IGFueSBlcnJvciBvciBjdXJyZW50IGdyb3VwIGlzIGVuZCAqLwotCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoZ2JvLT5jdXJya2V5ICE9IE5VTEwpOworICAgIHJjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaWdvLT50Z3RrZXksIGdiby0+Y3VycmtleSwgUHlfRVEpOworICAgIGlmIChyY21wIDw9IDApCisgICAgICAgIC8qIGdvdCBhbnkgZXJyb3Igb3IgY3VycmVudCBncm91cCBpcyBlbmQgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyID0gZ2JvLT5jdXJydmFsdWU7Ci0JZ2JvLT5jdXJydmFsdWUgPSBOVUxMOwotCVB5X0NMRUFSKGdiby0+Y3VycmtleSk7CisgICAgciA9IGdiby0+Y3VycnZhbHVlOworICAgIGdiby0+Y3VycnZhbHVlID0gTlVMTDsKKyAgICBQeV9DTEVBUihnYm8tPmN1cnJrZXkpOwogCi0JcmV0dXJuIHI7CisgICAgcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgX2dyb3VwZXJfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLl9ncm91cGVyIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoX2dyb3VwZXJvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpX2dyb3VwZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCS8qIHRwX2ZsYWdzICovCi0JMCwJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylfZ3JvdXBlcl90cmF2ZXJzZSwvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpX2dyb3VwZXJfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLl9ncm91cGVyIiwgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKF9ncm91cGVyb2JqZWN0KSwgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpX2dyb3VwZXJfZGVhbGxvYywgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpX2dyb3VwZXJfdHJhdmVyc2UsLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylfZ3JvdXBlcl9uZXh0LCAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKLSAKKwogCiAvKiB0ZWUgb2JqZWN0IGFuZCB3aXRoIHN1cHBvcnRpbmcgZnVuY3Rpb24gYW5kIG9iamVjdHMgKioqKioqKioqKioqKioqLwogCiAvKiBUaGUgdGVlZGF0YW9iamVjdCBwcmUtYWxsb2NhdGVzIHNwYWNlIGZvciBMSU5LQ0VMTFMgbnVtYmVyIG9mIG9iamVjdHMuCiAgICBUbyBoZWxwIHRoZSBvYmplY3QgZml0IG5lYXRseSBpbnNpZGUgY2FjaGUgbGluZXMgKHNwYWNlIGZvciAxNiB0byAzMgotICAgcG9pbnRlcnMpLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgMTYgbWludXMgIHNwYWNlIGZvciAKKyAgIHBvaW50ZXJzKSwgdGhlIHZhbHVlIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDE2IG1pbnVzICBzcGFjZSBmb3IKICAgIHRoZSBvdGhlciBzdHJ1Y3R1cmUgbWVtYmVycyBpbmNsdWRpbmcgUHlIRUFEIG92ZXJoZWFkLiAgVGhlIGxhcmdlciB0aGUKICAgIHZhbHVlLCB0aGUgbGVzcyBtZW1vcnkgb3ZlcmhlYWQgcGVyIG9iamVjdCBhbmQgdGhlIGxlc3MgdGltZSBzcGVudAogICAgYWxsb2NhdGluZy9kZWFsbG9jYXRpbmcgbmV3IGxpbmtzLiAgVGhlIHNtYWxsZXIgdGhlIG51bWJlciwgdGhlIGxlc3MKQEAgLTMyNywxOCArMzI3LDE4IEBACiAjZGVmaW5lIExJTktDRUxMUyA1NwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICppdDsKLQlpbnQgbnVtcmVhZDsKLQlQeU9iamVjdCAqbmV4dGxpbms7Ci0JUHlPYmplY3QgKih2YWx1ZXNbTElOS0NFTExTXSk7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppdDsKKyAgICBpbnQgbnVtcmVhZDsKKyAgICBQeU9iamVjdCAqbmV4dGxpbms7CisgICAgUHlPYmplY3QgKih2YWx1ZXNbTElOS0NFTExTXSk7CiB9IHRlZWRhdGFvYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JdGVlZGF0YW9iamVjdCAqZGF0YW9iajsKLQlpbnQgaW5kZXg7Ci0JUHlPYmplY3QgKndlYWtyZWZsaXN0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICB0ZWVkYXRhb2JqZWN0ICpkYXRhb2JqOworICAgIGludCBpbmRleDsKKyAgICBQeU9iamVjdCAqd2Vha3JlZmxpc3Q7CiB9IHRlZW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCB0ZWVkYXRhb2JqZWN0X3R5cGU7CkBAIC0zNDYsMTIzICszNDYsMTIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVlZGF0YW9iamVjdF9uZXcoUHlPYmplY3QgKml0KQogewotCXRlZWRhdGFvYmplY3QgKnRkbzsKKyAgICB0ZWVkYXRhb2JqZWN0ICp0ZG87CiAKLQl0ZG8gPSBQeU9iamVjdF9HQ19OZXcodGVlZGF0YW9iamVjdCwgJnRlZWRhdGFvYmplY3RfdHlwZSk7Ci0JaWYgKHRkbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB0ZG8gPSBQeU9iamVjdF9HQ19OZXcodGVlZGF0YW9iamVjdCwgJnRlZWRhdGFvYmplY3RfdHlwZSk7CisgICAgaWYgKHRkbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXRkby0+bnVtcmVhZCA9IDA7Ci0JdGRvLT5uZXh0bGluayA9IE5VTEw7Ci0JUHlfSU5DUkVGKGl0KTsKLQl0ZG8tPml0ID0gaXQ7Ci0JUHlPYmplY3RfR0NfVHJhY2sodGRvKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopdGRvOworICAgIHRkby0+bnVtcmVhZCA9IDA7CisgICAgdGRvLT5uZXh0bGluayA9IE5VTEw7CisgICAgUHlfSU5DUkVGKGl0KTsKKyAgICB0ZG8tPml0ID0gaXQ7CisgICAgUHlPYmplY3RfR0NfVHJhY2sodGRvKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopdGRvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVlZGF0YW9iamVjdF9qdW1wbGluayh0ZWVkYXRhb2JqZWN0ICp0ZG8pCiB7Ci0JaWYgKHRkby0+bmV4dGxpbmsgPT0gTlVMTCkKLQkJdGRvLT5uZXh0bGluayA9IHRlZWRhdGFvYmplY3RfbmV3KHRkby0+aXQpOwotCVB5X1hJTkNSRUYodGRvLT5uZXh0bGluayk7Ci0JcmV0dXJuIHRkby0+bmV4dGxpbms7CisgICAgaWYgKHRkby0+bmV4dGxpbmsgPT0gTlVMTCkKKyAgICAgICAgdGRvLT5uZXh0bGluayA9IHRlZWRhdGFvYmplY3RfbmV3KHRkby0+aXQpOworICAgIFB5X1hJTkNSRUYodGRvLT5uZXh0bGluayk7CisgICAgcmV0dXJuIHRkby0+bmV4dGxpbms7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZWVkYXRhb2JqZWN0X2dldGl0ZW0odGVlZGF0YW9iamVjdCAqdGRvLCBpbnQgaSkKIHsKLQlQeU9iamVjdCAqdmFsdWU7CisgICAgUHlPYmplY3QgKnZhbHVlOwogCi0JYXNzZXJ0KGkgPCBMSU5LQ0VMTFMpOwotCWlmIChpIDwgdGRvLT5udW1yZWFkKQotCQl2YWx1ZSA9IHRkby0+dmFsdWVzW2ldOwotCWVsc2UgewotCQkvKiB0aGlzIGlzIHRoZSBsZWFkIGl0ZXJhdG9yLCBzbyBmZXRjaCBtb3JlIGRhdGEgKi8KLQkJYXNzZXJ0KGkgPT0gdGRvLT5udW1yZWFkKTsKLQkJdmFsdWUgPSBQeUl0ZXJfTmV4dCh0ZG8tPml0KTsKLQkJaWYgKHZhbHVlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJdGRvLT5udW1yZWFkKys7Ci0JCXRkby0+dmFsdWVzW2ldID0gdmFsdWU7Ci0JfQotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JcmV0dXJuIHZhbHVlOworICAgIGFzc2VydChpIDwgTElOS0NFTExTKTsKKyAgICBpZiAoaSA8IHRkby0+bnVtcmVhZCkKKyAgICAgICAgdmFsdWUgPSB0ZG8tPnZhbHVlc1tpXTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogdGhpcyBpcyB0aGUgbGVhZCBpdGVyYXRvciwgc28gZmV0Y2ggbW9yZSBkYXRhICovCisgICAgICAgIGFzc2VydChpID09IHRkby0+bnVtcmVhZCk7CisgICAgICAgIHZhbHVlID0gUHlJdGVyX05leHQodGRvLT5pdCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHRkby0+bnVtcmVhZCsrOworICAgICAgICB0ZG8tPnZhbHVlc1tpXSA9IHZhbHVlOworICAgIH0KKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKIH0KIAogc3RhdGljIGludAogdGVlZGF0YW9iamVjdF90cmF2ZXJzZSh0ZWVkYXRhb2JqZWN0ICp0ZG8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqIGFyZykKIHsKLQlpbnQgaTsKLQlQeV9WSVNJVCh0ZG8tPml0KTsKLQlmb3IgKGkgPSAwOyBpIDwgdGRvLT5udW1yZWFkOyBpKyspCi0JCVB5X1ZJU0lUKHRkby0+dmFsdWVzW2ldKTsKLQlQeV9WSVNJVCh0ZG8tPm5leHRsaW5rKTsKLQlyZXR1cm4gMDsKKyAgICBpbnQgaTsKKyAgICBQeV9WSVNJVCh0ZG8tPml0KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGRvLT5udW1yZWFkOyBpKyspCisgICAgICAgIFB5X1ZJU0lUKHRkby0+dmFsdWVzW2ldKTsKKyAgICBQeV9WSVNJVCh0ZG8tPm5leHRsaW5rKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogdGVlZGF0YW9iamVjdF9jbGVhcih0ZWVkYXRhb2JqZWN0ICp0ZG8pCiB7Ci0JaW50IGk7Ci0JUHlfQ0xFQVIodGRvLT5pdCk7Ci0JZm9yIChpPTAgOyBpPHRkby0+bnVtcmVhZCA7IGkrKykKLQkJUHlfQ0xFQVIodGRvLT52YWx1ZXNbaV0pOwotCVB5X0NMRUFSKHRkby0+bmV4dGxpbmspOwotCXJldHVybiAwOworICAgIGludCBpOworICAgIFB5X0NMRUFSKHRkby0+aXQpOworICAgIGZvciAoaT0wIDsgaTx0ZG8tPm51bXJlYWQgOyBpKyspCisgICAgICAgIFB5X0NMRUFSKHRkby0+dmFsdWVzW2ldKTsKKyAgICBQeV9DTEVBUih0ZG8tPm5leHRsaW5rKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIHRlZWRhdGFvYmplY3RfZGVhbGxvYyh0ZWVkYXRhb2JqZWN0ICp0ZG8pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayh0ZG8pOwotCXRlZWRhdGFvYmplY3RfY2xlYXIodGRvKTsKLQlQeU9iamVjdF9HQ19EZWwodGRvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHRkbyk7CisgICAgdGVlZGF0YW9iamVjdF9jbGVhcih0ZG8pOworICAgIFB5T2JqZWN0X0dDX0RlbCh0ZG8pOwogfQogCiBQeURvY19TVFJWQVIodGVlZGF0YW9iamVjdF9kb2MsICJEYXRhIGNvbnRhaW5lciBjb21tb24gdG8gbXVsdGlwbGUgdGVlIG9iamVjdHMuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgdGVlZGF0YW9iamVjdF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKQkvKiBNdXN0IGZpbGwgaW4gdHlwZSB2YWx1ZSBsYXRlciAqLwotCSJpdGVydG9vbHMudGVlX2RhdGFvYmplY3QiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZih0ZWVkYXRhb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpdGVlZGF0YW9iamVjdF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLAkvKiB0cF9mbGFncyAqLwotCXRlZWRhdGFvYmplY3RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpdGVlZGF0YW9iamVjdF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSl0ZWVkYXRhb2JqZWN0X2NsZWFyLAkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKSAgICAgICAgIC8qIE11c3QgZmlsbCBpbiB0eXBlIHZhbHVlIGxhdGVyICovCisgICAgIml0ZXJ0b29scy50ZWVfZGF0YW9iamVjdCIsICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHRlZWRhdGFvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXRlZWRhdGFvYmplY3RfZGVhbGxvYywgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICB0ZWVkYXRhb2JqZWN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpdGVlZGF0YW9iamVjdF90cmF2ZXJzZSwgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSl0ZWVkYXRhb2JqZWN0X2NsZWFyLCAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTQ3MSw0MiArNDcxLDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVlX25leHQodGVlb2JqZWN0ICp0bykKIHsKLQlQeU9iamVjdCAqdmFsdWUsICpsaW5rOworICAgIFB5T2JqZWN0ICp2YWx1ZSwgKmxpbms7CiAKLQlpZiAodG8tPmluZGV4ID49IExJTktDRUxMUykgewotCQlsaW5rID0gdGVlZGF0YW9iamVjdF9qdW1wbGluayh0by0+ZGF0YW9iaik7Ci0JCVB5X0RFQ1JFRih0by0+ZGF0YW9iaik7Ci0JCXRvLT5kYXRhb2JqID0gKHRlZWRhdGFvYmplY3QgKilsaW5rOwotCQl0by0+aW5kZXggPSAwOwotCX0KLQl2YWx1ZSA9IHRlZWRhdGFvYmplY3RfZ2V0aXRlbSh0by0+ZGF0YW9iaiwgdG8tPmluZGV4KTsKLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdG8tPmluZGV4Kys7Ci0JcmV0dXJuIHZhbHVlOworICAgIGlmICh0by0+aW5kZXggPj0gTElOS0NFTExTKSB7CisgICAgICAgIGxpbmsgPSB0ZWVkYXRhb2JqZWN0X2p1bXBsaW5rKHRvLT5kYXRhb2JqKTsKKyAgICAgICAgUHlfREVDUkVGKHRvLT5kYXRhb2JqKTsKKyAgICAgICAgdG8tPmRhdGFvYmogPSAodGVlZGF0YW9iamVjdCAqKWxpbms7CisgICAgICAgIHRvLT5pbmRleCA9IDA7CisgICAgfQorICAgIHZhbHVlID0gdGVlZGF0YW9iamVjdF9nZXRpdGVtKHRvLT5kYXRhb2JqLCB0by0+aW5kZXgpOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0by0+aW5kZXgrKzsKKyAgICByZXR1cm4gdmFsdWU7CiB9CiAKIHN0YXRpYyBpbnQKIHRlZV90cmF2ZXJzZSh0ZWVvYmplY3QgKnRvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVCgoUHlPYmplY3QgKil0by0+ZGF0YW9iaik7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoKFB5T2JqZWN0ICopdG8tPmRhdGFvYmopOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVlX2NvcHkodGVlb2JqZWN0ICp0bykKIHsKLQl0ZWVvYmplY3QgKm5ld3RvOworICAgIHRlZW9iamVjdCAqbmV3dG87CiAKLQluZXd0byA9IFB5T2JqZWN0X0dDX05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7Ci0JaWYgKG5ld3RvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRih0by0+ZGF0YW9iaik7Ci0JbmV3dG8tPmRhdGFvYmogPSB0by0+ZGF0YW9iajsKLQluZXd0by0+aW5kZXggPSB0by0+aW5kZXg7Ci0JbmV3dG8tPndlYWtyZWZsaXN0ID0gTlVMTDsKLQlQeU9iamVjdF9HQ19UcmFjayhuZXd0byk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld3RvOworICAgIG5ld3RvID0gUHlPYmplY3RfR0NfTmV3KHRlZW9iamVjdCwgJnRlZV90eXBlKTsKKyAgICBpZiAobmV3dG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKHRvLT5kYXRhb2JqKTsKKyAgICBuZXd0by0+ZGF0YW9iaiA9IHRvLT5kYXRhb2JqOworICAgIG5ld3RvLT5pbmRleCA9IHRvLT5pbmRleDsKKyAgICBuZXd0by0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKG5ld3RvKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3dG87CiB9CiAKIFB5RG9jX1NUUlZBUih0ZWVjb3B5X2RvYywgIlJldHVybnMgYW4gaW5kZXBlbmRlbnQgaXRlcmF0b3IuIik7CkBAIC01MTQsMTU0ICs1MTQsMTU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVlX2Zyb21pdGVyYWJsZShQeU9iamVjdCAqaXRlcmFibGUpCiB7Ci0JdGVlb2JqZWN0ICp0bzsKLQlQeU9iamVjdCAqaXQgPSBOVUxMOworICAgIHRlZW9iamVjdCAqdG87CisgICAgUHlPYmplY3QgKml0ID0gTlVMTDsKIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeU9iamVjdF9UeXBlQ2hlY2soaXQsICZ0ZWVfdHlwZSkpIHsKLQkJdG8gPSAodGVlb2JqZWN0ICopdGVlX2NvcHkoKHRlZW9iamVjdCAqKWl0KTsKLQkJZ290byBkb25lOwotCX0KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlPYmplY3RfVHlwZUNoZWNrKGl0LCAmdGVlX3R5cGUpKSB7CisgICAgICAgIHRvID0gKHRlZW9iamVjdCAqKXRlZV9jb3B5KCh0ZWVvYmplY3QgKilpdCk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQl0byA9IFB5T2JqZWN0X0dDX05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7Ci0JaWYgKHRvID09IE5VTEwpIAotCQlnb3RvIGRvbmU7Ci0JdG8tPmRhdGFvYmogPSAodGVlZGF0YW9iamVjdCAqKXRlZWRhdGFvYmplY3RfbmV3KGl0KTsKLQlpZiAoIXRvLT5kYXRhb2JqKSB7Ci0JCVB5T2JqZWN0X0dDX0RlbCh0byk7Ci0JCXRvID0gTlVMTDsKLQkJZ290byBkb25lOwotCX0KKyAgICB0byA9IFB5T2JqZWN0X0dDX05ldyh0ZWVvYmplY3QsICZ0ZWVfdHlwZSk7CisgICAgaWYgKHRvID09IE5VTEwpCisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB0by0+ZGF0YW9iaiA9ICh0ZWVkYXRhb2JqZWN0ICopdGVlZGF0YW9iamVjdF9uZXcoaXQpOworICAgIGlmICghdG8tPmRhdGFvYmopIHsKKyAgICAgICAgUHlPYmplY3RfR0NfRGVsKHRvKTsKKyAgICAgICAgdG8gPSBOVUxMOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JdG8tPmluZGV4ID0gMDsKLQl0by0+d2Vha3JlZmxpc3QgPSBOVUxMOwotCVB5T2JqZWN0X0dDX1RyYWNrKHRvKTsKKyAgICB0by0+aW5kZXggPSAwOworICAgIHRvLT53ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgUHlPYmplY3RfR0NfVHJhY2sodG8pOwogZG9uZToKLQlQeV9YREVDUkVGKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopdG87CisgICAgUHlfWERFQ1JFRihpdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXRvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdGVlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKml0ZXJhYmxlOworICAgIFB5T2JqZWN0ICppdGVyYWJsZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRlZSIsIDEsIDEsICZpdGVyYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB0ZWVfZnJvbWl0ZXJhYmxlKGl0ZXJhYmxlKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0ZWUiLCAxLCAxLCAmaXRlcmFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gdGVlX2Zyb21pdGVyYWJsZShpdGVyYWJsZSk7CiB9CiAKIHN0YXRpYyBpbnQKIHRlZV9jbGVhcih0ZWVvYmplY3QgKnRvKQogewotCWlmICh0by0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgdG8pOwotCVB5X0NMRUFSKHRvLT5kYXRhb2JqKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodG8tPndlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIHRvKTsKKyAgICBQeV9DTEVBUih0by0+ZGF0YW9iaik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiB0ZWVfZGVhbGxvYyh0ZWVvYmplY3QgKnRvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sodG8pOwotCXRlZV9jbGVhcih0byk7Ci0JUHlPYmplY3RfR0NfRGVsKHRvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHRvKTsKKyAgICB0ZWVfY2xlYXIodG8pOworICAgIFB5T2JqZWN0X0dDX0RlbCh0byk7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZWVvYmplY3RfZG9jLAogIkl0ZXJhdG9yIHdyYXBwZWQgdG8gbWFrZSBpdCBjb3B5YWJsZSIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgdGVlX21ldGhvZHNbXSA9IHsKLQl7Il9fY29weV9fIiwJKFB5Q0Z1bmN0aW9uKXRlZV9jb3B5LAlNRVRIX05PQVJHUywgdGVlY29weV9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19jb3B5X18iLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlZV9jb3B5LCAgTUVUSF9OT0FSR1MsIHRlZWNvcHlfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCB0ZWVfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLnRlZSIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHRlZW9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcil0ZWVfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywJLyogdHBfZmxhZ3MgKi8KLQl0ZWVvYmplY3RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpdGVlX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KXRlZV9jbGVhciwJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZih0ZWVvYmplY3QsIHdlYWtyZWZsaXN0KSwJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKXRlZV9uZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KLQl0ZWVfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCXRlZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMudGVlIiwgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YodGVlb2JqZWN0KSwgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcil0ZWVfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgdGVlb2JqZWN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyl0ZWVfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSl0ZWVfY2xlYXIsICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YodGVlb2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXRlZV9uZXh0LCAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHRlZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgdGVlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpLCBuPTI7Ci0JUHlPYmplY3QgKml0LCAqaXRlcmFibGUsICpjb3B5YWJsZSwgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGksIG49MjsKKyAgICBQeU9iamVjdCAqaXQsICppdGVyYWJsZSwgKmNvcHlhYmxlLCAqcmVzdWx0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfG4iLCAmaXRlcmFibGUsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibiBtdXN0IGJlID49IDAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIHJlc3VsdDsKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotCWlmIChpdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKGl0LCAiX19jb3B5X18iKSkgewotCQljb3B5YWJsZSA9IHRlZV9mcm9taXRlcmFibGUoaXQpOwotCQlQeV9ERUNSRUYoaXQpOwotCQlpZiAoY29weWFibGUgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0gZWxzZQotCQljb3B5YWJsZSA9IGl0OwotCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAwLCBjb3B5YWJsZSk7Ci0JZm9yIChpPTEgOyBpPG4gOyBpKyspIHsKLQkJY29weWFibGUgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGNvcHlhYmxlLCAiX19jb3B5X18iLCBOVUxMKTsKLQkJaWYgKGNvcHlhYmxlID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGNvcHlhYmxlKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98biIsICZpdGVyYWJsZSwgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuIG11c3QgYmUgPj0gMCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoaXQsICJfX2NvcHlfXyIpKSB7CisgICAgICAgIGNvcHlhYmxlID0gdGVlX2Zyb21pdGVyYWJsZShpdCk7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIGlmIChjb3B5YWJsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGNvcHlhYmxlID0gaXQ7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIGNvcHlhYmxlKTsKKyAgICBmb3IgKGk9MSA7IGk8biA7IGkrKykgeworICAgICAgICBjb3B5YWJsZSA9IFB5T2JqZWN0X0NhbGxNZXRob2QoY29weWFibGUsICJfX2NvcHlfXyIsIE5VTEwpOworICAgICAgICBpZiAoY29weWFibGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgY29weWFibGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIodGVlX2RvYywKQEAgLTY3MSwxMCArNjcxLDEwIEBACiAvKiBjeWNsZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqaXQ7Ci0JUHlPYmplY3QgKnNhdmVkOwotCWludCBmaXJzdHBhc3M7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqc2F2ZWQ7CisgICAgaW50IGZpcnN0cGFzczsKIH0gY3ljbGVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY3ljbGVfdHlwZTsKQEAgLTY4Miw4OSArNjgyLDg5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY3ljbGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICppdDsKLQlQeU9iamVjdCAqaXRlcmFibGU7Ci0JUHlPYmplY3QgKnNhdmVkOwotCWN5Y2xlb2JqZWN0ICpsejsKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKml0ZXJhYmxlOworICAgIFB5T2JqZWN0ICpzYXZlZDsKKyAgICBjeWNsZW9iamVjdCAqbHo7CiAKLQlpZiAodHlwZSA9PSAmY3ljbGVfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImN5Y2xlKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJmN5Y2xlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJjeWNsZSgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY3ljbGUiLCAxLCAxLCAmaXRlcmFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjeWNsZSIsIDEsIDEsICZpdGVyYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogR2V0IGl0ZXJhdG9yLiAqLwotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEdldCBpdGVyYXRvci4gKi8KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNhdmVkID0gUHlMaXN0X05ldygwKTsKLQlpZiAoc2F2ZWQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc2F2ZWQgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChzYXZlZCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIGNyZWF0ZSBjeWNsZW9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChjeWNsZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChseiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdCk7Ci0JCVB5X0RFQ1JFRihzYXZlZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlsei0+aXQgPSBpdDsKLQlsei0+c2F2ZWQgPSBzYXZlZDsKLQlsei0+Zmlyc3RwYXNzID0gMDsKKyAgICAvKiBjcmVhdGUgY3ljbGVvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAoY3ljbGVvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobHogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICBQeV9ERUNSRUYoc2F2ZWQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbHotPml0ID0gaXQ7CisgICAgbHotPnNhdmVkID0gc2F2ZWQ7CisgICAgbHotPmZpcnN0cGFzcyA9IDA7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogY3ljbGVfZGVhbGxvYyhjeWNsZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+c2F2ZWQpOwotCVB5X1hERUNSRUYobHotPml0KTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+c2F2ZWQpOworICAgIFB5X1hERUNSRUYobHotPml0KTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGN5Y2xlX3RyYXZlcnNlKGN5Y2xlb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlQeV9WSVNJVChsei0+c2F2ZWQpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5pdCk7CisgICAgUHlfVklTSVQobHotPnNhdmVkKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGN5Y2xlX25leHQoY3ljbGVvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICppdGVtOwotCVB5T2JqZWN0ICppdDsKLQlQeU9iamVjdCAqdG1wOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqdG1wOwogCi0Jd2hpbGUgKDEpIHsKLQkJaXRlbSA9IFB5SXRlcl9OZXh0KGx6LT5pdCk7Ci0JCWlmIChpdGVtICE9IE5VTEwpIHsKLQkJCWlmICghbHotPmZpcnN0cGFzcykKLQkJCQlQeUxpc3RfQXBwZW5kKGx6LT5zYXZlZCwgaXRlbSk7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfQotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoUHlMaXN0X1NpemUobHotPnNhdmVkKSA9PSAwKSAKLQkJCXJldHVybiBOVUxMOwotCQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIobHotPnNhdmVkKTsKLQkJaWYgKGl0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJdG1wID0gbHotPml0OwotCQlsei0+aXQgPSBpdDsKLQkJbHotPmZpcnN0cGFzcyA9IDE7Ci0JCVB5X0RFQ1JFRih0bXApOwotCX0KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpdGVtID0gUHlJdGVyX05leHQobHotPml0KTsKKyAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFsei0+Zmlyc3RwYXNzKQorICAgICAgICAgICAgICAgIFB5TGlzdF9BcHBlbmQobHotPnNhdmVkLCBpdGVtKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChQeUxpc3RfU2l6ZShsei0+c2F2ZWQpID09IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGx6LT5zYXZlZCk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHRtcCA9IGx6LT5pdDsKKyAgICAgICAgbHotPml0ID0gaXQ7CisgICAgICAgIGx6LT5maXJzdHBhc3MgPSAxOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihjeWNsZV9kb2MsCkBAIC03NzQsNTcgKzc3NCw1NyBAQAogVGhlbiByZXBlYXQgdGhlIHNlcXVlbmNlIGluZGVmaW5pdGVseS4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjeWNsZV90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuY3ljbGUiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihjeWNsZW9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciljeWNsZV9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JY3ljbGVfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY3ljbGVfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYyljeWNsZV9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JY3ljbGVfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLmN5Y2xlIiwgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGN5Y2xlb2JqZWN0KSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpY3ljbGVfZGVhbGxvYywgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjeWNsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWN5Y2xlX3RyYXZlcnNlLCAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWN5Y2xlX25leHQsICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgY3ljbGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBkcm9wd2hpbGUgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKml0OwotCWxvbmcJIHN0YXJ0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgbG9uZyAgICAgICAgIHN0YXJ0OwogfSBkcm9wd2hpbGVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgZHJvcHdoaWxlX3R5cGU7CkBAIC04MzIsODIgKzgzMiw4MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRyb3B3aGlsZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpzZXE7Ci0JUHlPYmplY3QgKml0OwotCWRyb3B3aGlsZW9iamVjdCAqbHo7CisgICAgUHlPYmplY3QgKmZ1bmMsICpzZXE7CisgICAgUHlPYmplY3QgKml0OworICAgIGRyb3B3aGlsZW9iamVjdCAqbHo7CiAKLQlpZiAodHlwZSA9PSAmZHJvcHdoaWxlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJkcm9wd2hpbGUoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmZHJvcHdoaWxlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJkcm9wd2hpbGUoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRyb3B3aGlsZSIsIDIsIDIsICZmdW5jLCAmc2VxKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZHJvcHdoaWxlIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEdldCBpdGVyYXRvci4gKi8KLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNyZWF0ZSBkcm9wd2hpbGVvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAoZHJvcHdoaWxlb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihmdW5jKTsKLQlsei0+ZnVuYyA9IGZ1bmM7Ci0JbHotPml0ID0gaXQ7Ci0JbHotPnN0YXJ0ID0gMDsKKyAgICAvKiBjcmVhdGUgZHJvcHdoaWxlb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKGRyb3B3aGlsZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgbHotPmZ1bmMgPSBmdW5jOworICAgIGx6LT5pdCA9IGl0OworICAgIGx6LT5zdGFydCA9IDA7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogZHJvcHdoaWxlX2RlYWxsb2MoZHJvcHdoaWxlb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5mdW5jKTsKLQlQeV9YREVDUkVGKGx6LT5pdCk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPmZ1bmMpOworICAgIFB5X1hERUNSRUYobHotPml0KTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGRyb3B3aGlsZV90cmF2ZXJzZShkcm9wd2hpbGVvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+aXQpOwotCVB5X1ZJU0lUKGx6LT5mdW5jKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChsei0+aXQpOworICAgIFB5X1ZJU0lUKGx6LT5mdW5jKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRyb3B3aGlsZV9uZXh0KGRyb3B3aGlsZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKml0ZW0sICpnb29kOwotCVB5T2JqZWN0ICppdCA9IGx6LT5pdDsKLQlsb25nIG9rOwotCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqaXRlbSwgKmdvb2Q7CisgICAgUHlPYmplY3QgKml0ID0gbHotPml0OworICAgIGxvbmcgb2s7CisgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOwogCi0JYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOwotCWl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKLQlmb3IgKDs7KSB7Ci0JCWl0ZW0gPSBpdGVybmV4dChpdCk7Ci0JCWlmIChpdGVtID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKGx6LT5zdGFydCA9PSAxKQotCQkJcmV0dXJuIGl0ZW07CisgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGl0ZW0gPSBpdGVybmV4dChpdCk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGx6LT5zdGFydCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIGl0ZW07CiAKLQkJZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsIGl0ZW0sIE5VTEwpOwotCQlpZiAoZ29vZCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKLQkJUHlfREVDUkVGKGdvb2QpOwotCQlpZiAoIW9rKSB7Ci0JCQlsei0+c3RhcnQgPSAxOwotCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KKyAgICAgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsIGl0ZW0sIE5VTEwpOworICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKKyAgICAgICAgUHlfREVDUkVGKGdvb2QpOworICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBsei0+c3RhcnQgPSAxOworICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKGRyb3B3aGlsZV9kb2MsCkBAIC05MTcsNTcgKzkxNyw1NyBAQAogQWZ0ZXJ3YXJkcywgcmV0dXJuIGV2ZXJ5IGVsZW1lbnQgdW50aWwgdGhlIGl0ZXJhYmxlIGlzIGV4aGF1c3RlZC4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBkcm9wd2hpbGVfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLmRyb3B3aGlsZSIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGRyb3B3aGlsZW9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWRyb3B3aGlsZV9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JZHJvcHdoaWxlX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWRyb3B3aGlsZV90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWRyb3B3aGlsZV9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JZHJvcHdoaWxlX25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5kcm9wd2hpbGUiLCAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihkcm9wd2hpbGVvYmplY3QpLCAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWRyb3B3aGlsZV9kZWFsbG9jLCAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgZHJvcHdoaWxlX2RvYywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkcm9wd2hpbGVfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZHJvcHdoaWxlX25leHQsICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBkcm9wd2hpbGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIHRha2V3aGlsZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqaXQ7Ci0JbG9uZwkgc3RvcDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKml0OworICAgIGxvbmcgICAgICAgICBzdG9wOwogfSB0YWtld2hpbGVvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgdGFrZXdoaWxlX3R5cGU7CkBAIC05NzUsNzkgKzk3NSw3OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRha2V3aGlsZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpzZXE7Ci0JUHlPYmplY3QgKml0OwotCXRha2V3aGlsZW9iamVjdCAqbHo7CisgICAgUHlPYmplY3QgKmZ1bmMsICpzZXE7CisgICAgUHlPYmplY3QgKml0OworICAgIHRha2V3aGlsZW9iamVjdCAqbHo7CiAKLQlpZiAodHlwZSA9PSAmdGFrZXdoaWxlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJ0YWtld2hpbGUoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmdGFrZXdoaWxlX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJ0YWtld2hpbGUoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRha2V3aGlsZSIsIDIsIDIsICZmdW5jLCAmc2VxKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidGFrZXdoaWxlIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEdldCBpdGVyYXRvci4gKi8KLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNyZWF0ZSB0YWtld2hpbGVvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAodGFrZXdoaWxlb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihmdW5jKTsKLQlsei0+ZnVuYyA9IGZ1bmM7Ci0JbHotPml0ID0gaXQ7Ci0JbHotPnN0b3AgPSAwOworICAgIC8qIGNyZWF0ZSB0YWtld2hpbGVvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAodGFrZXdoaWxlb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICBsei0+ZnVuYyA9IGZ1bmM7CisgICAgbHotPml0ID0gaXQ7CisgICAgbHotPnN0b3AgPSAwOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIHRha2V3aGlsZV9kZWFsbG9jKHRha2V3aGlsZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+ZnVuYyk7Ci0JUHlfWERFQ1JFRihsei0+aXQpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5mdW5jKTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdCk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiB0YWtld2hpbGVfdHJhdmVyc2UodGFrZXdoaWxlb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlQeV9WSVNJVChsei0+ZnVuYyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0KTsKKyAgICBQeV9WSVNJVChsei0+ZnVuYyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0YWtld2hpbGVfbmV4dCh0YWtld2hpbGVvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICppdGVtLCAqZ29vZDsKLQlQeU9iamVjdCAqaXQgPSBsei0+aXQ7Ci0JbG9uZyBvazsKKyAgICBQeU9iamVjdCAqaXRlbSwgKmdvb2Q7CisgICAgUHlPYmplY3QgKml0ID0gbHotPml0OworICAgIGxvbmcgb2s7CiAKLQlpZiAobHotPnN0b3AgPT0gMSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGx6LT5zdG9wID09IDEpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOwotCWl0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOwotCWlmIChpdGVtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKKyAgICBpdGVtID0gKCpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQpKGl0KTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLCBpdGVtLCBOVUxMKTsKLQlpZiAoZ29vZCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwotCVB5X0RFQ1JFRihnb29kKTsKLQlpZiAob2spCi0JCXJldHVybiBpdGVtOwotCVB5X0RFQ1JFRihpdGVtKTsKLQlsei0+c3RvcCA9IDE7Ci0JcmV0dXJuIE5VTEw7CisgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsIGl0ZW0sIE5VTEwpOworICAgIGlmIChnb29kID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgUHlfREVDUkVGKGdvb2QpOworICAgIGlmIChvaykKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIGx6LT5zdG9wID0gMTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHRha2V3aGlsZV9kb2MsCkBAIC0xMDU3LDU5ICsxMDU3LDU5IEBACiBwcmVkaWNhdGUgZXZhbHVhdGVzIHRvIHRydWUgZm9yIGVhY2ggZW50cnkuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgdGFrZXdoaWxlX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy50YWtld2hpbGUiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZih0YWtld2hpbGVvYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcil0YWtld2hpbGVfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCXRha2V3aGlsZV9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYyl0YWtld2hpbGVfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYyl0YWtld2hpbGVfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCXRha2V3aGlsZV9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMudGFrZXdoaWxlIiwgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YodGFrZXdoaWxlb2JqZWN0KSwgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcil0YWtld2hpbGVfZGVhbGxvYywgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHRha2V3aGlsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpdGFrZXdoaWxlX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXRha2V3aGlsZV9uZXh0LCAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgdGFrZXdoaWxlX25ldywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBpc2xpY2Ugb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqaXQ7Ci0JUHlfc3NpemVfdCBuZXh0OwotCVB5X3NzaXplX3Qgc3RvcDsKLQlQeV9zc2l6ZV90IHN0ZXA7Ci0JUHlfc3NpemVfdCBjbnQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeV9zc2l6ZV90IG5leHQ7CisgICAgUHlfc3NpemVfdCBzdG9wOworICAgIFB5X3NzaXplX3Qgc3RlcDsKKyAgICBQeV9zc2l6ZV90IGNudDsKIH0gaXNsaWNlb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGlzbGljZV90eXBlOwpAQCAtMTExNywxMjggKzExMTcsMTI4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaXNsaWNlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqc2VxOwotCVB5X3NzaXplX3Qgc3RhcnQ9MCwgc3RvcD0tMSwgc3RlcD0xOwotCVB5T2JqZWN0ICppdCwgKmExPU5VTEwsICphMj1OVUxMLCAqYTM9TlVMTDsKLQlQeV9zc2l6ZV90IG51bWFyZ3M7Ci0JaXNsaWNlb2JqZWN0ICpsejsKKyAgICBQeU9iamVjdCAqc2VxOworICAgIFB5X3NzaXplX3Qgc3RhcnQ9MCwgc3RvcD0tMSwgc3RlcD0xOworICAgIFB5T2JqZWN0ICppdCwgKmExPU5VTEwsICphMj1OVUxMLCAqYTM9TlVMTDsKKyAgICBQeV9zc2l6ZV90IG51bWFyZ3M7CisgICAgaXNsaWNlb2JqZWN0ICpsejsKIAotCWlmICh0eXBlID09ICZpc2xpY2VfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImlzbGljZSgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZpc2xpY2VfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImlzbGljZSgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXNsaWNlIiwgMiwgNCwgJnNlcSwgJmExLCAmYTIsICZhMykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlzbGljZSIsIDIsIDQsICZzZXEsICZhMSwgJmEyLCAmYTMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW51bWFyZ3MgPSBQeVR1cGxlX1NpemUoYXJncyk7Ci0JaWYgKG51bWFyZ3MgPT0gMikgewotCQlpZiAoYTEgIT0gUHlfTm9uZSkgewotCQkJc3RvcCA9IFB5SW50X0FzU3NpemVfdChhMSk7Ci0JCQlpZiAoc3RvcCA9PSAtMSkgewotCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICJTdG9wIGFyZ3VtZW50IGZvciBpc2xpY2UoKSBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgb3IgTm9uZS4iKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChhMSAhPSBQeV9Ob25lKQotCQkJc3RhcnQgPSBQeUludF9Bc1NzaXplX3QoYTEpOwotCQlpZiAoc3RhcnQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWlmIChhMiAhPSBQeV9Ob25lKSB7Ci0JCQlzdG9wID0gUHlJbnRfQXNTc2l6ZV90KGEyKTsKLQkJCWlmIChzdG9wID09IC0xKSB7Ci0JCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBvciBOb25lLiIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQotCWlmIChzdGFydDwwIHx8IHN0b3A8LTEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSAgICJJbmRpY2VzIGZvciBpc2xpY2UoKSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VycyBvciBOb25lLiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgbnVtYXJncyA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKKyAgICBpZiAobnVtYXJncyA9PSAyKSB7CisgICAgICAgIGlmIChhMSAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBzdG9wID0gUHlJbnRfQXNTc2l6ZV90KGExKTsKKyAgICAgICAgICAgIGlmIChzdG9wID09IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciBvciBOb25lLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGExICE9IFB5X05vbmUpCisgICAgICAgICAgICBzdGFydCA9IFB5SW50X0FzU3NpemVfdChhMSk7CisgICAgICAgIGlmIChzdGFydCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKGEyICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIHN0b3AgPSBQeUludF9Bc1NzaXplX3QoYTIpOworICAgICAgICAgICAgaWYgKHN0b3AgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiU3RvcCBhcmd1bWVudCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG9yIE5vbmUuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXJ0PDAgfHwgc3RvcDwtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgIkluZGljZXMgZm9yIGlzbGljZSgpIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGludGVnZXJzIG9yIE5vbmUuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChhMyAhPSBOVUxMKSB7Ci0JCWlmIChhMyAhPSBQeV9Ob25lKQotCQkJc3RlcCA9IFB5SW50X0FzU3NpemVfdChhMyk7Ci0JCWlmIChzdGVwID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlQeUVycl9DbGVhcigpOwotCX0KLQlpZiAoc3RlcDwxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkgICAiU3RlcCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IgTm9uZS4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChhMyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhMyAhPSBQeV9Ob25lKQorICAgICAgICAgICAgc3RlcCA9IFB5SW50X0FzU3NpemVfdChhMyk7CisgICAgICAgIGlmIChzdGVwID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoc3RlcDwxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAiU3RlcCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgb3IgTm9uZS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogR2V0IGl0ZXJhdG9yLiAqLwotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogY3JlYXRlIGlzbGljZW9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChpc2xpY2VvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbHotPml0ID0gaXQ7Ci0JbHotPm5leHQgPSBzdGFydDsKLQlsei0+c3RvcCA9IHN0b3A7Ci0JbHotPnN0ZXAgPSBzdGVwOwotCWx6LT5jbnQgPSAwTDsKKyAgICAvKiBjcmVhdGUgaXNsaWNlb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKGlzbGljZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsei0+aXQgPSBpdDsKKyAgICBsei0+bmV4dCA9IHN0YXJ0OworICAgIGx6LT5zdG9wID0gc3RvcDsKKyAgICBsei0+c3RlcCA9IHN0ZXA7CisgICAgbHotPmNudCA9IDBMOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGlzbGljZV9kZWFsbG9jKGlzbGljZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+aXQpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdCk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBpc2xpY2VfdHJhdmVyc2UoaXNsaWNlb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChsei0+aXQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaXNsaWNlX25leHQoaXNsaWNlb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqaXRlbTsKLQlQeU9iamVjdCAqaXQgPSBsei0+aXQ7Ci0JUHlfc3NpemVfdCBvbGRuZXh0OwotCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXQgPSBsei0+aXQ7CisgICAgUHlfc3NpemVfdCBvbGRuZXh0OworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKIAotCWFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKLQlpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7Ci0Jd2hpbGUgKGx6LT5jbnQgPCBsei0+bmV4dCkgewotCQlpdGVtID0gaXRlcm5leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQkJbHotPmNudCsrOwotCX0KLQlpZiAobHotPnN0b3AgIT0gLTEgJiYgbHotPmNudCA+PSBsei0+c3RvcCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOwotCWl0ZW0gPSBpdGVybmV4dChpdCk7Ci0JaWYgKGl0ZW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbHotPmNudCsrOwotCW9sZG5leHQgPSBsei0+bmV4dDsKLQlsei0+bmV4dCArPSBsei0+c3RlcDsKLQlpZiAobHotPm5leHQgPCBvbGRuZXh0KQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQkJbHotPm5leHQgPSBsei0+c3RvcDsKLQlyZXR1cm4gaXRlbTsKKyAgICBhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIHdoaWxlIChsei0+Y250IDwgbHotPm5leHQpIHsKKyAgICAgICAgaXRlbSA9IGl0ZXJuZXh0KGl0KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGx6LT5jbnQrKzsKKyAgICB9CisgICAgaWYgKGx6LT5zdG9wICE9IC0xICYmIGx6LT5jbnQgPj0gbHotPnN0b3ApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKKyAgICBpdGVtID0gaXRlcm5leHQoaXQpOworICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGx6LT5jbnQrKzsKKyAgICBvbGRuZXh0ID0gbHotPm5leHQ7CisgICAgbHotPm5leHQgKz0gbHotPnN0ZXA7CisgICAgaWYgKGx6LT5uZXh0IDwgb2xkbmV4dCkgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgICAgICBsei0+bmV4dCA9IGx6LT5zdG9wOworICAgIHJldHVybiBpdGVtOwogfQogCiBQeURvY19TVFJWQVIoaXNsaWNlX2RvYywKQEAgLTEyNTIsNTYgKzEyNTIsNTYgQEAKIGJ1dCByZXR1cm5zIGFuIGl0ZXJhdG9yLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGlzbGljZV90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuaXNsaWNlIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoaXNsaWNlb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWlzbGljZV9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JaXNsaWNlX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWlzbGljZV90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWlzbGljZV9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JaXNsaWNlX25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5pc2xpY2UiLCAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihpc2xpY2VvYmplY3QpLCAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWlzbGljZV9kZWFsbG9jLCAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaXNsaWNlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpc2xpY2VfdHJhdmVyc2UsICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylpc2xpY2VfbmV4dCwgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGlzbGljZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogc3Rhcm1hcCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKml0OwogfSBzdGFybWFwb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHN0YXJtYXBfdHlwZTsKQEAgLTEzMDksNzIgKzEzMDksNzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdGFybWFwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqZnVuYywgKnNlcTsKLQlQeU9iamVjdCAqaXQ7Ci0Jc3Rhcm1hcG9iamVjdCAqbHo7CisgICAgUHlPYmplY3QgKmZ1bmMsICpzZXE7CisgICAgUHlPYmplY3QgKml0OworICAgIHN0YXJtYXBvYmplY3QgKmx6OwogCi0JaWYgKHR5cGUgPT0gJnN0YXJtYXBfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInN0YXJtYXAoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmc3Rhcm1hcF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic3Rhcm1hcCgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3Rhcm1hcCIsIDIsIDIsICZmdW5jLCAmc2VxKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3Rhcm1hcCIsIDIsIDIsICZmdW5jLCAmc2VxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBHZXQgaXRlcmF0b3IuICovCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEdldCBpdGVyYXRvci4gKi8KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBjcmVhdGUgc3Rhcm1hcG9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChzdGFybWFwb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihmdW5jKTsKLQlsei0+ZnVuYyA9IGZ1bmM7Ci0JbHotPml0ID0gaXQ7CisgICAgLyogY3JlYXRlIHN0YXJtYXBvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAoc3Rhcm1hcG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgbHotPmZ1bmMgPSBmdW5jOworICAgIGx6LT5pdCA9IGl0OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIHN0YXJtYXBfZGVhbGxvYyhzdGFybWFwb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5mdW5jKTsKLQlQeV9YREVDUkVGKGx6LT5pdCk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPmZ1bmMpOworICAgIFB5X1hERUNSRUYobHotPml0KTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIHN0YXJtYXBfdHJhdmVyc2Uoc3Rhcm1hcG9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5pdCk7Ci0JUHlfVklTSVQobHotPmZ1bmMpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5pdCk7CisgICAgUHlfVklTSVQobHotPmZ1bmMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3Rhcm1hcF9uZXh0KHN0YXJtYXBvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKml0ID0gbHotPml0OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKml0ID0gbHotPml0OwogCi0JYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOwotCWFyZ3MgPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlUdXBsZV9DaGVja0V4YWN0KGFyZ3MpKSB7Ci0JCVB5T2JqZWN0ICpuZXdhcmdzID0gUHlTZXF1ZW5jZV9UdXBsZShhcmdzKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlpZiAobmV3YXJncyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFyZ3MgPSBuZXdhcmdzOwotCX0KLQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKGx6LT5mdW5jLCBhcmdzLCBOVUxMKTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7CisgICAgYXJncyA9ICgqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KShpdCk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrRXhhY3QoYXJncykpIHsKKyAgICAgICAgUHlPYmplY3QgKm5ld2FyZ3MgPSBQeVNlcXVlbmNlX1R1cGxlKGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYXJncyA9IG5ld2FyZ3M7CisgICAgfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwobHotPmZ1bmMsIGFyZ3MsIE5VTEwpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoc3Rhcm1hcF9kb2MsCkBAIC0xMzg0LDU2ICsxMzg0LDU2IEBACiB3aXRoIGEgYXJndW1lbnQgdHVwbGUgdGFrZW4gZnJvbSB0aGUgZ2l2ZW4gc2VxdWVuY2UuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgc3Rhcm1hcF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuc3Rhcm1hcCIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHN0YXJtYXBvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3Ipc3Rhcm1hcF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0Jc3Rhcm1hcF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylzdGFybWFwX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpc3Rhcm1hcF9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0Jc3Rhcm1hcF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuc3Rhcm1hcCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2Yoc3Rhcm1hcG9iamVjdCksICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilzdGFybWFwX2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHN0YXJtYXBfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2Mpc3Rhcm1hcF90cmF2ZXJzZSwgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpc3Rhcm1hcF9uZXh0LCAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBzdGFybWFwX25ldywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIGltYXAgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqaXRlcnM7Ci0JUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppdGVyczsKKyAgICBQeU9iamVjdCAqZnVuYzsKIH0gaW1hcG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpbWFwX3R5cGU7CkBAIC0xNDQxLDY2ICsxNDQxLDY2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW1hcF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKml0LCAqaXRlcnMsICpmdW5jOwotCWltYXBvYmplY3QgKmx6OwotCVB5X3NzaXplX3QgbnVtYXJncywgaTsKKyAgICBQeU9iamVjdCAqaXQsICppdGVycywgKmZ1bmM7CisgICAgaW1hcG9iamVjdCAqbHo7CisgICAgUHlfc3NpemVfdCBudW1hcmdzLCBpOwogCi0JaWYgKHR5cGUgPT0gJmltYXBfdHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImltYXAoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmaW1hcF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiaW1hcCgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbnVtYXJncyA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKLQlpZiAobnVtYXJncyA8IDIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgImltYXAoKSBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cy4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG51bWFyZ3MgPSBQeVR1cGxlX1NpemUoYXJncyk7CisgICAgaWYgKG51bWFyZ3MgPCAyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICJpbWFwKCkgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBhcmd1bWVudHMuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWl0ZXJzID0gUHlUdXBsZV9OZXcobnVtYXJncy0xKTsKLQlpZiAoaXRlcnMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXRlcnMgPSBQeVR1cGxlX05ldyhudW1hcmdzLTEpOworICAgIGlmIChpdGVycyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaT0xIDsgaTxudW1hcmdzIDsgaSsrKSB7Ci0JCS8qIEdldCBpdGVyYXRvci4gKi8KLQkJaXQgPSBQeU9iamVjdF9HZXRJdGVyKFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSkpOwotCQlpZiAoaXQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGl0ZXJzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0oaXRlcnMsIGktMSwgaXQpOwotCX0KKyAgICBmb3IgKGk9MSA7IGk8bnVtYXJncyA7IGkrKykgeworICAgICAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVycyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGl0ZXJzLCBpLTEsIGl0KTsKKyAgICB9CiAKLQkvKiBjcmVhdGUgaW1hcG9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChpbWFwb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0ZXJzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWx6LT5pdGVycyA9IGl0ZXJzOwotCWZ1bmMgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCVB5X0lOQ1JFRihmdW5jKTsKLQlsei0+ZnVuYyA9IGZ1bmM7CisgICAgLyogY3JlYXRlIGltYXBvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAoaW1hcG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdGVycyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsei0+aXRlcnMgPSBpdGVyczsKKyAgICBmdW5jID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgbHotPmZ1bmMgPSBmdW5jOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGltYXBfZGVhbGxvYyhpbWFwb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5pdGVycyk7Ci0JUHlfWERFQ1JFRihsei0+ZnVuYyk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPml0ZXJzKTsKKyAgICBQeV9YREVDUkVGKGx6LT5mdW5jKTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGltYXBfdHJhdmVyc2UoaW1hcG9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5pdGVycyk7Ci0JUHlfVklTSVQobHotPmZ1bmMpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGx6LT5pdGVycyk7CisgICAgUHlfVklTSVQobHotPmZ1bmMpOworICAgIHJldHVybiAwOwogfQogCi0vKgkKKy8qCiBpbWFwKCkgaXMgYW4gaXRlcmF0b3IgdmVyc2lvbiBvZiBfX2J1aWx0aW5zX18ubWFwKCkgZXhjZXB0IHRoYXQgaXQgZG9lcwogbm90IGhhdmUgdGhlIE5vbmUgZmlsbC1pbiBmZWF0dXJlLiAgVGhhdCB3YXMgaW50ZW50aW9uYWxseSBsZWZ0IG91dCBmb3IKIHRoZSBmb2xsb3dpbmcgcmVhc29uczoKQEAgLTE1MTEsMTUgKzE1MTEsMTUgQEAKICAgICAgaW5maW5pdGUgaXRlcmF0b3JzIGxpa2UgY291bnQoKSBhbmQgcmVwZWF0KCkgKGZvciBzdXBwbHlpbmcgc2VxdWVudGlhbAogICAgICBvciBjb25zdGFudCBhcmd1bWVudHMgdG8gYSBmdW5jdGlvbikuCiAKLSAgMikgSW4gdHlwaWNhbCB1c2UgY2FzZXMgZm9yIGNvbWJpbmluZyBpdGVydG9vbHMsIGhhdmluZyBvbmUgZmluaXRlIGRhdGEgCisgIDIpIEluIHR5cGljYWwgdXNlIGNhc2VzIGZvciBjb21iaW5pbmcgaXRlcnRvb2xzLCBoYXZpbmcgb25lIGZpbml0ZSBkYXRhCiAgICAgIHN1cHBsaWVyIHJ1biBvdXQgYmVmb3JlIGFub3RoZXIgaXMgbGlrZWx5IHRvIGJlIGFuIGVycm9yIGNvbmRpdGlvbiB3aGljaAogICAgICBzaG91bGQgbm90IHBhc3Mgc2lsZW50bHkgYnkgYXV0b21hdGljYWxseSBzdXBwbHlpbmcgTm9uZS4KIAogICAzKSBUaGUgdXNlIGNhc2VzIGZvciBhdXRvbWF0aWMgTm9uZSBmaWxsLWluIGFyZSByYXJlIC0tIG5vdCBtYW55IGZ1bmN0aW9ucwogICAgICBkbyBzb21ldGhpbmcgdXNlZnVsIHdoZW4gYSBwYXJhbWV0ZXIgc3VkZGVubHkgc3dpdGNoZXMgdHlwZSBhbmQgYmVjb21lcwotICAgICBOb25lLiAgCisgICAgIE5vbmUuCiAKLSAgNCkgSWYgYSBuZWVkIGRvZXMgYXJpc2UsIGl0IGNhbiBiZSBtZXQgYnkgX19idWlsdGluc19fLm1hcCgpIG9yIGJ5IAorICA0KSBJZiBhIG5lZWQgZG9lcyBhcmlzZSwgaXQgY2FuIGJlIG1ldCBieSBfX2J1aWx0aW5zX18ubWFwKCkgb3IgYnkKICAgICAgd3JpdGluZzogIGNoYWluKGl0ZXJhYmxlLCByZXBlYXQoTm9uZSkpLgogCiAgIDUpIFNpbWlsYXIgdG9vbHNldHMgaW4gSGFza2VsbCBhbmQgU01MIGRvIG5vdCBoYXZlIGF1dG9tYXRpYyBOb25lIGZpbGwtaW4uCkBAIC0xNTI4LDE4NyArMTUyOCwxODcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbWFwX25leHQoaW1hcG9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKnZhbDsKLQlQeU9iamVjdCAqYXJndHVwbGU7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IG51bWFyZ3MsIGk7CisgICAgUHlPYmplY3QgKnZhbDsKKyAgICBQeU9iamVjdCAqYXJndHVwbGU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG51bWFyZ3MsIGk7CiAKLQludW1hcmdzID0gUHlUdXBsZV9TaXplKGx6LT5pdGVycyk7Ci0JYXJndHVwbGUgPSBQeVR1cGxlX05ldyhudW1hcmdzKTsKLQlpZiAoYXJndHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbnVtYXJncyA9IFB5VHVwbGVfU2l6ZShsei0+aXRlcnMpOworICAgIGFyZ3R1cGxlID0gUHlUdXBsZV9OZXcobnVtYXJncyk7CisgICAgaWYgKGFyZ3R1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpPTAgOyBpPG51bWFyZ3MgOyBpKyspIHsKLQkJdmFsID0gUHlJdGVyX05leHQoUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpKTsKLQkJaWYgKHZhbCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYXJndHVwbGUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShhcmd0dXBsZSwgaSwgdmFsKTsKLQl9Ci0JaWYgKGx6LT5mdW5jID09IFB5X05vbmUpIAotCQlyZXR1cm4gYXJndHVwbGU7Ci0JcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChsei0+ZnVuYywgYXJndHVwbGUsIE5VTEwpOwotCVB5X0RFQ1JFRihhcmd0dXBsZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKGk9MCA7IGk8bnVtYXJncyA7IGkrKykgeworICAgICAgICB2YWwgPSBQeUl0ZXJfTmV4dChQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdGVycywgaSkpOworICAgICAgICBpZiAodmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmd0dXBsZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3R1cGxlLCBpLCB2YWwpOworICAgIH0KKyAgICBpZiAobHotPmZ1bmMgPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIGFyZ3R1cGxlOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwobHotPmZ1bmMsIGFyZ3R1cGxlLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoYXJndHVwbGUpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihpbWFwX2RvYywKICJpbWFwKGZ1bmMsICppdGVyYWJsZXMpIC0tPiBpbWFwIG9iamVjdFxuXAogXG5cCiBNYWtlIGFuIGl0ZXJhdG9yIHRoYXQgY29tcHV0ZXMgdGhlIGZ1bmN0aW9uIHVzaW5nIGFyZ3VtZW50cyBmcm9tXG5cCi1lYWNoIG9mIHRoZSBpdGVyYWJsZXMuCUxpa2UgbWFwKCkgZXhjZXB0IHRoYXQgaXQgcmV0dXJuc1xuXAorZWFjaCBvZiB0aGUgaXRlcmFibGVzLiAgTGlrZSBtYXAoKSBleGNlcHQgdGhhdCBpdCByZXR1cm5zXG5cCiBhbiBpdGVyYXRvciBpbnN0ZWFkIG9mIGEgbGlzdCBhbmQgdGhhdCBpdCBzdG9wcyB3aGVuIHRoZSBzaG9ydGVzdFxuXAogaXRlcmFibGUgaXMgZXhoYXVzdGVkIGluc3RlYWQgb2YgZmlsbGluZyBpbiBOb25lIGZvciBzaG9ydGVyXG5cCiBpdGVyYWJsZXMuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaW1hcF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuaW1hcCIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGltYXBvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaW1hcF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JaW1hcF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpbWFwX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpaW1hcF9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JaW1hcF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuaW1hcCIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoaW1hcG9iamVjdCksICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilpbWFwX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGltYXBfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpaW1hcF90cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpaW1hcF9uZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpbWFwX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIGNoYWluIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKnNvdXJjZTsJCS8qIEl0ZXJhdG9yIG92ZXIgaW5wdXQgaXRlcmFibGVzICovCi0JUHlPYmplY3QgKmFjdGl2ZTsJCS8qIEN1cnJlbnRseSBydW5uaW5nIGlucHV0IGl0ZXJhdG9yICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpzb3VyY2U7ICAgICAgICAgICAgICAgICAgIC8qIEl0ZXJhdG9yIG92ZXIgaW5wdXQgaXRlcmFibGVzICovCisgICAgUHlPYmplY3QgKmFjdGl2ZTsgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudGx5IHJ1bm5pbmcgaW5wdXQgaXRlcmF0b3IgKi8KIH0gY2hhaW5vYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY2hhaW5fdHlwZTsKIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogY2hhaW5fbmV3X2ludGVybmFsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnNvdXJjZSkKIHsKLQljaGFpbm9iamVjdCAqbHo7CisgICAgY2hhaW5vYmplY3QgKmx6OwogCi0JbHogPSAoY2hhaW5vYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoc291cmNlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCWx6LT5zb3VyY2UgPSBzb3VyY2U7Ci0JbHotPmFjdGl2ZSA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIGx6ID0gKGNoYWlub2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNvdXJjZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGx6LT5zb3VyY2UgPSBzb3VyY2U7CisgICAgbHotPmFjdGl2ZSA9IE5VTEw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2hhaW5fbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpzb3VyY2U7CisgICAgUHlPYmplY3QgKnNvdXJjZTsKIAotCWlmICh0eXBlID09ICZjaGFpbl90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiY2hhaW4oKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlzb3VyY2UgPSBQeU9iamVjdF9HZXRJdGVyKGFyZ3MpOwotCWlmIChzb3VyY2UgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJmNoYWluX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJjaGFpbigpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIGNoYWluX25ld19pbnRlcm5hbCh0eXBlLCBzb3VyY2UpOworICAgIHNvdXJjZSA9IFB5T2JqZWN0X0dldEl0ZXIoYXJncyk7CisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBjaGFpbl9uZXdfaW50ZXJuYWwodHlwZSwgc291cmNlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNoYWluX25ld19mcm9tX2l0ZXJhYmxlKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZykKIHsKLQlQeU9iamVjdCAqc291cmNlOwotCQotCXNvdXJjZSA9IFB5T2JqZWN0X0dldEl0ZXIoYXJnKTsKLQlpZiAoc291cmNlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpzb3VyY2U7CiAKLQlyZXR1cm4gY2hhaW5fbmV3X2ludGVybmFsKHR5cGUsIHNvdXJjZSk7CisgICAgc291cmNlID0gUHlPYmplY3RfR2V0SXRlcihhcmcpOworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gY2hhaW5fbmV3X2ludGVybmFsKHR5cGUsIHNvdXJjZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBjaGFpbl9kZWFsbG9jKGNoYWlub2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5hY3RpdmUpOwotCVB5X1hERUNSRUYobHotPnNvdXJjZSk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPmFjdGl2ZSk7CisgICAgUHlfWERFQ1JFRihsei0+c291cmNlKTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGNoYWluX3RyYXZlcnNlKGNoYWlub2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPnNvdXJjZSk7Ci0JUHlfVklTSVQobHotPmFjdGl2ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPnNvdXJjZSk7CisgICAgUHlfVklTSVQobHotPmFjdGl2ZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjaGFpbl9uZXh0KGNoYWlub2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqaXRlbTsKKyAgICBQeU9iamVjdCAqaXRlbTsKIAotCWlmIChsei0+c291cmNlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwkJCQkvKiBhbHJlYWR5IHN0b3BwZWQgKi8KKyAgICBpZiAobHotPnNvdXJjZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHJlYWR5IHN0b3BwZWQgKi8KIAotCWlmIChsei0+YWN0aXZlID09IE5VTEwpIHsKLQkJUHlPYmplY3QgKml0ZXJhYmxlID0gUHlJdGVyX05leHQobHotPnNvdXJjZSk7Ci0JCWlmIChpdGVyYWJsZSA9PSBOVUxMKSB7Ci0JCQlQeV9DTEVBUihsei0+c291cmNlKTsKLQkJCXJldHVybiBOVUxMOwkJCS8qIG5vIG1vcmUgaW5wdXQgc291cmNlcyAqLwotCQl9Ci0JCWx6LT5hY3RpdmUgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLQkJUHlfREVDUkVGKGl0ZXJhYmxlKTsKLQkJaWYgKGx6LT5hY3RpdmUgPT0gTlVMTCkgewotCQkJUHlfQ0xFQVIobHotPnNvdXJjZSk7Ci0JCQlyZXR1cm4gTlVMTDsJCQkvKiBpbnB1dCBub3QgaXRlcmFibGUgKi8KLQkJfQotCX0KLQlpdGVtID0gUHlJdGVyX05leHQobHotPmFjdGl2ZSk7Ci0JaWYgKGl0ZW0gIT0gTlVMTCkKLQkJcmV0dXJuIGl0ZW07Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlCi0JCQlyZXR1cm4gTlVMTDsgCQkJLyogaW5wdXQgcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLwotCX0KLQlQeV9DTEVBUihsei0+YWN0aXZlKTsKLQlyZXR1cm4gY2hhaW5fbmV4dChseik7CQkJLyogcmVjdXJzZSBhbmQgdXNlIG5leHQgYWN0aXZlICovCisgICAgaWYgKGx6LT5hY3RpdmUgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBQeUl0ZXJfTmV4dChsei0+c291cmNlKTsKKyAgICAgICAgaWYgKGl0ZXJhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0NMRUFSKGx6LT5zb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBubyBtb3JlIGlucHV0IHNvdXJjZXMgKi8KKyAgICAgICAgfQorICAgICAgICBsei0+YWN0aXZlID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVyYWJsZSk7CisgICAgICAgIGlmIChsei0+YWN0aXZlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0NMRUFSKGx6LT5zb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBub3QgaXRlcmFibGUgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpdGVtID0gUHlJdGVyX05leHQobHotPmFjdGl2ZSk7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IHJhaXNlZCBhbiBleGNlcHRpb24gKi8KKyAgICB9CisgICAgUHlfQ0xFQVIobHotPmFjdGl2ZSk7CisgICAgcmV0dXJuIGNoYWluX25leHQobHopOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWN1cnNlIGFuZCB1c2UgbmV4dCBhY3RpdmUgKi8KIH0KIAogUHlEb2NfU1RSVkFSKGNoYWluX2RvYywKQEAgLTE3MjUsNjQgKzE3MjUsNjQgQEAKIHRoYXQgZXZhbHVhdGVzIGxhemlseS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGNoYWluX21ldGhvZHNbXSA9IHsKLQl7ImZyb21faXRlcmFibGUiLCAoUHlDRnVuY3Rpb24pIGNoYWluX25ld19mcm9tX2l0ZXJhYmxlLAlNRVRIX08gfCBNRVRIX0NMQVNTLAotCQljaGFpbl9mcm9tX2l0ZXJhYmxlX2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiZnJvbV9pdGVyYWJsZSIsIChQeUNGdW5jdGlvbikgY2hhaW5fbmV3X2Zyb21faXRlcmFibGUsICAgICAgICAgICAgTUVUSF9PIHwgTUVUSF9DTEFTUywKKyAgICAgICAgY2hhaW5fZnJvbV9pdGVyYWJsZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjaGFpbl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuY2hhaW4iLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihjaGFpbm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciljaGFpbl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JY2hhaW5fZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY2hhaW5fdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYyljaGFpbl9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCWNoYWluX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQljaGFpbl9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuY2hhaW4iLCAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoY2hhaW5vYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciljaGFpbl9kZWFsbG9jLCAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGNoYWluX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpY2hhaW5fdHJhdmVyc2UsICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpY2hhaW5fbmV4dCwgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgY2hhaW5fbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBjaGFpbl9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIHByb2R1Y3Qgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqcG9vbHM7CQkvKiB0dXBsZSBvZiBwb29sIHR1cGxlcyAqLwotCVB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciBwb29sICovCi0JUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotCWludCBzdG9wcGVkOyAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgcHJvZHVjdCBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnBvb2xzOyAgICAgICAgICAgICAgICAgICAgLyogdHVwbGUgb2YgcG9vbCB0dXBsZXMgKi8KKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAgICAgICAgIC8qIG9uZSBpbmRleCBwZXIgcG9vbCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KKyAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAgIC8qIHNldCB0byAxIHdoZW4gdGhlIHByb2R1Y3QgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHByb2R1Y3RvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcHJvZHVjdF90eXBlOwpAQCAtMTc5MCwxODAgKzE3OTAsMTgwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHJvZHVjdF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcHJvZHVjdG9iamVjdCAqbHo7Ci0JUHlfc3NpemVfdCBuYXJncywgbnBvb2xzLCByZXBlYXQ9MTsKLQlQeU9iamVjdCAqcG9vbHMgPSBOVUxMOwotCVB5X3NzaXplX3QgKmluZGljZXMgPSBOVUxMOwotCVB5X3NzaXplX3QgaTsKKyAgICBwcm9kdWN0b2JqZWN0ICpsejsKKyAgICBQeV9zc2l6ZV90IG5hcmdzLCBucG9vbHMsIHJlcGVhdD0xOworICAgIFB5T2JqZWN0ICpwb29scyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCAqaW5kaWNlcyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBpOwogCi0JaWYgKGt3ZHMgIT0gTlVMTCkgewotCQljaGFyICprd2xpc3RbXSA9IHsicmVwZWF0IiwgMH07Ci0JCVB5T2JqZWN0ICp0bXBhcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0JCWlmICh0bXBhcmdzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHModG1wYXJncywga3dkcywgInxuOnByb2R1Y3QiLCBrd2xpc3QsICZyZXBlYXQpKSB7Ci0JCQlQeV9ERUNSRUYodG1wYXJncyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYodG1wYXJncyk7Ci0JCWlmIChyZXBlYXQgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgCi0JCQkJCSJyZXBlYXQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoa3dkcyAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgKmt3bGlzdFtdID0geyJyZXBlYXQiLCAwfTsKKyAgICAgICAgUHlPYmplY3QgKnRtcGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgaWYgKHRtcGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcyh0bXBhcmdzLCBrd2RzLCAifG46cHJvZHVjdCIsIGt3bGlzdCwgJnJlcGVhdCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXBhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRih0bXBhcmdzKTsKKyAgICAgICAgaWYgKHJlcGVhdCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXQgYXJndW1lbnQgY2Fubm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLQluYXJncyA9IChyZXBlYXQgPT0gMCkgPyAwIDogUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQlucG9vbHMgPSBuYXJncyAqIHJlcGVhdDsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgbmFyZ3MgPSAocmVwZWF0ID09IDApID8gMCA6IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgbnBvb2xzID0gbmFyZ3MgKiByZXBlYXQ7CiAKLQlpbmRpY2VzID0gUHlNZW1fTWFsbG9jKG5wb29scyAqIHNpemVvZihQeV9zc2l6ZV90KSk7Ci0JaWYgKGluZGljZXMgPT0gTlVMTCkgewotICAgIAkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaW5kaWNlcyA9IFB5TWVtX01hbGxvYyhucG9vbHMgKiBzaXplb2YoUHlfc3NpemVfdCkpOworICAgIGlmIChpbmRpY2VzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlwb29scyA9IFB5VHVwbGVfTmV3KG5wb29scyk7Ci0JaWYgKHBvb2xzID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7CisgICAgcG9vbHMgPSBQeVR1cGxlX05ldyhucG9vbHMpOworICAgIGlmIChwb29scyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JZm9yIChpPTA7IGkgPCBuYXJncyA7ICsraSkgewotCQlQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCVB5T2JqZWN0ICpwb29sID0gUHlTZXF1ZW5jZV9UdXBsZShpdGVtKTsKLQkJaWYgKHBvb2wgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocG9vbHMsIGksIHBvb2wpOwotCQlpbmRpY2VzW2ldID0gMDsKLQl9Ci0JZm9yICggOyBpIDwgbnBvb2xzOyArK2kpIHsKLQkJUHlPYmplY3QgKnBvb2wgPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2xzLCBpIC0gbmFyZ3MpOwotCQlQeV9JTkNSRUYocG9vbCk7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocG9vbHMsIGksIHBvb2wpOwotCQlpbmRpY2VzW2ldID0gMDsKLQl9CisgICAgZm9yIChpPTA7IGkgPCBuYXJncyA7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIFB5T2JqZWN0ICpwb29sID0gUHlTZXF1ZW5jZV9UdXBsZShpdGVtKTsKKyAgICAgICAgaWYgKHBvb2wgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocG9vbHMsIGksIHBvb2wpOworICAgICAgICBpbmRpY2VzW2ldID0gMDsKKyAgICB9CisgICAgZm9yICggOyBpIDwgbnBvb2xzOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKnBvb2wgPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2xzLCBpIC0gbmFyZ3MpOworICAgICAgICBQeV9JTkNSRUYocG9vbCk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocG9vbHMsIGksIHBvb2wpOworICAgICAgICBpbmRpY2VzW2ldID0gMDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgcHJvZHVjdG9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlseiA9IChwcm9kdWN0b2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGx6ID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7CisgICAgLyogY3JlYXRlIHByb2R1Y3RvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAocHJvZHVjdG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JbHotPnBvb2xzID0gcG9vbHM7Ci0JbHotPmluZGljZXMgPSBpbmRpY2VzOwotCWx6LT5yZXN1bHQgPSBOVUxMOwotCWx6LT5zdG9wcGVkID0gMDsKKyAgICBsei0+cG9vbHMgPSBwb29sczsKKyAgICBsei0+aW5kaWNlcyA9IGluZGljZXM7CisgICAgbHotPnJlc3VsdCA9IE5VTEw7CisgICAgbHotPnN0b3BwZWQgPSAwOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIAogZXJyb3I6Ci0JaWYgKGluZGljZXMgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShpbmRpY2VzKTsKLQlQeV9YREVDUkVGKHBvb2xzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoaW5kaWNlcyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKGluZGljZXMpOworICAgIFB5X1hERUNSRUYocG9vbHMpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAogcHJvZHVjdF9kZWFsbG9jKHByb2R1Y3RvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPnBvb2xzKTsKLQlQeV9YREVDUkVGKGx6LT5yZXN1bHQpOwotCVB5TWVtX0ZyZWUobHotPmluZGljZXMpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5wb29scyk7CisgICAgUHlfWERFQ1JFRihsei0+cmVzdWx0KTsKKyAgICBQeU1lbV9GcmVlKGx6LT5pbmRpY2VzKTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIHByb2R1Y3RfdHJhdmVyc2UocHJvZHVjdG9iamVjdCAqbHosIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGx6LT5wb29scyk7Ci0JUHlfVklTSVQobHotPnJlc3VsdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPnBvb2xzKTsKKyAgICBQeV9WSVNJVChsei0+cmVzdWx0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb2R1Y3RfbmV4dChwcm9kdWN0b2JqZWN0ICpseikKIHsKLQlQeU9iamVjdCAqcG9vbDsKLQlQeU9iamVjdCAqZWxlbTsKLQlQeU9iamVjdCAqb2xkZWxlbTsKLQlQeU9iamVjdCAqcG9vbHMgPSBsei0+cG9vbHM7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7Ci0JUHlfc3NpemVfdCBucG9vbHMgPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2xzKTsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnBvb2w7CisgICAgUHlPYmplY3QgKmVsZW07CisgICAgUHlPYmplY3QgKm9sZGVsZW07CisgICAgUHlPYmplY3QgKnBvb2xzID0gbHotPnBvb2xzOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBsei0+cmVzdWx0OworICAgIFB5X3NzaXplX3QgbnBvb2xzID0gUHlUdXBsZV9HRVRfU0laRShwb29scyk7CisgICAgUHlfc3NpemVfdCBpOwogCi0JaWYgKGx6LT5zdG9wcGVkKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobHotPnN0b3BwZWQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLyogT24gdGhlIGZpcnN0IHBhc3MsIHJldHVybiBhbiBpbml0aWFsIHR1cGxlIGZpbGxlZCB3aXRoIHRoZSAKLSAgICAgICAgICAgICAgICAgICBmaXJzdCBlbGVtZW50IGZyb20gZWFjaCBwb29sLiAqLwotCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhucG9vbHMpOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICAJCWdvdG8gZW1wdHk7Ci0JCWx6LT5yZXN1bHQgPSByZXN1bHQ7Ci0JCWZvciAoaT0wOyBpIDwgbnBvb2xzOyBpKyspIHsKLQkJCXBvb2wgPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2xzLCBpKTsKLQkJCWlmIChQeVR1cGxlX0dFVF9TSVpFKHBvb2wpID09IDApCi0JCQkJZ290byBlbXB0eTsKLSAgICAJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCAwKTsKLSAgICAJCQlQeV9JTkNSRUYoZWxlbSk7Ci0gICAgCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJUHlfc3NpemVfdCAqaW5kaWNlcyA9IGx6LT5pbmRpY2VzOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAvKiBPbiB0aGUgZmlyc3QgcGFzcywgcmV0dXJuIGFuIGluaXRpYWwgdHVwbGUgZmlsbGVkIHdpdGggdGhlCisgICAgICAgICAgIGZpcnN0IGVsZW1lbnQgZnJvbSBlYWNoIHBvb2wuICovCisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KG5wb29scyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgICAgIGx6LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgIGZvciAoaT0wOyBpIDwgbnBvb2xzOyBpKyspIHsKKyAgICAgICAgICAgIHBvb2wgPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2xzLCBpKTsKKyAgICAgICAgICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKHBvb2wpID09IDApCisgICAgICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIDApOworICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfc3NpemVfdCAqaW5kaWNlcyA9IGx6LT5pbmRpY2VzOwogCi0JCS8qIENvcHkgdGhlIHByZXZpb3VzIHJlc3VsdCB0dXBsZSBvciByZS11c2UgaXQgaWYgYXZhaWxhYmxlICovCi0JCWlmIChQeV9SRUZDTlQocmVzdWx0KSA+IDEpIHsKLQkJCVB5T2JqZWN0ICpvbGRfcmVzdWx0ID0gcmVzdWx0OwotCQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcobnBvb2xzKTsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCQlnb3RvIGVtcHR5OwotCQkJbHotPnJlc3VsdCA9IHJlc3VsdDsKLQkJCWZvciAoaT0wOyBpIDwgbnBvb2xzOyBpKyspIHsKLQkJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShvbGRfcmVzdWx0LCBpKTsKLSAgICAJCQkJUHlfSU5DUkVGKGVsZW0pOwotICAgIAkJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYob2xkX3Jlc3VsdCk7Ci0JCX0KLQkJLyogTm93LCB3ZSd2ZSBnb3QgdGhlIG9ubHkgY29weSBzbyB3ZSBjYW4gdXBkYXRlIGl0IGluLXBsYWNlICovCi0JCWFzc2VydCAobnBvb2xzPT0wIHx8IFB5X1JFRkNOVChyZXN1bHQpID09IDEpOworICAgICAgICAvKiBDb3B5IHRoZSBwcmV2aW91cyByZXN1bHQgdHVwbGUgb3IgcmUtdXNlIGl0IGlmIGF2YWlsYWJsZSAqLworICAgICAgICBpZiAoUHlfUkVGQ05UKHJlc3VsdCkgPiAxKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqb2xkX3Jlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KG5wb29scyk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICAgICAgICAgIGx6LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG5wb29sczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX3Jlc3VsdCwgaSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRfcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICAvKiBOb3csIHdlJ3ZlIGdvdCB0aGUgb25seSBjb3B5IHNvIHdlIGNhbiB1cGRhdGUgaXQgaW4tcGxhY2UgKi8KKyAgICAgICAgYXNzZXJ0IChucG9vbHM9PTAgfHwgUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSk7CiAKLSAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIHBvb2wgaW5kaWNlcyByaWdodC10by1sZWZ0LiAgT25seSBhZHZhbmNlIHRvIHRoZQotICAgICAgICAgICAgICAgICAgIG5leHQgcG9vbCB3aGVuIHRoZSBwcmV2aW91cyBvbmUgcm9sbHMtb3ZlciAqLwotCQlmb3IgKGk9bnBvb2xzLTEgOyBpID49IDAgOyBpLS0pIHsKLQkJCXBvb2wgPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2xzLCBpKTsKLQkJCWluZGljZXNbaV0rKzsKLQkJCWlmIChpbmRpY2VzW2ldID09IFB5VHVwbGVfR0VUX1NJWkUocG9vbCkpIHsKLQkJCQkvKiBSb2xsLW92ZXIgYW5kIGFkdmFuY2UgdG8gbmV4dCBwb29sICovCi0JCQkJaW5kaWNlc1tpXSA9IDA7Ci0JCQkJZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgMCk7Ci0JCQkJUHlfSU5DUkVGKGVsZW0pOwotCQkJCW9sZGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgaSk7Ci0JCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQkJCVB5X0RFQ1JFRihvbGRlbGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogTm8gcm9sbG92ZXIuIEp1c3QgaW5jcmVtZW50IGFuZCBzdG9wIGhlcmUuICovCi0JCQkJZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgaW5kaWNlc1tpXSk7Ci0JCQkJUHlfSU5DUkVGKGVsZW0pOwotCQkJCW9sZGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgaSk7Ci0JCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQkJCVB5X0RFQ1JFRihvbGRlbGVtKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQorICAgICAgICAvKiBVcGRhdGUgdGhlIHBvb2wgaW5kaWNlcyByaWdodC10by1sZWZ0LiAgT25seSBhZHZhbmNlIHRvIHRoZQorICAgICAgICAgICBuZXh0IHBvb2wgd2hlbiB0aGUgcHJldmlvdXMgb25lIHJvbGxzLW92ZXIgKi8KKyAgICAgICAgZm9yIChpPW5wb29scy0xIDsgaSA+PSAwIDsgaS0tKSB7CisgICAgICAgICAgICBwb29sID0gUHlUdXBsZV9HRVRfSVRFTShwb29scywgaSk7CisgICAgICAgICAgICBpbmRpY2VzW2ldKys7CisgICAgICAgICAgICBpZiAoaW5kaWNlc1tpXSA9PSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpKSB7CisgICAgICAgICAgICAgICAgLyogUm9sbC1vdmVyIGFuZCBhZHZhbmNlIHRvIG5leHQgcG9vbCAqLworICAgICAgICAgICAgICAgIGluZGljZXNbaV0gPSAwOworICAgICAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIDApOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgICAgICBvbGRlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIE5vIHJvbGxvdmVyLiBKdXN0IGluY3JlbWVudCBhbmQgc3RvcCBoZXJlLiAqLworICAgICAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGljZXNbaV0pOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgICAgICAgICBvbGRlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbmRpY2VzIGhhdmUgYWxsIHJvbGxlZC1vdmVyCi0gICAgICAgICAgICAgICAgICAgYW5kIHdlJ3JlIGRvbmUuICovCi0JCWlmIChpIDwgMCkKLQkJCWdvdG8gZW1wdHk7Ci0JfQorICAgICAgICAvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbmRpY2VzIGhhdmUgYWxsIHJvbGxlZC1vdmVyCisgICAgICAgICAgIGFuZCB3ZSdyZSBkb25lLiAqLworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBnb3RvIGVtcHR5OworICAgIH0KIAotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogZW1wdHk6Ci0JbHotPnN0b3BwZWQgPSAxOwotCXJldHVybiBOVUxMOworICAgIGx6LT5zdG9wcGVkID0gMTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHByb2R1Y3RfZG9jLApAQCAtMTk3OCw1OSArMTk3OCw1OSBAQAogcHJvZHVjdCgoMCwxKSwgKDAsMSksICgwLDEpKSAtLT4gKDAsMCwwKSAoMCwwLDEpICgwLDEsMCkgKDAsMSwxKSAoMSwwLDApIC4uLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHByb2R1Y3RfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiaXRlcnRvb2xzLnByb2R1Y3QiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihwcm9kdWN0b2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpcHJvZHVjdF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JcHJvZHVjdF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylwcm9kdWN0X3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpcHJvZHVjdF9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JcHJvZHVjdF9uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMucHJvZHVjdCIsICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YocHJvZHVjdG9iamVjdCksICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpcHJvZHVjdF9kZWFsbG9jLCAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBwcm9kdWN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXByb2R1Y3RfdHJhdmVyc2UsICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXByb2R1Y3RfbmV4dCwgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgcHJvZHVjdF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBjb21iaW5hdGlvbnMgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqcG9vbDsJCQkvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLwotCVB5X3NzaXplX3QgKmluZGljZXM7ICAgICAgICAgICAgLyogb25lIGluZGV4IHBlciByZXN1bHQgZWxlbWVudCAqLwotCVB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgICAgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KLQlQeV9zc2l6ZV90IHI7CQkJLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KLQlpbnQgc3RvcHBlZDsJCQkvKiBzZXQgdG8gMSB3aGVuIHRoZSBjb21iaW5hdGlvbnMgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpwb29sOyAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCisgICAgUHlfc3NpemVfdCAqaW5kaWNlczsgICAgICAgICAgICAvKiBvbmUgaW5kZXggcGVyIHJlc3VsdCBlbGVtZW50ICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLworICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgY29tYmluYXRpb25zIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBjb21iaW5hdGlvbnNvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY29tYmluYXRpb25zX3R5cGU7CkBAIC0yMDM4LDE1OSArMjAzOCwxNTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21iaW5hdGlvbnNfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWNvbWJpbmF0aW9uc29iamVjdCAqY287Ci0JUHlfc3NpemVfdCBuOwotCVB5X3NzaXplX3QgcjsKLQlQeU9iamVjdCAqcG9vbCA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKLQlQeV9zc2l6ZV90ICppbmRpY2VzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGk7Ci0Jc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJpdGVyYWJsZSIsICJyIiwgTlVMTH07Ci0gCi0gCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPbjpjb21iaW5hdGlvbnMiLCBrd2FyZ3MsIAotCQkJCQkgJml0ZXJhYmxlLCAmcikpCi0JCXJldHVybiBOVUxMOworICAgIGNvbWJpbmF0aW9uc29iamVjdCAqY287CisgICAgUHlfc3NpemVfdCBuOworICAgIFB5X3NzaXplX3QgcjsKKyAgICBQeU9iamVjdCAqcG9vbCA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgc3RhdGljIGNoYXIgKmt3YXJnc1tdID0geyJpdGVyYWJsZSIsICJyIiwgTlVMTH07CiAKLQlwb29sID0gUHlTZXF1ZW5jZV9UdXBsZShpdGVyYWJsZSk7Ci0JaWYgKHBvb2wgPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQluID0gUHlUdXBsZV9HRVRfU0laRShwb29sKTsKLQlpZiAociA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPbjpjb21iaW5hdGlvbnMiLCBrd2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZXJhYmxlLCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaW5kaWNlcyA9IFB5TWVtX01hbGxvYyhyICogc2l6ZW9mKFB5X3NzaXplX3QpKTsKLQlpZiAoaW5kaWNlcyA9PSBOVUxMKSB7Ci0gICAgCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBwb29sID0gUHlTZXF1ZW5jZV9UdXBsZShpdGVyYWJsZSk7CisgICAgaWYgKHBvb2wgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShwb29sKTsKKyAgICBpZiAociA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JZm9yIChpPTAgOyBpPHIgOyBpKyspCi0JCWluZGljZXNbaV0gPSBpOworICAgIGluZGljZXMgPSBQeU1lbV9NYWxsb2MociAqIHNpemVvZihQeV9zc2l6ZV90KSk7CisgICAgaWYgKGluZGljZXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIGNyZWF0ZSBjb21iaW5hdGlvbnNvYmplY3Qgc3RydWN0dXJlICovCi0JY28gPSAoY29tYmluYXRpb25zb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKGNvID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7CisgICAgZm9yIChpPTAgOyBpPHIgOyBpKyspCisgICAgICAgIGluZGljZXNbaV0gPSBpOwogCi0JY28tPnBvb2wgPSBwb29sOwotCWNvLT5pbmRpY2VzID0gaW5kaWNlczsKLQljby0+cmVzdWx0ID0gTlVMTDsKLQljby0+ciA9IHI7Ci0JY28tPnN0b3BwZWQgPSByID4gbiA/IDEgOiAwOworICAgIC8qIGNyZWF0ZSBjb21iaW5hdGlvbnNvYmplY3Qgc3RydWN0dXJlICovCisgICAgY28gPSAoY29tYmluYXRpb25zb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopY287CisgICAgY28tPnBvb2wgPSBwb29sOworICAgIGNvLT5pbmRpY2VzID0gaW5kaWNlczsKKyAgICBjby0+cmVzdWx0ID0gTlVMTDsKKyAgICBjby0+ciA9IHI7CisgICAgY28tPnN0b3BwZWQgPSByID4gbiA/IDEgOiAwOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKWNvOwogCiBlcnJvcjoKLQlpZiAoaW5kaWNlcyAhPSBOVUxMKQotCQlQeU1lbV9GcmVlKGluZGljZXMpOwotCVB5X1hERUNSRUYocG9vbCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGluZGljZXMgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRnJlZShpbmRpY2VzKTsKKyAgICBQeV9YREVDUkVGKHBvb2wpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAogY29tYmluYXRpb25zX2RlYWxsb2MoY29tYmluYXRpb25zb2JqZWN0ICpjbykKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGNvKTsKLQlQeV9YREVDUkVGKGNvLT5wb29sKTsKLQlQeV9YREVDUkVGKGNvLT5yZXN1bHQpOwotCVB5TWVtX0ZyZWUoY28tPmluZGljZXMpOwotCVB5X1RZUEUoY28pLT50cF9mcmVlKGNvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGNvKTsKKyAgICBQeV9YREVDUkVGKGNvLT5wb29sKTsKKyAgICBQeV9YREVDUkVGKGNvLT5yZXN1bHQpOworICAgIFB5TWVtX0ZyZWUoY28tPmluZGljZXMpOworICAgIFB5X1RZUEUoY28pLT50cF9mcmVlKGNvKTsKIH0KIAogc3RhdGljIGludAogY29tYmluYXRpb25zX3RyYXZlcnNlKGNvbWJpbmF0aW9uc29iamVjdCAqY28sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGNvLT5wb29sKTsKLQlQeV9WSVNJVChjby0+cmVzdWx0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChjby0+cG9vbCk7CisgICAgUHlfVklTSVQoY28tPnJlc3VsdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21iaW5hdGlvbnNfbmV4dChjb21iaW5hdGlvbnNvYmplY3QgKmNvKQogewotCVB5T2JqZWN0ICplbGVtOwotCVB5T2JqZWN0ICpvbGRlbGVtOwotCVB5T2JqZWN0ICpwb29sID0gY28tPnBvb2w7Ci0JUHlfc3NpemVfdCAqaW5kaWNlcyA9IGNvLT5pbmRpY2VzOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBjby0+cmVzdWx0OwotCVB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUocG9vbCk7Ci0JUHlfc3NpemVfdCByID0gY28tPnI7Ci0JUHlfc3NpemVfdCBpLCBqLCBpbmRleDsKKyAgICBQeU9iamVjdCAqZWxlbTsKKyAgICBQeU9iamVjdCAqb2xkZWxlbTsKKyAgICBQeU9iamVjdCAqcG9vbCA9IGNvLT5wb29sOworICAgIFB5X3NzaXplX3QgKmluZGljZXMgPSBjby0+aW5kaWNlczsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gY28tPnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOworICAgIFB5X3NzaXplX3QgciA9IGNvLT5yOworICAgIFB5X3NzaXplX3QgaSwgaiwgaW5kZXg7CiAKLQlpZiAoY28tPnN0b3BwZWQpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChjby0+c3RvcHBlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBPbiB0aGUgZmlyc3QgcGFzcywgaW5pdGlhbGl6ZSByZXN1bHQgdHVwbGUgdXNpbmcgdGhlIGluZGljZXMgKi8KLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgIAkJZ290byBlbXB0eTsKLQkJY28tPnJlc3VsdCA9IHJlc3VsdDsKLQkJZm9yIChpPTA7IGk8ciA7IGkrKykgewotCQkJaW5kZXggPSBpbmRpY2VzW2ldOwotICAgIAkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKLSAgICAJCQlQeV9JTkNSRUYoZWxlbSk7Ci0gICAgCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogQ29weSB0aGUgcHJldmlvdXMgcmVzdWx0IHR1cGxlIG9yIHJlLXVzZSBpdCBpZiBhdmFpbGFibGUgKi8KLQkJaWYgKFB5X1JFRkNOVChyZXN1bHQpID4gMSkgewotCQkJUHlPYmplY3QgKm9sZF9yZXN1bHQgPSByZXN1bHQ7Ci0JCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhyKTsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCQlnb3RvIGVtcHR5OwotCQkJY28tPnJlc3VsdCA9IHJlc3VsdDsKLQkJCWZvciAoaT0wOyBpPHIgOyBpKyspIHsKLQkJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShvbGRfcmVzdWx0LCBpKTsKLSAgICAJCQkJUHlfSU5DUkVGKGVsZW0pOwotICAgIAkJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYob2xkX3Jlc3VsdCk7Ci0JCX0KLQkJLyogTm93LCB3ZSd2ZSBnb3QgdGhlIG9ubHkgY29weSBzbyB3ZSBjYW4gdXBkYXRlIGl0IGluLXBsYWNlIAotCQkgKiBDUHl0aG9uJ3MgZW1wdHkgdHVwbGUgaXMgYSBzaW5nbGV0b24gYW5kIGNhY2hlZCBpbiAKLQkJICogUHlUdXBsZSdzIGZyZWVsaXN0LiAKLQkJICovCi0JCWFzc2VydChyID09IDAgfHwgUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIC8qIE9uIHRoZSBmaXJzdCBwYXNzLCBpbml0aWFsaXplIHJlc3VsdCB0dXBsZSB1c2luZyB0aGUgaW5kaWNlcyAqLworICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICAgICAgY28tPnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgZm9yIChpPTA7IGk8ciA7IGkrKykgeworICAgICAgICAgICAgaW5kZXggPSBpbmRpY2VzW2ldOworICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgaW5kZXgpOworICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ29weSB0aGUgcHJldmlvdXMgcmVzdWx0IHR1cGxlIG9yIHJlLXVzZSBpdCBpZiBhdmFpbGFibGUgKi8KKyAgICAgICAgaWYgKFB5X1JFRkNOVChyZXN1bHQpID4gMSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm9sZF9yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhyKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVtcHR5OworICAgICAgICAgICAgY28tPnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHIgOyBpKyspIHsKKyAgICAgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShvbGRfcmVzdWx0LCBpKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKG9sZF9yZXN1bHQpOworICAgICAgICB9CisgICAgICAgIC8qIE5vdywgd2UndmUgZ290IHRoZSBvbmx5IGNvcHkgc28gd2UgY2FuIHVwZGF0ZSBpdCBpbi1wbGFjZQorICAgICAgICAgKiBDUHl0aG9uJ3MgZW1wdHkgdHVwbGUgaXMgYSBzaW5nbGV0b24gYW5kIGNhY2hlZCBpbgorICAgICAgICAgKiBQeVR1cGxlJ3MgZnJlZWxpc3QuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQociA9PSAwIHx8IFB5X1JFRkNOVChyZXN1bHQpID09IDEpOwogCi0gICAgICAgICAgICAgICAgLyogU2NhbiBpbmRpY2VzIHJpZ2h0LXRvLWxlZnQgdW50aWwgZmluZGluZyBvbmUgdGhhdCBpcyBub3QKLSAgICAgICAgICAgICAgICAgICBhdCBpdHMgbWF4aW11bSAoaSArIG4gLSByKS4gKi8KLQkJZm9yIChpPXItMSA7IGkgPj0gMCAmJiBpbmRpY2VzW2ldID09IGkrbi1yIDsgaS0tKQotCQkJOworICAgICAgICAvKiBTY2FuIGluZGljZXMgcmlnaHQtdG8tbGVmdCB1bnRpbCBmaW5kaW5nIG9uZSB0aGF0IGlzIG5vdAorICAgICAgICAgICBhdCBpdHMgbWF4aW11bSAoaSArIG4gLSByKS4gKi8KKyAgICAgICAgZm9yIChpPXItMSA7IGkgPj0gMCAmJiBpbmRpY2VzW2ldID09IGkrbi1yIDsgaS0tKQorICAgICAgICAgICAgOwogCi0JCS8qIElmIGkgaXMgbmVnYXRpdmUsIHRoZW4gdGhlIGluZGljZXMgYXJlIGFsbCBhdAotICAgICAgICAgICAgICAgICAgIHRoZWlyIG1heGltdW0gdmFsdWUgYW5kIHdlJ3JlIGRvbmUuICovCi0JCWlmIChpIDwgMCkKLQkJCWdvdG8gZW1wdHk7CisgICAgICAgIC8qIElmIGkgaXMgbmVnYXRpdmUsIHRoZW4gdGhlIGluZGljZXMgYXJlIGFsbCBhdAorICAgICAgICAgICB0aGVpciBtYXhpbXVtIHZhbHVlIGFuZCB3ZSdyZSBkb25lLiAqLworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBnb3RvIGVtcHR5OwogCi0JCS8qIEluY3JlbWVudCB0aGUgY3VycmVudCBpbmRleCB3aGljaCB3ZSBrbm93IGlzIG5vdCBhdCBpdHMKLSAgICAgICAgICAgICAgICAgICBtYXhpbXVtLiAgVGhlbiBtb3ZlIGJhY2sgdG8gdGhlIHJpZ2h0IHNldHRpbmcgZWFjaCBpbmRleAotICAgICAgICAgICAgICAgICAgIHRvIGl0cyBsb3dlc3QgcG9zc2libGUgdmFsdWUgKG9uZSBoaWdoZXIgdGhhbiB0aGUgaW5kZXgKLSAgICAgICAgICAgICAgICAgICB0byBpdHMgbGVmdCAtLSB0aGlzIG1haW50YWlucyB0aGUgc29ydCBvcmRlciBpbnZhcmlhbnQpLiAqLwotCQlpbmRpY2VzW2ldKys7Ci0JCWZvciAoaj1pKzEgOyBqPHIgOyBqKyspCi0JCQlpbmRpY2VzW2pdID0gaW5kaWNlc1tqLTFdICsgMTsKKyAgICAgICAgLyogSW5jcmVtZW50IHRoZSBjdXJyZW50IGluZGV4IHdoaWNoIHdlIGtub3cgaXMgbm90IGF0IGl0cworICAgICAgICAgICBtYXhpbXVtLiAgVGhlbiBtb3ZlIGJhY2sgdG8gdGhlIHJpZ2h0IHNldHRpbmcgZWFjaCBpbmRleAorICAgICAgICAgICB0byBpdHMgbG93ZXN0IHBvc3NpYmxlIHZhbHVlIChvbmUgaGlnaGVyIHRoYW4gdGhlIGluZGV4CisgICAgICAgICAgIHRvIGl0cyBsZWZ0IC0tIHRoaXMgbWFpbnRhaW5zIHRoZSBzb3J0IG9yZGVyIGludmFyaWFudCkuICovCisgICAgICAgIGluZGljZXNbaV0rKzsKKyAgICAgICAgZm9yIChqPWkrMSA7IGo8ciA7IGorKykKKyAgICAgICAgICAgIGluZGljZXNbal0gPSBpbmRpY2VzW2otMV0gKyAxOwogCi0JCS8qIFVwZGF0ZSB0aGUgcmVzdWx0IHR1cGxlIGZvciB0aGUgbmV3IGluZGljZXMKLQkJICAgc3RhcnRpbmcgd2l0aCBpLCB0aGUgbGVmdG1vc3QgaW5kZXggdGhhdCBjaGFuZ2VkICovCi0JCWZvciAoIDsgaTxyIDsgaSsrKSB7Ci0JCQlpbmRleCA9IGluZGljZXNbaV07Ci0JCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShwb29sLCBpbmRleCk7Ci0JCQlQeV9JTkNSRUYoZWxlbSk7Ci0JCQlvbGRlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQkJUHlfREVDUkVGKG9sZGVsZW0pOwotCQl9Ci0JfQorICAgICAgICAvKiBVcGRhdGUgdGhlIHJlc3VsdCB0dXBsZSBmb3IgdGhlIG5ldyBpbmRpY2VzCisgICAgICAgICAgIHN0YXJ0aW5nIHdpdGggaSwgdGhlIGxlZnRtb3N0IGluZGV4IHRoYXQgY2hhbmdlZCAqLworICAgICAgICBmb3IgKCA7IGk8ciA7IGkrKykgeworICAgICAgICAgICAgaW5kZXggPSBpbmRpY2VzW2ldOworICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgaW5kZXgpOworICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgb2xkZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRlbGVtKTsKKyAgICAgICAgfQorICAgIH0KIAotCVB5X0lOQ1JFRihyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogZW1wdHk6Ci0JY28tPnN0b3BwZWQgPSAxOwotCXJldHVybiBOVUxMOworICAgIGNvLT5zdG9wcGVkID0gMTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGNvbWJpbmF0aW9uc19kb2MsCkBAIC0yMjAwLDUyICsyMjAwLDUyIEBACiBjb21iaW5hdGlvbnMocmFuZ2UoNCksIDMpIC0tPiAoMCwxLDIpLCAoMCwxLDMpLCAoMCwyLDMpLCAoMSwyLDMpIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY29tYmluYXRpb25zX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5jb21iaW5hdGlvbnMiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihjb21iaW5hdGlvbnNvYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvciljb21iaW5hdGlvbnNfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWNvbWJpbmF0aW9uc19kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYyljb21iaW5hdGlvbnNfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYyljb21iaW5hdGlvbnNfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWNvbWJpbmF0aW9uc19uZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpdGVydG9vbHMuY29tYmluYXRpb25zIiwgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihjb21iaW5hdGlvbnNvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWNvbWJpbmF0aW9uc19kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjb21iaW5hdGlvbnNfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpY29tYmluYXRpb25zX3RyYXZlcnNlLCAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYyljb21iaW5hdGlvbnNfbmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgY29tYmluYXRpb25zX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIHBlcm11dGF0aW9ucyBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gIAorCiBkZWYgcGVybXV0YXRpb25zKGl0ZXJhYmxlLCByPU5vbmUpOgogICAgICdwZXJtdXRhdGlvbnMocmFuZ2UoMyksIDIpIC0tPiAoMCwxKSAoMCwyKSAoMSwwKSAoMSwyKSAoMiwwKSAoMiwxKScKICAgICBwb29sID0gdHVwbGUoaXRlcmFibGUpCkBAIC0yMjU1LDI4ICsyMjU1LDI4IEBACiAgICAgY3ljbGVzID0gcmFuZ2Uobi1yKzEsIG4rMSlbOjotMV0KICAgICB5aWVsZCB0dXBsZShwb29sW2ldIGZvciBpIGluIGluZGljZXNbOnJdKQogICAgIHdoaWxlIG46Ci0gICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKHIpKToKLSAgICAgICAgICAgIGN5Y2xlc1tpXSAtPSAxCi0gICAgICAgICAgICBpZiBjeWNsZXNbaV0gPT0gMDoKLSAgICAgICAgICAgICAgICBpbmRpY2VzW2k6XSA9IGluZGljZXNbaSsxOl0gKyBpbmRpY2VzW2k6aSsxXQotICAgICAgICAgICAgICAgIGN5Y2xlc1tpXSA9IG4gLSBpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGogPSBjeWNsZXNbaV0KLSAgICAgICAgICAgICAgICBpbmRpY2VzW2ldLCBpbmRpY2VzWy1qXSA9IGluZGljZXNbLWpdLCBpbmRpY2VzW2ldCi0gICAgICAgICAgICAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzWzpyXSkKLSAgICAgICAgICAgICAgICBicmVhaworICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKHIpKToKKyAgICAgICAgY3ljbGVzW2ldIC09IDEKKyAgICAgICAgaWYgY3ljbGVzW2ldID09IDA6CisgICAgICAgIGluZGljZXNbaTpdID0gaW5kaWNlc1tpKzE6XSArIGluZGljZXNbaTppKzFdCisgICAgICAgIGN5Y2xlc1tpXSA9IG4gLSBpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaiA9IGN5Y2xlc1tpXQorICAgICAgICBpbmRpY2VzW2ldLCBpbmRpY2VzWy1qXSA9IGluZGljZXNbLWpdLCBpbmRpY2VzW2ldCisgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlc1s6cl0pCisgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuCiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpwb29sOwkJCS8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCi0JUHlfc3NpemVfdCAqaW5kaWNlczsgICAgICAgICAgICAvKiBvbmUgaW5kZXggcGVyIGVsZW1lbnQgaW4gdGhlIHBvb2wgKi8KLQlQeV9zc2l6ZV90ICpjeWNsZXM7CQkvKiBvbmUgcm9sbG92ZXIgY291bnRlciBwZXIgZWxlbWVudCBpbiB0aGUgcmVzdWx0ICovCi0JUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotCVB5X3NzaXplX3QgcjsJCQkvKiBzaXplIG9mIHJlc3VsdCB0dXBsZSAqLwotCWludCBzdG9wcGVkOwkJCS8qIHNldCB0byAxIHdoZW4gdGhlIHBlcm11dGF0aW9ucyBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzOyAgICAgICAgICAgIC8qIG9uZSBpbmRleCBwZXIgZWxlbWVudCBpbiB0aGUgcG9vbCAqLworICAgIFB5X3NzaXplX3QgKmN5Y2xlczsgICAgICAgICAgICAgICAgIC8qIG9uZSByb2xsb3ZlciBjb3VudGVyIHBlciBlbGVtZW50IGluIHRoZSByZXN1bHQgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCisgICAgUHlfc3NpemVfdCByOyAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KKyAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBwZXJtdXRhdGlvbnMgaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IHBlcm11dGF0aW9uc29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwZXJtdXRhdGlvbnNfdHlwZTsKQEAgLTIyODQsMTgwICsyMjg0LDE4MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHBlcm11dGF0aW9uc19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcGVybXV0YXRpb25zb2JqZWN0ICpwbzsKLQlQeV9zc2l6ZV90IG47Ci0JUHlfc3NpemVfdCByOwotCVB5T2JqZWN0ICpyb2JqID0gUHlfTm9uZTsKLQlQeU9iamVjdCAqcG9vbCA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKLQlQeV9zc2l6ZV90ICppbmRpY2VzID0gTlVMTDsKLQlQeV9zc2l6ZV90ICpjeWNsZXMgPSBOVUxMOwotCVB5X3NzaXplX3QgaTsKLQlzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgInIiLCBOVUxMfTsKLSAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPOnBlcm11dGF0aW9ucyIsIGt3YXJncywgCi0JCQkJCSAmaXRlcmFibGUsICZyb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgcGVybXV0YXRpb25zb2JqZWN0ICpwbzsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlfc3NpemVfdCByOworICAgIFB5T2JqZWN0ICpyb2JqID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqcG9vbCA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0ZXJhYmxlID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90ICpjeWNsZXMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgInIiLCBOVUxMfTsKIAotCXBvb2wgPSBQeVNlcXVlbmNlX1R1cGxlKGl0ZXJhYmxlKTsKLQlpZiAocG9vbCA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86cGVybXV0YXRpb25zIiwga3dhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyYWJsZSwgJnJvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXIgPSBuOwotCWlmIChyb2JqICE9IFB5X05vbmUpIHsKLQkJciA9IFB5SW50X0FzU3NpemVfdChyb2JqKTsKLQkJaWYgKHIgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gZXJyb3I7Ci0JfQotCWlmIChyIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInIgbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgcG9vbCA9IFB5U2VxdWVuY2VfVHVwbGUoaXRlcmFibGUpOworICAgIGlmIChwb29sID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUocG9vbCk7CiAKLQlpbmRpY2VzID0gUHlNZW1fTWFsbG9jKG4gKiBzaXplb2YoUHlfc3NpemVfdCkpOwotCWN5Y2xlcyA9IFB5TWVtX01hbGxvYyhyICogc2l6ZW9mKFB5X3NzaXplX3QpKTsKLQlpZiAoaW5kaWNlcyA9PSBOVUxMIHx8IGN5Y2xlcyA9PSBOVUxMKSB7Ci0gICAgCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICByID0gbjsKKyAgICBpZiAocm9iaiAhPSBQeV9Ob25lKSB7CisgICAgICAgIHIgPSBQeUludF9Bc1NzaXplX3Qocm9iaik7CisgICAgICAgIGlmIChyID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAociA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JZm9yIChpPTAgOyBpPG4gOyBpKyspCi0JCWluZGljZXNbaV0gPSBpOwotCWZvciAoaT0wIDsgaTxyIDsgaSsrKQotCQljeWNsZXNbaV0gPSBuIC0gaTsKKyAgICBpbmRpY2VzID0gUHlNZW1fTWFsbG9jKG4gKiBzaXplb2YoUHlfc3NpemVfdCkpOworICAgIGN5Y2xlcyA9IFB5TWVtX01hbGxvYyhyICogc2l6ZW9mKFB5X3NzaXplX3QpKTsKKyAgICBpZiAoaW5kaWNlcyA9PSBOVUxMIHx8IGN5Y2xlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JLyogY3JlYXRlIHBlcm11dGF0aW9uc29iamVjdCBzdHJ1Y3R1cmUgKi8KLQlwbyA9IChwZXJtdXRhdGlvbnNvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAocG8gPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKKyAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykKKyAgICAgICAgaW5kaWNlc1tpXSA9IGk7CisgICAgZm9yIChpPTAgOyBpPHIgOyBpKyspCisgICAgICAgIGN5Y2xlc1tpXSA9IG4gLSBpOwogCi0JcG8tPnBvb2wgPSBwb29sOwotCXBvLT5pbmRpY2VzID0gaW5kaWNlczsKLQlwby0+Y3ljbGVzID0gY3ljbGVzOwotCXBvLT5yZXN1bHQgPSBOVUxMOwotCXBvLT5yID0gcjsKLQlwby0+c3RvcHBlZCA9IHIgPiBuID8gMSA6IDA7CisgICAgLyogY3JlYXRlIHBlcm11dGF0aW9uc29iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBwbyA9IChwZXJtdXRhdGlvbnNvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAocG8gPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCXJldHVybiAoUHlPYmplY3QgKilwbzsKKyAgICBwby0+cG9vbCA9IHBvb2w7CisgICAgcG8tPmluZGljZXMgPSBpbmRpY2VzOworICAgIHBvLT5jeWNsZXMgPSBjeWNsZXM7CisgICAgcG8tPnJlc3VsdCA9IE5VTEw7CisgICAgcG8tPnIgPSByOworICAgIHBvLT5zdG9wcGVkID0gciA+IG4gPyAxIDogMDsKKworICAgIHJldHVybiAoUHlPYmplY3QgKilwbzsKIAogZXJyb3I6Ci0JaWYgKGluZGljZXMgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShpbmRpY2VzKTsKLQlpZiAoY3ljbGVzICE9IE5VTEwpCi0JCVB5TWVtX0ZyZWUoY3ljbGVzKTsKLQlQeV9YREVDUkVGKHBvb2wpOwotCXJldHVybiBOVUxMOworICAgIGlmIChpbmRpY2VzICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUoaW5kaWNlcyk7CisgICAgaWYgKGN5Y2xlcyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9GcmVlKGN5Y2xlcyk7CisgICAgUHlfWERFQ1JFRihwb29sKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKIHBlcm11dGF0aW9uc19kZWFsbG9jKHBlcm11dGF0aW9uc29iamVjdCAqcG8pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhwbyk7Ci0JUHlfWERFQ1JFRihwby0+cG9vbCk7Ci0JUHlfWERFQ1JFRihwby0+cmVzdWx0KTsKLQlQeU1lbV9GcmVlKHBvLT5pbmRpY2VzKTsKLQlQeU1lbV9GcmVlKHBvLT5jeWNsZXMpOwotCVB5X1RZUEUocG8pLT50cF9mcmVlKHBvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHBvKTsKKyAgICBQeV9YREVDUkVGKHBvLT5wb29sKTsKKyAgICBQeV9YREVDUkVGKHBvLT5yZXN1bHQpOworICAgIFB5TWVtX0ZyZWUocG8tPmluZGljZXMpOworICAgIFB5TWVtX0ZyZWUocG8tPmN5Y2xlcyk7CisgICAgUHlfVFlQRShwbyktPnRwX2ZyZWUocG8pOwogfQogCiBzdGF0aWMgaW50CiBwZXJtdXRhdGlvbnNfdHJhdmVyc2UocGVybXV0YXRpb25zb2JqZWN0ICpwbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQocG8tPnBvb2wpOwotCVB5X1ZJU0lUKHBvLT5yZXN1bHQpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHBvLT5wb29sKTsKKyAgICBQeV9WSVNJVChwby0+cmVzdWx0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHBlcm11dGF0aW9uc19uZXh0KHBlcm11dGF0aW9uc29iamVjdCAqcG8pCiB7Ci0JUHlPYmplY3QgKmVsZW07Ci0JUHlPYmplY3QgKm9sZGVsZW07Ci0JUHlPYmplY3QgKnBvb2wgPSBwby0+cG9vbDsKLQlQeV9zc2l6ZV90ICppbmRpY2VzID0gcG8tPmluZGljZXM7Ci0JUHlfc3NpemVfdCAqY3ljbGVzID0gcG8tPmN5Y2xlczsKLQlQeU9iamVjdCAqcmVzdWx0ID0gcG8tPnJlc3VsdDsKLQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOwotCVB5X3NzaXplX3QgciA9IHBvLT5yOwotCVB5X3NzaXplX3QgaSwgaiwgaywgaW5kZXg7CisgICAgUHlPYmplY3QgKmVsZW07CisgICAgUHlPYmplY3QgKm9sZGVsZW07CisgICAgUHlPYmplY3QgKnBvb2wgPSBwby0+cG9vbDsKKyAgICBQeV9zc2l6ZV90ICppbmRpY2VzID0gcG8tPmluZGljZXM7CisgICAgUHlfc3NpemVfdCAqY3ljbGVzID0gcG8tPmN5Y2xlczsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gcG8tPnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKHBvb2wpOworICAgIFB5X3NzaXplX3QgciA9IHBvLT5yOworICAgIFB5X3NzaXplX3QgaSwgaiwgaywgaW5kZXg7CiAKLQlpZiAocG8tPnN0b3BwZWQpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChwby0+c3RvcHBlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBPbiB0aGUgZmlyc3QgcGFzcywgaW5pdGlhbGl6ZSByZXN1bHQgdHVwbGUgdXNpbmcgdGhlIGluZGljZXMgKi8KLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgIAkJZ290byBlbXB0eTsKLQkJcG8tPnJlc3VsdCA9IHJlc3VsdDsKLQkJZm9yIChpPTA7IGk8ciA7IGkrKykgewotCQkJaW5kZXggPSBpbmRpY2VzW2ldOwotICAgIAkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKLSAgICAJCQlQeV9JTkNSRUYoZWxlbSk7Ci0gICAgCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKG4gPT0gMCkKLQkJCWdvdG8gZW1wdHk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIC8qIE9uIHRoZSBmaXJzdCBwYXNzLCBpbml0aWFsaXplIHJlc3VsdCB0dXBsZSB1c2luZyB0aGUgaW5kaWNlcyAqLworICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICAgICAgcG8tPnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgZm9yIChpPTA7IGk8ciA7IGkrKykgeworICAgICAgICAgICAgaW5kZXggPSBpbmRpY2VzW2ldOworICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgaW5kZXgpOworICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgIGdvdG8gZW1wdHk7CiAKLQkJLyogQ29weSB0aGUgcHJldmlvdXMgcmVzdWx0IHR1cGxlIG9yIHJlLXVzZSBpdCBpZiBhdmFpbGFibGUgKi8KLQkJaWYgKFB5X1JFRkNOVChyZXN1bHQpID4gMSkgewotCQkJUHlPYmplY3QgKm9sZF9yZXN1bHQgPSByZXN1bHQ7Ci0JCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhyKTsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCQlnb3RvIGVtcHR5OwotCQkJcG8tPnJlc3VsdCA9IHJlc3VsdDsKLQkJCWZvciAoaT0wOyBpPHIgOyBpKyspIHsKLQkJCQllbGVtID0gUHlUdXBsZV9HRVRfSVRFTShvbGRfcmVzdWx0LCBpKTsKLSAgICAJCQkJUHlfSU5DUkVGKGVsZW0pOwotICAgIAkJCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgZWxlbSk7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYob2xkX3Jlc3VsdCk7Ci0JCX0KLQkJLyogTm93LCB3ZSd2ZSBnb3QgdGhlIG9ubHkgY29weSBzbyB3ZSBjYW4gdXBkYXRlIGl0IGluLXBsYWNlICovCi0JCWFzc2VydChyID09IDAgfHwgUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSk7CisgICAgICAgIC8qIENvcHkgdGhlIHByZXZpb3VzIHJlc3VsdCB0dXBsZSBvciByZS11c2UgaXQgaWYgYXZhaWxhYmxlICovCisgICAgICAgIGlmIChQeV9SRUZDTlQocmVzdWx0KSA+IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvbGRfcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcocik7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlbXB0eTsKKyAgICAgICAgICAgIHBvLT5yZXN1bHQgPSByZXN1bHQ7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxyIDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX3Jlc3VsdCwgaSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRfcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICAvKiBOb3csIHdlJ3ZlIGdvdCB0aGUgb25seSBjb3B5IHNvIHdlIGNhbiB1cGRhdGUgaXQgaW4tcGxhY2UgKi8KKyAgICAgICAgYXNzZXJ0KHIgPT0gMCB8fCBQeV9SRUZDTlQocmVzdWx0KSA9PSAxKTsKIAotICAgICAgICAgICAgICAgIC8qIERlY3JlbWVudCByaWdodG1vc3QgY3ljbGUsIG1vdmluZyBsZWZ0d2FyZCB1cG9uIHplcm8gcm9sbG92ZXIgKi8KLQkJZm9yIChpPXItMSA7IGk+PTAgOyBpLS0pIHsKLQkJCWN5Y2xlc1tpXSAtPSAxOwotCQkJaWYgKGN5Y2xlc1tpXSA9PSAwKSB7Ci0JCQkJLyogcm90YXRhdGlvbjogaW5kaWNlc1tpOl0gPSBpbmRpY2VzW2krMTpdICsgaW5kaWNlc1tpOmkrMV0gKi8KLQkJCQlpbmRleCA9IGluZGljZXNbaV07Ci0JCQkJZm9yIChqPWkgOyBqPG4tMSA7IGorKykKLQkJCQkJaW5kaWNlc1tqXSA9IGluZGljZXNbaisxXTsKLQkJCQlpbmRpY2VzW24tMV0gPSBpbmRleDsKLQkJCQljeWNsZXNbaV0gPSBuIC0gaTsKLQkJCX0gZWxzZSB7Ci0JCQkJaiA9IGN5Y2xlc1tpXTsKLQkJCQlpbmRleCA9IGluZGljZXNbaV07Ci0JCQkJaW5kaWNlc1tpXSA9IGluZGljZXNbbi1qXTsKLQkJCQlpbmRpY2VzW24tal0gPSBpbmRleDsKKyAgICAgICAgLyogRGVjcmVtZW50IHJpZ2h0bW9zdCBjeWNsZSwgbW92aW5nIGxlZnR3YXJkIHVwb24gemVybyByb2xsb3ZlciAqLworICAgICAgICBmb3IgKGk9ci0xIDsgaT49MCA7IGktLSkgeworICAgICAgICAgICAgY3ljbGVzW2ldIC09IDE7CisgICAgICAgICAgICBpZiAoY3ljbGVzW2ldID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiByb3RhdGF0aW9uOiBpbmRpY2VzW2k6XSA9IGluZGljZXNbaSsxOl0gKyBpbmRpY2VzW2k6aSsxXSAqLworICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICAgICAgICAgICAgICBmb3IgKGo9aSA7IGo8bi0xIDsgaisrKQorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2pdID0gaW5kaWNlc1tqKzFdOworICAgICAgICAgICAgICAgIGluZGljZXNbbi0xXSA9IGluZGV4OworICAgICAgICAgICAgICAgIGN5Y2xlc1tpXSA9IG4gLSBpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBqID0gY3ljbGVzW2ldOworICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1tpXTsKKyAgICAgICAgICAgICAgICBpbmRpY2VzW2ldID0gaW5kaWNlc1tuLWpdOworICAgICAgICAgICAgICAgIGluZGljZXNbbi1qXSA9IGluZGV4OwogCi0JCQkJZm9yIChrPWk7IGs8ciA7IGsrKykgewotCQkJCQkvKiBzdGFydCB3aXRoIGksIHRoZSBsZWZ0bW9zdCBlbGVtZW50IHRoYXQgY2hhbmdlZCAqLwotCQkJCQkvKiB5aWVsZCB0dXBsZShwb29sW2tdIGZvciBrIGluIGluZGljZXNbOnJdKSAqLwotCQkJCQlpbmRleCA9IGluZGljZXNba107Ci0JCQkJCWVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHBvb2wsIGluZGV4KTsKLSAgICAJCQkJCVB5X0lOQ1JFRihlbGVtKTsKLQkJCQkJb2xkZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBrKTsKLSAgICAJCQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBrLCBlbGVtKTsKLQkJCQkJUHlfREVDUkVGKG9sZGVsZW0pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBjeWNsZXMgaGF2ZSBhbGwKLSAgICAgICAgICAgICAgICAgICByb2xsZWQtb3ZlciBhbmQgd2UncmUgZG9uZS4gKi8KLQkJaWYgKGkgPCAwKQotCQkJZ290byBlbXB0eTsKLQl9Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICBmb3IgKGs9aTsgazxyIDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IHdpdGggaSwgdGhlIGxlZnRtb3N0IGVsZW1lbnQgdGhhdCBjaGFuZ2VkICovCisgICAgICAgICAgICAgICAgICAgIC8qIHlpZWxkIHR1cGxlKHBvb2xba10gZm9yIGsgaW4gaW5kaWNlc1s6cl0pICovCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kaWNlc1trXTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0ocG9vbCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIG9sZGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgayk7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBrLCBlbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9sZGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBJZiBpIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBjeWNsZXMgaGF2ZSBhbGwKKyAgICAgICAgICAgcm9sbGVkLW92ZXIgYW5kIHdlJ3JlIGRvbmUuICovCisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW1wdHk7CisgICAgfQorICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiAKIGVtcHR5OgotCXBvLT5zdG9wcGVkID0gMTsKLQlyZXR1cm4gTlVMTDsKKyAgICBwby0+c3RvcHBlZCA9IDE7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihwZXJtdXRhdGlvbnNfZG9jLApAQCAtMjQ2Nyw1NiArMjQ2Nyw1NiBAQAogcGVybXV0YXRpb25zKHJhbmdlKDMpLCAyKSAtLT4gKDAsMSksICgwLDIpLCAoMSwwKSwgKDEsMiksICgyLDApLCAoMiwxKSIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHBlcm11dGF0aW9uc190eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMucGVybXV0YXRpb25zIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YocGVybXV0YXRpb25zb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpcGVybXV0YXRpb25zX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlwZXJtdXRhdGlvbnNfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpcGVybXV0YXRpb25zX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpcGVybXV0YXRpb25zX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlwZXJtdXRhdGlvbnNfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLnBlcm11dGF0aW9ucyIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YocGVybXV0YXRpb25zb2JqZWN0KSwgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilwZXJtdXRhdGlvbnNfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgcGVybXV0YXRpb25zX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXBlcm11dGF0aW9uc190cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpcGVybXV0YXRpb25zX25leHQsICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHBlcm11dGF0aW9uc19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBpZmlsdGVyIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqaXQ7CiB9IGlmaWx0ZXJvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaWZpbHRlcl90eXBlOwpAQCAtMjUyNCw4MyArMjUyNCw4MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGlmaWx0ZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqc2VxOwotCVB5T2JqZWN0ICppdDsKLQlpZmlsdGVyb2JqZWN0ICpsejsKKyAgICBQeU9iamVjdCAqZnVuYywgKnNlcTsKKyAgICBQeU9iamVjdCAqaXQ7CisgICAgaWZpbHRlcm9iamVjdCAqbHo7CiAKLQlpZiAodHlwZSA9PSAmaWZpbHRlcl90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiaWZpbHRlcigpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZpZmlsdGVyX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJpZmlsdGVyKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpZmlsdGVyIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpZmlsdGVyIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEdldCBpdGVyYXRvci4gKi8KLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogR2V0IGl0ZXJhdG9yLiAqLworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIGNyZWF0ZSBpZmlsdGVyb2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKGlmaWx0ZXJvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCWx6LT5mdW5jID0gZnVuYzsKLQlsei0+aXQgPSBpdDsKKyAgICAvKiBjcmVhdGUgaWZpbHRlcm9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBseiA9IChpZmlsdGVyb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICBsei0+ZnVuYyA9IGZ1bmM7CisgICAgbHotPml0ID0gaXQ7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogaWZpbHRlcl9kZWFsbG9jKGlmaWx0ZXJvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPmZ1bmMpOwotCVB5X1hERUNSRUYobHotPml0KTsKLQlQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhseik7CisgICAgUHlfWERFQ1JFRihsei0+ZnVuYyk7CisgICAgUHlfWERFQ1JFRihsei0+aXQpOworICAgIFB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKIH0KIAogc3RhdGljIGludAogaWZpbHRlcl90cmF2ZXJzZShpZmlsdGVyb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobHotPml0KTsKLQlQeV9WSVNJVChsei0+ZnVuYyk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0KTsKKyAgICBQeV9WSVNJVChsei0+ZnVuYyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpZmlsdGVyX25leHQoaWZpbHRlcm9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKml0ZW07Ci0JUHlPYmplY3QgKml0ID0gbHotPml0OwotCWxvbmcgb2s7Ci0JUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICppdCA9IGx6LT5pdDsKKyAgICBsb25nIG9rOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKIAotCWFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKLQlpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7Ci0JZm9yICg7OykgewotCQlpdGVtID0gaXRlcm5leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGl0ZW0gPSBpdGVybmV4dChpdCk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlpZiAobHotPmZ1bmMgPT0gUHlfTm9uZSB8fCBsei0+ZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGUpIHsKLQkJCW9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOwotCQl9IGVsc2UgewotCQkJUHlPYmplY3QgKmdvb2Q7Ci0JCQlnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywKLQkJCQkJCQkgICAgaXRlbSwgTlVMTCk7Ci0JCQlpZiAoZ29vZCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JCQlQeV9ERUNSRUYoZ29vZCk7Ci0JCX0KLQkJaWYgKG9rKQotCQkJcmV0dXJuIGl0ZW07Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgICAgIGlmIChsei0+ZnVuYyA9PSBQeV9Ob25lIHx8IGx6LT5mdW5jID09IChQeU9iamVjdCAqKSZQeUJvb2xfVHlwZSkgeworICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqZ29vZDsKKyAgICAgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwgTlVMTCk7CisgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZ29vZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9rKQorICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihpZmlsdGVyX2RvYywKQEAgLTI2MTAsNTYgKzI2MTAsNTYgQEAKIElmIGZ1bmN0aW9uIGlzIE5vbmUsIHJldHVybiB0aGUgaXRlbXMgdGhhdCBhcmUgdHJ1ZS4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpZmlsdGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5pZmlsdGVyIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoaWZpbHRlcm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilpZmlsdGVyX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlpZmlsdGVyX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWlmaWx0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylpZmlsdGVyX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlpZmlsdGVyX25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5pZmlsdGVyIiwgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihpZmlsdGVyb2JqZWN0KSwgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWlmaWx0ZXJfZGVhbGxvYywgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaWZpbHRlcl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpZmlsdGVyX3RyYXZlcnNlLCAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylpZmlsdGVyX25leHQsICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGlmaWx0ZXJfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogaWZpbHRlcmZhbHNlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqaXQ7CiB9IGlmaWx0ZXJmYWxzZW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpZmlsdGVyZmFsc2VfdHlwZTsKQEAgLTI2NjcsODQgKzI2NjcsODQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpZmlsdGVyZmFsc2VfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqc2VxOwotCVB5T2JqZWN0ICppdDsKLQlpZmlsdGVyZmFsc2VvYmplY3QgKmx6OworICAgIFB5T2JqZWN0ICpmdW5jLCAqc2VxOworICAgIFB5T2JqZWN0ICppdDsKKyAgICBpZmlsdGVyZmFsc2VvYmplY3QgKmx6OwogCi0JaWYgKHR5cGUgPT0gJmlmaWx0ZXJmYWxzZV90eXBlICYmCi0JICAgICFfUHlBcmdfTm9LZXl3b3JkcygiaWZpbHRlcmZhbHNlKCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgPT0gJmlmaWx0ZXJmYWxzZV90eXBlICYmCisgICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiaWZpbHRlcmZhbHNlKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpZmlsdGVyZmFsc2UiLCAyLCAyLCAmZnVuYywgJnNlcSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlmaWx0ZXJmYWxzZSIsIDIsIDIsICZmdW5jLCAmc2VxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBHZXQgaXRlcmF0b3IuICovCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIEdldCBpdGVyYXRvci4gKi8KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBjcmVhdGUgaWZpbHRlcmZhbHNlb2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKGlmaWx0ZXJmYWxzZW9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChseiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoZnVuYyk7Ci0JbHotPmZ1bmMgPSBmdW5jOwotCWx6LT5pdCA9IGl0OworICAgIC8qIGNyZWF0ZSBpZmlsdGVyZmFsc2VvYmplY3Qgc3RydWN0dXJlICovCisgICAgbHogPSAoaWZpbHRlcmZhbHNlb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihmdW5jKTsKKyAgICBsei0+ZnVuYyA9IGZ1bmM7CisgICAgbHotPml0ID0gaXQ7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogaWZpbHRlcmZhbHNlX2RlYWxsb2MoaWZpbHRlcmZhbHNlb2JqZWN0ICpseikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLQlQeV9YREVDUkVGKGx6LT5mdW5jKTsKLQlQeV9YREVDUkVGKGx6LT5pdCk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPmZ1bmMpOworICAgIFB5X1hERUNSRUYobHotPml0KTsKKyAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGlmaWx0ZXJmYWxzZV90cmF2ZXJzZShpZmlsdGVyZmFsc2VvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+aXQpOwotCVB5X1ZJU0lUKGx6LT5mdW5jKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChsei0+aXQpOworICAgIFB5X1ZJU0lUKGx6LT5mdW5jKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGlmaWx0ZXJmYWxzZV9uZXh0KGlmaWx0ZXJmYWxzZW9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3QgKml0ZW07Ci0JUHlPYmplY3QgKml0ID0gbHotPml0OwotCWxvbmcgb2s7Ci0JUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICppdCA9IGx6LT5pdDsKKyAgICBsb25nIG9rOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKIAotCWFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKLQlpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7Ci0JZm9yICg7OykgewotCQlpdGVtID0gaXRlcm5leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGl0ZW0gPSBpdGVybmV4dChpdCk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlpZiAobHotPmZ1bmMgPT0gUHlfTm9uZSB8fCBsei0+ZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGUpIHsKLQkJCW9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOwotCQl9IGVsc2UgewotCQkJUHlPYmplY3QgKmdvb2Q7Ci0JCQlnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywKLQkJCQkJCQkgICAgaXRlbSwgTlVMTCk7Ci0JCQlpZiAoZ29vZCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JCQlQeV9ERUNSRUYoZ29vZCk7Ci0JCX0KLQkJaWYgKCFvaykKLQkJCXJldHVybiBpdGVtOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQorICAgICAgICBpZiAobHotPmZ1bmMgPT0gUHlfTm9uZSB8fCBsei0+ZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGUpIHsKKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKmdvb2Q7CisgICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sIE5VTEwpOworICAgICAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOworICAgICAgICAgICAgUHlfREVDUkVGKGdvb2QpOworICAgICAgICB9CisgICAgICAgIGlmICghb2spCisgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKGlmaWx0ZXJmYWxzZV9kb2MsCkBAIC0yNzU0LDU2ICsyNzU0LDU2IEBACiBJZiBmdW5jdGlvbiBpcyBOb25lLCByZXR1cm4gdGhlIGl0ZW1zIHRoYXQgYXJlIGZhbHNlLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGlmaWx0ZXJmYWxzZV90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuaWZpbHRlcmZhbHNlIiwJLyogdHBfbmFtZSAqLwotCXNpemVvZihpZmlsdGVyZmFsc2VvYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilpZmlsdGVyZmFsc2VfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkvKiB0cF9mbGFncyAqLwotCWlmaWx0ZXJmYWxzZV9kb2MsCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWlmaWx0ZXJmYWxzZV90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWlmaWx0ZXJmYWxzZV9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JaWZpbHRlcmZhbHNlX25ldywJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLmlmaWx0ZXJmYWxzZSIsICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGlmaWx0ZXJmYWxzZW9iamVjdCksICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpaWZpbHRlcmZhbHNlX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGlmaWx0ZXJmYWxzZV9kb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpaWZpbHRlcmZhbHNlX3RyYXZlcnNlLCAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylpZmlsdGVyZmFsc2VfbmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaWZpbHRlcmZhbHNlX25ldywgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiBjb3VudCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3QgY250OwotCVB5T2JqZWN0ICpsb25nX2NudDsJLyogQXJiaXRyYXJpbHkgbGFyZ2UgY291bnQgd2hlbiBjbnQgPj0gUFlfU1NJWkVfVF9NQVggKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCBjbnQ7CisgICAgUHlPYmplY3QgKmxvbmdfY250OyAgICAgICAgIC8qIEFyYml0cmFyaWx5IGxhcmdlIGNvdW50IHdoZW4gY250ID49IFBZX1NTSVpFX1RfTUFYICovCiB9IGNvdW50b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGNvdW50X3R5cGU7CkBAIC0yODExLDExNSArMjgxMSwxMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb3VudF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY291bnRvYmplY3QgKmx6OwotCVB5X3NzaXplX3QgY250ID0gMDsKLQlQeU9iamVjdCAqY250X2FyZyA9IE5VTEw7Ci0JUHlPYmplY3QgKmxvbmdfY250ID0gTlVMTDsKKyAgICBjb3VudG9iamVjdCAqbHo7CisgICAgUHlfc3NpemVfdCBjbnQgPSAwOworICAgIFB5T2JqZWN0ICpjbnRfYXJnID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbG9uZ19jbnQgPSBOVUxMOwogCi0JaWYgKHR5cGUgPT0gJmNvdW50X3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJjb3VudCgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZjb3VudF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiY291bnQoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImNvdW50IiwgMCwgMSwgJmNudF9hcmcpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjb3VudCIsIDAsIDEsICZjbnRfYXJnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoY250X2FyZyAhPSBOVUxMKSB7Ci0JCWNudCA9IFB5SW50X0FzU3NpemVfdChjbnRfYXJnKTsKLQkJaWYgKGNudCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJaWYgKCFQeUxvbmdfQ2hlY2soY250X2FyZykpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJbG9uZ19jbnQgPSBjbnRfYXJnOwotCQkJUHlfSU5DUkVGKGxvbmdfY250KTsKLQkJCWNudCA9IFBZX1NTSVpFX1RfTUFYOwotCQl9Ci0JfQorICAgIGlmIChjbnRfYXJnICE9IE5VTEwpIHsKKyAgICAgICAgY250ID0gUHlJbnRfQXNTc2l6ZV90KGNudF9hcmcpOworICAgICAgICBpZiAoY250ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBpZiAoIVB5TG9uZ19DaGVjayhjbnRfYXJnKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nX2NudCA9IGNudF9hcmc7CisgICAgICAgICAgICBQeV9JTkNSRUYobG9uZ19jbnQpOworICAgICAgICAgICAgY250ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBjcmVhdGUgY291bnRvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAoY291bnRvYmplY3QgKilQeU9iamVjdF9OZXcoY291bnRvYmplY3QsICZjb3VudF90eXBlKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKGxvbmdfY250KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWx6LT5jbnQgPSBjbnQ7Ci0JbHotPmxvbmdfY250ID0gbG9uZ19jbnQ7CisgICAgLyogY3JlYXRlIGNvdW50b2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGx6ID0gKGNvdW50b2JqZWN0ICopUHlPYmplY3RfTmV3KGNvdW50b2JqZWN0LCAmY291bnRfdHlwZSk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihsb25nX2NudCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsei0+Y250ID0gY250OworICAgIGx6LT5sb25nX2NudCA9IGxvbmdfY250OwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKIH0KIAogc3RhdGljIHZvaWQKIGNvdW50X2RlYWxsb2MoY291bnRvYmplY3QgKmx6KQogewotCVB5X1hERUNSRUYobHotPmxvbmdfY250KTsgCi0JUHlPYmplY3RfRGVsKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5sb25nX2NudCk7CisgICAgUHlPYmplY3RfRGVsKGx6KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvdW50X25leHRsb25nKGNvdW50b2JqZWN0ICpseikKIHsKLQlzdGF0aWMgUHlPYmplY3QgKm9uZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmNudDsKLQlQeU9iamVjdCAqc3RlcHBlZF91cDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm9uZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNudDsKKyAgICBQeU9iamVjdCAqc3RlcHBlZF91cDsKIAotCWlmIChsei0+bG9uZ19jbnQgPT0gTlVMTCkgewotCQlsei0+bG9uZ19jbnQgPSBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCk7Ci0JCWlmIChsei0+bG9uZ19jbnQgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAob25lID09IE5VTEwpIHsKLQkJb25lID0gUHlJbnRfRnJvbUxvbmcoMSk7Ci0JCWlmIChvbmUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQljbnQgPSBsei0+bG9uZ19jbnQ7Ci0JYXNzZXJ0KGNudCAhPSBOVUxMKTsKLQlzdGVwcGVkX3VwID0gUHlOdW1iZXJfQWRkKGNudCwgb25lKTsKLQlpZiAoc3RlcHBlZF91cCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlsei0+bG9uZ19jbnQgPSBzdGVwcGVkX3VwOwotCXJldHVybiBjbnQ7CisgICAgaWYgKGx6LT5sb25nX2NudCA9PSBOVUxMKSB7CisgICAgICAgIGx6LT5sb25nX2NudCA9IFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUFYKTsKKyAgICAgICAgaWYgKGx6LT5sb25nX2NudCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChvbmUgPT0gTlVMTCkgeworICAgICAgICBvbmUgPSBQeUludF9Gcm9tTG9uZygxKTsKKyAgICAgICAgaWYgKG9uZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNudCA9IGx6LT5sb25nX2NudDsKKyAgICBhc3NlcnQoY250ICE9IE5VTEwpOworICAgIHN0ZXBwZWRfdXAgPSBQeU51bWJlcl9BZGQoY250LCBvbmUpOworICAgIGlmIChzdGVwcGVkX3VwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGx6LT5sb25nX2NudCA9IHN0ZXBwZWRfdXA7CisgICAgcmV0dXJuIGNudDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvdW50X25leHQoY291bnRvYmplY3QgKmx6KQogewotICAgICAgICBpZiAobHotPmNudCA9PSBQWV9TU0laRV9UX01BWCkKLQkJcmV0dXJuIGNvdW50X25leHRsb25nKGx6KTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobHotPmNudCsrKTsKKyAgICBpZiAobHotPmNudCA9PSBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgcmV0dXJuIGNvdW50X25leHRsb25nKGx6KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobHotPmNudCsrKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvdW50X3JlcHIoY291bnRvYmplY3QgKmx6KQogewotCVB5T2JqZWN0ICpjbnRfcmVwcjsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpjbnRfcmVwcjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0gICAgICAgIGlmIChsei0+Y250ICE9IFBZX1NTSVpFX1RfTUFYKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiY291bnQoJXpkKSIsIGx6LT5jbnQpOworICAgIGlmIChsei0+Y250ICE9IFBZX1NTSVpFX1RfTUFYKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiY291bnQoJXpkKSIsIGx6LT5jbnQpOwogCi0JY250X3JlcHIgPSBQeU9iamVjdF9SZXByKGx6LT5sb25nX2NudCk7Ci0JaWYgKGNudF9yZXByID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoImNvdW50KCVzKSIsIFB5U3RyaW5nX0FTX1NUUklORyhjbnRfcmVwcikpOwotCVB5X0RFQ1JFRihjbnRfcmVwcik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBjbnRfcmVwciA9IFB5T2JqZWN0X1JlcHIobHotPmxvbmdfY250KTsKKyAgICBpZiAoY250X3JlcHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiY291bnQoJXMpIiwgUHlTdHJpbmdfQVNfU1RSSU5HKGNudF9yZXByKSk7CisgICAgUHlfREVDUkVGKGNudF9yZXByKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY291bnRfcmVkdWNlKGNvdW50b2JqZWN0ICpseikKIHsKLQlpZiAobHotPmNudCA9PSBQWV9TU0laRV9UX01BWCkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oTykiLCBQeV9UWVBFKGx6KSwgbHotPmxvbmdfY250KTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhuKSIsIFB5X1RZUEUobHopLCBsei0+Y250KTsKKyAgICBpZiAobHotPmNudCA9PSBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oTykiLCBQeV9UWVBFKGx6KSwgbHotPmxvbmdfY250KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhuKSIsIFB5X1RZUEUobHopLCBsei0+Y250KTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvdW50X3JlZHVjZV9kb2MsICJSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgY291bnRfbWV0aG9kc1tdID0gewotCXsiX19yZWR1Y2VfXyIsCShQeUNGdW5jdGlvbiljb3VudF9yZWR1Y2UsCU1FVEhfTk9BUkdTLAotCSBjb3VudF9yZWR1Y2VfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CS8qIHNlbnRpbmVsICovCisgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pY291bnRfcmVkdWNlLCAgICAgIE1FVEhfTk9BUkdTLAorICAgICBjb3VudF9yZWR1Y2VfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihjb3VudF9kb2MsCkBAIC0yOTI5LDQ1ICsyOTI5LDQ1IEBACiBpbnRlZ2VycyBzdGFydGluZyBmcm9tIHplcm8gb3IsIGlmIHNwZWNpZmllZCwgZnJvbSBmaXJzdHZhbC4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjb3VudF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuY291bnQiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihjb3VudG9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvciljb3VudF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpY291bnRfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJLyogdHBfZmxhZ3MgKi8KLQljb3VudF9kb2MsCQkJLyogdHBfZG9jICovCi0JMCwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWNvdW50X25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JY291bnRfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQljb3VudF9uZXcsCQkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5jb3VudCIsICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihjb3VudG9iamVjdCksICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWNvdW50X2RlYWxsb2MsICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyljb3VudF9yZXByLCAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGNvdW50X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpY291bnRfbmV4dCwgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgY291bnRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvdW50X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogCkBAIC0yOTc2LDEwICsyOTc2LDEwIEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdAl0dXBsZXNpemU7Ci0JUHlPYmplY3QgKml0dHVwbGU7CQkvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90ICAgICAgICAgIHR1cGxlc2l6ZTsKKyAgICBQeU9iamVjdCAqaXR0dXBsZTsgICAgICAgICAgICAgICAgICAvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OwogfSBpemlwb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGl6aXBfdHlwZTsKQEAgLTI5ODcsMTIwICsyOTg3LDEyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGl6aXBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWl6aXBvYmplY3QgKmx6OwotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqaXR0dXBsZTsgIC8qIHR1cGxlIG9mIGl0ZXJhdG9ycyAqLwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCB0dXBsZXNpemUgPSBQeVNlcXVlbmNlX0xlbmd0aChhcmdzKTsKKyAgICBpemlwb2JqZWN0ICpsejsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKml0dHVwbGU7ICAvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgdHVwbGVzaXplID0gUHlTZXF1ZW5jZV9MZW5ndGgoYXJncyk7CiAKLQlpZiAodHlwZSA9PSAmaXppcF90eXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiaXppcCgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZpemlwX3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJpemlwKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBhcmdzIG11c3QgYmUgYSB0dXBsZSAqLwotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICAvKiBhcmdzIG11c3QgYmUgYSB0dXBsZSAqLworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKIAotCS8qIG9idGFpbiBpdGVyYXRvcnMgKi8KLQlpdHR1cGxlID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLQlpZiAoaXR0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGk9MDsgaSA8IHR1cGxlc2l6ZTsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlPYmplY3QgKml0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVtKTsKLQkJaWYgKGl0ID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgIml6aXAgYXJndW1lbnQgIyV6ZCBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIiwKLQkJCQkgICAgaSsxKTsKLQkJCVB5X0RFQ1JFRihpdHR1cGxlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0oaXR0dXBsZSwgaSwgaXQpOwotCX0KKyAgICAvKiBvYnRhaW4gaXRlcmF0b3JzICovCisgICAgaXR0dXBsZSA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CisgICAgaWYgKGl0dHVwbGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlbSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJpemlwIGFyZ3VtZW50ICMlemQgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIGkrMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXR0dXBsZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGl0dHVwbGUsIGksIGl0KTsKKyAgICB9CiAKLQkvKiBjcmVhdGUgYSByZXN1bHQgaG9sZGVyICovCi0JcmVzdWx0ID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGl0dHVwbGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIFB5X05vbmUpOwotCX0KKyAgICAvKiBjcmVhdGUgYSByZXN1bHQgaG9sZGVyICovCisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0dHVwbGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIFB5X05vbmUpOworICAgIH0KIAotCS8qIGNyZWF0ZSBpemlwb2JqZWN0IHN0cnVjdHVyZSAqLwotCWx6ID0gKGl6aXBvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXR0dXBsZSk7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbHotPml0dHVwbGUgPSBpdHR1cGxlOwotCWx6LT50dXBsZXNpemUgPSB0dXBsZXNpemU7Ci0JbHotPnJlc3VsdCA9IHJlc3VsdDsKKyAgICAvKiBjcmVhdGUgaXppcG9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBseiA9IChpemlwb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGx6ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGl0dHVwbGUpOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGx6LT5pdHR1cGxlID0gaXR0dXBsZTsKKyAgICBsei0+dHVwbGVzaXplID0gdHVwbGVzaXplOworICAgIGx6LT5yZXN1bHQgPSByZXN1bHQ7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbHo7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWx6OwogfQogCiBzdGF0aWMgdm9pZAogaXppcF9kZWFsbG9jKGl6aXBvYmplY3QgKmx6KQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2sobHopOwotCVB5X1hERUNSRUYobHotPml0dHVwbGUpOwotCVB5X1hERUNSRUYobHotPnJlc3VsdCk7Ci0JUHlfVFlQRShseiktPnRwX2ZyZWUobHopOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobHopOworICAgIFB5X1hERUNSRUYobHotPml0dHVwbGUpOworICAgIFB5X1hERUNSRUYobHotPnJlc3VsdCk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBpemlwX3RyYXZlcnNlKGl6aXBvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+aXR0dXBsZSk7Ci0JUHlfVklTSVQobHotPnJlc3VsdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0dHVwbGUpOworICAgIFB5X1ZJU0lUKGx6LT5yZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaXppcF9uZXh0KGl6aXBvYmplY3QgKmx6KQogewotCVB5X3NzaXplX3QgaTsKLQlQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IGx6LT50dXBsZXNpemU7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7Ci0JUHlPYmplY3QgKml0OwotCVB5T2JqZWN0ICppdGVtOwotCVB5T2JqZWN0ICpvbGRpdGVtOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IGx6LT50dXBsZXNpemU7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7CisgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICpvbGRpdGVtOwogCi0JaWYgKHR1cGxlc2l6ZSA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSkgewotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7Ci0JCQlpdCA9IFB5VHVwbGVfR0VUX0lURU0obHotPml0dHVwbGUsIGkpOwotCQkJYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOwotCQkJaXRlbSA9ICgqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KShpdCk7Ci0JCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlvbGRpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOwotCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOwotCQkJUHlfREVDUkVGKG9sZGl0ZW0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgewotCQkJaXQgPSBQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdHR1cGxlLCBpKTsKLQkJCWFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKLQkJCWl0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOwotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHR1cGxlc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlfUkVGQ05UKHJlc3VsdCkgPT0gMSkgeworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgZm9yIChpPTAgOyBpIDwgdHVwbGVzaXplIDsgaSsrKSB7CisgICAgICAgICAgICBpdCA9IFB5VHVwbGVfR0VUX0lURU0obHotPml0dHVwbGUsIGkpOworICAgICAgICAgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOworICAgICAgICAgICAgaXRlbSA9ICgqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KShpdCk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKG9sZGl0ZW0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgeworICAgICAgICAgICAgaXQgPSBQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdHR1cGxlLCBpKTsKKyAgICAgICAgICAgIGFzc2VydChQeUl0ZXJfQ2hlY2soaXQpKTsKKyAgICAgICAgICAgIGl0ZW0gPSAoKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dCkoaXQpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihpemlwX2RvYywKQEAgLTMxMTQsNTYgKzMxMTQsNTYgQEAKIGEgbGlzdC4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpemlwX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5pemlwIiwJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoaXppcG9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilpemlwX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlpemlwX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWl6aXBfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylpemlwX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlpemlwX25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5pemlwIiwgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihpemlwb2JqZWN0KSwgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWl6aXBfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaXppcF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpemlwX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWl6aXBfbmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgaXppcF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCiAvKiByZXBlYXQgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqZWxlbWVudDsKLQlQeV9zc2l6ZV90IGNudDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmVsZW1lbnQ7CisgICAgUHlfc3NpemVfdCBjbnQ7CiB9IHJlcGVhdG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCByZXBlYXRfdHlwZTsKQEAgLTMxNzEsODggKzMxNzEsODggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXBlYXRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJlcGVhdG9iamVjdCAqcm87Ci0JUHlPYmplY3QgKmVsZW1lbnQ7Ci0JUHlfc3NpemVfdCBjbnQgPSAtMTsKKyAgICByZXBlYXRvYmplY3QgKnJvOworICAgIFB5T2JqZWN0ICplbGVtZW50OworICAgIFB5X3NzaXplX3QgY250ID0gLTE7CiAKLQlpZiAodHlwZSA9PSAmcmVwZWF0X3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJyZXBlYXQoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmcmVwZWF0X3R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJyZXBlYXQoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xuOnJlcGVhdCIsICZlbGVtZW50LCAmY250KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfG46cmVwZWF0IiwgJmVsZW1lbnQsICZjbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMiAmJiBjbnQgPCAwKQotCQljbnQgPSAwOworICAgIGlmIChQeVR1cGxlX1NpemUoYXJncykgPT0gMiAmJiBjbnQgPCAwKQorICAgICAgICBjbnQgPSAwOwogCi0Jcm8gPSAocmVwZWF0b2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKHJvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihlbGVtZW50KTsKLQlyby0+ZWxlbWVudCA9IGVsZW1lbnQ7Ci0Jcm8tPmNudCA9IGNudDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopcm87CisgICAgcm8gPSAocmVwZWF0b2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHJvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihlbGVtZW50KTsKKyAgICByby0+ZWxlbWVudCA9IGVsZW1lbnQ7CisgICAgcm8tPmNudCA9IGNudDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcm87CiB9CiAKIHN0YXRpYyB2b2lkCiByZXBlYXRfZGVhbGxvYyhyZXBlYXRvYmplY3QgKnJvKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2socm8pOwotCVB5X1hERUNSRUYocm8tPmVsZW1lbnQpOwotCVB5X1RZUEUocm8pLT50cF9mcmVlKHJvKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHJvKTsKKyAgICBQeV9YREVDUkVGKHJvLT5lbGVtZW50KTsKKyAgICBQeV9UWVBFKHJvKS0+dHBfZnJlZShybyk7CiB9CiAKIHN0YXRpYyBpbnQKIHJlcGVhdF90cmF2ZXJzZShyZXBlYXRvYmplY3QgKnJvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChyby0+ZWxlbWVudCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQocm8tPmVsZW1lbnQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVwZWF0X25leHQocmVwZWF0b2JqZWN0ICpybykKIHsKLQlpZiAocm8tPmNudCA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocm8tPmNudCA+IDApCi0JCXJvLT5jbnQtLTsKLQlQeV9JTkNSRUYocm8tPmVsZW1lbnQpOwotCXJldHVybiByby0+ZWxlbWVudDsKKyAgICBpZiAocm8tPmNudCA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocm8tPmNudCA+IDApCisgICAgICAgIHJvLT5jbnQtLTsKKyAgICBQeV9JTkNSRUYocm8tPmVsZW1lbnQpOworICAgIHJldHVybiByby0+ZWxlbWVudDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlcGVhdF9yZXByKHJlcGVhdG9iamVjdCAqcm8pCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCwgKm9ianJlcHI7CisgICAgUHlPYmplY3QgKnJlc3VsdCwgKm9ianJlcHI7CiAKLQlvYmpyZXByID0gUHlPYmplY3RfUmVwcihyby0+ZWxlbWVudCk7Ci0JaWYgKG9ianJlcHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgb2JqcmVwciA9IFB5T2JqZWN0X1JlcHIocm8tPmVsZW1lbnQpOworICAgIGlmIChvYmpyZXByID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJvLT5jbnQgPT0gLTEpCi0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInJlcGVhdCglcykiLAotCQkJUHlTdHJpbmdfQVNfU1RSSU5HKG9ianJlcHIpKTsKLQllbHNlCi0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInJlcGVhdCglcywgJXpkKSIsCi0JCQlQeVN0cmluZ19BU19TVFJJTkcob2JqcmVwciksIHJvLT5jbnQpOwotCVB5X0RFQ1JFRihvYmpyZXByKTsKLQlyZXR1cm4gcmVzdWx0OwotfQkKKyAgICBpZiAocm8tPmNudCA9PSAtMSkKKyAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgicmVwZWF0KCVzKSIsCisgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcob2JqcmVwcikpOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgicmVwZWF0KCVzLCAlemQpIiwKKyAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhvYmpyZXByKSwgcm8tPmNudCk7CisgICAgUHlfREVDUkVGKG9ianJlcHIpOworICAgIHJldHVybiByZXN1bHQ7Cit9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXBlYXRfbGVuKHJlcGVhdG9iamVjdCAqcm8pCiB7Ci0gICAgICAgIGlmIChyby0+Y250ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxlbigpIG9mIHVuc2l6ZWQgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21TaXplX3Qocm8tPmNudCk7CisgICAgaWYgKHJvLT5jbnQgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxlbigpIG9mIHVuc2l6ZWQgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbVNpemVfdChyby0+Y250KTsKIH0KIAogUHlEb2NfU1RSVkFSKGxlbmd0aF9oaW50X2RvYywgIlByaXZhdGUgbWV0aG9kIHJldHVybmluZyBhbiBlc3RpbWF0ZSBvZiBsZW4obGlzdChpdCkpLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgcmVwZWF0X21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilyZXBlYXRfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilyZXBlYXRfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKHJlcGVhdF9kb2MsCkBAIC0zMjYxLDQ3ICszMjYxLDQ3IEBACiBlbmRsZXNzbHkuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcmVwZWF0X3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIml0ZXJ0b29scy5yZXBlYXQiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihyZXBlYXRvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpcmVwZWF0X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylyZXBlYXRfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlyZXBlYXRfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpcmVwZWF0X3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpcmVwZWF0X25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JcmVwZWF0X21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlyZXBlYXRfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiaXRlcnRvb2xzLnJlcGVhdCIsICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHJlcGVhdG9iamVjdCksICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpcmVwZWF0X2RlYWxsb2MsICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXJlcGVhdF9yZXByLCAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICByZXBlYXRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXJlcGVhdF90cmF2ZXJzZSwgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXJlcGVhdF9uZXh0LCAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHJlcGVhdF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgcmVwZWF0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogaXppcGxvbmdlc3Qgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMzMDksMTIgKzMzMDksMTIgQEAKICNpbmNsdWRlICJQeXRob24uaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90IHR1cGxlc2l6ZTsKLQlQeV9zc2l6ZV90IG51bWFjdGl2ZTsJCi0JUHlPYmplY3QgKml0dHVwbGU7CQkvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICpmaWxsdmFsdWU7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgdHVwbGVzaXplOworICAgIFB5X3NzaXplX3QgbnVtYWN0aXZlOworICAgIFB5T2JqZWN0ICppdHR1cGxlOyAgICAgICAgICAgICAgICAgIC8qIHR1cGxlIG9mIGl0ZXJhdG9ycyAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmZpbGx2YWx1ZTsKIH0gaXppcGxvbmdlc3RvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgaXppcGxvbmdlc3RfdHlwZTsKQEAgLTMzMjIsMTYxICszMzIyLDE2MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGl6aXBfbG9uZ2VzdF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaXppcGxvbmdlc3RvYmplY3QgKmx6OwotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqaXR0dXBsZTsgIC8qIHR1cGxlIG9mIGl0ZXJhdG9ycyAqLwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKmZpbGx2YWx1ZSA9IFB5X05vbmU7Ci0JUHlfc3NpemVfdCB0dXBsZXNpemUgPSBQeVNlcXVlbmNlX0xlbmd0aChhcmdzKTsKKyAgICBpemlwbG9uZ2VzdG9iamVjdCAqbHo7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICppdHR1cGxlOyAgLyogdHVwbGUgb2YgaXRlcmF0b3JzICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqZmlsbHZhbHVlID0gUHlfTm9uZTsKKyAgICBQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IFB5U2VxdWVuY2VfTGVuZ3RoKGFyZ3MpOwogCi0gICAgICAgIGlmIChrd2RzICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrRXhhY3Qoa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZmlsbHZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa3dkcywgImZpbGx2YWx1ZSIpOwotICAgICAgICAgICAgICAgIGlmIChmaWxsdmFsdWUgPT0gTlVMTCAgfHwgIFB5RGljdF9TaXplKGt3ZHMpID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiaXppcF9sb25nZXN0KCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KKyAgICBpZiAoa3dkcyAhPSBOVUxMICYmIFB5RGljdF9DaGVja0V4YWN0KGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpID4gMCkgeworICAgICAgICBmaWxsdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhrd2RzLCAiZmlsbHZhbHVlIik7CisgICAgICAgIGlmIChmaWxsdmFsdWUgPT0gTlVMTCAgfHwgIFB5RGljdF9TaXplKGt3ZHMpID4gMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiaXppcF9sb25nZXN0KCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KKyAgICB9CiAKLQkvKiBhcmdzIG11c3QgYmUgYSB0dXBsZSAqLwotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICAvKiBhcmdzIG11c3QgYmUgYSB0dXBsZSAqLworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKIAotCS8qIG9idGFpbiBpdGVyYXRvcnMgKi8KLQlpdHR1cGxlID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKLQlpZiAoaXR0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGk9MDsgaSA8IHR1cGxlc2l6ZTsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJUHlPYmplY3QgKml0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVtKTsKLQkJaWYgKGl0ID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgIml6aXBfbG9uZ2VzdCBhcmd1bWVudCAjJXpkIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iLAotCQkJCSAgICBpKzEpOwotCQkJUHlfREVDUkVGKGl0dHVwbGUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShpdHR1cGxlLCBpLCBpdCk7Ci0JfQorICAgIC8qIG9idGFpbiBpdGVyYXRvcnMgKi8KKyAgICBpdHR1cGxlID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKKyAgICBpZiAoaXR0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGk9MDsgaSA8IHR1cGxlc2l6ZTsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgUHlPYmplY3QgKml0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVtKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIml6aXBfbG9uZ2VzdCBhcmd1bWVudCAjJXpkIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICBpKzEpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0dHVwbGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShpdHR1cGxlLCBpLCBpdCk7CisgICAgfQogCi0JLyogY3JlYXRlIGEgcmVzdWx0IGhvbGRlciAqLwotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihpdHR1cGxlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBQeV9Ob25lKTsKLQl9CisgICAgLyogY3JlYXRlIGEgcmVzdWx0IGhvbGRlciAqLworICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdHR1cGxlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBQeV9Ob25lKTsKKyAgICB9CiAKLQkvKiBjcmVhdGUgaXppcGxvbmdlc3RvYmplY3Qgc3RydWN0dXJlICovCi0JbHogPSAoaXppcGxvbmdlc3RvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobHogPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaXR0dXBsZSk7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbHotPml0dHVwbGUgPSBpdHR1cGxlOwotCWx6LT50dXBsZXNpemUgPSB0dXBsZXNpemU7Ci0JbHotPm51bWFjdGl2ZSA9IHR1cGxlc2l6ZTsKLQlsei0+cmVzdWx0ID0gcmVzdWx0OwotCVB5X0lOQ1JFRihmaWxsdmFsdWUpOwotCWx6LT5maWxsdmFsdWUgPSBmaWxsdmFsdWU7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWx6OworICAgIC8qIGNyZWF0ZSBpemlwbG9uZ2VzdG9iamVjdCBzdHJ1Y3R1cmUgKi8KKyAgICBseiA9IChpemlwbG9uZ2VzdG9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChseiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihpdHR1cGxlKTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsei0+aXR0dXBsZSA9IGl0dHVwbGU7CisgICAgbHotPnR1cGxlc2l6ZSA9IHR1cGxlc2l6ZTsKKyAgICBsei0+bnVtYWN0aXZlID0gdHVwbGVzaXplOworICAgIGx6LT5yZXN1bHQgPSByZXN1bHQ7CisgICAgUHlfSU5DUkVGKGZpbGx2YWx1ZSk7CisgICAgbHotPmZpbGx2YWx1ZSA9IGZpbGx2YWx1ZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbHo7CiB9CiAKIHN0YXRpYyB2b2lkCiBpemlwX2xvbmdlc3RfZGVhbGxvYyhpemlwbG9uZ2VzdG9iamVjdCAqbHopCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhseik7Ci0JUHlfWERFQ1JFRihsei0+aXR0dXBsZSk7Ci0JUHlfWERFQ1JFRihsei0+cmVzdWx0KTsKLQlQeV9YREVDUkVGKGx6LT5maWxsdmFsdWUpOwotCVB5X1RZUEUobHopLT50cF9mcmVlKGx6KTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKKyAgICBQeV9YREVDUkVGKGx6LT5pdHR1cGxlKTsKKyAgICBQeV9YREVDUkVGKGx6LT5yZXN1bHQpOworICAgIFB5X1hERUNSRUYobHotPmZpbGx2YWx1ZSk7CisgICAgUHlfVFlQRShseiktPnRwX2ZyZWUobHopOwogfQogCiBzdGF0aWMgaW50CiBpemlwX2xvbmdlc3RfdHJhdmVyc2UoaXppcGxvbmdlc3RvYmplY3QgKmx6LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChsei0+aXR0dXBsZSk7Ci0JUHlfVklTSVQobHotPnJlc3VsdCk7Ci0JUHlfVklTSVQobHotPmZpbGx2YWx1ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQobHotPml0dHVwbGUpOworICAgIFB5X1ZJU0lUKGx6LT5yZXN1bHQpOworICAgIFB5X1ZJU0lUKGx6LT5maWxsdmFsdWUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaXppcF9sb25nZXN0X25leHQoaXppcGxvbmdlc3RvYmplY3QgKmx6KQogewotICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgIFB5X3NzaXplX3QgdHVwbGVzaXplID0gbHotPnR1cGxlc2l6ZTsKLSAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7Ci0gICAgICAgIFB5T2JqZWN0ICppdDsKLSAgICAgICAgUHlPYmplY3QgKml0ZW07Ci0gICAgICAgIFB5T2JqZWN0ICpvbGRpdGVtOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IHR1cGxlc2l6ZSA9IGx6LT50dXBsZXNpemU7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGx6LT5yZXN1bHQ7CisgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICpvbGRpdGVtOwogCi0gICAgICAgIGlmICh0dXBsZXNpemUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKGx6LT5udW1hY3RpdmUgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKFB5X1JFRkNOVChyZXN1bHQpID09IDEpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MCA7IGkgPCB0dXBsZXNpemUgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXR0dXBsZSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYobHotPmZpbGx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBsei0+ZmlsbHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHotPm51bWFjdGl2ZSAtPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsei0+bnVtYWN0aXZlID09IDAgfHwgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHotPm51bWFjdGl2ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYobHotPmZpbGx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gbHotPmZpbGx2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGx6LT5pdHR1cGxlLCBpLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvbGRpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGl0ZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9sZGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBQeVR1cGxlX05ldyh0dXBsZXNpemUpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICBpZiAodHVwbGVzaXplID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChsei0+bnVtYWN0aXZlID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeV9SRUZDTlQocmVzdWx0KSA9PSAxKSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICBmb3IgKGk9MCA7IGkgPCB0dXBsZXNpemUgOyBpKyspIHsKKyAgICAgICAgICAgIGl0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXR0dXBsZSwgaSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihsei0+ZmlsbHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpdGVtID0gbHotPmZpbGx2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOworICAgICAgICAgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBsei0+bnVtYWN0aXZlIC09IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChsei0+bnVtYWN0aXZlID09IDAgfHwgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbHotPm51bWFjdGl2ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIGZvciAoaT0wIDsgaSA8IHR1cGxlc2l6ZSA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSBQeVR1cGxlX0dFVF9JVEVNKGx6LT5pdHR1cGxlLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihsei0+ZmlsbHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGx6LT5maWxsdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlJdGVyX0NoZWNrKGl0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei0+bnVtYWN0aXZlIC09IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGx6LT5udW1hY3RpdmUgPT0gMCB8fCBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsei0+bnVtYWN0aXZlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihsei0+ZmlsbHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBsei0+ZmlsbHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obHotPml0dHVwbGUsIGksIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihsei0+ZmlsbHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBsei0+ZmlsbHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShsei0+aXR0dXBsZSwgaSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb2xkaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCBpKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRpdGVtKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KHR1cGxlc2l6ZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IgKGk9MCA7IGkgPCB0dXBsZXNpemUgOyBpKyspIHsKKyAgICAgICAgICAgIGl0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXR0dXBsZSwgaSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihsei0+ZmlsbHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpdGVtID0gbHotPmZpbGx2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KFB5SXRlcl9DaGVjayhpdCkpOworICAgICAgICAgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBsei0+bnVtYWN0aXZlIC09IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChsei0+bnVtYWN0aXZlID09IDAgfHwgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbHotPm51bWFjdGl2ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGx6LT5maWxsdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGx6LT5maWxsdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGx6LT5pdHR1cGxlLCBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGl6aXBfbG9uZ2VzdF9kb2MsCkBAIC0zNDkxLDQ3ICszNDkxLDQ3IEBACiAiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpemlwbG9uZ2VzdF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJpdGVydG9vbHMuaXppcF9sb25nZXN0IiwJLyogdHBfbmFtZSAqLwotCXNpemVvZihpemlwbG9uZ2VzdG9iamVjdCksCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWl6aXBfbG9uZ2VzdF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JaXppcF9sb25nZXN0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWl6aXBfbG9uZ2VzdF90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWl6aXBfbG9uZ2VzdF9uZXh0LAkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JaXppcF9sb25nZXN0X25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIml0ZXJ0b29scy5pemlwX2xvbmdlc3QiLCAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihpemlwbG9uZ2VzdG9iamVjdCksICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWl6aXBfbG9uZ2VzdF9kZWFsbG9jLCAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBpemlwX2xvbmdlc3RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpaXppcF9sb25nZXN0X3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWl6aXBfbG9uZ2VzdF9uZXh0LCAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpemlwX2xvbmdlc3RfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIG1vZHVsZSBsZXZlbCBjb2RlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzU2Nyw1NSArMzU2Nyw1NSBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewotCXsidGVlIiwJKFB5Q0Z1bmN0aW9uKXRlZSwJTUVUSF9WQVJBUkdTLCB0ZWVfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InRlZSIsICAgICAoUHlDRnVuY3Rpb24pdGVlLCAgICAgICBNRVRIX1ZBUkFSR1MsIHRlZV9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeU1PRElOSVRfRlVOQwogaW5pdGl0ZXJ0b29scyh2b2lkKQogewotCWludCBpOwotCVB5T2JqZWN0ICptOwotCWNoYXIgKm5hbWU7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlbGlzdFtdID0gewotCQkmY29tYmluYXRpb25zX3R5cGUsCi0JCSZjeWNsZV90eXBlLAotCQkmZHJvcHdoaWxlX3R5cGUsCi0JCSZ0YWtld2hpbGVfdHlwZSwKLQkJJmlzbGljZV90eXBlLAotCQkmc3Rhcm1hcF90eXBlLAotCQkmaW1hcF90eXBlLAotCQkmY2hhaW5fdHlwZSwKLQkJJmlmaWx0ZXJfdHlwZSwKLQkJJmlmaWx0ZXJmYWxzZV90eXBlLAotCQkmY291bnRfdHlwZSwKLQkJJml6aXBfdHlwZSwKLQkJJml6aXBsb25nZXN0X3R5cGUsCi0JCSZwZXJtdXRhdGlvbnNfdHlwZSwKLQkJJnByb2R1Y3RfdHlwZSwKLQkJJnJlcGVhdF90eXBlLAotCQkmZ3JvdXBieV90eXBlLAotCQlOVUxMCi0JfTsKKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBjaGFyICpuYW1lOworICAgIFB5VHlwZU9iamVjdCAqdHlwZWxpc3RbXSA9IHsKKyAgICAgICAgJmNvbWJpbmF0aW9uc190eXBlLAorICAgICAgICAmY3ljbGVfdHlwZSwKKyAgICAgICAgJmRyb3B3aGlsZV90eXBlLAorICAgICAgICAmdGFrZXdoaWxlX3R5cGUsCisgICAgICAgICZpc2xpY2VfdHlwZSwKKyAgICAgICAgJnN0YXJtYXBfdHlwZSwKKyAgICAgICAgJmltYXBfdHlwZSwKKyAgICAgICAgJmNoYWluX3R5cGUsCisgICAgICAgICZpZmlsdGVyX3R5cGUsCisgICAgICAgICZpZmlsdGVyZmFsc2VfdHlwZSwKKyAgICAgICAgJmNvdW50X3R5cGUsCisgICAgICAgICZpemlwX3R5cGUsCisgICAgICAgICZpemlwbG9uZ2VzdF90eXBlLAorICAgICAgICAmcGVybXV0YXRpb25zX3R5cGUsCisgICAgICAgICZwcm9kdWN0X3R5cGUsCisgICAgICAgICZyZXBlYXRfdHlwZSwKKyAgICAgICAgJmdyb3VwYnlfdHlwZSwKKyAgICAgICAgTlVMTAorICAgIH07CiAKLQlQeV9UWVBFKCZ0ZWVkYXRhb2JqZWN0X3R5cGUpID0gJlB5VHlwZV9UeXBlOwotCW0gPSBQeV9Jbml0TW9kdWxlMygiaXRlcnRvb2xzIiwgbW9kdWxlX21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBQeV9UWVBFKCZ0ZWVkYXRhb2JqZWN0X3R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiaXRlcnRvb2xzIiwgbW9kdWxlX21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWZvciAoaT0wIDsgdHlwZWxpc3RbaV0gIT0gTlVMTCA7IGkrKykgewotCQlpZiAoUHlUeXBlX1JlYWR5KHR5cGVsaXN0W2ldKSA8IDApCi0JCQlyZXR1cm47Ci0JCW5hbWUgPSBzdHJjaHIodHlwZWxpc3RbaV0tPnRwX25hbWUsICcuJyk7Ci0JCWFzc2VydCAobmFtZSAhPSBOVUxMKTsKLQkJUHlfSU5DUkVGKHR5cGVsaXN0W2ldKTsKLQkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sIG5hbWUrMSwgKFB5T2JqZWN0ICopdHlwZWxpc3RbaV0pOwotCX0KKyAgICBmb3IgKGk9MCA7IHR5cGVsaXN0W2ldICE9IE5VTEwgOyBpKyspIHsKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0eXBlbGlzdFtpXSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBuYW1lID0gc3RyY2hyKHR5cGVsaXN0W2ldLT50cF9uYW1lLCAnLicpOworICAgICAgICBhc3NlcnQgKG5hbWUgIT0gTlVMTCk7CisgICAgICAgIFB5X0lOQ1JFRih0eXBlbGlzdFtpXSk7CisgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCBuYW1lKzEsIChQeU9iamVjdCAqKXR5cGVsaXN0W2ldKTsKKyAgICB9CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZ0ZWVkYXRhb2JqZWN0X3R5cGUpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChQeVR5cGVfUmVhZHkoJnRlZV90eXBlKSA8IDApCi0JCXJldHVybjsKLQlpZiAoUHlUeXBlX1JlYWR5KCZfZ3JvdXBlcl90eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZ0ZWVkYXRhb2JqZWN0X3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChQeVR5cGVfUmVhZHkoJnRlZV90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZfZ3JvdXBlcl90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvbGludXhhdWRpb2Rldi5jIGIvTW9kdWxlcy9saW51eGF1ZGlvZGV2LmMKaW5kZXggODAwNzdjNi4uN2ZlMjBhZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9saW51eGF1ZGlvZGV2LmMKKysrIGIvTW9kdWxlcy9saW51eGF1ZGlvZGV2LmMKQEAgLTEsMTQgKzEsMTQgQEAKLS8qIEhleSBFbWFjcywgdGhpcyBpcyAtKi1DLSotIAorLyogSGV5IEVtYWNzLCB0aGlzIGlzIC0qLUMtKi0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGxpbnV4YXVkaW9kZXYuYyAtLSBMaW51eCBhdWRpbyBkZXZpY2UgZm9yIHB5dGhvbi4KLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICA6IFBldGVyIEJvc2NoCiAgKiBDcmVhdGVkIE9uICAgICAgOiBUaHUgTWFyICAyIDIxOjEwOjMzIDIwMDAKICAqIFN0YXR1cyAgICAgICAgICA6IFVua25vd24sIFVzZSB3aXRoIGNhdXRpb24hCi0gKiAKKyAqCiAgKiBVbmxlc3Mgb3RoZXIgbm90aWNlcyBhcmUgcHJlc2VudCBpbiBhbnkgcGFydCBvZiB0aGlzIGZpbGUKLSAqIGV4cGxpY2l0bHkgY2xhaW1pbmcgY29weXJpZ2h0cyBmb3Igb3RoZXIgcGVvcGxlIGFuZC9vciAKLSAqIG9yZ2FuaXphdGlvbnMsIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgaXMgZnVsbHkgY29weXJpZ2h0IAorICogZXhwbGljaXRseSBjbGFpbWluZyBjb3B5cmlnaHRzIGZvciBvdGhlciBwZW9wbGUgYW5kL29yCisgKiBvcmdhbml6YXRpb25zLCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGlzIGZ1bGx5IGNvcHlyaWdodAogICogKEMpIDIwMDAgUGV0ZXIgQm9zY2gsIGFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KQEAgLTQzLDExICs0MywxMSBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIGludAkJeF9mZDsJCS8qIFRoZSBvcGVuIGZpbGUgKi8KKyAgICBpbnQgICAgICAgICB4X2ZkOyAgICAgICAgICAgLyogVGhlIG9wZW4gZmlsZSAqLwogICAgIGludCAgICAgICAgIHhfbW9kZTsgICAgICAgICAgIC8qIGZpbGUgbW9kZSAqLwotICAgIGludAkJeF9pY291bnQ7CS8qIElucHV0IGNvdW50ICovCi0gICAgaW50CQl4X29jb3VudDsJLyogT3V0cHV0IGNvdW50ICovCi0gICAgdWludDMyX3QJeF9hZm10czsJLyogQXVkaW8gZm9ybWF0cyBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUqLworICAgIGludCAgICAgICAgIHhfaWNvdW50OyAgICAgICAvKiBJbnB1dCBjb3VudCAqLworICAgIGludCAgICAgICAgIHhfb2NvdW50OyAgICAgICAvKiBPdXRwdXQgY291bnQgKi8KKyAgICB1aW50MzJfdCAgICB4X2FmbXRzOyAgICAgICAgLyogQXVkaW8gZm9ybWF0cyBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUqLwogfSBsYWRfdDsKIAogLyogWFhYIHNldmVyYWwgZm9ybWF0IGRlZmluZWQgaW4gc291bmRjYXJkLmggYXJlIG5vdCBzdXBwb3J0ZWQsCkBAIC01NSwxOSArNTUsMTkgQEAKICovCiAKIHN0YXRpYyBzdHJ1Y3QgewotICAgIGludAkJYV9icHM7Ci0gICAgdWludDMyX3QJYV9mbXQ7CisgICAgaW50ICAgICAgICAgYV9icHM7CisgICAgdWludDMyX3QgICAgYV9mbXQ7CiAgICAgY2hhciAgICAgICAqYV9uYW1lOwogfSBhdWRpb190eXBlc1tdID0gewotICAgIHsgIDgsIAlBRk1UX01VX0xBVywgImxvZ2FyaXRobWljIG11LWxhdyA4LWJpdCBhdWRpbyIgfSwKLSAgICB7ICA4LCAJQUZNVF9BX0xBVywgICJsb2dhcml0aG1pYyBBLWxhdyA4LWJpdCBhdWRpbyIgfSwKLSAgICB7ICA4LAlBRk1UX1U4LCAgICAgImxpbmVhciB1bnNpZ25lZCA4LWJpdCBhdWRpbyIgfSwKLSAgICB7ICA4LCAJQUZNVF9TOCwgICAgICJsaW5lYXIgc2lnbmVkIDgtYml0IGF1ZGlvIiB9LAotICAgIHsgMTYsIAlBRk1UX1UxNl9CRSwgImxpbmVhciB1bnNpZ25lZCAxNi1iaXQgYmlnLWVuZGlhbiBhdWRpbyIgfSwKLSAgICB7IDE2LCAJQUZNVF9VMTZfTEUsICJsaW5lYXIgdW5zaWduZWQgMTYtYml0IGxpdHRsZS1lbmRpYW4gYXVkaW8iIH0sCi0gICAgeyAxNiwgCUFGTVRfUzE2X0JFLCAibGluZWFyIHNpZ25lZCAxNi1iaXQgYmlnLWVuZGlhbiBhdWRpbyIgfSwKLSAgICB7IDE2LCAJQUZNVF9TMTZfTEUsICJsaW5lYXIgc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuIGF1ZGlvIiB9LAotICAgIHsgMTYsIAlBRk1UX1MxNl9ORSwgImxpbmVhciBzaWduZWQgMTYtYml0IG5hdGl2ZS1lbmRpYW4gYXVkaW8iIH0sCisgICAgeyAgOCwgICAgICAgQUZNVF9NVV9MQVcsICJsb2dhcml0aG1pYyBtdS1sYXcgOC1iaXQgYXVkaW8iIH0sCisgICAgeyAgOCwgICAgICAgQUZNVF9BX0xBVywgICJsb2dhcml0aG1pYyBBLWxhdyA4LWJpdCBhdWRpbyIgfSwKKyAgICB7ICA4LCAgICAgICBBRk1UX1U4LCAgICAgImxpbmVhciB1bnNpZ25lZCA4LWJpdCBhdWRpbyIgfSwKKyAgICB7ICA4LCAgICAgICBBRk1UX1M4LCAgICAgImxpbmVhciBzaWduZWQgOC1iaXQgYXVkaW8iIH0sCisgICAgeyAxNiwgICAgICAgQUZNVF9VMTZfQkUsICJsaW5lYXIgdW5zaWduZWQgMTYtYml0IGJpZy1lbmRpYW4gYXVkaW8iIH0sCisgICAgeyAxNiwgICAgICAgQUZNVF9VMTZfTEUsICJsaW5lYXIgdW5zaWduZWQgMTYtYml0IGxpdHRsZS1lbmRpYW4gYXVkaW8iIH0sCisgICAgeyAxNiwgICAgICAgQUZNVF9TMTZfQkUsICJsaW5lYXIgc2lnbmVkIDE2LWJpdCBiaWctZW5kaWFuIGF1ZGlvIiB9LAorICAgIHsgMTYsICAgICAgIEFGTVRfUzE2X0xFLCAibGluZWFyIHNpZ25lZCAxNi1iaXQgbGl0dGxlLWVuZGlhbiBhdWRpbyIgfSwKKyAgICB7IDE2LCAgICAgICBBRk1UX1MxNl9ORSwgImxpbmVhciBzaWduZWQgMTYtYml0IG5hdGl2ZS1lbmRpYW4gYXVkaW8iIH0sCiB9OwogCiBzdGF0aWMgaW50IG5fYXVkaW9fdHlwZXMgPSBzaXplb2YoYXVkaW9fdHlwZXMpIC8gc2l6ZW9mKGF1ZGlvX3R5cGVzWzBdKTsKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgIC8qIE9wZW4gdGhlIGNvcnJlY3QgZGV2aWNlLiAgVGhlIGJhc2UgZGV2aWNlIG5hbWUgY29tZXMgZnJvbSB0aGUKICAgICAgKiBBVURJT0RFViBlbnZpcm9ubWVudCB2YXJpYWJsZSBmaXJzdCwgdGhlbiAvZGV2L2RzcC4gIFRoZQogICAgICAqIGNvbnRyb2wgZGV2aWNlIHRhY2tzICJjdGwiIG9udG8gdGhlIGJhc2UgZGV2aWNlIG5hbWUuCi0gICAgICogCisgICAgICoKICAgICAgKiBOb3RlIHRoYXQgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIC9kZXYvYXVkaW8gYW5kIC9kZXYvZHNwCiAgICAgICogaXMgdGhhdCB0aGUgZm9ybWVyIHVzZXMgbG9nYXJpdGhtaWMgbXUtbGF3IGVuY29kaW5nIGFuZCB0aGUKICAgICAgKiBsYXR0ZXIgdXNlcyA4LWJpdCB1bnNpZ25lZCBlbmNvZGluZy4KQEAgLTE0OSw3ICsxNDksNyBAQAogewogICAgIC8qIGlmIGFscmVhZHkgY2xvc2VkLCBkb24ndCByZWNsb3NlIGl0ICovCiAgICAgaWYgKHhwLT54X2ZkICE9IC0xKQotCWNsb3NlKHhwLT54X2ZkKTsKKyAgICAgICAgY2xvc2UoeHAtPnhfZmQpOwogICAgIFB5T2JqZWN0X0RlbCh4cCk7CiB9CiAKQEAgLTE1OSw3ICsxNTksNyBAQAogICAgIGludCBzaXplLCBjb3VudDsKICAgICBjaGFyICpjcDsKICAgICBQeU9iamVjdCAqcnY7Ci0JCisKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVhZCIsICZzaXplKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKTsKQEAgLTE4NCwzNiArMTg0LDM2IEBACiAgICAgZmRfc2V0IHdyaXRlX3NldF9mZHM7CiAgICAgc3RydWN0IHRpbWV2YWwgdHY7CiAgICAgaW50IHNlbGVjdF9yZXR2YWw7Ci0gICAgCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp3cml0ZSIsICZjcCwgJnNpemUpKSAKLQlyZXR1cm4gTlVMTDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6d3JpdGUiLCAmY3AsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAvKiB1c2Ugc2VsZWN0IHRvIHdhaXQgZm9yIGF1ZGlvIGRldmljZSB0byBiZSBhdmFpbGFibGUgKi8KICAgICBGRF9aRVJPKCZ3cml0ZV9zZXRfZmRzKTsKICAgICBGRF9TRVQoc2VsZi0+eF9mZCwgJndyaXRlX3NldF9mZHMpOwogICAgIHR2LnR2X3NlYyA9IDQ7IC8qIHRpbWVvdXQgdmFsdWVzICovCi0gICAgdHYudHZfdXNlYyA9IDA7IAorICAgIHR2LnR2X3VzZWMgPSAwOwogCiAgICAgd2hpbGUgKHNpemUgPiAwKSB7CiAgICAgICBzZWxlY3RfcmV0dmFsID0gc2VsZWN0KHNlbGYtPnhfZmQrMSwgTlVMTCwgJndyaXRlX3NldF9mZHMsIE5VTEwsICZ0dik7CiAgICAgICB0di50dl9zZWMgPSAxOyB0di50dl91c2VjID0gMDsgLyogd2lsbGluZyB0byB3YWl0IHRoaXMgbG9uZyBuZXh0IHRpbWUqLwogICAgICAgaWYgKHNlbGVjdF9yZXR2YWwpIHsKICAgICAgICAgaWYgKChydiA9IHdyaXRlKHNlbGYtPnhfZmQsIGNwLCBzaXplKSkgPT0gLTEpIHsKLQkgIGlmIChlcnJubyAhPSBFQUdBSU4pIHsKLQkgICAgUHlFcnJfU2V0RnJvbUVycm5vKExpbnV4QXVkaW9FcnJvcik7Ci0JICAgIHJldHVybiBOVUxMOwotCSAgfSBlbHNlIHsKLQkgICAgZXJybm8gPSAwOyAvKiBFQUdBSU46IGJ1ZmZlciBpcyBmdWxsLCB0cnkgYWdhaW4gKi8KLQkgIH0KKyAgICAgICAgICBpZiAoZXJybm8gIT0gRUFHQUlOKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oTGludXhBdWRpb0Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnJubyA9IDA7IC8qIEVBR0FJTjogYnVmZmVyIGlzIGZ1bGwsIHRyeSBhZ2FpbiAqLworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLQkgIHNlbGYtPnhfb2NvdW50ICs9IHJ2OwotCSAgc2l6ZSAtPSBydjsKLQkgIGNwICs9IHJ2OwotCX0KKyAgICAgICAgICBzZWxmLT54X29jb3VudCArPSBydjsKKyAgICAgICAgICBzaXplIC09IHJ2OworICAgICAgICAgIGNwICs9IHJ2OworICAgICAgICB9CiAgICAgICB9IGVsc2UgewotCS8qIHByaW50ZigiTm90IGFibGUgdG8gd3JpdGUgdG8gbGludXggYXVkaW8gZGV2aWNlIHdpdGhpbiAlbGQgc2Vjb25kc1xuIiwgdHYudHZfc2VjKTsgKi8KLQlQeUVycl9TZXRGcm9tRXJybm8oTGludXhBdWRpb0Vycm9yKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgLyogcHJpbnRmKCJOb3QgYWJsZSB0byB3cml0ZSB0byBsaW51eCBhdWRpbyBkZXZpY2Ugd2l0aGluICVsZCBzZWNvbmRzXG4iLCB0di50dl9zZWMpOyAqLworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oTGludXhBdWRpb0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICB9CiAgICAgfQogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKQEAgLTI0NCw0NyArMjQ0LDQ3IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWlpfGk6c2V0cGFyYW1ldGVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYXRlLCAmc3NpemUsICZuY2hhbm5lbHMsICZmbXQsICZlbXVsYXRlKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gIAorCiAgICAgaWYgKHJhdGUgPCAwKSB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJleHBlY3RlZCByYXRlID49IDAsIG5vdCAlZCIsCi0JCSAgICAgcmF0ZSk7IAotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgImV4cGVjdGVkIHJhdGUgPj0gMCwgbm90ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHJhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKHNzaXplIDwgMCkgewotCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiZXhwZWN0ZWQgc2FtcGxlIHNpemUgPj0gMCwgbm90ICVkIiwKLQkJICAgICBzc2l6ZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiZXhwZWN0ZWQgc2FtcGxlIHNpemUgPj0gMCwgbm90ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHNzaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChuY2hhbm5lbHMgIT0gMSAmJiBuY2hhbm5lbHMgIT0gMikgewotCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAibmNoYW5uZWxzIG11c3QgYmUgMSBvciAyLCBub3QgJWQiLAotCQkgICAgIG5jaGFubmVscyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAibmNoYW5uZWxzIG11c3QgYmUgMSBvciAyLCBub3QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgbmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgZm9yIChuID0gMDsgbiA8IG5fYXVkaW9fdHlwZXM7IG4rKykKICAgICAgICAgaWYgKGZtdCA9PSBhdWRpb190eXBlc1tuXS5hX2ZtdCkKICAgICAgICAgICAgIGJyZWFrOwogICAgIGlmIChuID09IG5fYXVkaW9fdHlwZXMpIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgInVua25vd24gYXVkaW8gZW5jb2Rpbmc6ICVkIiwgZm10KTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bmtub3duIGF1ZGlvIGVuY29kaW5nOiAlZCIsIGZtdCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoYXVkaW9fdHlwZXNbbl0uYV9icHMgIT0gc3NpemUpIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgCi0JCSAgICAgImZvciAlcywgZXhwZWN0ZWQgc2FtcGxlIHNpemUgJWQsIG5vdCAlZCIsCi0JCSAgICAgYXVkaW9fdHlwZXNbbl0uYV9uYW1lLCBhdWRpb190eXBlc1tuXS5hX2Jwcywgc3NpemUpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJmb3IgJXMsIGV4cGVjdGVkIHNhbXBsZSBzaXplICVkLCBub3QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdHlwZXNbbl0uYV9uYW1lLCBhdWRpb190eXBlc1tuXS5hX2Jwcywgc3NpemUpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBpZiAoZW11bGF0ZSA9PSAwKSB7Ci0JaWYgKChzZWxmLT54X2FmbXRzICYgYXVkaW9fdHlwZXNbbl0uYV9mbXQpID09IDApIHsKLQkgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsIAotCQkJICIlcyBmb3JtYXQgbm90IHN1cHBvcnRlZCBieSBkZXZpY2UiLAotCQkJIGF1ZGlvX3R5cGVzW25dLmFfbmFtZSk7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KKyAgICAgICAgaWYgKChzZWxmLT54X2FmbXRzICYgYXVkaW9fdHlwZXNbbl0uYV9mbXQpID09IDApIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBmb3JtYXQgbm90IHN1cHBvcnRlZCBieSBkZXZpY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3R5cGVzW25dLmFfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgIH0KLSAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgU05EQ1RMX0RTUF9TRVRGTVQsIAotCSAgICAgICZhdWRpb190eXBlc1tuXS5hX2ZtdCkgPT0gLTEpIHsKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgU05EQ1RMX0RTUF9TRVRGTVQsCisgICAgICAgICAgICAgICZhdWRpb190eXBlc1tuXS5hX2ZtdCkgPT0gLTEpIHsKICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKExpbnV4QXVkaW9FcnJvcik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTMwNyw3ICszMDcsNyBAQAogICAgIGludCBmbXQ7CiAKICAgICBmbXQgPSAwOwotICAgIGlmIChpb2N0bChzZWxmLT54X2ZkLCBTTkRDVExfRFNQX1NFVEZNVCwgJmZtdCkgPCAwKSAKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgU05EQ1RMX0RTUF9TRVRGTVQsICZmbXQpIDwgMCkKICAgICAgICAgcmV0dXJuIC1lcnJubzsKIAogICAgIHN3aXRjaCAoZm10KSB7CkBAIC0zMzQsNyArMzM0LDcgQEAKIH0KIAogCi0vKiBidWZzaXplIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGhhcmR3YXJlIGF1ZGlvIGJ1ZmZlciBpbiBudW1iZXIgCisvKiBidWZzaXplIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGhhcmR3YXJlIGF1ZGlvIGJ1ZmZlciBpbiBudW1iZXIKICAgIG9mIHNhbXBsZXMgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBsYWRfYnVmc2l6ZShsYWRfdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKQEAgLTM1Myw3ICszNTMsNyBAQAogICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygoYWkuZnJhZ3N0b3RhbCAqIGFpLmZyYWdzaXplKSAvIChuY2hhbm5lbHMgKiBzc2l6ZSkpOwogfQogCi0vKiBvYnVmY291bnQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoZSAKKy8qIG9idWZjb3VudCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IGFyZSBhdmFpbGFibGUgaW4gdGhlCiAgICBoYXJkd2FyZSBmb3IgcGxheWluZyAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGxhZF9vYnVmY291bnQobGFkX3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCkBAIC0zNjksNyArMzY5LDcgQEAKICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKExpbnV4QXVkaW9FcnJvcik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGFpLmZyYWdzdG90YWwgKiBhaS5mcmFnc2l6ZSAtIGFpLmJ5dGVzKSAvIAorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygoYWkuZnJhZ3N0b3RhbCAqIGFpLmZyYWdzaXplIC0gYWkuYnl0ZXMpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNzaXplICogbmNoYW5uZWxzKSk7CiB9CiAKQEAgLTQxMCw5ICs0MTAsOSBAQAogICAgIGludCByZXE7CiAKICAgICBpZiAoc2VsZi0+eF9tb2RlID09IE9fUkRPTkxZKQotCXJlcSA9IFNORENUTF9EU1BfR0VUSVBUUjsKKyAgICAgICAgcmVxID0gU05EQ1RMX0RTUF9HRVRJUFRSOwogICAgIGVsc2UKLQlyZXEgPSBTTkRDVExfRFNQX0dFVE9QVFI7CisgICAgICAgIHJlcSA9IFNORENUTF9EU1BfR0VUT1BUUjsKICAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgcmVxLCAmaW5mbykgPT0gLTEpIHsKICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKExpbnV4QXVkaW9FcnJvcik7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDIxLDE3ICs0MjEsMTcgQEAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGxhZF9tZXRob2RzW10gPSB7Ci0gICAgeyAicmVhZCIsCQkoUHlDRnVuY3Rpb24pbGFkX3JlYWQsIE1FVEhfVkFSQVJHUyB9LAotICAgIHsgIndyaXRlIiwJCShQeUNGdW5jdGlvbilsYWRfd3JpdGUsIE1FVEhfVkFSQVJHUyB9LAotICAgIHsgInNldHBhcmFtZXRlcnMiLAkoUHlDRnVuY3Rpb24pbGFkX3NldHBhcmFtZXRlcnMsIE1FVEhfVkFSQVJHUyB9LAotICAgIHsgImJ1ZnNpemUiLAkoUHlDRnVuY3Rpb24pbGFkX2J1ZnNpemUsIE1FVEhfVkFSQVJHUyB9LAotICAgIHsgIm9idWZjb3VudCIsCShQeUNGdW5jdGlvbilsYWRfb2J1ZmNvdW50LCBNRVRIX05PQVJHUyB9LAotICAgIHsgIm9idWZmcmVlIiwJKFB5Q0Z1bmN0aW9uKWxhZF9vYnVmZnJlZSwgTUVUSF9OT0FSR1MgfSwKLSAgICB7ICJmbHVzaCIsCQkoUHlDRnVuY3Rpb24pbGFkX2ZsdXNoLCBNRVRIX05PQVJHUyB9LAotICAgIHsgImNsb3NlIiwJCShQeUNGdW5jdGlvbilsYWRfY2xvc2UsIE1FVEhfTk9BUkdTIH0sCi0gICAgeyAiZmlsZW5vIiwgICAgIAkoUHlDRnVuY3Rpb24pbGFkX2ZpbGVubywgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJyZWFkIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilsYWRfcmVhZCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAid3JpdGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pbGFkX3dyaXRlLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJzZXRwYXJhbWV0ZXJzIiwgIChQeUNGdW5jdGlvbilsYWRfc2V0cGFyYW1ldGVycywgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAiYnVmc2l6ZSIsICAgICAgICAoUHlDRnVuY3Rpb24pbGFkX2J1ZnNpemUsIE1FVEhfVkFSQVJHUyB9LAorICAgIHsgIm9idWZjb3VudCIsICAgICAgKFB5Q0Z1bmN0aW9uKWxhZF9vYnVmY291bnQsIE1FVEhfTk9BUkdTIH0sCisgICAgeyAib2J1ZmZyZWUiLCAgICAgICAoUHlDRnVuY3Rpb24pbGFkX29idWZmcmVlLCBNRVRIX05PQVJHUyB9LAorICAgIHsgImZsdXNoIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxhZF9mbHVzaCwgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJjbG9zZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilsYWRfY2xvc2UsIE1FVEhfTk9BUkdTIH0sCisgICAgeyAiZmlsZW5vIiwgICAgICAgICAoUHlDRnVuY3Rpb24pbGFkX2ZpbGVubywgTUVUSF9OT0FSR1MgfSwKICAgICB7ICJnZXRwdHIiLCAgICAgICAgIChQeUNGdW5jdGlvbilsYWRfZ2V0cHRyLCBNRVRIX05PQVJHUyB9LAotICAgIHsgTlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsgTlVMTCwgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDQzLDE1ICs0NDMsMTUgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTGFkdHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQogICAgICJsaW51eGF1ZGlvZGV2LmxpbnV4X2F1ZGlvX2RldmljZSIsIC8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKGxhZF90KSwJCS8qdHBfc2l6ZSovCi0gICAgMCwJCQkJLyp0cF9pdGVtc2l6ZSovCisgICAgc2l6ZW9mKGxhZF90KSwgICAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwogICAgIC8qIG1ldGhvZHMgKi8KLSAgICAoZGVzdHJ1Y3RvcilsYWRfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLSAgICAwLAkJCQkvKnRwX3ByaW50Ki8KLSAgICAoZ2V0YXR0cmZ1bmMpbGFkX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0gICAgMCwJCQkJLyp0cF9zZXRhdHRyKi8KLSAgICAwLAkJCQkvKnRwX2NvbXBhcmUqLwotICAgIDAsCQkJCS8qdHBfcmVwciovCisgICAgKGRlc3RydWN0b3IpbGFkX2RlYWxsb2MsICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylsYWRfZ2V0YXR0ciwgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ2OSwzNyArNDY5LDM3IEBACiBpbml0bGludXhhdWRpb2Rldih2b2lkKQogewogICAgIFB5T2JqZWN0ICptOwotICAgIAorCiAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgbGludXhhdWRpb2RldiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wOyB1c2UgdGhlIG9zc2F1ZGlvZGV2IG1vZHVsZSBpbnN0ZWFkIiwgMikgPCAwKQogICAgICAgICByZXR1cm47Ci0gIAorCiAgICAgbSA9IFB5X0luaXRNb2R1bGUoImxpbnV4YXVkaW9kZXYiLCBsaW51eGF1ZGlvZGV2X21ldGhvZHMpOwogICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICBMaW51eEF1ZGlvRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oImxpbnV4YXVkaW9kZXYuZXJyb3IiLCBOVUxMLCBOVUxMKTsKICAgICBpZiAoTGludXhBdWRpb0Vycm9yKQotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBMaW51eEF1ZGlvRXJyb3IpOworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgTGludXhBdWRpb0Vycm9yKTsKIAogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9NVV9MQVciLCAobG9uZylBRk1UX01VX0xBVykgPT0gLTEpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRk1UX0FfTEFXIiwgKGxvbmcpQUZNVF9BX0xBVykgPT0gLTEpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRk1UX1U4IiwgKGxvbmcpQUZNVF9VOCkgPT0gLTEpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRk1UX1M4IiwgKGxvbmcpQUZNVF9TOCkgPT0gLTEpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRk1UX1UxNl9CRSIsIChsb25nKUFGTVRfVTE2X0JFKSA9PSAtMSkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGTVRfVTE2X0xFIiwgKGxvbmcpQUZNVF9VMTZfTEUpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZNVF9TMTZfQkUiLCAobG9uZylBRk1UX1MxNl9CRSkgPT0gLTEpCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRk1UX1MxNl9MRSIsIChsb25nKUFGTVRfUzE2X0xFKSA9PSAtMSkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGTVRfUzE2X05FIiwgKGxvbmcpQUZNVF9TMTZfTkUpID09IC0xKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9tYWluLmMgYi9Nb2R1bGVzL21haW4uYwppbmRleCBhMTE1OWI3Li5kZDE5NmVmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL21haW4uYworKysgYi9Nb2R1bGVzL21haW4uYwpAQCAtMTA2LDExOSArMTA2LDExOSBAQAogc3RhdGljIGludAogdXNhZ2UoaW50IGV4aXRjb2RlLCBjaGFyKiBwcm9ncmFtKQogewotCUZJTEUgKmYgPSBleGl0Y29kZSA/IHN0ZGVyciA6IHN0ZG91dDsKKyAgICBGSUxFICpmID0gZXhpdGNvZGUgPyBzdGRlcnIgOiBzdGRvdXQ7CiAKLQlmcHJpbnRmKGYsIHVzYWdlX2xpbmUsIHByb2dyYW0pOwotCWlmIChleGl0Y29kZSkKLQkJZnByaW50ZihmLCAiVHJ5IGBweXRob24gLWgnIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIik7Ci0JZWxzZSB7Ci0JCWZwdXRzKHVzYWdlXzEsIGYpOwotCQlmcHV0cyh1c2FnZV8yLCBmKTsKLQkJZnB1dHModXNhZ2VfMywgZik7Ci0JCWZwcmludGYoZiwgdXNhZ2VfNCwgREVMSU0pOwotCQlmcHJpbnRmKGYsIHVzYWdlXzUsIERFTElNLCBQWVRIT05IT01FSEVMUCk7Ci0JfQorICAgIGZwcmludGYoZiwgdXNhZ2VfbGluZSwgcHJvZ3JhbSk7CisgICAgaWYgKGV4aXRjb2RlKQorICAgICAgICBmcHJpbnRmKGYsICJUcnkgYHB5dGhvbiAtaCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZnB1dHModXNhZ2VfMSwgZik7CisgICAgICAgIGZwdXRzKHVzYWdlXzIsIGYpOworICAgICAgICBmcHV0cyh1c2FnZV8zLCBmKTsKKyAgICAgICAgZnByaW50ZihmLCB1c2FnZV80LCBERUxJTSk7CisgICAgICAgIGZwcmludGYoZiwgdXNhZ2VfNSwgREVMSU0sIFBZVEhPTkhPTUVIRUxQKTsKKyAgICB9CiAjaWYgZGVmaW5lZChfX1ZNUykKLQlpZiAoZXhpdGNvZGUgPT0gMCkgewotCQkvKiBzdXBwcmVzcyAnZXJyb3InIG1lc3NhZ2UgKi8KLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQkvKiBTVFMkTV9JTkhJQl9NU0cgKyBTUyRfQUJPUlQgKi8KLQkJcmV0dXJuIDB4MTAwMDAwMmM7Ci0JfQorICAgIGlmIChleGl0Y29kZSA9PSAwKSB7CisgICAgICAgIC8qIHN1cHByZXNzICdlcnJvcicgbWVzc2FnZSAqLworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFNUUyRNX0lOSElCX01TRyArIFNTJF9BQk9SVCAqLworICAgICAgICByZXR1cm4gMHgxMDAwMDAyYzsKKyAgICB9CiAjZWxzZQotCXJldHVybiBleGl0Y29kZTsKKyAgICByZXR1cm4gZXhpdGNvZGU7CiAjZW5kaWYKLQkvKk5PVFJFQUNIRUQqLworICAgIC8qTk9UUkVBQ0hFRCovCiB9CiAKIHN0YXRpYyB2b2lkIFJ1blN0YXJ0dXBGaWxlKFB5Q29tcGlsZXJGbGFncyAqY2YpCiB7Ci0JY2hhciAqc3RhcnR1cCA9IFB5X0dFVEVOVigiUFlUSE9OU1RBUlRVUCIpOwotCWlmIChzdGFydHVwICE9IE5VTEwgJiYgc3RhcnR1cFswXSAhPSAnXDAnKSB7Ci0JCUZJTEUgKmZwID0gZm9wZW4oc3RhcnR1cCwgInIiKTsKLQkJaWYgKGZwICE9IE5VTEwpIHsKLQkJCSh2b2lkKSBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmcCwgc3RhcnR1cCwgMCwgY2YpOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWZjbG9zZShmcCk7Ci0gICAgICAgICAgICAgICB9IGVsc2UgewotCQkJaW50IHNhdmVfZXJybm87Ci0JCQlzYXZlX2Vycm5vID0gZXJybm87Ci0JCQlQeVN5c19Xcml0ZVN0ZGVycigiQ291bGQgbm90IG9wZW4gUFlUSE9OU1RBUlRVUFxuIik7Ci0JCQllcnJubyA9IHNhdmVfZXJybm87Ci0JCQlQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUoUHlFeGNfSU9FcnJvciwKLQkJCQkJCSAgICAgICBzdGFydHVwKTsKLQkJCVB5RXJyX1ByaW50KCk7Ci0JCQlQeUVycl9DbGVhcigpOwotCQl9Ci0JfQorICAgIGNoYXIgKnN0YXJ0dXAgPSBQeV9HRVRFTlYoIlBZVEhPTlNUQVJUVVAiKTsKKyAgICBpZiAoc3RhcnR1cCAhPSBOVUxMICYmIHN0YXJ0dXBbMF0gIT0gJ1wwJykgeworICAgICAgICBGSUxFICpmcCA9IGZvcGVuKHN0YXJ0dXAsICJyIik7CisgICAgICAgIGlmIChmcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAodm9pZCkgUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZnAsIHN0YXJ0dXAsIDAsIGNmKTsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBmY2xvc2UoZnApOworICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2F2ZV9lcnJubzsKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV9lcnJubyA9IGVycm5vOworICAgICAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiQ291bGQgbm90IG9wZW4gUFlUSE9OU1RBUlRVUFxuIik7CisgICAgICAgICAgICAgICAgICAgIGVycm5vID0gc2F2ZV9lcnJubzsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHVwKTsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogCiBzdGF0aWMgaW50IFJ1bk1vZHVsZShjaGFyICptb2R1bGUsIGludCBzZXRfYXJndjApCiB7Ci0JUHlPYmplY3QgKnJ1bnB5LCAqcnVubW9kdWxlLCAqcnVuYXJncywgKnJlc3VsdDsKLQlydW5weSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgicnVucHkiKTsKLQlpZiAocnVucHkgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBpbXBvcnQgcnVucHkgbW9kdWxlXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlydW5tb2R1bGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHJ1bnB5LCAiX3J1bl9tb2R1bGVfYXNfbWFpbiIpOwotCWlmIChydW5tb2R1bGUgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhY2Nlc3MgcnVucHkuX3J1bl9tb2R1bGVfYXNfbWFpblxuIik7Ci0JCVB5X0RFQ1JFRihydW5weSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcnVuYXJncyA9IFB5X0J1aWxkVmFsdWUoIihzaSkiLCBtb2R1bGUsIHNldF9hcmd2MCk7Ci0JaWYgKHJ1bmFyZ3MgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSJDb3VsZCBub3QgY3JlYXRlIGFyZ3VtZW50cyBmb3IgcnVucHkuX3J1bl9tb2R1bGVfYXNfbWFpblxuIik7Ci0JCVB5X0RFQ1JFRihydW5weSk7Ci0JCVB5X0RFQ1JFRihydW5tb2R1bGUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGwocnVubW9kdWxlLCBydW5hcmdzLCBOVUxMKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQl9Ci0JUHlfREVDUkVGKHJ1bnB5KTsKLQlQeV9ERUNSRUYocnVubW9kdWxlKTsKLQlQeV9ERUNSRUYocnVuYXJncyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKnJ1bnB5LCAqcnVubW9kdWxlLCAqcnVuYXJncywgKnJlc3VsdDsKKyAgICBydW5weSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgicnVucHkiKTsKKyAgICBpZiAocnVucHkgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBpbXBvcnQgcnVucHkgbW9kdWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBydW5tb2R1bGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHJ1bnB5LCAiX3J1bl9tb2R1bGVfYXNfbWFpbiIpOworICAgIGlmIChydW5tb2R1bGUgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhY2Nlc3MgcnVucHkuX3J1bl9tb2R1bGVfYXNfbWFpblxuIik7CisgICAgICAgIFB5X0RFQ1JFRihydW5weSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcnVuYXJncyA9IFB5X0J1aWxkVmFsdWUoIihzaSkiLCBtb2R1bGUsIHNldF9hcmd2MCk7CisgICAgaWYgKHJ1bmFyZ3MgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIGFyZ3VtZW50cyBmb3IgcnVucHkuX3J1bl9tb2R1bGVfYXNfbWFpblxuIik7CisgICAgICAgIFB5X0RFQ1JFRihydW5weSk7CisgICAgICAgIFB5X0RFQ1JFRihydW5tb2R1bGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwocnVubW9kdWxlLCBydW5hcmdzLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJ1bnB5KTsKKyAgICBQeV9ERUNSRUYocnVubW9kdWxlKTsKKyAgICBQeV9ERUNSRUYocnVuYXJncyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgUnVuTWFpbkZyb21JbXBvcnRlcihjaGFyICpmaWxlbmFtZSkKIHsKLQlQeU9iamVjdCAqYXJndjAgPSBOVUxMLCAqaW1wb3J0ZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICphcmd2MCA9IE5VTEwsICppbXBvcnRlciA9IE5VTEw7CiAKLQlpZiAoKGFyZ3YwID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSkpICYmIAotCSAgICAoaW1wb3J0ZXIgPSBQeUltcG9ydF9HZXRJbXBvcnRlcihhcmd2MCkpICYmCi0JICAgIChpbXBvcnRlci0+b2JfdHlwZSAhPSAmUHlOdWxsSW1wb3J0ZXJfVHlwZSkpCi0JewotCQkgLyogYXJndjAgaXMgdXNhYmxlIGFzIGFuIGltcG9ydCBzb3VyY2UsIHNvCi0JCQlwdXQgaXQgaW4gc3lzLnBhdGhbMF0gYW5kIGltcG9ydCBfX21haW5fXyAqLwotCQlQeU9iamVjdCAqc3lzX3BhdGggPSBOVUxMOwotCQlpZiAoKHN5c19wYXRoID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoIikpICYmCi0JCSAgICAhUHlMaXN0X1NldEl0ZW0oc3lzX3BhdGgsIDAsIGFyZ3YwKSkKLQkJewotCQkJUHlfSU5DUkVGKGFyZ3YwKTsKLQkJCVB5X0RFQ1JFRihpbXBvcnRlcik7Ci0JCQlzeXNfcGF0aCA9IE5VTEw7Ci0JCQlyZXR1cm4gUnVuTW9kdWxlKCJfX21haW5fXyIsIDApICE9IDA7Ci0JCX0KLQl9Ci0JUHlfWERFQ1JFRihhcmd2MCk7Ci0JUHlfWERFQ1JFRihpbXBvcnRlcik7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAtMTsKKyAgICBpZiAoKGFyZ3YwID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSkpICYmCisgICAgICAgIChpbXBvcnRlciA9IFB5SW1wb3J0X0dldEltcG9ydGVyKGFyZ3YwKSkgJiYKKyAgICAgICAgKGltcG9ydGVyLT5vYl90eXBlICE9ICZQeU51bGxJbXBvcnRlcl9UeXBlKSkKKyAgICB7CisgICAgICAgICAgICAgLyogYXJndjAgaXMgdXNhYmxlIGFzIGFuIGltcG9ydCBzb3VyY2UsIHNvCisgICAgICAgICAgICAgICAgICAgIHB1dCBpdCBpbiBzeXMucGF0aFswXSBhbmQgaW1wb3J0IF9fbWFpbl9fICovCisgICAgICAgIFB5T2JqZWN0ICpzeXNfcGF0aCA9IE5VTEw7CisgICAgICAgIGlmICgoc3lzX3BhdGggPSBQeVN5c19HZXRPYmplY3QoInBhdGgiKSkgJiYKKyAgICAgICAgICAgICFQeUxpc3RfU2V0SXRlbShzeXNfcGF0aCwgMCwgYXJndjApKQorICAgICAgICB7CisgICAgICAgICAgICBQeV9JTkNSRUYoYXJndjApOworICAgICAgICAgICAgUHlfREVDUkVGKGltcG9ydGVyKTsKKyAgICAgICAgICAgIHN5c19wYXRoID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBSdW5Nb2R1bGUoIl9fbWFpbl9fIiwgMCkgIT0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9YREVDUkVGKGFyZ3YwKTsKKyAgICBQeV9YREVDUkVGKGltcG9ydGVyKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAKQEAgLTIyNywzOTggKzIyNywzOTggQEAKIGludAogUHlfTWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JaW50IGM7Ci0JaW50IHN0czsKLQljaGFyICpjb21tYW5kID0gTlVMTDsKLQljaGFyICpmaWxlbmFtZSA9IE5VTEw7Ci0JY2hhciAqbW9kdWxlID0gTlVMTDsKLQlGSUxFICpmcCA9IHN0ZGluOwotCWNoYXIgKnA7Ci0JaW50IHVuYnVmZmVyZWQgPSAwOwotCWludCBza2lwZmlyc3RsaW5lID0gMDsKLQlpbnQgc3RkaW5faXNfaW50ZXJhY3RpdmUgPSAwOwotCWludCBoZWxwID0gMDsKLQlpbnQgdmVyc2lvbiA9IDA7Ci0JaW50IHNhd191bmJ1ZmZlcmVkX2ZsYWcgPSAwOwotCVB5Q29tcGlsZXJGbGFncyBjZjsKKyAgICBpbnQgYzsKKyAgICBpbnQgc3RzOworICAgIGNoYXIgKmNvbW1hbmQgPSBOVUxMOworICAgIGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKKyAgICBjaGFyICptb2R1bGUgPSBOVUxMOworICAgIEZJTEUgKmZwID0gc3RkaW47CisgICAgY2hhciAqcDsKKyAgICBpbnQgdW5idWZmZXJlZCA9IDA7CisgICAgaW50IHNraXBmaXJzdGxpbmUgPSAwOworICAgIGludCBzdGRpbl9pc19pbnRlcmFjdGl2ZSA9IDA7CisgICAgaW50IGhlbHAgPSAwOworICAgIGludCB2ZXJzaW9uID0gMDsKKyAgICBpbnQgc2F3X3VuYnVmZmVyZWRfZmxhZyA9IDA7CisgICAgUHlDb21waWxlckZsYWdzIGNmOwogCi0JY2YuY2ZfZmxhZ3MgPSAwOworICAgIGNmLmNmX2ZsYWdzID0gMDsKIAotCW9yaWdfYXJnYyA9IGFyZ2M7CS8qIEZvciBQeV9HZXRBcmdjQXJndigpICovCi0Jb3JpZ19hcmd2ID0gYXJndjsKKyAgICBvcmlnX2FyZ2MgPSBhcmdjOyAgICAgICAgICAgLyogRm9yIFB5X0dldEFyZ2NBcmd2KCkgKi8KKyAgICBvcmlnX2FyZ3YgPSBhcmd2OwogCiAjaWZkZWYgUklTQ09TCi0JUHlfUklTQ09TV2ltcEZsYWcgPSAwOworICAgIFB5X1JJU0NPU1dpbXBGbGFnID0gMDsKICNlbmRpZgogCi0JUHlTeXNfUmVzZXRXYXJuT3B0aW9ucygpOworICAgIFB5U3lzX1Jlc2V0V2Fybk9wdGlvbnMoKTsKIAotCXdoaWxlICgoYyA9IF9QeU9TX0dldE9wdChhcmdjLCBhcmd2LCBQUk9HUkFNX09QVFMpKSAhPSBFT0YpIHsKLQkJaWYgKGMgPT0gJ2MnKSB7Ci0JCQkvKiAtYyBpcyB0aGUgbGFzdCBvcHRpb247IGZvbGxvd2luZyBhcmd1bWVudHMKLQkJCSAgIHRoYXQgbG9vayBsaWtlIG9wdGlvbnMgYXJlIGxlZnQgZm9yIHRoZQotCQkJICAgY29tbWFuZCB0byBpbnRlcnByZXQuICovCi0JCQljb21tYW5kID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKF9QeU9TX29wdGFyZykgKyAyKTsKLQkJCWlmIChjb21tYW5kID09IE5VTEwpCi0JCQkJUHlfRmF0YWxFcnJvcigKLQkJCQkgICAibm90IGVub3VnaCBtZW1vcnkgdG8gY29weSAtYyBhcmd1bWVudCIpOwotCQkJc3RyY3B5KGNvbW1hbmQsIF9QeU9TX29wdGFyZyk7Ci0JCQlzdHJjYXQoY29tbWFuZCwgIlxuIik7Ci0JCQlicmVhazsKLQkJfQorICAgIHdoaWxlICgoYyA9IF9QeU9TX0dldE9wdChhcmdjLCBhcmd2LCBQUk9HUkFNX09QVFMpKSAhPSBFT0YpIHsKKyAgICAgICAgaWYgKGMgPT0gJ2MnKSB7CisgICAgICAgICAgICAvKiAtYyBpcyB0aGUgbGFzdCBvcHRpb247IGZvbGxvd2luZyBhcmd1bWVudHMKKyAgICAgICAgICAgICAgIHRoYXQgbG9vayBsaWtlIG9wdGlvbnMgYXJlIGxlZnQgZm9yIHRoZQorICAgICAgICAgICAgICAgY29tbWFuZCB0byBpbnRlcnByZXQuICovCisgICAgICAgICAgICBjb21tYW5kID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKF9QeU9TX29wdGFyZykgKyAyKTsKKyAgICAgICAgICAgIGlmIChjb21tYW5kID09IE5VTEwpCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCBtZW1vcnkgdG8gY29weSAtYyBhcmd1bWVudCIpOworICAgICAgICAgICAgc3RyY3B5KGNvbW1hbmQsIF9QeU9TX29wdGFyZyk7CisgICAgICAgICAgICBzdHJjYXQoY29tbWFuZCwgIlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCWlmIChjID09ICdtJykgewotCQkJLyogLW0gaXMgdGhlIGxhc3Qgb3B0aW9uOyBmb2xsb3dpbmcgYXJndW1lbnRzCi0JCQkgICB0aGF0IGxvb2sgbGlrZSBvcHRpb25zIGFyZSBsZWZ0IGZvciB0aGUKLQkJCSAgIG1vZHVsZSB0byBpbnRlcnByZXQuICovCi0JCQltb2R1bGUgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oX1B5T1Nfb3B0YXJnKSArIDIpOwotCQkJaWYgKG1vZHVsZSA9PSBOVUxMKQotCQkJCVB5X0ZhdGFsRXJyb3IoCi0JCQkJICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvcHkgLW0gYXJndW1lbnQiKTsKLQkJCXN0cmNweShtb2R1bGUsIF9QeU9TX29wdGFyZyk7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBpZiAoYyA9PSAnbScpIHsKKyAgICAgICAgICAgIC8qIC1tIGlzIHRoZSBsYXN0IG9wdGlvbjsgZm9sbG93aW5nIGFyZ3VtZW50cworICAgICAgICAgICAgICAgdGhhdCBsb29rIGxpa2Ugb3B0aW9ucyBhcmUgbGVmdCBmb3IgdGhlCisgICAgICAgICAgICAgICBtb2R1bGUgdG8gaW50ZXJwcmV0LiAqLworICAgICAgICAgICAgbW9kdWxlID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKF9QeU9TX29wdGFyZykgKyAyKTsKKyAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKAorICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIG1lbW9yeSB0byBjb3B5IC1tIGFyZ3VtZW50Iik7CisgICAgICAgICAgICBzdHJjcHkobW9kdWxlLCBfUHlPU19vcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlzd2l0Y2ggKGMpIHsKLQkJY2FzZSAnYic6Ci0JCQlQeV9CeXRlc1dhcm5pbmdGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICAgICAgUHlfQnl0ZXNXYXJuaW5nRmxhZysrOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAnZCc6Ci0JCQlQeV9EZWJ1Z0ZsYWcrKzsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIFB5X0RlYnVnRmxhZysrOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAnMyc6Ci0JCQlQeV9QeTNrV2FybmluZ0ZsYWcrKzsKLQkJCWlmICghUHlfRGl2aXNpb25XYXJuaW5nRmxhZykKLQkJCQlQeV9EaXZpc2lvbldhcm5pbmdGbGFnID0gMTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgIFB5X1B5M2tXYXJuaW5nRmxhZysrOworICAgICAgICAgICAgaWYgKCFQeV9EaXZpc2lvbldhcm5pbmdGbGFnKQorICAgICAgICAgICAgICAgIFB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgPSAxOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAnUSc6Ci0JCQlpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIm9sZCIpID09IDApIHsKLQkJCQlQeV9EaXZpc2lvbldhcm5pbmdGbGFnID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzdHJjbXAoX1B5T1Nfb3B0YXJnLCAid2FybiIpID09IDApIHsKLQkJCQlQeV9EaXZpc2lvbldhcm5pbmdGbGFnID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzdHJjbXAoX1B5T1Nfb3B0YXJnLCAid2FybmFsbCIpID09IDApIHsKLQkJCQlQeV9EaXZpc2lvbldhcm5pbmdGbGFnID0gMjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzdHJjbXAoX1B5T1Nfb3B0YXJnLCAibmV3IikgPT0gMCkgewotCQkJCS8qIFRoaXMgb25seSBhZmZlY3RzIF9fbWFpbl9fICovCi0JCQkJY2YuY2ZfZmxhZ3MgfD0gQ09fRlVUVVJFX0RJVklTSU9OOwotCQkJCS8qIEFuZCB0aGlzIHRlbGxzIHRoZSBldmFsIGxvb3AgdG8gdHJlYXQKLQkJCQkgICBCSU5BUllfRElWSURFIGFzIEJJTkFSWV9UUlVFX0RJVklERSAqLwotCQkJCV9QeV9RbmV3RmxhZyA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkiLVEgb3B0aW9uIHNob3VsZCBiZSBgLVFvbGQnLCAiCi0JCQkJImAtUXdhcm4nLCBgLVF3YXJuYWxsJywgb3IgYC1RbmV3JyBvbmx5XG4iKTsKLQkJCXJldHVybiB1c2FnZSgyLCBhcmd2WzBdKTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KKyAgICAgICAgY2FzZSAnUSc6CisgICAgICAgICAgICBpZiAoc3RyY21wKF9QeU9TX29wdGFyZywgIm9sZCIpID09IDApIHsKKyAgICAgICAgICAgICAgICBQeV9EaXZpc2lvbldhcm5pbmdGbGFnID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJjbXAoX1B5T1Nfb3B0YXJnLCAid2FybiIpID09IDApIHsKKyAgICAgICAgICAgICAgICBQeV9EaXZpc2lvbldhcm5pbmdGbGFnID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJjbXAoX1B5T1Nfb3B0YXJnLCAid2FybmFsbCIpID09IDApIHsKKyAgICAgICAgICAgICAgICBQeV9EaXZpc2lvbldhcm5pbmdGbGFnID0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJjbXAoX1B5T1Nfb3B0YXJnLCAibmV3IikgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIFRoaXMgb25seSBhZmZlY3RzIF9fbWFpbl9fICovCisgICAgICAgICAgICAgICAgY2YuY2ZfZmxhZ3MgfD0gQ09fRlVUVVJFX0RJVklTSU9OOworICAgICAgICAgICAgICAgIC8qIEFuZCB0aGlzIHRlbGxzIHRoZSBldmFsIGxvb3AgdG8gdHJlYXQKKyAgICAgICAgICAgICAgICAgICBCSU5BUllfRElWSURFIGFzIEJJTkFSWV9UUlVFX0RJVklERSAqLworICAgICAgICAgICAgICAgIF9QeV9RbmV3RmxhZyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiLVEgb3B0aW9uIHNob3VsZCBiZSBgLVFvbGQnLCAiCisgICAgICAgICAgICAgICAgImAtUXdhcm4nLCBgLVF3YXJuYWxsJywgb3IgYC1RbmV3JyBvbmx5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiB1c2FnZSgyLCBhcmd2WzBdKTsKKyAgICAgICAgICAgIC8qIE5PVFJFQUNIRUQgKi8KIAotCQljYXNlICdpJzoKLQkJCVB5X0luc3BlY3RGbGFnKys7Ci0JCQlQeV9JbnRlcmFjdGl2ZUZsYWcrKzsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgIFB5X0luc3BlY3RGbGFnKys7CisgICAgICAgICAgICBQeV9JbnRlcmFjdGl2ZUZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCS8qIGNhc2UgJ0onOiByZXNlcnZlZCBmb3IgSnl0aG9uICovCisgICAgICAgIC8qIGNhc2UgJ0onOiByZXNlcnZlZCBmb3IgSnl0aG9uICovCiAKLQkJY2FzZSAnTyc6Ci0JCQlQeV9PcHRpbWl6ZUZsYWcrKzsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdPJzoKKyAgICAgICAgICAgIFB5X09wdGltaXplRmxhZysrOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAnQic6Ci0JCQlQeV9Eb250V3JpdGVCeXRlY29kZUZsYWcrKzsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgIFB5X0RvbnRXcml0ZUJ5dGVjb2RlRmxhZysrOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSAncyc6Ci0JCQlQeV9Ob1VzZXJTaXRlRGlyZWN0b3J5Kys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICBQeV9Ob1VzZXJTaXRlRGlyZWN0b3J5Kys7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICdTJzoKLQkJCVB5X05vU2l0ZUZsYWcrKzsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIFB5X05vU2l0ZUZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ0UnOgotCQkJUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICBQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ3QnOgotCQkJUHlfVGFiY2hlY2tGbGFnKys7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICBQeV9UYWJjaGVja0ZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ3UnOgotCQkJdW5idWZmZXJlZCsrOwotCQkJc2F3X3VuYnVmZmVyZWRfZmxhZyA9IDE7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICB1bmJ1ZmZlcmVkKys7CisgICAgICAgICAgICBzYXdfdW5idWZmZXJlZF9mbGFnID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJ3YnOgotCQkJUHlfVmVyYm9zZUZsYWcrKzsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICAgIFB5X1ZlcmJvc2VGbGFnKys7CisgICAgICAgICAgICBicmVhazsKIAogI2lmZGVmIFJJU0NPUwotCQljYXNlICd3JzoKLQkJCVB5X1JJU0NPU1dpbXBGbGFnID0gMTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICd3JzoKKyAgICAgICAgICAgIFB5X1JJU0NPU1dpbXBGbGFnID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogI2VuZGlmCiAKLQkJY2FzZSAneCc6Ci0JCQlza2lwZmlyc3RsaW5lID0gMTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIHNraXBmaXJzdGxpbmUgPSAxOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJLyogY2FzZSAnWCc6IHJlc2VydmVkIGZvciBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBhcmd1bWVudHMgKi8KKyAgICAgICAgLyogY2FzZSAnWCc6IHJlc2VydmVkIGZvciBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBhcmd1bWVudHMgKi8KIAotCQljYXNlICdVJzoKLQkJCVB5X1VuaWNvZGVGbGFnKys7Ci0JCQlicmVhazsKLQkJY2FzZSAnaCc6Ci0JCWNhc2UgJz8nOgotCQkJaGVscCsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ1YnOgotCQkJdmVyc2lvbisrOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJ1UnOgorICAgICAgICAgICAgUHlfVW5pY29kZUZsYWcrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgY2FzZSAnPyc6CisgICAgICAgICAgICBoZWxwKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnVic6CisgICAgICAgICAgICB2ZXJzaW9uKys7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICdXJzoKLQkJCVB5U3lzX0FkZFdhcm5PcHRpb24oX1B5T1Nfb3B0YXJnKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdXJzoKKyAgICAgICAgICAgIFB5U3lzX0FkZFdhcm5PcHRpb24oX1B5T1Nfb3B0YXJnKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCS8qIFRoaXMgc3BhY2UgcmVzZXJ2ZWQgZm9yIG90aGVyIG9wdGlvbnMgKi8KKyAgICAgICAgLyogVGhpcyBzcGFjZSByZXNlcnZlZCBmb3Igb3RoZXIgb3B0aW9ucyAqLwogCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gdXNhZ2UoMiwgYXJndlswXSk7Ci0JCQkvKk5PVFJFQUNIRUQqLworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHVzYWdlKDIsIGFyZ3ZbMF0pOworICAgICAgICAgICAgLypOT1RSRUFDSEVEKi8KIAotCQl9Ci0JfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKGhlbHApCi0JCXJldHVybiB1c2FnZSgwLCBhcmd2WzBdKTsKKyAgICBpZiAoaGVscCkKKyAgICAgICAgcmV0dXJuIHVzYWdlKDAsIGFyZ3ZbMF0pOwogCi0JaWYgKHZlcnNpb24pIHsKLQkJZnByaW50ZihzdGRlcnIsICJQeXRob24gJXNcbiIsIFBZX1ZFUlNJT04pOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKHZlcnNpb24pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJQeXRob24gJXNcbiIsIFBZX1ZFUlNJT04pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAoIVB5X0luc3BlY3RGbGFnICYmCi0JICAgIChwID0gUHlfR0VURU5WKCJQWVRIT05JTlNQRUNUIikpICYmICpwICE9ICdcMCcpCi0JCVB5X0luc3BlY3RGbGFnID0gMTsKLQlpZiAoIXNhd191bmJ1ZmZlcmVkX2ZsYWcgJiYKLQkgICAgKHAgPSBQeV9HRVRFTlYoIlBZVEhPTlVOQlVGRkVSRUQiKSkgJiYgKnAgIT0gJ1wwJykKLQkJdW5idWZmZXJlZCA9IDE7CisgICAgaWYgKCFQeV9JbnNwZWN0RmxhZyAmJgorICAgICAgICAocCA9IFB5X0dFVEVOVigiUFlUSE9OSU5TUEVDVCIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICBQeV9JbnNwZWN0RmxhZyA9IDE7CisgICAgaWYgKCFzYXdfdW5idWZmZXJlZF9mbGFnICYmCisgICAgICAgIChwID0gUHlfR0VURU5WKCJQWVRIT05VTkJVRkZFUkVEIikpICYmICpwICE9ICdcMCcpCisgICAgICAgIHVuYnVmZmVyZWQgPSAxOwogCi0JaWYgKCFQeV9Ob1VzZXJTaXRlRGlyZWN0b3J5ICYmCi0JICAgIChwID0gUHlfR0VURU5WKCJQWVRIT05OT1VTRVJTSVRFIikpICYmICpwICE9ICdcMCcpCi0JCVB5X05vVXNlclNpdGVEaXJlY3RvcnkgPSAxOworICAgIGlmICghUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSAmJgorICAgICAgICAocCA9IFB5X0dFVEVOVigiUFlUSE9OTk9VU0VSU0lURSIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICBQeV9Ob1VzZXJTaXRlRGlyZWN0b3J5ID0gMTsKIAotCWlmIChjb21tYW5kID09IE5VTEwgJiYgbW9kdWxlID09IE5VTEwgJiYgX1B5T1Nfb3B0aW5kIDwgYXJnYyAmJgotCSAgICBzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLSIpICE9IDApCi0JeworICAgIGlmIChjb21tYW5kID09IE5VTEwgJiYgbW9kdWxlID09IE5VTEwgJiYgX1B5T1Nfb3B0aW5kIDwgYXJnYyAmJgorICAgICAgICBzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLSIpICE9IDApCisgICAgewogI2lmZGVmIF9fVk1TCi0JCWZpbGVuYW1lID0gZGVjYyR0cmFuc2xhdGVfdm1zKGFyZ3ZbX1B5T1Nfb3B0aW5kXSk7Ci0JCWlmIChmaWxlbmFtZSA9PSAoY2hhciAqKTAgfHwgZmlsZW5hbWUgPT0gKGNoYXIgKiktMSkKLQkJCWZpbGVuYW1lID0gYXJndltfUHlPU19vcHRpbmRdOworICAgICAgICBmaWxlbmFtZSA9IGRlY2MkdHJhbnNsYXRlX3Ztcyhhcmd2W19QeU9TX29wdGluZF0pOworICAgICAgICBpZiAoZmlsZW5hbWUgPT0gKGNoYXIgKikwIHx8IGZpbGVuYW1lID09IChjaGFyICopLTEpCisgICAgICAgICAgICBmaWxlbmFtZSA9IGFyZ3ZbX1B5T1Nfb3B0aW5kXTsKIAogI2Vsc2UKLQkJZmlsZW5hbWUgPSBhcmd2W19QeU9TX29wdGluZF07CisgICAgICAgIGZpbGVuYW1lID0gYXJndltfUHlPU19vcHRpbmRdOwogI2VuZGlmCi0JfQorICAgIH0KIAotCXN0ZGluX2lzX2ludGVyYWN0aXZlID0gUHlfRmRJc0ludGVyYWN0aXZlKHN0ZGluLCAoY2hhciAqKTApOworICAgIHN0ZGluX2lzX2ludGVyYWN0aXZlID0gUHlfRmRJc0ludGVyYWN0aXZlKHN0ZGluLCAoY2hhciAqKTApOwogCi0JaWYgKHVuYnVmZmVyZWQpIHsKKyAgICBpZiAodW5idWZmZXJlZCkgewogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotCQlfc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBPX0JJTkFSWSk7Ci0JCV9zZXRtb2RlKGZpbGVubyhzdGRvdXQpLCBPX0JJTkFSWSk7CisgICAgICAgIF9zZXRtb2RlKGZpbGVubyhzdGRpbiksIE9fQklOQVJZKTsKKyAgICAgICAgX3NldG1vZGUoZmlsZW5vKHN0ZG91dCksIE9fQklOQVJZKTsKICNlbmRpZgogI2lmZGVmIEhBVkVfU0VUVkJVRgotCQlzZXR2YnVmKHN0ZGluLCAgKGNoYXIgKilOVUxMLCBfSU9OQkYsIEJVRlNJWik7Ci0JCXNldHZidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwsIF9JT05CRiwgQlVGU0laKTsKLQkJc2V0dmJ1ZihzdGRlcnIsIChjaGFyICopTlVMTCwgX0lPTkJGLCBCVUZTSVopOworICAgICAgICBzZXR2YnVmKHN0ZGluLCAgKGNoYXIgKilOVUxMLCBfSU9OQkYsIEJVRlNJWik7CisgICAgICAgIHNldHZidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwsIF9JT05CRiwgQlVGU0laKTsKKyAgICAgICAgc2V0dmJ1ZihzdGRlcnIsIChjaGFyICopTlVMTCwgX0lPTkJGLCBCVUZTSVopOwogI2Vsc2UgLyogIUhBVkVfU0VUVkJVRiAqLwotCQlzZXRidWYoc3RkaW4sICAoY2hhciAqKU5VTEwpOwotCQlzZXRidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwpOwotCQlzZXRidWYoc3RkZXJyLCAoY2hhciAqKU5VTEwpOworICAgICAgICBzZXRidWYoc3RkaW4sICAoY2hhciAqKU5VTEwpOworICAgICAgICBzZXRidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwpOworICAgICAgICBzZXRidWYoc3RkZXJyLCAoY2hhciAqKU5VTEwpOwogI2VuZGlmIC8qICFIQVZFX1NFVFZCVUYgKi8KLQl9Ci0JZWxzZSBpZiAoUHlfSW50ZXJhY3RpdmVGbGFnKSB7CisgICAgfQorICAgIGVsc2UgaWYgKFB5X0ludGVyYWN0aXZlRmxhZykgewogI2lmZGVmIE1TX1dJTkRPV1MKLQkJLyogRG9lc24ndCBoYXZlIHRvIGhhdmUgbGluZS1idWZmZXJlZCAtLSB1c2UgdW5idWZmZXJlZCAqLwotCQkvKiBBbnkgc2V0W3ZdYnVmKHN0ZGluLCAuLi4pIHNjcmV3cyB1cCBUa2ludGVyIDotKCAqLwotCQlzZXR2YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMLCBfSU9OQkYsIEJVRlNJWik7CisgICAgICAgIC8qIERvZXNuJ3QgaGF2ZSB0byBoYXZlIGxpbmUtYnVmZmVyZWQgLS0gdXNlIHVuYnVmZmVyZWQgKi8KKyAgICAgICAgLyogQW55IHNldFt2XWJ1ZihzdGRpbiwgLi4uKSBzY3Jld3MgdXAgVGtpbnRlciA6LSggKi8KKyAgICAgICAgc2V0dmJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCwgX0lPTkJGLCBCVUZTSVopOwogI2Vsc2UgLyogIU1TX1dJTkRPV1MgKi8KICNpZmRlZiBIQVZFX1NFVFZCVUYKLQkJc2V0dmJ1ZihzdGRpbiwgIChjaGFyICopTlVMTCwgX0lPTEJGLCBCVUZTSVopOwotCQlzZXR2YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMLCBfSU9MQkYsIEJVRlNJWik7CisgICAgICAgIHNldHZidWYoc3RkaW4sICAoY2hhciAqKU5VTEwsIF9JT0xCRiwgQlVGU0laKTsKKyAgICAgICAgc2V0dmJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCwgX0lPTEJGLCBCVUZTSVopOwogI2VuZGlmIC8qIEhBVkVfU0VUVkJVRiAqLwogI2VuZGlmIC8qICFNU19XSU5ET1dTICovCi0JCS8qIExlYXZlIHN0ZGVyciBhbG9uZSAtIGl0IHNob3VsZCBiZSB1bmJ1ZmZlcmVkIGFueXdheS4gKi8KLSAgCX0KKyAgICAgICAgLyogTGVhdmUgc3RkZXJyIGFsb25lIC0gaXQgc2hvdWxkIGJlIHVuYnVmZmVyZWQgYW55d2F5LiAqLworICAgIH0KICNpZmRlZiBfX1ZNUwotCWVsc2UgewotCQlzZXR2YnVmIChzdGRvdXQsIChjaGFyICopTlVMTCwgX0lPTEJGLCBCVUZTSVopOwotCX0KKyAgICBlbHNlIHsKKyAgICAgICAgc2V0dmJ1ZiAoc3Rkb3V0LCAoY2hhciAqKU5VTEwsIF9JT0xCRiwgQlVGU0laKTsKKyAgICB9CiAjZW5kaWYgLyogX19WTVMgKi8KIAogI2lmZGVmIF9fQVBQTEVfXwotCS8qIE9uIE1hY09TIFgsIHdoZW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBlbWJlZGRlZCBpbiBhbgotCSAgIGFwcGxpY2F0aW9uIGJ1bmRsZSwgaXQgZ2V0cyBleGVjdXRlZCBieSBhIGJvb3RzdHJhcHBpbmcgc2NyaXB0Ci0JICAgdGhhdCBkb2VzIG9zLmV4ZWN2ZSgpIHdpdGggYW4gYXJndlswXSB0aGF0J3MgZGlmZmVyZW50IGZyb20gdGhlCi0JICAgYWN0dWFsIFB5dGhvbiBleGVjdXRhYmxlLiBUaGlzIGlzIG5lZWRlZCB0byBrZWVwIHRoZSBGaW5kZXIgaGFwcHksCi0JICAgb3IgcmF0aGVyLCB0byB3b3JrIGFyb3VuZCBBcHBsZSdzIG92ZXJseSBzdHJpY3QgcmVxdWlyZW1lbnRzIG9mCi0JICAgdGhlIHByb2Nlc3MgbmFtZS4gSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCBhIHVzYWJsZSBzeXMuZXhlY3V0YWJsZSwKLQkgICBzbyB0aGUgYWN0dWFsIGV4ZWN1dGFibGUgcGF0aCBpcyBwYXNzZWQgaW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCi0JICAgU2VlIExpYi9wbGF0LW1hYy9idW5kbGVidWlsZXIucHkgZm9yIGRldGFpbHMgYWJvdXQgdGhlIGJvb3RzdHJhcAotCSAgIHNjcmlwdC4gKi8KLQlpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTkVYRUNVVEFCTEUiKSkgJiYgKnAgIT0gJ1wwJykKLQkJUHlfU2V0UHJvZ3JhbU5hbWUocCk7Ci0JZWxzZQotCQlQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsKKyAgICAvKiBPbiBNYWNPUyBYLCB3aGVuIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgZW1iZWRkZWQgaW4gYW4KKyAgICAgICBhcHBsaWNhdGlvbiBidW5kbGUsIGl0IGdldHMgZXhlY3V0ZWQgYnkgYSBib290c3RyYXBwaW5nIHNjcmlwdAorICAgICAgIHRoYXQgZG9lcyBvcy5leGVjdmUoKSB3aXRoIGFuIGFyZ3ZbMF0gdGhhdCdzIGRpZmZlcmVudCBmcm9tIHRoZQorICAgICAgIGFjdHVhbCBQeXRob24gZXhlY3V0YWJsZS4gVGhpcyBpcyBuZWVkZWQgdG8ga2VlcCB0aGUgRmluZGVyIGhhcHB5LAorICAgICAgIG9yIHJhdGhlciwgdG8gd29yayBhcm91bmQgQXBwbGUncyBvdmVybHkgc3RyaWN0IHJlcXVpcmVtZW50cyBvZgorICAgICAgIHRoZSBwcm9jZXNzIG5hbWUuIEhvd2V2ZXIsIHdlIHN0aWxsIG5lZWQgYSB1c2FibGUgc3lzLmV4ZWN1dGFibGUsCisgICAgICAgc28gdGhlIGFjdHVhbCBleGVjdXRhYmxlIHBhdGggaXMgcGFzc2VkIGluIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLgorICAgICAgIFNlZSBMaWIvcGxhdC1tYWMvYnVuZGxlYnVpbGVyLnB5IGZvciBkZXRhaWxzIGFib3V0IHRoZSBib290c3RyYXAKKyAgICAgICBzY3JpcHQuICovCisgICAgaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05FWEVDVVRBQkxFIikpICYmICpwICE9ICdcMCcpCisgICAgICAgIFB5X1NldFByb2dyYW1OYW1lKHApOworICAgIGVsc2UKKyAgICAgICAgUHlfU2V0UHJvZ3JhbU5hbWUoYXJndlswXSk7CiAjZWxzZQotCVB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOworICAgIFB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOwogI2VuZGlmCi0JUHlfSW5pdGlhbGl6ZSgpOworICAgIFB5X0luaXRpYWxpemUoKTsKIAotCWlmIChQeV9WZXJib3NlRmxhZyB8fAotCSAgICAoY29tbWFuZCA9PSBOVUxMICYmIGZpbGVuYW1lID09IE5VTEwgJiYgbW9kdWxlID09IE5VTEwgJiYgc3RkaW5faXNfaW50ZXJhY3RpdmUpKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiUHl0aG9uICVzIG9uICVzXG4iLAotCQkJUHlfR2V0VmVyc2lvbigpLCBQeV9HZXRQbGF0Zm9ybSgpKTsKLSAJCWlmICghUHlfTm9TaXRlRmxhZykKLSAJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBDT1BZUklHSFQpOwotCX0KKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcgfHwKKyAgICAgICAgKGNvbW1hbmQgPT0gTlVMTCAmJiBmaWxlbmFtZSA9PSBOVUxMICYmIG1vZHVsZSA9PSBOVUxMICYmIHN0ZGluX2lzX2ludGVyYWN0aXZlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlB5dGhvbiAlcyBvbiAlc1xuIiwKKyAgICAgICAgICAgIFB5X0dldFZlcnNpb24oKSwgUHlfR2V0UGxhdGZvcm0oKSk7CisgICAgICAgIGlmICghUHlfTm9TaXRlRmxhZykKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIENPUFlSSUdIVCk7CisgICAgfQogCi0JaWYgKGNvbW1hbmQgIT0gTlVMTCkgewotCQkvKiBCYWNrdXAgX1B5T1Nfb3B0aW5kIGFuZCBmb3JjZSBzeXMuYXJndlswXSA9ICctYycgKi8KLQkJX1B5T1Nfb3B0aW5kLS07Ci0JCWFyZ3ZbX1B5T1Nfb3B0aW5kXSA9ICItYyI7Ci0JfQorICAgIGlmIChjb21tYW5kICE9IE5VTEwpIHsKKyAgICAgICAgLyogQmFja3VwIF9QeU9TX29wdGluZCBhbmQgZm9yY2Ugc3lzLmFyZ3ZbMF0gPSAnLWMnICovCisgICAgICAgIF9QeU9TX29wdGluZC0tOworICAgICAgICBhcmd2W19QeU9TX29wdGluZF0gPSAiLWMiOworICAgIH0KIAotCWlmIChtb2R1bGUgIT0gTlVMTCkgewotCQkvKiBCYWNrdXAgX1B5T1Nfb3B0aW5kIGFuZCBmb3JjZSBzeXMuYXJndlswXSA9ICctYycKLQkJICAgc28gdGhhdCBQeVN5c19TZXRBcmd2IGNvcnJlY3RseSBzZXRzIHN5cy5wYXRoWzBdIHRvICcnKi8KLQkJX1B5T1Nfb3B0aW5kLS07Ci0JCWFyZ3ZbX1B5T1Nfb3B0aW5kXSA9ICItYyI7Ci0JfQorICAgIGlmIChtb2R1bGUgIT0gTlVMTCkgeworICAgICAgICAvKiBCYWNrdXAgX1B5T1Nfb3B0aW5kIGFuZCBmb3JjZSBzeXMuYXJndlswXSA9ICctYycKKyAgICAgICAgICAgc28gdGhhdCBQeVN5c19TZXRBcmd2IGNvcnJlY3RseSBzZXRzIHN5cy5wYXRoWzBdIHRvICcnKi8KKyAgICAgICAgX1B5T1Nfb3B0aW5kLS07CisgICAgICAgIGFyZ3ZbX1B5T1Nfb3B0aW5kXSA9ICItYyI7CisgICAgfQogCi0JUHlTeXNfU2V0QXJndihhcmdjLV9QeU9TX29wdGluZCwgYXJnditfUHlPU19vcHRpbmQpOworICAgIFB5U3lzX1NldEFyZ3YoYXJnYy1fUHlPU19vcHRpbmQsIGFyZ3YrX1B5T1Nfb3B0aW5kKTsKIAotCWlmICgoUHlfSW5zcGVjdEZsYWcgfHwgKGNvbW1hbmQgPT0gTlVMTCAmJiBmaWxlbmFtZSA9PSBOVUxMICYmIG1vZHVsZSA9PSBOVUxMKSkgJiYKLQkgICAgaXNhdHR5KGZpbGVubyhzdGRpbikpKSB7Ci0JCVB5T2JqZWN0ICp2OwotCQl2ID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJyZWFkbGluZSIpOwotCQlpZiAodiA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZQotCQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBpZiAoKFB5X0luc3BlY3RGbGFnIHx8IChjb21tYW5kID09IE5VTEwgJiYgZmlsZW5hbWUgPT0gTlVMTCAmJiBtb2R1bGUgPT0gTlVMTCkpICYmCisgICAgICAgIGlzYXR0eShmaWxlbm8oc3RkaW4pKSkgeworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgdiA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgicmVhZGxpbmUiKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiAKLQlpZiAoY29tbWFuZCkgewotCQlzdHMgPSBQeVJ1bl9TaW1wbGVTdHJpbmdGbGFncyhjb21tYW5kLCAmY2YpICE9IDA7Ci0JCWZyZWUoY29tbWFuZCk7Ci0JfSBlbHNlIGlmIChtb2R1bGUpIHsKLQkJc3RzID0gUnVuTW9kdWxlKG1vZHVsZSwgMSk7Ci0JCWZyZWUobW9kdWxlKTsKLQl9Ci0JZWxzZSB7CisgICAgaWYgKGNvbW1hbmQpIHsKKyAgICAgICAgc3RzID0gUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MoY29tbWFuZCwgJmNmKSAhPSAwOworICAgICAgICBmcmVlKGNvbW1hbmQpOworICAgIH0gZWxzZSBpZiAobW9kdWxlKSB7CisgICAgICAgIHN0cyA9IFJ1bk1vZHVsZShtb2R1bGUsIDEpOworICAgICAgICBmcmVlKG1vZHVsZSk7CisgICAgfQorICAgIGVsc2UgewogCi0JCWlmIChmaWxlbmFtZSA9PSBOVUxMICYmIHN0ZGluX2lzX2ludGVyYWN0aXZlKSB7Ci0JCQlQeV9JbnNwZWN0RmxhZyA9IDA7IC8qIGRvIGV4aXQgb24gU3lzdGVtRXhpdCAqLwotCQkJUnVuU3RhcnR1cEZpbGUoJmNmKTsKLQkJfQotCQkvKiBYWFggKi8KKyAgICAgICAgaWYgKGZpbGVuYW1lID09IE5VTEwgJiYgc3RkaW5faXNfaW50ZXJhY3RpdmUpIHsKKyAgICAgICAgICAgIFB5X0luc3BlY3RGbGFnID0gMDsgLyogZG8gZXhpdCBvbiBTeXN0ZW1FeGl0ICovCisgICAgICAgICAgICBSdW5TdGFydHVwRmlsZSgmY2YpOworICAgICAgICB9CisgICAgICAgIC8qIFhYWCAqLwogCi0JCXN0cyA9IC0xOwkvKiBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UndmUgYWxyZWFkeSBydW4gX19tYWluX18gKi8KKyAgICAgICAgc3RzID0gLTE7ICAgICAgICAgICAgICAgLyoga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3ZlIGFscmVhZHkgcnVuIF9fbWFpbl9fICovCiAKLQkJaWYgKGZpbGVuYW1lICE9IE5VTEwpIHsKLQkJCXN0cyA9IFJ1bk1haW5Gcm9tSW1wb3J0ZXIoZmlsZW5hbWUpOwotCQl9CisgICAgICAgIGlmIChmaWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdHMgPSBSdW5NYWluRnJvbUltcG9ydGVyKGZpbGVuYW1lKTsKKyAgICAgICAgfQogCi0JCWlmIChzdHM9PS0xICYmIGZpbGVuYW1lIT1OVUxMKSB7Ci0JCQlpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIikpID09IE5VTEwpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW4ndCBvcGVuIGZpbGUgJyVzJzogW0Vycm5vICVkXSAlc1xuIiwKLQkJCQkJYXJndlswXSwgZmlsZW5hbWUsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBpZiAoc3RzPT0tMSAmJiBmaWxlbmFtZSE9TlVMTCkgeworICAgICAgICAgICAgaWYgKChmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgb3BlbiBmaWxlICclcyc6IFtFcnJubyAlZF0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIGZpbGVuYW1lLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKIAotCQkJCXJldHVybiAyOwotCQkJfQotCQkJZWxzZSBpZiAoc2tpcGZpcnN0bGluZSkgewotCQkJCWludCBjaDsKLQkJCQkvKiBQdXNoIGJhY2sgZmlyc3QgbmV3bGluZSBzbyBsaW5lIG51bWJlcnMKLQkJCQkgICByZW1haW4gdGhlIHNhbWUgKi8KLQkJCQl3aGlsZSAoKGNoID0gZ2V0YyhmcCkpICE9IEVPRikgewotCQkJCQlpZiAoY2ggPT0gJ1xuJykgewotCQkJCQkJKHZvaWQpdW5nZXRjKGNoLCBmcCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXsKLQkJCQkvKiBYWFg6IGRvZXMgdGhpcyB3b3JrIG9uIFdpbi9XaW42ND8gKHNlZSBwb3NpeF9mc3RhdCkgKi8KLQkJCQlzdHJ1Y3Qgc3RhdCBzYjsKLQkJCQlpZiAoZnN0YXQoZmlsZW5vKGZwKSwgJnNiKSA9PSAwICYmCi0JCQkJICAgIFNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKLQkJCQkJZnByaW50ZihzdGRlcnIsICIlczogJyVzJyBpcyBhIGRpcmVjdG9yeSwgY2Fubm90IGNvbnRpbnVlXG4iLCBhcmd2WzBdLCBmaWxlbmFtZSk7Ci0JCQkJCWZjbG9zZShmcCk7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc2tpcGZpcnN0bGluZSkgeworICAgICAgICAgICAgICAgIGludCBjaDsKKyAgICAgICAgICAgICAgICAvKiBQdXNoIGJhY2sgZmlyc3QgbmV3bGluZSBzbyBsaW5lIG51bWJlcnMKKyAgICAgICAgICAgICAgICAgICByZW1haW4gdGhlIHNhbWUgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoKGNoID0gZ2V0YyhmcCkpICE9IEVPRikgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpdW5nZXRjKGNoLCBmcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBYWFg6IGRvZXMgdGhpcyB3b3JrIG9uIFdpbi9XaW42ND8gKHNlZSBwb3NpeF9mc3RhdCkgKi8KKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBzYjsKKyAgICAgICAgICAgICAgICBpZiAoZnN0YXQoZmlsZW5vKGZwKSwgJnNiKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIFNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogJyVzJyBpcyBhIGRpcmVjdG9yeSwgY2Fubm90IGNvbnRpbnVlXG4iLCBhcmd2WzBdLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWlmIChzdHM9PS0xKSB7Ci0JCQkvKiBjYWxsIHBlbmRpbmcgY2FsbHMgbGlrZSBzaWduYWwgaGFuZGxlcnMgKFNJR0lOVCkgKi8KLQkJCWlmIChQeV9NYWtlUGVuZGluZ0NhbGxzKCkgPT0gLTEpIHsKLQkJCQlQeUVycl9QcmludCgpOwotCQkJCXN0cyA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCXN0cyA9IFB5UnVuX0FueUZpbGVFeEZsYWdzKAotCQkJCQlmcCwKLQkJCQkJZmlsZW5hbWUgPT0gTlVMTCA/ICI8c3RkaW4+IiA6IGZpbGVuYW1lLAotCQkJCQlmaWxlbmFtZSAhPSBOVUxMLCAmY2YpICE9IDA7Ci0JCQl9Ci0JCX0KLQkJCi0JfQorICAgICAgICBpZiAoc3RzPT0tMSkgeworICAgICAgICAgICAgLyogY2FsbCBwZW5kaW5nIGNhbGxzIGxpa2Ugc2lnbmFsIGhhbmRsZXJzIChTSUdJTlQpICovCisgICAgICAgICAgICBpZiAoUHlfTWFrZVBlbmRpbmdDYWxscygpID09IC0xKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICBzdHMgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHMgPSBQeVJ1bl9BbnlGaWxlRXhGbGFncygKKyAgICAgICAgICAgICAgICAgICAgZnAsCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID09IE5VTEwgPyAiPHN0ZGluPiIgOiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgIT0gTlVMTCwgJmNmKSAhPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkvKiBDaGVjayB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGF0IHRoZSBlbmQsIHRvIGdpdmUgcHJvZ3JhbXMgdGhlCi0JICogb3Bwb3J0dW5pdHkgdG8gc2V0IGl0IGZyb20gUHl0aG9uLgotCSAqLwotCWlmICghUHlfSW5zcGVjdEZsYWcgJiYKLQkgICAgKHAgPSBQeV9HRVRFTlYoIlBZVEhPTklOU1BFQ1QiKSkgJiYgKnAgIT0gJ1wwJykKLQl7Ci0JCVB5X0luc3BlY3RGbGFnID0gMTsKLQl9CisgICAgfQogCi0JaWYgKFB5X0luc3BlY3RGbGFnICYmIHN0ZGluX2lzX2ludGVyYWN0aXZlICYmCi0JICAgIChmaWxlbmFtZSAhPSBOVUxMIHx8IGNvbW1hbmQgIT0gTlVMTCB8fCBtb2R1bGUgIT0gTlVMTCkpIHsKLQkJUHlfSW5zcGVjdEZsYWcgPSAwOwotCQkvKiBYWFggKi8KLQkJc3RzID0gUHlSdW5fQW55RmlsZUZsYWdzKHN0ZGluLCAiPHN0ZGluPiIsICZjZikgIT0gMDsKLQl9CisgICAgLyogQ2hlY2sgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBhdCB0aGUgZW5kLCB0byBnaXZlIHByb2dyYW1zIHRoZQorICAgICAqIG9wcG9ydHVuaXR5IHRvIHNldCBpdCBmcm9tIFB5dGhvbi4KKyAgICAgKi8KKyAgICBpZiAoIVB5X0luc3BlY3RGbGFnICYmCisgICAgICAgIChwID0gUHlfR0VURU5WKCJQWVRIT05JTlNQRUNUIikpICYmICpwICE9ICdcMCcpCisgICAgeworICAgICAgICBQeV9JbnNwZWN0RmxhZyA9IDE7CisgICAgfQogCi0JUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfSW5zcGVjdEZsYWcgJiYgc3RkaW5faXNfaW50ZXJhY3RpdmUgJiYKKyAgICAgICAgKGZpbGVuYW1lICE9IE5VTEwgfHwgY29tbWFuZCAhPSBOVUxMIHx8IG1vZHVsZSAhPSBOVUxMKSkgeworICAgICAgICBQeV9JbnNwZWN0RmxhZyA9IDA7CisgICAgICAgIC8qIFhYWCAqLworICAgICAgICBzdHMgPSBQeVJ1bl9BbnlGaWxlRmxhZ3Moc3RkaW4sICI8c3RkaW4+IiwgJmNmKSAhPSAwOworICAgIH0KKworICAgIFB5X0ZpbmFsaXplKCk7CiAjaWZkZWYgUklTQ09TCi0JaWYgKFB5X1JJU0NPU1dpbXBGbGFnKQotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHgwY3FceDBjIik7IC8qIG1ha2UgZnJvbnRlbmQgcXVpdCAqLworICAgIGlmIChQeV9SSVNDT1NXaW1wRmxhZykKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJceDBjcVx4MGMiKTsgLyogbWFrZSBmcm9udGVuZCBxdWl0ICovCiAjZW5kaWYKIAogI2lmZGVmIF9fSU5TVVJFX18KLQkvKiBJbnN1cmUrKyBpcyBhIG1lbW9yeSBhbmFseXNpcyB0b29sIHRoYXQgYWlkcyBpbiBkaXNjb3ZlcmluZwotCSAqIG1lbW9yeSBsZWFrcyBhbmQgb3RoZXIgbWVtb3J5IHByb2JsZW1zLiAgT24gUHl0aG9uIGV4aXQsIHRoZQotCSAqIGludGVybmVkIHN0cmluZyBkaWN0aW9uYXJ5IGlzIGZsYWdnZWQgYXMgYmVpbmcgaW4gdXNlIGF0IGV4aXQKLQkgKiAod2hpY2ggaXQgaXMpLiAgVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHRoaXMgaXMgZmluZSBiZWNhdXNlCi0JICogdGhlIG1lbW9yeSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVjbGFpbWVkIGJ5IHRoZSBzeXN0ZW0uICBVbmRlcgotCSAqIG1lbW9yeSBkZWJ1Z2dpbmcsIGl0J3MgYSBodWdlIHNvdXJjZSBvZiB1c2VsZXNzIG5vaXNlLCBzbyB3ZQotCSAqIHRyYWRlIG9mZiBzbG93ZXIgc2h1dGRvd24gZm9yIGxlc3MgZGlzdHJhY3Rpb24gaW4gdGhlIG1lbW9yeQotCSAqIHJlcG9ydHMuICAtYmF3Ci0JICovCi0JX1B5X1JlbGVhc2VJbnRlcm5lZFN0cmluZ3MoKTsKKyAgICAvKiBJbnN1cmUrKyBpcyBhIG1lbW9yeSBhbmFseXNpcyB0b29sIHRoYXQgYWlkcyBpbiBkaXNjb3ZlcmluZworICAgICAqIG1lbW9yeSBsZWFrcyBhbmQgb3RoZXIgbWVtb3J5IHByb2JsZW1zLiAgT24gUHl0aG9uIGV4aXQsIHRoZQorICAgICAqIGludGVybmVkIHN0cmluZyBkaWN0aW9uYXJ5IGlzIGZsYWdnZWQgYXMgYmVpbmcgaW4gdXNlIGF0IGV4aXQKKyAgICAgKiAod2hpY2ggaXQgaXMpLiAgVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHRoaXMgaXMgZmluZSBiZWNhdXNlCisgICAgICogdGhlIG1lbW9yeSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVjbGFpbWVkIGJ5IHRoZSBzeXN0ZW0uICBVbmRlcgorICAgICAqIG1lbW9yeSBkZWJ1Z2dpbmcsIGl0J3MgYSBodWdlIHNvdXJjZSBvZiB1c2VsZXNzIG5vaXNlLCBzbyB3ZQorICAgICAqIHRyYWRlIG9mZiBzbG93ZXIgc2h1dGRvd24gZm9yIGxlc3MgZGlzdHJhY3Rpb24gaW4gdGhlIG1lbW9yeQorICAgICAqIHJlcG9ydHMuICAtYmF3CisgICAgICovCisgICAgX1B5X1JlbGVhc2VJbnRlcm5lZFN0cmluZ3MoKTsKICNlbmRpZiAvKiBfX0lOU1VSRV9fICovCiAKLQlyZXR1cm4gc3RzOworICAgIHJldHVybiBzdHM7CiB9CiAKIC8qIHRoaXMgaXMgZ29ubmEgc2VlbSAqcmVhbCB3ZWlyZCosIGJ1dCBpZiB5b3UgcHV0IHNvbWUgb3RoZXIgY29kZSBiZXR3ZWVuCkBAIC02MzEsOCArNjMxLDggQEAKIHZvaWQKIFB5X0dldEFyZ2NBcmd2KGludCAqYXJnYywgY2hhciAqKiphcmd2KQogewotCSphcmdjID0gb3JpZ19hcmdjOwotCSphcmd2ID0gb3JpZ19hcmd2OworICAgICphcmdjID0gb3JpZ19hcmdjOworICAgICphcmd2ID0gb3JpZ19hcmd2OwogfQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL01vZHVsZXMvbWF0aG1vZHVsZS5jIGIvTW9kdWxlcy9tYXRobW9kdWxlLmMKaW5kZXggMjBkNjZlMC4uMTNkNmU2MiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tYXRobW9kdWxlLmMKKysrIGIvTW9kdWxlcy9tYXRobW9kdWxlLmMKQEAgLTY3LDM3ICs2NywzNyBAQAogc3RhdGljIGludAogaXNfZXJyb3IoZG91YmxlIHgpCiB7Ci0JaW50IHJlc3VsdCA9IDE7CS8qIHByZXN1bXB0aW9uIG9mIGd1aWx0ICovCi0JYXNzZXJ0KGVycm5vKTsJLyogbm9uLXplcm8gZXJybm8gaXMgYSBwcmVjb25kaXRpb24gZm9yIGNhbGxpbmcgKi8KLQlpZiAoZXJybm8gPT0gRURPTSkKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtYXRoIGRvbWFpbiBlcnJvciIpOworICAgIGludCByZXN1bHQgPSAxOyAgICAgLyogcHJlc3VtcHRpb24gb2YgZ3VpbHQgKi8KKyAgICBhc3NlcnQoZXJybm8pOyAgICAgIC8qIG5vbi16ZXJvIGVycm5vIGlzIGEgcHJlY29uZGl0aW9uIGZvciBjYWxsaW5nICovCisgICAgaWYgKGVycm5vID09IEVET00pCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWF0aCBkb21haW4gZXJyb3IiKTsKIAotCWVsc2UgaWYgKGVycm5vID09IEVSQU5HRSkgewotCQkvKiBBTlNJIEMgZ2VuZXJhbGx5IHJlcXVpcmVzIGxpYm0gZnVuY3Rpb25zIHRvIHNldCBFUkFOR0UKLQkJICogb24gb3ZlcmZsb3csIGJ1dCBhbHNvIGdlbmVyYWxseSAqYWxsb3dzKiB0aGVtIHRvIHNldAotCQkgKiBFUkFOR0Ugb24gdW5kZXJmbG93IHRvby4gIFRoZXJlJ3Mgbm8gY29uc2lzdGVuY3kgYWJvdXQKLQkJICogdGhlIGxhdHRlciBhY3Jvc3MgcGxhdGZvcm1zLgotCQkgKiBBbGFzLCBDOTkgbmV2ZXIgcmVxdWlyZXMgdGhhdCBlcnJubyBiZSBzZXQuCi0JCSAqIEhlcmUgd2Ugc3VwcHJlc3MgdGhlIHVuZGVyZmxvdyBlcnJvcnMgKGxpYm0gZnVuY3Rpb25zCi0JCSAqIHNob3VsZCByZXR1cm4gYSB6ZXJvIG9uIHVuZGVyZmxvdywgYW5kICstIEhVR0VfVkFMIG9uCi0JCSAqIG92ZXJmbG93LCBzbyB0ZXN0aW5nIHRoZSByZXN1bHQgZm9yIHplcm8gc3VmZmljZXMgdG8KLQkJICogZGlzdGluZ3Vpc2ggdGhlIGNhc2VzKS4KLQkJICoKLQkJICogT24gc29tZSBwbGF0Zm9ybXMgKFVidW50dS9pYTY0KSBpdCBzZWVtcyB0aGF0IGVycm5vIGNhbiBiZQotCQkgKiBzZXQgdG8gRVJBTkdFIGZvciBzdWJub3JtYWwgcmVzdWx0cyB0aGF0IGRvICpub3QqIHVuZGVyZmxvdwotCQkgKiB0byB6ZXJvLiAgU28gdG8gYmUgc2FmZSwgd2UnbGwgaWdub3JlIEVSQU5HRSB3aGVuZXZlciB0aGUKLQkJICogZnVuY3Rpb24gcmVzdWx0IGlzIGxlc3MgdGhhbiBvbmUgaW4gYWJzb2x1dGUgdmFsdWUuCi0JCSAqLwotCQlpZiAoZmFicyh4KSA8IDEuMCkKLQkJCXJlc3VsdCA9IDA7Ci0JCWVsc2UKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkibWF0aCByYW5nZSBlcnJvciIpOwotCX0KLQllbHNlCi0gICAgICAgICAgICAgICAgLyogVW5leHBlY3RlZCBtYXRoIGVycm9yICovCi0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19WYWx1ZUVycm9yKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSkgeworICAgICAgICAvKiBBTlNJIEMgZ2VuZXJhbGx5IHJlcXVpcmVzIGxpYm0gZnVuY3Rpb25zIHRvIHNldCBFUkFOR0UKKyAgICAgICAgICogb24gb3ZlcmZsb3csIGJ1dCBhbHNvIGdlbmVyYWxseSAqYWxsb3dzKiB0aGVtIHRvIHNldAorICAgICAgICAgKiBFUkFOR0Ugb24gdW5kZXJmbG93IHRvby4gIFRoZXJlJ3Mgbm8gY29uc2lzdGVuY3kgYWJvdXQKKyAgICAgICAgICogdGhlIGxhdHRlciBhY3Jvc3MgcGxhdGZvcm1zLgorICAgICAgICAgKiBBbGFzLCBDOTkgbmV2ZXIgcmVxdWlyZXMgdGhhdCBlcnJubyBiZSBzZXQuCisgICAgICAgICAqIEhlcmUgd2Ugc3VwcHJlc3MgdGhlIHVuZGVyZmxvdyBlcnJvcnMgKGxpYm0gZnVuY3Rpb25zCisgICAgICAgICAqIHNob3VsZCByZXR1cm4gYSB6ZXJvIG9uIHVuZGVyZmxvdywgYW5kICstIEhVR0VfVkFMIG9uCisgICAgICAgICAqIG92ZXJmbG93LCBzbyB0ZXN0aW5nIHRoZSByZXN1bHQgZm9yIHplcm8gc3VmZmljZXMgdG8KKyAgICAgICAgICogZGlzdGluZ3Vpc2ggdGhlIGNhc2VzKS4KKyAgICAgICAgICoKKyAgICAgICAgICogT24gc29tZSBwbGF0Zm9ybXMgKFVidW50dS9pYTY0KSBpdCBzZWVtcyB0aGF0IGVycm5vIGNhbiBiZQorICAgICAgICAgKiBzZXQgdG8gRVJBTkdFIGZvciBzdWJub3JtYWwgcmVzdWx0cyB0aGF0IGRvICpub3QqIHVuZGVyZmxvdworICAgICAgICAgKiB0byB6ZXJvLiAgU28gdG8gYmUgc2FmZSwgd2UnbGwgaWdub3JlIEVSQU5HRSB3aGVuZXZlciB0aGUKKyAgICAgICAgICogZnVuY3Rpb24gcmVzdWx0IGlzIGxlc3MgdGhhbiBvbmUgaW4gYWJzb2x1dGUgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBpZiAoZmFicyh4KSA8IDEuMCkKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRoIHJhbmdlIGVycm9yIik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgLyogVW5leHBlY3RlZCBtYXRoIGVycm9yICovCisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19WYWx1ZUVycm9yKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKgpAQCAtMTExLDI5ICsxMTEsMjkgQEAKIHN0YXRpYyBkb3VibGUKIG1fYXRhbjIoZG91YmxlIHksIGRvdWJsZSB4KQogewotCWlmIChQeV9JU19OQU4oeCkgfHwgUHlfSVNfTkFOKHkpKQotCQlyZXR1cm4gUHlfTkFOOwotCWlmIChQeV9JU19JTkZJTklUWSh5KSkgewotCQlpZiAoUHlfSVNfSU5GSU5JVFkoeCkpIHsKLQkJCWlmIChjb3B5c2lnbigxLiwgeCkgPT0gMS4pCi0JCQkJLyogYXRhbjIoKy1pbmYsICtpbmYpID09ICstcGkvNCAqLwotCQkJCXJldHVybiBjb3B5c2lnbigwLjI1KlB5X01BVEhfUEksIHkpOwotCQkJZWxzZQotCQkJCS8qIGF0YW4yKCstaW5mLCAtaW5mKSA9PSArLXBpKjMvNCAqLwotCQkJCXJldHVybiBjb3B5c2lnbigwLjc1KlB5X01BVEhfUEksIHkpOwotCQl9Ci0JCS8qIGF0YW4yKCstaW5mLCB4KSA9PSArLXBpLzIgZm9yIGZpbml0ZSB4ICovCi0JCXJldHVybiBjb3B5c2lnbigwLjUqUHlfTUFUSF9QSSwgeSk7Ci0JfQotCWlmIChQeV9JU19JTkZJTklUWSh4KSB8fCB5ID09IDAuKSB7Ci0JCWlmIChjb3B5c2lnbigxLiwgeCkgPT0gMS4pCi0JCQkvKiBhdGFuMigrLXksICtpbmYpID0gYXRhbjIoKy0wLCAreCkgPSArLTAuICovCi0JCQlyZXR1cm4gY29weXNpZ24oMC4sIHkpOwotCQllbHNlCi0JCQkvKiBhdGFuMigrLXksIC1pbmYpID0gYXRhbjIoKy0wLiwgLXgpID0gKy1waS4gKi8KLQkJCXJldHVybiBjb3B5c2lnbihQeV9NQVRIX1BJLCB5KTsKLQl9Ci0JcmV0dXJuIGF0YW4yKHksIHgpOworICAgIGlmIChQeV9JU19OQU4oeCkgfHwgUHlfSVNfTkFOKHkpKQorICAgICAgICByZXR1cm4gUHlfTkFOOworICAgIGlmIChQeV9JU19JTkZJTklUWSh5KSkgeworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeCkpIHsKKyAgICAgICAgICAgIGlmIChjb3B5c2lnbigxLiwgeCkgPT0gMS4pCisgICAgICAgICAgICAgICAgLyogYXRhbjIoKy1pbmYsICtpbmYpID09ICstcGkvNCAqLworICAgICAgICAgICAgICAgIHJldHVybiBjb3B5c2lnbigwLjI1KlB5X01BVEhfUEksIHkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8qIGF0YW4yKCstaW5mLCAtaW5mKSA9PSArLXBpKjMvNCAqLworICAgICAgICAgICAgICAgIHJldHVybiBjb3B5c2lnbigwLjc1KlB5X01BVEhfUEksIHkpOworICAgICAgICB9CisgICAgICAgIC8qIGF0YW4yKCstaW5mLCB4KSA9PSArLXBpLzIgZm9yIGZpbml0ZSB4ICovCisgICAgICAgIHJldHVybiBjb3B5c2lnbigwLjUqUHlfTUFUSF9QSSwgeSk7CisgICAgfQorICAgIGlmIChQeV9JU19JTkZJTklUWSh4KSB8fCB5ID09IDAuKSB7CisgICAgICAgIGlmIChjb3B5c2lnbigxLiwgeCkgPT0gMS4pCisgICAgICAgICAgICAvKiBhdGFuMigrLXksICtpbmYpID0gYXRhbjIoKy0wLCAreCkgPSArLTAuICovCisgICAgICAgICAgICByZXR1cm4gY29weXNpZ24oMC4sIHkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiBhdGFuMigrLXksIC1pbmYpID0gYXRhbjIoKy0wLiwgLXgpID0gKy1waS4gKi8KKyAgICAgICAgICAgIHJldHVybiBjb3B5c2lnbihQeV9NQVRIX1BJLCB5KTsKKyAgICB9CisgICAgcmV0dXJuIGF0YW4yKHksIHgpOwogfQogCiAvKgpAQCAtMTQ2LDQ1ICsxNDYsNDUgQEAKIHN0YXRpYyBkb3VibGUKIG1fbG9nKGRvdWJsZSB4KQogewotCWlmIChQeV9JU19GSU5JVEUoeCkpIHsKLQkJaWYgKHggPiAwLjApCi0JCQlyZXR1cm4gbG9nKHgpOwotCQllcnJubyA9IEVET007Ci0JCWlmICh4ID09IDAuMCkKLQkJCXJldHVybiAtUHlfSFVHRV9WQUw7IC8qIGxvZygwKSA9IC1pbmYgKi8KLQkJZWxzZQotCQkJcmV0dXJuIFB5X05BTjsgLyogbG9nKC12ZSkgPSBuYW4gKi8KLQl9Ci0JZWxzZSBpZiAoUHlfSVNfTkFOKHgpKQotCQlyZXR1cm4geDsgLyogbG9nKG5hbikgPSBuYW4gKi8KLQllbHNlIGlmICh4ID4gMC4wKQotCQlyZXR1cm4geDsgLyogbG9nKGluZikgPSBpbmYgKi8KLQllbHNlIHsKLQkJZXJybm8gPSBFRE9NOwotCQlyZXR1cm4gUHlfTkFOOyAvKiBsb2coLWluZikgPSBuYW4gKi8KLQl9CisgICAgaWYgKFB5X0lTX0ZJTklURSh4KSkgeworICAgICAgICBpZiAoeCA+IDAuMCkKKyAgICAgICAgICAgIHJldHVybiBsb2coeCk7CisgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgaWYgKHggPT0gMC4wKQorICAgICAgICAgICAgcmV0dXJuIC1QeV9IVUdFX1ZBTDsgLyogbG9nKDApID0gLWluZiAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlfTkFOOyAvKiBsb2coLXZlKSA9IG5hbiAqLworICAgIH0KKyAgICBlbHNlIGlmIChQeV9JU19OQU4oeCkpCisgICAgICAgIHJldHVybiB4OyAvKiBsb2cobmFuKSA9IG5hbiAqLworICAgIGVsc2UgaWYgKHggPiAwLjApCisgICAgICAgIHJldHVybiB4OyAvKiBsb2coaW5mKSA9IGluZiAqLworICAgIGVsc2UgeworICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIHJldHVybiBQeV9OQU47IC8qIGxvZygtaW5mKSA9IG5hbiAqLworICAgIH0KIH0KIAogc3RhdGljIGRvdWJsZQogbV9sb2cxMChkb3VibGUgeCkKIHsKLQlpZiAoUHlfSVNfRklOSVRFKHgpKSB7Ci0JCWlmICh4ID4gMC4wKQotCQkJcmV0dXJuIGxvZzEwKHgpOwotCQllcnJubyA9IEVET007Ci0JCWlmICh4ID09IDAuMCkKLQkJCXJldHVybiAtUHlfSFVHRV9WQUw7IC8qIGxvZzEwKDApID0gLWluZiAqLwotCQllbHNlCi0JCQlyZXR1cm4gUHlfTkFOOyAvKiBsb2cxMCgtdmUpID0gbmFuICovCi0JfQotCWVsc2UgaWYgKFB5X0lTX05BTih4KSkKLQkJcmV0dXJuIHg7IC8qIGxvZzEwKG5hbikgPSBuYW4gKi8KLQllbHNlIGlmICh4ID4gMC4wKQotCQlyZXR1cm4geDsgLyogbG9nMTAoaW5mKSA9IGluZiAqLwotCWVsc2UgewotCQllcnJubyA9IEVET007Ci0JCXJldHVybiBQeV9OQU47IC8qIGxvZzEwKC1pbmYpID0gbmFuICovCi0JfQorICAgIGlmIChQeV9JU19GSU5JVEUoeCkpIHsKKyAgICAgICAgaWYgKHggPiAwLjApCisgICAgICAgICAgICByZXR1cm4gbG9nMTAoeCk7CisgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgaWYgKHggPT0gMC4wKQorICAgICAgICAgICAgcmV0dXJuIC1QeV9IVUdFX1ZBTDsgLyogbG9nMTAoMCkgPSAtaW5mICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeV9OQU47IC8qIGxvZzEwKC12ZSkgPSBuYW4gKi8KKyAgICB9CisgICAgZWxzZSBpZiAoUHlfSVNfTkFOKHgpKQorICAgICAgICByZXR1cm4geDsgLyogbG9nMTAobmFuKSA9IG5hbiAqLworICAgIGVsc2UgaWYgKHggPiAwLjApCisgICAgICAgIHJldHVybiB4OyAvKiBsb2cxMChpbmYpID0gaW5mICovCisgICAgZWxzZSB7CisgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgcmV0dXJuIFB5X05BTjsgLyogbG9nMTAoLWluZikgPSBuYW4gKi8KKyAgICB9CiB9CiAKIApAQCAtMjIxLDMwICsyMjEsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoXzEoUHlPYmplY3QgKmFyZywgZG91YmxlICgqZnVuYykgKGRvdWJsZSksIGludCBjYW5fb3ZlcmZsb3cpCiB7Ci0JZG91YmxlIHgsIHI7Ci0JeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoXzEiLCByZXR1cm4gMCk7Ci0JciA9ICgqZnVuYykoeCk7Ci0JUHlGUEVfRU5EX1BST1RFQ1Qocik7Ci0JaWYgKFB5X0lTX05BTihyKSkgewotCQlpZiAoIVB5X0lTX05BTih4KSkKLQkJCWVycm5vID0gRURPTTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCX0KLQllbHNlIGlmIChQeV9JU19JTkZJTklUWShyKSkgewotCQlpZiAoUHlfSVNfRklOSVRFKHgpKQotCQkJZXJybm8gPSBjYW5fb3ZlcmZsb3cgPyBFUkFOR0UgOiBFRE9NOwotCQllbHNlCi0JCQllcnJubyA9IDA7Ci0JfQotCWlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOworICAgIGRvdWJsZSB4LCByOworICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7CisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF8xIiwgcmV0dXJuIDApOworICAgIHIgPSAoKmZ1bmMpKHgpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHIpOworICAgIGlmIChQeV9JU19OQU4ocikpIHsKKyAgICAgICAgaWYgKCFQeV9JU19OQU4oeCkpCisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkocikpIHsKKyAgICAgICAgaWYgKFB5X0lTX0ZJTklURSh4KSkKKyAgICAgICAgICAgIGVycm5vID0gY2FuX292ZXJmbG93ID8gRVJBTkdFIDogRURPTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICBpZiAoZXJybm8gJiYgaXNfZXJyb3IocikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKIH0KIAogLyoKQEAgLTI3Nyw0NyArMjc3LDQ3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF8yKFB5T2JqZWN0ICphcmdzLCBkb3VibGUgKCpmdW5jKSAoZG91YmxlLCBkb3VibGUpLCBjaGFyICpmdW5jbmFtZSkKIHsKLQlQeU9iamVjdCAqb3gsICpveTsKLQlkb3VibGUgeCwgeSwgcjsKLQlpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCBmdW5jbmFtZSwgMiwgMiwgJm94LCAmb3kpKQotCQlyZXR1cm4gTlVMTDsKLQl4ID0gUHlGbG9hdF9Bc0RvdWJsZShveCk7Ci0JeSA9IFB5RmxvYXRfQXNEb3VibGUob3kpOwotCWlmICgoeCA9PSAtMS4wIHx8IHkgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfMiIsIHJldHVybiAwKTsKLQlyID0gKCpmdW5jKSh4LCB5KTsKLQlQeUZQRV9FTkRfUFJPVEVDVChyKTsKLQlpZiAoUHlfSVNfTkFOKHIpKSB7Ci0JCWlmICghUHlfSVNfTkFOKHgpICYmICFQeV9JU19OQU4oeSkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQl9Ci0JZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkocikpIHsKLQkJaWYgKFB5X0lTX0ZJTklURSh4KSAmJiBQeV9JU19GSU5JVEUoeSkpCi0JCQllcnJubyA9IEVSQU5HRTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCX0KLQlpZiAoZXJybm8gJiYgaXNfZXJyb3IocikpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKKyAgICBQeU9iamVjdCAqb3gsICpveTsKKyAgICBkb3VibGUgeCwgeSwgcjsKKyAgICBpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCBmdW5jbmFtZSwgMiwgMiwgJm94LCAmb3kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZShveCk7CisgICAgeSA9IFB5RmxvYXRfQXNEb3VibGUob3kpOworICAgIGlmICgoeCA9PSAtMS4wIHx8IHkgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfMiIsIHJldHVybiAwKTsKKyAgICByID0gKCpmdW5jKSh4LCB5KTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChyKTsKKyAgICBpZiAoUHlfSVNfTkFOKHIpKSB7CisgICAgICAgIGlmICghUHlfSVNfTkFOKHgpICYmICFQeV9JU19OQU4oeSkpCisgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkocikpIHsKKyAgICAgICAgaWYgKFB5X0lTX0ZJTklURSh4KSAmJiBQeV9JU19GSU5JVEUoeSkpCisgICAgICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICBpZiAoZXJybm8gJiYgaXNfZXJyb3IocikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKIH0KIAotI2RlZmluZSBGVU5DMShmdW5jbmFtZSwgZnVuYywgY2FuX292ZXJmbG93LCBkb2NzdHJpbmcpCQkJXAotCXN0YXRpYyBQeU9iamVjdCAqIG1hdGhfIyNmdW5jbmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsgXAotCQlyZXR1cm4gbWF0aF8xKGFyZ3MsIGZ1bmMsIGNhbl9vdmVyZmxvdyk7CQkgICAgXAotCX1cCi0gICAgICAgIFB5RG9jX1NUUlZBUihtYXRoXyMjZnVuY25hbWUjI19kb2MsIGRvY3N0cmluZyk7CisjZGVmaW5lIEZVTkMxKGZ1bmNuYW1lLCBmdW5jLCBjYW5fb3ZlcmZsb3csIGRvY3N0cmluZykgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIFB5T2JqZWN0ICogbWF0aF8jI2Z1bmNuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgeyBcCisgICAgICAgIHJldHVybiBtYXRoXzEoYXJncywgZnVuYywgY2FuX292ZXJmbG93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH1cCisgICAgUHlEb2NfU1RSVkFSKG1hdGhfIyNmdW5jbmFtZSMjX2RvYywgZG9jc3RyaW5nKTsKIAogI2RlZmluZSBGVU5DMihmdW5jbmFtZSwgZnVuYywgZG9jc3RyaW5nKSBcCi0Jc3RhdGljIFB5T2JqZWN0ICogbWF0aF8jI2Z1bmNuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgeyBcCi0JCXJldHVybiBtYXRoXzIoYXJncywgZnVuYywgI2Z1bmNuYW1lKTsgXAotCX1cCi0gICAgICAgIFB5RG9jX1NUUlZBUihtYXRoXyMjZnVuY25hbWUjI19kb2MsIGRvY3N0cmluZyk7CisgICAgc3RhdGljIFB5T2JqZWN0ICogbWF0aF8jI2Z1bmNuYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykgeyBcCisgICAgICAgIHJldHVybiBtYXRoXzIoYXJncywgZnVuYywgI2Z1bmNuYW1lKTsgXAorICAgIH1cCisgICAgUHlEb2NfU1RSVkFSKG1hdGhfIyNmdW5jbmFtZSMjX2RvYywgZG9jc3RyaW5nKTsKIAogRlVOQzEoYWNvcywgYWNvcywgMCwKICAgICAgICJhY29zKHgpXG5cblJldHVybiB0aGUgYXJjIGNvc2luZSAobWVhc3VyZWQgaW4gcmFkaWFucykgb2YgeC4iKQpAQCAtMzg0LDcgKzM4NCw3IEBACiAgICBBbHNvLCB0aGUgdm9sYXRpbGUgZGVjbGFyYXRpb24gZm9yY2VzIHRoZSB2YWx1ZXMgdG8gYmUgc3RvcmVkIGluIG1lbW9yeSBhcwogICAgcmVndWxhciBkb3VibGVzIGluc3RlYWQgb2YgZXh0ZW5kZWQgbG9uZyBwcmVjaXNpb24gKDgwLWJpdCkgdmFsdWVzLiAgVGhpcwogICAgcHJldmVudHMgZG91YmxlIHJvdW5kaW5nIGJlY2F1c2UgYW55IGFkZGl0aW9uIG9yIHN1YnRyYWN0aW9uIG9mIHR3byBkb3VibGVzCi0gICBjYW4gYmUgcmVzb2x2ZWQgZXhhY3RseSBpbnRvIGRvdWJsZS1zaXplZCBoaSBhbmQgbG8gdmFsdWVzLiAgQXMgbG9uZyBhcyB0aGUgCisgICBjYW4gYmUgcmVzb2x2ZWQgZXhhY3RseSBpbnRvIGRvdWJsZS1zaXplZCBoaSBhbmQgbG8gdmFsdWVzLiAgQXMgbG9uZyBhcyB0aGUKICAgIGhpIHZhbHVlIGdldHMgZm9yY2VkIGludG8gYSBkb3VibGUgYmVmb3JlIHlyIGFuZCBsbyBhcmUgY29tcHV0ZWQsIHRoZSBleHRyYQogICAgYml0cyBpbiBkb3duc3RyZWFtIGV4dGVuZGVkIHByZWNpc2lvbiBvcGVyYXRpb25zICh4ODcgZm9yIGV4YW1wbGUpIHdpbGwgYmUKICAgIGV4YWN0bHkgemVybyBhbmQgdGhlcmVmb3JlIGNhbiBiZSBsb3NzbGVzc2x5IHN0b3JlZCBiYWNrIGludG8gYSBkb3VibGUsCkBAIC00MDcsMjcgKzQwNywyNyBAQAogX2ZzdW1fcmVhbGxvYyhkb3VibGUgKipwX3B0ciwgUHlfc3NpemVfdCAgbiwKICAgICAgICAgICAgICBkb3VibGUgICpwcywgICAgUHlfc3NpemVfdCAqbV9wdHIpCiB7Ci0Jdm9pZCAqdiA9IE5VTEw7Ci0JUHlfc3NpemVfdCBtID0gKm1fcHRyOworICAgIHZvaWQgKnYgPSBOVUxMOworICAgIFB5X3NzaXplX3QgbSA9ICptX3B0cjsKIAotCW0gKz0gbTsgIC8qIGRvdWJsZSAqLwotCWlmIChuIDwgbSAmJiBtIDwgKFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKGRvdWJsZSkpKSB7Ci0JCWRvdWJsZSAqcCA9ICpwX3B0cjsKLQkJaWYgKHAgPT0gcHMpIHsKLQkJCXYgPSBQeU1lbV9NYWxsb2Moc2l6ZW9mKGRvdWJsZSkgKiBtKTsKLQkJCWlmICh2ICE9IE5VTEwpCi0JCQkJbWVtY3B5KHYsIHBzLCBzaXplb2YoZG91YmxlKSAqIG4pOwotCQl9Ci0JCWVsc2UKLQkJCXYgPSBQeU1lbV9SZWFsbG9jKHAsIHNpemVvZihkb3VibGUpICogbSk7Ci0JfQotCWlmICh2ID09IE5VTEwpIHsgICAgICAgIC8qIHNpemUgb3ZlcmZsb3cgb3Igbm8gbWVtb3J5ICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgIm1hdGguZnN1bSBwYXJ0aWFscyIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JKnBfcHRyID0gKGRvdWJsZSopIHY7Ci0JKm1fcHRyID0gbTsKLQlyZXR1cm4gMDsKKyAgICBtICs9IG07ICAvKiBkb3VibGUgKi8KKyAgICBpZiAobiA8IG0gJiYgbSA8IChQWV9TU0laRV9UX01BWCAvIHNpemVvZihkb3VibGUpKSkgeworICAgICAgICBkb3VibGUgKnAgPSAqcF9wdHI7CisgICAgICAgIGlmIChwID09IHBzKSB7CisgICAgICAgICAgICB2ID0gUHlNZW1fTWFsbG9jKHNpemVvZihkb3VibGUpICogbSk7CisgICAgICAgICAgICBpZiAodiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIG1lbWNweSh2LCBwcywgc2l6ZW9mKGRvdWJsZSkgKiBuKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB2ID0gUHlNZW1fUmVhbGxvYyhwLCBzaXplb2YoZG91YmxlKSAqIG0pOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKSB7ICAgICAgICAvKiBzaXplIG92ZXJmbG93IG9yIG5vIG1lbW9yeSAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJtYXRoLmZzdW0gcGFydGlhbHMiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgICpwX3B0ciA9IChkb3VibGUqKSB2OworICAgICptX3B0ciA9IG07CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEZ1bGwgcHJlY2lzaW9uIHN1bW1hdGlvbiBvZiBhIHNlcXVlbmNlIG9mIGZsb2F0cy4KQEAgLTQzNSwxNyArNDM1LDE3IEBACiAgICBkZWYgbXN1bShpdGVyYWJsZSk6CiAgICAgICAgcGFydGlhbHMgPSBbXSAgIyBzb3J0ZWQsIG5vbi1vdmVybGFwcGluZyBwYXJ0aWFsIHN1bXMKICAgICAgICBmb3IgeCBpbiBpdGVyYWJsZToKLSAgICAgICAgICAgaSA9IDAKLSAgICAgICAgICAgZm9yIHkgaW4gcGFydGlhbHM6Ci0gICAgICAgICAgICAgICBpZiBhYnMoeCkgPCBhYnMoeSk6Ci0gICAgICAgICAgICAgICAgICAgeCwgeSA9IHksIHgKLSAgICAgICAgICAgICAgIGhpID0geCArIHkKLSAgICAgICAgICAgICAgIGxvID0geSAtIChoaSAtIHgpCi0gICAgICAgICAgICAgICBpZiBsbzoKLSAgICAgICAgICAgICAgICAgICBwYXJ0aWFsc1tpXSA9IGxvCi0gICAgICAgICAgICAgICAgICAgaSArPSAxCi0gICAgICAgICAgICAgICB4ID0gaGkKLSAgICAgICAgICAgcGFydGlhbHNbaTpdID0gW3hdCisgICAgICAgaSA9IDAKKyAgICAgICBmb3IgeSBpbiBwYXJ0aWFsczoKKyAgICAgICAgICAgaWYgYWJzKHgpIDwgYWJzKHkpOgorICAgICAgICAgICB4LCB5ID0geSwgeAorICAgICAgICAgICBoaSA9IHggKyB5CisgICAgICAgICAgIGxvID0geSAtIChoaSAtIHgpCisgICAgICAgICAgIGlmIGxvOgorICAgICAgICAgICBwYXJ0aWFsc1tpXSA9IGxvCisgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICB4ID0gaGkKKyAgICAgICBwYXJ0aWFsc1tpOl0gPSBbeF0KICAgICAgICByZXR1cm4gc3VtX2V4YWN0KHBhcnRpYWxzKQogCiAgICBSb3VuZGVkIHgreSBzdG9yZWQgaW4gaGkgd2l0aCB0aGUgcm91bmRvZmYgc3RvcmVkIGluIGxvLiAgVG9nZXRoZXIgaGkrbG8KQEAgLTQ2MywxMTkgKzQ2MywxMTkgQEAKIHN0YXRpYyBQeU9iamVjdCoKIG1hdGhfZnN1bShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcSkKIHsKLQlQeU9iamVjdCAqaXRlbSwgKml0ZXIsICpzdW0gPSBOVUxMOwotCVB5X3NzaXplX3QgaSwgaiwgbiA9IDAsIG0gPSBOVU1fUEFSVElBTFM7Ci0JZG91YmxlIHgsIHksIHQsIHBzW05VTV9QQVJUSUFMU10sICpwID0gcHM7Ci0JZG91YmxlIHhzYXZlLCBzcGVjaWFsX3N1bSA9IDAuMCwgaW5mX3N1bSA9IDAuMDsKLQl2b2xhdGlsZSBkb3VibGUgaGksIHlyLCBsbzsKKyAgICBQeU9iamVjdCAqaXRlbSwgKml0ZXIsICpzdW0gPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgaiwgbiA9IDAsIG0gPSBOVU1fUEFSVElBTFM7CisgICAgZG91YmxlIHgsIHksIHQsIHBzW05VTV9QQVJUSUFMU10sICpwID0gcHM7CisgICAgZG91YmxlIHhzYXZlLCBzcGVjaWFsX3N1bSA9IDAuMCwgaW5mX3N1bSA9IDAuMDsKKyAgICB2b2xhdGlsZSBkb3VibGUgaGksIHlyLCBsbzsKIAotCWl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7Ci0JaWYgKGl0ZXIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKKyAgICBpZiAoaXRlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImZzdW0iLCBQeV9ERUNSRUYoaXRlcik7IHJldHVybiBOVUxMKQorICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImZzdW0iLCBQeV9ERUNSRUYoaXRlcik7IHJldHVybiBOVUxMKQogCi0JZm9yKDs7KSB7ICAgICAgICAgICAvKiBmb3IgeCBpbiBpdGVyYWJsZSAqLwotCQlhc3NlcnQoMCA8PSBuICYmIG4gPD0gbSk7Ci0JCWFzc2VydCgobSA9PSBOVU1fUEFSVElBTFMgJiYgcCA9PSBwcykgfHwKLQkJICAgICAgIChtID4gIE5VTV9QQVJUSUFMUyAmJiBwICE9IE5VTEwpKTsKKyAgICBmb3IoOzspIHsgICAgICAgICAgIC8qIGZvciB4IGluIGl0ZXJhYmxlICovCisgICAgICAgIGFzc2VydCgwIDw9IG4gJiYgbiA8PSBtKTsKKyAgICAgICAgYXNzZXJ0KChtID09IE5VTV9QQVJUSUFMUyAmJiBwID09IHBzKSB8fAorICAgICAgICAgICAgICAgKG0gPiAgTlVNX1BBUlRJQUxTICYmIHAgIT0gTlVMTCkpOwogCi0JCWl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBfZnN1bV9lcnJvcjsKLQkJCWJyZWFrOwotCQl9Ci0JCXggPSBQeUZsb2F0X0FzRG91YmxlKGl0ZW0pOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJZ290byBfZnN1bV9lcnJvcjsKKyAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIF9mc3VtX2Vycm9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUoaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIF9mc3VtX2Vycm9yOwogCi0JCXhzYXZlID0geDsKLQkJZm9yIChpID0gaiA9IDA7IGogPCBuOyBqKyspIHsgICAgICAgLyogZm9yIHkgaW4gcGFydGlhbHMgKi8KLQkJCXkgPSBwW2pdOwotCQkJaWYgKGZhYnMoeCkgPCBmYWJzKHkpKSB7Ci0JCQkJdCA9IHg7IHggPSB5OyB5ID0gdDsKLQkJCX0KLQkJCWhpID0geCArIHk7Ci0JCQl5ciA9IGhpIC0geDsKLQkJCWxvID0geSAtIHlyOwotCQkJaWYgKGxvICE9IDAuMCkKLQkJCQlwW2krK10gPSBsbzsKLQkJCXggPSBoaTsKLQkJfQorICAgICAgICB4c2F2ZSA9IHg7CisgICAgICAgIGZvciAoaSA9IGogPSAwOyBqIDwgbjsgaisrKSB7ICAgICAgIC8qIGZvciB5IGluIHBhcnRpYWxzICovCisgICAgICAgICAgICB5ID0gcFtqXTsKKyAgICAgICAgICAgIGlmIChmYWJzKHgpIDwgZmFicyh5KSkgeworICAgICAgICAgICAgICAgIHQgPSB4OyB4ID0geTsgeSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoaSA9IHggKyB5OworICAgICAgICAgICAgeXIgPSBoaSAtIHg7CisgICAgICAgICAgICBsbyA9IHkgLSB5cjsKKyAgICAgICAgICAgIGlmIChsbyAhPSAwLjApCisgICAgICAgICAgICAgICAgcFtpKytdID0gbG87CisgICAgICAgICAgICB4ID0gaGk7CisgICAgICAgIH0KIAotCQluID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwc1tpOl0gPSBbeF0gKi8KLQkJaWYgKHggIT0gMC4wKSB7Ci0JCQlpZiAoISBQeV9JU19GSU5JVEUoeCkpIHsKLQkJCQkvKiBhIG5vbmZpbml0ZSB4IGNvdWxkIGFyaXNlIGVpdGhlciBhcwotCQkJCSAgIGEgcmVzdWx0IG9mIGludGVybWVkaWF0ZSBvdmVyZmxvdywgb3IKLQkJCQkgICBhcyBhIHJlc3VsdCBvZiBhIG5hbiBvciBpbmYgaW4gdGhlCi0JCQkJICAgc3VtbWFuZHMgKi8KLQkJCQlpZiAoUHlfSVNfRklOSVRFKHhzYXZlKSkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJICAgICAgImludGVybWVkaWF0ZSBvdmVyZmxvdyBpbiBmc3VtIik7Ci0JCQkJCWdvdG8gX2ZzdW1fZXJyb3I7Ci0JCQkJfQotCQkJCWlmIChQeV9JU19JTkZJTklUWSh4c2F2ZSkpCi0JCQkJCWluZl9zdW0gKz0geHNhdmU7Ci0JCQkJc3BlY2lhbF9zdW0gKz0geHNhdmU7Ci0JCQkJLyogcmVzZXQgcGFydGlhbHMgKi8KLQkJCQluID0gMDsKLQkJCX0KLQkJCWVsc2UgaWYgKG4gPj0gbSAmJiBfZnN1bV9yZWFsbG9jKCZwLCBuLCBwcywgJm0pKQotCQkJCWdvdG8gX2ZzdW1fZXJyb3I7Ci0JCQllbHNlCi0JCQkJcFtuKytdID0geDsKLQkJfQotCX0KKyAgICAgICAgbiA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHNbaTpdID0gW3hdICovCisgICAgICAgIGlmICh4ICE9IDAuMCkgeworICAgICAgICAgICAgaWYgKCEgUHlfSVNfRklOSVRFKHgpKSB7CisgICAgICAgICAgICAgICAgLyogYSBub25maW5pdGUgeCBjb3VsZCBhcmlzZSBlaXRoZXIgYXMKKyAgICAgICAgICAgICAgICAgICBhIHJlc3VsdCBvZiBpbnRlcm1lZGlhdGUgb3ZlcmZsb3csIG9yCisgICAgICAgICAgICAgICAgICAgYXMgYSByZXN1bHQgb2YgYSBuYW4gb3IgaW5mIGluIHRoZQorICAgICAgICAgICAgICAgICAgIHN1bW1hbmRzICovCisgICAgICAgICAgICAgICAgaWYgKFB5X0lTX0ZJTklURSh4c2F2ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm1lZGlhdGUgb3ZlcmZsb3cgaW4gZnN1bSIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIF9mc3VtX2Vycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeHNhdmUpKQorICAgICAgICAgICAgICAgICAgICBpbmZfc3VtICs9IHhzYXZlOworICAgICAgICAgICAgICAgIHNwZWNpYWxfc3VtICs9IHhzYXZlOworICAgICAgICAgICAgICAgIC8qIHJlc2V0IHBhcnRpYWxzICovCisgICAgICAgICAgICAgICAgbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChuID49IG0gJiYgX2ZzdW1fcmVhbGxvYygmcCwgbiwgcHMsICZtKSkKKyAgICAgICAgICAgICAgICBnb3RvIF9mc3VtX2Vycm9yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBbbisrXSA9IHg7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoc3BlY2lhbF9zdW0gIT0gMC4wKSB7Ci0JCWlmIChQeV9JU19OQU4oaW5mX3N1bSkpCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIi1pbmYgKyBpbmYgaW4gZnN1bSIpOwotCQllbHNlCi0JCQlzdW0gPSBQeUZsb2F0X0Zyb21Eb3VibGUoc3BlY2lhbF9zdW0pOwotCQlnb3RvIF9mc3VtX2Vycm9yOwotCX0KKyAgICBpZiAoc3BlY2lhbF9zdW0gIT0gMC4wKSB7CisgICAgICAgIGlmIChQeV9JU19OQU4oaW5mX3N1bSkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWluZiArIGluZiBpbiBmc3VtIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN1bSA9IFB5RmxvYXRfRnJvbURvdWJsZShzcGVjaWFsX3N1bSk7CisgICAgICAgIGdvdG8gX2ZzdW1fZXJyb3I7CisgICAgfQogCi0JaGkgPSAwLjA7Ci0JaWYgKG4gPiAwKSB7Ci0JCWhpID0gcFstLW5dOwotCQkvKiBzdW1fZXhhY3QocHMsIGhpKSBmcm9tIHRoZSB0b3AsIHN0b3Agd2hlbiB0aGUgc3VtIGJlY29tZXMKLQkJICAgaW5leGFjdC4gKi8KLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQl4ID0gaGk7Ci0JCQl5ID0gcFstLW5dOwotCQkJYXNzZXJ0KGZhYnMoeSkgPCBmYWJzKHgpKTsKLQkJCWhpID0geCArIHk7Ci0JCQl5ciA9IGhpIC0geDsKLQkJCWxvID0geSAtIHlyOwotCQkJaWYgKGxvICE9IDAuMCkKLQkJCQlicmVhazsKLQkJfQotCQkvKiBNYWtlIGhhbGYtZXZlbiByb3VuZGluZyB3b3JrIGFjcm9zcyBtdWx0aXBsZSBwYXJ0aWFscy4KLQkJICAgTmVlZGVkIHNvIHRoYXQgc3VtKFsxZS0xNiwgMSwgMWUxNl0pIHdpbGwgcm91bmQtdXAgdGhlIGxhc3QKLQkJICAgZGlnaXQgdG8gdHdvIGluc3RlYWQgb2YgZG93biB0byB6ZXJvICh0aGUgMWUtMTYgbWFrZXMgdGhlIDEKLQkJICAgc2xpZ2h0bHkgY2xvc2VyIHRvIHR3bykuICBXaXRoIGEgcG90ZW50aWFsIDEgVUxQIHJvdW5kaW5nCi0JCSAgIGVycm9yIGZpeGVkLXVwLCBtYXRoLmZzdW0oKSBjYW4gZ3VhcmFudGVlIGNvbW11dGF0aXZpdHkuICovCi0JCWlmIChuID4gMCAmJiAoKGxvIDwgMC4wICYmIHBbbi0xXSA8IDAuMCkgfHwKLQkJCSAgICAgIChsbyA+IDAuMCAmJiBwW24tMV0gPiAwLjApKSkgewotCQkJeSA9IGxvICogMi4wOwotCQkJeCA9IGhpICsgeTsKLQkJCXlyID0geCAtIGhpOwotCQkJaWYgKHkgPT0geXIpCi0JCQkJaGkgPSB4OwotCQl9Ci0JfQotCXN1bSA9IFB5RmxvYXRfRnJvbURvdWJsZShoaSk7CisgICAgaGkgPSAwLjA7CisgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIGhpID0gcFstLW5dOworICAgICAgICAvKiBzdW1fZXhhY3QocHMsIGhpKSBmcm9tIHRoZSB0b3AsIHN0b3Agd2hlbiB0aGUgc3VtIGJlY29tZXMKKyAgICAgICAgICAgaW5leGFjdC4gKi8KKyAgICAgICAgd2hpbGUgKG4gPiAwKSB7CisgICAgICAgICAgICB4ID0gaGk7CisgICAgICAgICAgICB5ID0gcFstLW5dOworICAgICAgICAgICAgYXNzZXJ0KGZhYnMoeSkgPCBmYWJzKHgpKTsKKyAgICAgICAgICAgIGhpID0geCArIHk7CisgICAgICAgICAgICB5ciA9IGhpIC0geDsKKyAgICAgICAgICAgIGxvID0geSAtIHlyOworICAgICAgICAgICAgaWYgKGxvICE9IDAuMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvKiBNYWtlIGhhbGYtZXZlbiByb3VuZGluZyB3b3JrIGFjcm9zcyBtdWx0aXBsZSBwYXJ0aWFscy4KKyAgICAgICAgICAgTmVlZGVkIHNvIHRoYXQgc3VtKFsxZS0xNiwgMSwgMWUxNl0pIHdpbGwgcm91bmQtdXAgdGhlIGxhc3QKKyAgICAgICAgICAgZGlnaXQgdG8gdHdvIGluc3RlYWQgb2YgZG93biB0byB6ZXJvICh0aGUgMWUtMTYgbWFrZXMgdGhlIDEKKyAgICAgICAgICAgc2xpZ2h0bHkgY2xvc2VyIHRvIHR3bykuICBXaXRoIGEgcG90ZW50aWFsIDEgVUxQIHJvdW5kaW5nCisgICAgICAgICAgIGVycm9yIGZpeGVkLXVwLCBtYXRoLmZzdW0oKSBjYW4gZ3VhcmFudGVlIGNvbW11dGF0aXZpdHkuICovCisgICAgICAgIGlmIChuID4gMCAmJiAoKGxvIDwgMC4wICYmIHBbbi0xXSA8IDAuMCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAobG8gPiAwLjAgJiYgcFtuLTFdID4gMC4wKSkpIHsKKyAgICAgICAgICAgIHkgPSBsbyAqIDIuMDsKKyAgICAgICAgICAgIHggPSBoaSArIHk7CisgICAgICAgICAgICB5ciA9IHggLSBoaTsKKyAgICAgICAgICAgIGlmICh5ID09IHlyKQorICAgICAgICAgICAgICAgIGhpID0geDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdW0gPSBQeUZsb2F0X0Zyb21Eb3VibGUoaGkpOwogCiBfZnN1bV9lcnJvcjoKLQlQeUZQRV9FTkRfUFJPVEVDVChoaSkKLQlQeV9ERUNSRUYoaXRlcik7Ci0JaWYgKHAgIT0gcHMpCi0JCVB5TWVtX0ZyZWUocCk7Ci0JcmV0dXJuIHN1bTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChoaSkKKyAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgaWYgKHAgIT0gcHMpCisgICAgICAgIFB5TWVtX0ZyZWUocCk7CisgICAgcmV0dXJuIHN1bTsKIH0KIAogI3VuZGVmIE5VTV9QQVJUSUFMUwpAQCAtNTg4LDQ2ICs1ODgsNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX2ZhY3RvcmlhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlsb25nIGksIHg7Ci0JUHlPYmplY3QgKnJlc3VsdCwgKmlvYmosICpuZXdyZXN1bHQ7CisgICAgbG9uZyBpLCB4OworICAgIFB5T2JqZWN0ICpyZXN1bHQsICppb2JqLCAqbmV3cmVzdWx0OwogCi0JaWYgKFB5RmxvYXRfQ2hlY2soYXJnKSkgewotCQlkb3VibGUgZHggPSBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCAqKWFyZyk7Ci0JCWlmIChkeCAhPSBmbG9vcihkeCkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAKLQkJCQkiZmFjdG9yaWFsKCkgb25seSBhY2NlcHRzIGludGVncmFsIHZhbHVlcyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKFB5RmxvYXRfQ2hlY2soYXJnKSkgeworICAgICAgICBkb3VibGUgZHggPSBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCAqKWFyZyk7CisgICAgICAgIGlmIChkeCAhPSBmbG9vcihkeCkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJmYWN0b3JpYWwoKSBvbmx5IGFjY2VwdHMgaW50ZWdyYWwgdmFsdWVzIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXggPSBQeUludF9Bc0xvbmcoYXJnKTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoeCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIAotCQkJImZhY3RvcmlhbCgpIG5vdCBkZWZpbmVkIGZvciBuZWdhdGl2ZSB2YWx1ZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHggPSBQeUludF9Bc0xvbmcoYXJnKTsKKyAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoeCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAiZmFjdG9yaWFsKCkgbm90IGRlZmluZWQgZm9yIG5lZ2F0aXZlIHZhbHVlcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXN1bHQgPSAoUHlPYmplY3QgKilQeUludF9Gcm9tTG9uZygxKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaT0xIDsgaTw9eCA7IGkrKykgewotCQlpb2JqID0gKFB5T2JqZWN0ICopUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCWlmIChpb2JqID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQluZXdyZXN1bHQgPSBQeU51bWJlcl9NdWx0aXBseShyZXN1bHQsIGlvYmopOwotCQlQeV9ERUNSRUYoaW9iaik7Ci0JCWlmIChuZXdyZXN1bHQgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBuZXdyZXN1bHQ7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gKFB5T2JqZWN0ICopUHlJbnRfRnJvbUxvbmcoMSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGk9MSA7IGk8PXggOyBpKyspIHsKKyAgICAgICAgaW9iaiA9IChQeU9iamVjdCAqKVB5SW50X0Zyb21Mb25nKGkpOworICAgICAgICBpZiAoaW9iaiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgbmV3cmVzdWx0ID0gUHlOdW1iZXJfTXVsdGlwbHkocmVzdWx0LCBpb2JqKTsKKyAgICAgICAgUHlfREVDUkVGKGlvYmopOworICAgICAgICBpZiAobmV3cmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gbmV3cmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogCiBlcnJvcjoKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfZmFjdG9yaWFsX2RvYywKQEAgLTYzOCw3ICs2MzgsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfdHJ1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpudW1iZXIpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QobnVtYmVyLCAiX190cnVuY19fIiwgTlVMTCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QobnVtYmVyLCAiX190cnVuY19fIiwgTlVMTCk7CiB9CiAKIFB5RG9jX1NUUlZBUihtYXRoX3RydW5jX2RvYywKQEAgLTY0OSwyMSArNjQ5LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9mcmV4cChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlpbnQgaTsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCS8qIGRlYWwgd2l0aCBzcGVjaWFsIGNhc2VzIGRpcmVjdGx5LCB0byBzaWRlc3RlcCBwbGF0Zm9ybQotCSAgIGRpZmZlcmVuY2VzICovCi0JaWYgKFB5X0lTX05BTih4KSB8fCBQeV9JU19JTkZJTklUWSh4KSB8fCAheCkgewotCQlpID0gMDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfZnJleHAiLCByZXR1cm4gMCk7Ci0JCXggPSBmcmV4cCh4LCAmaSk7Ci0JCVB5RlBFX0VORF9QUk9URUNUKHgpOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRpKSIsIHgsIGkpOworICAgIGludCBpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogZGVhbCB3aXRoIHNwZWNpYWwgY2FzZXMgZGlyZWN0bHksIHRvIHNpZGVzdGVwIHBsYXRmb3JtCisgICAgICAgZGlmZmVyZW5jZXMgKi8KKyAgICBpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX0lORklOSVRZKHgpIHx8ICF4KSB7CisgICAgICAgIGkgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF9mcmV4cCIsIHJldHVybiAwKTsKKyAgICAgICAgeCA9IGZyZXhwKHgsICZpKTsKKyAgICAgICAgUHlGUEVfRU5EX1BST1RFQ1QoeCk7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGkpIiwgeCwgaSk7CiB9CiAKIFB5RG9jX1NUUlZBUihtYXRoX2ZyZXhwX2RvYywKQEAgLTY3Niw2NiArNjc2LDY2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9sZGV4cChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIHgsIHI7Ci0JUHlPYmplY3QgKm9leHA7Ci0JbG9uZyBleHA7Ci0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZE86bGRleHAiLCAmeCwgJm9leHApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBkb3VibGUgeCwgcjsKKyAgICBQeU9iamVjdCAqb2V4cDsKKyAgICBsb25nIGV4cDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkTzpsZGV4cCIsICZ4LCAmb2V4cCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5TG9uZ19DaGVjayhvZXhwKSkgewotCQkvKiBvbiBvdmVyZmxvdywgcmVwbGFjZSBleHBvbmVudCB3aXRoIGVpdGhlciBMT05HX01BWAotCQkgICBvciBMT05HX01JTiwgZGVwZW5kaW5nIG9uIHRoZSBzaWduLiAqLwotCQlleHAgPSBQeUxvbmdfQXNMb25nKG9leHApOwotCQlpZiAoZXhwID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKSB7Ci0JCQkJaWYgKFB5X1NJWkUob2V4cCkgPCAwKSB7Ci0JCQkJCWV4cCA9IExPTkdfTUlOOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZXhwID0gTE9OR19NQVg7Ci0JCQkJfQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBwcm9wYWdhdGUgYW55IHVuZXhwZWN0ZWQgZXhjZXB0aW9uICovCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoUHlJbnRfQ2hlY2sob2V4cCkpIHsKLQkJZXhwID0gUHlJbnRfQVNfTE9ORyhvZXhwKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIkV4cGVjdGVkIGFuIGludCBvciBsb25nIGFzIHNlY29uZCBhcmd1bWVudCAiCi0JCQkJInRvIGxkZXhwLiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5TG9uZ19DaGVjayhvZXhwKSkgeworICAgICAgICAvKiBvbiBvdmVyZmxvdywgcmVwbGFjZSBleHBvbmVudCB3aXRoIGVpdGhlciBMT05HX01BWAorICAgICAgICAgICBvciBMT05HX01JTiwgZGVwZW5kaW5nIG9uIHRoZSBzaWduLiAqLworICAgICAgICBleHAgPSBQeUxvbmdfQXNMb25nKG9leHApOworICAgICAgICBpZiAoZXhwID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5X1NJWkUob2V4cCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGV4cCA9IExPTkdfTUlOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwID0gTE9OR19NQVg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBwcm9wYWdhdGUgYW55IHVuZXhwZWN0ZWQgZXhjZXB0aW9uICovCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2sob2V4cCkpIHsKKyAgICAgICAgZXhwID0gUHlJbnRfQVNfTE9ORyhvZXhwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYW4gaW50IG9yIGxvbmcgYXMgc2Vjb25kIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0byBsZGV4cC4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHggPT0gMC4gfHwgIVB5X0lTX0ZJTklURSh4KSkgewotCQkvKiBOYU5zLCB6ZXJvcyBhbmQgaW5maW5pdGllcyBhcmUgcmV0dXJuZWQgdW5jaGFuZ2VkICovCi0JCXIgPSB4OwotCQllcnJubyA9IDA7Ci0JfSBlbHNlIGlmIChleHAgPiBJTlRfTUFYKSB7Ci0JCS8qIG92ZXJmbG93ICovCi0JCXIgPSBjb3B5c2lnbihQeV9IVUdFX1ZBTCwgeCk7Ci0JCWVycm5vID0gRVJBTkdFOwotCX0gZWxzZSBpZiAoZXhwIDwgSU5UX01JTikgewotCQkvKiB1bmRlcmZsb3cgdG8gKy0wICovCi0JCXIgPSBjb3B5c2lnbigwLiwgeCk7Ci0JCWVycm5vID0gMDsKLQl9IGVsc2UgewotCQllcnJubyA9IDA7Ci0JCVB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfbGRleHAiLCByZXR1cm4gMCk7Ci0JCXIgPSBsZGV4cCh4LCAoaW50KWV4cCk7Ci0JCVB5RlBFX0VORF9QUk9URUNUKHIpOwotCQlpZiAoUHlfSVNfSU5GSU5JVFkocikpCi0JCQllcnJubyA9IEVSQU5HRTsKLQl9CisgICAgaWYgKHggPT0gMC4gfHwgIVB5X0lTX0ZJTklURSh4KSkgeworICAgICAgICAvKiBOYU5zLCB6ZXJvcyBhbmQgaW5maW5pdGllcyBhcmUgcmV0dXJuZWQgdW5jaGFuZ2VkICovCisgICAgICAgIHIgPSB4OworICAgICAgICBlcnJubyA9IDA7CisgICAgfSBlbHNlIGlmIChleHAgPiBJTlRfTUFYKSB7CisgICAgICAgIC8qIG92ZXJmbG93ICovCisgICAgICAgIHIgPSBjb3B5c2lnbihQeV9IVUdFX1ZBTCwgeCk7CisgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgIH0gZWxzZSBpZiAoZXhwIDwgSU5UX01JTikgeworICAgICAgICAvKiB1bmRlcmZsb3cgdG8gKy0wICovCisgICAgICAgIHIgPSBjb3B5c2lnbigwLiwgeCk7CisgICAgICAgIGVycm5vID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfbGRleHAiLCByZXR1cm4gMCk7CisgICAgICAgIHIgPSBsZGV4cCh4LCAoaW50KWV4cCk7CisgICAgICAgIFB5RlBFX0VORF9QUk9URUNUKHIpOworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkocikpCisgICAgICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICB9CiAKLQlpZiAoZXJybm8gJiYgaXNfZXJyb3IocikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocik7CisgICAgaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9sZGV4cF9kb2MsCkBAIC03NDUsMjMgKzc0NSwyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfbW9kZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlkb3VibGUgeSwgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCS8qIHNvbWUgcGxhdGZvcm1zIGRvbid0IGRvIHRoZSByaWdodCB0aGluZyBmb3IgTmFOcyBhbmQKLQkgICBpbmZpbml0aWVzLCBzbyB3ZSB0YWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlcyBkaXJlY3RseS4gKi8KLQlpZiAoIVB5X0lTX0ZJTklURSh4KSkgewotCQlpZiAoUHlfSVNfSU5GSU5JVFkoeCkpCi0JCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIGNvcHlzaWduKDAuLCB4KSwgeCk7Ci0JCWVsc2UgaWYgKFB5X0lTX05BTih4KSkKLQkJCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGQpIiwgeCwgeCk7Ci0JfSAgICAgICAgICAKKyAgICBkb3VibGUgeSwgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIHNvbWUgcGxhdGZvcm1zIGRvbid0IGRvIHRoZSByaWdodCB0aGluZyBmb3IgTmFOcyBhbmQKKyAgICAgICBpbmZpbml0aWVzLCBzbyB3ZSB0YWtlIGNhcmUgb2Ygc3BlY2lhbCBjYXNlcyBkaXJlY3RseS4gKi8KKyAgICBpZiAoIVB5X0lTX0ZJTklURSh4KSkgeworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeCkpCisgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIGNvcHlzaWduKDAuLCB4KSwgeCk7CisgICAgICAgIGVsc2UgaWYgKFB5X0lTX05BTih4KSkKKyAgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGQpIiwgeCwgeCk7CisgICAgfQogCi0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImluIG1hdGhfbW9kZiIsIHJldHVybiAwKTsKLQl4ID0gbW9kZih4LCAmeSk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoeCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkZCkiLCB4LCB5KTsKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF9tb2RmIiwgcmV0dXJuIDApOworICAgIHggPSBtb2RmKHgsICZ5KTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVCh4KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGRkKSIsIHgsIHkpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9tb2RmX2RvYywKQEAgLTc4MSw1MyArNzgxLDUzIEBACiBzdGF0aWMgUHlPYmplY3QqCiBsb2doZWxwZXIoUHlPYmplY3QqIGFyZywgZG91YmxlICgqZnVuYykoZG91YmxlKSwgY2hhciAqZnVuY25hbWUpCiB7Ci0JLyogSWYgaXQgaXMgbG9uZywgZG8gaXQgb3Vyc2VsdmVzLiAqLwotCWlmIChQeUxvbmdfQ2hlY2soYXJnKSkgewotCQlkb3VibGUgeDsKLQkJaW50IGU7Ci0JCXggPSBfUHlMb25nX0FzU2NhbGVkRG91YmxlKGFyZywgJmUpOwotCQlpZiAoeCA8PSAwLjApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkibWF0aCBkb21haW4gZXJyb3IiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIFZhbHVlIGlzIH49IHggKiAyKiooZSpQeUxvbmdfU0hJRlQpLCBzbyB0aGUgbG9nIH49Ci0JCSAgIGxvZyh4KSArIGxvZygyKSAqIGUgKiBQeUxvbmdfU0hJRlQuCi0JCSAgIENBVVRJT046ICBlKlB5TG9uZ19TSElGVCBtYXkgb3ZlcmZsb3cgdXNpbmcgaW50IGFyaXRobWV0aWMsCi0JCSAgIHNvIGZvcmNlIHVzZSBvZiBkb3VibGUuICovCi0JCXggPSBmdW5jKHgpICsgKGUgKiAoZG91YmxlKVB5TG9uZ19TSElGVCkgKiBmdW5jKDIuMCk7Ci0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Ci0JfQorICAgIC8qIElmIGl0IGlzIGxvbmcsIGRvIGl0IG91cnNlbHZlcy4gKi8KKyAgICBpZiAoUHlMb25nX0NoZWNrKGFyZykpIHsKKyAgICAgICAgZG91YmxlIHg7CisgICAgICAgIGludCBlOworICAgICAgICB4ID0gX1B5TG9uZ19Bc1NjYWxlZERvdWJsZShhcmcsICZlKTsKKyAgICAgICAgaWYgKHggPD0gMC4wKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0aCBkb21haW4gZXJyb3IiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIFZhbHVlIGlzIH49IHggKiAyKiooZSpQeUxvbmdfU0hJRlQpLCBzbyB0aGUgbG9nIH49CisgICAgICAgICAgIGxvZyh4KSArIGxvZygyKSAqIGUgKiBQeUxvbmdfU0hJRlQuCisgICAgICAgICAgIENBVVRJT046ICBlKlB5TG9uZ19TSElGVCBtYXkgb3ZlcmZsb3cgdXNpbmcgaW50IGFyaXRobWV0aWMsCisgICAgICAgICAgIHNvIGZvcmNlIHVzZSBvZiBkb3VibGUuICovCisgICAgICAgIHggPSBmdW5jKHgpICsgKGUgKiAoZG91YmxlKVB5TG9uZ19TSElGVCkgKiBmdW5jKDIuMCk7CisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgfQogCi0JLyogRWxzZSBsZXQgbGlibSBoYW5kbGUgaXQgYnkgaXRzZWxmLiAqLwotCXJldHVybiBtYXRoXzEoYXJnLCBmdW5jLCAwKTsKKyAgICAvKiBFbHNlIGxldCBsaWJtIGhhbmRsZSBpdCBieSBpdHNlbGYuICovCisgICAgcmV0dXJuIG1hdGhfMShhcmcsIGZ1bmMsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9sb2coUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICphcmc7Ci0JUHlPYmplY3QgKmJhc2UgPSBOVUxMOwotCVB5T2JqZWN0ICpudW0sICpkZW47Ci0JUHlPYmplY3QgKmFuczsKKyAgICBQeU9iamVjdCAqYXJnOworICAgIFB5T2JqZWN0ICpiYXNlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbnVtLCAqZGVuOworICAgIFB5T2JqZWN0ICphbnM7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJsb2ciLCAxLCAyLCAmYXJnLCAmYmFzZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImxvZyIsIDEsIDIsICZhcmcsICZiYXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQludW0gPSBsb2doZWxwZXIoYXJnLCBtX2xvZywgImxvZyIpOwotCWlmIChudW0gPT0gTlVMTCB8fCBiYXNlID09IE5VTEwpCi0JCXJldHVybiBudW07CisgICAgbnVtID0gbG9naGVscGVyKGFyZywgbV9sb2csICJsb2ciKTsKKyAgICBpZiAobnVtID09IE5VTEwgfHwgYmFzZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVtOwogCi0JZGVuID0gbG9naGVscGVyKGJhc2UsIG1fbG9nLCAibG9nIik7Ci0JaWYgKGRlbiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihudW0pOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZGVuID0gbG9naGVscGVyKGJhc2UsIG1fbG9nLCAibG9nIik7CisgICAgaWYgKGRlbiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihudW0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlhbnMgPSBQeU51bWJlcl9EaXZpZGUobnVtLCBkZW4pOwotCVB5X0RFQ1JFRihudW0pOwotCVB5X0RFQ1JFRihkZW4pOwotCXJldHVybiBhbnM7CisgICAgYW5zID0gUHlOdW1iZXJfRGl2aWRlKG51bSwgZGVuKTsKKyAgICBQeV9ERUNSRUYobnVtKTsKKyAgICBQeV9ERUNSRUYoZGVuKTsKKyAgICByZXR1cm4gYW5zOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9sb2dfZG9jLApAQCAtODM4LDcgKzgzOCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9sb2cxMChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlyZXR1cm4gbG9naGVscGVyKGFyZywgbV9sb2cxMCwgImxvZzEwIik7CisgICAgcmV0dXJuIGxvZ2hlbHBlcihhcmcsIG1fbG9nMTAsICJsb2cxMCIpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9sb2cxMF9kb2MsCkBAIC04NDcsMzEgKzg0NywzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfZm1vZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKm94LCAqb3k7Ci0JZG91YmxlIHIsIHgsIHk7Ci0JaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZtb2QiLCAyLCAyLCAmb3gsICZveSkpCi0JCXJldHVybiBOVUxMOwotCXggPSBQeUZsb2F0X0FzRG91YmxlKG94KTsKLQl5ID0gUHlGbG9hdF9Bc0RvdWJsZShveSk7Ci0JaWYgKCh4ID09IC0xLjAgfHwgeSA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBmbW9kKHgsICsvLUluZikgcmV0dXJucyB4IGZvciBmaW5pdGUgeC4gKi8KLQlpZiAoUHlfSVNfSU5GSU5JVFkoeSkgJiYgUHlfSVNfRklOSVRFKHgpKQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX2Ztb2QiLCByZXR1cm4gMCk7Ci0JciA9IGZtb2QoeCwgeSk7Ci0JUHlGUEVfRU5EX1BST1RFQ1Qocik7Ci0JaWYgKFB5X0lTX05BTihyKSkgewotCQlpZiAoIVB5X0lTX05BTih4KSAmJiAhUHlfSVNfTkFOKHkpKQotCQkJZXJybm8gPSBFRE9NOwotCQllbHNlCi0JCQllcnJubyA9IDA7Ci0JfQotCWlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOworICAgIFB5T2JqZWN0ICpveCwgKm95OworICAgIGRvdWJsZSByLCB4LCB5OworICAgIGlmICghIFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJmbW9kIiwgMiwgMiwgJm94LCAmb3kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ID0gUHlGbG9hdF9Bc0RvdWJsZShveCk7CisgICAgeSA9IFB5RmxvYXRfQXNEb3VibGUob3kpOworICAgIGlmICgoeCA9PSAtMS4wIHx8IHkgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogZm1vZCh4LCArLy1JbmYpIHJldHVybnMgeCBmb3IgZmluaXRlIHguICovCisgICAgaWYgKFB5X0lTX0lORklOSVRZKHkpICYmIFB5X0lTX0ZJTklURSh4KSkKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF9mbW9kIiwgcmV0dXJuIDApOworICAgIHIgPSBmbW9kKHgsIHkpOworICAgIFB5RlBFX0VORF9QUk9URUNUKHIpOworICAgIGlmIChQeV9JU19OQU4ocikpIHsKKyAgICAgICAgaWYgKCFQeV9JU19OQU4oeCkgJiYgIVB5X0lTX05BTih5KSkKKyAgICAgICAgICAgIGVycm5vID0gRURPTTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgIH0KKyAgICBpZiAoZXJybm8gJiYgaXNfZXJyb3IocikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfZm1vZF9kb2MsCkBAIC04ODEsMzkgKzg4MSwzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfaHlwb3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpveCwgKm95OwotCWRvdWJsZSByLCB4LCB5OwotCWlmICghIFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoeXBvdCIsIDIsIDIsICZveCwgJm95KSkKLQkJcmV0dXJuIE5VTEw7Ci0JeCA9IFB5RmxvYXRfQXNEb3VibGUob3gpOwotCXkgPSBQeUZsb2F0X0FzRG91YmxlKG95KTsKLQlpZiAoKHggPT0gLTEuMCB8fCB5ID09IC0xLjApICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCS8qIGh5cG90KHgsICsvLUluZikgcmV0dXJucyBJbmYsIGV2ZW4gaWYgeCBpcyBhIE5hTi4gKi8KLQlpZiAoUHlfSVNfSU5GSU5JVFkoeCkpCi0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZmFicyh4KSk7Ci0JaWYgKFB5X0lTX0lORklOSVRZKHkpKQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZhYnMoeSkpOwotCWVycm5vID0gMDsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX2h5cG90IiwgcmV0dXJuIDApOwotCXIgPSBoeXBvdCh4LCB5KTsKLQlQeUZQRV9FTkRfUFJPVEVDVChyKTsKLQlpZiAoUHlfSVNfTkFOKHIpKSB7Ci0JCWlmICghUHlfSVNfTkFOKHgpICYmICFQeV9JU19OQU4oeSkpCi0JCQllcnJubyA9IEVET007Ci0JCWVsc2UKLQkJCWVycm5vID0gMDsKLQl9Ci0JZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkocikpIHsKLQkJaWYgKFB5X0lTX0ZJTklURSh4KSAmJiBQeV9JU19GSU5JVEUoeSkpCi0JCQllcnJubyA9IEVSQU5HRTsKLQkJZWxzZQotCQkJZXJybm8gPSAwOwotCX0KLQlpZiAoZXJybm8gJiYgaXNfZXJyb3IocikpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyKTsKKyAgICBQeU9iamVjdCAqb3gsICpveTsKKyAgICBkb3VibGUgciwgeCwgeTsKKyAgICBpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaHlwb3QiLCAyLCAyLCAmb3gsICZveSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKG94KTsKKyAgICB5ID0gUHlGbG9hdF9Bc0RvdWJsZShveSk7CisgICAgaWYgKCh4ID09IC0xLjAgfHwgeSA9PSAtMS4wKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBoeXBvdCh4LCArLy1JbmYpIHJldHVybnMgSW5mLCBldmVuIGlmIHggaXMgYSBOYU4uICovCisgICAgaWYgKFB5X0lTX0lORklOSVRZKHgpKQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZhYnMoeCkpOworICAgIGlmIChQeV9JU19JTkZJTklUWSh5KSkKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShmYWJzKHkpKTsKKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiaW4gbWF0aF9oeXBvdCIsIHJldHVybiAwKTsKKyAgICByID0gaHlwb3QoeCwgeSk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1Qocik7CisgICAgaWYgKFB5X0lTX05BTihyKSkgeworICAgICAgICBpZiAoIVB5X0lTX05BTih4KSAmJiAhUHlfSVNfTkFOKHkpKQorICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5X0lTX0lORklOSVRZKHIpKSB7CisgICAgICAgIGlmIChQeV9JU19GSU5JVEUoeCkgJiYgUHlfSVNfRklOSVRFKHkpKQorICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICB9CisgICAgaWYgKGVycm5vICYmIGlzX2Vycm9yKHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocik7CiB9CiAKIFB5RG9jX1NUUlZBUihtYXRoX2h5cG90X2RvYywKQEAgLTkyOCw3OSArOTI4LDc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9wb3coUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpveCwgKm95OwotCWRvdWJsZSByLCB4LCB5OwotCWludCBvZGRfeTsKKyAgICBQeU9iamVjdCAqb3gsICpveTsKKyAgICBkb3VibGUgciwgeCwgeTsKKyAgICBpbnQgb2RkX3k7CiAKLQlpZiAoISBQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicG93IiwgMiwgMiwgJm94LCAmb3kpKQotCQlyZXR1cm4gTlVMTDsKLQl4ID0gUHlGbG9hdF9Bc0RvdWJsZShveCk7Ci0JeSA9IFB5RmxvYXRfQXNEb3VibGUob3kpOwotCWlmICgoeCA9PSAtMS4wIHx8IHkgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvdyIsIDIsIDIsICZveCwgJm95KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUob3gpOworICAgIHkgPSBQeUZsb2F0X0FzRG91YmxlKG95KTsKKyAgICBpZiAoKHggPT0gLTEuMCB8fCB5ID09IC0xLjApICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogZGVhbCBkaXJlY3RseSB3aXRoIElFRUUgc3BlY2lhbHMsIHRvIGNvcGUgd2l0aCBwcm9ibGVtcyBvbiB2YXJpb3VzCi0JICAgcGxhdGZvcm1zIHdob3NlIHNlbWFudGljcyBkb24ndCBleGFjdGx5IG1hdGNoIEM5OSAqLwotCXIgPSAwLjsgLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nICovCi0JaWYgKCFQeV9JU19GSU5JVEUoeCkgfHwgIVB5X0lTX0ZJTklURSh5KSkgewotCQllcnJubyA9IDA7Ci0JCWlmIChQeV9JU19OQU4oeCkpCi0JCQlyID0geSA9PSAwLiA/IDEuIDogeDsgLyogTmFOKiowID0gMSAqLwotCQllbHNlIGlmIChQeV9JU19OQU4oeSkpCi0JCQlyID0geCA9PSAxLiA/IDEuIDogeTsgLyogMSoqTmFOID0gMSAqLwotCQllbHNlIGlmIChQeV9JU19JTkZJTklUWSh4KSkgewotCQkJb2RkX3kgPSBQeV9JU19GSU5JVEUoeSkgJiYgZm1vZChmYWJzKHkpLCAyLjApID09IDEuMDsKLQkJCWlmICh5ID4gMC4pCi0JCQkJciA9IG9kZF95ID8geCA6IGZhYnMoeCk7Ci0JCQllbHNlIGlmICh5ID09IDAuKQotCQkJCXIgPSAxLjsKLQkJCWVsc2UgLyogeSA8IDAuICovCi0JCQkJciA9IG9kZF95ID8gY29weXNpZ24oMC4sIHgpIDogMC47Ci0JCX0KLQkJZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkoeSkpIHsKLQkJCWlmIChmYWJzKHgpID09IDEuMCkKLQkJCQlyID0gMS47Ci0JCQllbHNlIGlmICh5ID4gMC4gJiYgZmFicyh4KSA+IDEuMCkKLQkJCQlyID0geTsKLQkJCWVsc2UgaWYgKHkgPCAwLiAmJiBmYWJzKHgpIDwgMS4wKSB7Ci0JCQkJciA9IC15OyAvKiByZXN1bHQgaXMgK2luZiAqLwotCQkJCWlmICh4ID09IDAuKSAvKiAwKiotaW5mOiBkaXZpZGUtYnktemVybyAqLwotCQkJCQllcnJubyA9IEVET007Ci0JCQl9Ci0JCQllbHNlCi0JCQkJciA9IDAuOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBsZXQgbGlibSBoYW5kbGUgZmluaXRlKipmaW5pdGUgKi8KLQkJZXJybm8gPSAwOwotCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX3BvdyIsIHJldHVybiAwKTsKLQkJciA9IHBvdyh4LCB5KTsKLQkJUHlGUEVfRU5EX1BST1RFQ1Qocik7Ci0JCS8qIGEgTmFOIHJlc3VsdCBzaG91bGQgYXJpc2Ugb25seSBmcm9tICgtdmUpKiooZmluaXRlCi0JCSAgIG5vbi1pbnRlZ2VyKTsgaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gcmFpc2UgVmFsdWVFcnJvci4gKi8KLQkJaWYgKCFQeV9JU19GSU5JVEUocikpIHsKLQkJCWlmIChQeV9JU19OQU4ocikpIHsKLQkJCQllcnJubyA9IEVET007Ci0JCQl9Ci0JCQkvKiAKLQkJCSAgIGFuIGluZmluaXRlIHJlc3VsdCBoZXJlIGFyaXNlcyBlaXRoZXIgZnJvbToKLQkJCSAgIChBKSAoKy8tMC4pKipuZWdhdGl2ZSAoLT4gZGl2aWRlLWJ5LXplcm8pCi0JCQkgICAoQikgb3ZlcmZsb3cgb2YgeCoqeSB3aXRoIHggYW5kIHkgZmluaXRlCi0JCQkqLwotCQkJZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkocikpIHsKLQkJCQlpZiAoeCA9PSAwLikKLQkJCQkJZXJybm8gPSBFRE9NOwotCQkJCWVsc2UKLQkJCQkJZXJybm8gPSBFUkFOR0U7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogZGVhbCBkaXJlY3RseSB3aXRoIElFRUUgc3BlY2lhbHMsIHRvIGNvcGUgd2l0aCBwcm9ibGVtcyBvbiB2YXJpb3VzCisgICAgICAgcGxhdGZvcm1zIHdob3NlIHNlbWFudGljcyBkb24ndCBleGFjdGx5IG1hdGNoIEM5OSAqLworICAgIHIgPSAwLjsgLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5nICovCisgICAgaWYgKCFQeV9JU19GSU5JVEUoeCkgfHwgIVB5X0lTX0ZJTklURSh5KSkgeworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGlmIChQeV9JU19OQU4oeCkpCisgICAgICAgICAgICByID0geSA9PSAwLiA/IDEuIDogeDsgLyogTmFOKiowID0gMSAqLworICAgICAgICBlbHNlIGlmIChQeV9JU19OQU4oeSkpCisgICAgICAgICAgICByID0geCA9PSAxLiA/IDEuIDogeTsgLyogMSoqTmFOID0gMSAqLworICAgICAgICBlbHNlIGlmIChQeV9JU19JTkZJTklUWSh4KSkgeworICAgICAgICAgICAgb2RkX3kgPSBQeV9JU19GSU5JVEUoeSkgJiYgZm1vZChmYWJzKHkpLCAyLjApID09IDEuMDsKKyAgICAgICAgICAgIGlmICh5ID4gMC4pCisgICAgICAgICAgICAgICAgciA9IG9kZF95ID8geCA6IGZhYnMoeCk7CisgICAgICAgICAgICBlbHNlIGlmICh5ID09IDAuKQorICAgICAgICAgICAgICAgIHIgPSAxLjsKKyAgICAgICAgICAgIGVsc2UgLyogeSA8IDAuICovCisgICAgICAgICAgICAgICAgciA9IG9kZF95ID8gY29weXNpZ24oMC4sIHgpIDogMC47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlfSVNfSU5GSU5JVFkoeSkpIHsKKyAgICAgICAgICAgIGlmIChmYWJzKHgpID09IDEuMCkKKyAgICAgICAgICAgICAgICByID0gMS47CisgICAgICAgICAgICBlbHNlIGlmICh5ID4gMC4gJiYgZmFicyh4KSA+IDEuMCkKKyAgICAgICAgICAgICAgICByID0geTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHkgPCAwLiAmJiBmYWJzKHgpIDwgMS4wKSB7CisgICAgICAgICAgICAgICAgciA9IC15OyAvKiByZXN1bHQgaXMgK2luZiAqLworICAgICAgICAgICAgICAgIGlmICh4ID09IDAuKSAvKiAwKiotaW5mOiBkaXZpZGUtYnktemVybyAqLworICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgciA9IDAuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBsZXQgbGlibSBoYW5kbGUgZmluaXRlKipmaW5pdGUgKi8KKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJpbiBtYXRoX3BvdyIsIHJldHVybiAwKTsKKyAgICAgICAgciA9IHBvdyh4LCB5KTsKKyAgICAgICAgUHlGUEVfRU5EX1BST1RFQ1Qocik7CisgICAgICAgIC8qIGEgTmFOIHJlc3VsdCBzaG91bGQgYXJpc2Ugb25seSBmcm9tICgtdmUpKiooZmluaXRlCisgICAgICAgICAgIG5vbi1pbnRlZ2VyKTsgaW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gcmFpc2UgVmFsdWVFcnJvci4gKi8KKyAgICAgICAgaWYgKCFQeV9JU19GSU5JVEUocikpIHsKKyAgICAgICAgICAgIGlmIChQeV9JU19OQU4ocikpIHsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgYW4gaW5maW5pdGUgcmVzdWx0IGhlcmUgYXJpc2VzIGVpdGhlciBmcm9tOgorICAgICAgICAgICAgICAgKEEpICgrLy0wLikqKm5lZ2F0aXZlICgtPiBkaXZpZGUtYnktemVybykKKyAgICAgICAgICAgICAgIChCKSBvdmVyZmxvdyBvZiB4Kip5IHdpdGggeCBhbmQgeSBmaW5pdGUKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBlbHNlIGlmIChQeV9JU19JTkZJTklUWShyKSkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IDAuKQorICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVET007CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOworICAgIGlmIChlcnJubyAmJiBpc19lcnJvcihyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHIpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9wb3dfZG9jLApAQCAtMTAxMiwxMCArMTAxMiwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hdGhfZGVncmVlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCAqIHJhZFRvRGVnKTsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCAqIHJhZFRvRGVnKTsKIH0KIAogUHlEb2NfU1RSVkFSKG1hdGhfZGVncmVlc19kb2MsCkBAIC0xMDI1LDEwICsxMDI1LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9yYWRpYW5zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4ICogZGVnVG9SYWQpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4ICogZGVnVG9SYWQpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9yYWRpYW5zX2RvYywKQEAgLTEwMzgsMTAgKzEwMzgsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYXRoX2lzbmFuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19OQU4oeCkpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19OQU4oeCkpOwogfQogCiBQeURvY19TVFJWQVIobWF0aF9pc25hbl9kb2MsCkBAIC0xMDUxLDEwICsxMDUxLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWF0aF9pc2luZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfSU5GSU5JVFkoeCkpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19JTkZJTklUWSh4KSk7CiB9CiAKIFB5RG9jX1NUUlZBUihtYXRoX2lzaW5mX2RvYywKQEAgLTEwNjIsNDIgKzEwNjIsNDIgQEAKIENoZWNrIGlmIGZsb2F0IHggaXMgaW5maW5pdGUgKHBvc2l0aXZlIG9yIG5lZ2F0aXZlKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1hdGhfbWV0aG9kc1tdID0gewotCXsiYWNvcyIsCW1hdGhfYWNvcywJTUVUSF9PLAkJbWF0aF9hY29zX2RvY30sCi0JeyJhY29zaCIsCW1hdGhfYWNvc2gsCU1FVEhfTywJCW1hdGhfYWNvc2hfZG9jfSwKLQl7ImFzaW4iLAltYXRoX2FzaW4sCU1FVEhfTywJCW1hdGhfYXNpbl9kb2N9LAotCXsiYXNpbmgiLAltYXRoX2FzaW5oLAlNRVRIX08sCQltYXRoX2FzaW5oX2RvY30sCi0JeyJhdGFuIiwJbWF0aF9hdGFuLAlNRVRIX08sCQltYXRoX2F0YW5fZG9jfSwKLQl7ImF0YW4yIiwJbWF0aF9hdGFuMiwJTUVUSF9WQVJBUkdTLAltYXRoX2F0YW4yX2RvY30sCi0JeyJhdGFuaCIsCW1hdGhfYXRhbmgsCU1FVEhfTywJCW1hdGhfYXRhbmhfZG9jfSwKLQl7ImNlaWwiLAltYXRoX2NlaWwsCU1FVEhfTywJCW1hdGhfY2VpbF9kb2N9LAotCXsiY29weXNpZ24iLAltYXRoX2NvcHlzaWduLAlNRVRIX1ZBUkFSR1MsCW1hdGhfY29weXNpZ25fZG9jfSwKLQl7ImNvcyIsCQltYXRoX2NvcywJTUVUSF9PLAkJbWF0aF9jb3NfZG9jfSwKLQl7ImNvc2giLAltYXRoX2Nvc2gsCU1FVEhfTywJCW1hdGhfY29zaF9kb2N9LAotCXsiZGVncmVlcyIsCW1hdGhfZGVncmVlcywJTUVUSF9PLAkJbWF0aF9kZWdyZWVzX2RvY30sCi0JeyJleHAiLAkJbWF0aF9leHAsCU1FVEhfTywJCW1hdGhfZXhwX2RvY30sCi0JeyJmYWJzIiwJbWF0aF9mYWJzLAlNRVRIX08sCQltYXRoX2ZhYnNfZG9jfSwKLQl7ImZhY3RvcmlhbCIsCW1hdGhfZmFjdG9yaWFsLAlNRVRIX08sCQltYXRoX2ZhY3RvcmlhbF9kb2N9LAotCXsiZmxvb3IiLAltYXRoX2Zsb29yLAlNRVRIX08sCQltYXRoX2Zsb29yX2RvY30sCi0JeyJmbW9kIiwJbWF0aF9mbW9kLAlNRVRIX1ZBUkFSR1MsCW1hdGhfZm1vZF9kb2N9LAotCXsiZnJleHAiLAltYXRoX2ZyZXhwLAlNRVRIX08sCQltYXRoX2ZyZXhwX2RvY30sCi0JeyJmc3VtIiwJbWF0aF9mc3VtLAlNRVRIX08sCQltYXRoX2ZzdW1fZG9jfSwKLQl7Imh5cG90IiwJbWF0aF9oeXBvdCwJTUVUSF9WQVJBUkdTLAltYXRoX2h5cG90X2RvY30sCi0JeyJpc2luZiIsCW1hdGhfaXNpbmYsCU1FVEhfTywJCW1hdGhfaXNpbmZfZG9jfSwKLQl7ImlzbmFuIiwJbWF0aF9pc25hbiwJTUVUSF9PLAkJbWF0aF9pc25hbl9kb2N9LAotCXsibGRleHAiLAltYXRoX2xkZXhwLAlNRVRIX1ZBUkFSR1MsCW1hdGhfbGRleHBfZG9jfSwKLQl7ImxvZyIsCQltYXRoX2xvZywJTUVUSF9WQVJBUkdTLAltYXRoX2xvZ19kb2N9LAotCXsibG9nMXAiLAltYXRoX2xvZzFwLAlNRVRIX08sCQltYXRoX2xvZzFwX2RvY30sCi0JeyJsb2cxMCIsCW1hdGhfbG9nMTAsCU1FVEhfTywJCW1hdGhfbG9nMTBfZG9jfSwKLQl7Im1vZGYiLAltYXRoX21vZGYsCU1FVEhfTywJCW1hdGhfbW9kZl9kb2N9LAotCXsicG93IiwJCW1hdGhfcG93LAlNRVRIX1ZBUkFSR1MsCW1hdGhfcG93X2RvY30sCi0JeyJyYWRpYW5zIiwJbWF0aF9yYWRpYW5zLAlNRVRIX08sCQltYXRoX3JhZGlhbnNfZG9jfSwKLQl7InNpbiIsCQltYXRoX3NpbiwJTUVUSF9PLAkJbWF0aF9zaW5fZG9jfSwKLQl7InNpbmgiLAltYXRoX3NpbmgsCU1FVEhfTywJCW1hdGhfc2luaF9kb2N9LAotCXsic3FydCIsCW1hdGhfc3FydCwJTUVUSF9PLAkJbWF0aF9zcXJ0X2RvY30sCi0JeyJ0YW4iLAkJbWF0aF90YW4sCU1FVEhfTywJCW1hdGhfdGFuX2RvY30sCi0JeyJ0YW5oIiwJbWF0aF90YW5oLAlNRVRIX08sCQltYXRoX3RhbmhfZG9jfSwKLQl7InRydW5jIiwJbWF0aF90cnVuYywJTUVUSF9PLAkJbWF0aF90cnVuY19kb2N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJhY29zIiwgICAgICAgICAgICBtYXRoX2Fjb3MsICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfYWNvc19kb2N9LAorICAgIHsiYWNvc2giLCAgICAgICAgICAgbWF0aF9hY29zaCwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2Fjb3NoX2RvY30sCisgICAgeyJhc2luIiwgICAgICAgICAgICBtYXRoX2FzaW4sICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfYXNpbl9kb2N9LAorICAgIHsiYXNpbmgiLCAgICAgICAgICAgbWF0aF9hc2luaCwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2FzaW5oX2RvY30sCisgICAgeyJhdGFuIiwgICAgICAgICAgICBtYXRoX2F0YW4sICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfYXRhbl9kb2N9LAorICAgIHsiYXRhbjIiLCAgICAgICAgICAgbWF0aF9hdGFuMiwgICAgIE1FVEhfVkFSQVJHUywgICBtYXRoX2F0YW4yX2RvY30sCisgICAgeyJhdGFuaCIsICAgICAgICAgICBtYXRoX2F0YW5oLCAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfYXRhbmhfZG9jfSwKKyAgICB7ImNlaWwiLCAgICAgICAgICAgIG1hdGhfY2VpbCwgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9jZWlsX2RvY30sCisgICAgeyJjb3B5c2lnbiIsICAgICAgICBtYXRoX2NvcHlzaWduLCAgTUVUSF9WQVJBUkdTLCAgIG1hdGhfY29weXNpZ25fZG9jfSwKKyAgICB7ImNvcyIsICAgICAgICAgICAgIG1hdGhfY29zLCAgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9jb3NfZG9jfSwKKyAgICB7ImNvc2giLCAgICAgICAgICAgIG1hdGhfY29zaCwgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9jb3NoX2RvY30sCisgICAgeyJkZWdyZWVzIiwgICAgICAgICBtYXRoX2RlZ3JlZXMsICAgTUVUSF9PLCAgICAgICAgIG1hdGhfZGVncmVlc19kb2N9LAorICAgIHsiZXhwIiwgICAgICAgICAgICAgbWF0aF9leHAsICAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2V4cF9kb2N9LAorICAgIHsiZmFicyIsICAgICAgICAgICAgbWF0aF9mYWJzLCAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2ZhYnNfZG9jfSwKKyAgICB7ImZhY3RvcmlhbCIsICAgICAgIG1hdGhfZmFjdG9yaWFsLCBNRVRIX08sICAgICAgICAgbWF0aF9mYWN0b3JpYWxfZG9jfSwKKyAgICB7ImZsb29yIiwgICAgICAgICAgIG1hdGhfZmxvb3IsICAgICBNRVRIX08sICAgICAgICAgbWF0aF9mbG9vcl9kb2N9LAorICAgIHsiZm1vZCIsICAgICAgICAgICAgbWF0aF9mbW9kLCAgICAgIE1FVEhfVkFSQVJHUywgICBtYXRoX2Ztb2RfZG9jfSwKKyAgICB7ImZyZXhwIiwgICAgICAgICAgIG1hdGhfZnJleHAsICAgICBNRVRIX08sICAgICAgICAgbWF0aF9mcmV4cF9kb2N9LAorICAgIHsiZnN1bSIsICAgICAgICAgICAgbWF0aF9mc3VtLCAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2ZzdW1fZG9jfSwKKyAgICB7Imh5cG90IiwgICAgICAgICAgIG1hdGhfaHlwb3QsICAgICBNRVRIX1ZBUkFSR1MsICAgbWF0aF9oeXBvdF9kb2N9LAorICAgIHsiaXNpbmYiLCAgICAgICAgICAgbWF0aF9pc2luZiwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2lzaW5mX2RvY30sCisgICAgeyJpc25hbiIsICAgICAgICAgICBtYXRoX2lzbmFuLCAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfaXNuYW5fZG9jfSwKKyAgICB7ImxkZXhwIiwgICAgICAgICAgIG1hdGhfbGRleHAsICAgICBNRVRIX1ZBUkFSR1MsICAgbWF0aF9sZGV4cF9kb2N9LAorICAgIHsibG9nIiwgICAgICAgICAgICAgbWF0aF9sb2csICAgICAgIE1FVEhfVkFSQVJHUywgICBtYXRoX2xvZ19kb2N9LAorICAgIHsibG9nMXAiLCAgICAgICAgICAgbWF0aF9sb2cxcCwgICAgIE1FVEhfTywgICAgICAgICBtYXRoX2xvZzFwX2RvY30sCisgICAgeyJsb2cxMCIsICAgICAgICAgICBtYXRoX2xvZzEwLCAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfbG9nMTBfZG9jfSwKKyAgICB7Im1vZGYiLCAgICAgICAgICAgIG1hdGhfbW9kZiwgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9tb2RmX2RvY30sCisgICAgeyJwb3ciLCAgICAgICAgICAgICBtYXRoX3BvdywgICAgICAgTUVUSF9WQVJBUkdTLCAgIG1hdGhfcG93X2RvY30sCisgICAgeyJyYWRpYW5zIiwgICAgICAgICBtYXRoX3JhZGlhbnMsICAgTUVUSF9PLCAgICAgICAgIG1hdGhfcmFkaWFuc19kb2N9LAorICAgIHsic2luIiwgICAgICAgICAgICAgbWF0aF9zaW4sICAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX3Npbl9kb2N9LAorICAgIHsic2luaCIsICAgICAgICAgICAgbWF0aF9zaW5oLCAgICAgIE1FVEhfTywgICAgICAgICBtYXRoX3NpbmhfZG9jfSwKKyAgICB7InNxcnQiLCAgICAgICAgICAgIG1hdGhfc3FydCwgICAgICBNRVRIX08sICAgICAgICAgbWF0aF9zcXJ0X2RvY30sCisgICAgeyJ0YW4iLCAgICAgICAgICAgICBtYXRoX3RhbiwgICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfdGFuX2RvY30sCisgICAgeyJ0YW5oIiwgICAgICAgICAgICBtYXRoX3RhbmgsICAgICAgTUVUSF9PLCAgICAgICAgIG1hdGhfdGFuaF9kb2N9LAorICAgIHsidHJ1bmMiLCAgICAgICAgICAgbWF0aF90cnVuYywgICAgIE1FVEhfTywgICAgICAgICBtYXRoX3RydW5jX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtMTEwOCwxNSArMTEwOCwxNSBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRtYXRoKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQltID0gUHlfSW5pdE1vZHVsZTMoIm1hdGgiLCBtYXRoX21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCWdvdG8gZmluYWxseTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIm1hdGgiLCBtYXRoX21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAicGkiLCBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9QSSkpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZSIsIFB5RmxvYXRfRnJvbURvdWJsZShQeV9NQVRIX0UpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInBpIiwgUHlGbG9hdF9Gcm9tRG91YmxlKFB5X01BVEhfUEkpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImUiLCBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTUFUSF9FKSk7CiAKICAgICBmaW5hbGx5OgotCXJldHVybjsKKyAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21kNS5jIGIvTW9kdWxlcy9tZDUuYwppbmRleCAwZTEwNThmLi45ODJmZDdmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL21kNS5jCisrKyBiL01vZHVsZXMvbWQ1LmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogICBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IEFsZ29yaXRobSBkZWZpbmVkIGluIFJGQyAxMzIxLCB3aG9zZQogICB0ZXh0IGlzIGF2YWlsYWJsZSBhdAotCWh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0CisgICAgICAgIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzEzMjEudHh0CiAgIFRoZSBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgdGV4dCBvZiB0aGUgUkZDLCBpbmNsdWRpbmcgdGhlIHRlc3Qgc3VpdGUKICAgKHNlY3Rpb24gQS41KSBidXQgZXhjbHVkaW5nIHRoZSByZXN0IG9mIEFwcGVuZGl4IEEuICBJdCBkb2VzIG5vdCBpbmNsdWRlCiAgIGFueSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdGhhdCBpcyBpZGVudGlmaWVkIGluIHRoZSBSRkMgYXMgYmVpbmcKQEAgLTM4LDE0ICszOCwxNCBAQAogICB0aGF0IGZvbGxvd3MgKGluIHJldmVyc2UgY2hyb25vbG9naWNhbCBvcmRlcik6CiAKICAgMjAwMi0wNC0xMyBscGQgQ2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsgbm93IGhhbmRsZXMgYnl0ZSBvcmRlcgotCWVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5OyBhZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdHJpbmcuaD4KLQlpbiBsaWJyYXJ5LgorICAgICAgICBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseTsgYWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RyaW5nLmg+CisgICAgICAgIGluIGxpYnJhcnkuCiAgIDIwMDItMDMtMTEgbHBkIENvcnJlY3RlZCBhcmd1bWVudCBsaXN0IGZvciBtYWluKCksIGFuZCBhZGRlZCBpbnQgcmV0dXJuCi0JdHlwZSwgaW4gdGVzdCBwcm9ncmFtIGFuZCBUIHZhbHVlIHByb2dyYW0uCisgICAgICAgIHR5cGUsIGluIHRlc3QgcHJvZ3JhbSBhbmQgVCB2YWx1ZSBwcm9ncmFtLgogICAyMDAyLTAyLTIxIGxwZCBBZGRlZCBtaXNzaW5nICNpbmNsdWRlIDxzdGRpby5oPiBpbiB0ZXN0IHByb2dyYW0uCiAgIDIwMDAtMDctMDMgbHBkIFBhdGNoZWQgdG8gZWxpbWluYXRlIHdhcm5pbmdzIGFib3V0ICJjb25zdGFudCBpcwotCXVuc2lnbmVkIGluIEFOU0kgQywgc2lnbmVkIGluIHRyYWRpdGlvbmFsIjsgbWFkZSB0ZXN0IHByb2dyYW0KLQlzZWxmLWNoZWNraW5nLgorICAgICAgICB1bnNpZ25lZCBpbiBBTlNJIEMsIHNpZ25lZCBpbiB0cmFkaXRpb25hbCI7IG1hZGUgdGVzdCBwcm9ncmFtCisgICAgICAgIHNlbGYtY2hlY2tpbmcuCiAgIDE5OTktMTEtMDQgbHBkIEVkaXRlZCBjb21tZW50cyBzbGlnaHRseSBmb3IgYXV0b21hdGljIFRPQyBleHRyYWN0aW9uLgogICAxOTk5LTEwLTE4IGxwZCBGaXhlZCB0eXBvIGluIGhlYWRlciBjb21tZW50IChhbnNpMmtuciByYXRoZXIgdGhhbiBtZDUpLgogICAxOTk5LTA1LTAzIGxwZCBPcmlnaW5hbCB2ZXJzaW9uLgpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogCi0jdW5kZWYgQllURV9PUkRFUgkvKiAxID0gYmlnLWVuZGlhbiwgLTEgPSBsaXR0bGUtZW5kaWFuLCAwID0gdW5rbm93biAqLworI3VuZGVmIEJZVEVfT1JERVIgICAgICAgLyogMSA9IGJpZy1lbmRpYW4sIC0xID0gbGl0dGxlLWVuZGlhbiwgMCA9IHVua25vd24gKi8KICNpZmRlZiBBUkNIX0lTX0JJR19FTkRJQU4KICMgIGRlZmluZSBCWVRFX09SREVSIChBUkNIX0lTX0JJR19FTkRJQU4gPyAxIDogLTEpCiAjZWxzZQpAQCAtMTMzLDggKzEzMyw4IEBACiBtZDVfcHJvY2VzcyhtZDVfc3RhdGVfdCAqcG1zLCBjb25zdCBtZDVfYnl0ZV90ICpkYXRhIC8qWzY0XSovKQogewogICAgIG1kNV93b3JkX3QKLQlhID0gcG1zLT5hYmNkWzBdLCBiID0gcG1zLT5hYmNkWzFdLAotCWMgPSBwbXMtPmFiY2RbMl0sIGQgPSBwbXMtPmFiY2RbM107CisgICAgICAgIGEgPSBwbXMtPmFiY2RbMF0sIGIgPSBwbXMtPmFiY2RbMV0sCisgICAgICAgIGMgPSBwbXMtPmFiY2RbMl0sIGQgPSBwbXMtPmFiY2RbM107CiAgICAgbWQ1X3dvcmRfdCB0OwogI2lmIEJZVEVfT1JERVIgPiAwCiAgICAgLyogRGVmaW5lIHN0b3JhZ2Ugb25seSBmb3IgYmlnLWVuZGlhbiBDUFVzLiAqLwpAQCAtMTQ3LDUxICsxNDcsNTEgQEAKIAogICAgIHsKICNpZiBCWVRFX09SREVSID09IDAKLQkvKgotCSAqIERldGVybWluZSBkeW5hbWljYWxseSB3aGV0aGVyIHRoaXMgaXMgYSBiaWctZW5kaWFuIG9yCi0JICogbGl0dGxlLWVuZGlhbiBtYWNoaW5lLCBzaW5jZSB3ZSBjYW4gdXNlIGEgbW9yZSBlZmZpY2llbnQKLQkgKiBhbGdvcml0aG0gb24gdGhlIGxhdHRlci4KLQkgKi8KLQlzdGF0aWMgY29uc3QgaW50IHcgPSAxOworICAgICAgICAvKgorICAgICAgICAgKiBEZXRlcm1pbmUgZHluYW1pY2FsbHkgd2hldGhlciB0aGlzIGlzIGEgYmlnLWVuZGlhbiBvcgorICAgICAgICAgKiBsaXR0bGUtZW5kaWFuIG1hY2hpbmUsIHNpbmNlIHdlIGNhbiB1c2UgYSBtb3JlIGVmZmljaWVudAorICAgICAgICAgKiBhbGdvcml0aG0gb24gdGhlIGxhdHRlci4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgdyA9IDE7CiAKLQlpZiAoKigoY29uc3QgbWQ1X2J5dGVfdCAqKSZ3KSkgLyogZHluYW1pYyBsaXR0bGUtZW5kaWFuICovCisgICAgICAgIGlmICgqKChjb25zdCBtZDVfYnl0ZV90ICopJncpKSAvKiBkeW5hbWljIGxpdHRsZS1lbmRpYW4gKi8KICNlbmRpZgotI2lmIEJZVEVfT1JERVIgPD0gMAkJLyogbGl0dGxlLWVuZGlhbiAqLwotCXsKLQkgICAgLyoKLQkgICAgICogT24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgd2UgY2FuIHByb2Nlc3MgcHJvcGVybHkgYWxpZ25lZAotCSAgICAgKiBkYXRhIHdpdGhvdXQgY29weWluZyBpdC4KLQkgICAgICovCi0JICAgIGlmICghKChkYXRhIC0gKGNvbnN0IG1kNV9ieXRlX3QgKikwKSAmIDMpKSB7Ci0JCS8qIGRhdGEgYXJlIHByb3Blcmx5IGFsaWduZWQgKi8KLQkJWCA9IChjb25zdCBtZDVfd29yZF90ICopZGF0YTsKLQkgICAgfSBlbHNlIHsKLQkJLyogbm90IGFsaWduZWQgKi8KLQkJbWVtY3B5KHhidWYsIGRhdGEsIDY0KTsKLQkJWCA9IHhidWY7Ci0JICAgIH0KLQl9CisjaWYgQllURV9PUkRFUiA8PSAwICAgICAgICAgICAgIC8qIGxpdHRsZS1lbmRpYW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIE9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHdlIGNhbiBwcm9jZXNzIHByb3Blcmx5IGFsaWduZWQKKyAgICAgICAgICAgICAqIGRhdGEgd2l0aG91dCBjb3B5aW5nIGl0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoISgoZGF0YSAtIChjb25zdCBtZDVfYnl0ZV90ICopMCkgJiAzKSkgeworICAgICAgICAgICAgICAgIC8qIGRhdGEgYXJlIHByb3Blcmx5IGFsaWduZWQgKi8KKyAgICAgICAgICAgICAgICBYID0gKGNvbnN0IG1kNV93b3JkX3QgKilkYXRhOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBub3QgYWxpZ25lZCAqLworICAgICAgICAgICAgICAgIG1lbWNweSh4YnVmLCBkYXRhLCA2NCk7CisgICAgICAgICAgICAgICAgWCA9IHhidWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbmRpZgogI2lmIEJZVEVfT1JERVIgPT0gMAotCWVsc2UJCQkvKiBkeW5hbWljIGJpZy1lbmRpYW4gKi8KKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBiaWctZW5kaWFuICovCiAjZW5kaWYKLSNpZiBCWVRFX09SREVSID49IDAJCS8qIGJpZy1lbmRpYW4gKi8KLQl7Ci0JICAgIC8qCi0JICAgICAqIE9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIHdlIG11c3QgYXJyYW5nZSB0aGUgYnl0ZXMgaW4gdGhlCi0JICAgICAqIHJpZ2h0IG9yZGVyLgotCSAgICAgKi8KLQkgICAgY29uc3QgbWQ1X2J5dGVfdCAqeHAgPSBkYXRhOwotCSAgICBpbnQgaTsKKyNpZiBCWVRFX09SREVSID49IDAgICAgICAgICAgICAgLyogYmlnLWVuZGlhbiAqLworICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogT24gYmlnLWVuZGlhbiBtYWNoaW5lcywgd2UgbXVzdCBhcnJhbmdlIHRoZSBieXRlcyBpbiB0aGUKKyAgICAgICAgICAgICAqIHJpZ2h0IG9yZGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjb25zdCBtZDVfYnl0ZV90ICp4cCA9IGRhdGE7CisgICAgICAgICAgICBpbnQgaTsKIAogIyAgaWYgQllURV9PUkRFUiA9PSAwCi0JICAgIFggPSB4YnVmOwkJLyogKGR5bmFtaWMgb25seSkgKi8KKyAgICAgICAgICAgIFggPSB4YnVmOyAgICAgICAgICAgLyogKGR5bmFtaWMgb25seSkgKi8KICMgIGVsc2UKLSMgICAgZGVmaW5lIHhidWYgWAkJLyogKHN0YXRpYyBvbmx5KSAqLworIyAgICBkZWZpbmUgeGJ1ZiBYICAgICAgICAgICAgICAvKiAoc3RhdGljIG9ubHkpICovCiAjICBlbmRpZgotCSAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSwgeHAgKz0gNCkKLQkJeGJ1ZltpXSA9IHhwWzBdICsgKHhwWzFdIDw8IDgpICsgKHhwWzJdIDw8IDE2KSArICh4cFszXSA8PCAyNCk7Ci0JfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2ksIHhwICs9IDQpCisgICAgICAgICAgICAgICAgeGJ1ZltpXSA9IHhwWzBdICsgKHhwWzFdIDw8IDgpICsgKHhwWzJdIDw8IDE2KSArICh4cFszXSA8PCAyNCk7CisgICAgICAgIH0KICNlbmRpZgogICAgIH0KIApAQCAtMzI5LDcgKzMyOSw3IEBACiAgICAgbWQ1X3dvcmRfdCBuYml0cyA9IChtZDVfd29yZF90KShuYnl0ZXMgPDwgMyk7CiAKICAgICBpZiAobmJ5dGVzIDw9IDApCi0JcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICAvKiB0aGlzIHNwZWNpYWwgY2FzZSBpcyBoYW5kbGVkIHJlY3Vyc2l2ZWx5ICovCiAgICAgaWYgKG5ieXRlcyA+IElOVF9NQVggLSBvZmZzZXQpIHsKQEAgLTMzOSw3ICszMzksNyBAQAogICAgICAgICBvdmVybGFwID0gNjQgLSBvZmZzZXQ7CiAKICAgICAgICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEsIG92ZXJsYXApOwotICAgICAgICBtZDVfYXBwZW5kKHBtcywgZGF0YSArIG92ZXJsYXAsIG5ieXRlcyAtIG92ZXJsYXApOyAKKyAgICAgICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEgKyBvdmVybGFwLCBuYnl0ZXMgLSBvdmVybGFwKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMzQ3LDQ4ICszNDcsNDggQEAKICAgICBwbXMtPmNvdW50WzFdICs9IG5ieXRlcyA+PiAyOTsKICAgICBwbXMtPmNvdW50WzBdICs9IG5iaXRzOwogICAgIGlmIChwbXMtPmNvdW50WzBdIDwgbmJpdHMpCi0JcG1zLT5jb3VudFsxXSsrOworICAgICAgICBwbXMtPmNvdW50WzFdKys7CiAKICAgICAvKiBQcm9jZXNzIGFuIGluaXRpYWwgcGFydGlhbCBibG9jay4gKi8KICAgICBpZiAob2Zmc2V0KSB7Ci0JaW50IGNvcHkgPSAob2Zmc2V0ICsgbmJ5dGVzID4gNjQgPyA2NCAtIG9mZnNldCA6IG5ieXRlcyk7CisgICAgICAgIGludCBjb3B5ID0gKG9mZnNldCArIG5ieXRlcyA+IDY0ID8gNjQgLSBvZmZzZXQgOiBuYnl0ZXMpOwogCi0JbWVtY3B5KHBtcy0+YnVmICsgb2Zmc2V0LCBwLCBjb3B5KTsKLQlpZiAob2Zmc2V0ICsgY29weSA8IDY0KQotCSAgICByZXR1cm47Ci0JcCArPSBjb3B5OwotCWxlZnQgLT0gY29weTsKLQltZDVfcHJvY2VzcyhwbXMsIHBtcy0+YnVmKTsKKyAgICAgICAgbWVtY3B5KHBtcy0+YnVmICsgb2Zmc2V0LCBwLCBjb3B5KTsKKyAgICAgICAgaWYgKG9mZnNldCArIGNvcHkgPCA2NCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcCArPSBjb3B5OworICAgICAgICBsZWZ0IC09IGNvcHk7CisgICAgICAgIG1kNV9wcm9jZXNzKHBtcywgcG1zLT5idWYpOwogICAgIH0KIAogICAgIC8qIFByb2Nlc3MgZnVsbCBibG9ja3MuICovCiAgICAgZm9yICg7IGxlZnQgPj0gNjQ7IHAgKz0gNjQsIGxlZnQgLT0gNjQpCi0JbWQ1X3Byb2Nlc3MocG1zLCBwKTsKKyAgICAgICAgbWQ1X3Byb2Nlc3MocG1zLCBwKTsKIAogICAgIC8qIFByb2Nlc3MgYSBmaW5hbCBwYXJ0aWFsIGJsb2NrLiAqLwogICAgIGlmIChsZWZ0KQotCW1lbWNweShwbXMtPmJ1ZiwgcCwgbGVmdCk7CisgICAgICAgIG1lbWNweShwbXMtPmJ1ZiwgcCwgbGVmdCk7CiB9CiAKIHZvaWQKIG1kNV9maW5pc2gobWQ1X3N0YXRlX3QgKnBtcywgbWQ1X2J5dGVfdCBkaWdlc3RbMTZdKQogewogICAgIHN0YXRpYyBjb25zdCBtZDVfYnl0ZV90IHBhZFs2NF0gPSB7Ci0JMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorICAgICAgICAweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCiAgICAgfTsKICAgICBtZDVfYnl0ZV90IGRhdGFbOF07CiAgICAgaW50IGk7CiAKICAgICAvKiBTYXZlIHRoZSBsZW5ndGggYmVmb3JlIHBhZGRpbmcuICovCiAgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKLQlkYXRhW2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+Y291bnRbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7CisgICAgICAgIGRhdGFbaV0gPSAobWQ1X2J5dGVfdCkocG1zLT5jb3VudFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKICAgICAvKiBQYWQgdG8gNTYgYnl0ZXMgbW9kIDY0LiAqLwogICAgIG1kNV9hcHBlbmQocG1zLCBwYWQsICgoNTUgLSAocG1zLT5jb3VudFswXSA+PiAzKSkgJiA2MykgKyAxKTsKICAgICAvKiBBcHBlbmQgdGhlIGxlbmd0aC4gKi8KICAgICBtZDVfYXBwZW5kKHBtcywgZGF0YSwgOCk7CiAgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCi0JZGlnZXN0W2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+YWJjZFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKKyAgICAgICAgZGlnZXN0W2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+YWJjZFtpID4+IDJdID4+ICgoaSAmIDMpIDw8IDMpKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvbWQ1bW9kdWxlLmMgYi9Nb2R1bGVzL21kNW1vZHVsZS5jCmluZGV4IDFlMmU2ZTMuLmNlOTRmYjUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWQ1bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9tZDVtb2R1bGUuYwpAQCAtMTQsMjUgKzE0LDI1IEBACiAjaW5jbHVkZSAibWQ1LmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0gICAgICAgIG1kNV9zdGF0ZV90CW1kNTsJCS8qIHRoZSBjb250ZXh0IGhvbGRlciAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBtZDVfc3RhdGVfdCAgICAgICAgIG1kNTsgICAgICAgICAgICAvKiB0aGUgY29udGV4dCBob2xkZXIgKi8KIH0gbWQ1b2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE1ENXR5cGU7CiAKLSNkZWZpbmUgaXNfbWQ1b2JqZWN0KHYpCQkoKHYpLT5vYl90eXBlID09ICZNRDV0eXBlKQorI2RlZmluZSBpc19tZDVvYmplY3QodikgICAgICAgICAoKHYpLT5vYl90eXBlID09ICZNRDV0eXBlKQogCiBzdGF0aWMgbWQ1b2JqZWN0ICoKIG5ld21kNW9iamVjdCh2b2lkKQogewotCW1kNW9iamVjdCAqbWQ1cDsKKyAgICBtZDVvYmplY3QgKm1kNXA7CiAKLQltZDVwID0gUHlPYmplY3RfTmV3KG1kNW9iamVjdCwgJk1ENXR5cGUpOwotCWlmIChtZDVwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG1kNXAgPSBQeU9iamVjdF9OZXcobWQ1b2JqZWN0LCAmTUQ1dHlwZSk7CisgICAgaWYgKG1kNXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQltZDVfaW5pdCgmbWQ1cC0+bWQ1KTsJLyogYWN0dWFsIGluaXRpYWxpc2F0aW9uICovCi0JcmV0dXJuIG1kNXA7CisgICAgbWQ1X2luaXQoJm1kNXAtPm1kNSk7ICAgICAgIC8qIGFjdHVhbCBpbml0aWFsaXNhdGlvbiAqLworICAgIHJldHVybiBtZDVwOwogfQogCiAKQEAgLTQxLDcgKzQxLDcgQEAKIHN0YXRpYyB2b2lkCiBtZDVfZGVhbGxvYyhtZDVvYmplY3QgKm1kNXApCiB7Ci0JUHlPYmplY3RfRGVsKG1kNXApOworICAgIFB5T2JqZWN0X0RlbChtZDVwKTsKIH0KIAogCkBAIC01MCwxNiArNTAsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZDVfdXBkYXRlKG1kNW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JdW5zaWduZWQgY2hhciAqY3A7Ci0JaW50IGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpjcDsKKyAgICBpbnQgbGVuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp1cGRhdGUiLCAmY3AsICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOnVwZGF0ZSIsICZjcCwgJmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbWQ1X2FwcGVuZCgmc2VsZi0+bWQ1LCBjcCwgbGVuKTsKKyAgICBtZDVfYXBwZW5kKCZzZWxmLT5tZDUsIGNwLCBsZW4pOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHVwZGF0ZV9kb2MsCkBAIC03MywxNCArNzMsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZDVfZGlnZXN0KG1kNW9iamVjdCAqc2VsZikKIHsKLSAJbWQ1X3N0YXRlX3QgbWRDb250ZXh0OwotCXVuc2lnbmVkIGNoYXIgYURpZ2VzdFsxNl07CisgICAgbWQ1X3N0YXRlX3QgbWRDb250ZXh0OworICAgIHVuc2lnbmVkIGNoYXIgYURpZ2VzdFsxNl07CiAKLQkvKiBtYWtlIGEgdGVtcG9yYXJ5IGNvcHksIGFuZCBwZXJmb3JtIHRoZSBmaW5hbCAqLwotCW1kQ29udGV4dCA9IHNlbGYtPm1kNTsKLQltZDVfZmluaXNoKCZtZENvbnRleHQsIGFEaWdlc3QpOworICAgIC8qIG1ha2UgYSB0ZW1wb3JhcnkgY29weSwgYW5kIHBlcmZvcm0gdGhlIGZpbmFsICovCisgICAgbWRDb250ZXh0ID0gc2VsZi0+bWQ1OworICAgIG1kNV9maW5pc2goJm1kQ29udGV4dCwgYURpZ2VzdCk7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilhRGlnZXN0LCAxNik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopYURpZ2VzdCwgMTYpOwogfQogCiBQeURvY19TVFJWQVIoZGlnZXN0X2RvYywKQEAgLTk0LDI2ICs5NCwyNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1kNV9oZXhkaWdlc3QobWQ1b2JqZWN0ICpzZWxmKQogewotIAltZDVfc3RhdGVfdCBtZENvbnRleHQ7Ci0JdW5zaWduZWQgY2hhciBkaWdlc3RbMTZdOwotCXVuc2lnbmVkIGNoYXIgaGV4ZGlnZXN0WzMyXTsKLQlpbnQgaSwgajsKKyAgICBtZDVfc3RhdGVfdCBtZENvbnRleHQ7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMTZdOworICAgIHVuc2lnbmVkIGNoYXIgaGV4ZGlnZXN0WzMyXTsKKyAgICBpbnQgaSwgajsKIAotCS8qIG1ha2UgYSB0ZW1wb3JhcnkgY29weSwgYW5kIHBlcmZvcm0gdGhlIGZpbmFsICovCi0JbWRDb250ZXh0ID0gc2VsZi0+bWQ1OwotCW1kNV9maW5pc2goJm1kQ29udGV4dCwgZGlnZXN0KTsKKyAgICAvKiBtYWtlIGEgdGVtcG9yYXJ5IGNvcHksIGFuZCBwZXJmb3JtIHRoZSBmaW5hbCAqLworICAgIG1kQ29udGV4dCA9IHNlbGYtPm1kNTsKKyAgICBtZDVfZmluaXNoKCZtZENvbnRleHQsIGRpZ2VzdCk7CiAKLQkvKiBNYWtlIGhleCB2ZXJzaW9uIG9mIHRoZSBkaWdlc3QgKi8KLQlmb3IoaT1qPTA7IGk8MTY7IGkrKykgewotCQljaGFyIGM7Ci0JCWMgPSAoZGlnZXN0W2ldID4+IDQpICYgMHhmOwotCQljID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7Ci0JCWhleGRpZ2VzdFtqKytdID0gYzsKLQkJYyA9IChkaWdlc3RbaV0gJiAweGYpOwotCQljID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7Ci0JCWhleGRpZ2VzdFtqKytdID0gYzsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKiloZXhkaWdlc3QsIDMyKTsKKyAgICAvKiBNYWtlIGhleCB2ZXJzaW9uIG9mIHRoZSBkaWdlc3QgKi8KKyAgICBmb3IoaT1qPTA7IGk8MTY7IGkrKykgeworICAgICAgICBjaGFyIGM7CisgICAgICAgIGMgPSAoZGlnZXN0W2ldID4+IDQpICYgMHhmOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CisgICAgICAgIGhleGRpZ2VzdFtqKytdID0gYzsKKyAgICAgICAgYyA9IChkaWdlc3RbaV0gJiAweGYpOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CisgICAgICAgIGhleGRpZ2VzdFtqKytdID0gYzsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKiloZXhkaWdlc3QsIDMyKTsKIH0KIAogCkBAIC0xMjYsMTQgKzEyNiwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1kNV9jb3B5KG1kNW9iamVjdCAqc2VsZikKIHsKLQltZDVvYmplY3QgKm1kNXA7CisgICAgbWQ1b2JqZWN0ICptZDVwOwogCi0JaWYgKChtZDVwID0gbmV3bWQ1b2JqZWN0KCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgobWQ1cCA9IG5ld21kNW9iamVjdCgpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1kNXAtPm1kNSA9IHNlbGYtPm1kNTsKKyAgICBtZDVwLT5tZDUgPSBzZWxmLT5tZDU7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopbWQ1cDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbWQ1cDsKIH0KIAogUHlEb2NfU1RSVkFSKGNvcHlfZG9jLApAQCAtMTQzLDExICsxNDMsMTEgQEAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYgbWQ1X21ldGhvZHNbXSA9IHsKLQl7InVwZGF0ZSIsICAgIChQeUNGdW5jdGlvbiltZDVfdXBkYXRlLCAgICBNRVRIX1ZBUkFSR1MsIHVwZGF0ZV9kb2N9LAotCXsiZGlnZXN0IiwgICAgKFB5Q0Z1bmN0aW9uKW1kNV9kaWdlc3QsICAgIE1FVEhfTk9BUkdTLCAgZGlnZXN0X2RvY30sCi0JeyJoZXhkaWdlc3QiLCAoUHlDRnVuY3Rpb24pbWQ1X2hleGRpZ2VzdCwgTUVUSF9OT0FSR1MsICBoZXhkaWdlc3RfZG9jfSwKLQl7ImNvcHkiLCAgICAgIChQeUNGdW5jdGlvbiltZDVfY29weSwgICAgICBNRVRIX05PQVJHUywgIGNvcHlfZG9jfSwKLQl7TlVMTCwgTlVMTH0JCQkgICAgIC8qIHNlbnRpbmVsICovCisgICAgeyJ1cGRhdGUiLCAgICAoUHlDRnVuY3Rpb24pbWQ1X3VwZGF0ZSwgICAgTUVUSF9WQVJBUkdTLCB1cGRhdGVfZG9jfSwKKyAgICB7ImRpZ2VzdCIsICAgIChQeUNGdW5jdGlvbiltZDVfZGlnZXN0LCAgICBNRVRIX05PQVJHUywgIGRpZ2VzdF9kb2N9LAorICAgIHsiaGV4ZGlnZXN0IiwgKFB5Q0Z1bmN0aW9uKW1kNV9oZXhkaWdlc3QsIE1FVEhfTk9BUkdTLCAgaGV4ZGlnZXN0X2RvY30sCisgICAgeyJjb3B5IiwgICAgICAoUHlDRnVuY3Rpb24pbWQ1X2NvcHksICAgICAgTUVUSF9OT0FSR1MsICBjb3B5X2RvY30sCisgICAge05VTEwsIE5VTEx9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTIyMSwzNyArMjIxLDM3IEBACiBjb3B5KCkgLS0gcmV0dXJuIGEgY29weSBvZiB0aGUgY3VycmVudCBtZDUgb2JqZWN0Iik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTUQ1dHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX21kNS5tZDUiLAkJICAvKnRwX25hbWUqLwotCXNpemVvZihtZDVvYmplY3QpLAkgIC8qdHBfc2l6ZSovCi0JMCwJCQkgIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvciltZDVfZGVhbGxvYywgIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkgIC8qdHBfcHJpbnQqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KLQkwLAkJCSAgLyp0cF9zZXRhdHRyKi8KLQkwLAkJCSAgLyp0cF9jb21wYXJlKi8KLQkwLAkJCSAgLyp0cF9yZXByKi8KLSAgICAgICAgMCwJCQkgIC8qdHBfYXNfbnVtYmVyKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJICAvKnRwX2FzX21hcHBpbmcqLwotCTAsIAkJCSAgLyp0cF9oYXNoKi8KLQkwLAkJCSAgLyp0cF9jYWxsKi8KLQkwLAkJCSAgLyp0cF9zdHIqLwotCTAsCQkJICAvKnRwX2dldGF0dHJvKi8KLQkwLAkJCSAgLyp0cF9zZXRhdHRybyovCi0JMCwJICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJICAvKnRwX2ZsYWdzKi8KLQltZDV0eXBlX2RvYywJCSAgLyp0cF9kb2MqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgICAgICAwLAkJCSAgLyp0cF9jbGVhciovCi0gICAgICAgIDAsCQkJICAvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAgICAgMCwJCQkgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgICAgICAwLAkJCSAgLyp0cF9pdGVyKi8KLSAgICAgICAgMCwJCQkgIC8qdHBfaXRlcm5leHQqLwotICAgICAgICBtZDVfbWV0aG9kcywJICAgICAgICAgIC8qdHBfbWV0aG9kcyovCi0gICAgICAgIDAsICAgICAgCSAgICAgICAgICAvKnRwX21lbWJlcnMqLwotICAgICAgICBtZDVfZ2V0c2V0ZXJzLCAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAiX21kNS5tZDUiLCAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihtZDVvYmplY3QpLCAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKW1kNV9kZWFsbG9jLCAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAvKnRwX2ZsYWdzKi8KKyAgICBtZDV0eXBlX2RvYywgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIG1kNV9tZXRob2RzLCAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICBtZDVfZ2V0c2V0ZXJzLCAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KIH07CiAKIApAQCAtMjYwLDIwICsyNjAsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNRDVfbmV3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQltZDVvYmplY3QgKm1kNXA7Ci0JdW5zaWduZWQgY2hhciAqY3AgPSBOVUxMOwotCWludCBsZW4gPSAwOworICAgIG1kNW9iamVjdCAqbWQ1cDsKKyAgICB1bnNpZ25lZCBjaGFyICpjcCA9IE5VTEw7CisgICAgaW50IGxlbiA9IDA7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxzIzpuZXciLCAmY3AsICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxzIzpuZXciLCAmY3AsICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgobWQ1cCA9IG5ld21kNW9iamVjdCgpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKG1kNXAgPSBuZXdtZDVvYmplY3QoKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoY3ApCi0JCW1kNV9hcHBlbmQoJm1kNXAtPm1kNSwgY3AsIGxlbik7CisgICAgaWYgKGNwKQorICAgICAgICBtZDVfYXBwZW5kKCZtZDVwLT5tZDUsIGNwLCBsZW4pOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKW1kNXA7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW1kNXA7CiB9CiAKIFB5RG9jX1NUUlZBUihuZXdfZG9jLApAQCAtMjg2LDggKzI4Niw4IEBACiAvKiBMaXN0IG9mIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0aGlzIG1vZHVsZSAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgbWQ1X2Z1bmN0aW9uc1tdID0gewotCXsibmV3IiwJCShQeUNGdW5jdGlvbilNRDVfbmV3LCBNRVRIX1ZBUkFSR1MsIG5ld19kb2N9LAotCXtOVUxMLAkJTlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7Im5ldyIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilNRDVfbmV3LCBNRVRIX1ZBUkFSR1MsIG5ld19kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBTZW50aW5lbCAqLwogfTsKIAogCkBAIC0yOTYsMTYgKzI5NiwxNiBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRfbWQ1KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotICAgICAgICBQeV9UWVBFKCZNRDV0eXBlKSA9ICZQeVR5cGVfVHlwZTsKLSAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSgmTUQ1dHlwZSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuOwotCW0gPSBQeV9Jbml0TW9kdWxlMygiX21kNSIsIG1kNV9mdW5jdGlvbnMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JICAgIHJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTUQ1VHlwZSIsIChQeU9iamVjdCAqKSZNRDV0eXBlKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGlnZXN0X3NpemUiLCAxNik7Ci0JLyogTm8gbmVlZCB0byBjaGVjayB0aGUgZXJyb3IgaGVyZSwgdGhlIGNhbGxlciB3aWxsIGRvIHRoYXQgKi8KKyAgICBQeV9UWVBFKCZNRDV0eXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZNRDV0eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9tZDUiLCBtZDVfZnVuY3Rpb25zLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk1ENVR5cGUiLCAoUHlPYmplY3QgKikmTUQ1dHlwZSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRpZ2VzdF9zaXplIiwgMTYpOworICAgIC8qIE5vIG5lZWQgdG8gY2hlY2sgdGhlIGVycm9yIGhlcmUsIHRoZSBjYWxsZXIgd2lsbCBkbyB0aGF0ICovCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21tYXBtb2R1bGUuYyBiL01vZHVsZXMvbW1hcG1vZHVsZS5jCmluZGV4IGFjNTcyZDIuLjI0Zjc4NTEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbW1hcG1vZHVsZS5jCisrKyBiL01vZHVsZXMvbW1hcG1vZHVsZS5jCkBAIC0zMCwxOCArMzAsMTggQEAKIHN0YXRpYyBpbnQKIG15X2dldHBhZ2VzaXplKHZvaWQpCiB7Ci0JU1lTVEVNX0lORk8gc2k7Ci0JR2V0U3lzdGVtSW5mbygmc2kpOwotCXJldHVybiBzaS5kd1BhZ2VTaXplOworICAgIFNZU1RFTV9JTkZPIHNpOworICAgIEdldFN5c3RlbUluZm8oJnNpKTsKKyAgICByZXR1cm4gc2kuZHdQYWdlU2l6ZTsKIH0KIAogc3RhdGljIGludAogbXlfZ2V0YWxsb2NhdGlvbmdyYW51bGFyaXR5ICh2b2lkKQogewogCi0JU1lTVEVNX0lORk8gc2k7Ci0JR2V0U3lzdGVtSW5mbygmc2kpOwotCXJldHVybiBzaS5kd0FsbG9jYXRpb25HcmFudWxhcml0eTsKKyAgICBTWVNURU1fSU5GTyBzaTsKKyAgICBHZXRTeXN0ZW1JbmZvKCZzaSk7CisgICAgcmV0dXJuIHNpLmR3QWxsb2NhdGlvbkdyYW51bGFyaXR5OwogfQogCiAjZW5kaWYKQEAgLTU0LDcgKzU0LDcgQEAKIHN0YXRpYyBpbnQKIG15X2dldHBhZ2VzaXplKHZvaWQpCiB7Ci0JcmV0dXJuIHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKyAgICByZXR1cm4gc3lzY29uZihfU0NfUEFHRVNJWkUpOwogfQogCiAjZGVmaW5lIG15X2dldGFsbG9jYXRpb25ncmFudWxhcml0eSBteV9nZXRwYWdlc2l6ZQpAQCAtNzksMzAgKzc5LDMwIEBACiAKIHR5cGVkZWYgZW51bQogewotCUFDQ0VTU19ERUZBVUxULAotCUFDQ0VTU19SRUFELAotCUFDQ0VTU19XUklURSwKLQlBQ0NFU1NfQ09QWQorICAgIEFDQ0VTU19ERUZBVUxULAorICAgIEFDQ0VTU19SRUFELAorICAgIEFDQ0VTU19XUklURSwKKyAgICBBQ0NFU1NfQ09QWQogfSBhY2Nlc3NfbW9kZTsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQljaGFyICoJZGF0YTsKLQlzaXplX3QJc2l6ZTsKLQlzaXplX3QJcG9zOyAgICAvKiByZWxhdGl2ZSB0byBvZmZzZXQgKi8KLQlzaXplX3QJb2Zmc2V0OyAKKyAgICBQeU9iamVjdF9IRUFECisgICAgY2hhciAqICAgICAgZGF0YTsKKyAgICBzaXplX3QgICAgICBzaXplOworICAgIHNpemVfdCAgICAgIHBvczsgICAgLyogcmVsYXRpdmUgdG8gb2Zmc2V0ICovCisgICAgc2l6ZV90ICAgICAgb2Zmc2V0OwogCiAjaWZkZWYgTVNfV0lORE9XUwotCUhBTkRMRQltYXBfaGFuZGxlOwotCUhBTkRMRQlmaWxlX2hhbmRsZTsKLQljaGFyICoJdGFnbmFtZTsKKyAgICBIQU5ETEUgICAgICBtYXBfaGFuZGxlOworICAgIEhBTkRMRSAgICAgIGZpbGVfaGFuZGxlOworICAgIGNoYXIgKiAgICAgIHRhZ25hbWU7CiAjZW5kaWYKIAogI2lmZGVmIFVOSVgKLSAgICAgICAgaW50IGZkOworICAgIGludCBmZDsKICNlbmRpZgogCi0gICAgICAgIGFjY2Vzc19tb2RlIGFjY2VzczsKKyAgICBhY2Nlc3NfbW9kZSBhY2Nlc3M7CiB9IG1tYXBfb2JqZWN0OwogCiAKQEAgLTExMCwzMjEgKzExMCwzMjEgQEAKIG1tYXBfb2JqZWN0X2RlYWxsb2MobW1hcF9vYmplY3QgKm1fb2JqKQogewogI2lmZGVmIE1TX1dJTkRPV1MKLQlpZiAobV9vYmotPmRhdGEgIT0gTlVMTCkKLQkJVW5tYXBWaWV3T2ZGaWxlIChtX29iai0+ZGF0YSk7Ci0JaWYgKG1fb2JqLT5tYXBfaGFuZGxlICE9IE5VTEwpCi0JCUNsb3NlSGFuZGxlIChtX29iai0+bWFwX2hhbmRsZSk7Ci0JaWYgKG1fb2JqLT5maWxlX2hhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLQkJQ2xvc2VIYW5kbGUgKG1fb2JqLT5maWxlX2hhbmRsZSk7Ci0JaWYgKG1fb2JqLT50YWduYW1lKQotCQlQeU1lbV9GcmVlKG1fb2JqLT50YWduYW1lKTsKKyAgICBpZiAobV9vYmotPmRhdGEgIT0gTlVMTCkKKyAgICAgICAgVW5tYXBWaWV3T2ZGaWxlIChtX29iai0+ZGF0YSk7CisgICAgaWYgKG1fb2JqLT5tYXBfaGFuZGxlICE9IE5VTEwpCisgICAgICAgIENsb3NlSGFuZGxlIChtX29iai0+bWFwX2hhbmRsZSk7CisgICAgaWYgKG1fb2JqLT5maWxlX2hhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgQ2xvc2VIYW5kbGUgKG1fb2JqLT5maWxlX2hhbmRsZSk7CisgICAgaWYgKG1fb2JqLT50YWduYW1lKQorICAgICAgICBQeU1lbV9GcmVlKG1fb2JqLT50YWduYW1lKTsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKICNpZmRlZiBVTklYCi0JaWYgKG1fb2JqLT5mZCA+PSAwKQotCQkodm9pZCkgY2xvc2UobV9vYmotPmZkKTsKLQlpZiAobV9vYmotPmRhdGEhPU5VTEwpIHsKLQkJbXN5bmMobV9vYmotPmRhdGEsIG1fb2JqLT5zaXplLCBNU19TWU5DKTsKLQkJbXVubWFwKG1fb2JqLT5kYXRhLCBtX29iai0+c2l6ZSk7Ci0JfQorICAgIGlmIChtX29iai0+ZmQgPj0gMCkKKyAgICAgICAgKHZvaWQpIGNsb3NlKG1fb2JqLT5mZCk7CisgICAgaWYgKG1fb2JqLT5kYXRhIT1OVUxMKSB7CisgICAgICAgIG1zeW5jKG1fb2JqLT5kYXRhLCBtX29iai0+c2l6ZSwgTVNfU1lOQyk7CisgICAgICAgIG11bm1hcChtX29iai0+ZGF0YSwgbV9vYmotPnNpemUpOworICAgIH0KICNlbmRpZiAvKiBVTklYICovCiAKLQlQeV9UWVBFKG1fb2JqKS0+dHBfZnJlZSgoUHlPYmplY3QqKW1fb2JqKTsKKyAgICBQeV9UWVBFKG1fb2JqKS0+dHBfZnJlZSgoUHlPYmplY3QqKW1fb2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfY2xvc2VfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewogI2lmZGVmIE1TX1dJTkRPV1MKLQkvKiBGb3IgZWFjaCByZXNvdXJjZSB3ZSBtYWludGFpbiwgd2UgbmVlZCB0byBjaGVjawotCSAgIHRoZSB2YWx1ZSBpcyB2YWxpZCwgYW5kIGlmIHNvLCBmcmVlIHRoZSByZXNvdXJjZQotCSAgIGFuZCBzZXQgdGhlIG1lbWJlciB2YWx1ZSB0byBhbiBpbnZhbGlkIHZhbHVlIHNvCi0JICAgdGhlIGRlYWxsb2MgZG9lcyBub3QgYXR0ZW1wdCB0byByZXNvdXJjZSBjbGVhcmluZwotCSAgIGFnYWluLgotCSAgIFRPRE8gLSBzaG91bGQgd2UgY2hlY2sgZm9yIGVycm9ycyBpbiB0aGUgY2xvc2Ugb3BlcmF0aW9ucz8/PwotCSovCi0JaWYgKHNlbGYtPmRhdGEgIT0gTlVMTCkgewotCQlVbm1hcFZpZXdPZkZpbGUoc2VsZi0+ZGF0YSk7Ci0JCXNlbGYtPmRhdGEgPSBOVUxMOwotCX0KLQlpZiAoc2VsZi0+bWFwX2hhbmRsZSAhPSBOVUxMKSB7Ci0JCUNsb3NlSGFuZGxlKHNlbGYtPm1hcF9oYW5kbGUpOwotCQlzZWxmLT5tYXBfaGFuZGxlID0gTlVMTDsKLQl9Ci0JaWYgKHNlbGYtPmZpbGVfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCUNsb3NlSGFuZGxlKHNlbGYtPmZpbGVfaGFuZGxlKTsKLQkJc2VsZi0+ZmlsZV9oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQl9CisgICAgLyogRm9yIGVhY2ggcmVzb3VyY2Ugd2UgbWFpbnRhaW4sIHdlIG5lZWQgdG8gY2hlY2sKKyAgICAgICB0aGUgdmFsdWUgaXMgdmFsaWQsIGFuZCBpZiBzbywgZnJlZSB0aGUgcmVzb3VyY2UKKyAgICAgICBhbmQgc2V0IHRoZSBtZW1iZXIgdmFsdWUgdG8gYW4gaW52YWxpZCB2YWx1ZSBzbworICAgICAgIHRoZSBkZWFsbG9jIGRvZXMgbm90IGF0dGVtcHQgdG8gcmVzb3VyY2UgY2xlYXJpbmcKKyAgICAgICBhZ2Fpbi4KKyAgICAgICBUT0RPIC0gc2hvdWxkIHdlIGNoZWNrIGZvciBlcnJvcnMgaW4gdGhlIGNsb3NlIG9wZXJhdGlvbnM/Pz8KKyAgICAqLworICAgIGlmIChzZWxmLT5kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgVW5tYXBWaWV3T2ZGaWxlKHNlbGYtPmRhdGEpOworICAgICAgICBzZWxmLT5kYXRhID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHNlbGYtPm1hcF9oYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBDbG9zZUhhbmRsZShzZWxmLT5tYXBfaGFuZGxlKTsKKyAgICAgICAgc2VsZi0+bWFwX2hhbmRsZSA9IE5VTEw7CisgICAgfQorICAgIGlmIChzZWxmLT5maWxlX2hhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBDbG9zZUhhbmRsZShzZWxmLT5maWxlX2hhbmRsZSk7CisgICAgICAgIHNlbGYtPmZpbGVfaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgICAgfQogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogI2lmZGVmIFVOSVgKLQlpZiAoMCA8PSBzZWxmLT5mZCkKLQkJKHZvaWQpIGNsb3NlKHNlbGYtPmZkKTsKLQlzZWxmLT5mZCA9IC0xOwotCWlmIChzZWxmLT5kYXRhICE9IE5VTEwpIHsKLQkJbXVubWFwKHNlbGYtPmRhdGEsIHNlbGYtPnNpemUpOwotCQlzZWxmLT5kYXRhID0gTlVMTDsKLQl9CisgICAgaWYgKDAgPD0gc2VsZi0+ZmQpCisgICAgICAgICh2b2lkKSBjbG9zZShzZWxmLT5mZCk7CisgICAgc2VsZi0+ZmQgPSAtMTsKKyAgICBpZiAoc2VsZi0+ZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIG11bm1hcChzZWxmLT5kYXRhLCBzZWxmLT5zaXplKTsKKyAgICAgICAgc2VsZi0+ZGF0YSA9IE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAjaWZkZWYgTVNfV0lORE9XUwotI2RlZmluZSBDSEVDS19WQUxJRChlcnIpCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgICBpZiAoc2VsZi0+bWFwX2hhbmRsZSA9PSBOVUxMKSB7CQkJCQlcCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtbWFwIGNsb3NlZCBvciBpbnZhbGlkIik7CVwKLQlyZXR1cm4gZXJyOwkJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKKyNkZWZpbmUgQ0hFQ0tfVkFMSUQoZXJyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc2VsZi0+bWFwX2hhbmRsZSA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1tYXAgY2xvc2VkIG9yIGludmFsaWQiKTsgICAgICAgIFwKKyAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gd2hpbGUgKDApCiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiAjaWZkZWYgVU5JWAotI2RlZmluZSBDSEVDS19WQUxJRChlcnIpCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLSAgICBpZiAoc2VsZi0+ZGF0YSA9PSBOVUxMKSB7CQkJCQkJXAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibW1hcCBjbG9zZWQgb3IgaW52YWxpZCIpOwlcCi0JcmV0dXJuIGVycjsJCQkJCQkJXAotCX0JCQkJCQkJCVwKKyNkZWZpbmUgQ0hFQ0tfVkFMSUQoZXJyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoc2VsZi0+ZGF0YSA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1tYXAgY2xvc2VkIG9yIGludmFsaWQiKTsgICAgICAgIFwKKyAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gd2hpbGUgKDApCiAjZW5kaWYgLyogVU5JWCAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9yZWFkX2J5dGVfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLAotCQkgICAgICBQeU9iamVjdCAqdW51c2VkKQorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKHNlbGYtPnBvcyA8IHNlbGYtPnNpemUpIHsKLQkgICAgICAgIGNoYXIgdmFsdWUgPSBzZWxmLT5kYXRhW3NlbGYtPnBvc107Ci0JCXNlbGYtPnBvcyArPSAxOwotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiYyIsIHZhbHVlKTsKLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInJlYWQgYnl0ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIGlmIChzZWxmLT5wb3MgPCBzZWxmLT5zaXplKSB7CisgICAgICAgIGNoYXIgdmFsdWUgPSBzZWxmLT5kYXRhW3NlbGYtPnBvc107CisgICAgICAgIHNlbGYtPnBvcyArPSAxOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiYyIsIHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInJlYWQgYnl0ZSBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9yZWFkX2xpbmVfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLAotCQkgICAgICBQeU9iamVjdCAqdW51c2VkKQorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JY2hhciAqc3RhcnQgPSBzZWxmLT5kYXRhK3NlbGYtPnBvczsKLQljaGFyICplb2YgPSBzZWxmLT5kYXRhK3NlbGYtPnNpemU7Ci0JY2hhciAqZW9sOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqc3RhcnQgPSBzZWxmLT5kYXRhK3NlbGYtPnBvczsKKyAgICBjaGFyICplb2YgPSBzZWxmLT5kYXRhK3NlbGYtPnNpemU7CisgICAgY2hhciAqZW9sOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlDSEVDS19WQUxJRChOVUxMKTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKIAotCWVvbCA9IG1lbWNocihzdGFydCwgJ1xuJywgc2VsZi0+c2l6ZSAtIHNlbGYtPnBvcyk7Ci0JaWYgKCFlb2wpCi0JCWVvbCA9IGVvZjsKLQllbHNlCi0JCSsrZW9sOwkJLyogd2UncmUgaW50ZXJlc3RlZCBpbiB0aGUgcG9zaXRpb24gYWZ0ZXIgdGhlCi0JCQkJICAgbmV3bGluZS4gKi8KLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdGFydCwgKGVvbCAtIHN0YXJ0KSk7Ci0Jc2VsZi0+cG9zICs9IChlb2wgLSBzdGFydCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBlb2wgPSBtZW1jaHIoc3RhcnQsICdcbicsIHNlbGYtPnNpemUgLSBzZWxmLT5wb3MpOworICAgIGlmICghZW9sKQorICAgICAgICBlb2wgPSBlb2Y7CisgICAgZWxzZQorICAgICAgICArK2VvbDsgICAgICAgICAgICAgICAgICAvKiB3ZSdyZSBpbnRlcmVzdGVkIGluIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmUuICovCisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RhcnQsIChlb2wgLSBzdGFydCkpOworICAgIHNlbGYtPnBvcyArPSAoZW9sIC0gc3RhcnQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3JlYWRfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLAotCQkgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgbnVtX2J5dGVzLCBuOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBudW1fYnl0ZXMsIG47CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCUNIRUNLX1ZBTElEKE5VTEwpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibjpyZWFkIiwgJm51bV9ieXRlcykpCi0JCXJldHVybihOVUxMKTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm46cmVhZCIsICZudW1fYnl0ZXMpKQorICAgICAgICByZXR1cm4oTlVMTCk7CiAKLQkvKiBzaWxlbnRseSAnYWRqdXN0JyBvdXQtb2YtcmFuZ2UgcmVxdWVzdHMgKi8KLQlhc3NlcnQoc2VsZi0+c2l6ZSA+PSBzZWxmLT5wb3MpOwotCW4gPSBzZWxmLT5zaXplIC0gc2VsZi0+cG9zOwotCS8qIFRoZSBkaWZmZXJlbmNlIGNhbiBvdmVyZmxvdywgb25seSBpZiBzZWxmLT5zaXplIGlzIGdyZWF0ZXIgdGhhbgotCSAqIFBZX1NTSVpFX1RfTUFYLiAgQnV0IHRoZW4gdGhlIG9wZXJhdGlvbiBjYW5ub3QgcG9zc2libHkgc3VjY2VlZCwKLQkgKiBiZWNhdXNlIHRoZSBtYXBwZWQgYXJlYSBhbmQgdGhlIHJldHVybmVkIHN0cmluZyBlYWNoIG5lZWQgbW9yZSAKLQkgKiB0aGFuIGhhbGYgb2YgdGhlIGFkZHJlc3NhYmxlIG1lbW9yeS4gIFNvIHdlIGNsaXAgdGhlIHNpemUsIGFuZCBsZXQKLQkgKiB0aGUgY29kZSBiZWxvdyByYWlzZSBNZW1vcnlFcnJvci4KLQkgKi8KLQlpZiAobiA8IDApCi0JCW4gPSBQWV9TU0laRV9UX01BWDsKLQlpZiAobnVtX2J5dGVzIDwgMCB8fCBudW1fYnl0ZXMgPiBuKSB7Ci0JCW51bV9ieXRlcyA9IG47Ci0JfQotCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoInMjIiwgc2VsZi0+ZGF0YStzZWxmLT5wb3MsIG51bV9ieXRlcyk7Ci0Jc2VsZi0+cG9zICs9IG51bV9ieXRlczsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIHNpbGVudGx5ICdhZGp1c3QnIG91dC1vZi1yYW5nZSByZXF1ZXN0cyAqLworICAgIGFzc2VydChzZWxmLT5zaXplID49IHNlbGYtPnBvcyk7CisgICAgbiA9IHNlbGYtPnNpemUgLSBzZWxmLT5wb3M7CisgICAgLyogVGhlIGRpZmZlcmVuY2UgY2FuIG92ZXJmbG93LCBvbmx5IGlmIHNlbGYtPnNpemUgaXMgZ3JlYXRlciB0aGFuCisgICAgICogUFlfU1NJWkVfVF9NQVguICBCdXQgdGhlbiB0aGUgb3BlcmF0aW9uIGNhbm5vdCBwb3NzaWJseSBzdWNjZWVkLAorICAgICAqIGJlY2F1c2UgdGhlIG1hcHBlZCBhcmVhIGFuZCB0aGUgcmV0dXJuZWQgc3RyaW5nIGVhY2ggbmVlZCBtb3JlCisgICAgICogdGhhbiBoYWxmIG9mIHRoZSBhZGRyZXNzYWJsZSBtZW1vcnkuICBTbyB3ZSBjbGlwIHRoZSBzaXplLCBhbmQgbGV0CisgICAgICogdGhlIGNvZGUgYmVsb3cgcmFpc2UgTWVtb3J5RXJyb3IuCisgICAgICovCisgICAgaWYgKG4gPCAwKQorICAgICAgICBuID0gUFlfU1NJWkVfVF9NQVg7CisgICAgaWYgKG51bV9ieXRlcyA8IDAgfHwgbnVtX2J5dGVzID4gbikgeworICAgICAgICBudW1fYnl0ZXMgPSBuOworICAgIH0KKyAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJzIyIsIHNlbGYtPmRhdGErc2VsZi0+cG9zLCBudW1fYnl0ZXMpOworICAgIHNlbGYtPnBvcyArPSBudW1fYnl0ZXM7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfZ2ZpbmQobW1hcF9vYmplY3QgKnNlbGYsCi0JICAgUHlPYmplY3QgKmFyZ3MsCi0JICAgaW50IHJldmVyc2UpCisgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICBpbnQgcmV2ZXJzZSkKIHsKLQlQeV9zc2l6ZV90IHN0YXJ0ID0gc2VsZi0+cG9zOwotCVB5X3NzaXplX3QgZW5kID0gc2VsZi0+c2l6ZTsKLQljb25zdCBjaGFyICpuZWVkbGU7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlfc3NpemVfdCBzdGFydCA9IHNlbGYtPnBvczsKKyAgICBQeV9zc2l6ZV90IGVuZCA9IHNlbGYtPnNpemU7CisgICAgY29uc3QgY2hhciAqbmVlZGxlOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIHJldmVyc2UgPyAicyN8bm46cmZpbmQiIDogInMjfG5uOmZpbmQiLAotCQkJICAgICAgJm5lZWRsZSwgJmxlbiwgJnN0YXJ0LCAmZW5kKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQljb25zdCBjaGFyICpwLCAqc3RhcnRfcCwgKmVuZF9wOwotCQlpbnQgc2lnbiA9IHJldmVyc2UgPyAtMSA6IDE7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIHJldmVyc2UgPyAicyN8bm46cmZpbmQiIDogInMjfG5uOmZpbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmVlZGxlLCAmbGVuLCAmc3RhcnQsICZlbmQpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAsICpzdGFydF9wLCAqZW5kX3A7CisgICAgICAgIGludCBzaWduID0gcmV2ZXJzZSA/IC0xIDogMTsKIAotICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IDApCi0JCQlzdGFydCArPSBzZWxmLT5zaXplOwotICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IDApCi0JCQlzdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoKHNpemVfdClzdGFydCA+IHNlbGYtPnNpemUpCi0JCQlzdGFydCA9IHNlbGYtPnNpemU7CisgICAgICAgIGlmIChzdGFydCA8IDApCisgICAgICAgICAgICBzdGFydCArPSBzZWxmLT5zaXplOworICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICBlbHNlIGlmICgoc2l6ZV90KXN0YXJ0ID4gc2VsZi0+c2l6ZSkKKyAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi0+c2l6ZTsKIAotICAgICAgICAgICAgICAgIGlmIChlbmQgPCAwKQotCQkJZW5kICs9IHNlbGYtPnNpemU7Ci0JCWlmIChlbmQgPCAwKQotCQkJZW5kID0gMDsKLQkJZWxzZSBpZiAoKHNpemVfdCllbmQgPiBzZWxmLT5zaXplKQotCQkJZW5kID0gc2VsZi0+c2l6ZTsKKyAgICAgICAgaWYgKGVuZCA8IDApCisgICAgICAgICAgICBlbmQgKz0gc2VsZi0+c2l6ZTsKKyAgICAgICAgaWYgKGVuZCA8IDApCisgICAgICAgICAgICBlbmQgPSAwOworICAgICAgICBlbHNlIGlmICgoc2l6ZV90KWVuZCA+IHNlbGYtPnNpemUpCisgICAgICAgICAgICBlbmQgPSBzZWxmLT5zaXplOwogCi0JCXN0YXJ0X3AgPSBzZWxmLT5kYXRhICsgc3RhcnQ7Ci0JCWVuZF9wID0gc2VsZi0+ZGF0YSArIGVuZDsKKyAgICAgICAgc3RhcnRfcCA9IHNlbGYtPmRhdGEgKyBzdGFydDsKKyAgICAgICAgZW5kX3AgPSBzZWxmLT5kYXRhICsgZW5kOwogCi0JCWZvciAocCA9IChyZXZlcnNlID8gZW5kX3AgLSBsZW4gOiBzdGFydF9wKTsKLQkJICAgICAocCA+PSBzdGFydF9wKSAmJiAocCArIGxlbiA8PSBlbmRfcCk7IHAgKz0gc2lnbikgewotCQkJUHlfc3NpemVfdCBpOwotCQkJZm9yIChpID0gMDsgaSA8IGxlbiAmJiBuZWVkbGVbaV0gPT0gcFtpXTsgKytpKQotCQkJCS8qIG5vdGhpbmcgKi87Ci0JCQlpZiAoaSA9PSBsZW4pIHsKLQkJCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocCAtIHNlbGYtPmRhdGEpOwotCQkJfQotCQl9Ci0JCXJldHVybiBQeUludF9Gcm9tTG9uZygtMSk7Ci0JfQorICAgICAgICBmb3IgKHAgPSAocmV2ZXJzZSA/IGVuZF9wIC0gbGVuIDogc3RhcnRfcCk7CisgICAgICAgICAgICAgKHAgPj0gc3RhcnRfcCkgJiYgKHAgKyBsZW4gPD0gZW5kX3ApOyBwICs9IHNpZ24pIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gJiYgbmVlZGxlW2ldID09IHBbaV07ICsraSkKKyAgICAgICAgICAgICAgICAvKiBub3RoaW5nICovOworICAgICAgICAgICAgaWYgKGkgPT0gbGVuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHAgLSBzZWxmLT5kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoLTEpOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfZmluZF9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsCi0JCSBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIG1tYXBfZ2ZpbmQoc2VsZiwgYXJncywgMCk7CisgICAgcmV0dXJuIG1tYXBfZ2ZpbmQoc2VsZiwgYXJncywgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3JmaW5kX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwKLQkJIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gbW1hcF9nZmluZChzZWxmLCBhcmdzLCAxKTsKKyAgICByZXR1cm4gbW1hcF9nZmluZChzZWxmLCBhcmdzLCAxKTsKIH0KIAogc3RhdGljIGludAogaXNfd3JpdGVhYmxlKG1tYXBfb2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5hY2Nlc3MgIT0gQUNDRVNTX1JFQUQpCi0JCXJldHVybiAxOwotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJtbWFwIGNhbid0IG1vZGlmeSBhIHJlYWRvbmx5IG1lbW9yeSBtYXAuIik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHNlbGYtPmFjY2VzcyAhPSBBQ0NFU1NfUkVBRCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIm1tYXAgY2FuJ3QgbW9kaWZ5IGEgcmVhZG9ubHkgbWVtb3J5IG1hcC4iKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogaXNfcmVzaXplYWJsZShtbWFwX29iamVjdCAqc2VsZikKIHsKLQlpZiAoKHNlbGYtPmFjY2VzcyA9PSBBQ0NFU1NfV1JJVEUpIHx8IChzZWxmLT5hY2Nlc3MgPT0gQUNDRVNTX0RFRkFVTFQpKQotCQlyZXR1cm4gMTsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJtbWFwIGNhbid0IHJlc2l6ZSBhIHJlYWRvbmx5IG9yIGNvcHktb24td3JpdGUgbWVtb3J5IG1hcC4iKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoKHNlbGYtPmFjY2VzcyA9PSBBQ0NFU1NfV1JJVEUpIHx8IChzZWxmLT5hY2Nlc3MgPT0gQUNDRVNTX0RFRkFVTFQpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAibW1hcCBjYW4ndCByZXNpemUgYSByZWFkb25seSBvciBjb3B5LW9uLXdyaXRlIG1lbW9yeSBtYXAuIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfd3JpdGVfbWV0aG9kKG1tYXBfb2JqZWN0ICpzZWxmLAotCQkgIFB5T2JqZWN0ICphcmdzKQorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBsZW5ndGg7Ci0JY2hhciAqZGF0YTsKKyAgICBQeV9zc2l6ZV90IGxlbmd0aDsKKyAgICBjaGFyICpkYXRhOwogCi0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzp3cml0ZSIsICZkYXRhLCAmbGVuZ3RoKSkKLQkJcmV0dXJuKE5VTEwpOworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6d3JpdGUiLCAmZGF0YSwgJmxlbmd0aCkpCisgICAgICAgIHJldHVybihOVUxMKTsKIAotCWlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKHNlbGYtPnBvcyArIGxlbmd0aCkgPiBzZWxmLT5zaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF0YSBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbWNweShzZWxmLT5kYXRhK3NlbGYtPnBvcywgZGF0YSwgbGVuZ3RoKTsKLQlzZWxmLT5wb3MgPSBzZWxmLT5wb3MrbGVuZ3RoOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoKHNlbGYtPnBvcyArIGxlbmd0aCkgPiBzZWxmLT5zaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF0YSBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbWNweShzZWxmLT5kYXRhK3NlbGYtPnBvcywgZGF0YSwgbGVuZ3RoKTsKKyAgICBzZWxmLT5wb3MgPSBzZWxmLT5wb3MrbGVuZ3RoOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfd3JpdGVfYnl0ZV9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsCi0JCSAgICAgICBQeU9iamVjdCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciB2YWx1ZTsKKyAgICBjaGFyIHZhbHVlOwogCi0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjOndyaXRlX2J5dGUiLCAmdmFsdWUpKQotCQlyZXR1cm4oTlVMTCk7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjOndyaXRlX2J5dGUiLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4oTlVMTCk7CiAKLQlpZiAoIWlzX3dyaXRlYWJsZShzZWxmKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFpc193cml0ZWFibGUoc2VsZikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNlbGYtPnBvcyA8IHNlbGYtPnNpemUpIHsKLQkJKihzZWxmLT5kYXRhK3NlbGYtPnBvcykgPSB2YWx1ZTsKLQkJc2VsZi0+cG9zICs9IDE7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIndyaXRlIGJ5dGUgb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2VsZi0+cG9zIDwgc2VsZi0+c2l6ZSkgeworICAgICAgICAqKHNlbGYtPmRhdGErc2VsZi0+cG9zKSA9IHZhbHVlOworICAgICAgICBzZWxmLT5wb3MgKz0gMTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAid3JpdGUgYnl0ZSBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9zaXplX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwKLQkJIFB5T2JqZWN0ICp1bnVzZWQpCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CiAKICNpZmRlZiBNU19XSU5ET1dTCi0JaWYgKHNlbGYtPmZpbGVfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCURXT1JEIGxvdyxoaWdoOwotCQlQWV9MT05HX0xPTkcgc2l6ZTsKLQkJbG93ID0gR2V0RmlsZVNpemUoc2VsZi0+ZmlsZV9oYW5kbGUsICZoaWdoKTsKLQkJaWYgKGxvdyA9PSBJTlZBTElEX0ZJTEVfU0laRSkgewotCQkJLyogSXQgbWlnaHQgYmUgdGhhdCB0aGUgZnVuY3Rpb24gYXBwZWFycyB0byBoYXZlIGZhaWxlZCwKLQkJCSAgIHdoZW4gaW5kZWVkIGl0cyBzaXplIGVxdWFscyBJTlZBTElEX0ZJTEVfU0laRSAqLwotCQkJRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKLQkJCWlmIChlcnJvciAhPSBOT19FUlJPUikKLQkJCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoZXJyb3IpOwotCQl9Ci0JCWlmICghaGlnaCAmJiBsb3cgPCBMT05HX01BWCkKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylsb3cpOwotCQlzaXplID0gKCgoUFlfTE9OR19MT05HKWhpZ2gpPDwzMikgKyBsb3c7Ci0JCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHNpemUpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChzZWxmLT5zaXplKTsKLQl9CisgICAgaWYgKHNlbGYtPmZpbGVfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIERXT1JEIGxvdyxoaWdoOworICAgICAgICBQWV9MT05HX0xPTkcgc2l6ZTsKKyAgICAgICAgbG93ID0gR2V0RmlsZVNpemUoc2VsZi0+ZmlsZV9oYW5kbGUsICZoaWdoKTsKKyAgICAgICAgaWYgKGxvdyA9PSBJTlZBTElEX0ZJTEVfU0laRSkgeworICAgICAgICAgICAgLyogSXQgbWlnaHQgYmUgdGhhdCB0aGUgZnVuY3Rpb24gYXBwZWFycyB0byBoYXZlIGZhaWxlZCwKKyAgICAgICAgICAgICAgIHdoZW4gaW5kZWVkIGl0cyBzaXplIGVxdWFscyBJTlZBTElEX0ZJTEVfU0laRSAqLworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnJvciAhPSBOT19FUlJPUikKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoZXJyb3IpOworICAgICAgICB9CisgICAgICAgIGlmICghaGlnaCAmJiBsb3cgPCBMT05HX01BWCkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylsb3cpOworICAgICAgICBzaXplID0gKCgoUFlfTE9OR19MT05HKWhpZ2gpPDwzMikgKyBsb3c7CisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChzZWxmLT5zaXplKTsKKyAgICB9CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogCiAjaWZkZWYgVU5JWAotCXsKLQkJc3RydWN0IHN0YXQgYnVmOwotCQlpZiAoLTEgPT0gZnN0YXQoc2VsZi0+ZmQsICZidWYpKSB7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGJ1Zi5zdF9zaXplKTsKLQl9CisgICAgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIGlmICgtMSA9PSBmc3RhdChzZWxmLT5mZCwgJmJ1ZikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoYnVmLnN0X3NpemUpOworICAgIH0KICNlbmRpZiAvKiBVTklYICovCiB9CiAKQEAgLTQzOSwyMjMgKzQzOSwyMjMgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfcmVzaXplX21ldGhvZChtbWFwX29iamVjdCAqc2VsZiwKLQkJICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBuZXdfc2l6ZTsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm46cmVzaXplIiwgJm5ld19zaXplKSB8fAotCSAgICAhaXNfcmVzaXplYWJsZShzZWxmKSkgewotCQlyZXR1cm4gTlVMTDsKKyAgICBQeV9zc2l6ZV90IG5ld19zaXplOworICAgIENIRUNLX1ZBTElEKE5VTEwpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibjpyZXNpemUiLCAmbmV3X3NpemUpIHx8CisgICAgICAgICFpc19yZXNpemVhYmxlKHNlbGYpKSB7CisgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIE1TX1dJTkRPV1MKLQl9IGVsc2UgewotCQlEV09SRCBkd0VyckNvZGUgPSAwOwotCQlEV09SRCBvZmZfaGksIG9mZl9sbywgbmV3U2l6ZUxvdywgbmV3U2l6ZUhpZ2g7Ci0JCS8qIEZpcnN0LCB1bm1hcCB0aGUgZmlsZSB2aWV3ICovCi0JCVVubWFwVmlld09mRmlsZShzZWxmLT5kYXRhKTsKLQkJc2VsZi0+ZGF0YSA9IE5VTEw7Ci0JCS8qIENsb3NlIHRoZSBtYXBwaW5nIG9iamVjdCAqLwotCQlDbG9zZUhhbmRsZShzZWxmLT5tYXBfaGFuZGxlKTsKLQkJc2VsZi0+bWFwX2hhbmRsZSA9IE5VTEw7Ci0JCS8qIE1vdmUgdG8gdGhlIGRlc2lyZWQgRU9GIHBvc2l0aW9uICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgRFdPUkQgZHdFcnJDb2RlID0gMDsKKyAgICAgICAgRFdPUkQgb2ZmX2hpLCBvZmZfbG8sIG5ld1NpemVMb3csIG5ld1NpemVIaWdoOworICAgICAgICAvKiBGaXJzdCwgdW5tYXAgdGhlIGZpbGUgdmlldyAqLworICAgICAgICBVbm1hcFZpZXdPZkZpbGUoc2VsZi0+ZGF0YSk7CisgICAgICAgIHNlbGYtPmRhdGEgPSBOVUxMOworICAgICAgICAvKiBDbG9zZSB0aGUgbWFwcGluZyBvYmplY3QgKi8KKyAgICAgICAgQ2xvc2VIYW5kbGUoc2VsZi0+bWFwX2hhbmRsZSk7CisgICAgICAgIHNlbGYtPm1hcF9oYW5kbGUgPSBOVUxMOworICAgICAgICAvKiBNb3ZlIHRvIHRoZSBkZXNpcmVkIEVPRiBwb3NpdGlvbiAqLwogI2lmIFNJWkVPRl9TSVpFX1QgPiA0Ci0JCW5ld1NpemVIaWdoID0gKERXT1JEKSgoc2VsZi0+b2Zmc2V0ICsgbmV3X3NpemUpID4+IDMyKTsKLQkJbmV3U2l6ZUxvdyA9IChEV09SRCkoKHNlbGYtPm9mZnNldCArIG5ld19zaXplKSAmIDB4RkZGRkZGRkYpOwotCQlvZmZfaGkgPSAoRFdPUkQpKHNlbGYtPm9mZnNldCA+PiAzMik7Ci0JCW9mZl9sbyA9IChEV09SRCkoc2VsZi0+b2Zmc2V0ICYgMHhGRkZGRkZGRik7CisgICAgICAgIG5ld1NpemVIaWdoID0gKERXT1JEKSgoc2VsZi0+b2Zmc2V0ICsgbmV3X3NpemUpID4+IDMyKTsKKyAgICAgICAgbmV3U2l6ZUxvdyA9IChEV09SRCkoKHNlbGYtPm9mZnNldCArIG5ld19zaXplKSAmIDB4RkZGRkZGRkYpOworICAgICAgICBvZmZfaGkgPSAoRFdPUkQpKHNlbGYtPm9mZnNldCA+PiAzMik7CisgICAgICAgIG9mZl9sbyA9IChEV09SRCkoc2VsZi0+b2Zmc2V0ICYgMHhGRkZGRkZGRik7CiAjZWxzZQotCQluZXdTaXplSGlnaCA9IDA7Ci0JCW5ld1NpemVMb3cgPSAoRFdPUkQpKHNlbGYtPm9mZnNldCArIG5ld19zaXplKTsKLQkJb2ZmX2hpID0gMDsKLQkJb2ZmX2xvID0gKERXT1JEKXNlbGYtPm9mZnNldDsKKyAgICAgICAgbmV3U2l6ZUhpZ2ggPSAwOworICAgICAgICBuZXdTaXplTG93ID0gKERXT1JEKShzZWxmLT5vZmZzZXQgKyBuZXdfc2l6ZSk7CisgICAgICAgIG9mZl9oaSA9IDA7CisgICAgICAgIG9mZl9sbyA9IChEV09SRClzZWxmLT5vZmZzZXQ7CiAjZW5kaWYKLQkJU2V0RmlsZVBvaW50ZXIoc2VsZi0+ZmlsZV9oYW5kbGUsCi0JCQkgICAgICAgbmV3U2l6ZUxvdywgJm5ld1NpemVIaWdoLCBGSUxFX0JFR0lOKTsKLQkJLyogQ2hhbmdlIHRoZSBzaXplIG9mIHRoZSBmaWxlICovCi0JCVNldEVuZE9mRmlsZShzZWxmLT5maWxlX2hhbmRsZSk7Ci0JCS8qIENyZWF0ZSBhbm90aGVyIG1hcHBpbmcgb2JqZWN0IGFuZCByZW1hcCB0aGUgZmlsZSB2aWV3ICovCi0JCXNlbGYtPm1hcF9oYW5kbGUgPSBDcmVhdGVGaWxlTWFwcGluZygKLQkJCXNlbGYtPmZpbGVfaGFuZGxlLAotCQkJTlVMTCwKLQkJCVBBR0VfUkVBRFdSSVRFLAotCQkJMCwKLQkJCTAsCi0JCQlzZWxmLT50YWduYW1lKTsKLQkJaWYgKHNlbGYtPm1hcF9oYW5kbGUgIT0gTlVMTCkgewotCQkJc2VsZi0+ZGF0YSA9IChjaGFyICopIE1hcFZpZXdPZkZpbGUoc2VsZi0+bWFwX2hhbmRsZSwKLQkJCQkJCQkgICAgRklMRV9NQVBfV1JJVEUsCi0JCQkJCQkJICAgIG9mZl9oaSwKLQkJCQkJCQkgICAgb2ZmX2xvLAotCQkJCQkJCSAgICBuZXdfc2l6ZSk7Ci0JCQlpZiAoc2VsZi0+ZGF0YSAhPSBOVUxMKSB7Ci0JCQkJc2VsZi0+c2l6ZSA9IG5ld19zaXplOwotCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCQlyZXR1cm4gUHlfTm9uZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZHdFcnJDb2RlID0gR2V0TGFzdEVycm9yKCk7Ci0JCQkJQ2xvc2VIYW5kbGUoc2VsZi0+bWFwX2hhbmRsZSk7Ci0JCQkJc2VsZi0+bWFwX2hhbmRsZSA9IE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlkd0VyckNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKLQkJfQotCQlQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0VyckNvZGUpOwotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgU2V0RmlsZVBvaW50ZXIoc2VsZi0+ZmlsZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIG5ld1NpemVMb3csICZuZXdTaXplSGlnaCwgRklMRV9CRUdJTik7CisgICAgICAgIC8qIENoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZSAqLworICAgICAgICBTZXRFbmRPZkZpbGUoc2VsZi0+ZmlsZV9oYW5kbGUpOworICAgICAgICAvKiBDcmVhdGUgYW5vdGhlciBtYXBwaW5nIG9iamVjdCBhbmQgcmVtYXAgdGhlIGZpbGUgdmlldyAqLworICAgICAgICBzZWxmLT5tYXBfaGFuZGxlID0gQ3JlYXRlRmlsZU1hcHBpbmcoCisgICAgICAgICAgICBzZWxmLT5maWxlX2hhbmRsZSwKKyAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICBQQUdFX1JFQURXUklURSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgc2VsZi0+dGFnbmFtZSk7CisgICAgICAgIGlmIChzZWxmLT5tYXBfaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNlbGYtPmRhdGEgPSAoY2hhciAqKSBNYXBWaWV3T2ZGaWxlKHNlbGYtPm1hcF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl9oaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl9sbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zaXplKTsKKyAgICAgICAgICAgIGlmIChzZWxmLT5kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzZWxmLT5zaXplID0gbmV3X3NpemU7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkd0VyckNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZShzZWxmLT5tYXBfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzZWxmLT5tYXBfaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGR3RXJyQ29kZSA9IEdldExhc3RFcnJvcigpOworICAgICAgICB9CisgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGR3RXJyQ29kZSk7CisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogI2lmZGVmIFVOSVgKICNpZm5kZWYgSEFWRV9NUkVNQVAKLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIm1tYXA6IHJlc2l6aW5nIG5vdCBhdmFpbGFibGUtLW5vIG1yZW1hcCgpIik7Ci0JCXJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwOiByZXNpemluZyBub3QgYXZhaWxhYmxlLS1ubyBtcmVtYXAoKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKICNlbHNlCi0JfSBlbHNlIHsKLQkJdm9pZCAqbmV3bWFwOworICAgIH0gZWxzZSB7CisgICAgICAgIHZvaWQgKm5ld21hcDsKIAotCQlpZiAoZnRydW5jYXRlKHNlbGYtPmZkLCBzZWxmLT5vZmZzZXQgKyBuZXdfc2l6ZSkgPT0gLTEpIHsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBpZiAoZnRydW5jYXRlKHNlbGYtPmZkLCBzZWxmLT5vZmZzZXQgKyBuZXdfc2l6ZSkgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCiAjaWZkZWYgTVJFTUFQX01BWU1PVkUKLQkJbmV3bWFwID0gbXJlbWFwKHNlbGYtPmRhdGEsIHNlbGYtPnNpemUsIG5ld19zaXplLCBNUkVNQVBfTUFZTU9WRSk7CisgICAgICAgIG5ld21hcCA9IG1yZW1hcChzZWxmLT5kYXRhLCBzZWxmLT5zaXplLCBuZXdfc2l6ZSwgTVJFTUFQX01BWU1PVkUpOwogI2Vsc2UKLQkJI2lmIGRlZmluZWQoX19OZXRCU0RfXykKLQkJCW5ld21hcCA9IG1yZW1hcChzZWxmLT5kYXRhLCBzZWxmLT5zaXplLCBzZWxmLT5kYXRhLCBuZXdfc2l6ZSwgMCk7Ci0JCSNlbHNlCi0JCQluZXdtYXAgPSBtcmVtYXAoc2VsZi0+ZGF0YSwgc2VsZi0+c2l6ZSwgbmV3X3NpemUsIDApOwotCQkjZW5kaWYgLyogX19OZXRCU0RfXyAqLworICAgICAgICAjaWYgZGVmaW5lZChfX05ldEJTRF9fKQorICAgICAgICAgICAgbmV3bWFwID0gbXJlbWFwKHNlbGYtPmRhdGEsIHNlbGYtPnNpemUsIHNlbGYtPmRhdGEsIG5ld19zaXplLCAwKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIG5ld21hcCA9IG1yZW1hcChzZWxmLT5kYXRhLCBzZWxmLT5zaXplLCBuZXdfc2l6ZSwgMCk7CisgICAgICAgICNlbmRpZiAvKiBfX05ldEJTRF9fICovCiAjZW5kaWYKLQkJaWYgKG5ld21hcCA9PSAodm9pZCAqKS0xKQotCQl7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc2VsZi0+ZGF0YSA9IG5ld21hcDsKLQkJc2VsZi0+c2l6ZSA9IG5ld19zaXplOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOworICAgICAgICBpZiAobmV3bWFwID09ICh2b2lkICopLTEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzZWxmLT5kYXRhID0gbmV3bWFwOworICAgICAgICBzZWxmLT5zaXplID0gbmV3X3NpemU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAjZW5kaWYgLyogSEFWRV9NUkVNQVAgKi8KICNlbmRpZiAvKiBVTklYICovCi0JfQorICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfdGVsbF9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21TaXplX3Qoc2VsZi0+cG9zKTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNpemVfdChzZWxmLT5wb3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9mbHVzaF9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKLQlQeV9zc2l6ZV90IHNpemUgPSBzZWxmLT5zaXplOwotCUNIRUNLX1ZBTElEKE5VTEwpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG5uOmZsdXNoIiwgJm9mZnNldCwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHNpemVfdCkob2Zmc2V0ICsgc2l6ZSkgPiBzZWxmLT5zaXplKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZmx1c2ggdmFsdWVzIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlfc3NpemVfdCBvZmZzZXQgPSAwOworICAgIFB5X3NzaXplX3Qgc2l6ZSA9IHNlbGYtPnNpemU7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bm46Zmx1c2giLCAmb2Zmc2V0LCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoc2l6ZV90KShvZmZzZXQgKyBzaXplKSA+IHNlbGYtPnNpemUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmbHVzaCB2YWx1ZXMgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNpZmRlZiBNU19XSU5ET1dTCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBGbHVzaFZpZXdPZkZpbGUoc2VsZi0+ZGF0YStvZmZzZXQsIHNpemUpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIEZsdXNoVmlld09mRmlsZShzZWxmLT5kYXRhK29mZnNldCwgc2l6ZSkpOwogI2VsaWYgZGVmaW5lZChVTklYKQotCS8qIFhYWCBzZW1hbnRpY3Mgb2YgcmV0dXJuIHZhbHVlPyAqLwotCS8qIFhYWCBmbGFncyBmb3IgbXN5bmM/ICovCi0JaWYgKC0xID09IG1zeW5jKHNlbGYtPmRhdGEgKyBvZmZzZXQsIHNpemUsIE1TX1NZTkMpKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgLyogWFhYIHNlbWFudGljcyBvZiByZXR1cm4gdmFsdWU/ICovCisgICAgLyogWFhYIGZsYWdzIGZvciBtc3luYz8gKi8KKyAgICBpZiAoLTEgPT0gbXN5bmMoc2VsZi0+ZGF0YSArIG9mZnNldCwgc2l6ZSwgTVNfU1lOQykpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKICNlbHNlCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmbHVzaCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJmbHVzaCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtIik7CisgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfc2Vla19tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgZGlzdDsKLQlpbnQgaG93PTA7Ci0JQ0hFQ0tfVkFMSUQoTlVMTCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGk6c2VlayIsICZkaXN0LCAmaG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZSB7Ci0JCXNpemVfdCB3aGVyZTsKLQkJc3dpdGNoIChob3cpIHsKLQkJY2FzZSAwOiAvKiByZWxhdGl2ZSB0byBzdGFydCAqLwotCQkJaWYgKGRpc3QgPCAwKQotCQkJCWdvdG8gb25vdXRvZnJhbmdlOwotCQkJd2hlcmUgPSBkaXN0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMTogLyogcmVsYXRpdmUgdG8gY3VycmVudCBwb3NpdGlvbiAqLwotCQkJaWYgKChQeV9zc2l6ZV90KXNlbGYtPnBvcyArIGRpc3QgPCAwKQotCQkJCWdvdG8gb25vdXRvZnJhbmdlOwotCQkJd2hlcmUgPSBzZWxmLT5wb3MgKyBkaXN0OwotCQkJYnJlYWs7Ci0JCWNhc2UgMjogLyogcmVsYXRpdmUgdG8gZW5kICovCi0JCQlpZiAoKFB5X3NzaXplX3Qpc2VsZi0+c2l6ZSArIGRpc3QgPCAwKQotCQkJCWdvdG8gb25vdXRvZnJhbmdlOwotCQkJd2hlcmUgPSBzZWxmLT5zaXplICsgZGlzdDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ1bmtub3duIHNlZWsgdHlwZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKHdoZXJlID4gc2VsZi0+c2l6ZSkKLQkJCWdvdG8gb25vdXRvZnJhbmdlOwotCQlzZWxmLT5wb3MgPSB3aGVyZTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgUHlfc3NpemVfdCBkaXN0OworICAgIGludCBob3c9MDsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58aTpzZWVrIiwgJmRpc3QsICZob3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgc2l6ZV90IHdoZXJlOworICAgICAgICBzd2l0Y2ggKGhvdykgeworICAgICAgICBjYXNlIDA6IC8qIHJlbGF0aXZlIHRvIHN0YXJ0ICovCisgICAgICAgICAgICBpZiAoZGlzdCA8IDApCisgICAgICAgICAgICAgICAgZ290byBvbm91dG9mcmFuZ2U7CisgICAgICAgICAgICB3aGVyZSA9IGRpc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvKiByZWxhdGl2ZSB0byBjdXJyZW50IHBvc2l0aW9uICovCisgICAgICAgICAgICBpZiAoKFB5X3NzaXplX3Qpc2VsZi0+cG9zICsgZGlzdCA8IDApCisgICAgICAgICAgICAgICAgZ290byBvbm91dG9mcmFuZ2U7CisgICAgICAgICAgICB3aGVyZSA9IHNlbGYtPnBvcyArIGRpc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvKiByZWxhdGl2ZSB0byBlbmQgKi8KKyAgICAgICAgICAgIGlmICgoUHlfc3NpemVfdClzZWxmLT5zaXplICsgZGlzdCA8IDApCisgICAgICAgICAgICAgICAgZ290byBvbm91dG9mcmFuZ2U7CisgICAgICAgICAgICB3aGVyZSA9IHNlbGYtPnNpemUgKyBkaXN0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInVua25vd24gc2VlayB0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAod2hlcmUgPiBzZWxmLT5zaXplKQorICAgICAgICAgICAgZ290byBvbm91dG9mcmFuZ2U7CisgICAgICAgIHNlbGYtPnBvcyA9IHdoZXJlOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAogICBvbm91dG9mcmFuZ2U6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzZWVrIG91dCBvZiByYW5nZSIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2VlayBvdXQgb2YgcmFuZ2UiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfbW92ZV9tZXRob2QobW1hcF9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGxvbmcgZGVzdCwgc3JjLCBjb3VudDsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImtrazptb3ZlIiwgJmRlc3QsICZzcmMsICZjb3VudCkgfHwKLQkgICAgIWlzX3dyaXRlYWJsZShzZWxmKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQkvKiBib3VuZHMgY2hlY2sgdGhlIHZhbHVlcyAqLwotCQl1bnNpZ25lZCBsb25nIHBvcyA9IHNyYyA+IGRlc3QgPyBzcmMgOiBkZXN0OwotCQlpZiAoc2VsZi0+c2l6ZSA8IHBvcyB8fCBjb3VudCA+IHNlbGYtPnNpemUgLSBwb3MpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkic291cmNlIG9yIGRlc3RpbmF0aW9uIG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQltZW1tb3ZlKHNlbGYtPmRhdGErZGVzdCwgc2VsZi0+ZGF0YStzcmMsIGNvdW50KTsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JfQorICAgIHVuc2lnbmVkIGxvbmcgZGVzdCwgc3JjLCBjb3VudDsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImtrazptb3ZlIiwgJmRlc3QsICZzcmMsICZjb3VudCkgfHwKKyAgICAgICAgIWlzX3dyaXRlYWJsZShzZWxmKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBib3VuZHMgY2hlY2sgdGhlIHZhbHVlcyAqLworICAgICAgICB1bnNpZ25lZCBsb25nIHBvcyA9IHNyYyA+IGRlc3QgPyBzcmMgOiBkZXN0OworICAgICAgICBpZiAoc2VsZi0+c2l6ZSA8IHBvcyB8fCBjb3VudCA+IHNlbGYtPnNpemUgLSBwb3MpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2Ugb3IgZGVzdGluYXRpb24gb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbW1vdmUoc2VsZi0+ZGF0YStkZXN0LCBzZWxmLT5kYXRhK3NyYywgY291bnQpOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbW1hcF9vYmplY3RfbWV0aG9kc1tdID0gewotCXsiY2xvc2UiLAkoUHlDRnVuY3Rpb24pIG1tYXBfY2xvc2VfbWV0aG9kLAlNRVRIX05PQVJHU30sCi0JeyJmaW5kIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX2ZpbmRfbWV0aG9kLAkJTUVUSF9WQVJBUkdTfSwKLQl7InJmaW5kIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX3JmaW5kX21ldGhvZCwJTUVUSF9WQVJBUkdTfSwKLQl7ImZsdXNoIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX2ZsdXNoX21ldGhvZCwJTUVUSF9WQVJBUkdTfSwKLQl7Im1vdmUiLAkoUHlDRnVuY3Rpb24pIG1tYXBfbW92ZV9tZXRob2QsCQlNRVRIX1ZBUkFSR1N9LAotCXsicmVhZCIsCShQeUNGdW5jdGlvbikgbW1hcF9yZWFkX21ldGhvZCwJCU1FVEhfVkFSQVJHU30sCi0JeyJyZWFkX2J5dGUiLAkoUHlDRnVuY3Rpb24pIG1tYXBfcmVhZF9ieXRlX21ldGhvZCwgIAlNRVRIX05PQVJHU30sCi0JeyJyZWFkbGluZSIsCShQeUNGdW5jdGlvbikgbW1hcF9yZWFkX2xpbmVfbWV0aG9kLAlNRVRIX05PQVJHU30sCi0JeyJyZXNpemUiLAkoUHlDRnVuY3Rpb24pIG1tYXBfcmVzaXplX21ldGhvZCwJTUVUSF9WQVJBUkdTfSwKLQl7InNlZWsiLAkoUHlDRnVuY3Rpb24pIG1tYXBfc2Vla19tZXRob2QsCQlNRVRIX1ZBUkFSR1N9LAotCXsic2l6ZSIsCShQeUNGdW5jdGlvbikgbW1hcF9zaXplX21ldGhvZCwJCU1FVEhfTk9BUkdTfSwKLQl7InRlbGwiLAkoUHlDRnVuY3Rpb24pIG1tYXBfdGVsbF9tZXRob2QsCQlNRVRIX05PQVJHU30sCi0JeyJ3cml0ZSIsCShQeUNGdW5jdGlvbikgbW1hcF93cml0ZV9tZXRob2QsCU1FVEhfVkFSQVJHU30sCi0JeyJ3cml0ZV9ieXRlIiwJKFB5Q0Z1bmN0aW9uKSBtbWFwX3dyaXRlX2J5dGVfbWV0aG9kLAlNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkgICBOVUxMfSAgICAgICAvKiBzZW50aW5lbCAqLworICAgIHsiY2xvc2UiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX2Nsb3NlX21ldGhvZCwgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7ImZpbmQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9maW5kX21ldGhvZCwgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicmZpbmQiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX3JmaW5kX21ldGhvZCwgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJmbHVzaCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfZmx1c2hfbWV0aG9kLCAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1vdmUiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9tb3ZlX21ldGhvZCwgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsicmVhZCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX3JlYWRfbWV0aG9kLCAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJyZWFkX2J5dGUiLCAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfcmVhZF9ieXRlX21ldGhvZCwgICAgTUVUSF9OT0FSR1N9LAorICAgIHsicmVhZGxpbmUiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX3JlYWRfbGluZV9tZXRob2QsICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7InJlc2l6ZSIsICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF9yZXNpemVfbWV0aG9kLCAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2VlayIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX3NlZWtfbWV0aG9kLCAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzaXplIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pIG1tYXBfc2l6ZV9tZXRob2QsICAgICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHsidGVsbCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX3RlbGxfbWV0aG9kLCAgICAgICAgIE1FVEhfTk9BUkdTfSwKKyAgICB7IndyaXRlIiwgICAgICAgICAgIChQeUNGdW5jdGlvbikgbW1hcF93cml0ZV9tZXRob2QsICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsid3JpdGVfYnl0ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKSBtbWFwX3dyaXRlX2J5dGVfbWV0aG9kLCAgIE1FVEhfVkFSQVJHU30sCisgICAge05VTEwsICAgICAgICAgTlVMTH0gICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIEZ1bmN0aW9ucyBmb3IgdHJlYXRpbmcgYW4gbW1hcCdlZCBmaWxlIGFzIGEgYnVmZmVyICovCkBAIC02NjMsMzM3ICs2NjMsMzM3IEBACiBzdGF0aWMgUHlfc3NpemVfdAogbW1hcF9idWZmZXJfZ2V0cmVhZGJ1ZihtbWFwX29iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgY29uc3Qgdm9pZCAqKnB0cikKIHsKLQlDSEVDS19WQUxJRCgtMSk7Ci0JaWYgKGluZGV4ICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJBY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IG1tYXAgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwdHIgPSBzZWxmLT5kYXRhOwotCXJldHVybiBzZWxmLT5zaXplOworICAgIENIRUNLX1ZBTElEKC0xKTsKKyAgICBpZiAoaW5kZXggIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiQWNjZXNzaW5nIG5vbi1leGlzdGVudCBtbWFwIHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHRyID0gc2VsZi0+ZGF0YTsKKyAgICByZXR1cm4gc2VsZi0+c2l6ZTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIG1tYXBfYnVmZmVyX2dldHdyaXRlYnVmKG1tYXBfb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGluZGV4LCBjb25zdCB2b2lkICoqcHRyKQogewotCUNIRUNLX1ZBTElEKC0xKTsKLQlpZiAoaW5kZXggIT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIkFjY2Vzc2luZyBub24tZXhpc3RlbnQgbW1hcCBzZWdtZW50Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFpc193cml0ZWFibGUoc2VsZikpCi0JCXJldHVybiAtMTsKLQkqcHRyID0gc2VsZi0+ZGF0YTsKLQlyZXR1cm4gc2VsZi0+c2l6ZTsKKyAgICBDSEVDS19WQUxJRCgtMSk7CisgICAgaWYgKGluZGV4ICE9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2Vzc2luZyBub24tZXhpc3RlbnQgbW1hcCBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFpc193cml0ZWFibGUoc2VsZikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAqcHRyID0gc2VsZi0+ZGF0YTsKKyAgICByZXR1cm4gc2VsZi0+c2l6ZTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIG1tYXBfYnVmZmVyX2dldHNlZ2NvdW50KG1tYXBfb2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90ICpsZW5wKQogewotCUNIRUNLX1ZBTElEKC0xKTsKLQlpZiAobGVucCkKLQkJKmxlbnAgPSBzZWxmLT5zaXplOwotCXJldHVybiAxOworICAgIENIRUNLX1ZBTElEKC0xKTsKKyAgICBpZiAobGVucCkKKyAgICAgICAgKmxlbnAgPSBzZWxmLT5zaXplOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogbW1hcF9idWZmZXJfZ2V0Y2hhcmJ1ZmZlcihtbWFwX29iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgY29uc3Qgdm9pZCAqKnB0cikKIHsKLQlpZiAoaW5kZXggIT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJImFjY2Vzc2luZyBub24tZXhpc3RlbnQgYnVmZmVyIHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcHRyID0gKGNvbnN0IGNoYXIgKilzZWxmLT5kYXRhOwotCXJldHVybiBzZWxmLT5zaXplOworICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3Npbmcgbm9uLWV4aXN0ZW50IGJ1ZmZlciBzZWdtZW50Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKnB0ciA9IChjb25zdCBjaGFyICopc2VsZi0+ZGF0YTsKKyAgICByZXR1cm4gc2VsZi0+c2l6ZTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIG1tYXBfbGVuZ3RoKG1tYXBfb2JqZWN0ICpzZWxmKQogewotCUNIRUNLX1ZBTElEKC0xKTsKLQlyZXR1cm4gc2VsZi0+c2l6ZTsKKyAgICBDSEVDS19WQUxJRCgtMSk7CisgICAgcmV0dXJuIHNlbGYtPnNpemU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX2l0ZW0obW1hcF9vYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaSkKIHsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoaSA8IDAgfHwgKHNpemVfdClpID49IHNlbGYtPnNpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJtbWFwIGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmRhdGEgKyBpLCAxKTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoaSA8IDAgfHwgKHNpemVfdClpID49IHNlbGYtPnNpemUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJtbWFwIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmRhdGEgKyBpLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfc2xpY2UobW1hcF9vYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCkKIHsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWVsc2UgaWYgKChzaXplX3QpaWxvdyA+IHNlbGYtPnNpemUpCi0JCWlsb3cgPSBzZWxmLT5zaXplOwotCWlmIChpaGlnaCA8IDApCi0JCWloaWdoID0gMDsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JZWxzZSBpZiAoKHNpemVfdClpaGlnaCA+IHNlbGYtPnNpemUpCi0JCWloaWdoID0gc2VsZi0+c2l6ZTsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoaWxvdyA8IDApCisgICAgICAgIGlsb3cgPSAwOworICAgIGVsc2UgaWYgKChzaXplX3QpaWxvdyA+IHNlbGYtPnNpemUpCisgICAgICAgIGlsb3cgPSBzZWxmLT5zaXplOworICAgIGlmIChpaGlnaCA8IDApCisgICAgICAgIGloaWdoID0gMDsKKyAgICBpZiAoaWhpZ2ggPCBpbG93KQorICAgICAgICBpaGlnaCA9IGlsb3c7CisgICAgZWxzZSBpZiAoKHNpemVfdClpaGlnaCA+IHNlbGYtPnNpemUpCisgICAgICAgIGloaWdoID0gc2VsZi0+c2l6ZTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgaWxvdywgaWhpZ2gtaWxvdyk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmRhdGEgKyBpbG93LCBpaGlnaC1pbG93KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1tYXBfc3Vic2NyaXB0KG1tYXBfb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaXRlbSkKIHsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBzZWxmLT5zaXplOwotCQlpZiAoaSA8IDAgfHwgKHNpemVfdClpID49IHNlbGYtPnNpemUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJtbWFwIGluZGV4IG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmRhdGEgKyBpLCAxKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbjsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgaSArPSBzZWxmLT5zaXplOworICAgICAgICBpZiAoaSA8IDAgfHwgKHNpemVfdClpID49IHNlbGYtPnNpemUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICJtbWFwIGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYtPmRhdGEgKyBpLCAxKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbjsKIAotCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLCBzZWxmLT5zaXplLAotCQkJCSAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuKSA8IDApIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCQotCQlpZiAoc2xpY2VsZW4gPD0gMCkKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0JCWVsc2UgaWYgKHN0ZXAgPT0gMSkKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmLT5kYXRhICsgc3RhcnQsCi0JCQkJCQkJICBzbGljZWxlbik7Ci0JCWVsc2UgewotCQkJY2hhciAqcmVzdWx0X2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHNsaWNlbGVuKTsKLQkJCVB5X3NzaXplX3QgY3VyLCBpOwotCQkJUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwgc2VsZi0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJCWlmIChyZXN1bHRfYnVmID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuOwotCQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkgICAgIAlyZXN1bHRfYnVmW2ldID0gc2VsZi0+ZGF0YVtjdXJdOwotCQkJfQotCQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzdWx0X2J1ZiwKLQkJCQkJCQkgICAgc2xpY2VsZW4pOwotCQkJUHlNZW1fRnJlZShyZXN1bHRfYnVmKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1tYXAgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgaWYgKHNsaWNlbGVuIDw9IDApCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOworICAgICAgICBlbHNlIGlmIChzdGVwID09IDEpCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc2VsZi0+ZGF0YSArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlbGVuKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpyZXN1bHRfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2Moc2xpY2VsZW4pOworICAgICAgICAgICAgUHlfc3NpemVfdCBjdXIsIGk7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgICAgICAgICBpZiAocmVzdWx0X2J1ZiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIHJlc3VsdF9idWZbaV0gPSBzZWxmLT5kYXRhW2N1cl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXN1bHRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VsZW4pOworICAgICAgICAgICAgUHlNZW1fRnJlZShyZXN1bHRfYnVmKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbW1hcF9jb25jYXQobW1hcF9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpiYikKIHsKLQlDSEVDS19WQUxJRChOVUxMKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkibW1hcHMgZG9uJ3Qgc3VwcG9ydCBjb25jYXRlbmF0aW9uIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgQ0hFQ0tfVkFMSUQoTlVMTCk7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAibW1hcHMgZG9uJ3Qgc3VwcG9ydCBjb25jYXRlbmF0aW9uIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtbWFwX3JlcGVhdChtbWFwX29iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBuKQogewotCUNIRUNLX1ZBTElEKE5VTEwpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSJtbWFwcyBkb24ndCBzdXBwb3J0IHJlcGVhdCBvcGVyYXRpb24iKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBDSEVDS19WQUxJRChOVUxMKTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJtbWFwcyBkb24ndCBzdXBwb3J0IHJlcGVhdCBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogbW1hcF9hc3Nfc2xpY2UobW1hcF9vYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaWxvdywgUHlfc3NpemVfdCBpaGlnaCwgUHlPYmplY3QgKnYpCiB7Ci0JY29uc3QgY2hhciAqYnVmOworICAgIGNvbnN0IGNoYXIgKmJ1ZjsKIAotCUNIRUNLX1ZBTElEKC0xKTsKLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWVsc2UgaWYgKChzaXplX3QpaWxvdyA+IHNlbGYtPnNpemUpCi0JCWlsb3cgPSBzZWxmLT5zaXplOwotCWlmIChpaGlnaCA8IDApCi0JCWloaWdoID0gMDsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JZWxzZSBpZiAoKHNpemVfdClpaGlnaCA+IHNlbGYtPnNpemUpCi0JCWloaWdoID0gc2VsZi0+c2l6ZTsKKyAgICBDSEVDS19WQUxJRCgtMSk7CisgICAgaWYgKGlsb3cgPCAwKQorICAgICAgICBpbG93ID0gMDsKKyAgICBlbHNlIGlmICgoc2l6ZV90KWlsb3cgPiBzZWxmLT5zaXplKQorICAgICAgICBpbG93ID0gc2VsZi0+c2l6ZTsKKyAgICBpZiAoaWhpZ2ggPCAwKQorICAgICAgICBpaGlnaCA9IDA7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGVsc2UgaWYgKChzaXplX3QpaWhpZ2ggPiBzZWxmLT5zaXplKQorICAgICAgICBpaGlnaCA9IHNlbGYtPnNpemU7CiAKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBkZWxldGlvbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghIChQeVN0cmluZ19DaGVjayh2KSkgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJtbWFwIHNsaWNlIGFzc2lnbm1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChQeVN0cmluZ19TaXplKHYpICE9IChpaGlnaCAtIGlsb3cpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJtbWFwIHNsaWNlIGFzc2lnbm1lbnQgaXMgd3Jvbmcgc2l6ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQotCQlyZXR1cm4gLTE7Ci0JYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0JbWVtY3B5KHNlbGYtPmRhdGEgKyBpbG93LCBidWYsIGloaWdoLWlsb3cpOwotCXJldHVybiAwOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgZGVsZXRpb24iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoISAoUHlTdHJpbmdfQ2hlY2sodikpICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIHNsaWNlIGFzc2lnbm1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeVN0cmluZ19TaXplKHYpICE9IChpaGlnaCAtIGlsb3cpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgc2xpY2UgYXNzaWdubWVudCBpcyB3cm9uZyBzaXplIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFpc193cml0ZWFibGUoc2VsZikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICBtZW1jcHkoc2VsZi0+ZGF0YSArIGlsb3csIGJ1ZiwgaWhpZ2gtaWxvdyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG1tYXBfYXNzX2l0ZW0obW1hcF9vYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JY29uc3QgY2hhciAqYnVmOworICAgIGNvbnN0IGNoYXIgKmJ1ZjsKIAotCUNIRUNLX1ZBTElEKC0xKTsKLQlpZiAoaSA8IDAgfHwgKHNpemVfdClpID49IHNlbGYtPnNpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJtbWFwIGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibW1hcCBvYmplY3QgZG9lc24ndCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoISAoUHlTdHJpbmdfQ2hlY2sodikgJiYgUHlTdHJpbmdfU2l6ZSh2KT09MSkgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJtbWFwIGFzc2lnbm1lbnQgbXVzdCBiZSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQotCQlyZXR1cm4gLTE7Ci0JYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodik7Ci0Jc2VsZi0+ZGF0YVtpXSA9IGJ1ZlswXTsKLQlyZXR1cm4gMDsKKyAgICBDSEVDS19WQUxJRCgtMSk7CisgICAgaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBvYmplY3QgZG9lc24ndCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoISAoUHlTdHJpbmdfQ2hlY2sodikgJiYgUHlTdHJpbmdfU2l6ZSh2KT09MSkgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgYXNzaWdubWVudCBtdXN0IGJlIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFpc193cml0ZWFibGUoc2VsZikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICBzZWxmLT5kYXRhW2ldID0gYnVmWzBdOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBtbWFwX2Fzc19zdWJzY3JpcHQobW1hcF9vYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppdGVtLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JQ0hFQ0tfVkFMSUQoLTEpOworICAgIENIRUNLX1ZBTElEKC0xKTsKIAotCWlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKLQkJY29uc3QgY2hhciAqYnVmOworICAgIGlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKKyAgICAgICAgY29uc3QgY2hhciAqYnVmOwogCi0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gc2VsZi0+c2l6ZTsKLQkJaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibW1hcCBvYmplY3QgZG9lc24ndCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSB8fCBQeVN0cmluZ19TaXplKHZhbHVlKSAhPSAxKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJICAgICAgICAgICJtbWFwIGFzc2lnbm1lbnQgbXVzdCBiZSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQotCQkJcmV0dXJuIC0xOwotCQlidWYgPSBQeVN0cmluZ19Bc1N0cmluZyh2YWx1ZSk7Ci0JCXNlbGYtPmRhdGFbaV0gPSBidWZbMF07Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuOwotCQkKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwKLQkJCQkJIHNlbGYtPnNpemUsICZzdGFydCwgJnN0b3AsCi0JCQkJCSAmc3RlcCwgJnNsaWNlbGVuKSA8IDApIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibW1hcCBvYmplY3QgZG9lc24ndCBzdXBwb3J0IHNsaWNlIGRlbGV0aW9uIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJtbWFwIHNsaWNlIGFzc2lnbm1lbnQgbXVzdCBiZSBhIHN0cmluZyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChQeVN0cmluZ19TaXplKHZhbHVlKSAhPSBzbGljZWxlbikgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJIm1tYXAgc2xpY2UgYXNzaWdubWVudCBpcyB3cm9uZyBzaXplIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKCFpc193cml0ZWFibGUoc2VsZikpCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gc2VsZi0+c2l6ZTsKKyAgICAgICAgaWYgKGkgPCAwIHx8IChzaXplX3QpaSA+PSBzZWxmLT5zaXplKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAibW1hcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAibW1hcCBvYmplY3QgZG9lc24ndCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSB8fCBQeVN0cmluZ19TaXplKHZhbHVlKSAhPSAxKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgIm1tYXAgYXNzaWdubWVudCBtdXN0IGJlIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc193cml0ZWFibGUoc2VsZikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKTsKKyAgICAgICAgc2VsZi0+ZGF0YVtpXSA9IGJ1ZlswXTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW47CiAKLQkJaWYgKHNsaWNlbGVuID09IDApCi0JCQlyZXR1cm4gMDsKLQkJZWxzZSBpZiAoc3RlcCA9PSAxKSB7Ci0JCQljb25zdCBjaGFyICpidWYgPSBQeVN0cmluZ19Bc1N0cmluZyh2YWx1ZSk7CisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5zaXplLCAmc3RhcnQsICZzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIm1tYXAgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBkZWxldGlvbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAibW1hcCBzbGljZSBhc3NpZ25tZW50IG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlTdHJpbmdfU2l6ZSh2YWx1ZSkgIT0gc2xpY2VsZW4pIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICJtbWFwIHNsaWNlIGFzc2lnbm1lbnQgaXMgd3Jvbmcgc2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICghaXNfd3JpdGVhYmxlKHNlbGYpKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCQlpZiAoYnVmID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQkJbWVtY3B5KHNlbGYtPmRhdGEgKyBzdGFydCwgYnVmLCBzbGljZWxlbik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQllbHNlIHsKLQkJCVB5X3NzaXplX3QgY3VyLCBpOwotCQkJY29uc3QgY2hhciAqYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOwotCQkJCi0JCQlpZiAoYnVmID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCXNlbGYtPmRhdGFbY3VyXSA9IGJ1ZltpXTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJtbWFwIGluZGljZXMgbXVzdCBiZSBpbnRlZ2VyIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIGlmIChzbGljZWxlbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOworCisgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgbWVtY3B5KHNlbGYtPmRhdGEgKyBzdGFydCwgYnVmLCBzbGljZWxlbik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY3VyLCBpOworICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcodmFsdWUpOworCisgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIHNlbGYtPmRhdGFbY3VyXSA9IGJ1ZltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgaW5kaWNlcyBtdXN0IGJlIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIG1tYXBfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpbW1hcF9sZW5ndGgsCQkgICAgICAgLypzcV9sZW5ndGgqLwotCShiaW5hcnlmdW5jKW1tYXBfY29uY2F0LAkgICAgICAgLypzcV9jb25jYXQqLwotCShzc2l6ZWFyZ2Z1bmMpbW1hcF9yZXBlYXQsCSAgICAgICAvKnNxX3JlcGVhdCovCi0JKHNzaXplYXJnZnVuYyltbWFwX2l0ZW0sCQkgICAgICAgLypzcV9pdGVtKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpbW1hcF9zbGljZSwJICAgICAgIC8qc3Ffc2xpY2UqLwotCShzc2l6ZW9iamFyZ3Byb2MpbW1hcF9hc3NfaXRlbSwJICAgICAgIC8qc3FfYXNzX2l0ZW0qLwotCShzc2l6ZXNzaXplb2JqYXJncHJvYyltbWFwX2Fzc19zbGljZSwgICAgICAvKnNxX2Fzc19zbGljZSovCisgICAgKGxlbmZ1bmMpbW1hcF9sZW5ndGgsICAgICAgICAgICAgICAgICAgICAgIC8qc3FfbGVuZ3RoKi8KKyAgICAoYmluYXJ5ZnVuYyltbWFwX2NvbmNhdCwgICAgICAgICAgICAgICAgICAgLypzcV9jb25jYXQqLworICAgIChzc2l6ZWFyZ2Z1bmMpbW1hcF9yZXBlYXQsICAgICAgICAgICAgICAgICAvKnNxX3JlcGVhdCovCisgICAgKHNzaXplYXJnZnVuYyltbWFwX2l0ZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzcV9pdGVtKi8KKyAgICAoc3NpemVzc2l6ZWFyZ2Z1bmMpbW1hcF9zbGljZSwgICAgICAgICAgICAgLypzcV9zbGljZSovCisgICAgKHNzaXplb2JqYXJncHJvYyltbWFwX2Fzc19pdGVtLCAgICAgICAgICAgIC8qc3FfYXNzX2l0ZW0qLworICAgIChzc2l6ZXNzaXplb2JqYXJncHJvYyltbWFwX2Fzc19zbGljZSwgICAgICAvKnNxX2Fzc19zbGljZSovCiB9OwogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBtbWFwX2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpbW1hcF9sZW5ndGgsCi0JKGJpbmFyeWZ1bmMpbW1hcF9zdWJzY3JpcHQsCi0JKG9iam9iamFyZ3Byb2MpbW1hcF9hc3Nfc3Vic2NyaXB0LAorICAgIChsZW5mdW5jKW1tYXBfbGVuZ3RoLAorICAgIChiaW5hcnlmdW5jKW1tYXBfc3Vic2NyaXB0LAorICAgIChvYmpvYmphcmdwcm9jKW1tYXBfYXNzX3N1YnNjcmlwdCwKIH07CiAKIHN0YXRpYyBQeUJ1ZmZlclByb2NzIG1tYXBfYXNfYnVmZmVyID0gewotCShyZWFkYnVmZmVycHJvYyltbWFwX2J1ZmZlcl9nZXRyZWFkYnVmLAotCSh3cml0ZWJ1ZmZlcnByb2MpbW1hcF9idWZmZXJfZ2V0d3JpdGVidWYsCi0JKHNlZ2NvdW50cHJvYyltbWFwX2J1ZmZlcl9nZXRzZWdjb3VudCwKLQkoY2hhcmJ1ZmZlcnByb2MpbW1hcF9idWZmZXJfZ2V0Y2hhcmJ1ZmZlciwKKyAgICAocmVhZGJ1ZmZlcnByb2MpbW1hcF9idWZmZXJfZ2V0cmVhZGJ1ZiwKKyAgICAod3JpdGVidWZmZXJwcm9jKW1tYXBfYnVmZmVyX2dldHdyaXRlYnVmLAorICAgIChzZWdjb3VudHByb2MpbW1hcF9idWZmZXJfZ2V0c2VnY291bnQsCisgICAgKGNoYXJidWZmZXJwcm9jKW1tYXBfYnVmZmVyX2dldGNoYXJidWZmZXIsCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTAyNCw0NiArMTAyNCw0NiBAQAogCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgbW1hcF9vYmplY3RfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkibW1hcC5tbWFwIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihtbWFwX29iamVjdCksCQkJLyogdHBfc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgbW1hcF9vYmplY3RfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZtbWFwX2FzX3NlcXVlbmNlLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCSZtbWFwX2FzX21hcHBpbmcsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCQkJLyp0cF9oYXNoKi8KLQkwLAkJCQkJLyp0cF9jYWxsKi8KLQkwLAkJCQkJLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyp0cF9nZXRhdHRybyovCi0JMCwJCQkJCS8qdHBfc2V0YXR0cm8qLwotCSZtbWFwX2FzX2J1ZmZlciwJCQkvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSLAkJLyp0cF9mbGFncyovCi0JbW1hcF9kb2MsCQkJCS8qdHBfZG9jKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwotCTAsCQkgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotCW1tYXBfb2JqZWN0X21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JbmV3X21tYXBfb2JqZWN0LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIm1tYXAubW1hcCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKG1tYXBfb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgbW1hcF9vYmplY3RfZGVhbGxvYywgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmbW1hcF9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgICZtbWFwX2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAmbW1hcF9hc19idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIsICAgICAgICAgICAgICAgICAgIC8qdHBfZmxhZ3MqLworICAgIG1tYXBfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgbW1hcF9vYmplY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgbmV3X21tYXBfb2JqZWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC0xMDc0LDIzICsxMDc0LDIzIEBACiBzdGF0aWMgUHlfc3NpemVfdAogX0dldE1hcFNpemUoUHlPYmplY3QgKm8sIGNvbnN0IGNoYXIqIHBhcmFtKQogewotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChQeUluZGV4X0NoZWNrKG8pKSB7Ci0JCVB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChvLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKLQkJaWYgKGk9PS0xICYmIFB5RXJyX09jY3VycmVkKCkpIAotCQkJcmV0dXJuIC0xOwotCQlpZiAoaSA8IDApIHsJIAotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSJtZW1vcnkgbWFwcGVkICVzIG11c3QgYmUgcG9zaXRpdmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gaTsKLQl9CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2sobykpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KG8sIFB5RXhjX092ZXJmbG93RXJyb3IpOworICAgICAgICBpZiAoaT09LTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVtb3J5IG1hcHBlZCAlcyBtdXN0IGJlIHBvc2l0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQogCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1hcCBzaXplIG11c3QgYmUgYW4gaW50ZWdyYWwgdmFsdWUiKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm1hcCBzaXplIG11c3QgYmUgYW4gaW50ZWdyYWwgdmFsdWUiKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKICNpZmRlZiBVTklYCkBAIC0xMDk4LDEyNCArMTA5OCwxMjQgQEAKIG5ld19tbWFwX29iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkaWN0KQogewogI2lmZGVmIEhBVkVfRlNUQVQKLQlzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKICNlbmRpZgotCW1tYXBfb2JqZWN0ICptX29iajsKLQlQeU9iamVjdCAqbWFwX3NpemVfb2JqID0gTlVMTCwgKm9mZnNldF9vYmogPSBOVUxMOwotCVB5X3NzaXplX3QgbWFwX3NpemUsIG9mZnNldDsKLQlpbnQgZmQsIGZsYWdzID0gTUFQX1NIQVJFRCwgcHJvdCA9IFBST1RfV1JJVEUgfCBQUk9UX1JFQUQ7Ci0JaW50IGRldnplcm8gPSAtMTsKLQlpbnQgYWNjZXNzID0gKGludClBQ0NFU1NfREVGQVVMVDsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZmlsZW5vIiwgImxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFncyIsICJwcm90IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VzcyIsICJvZmZzZXQiLCBOVUxMfTsKKyAgICBtbWFwX29iamVjdCAqbV9vYmo7CisgICAgUHlPYmplY3QgKm1hcF9zaXplX29iaiA9IE5VTEwsICpvZmZzZXRfb2JqID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IG1hcF9zaXplLCBvZmZzZXQ7CisgICAgaW50IGZkLCBmbGFncyA9IE1BUF9TSEFSRUQsIHByb3QgPSBQUk9UX1dSSVRFIHwgUFJPVF9SRUFEOworICAgIGludCBkZXZ6ZXJvID0gLTE7CisgICAgaW50IGFjY2VzcyA9IChpbnQpQUNDRVNTX0RFRkFVTFQ7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImZpbGVubyIsICJsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbGFncyIsICJwcm90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzIiwgIm9mZnNldCIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LCAiaU98aWlpTyIsIGtleXdvcmRzLAotCQkJCQkgJmZkLCAmbWFwX3NpemVfb2JqLCAmZmxhZ3MsICZwcm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjZXNzLCAmb2Zmc2V0X29iaikpCi0JCXJldHVybiBOVUxMOwotCW1hcF9zaXplID0gX0dldE1hcFNpemUobWFwX3NpemVfb2JqLCAic2l6ZSIpOwotCWlmIChtYXBfc2l6ZSA8IDApCi0JCXJldHVybiBOVUxMOwotICAgICAgICBvZmZzZXQgPSBfR2V0TWFwU2l6ZShvZmZzZXRfb2JqLCAib2Zmc2V0Iik7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGljdCwgImlPfGlpaU8iLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmQsICZtYXBfc2l6ZV9vYmosICZmbGFncywgJnByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY2VzcywgJm9mZnNldF9vYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtYXBfc2l6ZSA9IF9HZXRNYXBTaXplKG1hcF9zaXplX29iaiwgInNpemUiKTsKKyAgICBpZiAobWFwX3NpemUgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvZmZzZXQgPSBfR2V0TWFwU2l6ZShvZmZzZXRfb2JqLCAib2Zmc2V0Iik7CisgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKChhY2Nlc3MgIT0gKGludClBQ0NFU1NfREVGQVVMVCkgJiYKLQkgICAgKChmbGFncyAhPSBNQVBfU0hBUkVEKSB8fCAocHJvdCAhPSAoUFJPVF9XUklURSB8IFBST1RfUkVBRCkpKSkKLQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAibW1hcCBjYW4ndCBzcGVjaWZ5IGJvdGggYWNjZXNzIGFuZCBmbGFncywgcHJvdC4iKTsKLQlzd2l0Y2ggKChhY2Nlc3NfbW9kZSlhY2Nlc3MpIHsKLQljYXNlIEFDQ0VTU19SRUFEOgotCQlmbGFncyA9IE1BUF9TSEFSRUQ7Ci0JCXByb3QgPSBQUk9UX1JFQUQ7Ci0JCWJyZWFrOwotCWNhc2UgQUNDRVNTX1dSSVRFOgotCQlmbGFncyA9IE1BUF9TSEFSRUQ7Ci0JCXByb3QgPSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFOwotCQlicmVhazsKLQljYXNlIEFDQ0VTU19DT1BZOgotCQlmbGFncyA9IE1BUF9QUklWQVRFOwotCQlwcm90ID0gUFJPVF9SRUFEIHwgUFJPVF9XUklURTsKLQkJYnJlYWs7Ci0JY2FzZSBBQ0NFU1NfREVGQVVMVDoKLQkJLyogdXNlIHRoZSBzcGVjaWZpZWQgb3IgZGVmYXVsdCB2YWx1ZXMgb2YgZmxhZ3MgYW5kIHByb3QgKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAibW1hcCBpbnZhbGlkIGFjY2VzcyBwYXJhbWV0ZXIuIik7Ci0JfQorICAgIGlmICgoYWNjZXNzICE9IChpbnQpQUNDRVNTX0RFRkFVTFQpICYmCisgICAgICAgICgoZmxhZ3MgIT0gTUFQX1NIQVJFRCkgfHwgKHByb3QgIT0gKFBST1RfV1JJVEUgfCBQUk9UX1JFQUQpKSkpCisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW1hcCBjYW4ndCBzcGVjaWZ5IGJvdGggYWNjZXNzIGFuZCBmbGFncywgcHJvdC4iKTsKKyAgICBzd2l0Y2ggKChhY2Nlc3NfbW9kZSlhY2Nlc3MpIHsKKyAgICBjYXNlIEFDQ0VTU19SRUFEOgorICAgICAgICBmbGFncyA9IE1BUF9TSEFSRUQ7CisgICAgICAgIHByb3QgPSBQUk9UX1JFQUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDRVNTX1dSSVRFOgorICAgICAgICBmbGFncyA9IE1BUF9TSEFSRUQ7CisgICAgICAgIHByb3QgPSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFDQ0VTU19DT1BZOgorICAgICAgICBmbGFncyA9IE1BUF9QUklWQVRFOworICAgICAgICBwcm90ID0gUFJPVF9SRUFEIHwgUFJPVF9XUklURTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQ0NFU1NfREVGQVVMVDoKKyAgICAgICAgLyogdXNlIHRoZSBzcGVjaWZpZWQgb3IgZGVmYXVsdCB2YWx1ZXMgb2YgZmxhZ3MgYW5kIHByb3QgKi8KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIGludmFsaWQgYWNjZXNzIHBhcmFtZXRlci4iKTsKKyAgICB9CiAKICAgICBpZiAocHJvdCA9PSBQUk9UX1JFQUQpIHsKLSAgICAgICAgYWNjZXNzID0gQUNDRVNTX1JFQUQ7CisgICAgYWNjZXNzID0gQUNDRVNTX1JFQUQ7CiAgICAgfQogCiAjaWZkZWYgSEFWRV9GU1RBVAogIyAgaWZkZWYgX19WTVMKLQkvKiBvbiBPcGVuVk1TIHdlIG11c3QgZW5zdXJlIHRoYXQgYWxsIGJ5dGVzIGFyZSB3cml0dGVuIHRvIHRoZSBmaWxlICovCi0JaWYgKGZkICE9IC0xKSB7Ci0JICAgICAgICBmc3luYyhmZCk7Ci0JfQorICAgIC8qIG9uIE9wZW5WTVMgd2UgbXVzdCBlbnN1cmUgdGhhdCBhbGwgYnl0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUgKi8KKyAgICBpZiAoZmQgIT0gLTEpIHsKKyAgICAgICAgZnN5bmMoZmQpOworICAgIH0KICMgIGVuZGlmCi0JaWYgKGZkICE9IC0xICYmIGZzdGF0KGZkLCAmc3QpID09IDAgJiYgU19JU1JFRyhzdC5zdF9tb2RlKSkgewotCQlpZiAobWFwX3NpemUgPT0gMCkgewotCQkJbWFwX3NpemUgPSBzdC5zdF9zaXplOwotCQl9IGVsc2UgaWYgKChzaXplX3Qpb2Zmc2V0ICsgKHNpemVfdCltYXBfc2l6ZSA+IHN0LnN0X3NpemUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkibW1hcCBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGZpbGUgc2l6ZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKGZkICE9IC0xICYmIGZzdGF0KGZkLCAmc3QpID09IDAgJiYgU19JU1JFRyhzdC5zdF9tb2RlKSkgeworICAgICAgICBpZiAobWFwX3NpemUgPT0gMCkgeworICAgICAgICAgICAgbWFwX3NpemUgPSBzdC5zdF9zaXplOworICAgICAgICB9IGVsc2UgaWYgKChzaXplX3Qpb2Zmc2V0ICsgKHNpemVfdCltYXBfc2l6ZSA+IHN0LnN0X3NpemUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtbWFwIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gZmlsZSBzaXplIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgotCW1fb2JqID0gKG1tYXBfb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKG1fb2JqID09IE5VTEwpIHtyZXR1cm4gTlVMTDt9Ci0JbV9vYmotPmRhdGEgPSBOVUxMOwotCW1fb2JqLT5zaXplID0gKHNpemVfdCkgbWFwX3NpemU7Ci0JbV9vYmotPnBvcyA9IChzaXplX3QpIDA7Ci0gICAgICAgIG1fb2JqLT5vZmZzZXQgPSBvZmZzZXQ7Ci0JaWYgKGZkID09IC0xKSB7Ci0JCW1fb2JqLT5mZCA9IC0xOwotCQkvKiBBc3N1bWUgdGhlIGNhbGxlciB3YW50cyB0byBtYXAgYW5vbnltb3VzIG1lbW9yeS4KLQkJICAgVGhpcyBpcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgV2luZG93cy4gIG1tYXAubW1hcCgtMSwgc2l6ZSkKLQkJICAgb24gYm90aCBXaW5kb3dzIGFuZCBVbml4IG1hcCBhbm9ueW1vdXMgbWVtb3J5LgotCQkqLworICAgIG1fb2JqID0gKG1tYXBfb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKG1fb2JqID09IE5VTEwpIHtyZXR1cm4gTlVMTDt9CisgICAgbV9vYmotPmRhdGEgPSBOVUxMOworICAgIG1fb2JqLT5zaXplID0gKHNpemVfdCkgbWFwX3NpemU7CisgICAgbV9vYmotPnBvcyA9IChzaXplX3QpIDA7CisgICAgbV9vYmotPm9mZnNldCA9IG9mZnNldDsKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgbV9vYmotPmZkID0gLTE7CisgICAgICAgIC8qIEFzc3VtZSB0aGUgY2FsbGVyIHdhbnRzIHRvIG1hcCBhbm9ueW1vdXMgbWVtb3J5LgorICAgICAgICAgICBUaGlzIGlzIHRoZSBzYW1lIGJlaGF2aW91ciBhcyBXaW5kb3dzLiAgbW1hcC5tbWFwKC0xLCBzaXplKQorICAgICAgICAgICBvbiBib3RoIFdpbmRvd3MgYW5kIFVuaXggbWFwIGFub255bW91cyBtZW1vcnkuCisgICAgICAgICovCiAjaWZkZWYgTUFQX0FOT05ZTU9VUwotCQkvKiBCU0Qgd2F5IHRvIG1hcCBhbm9ueW1vdXMgbWVtb3J5ICovCi0JCWZsYWdzIHw9IE1BUF9BTk9OWU1PVVM7CisgICAgICAgIC8qIEJTRCB3YXkgdG8gbWFwIGFub255bW91cyBtZW1vcnkgKi8KKyAgICAgICAgZmxhZ3MgfD0gTUFQX0FOT05ZTU9VUzsKICNlbHNlCi0JCS8qIFNWUjQgbWV0aG9kIHRvIG1hcCBhbm9ueW1vdXMgbWVtb3J5IGlzIHRvIG9wZW4gL2Rldi96ZXJvICovCi0JCWZkID0gZGV2emVybyA9IG9wZW4oIi9kZXYvemVybyIsIE9fUkRXUik7Ci0JCWlmIChkZXZ6ZXJvID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYobV9vYmopOwotCQkJUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIC8qIFNWUjQgbWV0aG9kIHRvIG1hcCBhbm9ueW1vdXMgbWVtb3J5IGlzIHRvIG9wZW4gL2Rldi96ZXJvICovCisgICAgICAgIGZkID0gZGV2emVybyA9IG9wZW4oIi9kZXYvemVybyIsIE9fUkRXUik7CisgICAgICAgIGlmIChkZXZ6ZXJvID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobV9vYmopOworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYKLQl9IGVsc2UgewotCQltX29iai0+ZmQgPSBkdXAoZmQpOwotCQlpZiAobV9vYmotPmZkID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYobV9vYmopOwotCQkJUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCQotCW1fb2JqLT5kYXRhID0gbW1hcChOVUxMLCBtYXBfc2l6ZSwKLQkJCSAgIHByb3QsIGZsYWdzLAotCQkJICAgZmQsIG9mZnNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9vYmotPmZkID0gZHVwKGZkKTsKKyAgICAgICAgaWYgKG1fb2JqLT5mZCA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChkZXZ6ZXJvICE9IC0xKSB7Ci0JCWNsb3NlKGRldnplcm8pOwotCX0KKyAgICBtX29iai0+ZGF0YSA9IG1tYXAoTlVMTCwgbWFwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHByb3QsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBmZCwgb2Zmc2V0KTsKIAotCWlmIChtX29iai0+ZGF0YSA9PSAoY2hhciAqKS0xKSB7Ci0JICAgICAgICBtX29iai0+ZGF0YSA9IE5VTEw7Ci0JCVB5X0RFQ1JFRihtX29iaik7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhtbWFwX21vZHVsZV9lcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltX29iai0+YWNjZXNzID0gKGFjY2Vzc19tb2RlKWFjY2VzczsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbV9vYmo7CisgICAgaWYgKGRldnplcm8gIT0gLTEpIHsKKyAgICAgICAgY2xvc2UoZGV2emVybyk7CisgICAgfQorCisgICAgaWYgKG1fb2JqLT5kYXRhID09IChjaGFyICopLTEpIHsKKyAgICAgICAgbV9vYmotPmRhdGEgPSBOVUxMOworICAgICAgICBQeV9ERUNSRUYobV9vYmopOworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbV9vYmotPmFjY2VzcyA9IChhY2Nlc3NfbW9kZSlhY2Nlc3M7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW1fb2JqOwogfQogI2VuZGlmIC8qIFVOSVggKi8KIApAQCAtMTIyMywyNTAgKzEyMjMsMjUwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmV3X21tYXBfb2JqZWN0KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RpY3QpCiB7Ci0JbW1hcF9vYmplY3QgKm1fb2JqOwotCVB5T2JqZWN0ICptYXBfc2l6ZV9vYmogPSBOVUxMLCAqb2Zmc2V0X29iaiA9IE5VTEw7Ci0JUHlfc3NpemVfdCBtYXBfc2l6ZSwgb2Zmc2V0OwotCURXT1JEIG9mZl9oaTsJLyogdXBwZXIgMzIgYml0cyBvZiBvZmZzZXQgKi8KLQlEV09SRCBvZmZfbG87CS8qIGxvd2VyIDMyIGJpdHMgb2Ygb2Zmc2V0ICovCi0JRFdPUkQgc2l6ZV9oaTsJLyogdXBwZXIgMzIgYml0cyBvZiBzaXplICovCi0JRFdPUkQgc2l6ZV9sbzsJLyogbG93ZXIgMzIgYml0cyBvZiBzaXplICovCi0JY2hhciAqdGFnbmFtZSA9ICIiOwotCURXT1JEIGR3RXJyID0gMDsKLQlpbnQgZmlsZW5vOwotCUhBTkRMRSBmaCA9IDA7Ci0JaW50IGFjY2VzcyA9IChhY2Nlc3NfbW9kZSlBQ0NFU1NfREVGQVVMVDsKLQlEV09SRCBmbFByb3RlY3QsIGR3RGVzaXJlZEFjY2VzczsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsgImZpbGVubyIsICJsZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ25hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VzcyIsICJvZmZzZXQiLCBOVUxMIH07CisgICAgbW1hcF9vYmplY3QgKm1fb2JqOworICAgIFB5T2JqZWN0ICptYXBfc2l6ZV9vYmogPSBOVUxMLCAqb2Zmc2V0X29iaiA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBtYXBfc2l6ZSwgb2Zmc2V0OworICAgIERXT1JEIG9mZl9oaTsgICAgICAgLyogdXBwZXIgMzIgYml0cyBvZiBvZmZzZXQgKi8KKyAgICBEV09SRCBvZmZfbG87ICAgICAgIC8qIGxvd2VyIDMyIGJpdHMgb2Ygb2Zmc2V0ICovCisgICAgRFdPUkQgc2l6ZV9oaTsgICAgICAvKiB1cHBlciAzMiBiaXRzIG9mIHNpemUgKi8KKyAgICBEV09SRCBzaXplX2xvOyAgICAgIC8qIGxvd2VyIDMyIGJpdHMgb2Ygc2l6ZSAqLworICAgIGNoYXIgKnRhZ25hbWUgPSAiIjsKKyAgICBEV09SRCBkd0VyciA9IDA7CisgICAgaW50IGZpbGVubzsKKyAgICBIQU5ETEUgZmggPSAwOworICAgIGludCBhY2Nlc3MgPSAoYWNjZXNzX21vZGUpQUNDRVNTX0RFRkFVTFQ7CisgICAgRFdPUkQgZmxQcm90ZWN0LCBkd0Rlc2lyZWRBY2Nlc3M7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ICJmaWxlbm8iLCAibGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhZ25hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzIiwgIm9mZnNldCIsIE5VTEwgfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGljdCwgImlPfHppTyIsIGtleXdvcmRzLAotCQkJCQkgJmZpbGVubywgJm1hcF9zaXplX29iaiwKLQkJCQkJICZ0YWduYW1lLCAmYWNjZXNzLCAmb2Zmc2V0X29iaikpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGljdCwgImlPfHppTyIsIGtleXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlbm8sICZtYXBfc2l6ZV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhZ25hbWUsICZhY2Nlc3MsICZvZmZzZXRfb2JqKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzd2l0Y2goKGFjY2Vzc19tb2RlKWFjY2VzcykgewotCWNhc2UgQUNDRVNTX1JFQUQ6Ci0JCWZsUHJvdGVjdCA9IFBBR0VfUkVBRE9OTFk7Ci0JCWR3RGVzaXJlZEFjY2VzcyA9IEZJTEVfTUFQX1JFQUQ7Ci0JCWJyZWFrOwotCWNhc2UgQUNDRVNTX0RFRkFVTFQ6ICBjYXNlIEFDQ0VTU19XUklURToKLQkJZmxQcm90ZWN0ID0gUEFHRV9SRUFEV1JJVEU7Ci0JCWR3RGVzaXJlZEFjY2VzcyA9IEZJTEVfTUFQX1dSSVRFOwotCQlicmVhazsKLQljYXNlIEFDQ0VTU19DT1BZOgotCQlmbFByb3RlY3QgPSBQQUdFX1dSSVRFQ09QWTsKLQkJZHdEZXNpcmVkQWNjZXNzID0gRklMRV9NQVBfQ09QWTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAibW1hcCBpbnZhbGlkIGFjY2VzcyBwYXJhbWV0ZXIuIik7Ci0JfQorICAgIHN3aXRjaCgoYWNjZXNzX21vZGUpYWNjZXNzKSB7CisgICAgY2FzZSBBQ0NFU1NfUkVBRDoKKyAgICAgICAgZmxQcm90ZWN0ID0gUEFHRV9SRUFET05MWTsKKyAgICAgICAgZHdEZXNpcmVkQWNjZXNzID0gRklMRV9NQVBfUkVBRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBQ0NFU1NfREVGQVVMVDogIGNhc2UgQUNDRVNTX1dSSVRFOgorICAgICAgICBmbFByb3RlY3QgPSBQQUdFX1JFQURXUklURTsKKyAgICAgICAgZHdEZXNpcmVkQWNjZXNzID0gRklMRV9NQVBfV1JJVEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDRVNTX0NPUFk6CisgICAgICAgIGZsUHJvdGVjdCA9IFBBR0VfV1JJVEVDT1BZOworICAgICAgICBkd0Rlc2lyZWRBY2Nlc3MgPSBGSUxFX01BUF9DT1BZOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1tYXAgaW52YWxpZCBhY2Nlc3MgcGFyYW1ldGVyLiIpOworICAgIH0KIAotCW1hcF9zaXplID0gX0dldE1hcFNpemUobWFwX3NpemVfb2JqLCAic2l6ZSIpOwotCWlmIChtYXBfc2l6ZSA8IDApCi0JCXJldHVybiBOVUxMOwotICAgICAgICBvZmZzZXQgPSBfR2V0TWFwU2l6ZShvZmZzZXRfb2JqLCAib2Zmc2V0Iik7Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hcF9zaXplID0gX0dldE1hcFNpemUobWFwX3NpemVfb2JqLCAic2l6ZSIpOworICAgIGlmIChtYXBfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9mZnNldCA9IF9HZXRNYXBTaXplKG9mZnNldF9vYmosICJvZmZzZXQiKTsKKyAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBhc3N1bWUgLTEgYW5kIDAgYm90aCBtZWFuIGludmFsaWQgZmlsZWRlc2NyaXB0b3IKLQkgICB0byAnYW5vbnltb3VzbHknIG1hcCBtZW1vcnkuCi0JICAgWFhYOiBmaWxlbm8gPT0gMCBpcyBhIHZhbGlkIGZkLCBidXQgd2FzIGFjY2VwdGVkIHByaW9yIHRvIDIuNS4KLQkgICBYWFg6IFNob3VsZCB0aGlzIGNvZGUgYmUgYWRkZWQ/Ci0JICAgaWYgKGZpbGVubyA9PSAwKQotCSAgIAlQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCSAgICJkb24ndCB1c2UgMCBmb3IgYW5vbnltb3VzIG1lbW9yeSIpOwotCSAqLwotCWlmIChmaWxlbm8gIT0gLTEgJiYgZmlsZW5vICE9IDApIHsKLQkJZmggPSAoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZpbGVubyk7Ci0JCWlmIChmaD09KEhBTkRMRSktMSkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKG1tYXBfbW9kdWxlX2Vycm9yKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIFdpbjl4IGFwcGVhcnMgdG8gbmVlZCB1cyBzZWVrZWQgdG8gemVybyAqLwotCQlsc2VlayhmaWxlbm8sIDAsIFNFRUtfU0VUKTsKLQl9CisgICAgLyogYXNzdW1lIC0xIGFuZCAwIGJvdGggbWVhbiBpbnZhbGlkIGZpbGVkZXNjcmlwdG9yCisgICAgICAgdG8gJ2Fub255bW91c2x5JyBtYXAgbWVtb3J5LgorICAgICAgIFhYWDogZmlsZW5vID09IDAgaXMgYSB2YWxpZCBmZCwgYnV0IHdhcyBhY2NlcHRlZCBwcmlvciB0byAyLjUuCisgICAgICAgWFhYOiBTaG91bGQgdGhpcyBjb2RlIGJlIGFkZGVkPworICAgICAgIGlmIChmaWxlbm8gPT0gMCkKKyAgICAgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgImRvbid0IHVzZSAwIGZvciBhbm9ueW1vdXMgbWVtb3J5Iik7CisgICAgICovCisgICAgaWYgKGZpbGVubyAhPSAtMSAmJiBmaWxlbm8gIT0gMCkgeworICAgICAgICBmaCA9IChIQU5ETEUpX2dldF9vc2ZoYW5kbGUoZmlsZW5vKTsKKyAgICAgICAgaWYgKGZoPT0oSEFORExFKS0xKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8obW1hcF9tb2R1bGVfZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogV2luOXggYXBwZWFycyB0byBuZWVkIHVzIHNlZWtlZCB0byB6ZXJvICovCisgICAgICAgIGxzZWVrKGZpbGVubywgMCwgU0VFS19TRVQpOworICAgIH0KIAotCW1fb2JqID0gKG1tYXBfb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKG1fb2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCS8qIFNldCBldmVyeSBmaWVsZCB0byBhbiBpbnZhbGlkIG1hcmtlciwgc28gd2UgY2FuIHNhZmVseQotCSAgIGRlc3RydWN0IHRoZSBvYmplY3QgaW4gdGhlIGZhY2Ugb2YgZmFpbHVyZSAqLwotCW1fb2JqLT5kYXRhID0gTlVMTDsKLQltX29iai0+ZmlsZV9oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQltX29iai0+bWFwX2hhbmRsZSA9IE5VTEw7Ci0JbV9vYmotPnRhZ25hbWUgPSBOVUxMOwotCW1fb2JqLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgbV9vYmogPSAobW1hcF9vYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobV9vYmogPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogU2V0IGV2ZXJ5IGZpZWxkIHRvIGFuIGludmFsaWQgbWFya2VyLCBzbyB3ZSBjYW4gc2FmZWx5CisgICAgICAgZGVzdHJ1Y3QgdGhlIG9iamVjdCBpbiB0aGUgZmFjZSBvZiBmYWlsdXJlICovCisgICAgbV9vYmotPmRhdGEgPSBOVUxMOworICAgIG1fb2JqLT5maWxlX2hhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIG1fb2JqLT5tYXBfaGFuZGxlID0gTlVMTDsKKyAgICBtX29iai0+dGFnbmFtZSA9IE5VTEw7CisgICAgbV9vYmotPm9mZnNldCA9IG9mZnNldDsKIAotCWlmIChmaCkgewotCQkvKiBJdCBpcyBuZWNlc3NhcnkgdG8gZHVwbGljYXRlIHRoZSBoYW5kbGUsIHNvIHRoZQotCQkgICBQeXRob24gY29kZSBjYW4gY2xvc2UgaXQgb24gdXMgKi8KLQkJaWYgKCFEdXBsaWNhdGVIYW5kbGUoCi0JCQlHZXRDdXJyZW50UHJvY2VzcygpLCAvKiBzb3VyY2UgcHJvY2VzcyBoYW5kbGUgKi8KLQkJCWZoLCAvKiBoYW5kbGUgdG8gYmUgZHVwbGljYXRlZCAqLwotCQkJR2V0Q3VycmVudFByb2Nlc3MoKSwgLyogdGFyZ2V0IHByb2MgaGFuZGxlICovCi0JCQkoTFBIQU5ETEUpJm1fb2JqLT5maWxlX2hhbmRsZSwgLyogcmVzdWx0ICovCi0JCQkwLCAvKiBhY2Nlc3MgLSBpZ25vcmVkIGR1ZSB0byBvcHRpb25zIHZhbHVlICovCi0JCQlGQUxTRSwgLyogaW5oZXJpdGVkIGJ5IGNoaWxkIHByb2Nlc3Nlcz8gKi8KLQkJCURVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsgLyogb3B0aW9ucyAqLwotCQkJZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKLQkJCVB5X0RFQ1JFRihtX29iaik7Ci0JCQlQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0Vycik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIW1hcF9zaXplKSB7Ci0JCQlEV09SRCBsb3csaGlnaDsKLQkJCWxvdyA9IEdldEZpbGVTaXplKGZoLCAmaGlnaCk7Ci0JCQkvKiBsb3cgbWlnaHQganVzdCBoYXBwZW4gdG8gaGF2ZSB0aGUgdmFsdWUgSU5WQUxJRF9GSUxFX1NJWkU7Ci0gICAgCQkJICAgc28gd2UgbmVlZCB0byBjaGVjayB0aGUgbGFzdCBlcnJvciBhbHNvLiAqLwotCQkJaWYgKGxvdyA9PSBJTlZBTElEX0ZJTEVfU0laRSAmJgotCQkJICAgIChkd0VyciA9IEdldExhc3RFcnJvcigpKSAhPSBOT19FUlJPUikgewotCQkJCVB5X0RFQ1JFRihtX29iaik7Ci0JCQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGR3RXJyKTsKLQkJCX0JCi0JCQkJICAgIAorICAgIGlmIChmaCkgeworICAgICAgICAvKiBJdCBpcyBuZWNlc3NhcnkgdG8gZHVwbGljYXRlIHRoZSBoYW5kbGUsIHNvIHRoZQorICAgICAgICAgICBQeXRob24gY29kZSBjYW4gY2xvc2UgaXQgb24gdXMgKi8KKyAgICAgICAgaWYgKCFEdXBsaWNhdGVIYW5kbGUoCisgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2VzcygpLCAvKiBzb3VyY2UgcHJvY2VzcyBoYW5kbGUgKi8KKyAgICAgICAgICAgIGZoLCAvKiBoYW5kbGUgdG8gYmUgZHVwbGljYXRlZCAqLworICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3MoKSwgLyogdGFyZ2V0IHByb2MgaGFuZGxlICovCisgICAgICAgICAgICAoTFBIQU5ETEUpJm1fb2JqLT5maWxlX2hhbmRsZSwgLyogcmVzdWx0ICovCisgICAgICAgICAgICAwLCAvKiBhY2Nlc3MgLSBpZ25vcmVkIGR1ZSB0byBvcHRpb25zIHZhbHVlICovCisgICAgICAgICAgICBGQUxTRSwgLyogaW5oZXJpdGVkIGJ5IGNoaWxkIHByb2Nlc3Nlcz8gKi8KKyAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUykpIHsgLyogb3B0aW9ucyAqLworICAgICAgICAgICAgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihtX29iaik7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tV2luZG93c0Vycihkd0Vycik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1hcF9zaXplKSB7CisgICAgICAgICAgICBEV09SRCBsb3csaGlnaDsKKyAgICAgICAgICAgIGxvdyA9IEdldEZpbGVTaXplKGZoLCAmaGlnaCk7CisgICAgICAgICAgICAvKiBsb3cgbWlnaHQganVzdCBoYXBwZW4gdG8gaGF2ZSB0aGUgdmFsdWUgSU5WQUxJRF9GSUxFX1NJWkU7CisgICAgICAgICAgICAgICBzbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBsYXN0IGVycm9yIGFsc28uICovCisgICAgICAgICAgICBpZiAobG93ID09IElOVkFMSURfRklMRV9TSVpFICYmCisgICAgICAgICAgICAgICAgKGR3RXJyID0gR2V0TGFzdEVycm9yKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1fb2JqKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoZHdFcnIpOworICAgICAgICAgICAgfQorCiAjaWYgU0laRU9GX1NJWkVfVCA+IDQKLQkJCW1fb2JqLT5zaXplID0gKCgoc2l6ZV90KWhpZ2gpPDwzMikgKyBsb3c7CisgICAgICAgICAgICBtX29iai0+c2l6ZSA9ICgoKHNpemVfdCloaWdoKTw8MzIpICsgbG93OwogI2Vsc2UKLQkJCWlmIChoaWdoKQotCQkJCS8qIEZpbGUgaXMgdG9vIGxhcmdlIHRvIG1hcCBjb21wbGV0ZWx5ICovCi0JCQkJbV9vYmotPnNpemUgPSAoc2l6ZV90KS0xOwotCQkJZWxzZQotCQkJCW1fb2JqLT5zaXplID0gbG93OworICAgICAgICAgICAgaWYgKGhpZ2gpCisgICAgICAgICAgICAgICAgLyogRmlsZSBpcyB0b28gbGFyZ2UgdG8gbWFwIGNvbXBsZXRlbHkgKi8KKyAgICAgICAgICAgICAgICBtX29iai0+c2l6ZSA9IChzaXplX3QpLTE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9vYmotPnNpemUgPSBsb3c7CiAjZW5kaWYKLQkJfSBlbHNlIHsKLQkJCW1fb2JqLT5zaXplID0gbWFwX3NpemU7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCW1fb2JqLT5zaXplID0gbWFwX3NpemU7Ci0JfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9vYmotPnNpemUgPSBtYXBfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbV9vYmotPnNpemUgPSBtYXBfc2l6ZTsKKyAgICB9CiAKLQkvKiBzZXQgdGhlIGluaXRpYWwgcG9zaXRpb24gKi8KLQltX29iai0+cG9zID0gKHNpemVfdCkgMDsKKyAgICAvKiBzZXQgdGhlIGluaXRpYWwgcG9zaXRpb24gKi8KKyAgICBtX29iai0+cG9zID0gKHNpemVfdCkgMDsKIAotCS8qIHNldCB0aGUgdGFnIG5hbWUgKi8KLQlpZiAodGFnbmFtZSAhPSBOVUxMICYmICp0YWduYW1lICE9ICdcMCcpIHsKLQkJbV9vYmotPnRhZ25hbWUgPSBQeU1lbV9NYWxsb2Moc3RybGVuKHRhZ25hbWUpKzEpOwotCQlpZiAobV9vYmotPnRhZ25hbWUgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCVB5X0RFQ1JFRihtX29iaik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzdHJjcHkobV9vYmotPnRhZ25hbWUsIHRhZ25hbWUpOwotCX0KLQllbHNlCi0JCW1fb2JqLT50YWduYW1lID0gTlVMTDsKKyAgICAvKiBzZXQgdGhlIHRhZyBuYW1lICovCisgICAgaWYgKHRhZ25hbWUgIT0gTlVMTCAmJiAqdGFnbmFtZSAhPSAnXDAnKSB7CisgICAgICAgIG1fb2JqLT50YWduYW1lID0gUHlNZW1fTWFsbG9jKHN0cmxlbih0YWduYW1lKSsxKTsKKyAgICAgICAgaWYgKG1fb2JqLT50YWduYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBQeV9ERUNSRUYobV9vYmopOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KG1fb2JqLT50YWduYW1lLCB0YWduYW1lKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBtX29iai0+dGFnbmFtZSA9IE5VTEw7CiAKLQltX29iai0+YWNjZXNzID0gKGFjY2Vzc19tb2RlKWFjY2VzczsKLQkvKiBEV09SRCBpcyBhIDQtYnl0ZSBpbnQuICBJZiB3ZSdyZSBvbiBhIGJveCB3aGVyZSBzaXplX3QgY29uc3VtZXMKLQkgKiBtb3JlIHRoYW4gNCBieXRlcywgd2UgbmVlZCB0byBicmVhayBpdCBhcGFydC4gIEVsc2UgKHNpemVfdAotCSAqIGNvbnN1bWVzIDQgYnl0ZXMpLCBDIGRvZXNuJ3QgZGVmaW5lIHdoYXQgaGFwcGVucyBpZiB3ZSBzaGlmdAotCSAqIHJpZ2h0IGJ5IDMyLCBzbyB3ZSBuZWVkIGRpZmZlcmVudCBjb2RlLgotCSAqLworICAgIG1fb2JqLT5hY2Nlc3MgPSAoYWNjZXNzX21vZGUpYWNjZXNzOworICAgIC8qIERXT1JEIGlzIGEgNC1ieXRlIGludC4gIElmIHdlJ3JlIG9uIGEgYm94IHdoZXJlIHNpemVfdCBjb25zdW1lcworICAgICAqIG1vcmUgdGhhbiA0IGJ5dGVzLCB3ZSBuZWVkIHRvIGJyZWFrIGl0IGFwYXJ0LiAgRWxzZSAoc2l6ZV90CisgICAgICogY29uc3VtZXMgNCBieXRlcyksIEMgZG9lc24ndCBkZWZpbmUgd2hhdCBoYXBwZW5zIGlmIHdlIHNoaWZ0CisgICAgICogcmlnaHQgYnkgMzIsIHNvIHdlIG5lZWQgZGlmZmVyZW50IGNvZGUuCisgICAgICovCiAjaWYgU0laRU9GX1NJWkVfVCA+IDQKLQlzaXplX2hpID0gKERXT1JEKSgob2Zmc2V0ICsgbV9vYmotPnNpemUpID4+IDMyKTsKLQlzaXplX2xvID0gKERXT1JEKSgob2Zmc2V0ICsgbV9vYmotPnNpemUpICYgMHhGRkZGRkZGRik7Ci0Jb2ZmX2hpID0gKERXT1JEKShvZmZzZXQgPj4gMzIpOwotCW9mZl9sbyA9IChEV09SRCkob2Zmc2V0ICYgMHhGRkZGRkZGRik7CisgICAgc2l6ZV9oaSA9IChEV09SRCkoKG9mZnNldCArIG1fb2JqLT5zaXplKSA+PiAzMik7CisgICAgc2l6ZV9sbyA9IChEV09SRCkoKG9mZnNldCArIG1fb2JqLT5zaXplKSAmIDB4RkZGRkZGRkYpOworICAgIG9mZl9oaSA9IChEV09SRCkob2Zmc2V0ID4+IDMyKTsKKyAgICBvZmZfbG8gPSAoRFdPUkQpKG9mZnNldCAmIDB4RkZGRkZGRkYpOwogI2Vsc2UKLQlzaXplX2hpID0gMDsKLQlzaXplX2xvID0gKERXT1JEKShvZmZzZXQgKyBtX29iai0+c2l6ZSk7Ci0Jb2ZmX2hpID0gMDsKLQlvZmZfbG8gPSAoRFdPUkQpb2Zmc2V0OworICAgIHNpemVfaGkgPSAwOworICAgIHNpemVfbG8gPSAoRFdPUkQpKG9mZnNldCArIG1fb2JqLT5zaXplKTsKKyAgICBvZmZfaGkgPSAwOworICAgIG9mZl9sbyA9IChEV09SRClvZmZzZXQ7CiAjZW5kaWYKLQkvKiBGb3IgZmlsZXMsIGl0IHdvdWxkIGJlIHN1ZmZpY2llbnQgdG8gcGFzcyAwIGFzIHNpemUuCi0JICAgRm9yIGFub255bW91cyBtYXBzLCB3ZSBoYXZlIHRvIHBhc3MgdGhlIHNpemUgZXhwbGljaXRseS4gKi8KLQltX29iai0+bWFwX2hhbmRsZSA9IENyZWF0ZUZpbGVNYXBwaW5nKG1fb2JqLT5maWxlX2hhbmRsZSwKLQkJCQkJICAgICAgTlVMTCwKLQkJCQkJICAgICAgZmxQcm90ZWN0LAotCQkJCQkgICAgICBzaXplX2hpLAotCQkJCQkgICAgICBzaXplX2xvLAotCQkJCQkgICAgICBtX29iai0+dGFnbmFtZSk7Ci0JaWYgKG1fb2JqLT5tYXBfaGFuZGxlICE9IE5VTEwpIHsKLQkJbV9vYmotPmRhdGEgPSAoY2hhciAqKSBNYXBWaWV3T2ZGaWxlKG1fb2JqLT5tYXBfaGFuZGxlLAotCQkJCQkJICAgICBkd0Rlc2lyZWRBY2Nlc3MsCi0JCQkJCQkgICAgIG9mZl9oaSwKLQkJCQkJCSAgICAgb2ZmX2xvLAotCQkJCQkJICAgICBtX29iai0+c2l6ZSk7Ci0JCWlmIChtX29iai0+ZGF0YSAhPSBOVUxMKQotCQkJcmV0dXJuIChQeU9iamVjdCAqKW1fb2JqOwotCQllbHNlIHsKLQkJCWR3RXJyID0gR2V0TGFzdEVycm9yKCk7Ci0JCQlDbG9zZUhhbmRsZShtX29iai0+bWFwX2hhbmRsZSk7Ci0JCQltX29iai0+bWFwX2hhbmRsZSA9IE5VTEw7Ci0JCX0KLQl9IGVsc2UKLQkJZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKLQlQeV9ERUNSRUYobV9vYmopOwotCVB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGR3RXJyKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAvKiBGb3IgZmlsZXMsIGl0IHdvdWxkIGJlIHN1ZmZpY2llbnQgdG8gcGFzcyAwIGFzIHNpemUuCisgICAgICAgRm9yIGFub255bW91cyBtYXBzLCB3ZSBoYXZlIHRvIHBhc3MgdGhlIHNpemUgZXhwbGljaXRseS4gKi8KKyAgICBtX29iai0+bWFwX2hhbmRsZSA9IENyZWF0ZUZpbGVNYXBwaW5nKG1fb2JqLT5maWxlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbFByb3RlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX2hpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9sbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb2JqLT50YWduYW1lKTsKKyAgICBpZiAobV9vYmotPm1hcF9oYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBtX29iai0+ZGF0YSA9IChjaGFyICopIE1hcFZpZXdPZkZpbGUobV9vYmotPm1hcF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0Rlc2lyZWRBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfaGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfbG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX29iai0+c2l6ZSk7CisgICAgICAgIGlmIChtX29iai0+ZGF0YSAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW1fb2JqOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGR3RXJyID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBDbG9zZUhhbmRsZShtX29iai0+bWFwX2hhbmRsZSk7CisgICAgICAgICAgICBtX29iai0+bWFwX2hhbmRsZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgZHdFcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBQeV9ERUNSRUYobV9vYmopOworICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGR3RXJyKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KICNlbmRpZiAvKiBNU19XSU5ET1dTICovCiAKIHN0YXRpYyB2b2lkCiBzZXRpbnQoUHlPYmplY3QgKmQsIGNvbnN0IGNoYXIgKm5hbWUsIGxvbmcgdmFsdWUpCiB7Ci0JUHlPYmplY3QgKm8gPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7Ci0JaWYgKG8gJiYgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgbykgPT0gMCkgewotCQlQeV9ERUNSRUYobyk7Ci0JfQorICAgIFB5T2JqZWN0ICpvID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworICAgIGlmIChvICYmIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIG8pID09IDApIHsKKyAgICAgICAgUHlfREVDUkVGKG8pOworICAgIH0KIH0KIAogUHlNT0RJTklUX0ZVTkMKIGluaXRtbWFwKHZvaWQpCiB7Ci0JUHlPYmplY3QgKmRpY3QsICptb2R1bGU7CisgICAgUHlPYmplY3QgKmRpY3QsICptb2R1bGU7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZtbWFwX29iamVjdF90eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZtbWFwX29iamVjdF90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCW1vZHVsZSA9IFB5X0luaXRNb2R1bGUoIm1tYXAiLCBOVUxMKTsKLQlpZiAobW9kdWxlID09IE5VTEwpCi0JCXJldHVybjsKLQlkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2R1bGUpOwotCWlmICghZGljdCkKLQkJcmV0dXJuOwotCW1tYXBfbW9kdWxlX2Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJtbWFwLmVycm9yIiwKLQkJUHlFeGNfRW52aXJvbm1lbnRFcnJvciAsIE5VTEwpOwotCWlmIChtbWFwX21vZHVsZV9lcnJvciA9PSBOVUxMKQotCQlyZXR1cm47Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgImVycm9yIiwgbW1hcF9tb2R1bGVfZXJyb3IpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJtbWFwIiwgKFB5T2JqZWN0KikgJm1tYXBfb2JqZWN0X3R5cGUpOworICAgIG1vZHVsZSA9IFB5X0luaXRNb2R1bGUoIm1tYXAiLCBOVUxMKTsKKyAgICBpZiAobW9kdWxlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2R1bGUpOworICAgIGlmICghZGljdCkKKyAgICAgICAgcmV0dXJuOworICAgIG1tYXBfbW9kdWxlX2Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJtbWFwLmVycm9yIiwKKyAgICAgICAgUHlFeGNfRW52aXJvbm1lbnRFcnJvciAsIE5VTEwpOworICAgIGlmIChtbWFwX21vZHVsZV9lcnJvciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgImVycm9yIiwgbW1hcF9tb2R1bGVfZXJyb3IpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJtbWFwIiwgKFB5T2JqZWN0KikgJm1tYXBfb2JqZWN0X3R5cGUpOwogI2lmZGVmIFBST1RfRVhFQwotCXNldGludChkaWN0LCAiUFJPVF9FWEVDIiwgUFJPVF9FWEVDKTsKKyAgICBzZXRpbnQoZGljdCwgIlBST1RfRVhFQyIsIFBST1RfRVhFQyk7CiAjZW5kaWYKICNpZmRlZiBQUk9UX1JFQUQKLQlzZXRpbnQoZGljdCwgIlBST1RfUkVBRCIsIFBST1RfUkVBRCk7CisgICAgc2V0aW50KGRpY3QsICJQUk9UX1JFQUQiLCBQUk9UX1JFQUQpOwogI2VuZGlmCiAjaWZkZWYgUFJPVF9XUklURQotCXNldGludChkaWN0LCAiUFJPVF9XUklURSIsIFBST1RfV1JJVEUpOworICAgIHNldGludChkaWN0LCAiUFJPVF9XUklURSIsIFBST1RfV1JJVEUpOwogI2VuZGlmCiAKICNpZmRlZiBNQVBfU0hBUkVECi0Jc2V0aW50KGRpY3QsICJNQVBfU0hBUkVEIiwgTUFQX1NIQVJFRCk7CisgICAgc2V0aW50KGRpY3QsICJNQVBfU0hBUkVEIiwgTUFQX1NIQVJFRCk7CiAjZW5kaWYKICNpZmRlZiBNQVBfUFJJVkFURQotCXNldGludChkaWN0LCAiTUFQX1BSSVZBVEUiLCBNQVBfUFJJVkFURSk7CisgICAgc2V0aW50KGRpY3QsICJNQVBfUFJJVkFURSIsIE1BUF9QUklWQVRFKTsKICNlbmRpZgogI2lmZGVmIE1BUF9ERU5ZV1JJVEUKLQlzZXRpbnQoZGljdCwgIk1BUF9ERU5ZV1JJVEUiLCBNQVBfREVOWVdSSVRFKTsKKyAgICBzZXRpbnQoZGljdCwgIk1BUF9ERU5ZV1JJVEUiLCBNQVBfREVOWVdSSVRFKTsKICNlbmRpZgogI2lmZGVmIE1BUF9FWEVDVVRBQkxFCi0Jc2V0aW50KGRpY3QsICJNQVBfRVhFQ1VUQUJMRSIsIE1BUF9FWEVDVVRBQkxFKTsKKyAgICBzZXRpbnQoZGljdCwgIk1BUF9FWEVDVVRBQkxFIiwgTUFQX0VYRUNVVEFCTEUpOwogI2VuZGlmCiAjaWZkZWYgTUFQX0FOT05ZTU9VUwotCXNldGludChkaWN0LCAiTUFQX0FOT04iLCBNQVBfQU5PTllNT1VTKTsKLQlzZXRpbnQoZGljdCwgIk1BUF9BTk9OWU1PVVMiLCBNQVBfQU5PTllNT1VTKTsKKyAgICBzZXRpbnQoZGljdCwgIk1BUF9BTk9OIiwgTUFQX0FOT05ZTU9VUyk7CisgICAgc2V0aW50KGRpY3QsICJNQVBfQU5PTllNT1VTIiwgTUFQX0FOT05ZTU9VUyk7CiAjZW5kaWYKIAotCXNldGludChkaWN0LCAiUEFHRVNJWkUiLCAobG9uZylteV9nZXRwYWdlc2l6ZSgpKTsKKyAgICBzZXRpbnQoZGljdCwgIlBBR0VTSVpFIiwgKGxvbmcpbXlfZ2V0cGFnZXNpemUoKSk7CiAKLQlzZXRpbnQoZGljdCwgIkFMTE9DQVRJT05HUkFOVUxBUklUWSIsIChsb25nKW15X2dldGFsbG9jYXRpb25ncmFudWxhcml0eSgpKTsgCisgICAgc2V0aW50KGRpY3QsICJBTExPQ0FUSU9OR1JBTlVMQVJJVFkiLCAobG9uZylteV9nZXRhbGxvY2F0aW9uZ3JhbnVsYXJpdHkoKSk7CiAKLQlzZXRpbnQoZGljdCwgIkFDQ0VTU19SRUFEIiwgQUNDRVNTX1JFQUQpOwotCXNldGludChkaWN0LCAiQUNDRVNTX1dSSVRFIiwgQUNDRVNTX1dSSVRFKTsKLQlzZXRpbnQoZGljdCwgIkFDQ0VTU19DT1BZIiwgQUNDRVNTX0NPUFkpOworICAgIHNldGludChkaWN0LCAiQUNDRVNTX1JFQUQiLCBBQ0NFU1NfUkVBRCk7CisgICAgc2V0aW50KGRpY3QsICJBQ0NFU1NfV1JJVEUiLCBBQ0NFU1NfV1JJVEUpOworICAgIHNldGludChkaWN0LCAiQUNDRVNTX0NPUFkiLCBBQ0NFU1NfQ09QWSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL25pc21vZHVsZS5jIGIvTW9kdWxlcy9uaXNtb2R1bGUuYwppbmRleCA5ZmJhYjVhLi4wNGQ4NTcwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL25pc21vZHVsZS5jCisrKyBiL01vZHVsZXMvbmlzbW9kdWxlLmMKQEAgLTEsMTEgKzEsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgIFdyaXR0ZW4gYnk6Ci0JRnJlZCBHYW5zZXZsZXMgPEZyZWQuR2Fuc2V2bGVzQGNzLnV0d2VudGUubmw+Ci0JQiZPIGdyb3VwLAotCUZhY3VsdGVpdCBkZXIgSW5mb3JtYXRpY2EsCi0JVW5pdmVyc2l0ZWl0IFR3ZW50ZSwKLQlFbnNjaGVkZSwKLQl0aGUgTmV0aGVybGFuZHMuCisgICAgRnJlZCBHYW5zZXZsZXMgPEZyZWQuR2Fuc2V2bGVzQGNzLnV0d2VudGUubmw+CisgICAgQiZPIGdyb3VwLAorICAgIEZhY3VsdGVpdCBkZXIgSW5mb3JtYXRpY2EsCisgICAgVW5pdmVyc2l0ZWl0IFR3ZW50ZSwKKyAgICBFbnNjaGVkZSwKKyAgICB0aGUgTmV0aGVybGFuZHMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIE5JUyBtb2R1bGUgaW1wbGVtZW50YXRpb24gKi8KQEAgLTIzLDcgKzIzLDcgQEAKIGV4dGVybiBpbnQgeXBfZ2V0X2RlZmF1bHRfZG9tYWluKGNoYXIgKiopOwogI2VuZGlmCiAKLVB5RG9jX1NUUlZBUihnZXRfZGVmYXVsdF9kb21haW5fX2RvY19fLCAKK1B5RG9jX1NUUlZBUihnZXRfZGVmYXVsdF9kb21haW5fX2RvY19fLAogImdldF9kZWZhdWx0X2RvbWFpbigpIC0+IHN0clxuXAogQ29ycmVzcG9uZHMgdG8gdGhlIEMgbGlicmFyeSB5cF9nZXRfZGVmYXVsdF9kb21haW4oKSBjYWxsLCByZXR1cm5pbmdcblwKIHRoZSBkZWZhdWx0IE5JUyBkb21haW4uXG4iKTsKQEAgLTQ5LDQ0ICs0OSw0NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5pc19lcnJvciAoaW50IGVycikKIHsKLQlQeUVycl9TZXRTdHJpbmcoTmlzRXJyb3IsIHlwZXJyX3N0cmluZyhlcnIpKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoTmlzRXJyb3IsIHlwZXJyX3N0cmluZyhlcnIpKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHN0cnVjdCBuaXNfbWFwIHsKLQljaGFyICphbGlhczsKLQljaGFyICptYXA7Ci0JaW50ICBmaXg7CisgICAgY2hhciAqYWxpYXM7CisgICAgY2hhciAqbWFwOworICAgIGludCAgZml4OwogfSBhbGlhc2VzIFtdID0gewotCXsicGFzc3dkIiwJInBhc3N3ZC5ieW5hbWUiLAkwfSwKLQl7Imdyb3VwIiwJImdyb3VwLmJ5bmFtZSIsCQkwfSwKLQl7Im5ldHdvcmtzIiwJIm5ldHdvcmtzLmJ5YWRkciIsCTB9LAotCXsiaG9zdHMiLAkiaG9zdHMuYnluYW1lIiwJCTB9LAotCXsicHJvdG9jb2xzIiwJInByb3RvY29scy5ieW51bWJlciIsCTB9LAotCXsic2VydmljZXMiLAkic2VydmljZXMuYnluYW1lIiwJMH0sCi0JeyJhbGlhc2VzIiwJIm1haWwuYWxpYXNlcyIsCQkxfSwgLyogY3JlYXRlZCB3aXRoICdtYWtlZGJtIC1hJyAqLwotCXsiZXRoZXJzIiwJImV0aGVycy5ieW5hbWUiLAkwfSwKLQl7MEwsCQkwTCwJCQkwfQorICAgIHsicGFzc3dkIiwgICAgICAgICAgInBhc3N3ZC5ieW5hbWUiLCAgICAgICAgMH0sCisgICAgeyJncm91cCIsICAgICAgICAgICAiZ3JvdXAuYnluYW1lIiwgICAgICAgICAwfSwKKyAgICB7Im5ldHdvcmtzIiwgICAgICAgICJuZXR3b3Jrcy5ieWFkZHIiLCAgICAgIDB9LAorICAgIHsiaG9zdHMiLCAgICAgICAgICAgImhvc3RzLmJ5bmFtZSIsICAgICAgICAgMH0sCisgICAgeyJwcm90b2NvbHMiLCAgICAgICAicHJvdG9jb2xzLmJ5bnVtYmVyIiwgICAwfSwKKyAgICB7InNlcnZpY2VzIiwgICAgICAgICJzZXJ2aWNlcy5ieW5hbWUiLCAgICAgIDB9LAorICAgIHsiYWxpYXNlcyIsICAgICAgICAgIm1haWwuYWxpYXNlcyIsICAgICAgICAgMX0sIC8qIGNyZWF0ZWQgd2l0aCAnbWFrZWRibSAtYScgKi8KKyAgICB7ImV0aGVycyIsICAgICAgICAgICJldGhlcnMuYnluYW1lIiwgICAgICAgIDB9LAorICAgIHswTCwgICAgICAgICAgICAgICAgMEwsICAgICAgICAgICAgICAgICAgICAgMH0KIH07CiAKIHN0YXRpYyBjaGFyICoKIG5pc19tYXBuYW1lIChjaGFyICptYXAsIGludCAqcGZpeCkKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAotCSpwZml4ID0gMDsKLQlmb3IgKGk9MDsgYWxpYXNlc1tpXS5hbGlhcyAhPSAwTDsgaSsrKSB7Ci0JCWlmICghc3RyY21wIChhbGlhc2VzW2ldLmFsaWFzLCBtYXApKSB7Ci0JCQkqcGZpeCA9IGFsaWFzZXNbaV0uZml4OwotCQkJcmV0dXJuIGFsaWFzZXNbaV0ubWFwOwotCQl9Ci0JCWlmICghc3RyY21wIChhbGlhc2VzW2ldLm1hcCwgbWFwKSkgewotCQkJKnBmaXggPSBhbGlhc2VzW2ldLmZpeDsKLQkJCXJldHVybiBhbGlhc2VzW2ldLm1hcDsKLQkJfQotCX0KKyAgICAqcGZpeCA9IDA7CisgICAgZm9yIChpPTA7IGFsaWFzZXNbaV0uYWxpYXMgIT0gMEw7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5hbGlhcywgbWFwKSkgeworICAgICAgICAgICAgKnBmaXggPSBhbGlhc2VzW2ldLmZpeDsKKyAgICAgICAgICAgIHJldHVybiBhbGlhc2VzW2ldLm1hcDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5tYXAsIG1hcCkpIHsKKyAgICAgICAgICAgICpwZml4ID0gYWxpYXNlc1tpXS5maXg7CisgICAgICAgICAgICByZXR1cm4gYWxpYXNlc1tpXS5tYXA7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gbWFwOworICAgIHJldHVybiBtYXA7CiB9CiAKICNpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKQEAgLTk2LDE2OCArOTYsMTY4IEBACiAjZW5kaWYKIAogc3RydWN0IHlwY2FsbGJhY2tfZGF0YSB7Ci0JUHlPYmplY3QJKmRpY3Q7Ci0JaW50CQkJZml4OwotCVB5VGhyZWFkU3RhdGUgKnN0YXRlOworICAgIFB5T2JqZWN0ICAgICAgICAgICAgKmRpY3Q7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGZpeDsKKyAgICBQeVRocmVhZFN0YXRlICpzdGF0ZTsKIH07CiAKIHN0YXRpYyBpbnQKIG5pc19mb3JlYWNoIChpbnQgaW5zdGF0dXMsIGNoYXIgKmlua2V5LCBpbnQgaW5rZXlsZW4sIGNoYXIgKmludmFsLAogICAgICAgICAgICAgIGludCBpbnZhbGxlbiwgc3RydWN0IHlwY2FsbGJhY2tfZGF0YSAqaW5kYXRhKQogewotCWlmIChpbnN0YXR1cyA9PSBZUF9UUlVFKSB7Ci0JCVB5T2JqZWN0ICprZXk7Ci0JCVB5T2JqZWN0ICp2YWw7Ci0JCWludCBlcnI7CisgICAgaWYgKGluc3RhdHVzID09IFlQX1RSVUUpIHsKKyAgICAgICAgUHlPYmplY3QgKmtleTsKKyAgICAgICAgUHlPYmplY3QgKnZhbDsKKyAgICAgICAgaW50IGVycjsKIAotCQlQeUV2YWxfUmVzdG9yZVRocmVhZChpbmRhdGEtPnN0YXRlKTsKLQkJaWYgKGluZGF0YS0+Zml4KSB7Ci0JCSAgICBpZiAoaW5rZXlsZW4gPiAwICYmIGlua2V5W2lua2V5bGVuLTFdID09ICdcMCcpCi0JCQlpbmtleWxlbi0tOwotCQkgICAgaWYgKGludmFsbGVuID4gMCAmJiBpbnZhbFtpbnZhbGxlbi0xXSA9PSAnXDAnKQotCQkJaW52YWxsZW4tLTsKLQkJfQotCQlrZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShpbmtleSwgaW5rZXlsZW4pOwotCQl2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShpbnZhbCwgaW52YWxsZW4pOwotCQlpZiAoa2V5ID09IE5VTEwgfHwgdmFsID09IE5VTEwpIHsKLQkJCS8qIFhYWCBlcnJvciAtLSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgKi8KLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeV9YREVDUkVGKGtleSk7Ci0JCQlQeV9YREVDUkVGKHZhbCk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQllcnIgPSBQeURpY3RfU2V0SXRlbShpbmRhdGEtPmRpY3QsIGtleSwgdmFsKTsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCVB5X0RFQ1JFRih2YWwpOwotCQlpZiAoZXJyICE9IDApCi0JCQlQeUVycl9DbGVhcigpOwotCQlpbmRhdGEtPnN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKLQkJaWYgKGVyciAhPSAwKQotCQkgIAlyZXR1cm4gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgICAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChpbmRhdGEtPnN0YXRlKTsKKyAgICAgICAgaWYgKGluZGF0YS0+Zml4KSB7CisgICAgICAgICAgICBpZiAoaW5rZXlsZW4gPiAwICYmIGlua2V5W2lua2V5bGVuLTFdID09ICdcMCcpCisgICAgICAgICAgICBpbmtleWxlbi0tOworICAgICAgICAgICAgaWYgKGludmFsbGVuID4gMCAmJiBpbnZhbFtpbnZhbGxlbi0xXSA9PSAnXDAnKQorICAgICAgICAgICAgaW52YWxsZW4tLTsKKyAgICAgICAgfQorICAgICAgICBrZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShpbmtleSwgaW5rZXlsZW4pOworICAgICAgICB2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShpbnZhbCwgaW52YWxsZW4pOworICAgICAgICBpZiAoa2V5ID09IE5VTEwgfHwgdmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIFhYWCBlcnJvciAtLSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgKi8KKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGtleSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHZhbCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbShpbmRhdGEtPmRpY3QsIGtleSwgdmFsKTsKKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgIFB5X0RFQ1JFRih2YWwpOworICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpbmRhdGEtPnN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5pc19nZXRfZGVmYXVsdF9kb21haW4gKFB5T2JqZWN0ICpzZWxmKQogewotCWNoYXIgKmRvbWFpbjsKLQlpbnQgZXJyOwotCVB5T2JqZWN0ICpyZXM7CisgICAgY2hhciAqZG9tYWluOworICAgIGludCBlcnI7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmICgoZXJyID0geXBfZ2V0X2RlZmF1bHRfZG9tYWluKCZkb21haW4pKSAhPSAwKQotCQlyZXR1cm4gbmlzX2Vycm9yKGVycik7CisgICAgaWYgKChlcnIgPSB5cF9nZXRfZGVmYXVsdF9kb21haW4oJmRvbWFpbikpICE9IDApCisgICAgICAgIHJldHVybiBuaXNfZXJyb3IoZXJyKTsKIAotCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIChkb21haW4sIHN0cmxlbihkb21haW4pKTsKLQlyZXR1cm4gcmVzOworICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIChkb21haW4sIHN0cmxlbihkb21haW4pKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmlzX21hdGNoIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RpY3QpCiB7Ci0JY2hhciAqbWF0Y2g7Ci0JY2hhciAqZG9tYWluID0gTlVMTDsKLQlpbnQga2V5bGVuLCBsZW47Ci0JY2hhciAqa2V5LCAqbWFwOwotCWludCBlcnI7Ci0JUHlPYmplY3QgKnJlczsKLQlpbnQgZml4OwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsia2V5IiwgIm1hcCIsICJkb21haW4iLCBOVUxMfTsKKyAgICBjaGFyICptYXRjaDsKKyAgICBjaGFyICpkb21haW4gPSBOVUxMOworICAgIGludCBrZXlsZW4sIGxlbjsKKyAgICBjaGFyICprZXksICptYXA7CisgICAgaW50IGVycjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIGludCBmaXg7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJrZXkiLCAibWFwIiwgImRvbWFpbiIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LAotCQkJCQkgInQjc3xzOm1hdGNoIiwga3dsaXN0LAotCQkJCQkgJmtleSwgJmtleWxlbiwgJm1hcCwgJmRvbWFpbikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZG9tYWluICYmICgoZXJyID0geXBfZ2V0X2RlZmF1bHRfZG9tYWluKCZkb21haW4pKSAhPSAwKSkKLQkJcmV0dXJuIG5pc19lcnJvcihlcnIpOwotCW1hcCA9IG5pc19tYXBuYW1lIChtYXAsICZmaXgpOwotCWlmIChmaXgpCi0JICAgIGtleWxlbisrOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQllcnIgPSB5cF9tYXRjaCAoZG9tYWluLCBtYXAsIGtleSwga2V5bGVuLCAmbWF0Y2gsICZsZW4pOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKGZpeCkKLQkgICAgbGVuLS07Ci0JaWYgKGVyciAhPSAwKQotCQlyZXR1cm4gbmlzX2Vycm9yKGVycik7Ci0JcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUgKG1hdGNoLCBsZW4pOwotCWZyZWUgKG1hdGNoKTsKLQlyZXR1cm4gcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidCNzfHM6bWF0Y2giLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwgJmtleWxlbiwgJm1hcCwgJmRvbWFpbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZG9tYWluICYmICgoZXJyID0geXBfZ2V0X2RlZmF1bHRfZG9tYWluKCZkb21haW4pKSAhPSAwKSkKKyAgICAgICAgcmV0dXJuIG5pc19lcnJvcihlcnIpOworICAgIG1hcCA9IG5pc19tYXBuYW1lIChtYXAsICZmaXgpOworICAgIGlmIChmaXgpCisgICAgICAgIGtleWxlbisrOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBlcnIgPSB5cF9tYXRjaCAoZG9tYWluLCBtYXAsIGtleSwga2V5bGVuLCAmbWF0Y2gsICZsZW4pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKGZpeCkKKyAgICAgICAgbGVuLS07CisgICAgaWYgKGVyciAhPSAwKQorICAgICAgICByZXR1cm4gbmlzX2Vycm9yKGVycik7CisgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUgKG1hdGNoLCBsZW4pOworICAgIGZyZWUgKG1hdGNoKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbmlzX2NhdCAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkaWN0KQogewotCWNoYXIgKmRvbWFpbiA9IE5VTEw7Ci0JY2hhciAqbWFwOwotCXN0cnVjdCB5cGFsbF9jYWxsYmFjayBjYjsKLQlzdHJ1Y3QgeXBjYWxsYmFja19kYXRhIGRhdGE7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JaW50IGVycjsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im1hcCIsICJkb21haW4iLCBOVUxMfTsKKyAgICBjaGFyICpkb21haW4gPSBOVUxMOworICAgIGNoYXIgKm1hcDsKKyAgICBzdHJ1Y3QgeXBhbGxfY2FsbGJhY2sgY2I7CisgICAgc3RydWN0IHlwY2FsbGJhY2tfZGF0YSBkYXRhOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIGludCBlcnI7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJtYXAiLCAiZG9tYWluIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsICJzfHM6Y2F0IiwKLQkJCQkgICAgICAgICBrd2xpc3QsICZtYXAsICZkb21haW4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWRvbWFpbiAmJiAoKGVyciA9IHlwX2dldF9kZWZhdWx0X2RvbWFpbigmZG9tYWluKSkgIT0gMCkpCi0JCXJldHVybiBuaXNfZXJyb3IoZXJyKTsKLQlkaWN0ID0gUHlEaWN0X05ldyAoKTsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQljYi5mb3JlYWNoID0gKGZvcmVhY2hmdW5jKW5pc19mb3JlYWNoOwotCWRhdGEuZGljdCA9IGRpY3Q7Ci0JbWFwID0gbmlzX21hcG5hbWUgKG1hcCwgJmRhdGEuZml4KTsKLQljYi5kYXRhID0gKGNoYXIgKikmZGF0YTsKLQlkYXRhLnN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKLQllcnIgPSB5cF9hbGwgKGRvbWFpbiwgbWFwLCAmY2IpOwotCVB5RXZhbF9SZXN0b3JlVGhyZWFkKGRhdGEuc3RhdGUpOwotCWlmIChlcnIgIT0gMCkgewotCQlQeV9ERUNSRUYoZGljdCk7Ci0JCXJldHVybiBuaXNfZXJyb3IoZXJyKTsKLQl9Ci0JcmV0dXJuIGRpY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkaWN0LCAic3xzOmNhdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmbWFwLCAmZG9tYWluKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFkb21haW4gJiYgKChlcnIgPSB5cF9nZXRfZGVmYXVsdF9kb21haW4oJmRvbWFpbikpICE9IDApKQorICAgICAgICByZXR1cm4gbmlzX2Vycm9yKGVycik7CisgICAgZGljdCA9IFB5RGljdF9OZXcgKCk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2IuZm9yZWFjaCA9IChmb3JlYWNoZnVuYyluaXNfZm9yZWFjaDsKKyAgICBkYXRhLmRpY3QgPSBkaWN0OworICAgIG1hcCA9IG5pc19tYXBuYW1lIChtYXAsICZkYXRhLmZpeCk7CisgICAgY2IuZGF0YSA9IChjaGFyICopJmRhdGE7CisgICAgZGF0YS5zdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisgICAgZXJyID0geXBfYWxsIChkb21haW4sIG1hcCwgJmNiKTsKKyAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChkYXRhLnN0YXRlKTsKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICByZXR1cm4gbmlzX2Vycm9yKGVycik7CisgICAgfQorICAgIHJldHVybiBkaWN0OwogfQogCiAvKiBUaGVzZSBzaG91bGQgYmUgdV9sb25nIG9uIFN1biBoL3cgYnV0IG5vdCBvbiA2NC1iaXQgaC93LgogICAgVGhpcyBpcyBub3QgcG9ydGFibGUgdG8gbWFjaGluZXMgd2l0aCAxNi1iaXQgaW50cyBhbmQgbm8gcHJvdG90eXBlcyAqLwogI2lmbmRlZiBZUFBST0NfTUFQTElTVAotI2RlZmluZSBZUFBST0NfTUFQTElTVAkxMQorI2RlZmluZSBZUFBST0NfTUFQTElTVCAgMTEKICNlbmRpZgogI2lmbmRlZiBZUFBST0cKLSNkZWZpbmUgWVBQUk9HCQkxMDAwMDQKKyNkZWZpbmUgWVBQUk9HICAgICAgICAgIDEwMDAwNAogI2VuZGlmCiAjaWZuZGVmIFlQVkVSUwotI2RlZmluZSBZUFZFUlMJCTIKKyNkZWZpbmUgWVBWRVJTICAgICAgICAgIDIKICNlbmRpZgogCiB0eXBlZGVmIGNoYXIgKmRvbWFpbm5hbWU7CiB0eXBlZGVmIGNoYXIgKm1hcG5hbWU7CiAKIGVudW0gbmlzc3RhdCB7Ci0JTklTX1RSVUUgPSAxLAotCU5JU19OT01PUkUgPSAyLAotCU5JU19GQUxTRSA9IDAsCi0JTklTX05PTUFQID0gLTEsCi0JTklTX05PRE9NID0gLTIsCi0JTklTX05PS0VZID0gLTMsCi0JTklTX0JBRE9QID0gLTQsCi0JTklTX0JBRERCID0gLTUsCi0JTklTX1lQRVJSID0gLTYsCi0JTklTX0JBREFSR1MgPSAtNywKLQlOSVNfVkVSUyA9IC04CisgICAgTklTX1RSVUUgPSAxLAorICAgIE5JU19OT01PUkUgPSAyLAorICAgIE5JU19GQUxTRSA9IDAsCisgICAgTklTX05PTUFQID0gLTEsCisgICAgTklTX05PRE9NID0gLTIsCisgICAgTklTX05PS0VZID0gLTMsCisgICAgTklTX0JBRE9QID0gLTQsCisgICAgTklTX0JBRERCID0gLTUsCisgICAgTklTX1lQRVJSID0gLTYsCisgICAgTklTX0JBREFSR1MgPSAtNywKKyAgICBOSVNfVkVSUyA9IC04CiB9OwogdHlwZWRlZiBlbnVtIG5pc3N0YXQgbmlzc3RhdDsKIAogc3RydWN0IG5pc21hcGxpc3QgewotCW1hcG5hbWUgbWFwOwotCXN0cnVjdCBuaXNtYXBsaXN0ICpuZXh0OworICAgIG1hcG5hbWUgbWFwOworICAgIHN0cnVjdCBuaXNtYXBsaXN0ICpuZXh0OwogfTsKIHR5cGVkZWYgc3RydWN0IG5pc21hcGxpc3QgbmlzbWFwbGlzdDsKIAogc3RydWN0IG5pc3Jlc3BfbWFwbGlzdCB7Ci0Jbmlzc3RhdCBzdGF0OwotCW5pc21hcGxpc3QgKm1hcHM7CisgICAgbmlzc3RhdCBzdGF0OworICAgIG5pc21hcGxpc3QgKm1hcHM7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgbmlzcmVzcF9tYXBsaXN0IG5pc3Jlc3BfbWFwbGlzdDsKIApAQCAtMjY3LDQ1ICsyNjcsNDUgQEAKIGJvb2xfdAogbmlzX3hkcl9kb21haW5uYW1lKFhEUiAqeGRycywgZG9tYWlubmFtZSAqb2JqcCkKIHsKLQlpZiAoIXhkcl9zdHJpbmcoeGRycywgb2JqcCwgWVBNQVhET01BSU4pKSB7Ci0JCXJldHVybiAoRkFMU0UpOwotCX0KLQlyZXR1cm4gKFRSVUUpOworICAgIGlmICgheGRyX3N0cmluZyh4ZHJzLCBvYmpwLCBZUE1BWERPTUFJTikpIHsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorICAgIHJldHVybiAoVFJVRSk7CiB9CiAKIHN0YXRpYwogYm9vbF90CiBuaXNfeGRyX21hcG5hbWUoWERSICp4ZHJzLCBtYXBuYW1lICpvYmpwKQogewotCWlmICgheGRyX3N0cmluZyh4ZHJzLCBvYmpwLCBZUE1BWE1BUCkpIHsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCXJldHVybiAoVFJVRSk7CisgICAgaWYgKCF4ZHJfc3RyaW5nKHhkcnMsIG9ianAsIFlQTUFYTUFQKSkgeworICAgICAgICByZXR1cm4gKEZBTFNFKTsKKyAgICB9CisgICAgcmV0dXJuIChUUlVFKTsKIH0KIAogc3RhdGljCiBib29sX3QKIG5pc194ZHJfeXBtYXBsaXN0KFhEUiAqeGRycywgbmlzbWFwbGlzdCAqb2JqcCkKIHsKLQlpZiAoIW5pc194ZHJfbWFwbmFtZSh4ZHJzLCAmb2JqcC0+bWFwKSkgewotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JaWYgKCF4ZHJfcG9pbnRlcih4ZHJzLCAoY2hhciAqKikmb2JqcC0+bmV4dCwKLQkJCSBzaXplb2YobmlzbWFwbGlzdCksICh4ZHJwcm9jX3QpbmlzX3hkcl95cG1hcGxpc3QpKQotCXsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCXJldHVybiAoVFJVRSk7CisgICAgaWYgKCFuaXNfeGRyX21hcG5hbWUoeGRycywgJm9ianAtPm1hcCkpIHsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorICAgIGlmICgheGRyX3BvaW50ZXIoeGRycywgKGNoYXIgKiopJm9ianAtPm5leHQsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmlzbWFwbGlzdCksICh4ZHJwcm9jX3QpbmlzX3hkcl95cG1hcGxpc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorICAgIHJldHVybiAoVFJVRSk7CiB9CiAKIHN0YXRpYwogYm9vbF90CiBuaXNfeGRyX3lwc3RhdChYRFIgKnhkcnMsIG5pc3N0YXQgKm9ianApCiB7Ci0JaWYgKCF4ZHJfZW51bSh4ZHJzLCAoZW51bV90ICopb2JqcCkpIHsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCXJldHVybiAoVFJVRSk7CisgICAgaWYgKCF4ZHJfZW51bSh4ZHJzLCAoZW51bV90ICopb2JqcCkpIHsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorICAgIHJldHVybiAoVFJVRSk7CiB9CiAKIApAQCAtMzEzLDE1ICszMTMsMTUgQEAKIGJvb2xfdAogbmlzX3hkcl95cHJlc3BfbWFwbGlzdChYRFIgKnhkcnMsIG5pc3Jlc3BfbWFwbGlzdCAqb2JqcCkKIHsKLQlpZiAoIW5pc194ZHJfeXBzdGF0KHhkcnMsICZvYmpwLT5zdGF0KSkgewotCQlyZXR1cm4gKEZBTFNFKTsKLQl9Ci0JaWYgKCF4ZHJfcG9pbnRlcih4ZHJzLCAoY2hhciAqKikmb2JqcC0+bWFwcywKLQkJCSBzaXplb2YobmlzbWFwbGlzdCksICh4ZHJwcm9jX3QpbmlzX3hkcl95cG1hcGxpc3QpKQotCXsKLQkJcmV0dXJuIChGQUxTRSk7Ci0JfQotCXJldHVybiAoVFJVRSk7CisgICAgaWYgKCFuaXNfeGRyX3lwc3RhdCh4ZHJzLCAmb2JqcC0+c3RhdCkpIHsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorICAgIGlmICgheGRyX3BvaW50ZXIoeGRycywgKGNoYXIgKiopJm9ianAtPm1hcHMsCisgICAgICAgICAgICAgICAgICAgICBzaXplb2YobmlzbWFwbGlzdCksICh4ZHJwcm9jX3QpbmlzX3hkcl95cG1hcGxpc3QpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChGQUxTRSk7CisgICAgfQorICAgIHJldHVybiAoVFJVRSk7CiB9CiAKIApAQCAtMzI5LDEwNSArMzI5LDEwNSBAQAogbmlzcmVzcF9tYXBsaXN0ICoKIG5pc3Byb2NfbWFwbGlzdF8yKGRvbWFpbm5hbWUgKmFyZ3AsIENMSUVOVCAqY2xudCkKIHsKLQlzdGF0aWMgbmlzcmVzcF9tYXBsaXN0IHJlczsKKyAgICBzdGF0aWMgbmlzcmVzcF9tYXBsaXN0IHJlczsKIAotCW1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7Ci0JaWYgKGNsbnRfY2FsbChjbG50LCBZUFBST0NfTUFQTElTVCwKLQkJICAgICAgKHhkcnByb2NfdCluaXNfeGRyX2RvbWFpbm5hbWUsIChjYWRkcl90KWFyZ3AsCi0JCSAgICAgICh4ZHJwcm9jX3QpbmlzX3hkcl95cHJlc3BfbWFwbGlzdCwgKGNhZGRyX3QpJnJlcywKLQkJICAgICAgVElNRU9VVCkgIT0gUlBDX1NVQ0NFU1MpCi0JewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQlyZXR1cm4gKCZyZXMpOworICAgIG1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7CisgICAgaWYgKGNsbnRfY2FsbChjbG50LCBZUFBST0NfTUFQTElTVCwKKyAgICAgICAgICAgICAgICAgICh4ZHJwcm9jX3QpbmlzX3hkcl9kb21haW5uYW1lLCAoY2FkZHJfdClhcmdwLAorICAgICAgICAgICAgICAgICAgKHhkcnByb2NfdCluaXNfeGRyX3lwcmVzcF9tYXBsaXN0LCAoY2FkZHJfdCkmcmVzLAorICAgICAgICAgICAgICAgICAgVElNRU9VVCkgIT0gUlBDX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gKE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gKCZyZXMpOwogfQogCiBzdGF0aWMKIG5pc21hcGxpc3QgKgogbmlzX21hcGxpc3QgKGNoYXIgKmRvbSkKIHsKLQluaXNyZXNwX21hcGxpc3QgKmxpc3Q7Ci0JQ0xJRU5UICpjbDsKLQljaGFyICpzZXJ2ZXIgPSBOVUxMOwotCWludCBtYXBpID0gMDsKKyAgICBuaXNyZXNwX21hcGxpc3QgKmxpc3Q7CisgICAgQ0xJRU5UICpjbDsKKyAgICBjaGFyICpzZXJ2ZXIgPSBOVUxMOworICAgIGludCBtYXBpID0gMDsKIAotCXdoaWxlICghc2VydmVyICYmIGFsaWFzZXNbbWFwaV0ubWFwICE9IDBMKSB7Ci0JCXlwX21hc3RlciAoZG9tLCBhbGlhc2VzW21hcGldLm1hcCwgJnNlcnZlcik7Ci0JCW1hcGkrKzsKLQl9Ci0gICAgICAgIGlmICghc2VydmVyKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTmlzRXJyb3IsICJObyBOSVMgbWFzdGVyIGZvdW5kIGZvciBhbnkgbWFwIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCWNsID0gY2xudF9jcmVhdGUoc2VydmVyLCBZUFBST0csIFlQVkVSUywgInRjcCIpOwotCWlmIChjbCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhOaXNFcnJvciwgY2xudF9zcGNyZWF0ZWVycm9yKHNlcnZlcikpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWxpc3QgPSBuaXNwcm9jX21hcGxpc3RfMiAoJmRvbSwgY2wpOwotCWNsbnRfZGVzdHJveShjbCk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJZ290byBmaW5hbGx5OwotCWlmIChsaXN0LT5zdGF0ICE9IE5JU19UUlVFKQotCQlnb3RvIGZpbmFsbHk7CisgICAgd2hpbGUgKCFzZXJ2ZXIgJiYgYWxpYXNlc1ttYXBpXS5tYXAgIT0gMEwpIHsKKyAgICAgICAgeXBfbWFzdGVyIChkb20sIGFsaWFzZXNbbWFwaV0ubWFwLCAmc2VydmVyKTsKKyAgICAgICAgbWFwaSsrOworICAgIH0KKyAgICBpZiAoIXNlcnZlcikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoTmlzRXJyb3IsICJObyBOSVMgbWFzdGVyIGZvdW5kIGZvciBhbnkgbWFwIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjbCA9IGNsbnRfY3JlYXRlKHNlcnZlciwgWVBQUk9HLCBZUFZFUlMsICJ0Y3AiKTsKKyAgICBpZiAoY2wgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoTmlzRXJyb3IsIGNsbnRfc3BjcmVhdGVlcnJvcihzZXJ2ZXIpKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKyAgICBsaXN0ID0gbmlzcHJvY19tYXBsaXN0XzIgKCZkb20sIGNsKTsKKyAgICBjbG50X2Rlc3Ryb3koY2wpOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBpZiAobGlzdC0+c3RhdCAhPSBOSVNfVFJVRSkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JZnJlZShzZXJ2ZXIpOwotCXJldHVybiBsaXN0LT5tYXBzOworICAgIGZyZWUoc2VydmVyKTsKKyAgICByZXR1cm4gbGlzdC0+bWFwczsKIAogICBmaW5hbGx5OgotCWZyZWUoc2VydmVyKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBmcmVlKHNlcnZlcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuaXNfbWFwcyAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkaWN0KQogewotCWNoYXIgKmRvbWFpbiA9IE5VTEw7Ci0JbmlzbWFwbGlzdCAqbWFwczsKLQlQeU9iamVjdCAqbGlzdDsKLSAgICAgICAgaW50IGVycjsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRvbWFpbiIsIE5VTEx9OworICAgIGNoYXIgKmRvbWFpbiA9IE5VTEw7CisgICAgbmlzbWFwbGlzdCAqbWFwczsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBpbnQgZXJyOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZG9tYWluIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsCi0JCQkJCSAifHM6bWFwcyIsIGt3bGlzdCwgJmRvbWFpbikpCi0JCXJldHVybiBOVUxMOwotCWlmICghZG9tYWluICYmICgoZXJyID0geXBfZ2V0X2RlZmF1bHRfZG9tYWluICgmZG9tYWluKSkgIT0gMCkpIHsKLQkJbmlzX2Vycm9yKGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInxzOm1hcHMiLCBrd2xpc3QsICZkb21haW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWRvbWFpbiAmJiAoKGVyciA9IHlwX2dldF9kZWZhdWx0X2RvbWFpbiAoJmRvbWFpbikpICE9IDApKSB7CisgICAgICAgIG5pc19lcnJvcihlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoKG1hcHMgPSBuaXNfbWFwbGlzdCAoZG9tYWluKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChsaXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChtYXBzID0gbWFwczsgbWFwczsgbWFwcyA9IG1hcHMtPm5leHQpIHsKLQkJUHlPYmplY3QgKnN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobWFwcy0+bWFwKTsKLQkJaWYgKCFzdHIgfHwgUHlMaXN0X0FwcGVuZChsaXN0LCBzdHIpIDwgMCkKLQkJewotCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJbGlzdCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlQeV9ERUNSRUYoc3RyKTsKLQl9Ci0JLyogWFhYIFNob3VsZG4ndCB3ZSBmcmVlIHRoZSBsaXN0IG9mIG1hcHMgbm93PyAqLwotCXJldHVybiBsaXN0OworICAgIGlmICgobWFwcyA9IG5pc19tYXBsaXN0IChkb21haW4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGxpc3QgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKG1hcHMgPSBtYXBzOyBtYXBzOyBtYXBzID0gbWFwcy0+bmV4dCkgeworICAgICAgICBQeU9iamVjdCAqc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtYXBzLT5tYXApOworICAgICAgICBpZiAoIXN0ciB8fCBQeUxpc3RfQXBwZW5kKGxpc3QsIHN0cikgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICBsaXN0ID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgIH0KKyAgICAvKiBYWFggU2hvdWxkbid0IHdlIGZyZWUgdGhlIGxpc3Qgb2YgbWFwcyBub3c/ICovCisgICAgcmV0dXJuIGxpc3Q7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBuaXNfbWV0aG9kc1tdID0gewotCXsibWF0Y2giLAkJKFB5Q0Z1bmN0aW9uKW5pc19tYXRjaCwKLQkJCQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLQkJCQkJbWF0Y2hfX2RvY19ffSwKLQl7ImNhdCIsCQkJKFB5Q0Z1bmN0aW9uKW5pc19jYXQsCi0JCQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQkJCWNhdF9fZG9jX199LAotCXsibWFwcyIsCQkoUHlDRnVuY3Rpb24pbmlzX21hcHMsCi0JCQkJCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCi0JCQkJCW1hcHNfX2RvY19ffSwKLQl7ImdldF9kZWZhdWx0X2RvbWFpbiIsCShQeUNGdW5jdGlvbiluaXNfZ2V0X2RlZmF1bHRfZG9tYWluLAotIAkJCQkJTUVUSF9OT0FSR1MsCi0JCQkJCWdldF9kZWZhdWx0X2RvbWFpbl9fZG9jX199LAotCXtOVUxMLAkJCU5VTEx9CQkgLyogU2VudGluZWwgKi8KKyAgICB7Im1hdGNoIiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW5pc19tYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9fZG9jX199LAorICAgIHsiY2F0IiwgICAgICAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pbmlzX2NhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRfX2RvY19ffSwKKyAgICB7Im1hcHMiLCAgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKW5pc19tYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHNfX2RvY19ffSwKKyAgICB7ImdldF9kZWZhdWx0X2RvbWFpbiIsICAgICAgKFB5Q0Z1bmN0aW9uKW5pc19nZXRfZGVmYXVsdF9kb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kZWZhdWx0X2RvbWFpbl9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIobmlzX19kb2NfXywKQEAgLTQzNiwxMiArNDM2LDEyIEBACiB2b2lkCiBpbml0bmlzICh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQltID0gUHlfSW5pdE1vZHVsZTMoIm5pcyIsIG5pc19tZXRob2RzLCBuaXNfX2RvY19fKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JTmlzRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oIm5pcy5lcnJvciIsIE5VTEwsIE5VTEwpOwotCWlmIChOaXNFcnJvciAhPSBOVUxMKQotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBOaXNFcnJvcik7CisgICAgUHlPYmplY3QgKm0sICpkOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygibmlzIiwgbmlzX21ldGhvZHMsIG5pc19fZG9jX18pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBOaXNFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigibmlzLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgaWYgKE5pc0Vycm9yICE9IE5VTEwpCisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIE5pc0Vycm9yKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvb3BlcmF0b3IuYyBiL01vZHVsZXMvb3BlcmF0b3IuYwppbmRleCAzZWQ0YmM1Li41OTFiNWVhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL29wZXJhdG9yLmMKKysrIGIvTW9kdWxlcy9vcGVyYXRvci5jCkBAIC0xMjEsODggKzEyMSw4OCBAQAogc3RhdGljIFB5T2JqZWN0Kgogb3BfcG93KFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqYSkKIHsKLQlQeU9iamVjdCAqYTEsICphMjsKLQlpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwicG93IiwgMiwgMiwgJmExLCAmYTIpKQotCQlyZXR1cm4gUHlOdW1iZXJfUG93ZXIoYTEsIGEyLCBQeV9Ob25lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqYTEsICphMjsKKyAgICBpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwicG93IiwgMiwgMiwgJmExLCAmYTIpKQorICAgICAgICByZXR1cm4gUHlOdW1iZXJfUG93ZXIoYTEsIGEyLCBQeV9Ob25lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgogb3BfaXBvdyhQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpCiB7Ci0JUHlPYmplY3QgKmExLCAqYTI7Ci0JaWYgKFB5QXJnX1VucGFja1R1cGxlKGEsImlwb3ciLCAyLCAyLCAmYTEsICZhMikpCi0JCXJldHVybiBQeU51bWJlcl9JblBsYWNlUG93ZXIoYTEsIGEyLCBQeV9Ob25lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqYTEsICphMjsKKyAgICBpZiAoUHlBcmdfVW5wYWNrVHVwbGUoYSwiaXBvdyIsIDIsIDIsICZhMSwgJmEyKSkKKyAgICAgICAgcmV0dXJuIFB5TnVtYmVyX0luUGxhY2VQb3dlcihhMSwgYTIsIFB5X05vbmUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb3BfaW5kZXgoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICphKQogewotCXJldHVybiBQeU51bWJlcl9JbmRleChhKTsKKyAgICByZXR1cm4gUHlOdW1iZXJfSW5kZXgoYSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGlzXyhQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpCiB7Ci0JUHlPYmplY3QgKmExLCAqYTIsICpyZXN1bHQgPSBOVUxMOwotCWlmIChQeUFyZ19VbnBhY2tUdXBsZShhLCJpc18iLCAyLCAyLCAmYTEsICZhMikpIHsKLQkJcmVzdWx0ID0gKGExID09IGEyKSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKmExLCAqYTIsICpyZXN1bHQgPSBOVUxMOworICAgIGlmIChQeUFyZ19VbnBhY2tUdXBsZShhLCJpc18iLCAyLCAyLCAmYTEsICZhMikpIHsKKyAgICAgICAgcmVzdWx0ID0gKGExID09IGEyKSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGlzX25vdChQeU9iamVjdCAqcywgUHlPYmplY3QgKmEpCiB7Ci0JUHlPYmplY3QgKmExLCAqYTIsICpyZXN1bHQgPSBOVUxMOwotCWlmIChQeUFyZ19VbnBhY2tUdXBsZShhLCJpc19ub3QiLCAyLCAyLCAmYTEsICZhMikpIHsKLQkJcmVzdWx0ID0gKGExICE9IGEyKSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKmExLCAqYTIsICpyZXN1bHQgPSBOVUxMOworICAgIGlmIChQeUFyZ19VbnBhY2tUdXBsZShhLCJpc19ub3QiLCAyLCAyLCAmYTEsICZhMikpIHsKKyAgICAgICAgcmVzdWx0ID0gKGExICE9IGEyKSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIG9wX2dldHNsaWNlKFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqYSkKIHsKLSAgICAgICAgUHlPYmplY3QgKmExOwotICAgICAgICBQeV9zc2l6ZV90IGEyLCBhMzsKKyAgICBQeU9iamVjdCAqYTE7CisgICAgUHlfc3NpemVfdCBhMiwgYTM7CiAKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGEsICJPbm46Z2V0c2xpY2UiLCAmYTEsICZhMiwgJmEzKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgcmV0dXJuIFB5U2VxdWVuY2VfR2V0U2xpY2UoYTEsIGEyLCBhMyk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGEsICJPbm46Z2V0c2xpY2UiLCAmYTEsICZhMiwgJmEzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5U2VxdWVuY2VfR2V0U2xpY2UoYTEsIGEyLCBhMyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIG9wX3NldHNsaWNlKFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqYSkKIHsKLSAgICAgICAgUHlPYmplY3QgKmExLCAqYTQ7Ci0gICAgICAgIFB5X3NzaXplX3QgYTIsIGEzOworICAgIFB5T2JqZWN0ICphMSwgKmE0OworICAgIFB5X3NzaXplX3QgYTIsIGEzOwogCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhLCAiT25uTzpzZXRzbGljZSIsICZhMSwgJmEyLCAmYTMsICZhNCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGEsICJPbm5POnNldHNsaWNlIiwgJmExLCAmYTIsICZhMywgJmE0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKC0xID09IFB5U2VxdWVuY2VfU2V0U2xpY2UoYTEsIGEyLCBhMywgYTQpKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgtMSA9PSBQeVNlcXVlbmNlX1NldFNsaWNlKGExLCBhMiwgYTMsIGE0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgogb3BfZGVsc2xpY2UoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICphKQogewotICAgICAgICBQeU9iamVjdCAqYTE7Ci0gICAgICAgIFB5X3NzaXplX3QgYTIsIGEzOworICAgIFB5T2JqZWN0ICphMTsKKyAgICBQeV9zc2l6ZV90IGEyLCBhMzsKIAotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYSwgIk9ubjpkZWxzbGljZSIsICZhMSwgJmEyLCAmYTMpKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhLCAiT25uOmRlbHNsaWNlIiwgJmExLCAmYTIsICZhMykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmICgtMSA9PSBQeVNlcXVlbmNlX0RlbFNsaWNlKGExLCBhMiwgYTMpKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgtMSA9PSBQeVNlcXVlbmNlX0RlbFNsaWNlKGExLCBhMiwgYTMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiAjdW5kZWYgc3BhbTEKQEAgLTIxMSwxMCArMjExLDEwIEBACiAjdW5kZWYgc3BhbTFvCiAjZGVmaW5lIHNwYW0xKE9QLERPQykgeyNPUCwgT1AsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKERPQyl9LAogI2RlZmluZSBzcGFtMihPUCxBTFRPUCxET0MpIHsjT1AsIG9wXyMjT1AsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKERPQyl9LCBcCi0JCQkgICB7I0FMVE9QLCBvcF8jI09QLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUihET0MpfSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7I0FMVE9QLCBvcF8jI09QLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUihET0MpfSwKICNkZWZpbmUgc3BhbTFvKE9QLERPQykgeyNPUCwgT1AsIE1FVEhfTywgUHlEb2NfU1RSKERPQyl9LAogI2RlZmluZSBzcGFtMm8oT1AsQUxUT1AsRE9DKSB7I09QLCBvcF8jI09QLCBNRVRIX08sIFB5RG9jX1NUUihET0MpfSwgXAotCQkJICAgeyNBTFRPUCwgb3BfIyNPUCwgTUVUSF9PLCBQeURvY19TVFIoRE9DKX0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyNBTFRPUCwgb3BfIyNPUCwgTUVUSF9PLCBQeURvY19TVFIoRE9DKX0sCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgb3BlcmF0b3JfbWV0aG9kc1tdID0gewogCkBAIC0yOTksMTYgKzI5OSwxNiBAQAogc3BhbTIoZ3QsX19ndF9fLCAiZ3QoYSwgYikgLS0gU2FtZSBhcyBhPmIuIikKIHNwYW0yKGdlLF9fZ2VfXywgImdlKGEsIGIpIC0tIFNhbWUgYXMgYT49Yi4iKQogCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogCiB9OwogCiAvKiBpdGVtZ2V0dGVyIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3Qgbml0ZW1zOwotCVB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IG5pdGVtczsKKyAgICBQeU9iamVjdCAqaXRlbTsKIH0gaXRlbWdldHRlcm9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpdGVtZ2V0dGVyX3R5cGU7CkBAIC0zMTYsNzcgKzMxNiw3NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGl0ZW1nZXR0ZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWl0ZW1nZXR0ZXJvYmplY3QgKmlnOwotCVB5T2JqZWN0ICppdGVtOwotCVB5X3NzaXplX3Qgbml0ZW1zOworICAgIGl0ZW1nZXR0ZXJvYmplY3QgKmlnOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5X3NzaXplX3Qgbml0ZW1zOwogCi0JaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiaXRlbWdldHRlcigpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoIml0ZW1nZXR0ZXIoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW5pdGVtcyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JaWYgKG5pdGVtcyA8PSAxKSB7Ci0JCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIml0ZW1nZXR0ZXIiLCAxLCAxLCAmaXRlbSkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgCi0JCWl0ZW0gPSBhcmdzOworICAgIG5pdGVtcyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgaWYgKG5pdGVtcyA8PSAxKSB7CisgICAgICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIml0ZW1nZXR0ZXIiLCAxLCAxLCAmaXRlbSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UKKyAgICAgICAgaXRlbSA9IGFyZ3M7CiAKLQkvKiBjcmVhdGUgaXRlbWdldHRlcm9iamVjdCBzdHJ1Y3R1cmUgKi8KLQlpZyA9IFB5T2JqZWN0X0dDX05ldyhpdGVtZ2V0dGVyb2JqZWN0LCAmaXRlbWdldHRlcl90eXBlKTsKLQlpZiAoaWcgPT0gTlVMTCkgCi0JCXJldHVybiBOVUxMOwkKLQkKLQlQeV9JTkNSRUYoaXRlbSk7Ci0JaWctPml0ZW0gPSBpdGVtOwotCWlnLT5uaXRlbXMgPSBuaXRlbXM7CisgICAgLyogY3JlYXRlIGl0ZW1nZXR0ZXJvYmplY3Qgc3RydWN0dXJlICovCisgICAgaWcgPSBQeU9iamVjdF9HQ19OZXcoaXRlbWdldHRlcm9iamVjdCwgJml0ZW1nZXR0ZXJfdHlwZSk7CisgICAgaWYgKGlnID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlPYmplY3RfR0NfVHJhY2soaWcpOwotCXJldHVybiAoUHlPYmplY3QgKilpZzsKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgaWctPml0ZW0gPSBpdGVtOworICAgIGlnLT5uaXRlbXMgPSBuaXRlbXM7CisKKyAgICBQeU9iamVjdF9HQ19UcmFjayhpZyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWlnOwogfQogCiBzdGF0aWMgdm9pZAogaXRlbWdldHRlcl9kZWFsbG9jKGl0ZW1nZXR0ZXJvYmplY3QgKmlnKQogewotCVB5T2JqZWN0X0dDX1VuVHJhY2soaWcpOwotCVB5X1hERUNSRUYoaWctPml0ZW0pOwotCVB5T2JqZWN0X0dDX0RlbChpZyk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhpZyk7CisgICAgUHlfWERFQ1JFRihpZy0+aXRlbSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGlnKTsKIH0KIAogc3RhdGljIGludAogaXRlbWdldHRlcl90cmF2ZXJzZShpdGVtZ2V0dGVyb2JqZWN0ICppZywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoaWctPml0ZW0pOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGlnLT5pdGVtKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGl0ZW1nZXR0ZXJfY2FsbChpdGVtZ2V0dGVyb2JqZWN0ICppZywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqb2JqLCAqcmVzdWx0OwotCVB5X3NzaXplX3QgaSwgbml0ZW1zPWlnLT5uaXRlbXM7CisgICAgUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGksIG5pdGVtcz1pZy0+bml0ZW1zOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXRlbWdldHRlciIsIDEsIDEsICZvYmopKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobml0ZW1zID09IDEpCi0JCXJldHVybiBQeU9iamVjdF9HZXRJdGVtKG9iaiwgaWctPml0ZW0pOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIml0ZW1nZXR0ZXIiLCAxLCAxLCAmb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG5pdGVtcyA9PSAxKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfR2V0SXRlbShvYmosIGlnLT5pdGVtKTsKIAotCWFzc2VydChQeVR1cGxlX0NoZWNrKGlnLT5pdGVtKSk7Ci0JYXNzZXJ0KFB5VHVwbGVfR0VUX1NJWkUoaWctPml0ZW0pID09IG5pdGVtcyk7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soaWctPml0ZW0pKTsKKyAgICBhc3NlcnQoUHlUdXBsZV9HRVRfU0laRShpZy0+aXRlbSkgPT0gbml0ZW1zKTsKIAotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KG5pdGVtcyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhuaXRlbXMpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGk9MCA7IGkgPCBuaXRlbXMgOyBpKyspIHsKLQkJUHlPYmplY3QgKml0ZW0sICp2YWw7Ci0JCWl0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGlnLT5pdGVtLCBpKTsKLQkJdmFsID0gUHlPYmplY3RfR2V0SXRlbShvYmosIGl0ZW0pOwotCQlpZiAodmFsID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIHZhbCk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpPTAgOyBpIDwgbml0ZW1zIDsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtLCAqdmFsOworICAgICAgICBpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShpZy0+aXRlbSwgaSk7CisgICAgICAgIHZhbCA9IFB5T2JqZWN0X0dldEl0ZW0ob2JqLCBpdGVtKTsKKyAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCB2YWwpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoaXRlbWdldHRlcl9kb2MsCkBAIC0zOTcsNTUgKzM5Nyw1NSBAQAogQWZ0ZXIsIGc9aXRlbWdldHRlcigyLDUsMyksIHRoZSBjYWxsIGcocikgcmV0dXJucyAoclsyXSwgcls1XSwgclszXSkiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBpdGVtZ2V0dGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIm9wZXJhdG9yLml0ZW1nZXR0ZXIiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihpdGVtZ2V0dGVyb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaXRlbWdldHRlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJLyogdHBfaGFzaCAqLwotCSh0ZXJuYXJ5ZnVuYylpdGVtZ2V0dGVyX2NhbGwsCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywJLyogdHBfZmxhZ3MgKi8KLQlpdGVtZ2V0dGVyX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWl0ZW1nZXR0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJLyogdHBfYWxsb2MgKi8KLQlpdGVtZ2V0dGVyX25ldywJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgIm9wZXJhdG9yLml0ZW1nZXR0ZXIiLCAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihpdGVtZ2V0dGVyb2JqZWN0KSwgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWl0ZW1nZXR0ZXJfZGVhbGxvYywgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKWl0ZW1nZXR0ZXJfY2FsbCwgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBpdGVtZ2V0dGVyX2RvYywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWl0ZW1nZXR0ZXJfdHJhdmVyc2UsICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpdGVtZ2V0dGVyX25ldywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qIGF0dHJnZXR0ZXIgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdCBuYXR0cnM7Ci0JUHlPYmplY3QgKmF0dHI7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgbmF0dHJzOworICAgIFB5T2JqZWN0ICphdHRyOwogfSBhdHRyZ2V0dGVyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGF0dHJnZXR0ZXJfdHlwZTsKQEAgLTQ1MywxMjAgKzQ1MywxMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdHRyZ2V0dGVyX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlhdHRyZ2V0dGVyb2JqZWN0ICphZzsKLQlQeU9iamVjdCAqYXR0cjsKLQlQeV9zc2l6ZV90IG5hdHRyczsKKyAgICBhdHRyZ2V0dGVyb2JqZWN0ICphZzsKKyAgICBQeU9iamVjdCAqYXR0cjsKKyAgICBQeV9zc2l6ZV90IG5hdHRyczsKIAotCWlmICghX1B5QXJnX05vS2V5d29yZHMoImF0dHJnZXR0ZXIoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJhdHRyZ2V0dGVyKCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluYXR0cnMgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCWlmIChuYXR0cnMgPD0gMSkgewotCQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJhdHRyZ2V0dGVyIiwgMSwgMSwgJmF0dHIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIAotCQlhdHRyID0gYXJnczsKKyAgICBuYXR0cnMgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGlmIChuYXR0cnMgPD0gMSkgeworICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJhdHRyZ2V0dGVyIiwgMSwgMSwgJmF0dHIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlCisgICAgICAgIGF0dHIgPSBhcmdzOwogCi0JLyogY3JlYXRlIGF0dHJnZXR0ZXJvYmplY3Qgc3RydWN0dXJlICovCi0JYWcgPSBQeU9iamVjdF9HQ19OZXcoYXR0cmdldHRlcm9iamVjdCwgJmF0dHJnZXR0ZXJfdHlwZSk7Ci0JaWYgKGFnID09IE5VTEwpIAotCQlyZXR1cm4gTlVMTDsJCi0JCi0JUHlfSU5DUkVGKGF0dHIpOwotCWFnLT5hdHRyID0gYXR0cjsKLQlhZy0+bmF0dHJzID0gbmF0dHJzOworICAgIC8qIGNyZWF0ZSBhdHRyZ2V0dGVyb2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGFnID0gUHlPYmplY3RfR0NfTmV3KGF0dHJnZXR0ZXJvYmplY3QsICZhdHRyZ2V0dGVyX3R5cGUpOworICAgIGlmIChhZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5T2JqZWN0X0dDX1RyYWNrKGFnKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopYWc7CisgICAgUHlfSU5DUkVGKGF0dHIpOworICAgIGFnLT5hdHRyID0gYXR0cjsKKyAgICBhZy0+bmF0dHJzID0gbmF0dHJzOworCisgICAgUHlPYmplY3RfR0NfVHJhY2soYWcpOworICAgIHJldHVybiAoUHlPYmplY3QgKilhZzsKIH0KIAogc3RhdGljIHZvaWQKIGF0dHJnZXR0ZXJfZGVhbGxvYyhhdHRyZ2V0dGVyb2JqZWN0ICphZykKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGFnKTsKLQlQeV9YREVDUkVGKGFnLT5hdHRyKTsKLQlQeU9iamVjdF9HQ19EZWwoYWcpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soYWcpOworICAgIFB5X1hERUNSRUYoYWctPmF0dHIpOworICAgIFB5T2JqZWN0X0dDX0RlbChhZyk7CiB9CiAKIHN0YXRpYyBpbnQKIGF0dHJnZXR0ZXJfdHJhdmVyc2UoYXR0cmdldHRlcm9iamVjdCAqYWcsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGFnLT5hdHRyKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChhZy0+YXR0cik7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb3R0ZWRfZ2V0YXR0cihQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXR0cikKIHsKLQljaGFyICpzLCAqcDsKKyAgICBjaGFyICpzLCAqcDsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGF0dHIpKSB7Ci0JCWF0dHIgPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcoYXR0ciwgTlVMTCk7Ci0JCWlmIChhdHRyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhhdHRyKSkgeworICAgICAgICBhdHRyID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKGF0dHIsIE5VTEwpOworICAgICAgICBpZiAoYXR0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JCi0JaWYgKCFQeVN0cmluZ19DaGVjayhhdHRyKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KIAotCXMgPSBQeVN0cmluZ19BU19TVFJJTkcoYXR0cik7Ci0JUHlfSU5DUkVGKG9iaik7Ci0JZm9yICg7OykgewotCQlQeU9iamVjdCAqbmV3b2JqLCAqc3RyOwotCQlwID0gc3RyY2hyKHMsICcuJyk7Ci0JCXN0ciA9IHAgPyBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAocC1zKSkgOiAKLQkJCSAgUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKLQkJaWYgKHN0ciA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYob2JqKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW5ld29iaiA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBzdHIpOwotCQlQeV9ERUNSRUYoc3RyKTsKLQkJUHlfREVDUkVGKG9iaik7Ci0JCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlvYmogPSBuZXdvYmo7Ci0JCWlmIChwID09IE5VTEwpIGJyZWFrOwotCQlzID0gcCsxOwotCX0KKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGF0dHIpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gb2JqOworICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcoYXR0cik7CisgICAgUHlfSU5DUkVGKG9iaik7CisgICAgZm9yICg7OykgeworICAgICAgICBQeU9iamVjdCAqbmV3b2JqLCAqc3RyOworICAgICAgICBwID0gc3RyY2hyKHMsICcuJyk7CisgICAgICAgIHN0ciA9IHAgPyBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAocC1zKSkgOgorICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgICAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbmV3b2JqID0gUHlPYmplY3RfR2V0QXR0cihvYmosIHN0cik7CisgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG9iaiA9IG5ld29iajsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkgYnJlYWs7CisgICAgICAgIHMgPSBwKzE7CisgICAgfQorCisgICAgcmV0dXJuIG9iajsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGF0dHJnZXR0ZXJfY2FsbChhdHRyZ2V0dGVyb2JqZWN0ICphZywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqb2JqLCAqcmVzdWx0OwotCVB5X3NzaXplX3QgaSwgbmF0dHJzPWFnLT5uYXR0cnM7CisgICAgUHlPYmplY3QgKm9iaiwgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGksIG5hdHRycz1hZy0+bmF0dHJzOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiYXR0cmdldHRlciIsIDEsIDEsICZvYmopKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYWctPm5hdHRycyA9PSAxKQotCQlyZXR1cm4gZG90dGVkX2dldGF0dHIob2JqLCBhZy0+YXR0cik7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiYXR0cmdldHRlciIsIDEsIDEsICZvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYWctPm5hdHRycyA9PSAxKQorICAgICAgICByZXR1cm4gZG90dGVkX2dldGF0dHIob2JqLCBhZy0+YXR0cik7CiAKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhZy0+YXR0cikpOwotCWFzc2VydChQeVR1cGxlX0dFVF9TSVpFKGFnLT5hdHRyKSA9PSBuYXR0cnMpOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFnLT5hdHRyKSk7CisgICAgYXNzZXJ0KFB5VHVwbGVfR0VUX1NJWkUoYWctPmF0dHIpID09IG5hdHRycyk7CiAKLQlyZXN1bHQgPSBQeVR1cGxlX05ldyhuYXR0cnMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobmF0dHJzKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpPTAgOyBpIDwgbmF0dHJzIDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICphdHRyLCAqdmFsOwotCQlhdHRyID0gUHlUdXBsZV9HRVRfSVRFTShhZy0+YXR0ciwgaSk7Ci0JCXZhbCA9IGRvdHRlZF9nZXRhdHRyKG9iaiwgYXR0cik7Ci0JCWlmICh2YWwgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdmFsKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKGk9MCA7IGkgPCBuYXR0cnMgOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmF0dHIsICp2YWw7CisgICAgICAgIGF0dHIgPSBQeVR1cGxlX0dFVF9JVEVNKGFnLT5hdHRyLCBpKTsKKyAgICAgICAgdmFsID0gZG90dGVkX2dldGF0dHIob2JqLCBhdHRyKTsKKyAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCB2YWwpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoYXR0cmdldHRlcl9kb2MsCkBAIC01NzksNTYgKzU3OSw1NiBAQAogKHIubmFtZS5maXJzdCwgci5uYW1lLmxhc3QpLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGF0dHJnZXR0ZXJfdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkib3BlcmF0b3IuYXR0cmdldHRlciIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGF0dHJnZXR0ZXJvYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilhdHRyZ2V0dGVyX2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKWF0dHJnZXR0ZXJfY2FsbCwJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLAkvKiB0cF9mbGFncyAqLwotCWF0dHJnZXR0ZXJfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpYXR0cmdldHRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkvKiB0cF9hbGxvYyAqLwotCWF0dHJnZXR0ZXJfbmV3LAkJCS8qIHRwX25ldyAqLwotCTAsCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAib3BlcmF0b3IuYXR0cmdldHRlciIsICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGF0dHJnZXR0ZXJvYmplY3QpLCAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpYXR0cmdldHRlcl9kZWFsbG9jLCAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAodGVybmFyeWZ1bmMpYXR0cmdldHRlcl9jYWxsLCAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGF0dHJnZXR0ZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpYXR0cmdldHRlcl90cmF2ZXJzZSwgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGF0dHJnZXR0ZXJfbmV3LCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIAogLyogbWV0aG9kY2FsbGVyIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpuYW1lOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICprd2RzOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqbmFtZTsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqa3dkczsKIH0gbWV0aG9kY2FsbGVyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IG1ldGhvZGNhbGxlcl90eXBlOwpAQCAtNjM2LDY5ICs2MzYsNjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRob2RjYWxsZXJfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCW1ldGhvZGNhbGxlcm9iamVjdCAqbWM7Ci0JUHlPYmplY3QgKm5hbWUsICpuZXdhcmdzOworICAgIG1ldGhvZGNhbGxlcm9iamVjdCAqbWM7CisgICAgUHlPYmplY3QgKm5hbWUsICpuZXdhcmdzOwogCi0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPCAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtZXRob2RjYWxsZXIgbmVlZHMgYXQgbGVhc3QgIgotCQkJCSJvbmUgYXJndW1lbnQsIHRoZSBtZXRob2QgbmFtZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPCAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJtZXRob2RjYWxsZXIgbmVlZHMgYXQgbGVhc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9uZSBhcmd1bWVudCwgdGhlIG1ldGhvZCBuYW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIGNyZWF0ZSBtZXRob2RjYWxsZXJvYmplY3Qgc3RydWN0dXJlICovCi0JbWMgPSBQeU9iamVjdF9HQ19OZXcobWV0aG9kY2FsbGVyb2JqZWN0LCAmbWV0aG9kY2FsbGVyX3R5cGUpOwotCWlmIChtYyA9PSBOVUxMKSAKLQkJcmV0dXJuIE5VTEw7CQorICAgIC8qIGNyZWF0ZSBtZXRob2RjYWxsZXJvYmplY3Qgc3RydWN0dXJlICovCisgICAgbWMgPSBQeU9iamVjdF9HQ19OZXcobWV0aG9kY2FsbGVyb2JqZWN0LCAmbWV0aG9kY2FsbGVyX3R5cGUpOworICAgIGlmIChtYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIFB5VHVwbGVfR0VUX1NJWkUoYXJncykpOwotCWlmIChuZXdhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG1jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1jLT5hcmdzID0gbmV3YXJnczsKKyAgICBuZXdhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKTsKKyAgICBpZiAobmV3YXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihtYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtYy0+YXJncyA9IG5ld2FyZ3M7CiAKLQluYW1lID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlQeV9JTkNSRUYobmFtZSk7Ci0JbWMtPm5hbWUgPSBuYW1lOworICAgIG5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICBtYy0+bmFtZSA9IG5hbWU7CiAKLQlQeV9YSU5DUkVGKGt3ZHMpOwotCW1jLT5rd2RzID0ga3dkczsKKyAgICBQeV9YSU5DUkVGKGt3ZHMpOworICAgIG1jLT5rd2RzID0ga3dkczsKIAotCVB5T2JqZWN0X0dDX1RyYWNrKG1jKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbWM7CisgICAgUHlPYmplY3RfR0NfVHJhY2sobWMpOworICAgIHJldHVybiAoUHlPYmplY3QgKiltYzsKIH0KIAogc3RhdGljIHZvaWQKIG1ldGhvZGNhbGxlcl9kZWFsbG9jKG1ldGhvZGNhbGxlcm9iamVjdCAqbWMpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhtYyk7Ci0JUHlfWERFQ1JFRihtYy0+bmFtZSk7Ci0JUHlfWERFQ1JFRihtYy0+YXJncyk7Ci0JUHlfWERFQ1JFRihtYy0+a3dkcyk7Ci0JUHlPYmplY3RfR0NfRGVsKG1jKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKG1jKTsKKyAgICBQeV9YREVDUkVGKG1jLT5uYW1lKTsKKyAgICBQeV9YREVDUkVGKG1jLT5hcmdzKTsKKyAgICBQeV9YREVDUkVGKG1jLT5rd2RzKTsKKyAgICBQeU9iamVjdF9HQ19EZWwobWMpOwogfQogCiBzdGF0aWMgaW50CiBtZXRob2RjYWxsZXJfdHJhdmVyc2UobWV0aG9kY2FsbGVyb2JqZWN0ICptYywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQobWMtPmFyZ3MpOwotCVB5X1ZJU0lUKG1jLT5rd2RzKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChtYy0+YXJncyk7CisgICAgUHlfVklTSVQobWMtPmt3ZHMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aG9kY2FsbGVyX2NhbGwobWV0aG9kY2FsbGVyb2JqZWN0ICptYywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqbWV0aG9kLCAqb2JqLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICptZXRob2QsICpvYmosICpyZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJtZXRob2RjYWxsZXIiLCAxLCAxLCAmb2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0cihvYmosIG1jLT5uYW1lKTsKLQlpZiAobWV0aG9kID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGwobWV0aG9kLCBtYy0+YXJncywgbWMtPmt3ZHMpOwotCVB5X0RFQ1JFRihtZXRob2QpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAibWV0aG9kY2FsbGVyIiwgMSwgMSwgJm9iaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBtYy0+bmFtZSk7CisgICAgaWYgKG1ldGhvZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKG1ldGhvZCwgbWMtPmFyZ3MsIG1jLT5rd2RzKTsKKyAgICBQeV9ERUNSRUYobWV0aG9kKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIobWV0aG9kY2FsbGVyX2RvYywKQEAgLTcxMCw0NiArNzEwLDQ2IEBACiByLm5hbWUoJ2RhdGUnLCBmb289MSkuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgbWV0aG9kY2FsbGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIm9wZXJhdG9yLm1ldGhvZGNhbGxlciIsCS8qIHRwX25hbWUgKi8KLQlzaXplb2YobWV0aG9kY2FsbGVyb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbWV0aG9kY2FsbGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKW1ldGhvZGNhbGxlcl9jYWxsLAkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQltZXRob2RjYWxsZXJfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpbWV0aG9kY2FsbGVyX3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JbWV0aG9kY2FsbGVyX25ldywJCS8qIHRwX25ldyAqLwotCTAsCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAib3BlcmF0b3IubWV0aG9kY2FsbGVyIiwgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKG1ldGhvZGNhbGxlcm9iamVjdCksICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpbWV0aG9kY2FsbGVyX2RlYWxsb2MsIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKW1ldGhvZGNhbGxlcl9jYWxsLCAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICBtZXRob2RjYWxsZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbWV0aG9kY2FsbGVyX3RyYXZlcnNlLCAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIG1ldGhvZGNhbGxlcl9uZXcsICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtNzU4LDI2ICs3NTgsMjYgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0b3BlcmF0b3Iodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLSAgICAgICAgCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0gICAgICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgib3BlcmF0b3IiLCBvcGVyYXRvcl9tZXRob2RzLCBvcGVyYXRvcl9kb2MsCi0JCSAgICAgICAoUHlPYmplY3QqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmaXRlbWdldHRlcl90eXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJml0ZW1nZXR0ZXJfdHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJpdGVtZ2V0dGVyIiwgKFB5T2JqZWN0ICopJml0ZW1nZXR0ZXJfdHlwZSk7CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJvcGVyYXRvciIsIG9wZXJhdG9yX21ldGhvZHMsIG9wZXJhdG9yX2RvYywKKyAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmYXR0cmdldHRlcl90eXBlKSA8IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoJmF0dHJnZXR0ZXJfdHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJhdHRyZ2V0dGVyIiwgKFB5T2JqZWN0ICopJmF0dHJnZXR0ZXJfdHlwZSk7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmaXRlbWdldHRlcl90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJml0ZW1nZXR0ZXJfdHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJpdGVtZ2V0dGVyIiwgKFB5T2JqZWN0ICopJml0ZW1nZXR0ZXJfdHlwZSk7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZtZXRob2RjYWxsZXJfdHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKCZtZXRob2RjYWxsZXJfdHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJtZXRob2RjYWxsZXIiLCAoUHlPYmplY3QgKikmbWV0aG9kY2FsbGVyX3R5cGUpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJmF0dHJnZXR0ZXJfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKCZhdHRyZ2V0dGVyX3R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiYXR0cmdldHRlciIsIChQeU9iamVjdCAqKSZhdHRyZ2V0dGVyX3R5cGUpOworCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmbWV0aG9kY2FsbGVyX3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmbWV0aG9kY2FsbGVyX3R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAibWV0aG9kY2FsbGVyIiwgKFB5T2JqZWN0ICopJm1ldGhvZGNhbGxlcl90eXBlKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcGFyc2VybW9kdWxlLmMgYi9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCmluZGV4IDEyYjdmYzMuLjBkZDY5Y2QgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYwpAQCAtNTU1LDggKzU1NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGV2YWxfaW5wdXQgOiBmaWxlX2lucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyciwgJmZsYWdzKTsKIAotCWlmIChuKSB7Ci0JICAgIHJlcyA9IHBhcnNlcl9uZXdzdG9iamVjdChuLCB0eXBlKTsKKyAgICAgICAgaWYgKG4pIHsKKyAgICAgICAgICAgIHJlcyA9IHBhcnNlcl9uZXdzdG9iamVjdChuLCB0eXBlKTsKICAgICAgICAgICAgIGlmIChyZXMpCiAgICAgICAgICAgICAgICAgKChQeVNUX09iamVjdCAqKXJlcyktPnN0X2ZsYWdzLmNmX2ZsYWdzID0gZmxhZ3MgJiBQeUNGX01BU0s7CiAgICAgICAgIH0KQEAgLTc2Nyw3ICs3NjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcmQgaXRlbSBpbiB0ZXJtaW5hbCBub2RlIG11c3QgYmUgYW4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnRlZ2VyLCBmb3VuZCAlcyIsCi0JCQkJICAgICBQeV9UWVBFKHRlbXApLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHRlbXApLT50cF9uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtOTQwLDkgKzk0MCw5IEBACiBWQUxJREFURVIobGlzdG1ha2VyKTsgICAgICAgICAgIFZBTElEQVRFUih5aWVsZF9zdG10KTsKIFZBTElEQVRFUih0ZXN0bGlzdDEpOyAgICAgICAgICAgVkFMSURBVEVSKGdlbl9mb3IpOwogVkFMSURBVEVSKGdlbl9pdGVyKTsgICAgICAgICAgICBWQUxJREFURVIoZ2VuX2lmKTsKLVZBTElEQVRFUih0ZXN0bGlzdF9nZXhwKTsJVkFMSURBVEVSKHlpZWxkX2V4cHIpOwotVkFMSURBVEVSKHlpZWxkX29yX3Rlc3RsaXN0KTsJVkFMSURBVEVSKG9yX3Rlc3QpOwotVkFMSURBVEVSKG9sZF90ZXN0KTsgCQlWQUxJREFURVIob2xkX2xhbWJkZWYpOworVkFMSURBVEVSKHRlc3RsaXN0X2dleHApOyAgICAgICBWQUxJREFURVIoeWllbGRfZXhwcik7CitWQUxJREFURVIoeWllbGRfb3JfdGVzdGxpc3QpOyAgIFZBTElEQVRFUihvcl90ZXN0KTsKK1ZBTElEQVRFUihvbGRfdGVzdCk7ICAgICAgICAgICAgVkFMSURBVEVSKG9sZF9sYW1iZGVmKTsKIAogI3VuZGVmIFZBTElEQVRFUgogCkBAIC0xMDMxLDcgKzEwMzEsNyBAQAogewogICAgIGludCBuY2ggPSBOQ0godHJlZSk7CiAgICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBjbGFzc2RlZikgJiYKLQkgICAgICAgCSgobmNoID09IDQpIHx8IChuY2ggPT0gNikgfHwgKG5jaCA9PSA3KSkpOworICAgICAgICAgICAgICAgICgobmNoID09IDQpIHx8IChuY2ggPT0gNikgfHwgKG5jaCA9PSA3KSkpOwogCiAgICAgaWYgKHJlcykgewogICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImNsYXNzIikKQEAgLTEwNDIsMTcgKzEwNDIsMTcgQEAKICAgICBlbHNlIHsKICAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDQsICJjbGFzcyIpOwogICAgIH0KLQkKKwogICAgIGlmIChyZXMpIHsKLQlpZiAobmNoID09IDcpIHsKLQkJcmVzID0gKCh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwgMikpICYmCi0JCQl2YWxpZGF0ZV90ZXN0bGlzdChDSElMRCh0cmVlLCAzKSkgJiYKLQkJCXZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLCA0KSkpKTsKLQl9Ci0JZWxzZSBpZiAobmNoID09IDYpIHsKLQkJcmVzID0gKHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLDIpKSAmJgotCQkJdmFsaWRhdGVfcnBhcmVuKENISUxEKHRyZWUsMykpKTsKLQl9CisgICAgICAgIGlmIChuY2ggPT0gNykgeworICAgICAgICAgICAgICAgIHJlcyA9ICgodmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIDIpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfdGVzdGxpc3QoQ0hJTEQodHJlZSwgMykpICYmCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwgNCkpKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobmNoID09IDYpIHsKKyAgICAgICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsMikpICYmCisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9ycGFyZW4oQ0hJTEQodHJlZSwzKSkpOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAocmVzKTsKIH0KQEAgLTE0MzMsNyArMTQzMyw3IEBACiAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2dlbl9pdGVyKENISUxEKHRyZWUsIDIpKTsKICAgICBlbHNlCiAgICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJnZW5faWYiKTsKLSAgICAKKwogICAgIGlmIChyZXMpCiAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaWYiKQogICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfb2xkX3Rlc3QoQ0hJTEQodHJlZSwgMSkpKTsKQEAgLTE1OTMsMTAgKzE1OTMsMTAgQEAKIHN0YXRpYyBpbnQKIHZhbGlkYXRlX3lpZWxkX29yX3Rlc3RsaXN0KG5vZGUgKnRyZWUpCiB7Ci0JaWYgKFRZUEUodHJlZSkgPT0geWllbGRfZXhwcikgCi0JCXJldHVybiB2YWxpZGF0ZV95aWVsZF9leHByKHRyZWUpOwotCWVsc2UKLQkJcmV0dXJuIHZhbGlkYXRlX3Rlc3RsaXN0KHRyZWUpOworICAgICAgICBpZiAoVFlQRSh0cmVlKSA9PSB5aWVsZF9leHByKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV95aWVsZF9leHByKHRyZWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX3Rlc3RsaXN0KHRyZWUpOwogfQogCiBzdGF0aWMgaW50CkBAIC0xNjExLDcgKzE2MTEsNyBAQAogICAgIGlmIChyZXMgJiYgbmNoID09IDMKICAgICAgICAgJiYgVFlQRShDSElMRCh0cmVlLCAxKSkgPT0gYXVnYXNzaWduKSB7CiAgICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKENISUxEKHRyZWUsIDEpLCAxLCAiYXVnYXNzaWduIikKLQkJJiYgdmFsaWRhdGVfeWllbGRfb3JfdGVzdGxpc3QoQ0hJTEQodHJlZSwgMikpOworICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3lpZWxkX29yX3Rlc3RsaXN0KENISUxEKHRyZWUsIDIpKTsKIAogICAgICAgICBpZiAocmVzKSB7CiAgICAgICAgICAgICBjaGFyICpzID0gU1RSKENISUxEKENISUxEKHRyZWUsIDEpLCAwKSk7CkBAIC0xODM3LDE0ICsxODM3LDE0IEBACiBzdGF0aWMgaW50CiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZXMobm9kZSAqdHJlZSkKIHsKLQlpbnQgbmNoID0gTkNIKHRyZWUpOwotCWludCByZXMgPSBpc19vZGQobmNoKSAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZShDSElMRCh0cmVlLCAwKSk7Ci0JaW50IGk7CisgICAgICAgIGludCBuY2ggPSBOQ0godHJlZSk7CisgICAgICAgIGludCByZXMgPSBpc19vZGQobmNoKSAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZShDSElMRCh0cmVlLCAwKSk7CisgICAgICAgIGludCBpOwogCi0JZm9yIChpID0gMTsgcmVzICYmIChpIDwgbmNoKTsgaSArPSAyKQotCSAgICByZXMgPSAodmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgaSkpCi0JCSAgICYmIHZhbGlkYXRlX2RvdHRlZF9hc19uYW1lKENISUxEKHRyZWUsIGkgKyAxKSkpOwotCXJldHVybiAocmVzKTsKKyAgICAgICAgZm9yIChpID0gMTsgcmVzICYmIChpIDwgbmNoKTsgaSArPSAyKQorICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGkpKQorICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2RvdHRlZF9hc19uYW1lKENISUxEKHRyZWUsIGkgKyAxKSkpOworICAgICAgICByZXR1cm4gKHJlcyk7CiB9CiAKIApAQCAtMTg1Nyw4ICsxODU3LDggQEAKICAgICBpbnQgaTsKIAogICAgIGZvciAoaSA9IDE7IHJlcyAmJiAoaSArIDEgPCBuY2gpOyBpICs9IDIpCi0JcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGkpKQotCSAgICAgICAmJiB2YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZShDSElMRCh0cmVlLCBpICsgMSkpKTsKKyAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGkpKQorICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfaW1wb3J0X2FzX25hbWUoQ0hJTEQodHJlZSwgaSArIDEpKSk7CiAgICAgcmV0dXJuIChyZXMpOwogfQogCkBAIC0xODY3LDEzICsxODY3LDEzIEBACiBzdGF0aWMgaW50CiB2YWxpZGF0ZV9pbXBvcnRfbmFtZShub2RlICp0cmVlKQogewotCXJldHVybiAodmFsaWRhdGVfbnR5cGUodHJlZSwgaW1wb3J0X25hbWUpCi0JCSYmIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJpbXBvcnRfbmFtZSIpCi0JCSYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJpbXBvcnQiKQotCQkmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZXMoQ0hJTEQodHJlZSwgMSkpKTsKKyAgICAgICAgcmV0dXJuICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBpbXBvcnRfbmFtZSkKKyAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAiaW1wb3J0X25hbWUiKQorICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJpbXBvcnQiKQorICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2RvdHRlZF9hc19uYW1lcyhDSElMRCh0cmVlLCAxKSkpOwogfQogCi0vKiBIZWxwZXIgZnVuY3Rpb24gdG8gY291bnQgdGhlIG51bWJlciBvZiBsZWFkaW5nIGRvdHMgaW4gCisvKiBIZWxwZXIgZnVuY3Rpb24gdG8gY291bnQgdGhlIG51bWJlciBvZiBsZWFkaW5nIGRvdHMgaW4KICAqICdmcm9tIC4uLm1vZHVsZSBpbXBvcnQgbmFtZScKICAqLwogc3RhdGljIGludApAQCAtMTg4MSw4ICsxODgxLDggQEAKIHsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBOQ0godHJlZSk7IGkrKykKLQkJaWYgKFRZUEUoQ0hJTEQodHJlZSwgaSkpICE9IERPVCkKLQkJCWJyZWFrOworICAgICAgICAgICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIGkpKSAhPSBET1QpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgcmV0dXJuIGktMTsKIH0KIApAQCAtMTg5MiwyNCArMTg5MiwyNCBAQAogc3RhdGljIGludAogdmFsaWRhdGVfaW1wb3J0X2Zyb20obm9kZSAqdHJlZSkKIHsKLQlpbnQgbmNoID0gTkNIKHRyZWUpOwotCWludCBuZG90cyA9IGNvdW50X2Zyb21fZG90cyh0cmVlKTsKLQlpbnQgaGF2ZW5hbWUgPSAoVFlQRShDSElMRCh0cmVlLCBuZG90cyArIDEpKSA9PSBkb3R0ZWRfbmFtZSk7Ci0JaW50IG9mZnNldCA9IG5kb3RzICsgaGF2ZW5hbWU7Ci0JaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGltcG9ydF9mcm9tKQotCQkmJiAobmNoID49IDQgKyBuZG90cykKLQkJJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImZyb20iKQotCQkmJiAoIWhhdmVuYW1lIHx8IHZhbGlkYXRlX2RvdHRlZF9uYW1lKENISUxEKHRyZWUsIG5kb3RzICsgMSkpKQotCQkmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIG9mZnNldCArIDEpLCAiaW1wb3J0Iik7CisgICAgICAgIGludCBuY2ggPSBOQ0godHJlZSk7CisgICAgICAgIGludCBuZG90cyA9IGNvdW50X2Zyb21fZG90cyh0cmVlKTsKKyAgICAgICAgaW50IGhhdmVuYW1lID0gKFRZUEUoQ0hJTEQodHJlZSwgbmRvdHMgKyAxKSkgPT0gZG90dGVkX25hbWUpOworICAgICAgICBpbnQgb2Zmc2V0ID0gbmRvdHMgKyBoYXZlbmFtZTsKKyAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGltcG9ydF9mcm9tKQorICAgICAgICAgICAgICAgICYmIChuY2ggPj0gNCArIG5kb3RzKQorICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJmcm9tIikKKyAgICAgICAgICAgICAgICAmJiAoIWhhdmVuYW1lIHx8IHZhbGlkYXRlX2RvdHRlZF9uYW1lKENISUxEKHRyZWUsIG5kb3RzICsgMSkpKQorICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMSksICJpbXBvcnQiKTsKIAotCWlmIChyZXMgJiYgVFlQRShDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkgPT0gTFBBUikKLQkgICAgcmVzID0gKChuY2ggPT0gb2Zmc2V0ICsgNSkKLQkJICAgJiYgdmFsaWRhdGVfbHBhcmVuKENISUxEKHRyZWUsIG9mZnNldCArIDIpKQotCQkgICAmJiB2YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZXMoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMykpCi0JCSAgICYmIHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLCBvZmZzZXQgKyA0KSkpOwotCWVsc2UgaWYgKHJlcyAmJiBUWVBFKENISUxEKHRyZWUsIG9mZnNldCArIDIpKSAhPSBTVEFSKQotCSAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZXMoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpOwotCXJldHVybiAocmVzKTsKKyAgICAgICAgaWYgKHJlcyAmJiBUWVBFKENISUxEKHRyZWUsIG9mZnNldCArIDIpKSA9PSBMUEFSKQorICAgICAgICAgICAgcmVzID0gKChuY2ggPT0gb2Zmc2V0ICsgNSkKKyAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpCisgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfaW1wb3J0X2FzX25hbWVzKENISUxEKHRyZWUsIG9mZnNldCArIDMpKQorICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLCBvZmZzZXQgKyA0KSkpOworICAgICAgICBlbHNlIGlmIChyZXMgJiYgVFlQRShDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkgIT0gU1RBUikKKyAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2ltcG9ydF9hc19uYW1lcyhDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSk7CisgICAgICAgIHJldHVybiAocmVzKTsKIH0KIAogCkBAIC0xOTIxLDkgKzE5MjEsOSBAQAogICAgIGludCByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAiaW1wb3J0X3N0bXQiKTsKIAogICAgIGlmIChyZXMpIHsKLQlpbnQgbnR5cGUgPSBUWVBFKENISUxEKHRyZWUsIDApKTsKKyAgICAgICAgaW50IG50eXBlID0gVFlQRShDSElMRCh0cmVlLCAwKSk7CiAKLQlpZiAobnR5cGUgPT0gaW1wb3J0X25hbWUgfHwgbnR5cGUgPT0gaW1wb3J0X2Zyb20pCisgICAgICAgIGlmIChudHlwZSA9PSBpbXBvcnRfbmFtZSB8fCBudHlwZSA9PSBpbXBvcnRfZnJvbSkKICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX25vZGUoQ0hJTEQodHJlZSwgMCkpOwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHJlcyA9IDA7CkBAIC0yNDU2LDExICsyNDU2LDExIEBACiAgICAgICAgICAgICAgICAgICAgJiYgKHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLCBuY2ggLSAxKSkpKTsKIAogICAgICAgICAgICAgaWYgKHJlcyAmJiAobmNoID09IDMpKSB7Ci0JCWlmIChUWVBFKENISUxEKHRyZWUsIDEpKT09eWllbGRfZXhwcikKLQkJCXJlcyA9IHZhbGlkYXRlX3lpZWxkX2V4cHIoQ0hJTEQodHJlZSwgMSkpOwotCQllbHNlCi0gICAgICAgICAgICAgICAgCXJlcyA9IHZhbGlkYXRlX3Rlc3RsaXN0X2dleHAoQ0hJTEQodHJlZSwgMSkpOwotCSAgICB9CisgICAgICAgICAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgMSkpPT15aWVsZF9leHByKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfeWllbGRfZXhwcihDSElMRCh0cmVlLCAxKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdGxpc3RfZ2V4cChDSElMRCh0cmVlLCAxKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIExTUUI6CiAgICAgICAgICAgICBpZiAobmNoID09IDIpCkBAIC0yNTg2LDE3ICsyNTg2LDE3IEBACiAgICAgaW50IG9rOwogICAgIGludCBuY2ggPSBOQ0godHJlZSk7CiAgICAgb2sgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZGVjb3JhdG9yKSAmJgotCSAgKG5jaCA9PSAzIHx8IG5jaCA9PSA1IHx8IG5jaCA9PSA2KSAmJgotCSAgdmFsaWRhdGVfYXQoQ0hJTEQodHJlZSwgMCkpICYmCi0JICB2YWxpZGF0ZV9kb3R0ZWRfbmFtZShDSElMRCh0cmVlLCAxKSkgJiYKLQkgIHZhbGlkYXRlX25ld2xpbmUoUkNISUxEKHRyZWUsIC0xKSkpOworICAgICAgICAgIChuY2ggPT0gMyB8fCBuY2ggPT0gNSB8fCBuY2ggPT0gNikgJiYKKyAgICAgICAgICB2YWxpZGF0ZV9hdChDSElMRCh0cmVlLCAwKSkgJiYKKyAgICAgICAgICB2YWxpZGF0ZV9kb3R0ZWRfbmFtZShDSElMRCh0cmVlLCAxKSkgJiYKKyAgICAgICAgICB2YWxpZGF0ZV9uZXdsaW5lKFJDSElMRCh0cmVlLCAtMSkpKTsKIAogICAgIGlmIChvayAmJiBuY2ggIT0gMykgewotCW9rID0gKHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLCAyKSkgJiYKLQkgICAgICB2YWxpZGF0ZV9ycGFyZW4oUkNISUxEKHRyZWUsIC0yKSkpOworICAgICAgICBvayA9ICh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwgMikpICYmCisgICAgICAgICAgICAgIHZhbGlkYXRlX3JwYXJlbihSQ0hJTEQodHJlZSwgLTIpKSk7CiAKLQlpZiAob2sgJiYgbmNoID09IDYpCi0JICAgIG9rID0gdmFsaWRhdGVfYXJnbGlzdChDSElMRCh0cmVlLCAzKSk7CisgICAgICAgIGlmIChvayAmJiBuY2ggPT0gNikKKyAgICAgICAgICAgIG9rID0gdmFsaWRhdGVfYXJnbGlzdChDSElMRCh0cmVlLCAzKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIG9rOwpAQCAtMjYwOCwxMiArMjYwOCwxMiBAQAogc3RhdGljIGludAogdmFsaWRhdGVfZGVjb3JhdG9ycyhub2RlICp0cmVlKQogewotICAgIGludCBpLCBuY2gsIG9rOyAKKyAgICBpbnQgaSwgbmNoLCBvazsKICAgICBuY2ggPSBOQ0godHJlZSk7CiAgICAgb2sgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBkZWNvcmF0b3JzKSAmJiBuY2ggPj0gMTsKIAogICAgIGZvciAoaSA9IDA7IG9rICYmIGkgPCBuY2g7ICsraSkKLQlvayA9IHZhbGlkYXRlX2RlY29yYXRvcihDSElMRCh0cmVlLCBpKSk7CisgICAgICAgIG9rID0gdmFsaWRhdGVfZGVjb3JhdG9yKENISUxEKHRyZWUsIGkpKTsKIAogICAgIHJldHVybiBvazsKIH0KQEAgLTI2NDQsMTQgKzI2NDQsMTQgQEAKICAgICAgICAgJiYgKChuY2ggPT0gNCkgfHwgKG5jaCA9PSA1KSkKICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgIndpdGgiKQogICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDEpKQotICAgICAgICAmJiAobmNoID09IDQgfHwgdmFsaWRhdGVfd2l0aF92YXIoQ0hJTEQodHJlZSwgMikpKSAKKyAgICAgICAgJiYgKG5jaCA9PSA0IHx8IHZhbGlkYXRlX3dpdGhfdmFyKENISUxEKHRyZWUsIDIpKSkKICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oUkNISUxEKHRyZWUsIC0yKSkKICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoUkNISUxEKHRyZWUsIC0xKSkpOwogICAgcmV0dXJuIG9rOwogfQogCiAvKiAgZnVuY2RlZjoKLSAqICAgICAgCisgKgogICogICAgIC01ICAgLTQgICAgICAgICAtMyAgLTIgICAgLTEKICAqICAnZGVmJyBOQU1FIHBhcmFtZXRlcnMgJzonIHN1aXRlCiAgKi8KQEAgLTI2NjAsMTIgKzI2NjAsMTIgQEAKIHsKICAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwogICAgIGludCBvayA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBmdW5jZGVmKQotCSAgICAgICAmJiAobmNoID09IDUpCi0JICAgICAgICYmIHZhbGlkYXRlX25hbWUoUkNISUxEKHRyZWUsIC01KSwgImRlZiIpCi0JICAgICAgICYmIHZhbGlkYXRlX250eXBlKFJDSElMRCh0cmVlLCAtNCksIE5BTUUpCi0JICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKFJDSElMRCh0cmVlLCAtMikpCi0JICAgICAgICYmIHZhbGlkYXRlX3BhcmFtZXRlcnMoUkNISUxEKHRyZWUsIC0zKSkKLQkgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoUkNISUxEKHRyZWUsIC0xKSkpOworICAgICAgICAgICAgICAgJiYgKG5jaCA9PSA1KQorICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShSQ0hJTEQodHJlZSwgLTUpLCAiZGVmIikKKyAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKFJDSElMRCh0cmVlLCAtNCksIE5BTUUpCisgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihSQ0hJTEQodHJlZSwgLTIpKQorICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfcGFyYW1ldGVycyhSQ0hJTEQodHJlZSwgLTMpKQorICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoUkNISUxEKHRyZWUsIC0xKSkpOwogICAgIHJldHVybiBvazsKIH0KIApAQCAtMjY3OCwxMSArMjY3OCwxMSBAQAogewogICBpbnQgbmNoID0gTkNIKHRyZWUpOwogICBpbnQgb2sgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgZGVjb3JhdGVkKQotCSAgICAmJiAobmNoID09IDIpCi0JICAgICYmIHZhbGlkYXRlX2RlY29yYXRvcnMoUkNISUxEKHRyZWUsIC0yKSkKLQkgICAgJiYgKHZhbGlkYXRlX2Z1bmNkZWYoUkNISUxEKHRyZWUsIC0xKSkKLQkJfHwgdmFsaWRhdGVfY2xhc3MoUkNISUxEKHRyZWUsIC0xKSkpCi0JICAgICk7CisgICAgICAgICAgICAmJiAobmNoID09IDIpCisgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kZWNvcmF0b3JzKFJDSElMRCh0cmVlLCAtMikpCisgICAgICAgICAgICAmJiAodmFsaWRhdGVfZnVuY2RlZihSQ0hJTEQodHJlZSwgLTEpKQorICAgICAgICAgICAgICAgIHx8IHZhbGlkYXRlX2NsYXNzKFJDSElMRCh0cmVlLCAtMSkpKQorICAgICAgICAgICAgKTsKICAgcmV0dXJuIG9rOwogfQogCkBAIC0zMDMyLDkgKzMwMzIsOSBAQAogICAgICAgICAgIGNhc2UgY2xhc3NkZWY6CiAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jbGFzcyh0cmVlKTsKICAgICAgICAgICAgIGJyZWFrOwotCSAgY2FzZSBkZWNvcmF0ZWQ6Ci0JICAgIHJlcyA9IHZhbGlkYXRlX2RlY29yYXRlZCh0cmVlKTsKLQkgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBkZWNvcmF0ZWQ6CisgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9kZWNvcmF0ZWQodHJlZSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiAgIlRyaXZpYWwiIHBhcnNlIHRyZWUgbm9kZXMuCiAgICAgICAgICAgICAgKiAgKFdoeSBkaWQgSSBjYWxsIHRoZXNlIHRyaXZpYWw/KQpAQCAtMzEwNiwxMiArMzEwNiwxMiBAQAogICAgICAgICAgIGNhc2UgaW1wb3J0X3N0bXQ6CiAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfc3RtdCh0cmVlKTsKICAgICAgICAgICAgIGJyZWFrOwotCSAgY2FzZSBpbXBvcnRfbmFtZToKLQkgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X25hbWUodHJlZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBpbXBvcnRfZnJvbToKLQkgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X2Zyb20odHJlZSk7Ci0JICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgaW1wb3J0X25hbWU6CisgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfbmFtZSh0cmVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgaW1wb3J0X2Zyb206CisgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfZnJvbSh0cmVlKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgZ2xvYmFsX3N0bXQ6CiAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9nbG9iYWxfc3RtdCh0cmVlKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzM0Nyw3ICszMzQ3LDcgQEAKICAgICBQeV9UWVBFKCZQeVNUX1R5cGUpID0gJlB5VHlwZV9UeXBlOwogICAgIG1vZHVsZSA9IFB5X0luaXRNb2R1bGUoInBhcnNlciIsIHBhcnNlcl9mdW5jdGlvbnMpOwogICAgIGlmIChtb2R1bGUgPT0gTlVMTCkKLSAgICAJcmV0dXJuOworICAgICAgICByZXR1cm47CiAKICAgICBpZiAocGFyc2VyX2Vycm9yID09IDApCiAgICAgICAgIHBhcnNlcl9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigicGFyc2VyLlBhcnNlckVycm9yIiwgTlVMTCwgTlVMTCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3B1cmVtb2R1bGUuYyBiL01vZHVsZXMvcHVyZW1vZHVsZS5jCmluZGV4IGVkZTYzYWIuLmI4OWYxNzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHVyZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvcHVyZW1vZHVsZS5jCkBAIC01OCwxMDcgKzU4LDEwNyBAQAogdHlwZWRlZiBpbnQgKCpTdHJpbmdJbnRBcmdGdW5jKShjb25zdCBjaGFyKiwgaW50KTsKIAogCi0MCisKIHN0YXRpYyBQeU9iamVjdCoKIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihWb2lkQXJnRnVuYyBmdW5jLCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0YXR1czsKKyAgICBpbnQgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGF0dXMgPSBmdW5jKCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IGZ1bmMoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGNhbGxfc3RyaW5nYXJnX2Z1bmN0aW9uKFN0cmluZ0FyZ0Z1bmMgZnVuYywgUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzdGF0dXM7Ci0JY2hhciogc3RyaW5nYXJnOworICAgIGludCBzdGF0dXM7CisgICAgY2hhciogc3RyaW5nYXJnOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnN0cmluZ2FyZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHJpbmdhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IGZ1bmMoc3RyaW5nYXJnKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CisgICAgc3RhdHVzID0gZnVuYyhzdHJpbmdhcmcpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogY2FsbF9zdHJpbmdvcmludF9mdW5jdGlvbihTdHJpbmdBcmdGdW5jIGZ1bmMsIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc3RhdHVzOwotCWludCBpbnRhcmc7Ci0JY2hhciogc3RyaW5nYXJnOworICAgIGludCBzdGF0dXM7CisgICAgaW50IGludGFyZzsKKyAgICBjaGFyKiBzdHJpbmdhcmc7CiAKLSAgICAgICAgLyogYWNjb3JkaW5nIHRvIHRoZSBxdWFudGlmeS5oIGZpbGUsIHRoZSBhcmd1bWVudCB0bwotICAgICAgICAgKiBxdWFudGlmeV8qX3JlY29yZGluZ19zeXN0ZW1fY2FsbCBjYW4gYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywKLQkgKiBidXQgdGhlIGZ1bmN0aW9ucyBhcmUgcHJvdG90eXBlZCBhcyB0YWtpbmcgYSBzaW5nbGUgY2hhcioKLQkgKiBhcmd1bWVudC4gWWlrZXMhCisgICAgLyogYWNjb3JkaW5nIHRvIHRoZSBxdWFudGlmeS5oIGZpbGUsIHRoZSBhcmd1bWVudCB0bworICAgICAqIHF1YW50aWZ5XypfcmVjb3JkaW5nX3N5c3RlbV9jYWxsIGNhbiBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLAorICAgICAqIGJ1dCB0aGUgZnVuY3Rpb25zIGFyZSBwcm90b3R5cGVkIGFzIHRha2luZyBhIHNpbmdsZSBjaGFyKgorICAgICAqIGFyZ3VtZW50LiBZaWtlcyEKKyAgICAgKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZpbnRhcmcpKQorICAgICAgICAvKiBmdW5jIGlzIHByb3RvdHlwZWQgYXMgaW50KCopKGNoYXIqKQorICAgICAgICAgKiBiZXR0ZXIgc2h1dCB1cCB0aGUgY29tcGlsZXIKICAgICAgICAgICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiLCAmaW50YXJnKSkKLQkJLyogZnVuYyBpcyBwcm90b3R5cGVkIGFzIGludCgqKShjaGFyKikKLQkJICogYmV0dGVyIHNodXQgdXAgdGhlIGNvbXBpbGVyCi0JCSAqLwotCQlzdGF0dXMgPSBmdW5jKChjaGFyKilpbnRhcmcpOworICAgICAgICBzdGF0dXMgPSBmdW5jKChjaGFyKilpbnRhcmcpOwogCi0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZzdHJpbmdhcmcpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UKLQkJCXN0YXR1cyA9IGZ1bmMoc3RyaW5nYXJnKTsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmc3RyaW5nYXJnKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdGF0dXMgPSBmdW5jKHN0cmluZ2FyZyk7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogY2FsbF9wcmludGZpc2hfZnVuY3Rpb24oUHJpbnRmaXNoRnVuYyBmdW5jLCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JLyogd2Ugc3VwcG9ydCB0aGUgcHJpbnRmKCkgc3R5bGUgdmFyYXJnIGZ1bmN0aW9ucyBieSByZXF1aXJpbmcgdGhlCi0gICAgICAgICAqIGZvcm1hdHRpbmcgYmUgZG9uZSBpbiBQeXRob24uICBBdCB0aGUgQyBsZXZlbCB3ZSBwYXNzIGp1c3QgYSBzdHJpbmcKLSAgICAgICAgICogdG8gdGhlIHByaW50ZigpIHN0eWxlIGZ1bmN0aW9uLgotICAgICAgICAgKi8KLQlpbnQgc3RhdHVzOwotCWNoYXIqIGFyZ3N0cmluZzsKKyAgICAvKiB3ZSBzdXBwb3J0IHRoZSBwcmludGYoKSBzdHlsZSB2YXJhcmcgZnVuY3Rpb25zIGJ5IHJlcXVpcmluZyB0aGUKKyAgICAgKiBmb3JtYXR0aW5nIGJlIGRvbmUgaW4gUHl0aG9uLiAgQXQgdGhlIEMgbGV2ZWwgd2UgcGFzcyBqdXN0IGEgc3RyaW5nCisgICAgICogdG8gdGhlIHByaW50ZigpIHN0eWxlIGZ1bmN0aW9uLgorICAgICAqLworICAgIGludCBzdGF0dXM7CisgICAgY2hhciogYXJnc3RyaW5nOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJmFyZ3N0cmluZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZhcmdzdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IGZ1bmMoIiVzIiwgYXJnc3RyaW5nKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CisgICAgc3RhdHVzID0gZnVuYygiJXMiLCBhcmdzdHJpbmcpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24oU3RyaW5nQXJnRnVuYyBmdW5jLCBQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBtZW1yZXA7Ci0JaW50IGlkOworICAgIGxvbmcgbWVtcmVwOworICAgIGludCBpZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZtZW1yZXApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmbWVtcmVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZCA9IGZ1bmMoKGNoYXIqKW1lbXJlcCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBpZCk7CisgICAgaWQgPSBmdW5jKChjaGFyKiltZW1yZXApOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgaWQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBjYWxsX3N0cmluZ2FuZGludF9mdW5jdGlvbihTdHJpbmdJbnRBcmdGdW5jIGZ1bmMsIFB5T2JqZWN0ICpzZWxmLAotCQkJICAgUHlPYmplY3QgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHNyY3JlcDsKLQlpbnQgc2l6ZTsKLQlpbnQgc3RhdHVzOworICAgIGxvbmcgc3JjcmVwOworICAgIGludCBzaXplOworICAgIGludCBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpIiwgJnNyY3JlcCwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpIiwgJnNyY3JlcCwgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IGZ1bmMoKGNoYXIqKXNyY3JlcCwgc2l6ZSk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IGZ1bmMoKGNoYXIqKXNyY3JlcCwgc2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOwogfQogCiAKLQwKKwogLyogZnVuY3Rpb25zIGNvbW1vbiB0byBhbGwgcHJvZHVjdHMKICAqCiAgKiBOLkIuIFRoZXNlIHByaW50ZigpIHN0eWxlIGZ1bmN0aW9ucyBhcmUgYSBiaXQgb2YgYSBrbHVkZ2UuICBTaW5jZSB0aGUKQEAgLTE3NCwyNiArMTc0LDI2IEBACiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmVfbG9nZmlsZV9wcmludGYoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCXJldHVybiBjYWxsX3ByaW50ZmlzaF9mdW5jdGlvbihwdXJlX2xvZ2ZpbGVfcHJpbnRmLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9wcmludGZpc2hfZnVuY3Rpb24ocHVyZV9sb2dmaWxlX3ByaW50Ziwgc2VsZiwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyZV9wcmludGYoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCXJldHVybiBjYWxsX3ByaW50ZmlzaF9mdW5jdGlvbihwdXJlX3ByaW50Ziwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfcHJpbnRmaXNoX2Z1bmN0aW9uKHB1cmVfcHJpbnRmLCBzZWxmLCBhcmdzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJlX3ByaW50Zl93aXRoX2Jhbm5lcihQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfcHJpbnRmaXNoX2Z1bmN0aW9uKHB1cmVfcHJpbnRmX3dpdGhfYmFubmVyLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9wcmludGZpc2hfZnVuY3Rpb24ocHVyZV9wcmludGZfd2l0aF9iYW5uZXIsIHNlbGYsIGFyZ3MpOwogfQogCiAKICNlbmRpZiAvKiBDT01NT05fUFVSRV9GVU5DVElPTlMgKi8KIAogCi0MCisKIC8qIFB1cmlmeSBmdW5jdGlvbnMKICAqCiAgKiBOLkIuIFRoZXJlIGFyZSBzb21lIGludGVyZmFjZXMgZGVzY3JpYmVkIGluIHRoZSBwdXJpZnkuaCBmaWxlIHRoYXQgYXJlCkBAIC0yMzUsOTcgKzIzNSw5NyBAQAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfYWxsX2ludXNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9hbGxfaW51c2UsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2FsbF9pbnVzZSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9hbGxfbGVha3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2FsbF9sZWFrcywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfYWxsX2xlYWtzLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X25ld19pbnVzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfbmV3X2ludXNlLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfaW51c2UsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfbmV3X2xlYWtzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfbGVha3MsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X25ld19sZWFrcywgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9jbGVhcl9pbnVzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfY2xlYXJfaW51c2UsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2NsZWFyX2ludXNlLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2NsZWFyX2xlYWtzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9jbGVhcl9sZWFrcywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfY2xlYXJfbGVha3MsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfYWxsX2Zkc19pbnVzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfYWxsX2Zkc19pbnVzZSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfYWxsX2Zkc19pbnVzZSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9uZXdfZmRzX2ludXNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfZmRzX2ludXNlLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfZmRzX2ludXNlLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3ByaW50Zl93aXRoX2NhbGxfY2hhaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ByaW50ZmlzaF9mdW5jdGlvbihwdXJpZnlfcHJpbnRmX3dpdGhfY2FsbF9jaGFpbiwKLQkJCQkgICAgICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfcHJpbnRmaXNoX2Z1bmN0aW9uKHB1cmlmeV9wcmludGZfd2l0aF9jYWxsX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3NldF9wb29sX2lkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIG1lbXJlcDsKLQlpbnQgaWQ7CisgICAgbG9uZyBtZW1yZXA7CisgICAgaW50IGlkOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaTpwdXJpZnlfc2V0X3Bvb2xfaWQiLCAmbWVtcmVwLCAmaWQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpOnB1cmlmeV9zZXRfcG9vbF9pZCIsICZtZW1yZXAsICZpZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcHVyaWZ5X3NldF9wb29sX2lkKChjaGFyKiltZW1yZXAsIGlkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgcHVyaWZ5X3NldF9wb29sX2lkKChjaGFyKiltZW1yZXAsIGlkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9nZXRfcG9vbF9pZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV9nZXRfcG9vbF9pZCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV9nZXRfcG9vbF9pZCwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9zZXRfdXNlcl9kYXRhKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIG1lbXJlcDsKLQlsb25nIGRhdGFyZXA7CisgICAgbG9uZyBtZW1yZXA7CisgICAgbG9uZyBkYXRhcmVwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpwdXJpZnlfc2V0X3VzZXJfZGF0YSIsICZtZW1yZXAsICZkYXRhcmVwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsbDpwdXJpZnlfc2V0X3VzZXJfZGF0YSIsICZtZW1yZXAsICZkYXRhcmVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlwdXJpZnlfc2V0X3VzZXJfZGF0YSgoY2hhciopbWVtcmVwLCAodm9pZCopZGF0YXJlcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHB1cmlmeV9zZXRfdXNlcl9kYXRhKChjaGFyKiltZW1yZXAsICh2b2lkKilkYXRhcmVwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9nZXRfdXNlcl9kYXRhKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgLyogY2FuJ3QgdXNlIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKCkgc2luY2UgcHVyaWZ5X2dldF91c2VyX2RhdGEoKQotICAgICAgICAgKiByZXR1cm5zIGEgdm9pZCoKLSAgICAgICAgICovCi0JbG9uZyBtZW1yZXA7Ci0Jdm9pZCogZGF0YTsKKyAgICAvKiBjYW4ndCB1c2UgY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24oKSBzaW5jZSBwdXJpZnlfZ2V0X3VzZXJfZGF0YSgpCisgICAgICogcmV0dXJucyBhIHZvaWQqCisgICAgICovCisgICAgbG9uZyBtZW1yZXA7CisgICAgdm9pZCogZGF0YTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpwdXJpZnlfZ2V0X3VzZXJfZGF0YSIsICZtZW1yZXApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cHVyaWZ5X2dldF91c2VyX2RhdGEiLCAmbWVtcmVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlkYXRhID0gcHVyaWZ5X2dldF91c2VyX2RhdGEoKGNoYXIqKW1lbXJlcCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylkYXRhKTsKKyAgICBkYXRhID0gcHVyaWZ5X2dldF91c2VyX2RhdGEoKGNoYXIqKW1lbXJlcCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylkYXRhKTsKIH0KIAotDAorCiAvKiB0aGlzIGdsb2JhbCB2YXJpYWJsZSBpcyBzaGFyZWQgYnkgYm90aCBtYXBwaW5nIGZ1bmN0aW9uczoKICAqIHB1cmVfcHVyaWZ5X21hcF9wb29sKCkgYW5kIHB1cmVfcHVyaWZ5X21hcF9wb29sX2lkKCkuICBTaW5jZSB0aGV5IGNhY2hlCiAgKiB0aGlzIHZhcmlhYmxlIGl0IHNob3VsZCBiZSBzYWZlIGluIHRoZSBmYWNlIG9mIHJlY3Vyc2lvbiBvciBjcm9zcwpAQCAtMzQxLDMwMyArMzQxLDMwMyBAQAogc3RhdGljIHZvaWQKIG1hcF9wb29sX2NhbGxiYWNrKGNoYXIqIG1lbSwgaW50IHVzZXJfc2l6ZSwgdm9pZCAqdXNlcl9hdXhfZGF0YSkKIHsKLQlsb25nIG1lbXJlcCA9IChsb25nKW1lbTsKLQlsb25nIHVzZXJfYXV4X2RhdGFfcmVwID0gKGxvbmcpdXNlcl9hdXhfZGF0YTsKLQlQeU9iamVjdCogcmVzdWx0OwotCVB5T2JqZWN0KiBtZW1vYmogPSBQeV9CdWlsZFZhbHVlKCJsaWwiLCBtZW1yZXAsIHVzZXJfc2l6ZSwKLQkJCQkJIHVzZXJfYXV4X2RhdGFfcmVwKTsKKyAgICBsb25nIG1lbXJlcCA9IChsb25nKW1lbTsKKyAgICBsb25nIHVzZXJfYXV4X2RhdGFfcmVwID0gKGxvbmcpdXNlcl9hdXhfZGF0YTsKKyAgICBQeU9iamVjdCogcmVzdWx0OworICAgIFB5T2JqZWN0KiBtZW1vYmogPSBQeV9CdWlsZFZhbHVlKCJsaWwiLCBtZW1yZXAsIHVzZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX2F1eF9kYXRhX3JlcCk7CiAKLQlpZiAobWVtb2JqID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBpZiAobWVtb2JqID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KE1hcENhbGxhYmxlLCBtZW1vYmopOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5X0RFQ1JFRihtZW1vYmopOworICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KE1hcENhbGxhYmxlLCBtZW1vYmopOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRihtZW1vYmopOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9tYXBfcG9vbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIC8qIGNhY2hlIGdsb2JhbCB2YXJpYWJsZSBpbiBjYXNlIG9mIHJlY3Vyc2lvbiAqLwotCVB5T2JqZWN0KiBzYXZlZF9jYWxsYWJsZSA9IE1hcENhbGxhYmxlOwotCVB5T2JqZWN0KiBhcmdfY2FsbGFibGU7Ci0JaW50IGlkOworICAgIC8qIGNhY2hlIGdsb2JhbCB2YXJpYWJsZSBpbiBjYXNlIG9mIHJlY3Vyc2lvbiAqLworICAgIFB5T2JqZWN0KiBzYXZlZF9jYWxsYWJsZSA9IE1hcENhbGxhYmxlOworICAgIFB5T2JqZWN0KiBhcmdfY2FsbGFibGU7CisgICAgaW50IGlkOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpwdXJpZnlfbWFwX3Bvb2wiLCAmaWQsICZhcmdfY2FsbGFibGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOnB1cmlmeV9tYXBfcG9vbCIsICZpZCwgJmFyZ19jYWxsYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGFyZ19jYWxsYWJsZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCU1hcENhbGxhYmxlID0gYXJnX2NhbGxhYmxlOwotCXB1cmlmeV9tYXBfcG9vbChpZCwgbWFwX3Bvb2xfY2FsbGJhY2spOwotCU1hcENhbGxhYmxlID0gc2F2ZWRfY2FsbGFibGU7CisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGFyZ19jYWxsYWJsZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgTWFwQ2FsbGFibGUgPSBhcmdfY2FsbGFibGU7CisgICAgcHVyaWZ5X21hcF9wb29sKGlkLCBtYXBfcG9vbF9jYWxsYmFjayk7CisgICAgTWFwQ2FsbGFibGUgPSBzYXZlZF9jYWxsYWJsZTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyB2b2lkCiBQdXJpZnlNYXBQb29sSWRDYWxsYmFjayhpbnQgaWQpCiB7Ci0JUHlPYmplY3QqIHJlc3VsdDsKLQlQeU9iamVjdCogaW50b2JqID0gUHlfQnVpbGRWYWx1ZSgiaSIsIGlkKTsKKyAgICBQeU9iamVjdCogcmVzdWx0OworICAgIFB5T2JqZWN0KiBpbnRvYmogPSBQeV9CdWlsZFZhbHVlKCJpIiwgaWQpOwogCi0JaWYgKGludG9iaiA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgaWYgKGludG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChNYXBDYWxsYWJsZSwgaW50b2JqKTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYoaW50b2JqKTsKKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChNYXBDYWxsYWJsZSwgaW50b2JqKTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYoaW50b2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfbWFwX3Bvb2xfaWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICAvKiBjYWNoZSBnbG9iYWwgdmFyaWFibGUgaW4gY2FzZSBvZiByZWN1cnNpb24gKi8KLQlQeU9iamVjdCogc2F2ZWRfY2FsbGFibGUgPSBNYXBDYWxsYWJsZTsKLQlQeU9iamVjdCogYXJnX2NhbGxhYmxlOworICAgIC8qIGNhY2hlIGdsb2JhbCB2YXJpYWJsZSBpbiBjYXNlIG9mIHJlY3Vyc2lvbiAqLworICAgIFB5T2JqZWN0KiBzYXZlZF9jYWxsYWJsZSA9IE1hcENhbGxhYmxlOworICAgIFB5T2JqZWN0KiBhcmdfY2FsbGFibGU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86cHVyaWZ5X21hcF9wb29sX2lkIiwgJmFyZ19jYWxsYWJsZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpwdXJpZnlfbWFwX3Bvb2xfaWQiLCAmYXJnX2NhbGxhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soYXJnX2NhbGxhYmxlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZS4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhhcmdfY2FsbGFibGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJBcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlNYXBDYWxsYWJsZSA9IGFyZ19jYWxsYWJsZTsKLQlwdXJpZnlfbWFwX3Bvb2xfaWQoUHVyaWZ5TWFwUG9vbElkQ2FsbGJhY2spOwotCU1hcENhbGxhYmxlID0gc2F2ZWRfY2FsbGFibGU7CisgICAgTWFwQ2FsbGFibGUgPSBhcmdfY2FsbGFibGU7CisgICAgcHVyaWZ5X21hcF9wb29sX2lkKFB1cmlmeU1hcFBvb2xJZENhbGxiYWNrKTsKKyAgICBNYXBDYWxsYWJsZSA9IHNhdmVkX2NhbGxhYmxlOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCi0MCisKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X25ld19tZXNzYWdlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfbmV3X21lc3NhZ2VzLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9uZXdfbWVzc2FnZXMsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfYWxsX21lc3NhZ2VzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9hbGxfbWVzc2FnZXMsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2FsbF9tZXNzYWdlcywgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9jbGVhcl9tZXNzYWdlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfY2xlYXJfbWVzc2FnZXMsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X2NsZWFyX21lc3NhZ2VzLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2NsZWFyX25ld19tZXNzYWdlcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfY2xlYXJfbmV3X21lc3NhZ2VzLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9jbGVhcl9uZXdfbWVzc2FnZXMsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfc3RhcnRfYmF0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocHVyaWZ5X3N0YXJ0X2JhdGNoLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9zdGFydF9iYXRjaCwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9zdGFydF9iYXRjaF9zaG93X2ZpcnN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV9zdGFydF9iYXRjaF9zaG93X2ZpcnN0LAotCQkJCSAgICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfc3RhcnRfYmF0Y2hfc2hvd19maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfc3RvcF9iYXRjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfc3RvcF9iYXRjaCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfc3RvcF9iYXRjaCwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9uYW1lX3RocmVhZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgICAgIC8qIGNhbid0IHN0cmljdGx5IHVzZSBjYWxsX3N0cmluZ2FyZ19mdW5jdGlvbiBzaW5jZQotICAgICAgICAgKiBwdXJpZnlfbmFtZV90aHJlYWQgdGFrZXMgYSBjb25zdCBjaGFyKiwgbm90IGEgY2hhcioKLSAgICAgICAgICovCi0JaW50IHN0YXR1czsKLQljaGFyKiBzdHJpbmdhcmc7CisgICAgLyogY2FuJ3Qgc3RyaWN0bHkgdXNlIGNhbGxfc3RyaW5nYXJnX2Z1bmN0aW9uIHNpbmNlCisgICAgICogcHVyaWZ5X25hbWVfdGhyZWFkIHRha2VzIGEgY29uc3QgY2hhciosIG5vdCBhIGNoYXIqCisgICAgICovCisgICAgaW50IHN0YXR1czsKKyAgICBjaGFyKiBzdHJpbmdhcmc7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6cHVyaWZ5X25hbWVfdGhyZWFkIiwgJnN0cmluZ2FyZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpwdXJpZnlfbmFtZV90aHJlYWQiLCAmc3RyaW5nYXJnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdGF0dXMgPSBwdXJpZnlfbmFtZV90aHJlYWQoc3RyaW5nYXJnKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CisgICAgc3RhdHVzID0gcHVyaWZ5X25hbWVfdGhyZWFkKHN0cmluZ2FyZyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2gsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX2ludGFzYWRkcl9mdW5jdGlvbihwdXJpZnlfd2F0Y2gsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfMShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF8xLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoXzEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF8yLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoXzIsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfNChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF80LCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoXzQsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfOChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF84LCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoXzgsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfd18xKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3dfMSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfd18yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3dfMiwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzIsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfd180KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3dfNCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzQsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfd184KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3dfOCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF93XzgsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcl8xKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3JfMSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcl8yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3JfMiwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzIsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcl80KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3JfNCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzQsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcl84KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3JfOCwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yXzgsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcndfMShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd18xLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3J3XzEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcndfMihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd18yLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3J3XzIsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcndfNChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd180LCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3J3XzQsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfcndfOChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfaW50YXNhZGRyX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yd184LCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9pbnRhc2FkZHJfZnVuY3Rpb24ocHVyaWZ5X3dhdGNoX3J3XzgsIHNlbGYsIGFyZ3MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV93YXRjaF9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFkZHJyZXA7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0JY2hhciogdHlwZTsKLQlpbnQgc3RhdHVzOworICAgIGxvbmcgYWRkcnJlcDsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKKyAgICBjaGFyKiB0eXBlOworICAgIGludCBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpczpwdXJpZnlfd2F0Y2hfbiIsICZhZGRycmVwLCAmc2l6ZSwgJnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpczpwdXJpZnlfd2F0Y2hfbiIsICZhZGRycmVwLCAmc2l6ZSwgJnR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IHB1cmlmeV93YXRjaF9uKChjaGFyKilhZGRycmVwLCBzaXplLCB0eXBlKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7CisgICAgc3RhdHVzID0gcHVyaWZ5X3dhdGNoX24oKGNoYXIqKWFkZHJyZXAsIHNpemUsIHR5cGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfd2F0Y2hfaW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfd2F0Y2hfaW5mbywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfd2F0Y2hfaW5mbywgc2VsZiwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X3dhdGNoX3JlbW92ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHdhdGNobm87Ci0JaW50IHN0YXR1czsKKyAgICBpbnQgd2F0Y2hubzsKKyAgICBpbnQgc3RhdHVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnB1cmlmeV93YXRjaF9yZW1vdmUiLCAmd2F0Y2hubykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpwdXJpZnlfd2F0Y2hfcmVtb3ZlIiwgJndhdGNobm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXR1cyA9IHB1cmlmeV93YXRjaF9yZW1vdmUod2F0Y2hubyk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIHN0YXR1cyA9IHB1cmlmeV93YXRjaF9yZW1vdmUod2F0Y2hubyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV93YXRjaF9yZW1vdmVfYWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yZW1vdmVfYWxsLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHB1cmlmeV93YXRjaF9yZW1vdmVfYWxsLCBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2Rlc2NyaWJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGFkZHJyZXA7Ci0JY2hhciogcnRuOworICAgIGxvbmcgYWRkcnJlcDsKKyAgICBjaGFyKiBydG47CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cHVyaWZ5X2Rlc2NyaWJlIiwgJmFkZHJyZXApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6cHVyaWZ5X2Rlc2NyaWJlIiwgJmFkZHJyZXApKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJ0biA9IHB1cmlmeV9kZXNjcmliZSgoY2hhciopYWRkcnJlcCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylydG4pOworICAgIHJ0biA9IHB1cmlmeV9kZXNjcmliZSgoY2hhciopYWRkcnJlcCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylydG4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV93aGF0X2NvbG9ycyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhZGRycmVwOwotCXVuc2lnbmVkIGludCBzaXplOwotCWludCBzdGF0dXM7Ci0gICAgCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaTpwdXJpZnlfd2hhdF9jb2xvcnMiLCAmYWRkcnJlcCwgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBsb25nIGFkZHJyZXA7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgaW50IHN0YXR1czsKIAotCXN0YXR1cyA9IHB1cmlmeV93aGF0X2NvbG9ycygoY2hhciopYWRkcnJlcCwgc2l6ZSk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGk6cHVyaWZ5X3doYXRfY29sb3JzIiwgJmFkZHJyZXAsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzdGF0dXMgPSBwdXJpZnlfd2hhdF9jb2xvcnMoKGNoYXIqKWFkZHJyZXAsIHNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfaXNfcnVubmluZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfaXNfcnVubmluZywgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihwdXJpZnlfaXNfcnVubmluZywgc2VsZiwgYXJncyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcHVyaWZ5X2Fzc2VydF9pc19yZWFkYWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfc3RyaW5nYW5kaW50X2Z1bmN0aW9uKHB1cmlmeV9hc3NlcnRfaXNfcmVhZGFibGUsCi0JCQkJCSAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfc3RyaW5nYW5kaW50X2Z1bmN0aW9uKHB1cmlmeV9hc3NlcnRfaXNfcmVhZGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9wdXJpZnlfYXNzZXJ0X2lzX3dyaXRhYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9zdHJpbmdhbmRpbnRfZnVuY3Rpb24ocHVyaWZ5X2Fzc2VydF9pc193cml0YWJsZSwKLQkJCQkJICBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9zdHJpbmdhbmRpbnRfZnVuY3Rpb24ocHVyaWZ5X2Fzc2VydF9pc193cml0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiAKICNpZiBIQVNfUFVSSUZZX0VYSVQKQEAgLTY0OSwyMiArNjQ5LDIyIEBACiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3B1cmlmeV9leGl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc3RhdHVzOworICAgIGludCBzdGF0dXM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cHVyaWZ5X2V4aXQiLCAmc3RhdHVzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnB1cmlmeV9leGl0IiwgJnN0YXR1cykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIC8qIHB1cmlmeV9leGl0IGRvZXNuJ3QgYWx3YXlzIGFjdCBsaWtlIGV4aXQoKS4gU2VlIHRoZSBtYW51YWwgKi8KLQlwdXJpZnlfZXhpdChzdGF0dXMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAvKiBwdXJpZnlfZXhpdCBkb2Vzbid0IGFsd2F5cyBhY3QgbGlrZSBleGl0KCkuIFNlZSB0aGUgbWFudWFsICovCisgICAgcHVyaWZ5X2V4aXQoc3RhdHVzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYgLyogSEFTX1BVUklGWV9FWElUICovCiAKICNlbmRpZiAvKiBQVVJJRllfSCAqLwogCiAKLQwKKwogLyogUXVhbnRpZnkgZnVuY3Rpb25zCiAgKgogICogTi5CLiBTb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBkZXNjcmliZWQgaW4gdGhlIHF1YW50aWZ5LmggZmlsZSwKQEAgLTY4MCwxNDQgKzY4MCwxNDQgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfaXNfcnVubmluZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19ydW5uaW5nLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2lzX3J1bm5pbmcsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9oZWxwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2hlbHAsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfaGVscCwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3ByaW50X3JlY29yZGluZ19zdGF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9wcmludF9yZWNvcmRpbmdfc3RhdGUsCi0JCQkJICAgICBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3ByaW50X3JlY29yZGluZ19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfZGF0YSwKLQkJCQkgICAgIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9zdG9wX3JlY29yZGluZ19kYXRhLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX2RhdGEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9pc19yZWNvcmRpbmdfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19yZWNvcmRpbmdfZGF0YSwgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19yZWNvcmRpbmdfZGF0YSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19zeXN0ZW1fY2FsbHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX3N5c3RlbV9jYWxscywKLQkJCQkgICAgIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX3N5c3RlbV9jYWxscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zdG9wX3JlY29yZGluZ19zeXN0ZW1fY2FsbHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfc3lzdGVtX2NhbGxzLAotCQkJCSAgICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9zdG9wX3JlY29yZGluZ19zeXN0ZW1fY2FsbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfaXNfcmVjb3JkaW5nX3N5c3RlbV9jYWxscyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19yZWNvcmRpbmdfc3lzdGVtX2NhbGxzLAotCQkJCSAgICAgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9pc19yZWNvcmRpbmdfc3lzdGVtX2NhbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19zeXN0ZW1fY2FsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfc3RyaW5nb3JpbnRfZnVuY3Rpb24ocXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX3N5c3RlbV9jYWxsLAotCQkJCQkgICBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9zdHJpbmdvcmludF9mdW5jdGlvbihxdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfc3lzdGVtX2NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfc3lzdGVtX2NhbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3N0cmluZ29yaW50X2Z1bmN0aW9uKHF1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX3N5c3RlbV9jYWxsLAotCQkJCQkgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfc3RyaW5nb3JpbnRfZnVuY3Rpb24ocXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfc3lzdGVtX2NhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2lzX3JlY29yZGluZ19zeXN0ZW1fY2FsbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfc3RyaW5nb3JpbnRfZnVuY3Rpb24ocXVhbnRpZnlfaXNfcmVjb3JkaW5nX3N5c3RlbV9jYWxsLAotCQkJCQkgc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfc3RyaW5nb3JpbnRfZnVuY3Rpb24ocXVhbnRpZnlfaXNfcmVjb3JkaW5nX3N5c3RlbV9jYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfZHluYW1pY19saWJyYXJ5X2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCi0JCXF1YW50aWZ5X3N0YXJ0X3JlY29yZGluZ19keW5hbWljX2xpYnJhcnlfZGF0YSwKLQkJc2VsZiwgYXJncyk7CisgICAgcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbigKKyAgICAgICAgcXVhbnRpZnlfc3RhcnRfcmVjb3JkaW5nX2R5bmFtaWNfbGlicmFyeV9kYXRhLAorICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfZHluYW1pY19saWJyYXJ5X2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCi0JCXF1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX2R5bmFtaWNfbGlicmFyeV9kYXRhLAotCQlzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAorICAgICAgICBxdWFudGlmeV9zdG9wX3JlY29yZGluZ19keW5hbWljX2xpYnJhcnlfZGF0YSwKKyAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2lzX3JlY29yZGluZ19keW5hbWljX2xpYnJhcnlfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbigKLQkJcXVhbnRpZnlfaXNfcmVjb3JkaW5nX2R5bmFtaWNfbGlicmFyeV9kYXRhLAotCQlzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAorICAgICAgICBxdWFudGlmeV9pc19yZWNvcmRpbmdfZHluYW1pY19saWJyYXJ5X2RhdGEsCisgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAotCQlxdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzLAotCQlzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAorICAgICAgICBxdWFudGlmeV9zdGFydF9yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzLAorICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfc3RvcF9yZWNvcmRpbmdfcmVnaXN0ZXJfd2luZG93X3RyYXBzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKAotCQlxdWFudGlmeV9zdG9wX3JlY29yZGluZ19yZWdpc3Rlcl93aW5kb3dfdHJhcHMsCi0JCXNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCisgICAgICAgIHF1YW50aWZ5X3N0b3BfcmVjb3JkaW5nX3JlZ2lzdGVyX3dpbmRvd190cmFwcywKKyAgICAgICAgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2lzX3JlY29yZGluZ19yZWdpc3Rlcl93aW5kb3dfdHJhcHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCi0JCXF1YW50aWZ5X2lzX3JlY29yZGluZ19yZWdpc3Rlcl93aW5kb3dfdHJhcHMsCi0JCXNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24oCisgICAgICAgIHF1YW50aWZ5X2lzX3JlY29yZGluZ19yZWdpc3Rlcl93aW5kb3dfdHJhcHMsCisgICAgICAgIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9kaXNhYmxlX3JlY29yZGluZ19kYXRhKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2Rpc2FibGVfcmVjb3JkaW5nX2RhdGEsCi0JCQkJICAgICBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2Rpc2FibGVfcmVjb3JkaW5nX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzKTsKIH0KIHN0YXRpYyBQeU9iamVjdCoKIHB1cmVfcXVhbnRpZnlfY2xlYXJfZGF0YShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIGNhbGxfdm9pZGFyZ19mdW5jdGlvbihxdWFudGlmeV9jbGVhcl9kYXRhLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X2NsZWFyX2RhdGEsIHNlbGYsIGFyZ3MpOwogfQogc3RhdGljIFB5T2JqZWN0KgogcHVyZV9xdWFudGlmeV9zYXZlX2RhdGEoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBjYWxsX3ZvaWRhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc2F2ZV9kYXRhLCBzZWxmLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF92b2lkYXJnX2Z1bmN0aW9uKHF1YW50aWZ5X3NhdmVfZGF0YSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X3NhdmVfZGF0YV90b19maWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9zdHJpbmdhcmdfZnVuY3Rpb24ocXVhbnRpZnlfc2F2ZV9kYXRhX3RvX2ZpbGUsIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3N0cmluZ2FyZ19mdW5jdGlvbihxdWFudGlmeV9zYXZlX2RhdGFfdG9fZmlsZSwgc2VsZiwgYXJncyk7CiB9CiBzdGF0aWMgUHlPYmplY3QqCiBwdXJlX3F1YW50aWZ5X2FkZF9hbm5vdGF0aW9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gY2FsbF9zdHJpbmdhcmdfZnVuY3Rpb24ocXVhbnRpZnlfYWRkX2Fubm90YXRpb24sIHNlbGYsIGFyZ3MpOworICAgIHJldHVybiBjYWxsX3N0cmluZ2FyZ19mdW5jdGlvbihxdWFudGlmeV9hZGRfYW5ub3RhdGlvbiwgc2VsZiwgYXJncyk7CiB9CiAKICNlbmRpZiAvKiBRVUFOVElGWV9IICovCiAKIAotDAorCiAvKiBleHRlcm5hbCBpbnRlcmZhY2UKICAqLwogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZgpAQCAtOTI3LDY2ICs5MjcsNjYgQEAKICAgICB7InF1YW50aWZ5X3NhdmVfZGF0YV90b19maWxlIiwgcHVyZV9xdWFudGlmeV9zYXZlX2RhdGFfdG9fZmlsZSwgTUVUSF9WQVJBUkdTfSwKICAgICB7InF1YW50aWZ5X2FkZF9hbm5vdGF0aW9uIiwgICAgcHVyZV9xdWFudGlmeV9hZGRfYW5ub3RhdGlvbiwgICAgTUVUSF9WQVJBUkdTfSwKICNlbmRpZiAvKiBRVUFOVElGWV9IICovCi0gICAge05VTEwsICBOVUxMfQkJCSAgICAgLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgIE5VTEx9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKLQwKKwogc3RhdGljIHZvaWQKIGlucyhkLCBuYW1lLCB2YWwpCi0JUHlPYmplY3QgKmQ7Ci0JY2hhciogbmFtZTsKLQlsb25nIHZhbDsKKyAgICBQeU9iamVjdCAqZDsKKyAgICBjaGFyKiBuYW1lOworICAgIGxvbmcgdmFsOwogewotCVB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcodmFsKTsKLQlpZiAodikgewotCQkodm9pZClQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKHZhbCk7CisgICAgaWYgKHYpIHsKKyAgICAgICAgKHZvaWQpUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiB9CiAKIAogdm9pZAogaW5pdHB1cmUoKQogewotCVB5T2JqZWN0ICptLCAqZDsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CiAKLQlpZiAoUHlFcnJfV2FyblB5M2soInRoZSBwdXJlIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKLQkgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCi0JICAgIHJldHVybjsJCisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJ0aGUgcHVyZSBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltID0gUHlfSW5pdE1vZHVsZSgicHVyZSIsIHB1cmVfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLSAgICAJCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgicHVyZSIsIHB1cmVfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogCi0gICAgICAgIC8qIHRoaXMgaXMgYm9ndXMgYmVjYXVzZSB3ZSBzaG91bGQgYmUgYWJsZSB0byBmaW5kIHRoaXMgaW5mb3JtYXRpb24KLSAgICAgICAgICogb3V0IGZyb20gdGhlIGhlYWRlciBmaWxlcy4gIFB1cmUncyBjdXJyZW50IHZlcnNpb25zIGRvbid0Ci0gICAgICAgICAqIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiEKLSAgICAgICAgICovCisgICAgLyogdGhpcyBpcyBib2d1cyBiZWNhdXNlIHdlIHNob3VsZCBiZSBhYmxlIHRvIGZpbmQgdGhpcyBpbmZvcm1hdGlvbgorICAgICAqIG91dCBmcm9tIHRoZSBoZWFkZXIgZmlsZXMuICBQdXJlJ3MgY3VycmVudCB2ZXJzaW9ucyBkb24ndAorICAgICAqIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiEKKyAgICAgKi8KICNpZmRlZiBQVVJFX1BVUklGWV9WRVJTSU9OCi0JaW5zKGQsICJQVVJJRllfVkVSU0lPTiIsIFBVUkVfUFVSSUZZX1ZFUlNJT04pOworICAgIGlucyhkLCAiUFVSSUZZX1ZFUlNJT04iLCBQVVJFX1BVUklGWV9WRVJTSU9OKTsKICNlbHNlCi0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBVUklGWV9WRVJTSU9OIiwgUHlfTm9uZSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlBVUklGWV9WRVJTSU9OIiwgUHlfTm9uZSk7CiAjZW5kaWYKIAotICAgICAgICAvKiB0aGVzZSBhcmVuJ3QgdGVycmlibHkgdXNlZnVsIGJlY2F1c2UgcHVyaWZ5X2V4aXQoKSBpc24ndAotICAgICAgICAgKiBleHBvcnRlZCBjb3JyZWN0bHkuICBTZWUgdGhlIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4KLSAgICAgICAgICovCisgICAgLyogdGhlc2UgYXJlbid0IHRlcnJpYmx5IHVzZWZ1bCBiZWNhdXNlIHB1cmlmeV9leGl0KCkgaXNuJ3QKKyAgICAgKiBleHBvcnRlZCBjb3JyZWN0bHkuICBTZWUgdGhlIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4KKyAgICAgKi8KICNpZmRlZiBQVVJJRllfRVhJVF9FUlJPUlMKLQlpbnMoZCwgIlBVUklGWV9FWElUX0VSUk9SUyIsIFBVUklGWV9FWElUX0VSUk9SUyk7CisgICAgaW5zKGQsICJQVVJJRllfRVhJVF9FUlJPUlMiLCBQVVJJRllfRVhJVF9FUlJPUlMpOwogI2VuZGlmCiAjaWZkZWYgUFVSSUZZX0VYSVRfTEVBS1MKLQlpbnMoZCwgIlBVUklGWV9FWElUX0xFQUtTIiwgIFBVUklGWV9FWElUX0xFQUtTKTsKKyAgICBpbnMoZCwgIlBVUklGWV9FWElUX0xFQUtTIiwgIFBVUklGWV9FWElUX0xFQUtTKTsKICNlbmRpZgogI2lmZGVmIFBVUklGWV9FWElUX1BMRUFLUwotCWlucyhkLCAiUFVSSUZZX0VYSVRfUExFQUtTIiwgUFVSSUZZX0VYSVRfUExFQUtTKTsKKyAgICBpbnMoZCwgIlBVUklGWV9FWElUX1BMRUFLUyIsIFBVUklGWV9FWElUX1BMRUFLUyk7CiAjZW5kaWYKIAogCiAjaWZkZWYgUFVSRV9RVUFOVElGWV9WRVJTSU9OCi0JaW5zKGQsICJRVUFOVElGWV9WRVJTSU9OIiwgUFVSRV9RVUFOVElGWV9WRVJTSU9OKTsKKyAgICBpbnMoZCwgIlFVQU5USUZZX1ZFUlNJT04iLCBQVVJFX1FVQU5USUZZX1ZFUlNJT04pOwogI2Vsc2UKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUVVBTlRJRllfVkVSU0lPTiIsIFB5X05vbmUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJRVUFOVElGWV9WRVJTSU9OIiwgUHlfTm9uZSk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcHdkbW9kdWxlLmMgYi9Nb2R1bGVzL3B3ZG1vZHVsZS5jCmluZGV4IDI4NjVkYzYuLmFlMzU4ZTAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcHdkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wd2Rtb2R1bGUuYwpAQCAtOCwxNCArOCwxNCBAQAogI2luY2x1ZGUgPHB3ZC5oPgogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBzdHJ1Y3RfcHdkX3R5cGVfZmllbGRzW10gPSB7Ci0JeyJwd19uYW1lIiwgInVzZXIgbmFtZSJ9LAotCXsicHdfcGFzc3dkIiwgInBhc3N3b3JkIn0sCi0JeyJwd191aWQiLCAidXNlciBpZCJ9LAotCXsicHdfZ2lkIiwgImdyb3VwIGlkIn0sIAotCXsicHdfZ2Vjb3MiLCAicmVhbCBuYW1lIn0sIAotCXsicHdfZGlyIiwgImhvbWUgZGlyZWN0b3J5In0sCi0JeyJwd19zaGVsbCIsICJzaGVsbCBwcm9ncmFtIn0sCi0JezB9CisgICAgeyJwd19uYW1lIiwgInVzZXIgbmFtZSJ9LAorICAgIHsicHdfcGFzc3dkIiwgInBhc3N3b3JkIn0sCisgICAgeyJwd191aWQiLCAidXNlciBpZCJ9LAorICAgIHsicHdfZ2lkIiwgImdyb3VwIGlkIn0sCisgICAgeyJwd19nZWNvcyIsICJyZWFsIG5hbWUifSwKKyAgICB7InB3X2RpciIsICJob21lIGRpcmVjdG9yeSJ9LAorICAgIHsicHdfc2hlbGwiLCAic2hlbGwgcHJvZ3JhbSJ9LAorICAgIHswfQogfTsKIAogUHlEb2NfU1RSVkFSKHN0cnVjdF9wYXNzd2RfX2RvY19fLApAQCAtMjUsMTAgKzI1LDEwIEBACiBvciB2aWEgdGhlIG9iamVjdCBhdHRyaWJ1dGVzIGFzIG5hbWVkIGluIHRoZSBhYm92ZSB0dXBsZS4iKTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBzdHJ1Y3RfcHdkX3R5cGVfZGVzYyA9IHsKLQkicHdkLnN0cnVjdF9wYXNzd2QiLAotCXN0cnVjdF9wYXNzd2RfX2RvY19fLAotCXN0cnVjdF9wd2RfdHlwZV9maWVsZHMsCi0JNywKKyAgICAicHdkLnN0cnVjdF9wYXNzd2QiLAorICAgIHN0cnVjdF9wYXNzd2RfX2RvY19fLAorICAgIHN0cnVjdF9wd2RfdHlwZV9maWVsZHMsCisgICAgNywKIH07CiAKIFB5RG9jX1NUUlZBUihwd2RfX2RvY19fLApAQCAtNDEsNyArNDEsNyBAQAogVGhlIHVpZCBhbmQgZ2lkIGl0ZW1zIGFyZSBpbnRlZ2VycywgYWxsIG90aGVycyBhcmUgc3RyaW5ncy4gQW5cblwKIGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlIGVudHJ5IGFza2VkIGZvciBjYW5ub3QgYmUgZm91bmQuIik7CiAKLSAgICAgIAorCiBzdGF0aWMgaW50IGluaXRpYWxpemVkOwogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJ1Y3RQd2RUeXBlOwogCkBAIC00OSw0OSArNDksNDkgQEAKIHNldHMoUHlPYmplY3QgKnYsIGludCBpLCBjaGFyKiB2YWwpCiB7CiAgIGlmICh2YWwpCi0JICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsKSk7CisgICAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcodmFsKSk7CiAgIGVsc2UgewotCSAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeV9Ob25lKTsKLQkgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgaSwgUHlfTm9uZSk7CisgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1rcHdlbnQoc3RydWN0IHBhc3N3ZCAqcCkKIHsKLQlpbnQgc2V0SW5kZXggPSAwOwotCVB5T2JqZWN0ICp2ID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJlN0cnVjdFB3ZFR5cGUpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGludCBzZXRJbmRleCA9IDA7CisgICAgUHlPYmplY3QgKnYgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RydWN0UHdkVHlwZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNkZWZpbmUgU0VUSShpLHZhbCkgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsKSkKICNkZWZpbmUgU0VUUyhpLHZhbCkgc2V0cyh2LCBpLCB2YWwpCiAKLQlTRVRTKHNldEluZGV4KyssIHAtPnB3X25hbWUpOworICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfbmFtZSk7CiAjaWZkZWYgX19WTVMKLQlTRVRTKHNldEluZGV4KyssICIiKTsKKyAgICBTRVRTKHNldEluZGV4KyssICIiKTsKICNlbHNlCi0JU0VUUyhzZXRJbmRleCsrLCBwLT5wd19wYXNzd2QpOworICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfcGFzc3dkKTsKICNlbmRpZgotCVNFVEkoc2V0SW5kZXgrKywgcC0+cHdfdWlkKTsKLQlTRVRJKHNldEluZGV4KyssIHAtPnB3X2dpZCk7CisgICAgU0VUSShzZXRJbmRleCsrLCBwLT5wd191aWQpOworICAgIFNFVEkoc2V0SW5kZXgrKywgcC0+cHdfZ2lkKTsKICNpZmRlZiBfX1ZNUwotCVNFVFMoc2V0SW5kZXgrKywgIiIpOworICAgIFNFVFMoc2V0SW5kZXgrKywgIiIpOwogI2Vsc2UKLQlTRVRTKHNldEluZGV4KyssIHAtPnB3X2dlY29zKTsKKyAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X2dlY29zKTsKICNlbmRpZgotCVNFVFMoc2V0SW5kZXgrKywgcC0+cHdfZGlyKTsKLQlTRVRTKHNldEluZGV4KyssIHAtPnB3X3NoZWxsKTsKKyAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X2Rpcik7CisgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5wd19zaGVsbCk7CiAKICN1bmRlZiBTRVRTCiAjdW5kZWYgU0VUSQogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfWERFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiBQeURvY19TVFJWQVIocHdkX2dldHB3dWlkX19kb2NfXywKQEAgLTEwMywxNiArMTAzLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHdkX2dldHB3dWlkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl1bnNpZ25lZCBpbnQgdWlkOwotCXN0cnVjdCBwYXNzd2QgKnA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJOmdldHB3dWlkIiwgJnVpZCkpCi0JCXJldHVybiBOVUxMOwotCWlmICgocCA9IGdldHB3dWlkKHVpZCkpID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLAotCQkJICAgICAiZ2V0cHd1aWQoKTogdWlkIG5vdCBmb3VuZDogJWQiLCB1aWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIG1rcHdlbnQocCk7CisgICAgdW5zaWduZWQgaW50IHVpZDsKKyAgICBzdHJ1Y3QgcGFzc3dkICpwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSTpnZXRwd3VpZCIsICZ1aWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHAgPSBnZXRwd3VpZCh1aWQpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJnZXRwd3VpZCgpOiB1aWQgbm90IGZvdW5kOiAlZCIsIHVpZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbWtwd2VudChwKTsKIH0KIAogUHlEb2NfU1RSVkFSKHB3ZF9nZXRwd25hbV9fZG9jX18sCkBAIC0xMjQsMTYgKzEyNCwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB3ZF9nZXRwd25hbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3QgcGFzc3dkICpwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRwd25hbSIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChwID0gZ2V0cHduYW0obmFtZSkpID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLAotCQkJICAgICAiZ2V0cHduYW0oKTogbmFtZSBub3QgZm91bmQ6ICVzIiwgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbWtwd2VudChwKTsKKyAgICBjaGFyICpuYW1lOworICAgIHN0cnVjdCBwYXNzd2QgKnA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldHB3bmFtIiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHAgPSBnZXRwd25hbShuYW1lKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZ2V0cHduYW0oKTogbmFtZSBub3QgZm91bmQ6ICVzIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbWtwd2VudChwKTsKIH0KIAogI2lmZGVmIEhBVkVfR0VUUFdFTlQKQEAgLTE0Niw1NSArMTQ2LDU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHdkX2dldHB3YWxsKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpkOwotCXN0cnVjdCBwYXNzd2QgKnA7Ci0JaWYgKChkID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKmQ7CisgICAgc3RydWN0IHBhc3N3ZCAqcDsKKyAgICBpZiAoKGQgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQotCWlmICgocCA9IGdldHB3dWlkKDApKSAhPSBOVUxMKSB7CisgICAgaWYgKChwID0gZ2V0cHd1aWQoMCkpICE9IE5VTEwpIHsKICNlbHNlCi0Jc2V0cHdlbnQoKTsKLQl3aGlsZSAoKHAgPSBnZXRwd2VudCgpKSAhPSBOVUxMKSB7CisgICAgc2V0cHdlbnQoKTsKKyAgICB3aGlsZSAoKHAgPSBnZXRwd2VudCgpKSAhPSBOVUxMKSB7CiAjZW5kaWYKLQkJUHlPYmplY3QgKnYgPSBta3B3ZW50KHApOwotCQlpZiAodiA9PSBOVUxMIHx8IFB5TGlzdF9BcHBlbmQoZCwgdikgIT0gMCkgewotCQkJUHlfWERFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRihkKTsKLQkJCWVuZHB3ZW50KCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYodik7Ci0JfQotCWVuZHB3ZW50KCk7Ci0JcmV0dXJuIGQ7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gbWtwd2VudChwKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCBQeUxpc3RfQXBwZW5kKGQsIHYpICE9IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYoZCk7CisgICAgICAgICAgICBlbmRwd2VudCgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICBlbmRwd2VudCgpOworICAgIHJldHVybiBkOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBwd2RfbWV0aG9kc1tdID0gewotCXsiZ2V0cHd1aWQiLAlwd2RfZ2V0cHd1aWQsIE1FVEhfVkFSQVJHUywgcHdkX2dldHB3dWlkX19kb2NfX30sCi0JeyJnZXRwd25hbSIsCXB3ZF9nZXRwd25hbSwgTUVUSF9WQVJBUkdTLCBwd2RfZ2V0cHduYW1fX2RvY19ffSwKKyAgICB7ImdldHB3dWlkIiwgICAgICAgIHB3ZF9nZXRwd3VpZCwgTUVUSF9WQVJBUkdTLCBwd2RfZ2V0cHd1aWRfX2RvY19ffSwKKyAgICB7ImdldHB3bmFtIiwgICAgICAgIHB3ZF9nZXRwd25hbSwgTUVUSF9WQVJBUkdTLCBwd2RfZ2V0cHduYW1fX2RvY19ffSwKICNpZmRlZiBIQVZFX0dFVFBXRU5UCi0JeyJnZXRwd2FsbCIsCShQeUNGdW5jdGlvbilwd2RfZ2V0cHdhbGwsCi0JCU1FVEhfTk9BUkdTLCAgcHdkX2dldHB3YWxsX19kb2NfX30sCisgICAgeyJnZXRwd2FsbCIsICAgICAgICAoUHlDRnVuY3Rpb24pcHdkX2dldHB3YWxsLAorICAgICAgICBNRVRIX05PQVJHUywgIHB3ZF9nZXRwd2FsbF9fZG9jX199LAogI2VuZGlmCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRwd2Qodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQltID0gUHlfSW5pdE1vZHVsZTMoInB3ZCIsIHB3ZF9tZXRob2RzLCBwd2RfX2RvY19fKTsKLQlpZiAobSA9PSBOVUxMKQotICAgIAkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygicHdkIiwgcHdkX21ldGhvZHMsIHB3ZF9fZG9jX18pOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFB3ZFR5cGUsIAotCQkJCQkgICZzdHJ1Y3RfcHdkX3R5cGVfZGVzYyk7Ci0JUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcGFzc3dkIiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKLQkvKiBBbmQgZm9yIGIvdyBjb21wYXRpYmlsaXR5ICh0aGlzIHdhcyBkZWZpbmVkIGJ5IG1pc3Rha2UpOiAqLwotICAgICAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInN0cnVjdF9wd2VudCIsIChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7Ci0JaW5pdGlhbGl6ZWQgPSAxOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0cnVjdFB3ZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cnVjdF9wd2RfdHlwZV9kZXNjKTsKKyAgICBQeV9JTkNSRUYoKFB5T2JqZWN0ICopICZTdHJ1Y3RQd2RUeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInN0cnVjdF9wYXNzd2QiLCAoUHlPYmplY3QgKikgJlN0cnVjdFB3ZFR5cGUpOworICAgIC8qIEFuZCBmb3IgYi93IGNvbXBhdGliaWxpdHkgKHRoaXMgd2FzIGRlZmluZWQgYnkgbWlzdGFrZSk6ICovCisgICAgUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0UHdkVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcHdlbnQiLCAoUHlPYmplY3QgKikgJlN0cnVjdFB3ZFR5cGUpOworICAgIGluaXRpYWxpemVkID0gMTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcHlleHBhdC5jIGIvTW9kdWxlcy9weWV4cGF0LmMKaW5kZXggMDE5NzFiNy4uMWU5Yjg5ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9weWV4cGF0LmMKKysrIGIvTW9kdWxlcy9weWV4cGF0LmMKQEAgLTI0NSw3ICsyNDUsNyBAQAogICAgdXNlZCBvbmx5IGZyb20gdGhlIGNoYXJhY3RlciBkYXRhIGhhbmRsZXIgdHJhbXBvbGluZSwgYW5kIG11c3QgYmUKICAgIHVzZWQgcmlnaHQgYWZ0ZXIgYGZsYWdfZXJyb3IoKWAgaXMgY2FsbGVkLiAqLwogc3RhdGljIHZvaWQKLW5vb3BfY2hhcmFjdGVyX2RhdGFfaGFuZGxlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKmRhdGEsIGludCBsZW4pIAorbm9vcF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqZGF0YSwgaW50IGxlbikKIHsKICAgICAvKiBEbyBub3RoaW5nLiAqLwogfQpAQCAtMjc4LDIyICsyNzgsMjIgQEAKICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwogICAgICAgICBmaWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoX19GSUxFX18pOwogICAgICAgICBoYW5kbGVyX2luZm9bc2xvdF0udGJfY29kZSA9Ci0gICAgICAgICAgICBQeUNvZGVfTmV3KDAsCQkvKiBhcmdjb3VudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAwLAkJLyogbmxvY2FscyAqLwotICAgICAgICAgICAgICAgICAgICAgICAwLAkJLyogc3RhY2tzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgIDAsCQkvKiBmbGFncyAqLwotICAgICAgICAgICAgICAgICAgICAgICBjb2RlLAkJLyogY29kZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBudWxsdHVwbGUsCS8qIGNvbnN0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICBudWxsdHVwbGUsCS8qIG5hbWVzICovCi0gICAgICAgICAgICAgICAgICAgICAgIG51bGx0dXBsZSwJLyogdmFybmFtZXMgKi8KKyAgICAgICAgICAgIFB5Q29kZV9OZXcoMCwgICAgICAgICAgICAgICAvKiBhcmdjb3VudCAqLworICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgIC8qIG5sb2NhbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAvKiBzdGFja3NpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAvKiBmbGFncyAqLworICAgICAgICAgICAgICAgICAgICAgICBjb2RlLCAgICAgICAgICAgIC8qIGNvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgbnVsbHR1cGxlLCAgICAgICAvKiBjb25zdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgbnVsbHR1cGxlLCAgICAgICAvKiBuYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICBudWxsdHVwbGUsICAgICAgIC8qIHZhcm5hbWVzICovCiAjaWYgUFlUSE9OX0FQSV9WRVJTSU9OID49IDEwMTAKLSAgICAgICAgICAgICAgICAgICAgICAgbnVsbHR1cGxlLAkvKiBmcmVldmFycyAqLwotICAgICAgICAgICAgICAgICAgICAgICBudWxsdHVwbGUsCS8qIGNlbGx2YXJzICovCisgICAgICAgICAgICAgICAgICAgICAgIG51bGx0dXBsZSwgICAgICAgLyogZnJlZXZhcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgbnVsbHR1cGxlLCAgICAgICAvKiBjZWxsdmFycyAqLwogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLAkvKiBmaWxlbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAkJLyogbmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sCQkvKiBmaXJzdGxpbmVubyAqLwotICAgICAgICAgICAgICAgICAgICAgICBjb2RlCQkvKiBsbm90YWIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsICAgICAgICAvKiBmaWxlbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCAgICAgICAgICAgIC8qIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCAgICAgICAgICAvKiBmaXJzdGxpbmVubyAqLworICAgICAgICAgICAgICAgICAgICAgICBjb2RlICAgICAgICAgICAgIC8qIGxub3RhYiAqLwogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICBpZiAoaGFuZGxlcl9pbmZvW3Nsb3RdLnRiX2NvZGUgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwpAQCAtMzE1LDI1ICszMTUsMjUgQEAKIHsKICAgICBpbnQgcmVzdWx0ID0gMDsKICAgICBpZiAoIXRzdGF0ZS0+dXNlX3RyYWNpbmcgfHwgdHN0YXRlLT50cmFjaW5nKQotCXJldHVybiAwOworICAgICAgICByZXR1cm4gMDsKICAgICBpZiAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpIHsKLQl0c3RhdGUtPnRyYWNpbmcrKzsKLQlyZXN1bHQgPSB0c3RhdGUtPmNfcHJvZmlsZWZ1bmModHN0YXRlLT5jX3Byb2ZpbGVvYmosCi0JCQkJICAgICAgIGYsIGNvZGUgLCB2YWwpOwotCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCkKLQkJCSAgICAgICB8fCAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpKTsKLQl0c3RhdGUtPnRyYWNpbmctLTsKLQlpZiAocmVzdWx0KQotCSAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB0c3RhdGUtPnRyYWNpbmcrKzsKKyAgICAgICAgcmVzdWx0ID0gdHN0YXRlLT5jX3Byb2ZpbGVmdW5jKHRzdGF0ZS0+Y19wcm9maWxlb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgY29kZSAsIHZhbCk7CisgICAgICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpKTsKKyAgICAgICAgdHN0YXRlLT50cmFjaW5nLS07CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICBpZiAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKSB7Ci0JdHN0YXRlLT50cmFjaW5nKys7Ci0JcmVzdWx0ID0gdHN0YXRlLT5jX3RyYWNlZnVuYyh0c3RhdGUtPmNfdHJhY2VvYmosCi0JCQkJICAgICBmLCBjb2RlICwgdmFsKTsKLQl0c3RhdGUtPnVzZV90cmFjaW5nID0gKCh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCi0JCQkgICAgICAgfHwgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSk7Ci0JdHN0YXRlLT50cmFjaW5nLS07Ci0gICAgfQkKKyAgICAgICAgdHN0YXRlLT50cmFjaW5nKys7CisgICAgICAgIHJlc3VsdCA9IHRzdGF0ZS0+Y190cmFjZWZ1bmModHN0YXRlLT5jX3RyYWNlb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsIGNvZGUgLCB2YWwpOworICAgICAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gKCh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSk7CisgICAgICAgIHRzdGF0ZS0+dHJhY2luZy0tOworICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0zNDQsMTIgKzM0NCwxMiBAQAogICAgIGludCBlcnI7CiAKICAgICBpZiAodHN0YXRlLT5jX3RyYWNlZnVuYyA9PSBOVUxMKQotCXJldHVybiAwOworICAgICAgICByZXR1cm4gMDsKIAogICAgIFB5RXJyX0ZldGNoKCZ0eXBlLCAmdmFsdWUsICZ0cmFjZWJhY2spOwogICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JdmFsdWUgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgIHZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKICAgICB9CiAjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDQwMDAwCiAgICAgYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE9PTykiLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKQEAgLTM1NywxNyArMzU3LDE3IEBACiAgICAgYXJnID0gUHlUdXBsZV9QYWNrKDMsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOwogI2VuZGlmCiAgICAgaWYgKGFyZyA9PSBOVUxMKSB7Ci0JUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGVyciA9IHRyYWNlX2ZyYW1lKHRzdGF0ZSwgZiwgUHlUcmFjZV9FWENFUFRJT04sIGFyZyk7CiAgICAgUHlfREVDUkVGKGFyZyk7CiAgICAgaWYgKGVyciA9PSAwKQotCVB5RXJyX1Jlc3RvcmUodHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7CisgICAgICAgIFB5RXJyX1Jlc3RvcmUodHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7CiAgICAgZWxzZSB7Ci0JUHlfWERFQ1JFRih0eXBlKTsKLQlQeV9YREVDUkVGKHZhbHVlKTsKLQlQeV9YREVDUkVGKHRyYWNlYmFjayk7CisgICAgICAgIFB5X1hERUNSRUYodHlwZSk7CisgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOworICAgICAgICBQeV9YREVDUkVGKHRyYWNlYmFjayk7CiAgICAgfQogICAgIHJldHVybiBlcnI7CiB9CkBAIC0zODMsMzEgKzM4MywzMSBAQAogCiAgICAgaWYgKGMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgCisKICAgICBmID0gUHlGcmFtZV9OZXcodHN0YXRlLCBjLCBQeUV2YWxfR2V0R2xvYmFscygpLCBOVUxMKTsKICAgICBpZiAoZiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB0c3RhdGUtPmZyYW1lID0gZjsKICNpZmRlZiBGSVhfVFJBQ0UKICAgICBpZiAodHJhY2VfZnJhbWUodHN0YXRlLCBmLCBQeVRyYWNlX0NBTEwsIFB5X05vbmUpIDwgMCkgewotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAjZW5kaWYKICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKICAgICBpZiAocmVzID09IE5VTEwpIHsKLQlpZiAodHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID09IE5VTEwpCi0JICAgIFB5VHJhY2VCYWNrX0hlcmUoZik7CisgICAgICAgIGlmICh0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5VHJhY2VCYWNrX0hlcmUoZik7CiAgICAgICAgIFhNTF9TdG9wUGFyc2VyKHNlbGYtPml0c2VsZiwgWE1MX0ZBTFNFKTsKICNpZmRlZiBGSVhfVFJBQ0UKLQlpZiAodHJhY2VfZnJhbWVfZXhjKHRzdGF0ZSwgZikgPCAwKSB7Ci0JICAgIHJldHVybiBOVUxMOwotCX0KKyAgICAgICAgaWYgKHRyYWNlX2ZyYW1lX2V4Yyh0c3RhdGUsIGYpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSB7Ci0JaWYgKHRyYWNlX2ZyYW1lKHRzdGF0ZSwgZiwgUHlUcmFjZV9SRVRVUk4sIHJlcykgPCAwKSB7Ci0JICAgIFB5X1hERUNSRUYocmVzKTsKLQkgICAgcmVzID0gTlVMTDsKLQl9CisgICAgICAgIGlmICh0cmFjZV9mcmFtZSh0c3RhdGUsIGYsIFB5VHJhY2VfUkVUVVJOLCByZXMpIDwgMCkgeworICAgICAgICAgICAgUHlfWERFQ1JFRihyZXMpOworICAgICAgICAgICAgcmVzID0gTlVMTDsKKyAgICAgICAgfQogICAgIH0KICNlbHNlCiAgICAgfQpAQCAtNDMyLDEyICs0MzIsMTIgQEAKICAgICBQeU9iamVjdCAqdmFsdWU7CiAgICAgLyogcmVzdWx0IGNhbiBiZSBOVUxMIGlmIHRoZSB1bmljb2RlIGNvbnZlcnNpb24gZmFpbGVkLiAqLwogICAgIGlmICghcmVzdWx0KQotCXJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgaWYgKCFzZWxmLT5pbnRlcm4pCi0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKHNlbGYtPmludGVybiwgcmVzdWx0KTsKICAgICBpZiAoIXZhbHVlKSB7Ci0JaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmludGVybiwgcmVzdWx0LCByZXN1bHQpID09IDApCisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5pbnRlcm4sIHJlc3VsdCwgcmVzdWx0KSA9PSAwKQogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00NjAsOCArNDYwLDggQEAKICAgICBpZiAoYXJncyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotICAgIHRlbXAgPSAoc2VsZi0+cmV0dXJuc191bmljb2RlIAotICAgICAgICAgICAgPyBjb252X3N0cmluZ19sZW5fdG9fdW5pY29kZShidWZmZXIsIGxlbikgCisgICAgdGVtcCA9IChzZWxmLT5yZXR1cm5zX3VuaWNvZGUKKyAgICAgICAgICAgID8gY29udl9zdHJpbmdfbGVuX3RvX3VuaWNvZGUoYnVmZmVyLCBsZW4pCiAgICAgICAgICAgICA6IGNvbnZfc3RyaW5nX2xlbl90b191dGY4KGJ1ZmZlciwgbGVuKSk7CiAjZWxzZQogICAgIHRlbXAgPSBjb252X3N0cmluZ19sZW5fdG9fdXRmOChidWZmZXIsIGxlbik7CkBAIC01MDMsNyArNTAzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLW15X0NoYXJhY3RlckRhdGFIYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqZGF0YSwgaW50IGxlbikgCitteV9DaGFyYWN0ZXJEYXRhSGFuZGxlcih2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKmRhdGEsIGludCBsZW4pCiB7CiAgICAgeG1scGFyc2VvYmplY3QgKnNlbGYgPSAoeG1scGFyc2VvYmplY3QgKikgdXNlckRhdGE7CiAgICAgaWYgKHNlbGYtPmJ1ZmZlciA9PSBOVUxMKQpAQCAtNjQzLDEzICs2NDMsMTMgQEAKIH0KIAogI2RlZmluZSBWT0lEX0hBTkRMRVIoTkFNRSwgUEFSQU1TLCBQQVJBTV9GT1JNQVQpIFwKLQlSQ19IQU5ETEVSKHZvaWQsIE5BTUUsIFBBUkFNUywgOywgUEFSQU1fRk9STUFULCA7LCA7LFwKLQkoeG1scGFyc2VvYmplY3QgKil1c2VyRGF0YSkKKyAgICAgICAgUkNfSEFORExFUih2b2lkLCBOQU1FLCBQQVJBTVMsIDssIFBBUkFNX0ZPUk1BVCwgOywgOyxcCisgICAgICAgICh4bWxwYXJzZW9iamVjdCAqKXVzZXJEYXRhKQogCiAjZGVmaW5lIElOVF9IQU5ETEVSKE5BTUUsIFBBUkFNUywgUEFSQU1fRk9STUFUKVwKLQlSQ19IQU5ETEVSKGludCwgTkFNRSwgUEFSQU1TLCBpbnQgcmM9MDssIFBBUkFNX0ZPUk1BVCwgXAotCQkJcmMgPSBQeUludF9Bc0xvbmcocnYpOywgcmMsIFwKLQkoeG1scGFyc2VvYmplY3QgKil1c2VyRGF0YSkKKyAgICAgICAgUkNfSEFORExFUihpbnQsIE5BTUUsIFBBUkFNUywgaW50IHJjPTA7LCBQQVJBTV9GT1JNQVQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gUHlJbnRfQXNMb25nKHJ2KTssIHJjLCBcCisgICAgICAgICh4bWxwYXJzZW9iamVjdCAqKXVzZXJEYXRhKQogCiBWT0lEX0hBTkRMRVIoRW5kRWxlbWVudCwKICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpuYW1lKSwKQEAgLTgyMiwyNSArODIyLDI1IEBACiAjZW5kaWYKIAogVk9JRF9IQU5ETEVSKE5vdGF0aW9uRGVjbCwKLQkJKHZvaWQgKnVzZXJEYXRhLAotCQkJY29uc3QgWE1MX0NoYXIgKm5vdGF0aW9uTmFtZSwKLQkJCWNvbnN0IFhNTF9DaGFyICpiYXNlLAotCQkJY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAotCQkJY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKSwKKyAgICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqbm90YXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqcHVibGljSWQpLAogICAgICAgICAgICAgICAgICgiKE5OTk4pIiwKLQkJIHN0cmluZ19pbnRlcm4oc2VsZiwgbm90YXRpb25OYW1lKSwgc3RyaW5nX2ludGVybihzZWxmLCBiYXNlKSwKLQkJIHN0cmluZ19pbnRlcm4oc2VsZiwgc3lzdGVtSWQpLCBzdHJpbmdfaW50ZXJuKHNlbGYsIHB1YmxpY0lkKSkpCisgICAgICAgICAgICAgICAgIHN0cmluZ19pbnRlcm4oc2VsZiwgbm90YXRpb25OYW1lKSwgc3RyaW5nX2ludGVybihzZWxmLCBiYXNlKSwKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2ludGVybihzZWxmLCBzeXN0ZW1JZCksIHN0cmluZ19pbnRlcm4oc2VsZiwgcHVibGljSWQpKSkKIAogVk9JRF9IQU5ETEVSKFN0YXJ0TmFtZXNwYWNlRGVjbCwKLQkJKHZvaWQgKnVzZXJEYXRhLAotCQkgICAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4LAotCQkgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpKSwKKyAgICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqdXJpKSwKICAgICAgICAgICAgICAgICAoIihOTikiLAogICAgICAgICAgICAgICAgICBzdHJpbmdfaW50ZXJuKHNlbGYsIHByZWZpeCksIHN0cmluZ19pbnRlcm4oc2VsZiwgdXJpKSkpCiAKIFZPSURfSEFORExFUihFbmROYW1lc3BhY2VEZWNsLAotCQkodm9pZCAqdXNlckRhdGEsCi0JCSAgICBjb25zdCBYTUxfQ2hhciAqcHJlZml4KSwKKyAgICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwcmVmaXgpLAogICAgICAgICAgICAgICAgICgiKE4pIiwgc3RyaW5nX2ludGVybihzZWxmLCBwcmVmaXgpKSkKIAogVk9JRF9IQU5ETEVSKENvbW1lbnQsCkBAIC04NDksNTAgKzg0OSw1MCBAQAogCiBWT0lEX0hBTkRMRVIoU3RhcnRDZGF0YVNlY3Rpb24sCiAgICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEpLAotCQkoIigpIikpCisgICAgICAgICAgICAgICAgKCIoKSIpKQogCiBWT0lEX0hBTkRMRVIoRW5kQ2RhdGFTZWN0aW9uLAogICAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhKSwKLQkJKCIoKSIpKQorICAgICAgICAgICAgICAgICgiKCkiKSkKIAogI2lmbmRlZiBQeV9VU0lOR19VTklDT0RFCiBWT0lEX0hBTkRMRVIoRGVmYXVsdCwKLQkgICAgICAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKSwKLQkgICAgICAoIihOKSIsIGNvbnZfc3RyaW5nX2xlbl90b191dGY4KHMsbGVuKSkpCisgICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pLAorICAgICAgICAgICAgICAoIihOKSIsIGNvbnZfc3RyaW5nX2xlbl90b191dGY4KHMsbGVuKSkpCiAKIFZPSURfSEFORExFUihEZWZhdWx0SGFuZGxlckV4cGFuZCwKLQkgICAgICAodm9pZCAqdXNlckRhdGEsIGNvbnN0IFhNTF9DaGFyICpzLCBpbnQgbGVuKSwKLQkgICAgICAoIihOKSIsIGNvbnZfc3RyaW5nX2xlbl90b191dGY4KHMsbGVuKSkpCisgICAgICAgICAgICAgICh2b2lkICp1c2VyRGF0YSwgY29uc3QgWE1MX0NoYXIgKnMsIGludCBsZW4pLAorICAgICAgICAgICAgICAoIihOKSIsIGNvbnZfc3RyaW5nX2xlbl90b191dGY4KHMsbGVuKSkpCiAjZWxzZQogVk9JRF9IQU5ETEVSKERlZmF1bHQsCi0JICAgICAgKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbiksCi0JICAgICAgKCIoTikiLCAoc2VsZi0+cmV0dXJuc191bmljb2RlCi0JCSAgICAgICA/IGNvbnZfc3RyaW5nX2xlbl90b191bmljb2RlKHMsbGVuKQotCQkgICAgICAgOiBjb252X3N0cmluZ19sZW5fdG9fdXRmOChzLGxlbikpKSkKKyAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbiksCisgICAgICAgICAgICAgICgiKE4pIiwgKHNlbGYtPnJldHVybnNfdW5pY29kZQorICAgICAgICAgICAgICAgICAgICAgICA/IGNvbnZfc3RyaW5nX2xlbl90b191bmljb2RlKHMsbGVuKQorICAgICAgICAgICAgICAgICAgICAgICA6IGNvbnZfc3RyaW5nX2xlbl90b191dGY4KHMsbGVuKSkpKQogCiBWT0lEX0hBTkRMRVIoRGVmYXVsdEhhbmRsZXJFeHBhbmQsCi0JICAgICAgKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbiksCi0JICAgICAgKCIoTikiLCAoc2VsZi0+cmV0dXJuc191bmljb2RlCi0JCSAgICAgICA/IGNvbnZfc3RyaW5nX2xlbl90b191bmljb2RlKHMsbGVuKQotCQkgICAgICAgOiBjb252X3N0cmluZ19sZW5fdG9fdXRmOChzLGxlbikpKSkKKyAgICAgICAgICAgICAgKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqcywgaW50IGxlbiksCisgICAgICAgICAgICAgICgiKE4pIiwgKHNlbGYtPnJldHVybnNfdW5pY29kZQorICAgICAgICAgICAgICAgICAgICAgICA/IGNvbnZfc3RyaW5nX2xlbl90b191bmljb2RlKHMsbGVuKQorICAgICAgICAgICAgICAgICAgICAgICA6IGNvbnZfc3RyaW5nX2xlbl90b191dGY4KHMsbGVuKSkpKQogI2VuZGlmCiAKIElOVF9IQU5ETEVSKE5vdFN0YW5kYWxvbmUsCi0JCSh2b2lkICp1c2VyRGF0YSksCi0JCSgiKCkiKSkKKyAgICAgICAgICAgICAgICAodm9pZCAqdXNlckRhdGEpLAorICAgICAgICAgICAgICAgICgiKCkiKSkKIAogUkNfSEFORExFUihpbnQsIEV4dGVybmFsRW50aXR5UmVmLAotCQkoWE1MX1BhcnNlciBwYXJzZXIsCi0JCSAgICBjb25zdCBYTUxfQ2hhciAqY29udGV4dCwKLQkJICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAotCQkgICAgY29uc3QgWE1MX0NoYXIgKnN5c3RlbUlkLAotCQkgICAgY29uc3QgWE1MX0NoYXIgKnB1YmxpY0lkKSwKLQkJaW50IHJjPTA7LAorICAgICAgICAgICAgICAgIChYTUxfUGFyc2VyIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpiYXNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBYTUxfQ2hhciAqc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFhNTF9DaGFyICpwdWJsaWNJZCksCisgICAgICAgICAgICAgICAgaW50IHJjPTA7LAogICAgICAgICAgICAgICAgICgiKE8mTk5OKSIsCi0JCSBTVFJJTkdfQ09OVl9GVU5DLGNvbnRleHQsIHN0cmluZ19pbnRlcm4oc2VsZiwgYmFzZSksCi0JCSBzdHJpbmdfaW50ZXJuKHNlbGYsIHN5c3RlbUlkKSwgc3RyaW5nX2ludGVybihzZWxmLCBwdWJsaWNJZCkpLAotCQlyYyA9IFB5SW50X0FzTG9uZyhydik7LCByYywKLQkJWE1MX0dldFVzZXJEYXRhKHBhcnNlcikpCisgICAgICAgICAgICAgICAgIFNUUklOR19DT05WX0ZVTkMsY29udGV4dCwgc3RyaW5nX2ludGVybihzZWxmLCBiYXNlKSwKKyAgICAgICAgICAgICAgICAgc3RyaW5nX2ludGVybihzZWxmLCBzeXN0ZW1JZCksIHN0cmluZ19pbnRlcm4oc2VsZiwgcHVibGljSWQpKSwKKyAgICAgICAgICAgICAgICByYyA9IFB5SW50X0FzTG9uZyhydik7LCByYywKKyAgICAgICAgICAgICAgICBYTUxfR2V0VXNlckRhdGEocGFyc2VyKSkKIAogLyogWFhYIFVua25vd25FbmNvZGluZ0hhbmRsZXIgKi8KIApAQCAtMTA2Myw3ICsxMDYzLDcgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6U2V0QmFzZSIsICZiYXNlKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKCFYTUxfU2V0QmFzZShzZWxmLT5pdHNlbGYsIGJhc2UpKSB7Ci0JcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogICAgIH0KICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC0xMTU0LDcgKzExNTQsNyBAQAogICAgIG5ld19wYXJzZXItPmluX2NhbGxiYWNrID0gMDsKICAgICBuZXdfcGFyc2VyLT5uc19wcmVmaXhlcyA9IHNlbGYtPm5zX3ByZWZpeGVzOwogICAgIG5ld19wYXJzZXItPml0c2VsZiA9IFhNTF9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZShzZWxmLT5pdHNlbGYsIGNvbnRleHQsCi0JCQkJCQkJZW5jb2RpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7CiAgICAgbmV3X3BhcnNlci0+aGFuZGxlcnMgPSAwOwogICAgIG5ld19wYXJzZXItPmludGVybiA9IHNlbGYtPmludGVybjsKICAgICBQeV9YSU5DUkVGKG5ld19wYXJzZXItPmludGVybik7CkBAIC0xMjQzLDI1ICsxMjQzLDI1IEBACiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiB4bWxwYXJzZV9tZXRob2RzW10gPSB7Ci0gICAgeyJQYXJzZSIsCSAgKFB5Q0Z1bmN0aW9uKXhtbHBhcnNlX1BhcnNlLAotCQkgIE1FVEhfVkFSQVJHUywJeG1scGFyc2VfUGFyc2VfX2RvY19ffSwKKyAgICB7IlBhcnNlIiwgICAgIChQeUNGdW5jdGlvbil4bWxwYXJzZV9QYXJzZSwKKyAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywgeG1scGFyc2VfUGFyc2VfX2RvY19ffSwKICAgICB7IlBhcnNlRmlsZSIsIChQeUNGdW5jdGlvbil4bWxwYXJzZV9QYXJzZUZpbGUsCi0JCSAgTUVUSF9PLAl4bWxwYXJzZV9QYXJzZUZpbGVfX2RvY19ffSwKKyAgICAgICAgICAgICAgICAgIE1FVEhfTywgICAgICAgeG1scGFyc2VfUGFyc2VGaWxlX19kb2NfX30sCiAgICAgeyJTZXRCYXNlIiwgICAoUHlDRnVuY3Rpb24peG1scGFyc2VfU2V0QmFzZSwKLQkJICBNRVRIX1ZBUkFSR1MsIHhtbHBhcnNlX1NldEJhc2VfX2RvY19ffSwKKyAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywgeG1scGFyc2VfU2V0QmFzZV9fZG9jX199LAogICAgIHsiR2V0QmFzZSIsICAgKFB5Q0Z1bmN0aW9uKXhtbHBhcnNlX0dldEJhc2UsCi0JCSAgTUVUSF9OT0FSR1MsIHhtbHBhcnNlX0dldEJhc2VfX2RvY19ffSwKKyAgICAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTLCB4bWxwYXJzZV9HZXRCYXNlX19kb2NfX30sCiAgICAgeyJFeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSIsIChQeUNGdW5jdGlvbil4bWxwYXJzZV9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSwKLQkgCSAgTUVUSF9WQVJBUkdTLCB4bWxwYXJzZV9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZV9fZG9jX199LAorICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLCB4bWxwYXJzZV9FeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZV9fZG9jX199LAogICAgIHsiU2V0UGFyYW1FbnRpdHlQYXJzaW5nIiwgKFB5Q0Z1bmN0aW9uKXhtbHBhcnNlX1NldFBhcmFtRW50aXR5UGFyc2luZywKLQkJICBNRVRIX1ZBUkFSR1MsIHhtbHBhcnNlX1NldFBhcmFtRW50aXR5UGFyc2luZ19fZG9jX199LAorICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLCB4bWxwYXJzZV9TZXRQYXJhbUVudGl0eVBhcnNpbmdfX2RvY19ffSwKICAgICB7IkdldElucHV0Q29udGV4dCIsIChQeUNGdW5jdGlvbil4bWxwYXJzZV9HZXRJbnB1dENvbnRleHQsCi0JCSAgTUVUSF9OT0FSR1MsIHhtbHBhcnNlX0dldElucHV0Q29udGV4dF9fZG9jX199LAorICAgICAgICAgICAgICAgICAgTUVUSF9OT0FSR1MsIHhtbHBhcnNlX0dldElucHV0Q29udGV4dF9fZG9jX199LAogI2lmIFhNTF9DT01CSU5FRF9WRVJTSU9OID49IDE5NTA1CiAgICAgeyJVc2VGb3JlaWduRFREIiwgKFB5Q0Z1bmN0aW9uKXhtbHBhcnNlX1VzZUZvcmVpZ25EVEQsCi0JCSAgTUVUSF9WQVJBUkdTLCB4bWxwYXJzZV9Vc2VGb3JlaWduRFREX19kb2NfX30sCisgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsIHhtbHBhcnNlX1VzZUZvcmVpZ25EVERfX2RvY19ffSwKICNlbmRpZgotICAgIHtOVUxMLAkgIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgTlVMTH0gICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogLS0tLS0tLS0tLSAqLwpAQCAtMTI4MSw3ICsxMjgxLDcgQEAKIHsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQl0ZW1wbGF0ZV9idWZmZXJbaV0gPSBpOworICAgICAgICB0ZW1wbGF0ZV9idWZmZXJbaV0gPSBpOwogICAgIH0KICAgICB0ZW1wbGF0ZV9idWZmZXJbMjU2XSA9IDA7CiB9CkBAIC0xMzAwLDE1ICsxMzAwLDE1IEBACiAgICAgICAgIFB5VW5pY29kZV9EZWNvZGUodGVtcGxhdGVfYnVmZmVyLCAyNTYsIG5hbWUsICJyZXBsYWNlIik7CiAKICAgICBpZiAoX3Vfc3RyaW5nID09IE5VTEwpCi0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCS8qIFN0dXBpZCB0byBhY2Nlc3MgZGlyZWN0bHksIGJ1dCBmYXN0ICovCi0JUHlfVU5JQ09ERSBjID0gX3Vfc3RyaW5nLT5zdHJbaV07Ci0JaWYgKGMgPT0gUHlfVU5JQ09ERV9SRVBMQUNFTUVOVF9DSEFSQUNURVIpCi0JICAgIGluZm8tPm1hcFtpXSA9IC0xOwotCWVsc2UKLQkgICAgaW5mby0+bWFwW2ldID0gYzsKKyAgICAgICAgLyogU3R1cGlkIHRvIGFjY2VzcyBkaXJlY3RseSwgYnV0IGZhc3QgKi8KKyAgICAgICAgUHlfVU5JQ09ERSBjID0gX3Vfc3RyaW5nLT5zdHJbaV07CisgICAgICAgIGlmIChjID09IFB5X1VOSUNPREVfUkVQTEFDRU1FTlRfQ0hBUkFDVEVSKQorICAgICAgICAgICAgaW5mby0+bWFwW2ldID0gLTE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluZm8tPm1hcFtpXSA9IGM7CiAgICAgfQogICAgIGluZm8tPmRhdGEgPSBOVUxMOwogICAgIGluZm8tPmNvbnZlcnQgPSBOVUxMOwpAQCAtMTUwOSwxOSArMTUwOSwxOSBAQAogICAgICAgICB9CiAgICAgfQogCi0jZGVmaW5lIEFQUEVORChsaXN0LCBzdHIpCQkJCVwKLSAgICAgICAgZG8gewkJCQkJCVwKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqbyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyKTsJXAotICAgICAgICAgICAgICAgIGlmIChvICE9IE5VTEwpCQkJCVwKLSAgICAgICAgCSAgICAgICAgUHlMaXN0X0FwcGVuZChsaXN0LCBvKTsJCVwKLSAgICAgICAgICAgICAgICBQeV9YREVDUkVGKG8pOwkJCQlcCisjZGVmaW5lIEFQUEVORChsaXN0LCBzdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHIpOyBcCisgICAgICAgICAgICAgICAgaWYgKG8gIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9BcHBlbmQobGlzdCwgbyk7ICAgICAgICAgXAorICAgICAgICAgICAgICAgIFB5X1hERUNSRUYobyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIH0gd2hpbGUgKDApCiAKICAgICBpZiAoc3RyY21wKG5hbWUsICJfX21lbWJlcnNfXyIpID09IDApIHsKICAgICAgICAgaW50IGk7CiAgICAgICAgIFB5T2JqZWN0ICpyYyA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKCFyYykKLQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghcmMpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGZvciAoaSA9IDA7IGhhbmRsZXJfaW5mb1tpXS5uYW1lICE9IE5VTEw7IGkrKykgewogICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBnZXRfaGFuZGxlcl9uYW1lKCZoYW5kbGVyX2luZm9baV0pOwogICAgICAgICAgICAgaWYgKG8gIT0gTlVMTCkKQEAgLTE2NTMsNDIgKzE2NTMsNDIgQEAKICAgICBpZiAoc3RyY21wKG5hbWUsICJidWZmZXJfc2l6ZSIpID09IDApIHsKICAgICAgIGxvbmcgbmV3X2J1ZmZlcl9zaXplOwogICAgICAgaWYgKCFQeUludF9DaGVjayh2KSkgewotICAgICAgCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXJfc2l6ZSBtdXN0IGJlIGFuIGludGVnZXIiKTsKLSAgICAgIAlyZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXJfc2l6ZSBtdXN0IGJlIGFuIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgICAgfQogCiAgICAgICBuZXdfYnVmZmVyX3NpemU9UHlJbnRfQVNfTE9ORyh2KTsKICAgICAgIC8qIHRyaXZpYWwgY2FzZSAtLSBubyBjaGFuZ2UgKi8KICAgICAgIGlmIChuZXdfYnVmZmVyX3NpemUgPT0gc2VsZi0+YnVmZmVyX3NpemUpIHsKLQlyZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgICB9CiAKICAgICAgIGlmIChuZXdfYnVmZmVyX3NpemUgPD0gMCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnVmZmVyX3NpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOwotCXJldHVybiAtMTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJidWZmZXJfc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIik7CisgICAgICAgIHJldHVybiAtMTsKICAgICAgIH0KIAogICAgICAgLyogY2hlY2sgbWF4aW11bSAqLwogICAgICAgaWYgKG5ld19idWZmZXJfc2l6ZSA+IElOVF9NQVgpIHsKLQljaGFyIGVycm1zZ1sxMDBdOwotCXNwcmludGYoZXJybXNnLCAiYnVmZmVyX3NpemUgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuICVpIiwgSU5UX01BWCk7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGVycm1zZyk7Ci0JcmV0dXJuIC0xOwkKKyAgICAgICAgY2hhciBlcnJtc2dbMTAwXTsKKyAgICAgICAgc3ByaW50ZihlcnJtc2csICJidWZmZXJfc2l6ZSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gJWkiLCBJTlRfTUFYKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGVycm1zZyk7CisgICAgICAgIHJldHVybiAtMTsKICAgICAgIH0KIAogICAgICAgaWYgKHNlbGYtPmJ1ZmZlciAhPSBOVUxMKSB7Ci0JLyogdGhlcmUgaXMgYWxyZWFkeSBhIGJ1ZmZlciAqLwotCWlmIChzZWxmLT5idWZmZXJfdXNlZCAhPSAwKSB7Ci0JICBmbHVzaF9jaGFyYWN0ZXJfYnVmZmVyKHNlbGYpOwotCX0KLQkvKiBmcmVlIGV4aXN0aW5nIGJ1ZmZlciAqLwotCWZyZWUoc2VsZi0+YnVmZmVyKTsKKyAgICAgICAgLyogdGhlcmUgaXMgYWxyZWFkeSBhIGJ1ZmZlciAqLworICAgICAgICBpZiAoc2VsZi0+YnVmZmVyX3VzZWQgIT0gMCkgeworICAgICAgICAgIGZsdXNoX2NoYXJhY3Rlcl9idWZmZXIoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgLyogZnJlZSBleGlzdGluZyBidWZmZXIgKi8KKyAgICAgICAgZnJlZShzZWxmLT5idWZmZXIpOwogICAgICAgfQogICAgICAgc2VsZi0+YnVmZmVyID0gbWFsbG9jKG5ld19idWZmZXJfc2l6ZSk7CiAgICAgICBpZiAoc2VsZi0+YnVmZmVyID09IE5VTEwpIHsKLQlQeUVycl9Ob01lbW9yeSgpOwotCXJldHVybiAtMTsKLSAgICAgIH0JICAKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQogICAgICAgc2VsZi0+YnVmZmVyX3NpemUgPSBuZXdfYnVmZmVyX3NpemU7CiAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xNzMxLDM3ICsxNzMxLDM3IEBACiBQeURvY19TVFJWQVIoWG1scGFyc2V0eXBlX19kb2NfXywgIlhNTCBwYXJzZXIiKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBYbWxwYXJzZXR5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInB5ZXhwYXQueG1scGFyc2VyIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKHhtbHBhcnNlb2JqZWN0KSArIFB5R0NfSEVBRF9TSVpFLC8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpeG1scGFyc2VfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkocHJpbnRmdW5jKTAsCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpeG1scGFyc2VfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpeG1scGFyc2Vfc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3N0ciovCi0JMCwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCS8qIHRwX2FzX2J1ZmZlciAqLworICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAgICAgInB5ZXhwYXQueG1scGFyc2VyIiwgICAgICAgICAgICAvKnRwX25hbWUqLworICAgICAgICBzaXplb2YoeG1scGFyc2VvYmplY3QpICsgUHlHQ19IRUFEX1NJWkUsLyp0cF9iYXNpY3NpemUqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgICAgICAvKiBtZXRob2RzICovCisgICAgICAgIChkZXN0cnVjdG9yKXhtbHBhcnNlX2RlYWxsb2MsICAgLyp0cF9kZWFsbG9jKi8KKyAgICAgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgICAgIChnZXRhdHRyZnVuYyl4bWxwYXJzZV9nZXRhdHRyLCAgLyp0cF9nZXRhdHRyKi8KKyAgICAgICAgKHNldGF0dHJmdW5jKXhtbHBhcnNlX3NldGF0dHIsICAvKnRwX3NldGF0dHIqLworICAgICAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgICAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgICAgIDAsICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgIC8qdHBfY2FsbCovCisgICAgICAgIChyZXByZnVuYykwLCAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgICAgIDAsICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAjaWZkZWYgUHlfVFBGTEFHU19IQVZFX0dDCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKnRwX2ZsYWdzKi8KKyAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKnRwX2ZsYWdzKi8KICNlbHNlCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19HQywgLyp0cF9mbGFncyovCisgICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfR0MsIC8qdHBfZmxhZ3MqLwogI2VuZGlmCi0JWG1scGFyc2V0eXBlX19kb2NfXywgLyogdHBfZG9jIC0gRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KKyAgICAgICAgWG1scGFyc2V0eXBlX19kb2NfXywgLyogdHBfZG9jIC0gRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KICNpZmRlZiBXSVRIX0NZQ0xFX0dDCi0JKHRyYXZlcnNlcHJvYyl4bWxwYXJzZV90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSl4bWxwYXJzZV9jbGVhcgkJLyogdHBfY2xlYXIgKi8KKyAgICAgICAgKHRyYXZlcnNlcHJvYyl4bWxwYXJzZV90cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIChpbnF1aXJ5KXhtbHBhcnNlX2NsZWFyICAgICAgICAgLyogdHBfY2xlYXIgKi8KICNlbHNlCi0JMCwgMAorICAgICAgICAwLCAwCiAjZW5kaWYKIH07CiAKQEAgLTE3OTYsMjEgKzE3OTYsMjEgQEAKICAgICAvKiBFeHBsaWNpdGx5IHBhc3NpbmcgTm9uZSBtZWFucyBubyBpbnRlcm5pbmcgaXMgZGVzaXJlZC4KICAgICAgICBOb3QgcGFzc2luZyBhbnl0aGluZyBtZWFucyB0aGF0IGEgbmV3IGRpY3Rpb25hcnkgaXMgdXNlZC4gKi8KICAgICBpZiAoaW50ZXJuID09IFB5X05vbmUpCi0JaW50ZXJuID0gTlVMTDsKKyAgICAgICAgaW50ZXJuID0gTlVMTDsKICAgICBlbHNlIGlmIChpbnRlcm4gPT0gTlVMTCkgewotCWludGVybiA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIWludGVybikKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaW50ZXJuX2RlY3JlZiA9IDE7CisgICAgICAgIGludGVybiA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKCFpbnRlcm4pCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaW50ZXJuX2RlY3JlZiA9IDE7CiAgICAgfQogICAgIGVsc2UgaWYgKCFQeURpY3RfQ2hlY2soaW50ZXJuKSkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnRlcm4gbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImludGVybiBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICByZXN1bHQgPSBuZXd4bWxwYXJzZW9iamVjdChlbmNvZGluZywgbmFtZXNwYWNlX3NlcGFyYXRvciwgaW50ZXJuKTsKICAgICBpZiAoaW50ZXJuX2RlY3JlZikgewotCVB5X0RFQ1JFRihpbnRlcm4pOworICAgICAgICBQeV9ERUNSRUYoaW50ZXJuKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTE4MzIsMTIgKzE4MzIsMTIgQEAKIC8qIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBweWV4cGF0X21ldGhvZHNbXSA9IHsKLSAgICB7IlBhcnNlckNyZWF0ZSIsCShQeUNGdW5jdGlvbilweWV4cGF0X1BhcnNlckNyZWF0ZSwKKyAgICB7IlBhcnNlckNyZWF0ZSIsICAgIChQeUNGdW5jdGlvbilweWV4cGF0X1BhcnNlckNyZWF0ZSwKICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIHB5ZXhwYXRfUGFyc2VyQ3JlYXRlX19kb2NfX30sCi0gICAgeyJFcnJvclN0cmluZyIsCShQeUNGdW5jdGlvbilweWV4cGF0X0Vycm9yU3RyaW5nLAotICAgICBNRVRIX1ZBUkFSR1MsCXB5ZXhwYXRfRXJyb3JTdHJpbmdfX2RvY19ffSwKKyAgICB7IkVycm9yU3RyaW5nIiwgICAgIChQeUNGdW5jdGlvbilweWV4cGF0X0Vycm9yU3RyaW5nLAorICAgICBNRVRIX1ZBUkFSR1MsICAgICAgcHlleHBhdF9FcnJvclN0cmluZ19fZG9jX199LAogCi0gICAge05VTEwsCSAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfSAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBNb2R1bGUgZG9jc3RyaW5nICovCkBAIC0xOTA5LDcgKzE5MDksNyBAQAogICAgIG0gPSBQeV9Jbml0TW9kdWxlMyhNT0RVTEVfTkFNRSwgcHlleHBhdF9tZXRob2RzLAogICAgICAgICAgICAgICAgICAgICAgICBweWV4cGF0X21vZHVsZV9kb2N1bWVudGF0aW9uKTsKICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KICAgICBpZiAoRXJyb3JPYmplY3QgPT0gTlVMTCkgewpAQCAtMTk2OCw3ICsxOTY4LDcgQEAKICAgICBpZiAoZXJyb3JzX21vZHVsZSA9PSBOVUxMIHx8IG1vZGVsX21vZHVsZSA9PSBOVUxMKQogICAgICAgICAvKiBEb24ndCBjb3JlIGR1bXAgbGF0ZXIhICovCiAgICAgICAgIHJldHVybjsKLSAgICAKKwogI2lmIFhNTF9DT01CSU5FRF9WRVJTSU9OID4gMTk1MDUKICAgICB7CiAgICAgICAgIGNvbnN0IFhNTF9GZWF0dXJlICpmZWF0dXJlcyA9IFhNTF9HZXRGZWF0dXJlTGlzdCgpOwpAQCAtMjA5Myw3ICsyMDkzLDcgQEAKICAgICBjYXBpLlNldFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcjsKICAgICBjYXBpLlNldFVua25vd25FbmNvZGluZ0hhbmRsZXIgPSBYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlcjsKICAgICBjYXBpLlNldFVzZXJEYXRhID0gWE1MX1NldFVzZXJEYXRhOwotICAgIAorCiAgICAgLyogZXhwb3J0IGFzIGNvYmplY3QgKi8KICAgICBjYXBpX29iamVjdCA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cigmY2FwaSwgTlVMTCk7CiAgICAgaWYgKGNhcGlfb2JqZWN0KQpAQCAtMjEwOCwxMiArMjEwOCwxMiBAQAogCiAgICAgZm9yICg7IGhhbmRsZXJfaW5mb1tpXS5uYW1lICE9IE5VTEw7IGkrKykgewogICAgICAgICBpZiAoaW5pdGlhbCkKLQkgICAgc2VsZi0+aGFuZGxlcnNbaV0gPSBOVUxMOwotCWVsc2UgeworICAgICAgICAgICAgc2VsZi0+aGFuZGxlcnNbaV0gPSBOVUxMOworICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHRlbXAgPSBzZWxmLT5oYW5kbGVyc1tpXTsKICAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKICAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7Ci0JICAgIGhhbmRsZXJfaW5mb1tpXS5zZXR0ZXIoc2VsZi0+aXRzZWxmLCBOVUxMKTsKKyAgICAgICAgICAgIGhhbmRsZXJfaW5mb1tpXS5zZXR0ZXIoc2VsZi0+aXRzZWxmLCBOVUxMKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVhZGxpbmUuYyBiL01vZHVsZXMvcmVhZGxpbmUuYwppbmRleCA3MTJiODU3Li4wMzhiNGQ2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3JlYWRsaW5lLmMKKysrIGIvTW9kdWxlcy9yZWFkbGluZS5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaWZkZWYgU0FWRV9MT0NBTEUKICMgIGRlZmluZSBSRVNUT1JFX0xPQ0FMRShzbCkgeyBzZXRsb2NhbGUoTENfQ1RZUEUsIHNsKTsgZnJlZShzbCk7IH0KICNlbHNlCi0jICBkZWZpbmUgUkVTVE9SRV9MT0NBTEUoc2wpIAorIyAgZGVmaW5lIFJFU1RPUkVfTE9DQUxFKHNsKQogI2VuZGlmCiAKIC8qIEdOVSByZWFkbGluZSBkZWZpbml0aW9ucyAqLwpAQCAtMzMsNyArMzMsNyBAQAogCiAjaWZkZWYgSEFWRV9STF9DT01QTEVUSU9OX01BVENIRVMKICNkZWZpbmUgY29tcGxldGlvbl9tYXRjaGVzKHgsIHkpIFwKLQlybF9jb21wbGV0aW9uX21hdGNoZXMoKHgpLCAoKHJsX2NvbXBlbnRyeV9mdW5jX3QgKikoeSkpKQorICAgIHJsX2NvbXBsZXRpb25fbWF0Y2hlcygoeCksICgocmxfY29tcGVudHJ5X2Z1bmNfdCAqKSh5KSkpCiAjZWxzZQogI2lmIGRlZmluZWQoX1JMX0ZVTkNUSU9OX1RZUEVERUYpCiBleHRlcm4gY2hhciAqKmNvbXBsZXRpb25fbWF0Y2hlcyhjaGFyICosIHJsX2NvbXBlbnRyeV9mdW5jX3QgKik7CkBAIC00NywxMyArNDcsMTMgQEAKICNpZmRlZiBfX0FQUExFX18KIC8qCiAgKiBJdCBpcyBwb3NzaWJsZSB0byBsaW5rIHRoZSByZWFkbGluZSBtb2R1bGUgdG8gdGhlIHJlYWRsaW5lCi0gKiBlbXVsYXRpb24gbGlicmFyeSBvZiBlZGl0bGluZS9saWJlZGl0LiAKLSAqIAorICogZW11bGF0aW9uIGxpYnJhcnkgb2YgZWRpdGxpbmUvbGliZWRpdC4KKyAqCiAgKiBPbiBPU1ggdGhpcyBlbXVsYXRpb24gbGlicmFyeSBpcyBub3QgMTAwJSBBUEkgY29tcGF0aWJsZQogICogd2l0aCB0aGUgInJlYWwiIHJlYWRsaW5lIGFuZCBjYW5ub3QgYmUgZGV0ZWN0ZWQgYXQgY29tcGlsZS10aW1lLAogICogaGVuY2Ugd2UgdXNlIGEgcnVudGltZSBjaGVjayB0byBkZXRlY3QgaWYgd2UncmUgdXNpbmcgbGliZWRpdAogICoKLSAqIEN1cnJlbnRseSB0aGVyZSBpcyBvbmUga25vdyBBUEkgaW5jb21wYXRpYmlsaXR5OiAKKyAqIEN1cnJlbnRseSB0aGVyZSBpcyBvbmUga25vdyBBUEkgaW5jb21wYXRpYmlsaXR5OgogICogLSAnZ2V0X2hpc3RvcnknIGhhcyBhIDEtYmFzZWQgaW5kZXggd2l0aCBHTlUgcmVhZGxpbmUsIGFuZCBhIDAtYmFzZWQKICAqICAgaW5kZXggd2l0aCBsaWJlZGl0J3MgZW11bGF0aW9uLgogICogLSBOb3RlIHRoYXQgcmVwbGFjZV9oaXN0b3J5IGFuZCByZW1vdmVfaGlzdG9yeSB1c2UgYSAwLWJhc2VkIGluZGV4CkBAIC02NSw3ICs2NSw3IEBACiAKIHN0YXRpYyB2b2lkCiBvbl9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rKGNoYXIgKiptYXRjaGVzLAotCQkJCSAgIGludCBudW1fbWF0Y2hlcywgaW50IG1heF9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX21hdGNoZXMsIGludCBtYXhfbGVuZ3RoKTsKIAogCiAvKiBFeHBvcnRlZCBmdW5jdGlvbiB0byBzZW5kIG9uZSBsaW5lIHRvIHJlYWRsaW5lJ3MgaW5pdCBmaWxlIHBhcnNlciAqLwpAQCAtNzMsMTggKzczLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcGFyc2VfYW5kX2JpbmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICpjb3B5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpwYXJzZV9hbmRfYmluZCIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogTWFrZSBhIGNvcHkgLS0gcmxfcGFyc2VfYW5kX2JpbmQoKSBtb2RpZmllcyBpdHMgYXJndW1lbnQgKi8KLQkvKiBCZXJuYXJkIEhlcnpvZyAqLwotCWNvcHkgPSBtYWxsb2MoMSArIHN0cmxlbihzKSk7Ci0JaWYgKGNvcHkgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0Jc3RyY3B5KGNvcHksIHMpOwotCXJsX3BhcnNlX2FuZF9iaW5kKGNvcHkpOwotCWZyZWUoY29weSk7IC8qIEZyZWUgdGhlIGNvcHkgKi8KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBjaGFyICpzLCAqY29weTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6cGFyc2VfYW5kX2JpbmQiLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIE1ha2UgYSBjb3B5IC0tIHJsX3BhcnNlX2FuZF9iaW5kKCkgbW9kaWZpZXMgaXRzIGFyZ3VtZW50ICovCisgICAgLyogQmVybmFyZCBIZXJ6b2cgKi8KKyAgICBjb3B5ID0gbWFsbG9jKDEgKyBzdHJsZW4ocykpOworICAgIGlmIChjb3B5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHN0cmNweShjb3B5LCBzKTsKKyAgICBybF9wYXJzZV9hbmRfYmluZChjb3B5KTsKKyAgICBmcmVlKGNvcHkpOyAvKiBGcmVlIHRoZSBjb3B5ICovCisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfcGFyc2VfYW5kX2JpbmQsCkBAIC05NywxMyArOTcsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByZWFkX2luaXRfZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejpyZWFkX2luaXRfZmlsZSIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJybm8gPSBybF9yZWFkX2luaXRfZmlsZShzKTsKLQlpZiAoZXJybm8pCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgY2hhciAqcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejpyZWFkX2luaXRfZmlsZSIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSBybF9yZWFkX2luaXRfZmlsZShzKTsKKyAgICBpZiAoZXJybm8pCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfcmVhZF9pbml0X2ZpbGUsCkBAIC0xMTcsMTMgKzExNywxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJlYWRfaGlzdG9yeV9maWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInx6OnJlYWRfaGlzdG9yeV9maWxlIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQllcnJubyA9IHJlYWRfaGlzdG9yeShzKTsKLQlpZiAoZXJybm8pCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgY2hhciAqcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejpyZWFkX2hpc3RvcnlfZmlsZSIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJybm8gPSByZWFkX2hpc3Rvcnkocyk7CisgICAgaWYgKGVycm5vKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgaW50IF9oaXN0b3J5X2xlbmd0aCA9IC0xOyAvKiBkbyBub3QgdHJ1bmNhdGUgaGlzdG9yeSBieSBkZWZhdWx0ICovCkBAIC0xMzgsMTUgKzEzOCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdyaXRlX2hpc3RvcnlfZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejp3cml0ZV9oaXN0b3J5X2ZpbGUiLCAmcykpCi0JCXJldHVybiBOVUxMOwotCWVycm5vID0gd3JpdGVfaGlzdG9yeShzKTsKLQlpZiAoIWVycm5vICYmIF9oaXN0b3J5X2xlbmd0aCA+PSAwKQotCQloaXN0b3J5X3RydW5jYXRlX2ZpbGUocywgX2hpc3RvcnlfbGVuZ3RoKTsKLQlpZiAoZXJybm8pCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgY2hhciAqcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8ejp3cml0ZV9oaXN0b3J5X2ZpbGUiLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gd3JpdGVfaGlzdG9yeShzKTsKKyAgICBpZiAoIWVycm5vICYmIF9oaXN0b3J5X2xlbmd0aCA+PSAwKQorICAgICAgICBoaXN0b3J5X3RydW5jYXRlX2ZpbGUocywgX2hpc3RvcnlfbGVuZ3RoKTsKKyAgICBpZiAoZXJybm8pCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2Nfd3JpdGVfaGlzdG9yeV9maWxlLApAQCAtMTYwLDExICsxNjAsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHNldF9oaXN0b3J5X2xlbmd0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGxlbmd0aCA9IF9oaXN0b3J5X2xlbmd0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0X2hpc3RvcnlfbGVuZ3RoIiwgJmxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9oaXN0b3J5X2xlbmd0aCA9IGxlbmd0aDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpbnQgbGVuZ3RoID0gX2hpc3RvcnlfbGVuZ3RoOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRfaGlzdG9yeV9sZW5ndGgiLCAmbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2hpc3RvcnlfbGVuZ3RoID0gbGVuZ3RoOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoc2V0X2hpc3RvcnlfbGVuZ3RoX2RvYywKQEAgLTE3OSw3ICsxNzksNyBAQAogc3RhdGljIFB5T2JqZWN0KgogZ2V0X2hpc3RvcnlfbGVuZ3RoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmcpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKF9oaXN0b3J5X2xlbmd0aCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKF9oaXN0b3J5X2xlbmd0aCk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRfaGlzdG9yeV9sZW5ndGhfZG9jLApAQCAtMTkzLDI5ICsxOTMsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaG9vayhjb25zdCBjaGFyICpmdW5jbmFtZSwgUHlPYmplY3QgKipob29rX3ZhciwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZ1bmN0aW9uID0gUHlfTm9uZTsKLQljaGFyIGJ1Zls4MF07Ci0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAifE86c2V0XyUuNTBzIiwgZnVuY25hbWUpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBidWYsICZmdW5jdGlvbikpCi0JCXJldHVybiBOVUxMOwotCWlmIChmdW5jdGlvbiA9PSBQeV9Ob25lKSB7Ci0JCVB5X1hERUNSRUYoKmhvb2tfdmFyKTsKLQkJKmhvb2tfdmFyID0gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoUHlDYWxsYWJsZV9DaGVjayhmdW5jdGlvbikpIHsKLQkJUHlPYmplY3QgKnRtcCA9ICpob29rX3ZhcjsKLQkJUHlfSU5DUkVGKGZ1bmN0aW9uKTsKLQkJKmhvb2tfdmFyID0gZnVuY3Rpb247Ci0JCVB5X1hERUNSRUYodG1wKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAgICJzZXRfJS41MHMoZnVuYyk6IGFyZ3VtZW50IG5vdCBjYWxsYWJsZSIsCi0JCQkgICAgICBmdW5jbmFtZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGJ1Zik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeU9iamVjdCAqZnVuY3Rpb24gPSBQeV9Ob25lOworICAgIGNoYXIgYnVmWzgwXTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ8TzpzZXRfJS41MHMiLCBmdW5jbmFtZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIGJ1ZiwgJmZ1bmN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGZ1bmN0aW9uID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfWERFQ1JFRigqaG9va192YXIpOworICAgICAgICAqaG9va192YXIgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChQeUNhbGxhYmxlX0NoZWNrKGZ1bmN0aW9uKSkgeworICAgICAgICBQeU9iamVjdCAqdG1wID0gKmhvb2tfdmFyOworICAgICAgICBQeV9JTkNSRUYoZnVuY3Rpb24pOworICAgICAgICAqaG9va192YXIgPSBmdW5jdGlvbjsKKyAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXRfJS41MHMoZnVuYyk6IGFyZ3VtZW50IG5vdCBjYWxsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgZnVuY25hbWUpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIApAQCAtMjMxLDIwICsyMzEsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IHNldF9ob29rKCJjb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rIiwKLQkJCSZjb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rLCBhcmdzKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gc2V0X2hvb2soImNvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2siLAorICAgICAgICAgICAgICAgICAgICAmY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vaywgYXJncyk7CiAjaWZkZWYgSEFWRV9STF9DT01QTEVUSU9OX0RJU1BMQVlfTUFUQ0hFU19IT09LCi0JLyogV2UgY2Fubm90IHNldCB0aGlzIGhvb2sgZ2xvYmFsbHksIHNpbmNlIGl0IHJlcGxhY2VzIHRoZQotCSAgIGRlZmF1bHQgY29tcGxldGlvbiBkaXNwbGF5LiAqLwotCXJsX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgPQotCQljb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rID8KKyAgICAvKiBXZSBjYW5ub3Qgc2V0IHRoaXMgaG9vayBnbG9iYWxseSwgc2luY2UgaXQgcmVwbGFjZXMgdGhlCisgICAgICAgZGVmYXVsdCBjb21wbGV0aW9uIGRpc3BsYXkuICovCisgICAgcmxfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayA9CisgICAgICAgIGNvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgPwogI2lmIGRlZmluZWQoX1JMX0ZVTkNUSU9OX1RZUEVERUYpCi0JCShybF9jb21wZGlzcF9mdW5jX3QgKilvbl9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rIDogMDsKKyAgICAgICAgKHJsX2NvbXBkaXNwX2Z1bmNfdCAqKW9uX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgOiAwOwogI2Vsc2UKLQkJKFZGdW5jdGlvbiAqKW9uX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2sgOiAwOworICAgICAgICAoVkZ1bmN0aW9uICopb25fY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayA6IDA7CiAjZW5kaWYKICNlbmRpZgotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogfQogCkBAIC0yNTgsNyArMjU4LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc3RhcnR1cF9ob29rKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc2V0X2hvb2soInN0YXJ0dXBfaG9vayIsICZzdGFydHVwX2hvb2ssIGFyZ3MpOworICAgIHJldHVybiBzZXRfaG9vaygic3RhcnR1cF9ob29rIiwgJnN0YXJ0dXBfaG9vaywgYXJncyk7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2Nfc2V0X3N0YXJ0dXBfaG9vaywKQEAgLTI3NSw3ICsyNzUsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wcmVfaW5wdXRfaG9vayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHNldF9ob29rKCJwcmVfaW5wdXRfaG9vayIsICZwcmVfaW5wdXRfaG9vaywgYXJncyk7CisgICAgcmV0dXJuIHNldF9ob29rKCJwcmVfaW5wdXRfaG9vayIsICZwcmVfaW5wdXRfaG9vaywgYXJncyk7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2Nfc2V0X3ByZV9pbnB1dF9ob29rLApAQCAtMzEzLDggKzMxMyw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2JlZ2lkeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJnKQogewotCVB5X0lOQ1JFRihiZWdpZHgpOwotCXJldHVybiBiZWdpZHg7CisgICAgUHlfSU5DUkVGKGJlZ2lkeCk7CisgICAgcmV0dXJuIGJlZ2lkeDsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19nZXRfYmVnaWR4LApAQCAtMzI3LDggKzMyNyw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2VuZGlkeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJnKQogewotCVB5X0lOQ1JFRihlbmRpZHgpOwotCXJldHVybiBlbmRpZHg7CisgICAgUHlfSU5DUkVGKGVuZGlkeCk7CisgICAgcmV0dXJuIGVuZGlkeDsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19nZXRfZW5kaWR4LApAQCAtMzQxLDE0ICszNDEsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY29tcGxldGVyX2RlbGltcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqYnJlYWtfY2hhcnM7CisgICAgY2hhciAqYnJlYWtfY2hhcnM7CiAKLQlpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzZXRfY29tcGxldGVyX2RlbGltcyIsICZicmVha19jaGFycykpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZyZWUoKHZvaWQqKXJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMpOwotCXJsX2NvbXBsZXRlcl93b3JkX2JyZWFrX2NoYXJhY3RlcnMgPSBzdHJkdXAoYnJlYWtfY2hhcnMpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnNldF9jb21wbGV0ZXJfZGVsaW1zIiwgJmJyZWFrX2NoYXJzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnJlZSgodm9pZCopcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyk7CisgICAgcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyA9IHN0cmR1cChicmVha19jaGFycyk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2Nfc2V0X2NvbXBsZXRlcl9kZWxpbXMsCkBAIC0zNTgsMzEgKzM1OCwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5X3JlbW92ZV9oaXN0b3J5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZW50cnlfbnVtYmVyOwotCUhJU1RfRU5UUlkgKmVudHJ5OworICAgIGludCBlbnRyeV9udW1iZXI7CisgICAgSElTVF9FTlRSWSAqZW50cnk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVtb3ZlX2hpc3RvcnkiLCAmZW50cnlfbnVtYmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGVudHJ5X251bWJlciA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIkhpc3RvcnkgaW5kZXggY2Fubm90IGJlIG5lZ2F0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbnRyeSA9IHJlbW92ZV9oaXN0b3J5KGVudHJ5X251bWJlcik7Ci0JaWYgKCFlbnRyeSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIk5vIGhpc3RvcnkgaXRlbSBhdCBwb3NpdGlvbiAlZCIsCi0JCQkgICAgICBlbnRyeV9udW1iZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgaGlzdG9yeSBlbnRyeSAqLwotCWlmIChlbnRyeS0+bGluZSkKLQkJZnJlZShlbnRyeS0+bGluZSk7Ci0JaWYgKGVudHJ5LT5kYXRhKQotCQlmcmVlKGVudHJ5LT5kYXRhKTsKLQlmcmVlKGVudHJ5KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVtb3ZlX2hpc3RvcnkiLCAmZW50cnlfbnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGVudHJ5X251bWJlciA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiSGlzdG9yeSBpbmRleCBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVudHJ5ID0gcmVtb3ZlX2hpc3RvcnkoZW50cnlfbnVtYmVyKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIk5vIGhpc3RvcnkgaXRlbSBhdCBwb3NpdGlvbiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgZW50cnlfbnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGhpc3RvcnkgZW50cnkgKi8KKyAgICBpZiAoZW50cnktPmxpbmUpCisgICAgICAgIGZyZWUoZW50cnktPmxpbmUpOworICAgIGlmIChlbnRyeS0+ZGF0YSkKKyAgICAgICAgZnJlZShlbnRyeS0+ZGF0YSk7CisgICAgZnJlZShlbnRyeSk7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19yZW1vdmVfaGlzdG9yeSwKQEAgLTM5MiwzNCArMzkyLDM0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHlfcmVwbGFjZV9oaXN0b3J5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZW50cnlfbnVtYmVyOwotCWNoYXIgKmxpbmU7Ci0JSElTVF9FTlRSWSAqb2xkX2VudHJ5OworICAgIGludCBlbnRyeV9udW1iZXI7CisgICAgY2hhciAqbGluZTsKKyAgICBISVNUX0VOVFJZICpvbGRfZW50cnk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzOnJlcGxhY2VfaGlzdG9yeSIsICZlbnRyeV9udW1iZXIsCi0JICAgICAgCQkgICAgICAmbGluZSkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChlbnRyeV9udW1iZXIgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJIaXN0b3J5IGluZGV4IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb2xkX2VudHJ5ID0gcmVwbGFjZV9oaXN0b3J5X2VudHJ5KGVudHJ5X251bWJlciwgbGluZSwgKHZvaWQgKilOVUxMKTsKLQlpZiAoIW9sZF9lbnRyeSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIk5vIGhpc3RvcnkgaXRlbSBhdCBwb3NpdGlvbiAlZCIsCi0JCQkgICAgIGVudHJ5X251bWJlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBvbGQgaGlzdG9yeSBlbnRyeSAqLwotCWlmIChvbGRfZW50cnktPmxpbmUpCi0JICAgIGZyZWUob2xkX2VudHJ5LT5saW5lKTsKLQlpZiAob2xkX2VudHJ5LT5kYXRhKQotCSAgICBmcmVlKG9sZF9lbnRyeS0+ZGF0YSk7Ci0JZnJlZShvbGRfZW50cnkpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXM6cmVwbGFjZV9oaXN0b3J5IiwgJmVudHJ5X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbmUpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZW50cnlfbnVtYmVyIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJIaXN0b3J5IGluZGV4IGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb2xkX2VudHJ5ID0gcmVwbGFjZV9oaXN0b3J5X2VudHJ5KGVudHJ5X251bWJlciwgbGluZSwgKHZvaWQgKilOVUxMKTsKKyAgICBpZiAoIW9sZF9lbnRyeSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJObyBoaXN0b3J5IGl0ZW0gYXQgcG9zaXRpb24gJWQiLAorICAgICAgICAgICAgICAgICAgICAgZW50cnlfbnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9sZCBoaXN0b3J5IGVudHJ5ICovCisgICAgaWYgKG9sZF9lbnRyeS0+bGluZSkKKyAgICAgICAgZnJlZShvbGRfZW50cnktPmxpbmUpOworICAgIGlmIChvbGRfZW50cnktPmRhdGEpCisgICAgICAgIGZyZWUob2xkX2VudHJ5LT5kYXRhKTsKKyAgICBmcmVlKG9sZF9lbnRyeSk7CiAKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19yZXBsYWNlX2hpc3RvcnksCkBAIC00MzEsMTMgKzQzMSwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5X2FkZF9oaXN0b3J5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpsaW5lOworICAgIGNoYXIgKmxpbmU7CiAKLQlpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczphZGRfaGlzdG9yeSIsICZsaW5lKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYWRkX2hpc3RvcnkobGluZSk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6YWRkX2hpc3RvcnkiLCAmbGluZSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFkZF9oaXN0b3J5KGxpbmUpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2FkZF9oaXN0b3J5LApAQCAtNDUwLDcgKzQ1MCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2NvbXBsZXRlcl9kZWxpbXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZykKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19nZXRfY29tcGxldGVyX2RlbGltcywKQEAgLTQ2Myw3ICs0NjMsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jb21wbGV0ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzZXRfaG9vaygiY29tcGxldGVyIiwgJmNvbXBsZXRlciwgYXJncyk7CisgICAgcmV0dXJuIHNldF9ob29rKCJjb21wbGV0ZXIiLCAmY29tcGxldGVyLCBhcmdzKTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19zZXRfY29tcGxldGVyLApAQCAtNDc3LDExICs0NzcsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY29tcGxldGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCWlmIChjb21wbGV0ZXIgPT0gTlVMTCkgewotCQlQeV9SRVRVUk5fTk9ORTsKLQl9Ci0JUHlfSU5DUkVGKGNvbXBsZXRlcik7Ci0JcmV0dXJuIGNvbXBsZXRlcjsKKyAgICBpZiAoY29tcGxldGVyID09IE5VTEwpIHsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQorICAgIFB5X0lOQ1JFRihjb21wbGV0ZXIpOworICAgIHJldHVybiBjb21wbGV0ZXI7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfZ2V0X2NvbXBsZXRlciwKQEAgLTQ5NCwzOSArNDk0LDM5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2hpc3RvcnlfaXRlbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGlkeCA9IDA7Ci0JSElTVF9FTlRSWSAqaGlzdF9lbnQ7CisgICAgaW50IGlkeCA9IDA7CisgICAgSElTVF9FTlRSWSAqaGlzdF9lbnQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6aW5kZXgiLCAmaWR4KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmluZGV4IiwgJmlkeCkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmICBfX0FQUExFX18KLQlpZiAodXNpbmdfbGliZWRpdF9lbXVsYXRpb24pIHsKLQkJLyogTGliZWRpdCBlbXVsYXRpb24gdXNlcyAwLWJhc2VkIGluZGV4ZXMsCi0JCSAqIHRoZSByZWFsIG9uZSB1c2VzIDEtYmFzZWQgaW5kZXhlcywKLQkJICogYWRqdXN0IHRoZSBpbmRleCB0byBlbnN1cmUgdGhhdCBQeXRob24KLQkJICogY29kZSBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlCi0JCSAqIGRpZmZlcmVuY2UuCi0JCSAqLwotCQlISVNUT1JZX1NUQVRFICpoaXN0X3N0OwotCQloaXN0X3N0ID0gaGlzdG9yeV9nZXRfaGlzdG9yeV9zdGF0ZSgpOworICAgIGlmICh1c2luZ19saWJlZGl0X2VtdWxhdGlvbikgeworICAgICAgICAvKiBMaWJlZGl0IGVtdWxhdGlvbiB1c2VzIDAtYmFzZWQgaW5kZXhlcywKKyAgICAgICAgICogdGhlIHJlYWwgb25lIHVzZXMgMS1iYXNlZCBpbmRleGVzLAorICAgICAgICAgKiBhZGp1c3QgdGhlIGluZGV4IHRvIGVuc3VyZSB0aGF0IFB5dGhvbgorICAgICAgICAgKiBjb2RlIGRvZXNuJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUKKyAgICAgICAgICogZGlmZmVyZW5jZS4KKyAgICAgICAgICovCisgICAgICAgIEhJU1RPUllfU1RBVEUgKmhpc3Rfc3Q7CisgICAgICAgIGhpc3Rfc3QgPSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlKCk7CiAKLQkJaWR4IC0tOworICAgICAgICBpZHggLS07CiAKLQkJLyoKLQkJICogQXBwbGUncyByZWFkbGluZSBlbXVsYXRpb24gY3Jhc2hlcyB3aGVuCi0JCSAqIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIHRoZXJlZm9yZSAKLQkJICogdGVzdCBmb3IgdGhhdCBhbmQgZmFpbCBncmFjZWZ1bGx5LgotCQkgKi8KLQkJaWYgKGlkeCA8IDAgfHwgaWR4ID49IGhpc3Rfc3QtPmxlbmd0aCkgewotCQkJUHlfUkVUVVJOX05PTkU7Ci0JCX0KLQl9CisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGxlJ3MgcmVhZGxpbmUgZW11bGF0aW9uIGNyYXNoZXMgd2hlbgorICAgICAgICAgKiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCB0aGVyZWZvcmUKKyAgICAgICAgICogdGVzdCBmb3IgdGhhdCBhbmQgZmFpbCBncmFjZWZ1bGx5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IGhpc3Rfc3QtPmxlbmd0aCkgeworICAgICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYgLyogX19BUFBMRV9fICovCi0JaWYgKChoaXN0X2VudCA9IGhpc3RvcnlfZ2V0KGlkeCkpKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhoaXN0X2VudC0+bGluZSk7Ci0JZWxzZSB7Ci0JCVB5X1JFVFVSTl9OT05FOwotCX0KKyAgICBpZiAoKGhpc3RfZW50ID0gaGlzdG9yeV9nZXQoaWR4KSkpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGhpc3RfZW50LT5saW5lKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIoZG9jX2dldF9oaXN0b3J5X2l0ZW0sCkBAIC01MzksMTAgKzUzOSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmcpCiB7Ci0JSElTVE9SWV9TVEFURSAqaGlzdF9zdDsKKyAgICBISVNUT1JZX1NUQVRFICpoaXN0X3N0OwogCi0JaGlzdF9zdCA9IGhpc3RvcnlfZ2V0X2hpc3Rvcnlfc3RhdGUoKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaGlzdF9zdCA/IChsb25nKSBoaXN0X3N0LT5sZW5ndGggOiAobG9uZykgMCk7CisgICAgaGlzdF9zdCA9IGhpc3RvcnlfZ2V0X2hpc3Rvcnlfc3RhdGUoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoaGlzdF9zdCA/IChsb25nKSBoaXN0X3N0LT5sZW5ndGggOiAobG9uZykgMCk7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfZ2V0X2N1cnJlbnRfaGlzdG9yeV9sZW5ndGgsCkBAIC01NTUsNyArNTU1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfbGluZV9idWZmZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZykKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhybF9saW5lX2J1ZmZlcik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocmxfbGluZV9idWZmZXIpOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2dldF9saW5lX2J1ZmZlciwKQEAgLTU3MCw4ICs1NzAsOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5X2NsZWFyX2hpc3RvcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZykKIHsKLQljbGVhcl9oaXN0b3J5KCk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgY2xlYXJfaGlzdG9yeSgpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2NsZWFyX2hpc3RvcnksCkBAIC01ODUsMTEgKzU4NSwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluc2VydF90ZXh0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbnNlcnRfdGV4dCIsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmxfaW5zZXJ0X3RleHQocyk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgY2hhciAqczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aW5zZXJ0X3RleHQiLCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJsX2luc2VydF90ZXh0KHMpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZG9jX2luc2VydF90ZXh0LApAQCAtNjAyLDggKzYwMiw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcmVkaXNwbGF5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmcpCiB7Ci0JcmxfcmVkaXNwbGF5KCk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgcmxfcmVkaXNwbGF5KCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkb2NfcmVkaXNwbGF5LApAQCAtNjE2LDUwICs2MTYsNTAgQEAKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiByZWFkbGluZV9tZXRob2RzW10gPQogewotCXsicGFyc2VfYW5kX2JpbmQiLCBwYXJzZV9hbmRfYmluZCwgTUVUSF9WQVJBUkdTLCBkb2NfcGFyc2VfYW5kX2JpbmR9LAotCXsiZ2V0X2xpbmVfYnVmZmVyIiwgZ2V0X2xpbmVfYnVmZmVyLCBNRVRIX05PQVJHUywgZG9jX2dldF9saW5lX2J1ZmZlcn0sCi0JeyJpbnNlcnRfdGV4dCIsIGluc2VydF90ZXh0LCBNRVRIX1ZBUkFSR1MsIGRvY19pbnNlcnRfdGV4dH0sCi0JeyJyZWRpc3BsYXkiLCByZWRpc3BsYXksIE1FVEhfTk9BUkdTLCBkb2NfcmVkaXNwbGF5fSwKLQl7InJlYWRfaW5pdF9maWxlIiwgcmVhZF9pbml0X2ZpbGUsIE1FVEhfVkFSQVJHUywgZG9jX3JlYWRfaW5pdF9maWxlfSwKLQl7InJlYWRfaGlzdG9yeV9maWxlIiwgcmVhZF9oaXN0b3J5X2ZpbGUsCi0JIE1FVEhfVkFSQVJHUywgZG9jX3JlYWRfaGlzdG9yeV9maWxlfSwKLQl7IndyaXRlX2hpc3RvcnlfZmlsZSIsIHdyaXRlX2hpc3RvcnlfZmlsZSwKLQkgTUVUSF9WQVJBUkdTLCBkb2Nfd3JpdGVfaGlzdG9yeV9maWxlfSwKLQl7ImdldF9oaXN0b3J5X2l0ZW0iLCBnZXRfaGlzdG9yeV9pdGVtLAotCSBNRVRIX1ZBUkFSR1MsIGRvY19nZXRfaGlzdG9yeV9pdGVtfSwKLQl7ImdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKWdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoLAotCSBNRVRIX05PQVJHUywgZG9jX2dldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RofSwKLQl7InNldF9oaXN0b3J5X2xlbmd0aCIsIHNldF9oaXN0b3J5X2xlbmd0aCwKLQkgTUVUSF9WQVJBUkdTLCBzZXRfaGlzdG9yeV9sZW5ndGhfZG9jfSwKLQl7ImdldF9oaXN0b3J5X2xlbmd0aCIsIGdldF9oaXN0b3J5X2xlbmd0aCwKLQkgTUVUSF9OT0FSR1MsIGdldF9oaXN0b3J5X2xlbmd0aF9kb2N9LAotCXsic2V0X2NvbXBsZXRlciIsIHNldF9jb21wbGV0ZXIsIE1FVEhfVkFSQVJHUywgZG9jX3NldF9jb21wbGV0ZXJ9LAotCXsiZ2V0X2NvbXBsZXRlciIsIGdldF9jb21wbGV0ZXIsIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2NvbXBsZXRlcn0sCi0JeyJnZXRfY29tcGxldGlvbl90eXBlIiwgZ2V0X2NvbXBsZXRpb25fdHlwZSwKLQkgTUVUSF9OT0FSR1MsIGRvY19nZXRfY29tcGxldGlvbl90eXBlfSwKLQl7ImdldF9iZWdpZHgiLCBnZXRfYmVnaWR4LCBNRVRIX05PQVJHUywgZG9jX2dldF9iZWdpZHh9LAotCXsiZ2V0X2VuZGlkeCIsIGdldF9lbmRpZHgsIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2VuZGlkeH0sCisgICAgeyJwYXJzZV9hbmRfYmluZCIsIHBhcnNlX2FuZF9iaW5kLCBNRVRIX1ZBUkFSR1MsIGRvY19wYXJzZV9hbmRfYmluZH0sCisgICAgeyJnZXRfbGluZV9idWZmZXIiLCBnZXRfbGluZV9idWZmZXIsIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2xpbmVfYnVmZmVyfSwKKyAgICB7Imluc2VydF90ZXh0IiwgaW5zZXJ0X3RleHQsIE1FVEhfVkFSQVJHUywgZG9jX2luc2VydF90ZXh0fSwKKyAgICB7InJlZGlzcGxheSIsIHJlZGlzcGxheSwgTUVUSF9OT0FSR1MsIGRvY19yZWRpc3BsYXl9LAorICAgIHsicmVhZF9pbml0X2ZpbGUiLCByZWFkX2luaXRfZmlsZSwgTUVUSF9WQVJBUkdTLCBkb2NfcmVhZF9pbml0X2ZpbGV9LAorICAgIHsicmVhZF9oaXN0b3J5X2ZpbGUiLCByZWFkX2hpc3RvcnlfZmlsZSwKKyAgICAgTUVUSF9WQVJBUkdTLCBkb2NfcmVhZF9oaXN0b3J5X2ZpbGV9LAorICAgIHsid3JpdGVfaGlzdG9yeV9maWxlIiwgd3JpdGVfaGlzdG9yeV9maWxlLAorICAgICBNRVRIX1ZBUkFSR1MsIGRvY193cml0ZV9oaXN0b3J5X2ZpbGV9LAorICAgIHsiZ2V0X2hpc3RvcnlfaXRlbSIsIGdldF9oaXN0b3J5X2l0ZW0sCisgICAgIE1FVEhfVkFSQVJHUywgZG9jX2dldF9oaXN0b3J5X2l0ZW19LAorICAgIHsiZ2V0X2N1cnJlbnRfaGlzdG9yeV9sZW5ndGgiLCAoUHlDRnVuY3Rpb24pZ2V0X2N1cnJlbnRfaGlzdG9yeV9sZW5ndGgsCisgICAgIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2N1cnJlbnRfaGlzdG9yeV9sZW5ndGh9LAorICAgIHsic2V0X2hpc3RvcnlfbGVuZ3RoIiwgc2V0X2hpc3RvcnlfbGVuZ3RoLAorICAgICBNRVRIX1ZBUkFSR1MsIHNldF9oaXN0b3J5X2xlbmd0aF9kb2N9LAorICAgIHsiZ2V0X2hpc3RvcnlfbGVuZ3RoIiwgZ2V0X2hpc3RvcnlfbGVuZ3RoLAorICAgICBNRVRIX05PQVJHUywgZ2V0X2hpc3RvcnlfbGVuZ3RoX2RvY30sCisgICAgeyJzZXRfY29tcGxldGVyIiwgc2V0X2NvbXBsZXRlciwgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X2NvbXBsZXRlcn0sCisgICAgeyJnZXRfY29tcGxldGVyIiwgZ2V0X2NvbXBsZXRlciwgTUVUSF9OT0FSR1MsIGRvY19nZXRfY29tcGxldGVyfSwKKyAgICB7ImdldF9jb21wbGV0aW9uX3R5cGUiLCBnZXRfY29tcGxldGlvbl90eXBlLAorICAgICBNRVRIX05PQVJHUywgZG9jX2dldF9jb21wbGV0aW9uX3R5cGV9LAorICAgIHsiZ2V0X2JlZ2lkeCIsIGdldF9iZWdpZHgsIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2JlZ2lkeH0sCisgICAgeyJnZXRfZW5kaWR4IiwgZ2V0X2VuZGlkeCwgTUVUSF9OT0FSR1MsIGRvY19nZXRfZW5kaWR4fSwKIAotCXsic2V0X2NvbXBsZXRlcl9kZWxpbXMiLCBzZXRfY29tcGxldGVyX2RlbGltcywKLQkgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X2NvbXBsZXRlcl9kZWxpbXN9LAotCXsiYWRkX2hpc3RvcnkiLCBweV9hZGRfaGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2NfYWRkX2hpc3Rvcnl9LAotCXsicmVtb3ZlX2hpc3RvcnlfaXRlbSIsIHB5X3JlbW92ZV9oaXN0b3J5LCBNRVRIX1ZBUkFSR1MsIGRvY19yZW1vdmVfaGlzdG9yeX0sCi0JeyJyZXBsYWNlX2hpc3RvcnlfaXRlbSIsIHB5X3JlcGxhY2VfaGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2NfcmVwbGFjZV9oaXN0b3J5fSwKLQl7ImdldF9jb21wbGV0ZXJfZGVsaW1zIiwgZ2V0X2NvbXBsZXRlcl9kZWxpbXMsCi0JIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2NvbXBsZXRlcl9kZWxpbXN9LAorICAgIHsic2V0X2NvbXBsZXRlcl9kZWxpbXMiLCBzZXRfY29tcGxldGVyX2RlbGltcywKKyAgICAgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X2NvbXBsZXRlcl9kZWxpbXN9LAorICAgIHsiYWRkX2hpc3RvcnkiLCBweV9hZGRfaGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2NfYWRkX2hpc3Rvcnl9LAorICAgIHsicmVtb3ZlX2hpc3RvcnlfaXRlbSIsIHB5X3JlbW92ZV9oaXN0b3J5LCBNRVRIX1ZBUkFSR1MsIGRvY19yZW1vdmVfaGlzdG9yeX0sCisgICAgeyJyZXBsYWNlX2hpc3RvcnlfaXRlbSIsIHB5X3JlcGxhY2VfaGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2NfcmVwbGFjZV9oaXN0b3J5fSwKKyAgICB7ImdldF9jb21wbGV0ZXJfZGVsaW1zIiwgZ2V0X2NvbXBsZXRlcl9kZWxpbXMsCisgICAgIE1FVEhfTk9BUkdTLCBkb2NfZ2V0X2NvbXBsZXRlcl9kZWxpbXN9LAogCi0JeyJzZXRfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayIsIHNldF9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rLAotCSBNRVRIX1ZBUkFSR1MsIGRvY19zZXRfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9va30sCi0JeyJzZXRfc3RhcnR1cF9ob29rIiwgc2V0X3N0YXJ0dXBfaG9vaywKLQkgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X3N0YXJ0dXBfaG9va30sCisgICAgeyJzZXRfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9vayIsIHNldF9jb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rLAorICAgICBNRVRIX1ZBUkFSR1MsIGRvY19zZXRfY29tcGxldGlvbl9kaXNwbGF5X21hdGNoZXNfaG9va30sCisgICAgeyJzZXRfc3RhcnR1cF9ob29rIiwgc2V0X3N0YXJ0dXBfaG9vaywKKyAgICAgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X3N0YXJ0dXBfaG9va30sCiAjaWZkZWYgSEFWRV9STF9QUkVfSU5QVVRfSE9PSwotCXsic2V0X3ByZV9pbnB1dF9ob29rIiwgc2V0X3ByZV9pbnB1dF9ob29rLAotCSBNRVRIX1ZBUkFSR1MsIGRvY19zZXRfcHJlX2lucHV0X2hvb2t9LAorICAgIHsic2V0X3ByZV9pbnB1dF9ob29rIiwgc2V0X3ByZV9pbnB1dF9ob29rLAorICAgICBNRVRIX1ZBUkFSR1MsIGRvY19zZXRfcHJlX2lucHV0X2hvb2t9LAogI2VuZGlmCiAjaWZkZWYgSEFWRV9STF9DT01QTEVUSU9OX0FQUEVORF9DSEFSQUNURVIKLQl7ImNsZWFyX2hpc3RvcnkiLCBweV9jbGVhcl9oaXN0b3J5LCBNRVRIX05PQVJHUywgZG9jX2NsZWFyX2hpc3Rvcnl9LAorICAgIHsiY2xlYXJfaGlzdG9yeSIsIHB5X2NsZWFyX2hpc3RvcnksIE1FVEhfTk9BUkdTLCBkb2NfY2xlYXJfaGlzdG9yeX0sCiAjZW5kaWYKLQl7MCwgMH0KKyAgICB7MCwgMH0KIH07CiAKIApAQCAtNjY4LDQ3ICs2NjgsNDcgQEAKIHN0YXRpYyBpbnQKIG9uX2hvb2soUHlPYmplY3QgKmZ1bmMpCiB7Ci0JaW50IHJlc3VsdCA9IDA7Ci0JaWYgKGZ1bmMgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcjsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpZiAoZnVuYyAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCVB5R0lMU3RhdGVfU1RBVEUgZ2lsc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworICAgICAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKICNlbmRpZgotCQlyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsIE5VTEwpOwotCQlpZiAociA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKHIgPT0gUHlfTm9uZSkKLQkJCXJlc3VsdCA9IDA7Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gUHlJbnRfQXNMb25nKHIpOwotCQkJaWYgKHJlc3VsdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSAKLQkJCQlnb3RvIGVycm9yOwotCQl9Ci0JCVB5X0RFQ1JFRihyKTsKLQkJZ290byBkb25lOwotCSAgZXJyb3I6Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X1hERUNSRUYocik7Ci0JICBkb25lOgorICAgICAgICByID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsIE5VTEwpOworICAgICAgICBpZiAociA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKHIgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlJbnRfQXNMb25nKHIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICBlcnJvcjoKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfWERFQ1JFRihyKTsKKyAgICAgIGRvbmU6CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKKyAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKICNlbmRpZgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBvbl9zdGFydHVwX2hvb2sodm9pZCkKIHsKLQlyZXR1cm4gb25faG9vayhzdGFydHVwX2hvb2spOworICAgIHJldHVybiBvbl9ob29rKHN0YXJ0dXBfaG9vayk7CiB9CiAKICNpZmRlZiBIQVZFX1JMX1BSRV9JTlBVVF9IT09LCiBzdGF0aWMgaW50CiBvbl9wcmVfaW5wdXRfaG9vayh2b2lkKQogewotCXJldHVybiBvbl9ob29rKHByZV9pbnB1dF9ob29rKTsKKyAgICByZXR1cm4gb25faG9vayhwcmVfaW5wdXRfaG9vayk7CiB9CiAjZW5kaWYKIApAQCAtNzE3LDQzICs3MTcsNDMgQEAKIAogc3RhdGljIHZvaWQKIG9uX2NvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2soY2hhciAqKm1hdGNoZXMsCi0JCQkJICAgaW50IG51bV9tYXRjaGVzLCBpbnQgbWF4X2xlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9tYXRjaGVzLCBpbnQgbWF4X2xlbmd0aCkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbT1OVUxMLCAqcz1OVUxMLCAqcj1OVUxMOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICptPU5VTEwsICpzPU5VTEwsICpyPU5VTEw7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbHN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKICNlbmRpZgotCW0gPSBQeUxpc3RfTmV3KG51bV9tYXRjaGVzKTsKLQlpZiAobSA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCWZvciAoaSA9IDA7IGkgPCBudW1fbWF0Y2hlczsgaSsrKSB7Ci0JCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG1hdGNoZXNbaSsxXSk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQlpZiAoUHlMaXN0X1NldEl0ZW0obSwgaSwgcykgPT0gLTEpCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICBtID0gUHlMaXN0X05ldyhudW1fbWF0Y2hlcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX21hdGNoZXM7IGkrKykgeworICAgICAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtYXRjaGVzW2krMV0pOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKFB5TGlzdF9TZXRJdGVtKG0sIGksIHMpID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNvbXBsZXRpb25fZGlzcGxheV9tYXRjaGVzX2hvb2ssCi0JCQkJICAic09pIiwgbWF0Y2hlc1swXSwgbSwgbWF4X2xlbmd0aCk7CisgICAgciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjb21wbGV0aW9uX2Rpc3BsYXlfbWF0Y2hlc19ob29rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNPaSIsIG1hdGNoZXNbMF0sIG0sIG1heF9sZW5ndGgpOwogCi0JUHlfREVDUkVGKG0pLCBtPU5VTEw7Ci0JCi0JaWYgKHIgPT0gTlVMTCB8fAotCSAgICAociAhPSBQeV9Ob25lICYmIFB5SW50X0FzTG9uZyhyKSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSkgewotCQlnb3RvIGVycm9yOwotCX0KLQlQeV9YREVDUkVGKHIpLCByPU5VTEw7CisgICAgUHlfREVDUkVGKG0pLCBtPU5VTEw7CiAKLQlpZiAoMCkgewotCWVycm9yOgotCQlQeUVycl9DbGVhcigpOwotCQlQeV9YREVDUkVGKG0pOwotCQlQeV9YREVDUkVGKHIpOwotCX0KKyAgICBpZiAociA9PSBOVUxMIHx8CisgICAgICAgIChyICE9IFB5X05vbmUgJiYgUHlJbnRfQXNMb25nKHIpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5X1hERUNSRUYociksIHI9TlVMTDsKKworICAgIGlmICgwKSB7CisgICAgZXJyb3I6CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X1hERUNSRUYobSk7CisgICAgICAgIFB5X1hERUNSRUYocik7CisgICAgfQogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsc3RhdGUpOwogI2VuZGlmCiB9CiAKQEAgLTc2MywzNyArNzYzLDM3IEBACiBzdGF0aWMgY2hhciAqCiBvbl9jb21wbGV0aW9uKGNvbnN0IGNoYXIgKnRleHQsIGludCBzdGF0ZSkKIHsKLQljaGFyICpyZXN1bHQgPSBOVUxMOwotCWlmIChjb21wbGV0ZXIgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcjsKLSNpZmRlZiBXSVRIX1RIUkVBRAkgICAgICAKLQkJUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgY2hhciAqcmVzdWx0ID0gTlVMTDsKKyAgICBpZiAoY29tcGxldGVyICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnI7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICAgICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAjZW5kaWYKLQkJcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fb3ZlciA9IDE7Ci0JCXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29tcGxldGVyLCAic2kiLCB0ZXh0LCBzdGF0ZSk7Ci0JCWlmIChyID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQlpZiAociA9PSBQeV9Ob25lKSB7Ci0JCQlyZXN1bHQgPSBOVUxMOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhciAqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHIpOwotCQkJaWYgKHMgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJcmVzdWx0ID0gc3RyZHVwKHMpOwotCQl9Ci0JCVB5X0RFQ1JFRihyKTsKLQkJZ290byBkb25lOwotCSAgZXJyb3I6Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X1hERUNSRUYocik7Ci0JICBkb25lOgotI2lmZGVmIFdJVEhfVEhSRUFECSAgICAgIAotCQlQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsc3RhdGUpOworICAgICAgICBybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9vdmVyID0gMTsKKyAgICAgICAgciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjb21wbGV0ZXIsICJzaSIsIHRleHQsIHN0YXRlKTsKKyAgICAgICAgaWYgKHIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGlmIChyID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQXNTdHJpbmcocik7CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICByZXN1bHQgPSBzdHJkdXAocyk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgICBlcnJvcjoKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfWERFQ1JFRihyKTsKKyAgICAgIGRvbmU6CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICAgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbHN0YXRlKTsKICNlbmRpZgotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTgwNCwxNiArODA0LDE2IEBACiBmbGV4X2NvbXBsZXRlKGNoYXIgKnRleHQsIGludCBzdGFydCwgaW50IGVuZCkKIHsKICNpZmRlZiBIQVZFX1JMX0NPTVBMRVRJT05fQVBQRU5EX0NIQVJBQ1RFUgotCXJsX2NvbXBsZXRpb25fYXBwZW5kX2NoYXJhY3RlciA9J1wwJzsKKyAgICBybF9jb21wbGV0aW9uX2FwcGVuZF9jaGFyYWN0ZXIgPSdcMCc7CiAjZW5kaWYKICNpZmRlZiBIQVZFX1JMX0NPTVBMRVRJT05fU1VQUFJFU1NfQVBQRU5ECi0JcmxfY29tcGxldGlvbl9zdXBwcmVzc19hcHBlbmQgPSAwOworICAgIHJsX2NvbXBsZXRpb25fc3VwcHJlc3NfYXBwZW5kID0gMDsKICNlbmRpZgotCVB5X1hERUNSRUYoYmVnaWR4KTsKLQlQeV9YREVDUkVGKGVuZGlkeCk7Ci0JYmVnaWR4ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHN0YXJ0KTsKLQllbmRpZHggPSBQeUludF9Gcm9tTG9uZygobG9uZykgZW5kKTsKLQlyZXR1cm4gY29tcGxldGlvbl9tYXRjaGVzKHRleHQsICpvbl9jb21wbGV0aW9uKTsKKyAgICBQeV9YREVDUkVGKGJlZ2lkeCk7CisgICAgUHlfWERFQ1JFRihlbmRpZHgpOworICAgIGJlZ2lkeCA9IFB5SW50X0Zyb21Mb25nKChsb25nKSBzdGFydCk7CisgICAgZW5kaWR4ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGVuZCk7CisgICAgcmV0dXJuIGNvbXBsZXRpb25fbWF0Y2hlcyh0ZXh0LCAqb25fY29tcGxldGlvbik7CiB9CiAKIApAQCAtODIzLDQ1ICs4MjMsNDUgQEAKIHNldHVwX3JlYWRsaW5lKHZvaWQpCiB7CiAjaWZkZWYgU0FWRV9MT0NBTEUKLQljaGFyICpzYXZlZF9sb2NhbGUgPSBzdHJkdXAoc2V0bG9jYWxlKExDX0NUWVBFLCBOVUxMKSk7Ci0JaWYgKCFzYXZlZF9sb2NhbGUpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vdCBlbm91Z2ggbWVtb3J5IHRvIHNhdmUgbG9jYWxlIik7CisgICAgY2hhciAqc2F2ZWRfbG9jYWxlID0gc3RyZHVwKHNldGxvY2FsZShMQ19DVFlQRSwgTlVMTCkpOworICAgIGlmICghc2F2ZWRfbG9jYWxlKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJub3QgZW5vdWdoIG1lbW9yeSB0byBzYXZlIGxvY2FsZSIpOwogI2VuZGlmCiAKLQl1c2luZ19oaXN0b3J5KCk7CisgICAgdXNpbmdfaGlzdG9yeSgpOwogCi0JcmxfcmVhZGxpbmVfbmFtZSA9ICJweXRob24iOworICAgIHJsX3JlYWRsaW5lX25hbWUgPSAicHl0aG9uIjsKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQotCS8qIEFsbG93ICRpZiB0ZXJtPSBpbiAuaW5wdXRyYyB0byB3b3JrICovCi0JcmxfdGVybWluYWxfbmFtZSA9IGdldGVudigiVEVSTSIpOworICAgIC8qIEFsbG93ICRpZiB0ZXJtPSBpbiAuaW5wdXRyYyB0byB3b3JrICovCisgICAgcmxfdGVybWluYWxfbmFtZSA9IGdldGVudigiVEVSTSIpOwogI2VuZGlmCi0JLyogRm9yY2UgcmViaW5kIG9mIFRBQiB0byBpbnNlcnQtdGFiICovCi0JcmxfYmluZF9rZXkoJ1x0JywgcmxfaW5zZXJ0KTsKLQkvKiBCaW5kIGJvdGggRVNDLVRBQiBhbmQgRVNDLUVTQyB0byB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiAqLwotCXJsX2JpbmRfa2V5X2luX21hcCAoJ1x0JywgcmxfY29tcGxldGUsIGVtYWNzX21ldGFfa2V5bWFwKTsKLQlybF9iaW5kX2tleV9pbl9tYXAgKCdcMDMzJywgcmxfY29tcGxldGUsIGVtYWNzX21ldGFfa2V5bWFwKTsKLQkvKiBTZXQgb3VyIGhvb2sgZnVuY3Rpb25zICovCi0Jcmxfc3RhcnR1cF9ob29rID0gKEZ1bmN0aW9uICopb25fc3RhcnR1cF9ob29rOworICAgIC8qIEZvcmNlIHJlYmluZCBvZiBUQUIgdG8gaW5zZXJ0LXRhYiAqLworICAgIHJsX2JpbmRfa2V5KCdcdCcsIHJsX2luc2VydCk7CisgICAgLyogQmluZCBib3RoIEVTQy1UQUIgYW5kIEVTQy1FU0MgdG8gdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKyAgICBybF9iaW5kX2tleV9pbl9tYXAgKCdcdCcsIHJsX2NvbXBsZXRlLCBlbWFjc19tZXRhX2tleW1hcCk7CisgICAgcmxfYmluZF9rZXlfaW5fbWFwICgnXDAzMycsIHJsX2NvbXBsZXRlLCBlbWFjc19tZXRhX2tleW1hcCk7CisgICAgLyogU2V0IG91ciBob29rIGZ1bmN0aW9ucyAqLworICAgIHJsX3N0YXJ0dXBfaG9vayA9IChGdW5jdGlvbiAqKW9uX3N0YXJ0dXBfaG9vazsKICNpZmRlZiBIQVZFX1JMX1BSRV9JTlBVVF9IT09LCi0JcmxfcHJlX2lucHV0X2hvb2sgPSAoRnVuY3Rpb24gKilvbl9wcmVfaW5wdXRfaG9vazsKKyAgICBybF9wcmVfaW5wdXRfaG9vayA9IChGdW5jdGlvbiAqKW9uX3ByZV9pbnB1dF9ob29rOwogI2VuZGlmCi0JLyogU2V0IG91ciBjb21wbGV0aW9uIGZ1bmN0aW9uICovCi0JcmxfYXR0ZW1wdGVkX2NvbXBsZXRpb25fZnVuY3Rpb24gPSAoQ1BQRnVuY3Rpb24gKilmbGV4X2NvbXBsZXRlOwotCS8qIFNldCBQeXRob24gd29yZCBicmVhayBjaGFyYWN0ZXJzICovCi0JcmxfY29tcGxldGVyX3dvcmRfYnJlYWtfY2hhcmFjdGVycyA9Ci0JCXN0cmR1cCgiIFx0XG5gfiFAIyQlXiYqKCktPStbe119XFx8OzonXCIsPD4vPyIpOwotCQkvKiBBbGwgbm9uYWxwaGFudW1zIGV4Y2VwdCAnLicgKi8KKyAgICAvKiBTZXQgb3VyIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKyAgICBybF9hdHRlbXB0ZWRfY29tcGxldGlvbl9mdW5jdGlvbiA9IChDUFBGdW5jdGlvbiAqKWZsZXhfY29tcGxldGU7CisgICAgLyogU2V0IFB5dGhvbiB3b3JkIGJyZWFrIGNoYXJhY3RlcnMgKi8KKyAgICBybF9jb21wbGV0ZXJfd29yZF9icmVha19jaGFyYWN0ZXJzID0KKyAgICAgICAgc3RyZHVwKCIgXHRcbmB+IUAjJCVeJiooKS09K1t7XX1cXHw7OidcIiw8Pi8/Iik7CisgICAgICAgIC8qIEFsbCBub25hbHBoYW51bXMgZXhjZXB0ICcuJyAqLwogCi0JYmVnaWR4ID0gUHlJbnRfRnJvbUxvbmcoMEwpOwotCWVuZGlkeCA9IFB5SW50X0Zyb21Mb25nKDBMKTsKLQkvKiBJbml0aWFsaXplIChhbGxvd3MgLmlucHV0cmMgdG8gb3ZlcnJpZGUpCi0JICoKLQkgKiBYWFg6IEEgYnVnIGluIHRoZSByZWFkbGluZS0yLjIgbGlicmFyeSBjYXVzZXMgYSBtZW1vcnkgbGVhawotCSAqIGluc2lkZSB0aGlzIGZ1bmN0aW9uLiAgTm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgaXQuCi0JICovCi0JcmxfaW5pdGlhbGl6ZSgpOworICAgIGJlZ2lkeCA9IFB5SW50X0Zyb21Mb25nKDBMKTsKKyAgICBlbmRpZHggPSBQeUludF9Gcm9tTG9uZygwTCk7CisgICAgLyogSW5pdGlhbGl6ZSAoYWxsb3dzIC5pbnB1dHJjIHRvIG92ZXJyaWRlKQorICAgICAqCisgICAgICogWFhYOiBBIGJ1ZyBpbiB0aGUgcmVhZGxpbmUtMi4yIGxpYnJhcnkgY2F1c2VzIGEgbWVtb3J5IGxlYWsKKyAgICAgKiBpbnNpZGUgdGhpcyBmdW5jdGlvbi4gIE5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0LgorICAgICAqLworICAgIHJsX2luaXRpYWxpemUoKTsKIAotCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKKyAgICBSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCiB9CiAKIC8qIFdyYXBwZXIgYXJvdW5kIEdOVSByZWFkbGluZSB0aGF0IGhhbmRsZXMgc2lnbmFscyBkaWZmZXJlbnRseS4gKi8KQEAgLTg2OSwxMiArODY5LDEyIEBACiAKICNpZiBkZWZpbmVkKEhBVkVfUkxfQ0FMTEJBQ0spICYmIGRlZmluZWQoSEFWRV9TRUxFQ1QpCiAKLXN0YXRpYwljaGFyICpjb21wbGV0ZWRfaW5wdXRfc3RyaW5nOworc3RhdGljICBjaGFyICpjb21wbGV0ZWRfaW5wdXRfc3RyaW5nOwogc3RhdGljIHZvaWQKIHJsaGFuZGxlcihjaGFyICp0ZXh0KQogewotCWNvbXBsZXRlZF9pbnB1dF9zdHJpbmcgPSB0ZXh0OwotCXJsX2NhbGxiYWNrX2hhbmRsZXJfcmVtb3ZlKCk7CisgICAgY29tcGxldGVkX2lucHV0X3N0cmluZyA9IHRleHQ7CisgICAgcmxfY2FsbGJhY2tfaGFuZGxlcl9yZW1vdmUoKTsKIH0KIAogZXh0ZXJuIFB5VGhyZWFkU3RhdGUqIF9QeU9TX1JlYWRsaW5lVFN0YXRlOwpAQCAtODgyLDYwICs4ODIsNjAgQEAKIHN0YXRpYyBjaGFyICoKIHJlYWRsaW5lX3VudGlsX2VudGVyX29yX3NpZ25hbChjaGFyICpwcm9tcHQsIGludCAqc2lnbmFsKQogewotCWNoYXIgKiBub3RfZG9uZV9yZWFkaW5nID0gIiI7Ci0JZmRfc2V0IHNlbGVjdHNldDsKKyAgICBjaGFyICogbm90X2RvbmVfcmVhZGluZyA9ICIiOworICAgIGZkX3NldCBzZWxlY3RzZXQ7CiAKLQkqc2lnbmFsID0gMDsKKyAgICAqc2lnbmFsID0gMDsKICNpZmRlZiBIQVZFX1JMX0NBVENIX1NJR05BTAotCXJsX2NhdGNoX3NpZ25hbHMgPSAwOworICAgIHJsX2NhdGNoX3NpZ25hbHMgPSAwOwogI2VuZGlmCiAKLQlybF9jYWxsYmFja19oYW5kbGVyX2luc3RhbGwgKHByb21wdCwgcmxoYW5kbGVyKTsKLQlGRF9aRVJPKCZzZWxlY3RzZXQpOwotCQotCWNvbXBsZXRlZF9pbnB1dF9zdHJpbmcgPSBub3RfZG9uZV9yZWFkaW5nOworICAgIHJsX2NhbGxiYWNrX2hhbmRsZXJfaW5zdGFsbCAocHJvbXB0LCBybGhhbmRsZXIpOworICAgIEZEX1pFUk8oJnNlbGVjdHNldCk7CiAKLQl3aGlsZSAoY29tcGxldGVkX2lucHV0X3N0cmluZyA9PSBub3RfZG9uZV9yZWFkaW5nKSB7Ci0JCWludCBoYXNfaW5wdXQgPSAwOworICAgIGNvbXBsZXRlZF9pbnB1dF9zdHJpbmcgPSBub3RfZG9uZV9yZWFkaW5nOwogCi0JCXdoaWxlICghaGFzX2lucHV0KQotCQl7CXN0cnVjdCB0aW1ldmFsIHRpbWVvdXQgPSB7MCwgMTAwMDAwfTsgLyogMC4xIHNlY29uZHMgKi8KKyAgICB3aGlsZSAoY29tcGxldGVkX2lucHV0X3N0cmluZyA9PSBub3RfZG9uZV9yZWFkaW5nKSB7CisgICAgICAgIGludCBoYXNfaW5wdXQgPSAwOwogCi0JCQkvKiBbQnVnICMxNTUyNzI2XSBPbmx5IGxpbWl0IHRoZSBwYXVzZSBpZiBhbiBpbnB1dCBob29rIGhhcyBiZWVuIAotCQkJICAgZGVmaW5lZC4gICovCi0JCSAJc3RydWN0IHRpbWV2YWwgKnRpbWVvdXRwID0gTlVMTDsKLQkJCWlmIChQeU9TX0lucHV0SG9vaykgCi0JCQkJdGltZW91dHAgPSAmdGltZW91dDsKLQkJCUZEX1NFVChmaWxlbm8ocmxfaW5zdHJlYW0pLCAmc2VsZWN0c2V0KTsKLQkJCS8qIHNlbGVjdCByZXNldHMgc2VsZWN0c2V0IGlmIG5vIGlucHV0IHdhcyBhdmFpbGFibGUgKi8KLQkJCWhhc19pbnB1dCA9IHNlbGVjdChmaWxlbm8ocmxfaW5zdHJlYW0pICsgMSwgJnNlbGVjdHNldCwKLQkJCQkJICAgTlVMTCwgTlVMTCwgdGltZW91dHApOwotCQkJaWYoUHlPU19JbnB1dEhvb2spIFB5T1NfSW5wdXRIb29rKCk7Ci0JCX0KKyAgICAgICAgd2hpbGUgKCFoYXNfaW5wdXQpCisgICAgICAgIHsgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lb3V0ID0gezAsIDEwMDAwMH07IC8qIDAuMSBzZWNvbmRzICovCiAKLQkJaWYoaGFzX2lucHV0ID4gMCkgewotCQkJcmxfY2FsbGJhY2tfcmVhZF9jaGFyKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZXJybm8gPT0gRUlOVFIpIHsKLQkJCWludCBzOworICAgICAgICAgICAgLyogW0J1ZyAjMTU1MjcyNl0gT25seSBsaW1pdCB0aGUgcGF1c2UgaWYgYW4gaW5wdXQgaG9vayBoYXMgYmVlbgorICAgICAgICAgICAgICAgZGVmaW5lZC4gICovCisgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqdGltZW91dHAgPSBOVUxMOworICAgICAgICAgICAgaWYgKFB5T1NfSW5wdXRIb29rKQorICAgICAgICAgICAgICAgIHRpbWVvdXRwID0gJnRpbWVvdXQ7CisgICAgICAgICAgICBGRF9TRVQoZmlsZW5vKHJsX2luc3RyZWFtKSwgJnNlbGVjdHNldCk7CisgICAgICAgICAgICAvKiBzZWxlY3QgcmVzZXRzIHNlbGVjdHNldCBpZiBubyBpbnB1dCB3YXMgYXZhaWxhYmxlICovCisgICAgICAgICAgICBoYXNfaW5wdXQgPSBzZWxlY3QoZmlsZW5vKHJsX2luc3RyZWFtKSArIDEsICZzZWxlY3RzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgdGltZW91dHApOworICAgICAgICAgICAgaWYoUHlPU19JbnB1dEhvb2spIFB5T1NfSW5wdXRIb29rKCk7CisgICAgICAgIH0KKworICAgICAgICBpZihoYXNfaW5wdXQgPiAwKSB7CisgICAgICAgICAgICBybF9jYWxsYmFja19yZWFkX2NoYXIoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlcnJubyA9PSBFSU5UUikgeworICAgICAgICAgICAgaW50IHM7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJCVB5RXZhbF9SZXN0b3JlVGhyZWFkKF9QeU9TX1JlYWRsaW5lVFN0YXRlKTsKKyAgICAgICAgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKF9QeU9TX1JlYWRsaW5lVFN0YXRlKTsKICNlbmRpZgotCQkJcyA9IFB5RXJyX0NoZWNrU2lnbmFscygpOworICAgICAgICAgICAgcyA9IFB5RXJyX0NoZWNrU2lnbmFscygpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCQlQeUV2YWxfU2F2ZVRocmVhZCgpOwkKKyAgICAgICAgICAgIFB5RXZhbF9TYXZlVGhyZWFkKCk7CiAjZW5kaWYKLQkJCWlmIChzIDwgMCkgewotCQkJCXJsX2ZyZWVfbGluZV9zdGF0ZSgpOwotCQkJCXJsX2NsZWFudXBfYWZ0ZXJfc2lnbmFsKCk7Ci0JCQkJcmxfY2FsbGJhY2tfaGFuZGxlcl9yZW1vdmUoKTsKLQkJCQkqc2lnbmFsID0gMTsKLQkJCQljb21wbGV0ZWRfaW5wdXRfc3RyaW5nID0gTlVMTDsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgICAgIGlmIChzIDwgMCkgeworICAgICAgICAgICAgICAgIHJsX2ZyZWVfbGluZV9zdGF0ZSgpOworICAgICAgICAgICAgICAgIHJsX2NsZWFudXBfYWZ0ZXJfc2lnbmFsKCk7CisgICAgICAgICAgICAgICAgcmxfY2FsbGJhY2tfaGFuZGxlcl9yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAqc2lnbmFsID0gMTsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZWRfaW5wdXRfc3RyaW5nID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBjb21wbGV0ZWRfaW5wdXRfc3RyaW5nOworICAgIHJldHVybiBjb21wbGV0ZWRfaW5wdXRfc3RyaW5nOwogfQogCiAKQEAgLTk0OSwzMSArOTQ5LDMxIEBACiBzdGF0aWMgdm9pZAogb25pbnRyKGludCBzaWcpCiB7Ci0JbG9uZ2ptcChqYnVmLCAxKTsKKyAgICBsb25nam1wKGpidWYsIDEpOwogfQogCiAKIHN0YXRpYyBjaGFyICoKIHJlYWRsaW5lX3VudGlsX2VudGVyX29yX3NpZ25hbChjaGFyICpwcm9tcHQsIGludCAqc2lnbmFsKQogewotCVB5T1Nfc2lnaGFuZGxlcl90IG9sZF9pbnRoYW5kbGVyOwotCWNoYXIgKnA7Ci0gICAgCi0JKnNpZ25hbCA9IDA7CisgICAgUHlPU19zaWdoYW5kbGVyX3Qgb2xkX2ludGhhbmRsZXI7CisgICAgY2hhciAqcDsKIAotCW9sZF9pbnRoYW5kbGVyID0gUHlPU19zZXRzaWcoU0lHSU5ULCBvbmludHIpOwotCWlmIChzZXRqbXAoamJ1ZikpIHsKKyAgICAqc2lnbmFsID0gMDsKKworICAgIG9sZF9pbnRoYW5kbGVyID0gUHlPU19zZXRzaWcoU0lHSU5ULCBvbmludHIpOworICAgIGlmIChzZXRqbXAoamJ1ZikpIHsKICNpZmRlZiBIQVZFX1NJR1JFTFNFCi0JCS8qIFRoaXMgc2VlbXMgbmVjZXNzYXJ5IG9uIFN1bk9TIDQuMSAoUmFzbXVzIEhhaG4pICovCi0JCXNpZ3JlbHNlKFNJR0lOVCk7CisgICAgICAgIC8qIFRoaXMgc2VlbXMgbmVjZXNzYXJ5IG9uIFN1bk9TIDQuMSAoUmFzbXVzIEhhaG4pICovCisgICAgICAgIHNpZ3JlbHNlKFNJR0lOVCk7CiAjZW5kaWYKLQkJUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfaW50aGFuZGxlcik7Ci0JCSpzaWduYWwgPSAxOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmxfZXZlbnRfaG9vayA9IFB5T1NfSW5wdXRIb29rOwotCXAgPSByZWFkbGluZShwcm9tcHQpOwotCVB5T1Nfc2V0c2lnKFNJR0lOVCwgb2xkX2ludGhhbmRsZXIpOworICAgICAgICBQeU9TX3NldHNpZyhTSUdJTlQsIG9sZF9pbnRoYW5kbGVyKTsKKyAgICAgICAgKnNpZ25hbCA9IDE7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBybF9ldmVudF9ob29rID0gUHlPU19JbnB1dEhvb2s7CisgICAgcCA9IHJlYWRsaW5lKHByb21wdCk7CisgICAgUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfaW50aGFuZGxlcik7CiAKICAgICByZXR1cm4gcDsKIH0KQEAgLTk4Myw4MiArOTgzLDgyIEBACiBzdGF0aWMgY2hhciAqCiBjYWxsX3JlYWRsaW5lKEZJTEUgKnN5c19zdGRpbiwgRklMRSAqc3lzX3N0ZG91dCwgY2hhciAqcHJvbXB0KQogewotCXNpemVfdCBuOwotCWNoYXIgKnAsICpxOwotCWludCBzaWduYWw7CisgICAgc2l6ZV90IG47CisgICAgY2hhciAqcCwgKnE7CisgICAgaW50IHNpZ25hbDsKIAogI2lmZGVmIFNBVkVfTE9DQUxFCi0JY2hhciAqc2F2ZWRfbG9jYWxlID0gc3RyZHVwKHNldGxvY2FsZShMQ19DVFlQRSwgTlVMTCkpOwotCWlmICghc2F2ZWRfbG9jYWxlKQotCQlQeV9GYXRhbEVycm9yKCJub3QgZW5vdWdoIG1lbW9yeSB0byBzYXZlIGxvY2FsZSIpOwotCXNldGxvY2FsZShMQ19DVFlQRSwgIiIpOworICAgIGNoYXIgKnNhdmVkX2xvY2FsZSA9IHN0cmR1cChzZXRsb2NhbGUoTENfQ1RZUEUsIE5VTEwpKTsKKyAgICBpZiAoIXNhdmVkX2xvY2FsZSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm90IGVub3VnaCBtZW1vcnkgdG8gc2F2ZSBsb2NhbGUiKTsKKyAgICBzZXRsb2NhbGUoTENfQ1RZUEUsICIiKTsKICNlbmRpZgogCi0JaWYgKHN5c19zdGRpbiAhPSBybF9pbnN0cmVhbSB8fCBzeXNfc3Rkb3V0ICE9IHJsX291dHN0cmVhbSkgewotCQlybF9pbnN0cmVhbSA9IHN5c19zdGRpbjsKLQkJcmxfb3V0c3RyZWFtID0gc3lzX3N0ZG91dDsKKyAgICBpZiAoc3lzX3N0ZGluICE9IHJsX2luc3RyZWFtIHx8IHN5c19zdGRvdXQgIT0gcmxfb3V0c3RyZWFtKSB7CisgICAgICAgIHJsX2luc3RyZWFtID0gc3lzX3N0ZGluOworICAgICAgICBybF9vdXRzdHJlYW0gPSBzeXNfc3Rkb3V0OwogI2lmZGVmIEhBVkVfUkxfQ09NUExFVElPTl9BUFBFTkRfQ0hBUkFDVEVSCi0JCXJsX3ByZXBfdGVybWluYWwgKDEpOworICAgICAgICBybF9wcmVwX3Rlcm1pbmFsICgxKTsKICNlbmRpZgotCX0KKyAgICB9CiAKLQlwID0gcmVhZGxpbmVfdW50aWxfZW50ZXJfb3Jfc2lnbmFsKHByb21wdCwgJnNpZ25hbCk7Ci0JCi0JLyogd2UgZ290IGFuIGludGVycnVwdCBzaWduYWwgKi8KLQlpZiAoc2lnbmFsKSB7Ci0JCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHAgPSByZWFkbGluZV91bnRpbF9lbnRlcl9vcl9zaWduYWwocHJvbXB0LCAmc2lnbmFsKTsKIAotCS8qIFdlIGdvdCBhbiBFT0YsIHJldHVybiBhIGVtcHR5IHN0cmluZy4gKi8KLQlpZiAocCA9PSBOVUxMKSB7Ci0JCXAgPSBQeU1lbV9NYWxsb2MoMSk7Ci0JCWlmIChwICE9IE5VTEwpCi0JCQkqcCA9ICdcMCc7Ci0JCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKLQkJcmV0dXJuIHA7Ci0JfQorICAgIC8qIHdlIGdvdCBhbiBpbnRlcnJ1cHQgc2lnbmFsICovCisgICAgaWYgKHNpZ25hbCkgeworICAgICAgICBSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIHdlIGhhdmUgYSB2YWxpZCBsaW5lICovCi0JbiA9IHN0cmxlbihwKTsKLQlpZiAobiA+IDApIHsKLQkJY2hhciAqbGluZTsKLQkJSElTVE9SWV9TVEFURSAqc3RhdGUgPSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlKCk7Ci0JCWlmIChzdGF0ZS0+bGVuZ3RoID4gMCkKKyAgICAvKiBXZSBnb3QgYW4gRU9GLCByZXR1cm4gYSBlbXB0eSBzdHJpbmcuICovCisgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICBwID0gUHlNZW1fTWFsbG9jKDEpOworICAgICAgICBpZiAocCAhPSBOVUxMKQorICAgICAgICAgICAgKnAgPSAnXDAnOworICAgICAgICBSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIC8qIHdlIGhhdmUgYSB2YWxpZCBsaW5lICovCisgICAgbiA9IHN0cmxlbihwKTsKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgY2hhciAqbGluZTsKKyAgICAgICAgSElTVE9SWV9TVEFURSAqc3RhdGUgPSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlKCk7CisgICAgICAgIGlmIChzdGF0ZS0+bGVuZ3RoID4gMCkKICNpZmRlZiBfX0FQUExFX18KLQkJCWlmICh1c2luZ19saWJlZGl0X2VtdWxhdGlvbikgewotCQkJCS8qIAotCQkJCSAqIExpYmVkaXQncyBlbXVsYXRpb24gdXNlcyAwLWJhc2VkIGluZGV4ZXMsCi0JCQkJICogdGhlIHJlYWwgcmVhZGxpbmUgdXNlcyAxLWJhc2VkIGluZGV4ZXMuCi0JCQkJICovCi0JCQkJbGluZSA9IGhpc3RvcnlfZ2V0KHN0YXRlLT5sZW5ndGggLSAxKS0+bGluZTsKLQkJCX0gZWxzZSAKKyAgICAgICAgICAgIGlmICh1c2luZ19saWJlZGl0X2VtdWxhdGlvbikgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogTGliZWRpdCdzIGVtdWxhdGlvbiB1c2VzIDAtYmFzZWQgaW5kZXhlcywKKyAgICAgICAgICAgICAgICAgKiB0aGUgcmVhbCByZWFkbGluZSB1c2VzIDEtYmFzZWQgaW5kZXhlcy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBsaW5lID0gaGlzdG9yeV9nZXQoc3RhdGUtPmxlbmd0aCAtIDEpLT5saW5lOworICAgICAgICAgICAgfSBlbHNlCiAjZW5kaWYgLyogX19BUFBMRV9fICovCi0JCQlsaW5lID0gaGlzdG9yeV9nZXQoc3RhdGUtPmxlbmd0aCktPmxpbmU7Ci0JCWVsc2UKLQkJCWxpbmUgPSAiIjsKLQkJaWYgKHN0cmNtcChwLCBsaW5lKSkKLQkJCWFkZF9oaXN0b3J5KHApOwotCQkvKiB0aGUgaGlzdG9yeSBkb2NzIGRvbid0IHNheSBzbywgYnV0IHRoZSBhZGRyZXNzIG9mIHN0YXRlCi0JCSAgIGNoYW5nZXMgZWFjaCB0aW1lIGhpc3RvcnlfZ2V0X2hpc3Rvcnlfc3RhdGUgaXMgY2FsbGVkCi0JCSAgIHdoaWNoIG1ha2VzIG1lIHRoaW5rIGl0J3MgZnJlc2hseSBtYWxsb2MnZCBtZW1vcnkuLi4KLQkJICAgb24gdGhlIG90aGVyIGhhbmQsIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGxpbmUgc3RheXMgdGhlCi0JCSAgIHNhbWUgYXMgbG9uZyBhcyBoaXN0b3J5IGlzbid0IGV4dGVuZGVkLCBzbyBpdCBhcHBlYXJzIHRvCi0JCSAgIGJlIG1hbGxvYydkIGJ1dCBtYW5hZ2VkIGJ5IHRoZSBoaXN0b3J5IHBhY2thZ2UuLi4gKi8KLQkJZnJlZShzdGF0ZSk7Ci0JfQotCS8qIENvcHkgdGhlIG1hbGxvYydlZCBidWZmZXIgaW50byBhIFB5TWVtX01hbGxvYydlZCBvbmUgYW5kCi0JICAgcmVsZWFzZSB0aGUgb3JpZ2luYWwuICovCi0JcSA9IHA7Ci0JcCA9IFB5TWVtX01hbGxvYyhuKzIpOwotCWlmIChwICE9IE5VTEwpIHsKLQkJc3RybmNweShwLCBxLCBuKTsKLQkJcFtuXSA9ICdcbic7Ci0JCXBbbisxXSA9ICdcMCc7Ci0JfQotCWZyZWUocSk7Ci0JUkVTVE9SRV9MT0NBTEUoc2F2ZWRfbG9jYWxlKQotCXJldHVybiBwOworICAgICAgICAgICAgbGluZSA9IGhpc3RvcnlfZ2V0KHN0YXRlLT5sZW5ndGgpLT5saW5lOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgIGlmIChzdHJjbXAocCwgbGluZSkpCisgICAgICAgICAgICBhZGRfaGlzdG9yeShwKTsKKyAgICAgICAgLyogdGhlIGhpc3RvcnkgZG9jcyBkb24ndCBzYXkgc28sIGJ1dCB0aGUgYWRkcmVzcyBvZiBzdGF0ZQorICAgICAgICAgICBjaGFuZ2VzIGVhY2ggdGltZSBoaXN0b3J5X2dldF9oaXN0b3J5X3N0YXRlIGlzIGNhbGxlZAorICAgICAgICAgICB3aGljaCBtYWtlcyBtZSB0aGluayBpdCdzIGZyZXNobHkgbWFsbG9jJ2QgbWVtb3J5Li4uCisgICAgICAgICAgIG9uIHRoZSBvdGhlciBoYW5kLCB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBsaW5lIHN0YXlzIHRoZQorICAgICAgICAgICBzYW1lIGFzIGxvbmcgYXMgaGlzdG9yeSBpc24ndCBleHRlbmRlZCwgc28gaXQgYXBwZWFycyB0bworICAgICAgICAgICBiZSBtYWxsb2MnZCBidXQgbWFuYWdlZCBieSB0aGUgaGlzdG9yeSBwYWNrYWdlLi4uICovCisgICAgICAgIGZyZWUoc3RhdGUpOworICAgIH0KKyAgICAvKiBDb3B5IHRoZSBtYWxsb2MnZWQgYnVmZmVyIGludG8gYSBQeU1lbV9NYWxsb2MnZWQgb25lIGFuZAorICAgICAgIHJlbGVhc2UgdGhlIG9yaWdpbmFsLiAqLworICAgIHEgPSBwOworICAgIHAgPSBQeU1lbV9NYWxsb2MobisyKTsKKyAgICBpZiAocCAhPSBOVUxMKSB7CisgICAgICAgIHN0cm5jcHkocCwgcSwgbik7CisgICAgICAgIHBbbl0gPSAnXG4nOworICAgICAgICBwW24rMV0gPSAnXDAnOworICAgIH0KKyAgICBmcmVlKHEpOworICAgIFJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKKyAgICByZXR1cm4gcDsKIH0KIAogCkBAIC0xMDc1LDI3ICsxMDc1LDI3IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdHJlYWRsaW5lKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKICNpZmRlZiBfX0FQUExFX18KLQlpZiAoc3RybmNtcChybF9saWJyYXJ5X3ZlcnNpb24sIGxpYmVkaXRfdmVyc2lvbl90YWcsIHN0cmxlbihsaWJlZGl0X3ZlcnNpb25fdGFnKSkgPT0gMCkgewotCQl1c2luZ19saWJlZGl0X2VtdWxhdGlvbiA9IDE7Ci0JfQorICAgIGlmIChzdHJuY21wKHJsX2xpYnJhcnlfdmVyc2lvbiwgbGliZWRpdF92ZXJzaW9uX3RhZywgc3RybGVuKGxpYmVkaXRfdmVyc2lvbl90YWcpKSA9PSAwKSB7CisgICAgICAgIHVzaW5nX2xpYmVkaXRfZW11bGF0aW9uID0gMTsKKyAgICB9CiAKLQlpZiAodXNpbmdfbGliZWRpdF9lbXVsYXRpb24pIAotCQltID0gUHlfSW5pdE1vZHVsZTQoInJlYWRsaW5lIiwgcmVhZGxpbmVfbWV0aG9kcywgZG9jX21vZHVsZV9sZSwKLQkJCSAgIChQeU9iamVjdCAqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JZWxzZQorICAgIGlmICh1c2luZ19saWJlZGl0X2VtdWxhdGlvbikKKyAgICAgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJyZWFkbGluZSIsIHJlYWRsaW5lX21ldGhvZHMsIGRvY19tb2R1bGVfbGUsCisgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBlbHNlCiAKICNlbmRpZiAvKiBfX0FQUExFX18gKi8KIAotCW0gPSBQeV9Jbml0TW9kdWxlNCgicmVhZGxpbmUiLCByZWFkbGluZV9tZXRob2RzLCBkb2NfbW9kdWxlLAotCQkJICAgKFB5T2JqZWN0ICopTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJyZWFkbGluZSIsIHJlYWRsaW5lX21ldGhvZHMsIGRvY19tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCiAKIAotCVB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgPSBjYWxsX3JlYWRsaW5lOwotCXNldHVwX3JlYWRsaW5lKCk7CisgICAgUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciA9IGNhbGxfcmVhZGxpbmU7CisgICAgc2V0dXBfcmVhZGxpbmUoKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvcmVzb3VyY2UuYyBiL01vZHVsZXMvcmVzb3VyY2UuYwppbmRleCAzODk3NGY5Li45OTkzYjkzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Jlc291cmNlLmMKKysrIGIvTW9kdWxlcy9yZXNvdXJjZS5jCkBAIC0yOSwzMCArMjksMzAgQEAKICJvciB2aWEgdGhlIGF0dHJpYnV0ZXMgcnVfdXRpbWUsIHJ1X3N0aW1lLCBydV9tYXhyc3MsIGFuZCBzbyBvbi4iKTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgc3RydWN0X3J1c2FnZV9maWVsZHNbXSA9IHsKLQl7InJ1X3V0aW1lIiwJInVzZXIgdGltZSB1c2VkIn0sCi0JeyJydV9zdGltZSIsCSJzeXN0ZW0gdGltZSB1c2VkIn0sCi0JeyJydV9tYXhyc3MiLAkibWF4LiByZXNpZGVudCBzZXQgc2l6ZSJ9LAotCXsicnVfaXhyc3MiLAkic2hhcmVkIG1lbW9yeSBzaXplIn0sCi0JeyJydV9pZHJzcyIsCSJ1bnNoYXJlZCBkYXRhIHNpemUifSwKLQl7InJ1X2lzcnNzIiwJInVuc2hhcmVkIHN0YWNrIHNpemUifSwKLQl7InJ1X21pbmZsdCIsCSJwYWdlIGZhdWx0cyBub3QgcmVxdWlyaW5nIEkvTyJ9LAotCXsicnVfbWFqZmx0IiwJInBhZ2UgZmF1bHRzIHJlcXVpcmluZyBJL08ifSwKLQl7InJ1X25zd2FwIiwJIm51bWJlciBvZiBzd2FwIG91dHMifSwKLQl7InJ1X2luYmxvY2siLAkiYmxvY2sgaW5wdXQgb3BlcmF0aW9ucyJ9LAotCXsicnVfb3VibG9jayIsCSJibG9jayBvdXRwdXQgb3BlcmF0aW9ucyJ9LAotCXsicnVfbXNnc25kIiwJIklQQyBtZXNzYWdlcyBzZW50In0sCi0JeyJydV9tc2dyY3YiLAkiSVBDIG1lc3NhZ2VzIHJlY2VpdmVkIn0sCi0JeyJydV9uc2lnbmFscyIsCSJzaWduYWxzIHJlY2VpdmVkIn0sCi0JeyJydV9udmNzdyIsCSJ2b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyJ9LAotCXsicnVfbml2Y3N3IiwJImludm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMifSwKLQl7MH0KKyAgICB7InJ1X3V0aW1lIiwgICAgICAgICJ1c2VyIHRpbWUgdXNlZCJ9LAorICAgIHsicnVfc3RpbWUiLCAgICAgICAgInN5c3RlbSB0aW1lIHVzZWQifSwKKyAgICB7InJ1X21heHJzcyIsICAgICAgICJtYXguIHJlc2lkZW50IHNldCBzaXplIn0sCisgICAgeyJydV9peHJzcyIsICAgICAgICAic2hhcmVkIG1lbW9yeSBzaXplIn0sCisgICAgeyJydV9pZHJzcyIsICAgICAgICAidW5zaGFyZWQgZGF0YSBzaXplIn0sCisgICAgeyJydV9pc3JzcyIsICAgICAgICAidW5zaGFyZWQgc3RhY2sgc2l6ZSJ9LAorICAgIHsicnVfbWluZmx0IiwgICAgICAgInBhZ2UgZmF1bHRzIG5vdCByZXF1aXJpbmcgSS9PIn0sCisgICAgeyJydV9tYWpmbHQiLCAgICAgICAicGFnZSBmYXVsdHMgcmVxdWlyaW5nIEkvTyJ9LAorICAgIHsicnVfbnN3YXAiLCAgICAgICAgIm51bWJlciBvZiBzd2FwIG91dHMifSwKKyAgICB7InJ1X2luYmxvY2siLCAgICAgICJibG9jayBpbnB1dCBvcGVyYXRpb25zIn0sCisgICAgeyJydV9vdWJsb2NrIiwgICAgICAiYmxvY2sgb3V0cHV0IG9wZXJhdGlvbnMifSwKKyAgICB7InJ1X21zZ3NuZCIsICAgICAgICJJUEMgbWVzc2FnZXMgc2VudCJ9LAorICAgIHsicnVfbXNncmN2IiwgICAgICAgIklQQyBtZXNzYWdlcyByZWNlaXZlZCJ9LAorICAgIHsicnVfbnNpZ25hbHMiLCAgICAgInNpZ25hbHMgcmVjZWl2ZWQifSwKKyAgICB7InJ1X252Y3N3IiwgICAgICAgICJ2b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyJ9LAorICAgIHsicnVfbml2Y3N3IiwgICAgICAgImludm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMifSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2Mgc3RydWN0X3J1c2FnZV9kZXNjID0gewotCSJyZXNvdXJjZS5zdHJ1Y3RfcnVzYWdlIiwJLyogbmFtZSAqLwotCXN0cnVjdF9ydXNhZ2VfX2RvY19fLAkvKiBkb2MgKi8KLQlzdHJ1Y3RfcnVzYWdlX2ZpZWxkcywJLyogZmllbGRzICovCi0JMTYJLyogbl9pbl9zZXF1ZW5jZSAqLworICAgICJyZXNvdXJjZS5zdHJ1Y3RfcnVzYWdlIiwgICAgICAgICAgIC8qIG5hbWUgKi8KKyAgICBzdHJ1Y3RfcnVzYWdlX19kb2NfXywgICAgICAgLyogZG9jICovCisgICAgc3RydWN0X3J1c2FnZV9maWVsZHMsICAgICAgIC8qIGZpZWxkcyAqLworICAgIDE2ICAgICAgICAgIC8qIG5faW5fc2VxdWVuY2UgKi8KIH07CiAKIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CkBAIC02MSwxNTMgKzYxLDE1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJlc291cmNlX2dldHJ1c2FnZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHdobzsKLQlzdHJ1Y3QgcnVzYWdlIHJ1OwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IHdobzsKKyAgICBzdHJ1Y3QgcnVzYWdlIHJ1OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0cnVzYWdlIiwgJndobykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRydXNhZ2UiLCAmd2hvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZ2V0cnVzYWdlKHdobywgJnJ1KSA9PSAtMSkgewotCQlpZiAoZXJybm8gPT0gRUlOVkFMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJImludmFsaWQgd2hvIHBhcmFtZXRlciIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0gCi0JCVB5RXJyX1NldEZyb21FcnJubyhSZXNvdXJjZUVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChnZXRydXNhZ2Uod2hvLCAmcnUpID09IC0xKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHdobyBwYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhSZXNvdXJjZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmVzdWx0ID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJlN0cnVjdFJVc2FnZVR5cGUpOwotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeVN0cnVjdFNlcXVlbmNlX05ldygmU3RydWN0UlVzYWdlVHlwZSk7CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDAsCi0JCQlQeUZsb2F0X0Zyb21Eb3VibGUoZG91YmxldGltZShydS5ydV91dGltZSkpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMSwKLQkJCVB5RmxvYXRfRnJvbURvdWJsZShkb3VibGV0aW1lKHJ1LnJ1X3N0aW1lKSkpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAyLCBQeUludF9Gcm9tTG9uZyhydS5ydV9tYXhyc3MpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMywgUHlJbnRfRnJvbUxvbmcocnUucnVfaXhyc3MpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNCwgUHlJbnRfRnJvbUxvbmcocnUucnVfaWRyc3MpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNSwgUHlJbnRfRnJvbUxvbmcocnUucnVfaXNyc3MpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNiwgUHlJbnRfRnJvbUxvbmcocnUucnVfbWluZmx0KSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDcsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X21hamZsdCkpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCA4LCBQeUludF9Gcm9tTG9uZyhydS5ydV9uc3dhcCkpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCA5LCBQeUludF9Gcm9tTG9uZyhydS5ydV9pbmJsb2NrKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDEwLCBQeUludF9Gcm9tTG9uZyhydS5ydV9vdWJsb2NrKSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDExLCBQeUludF9Gcm9tTG9uZyhydS5ydV9tc2dzbmQpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMTIsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X21zZ3JjdikpOwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxMywgUHlJbnRfRnJvbUxvbmcocnUucnVfbnNpZ25hbHMpKTsKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMTQsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X252Y3N3KSk7Ci0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDE1LCBQeUludF9Gcm9tTG9uZyhydS5ydV9uaXZjc3cpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMCwKKyAgICAgICAgICAgICAgICAgICAgUHlGbG9hdF9Gcm9tRG91YmxlKGRvdWJsZXRpbWUocnUucnVfdXRpbWUpKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDEsCisgICAgICAgICAgICAgICAgICAgIFB5RmxvYXRfRnJvbURvdWJsZShkb3VibGV0aW1lKHJ1LnJ1X3N0aW1lKSkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAyLCBQeUludF9Gcm9tTG9uZyhydS5ydV9tYXhyc3MpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMywgUHlJbnRfRnJvbUxvbmcocnUucnVfaXhyc3MpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNCwgUHlJbnRfRnJvbUxvbmcocnUucnVfaWRyc3MpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNSwgUHlJbnRfRnJvbUxvbmcocnUucnVfaXNyc3MpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgNiwgUHlJbnRfRnJvbUxvbmcocnUucnVfbWluZmx0KSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDcsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X21hamZsdCkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCA4LCBQeUludF9Gcm9tTG9uZyhydS5ydV9uc3dhcCkpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCA5LCBQeUludF9Gcm9tTG9uZyhydS5ydV9pbmJsb2NrKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDEwLCBQeUludF9Gcm9tTG9uZyhydS5ydV9vdWJsb2NrKSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDExLCBQeUludF9Gcm9tTG9uZyhydS5ydV9tc2dzbmQpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMTIsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X21zZ3JjdikpOworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ocmVzdWx0LCAxMywgUHlJbnRfRnJvbUxvbmcocnUucnVfbnNpZ25hbHMpKTsKKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHJlc3VsdCwgMTQsIFB5SW50X0Zyb21Mb25nKHJ1LnJ1X252Y3N3KSk7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShyZXN1bHQsIDE1LCBQeUludF9Gcm9tTG9uZyhydS5ydV9uaXZjc3cpKTsKIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVzb3VyY2VfZ2V0cmxpbWl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJ1Y3QgcmxpbWl0IHJsOwotCWludCByZXNvdXJjZTsKKyAgICBzdHJ1Y3QgcmxpbWl0IHJsOworICAgIGludCByZXNvdXJjZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpnZXRybGltaXQiLCAmcmVzb3VyY2UpKSAKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmdldHJsaW1pdCIsICZyZXNvdXJjZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc291cmNlIDwgMCB8fCByZXNvdXJjZSA+PSBSTElNX05MSU1JVFMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImludmFsaWQgcmVzb3VyY2Ugc3BlY2lmaWVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocmVzb3VyY2UgPCAwIHx8IHJlc291cmNlID49IFJMSU1fTkxJTUlUUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHJlc291cmNlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZ2V0cmxpbWl0KHJlc291cmNlLCAmcmwpID09IC0xKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhSZXNvdXJjZUVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChnZXRybGltaXQocmVzb3VyY2UsICZybCkgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFJlc291cmNlRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKQotCWlmIChzaXplb2YocmwucmxpbV9jdXIpID4gc2l6ZW9mKGxvbmcpKSB7Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJMTCIsCi0JCQkJICAgICAoUFlfTE9OR19MT05HKSBybC5ybGltX2N1ciwKLQkJCQkgICAgIChQWV9MT05HX0xPTkcpIHJsLnJsaW1fbWF4KTsKLQl9CisgICAgaWYgKHNpemVvZihybC5ybGltX2N1cikgPiBzaXplb2YobG9uZykpIHsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIkxMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBZX0xPTkdfTE9ORykgcmwucmxpbV9jdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQWV9MT05HX0xPTkcpIHJsLnJsaW1fbWF4KTsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCAobG9uZykgcmwucmxpbV9jdXIsIChsb25nKSBybC5ybGltX21heCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgKGxvbmcpIHJsLnJsaW1fY3VyLCAobG9uZykgcmwucmxpbV9tYXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVzb3VyY2Vfc2V0cmxpbWl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdHJ1Y3QgcmxpbWl0IHJsOwotCWludCByZXNvdXJjZTsKLQlQeU9iamVjdCAqY3Vyb2JqLCAqbWF4b2JqOworICAgIHN0cnVjdCBybGltaXQgcmw7CisgICAgaW50IHJlc291cmNlOworICAgIFB5T2JqZWN0ICpjdXJvYmosICptYXhvYmo7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkoT08pOnNldHJsaW1pdCIsCi0JCQkgICAgICAmcmVzb3VyY2UsICZjdXJvYmosICZtYXhvYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkoT08pOnNldHJsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZSwgJmN1cm9iaiwgJm1heG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc291cmNlIDwgMCB8fCByZXNvdXJjZSA+PSBSTElNX05MSU1JVFMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImludmFsaWQgcmVzb3VyY2Ugc3BlY2lmaWVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocmVzb3VyY2UgPCAwIHx8IHJlc291cmNlID49IFJMSU1fTkxJTUlUUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHJlc291cmNlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZiAhZGVmaW5lZChIQVZFX0xBUkdFRklMRV9TVVBQT1JUKQotCXJsLnJsaW1fY3VyID0gUHlJbnRfQXNMb25nKGN1cm9iaik7Ci0JaWYgKHJsLnJsaW1fY3VyID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JcmwucmxpbV9tYXggPSBQeUludF9Bc0xvbmcobWF4b2JqKTsKLQlpZiAocmwucmxpbV9tYXggPT0gKHJsaW1fdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICBybC5ybGltX2N1ciA9IFB5SW50X0FzTG9uZyhjdXJvYmopOworICAgIGlmIChybC5ybGltX2N1ciA9PSAocmxpbV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJsLnJsaW1fbWF4ID0gUHlJbnRfQXNMb25nKG1heG9iaik7CisgICAgaWYgKHJsLnJsaW1fbWF4ID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZWxzZQotCS8qIFRoZSBsaW1pdHMgYXJlIHByb2JhYmx5IGJpZ2dlciB0aGFuIGEgbG9uZyAqLwotCXJsLnJsaW1fY3VyID0gUHlMb25nX0NoZWNrKGN1cm9iaikgPwotCQlQeUxvbmdfQXNMb25nTG9uZyhjdXJvYmopIDogUHlJbnRfQXNMb25nKGN1cm9iaik7Ci0JaWYgKHJsLnJsaW1fY3VyID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JcmwucmxpbV9tYXggPSBQeUxvbmdfQ2hlY2sobWF4b2JqKSA/Ci0JCVB5TG9uZ19Bc0xvbmdMb25nKG1heG9iaikgOiBQeUludF9Bc0xvbmcobWF4b2JqKTsKLQlpZiAocmwucmxpbV9tYXggPT0gKHJsaW1fdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBUaGUgbGltaXRzIGFyZSBwcm9iYWJseSBiaWdnZXIgdGhhbiBhIGxvbmcgKi8KKyAgICBybC5ybGltX2N1ciA9IFB5TG9uZ19DaGVjayhjdXJvYmopID8KKyAgICAgICAgUHlMb25nX0FzTG9uZ0xvbmcoY3Vyb2JqKSA6IFB5SW50X0FzTG9uZyhjdXJvYmopOworICAgIGlmIChybC5ybGltX2N1ciA9PSAocmxpbV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJsLnJsaW1fbWF4ID0gUHlMb25nX0NoZWNrKG1heG9iaikgPworICAgICAgICBQeUxvbmdfQXNMb25nTG9uZyhtYXhvYmopIDogUHlJbnRfQXNMb25nKG1heG9iaik7CisgICAgaWYgKHJsLnJsaW1fbWF4ID09IChybGltX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKIAotCXJsLnJsaW1fY3VyID0gcmwucmxpbV9jdXIgJiBSTElNX0lORklOSVRZOwotCXJsLnJsaW1fbWF4ID0gcmwucmxpbV9tYXggJiBSTElNX0lORklOSVRZOwotCWlmIChzZXRybGltaXQocmVzb3VyY2UsICZybCkgPT0gLTEpIHsKLQkJaWYgKGVycm5vID09IEVJTlZBTCkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiY3VycmVudCBsaW1pdCBleGNlZWRzIG1heGltdW0gbGltaXQiKTsKLQkJZWxzZSBpZiAoZXJybm8gPT0gRVBFUk0pCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIm5vdCBhbGxvd2VkIHRvIHJhaXNlIG1heGltdW0gbGltaXQiKTsKLQkJZWxzZQotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFJlc291cmNlRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIHJsLnJsaW1fY3VyID0gcmwucmxpbV9jdXIgJiBSTElNX0lORklOSVRZOworICAgIHJsLnJsaW1fbWF4ID0gcmwucmxpbV9tYXggJiBSTElNX0lORklOSVRZOworICAgIGlmIChzZXRybGltaXQocmVzb3VyY2UsICZybCkgPT0gLTEpIHsKKyAgICAgICAgaWYgKGVycm5vID09IEVJTlZBTCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50IGxpbWl0IGV4Y2VlZHMgbWF4aW11bSBsaW1pdCIpOworICAgICAgICBlbHNlIGlmIChlcnJubyA9PSBFUEVSTSkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsb3dlZCB0byByYWlzZSBtYXhpbXVtIGxpbWl0Iik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhSZXNvdXJjZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlc291cmNlX2dldHBhZ2VzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCWxvbmcgcGFnZXNpemUgPSAwOworICAgIGxvbmcgcGFnZXNpemUgPSAwOwogI2lmIGRlZmluZWQoSEFWRV9HRVRQQUdFU0laRSkKLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisgICAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwogI2VsaWYgZGVmaW5lZChIQVZFX1NZU0NPTkYpCiAjaWYgZGVmaW5lZChfU0NfUEFHRV9TSVpFKQotCXBhZ2VzaXplID0gc3lzY29uZihfU0NfUEFHRV9TSVpFKTsKKyAgICBwYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CiAjZWxzZQotCS8qIElyaXggNS4zIGhhcyBfU0NfUEFHRVNJWkUsIGJ1dCBub3QgX1NDX1BBR0VfU0laRSAqLwotCXBhZ2VzaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworICAgIC8qIElyaXggNS4zIGhhcyBfU0NfUEFHRVNJWkUsIGJ1dCBub3QgX1NDX1BBR0VfU0laRSAqLworICAgIHBhZ2VzaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwogI2VuZGlmCiAjZW5kaWYKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHBhZ2VzaXplKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHBhZ2VzaXplKTsKIAogfQogCkBAIC0yMTUsMTEgKzIxNSwxMSBAQAogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmCiByZXNvdXJjZV9tZXRob2RzW10gPSB7Ci0JeyJnZXRydXNhZ2UiLCAgICByZXNvdXJjZV9nZXRydXNhZ2UsICAgTUVUSF9WQVJBUkdTfSwKLQl7ImdldHJsaW1pdCIsICAgIHJlc291cmNlX2dldHJsaW1pdCwgICBNRVRIX1ZBUkFSR1N9LAotCXsic2V0cmxpbWl0IiwgICAgcmVzb3VyY2Vfc2V0cmxpbWl0LCAgIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRwYWdlc2l6ZSIsICByZXNvdXJjZV9nZXRwYWdlc2l6ZSwgTUVUSF9OT0FSR1N9LAotCXtOVUxMLCBOVUxMfQkJCSAgICAgLyogc2VudGluZWwgKi8KKyAgICB7ImdldHJ1c2FnZSIsICAgIHJlc291cmNlX2dldHJ1c2FnZSwgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0cmxpbWl0IiwgICAgcmVzb3VyY2VfZ2V0cmxpbWl0LCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRybGltaXQiLCAgICByZXNvdXJjZV9zZXRybGltaXQsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldHBhZ2VzaXplIiwgIHJlc291cmNlX2dldHBhZ2VzaXplLCBNRVRIX05PQVJHU30sCisgICAge05VTEwsIE5VTEx9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC0yMjgsMTAyICsyMjgsMTAyIEBACiBQeU1PRElOSVRfRlVOQwogaW5pdHJlc291cmNlKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICp2OworICAgIFB5T2JqZWN0ICptLCAqdjsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlKCJyZXNvdXJjZSIsIHJlc291cmNlX21ldGhvZHMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZSgicmVzb3VyY2UiLCByZXNvdXJjZV9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwotCWlmIChSZXNvdXJjZUVycm9yID09IE5VTEwpIHsKLQkJUmVzb3VyY2VFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigicmVzb3VyY2UuZXJyb3IiLAotCQkJCQkJICAgTlVMTCwgTlVMTCk7Ci0JfQotCVB5X0lOQ1JFRihSZXNvdXJjZUVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgUmVzb3VyY2VFcnJvcik7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0UlVzYWdlVHlwZSwgCi0JCQkJCSAgJnN0cnVjdF9ydXNhZ2VfZGVzYyk7Ci0JUHlfSU5DUkVGKCZTdHJ1Y3RSVXNhZ2VUeXBlKTsKLSAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcnVzYWdlIiwgCi0JCQkgICAoUHlPYmplY3QqKSAmU3RydWN0UlVzYWdlVHlwZSk7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBpZiAoUmVzb3VyY2VFcnJvciA9PSBOVUxMKSB7CisgICAgICAgIFJlc291cmNlRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInJlc291cmNlLmVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFJlc291cmNlRXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBSZXNvdXJjZUVycm9yKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RSVXNhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3RfcnVzYWdlX2Rlc2MpOworICAgIFB5X0lOQ1JFRigmU3RydWN0UlVzYWdlVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfcnVzYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KikgJlN0cnVjdFJVc2FnZVR5cGUpOwogCi0JLyogaW5zZXJ0IGNvbnN0YW50cyAqLworICAgIC8qIGluc2VydCBjb25zdGFudHMgKi8KICNpZmRlZiBSTElNSVRfQ1BVCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9DUFUiLCBSTElNSVRfQ1BVKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0NQVSIsIFJMSU1JVF9DUFUpOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfRlNJWkUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0ZTSVpFIiwgUkxJTUlUX0ZTSVpFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0ZTSVpFIiwgUkxJTUlUX0ZTSVpFKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX0RBVEEKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0RBVEEiLCBSTElNSVRfREFUQSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9EQVRBIiwgUkxJTUlUX0RBVEEpOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfU1RBQ0sKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX1NUQUNLIiwgUkxJTUlUX1NUQUNLKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX1NUQUNLIiwgUkxJTUlUX1NUQUNLKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX0NPUkUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0NPUkUiLCBSTElNSVRfQ09SRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9DT1JFIiwgUkxJTUlUX0NPUkUpOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfTk9GSUxFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9OT0ZJTEUiLCBSTElNSVRfTk9GSUxFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX05PRklMRSIsIFJMSU1JVF9OT0ZJTEUpOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfT0ZJTEUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX09GSUxFIiwgUkxJTUlUX09GSUxFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX09GSUxFIiwgUkxJTUlUX09GSUxFKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX1ZNRU0KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX1ZNRU0iLCBSTElNSVRfVk1FTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9WTUVNIiwgUkxJTUlUX1ZNRU0pOwogI2VuZGlmCiAKICNpZmRlZiBSTElNSVRfQVMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0FTIiwgUkxJTUlUX0FTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkxJTUlUX0FTIiwgUkxJTUlUX0FTKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX1JTUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfUlNTIiwgUkxJTUlUX1JTUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9SU1MiLCBSTElNSVRfUlNTKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX05QUk9DCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9OUFJPQyIsIFJMSU1JVF9OUFJPQyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9OUFJPQyIsIFJMSU1JVF9OUFJPQyk7CiAjZW5kaWYKIAogI2lmZGVmIFJMSU1JVF9NRU1MT0NLCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9NRU1MT0NLIiwgUkxJTUlUX01FTUxPQ0spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfTUVNTE9DSyIsIFJMSU1JVF9NRU1MT0NLKTsKICNlbmRpZgogCiAjaWZkZWYgUkxJTUlUX1NCU0laRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSTElNSVRfU0JTSVpFIiwgUkxJTUlUX1NCU0laRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJMSU1JVF9TQlNJWkUiLCBSTElNSVRfU0JTSVpFKTsKICNlbmRpZgogCiAjaWZkZWYgUlVTQUdFX1NFTEYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUlVTQUdFX1NFTEYiLCBSVVNBR0VfU0VMRik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJVU0FHRV9TRUxGIiwgUlVTQUdFX1NFTEYpOwogI2VuZGlmCiAKICNpZmRlZiBSVVNBR0VfQ0hJTERSRU4KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUlVTQUdFX0NISUxEUkVOIiwgUlVTQUdFX0NISUxEUkVOKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUlVTQUdFX0NISUxEUkVOIiwgUlVTQUdFX0NISUxEUkVOKTsKICNlbmRpZgogCiAjaWZkZWYgUlVTQUdFX0JPVEgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUlVTQUdFX0JPVEgiLCBSVVNBR0VfQk9USCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJVU0FHRV9CT1RIIiwgUlVTQUdFX0JPVEgpOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKQotCWlmIChzaXplb2YoUkxJTV9JTkZJTklUWSkgPiBzaXplb2YobG9uZykpIHsKLQkJdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORykgUkxJTV9JTkZJTklUWSk7Ci0JfSBlbHNlIAorICAgIGlmIChzaXplb2YoUkxJTV9JTkZJTklUWSkgPiBzaXplb2YobG9uZykpIHsKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORykgUkxJTV9JTkZJTklUWSk7CisgICAgfSBlbHNlCiAjZW5kaWYKLQl7Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgUkxJTV9JTkZJTklUWSk7Ci0JfQotCWlmICh2KSB7Ci0JCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiUkxJTV9JTkZJTklUWSIsIHYpOwotCX0KLQlpbml0aWFsaXplZCA9IDE7CisgICAgeworICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIFJMSU1fSU5GSU5JVFkpOworICAgIH0KKyAgICBpZiAodikgeworICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJMSU1fSU5GSU5JVFkiLCB2KTsKKyAgICB9CisgICAgaW5pdGlhbGl6ZWQgPSAxOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9yb3RhdGluZ3RyZWUuYyBiL01vZHVsZXMvcm90YXRpbmd0cmVlLmMKaW5kZXggMzljNmRkNS4uMDdlMDhiYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yb3RhdGluZ3RyZWUuYworKysgYi9Nb2R1bGVzL3JvdGF0aW5ndHJlZS5jCkBAIC0xNCwxNCArMTQsMTQgQEAKIHN0YXRpYyBpbnQKIHJhbmRvbWJpdHMoaW50IGJpdHMpCiB7Ci0JaW50IHJlc3VsdDsKLQlpZiAocmFuZG9tX3N0cmVhbSA8ICgxVSA8PCBiaXRzKSkgewotCQlyYW5kb21fdmFsdWUgKj0gMTA4MjUyNzsKLQkJcmFuZG9tX3N0cmVhbSA9IHJhbmRvbV92YWx1ZTsKLQl9Ci0JcmVzdWx0ID0gcmFuZG9tX3N0cmVhbSAmICgoMTw8Yml0cyktMSk7Ci0JcmFuZG9tX3N0cmVhbSA+Pj0gYml0czsKLQlyZXR1cm4gcmVzdWx0OworICAgIGludCByZXN1bHQ7CisgICAgaWYgKHJhbmRvbV9zdHJlYW0gPCAoMVUgPDwgYml0cykpIHsKKyAgICAgICAgcmFuZG9tX3ZhbHVlICo9IDEwODI1Mjc7CisgICAgICAgIHJhbmRvbV9zdHJlYW0gPSByYW5kb21fdmFsdWU7CisgICAgfQorICAgIHJlc3VsdCA9IHJhbmRvbV9zdHJlYW0gJiAoKDE8PGJpdHMpLTEpOworICAgIHJhbmRvbV9zdHJlYW0gPj49IGJpdHM7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC0zMCwxNSArMzAsMTUgQEAKIHZvaWQKIFJvdGF0aW5nVHJlZV9BZGQocm90YXRpbmdfbm9kZV90ICoqcm9vdCwgcm90YXRpbmdfbm9kZV90ICpub2RlKQogewotCXdoaWxlICgqcm9vdCAhPSBOVUxMKSB7Ci0JCWlmIChLRVlfTE9XRVJfVEhBTihub2RlLT5rZXksICgqcm9vdCktPmtleSkpCi0JCQlyb290ID0gJigoKnJvb3QpLT5sZWZ0KTsKLQkJZWxzZQotCQkJcm9vdCA9ICYoKCpyb290KS0+cmlnaHQpOwotCX0KLQlub2RlLT5sZWZ0ID0gTlVMTDsKLQlub2RlLT5yaWdodCA9IE5VTEw7Ci0JKnJvb3QgPSBub2RlOworICAgIHdoaWxlICgqcm9vdCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChLRVlfTE9XRVJfVEhBTihub2RlLT5rZXksICgqcm9vdCktPmtleSkpCisgICAgICAgICAgICByb290ID0gJigoKnJvb3QpLT5sZWZ0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcm9vdCA9ICYoKCpyb290KS0+cmlnaHQpOworICAgIH0KKyAgICBub2RlLT5sZWZ0ID0gTlVMTDsKKyAgICBub2RlLT5yaWdodCA9IE5VTEw7CisgICAgKnJvb3QgPSBub2RlOwogfQogCiAvKiBMb2NhdGUgdGhlIG5vZGUgd2l0aCB0aGUgZ2l2ZW4ga2V5LiAgVGhpcyBpcyB0aGUgbW9zdCBjb21wbGljYXRlZApAQCAtNDcsNTcgKzQ3LDU3IEBACiByb3RhdGluZ19ub2RlX3QgKgogUm90YXRpbmdUcmVlX0dldChyb3RhdGluZ19ub2RlX3QgKipyb290LCB2b2lkICprZXkpCiB7Ci0JaWYgKHJhbmRvbWJpdHMoMykgIT0gNCkgewotCQkvKiBGYXN0IHBhdGgsIG5vIHJlYmFsYW5jaW5nICovCi0JCXJvdGF0aW5nX25vZGVfdCAqbm9kZSA9ICpyb290OwotCQl3aGlsZSAobm9kZSAhPSBOVUxMKSB7Ci0JCQlpZiAobm9kZS0+a2V5ID09IGtleSkKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCWlmIChLRVlfTE9XRVJfVEhBTihrZXksIG5vZGUtPmtleSkpCi0JCQkJbm9kZSA9IG5vZGUtPmxlZnQ7Ci0JCQllbHNlCi0JCQkJbm9kZSA9IG5vZGUtPnJpZ2h0OwotCQl9Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJcm90YXRpbmdfbm9kZV90ICoqcG5vZGUgPSByb290OwotCQlyb3RhdGluZ19ub2RlX3QgKm5vZGUgPSAqcG5vZGU7Ci0JCXJvdGF0aW5nX25vZGVfdCAqbmV4dDsKLQkJaW50IHJvdGF0ZTsKLQkJaWYgKG5vZGUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQl3aGlsZSAoMSkgewotCQkJaWYgKG5vZGUtPmtleSA9PSBrZXkpCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCQlyb3RhdGUgPSAhcmFuZG9tYml0cygxKTsKLQkJCWlmIChLRVlfTE9XRVJfVEhBTihrZXksIG5vZGUtPmtleSkpIHsKLQkJCQluZXh0ID0gbm9kZS0+bGVmdDsKLQkJCQlpZiAobmV4dCA9PSBOVUxMKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQlpZiAocm90YXRlKSB7Ci0JCQkJCW5vZGUtPmxlZnQgPSBuZXh0LT5yaWdodDsKLQkJCQkJbmV4dC0+cmlnaHQgPSBub2RlOwotCQkJCQkqcG5vZGUgPSBuZXh0OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXBub2RlID0gJihub2RlLT5sZWZ0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5leHQgPSBub2RlLT5yaWdodDsKLQkJCQlpZiAobmV4dCA9PSBOVUxMKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQlpZiAocm90YXRlKSB7Ci0JCQkJCW5vZGUtPnJpZ2h0ID0gbmV4dC0+bGVmdDsKLQkJCQkJbmV4dC0+bGVmdCA9IG5vZGU7Ci0JCQkJCSpwbm9kZSA9IG5leHQ7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJcG5vZGUgPSAmKG5vZGUtPnJpZ2h0KTsKLQkJCX0KLQkJCW5vZGUgPSBuZXh0OwotCQl9Ci0JfQorICAgIGlmIChyYW5kb21iaXRzKDMpICE9IDQpIHsKKyAgICAgICAgLyogRmFzdCBwYXRoLCBubyByZWJhbGFuY2luZyAqLworICAgICAgICByb3RhdGluZ19ub2RlX3QgKm5vZGUgPSAqcm9vdDsKKyAgICAgICAgd2hpbGUgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmtleSA9PSBrZXkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICBpZiAoS0VZX0xPV0VSX1RIQU4oa2V5LCBub2RlLT5rZXkpKQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLT5sZWZ0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLT5yaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJvdGF0aW5nX25vZGVfdCAqKnBub2RlID0gcm9vdDsKKyAgICAgICAgcm90YXRpbmdfbm9kZV90ICpub2RlID0gKnBub2RlOworICAgICAgICByb3RhdGluZ19ub2RlX3QgKm5leHQ7CisgICAgICAgIGludCByb3RhdGU7CisgICAgICAgIGlmIChub2RlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGlmIChub2RlLT5rZXkgPT0ga2V5KQorICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgcm90YXRlID0gIXJhbmRvbWJpdHMoMSk7CisgICAgICAgICAgICBpZiAoS0VZX0xPV0VSX1RIQU4oa2V5LCBub2RlLT5rZXkpKSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IG5vZGUtPmxlZnQ7CisgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKHJvdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBub2RlLT5sZWZ0ID0gbmV4dC0+cmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIG5leHQtPnJpZ2h0ID0gbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgKnBub2RlID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwbm9kZSA9ICYobm9kZS0+bGVmdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gbm9kZS0+cmlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKHJvdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBub2RlLT5yaWdodCA9IG5leHQtPmxlZnQ7CisgICAgICAgICAgICAgICAgICAgIG5leHQtPmxlZnQgPSBub2RlOworICAgICAgICAgICAgICAgICAgICAqcG5vZGUgPSBuZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHBub2RlID0gJihub2RlLT5yaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbmV4dDsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLyogRW51bWVyYXRlIGFsbCBub2RlcyBpbiB0aGUgdHJlZS4gIFRoZSBjYWxsYmFjayBlbnVtZm4oKSBzaG91bGQgcmV0dXJuCkBAIC0xMDUsMTcgKzEwNSwxNyBAQAogICAgQSBub24temVybyB2YWx1ZSBpcyBkaXJlY3RseSByZXR1cm5lZCBieSBSb3RhdGluZ1RyZWVfRW51bSgpLiAqLwogaW50CiBSb3RhdGluZ1RyZWVfRW51bShyb3RhdGluZ19ub2RlX3QgKnJvb3QsIHJvdGF0aW5nX3RyZWVfZW51bV9mbiBlbnVtZm4sCi0JCSAgdm9pZCAqYXJnKQorICAgICAgICAgICAgICAgICAgdm9pZCAqYXJnKQogewotCWludCByZXN1bHQ7Ci0Jcm90YXRpbmdfbm9kZV90ICpub2RlOwotCXdoaWxlIChyb290ICE9IE5VTEwpIHsKLQkJcmVzdWx0ID0gUm90YXRpbmdUcmVlX0VudW0ocm9vdC0+bGVmdCwgZW51bWZuLCBhcmcpOwotCQlpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7Ci0JCW5vZGUgPSByb290LT5yaWdodDsKLQkJcmVzdWx0ID0gZW51bWZuKHJvb3QsIGFyZyk7Ci0JCWlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsKLQkJcm9vdCA9IG5vZGU7Ci0JfQotCXJldHVybiAwOworICAgIGludCByZXN1bHQ7CisgICAgcm90YXRpbmdfbm9kZV90ICpub2RlOworICAgIHdoaWxlIChyb290ICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gUm90YXRpbmdUcmVlX0VudW0ocm9vdC0+bGVmdCwgZW51bWZuLCBhcmcpOworICAgICAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiByZXN1bHQ7CisgICAgICAgIG5vZGUgPSByb290LT5yaWdodDsKKyAgICAgICAgcmVzdWx0ID0gZW51bWZuKHJvb3QsIGFyZyk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcm9vdCA9IG5vZGU7CisgICAgfQorICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKaW5kZXggMDljNjg3Yy4uYmE1ZmRiNCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCkBAIC0yNCw3ICsyNCw3IEBACiAqLwogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgJiYgIWRlZmluZWQoRkRfU0VUU0laRSkKICNkZWZpbmUgRkRfU0VUU0laRSA1MTIKLSNlbmRpZiAKKyNlbmRpZgogCiAjaWYgZGVmaW5lZChIQVZFX1BPTExfSCkKICNpbmNsdWRlIDxwb2xsLmg+CkBAIC02MSwyMCArNjEsMjAgQEAKIAogLyogbGlzdCBvZiBQeXRob24gb2JqZWN0cyBhbmQgdGhlaXIgZmlsZSBkZXNjcmlwdG9yICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3QgKm9iajsJCQkgICAgIC8qIG93bmVkIHJlZmVyZW5jZSAqLwotCVNPQ0tFVCBmZDsKLQlpbnQgc2VudGluZWw7CQkJICAgICAvKiAtMSA9PSBzZW50aW5lbCAqLworICAgIFB5T2JqZWN0ICpvYmo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3duZWQgcmVmZXJlbmNlICovCisgICAgU09DS0VUIGZkOworICAgIGludCBzZW50aW5lbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLTEgPT0gc2VudGluZWwgKi8KIH0gcHlsaXN0OwogCiBzdGF0aWMgdm9pZAogcmVhcF9vYmoocHlsaXN0IGZkMm9ialtGRF9TRVRTSVpFICsgMV0pCiB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IEZEX1NFVFNJWkUgKyAxICYmIGZkMm9ialtpXS5zZW50aW5lbCA+PSAwOyBpKyspIHsKLQkJUHlfWERFQ1JFRihmZDJvYmpbaV0ub2JqKTsKLQkJZmQyb2JqW2ldLm9iaiA9IE5VTEw7Ci0JfQotCWZkMm9ialswXS5zZW50aW5lbCA9IC0xOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRF9TRVRTSVpFICsgMSAmJiBmZDJvYmpbaV0uc2VudGluZWwgPj0gMDsgaSsrKSB7CisgICAgICAgIFB5X1hERUNSRUYoZmQyb2JqW2ldLm9iaik7CisgICAgICAgIGZkMm9ialtpXS5vYmogPSBOVUxMOworICAgIH0KKyAgICBmZDJvYmpbMF0uc2VudGluZWwgPSAtMTsKIH0KIAogCkBAIC04NCwxMDYgKzg0LDEwNiBAQAogc3RhdGljIGludAogc2VxMnNldChQeU9iamVjdCAqc2VxLCBmZF9zZXQgKnNldCwgcHlsaXN0IGZkMm9ialtGRF9TRVRTSVpFICsgMV0pCiB7Ci0JaW50IGk7Ci0JaW50IG1heCA9IC0xOwotCWludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBsZW4gPSAtMTsKLSAgICAgICAgUHlPYmplY3QqIGZhc3Rfc2VxID0gTlVMTDsKLQlQeU9iamVjdCogbyA9IE5VTEw7CisgICAgaW50IGk7CisgICAgaW50IG1heCA9IC0xOworICAgIGludCBpbmRleCA9IDA7CisgICAgaW50IGxlbiA9IC0xOworICAgIFB5T2JqZWN0KiBmYXN0X3NlcSA9IE5VTEw7CisgICAgUHlPYmplY3QqIG8gPSBOVUxMOwogCi0JZmQyb2JqWzBdLm9iaiA9IChQeU9iamVjdCopMDsJICAgICAvKiBzZXQgbGlzdCB0byB6ZXJvIHNpemUgKi8KLQlGRF9aRVJPKHNldCk7CisgICAgZmQyb2JqWzBdLm9iaiA9IChQeU9iamVjdCopMDsgICAgICAgICAgICAvKiBzZXQgbGlzdCB0byB6ZXJvIHNpemUgKi8KKyAgICBGRF9aRVJPKHNldCk7CiAKLSAgICAgICAgZmFzdF9zZXE9UHlTZXF1ZW5jZV9GYXN0KHNlcSwgImFyZ3VtZW50cyAxLTMgbXVzdCBiZSBzZXF1ZW5jZXMiKTsKLSAgICAgICAgaWYgKCFmYXN0X3NlcSkKKyAgICBmYXN0X3NlcT1QeVNlcXVlbmNlX0Zhc3Qoc2VxLCAiYXJndW1lbnRzIDEtMyBtdXN0IGJlIHNlcXVlbmNlcyIpOworICAgIGlmICghZmFzdF9zZXEpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGxlbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShmYXN0X3NlcSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspICB7CisgICAgICAgIFNPQ0tFVCB2OworCisgICAgICAgIC8qIGFueSBpbnRlcnZlbmluZyBmaWxlbm8oKSBjYWxscyBjb3VsZCBkZWNyIHRoaXMgcmVmY250ICovCisgICAgICAgIGlmICghKG8gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZmFzdF9zZXEsIGkpKSkKICAgICAgICAgICAgIHJldHVybiAtMTsKIAotICAgICAgICBsZW4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmFzdF9zZXEpOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSAgewotCQlTT0NLRVQgdjsKLQotCQkvKiBhbnkgaW50ZXJ2ZW5pbmcgZmlsZW5vKCkgY2FsbHMgY291bGQgZGVjciB0aGlzIHJlZmNudCAqLwotCQlpZiAoIShvID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZhc3Rfc2VxLCBpKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotCQlQeV9JTkNSRUYobyk7Ci0JCXYgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKCBvICk7Ci0JCWlmICh2ID09IC0xKSBnb3RvIGZpbmFsbHk7CisgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgdiA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IoIG8gKTsKKyAgICAgICAgaWYgKHYgPT0gLTEpIGdvdG8gZmluYWxseTsKIAogI2lmIGRlZmluZWQoX01TQ19WRVIpCi0JCW1heCA9IDA7CQkgICAgIC8qIG5vdCB1c2VkIGZvciBXaW4zMiAqLworICAgICAgICBtYXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90IHVzZWQgZm9yIFdpbjMyICovCiAjZWxzZSAgLyogIV9NU0NfVkVSICovCi0JCWlmICh2IDwgMCB8fCB2ID49IEZEX1NFVFNJWkUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAiZmlsZWRlc2NyaXB0b3Igb3V0IG9mIHJhbmdlIGluIHNlbGVjdCgpIik7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJaWYgKHYgPiBtYXgpCi0JCQltYXggPSB2OworICAgICAgICBpZiAodiA8IDAgfHwgdiA+PSBGRF9TRVRTSVpFKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlZGVzY3JpcHRvciBvdXQgb2YgcmFuZ2UgaW4gc2VsZWN0KCkiKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBpZiAodiA+IG1heCkKKyAgICAgICAgICAgIG1heCA9IHY7CiAjZW5kaWYgLyogX01TQ19WRVIgKi8KLQkJRkRfU0VUKHYsIHNldCk7CisgICAgICAgIEZEX1NFVCh2LCBzZXQpOwogCi0JCS8qIGFkZCBvYmplY3QgYW5kIGl0cyBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIGxpc3QgKi8KLQkJaWYgKGluZGV4ID49IEZEX1NFVFNJWkUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgICJ0b28gbWFueSBmaWxlIGRlc2NyaXB0b3JzIGluIHNlbGVjdCgpIik7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJZmQyb2JqW2luZGV4XS5vYmogPSBvOwotCQlmZDJvYmpbaW5kZXhdLmZkID0gdjsKLQkJZmQyb2JqW2luZGV4XS5zZW50aW5lbCA9IDA7Ci0JCWZkMm9ialsrK2luZGV4XS5zZW50aW5lbCA9IC0xOwotCX0KLSAgICAgICAgUHlfREVDUkVGKGZhc3Rfc2VxKTsKLQlyZXR1cm4gbWF4KzE7CisgICAgICAgIC8qIGFkZCBvYmplY3QgYW5kIGl0cyBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIGxpc3QgKi8KKyAgICAgICAgaWYgKGluZGV4ID49IEZEX1NFVFNJWkUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidG9vIG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBpbiBzZWxlY3QoKSIpOworICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgICAgIGZkMm9ialtpbmRleF0ub2JqID0gbzsKKyAgICAgICAgZmQyb2JqW2luZGV4XS5mZCA9IHY7CisgICAgICAgIGZkMm9ialtpbmRleF0uc2VudGluZWwgPSAwOworICAgICAgICBmZDJvYmpbKytpbmRleF0uc2VudGluZWwgPSAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKGZhc3Rfc2VxKTsKKyAgICByZXR1cm4gbWF4KzE7CiAKICAgZmluYWxseToKLQlQeV9YREVDUkVGKG8pOwotICAgICAgICBQeV9ERUNSRUYoZmFzdF9zZXEpOwotCXJldHVybiAtMTsKKyAgICBQeV9YREVDUkVGKG8pOworICAgIFB5X0RFQ1JFRihmYXN0X3NlcSk7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiByZXR1cm5zIE5VTEwgYW5kIHNldHMgdGhlIFB5dGhvbiBleGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBzZXQybGlzdChmZF9zZXQgKnNldCwgcHlsaXN0IGZkMm9ialtGRF9TRVRTSVpFICsgMV0pCiB7Ci0JaW50IGksIGosIGNvdW50PTA7Ci0JUHlPYmplY3QgKmxpc3QsICpvOwotCVNPQ0tFVCBmZDsKKyAgICBpbnQgaSwgaiwgY291bnQ9MDsKKyAgICBQeU9iamVjdCAqbGlzdCwgKm87CisgICAgU09DS0VUIGZkOwogCi0JZm9yIChqID0gMDsgZmQyb2JqW2pdLnNlbnRpbmVsID49IDA7IGorKykgewotCQlpZiAoRkRfSVNTRVQoZmQyb2JqW2pdLmZkLCBzZXQpKQotCQkJY291bnQrKzsKLQl9Ci0JbGlzdCA9IFB5TGlzdF9OZXcoY291bnQpOwotCWlmICghbGlzdCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZm9yIChqID0gMDsgZmQyb2JqW2pdLnNlbnRpbmVsID49IDA7IGorKykgeworICAgICAgICBpZiAoRkRfSVNTRVQoZmQyb2JqW2pdLmZkLCBzZXQpKQorICAgICAgICAgICAgY291bnQrKzsKKyAgICB9CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoY291bnQpOworICAgIGlmICghbGlzdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gMDsKLQlmb3IgKGogPSAwOyBmZDJvYmpbal0uc2VudGluZWwgPj0gMDsgaisrKSB7Ci0JCWZkID0gZmQyb2JqW2pdLmZkOwotCQlpZiAoRkRfSVNTRVQoZmQsIHNldCkpIHsKKyAgICBpID0gMDsKKyAgICBmb3IgKGogPSAwOyBmZDJvYmpbal0uc2VudGluZWwgPj0gMDsgaisrKSB7CisgICAgICAgIGZkID0gZmQyb2JqW2pdLmZkOworICAgICAgICBpZiAoRkRfSVNTRVQoZmQsIHNldCkpIHsKICNpZm5kZWYgX01TQ19WRVIKLQkJCWlmIChmZCA+IEZEX1NFVFNJWkUpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAiZmlsZWRlc2NyaXB0b3Igb3V0IG9mIHJhbmdlIHJldHVybmVkIGluIHNlbGVjdCgpIik7Ci0JCQkJZ290byBmaW5hbGx5OwotCQkJfQorICAgICAgICAgICAgaWYgKGZkID4gRkRfU0VUU0laRSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICJmaWxlZGVzY3JpcHRvciBvdXQgb2YgcmFuZ2UgcmV0dXJuZWQgaW4gc2VsZWN0KCkiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCW8gPSBmZDJvYmpbal0ub2JqOwotCQkJZmQyb2JqW2pdLm9iaiA9IE5VTEw7Ci0JCQkvKiB0cmFuc2ZlciBvd25lcnNoaXAgKi8KLQkJCWlmIChQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCBvKSA8IDApCi0JCQkJZ290byBmaW5hbGx5OworICAgICAgICAgICAgbyA9IGZkMm9ialtqXS5vYmo7CisgICAgICAgICAgICBmZDJvYmpbal0ub2JqID0gTlVMTDsKKyAgICAgICAgICAgIC8qIHRyYW5zZmVyIG93bmVyc2hpcCAqLworICAgICAgICAgICAgaWYgKFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIG8pIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCWkrKzsKLQkJfQotCX0KLQlyZXR1cm4gbGlzdDsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGlzdDsKICAgZmluYWxseToKLQlQeV9ERUNSRUYobGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGxpc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiAjdW5kZWYgU0VMRUNUX1VTRVNfSEVBUApAQCAtMTk1LDE3MCArMTk1LDE3MCBAQAogc2VsZWN0X3NlbGVjdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAjaWZkZWYgU0VMRUNUX1VTRVNfSEVBUAotCXB5bGlzdCAqcmZkMm9iaiwgKndmZDJvYmosICplZmQyb2JqOworICAgIHB5bGlzdCAqcmZkMm9iaiwgKndmZDJvYmosICplZmQyb2JqOwogI2Vsc2UgIC8qICFTRUxFQ1RfVVNFU19IRUFQICovCi0JLyogWFhYOiBBbGwgdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgaW1wbGVtZW50ZWQgYXMgZm9sbG93czoKLQkgKiAtIGZpbmQgdGhlIGhpZ2hlc3QgZGVzY3JpcHRvciB3ZSdyZSBpbnRlcmVzdGVkIGluCi0JICogLSBhZGQgb25lCi0JICogLSB0aGF0J3MgdGhlIHNpemUKLQkgKiBTZWU6IFN0ZXZlbnMsIEFQaXRVRSwgJDEyLjUuMQotCSAqLwotCXB5bGlzdCByZmQyb2JqW0ZEX1NFVFNJWkUgKyAxXTsKLQlweWxpc3Qgd2ZkMm9ialtGRF9TRVRTSVpFICsgMV07Ci0JcHlsaXN0IGVmZDJvYmpbRkRfU0VUU0laRSArIDFdOworICAgIC8qIFhYWDogQWxsIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGltcGxlbWVudGVkIGFzIGZvbGxvd3M6CisgICAgICogLSBmaW5kIHRoZSBoaWdoZXN0IGRlc2NyaXB0b3Igd2UncmUgaW50ZXJlc3RlZCBpbgorICAgICAqIC0gYWRkIG9uZQorICAgICAqIC0gdGhhdCdzIHRoZSBzaXplCisgICAgICogU2VlOiBTdGV2ZW5zLCBBUGl0VUUsICQxMi41LjEKKyAgICAgKi8KKyAgICBweWxpc3QgcmZkMm9ialtGRF9TRVRTSVpFICsgMV07CisgICAgcHlsaXN0IHdmZDJvYmpbRkRfU0VUU0laRSArIDFdOworICAgIHB5bGlzdCBlZmQyb2JqW0ZEX1NFVFNJWkUgKyAxXTsKICNlbmRpZiAvKiBTRUxFQ1RfVVNFU19IRUFQICovCi0JUHlPYmplY3QgKmlmZGxpc3QsICpvZmRsaXN0LCAqZWZkbGlzdDsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlQeU9iamVjdCAqdG91dCA9IFB5X05vbmU7Ci0JZmRfc2V0IGlmZHNldCwgb2Zkc2V0LCBlZmRzZXQ7Ci0JZG91YmxlIHRpbWVvdXQ7Ci0Jc3RydWN0IHRpbWV2YWwgdHYsICp0dnA7Ci0JbG9uZyBzZWNvbmRzOwotCWludCBpbWF4LCBvbWF4LCBlbWF4LCBtYXg7Ci0JaW50IG47CisgICAgUHlPYmplY3QgKmlmZGxpc3QsICpvZmRsaXN0LCAqZWZkbGlzdDsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdG91dCA9IFB5X05vbmU7CisgICAgZmRfc2V0IGlmZHNldCwgb2Zkc2V0LCBlZmRzZXQ7CisgICAgZG91YmxlIHRpbWVvdXQ7CisgICAgc3RydWN0IHRpbWV2YWwgdHYsICp0dnA7CisgICAgbG9uZyBzZWNvbmRzOworICAgIGludCBpbWF4LCBvbWF4LCBlbWF4LCBtYXg7CisgICAgaW50IG47CiAKLQkvKiBjb252ZXJ0IGFyZ3VtZW50cyAqLwotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNlbGVjdCIsIDMsIDQsCi0JCQkgICAgICAmaWZkbGlzdCwgJm9mZGxpc3QsICZlZmRsaXN0LCAmdG91dCkpCi0JCXJldHVybiBOVUxMOworICAgIC8qIGNvbnZlcnQgYXJndW1lbnRzICovCisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2VsZWN0IiwgMywgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlmZGxpc3QsICZvZmRsaXN0LCAmZWZkbGlzdCwgJnRvdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh0b3V0ID09IFB5X05vbmUpCi0JCXR2cCA9IChzdHJ1Y3QgdGltZXZhbCAqKTA7Ci0JZWxzZSBpZiAoIVB5TnVtYmVyX0NoZWNrKHRvdXQpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInRpbWVvdXQgbXVzdCBiZSBhIGZsb2F0IG9yIE5vbmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCQl0aW1lb3V0ID0gUHlGbG9hdF9Bc0RvdWJsZSh0b3V0KTsKLQkJaWYgKHRpbWVvdXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAodGltZW91dCA+IChkb3VibGUpTE9OR19NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkidGltZW91dCBwZXJpb2QgdG9vIGxvbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXNlY29uZHMgPSAobG9uZyl0aW1lb3V0OwotCQl0aW1lb3V0ID0gdGltZW91dCAtIChkb3VibGUpc2Vjb25kczsKLQkJdHYudHZfc2VjID0gc2Vjb25kczsKLQkJdHYudHZfdXNlYyA9IChsb25nKSh0aW1lb3V0ICogMUU2KTsKLQkJdHZwID0gJnR2OwotCX0KKyAgICBpZiAodG91dCA9PSBQeV9Ob25lKQorICAgICAgICB0dnAgPSAoc3RydWN0IHRpbWV2YWwgKikwOworICAgIGVsc2UgaWYgKCFQeU51bWJlcl9DaGVjayh0b3V0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgbXVzdCBiZSBhIGZsb2F0IG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0aW1lb3V0ID0gUHlGbG9hdF9Bc0RvdWJsZSh0b3V0KTsKKyAgICAgICAgaWYgKHRpbWVvdXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAodGltZW91dCA+IChkb3VibGUpTE9OR19NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IHBlcmlvZCB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2Vjb25kcyA9IChsb25nKXRpbWVvdXQ7CisgICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IC0gKGRvdWJsZSlzZWNvbmRzOworICAgICAgICB0di50dl9zZWMgPSBzZWNvbmRzOworICAgICAgICB0di50dl91c2VjID0gKGxvbmcpKHRpbWVvdXQgKiAxRTYpOworICAgICAgICB0dnAgPSAmdHY7CisgICAgfQogCiAKICNpZmRlZiBTRUxFQ1RfVVNFU19IRUFQCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgbGlzdHMgKi8KLQlyZmQyb2JqID0gUHlNZW1fTkVXKHB5bGlzdCwgRkRfU0VUU0laRSArIDEpOwotCXdmZDJvYmogPSBQeU1lbV9ORVcocHlsaXN0LCBGRF9TRVRTSVpFICsgMSk7Ci0JZWZkMm9iaiA9IFB5TWVtX05FVyhweWxpc3QsIEZEX1NFVFNJWkUgKyAxKTsKLQlpZiAocmZkMm9iaiA9PSBOVUxMIHx8IHdmZDJvYmogPT0gTlVMTCB8fCBlZmQyb2JqID09IE5VTEwpIHsKLQkJaWYgKHJmZDJvYmopIFB5TWVtX0RFTChyZmQyb2JqKTsKLQkJaWYgKHdmZDJvYmopIFB5TWVtX0RFTCh3ZmQyb2JqKTsKLQkJaWYgKGVmZDJvYmopIFB5TWVtX0RFTChlZmQyb2JqKTsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQorICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGxpc3RzICovCisgICAgcmZkMm9iaiA9IFB5TWVtX05FVyhweWxpc3QsIEZEX1NFVFNJWkUgKyAxKTsKKyAgICB3ZmQyb2JqID0gUHlNZW1fTkVXKHB5bGlzdCwgRkRfU0VUU0laRSArIDEpOworICAgIGVmZDJvYmogPSBQeU1lbV9ORVcocHlsaXN0LCBGRF9TRVRTSVpFICsgMSk7CisgICAgaWYgKHJmZDJvYmogPT0gTlVMTCB8fCB3ZmQyb2JqID09IE5VTEwgfHwgZWZkMm9iaiA9PSBOVUxMKSB7CisgICAgICAgIGlmIChyZmQyb2JqKSBQeU1lbV9ERUwocmZkMm9iaik7CisgICAgICAgIGlmICh3ZmQyb2JqKSBQeU1lbV9ERUwod2ZkMm9iaik7CisgICAgICAgIGlmIChlZmQyb2JqKSBQeU1lbV9ERUwoZWZkMm9iaik7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KICNlbmRpZiAvKiBTRUxFQ1RfVVNFU19IRUFQICovCi0JLyogQ29udmVydCBzZXF1ZW5jZXMgdG8gZmRfc2V0cywgYW5kIGdldCBtYXhpbXVtIGZkIG51bWJlcgotCSAqIHByb3BhZ2F0ZXMgdGhlIFB5dGhvbiBleGNlcHRpb24gc2V0IGluIHNlcTJzZXQoKQotCSAqLwotCXJmZDJvYmpbMF0uc2VudGluZWwgPSAtMTsKLQl3ZmQyb2JqWzBdLnNlbnRpbmVsID0gLTE7Ci0JZWZkMm9ialswXS5zZW50aW5lbCA9IC0xOwotCWlmICgoaW1heD1zZXEyc2V0KGlmZGxpc3QsICZpZmRzZXQsIHJmZDJvYmopKSA8IDApIAotCQlnb3RvIGZpbmFsbHk7Ci0JaWYgKChvbWF4PXNlcTJzZXQob2ZkbGlzdCwgJm9mZHNldCwgd2ZkMm9iaikpIDwgMCkgCi0JCWdvdG8gZmluYWxseTsKLQlpZiAoKGVtYXg9c2VxMnNldChlZmRsaXN0LCAmZWZkc2V0LCBlZmQyb2JqKSkgPCAwKSAKLQkJZ290byBmaW5hbGx5OwotCW1heCA9IGltYXg7Ci0JaWYgKG9tYXggPiBtYXgpIG1heCA9IG9tYXg7Ci0JaWYgKGVtYXggPiBtYXgpIG1heCA9IGVtYXg7CisgICAgLyogQ29udmVydCBzZXF1ZW5jZXMgdG8gZmRfc2V0cywgYW5kIGdldCBtYXhpbXVtIGZkIG51bWJlcgorICAgICAqIHByb3BhZ2F0ZXMgdGhlIFB5dGhvbiBleGNlcHRpb24gc2V0IGluIHNlcTJzZXQoKQorICAgICAqLworICAgIHJmZDJvYmpbMF0uc2VudGluZWwgPSAtMTsKKyAgICB3ZmQyb2JqWzBdLnNlbnRpbmVsID0gLTE7CisgICAgZWZkMm9ialswXS5zZW50aW5lbCA9IC0xOworICAgIGlmICgoaW1heD1zZXEyc2V0KGlmZGxpc3QsICZpZmRzZXQsIHJmZDJvYmopKSA8IDApCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBpZiAoKG9tYXg9c2VxMnNldChvZmRsaXN0LCAmb2Zkc2V0LCB3ZmQyb2JqKSkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKChlbWF4PXNlcTJzZXQoZWZkbGlzdCwgJmVmZHNldCwgZWZkMm9iaikpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIG1heCA9IGltYXg7CisgICAgaWYgKG9tYXggPiBtYXgpIG1heCA9IG9tYXg7CisgICAgaWYgKGVtYXggPiBtYXgpIG1heCA9IGVtYXg7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JbiA9IHNlbGVjdChtYXgsICZpZmRzZXQsICZvZmRzZXQsICZlZmRzZXQsIHR2cCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgbiA9IHNlbGVjdChtYXgsICZpZmRzZXQsICZvZmRzZXQsICZlZmRzZXQsIHR2cCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQlpZiAobiA9PSBTT0NLRVRfRVJST1IpIHsKLQkJUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoU2VsZWN0RXJyb3IsIFdTQUdldExhc3RFcnJvcigpKTsKLQl9CisgICAgaWYgKG4gPT0gU09DS0VUX0VSUk9SKSB7CisgICAgICAgIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKFNlbGVjdEVycm9yLCBXU0FHZXRMYXN0RXJyb3IoKSk7CisgICAgfQogI2Vsc2UKLQlpZiAobiA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFNlbGVjdEVycm9yKTsKLQl9CisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTZWxlY3RFcnJvcik7CisgICAgfQogI2VuZGlmCi0JZWxzZSB7Ci0JCS8qIGFueSBvZiB0aGVzZSB0aHJlZSBjYWxscyBjYW4gcmFpc2UgYW4gZXhjZXB0aW9uLiAgaXQncyBtb3JlCi0JCSAgIGNvbnZlbmllbnQgdG8gdGVzdCBmb3IgdGhpcyBhZnRlciBhbGwgdGhyZWUgY2FsbHMuLi4gYnV0Ci0JCSAgIGlzIHRoYXQgYWNjZXB0YWJsZT8KLQkJKi8KLQkJaWZkbGlzdCA9IHNldDJsaXN0KCZpZmRzZXQsIHJmZDJvYmopOwotCQlvZmRsaXN0ID0gc2V0Mmxpc3QoJm9mZHNldCwgd2ZkMm9iaik7Ci0JCWVmZGxpc3QgPSBzZXQybGlzdCgmZWZkc2V0LCBlZmQyb2JqKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXQgPSBOVUxMOwotCQllbHNlCi0JCQlyZXQgPSBQeVR1cGxlX1BhY2soMywgaWZkbGlzdCwgb2ZkbGlzdCwgZWZkbGlzdCk7CisgICAgZWxzZSB7CisgICAgICAgIC8qIGFueSBvZiB0aGVzZSB0aHJlZSBjYWxscyBjYW4gcmFpc2UgYW4gZXhjZXB0aW9uLiAgaXQncyBtb3JlCisgICAgICAgICAgIGNvbnZlbmllbnQgdG8gdGVzdCBmb3IgdGhpcyBhZnRlciBhbGwgdGhyZWUgY2FsbHMuLi4gYnV0CisgICAgICAgICAgIGlzIHRoYXQgYWNjZXB0YWJsZT8KKyAgICAgICAgKi8KKyAgICAgICAgaWZkbGlzdCA9IHNldDJsaXN0KCZpZmRzZXQsIHJmZDJvYmopOworICAgICAgICBvZmRsaXN0ID0gc2V0Mmxpc3QoJm9mZHNldCwgd2ZkMm9iaik7CisgICAgICAgIGVmZGxpc3QgPSBzZXQybGlzdCgmZWZkc2V0LCBlZmQyb2JqKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXQgPSBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQgPSBQeVR1cGxlX1BhY2soMywgaWZkbGlzdCwgb2ZkbGlzdCwgZWZkbGlzdCk7CiAKLQkJUHlfREVDUkVGKGlmZGxpc3QpOwotCQlQeV9ERUNSRUYob2ZkbGlzdCk7Ci0JCVB5X0RFQ1JFRihlZmRsaXN0KTsKLQl9Ci0JCisgICAgICAgIFB5X0RFQ1JFRihpZmRsaXN0KTsKKyAgICAgICAgUHlfREVDUkVGKG9mZGxpc3QpOworICAgICAgICBQeV9ERUNSRUYoZWZkbGlzdCk7CisgICAgfQorCiAgIGZpbmFsbHk6Ci0JcmVhcF9vYmoocmZkMm9iaik7Ci0JcmVhcF9vYmood2ZkMm9iaik7Ci0JcmVhcF9vYmooZWZkMm9iaik7CisgICAgcmVhcF9vYmoocmZkMm9iaik7CisgICAgcmVhcF9vYmood2ZkMm9iaik7CisgICAgcmVhcF9vYmooZWZkMm9iaik7CiAjaWZkZWYgU0VMRUNUX1VTRVNfSEVBUAotCVB5TWVtX0RFTChyZmQyb2JqKTsKLQlQeU1lbV9ERUwod2ZkMm9iaik7Ci0JUHlNZW1fREVMKGVmZDJvYmopOworICAgIFB5TWVtX0RFTChyZmQyb2JqKTsKKyAgICBQeU1lbV9ERUwod2ZkMm9iaik7CisgICAgUHlNZW1fREVMKGVmZDJvYmopOwogI2VuZGlmIC8qIFNFTEVDVF9VU0VTX0hFQVAgKi8KLQlyZXR1cm4gcmV0OworICAgIHJldHVybiByZXQ7CiB9CiAKICNpZiBkZWZpbmVkKEhBVkVfUE9MTCkgJiYgIWRlZmluZWQoSEFWRV9CUk9LRU5fUE9MTCkKLS8qIAorLyoKICAqIHBvbGwoKSBzdXBwb3J0CiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqZGljdDsKLQlpbnQgdWZkX3VwdG9kYXRlOyAKLQlpbnQgdWZkX2xlbjsKLSAgICAgICAgc3RydWN0IHBvbGxmZCAqdWZkczsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgaW50IHVmZF91cHRvZGF0ZTsKKyAgICBpbnQgdWZkX2xlbjsKKyAgICBzdHJ1Y3QgcG9sbGZkICp1ZmRzOwogfSBwb2xsT2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHBvbGxfVHlwZTsKIAotLyogVXBkYXRlIHRoZSBtYWxsb2MnZWQgYXJyYXkgb2YgcG9sbGZkcyB0byBtYXRjaCB0aGUgZGljdGlvbmFyeSAKKy8qIFVwZGF0ZSB0aGUgbWFsbG9jJ2VkIGFycmF5IG9mIHBvbGxmZHMgdG8gbWF0Y2ggdGhlIGRpY3Rpb25hcnkKICAgIGNvbnRhaW5lZCB3aXRoaW4gYSBwb2xsT2JqZWN0LiAgUmV0dXJuIDEgb24gc3VjY2VzcywgMCBvbiBhbiBlcnJvci4KICovCiAKIHN0YXRpYyBpbnQKIHVwZGF0ZV91ZmRfYXJyYXkocG9sbE9iamVjdCAqc2VsZikKIHsKLQlQeV9zc2l6ZV90IGksIHBvczsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7Ci0gICAgICAgIHN0cnVjdCBwb2xsZmQgKm9sZF91ZmRzID0gc2VsZi0+dWZkczsKKyAgICBQeV9zc2l6ZV90IGksIHBvczsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgc3RydWN0IHBvbGxmZCAqb2xkX3VmZHMgPSBzZWxmLT51ZmRzOwogCi0Jc2VsZi0+dWZkX2xlbiA9IFB5RGljdF9TaXplKHNlbGYtPmRpY3QpOwotCVB5TWVtX1JFU0laRShzZWxmLT51ZmRzLCBzdHJ1Y3QgcG9sbGZkLCBzZWxmLT51ZmRfbGVuKTsKLQlpZiAoc2VsZi0+dWZkcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc2VsZi0+dWZkcyA9IG9sZF91ZmRzOwotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgc2VsZi0+dWZkX2xlbiA9IFB5RGljdF9TaXplKHNlbGYtPmRpY3QpOworICAgIFB5TWVtX1JFU0laRShzZWxmLT51ZmRzLCBzdHJ1Y3QgcG9sbGZkLCBzZWxmLT51ZmRfbGVuKTsKKyAgICBpZiAoc2VsZi0+dWZkcyA9PSBOVUxMKSB7CisgICAgICAgIHNlbGYtPnVmZHMgPSBvbGRfdWZkczsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaSA9IHBvcyA9IDA7Ci0Jd2hpbGUgKFB5RGljdF9OZXh0KHNlbGYtPmRpY3QsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKLQkJc2VsZi0+dWZkc1tpXS5mZCA9IFB5SW50X0FzTG9uZyhrZXkpOwotCQlzZWxmLT51ZmRzW2ldLmV2ZW50cyA9IChzaG9ydClQeUludF9Bc0xvbmcodmFsdWUpOwotCQlpKys7Ci0JfQotCXNlbGYtPnVmZF91cHRvZGF0ZSA9IDE7Ci0JcmV0dXJuIDE7CisgICAgaSA9IHBvcyA9IDA7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KHNlbGYtPmRpY3QsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgc2VsZi0+dWZkc1tpXS5mZCA9IFB5SW50X0FzTG9uZyhrZXkpOworICAgICAgICBzZWxmLT51ZmRzW2ldLmV2ZW50cyA9IChzaG9ydClQeUludF9Bc0xvbmcodmFsdWUpOworICAgICAgICBpKys7CisgICAgfQorICAgIHNlbGYtPnVmZF91cHRvZGF0ZSA9IDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIFB5RG9jX1NUUlZBUihwb2xsX3JlZ2lzdGVyX2RvYywKQEAgLTM2OSwzOSArMzY5LDM5IEBACiBldmVudHMgLS0gYW4gb3B0aW9uYWwgYml0bWFzayBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIGV2ZW50cyB0byBjaGVjayBmb3IiKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLXBvbGxfcmVnaXN0ZXIocG9sbE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIAorcG9sbF9yZWdpc3Rlcihwb2xsT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqbywgKmtleSwgKnZhbHVlOwotCWludCBmZCwgZXZlbnRzID0gUE9MTElOIHwgUE9MTFBSSSB8IFBPTExPVVQ7Ci0JaW50IGVycjsKKyAgICBQeU9iamVjdCAqbywgKmtleSwgKnZhbHVlOworICAgIGludCBmZCwgZXZlbnRzID0gUE9MTElOIHwgUE9MTFBSSSB8IFBPTExPVVQ7CisgICAgaW50IGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnJlZ2lzdGVyIiwgJm8sICZldmVudHMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLSAgCi0JZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKG8pOwotCWlmIChmZCA9PSAtMSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6cmVnaXN0ZXIiLCAmbywgJmV2ZW50cykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQWRkIGVudHJ5IHRvIHRoZSBpbnRlcm5hbCBkaWN0aW9uYXJ5OiB0aGUga2V5IGlzIHRoZSAKLQkgICBmaWxlIGRlc2NyaXB0b3IsIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGV2ZW50IG1hc2suICovCi0Ja2V5ID0gUHlJbnRfRnJvbUxvbmcoZmQpOwotCWlmIChrZXkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdmFsdWUgPSBQeUludF9Gcm9tTG9uZyhldmVudHMpOwotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihrZXkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXJyID0gUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZGljdCwga2V5LCB2YWx1ZSk7Ci0JUHlfREVDUkVGKGtleSk7Ci0JUHlfREVDUkVGKHZhbHVlKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKG8pOworICAgIGlmIChmZCA9PSAtMSkgcmV0dXJuIE5VTEw7CiAKLQlzZWxmLT51ZmRfdXB0b2RhdGUgPSAwOworICAgIC8qIEFkZCBlbnRyeSB0byB0aGUgaW50ZXJuYWwgZGljdGlvbmFyeTogdGhlIGtleSBpcyB0aGUKKyAgICAgICBmaWxlIGRlc2NyaXB0b3IsIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGV2ZW50IG1hc2suICovCisgICAga2V5ID0gUHlJbnRfRnJvbUxvbmcoZmQpOworICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdmFsdWUgPSBQeUludF9Gcm9tTG9uZyhldmVudHMpOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZGljdCwga2V5LCB2YWx1ZSk7CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgc2VsZi0+dWZkX3VwdG9kYXRlID0gMDsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHBvbGxfbW9kaWZ5X2RvYywKQEAgLTQxNCw0MSArNDE0LDQxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogcG9sbF9tb2RpZnkocG9sbE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKm8sICprZXksICp2YWx1ZTsKLQlpbnQgZmQsIGV2ZW50czsKLQlpbnQgZXJyOworICAgIFB5T2JqZWN0ICpvLCAqa2V5LCAqdmFsdWU7CisgICAgaW50IGZkLCBldmVudHM7CisgICAgaW50IGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6bW9kaWZ5IiwgJm8sICZldmVudHMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLSAgCi0JZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKG8pOwotCWlmIChmZCA9PSAtMSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTptb2RpZnkiLCAmbywgJmV2ZW50cykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogTW9kaWZ5IHJlZ2lzdGVyZWQgZmQgKi8KLQlrZXkgPSBQeUludF9Gcm9tTG9uZyhmZCk7Ci0JaWYgKGtleSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlEaWN0X0dldEl0ZW0oc2VsZi0+ZGljdCwga2V5KSA9PSBOVUxMKSB7Ci0JCWVycm5vID0gRU5PRU5UOwotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2YWx1ZSA9IFB5SW50X0Zyb21Mb25nKGV2ZW50cyk7Ci0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllcnIgPSBQeURpY3RfU2V0SXRlbShzZWxmLT5kaWN0LCBrZXksIHZhbHVlKTsKLQlQeV9ERUNSRUYoa2V5KTsKLQlQeV9ERUNSRUYodmFsdWUpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBmZCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3Iobyk7CisgICAgaWYgKGZkID09IC0xKSByZXR1cm4gTlVMTDsKIAotCXNlbGYtPnVmZF91cHRvZGF0ZSA9IDA7CisgICAgLyogTW9kaWZ5IHJlZ2lzdGVyZWQgZmQgKi8KKyAgICBrZXkgPSBQeUludF9Gcm9tTG9uZyhmZCk7CisgICAgaWYgKGtleSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X0dldEl0ZW0oc2VsZi0+ZGljdCwga2V5KSA9PSBOVUxMKSB7CisgICAgICAgIGVycm5vID0gRU5PRU5UOworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2YWx1ZSA9IFB5SW50X0Zyb21Mb25nKGV2ZW50cyk7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlcnIgPSBQeURpY3RfU2V0SXRlbShzZWxmLT5kaWN0LCBrZXksIHZhbHVlKTsKKyAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzZWxmLT51ZmRfdXB0b2RhdGUgPSAwOworCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTQ1NywzMiArNDU3LDMyIEBACiBSZW1vdmUgYSBmaWxlIGRlc2NyaXB0b3IgYmVpbmcgdHJhY2tlZCBieSB0aGUgcG9sbGluZyBvYmplY3QuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1wb2xsX3VucmVnaXN0ZXIocG9sbE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm8pIAorcG9sbF91bnJlZ2lzdGVyKHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvKQogewotCVB5T2JqZWN0ICprZXk7Ci0JaW50IGZkOworICAgIFB5T2JqZWN0ICprZXk7CisgICAgaW50IGZkOwogCi0JZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKCBvICk7Ci0JaWYgKGZkID09IC0xKSAKLQkJcmV0dXJuIE5VTEw7CisgICAgZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKCBvICk7CisgICAgaWYgKGZkID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIENoZWNrIHdoZXRoZXIgdGhlIGZkIGlzIGFscmVhZHkgaW4gdGhlIGFycmF5ICovCi0Ja2V5ID0gUHlJbnRfRnJvbUxvbmcoZmQpOwotCWlmIChrZXkgPT0gTlVMTCkgCi0JCXJldHVybiBOVUxMOworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGZkIGlzIGFscmVhZHkgaW4gdGhlIGFycmF5ICovCisgICAga2V5ID0gUHlJbnRfRnJvbUxvbmcoZmQpOworICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlEaWN0X0RlbEl0ZW0oc2VsZi0+ZGljdCwga2V5KSA9PSAtMSkgewotCQlQeV9ERUNSRUYoa2V5KTsKLQkJLyogVGhpcyB3aWxsIHNpbXBseSByYWlzZSB0aGUgS2V5RXJyb3Igc2V0IGJ5IFB5RGljdF9EZWxJdGVtCi0JCSAgIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXNuJ3QgcmVnaXN0ZXJlZC4gKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeURpY3RfRGVsSXRlbShzZWxmLT5kaWN0LCBrZXkpID09IC0xKSB7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAvKiBUaGlzIHdpbGwgc2ltcGx5IHJhaXNlIHRoZSBLZXlFcnJvciBzZXQgYnkgUHlEaWN0X0RlbEl0ZW0KKyAgICAgICAgICAgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciBpc24ndCByZWdpc3RlcmVkLiAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9ERUNSRUYoa2V5KTsKLQlzZWxmLT51ZmRfdXB0b2RhdGUgPSAwOworICAgIFB5X0RFQ1JFRihrZXkpOworICAgIHNlbGYtPnVmZF91cHRvZGF0ZSA9IDA7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIocG9sbF9wb2xsX2RvYywKQEAgLTQ5MSwxNjEgKzQ5MSwxNjEgQEAKIGFueSBkZXNjcmlwdG9ycyB0aGF0IGhhdmUgZXZlbnRzIG9yIGVycm9ycyB0byByZXBvcnQuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1wb2xsX3BvbGwocG9sbE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIAorcG9sbF9wb2xsKHBvbGxPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZXN1bHRfbGlzdCA9IE5VTEwsICp0b3V0ID0gTlVMTDsKLQlpbnQgdGltZW91dCA9IDAsIHBvbGxfcmVzdWx0LCBpLCBqOwotCVB5T2JqZWN0ICp2YWx1ZSA9IE5VTEwsICpudW0gPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHRfbGlzdCA9IE5VTEwsICp0b3V0ID0gTlVMTDsKKyAgICBpbnQgdGltZW91dCA9IDAsIHBvbGxfcmVzdWx0LCBpLCBqOworICAgIFB5T2JqZWN0ICp2YWx1ZSA9IE5VTEwsICpudW0gPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicG9sbCIsIDAsIDEsICZ0b3V0KSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicG9sbCIsIDAsIDEsICZ0b3V0KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBDaGVjayB2YWx1ZXMgZm9yIHRpbWVvdXQgKi8KLQlpZiAodG91dCA9PSBOVUxMIHx8IHRvdXQgPT0gUHlfTm9uZSkKLQkJdGltZW91dCA9IC0xOwotCWVsc2UgaWYgKCFQeU51bWJlcl9DaGVjayh0b3V0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0aW1lb3V0IG11c3QgYmUgYW4gaW50ZWdlciBvciBOb25lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJdG91dCA9IFB5TnVtYmVyX0ludCh0b3V0KTsKLQkJaWYgKCF0b3V0KQotCQkJcmV0dXJuIE5VTEw7Ci0JCXRpbWVvdXQgPSBQeUludF9Bc0xvbmcodG91dCk7Ci0JCVB5X0RFQ1JFRih0b3V0KTsKLQkJaWYgKHRpbWVvdXQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBDaGVjayB2YWx1ZXMgZm9yIHRpbWVvdXQgKi8KKyAgICBpZiAodG91dCA9PSBOVUxMIHx8IHRvdXQgPT0gUHlfTm9uZSkKKyAgICAgICAgdGltZW91dCA9IC0xOworICAgIGVsc2UgaWYgKCFQeU51bWJlcl9DaGVjayh0b3V0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgbXVzdCBiZSBhbiBpbnRlZ2VyIG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0b3V0ID0gUHlOdW1iZXJfSW50KHRvdXQpOworICAgICAgICBpZiAoIXRvdXQpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdGltZW91dCA9IFB5SW50X0FzTG9uZyh0b3V0KTsKKyAgICAgICAgUHlfREVDUkVGKHRvdXQpOworICAgICAgICBpZiAodGltZW91dCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogRW5zdXJlIHRoZSB1ZmQgYXJyYXkgaXMgdXAgdG8gZGF0ZSAqLwotCWlmICghc2VsZi0+dWZkX3VwdG9kYXRlKSAKLQkJaWYgKHVwZGF0ZV91ZmRfYXJyYXkoc2VsZikgPT0gMCkKLQkJCXJldHVybiBOVUxMOworICAgIC8qIEVuc3VyZSB0aGUgdWZkIGFycmF5IGlzIHVwIHRvIGRhdGUgKi8KKyAgICBpZiAoIXNlbGYtPnVmZF91cHRvZGF0ZSkKKyAgICAgICAgaWYgKHVwZGF0ZV91ZmRfYXJyYXkoc2VsZikgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogY2FsbCBwb2xsKCkgKi8KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcG9sbF9yZXN1bHQgPSBwb2xsKHNlbGYtPnVmZHMsIHNlbGYtPnVmZF9sZW4sIHRpbWVvdXQpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0gCi0JaWYgKHBvbGxfcmVzdWx0IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oU2VsZWN0RXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9IAotICAgICAgIAotCS8qIGJ1aWxkIHRoZSByZXN1bHQgbGlzdCAqLwotICAKLQlyZXN1bHRfbGlzdCA9IFB5TGlzdF9OZXcocG9sbF9yZXN1bHQpOwotCWlmICghcmVzdWx0X2xpc3QpIAotCQlyZXR1cm4gTlVMTDsKLQllbHNlIHsKLQkJZm9yIChpID0gMCwgaiA9IDA7IGogPCBwb2xsX3Jlc3VsdDsgaisrKSB7Ci0gCQkJLyogc2tpcCB0byB0aGUgbmV4dCBmaXJlZCBkZXNjcmlwdG9yICovCi0gCQkJd2hpbGUgKCFzZWxmLT51ZmRzW2ldLnJldmVudHMpIHsKLSAJCQkJaSsrOwotIAkJCX0KLQkJCS8qIGlmIHdlIGhpdCBhIE5VTEwgcmV0dXJuLCBzZXQgdmFsdWUgdG8gTlVMTAotCQkJICAgYW5kIGJyZWFrIG91dCBvZiBsb29wOyBjb2RlIGF0IGVuZCB3aWxsCi0JCQkgICBjbGVhbiB1cCByZXN1bHRfbGlzdCAqLwotCQkJdmFsdWUgPSBQeVR1cGxlX05ldygyKTsKLQkJCWlmICh2YWx1ZSA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQludW0gPSBQeUludF9Gcm9tTG9uZyhzZWxmLT51ZmRzW2ldLmZkKTsKLQkJCWlmIChudW0gPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCVB5VHVwbGVfU0VUX0lURU0odmFsdWUsIDAsIG51bSk7CisgICAgLyogY2FsbCBwb2xsKCkgKi8KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcG9sbF9yZXN1bHQgPSBwb2xsKHNlbGYtPnVmZHMsIHNlbGYtPnVmZF9sZW4sIHRpbWVvdXQpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQkJCS8qIFRoZSAmMHhmZmZmIGlzIGEgd29ya2Fyb3VuZCBmb3IgQUlYLiAgJ3JldmVudHMnCi0JCQkgICBpcyBhIDE2LWJpdCBzaG9ydCwgYW5kIElCTSBhc3NpZ25lZCBQT0xMTlZBTAotCQkJICAgdG8gYmUgMHg4MDAwLCBzbyB0aGUgY29udmVyc2lvbiB0byBpbnQgcmVzdWx0cwotCQkJICAgaW4gYSBuZWdhdGl2ZSBudW1iZXIuIFNlZSBTRiBidWcgIzkyMzMxNS4gKi8KLQkJCW51bSA9IFB5SW50X0Zyb21Mb25nKHNlbGYtPnVmZHNbaV0ucmV2ZW50cyAmIDB4ZmZmZik7Ci0JCQlpZiAobnVtID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHZhbHVlLCAxLCBudW0pOwotIAkJCWlmICgoUHlMaXN0X1NldEl0ZW0ocmVzdWx0X2xpc3QsIGosIHZhbHVlKSkgPT0gLTEpIHsKLQkJCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJCWdvdG8gZXJyb3I7Ci0gCQkJfQotIAkJCWkrKzsKLSAJCX0KLSAJfQotIAlyZXR1cm4gcmVzdWx0X2xpc3Q7CisgICAgaWYgKHBvbGxfcmVzdWx0IDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU2VsZWN0RXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBidWlsZCB0aGUgcmVzdWx0IGxpc3QgKi8KKworICAgIHJlc3VsdF9saXN0ID0gUHlMaXN0X05ldyhwb2xsX3Jlc3VsdCk7CisgICAgaWYgKCFyZXN1bHRfbGlzdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBqIDwgcG9sbF9yZXN1bHQ7IGorKykgeworICAgICAgICAgICAgLyogc2tpcCB0byB0aGUgbmV4dCBmaXJlZCBkZXNjcmlwdG9yICovCisgICAgICAgICAgICB3aGlsZSAoIXNlbGYtPnVmZHNbaV0ucmV2ZW50cykgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGlmIHdlIGhpdCBhIE5VTEwgcmV0dXJuLCBzZXQgdmFsdWUgdG8gTlVMTAorICAgICAgICAgICAgICAgYW5kIGJyZWFrIG91dCBvZiBsb29wOyBjb2RlIGF0IGVuZCB3aWxsCisgICAgICAgICAgICAgICBjbGVhbiB1cCByZXN1bHRfbGlzdCAqLworICAgICAgICAgICAgdmFsdWUgPSBQeVR1cGxlX05ldygyKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBudW0gPSBQeUludF9Gcm9tTG9uZyhzZWxmLT51ZmRzW2ldLmZkKTsKKyAgICAgICAgICAgIGlmIChudW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odmFsdWUsIDAsIG51bSk7CisKKyAgICAgICAgICAgIC8qIFRoZSAmMHhmZmZmIGlzIGEgd29ya2Fyb3VuZCBmb3IgQUlYLiAgJ3JldmVudHMnCisgICAgICAgICAgICAgICBpcyBhIDE2LWJpdCBzaG9ydCwgYW5kIElCTSBhc3NpZ25lZCBQT0xMTlZBTAorICAgICAgICAgICAgICAgdG8gYmUgMHg4MDAwLCBzbyB0aGUgY29udmVyc2lvbiB0byBpbnQgcmVzdWx0cworICAgICAgICAgICAgICAgaW4gYSBuZWdhdGl2ZSBudW1iZXIuIFNlZSBTRiBidWcgIzkyMzMxNS4gKi8KKyAgICAgICAgICAgIG51bSA9IFB5SW50X0Zyb21Mb25nKHNlbGYtPnVmZHNbaV0ucmV2ZW50cyAmIDB4ZmZmZik7CisgICAgICAgICAgICBpZiAobnVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHZhbHVlLCAxLCBudW0pOworICAgICAgICAgICAgaWYgKChQeUxpc3RfU2V0SXRlbShyZXN1bHRfbGlzdCwgaiwgdmFsdWUpKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0X2xpc3Q7CiAKICAgZXJyb3I6Ci0JUHlfREVDUkVGKHJlc3VsdF9saXN0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0X2xpc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgcG9sbF9tZXRob2RzW10gPSB7Ci0JeyJyZWdpc3RlciIsCShQeUNGdW5jdGlvbilwb2xsX3JlZ2lzdGVyLAkKLQkgTUVUSF9WQVJBUkdTLCAgcG9sbF9yZWdpc3Rlcl9kb2N9LAotCXsibW9kaWZ5IiwJKFB5Q0Z1bmN0aW9uKXBvbGxfbW9kaWZ5LAotCSBNRVRIX1ZBUkFSR1MsICBwb2xsX21vZGlmeV9kb2N9LAotCXsidW5yZWdpc3RlciIsCShQeUNGdW5jdGlvbilwb2xsX3VucmVnaXN0ZXIsCi0JIE1FVEhfTywgICAgICAgIHBvbGxfdW5yZWdpc3Rlcl9kb2N9LAotCXsicG9sbCIsCShQeUNGdW5jdGlvbilwb2xsX3BvbGwsCQotCSBNRVRIX1ZBUkFSR1MsICBwb2xsX3BvbGxfZG9jfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsicmVnaXN0ZXIiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXBvbGxfcmVnaXN0ZXIsCisgICAgIE1FVEhfVkFSQVJHUywgIHBvbGxfcmVnaXN0ZXJfZG9jfSwKKyAgICB7Im1vZGlmeSIsICAgICAgICAgIChQeUNGdW5jdGlvbilwb2xsX21vZGlmeSwKKyAgICAgTUVUSF9WQVJBUkdTLCAgcG9sbF9tb2RpZnlfZG9jfSwKKyAgICB7InVucmVnaXN0ZXIiLCAgICAgIChQeUNGdW5jdGlvbilwb2xsX3VucmVnaXN0ZXIsCisgICAgIE1FVEhfTywgICAgICAgIHBvbGxfdW5yZWdpc3Rlcl9kb2N9LAorICAgIHsicG9sbCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXBvbGxfcG9sbCwKKyAgICAgTUVUSF9WQVJBUkdTLCAgcG9sbF9wb2xsX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBwb2xsT2JqZWN0ICoKIG5ld1BvbGxPYmplY3Qodm9pZCkKIHsKLSAgICAgICAgcG9sbE9iamVjdCAqc2VsZjsKLQlzZWxmID0gUHlPYmplY3RfTmV3KHBvbGxPYmplY3QsICZwb2xsX1R5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCS8qIHVmZF91cHRvZGF0ZSBpcyBhIEJvb2xlYW4sIGRlbm90aW5nIHdoZXRoZXIgdGhlIAotCSAgIGFycmF5IHBvaW50ZWQgdG8gYnkgdWZkcyBtYXRjaGVzIHRoZSBjb250ZW50cyBvZiB0aGUgZGljdGlvbmFyeS4gKi8KLQlzZWxmLT51ZmRfdXB0b2RhdGUgPSAwOwotCXNlbGYtPnVmZHMgPSBOVUxMOwotCXNlbGYtPmRpY3QgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKHNlbGYtPmRpY3QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoc2VsZik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBwb2xsT2JqZWN0ICpzZWxmOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcocG9sbE9iamVjdCwgJnBvbGxfVHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogdWZkX3VwdG9kYXRlIGlzIGEgQm9vbGVhbiwgZGVub3Rpbmcgd2hldGhlciB0aGUKKyAgICAgICBhcnJheSBwb2ludGVkIHRvIGJ5IHVmZHMgbWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlIGRpY3Rpb25hcnkuICovCisgICAgc2VsZi0+dWZkX3VwdG9kYXRlID0gMDsKKyAgICBzZWxmLT51ZmRzID0gTlVMTDsKKyAgICBzZWxmLT5kaWN0ID0gUHlEaWN0X05ldygpOworICAgIGlmIChzZWxmLT5kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyB2b2lkCiBwb2xsX2RlYWxsb2MocG9sbE9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+dWZkcyAhPSBOVUxMKQotCQlQeU1lbV9ERUwoc2VsZi0+dWZkcyk7Ci0JUHlfWERFQ1JFRihzZWxmLT5kaWN0KTsKLSAgCVB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBpZiAoc2VsZi0+dWZkcyAhPSBOVUxMKQorICAgICAgICBQeU1lbV9ERUwoc2VsZi0+dWZkcyk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5kaWN0KTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwb2xsX2dldGF0dHIocG9sbE9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChwb2xsX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKHBvbGxfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgcG9sbF9UeXBlID0gewotCS8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCi0JICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkic2VsZWN0LnBvbGwiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YocG9sbE9iamVjdCksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvcilwb2xsX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpcG9sbF9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCisgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KKyAgICAgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJzZWxlY3QucG9sbCIsICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihwb2xsT2JqZWN0KSwgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilwb2xsX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylwb2xsX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KIH07CiAKIFB5RG9jX1NUUlZBUihwb2xsX2RvYywKQEAgLTY1NSwzNiArNjU1LDM2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2VsZWN0X3BvbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld1BvbGxPYmplY3QoKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3UG9sbE9iamVjdCgpOwogfQogCiAjaWZkZWYgX19BUFBMRV9fCi0vKiAKKy8qCiAgKiBPbiBzb21lIHN5c3RlbXMgcG9sbCgpIHNldHMgZXJybm8gb24gaW52YWxpZCBmaWxlIGRlc2NyaXB0b3JzLiBXZSB0ZXN0CiAgKiBmb3IgdGhpcyBhdCBydW50aW1lIGJlY2F1c2UgdGhpcyBidWcgbWF5IGJlIGZpeGVkIG9yIGludHJvZHVjZWQgYmV0d2VlbgogICogT1MgcmVsZWFzZXMuCiAgKi8KIHN0YXRpYyBpbnQgc2VsZWN0X2hhdmVfYnJva2VuX3BvbGwodm9pZCkKIHsKLQlpbnQgcG9sbF90ZXN0OwotCWludCBmaWxlZGVzWzJdOworICAgIGludCBwb2xsX3Rlc3Q7CisgICAgaW50IGZpbGVkZXNbMl07CiAKLQlzdHJ1Y3QgcG9sbGZkIHBvbGxfc3RydWN0ID0geyAwLCBQT0xMSU58UE9MTFBSSXxQT0xMT1VULCAwIH07CisgICAgc3RydWN0IHBvbGxmZCBwb2xsX3N0cnVjdCA9IHsgMCwgUE9MTElOfFBPTExQUkl8UE9MTE9VVCwgMCB9OwogCi0JLyogQ3JlYXRlIGEgZmlsZSBkZXNjcmlwdG9yIHRvIG1ha2UgaW52YWxpZCAqLwotCWlmIChwaXBlKGZpbGVkZXMpIDwgMCkgewotCQlyZXR1cm4gMTsKLQl9Ci0JcG9sbF9zdHJ1Y3QuZmQgPSBmaWxlZGVzWzBdOwotCWNsb3NlKGZpbGVkZXNbMF0pOwotCWNsb3NlKGZpbGVkZXNbMV0pOwotCXBvbGxfdGVzdCA9IHBvbGwoJnBvbGxfc3RydWN0LCAxLCAwKTsKLQlpZiAocG9sbF90ZXN0IDwgMCkgewotCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKHBvbGxfdGVzdCA9PSAwICYmIHBvbGxfc3RydWN0LnJldmVudHMgIT0gUE9MTE5WQUwpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgIC8qIENyZWF0ZSBhIGZpbGUgZGVzY3JpcHRvciB0byBtYWtlIGludmFsaWQgKi8KKyAgICBpZiAocGlwZShmaWxlZGVzKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHBvbGxfc3RydWN0LmZkID0gZmlsZWRlc1swXTsKKyAgICBjbG9zZShmaWxlZGVzWzBdKTsKKyAgICBjbG9zZShmaWxlZGVzWzFdKTsKKyAgICBwb2xsX3Rlc3QgPSBwb2xsKCZwb2xsX3N0cnVjdCwgMSwgMCk7CisgICAgaWYgKHBvbGxfdGVzdCA8IDApIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIGlmIChwb2xsX3Rlc3QgPT0gMCAmJiBwb2xsX3N0cnVjdC5yZXZlbnRzICE9IFBPTExOVkFMKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBfX0FQUExFX18gKi8KIApAQCAtNzAzLDggKzcwMyw4IEBACiAjZW5kaWYKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlTT0NLRVQgZXBmZDsJCQkvKiBlcG9sbCBjb250cm9sIGZpbGUgZGVzY3JpcHRvciAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBTT0NLRVQgZXBmZDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcG9sbCBjb250cm9sIGZpbGUgZGVzY3JpcHRvciAqLwogfSBweUVwb2xsX09iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBweUVwb2xsX1R5cGU7CkBAIC03MTMsOTIgKzcxMyw5MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5ZXBvbGxfZXJyX2Nsb3NlZCh2b2lkKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZXBvbGwgZmQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGVwb2xsIGZkIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIHB5ZXBvbGxfaW50ZXJuYWxfY2xvc2UocHlFcG9sbF9PYmplY3QgKnNlbGYpCiB7Ci0JaW50IHNhdmVfZXJybm8gPSAwOwotCWlmIChzZWxmLT5lcGZkID49IDApIHsKLQkJaW50IGVwZmQgPSBzZWxmLT5lcGZkOwotCQlzZWxmLT5lcGZkID0gLTE7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJaWYgKGNsb3NlKGVwZmQpIDwgMCkKLQkJCXNhdmVfZXJybm8gPSBlcnJubzsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9Ci0JcmV0dXJuIHNhdmVfZXJybm87CisgICAgaW50IHNhdmVfZXJybm8gPSAwOworICAgIGlmIChzZWxmLT5lcGZkID49IDApIHsKKyAgICAgICAgaW50IGVwZmQgPSBzZWxmLT5lcGZkOworICAgICAgICBzZWxmLT5lcGZkID0gLTE7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYgKGNsb3NlKGVwZmQpIDwgMCkKKyAgICAgICAgICAgIHNhdmVfZXJybm8gPSBlcnJubzsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgcmV0dXJuIHNhdmVfZXJybm87CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdQeUVwb2xsX09iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIGludCBzaXplaGludCwgU09DS0VUIGZkKQogewotCXB5RXBvbGxfT2JqZWN0ICpzZWxmOwotCQotCWlmIChzaXplaGludCA9PSAtMSkgewotCQlzaXplaGludCA9IEZEX1NFVFNJWkUtMTsKLQl9Ci0JZWxzZSBpZiAoc2l6ZWhpbnQgPCAxKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAic2l6ZWhpbnQgbXVzdCBiZSBncmVhdGVyIHplcm8sIGdvdCAlZCIsCi0JCQkgICAgIHNpemVoaW50KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHB5RXBvbGxfT2JqZWN0ICpzZWxmOwogCi0JYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKLQlzZWxmID0gKHB5RXBvbGxfT2JqZWN0ICopIHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChzaXplaGludCA9PSAtMSkgeworICAgICAgICBzaXplaGludCA9IEZEX1NFVFNJWkUtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2l6ZWhpbnQgPCAxKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInNpemVoaW50IG11c3QgYmUgZ3JlYXRlciB6ZXJvLCBnb3QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZWhpbnQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZmQgPT0gLTEpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlzZWxmLT5lcGZkID0gZXBvbGxfY3JlYXRlKHNpemVoaW50KTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9Ci0JZWxzZSB7Ci0JCXNlbGYtPmVwZmQgPSBmZDsKLQl9Ci0JaWYgKHNlbGYtPmVwZmQgPCAwKSB7Ci0JCVB5X0RFQ1JFRihzZWxmKTsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKKyAgICBzZWxmID0gKHB5RXBvbGxfT2JqZWN0ICopIHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGZkID09IC0xKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgc2VsZi0+ZXBmZCA9IGVwb2xsX2NyZWF0ZShzaXplaGludCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzZWxmLT5lcGZkID0gZmQ7CisgICAgfQorICAgIGlmIChzZWxmLT5lcGZkIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBweWVwb2xsX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbnQgc2l6ZWhpbnQgPSAtMTsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNpemVoaW50IiwgTlVMTH07CisgICAgaW50IHNpemVoaW50ID0gLTE7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzaXplaGludCIsIE5VTEx9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxpOmVwb2xsIiwga3dsaXN0LAotCQkJCQkgJnNpemVoaW50KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxpOmVwb2xsIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplaGludCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIG5ld1B5RXBvbGxfT2JqZWN0KHR5cGUsIHNpemVoaW50LCAtMSk7CisgICAgcmV0dXJuIG5ld1B5RXBvbGxfT2JqZWN0KHR5cGUsIHNpemVoaW50LCAtMSk7CiB9CiAKIAogc3RhdGljIHZvaWQKIHB5ZXBvbGxfZGVhbGxvYyhweUVwb2xsX09iamVjdCAqc2VsZikKIHsKLQkodm9pZClweWVwb2xsX2ludGVybmFsX2Nsb3NlKHNlbGYpOwotCVB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoc2VsZik7CisgICAgKHZvaWQpcHllcG9sbF9pbnRlcm5hbF9jbG9zZShzZWxmKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBweWVwb2xsX2Nsb3NlKHB5RXBvbGxfT2JqZWN0ICpzZWxmKQogewotCWVycm5vID0gcHllcG9sbF9pbnRlcm5hbF9jbG9zZShzZWxmKTsKLQlpZiAoZXJybm8gPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X1JFVFVSTl9OT05FOworICAgIGVycm5vID0gcHllcG9sbF9pbnRlcm5hbF9jbG9zZShzZWxmKTsKKyAgICBpZiAoZXJybm8gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIocHllcG9sbF9jbG9zZV9kb2MsCkBAIC04MTAsMTggKzgxMCwxOCBAQAogc3RhdGljIFB5T2JqZWN0KgogcHllcG9sbF9nZXRfY2xvc2VkKHB5RXBvbGxfT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5lcGZkIDwgMCkKLQkJUHlfUkVUVVJOX1RSVUU7Ci0JZWxzZQotCQlQeV9SRVRVUk5fRkFMU0U7CisgICAgaWYgKHNlbGYtPmVwZmQgPCAwKQorICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICBlbHNlCisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogcHllcG9sbF9maWxlbm8ocHlFcG9sbF9PYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmVwZmQgPCAwKQotCQlyZXR1cm4gcHllcG9sbF9lcnJfY2xvc2VkKCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPmVwZmQpOworICAgIGlmIChzZWxmLT5lcGZkIDwgMCkKKyAgICAgICAgcmV0dXJuIHB5ZXBvbGxfZXJyX2Nsb3NlZCgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5lcGZkKTsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfZmlsZW5vX2RvYywKQEAgLTgzMiwxMiArODMyLDEyIEBACiBzdGF0aWMgUHlPYmplY3QqCiBweWVwb2xsX2Zyb21mZChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLQlTT0NLRVQgZmQ7CisgICAgU09DS0VUIGZkOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmZyb21mZCIsICZmZCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpmcm9tZmQiLCAmZmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBuZXdQeUVwb2xsX09iamVjdCgoUHlUeXBlT2JqZWN0KiljbHMsIC0xLCBmZCk7CisgICAgcmV0dXJuIG5ld1B5RXBvbGxfT2JqZWN0KChQeVR5cGVPYmplY3QqKWNscywgLTEsIGZkKTsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfZnJvbWZkX2RvYywKQEAgLTg0OCw2NSArODQ4LDY1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogcHllcG9sbF9pbnRlcm5hbF9jdGwoaW50IGVwZmQsIGludCBvcCwgUHlPYmplY3QgKnBmZCwgdW5zaWduZWQgaW50IGV2ZW50cykKIHsKLQlzdHJ1Y3QgZXBvbGxfZXZlbnQgZXY7Ci0JaW50IHJlc3VsdDsKLQlpbnQgZmQ7CisgICAgc3RydWN0IGVwb2xsX2V2ZW50IGV2OworICAgIGludCByZXN1bHQ7CisgICAgaW50IGZkOwogCi0JaWYgKGVwZmQgPCAwKQotCQlyZXR1cm4gcHllcG9sbF9lcnJfY2xvc2VkKCk7CisgICAgaWYgKGVwZmQgPCAwKQorICAgICAgICByZXR1cm4gcHllcG9sbF9lcnJfY2xvc2VkKCk7CiAKLQlmZCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IocGZkKTsKLQlpZiAoZmQgPT0gLTEpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihwZmQpOworICAgIGlmIChmZCA9PSAtMSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzd2l0Y2gob3ApIHsKLQkgICAgY2FzZSBFUE9MTF9DVExfQUREOgotCSAgICBjYXNlIEVQT0xMX0NUTF9NT0Q6Ci0JCWV2LmV2ZW50cyA9IGV2ZW50czsKLQkJZXYuZGF0YS5mZCA9IGZkOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXJlc3VsdCA9IGVwb2xsX2N0bChlcGZkLCBvcCwgZmQsICZldik7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWJyZWFrOwotCSAgICBjYXNlIEVQT0xMX0NUTF9ERUw6Ci0JCS8qIEluIGtlcm5lbCB2ZXJzaW9ucyBiZWZvcmUgMi42LjksIHRoZSBFUE9MTF9DVExfREVMCi0JCSAqIG9wZXJhdGlvbiByZXF1aXJlZCBhIG5vbi1OVUxMIHBvaW50ZXIgaW4gZXZlbnQsIGV2ZW4KLQkJICogdGhvdWdoIHRoaXMgYXJndW1lbnQgaXMgaWdub3JlZC4gKi8KLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlyZXN1bHQgPSBlcG9sbF9jdGwoZXBmZCwgb3AsIGZkLCAmZXYpOwotCQlpZiAoZXJybm8gPT0gRUJBREYpIHsKLQkJCS8qIGZkIGFscmVhZHkgY2xvc2VkICovCi0JCQlyZXN1bHQgPSAwOwotCQkJZXJybm8gPSAwOwotCQl9Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlyZXN1bHQgPSAtMTsKLQkJZXJybm8gPSBFSU5WQUw7Ci0JfQorICAgIHN3aXRjaChvcCkgeworICAgICAgICBjYXNlIEVQT0xMX0NUTF9BREQ6CisgICAgICAgIGNhc2UgRVBPTExfQ1RMX01PRDoKKyAgICAgICAgZXYuZXZlbnRzID0gZXZlbnRzOworICAgICAgICBldi5kYXRhLmZkID0gZmQ7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmVzdWx0ID0gZXBvbGxfY3RsKGVwZmQsIG9wLCBmZCwgJmV2KTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVBPTExfQ1RMX0RFTDoKKyAgICAgICAgLyogSW4ga2VybmVsIHZlcnNpb25zIGJlZm9yZSAyLjYuOSwgdGhlIEVQT0xMX0NUTF9ERUwKKyAgICAgICAgICogb3BlcmF0aW9uIHJlcXVpcmVkIGEgbm9uLU5VTEwgcG9pbnRlciBpbiBldmVudCwgZXZlbgorICAgICAgICAgKiB0aG91Z2ggdGhpcyBhcmd1bWVudCBpcyBpZ25vcmVkLiAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHJlc3VsdCA9IGVwb2xsX2N0bChlcGZkLCBvcCwgZmQsICZldik7CisgICAgICAgIGlmIChlcnJubyA9PSBFQkFERikgeworICAgICAgICAgICAgLyogZmQgYWxyZWFkeSBjbG9zZWQgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICB9CiAKLQlpZiAocmVzdWx0IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHB5ZXBvbGxfcmVnaXN0ZXIocHlFcG9sbF9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqcGZkOwotCXVuc2lnbmVkIGludCBldmVudHMgPSBFUE9MTElOIHwgRVBPTExPVVQgfCBFUE9MTFBSSTsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZkIiwgImV2ZW50bWFzayIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpwZmQ7CisgICAgdW5zaWduZWQgaW50IGV2ZW50cyA9IEVQT0xMSU4gfCBFUE9MTE9VVCB8IEVQT0xMUFJJOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmQiLCAiZXZlbnRtYXNrIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xJOnJlZ2lzdGVyIiwga3dsaXN0LAotCQkJCQkgJnBmZCwgJmV2ZW50cykpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfEk6cmVnaXN0ZXIiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBmZCwgJmV2ZW50cykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9BREQsIHBmZCwgZXZlbnRzKTsKKyAgICByZXR1cm4gcHllcG9sbF9pbnRlcm5hbF9jdGwoc2VsZi0+ZXBmZCwgRVBPTExfQ1RMX0FERCwgcGZkLCBldmVudHMpOwogfQogCiBQeURvY19TVFJWQVIocHllcG9sbF9yZWdpc3Rlcl9kb2MsCkBAIC05MjMsMTYgKzkyMywxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5ZXBvbGxfbW9kaWZ5KHB5RXBvbGxfT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnBmZDsKLQl1bnNpZ25lZCBpbnQgZXZlbnRzOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmQiLCAiZXZlbnRtYXNrIiwgTlVMTH07CisgICAgUHlPYmplY3QgKnBmZDsKKyAgICB1bnNpZ25lZCBpbnQgZXZlbnRzOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmQiLCAiZXZlbnRtYXNrIiwgTlVMTH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT0k6bW9kaWZ5Iiwga3dsaXN0LAotCQkJCQkgJnBmZCwgJmV2ZW50cykpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPSTptb2RpZnkiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBmZCwgJmV2ZW50cykpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHB5ZXBvbGxfaW50ZXJuYWxfY3RsKHNlbGYtPmVwZmQsIEVQT0xMX0NUTF9NT0QsIHBmZCwgZXZlbnRzKTsKKyAgICByZXR1cm4gcHllcG9sbF9pbnRlcm5hbF9jdGwoc2VsZi0+ZXBmZCwgRVBPTExfQ1RMX01PRCwgcGZkLCBldmVudHMpOwogfQogCiBQeURvY19TVFJWQVIocHllcG9sbF9tb2RpZnlfZG9jLApAQCAtOTQ0LDE1ICs5NDQsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBweWVwb2xsX3VucmVnaXN0ZXIocHlFcG9sbF9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqcGZkOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmQiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqcGZkOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmQiLCBOVUxMfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPOnVucmVnaXN0ZXIiLCBrd2xpc3QsCi0JCQkJCSAmcGZkKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk86dW5yZWdpc3RlciIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGZkKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gcHllcG9sbF9pbnRlcm5hbF9jdGwoc2VsZi0+ZXBmZCwgRVBPTExfQ1RMX0RFTCwgcGZkLCAwKTsKKyAgICByZXR1cm4gcHllcG9sbF9pbnRlcm5hbF9jdGwoc2VsZi0+ZXBmZCwgRVBPTExfQ1RMX0RFTCwgcGZkLCAwKTsKIH0KIAogUHlEb2NfU1RSVkFSKHB5ZXBvbGxfdW5yZWdpc3Rlcl9kb2MsCkBAIC05NjMsNzYgKzk2Myw3NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHB5ZXBvbGxfcG9sbChweUVwb2xsX09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWRvdWJsZSBkdGltZW91dCA9IC0xLjsKLQlpbnQgdGltZW91dDsKLQlpbnQgbWF4ZXZlbnRzID0gLTE7Ci0JaW50IG5mZHMsIGk7Ci0JUHlPYmplY3QgKmVsaXN0ID0gTlVMTCwgKmV0dXBsZSA9IE5VTEw7Ci0Jc3RydWN0IGVwb2xsX2V2ZW50ICpldnMgPSBOVUxMOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsidGltZW91dCIsICJtYXhldmVudHMiLCBOVUxMfTsKKyAgICBkb3VibGUgZHRpbWVvdXQgPSAtMS47CisgICAgaW50IHRpbWVvdXQ7CisgICAgaW50IG1heGV2ZW50cyA9IC0xOworICAgIGludCBuZmRzLCBpOworICAgIFB5T2JqZWN0ICplbGlzdCA9IE5VTEwsICpldHVwbGUgPSBOVUxMOworICAgIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZzID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InRpbWVvdXQiLCAibWF4ZXZlbnRzIiwgTlVMTH07CiAKLQlpZiAoc2VsZi0+ZXBmZCA8IDApCi0JCXJldHVybiBweWVwb2xsX2Vycl9jbG9zZWQoKTsKKyAgICBpZiAoc2VsZi0+ZXBmZCA8IDApCisgICAgICAgIHJldHVybiBweWVwb2xsX2Vycl9jbG9zZWQoKTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8ZGk6cG9sbCIsIGt3bGlzdCwKLQkJCQkJICZkdGltZW91dCwgJm1heGV2ZW50cykpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8ZGk6cG9sbCIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHRpbWVvdXQsICZtYXhldmVudHMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChkdGltZW91dCA8IDApIHsKLQkJdGltZW91dCA9IC0xOwotCX0KLQllbHNlIGlmIChkdGltZW91dCAqIDEwMDAuMCA+IElOVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInRpbWVvdXQgaXMgdG9vIGxhcmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkJdGltZW91dCA9IChpbnQpKGR0aW1lb3V0ICogMTAwMC4wKTsKLQl9CisgICAgaWYgKGR0aW1lb3V0IDwgMCkgeworICAgICAgICB0aW1lb3V0ID0gLTE7CisgICAgfQorICAgIGVsc2UgaWYgKGR0aW1lb3V0ICogMTAwMC4wID4gSU5UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IGlzIHRvbyBsYXJnZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRpbWVvdXQgPSAoaW50KShkdGltZW91dCAqIDEwMDAuMCk7CisgICAgfQogCi0JaWYgKG1heGV2ZW50cyA9PSAtMSkgewotCQltYXhldmVudHMgPSBGRF9TRVRTSVpFLTE7Ci0JfQotCWVsc2UgaWYgKG1heGV2ZW50cyA8IDEpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJtYXhldmVudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCwgZ290ICVkIiwKLQkJCSAgICAgbWF4ZXZlbnRzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChtYXhldmVudHMgPT0gLTEpIHsKKyAgICAgICAgbWF4ZXZlbnRzID0gRkRfU0VUU0laRS0xOworICAgIH0KKyAgICBlbHNlIGlmIChtYXhldmVudHMgPCAxKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm1heGV2ZW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLCBnb3QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgbWF4ZXZlbnRzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZXZzID0gUHlNZW1fTmV3KHN0cnVjdCBlcG9sbF9ldmVudCwgbWF4ZXZlbnRzKTsKLQlpZiAoZXZzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHNlbGYpOwotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZXZzID0gUHlNZW1fTmV3KHN0cnVjdCBlcG9sbF9ldmVudCwgbWF4ZXZlbnRzKTsKKyAgICBpZiAoZXZzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYpOworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JbmZkcyA9IGVwb2xsX3dhaXQoc2VsZi0+ZXBmZCwgZXZzLCBtYXhldmVudHMsIHRpbWVvdXQpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKG5mZHMgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIG5mZHMgPSBlcG9sbF93YWl0KHNlbGYtPmVwZmQsIGV2cywgbWF4ZXZlbnRzLCB0aW1lb3V0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChuZmRzIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JZWxpc3QgPSBQeUxpc3RfTmV3KG5mZHMpOwotCWlmIChlbGlzdCA9PSBOVUxMKSB7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGVsaXN0ID0gUHlMaXN0X05ldyhuZmRzKTsKKyAgICBpZiAoZWxpc3QgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKLQkJZXR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiaUkiLCBldnNbaV0uZGF0YS5mZCwgZXZzW2ldLmV2ZW50cyk7Ci0JCWlmIChldHVwbGUgPT0gTlVMTCkgewotCQkJUHlfQ0xFQVIoZWxpc3QpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlQeUxpc3RfU0VUX0lURU0oZWxpc3QsIGksIGV0dXBsZSk7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKKyAgICAgICAgZXR1cGxlID0gUHlfQnVpbGRWYWx1ZSgiaUkiLCBldnNbaV0uZGF0YS5mZCwgZXZzW2ldLmV2ZW50cyk7CisgICAgICAgIGlmIChldHVwbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfQ0xFQVIoZWxpc3QpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU0VUX0lURU0oZWxpc3QsIGksIGV0dXBsZSk7CisgICAgfQogCiAgICAgZXJyb3I6Ci0JUHlNZW1fRnJlZShldnMpOwotCXJldHVybiBlbGlzdDsKKyAgICBQeU1lbV9GcmVlKGV2cyk7CisgICAgcmV0dXJuIGVsaXN0OwogfQogCiBQeURvY19TVFJWQVIocHllcG9sbF9wb2xsX2RvYywKQEAgLTEwNDMsMjcgKzEwNDMsMjcgQEAKIFVwIHRvIG1heGV2ZW50cyBhcmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHB5ZXBvbGxfbWV0aG9kc1tdID0gewotCXsiZnJvbWZkIiwJKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfZnJvbWZkLAotCSBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLCBweWVwb2xsX2Zyb21mZF9kb2N9LAotCXsiY2xvc2UiLAkoUHlDRnVuY3Rpb24pcHllcG9sbF9jbG9zZSwJTUVUSF9OT0FSR1MsCi0JIHB5ZXBvbGxfY2xvc2VfZG9jfSwKLQl7ImZpbGVubyIsCShQeUNGdW5jdGlvbilweWVwb2xsX2ZpbGVubywJTUVUSF9OT0FSR1MsCi0JIHB5ZXBvbGxfZmlsZW5vX2RvY30sCi0JeyJtb2RpZnkiLAkoUHlDRnVuY3Rpb24pcHllcG9sbF9tb2RpZnksCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCXB5ZXBvbGxfbW9kaWZ5X2RvY30sCi0JeyJyZWdpc3RlciIsCShQeUNGdW5jdGlvbilweWVwb2xsX3JlZ2lzdGVyLAotCSBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAlweWVwb2xsX3JlZ2lzdGVyX2RvY30sCi0JeyJ1bnJlZ2lzdGVyIiwJKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfdW5yZWdpc3RlciwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywJcHllcG9sbF91bnJlZ2lzdGVyX2RvY30sCi0JeyJwb2xsIiwJKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfcG9sbCwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywJcHllcG9sbF9wb2xsX2RvY30sCi0Je05VTEwsCU5VTEx9LAorICAgIHsiZnJvbWZkIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfZnJvbWZkLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLCBweWVwb2xsX2Zyb21mZF9kb2N9LAorICAgIHsiY2xvc2UiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfY2xvc2UsICAgICBNRVRIX05PQVJHUywKKyAgICAgcHllcG9sbF9jbG9zZV9kb2N9LAorICAgIHsiZmlsZW5vIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfZmlsZW5vLCAgICBNRVRIX05PQVJHUywKKyAgICAgcHllcG9sbF9maWxlbm9fZG9jfSwKKyAgICB7Im1vZGlmeSIsICAgICAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX21vZGlmeSwKKyAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgICAgICBweWVwb2xsX21vZGlmeV9kb2N9LAorICAgIHsicmVnaXN0ZXIiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfcmVnaXN0ZXIsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgcHllcG9sbF9yZWdpc3Rlcl9kb2N9LAorICAgIHsidW5yZWdpc3RlciIsICAgICAgKFB5Q0Z1bmN0aW9uKXB5ZXBvbGxfdW5yZWdpc3RlciwKKyAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgICAgICBweWVwb2xsX3VucmVnaXN0ZXJfZG9jfSwKKyAgICB7InBvbGwiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilweWVwb2xsX3BvbGwsCisgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsICAgICAgcHllcG9sbF9wb2xsX2RvY30sCisgICAge05VTEwsICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgUHlHZXRTZXREZWYgcHllcG9sbF9nZXRzZXRsaXN0W10gPSB7Ci0JeyJjbG9zZWQiLCAoZ2V0dGVyKXB5ZXBvbGxfZ2V0X2Nsb3NlZCwgTlVMTCwKLQkgIlRydWUgaWYgdGhlIGVwb2xsIGhhbmRsZXIgaXMgY2xvc2VkIn0sCi0JezB9LAorICAgIHsiY2xvc2VkIiwgKGdldHRlcilweWVwb2xsX2dldF9jbG9zZWQsIE5VTEwsCisgICAgICJUcnVlIGlmIHRoZSBlcG9sbCBoYW5kbGVyIGlzIGNsb3NlZCJ9LAorICAgIHswfSwKIH07CiAKIFB5RG9jX1NUUlZBUihweWVwb2xsX2RvYywKQEAgLTEwNzYsNDUgKzEwNzYsNDUgQEAKIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtb25pdG9yZWQgZXZlbnRzLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHB5RXBvbGxfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkic2VsZWN0LmVwb2xsIiwJCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YocHlFcG9sbF9PYmplY3QpLAkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3IpcHllcG9sbF9kZWFsbG9jLAkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCQkvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgIAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkJLyogdHBfZmxhZ3MgKi8KLQlweWVwb2xsX2RvYywJCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JcHllcG9sbF9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JcHllcG9sbF9nZXRzZXRsaXN0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCQkvKiB0cF9hbGxvYyAqLwotCXB5ZXBvbGxfbmV3LAkJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInNlbGVjdC5lcG9sbCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YocHlFcG9sbF9PYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3IpcHllcG9sbF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHB5ZXBvbGxfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHB5ZXBvbGxfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBweWVwb2xsX2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHB5ZXBvbGxfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogI2VuZGlmIC8qIEhBVkVfRVBPTEwgKi8KQEAgLTExNjksOCArMTE2OSw4IEBACiB1ZGF0YS0+b2JqZWN0IG1hcHBpbmcuIik7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0Jc3RydWN0IGtldmVudCBlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBzdHJ1Y3Qga2V2ZW50IGU7CiB9IGtxdWV1ZV9ldmVudF9PYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qga3F1ZXVlX2V2ZW50X1R5cGU7CkBAIC0xMTc4LDggKzExNzgsOCBAQAogI2RlZmluZSBrcXVldWVfZXZlbnRfQ2hlY2sob3ApIChQeU9iamVjdF9UeXBlQ2hlY2soKG9wKSwgJmtxdWV1ZV9ldmVudF9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlTT0NLRVQga3FmZDsJCS8qIGtxdWV1ZSBjb250cm9sIGZkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFNPQ0tFVCBrcWZkOyAgICAgICAgICAgICAgICAvKiBrcXVldWUgY29udHJvbCBmZCAqLwogfSBrcXVldWVfcXVldWVfT2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGtxdWV1ZV9xdWV1ZV9UeXBlOwpAQCAtMTE5MywxMyArMTE5MywxMyBAQAogCiAjZGVmaW5lIEtRX09GRih4KSBvZmZzZXRvZihrcXVldWVfZXZlbnRfT2JqZWN0LCB4KQogc3RhdGljIHN0cnVjdCBQeU1lbWJlckRlZiBrcXVldWVfZXZlbnRfbWVtYmVyc1tdID0gewotCXsiaWRlbnQiLAlUX1VJTlQsCQlLUV9PRkYoZS5pZGVudCl9LAotCXsiZmlsdGVyIiwJVF9TSE9SVCwJS1FfT0ZGKGUuZmlsdGVyKX0sCi0JeyJmbGFncyIsCVRfVVNIT1JULAlLUV9PRkYoZS5mbGFncyl9LAotCXsiZmZsYWdzIiwJVF9VSU5ULAkJS1FfT0ZGKGUuZmZsYWdzKX0sCi0JeyJkYXRhIiwJVF9JTlQsCQlLUV9PRkYoZS5kYXRhKX0sCi0JeyJ1ZGF0YSIsCVRfSU5ULAkJS1FfT0ZGKGUudWRhdGEpfSwKLQl7TlVMTH0gLyogU2VudGluZWwgKi8KKyAgICB7ImlkZW50IiwgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBLUV9PRkYoZS5pZGVudCl9LAorICAgIHsiZmlsdGVyIiwgICAgICAgICAgVF9TSE9SVCwgICAgICAgIEtRX09GRihlLmZpbHRlcil9LAorICAgIHsiZmxhZ3MiLCAgICAgICAgICAgVF9VU0hPUlQsICAgICAgIEtRX09GRihlLmZsYWdzKX0sCisgICAgeyJmZmxhZ3MiLCAgICAgICAgICBUX1VJTlQsICAgICAgICAgS1FfT0ZGKGUuZmZsYWdzKX0sCisgICAgeyJkYXRhIiwgICAgICAgICAgICBUX0lOVCwgICAgICAgICAgS1FfT0ZGKGUuZGF0YSl9LAorICAgIHsidWRhdGEiLCAgICAgICAgICAgVF9JTlQsICAgICAgICAgIEtRX09GRihlLnVkYXRhKX0sCisgICAge05VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogI3VuZGVmIEtRX09GRgogCkBAIC0xMjA3LDIwOCArMTIwNywyMDggQEAKIAoga3F1ZXVlX2V2ZW50X3JlcHIoa3F1ZXVlX2V2ZW50X09iamVjdCAqcykKIHsKLQljaGFyIGJ1ZlsxMDI0XTsKLQlQeU9TX3NucHJpbnRmKAotCQlidWYsIHNpemVvZihidWYpLAotCQkiPHNlbGVjdC5rZXZlbnQgaWRlbnQ9JWx1IGZpbHRlcj0lZCBmbGFncz0weCV4IGZmbGFncz0weCV4ICIKLQkJImRhdGE9MHglbHggdWRhdGE9JXA+IiwKLQkJKHVuc2lnbmVkIGxvbmcpKHMtPmUuaWRlbnQpLCBzLT5lLmZpbHRlciwgcy0+ZS5mbGFncywKLQkJcy0+ZS5mZmxhZ3MsIChsb25nKShzLT5lLmRhdGEpLCBzLT5lLnVkYXRhKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMjRdOworICAgIFB5T1Nfc25wcmludGYoCisgICAgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICI8c2VsZWN0LmtldmVudCBpZGVudD0lbHUgZmlsdGVyPSVkIGZsYWdzPTB4JXggZmZsYWdzPTB4JXggIgorICAgICAgICAiZGF0YT0weCVseCB1ZGF0YT0lcD4iLAorICAgICAgICAodW5zaWduZWQgbG9uZykocy0+ZS5pZGVudCksIHMtPmUuZmlsdGVyLCBzLT5lLmZsYWdzLAorICAgICAgICBzLT5lLmZmbGFncywgKGxvbmcpKHMtPmUuZGF0YSksIHMtPmUudWRhdGEpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQKIGtxdWV1ZV9ldmVudF9pbml0KGtxdWV1ZV9ldmVudF9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqcGZkOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiaWRlbnQiLCAiZmlsdGVyIiwgImZsYWdzIiwgImZmbGFncyIsCi0JCQkJICJkYXRhIiwgInVkYXRhIiwgTlVMTH07CisgICAgUHlPYmplY3QgKnBmZDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImlkZW50IiwgImZpbHRlciIsICJmbGFncyIsICJmZmxhZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSIsICJ1ZGF0YSIsIE5VTEx9OwogCi0JRVZfU0VUKCYoc2VsZi0+ZSksIDAsIEVWRklMVF9SRUFELCBFVl9BREQsIDAsIDAsIDApOyAvKiBkZWZhdWx0cyAqLwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfGhoaWlpOmtldmVudCIsIGt3bGlzdCwKLQkJJnBmZCwgJihzZWxmLT5lLmZpbHRlciksICYoc2VsZi0+ZS5mbGFncyksCi0JCSYoc2VsZi0+ZS5mZmxhZ3MpLCAmKHNlbGYtPmUuZGF0YSksICYoc2VsZi0+ZS51ZGF0YSkpKSB7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgRVZfU0VUKCYoc2VsZi0+ZSksIDAsIEVWRklMVF9SRUFELCBFVl9BREQsIDAsIDAsIDApOyAvKiBkZWZhdWx0cyAqLwogCi0Jc2VsZi0+ZS5pZGVudCA9IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IocGZkKTsKLQlpZiAoc2VsZi0+ZS5pZGVudCA9PSAtMSkgewotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfGhoaWlpOmtldmVudCIsIGt3bGlzdCwKKyAgICAgICAgJnBmZCwgJihzZWxmLT5lLmZpbHRlciksICYoc2VsZi0+ZS5mbGFncyksCisgICAgICAgICYoc2VsZi0+ZS5mZmxhZ3MpLCAmKHNlbGYtPmUuZGF0YSksICYoc2VsZi0+ZS51ZGF0YSkpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzZWxmLT5lLmlkZW50ID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihwZmQpOworICAgIGlmIChzZWxmLT5lLmlkZW50ID09IC0xKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBrcXVldWVfZXZlbnRfcmljaGNvbXBhcmUoa3F1ZXVlX2V2ZW50X09iamVjdCAqcywga3F1ZXVlX2V2ZW50X09iamVjdCAqbywKLQkJCSBpbnQgb3ApCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wKQogewotCWludCByZXN1bHQgPSAwOworICAgIGludCByZXN1bHQgPSAwOwogCi0JaWYgKCFrcXVldWVfZXZlbnRfQ2hlY2sobykpIHsKLQkJaWYgKG9wID09IFB5X0VRIHx8IG9wID09IFB5X05FKSB7Ci0gICAgICAgICAgICAgICAgCVB5T2JqZWN0ICpyZXMgPSBvcCA9PSBQeV9FUSA/IFB5X0ZhbHNlIDogUHlfVHJ1ZTsKLQkJCVB5X0lOQ1JFRihyZXMpOwotCQkJcmV0dXJuIHJlczsKLQkJfQotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJImNhbid0IGNvbXBhcmUgJS4yMDBzIHRvICUuMjAwcyIsCi0JCQlQeV9UWVBFKHMpLT50cF9uYW1lLCBQeV9UWVBFKG8pLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgoKHJlc3VsdCA9IHMtPmUuaWRlbnQgLSBvLT5lLmlkZW50KSA9PSAwKSAmJgotCSAgICAoKHJlc3VsdCA9IHMtPmUuZmlsdGVyIC0gby0+ZS5maWx0ZXIpID09IDApICYmCi0JICAgICgocmVzdWx0ID0gcy0+ZS5mbGFncyAtIG8tPmUuZmxhZ3MpID09IDApICYmCi0JICAgICgocmVzdWx0ID0gcy0+ZS5mZmxhZ3MgLSBvLT5lLmZmbGFncykgPT0gMCkgJiYKLQkgICAgKChyZXN1bHQgPSBzLT5lLmRhdGEgLSBvLT5lLmRhdGEpID09IDApICYmCi0JICAgICgocmVzdWx0ID0gcy0+ZS51ZGF0YSAtIG8tPmUudWRhdGEpID09IDApCi0JICAgKSB7Ci0JCXJlc3VsdCA9IDA7Ci0JfQorICAgIGlmICgha3F1ZXVlX2V2ZW50X0NoZWNrKG8pKSB7CisgICAgICAgIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnJlcyA9IG9wID09IFB5X0VRID8gUHlfRmFsc2UgOiBQeV9UcnVlOworICAgICAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiY2FuJ3QgY29tcGFyZSAlLjIwMHMgdG8gJS4yMDBzIiwKKyAgICAgICAgICAgIFB5X1RZUEUocyktPnRwX25hbWUsIFB5X1RZUEUobyktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCgocmVzdWx0ID0gcy0+ZS5pZGVudCAtIG8tPmUuaWRlbnQpID09IDApICYmCisgICAgICAgICgocmVzdWx0ID0gcy0+ZS5maWx0ZXIgLSBvLT5lLmZpbHRlcikgPT0gMCkgJiYKKyAgICAgICAgKChyZXN1bHQgPSBzLT5lLmZsYWdzIC0gby0+ZS5mbGFncykgPT0gMCkgJiYKKyAgICAgICAgKChyZXN1bHQgPSBzLT5lLmZmbGFncyAtIG8tPmUuZmZsYWdzKSA9PSAwKSAmJgorICAgICAgICAoKHJlc3VsdCA9IHMtPmUuZGF0YSAtIG8tPmUuZGF0YSkgPT0gMCkgJiYKKyAgICAgICAgKChyZXN1bHQgPSBzLT5lLnVkYXRhIC0gby0+ZS51ZGF0YSkgPT0gMCkKKyAgICAgICApIHsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CiAKLQlzd2l0Y2ggKG9wKSB7Ci0JICAgIGNhc2UgUHlfRVE6Ci0JCXJlc3VsdCA9IChyZXN1bHQgPT0gMCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFB5X05FOgotCQlyZXN1bHQgPSAocmVzdWx0ICE9IDApOwotCQlicmVhazsKLQkgICAgY2FzZSBQeV9MRToKLQkJcmVzdWx0ID0gKHJlc3VsdCA8PSAwKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgUHlfR0U6Ci0JCXJlc3VsdCA9IChyZXN1bHQgPj0gMCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFB5X0xUOgotCQlyZXN1bHQgPSAocmVzdWx0IDwgMCk7Ci0JCWJyZWFrOwotCSAgICBjYXNlIFB5X0dUOgotCQlyZXN1bHQgPSAocmVzdWx0ID4gMCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgICBjYXNlIFB5X0VROgorICAgICAgICByZXN1bHQgPSAocmVzdWx0ID09IDApOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQeV9ORToKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCAhPSAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTEU6CisgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPD0gMCk7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFB5X0dFOgorICAgICAgICByZXN1bHQgPSAocmVzdWx0ID49IDApOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQeV9MVDoKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8IDApOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQeV9HVDoKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+IDApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGtxdWV1ZV9ldmVudF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJzZWxlY3Qua2V2ZW50IiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihrcXVldWVfZXZlbnRfT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JMCwJCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylrcXVldWVfZXZlbnRfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCQkvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgIAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJCQkvKiB0cF9mbGFncyAqLwotCWtxdWV1ZV9ldmVudF9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKWtxdWV1ZV9ldmVudF9yaWNoY29tcGFyZSwJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlrcXVldWVfZXZlbnRfbWVtYmVycywJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylrcXVldWVfZXZlbnRfaW5pdCwJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInNlbGVjdC5rZXZlbnQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2Yoa3F1ZXVlX2V2ZW50X09iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpa3F1ZXVlX2V2ZW50X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGtxdWV1ZV9ldmVudF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAocmljaGNtcGZ1bmMpa3F1ZXVlX2V2ZW50X3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAga3F1ZXVlX2V2ZW50X21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2Mpa3F1ZXVlX2V2ZW50X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGtxdWV1ZV9xdWV1ZV9lcnJfY2xvc2VkKHZvaWQpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBrcXVldWUgZmQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGtxdWV1ZSBmZCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBrcXVldWVfcXVldWVfaW50ZXJuYWxfY2xvc2Uoa3F1ZXVlX3F1ZXVlX09iamVjdCAqc2VsZikKIHsKLQlpbnQgc2F2ZV9lcnJubyA9IDA7Ci0JaWYgKHNlbGYtPmtxZmQgPj0gMCkgewotCQlpbnQga3FmZCA9IHNlbGYtPmtxZmQ7Ci0JCXNlbGYtPmtxZmQgPSAtMTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlpZiAoY2xvc2Uoa3FmZCkgPCAwKQotCQkJc2F2ZV9lcnJubyA9IGVycm5vOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KLQlyZXR1cm4gc2F2ZV9lcnJubzsKKyAgICBpbnQgc2F2ZV9lcnJubyA9IDA7CisgICAgaWYgKHNlbGYtPmtxZmQgPj0gMCkgeworICAgICAgICBpbnQga3FmZCA9IHNlbGYtPmtxZmQ7CisgICAgICAgIHNlbGYtPmtxZmQgPSAtMTsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAoY2xvc2Uoa3FmZCkgPCAwKQorICAgICAgICAgICAgc2F2ZV9lcnJubyA9IGVycm5vOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICByZXR1cm4gc2F2ZV9lcnJubzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5ld0txdWV1ZV9PYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBTT0NLRVQgZmQpCiB7Ci0Ja3F1ZXVlX3F1ZXVlX09iamVjdCAqc2VsZjsKLQlhc3NlcnQodHlwZSAhPSBOVUxMICYmIHR5cGUtPnRwX2FsbG9jICE9IE5VTEwpOwotCXNlbGYgPSAoa3F1ZXVlX3F1ZXVlX09iamVjdCAqKSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlpZiAoZmQgPT0gLTEpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlzZWxmLT5rcWZkID0ga3F1ZXVlKCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCWVsc2UgewotCQlzZWxmLT5rcWZkID0gZmQ7Ci0JfQotCWlmIChzZWxmLT5rcWZkIDwgMCkgewotCQlQeV9ERUNSRUYoc2VsZik7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGY7CisgICAgYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKKyAgICBzZWxmID0gKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKikgdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBzZWxmLT5rcWZkID0ga3F1ZXVlKCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzZWxmLT5rcWZkID0gZmQ7CisgICAgfQorICAgIGlmIChzZWxmLT5rcWZkIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgoga3F1ZXVlX3F1ZXVlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKIAotCWlmICgoYXJncyAhPSBOVUxMICYmIFB5T2JqZWN0X1NpemUoYXJncykpIHx8Ci0JCQkoa3dkcyAhPSBOVUxMICYmIFB5T2JqZWN0X1NpemUoa3dkcykpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzZWxlY3Qua3F1ZXVlIGRvZXNuJ3QgYWNjZXB0IGFyZ3VtZW50cyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChhcmdzICE9IE5VTEwgJiYgUHlPYmplY3RfU2l6ZShhcmdzKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGt3ZHMgIT0gTlVMTCAmJiBQeU9iamVjdF9TaXplKGt3ZHMpKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Qua3F1ZXVlIGRvZXNuJ3QgYWNjZXB0IGFyZ3VtZW50cyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gbmV3S3F1ZXVlX09iamVjdCh0eXBlLCAtMSk7CisgICAgcmV0dXJuIG5ld0txdWV1ZV9PYmplY3QodHlwZSwgLTEpOwogfQogCiBzdGF0aWMgdm9pZAoga3F1ZXVlX3F1ZXVlX2RlYWxsb2Moa3F1ZXVlX3F1ZXVlX09iamVjdCAqc2VsZikKIHsKLQlrcXVldWVfcXVldWVfaW50ZXJuYWxfY2xvc2Uoc2VsZik7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKKyAgICBrcXVldWVfcXVldWVfaW50ZXJuYWxfY2xvc2Uoc2VsZik7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgoga3F1ZXVlX3F1ZXVlX2Nsb3NlKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGYpCiB7Ci0JZXJybm8gPSBrcXVldWVfcXVldWVfaW50ZXJuYWxfY2xvc2Uoc2VsZik7Ci0JaWYgKGVycm5vIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBlcnJubyA9IGtxdWV1ZV9xdWV1ZV9pbnRlcm5hbF9jbG9zZShzZWxmKTsKKyAgICBpZiAoZXJybm8gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoa3F1ZXVlX3F1ZXVlX2Nsb3NlX2RvYywKQEAgLTE0MjAsMTggKzE0MjAsMTggQEAKIHN0YXRpYyBQeU9iamVjdCoKIGtxdWV1ZV9xdWV1ZV9nZXRfY2xvc2VkKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmtxZmQgPCAwKQotCQlQeV9SRVRVUk5fVFJVRTsKLQllbHNlCi0JCVB5X1JFVFVSTl9GQUxTRTsKKyAgICBpZiAoc2VsZi0+a3FmZCA8IDApCisgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgIGVsc2UKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBrcXVldWVfcXVldWVfZmlsZW5vKGtxdWV1ZV9xdWV1ZV9PYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPmtxZmQgPCAwKQotCQlyZXR1cm4ga3F1ZXVlX3F1ZXVlX2Vycl9jbG9zZWQoKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+a3FmZCk7CisgICAgaWYgKHNlbGYtPmtxZmQgPCAwKQorICAgICAgICByZXR1cm4ga3F1ZXVlX3F1ZXVlX2Vycl9jbG9zZWQoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+a3FmZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihrcXVldWVfcXVldWVfZmlsZW5vX2RvYywKQEAgLTE0NDIsMTIgKzE0NDIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGtxdWV1ZV9xdWV1ZV9mcm9tZmQoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU09DS0VUIGZkOworICAgIFNPQ0tFVCBmZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpmcm9tZmQiLCAmZmQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6ZnJvbWZkIiwgJmZkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gbmV3S3F1ZXVlX09iamVjdCgoUHlUeXBlT2JqZWN0KiljbHMsIGZkKTsKKyAgICByZXR1cm4gbmV3S3F1ZXVlX09iamVjdCgoUHlUeXBlT2JqZWN0KiljbHMsIGZkKTsKIH0KIAogUHlEb2NfU1RSVkFSKGtxdWV1ZV9xdWV1ZV9mcm9tZmRfZG9jLApAQCAtMTQ1OCwxNDQgKzE0NTgsMTQ0IEBACiBzdGF0aWMgUHlPYmplY3QgKgoga3F1ZXVlX3F1ZXVlX2NvbnRyb2woa3F1ZXVlX3F1ZXVlX09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IG5ldmVudHMgPSAwOwotCWludCBnb3RldmVudHMgPSAwOwotCWludCBuY2hhbmdlcyA9IDA7Ci0JaW50IGkgPSAwOwotCVB5T2JqZWN0ICpvdGltZW91dCA9IE5VTEw7Ci0JUHlPYmplY3QgKmNoID0gTlVMTDsKLQlQeU9iamVjdCAqaXQgPSBOVUxMLCAqZWkgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCXN0cnVjdCBrZXZlbnQgKmV2bCA9IE5VTEw7Ci0Jc3RydWN0IGtldmVudCAqY2hsID0gTlVMTDsKLQlzdHJ1Y3QgdGltZXNwZWMgdGltZW91dHNwZWM7Ci0Jc3RydWN0IHRpbWVzcGVjICpwdGltZW91dHNwZWM7CisgICAgaW50IG5ldmVudHMgPSAwOworICAgIGludCBnb3RldmVudHMgPSAwOworICAgIGludCBuY2hhbmdlcyA9IDA7CisgICAgaW50IGkgPSAwOworICAgIFB5T2JqZWN0ICpvdGltZW91dCA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNoID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXQgPSBOVUxMLCAqZWkgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIHN0cnVjdCBrZXZlbnQgKmV2bCA9IE5VTEw7CisgICAgc3RydWN0IGtldmVudCAqY2hsID0gTlVMTDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZW91dHNwZWM7CisgICAgc3RydWN0IHRpbWVzcGVjICpwdGltZW91dHNwZWM7CiAKLQlpZiAoc2VsZi0+a3FmZCA8IDApCi0JCXJldHVybiBrcXVldWVfcXVldWVfZXJyX2Nsb3NlZCgpOworICAgIGlmIChzZWxmLT5rcWZkIDwgMCkKKyAgICAgICAgcmV0dXJuIGtxdWV1ZV9xdWV1ZV9lcnJfY2xvc2VkKCk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pfE86Y29udHJvbCIsICZjaCwgJm5ldmVudHMsICZvdGltZW91dCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2l8Tzpjb250cm9sIiwgJmNoLCAmbmV2ZW50cywgJm90aW1lb3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobmV2ZW50cyA8IDApIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkiTGVuZ3RoIG9mIGV2ZW50bGlzdCBtdXN0IGJlIDAgb3IgcG9zaXRpdmUsIGdvdCAlZCIsCi0JCQluZXZlbnRzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChuZXZlbnRzIDwgMCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJMZW5ndGggb2YgZXZlbnRsaXN0IG11c3QgYmUgMCBvciBwb3NpdGl2ZSwgZ290ICVkIiwKKyAgICAgICAgICAgIG5ldmVudHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAob3RpbWVvdXQgPT0gUHlfTm9uZSB8fCBvdGltZW91dCA9PSBOVUxMKSB7Ci0JCXB0aW1lb3V0c3BlYyA9IE5VTEw7Ci0JfQotCWVsc2UgaWYgKFB5TnVtYmVyX0NoZWNrKG90aW1lb3V0KSkgewotCQlkb3VibGUgdGltZW91dDsKLQkJbG9uZyBzZWNvbmRzOworICAgIGlmIChvdGltZW91dCA9PSBQeV9Ob25lIHx8IG90aW1lb3V0ID09IE5VTEwpIHsKKyAgICAgICAgcHRpbWVvdXRzcGVjID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlOdW1iZXJfQ2hlY2sob3RpbWVvdXQpKSB7CisgICAgICAgIGRvdWJsZSB0aW1lb3V0OworICAgICAgICBsb25nIHNlY29uZHM7CiAKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUob3RpbWVvdXQpOwotCQlpZiAodGltZW91dCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICh0aW1lb3V0ID4gKGRvdWJsZSlMT05HX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSJ0aW1lb3V0IHBlcmlvZCB0b28gbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKHRpbWVvdXQgPCAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInRpbWVvdXQgbXVzdCBiZSBwb3NpdGl2ZSBvciBOb25lIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICB0aW1lb3V0ID0gUHlGbG9hdF9Bc0RvdWJsZShvdGltZW91dCk7CisgICAgICAgIGlmICh0aW1lb3V0ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHRpbWVvdXQgPiAoZG91YmxlKUxPTkdfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBwZXJpb2QgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICh0aW1lb3V0IDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgbXVzdCBiZSBwb3NpdGl2ZSBvciBOb25lIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCXNlY29uZHMgPSAobG9uZyl0aW1lb3V0OwotCQl0aW1lb3V0ID0gdGltZW91dCAtIChkb3VibGUpc2Vjb25kczsKLQkJdGltZW91dHNwZWMudHZfc2VjID0gc2Vjb25kczsKLQkJdGltZW91dHNwZWMudHZfbnNlYyA9IChsb25nKSh0aW1lb3V0ICogMUU5KTsKLQkJcHRpbWVvdXRzcGVjID0gJnRpbWVvdXRzcGVjOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ0aW1lb3V0IGFyZ3VtZW50IG11c3QgYmUgYW4gbnVtYmVyICIKLQkJCSJvciBOb25lLCBnb3QgJS4yMDBzIiwKLQkJCVB5X1RZUEUob3RpbWVvdXQpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBzZWNvbmRzID0gKGxvbmcpdGltZW91dDsKKyAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgLSAoZG91YmxlKXNlY29uZHM7CisgICAgICAgIHRpbWVvdXRzcGVjLnR2X3NlYyA9IHNlY29uZHM7CisgICAgICAgIHRpbWVvdXRzcGVjLnR2X25zZWMgPSAobG9uZykodGltZW91dCAqIDFFOSk7CisgICAgICAgIHB0aW1lb3V0c3BlYyA9ICZ0aW1lb3V0c3BlYzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAidGltZW91dCBhcmd1bWVudCBtdXN0IGJlIGFuIG51bWJlciAiCisgICAgICAgICAgICAib3IgTm9uZSwgZ290ICUuMjAwcyIsCisgICAgICAgICAgICBQeV9UWVBFKG90aW1lb3V0KS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChjaCAhPSBOVUxMICYmIGNoICE9IFB5X05vbmUpIHsKLQkJaXQgPSBQeU9iamVjdF9HZXRJdGVyKGNoKTsKLQkJaWYgKGl0ID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJjaGFuZ2VsaXN0IGlzIG5vdCBpdGVyYWJsZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbmNoYW5nZXMgPSBQeU9iamVjdF9TaXplKGNoKTsKLQkJaWYgKG5jaGFuZ2VzIDwgMCkgewotCQkJZ290byBlcnJvcjsKLQkJfQorICAgIGlmIChjaCAhPSBOVUxMICYmIGNoICE9IFB5X05vbmUpIHsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGNoKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5nZWxpc3QgaXMgbm90IGl0ZXJhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBuY2hhbmdlcyA9IFB5T2JqZWN0X1NpemUoY2gpOworICAgICAgICBpZiAobmNoYW5nZXMgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAKLQkJY2hsID0gUHlNZW1fTmV3KHN0cnVjdCBrZXZlbnQsIG5jaGFuZ2VzKTsKLQkJaWYgKGNobCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlpID0gMDsKLQkJd2hpbGUgKChlaSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQkJaWYgKCFrcXVldWVfZXZlbnRfQ2hlY2soZWkpKSB7Ci0JCQkJUHlfREVDUkVGKGVpKTsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiY2hhbmdlbGlzdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mICIKLQkJCQkgCSJzZWxlY3Qua2V2ZW50IG9iamVjdHMiKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfSBlbHNlIHsKLQkJCQljaGxbaSsrXSA9ICgoa3F1ZXVlX2V2ZW50X09iamVjdCAqKWVpKS0+ZTsKLQkJCX0KLQkJCVB5X0RFQ1JFRihlaSk7Ci0JCX0KLQl9Ci0JUHlfQ0xFQVIoaXQpOworICAgICAgICBjaGwgPSBQeU1lbV9OZXcoc3RydWN0IGtldmVudCwgbmNoYW5nZXMpOworICAgICAgICBpZiAoY2hsID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGkgPSAwOworICAgICAgICB3aGlsZSAoKGVpID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIWtxdWV1ZV9ldmVudF9DaGVjayhlaSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWkpOworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjaGFuZ2VsaXN0IG11c3QgYmUgYW4gaXRlcmFibGUgb2YgIgorICAgICAgICAgICAgICAgICAgICAic2VsZWN0LmtldmVudCBvYmplY3RzIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2hsW2krK10gPSAoKGtxdWV1ZV9ldmVudF9PYmplY3QgKillaSktPmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoZWkpOworICAgICAgICB9CisgICAgfQorICAgIFB5X0NMRUFSKGl0KTsKIAotCS8qIGV2ZW50IGxpc3QgKi8KLQlpZiAobmV2ZW50cykgewotCQlldmwgPSBQeU1lbV9OZXcoc3RydWN0IGtldmVudCwgbmV2ZW50cyk7Ci0JCWlmIChldmwgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9CisgICAgLyogZXZlbnQgbGlzdCAqLworICAgIGlmIChuZXZlbnRzKSB7CisgICAgICAgIGV2bCA9IFB5TWVtX05ldyhzdHJ1Y3Qga2V2ZW50LCBuZXZlbnRzKTsKKyAgICAgICAgaWYgKGV2bCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlnb3RldmVudHMgPSBrZXZlbnQoc2VsZi0+a3FmZCwgY2hsLCBuY2hhbmdlcywKLQkJCSAgIGV2bCwgbmV2ZW50cywgcHRpbWVvdXRzcGVjKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBnb3RldmVudHMgPSBrZXZlbnQoc2VsZi0+a3FmZCwgY2hsLCBuY2hhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgZXZsLCBuZXZlbnRzLCBwdGltZW91dHNwZWMpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAoZ290ZXZlbnRzID09IC0xKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaWYgKGdvdGV2ZW50cyA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JcmVzdWx0ID0gUHlMaXN0X05ldyhnb3RldmVudHMpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlnb3RvIGVycm9yOwotCX0KKyAgICByZXN1bHQgPSBQeUxpc3RfTmV3KGdvdGV2ZW50cyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IGdvdGV2ZW50czsgaSsrKSB7Ci0JCWtxdWV1ZV9ldmVudF9PYmplY3QgKmNoOworICAgIGZvciAoaSA9IDA7IGkgPCBnb3RldmVudHM7IGkrKykgeworICAgICAgICBrcXVldWVfZXZlbnRfT2JqZWN0ICpjaDsKIAotCQljaCA9IFB5T2JqZWN0X05ldyhrcXVldWVfZXZlbnRfT2JqZWN0LCAma3F1ZXVlX2V2ZW50X1R5cGUpOwotCQlpZiAoY2ggPT0gTlVMTCkgewotCQkJZ290byBlcnJvcjsKLQkJfQotCQljaC0+ZSA9IGV2bFtpXTsKLQkJUHlMaXN0X1NFVF9JVEVNKHJlc3VsdCwgaSwgKFB5T2JqZWN0ICopY2gpOwotCX0KLQlQeU1lbV9GcmVlKGNobCk7Ci0JUHlNZW1fRnJlZShldmwpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgIGNoID0gUHlPYmplY3RfTmV3KGtxdWV1ZV9ldmVudF9PYmplY3QsICZrcXVldWVfZXZlbnRfVHlwZSk7CisgICAgICAgIGlmIChjaCA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGNoLT5lID0gZXZsW2ldOworICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmVzdWx0LCBpLCAoUHlPYmplY3QgKiljaCk7CisgICAgfQorICAgIFB5TWVtX0ZyZWUoY2hsKTsKKyAgICBQeU1lbV9GcmVlKGV2bCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogICAgIGVycm9yOgotCVB5TWVtX0ZyZWUoY2hsKTsKLQlQeU1lbV9GcmVlKGV2bCk7Ci0JUHlfWERFQ1JFRihyZXN1bHQpOwotCVB5X1hERUNSRUYoaXQpOwotCXJldHVybiBOVUxMOworICAgIFB5TWVtX0ZyZWUoY2hsKTsKKyAgICBQeU1lbV9GcmVlKGV2bCk7CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIFB5X1hERUNSRUYoaXQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoa3F1ZXVlX3F1ZXVlX2NvbnRyb2xfZG9jLApAQCAtMTYxMSwyMSArMTYxMSwyMSBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBrcXVldWVfcXVldWVfbWV0aG9kc1tdID0gewotCXsiZnJvbWZkIiwJKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9mcm9tZmQsCi0JIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsIGtxdWV1ZV9xdWV1ZV9mcm9tZmRfZG9jfSwKLQl7ImNsb3NlIiwJKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9jbG9zZSwJTUVUSF9OT0FSR1MsCi0JIGtxdWV1ZV9xdWV1ZV9jbG9zZV9kb2N9LAotCXsiZmlsZW5vIiwJKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9maWxlbm8sCU1FVEhfTk9BUkdTLAotCSBrcXVldWVfcXVldWVfZmlsZW5vX2RvY30sCi0JeyJjb250cm9sIiwJKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9jb250cm9sLAotCSBNRVRIX1ZBUkFSR1MgLAlrcXVldWVfcXVldWVfY29udHJvbF9kb2N9LAotCXtOVUxMLAlOVUxMfSwKKyAgICB7ImZyb21mZCIsICAgICAgICAgIChQeUNGdW5jdGlvbilrcXVldWVfcXVldWVfZnJvbWZkLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLCBrcXVldWVfcXVldWVfZnJvbWZkX2RvY30sCisgICAgeyJjbG9zZSIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pa3F1ZXVlX3F1ZXVlX2Nsb3NlLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIGtxdWV1ZV9xdWV1ZV9jbG9zZV9kb2N9LAorICAgIHsiZmlsZW5vIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWtxdWV1ZV9xdWV1ZV9maWxlbm8sICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBrcXVldWVfcXVldWVfZmlsZW5vX2RvY30sCisgICAgeyJjb250cm9sIiwgICAgICAgICAoUHlDRnVuY3Rpb24pa3F1ZXVlX3F1ZXVlX2NvbnRyb2wsCisgICAgIE1FVEhfVkFSQVJHUyAsICAgICBrcXVldWVfcXVldWVfY29udHJvbF9kb2N9LAorICAgIHtOVUxMLCAgICAgIE5VTEx9LAogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIGtxdWV1ZV9xdWV1ZV9nZXRzZXRsaXN0W10gPSB7Ci0JeyJjbG9zZWQiLCAoZ2V0dGVyKWtxdWV1ZV9xdWV1ZV9nZXRfY2xvc2VkLCBOVUxMLAotCSAiVHJ1ZSBpZiB0aGUga3F1ZXVlIGhhbmRsZXIgaXMgY2xvc2VkIn0sCi0JezB9LAorICAgIHsiY2xvc2VkIiwgKGdldHRlcilrcXVldWVfcXVldWVfZ2V0X2Nsb3NlZCwgTlVMTCwKKyAgICAgIlRydWUgaWYgdGhlIGtxdWV1ZSBoYW5kbGVyIGlzIGNsb3NlZCJ9LAorICAgIHswfSwKIH07CiAKIFB5RG9jX1NUUlZBUihrcXVldWVfcXVldWVfZG9jLApAQCAtMTY0NCw0NSArMTY0NCw0NSBAQAogPj4+IGtxLmNvbnRyb2woW2tldmVudChzb2NrLCBLUV9GSUxURVJfV1JJVEUsIEtRX0VWX0RFTEVURSldLCAwKSIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGtxdWV1ZV9xdWV1ZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJzZWxlY3Qua3F1ZXVlIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihrcXVldWVfcXVldWVfT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3Ipa3F1ZXVlX3F1ZXVlX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkJLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkJLyogdHBfc3RyICovCi0JMCwJCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkJLyogdHBfZmxhZ3MgKi8KLQlrcXVldWVfcXVldWVfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWtxdWV1ZV9xdWV1ZV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCQkvKiB0cF9tZW1iZXJzICovCi0Ja3F1ZXVlX3F1ZXVlX2dldHNldGxpc3QsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkJLyogdHBfYWxsb2MgKi8KLQlrcXVldWVfcXVldWVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAic2VsZWN0LmtxdWV1ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihrcXVldWVfcXVldWVfT2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3RvcilrcXVldWVfcXVldWVfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAga3F1ZXVlX3F1ZXVlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAga3F1ZXVlX3F1ZXVlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGtxdWV1ZV9xdWV1ZV9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAga3F1ZXVlX3F1ZXVlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAjZW5kaWYgLyogSEFWRV9LUVVFVUUgKi8KQEAgLTE3MTMsMTEgKzE3MTMsMTEgQEAKIGRlc2NyaXB0b3JzIGNhbiBiZSB1c2VkLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgc2VsZWN0X21ldGhvZHNbXSA9IHsKLQl7InNlbGVjdCIsCXNlbGVjdF9zZWxlY3QsCU1FVEhfVkFSQVJHUywJc2VsZWN0X2RvY30sCisgICAgeyJzZWxlY3QiLCAgICAgICAgICBzZWxlY3Rfc2VsZWN0LCAgTUVUSF9WQVJBUkdTLCAgIHNlbGVjdF9kb2N9LAogI2lmZGVmIEhBVkVfUE9MTAotCXsicG9sbCIsCXNlbGVjdF9wb2xsLAlNRVRIX05PQVJHUywJcG9sbF9kb2N9LAorICAgIHsicG9sbCIsICAgICAgICAgICAgc2VsZWN0X3BvbGwsICAgIE1FVEhfTk9BUkdTLCAgICBwb2xsX2RvY30sCiAjZW5kaWYgLyogSEFWRV9QT0xMICovCi0JezAsICAJMH0sCS8qIHNlbnRpbmVsICovCisgICAgezAsICAgICAgICAgMH0sICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCkBAIC0xNzI5LDE0NiArMTcyOSwxNDYgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0c2VsZWN0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JbSA9IFB5X0luaXRNb2R1bGUzKCJzZWxlY3QiLCBzZWxlY3RfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygic2VsZWN0Iiwgc2VsZWN0X21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVNlbGVjdEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzZWxlY3QuZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlQeV9JTkNSRUYoU2VsZWN0RXJyb3IpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBTZWxlY3RFcnJvcik7CisgICAgU2VsZWN0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNlbGVjdC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIFB5X0lOQ1JFRihTZWxlY3RFcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFNlbGVjdEVycm9yKTsKIAogI2lmIGRlZmluZWQoSEFWRV9QT0xMKQogI2lmZGVmIF9fQVBQTEVfXwotCWlmIChzZWxlY3RfaGF2ZV9icm9rZW5fcG9sbCgpKSB7Ci0JCWlmIChQeU9iamVjdF9EZWxBdHRyU3RyaW5nKG0sICJwb2xsIikgPT0gLTEpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQl9IGVsc2UgeworICAgIGlmIChzZWxlY3RfaGF2ZV9icm9rZW5fcG9sbCgpKSB7CisgICAgICAgIGlmIChQeU9iamVjdF9EZWxBdHRyU3RyaW5nKG0sICJwb2xsIikgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgewogI2Vsc2UKLQl7CisgICAgewogI2VuZGlmCi0JCVB5X1RZUEUoJnBvbGxfVHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMSU4iLCBQT0xMSU4pOwotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFBSSSIsIFBPTExQUkkpOwotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTE9VVCIsIFBPTExPVVQpOwotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTEVSUiIsIFBPTExFUlIpOwotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTEhVUCIsIFBPTExIVVApOwotCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTE5WQUwiLCBQT0xMTlZBTCk7CisgICAgICAgIFB5X1RZUEUoJnBvbGxfVHlwZSkgPSAmUHlUeXBlX1R5cGU7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMSU4iLCBQT0xMSU4pOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTFBSSSIsIFBPTExQUkkpOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTE9VVCIsIFBPTExPVVQpOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTEVSUiIsIFBPTExFUlIpOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTEhVUCIsIFBPTExIVVApOworICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUE9MTE5WQUwiLCBQT0xMTlZBTCk7CiAKICNpZmRlZiBQT0xMUkROT1JNCi0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMUkROT1JNIiwgUE9MTFJETk9STSk7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMUkROT1JNIiwgUE9MTFJETk9STSk7CiAjZW5kaWYKICNpZmRlZiBQT0xMUkRCQU5ECi0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMUkRCQU5EIiwgUE9MTFJEQkFORCk7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMUkRCQU5EIiwgUE9MTFJEQkFORCk7CiAjZW5kaWYKICNpZmRlZiBQT0xMV1JOT1JNCi0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMV1JOT1JNIiwgUE9MTFdSTk9STSk7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMV1JOT1JNIiwgUE9MTFdSTk9STSk7CiAjZW5kaWYKICNpZmRlZiBQT0xMV1JCQU5ECi0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMV1JCQU5EIiwgUE9MTFdSQkFORCk7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMV1JCQU5EIiwgUE9MTFdSQkFORCk7CiAjZW5kaWYKICNpZmRlZiBQT0xMTVNHCi0JCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMTVNHIiwgUE9MTE1TRyk7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQT0xMTVNHIiwgUE9MTE1TRyk7CiAjZW5kaWYKLQl9CisgICAgfQogI2VuZGlmIC8qIEhBVkVfUE9MTCAqLwogCiAjaWZkZWYgSEFWRV9FUE9MTAotCVB5X1RZUEUoJnB5RXBvbGxfVHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmcHlFcG9sbF9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBQeV9UWVBFKCZweUVwb2xsX1R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJnB5RXBvbGxfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlQeV9JTkNSRUYoJnB5RXBvbGxfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcG9sbCIsIChQeU9iamVjdCAqKSAmcHlFcG9sbF9UeXBlKTsKKyAgICBQeV9JTkNSRUYoJnB5RXBvbGxfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcG9sbCIsIChQeU9iamVjdCAqKSAmcHlFcG9sbF9UeXBlKTsKIAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTElOIiwgRVBPTExJTik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMT1VUIiwgRVBPTExPVVQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTFBSSSIsIEVQT0xMUFJJKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExFUlIiLCBFUE9MTEVSUik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMSFVQIiwgRVBPTExIVVApOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTEVUIiwgRVBPTExFVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMSU4iLCBFUE9MTElOKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExPVVQiLCBFUE9MTE9VVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMUFJJIiwgRVBPTExQUkkpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTEVSUiIsIEVQT0xMRVJSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExIVVAiLCBFUE9MTEhVUCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMRVQiLCBFUE9MTEVUKTsKICNpZmRlZiBFUE9MTE9ORVNIT1QKLQkvKiBLZXJuZWwgMi42LjIrICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMT05FU0hPVCIsIEVQT0xMT05FU0hPVCk7CisgICAgLyogS2VybmVsIDIuNi4yKyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTE9ORVNIT1QiLCBFUE9MTE9ORVNIT1QpOwogI2VuZGlmCi0JLyogUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMX1JESFVQIiwgRVBPTExSREhVUCk7ICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMUkROT1JNIiwgRVBPTExSRE5PUk0pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTFJEQkFORCIsIEVQT0xMUkRCQU5EKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExXUk5PUk0iLCBFUE9MTFdSTk9STSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMV1JCQU5EIiwgRVBPTExXUkJBTkQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTE1TRyIsIEVQT0xMTVNHKTsKKyAgICAvKiBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExfUkRIVVAiLCBFUE9MTFJESFVQKTsgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExSRE5PUk0iLCBFUE9MTFJETk9STSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMUkRCQU5EIiwgRVBPTExSREJBTkQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFUE9MTFdSTk9STSIsIEVQT0xMV1JOT1JNKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRVBPTExXUkJBTkQiLCBFUE9MTFdSQkFORCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVQT0xMTVNHIiwgRVBPTExNU0cpOwogI2VuZGlmIC8qIEhBVkVfRVBPTEwgKi8KIAogI2lmZGVmIEhBVkVfS1FVRVVFCi0Ja3F1ZXVlX2V2ZW50X1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7Ci0JUHlfVFlQRSgma3F1ZXVlX2V2ZW50X1R5cGUpID0gJlB5VHlwZV9UeXBlOwotCWlmKFB5VHlwZV9SZWFkeSgma3F1ZXVlX2V2ZW50X1R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIGtxdWV1ZV9ldmVudF9UeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIFB5X1RZUEUoJmtxdWV1ZV9ldmVudF9UeXBlKSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZihQeVR5cGVfUmVhZHkoJmtxdWV1ZV9ldmVudF9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCVB5X0lOQ1JFRigma3F1ZXVlX2V2ZW50X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAia2V2ZW50IiwgKFB5T2JqZWN0ICopJmtxdWV1ZV9ldmVudF9UeXBlKTsKKyAgICBQeV9JTkNSRUYoJmtxdWV1ZV9ldmVudF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImtldmVudCIsIChQeU9iamVjdCAqKSZrcXVldWVfZXZlbnRfVHlwZSk7CiAKLQlQeV9UWVBFKCZrcXVldWVfcXVldWVfVHlwZSkgPSAmUHlUeXBlX1R5cGU7Ci0JaWYoUHlUeXBlX1JlYWR5KCZrcXVldWVfcXVldWVfVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKCZrcXVldWVfcXVldWVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJrcXVldWUiLCAoUHlPYmplY3QgKikma3F1ZXVlX3F1ZXVlX1R5cGUpOwotCQotCS8qIGV2ZW50IGZpbHRlcnMgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1JFQUQiLCBFVkZJTFRfUkVBRCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9XUklURSIsIEVWRklMVF9XUklURSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9BSU8iLCBFVkZJTFRfQUlPKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1ZOT0RFIiwgRVZGSUxUX1ZOT0RFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1BST0MiLCBFVkZJTFRfUFJPQyk7CisgICAgUHlfVFlQRSgma3F1ZXVlX3F1ZXVlX1R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIGlmKFB5VHlwZV9SZWFkeSgma3F1ZXVlX3F1ZXVlX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRigma3F1ZXVlX3F1ZXVlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAia3F1ZXVlIiwgKFB5T2JqZWN0ICopJmtxdWV1ZV9xdWV1ZV9UeXBlKTsKKworICAgIC8qIGV2ZW50IGZpbHRlcnMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1JFQUQiLCBFVkZJTFRfUkVBRCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9XUklURSIsIEVWRklMVF9XUklURSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9BSU8iLCBFVkZJTFRfQUlPKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1ZOT0RFIiwgRVZGSUxUX1ZOT0RFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1BST0MiLCBFVkZJTFRfUFJPQyk7CiAjaWZkZWYgRVZGSUxUX05FVERFVgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfTkVUREVWIiwgRVZGSUxUX05FVERFVik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9ORVRERVYiLCBFVkZJTFRfTkVUREVWKTsKICNlbmRpZgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9GSUxURVJfU0lHTkFMIiwgRVZGSUxUX1NJR05BTCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9USU1FUiIsIEVWRklMVF9USU1FUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0ZJTFRFUl9TSUdOQUwiLCBFVkZJTFRfU0lHTkFMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRklMVEVSX1RJTUVSIiwgRVZGSUxUX1RJTUVSKTsKIAotCS8qIGV2ZW50IGZsYWdzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0FERCIsIEVWX0FERCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0RFTEVURSIsIEVWX0RFTEVURSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0VOQUJMRSIsIEVWX0VOQUJMRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0RJU0FCTEUiLCBFVl9ESVNBQkxFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfT05FU0hPVCIsIEVWX09ORVNIT1QpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9DTEVBUiIsIEVWX0NMRUFSKTsKKyAgICAvKiBldmVudCBmbGFncyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9BREQiLCBFVl9BREQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9ERUxFVEUiLCBFVl9ERUxFVEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9FTkFCTEUiLCBFVl9FTkFCTEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9ESVNBQkxFIiwgRVZfRElTQUJMRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX09ORVNIT1QiLCBFVl9PTkVTSE9UKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfQ0xFQVIiLCBFVl9DTEVBUik7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfU1lTRkxBR1MiLCBFVl9TWVNGTEFHUyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0ZMQUcxIiwgRVZfRkxBRzEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9FVl9TWVNGTEFHUyIsIEVWX1NZU0ZMQUdTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfRkxBRzEiLCBFVl9GTEFHMSk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfRU9GIiwgRVZfRU9GKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfRVZfRVJST1IiLCBFVl9FUlJPUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0VPRiIsIEVWX0VPRik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX0VWX0VSUk9SIiwgRVZfRVJST1IpOwogCi0JLyogUkVBRCBXUklURSBmaWx0ZXIgZmxhZyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0xPV0FUIiwgTk9URV9MT1dBVCk7Ci0JCi0JLyogVk5PREUgZmlsdGVyIGZsYWdzICAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0RFTEVURSIsIE5PVEVfREVMRVRFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9XUklURSIsIE5PVEVfV1JJVEUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0VYVEVORCIsIE5PVEVfRVhURU5EKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9BVFRSSUIiLCBOT1RFX0FUVFJJQik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfTElOSyIsIE5PVEVfTElOSyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfUkVOQU1FIiwgTk9URV9SRU5BTUUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1JFVk9LRSIsIE5PVEVfUkVWT0tFKTsKKyAgICAvKiBSRUFEIFdSSVRFIGZpbHRlciBmbGFnICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfTE9XQVQiLCBOT1RFX0xPV0FUKTsKIAotCS8qIFBST0MgZmlsdGVyIGZsYWdzICAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0VYSVQiLCBOT1RFX0VYSVQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0ZPUksiLCBOT1RFX0ZPUkspOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0VYRUMiLCBOT1RFX0VYRUMpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1BDVFJMTUFTSyIsIE5PVEVfUENUUkxNQVNLKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9QREFUQU1BU0siLCBOT1RFX1BEQVRBTUFTSyk7CisgICAgLyogVk5PREUgZmlsdGVyIGZsYWdzICAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0RFTEVURSIsIE5PVEVfREVMRVRFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9XUklURSIsIE5PVEVfV1JJVEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0VYVEVORCIsIE5PVEVfRVhURU5EKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9BVFRSSUIiLCBOT1RFX0FUVFJJQik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfTElOSyIsIE5PVEVfTElOSyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfUkVOQU1FIiwgTk9URV9SRU5BTUUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1JFVk9LRSIsIE5PVEVfUkVWT0tFKTsKIAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1RSQUNLIiwgTk9URV9UUkFDSyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfQ0hJTEQiLCBOT1RFX0NISUxEKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9UUkFDS0VSUiIsIE5PVEVfVFJBQ0tFUlIpOworICAgIC8qIFBST0MgZmlsdGVyIGZsYWdzICAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0VYSVQiLCBOT1RFX0VYSVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0ZPUksiLCBOT1RFX0ZPUkspOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0VYRUMiLCBOT1RFX0VYRUMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1BDVFJMTUFTSyIsIE5PVEVfUENUUkxNQVNLKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9QREFUQU1BU0siLCBOT1RFX1BEQVRBTUFTSyk7CiAKLQkvKiBORVRERVYgZmlsdGVyIGZsYWdzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIktRX05PVEVfVFJBQ0siLCBOT1RFX1RSQUNLKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9DSElMRCIsIE5PVEVfQ0hJTEQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX1RSQUNLRVJSIiwgTk9URV9UUkFDS0VSUik7CisKKyAgICAvKiBORVRERVYgZmlsdGVyIGZsYWdzICovCiAjaWZkZWYgRVZGSUxUX05FVERFVgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0xJTktVUCIsIE5PVEVfTElOS1VQKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9MSU5LRE9XTiIsIE5PVEVfTElOS0RPV04pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0xJTktJTlYiLCBOT1RFX0xJTktJTlYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0xJTktVUCIsIE5PVEVfTElOS1VQKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiS1FfTk9URV9MSU5LRE9XTiIsIE5PVEVfTElOS0RPV04pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJLUV9OT1RFX0xJTktJTlYiLCBOT1RFX0xJTktJTlYpOwogI2VuZGlmCiAKICNlbmRpZiAvKiBIQVZFX0tRVUVVRSAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zZ2ltb2R1bGUuYyBiL01vZHVsZXMvc2dpbW9kdWxlLmMKaW5kZXggZjdlMTI2My4uMGQxMzI0OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zZ2ltb2R1bGUuYworKysgYi9Nb2R1bGVzL3NnaW1vZHVsZS5jCkBAIC0xMCwxNCArMTAsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZ2lfbmFwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHRpY2tzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpuYXAiLCAmdGlja3MpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc2dpbmFwKHRpY2tzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBsb25nIHRpY2tzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibDpuYXAiLCAmdGlja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgc2dpbmFwKHRpY2tzKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogZXh0ZXJuIGNoYXIgKl9nZXRwdHkoaW50ICosIGludCwgbW9kZV90LCBpbnQpOwpAQCAtMjUsMzEgKzI1LDMxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2dpX19nZXRwdHkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBvZmxhZzsKLQlpbnQgbW9kZTsKLQlpbnQgbm9mb3JrOwotCWNoYXIgKm5hbWU7Ci0JaW50IGZpbGRlczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTpfZ2V0cHR5IiwgJm9mbGFnLCAmbW9kZSwgJm5vZm9yaykpCi0JCXJldHVybiBOVUxMOwotCWVycm5vID0gMDsKLQluYW1lID0gX2dldHB0eSgmZmlsZGVzLCBvZmxhZywgKG1vZGVfdCltb2RlLCBub2ZvcmspOwotCWlmIChuYW1lID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzaSkiLCBuYW1lLCBmaWxkZXMpOworICAgIGludCBvZmxhZzsKKyAgICBpbnQgbW9kZTsKKyAgICBpbnQgbm9mb3JrOworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IGZpbGRlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTpfZ2V0cHR5IiwgJm9mbGFnLCAmbW9kZSwgJm5vZm9yaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gMDsKKyAgICBuYW1lID0gX2dldHB0eSgmZmlsZGVzLCBvZmxhZywgKG1vZGVfdCltb2RlLCBub2ZvcmspOworICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzaSkiLCBuYW1lLCBmaWxkZXMpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc2dpX21ldGhvZHNbXSA9IHsKLQl7Im5hcCIsCQlzZ2lfbmFwLAlNRVRIX1ZBUkFSR1N9LAotCXsiX2dldHB0eSIsCXNnaV9fZ2V0cHR5LAlNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJuYXAiLCAgICAgICAgICAgICBzZ2lfbmFwLCAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7Il9nZXRwdHkiLCAgICAgICAgIHNnaV9fZ2V0cHR5LCAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIHZvaWQKIGluaXRzZ2kodm9pZCkKIHsKLQlQeV9Jbml0TW9kdWxlKCJzZ2kiLCBzZ2lfbWV0aG9kcyk7CisgICAgUHlfSW5pdE1vZHVsZSgic2dpIiwgc2dpX21ldGhvZHMpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zaGEyNTZtb2R1bGUuYyBiL01vZHVsZXMvc2hhMjU2bW9kdWxlLmMKaW5kZXggN2Q1NjkwMC4uMDI5ZjI5OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zaGEyNTZtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NoYTI1Nm1vZHVsZS5jCkBAIC0yMiw3ICsyMiw3IEBACiAKIC8qIEVuZGlhbm5lc3MgdGVzdGluZyBhbmQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgVGVzdEVuZGlhbm5lc3ModmFyaWFibGUpIHtpbnQgaT0xOyB2YXJpYWJsZT1QQ1RfQklHX0VORElBTjtcCi0JaWYgKCooKGNoYXIqKSZpKT09MSkgdmFyaWFibGU9UENUX0xJVFRMRV9FTkRJQU47fQorICAgICAgICBpZiAoKigoY2hhciopJmkpPT0xKSB2YXJpYWJsZT1QQ1RfTElUVExFX0VORElBTjt9CiAKICNkZWZpbmUgUENUX0xJVFRMRV9FTkRJQU4gMQogI2RlZmluZSBQQ1RfQklHX0VORElBTiAwCkBAIC0zMiw3ICszMiw3IEBACiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgU0hBX0JZVEU7CiAKICNpZiBTSVpFT0ZfSU5UID09IDQKLXR5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsJLyogMzItYml0IGludGVnZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsgLyogMzItYml0IGludGVnZXIgKi8KICNlbHNlCiAvKiBub3QgZGVmaW5lZC4gY29tcGlsYXRpb24gd2lsbCBkaWUuICovCiAjZW5kaWYKQEAgLTQ2LDExICs0NiwxMSBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFNIQV9JTlQzMiBkaWdlc3RbOF07CQkvKiBNZXNzYWdlIGRpZ2VzdCAqLwotICAgIFNIQV9JTlQzMiBjb3VudF9sbywgY291bnRfaGk7CS8qIDY0LWJpdCBiaXQgY291bnQgKi8KLSAgICBTSEFfQllURSBkYXRhW1NIQV9CTE9DS1NJWkVdOwkvKiBTSEEgZGF0YSBidWZmZXIgKi8KKyAgICBTSEFfSU5UMzIgZGlnZXN0WzhdOyAgICAgICAgICAgICAgICAvKiBNZXNzYWdlIGRpZ2VzdCAqLworICAgIFNIQV9JTlQzMiBjb3VudF9sbywgY291bnRfaGk7ICAgICAgIC8qIDY0LWJpdCBiaXQgY291bnQgKi8KKyAgICBTSEFfQllURSBkYXRhW1NIQV9CTE9DS1NJWkVdOyAgICAgICAvKiBTSEEgZGF0YSBidWZmZXIgKi8KICAgICBpbnQgRW5kaWFubmVzczsKLSAgICBpbnQgbG9jYWw7CQkJCS8qIHVucHJvY2Vzc2VkIGFtb3VudCBpbiBkYXRhICovCisgICAgaW50IGxvY2FsOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5wcm9jZXNzZWQgYW1vdW50IGluIGRhdGEgKi8KICAgICBpbnQgZGlnZXN0c2l6ZTsKIH0gU0hBb2JqZWN0OwogCkBAIC02Miw3ICs2Miw3IEBACiAgICAgU0hBX0lOVDMyIHZhbHVlOwogCiAgICAgaWYgKCBFbmRpYW5uZXNzID09IFBDVF9CSUdfRU5ESUFOICkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIGJ5dGVDb3VudCAvPSBzaXplb2YoKmJ1ZmZlcik7CiAgICAgd2hpbGUgKGJ5dGVDb3VudC0tKSB7CkBAIC0xMTQsNyArMTE0LDcgQEAKICggKCgoKHVuc2lnbmVkIGxvbmcpKHgpJjB4RkZGRkZGRkZVTCk+Pih1bnNpZ25lZCBsb25nKSgoeSkmMzEpKSB8IFwKICgodW5zaWduZWQgbG9uZykoeCk8PCh1bnNpZ25lZCBsb25nKSgzMi0oKHkpJjMxKSkpKSAmIDB4RkZGRkZGRkZVTCkKICNkZWZpbmUgQ2goeCx5LHopICAgICAgICh6IF4gKHggJiAoeSBeIHopKSkKLSNkZWZpbmUgTWFqKHgseSx6KSAgICAgICgoKHggfCB5KSAmIHopIHwgKHggJiB5KSkgCisjZGVmaW5lIE1haih4LHkseikgICAgICAoKCh4IHwgeSkgJiB6KSB8ICh4ICYgeSkpCiAjZGVmaW5lIFMoeCwgbikgICAgICAgICBST1IoKHgpLChuKSkKICNkZWZpbmUgUih4LCBuKSAgICAgICAgICgoKHgpJjB4RkZGRkZGRkZVTCk+PihuKSkKICNkZWZpbmUgU2lnbWEwKHgpICAgICAgIChTKHgsIDIpIF4gUyh4LCAxMykgXiBTKHgsIDIyKSkKQEAgLTEyNywxMyArMTI3LDEzIEBACiBzaGFfdHJhbnNmb3JtKFNIQW9iamVjdCAqc2hhX2luZm8pCiB7CiAgICAgaW50IGk7Ci0JU0hBX0lOVDMyIFNbOF0sIFdbNjRdLCB0MCwgdDE7CisgICAgICAgIFNIQV9JTlQzMiBTWzhdLCBXWzY0XSwgdDAsIHQxOwogCiAgICAgbWVtY3B5KFcsIHNoYV9pbmZvLT5kYXRhLCBzaXplb2Yoc2hhX2luZm8tPmRhdGEpKTsKICAgICBsb25nUmV2ZXJzZShXLCAoaW50KXNpemVvZihzaGFfaW5mby0+ZGF0YSksIHNoYV9pbmZvLT5FbmRpYW5uZXNzKTsKIAogICAgIGZvciAoaSA9IDE2OyBpIDwgNjQ7ICsraSkgewotCQlXW2ldID0gR2FtbWExKFdbaSAtIDJdKSArIFdbaSAtIDddICsgR2FtbWEwKFdbaSAtIDE1XSkgKyBXW2kgLSAxNl07CisgICAgICAgICAgICAgICAgV1tpXSA9IEdhbW1hMShXW2kgLSAyXSkgKyBXW2kgLSA3XSArIEdhbW1hMChXW2kgLSAxNV0pICsgV1tpIC0gMTZdOwogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CiAgICAgICAgIFNbaV0gPSBzaGFfaW5mby0+ZGlnZXN0W2ldOwpAQCAtMjExLDggKzIxMSw4IEBACiAgICAgUk5EKFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sU1sxXSw2MiwweGJlZjlhM2Y3KTsKICAgICBSTkQoU1sxXSxTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLDYzLDB4YzY3MTc4ZjIpOwogCi0jdW5kZWYgUk5EICAgICAKLSAgICAKKyN1bmRlZiBSTkQKKwogICAgIC8qIGZlZWRiYWNrICovCiAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgICBzaGFfaW5mby0+ZGlnZXN0W2ldID0gc2hhX2luZm8tPmRpZ2VzdFtpXSArIFNbaV07CkBAIC0zMTQsMTQgKzMxNCwxNCBAQAogICAgIGNvdW50ID0gKGludCkgKChsb19iaXRfY291bnQgPj4gMykgJiAweDNmKTsKICAgICAoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKVtjb3VudCsrXSA9IDB4ODA7CiAgICAgaWYgKGNvdW50ID4gU0hBX0JMT0NLU0laRSAtIDgpIHsKLQltZW1zZXQoKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSkgKyBjb3VudCwgMCwKLQkgICAgICAgU0hBX0JMT0NLU0laRSAtIGNvdW50KTsKLQlzaGFfdHJhbnNmb3JtKHNoYV9pbmZvKTsKLQltZW1zZXQoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhLCAwLCBTSEFfQkxPQ0tTSVpFIC0gOCk7CisgICAgICAgIG1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAorICAgICAgICAgICAgICAgU0hBX0JMT0NLU0laRSAtIGNvdW50KTsKKyAgICAgICAgc2hhX3RyYW5zZm9ybShzaGFfaW5mbyk7CisgICAgICAgIG1lbXNldCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEsIDAsIFNIQV9CTE9DS1NJWkUgLSA4KTsKICAgICB9CiAgICAgZWxzZSB7Ci0JbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCi0JICAgICAgIFNIQV9CTE9DS1NJWkUgLSA4IC0gY291bnQpOworICAgICAgICBtZW1zZXQoKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSkgKyBjb3VudCwgMCwKKyAgICAgICAgICAgICAgIFNIQV9CTE9DS1NJWkUgLSA4IC0gY291bnQpOwogICAgIH0KIAogICAgIC8qIEdKUzogbm90ZSB0aGF0IHdlIGFkZCB0aGUgaGkvbG8gaW4gYmlnLWVuZGlhbi4gc2hhX3RyYW5zZm9ybSB3aWxsCkBAIC00NTQsMjEgKzQ1NCwyMSBAQAogICAgIC8qIENyZWF0ZSBhIG5ldyBzdHJpbmcgKi8KICAgICByZXR2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmLT5kaWdlc3RzaXplICogMik7CiAgICAgaWYgKCFyZXR2YWwpCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaGV4X2RpZ2VzdCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJldHZhbCk7CiAgICAgaWYgKCFoZXhfZGlnZXN0KSB7Ci0JICAgIFB5X0RFQ1JFRihyZXR2YWwpOwotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgLyogTWFrZSBoZXggdmVyc2lvbiBvZiB0aGUgZGlnZXN0ICovCiAgICAgZm9yKGk9aj0wOyBpPHNlbGYtPmRpZ2VzdHNpemU7IGkrKykgewogICAgICAgICBjaGFyIGM7CiAgICAgICAgIGMgPSAoZGlnZXN0W2ldID4+IDQpICYgMHhmOwotCWMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwogICAgICAgICBoZXhfZGlnZXN0W2orK10gPSBjOwogICAgICAgICBjID0gKGRpZ2VzdFtpXSAmIDB4Zik7Ci0JYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CiAgICAgICAgIGhleF9kaWdlc3RbaisrXSA9IGM7CiAgICAgfQogICAgIHJldHVybiByZXR2YWw7CkBAIC00OTMsMTEgKzQ5MywxMSBAQAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU0hBX21ldGhvZHNbXSA9IHsKLSAgICB7ImNvcHkiLAkgIChQeUNGdW5jdGlvbilTSEEyNTZfY29weSwgICAgICBNRVRIX05PQVJHUywgIFNIQTI1Nl9jb3B5X19kb2NfX30sCi0gICAgeyJkaWdlc3QiLAkgIChQeUNGdW5jdGlvbilTSEEyNTZfZGlnZXN0LCAgICBNRVRIX05PQVJHUywgIFNIQTI1Nl9kaWdlc3RfX2RvY19ffSwKKyAgICB7ImNvcHkiLCAgICAgIChQeUNGdW5jdGlvbilTSEEyNTZfY29weSwgICAgICBNRVRIX05PQVJHUywgIFNIQTI1Nl9jb3B5X19kb2NfX30sCisgICAgeyJkaWdlc3QiLCAgICAoUHlDRnVuY3Rpb24pU0hBMjU2X2RpZ2VzdCwgICAgTUVUSF9OT0FSR1MsICBTSEEyNTZfZGlnZXN0X19kb2NfX30sCiAgICAgeyJoZXhkaWdlc3QiLCAoUHlDRnVuY3Rpb24pU0hBMjU2X2hleGRpZ2VzdCwgTUVUSF9OT0FSR1MsICBTSEEyNTZfaGV4ZGlnZXN0X19kb2NfX30sCi0gICAgeyJ1cGRhdGUiLAkgIChQeUNGdW5jdGlvbilTSEEyNTZfdXBkYXRlLCAgICBNRVRIX1ZBUkFSR1MsIFNIQTI1Nl91cGRhdGVfX2RvY19ffSwKLSAgICB7TlVMTCwJICBOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InVwZGF0ZSIsICAgIChQeUNGdW5jdGlvbilTSEEyNTZfdXBkYXRlLCAgICBNRVRIX1ZBUkFSR1MsIFNIQTI1Nl91cGRhdGVfX2RvY19ffSwKKyAgICB7TlVMTCwgICAgICAgIE5VTEx9ICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC01MzcsMTMgKzUzNywxMyBAQAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNIQTIyNHR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9zaGEyNTYuc2hhMjI0IiwJLyp0cF9uYW1lKi8KLSAgICBzaXplb2YoU0hBb2JqZWN0KSwJLyp0cF9zaXplKi8KLSAgICAwLAkJCS8qdHBfaXRlbXNpemUqLworICAgICJfc2hhMjU2LnNoYTIyNCIsICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoU0hBb2JqZWN0KSwgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgU0hBX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0gICAgMCwJCQkvKnRwX3ByaW50Ki8KLSAgICAwLCAgICAgICAgICAJLyp0cF9nZXRhdHRyKi8KKyAgICBTSEFfZGVhbGxvYywgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCkBAIC01NTksMjUgKzU1OSwyNSBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyp0cF9mbGFncyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAwLAkJCS8qdHBfY2xlYXIqLwotICAgIDAsCQkJLyp0cF9yaWNoY29tcGFyZSovCi0gICAgMCwJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAwLAkJCS8qdHBfaXRlciovCi0gICAgMCwJCQkvKnRwX2l0ZXJuZXh0Ki8KLSAgICBTSEFfbWV0aG9kcywJLyogdHBfbWV0aG9kcyAqLwotICAgIFNIQV9tZW1iZXJzLAkvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgU0hBX21ldGhvZHMsICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgU0hBX21lbWJlcnMsICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgU0hBX2dldHNldGVycywgICAgICAvKiB0cF9nZXRzZXQgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU0hBMjU2dHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLSAgICAiX3NoYTI1Ni5zaGEyNTYiLAkvKnRwX25hbWUqLwotICAgIHNpemVvZihTSEFvYmplY3QpLAkvKnRwX3NpemUqLwotICAgIDAsCQkJLyp0cF9pdGVtc2l6ZSovCisgICAgIl9zaGEyNTYuc2hhMjU2IiwgICAvKnRwX25hbWUqLworICAgIHNpemVvZihTSEFvYmplY3QpLCAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwogICAgIC8qIG1ldGhvZHMgKi8KLSAgICBTSEFfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLSAgICAwLAkJCS8qdHBfcHJpbnQqLwotICAgIDAsICAgICAgICAgIAkvKnRwX2dldGF0dHIqLworICAgIFNIQV9kZWFsbG9jLCAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KQEAgLTU5MywxMyArNTkzLDEzIEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAvKnRwX2ZsYWdzKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgIDAsCQkJLyp0cF9jbGVhciovCi0gICAgMCwJCQkvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAwLAkJCS8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgIDAsCQkJLyp0cF9pdGVyKi8KLSAgICAwLAkJCS8qdHBfaXRlcm5leHQqLwotICAgIFNIQV9tZXRob2RzLAkvKiB0cF9tZXRob2RzICovCi0gICAgU0hBX21lbWJlcnMsCS8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBTSEFfbWV0aG9kcywgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBTSEFfbWVtYmVycywgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICBTSEFfZ2V0c2V0ZXJzLCAgICAgIC8qIHRwX2dldHNldCAqLwogfTsKIApAQCAtNjc0LDcgKzY3NCw3IEBACiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIFNIQV9mdW5jdGlvbnNbXSA9IHsKICAgICB7InNoYTI1NiIsIChQeUNGdW5jdGlvbilTSEEyNTZfbmV3LCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgU0hBMjU2X25ld19fZG9jX199LAogICAgIHsic2hhMjI0IiwgKFB5Q0Z1bmN0aW9uKVNIQTIyNF9uZXcsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBTSEEyMjRfbmV3X19kb2NfX30sCi0gICAge05VTEwsCU5VTEx9CQkgLyogU2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAKQEAgLTY5NSw1ICs2OTUsNSBAQAogICAgICAgICByZXR1cm47CiAgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9zaGEyNTYiLCBTSEFfZnVuY3Rpb25zKTsKICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zaGE1MTJtb2R1bGUuYyBiL01vZHVsZXMvc2hhNTEybW9kdWxlLmMKaW5kZXggZjJjMjMwYi4uNDI1NDhiYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zaGE1MTJtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NoYTUxMm1vZHVsZS5jCkBAIC0yMyw3ICsyMyw3IEBACiAKIC8qIEVuZGlhbm5lc3MgdGVzdGluZyBhbmQgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgVGVzdEVuZGlhbm5lc3ModmFyaWFibGUpIHtpbnQgaT0xOyB2YXJpYWJsZT1QQ1RfQklHX0VORElBTjtcCi0JaWYgKCooKGNoYXIqKSZpKT09MSkgdmFyaWFibGU9UENUX0xJVFRMRV9FTkRJQU47fQorICAgICAgICBpZiAoKigoY2hhciopJmkpPT0xKSB2YXJpYWJsZT1QQ1RfTElUVExFX0VORElBTjt9CiAKICNkZWZpbmUgUENUX0xJVFRMRV9FTkRJQU4gMQogI2RlZmluZSBQQ1RfQklHX0VORElBTiAwCkBAIC0zMyw4ICszMyw4IEBACiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgU0hBX0JZVEU7CiAKICNpZiBTSVpFT0ZfSU5UID09IDQKLXR5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsJLyogMzItYml0IGludGVnZXIgKi8KLXR5cGVkZWYgdW5zaWduZWQgUFlfTE9OR19MT05HIFNIQV9JTlQ2NDsJLyogNjQtYml0IGludGVnZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IFNIQV9JTlQzMjsgLyogMzItYml0IGludGVnZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgUFlfTE9OR19MT05HIFNIQV9JTlQ2NDsgICAgICAgIC8qIDY0LWJpdCBpbnRlZ2VyICovCiAjZWxzZQogLyogbm90IGRlZmluZWQuIGNvbXBpbGF0aW9uIHdpbGwgZGllLiAqLwogI2VuZGlmCkBAIC00OCwxMSArNDgsMTEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKLSAgICBTSEFfSU5UNjQgZGlnZXN0WzhdOwkJLyogTWVzc2FnZSBkaWdlc3QgKi8KLSAgICBTSEFfSU5UMzIgY291bnRfbG8sIGNvdW50X2hpOwkvKiA2NC1iaXQgYml0IGNvdW50ICovCi0gICAgU0hBX0JZVEUgZGF0YVtTSEFfQkxPQ0tTSVpFXTsJLyogU0hBIGRhdGEgYnVmZmVyICovCisgICAgU0hBX0lOVDY0IGRpZ2VzdFs4XTsgICAgICAgICAgICAgICAgLyogTWVzc2FnZSBkaWdlc3QgKi8KKyAgICBTSEFfSU5UMzIgY291bnRfbG8sIGNvdW50X2hpOyAgICAgICAvKiA2NC1iaXQgYml0IGNvdW50ICovCisgICAgU0hBX0JZVEUgZGF0YVtTSEFfQkxPQ0tTSVpFXTsgICAgICAgLyogU0hBIGRhdGEgYnVmZmVyICovCiAgICAgaW50IEVuZGlhbm5lc3M7Ci0gICAgaW50IGxvY2FsOwkJCQkvKiB1bnByb2Nlc3NlZCBhbW91bnQgaW4gZGF0YSAqLworICAgIGludCBsb2NhbDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVucHJvY2Vzc2VkIGFtb3VudCBpbiBkYXRhICovCiAgICAgaW50IGRpZ2VzdHNpemU7CiB9IFNIQW9iamVjdDsKIApAQCAtNjQsMjIgKzY0LDIyIEBACiAgICAgU0hBX0lOVDY0IHZhbHVlOwogCiAgICAgaWYgKCBFbmRpYW5uZXNzID09IFBDVF9CSUdfRU5ESUFOICkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIGJ5dGVDb3VudCAvPSBzaXplb2YoKmJ1ZmZlcik7CiAgICAgd2hpbGUgKGJ5dGVDb3VudC0tKSB7CiAgICAgICAgIHZhbHVlID0gKmJ1ZmZlcjsKIAotCQkoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbMF0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gNTYpICYgMHhmZjsKLQkJKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzFdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDQ4KSAmIDB4ZmY7Ci0JCSgodW5zaWduZWQgY2hhciopYnVmZmVyKVsyXSA9ICh1bnNpZ25lZCBjaGFyKSh2YWx1ZSA+PiA0MCkgJiAweGZmOwotCQkoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbM10gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gMzIpICYgMHhmZjsKLQkJKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzRdID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDI0KSAmIDB4ZmY7Ci0JCSgodW5zaWduZWQgY2hhciopYnVmZmVyKVs1XSA9ICh1bnNpZ25lZCBjaGFyKSh2YWx1ZSA+PiAxNikgJiAweGZmOwotCQkoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbNl0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gIDgpICYgMHhmZjsKLQkJKCh1bnNpZ25lZCBjaGFyKilidWZmZXIpWzddID0gKHVuc2lnbmVkIGNoYXIpKHZhbHVlICAgICAgKSAmIDB4ZmY7Ci0gICAgICAgIAotCQlidWZmZXIrKzsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbMF0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gNTYpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbMV0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gNDgpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbMl0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gNDApICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbM10gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gMzIpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbNF0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gMjQpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbNV0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbNl0gPSAodW5zaWduZWQgY2hhcikodmFsdWUgPj4gIDgpICYgMHhmZjsKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGNoYXIqKWJ1ZmZlcilbN10gPSAodW5zaWduZWQgY2hhcikodmFsdWUgICAgICApICYgMHhmZjsKKworICAgICAgICAgICAgICAgIGJ1ZmZlcisrOwogICAgIH0KIH0KIApAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgKCAoKCgoeCkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSk+PigodW5zaWduZWQgUFlfTE9OR19MT05HKSh5KSAmIDYzKSkgfCBcCiAgICAgICAoKHgpPDwoKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykoNjQtKCh5KSAmIDYzKSkpKSkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSkKICNkZWZpbmUgQ2goeCx5LHopICAgICAgICh6IF4gKHggJiAoeSBeIHopKSkKLSNkZWZpbmUgTWFqKHgseSx6KSAgICAgICgoKHggfCB5KSAmIHopIHwgKHggJiB5KSkgCisjZGVmaW5lIE1haih4LHkseikgICAgICAoKCh4IHwgeSkgJiB6KSB8ICh4ICYgeSkpCiAjZGVmaW5lIFMoeCwgbikgICAgICAgICBST1I2NCgoeCksKG4pKQogI2RlZmluZSBSKHgsIG4pICAgICAgICAgKCgoeCkgJiBQeV9VTEwoMHhGRkZGRkZGRkZGRkZGRkZGKSkgPj4gKCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpbikpCiAjZGVmaW5lIFNpZ21hMCh4KSAgICAgICAoUyh4LCAyOCkgXiBTKHgsIDM0KSBeIFMoeCwgMzkpKQpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgbG9uZ1JldmVyc2UoVywgKGludClzaXplb2Yoc2hhX2luZm8tPmRhdGEpLCBzaGFfaW5mby0+RW5kaWFubmVzcyk7CiAKICAgICBmb3IgKGkgPSAxNjsgaSA8IDgwOyArK2kpIHsKLQkJV1tpXSA9IEdhbW1hMShXW2kgLSAyXSkgKyBXW2kgLSA3XSArIEdhbW1hMChXW2kgLSAxNV0pICsgV1tpIC0gMTZdOworICAgICAgICAgICAgICAgIFdbaV0gPSBHYW1tYTEoV1tpIC0gMl0pICsgV1tpIC0gN10gKyBHYW1tYTAoV1tpIC0gMTVdKSArIFdbaSAtIDE2XTsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgewogICAgICAgICBTW2ldID0gc2hhX2luZm8tPmRpZ2VzdFtpXTsKQEAgLTIzNyw4ICsyMzcsOCBAQAogICAgIFJORChTWzJdLFNbM10sU1s0XSxTWzVdLFNbNl0sU1s3XSxTWzBdLFNbMV0sNzgsUHlfVUxMKDB4NWZjYjZmYWIzYWQ2ZmFlYykpOwogICAgIFJORChTWzFdLFNbMl0sU1szXSxTWzRdLFNbNV0sU1s2XSxTWzddLFNbMF0sNzksUHlfVUxMKDB4NmM0NDE5OGM0YTQ3NTgxNykpOwogCi0jdW5kZWYgUk5EICAgICAKLSAgICAKKyN1bmRlZiBSTkQKKwogICAgIC8qIGZlZWRiYWNrICovCiAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogICAgICAgICBzaGFfaW5mby0+ZGlnZXN0W2ldID0gc2hhX2luZm8tPmRpZ2VzdFtpXSArIFNbaV07CkBAIC0zNDAsMTQgKzM0MCwxNCBAQAogICAgIGNvdW50ID0gKGludCkgKChsb19iaXRfY291bnQgPj4gMykgJiAweDdmKTsKICAgICAoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKVtjb3VudCsrXSA9IDB4ODA7CiAgICAgaWYgKGNvdW50ID4gU0hBX0JMT0NLU0laRSAtIDE2KSB7Ci0JbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCi0JICAgICAgIFNIQV9CTE9DS1NJWkUgLSBjb3VudCk7Ci0Jc2hhNTEyX3RyYW5zZm9ybShzaGFfaW5mbyk7Ci0JbWVtc2V0KChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSwgMCwgU0hBX0JMT0NLU0laRSAtIDE2KTsKKyAgICAgICAgbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCisgICAgICAgICAgICAgICBTSEFfQkxPQ0tTSVpFIC0gY291bnQpOworICAgICAgICBzaGE1MTJfdHJhbnNmb3JtKHNoYV9pbmZvKTsKKyAgICAgICAgbWVtc2V0KChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSwgMCwgU0hBX0JMT0NLU0laRSAtIDE2KTsKICAgICB9CiAgICAgZWxzZSB7Ci0JbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCi0JICAgICAgIFNIQV9CTE9DS1NJWkUgLSAxNiAtIGNvdW50KTsKKyAgICAgICAgbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCisgICAgICAgICAgICAgICBTSEFfQkxPQ0tTSVpFIC0gMTYgLSBjb3VudCk7CiAgICAgfQogCiAgICAgLyogR0pTOiBub3RlIHRoYXQgd2UgYWRkIHRoZSBoaS9sbyBpbiBiaWctZW5kaWFuLiBzaGE1MTJfdHJhbnNmb3JtIHdpbGwKQEAgLTUyMCwyMSArNTIwLDIxIEBACiAgICAgLyogQ3JlYXRlIGEgbmV3IHN0cmluZyAqLwogICAgIHJldHZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGYtPmRpZ2VzdHNpemUgKiAyKTsKICAgICBpZiAoIXJldHZhbCkKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICBoZXhfZGlnZXN0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmV0dmFsKTsKICAgICBpZiAoIWhleF9kaWdlc3QpIHsKLQkgICAgUHlfREVDUkVGKHJldHZhbCk7Ci0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlfREVDUkVGKHJldHZhbCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBNYWtlIGhleCB2ZXJzaW9uIG9mIHRoZSBkaWdlc3QgKi8KICAgICBmb3IgKGk9aj0wOyBpPHNlbGYtPmRpZ2VzdHNpemU7IGkrKykgewogICAgICAgICBjaGFyIGM7CiAgICAgICAgIGMgPSAoZGlnZXN0W2ldID4+IDQpICYgMHhmOwotCWMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKKyAgICAgICAgYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOwogICAgICAgICBoZXhfZGlnZXN0W2orK10gPSBjOwogICAgICAgICBjID0gKGRpZ2VzdFtpXSAmIDB4Zik7Ci0JYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CiAgICAgICAgIGhleF9kaWdlc3RbaisrXSA9IGM7CiAgICAgfQogICAgIHJldHVybiByZXR2YWw7CkBAIC01NTksMTEgKzU1OSwxMSBAQAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU0hBX21ldGhvZHNbXSA9IHsKLSAgICB7ImNvcHkiLAkgIChQeUNGdW5jdGlvbilTSEE1MTJfY29weSwgICAgICBNRVRIX05PQVJHUywgU0hBNTEyX2NvcHlfX2RvY19ffSwKLSAgICB7ImRpZ2VzdCIsCSAgKFB5Q0Z1bmN0aW9uKVNIQTUxMl9kaWdlc3QsICAgIE1FVEhfTk9BUkdTLCBTSEE1MTJfZGlnZXN0X19kb2NfX30sCisgICAgeyJjb3B5IiwgICAgICAoUHlDRnVuY3Rpb24pU0hBNTEyX2NvcHksICAgICAgTUVUSF9OT0FSR1MsIFNIQTUxMl9jb3B5X19kb2NfX30sCisgICAgeyJkaWdlc3QiLCAgICAoUHlDRnVuY3Rpb24pU0hBNTEyX2RpZ2VzdCwgICAgTUVUSF9OT0FSR1MsIFNIQTUxMl9kaWdlc3RfX2RvY19ffSwKICAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbilTSEE1MTJfaGV4ZGlnZXN0LCBNRVRIX05PQVJHUywgU0hBNTEyX2hleGRpZ2VzdF9fZG9jX199LAotICAgIHsidXBkYXRlIiwJICAoUHlDRnVuY3Rpb24pU0hBNTEyX3VwZGF0ZSwgICAgTUVUSF9WQVJBUkdTLCBTSEE1MTJfdXBkYXRlX19kb2NfX30sCi0gICAge05VTEwsCSAgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJ1cGRhdGUiLCAgICAoUHlDRnVuY3Rpb24pU0hBNTEyX3VwZGF0ZSwgICAgTUVUSF9WQVJBUkdTLCBTSEE1MTJfdXBkYXRlX19kb2NfX30sCisgICAge05VTEwsICAgICAgICBOVUxMfSAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNjAzLDEzICs2MDMsMTMgQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBTSEEzODR0eXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotICAgICJfc2hhNTEyLnNoYTM4NCIsCS8qdHBfbmFtZSovCi0gICAgc2l6ZW9mKFNIQW9iamVjdCksCS8qdHBfc2l6ZSovCi0gICAgMCwJCQkvKnRwX2l0ZW1zaXplKi8KKyAgICAiX3NoYTUxMi5zaGEzODQiLCAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNIQW9iamVjdCksICAvKnRwX3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIFNIQTUxMl9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotICAgIDAsCQkJLyp0cF9wcmludCovCi0gICAgMCwgICAgICAgICAgCS8qdHBfZ2V0YXR0ciovCisgICAgU0hBNTEyX2RlYWxsb2MsICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwpAQCAtNjI1LDI1ICs2MjUsMjUgQEAKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsIC8qdHBfZmxhZ3MqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgMCwJCQkvKnRwX2NsZWFyKi8KLSAgICAwLAkJCS8qdHBfcmljaGNvbXBhcmUqLwotICAgIDAsCQkJLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgMCwJCQkvKnRwX2l0ZXIqLwotICAgIDAsCQkJLyp0cF9pdGVybmV4dCovCi0gICAgU0hBX21ldGhvZHMsCS8qIHRwX21ldGhvZHMgKi8KLSAgICBTSEFfbWVtYmVycywJLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIFNIQV9tZXRob2RzLCAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIFNIQV9tZW1iZXJzLCAgICAgICAgLyogdHBfbWVtYmVycyAqLwogICAgIFNIQV9nZXRzZXRlcnMsICAgICAgLyogdHBfZ2V0c2V0ICovCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNIQTUxMnR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0gICAgIl9zaGE1MTIuc2hhNTEyIiwJLyp0cF9uYW1lKi8KLSAgICBzaXplb2YoU0hBb2JqZWN0KSwJLyp0cF9zaXplKi8KLSAgICAwLAkJCS8qdHBfaXRlbXNpemUqLworICAgICJfc2hhNTEyLnNoYTUxMiIsICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoU0hBb2JqZWN0KSwgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgU0hBNTEyX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0gICAgMCwJCQkvKnRwX3ByaW50Ki8KLSAgICAwLCAgICAgICAgICAJLyp0cF9nZXRhdHRyKi8KKyAgICBTSEE1MTJfZGVhbGxvYywgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCkBAIC02NTksMTMgKzY1OSwxMyBAQAogICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyp0cF9mbGFncyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KLSAgICAwLAkJCS8qdHBfY2xlYXIqLwotICAgIDAsCQkJLyp0cF9yaWNoY29tcGFyZSovCi0gICAgMCwJCQkvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLSAgICAwLAkJCS8qdHBfaXRlciovCi0gICAgMCwJCQkvKnRwX2l0ZXJuZXh0Ki8KLSAgICBTSEFfbWV0aG9kcywJLyogdHBfbWV0aG9kcyAqLwotICAgIFNIQV9tZW1iZXJzLAkvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgU0hBX21ldGhvZHMsICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgU0hBX21lbWJlcnMsICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgU0hBX2dldHNldGVycywgICAgICAvKiB0cF9nZXRzZXQgKi8KIH07CiAKQEAgLTc0MCw3ICs3NDAsNyBAQAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBTSEFfZnVuY3Rpb25zW10gPSB7CiAgICAgeyJzaGE1MTIiLCAoUHlDRnVuY3Rpb24pU0hBNTEyX25ldywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFNIQTUxMl9uZXdfX2RvY19ffSwKICAgICB7InNoYTM4NCIsIChQeUNGdW5jdGlvbilTSEEzODRfbmV3LCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgU0hBMzg0X25ld19fZG9jX199LAotICAgIHtOVUxMLAlOVUxMfQkJIC8qIFNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgTlVMTH0gICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogCkBAIC03NjEsNyArNzYxLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfc2hhNTEyIiwgU0hBX2Z1bmN0aW9ucyk7CiAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NoYW1vZHVsZS5jIGIvTW9kdWxlcy9zaGFtb2R1bGUuYwppbmRleCAxYTdmYzJjLi5lZmQ3MjA0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NoYW1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2hhbW9kdWxlLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogLyogRW5kaWFubmVzcyB0ZXN0aW5nIGFuZCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBUZXN0RW5kaWFubmVzcyh2YXJpYWJsZSkge2ludCBpPTE7IHZhcmlhYmxlPVBDVF9CSUdfRU5ESUFOO1wKLQlpZiAoKigoY2hhciopJmkpPT0xKSB2YXJpYWJsZT1QQ1RfTElUVExFX0VORElBTjt9CisgICAgICAgIGlmICgqKChjaGFyKikmaSk9PTEpIHZhcmlhYmxlPVBDVF9MSVRUTEVfRU5ESUFOO30KIAogI2RlZmluZSBQQ1RfTElUVExFX0VORElBTiAxCiAjZGVmaW5lIFBDVF9CSUdfRU5ESUFOIDAKQEAgLTMxLDcgKzMxLDcgQEAKIHR5cGVkZWYgdW5zaWduZWQgY2hhciBTSEFfQllURTsKIAogI2lmIFNJWkVPRl9JTlQgPT0gNAotdHlwZWRlZiB1bnNpZ25lZCBpbnQgU0hBX0lOVDMyOwkvKiAzMi1iaXQgaW50ZWdlciAqLwordHlwZWRlZiB1bnNpZ25lZCBpbnQgU0hBX0lOVDMyOyAvKiAzMi1iaXQgaW50ZWdlciAqLwogI2Vsc2UKIC8qIG5vdCBkZWZpbmVkLiBjb21waWxhdGlvbiB3aWxsIGRpZS4gKi8KICNlbmRpZgpAQCAtNDUsMTEgKzQ1LDExIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0gICAgU0hBX0lOVDMyIGRpZ2VzdFs1XTsJCS8qIE1lc3NhZ2UgZGlnZXN0ICovCi0gICAgU0hBX0lOVDMyIGNvdW50X2xvLCBjb3VudF9oaTsJLyogNjQtYml0IGJpdCBjb3VudCAqLwotICAgIFNIQV9CWVRFIGRhdGFbU0hBX0JMT0NLU0laRV07CS8qIFNIQSBkYXRhIGJ1ZmZlciAqLworICAgIFNIQV9JTlQzMiBkaWdlc3RbNV07ICAgICAgICAgICAgICAgIC8qIE1lc3NhZ2UgZGlnZXN0ICovCisgICAgU0hBX0lOVDMyIGNvdW50X2xvLCBjb3VudF9oaTsgICAgICAgLyogNjQtYml0IGJpdCBjb3VudCAqLworICAgIFNIQV9CWVRFIGRhdGFbU0hBX0JMT0NLU0laRV07ICAgICAgIC8qIFNIQSBkYXRhIGJ1ZmZlciAqLwogICAgIGludCBFbmRpYW5uZXNzOwotICAgIGludCBsb2NhbDsJCQkJLyogdW5wcm9jZXNzZWQgYW1vdW50IGluIGRhdGEgKi8KKyAgICBpbnQgbG9jYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bnByb2Nlc3NlZCBhbW91bnQgaW4gZGF0YSAqLwogfSBTSEFvYmplY3Q7CiAKIC8qIFdoZW4gcnVuIG9uIGEgbGl0dGxlLWVuZGlhbiBDUFUgd2UgbmVlZCB0byBwZXJmb3JtIGJ5dGUgcmV2ZXJzYWwgb24gYW4KQEAgLTYwLDcgKzYwLDcgQEAKICAgICBTSEFfSU5UMzIgdmFsdWU7CiAKICAgICBpZiAoIEVuZGlhbm5lc3MgPT0gUENUX0JJR19FTkRJQU4gKQotCXJldHVybjsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgYnl0ZUNvdW50IC89IHNpemVvZigqYnVmZmVyKTsKICAgICB3aGlsZSAoYnl0ZUNvdW50LS0pIHsKQEAgLTExMSw0OCArMTExLDQ4IEBACiAgICBzYXZlIG9uZSBib29sZWFuIG9wZXJhdGlvbiBlYWNoIC0gdGhhbmtzIHRvIFJpY2ggU2Nocm9lcHBlbCwKICAgIHJjc0Bjcy5hcml6b25hLmVkdSBmb3IgZGlzY292ZXJpbmcgdGhpcyAqLwogCi0vKiNkZWZpbmUgZjEoeCx5LHopCSgoeCAmIHkpIHwgKH54ICYgeikpCQkvLyBSb3VuZHMgIDAtMTkgKi8KLSNkZWZpbmUgZjEoeCx5LHopCSh6IF4gKHggJiAoeSBeIHopKSkJCS8qIFJvdW5kcyAgMC0xOSAqLwotI2RlZmluZSBmMih4LHkseikJKHggXiB5IF4geikJCQkvKiBSb3VuZHMgMjAtMzkgKi8KLS8qI2RlZmluZSBmMyh4LHkseikJKCh4ICYgeSkgfCAoeCAmIHopIHwgKHkgJiB6KSkJLy8gUm91bmRzIDQwLTU5ICovCi0jZGVmaW5lIGYzKHgseSx6KQkoKHggJiB5KSB8ICh6ICYgKHggfCB5KSkpCS8qIFJvdW5kcyA0MC01OSAqLwotI2RlZmluZSBmNCh4LHkseikJKHggXiB5IF4geikJCQkvKiBSb3VuZHMgNjAtNzkgKi8KKy8qI2RlZmluZSBmMSh4LHkseikgICAgICgoeCAmIHkpIHwgKH54ICYgeikpICAgICAgICAgICAgLy8gUm91bmRzICAwLTE5ICovCisjZGVmaW5lIGYxKHgseSx6KSAgICAgICAoeiBeICh4ICYgKHkgXiB6KSkpICAgICAgICAgICAgIC8qIFJvdW5kcyAgMC0xOSAqLworI2RlZmluZSBmMih4LHkseikgICAgICAgKHggXiB5IF4geikgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgMjAtMzkgKi8KKy8qI2RlZmluZSBmMyh4LHkseikgICAgICgoeCAmIHkpIHwgKHggJiB6KSB8ICh5ICYgeikpICAgLy8gUm91bmRzIDQwLTU5ICovCisjZGVmaW5lIGYzKHgseSx6KSAgICAgICAoKHggJiB5KSB8ICh6ICYgKHggfCB5KSkpICAgICAgIC8qIFJvdW5kcyA0MC01OSAqLworI2RlZmluZSBmNCh4LHkseikgICAgICAgKHggXiB5IF4geikgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgNjAtNzkgKi8KIAogLyogU0hBIGNvbnN0YW50cyAqLwogCi0jZGVmaW5lIENPTlNUMQkJMHg1YTgyNzk5OUwJCQkvKiBSb3VuZHMgIDAtMTkgKi8KLSNkZWZpbmUgQ09OU1QyCQkweDZlZDllYmExTAkJCS8qIFJvdW5kcyAyMC0zOSAqLwotI2RlZmluZSBDT05TVDMJCTB4OGYxYmJjZGNMCQkJLyogUm91bmRzIDQwLTU5ICovCi0jZGVmaW5lIENPTlNUNAkJMHhjYTYyYzFkNkwJCQkvKiBSb3VuZHMgNjAtNzkgKi8KKyNkZWZpbmUgQ09OU1QxICAgICAgICAgIDB4NWE4Mjc5OTlMICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzICAwLTE5ICovCisjZGVmaW5lIENPTlNUMiAgICAgICAgICAweDZlZDllYmExTCAgICAgICAgICAgICAgICAgICAgIC8qIFJvdW5kcyAyMC0zOSAqLworI2RlZmluZSBDT05TVDMgICAgICAgICAgMHg4ZjFiYmNkY0wgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZHMgNDAtNTkgKi8KKyNkZWZpbmUgQ09OU1Q0ICAgICAgICAgIDB4Y2E2MmMxZDZMICAgICAgICAgICAgICAgICAgICAgLyogUm91bmRzIDYwLTc5ICovCiAKIC8qIDMyLWJpdCByb3RhdGUgKi8KIAotI2RlZmluZSBSMzIoeCxuKQkoKHggPDwgbikgfCAoeCA+PiAoMzIgLSBuKSkpCisjZGVmaW5lIFIzMih4LG4pICAgICAgICAoKHggPDwgbikgfCAoeCA+PiAoMzIgLSBuKSkpCiAKIC8qIHRoZSBnZW5lcmljIGNhc2UsIGZvciB3aGVuIHRoZSBvdmVyYWxsIHJvdGF0aW9uIGlzIG5vdCB1bnJhdmVsZWQgKi8KIAotI2RlZmluZSBGRyhuKQlcCi0gICAgVCA9IFIzMihBLDUpICsgZiMjbihCLEMsRCkgKyBFICsgKldQKysgKyBDT05TVCMjbjsJXAorI2RlZmluZSBGRyhuKSAgIFwKKyAgICBUID0gUjMyKEEsNSkgKyBmIyNuKEIsQyxEKSArIEUgKyAqV1ArKyArIENPTlNUIyNuOyAgXAogICAgIEUgPSBEOyBEID0gQzsgQyA9IFIzMihCLDMwKTsgQiA9IEE7IEEgPSBUCiAKIC8qIHNwZWNpZmljIGNhc2VzLCBmb3Igd2hlbiB0aGUgb3ZlcmFsbCByb3RhdGlvbiBpcyB1bnJhdmVsZWQgKi8KIAotI2RlZmluZSBGQShuKQlcCisjZGVmaW5lIEZBKG4pICAgXAogICAgIFQgPSBSMzIoQSw1KSArIGYjI24oQixDLEQpICsgRSArICpXUCsrICsgQ09OU1QjI247IEIgPSBSMzIoQiwzMCkKIAotI2RlZmluZSBGQihuKQlcCisjZGVmaW5lIEZCKG4pICAgXAogICAgIEUgPSBSMzIoVCw1KSArIGYjI24oQSxCLEMpICsgRCArICpXUCsrICsgQ09OU1QjI247IEEgPSBSMzIoQSwzMCkKIAotI2RlZmluZSBGQyhuKQlcCisjZGVmaW5lIEZDKG4pICAgXAogICAgIEQgPSBSMzIoRSw1KSArIGYjI24oVCxBLEIpICsgQyArICpXUCsrICsgQ09OU1QjI247IFQgPSBSMzIoVCwzMCkKIAotI2RlZmluZSBGRChuKQlcCisjZGVmaW5lIEZEKG4pICAgXAogICAgIEMgPSBSMzIoRCw1KSArIGYjI24oRSxULEEpICsgQiArICpXUCsrICsgQ09OU1QjI247IEUgPSBSMzIoRSwzMCkKIAotI2RlZmluZSBGRShuKQlcCisjZGVmaW5lIEZFKG4pICAgXAogICAgIEIgPSBSMzIoQyw1KSArIGYjI24oRCxFLFQpICsgQSArICpXUCsrICsgQ09OU1QjI247IEQgPSBSMzIoRCwzMCkKIAotI2RlZmluZSBGVChuKQlcCisjZGVmaW5lIEZUKG4pICAgXAogICAgIEEgPSBSMzIoQiw1KSArIGYjI24oQyxELEUpICsgVCArICpXUCsrICsgQ09OU1QjI247IEMgPSBSMzIoQywzMCkKIAogLyogZG8gU0hBIHRyYW5zZm9ybWF0aW9uICovCkBAIC0xNjcsMTAgKzE2NywxMCBAQAogICAgIGxvbmdSZXZlcnNlKFcsIChpbnQpc2l6ZW9mKHNoYV9pbmZvLT5kYXRhKSwgc2hhX2luZm8tPkVuZGlhbm5lc3MpOwogCiAgICAgZm9yIChpID0gMTY7IGkgPCA4MDsgKytpKSB7Ci0JV1tpXSA9IFdbaS0zXSBeIFdbaS04XSBeIFdbaS0xNF0gXiBXW2ktMTZdOworICAgICAgICBXW2ldID0gV1tpLTNdIF4gV1tpLThdIF4gV1tpLTE0XSBeIFdbaS0xNl07CiAKLQkvKiBleHRyYSByb3RhdGlvbiBmaXggKi8KLQlXW2ldID0gUjMyKFdbaV0sIDEpOworICAgICAgICAvKiBleHRyYSByb3RhdGlvbiBmaXggKi8KKyAgICAgICAgV1tpXSA9IFIzMihXW2ldLCAxKTsKICAgICB9CiAgICAgQSA9IHNoYV9pbmZvLT5kaWdlc3RbMF07CiAgICAgQiA9IHNoYV9pbmZvLT5kaWdlc3RbMV07CkBAIC0yODYsMTQgKzI4NiwxNCBAQAogICAgIGNvdW50ID0gKGludCkgKChsb19iaXRfY291bnQgPj4gMykgJiAweDNmKTsKICAgICAoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKVtjb3VudCsrXSA9IDB4ODA7CiAgICAgaWYgKGNvdW50ID4gU0hBX0JMT0NLU0laRSAtIDgpIHsKLQltZW1zZXQoKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSkgKyBjb3VudCwgMCwKLQkgICAgICAgU0hBX0JMT0NLU0laRSAtIGNvdW50KTsKLQlzaGFfdHJhbnNmb3JtKHNoYV9pbmZvKTsKLQltZW1zZXQoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhLCAwLCBTSEFfQkxPQ0tTSVpFIC0gOCk7CisgICAgICAgIG1lbXNldCgoKFNIQV9CWVRFICopIHNoYV9pbmZvLT5kYXRhKSArIGNvdW50LCAwLAorICAgICAgICAgICAgICAgU0hBX0JMT0NLU0laRSAtIGNvdW50KTsKKyAgICAgICAgc2hhX3RyYW5zZm9ybShzaGFfaW5mbyk7CisgICAgICAgIG1lbXNldCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEsIDAsIFNIQV9CTE9DS1NJWkUgLSA4KTsKICAgICB9CiAgICAgZWxzZSB7Ci0JbWVtc2V0KCgoU0hBX0JZVEUgKikgc2hhX2luZm8tPmRhdGEpICsgY291bnQsIDAsCi0JICAgICAgIFNIQV9CTE9DS1NJWkUgLSA4IC0gY291bnQpOworICAgICAgICBtZW1zZXQoKChTSEFfQllURSAqKSBzaGFfaW5mby0+ZGF0YSkgKyBjb3VudCwgMCwKKyAgICAgICAgICAgICAgIFNIQV9CTE9DS1NJWkUgLSA4IC0gY291bnQpOwogICAgIH0KIAogICAgIC8qIEdKUzogbm90ZSB0aGF0IHdlIGFkZCB0aGUgaGkvbG8gaW4gYmlnLWVuZGlhbi4gc2hhX3RyYW5zZm9ybSB3aWxsCkBAIC00MDIsMjEgKzQwMiwyMSBAQAogICAgIC8qIENyZWF0ZSBhIG5ldyBzdHJpbmcgKi8KICAgICByZXR2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplb2YoZGlnZXN0KSAqIDIpOwogICAgIGlmICghcmV0dmFsKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGhleF9kaWdlc3QgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXR2YWwpOwogICAgIGlmICghaGV4X2RpZ2VzdCkgewotCSAgICBQeV9ERUNSRUYocmV0dmFsKTsKLQkgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIC8qIE1ha2UgaGV4IHZlcnNpb24gb2YgdGhlIGRpZ2VzdCAqLwogICAgIGZvcihpPWo9MDsgaTxzaXplb2YoZGlnZXN0KTsgaSsrKSB7CiAgICAgICAgIGNoYXIgYzsKICAgICAgICAgYyA9IChkaWdlc3RbaV0gPj4gNCkgJiAweGY7Ci0JYyA9IChjPjkpID8gYysnYSctMTAgOiBjICsgJzAnOworICAgICAgICBjID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CiAgICAgICAgIGhleF9kaWdlc3RbaisrXSA9IGM7CiAgICAgICAgIGMgPSAoZGlnZXN0W2ldICYgMHhmKTsKLQljID0gKGM+OSkgPyBjKydhJy0xMCA6IGMgKyAnMCc7CisgICAgICAgIGMgPSAoYz45KSA/IGMrJ2EnLTEwIDogYyArICcwJzsKICAgICAgICAgaGV4X2RpZ2VzdFtqKytdID0gYzsKICAgICB9CiAgICAgcmV0dXJuIHJldHZhbDsKQEAgLTQ0MSwxMSArNDQxLDExIEBACiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBTSEFfbWV0aG9kc1tdID0gewotICAgIHsiY29weSIsCSAgKFB5Q0Z1bmN0aW9uKVNIQV9jb3B5LCAgICAgIE1FVEhfTk9BUkdTLCAgU0hBX2NvcHlfX2RvY19ffSwKLSAgICB7ImRpZ2VzdCIsCSAgKFB5Q0Z1bmN0aW9uKVNIQV9kaWdlc3QsICAgIE1FVEhfTk9BUkdTLCAgU0hBX2RpZ2VzdF9fZG9jX199LAorICAgIHsiY29weSIsICAgICAgKFB5Q0Z1bmN0aW9uKVNIQV9jb3B5LCAgICAgIE1FVEhfTk9BUkdTLCAgU0hBX2NvcHlfX2RvY19ffSwKKyAgICB7ImRpZ2VzdCIsICAgIChQeUNGdW5jdGlvbilTSEFfZGlnZXN0LCAgICBNRVRIX05PQVJHUywgIFNIQV9kaWdlc3RfX2RvY19ffSwKICAgICB7ImhleGRpZ2VzdCIsIChQeUNGdW5jdGlvbilTSEFfaGV4ZGlnZXN0LCBNRVRIX05PQVJHUywgIFNIQV9oZXhkaWdlc3RfX2RvY19ffSwKLSAgICB7InVwZGF0ZSIsCSAgKFB5Q0Z1bmN0aW9uKVNIQV91cGRhdGUsICAgIE1FVEhfVkFSQVJHUywgU0hBX3VwZGF0ZV9fZG9jX199LAotICAgIHtOVUxMLAkgIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsidXBkYXRlIiwgICAgKFB5Q0Z1bmN0aW9uKVNIQV91cGRhdGUsICAgIE1FVEhfVkFSQVJHUywgU0hBX3VwZGF0ZV9fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgTlVMTH0gICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ5MCwxMiArNDkwLDEyIEBACiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU0hBdHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLSAgICAiX3NoYS5zaGEiLAkJLyp0cF9uYW1lKi8KLSAgICBzaXplb2YoU0hBb2JqZWN0KSwJLyp0cF9zaXplKi8KLSAgICAwLAkJCS8qdHBfaXRlbXNpemUqLworICAgICJfc2hhLnNoYSIsICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoU0hBb2JqZWN0KSwgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgU0hBX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0gICAgMCwJCQkvKnRwX3ByaW50Ki8KKyAgICBTSEFfZGVhbGxvYywgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KQEAgLTUxMiwxMiArNTEyLDEyIEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAvKnRwX2ZsYWdzKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KICAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwotICAgIDAsCQkJLyp0cF9jbGVhciovCi0gICAgMCwJCQkvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAwLAkJCS8qdHBfd2Vha2xpc3RvZmZzZXQqLwotICAgIDAsCQkJLyp0cF9pdGVyKi8KLSAgICAwLAkJCS8qdHBfaXRlcm5leHQqLwotICAgIFNIQV9tZXRob2RzLAkvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgU0hBX21ldGhvZHMsICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgU0hBX2dldHNldGVycywgICAgICAvKiB0cF9nZXRzZXQgKi8KIH07CkBAIC01NjMsNyArNTYzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBTSEFfZnVuY3Rpb25zW10gPSB7CiAgICAgeyJuZXciLCAoUHlDRnVuY3Rpb24pU0hBX25ldywgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIFNIQV9uZXdfX2RvY19ffSwKLSAgICB7TlVMTCwJTlVMTH0JCSAvKiBTZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgIE5VTEx9ICAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIApAQCAtNTgxLDEyICs1ODEsMTIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfc2hhIiwgU0hBX2Z1bmN0aW9ucyk7CiAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCiAgICAgaW5zaW50KCJibG9ja3NpemUiLCAxKTsgIC8qIEZvciBmdXR1cmUgdXNlLCBpbiBjYXNlIHNvbWUgaGFzaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMgcmVxdWlyZSBhbiBpbnRlZ3JhbCBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzICovIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgKi8KICAgICBpbnNpbnQoImRpZ2VzdHNpemUiLCAyMCk7CiAgICAgaW5zaW50KCJkaWdlc3Rfc2l6ZSIsIDIwKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMgYi9Nb2R1bGVzL3NpZ25hbG1vZHVsZS5jCmluZGV4IGJiMzY0YWEuLjhiMTM3NGIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zaWduYWxtb2R1bGUuYwpAQCAtMjgsMTMgKzI4LDEzIEBACiAKICNpZm5kZWYgTlNJRwogIyBpZiBkZWZpbmVkKF9OU0lHKQotIyAgZGVmaW5lIE5TSUcgX05TSUcJCS8qIEZvciBCU0QvU3lzViAqLworIyAgZGVmaW5lIE5TSUcgX05TSUcgICAgICAgICAgICAvKiBGb3IgQlNEL1N5c1YgKi8KICMgZWxpZiBkZWZpbmVkKF9TSUdNQVgpCi0jICBkZWZpbmUgTlNJRyAoX1NJR01BWCArIDEpCS8qIEZvciBRTlggKi8KKyMgIGRlZmluZSBOU0lHIChfU0lHTUFYICsgMSkgICAgLyogRm9yIFFOWCAqLwogIyBlbGlmIGRlZmluZWQoU0lHTUFYKQotIyAgZGVmaW5lIE5TSUcgKFNJR01BWCArIDEpCS8qIEZvciBkamdwcCAqLworIyAgZGVmaW5lIE5TSUcgKFNJR01BWCArIDEpICAgICAvKiBGb3IgZGpncHAgKi8KICMgZWxzZQotIyAgZGVmaW5lIE5TSUcgNjQJCS8qIFVzZSBhIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZSAqLworIyAgZGVmaW5lIE5TSUcgNjQgICAgICAgICAgICAgICAvKiBVc2UgYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUgKi8KICMgZW5kaWYKICNlbmRpZgogCkBAIC03Niw4ICs3Niw4IEBACiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCB7Ci0gICAgICAgIGludCB0cmlwcGVkOwotICAgICAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBpbnQgdHJpcHBlZDsKKyAgICBQeU9iamVjdCAqZnVuYzsKIH0gSGFuZGxlcnNbTlNJR107CiAKIHN0YXRpYyBzaWdfYXRvbWljX3Qgd2FrZXVwX2ZkID0gLTE7CkBAIC0xMjAsMTggKzEyMCwxOCBAQAogCiAgICAgciA9IFB5VHVwbGVfTmV3KDIpOwogICAgIGlmIChyID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYoISh2ID0gUHlGbG9hdF9Gcm9tRG91YmxlKGRvdWJsZV9mcm9tX3RpbWV2YWwoJml2LT5pdF92YWx1ZSkpKSkgewotICAgICAgICBQeV9ERUNSRUYocik7ICAgCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBQeVR1cGxlX1NFVF9JVEVNKHIsIDAsIHYpOwogCiAgICAgaWYoISh2ID0gUHlGbG9hdF9Gcm9tRG91YmxlKGRvdWJsZV9mcm9tX3RpbWV2YWwoJml2LT5pdF9pbnRlcnZhbCkpKSkgewotICAgICAgICBQeV9ERUNSRUYocik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBQeVR1cGxlX1NFVF9JVEVNKHIsIDEsIHYpOwpAQCAtMTQzLDggKzE0Myw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2lnbmFsX2RlZmF1bHRfaW50X2hhbmRsZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5RXJyX1NldE5vbmUoUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoZGVmYXVsdF9pbnRfaGFuZGxlcl9kb2MsCkBAIC0xNTcsNyArMTU3LDcgQEAKIHN0YXRpYyBpbnQKIGNoZWNrc2lnbmFsc193aXRoYXJnKHZvaWQgKiB1bnVzZWQpCiB7Ci0JcmV0dXJuIFB5RXJyX0NoZWNrU2lnbmFscygpOworICAgIHJldHVybiBQeUVycl9DaGVja1NpZ25hbHMoKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2NSwzOCArMTY1LDM4IEBACiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKICNpZmRlZiBXSVRIX1BUSAotCWlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gbWFpbl90aHJlYWQpIHsKLQkJcHRoX3JhaXNlKCoocHRoX3QgKikgbWFpbl90aHJlYWQsIHNpZ19udW0pOwotCQlyZXR1cm47Ci0JfQorICAgIGlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gbWFpbl90aHJlYWQpIHsKKyAgICAgICAgcHRoX3JhaXNlKCoocHRoX3QgKikgbWFpbl90aHJlYWQsIHNpZ19udW0pOworICAgICAgICByZXR1cm47CisgICAgfQogI2VuZGlmCi0JLyogU2VlIE5PVEVTIHNlY3Rpb24gYWJvdmUgKi8KLQlpZiAoZ2V0cGlkKCkgPT0gbWFpbl9waWQpIHsKKyAgICAvKiBTZWUgTk9URVMgc2VjdGlvbiBhYm92ZSAqLworICAgIGlmIChnZXRwaWQoKSA9PSBtYWluX3BpZCkgewogI2VuZGlmCi0JCUhhbmRsZXJzW3NpZ19udW1dLnRyaXBwZWQgPSAxOwotICAgICAgICAgICAgICAgIC8qIFNldCBpc190cmlwcGVkIGFmdGVyIHNldHRpbmcgLnRyaXBwZWQsIGFzIGl0IGdldHMKLSAgICAgICAgICAgICAgICAgICBjbGVhcmVkIGluIFB5RXJyX0NoZWNrU2lnbmFscygpIGJlZm9yZSAudHJpcHBlZC4gKi8KLQkJaXNfdHJpcHBlZCA9IDE7Ci0JCVB5X0FkZFBlbmRpbmdDYWxsKGNoZWNrc2lnbmFsc193aXRoYXJnLCBOVUxMKTsKLQkJaWYgKHdha2V1cF9mZCAhPSAtMSkKLQkJCXdyaXRlKHdha2V1cF9mZCwgIlwwIiwgMSk7CisgICAgICAgIEhhbmRsZXJzW3NpZ19udW1dLnRyaXBwZWQgPSAxOworICAgICAgICAvKiBTZXQgaXNfdHJpcHBlZCBhZnRlciBzZXR0aW5nIC50cmlwcGVkLCBhcyBpdCBnZXRzCisgICAgICAgICAgIGNsZWFyZWQgaW4gUHlFcnJfQ2hlY2tTaWduYWxzKCkgYmVmb3JlIC50cmlwcGVkLiAqLworICAgICAgICBpc190cmlwcGVkID0gMTsKKyAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoY2hlY2tzaWduYWxzX3dpdGhhcmcsIE5VTEwpOworICAgICAgICBpZiAod2FrZXVwX2ZkICE9IC0xKQorICAgICAgICAgICAgd3JpdGUod2FrZXVwX2ZkLCAiXDAiLCAxKTsKICNpZmRlZiBXSVRIX1RIUkVBRAotCX0KKyAgICB9CiAjZW5kaWYKICNpZmRlZiBTSUdDSExECi0JaWYgKHNpZ19udW0gPT0gU0lHQ0hMRCkgewotCQkvKiBUbyBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHRoaXMgc2lnbmFsIHJlbWFpbnMKLQkJICAgcmVzZXQgdW50aWwgZXhwbGljaXQgcmUtaW5zdGF0ZWQuCi0JCSAgIERvbid0IGNsZWFyIHRoZSAnZnVuYycgZmllbGQgYXMgaXQgaXMgb3VyIHBvaW50ZXIKLQkJICAgdG8gdGhlIFB5dGhvbiBoYW5kbGVyLi4uICovCi0JCXJldHVybjsKLQl9CisgICAgaWYgKHNpZ19udW0gPT0gU0lHQ0hMRCkgeworICAgICAgICAvKiBUbyBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24sIHRoaXMgc2lnbmFsIHJlbWFpbnMKKyAgICAgICAgICAgcmVzZXQgdW50aWwgZXhwbGljaXQgcmUtaW5zdGF0ZWQuCisgICAgICAgICAgIERvbid0IGNsZWFyIHRoZSAnZnVuYycgZmllbGQgYXMgaXQgaXMgb3VyIHBvaW50ZXIKKyAgICAgICAgICAgdG8gdGhlIFB5dGhvbiBoYW5kbGVyLi4uICovCisgICAgICAgIHJldHVybjsKKyAgICB9CiAjZW5kaWYKICNpZm5kZWYgSEFWRV9TSUdBQ1RJT04KLQkvKiBJZiB0aGUgaGFuZGxlciB3YXMgbm90IHNldCB1cCB3aXRoIHNpZ2FjdGlvbiwgcmVpbnN0YWxsIGl0LiAgU2VlCi0JICogUHl0aG9uL3B5dGhvbnJ1bi5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2YgUHlPU19zZXRzaWcgd2hpY2gKLQkgKiBtYWtlcyB0aGlzIHRydWUuICBTZWUgYWxzbyBpc3N1ZTgzNTQuICovCi0JUHlPU19zZXRzaWcoc2lnX251bSwgc2lnbmFsX2hhbmRsZXIpOworICAgIC8qIElmIHRoZSBoYW5kbGVyIHdhcyBub3Qgc2V0IHVwIHdpdGggc2lnYWN0aW9uLCByZWluc3RhbGwgaXQuICBTZWUKKyAgICAgKiBQeXRob24vcHl0aG9ucnVuLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBQeU9TX3NldHNpZyB3aGljaAorICAgICAqIG1ha2VzIHRoaXMgdHJ1ZS4gIFNlZSBhbHNvIGlzc3VlODM1NC4gKi8KKyAgICBQeU9TX3NldHNpZyhzaWdfbnVtLCBzaWduYWxfaGFuZGxlcik7CiAjZW5kaWYKIH0KIApAQCAtMjA1LDExICsyMDUsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzaWduYWxfYWxhcm0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTphbGFybSIsICZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogYWxhcm0oKSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyByZW1haW5pbmcgKi8KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpYWxhcm0odCkpOworICAgIGludCB0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTphbGFybSIsICZ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogYWxhcm0oKSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyByZW1haW5pbmcgKi8KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpYWxhcm0odCkpOwogfQogCiBQeURvY19TVFJWQVIoYWxhcm1fZG9jLApAQCAtMjIyLDE3ICsyMjIsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzaWduYWxfcGF1c2UoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCSh2b2lkKXBhdXNlKCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkvKiBtYWtlIHN1cmUgdGhhdCBhbnkgZXhjZXB0aW9ucyB0aGF0IGdvdCByYWlzZWQgYXJlIHByb3BhZ2F0ZWQKLQkgKiBiYWNrIGludG8gUHl0aG9uCi0JICovCi0JaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgKHZvaWQpcGF1c2UoKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGFueSBleGNlcHRpb25zIHRoYXQgZ290IHJhaXNlZCBhcmUgcHJvcGFnYXRlZAorICAgICAqIGJhY2sgaW50byBQeXRob24KKyAgICAgKi8KKyAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIFB5RG9jX1NUUlZBUihwYXVzZV9kb2MsCiAicGF1c2UoKVxuXApAQCAtMjQ1LDQ0ICsyNDUsNDQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzaWduYWxfc2lnbmFsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb2JqOwotCWludCBzaWdfbnVtOwotCVB5T2JqZWN0ICpvbGRfaGFuZGxlcjsKLQl2b2lkICgqZnVuYykoaW50KTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOnNpZ25hbCIsICZzaWdfbnVtLCAmb2JqKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBpbnQgc2lnX251bTsKKyAgICBQeU9iamVjdCAqb2xkX2hhbmRsZXI7CisgICAgdm9pZCAoKmZ1bmMpKGludCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpzaWduYWwiLCAmc2lnX251bSwgJm9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic2lnbmFsIG9ubHkgd29ya3MgaW4gbWFpbiB0aHJlYWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gbWFpbl90aHJlYWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2lnbmFsIG9ubHkgd29ya3MgaW4gbWFpbiB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JaWYgKHNpZ19udW0gPCAxIHx8IHNpZ19udW0gPj0gTlNJRykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic2lnbmFsIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChvYmogPT0gSWdub3JlSGFuZGxlcikKLQkJZnVuYyA9IFNJR19JR047Ci0JZWxzZSBpZiAob2JqID09IERlZmF1bHRIYW5kbGVyKQotCQlmdW5jID0gU0lHX0RGTDsKLQllbHNlIGlmICghUHlDYWxsYWJsZV9DaGVjayhvYmopKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgaWYgKHNpZ19udW0gPCAxIHx8IHNpZ19udW0gPj0gTlNJRykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaWduYWwgbnVtYmVyIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG9iaiA9PSBJZ25vcmVIYW5kbGVyKQorICAgICAgICBmdW5jID0gU0lHX0lHTjsKKyAgICBlbHNlIGlmIChvYmogPT0gRGVmYXVsdEhhbmRsZXIpCisgICAgICAgIGZ1bmMgPSBTSUdfREZMOworICAgIGVsc2UgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICJzaWduYWwgaGFuZGxlciBtdXN0IGJlIHNpZ25hbC5TSUdfSUdOLCBzaWduYWwuU0lHX0RGTCwgb3IgYSBjYWxsYWJsZSBvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UKLQkJZnVuYyA9IHNpZ25hbF9oYW5kbGVyOwotCWlmIChQeU9TX3NldHNpZyhzaWdfbnVtLCBmdW5jKSA9PSBTSUdfRVJSKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19SdW50aW1lRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb2xkX2hhbmRsZXIgPSBIYW5kbGVyc1tzaWdfbnVtXS5mdW5jOwotCUhhbmRsZXJzW3NpZ19udW1dLnRyaXBwZWQgPSAwOwotCVB5X0lOQ1JFRihvYmopOwotCUhhbmRsZXJzW3NpZ19udW1dLmZ1bmMgPSBvYmo7Ci0JcmV0dXJuIG9sZF9oYW5kbGVyOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGZ1bmMgPSBzaWduYWxfaGFuZGxlcjsKKyAgICBpZiAoUHlPU19zZXRzaWcoc2lnX251bSwgZnVuYykgPT0gU0lHX0VSUikgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfUnVudGltZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9sZF9oYW5kbGVyID0gSGFuZGxlcnNbc2lnX251bV0uZnVuYzsKKyAgICBIYW5kbGVyc1tzaWdfbnVtXS50cmlwcGVkID0gMDsKKyAgICBQeV9JTkNSRUYob2JqKTsKKyAgICBIYW5kbGVyc1tzaWdfbnVtXS5mdW5jID0gb2JqOworICAgIHJldHVybiBvbGRfaGFuZGxlcjsKIH0KIAogUHlEb2NfU1RSVkFSKHNpZ25hbF9kb2MsCkBAIC0zMDAsMTggKzMwMCwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNpZ25hbF9nZXRzaWduYWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBzaWdfbnVtOwotCVB5T2JqZWN0ICpvbGRfaGFuZGxlcjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0c2lnbmFsIiwgJnNpZ19udW0pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc2lnX251bSA8IDEgfHwgc2lnX251bSA+PSBOU0lHKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzaWduYWwgbnVtYmVyIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb2xkX2hhbmRsZXIgPSBIYW5kbGVyc1tzaWdfbnVtXS5mdW5jOwotCVB5X0lOQ1JFRihvbGRfaGFuZGxlcik7Ci0JcmV0dXJuIG9sZF9oYW5kbGVyOworICAgIGludCBzaWdfbnVtOworICAgIFB5T2JqZWN0ICpvbGRfaGFuZGxlcjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0c2lnbmFsIiwgJnNpZ19udW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc2lnX251bSA8IDEgfHwgc2lnX251bSA+PSBOU0lHKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25hbCBudW1iZXIgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvbGRfaGFuZGxlciA9IEhhbmRsZXJzW3NpZ19udW1dLmZ1bmM7CisgICAgUHlfSU5DUkVGKG9sZF9oYW5kbGVyKTsKKyAgICByZXR1cm4gb2xkX2hhbmRsZXI7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRzaWduYWxfZG9jLApAQCAtMzMzLDIzICszMzMsMjMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzaWduYWxfc2lnaW50ZXJydXB0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc2lnX251bTsKLQlpbnQgZmxhZzsKKyAgICBpbnQgc2lnX251bTsKKyAgICBpbnQgZmxhZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6c2lnaW50ZXJydXB0IiwgJnNpZ19udW0sICZmbGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHNpZ19udW0gPCAxIHx8IHNpZ19udW0gPj0gTlNJRykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic2lnbmFsIG51bWJlciBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzaWdpbnRlcnJ1cHQoc2lnX251bSwgZmxhZyk8MCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfUnVudGltZUVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6c2lnaW50ZXJydXB0IiwgJnNpZ19udW0sICZmbGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNpZ19udW0gPCAxIHx8IHNpZ19udW0gPj0gTlNJRykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaWduYWwgbnVtYmVyIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHNpZ2ludGVycnVwdChzaWdfbnVtLCBmbGFnKTwwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19SdW50aW1lRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAjZW5kaWYKQEAgLTM1NywyNCArMzU3LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2lnbmFsX3NldF93YWtldXBfZmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0cnVjdCBzdGF0IGJ1ZjsKLQlpbnQgZmQsIG9sZF9mZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0X3dha2V1cF9mZCIsICZmZCkpCi0JCXJldHVybiBOVUxMOworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBpbnQgZmQsIG9sZF9mZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0X3dha2V1cF9mZCIsICZmZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic2V0X3dha2V1cF9mZCBvbmx5IHdvcmtzIGluIG1haW4gdGhyZWFkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNldF93YWtldXBfZmQgb25seSB3b3JrcyBpbiBtYWluIHRocmVhZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlpZiAoZmQgIT0gLTEgJiYgZnN0YXQoZmQsICZidWYpICE9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGZkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvbGRfZmQgPSB3YWtldXBfZmQ7Ci0Jd2FrZXVwX2ZkID0gZmQ7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhvbGRfZmQpOworICAgIGlmIChmZCAhPSAtMSAmJiBmc3RhdChmZCwgJmJ1ZikgIT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgZmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9sZF9mZCA9IHdha2V1cF9mZDsKKyAgICB3YWtldXBfZmQgPSBmZDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKG9sZF9mZCk7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRfd2FrZXVwX2ZkX2RvYywKQEAgLTM5MCwxMSArMzkwLDExIEBACiBpbnQKIFB5U2lnbmFsX1NldFdha2V1cEZkKGludCBmZCkKIHsKLQlpbnQgb2xkX2ZkID0gd2FrZXVwX2ZkOwotCWlmIChmZCA8IDApCi0JCWZkID0gLTE7Ci0Jd2FrZXVwX2ZkID0gZmQ7Ci0JcmV0dXJuIG9sZF9mZDsKKyAgICBpbnQgb2xkX2ZkID0gd2FrZXVwX2ZkOworICAgIGlmIChmZCA8IDApCisgICAgICAgIGZkID0gLTE7CisgICAgd2FrZXVwX2ZkID0gZmQ7CisgICAgcmV0dXJuIG9sZF9mZDsKIH0KIAogCkBAIC00MDgsMTQgKzQwOCwxNCBAQAogICAgIHN0cnVjdCBpdGltZXJ2YWwgbmV3LCBvbGQ7CiAKICAgICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWR8ZDpzZXRpdGltZXIiLCAmd2hpY2gsICZmaXJzdCwgJmludGVydmFsKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICB0aW1ldmFsX2Zyb21fZG91YmxlKGZpcnN0LCAmbmV3Lml0X3ZhbHVlKTsKICAgICB0aW1ldmFsX2Zyb21fZG91YmxlKGludGVydmFsLCAmbmV3Lml0X2ludGVydmFsKTsKICAgICAvKiBMZXQgT1MgY2hlY2sgIndoaWNoIiB2YWx1ZSAqLwogICAgIGlmIChzZXRpdGltZXIod2hpY2gsICZuZXcsICZvbGQpICE9IDApIHsKLSAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKEl0aW1lckVycm9yKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0RnJvbUVycm5vKEl0aW1lckVycm9yKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICByZXR1cm4gaXRpbWVyX3JldHZhbCgmb2xkKTsKQEAgLTQ0MSwxMSArNDQxLDExIEBACiAgICAgc3RydWN0IGl0aW1lcnZhbCBvbGQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Z2V0aXRpbWVyIiwgJndoaWNoKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoZ2V0aXRpbWVyKHdoaWNoLCAmb2xkKSAhPSAwKSB7Ci0gICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhJdGltZXJFcnJvcik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX1NldEZyb21FcnJubyhJdGltZXJFcnJvcik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIGl0aW1lcl9yZXR2YWwoJm9sZCk7CkBAIC00NjEsMjcgKzQ2MSwyNyBAQAogLyogTGlzdCBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlICovCiBzdGF0aWMgUHlNZXRob2REZWYgc2lnbmFsX21ldGhvZHNbXSA9IHsKICNpZmRlZiBIQVZFX0FMQVJNCi0JeyJhbGFybSIsCSAgICAgICAgc2lnbmFsX2FsYXJtLCBNRVRIX1ZBUkFSR1MsIGFsYXJtX2RvY30sCisgICAgeyJhbGFybSIsICAgICAgICAgICAgICAgICAgIHNpZ25hbF9hbGFybSwgTUVUSF9WQVJBUkdTLCBhbGFybV9kb2N9LAogI2VuZGlmCiAjaWZkZWYgSEFWRV9TRVRJVElNRVIKICAgICB7InNldGl0aW1lciIsICAgICAgIHNpZ25hbF9zZXRpdGltZXIsIE1FVEhfVkFSQVJHUywgc2V0aXRpbWVyX2RvY30sCiAjZW5kaWYKICNpZmRlZiBIQVZFX0dFVElUSU1FUgotCXsiZ2V0aXRpbWVyIiwgICAgICAgc2lnbmFsX2dldGl0aW1lciwgTUVUSF9WQVJBUkdTLCBnZXRpdGltZXJfZG9jfSwKKyAgICB7ImdldGl0aW1lciIsICAgICAgIHNpZ25hbF9nZXRpdGltZXIsIE1FVEhfVkFSQVJHUywgZ2V0aXRpbWVyX2RvY30sCiAjZW5kaWYKLQl7InNpZ25hbCIsCSAgICAgICAgc2lnbmFsX3NpZ25hbCwgTUVUSF9WQVJBUkdTLCBzaWduYWxfZG9jfSwKLQl7ImdldHNpZ25hbCIsCSAgICAgICAgc2lnbmFsX2dldHNpZ25hbCwgTUVUSF9WQVJBUkdTLCBnZXRzaWduYWxfZG9jfSwKLQl7InNldF93YWtldXBfZmQiLAlzaWduYWxfc2V0X3dha2V1cF9mZCwgTUVUSF9WQVJBUkdTLCBzZXRfd2FrZXVwX2ZkX2RvY30sCisgICAgeyJzaWduYWwiLCAgICAgICAgICAgICAgICAgIHNpZ25hbF9zaWduYWwsIE1FVEhfVkFSQVJHUywgc2lnbmFsX2RvY30sCisgICAgeyJnZXRzaWduYWwiLCAgICAgICAgICAgICAgIHNpZ25hbF9nZXRzaWduYWwsIE1FVEhfVkFSQVJHUywgZ2V0c2lnbmFsX2RvY30sCisgICAgeyJzZXRfd2FrZXVwX2ZkIiwgICAgICAgICAgIHNpZ25hbF9zZXRfd2FrZXVwX2ZkLCBNRVRIX1ZBUkFSR1MsIHNldF93YWtldXBfZmRfZG9jfSwKICNpZmRlZiBIQVZFX1NJR0lOVEVSUlVQVAotIAl7InNpZ2ludGVycnVwdCIsCXNpZ25hbF9zaWdpbnRlcnJ1cHQsIE1FVEhfVkFSQVJHUywgc2lnaW50ZXJydXB0X2RvY30sCisgICAgeyJzaWdpbnRlcnJ1cHQiLCAgICAgICAgICAgIHNpZ25hbF9zaWdpbnRlcnJ1cHQsIE1FVEhfVkFSQVJHUywgc2lnaW50ZXJydXB0X2RvY30sCiAjZW5kaWYKICNpZmRlZiBIQVZFX1BBVVNFCi0JeyJwYXVzZSIsCSAgICAgICAgKFB5Q0Z1bmN0aW9uKXNpZ25hbF9wYXVzZSwKLQkgTUVUSF9OT0FSR1MscGF1c2VfZG9jfSwKKyAgICB7InBhdXNlIiwgICAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNpZ25hbF9wYXVzZSwKKyAgICAgTUVUSF9OT0FSR1MscGF1c2VfZG9jfSwKICNlbmRpZgotCXsiZGVmYXVsdF9pbnRfaGFuZGxlciIsIHNpZ25hbF9kZWZhdWx0X2ludF9oYW5kbGVyLAotCSBNRVRIX1ZBUkFSR1MsIGRlZmF1bHRfaW50X2hhbmRsZXJfZG9jfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImRlZmF1bHRfaW50X2hhbmRsZXIiLCBzaWduYWxfZGVmYXVsdF9pbnRfaGFuZGxlciwKKyAgICAgTUVUSF9WQVJBUkdTLCBkZWZhdWx0X2ludF9oYW5kbGVyX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCkBAIC01MjQsMjUwICs1MjQsMjUwIEBACiBQeU1PRElOSVRfRlVOQwogaW5pdHNpZ25hbCh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZCwgKng7Ci0JaW50IGk7CisgICAgUHlPYmplY3QgKm0sICpkLCAqeDsKKyAgICBpbnQgaTsKIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JbWFpbl90aHJlYWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7Ci0JbWFpbl9waWQgPSBnZXRwaWQoKTsKKyAgICBtYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBtYWluX3BpZCA9IGdldHBpZCgpOwogI2VuZGlmCiAKLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLQltID0gUHlfSW5pdE1vZHVsZTMoInNpZ25hbCIsIHNpZ25hbF9tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJzaWduYWwiLCBzaWduYWxfbWV0aG9kcywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogCi0JeCA9IERlZmF1bHRIYW5kbGVyID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkICopU0lHX0RGTCk7Ci0gICAgICAgIGlmICgheCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHX0RGTCIsIHgpIDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgeCA9IERlZmF1bHRIYW5kbGVyID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkICopU0lHX0RGTCk7CisgICAgaWYgKCF4IHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdfREZMIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQl4ID0gSWdub3JlSGFuZGxlciA9IFB5TG9uZ19Gcm9tVm9pZFB0cigodm9pZCAqKVNJR19JR04pOwotICAgICAgICBpZiAoIXggfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR19JR04iLCB4KSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgIHggPSBJZ25vcmVIYW5kbGVyID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkICopU0lHX0lHTik7CisgICAgaWYgKCF4IHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdfSUdOIiwgeCkgPCAwKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLSAgICAgICAgeCA9IFB5SW50X0Zyb21Mb25nKChsb25nKU5TSUcpOwotICAgICAgICBpZiAoIXggfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5TSUciLCB4KSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwotICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKChsb25nKU5TSUcpOworICAgIGlmICgheCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTlNJRyIsIHgpIDwgMCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIFB5X0RFQ1JFRih4KTsKIAotCXggPSBJbnRIYW5kbGVyID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgImRlZmF1bHRfaW50X2hhbmRsZXIiKTsKLSAgICAgICAgaWYgKCF4KQotICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKLQlQeV9JTkNSRUYoSW50SGFuZGxlcik7CisgICAgeCA9IEludEhhbmRsZXIgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiZGVmYXVsdF9pbnRfaGFuZGxlciIpOworICAgIGlmICgheCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIFB5X0lOQ1JFRihJbnRIYW5kbGVyKTsKIAotCUhhbmRsZXJzWzBdLnRyaXBwZWQgPSAwOwotCWZvciAoaSA9IDE7IGkgPCBOU0lHOyBpKyspIHsKLQkJdm9pZCAoKnQpKGludCk7Ci0JCXQgPSBQeU9TX2dldHNpZyhpKTsKLQkJSGFuZGxlcnNbaV0udHJpcHBlZCA9IDA7Ci0JCWlmICh0ID09IFNJR19ERkwpCi0JCQlIYW5kbGVyc1tpXS5mdW5jID0gRGVmYXVsdEhhbmRsZXI7Ci0JCWVsc2UgaWYgKHQgPT0gU0lHX0lHTikKLQkJCUhhbmRsZXJzW2ldLmZ1bmMgPSBJZ25vcmVIYW5kbGVyOwotCQllbHNlCi0JCQlIYW5kbGVyc1tpXS5mdW5jID0gUHlfTm9uZTsgLyogTm9uZSBvZiBvdXIgYnVzaW5lc3MgKi8KLQkJUHlfSU5DUkVGKEhhbmRsZXJzW2ldLmZ1bmMpOwotCX0KLQlpZiAoSGFuZGxlcnNbU0lHSU5UXS5mdW5jID09IERlZmF1bHRIYW5kbGVyKSB7Ci0JCS8qIEluc3RhbGwgZGVmYXVsdCBpbnQgaGFuZGxlciAqLwotCQlQeV9JTkNSRUYoSW50SGFuZGxlcik7Ci0JCVB5X0RFQ1JFRihIYW5kbGVyc1tTSUdJTlRdLmZ1bmMpOwotCQlIYW5kbGVyc1tTSUdJTlRdLmZ1bmMgPSBJbnRIYW5kbGVyOwotCQlvbGRfc2lnaW50aGFuZGxlciA9IFB5T1Nfc2V0c2lnKFNJR0lOVCwgc2lnbmFsX2hhbmRsZXIpOwotCX0KKyAgICBIYW5kbGVyc1swXS50cmlwcGVkID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgTlNJRzsgaSsrKSB7CisgICAgICAgIHZvaWQgKCp0KShpbnQpOworICAgICAgICB0ID0gUHlPU19nZXRzaWcoaSk7CisgICAgICAgIEhhbmRsZXJzW2ldLnRyaXBwZWQgPSAwOworICAgICAgICBpZiAodCA9PSBTSUdfREZMKQorICAgICAgICAgICAgSGFuZGxlcnNbaV0uZnVuYyA9IERlZmF1bHRIYW5kbGVyOworICAgICAgICBlbHNlIGlmICh0ID09IFNJR19JR04pCisgICAgICAgICAgICBIYW5kbGVyc1tpXS5mdW5jID0gSWdub3JlSGFuZGxlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgSGFuZGxlcnNbaV0uZnVuYyA9IFB5X05vbmU7IC8qIE5vbmUgb2Ygb3VyIGJ1c2luZXNzICovCisgICAgICAgIFB5X0lOQ1JFRihIYW5kbGVyc1tpXS5mdW5jKTsKKyAgICB9CisgICAgaWYgKEhhbmRsZXJzW1NJR0lOVF0uZnVuYyA9PSBEZWZhdWx0SGFuZGxlcikgeworICAgICAgICAvKiBJbnN0YWxsIGRlZmF1bHQgaW50IGhhbmRsZXIgKi8KKyAgICAgICAgUHlfSU5DUkVGKEludEhhbmRsZXIpOworICAgICAgICBQeV9ERUNSRUYoSGFuZGxlcnNbU0lHSU5UXS5mdW5jKTsKKyAgICAgICAgSGFuZGxlcnNbU0lHSU5UXS5mdW5jID0gSW50SGFuZGxlcjsKKyAgICAgICAgb2xkX3NpZ2ludGhhbmRsZXIgPSBQeU9TX3NldHNpZyhTSUdJTlQsIHNpZ25hbF9oYW5kbGVyKTsKKyAgICB9CiAKICNpZmRlZiBTSUdIVVAKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSFVQKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSFVQIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0hVUCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0hVUCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdJTlQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSU5UKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSU5UIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0lOVCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lOVCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdCUkVBSwotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdCUkVBSyk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0JSRUFLIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0JSRUFLKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQlJFQUsiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHUVVJVAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdRVUlUKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUVVJVCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdRVUlUKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUVVJVCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdJTEwKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSUxMKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSUxMIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0lMTCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0lMTCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdUUkFQCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1RSQVApOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdUUkFQIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1RSQVApOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdUUkFQIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0lPVAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdJT1QpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJT1QiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSU9UKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSU9UIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0FCUlQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQUJSVCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0FCUlQiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQUJSVCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0FCUlQiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHRU1UCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0VNVCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0VNVCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdFTVQpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdFTVQiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHRlBFCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0ZQRSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0ZQRSIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdGUEUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdGUEUiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHS0lMTAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdLSUxMKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHS0lMTCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdLSUxMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHS0lMTCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdCVVMKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQlVTKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQlVTIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0JVUyk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0JVUyIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdTRUdWCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1NFR1YpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdTRUdWIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1NFR1YpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdTRUdWIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1NZUwotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdTWVMpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdTWVMiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHU1lTKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHU1lTIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1BJUEUKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUElQRSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1BJUEUiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUElQRSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1BJUEUiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHQUxSTQotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdBTFJNKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQUxSTSIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdBTFJNKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQUxSTSIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdURVJNCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1RFUk0pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdURVJNIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1RFUk0pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdURVJNIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1VTUjEKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVVNSMSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1VTUjEiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVVNSMSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1VTUjEiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHVVNSMgotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdVU1IyKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVVNSMiIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdVU1IyKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVVNSMiIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdDTEQKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHQ0xEKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQ0xEIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0NMRCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR0NMRCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdDSExECi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0NITEQpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdDSExEIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR0NITEQpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdDSExEIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1BXUgotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdQV1IpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdQV1IiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHUFdSKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUFdSIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR0lPCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR0lPKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSU8iLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHSU8pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdJTyIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdVUkcKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVVJHKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHVVJHIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1VSRyk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1VSRyIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdXSU5DSAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdXSU5DSCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1dJTkNIIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1dJTkNIKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHV0lOQ0giLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHUE9MTAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdQT0xMKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUE9MTCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdQT0xMKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUE9MTCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdTVE9QCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1NUT1ApOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdTVE9QIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1NUT1ApOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdTVE9QIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1RTVFAKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVFNUUCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RTVFAiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVFNUUCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RTVFAiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHQ09OVAotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdDT05UKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQ09OVCIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdDT05UKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHQ09OVCIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdUVElOCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1RUSU4pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdUVElOIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1RUSU4pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdUVElOIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1RUT1UKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVFRPVSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RUT1UiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHVFRPVSk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1RUT1UiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHVlRBTFJNCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1ZUQUxSTSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1ZUQUxSTSIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdWVEFMUk0pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdWVEFMUk0iLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHUFJPRgotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdQUk9GKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUFJPRiIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdQUk9GKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUFJPRiIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKICNpZmRlZiBTSUdYQ1BVCi0JeCA9IFB5SW50X0Zyb21Mb25nKFNJR1hDUFUpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdYQ1BVIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1hDUFUpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTSUdYQ1BVIiwgeCk7CisgICAgUHlfWERFQ1JFRih4KTsKICNlbmRpZgogI2lmZGVmIFNJR1hGU1oKLQl4ID0gUHlJbnRfRnJvbUxvbmcoU0lHWEZTWik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1hGU1oiLCB4KTsKLSAgICAgICAgUHlfWERFQ1JFRih4KTsKKyAgICB4ID0gUHlJbnRfRnJvbUxvbmcoU0lHWEZTWik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1hGU1oiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHUlRNSU4KLSAgICAgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1JUTUlOKTsKLSAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1JUTUlOIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1JUTUlOKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUlRNSU4iLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHUlRNQVgKLSAgICAgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1JUTUFYKTsKLSAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNJR1JUTUFYIiwgeCk7Ci0gICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgeCA9IFB5SW50X0Zyb21Mb25nKFNJR1JUTUFYKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHUlRNQVgiLCB4KTsKKyAgICBQeV9YREVDUkVGKHgpOwogI2VuZGlmCiAjaWZkZWYgU0lHSU5GTwotCXggPSBQeUludF9Gcm9tTG9uZyhTSUdJTkZPKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSU5GTyIsIHgpOwotICAgICAgICBQeV9YREVDUkVGKHgpOworICAgIHggPSBQeUludF9Gcm9tTG9uZyhTSUdJTkZPKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiU0lHSU5GTyIsIHgpOworICAgIFB5X1hERUNSRUYoeCk7CiAjZW5kaWYKIAogI2lmZGVmIElUSU1FUl9SRUFMCkBAIC03ODcsNDUgKzc4Nyw0NSBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkIChIQVZFX1NFVElUSU1FUikgfHwgZGVmaW5lZCAoSEFWRV9HRVRJVElNRVIpCi0gICAgSXRpbWVyRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNpZ25hbC5JdGltZXJFcnJvciIsIAotICAgICAgICAgUHlFeGNfSU9FcnJvciwgTlVMTCk7CisgICAgSXRpbWVyRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNpZ25hbC5JdGltZXJFcnJvciIsCisgICAgIFB5RXhjX0lPRXJyb3IsIE5VTEwpOwogICAgIGlmIChJdGltZXJFcnJvciAhPSBOVUxMKQotICAgIAlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSXRpbWVyRXJyb3IiLCBJdGltZXJFcnJvcik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkl0aW1lckVycm9yIiwgSXRpbWVyRXJyb3IpOwogI2VuZGlmCiAKLSAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotCS8qIENoZWNrIGZvciBlcnJvcnMgKi8KLSAgZmluYWxseToKKyAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybjsKKworICAgIC8qIENoZWNrIGZvciBlcnJvcnMgKi8KKyAgZmluYWxseToKKyAgICByZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkCiBmaW5pc2lnbmFsKHZvaWQpCiB7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKmZ1bmM7CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKmZ1bmM7CiAKLQlQeU9TX3NldHNpZyhTSUdJTlQsIG9sZF9zaWdpbnRoYW5kbGVyKTsKLQlvbGRfc2lnaW50aGFuZGxlciA9IFNJR19ERkw7CisgICAgUHlPU19zZXRzaWcoU0lHSU5ULCBvbGRfc2lnaW50aGFuZGxlcik7CisgICAgb2xkX3NpZ2ludGhhbmRsZXIgPSBTSUdfREZMOwogCi0JZm9yIChpID0gMTsgaSA8IE5TSUc7IGkrKykgewotCQlmdW5jID0gSGFuZGxlcnNbaV0uZnVuYzsKLQkJSGFuZGxlcnNbaV0udHJpcHBlZCA9IDA7Ci0JCUhhbmRsZXJzW2ldLmZ1bmMgPSBOVUxMOwotCQlpZiAoaSAhPSBTSUdJTlQgJiYgZnVuYyAhPSBOVUxMICYmIGZ1bmMgIT0gUHlfTm9uZSAmJgotCQkgICAgZnVuYyAhPSBEZWZhdWx0SGFuZGxlciAmJiBmdW5jICE9IElnbm9yZUhhbmRsZXIpCi0JCQlQeU9TX3NldHNpZyhpLCBTSUdfREZMKTsKLQkJUHlfWERFQ1JFRihmdW5jKTsKLQl9CisgICAgZm9yIChpID0gMTsgaSA8IE5TSUc7IGkrKykgeworICAgICAgICBmdW5jID0gSGFuZGxlcnNbaV0uZnVuYzsKKyAgICAgICAgSGFuZGxlcnNbaV0udHJpcHBlZCA9IDA7CisgICAgICAgIEhhbmRsZXJzW2ldLmZ1bmMgPSBOVUxMOworICAgICAgICBpZiAoaSAhPSBTSUdJTlQgJiYgZnVuYyAhPSBOVUxMICYmIGZ1bmMgIT0gUHlfTm9uZSAmJgorICAgICAgICAgICAgZnVuYyAhPSBEZWZhdWx0SGFuZGxlciAmJiBmdW5jICE9IElnbm9yZUhhbmRsZXIpCisgICAgICAgICAgICBQeU9TX3NldHNpZyhpLCBTSUdfREZMKTsKKyAgICAgICAgUHlfWERFQ1JFRihmdW5jKTsKKyAgICB9CiAKLQlQeV9YREVDUkVGKEludEhhbmRsZXIpOwotCUludEhhbmRsZXIgPSBOVUxMOwotCVB5X1hERUNSRUYoRGVmYXVsdEhhbmRsZXIpOwotCURlZmF1bHRIYW5kbGVyID0gTlVMTDsKLQlQeV9YREVDUkVGKElnbm9yZUhhbmRsZXIpOwotCUlnbm9yZUhhbmRsZXIgPSBOVUxMOworICAgIFB5X1hERUNSRUYoSW50SGFuZGxlcik7CisgICAgSW50SGFuZGxlciA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihEZWZhdWx0SGFuZGxlcik7CisgICAgRGVmYXVsdEhhbmRsZXIgPSBOVUxMOworICAgIFB5X1hERUNSRUYoSWdub3JlSGFuZGxlcik7CisgICAgSWdub3JlSGFuZGxlciA9IE5VTEw7CiB9CiAKIApAQCAtODMzLDU1ICs4MzMsNTUgQEAKIGludAogUHlFcnJfQ2hlY2tTaWduYWxzKHZvaWQpCiB7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKmY7CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKmY7CiAKLQlpZiAoIWlzX3RyaXBwZWQpCi0JCXJldHVybiAwOworICAgIGlmICghaXNfdHJpcHBlZCkKKyAgICAgICAgcmV0dXJuIDA7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCWlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gbWFpbl90aHJlYWQpCi0JCXJldHVybiAwOworICAgIGlmIChQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkgIT0gbWFpbl90aHJlYWQpCisgICAgICAgIHJldHVybiAwOwogI2VuZGlmCiAKLQkvKgotCSAqIFRoZSBpc19zdHJpcHBlZCB2YXJpYWJsZSBpcyBtZWFudCB0byBzcGVlZCB1cCB0aGUgY2FsbHMgdG8KLQkgKiBQeUVycl9DaGVja1NpZ25hbHMgKGJvdGggZGlyZWN0bHkgb3IgdmlhIHBlbmRpbmcgY2FsbHMpIHdoZW4gbm8KLQkgKiBzaWduYWwgaGFzIGFycml2ZWQuIFRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIDEgd2hlbiBhIHNpZ25hbCBhcnJpdmVzCi0JICogYW5kIGl0IGlzIHNldCB0byAwIGhlcmUsIHdoZW4gd2Uga25vdyBzb21lIHNpZ25hbHMgYXJyaXZlZC4gVGhpcyB3YXkKLQkgKiB3ZSBjYW4gcnVuIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzIHdpdGggbm8gc2lnbmFscyBibG9ja2VkLgotCSAqCi0JICogTk9URTogd2l0aCB0aGlzIGFwcHJvYWNoIHdlIGNhbiBoYXZlIGEgc2l0dWF0aW9uIHdoZXJlIGlzX3RyaXBwZWQgaXMKLQkgKiAgICAgICAxIGJ1dCB3ZSBoYXZlIG5vIG1vcmUgc2lnbmFscyB0byBoYW5kbGUgKEhhbmRsZXJzW2ldLnRyaXBwZWQKLQkgKiAgICAgICBpcyAwIGZvciBldmVyeSBzaWduYWwgaSkuIFRoaXMgd29uJ3QgZG8gdXMgYW55IGhhcm0gKGV4Y2VwdAotCSAqICAgICAgIHdlJ3JlIGdvbm5hIHNwZW50IHNvbWUgY3ljbGVzIGZvciBub3RoaW5nKS4gVGhpcyBoYXBwZW5zIHdoZW4KLQkgKiAgICAgICB3ZSByZWNlaXZlIGEgc2lnbmFsIGkgYWZ0ZXIgd2UgemVybyBpc190cmlwcGVkIGFuZCBiZWZvcmUgd2UKLQkgKiAgICAgICBjaGVjayBIYW5kbGVyc1tpXS50cmlwcGVkLgotCSAqLwotCWlzX3RyaXBwZWQgPSAwOworICAgIC8qCisgICAgICogVGhlIGlzX3N0cmlwcGVkIHZhcmlhYmxlIGlzIG1lYW50IHRvIHNwZWVkIHVwIHRoZSBjYWxscyB0bworICAgICAqIFB5RXJyX0NoZWNrU2lnbmFscyAoYm90aCBkaXJlY3RseSBvciB2aWEgcGVuZGluZyBjYWxscykgd2hlbiBubworICAgICAqIHNpZ25hbCBoYXMgYXJyaXZlZC4gVGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gMSB3aGVuIGEgc2lnbmFsIGFycml2ZXMKKyAgICAgKiBhbmQgaXQgaXMgc2V0IHRvIDAgaGVyZSwgd2hlbiB3ZSBrbm93IHNvbWUgc2lnbmFscyBhcnJpdmVkLiBUaGlzIHdheQorICAgICAqIHdlIGNhbiBydW4gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMgd2l0aCBubyBzaWduYWxzIGJsb2NrZWQuCisgICAgICoKKyAgICAgKiBOT1RFOiB3aXRoIHRoaXMgYXBwcm9hY2ggd2UgY2FuIGhhdmUgYSBzaXR1YXRpb24gd2hlcmUgaXNfdHJpcHBlZCBpcworICAgICAqICAgICAgIDEgYnV0IHdlIGhhdmUgbm8gbW9yZSBzaWduYWxzIHRvIGhhbmRsZSAoSGFuZGxlcnNbaV0udHJpcHBlZAorICAgICAqICAgICAgIGlzIDAgZm9yIGV2ZXJ5IHNpZ25hbCBpKS4gVGhpcyB3b24ndCBkbyB1cyBhbnkgaGFybSAoZXhjZXB0CisgICAgICogICAgICAgd2UncmUgZ29ubmEgc3BlbnQgc29tZSBjeWNsZXMgZm9yIG5vdGhpbmcpLiBUaGlzIGhhcHBlbnMgd2hlbgorICAgICAqICAgICAgIHdlIHJlY2VpdmUgYSBzaWduYWwgaSBhZnRlciB3ZSB6ZXJvIGlzX3RyaXBwZWQgYW5kIGJlZm9yZSB3ZQorICAgICAqICAgICAgIGNoZWNrIEhhbmRsZXJzW2ldLnRyaXBwZWQuCisgICAgICovCisgICAgaXNfdHJpcHBlZCA9IDA7CiAKLQlpZiAoIShmID0gKFB5T2JqZWN0ICopUHlFdmFsX0dldEZyYW1lKCkpKQotCQlmID0gUHlfTm9uZTsKKyAgICBpZiAoIShmID0gKFB5T2JqZWN0ICopUHlFdmFsX0dldEZyYW1lKCkpKQorICAgICAgICBmID0gUHlfTm9uZTsKIAotCWZvciAoaSA9IDE7IGkgPCBOU0lHOyBpKyspIHsKLQkJaWYgKEhhbmRsZXJzW2ldLnRyaXBwZWQpIHsKLQkJCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCQkJUHlPYmplY3QgKmFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCIoaU8pIiwgaSwgZik7Ci0JCQlIYW5kbGVyc1tpXS50cmlwcGVkID0gMDsKKyAgICBmb3IgKGkgPSAxOyBpIDwgTlNJRzsgaSsrKSB7CisgICAgICAgIGlmIChIYW5kbGVyc1tpXS50cmlwcGVkKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICphcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiKGlPKSIsIGksIGYpOworICAgICAgICAgICAgSGFuZGxlcnNbaV0udHJpcHBlZCA9IDA7CiAKLQkJCWlmIChhcmdsaXN0KSB7Ci0JCQkJcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoSGFuZGxlcnNbaV0uZnVuYywKLQkJCQkJCQkgICBhcmdsaXN0KTsKLQkJCQlQeV9ERUNSRUYoYXJnbGlzdCk7Ci0JCQl9Ci0JCQlpZiAoIXJlc3VsdCkKLQkJCQlyZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAoYXJnbGlzdCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KEhhbmRsZXJzW2ldLmZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnbGlzdCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ2xpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJfQotCX0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtODkxLDQ2ICs4OTEsNDYgQEAKIHZvaWQKIFB5RXJyX1NldEludGVycnVwdCh2b2lkKQogewotCWlzX3RyaXBwZWQgPSAxOwotCUhhbmRsZXJzW1NJR0lOVF0udHJpcHBlZCA9IDE7Ci0JUHlfQWRkUGVuZGluZ0NhbGwoKGludCAoKikodm9pZCAqKSlQeUVycl9DaGVja1NpZ25hbHMsIE5VTEwpOworICAgIGlzX3RyaXBwZWQgPSAxOworICAgIEhhbmRsZXJzW1NJR0lOVF0udHJpcHBlZCA9IDE7CisgICAgUHlfQWRkUGVuZGluZ0NhbGwoKGludCAoKikodm9pZCAqKSlQeUVycl9DaGVja1NpZ25hbHMsIE5VTEwpOwogfQogCiB2b2lkCiBQeU9TX0luaXRJbnRlcnJ1cHRzKHZvaWQpCiB7Ci0JaW5pdHNpZ25hbCgpOwotCV9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbigic2lnbmFsIiwgInNpZ25hbCIpOworICAgIGluaXRzaWduYWwoKTsKKyAgICBfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oInNpZ25hbCIsICJzaWduYWwiKTsKIH0KIAogdm9pZAogUHlPU19GaW5pSW50ZXJydXB0cyh2b2lkKQogewotCWZpbmlzaWduYWwoKTsKKyAgICBmaW5pc2lnbmFsKCk7CiB9CiAKIGludAogUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCh2b2lkKQogewotCWlmIChIYW5kbGVyc1tTSUdJTlRdLnRyaXBwZWQpIHsKKyAgICBpZiAoSGFuZGxlcnNbU0lHSU5UXS50cmlwcGVkKSB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJaWYgKFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSAhPSBtYWluX3RocmVhZCkKLQkJCXJldHVybiAwOworICAgICAgICBpZiAoUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAjZW5kaWYKLQkJSGFuZGxlcnNbU0lHSU5UXS50cmlwcGVkID0gMDsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgICAgICBIYW5kbGVyc1tTSUdJTlRdLnRyaXBwZWQgPSAwOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQKIFB5T1NfQWZ0ZXJGb3JrKHZvaWQpCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeUV2YWxfUmVJbml0VGhyZWFkcygpOwotCW1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCW1haW5fcGlkID0gZ2V0cGlkKCk7Ci0JX1B5SW1wb3J0X1JlSW5pdExvY2soKTsKLQlQeVRocmVhZF9SZUluaXRUTFMoKTsKKyAgICBQeUV2YWxfUmVJbml0VGhyZWFkcygpOworICAgIG1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIG1haW5fcGlkID0gZ2V0cGlkKCk7CisgICAgX1B5SW1wb3J0X1JlSW5pdExvY2soKTsKKyAgICBQeVRocmVhZF9SZUluaXRUTFMoKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKaW5kZXggMjA5YjcyZi4uYmZlNTNmMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCkBAIC0xNywxMSArMTcsMTEgQEAKIAogLSBzb2NrZXQuZXJyb3I6IGV4Y2VwdGlvbiByYWlzZWQgZm9yIHNvY2tldCBzcGVjaWZpYyBlcnJvcnMKIC0gc29ja2V0LmdhaWVycm9yOiBleGNlcHRpb24gcmFpc2VkIGZvciBnZXRhZGRyaW5mby9nZXRuYW1laW5mbyBlcnJvcnMsCi0JYSBzdWJjbGFzcyBvZiBzb2NrZXQuZXJyb3IKKyAgICBhIHN1YmNsYXNzIG9mIHNvY2tldC5lcnJvcgogLSBzb2NrZXQuaGVycm9yOiBleGNlcHRpb24gcmFpc2VkIGZvciBnZXRob3N0YnkqIGVycm9ycywKLQlhIHN1YmNsYXNzIG9mIHNvY2tldC5lcnJvcgorICAgIGEgc3ViY2xhc3Mgb2Ygc29ja2V0LmVycm9yCiAtIHNvY2tldC5mcm9tZmQoZmQsIGZhbWlseSwgdHlwZVssIHByb3RvXSkgLS0+IG5ldyBzb2NrZXQgb2JqZWN0IChjcmVhdGVkCi0gICAgICAgIGZyb20gYW4gZXhpc3RpbmcgZmlsZSBkZXNjcmlwdG9yKQorICAgIGZyb20gYW4gZXhpc3RpbmcgZmlsZSBkZXNjcmlwdG9yKQogLSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSkgLS0+IGhvc3QgSVAgYWRkcmVzcyAoc3RyaW5nOiAnZGQuZGQuZGQuZGQnKQogLSBzb2NrZXQuZ2V0aG9zdGJ5YWRkcihJUCBhZGRyZXNzKSAtLT4gKGhvc3RuYW1lLCBbYWxpYXMsIC4uLl0sIFtJUCBhZGRyLCAuLi5dKQogLSBzb2NrZXQuZ2V0aG9zdG5hbWUoKSAtLT4gaG9zdCBuYW1lIChzdHJpbmc6ICdzcGFtJyBvciAnc3BhbS5kb21haW4uY29tJykKQEAgLTM1LDcgKzM1LDcgQEAKIC0gc29ja2V0Lmh0b25zKDE2IGJpdCB2YWx1ZSkgLS0+IG5ldyBpbnQgb2JqZWN0CiAtIHNvY2tldC5odG9ubCgzMiBiaXQgdmFsdWUpIC0tPiBuZXcgaW50IG9iamVjdAogLSBzb2NrZXQuZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCBbLCBmYW1pbHksIHNvY2t0eXBlLCBwcm90bywgZmxhZ3NdKQotCS0tPiBMaXN0IG9mIChmYW1pbHksIHNvY2t0eXBlLCBwcm90bywgY2Fub25uYW1lLCBzb2NrYWRkcikKKyAgICAtLT4gTGlzdCBvZiAoZmFtaWx5LCBzb2NrdHlwZSwgcHJvdG8sIGNhbm9ubmFtZSwgc29ja2FkZHIpCiAtIHNvY2tldC5nZXRuYW1laW5mbyhzb2NrYWRkciwgZmxhZ3MpIC0tPiAoaG9zdCwgcG9ydCkKIC0gc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSwgZXRjLjogY29uc3RhbnRzIGZyb20gPHNvY2tldC5oPgogLSBzb2NrZXQuaGFzX2lwdjY6IGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiBJUHY2IGlzIHN1cHBvcnRlZApAQCAtNTUsMjIgKzU1LDIyIEBACiAgIHNwZWNpZnkgcGFja2V0LXR5cGUgYW5kIGhhLXR5cGUvYWRkci4KIC0gYW4gQUZfVElQQyBzb2NrZXQgYWRkcmVzcyBpcyBleHByZXNzZWQgYXMKICAoYWRkcl90eXBlLCB2MSwgdjIsIHYzIFssIHNjb3BlXSk7IHdoZXJlIGFkZHJfdHlwZSBjYW4gYmUgb25lIG9mOgotCVRJUENfQUREUl9OQU1FU0VRLCBUSVBDX0FERFJfTkFNRSwgYW5kIFRJUENfQUREUl9JRDsKKyAgICBUSVBDX0FERFJfTkFNRVNFUSwgVElQQ19BRERSX05BTUUsIGFuZCBUSVBDX0FERFJfSUQ7CiAgIGFuZCBzY29wZSBjYW4gYmUgb25lIG9mOgotCVRJUENfWk9ORV9TQ09QRSwgVElQQ19DTFVTVEVSX1NDT1BFLCBhbmQgVElQQ19OT0RFX1NDT1BFLgorICAgIFRJUENfWk9ORV9TQ09QRSwgVElQQ19DTFVTVEVSX1NDT1BFLCBhbmQgVElQQ19OT0RFX1NDT1BFLgogICBUaGUgbWVhbmluZyBvZiB2MSwgdjIgYW5kIHYzIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIGFkZHJfdHlwZToKLQlpZiBhZGRyX3R5cGUgaXMgVElQQ19BRERSX05BTUU6Ci0JCXYxIGlzIHRoZSBzZXJ2ZXIgdHlwZQotCQl2MiBpcyB0aGUgcG9ydCBpZGVudGlmaWVyCi0JCXYzIGlzIGlnbm9yZWQKLQlpZiBhZGRyX3R5cGUgaXMgVElQQ19BRERSX05BTUVTRVE6Ci0JCXYxIGlzIHRoZSBzZXJ2ZXIgdHlwZQotCQl2MiBpcyB0aGUgbG93ZXIgcG9ydCBudW1iZXIKLQkJdjMgaXMgdGhlIHVwcGVyIHBvcnQgbnVtYmVyCi0JaWYgYWRkcl90eXBlIGlzIFRJUENfQUREUl9JRDoKLQkJdjEgaXMgdGhlIG5vZGUKLQkJdjIgaXMgdGhlIHJlZgotCQl2MyBpcyBpZ25vcmVkCisgICAgaWYgYWRkcl90eXBlIGlzIFRJUENfQUREUl9OQU1FOgorICAgICAgICB2MSBpcyB0aGUgc2VydmVyIHR5cGUKKyAgICAgICAgdjIgaXMgdGhlIHBvcnQgaWRlbnRpZmllcgorICAgICAgICB2MyBpcyBpZ25vcmVkCisgICAgaWYgYWRkcl90eXBlIGlzIFRJUENfQUREUl9OQU1FU0VROgorICAgICAgICB2MSBpcyB0aGUgc2VydmVyIHR5cGUKKyAgICAgICAgdjIgaXMgdGhlIGxvd2VyIHBvcnQgbnVtYmVyCisgICAgICAgIHYzIGlzIHRoZSB1cHBlciBwb3J0IG51bWJlcgorICAgIGlmIGFkZHJfdHlwZSBpcyBUSVBDX0FERFJfSUQ6CisgICAgICAgIHYxIGlzIHRoZSBub2RlCisgICAgICAgIHYyIGlzIHRoZSByZWYKKyAgICAgICAgdjMgaXMgaWdub3JlZAogCiAKIExvY2FsIG5hbWluZyBjb252ZW50aW9uczoKQEAgLTI5NSw3ICsyOTUsNyBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogCiAjaWZuZGVmIG9mZnNldG9mCi0jIGRlZmluZSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpCSgoc2l6ZV90KSgmKCh0eXBlICopMCktPm1lbWJlcikpCisjIGRlZmluZSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpICgoc2l6ZV90KSgmKCh0eXBlICopMCktPm1lbWJlcikpCiAjZW5kaWYKIAogI2lmbmRlZiBPX05PTkJMT0NLCkBAIC00MTUsNyArNDE1LDcgQEAKICNkZWZpbmUgU0VHTUVOVF9TSVpFICgzMiAqIDEwMjQgLTEpCiAjZW5kaWYKIAotI2RlZmluZQlTQVMyU0EoeCkJKChzdHJ1Y3Qgc29ja2FkZHIgKikoeCkpCisjZGVmaW5lIFNBUzJTQSh4KSAgICAgICAoKHN0cnVjdCBzb2NrYWRkciAqKSh4KSkKIAogLyoKICAqIENvbnN0YW50cyBmb3IgZ2V0bmFtZWluZm8oKQpAQCAtNDcxLDggKzQ3MSw4IEBACiBzdGF0aWMgUHlPYmplY3QqCiBzZWxlY3RfZXJyb3Iodm9pZCkKIHsKLQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAidW5hYmxlIHRvIHNlbGVjdCBvbiBzb2NrZXQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAidW5hYmxlIHRvIHNlbGVjdCBvbiBzb2NrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gcmFpc2UgYW4gZXJyb3IgYWNjb3JkaW5nIHRvIGVycm5vCkBAIC00ODIsMTA3ICs0ODIsMTA3IEBACiBzZXRfZXJyb3Iodm9pZCkKIHsKICNpZmRlZiBNU19XSU5ET1dTCi0JaW50IGVycl9ubyA9IFdTQUdldExhc3RFcnJvcigpOwotCS8qIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKCkgaW52b2tlcyBGb3JtYXRNZXNzYWdlKCkgd2hpY2gKLQkgICByZWNvZ25pemVzIHRoZSBlcnJvciBjb2RlcyB1c2VkIGJ5IGJvdGggR2V0TGFzdEVycm9yKCkgYW5kCi0JICAgV1NBR2V0TGFzdEVycm9yICovCi0JaWYgKGVycl9ubykKLQkJcmV0dXJuIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyKHNvY2tldF9lcnJvciwgZXJyX25vKTsKKyAgICBpbnQgZXJyX25vID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgLyogUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoKSBpbnZva2VzIEZvcm1hdE1lc3NhZ2UoKSB3aGljaAorICAgICAgIHJlY29nbml6ZXMgdGhlIGVycm9yIGNvZGVzIHVzZWQgYnkgYm90aCBHZXRMYXN0RXJyb3IoKSBhbmQKKyAgICAgICBXU0FHZXRMYXN0RXJyb3IgKi8KKyAgICBpZiAoZXJyX25vKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoc29ja2V0X2Vycm9yLCBlcnJfbm8pOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiAhZGVmaW5lZChQWUNDX0dDQykKLQlpZiAoc29ja19lcnJubygpICE9IE5PX0VSUk9SKSB7Ci0JCUFQSVJFVCByYzsKLQkJVUxPTkcgIG1zZ2xlbjsKLQkJY2hhciBvdXRidWZbMTAwXTsKLQkJaW50IG15ZXJyb3Jjb2RlID0gc29ja19lcnJubygpOworICAgIGlmIChzb2NrX2Vycm5vKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQVBJUkVUIHJjOworICAgICAgICBVTE9ORyAgbXNnbGVuOworICAgICAgICBjaGFyIG91dGJ1ZlsxMDBdOworICAgICAgICBpbnQgbXllcnJvcmNvZGUgPSBzb2NrX2Vycm5vKCk7CiAKLQkJLyogUmV0cmlldmUgc29ja2V0LXJlbGF0ZWQgZXJyb3IgbWVzc2FnZSBmcm9tIE1QVE4uTVNHIGZpbGUgKi8KLQkJcmMgPSBEb3NHZXRNZXNzYWdlKE5VTEwsIDAsIG91dGJ1Ziwgc2l6ZW9mKG91dGJ1ZiksCi0JCQkJICAgbXllcnJvcmNvZGUgLSBTT0NCQVNFRVJSICsgMjYsCi0JCQkJICAgIm1wdG4ubXNnIiwKLQkJCQkgICAmbXNnbGVuKTsKLQkJaWYgKHJjID09IE5PX0VSUk9SKSB7Ci0JCQlQeU9iamVjdCAqdjsKKyAgICAgICAgLyogUmV0cmlldmUgc29ja2V0LXJlbGF0ZWQgZXJyb3IgbWVzc2FnZSBmcm9tIE1QVE4uTVNHIGZpbGUgKi8KKyAgICAgICAgcmMgPSBEb3NHZXRNZXNzYWdlKE5VTEwsIDAsIG91dGJ1Ziwgc2l6ZW9mKG91dGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBteWVycm9yY29kZSAtIFNPQ0JBU0VFUlIgKyAyNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcHRuLm1zZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnbGVuKTsKKyAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdjsKIAotCQkJLyogT1MvMiBkb2Vzbid0IGd1YXJhbnRlZSBhIHRlcm1pbmF0b3IgKi8KLQkJCW91dGJ1Zlttc2dsZW5dID0gJ1wwJzsKLQkJCWlmIChzdHJsZW4ob3V0YnVmKSA+IDApIHsKLQkJCQkvKiBJZiBub24tZW1wdHkgbXNnLCB0cmltIENSTEYgKi8KLQkJCQljaGFyICpsYXN0YyA9ICZvdXRidWZbIHN0cmxlbihvdXRidWYpLTEgXTsKLQkJCQl3aGlsZSAobGFzdGMgPiBvdXRidWYgJiYKLQkJCQkgICAgICAgaXNzcGFjZShQeV9DSEFSTUFTSygqbGFzdGMpKSkgewotCQkJCQkvKiBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2UgKENSTEYpICovCi0JCQkJCSpsYXN0Yy0tID0gJ1wwJzsKLQkJCQl9Ci0JCQl9Ci0JCQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIG15ZXJyb3Jjb2RlLCBvdXRidWYpOwotCQkJaWYgKHYgIT0gTlVMTCkgewotCQkJCVB5RXJyX1NldE9iamVjdChzb2NrZXRfZXJyb3IsIHYpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCX0KLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgICAgICAgICAgLyogT1MvMiBkb2Vzbid0IGd1YXJhbnRlZSBhIHRlcm1pbmF0b3IgKi8KKyAgICAgICAgICAgIG91dGJ1Zlttc2dsZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIGlmIChzdHJsZW4ob3V0YnVmKSA+IDApIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBub24tZW1wdHkgbXNnLCB0cmltIENSTEYgKi8KKyAgICAgICAgICAgICAgICBjaGFyICpsYXN0YyA9ICZvdXRidWZbIHN0cmxlbihvdXRidWYpLTEgXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobGFzdGMgPiBvdXRidWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgaXNzcGFjZShQeV9DSEFSTUFTSygqbGFzdGMpKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBUcmltIHRyYWlsaW5nIHdoaXRlc3BhY2UgKENSTEYpICovCisgICAgICAgICAgICAgICAgICAgICpsYXN0Yy0tID0gJ1wwJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIG15ZXJyb3Jjb2RlLCBvdXRidWYpOworICAgICAgICAgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChzb2NrZXRfZXJyb3IsIHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKICNpZiBkZWZpbmVkKFJJU0NPUykKLQlpZiAoX2luZXRfZXJyb3IuZXJybnVtICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnY7Ci0JCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJybm8sIF9pbmV0X2VycigpKTsKLQkJaWYgKHYgIT0gTlVMTCkgewotCQkJUHlFcnJfU2V0T2JqZWN0KHNvY2tldF9lcnJvciwgdik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChfaW5ldF9lcnJvci5lcnJudW0gIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnJubywgX2luZXRfZXJyKCkpOworICAgICAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRPYmplY3Qoc29ja2V0X2Vycm9yLCB2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oc29ja2V0X2Vycm9yKTsKKyAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKHNvY2tldF9lcnJvcik7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9oZXJyb3IoaW50IGhfZXJyb3IpCiB7Ci0JUHlPYmplY3QgKnY7CisgICAgUHlPYmplY3QgKnY7CiAKICNpZmRlZiBIQVZFX0hTVFJFUlJPUgotCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgaF9lcnJvciwgKGNoYXIgKiloc3RyZXJyb3IoaF9lcnJvcikpOworICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgaF9lcnJvciwgKGNoYXIgKiloc3RyZXJyb3IoaF9lcnJvcikpOwogI2Vsc2UKLQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGhfZXJyb3IsICJob3N0IG5vdCBmb3VuZCIpOworICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgaF9lcnJvciwgImhvc3Qgbm90IGZvdW5kIik7CiAjZW5kaWYKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCVB5RXJyX1NldE9iamVjdChzb2NrZXRfaGVycm9yLCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldE9iamVjdChzb2NrZXRfaGVycm9yLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZ2FpZXJyb3IoaW50IGVycm9yKQogewotCVB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2OwogCiAjaWZkZWYgRUFJX1NZU1RFTQotCS8qIEVBSV9TWVNURU0gaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzIFhQLiAqLwotCWlmIChlcnJvciA9PSBFQUlfU1lTVEVNKQotCQlyZXR1cm4gc2V0X2Vycm9yKCk7CisgICAgLyogRUFJX1NZU1RFTSBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MgWFAuICovCisgICAgaWYgKGVycm9yID09IEVBSV9TWVNURU0pCisgICAgICAgIHJldHVybiBzZXRfZXJyb3IoKTsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9HQUlfU1RSRVJST1IKLQl2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGVycm9yLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKKyAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzKSIsIGVycm9yLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKICNlbHNlCi0JdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnJvciwgImdldGFkZHJpbmZvIGZhaWxlZCIpOworICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJyb3IsICJnZXRhZGRyaW5mbyBmYWlsZWQiKTsKICNlbmRpZgotCWlmICh2ICE9IE5VTEwpIHsKLQkJUHlFcnJfU2V0T2JqZWN0KHNvY2tldF9nYWllcnJvciwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRPYmplY3Qoc29ja2V0X2dhaWVycm9yLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiAjaWZkZWYgX19WTVMKQEAgLTU5MCwyMiArNTkwLDIyIEBACiBzdGF0aWMgaW50CiBzZW5kc2VnbWVudGVkKGludCBzb2NrX2ZkLCBjaGFyICpidWYsIGludCBsZW4sIGludCBmbGFncykKIHsKLQlpbnQgbiA9IDA7Ci0JaW50IHJlbWFpbmluZyA9IGxlbjsKKyAgICBpbnQgbiA9IDA7CisgICAgaW50IHJlbWFpbmluZyA9IGxlbjsKIAotCXdoaWxlIChyZW1haW5pbmcgPiAwKSB7Ci0JCXVuc2lnbmVkIGludCBzZWdtZW50OworICAgIHdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBzZWdtZW50OwogCi0JCXNlZ21lbnQgPSAocmVtYWluaW5nID49IFNFR01FTlRfU0laRSA/IFNFR01FTlRfU0laRSA6IHJlbWFpbmluZyk7Ci0JCW4gPSBzZW5kKHNvY2tfZmQsIGJ1Ziwgc2VnbWVudCwgZmxhZ3MpOwotCQlpZiAobiA8IDApIHsKLQkJCXJldHVybiBuOwotCQl9Ci0JCXJlbWFpbmluZyAtPSBzZWdtZW50OwotCQlidWYgKz0gc2VnbWVudDsKLQl9IC8qIGVuZCB3aGlsZSAqLworICAgICAgICBzZWdtZW50ID0gKHJlbWFpbmluZyA+PSBTRUdNRU5UX1NJWkUgPyBTRUdNRU5UX1NJWkUgOiByZW1haW5pbmcpOworICAgICAgICBuID0gc2VuZChzb2NrX2ZkLCBidWYsIHNlZ21lbnQsIGZsYWdzKTsKKyAgICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorICAgICAgICByZW1haW5pbmcgLT0gc2VnbWVudDsKKyAgICAgICAgYnVmICs9IHNlZ21lbnQ7CisgICAgfSAvKiBlbmQgd2hpbGUgKi8KIAotCXJldHVybiBsZW47CisgICAgcmV0dXJuIGxlbjsKIH0KICNlbmRpZgogCkBAIC02MTYsNDUgKzYxNiw0NSBAQAogewogI2lmbmRlZiBSSVNDT1MKICNpZm5kZWYgTVNfV0lORE9XUwotCWludCBkZWxheV9mbGFnOworICAgIGludCBkZWxheV9mbGFnOwogI2VuZGlmCiAjZW5kaWYKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjaWZkZWYgX19CRU9TX18KLQlibG9jayA9ICFibG9jazsKLQlzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIFNPTF9TT0NLRVQsIFNPX05PTkJMT0NLLAotCQkgICAodm9pZCAqKSgmYmxvY2spLCBzaXplb2YoaW50KSk7CisgICAgYmxvY2sgPSAhYmxvY2s7CisgICAgc2V0c29ja29wdChzLT5zb2NrX2ZkLCBTT0xfU09DS0VULCBTT19OT05CTE9DSywKKyAgICAgICAgICAgICAgICh2b2lkICopKCZibG9jayksIHNpemVvZihpbnQpKTsKICNlbHNlCiAjaWZuZGVmIFJJU0NPUwogI2lmbmRlZiBNU19XSU5ET1dTCiAjaWYgZGVmaW5lZChQWU9TX09TMikgJiYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JYmxvY2sgPSAhYmxvY2s7Ci0JaW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKGNhZGRyX3QpJmJsb2NrLCBzaXplb2YoYmxvY2spKTsKKyAgICBibG9jayA9ICFibG9jazsKKyAgICBpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAoY2FkZHJfdCkmYmxvY2ssIHNpemVvZihibG9jaykpOwogI2VsaWYgZGVmaW5lZChfX1ZNUykKLQlibG9jayA9ICFibG9jazsKLQlpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodW5zaWduZWQgaW50ICopJmJsb2NrKTsKKyAgICBibG9jayA9ICFibG9jazsKKyAgICBpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodW5zaWduZWQgaW50ICopJmJsb2NrKTsKICNlbHNlICAvKiAhUFlPU19PUzIgJiYgIV9fVk1TICovCi0JZGVsYXlfZmxhZyA9IGZjbnRsKHMtPnNvY2tfZmQsIEZfR0VURkwsIDApOwotCWlmIChibG9jaykKLQkJZGVsYXlfZmxhZyAmPSAofk9fTk9OQkxPQ0spOwotCWVsc2UKLQkJZGVsYXlfZmxhZyB8PSBPX05PTkJMT0NLOwotCWZjbnRsKHMtPnNvY2tfZmQsIEZfU0VURkwsIGRlbGF5X2ZsYWcpOworICAgIGRlbGF5X2ZsYWcgPSBmY250bChzLT5zb2NrX2ZkLCBGX0dFVEZMLCAwKTsKKyAgICBpZiAoYmxvY2spCisgICAgICAgIGRlbGF5X2ZsYWcgJj0gKH5PX05PTkJMT0NLKTsKKyAgICBlbHNlCisgICAgICAgIGRlbGF5X2ZsYWcgfD0gT19OT05CTE9DSzsKKyAgICBmY250bChzLT5zb2NrX2ZkLCBGX1NFVEZMLCBkZWxheV9mbGFnKTsKICNlbmRpZiAvKiAhUFlPU19PUzIgKi8KICNlbHNlIC8qIE1TX1dJTkRPV1MgKi8KLQlibG9jayA9ICFibG9jazsKLQlpb2N0bHNvY2tldChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodV9sb25nKikmYmxvY2spOworICAgIGJsb2NrID0gIWJsb2NrOworICAgIGlvY3Rsc29ja2V0KHMtPnNvY2tfZmQsIEZJT05CSU8sICh1X2xvbmcqKSZibG9jayk7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogI2Vsc2UgLyogUklTQ09TICovCi0JYmxvY2sgPSAhYmxvY2s7Ci0Jc29ja2V0aW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKHVfbG9uZyopJmJsb2NrKTsKKyAgICBibG9jayA9ICFibG9jazsKKyAgICBzb2NrZXRpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAodV9sb25nKikmYmxvY2spOwogI2VuZGlmIC8qIFJJU0NPUyAqLwogI2VuZGlmIC8qIF9fQkVPU19fICovCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JLyogU2luY2UgdGhlc2UgZG9uJ3QgcmV0dXJuIGFueXRoaW5nICovCi0JcmV0dXJuIDE7CisgICAgLyogU2luY2UgdGhlc2UgZG9uJ3QgcmV0dXJuIGFueXRoaW5nICovCisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIERvIGEgc2VsZWN0KCkvcG9sbCgpIG9uIHRoZSBzb2NrZXQsIGlmIG5lY2Vzc2FyeSAoc29ja190aW1lb3V0ID4gMCkuCkBAIC02NjUsNTMgKzY2NSw1MyBAQAogc3RhdGljIGludAogaW50ZXJuYWxfc2VsZWN0KFB5U29ja2V0U29ja09iamVjdCAqcywgaW50IHdyaXRpbmcpCiB7Ci0JaW50IG47CisgICAgaW50IG47CiAKLQkvKiBOb3RoaW5nIHRvIGRvIHVubGVzcyB3ZSdyZSBpbiB0aW1lb3V0IG1vZGUgKG5vdCBub24tYmxvY2tpbmcpICovCi0JaWYgKHMtPnNvY2tfdGltZW91dCA8PSAwLjApCi0JCXJldHVybiAwOworICAgIC8qIE5vdGhpbmcgdG8gZG8gdW5sZXNzIHdlJ3JlIGluIHRpbWVvdXQgbW9kZSAobm90IG5vbi1ibG9ja2luZykgKi8KKyAgICBpZiAocy0+c29ja190aW1lb3V0IDw9IDAuMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBHdWFyZCBhZ2FpbnN0IGNsb3NlZCBzb2NrZXQgKi8KLQlpZiAocy0+c29ja19mZCA8IDApCi0JCXJldHVybiAwOworICAgIC8qIEd1YXJkIGFnYWluc3QgY2xvc2VkIHNvY2tldCAqLworICAgIGlmIChzLT5zb2NrX2ZkIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBQcmVmZXIgcG9sbCwgaWYgYXZhaWxhYmxlLCBzaW5jZSB5b3UgY2FuIHBvbGwoKSBhbnkgZmQKLQkgKiB3aGljaCBjYW4ndCBiZSBkb25lIHdpdGggc2VsZWN0KCkuICovCisgICAgLyogUHJlZmVyIHBvbGwsIGlmIGF2YWlsYWJsZSwgc2luY2UgeW91IGNhbiBwb2xsKCkgYW55IGZkCisgICAgICogd2hpY2ggY2FuJ3QgYmUgZG9uZSB3aXRoIHNlbGVjdCgpLiAqLwogI2lmZGVmIEhBVkVfUE9MTAotCXsKLQkJc3RydWN0IHBvbGxmZCBwb2xsZmQ7Ci0JCWludCB0aW1lb3V0OworICAgIHsKKyAgICAgICAgc3RydWN0IHBvbGxmZCBwb2xsZmQ7CisgICAgICAgIGludCB0aW1lb3V0OwogCi0JCXBvbGxmZC5mZCA9IHMtPnNvY2tfZmQ7Ci0JCXBvbGxmZC5ldmVudHMgPSB3cml0aW5nID8gUE9MTE9VVCA6IFBPTExJTjsKKyAgICAgICAgcG9sbGZkLmZkID0gcy0+c29ja19mZDsKKyAgICAgICAgcG9sbGZkLmV2ZW50cyA9IHdyaXRpbmcgPyBQT0xMT1VUIDogUE9MTElOOwogCi0JCS8qIHMtPnNvY2tfdGltZW91dCBpcyBpbiBzZWNvbmRzLCB0aW1lb3V0IGluIG1zICovCi0JCXRpbWVvdXQgPSAoaW50KShzLT5zb2NrX3RpbWVvdXQgKiAxMDAwICsgMC41KTsgCi0JCW4gPSBwb2xsKCZwb2xsZmQsIDEsIHRpbWVvdXQpOwotCX0KKyAgICAgICAgLyogcy0+c29ja190aW1lb3V0IGlzIGluIHNlY29uZHMsIHRpbWVvdXQgaW4gbXMgKi8KKyAgICAgICAgdGltZW91dCA9IChpbnQpKHMtPnNvY2tfdGltZW91dCAqIDEwMDAgKyAwLjUpOworICAgICAgICBuID0gcG9sbCgmcG9sbGZkLCAxLCB0aW1lb3V0KTsKKyAgICB9CiAjZWxzZQotCXsKLQkJLyogQ29uc3RydWN0IHRoZSBhcmd1bWVudHMgdG8gc2VsZWN0ICovCi0JCWZkX3NldCBmZHM7Ci0JCXN0cnVjdCB0aW1ldmFsIHR2OwotCQl0di50dl9zZWMgPSAoaW50KXMtPnNvY2tfdGltZW91dDsKLQkJdHYudHZfdXNlYyA9IChpbnQpKChzLT5zb2NrX3RpbWVvdXQgLSB0di50dl9zZWMpICogMWU2KTsKLQkJRkRfWkVSTygmZmRzKTsKLQkJRkRfU0VUKHMtPnNvY2tfZmQsICZmZHMpOworICAgIHsKKyAgICAgICAgLyogQ29uc3RydWN0IHRoZSBhcmd1bWVudHMgdG8gc2VsZWN0ICovCisgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICB0di50dl9zZWMgPSAoaW50KXMtPnNvY2tfdGltZW91dDsKKyAgICAgICAgdHYudHZfdXNlYyA9IChpbnQpKChzLT5zb2NrX3RpbWVvdXQgLSB0di50dl9zZWMpICogMWU2KTsKKyAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgRkRfU0VUKHMtPnNvY2tfZmQsICZmZHMpOwogCi0JCS8qIFNlZSBpZiB0aGUgc29ja2V0IGlzIHJlYWR5ICovCi0JCWlmICh3cml0aW5nKQotCQkJbiA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsIE5VTEwsICZmZHMsIE5VTEwsICZ0dik7Ci0JCWVsc2UKLQkJCW4gPSBzZWxlY3Qocy0+c29ja19mZCsxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpOwotCX0KKyAgICAgICAgLyogU2VlIGlmIHRoZSBzb2NrZXQgaXMgcmVhZHkgKi8KKyAgICAgICAgaWYgKHdyaXRpbmcpCisgICAgICAgICAgICBuID0gc2VsZWN0KHMtPnNvY2tfZmQrMSwgTlVMTCwgJmZkcywgTlVMTCwgJnR2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbiA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsICZmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgfQogI2VuZGlmCi0JCi0JaWYgKG4gPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7CisKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogSW5pdGlhbGl6ZSBhIG5ldyBzb2NrZXQgb2JqZWN0LiAqLwpAQCAtNzIwLDI1ICs3MjAsMjUgQEAKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRfc29ja29iamVjdChQeVNvY2tldFNvY2tPYmplY3QgKnMsCi0JCVNPQ0tFVF9UIGZkLCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvKQorICAgICAgICAgICAgICAgIFNPQ0tFVF9UIGZkLCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvKQogewogI2lmZGVmIFJJU0NPUwotCWludCBibG9jayA9IDE7CisgICAgaW50IGJsb2NrID0gMTsKICNlbmRpZgotCXMtPnNvY2tfZmQgPSBmZDsKLQlzLT5zb2NrX2ZhbWlseSA9IGZhbWlseTsKLQlzLT5zb2NrX3R5cGUgPSB0eXBlOwotCXMtPnNvY2tfcHJvdG8gPSBwcm90bzsKLQlzLT5zb2NrX3RpbWVvdXQgPSBkZWZhdWx0dGltZW91dDsKKyAgICBzLT5zb2NrX2ZkID0gZmQ7CisgICAgcy0+c29ja19mYW1pbHkgPSBmYW1pbHk7CisgICAgcy0+c29ja190eXBlID0gdHlwZTsKKyAgICBzLT5zb2NrX3Byb3RvID0gcHJvdG87CisgICAgcy0+c29ja190aW1lb3V0ID0gZGVmYXVsdHRpbWVvdXQ7CiAKLQlzLT5lcnJvcmhhbmRsZXIgPSAmc2V0X2Vycm9yOworICAgIHMtPmVycm9yaGFuZGxlciA9ICZzZXRfZXJyb3I7CiAKLQlpZiAoZGVmYXVsdHRpbWVvdXQgPj0gMC4wKQotCQlpbnRlcm5hbF9zZXRibG9ja2luZyhzLCAwKTsKKyAgICBpZiAoZGVmYXVsdHRpbWVvdXQgPj0gMC4wKQorICAgICAgICBpbnRlcm5hbF9zZXRibG9ja2luZyhzLCAwKTsKIAogI2lmZGVmIFJJU0NPUwotCWlmICh0YXNrd2luZG93KQotCQlzb2NrZXRpb2N0bChzLT5zb2NrX2ZkLCAweDgwMDQ2Njc5LCAodV9sb25nKikmYmxvY2spOworICAgIGlmICh0YXNrd2luZG93KQorICAgICAgICBzb2NrZXRpb2N0bChzLT5zb2NrX2ZkLCAweDgwMDQ2Njc5LCAodV9sb25nKikmYmxvY2spOwogI2VuZGlmCiB9CiAKQEAgLTc1MSwxMiArNzUxLDEyIEBACiBzdGF0aWMgUHlTb2NrZXRTb2NrT2JqZWN0ICoKIG5ld19zb2Nrb2JqZWN0KFNPQ0tFVF9UIGZkLCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvKQogewotCVB5U29ja2V0U29ja09iamVjdCAqczsKLQlzID0gKFB5U29ja2V0U29ja09iamVjdCAqKQotCQlQeVR5cGVfR2VuZXJpY05ldygmc29ja190eXBlLCBOVUxMLCBOVUxMKTsKLQlpZiAocyAhPSBOVUxMKQotCQlpbml0X3NvY2tvYmplY3QocywgZmQsIGZhbWlseSwgdHlwZSwgcHJvdG8pOwotCXJldHVybiBzOworICAgIFB5U29ja2V0U29ja09iamVjdCAqczsKKyAgICBzID0gKFB5U29ja2V0U29ja09iamVjdCAqKQorICAgICAgICBQeVR5cGVfR2VuZXJpY05ldygmc29ja190eXBlLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocyAhPSBOVUxMKQorICAgICAgICBpbml0X3NvY2tvYmplY3QocywgZmQsIGZhbWlseSwgdHlwZSwgcHJvdG8pOworICAgIHJldHVybiBzOwogfQogCiAKQEAgLTc3NiwxMjIgKzc3NiwxMjIgQEAKIHN0YXRpYyBpbnQKIHNldGlwYWRkcihjaGFyICpuYW1lLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJfcmV0LCBzaXplX3QgYWRkcl9yZXRfc2l6ZSwgaW50IGFmKQogewotCXN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlczsKLQlpbnQgZXJyb3I7Ci0JaW50IGQxLCBkMiwgZDMsIGQ0OwotCWNoYXIgY2g7CisgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOworICAgIGludCBlcnJvcjsKKyAgICBpbnQgZDEsIGQyLCBkMywgZDQ7CisgICAgY2hhciBjaDsKIAotCW1lbXNldCgodm9pZCAqKSBhZGRyX3JldCwgJ1wwJywgc2l6ZW9mKCphZGRyX3JldCkpOwotCWlmIChuYW1lWzBdID09ICdcMCcpIHsKLQkJaW50IHNpejsKLQkJbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JCWhpbnRzLmFpX2ZhbWlseSA9IGFmOwotCQloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CS8qZHVtbXkqLwotCQloaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJQUNRVUlSRV9HRVRBRERSSU5GT19MT0NLCi0JCWVycm9yID0gZ2V0YWRkcmluZm8oTlVMTCwgIjAiLCAmaGludHMsICZyZXMpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkvKiBXZSBhc3N1bWUgdGhhdCB0aG9zZSB0aHJlYWQtdW5zYWZlIGdldGFkZHJpbmZvKCkgdmVyc2lvbnMKLQkJICAgKmFyZSogc2FmZSByZWdhcmRpbmcgdGhlaXIgcmV0dXJuIHZhbHVlLCBpZS4gdGhhdCBhCi0JCSAgIHN1YnNlcXVlbnQgY2FsbCB0byBnZXRhZGRyaW5mbygpIGRvZXMgbm90IGRlc3Ryb3kgdGhlCi0JCSAgIG91dGNvbWUgb2YgdGhlIGZpcnN0IGNhbGwuICovCi0JCVJFTEVBU0VfR0VUQUREUklORk9fTE9DSwotCQlpZiAoZXJyb3IpIHsKLQkJCXNldF9nYWllcnJvcihlcnJvcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJc3dpdGNoIChyZXMtPmFpX2ZhbWlseSkgewotCQljYXNlIEFGX0lORVQ6Ci0JCQlzaXogPSA0OwotCQkJYnJlYWs7CisgICAgbWVtc2V0KCh2b2lkICopIGFkZHJfcmV0LCAnXDAnLCBzaXplb2YoKmFkZHJfcmV0KSk7CisgICAgaWYgKG5hbWVbMF0gPT0gJ1wwJykgeworICAgICAgICBpbnQgc2l6OworICAgICAgICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKyAgICAgICAgaGludHMuYWlfZmFtaWx5ID0gYWY7CisgICAgICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsgICAgICAgICAvKmR1bW15Ki8KKyAgICAgICAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIEFDUVVJUkVfR0VUQUREUklORk9fTE9DSworICAgICAgICBlcnJvciA9IGdldGFkZHJpbmZvKE5VTEwsICIwIiwgJmhpbnRzLCAmcmVzKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgLyogV2UgYXNzdW1lIHRoYXQgdGhvc2UgdGhyZWFkLXVuc2FmZSBnZXRhZGRyaW5mbygpIHZlcnNpb25zCisgICAgICAgICAgICphcmUqIHNhZmUgcmVnYXJkaW5nIHRoZWlyIHJldHVybiB2YWx1ZSwgaWUuIHRoYXQgYQorICAgICAgICAgICBzdWJzZXF1ZW50IGNhbGwgdG8gZ2V0YWRkcmluZm8oKSBkb2VzIG5vdCBkZXN0cm95IHRoZQorICAgICAgICAgICBvdXRjb21lIG9mIHRoZSBmaXJzdCBjYWxsLiAqLworICAgICAgICBSRUxFQVNFX0dFVEFERFJJTkZPX0xPQ0sKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBzZXRfZ2FpZXJyb3IoZXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAocmVzLT5haV9mYW1pbHkpIHsKKyAgICAgICAgY2FzZSBBRl9JTkVUOgorICAgICAgICAgICAgc2l6ID0gNDsKKyAgICAgICAgICAgIGJyZWFrOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JCWNhc2UgQUZfSU5FVDY6Ci0JCQlzaXogPSAxNjsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICAgICAgc2l6ID0gMTY7CisgICAgICAgICAgICBicmVhazsKICNlbmRpZgotCQlkZWZhdWx0OgotCQkJZnJlZWFkZHJpbmZvKHJlcyk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJCSJ1bnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChyZXMtPmFpX25leHQpIHsKLQkJCWZyZWVhZGRyaW5mbyhyZXMpOwotCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkid2lsZGNhcmQgcmVzb2x2ZWQgdG8gbXVsdGlwbGUgYWRkcmVzcyIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChyZXMtPmFpX2FkZHJsZW4gPCBhZGRyX3JldF9zaXplKQotCQkJYWRkcl9yZXRfc2l6ZSA9IHJlcy0+YWlfYWRkcmxlbjsKLQkJbWVtY3B5KGFkZHJfcmV0LCByZXMtPmFpX2FkZHIsIGFkZHJfcmV0X3NpemUpOwotCQlmcmVlYWRkcmluZm8ocmVzKTsKLQkJcmV0dXJuIHNpejsKLQl9Ci0JaWYgKG5hbWVbMF0gPT0gJzwnICYmIHN0cmNtcChuYW1lLCAiPGJyb2FkY2FzdD4iKSA9PSAwKSB7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOwotCQlpZiAoYWYgIT0gQUZfSU5FVCAmJiBhZiAhPSBBRl9VTlNQRUMpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJImFkZHJlc3MgZmFtaWx5IG1pc21hdGNoZWQiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcl9yZXQ7Ci0JCW1lbXNldCgodm9pZCAqKSBzaW4sICdcMCcsIHNpemVvZigqc2luKSk7Ci0JCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcmVlYWRkcmluZm8ocmVzKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcy0+YWlfbmV4dCkgeworICAgICAgICAgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgICAgICJ3aWxkY2FyZCByZXNvbHZlZCB0byBtdWx0aXBsZSBhZGRyZXNzIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcy0+YWlfYWRkcmxlbiA8IGFkZHJfcmV0X3NpemUpCisgICAgICAgICAgICBhZGRyX3JldF9zaXplID0gcmVzLT5haV9hZGRybGVuOworICAgICAgICBtZW1jcHkoYWRkcl9yZXQsIHJlcy0+YWlfYWRkciwgYWRkcl9yZXRfc2l6ZSk7CisgICAgICAgIGZyZWVhZGRyaW5mbyhyZXMpOworICAgICAgICByZXR1cm4gc2l6OworICAgIH0KKyAgICBpZiAobmFtZVswXSA9PSAnPCcgJiYgc3RyY21wKG5hbWUsICI8YnJvYWRjYXN0PiIpID09IDApIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luICpzaW47CisgICAgICAgIGlmIChhZiAhPSBBRl9JTkVUICYmIGFmICE9IEFGX1VOU1BFQykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAiYWRkcmVzcyBmYW1pbHkgbWlzbWF0Y2hlZCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyX3JldDsKKyAgICAgICAgbWVtc2V0KCh2b2lkICopIHNpbiwgJ1wwJywgc2l6ZW9mKCpzaW4pKTsKKyAgICAgICAgc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCQlzaW4tPnNpbl9sZW4gPSBzaXplb2YoKnNpbik7CisgICAgICAgIHNpbi0+c2luX2xlbiA9IHNpemVvZigqc2luKTsKICNlbmRpZgotCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9CUk9BRENBU1Q7Ci0JCXJldHVybiBzaXplb2Yoc2luLT5zaW5fYWRkcik7Ci0JfQotCWlmIChzc2NhbmYobmFtZSwgIiVkLiVkLiVkLiVkJWMiLCAmZDEsICZkMiwgJmQzLCAmZDQsICZjaCkgPT0gNCAmJgotCSAgICAwIDw9IGQxICYmIGQxIDw9IDI1NSAmJiAwIDw9IGQyICYmIGQyIDw9IDI1NSAmJgotCSAgICAwIDw9IGQzICYmIGQzIDw9IDI1NSAmJiAwIDw9IGQ0ICYmIGQ0IDw9IDI1NSkgewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKLQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHJfcmV0OwotCQlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKAotCQkJKChsb25nKSBkMSA8PCAyNCkgfCAoKGxvbmcpIGQyIDw8IDE2KSB8Ci0JCQkoKGxvbmcpIGQzIDw8IDgpIHwgKChsb25nKSBkNCA8PCAwKSk7Ci0JCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIHNpbi0+c2luX2FkZHIuc19hZGRyID0gSU5BRERSX0JST0FEQ0FTVDsKKyAgICAgICAgcmV0dXJuIHNpemVvZihzaW4tPnNpbl9hZGRyKTsKKyAgICB9CisgICAgaWYgKHNzY2FuZihuYW1lLCAiJWQuJWQuJWQuJWQlYyIsICZkMSwgJmQyLCAmZDMsICZkNCwgJmNoKSA9PSA0ICYmCisgICAgICAgIDAgPD0gZDEgJiYgZDEgPD0gMjU1ICYmIDAgPD0gZDIgJiYgZDIgPD0gMjU1ICYmCisgICAgICAgIDAgPD0gZDMgJiYgZDMgPD0gMjU1ICYmIDAgPD0gZDQgJiYgZDQgPD0gMjU1KSB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworICAgICAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcl9yZXQ7CisgICAgICAgIHNpbi0+c2luX2FkZHIuc19hZGRyID0gaHRvbmwoCisgICAgICAgICAgICAoKGxvbmcpIGQxIDw8IDI0KSB8ICgobG9uZykgZDIgPDwgMTYpIHwKKyAgICAgICAgICAgICgobG9uZykgZDMgPDwgOCkgfCAoKGxvbmcpIGQ0IDw8IDApKTsKKyAgICAgICAgc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCQlzaW4tPnNpbl9sZW4gPSBzaXplb2YoKnNpbik7CisgICAgICAgIHNpbi0+c2luX2xlbiA9IHNpemVvZigqc2luKTsKICNlbmRpZgotCQlyZXR1cm4gNDsKLQl9Ci0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfZmFtaWx5ID0gYWY7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCUFDUVVJUkVfR0VUQUREUklORk9fTE9DSwotCWVycm9yID0gZ2V0YWRkcmluZm8obmFtZSwgTlVMTCwgJmhpbnRzLCAmcmVzKTsKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorICAgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICAgIGhpbnRzLmFpX2ZhbWlseSA9IGFmOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBBQ1FVSVJFX0dFVEFERFJJTkZPX0xPQ0sKKyAgICBlcnJvciA9IGdldGFkZHJpbmZvKG5hbWUsIE5VTEwsICZoaW50cywgJnJlcyk7CiAjaWYgZGVmaW5lZChfX2RpZ2l0YWxfXykgJiYgZGVmaW5lZChfX3VuaXhfXykKLQlpZiAoZXJyb3IgPT0gRUFJX05PTkFNRSAmJiBhZiA9PSBBRl9VTlNQRUMpIHsKLQkJLyogT24gVHJ1NjQgVjUuMSwgbnVtZXJpYy10by1hZGRyIGNvbnZlcnNpb24gZmFpbHMKLQkJICAgaWYgbm8gYWRkcmVzcyBmYW1pbHkgaXMgZ2l2ZW4uIEFzc3VtZSBJUHY0IGZvciBub3cuKi8KLQkJaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKLQkJZXJyb3IgPSBnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmaGludHMsICZyZXMpOwotCX0KKyAgICBpZiAoZXJyb3IgPT0gRUFJX05PTkFNRSAmJiBhZiA9PSBBRl9VTlNQRUMpIHsKKyAgICAgICAgLyogT24gVHJ1NjQgVjUuMSwgbnVtZXJpYy10by1hZGRyIGNvbnZlcnNpb24gZmFpbHMKKyAgICAgICAgICAgaWYgbm8gYWRkcmVzcyBmYW1pbHkgaXMgZ2l2ZW4uIEFzc3VtZSBJUHY0IGZvciBub3cuKi8KKyAgICAgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgZXJyb3IgPSBnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmaGludHMsICZyZXMpOworICAgIH0KICNlbmRpZgotCVB5X0VORF9BTExPV19USFJFQURTCi0JUkVMRUFTRV9HRVRBRERSSU5GT19MT0NLICAvKiBzZWUgY29tbWVudCBpbiBzZXRpcGFkZHIoKSAqLwotCWlmIChlcnJvcikgewotCQlzZXRfZ2FpZXJyb3IoZXJyb3IpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChyZXMtPmFpX2FkZHJsZW4gPCBhZGRyX3JldF9zaXplKQotCQlhZGRyX3JldF9zaXplID0gcmVzLT5haV9hZGRybGVuOwotCW1lbWNweSgoY2hhciAqKSBhZGRyX3JldCwgcmVzLT5haV9hZGRyLCBhZGRyX3JldF9zaXplKTsKLQlmcmVlYWRkcmluZm8ocmVzKTsKLQlzd2l0Y2ggKGFkZHJfcmV0LT5zYV9mYW1pbHkpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCXJldHVybiA0OworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUkVMRUFTRV9HRVRBRERSSU5GT19MT0NLICAvKiBzZWUgY29tbWVudCBpbiBzZXRpcGFkZHIoKSAqLworICAgIGlmIChlcnJvcikgeworICAgICAgICBzZXRfZ2FpZXJyb3IoZXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZXMtPmFpX2FkZHJsZW4gPCBhZGRyX3JldF9zaXplKQorICAgICAgICBhZGRyX3JldF9zaXplID0gcmVzLT5haV9hZGRybGVuOworICAgIG1lbWNweSgoY2hhciAqKSBhZGRyX3JldCwgcmVzLT5haV9hZGRyLCBhZGRyX3JldF9zaXplKTsKKyAgICBmcmVlYWRkcmluZm8ocmVzKTsKKyAgICBzd2l0Y2ggKGFkZHJfcmV0LT5zYV9mYW1pbHkpIHsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgIHJldHVybiA0OwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JY2FzZSBBRl9JTkVUNjoKLQkJcmV0dXJuIDE2OworICAgIGNhc2UgQUZfSU5FVDY6CisgICAgICAgIHJldHVybiAxNjsKICNlbmRpZgotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJ1bmtub3duIGFkZHJlc3MgZmFtaWx5Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVua25vd24gYWRkcmVzcyBmYW1pbHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogCkBAIC05MDIsMTYgKzkwMiwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2VpcGFkZHIoc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWRkcmxlbikKIHsKLQljaGFyIGJ1ZltOSV9NQVhIT1NUXTsKLQlpbnQgZXJyb3I7CisgICAgY2hhciBidWZbTklfTUFYSE9TVF07CisgICAgaW50IGVycm9yOwogCi0JZXJyb3IgPSBnZXRuYW1laW5mbyhhZGRyLCBhZGRybGVuLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwLAotCQlOSV9OVU1FUklDSE9TVCk7Ci0JaWYgKGVycm9yKSB7Ci0JCXNldF9nYWllcnJvcihlcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGVycm9yID0gZ2V0bmFtZWluZm8oYWRkciwgYWRkcmxlbiwgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCwKKyAgICAgICAgTklfTlVNRVJJQ0hPU1QpOworICAgIGlmIChlcnJvcikgeworICAgICAgICBzZXRfZ2FpZXJyb3IoZXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogCkBAIC05MjMsMjQgKzkyMywyNCBAQAogc3RhdGljIGludAogc2V0YmRhZGRyKGNoYXIgKm5hbWUsIGJkYWRkcl90ICpiZGFkZHIpCiB7Ci0JdW5zaWduZWQgaW50IGIwLCBiMSwgYjIsIGIzLCBiNCwgYjU7Ci0JY2hhciBjaDsKLQlpbnQgbjsKKyAgICB1bnNpZ25lZCBpbnQgYjAsIGIxLCBiMiwgYjMsIGI0LCBiNTsKKyAgICBjaGFyIGNoOworICAgIGludCBuOwogCi0JbiA9IHNzY2FuZihuYW1lLCAiJVg6JVg6JVg6JVg6JVg6JVglYyIsCi0JCSAgICZiNSwgJmI0LCAmYjMsICZiMiwgJmIxLCAmYjAsICZjaCk7Ci0JaWYgKG4gPT0gNiAmJiAoYjAgfCBiMSB8IGIyIHwgYjMgfCBiNCB8IGI1KSA8IDI1NikgewotCQliZGFkZHItPmJbMF0gPSBiMDsKLQkJYmRhZGRyLT5iWzFdID0gYjE7Ci0JCWJkYWRkci0+YlsyXSA9IGIyOwotCQliZGFkZHItPmJbM10gPSBiMzsKLQkJYmRhZGRyLT5iWzRdID0gYjQ7Ci0JCWJkYWRkci0+Yls1XSA9IGI1OwotCQlyZXR1cm4gNjsKLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiYmFkIGJsdWV0b290aCBhZGRyZXNzIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgbiA9IHNzY2FuZihuYW1lLCAiJVg6JVg6JVg6JVg6JVg6JVglYyIsCisgICAgICAgICAgICAgICAmYjUsICZiNCwgJmIzLCAmYjIsICZiMSwgJmIwLCAmY2gpOworICAgIGlmIChuID09IDYgJiYgKGIwIHwgYjEgfCBiMiB8IGIzIHwgYjQgfCBiNSkgPCAyNTYpIHsKKyAgICAgICAgYmRhZGRyLT5iWzBdID0gYjA7CisgICAgICAgIGJkYWRkci0+YlsxXSA9IGIxOworICAgICAgICBiZGFkZHItPmJbMl0gPSBiMjsKKyAgICAgICAgYmRhZGRyLT5iWzNdID0gYjM7CisgICAgICAgIGJkYWRkci0+Yls0XSA9IGI0OworICAgICAgICBiZGFkZHItPmJbNV0gPSBiNTsKKyAgICAgICAgcmV0dXJuIDY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImJhZCBibHVldG9vdGggYWRkcmVzcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiAvKiBDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIEJsdWV0b290aCBhZGRyZXNzLiAgVGhpcyBpcyBhbHdheXMgYQpAQCAtOTUwLDEyICs5NTAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlYmRhZGRyKGJkYWRkcl90ICpiZGFkZHIpCiB7Ci0JY2hhciBidWZbKDYgKiAyKSArIDUgKyAxXTsKKyAgICBjaGFyIGJ1ZlsoNiAqIDIpICsgNSArIDFdOwogCi0Jc3ByaW50ZihidWYsICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCi0JCWJkYWRkci0+Yls1XSwgYmRhZGRyLT5iWzRdLCBiZGFkZHItPmJbM10sCi0JCWJkYWRkci0+YlsyXSwgYmRhZGRyLT5iWzFdLCBiZGFkZHItPmJbMF0pOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgc3ByaW50ZihidWYsICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisgICAgICAgIGJkYWRkci0+Yls1XSwgYmRhZGRyLT5iWzRdLCBiZGFkZHItPmJbM10sCisgICAgICAgIGJkYWRkci0+YlsyXSwgYmRhZGRyLT5iWzFdLCBiZGFkZHItPmJbMF0pOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAjZW5kaWYKIApAQCAtOTY5LDE5OSArOTY5LDE5OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2Vzb2NrYWRkcihpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhZGRybGVuLCBpbnQgcHJvdG8pCiB7Ci0JaWYgKGFkZHJsZW4gPT0gMCkgewotCQkvKiBObyBhZGRyZXNzIC0tIG1heSBiZSByZWN2ZnJvbSgpIGZyb20ga25vd24gc29ja2V0ICovCi0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIGlmIChhZGRybGVuID09IDApIHsKKyAgICAgICAgLyogTm8gYWRkcmVzcyAtLSBtYXkgYmUgcmVjdmZyb20oKSBmcm9tIGtub3duIHNvY2tldCAqLworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAogI2lmZGVmIF9fQkVPU19fCi0JLyogWFhYOiBCZU9TIHZlcnNpb24gb2YgYWNjZXB0KCkgZG9lc24ndCBzZXQgZmFtaWx5IGNvcnJlY3RseSAqLwotCWFkZHItPnNhX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgLyogWFhYOiBCZU9TIHZlcnNpb24gb2YgYWNjZXB0KCkgZG9lc24ndCBzZXQgZmFtaWx5IGNvcnJlY3RseSAqLworICAgIGFkZHItPnNhX2ZhbWlseSA9IEFGX0lORVQ7CiAjZW5kaWYKIAotCXN3aXRjaCAoYWRkci0+c2FfZmFtaWx5KSB7CisgICAgc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKIAotCWNhc2UgQUZfSU5FVDoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiAqYTsKLQkJUHlPYmplY3QgKmFkZHJvYmogPSBtYWtlaXBhZGRyKGFkZHIsIHNpemVvZigqYSkpOwotCQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQkJaWYgKGFkZHJvYmopIHsKLQkJCWEgPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcjsKLQkJCXJldCA9IFB5X0J1aWxkVmFsdWUoIk9pIiwgYWRkcm9iaiwgbnRvaHMoYS0+c2luX3BvcnQpKTsKLQkJCVB5X0RFQ1JFRihhZGRyb2JqKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KKyAgICBjYXNlIEFGX0lORVQ6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmE7CisgICAgICAgIFB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWlwYWRkcihhZGRyLCBzaXplb2YoKmEpKTsKKyAgICAgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgICAgIGlmIChhZGRyb2JqKSB7CisgICAgICAgICAgICBhID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHI7CisgICAgICAgICAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIGFkZHJvYmosIG50b2hzKGEtPnNpbl9wb3J0KSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYWRkcm9iaik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKICNpZiBkZWZpbmVkKEFGX1VOSVgpCi0JY2FzZSBBRl9VTklYOgotCXsKLQkJc3RydWN0IHNvY2thZGRyX3VuICphID0gKHN0cnVjdCBzb2NrYWRkcl91biAqKSBhZGRyOworICAgIGNhc2UgQUZfVU5JWDoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl91biAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4gKikgYWRkcjsKICNpZmRlZiBsaW51eAotCQlpZiAoYS0+c3VuX3BhdGhbMF0gPT0gMCkgeyAgLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlICovCi0JCQlhZGRybGVuIC09IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpOwotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGEtPnN1bl9wYXRoLAotCQkJCQkJCSAgYWRkcmxlbik7Ci0JCX0KLQkJZWxzZQorICAgICAgICBpZiAoYS0+c3VuX3BhdGhbMF0gPT0gMCkgeyAgLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlICovCisgICAgICAgICAgICBhZGRybGVuIC09IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpOworICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGEtPnN1bl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJsZW4pOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZiAvKiBsaW51eCAqLwotCQl7Ci0JCQkvKiByZWd1bGFyIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgKi8KLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGEtPnN1bl9wYXRoKTsKLQkJfQotCX0KKyAgICAgICAgeworICAgICAgICAgICAgLyogcmVndWxhciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nICovCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhhLT5zdW5fcGF0aCk7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYgLyogQUZfVU5JWCAqLwogCiAjaWYgZGVmaW5lZChBRl9ORVRMSU5LKQogICAgICAgIGNhc2UgQUZfTkVUTElOSzoKICAgICAgICB7Ci0gICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfbmwgKmEgPSAoc3RydWN0IHNvY2thZGRyX25sICopIGFkZHI7Ci0gICAgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUkiLCBhLT5ubF9waWQsIGEtPm5sX2dyb3Vwcyk7CisgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9ubCAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfbmwgKikgYWRkcjsKKyAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJIiwgYS0+bmxfcGlkLCBhLT5ubF9ncm91cHMpOwogICAgICAgIH0KICNlbmRpZiAvKiBBRl9ORVRMSU5LICovCiAKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICphOwotCQlQeU9iamVjdCAqYWRkcm9iaiA9IG1ha2VpcGFkZHIoYWRkciwgc2l6ZW9mKCphKSk7Ci0JCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCQlpZiAoYWRkcm9iaikgewotCQkJYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcjsKLQkJCXJldCA9IFB5X0J1aWxkVmFsdWUoIk9paWkiLAotCQkJCQkgICAgYWRkcm9iaiwKLQkJCQkJICAgIG50b2hzKGEtPnNpbjZfcG9ydCksCi0JCQkJCSAgICBhLT5zaW42X2Zsb3dpbmZvLAotCQkJCQkgICAgYS0+c2luNl9zY29wZV9pZCk7Ci0JCQlQeV9ERUNSRUYoYWRkcm9iaik7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9CisgICAgY2FzZSBBRl9JTkVUNjoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKmE7CisgICAgICAgIFB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWlwYWRkcihhZGRyLCBzaXplb2YoKmEpKTsKKyAgICAgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgICAgIGlmIChhZGRyb2JqKSB7CisgICAgICAgICAgICBhID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilhZGRyOworICAgICAgICAgICAgcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT2lpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2hzKGEtPnNpbjZfcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnNpbjZfZmxvd2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnNpbjZfc2NvcGVfaWQpOworICAgICAgICAgICAgUHlfREVDUkVGKGFkZHJvYmopOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBVU0VfQkxVRVRPT1RICi0JY2FzZSBBRl9CTFVFVE9PVEg6Ci0JCXN3aXRjaCAocHJvdG8pIHsKKyAgICBjYXNlIEFGX0JMVUVUT09USDoKKyAgICAgICAgc3dpdGNoIChwcm90bykgewogCi0JCWNhc2UgQlRQUk9UT19MMkNBUDoKLQkJewotCQkJc3RydWN0IHNvY2thZGRyX2wyICphID0gKHN0cnVjdCBzb2NrYWRkcl9sMiAqKSBhZGRyOwotCQkJUHlPYmplY3QgKmFkZHJvYmogPSBtYWtlYmRhZGRyKCZfQlRfTDJfTUVNQihhLCBiZGFkZHIpKTsKLQkJCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCQkJaWYgKGFkZHJvYmopIHsKLQkJCQlyZXQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsCi0JCQkJCQkgICAgYWRkcm9iaiwKLQkJCQkJCSAgICBfQlRfTDJfTUVNQihhLCBwc20pKTsKLQkJCQlQeV9ERUNSRUYoYWRkcm9iaik7Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9CisgICAgICAgIGNhc2UgQlRQUk9UT19MMkNBUDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2wyICphID0gKHN0cnVjdCBzb2NrYWRkcl9sMiAqKSBhZGRyOworICAgICAgICAgICAgUHlPYmplY3QgKmFkZHJvYmogPSBtYWtlYmRhZGRyKCZfQlRfTDJfTUVNQihhLCBiZGFkZHIpKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgICAgICAgICAgaWYgKGFkZHJvYmopIHsKKyAgICAgICAgICAgICAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JUX0wyX01FTUIoYSwgcHNtKSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFkZHJvYmopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogCi0JCWNhc2UgQlRQUk9UT19SRkNPTU06Ci0JCXsKLQkJCXN0cnVjdCBzb2NrYWRkcl9yYyAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfcmMgKikgYWRkcjsKLQkJCVB5T2JqZWN0ICphZGRyb2JqID0gbWFrZWJkYWRkcigmX0JUX1JDX01FTUIoYSwgYmRhZGRyKSk7Ci0JCQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQkJCWlmIChhZGRyb2JqKSB7Ci0JCQkJcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT2kiLAotCQkJCQkJICAgIGFkZHJvYmosCi0JCQkJCQkgICAgX0JUX1JDX01FTUIoYSwgY2hhbm5lbCkpOwotCQkJCVB5X0RFQ1JFRihhZGRyb2JqKTsKLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KKyAgICAgICAgY2FzZSBCVFBST1RPX1JGQ09NTToKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3JjICphID0gKHN0cnVjdCBzb2NrYWRkcl9yYyAqKSBhZGRyOworICAgICAgICAgICAgUHlPYmplY3QgKmFkZHJvYmogPSBtYWtlYmRhZGRyKCZfQlRfUkNfTUVNQihhLCBiZGFkZHIpKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgICAgICAgICAgaWYgKGFkZHJvYmopIHsKKyAgICAgICAgICAgICAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJPaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JUX1JDX01FTUIoYSwgY2hhbm5lbCkpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhZGRyb2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KIAotCQljYXNlIEJUUFJPVE9fSENJOgotCQl7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfaGNpICphID0gKHN0cnVjdCBzb2NrYWRkcl9oY2kgKikgYWRkcjsKLQkJCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCQkJcmV0ID0gUHlfQnVpbGRWYWx1ZSgiaSIsIF9CVF9IQ0lfTUVNQihhLCBkZXYpKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKyAgICAgICAgY2FzZSBCVFBST1RPX0hDSToKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2hjaSAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaGNpICopIGFkZHI7CisgICAgICAgICAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICAgICAgICAgIHJldCA9IFB5X0J1aWxkVmFsdWUoImkiLCBfQlRfSENJX01FTUIoYSwgZGV2KSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAKICNpZiAhZGVmaW5lZChfX0ZyZWVCU0RfXykKLQkJY2FzZSBCVFBST1RPX1NDTzoKLQkJewotCQkJc3RydWN0IHNvY2thZGRyX3NjbyAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfc2NvICopIGFkZHI7Ci0JCQlyZXR1cm4gbWFrZWJkYWRkcigmX0JUX1NDT19NRU1CKGEsIGJkYWRkcikpOwotCQl9CisgICAgICAgIGNhc2UgQlRQUk9UT19TQ086CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zY28gKmEgPSAoc3RydWN0IHNvY2thZGRyX3NjbyAqKSBhZGRyOworICAgICAgICAgICAgcmV0dXJuIG1ha2ViZGFkZHIoJl9CVF9TQ09fTUVNQihhLCBiZGFkZHIpKTsKKyAgICAgICAgfQogI2VuZGlmCiAKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiVW5rbm93biBCbHVldG9vdGggcHJvdG9jb2wiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBCbHVldG9vdGggcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9ICi0JY2FzZSBBRl9QQUNLRVQ6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfbGwgKmEgPSAoc3RydWN0IHNvY2thZGRyX2xsICopYWRkcjsKLQkJY2hhciAqaWZuYW1lID0gIiI7Ci0JCXN0cnVjdCBpZnJlcSBpZnI7Ci0JCS8qIG5lZWQgdG8gbG9vayB1cCBpbnRlcmZhY2UgbmFtZSBnaXZlIGluZGV4ICovCi0JCWlmIChhLT5zbGxfaWZpbmRleCkgewotCQkJaWZyLmlmcl9pZmluZGV4ID0gYS0+c2xsX2lmaW5kZXg7Ci0JCQlpZiAoaW9jdGwoc29ja2ZkLCBTSU9DR0lGTkFNRSwgJmlmcikgPT0gMCkKLQkJCQlpZm5hbWUgPSBpZnIuaWZyX25hbWU7Ci0JCX0KLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoInNoYmhzIyIsCi0JCQkJICAgICBpZm5hbWUsCi0JCQkJICAgICBudG9ocyhhLT5zbGxfcHJvdG9jb2wpLAotCQkJCSAgICAgYS0+c2xsX3BrdHR5cGUsCi0JCQkJICAgICBhLT5zbGxfaGF0eXBlLAotCQkJCSAgICAgYS0+c2xsX2FkZHIsCi0JCQkJICAgICBhLT5zbGxfaGFsZW4pOwotCX0KKyAgICBjYXNlIEFGX1BBQ0tFVDoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9sbCAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfbGwgKilhZGRyOworICAgICAgICBjaGFyICppZm5hbWUgPSAiIjsKKyAgICAgICAgc3RydWN0IGlmcmVxIGlmcjsKKyAgICAgICAgLyogbmVlZCB0byBsb29rIHVwIGludGVyZmFjZSBuYW1lIGdpdmUgaW5kZXggKi8KKyAgICAgICAgaWYgKGEtPnNsbF9pZmluZGV4KSB7CisgICAgICAgICAgICBpZnIuaWZyX2lmaW5kZXggPSBhLT5zbGxfaWZpbmRleDsKKyAgICAgICAgICAgIGlmIChpb2N0bChzb2NrZmQsIFNJT0NHSUZOQU1FLCAmaWZyKSA9PSAwKQorICAgICAgICAgICAgICAgIGlmbmFtZSA9IGlmci5pZnJfbmFtZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgic2hiaHMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhhLT5zbGxfcHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5zbGxfcGt0dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2xsX2hhdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2xsX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPnNsbF9oYWxlbik7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0xJTlVYX1RJUENfSAotCWNhc2UgQUZfVElQQzoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl90aXBjICphID0gKHN0cnVjdCBzb2NrYWRkcl90aXBjICopIGFkZHI7Ci0JCWlmIChhLT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRVNFUSkgewotCQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJSUlJIiwKLQkJCQkJYS0+YWRkcnR5cGUsCi0JCQkJCWEtPmFkZHIubmFtZXNlcS50eXBlLAotCQkJCQlhLT5hZGRyLm5hbWVzZXEubG93ZXIsCi0JCQkJCWEtPmFkZHIubmFtZXNlcS51cHBlciwKLQkJCQkJYS0+c2NvcGUpOwotCQl9IGVsc2UgaWYgKGEtPmFkZHJ0eXBlID09IFRJUENfQUREUl9OQU1FKSB7Ci0JCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUlJSUkiLAotCQkJCQlhLT5hZGRydHlwZSwKLQkJCQkJYS0+YWRkci5uYW1lLm5hbWUudHlwZSwKLQkJCQkJYS0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2UsCi0JCQkJCWEtPmFkZHIubmFtZS5uYW1lLmluc3RhbmNlLAotCQkJCQlhLT5zY29wZSk7Ci0JCX0gZWxzZSBpZiAoYS0+YWRkcnR5cGUgPT0gVElQQ19BRERSX0lEKSB7Ci0JCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUlJSUkiLAotCQkJCQlhLT5hZGRydHlwZSwKLQkJCQkJYS0+YWRkci5pZC5ub2RlLAotCQkJCQlhLT5hZGRyLmlkLnJlZiwKLQkJCQkJMCwKLQkJCQkJYS0+c2NvcGUpOwotCQl9IGVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJJbnZhbGlkIGFkZHJlc3MgdHlwZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgY2FzZSBBRl9USVBDOgorICAgIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX3RpcGMgKmEgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKikgYWRkcjsKKyAgICAgICAgaWYgKGEtPmFkZHJ0eXBlID09IFRJUENfQUREUl9OQU1FU0VRKSB7CisgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUlJSUkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHIubmFtZXNlcS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHIubmFtZXNlcS5sb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRyLm5hbWVzZXEudXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2NvcGUpOworICAgICAgICB9IGVsc2UgaWYgKGEtPmFkZHJ0eXBlID09IFRJUENfQUREUl9OQU1FKSB7CisgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSUlJSUkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPmFkZHIubmFtZS5uYW1lLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+c2NvcGUpOworICAgICAgICB9IGVsc2UgaWYgKGEtPmFkZHJ0eXBlID09IFRJUENfQUREUl9JRCkgeworICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIklJSUlJIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRydHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5hZGRyLmlkLm5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+YWRkci5pZC5yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5zY29wZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBhZGRyZXNzIHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKLQkvKiBNb3JlIGNhc2VzIGhlcmUuLi4gKi8KKyAgICAvKiBNb3JlIGNhc2VzIGhlcmUuLi4gKi8KIAotCWRlZmF1bHQ6Ci0JCS8qIElmIHdlIGRvbid0IGtub3cgdGhlIGFkZHJlc3MgZmFtaWx5LCBkb24ndCByYWlzZSBhbgotCQkgICBleGNlcHRpb24gLS0gcmV0dXJuIGl0IGFzIGEgdHVwbGUuICovCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpcyMiLAotCQkJCSAgICAgYWRkci0+c2FfZmFtaWx5LAotCQkJCSAgICAgYWRkci0+c2FfZGF0YSwKLQkJCQkgICAgIHNpemVvZihhZGRyLT5zYV9kYXRhKSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogSWYgd2UgZG9uJ3Qga25vdyB0aGUgYWRkcmVzcyBmYW1pbHksIGRvbid0IHJhaXNlIGFuCisgICAgICAgICAgIGV4Y2VwdGlvbiAtLSByZXR1cm4gaXQgYXMgYSB0dXBsZS4gKi8KKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHItPnNhX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkci0+c2FfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFkZHItPnNhX2RhdGEpKTsKIAotCX0KKyAgICB9CiB9CiAKIApAQCAtMTE3MiwzMjggKzExNzIsMzI4IEBACiAKIHN0YXRpYyBpbnQKIGdldHNvY2thZGRyYXJnKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MsCi0JICAgICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkcl9yZXQsIGludCAqbGVuX3JldCkKKyAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkcl9yZXQsIGludCAqbGVuX3JldCkKIHsKLQlzd2l0Y2ggKHMtPnNvY2tfZmFtaWx5KSB7CisgICAgc3dpdGNoIChzLT5zb2NrX2ZhbWlseSkgewogCiAjaWYgZGVmaW5lZChBRl9VTklYKQotCWNhc2UgQUZfVU5JWDoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl91biogYWRkcjsKLQkJY2hhciAqcGF0aDsKLQkJaW50IGxlbjsKLQkJaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAidCMiLCAmcGF0aCwgJmxlbikpCi0JCQlyZXR1cm4gMDsKKyAgICBjYXNlIEFGX1VOSVg6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4qIGFkZHI7CisgICAgICAgIGNoYXIgKnBhdGg7CisgICAgICAgIGludCBsZW47CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgInQjIiwgJnBhdGgsICZsZW4pKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4qKWFkZHJfcmV0OworICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl91biopYWRkcl9yZXQ7CiAjaWZkZWYgbGludXgKLQkJaWYgKGxlbiA+IDAgJiYgcGF0aFswXSA9PSAwKSB7Ci0JCQkvKiBMaW51eCBhYnN0cmFjdCBuYW1lc3BhY2UgZXh0ZW5zaW9uICovCi0JCQlpZiAobGVuID4gc2l6ZW9mIGFkZHItPnN1bl9wYXRoKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkJCSJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCQllbHNlCisgICAgICAgIGlmIChsZW4gPiAwICYmIHBhdGhbMF0gPT0gMCkgeworICAgICAgICAgICAgLyogTGludXggYWJzdHJhY3QgbmFtZXNwYWNlIGV4dGVuc2lvbiAqLworICAgICAgICAgICAgaWYgKGxlbiA+IHNpemVvZiBhZGRyLT5zdW5fcGF0aCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCiAjZW5kaWYgLyogbGludXggKi8KLSAgICAgICAgICAgICAgICB7Ci0JCQkvKiByZWd1bGFyIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgKi8KLQkJCWlmIChsZW4gPj0gc2l6ZW9mIGFkZHItPnN1bl9wYXRoKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkJCSJBRl9VTklYIHBhdGggdG9vIGxvbmciKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWFkZHItPnN1bl9wYXRoW2xlbl0gPSAwOwotCQl9Ci0JCWFkZHItPnN1bl9mYW1pbHkgPSBzLT5zb2NrX2ZhbWlseTsKLQkJbWVtY3B5KGFkZHItPnN1bl9wYXRoLCBwYXRoLCBsZW4pOworICAgICAgICB7CisgICAgICAgICAgICAvKiByZWd1bGFyIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgKi8KKyAgICAgICAgICAgIGlmIChsZW4gPj0gc2l6ZW9mIGFkZHItPnN1bl9wYXRoKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFGX1VOSVggcGF0aCB0b28gbG9uZyIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkci0+c3VuX3BhdGhbbGVuXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYWRkci0+c3VuX2ZhbWlseSA9IHMtPnNvY2tfZmFtaWx5OworICAgICAgICBtZW1jcHkoYWRkci0+c3VuX3BhdGgsIHBhdGgsIGxlbik7CiAjaWYgZGVmaW5lZChQWU9TX09TMikKLQkJKmxlbl9yZXQgPSBzaXplb2YoKmFkZHIpOworICAgICAgICAqbGVuX3JldCA9IHNpemVvZigqYWRkcik7CiAjZWxzZQotCQkqbGVuX3JldCA9IGxlbiArIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpOworICAgICAgICAqbGVuX3JldCA9IGxlbiArIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpOwogI2VuZGlmCi0JCXJldHVybiAxOwotCX0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmIC8qIEFGX1VOSVggKi8KIAogI2lmIGRlZmluZWQoQUZfTkVUTElOSykKLQljYXNlIEFGX05FVExJTks6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfbmwqIGFkZHI7Ci0JCWludCBwaWQsIGdyb3VwczsKLQkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbmwgKilhZGRyX3JldDsKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJnZXRzb2NrYWRkcmFyZzogIgotCQkJCSJBRl9ORVRMSU5LIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCi0JCQkJUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIklJOmdldHNvY2thZGRyYXJnIiwgJnBpZCwgJmdyb3VwcykpCi0JCQlyZXR1cm4gMDsKLQkJYWRkci0+bmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKLQkJYWRkci0+bmxfcGlkID0gcGlkOwotCQlhZGRyLT5ubF9ncm91cHMgPSBncm91cHM7Ci0JCSpsZW5fcmV0ID0gc2l6ZW9mKCphZGRyKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfTkVUTElOSzoKKyAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9ubCogYWRkcjsKKyAgICAgICAgaW50IHBpZCwgZ3JvdXBzOworICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9ubCAqKWFkZHJfcmV0OworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgIkFGX05FVExJTksgYWRkcmVzcyBtdXN0IGJlIHR1cGxlLCBub3QgJS41MDBzIiwKKyAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSUk6Z2V0c29ja2FkZHJhcmciLCAmcGlkLCAmZ3JvdXBzKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBhZGRyLT5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworICAgICAgICBhZGRyLT5ubF9waWQgPSBwaWQ7CisgICAgICAgIGFkZHItPm5sX2dyb3VwcyA9IGdyb3VwczsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YoKmFkZHIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAjZW5kaWYKIAotCWNhc2UgQUZfSU5FVDoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiogYWRkcjsKLQkJY2hhciAqaG9zdDsKLQkJaW50IHBvcnQsIHJlc3VsdDsKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJnZXRzb2NrYWRkcmFyZzogIgotCQkJCSJBRl9JTkVUIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCi0JCQkJUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aTpnZXRzb2NrYWRkcmFyZyIsCi0JCQkJICAgICAgImlkbmEiLCAmaG9zdCwgJnBvcnQpKQotCQkJcmV0dXJuIDA7Ci0JCWFkZHI9KHN0cnVjdCBzb2NrYWRkcl9pbiopYWRkcl9yZXQ7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2V0aXBhZGRyKGhvc3QsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmFkZHIpLCAgQUZfSU5FVCk7Ci0gICAgICAgICAgICAgICAgUHlNZW1fRnJlZShob3N0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKLQkJCXJldHVybiAwOwotCQlhZGRyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJYWRkci0+c2luX3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7Ci0JCSpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOwotCQlyZXR1cm4gMTsKLQl9CisgICAgY2FzZSBBRl9JTkVUOgorICAgIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luKiBhZGRyOworICAgICAgICBjaGFyICpob3N0OworICAgICAgICBpbnQgcG9ydCwgcmVzdWx0OworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgIkFGX0lORVQgYWRkcmVzcyBtdXN0IGJlIHR1cGxlLCBub3QgJS41MDBzIiwKKyAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRpOmdldHNvY2thZGRyYXJnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZG5hIiwgJmhvc3QsICZwb3J0KSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBhZGRyPShzdHJ1Y3Qgc29ja2FkZHJfaW4qKWFkZHJfcmV0OworICAgICAgICByZXN1bHQgPSBzZXRpcGFkZHIoaG9zdCwgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmFkZHIpLCAgQUZfSU5FVCk7CisgICAgICAgIFB5TWVtX0ZyZWUoaG9zdCk7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGFkZHItPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBhZGRyLT5zaW5fcG9ydCA9IGh0b25zKChzaG9ydClwb3J0KTsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JY2FzZSBBRl9JTkVUNjoKLQl7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbjYqIGFkZHI7Ci0JCWNoYXIgKmhvc3Q7Ci0JCWludCBwb3J0LCBmbG93aW5mbywgc2NvcGVfaWQsIHJlc3VsdDsKLQkJZmxvd2luZm8gPSBzY29wZV9pZCA9IDA7Ci0JCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQkJUHlFcnJfRm9ybWF0KAotCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZ2V0c29ja2FkZHJhcmc6ICIKLQkJCQkiQUZfSU5FVDYgYWRkcmVzcyBtdXN0IGJlIHR1cGxlLCBub3QgJS41MDBzIiwKLQkJCQlQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXRpfGlpIiwKLQkJCQkgICAgICAiaWRuYSIsICZob3N0LCAmcG9ydCwgJmZsb3dpbmZvLAotCQkJCSAgICAgICZzY29wZV9pZCkpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luNiopYWRkcl9yZXQ7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2V0aXBhZGRyKGhvc3QsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmFkZHIpLCBBRl9JTkVUNik7Ci0gICAgICAgICAgICAgICAgUHlNZW1fRnJlZShob3N0KTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKLQkJCXJldHVybiAwOwotCQlhZGRyLT5zaW42X2ZhbWlseSA9IHMtPnNvY2tfZmFtaWx5OwotCQlhZGRyLT5zaW42X3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7Ci0JCWFkZHItPnNpbjZfZmxvd2luZm8gPSBmbG93aW5mbzsKLQkJYWRkci0+c2luNl9zY29wZV9pZCA9IHNjb3BlX2lkOwotCQkqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfSU5FVDY6CisgICAgeworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBhZGRyOworICAgICAgICBjaGFyICpob3N0OworICAgICAgICBpbnQgcG9ydCwgZmxvd2luZm8sIHNjb3BlX2lkLCByZXN1bHQ7CisgICAgICAgIGZsb3dpbmZvID0gc2NvcGVfaWQgPSAwOworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgIkFGX0lORVQ2IGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCisgICAgICAgICAgICAgICAgUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aXxpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWRuYSIsICZob3N0LCAmcG9ydCwgJmZsb3dpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjb3BlX2lkKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42KilhZGRyX3JldDsKKyAgICAgICAgcmVzdWx0ID0gc2V0aXBhZGRyKGhvc3QsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCphZGRyKSwgQUZfSU5FVDYpOworICAgICAgICBQeU1lbV9GcmVlKGhvc3QpOworICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBhZGRyLT5zaW42X2ZhbWlseSA9IHMtPnNvY2tfZmFtaWx5OworICAgICAgICBhZGRyLT5zaW42X3BvcnQgPSBodG9ucygoc2hvcnQpcG9ydCk7CisgICAgICAgIGFkZHItPnNpbjZfZmxvd2luZm8gPSBmbG93aW5mbzsKKyAgICAgICAgYWRkci0+c2luNl9zY29wZV9pZCA9IHNjb3BlX2lkOworICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBVU0VfQkxVRVRPT1RICi0JY2FzZSBBRl9CTFVFVE9PVEg6Ci0JewotCQlzd2l0Y2ggKHMtPnNvY2tfcHJvdG8pIHsKLQkJY2FzZSBCVFBST1RPX0wyQ0FQOgotCQl7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfbDIgKmFkZHI7Ci0JCQljaGFyICpzdHJhZGRyOworICAgIGNhc2UgQUZfQkxVRVRPT1RIOgorICAgIHsKKyAgICAgICAgc3dpdGNoIChzLT5zb2NrX3Byb3RvKSB7CisgICAgICAgIGNhc2UgQlRQUk9UT19MMkNBUDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2wyICphZGRyOworICAgICAgICAgICAgY2hhciAqc3RyYWRkcjsKIAotCQkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbDIgKilhZGRyX3JldDsKLQkJCW1lbXNldChhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2wyKSk7Ci0JCQlfQlRfTDJfTUVNQihhZGRyLCBmYW1pbHkpID0gQUZfQkxVRVRPT1RIOwotCQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaSIsICZzdHJhZGRyLAotCQkJCQkgICAgICAmX0JUX0wyX01FTUIoYWRkciwgcHNtKSkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6ICIKLQkJCQkJCSJ3cm9uZyBmb3JtYXQiKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChzZXRiZGFkZHIoc3RyYWRkciwgJl9CVF9MMl9NRU1CKGFkZHIsIGJkYWRkcikpIDwgMCkKLQkJCQlyZXR1cm4gMDsKKyAgICAgICAgICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2wyICopYWRkcl9yZXQ7CisgICAgICAgICAgICBtZW1zZXQoYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sMikpOworICAgICAgICAgICAgX0JUX0wyX01FTUIoYWRkciwgZmFtaWx5KSA9IEFGX0JMVUVUT09USDsKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2kiLCAmc3RyYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX0JUX0wyX01FTUIoYWRkciwgcHNtKSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIGZvcm1hdCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNldGJkYWRkcihzdHJhZGRyLCAmX0JUX0wyX01FTUIoYWRkciwgYmRhZGRyKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JCQkqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWNhc2UgQlRQUk9UT19SRkNPTU06Ci0JCXsKLQkJCXN0cnVjdCBzb2NrYWRkcl9yYyAqYWRkcjsKLQkJCWNoYXIgKnN0cmFkZHI7CisgICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGNhc2UgQlRQUk9UT19SRkNPTU06CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9yYyAqYWRkcjsKKyAgICAgICAgICAgIGNoYXIgKnN0cmFkZHI7CiAKLQkJCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3JjICopYWRkcl9yZXQ7Ci0JCQlfQlRfUkNfTUVNQihhZGRyLCBmYW1pbHkpID0gQUZfQkxVRVRPT1RIOwotCQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaSIsICZzdHJhZGRyLAotCQkJCQkgICAgICAmX0JUX1JDX01FTUIoYWRkciwgY2hhbm5lbCkpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiAiCi0JCQkJCQkid3JvbmcgZm9ybWF0Iik7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoc2V0YmRhZGRyKHN0cmFkZHIsICZfQlRfUkNfTUVNQihhZGRyLCBiZGFkZHIpKSA8IDApCi0JCQkJcmV0dXJuIDA7CisgICAgICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9yYyAqKWFkZHJfcmV0OworICAgICAgICAgICAgX0JUX1JDX01FTUIoYWRkciwgZmFtaWx5KSA9IEFGX0JMVUVUT09USDsKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2kiLCAmc3RyYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX0JUX1JDX01FTUIoYWRkciwgY2hhbm5lbCkpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBmb3JtYXQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXRiZGFkZHIoc3RyYWRkciwgJl9CVF9SQ19NRU1CKGFkZHIsIGJkYWRkcikpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAotCQkJKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQljYXNlIEJUUFJPVE9fSENJOgotCQl7Ci0JCQlzdHJ1Y3Qgc29ja2FkZHJfaGNpICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9oY2kgKilhZGRyX3JldDsKLQkJCV9CVF9IQ0lfTUVNQihhZGRyLCBmYW1pbHkpID0gQUZfQkxVRVRPT1RIOwotCQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJl9CVF9IQ0lfTUVNQihhZGRyLCBkZXYpKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogIgotCQkJCQkJIndyb25nIGZvcm1hdCIpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7Ci0JCQlyZXR1cm4gMTsKLQkJfQorICAgICAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKmFkZHI7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEJUUFJPVE9fSENJOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaGNpICphZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9oY2kgKilhZGRyX3JldDsKKyAgICAgICAgICAgIF9CVF9IQ0lfTUVNQihhZGRyLCBmYW1pbHkpID0gQUZfQkxVRVRPT1RIOworICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJl9CVF9IQ0lfTUVNQihhZGRyLCBkZXYpKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgZm9ybWF0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAjaWYgIWRlZmluZWQoX19GcmVlQlNEX18pCi0JCWNhc2UgQlRQUk9UT19TQ086Ci0JCXsKLQkJCXN0cnVjdCBzb2NrYWRkcl9zY28gKmFkZHI7Ci0JCQljaGFyICpzdHJhZGRyOworICAgICAgICBjYXNlIEJUUFJPVE9fU0NPOgorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc2NvICphZGRyOworICAgICAgICAgICAgY2hhciAqc3RyYWRkcjsKIAotCQkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfc2NvICopYWRkcl9yZXQ7Ci0JCQlfQlRfU0NPX01FTUIoYWRkciwgZmFtaWx5KSA9IEFGX0JMVUVUT09USDsKLQkJCXN0cmFkZHIgPSBQeVN0cmluZ19Bc1N0cmluZyhhcmdzKTsKLQkJCWlmIChzdHJhZGRyID09IE5VTEwpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6ICIKLQkJCQkJCSJ3cm9uZyBmb3JtYXQiKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChzZXRiZGFkZHIoc3RyYWRkciwgJl9CVF9TQ09fTUVNQihhZGRyLCBiZGFkZHIpKSA8IDApCi0JCQkJcmV0dXJuIDA7CisgICAgICAgICAgICBhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9zY28gKilhZGRyX3JldDsKKyAgICAgICAgICAgIF9CVF9TQ09fTUVNQihhZGRyLCBmYW1pbHkpID0gQUZfQkxVRVRPT1RIOworICAgICAgICAgICAgc3RyYWRkciA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZ3MpOworICAgICAgICAgICAgaWYgKHN0cmFkZHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgZm9ybWF0Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0YmRhZGRyKHN0cmFkZHIsICZfQlRfU0NPX01FTUIoYWRkciwgYmRhZGRyKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JCQkqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKLQkJCXJldHVybiAxOwotCQl9CisgICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAjZW5kaWYKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmFyZzogdW5rbm93biBCbHVldG9vdGggcHJvdG9jb2wiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiB1bmtub3duIEJsdWV0b290aCBwcm90b2NvbCIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9ICi0JY2FzZSBBRl9QQUNLRVQ6Ci0JewotCQlzdHJ1Y3Qgc29ja2FkZHJfbGwqIGFkZHI7Ci0JCXN0cnVjdCBpZnJlcSBpZnI7Ci0JCWNoYXIgKmludGVyZmFjZU5hbWU7Ci0JCWludCBwcm90b051bWJlcjsKLQkJaW50IGhhdHlwZSA9IDA7Ci0JCWludCBwa3R0eXBlID0gMDsKLQkJY2hhciAqaGFkZHIgPSBOVUxMOwotCQl1bnNpZ25lZCBpbnQgaGFsZW4gPSAwOworICAgIGNhc2UgQUZfUEFDS0VUOgorICAgIHsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2xsKiBhZGRyOworICAgICAgICBzdHJ1Y3QgaWZyZXEgaWZyOworICAgICAgICBjaGFyICppbnRlcmZhY2VOYW1lOworICAgICAgICBpbnQgcHJvdG9OdW1iZXI7CisgICAgICAgIGludCBoYXR5cGUgPSAwOworICAgICAgICBpbnQgcGt0dHlwZSA9IDA7CisgICAgICAgIGNoYXIgKmhhZGRyID0gTlVMTDsKKyAgICAgICAgdW5zaWduZWQgaW50IGhhbGVuID0gMDsKIAotCQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJCVB5RXJyX0Zvcm1hdCgKLQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImdldHNvY2thZGRyYXJnOiAiCi0JCQkJIkFGX1BBQ0tFVCBhZGRyZXNzIG11c3QgYmUgdHVwbGUsIG5vdCAlLjUwMHMiLAotCQkJCVB5X1RZUEUoYXJncyktPnRwX25hbWUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaXxpaXMjIiwgJmludGVyZmFjZU5hbWUsCi0JCQkJICAgICAgJnByb3RvTnVtYmVyLCAmcGt0dHlwZSwgJmhhdHlwZSwKLQkJCQkgICAgICAmaGFkZHIsICZoYWxlbikpCi0JCQlyZXR1cm4gMDsKLQkJc3RybmNweShpZnIuaWZyX25hbWUsIGludGVyZmFjZU5hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKLQkJaWZyLmlmcl9uYW1lWyhzaXplb2YoaWZyLmlmcl9uYW1lKSktMV0gPSAnXDAnOwotCQlpZiAoaW9jdGwocy0+c29ja19mZCwgU0lPQ0dJRklOREVYLCAmaWZyKSA8IDApIHsKLQkJICAgICAgICBzLT5lcnJvcmhhbmRsZXIoKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChoYWxlbiA+IDgpIHsKLQkJICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICJIYXJkd2FyZSBhZGRyZXNzIG11c3QgYmUgOCBieXRlcyBvciBsZXNzIik7Ci0JCSAgcmV0dXJuIDA7Ci0JCX0KLQkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbGwqKWFkZHJfcmV0OwotCQlhZGRyLT5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOwotCQlhZGRyLT5zbGxfcHJvdG9jb2wgPSBodG9ucygoc2hvcnQpcHJvdG9OdW1iZXIpOwotCQlhZGRyLT5zbGxfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKLQkJYWRkci0+c2xsX3BrdHR5cGUgPSBwa3R0eXBlOwotCQlhZGRyLT5zbGxfaGF0eXBlID0gaGF0eXBlOwotCQlpZiAoaGFsZW4gIT0gMCkgewotCQkgIG1lbWNweSgmYWRkci0+c2xsX2FkZHIsIGhhZGRyLCBoYWxlbik7Ci0JCX0KLQkJYWRkci0+c2xsX2hhbGVuID0gaGFsZW47Ci0JCSpsZW5fcmV0ID0gc2l6ZW9mICphZGRyOwotCQlyZXR1cm4gMTsKLQl9CisgICAgICAgIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiZ2V0c29ja2FkZHJhcmc6ICIKKyAgICAgICAgICAgICAgICAiQUZfUEFDS0VUIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCisgICAgICAgICAgICAgICAgUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpfGlpcyMiLCAmaW50ZXJmYWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90b051bWJlciwgJnBrdHR5cGUsICZoYXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFkZHIsICZoYWxlbikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3RybmNweShpZnIuaWZyX25hbWUsIGludGVyZmFjZU5hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKyAgICAgICAgaWZyLmlmcl9uYW1lWyhzaXplb2YoaWZyLmlmcl9uYW1lKSktMV0gPSAnXDAnOworICAgICAgICBpZiAoaW9jdGwocy0+c29ja19mZCwgU0lPQ0dJRklOREVYLCAmaWZyKSA8IDApIHsKKyAgICAgICAgICAgIHMtPmVycm9yaGFuZGxlcigpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhbGVuID4gOCkgeworICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSGFyZHdhcmUgYWRkcmVzcyBtdXN0IGJlIDggYnl0ZXMgb3IgbGVzcyIpOworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2xsKilhZGRyX3JldDsKKyAgICAgICAgYWRkci0+c2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKyAgICAgICAgYWRkci0+c2xsX3Byb3RvY29sID0gaHRvbnMoKHNob3J0KXByb3RvTnVtYmVyKTsKKyAgICAgICAgYWRkci0+c2xsX2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7CisgICAgICAgIGFkZHItPnNsbF9wa3R0eXBlID0gcGt0dHlwZTsKKyAgICAgICAgYWRkci0+c2xsX2hhdHlwZSA9IGhhdHlwZTsKKyAgICAgICAgaWYgKGhhbGVuICE9IDApIHsKKyAgICAgICAgICBtZW1jcHkoJmFkZHItPnNsbF9hZGRyLCBoYWRkciwgaGFsZW4pOworICAgICAgICB9CisgICAgICAgIGFkZHItPnNsbF9oYWxlbiA9IGhhbGVuOworICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAqYWRkcjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0xJTlVYX1RJUENfSAotCWNhc2UgQUZfVElQQzoKLQl7Ci0JCXVuc2lnbmVkIGludCBhdHlwZSwgdjEsIHYyLCB2MzsKLQkJdW5zaWduZWQgaW50IHNjb3BlID0gVElQQ19DTFVTVEVSX1NDT1BFOwotCQlzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqYWRkcjsKKyAgICBjYXNlIEFGX1RJUEM6CisgICAgeworICAgICAgICB1bnNpZ25lZCBpbnQgYXR5cGUsIHYxLCB2MiwgdjM7CisgICAgICAgIHVuc2lnbmVkIGludCBzY29wZSA9IFRJUENfQ0xVU1RFUl9TQ09QRTsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX3RpcGMgKmFkZHI7CiAKLQkJaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJnZXRzb2NrYWRkcmFyZzogIgotCQkJCSJBRl9USVBDIGFkZHJlc3MgbXVzdCBiZSB0dXBsZSwgbm90ICUuNTAwcyIsCi0JCQkJUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQorICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImdldHNvY2thZGRyYXJnOiAiCisgICAgICAgICAgICAgICAgIkFGX1RJUEMgYWRkcmVzcyBtdXN0IGJlIHR1cGxlLCBub3QgJS41MDBzIiwKKyAgICAgICAgICAgICAgICBQeV9UWVBFKGFyZ3MpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkJCSJJSUlJfEk7SW52YWxpZCBUSVBDIGFkZHJlc3MgZm9ybWF0IiwKLQkJCQkJJmF0eXBlLCAmdjEsICZ2MiwgJnYzLCAmc2NvcGUpKQotCQkJcmV0dXJuIDA7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUlJSXxJO0ludmFsaWQgVElQQyBhZGRyZXNzIGZvcm1hdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHlwZSwgJnYxLCAmdjIsICZ2MywgJnNjb3BlKSkKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKikgYWRkcl9yZXQ7Ci0JCW1lbXNldChhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3RpcGMpKTsKKyAgICAgICAgYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqKSBhZGRyX3JldDsKKyAgICAgICAgbWVtc2V0KGFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdGlwYykpOwogCi0JCWFkZHItPmZhbWlseSA9IEFGX1RJUEM7Ci0JCWFkZHItPnNjb3BlID0gc2NvcGU7Ci0JCWFkZHItPmFkZHJ0eXBlID0gYXR5cGU7CisgICAgICAgIGFkZHItPmZhbWlseSA9IEFGX1RJUEM7CisgICAgICAgIGFkZHItPnNjb3BlID0gc2NvcGU7CisgICAgICAgIGFkZHItPmFkZHJ0eXBlID0gYXR5cGU7CiAKLQkJaWYgKGF0eXBlID09IFRJUENfQUREUl9OQU1FU0VRKSB7Ci0JCQlhZGRyLT5hZGRyLm5hbWVzZXEudHlwZSA9IHYxOwotCQkJYWRkci0+YWRkci5uYW1lc2VxLmxvd2VyID0gdjI7Ci0JCQlhZGRyLT5hZGRyLm5hbWVzZXEudXBwZXIgPSB2MzsKLQkJfSBlbHNlIGlmIChhdHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgewotCQkJYWRkci0+YWRkci5uYW1lLm5hbWUudHlwZSA9IHYxOwotCQkJYWRkci0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2UgPSB2MjsKLQkJfSBlbHNlIGlmIChhdHlwZSA9PSBUSVBDX0FERFJfSUQpIHsKLQkJCWFkZHItPmFkZHIuaWQubm9kZSA9IHYxOwotCQkJYWRkci0+YWRkci5pZC5yZWYgPSB2MjsKLQkJfSBlbHNlIHsKLQkJCS8qIFNob3VsZG4ndCBoYXBwZW4gKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJbnZhbGlkIGFkZHJlc3MgdHlwZSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KKyAgICAgICAgaWYgKGF0eXBlID09IFRJUENfQUREUl9OQU1FU0VRKSB7CisgICAgICAgICAgICBhZGRyLT5hZGRyLm5hbWVzZXEudHlwZSA9IHYxOworICAgICAgICAgICAgYWRkci0+YWRkci5uYW1lc2VxLmxvd2VyID0gdjI7CisgICAgICAgICAgICBhZGRyLT5hZGRyLm5hbWVzZXEudXBwZXIgPSB2MzsKKyAgICAgICAgfSBlbHNlIGlmIChhdHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgeworICAgICAgICAgICAgYWRkci0+YWRkci5uYW1lLm5hbWUudHlwZSA9IHYxOworICAgICAgICAgICAgYWRkci0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2UgPSB2MjsKKyAgICAgICAgfSBlbHNlIGlmIChhdHlwZSA9PSBUSVBDX0FERFJfSUQpIHsKKyAgICAgICAgICAgIGFkZHItPmFkZHIuaWQubm9kZSA9IHYxOworICAgICAgICAgICAgYWRkci0+YWRkci5pZC5yZWYgPSB2MjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJbnZhbGlkIGFkZHJlc3MgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KIAotCQkqbGVuX3JldCA9IHNpemVvZigqYWRkcik7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mKCphZGRyKTsKIAotCQlyZXR1cm4gMTsKLQl9CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZgogCi0JLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCisgICAgLyogTW9yZSBjYXNlcyBoZXJlLi4uICovCiAKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJhcmc6IGJhZCBmYW1pbHkiKTsKLQkJcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRyYXJnOiBiYWQgZmFtaWx5Iik7CisgICAgICAgIHJldHVybiAwOwogCi0JfQorICAgIH0KIH0KIAogCkBAIC0xNTA0LDg5ICsxNTA0LDg5IEBACiBzdGF0aWMgaW50CiBnZXRzb2NrYWRkcmxlbihQeVNvY2tldFNvY2tPYmplY3QgKnMsIHNvY2tsZW5fdCAqbGVuX3JldCkKIHsKLQlzd2l0Y2ggKHMtPnNvY2tfZmFtaWx5KSB7CisgICAgc3dpdGNoIChzLT5zb2NrX2ZhbWlseSkgewogCiAjaWYgZGVmaW5lZChBRl9VTklYKQotCWNhc2UgQUZfVU5JWDoKLQl7Ci0JCSpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfdW4pOwotCQlyZXR1cm4gMTsKLQl9CisgICAgY2FzZSBBRl9VTklYOgorICAgIHsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl91bik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZiAvKiBBRl9VTklYICovCiAjaWYgZGVmaW5lZChBRl9ORVRMSU5LKQogICAgICAgIGNhc2UgQUZfTkVUTElOSzoKICAgICAgICB7Ci0gICAgICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX25sKTsKLSAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX25sKTsKKyAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogI2VuZGlmCiAKLQljYXNlIEFGX0lORVQ6Ci0JewotCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2luKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfSU5FVDoKKyAgICB7CisgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JewotCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2luNik7Ci0JCXJldHVybiAxOwotCX0KKyAgICBjYXNlIEFGX0lORVQ2OgorICAgIHsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIFVTRV9CTFVFVE9PVEgKLQljYXNlIEFGX0JMVUVUT09USDoKLQl7Ci0JCXN3aXRjaChzLT5zb2NrX3Byb3RvKQotCQl7CisgICAgY2FzZSBBRl9CTFVFVE9PVEg6CisgICAgeworICAgICAgICBzd2l0Y2gocy0+c29ja19wcm90bykKKyAgICAgICAgewogCi0JCWNhc2UgQlRQUk9UT19MMkNBUDoKLQkJCSpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbDIpOwotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgQlRQUk9UT19SRkNPTU06Ci0JCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3JjKTsKLQkJCXJldHVybiAxOwotCQljYXNlIEJUUFJPVE9fSENJOgotCQkJKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9oY2kpOwotCQkJcmV0dXJuIDE7CisgICAgICAgIGNhc2UgQlRQUk9UT19MMkNBUDoKKyAgICAgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfbDIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgQlRQUk9UT19SRkNPTU06CisgICAgICAgICAgICAqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3JjKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEJUUFJPVE9fSENJOgorICAgICAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9oY2kpOworICAgICAgICAgICAgcmV0dXJuIDE7CiAjaWYgIWRlZmluZWQoX19GcmVlQlNEX18pCi0JCWNhc2UgQlRQUk9UT19TQ086Ci0JCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3Njbyk7Ci0JCQlyZXR1cm4gMTsKKyAgICAgICAgY2FzZSBCVFBST1RPX1NDTzoKKyAgICAgICAgICAgICpsZW5fcmV0ID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfc2NvKTsKKyAgICAgICAgICAgIHJldHVybiAxOwogI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJsZW46ICIKLQkJCQkJInVua25vd24gQlQgcHJvdG9jb2wiKTsKLQkJCXJldHVybiAwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2thZGRybGVuOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gQlQgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCX0KLQl9CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9ICi0JY2FzZSBBRl9QQUNLRVQ6Ci0JewotCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2xsKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNhc2UgQUZfUEFDS0VUOgorICAgIHsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9sbCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgSEFWRV9MSU5VWF9USVBDX0gKLQljYXNlIEFGX1RJUEM6Ci0JewotCQkqbGVuX3JldCA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3RpcGMpOwotCQlyZXR1cm4gMTsKLQl9CisgICAgY2FzZSBBRl9USVBDOgorICAgIHsKKyAgICAgICAgKmxlbl9yZXQgPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl90aXBjKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCiAKLQkvKiBNb3JlIGNhc2VzIGhlcmUuLi4gKi8KKyAgICAvKiBNb3JlIGNhc2VzIGhlcmUuLi4gKi8KIAotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2NrYWRkcmxlbjogYmFkIGZhbWlseSIpOwotCQlyZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0c29ja2FkZHJsZW46IGJhZCBmYW1pbHkiKTsKKyAgICAgICAgcmV0dXJuIDA7CiAKLQl9CisgICAgfQogfQogCiAKQEAgLTE1OTUsNjcgKzE1OTUsNjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX2FjY2VwdChQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0Jc29ja19hZGRyX3QgYWRkcmJ1ZjsKLQlTT0NLRVRfVCBuZXdmZDsKLQlzb2NrbGVuX3QgYWRkcmxlbjsKLQlQeU9iamVjdCAqc29jayA9IE5VTEw7Ci0JUHlPYmplY3QgKmFkZHIgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXMgPSBOVUxMOwotCWludCB0aW1lb3V0OworICAgIHNvY2tfYWRkcl90IGFkZHJidWY7CisgICAgU09DS0VUX1QgbmV3ZmQ7CisgICAgc29ja2xlbl90IGFkZHJsZW47CisgICAgUHlPYmplY3QgKnNvY2sgPSBOVUxMOworICAgIFB5T2JqZWN0ICphZGRyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBpbnQgdGltZW91dDsKIAotCWlmICghZ2V0c29ja2FkZHJsZW4ocywgJmFkZHJsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoJmFkZHJidWYsIDAsIGFkZHJsZW4pOworICAgIGlmICghZ2V0c29ja2FkZHJsZW4ocywgJmFkZHJsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQoJmFkZHJidWYsIDAsIGFkZHJsZW4pOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCW5ld2ZkID0gSU5WQUxJRF9TT0NLRVQ7CisgICAgbmV3ZmQgPSBJTlZBTElEX1NPQ0tFVDsKICNlbHNlCi0JbmV3ZmQgPSAtMTsKKyAgICBuZXdmZCA9IC0xOwogI2VuZGlmCiAKLQlpZiAoIUlTX1NFTEVDVEFCTEUocykpCi0JCXJldHVybiBzZWxlY3RfZXJyb3IoKTsKKyAgICBpZiAoIUlTX1NFTEVDVEFCTEUocykpCisgICAgICAgIHJldHVybiBzZWxlY3RfZXJyb3IoKTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOwotCWlmICghdGltZW91dCkKLQkJbmV3ZmQgPSBhY2NlcHQocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7CisgICAgaWYgKCF0aW1lb3V0KQorICAgICAgICBuZXdmZCA9IGFjY2VwdChzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodGltZW91dCA9PSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZmRlZiBNU19XSU5ET1dTCi0JaWYgKG5ld2ZkID09IElOVkFMSURfU09DS0VUKQorICAgIGlmIChuZXdmZCA9PSBJTlZBTElEX1NPQ0tFVCkKICNlbHNlCi0JaWYgKG5ld2ZkIDwgMCkKKyAgICBpZiAobmV3ZmQgPCAwKQogI2VuZGlmCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwogCi0JLyogQ3JlYXRlIHRoZSBuZXcgb2JqZWN0IHdpdGggdW5zcGVjaWZpZWQgZmFtaWx5LAotCSAgIHRvIGF2b2lkIGNhbGxzIHRvIGJpbmQoKSBldGMuIG9uIGl0LiAqLwotCXNvY2sgPSAoUHlPYmplY3QgKikgbmV3X3NvY2tvYmplY3QobmV3ZmQsCi0JCQkJCSAgIHMtPnNvY2tfZmFtaWx5LAotCQkJCQkgICBzLT5zb2NrX3R5cGUsCi0JCQkJCSAgIHMtPnNvY2tfcHJvdG8pOworICAgIC8qIENyZWF0ZSB0aGUgbmV3IG9iamVjdCB3aXRoIHVuc3BlY2lmaWVkIGZhbWlseSwKKyAgICAgICB0byBhdm9pZCBjYWxscyB0byBiaW5kKCkgZXRjLiBvbiBpdC4gKi8KKyAgICBzb2NrID0gKFB5T2JqZWN0ICopIG5ld19zb2Nrb2JqZWN0KG5ld2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c29ja19mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zb2NrX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zb2NrX3Byb3RvKTsKIAotCWlmIChzb2NrID09IE5VTEwpIHsKLQkJU09DS0VUQ0xPU0UobmV3ZmQpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQotCWFkZHIgPSBtYWtlc29ja2FkZHIocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwKLQkJCSAgICBhZGRybGVuLCBzLT5zb2NrX3Byb3RvKTsKLQlpZiAoYWRkciA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7CisgICAgaWYgKHNvY2sgPT0gTlVMTCkgeworICAgICAgICBTT0NLRVRDTE9TRShuZXdmZCk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CisgICAgYWRkciA9IG1ha2Vzb2NrYWRkcihzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmxlbiwgcy0+c29ja19wcm90byk7CisgICAgaWYgKGFkZHIgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OwogCi0JcmVzID0gUHlUdXBsZV9QYWNrKDIsIHNvY2ssIGFkZHIpOworICAgIHJlcyA9IFB5VHVwbGVfUGFjaygyLCBzb2NrLCBhZGRyKTsKIAogZmluYWxseToKLQlQeV9YREVDUkVGKHNvY2spOwotCVB5X1hERUNSRUYoYWRkcik7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9YREVDUkVGKHNvY2spOworICAgIFB5X1hERUNSRUYoYWRkcik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKGFjY2VwdF9kb2MsCkBAIC0xNjczLDE3ICsxNjczLDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19zZXRibG9ja2luZyhQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmcpCiB7Ci0JaW50IGJsb2NrOworICAgIGludCBibG9jazsKIAotCWJsb2NrID0gUHlJbnRfQXNMb25nKGFyZyk7Ci0JaWYgKGJsb2NrID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIGJsb2NrID0gUHlJbnRfQXNMb25nKGFyZyk7CisgICAgaWYgKGJsb2NrID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jcy0+c29ja190aW1lb3V0ID0gYmxvY2sgPyAtMS4wIDogMC4wOwotCWludGVybmFsX3NldGJsb2NraW5nKHMsIGJsb2NrKTsKKyAgICBzLT5zb2NrX3RpbWVvdXQgPSBibG9jayA/IC0xLjAgOiAwLjA7CisgICAgaW50ZXJuYWxfc2V0YmxvY2tpbmcocywgYmxvY2spOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldGJsb2NraW5nX2RvYywKQEAgLTE3MDIsMjUgKzE3MDIsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NldHRpbWVvdXQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJnKQogewotCWRvdWJsZSB0aW1lb3V0OworICAgIGRvdWJsZSB0aW1lb3V0OwogCi0JaWYgKGFyZyA9PSBQeV9Ob25lKQotCQl0aW1lb3V0ID0gLTEuMDsKLQllbHNlIHsKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQkJaWYgKHRpbWVvdXQgPCAwLjApIHsKLQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJUaW1lb3V0IHZhbHVlIG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKGFyZyA9PSBQeV9Ob25lKQorICAgICAgICB0aW1lb3V0ID0gLTEuMDsKKyAgICBlbHNlIHsKKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICAgICAgaWYgKHRpbWVvdXQgPCAwLjApIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVvdXQgdmFsdWUgb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXMtPnNvY2tfdGltZW91dCA9IHRpbWVvdXQ7Ci0JaW50ZXJuYWxfc2V0YmxvY2tpbmcocywgdGltZW91dCA8IDAuMCk7CisgICAgcy0+c29ja190aW1lb3V0ID0gdGltZW91dDsKKyAgICBpbnRlcm5hbF9zZXRibG9ja2luZyhzLCB0aW1lb3V0IDwgMC4wKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXR0aW1lb3V0X2RvYywKQEAgLTE3MzYsMTIgKzE3MzYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX2dldHRpbWVvdXQoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotCWlmIChzLT5zb2NrX3RpbWVvdXQgPCAwLjApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHMtPnNvY2tfdGltZW91dCk7CisgICAgaWYgKHMtPnNvY2tfdGltZW91dCA8IDAuMCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocy0+c29ja190aW1lb3V0KTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHRpbWVvdXRfZG9jLApAQCAtMTc1NywxNiArMTc1NywxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfc2xlZXB0YXNrdyhQeVNvY2tldFNvY2tPYmplY3QgKnMsUHlPYmplY3QgKmFyZykKIHsKLQlpbnQgYmxvY2s7Ci0JYmxvY2sgPSBQeUludF9Bc0xvbmcoYXJnKTsKLQlpZiAoYmxvY2sgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXNvY2tldGlvY3RsKHMtPnNvY2tfZmQsIDB4ODAwNDY2NzksICh1X2xvbmcqKSZibG9jayk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpbnQgYmxvY2s7CisgICAgYmxvY2sgPSBQeUludF9Bc0xvbmcoYXJnKTsKKyAgICBpZiAoYmxvY2sgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHNvY2tldGlvY3RsKHMtPnNvY2tfZmQsIDB4ODAwNDY2NzksICh1X2xvbmcqKSZibG9jayk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiBQeURvY19TVFJWQVIoc2xlZXB0YXNrd19kb2MsCiAic2xlZXB0YXNrdyhmbGFnKVxuXApAQCAtMTc4MywyOSArMTc4MywyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfc2V0c29ja29wdChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBsZXZlbDsKLQlpbnQgb3B0bmFtZTsKLQlpbnQgcmVzOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmbGVuOwotCWludCBmbGFnOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgb3B0bmFtZTsKKyAgICBpbnQgcmVzOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgYnVmbGVuOworICAgIGludCBmbGFnOwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaTpzZXRzb2Nrb3B0IiwKLQkJCSAgICAgJmxldmVsLCAmb3B0bmFtZSwgJmZsYWcpKSB7Ci0JCWJ1ZiA9IChjaGFyICopICZmbGFnOwotCQlidWZsZW4gPSBzaXplb2YgZmxhZzsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlzIzpzZXRzb2Nrb3B0IiwKLQkJCQkgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmYnVmLCAmYnVmbGVuKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLCAodm9pZCAqKWJ1ZiwgYnVmbGVuKTsKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpOnNldHNvY2tvcHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCwgJm9wdG5hbWUsICZmbGFnKSkgeworICAgICAgICBidWYgPSAoY2hhciAqKSAmZmxhZzsKKyAgICAgICAgYnVmbGVuID0gc2l6ZW9mIGZsYWc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpcyM6c2V0c29ja29wdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwsICZvcHRuYW1lLCAmYnVmLCAmYnVmbGVuKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXMgPSBzZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLCAodm9pZCAqKWJ1ZiwgYnVmbGVuKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldHNvY2tvcHRfZG9jLApAQCAtMTgyMyw1MyArMTgyMyw1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfZ2V0c29ja29wdChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBsZXZlbDsKLQlpbnQgb3B0bmFtZTsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICpidWY7Ci0Jc29ja2xlbl90IGJ1ZmxlbiA9IDA7CisgICAgaW50IGxldmVsOworICAgIGludCBvcHRuYW1lOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKmJ1ZjsKKyAgICBzb2NrbGVuX3QgYnVmbGVuID0gMDsKIAogI2lmZGVmIF9fQkVPU19fCi0JLyogV2UgaGF2ZSBpbmNvbXBsZXRlIHNvY2tldCBzdXBwb3J0LiAqLwotCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJnZXRzb2Nrb3B0IG5vdCBzdXBwb3J0ZWQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAvKiBXZSBoYXZlIGluY29tcGxldGUgc29ja2V0IHN1cHBvcnQuICovCisgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHNvY2tvcHQgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBOVUxMOwogI2Vsc2UKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWl8aTpnZXRzb2Nrb3B0IiwKLQkJCSAgICAgICZsZXZlbCwgJm9wdG5hbWUsICZidWZsZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpfGk6Z2V0c29ja29wdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCwgJm9wdG5hbWUsICZidWZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChidWZsZW4gPT0gMCkgewotCQlpbnQgZmxhZyA9IDA7Ci0JCXNvY2tsZW5fdCBmbGFnc2l6ZSA9IHNpemVvZiBmbGFnOwotCQlyZXMgPSBnZXRzb2Nrb3B0KHMtPnNvY2tfZmQsIGxldmVsLCBvcHRuYW1lLAotCQkJCSAodm9pZCAqKSZmbGFnLCAmZmxhZ3NpemUpOwotCQlpZiAocmVzIDwgMCkKLQkJCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZsYWcpOwotCX0KKyAgICBpZiAoYnVmbGVuID09IDApIHsKKyAgICAgICAgaW50IGZsYWcgPSAwOworICAgICAgICBzb2NrbGVuX3QgZmxhZ3NpemUgPSBzaXplb2YgZmxhZzsKKyAgICAgICAgcmVzID0gZ2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZmbGFnLCAmZmxhZ3NpemUpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZsYWcpOworICAgIH0KICNpZmRlZiBfX1ZNUwotCS8qIHNvY2tsZW5fdCBpcyB1bnNpZ25lZCBzbyBubyBuZWdhdGl2ZSB0ZXN0IGlzIG5lZWRlZCwKLQkgICB0ZXN0IGJ1ZmxlbiA9PSAwIGlzIHByZXZpb3VzbHkgZG9uZSAqLwotCWlmIChidWZsZW4gPiAxMDI0KSB7CisgICAgLyogc29ja2xlbl90IGlzIHVuc2lnbmVkIHNvIG5vIG5lZ2F0aXZlIHRlc3QgaXMgbmVlZGVkLAorICAgICAgIHRlc3QgYnVmbGVuID09IDAgaXMgcHJldmlvdXNseSBkb25lICovCisgICAgaWYgKGJ1ZmxlbiA+IDEwMjQpIHsKICNlbHNlCi0JaWYgKGJ1ZmxlbiA8PSAwIHx8IGJ1ZmxlbiA+IDEwMjQpIHsKKyAgICBpZiAoYnVmbGVuIDw9IDAgfHwgYnVmbGVuID4gMTAyNCkgewogI2VuZGlmCi0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJImdldHNvY2tvcHQgYnVmbGVuIG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYnVmID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBidWZsZW4pOwotCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gZ2V0c29ja29wdChzLT5zb2NrX2ZkLCBsZXZlbCwgb3B0bmFtZSwKLQkJCSAodm9pZCAqKVB5U3RyaW5nX0FTX1NUUklORyhidWYpLCAmYnVmbGVuKTsKLQlpZiAocmVzIDwgMCkgewotCQlQeV9ERUNSRUYoYnVmKTsKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCX0KLQlfUHlTdHJpbmdfUmVzaXplKCZidWYsIGJ1Zmxlbik7Ci0JcmV0dXJuIGJ1ZjsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZXRzb2Nrb3B0IGJ1ZmxlbiBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgYnVmbGVuKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IGdldHNvY2tvcHQocy0+c29ja19mZCwgbGV2ZWwsIG9wdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKVB5U3RyaW5nX0FTX1NUUklORyhidWYpLCAmYnVmbGVuKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYoYnVmKTsKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIH0KKyAgICBfUHlTdHJpbmdfUmVzaXplKCZidWYsIGJ1Zmxlbik7CisgICAgcmV0dXJuIGJ1ZjsKICNlbmRpZiAvKiBfX0JFT1NfXyAqLwogfQogCkBAIC0xODg2LDE5ICsxODg2LDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19iaW5kKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFkZHJvKQogewotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JaW50IGFkZHJsZW47Ci0JaW50IHJlczsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCBhZGRybGVuOworICAgIGludCByZXM7CiAKLQlpZiAoIWdldHNvY2thZGRyYXJnKHMsIGFkZHJvLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbikpCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBiaW5kKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4pOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFnZXRzb2NrYWRkcmFyZyhzLCBhZGRybywgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gYmluZChzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoYmluZF9kb2MsCkBAIC0xOTE2LDE2ICsxOTE2LDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19jbG9zZShQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0JU09DS0VUX1QgZmQ7CisgICAgU09DS0VUX1QgZmQ7CiAKLQlpZiAoKGZkID0gcy0+c29ja19mZCkgIT0gLTEpIHsKLQkJcy0+c29ja19mZCA9IC0xOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCSh2b2lkKSBTT0NLRVRDTE9TRShmZCk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoKGZkID0gcy0+c29ja19mZCkgIT0gLTEpIHsKKyAgICAgICAgcy0+c29ja19mZCA9IC0xOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICh2b2lkKSBTT0NLRVRDTE9TRShmZCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGNsb3NlX2RvYywKQEAgLTE5MzUsOTAgKzE5MzUsOTAgQEAKIAogc3RhdGljIGludAogaW50ZXJuYWxfY29ubmVjdChQeVNvY2tldFNvY2tPYmplY3QgKnMsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgaW50IGFkZHJsZW4sCi0JCSBpbnQgKnRpbWVvdXRwKQorICAgICAgICAgICAgICAgICBpbnQgKnRpbWVvdXRwKQogewotCWludCByZXMsIHRpbWVvdXQ7CisgICAgaW50IHJlcywgdGltZW91dDsKIAotCXRpbWVvdXQgPSAwOwotCXJlcyA9IGNvbm5lY3Qocy0+c29ja19mZCwgYWRkciwgYWRkcmxlbik7CisgICAgdGltZW91dCA9IDA7CisgICAgcmVzID0gY29ubmVjdChzLT5zb2NrX2ZkLCBhZGRyLCBhZGRybGVuKTsKIAogI2lmZGVmIE1TX1dJTkRPV1MKIAotCWlmIChzLT5zb2NrX3RpbWVvdXQgPiAwLjApIHsKLQkJaWYgKHJlcyA8IDAgJiYgV1NBR2V0TGFzdEVycm9yKCkgPT0gV1NBRVdPVUxEQkxPQ0sgJiYKLQkJICAgIElTX1NFTEVDVEFCTEUocykpIHsKLQkJCS8qIFRoaXMgaXMgYSBtZXNzLiAgQmVzdCBzb2x1dGlvbjogdHJ1c3Qgc2VsZWN0ICovCi0JCQlmZF9zZXQgZmRzOwotCQkJZmRfc2V0IGZkc19leGM7Ci0JCQlzdHJ1Y3QgdGltZXZhbCB0djsKLQkJCXR2LnR2X3NlYyA9IChpbnQpcy0+c29ja190aW1lb3V0OwotCQkJdHYudHZfdXNlYyA9IChpbnQpKChzLT5zb2NrX3RpbWVvdXQgLSB0di50dl9zZWMpICogMWU2KTsKLQkJCUZEX1pFUk8oJmZkcyk7Ci0JCQlGRF9TRVQocy0+c29ja19mZCwgJmZkcyk7Ci0JCQlGRF9aRVJPKCZmZHNfZXhjKTsKLQkJCUZEX1NFVChzLT5zb2NrX2ZkLCAmZmRzX2V4Yyk7Ci0JCQlyZXMgPSBzZWxlY3Qocy0+c29ja19mZCsxLCBOVUxMLCAmZmRzLCAmZmRzX2V4YywgJnR2KTsKLQkJCWlmIChyZXMgPT0gMCkgewotCQkJCXJlcyA9IFdTQUVXT1VMREJMT0NLOwotCQkJCXRpbWVvdXQgPSAxOwotCQkJfSBlbHNlIGlmIChyZXMgPiAwKSB7Ci0JCQkJaWYgKEZEX0lTU0VUKHMtPnNvY2tfZmQsICZmZHMpKQotCQkJCQkvKiBUaGUgc29ja2V0IGlzIGluIHRoZSB3cml0ZWFibGUgc2V0IC0gdGhpcwotCQkJCQkgICBtZWFucyBjb25uZWN0ZWQgKi8KLQkJCQkJcmVzID0gMDsKLQkJCQllbHNlIHsKLQkJCQkJLyogQXMgcGVyIE1TIGRvY3MsIHdlIG5lZWQgdG8gY2FsbCBnZXRzb2Nrb3B0KCkKLQkJCQkJICAgdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIGVycm9yICovCi0JCQkJCWludCByZXNfc2l6ZSA9IHNpemVvZiByZXM7Ci0JCQkJCS8qIEl0IG11c3QgYmUgaW4gdGhlIGV4Y2VwdGlvbiBzZXQgKi8KLQkJCQkJYXNzZXJ0KEZEX0lTU0VUKHMtPnNvY2tfZmQsICZmZHNfZXhjKSk7Ci0JCQkJCWlmICgwID09IGdldHNvY2tvcHQocy0+c29ja19mZCwgU09MX1NPQ0tFVCwgU09fRVJST1IsCi0JCQkJCSAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmcmVzLCAmcmVzX3NpemUpKQotCQkJCQkJLyogZ2V0c29ja29wdCBhbHNvIGNsZWFycyBXU0FHZXRMYXN0RXJyb3IsCi0JCQkJCQkgICBzbyByZXNldCBpdCBiYWNrLiAqLwotCQkJCQkJV1NBU2V0TGFzdEVycm9yKHJlcyk7Ci0JCQkJCWVsc2UKLQkJCQkJCXJlcyA9IFdTQUdldExhc3RFcnJvcigpOwotCQkJCX0KLQkJCX0KLQkJCS8qIGVsc2UgaWYgKHJlcyA8IDApIGFuIGVycm9yIG9jY3VycmVkICovCi0JCX0KLQl9CisgICAgaWYgKHMtPnNvY2tfdGltZW91dCA+IDAuMCkgeworICAgICAgICBpZiAocmVzIDwgMCAmJiBXU0FHZXRMYXN0RXJyb3IoKSA9PSBXU0FFV09VTERCTE9DSyAmJgorICAgICAgICAgICAgSVNfU0VMRUNUQUJMRShzKSkgeworICAgICAgICAgICAgLyogVGhpcyBpcyBhIG1lc3MuICBCZXN0IHNvbHV0aW9uOiB0cnVzdCBzZWxlY3QgKi8KKyAgICAgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgICAgICBmZF9zZXQgZmRzX2V4YzsKKyAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICAgICAgdHYudHZfc2VjID0gKGludClzLT5zb2NrX3RpbWVvdXQ7CisgICAgICAgICAgICB0di50dl91c2VjID0gKGludCkoKHMtPnNvY2tfdGltZW91dCAtIHR2LnR2X3NlYykgKiAxZTYpOworICAgICAgICAgICAgRkRfWkVSTygmZmRzKTsKKyAgICAgICAgICAgIEZEX1NFVChzLT5zb2NrX2ZkLCAmZmRzKTsKKyAgICAgICAgICAgIEZEX1pFUk8oJmZkc19leGMpOworICAgICAgICAgICAgRkRfU0VUKHMtPnNvY2tfZmQsICZmZHNfZXhjKTsKKyAgICAgICAgICAgIHJlcyA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsIE5VTEwsICZmZHMsICZmZHNfZXhjLCAmdHYpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmVzID0gV1NBRVdPVUxEQkxPQ0s7CisgICAgICAgICAgICAgICAgdGltZW91dCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoRkRfSVNTRVQocy0+c29ja19mZCwgJmZkcykpCisgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBzb2NrZXQgaXMgaW4gdGhlIHdyaXRlYWJsZSBzZXQgLSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgIG1lYW5zIGNvbm5lY3RlZCAqLworICAgICAgICAgICAgICAgICAgICByZXMgPSAwOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBBcyBwZXIgTVMgZG9jcywgd2UgbmVlZCB0byBjYWxsIGdldHNvY2tvcHQoKQorICAgICAgICAgICAgICAgICAgICAgICB0byBnZXQgdGhlIHVuZGVybHlpbmcgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICAgICAgaW50IHJlc19zaXplID0gc2l6ZW9mIHJlczsKKyAgICAgICAgICAgICAgICAgICAgLyogSXQgbXVzdCBiZSBpbiB0aGUgZXhjZXB0aW9uIHNldCAqLworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoRkRfSVNTRVQocy0+c29ja19mZCwgJmZkc19leGMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gZ2V0c29ja29wdChzLT5zb2NrX2ZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZyZXMsICZyZXNfc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXRzb2Nrb3B0IGFsc28gY2xlYXJzIFdTQUdldExhc3RFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIHJlc2V0IGl0IGJhY2suICovCisgICAgICAgICAgICAgICAgICAgICAgICBXU0FTZXRMYXN0RXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gV1NBR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZWxzZSBpZiAocmVzIDwgMCkgYW4gZXJyb3Igb2NjdXJyZWQgKi8KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChyZXMgPCAwKQotCQlyZXMgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmVzID0gV1NBR2V0TGFzdEVycm9yKCk7CiAKICNlbHNlCiAKLQlpZiAocy0+c29ja190aW1lb3V0ID4gMC4wKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlOUFJPR1JFU1MgJiYgSVNfU0VMRUNUQUJMRShzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnVnICMxMDE5ODA4OiBpbiBjYXNlIG9mIGFuIEVJTlBST0dSRVNTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIGdldHNvY2tvcHQoU09fRVJST1IpIHRvIGdldCB0aGUgcmVhbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IuICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCByZXNfc2l6ZSA9IHNpemVvZiByZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWdldHNvY2tvcHQocy0+c29ja19mZCwgU09MX1NPQ0tFVCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09fRVJST1IsICZyZXMsICZyZXNfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gRUlTQ09OTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyA9IHJlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVvdXQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gZXJybm87ICAgICAgICAgICAgLyogaGFkIGVycm9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCQllbHNlCi0JCQkJcmVzID0gRVdPVUxEQkxPQ0s7CS8qIHRpbWVkIG91dCAqLwotCQl9Ci0JfQorICAgIGlmIChzLT5zb2NrX3RpbWVvdXQgPiAwLjApIHsKKyAgICAgICAgaWYgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlOUFJPR1JFU1MgJiYgSVNfU0VMRUNUQUJMRShzKSkgeworICAgICAgICAgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBCdWcgIzEwMTk4MDg6IGluIGNhc2Ugb2YgYW4gRUlOUFJPR1JFU1MsCisgICAgICAgICAgICAgICAgICAgdXNlIGdldHNvY2tvcHQoU09fRVJST1IpIHRvIGdldCB0aGUgcmVhbAorICAgICAgICAgICAgICAgICAgIGVycm9yLiAqLworICAgICAgICAgICAgICAgIHNvY2tsZW5fdCByZXNfc2l6ZSA9IHNpemVvZiByZXM7CisgICAgICAgICAgICAgICAgKHZvaWQpZ2V0c29ja29wdChzLT5zb2NrX2ZkLCBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09fRVJST1IsICZyZXMsICZyZXNfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBFSVNDT05OKQorICAgICAgICAgICAgICAgICAgICByZXMgPSAwOworICAgICAgICAgICAgICAgIGVycm5vID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodGltZW91dCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJlcyA9IGVycm5vOyAgICAgICAgICAgIC8qIGhhZCBlcnJvciAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlcyA9IEVXT1VMREJMT0NLOyAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lZCBvdXQgKi8KKyAgICAgICAgfQorICAgIH0KIAotCWlmIChyZXMgPCAwKQotCQlyZXMgPSBlcnJubzsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmVzID0gZXJybm87CiAKICNlbmRpZgotCSp0aW1lb3V0cCA9IHRpbWVvdXQ7CisgICAgKnRpbWVvdXRwID0gdGltZW91dDsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogcy5jb25uZWN0KHNvY2thZGRyKSBtZXRob2QgKi8KQEAgLTIwMjYsMjYgKzIwMjYsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX2Nvbm5lY3QoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYWRkcm8pCiB7Ci0Jc29ja19hZGRyX3QgYWRkcmJ1ZjsKLQlpbnQgYWRkcmxlbjsKLQlpbnQgcmVzOwotCWludCB0aW1lb3V0OworICAgIHNvY2tfYWRkcl90IGFkZHJidWY7CisgICAgaW50IGFkZHJsZW47CisgICAgaW50IHJlczsKKyAgICBpbnQgdGltZW91dDsKIAotCWlmICghZ2V0c29ja2FkZHJhcmcocywgYWRkcm8sIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFnZXRzb2NrYWRkcmFyZyhzLCBhZGRybywgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBpbnRlcm5hbF9jb25uZWN0KHMsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4sICZ0aW1lb3V0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXMgPSBpbnRlcm5hbF9jb25uZWN0KHMsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4sICZ0aW1lb3V0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHRpbWVvdXQgPT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChyZXMgIT0gMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAodGltZW91dCA9PSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHJlcyAhPSAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoY29ubmVjdF9kb2MsCkBAIC0yMDYwLDI2ICsyMDYwLDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19jb25uZWN0X2V4KFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFkZHJvKQogewotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JaW50IGFkZHJsZW47Ci0JaW50IHJlczsKLQlpbnQgdGltZW91dDsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCBhZGRybGVuOworICAgIGludCByZXM7CisgICAgaW50IHRpbWVvdXQ7CiAKLQlpZiAoIWdldHNvY2thZGRyYXJnKHMsIGFkZHJvLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghZ2V0c29ja2FkZHJhcmcocywgYWRkcm8sIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gaW50ZXJuYWxfY29ubmVjdChzLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuLCAmdGltZW91dCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gaW50ZXJuYWxfY29ubmVjdChzLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuLCAmdGltZW91dCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCS8qIFNpZ25hbHMgYXJlIG5vdCBlcnJvcnMgKHRob3VnaCB0aGV5IG1heSByYWlzZSBleGNlcHRpb25zKS4gIEFkYXB0ZWQKLQkgICBmcm9tIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdCgpLiAqLworICAgIC8qIFNpZ25hbHMgYXJlIG5vdCBlcnJvcnMgKHRob3VnaCB0aGV5IG1heSByYWlzZSBleGNlcHRpb25zKS4gIEFkYXB0ZWQKKyAgICAgICBmcm9tIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdCgpLiAqLwogI2lmZGVmIEVJTlRSCi0JaWYgKHJlcyA9PSBFSU5UUiAmJiBQeUVycl9DaGVja1NpZ25hbHMoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHJlcyA9PSBFSU5UUiAmJiBQeUVycl9DaGVja1NpZ25hbHMoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgcmVzKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHJlcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb25uZWN0X2V4X2RvYywKQEAgLTIwOTUsOSArMjA5NSw5IEBACiBzb2NrX2ZpbGVubyhQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7CiAjaWYgU0laRU9GX1NPQ0tFVF9UIDw9IFNJWkVPRl9MT05HCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBzLT5zb2NrX2ZkKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHMtPnNvY2tfZmQpOwogI2Vsc2UKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXMtPnNvY2tfZmQpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpcy0+c29ja19mZCk7CiAjZW5kaWYKIH0KIApAQCAtMjExMywxOSArMjExMywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfZHVwKFB5U29ja2V0U29ja09iamVjdCAqcykKIHsKLQlTT0NLRVRfVCBuZXdmZDsKLQlQeU9iamVjdCAqc29jazsKKyAgICBTT0NLRVRfVCBuZXdmZDsKKyAgICBQeU9iamVjdCAqc29jazsKIAotCW5ld2ZkID0gZHVwKHMtPnNvY2tfZmQpOwotCWlmIChuZXdmZCA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlzb2NrID0gKFB5T2JqZWN0ICopIG5ld19zb2Nrb2JqZWN0KG5ld2ZkLAotCQkJCQkgICBzLT5zb2NrX2ZhbWlseSwKLQkJCQkJICAgcy0+c29ja190eXBlLAotCQkJCQkgICBzLT5zb2NrX3Byb3RvKTsKLQlpZiAoc29jayA9PSBOVUxMKQotCQlTT0NLRVRDTE9TRShuZXdmZCk7Ci0JcmV0dXJuIHNvY2s7CisgICAgbmV3ZmQgPSBkdXAocy0+c29ja19mZCk7CisgICAgaWYgKG5ld2ZkIDwgMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIHNvY2sgPSAoUHlPYmplY3QgKikgbmV3X3NvY2tvYmplY3QobmV3ZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zb2NrX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNvY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNvY2tfcHJvdG8pOworICAgIGlmIChzb2NrID09IE5VTEwpCisgICAgICAgIFNPQ0tFVENMT1NFKG5ld2ZkKTsKKyAgICByZXR1cm4gc29jazsKIH0KIAogUHlEb2NfU1RSVkFSKGR1cF9kb2MsCkBAIC0yMTQxLDIwICsyMTQxLDIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19nZXRzb2NrbmFtZShQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0Jc29ja19hZGRyX3QgYWRkcmJ1ZjsKLQlpbnQgcmVzOwotCXNvY2tsZW5fdCBhZGRybGVuOworICAgIHNvY2tfYWRkcl90IGFkZHJidWY7CisgICAgaW50IHJlczsKKyAgICBzb2NrbGVuX3QgYWRkcmxlbjsKIAotCWlmICghZ2V0c29ja2FkZHJsZW4ocywgJmFkZHJsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoJmFkZHJidWYsIDAsIGFkZHJsZW4pOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBnZXRzb2NrbmFtZShzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCXJldHVybiBtYWtlc29ja2FkZHIocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgYWRkcmxlbiwKLQkJCSAgICBzLT5zb2NrX3Byb3RvKTsKKyAgICBpZiAoIWdldHNvY2thZGRybGVuKHMsICZhZGRybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzID0gZ2V0c29ja25hbWUocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICByZXR1cm4gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5zb2NrX3Byb3RvKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHNvY2tuYW1lX2RvYywKQEAgLTIxNjQsMjYgKzIxNjQsMjYgQEAKIGluZm8gaXMgYSBwYWlyIChob3N0YWRkciwgcG9ydCkuIik7CiAKIAotI2lmZGVmIEhBVkVfR0VUUEVFUk5BTUUJCS8qIENyYXkgQVBQIGRvZXNuJ3QgaGF2ZSB0aGlzIDotKCAqLworI2lmZGVmIEhBVkVfR0VUUEVFUk5BTUUgICAgICAgICAvKiBDcmF5IEFQUCBkb2Vzbid0IGhhdmUgdGhpcyA6LSggKi8KIC8qIHMuZ2V0cGVlcm5hbWUoKSBtZXRob2QgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfZ2V0cGVlcm5hbWUoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotCXNvY2tfYWRkcl90IGFkZHJidWY7Ci0JaW50IHJlczsKLQlzb2NrbGVuX3QgYWRkcmxlbjsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCByZXM7CisgICAgc29ja2xlbl90IGFkZHJsZW47CiAKLQlpZiAoIWdldHNvY2thZGRybGVuKHMsICZhZGRybGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gZ2V0cGVlcm5hbWUocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlyZXR1cm4gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksIGFkZHJsZW4sCi0JCQkgICAgcy0+c29ja19wcm90byk7CisgICAgaWYgKCFnZXRzb2NrYWRkcmxlbihzLCAmYWRkcmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1lbXNldCgmYWRkcmJ1ZiwgMCwgYWRkcmxlbik7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlcyA9IGdldHBlZXJuYW1lKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgcmV0dXJuIG1ha2Vzb2NrYWRkcihzLT5zb2NrX2ZkLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+c29ja19wcm90byk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRwZWVybmFtZV9kb2MsCkBAIC0yMjAwLDIxICsyMjAwLDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19saXN0ZW4oUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJnKQogewotCWludCBiYWNrbG9nOwotCWludCByZXM7CisgICAgaW50IGJhY2tsb2c7CisgICAgaW50IHJlczsKIAotCWJhY2tsb2cgPSBQeUludF9Bc0xvbmcoYXJnKTsKLQlpZiAoYmFja2xvZyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JaWYgKGJhY2tsb2cgPCAxKQotCQliYWNrbG9nID0gMTsKLQlyZXMgPSBsaXN0ZW4ocy0+c29ja19mZCwgYmFja2xvZyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBiYWNrbG9nID0gUHlJbnRfQXNMb25nKGFyZyk7CisgICAgaWYgKGJhY2tsb2cgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGlmIChiYWNrbG9nIDwgMSkKKyAgICAgICAgYmFja2xvZyA9IDE7CisgICAgcmVzID0gbGlzdGVuKHMtPnNvY2tfZmQsIGJhY2tsb2cpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihsaXN0ZW5fZG9jLApAQCAtMjIzNiw0OCArMjIzNiw0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfbWFrZWZpbGUoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKLQlleHRlcm4gaW50IGZjbG9zZShGSUxFICopOwotCWNoYXIgKm1vZGUgPSAiciI7Ci0JaW50IGJ1ZnNpemUgPSAtMTsKKyAgICBleHRlcm4gaW50IGZjbG9zZShGSUxFICopOworICAgIGNoYXIgKm1vZGUgPSAiciI7CisgICAgaW50IGJ1ZnNpemUgPSAtMTsKICNpZmRlZiBNU19XSU4zMgotCVB5X2ludHB0cl90IGZkOworICAgIFB5X2ludHB0cl90IGZkOwogI2Vsc2UKLQlpbnQgZmQ7CisgICAgaW50IGZkOwogI2VuZGlmCi0JRklMRSAqZnA7Ci0JUHlPYmplY3QgKmY7CisgICAgRklMRSAqZnA7CisgICAgUHlPYmplY3QgKmY7CiAjaWZkZWYgX19WTVMKLQljaGFyICptb2RlX3IgPSAiciI7Ci0JY2hhciAqbW9kZV93ID0gInciOworICAgIGNoYXIgKm1vZGVfciA9ICJyIjsKKyAgICBjaGFyICptb2RlX3cgPSAidyI7CiAjZW5kaWYKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHNpOm1ha2VmaWxlIiwgJm1vZGUsICZidWZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8c2k6bWFrZWZpbGUiLCAmbW9kZSwgJmJ1ZnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBfX1ZNUwotCWlmIChzdHJjbXAobW9kZSwicmIiKSA9PSAwKSB7Ci0JICAgIG1vZGUgPSBtb2RlX3I7Ci0JfQotCWVsc2UgewotCQlpZiAoc3RyY21wKG1vZGUsIndiIikgPT0gMCkgewotCQkJbW9kZSA9IG1vZGVfdzsKLQkJfQotCX0KKyAgICBpZiAoc3RyY21wKG1vZGUsInJiIikgPT0gMCkgeworICAgICAgICBtb2RlID0gbW9kZV9yOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHN0cmNtcChtb2RlLCJ3YiIpID09IDApIHsKKyAgICAgICAgICAgIG1vZGUgPSBtb2RlX3c7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKICNpZmRlZiBNU19XSU4zMgotCWlmICgoKGZkID0gX29wZW5fb3NmaGFuZGxlKHMtPnNvY2tfZmQsIF9PX0JJTkFSWSkpIDwgMCkgfHwKLQkgICAgKChmZCA9IGR1cChmZCkpIDwgMCkgfHwgKChmcCA9IGZkb3BlbihmZCwgbW9kZSkpID09IE5VTEwpKQorICAgIGlmICgoKGZkID0gX29wZW5fb3NmaGFuZGxlKHMtPnNvY2tfZmQsIF9PX0JJTkFSWSkpIDwgMCkgfHwKKyAgICAgICAgKChmZCA9IGR1cChmZCkpIDwgMCkgfHwgKChmcCA9IGZkb3BlbihmZCwgbW9kZSkpID09IE5VTEwpKQogI2Vsc2UKLQlpZiAoKGZkID0gZHVwKHMtPnNvY2tfZmQpKSA8IDAgfHwgKGZwID0gZmRvcGVuKGZkLCBtb2RlKSkgPT0gTlVMTCkKKyAgICBpZiAoKGZkID0gZHVwKHMtPnNvY2tfZmQpKSA8IDAgfHwgKGZwID0gZmRvcGVuKGZkLCBtb2RlKSkgPT0gTlVMTCkKICNlbmRpZgotCXsKLQkJaWYgKGZkID49IDApCi0JCQlTT0NLRVRDTE9TRShmZCk7Ci0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQl9Ci0JZiA9IFB5RmlsZV9Gcm9tRmlsZShmcCwgIjxzb2NrZXQ+IiwgbW9kZSwgZmNsb3NlKTsKLQlpZiAoZiAhPSBOVUxMKQotCQlQeUZpbGVfU2V0QnVmU2l6ZShmLCBidWZzaXplKTsKLQlyZXR1cm4gZjsKKyAgICB7CisgICAgICAgIGlmIChmZCA+PSAwKQorICAgICAgICAgICAgU09DS0VUQ0xPU0UoZmQpOworICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgfQorICAgIGYgPSBQeUZpbGVfRnJvbUZpbGUoZnAsICI8c29ja2V0PiIsIG1vZGUsIGZjbG9zZSk7CisgICAgaWYgKGYgIT0gTlVMTCkKKyAgICAgICAgUHlGaWxlX1NldEJ1ZlNpemUoZiwgYnVmc2l6ZSk7CisgICAgcmV0dXJuIGY7CiB9CiAKIFB5RG9jX1NUUlZBUihtYWtlZmlsZV9kb2MsCkBAIC0yMjk5LDc2ICsyMjk5LDc2IEBACiBzdGF0aWMgc3NpemVfdAogc29ja19yZWN2X2d1dHMoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBjaGFyKiBjYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MpCiB7Ci0gICAgICAgIHNzaXplX3Qgb3V0bGVuID0gLTE7Ci0gICAgICAgIGludCB0aW1lb3V0OworICAgIHNzaXplX3Qgb3V0bGVuID0gLTE7CisgICAgaW50IHRpbWVvdXQ7CiAjaWZkZWYgX19WTVMKLQlpbnQgcmVtYWluaW5nOwotCWNoYXIgKnJlYWRfYnVmOworICAgIGludCByZW1haW5pbmc7CisgICAgY2hhciAqcmVhZF9idWY7CiAjZW5kaWYKIAotCWlmICghSVNfU0VMRUNUQUJMRShzKSkgewotCQlzZWxlY3RfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKKyAgICAgICAgc2VsZWN0X2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKICNpZm5kZWYgX19WTVMKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKLQlpZiAoIXRpbWVvdXQpCi0JCW91dGxlbiA9IHJlY3Yocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncyk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAwKTsKKyAgICBpZiAoIXRpbWVvdXQpCisgICAgICAgIG91dGxlbiA9IHJlY3Yocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKG91dGxlbiA8IDApIHsKLQkJLyogTm90ZTogdGhlIGNhbGwgdG8gZXJyb3JoYW5kbGVyKCkgQUxXQVlTIGluZGlyZWN0bHkgcmV0dXJuZWQKLQkJICAgTlVMTCwgc28gaWdub3JlIGl0cyByZXR1cm4gdmFsdWUgKi8KLQkJcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAob3V0bGVuIDwgMCkgeworICAgICAgICAvKiBOb3RlOiB0aGUgY2FsbCB0byBlcnJvcmhhbmRsZXIoKSBBTFdBWVMgaW5kaXJlY3RseSByZXR1cm5lZAorICAgICAgICAgICBOVUxMLCBzbyBpZ25vcmUgaXRzIHJldHVybiB2YWx1ZSAqLworICAgICAgICBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICNlbHNlCi0JcmVhZF9idWYgPSBjYnVmOwotCXJlbWFpbmluZyA9IGxlbjsKLQl3aGlsZSAocmVtYWluaW5nICE9IDApIHsKLQkJdW5zaWduZWQgaW50IHNlZ21lbnQ7Ci0JCWludCBucmVhZCA9IC0xOworICAgIHJlYWRfYnVmID0gY2J1ZjsKKyAgICByZW1haW5pbmcgPSBsZW47CisgICAgd2hpbGUgKHJlbWFpbmluZyAhPSAwKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBzZWdtZW50OworICAgICAgICBpbnQgbnJlYWQgPSAtMTsKIAotCQlzZWdtZW50ID0gcmVtYWluaW5nIC9TRUdNRU5UX1NJWkU7Ci0JCWlmIChzZWdtZW50ICE9IDApIHsKLQkJCXNlZ21lbnQgPSBTRUdNRU5UX1NJWkU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZWdtZW50ID0gcmVtYWluaW5nOwotCQl9CisgICAgICAgIHNlZ21lbnQgPSByZW1haW5pbmcgL1NFR01FTlRfU0laRTsKKyAgICAgICAgaWYgKHNlZ21lbnQgIT0gMCkgeworICAgICAgICAgICAgc2VnbWVudCA9IFNFR01FTlRfU0laRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNlZ21lbnQgPSByZW1haW5pbmc7CisgICAgICAgIH0KIAotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCXRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7Ci0JCWlmICghdGltZW91dCkKLQkJCW5yZWFkID0gcmVjdihzLT5zb2NrX2ZkLCByZWFkX2J1Ziwgc2VnbWVudCwgZmxhZ3MpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7CisgICAgICAgIGlmICghdGltZW91dCkKKyAgICAgICAgICAgIG5yZWFkID0gcmVjdihzLT5zb2NrX2ZkLCByZWFkX2J1Ziwgc2VnbWVudCwgZmxhZ3MpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChucmVhZCA8IDApIHsKLQkJCXMtPmVycm9yaGFuZGxlcigpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmIChucmVhZCAhPSByZW1haW5pbmcpIHsKLQkJCXJlYWRfYnVmICs9IG5yZWFkOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5yZWFkIDwgMCkgeworICAgICAgICAgICAgcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5yZWFkICE9IHJlbWFpbmluZykgeworICAgICAgICAgICAgcmVhZF9idWYgKz0gbnJlYWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCXJlbWFpbmluZyAtPSBzZWdtZW50OwotCQlyZWFkX2J1ZiArPSBzZWdtZW50OwotCX0KLQlvdXRsZW4gPSByZWFkX2J1ZiAtIGNidWY7CisgICAgICAgIHJlbWFpbmluZyAtPSBzZWdtZW50OworICAgICAgICByZWFkX2J1ZiArPSBzZWdtZW50OworICAgIH0KKyAgICBvdXRsZW4gPSByZWFkX2J1ZiAtIGNidWY7CiAjZW5kaWYgLyogIV9fVk1TICovCiAKLQlyZXR1cm4gb3V0bGVuOworICAgIHJldHVybiBvdXRsZW47CiB9CiAKIApAQCAtMjM3Nyw0MSArMjM3Nyw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfcmVjdihQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZWN2bGVuLCBmbGFncyA9IDA7Ci0gICAgICAgIHNzaXplX3Qgb3V0bGVuOwotCVB5T2JqZWN0ICpidWY7CisgICAgaW50IHJlY3ZsZW4sIGZsYWdzID0gMDsKKyAgICBzc2l6ZV90IG91dGxlbjsKKyAgICBQeU9iamVjdCAqYnVmOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfGk6cmVjdiIsICZyZWN2bGVuLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8aTpyZWN2IiwgJnJlY3ZsZW4sICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlY3ZsZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3YiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChyZWN2bGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3YiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nLiAqLwotCWJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIHJlY3ZsZW4pOwotCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogQWxsb2NhdGUgYSBuZXcgc3RyaW5nLiAqLworICAgIGJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIHJlY3ZsZW4pOworICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBDYWxsIHRoZSBndXRzICovCi0Jb3V0bGVuID0gc29ja19yZWN2X2d1dHMocywgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIHJlY3ZsZW4sIGZsYWdzKTsKLQlpZiAob3V0bGVuIDwgMCkgewotCQkvKiBBbiBlcnJvciBvY2N1cnJlZCwgcmVsZWFzZSB0aGUgc3RyaW5nIGFuZCByZXR1cm4gYW4KLQkJICAgZXJyb3IuICovCi0JCVB5X0RFQ1JFRihidWYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG91dGxlbiAhPSByZWN2bGVuKSB7Ci0JCS8qIFdlIGRpZCBub3QgcmVhZCBhcyBtYW55IGJ5dGVzIGFzIHdlIGFudGljaXBhdGVkLCByZXNpemUgdGhlCi0JCSAgIHN0cmluZyBpZiBwb3NzaWJsZSBhbmQgYmUgc3VjY2VzZnVsLiAqLwotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLCBvdXRsZW4pIDwgMCkKLQkJCS8qIE9vcHN5LCBub3Qgc28gc3VjY2VzZnVsIGFmdGVyIGFsbC4gKi8KLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBDYWxsIHRoZSBndXRzICovCisgICAgb3V0bGVuID0gc29ja19yZWN2X2d1dHMocywgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksIHJlY3ZsZW4sIGZsYWdzKTsKKyAgICBpZiAob3V0bGVuIDwgMCkgeworICAgICAgICAvKiBBbiBlcnJvciBvY2N1cnJlZCwgcmVsZWFzZSB0aGUgc3RyaW5nIGFuZCByZXR1cm4gYW4KKyAgICAgICAgICAgZXJyb3IuICovCisgICAgICAgIFB5X0RFQ1JFRihidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG91dGxlbiAhPSByZWN2bGVuKSB7CisgICAgICAgIC8qIFdlIGRpZCBub3QgcmVhZCBhcyBtYW55IGJ5dGVzIGFzIHdlIGFudGljaXBhdGVkLCByZXNpemUgdGhlCisgICAgICAgICAgIHN0cmluZyBpZiBwb3NzaWJsZSBhbmQgYmUgc3VjY2VzZnVsLiAqLworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYnVmLCBvdXRsZW4pIDwgMCkKKyAgICAgICAgICAgIC8qIE9vcHN5LCBub3Qgc28gc3VjY2VzZnVsIGFmdGVyIGFsbC4gKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBidWY7CisgICAgcmV0dXJuIGJ1ZjsKIH0KIAogUHlEb2NfU1RSVkFSKHJlY3ZfZG9jLApAQCAtMjQyOCw0NiArMjQyOCw0NiBAQAogc3RhdGljIFB5T2JqZWN0Kgogc29ja19yZWN2X2ludG8oUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJidWZmZXIiLCAibmJ5dGVzIiwgImZsYWdzIiwgMH07CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJidWZmZXIiLCAibmJ5dGVzIiwgImZsYWdzIiwgMH07CiAKLQlpbnQgcmVjdmxlbiA9IDAsIGZsYWdzID0gMDsKLSAgICAgICAgc3NpemVfdCByZWFkbGVuOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmbGVuOworICAgIGludCByZWN2bGVuID0gMCwgZmxhZ3MgPSAwOworICAgIHNzaXplX3QgcmVhZGxlbjsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGJ1ZmxlbjsKIAotCS8qIEdldCB0aGUgYnVmZmVyJ3MgbWVtb3J5ICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIncjfGlpOnJlY3ZfaW50byIsIGt3bGlzdCwKLQkJCQkJICZidWYsICZidWZsZW4sICZyZWN2bGVuLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoYnVmICE9IDAgJiYgYnVmbGVuID4gMCk7CisgICAgLyogR2V0IHRoZSBidWZmZXIncyBtZW1vcnkgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAidyN8aWk6cmVjdl9pbnRvIiwga3dsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWYsICZidWZsZW4sICZyZWN2bGVuLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoYnVmICE9IDAgJiYgYnVmbGVuID4gMCk7CiAKLQlpZiAocmVjdmxlbiA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm5lZ2F0aXZlIGJ1ZmZlcnNpemUgaW4gcmVjdl9pbnRvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocmVjdmxlbiA9PSAwKSB7Ci0gICAgICAgICAgICAvKiBJZiBuYnl0ZXMgd2FzIG5vdCBzcGVjaWZpZWQsIHVzZSB0aGUgYnVmZmVyJ3MgbGVuZ3RoICovCi0gICAgICAgICAgICByZWN2bGVuID0gYnVmbGVuOwotCX0KKyAgICBpZiAocmVjdmxlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2X2ludG8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChyZWN2bGVuID09IDApIHsKKyAgICAgICAgLyogSWYgbmJ5dGVzIHdhcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGJ1ZmZlcidzIGxlbmd0aCAqLworICAgICAgICByZWN2bGVuID0gYnVmbGVuOworICAgIH0KIAotCS8qIENoZWNrIGlmIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoICovCi0JaWYgKGJ1ZmxlbiA8IHJlY3ZsZW4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImJ1ZmZlciB0b28gc21hbGwgZm9yIHJlcXVlc3RlZCBieXRlcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggKi8KKyAgICBpZiAoYnVmbGVuIDwgcmVjdmxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgdG9vIHNtYWxsIGZvciByZXF1ZXN0ZWQgYnl0ZXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2FsbCB0aGUgZ3V0cyAqLwotCXJlYWRsZW4gPSBzb2NrX3JlY3ZfZ3V0cyhzLCBidWYsIHJlY3ZsZW4sIGZsYWdzKTsKLQlpZiAocmVhZGxlbiA8IDApIHsKLQkJLyogUmV0dXJuIGFuIGVycm9yLiAqLwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2FsbCB0aGUgZ3V0cyAqLworICAgIHJlYWRsZW4gPSBzb2NrX3JlY3ZfZ3V0cyhzLCBidWYsIHJlY3ZsZW4sIGZsYWdzKTsKKyAgICBpZiAocmVhZGxlbiA8IDApIHsKKyAgICAgICAgLyogUmV0dXJuIGFuIGVycm9yLiAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBkbyBhbnl0aGluZwotCSAgIHNwZWNpYWwgaGVyZSBpbiB0aGUgY2FzZSB0aGF0IHJlYWRsZW4gPCByZWN2bGVuLiAqLwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZWFkbGVuKTsKKyAgICAvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBkbyBhbnl0aGluZworICAgICAgIHNwZWNpYWwgaGVyZSBpbiB0aGUgY2FzZSB0aGF0IHJlYWRsZW4gPCByZWN2bGVuLiAqLworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZWFkbGVuKTsKIH0KIAogUHlEb2NfU1RSVkFSKHJlY3ZfaW50b19kb2MsCkBAIC0yNDkzLDU2ICsyNDkzLDU2IEBACiAgKi8KIHN0YXRpYyBzc2l6ZV90CiBzb2NrX3JlY3Zmcm9tX2d1dHMoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBjaGFyKiBjYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MsCi0JCSAgIFB5T2JqZWN0KiogYWRkcikKKyAgICAgICAgICAgICAgICAgICBQeU9iamVjdCoqIGFkZHIpCiB7Ci0Jc29ja19hZGRyX3QgYWRkcmJ1ZjsKLQlpbnQgdGltZW91dDsKLQlzc2l6ZV90IG4gPSAtMTsKLQlzb2NrbGVuX3QgYWRkcmxlbjsKKyAgICBzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGludCB0aW1lb3V0OworICAgIHNzaXplX3QgbiA9IC0xOworICAgIHNvY2tsZW5fdCBhZGRybGVuOwogCi0JKmFkZHIgPSBOVUxMOworICAgICphZGRyID0gTlVMTDsKIAotCWlmICghZ2V0c29ja2FkZHJsZW4ocywgJmFkZHJsZW4pKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFnZXRzb2NrYWRkcmxlbihzLCAmYWRkcmxlbikpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghSVNfU0VMRUNUQUJMRShzKSkgewotCQlzZWxlY3RfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKKyAgICAgICAgc2VsZWN0X2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JbWVtc2V0KCZhZGRyYnVmLCAwLCBhZGRybGVuKTsKLQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDApOwotCWlmICghdGltZW91dCkgeworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBtZW1zZXQoJmFkZHJidWYsIDAsIGFkZHJsZW4pOworICAgIHRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMCk7CisgICAgaWYgKCF0aW1lb3V0KSB7CiAjaWZuZGVmIE1TX1dJTkRPV1MKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiAhZGVmaW5lZChQWUNDX0dDQykKLQkJbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MsCi0JCQkgICAgIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKKyAgICAgICAgbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBTQVMyU0EoJmFkZHJidWYpLCAmYWRkcmxlbik7CiAjZWxzZQotCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncywKLQkJCSAgICAgKHZvaWQgKikgJmFkZHJidWYsICZhZGRybGVuKTsKKyAgICAgICAgbiA9IHJlY3Zmcm9tKHMtPnNvY2tfZmQsIGNidWYsIGxlbiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAmYWRkcmJ1ZiwgJmFkZHJsZW4pOwogI2VuZGlmCiAjZWxzZQotCQluID0gcmVjdmZyb20ocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncywKLQkJCSAgICAgU0FTMlNBKCZhZGRyYnVmKSwgJmFkZHJsZW4pOworICAgICAgICBuID0gcmVjdmZyb20ocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKTsKICNlbmRpZgotCX0KLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHRpbWVvdXQgPT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAobiA8IDApIHsKLQkJcy0+ZXJyb3JoYW5kbGVyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodGltZW91dCA9PSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChuIDwgMCkgeworICAgICAgICBzLT5lcnJvcmhhbmRsZXIoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICghKCphZGRyID0gbWFrZXNvY2thZGRyKHMtPnNvY2tfZmQsIFNBUzJTQSgmYWRkcmJ1ZiksCi0JCQkJICAgYWRkcmxlbiwgcy0+c29ja19wcm90bykpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCEoKmFkZHIgPSBtYWtlc29ja2FkZHIocy0+c29ja19mZCwgU0FTMlNBKCZhZGRyYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRybGVuLCBzLT5zb2NrX3Byb3RvKSkpCisgICAgICAgIHJldHVybiAtMTsKIAotCXJldHVybiBuOworICAgIHJldHVybiBuOwogfQogCiAvKiBzLnJlY3Zmcm9tKG5ieXRlcyBbLGZsYWdzXSkgbWV0aG9kICovCkBAIC0yNTUwLDQ1ICsyNTUwLDQ1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19yZWN2ZnJvbShQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpidWYgPSBOVUxMOwotCVB5T2JqZWN0ICphZGRyID0gTlVMTDsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQlpbnQgcmVjdmxlbiwgZmxhZ3MgPSAwOwotICAgICAgICBzc2l6ZV90IG91dGxlbjsKKyAgICBQeU9iamVjdCAqYnVmID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYWRkciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJldCA9IE5VTEw7CisgICAgaW50IHJlY3ZsZW4sIGZsYWdzID0gMDsKKyAgICBzc2l6ZV90IG91dGxlbjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpOnJlY3Zmcm9tIiwgJnJlY3ZsZW4sICZmbGFncykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxpOnJlY3Zmcm9tIiwgJnJlY3ZsZW4sICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlY3ZsZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3Zmcm9tIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocmVjdmxlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgYnVmZmVyc2l6ZSBpbiByZWN2ZnJvbSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlidWYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAwLCByZWN2bGVuKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGJ1ZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopIDAsIHJlY3ZsZW4pOworICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlvdXRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksCi0JCQkJICAgIHJlY3ZsZW4sIGZsYWdzLCAmYWRkcik7Ci0JaWYgKG91dGxlbiA8IDApIHsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBvdXRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgUHlTdHJpbmdfQVNfU1RSSU5HKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3ZsZW4sIGZsYWdzLCAmYWRkcik7CisgICAgaWYgKG91dGxlbiA8IDApIHsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmIChvdXRsZW4gIT0gcmVjdmxlbikgewotCQkvKiBXZSBkaWQgbm90IHJlYWQgYXMgbWFueSBieXRlcyBhcyB3ZSBhbnRpY2lwYXRlZCwgcmVzaXplIHRoZQotCQkgICBzdHJpbmcgaWYgcG9zc2libGUgYW5kIGJlIHN1Y2Nlc2Z1bC4gKi8KLQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1Ziwgb3V0bGVuKSA8IDApCi0JCQkvKiBPb3BzeSwgbm90IHNvIHN1Y2Nlc2Z1bCBhZnRlciBhbGwuICovCi0JCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmIChvdXRsZW4gIT0gcmVjdmxlbikgeworICAgICAgICAvKiBXZSBkaWQgbm90IHJlYWQgYXMgbWFueSBieXRlcyBhcyB3ZSBhbnRpY2lwYXRlZCwgcmVzaXplIHRoZQorICAgICAgICAgICBzdHJpbmcgaWYgcG9zc2libGUgYW5kIGJlIHN1Y2Nlc2Z1bC4gKi8KKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmJ1Ziwgb3V0bGVuKSA8IDApCisgICAgICAgICAgICAvKiBPb3BzeSwgbm90IHNvIHN1Y2Nlc2Z1bCBhZnRlciBhbGwuICovCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JcmV0ID0gUHlUdXBsZV9QYWNrKDIsIGJ1ZiwgYWRkcik7CisgICAgcmV0ID0gUHlUdXBsZV9QYWNrKDIsIGJ1ZiwgYWRkcik7CiAKIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihidWYpOwotCVB5X1hERUNSRUYoYWRkcik7Ci0JcmV0dXJuIHJldDsKKyAgICBQeV9YREVDUkVGKGJ1Zik7CisgICAgUHlfWERFQ1JFRihhZGRyKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBQeURvY19TVFJWQVIocmVjdmZyb21fZG9jLApAQCAtMjYwMiw0MSArMjYwMiw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfcmVjdmZyb21faW50byhQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCoga3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJuYnl0ZXMiLCAiZmxhZ3MiLCAwfTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImJ1ZmZlciIsICJuYnl0ZXMiLCAiZmxhZ3MiLCAwfTsKIAotCWludCByZWN2bGVuID0gMCwgZmxhZ3MgPSAwOwotICAgICAgICBzc2l6ZV90IHJlYWRsZW47Ci0JY2hhciAqYnVmOwotCWludCBidWZsZW47CisgICAgaW50IHJlY3ZsZW4gPSAwLCBmbGFncyA9IDA7CisgICAgc3NpemVfdCByZWFkbGVuOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgYnVmbGVuOwogCi0JUHlPYmplY3QgKmFkZHIgPSBOVUxMOworICAgIFB5T2JqZWN0ICphZGRyID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ3I3xpaTpyZWN2ZnJvbV9pbnRvIiwKLQkJCQkJIGt3bGlzdCwgJmJ1ZiwgJmJ1ZmxlbiwKLQkJCQkJICZyZWN2bGVuLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoYnVmICE9IDAgJiYgYnVmbGVuID4gMCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIncjfGlpOnJlY3Zmcm9tX2ludG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmJ1ZiwgJmJ1ZmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdmxlbiwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KGJ1ZiAhPSAwICYmIGJ1ZmxlbiA+IDApOwogCi0JaWYgKHJlY3ZsZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3Zmcm9tX2ludG8iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChyZWN2bGVuID09IDApIHsKLSAgICAgICAgICAgIC8qIElmIG5ieXRlcyB3YXMgbm90IHNwZWNpZmllZCwgdXNlIHRoZSBidWZmZXIncyBsZW5ndGggKi8KLSAgICAgICAgICAgIHJlY3ZsZW4gPSBidWZsZW47Ci0JfQorICAgIGlmIChyZWN2bGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBidWZmZXJzaXplIGluIHJlY3Zmcm9tX2ludG8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChyZWN2bGVuID09IDApIHsKKyAgICAgICAgLyogSWYgbmJ5dGVzIHdhcyBub3Qgc3BlY2lmaWVkLCB1c2UgdGhlIGJ1ZmZlcidzIGxlbmd0aCAqLworICAgICAgICByZWN2bGVuID0gYnVmbGVuOworICAgIH0KIAotCXJlYWRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgYnVmLCByZWN2bGVuLCBmbGFncywgJmFkZHIpOwotCWlmIChyZWFkbGVuIDwgMCkgewotCQkvKiBSZXR1cm4gYW4gZXJyb3IgKi8KLQkJUHlfWERFQ1JFRihhZGRyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJlYWRsZW4gPSBzb2NrX3JlY3Zmcm9tX2d1dHMocywgYnVmLCByZWN2bGVuLCBmbGFncywgJmFkZHIpOworICAgIGlmIChyZWFkbGVuIDwgMCkgeworICAgICAgICAvKiBSZXR1cm4gYW4gZXJyb3IgKi8KKyAgICAgICAgUHlfWERFQ1JFRihhZGRyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBhbmQgdGhlIGFkZHJlc3MuICBOb3RlIHRoYXQgd2UgZG8KLQkgICBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBoZXJlIGluIHRoZSBjYXNlIHRoYXQgcmVhZGxlbiA8IHJlY3ZsZW4uICovCi0gCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsTiIsIHJlYWRsZW4sIGFkZHIpOworICAgIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYW5kIHRoZSBhZGRyZXNzLiAgTm90ZSB0aGF0IHdlIGRvCisgICAgICAgbm90IGRvIGFueXRoaW5nIHNwZWNpYWwgaGVyZSBpbiB0aGUgY2FzZSB0aGF0IHJlYWRsZW4gPCByZWN2bGVuLiAqLworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsTiIsIHJlYWRsZW4sIGFkZHIpOwogfQogCiBQeURvY19TVFJWQVIocmVjdmZyb21faW50b19kb2MsCkBAIC0yNjUwLDM5ICsyNjUwLDM5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19zZW5kKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqYnVmOwotCWludCBsZW4sIG4gPSAtMSwgZmxhZ3MgPSAwLCB0aW1lb3V0OwotCVB5X2J1ZmZlciBwYnVmOworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuLCBuID0gLTEsIGZsYWdzID0gMCwgdGltZW91dDsKKyAgICBQeV9idWZmZXIgcGJ1ZjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8aTpzZW5kIiwgJnBidWYsICZmbGFncykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8aTpzZW5kIiwgJnBidWYsICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFJU19TRUxFQ1RBQkxFKHMpKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCQlyZXR1cm4gc2VsZWN0X2Vycm9yKCk7Ci0JfQotCWJ1ZiA9IHBidWYuYnVmOwotCWxlbiA9IHBidWYubGVuOworICAgIGlmICghSVNfU0VMRUNUQUJMRShzKSkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgcmV0dXJuIHNlbGVjdF9lcnJvcigpOworICAgIH0KKyAgICBidWYgPSBwYnVmLmJ1ZjsKKyAgICBsZW4gPSBwYnVmLmxlbjsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDEpOwotCWlmICghdGltZW91dCkKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKKyAgICBpZiAoIXRpbWVvdXQpCiAjaWZkZWYgX19WTVMKLQkJbiA9IHNlbmRzZWdtZW50ZWQocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzKTsKKyAgICAgICAgbiA9IHNlbmRzZWdtZW50ZWQocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzKTsKICNlbHNlCi0JCW4gPSBzZW5kKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CisgICAgICAgIG4gPSBzZW5kKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CiAjZW5kaWYKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKIAotCWlmICh0aW1lb3V0ID09IDEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobiA8IDApCi0JCXJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbik7CisgICAgaWYgKHRpbWVvdXQgPT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyluKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNlbmRfZG9jLApAQCAtMjY5OCw0OCArMjY5OCw0OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfc2VuZGFsbChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmJ1ZjsKLQlpbnQgbGVuLCBuID0gLTEsIGZsYWdzID0gMCwgdGltZW91dDsKLQlQeV9idWZmZXIgcGJ1ZjsKKyAgICBjaGFyICpidWY7CisgICAgaW50IGxlbiwgbiA9IC0xLCBmbGFncyA9IDAsIHRpbWVvdXQ7CisgICAgUHlfYnVmZmVyIHBidWY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfGk6c2VuZGFsbCIsICZwYnVmLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlidWYgPSBwYnVmLmJ1ZjsKLQlsZW4gPSBwYnVmLmxlbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfGk6c2VuZGFsbCIsICZwYnVmLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWYgPSBwYnVmLmJ1ZjsKKyAgICBsZW4gPSBwYnVmLmxlbjsKIAotCWlmICghSVNfU0VMRUNUQUJMRShzKSkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQkJcmV0dXJuIHNlbGVjdF9lcnJvcigpOwotCX0KKyAgICBpZiAoIUlTX1NFTEVDVEFCTEUocykpIHsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgIHJldHVybiBzZWxlY3RfZXJyb3IoKTsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZG8gewotCQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDEpOwotCQluID0gLTE7Ci0JCWlmICh0aW1lb3V0KQotCQkJYnJlYWs7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGRvIHsKKyAgICAgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKKyAgICAgICAgbiA9IC0xOworICAgICAgICBpZiAodGltZW91dCkKKyAgICAgICAgICAgIGJyZWFrOwogI2lmZGVmIF9fVk1TCi0JCW4gPSBzZW5kc2VnbWVudGVkKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CisgICAgICAgIG4gPSBzZW5kc2VnbWVudGVkKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CiAjZWxzZQotCQluID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOworICAgICAgICBuID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOwogI2VuZGlmCi0JCWlmIChuIDwgMCkKLQkJCWJyZWFrOwotCQlidWYgKz0gbjsKLQkJbGVuIC09IG47Ci0JfSB3aGlsZSAobGVuID4gMCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ1ZiArPSBuOworICAgICAgICBsZW4gLT0gbjsKKyAgICB9IHdoaWxlIChsZW4gPiAwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwogCi0JaWYgKHRpbWVvdXQgPT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuIDwgMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIGlmICh0aW1lb3V0ID09IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZW5kYWxsX2RvYywKQEAgLTI3NTYsNDcgKzI3NTYsNDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NlbmR0byhQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOwotCVB5T2JqZWN0ICphZGRybzsKLQljaGFyICpidWY7Ci0JUHlfc3NpemVfdCBsZW47Ci0Jc29ja19hZGRyX3QgYWRkcmJ1ZjsKLQlpbnQgYWRkcmxlbiwgbiA9IC0xLCBmbGFncywgdGltZW91dDsKKyAgICBQeV9idWZmZXIgcGJ1ZjsKKyAgICBQeU9iamVjdCAqYWRkcm87CisgICAgY2hhciAqYnVmOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIHNvY2tfYWRkcl90IGFkZHJidWY7CisgICAgaW50IGFkZHJsZW4sIG4gPSAtMSwgZmxhZ3MsIHRpbWVvdXQ7CiAKLQlmbGFncyA9IDA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKk86c2VuZHRvIiwgJnBidWYsICZhZGRybykpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKmlPOnNlbmR0byIsCi0JCQkJICAgICAgJnBidWYsICZmbGFncywgJmFkZHJvKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlidWYgPSBwYnVmLmJ1ZjsKLQlsZW4gPSBwYnVmLmxlbjsKKyAgICBmbGFncyA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKk86c2VuZHRvIiwgJnBidWYsICZhZGRybykpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKmlPOnNlbmR0byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGJ1ZiwgJmZsYWdzLCAmYWRkcm8pKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGJ1ZiA9IHBidWYuYnVmOworICAgIGxlbiA9IHBidWYubGVuOwogCi0JaWYgKCFJU19TRUxFQ1RBQkxFKHMpKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCQlyZXR1cm4gc2VsZWN0X2Vycm9yKCk7Ci0JfQorICAgIGlmICghSVNfU0VMRUNUQUJMRShzKSkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgcmV0dXJuIHNlbGVjdF9lcnJvcigpOworICAgIH0KIAotCWlmICghZ2V0c29ja2FkZHJhcmcocywgYWRkcm8sIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKSkgewotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghZ2V0c29ja2FkZHJhcmcocywgYWRkcm8sIFNBUzJTQSgmYWRkcmJ1ZiksICZhZGRybGVuKSkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7Ci0JaWYgKCF0aW1lb3V0KQotCQluID0gc2VuZHRvKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncywgU0FTMlNBKCZhZGRyYnVmKSwgYWRkcmxlbik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKKyAgICBpZiAoIXRpbWVvdXQpCisgICAgICAgIG4gPSBzZW5kdG8ocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzLCBTQVMyU0EoJmFkZHJidWYpLCBhZGRybGVuKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JaWYgKHRpbWVvdXQgPT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChuIDwgMCkKLQkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZyluKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICBpZiAodGltZW91dCA9PSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKW4pOwogfQogCiBQeURvY19TVFJWQVIoc2VuZHRvX2RvYywKQEAgLTI4MTEsMTkgKzI4MTEsMTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrX3NodXRkb3duKFB5U29ja2V0U29ja09iamVjdCAqcywgUHlPYmplY3QgKmFyZykKIHsKLQlpbnQgaG93OwotCWludCByZXM7CisgICAgaW50IGhvdzsKKyAgICBpbnQgcmVzOwogCi0JaG93ID0gUHlJbnRfQXNMb25nKGFyZyk7Ci0JaWYgKGhvdyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzID0gc2h1dGRvd24ocy0+c29ja19mZCwgaG93KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGhvdyA9IFB5SW50X0FzTG9uZyhhcmcpOworICAgIGlmIChob3cgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlcyA9IHNodXRkb3duKHMtPnNvY2tfZmQsIGhvdyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNodXRkb3duX2RvYywKQEAgLTI4MzYsMTggKzI4MzYsMTggQEAKIHN0YXRpYyBQeU9iamVjdCoKIHNvY2tfaW9jdGwoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJnKQogewotCXVuc2lnbmVkIGxvbmcgY21kID0gU0lPX1JDVkFMTDsKLQl1bnNpZ25lZCBpbnQgb3B0aW9uID0gUkNWQUxMX09OOwotICAgICAgICBEV09SRCByZWN2OworICAgIHVuc2lnbmVkIGxvbmcgY21kID0gU0lPX1JDVkFMTDsKKyAgICB1bnNpZ25lZCBpbnQgb3B0aW9uID0gUkNWQUxMX09OOworICAgIERXT1JEIHJlY3Y7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJnLCAia0k6aW9jdGwiLCAmY21kLCAmb3B0aW9uKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgImtJOmlvY3RsIiwgJmNtZCwgJm9wdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFdTQUlvY3RsKHMtPnNvY2tfZmQsIGNtZCwgJm9wdGlvbiwgc2l6ZW9mKG9wdGlvbiksIAotCQkgICAgIE5VTEwsIDAsICZyZWN2LCBOVUxMLCBOVUxMKSA9PSBTT0NLRVRfRVJST1IpIHsKLQkJcmV0dXJuIHNldF9lcnJvcigpOwotCX0KLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcocmVjdik7CisgICAgaWYgKFdTQUlvY3RsKHMtPnNvY2tfZmQsIGNtZCwgJm9wdGlvbiwgc2l6ZW9mKG9wdGlvbiksCisgICAgICAgICAgICAgICAgIE5VTEwsIDAsICZyZWN2LCBOVUxMLCBOVUxMKSA9PSBTT0NLRVRfRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHNldF9lcnJvcigpOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcocmVjdik7CiB9CiBQeURvY19TVFJWQVIoc29ja19pb2N0bF9kb2MsCiAiaW9jdGwoY21kLCBvcHRpb24pIC0+IGxvbmdcblwKQEAgLTI4NjEsNjkgKzI4NjEsNjkgQEAKIC8qIExpc3Qgb2YgbWV0aG9kcyBmb3Igc29ja2V0IG9iamVjdHMgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIHNvY2tfbWV0aG9kc1tdID0gewotCXsiYWNjZXB0IiwJICAoUHlDRnVuY3Rpb24pc29ja19hY2NlcHQsIE1FVEhfTk9BUkdTLAotCQkJICBhY2NlcHRfZG9jfSwKLQl7ImJpbmQiLAkgIChQeUNGdW5jdGlvbilzb2NrX2JpbmQsIE1FVEhfTywKLQkJCSAgYmluZF9kb2N9LAotCXsiY2xvc2UiLAkgIChQeUNGdW5jdGlvbilzb2NrX2Nsb3NlLCBNRVRIX05PQVJHUywKLQkJCSAgY2xvc2VfZG9jfSwKLQl7ImNvbm5lY3QiLAkgIChQeUNGdW5jdGlvbilzb2NrX2Nvbm5lY3QsIE1FVEhfTywKLQkJCSAgY29ubmVjdF9kb2N9LAotCXsiY29ubmVjdF9leCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfY29ubmVjdF9leCwgTUVUSF9PLAotCQkJICBjb25uZWN0X2V4X2RvY30sCisgICAgeyJhY2NlcHQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2FjY2VwdCwgTUVUSF9OT0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0X2RvY30sCisgICAgeyJiaW5kIiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2JpbmQsIE1FVEhfTywKKyAgICAgICAgICAgICAgICAgICAgICBiaW5kX2RvY30sCisgICAgeyJjbG9zZSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2Nsb3NlLCBNRVRIX05PQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBjbG9zZV9kb2N9LAorICAgIHsiY29ubmVjdCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19jb25uZWN0LCBNRVRIX08sCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9kb2N9LAorICAgIHsiY29ubmVjdF9leCIsICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19jb25uZWN0X2V4LCBNRVRIX08sCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9leF9kb2N9LAogI2lmbmRlZiBOT19EVVAKLQl7ImR1cCIsCQkgIChQeUNGdW5jdGlvbilzb2NrX2R1cCwgTUVUSF9OT0FSR1MsCi0JCQkgIGR1cF9kb2N9LAorICAgIHsiZHVwIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19kdXAsIE1FVEhfTk9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgIGR1cF9kb2N9LAogI2VuZGlmCi0JeyJmaWxlbm8iLAkgIChQeUNGdW5jdGlvbilzb2NrX2ZpbGVubywgTUVUSF9OT0FSR1MsCi0JCQkgIGZpbGVub19kb2N9LAorICAgIHsiZmlsZW5vIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19maWxlbm8sIE1FVEhfTk9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGVub19kb2N9LAogI2lmZGVmIEhBVkVfR0VUUEVFUk5BTUUKLQl7ImdldHBlZXJuYW1lIiwJICAoUHlDRnVuY3Rpb24pc29ja19nZXRwZWVybmFtZSwKLQkJCSAgTUVUSF9OT0FSR1MsIGdldHBlZXJuYW1lX2RvY30sCisgICAgeyJnZXRwZWVybmFtZSIsICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2dldHBlZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTLCBnZXRwZWVybmFtZV9kb2N9LAogI2VuZGlmCi0JeyJnZXRzb2NrbmFtZSIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0c29ja25hbWUsCi0JCQkgIE1FVEhfTk9BUkdTLCBnZXRzb2NrbmFtZV9kb2N9LAotCXsiZ2V0c29ja29wdCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0c29ja29wdCwgTUVUSF9WQVJBUkdTLAotCQkJICBnZXRzb2Nrb3B0X2RvY30sCisgICAgeyJnZXRzb2NrbmFtZSIsICAgICAgIChQeUNGdW5jdGlvbilzb2NrX2dldHNvY2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIE1FVEhfTk9BUkdTLCBnZXRzb2NrbmFtZV9kb2N9LAorICAgIHsiZ2V0c29ja29wdCIsICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19nZXRzb2Nrb3B0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgZ2V0c29ja29wdF9kb2N9LAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykgJiYgZGVmaW5lZChTSU9fUkNWQUxMKQotCXsiaW9jdGwiLAkgIChQeUNGdW5jdGlvbilzb2NrX2lvY3RsLCBNRVRIX1ZBUkFSR1MsCi0JCQkgIHNvY2tfaW9jdGxfZG9jfSwKKyAgICB7ImlvY3RsIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfaW9jdGwsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBzb2NrX2lvY3RsX2RvY30sCiAjZW5kaWYKLQl7Imxpc3RlbiIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfbGlzdGVuLCBNRVRIX08sCi0JCQkgIGxpc3Rlbl9kb2N9LAorICAgIHsibGlzdGVuIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19saXN0ZW4sIE1FVEhfTywKKyAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5fZG9jfSwKICNpZm5kZWYgTk9fRFVQCi0JeyJtYWtlZmlsZSIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfbWFrZWZpbGUsIE1FVEhfVkFSQVJHUywKLQkJCSAgbWFrZWZpbGVfZG9jfSwKKyAgICB7Im1ha2VmaWxlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfbWFrZWZpbGUsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBtYWtlZmlsZV9kb2N9LAogI2VuZGlmCi0JeyJyZWN2IiwJICAoUHlDRnVuY3Rpb24pc29ja19yZWN2LCBNRVRIX1ZBUkFSR1MsCi0JCQkgIHJlY3ZfZG9jfSwKLQl7InJlY3ZfaW50byIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdl9pbnRvLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCQkJICByZWN2X2ludG9fZG9jfSwKLQl7InJlY3Zmcm9tIiwJICAoUHlDRnVuY3Rpb24pc29ja19yZWN2ZnJvbSwgTUVUSF9WQVJBUkdTLAotCQkJICByZWN2ZnJvbV9kb2N9LAotCXsicmVjdmZyb21faW50byIsICAoUHlDRnVuY3Rpb24pc29ja19yZWN2ZnJvbV9pbnRvLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCQkJICByZWN2ZnJvbV9pbnRvX2RvY30sCi0JeyJzZW5kIiwJICAoUHlDRnVuY3Rpb24pc29ja19zZW5kLCBNRVRIX1ZBUkFSR1MsCi0JCQkgIHNlbmRfZG9jfSwKLQl7InNlbmRhbGwiLAkgIChQeUNGdW5jdGlvbilzb2NrX3NlbmRhbGwsIE1FVEhfVkFSQVJHUywKLQkJCSAgc2VuZGFsbF9kb2N9LAotCXsic2VuZHRvIiwJICAoUHlDRnVuY3Rpb24pc29ja19zZW5kdG8sIE1FVEhfVkFSQVJHUywKLQkJCSAgc2VuZHRvX2RvY30sCi0JeyJzZXRibG9ja2luZyIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0YmxvY2tpbmcsIE1FVEhfTywKLQkJCSAgc2V0YmxvY2tpbmdfZG9jfSwKLQl7InNldHRpbWVvdXQiLCAgICAoUHlDRnVuY3Rpb24pc29ja19zZXR0aW1lb3V0LCBNRVRIX08sCi0JCQkgIHNldHRpbWVvdXRfZG9jfSwKLQl7ImdldHRpbWVvdXQiLCAgICAoUHlDRnVuY3Rpb24pc29ja19nZXR0aW1lb3V0LCBNRVRIX05PQVJHUywKLQkJCSAgZ2V0dGltZW91dF9kb2N9LAotCXsic2V0c29ja29wdCIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0c29ja29wdCwgTUVUSF9WQVJBUkdTLAotCQkJICBzZXRzb2Nrb3B0X2RvY30sCi0JeyJzaHV0ZG93biIsCSAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2h1dGRvd24sIE1FVEhfTywKLQkJCSAgc2h1dGRvd25fZG9jfSwKKyAgICB7InJlY3YiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdiwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIHJlY3ZfZG9jfSwKKyAgICB7InJlY3ZfaW50byIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfcmVjdl9pbnRvLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICAgICAgICAgICAgICAgICAgIHJlY3ZfaW50b19kb2N9LAorICAgIHsicmVjdmZyb20iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19yZWN2ZnJvbSwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgIHJlY3Zmcm9tX2RvY30sCisgICAgeyJyZWN2ZnJvbV9pbnRvIiwgIChQeUNGdW5jdGlvbilzb2NrX3JlY3Zmcm9tX2ludG8sIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgcmVjdmZyb21faW50b19kb2N9LAorICAgIHsic2VuZCIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19zZW5kLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgc2VuZF9kb2N9LAorICAgIHsic2VuZGFsbCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19zZW5kYWxsLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgc2VuZGFsbF9kb2N9LAorICAgIHsic2VuZHRvIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19zZW5kdG8sIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICBzZW5kdG9fZG9jfSwKKyAgICB7InNldGJsb2NraW5nIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfc2V0YmxvY2tpbmcsIE1FVEhfTywKKyAgICAgICAgICAgICAgICAgICAgICBzZXRibG9ja2luZ19kb2N9LAorICAgIHsic2V0dGltZW91dCIsICAgIChQeUNGdW5jdGlvbilzb2NrX3NldHRpbWVvdXQsIE1FVEhfTywKKyAgICAgICAgICAgICAgICAgICAgICBzZXR0aW1lb3V0X2RvY30sCisgICAgeyJnZXR0aW1lb3V0IiwgICAgKFB5Q0Z1bmN0aW9uKXNvY2tfZ2V0dGltZW91dCwgTUVUSF9OT0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgZ2V0dGltZW91dF9kb2N9LAorICAgIHsic2V0c29ja29wdCIsICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19zZXRzb2Nrb3B0LCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgc2V0c29ja29wdF9kb2N9LAorICAgIHsic2h1dGRvd24iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc29ja19zaHV0ZG93biwgTUVUSF9PLAorICAgICAgICAgICAgICAgICAgICAgIHNodXRkb3duX2RvY30sCiAjaWZkZWYgUklTQ09TCi0JeyJzbGVlcHRhc2t3IiwJICAoUHlDRnVuY3Rpb24pc29ja19zbGVlcHRhc2t3LCBNRVRIX08sCi0JIAkJICBzbGVlcHRhc2t3X2RvY30sCisgICAgeyJzbGVlcHRhc2t3IiwgICAgICAgIChQeUNGdW5jdGlvbilzb2NrX3NsZWVwdGFza3csIE1FVEhfTywKKyAgICAgICAgICAgICAgICAgICAgICBzbGVlcHRhc2t3X2RvY30sCiAjZW5kaWYKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBTb2NrT2JqZWN0IG1lbWJlcnMgKi8KQEAgLTI5NDEsMzQgKzI5NDEsMzQgQEAKIHN0YXRpYyB2b2lkCiBzb2NrX2RlYWxsb2MoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotCWlmIChzLT5zb2NrX2ZkICE9IC0xKQotCQkodm9pZCkgU09DS0VUQ0xPU0Uocy0+c29ja19mZCk7Ci0JUHlfVFlQRShzKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzKTsKKyAgICBpZiAocy0+c29ja19mZCAhPSAtMSkKKyAgICAgICAgKHZvaWQpIFNPQ0tFVENMT1NFKHMtPnNvY2tfZmQpOworICAgIFB5X1RZUEUocyktPnRwX2ZyZWUoKFB5T2JqZWN0ICopcyk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tfcmVwcihQeVNvY2tldFNvY2tPYmplY3QgKnMpCiB7Ci0JY2hhciBidWZbNTEyXTsKKyAgICBjaGFyIGJ1Zls1MTJdOwogI2lmIFNJWkVPRl9TT0NLRVRfVCA+IFNJWkVPRl9MT05HCi0JaWYgKHMtPnNvY2tfZmQgPiBMT05HX01BWCkgewotCQkvKiB0aGlzIGNhbiBvY2N1ciBvbiBXaW42NCwgYW5kIGFjdHVhbGx5IHRoZXJlIGlzIGEgc3BlY2lhbAotCQkgICB1Z2x5IHByaW50ZiBmb3JtYXR0ZXIgZm9yIGRlY2ltYWwgcG9pbnRlciBsZW5ndGggaW50ZWdlcgotCQkgICBwcmludGluZywgb25seSBib3RoZXIgaWYgbmVjZXNzYXJ5Ki8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJIm5vIHByaW50ZiBmb3JtYXR0ZXIgdG8gZGlzcGxheSAiCi0JCQkJInRoZSBzb2NrZXQgZGVzY3JpcHRvciBpbiBkZWNpbWFsIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAocy0+c29ja19mZCA+IExPTkdfTUFYKSB7CisgICAgICAgIC8qIHRoaXMgY2FuIG9jY3VyIG9uIFdpbjY0LCBhbmQgYWN0dWFsbHkgdGhlcmUgaXMgYSBzcGVjaWFsCisgICAgICAgICAgIHVnbHkgcHJpbnRmIGZvcm1hdHRlciBmb3IgZGVjaW1hbCBwb2ludGVyIGxlbmd0aCBpbnRlZ2VyCisgICAgICAgICAgIHByaW50aW5nLCBvbmx5IGJvdGhlciBpZiBuZWNlc3NhcnkqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJubyBwcmludGYgZm9ybWF0dGVyIHRvIGRpc3BsYXkgIgorICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBzb2NrZXQgZGVzY3JpcHRvciBpbiBkZWNpbWFsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgotCVB5T1Nfc25wcmludGYoCi0JCWJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSI8c29ja2V0IG9iamVjdCwgZmQ9JWxkLCBmYW1pbHk9JWQsIHR5cGU9JWQsIHByb3RvY29sPSVkPiIsCi0JCShsb25nKXMtPnNvY2tfZmQsIHMtPnNvY2tfZmFtaWx5LAotCQlzLT5zb2NrX3R5cGUsCi0JCXMtPnNvY2tfcHJvdG8pOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgUHlPU19zbnByaW50ZigKKyAgICAgICAgYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgIjxzb2NrZXQgb2JqZWN0LCBmZD0lbGQsIGZhbWlseT0lZCwgdHlwZT0lZCwgcHJvdG9jb2w9JWQ+IiwKKyAgICAgICAgKGxvbmcpcy0+c29ja19mZCwgcy0+c29ja19mYW1pbHksCisgICAgICAgIHMtPnNvY2tfdHlwZSwKKyAgICAgICAgcy0+c29ja19wcm90byk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogCkBAIC0yOTc3LDE1ICsyOTc3LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKm5ldzsKKyAgICBQeU9iamVjdCAqbmV3OwogCi0JbmV3ID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKG5ldyAhPSBOVUxMKSB7Ci0JCSgoUHlTb2NrZXRTb2NrT2JqZWN0ICopbmV3KS0+c29ja19mZCA9IC0xOwotCQkoKFB5U29ja2V0U29ja09iamVjdCAqKW5ldyktPnNvY2tfdGltZW91dCA9IC0xLjA7Ci0JCSgoUHlTb2NrZXRTb2NrT2JqZWN0ICopbmV3KS0+ZXJyb3JoYW5kbGVyID0gJnNldF9lcnJvcjsKLQl9Ci0JcmV0dXJuIG5ldzsKKyAgICBuZXcgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobmV3ICE9IE5VTEwpIHsKKyAgICAgICAgKChQeVNvY2tldFNvY2tPYmplY3QgKiluZXcpLT5zb2NrX2ZkID0gLTE7CisgICAgICAgICgoUHlTb2NrZXRTb2NrT2JqZWN0ICopbmV3KS0+c29ja190aW1lb3V0ID0gLTEuMDsKKyAgICAgICAgKChQeVNvY2tldFNvY2tPYmplY3QgKiluZXcpLT5lcnJvcmhhbmRsZXIgPSAmc2V0X2Vycm9yOworICAgIH0KKyAgICByZXR1cm4gbmV3OwogfQogCiAKQEAgLTI5OTUsMzIgKzI5OTUsMzIgQEAKIHN0YXRpYyBpbnQKIHNvY2tfaW5pdG9iaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5U29ja2V0U29ja09iamVjdCAqcyA9IChQeVNvY2tldFNvY2tPYmplY3QgKilzZWxmOwotCVNPQ0tFVF9UIGZkOwotCWludCBmYW1pbHkgPSBBRl9JTkVULCB0eXBlID0gU09DS19TVFJFQU0sIHByb3RvID0gMDsKLQlzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiZmFtaWx5IiwgInR5cGUiLCAicHJvdG8iLCAwfTsKKyAgICBQeVNvY2tldFNvY2tPYmplY3QgKnMgPSAoUHlTb2NrZXRTb2NrT2JqZWN0ICopc2VsZjsKKyAgICBTT0NLRVRfVCBmZDsKKyAgICBpbnQgZmFtaWx5ID0gQUZfSU5FVCwgdHlwZSA9IFNPQ0tfU1RSRUFNLCBwcm90byA9IDA7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImZhbWlseSIsICJ0eXBlIiwgInByb3RvIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLAotCQkJCQkgInxpaWk6c29ja2V0Iiwga2V5d29yZHMsCi0JCQkJCSAmZmFtaWx5LCAmdHlwZSwgJnByb3RvKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInxpaWk6c29ja2V0Iiwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhbWlseSwgJnR5cGUsICZwcm90bykpCisgICAgICAgIHJldHVybiAtMTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlmZCA9IHNvY2tldChmYW1pbHksIHR5cGUsIHByb3RvKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmZCA9IHNvY2tldChmYW1pbHksIHR5cGUsIHByb3RvKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCiAjaWZkZWYgTVNfV0lORE9XUwotCWlmIChmZCA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICBpZiAoZmQgPT0gSU5WQUxJRF9TT0NLRVQpCiAjZWxzZQotCWlmIChmZCA8IDApCisgICAgaWYgKGZkIDwgMCkKICNlbmRpZgotCXsKLQkJc2V0X2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaW5pdF9zb2Nrb2JqZWN0KHMsIGZkLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKKyAgICB7CisgICAgICAgIHNldF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGluaXRfc29ja29iamVjdChzLCBmZCwgZmFtaWx5LCB0eXBlLCBwcm90byk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAogfQogCkBAIC0zMDI4LDQ1ICszMDI4LDQ1IEBACiAvKiBUeXBlIG9iamVjdCBmb3Igc29ja2V0IG9iamVjdHMuICovCiAKIHN0YXRpYyBQeVR5cGVPYmplY3Qgc29ja190eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKQkvKiBNdXN0IGZpbGwgaW4gdHlwZSB2YWx1ZSBsYXRlciAqLwotCSJfc29ja2V0LnNvY2tldCIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeVNvY2tldFNvY2tPYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3Ipc29ja19kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylzb2NrX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCXNvY2tfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXNvY2tfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCXNvY2tfbWVtYmVybGlzdCwJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0Jc29ja19pbml0b2JqLAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCXNvY2tfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkgICAgICAgICAvKiBNdXN0IGZpbGwgaW4gdHlwZSB2YWx1ZSBsYXRlciAqLworICAgICJfc29ja2V0LnNvY2tldCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeVNvY2tldFNvY2tPYmplY3QpLCAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKXNvY2tfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpc29ja19yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIHNvY2tfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzb2NrX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBzb2NrX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICBzb2NrX2luaXRvYmosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgc29ja19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMzA3NiwxNSArMzA3NiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRob3N0bmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQljaGFyIGJ1ZlsxMDI0XTsKLQlpbnQgcmVzOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXMgPSBnZXRob3N0bmFtZShidWYsIChpbnQpIHNpemVvZiBidWYgLSAxKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gc2V0X2Vycm9yKCk7Ci0JYnVmW3NpemVvZiBidWYgLSAxXSA9ICdcMCc7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDI0XTsKKyAgICBpbnQgcmVzOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByZXMgPSBnZXRob3N0bmFtZShidWYsIChpbnQpIHNpemVvZiBidWYgLSAxKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gc2V0X2Vycm9yKCk7CisgICAgYnVmW3NpemVvZiBidWYgLSAxXSA9ICdcMCc7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldGhvc3RuYW1lX2RvYywKQEAgLTMwOTksMTQgKzMwOTksMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfZ2V0aG9zdGJ5bmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlzb2NrX2FkZHJfdCBhZGRyYnVmOworICAgIGNoYXIgKm5hbWU7CisgICAgc29ja19hZGRyX3QgYWRkcmJ1ZjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRob3N0YnluYW1lIiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc2V0aXBhZGRyKG5hbWUsIFNBUzJTQSgmYWRkcmJ1ZiksICBzaXplb2YoYWRkcmJ1ZiksIEFGX0lORVQpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG1ha2VpcGFkZHIoU0FTMlNBKCZhZGRyYnVmKSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRob3N0YnluYW1lIiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc2V0aXBhZGRyKG5hbWUsIFNBUzJTQSgmYWRkcmJ1ZiksICBzaXplb2YoYWRkcmJ1ZiksIEFGX0lORVQpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIG1ha2VpcGFkZHIoU0FTMlNBKCZhZGRyYnVmKSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0aG9zdGJ5bmFtZV9kb2MsCkBAIC0zMTIwLDEzMCArMzEyMCwxMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRob3N0X2NvbW1vbihzdHJ1Y3QgaG9zdGVudCAqaCwgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgYWxlbiwgaW50IGFmKQogewotCWNoYXIgKipwY2g7Ci0JUHlPYmplY3QgKnJ0bl90dXBsZSA9IChQeU9iamVjdCAqKU5VTEw7Ci0JUHlPYmplY3QgKm5hbWVfbGlzdCA9IChQeU9iamVjdCAqKU5VTEw7Ci0JUHlPYmplY3QgKmFkZHJfbGlzdCA9IChQeU9iamVjdCAqKU5VTEw7Ci0JUHlPYmplY3QgKnRtcDsKKyAgICBjaGFyICoqcGNoOworICAgIFB5T2JqZWN0ICpydG5fdHVwbGUgPSAoUHlPYmplY3QgKilOVUxMOworICAgIFB5T2JqZWN0ICpuYW1lX2xpc3QgPSAoUHlPYmplY3QgKilOVUxMOworICAgIFB5T2JqZWN0ICphZGRyX2xpc3QgPSAoUHlPYmplY3QgKilOVUxMOworICAgIFB5T2JqZWN0ICp0bXA7CiAKLQlpZiAoaCA9PSBOVUxMKSB7Ci0JCS8qIExldCdzIGdldCByZWFsIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuICovCisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICAvKiBMZXQncyBnZXQgcmVhbCBlcnJvciBtZXNzYWdlIHRvIHJldHVybiAqLwogI2lmbmRlZiBSSVNDT1MKLQkJc2V0X2hlcnJvcihoX2Vycm5vKTsKKyAgICAgICAgc2V0X2hlcnJvcihoX2Vycm5vKTsKICNlbHNlCi0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJob3N0IG5vdCBmb3VuZCIpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiaG9zdCBub3QgZm91bmQiKTsKICNlbmRpZgotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChoLT5oX2FkZHJ0eXBlICE9IGFmKSB7Ci0JCS8qIExldCdzIGdldCByZWFsIGVycm9yIG1lc3NhZ2UgdG8gcmV0dXJuICovCi0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkJKGNoYXIgKilzdHJlcnJvcihFQUZOT1NVUFBPUlQpKTsKKyAgICBpZiAoaC0+aF9hZGRydHlwZSAhPSBhZikgeworICAgICAgICAvKiBMZXQncyBnZXQgcmVhbCBlcnJvciBtZXNzYWdlIHRvIHJldHVybiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilzdHJlcnJvcihFQUZOT1NVUFBPUlQpKTsKIAotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXN3aXRjaCAoYWYpIHsKKyAgICBzd2l0Y2ggKGFmKSB7CiAKLQljYXNlIEFGX0lORVQ6Ci0JCWlmIChhbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYnJlYWs7CisgICAgY2FzZSBBRl9JTkVUOgorICAgICAgICBpZiAoYWxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGJyZWFrOwogCiAjaWZkZWYgRU5BQkxFX0lQVjYKLQljYXNlIEFGX0lORVQ2OgotCQlpZiAoYWxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSkKLQkJCXJldHVybiBOVUxMOwotCQlicmVhazsKKyAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICBpZiAoYWxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBicmVhazsKICNlbmRpZgogCi0JfQorICAgIH0KIAotCWlmICgobmFtZV9saXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKLQkJZ290byBlcnI7CisgICAgaWYgKChuYW1lX2xpc3QgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycjsKIAotCWlmICgoYWRkcl9saXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKLQkJZ290byBlcnI7CisgICAgaWYgKChhZGRyX2xpc3QgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycjsKIAotCS8qIFNGICMxNTExMzE3OiBoX2FsaWFzZXMgY2FuIGJlIE5VTEwgKi8KLQlpZiAoaC0+aF9hbGlhc2VzKSB7Ci0JCWZvciAocGNoID0gaC0+aF9hbGlhc2VzOyAqcGNoICE9IE5VTEw7IHBjaCsrKSB7Ci0JCQlpbnQgc3RhdHVzOwotCQkJdG1wID0gUHlTdHJpbmdfRnJvbVN0cmluZygqcGNoKTsKLQkJCWlmICh0bXAgPT0gTlVMTCkKLQkJCQlnb3RvIGVycjsKKyAgICAvKiBTRiAjMTUxMTMxNzogaF9hbGlhc2VzIGNhbiBiZSBOVUxMICovCisgICAgaWYgKGgtPmhfYWxpYXNlcykgeworICAgICAgICBmb3IgKHBjaCA9IGgtPmhfYWxpYXNlczsgKnBjaCAhPSBOVUxMOyBwY2grKykgeworICAgICAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgICAgIHRtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoKnBjaCk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnI7CiAKLQkJCXN0YXR1cyA9IFB5TGlzdF9BcHBlbmQobmFtZV9saXN0LCB0bXApOwotCQkJUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICBzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKG5hbWVfbGlzdCwgdG1wKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOwogCi0JCQlpZiAoc3RhdHVzKQotCQkJCWdvdG8gZXJyOwotCQl9Ci0JfQorICAgICAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgIH0KIAotCWZvciAocGNoID0gaC0+aF9hZGRyX2xpc3Q7ICpwY2ggIT0gTlVMTDsgcGNoKyspIHsKLQkJaW50IHN0YXR1czsKKyAgICBmb3IgKHBjaCA9IGgtPmhfYWRkcl9saXN0OyAqcGNoICE9IE5VTEw7IHBjaCsrKSB7CisgICAgICAgIGludCBzdGF0dXM7CiAKLQkJc3dpdGNoIChhZikgeworICAgICAgICBzd2l0Y2ggKGFmKSB7CiAKLQkJY2FzZSBBRl9JTkVUOgotCQkgICAgewotCQkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKLQkJCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7Ci0JCQlzaW4uc2luX2ZhbWlseSA9IGFmOworICAgICAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworICAgICAgICAgICAgbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKyAgICAgICAgICAgIHNpbi5zaW5fZmFtaWx5ID0gYWY7CiAjaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQkJCXNpbi5zaW5fbGVuID0gc2l6ZW9mKHNpbik7CisgICAgICAgICAgICBzaW4uc2luX2xlbiA9IHNpemVvZihzaW4pOwogI2VuZGlmCi0JCQltZW1jcHkoJnNpbi5zaW5fYWRkciwgKnBjaCwgc2l6ZW9mKHNpbi5zaW5fYWRkcikpOwotCQkJdG1wID0gbWFrZWlwYWRkcigoc3RydWN0IHNvY2thZGRyICopJnNpbiwgc2l6ZW9mKHNpbikpOworICAgICAgICAgICAgbWVtY3B5KCZzaW4uc2luX2FkZHIsICpwY2gsIHNpemVvZihzaW4uc2luX2FkZHIpKTsKKyAgICAgICAgICAgIHRtcCA9IG1ha2VpcGFkZHIoKHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKTsKIAotCQkJaWYgKHBjaCA9PSBoLT5oX2FkZHJfbGlzdCAmJiBhbGVuID49IHNpemVvZihzaW4pKQotCQkJCW1lbWNweSgoY2hhciAqKSBhZGRyLCAmc2luLCBzaXplb2Yoc2luKSk7Ci0JCQlicmVhazsKLQkJICAgIH0KKyAgICAgICAgICAgIGlmIChwY2ggPT0gaC0+aF9hZGRyX2xpc3QgJiYgYWxlbiA+PSBzaXplb2Yoc2luKSkKKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgYWRkciwgJnNpbiwgc2l6ZW9mKHNpbikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKICNpZmRlZiBFTkFCTEVfSVBWNgotCQljYXNlIEFGX0lORVQ2OgotCQkgICAgewotCQkJc3RydWN0IHNvY2thZGRyX2luNiBzaW42OwotCQkJbWVtc2V0KCZzaW42LCAwLCBzaXplb2Yoc2luNikpOwotCQkJc2luNi5zaW42X2ZhbWlseSA9IGFmOworICAgICAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBzaW42OworICAgICAgICAgICAgbWVtc2V0KCZzaW42LCAwLCBzaXplb2Yoc2luNikpOworICAgICAgICAgICAgc2luNi5zaW42X2ZhbWlseSA9IGFmOwogI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCi0JCQlzaW42LnNpbjZfbGVuID0gc2l6ZW9mKHNpbjYpOworICAgICAgICAgICAgc2luNi5zaW42X2xlbiA9IHNpemVvZihzaW42KTsKICNlbmRpZgotCQkJbWVtY3B5KCZzaW42LnNpbjZfYWRkciwgKnBjaCwgc2l6ZW9mKHNpbjYuc2luNl9hZGRyKSk7Ci0JCQl0bXAgPSBtYWtlaXBhZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luNiwKLQkJCQlzaXplb2Yoc2luNikpOworICAgICAgICAgICAgbWVtY3B5KCZzaW42LnNpbjZfYWRkciwgKnBjaCwgc2l6ZW9mKHNpbjYuc2luNl9hZGRyKSk7CisgICAgICAgICAgICB0bXAgPSBtYWtlaXBhZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luNiwKKyAgICAgICAgICAgICAgICBzaXplb2Yoc2luNikpOwogCi0JCQlpZiAocGNoID09IGgtPmhfYWRkcl9saXN0ICYmIGFsZW4gPj0gc2l6ZW9mKHNpbjYpKQotCQkJCW1lbWNweSgoY2hhciAqKSBhZGRyLCAmc2luNiwgc2l6ZW9mKHNpbjYpKTsKLQkJCWJyZWFrOwotCQkgICAgfQorICAgICAgICAgICAgaWYgKHBjaCA9PSBoLT5oX2FkZHJfbGlzdCAmJiBhbGVuID49IHNpemVvZihzaW42KSkKKyAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgYWRkciwgJnNpbjYsIHNpemVvZihzaW42KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICNlbmRpZgogCi0JCWRlZmF1bHQ6CS8qIGNhbid0IGhhcHBlbiAqLwotCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkJInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiBjYW4ndCBoYXBwZW4gKi8KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKIAotCQlzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKGFkZHJfbGlzdCwgdG1wKTsKLQkJUHlfREVDUkVGKHRtcCk7CisgICAgICAgIHN0YXR1cyA9IFB5TGlzdF9BcHBlbmQoYWRkcl9saXN0LCB0bXApOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKIAotCQlpZiAoc3RhdHVzKQotCQkJZ290byBlcnI7Ci0JfQorICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgfQogCi0JcnRuX3R1cGxlID0gUHlfQnVpbGRWYWx1ZSgic09PIiwgaC0+aF9uYW1lLCBuYW1lX2xpc3QsIGFkZHJfbGlzdCk7CisgICAgcnRuX3R1cGxlID0gUHlfQnVpbGRWYWx1ZSgic09PIiwgaC0+aF9uYW1lLCBuYW1lX2xpc3QsIGFkZHJfbGlzdCk7CiAKICBlcnI6Ci0JUHlfWERFQ1JFRihuYW1lX2xpc3QpOwotCVB5X1hERUNSRUYoYWRkcl9saXN0KTsKLQlyZXR1cm4gcnRuX3R1cGxlOworICAgIFB5X1hERUNSRUYobmFtZV9saXN0KTsKKyAgICBQeV9YREVDUkVGKGFkZHJfbGlzdCk7CisgICAgcmV0dXJuIHJ0bl90dXBsZTsKIH0KIAogCkBAIC0zMjUzLDYzICszMjUzLDYzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2dldGhvc3RieW5hbWVfZXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0Jc3RydWN0IGhvc3RlbnQgKmg7CisgICAgY2hhciAqbmFtZTsKKyAgICBzdHJ1Y3QgaG9zdGVudCAqaDsKICNpZmRlZiBFTkFCTEVfSVBWNgotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CiAjZWxzZQotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKICNlbmRpZgotCXN0cnVjdCBzb2NrYWRkciAqc2E7Ci0JUHlPYmplY3QgKnJldDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhOworICAgIFB5T2JqZWN0ICpyZXQ7CiAjaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1IKLQlzdHJ1Y3QgaG9zdGVudCBocF9hbGxvY2F0ZWQ7CisgICAgc3RydWN0IGhvc3RlbnQgaHBfYWxsb2NhdGVkOwogI2lmZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHCi0Jc3RydWN0IGhvc3RlbnRfZGF0YSBkYXRhOworICAgIHN0cnVjdCBob3N0ZW50X2RhdGEgZGF0YTsKICNlbHNlCi0JY2hhciBidWZbMTYzODRdOwotCWludCBidWZfbGVuID0gKHNpemVvZiBidWYpIC0gMTsKLQlpbnQgZXJybm9wOworICAgIGNoYXIgYnVmWzE2Mzg0XTsKKyAgICBpbnQgYnVmX2xlbiA9IChzaXplb2YgYnVmKSAtIDE7CisgICAgaW50IGVycm5vcDsKICNlbmRpZgogI2lmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcpIHx8IGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkcpCi0JaW50IHJlc3VsdDsKKyAgICBpbnQgcmVzdWx0OwogI2VuZGlmCiAjZW5kaWYgLyogSEFWRV9HRVRIT1NUQllOQU1FX1IgKi8KIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRob3N0YnluYW1lX2V4IiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc2V0aXBhZGRyKG5hbWUsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpLCBBRl9JTkVUKSA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0aG9zdGJ5bmFtZV9leCIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNldGlwYWRkcihuYW1lLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSwgQUZfSU5FVCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1IKICNpZiAgIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkcpCi0JcmVzdWx0ID0gZ2V0aG9zdGJ5bmFtZV9yKG5hbWUsICZocF9hbGxvY2F0ZWQsIGJ1ZiwgYnVmX2xlbiwKLQkJCQkgJmgsICZlcnJub3ApOworICAgIHJlc3VsdCA9IGdldGhvc3RieW5hbWVfcihuYW1lLCAmaHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLCAmZXJybm9wKTsKICNlbGlmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9BUkcpCi0JaCA9IGdldGhvc3RieW5hbWVfcihuYW1lLCAmaHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sICZlcnJub3ApOworICAgIGggPSBnZXRob3N0YnluYW1lX3IobmFtZSwgJmhwX2FsbG9jYXRlZCwgYnVmLCBidWZfbGVuLCAmZXJybm9wKTsKICNlbHNlIC8qIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHICovCi0JbWVtc2V0KCh2b2lkICopICZkYXRhLCAnXDAnLCBzaXplb2YoZGF0YSkpOwotCXJlc3VsdCA9IGdldGhvc3RieW5hbWVfcihuYW1lLCAmaHBfYWxsb2NhdGVkLCAmZGF0YSk7Ci0JaCA9IChyZXN1bHQgIT0gMCkgPyBOVUxMIDogJmhwX2FsbG9jYXRlZDsKKyAgICBtZW1zZXQoKHZvaWQgKikgJmRhdGEsICdcMCcsIHNpemVvZihkYXRhKSk7CisgICAgcmVzdWx0ID0gZ2V0aG9zdGJ5bmFtZV9yKG5hbWUsICZocF9hbGxvY2F0ZWQsICZkYXRhKTsKKyAgICBoID0gKHJlc3VsdCAhPSAwKSA/IE5VTEwgOiAmaHBfYWxsb2NhdGVkOwogI2VuZGlmCiAjZWxzZSAvKiBub3QgSEFWRV9HRVRIT1NUQllOQU1FX1IgKi8KICNpZmRlZiBVU0VfR0VUSE9TVEJZTkFNRV9MT0NLCi0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKG5ldGRiX2xvY2ssIDEpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhuZXRkYl9sb2NrLCAxKTsKICNlbmRpZgotCWggPSBnZXRob3N0YnluYW1lKG5hbWUpOworICAgIGggPSBnZXRob3N0YnluYW1lKG5hbWUpOwogI2VuZGlmIC8qIEhBVkVfR0VUSE9TVEJZTkFNRV9SICovCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkvKiBTb21lIEMgbGlicmFyaWVzIHdvdWxkIHJlcXVpcmUgYWRkci5fX3NzX2ZhbWlseSBpbnN0ZWFkIG9mCi0JICAgYWRkci5zc19mYW1pbHkuCi0JICAgVGhlcmVmb3JlLCB3ZSBjYXN0IHRoZSBzb2NrYWRkcl9zdG9yYWdlIGludG8gc29ja2FkZHIgdG8KLQkgICBhY2Nlc3Mgc2FfZmFtaWx5LiAqLwotCXNhID0gKHN0cnVjdCBzb2NrYWRkciopJmFkZHI7Ci0JcmV0ID0gZ2V0aG9zdF9jb21tb24oaCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkciksCi0JCQkgICAgIHNhLT5zYV9mYW1pbHkpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgLyogU29tZSBDIGxpYnJhcmllcyB3b3VsZCByZXF1aXJlIGFkZHIuX19zc19mYW1pbHkgaW5zdGVhZCBvZgorICAgICAgIGFkZHIuc3NfZmFtaWx5LgorICAgICAgIFRoZXJlZm9yZSwgd2UgY2FzdCB0aGUgc29ja2FkZHJfc3RvcmFnZSBpbnRvIHNvY2thZGRyIHRvCisgICAgICAgYWNjZXNzIHNhX2ZhbWlseS4gKi8KKyAgICBzYSA9IChzdHJ1Y3Qgc29ja2FkZHIqKSZhZGRyOworICAgIHJldCA9IGdldGhvc3RfY29tbW9uKGgsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwgc2l6ZW9mKGFkZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhLT5zYV9mYW1pbHkpOwogI2lmZGVmIFVTRV9HRVRIT1NUQllOQU1FX0xPQ0sKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2sobmV0ZGJfbG9jayk7CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKG5ldGRiX2xvY2spOwogI2VuZGlmCi0JcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmV0OwogfQogCiBQeURvY19TVFJWQVIoZ2hibl9leF9kb2MsCkBAIC0zMzI2LDg0ICszMzI2LDg0IEBACiBzb2NrZXRfZ2V0aG9zdGJ5YWRkcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CiAjZWxzZQotCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOwogI2VuZGlmCi0Jc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjsKLQljaGFyICppcF9udW07Ci0Jc3RydWN0IGhvc3RlbnQgKmg7Ci0JUHlPYmplY3QgKnJldDsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyOworICAgIGNoYXIgKmlwX251bTsKKyAgICBzdHJ1Y3QgaG9zdGVudCAqaDsKKyAgICBQeU9iamVjdCAqcmV0OwogI2lmZGVmIEhBVkVfR0VUSE9TVEJZTkFNRV9SCi0Jc3RydWN0IGhvc3RlbnQgaHBfYWxsb2NhdGVkOworICAgIHN0cnVjdCBob3N0ZW50IGhwX2FsbG9jYXRlZDsKICNpZmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX0FSRwotCXN0cnVjdCBob3N0ZW50X2RhdGEgZGF0YTsKKyAgICBzdHJ1Y3QgaG9zdGVudF9kYXRhIGRhdGE7CiAjZWxzZQotCS8qIGdsaWJjcyB1cCB0byAyLjEwIGFzc3VtZSB0aGF0IHRoZSBidWYgYXJndW1lbnQgdG8KLQkgICBnZXRob3N0YnlhZGRyX3IgaXMgOC1ieXRlIGFsaWduZWQsIHdoaWNoIGF0IGxlYXN0IGxsdm0tZ2NjCi0JICAgZG9lcyBub3QgZW5zdXJlLiBUaGUgYXR0cmlidXRlIGJlbG93IGluc3RydWN0cyB0aGUgY29tcGlsZXIKLQkgICB0byBtYWludGFpbiB0aGlzIGFsaWdubWVudC4gKi8KLQljaGFyIGJ1ZlsxNjM4NF0gUHlfQUxJR05FRCg4KTsKLQlpbnQgYnVmX2xlbiA9IChzaXplb2YgYnVmKSAtIDE7Ci0JaW50IGVycm5vcDsKKyAgICAvKiBnbGliY3MgdXAgdG8gMi4xMCBhc3N1bWUgdGhhdCB0aGUgYnVmIGFyZ3VtZW50IHRvCisgICAgICAgZ2V0aG9zdGJ5YWRkcl9yIGlzIDgtYnl0ZSBhbGlnbmVkLCB3aGljaCBhdCBsZWFzdCBsbHZtLWdjYworICAgICAgIGRvZXMgbm90IGVuc3VyZS4gVGhlIGF0dHJpYnV0ZSBiZWxvdyBpbnN0cnVjdHMgdGhlIGNvbXBpbGVyCisgICAgICAgdG8gbWFpbnRhaW4gdGhpcyBhbGlnbm1lbnQuICovCisgICAgY2hhciBidWZbMTYzODRdIFB5X0FMSUdORUQoOCk7CisgICAgaW50IGJ1Zl9sZW4gPSAoc2l6ZW9mIGJ1ZikgLSAxOworICAgIGludCBlcnJub3A7CiAjZW5kaWYKICNpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHKSB8fCBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHKQotCWludCByZXN1bHQ7CisgICAgaW50IHJlc3VsdDsKICNlbmRpZgogI2VuZGlmIC8qIEhBVkVfR0VUSE9TVEJZTkFNRV9SICovCi0JY2hhciAqYXA7Ci0JaW50IGFsOwotCWludCBhZjsKKyAgICBjaGFyICphcDsKKyAgICBpbnQgYWw7CisgICAgaW50IGFmOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldGhvc3RieWFkZHIiLCAmaXBfbnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYWYgPSBBRl9VTlNQRUM7Ci0JaWYgKHNldGlwYWRkcihpcF9udW0sIHNhLCBzaXplb2YoYWRkciksIGFmKSA8IDApCi0JCXJldHVybiBOVUxMOwotCWFmID0gc2EtPnNhX2ZhbWlseTsKLQlhcCA9IE5VTEw7Ci0JYWwgPSAwOwotCXN3aXRjaCAoYWYpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCWFwID0gKGNoYXIgKikmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYSktPnNpbl9hZGRyOwotCQlhbCA9IHNpemVvZigoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhKS0+c2luX2FkZHIpOwotCQlicmVhazsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0aG9zdGJ5YWRkciIsICZpcF9udW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhZiA9IEFGX1VOU1BFQzsKKyAgICBpZiAoc2V0aXBhZGRyKGlwX251bSwgc2EsIHNpemVvZihhZGRyKSwgYWYpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYWYgPSBzYS0+c2FfZmFtaWx5OworICAgIGFwID0gTlVMTDsKKyAgICBhbCA9IDA7CisgICAgc3dpdGNoIChhZikgeworICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgYXAgPSAoY2hhciAqKSYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhKS0+c2luX2FkZHI7CisgICAgICAgIGFsID0gc2l6ZW9mKCgoc3RydWN0IHNvY2thZGRyX2luICopc2EpLT5zaW5fYWRkcik7CisgICAgICAgIGJyZWFrOwogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JY2FzZSBBRl9JTkVUNjoKLQkJYXAgPSAoY2hhciAqKSYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYSktPnNpbjZfYWRkcjsKLQkJYWwgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X2FkZHIpOwotCQlicmVhazsKKyAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICBhcCA9IChjaGFyICopJigoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhKS0+c2luNl9hZGRyOworICAgICAgICBhbCA9IHNpemVvZigoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYSktPnNpbjZfYWRkcik7CisgICAgICAgIGJyZWFrOwogI2VuZGlmCi0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAjaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FX1IKICNpZiAgIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkcpCi0JcmVzdWx0ID0gZ2V0aG9zdGJ5YWRkcl9yKGFwLCBhbCwgYWYsCi0JCSZocF9hbGxvY2F0ZWQsIGJ1ZiwgYnVmX2xlbiwKLQkJJmgsICZlcnJub3ApOworICAgIHJlc3VsdCA9IGdldGhvc3RieWFkZHJfcihhcCwgYWwsIGFmLAorICAgICAgICAmaHBfYWxsb2NhdGVkLCBidWYsIGJ1Zl9sZW4sCisgICAgICAgICZoLCAmZXJybm9wKTsKICNlbGlmIGRlZmluZWQoSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9BUkcpCi0JaCA9IGdldGhvc3RieWFkZHJfcihhcCwgYWwsIGFmLAotCQkJICAgICZocF9hbGxvY2F0ZWQsIGJ1ZiwgYnVmX2xlbiwgJmVycm5vcCk7CisgICAgaCA9IGdldGhvc3RieWFkZHJfcihhcCwgYWwsIGFmLAorICAgICAgICAgICAgICAgICAgICAgICAgJmhwX2FsbG9jYXRlZCwgYnVmLCBidWZfbGVuLCAmZXJybm9wKTsKICNlbHNlIC8qIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHICovCi0JbWVtc2V0KCh2b2lkICopICZkYXRhLCAnXDAnLCBzaXplb2YoZGF0YSkpOwotCXJlc3VsdCA9IGdldGhvc3RieWFkZHJfcihhcCwgYWwsIGFmLCAmaHBfYWxsb2NhdGVkLCAmZGF0YSk7Ci0JaCA9IChyZXN1bHQgIT0gMCkgPyBOVUxMIDogJmhwX2FsbG9jYXRlZDsKKyAgICBtZW1zZXQoKHZvaWQgKikgJmRhdGEsICdcMCcsIHNpemVvZihkYXRhKSk7CisgICAgcmVzdWx0ID0gZ2V0aG9zdGJ5YWRkcl9yKGFwLCBhbCwgYWYsICZocF9hbGxvY2F0ZWQsICZkYXRhKTsKKyAgICBoID0gKHJlc3VsdCAhPSAwKSA/IE5VTEwgOiAmaHBfYWxsb2NhdGVkOwogI2VuZGlmCiAjZWxzZSAvKiBub3QgSEFWRV9HRVRIT1NUQllOQU1FX1IgKi8KICNpZmRlZiBVU0VfR0VUSE9TVEJZTkFNRV9MT0NLCi0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKG5ldGRiX2xvY2ssIDEpOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhuZXRkYl9sb2NrLCAxKTsKICNlbmRpZgotCWggPSBnZXRob3N0YnlhZGRyKGFwLCBhbCwgYWYpOworICAgIGggPSBnZXRob3N0YnlhZGRyKGFwLCBhbCwgYWYpOwogI2VuZGlmIC8qIEhBVkVfR0VUSE9TVEJZTkFNRV9SICovCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXQgPSBnZXRob3N0X2NvbW1vbihoLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSwgYWYpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0ID0gZ2V0aG9zdF9jb21tb24oaCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkciksIGFmKTsKICNpZmRlZiBVU0VfR0VUSE9TVEJZTkFNRV9MT0NLCi0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKG5ldGRiX2xvY2spOworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhuZXRkYl9sb2NrKTsKICNlbmRpZgotCXJldHVybiByZXQ7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKGdldGhvc3RieWFkZHJfZG9jLApAQCAtMzQyMSwxOCArMzQyMSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRzZXJ2YnluYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lLCAqcHJvdG89TlVMTDsKLQlzdHJ1Y3Qgc2VydmVudCAqc3A7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHM6Z2V0c2VydmJ5bmFtZSIsICZuYW1lLCAmcHJvdG8pKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc3AgPSBnZXRzZXJ2YnluYW1lKG5hbWUsIHByb3RvKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChzcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJzZXJ2aWNlL3Byb3RvIG5vdCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBudG9ocyhzcC0+c19wb3J0KSk7CisgICAgY2hhciAqbmFtZSwgKnByb3RvPU5VTEw7CisgICAgc3RydWN0IHNlcnZlbnQgKnNwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzOmdldHNlcnZieW5hbWUiLCAmbmFtZSwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHNwID0gZ2V0c2VydmJ5bmFtZShuYW1lLCBwcm90byk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoc3AgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAic2VydmljZS9wcm90byBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgbnRvaHMoc3AtPnNfcG9ydCkpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0c2VydmJ5bmFtZV9kb2MsCkBAIC0zNDUxLDE5ICszNDUxLDE5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2dldHNlcnZieXBvcnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIHNob3J0IHBvcnQ7Ci0JY2hhciAqcHJvdG89TlVMTDsKLQlzdHJ1Y3Qgc2VydmVudCAqc3A7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJIfHM6Z2V0c2VydmJ5cG9ydCIsICZwb3J0LCAmcHJvdG8pKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc3AgPSBnZXRzZXJ2Ynlwb3J0KGh0b25zKHBvcnQpLCBwcm90byk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAoc3AgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAicG9ydC9wcm90byBub3QgZm91bmQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHNwLT5zX25hbWUpOworICAgIHVuc2lnbmVkIHNob3J0IHBvcnQ7CisgICAgY2hhciAqcHJvdG89TlVMTDsKKyAgICBzdHJ1Y3Qgc2VydmVudCAqc3A7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJIfHM6Z2V0c2VydmJ5cG9ydCIsICZwb3J0LCAmcHJvdG8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgc3AgPSBnZXRzZXJ2Ynlwb3J0KGh0b25zKHBvcnQpLCBwcm90byk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoc3AgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAicG9ydC9wcm90byBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHNwLT5zX25hbWUpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0c2VydmJ5cG9ydF9kb2MsCkBAIC0zNDgxLDIzICszNDgxLDIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2dldHByb3RvYnluYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCXN0cnVjdCBwcm90b2VudCAqc3A7CisgICAgY2hhciAqbmFtZTsKKyAgICBzdHJ1Y3QgcHJvdG9lbnQgKnNwOwogI2lmZGVmIF9fQkVPU19fCiAvKiBOb3QgYXZhaWxhYmxlIGluIEJlT1MgeWV0LiAtIFtjamhdICovCi0JUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgImdldHByb3RvYnluYW1lIG5vdCBzdXBwb3J0ZWQiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAiZ2V0cHJvdG9ieW5hbWUgbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBOVUxMOwogI2Vsc2UKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0cHJvdG9ieW5hbWUiLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlzcCA9IGdldHByb3RvYnluYW1lKG5hbWUpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHNwID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInByb3RvY29sIG5vdCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSBzcC0+cF9wcm90byk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldHByb3RvYnluYW1lIiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgc3AgPSBnZXRwcm90b2J5bmFtZShuYW1lKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChzcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsICJwcm90b2NvbCBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgc3AtPnBfcHJvdG8pOwogI2VuZGlmCiB9CiAKQEAgLTM1MTYsNDAgKzM1MTYsNDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfc29ja2V0cGFpcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlTb2NrZXRTb2NrT2JqZWN0ICpzMCA9IE5VTEwsICpzMSA9IE5VTEw7Ci0JU09DS0VUX1Qgc3ZbMl07Ci0JaW50IGZhbWlseSwgdHlwZSA9IFNPQ0tfU1RSRUFNLCBwcm90byA9IDA7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgUHlTb2NrZXRTb2NrT2JqZWN0ICpzMCA9IE5VTEwsICpzMSA9IE5VTEw7CisgICAgU09DS0VUX1Qgc3ZbMl07CisgICAgaW50IGZhbWlseSwgdHlwZSA9IFNPQ0tfU1RSRUFNLCBwcm90byA9IDA7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAKICNpZiBkZWZpbmVkKEFGX1VOSVgpCi0JZmFtaWx5ID0gQUZfVU5JWDsKKyAgICBmYW1pbHkgPSBBRl9VTklYOwogI2Vsc2UKLQlmYW1pbHkgPSBBRl9JTkVUOworICAgIGZhbWlseSA9IEFGX0lORVQ7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpaWk6c29ja2V0cGFpciIsCi0JCQkgICAgICAmZmFtaWx5LCAmdHlwZSwgJnByb3RvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogQ3JlYXRlIGEgcGFpciBvZiBzb2NrZXQgZmRzICovCi0JaWYgKHNvY2tldHBhaXIoZmFtaWx5LCB0eXBlLCBwcm90bywgc3YpIDwgMCkKLQkJcmV0dXJuIHNldF9lcnJvcigpOwotCXMwID0gbmV3X3NvY2tvYmplY3Qoc3ZbMF0sIGZhbWlseSwgdHlwZSwgcHJvdG8pOwotCWlmIChzMCA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7Ci0JczEgPSBuZXdfc29ja29iamVjdChzdlsxXSwgZmFtaWx5LCB0eXBlLCBwcm90byk7Ci0JaWYgKHMxID09IE5VTEwpCi0JCWdvdG8gZmluYWxseTsKLQlyZXMgPSBQeVR1cGxlX1BhY2soMiwgczAsIHMxKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpaWk6c29ja2V0cGFpciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmYW1pbHksICZ0eXBlLCAmcHJvdG8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBDcmVhdGUgYSBwYWlyIG9mIHNvY2tldCBmZHMgKi8KKyAgICBpZiAoc29ja2V0cGFpcihmYW1pbHksIHR5cGUsIHByb3RvLCBzdikgPCAwKQorICAgICAgICByZXR1cm4gc2V0X2Vycm9yKCk7CisgICAgczAgPSBuZXdfc29ja29iamVjdChzdlswXSwgZmFtaWx5LCB0eXBlLCBwcm90byk7CisgICAgaWYgKHMwID09IE5VTEwpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBzMSA9IG5ld19zb2Nrb2JqZWN0KHN2WzFdLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKKyAgICBpZiAoczEgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIHJlcyA9IFB5VHVwbGVfUGFjaygyLCBzMCwgczEpOwogCiBmaW5hbGx5OgotCWlmIChyZXMgPT0gTlVMTCkgewotCQlpZiAoczAgPT0gTlVMTCkKLQkJCVNPQ0tFVENMT1NFKHN2WzBdKTsKLQkJaWYgKHMxID09IE5VTEwpCi0JCQlTT0NLRVRDTE9TRShzdlsxXSk7Ci0JfQotCVB5X1hERUNSRUYoczApOwotCVB5X1hERUNSRUYoczEpOwotCXJldHVybiByZXM7CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChzMCA9PSBOVUxMKQorICAgICAgICAgICAgU09DS0VUQ0xPU0Uoc3ZbMF0pOworICAgICAgICBpZiAoczEgPT0gTlVMTCkKKyAgICAgICAgICAgIFNPQ0tFVENMT1NFKHN2WzFdKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihzMCk7CisgICAgUHlfWERFQ1JFRihzMSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKHNvY2tldHBhaXJfZG9jLApAQCAtMzU3MiwxOCArMzU3MiwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9mcm9tZmQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5U29ja2V0U29ja09iamVjdCAqczsKLQlTT0NLRVRfVCBmZDsKLQlpbnQgZmFtaWx5LCB0eXBlLCBwcm90byA9IDA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWl8aTpmcm9tZmQiLAotCQkJICAgICAgJmZkLCAmZmFtaWx5LCAmdHlwZSwgJnByb3RvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogRHVwIHRoZSBmZCBzbyBpdCBhbmQgdGhlIHNvY2tldCBjYW4gYmUgY2xvc2VkIGluZGVwZW5kZW50bHkgKi8KLQlmZCA9IGR1cChmZCk7Ci0JaWYgKGZkIDwgMCkKLQkJcmV0dXJuIHNldF9lcnJvcigpOwotCXMgPSBuZXdfc29ja29iamVjdChmZCwgZmFtaWx5LCB0eXBlLCBwcm90byk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBzOworICAgIFB5U29ja2V0U29ja09iamVjdCAqczsKKyAgICBTT0NLRVRfVCBmZDsKKyAgICBpbnQgZmFtaWx5LCB0eXBlLCBwcm90byA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWl8aTpmcm9tZmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmQsICZmYW1pbHksICZ0eXBlLCAmcHJvdG8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBEdXAgdGhlIGZkIHNvIGl0IGFuZCB0aGUgc29ja2V0IGNhbiBiZSBjbG9zZWQgaW5kZXBlbmRlbnRseSAqLworICAgIGZkID0gZHVwKGZkKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gc2V0X2Vycm9yKCk7CisgICAgcyA9IG5ld19zb2Nrb2JqZWN0KGZkLCBmYW1pbHksIHR5cGUsIHByb3RvKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHM7CiB9CiAKIFB5RG9jX1NUUlZBUihmcm9tZmRfZG9jLApAQCAtMzU5OSwxOCArMzU5OSwxOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9udG9ocyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHgxLCB4MjsKKyAgICBpbnQgeDEsIHgyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOm50b2hzIiwgJngxKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHgxIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIG51bWJlciB0byB1bnNpZ25lZCBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl4MiA9ICh1bnNpZ25lZCBpbnQpbnRvaHMoKHVuc2lnbmVkIHNob3J0KXgxKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeDIpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpudG9ocyIsICZ4MSkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh4MSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBudW1iZXIgdG8gdW5zaWduZWQgbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgeDIgPSAodW5zaWduZWQgaW50KW50b2hzKCh1bnNpZ25lZCBzaG9ydCl4MSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgyKTsKIH0KIAogUHlEb2NfU1RSVkFSKG50b2hzX2RvYywKQEAgLTM2MjIsNDEgKzM2MjIsNDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfbnRvaGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OworICAgIHVuc2lnbmVkIGxvbmcgeDsKIAotCWlmIChQeUludF9DaGVjayhhcmcpKSB7Ci0JCXggPSBQeUludF9BU19MT05HKGFyZyk7Ci0JCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICgobG9uZyl4IDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIG51bWJlciB0byB1bnNpZ25lZCBsb25nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkgewotCQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKGFyZyk7Ci0JCWlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5SW50X0NoZWNrKGFyZykpIHsKKyAgICAgICAgeCA9IFB5SW50X0FTX0xPTkcoYXJnKTsKKyAgICAgICAgaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKChsb25nKXggPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7CisgICAgICAgIHggPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcoYXJnKTsKKyAgICAgICAgaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNpZiBTSVpFT0ZfTE9ORyA+IDQKLQkJewotCQkJdW5zaWduZWQgbG9uZyB5OwotCQkJLyogb25seSB3YW50IHRoZSB0cmFpbGluZyAzMiBiaXRzICovCi0JCQl5ID0geCAmIDB4RkZGRkZGRkZVTDsKLQkJCWlmICh5IF4geCkKLQkJCQlyZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSAgICAibG9uZyBpbnQgbGFyZ2VyIHRoYW4gMzIgYml0cyIpOwotCQkJeCA9IHk7Ci0JCX0KKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB5OworICAgICAgICAgICAgLyogb25seSB3YW50IHRoZSB0cmFpbGluZyAzMiBiaXRzICovCisgICAgICAgICAgICB5ID0geCAmIDB4RkZGRkZGRkZVTDsKKyAgICAgICAgICAgIGlmICh5IF4geCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbmcgaW50IGxhcmdlciB0aGFuIDMyIGJpdHMiKTsKKyAgICAgICAgICAgIHggPSB5OworICAgICAgICB9CiAjZW5kaWYKLQl9Ci0JZWxzZQotCQlyZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgImV4cGVjdGVkIGludC9sb25nLCAlcyBmb3VuZCIsCi0JCQkJICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7Ci0JaWYgKHggPT0gKHVuc2lnbmVkIGxvbmcpIC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhudG9obCh4KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGludC9sb25nLCAlcyBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICBpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKG50b2hsKHgpKTsKIH0KIAogUHlEb2NfU1RSVkFSKG50b2hsX2RvYywKQEAgLTM2NjgsMTggKzM2NjgsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfaHRvbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4MSwgeDI7CisgICAgaW50IHgxLCB4MjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpodG9ucyIsICZ4MSkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh4MSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBudW1iZXIgdG8gdW5zaWduZWQgbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeDIgPSAodW5zaWduZWQgaW50KWh0b25zKCh1bnNpZ25lZCBzaG9ydCl4MSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgyKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6aHRvbnMiLCAmeDEpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoeDEgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHgyID0gKHVuc2lnbmVkIGludClodG9ucygodW5zaWduZWQgc2hvcnQpeDEpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh4Mik7CiB9CiAKIFB5RG9jX1NUUlZBUihodG9uc19kb2MsCkBAIC0zNjkxLDM5ICszNjkxLDM5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X2h0b25sKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCXVuc2lnbmVkIGxvbmcgeDsKKyAgICB1bnNpZ25lZCBsb25nIHg7CiAKLQlpZiAoUHlJbnRfQ2hlY2soYXJnKSkgewotCQl4ID0gUHlJbnRfQVNfTE9ORyhhcmcpOwotCQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoKGxvbmcpeCA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJICAiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBudW1iZXIgdG8gdW5zaWduZWQgbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKGFyZykpIHsKLQkJeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhhcmcpOwotCQlpZiAoeCA9PSAodW5zaWduZWQgbG9uZykgLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOworICAgIGlmIChQeUludF9DaGVjayhhcmcpKSB7CisgICAgICAgIHggPSBQeUludF9BU19MT05HKGFyZyk7CisgICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICgobG9uZyl4IDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIG51bWJlciB0byB1bnNpZ25lZCBsb25nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkgeworICAgICAgICB4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKGFyZyk7CisgICAgICAgIGlmICh4ID09ICh1bnNpZ25lZCBsb25nKSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWYgU0laRU9GX0xPTkcgPiA0Ci0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgeTsKLQkJCS8qIG9ubHkgd2FudCB0aGUgdHJhaWxpbmcgMzIgYml0cyAqLwotCQkJeSA9IHggJiAweEZGRkZGRkZGVUw7Ci0JCQlpZiAoeSBeIHgpCi0JCQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkgICAgImxvbmcgaW50IGxhcmdlciB0aGFuIDMyIGJpdHMiKTsKLQkJCXggPSB5OwotCQl9CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgeTsKKyAgICAgICAgICAgIC8qIG9ubHkgd2FudCB0aGUgdHJhaWxpbmcgMzIgYml0cyAqLworICAgICAgICAgICAgeSA9IHggJiAweEZGRkZGRkZGVUw7CisgICAgICAgICAgICBpZiAoeSBeIHgpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nIGludCBsYXJnZXIgdGhhbiAzMiBiaXRzIik7CisgICAgICAgICAgICB4ID0geTsKKyAgICAgICAgfQogI2VuZGlmCi0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICJleHBlY3RlZCBpbnQvbG9uZywgJXMgZm91bmQiLAotCQkJCSAgICBQeV9UWVBFKGFyZyktPnRwX25hbWUpOwotCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhodG9ubCgodW5zaWduZWQgbG9uZyl4KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGludC9sb25nLCAlcyBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoaHRvbmwoKHVuc2lnbmVkIGxvbmcpeCkpOwogfQogCiBQeURvY19TVFJWQVIoaHRvbmxfZG9jLApAQCAtMzc0NiwyMCArMzc0NiwyMCBAQAogI2RlZmluZSBJTkFERFJfTk9ORSAoLTEpCiAjZW5kaWYKICNpZmRlZiBIQVZFX0lORVRfQVRPTgotCXN0cnVjdCBpbl9hZGRyIGJ1ZjsKKyAgICBzdHJ1Y3QgaW5fYWRkciBidWY7CiAjZW5kaWYKIAogI2lmICFkZWZpbmVkKEhBVkVfSU5FVF9BVE9OKSB8fCBkZWZpbmVkKFVTRV9JTkVUX0FUT05fV0VBS0xJTkspCiAjaWYgKFNJWkVPRl9JTlQgIT0gNCkKICNlcnJvciAiTm90IHN1cmUgaWYgaW5fYWRkcl90IGV4aXN0cyBhbmQgaW50IGlzIG5vdCAzMi1iaXRzLiIKICNlbmRpZgotCS8qIEhhdmUgdG8gdXNlIGluZXRfYWRkcigpIGluc3RlYWQgKi8KLQl1bnNpZ25lZCBpbnQgcGFja2VkX2FkZHI7CisgICAgLyogSGF2ZSB0byB1c2UgaW5ldF9hZGRyKCkgaW5zdGVhZCAqLworICAgIHVuc2lnbmVkIGludCBwYWNrZWRfYWRkcjsKICNlbmRpZgotCWNoYXIgKmlwX2FkZHI7CisgICAgY2hhciAqaXBfYWRkcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbmV0X2F0b24iLCAmaXBfYWRkcikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbmV0X2F0b24iLCAmaXBfYWRkcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAKICNpZmRlZiBIQVZFX0lORVRfQVRPTgpAQCAtMzc2NywxMyArMzc2NywxMyBAQAogI2lmZGVmIFVTRV9JTkVUX0FUT05fV0VBS0xJTksKICAgICBpZiAoaW5ldF9hdG9uICE9IE5VTEwpIHsKICNlbmRpZgotCWlmIChpbmV0X2F0b24oaXBfYWRkciwgJmJ1ZikpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSgmYnVmKSwKLQkJCQkJCSAgc2l6ZW9mKGJ1ZikpOworICAgIGlmIChpbmV0X2F0b24oaXBfYWRkciwgJmJ1ZikpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSgmYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidWYpKTsKIAotCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkiaWxsZWdhbCBJUCBhZGRyZXNzIHN0cmluZyBwYXNzZWQgdG8gaW5ldF9hdG9uIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgSVAgYWRkcmVzcyBzdHJpbmcgcGFzc2VkIHRvIGluZXRfYXRvbiIpOworICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgVVNFX0lORVRfQVRPTl9XRUFLTElOSwogICAgfSBlbHNlIHsKQEAgLTM3ODMsMjIgKzM3ODMsMjIgQEAKIAogI2lmICFkZWZpbmVkKEhBVkVfSU5FVF9BVE9OKSB8fCBkZWZpbmVkKFVTRV9JTkVUX0FUT05fV0VBS0xJTkspCiAKLQkvKiBzcGVjaWFsLWNhc2UgdGhpcyBhZGRyZXNzIGFzIGluZXRfYWRkciBtaWdodCByZXR1cm4gSU5BRERSX05PTkUKLQkgKiBmb3IgdGhpcyAqLwotCWlmIChzdHJjbXAoaXBfYWRkciwgIjI1NS4yNTUuMjU1LjI1NSIpID09IDApIHsKLQkJcGFja2VkX2FkZHIgPSAweEZGRkZGRkZGOwotCX0gZWxzZSB7CisgICAgLyogc3BlY2lhbC1jYXNlIHRoaXMgYWRkcmVzcyBhcyBpbmV0X2FkZHIgbWlnaHQgcmV0dXJuIElOQUREUl9OT05FCisgICAgICogZm9yIHRoaXMgKi8KKyAgICBpZiAoc3RyY21wKGlwX2FkZHIsICIyNTUuMjU1LjI1NS4yNTUiKSA9PSAwKSB7CisgICAgICAgIHBhY2tlZF9hZGRyID0gMHhGRkZGRkZGRjsKKyAgICB9IGVsc2UgewogCi0JCXBhY2tlZF9hZGRyID0gaW5ldF9hZGRyKGlwX2FkZHIpOworICAgICAgICBwYWNrZWRfYWRkciA9IGluZXRfYWRkcihpcF9hZGRyKTsKIAotCQlpZiAocGFja2VkX2FkZHIgPT0gSU5BRERSX05PTkUpIHsJLyogaW52YWxpZCBhZGRyZXNzICovCi0JCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJCSJpbGxlZ2FsIElQIGFkZHJlc3Mgc3RyaW5nIHBhc3NlZCB0byBpbmV0X2F0b24iKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSAmcGFja2VkX2FkZHIsCi0JCQkJCSAgc2l6ZW9mKHBhY2tlZF9hZGRyKSk7CisgICAgICAgIGlmIChwYWNrZWRfYWRkciA9PSBJTkFERFJfTk9ORSkgeyAgICAgICAgICAgICAgIC8qIGludmFsaWQgYWRkcmVzcyAqLworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICAgICAiaWxsZWdhbCBJUCBhZGRyZXNzIHN0cmluZyBwYXNzZWQgdG8gaW5ldF9hdG9uIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikgJnBhY2tlZF9hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFja2VkX2FkZHIpKTsKIAogI2lmZGVmIFVTRV9JTkVUX0FUT05fV0VBS0xJTksKICAgIH0KQEAgLTM4MTUsMjMgKzM4MTUsMjMgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHNvY2tldF9pbmV0X250b2EoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhY2tlZF9zdHI7Ci0JaW50IGFkZHJfbGVuOwotCXN0cnVjdCBpbl9hZGRyIHBhY2tlZF9hZGRyOworICAgIGNoYXIgKnBhY2tlZF9zdHI7CisgICAgaW50IGFkZHJfbGVuOworICAgIHN0cnVjdCBpbl9hZGRyIHBhY2tlZF9hZGRyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzppbmV0X250b2EiLCAmcGFja2VkX3N0ciwgJmFkZHJfbGVuKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzppbmV0X250b2EiLCAmcGFja2VkX3N0ciwgJmFkZHJfbGVuKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoYWRkcl9sZW4gIT0gc2l6ZW9mKHBhY2tlZF9hZGRyKSkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJInBhY2tlZCBJUCB3cm9uZyBsZW5ndGggZm9yIGluZXRfbnRvYSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGFkZHJfbGVuICE9IHNpemVvZihwYWNrZWRfYWRkcikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICJwYWNrZWQgSVAgd3JvbmcgbGVuZ3RoIGZvciBpbmV0X250b2EiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbWVtY3B5KCZwYWNrZWRfYWRkciwgcGFja2VkX3N0ciwgYWRkcl9sZW4pOworICAgIG1lbWNweSgmcGFja2VkX2FkZHIsIHBhY2tlZF9zdHIsIGFkZHJfbGVuKTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGluZXRfbnRvYShwYWNrZWRfYWRkcikpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGluZXRfbnRvYShwYWNrZWRfYWRkcikpOwogfQogCiAjaWZkZWYgSEFWRV9JTkVUX1BUT04KQEAgLTM4NDUsNDYgKzM4NDUsNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfaW5ldF9wdG9uKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYWY7Ci0JY2hhciogaXA7Ci0JaW50IHJldHZhbDsKKyAgICBpbnQgYWY7CisgICAgY2hhciogaXA7CisgICAgaW50IHJldHZhbDsKICNpZmRlZiBFTkFCTEVfSVBWNgotCWNoYXIgcGFja2VkW01BWChzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSldOworICAgIGNoYXIgcGFja2VkW01BWChzaXplb2Yoc3RydWN0IGluX2FkZHIpLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSldOwogI2Vsc2UKLQljaGFyIHBhY2tlZFtzaXplb2Yoc3RydWN0IGluX2FkZHIpXTsKKyAgICBjaGFyIHBhY2tlZFtzaXplb2Yoc3RydWN0IGluX2FkZHIpXTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXM6aW5ldF9wdG9uIiwgJmFmLCAmaXApKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzOmluZXRfcHRvbiIsICZhZiwgJmlwKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICNpZiAhZGVmaW5lZChFTkFCTEVfSVBWNikgJiYgZGVmaW5lZChBRl9JTkVUNikKLQlpZihhZiA9PSBBRl9JTkVUNikgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJCSJjYW4ndCB1c2UgQUZfSU5FVDYsIElQdjYgaXMgZGlzYWJsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmKGFmID09IEFGX0lORVQ2KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgdXNlIEFGX0lORVQ2LCBJUHY2IGlzIGRpc2FibGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbmRpZgogCi0JcmV0dmFsID0gaW5ldF9wdG9uKGFmLCBpcCwgcGFja2VkKTsKLQlpZiAocmV0dmFsIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oc29ja2V0X2Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIGlmIChyZXR2YWwgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAotCQkJImlsbGVnYWwgSVAgYWRkcmVzcyBzdHJpbmcgcGFzc2VkIHRvIGluZXRfcHRvbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgaWYgKGFmID09IEFGX0lORVQpIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHBhY2tlZCwKLQkJCXNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworICAgIHJldHZhbCA9IGluZXRfcHRvbihhZiwgaXAsIHBhY2tlZCk7CisgICAgaWYgKHJldHZhbCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKHNvY2tldF9lcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKKyAgICAgICAgICAgICJpbGxlZ2FsIElQIGFkZHJlc3Mgc3RyaW5nIHBhc3NlZCB0byBpbmV0X3B0b24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIGlmIChhZiA9PSBBRl9JTkVUKSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwYWNrZWQsCisgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKICNpZmRlZiBFTkFCTEVfSVBWNgotCX0gZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYpIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHBhY2tlZCwKLQkJCXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKyAgICB9IGVsc2UgaWYgKGFmID09IEFGX0lORVQ2KSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwYWNrZWQsCisgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CiAjZW5kaWYKLQl9IGVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLCAidW5rbm93biBhZGRyZXNzIGZhbWlseSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgInVua25vd24gYWRkcmVzcyBmYW1pbHkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIoaW5ldF9udG9wX2RvYywKQEAgLTM4OTUsNTQgKzM4OTUsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfaW5ldF9udG9wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYWY7Ci0JY2hhciogcGFja2VkOwotCWludCBsZW47Ci0JY29uc3QgY2hhciogcmV0dmFsOworICAgIGludCBhZjsKKyAgICBjaGFyKiBwYWNrZWQ7CisgICAgaW50IGxlbjsKKyAgICBjb25zdCBjaGFyKiByZXR2YWw7CiAjaWZkZWYgRU5BQkxFX0lQVjYKLQljaGFyIGlwW01BWChJTkVUX0FERFJTVFJMRU4sIElORVQ2X0FERFJTVFJMRU4pICsgMV07CisgICAgY2hhciBpcFtNQVgoSU5FVF9BRERSU1RSTEVOLCBJTkVUNl9BRERSU1RSTEVOKSArIDFdOwogI2Vsc2UKLQljaGFyIGlwW0lORVRfQUREUlNUUkxFTiArIDFdOworICAgIGNoYXIgaXBbSU5FVF9BRERSU1RSTEVOICsgMV07CiAjZW5kaWYKIAotCS8qIEd1YXJhbnRlZSBOVUwtdGVybWluYXRpb24gZm9yIFB5U3RyaW5nX0Zyb21TdHJpbmcoKSBiZWxvdyAqLwotCW1lbXNldCgodm9pZCAqKSAmaXBbMF0sICdcMCcsIHNpemVvZihpcCkpOworICAgIC8qIEd1YXJhbnRlZSBOVUwtdGVybWluYXRpb24gZm9yIFB5U3RyaW5nX0Zyb21TdHJpbmcoKSBiZWxvdyAqLworICAgIG1lbXNldCgodm9pZCAqKSAmaXBbMF0sICdcMCcsIHNpemVvZihpcCkpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcyM6aW5ldF9udG9wIiwgJmFmLCAmcGFja2VkLCAmbGVuKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcyM6aW5ldF9udG9wIiwgJmFmLCAmcGFja2VkLCAmbGVuKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoYWYgPT0gQUZfSU5FVCkgewotCQlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJpbnZhbGlkIGxlbmd0aCBvZiBwYWNrZWQgSVAgYWRkcmVzcyBzdHJpbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgaWYgKGFmID09IEFGX0lORVQpIHsKKyAgICAgICAgaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBsZW5ndGggb2YgcGFja2VkIElQIGFkZHJlc3Mgc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2lmZGVmIEVOQUJMRV9JUFY2Ci0JfSBlbHNlIGlmIChhZiA9PSBBRl9JTkVUNikgewotCQlpZiAobGVuICE9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiaW52YWxpZCBsZW5ndGggb2YgcGFja2VkIElQIGFkZHJlc3Mgc3RyaW5nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIH0gZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgaWYgKGxlbiAhPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImludmFsaWQgbGVuZ3RoIG9mIHBhY2tlZCBJUCBhZGRyZXNzIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICNlbmRpZgotCX0gZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJInVua25vd24gYWRkcmVzcyBmYW1pbHkgJWQiLCBhZik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJ1bmtub3duIGFkZHJlc3MgZmFtaWx5ICVkIiwgYWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR2YWwgPSBpbmV0X250b3AoYWYsIHBhY2tlZCwgaXAsIHNpemVvZihpcCkpOwotCWlmICghcmV0dmFsKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhzb2NrZXRfZXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgewotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXR2YWwpOwotCX0KKyAgICByZXR2YWwgPSBpbmV0X250b3AoYWYsIHBhY2tlZCwgaXAsIHNpemVvZihpcCkpOworICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhzb2NrZXRfZXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXR2YWwpOworICAgIH0KIAotCS8qIE5PVFJFQUNIRUQgKi8KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiaW52YWxpZCBoYW5kbGluZyBvZiBpbmV0X250b3AiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAvKiBOT1RSRUFDSEVEICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImludmFsaWQgaGFuZGxpbmcgb2YgaW5ldF9udG9wIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKICNlbmRpZiAvKiBIQVZFX0lORVRfUFRPTiAqLwpAQCAtMzk1Myw5NSArMzk1Myw5NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRhZGRyaW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOwotCXN0cnVjdCBhZGRyaW5mbyAqcmVzMCA9IE5VTEw7Ci0JUHlPYmplY3QgKmhvYmogPSBOVUxMOwotCVB5T2JqZWN0ICpwb2JqID0gKFB5T2JqZWN0ICopTlVMTDsKLQljaGFyIHBidWZbMzBdOwotCWNoYXIgKmhwdHIsICpwcHRyOwotCWludCBmYW1pbHksIHNvY2t0eXBlLCBwcm90b2NvbCwgZmxhZ3M7Ci0JaW50IGVycm9yOwotCVB5T2JqZWN0ICphbGwgPSAoUHlPYmplY3QgKilOVUxMOwotCVB5T2JqZWN0ICpzaW5nbGUgPSAoUHlPYmplY3QgKilOVUxMOwotCVB5T2JqZWN0ICppZG5hID0gTlVMTDsKKyAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXM7CisgICAgc3RydWN0IGFkZHJpbmZvICpyZXMwID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaG9iaiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnBvYmogPSAoUHlPYmplY3QgKilOVUxMOworICAgIGNoYXIgcGJ1ZlszMF07CisgICAgY2hhciAqaHB0ciwgKnBwdHI7CisgICAgaW50IGZhbWlseSwgc29ja3R5cGUsIHByb3RvY29sLCBmbGFnczsKKyAgICBpbnQgZXJyb3I7CisgICAgUHlPYmplY3QgKmFsbCA9IChQeU9iamVjdCAqKU5VTEw7CisgICAgUHlPYmplY3QgKnNpbmdsZSA9IChQeU9iamVjdCAqKU5VTEw7CisgICAgUHlPYmplY3QgKmlkbmEgPSBOVUxMOwogCi0JZmFtaWx5ID0gc29ja3R5cGUgPSBwcm90b2NvbCA9IGZsYWdzID0gMDsKLQlmYW1pbHkgPSBBRl9VTlNQRUM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xpaWlpOmdldGFkZHJpbmZvIiwKLQkJCSAgICAgICZob2JqLCAmcG9iaiwgJmZhbWlseSwgJnNvY2t0eXBlLAotCQkJICAgICAgJnByb3RvY29sLCAmZmxhZ3MpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoaG9iaiA9PSBQeV9Ob25lKSB7Ci0JCWhwdHIgPSBOVUxMOwotCX0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGhvYmopKSB7Ci0JCWlkbmEgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGhvYmosICJlbmNvZGUiLCAicyIsICJpZG5hIik7Ci0JCWlmICghaWRuYSkKLQkJCXJldHVybiBOVUxMOwotCQlocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoaWRuYSk7Ci0JfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhob2JqKSkgewotCQlocHRyID0gUHlTdHJpbmdfQXNTdHJpbmcoaG9iaik7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZ2V0YWRkcmluZm8oKSBhcmd1bWVudCAxIG11c3QgYmUgc3RyaW5nIG9yIE5vbmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeUludF9DaGVjayhwb2JqKSkgewotCQlQeU9TX3NucHJpbnRmKHBidWYsIHNpemVvZihwYnVmKSwgIiVsZCIsIFB5SW50X0FzTG9uZyhwb2JqKSk7Ci0JCXBwdHIgPSBwYnVmOwotCX0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socG9iaikpIHsKLQkJcHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHBvYmopOwotCX0gZWxzZSBpZiAocG9iaiA9PSBQeV9Ob25lKSB7Ci0JCXBwdHIgPSAoY2hhciAqKU5VTEw7Ci0JfSBlbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgIkludCBvciBTdHJpbmcgZXhwZWN0ZWQiKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycjsKLQl9Ci0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfZmFtaWx5ID0gZmFtaWx5OwotCWhpbnRzLmFpX3NvY2t0eXBlID0gc29ja3R5cGU7Ci0JaGludHMuYWlfcHJvdG9jb2wgPSBwcm90b2NvbDsKLQloaW50cy5haV9mbGFncyA9IGZsYWdzOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlBQ1FVSVJFX0dFVEFERFJJTkZPX0xPQ0sKLQllcnJvciA9IGdldGFkZHJpbmZvKGhwdHIsIHBwdHIsICZoaW50cywgJnJlczApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUkVMRUFTRV9HRVRBRERSSU5GT19MT0NLICAvKiBzZWUgY29tbWVudCBpbiBzZXRpcGFkZHIoKSAqLwotCWlmIChlcnJvcikgewotCQlzZXRfZ2FpZXJyb3IoZXJyb3IpOwotCQlnb3RvIGVycjsKLQl9CisgICAgZmFtaWx5ID0gc29ja3R5cGUgPSBwcm90b2NvbCA9IGZsYWdzID0gMDsKKyAgICBmYW1pbHkgPSBBRl9VTlNQRUM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xpaWlpOmdldGFkZHJpbmZvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvYmosICZwb2JqLCAmZmFtaWx5LCAmc29ja3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90b2NvbCwgJmZsYWdzKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGhvYmogPT0gUHlfTm9uZSkgeworICAgICAgICBocHRyID0gTlVMTDsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhob2JqKSkgeworICAgICAgICBpZG5hID0gUHlPYmplY3RfQ2FsbE1ldGhvZChob2JqLCAiZW5jb2RlIiwgInMiLCAiaWRuYSIpOworICAgICAgICBpZiAoIWlkbmEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGlkbmEpOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soaG9iaikpIHsKKyAgICAgICAgaHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGhvYmopOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0YWRkcmluZm8oKSBhcmd1bWVudCAxIG11c3QgYmUgc3RyaW5nIG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUludF9DaGVjayhwb2JqKSkgeworICAgICAgICBQeU9TX3NucHJpbnRmKHBidWYsIHNpemVvZihwYnVmKSwgIiVsZCIsIFB5SW50X0FzTG9uZyhwb2JqKSk7CisgICAgICAgIHBwdHIgPSBwYnVmOworICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socG9iaikpIHsKKyAgICAgICAgcHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHBvYmopOworICAgIH0gZWxzZSBpZiAocG9iaiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHBwdHIgPSAoY2hhciAqKU5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwgIkludCBvciBTdHJpbmcgZXhwZWN0ZWQiKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICAgIGhpbnRzLmFpX2ZhbWlseSA9IGZhbWlseTsKKyAgICBoaW50cy5haV9zb2NrdHlwZSA9IHNvY2t0eXBlOworICAgIGhpbnRzLmFpX3Byb3RvY29sID0gcHJvdG9jb2w7CisgICAgaGludHMuYWlfZmxhZ3MgPSBmbGFnczsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgQUNRVUlSRV9HRVRBRERSSU5GT19MT0NLCisgICAgZXJyb3IgPSBnZXRhZGRyaW5mbyhocHRyLCBwcHRyLCAmaGludHMsICZyZXMwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFJFTEVBU0VfR0VUQUREUklORk9fTE9DSyAgLyogc2VlIGNvbW1lbnQgaW4gc2V0aXBhZGRyKCkgKi8KKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgc2V0X2dhaWVycm9yKGVycm9yKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQogCi0JaWYgKChhbGwgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQotCQlnb3RvIGVycjsKLQlmb3IgKHJlcyA9IHJlczA7IHJlczsgcmVzID0gcmVzLT5haV9uZXh0KSB7Ci0JCVB5T2JqZWN0ICphZGRyID0KLQkJCW1ha2Vzb2NrYWRkcigtMSwgcmVzLT5haV9hZGRyLCByZXMtPmFpX2FkZHJsZW4sIHByb3RvY29sKTsKLQkJaWYgKGFkZHIgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQlzaW5nbGUgPSBQeV9CdWlsZFZhbHVlKCJpaWlzTyIsIHJlcy0+YWlfZmFtaWx5LAotCQkJcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCwKLQkJCXJlcy0+YWlfY2Fub25uYW1lID8gcmVzLT5haV9jYW5vbm5hbWUgOiAiIiwKLQkJCWFkZHIpOwotCQlQeV9ERUNSRUYoYWRkcik7Ci0JCWlmIChzaW5nbGUgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOworICAgIGlmICgoYWxsID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnI7CisgICAgZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgeworICAgICAgICBQeU9iamVjdCAqYWRkciA9CisgICAgICAgICAgICBtYWtlc29ja2FkZHIoLTEsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuLCBwcm90b2NvbCk7CisgICAgICAgIGlmIChhZGRyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgc2luZ2xlID0gUHlfQnVpbGRWYWx1ZSgiaWlpc08iLCByZXMtPmFpX2ZhbWlseSwKKyAgICAgICAgICAgIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wsCisgICAgICAgICAgICByZXMtPmFpX2Nhbm9ubmFtZSA/IHJlcy0+YWlfY2Fub25uYW1lIDogIiIsCisgICAgICAgICAgICBhZGRyKTsKKyAgICAgICAgUHlfREVDUkVGKGFkZHIpOworICAgICAgICBpZiAoc2luZ2xlID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKIAotCQlpZiAoUHlMaXN0X0FwcGVuZChhbGwsIHNpbmdsZSkpCi0JCQlnb3RvIGVycjsKLQkJUHlfWERFQ1JFRihzaW5nbGUpOwotCX0KLQlQeV9YREVDUkVGKGlkbmEpOwotCWlmIChyZXMwKQotCQlmcmVlYWRkcmluZm8ocmVzMCk7Ci0JcmV0dXJuIGFsbDsKKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoYWxsLCBzaW5nbGUpKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIFB5X1hERUNSRUYoc2luZ2xlKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihpZG5hKTsKKyAgICBpZiAocmVzMCkKKyAgICAgICAgZnJlZWFkZHJpbmZvKHJlczApOworICAgIHJldHVybiBhbGw7CiAgZXJyOgotCVB5X1hERUNSRUYoc2luZ2xlKTsKLQlQeV9YREVDUkVGKGFsbCk7Ci0JUHlfWERFQ1JFRihpZG5hKTsKLQlpZiAocmVzMCkKLQkJZnJlZWFkZHJpbmZvKHJlczApOwotCXJldHVybiAoUHlPYmplY3QgKilOVUxMOworICAgIFB5X1hERUNSRUYoc2luZ2xlKTsKKyAgICBQeV9YREVDUkVGKGFsbCk7CisgICAgUHlfWERFQ1JFRihpZG5hKTsKKyAgICBpZiAocmVzMCkKKyAgICAgICAgZnJlZWFkZHJpbmZvKHJlczApOworICAgIHJldHVybiAoUHlPYmplY3QgKilOVUxMOwogfQogCiBQeURvY19TVFJWQVIoZ2V0YWRkcmluZm9fZG9jLApAQCAtNDA1Niw3NyArNDA1Niw3NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvY2tldF9nZXRuYW1laW5mbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNhID0gKFB5T2JqZWN0ICopTlVMTDsKLQlpbnQgZmxhZ3M7Ci0JY2hhciAqaG9zdHA7Ci0JaW50IHBvcnQsIGZsb3dpbmZvLCBzY29wZV9pZDsKLQljaGFyIGhidWZbTklfTUFYSE9TVF0sIHBidWZbTklfTUFYU0VSVl07Ci0Jc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzID0gTlVMTDsKLQlpbnQgZXJyb3I7Ci0JUHlPYmplY3QgKnJldCA9IChQeU9iamVjdCAqKU5VTEw7CisgICAgUHlPYmplY3QgKnNhID0gKFB5T2JqZWN0ICopTlVMTDsKKyAgICBpbnQgZmxhZ3M7CisgICAgY2hhciAqaG9zdHA7CisgICAgaW50IHBvcnQsIGZsb3dpbmZvLCBzY29wZV9pZDsKKyAgICBjaGFyIGhidWZbTklfTUFYSE9TVF0sIHBidWZbTklfTUFYU0VSVl07CisgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzID0gTlVMTDsKKyAgICBpbnQgZXJyb3I7CisgICAgUHlPYmplY3QgKnJldCA9IChQeU9iamVjdCAqKU5VTEw7CiAKLQlmbGFncyA9IGZsb3dpbmZvID0gc2NvcGVfaWQgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6Z2V0bmFtZWluZm8iLCAmc2EsICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlUdXBsZV9DaGVjayhzYSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZ2V0bmFtZWluZm8oKSBhcmd1bWVudCAxIG11c3QgYmUgYSB0dXBsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHNhLCAic2l8aWkiLAotCQkJICAgICAgJmhvc3RwLCAmcG9ydCwgJmZsb3dpbmZvLCAmc2NvcGVfaWQpKQotCQlyZXR1cm4gTlVMTDsKLQlQeU9TX3NucHJpbnRmKHBidWYsIHNpemVvZihwYnVmKSwgIiVkIiwgcG9ydCk7Ci0JbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0JaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOwotCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsJLyogbWFrZSBudW1lcmljIHBvcnQgaGFwcHkgKi8KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JQUNRVUlSRV9HRVRBRERSSU5GT19MT0NLCi0JZXJyb3IgPSBnZXRhZGRyaW5mbyhob3N0cCwgcGJ1ZiwgJmhpbnRzLCAmcmVzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVJFTEVBU0VfR0VUQUREUklORk9fTE9DSyAgLyogc2VlIGNvbW1lbnQgaW4gc2V0aXBhZGRyKCkgKi8KLQlpZiAoZXJyb3IpIHsKLQkJc2V0X2dhaWVycm9yKGVycm9yKTsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAocmVzLT5haV9uZXh0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCi0JCQkic29ja2FkZHIgcmVzb2x2ZWQgdG8gbXVsdGlwbGUgYWRkcmVzc2VzIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0Jc3dpdGNoIChyZXMtPmFpX2ZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkgICAgewotCQlpZiAoUHlUdXBsZV9HRVRfU0laRShzYSkgIT0gMikgewotCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF9lcnJvciwKLQkJCQkiSVB2NCBzb2NrYWRkciBtdXN0IGJlIDIgdHVwbGUiKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlicmVhazsKLQkgICAgfQorICAgIGZsYWdzID0gZmxvd2luZm8gPSBzY29wZV9pZCA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpnZXRuYW1laW5mbyIsICZzYSwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHNhKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImdldG5hbWVpbmZvKCkgYXJndW1lbnQgMSBtdXN0IGJlIGEgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShzYSwgInNpfGlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvc3RwLCAmcG9ydCwgJmZsb3dpbmZvLCAmc2NvcGVfaWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeU9TX3NucHJpbnRmKHBidWYsIHNpemVvZihwYnVmKSwgIiVkIiwgcG9ydCk7CisgICAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisgICAgaGludHMuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOworICAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsgICAgIC8qIG1ha2UgbnVtZXJpYyBwb3J0IGhhcHB5ICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIEFDUVVJUkVfR0VUQUREUklORk9fTE9DSworICAgIGVycm9yID0gZ2V0YWRkcmluZm8oaG9zdHAsIHBidWYsICZoaW50cywgJnJlcyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBSRUxFQVNFX0dFVEFERFJJTkZPX0xPQ0sgIC8qIHNlZSBjb21tZW50IGluIHNldGlwYWRkcigpICovCisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIHNldF9nYWllcnJvcihlcnJvcik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKHJlcy0+YWlfbmV4dCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoc29ja2V0X2Vycm9yLAorICAgICAgICAgICAgInNvY2thZGRyIHJlc29sdmVkIHRvIG11bHRpcGxlIGFkZHJlc3NlcyIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHN3aXRjaCAocmVzLT5haV9mYW1pbHkpIHsKKyAgICBjYXNlIEFGX0lORVQ6CisgICAgICAgIHsKKyAgICAgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoc2EpICE9IDIpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzb2NrZXRfZXJyb3IsCisgICAgICAgICAgICAgICAgIklQdjQgc29ja2FkZHIgbXVzdCBiZSAyIHR1cGxlIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNpZmRlZiBFTkFCTEVfSVBWNgotCWNhc2UgQUZfSU5FVDY6Ci0JICAgIHsKLQkJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKLQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopcmVzLT5haV9hZGRyOwotCQlzaW42LT5zaW42X2Zsb3dpbmZvID0gZmxvd2luZm87Ci0JCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBzY29wZV9pZDsKLQkJYnJlYWs7Ci0JICAgIH0KKyAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICB7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisgICAgICAgIHNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXJlcy0+YWlfYWRkcjsKKyAgICAgICAgc2luNi0+c2luNl9mbG93aW5mbyA9IGZsb3dpbmZvOworICAgICAgICBzaW42LT5zaW42X3Njb3BlX2lkID0gc2NvcGVfaWQ7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CiAjZW5kaWYKLQl9Ci0JZXJyb3IgPSBnZXRuYW1laW5mbyhyZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbiwKLQkJCWhidWYsIHNpemVvZihoYnVmKSwgcGJ1Ziwgc2l6ZW9mKHBidWYpLCBmbGFncyk7Ci0JaWYgKGVycm9yKSB7Ci0JCXNldF9nYWllcnJvcihlcnJvcik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JcmV0ID0gUHlfQnVpbGRWYWx1ZSgic3MiLCBoYnVmLCBwYnVmKTsKKyAgICB9CisgICAgZXJyb3IgPSBnZXRuYW1laW5mbyhyZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbiwKKyAgICAgICAgICAgICAgICAgICAgaGJ1Ziwgc2l6ZW9mKGhidWYpLCBwYnVmLCBzaXplb2YocGJ1ZiksIGZsYWdzKTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgc2V0X2dhaWVycm9yKGVycm9yKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJzcyIsIGhidWYsIHBidWYpOwogCiBmYWlsOgotCWlmIChyZXMpCi0JCWZyZWVhZGRyaW5mbyhyZXMpOwotCXJldHVybiByZXQ7CisgICAgaWYgKHJlcykKKyAgICAgICAgZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfU1RSVkFSKGdldG5hbWVpbmZvX2RvYywKQEAgLTQxNDAsMTIgKzQxNDAsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzb2NrZXRfZ2V0ZGVmYXVsdHRpbWVvdXQoUHlPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKGRlZmF1bHR0aW1lb3V0IDwgMC4wKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShkZWZhdWx0dGltZW91dCk7CisgICAgaWYgKGRlZmF1bHR0aW1lb3V0IDwgMC4wKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShkZWZhdWx0dGltZW91dCk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRkZWZhdWx0dGltZW91dF9kb2MsCkBAIC00MTU4LDI0ICs0MTU4LDI0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc29ja2V0X3NldGRlZmF1bHR0aW1lb3V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCWRvdWJsZSB0aW1lb3V0OworICAgIGRvdWJsZSB0aW1lb3V0OwogCi0JaWYgKGFyZyA9PSBQeV9Ob25lKQotCQl0aW1lb3V0ID0gLTEuMDsKLQllbHNlIHsKLQkJdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQkJaWYgKHRpbWVvdXQgPCAwLjApIHsKLQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJUaW1lb3V0IHZhbHVlIG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgaWYgKGFyZyA9PSBQeV9Ob25lKQorICAgICAgICB0aW1lb3V0ID0gLTEuMDsKKyAgICBlbHNlIHsKKyAgICAgICAgdGltZW91dCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICAgICAgaWYgKHRpbWVvdXQgPCAwLjApIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVvdXQgdmFsdWUgb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCWRlZmF1bHR0aW1lb3V0ID0gdGltZW91dDsKKyAgICBkZWZhdWx0dGltZW91dCA9IHRpbWVvdXQ7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2V0ZGVmYXVsdHRpbWVvdXRfZG9jLApAQCAtNDE4OSw1NSArNDE4OSw1NSBAQAogLyogTGlzdCBvZiBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzb2NrZXRfbWV0aG9kc1tdID0gewotCXsiZ2V0aG9zdGJ5bmFtZSIsCXNvY2tldF9nZXRob3N0YnluYW1lLAotCSBNRVRIX1ZBUkFSR1MsIGdldGhvc3RieW5hbWVfZG9jfSwKLQl7ImdldGhvc3RieW5hbWVfZXgiLAlzb2NrZXRfZ2V0aG9zdGJ5bmFtZV9leCwKLQkgTUVUSF9WQVJBUkdTLCBnaGJuX2V4X2RvY30sCi0JeyJnZXRob3N0YnlhZGRyIiwJc29ja2V0X2dldGhvc3RieWFkZHIsCi0JIE1FVEhfVkFSQVJHUywgZ2V0aG9zdGJ5YWRkcl9kb2N9LAotCXsiZ2V0aG9zdG5hbWUiLAkJc29ja2V0X2dldGhvc3RuYW1lLAotCSBNRVRIX05PQVJHUywgIGdldGhvc3RuYW1lX2RvY30sCi0JeyJnZXRzZXJ2YnluYW1lIiwJc29ja2V0X2dldHNlcnZieW5hbWUsCi0JIE1FVEhfVkFSQVJHUywgZ2V0c2VydmJ5bmFtZV9kb2N9LAotCXsiZ2V0c2VydmJ5cG9ydCIsCXNvY2tldF9nZXRzZXJ2Ynlwb3J0LAotCSBNRVRIX1ZBUkFSR1MsIGdldHNlcnZieXBvcnRfZG9jfSwKLQl7ImdldHByb3RvYnluYW1lIiwJc29ja2V0X2dldHByb3RvYnluYW1lLAotCSBNRVRIX1ZBUkFSR1MsIGdldHByb3RvYnluYW1lX2RvY30sCisgICAgeyJnZXRob3N0YnluYW1lIiwgICAgICAgICAgIHNvY2tldF9nZXRob3N0YnluYW1lLAorICAgICBNRVRIX1ZBUkFSR1MsIGdldGhvc3RieW5hbWVfZG9jfSwKKyAgICB7ImdldGhvc3RieW5hbWVfZXgiLCAgICAgICAgc29ja2V0X2dldGhvc3RieW5hbWVfZXgsCisgICAgIE1FVEhfVkFSQVJHUywgZ2hibl9leF9kb2N9LAorICAgIHsiZ2V0aG9zdGJ5YWRkciIsICAgICAgICAgICBzb2NrZXRfZ2V0aG9zdGJ5YWRkciwKKyAgICAgTUVUSF9WQVJBUkdTLCBnZXRob3N0YnlhZGRyX2RvY30sCisgICAgeyJnZXRob3N0bmFtZSIsICAgICAgICAgICAgIHNvY2tldF9nZXRob3N0bmFtZSwKKyAgICAgTUVUSF9OT0FSR1MsICBnZXRob3N0bmFtZV9kb2N9LAorICAgIHsiZ2V0c2VydmJ5bmFtZSIsICAgICAgICAgICBzb2NrZXRfZ2V0c2VydmJ5bmFtZSwKKyAgICAgTUVUSF9WQVJBUkdTLCBnZXRzZXJ2YnluYW1lX2RvY30sCisgICAgeyJnZXRzZXJ2Ynlwb3J0IiwgICAgICAgICAgIHNvY2tldF9nZXRzZXJ2Ynlwb3J0LAorICAgICBNRVRIX1ZBUkFSR1MsIGdldHNlcnZieXBvcnRfZG9jfSwKKyAgICB7ImdldHByb3RvYnluYW1lIiwgICAgICAgICAgc29ja2V0X2dldHByb3RvYnluYW1lLAorICAgICBNRVRIX1ZBUkFSR1MsIGdldHByb3RvYnluYW1lX2RvY30sCiAjaWZuZGVmIE5PX0RVUAotCXsiZnJvbWZkIiwJCXNvY2tldF9mcm9tZmQsCi0JIE1FVEhfVkFSQVJHUywgZnJvbWZkX2RvY30sCisgICAgeyJmcm9tZmQiLCAgICAgICAgICAgICAgICAgIHNvY2tldF9mcm9tZmQsCisgICAgIE1FVEhfVkFSQVJHUywgZnJvbWZkX2RvY30sCiAjZW5kaWYKICNpZmRlZiBIQVZFX1NPQ0tFVFBBSVIKLQl7InNvY2tldHBhaXIiLAkJc29ja2V0X3NvY2tldHBhaXIsCi0JIE1FVEhfVkFSQVJHUywgc29ja2V0cGFpcl9kb2N9LAorICAgIHsic29ja2V0cGFpciIsICAgICAgICAgICAgICBzb2NrZXRfc29ja2V0cGFpciwKKyAgICAgTUVUSF9WQVJBUkdTLCBzb2NrZXRwYWlyX2RvY30sCiAjZW5kaWYKLQl7Im50b2hzIiwJCXNvY2tldF9udG9ocywKLQkgTUVUSF9WQVJBUkdTLCBudG9oc19kb2N9LAotCXsibnRvaGwiLAkJc29ja2V0X250b2hsLAotCSBNRVRIX08sIG50b2hsX2RvY30sCi0JeyJodG9ucyIsCQlzb2NrZXRfaHRvbnMsCi0JIE1FVEhfVkFSQVJHUywgaHRvbnNfZG9jfSwKLQl7Imh0b25sIiwJCXNvY2tldF9odG9ubCwKLQkgTUVUSF9PLCBodG9ubF9kb2N9LAotCXsiaW5ldF9hdG9uIiwJCXNvY2tldF9pbmV0X2F0b24sCi0JIE1FVEhfVkFSQVJHUywgaW5ldF9hdG9uX2RvY30sCi0JeyJpbmV0X250b2EiLAkJc29ja2V0X2luZXRfbnRvYSwKLQkgTUVUSF9WQVJBUkdTLCBpbmV0X250b2FfZG9jfSwKKyAgICB7Im50b2hzIiwgICAgICAgICAgICAgICAgICAgc29ja2V0X250b2hzLAorICAgICBNRVRIX1ZBUkFSR1MsIG50b2hzX2RvY30sCisgICAgeyJudG9obCIsICAgICAgICAgICAgICAgICAgIHNvY2tldF9udG9obCwKKyAgICAgTUVUSF9PLCBudG9obF9kb2N9LAorICAgIHsiaHRvbnMiLCAgICAgICAgICAgICAgICAgICBzb2NrZXRfaHRvbnMsCisgICAgIE1FVEhfVkFSQVJHUywgaHRvbnNfZG9jfSwKKyAgICB7Imh0b25sIiwgICAgICAgICAgICAgICAgICAgc29ja2V0X2h0b25sLAorICAgICBNRVRIX08sIGh0b25sX2RvY30sCisgICAgeyJpbmV0X2F0b24iLCAgICAgICAgICAgICAgIHNvY2tldF9pbmV0X2F0b24sCisgICAgIE1FVEhfVkFSQVJHUywgaW5ldF9hdG9uX2RvY30sCisgICAgeyJpbmV0X250b2EiLCAgICAgICAgICAgICAgIHNvY2tldF9pbmV0X250b2EsCisgICAgIE1FVEhfVkFSQVJHUywgaW5ldF9udG9hX2RvY30sCiAjaWZkZWYgSEFWRV9JTkVUX1BUT04KLQl7ImluZXRfcHRvbiIsCQlzb2NrZXRfaW5ldF9wdG9uLAotCSBNRVRIX1ZBUkFSR1MsIGluZXRfcHRvbl9kb2N9LAotCXsiaW5ldF9udG9wIiwJCXNvY2tldF9pbmV0X250b3AsCi0JIE1FVEhfVkFSQVJHUywgaW5ldF9udG9wX2RvY30sCisgICAgeyJpbmV0X3B0b24iLCAgICAgICAgICAgICAgIHNvY2tldF9pbmV0X3B0b24sCisgICAgIE1FVEhfVkFSQVJHUywgaW5ldF9wdG9uX2RvY30sCisgICAgeyJpbmV0X250b3AiLCAgICAgICAgICAgICAgIHNvY2tldF9pbmV0X250b3AsCisgICAgIE1FVEhfVkFSQVJHUywgaW5ldF9udG9wX2RvY30sCiAjZW5kaWYKLQl7ImdldGFkZHJpbmZvIiwJCXNvY2tldF9nZXRhZGRyaW5mbywKLQkgTUVUSF9WQVJBUkdTLCBnZXRhZGRyaW5mb19kb2N9LAotCXsiZ2V0bmFtZWluZm8iLAkJc29ja2V0X2dldG5hbWVpbmZvLAotCSBNRVRIX1ZBUkFSR1MsIGdldG5hbWVpbmZvX2RvY30sCi0JeyJnZXRkZWZhdWx0dGltZW91dCIsCShQeUNGdW5jdGlvbilzb2NrZXRfZ2V0ZGVmYXVsdHRpbWVvdXQsCi0JIE1FVEhfTk9BUkdTLCBnZXRkZWZhdWx0dGltZW91dF9kb2N9LAotCXsic2V0ZGVmYXVsdHRpbWVvdXQiLAlzb2NrZXRfc2V0ZGVmYXVsdHRpbWVvdXQsCi0JIE1FVEhfTywgc2V0ZGVmYXVsdHRpbWVvdXRfZG9jfSwKLQl7TlVMTCwJCQlOVUxMfQkJIC8qIFNlbnRpbmVsICovCisgICAgeyJnZXRhZGRyaW5mbyIsICAgICAgICAgICAgIHNvY2tldF9nZXRhZGRyaW5mbywKKyAgICAgTUVUSF9WQVJBUkdTLCBnZXRhZGRyaW5mb19kb2N9LAorICAgIHsiZ2V0bmFtZWluZm8iLCAgICAgICAgICAgICBzb2NrZXRfZ2V0bmFtZWluZm8sCisgICAgIE1FVEhfVkFSQVJHUywgZ2V0bmFtZWluZm9fZG9jfSwKKyAgICB7ImdldGRlZmF1bHR0aW1lb3V0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKXNvY2tldF9nZXRkZWZhdWx0dGltZW91dCwKKyAgICAgTUVUSF9OT0FSR1MsIGdldGRlZmF1bHR0aW1lb3V0X2RvY30sCisgICAgeyJzZXRkZWZhdWx0dGltZW91dCIsICAgICAgIHNvY2tldF9zZXRkZWZhdWx0dGltZW91dCwKKyAgICAgTUVUSF9PLCBzZXRkZWZhdWx0dGltZW91dF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAKQEAgLTQyNDcsMTMgKzQyNDcsMTMgQEAKIHN0YXRpYyBpbnQKIG9zX2luaXQodm9pZCkKIHsKLQlfa2VybmVsX3N3aV9yZWdzIHI7CisgICAgX2tlcm5lbF9zd2lfcmVncyByOwogCi0Jci5yWzBdID0gMDsKLQlfa2VybmVsX3N3aSgweDQzMzgwLCAmciwgJnIpOwotCXRhc2t3aW5kb3cgPSByLnJbMF07CisgICAgci5yWzBdID0gMDsKKyAgICBfa2VybmVsX3N3aSgweDQzMzgwLCAmciwgJnIpOworICAgIHRhc2t3aW5kb3cgPSByLnJbMF07CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogI2VuZGlmIC8qIFJJU0NPUyAqLwpAQCAtNDI2NywzNyArNDI2NywzNyBAQAogc3RhdGljIHZvaWQKIG9zX2NsZWFudXAodm9pZCkKIHsKLQlXU0FDbGVhbnVwKCk7CisgICAgV1NBQ2xlYW51cCgpOwogfQogCiBzdGF0aWMgaW50CiBvc19pbml0KHZvaWQpCiB7Ci0JV1NBREFUQSBXU0FEYXRhOwotCWludCByZXQ7Ci0JY2hhciBidWZbMTAwXTsKLQlyZXQgPSBXU0FTdGFydHVwKDB4MDEwMSwgJldTQURhdGEpOwotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAwOgkvKiBObyBlcnJvciAqLwotCQlQeV9BdEV4aXQob3NfY2xlYW51cCk7Ci0JCXJldHVybiAxOyAvKiBTdWNjZXNzICovCi0JY2FzZSBXU0FTWVNOT1RSRUFEWToKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSJXU0FTdGFydHVwIGZhaWxlZDogbmV0d29yayBub3QgcmVhZHkiKTsKLQkJYnJlYWs7Ci0JY2FzZSBXU0FWRVJOT1RTVVBQT1JURUQ6Ci0JY2FzZSBXU0FFSU5WQUw6Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVB5RXhjX0ltcG9ydEVycm9yLAotCQkJIldTQVN0YXJ0dXAgZmFpbGVkOiByZXF1ZXN0ZWQgdmVyc2lvbiBub3Qgc3VwcG9ydGVkIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAgICJXU0FTdGFydHVwIGZhaWxlZDogZXJyb3IgY29kZSAlZCIsIHJldCk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgYnVmKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOyAvKiBGYWlsdXJlICovCisgICAgV1NBREFUQSBXU0FEYXRhOworICAgIGludCByZXQ7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICByZXQgPSBXU0FTdGFydHVwKDB4MDEwMSwgJldTQURhdGEpOworICAgIHN3aXRjaCAocmV0KSB7CisgICAgY2FzZSAwOiAgICAgLyogTm8gZXJyb3IgKi8KKyAgICAgICAgUHlfQXRFeGl0KG9zX2NsZWFudXApOworICAgICAgICByZXR1cm4gMTsgLyogU3VjY2VzcyAqLworICAgIGNhc2UgV1NBU1lTTk9UUkVBRFk6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJXU0FTdGFydHVwIGZhaWxlZDogbmV0d29yayBub3QgcmVhZHkiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXU0FWRVJOT1RTVVBQT1JURUQ6CisgICAgY2FzZSBXU0FFSU5WQUw6CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgIldTQVN0YXJ0dXAgZmFpbGVkOiByZXF1ZXN0ZWQgdmVyc2lvbiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAiV1NBU3RhcnR1cCBmYWlsZWQ6IGVycm9yIGNvZGUgJWQiLCByZXQpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGJ1Zik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsgLyogRmFpbHVyZSAqLwogfQogCiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwpAQCAtNDMxMiwyMSArNDMxMiwyMSBAQAogb3NfaW5pdCh2b2lkKQogewogI2lmbmRlZiBQWUNDX0dDQwotCWNoYXIgcmVhc29uWzY0XTsKLQlpbnQgcmMgPSBzb2NrX2luaXQoKTsKKyAgICBjaGFyIHJlYXNvbls2NF07CisgICAgaW50IHJjID0gc29ja19pbml0KCk7CiAKLQlpZiAocmMgPT0gMCkgewotCQlyZXR1cm4gMTsgLyogU3VjY2VzcyAqLwotCX0KKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgICByZXR1cm4gMTsgLyogU3VjY2VzcyAqLworICAgIH0KIAotCVB5T1Nfc25wcmludGYocmVhc29uLCBzaXplb2YocmVhc29uKSwKLQkJICAgICAgIk9TLzIgVENQL0lQIEVycm9yIyAlZCIsIHNvY2tfZXJybm8oKSk7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCByZWFzb24pOworICAgIFB5T1Nfc25wcmludGYocmVhc29uLCBzaXplb2YocmVhc29uKSwKKyAgICAgICAgICAgICAgICAgICJPUy8yIFRDUC9JUCBFcnJvciMgJWQiLCBzb2NrX2Vycm5vKCkpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgcmVhc29uKTsKIAotCXJldHVybiAwOyAgLyogRmFpbHVyZSAqLworICAgIHJldHVybiAwOyAgLyogRmFpbHVyZSAqLwogI2Vsc2UKLQkvKiBObyBuZWVkIHRvIGluaXRpYWxpc2Ugc29ja2V0cyB3aXRoIEdDQy9FTVggKi8KLQlyZXR1cm4gMTsgLyogU3VjY2VzcyAqLworICAgIC8qIE5vIG5lZWQgdG8gaW5pdGlhbGlzZSBzb2NrZXRzIHdpdGggR0NDL0VNWCAqLworICAgIHJldHVybiAxOyAvKiBTdWNjZXNzICovCiAjZW5kaWYKIH0KIApAQCAtNDMzNyw3ICs0MzM3LDcgQEAKIHN0YXRpYyBpbnQKIG9zX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gMTsgLyogU3VjY2VzcyAqLworICAgIHJldHVybiAxOyAvKiBTdWNjZXNzICovCiB9CiAjZW5kaWYKIApAQCAtNDM0Nyw4ICs0MzQ3LDggQEAKIHN0YXRpYwogUHlTb2NrZXRNb2R1bGVfQVBJT2JqZWN0IFB5U29ja2V0TW9kdWxlQVBJID0KIHsKLQkmc29ja190eXBlLAotICAgICAgICBOVUxMCisgICAgJnNvY2tfdHlwZSwKKyAgICBOVUxMCiB9OwogCiAKQEAgLTQzNzMsOTExICs0MzczLDkxMSBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRfc29ja2V0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpoYXNfaXB2NjsKKyAgICBQeU9iamVjdCAqbSwgKmhhc19pcHY2OwogCi0JaWYgKCFvc19pbml0KCkpCi0JCXJldHVybjsKKyAgICBpZiAoIW9zX2luaXQoKSkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfVFlQRSgmc29ja190eXBlKSA9ICZQeVR5cGVfVHlwZTsKLQltID0gUHlfSW5pdE1vZHVsZTMoUHlTb2NrZXRfTU9EVUxFX05BTUUsCi0JCQkgICBzb2NrZXRfbWV0aG9kcywKLQkJCSAgIHNvY2tldF9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICBQeV9UWVBFKCZzb2NrX3R5cGUpID0gJlB5VHlwZV9UeXBlOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMyhQeVNvY2tldF9NT0RVTEVfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X21ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldF9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCXNvY2tldF9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LmVycm9yIiwKLQkJCQkJICBQeUV4Y19JT0Vycm9yLCBOVUxMKTsKLQlpZiAoc29ja2V0X2Vycm9yID09IE5VTEwpCi0JCXJldHVybjsKLSAgICAgICAgUHlTb2NrZXRNb2R1bGVBUEkuZXJyb3IgPSBzb2NrZXRfZXJyb3I7Ci0JUHlfSU5DUkVGKHNvY2tldF9lcnJvcik7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIHNvY2tldF9lcnJvcik7Ci0Jc29ja2V0X2hlcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LmhlcnJvciIsCi0JCQkJCSAgIHNvY2tldF9lcnJvciwgTlVMTCk7Ci0JaWYgKHNvY2tldF9oZXJyb3IgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRihzb2NrZXRfaGVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImhlcnJvciIsIHNvY2tldF9oZXJyb3IpOwotCXNvY2tldF9nYWllcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LmdhaWVycm9yIiwgc29ja2V0X2Vycm9yLAotCSAgICBOVUxMKTsKLQlpZiAoc29ja2V0X2dhaWVycm9yID09IE5VTEwpCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoc29ja2V0X2dhaWVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImdhaWVycm9yIiwgc29ja2V0X2dhaWVycm9yKTsKLQlzb2NrZXRfdGltZW91dCA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LnRpbWVvdXQiLAotCQkJCQkgICAgc29ja2V0X2Vycm9yLCBOVUxMKTsKLQlpZiAoc29ja2V0X3RpbWVvdXQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRihzb2NrZXRfdGltZW91dCk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0aW1lb3V0Iiwgc29ja2V0X3RpbWVvdXQpOwotCVB5X0lOQ1JFRigoUHlPYmplY3QgKikmc29ja190eXBlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTb2NrZXRUeXBlIiwKLQkJCSAgICAgICAoUHlPYmplY3QgKikmc29ja190eXBlKSAhPSAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKChQeU9iamVjdCAqKSZzb2NrX3R5cGUpOwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgInNvY2tldCIsCi0JCQkgICAgICAgKFB5T2JqZWN0ICopJnNvY2tfdHlwZSkgIT0gMCkKLQkJcmV0dXJuOworICAgIHNvY2tldF9lcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LmVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfSU9FcnJvciwgTlVMTCk7CisgICAgaWYgKHNvY2tldF9lcnJvciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlTb2NrZXRNb2R1bGVBUEkuZXJyb3IgPSBzb2NrZXRfZXJyb3I7CisgICAgUHlfSU5DUkVGKHNvY2tldF9lcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIHNvY2tldF9lcnJvcik7CisgICAgc29ja2V0X2hlcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic29ja2V0LmhlcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfZXJyb3IsIE5VTEwpOworICAgIGlmIChzb2NrZXRfaGVycm9yID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoc29ja2V0X2hlcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJoZXJyb3IiLCBzb2NrZXRfaGVycm9yKTsKKyAgICBzb2NrZXRfZ2FpZXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC5nYWllcnJvciIsIHNvY2tldF9lcnJvciwKKyAgICAgICAgTlVMTCk7CisgICAgaWYgKHNvY2tldF9nYWllcnJvciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKHNvY2tldF9nYWllcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJnYWllcnJvciIsIHNvY2tldF9nYWllcnJvcik7CisgICAgc29ja2V0X3RpbWVvdXQgPSBQeUVycl9OZXdFeGNlcHRpb24oInNvY2tldC50aW1lb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfZXJyb3IsIE5VTEwpOworICAgIGlmIChzb2NrZXRfdGltZW91dCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKHNvY2tldF90aW1lb3V0KTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInRpbWVvdXQiLCBzb2NrZXRfdGltZW91dCk7CisgICAgUHlfSU5DUkVGKChQeU9iamVjdCAqKSZzb2NrX3R5cGUpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNvY2tldFR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopJnNvY2tfdHlwZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRigoUHlPYmplY3QgKikmc29ja190eXBlKTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzb2NrZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopJnNvY2tfdHlwZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogCiAjaWZkZWYgRU5BQkxFX0lQVjYKLQloYXNfaXB2NiA9IFB5X1RydWU7CisgICAgaGFzX2lwdjYgPSBQeV9UcnVlOwogI2Vsc2UKLQloYXNfaXB2NiA9IFB5X0ZhbHNlOworICAgIGhhc19pcHY2ID0gUHlfRmFsc2U7CiAjZW5kaWYKLQlQeV9JTkNSRUYoaGFzX2lwdjYpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiaGFzX2lwdjYiLCBoYXNfaXB2Nik7CisgICAgUHlfSU5DUkVGKGhhc19pcHY2KTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImhhc19pcHY2IiwgaGFzX2lwdjYpOwogCi0JLyogRXhwb3J0IEMgQVBJICovCi0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCBQeVNvY2tldF9DQVBJX05BTUUsCi0JICAgICAgIFB5Q09iamVjdF9Gcm9tVm9pZFB0cigodm9pZCAqKSZQeVNvY2tldE1vZHVsZUFQSSwgTlVMTCkKLQkJCQkgKSAhPSAwKQotCQlyZXR1cm47CisgICAgLyogRXhwb3J0IEMgQVBJICovCisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCBQeVNvY2tldF9DQVBJX05BTUUsCisgICAgICAgICAgIFB5Q09iamVjdF9Gcm9tVm9pZFB0cigodm9pZCAqKSZQeVNvY2tldE1vZHVsZUFQSSwgTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAhPSAwKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGRyZXNzIGZhbWlsaWVzICh3ZSBvbmx5IHN1cHBvcnQgQUZfSU5FVCBhbmQgQUZfVU5JWCkgKi8KKyAgICAvKiBBZGRyZXNzIGZhbWlsaWVzICh3ZSBvbmx5IHN1cHBvcnQgQUZfSU5FVCBhbmQgQUZfVU5JWCkgKi8KICNpZmRlZiBBRl9VTlNQRUMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfVU5TUEVDIiwgQUZfVU5TUEVDKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfVU5TUEVDIiwgQUZfVU5TUEVDKTsKICNlbmRpZgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9JTkVUIiwgQUZfSU5FVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0lORVQiLCBBRl9JTkVUKTsKICNpZmRlZiBBRl9JTkVUNgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9JTkVUNiIsIEFGX0lORVQ2KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSU5FVDYiLCBBRl9JTkVUNik7CiAjZW5kaWYgLyogQUZfSU5FVDYgKi8KICNpZiBkZWZpbmVkKEFGX1VOSVgpCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1VOSVgiLCBBRl9VTklYKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfVU5JWCIsIEFGX1VOSVgpOwogI2VuZGlmIC8qIEFGX1VOSVggKi8KICNpZmRlZiBBRl9BWDI1Ci0JLyogQW1hdGV1ciBSYWRpbyBBWC4yNSAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BWDI1IiwgQUZfQVgyNSk7CisgICAgLyogQW1hdGV1ciBSYWRpbyBBWC4yNSAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BWDI1IiwgQUZfQVgyNSk7CiAjZW5kaWYKICNpZmRlZiBBRl9JUFgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSVBYIiwgQUZfSVBYKTsgLyogTm92ZWxsIElQWCAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9JUFgiLCBBRl9JUFgpOyAvKiBOb3ZlbGwgSVBYICovCiAjZW5kaWYKICNpZmRlZiBBRl9BUFBMRVRBTEsKLQkvKiBBcHBsZXRhbGsgRERQICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FQUExFVEFMSyIsIEFGX0FQUExFVEFMSyk7CisgICAgLyogQXBwbGV0YWxrIEREUCAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BUFBMRVRBTEsiLCBBRl9BUFBMRVRBTEspOwogI2VuZGlmCiAjaWZkZWYgQUZfTkVUUk9NCi0JLyogQW1hdGV1ciByYWRpbyBOZXRST00gKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfTkVUUk9NIiwgQUZfTkVUUk9NKTsKKyAgICAvKiBBbWF0ZXVyIHJhZGlvIE5ldFJPTSAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ORVRST00iLCBBRl9ORVRST00pOwogI2VuZGlmCiAjaWZkZWYgQUZfQlJJREdFCi0JLyogTXVsdGlwcm90b2NvbCBicmlkZ2UgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQlJJREdFIiwgQUZfQlJJREdFKTsKKyAgICAvKiBNdWx0aXByb3RvY29sIGJyaWRnZSAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9CUklER0UiLCBBRl9CUklER0UpOwogI2VuZGlmCiAjaWZkZWYgQUZfQVRNUFZDCi0JLyogQVRNIFBWQ3MgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQVRNUFZDIiwgQUZfQVRNUFZDKTsKKyAgICAvKiBBVE0gUFZDcyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BVE1QVkMiLCBBRl9BVE1QVkMpOwogI2VuZGlmCiAjaWZkZWYgQUZfQUFMNQotCS8qIFJlc2VydmVkIGZvciBXZXJuZXIncyBBVE0gKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQUFMNSIsIEFGX0FBTDUpOworICAgIC8qIFJlc2VydmVkIGZvciBXZXJuZXIncyBBVE0gKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQUFMNSIsIEFGX0FBTDUpOwogI2VuZGlmCiAjaWZkZWYgQUZfWDI1Ci0JLyogUmVzZXJ2ZWQgZm9yIFguMjUgcHJvamVjdCAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9YMjUiLCBBRl9YMjUpOworICAgIC8qIFJlc2VydmVkIGZvciBYLjI1IHByb2plY3QgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfWDI1IiwgQUZfWDI1KTsKICNlbmRpZgogI2lmZGVmIEFGX0lORVQ2Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0lORVQ2IiwgQUZfSU5FVDYpOyAvKiBJUCB2ZXJzaW9uIDYgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfSU5FVDYiLCBBRl9JTkVUNik7IC8qIElQIHZlcnNpb24gNiAqLwogI2VuZGlmCiAjaWZkZWYgQUZfUk9TRQotCS8qIEFtYXRldXIgUmFkaW8gWC4yNSBQTFAgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfUk9TRSIsIEFGX1JPU0UpOworICAgIC8qIEFtYXRldXIgUmFkaW8gWC4yNSBQTFAgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfUk9TRSIsIEFGX1JPU0UpOwogI2VuZGlmCiAjaWZkZWYgQUZfREVDbmV0Ci0JLyogUmVzZXJ2ZWQgZm9yIERFQ25ldCBwcm9qZWN0ICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0RFQ25ldCIsIEFGX0RFQ25ldCk7CisgICAgLyogUmVzZXJ2ZWQgZm9yIERFQ25ldCBwcm9qZWN0ICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0RFQ25ldCIsIEFGX0RFQ25ldCk7CiAjZW5kaWYKICNpZmRlZiBBRl9ORVRCRVVJCi0JLyogUmVzZXJ2ZWQgZm9yIDgwMi4yTExDIHByb2plY3QgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfTkVUQkVVSSIsIEFGX05FVEJFVUkpOworICAgIC8qIFJlc2VydmVkIGZvciA4MDIuMkxMQyBwcm9qZWN0ICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX05FVEJFVUkiLCBBRl9ORVRCRVVJKTsKICNlbmRpZgogI2lmZGVmIEFGX1NFQ1VSSVRZCi0JLyogU2VjdXJpdHkgY2FsbGJhY2sgcHNldWRvIEFGICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1NFQ1VSSVRZIiwgQUZfU0VDVVJJVFkpOworICAgIC8qIFNlY3VyaXR5IGNhbGxiYWNrIHBzZXVkbyBBRiAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9TRUNVUklUWSIsIEFGX1NFQ1VSSVRZKTsKICNlbmRpZgogI2lmZGVmIEFGX0tFWQotCS8qIFBGX0tFWSBrZXkgbWFuYWdlbWVudCBBUEkgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfS0VZIiwgQUZfS0VZKTsKKyAgICAvKiBQRl9LRVkga2V5IG1hbmFnZW1lbnQgQVBJICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0tFWSIsIEFGX0tFWSk7CiAjZW5kaWYKICNpZmRlZiBBRl9ORVRMSU5LCi0JLyogICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX05FVExJTksiLCBBRl9ORVRMSU5LKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ST1VURSIsIE5FVExJTktfUk9VVEUpOworICAgIC8qICAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ORVRMSU5LIiwgQUZfTkVUTElOSyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfUk9VVEUiLCBORVRMSU5LX1JPVVRFKTsKICNpZmRlZiBORVRMSU5LX1NLSVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19TS0lQIiwgTkVUTElOS19TS0lQKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19TS0lQIiwgTkVUTElOS19TS0lQKTsKICNlbmRpZgogI2lmZGVmIE5FVExJTktfVzEKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19XMSIsIE5FVExJTktfVzEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1cxIiwgTkVUTElOS19XMSk7CiAjZW5kaWYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19VU0VSU09DSyIsIE5FVExJTktfVVNFUlNPQ0spOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0ZJUkVXQUxMIiwgTkVUTElOS19GSVJFV0FMTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfVVNFUlNPQ0siLCBORVRMSU5LX1VTRVJTT0NLKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19GSVJFV0FMTCIsIE5FVExJTktfRklSRVdBTEwpOwogI2lmZGVmIE5FVExJTktfVENQRElBRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1RDUERJQUciLCBORVRMSU5LX1RDUERJQUcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1RDUERJQUciLCBORVRMSU5LX1RDUERJQUcpOwogI2VuZGlmCiAjaWZkZWYgTkVUTElOS19ORkxPRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX05GTE9HIiwgTkVUTElOS19ORkxPRyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfTkZMT0ciLCBORVRMSU5LX05GTE9HKTsKICNlbmRpZgogI2lmZGVmIE5FVExJTktfWEZSTQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1hGUk0iLCBORVRMSU5LX1hGUk0pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1hGUk0iLCBORVRMSU5LX1hGUk0pOwogI2VuZGlmCiAjaWZkZWYgTkVUTElOS19BUlBECi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfQVJQRCIsIE5FVExJTktfQVJQRCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfQVJQRCIsIE5FVExJTktfQVJQRCk7CiAjZW5kaWYKICNpZmRlZiBORVRMSU5LX1JPVVRFNgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX1JPVVRFNiIsIE5FVExJTktfUk9VVEU2KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19ST1VURTYiLCBORVRMSU5LX1JPVVRFNik7CiAjZW5kaWYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTkVUTElOS19JUDZfRlciLCBORVRMSU5LX0lQNl9GVyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfSVA2X0ZXIiwgTkVUTElOS19JUDZfRlcpOwogI2lmZGVmIE5FVExJTktfRE5SVE1TRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0ROUlRNU0ciLCBORVRMSU5LX0ROUlRNU0cpOwotI2VuZGlmIAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJORVRMSU5LX0ROUlRNU0ciLCBORVRMSU5LX0ROUlRNU0cpOworI2VuZGlmCiAjaWZkZWYgTkVUTElOS19UQVBCQVNFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfVEFQQkFTRSIsIE5FVExJTktfVEFQQkFTRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5FVExJTktfVEFQQkFTRSIsIE5FVExJTktfVEFQQkFTRSk7CiAjZW5kaWYKICNlbmRpZiAvKiBBRl9ORVRMSU5LICovCiAjaWZkZWYgQUZfUk9VVEUKLQkvKiBBbGlhcyB0byBlbXVsYXRlIDQuNEJTRCAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ST1VURSIsIEFGX1JPVVRFKTsKKyAgICAvKiBBbGlhcyB0byBlbXVsYXRlIDQuNEJTRCAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9ST1VURSIsIEFGX1JPVVRFKTsKICNlbmRpZgogI2lmZGVmIEFGX0FTSAotCS8qIEFzaCAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BU0giLCBBRl9BU0gpOworICAgIC8qIEFzaCAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BU0giLCBBRl9BU0gpOwogI2VuZGlmCiAjaWZkZWYgQUZfRUNPTkVUCi0JLyogQWNvcm4gRWNvbmV0ICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0VDT05FVCIsIEFGX0VDT05FVCk7CisgICAgLyogQWNvcm4gRWNvbmV0ICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0VDT05FVCIsIEFGX0VDT05FVCk7CiAjZW5kaWYKICNpZmRlZiBBRl9BVE1TVkMKLQkvKiBBVE0gU1ZDcyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9BVE1TVkMiLCBBRl9BVE1TVkMpOworICAgIC8qIEFUTSBTVkNzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0FUTVNWQyIsIEFGX0FUTVNWQyk7CiAjZW5kaWYKICNpZmRlZiBBRl9TTkEKLQkvKiBMaW51eCBTTkEgUHJvamVjdCAobnV0dGVycyEpICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1NOQSIsIEFGX1NOQSk7CisgICAgLyogTGludXggU05BIFByb2plY3QgKG51dHRlcnMhKSAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9TTkEiLCBBRl9TTkEpOwogI2VuZGlmCiAjaWZkZWYgQUZfSVJEQQotCS8qIElSREEgc29ja2V0cyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9JUkRBIiwgQUZfSVJEQSk7CisgICAgLyogSVJEQSBzb2NrZXRzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0lSREEiLCBBRl9JUkRBKTsKICNlbmRpZgogI2lmZGVmIEFGX1BQUE9YCi0JLyogUFBQb1ggc29ja2V0cyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBRl9QUFBPWCIsIEFGX1BQUE9YKTsKKyAgICAvKiBQUFBvWCBzb2NrZXRzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1BQUE9YIiwgQUZfUFBQT1gpOwogI2VuZGlmCiAjaWZkZWYgQUZfV0FOUElQRQotCS8qIFdhbnBpcGUgQVBJIFNvY2tldHMgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfV0FOUElQRSIsIEFGX1dBTlBJUEUpOworICAgIC8qIFdhbnBpcGUgQVBJIFNvY2tldHMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfV0FOUElQRSIsIEFGX1dBTlBJUEUpOwogI2VuZGlmCiAjaWZkZWYgQUZfTExDCi0JLyogTGludXggTExDICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0xMQyIsIEFGX0xMQyk7CisgICAgLyogTGludXggTExDICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0xMQyIsIEFGX0xMQyk7CiAjZW5kaWYKIAogI2lmZGVmIFVTRV9CTFVFVE9PVEgKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfQkxVRVRPT1RIIiwgQUZfQkxVRVRPT1RIKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQlRQUk9UT19MMkNBUCIsIEJUUFJPVE9fTDJDQVApOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCVFBST1RPX0hDSSIsIEJUUFJPVE9fSENJKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0hDSSIsIFNPTF9IQ0kpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJIQ0lfRklMVEVSIiwgSENJX0ZJTFRFUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX0JMVUVUT09USCIsIEFGX0JMVUVUT09USCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkJUUFJPVE9fTDJDQVAiLCBCVFBST1RPX0wyQ0FQKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQlRQUk9UT19IQ0kiLCBCVFBST1RPX0hDSSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9IQ0kiLCBTT0xfSENJKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSENJX0ZJTFRFUiIsIEhDSV9GSUxURVIpOwogI2lmICFkZWZpbmVkKF9fRnJlZUJTRF9fKQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJIQ0lfVElNRV9TVEFNUCIsIEhDSV9USU1FX1NUQU1QKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSENJX0RBVEFfRElSIiwgSENJX0RBVEFfRElSKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQlRQUk9UT19TQ08iLCBCVFBST1RPX1NDTyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkhDSV9USU1FX1NUQU1QIiwgSENJX1RJTUVfU1RBTVApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJIQ0lfREFUQV9ESVIiLCBIQ0lfREFUQV9ESVIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCVFBST1RPX1NDTyIsIEJUUFJPVE9fU0NPKTsKICNlbmRpZgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJCVFBST1RPX1JGQ09NTSIsIEJUUFJPVE9fUkZDT01NKTsKLQlQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiQkRBRERSX0FOWSIsICIwMDowMDowMDowMDowMDowMCIpOwotCVB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJCREFERFJfTE9DQUwiLCAiMDA6MDA6MDA6RkY6RkY6RkYiKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQlRQUk9UT19SRkNPTU0iLCBCVFBST1RPX1JGQ09NTSk7CisgICAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIkJEQUREUl9BTlkiLCAiMDA6MDA6MDA6MDA6MDA6MDAiKTsKKyAgICBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiQkRBRERSX0xPQ0FMIiwgIjAwOjAwOjAwOkZGOkZGOkZGIik7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9ICi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1BBQ0tFVCIsIEFGX1BBQ0tFVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBGX1BBQ0tFVCIsIFBGX1BBQ0tFVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9IT1NUIiwgUEFDS0VUX0hPU1QpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfQlJPQURDQVNUIiwgUEFDS0VUX0JST0FEQ0FTVCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9NVUxUSUNBU1QiLCBQQUNLRVRfTVVMVElDQVNUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX09USEVSSE9TVCIsIFBBQ0tFVF9PVEhFUkhPU1QpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfT1VUR09JTkciLCBQQUNLRVRfT1VUR09JTkcpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfTE9PUEJBQ0siLCBQQUNLRVRfTE9PUEJBQ0spOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfRkFTVFJPVVRFIiwgUEFDS0VUX0ZBU1RST1VURSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1BBQ0tFVCIsIEFGX1BBQ0tFVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBGX1BBQ0tFVCIsIFBGX1BBQ0tFVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9IT1NUIiwgUEFDS0VUX0hPU1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfQlJPQURDQVNUIiwgUEFDS0VUX0JST0FEQ0FTVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBBQ0tFVF9NVUxUSUNBU1QiLCBQQUNLRVRfTVVMVElDQVNUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUEFDS0VUX09USEVSSE9TVCIsIFBBQ0tFVF9PVEhFUkhPU1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfT1VUR09JTkciLCBQQUNLRVRfT1VUR09JTkcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfTE9PUEJBQ0siLCBQQUNLRVRfTE9PUEJBQ0spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQQUNLRVRfRkFTVFJPVVRFIiwgUEFDS0VUX0ZBU1RST1VURSk7CiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfTElOVVhfVElQQ19ICi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFGX1RJUEMiLCBBRl9USVBDKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUZfVElQQyIsIEFGX1RJUEMpOwogCi0JLyogZm9yIGFkZHJlc3NlcyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0FERFJfTkFNRVNFUSIsIFRJUENfQUREUl9OQU1FU0VRKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19BRERSX05BTUUiLCBUSVBDX0FERFJfTkFNRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQUREUl9JRCIsIFRJUENfQUREUl9JRCk7CisgICAgLyogZm9yIGFkZHJlc3NlcyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0FERFJfTkFNRVNFUSIsIFRJUENfQUREUl9OQU1FU0VRKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19BRERSX05BTUUiLCBUSVBDX0FERFJfTkFNRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQUREUl9JRCIsIFRJUENfQUREUl9JRCk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19aT05FX1NDT1BFIiwgVElQQ19aT05FX1NDT1BFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19DTFVTVEVSX1NDT1BFIiwgVElQQ19DTFVTVEVSX1NDT1BFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19OT0RFX1NDT1BFIiwgVElQQ19OT0RFX1NDT1BFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19aT05FX1NDT1BFIiwgVElQQ19aT05FX1NDT1BFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19DTFVTVEVSX1NDT1BFIiwgVElQQ19DTFVTVEVSX1NDT1BFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19OT0RFX1NDT1BFIiwgVElQQ19OT0RFX1NDT1BFKTsKIAotCS8qIGZvciBzZXRzb2Nrb3B0KCkgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1RJUEMiLCBTT0xfVElQQyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfSU1QT1JUQU5DRSIsIFRJUENfSU1QT1JUQU5DRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfU1JDX0RST1BQQUJMRSIsIFRJUENfU1JDX0RST1BQQUJMRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfREVTVF9EUk9QUEFCTEUiLAotCQkJVElQQ19ERVNUX0RST1BQQUJMRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfQ09OTl9USU1FT1VUIiwgVElQQ19DT05OX1RJTUVPVVQpOworICAgIC8qIGZvciBzZXRzb2Nrb3B0KCkgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1RJUEMiLCBTT0xfVElQQyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfSU1QT1JUQU5DRSIsIFRJUENfSU1QT1JUQU5DRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfU1JDX0RST1BQQUJMRSIsIFRJUENfU1JDX0RST1BQQUJMRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfREVTVF9EUk9QUEFCTEUiLAorICAgICAgICAgICAgICAgICAgICBUSVBDX0RFU1RfRFJPUFBBQkxFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19DT05OX1RJTUVPVVQiLCBUSVBDX0NPTk5fVElNRU9VVCk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19MT1dfSU1QT1JUQU5DRSIsCi0JCQlUSVBDX0xPV19JTVBPUlRBTkNFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19NRURJVU1fSU1QT1JUQU5DRSIsCi0JCQlUSVBDX01FRElVTV9JTVBPUlRBTkNFKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19ISUdIX0lNUE9SVEFOQ0UiLAotCQkJVElQQ19ISUdIX0lNUE9SVEFOQ0UpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UiLAotCQkJVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19MT1dfSU1QT1JUQU5DRSIsCisgICAgICAgICAgICAgICAgICAgIFRJUENfTE9XX0lNUE9SVEFOQ0UpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX01FRElVTV9JTVBPUlRBTkNFIiwKKyAgICAgICAgICAgICAgICAgICAgVElQQ19NRURJVU1fSU1QT1JUQU5DRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfSElHSF9JTVBPUlRBTkNFIiwKKyAgICAgICAgICAgICAgICAgICAgVElQQ19ISUdIX0lNUE9SVEFOQ0UpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UiLAorICAgICAgICAgICAgICAgICAgICBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UpOwogCi0JLyogZm9yIHN1YnNjcmlwdGlvbnMgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19TVUJfUE9SVFMiLCBUSVBDX1NVQl9QT1JUUyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfU1VCX1NFUlZJQ0UiLCBUSVBDX1NVQl9TRVJWSUNFKTsKKyAgICAvKiBmb3Igc3Vic2NyaXB0aW9ucyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1NVQl9QT1JUUyIsIFRJUENfU1VCX1BPUlRTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19TVUJfU0VSVklDRSIsIFRJUENfU1VCX1NFUlZJQ0UpOwogI2lmZGVmIFRJUENfU1VCX0NBTkNFTAotCS8qIGRvZXNuJ3Qgc2VlbSB0byBiZSBhdmFpbGFibGUgZXZlcnl3aGVyZSAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1NVQl9DQU5DRUwiLCBUSVBDX1NVQl9DQU5DRUwpOworICAgIC8qIGRvZXNuJ3Qgc2VlbSB0byBiZSBhdmFpbGFibGUgZXZlcnl3aGVyZSAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1NVQl9DQU5DRUwiLCBUSVBDX1NVQl9DQU5DRUwpOwogI2VuZGlmCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfV0FJVF9GT1JFVkVSIiwgVElQQ19XQUlUX0ZPUkVWRVIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1BVQkxJU0hFRCIsIFRJUENfUFVCTElTSEVEKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19XSVRIRFJBV04iLCBUSVBDX1dJVEhEUkFXTik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfU1VCU0NSX1RJTUVPVVQiLCBUSVBDX1NVQlNDUl9USU1FT1VUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19DRkdfU1JWIiwgVElQQ19DRkdfU1JWKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19UT1BfU1JWIiwgVElQQ19UT1BfU1JWKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19XQUlUX0ZPUkVWRVIiLCBUSVBDX1dBSVRfRk9SRVZFUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRJUENfUFVCTElTSEVEIiwgVElQQ19QVUJMSVNIRUQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1dJVEhEUkFXTiIsIFRJUENfV0lUSERSQVdOKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVElQQ19TVUJTQ1JfVElNRU9VVCIsIFRJUENfU1VCU0NSX1RJTUVPVVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX0NGR19TUlYiLCBUSVBDX0NGR19TUlYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUSVBDX1RPUF9TUlYiLCBUSVBDX1RPUF9TUlYpOwogI2VuZGlmCiAKLQkvKiBTb2NrZXQgdHlwZXMgKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09DS19TVFJFQU0iLCBTT0NLX1NUUkVBTSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfREdSQU0iLCBTT0NLX0RHUkFNKTsKKyAgICAvKiBTb2NrZXQgdHlwZXMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09DS19TVFJFQU0iLCBTT0NLX1NUUkVBTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfREdSQU0iLCBTT0NLX0RHUkFNKTsKICNpZm5kZWYgX19CRU9TX18KIC8qIFdlIGhhdmUgaW5jb21wbGV0ZSBzb2NrZXQgc3VwcG9ydC4gKi8KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09DS19SQVciLCBTT0NLX1JBVyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfU0VRUEFDS0VUIiwgU09DS19TRVFQQUNLRVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0NLX1JBVyIsIFNPQ0tfUkFXKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09DS19TRVFQQUNLRVQiLCBTT0NLX1NFUVBBQ0tFVCk7CiAjaWYgZGVmaW5lZChTT0NLX1JETSkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09DS19SRE0iLCBTT0NLX1JETSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPQ0tfUkRNIiwgU09DS19SRE0pOwogI2VuZGlmCiAjZW5kaWYKIAotI2lmZGVmCVNPX0RFQlVHCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0RFQlVHIiwgU09fREVCVUcpOworI2lmZGVmICBTT19ERUJVRworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19ERUJVRyIsIFNPX0RFQlVHKTsKICNlbmRpZgotI2lmZGVmCVNPX0FDQ0VQVENPTk4KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fQUNDRVBUQ09OTiIsIFNPX0FDQ0VQVENPTk4pOworI2lmZGVmICBTT19BQ0NFUFRDT05OCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0FDQ0VQVENPTk4iLCBTT19BQ0NFUFRDT05OKTsKICNlbmRpZgotI2lmZGVmCVNPX1JFVVNFQUREUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19SRVVTRUFERFIiLCBTT19SRVVTRUFERFIpOworI2lmZGVmICBTT19SRVVTRUFERFIKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkVVU0VBRERSIiwgU09fUkVVU0VBRERSKTsKICNlbmRpZgogI2lmZGVmIFNPX0VYQ0xVU0lWRUFERFJVU0UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fRVhDTFVTSVZFQUREUlVTRSIsIFNPX0VYQ0xVU0lWRUFERFJVU0UpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19FWENMVVNJVkVBRERSVVNFIiwgU09fRVhDTFVTSVZFQUREUlVTRSk7CiAjZW5kaWYKIAotI2lmZGVmCVNPX0tFRVBBTElWRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19LRUVQQUxJVkUiLCBTT19LRUVQQUxJVkUpOworI2lmZGVmICBTT19LRUVQQUxJVkUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fS0VFUEFMSVZFIiwgU09fS0VFUEFMSVZFKTsKICNlbmRpZgotI2lmZGVmCVNPX0RPTlRST1VURQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19ET05UUk9VVEUiLCBTT19ET05UUk9VVEUpOworI2lmZGVmICBTT19ET05UUk9VVEUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fRE9OVFJPVVRFIiwgU09fRE9OVFJPVVRFKTsKICNlbmRpZgotI2lmZGVmCVNPX0JST0FEQ0FTVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19CUk9BRENBU1QiLCBTT19CUk9BRENBU1QpOworI2lmZGVmICBTT19CUk9BRENBU1QKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fQlJPQURDQVNUIiwgU09fQlJPQURDQVNUKTsKICNlbmRpZgotI2lmZGVmCVNPX1VTRUxPT1BCQUNLCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1VTRUxPT1BCQUNLIiwgU09fVVNFTE9PUEJBQ0spOworI2lmZGVmICBTT19VU0VMT09QQkFDSworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19VU0VMT09QQkFDSyIsIFNPX1VTRUxPT1BCQUNLKTsKICNlbmRpZgotI2lmZGVmCVNPX0xJTkdFUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19MSU5HRVIiLCBTT19MSU5HRVIpOworI2lmZGVmICBTT19MSU5HRVIKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fTElOR0VSIiwgU09fTElOR0VSKTsKICNlbmRpZgotI2lmZGVmCVNPX09PQklOTElORQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19PT0JJTkxJTkUiLCBTT19PT0JJTkxJTkUpOworI2lmZGVmICBTT19PT0JJTkxJTkUKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fT09CSU5MSU5FIiwgU09fT09CSU5MSU5FKTsKICNlbmRpZgotI2lmZGVmCVNPX1JFVVNFUE9SVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19SRVVTRVBPUlQiLCBTT19SRVVTRVBPUlQpOworI2lmZGVmICBTT19SRVVTRVBPUlQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkVVU0VQT1JUIiwgU09fUkVVU0VQT1JUKTsKICNlbmRpZgotI2lmZGVmCVNPX1NOREJVRgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19TTkRCVUYiLCBTT19TTkRCVUYpOworI2lmZGVmICBTT19TTkRCVUYKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fU05EQlVGIiwgU09fU05EQlVGKTsKICNlbmRpZgotI2lmZGVmCVNPX1JDVkJVRgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19SQ1ZCVUYiLCBTT19SQ1ZCVUYpOworI2lmZGVmICBTT19SQ1ZCVUYKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fUkNWQlVGIiwgU09fUkNWQlVGKTsKICNlbmRpZgotI2lmZGVmCVNPX1NORExPV0FUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1NORExPV0FUIiwgU09fU05ETE9XQVQpOworI2lmZGVmICBTT19TTkRMT1dBVAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19TTkRMT1dBVCIsIFNPX1NORExPV0FUKTsKICNlbmRpZgotI2lmZGVmCVNPX1JDVkxPV0FUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1JDVkxPV0FUIiwgU09fUkNWTE9XQVQpOworI2lmZGVmICBTT19SQ1ZMT1dBVAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19SQ1ZMT1dBVCIsIFNPX1JDVkxPV0FUKTsKICNlbmRpZgotI2lmZGVmCVNPX1NORFRJTUVPCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1NORFRJTUVPIiwgU09fU05EVElNRU8pOworI2lmZGVmICBTT19TTkRUSU1FTworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19TTkRUSU1FTyIsIFNPX1NORFRJTUVPKTsKICNlbmRpZgotI2lmZGVmCVNPX1JDVlRJTUVPCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1JDVlRJTUVPIiwgU09fUkNWVElNRU8pOworI2lmZGVmICBTT19SQ1ZUSU1FTworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19SQ1ZUSU1FTyIsIFNPX1JDVlRJTUVPKTsKICNlbmRpZgotI2lmZGVmCVNPX0VSUk9SCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX0VSUk9SIiwgU09fRVJST1IpOworI2lmZGVmICBTT19FUlJPUgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT19FUlJPUiIsIFNPX0VSUk9SKTsKICNlbmRpZgotI2lmZGVmCVNPX1RZUEUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09fVFlQRSIsIFNPX1RZUEUpOworI2lmZGVmICBTT19UWVBFCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPX1RZUEUiLCBTT19UWVBFKTsKICNlbmRpZgogCi0JLyogTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgZm9yICJsaXN0ZW4iICovCi0jaWZkZWYJU09NQVhDT05OCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTUFYQ09OTiIsIFNPTUFYQ09OTik7CisgICAgLyogTWF4aW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgZm9yICJsaXN0ZW4iICovCisjaWZkZWYgIFNPTUFYQ09OTgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT01BWENPTk4iLCBTT01BWENPTk4pOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09NQVhDT05OIiwgNSk7IC8qIENvbW1vbiB2YWx1ZSAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT01BWENPTk4iLCA1KTsgLyogQ29tbW9uIHZhbHVlICovCiAjZW5kaWYKIAotCS8qIEZsYWdzIGZvciBzZW5kLCByZWN2ICovCi0jaWZkZWYJTVNHX09PQgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfT09CIiwgTVNHX09PQik7CisgICAgLyogRmxhZ3MgZm9yIHNlbmQsIHJlY3YgKi8KKyNpZmRlZiAgTVNHX09PQgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfT09CIiwgTVNHX09PQik7CiAjZW5kaWYKLSNpZmRlZglNU0dfUEVFSwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfUEVFSyIsIE1TR19QRUVLKTsKKyNpZmRlZiAgTVNHX1BFRUsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX1BFRUsiLCBNU0dfUEVFSyk7CiAjZW5kaWYKLSNpZmRlZglNU0dfRE9OVFJPVVRFCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19ET05UUk9VVEUiLCBNU0dfRE9OVFJPVVRFKTsKKyNpZmRlZiAgTVNHX0RPTlRST1VURQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfRE9OVFJPVVRFIiwgTVNHX0RPTlRST1VURSk7CiAjZW5kaWYKLSNpZmRlZglNU0dfRE9OVFdBSVQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0RPTlRXQUlUIiwgTVNHX0RPTlRXQUlUKTsKKyNpZmRlZiAgTVNHX0RPTlRXQUlUCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19ET05UV0FJVCIsIE1TR19ET05UV0FJVCk7CiAjZW5kaWYKLSNpZmRlZglNU0dfRU9SCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19FT1IiLCBNU0dfRU9SKTsKKyNpZmRlZiAgTVNHX0VPUgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfRU9SIiwgTVNHX0VPUik7CiAjZW5kaWYKLSNpZmRlZglNU0dfVFJVTkMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX1RSVU5DIiwgTVNHX1RSVU5DKTsKKyNpZmRlZiAgTVNHX1RSVU5DCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19UUlVOQyIsIE1TR19UUlVOQyk7CiAjZW5kaWYKLSNpZmRlZglNU0dfQ1RSVU5DCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TR19DVFJVTkMiLCBNU0dfQ1RSVU5DKTsKKyNpZmRlZiAgTVNHX0NUUlVOQworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfQ1RSVU5DIiwgTVNHX0NUUlVOQyk7CiAjZW5kaWYKLSNpZmRlZglNU0dfV0FJVEFMTAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfV0FJVEFMTCIsIE1TR19XQUlUQUxMKTsKKyNpZmRlZiAgTVNHX1dBSVRBTEwKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX1dBSVRBTEwiLCBNU0dfV0FJVEFMTCk7CiAjZW5kaWYKLSNpZmRlZglNU0dfQlRBRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfQlRBRyIsIE1TR19CVEFHKTsKKyNpZmRlZiAgTVNHX0JUQUcKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0JUQUciLCBNU0dfQlRBRyk7CiAjZW5kaWYKLSNpZmRlZglNU0dfRVRBRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0dfRVRBRyIsIE1TR19FVEFHKTsKKyNpZmRlZiAgTVNHX0VUQUcKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNHX0VUQUciLCBNU0dfRVRBRyk7CiAjZW5kaWYKIAotCS8qIFByb3RvY29sIGxldmVsIGFuZCBudW1iZXJzLCB1c2FibGUgZm9yIFtnc11ldHNvY2tvcHQgKi8KLSNpZmRlZglTT0xfU09DS0VUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9TT0NLRVQiLCBTT0xfU09DS0VUKTsKKyAgICAvKiBQcm90b2NvbCBsZXZlbCBhbmQgbnVtYmVycywgdXNhYmxlIGZvciBbZ3NdZXRzb2Nrb3B0ICovCisjaWZkZWYgIFNPTF9TT0NLRVQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1NPQ0tFVCIsIFNPTF9TT0NLRVQpOwogI2VuZGlmCi0jaWZkZWYJU09MX0lQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9JUCIsIFNPTF9JUCk7CisjaWZkZWYgIFNPTF9JUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfSVAiLCBTT0xfSVApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0lQIiwgMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9JUCIsIDApOwogI2VuZGlmCi0jaWZkZWYJU09MX0lQWAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfSVBYIiwgU09MX0lQWCk7CisjaWZkZWYgIFNPTF9JUFgKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0lQWCIsIFNPTF9JUFgpOwogI2VuZGlmCi0jaWZkZWYJU09MX0FYMjUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX0FYMjUiLCBTT0xfQVgyNSk7CisjaWZkZWYgIFNPTF9BWDI1CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9BWDI1IiwgU09MX0FYMjUpOwogI2VuZGlmCi0jaWZkZWYJU09MX0FUQUxLCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9BVEFMSyIsIFNPTF9BVEFMSyk7CisjaWZkZWYgIFNPTF9BVEFMSworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfQVRBTEsiLCBTT0xfQVRBTEspOwogI2VuZGlmCi0jaWZkZWYJU09MX05FVFJPTQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfTkVUUk9NIiwgU09MX05FVFJPTSk7CisjaWZkZWYgIFNPTF9ORVRST00KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX05FVFJPTSIsIFNPTF9ORVRST00pOwogI2VuZGlmCi0jaWZkZWYJU09MX1JPU0UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1JPU0UiLCBTT0xfUk9TRSk7CisjaWZkZWYgIFNPTF9ST1NFCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9ST1NFIiwgU09MX1JPU0UpOwogI2VuZGlmCi0jaWZkZWYJU09MX1RDUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVENQIiwgU09MX1RDUCk7CisjaWZkZWYgIFNPTF9UQ1AKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1RDUCIsIFNPTF9UQ1ApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU09MX1RDUCIsIDYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVENQIiwgNik7CiAjZW5kaWYKLSNpZmRlZglTT0xfVURQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNPTF9VRFAiLCBTT0xfVURQKTsKKyNpZmRlZiAgU09MX1VEUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVURQIiwgU09MX1VEUCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVURQIiwgMTcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTT0xfVURQIiwgMTcpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQIiwgSVBQUk9UT19JUCk7CisjaWZkZWYgIElQUFJPVE9fSVAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUCIsIElQUFJPVE9fSVApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUCIsIDApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQIiwgMCk7CiAjZW5kaWYKLSNpZmRlZglJUFBST1RPX0hPUE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19IT1BPUFRTIiwgSVBQUk9UT19IT1BPUFRTKTsKKyNpZmRlZiAgSVBQUk9UT19IT1BPUFRTCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSE9QT1BUUyIsIElQUFJPVE9fSE9QT1BUUyk7CiAjZW5kaWYKLSNpZmRlZglJUFBST1RPX0lDTVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JQ01QIiwgSVBQUk9UT19JQ01QKTsKKyNpZmRlZiAgSVBQUk9UT19JQ01QCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUNNUCIsIElQUFJPVE9fSUNNUCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lDTVAiLCAxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JQ01QIiwgMSk7CiAjZW5kaWYKLSNpZmRlZglJUFBST1RPX0lHTVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JR01QIiwgSVBQUk9UT19JR01QKTsKKyNpZmRlZiAgSVBQUk9UT19JR01QCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUdNUCIsIElQUFJPVE9fSUdNUCk7CiAjZW5kaWYKLSNpZmRlZglJUFBST1RPX0dHUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0dHUCIsIElQUFJPVE9fR0dQKTsKKyNpZmRlZiAgSVBQUk9UT19HR1AKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19HR1AiLCBJUFBST1RPX0dHUCk7CiAjZW5kaWYKLSNpZmRlZglJUFBST1RPX0lQVjQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUFY0IiwgSVBQUk9UT19JUFY0KTsKKyNpZmRlZiAgSVBQUk9UT19JUFY0CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBWNCIsIElQUFJPVE9fSVBWNCk7CiAjZW5kaWYKLSNpZmRlZglJUFBST1RPX0lQVjYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUFY2IiwgSVBQUk9UT19JUFY2KTsKKyNpZmRlZiAgSVBQUk9UT19JUFY2CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBWNiIsIElQUFJPVE9fSVBWNik7CiAjZW5kaWYKLSNpZmRlZglJUFBST1RPX0lQSVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUElQIiwgSVBQUk9UT19JUElQKTsKKyNpZmRlZiAgSVBQUk9UT19JUElQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBJUCIsIElQUFJPVE9fSVBJUCk7CiAjZW5kaWYKLSNpZmRlZglJUFBST1RPX1RDUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1RDUCIsIElQUFJPVE9fVENQKTsKKyNpZmRlZiAgSVBQUk9UT19UQ1AKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UQ1AiLCBJUFBST1RPX1RDUCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1RDUCIsIDYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1RDUCIsIDYpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19FR1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19FR1AiLCBJUFBST1RPX0VHUCk7CisjaWZkZWYgIElQUFJPVE9fRUdQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRUdQIiwgSVBQUk9UT19FR1ApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19QVVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19QVVAiLCBJUFBST1RPX1BVUCk7CisjaWZkZWYgIElQUFJPVE9fUFVQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUFVQIiwgSVBQUk9UT19QVVApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19VRFAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19VRFAiLCBJUFBST1RPX1VEUCk7CisjaWZkZWYgIElQUFJPVE9fVURQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVURQIiwgSVBQUk9UT19VRFApOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19VRFAiLCAxNyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVURQIiwgMTcpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JRFAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JRFAiLCBJUFBST1RPX0lEUCk7CisjaWZkZWYgIElQUFJPVE9fSURQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSURQIiwgSVBQUk9UT19JRFApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19IRUxMTwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0hFTExPIiwgSVBQUk9UT19IRUxMTyk7CisjaWZkZWYgIElQUFJPVE9fSEVMTE8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19IRUxMTyIsIElQUFJPVE9fSEVMTE8pOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19ORAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX05EIiwgSVBQUk9UT19ORCk7CisjaWZkZWYgIElQUFJPVE9fTkQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19ORCIsIElQUFJPVE9fTkQpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19UUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1RQIiwgSVBQUk9UT19UUCk7CisjaWZkZWYgIElQUFJPVE9fVFAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19UUCIsIElQUFJPVE9fVFApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JUFY2Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBWNiIsIElQUFJPVE9fSVBWNik7CisjaWZkZWYgIElQUFJPVE9fSVBWNgorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0lQVjYiLCBJUFBST1RPX0lQVjYpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19ST1VUSU5HCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUk9VVElORyIsIElQUFJPVE9fUk9VVElORyk7CisjaWZkZWYgIElQUFJPVE9fUk9VVElORworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1JPVVRJTkciLCBJUFBST1RPX1JPVVRJTkcpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19GUkFHTUVOVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0ZSQUdNRU5UIiwgSVBQUk9UT19GUkFHTUVOVCk7CisjaWZkZWYgIElQUFJPVE9fRlJBR01FTlQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19GUkFHTUVOVCIsIElQUFJPVE9fRlJBR01FTlQpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19SU1ZQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUlNWUCIsIElQUFJPVE9fUlNWUCk7CisjaWZkZWYgIElQUFJPVE9fUlNWUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1JTVlAiLCBJUFBST1RPX1JTVlApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19HUkUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19HUkUiLCBJUFBST1RPX0dSRSk7CisjaWZkZWYgIElQUFJPVE9fR1JFCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fR1JFIiwgSVBQUk9UT19HUkUpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19FU1AKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19FU1AiLCBJUFBST1RPX0VTUCk7CisjaWZkZWYgIElQUFJPVE9fRVNQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRVNQIiwgSVBQUk9UT19FU1ApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19BSAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0FIIiwgSVBQUk9UT19BSCk7CisjaWZkZWYgIElQUFJPVE9fQUgKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19BSCIsIElQUFJPVE9fQUgpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19NT0JJTEUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19NT0JJTEUiLCBJUFBST1RPX01PQklMRSk7CisjaWZkZWYgIElQUFJPVE9fTU9CSUxFCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fTU9CSUxFIiwgSVBQUk9UT19NT0JJTEUpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JQ01QVjYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JQ01QVjYiLCBJUFBST1RPX0lDTVBWNik7CisjaWZkZWYgIElQUFJPVE9fSUNNUFY2CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSUNNUFY2IiwgSVBQUk9UT19JQ01QVjYpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19OT05FCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fTk9ORSIsIElQUFJPVE9fTk9ORSk7CisjaWZkZWYgIElQUFJPVE9fTk9ORQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX05PTkUiLCBJUFBST1RPX05PTkUpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19EU1RPUFRTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRFNUT1BUUyIsIElQUFJPVE9fRFNUT1BUUyk7CisjaWZkZWYgIElQUFJPVE9fRFNUT1BUUworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX0RTVE9QVFMiLCBJUFBST1RPX0RTVE9QVFMpOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19YVFAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19YVFAiLCBJUFBST1RPX1hUUCk7CisjaWZkZWYgIElQUFJPVE9fWFRQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fWFRQIiwgSVBQUk9UT19YVFApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19FT04KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19FT04iLCBJUFBST1RPX0VPTik7CisjaWZkZWYgIElQUFJPVE9fRU9OCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fRU9OIiwgSVBQUk9UT19FT04pOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19QSU0KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19QSU0iLCBJUFBST1RPX1BJTSk7CisjaWZkZWYgIElQUFJPVE9fUElNCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUElNIiwgSVBQUk9UT19QSU0pOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19JUENPTVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19JUENPTVAiLCBJUFBST1RPX0lQQ09NUCk7CisjaWZkZWYgIElQUFJPVE9fSVBDT01QCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fSVBDT01QIiwgSVBQUk9UT19JUENPTVApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19WUlJQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fVlJSUCIsIElQUFJPVE9fVlJSUCk7CisjaWZkZWYgIElQUFJPVE9fVlJSUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1ZSUlAiLCBJUFBST1RPX1ZSUlApOwogI2VuZGlmCi0jaWZkZWYJSVBQUk9UT19CSVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19CSVAiLCBJUFBST1RPX0JJUCk7CisjaWZkZWYgIElQUFJPVE9fQklQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fQklQIiwgSVBQUk9UT19CSVApOwogI2VuZGlmCiAvKiovCi0jaWZkZWYJSVBQUk9UT19SQVcKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19SQVciLCBJUFBST1RPX1JBVyk7CisjaWZkZWYgIElQUFJPVE9fUkFXCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUFJPVE9fUkFXIiwgSVBQUk9UT19SQVcpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19SQVciLCAyNTUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX1JBVyIsIDI1NSk7CiAjZW5kaWYKLSNpZmRlZglJUFBST1RPX01BWAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBST1RPX01BWCIsIElQUFJPVE9fTUFYKTsKKyNpZmRlZiAgSVBQUk9UT19NQVgKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQUk9UT19NQVgiLCBJUFBST1RPX01BWCk7CiAjZW5kaWYKIAotCS8qIFNvbWUgcG9ydCBjb25maWd1cmF0aW9uICovCi0jaWZkZWYJSVBQT1JUX1JFU0VSVkVECi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUE9SVF9SRVNFUlZFRCIsIElQUE9SVF9SRVNFUlZFRCk7CisgICAgLyogU29tZSBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KKyNpZmRlZiAgSVBQT1JUX1JFU0VSVkVECisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUE9SVF9SRVNFUlZFRCIsIElQUE9SVF9SRVNFUlZFRCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfUkVTRVJWRUQiLCAxMDI0KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBQT1JUX1JFU0VSVkVEIiwgMTAyNCk7CiAjZW5kaWYKLSNpZmRlZglJUFBPUlRfVVNFUlJFU0VSVkVECi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUE9SVF9VU0VSUkVTRVJWRUQiLCBJUFBPUlRfVVNFUlJFU0VSVkVEKTsKKyNpZmRlZiAgSVBQT1JUX1VTRVJSRVNFUlZFRAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfVVNFUlJFU0VSVkVEIiwgSVBQT1JUX1VTRVJSRVNFUlZFRCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFBPUlRfVVNFUlJFU0VSVkVEIiwgNTAwMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQUE9SVF9VU0VSUkVTRVJWRUQiLCA1MDAwKTsKICNlbmRpZgogCi0JLyogU29tZSByZXNlcnZlZCBJUCB2LjQgYWRkcmVzc2VzICovCi0jaWZkZWYJSU5BRERSX0FOWQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQU5ZIiwgSU5BRERSX0FOWSk7CisgICAgLyogU29tZSByZXNlcnZlZCBJUCB2LjQgYWRkcmVzc2VzICovCisjaWZkZWYgIElOQUREUl9BTlkKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0FOWSIsIElOQUREUl9BTlkpOwogI2Vsc2UKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0FOWSIsIDB4MDAwMDAwMDApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQU5ZIiwgMHgwMDAwMDAwMCk7CiAjZW5kaWYKLSNpZmRlZglJTkFERFJfQlJPQURDQVNUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9CUk9BRENBU1QiLCBJTkFERFJfQlJPQURDQVNUKTsKKyNpZmRlZiAgSU5BRERSX0JST0FEQ0FTVAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQlJPQURDQVNUIiwgSU5BRERSX0JST0FEQ0FTVCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQlJPQURDQVNUIiwgMHhmZmZmZmZmZik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9CUk9BRENBU1QiLCAweGZmZmZmZmZmKTsKICNlbmRpZgotI2lmZGVmCUlOQUREUl9MT09QQkFDSwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTE9PUEJBQ0siLCBJTkFERFJfTE9PUEJBQ0spOworI2lmZGVmICBJTkFERFJfTE9PUEJBQ0sKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX0xPT1BCQUNLIiwgSU5BRERSX0xPT1BCQUNLKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9MT09QQkFDSyIsIDB4N0YwMDAwMDEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTE9PUEJBQ0siLCAweDdGMDAwMDAxKTsKICNlbmRpZgotI2lmZGVmCUlOQUREUl9VTlNQRUNfR1JPVVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX1VOU1BFQ19HUk9VUCIsIElOQUREUl9VTlNQRUNfR1JPVVApOworI2lmZGVmICBJTkFERFJfVU5TUEVDX0dST1VQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9VTlNQRUNfR1JPVVAiLCBJTkFERFJfVU5TUEVDX0dST1VQKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9VTlNQRUNfR1JPVVAiLCAweGUwMDAwMDAwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX1VOU1BFQ19HUk9VUCIsIDB4ZTAwMDAwMDApOwogI2VuZGlmCi0jaWZkZWYJSU5BRERSX0FMTEhPU1RTX0dST1VQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9BTExIT1NUU19HUk9VUCIsCi0JCQkJSU5BRERSX0FMTEhPU1RTX0dST1VQKTsKKyNpZmRlZiAgSU5BRERSX0FMTEhPU1RTX0dST1VQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9BTExIT1NUU19HUk9VUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5BRERSX0FMTEhPU1RTX0dST1VQKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9BTExIT1NUU19HUk9VUCIsIDB4ZTAwMDAwMDEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfQUxMSE9TVFNfR1JPVVAiLCAweGUwMDAwMDAxKTsKICNlbmRpZgotI2lmZGVmCUlOQUREUl9NQVhfTE9DQUxfR1JPVVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX01BWF9MT0NBTF9HUk9VUCIsCi0JCQkJSU5BRERSX01BWF9MT0NBTF9HUk9VUCk7CisjaWZkZWYgIElOQUREUl9NQVhfTE9DQUxfR1JPVVAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSU5BRERSX01BWF9MT0NBTF9HUk9VUCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5BRERSX01BWF9MT0NBTF9HUk9VUCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTUFYX0xPQ0FMX0dST1VQIiwgMHhlMDAwMDBmZik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9NQVhfTE9DQUxfR1JPVVAiLCAweGUwMDAwMGZmKTsKICNlbmRpZgotI2lmZGVmCUlOQUREUl9OT05FCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9OT05FIiwgSU5BRERSX05PTkUpOworI2lmZGVmICBJTkFERFJfTk9ORQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJTkFERFJfTk9ORSIsIElOQUREUl9OT05FKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9OT05FIiwgMHhmZmZmZmZmZik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklOQUREUl9OT05FIiwgMHhmZmZmZmZmZik7CiAjZW5kaWYKIAotCS8qIElQdjQgW2dzXWV0c29ja29wdCBvcHRpb25zICovCi0jaWZkZWYJSVBfT1BUSU9OUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9PUFRJT05TIiwgSVBfT1BUSU9OUyk7CisgICAgLyogSVB2NCBbZ3NdZXRzb2Nrb3B0IG9wdGlvbnMgKi8KKyNpZmRlZiAgSVBfT1BUSU9OUworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9PUFRJT05TIiwgSVBfT1BUSU9OUyk7CiAjZW5kaWYKLSNpZmRlZglJUF9IRFJJTkNMCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0hEUklOQ0wiLCBJUF9IRFJJTkNMKTsKKyNpZmRlZiAgSVBfSERSSU5DTAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9IRFJJTkNMIiwgSVBfSERSSU5DTCk7CiAjZW5kaWYKLSNpZmRlZglJUF9UT1MKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfVE9TIiwgSVBfVE9TKTsKKyNpZmRlZiAgSVBfVE9TCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1RPUyIsIElQX1RPUyk7CiAjZW5kaWYKLSNpZmRlZglJUF9UVEwKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfVFRMIiwgSVBfVFRMKTsKKyNpZmRlZiAgSVBfVFRMCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1RUTCIsIElQX1RUTCk7CiAjZW5kaWYKLSNpZmRlZglJUF9SRUNWT1BUUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9SRUNWT1BUUyIsIElQX1JFQ1ZPUFRTKTsKKyNpZmRlZiAgSVBfUkVDVk9QVFMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVDVk9QVFMiLCBJUF9SRUNWT1BUUyk7CiAjZW5kaWYKLSNpZmRlZglJUF9SRUNWUkVUT1BUUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9SRUNWUkVUT1BUUyIsIElQX1JFQ1ZSRVRPUFRTKTsKKyNpZmRlZiAgSVBfUkVDVlJFVE9QVFMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVDVlJFVE9QVFMiLCBJUF9SRUNWUkVUT1BUUyk7CiAjZW5kaWYKLSNpZmRlZglJUF9SRUNWRFNUQUREUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9SRUNWRFNUQUREUiIsIElQX1JFQ1ZEU1RBRERSKTsKKyNpZmRlZiAgSVBfUkVDVkRTVEFERFIKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfUkVDVkRTVEFERFIiLCBJUF9SRUNWRFNUQUREUik7CiAjZW5kaWYKLSNpZmRlZglJUF9SRVRPUFRTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX1JFVE9QVFMiLCBJUF9SRVRPUFRTKTsKKyNpZmRlZiAgSVBfUkVUT1BUUworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9SRVRPUFRTIiwgSVBfUkVUT1BUUyk7CiAjZW5kaWYKLSNpZmRlZglJUF9NVUxUSUNBU1RfSUYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfTVVMVElDQVNUX0lGIiwgSVBfTVVMVElDQVNUX0lGKTsKKyNpZmRlZiAgSVBfTVVMVElDQVNUX0lGCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX01VTFRJQ0FTVF9JRiIsIElQX01VTFRJQ0FTVF9JRik7CiAjZW5kaWYKLSNpZmRlZglJUF9NVUxUSUNBU1RfVFRMCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX01VTFRJQ0FTVF9UVEwiLCBJUF9NVUxUSUNBU1RfVFRMKTsKKyNpZmRlZiAgSVBfTVVMVElDQVNUX1RUTAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9NVUxUSUNBU1RfVFRMIiwgSVBfTVVMVElDQVNUX1RUTCk7CiAjZW5kaWYKLSNpZmRlZglJUF9NVUxUSUNBU1RfTE9PUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9NVUxUSUNBU1RfTE9PUCIsIElQX01VTFRJQ0FTVF9MT09QKTsKKyNpZmRlZiAgSVBfTVVMVElDQVNUX0xPT1AKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfTVVMVElDQVNUX0xPT1AiLCBJUF9NVUxUSUNBU1RfTE9PUCk7CiAjZW5kaWYKLSNpZmRlZglJUF9BRERfTUVNQkVSU0hJUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9BRERfTUVNQkVSU0hJUCIsIElQX0FERF9NRU1CRVJTSElQKTsKKyNpZmRlZiAgSVBfQUREX01FTUJFUlNISVAKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfQUREX01FTUJFUlNISVAiLCBJUF9BRERfTUVNQkVSU0hJUCk7CiAjZW5kaWYKLSNpZmRlZglJUF9EUk9QX01FTUJFUlNISVAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfRFJPUF9NRU1CRVJTSElQIiwgSVBfRFJPUF9NRU1CRVJTSElQKTsKKyNpZmRlZiAgSVBfRFJPUF9NRU1CRVJTSElQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQX0RST1BfTUVNQkVSU0hJUCIsIElQX0RST1BfTUVNQkVSU0hJUCk7CiAjZW5kaWYKLSNpZmRlZglJUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMIiwKLQkJCQlJUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwpOworI2lmZGVmICBJUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUF9ERUZBVUxUX01VTFRJQ0FTVF9UVEwpOwogI2VuZGlmCi0jaWZkZWYJSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QIiwKLQkJCQlJUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QKTsKKyNpZmRlZiAgSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUF9ERUZBVUxUX01VTFRJQ0FTVF9MT09QKTsKICNlbmRpZgotI2lmZGVmCUlQX01BWF9NRU1CRVJTSElQUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUF9NQVhfTUVNQkVSU0hJUFMiLCBJUF9NQVhfTUVNQkVSU0hJUFMpOworI2lmZGVmICBJUF9NQVhfTUVNQkVSU0hJUFMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBfTUFYX01FTUJFUlNISVBTIiwgSVBfTUFYX01FTUJFUlNISVBTKTsKICNlbmRpZgogCi0JLyogSVB2NiBbZ3NdZXRzb2Nrb3B0IG9wdGlvbnMsIGRlZmluZWQgaW4gUkZDMjU1MyAqLwotI2lmZGVmCUlQVjZfSk9JTl9HUk9VUAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0pPSU5fR1JPVVAiLCBJUFY2X0pPSU5fR1JPVVApOworICAgIC8qIElQdjYgW2dzXWV0c29ja29wdCBvcHRpb25zLCBkZWZpbmVkIGluIFJGQzI1NTMgKi8KKyNpZmRlZiAgSVBWNl9KT0lOX0dST1VQCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfSk9JTl9HUk9VUCIsIElQVjZfSk9JTl9HUk9VUCk7CiAjZW5kaWYKLSNpZmRlZglJUFY2X0xFQVZFX0dST1VQCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfTEVBVkVfR1JPVVAiLCBJUFY2X0xFQVZFX0dST1VQKTsKKyNpZmRlZiAgSVBWNl9MRUFWRV9HUk9VUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0xFQVZFX0dST1VQIiwgSVBWNl9MRUFWRV9HUk9VUCk7CiAjZW5kaWYKLSNpZmRlZglJUFY2X01VTFRJQ0FTVF9IT1BTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfTVVMVElDQVNUX0hPUFMiLCBJUFY2X01VTFRJQ0FTVF9IT1BTKTsKKyNpZmRlZiAgSVBWNl9NVUxUSUNBU1RfSE9QUworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X01VTFRJQ0FTVF9IT1BTIiwgSVBWNl9NVUxUSUNBU1RfSE9QUyk7CiAjZW5kaWYKLSNpZmRlZglJUFY2X01VTFRJQ0FTVF9JRgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X01VTFRJQ0FTVF9JRiIsIElQVjZfTVVMVElDQVNUX0lGKTsKKyNpZmRlZiAgSVBWNl9NVUxUSUNBU1RfSUYKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9NVUxUSUNBU1RfSUYiLCBJUFY2X01VTFRJQ0FTVF9JRik7CiAjZW5kaWYKLSNpZmRlZglJUFY2X01VTFRJQ0FTVF9MT09QCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfTVVMVElDQVNUX0xPT1AiLCBJUFY2X01VTFRJQ0FTVF9MT09QKTsKKyNpZmRlZiAgSVBWNl9NVUxUSUNBU1RfTE9PUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X01VTFRJQ0FTVF9MT09QIiwgSVBWNl9NVUxUSUNBU1RfTE9PUCk7CiAjZW5kaWYKLSNpZmRlZglJUFY2X1VOSUNBU1RfSE9QUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1VOSUNBU1RfSE9QUyIsIElQVjZfVU5JQ0FTVF9IT1BTKTsKKyNpZmRlZiAgSVBWNl9VTklDQVNUX0hPUFMKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9VTklDQVNUX0hPUFMiLCBJUFY2X1VOSUNBU1RfSE9QUyk7CiAjZW5kaWYKLSAgICAgICAgLyogQWRkaXRpb25hbCBJUFY2IHNvY2tldCBvcHRpb25zLCBkZWZpbmVkIGluIFJGQyAzNDkzICovCisgICAgLyogQWRkaXRpb25hbCBJUFY2IHNvY2tldCBvcHRpb25zLCBkZWZpbmVkIGluIFJGQyAzNDkzICovCiAjaWZkZWYgSVBWNl9WNk9OTFkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9WNk9OTFkiLCBJUFY2X1Y2T05MWSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfVjZPTkxZIiwgSVBWNl9WNk9OTFkpOwogI2VuZGlmCi0JLyogQWR2YW5jZWQgSVBWNiBzb2NrZXQgb3B0aW9ucywgZnJvbSBSRkMgMzU0MiAqLworICAgIC8qIEFkdmFuY2VkIElQVjYgc29ja2V0IG9wdGlvbnMsIGZyb20gUkZDIDM1NDIgKi8KICNpZmRlZiBJUFY2X0NIRUNLU1VNCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfQ0hFQ0tTVU0iLCBJUFY2X0NIRUNLU1VNKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9DSEVDS1NVTSIsIElQVjZfQ0hFQ0tTVU0pOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9ET05URlJBRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0RPTlRGUkFHIiwgSVBWNl9ET05URlJBRyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfRE9OVEZSQUciLCBJUFY2X0RPTlRGUkFHKTsKICNlbmRpZgogI2lmZGVmIElQVjZfRFNUT1BUUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0RTVE9QVFMiLCBJUFY2X0RTVE9QVFMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0RTVE9QVFMiLCBJUFY2X0RTVE9QVFMpOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9IT1BMSU1JVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0hPUExJTUlUIiwgSVBWNl9IT1BMSU1JVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfSE9QTElNSVQiLCBJUFY2X0hPUExJTUlUKTsKICNlbmRpZgogI2lmZGVmIElQVjZfSE9QT1BUUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0hPUE9QVFMiLCBJUFY2X0hPUE9QVFMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X0hPUE9QVFMiLCBJUFY2X0hPUE9QVFMpOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9ORVhUSE9QCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfTkVYVEhPUCIsIElQVjZfTkVYVEhPUCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfTkVYVEhPUCIsIElQVjZfTkVYVEhPUCk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1BBVEhNVFUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9QQVRITVRVIiwgSVBWNl9QQVRITVRVKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9QQVRITVRVIiwgSVBWNl9QQVRITVRVKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUEtUSU5GTwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1BLVElORk8iLCBJUFY2X1BLVElORk8pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1BLVElORk8iLCBJUFY2X1BLVElORk8pOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9SRUNWRFNUT1BUUwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZEU1RPUFRTIiwgSVBWNl9SRUNWRFNUT1BUUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVkRTVE9QVFMiLCBJUFY2X1JFQ1ZEU1RPUFRTKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUkVDVkhPUExJTUlUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVkhPUExJTUlUIiwgSVBWNl9SRUNWSE9QTElNSVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZIT1BMSU1JVCIsIElQVjZfUkVDVkhPUExJTUlUKTsKICNlbmRpZgogI2lmZGVmIElQVjZfUkVDVkhPUE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWSE9QT1BUUyIsIElQVjZfUkVDVkhPUE9QVFMpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZIT1BPUFRTIiwgSVBWNl9SRUNWSE9QT1BUUyk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1JFQ1ZQS1RJTkZPCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVlBLVElORk8iLCBJUFY2X1JFQ1ZQS1RJTkZPKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWUEtUSU5GTyIsIElQVjZfUkVDVlBLVElORk8pOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9SRUNWUlRIRFIKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SRUNWUlRIRFIiLCBJUFY2X1JFQ1ZSVEhEUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVlJUSERSIiwgSVBWNl9SRUNWUlRIRFIpOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9SRUNWVENMQVNTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVlRDTEFTUyIsIElQVjZfUkVDVlRDTEFTUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVlRDTEFTUyIsIElQVjZfUkVDVlRDTEFTUyk7CiAjZW5kaWYKICNpZmRlZiBJUFY2X1JUSERSCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUlRIRFIiLCBJUFY2X1JUSERSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SVEhEUiIsIElQVjZfUlRIRFIpOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9SVEhEUkRTVE9QVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SVEhEUkRTVE9QVFMiLCBJUFY2X1JUSERSRFNUT1BUUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUlRIRFJEU1RPUFRTIiwgSVBWNl9SVEhEUkRTVE9QVFMpOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9SVEhEUl9UWVBFXzAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9SVEhEUl9UWVBFXzAiLCBJUFY2X1JUSERSX1RZUEVfMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUlRIRFJfVFlQRV8wIiwgSVBWNl9SVEhEUl9UWVBFXzApOwogI2VuZGlmCiAjaWZkZWYgSVBWNl9SRUNWUEFUSE1UVQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1JFQ1ZQQVRITVRVIiwgSVBWNl9SRUNWUEFUSE1UVSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfUkVDVlBBVEhNVFUiLCBJUFY2X1JFQ1ZQQVRITVRVKTsKICNlbmRpZgogI2lmZGVmIElQVjZfVENMQVNTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIklQVjZfVENMQVNTIiwgSVBWNl9UQ0xBU1MpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1RDTEFTUyIsIElQVjZfVENMQVNTKTsKICNlbmRpZgogI2lmZGVmIElQVjZfVVNFX01JTl9NVFUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiSVBWNl9VU0VfTUlOX01UVSIsIElQVjZfVVNFX01JTl9NVFUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFY2X1VTRV9NSU5fTVRVIiwgSVBWNl9VU0VfTUlOX01UVSk7CiAjZW5kaWYKIAotCS8qIFRDUCBvcHRpb25zICovCi0jaWZkZWYJVENQX05PREVMQVkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX05PREVMQVkiLCBUQ1BfTk9ERUxBWSk7CisgICAgLyogVENQIG9wdGlvbnMgKi8KKyNpZmRlZiAgVENQX05PREVMQVkKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX05PREVMQVkiLCBUQ1BfTk9ERUxBWSk7CiAjZW5kaWYKLSNpZmRlZglUQ1BfTUFYU0VHCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9NQVhTRUciLCBUQ1BfTUFYU0VHKTsKKyNpZmRlZiAgVENQX01BWFNFRworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfTUFYU0VHIiwgVENQX01BWFNFRyk7CiAjZW5kaWYKLSNpZmRlZglUQ1BfQ09SSwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfQ09SSyIsIFRDUF9DT1JLKTsKKyNpZmRlZiAgVENQX0NPUksKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0NPUksiLCBUQ1BfQ09SSyk7CiAjZW5kaWYKLSNpZmRlZglUQ1BfS0VFUElETEUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0tFRVBJRExFIiwgVENQX0tFRVBJRExFKTsKKyNpZmRlZiAgVENQX0tFRVBJRExFCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9LRUVQSURMRSIsIFRDUF9LRUVQSURMRSk7CiAjZW5kaWYKLSNpZmRlZglUQ1BfS0VFUElOVFZMCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9LRUVQSU5UVkwiLCBUQ1BfS0VFUElOVFZMKTsKKyNpZmRlZiAgVENQX0tFRVBJTlRWTAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfS0VFUElOVFZMIiwgVENQX0tFRVBJTlRWTCk7CiAjZW5kaWYKLSNpZmRlZglUQ1BfS0VFUENOVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfS0VFUENOVCIsIFRDUF9LRUVQQ05UKTsKKyNpZmRlZiAgVENQX0tFRVBDTlQKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0tFRVBDTlQiLCBUQ1BfS0VFUENOVCk7CiAjZW5kaWYKLSNpZmRlZglUQ1BfU1lOQ05UCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9TWU5DTlQiLCBUQ1BfU1lOQ05UKTsKKyNpZmRlZiAgVENQX1NZTkNOVAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfU1lOQ05UIiwgVENQX1NZTkNOVCk7CiAjZW5kaWYKLSNpZmRlZglUQ1BfTElOR0VSMgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfTElOR0VSMiIsIFRDUF9MSU5HRVIyKTsKKyNpZmRlZiAgVENQX0xJTkdFUjIKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0xJTkdFUjIiLCBUQ1BfTElOR0VSMik7CiAjZW5kaWYKLSNpZmRlZglUQ1BfREVGRVJfQUNDRVBUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9ERUZFUl9BQ0NFUFQiLCBUQ1BfREVGRVJfQUNDRVBUKTsKKyNpZmRlZiAgVENQX0RFRkVSX0FDQ0VQVAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfREVGRVJfQUNDRVBUIiwgVENQX0RFRkVSX0FDQ0VQVCk7CiAjZW5kaWYKLSNpZmRlZglUQ1BfV0lORE9XX0NMQU1QCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9XSU5ET1dfQ0xBTVAiLCBUQ1BfV0lORE9XX0NMQU1QKTsKKyNpZmRlZiAgVENQX1dJTkRPV19DTEFNUAorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfV0lORE9XX0NMQU1QIiwgVENQX1dJTkRPV19DTEFNUCk7CiAjZW5kaWYKLSNpZmRlZglUQ1BfSU5GTwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUQ1BfSU5GTyIsIFRDUF9JTkZPKTsKKyNpZmRlZiAgVENQX0lORk8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX0lORk8iLCBUQ1BfSU5GTyk7CiAjZW5kaWYKLSNpZmRlZglUQ1BfUVVJQ0tBQ0sKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVENQX1FVSUNLQUNLIiwgVENQX1FVSUNLQUNLKTsKKyNpZmRlZiAgVENQX1FVSUNLQUNLCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRDUF9RVUlDS0FDSyIsIFRDUF9RVUlDS0FDSyk7CiAjZW5kaWYKIAogCi0JLyogSVBYIG9wdGlvbnMgKi8KLSNpZmRlZglJUFhfVFlQRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFhfVFlQRSIsIElQWF9UWVBFKTsKKyAgICAvKiBJUFggb3B0aW9ucyAqLworI2lmZGVmICBJUFhfVFlQRQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJJUFhfVFlQRSIsIElQWF9UWVBFKTsKICNlbmRpZgogCi0JLyogZ2V0e2FkZHIsbmFtZX1pbmZvIHBhcmFtZXRlcnMgKi8KKyAgICAvKiBnZXR7YWRkcixuYW1lfWluZm8gcGFyYW1ldGVycyAqLwogI2lmZGVmIEVBSV9BRERSRkFNSUxZCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9BRERSRkFNSUxZIiwgRUFJX0FERFJGQU1JTFkpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfQUREUkZBTUlMWSIsIEVBSV9BRERSRkFNSUxZKTsKICNlbmRpZgogI2lmZGVmIEVBSV9BR0FJTgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfQUdBSU4iLCBFQUlfQUdBSU4pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfQUdBSU4iLCBFQUlfQUdBSU4pOwogI2VuZGlmCiAjaWZkZWYgRUFJX0JBREZMQUdTCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9CQURGTEFHUyIsIEVBSV9CQURGTEFHUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9CQURGTEFHUyIsIEVBSV9CQURGTEFHUyk7CiAjZW5kaWYKICNpZmRlZiBFQUlfRkFJTAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfRkFJTCIsIEVBSV9GQUlMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0ZBSUwiLCBFQUlfRkFJTCk7CiAjZW5kaWYKICNpZmRlZiBFQUlfRkFNSUxZCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9GQU1JTFkiLCBFQUlfRkFNSUxZKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0ZBTUlMWSIsIEVBSV9GQU1JTFkpOwogI2VuZGlmCiAjaWZkZWYgRUFJX01FTU9SWQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfTUVNT1JZIiwgRUFJX01FTU9SWSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9NRU1PUlkiLCBFQUlfTUVNT1JZKTsKICNlbmRpZgogI2lmZGVmIEVBSV9OT0RBVEEKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX05PREFUQSIsIEVBSV9OT0RBVEEpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfTk9EQVRBIiwgRUFJX05PREFUQSk7CiAjZW5kaWYKICNpZmRlZiBFQUlfTk9OQU1FCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9OT05BTUUiLCBFQUlfTk9OQU1FKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX05PTkFNRSIsIEVBSV9OT05BTUUpOwogI2VuZGlmCiAjaWZkZWYgRUFJX09WRVJGTE9XCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9PVkVSRkxPVyIsIEVBSV9PVkVSRkxPVyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9PVkVSRkxPVyIsIEVBSV9PVkVSRkxPVyk7CiAjZW5kaWYKICNpZmRlZiBFQUlfU0VSVklDRQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfU0VSVklDRSIsIEVBSV9TRVJWSUNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1NFUlZJQ0UiLCBFQUlfU0VSVklDRSk7CiAjZW5kaWYKICNpZmRlZiBFQUlfU09DS1RZUEUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1NPQ0tUWVBFIiwgRUFJX1NPQ0tUWVBFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1NPQ0tUWVBFIiwgRUFJX1NPQ0tUWVBFKTsKICNlbmRpZgogI2lmZGVmIEVBSV9TWVNURU0KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX1NZU1RFTSIsIEVBSV9TWVNURU0pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfU1lTVEVNIiwgRUFJX1NZU1RFTSk7CiAjZW5kaWYKICNpZmRlZiBFQUlfQkFESElOVFMKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0JBREhJTlRTIiwgRUFJX0JBREhJTlRTKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRUFJX0JBREhJTlRTIiwgRUFJX0JBREhJTlRTKTsKICNlbmRpZgogI2lmZGVmIEVBSV9QUk9UT0NPTAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfUFJPVE9DT0wiLCBFQUlfUFJPVE9DT0wpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfUFJPVE9DT0wiLCBFQUlfUFJPVE9DT0wpOwogI2VuZGlmCiAjaWZkZWYgRUFJX01BWAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJFQUlfTUFYIiwgRUFJX01BWCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkVBSV9NQVgiLCBFQUlfTUFYKTsKICNlbmRpZgogI2lmZGVmIEFJX1BBU1NJVkUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfUEFTU0lWRSIsIEFJX1BBU1NJVkUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9QQVNTSVZFIiwgQUlfUEFTU0lWRSk7CiAjZW5kaWYKICNpZmRlZiBBSV9DQU5PTk5BTUUKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfQ0FOT05OQU1FIiwgQUlfQ0FOT05OQU1FKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfQ0FOT05OQU1FIiwgQUlfQ0FOT05OQU1FKTsKICNlbmRpZgogI2lmZGVmIEFJX05VTUVSSUNIT1NUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX05VTUVSSUNIT1NUIiwgQUlfTlVNRVJJQ0hPU1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9OVU1FUklDSE9TVCIsIEFJX05VTUVSSUNIT1NUKTsKICNlbmRpZgogI2lmZGVmIEFJX05VTUVSSUNTRVJWCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX05VTUVSSUNTRVJWIiwgQUlfTlVNRVJJQ1NFUlYpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9OVU1FUklDU0VSViIsIEFJX05VTUVSSUNTRVJWKTsKICNlbmRpZgogI2lmZGVmIEFJX01BU0sKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfTUFTSyIsIEFJX01BU0spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9NQVNLIiwgQUlfTUFTSyk7CiAjZW5kaWYKICNpZmRlZiBBSV9BTEwKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfQUxMIiwgQUlfQUxMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfQUxMIiwgQUlfQUxMKTsKICNlbmRpZgogI2lmZGVmIEFJX1Y0TUFQUEVEX0NGRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9WNE1BUFBFRF9DRkciLCBBSV9WNE1BUFBFRF9DRkcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9WNE1BUFBFRF9DRkciLCBBSV9WNE1BUFBFRF9DRkcpOwogI2VuZGlmCiAjaWZkZWYgQUlfQUREUkNPTkZJRwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9BRERSQ09ORklHIiwgQUlfQUREUkNPTkZJRyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX0FERFJDT05GSUciLCBBSV9BRERSQ09ORklHKTsKICNlbmRpZgogI2lmZGVmIEFJX1Y0TUFQUEVECi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkFJX1Y0TUFQUEVEIiwgQUlfVjRNQVBQRUQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9WNE1BUFBFRCIsIEFJX1Y0TUFQUEVEKTsKICNlbmRpZgogI2lmZGVmIEFJX0RFRkFVTFQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiQUlfREVGQVVMVCIsIEFJX0RFRkFVTFQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJBSV9ERUZBVUxUIiwgQUlfREVGQVVMVCk7CiAjZW5kaWYKICNpZmRlZiBOSV9NQVhIT1NUCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX01BWEhPU1QiLCBOSV9NQVhIT1NUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTUFYSE9TVCIsIE5JX01BWEhPU1QpOwogI2VuZGlmCiAjaWZkZWYgTklfTUFYU0VSVgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9NQVhTRVJWIiwgTklfTUFYU0VSVik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX01BWFNFUlYiLCBOSV9NQVhTRVJWKTsKICNlbmRpZgogI2lmZGVmIE5JX05PRlFETgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9OT0ZRRE4iLCBOSV9OT0ZRRE4pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJOSV9OT0ZRRE4iLCBOSV9OT0ZRRE4pOwogI2VuZGlmCiAjaWZkZWYgTklfTlVNRVJJQ0hPU1QKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTlVNRVJJQ0hPU1QiLCBOSV9OVU1FUklDSE9TVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX05VTUVSSUNIT1NUIiwgTklfTlVNRVJJQ0hPU1QpOwogI2VuZGlmCiAjaWZkZWYgTklfTkFNRVJFUUQKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTkFNRVJFUUQiLCBOSV9OQU1FUkVRRCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX05BTUVSRVFEIiwgTklfTkFNRVJFUUQpOwogI2VuZGlmCiAjaWZkZWYgTklfTlVNRVJJQ1NFUlYKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfTlVNRVJJQ1NFUlYiLCBOSV9OVU1FUklDU0VSVik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX05VTUVSSUNTRVJWIiwgTklfTlVNRVJJQ1NFUlYpOwogI2VuZGlmCiAjaWZkZWYgTklfREdSQU0KLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTklfREdSQU0iLCBOSV9ER1JBTSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk5JX0RHUkFNIiwgTklfREdSQU0pOwogI2VuZGlmCiAKLQkvKiBzaHV0ZG93bigpIHBhcmFtZXRlcnMgKi8KKyAgICAvKiBzaHV0ZG93bigpIHBhcmFtZXRlcnMgKi8KICNpZmRlZiBTSFVUX1JECi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkQiLCBTSFVUX1JEKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRCIsIFNIVVRfUkQpOwogI2VsaWYgZGVmaW5lZChTRF9SRUNFSVZFKQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEIiwgU0RfUkVDRUlWRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkQiLCBTRF9SRUNFSVZFKTsKICNlbHNlCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfUkQiLCAwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRCIsIDApOwogI2VuZGlmCiAjaWZkZWYgU0hVVF9XUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1dSIiwgU0hVVF9XUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfV1IiLCBTSFVUX1dSKTsKICNlbGlmIGRlZmluZWQoU0RfU0VORCkKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9XUiIsIFNEX1NFTkQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1dSIiwgU0RfU0VORCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1dSIiwgMSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNIVVRfV1IiLCAxKTsKICNlbmRpZgogI2lmZGVmIFNIVVRfUkRXUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEV1IiLCBTSFVUX1JEV1IpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEV1IiLCBTSFVUX1JEV1IpOwogI2VsaWYgZGVmaW5lZChTRF9CT1RIKQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEV1IiLCBTRF9CT1RIKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRFdSIiwgU0RfQk9USCk7CiAjZWxzZQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTSFVUX1JEV1IiLCAyKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiU0hVVF9SRFdSIiwgMik7CiAjZW5kaWYKIAogI2lmZGVmIFNJT19SQ1ZBTEwKLQl7Ci0JCVB5T2JqZWN0ICp0bXA7Ci0JCXRtcCA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKFNJT19SQ1ZBTEwpOwotCQlpZiAodG1wID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0lPX1JDVkFMTCIsIHRtcCk7Ci0JfQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfT0ZGIiwgUkNWQUxMX09GRik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJDVkFMTF9PTiIsIFJDVkFMTF9PTik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJDVkFMTF9TT0NLRVRMRVZFTE9OTFkiLCBSQ1ZBTExfU09DS0VUTEVWRUxPTkxZKTsKKyAgICB7CisgICAgICAgIFB5T2JqZWN0ICp0bXA7CisgICAgICAgIHRtcCA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKFNJT19SQ1ZBTEwpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0lPX1JDVkFMTCIsIHRtcCk7CisgICAgfQorICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfT0ZGIiwgUkNWQUxMX09GRik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJDVkFMTF9PTiIsIFJDVkFMTF9PTik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJDVkFMTF9TT0NLRVRMRVZFTE9OTFkiLCBSQ1ZBTExfU09DS0VUTEVWRUxPTkxZKTsKICNpZmRlZiBSQ1ZBTExfSVBMRVZFTAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJSQ1ZBTExfSVBMRVZFTCIsIFJDVkFMTF9JUExFVkVMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkNWQUxMX0lQTEVWRUwiLCBSQ1ZBTExfSVBMRVZFTCk7CiAjZW5kaWYKICNpZmRlZiBSQ1ZBTExfTUFYCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlJDVkFMTF9NQVgiLCBSQ1ZBTExfTUFYKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUkNWQUxMX01BWCIsIFJDVkFMTF9NQVgpOwogI2VuZGlmCiAjZW5kaWYgLyogX01TVENQSVBfICovCiAKLQkvKiBJbml0aWFsaXplIGdldGhvc3RieW5hbWUgbG9jayAqLworICAgIC8qIEluaXRpYWxpemUgZ2V0aG9zdGJ5bmFtZSBsb2NrICovCiAjaWYgZGVmaW5lZChVU0VfR0VUSE9TVEJZTkFNRV9MT0NLKSB8fCBkZWZpbmVkKFVTRV9HRVRBRERSSU5GT19MT0NLKQotCW5ldGRiX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgbmV0ZGJfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKICNlbmRpZgogfQogCkBAIC01MjkxLDM0ICs1MjkxLDM0IEBACiBpbnQKIGluZXRfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIgKnNyYywgdm9pZCAqZHN0KQogewotCWlmIChhZiA9PSBBRl9JTkVUKSB7CisgICAgaWYgKGFmID09IEFGX0lORVQpIHsKICNpZiAoU0laRU9GX0lOVCAhPSA0KQogI2Vycm9yICJOb3Qgc3VyZSBpZiBpbl9hZGRyX3QgZXhpc3RzIGFuZCBpbnQgaXMgbm90IDMyLWJpdHMuIgogI2VuZGlmCi0JCXVuc2lnbmVkIGludCBwYWNrZWRfYWRkcjsKLQkJcGFja2VkX2FkZHIgPSBpbmV0X2FkZHIoc3JjKTsKLQkJaWYgKHBhY2tlZF9hZGRyID09IElOQUREUl9OT05FKQotCQkJcmV0dXJuIDA7Ci0JCW1lbWNweShkc3QsICZwYWNrZWRfYWRkciwgNCk7Ci0JCXJldHVybiAxOwotCX0KLQkvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVBRk5PU1VQUE9SVCAqLwotCXJldHVybiAtMTsKKyAgICAgICAgdW5zaWduZWQgaW50IHBhY2tlZF9hZGRyOworICAgICAgICBwYWNrZWRfYWRkciA9IGluZXRfYWRkcihzcmMpOworICAgICAgICBpZiAocGFja2VkX2FkZHIgPT0gSU5BRERSX05PTkUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgbWVtY3B5KGRzdCwgJnBhY2tlZF9hZGRyLCA0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIC8qIFNob3VsZCBzZXQgZXJybm8gdG8gRUFGTk9TVVBQT1JUICovCisgICAgcmV0dXJuIC0xOwogfQogCiBjb25zdCBjaGFyICoKIGluZXRfbnRvcChpbnQgYWYsIGNvbnN0IHZvaWQgKnNyYywgY2hhciAqZHN0LCBzb2NrbGVuX3Qgc2l6ZSkKIHsKLQlpZiAoYWYgPT0gQUZfSU5FVCkgewotCQlzdHJ1Y3QgaW5fYWRkciBwYWNrZWRfYWRkcjsKLQkJaWYgKHNpemUgPCAxNikKLQkJCS8qIFNob3VsZCBzZXQgZXJybm8gdG8gRU5PU1BDLiAqLwotCQkJcmV0dXJuIE5VTEw7Ci0JCW1lbWNweSgmcGFja2VkX2FkZHIsIHNyYywgc2l6ZW9mKHBhY2tlZF9hZGRyKSk7Ci0JCXJldHVybiBzdHJuY3B5KGRzdCwgaW5ldF9udG9hKHBhY2tlZF9hZGRyKSwgc2l6ZSk7Ci0JfQotCS8qIFNob3VsZCBzZXQgZXJybm8gdG8gRUFGTk9TVVBQT1JUICovCi0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGFmID09IEFGX0lORVQpIHsKKyAgICAgICAgc3RydWN0IGluX2FkZHIgcGFja2VkX2FkZHI7CisgICAgICAgIGlmIChzaXplIDwgMTYpCisgICAgICAgICAgICAvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVOT1NQQy4gKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBtZW1jcHkoJnBhY2tlZF9hZGRyLCBzcmMsIHNpemVvZihwYWNrZWRfYWRkcikpOworICAgICAgICByZXR1cm4gc3RybmNweShkc3QsIGluZXRfbnRvYShwYWNrZWRfYWRkciksIHNpemUpOworICAgIH0KKyAgICAvKiBTaG91bGQgc2V0IGVycm5vIHRvIEVBRk5PU1VQUE9SVCAqLworICAgIHJldHVybiBOVUxMOwogfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmggYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5oCmluZGV4IGVmOGQwZmMuLjliODU3NzMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmgKKysrIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuaApAQCAtMTcsNyArMTcsNyBAQAogIyBpbmNsdWRlIDx3czJ0Y3BpcC5oPgogLyogVkM2IGlzIHNoaXBwZWQgd2l0aCBvbGQgcGxhdGZvcm0gaGVhZGVycywgYW5kIGRvZXMgbm90IGhhdmUgTVNUY3BJUC5oCiAgKiBTZXBhcmF0ZSBTREtzIGhhdmUgYWxsIHRoZSBmdW5jdGlvbnMgd2Ugd2FudCwgYnV0IG9sZGVyIG9uZXMgZG9uJ3QgaGF2ZQotICogYW55IHZlcnNpb24gaW5mb3JtYXRpb24uIAorICogYW55IHZlcnNpb24gaW5mb3JtYXRpb24uCiAgKiBJIHVzZSBTSU9fR0VUX01VTFRJQ0FTVF9GSUxURVIgdG8gZGV0ZWN0IGEgZGVjZW50IFNESy4KICAqLwogIyBpZmRlZiBTSU9fR0VUX01VTFRJQ0FTVF9GSUxURVIKQEAgLTc2LDQzICs3Niw0MyBAQAogI2VuZGlmCiAKIC8qIFB5dGhvbiBtb2R1bGUgYW5kIEMgQVBJIG5hbWUgKi8KLSNkZWZpbmUgUHlTb2NrZXRfTU9EVUxFX05BTUUJIl9zb2NrZXQiCi0jZGVmaW5lIFB5U29ja2V0X0NBUElfTkFNRQkiQ0FQSSIKKyNkZWZpbmUgUHlTb2NrZXRfTU9EVUxFX05BTUUgICAgIl9zb2NrZXQiCisjZGVmaW5lIFB5U29ja2V0X0NBUElfTkFNRSAgICAgICJDQVBJIgogCiAvKiBBYnN0cmFjdCB0aGUgc29ja2V0IGZpbGUgZGVzY3JpcHRvciB0eXBlICovCiAjaWZkZWYgTVNfV0lORE9XUwogdHlwZWRlZiBTT0NLRVQgU09DS0VUX1Q7Ci0jCWlmZGVmIE1TX1dJTjY0Ci0jCQlkZWZpbmUgU0laRU9GX1NPQ0tFVF9UIDgKLSMJZWxzZQotIwkJZGVmaW5lIFNJWkVPRl9TT0NLRVRfVCA0Ci0jCWVuZGlmCisjICAgICAgIGlmZGVmIE1TX1dJTjY0CisjICAgICAgICAgICAgICAgZGVmaW5lIFNJWkVPRl9TT0NLRVRfVCA4CisjICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgICBkZWZpbmUgU0laRU9GX1NPQ0tFVF9UIDQKKyMgICAgICAgZW5kaWYKICNlbHNlCiB0eXBlZGVmIGludCBTT0NLRVRfVDsKLSMJZGVmaW5lIFNJWkVPRl9TT0NLRVRfVCBTSVpFT0ZfSU5UCisjICAgICAgIGRlZmluZSBTSVpFT0ZfU09DS0VUX1QgU0laRU9GX0lOVAogI2VuZGlmCiAKIC8qIFNvY2tldCBhZGRyZXNzICovCiB0eXBlZGVmIHVuaW9uIHNvY2tfYWRkciB7Ci0Jc3RydWN0IHNvY2thZGRyX2luIGluOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBpbjsKICNpZmRlZiBBRl9VTklYCi0Jc3RydWN0IHNvY2thZGRyX3VuIHVuOworICAgIHN0cnVjdCBzb2NrYWRkcl91biB1bjsKICNlbmRpZgogI2lmZGVmIEFGX05FVExJTksKLQlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmw7CisgICAgc3RydWN0IHNvY2thZGRyX25sIG5sOwogI2VuZGlmCiAjaWZkZWYgRU5BQkxFX0lQVjYKLQlzdHJ1Y3Qgc29ja2FkZHJfaW42IGluNjsKLQlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzdG9yYWdlOworICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgaW42OworICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHN0b3JhZ2U7CiAjZW5kaWYKICNpZmRlZiBIQVZFX0JMVUVUT09USF9CTFVFVE9PVEhfSAotCXN0cnVjdCBzb2NrYWRkcl9sMiBidF9sMjsKLQlzdHJ1Y3Qgc29ja2FkZHJfcmMgYnRfcmM7Ci0Jc3RydWN0IHNvY2thZGRyX3NjbyBidF9zY287Ci0Jc3RydWN0IHNvY2thZGRyX2hjaSBidF9oY2k7CisgICAgc3RydWN0IHNvY2thZGRyX2wyIGJ0X2wyOworICAgIHN0cnVjdCBzb2NrYWRkcl9yYyBidF9yYzsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfc2NvIGJ0X3NjbzsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaGNpIGJ0X2hjaTsKICNlbmRpZgogI2lmZGVmIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9ICi0Jc3RydWN0IHNvY2thZGRyX2xsIGxsOworICAgIHN0cnVjdCBzb2NrYWRkcl9sbCBsbDsKICNlbmRpZgogfSBzb2NrX2FkZHJfdDsKIApAQCAtMTIxLDE2ICsxMjEsMTYgQEAKICAgIGFyZ3VtZW50cyBwcm9wZXJseS4gKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlTT0NLRVRfVCBzb2NrX2ZkOwkvKiBTb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCi0JaW50IHNvY2tfZmFtaWx5OwkvKiBBZGRyZXNzIGZhbWlseSwgZS5nLiwgQUZfSU5FVCAqLwotCWludCBzb2NrX3R5cGU7CQkvKiBTb2NrZXQgdHlwZSwgZS5nLiwgU09DS19TVFJFQU0gKi8KLQlpbnQgc29ja19wcm90bzsJCS8qIFByb3RvY29sIHR5cGUsIHVzdWFsbHkgMCAqLwotCVB5T2JqZWN0ICooKmVycm9yaGFuZGxlcikodm9pZCk7IC8qIEVycm9yIGhhbmRsZXI7IGNoZWNrcwotCQkJCQkgICAgZXJybm8sIHJldHVybnMgTlVMTCBhbmQKLQkJCQkJICAgIHNldHMgYSBQeXRob24gZXhjZXB0aW9uICovCi0JZG91YmxlIHNvY2tfdGltZW91dDsJCSAvKiBPcGVyYXRpb24gdGltZW91dCBpbiBzZWNvbmRzOwotCQkJCQkgICAgMC4wIG1lYW5zIG5vbi1ibG9ja2luZyAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBTT0NLRVRfVCBzb2NrX2ZkOyAgICAgICAgICAgLyogU29ja2V0IGZpbGUgZGVzY3JpcHRvciAqLworICAgIGludCBzb2NrX2ZhbWlseTsgICAgICAgICAgICAvKiBBZGRyZXNzIGZhbWlseSwgZS5nLiwgQUZfSU5FVCAqLworICAgIGludCBzb2NrX3R5cGU7ICAgICAgICAgICAgICAvKiBTb2NrZXQgdHlwZSwgZS5nLiwgU09DS19TVFJFQU0gKi8KKyAgICBpbnQgc29ja19wcm90bzsgICAgICAgICAgICAgLyogUHJvdG9jb2wgdHlwZSwgdXN1YWxseSAwICovCisgICAgUHlPYmplY3QgKigqZXJyb3JoYW5kbGVyKSh2b2lkKTsgLyogRXJyb3IgaGFuZGxlcjsgY2hlY2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8sIHJldHVybnMgTlVMTCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRzIGEgUHl0aG9uIGV4Y2VwdGlvbiAqLworICAgIGRvdWJsZSBzb2NrX3RpbWVvdXQ7ICAgICAgICAgICAgICAgICAvKiBPcGVyYXRpb24gdGltZW91dCBpbiBzZWNvbmRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCBtZWFucyBub24tYmxvY2tpbmcgKi8KIH0gUHlTb2NrZXRTb2NrT2JqZWN0OwogCiAvKiAtLS0gQyBBUEkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xMzgsNyArMTM4LDcgQEAKIC8qIFNob3J0IGV4cGxhbmF0aW9uIG9mIHdoYXQgdGhpcyBDIEFQSSBleHBvcnQgbWVjaGFuaXNtIGRvZXMKICAgIGFuZCBob3cgaXQgd29ya3M6CiAKLSAgICBUaGUgX3NzbCBtb2R1bGUgbmVlZHMgYWNjZXNzIHRvIHRoZSB0eXBlIG9iamVjdCBkZWZpbmVkIGluIAorICAgIFRoZSBfc3NsIG1vZHVsZSBuZWVkcyBhY2Nlc3MgdG8gdGhlIHR5cGUgb2JqZWN0IGRlZmluZWQgaW4KICAgICB0aGUgX3NvY2tldCBtb2R1bGUuIFNpbmNlIGNyb3NzLURMTCBsaW5raW5nIGludHJvZHVjZXMgYSBsb3Qgb2YKICAgICBwcm9ibGVtcyBvbiBtYW55IHBsYXRmb3JtcywgdGhlICJ0cmljayIgaXMgdG8gd3JhcCB0aGUKICAgICBDIEFQSSBvZiBhIG1vZHVsZSBpbiBhIHN0cnVjdCB3aGljaCB0aGVuIGdldHMgZXhwb3J0ZWQgdG8KQEAgLTE2MCwyNCArMTYwLDI0IEBACiAKICAgICBMb2FkIF9zb2NrZXQgbW9kdWxlIGFuZCBpdHMgQyBBUEk7IHRoaXMgc2V0cyB1cCB0aGUgZ2xvYmFsCiAgICAgUHlTb2NrZXRNb2R1bGU6Ci0gICAgCi0JaWYgKFB5U29ja2V0TW9kdWxlX0ltcG9ydE1vZHVsZUFuZEFQSSgpKQotCSAgICByZXR1cm47CisKKyAgICBpZiAoUHlTb2NrZXRNb2R1bGVfSW1wb3J0TW9kdWxlQW5kQVBJKCkpCisgICAgICAgIHJldHVybjsKIAogCiAgICAgTm93IHVzZSB0aGUgQyBBUEkgYXMgaWYgaXQgd2VyZSBkZWZpbmVkIGluIHRoZSB1c2luZwogICAgIG1vZHVsZToKIAotICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfHp6OnNzbCIsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXx6ejpzc2wiLAogCi0JCQkgICAgICBQeVNvY2tldE1vZHVsZS5Tb2NrX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U29ja2V0TW9kdWxlLlNvY2tfVHlwZSwKIAotCQkJICAgICAgKFB5T2JqZWN0KikmU29jaywKLQkJCSAgICAgICZrZXlfZmlsZSwgJmNlcnRfZmlsZSkpCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QqKSZTb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X2ZpbGUsICZjZXJ0X2ZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIFN1cHBvcnQgY291bGQgZWFzaWx5IGJlIGV4dGVuZGVkIHRvIGV4cG9ydCBtb3JlIEMgQVBJcy9zeW1ib2xzCi0gICAgdGhpcyB3YXkuIEN1cnJlbnRseSwgb25seSB0aGUgdHlwZSBvYmplY3QgaXMgZXhwb3J0ZWQsIAorICAgIHRoaXMgd2F5LiBDdXJyZW50bHksIG9ubHkgdGhlIHR5cGUgb2JqZWN0IGlzIGV4cG9ydGVkLAogICAgIG90aGVyIGNhbmRpZGF0ZXMgd291bGQgYmUgc29ja2V0IGNvbnN0cnVjdG9ycyBhbmQgc29ja2V0CiAgICAgYWNjZXNzIGZ1bmN0aW9ucy4KIApAQCAtMTg1LDEzICsxODUsMTMgQEAKIAogLyogQyBBUEkgZm9yIHVzYWdlIGJ5IG90aGVyIFB5dGhvbiBtb2R1bGVzICovCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlUeXBlT2JqZWN0ICpTb2NrX1R5cGU7Ci0gICAgICAgIFB5T2JqZWN0ICplcnJvcjsKKyAgICBQeVR5cGVPYmplY3QgKlNvY2tfVHlwZTsKKyAgICBQeU9iamVjdCAqZXJyb3I7CiB9IFB5U29ja2V0TW9kdWxlX0FQSU9iamVjdDsKIAogLyogWFhYIFRoZSBuZXQgZWZmZWN0IG9mIHRoZSBmb2xsb3dpbmcgYXBwZWFycyB0byBiZSB0byBkZWZpbmUgYSBmdW5jdGlvbgogICAgWFhYIG5hbWVkIFB5U29ja2V0TW9kdWxlX0FQSU9iamVjdCBpbiBfc3NsLmMuICBJdCdzIHVuY2xlYXIgd2h5IGl0IGlzbid0Ci0gICBYWFggZGVmaW5lZCB0aGVyZSBkaXJlY3RseS4gCisgICBYWFggZGVmaW5lZCB0aGVyZSBkaXJlY3RseS4KIAogICAgPj4+IEl0J3MgZGVmaW5lZCBoZXJlIGJlY2F1c2Ugb3RoZXIgbW9kdWxlcyBtaWdodCBhbHNvIHdhbnQgdG8gdXNlCiAgICA+Pj4gdGhlIEMgQVBJLgpAQCAtMjA3LDggKzIwNyw4IEBACiAKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8eno6c3NsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlTb2NrZXRNb2R1bGUuU29ja19UeXBlLCAoUHlPYmplY3QqKSZTb2NrLAotCSAJCSAma2V5X2ZpbGUsICZjZXJ0X2ZpbGUpKQotIAkgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV9maWxlLCAmY2VydF9maWxlKSkKKyAgICAgcmV0dXJuIE5VTEw7CiAgICAuLi4KICovCiAKQEAgLTIyNiwzNCArMjI2LDM0IEBACiBzdGF0aWMKIGludCBQeVNvY2tldE1vZHVsZV9JbXBvcnRNb2R1bGVBbmRBUEkodm9pZCkKIHsKLQlQeU9iamVjdCAqbW9kID0gMCwgKnYgPSAwOwotCWNoYXIgKmFwaW1vZHVsZSA9IFB5U29ja2V0X01PRFVMRV9OQU1FOwotCWNoYXIgKmFwaW5hbWUgPSBQeVNvY2tldF9DQVBJX05BTUU7Ci0Jdm9pZCAqYXBpOworICAgIFB5T2JqZWN0ICptb2QgPSAwLCAqdiA9IDA7CisgICAgY2hhciAqYXBpbW9kdWxlID0gUHlTb2NrZXRfTU9EVUxFX05BTUU7CisgICAgY2hhciAqYXBpbmFtZSA9IFB5U29ja2V0X0NBUElfTkFNRTsKKyAgICB2b2lkICphcGk7CiAKLQlEUFJJTlRGKCJJbXBvcnRpbmcgdGhlICVzIEMgQVBJLi4uXG4iLCBhcGltb2R1bGUpOwotCW1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soYXBpbW9kdWxlKTsKLQlpZiAobW9kID09IE5VTEwpCi0JCWdvdG8gb25FcnJvcjsKLQlEUFJJTlRGKCIgJXMgcGFja2FnZSBmb3VuZFxuIiwgYXBpbW9kdWxlKTsKLQl2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsIGFwaW5hbWUpOwotCWlmICh2ID09IE5VTEwpCi0JCWdvdG8gb25FcnJvcjsKLQlQeV9ERUNSRUYobW9kKTsKLQlEUFJJTlRGKCIgQVBJIG9iamVjdCAlcyBmb3VuZFxuIiwgYXBpbmFtZSk7Ci0JYXBpID0gUHlDT2JqZWN0X0FzVm9pZFB0cih2KTsKLQlpZiAoYXBpID09IE5VTEwpCi0JCWdvdG8gb25FcnJvcjsKLQlQeV9ERUNSRUYodik7Ci0JbWVtY3B5KCZQeVNvY2tldE1vZHVsZSwgYXBpLCBzaXplb2YoUHlTb2NrZXRNb2R1bGUpKTsKLQlEUFJJTlRGKCIgQVBJIG9iamVjdCBsb2FkZWQgYW5kIGluaXRpYWxpemVkLlxuIik7Ci0JcmV0dXJuIDA7CisgICAgRFBSSU5URigiSW1wb3J0aW5nIHRoZSAlcyBDIEFQSS4uLlxuIiwgYXBpbW9kdWxlKTsKKyAgICBtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKGFwaW1vZHVsZSk7CisgICAgaWYgKG1vZCA9PSBOVUxMKQorICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgRFBSSU5URigiICVzIHBhY2thZ2UgZm91bmRcbiIsIGFwaW1vZHVsZSk7CisgICAgdiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCBhcGluYW1lKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgUHlfREVDUkVGKG1vZCk7CisgICAgRFBSSU5URigiIEFQSSBvYmplY3QgJXMgZm91bmRcbiIsIGFwaW5hbWUpOworICAgIGFwaSA9IFB5Q09iamVjdF9Bc1ZvaWRQdHIodik7CisgICAgaWYgKGFwaSA9PSBOVUxMKQorICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgUHlfREVDUkVGKHYpOworICAgIG1lbWNweSgmUHlTb2NrZXRNb2R1bGUsIGFwaSwgc2l6ZW9mKFB5U29ja2V0TW9kdWxlKSk7CisgICAgRFBSSU5URigiIEFQSSBvYmplY3QgbG9hZGVkIGFuZCBpbml0aWFsaXplZC5cbiIpOworICAgIHJldHVybiAwOwogCiAgb25FcnJvcjoKLQlEUFJJTlRGKCIgbm90IGZvdW5kLlxuIik7Ci0JUHlfWERFQ1JFRihtb2QpOwotCVB5X1hERUNSRUYodik7Ci0JcmV0dXJuIC0xOworICAgIERQUklOVEYoIiBub3QgZm91bmQuXG4iKTsKKyAgICBQeV9YREVDUkVGKG1vZCk7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICByZXR1cm4gLTE7CiB9CiAKICNlbmRpZiAvKiAhUHlTb2NrZXRfQlVJTERJTkdfU09DS0VUICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCmluZGV4IGQzZjMwOWEuLjk1N2RlNTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3B3ZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCkBAIC0yNywxNiArMjcsMTYgQEAKICNpZiBkZWZpbmVkKEhBVkVfR0VUU1BOQU0pIHx8IGRlZmluZWQoSEFWRV9HRVRTUEVOVCkKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgc3RydWN0X3Nwd2RfdHlwZV9maWVsZHNbXSA9IHsKLQl7InNwX25hbSIsICJsb2dpbiBuYW1lIn0sCi0JeyJzcF9wd2QiLCAiZW5jcnlwdGVkIHBhc3N3b3JkIn0sCi0JeyJzcF9sc3RjaGciLCAiZGF0ZSBvZiBsYXN0IGNoYW5nZSJ9LAotCXsic3BfbWluIiwgIm1pbiAjZGF5cyBiZXR3ZWVuIGNoYW5nZXMifSwgCi0JeyJzcF9tYXgiLCAibWF4ICNkYXlzIGJldHdlZW4gY2hhbmdlcyJ9LCAKLQl7InNwX3dhcm4iLCAiI2RheXMgYmVmb3JlIHB3IGV4cGlyZXMgdG8gd2FybiB1c2VyIGFib3V0IGl0In0sIAotCXsic3BfaW5hY3QiLCAiI2RheXMgYWZ0ZXIgcHcgZXhwaXJlcyB1bnRpbCBhY2NvdW50IGlzIGJsb2NrZWQifSwKLQl7InNwX2V4cGlyZSIsICIjZGF5cyBzaW5jZSAxOTcwLTAxLTAxIHVudGlsIGFjY291bnQgaXMgZGlzYWJsZWQifSwKLQl7InNwX2ZsYWciLCAicmVzZXJ2ZWQifSwKLQl7MH0KKyAgICB7InNwX25hbSIsICJsb2dpbiBuYW1lIn0sCisgICAgeyJzcF9wd2QiLCAiZW5jcnlwdGVkIHBhc3N3b3JkIn0sCisgICAgeyJzcF9sc3RjaGciLCAiZGF0ZSBvZiBsYXN0IGNoYW5nZSJ9LAorICAgIHsic3BfbWluIiwgIm1pbiAjZGF5cyBiZXR3ZWVuIGNoYW5nZXMifSwKKyAgICB7InNwX21heCIsICJtYXggI2RheXMgYmV0d2VlbiBjaGFuZ2VzIn0sCisgICAgeyJzcF93YXJuIiwgIiNkYXlzIGJlZm9yZSBwdyBleHBpcmVzIHRvIHdhcm4gdXNlciBhYm91dCBpdCJ9LAorICAgIHsic3BfaW5hY3QiLCAiI2RheXMgYWZ0ZXIgcHcgZXhwaXJlcyB1bnRpbCBhY2NvdW50IGlzIGJsb2NrZWQifSwKKyAgICB7InNwX2V4cGlyZSIsICIjZGF5cyBzaW5jZSAxOTcwLTAxLTAxIHVudGlsIGFjY291bnQgaXMgZGlzYWJsZWQifSwKKyAgICB7InNwX2ZsYWciLCAicmVzZXJ2ZWQifSwKKyAgICB7MH0KIH07CiAKIFB5RG9jX1NUUlZBUihzdHJ1Y3Rfc3B3ZF9fZG9jX18sCkBAIC00NiwxMCArNDYsMTAgQEAKIG9yIHZpYSB0aGUgb2JqZWN0IGF0dHJpYnV0ZXMgYXMgbmFtZWQgaW4gdGhlIGFib3ZlIHR1cGxlLiIpOwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9EZXNjIHN0cnVjdF9zcHdkX3R5cGVfZGVzYyA9IHsKLQkic3B3ZC5zdHJ1Y3Rfc3B3ZCIsCi0Jc3RydWN0X3Nwd2RfX2RvY19fLAotCXN0cnVjdF9zcHdkX3R5cGVfZmllbGRzLAotCTksCisgICAgInNwd2Quc3RydWN0X3Nwd2QiLAorICAgIHN0cnVjdF9zcHdkX19kb2NfXywKKyAgICBzdHJ1Y3Rfc3B3ZF90eXBlX2ZpZWxkcywKKyAgICA5LAogfTsKIAogc3RhdGljIGludCBpbml0aWFsaXplZDsKQEAgLTYwLDQyICs2MCw0MiBAQAogc2V0cyhQeU9iamVjdCAqdiwgaW50IGksIGNoYXIqIHZhbCkKIHsKICAgaWYgKHZhbCkKLQkgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgaSwgUHlTdHJpbmdfRnJvbVN0cmluZyh2YWwpKTsKKyAgICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgaSwgUHlTdHJpbmdfRnJvbVN0cmluZyh2YWwpKTsKICAgZWxzZSB7Ci0JICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5X05vbmUpOwotCSAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeV9Ob25lKTsKKyAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKm1rc3BlbnQoc3RydWN0IHNwd2QgKnApCiB7Ci0JaW50IHNldEluZGV4ID0gMDsKLQlQeU9iamVjdCAqdiA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZTdHJ1Y3RTcHdkVHlwZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaW50IHNldEluZGV4ID0gMDsKKyAgICBQeU9iamVjdCAqdiA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZTdHJ1Y3RTcHdkVHlwZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNkZWZpbmUgU0VUSShpLHZhbCkgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCBpLCBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsKSkKICNkZWZpbmUgU0VUUyhpLHZhbCkgc2V0cyh2LCBpLCB2YWwpCiAKLQlTRVRTKHNldEluZGV4KyssIHAtPnNwX25hbXApOwotCVNFVFMoc2V0SW5kZXgrKywgcC0+c3BfcHdkcCk7Ci0JU0VUSShzZXRJbmRleCsrLCBwLT5zcF9sc3RjaGcpOwotCVNFVEkoc2V0SW5kZXgrKywgcC0+c3BfbWluKTsKLQlTRVRJKHNldEluZGV4KyssIHAtPnNwX21heCk7Ci0JU0VUSShzZXRJbmRleCsrLCBwLT5zcF93YXJuKTsKLQlTRVRJKHNldEluZGV4KyssIHAtPnNwX2luYWN0KTsKLQlTRVRJKHNldEluZGV4KyssIHAtPnNwX2V4cGlyZSk7Ci0JU0VUSShzZXRJbmRleCsrLCBwLT5zcF9mbGFnKTsKKyAgICBTRVRTKHNldEluZGV4KyssIHAtPnNwX25hbXApOworICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+c3BfcHdkcCk7CisgICAgU0VUSShzZXRJbmRleCsrLCBwLT5zcF9sc3RjaGcpOworICAgIFNFVEkoc2V0SW5kZXgrKywgcC0+c3BfbWluKTsKKyAgICBTRVRJKHNldEluZGV4KyssIHAtPnNwX21heCk7CisgICAgU0VUSShzZXRJbmRleCsrLCBwLT5zcF93YXJuKTsKKyAgICBTRVRJKHNldEluZGV4KyssIHAtPnNwX2luYWN0KTsKKyAgICBTRVRJKHNldEluZGV4KyssIHAtPnNwX2V4cGlyZSk7CisgICAgU0VUSShzZXRJbmRleCsrLCBwLT5zcF9mbGFnKTsKIAogI3VuZGVmIFNFVFMKICN1bmRlZiBTRVRJCiAKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiAjZW5kaWYgIC8qIEhBVkVfR0VUU1BOQU0gfHwgSEFWRV9HRVRTUEVOVCAqLwpAQCAtMTExLDE1ICsxMTEsMTUgQEAKIAogc3RhdGljIFB5T2JqZWN0KiBzcHdkX2dldHNwbmFtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCXN0cnVjdCBzcHdkICpwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpnZXRzcG5hbSIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChwID0gZ2V0c3BuYW0obmFtZSkpID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCAiZ2V0c3BuYW0oKTogbmFtZSBub3QgZm91bmQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBta3NwZW50KHApOworICAgIGNoYXIgKm5hbWU7CisgICAgc3RydWN0IHNwd2QgKnA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmdldHNwbmFtIiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHAgPSBnZXRzcG5hbShuYW1lKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJnZXRzcG5hbSgpOiBuYW1lIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1rc3BlbnQocCk7CiB9CiAKICNlbmRpZiAvKiBIQVZFX0dFVFNQTkFNICovCkBAIC0xMzUsNDkgKzEzNSw0OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwd2RfZ2V0c3BhbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpkOwotCXN0cnVjdCBzcHdkICpwOwotCWlmICgoZCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNldHNwZW50KCk7Ci0Jd2hpbGUgKChwID0gZ2V0c3BlbnQoKSkgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqdiA9IG1rc3BlbnQocCk7Ci0JCWlmICh2ID09IE5VTEwgfHwgUHlMaXN0X0FwcGVuZChkLCB2KSAhPSAwKSB7Ci0JCQlQeV9YREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKGQpOwotCQkJZW5kc3BlbnQoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JZW5kc3BlbnQoKTsKLQlyZXR1cm4gZDsKKyAgICBQeU9iamVjdCAqZDsKKyAgICBzdHJ1Y3Qgc3B3ZCAqcDsKKyAgICBpZiAoKGQgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRzcGVudCgpOworICAgIHdoaWxlICgocCA9IGdldHNwZW50KCkpICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBta3NwZW50KHApOworICAgICAgICBpZiAodiA9PSBOVUxMIHx8IFB5TGlzdF9BcHBlbmQoZCwgdikgIT0gMCkgeworICAgICAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkKTsKKyAgICAgICAgICAgIGVuZHNwZW50KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQorICAgIGVuZHNwZW50KCk7CisgICAgcmV0dXJuIGQ7CiB9CiAKICNlbmRpZiAvKiBIQVZFX0dFVFNQRU5UICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzcHdkX21ldGhvZHNbXSA9IHsKLSNpZmRlZiBIQVZFX0dFVFNQTkFNCQotCXsiZ2V0c3BuYW0iLAlzcHdkX2dldHNwbmFtLCBNRVRIX1ZBUkFSR1MsIHNwd2RfZ2V0c3BuYW1fX2RvY19ffSwKKyNpZmRlZiBIQVZFX0dFVFNQTkFNCisgICAgeyJnZXRzcG5hbSIsICAgICAgICBzcHdkX2dldHNwbmFtLCBNRVRIX1ZBUkFSR1MsIHNwd2RfZ2V0c3BuYW1fX2RvY19ffSwKICNlbmRpZgogI2lmZGVmIEhBVkVfR0VUU1BFTlQKLQl7ImdldHNwYWxsIiwJc3B3ZF9nZXRzcGFsbCwgTUVUSF9OT0FSR1MsIHNwd2RfZ2V0c3BhbGxfX2RvY19ffSwKKyAgICB7ImdldHNwYWxsIiwgICAgICAgIHNwd2RfZ2V0c3BhbGwsIE1FVEhfTk9BUkdTLCBzcHdkX2dldHNwYWxsX19kb2NfX30sCiAjZW5kaWYKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0c3B3ZCh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCW09UHlfSW5pdE1vZHVsZTMoInNwd2QiLCBzcHdkX21ldGhvZHMsIHNwd2RfX2RvY19fKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0U3B3ZFR5cGUsIAotCQkJCQkgICZzdHJ1Y3Rfc3B3ZF90eXBlX2Rlc2MpOwotCVB5X0lOQ1JFRigoUHlPYmplY3QgKikgJlN0cnVjdFNwd2RUeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInN0cnVjdF9zcHdkIiwgKFB5T2JqZWN0ICopICZTdHJ1Y3RTcHdkVHlwZSk7Ci0JaW5pdGlhbGl6ZWQgPSAxOworICAgIFB5T2JqZWN0ICptOworICAgIG09UHlfSW5pdE1vZHVsZTMoInNwd2QiLCBzcHdkX21ldGhvZHMsIHNwd2RfX2RvY19fKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0U3B3ZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cnVjdF9zcHdkX3R5cGVfZGVzYyk7CisgICAgUHlfSU5DUkVGKChQeU9iamVjdCAqKSAmU3RydWN0U3B3ZFR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3Nwd2QiLCAoUHlPYmplY3QgKikgJlN0cnVjdFNwd2RUeXBlKTsKKyAgICBpbml0aWFsaXplZCA9IDE7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3N0cm9wbW9kdWxlLmMgYi9Nb2R1bGVzL3N0cm9wbW9kdWxlLmMKaW5kZXggMmQ4ODQ3NC4uMDkwYjA3ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zdHJvcG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3Ryb3Btb2R1bGUuYwpAQCAtMTQsOCArMTQsOCBAQAogICAgWFhYIGFyZSBkZWZpbmVkIGZvciBhbGwgOC1iaXQgY2hhcmFjdGVycyEgKi8KIAogI2RlZmluZSBXQVJOIGlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgXAotCQkgICAgICAgInN0cm9wIGZ1bmN0aW9ucyBhcmUgb2Jzb2xldGU7IHVzZSBzdHJpbmcgbWV0aG9kcyIpKSBcCi0JICAgICByZXR1cm4gTlVMTAorICAgICAgICAgICAgICAgInN0cm9wIGZ1bmN0aW9ucyBhcmUgb2Jzb2xldGU7IHVzZSBzdHJpbmcgbWV0aG9kcyIpKSBcCisgICAgICAgICByZXR1cm4gTlVMTAogCiAvKiBUaGUgbHN0cmlwKCksIHJzdHJpcCgpIGFuZCBzdHJpcCgpIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQKICAgIGluIGRvX3N0cmlwKCksIHdoaWNoIHVzZXMgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIgdG8gaW5kaWNhdGUgd2hhdApAQCAtMjksNTYgKzI5LDU2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BsaXRfd2hpdGVzcGFjZShjaGFyICpzLCBQeV9zc2l6ZV90IGxlbiwgUHlfc3NpemVfdCBtYXhzcGxpdCkKIHsKLQlQeV9zc2l6ZV90IGkgPSAwLCBqOwotCWludCBlcnI7Ci0JUHlfc3NpemVfdCBjb3VudHNwbGl0ID0gMDsKLQlQeU9iamVjdCogaXRlbTsKLQlQeU9iamVjdCAqbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgUHlfc3NpemVfdCBpID0gMCwgajsKKyAgICBpbnQgZXJyOworICAgIFB5X3NzaXplX3QgY291bnRzcGxpdCA9IDA7CisgICAgUHlPYmplY3QqIGl0ZW07CisgICAgUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KDApOwogCi0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoaSA8IGxlbikgewotCQl3aGlsZSAoaSA8IGxlbiAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgewotCQkJaSA9IGkrMTsKLQkJfQotCQlqID0gaTsKLQkJd2hpbGUgKGkgPCBsZW4gJiYgIWlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7Ci0JCQlpID0gaSsxOwotCQl9Ci0JCWlmIChqIDwgaSkgewotCQkJaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraiwgaS1qKTsKLQkJCWlmIChpdGVtID09IE5VTEwpCi0JCQkJZ290byBmaW5hbGx5OworICAgIHdoaWxlIChpIDwgbGVuKSB7CisgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7CisgICAgICAgICAgICBpID0gaSsxOworICAgICAgICB9CisgICAgICAgIGogPSBpOworICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiAhaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpIHsKKyAgICAgICAgICAgIGkgPSBpKzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPCBpKSB7CisgICAgICAgICAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocytqLCBpLWopOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkJCWVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSk7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQljb3VudHNwbGl0Kys7Ci0JCQl3aGlsZSAoaSA8IGxlbiAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgewotCQkJCWkgPSBpKzE7Ci0JCQl9Ci0JCQlpZiAobWF4c3BsaXQgJiYgKGNvdW50c3BsaXQgPj0gbWF4c3BsaXQpICYmIGkgPCBsZW4pIHsKLQkJCQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcytpLCBsZW4gLSBpKTsKLQkJCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJCQlnb3RvIGZpbmFsbHk7CisgICAgICAgICAgICBjb3VudHNwbGl0Kys7CisgICAgICAgICAgICB3aGlsZSAoaSA8IGxlbiAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKHNbaV0pKSkgeworICAgICAgICAgICAgICAgIGkgPSBpKzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWF4c3BsaXQgJiYgKGNvdW50c3BsaXQgPj0gbWF4c3BsaXQpICYmIGkgPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgICAgIHMraSwgbGVuIC0gaSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQkJZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJaWYgKGVyciA8IDApCi0JCQkJCWdvdG8gZmluYWxseTsKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQkJaSA9IGxlbjsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gbGlzdDsKKyAgICAgICAgICAgICAgICBpID0gbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsaXN0OwogICBmaW5hbGx5OgotCVB5X0RFQ1JFRihsaXN0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtOTYsNjAgKzk2LDYwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3Bfc3BsaXRmaWVsZHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgbGVuLCBuLCBpLCBqLCBlcnI7Ci0JUHlfc3NpemVfdCBzcGxpdGNvdW50LCBtYXhzcGxpdDsKLQljaGFyICpzLCAqc3ViOwotCVB5T2JqZWN0ICpsaXN0LCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IGxlbiwgbiwgaSwgaiwgZXJyOworICAgIFB5X3NzaXplX3Qgc3BsaXRjb3VudCwgbWF4c3BsaXQ7CisgICAgY2hhciAqcywgKnN1YjsKKyAgICBQeU9iamVjdCAqbGlzdCwgKml0ZW07CiAKLQlXQVJOOwotCXN1YiA9IE5VTEw7Ci0JbiA9IDA7Ci0Jc3BsaXRjb3VudCA9IDA7Ci0JbWF4c3BsaXQgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN8eiNuOnNwbGl0IiwgJnMsICZsZW4sICZzdWIsICZuLCAmbWF4c3BsaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc3ViID09IE5VTEwpCi0JCXJldHVybiBzcGxpdF93aGl0ZXNwYWNlKHMsIGxlbiwgbWF4c3BsaXQpOwotCWlmIChuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzZXBhcmF0b3IiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFdBUk47CisgICAgc3ViID0gTlVMTDsKKyAgICBuID0gMDsKKyAgICBzcGxpdGNvdW50ID0gMDsKKyAgICBtYXhzcGxpdCA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3x6I246c3BsaXQiLCAmcywgJmxlbiwgJnN1YiwgJm4sICZtYXhzcGxpdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzdWIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIHNwbGl0X3doaXRlc3BhY2UocywgbGVuLCBtYXhzcGxpdCk7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHNlcGFyYXRvciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlsaXN0ID0gUHlMaXN0X05ldygwKTsKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWkgPSBqID0gMDsKLQl3aGlsZSAoaStuIDw9IGxlbikgewotCQlpZiAoc1tpXSA9PSBzdWJbMF0gJiYgKG4gPT0gMSB8fCBtZW1jbXAocytpLCBzdWIsIG4pID09IDApKSB7Ci0JCQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocytqLCBpLWopOwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pOwotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJaWYgKGVyciA8IDApCi0JCQkJZ290byBmYWlsOwotCQkJaSA9IGogPSBpICsgbjsKLQkJCXNwbGl0Y291bnQrKzsKLQkJCWlmIChtYXhzcGxpdCAmJiAoc3BsaXRjb3VudCA+PSBtYXhzcGxpdCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZQotCQkJaSsrOwotCX0KLQlpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocytqLCBsZW4taik7Ci0JaWYgKGl0ZW0gPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCWVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSk7Ci0JUHlfREVDUkVGKGl0ZW0pOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGZhaWw7CisgICAgaSA9IGogPSAwOworICAgIHdoaWxlIChpK24gPD0gbGVuKSB7CisgICAgICAgIGlmIChzW2ldID09IHN1YlswXSAmJiAobiA9PSAxIHx8IG1lbWNtcChzK2ksIHN1YiwgbikgPT0gMCkpIHsKKyAgICAgICAgICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2osIGktaik7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBpID0gaiA9IGkgKyBuOworICAgICAgICAgICAgc3BsaXRjb3VudCsrOworICAgICAgICAgICAgaWYgKG1heHNwbGl0ICYmIChzcGxpdGNvdW50ID49IG1heHNwbGl0KSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpKys7CisgICAgfQorICAgIGl0ZW0gPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2osIGxlbi1qKTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZXJyID0gUHlMaXN0X0FwcGVuZChsaXN0LCBpdGVtKTsKKyAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKIAotCXJldHVybiBsaXN0OworICAgIHJldHVybiBsaXN0OwogCiAgZmFpbDoKLQlQeV9ERUNSRUYobGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGxpc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTE2NiwxMjggKzE2NiwxMjggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9qb2luZmllbGRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqc2VxOwotCWNoYXIgKnNlcCA9IE5VTEw7Ci0JUHlfc3NpemVfdCBzZXFsZW4sIHNlcGxlbiA9IDA7Ci0JUHlfc3NpemVfdCBpLCByZXNsZW4gPSAwLCBzbGVuID0gMCwgc3ogPSAxMDA7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JY2hhciogcCA9IE5VTEw7Ci0Jc3NpemVhcmdmdW5jIGdldGl0ZW1mdW5jOworICAgIFB5T2JqZWN0ICpzZXE7CisgICAgY2hhciAqc2VwID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IHNlcWxlbiwgc2VwbGVuID0gMDsKKyAgICBQeV9zc2l6ZV90IGksIHJlc2xlbiA9IDAsIHNsZW4gPSAwLCBzeiA9IDEwMDsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBjaGFyKiBwID0gTlVMTDsKKyAgICBzc2l6ZWFyZ2Z1bmMgZ2V0aXRlbWZ1bmM7CiAKLQlXQVJOOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x0Izpqb2luIiwgJnNlcSwgJnNlcCwgJnNlcGxlbikpCi0JCXJldHVybiBOVUxMOwotCWlmIChzZXAgPT0gTlVMTCkgewotCQlzZXAgPSAiICI7Ci0JCXNlcGxlbiA9IDE7Ci0JfQorICAgIFdBUk47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHQjOmpvaW4iLCAmc2VxLCAmc2VwLCAmc2VwbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHNlcCA9PSBOVUxMKSB7CisgICAgICAgIHNlcCA9ICIgIjsKKyAgICAgICAgc2VwbGVuID0gMTsKKyAgICB9CiAKLQlzZXFsZW4gPSBQeVNlcXVlbmNlX1NpemUoc2VxKTsKLQlpZiAoc2VxbGVuIDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZXFsZW4gPSBQeVNlcXVlbmNlX1NpemUoc2VxKTsKKyAgICBpZiAoc2VxbGVuIDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzZXFsZW4gPT0gMSkgewotCQkvKiBPcHRpbWl6YXRpb24gaWYgdGhlcmUncyBvbmx5IG9uZSBpdGVtICovCi0JCVB5T2JqZWN0ICppdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHNlcSwgMCk7Ci0JCWlmIChpdGVtICYmICFQeVN0cmluZ19DaGVjayhpdGVtKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyIpOwotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIGl0ZW07Ci0JfQorICAgIGlmIChzZXFsZW4gPT0gMSkgeworICAgICAgICAvKiBPcHRpbWl6YXRpb24gaWYgdGhlcmUncyBvbmx5IG9uZSBpdGVtICovCisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHNlcSwgMCk7CisgICAgICAgIGlmIChpdGVtICYmICFQeVN0cmluZ19DaGVjayhpdGVtKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIHNlcXVlbmNlIG9mIHN0cmluZ3MiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KIAotCWlmICghKHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKilOVUxMLCBzeikpKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKTsKKyAgICBpZiAoIShyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopTlVMTCwgc3opKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcyk7CiAKLQkvKiBvcHRpbWl6ZSBmb3IgbGlzdHMsIHNpbmNlIGl0J3MgdGhlIG1vc3QgY29tbW9uIGNhc2UuICBhbGwgb3RoZXJzCi0JICogKHR1cGxlcyBhbmQgYXJiaXRyYXJ5IHNlcXVlbmNlcykganVzdCB1c2UgdGhlIHNlcXVlbmNlIGFic3RyYWN0Ci0JICogaW50ZXJmYWNlLgotCSAqLwotCWlmIChQeUxpc3RfQ2hlY2soc2VxKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgc2VxbGVuOyBpKyspIHsKLQkJCVB5T2JqZWN0ICppdGVtID0gUHlMaXN0X0dFVF9JVEVNKHNlcSwgaSk7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIik7Ci0JCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7Ci0JCQlpZiAoc2xlbiA+IFBZX1NTSVpFX1RfTUFYIC0gcmVzbGVuIHx8Ci0JCQkgICAgc2VwbGVuID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4gLSBzZXBsZW4pIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJCSJpbnB1dCB0b28gbG9uZyIpOwotCQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJd2hpbGUgKHJlc2xlbiArIHNsZW4gKyBzZXBsZW4gPj0gc3opIHsKLQkJCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzLCBzeiAqIDIpIDwgMCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJc3ogKj0gMjsKLQkJCQlwID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzKSArIHJlc2xlbjsKLQkJCX0KLQkJCWlmIChpID4gMCkgewotCQkJCW1lbWNweShwLCBzZXAsIHNlcGxlbik7Ci0JCQkJcCArPSBzZXBsZW47Ci0JCQkJcmVzbGVuICs9IHNlcGxlbjsKLQkJCX0KLQkJCW1lbWNweShwLCBQeVN0cmluZ19BU19TVFJJTkcoaXRlbSksIHNsZW4pOwotCQkJcCArPSBzbGVuOwotCQkJcmVzbGVuICs9IHNsZW47Ci0JCX0KLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzLCByZXNsZW4pOwotCQlyZXR1cm4gcmVzOwotCX0KKyAgICAvKiBvcHRpbWl6ZSBmb3IgbGlzdHMsIHNpbmNlIGl0J3MgdGhlIG1vc3QgY29tbW9uIGNhc2UuICBhbGwgb3RoZXJzCisgICAgICogKHR1cGxlcyBhbmQgYXJiaXRyYXJ5IHNlcXVlbmNlcykganVzdCB1c2UgdGhlIHNlcXVlbmNlIGFic3RyYWN0CisgICAgICogaW50ZXJmYWNlLgorICAgICAqLworICAgIGlmIChQeUxpc3RfQ2hlY2soc2VxKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2VxbGVuOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlMaXN0X0dFVF9JVEVNKHNlcSwgaSk7CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7CisgICAgICAgICAgICBpZiAoc2xlbiA+IFBZX1NTSVpFX1RfTUFYIC0gcmVzbGVuIHx8CisgICAgICAgICAgICAgICAgc2VwbGVuID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4gLSBzZXBsZW4pIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0IHRvbyBsb25nIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVzbGVuICsgc2xlbiArIHNlcGxlbiA+PSBzeikgeworICAgICAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXMsIHN6ICogMikgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICBzeiAqPSAyOworICAgICAgICAgICAgICAgIHAgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpICsgcmVzbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHAsIHNlcCwgc2VwbGVuKTsKKyAgICAgICAgICAgICAgICBwICs9IHNlcGxlbjsKKyAgICAgICAgICAgICAgICByZXNsZW4gKz0gc2VwbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KHAsIFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKSwgc2xlbik7CisgICAgICAgICAgICBwICs9IHNsZW47CisgICAgICAgICAgICByZXNsZW4gKz0gc2xlbjsKKyAgICAgICAgfQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXMsIHJlc2xlbik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCi0JaWYgKHNlcS0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgPT0gTlVMTCB8fAotCQkgKGdldGl0ZW1mdW5jID0gc2VxLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSkgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzZXF1ZW5jZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogVGhpcyBpcyBub3cgdHlwZSBzYWZlICovCi0JZm9yIChpID0gMDsgaSA8IHNlcWxlbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gZ2V0aXRlbWZ1bmMoc2VxLCBpKTsKLQkJaWYgKCFpdGVtIHx8ICFQeVN0cmluZ19DaGVjayhpdGVtKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyIpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlQeV9YREVDUkVGKGl0ZW0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pOwotCQlpZiAoc2xlbiA+IFBZX1NTSVpFX1RfTUFYIC0gcmVzbGVuIHx8Ci0JCSAgICBzZXBsZW4gPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbiAtIHNlcGxlbikgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCSJpbnB1dCB0b28gbG9uZyIpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlQeV9YREVDUkVGKGl0ZW0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJd2hpbGUgKHJlc2xlbiArIHNsZW4gKyBzZXBsZW4gPj0gc3opIHsKLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXMsIHN6ICogMikgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJc3ogKj0gMjsKLQkJCXAgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpICsgcmVzbGVuOwotCQl9Ci0JCWlmIChpID4gMCkgewotCQkJbWVtY3B5KHAsIHNlcCwgc2VwbGVuKTsKLQkJCXAgKz0gc2VwbGVuOwotCQkJcmVzbGVuICs9IHNlcGxlbjsKLQkJfQotCQltZW1jcHkocCwgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLCBzbGVuKTsKLQkJcCArPSBzbGVuOwotCQlyZXNsZW4gKz0gc2xlbjsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KLQlfUHlTdHJpbmdfUmVzaXplKCZyZXMsIHJlc2xlbik7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoc2VxLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgKGdldGl0ZW1mdW5jID0gc2VxLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHNlcXVlbmNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBUaGlzIGlzIG5vdyB0eXBlIHNhZmUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VxbGVuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBnZXRpdGVtZnVuYyhzZXEsIGkpOworICAgICAgICBpZiAoIWl0ZW0gfHwgIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyIpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pOworICAgICAgICBpZiAoc2xlbiA+IFBZX1NTSVpFX1RfTUFYIC0gcmVzbGVuIHx8CisgICAgICAgICAgICBzZXBsZW4gPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbiAtIHNlcGxlbikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0IHRvbyBsb25nIik7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoaXRlbSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAocmVzbGVuICsgc2xlbiArIHNlcGxlbiA+PSBzeikgeworICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlcywgc3ogKiAyKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeiAqPSAyOworICAgICAgICAgICAgcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcykgKyByZXNsZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBtZW1jcHkocCwgc2VwLCBzZXBsZW4pOworICAgICAgICAgICAgcCArPSBzZXBsZW47CisgICAgICAgICAgICByZXNsZW4gKz0gc2VwbGVuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShwLCBQeVN0cmluZ19BU19TVFJJTkcoaXRlbSksIHNsZW4pOworICAgICAgICBwICs9IHNsZW47CisgICAgICAgIHJlc2xlbiArPSBzbGVuOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQorICAgIF9QeVN0cmluZ19SZXNpemUoJnJlcywgcmVzbGVuKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTMwMywzNCArMzAzLDM0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfZmluZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcywgKnN1YjsKLQlQeV9zc2l6ZV90IGxlbiwgbiwgaSA9IDAsIGxhc3QgPSBQWV9TU0laRV9UX01BWDsKKyAgICBjaGFyICpzLCAqc3ViOworICAgIFB5X3NzaXplX3QgbGVuLCBuLCBpID0gMCwgbGFzdCA9IFBZX1NTSVpFX1RfTUFYOwogCi0JV0FSTjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjdCN8bm46ZmluZCIsICZzLCAmbGVuLCAmc3ViLCAmbiwgJmksICZsYXN0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgV0FSTjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjdCN8bm46ZmluZCIsICZzLCAmbGVuLCAmc3ViLCAmbiwgJmksICZsYXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobGFzdCA+IGxlbikKLQkJbGFzdCA9IGxlbjsKLQlpZiAobGFzdCA8IDApCi0JCWxhc3QgKz0gbGVuOwotCWlmIChsYXN0IDwgMCkKLQkJbGFzdCA9IDA7Ci0JaWYgKGkgPCAwKQotCQlpICs9IGxlbjsKLQlpZiAoaSA8IDApCi0JCWkgPSAwOworICAgIGlmIChsYXN0ID4gbGVuKQorICAgICAgICBsYXN0ID0gbGVuOworICAgIGlmIChsYXN0IDwgMCkKKyAgICAgICAgbGFzdCArPSBsZW47CisgICAgaWYgKGxhc3QgPCAwKQorICAgICAgICBsYXN0ID0gMDsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIGkgKz0gbGVuOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSA9IDA7CiAKLQlpZiAobiA9PSAwICYmIGkgPD0gbGFzdCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWkpOworICAgIGlmIChuID09IDAgJiYgaSA8PSBsYXN0KQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaSk7CiAKLQlsYXN0IC09IG47Ci0JZm9yICg7IGkgPD0gbGFzdDsgKytpKQotCQlpZiAoc1tpXSA9PSBzdWJbMF0gJiYKLQkJICAgIChuID09IDEgfHwgbWVtY21wKCZzW2krMV0sICZzdWJbMV0sIG4tMSkgPT0gMCkpCi0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpaSk7CisgICAgbGFzdCAtPSBuOworICAgIGZvciAoOyBpIDw9IGxhc3Q7ICsraSkKKyAgICAgICAgaWYgKHNbaV0gPT0gc3ViWzBdICYmCisgICAgICAgICAgICAobiA9PSAxIHx8IG1lbWNtcCgmc1tpKzFdLCAmc3ViWzFdLCBuLTEpID09IDApKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWkpOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xTCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xTCk7CiB9CiAKIApAQCAtMzQ2LDY4ICszNDYsNjggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9yZmluZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcywgKnN1YjsKLQlQeV9zc2l6ZV90IGxlbiwgbiwgajsKLQlQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgY2hhciAqcywgKnN1YjsKKyAgICBQeV9zc2l6ZV90IGxlbiwgbiwgajsKKyAgICBQeV9zc2l6ZV90IGkgPSAwLCBsYXN0ID0gUFlfU1NJWkVfVF9NQVg7CiAKLQlXQVJOOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3xubjpyZmluZCIsICZzLCAmbGVuLCAmc3ViLCAmbiwgJmksICZsYXN0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgV0FSTjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjdCN8bm46cmZpbmQiLCAmcywgJmxlbiwgJnN1YiwgJm4sICZpLCAmbGFzdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGxhc3QgPiBsZW4pCi0JCWxhc3QgPSBsZW47Ci0JaWYgKGxhc3QgPCAwKQotCQlsYXN0ICs9IGxlbjsKLQlpZiAobGFzdCA8IDApCi0JCWxhc3QgPSAwOwotCWlmIChpIDwgMCkKLQkJaSArPSBsZW47Ci0JaWYgKGkgPCAwKQotCQlpID0gMDsKKyAgICBpZiAobGFzdCA+IGxlbikKKyAgICAgICAgbGFzdCA9IGxlbjsKKyAgICBpZiAobGFzdCA8IDApCisgICAgICAgIGxhc3QgKz0gbGVuOworICAgIGlmIChsYXN0IDwgMCkKKyAgICAgICAgbGFzdCA9IDA7CisgICAgaWYgKGkgPCAwKQorICAgICAgICBpICs9IGxlbjsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIGkgPSAwOwogCi0JaWYgKG4gPT0gMCAmJiBpIDw9IGxhc3QpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylsYXN0KTsKKyAgICBpZiAobiA9PSAwICYmIGkgPD0gbGFzdCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWxhc3QpOwogCi0JZm9yIChqID0gbGFzdC1uOyBqID49IGk7IC0taikKLQkJaWYgKHNbal0gPT0gc3ViWzBdICYmCi0JCSAgICAobiA9PSAxIHx8IG1lbWNtcCgmc1tqKzFdLCAmc3ViWzFdLCBuLTEpID09IDApKQotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWopOworICAgIGZvciAoaiA9IGxhc3QtbjsgaiA+PSBpOyAtLWopCisgICAgICAgIGlmIChzW2pdID09IHN1YlswXSAmJgorICAgICAgICAgICAgKG4gPT0gMSB8fCBtZW1jbXAoJnNbaisxXSwgJnN1YlsxXSwgbi0xKSA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylqKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygtMUwpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygtMUwpOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb19zdHJpcChQeU9iamVjdCAqYXJncywgaW50IHN0cmlwdHlwZSkKIHsKLQljaGFyICpzOwotCVB5X3NzaXplX3QgbGVuLCBpLCBqOworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBsZW4sIGksIGo7CiAKIAotCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpID0gMDsKLQlpZiAoc3RyaXB0eXBlICE9IFJJR0hUU1RSSVApIHsKLQkJd2hpbGUgKGkgPCBsZW4gJiYgaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpIHsKLQkJCWkrKzsKLQkJfQotCX0KKyAgICBpID0gMDsKKyAgICBpZiAoc3RyaXB0eXBlICE9IFJJR0hUU1RSSVApIHsKKyAgICAgICAgd2hpbGUgKGkgPCBsZW4gJiYgaXNzcGFjZShQeV9DSEFSTUFTSyhzW2ldKSkpIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KIAotCWogPSBsZW47Ci0JaWYgKHN0cmlwdHlwZSAhPSBMRUZUU1RSSVApIHsKLQkJZG8gewotCQkJai0tOwotCQl9IHdoaWxlIChqID49IGkgJiYgaXNzcGFjZShQeV9DSEFSTUFTSyhzW2pdKSkpOwotCQlqKys7Ci0JfQorICAgIGogPSBsZW47CisgICAgaWYgKHN0cmlwdHlwZSAhPSBMRUZUU1RSSVApIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgai0tOworICAgICAgICB9IHdoaWxlIChqID49IGkgJiYgaXNzcGFjZShQeV9DSEFSTUFTSyhzW2pdKSkpOworICAgICAgICBqKys7CisgICAgfQogCi0JaWYgKGkgPT0gMCAmJiBqID09IGxlbikgewotCQlQeV9JTkNSRUYoYXJncyk7Ci0JCXJldHVybiBhcmdzOwotCX0KLQllbHNlCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2ksIGotaSk7CisgICAgaWYgKGkgPT0gMCAmJiBqID09IGxlbikgeworICAgICAgICBQeV9JTkNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2ksIGotaSk7CiB9CiAKIApAQCAtNDIwLDggKzQyMCw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3Bfc3RyaXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVdBUk47Ci0JcmV0dXJuIGRvX3N0cmlwKGFyZ3MsIEJPVEhTVFJJUCk7CisgICAgV0FSTjsKKyAgICByZXR1cm4gZG9fc3RyaXAoYXJncywgQk9USFNUUklQKTsKIH0KIAogCkBAIC00MzMsOCArNDMzLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9sc3RyaXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVdBUk47Ci0JcmV0dXJuIGRvX3N0cmlwKGFyZ3MsIExFRlRTVFJJUCk7CisgICAgV0FSTjsKKyAgICByZXR1cm4gZG9fc3RyaXAoYXJncywgTEVGVFNUUklQKTsKIH0KIAogCkBAIC00NDYsOCArNDQ2LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9yc3RyaXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVdBUk47Ci0JcmV0dXJuIGRvX3N0cmlwKGFyZ3MsIFJJR0hUU1RSSVApOworICAgIFdBUk47CisgICAgcmV0dXJuIGRvX3N0cmlwKGFyZ3MsIFJJR0hUU1RSSVApOwogfQogCiAKQEAgLTQ1OSwzNCArNDU5LDM0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfbG93ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICpzX25ldzsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKm5ld3N0cjsKLQlpbnQgY2hhbmdlZDsKKyAgICBjaGFyICpzLCAqc19uZXc7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpuZXdzdHI7CisgICAgaW50IGNoYW5nZWQ7CiAKLQlXQVJOOwotCWlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ld3N0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7Ci0JY2hhbmdlZCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoaXN1cHBlcihjKSkgewotCQkJY2hhbmdlZCA9IDE7Ci0JCQkqc19uZXcgPSB0b2xvd2VyKGMpOwotCQl9IGVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7Ci0JfQotCWlmICghY2hhbmdlZCkgewotCQlQeV9ERUNSRUYobmV3c3RyKTsKLQkJUHlfSU5DUkVGKGFyZ3MpOwotCQlyZXR1cm4gYXJnczsKLQl9Ci0JcmV0dXJuIG5ld3N0cjsKKyAgICBXQVJOOworICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJncywgJnMsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbmV3c3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKG5ld3N0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld3N0cik7CisgICAgY2hhbmdlZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICBpZiAoaXN1cHBlcihjKSkgeworICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgICAgICAqc19uZXcgPSB0b2xvd2VyKGMpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICpzX25ldyA9IGM7CisgICAgICAgIHNfbmV3Kys7CisgICAgfQorICAgIGlmICghY2hhbmdlZCkgeworICAgICAgICBQeV9ERUNSRUYobmV3c3RyKTsKKyAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisgICAgcmV0dXJuIG5ld3N0cjsKIH0KIAogCkBAIC00OTgsMzQgKzQ5OCwzNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX3VwcGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqc19uZXc7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpuZXdzdHI7Ci0JaW50IGNoYW5nZWQ7CisgICAgY2hhciAqcywgKnNfbmV3OworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqbmV3c3RyOworICAgIGludCBjaGFuZ2VkOwogCi0JV0FSTjsKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCi0JCXJldHVybiBOVUxMOwotCW5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXdzdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOwotCWNoYW5nZWQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKGlzbG93ZXIoYykpIHsKLQkJCWNoYW5nZWQgPSAxOwotCQkJKnNfbmV3ID0gdG91cHBlcihjKTsKLQkJfSBlbHNlCi0JCQkqc19uZXcgPSBjOwotCQlzX25ldysrOwotCX0KLQlpZiAoIWNoYW5nZWQpIHsKLQkJUHlfREVDUkVGKG5ld3N0cik7Ci0JCVB5X0lOQ1JFRihhcmdzKTsKLQkJcmV0dXJuIGFyZ3M7Ci0JfQotCXJldHVybiBuZXdzdHI7CisgICAgV0FSTjsKKyAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworICAgIGlmIChuZXdzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOworICAgIGNoYW5nZWQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgaWYgKGlzbG93ZXIoYykpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgKnNfbmV3ID0gdG91cHBlcihjKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAqc19uZXcgPSBjOworICAgICAgICBzX25ldysrOworICAgIH0KKyAgICBpZiAoIWNoYW5nZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld3N0cik7CisgICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorICAgIHJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtNTM4LDQzICs1MzgsNDMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9jYXBpdGFsaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqc19uZXc7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpuZXdzdHI7Ci0JaW50IGNoYW5nZWQ7CisgICAgY2hhciAqcywgKnNfbmV3OworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqbmV3c3RyOworICAgIGludCBjaGFuZ2VkOwogCi0JV0FSTjsKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCi0JCXJldHVybiBOVUxMOwotCW5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXdzdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOwotCWNoYW5nZWQgPSAwOwotCWlmICgwIDwgbikgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoaXNsb3dlcihjKSkgewotCQkJY2hhbmdlZCA9IDE7Ci0JCQkqc19uZXcgPSB0b3VwcGVyKGMpOwotCQl9IGVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7Ci0JfQotCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKGlzdXBwZXIoYykpIHsKLQkJCWNoYW5nZWQgPSAxOwotCQkJKnNfbmV3ID0gdG9sb3dlcihjKTsKLQkJfSBlbHNlCi0JCQkqc19uZXcgPSBjOwotCQlzX25ldysrOwotCX0KLQlpZiAoIWNoYW5nZWQpIHsKLQkJUHlfREVDUkVGKG5ld3N0cik7Ci0JCVB5X0lOQ1JFRihhcmdzKTsKLQkJcmV0dXJuIGFyZ3M7Ci0JfQotCXJldHVybiBuZXdzdHI7CisgICAgV0FSTjsKKyAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOworICAgIGlmIChuZXdzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOworICAgIGNoYW5nZWQgPSAwOworICAgIGlmICgwIDwgbikgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICBpZiAoaXNsb3dlcihjKSkgeworICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgICAgICAqc19uZXcgPSB0b3VwcGVyKGMpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICpzX25ldyA9IGM7CisgICAgICAgIHNfbmV3Kys7CisgICAgfQorICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgaWYgKGlzdXBwZXIoYykpIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgKnNfbmV3ID0gdG9sb3dlcihjKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAqc19uZXcgPSBjOworICAgICAgICBzX25ldysrOworICAgIH0KKyAgICBpZiAoIWNoYW5nZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld3N0cik7CisgICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorICAgIHJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtNTg5LDc1ICs1ODksNzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9leHBhbmR0YWJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQkvKiBPcmlnaW5hbCBieSBGcmVkcmlrIEx1bmRoICovCi0JY2hhciogZTsKLQljaGFyKiBwOwotCWNoYXIqIHE7Ci0JUHlfc3NpemVfdCBpLCBqLCBvbGRfajsKLQlQeU9iamVjdCogb3V0OwotCWNoYXIqIHN0cmluZzsKLQlQeV9zc2l6ZV90IHN0cmluZ2xlbjsKLQlpbnQgdGFic2l6ZSA9IDg7CisgICAgLyogT3JpZ2luYWwgYnkgRnJlZHJpayBMdW5kaCAqLworICAgIGNoYXIqIGU7CisgICAgY2hhciogcDsKKyAgICBjaGFyKiBxOworICAgIFB5X3NzaXplX3QgaSwgaiwgb2xkX2o7CisgICAgUHlPYmplY3QqIG91dDsKKyAgICBjaGFyKiBzdHJpbmc7CisgICAgUHlfc3NpemVfdCBzdHJpbmdsZW47CisgICAgaW50IHRhYnNpemUgPSA4OwogCi0JV0FSTjsKLQkvKiBHZXQgYXJndW1lbnRzICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xpOmV4cGFuZHRhYnMiLCAmc3RyaW5nLCAmc3RyaW5nbGVuLCAmdGFic2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICh0YWJzaXplIDwgMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkidGFic2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDEiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFdBUk47CisgICAgLyogR2V0IGFyZ3VtZW50cyAqLworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8aTpleHBhbmR0YWJzIiwgJnN0cmluZywgJnN0cmluZ2xlbiwgJnRhYnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodGFic2l6ZSA8IDEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidGFic2l6ZSBtdXN0IGJlIGF0IGxlYXN0IDEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogRmlyc3QgcGFzczogZGV0ZXJtaW5lIHNpemUgb2Ygb3V0cHV0IHN0cmluZyAqLwotCWkgPSBqID0gb2xkX2ogPSAwOyAvKiBqOiBjdXJyZW50IGNvbHVtbjsgaTogdG90YWwgb2YgcHJldmlvdXMgbGluZXMgKi8KLQllID0gc3RyaW5nICsgc3RyaW5nbGVuOwotCWZvciAocCA9IHN0cmluZzsgcCA8IGU7IHArKykgewotCQlpZiAoKnAgPT0gJ1x0JykgewotCQkJaiArPSB0YWJzaXplIC0gKGoldGFic2l6ZSk7Ci0JCQlpZiAob2xkX2ogPiBqKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCQkibmV3IHN0cmluZyBpcyB0b28gbG9uZyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJb2xkX2ogPSBqOwotCQl9IGVsc2UgewotCQkJaisrOwotCQkJaWYgKCpwID09ICdcbicpIHsKLQkJCQlpICs9IGo7Ci0JCQkJaiA9IDA7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogRmlyc3QgcGFzczogZGV0ZXJtaW5lIHNpemUgb2Ygb3V0cHV0IHN0cmluZyAqLworICAgIGkgPSBqID0gb2xkX2ogPSAwOyAvKiBqOiBjdXJyZW50IGNvbHVtbjsgaTogdG90YWwgb2YgcHJldmlvdXMgbGluZXMgKi8KKyAgICBlID0gc3RyaW5nICsgc3RyaW5nbGVuOworICAgIGZvciAocCA9IHN0cmluZzsgcCA8IGU7IHArKykgeworICAgICAgICBpZiAoKnAgPT0gJ1x0JykgeworICAgICAgICAgICAgaiArPSB0YWJzaXplIC0gKGoldGFic2l6ZSk7CisgICAgICAgICAgICBpZiAob2xkX2ogPiBqKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXcgc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvbGRfaiA9IGo7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBpZiAoKnAgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGkgKz0gajsKKyAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmICgoaSArIGopIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5ldyBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgoaSArIGopIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgIm5ldyBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogU2Vjb25kIHBhc3M6IGNyZWF0ZSBvdXRwdXQgc3RyaW5nIGFuZCBmaWxsIGl0ICovCi0Jb3V0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgaStqKTsKLQlpZiAob3V0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIFNlY29uZCBwYXNzOiBjcmVhdGUgb3V0cHV0IHN0cmluZyBhbmQgZmlsbCBpdCAqLworICAgIG91dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGkraik7CisgICAgaWYgKG91dCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWkgPSAwOwotCXEgPSBQeVN0cmluZ19BU19TVFJJTkcob3V0KTsKKyAgICBpID0gMDsKKyAgICBxID0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCk7CiAKLQlmb3IgKHAgPSBzdHJpbmc7IHAgPCBlOyBwKyspIHsKLQkJaWYgKCpwID09ICdcdCcpIHsKLQkJCWogPSB0YWJzaXplIC0gKGkldGFic2l6ZSk7Ci0JCQlpICs9IGo7Ci0JCQl3aGlsZSAoai0tID4gMCkKLQkJCQkqcSsrID0gJyAnOwotCQl9IGVsc2UgewotCQkJKnErKyA9ICpwOwotCQkJaSsrOwotCQkJaWYgKCpwID09ICdcbicpCi0JCQkJaSA9IDA7Ci0JCX0KLQl9CisgICAgZm9yIChwID0gc3RyaW5nOyBwIDwgZTsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSAnXHQnKSB7CisgICAgICAgICAgICBqID0gdGFic2l6ZSAtIChpJXRhYnNpemUpOworICAgICAgICAgICAgaSArPSBqOworICAgICAgICAgICAgd2hpbGUgKGotLSA+IDApCisgICAgICAgICAgICAgICAgKnErKyA9ICcgJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpxKysgPSAqcDsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nKQorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIG91dDsKKyAgICByZXR1cm4gb3V0OwogfQogCiAKQEAgLTY3MSwzOCArNjcxLDM4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfY291bnQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICpzdWI7Ci0JUHlfc3NpemVfdCBsZW4sIG47Ci0JUHlfc3NpemVfdCBpID0gMCwgbGFzdCA9IFBZX1NTSVpFX1RfTUFYOwotCVB5X3NzaXplX3QgbSwgcjsKKyAgICBjaGFyICpzLCAqc3ViOworICAgIFB5X3NzaXplX3QgbGVuLCBuOworICAgIFB5X3NzaXplX3QgaSA9IDAsIGxhc3QgPSBQWV9TU0laRV9UX01BWDsKKyAgICBQeV9zc2l6ZV90IG0sIHI7CiAKLQlXQVJOOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0I3xubjpjb3VudCIsICZzLCAmbGVuLCAmc3ViLCAmbiwgJmksICZsYXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGxhc3QgPiBsZW4pCi0JCWxhc3QgPSBsZW47Ci0JaWYgKGxhc3QgPCAwKQotCQlsYXN0ICs9IGxlbjsKLQlpZiAobGFzdCA8IDApCi0JCWxhc3QgPSAwOwotCWlmIChpIDwgMCkKLQkJaSArPSBsZW47Ci0JaWYgKGkgPCAwKQotCQlpID0gMDsKLQltID0gbGFzdCArIDEgLSBuOwotCWlmIChuID09IDApCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgKG0taSkpOworICAgIFdBUk47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjfG5uOmNvdW50IiwgJnMsICZsZW4sICZzdWIsICZuLCAmaSwgJmxhc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobGFzdCA+IGxlbikKKyAgICAgICAgbGFzdCA9IGxlbjsKKyAgICBpZiAobGFzdCA8IDApCisgICAgICAgIGxhc3QgKz0gbGVuOworICAgIGlmIChsYXN0IDwgMCkKKyAgICAgICAgbGFzdCA9IDA7CisgICAgaWYgKGkgPCAwKQorICAgICAgICBpICs9IGxlbjsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIGkgPSAwOworICAgIG0gPSBsYXN0ICsgMSAtIG47CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSAobS1pKSk7CiAKLQlyID0gMDsKLQl3aGlsZSAoaSA8IG0pIHsKLQkJaWYgKCFtZW1jbXAocytpLCBzdWIsIG4pKSB7Ci0JCQlyKys7Ci0JCQlpICs9IG47Ci0JCX0gZWxzZSB7Ci0JCQlpKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSByKTsKKyAgICByID0gMDsKKyAgICB3aGlsZSAoaSA8IG0pIHsKKyAgICAgICAgaWYgKCFtZW1jbXAocytpLCBzdWIsIG4pKSB7CisgICAgICAgICAgICByKys7CisgICAgICAgICAgICBpICs9IG47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSByKTsKIH0KIAogCkBAIC03MTUsMzkgKzcxNSwzOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX3N3YXBjYXNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqc19uZXc7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5T2JqZWN0ICpuZXdzdHI7Ci0JaW50IGNoYW5nZWQ7CisgICAgY2hhciAqcywgKnNfbmV3OworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqbmV3c3RyOworICAgIGludCBjaGFuZ2VkOwogCi0JV0FSTjsKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZ3MsICZzLCAmbikpCi0JCXJldHVybiBOVUxMOwotCW5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmIChuZXdzdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdzdHIpOwotCWNoYW5nZWQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKGlzbG93ZXIoYykpIHsKLQkJCWNoYW5nZWQgPSAxOwotCQkJKnNfbmV3ID0gdG91cHBlcihjKTsKLQkJfQotCQllbHNlIGlmIChpc3VwcGVyKGMpKSB7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCSpzX25ldyA9IHRvbG93ZXIoYyk7Ci0JCX0KLQkJZWxzZQotCQkJKnNfbmV3ID0gYzsKLQkJc19uZXcrKzsKLQl9Ci0JaWYgKCFjaGFuZ2VkKSB7Ci0JCVB5X0RFQ1JFRihuZXdzdHIpOwotCQlQeV9JTkNSRUYoYXJncyk7Ci0JCXJldHVybiBhcmdzOwotCX0KLQlyZXR1cm4gbmV3c3RyOworICAgIFdBUk47CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmdzLCAmcywgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAobmV3c3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3c3RyKTsKKyAgICBjaGFuZ2VkID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICpzX25ldyA9IHRvdXBwZXIoYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXN1cHBlcihjKSkgeworICAgICAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgICAgICAgICAqc19uZXcgPSB0b2xvd2VyKGMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpzX25ldyA9IGM7CisgICAgICAgIHNfbmV3Kys7CisgICAgfQorICAgIGlmICghY2hhbmdlZCkgeworICAgICAgICBQeV9ERUNSRUYobmV3c3RyKTsKKyAgICAgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9CisgICAgcmV0dXJuIG5ld3N0cjsKIH0KIAogCkBAIC03NjQsNDUgKzc2NCw0NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cm9wX2F0b2koUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnMsICplbmQ7Ci0JaW50IGJhc2UgPSAxMDsKLQlsb25nIHg7Ci0JY2hhciBidWZmZXJbMjU2XTsgLyogRm9yIGVycm9ycyAqLworICAgIGNoYXIgKnMsICplbmQ7CisgICAgaW50IGJhc2UgPSAxMDsKKyAgICBsb25nIHg7CisgICAgY2hhciBidWZmZXJbMjU2XTsgLyogRm9yIGVycm9ycyAqLwogCi0JV0FSTjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8aTphdG9pIiwgJnMsICZiYXNlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgV0FSTjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8aTphdG9pIiwgJnMsICZiYXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKGJhc2UgIT0gMCAmJiBiYXNlIDwgMikgfHwgYmFzZSA+IDM2KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBiYXNlIGZvciBhdG9pKCkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgoYmFzZSAhPSAwICYmIGJhc2UgPCAyKSB8fCBiYXNlID4gMzYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGJhc2UgZm9yIGF0b2koKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQotCQlzKys7Ci0JZXJybm8gPSAwOwotCWlmIChiYXNlID09IDAgJiYgc1swXSA9PSAnMCcpCi0JCXggPSAobG9uZykgUHlPU19zdHJ0b3VsKHMsICZlbmQsIGJhc2UpOwotCWVsc2UKLQkJeCA9IFB5T1Nfc3RydG9sKHMsICZlbmQsIGJhc2UpOwotCWlmIChlbmQgPT0gcyB8fCAhaXNhbG51bShQeV9DSEFSTUFTSyhlbmRbLTFdKSkpCi0JCWdvdG8gYmFkOwotCXdoaWxlICgqZW5kICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmVuZCkpKQotCQllbmQrKzsKLQlpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKKyAgICAgICAgcysrOworICAgIGVycm5vID0gMDsKKyAgICBpZiAoYmFzZSA9PSAwICYmIHNbMF0gPT0gJzAnKQorICAgICAgICB4ID0gKGxvbmcpIFB5T1Nfc3RydG91bChzLCAmZW5kLCBiYXNlKTsKKyAgICBlbHNlCisgICAgICAgIHggPSBQeU9TX3N0cnRvbChzLCAmZW5kLCBiYXNlKTsKKyAgICBpZiAoZW5kID09IHMgfHwgIWlzYWxudW0oUHlfQ0hBUk1BU0soZW5kWy0xXSkpKQorICAgICAgICBnb3RvIGJhZDsKKyAgICB3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKKyAgICAgICAgZW5kKys7CisgICAgaWYgKCplbmQgIT0gJ1wwJykgewogICBiYWQ6Ci0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGF0b2koKTogJS4yMDBzIiwgcyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoZXJybm8gIT0gMCkgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIAotCQkJICAgICAgImF0b2koKSBsaXRlcmFsIHRvbyBsYXJnZTogJS4yMDBzIiwgcyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgYXRvaSgpOiAlLjIwMHMiLCBzKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChlcnJubyAhPSAwKSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiYXRvaSgpIGxpdGVyYWwgdG9vIGxhcmdlOiAlLjIwMHMiLCBzKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CiB9CiAKIApAQCAtODIwLDQxICs4MjAsNDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9hdG9sKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzLCAqZW5kOwotCWludCBiYXNlID0gMTA7Ci0JUHlPYmplY3QgKng7Ci0JY2hhciBidWZmZXJbMjU2XTsgLyogRm9yIGVycm9ycyAqLworICAgIGNoYXIgKnMsICplbmQ7CisgICAgaW50IGJhc2UgPSAxMDsKKyAgICBQeU9iamVjdCAqeDsKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOyAvKiBGb3IgZXJyb3JzICovCiAKLQlXQVJOOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xpOmF0b2wiLCAmcywgJmJhc2UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xpOmF0b2wiLCAmcywgJmJhc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICgoYmFzZSAhPSAwICYmIGJhc2UgPCAyKSB8fCBiYXNlID4gMzYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGJhc2UgZm9yIGF0b2woKSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChiYXNlICE9IDAgJiYgYmFzZSA8IDIpIHx8IGJhc2UgPiAzNikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgYmFzZSBmb3IgYXRvbCgpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCi0JCXMrKzsKLQlpZiAoc1swXSA9PSAnXDAnKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc3RyaW5nIGZvciBhdG9sKCkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXggPSBQeUxvbmdfRnJvbVN0cmluZyhzLCAmZW5kLCBiYXNlKTsKLQlpZiAoeCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYmFzZSA9PSAwICYmICgqZW5kID09ICdsJyB8fCAqZW5kID09ICdMJykpCi0JCWVuZCsrOwotCXdoaWxlICgqZW5kICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmVuZCkpKQotCQllbmQrKzsKLQlpZiAoKmVuZCAhPSAnXDAnKSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGF0b2woKTogJS4yMDBzIiwgcyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOwotCQlQeV9ERUNSRUYoeCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4geDsKKyAgICB3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQorICAgICAgICBzKys7CisgICAgaWYgKHNbMF0gPT0gJ1wwJykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHN0cmluZyBmb3IgYXRvbCgpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB4ID0gUHlMb25nX0Zyb21TdHJpbmcocywgJmVuZCwgYmFzZSk7CisgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGJhc2UgPT0gMCAmJiAoKmVuZCA9PSAnbCcgfHwgKmVuZCA9PSAnTCcpKQorICAgICAgICBlbmQrKzsKKyAgICB3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKKyAgICAgICAgZW5kKys7CisgICAgaWYgKCplbmQgIT0gJ1wwJykgeworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgYXRvbCgpOiAlLjIwMHMiLCBzKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7CisgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB4OwogfQogCiAKQEAgLTg2NiwzOCArODY2LDM4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3Ryb3BfYXRvZihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcywgKmVuZDsKLQlkb3VibGUgeDsKLQljaGFyIGJ1ZmZlclsyNTZdOyAvKiBGb3IgZXJyb3JzICovCisgICAgY2hhciAqcywgKmVuZDsKKyAgICBkb3VibGUgeDsKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOyAvKiBGb3IgZXJyb3JzICovCiAKLQlXQVJOOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczphdG9mIiwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQotCQlzKys7Ci0JaWYgKHNbMF0gPT0gJ1wwJykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHN0cmluZyBmb3IgYXRvZigpIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgic3Ryb3BfYXRvZiIsIHJldHVybiAwKQotCXggPSBQeU9TX2FzY2lpX3N0cnRvZChzLCAmZW5kKTsKLQlQeUZQRV9FTkRfUFJPVEVDVCh4KQotCXdoaWxlICgqZW5kICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmVuZCkpKQotCQllbmQrKzsKLQlpZiAoKmVuZCAhPSAnXDAnKSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGF0b2YoKTogJS4yMDBzIiwgcyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoZXJybm8gIT0gMCkgewotCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIAotCQkJICAgICAgImF0b2YoKSBsaXRlcmFsIHRvbyBsYXJnZTogJS4yMDBzIiwgcyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKyAgICBXQVJOOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczphdG9mIiwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQorICAgICAgICBzKys7CisgICAgaWYgKHNbMF0gPT0gJ1wwJykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHN0cmluZyBmb3IgYXRvZigpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlcnJubyA9IDA7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgic3Ryb3BfYXRvZiIsIHJldHVybiAwKQorICAgIHggPSBQeU9TX2FzY2lpX3N0cnRvZChzLCAmZW5kKTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVCh4KQorICAgIHdoaWxlICgqZW5kICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmVuZCkpKQorICAgICAgICBlbmQrKzsKKyAgICBpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBhdG9mKCk6ICUuMjAwcyIsIHMpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKGVycm5vICE9IDApIHsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICJhdG9mKCkgbGl0ZXJhbCB0b28gbGFyZ2U6ICUuMjAwcyIsIHMpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CiB9CiAKIApAQCAtOTExLDI5ICs5MTEsMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9tYWtldHJhbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXVuc2lnbmVkIGNoYXIgKmMsICpmcm9tPU5VTEwsICp0bz1OVUxMOwotCVB5X3NzaXplX3QgaSwgZnJvbWxlbj0wLCB0b2xlbj0wOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgdW5zaWduZWQgY2hhciAqYywgKmZyb209TlVMTCwgKnRvPU5VTEw7CisgICAgUHlfc3NpemVfdCBpLCBmcm9tbGVuPTAsIHRvbGVuPTA7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN0IzptYWtldHJhbnMiLCAmZnJvbSwgJmZyb21sZW4sICZ0bywgJnRvbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjOm1ha2V0cmFucyIsICZmcm9tLCAmZnJvbWxlbiwgJnRvLCAmdG9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChmcm9tbGVuICE9IHRvbGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJtYWtldHJhbnMgYXJndW1lbnRzIG11c3QgaGF2ZSBzYW1lIGxlbmd0aCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGZyb21sZW4gIT0gdG9sZW4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWFrZXRyYW5zIGFyZ3VtZW50cyBtdXN0IGhhdmUgc2FtZSBsZW5ndGgiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCAyNTYpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYyA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyZXN1bHQpOwotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJY1tpXT0odW5zaWduZWQgY2hhcilpOwotCWZvciAoaSA9IDA7IGkgPCBmcm9tbGVuOyBpKyspCi0JCWNbZnJvbVtpXV09dG9baV07CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCAyNTYpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYyA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilyZXN1bHQpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgY1tpXT0odW5zaWduZWQgY2hhcilpOworICAgIGZvciAoaSA9IDA7IGkgPCBmcm9tbGVuOyBpKyspCisgICAgICAgIGNbZnJvbVtpXV09dG9baV07CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtOTQ4LDY5ICs5NDgsNjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF90cmFuc2xhdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJlZ2lzdGVyIGNoYXIgKmlucHV0LCAqdGFibGUsICpvdXRwdXQ7Ci0JUHlfc3NpemVfdCBpOyAKLQlpbnQgYywgY2hhbmdlZCA9IDA7Ci0JUHlPYmplY3QgKmlucHV0X29iajsKLQljaGFyICp0YWJsZTEsICpvdXRwdXRfc3RhcnQsICpkZWxfdGFibGU9TlVMTDsKLQlQeV9zc2l6ZV90IGlubGVuLCB0YWJsZW4sIGRlbGxlbiA9IDA7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlpbnQgdHJhbnNfdGFibGVbMjU2XTsKKyAgICByZWdpc3RlciBjaGFyICppbnB1dCwgKnRhYmxlLCAqb3V0cHV0OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgYywgY2hhbmdlZCA9IDA7CisgICAgUHlPYmplY3QgKmlucHV0X29iajsKKyAgICBjaGFyICp0YWJsZTEsICpvdXRwdXRfc3RhcnQsICpkZWxfdGFibGU9TlVMTDsKKyAgICBQeV9zc2l6ZV90IGlubGVuLCB0YWJsZW4sIGRlbGxlbiA9IDA7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgdHJhbnNfdGFibGVbMjU2XTsKIAotCVdBUk47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTdCN8dCM6dHJhbnNsYXRlIiwgJmlucHV0X29iaiwKLQkJCSAgICAgICZ0YWJsZTEsICZ0YWJsZW4sICZkZWxfdGFibGUsICZkZWxsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodGFibGVuICE9IDI1NikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgICJ0cmFuc2xhdGlvbiB0YWJsZSBtdXN0IGJlIDI1NiBjaGFyYWN0ZXJzIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFdBUk47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTdCN8dCM6dHJhbnNsYXRlIiwgJmlucHV0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYmxlMSwgJnRhYmxlbiwgJmRlbF90YWJsZSwgJmRlbGxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh0YWJsZW4gIT0gMjU2KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2xhdGlvbiB0YWJsZSBtdXN0IGJlIDI1NiBjaGFyYWN0ZXJzIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JdGFibGUgPSB0YWJsZTE7Ci0JaW5sZW4gPSBQeVN0cmluZ19HRVRfU0laRShpbnB1dF9vYmopOwotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgaW5sZW4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3V0cHV0X3N0YXJ0ID0gb3V0cHV0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KTsKLQlpbnB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKGlucHV0X29iaik7CisgICAgdGFibGUgPSB0YWJsZTE7CisgICAgaW5sZW4gPSBQeVN0cmluZ19HRVRfU0laRShpbnB1dF9vYmopOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgaW5sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3V0cHV0X3N0YXJ0ID0gb3V0cHV0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KTsKKyAgICBpbnB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKGlucHV0X29iaik7CiAKLQlpZiAoZGVsbGVuID09IDApIHsKLQkJLyogSWYgbm8gZGVsZXRpb25zIGFyZSByZXF1aXJlZCwgdXNlIGZhc3RlciBjb2RlICovCi0JCWZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7Ci0JCQljID0gUHlfQ0hBUk1BU0soKmlucHV0KyspOwotCQkJaWYgKFB5X0NIQVJNQVNLKCgqb3V0cHV0KysgPSB0YWJsZVtjXSkpICE9IGMpCi0JCQkJY2hhbmdlZCA9IDE7Ci0JCX0KLQkJaWYgKGNoYW5nZWQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfSU5DUkVGKGlucHV0X29iaik7Ci0JCXJldHVybiBpbnB1dF9vYmo7Ci0JfQorICAgIGlmIChkZWxsZW4gPT0gMCkgeworICAgICAgICAvKiBJZiBubyBkZWxldGlvbnMgYXJlIHJlcXVpcmVkLCB1c2UgZmFzdGVyIGNvZGUgKi8KKyAgICAgICAgZm9yIChpID0gaW5sZW47IC0taSA+PSAwOyApIHsKKyAgICAgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7CisgICAgICAgICAgICBpZiAoUHlfQ0hBUk1BU0soKCpvdXRwdXQrKyA9IHRhYmxlW2NdKSkgIT0gYykKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hhbmdlZCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9JTkNSRUYoaW5wdXRfb2JqKTsKKyAgICAgICAgcmV0dXJuIGlucHV0X29iajsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCXRyYW5zX3RhYmxlW2ldID0gUHlfQ0hBUk1BU0sodGFibGVbaV0pOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgdHJhbnNfdGFibGVbaV0gPSBQeV9DSEFSTUFTSyh0YWJsZVtpXSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZGVsbGVuOyBpKyspCi0JCXRyYW5zX3RhYmxlWyhpbnQpIFB5X0NIQVJNQVNLKGRlbF90YWJsZVtpXSldID0gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IGRlbGxlbjsgaSsrKQorICAgICAgICB0cmFuc190YWJsZVsoaW50KSBQeV9DSEFSTUFTSyhkZWxfdGFibGVbaV0pXSA9IC0xOwogCi0JZm9yIChpID0gaW5sZW47IC0taSA+PSAwOyApIHsKLQkJYyA9IFB5X0NIQVJNQVNLKCppbnB1dCsrKTsKLQkJaWYgKHRyYW5zX3RhYmxlW2NdICE9IC0xKQotCQkJaWYgKFB5X0NIQVJNQVNLKCpvdXRwdXQrKyA9IChjaGFyKXRyYW5zX3RhYmxlW2NdKSA9PSBjKQotCQkJCWNvbnRpbnVlOwotCQljaGFuZ2VkID0gMTsKLQl9Ci0JaWYgKCFjaGFuZ2VkKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlQeV9JTkNSRUYoaW5wdXRfb2JqKTsKLQkJcmV0dXJuIGlucHV0X29iajsKLQl9Ci0JLyogRml4IHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nICovCi0JaWYgKGlubGVuID4gMCkKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBvdXRwdXQgLSBvdXRwdXRfc3RhcnQpOwotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpID0gaW5sZW47IC0taSA+PSAwOyApIHsKKyAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCppbnB1dCsrKTsKKyAgICAgICAgaWYgKHRyYW5zX3RhYmxlW2NdICE9IC0xKQorICAgICAgICAgICAgaWYgKFB5X0NIQVJNQVNLKCpvdXRwdXQrKyA9IChjaGFyKXRyYW5zX3RhYmxlW2NdKSA9PSBjKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjaGFuZ2VkID0gMTsKKyAgICB9CisgICAgaWYgKCFjaGFuZ2VkKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9JTkNSRUYoaW5wdXRfb2JqKTsKKyAgICAgICAgcmV0dXJuIGlucHV0X29iajsKKyAgICB9CisgICAgLyogRml4IHRoZSBzaXplIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nICovCisgICAgaWYgKGlubGVuID4gMCkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBvdXRwdXQgLSBvdXRwdXRfc3RhcnQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIApAQCAtMTAyNiwyMiArMTAyNiwyMiBAQAogICBmb3VuZCwgb3IgLTEgaWYgbm90IGZvdW5kLiAgSWYgbGVuIG9mIFBBVCBpcyBncmVhdGVyIHRoYW4gbGVuZ3RoIG9mCiAgIE1FTSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgLTEuCiAqLwotc3RhdGljIFB5X3NzaXplX3QgCitzdGF0aWMgUHlfc3NpemVfdAogbXltZW1maW5kKGNvbnN0IGNoYXIgKm1lbSwgUHlfc3NpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnBhdCwgUHlfc3NpemVfdCBwYXRfbGVuKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaWk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpaTsKIAotCS8qIHBhdHRlcm4gY2FuIG5vdCBvY2N1ciBpbiB0aGUgbGFzdCBwYXRfbGVuLTEgY2hhcnMgKi8KLQlsZW4gLT0gcGF0X2xlbjsKKyAgICAvKiBwYXR0ZXJuIGNhbiBub3Qgb2NjdXIgaW4gdGhlIGxhc3QgcGF0X2xlbi0xIGNoYXJzICovCisgICAgbGVuIC09IHBhdF9sZW47CiAKLQlmb3IgKGlpID0gMDsgaWkgPD0gbGVuOyBpaSsrKSB7Ci0JCWlmIChtZW1baWldID09IHBhdFswXSAmJgotCQkgICAgKHBhdF9sZW4gPT0gMSB8fAotCQkgICAgIG1lbWNtcCgmbWVtW2lpKzFdLCAmcGF0WzFdLCBwYXRfbGVuLTEpID09IDApKSB7Ci0JCQlyZXR1cm4gaWk7Ci0JCX0KLQl9Ci0JcmV0dXJuIC0xOworICAgIGZvciAoaWkgPSAwOyBpaSA8PSBsZW47IGlpKyspIHsKKyAgICAgICAgaWYgKG1lbVtpaV0gPT0gcGF0WzBdICYmCisgICAgICAgICAgICAocGF0X2xlbiA9PSAxIHx8CisgICAgICAgICAgICAgbWVtY21wKCZtZW1baWkrMV0sICZwYXRbMV0sIHBhdF9sZW4tMSkgPT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qCkBAIC0xMDQ5LDIzICsxMDQ5LDIzIEBACiAKICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHRpbWVzIFBBVCBpcyBmb3VuZCBpbiBNRU0uCiAgICBtZWFuaW5nIG1lbT0xMTExIGFuZCBwYXQ9PTExIHJldHVybnMgMi4KLSAgICAgICAgICAgbWVtPTExMTExIGFuZCBwYXQ9PTExIGFsc28gcmV0dXJuIDIuCisgICAgICAgbWVtPTExMTExIGFuZCBwYXQ9PTExIGFsc28gcmV0dXJuIDIuCiAgKi8KLXN0YXRpYyBQeV9zc2l6ZV90IAorc3RhdGljIFB5X3NzaXplX3QKIG15bWVtY250KGNvbnN0IGNoYXIgKm1lbSwgUHlfc3NpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnBhdCwgUHlfc3NpemVfdCBwYXRfbGVuKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3Qgb2Zmc2V0ID0gMDsKLQlQeV9zc2l6ZV90IG5mb3VuZCA9IDA7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBvZmZzZXQgPSAwOworICAgIFB5X3NzaXplX3QgbmZvdW5kID0gMDsKIAotCXdoaWxlIChsZW4gPj0gMCkgewotCQlvZmZzZXQgPSBteW1lbWZpbmQobWVtLCBsZW4sIHBhdCwgcGF0X2xlbik7Ci0JCWlmIChvZmZzZXQgPT0gLTEpCi0JCQlicmVhazsKLQkJbWVtICs9IG9mZnNldCArIHBhdF9sZW47Ci0JCWxlbiAtPSBvZmZzZXQgKyBwYXRfbGVuOwotCQluZm91bmQrKzsKLQl9Ci0JcmV0dXJuIG5mb3VuZDsKKyAgICB3aGlsZSAobGVuID49IDApIHsKKyAgICAgICAgb2Zmc2V0ID0gbXltZW1maW5kKG1lbSwgbGVuLCBwYXQsIHBhdF9sZW4pOworICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIG1lbSArPSBvZmZzZXQgKyBwYXRfbGVuOworICAgICAgICBsZW4gLT0gb2Zmc2V0ICsgcGF0X2xlbjsKKyAgICAgICAgbmZvdW5kKys7CisgICAgfQorICAgIHJldHVybiBuZm91bmQ7CiB9CiAKIC8qCkBAIC0xMDg4LDY5ICsxMDg4LDY5IEBACiAgICAgICAgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KICovCiBzdGF0aWMgY2hhciAqCi1teW1lbXJlcGxhY2UoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwJCS8qIGlucHV0IHN0cmluZyAqLwotICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdCwgUHlfc3NpemVfdCBwYXRfbGVuLAkvKiBwYXR0ZXJuIHN0cmluZyB0byBmaW5kICovCi0gICAgICAgICAgICAgY29uc3QgY2hhciAqc3ViLCBQeV9zc2l6ZV90IHN1Yl9sZW4sCS8qIHN1YnN0aXR1dGlvbiBzdHJpbmcgKi8KLSAgICAgICAgICAgICBQeV9zc2l6ZV90IGNvdW50LAkJCQkvKiBudW1iZXIgb2YgcmVwbGFjZW1lbnRzICovCi0JICAgICBQeV9zc2l6ZV90ICpvdXRfbGVuKQorbXltZW1yZXBsYWNlKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sICAgICAgICAgICAvKiBpbnB1dCBzdHJpbmcgKi8KKyAgICAgICAgIGNvbnN0IGNoYXIgKnBhdCwgUHlfc3NpemVfdCBwYXRfbGVuLCAgICAgICAgICAgLyogcGF0dGVybiBzdHJpbmcgdG8gZmluZCAqLworICAgICAgICAgY29uc3QgY2hhciAqc3ViLCBQeV9zc2l6ZV90IHN1Yl9sZW4sICAgICAgICAgICAvKiBzdWJzdGl0dXRpb24gc3RyaW5nICovCisgICAgICAgICBQeV9zc2l6ZV90IGNvdW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZXBsYWNlbWVudHMgKi8KKyAgICAgICAgIFB5X3NzaXplX3QgKm91dF9sZW4pCiB7Ci0JY2hhciAqb3V0X3M7Ci0JY2hhciAqbmV3X3M7Ci0JUHlfc3NpemVfdCBuZm91bmQsIG9mZnNldCwgbmV3X2xlbjsKKyAgICBjaGFyICpvdXRfczsKKyAgICBjaGFyICpuZXdfczsKKyAgICBQeV9zc2l6ZV90IG5mb3VuZCwgb2Zmc2V0LCBuZXdfbGVuOwogCi0JaWYgKGxlbiA9PSAwIHx8IHBhdF9sZW4gPiBsZW4pCi0JCWdvdG8gcmV0dXJuX3NhbWU7CisgICAgaWYgKGxlbiA9PSAwIHx8IHBhdF9sZW4gPiBsZW4pCisgICAgICAgIGdvdG8gcmV0dXJuX3NhbWU7CiAKLQkvKiBmaW5kIGxlbmd0aCBvZiBvdXRwdXQgc3RyaW5nICovCi0JbmZvdW5kID0gbXltZW1jbnQoc3RyLCBsZW4sIHBhdCwgcGF0X2xlbik7Ci0JaWYgKGNvdW50IDwgMCkKLQkJY291bnQgPSBQWV9TU0laRV9UX01BWDsKLQllbHNlIGlmIChuZm91bmQgPiBjb3VudCkKLQkJbmZvdW5kID0gY291bnQ7Ci0JaWYgKG5mb3VuZCA9PSAwKQotCQlnb3RvIHJldHVybl9zYW1lOworICAgIC8qIGZpbmQgbGVuZ3RoIG9mIG91dHB1dCBzdHJpbmcgKi8KKyAgICBuZm91bmQgPSBteW1lbWNudChzdHIsIGxlbiwgcGF0LCBwYXRfbGVuKTsKKyAgICBpZiAoY291bnQgPCAwKQorICAgICAgICBjb3VudCA9IFBZX1NTSVpFX1RfTUFYOworICAgIGVsc2UgaWYgKG5mb3VuZCA+IGNvdW50KQorICAgICAgICBuZm91bmQgPSBjb3VudDsKKyAgICBpZiAobmZvdW5kID09IDApCisgICAgICAgIGdvdG8gcmV0dXJuX3NhbWU7CiAKLQluZXdfbGVuID0gbGVuICsgbmZvdW5kKihzdWJfbGVuIC0gcGF0X2xlbik7Ci0JaWYgKG5ld19sZW4gPT0gMCkgewotCQkvKiBIYXZlIHRvIGFsbG9jYXRlIHNvbWV0aGluZyBmb3IgdGhlIGNhbGxlciB0byBmcmVlKCkuICovCi0JCW91dF9zID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoMSk7Ci0JCWlmIChvdXRfcyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW91dF9zWzBdID0gJ1wwJzsKLQl9Ci0JZWxzZSB7Ci0JCWFzc2VydChuZXdfbGVuID4gMCk7Ci0JCW5ld19zID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobmV3X2xlbik7Ci0JCWlmIChuZXdfcyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW91dF9zID0gbmV3X3M7CisgICAgbmV3X2xlbiA9IGxlbiArIG5mb3VuZCooc3ViX2xlbiAtIHBhdF9sZW4pOworICAgIGlmIChuZXdfbGVuID09IDApIHsKKyAgICAgICAgLyogSGF2ZSB0byBhbGxvY2F0ZSBzb21ldGhpbmcgZm9yIHRoZSBjYWxsZXIgdG8gZnJlZSgpLiAqLworICAgICAgICBvdXRfcyA9IChjaGFyICopUHlNZW1fTUFMTE9DKDEpOworICAgICAgICBpZiAob3V0X3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBvdXRfc1swXSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhc3NlcnQobmV3X2xlbiA+IDApOworICAgICAgICBuZXdfcyA9IChjaGFyICopUHlNZW1fTUFMTE9DKG5ld19sZW4pOworICAgICAgICBpZiAobmV3X3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBvdXRfcyA9IG5ld19zOwogCi0JCWZvciAoOyBjb3VudCA+IDAgJiYgbGVuID4gMDsgLS1jb3VudCkgewotCQkJLyogZmluZCBpbmRleCBvZiBuZXh0IGluc3RhbmNlIG9mIHBhdHRlcm4gKi8KLQkJCW9mZnNldCA9IG15bWVtZmluZChzdHIsIGxlbiwgcGF0LCBwYXRfbGVuKTsKLQkJCWlmIChvZmZzZXQgPT0gLTEpCi0JCQkJYnJlYWs7CisgICAgICAgIGZvciAoOyBjb3VudCA+IDAgJiYgbGVuID4gMDsgLS1jb3VudCkgeworICAgICAgICAgICAgLyogZmluZCBpbmRleCBvZiBuZXh0IGluc3RhbmNlIG9mIHBhdHRlcm4gKi8KKyAgICAgICAgICAgIG9mZnNldCA9IG15bWVtZmluZChzdHIsIGxlbiwgcGF0LCBwYXRfbGVuKTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCS8qIGNvcHkgbm9uIG1hdGNoaW5nIHBhcnQgb2YgaW5wdXQgc3RyaW5nICovCi0JCQltZW1jcHkobmV3X3MsIHN0ciwgb2Zmc2V0KTsKLQkJCXN0ciArPSBvZmZzZXQgKyBwYXRfbGVuOwotCQkJbGVuIC09IG9mZnNldCArIHBhdF9sZW47CisgICAgICAgICAgICAvKiBjb3B5IG5vbiBtYXRjaGluZyBwYXJ0IG9mIGlucHV0IHN0cmluZyAqLworICAgICAgICAgICAgbWVtY3B5KG5ld19zLCBzdHIsIG9mZnNldCk7CisgICAgICAgICAgICBzdHIgKz0gb2Zmc2V0ICsgcGF0X2xlbjsKKyAgICAgICAgICAgIGxlbiAtPSBvZmZzZXQgKyBwYXRfbGVuOwogCi0JCQkvKiBjb3B5IHN1YnN0aXR1dGUgaW50byB0aGUgb3V0cHV0IHN0cmluZyAqLwotCQkJbmV3X3MgKz0gb2Zmc2V0OwotCQkJbWVtY3B5KG5ld19zLCBzdWIsIHN1Yl9sZW4pOwotCQkJbmV3X3MgKz0gc3ViX2xlbjsKLQkJfQotCQkvKiBjb3B5IGFueSByZW1haW5pbmcgdmFsdWVzIGludG8gb3V0cHV0IHN0cmluZyAqLwotCQlpZiAobGVuID4gMCkKLQkJCW1lbWNweShuZXdfcywgc3RyLCBsZW4pOwotCX0KLQkqb3V0X2xlbiA9IG5ld19sZW47Ci0JcmV0dXJuIG91dF9zOworICAgICAgICAgICAgLyogY29weSBzdWJzdGl0dXRlIGludG8gdGhlIG91dHB1dCBzdHJpbmcgKi8KKyAgICAgICAgICAgIG5ld19zICs9IG9mZnNldDsKKyAgICAgICAgICAgIG1lbWNweShuZXdfcywgc3ViLCBzdWJfbGVuKTsKKyAgICAgICAgICAgIG5ld19zICs9IHN1Yl9sZW47CisgICAgICAgIH0KKyAgICAgICAgLyogY29weSBhbnkgcmVtYWluaW5nIHZhbHVlcyBpbnRvIG91dHB1dCBzdHJpbmcgKi8KKyAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICBtZW1jcHkobmV3X3MsIHN0ciwgbGVuKTsKKyAgICB9CisgICAgKm91dF9sZW4gPSBuZXdfbGVuOworICAgIHJldHVybiBvdXRfczsKIAogICByZXR1cm5fc2FtZToKLQkqb3V0X2xlbiA9IC0xOwotCXJldHVybiAoY2hhciAqKXN0cjsgLyogY2FzdCBhd2F5IGNvbnN0ICovCisgICAgKm91dF9sZW4gPSAtMTsKKyAgICByZXR1cm4gKGNoYXIgKilzdHI7IC8qIGNhc3QgYXdheSBjb25zdCAqLwogfQogCiAKQEAgLTExNjQsNDEgKzExNjQsNDEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJvcF9yZXBsYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpzdHIsICpwYXQsKnN1YiwqbmV3X3M7Ci0JUHlfc3NpemVfdCBsZW4scGF0X2xlbixzdWJfbGVuLG91dF9sZW47Ci0JUHlfc3NpemVfdCBjb3VudCA9IC0xOwotCVB5T2JqZWN0ICpuZXdzdHI7CisgICAgY2hhciAqc3RyLCAqcGF0LCpzdWIsKm5ld19zOworICAgIFB5X3NzaXplX3QgbGVuLHBhdF9sZW4sc3ViX2xlbixvdXRfbGVuOworICAgIFB5X3NzaXplX3QgY291bnQgPSAtMTsKKyAgICBQeU9iamVjdCAqbmV3c3RyOwogCi0JV0FSTjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjdCN0I3xuOnJlcGxhY2UiLAotCQkJICAgICAgJnN0ciwgJmxlbiwgJnBhdCwgJnBhdF9sZW4sICZzdWIsICZzdWJfbGVuLAotCQkJICAgICAgJmNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9sZW4gPD0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHBhdHRlcm4gc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBDQVVUSU9OOiAgc3Ryb3AgdHJlYXRzIGEgcmVwbGFjZSBjb3VudCBvZiAwIGFzIGluZmluaXR5LCB1bmxrZQotCSAqIGN1cnJlbnQgKDIuMSkgc3RyaW5nLnB5IGFuZCBzdHJpbmcgbWV0aG9kcy4gIFByZXNlcnZlIHRoaXMgZm9yCi0JICogLi4uIHdlbGwsIGhhcmQgdG8gc2F5IGZvciB3aGF0IDx3aW5rPi4KLQkgKi8KLQlpZiAoY291bnQgPT0gMCkKLQkJY291bnQgPSAtMTsKLQluZXdfcyA9IG15bWVtcmVwbGFjZShzdHIsbGVuLHBhdCxwYXRfbGVuLHN1YixzdWJfbGVuLGNvdW50LCZvdXRfbGVuKTsKLQlpZiAobmV3X3MgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG91dF9sZW4gPT0gLTEpIHsKLQkJLyogd2UncmUgcmV0dXJuaW5nIGFub3RoZXIgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBzdHJpbmcgKi8KLQkJbmV3c3RyID0gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDApOwotCQlQeV9YSU5DUkVGKG5ld3N0cik7Ci0JfQotCWVsc2UgewotCQluZXdzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuZXdfcywgb3V0X2xlbik7Ci0JCVB5TWVtX0ZSRUUobmV3X3MpOwotCX0KLQlyZXR1cm4gbmV3c3RyOworICAgIFdBUk47CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ0I3QjdCN8bjpyZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ciwgJmxlbiwgJnBhdCwgJnBhdF9sZW4sICZzdWIsICZzdWJfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X2xlbiA8PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgcGF0dGVybiBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIENBVVRJT046ICBzdHJvcCB0cmVhdHMgYSByZXBsYWNlIGNvdW50IG9mIDAgYXMgaW5maW5pdHksIHVubGtlCisgICAgICogY3VycmVudCAoMi4xKSBzdHJpbmcucHkgYW5kIHN0cmluZyBtZXRob2RzLiAgUHJlc2VydmUgdGhpcyBmb3IKKyAgICAgKiAuLi4gd2VsbCwgaGFyZCB0byBzYXkgZm9yIHdoYXQgPHdpbms+LgorICAgICAqLworICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICBjb3VudCA9IC0xOworICAgIG5ld19zID0gbXltZW1yZXBsYWNlKHN0cixsZW4scGF0LHBhdF9sZW4sc3ViLHN1Yl9sZW4sY291bnQsJm91dF9sZW4pOworICAgIGlmIChuZXdfcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAob3V0X2xlbiA9PSAtMSkgeworICAgICAgICAvKiB3ZSdyZSByZXR1cm5pbmcgYW5vdGhlciByZWZlcmVuY2UgdG8gdGhlIGlucHV0IHN0cmluZyAqLworICAgICAgICBuZXdzdHIgPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgICAgIFB5X1hJTkNSRUYobmV3c3RyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5ld3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG5ld19zLCBvdXRfbGVuKTsKKyAgICAgICAgUHlNZW1fRlJFRShuZXdfcyk7CisgICAgfQorICAgIHJldHVybiBuZXdzdHI7CiB9CiAKIApAQCAtMTIwNiw2OSArMTIwNiw2OSBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYKIHN0cm9wX21ldGhvZHNbXSA9IHsKLQl7ImF0b2YiLAlzdHJvcF9hdG9mLAkgICBNRVRIX1ZBUkFSR1MsIGF0b2ZfX2RvY19ffSwKLQl7ImF0b2kiLAlzdHJvcF9hdG9pLAkgICBNRVRIX1ZBUkFSR1MsIGF0b2lfX2RvY19ffSwKLQl7ImF0b2wiLAlzdHJvcF9hdG9sLAkgICBNRVRIX1ZBUkFSR1MsIGF0b2xfX2RvY19ffSwKLQl7ImNhcGl0YWxpemUiLAlzdHJvcF9jYXBpdGFsaXplLCAgTUVUSF9PLCAgICAgICBjYXBpdGFsaXplX19kb2NfX30sCi0JeyJjb3VudCIsCXN0cm9wX2NvdW50LAkgICBNRVRIX1ZBUkFSR1MsIGNvdW50X19kb2NfX30sCi0JeyJleHBhbmR0YWJzIiwJc3Ryb3BfZXhwYW5kdGFicywgIE1FVEhfVkFSQVJHUywgZXhwYW5kdGFic19fZG9jX199LAotCXsiZmluZCIsCXN0cm9wX2ZpbmQsCSAgIE1FVEhfVkFSQVJHUywgZmluZF9fZG9jX199LAotCXsiam9pbiIsCXN0cm9wX2pvaW5maWVsZHMsICBNRVRIX1ZBUkFSR1MsIGpvaW5maWVsZHNfX2RvY19ffSwKLQl7ImpvaW5maWVsZHMiLAlzdHJvcF9qb2luZmllbGRzLCAgTUVUSF9WQVJBUkdTLCBqb2luZmllbGRzX19kb2NfX30sCi0JeyJsc3RyaXAiLAlzdHJvcF9sc3RyaXAsCSAgIE1FVEhfTywgICAgICAgbHN0cmlwX19kb2NfX30sCi0JeyJsb3dlciIsCXN0cm9wX2xvd2VyLAkgICBNRVRIX08sICAgICAgIGxvd2VyX19kb2NfX30sCi0JeyJtYWtldHJhbnMiLAlzdHJvcF9tYWtldHJhbnMsICAgTUVUSF9WQVJBUkdTLCBtYWtldHJhbnNfX2RvY19ffSwKLQl7InJlcGxhY2UiLAlzdHJvcF9yZXBsYWNlLAkgICBNRVRIX1ZBUkFSR1MsIHJlcGxhY2VfX2RvY19ffSwKLQl7InJmaW5kIiwJc3Ryb3BfcmZpbmQsCSAgIE1FVEhfVkFSQVJHUywgcmZpbmRfX2RvY19ffSwKLQl7InJzdHJpcCIsCXN0cm9wX3JzdHJpcCwJICAgTUVUSF9PLCAgICAgICByc3RyaXBfX2RvY19ffSwKLQl7InNwbGl0IiwJc3Ryb3Bfc3BsaXRmaWVsZHMsIE1FVEhfVkFSQVJHUywgc3BsaXRmaWVsZHNfX2RvY19ffSwKLQl7InNwbGl0ZmllbGRzIiwJc3Ryb3Bfc3BsaXRmaWVsZHMsIE1FVEhfVkFSQVJHUywgc3BsaXRmaWVsZHNfX2RvY19ffSwKLQl7InN0cmlwIiwJc3Ryb3Bfc3RyaXAsCSAgIE1FVEhfTywgICAgICAgc3RyaXBfX2RvY19ffSwKLQl7InN3YXBjYXNlIiwJc3Ryb3Bfc3dhcGNhc2UsICAgIE1FVEhfTywgICAgICAgc3dhcGNhc2VfX2RvY19ffSwKLQl7InRyYW5zbGF0ZSIsCXN0cm9wX3RyYW5zbGF0ZSwgICBNRVRIX1ZBUkFSR1MsIHRyYW5zbGF0ZV9fZG9jX199LAotCXsidXBwZXIiLAlzdHJvcF91cHBlciwJICAgTUVUSF9PLCAgICAgICB1cHBlcl9fZG9jX199LAotCXtOVUxMLAkJTlVMTH0JLyogc2VudGluZWwgKi8KKyAgICB7ImF0b2YiLCAgICAgICAgICAgIHN0cm9wX2F0b2YsICAgICAgICBNRVRIX1ZBUkFSR1MsIGF0b2ZfX2RvY19ffSwKKyAgICB7ImF0b2kiLCAgICAgICAgICAgIHN0cm9wX2F0b2ksICAgICAgICBNRVRIX1ZBUkFSR1MsIGF0b2lfX2RvY19ffSwKKyAgICB7ImF0b2wiLCAgICAgICAgICAgIHN0cm9wX2F0b2wsICAgICAgICBNRVRIX1ZBUkFSR1MsIGF0b2xfX2RvY19ffSwKKyAgICB7ImNhcGl0YWxpemUiLCAgICAgIHN0cm9wX2NhcGl0YWxpemUsICBNRVRIX08sICAgICAgIGNhcGl0YWxpemVfX2RvY19ffSwKKyAgICB7ImNvdW50IiwgICAgICAgICAgIHN0cm9wX2NvdW50LCAgICAgICBNRVRIX1ZBUkFSR1MsIGNvdW50X19kb2NfX30sCisgICAgeyJleHBhbmR0YWJzIiwgICAgICBzdHJvcF9leHBhbmR0YWJzLCAgTUVUSF9WQVJBUkdTLCBleHBhbmR0YWJzX19kb2NfX30sCisgICAgeyJmaW5kIiwgICAgICAgICAgICBzdHJvcF9maW5kLCAgICAgICAgTUVUSF9WQVJBUkdTLCBmaW5kX19kb2NfX30sCisgICAgeyJqb2luIiwgICAgICAgICAgICBzdHJvcF9qb2luZmllbGRzLCAgTUVUSF9WQVJBUkdTLCBqb2luZmllbGRzX19kb2NfX30sCisgICAgeyJqb2luZmllbGRzIiwgICAgICBzdHJvcF9qb2luZmllbGRzLCAgTUVUSF9WQVJBUkdTLCBqb2luZmllbGRzX19kb2NfX30sCisgICAgeyJsc3RyaXAiLCAgICAgICAgICBzdHJvcF9sc3RyaXAsICAgICAgTUVUSF9PLCAgICAgICBsc3RyaXBfX2RvY19ffSwKKyAgICB7Imxvd2VyIiwgICAgICAgICAgIHN0cm9wX2xvd2VyLCAgICAgICBNRVRIX08sICAgICAgIGxvd2VyX19kb2NfX30sCisgICAgeyJtYWtldHJhbnMiLCAgICAgICBzdHJvcF9tYWtldHJhbnMsICAgTUVUSF9WQVJBUkdTLCBtYWtldHJhbnNfX2RvY19ffSwKKyAgICB7InJlcGxhY2UiLCAgICAgICAgIHN0cm9wX3JlcGxhY2UsICAgICBNRVRIX1ZBUkFSR1MsIHJlcGxhY2VfX2RvY19ffSwKKyAgICB7InJmaW5kIiwgICAgICAgICAgIHN0cm9wX3JmaW5kLCAgICAgICBNRVRIX1ZBUkFSR1MsIHJmaW5kX19kb2NfX30sCisgICAgeyJyc3RyaXAiLCAgICAgICAgICBzdHJvcF9yc3RyaXAsICAgICAgTUVUSF9PLCAgICAgICByc3RyaXBfX2RvY19ffSwKKyAgICB7InNwbGl0IiwgICAgICAgICAgIHN0cm9wX3NwbGl0ZmllbGRzLCBNRVRIX1ZBUkFSR1MsIHNwbGl0ZmllbGRzX19kb2NfX30sCisgICAgeyJzcGxpdGZpZWxkcyIsICAgICBzdHJvcF9zcGxpdGZpZWxkcywgTUVUSF9WQVJBUkdTLCBzcGxpdGZpZWxkc19fZG9jX199LAorICAgIHsic3RyaXAiLCAgICAgICAgICAgc3Ryb3Bfc3RyaXAsICAgICAgIE1FVEhfTywgICAgICAgc3RyaXBfX2RvY19ffSwKKyAgICB7InN3YXBjYXNlIiwgICAgICAgIHN0cm9wX3N3YXBjYXNlLCAgICBNRVRIX08sICAgICAgIHN3YXBjYXNlX19kb2NfX30sCisgICAgeyJ0cmFuc2xhdGUiLCAgICAgICBzdHJvcF90cmFuc2xhdGUsICAgTUVUSF9WQVJBUkdTLCB0cmFuc2xhdGVfX2RvY19ffSwKKyAgICB7InVwcGVyIiwgICAgICAgICAgIHN0cm9wX3VwcGVyLCAgICAgICBNRVRIX08sICAgICAgIHVwcGVyX19kb2NfX30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0c3Ryb3Aodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKnM7Ci0JY2hhciBidWZbMjU2XTsKLQlpbnQgYywgbjsKLQltID0gUHlfSW5pdE1vZHVsZTQoInN0cm9wIiwgc3Ryb3BfbWV0aG9kcywgc3Ryb3BfbW9kdWxlX19kb2NfXywKLQkJCSAgIChQeU9iamVjdCopTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpzOworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgaW50IGMsIG47CisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJzdHJvcCIsIHN0cm9wX21ldGhvZHMsIHN0cm9wX21vZHVsZV9fZG9jX18sCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCopTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBDcmVhdGUgJ3doaXRlc3BhY2UnIG9iamVjdCAqLwotCW4gPSAwOwotCWZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykgewotCQlpZiAoaXNzcGFjZShjKSkKLQkJCWJ1ZltuKytdID0gYzsKLQl9Ci0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1Ziwgbik7Ci0JaWYgKHMpCi0JCVB5TW9kdWxlX0FkZE9iamVjdChtLCAid2hpdGVzcGFjZSIsIHMpOworICAgIC8qIENyZWF0ZSAnd2hpdGVzcGFjZScgb2JqZWN0ICovCisgICAgbiA9IDA7CisgICAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7CisgICAgICAgIGlmIChpc3NwYWNlKGMpKQorICAgICAgICAgICAgYnVmW24rK10gPSBjOworICAgIH0KKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBuKTsKKyAgICBpZiAocykKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ3aGl0ZXNwYWNlIiwgcyk7CiAKLQkvKiBDcmVhdGUgJ2xvd2VyY2FzZScgb2JqZWN0ICovCi0JbiA9IDA7Ci0JZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7Ci0JCWlmIChpc2xvd2VyKGMpKQotCQkJYnVmW24rK10gPSBjOwotCX0KLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBuKTsKLQlpZiAocykKLQkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJsb3dlcmNhc2UiLCBzKTsKKyAgICAvKiBDcmVhdGUgJ2xvd2VyY2FzZScgb2JqZWN0ICovCisgICAgbiA9IDA7CisgICAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKQorICAgICAgICAgICAgYnVmW24rK10gPSBjOworICAgIH0KKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBuKTsKKyAgICBpZiAocykKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJsb3dlcmNhc2UiLCBzKTsKIAotCS8qIENyZWF0ZSAndXBwZXJjYXNlJyBvYmplY3QgKi8KLQluID0gMDsKLQlmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspIHsKLQkJaWYgKGlzdXBwZXIoYykpCi0JCQlidWZbbisrXSA9IGM7Ci0JfQotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIG4pOwotCWlmIChzKQotCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInVwcGVyY2FzZSIsIHMpOworICAgIC8qIENyZWF0ZSAndXBwZXJjYXNlJyBvYmplY3QgKi8KKyAgICBuID0gMDsKKyAgICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspIHsKKyAgICAgICAgaWYgKGlzdXBwZXIoYykpCisgICAgICAgICAgICBidWZbbisrXSA9IGM7CisgICAgfQorICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIG4pOworICAgIGlmIChzKQorICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInVwcGVyY2FzZSIsIHMpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zdW5hdWRpb2Rldi5jIGIvTW9kdWxlcy9zdW5hdWRpb2Rldi5jCmluZGV4IDI4NWRjNjYuLjBjMzJmZTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3VuYXVkaW9kZXYuYworKysgYi9Nb2R1bGVzL3N1bmF1ZGlvZGV2LmMKQEAgLTIzLDk4ICsyMyw5OCBAQAogLyogI2RlZmluZSBvZmZzZXRvZihzdHIsbWVtKSAoKGludCkoKChzdHIgKikwKS0+bWVtKSkgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlpbnQJeF9mZDsJCS8qIFRoZSBvcGVuIGZpbGUgKi8KLQlpbnQJeF9pY291bnQ7CS8qICMgc2FtcGxlcyByZWFkICovCi0JaW50CXhfb2NvdW50OwkvKiAjIHNhbXBsZXMgd3JpdHRlbiAqLwotCWludAl4X2lzY3RsOwkvKiBUcnVlIGlmIGNvbnRyb2wgZGV2aWNlICovCi0JCisgICAgUHlPYmplY3RfSEVBRAorICAgIGludCAgICAgICAgIHhfZmQ7ICAgICAgICAgICAvKiBUaGUgb3BlbiBmaWxlICovCisgICAgaW50ICAgICAgICAgeF9pY291bnQ7ICAgICAgIC8qICMgc2FtcGxlcyByZWFkICovCisgICAgaW50ICAgICAgICAgeF9vY291bnQ7ICAgICAgIC8qICMgc2FtcGxlcyB3cml0dGVuICovCisgICAgaW50ICAgICAgICAgeF9pc2N0bDsgICAgICAgIC8qIFRydWUgaWYgY29udHJvbCBkZXZpY2UgKi8KKwogfSBzYWRvYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JYXVkaW9faW5mb190IGFpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBhdWRpb19pbmZvX3QgYWk7CiB9IHNhZHN0YXR1c29iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBTYWR0eXBlOwogc3RhdGljIFB5VHlwZU9iamVjdCBTYWRzdGF0dXN0eXBlOwotc3RhdGljIHNhZHN0YXR1c29iamVjdCAqc2Fkc19hbGxvYyh2b2lkKTsJLyogRm9yd2FyZCAqLworc3RhdGljIHNhZHN0YXR1c29iamVjdCAqc2Fkc19hbGxvYyh2b2lkKTsgICAgICAgLyogRm9yd2FyZCAqLwogCiBzdGF0aWMgUHlPYmplY3QgKlN1bkF1ZGlvRXJyb3I7CiAKLSNkZWZpbmUgaXNfc2Fkb2JqZWN0KHYpCQkoUHlfVFlQRSh2KSA9PSAmU2FkdHlwZSkKLSNkZWZpbmUgaXNfc2Fkc3RhdHVzb2JqZWN0KHYpCShQeV9UWVBFKHYpID09ICZTYWRzdGF0dXN0eXBlKQorI2RlZmluZSBpc19zYWRvYmplY3QodikgICAgICAgICAoUHlfVFlQRSh2KSA9PSAmU2FkdHlwZSkKKyNkZWZpbmUgaXNfc2Fkc3RhdHVzb2JqZWN0KHYpICAgKFB5X1RZUEUodikgPT0gJlNhZHN0YXR1c3R5cGUpCiAKIAogc3RhdGljIHNhZG9iamVjdCAqCiBuZXdzYWRvYmplY3QoUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc2Fkb2JqZWN0ICp4cDsKLQlpbnQgZmQ7Ci0JY2hhciAqbW9kZTsKLQlpbnQgaW1vZGU7Ci0JY2hhciogYmFzZWRldjsKLQljaGFyKiBjdGxkZXY7Ci0JY2hhciogb3BlbmRldjsKKyAgICBzYWRvYmplY3QgKnhwOworICAgIGludCBmZDsKKyAgICBjaGFyICptb2RlOworICAgIGludCBpbW9kZTsKKyAgICBjaGFyKiBiYXNlZGV2OworICAgIGNoYXIqIGN0bGRldjsKKyAgICBjaGFyKiBvcGVuZGV2OwogCi0JLyogQ2hlY2sgYXJnIGZvciByL3cvcncgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmbW9kZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzdHJjbXAobW9kZSwgInIiKSA9PSAwKQotCQlpbW9kZSA9IDA7Ci0JZWxzZSBpZiAoc3RyY21wKG1vZGUsICJ3IikgPT0gMCkKLQkJaW1vZGUgPSAxOwotCWVsc2UgaWYgKHN0cmNtcChtb2RlLCAicnciKSA9PSAwKQotCQlpbW9kZSA9IDI7Ci0JZWxzZSBpZiAoc3RyY21wKG1vZGUsICJjb250cm9sIikgPT0gMCkKLQkJaW1vZGUgPSAtMTsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN1bkF1ZGlvRXJyb3IsCi0JCQkgICJNb2RlIHNob3VsZCBiZSBvbmUgb2YgJ3InLCAndycsICdydycgb3IgJ2NvbnRyb2wnIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQkvKiBPcGVuIHRoZSBjb3JyZWN0IGRldmljZS4gIFRoZSBiYXNlIGRldmljZSBuYW1lIGNvbWVzIGZyb20gdGhlCi0JICogQVVESU9ERVYgZW52aXJvbm1lbnQgdmFyaWFibGUgZmlyc3QsIHRoZW4gL2Rldi9hdWRpby4gIFRoZQotCSAqIGNvbnRyb2wgZGV2aWNlIHRhY2tzICJjdGwiIG9udG8gdGhlIGJhc2UgZGV2aWNlIG5hbWUuCi0JICovCi0JYmFzZWRldiA9IGdldGVudigiQVVESU9ERVYiKTsKLQlpZiAoIWJhc2VkZXYpCi0JCWJhc2VkZXYgPSAiL2Rldi9hdWRpbyI7Ci0JY3RsZGV2ID0gUHlNZW1fTkVXKGNoYXIsIHN0cmxlbihiYXNlZGV2KSArIDQpOwotCWlmICghY3RsZGV2KSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdHJjcHkoY3RsZGV2LCBiYXNlZGV2KTsKLQlzdHJjYXQoY3RsZGV2LCAiY3RsIik7CisgICAgLyogQ2hlY2sgYXJnIGZvciByL3cvcncgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMiLCAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzdHJjbXAobW9kZSwgInIiKSA9PSAwKQorICAgICAgICBpbW9kZSA9IDA7CisgICAgZWxzZSBpZiAoc3RyY21wKG1vZGUsICJ3IikgPT0gMCkKKyAgICAgICAgaW1vZGUgPSAxOworICAgIGVsc2UgaWYgKHN0cmNtcChtb2RlLCAicnciKSA9PSAwKQorICAgICAgICBpbW9kZSA9IDI7CisgICAgZWxzZSBpZiAoc3RyY21wKG1vZGUsICJjb250cm9sIikgPT0gMCkKKyAgICAgICAgaW1vZGUgPSAtMTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN1bkF1ZGlvRXJyb3IsCisgICAgICAgICAgICAgICAgICAiTW9kZSBzaG91bGQgYmUgb25lIG9mICdyJywgJ3cnLCAncncnIG9yICdjb250cm9sJyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoaW1vZGUgPCAwKSB7Ci0JCW9wZW5kZXYgPSBjdGxkZXY7Ci0JCWZkID0gb3BlbihjdGxkZXYsIDIpOwotCX0KLQllbHNlIHsKLQkJb3BlbmRldiA9IGJhc2VkZXY7Ci0JCWZkID0gb3BlbihiYXNlZGV2LCBpbW9kZSk7Ci0JfQotCWlmIChmZCA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFN1bkF1ZGlvRXJyb3IsIG9wZW5kZXYpOwotCQlQeU1lbV9ERUwoY3RsZGV2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5TWVtX0RFTChjdGxkZXYpOworICAgIC8qIE9wZW4gdGhlIGNvcnJlY3QgZGV2aWNlLiAgVGhlIGJhc2UgZGV2aWNlIG5hbWUgY29tZXMgZnJvbSB0aGUKKyAgICAgKiBBVURJT0RFViBlbnZpcm9ubWVudCB2YXJpYWJsZSBmaXJzdCwgdGhlbiAvZGV2L2F1ZGlvLiAgVGhlCisgICAgICogY29udHJvbCBkZXZpY2UgdGFja3MgImN0bCIgb250byB0aGUgYmFzZSBkZXZpY2UgbmFtZS4KKyAgICAgKi8KKyAgICBiYXNlZGV2ID0gZ2V0ZW52KCJBVURJT0RFViIpOworICAgIGlmICghYmFzZWRldikKKyAgICAgICAgYmFzZWRldiA9ICIvZGV2L2F1ZGlvIjsKKyAgICBjdGxkZXYgPSBQeU1lbV9ORVcoY2hhciwgc3RybGVuKGJhc2VkZXYpICsgNCk7CisgICAgaWYgKCFjdGxkZXYpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cmNweShjdGxkZXYsIGJhc2VkZXYpOworICAgIHN0cmNhdChjdGxkZXYsICJjdGwiKTsKIAotCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgb2JqZWN0ICovCi0JeHAgPSBQeU9iamVjdF9OZXcoc2Fkb2JqZWN0LCAmU2FkdHlwZSk7Ci0JaWYgKHhwID09IE5VTEwpIHsKLQkJY2xvc2UoZmQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeHAtPnhfZmQgPSBmZDsKLQl4cC0+eF9pY291bnQgPSB4cC0+eF9vY291bnQgPSAwOwotCXhwLT54X2lzY3RsID0gKGltb2RlIDwgMCk7Ci0JCi0JcmV0dXJuIHhwOworICAgIGlmIChpbW9kZSA8IDApIHsKKyAgICAgICAgb3BlbmRldiA9IGN0bGRldjsKKyAgICAgICAgZmQgPSBvcGVuKGN0bGRldiwgMik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBvcGVuZGV2ID0gYmFzZWRldjsKKyAgICAgICAgZmQgPSBvcGVuKGJhc2VkZXYsIGltb2RlKTsKKyAgICB9CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUoU3VuQXVkaW9FcnJvciwgb3BlbmRldik7CisgICAgICAgIFB5TWVtX0RFTChjdGxkZXYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlNZW1fREVMKGN0bGRldik7CisKKyAgICAvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIG9iamVjdCAqLworICAgIHhwID0gUHlPYmplY3RfTmV3KHNhZG9iamVjdCwgJlNhZHR5cGUpOworICAgIGlmICh4cCA9PSBOVUxMKSB7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHhwLT54X2ZkID0gZmQ7CisgICAgeHAtPnhfaWNvdW50ID0geHAtPnhfb2NvdW50ID0gMDsKKyAgICB4cC0+eF9pc2N0bCA9IChpbW9kZSA8IDApOworCisgICAgcmV0dXJuIHhwOwogfQogCiAvKiBTYWQgbWV0aG9kcyAqLwpAQCAtMTIyLDMyNyArMTIyLDMyNyBAQAogc3RhdGljIHZvaWQKIHNhZF9kZWFsbG9jKHNhZG9iamVjdCAqeHApCiB7Ci0gICAgICAgIGNsb3NlKHhwLT54X2ZkKTsKLQlQeU9iamVjdF9EZWwoeHApOworICAgIGNsb3NlKHhwLT54X2ZkKTsKKyAgICBQeU9iamVjdF9EZWwoeHApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2FkX3JlYWQoc2Fkb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgaW50IHNpemUsIGNvdW50OwotCWNoYXIgKmNwOwotCVB5T2JqZWN0ICpydjsKLQkKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWQiLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7Ci0JaWYgKHJ2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGludCBzaXplLCBjb3VudDsKKyAgICBjaGFyICpjcDsKKyAgICBQeU9iamVjdCAqcnY7CiAKLQlpZiAoIShjcCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJ2KSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVhZCIsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKTsKKyAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljb3VudCA9IHJlYWQoc2VsZi0+eF9mZCwgY3AsIHNpemUpOwotCWlmIChjb3VudCA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOwotCQlnb3RvIGZpbmFsbHk7Ci0JfQorICAgIGlmICghKGNwID0gUHlTdHJpbmdfQXNTdHJpbmcocnYpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworCisgICAgY291bnQgPSByZWFkKHNlbGYtPnhfZmQsIGNwLCBzaXplKTsKKyAgICBpZiAoY291bnQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KICNpZiAwCi0JLyogVEJEOiB3aHkgcHJpbnQgdGhpcyBtZXNzYWdlIGlmIHlvdSBjYW4gaGFuZGxlIHRoZSBjb25kaXRpb24/Ci0JICogYXNzdW1lIGl0J3MgZGVidWdnaW5nIGluZm8gd2hpY2ggd2UgY2FuIGp1c3QgYXMgd2VsbCBnZXQgcmlkCi0JICogb2YuICBpbiBhbnkgY2FzZSB0aGlzIG1lc3NhZ2Ugc2hvdWxkICpub3QqIGJlIHVzaW5nIHByaW50ZiEKLQkgKi8KLQlpZiAoY291bnQgIT0gc2l6ZSkKLQkJcHJpbnRmKCJzdW5hdWRpbzogZnVubnkgcmVhZCBydiAlZCB3dGQgJWRcbiIsIGNvdW50LCBzaXplKTsKKyAgICAvKiBUQkQ6IHdoeSBwcmludCB0aGlzIG1lc3NhZ2UgaWYgeW91IGNhbiBoYW5kbGUgdGhlIGNvbmRpdGlvbj8KKyAgICAgKiBhc3N1bWUgaXQncyBkZWJ1Z2dpbmcgaW5mbyB3aGljaCB3ZSBjYW4ganVzdCBhcyB3ZWxsIGdldCByaWQKKyAgICAgKiBvZi4gIGluIGFueSBjYXNlIHRoaXMgbWVzc2FnZSBzaG91bGQgKm5vdCogYmUgdXNpbmcgcHJpbnRmIQorICAgICAqLworICAgIGlmIChjb3VudCAhPSBzaXplKQorICAgICAgICBwcmludGYoInN1bmF1ZGlvOiBmdW5ueSByZWFkIHJ2ICVkIHd0ZCAlZFxuIiwgY291bnQsIHNpemUpOwogI2VuZGlmCi0Jc2VsZi0+eF9pY291bnQgKz0gY291bnQ7Ci0JcmV0dXJuIHJ2OworICAgIHNlbGYtPnhfaWNvdW50ICs9IGNvdW50OworICAgIHJldHVybiBydjsKIAogICBmaW5hbGx5OgotCVB5X0RFQ1JFRihydik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF93cml0ZShzYWRvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBjaGFyICpjcDsKLQlpbnQgY291bnQsIHNpemU7Ci0JCi0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6d3JpdGUiLCAmY3AsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgY2hhciAqY3A7CisgICAgaW50IGNvdW50LCBzaXplOwogCi0JY291bnQgPSB3cml0ZShzZWxmLT54X2ZkLCBjcCwgc2l6ZSk7Ci0JaWYgKGNvdW50IDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOndyaXRlIiwgJmNwLCAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY291bnQgPSB3cml0ZShzZWxmLT54X2ZkLCBjcCwgc2l6ZSk7CisgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNpZiAwCi0JaWYgKGNvdW50ICE9IHNpemUpCi0JCXByaW50Zigic3VuYXVkaW86IGZ1bm55IHdyaXRlIHJ2ICVkIHdhbnRlZCAlZFxuIiwgY291bnQsIHNpemUpOworICAgIGlmIChjb3VudCAhPSBzaXplKQorICAgICAgICBwcmludGYoInN1bmF1ZGlvOiBmdW5ueSB3cml0ZSBydiAlZCB3YW50ZWQgJWRcbiIsIGNvdW50LCBzaXplKTsKICNlbmRpZgotCXNlbGYtPnhfb2NvdW50ICs9IGNvdW50OwotCQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzZWxmLT54X29jb3VudCArPSBjb3VudDsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9nZXRpbmZvKHNhZG9iamVjdCAqc2VsZikKIHsKLQlzYWRzdGF0dXNvYmplY3QgKnJ2OworICAgIHNhZHN0YXR1c29iamVjdCAqcnY7CiAKLQlpZiAoIShydiA9IHNhZHNfYWxsb2MoKSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghKHJ2ID0gc2Fkc19hbGxvYygpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fR0VUSU5GTywgJnJ2LT5haSkgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKLQkJUHlfREVDUkVGKHJ2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilydjsKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fR0VUSU5GTywgJnJ2LT5haSkgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilydjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9zZXRpbmZvKHNhZG9iamVjdCAqc2VsZiwgc2Fkc3RhdHVzb2JqZWN0ICphcmcpCiB7Ci0JaWYgKCFpc19zYWRzdGF0dXNvYmplY3QoYXJnKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJNdXN0IGJlIHN1biBhdWRpbyBzdGF0dXMgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fU0VUSU5GTywgJmFyZy0+YWkpIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFpc19zYWRzdGF0dXNvYmplY3QoYXJnKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk11c3QgYmUgc3VuIGF1ZGlvIHN0YXR1cyBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpb2N0bChzZWxmLT54X2ZkLCBBVURJT19TRVRJTkZPLCAmYXJnLT5haSkgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9pYnVmY291bnQoc2Fkb2JqZWN0ICpzZWxmKQogewotCWF1ZGlvX2luZm9fdCBhaTsKLSAgICAKLQlpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fR0VUSU5GTywgJmFpKSA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGFpLnJlY29yZC5zYW1wbGVzIC0gc2VsZi0+eF9pY291bnQpOworICAgIGF1ZGlvX2luZm9fdCBhaTsKKworICAgIGlmIChpb2N0bChzZWxmLT54X2ZkLCBBVURJT19HRVRJTkZPLCAmYWkpIDwgMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoYWkucmVjb3JkLnNhbXBsZXMgLSBzZWxmLT54X2ljb3VudCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfb2J1ZmNvdW50KHNhZG9iamVjdCAqc2VsZikKIHsKLQlhdWRpb19pbmZvX3QgYWk7Ci0gICAgCi0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0dFVElORk8sICZhaSkgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIHhfb2NvdW50IGlzIGluIGJ5dGVzLCB3aGVyZWFzIHBsYXkuc2FtcGxlcyBpcyBpbiBmcmFtZXMgKi8KLQkvKiB3ZSB3YW50IGZyYW1lcyAqLwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT54X29jb3VudCAvIChhaS5wbGF5LmNoYW5uZWxzICoKLQkJCQkJCWFpLnBsYXkucHJlY2lzaW9uIC8gOCkgLQotCQkJICAgICAgYWkucGxheS5zYW1wbGVzKTsKKyAgICBhdWRpb19pbmZvX3QgYWk7CisKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fR0VUSU5GTywgJmFpKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogeF9vY291bnQgaXMgaW4gYnl0ZXMsIHdoZXJlYXMgcGxheS5zYW1wbGVzIGlzIGluIGZyYW1lcyAqLworICAgIC8qIHdlIHdhbnQgZnJhbWVzICovCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPnhfb2NvdW50IC8gKGFpLnBsYXkuY2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaS5wbGF5LnByZWNpc2lvbiAvIDgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWkucGxheS5zYW1wbGVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9kcmFpbihzYWRvYmplY3QgKnNlbGYpCiB7Ci0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIEFVRElPX0RSQUlOLCAwKSA8IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChpb2N0bChzZWxmLT54X2ZkLCBBVURJT19EUkFJTiwgMCkgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2lmZGVmIFNPTEFSSVMKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRfZ2V0ZGV2KHNhZG9iamVjdCAqc2VsZikKIHsKLQlzdHJ1Y3QgYXVkaW9fZGV2aWNlIGFkOworICAgIHN0cnVjdCBhdWRpb19kZXZpY2UgYWQ7CiAKLQlpZiAoaW9jdGwoc2VsZi0+eF9mZCwgQVVESU9fR0VUREVWLCAmYWQpIDwgMCkgewotCQlQeUVycl9TZXRGcm9tRXJybm8oU3VuQXVkaW9FcnJvcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzcykiLCBhZC5uYW1lLCBhZC52ZXJzaW9uLCBhZC5jb25maWcpOworICAgIGlmIChpb2N0bChzZWxmLT54X2ZkLCBBVURJT19HRVRERVYsICZhZCkgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3NzKSIsIGFkLm5hbWUsIGFkLnZlcnNpb24sIGFkLmNvbmZpZyk7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9mbHVzaChzYWRvYmplY3QgKnNlbGYpCiB7Ci0JaWYgKGlvY3RsKHNlbGYtPnhfZmQsIElfRkxVU0gsIEZMVVNIVykgPCAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhTdW5BdWRpb0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoaW9jdGwoc2VsZi0+eF9mZCwgSV9GTFVTSCwgRkxVU0hXKSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFN1bkF1ZGlvRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2FkX2Nsb3NlKHNhZG9iamVjdCAqc2VsZikKIHsKLSAgICAKLQlpZiAoc2VsZi0+eF9mZCA+PSAwKSB7Ci0JCWNsb3NlKHNlbGYtPnhfZmQpOwotCQlzZWxmLT54X2ZkID0gLTE7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKworICAgIGlmIChzZWxmLT54X2ZkID49IDApIHsKKyAgICAgICAgY2xvc2Uoc2VsZi0+eF9mZCk7CisgICAgICAgIHNlbGYtPnhfZmQgPSAtMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2FkX2ZpbGVubyhzYWRvYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPnhfZmQpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT54X2ZkKTsKIH0KIAogCiBzdGF0aWMgUHlNZXRob2REZWYgc2FkX21ldGhvZHNbXSA9IHsKLSAgICAgICAgeyAicmVhZCIsCShQeUNGdW5jdGlvbilzYWRfcmVhZCwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgIndyaXRlIiwJKFB5Q0Z1bmN0aW9uKXNhZF93cml0ZSwgTUVUSF9WQVJBUkdTIH0sCi0gICAgICAgIHsgImlidWZjb3VudCIsCShQeUNGdW5jdGlvbilzYWRfaWJ1ZmNvdW50LCBNRVRIX05PQVJHUyB9LAotICAgICAgICB7ICJvYnVmY291bnQiLAkoUHlDRnVuY3Rpb24pc2FkX29idWZjb3VudCwgTUVUSF9OT0FSR1MgfSwKKyAgICB7ICJyZWFkIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzYWRfcmVhZCwgTUVUSF9WQVJBUkdTIH0sCisgICAgeyAid3JpdGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2FkX3dyaXRlLCBNRVRIX1ZBUkFSR1MgfSwKKyAgICB7ICJpYnVmY291bnQiLCAgICAgIChQeUNGdW5jdGlvbilzYWRfaWJ1ZmNvdW50LCBNRVRIX05PQVJHUyB9LAorICAgIHsgIm9idWZjb3VudCIsICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9vYnVmY291bnQsIE1FVEhfTk9BUkdTIH0sCiAjZGVmaW5lIENUTF9NRVRIT0RTIDQKLSAgICAgICAgeyAiZ2V0aW5mbyIsCShQeUNGdW5jdGlvbilzYWRfZ2V0aW5mbywgTUVUSF9OT0FSR1MgfSwKLSAgICAgICAgeyAic2V0aW5mbyIsCShQeUNGdW5jdGlvbilzYWRfc2V0aW5mbywgTUVUSF9PfSwKLSAgICAgICAgeyAiZHJhaW4iLAkoUHlDRnVuY3Rpb24pc2FkX2RyYWluLCBNRVRIX05PQVJHUyB9LAotICAgICAgICB7ICJmbHVzaCIsCShQeUNGdW5jdGlvbilzYWRfZmx1c2gsIE1FVEhfTk9BUkdTIH0sCisgICAgeyAiZ2V0aW5mbyIsICAgICAgICAoUHlDRnVuY3Rpb24pc2FkX2dldGluZm8sIE1FVEhfTk9BUkdTIH0sCisgICAgeyAic2V0aW5mbyIsICAgICAgICAoUHlDRnVuY3Rpb24pc2FkX3NldGluZm8sIE1FVEhfT30sCisgICAgeyAiZHJhaW4iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2FkX2RyYWluLCBNRVRIX05PQVJHUyB9LAorICAgIHsgImZsdXNoIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNhZF9mbHVzaCwgTUVUSF9OT0FSR1MgfSwKICNpZmRlZiBTT0xBUklTCi0JeyAiZ2V0ZGV2IiwJKFB5Q0Z1bmN0aW9uKXNhZF9nZXRkZXYsIE1FVEhfTk9BUkdTIH0sCisgICAgeyAiZ2V0ZGV2IiwgICAgICAgICAoUHlDRnVuY3Rpb24pc2FkX2dldGRldiwgTUVUSF9OT0FSR1MgfSwKICNlbmRpZgotICAgICAgICB7ICJjbG9zZSIsCShQeUNGdW5jdGlvbilzYWRfY2xvc2UsIE1FVEhfTk9BUkdTIH0sCi0JeyAiZmlsZW5vIiwgICAgIChQeUNGdW5jdGlvbilzYWRfZmlsZW5vLCBNRVRIX05PQVJHUyB9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyAiY2xvc2UiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2FkX2Nsb3NlLCBNRVRIX05PQVJHUyB9LAorICAgIHsgImZpbGVubyIsICAgICAoUHlDRnVuY3Rpb24pc2FkX2ZpbGVubywgTUVUSF9OT0FSR1MgfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZF9nZXRhdHRyKHNhZG9iamVjdCAqeHAsIGNoYXIgKm5hbWUpCiB7Ci0JaWYgKHhwLT54X2lzY3RsKQotCQlyZXR1cm4gUHlfRmluZE1ldGhvZChzYWRfbWV0aG9kcytDVExfTUVUSE9EUywKLQkJCQkgICAgIChQeU9iamVjdCAqKXhwLCBuYW1lKTsKLQllbHNlCi0JCXJldHVybiBQeV9GaW5kTWV0aG9kKHNhZF9tZXRob2RzLCAoUHlPYmplY3QgKil4cCwgbmFtZSk7CisgICAgaWYgKHhwLT54X2lzY3RsKQorICAgICAgICByZXR1cm4gUHlfRmluZE1ldGhvZChzYWRfbWV0aG9kcytDVExfTUVUSE9EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopeHAsIG5hbWUpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc2FkX21ldGhvZHMsIChQeU9iamVjdCAqKXhwLCBuYW1lKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIHNhZHN0YXR1c29iamVjdCAqCiBzYWRzX2FsbG9jKHZvaWQpIHsKLQlyZXR1cm4gUHlPYmplY3RfTmV3KHNhZHN0YXR1c29iamVjdCwgJlNhZHN0YXR1c3R5cGUpOworICAgIHJldHVybiBQeU9iamVjdF9OZXcoc2Fkc3RhdHVzb2JqZWN0LCAmU2Fkc3RhdHVzdHlwZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBzYWRzX2RlYWxsb2Moc2Fkc3RhdHVzb2JqZWN0ICp4cCkKIHsKLQlQeU1lbV9ERUwoeHApOworICAgIFB5TWVtX0RFTCh4cCk7CiB9CiAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKGF1ZGlvX2luZm9fdCx4KQogc3RhdGljIHN0cnVjdCBtZW1iZXJsaXN0IHNhZHNfbWxbXSA9IHsKLQl7ICJpX3NhbXBsZV9yYXRlIiwJVF9VSU5ULAkJT0ZGKHJlY29yZC5zYW1wbGVfcmF0ZSkgfSwKLQl7ICJpX2NoYW5uZWxzIiwJCVRfVUlOVCwJCU9GRihyZWNvcmQuY2hhbm5lbHMpIH0sCi0JeyAiaV9wcmVjaXNpb24iLAlUX1VJTlQsCQlPRkYocmVjb3JkLnByZWNpc2lvbikgfSwKLQl7ICJpX2VuY29kaW5nIiwJCVRfVUlOVCwJCU9GRihyZWNvcmQuZW5jb2RpbmcpIH0sCi0JeyAiaV9nYWluIiwJCVRfVUlOVCwJCU9GRihyZWNvcmQuZ2FpbikgfSwKLQl7ICJpX3BvcnQiLAkJVF9VSU5ULAkJT0ZGKHJlY29yZC5wb3J0KSB9LAotCXsgImlfc2FtcGxlcyIsCQlUX1VJTlQsCQlPRkYocmVjb3JkLnNhbXBsZXMpIH0sCi0JeyAiaV9lb2YiLAkJVF9VSU5ULAkJT0ZGKHJlY29yZC5lb2YpIH0sCi0JeyAiaV9wYXVzZSIsCQlUX1VCWVRFLAlPRkYocmVjb3JkLnBhdXNlKSB9LAotCXsgImlfZXJyb3IiLAkJVF9VQllURSwJT0ZGKHJlY29yZC5lcnJvcikgfSwKLQl7ICJpX3dhaXRpbmciLAkJVF9VQllURSwJT0ZGKHJlY29yZC53YWl0aW5nKSB9LAotCXsgImlfb3BlbiIsCQlUX1VCWVRFLAlPRkYocmVjb3JkLm9wZW4pICwJIFJPfSwKLQl7ICJpX2FjdGl2ZSIsCQlUX1VCWVRFLAlPRkYocmVjb3JkLmFjdGl2ZSkgLAkgUk99LAorICAgIHsgImlfc2FtcGxlX3JhdGUiLCAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5zYW1wbGVfcmF0ZSkgfSwKKyAgICB7ICJpX2NoYW5uZWxzIiwgICAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihyZWNvcmQuY2hhbm5lbHMpIH0sCisgICAgeyAiaV9wcmVjaXNpb24iLCAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocmVjb3JkLnByZWNpc2lvbikgfSwKKyAgICB7ICJpX2VuY29kaW5nIiwgICAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihyZWNvcmQuZW5jb2RpbmcpIH0sCisgICAgeyAiaV9nYWluIiwgICAgICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocmVjb3JkLmdhaW4pIH0sCisgICAgeyAiaV9wb3J0IiwgICAgICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocmVjb3JkLnBvcnQpIH0sCisgICAgeyAiaV9zYW1wbGVzIiwgICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocmVjb3JkLnNhbXBsZXMpIH0sCisgICAgeyAiaV9lb2YiLCAgICAgICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocmVjb3JkLmVvZikgfSwKKyAgICB7ICJpX3BhdXNlIiwgICAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihyZWNvcmQucGF1c2UpIH0sCisgICAgeyAiaV9lcnJvciIsICAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocmVjb3JkLmVycm9yKSB9LAorICAgIHsgImlfd2FpdGluZyIsICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHJlY29yZC53YWl0aW5nKSB9LAorICAgIHsgImlfb3BlbiIsICAgICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHJlY29yZC5vcGVuKSAsICAgICAgIFJPfSwKKyAgICB7ICJpX2FjdGl2ZSIsICAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihyZWNvcmQuYWN0aXZlKSAsICAgICBST30sCiAjaWZkZWYgU09MQVJJUwotCXsgImlfYnVmZmVyX3NpemUiLAlUX1VJTlQsCQlPRkYocmVjb3JkLmJ1ZmZlcl9zaXplKSB9LAotCXsgImlfYmFsYW5jZSIsCQlUX1VCWVRFLAlPRkYocmVjb3JkLmJhbGFuY2UpIH0sCi0JeyAiaV9hdmFpbF9wb3J0cyIsCVRfVUlOVCwJCU9GRihyZWNvcmQuYXZhaWxfcG9ydHMpIH0sCisgICAgeyAiaV9idWZmZXJfc2l6ZSIsICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocmVjb3JkLmJ1ZmZlcl9zaXplKSB9LAorICAgIHsgImlfYmFsYW5jZSIsICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHJlY29yZC5iYWxhbmNlKSB9LAorICAgIHsgImlfYXZhaWxfcG9ydHMiLCAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHJlY29yZC5hdmFpbF9wb3J0cykgfSwKICNlbmRpZgogCi0JeyAib19zYW1wbGVfcmF0ZSIsCVRfVUlOVCwJCU9GRihwbGF5LnNhbXBsZV9yYXRlKSB9LAotCXsgIm9fY2hhbm5lbHMiLAkJVF9VSU5ULAkJT0ZGKHBsYXkuY2hhbm5lbHMpIH0sCi0JeyAib19wcmVjaXNpb24iLAlUX1VJTlQsCQlPRkYocGxheS5wcmVjaXNpb24pIH0sCi0JeyAib19lbmNvZGluZyIsCQlUX1VJTlQsCQlPRkYocGxheS5lbmNvZGluZykgfSwKLQl7ICJvX2dhaW4iLAkJVF9VSU5ULAkJT0ZGKHBsYXkuZ2FpbikgfSwKLQl7ICJvX3BvcnQiLAkJVF9VSU5ULAkJT0ZGKHBsYXkucG9ydCkgfSwKLQl7ICJvX3NhbXBsZXMiLAkJVF9VSU5ULAkJT0ZGKHBsYXkuc2FtcGxlcykgfSwKLQl7ICJvX2VvZiIsCQlUX1VJTlQsCQlPRkYocGxheS5lb2YpIH0sCi0JeyAib19wYXVzZSIsCQlUX1VCWVRFLAlPRkYocGxheS5wYXVzZSkgfSwKLQl7ICJvX2Vycm9yIiwJCVRfVUJZVEUsCU9GRihwbGF5LmVycm9yKSB9LAotCXsgIm9fd2FpdGluZyIsCQlUX1VCWVRFLAlPRkYocGxheS53YWl0aW5nKSB9LAotCXsgIm9fb3BlbiIsCQlUX1VCWVRFLAlPRkYocGxheS5vcGVuKSAsCSBST30sCi0JeyAib19hY3RpdmUiLAkJVF9VQllURSwJT0ZGKHBsYXkuYWN0aXZlKSAsCSBST30sCisgICAgeyAib19zYW1wbGVfcmF0ZSIsICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocGxheS5zYW1wbGVfcmF0ZSkgfSwKKyAgICB7ICJvX2NoYW5uZWxzIiwgICAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LmNoYW5uZWxzKSB9LAorICAgIHsgIm9fcHJlY2lzaW9uIiwgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkucHJlY2lzaW9uKSB9LAorICAgIHsgIm9fZW5jb2RpbmciLCAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkuZW5jb2RpbmcpIH0sCisgICAgeyAib19nYWluIiwgICAgICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocGxheS5nYWluKSB9LAorICAgIHsgIm9fcG9ydCIsICAgICAgICAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkucG9ydCkgfSwKKyAgICB7ICJvX3NhbXBsZXMiLCAgICAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihwbGF5LnNhbXBsZXMpIH0sCisgICAgeyAib19lb2YiLCAgICAgICAgICAgICAgICAgIFRfVUlOVCwgICAgICAgICBPRkYocGxheS5lb2YpIH0sCisgICAgeyAib19wYXVzZSIsICAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocGxheS5wYXVzZSkgfSwKKyAgICB7ICJvX2Vycm9yIiwgICAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihwbGF5LmVycm9yKSB9LAorICAgIHsgIm9fd2FpdGluZyIsICAgICAgICAgICAgICBUX1VCWVRFLCAgICAgICAgT0ZGKHBsYXkud2FpdGluZykgfSwKKyAgICB7ICJvX29wZW4iLCAgICAgICAgICAgICAgICAgVF9VQllURSwgICAgICAgIE9GRihwbGF5Lm9wZW4pICwgICAgICAgICBST30sCisgICAgeyAib19hY3RpdmUiLCAgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocGxheS5hY3RpdmUpICwgICAgICAgUk99LAogI2lmZGVmIFNPTEFSSVMKLQl7ICJvX2J1ZmZlcl9zaXplIiwJVF9VSU5ULAkJT0ZGKHBsYXkuYnVmZmVyX3NpemUpIH0sCi0JeyAib19iYWxhbmNlIiwJCVRfVUJZVEUsCU9GRihwbGF5LmJhbGFuY2UpIH0sCi0JeyAib19hdmFpbF9wb3J0cyIsCVRfVUlOVCwJCU9GRihwbGF5LmF2YWlsX3BvcnRzKSB9LAorICAgIHsgIm9fYnVmZmVyX3NpemUiLCAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkuYnVmZmVyX3NpemUpIH0sCisgICAgeyAib19iYWxhbmNlIiwgICAgICAgICAgICAgIFRfVUJZVEUsICAgICAgICBPRkYocGxheS5iYWxhbmNlKSB9LAorICAgIHsgIm9fYXZhaWxfcG9ydHMiLCAgICAgICAgICBUX1VJTlQsICAgICAgICAgT0ZGKHBsYXkuYXZhaWxfcG9ydHMpIH0sCiAjZW5kaWYKIAotCXsgIm1vbml0b3JfZ2FpbiIsCVRfVUlOVCwJCU9GRihtb25pdG9yX2dhaW4pIH0sCi0gICAgICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAwfSwKKyAgICB7ICJtb25pdG9yX2dhaW4iLCAgICAgICAgICAgVF9VSU5ULCAgICAgICAgIE9GRihtb25pdG9yX2dhaW4pIH0sCisgICAgeyBOVUxMLCAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIDB9LAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNhZHNfZ2V0YXR0cihzYWRzdGF0dXNvYmplY3QgKnhwLCBjaGFyICpuYW1lKQogewotCXJldHVybiBQeU1lbWJlcl9HZXQoKGNoYXIgKikmeHAtPmFpLCBzYWRzX21sLCBuYW1lKTsKKyAgICByZXR1cm4gUHlNZW1iZXJfR2V0KChjaGFyICopJnhwLT5haSwgc2Fkc19tbCwgbmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQKIHNhZHNfc2V0YXR0cihzYWRzdGF0dXNvYmplY3QgKnhwLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKIAotCWlmICh2ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3QgZGVsZXRlIHN1biBhdWRpbyBzdGF0dXMgYXR0cmlidXRlcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBQeU1lbWJlcl9TZXQoKGNoYXIgKikmeHAtPmFpLCBzYWRzX21sLCBuYW1lLCB2KTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIHN1biBhdWRpbyBzdGF0dXMgYXR0cmlidXRlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBQeU1lbWJlcl9TZXQoKGNoYXIgKikmeHAtPmFpLCBzYWRzX21sLCBuYW1lLCB2KTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU2FkdHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJzdW5hdWRpb2Rldi5zdW5fYXVkaW9fZGV2aWNlIiwJLyp0cF9uYW1lKi8KLQlzaXplb2Yoc2Fkb2JqZWN0KSwJCS8qdHBfc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXNhZF9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCTAsCQkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylzYWRfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkJLyp0cF9yZXByKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzdW5hdWRpb2Rldi5zdW5fYXVkaW9fZGV2aWNlIiwgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKHNhZG9iamVjdCksICAgICAgICAgICAgICAgICAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3Ipc2FkX2RlYWxsb2MsICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpc2FkX2dldGF0dHIsICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBTYWRzdGF0dXN0eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInN1bmF1ZGlvZGV2LnN1bl9hdWRpb19kZXZpY2Vfc3RhdHVzIiwgLyp0cF9uYW1lKi8KLQlzaXplb2Yoc2Fkc3RhdHVzb2JqZWN0KSwJLyp0cF9zaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3Ipc2Fkc19kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCTAsCQkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylzYWRzX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKXNhZHNfc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJCS8qdHBfcmVwciovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAic3VuYXVkaW9kZXYuc3VuX2F1ZGlvX2RldmljZV9zdGF0dXMiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihzYWRzdGF0dXNvYmplY3QpLCAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXNhZHNfZGVhbGxvYywgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKXNhZHNfZ2V0YXR0ciwgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpc2Fkc19zZXRhdHRyLCAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzYWRvcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3c2Fkb2JqZWN0KGFyZ3MpOworICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdzYWRvYmplY3QoYXJncyk7CiB9Ci0gICAgCisKIHN0YXRpYyBQeU1ldGhvZERlZiBzdW5hdWRpb2Rldl9tZXRob2RzW10gPSB7CiAgICAgeyAib3BlbiIsIHNhZG9wZW4sIE1FVEhfVkFSQVJHUyB9LAogICAgIHsgMCwgMCB9LApAQCAtNDUxLDE3ICs0NTEsMTcgQEAKIHZvaWQKIGluaXRzdW5hdWRpb2Rldih2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQkKLQlpZiAoUHlFcnJfV2FyblB5M2soInRoZSBzdW5hdWRpb2RldiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCi0JICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQotCSAgICByZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JbSA9IFB5X0luaXRNb2R1bGUoInN1bmF1ZGlvZGV2Iiwgc3VuYXVkaW9kZXZfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVN1bkF1ZGlvRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInN1bmF1ZGlvZGV2LmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JaWYgKFN1bkF1ZGlvRXJyb3IpCi0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIFN1bkF1ZGlvRXJyb3IpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIHN1bmF1ZGlvZGV2IG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJzdW5hdWRpb2RldiIsIHN1bmF1ZGlvZGV2X21ldGhvZHMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBTdW5BdWRpb0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJzdW5hdWRpb2Rldi5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIGlmIChTdW5BdWRpb0Vycm9yKQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBTdW5BdWRpb0Vycm9yKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc3Ztb2R1bGUuYyBiL01vZHVsZXMvc3Ztb2R1bGUuYwppbmRleCAzODQ1ZTIwLi42ZTQxOWNlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3N2bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zdm1vZHVsZS5jCkBAIC05LDIzICs5LDIzIEBACiAjaW5jbHVkZSA8c3ZpZGVvLmg+CiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAiY29tcGlsZS5oIgotI2luY2x1ZGUgInl1di5oIgkJLyogZm9yIFlVViBjb252ZXJzaW9uIGZ1bmN0aW9ucyAqLworI2luY2x1ZGUgInl1di5oIiAgICAgICAgICAgICAgICAvKiBmb3IgWVVWIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JU1Zfbm9kZVAgb2Jfc3ZpZGVvOwotCXN2Q2FwdHVyZUluZm8gb2JfaW5mbzsKKyAgICBQeU9iamVjdF9IRUFECisgICAgU1Zfbm9kZVAgb2Jfc3ZpZGVvOworICAgIHN2Q2FwdHVyZUluZm8gb2JfaW5mbzsKIH0gc3ZvYmplY3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0Jdm9pZCAqb2JfY2FwdHVyZTsKLQlpbnQgb2JfbXVzdHVubG9jazsKLQlzdkNhcHR1cmVJbmZvIG9iX2luZm87Ci0Jc3ZvYmplY3QgKm9iX3N2aWRlbzsKKyAgICBQeU9iamVjdF9IRUFECisgICAgdm9pZCAqb2JfY2FwdHVyZTsKKyAgICBpbnQgb2JfbXVzdHVubG9jazsKKyAgICBzdkNhcHR1cmVJbmZvIG9iX2luZm87CisgICAgc3ZvYmplY3QgKm9iX3N2aWRlbzsKIH0gY2FwdHVyZW9iamVjdDsKIAotc3RhdGljIFB5T2JqZWN0ICpTdkVycm9yOwkJLyogZXhjZXB0aW9uIHN2LmVycm9yICovCitzdGF0aWMgUHlPYmplY3QgKlN2RXJyb3I7ICAgICAgICAgICAgICAgLyogZXhjZXB0aW9uIHN2LmVycm9yICovCiAKIHN0YXRpYyBQeU9iamVjdCAqbmV3Y2FwdHVyZW9iamVjdChzdm9iamVjdCAqLCB2b2lkICosIGludCk7CiAKQEAgLTMzLDM2ICszMywzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X2Vycm9yKHZvaWQpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsIHN2U3RyZXJyb3Ioc3ZpZGVvX2Vycm5vKSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsIHN2U3RyZXJyb3Ioc3ZpZGVvX2Vycm5vKSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1zdmNfY29udmVyc2lvbihjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAoKmZ1bmN0aW9uKSgpLAlmbG9hdCBmYWN0b3IpCitzdmNfY29udmVyc2lvbihjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAoKmZ1bmN0aW9uKSgpLCBmbG9hdCBmYWN0b3IpCiB7Ci0JUHlPYmplY3QgKm91dHB1dDsKLQlpbnQgaW52ZXJ0OwotCWNoYXIqIG91dHN0cjsKKyAgICBQeU9iamVjdCAqb3V0cHV0OworICAgIGludCBpbnZlcnQ7CisgICAgY2hhciogb3V0c3RyOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiaSIsICZpbnZlcnQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJpIiwgJmludmVydCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCEob3V0cHV0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0JCU5VTEwsCi0JCShpbnQpKHNlbGYtPm9iX2luZm8ud2lkdGggKiBzZWxmLT5vYl9pbmZvLmhlaWdodCAqIGZhY3RvcikpKSkKLQl7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIShvdXRzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhvdXRwdXQpKSkgewotCQlQeV9ERUNSRUYob3V0cHV0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghKG91dHB1dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICBOVUxMLAorICAgICAgICAoaW50KShzZWxmLT5vYl9pbmZvLndpZHRoICogc2VsZi0+b2JfaW5mby5oZWlnaHQgKiBmYWN0b3IpKSkpCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCEob3V0c3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob3V0cHV0KSkpIHsKKyAgICAgICAgUHlfREVDUkVGKG91dHB1dCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCSgqZnVuY3Rpb24pKChib29sZWFuKWludmVydCwgc2VsZi0+b2JfY2FwdHVyZSwKLQkJICAgIG91dHN0ciwKLQkJICAgIHNlbGYtPm9iX2luZm8ud2lkdGgsIHNlbGYtPm9iX2luZm8uaGVpZ2h0KTsKKyAgICAoKmZ1bmN0aW9uKSgoYm9vbGVhbilpbnZlcnQsIHNlbGYtPm9iX2NhcHR1cmUsCisgICAgICAgICAgICAgICAgb3V0c3RyLAorICAgICAgICAgICAgICAgIHNlbGYtPm9iX2luZm8ud2lkdGgsIHNlbGYtPm9iX2luZm8uaGVpZ2h0KTsKIAotCXJldHVybiBvdXRwdXQ7CisgICAgcmV0dXJuIG91dHB1dDsKIH0KIAogLyoKQEAgLTcyLDExNyArNzIsMTE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3ZjX1lVVnRvWVVWNDIyREMoY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKHNlbGYtPm9iX2luZm8uZm9ybWF0ICE9IFNWX1lVVjQxMV9GUkFNRVMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywgeXV2X3N2NDExX3RvX2NsNDIyZGMsIDIuMCk7CisgICAgaWYgKHNlbGYtPm9iX2luZm8uZm9ybWF0ICE9IFNWX1lVVjQxMV9GUkFNRVMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhcyBiYWQgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywgeXV2X3N2NDExX3RvX2NsNDIyZGMsIDIuMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdmNfWVVWdG9ZVVY0MjJEQ19xdWFydGVyKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9ZVVY0MTFfRlJBTUVTKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBoYXMgYmFkIGZvcm1hdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHN2Y19jb252ZXJzaW9uKHNlbGYsIGFyZ3MsCi0JCQkgICAgICB5dXZfc3Y0MTFfdG9fY2w0MjJkY19xdWFydGVyc2l6ZSwgMC41KTsKKyAgICBpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfWVVWNDExX0ZSQU1FUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfc3Y0MTFfdG9fY2w0MjJkY19xdWFydGVyc2l6ZSwgMC41KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19ZVVZ0b1lVVjQyMkRDX3NpeHRlZW50aChjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoc2VsZi0+b2JfaW5mby5mb3JtYXQgIT0gU1ZfWVVWNDExX0ZSQU1FUykgewotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLAotCQkJICAgICAgeXV2X3N2NDExX3RvX2NsNDIyZGNfc2l4dGVlbnRoc2l6ZSwgMC4xMjUpOworICAgIGlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9ZVVY0MTFfRlJBTUVTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBoYXMgYmFkIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHN2Y19jb252ZXJzaW9uKHNlbGYsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHl1dl9zdjQxMV90b19jbDQyMmRjX3NpeHRlZW50aHNpemUsIDAuMTI1KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19ZVVZ0b1JHQihjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzd2l0Y2ggKHNlbGYtPm9iX2luZm8uZm9ybWF0KSB7Ci0JY2FzZSBTVl9ZVVY0MTFfRlJBTUVTOgotCWNhc2UgU1ZfWVVWNDExX0ZSQU1FU19BTkRfQkxBTktJTkdfQlVGRkVSOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFkIGJhZCBmb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdllVVnRvUkdCLCAoZmxvYXQpIHNpemVvZihsb25nKSk7CisgICAgc3dpdGNoIChzZWxmLT5vYl9pbmZvLmZvcm1hdCkgeworICAgIGNhc2UgU1ZfWVVWNDExX0ZSQU1FUzoKKyAgICBjYXNlIFNWX1lVVjQxMV9GUkFNRVNfQU5EX0JMQU5LSU5HX0JVRkZFUjoKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGhhZCBiYWQgZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gc3ZjX2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZZVVZ0b1JHQiwgKGZsb2F0KSBzaXplb2YobG9uZykpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZjX1JHQjh0b1JHQjMyKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9SR0I4X0ZSQU1FUykgewotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdlJHQjh0b1JHQjMyLCAoZmxvYXQpIHNpemVvZihsb25nKSk7CisgICAgaWYgKHNlbGYtPm9iX2luZm8uZm9ybWF0ICE9IFNWX1JHQjhfRlJBTUVTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBoYXMgYmFkIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHN2Y19jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHN2UkdCOHRvUkdCMzIsIChmbG9hdCkgc2l6ZW9mKGxvbmcpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19JbnRlcmxlYXZlRmllbGRzKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9SR0I4X0ZSQU1FUykgewotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzdmNfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdkludGVybGVhdmVGaWVsZHMsIDEuMCk7CisgICAgaWYgKHNlbGYtPm9iX2luZm8uZm9ybWF0ICE9IFNWX1JHQjhfRlJBTUVTKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBoYXMgYmFkIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHN2Y19jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHN2SW50ZXJsZWF2ZUZpZWxkcywgMS4wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2Y19HZXRGaWVsZHMoY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmYxID0gTlVMTDsKLQlQeU9iamVjdCAqZjIgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCWludCBmaWVsZHNpemU7Ci0JY2hhciogb2JjYXB0dXJlOworICAgIFB5T2JqZWN0ICpmMSA9IE5VTEw7CisgICAgUHlPYmplY3QgKmYyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBpbnQgZmllbGRzaXplOworICAgIGNoYXIqIG9iY2FwdHVyZTsKIAotCWlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9SR0I4X0ZSQU1FUykgewotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzZWxmLT5vYl9pbmZvLmZvcm1hdCAhPSBTVl9SR0I4X0ZSQU1FUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImRhdGEgaGFzIGJhZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZmllbGRzaXplID0gc2VsZi0+b2JfaW5mby53aWR0aCAqIHNlbGYtPm9iX2luZm8uaGVpZ2h0IC8gMjsKLQlvYmNhcHR1cmUgPSAoY2hhciopc2VsZi0+b2JfY2FwdHVyZTsKLQkKLQlpZiAoIShmMSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG9iY2FwdHVyZSwgZmllbGRzaXplKSkpCi0JCWdvdG8gZmluYWxseTsKLQlpZiAoIShmMiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG9iY2FwdHVyZSArIGZpZWxkc2l6ZSwKLQkJCQkJICAgICAgZmllbGRzaXplKSkpCi0JCWdvdG8gZmluYWxseTsKLQlyZXQgPSBQeVR1cGxlX1BhY2soMiwgZjEsIGYyKTsKKyAgICBmaWVsZHNpemUgPSBzZWxmLT5vYl9pbmZvLndpZHRoICogc2VsZi0+b2JfaW5mby5oZWlnaHQgLyAyOworICAgIG9iY2FwdHVyZSA9IChjaGFyKilzZWxmLT5vYl9jYXB0dXJlOworCisgICAgaWYgKCEoZjEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvYmNhcHR1cmUsIGZpZWxkc2l6ZSkpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKCEoZjIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvYmNhcHR1cmUgKyBmaWVsZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNpemUpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIHJldCA9IFB5VHVwbGVfUGFjaygyLCBmMSwgZjIpOwogCiAgIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRihmMSk7Ci0JUHlfWERFQ1JFRihmMik7Ci0JcmV0dXJuIHJldDsKKyAgICBQeV9YREVDUkVGKGYxKTsKKyAgICBQeV9YREVDUkVGKGYyKTsKKyAgICByZXR1cm4gcmV0OwogfQotCQorCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZjX1VubG9ja0NhcHR1cmVEYXRhKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIXNlbGYtPm9iX211c3R1bmxvY2spIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJidWZmZXIgc2hvdWxkIG5vdCBiZSB1bmxvY2tlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFzZWxmLT5vYl9tdXN0dW5sb2NrKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiYnVmZmVyIHNob3VsZCBub3QgYmUgdW5sb2NrZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKHN2VW5sb2NrQ2FwdHVyZURhdGEoc2VsZi0+b2Jfc3ZpZGVvLT5vYl9zdmlkZW8sIHNlbGYtPm9iX2NhcHR1cmUpKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZVbmxvY2tDYXB0dXJlRGF0YShzZWxmLT5vYl9zdmlkZW8tPm9iX3N2aWRlbywgc2VsZi0+b2JfY2FwdHVyZSkpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0Jc2VsZi0+b2JfbXVzdHVubG9jayA9IDA7CisgICAgc2VsZi0+b2JfbXVzdHVubG9jayA9IDA7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAjaWZkZWYgVVNFX0dMCkBAIC0xOTEsNzgwICsxOTEsNzgwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3ZjX2xyZWN0d3JpdGUoY2FwdHVyZW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU2NyZWVuY29vcmQgeDEsIHgyLCB5MSwgeTI7CisgICAgU2NyZWVuY29vcmQgeDEsIHgyLCB5MSwgeTI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaGhoaCkiLCAmeDEsICZ4MiwgJnkxLCAmeTIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaGhoaCkiLCAmeDEsICZ4MiwgJnkxLCAmeTIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWxyZWN0d3JpdGUoeDEsIHgyLCB5MSwgeTIsICh1bnNpZ25lZCBsb25nICopIHNlbGYtPm9iX2NhcHR1cmUpOworICAgIGxyZWN0d3JpdGUoeDEsIHgyLCB5MSwgeTIsICh1bnNpZ25lZCBsb25nICopIHNlbGYtPm9iX2NhcHR1cmUpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZjX3dyaXRlZmlsZShjYXB0dXJlb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZmlsZTsKLQlpbnQgc2l6ZTsKLQlGSUxFKiBmcDsKKyAgICBQeU9iamVjdCAqZmlsZTsKKyAgICBpbnQgc2l6ZTsKKyAgICBGSUxFKiBmcDsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIk8iLCAmZmlsZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIk8iLCAmZmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUZpbGVfQ2hlY2soZmlsZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJub3QgYSBmaWxlIG9iamVjdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUZpbGVfQ2hlY2soZmlsZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJub3QgYSBmaWxlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoIShmcCA9IFB5RmlsZV9Bc0ZpbGUoZmlsZSkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIShmcCA9IFB5RmlsZV9Bc0ZpbGUoZmlsZSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNpemUgPSBzZWxmLT5vYl9pbmZvLndpZHRoICogc2VsZi0+b2JfaW5mby5oZWlnaHQ7CisgICAgc2l6ZSA9IHNlbGYtPm9iX2luZm8ud2lkdGggKiBzZWxmLT5vYl9pbmZvLmhlaWdodDsKIAotCWlmIChmd3JpdGUoc2VsZi0+b2JfY2FwdHVyZSwgc2l6ZW9mKGxvbmcpLCBzaXplLCBmcCkgIT0gc2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgIndyaXRpbmcgZmFpbGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZndyaXRlKHNlbGYtPm9iX2NhcHR1cmUsIHNpemVvZihsb25nKSwgc2l6ZSwgZnApICE9IHNpemUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJ3cml0aW5nIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZjX0ZpbmRWaXNpYmxlUmVnaW9uKGNhcHR1cmVvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXZvaWQgKnZpc2libGU7Ci0JaW50IHdpZHRoOworICAgIHZvaWQgKnZpc2libGU7CisgICAgaW50IHdpZHRoOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdkZpbmRWaXNpYmxlUmVnaW9uKHNlbGYtPm9iX3N2aWRlby0+b2Jfc3ZpZGVvLAotCQkJCXNlbGYtPm9iX2NhcHR1cmUsICZ2aXNpYmxlLAotCQkJCXNlbGYtPm9iX2luZm8ud2lkdGgpKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZGaW5kVmlzaWJsZVJlZ2lvbihzZWxmLT5vYl9zdmlkZW8tPm9iX3N2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9jYXB0dXJlLCAmdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9pbmZvLndpZHRoKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlpZiAodmlzaWJsZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAiZGF0YSBpbiB3cm9uZyBmb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh2aXNpYmxlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJkYXRhIGluIHdyb25nIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gbmV3Y2FwdHVyZW9iamVjdChzZWxmLT5vYl9zdmlkZW8sIHZpc2libGUsIDApOworICAgIHJldHVybiBuZXdjYXB0dXJlb2JqZWN0KHNlbGYtPm9iX3N2aWRlbywgdmlzaWJsZSwgMCk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjYXB0dXJlX21ldGhvZHNbXSA9IHsKLQl7IllVVnRvUkdCIiwJCShQeUNGdW5jdGlvbilzdmNfWVVWdG9SR0IsIE1FVEhfT0xEQVJHU30sCi0JeyJSR0I4dG9SR0IzMiIsCQkoUHlDRnVuY3Rpb24pc3ZjX1JHQjh0b1JHQjMyLCBNRVRIX09MREFSR1N9LAotCXsiSW50ZXJsZWF2ZUZpZWxkcyIsCShQeUNGdW5jdGlvbilzdmNfSW50ZXJsZWF2ZUZpZWxkcywgTUVUSF9PTERBUkdTfSwKLQl7IlVubG9ja0NhcHR1cmVEYXRhIiwJKFB5Q0Z1bmN0aW9uKXN2Y19VbmxvY2tDYXB0dXJlRGF0YSwgTUVUSF9PTERBUkdTfSwKLQl7IkZpbmRWaXNpYmxlUmVnaW9uIiwJKFB5Q0Z1bmN0aW9uKXN2Y19GaW5kVmlzaWJsZVJlZ2lvbiwgTUVUSF9PTERBUkdTfSwKLQl7IkdldEZpZWxkcyIsCQkoUHlDRnVuY3Rpb24pc3ZjX0dldEZpZWxkcywgTUVUSF9PTERBUkdTfSwKLQl7IllVVnRvWVVWNDIyREMiLAkoUHlDRnVuY3Rpb24pc3ZjX1lVVnRvWVVWNDIyREMsIE1FVEhfT0xEQVJHU30sCi0JeyJZVVZ0b1lVVjQyMkRDX3F1YXJ0ZXIiLChQeUNGdW5jdGlvbilzdmNfWVVWdG9ZVVY0MjJEQ19xdWFydGVyLCBNRVRIX09MREFSR1N9LAotCXsiWVVWdG9ZVVY0MjJEQ19zaXh0ZWVudGgiLChQeUNGdW5jdGlvbilzdmNfWVVWdG9ZVVY0MjJEQ19zaXh0ZWVudGgsIE1FVEhfT0xEQVJHU30sCisgICAgeyJZVVZ0b1JHQiIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdmNfWVVWdG9SR0IsIE1FVEhfT0xEQVJHU30sCisgICAgeyJSR0I4dG9SR0IzMiIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdmNfUkdCOHRvUkdCMzIsIE1FVEhfT0xEQVJHU30sCisgICAgeyJJbnRlcmxlYXZlRmllbGRzIiwgICAgICAgIChQeUNGdW5jdGlvbilzdmNfSW50ZXJsZWF2ZUZpZWxkcywgTUVUSF9PTERBUkdTfSwKKyAgICB7IlVubG9ja0NhcHR1cmVEYXRhIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXN2Y19VbmxvY2tDYXB0dXJlRGF0YSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkZpbmRWaXNpYmxlUmVnaW9uIiwgICAgICAgKFB5Q0Z1bmN0aW9uKXN2Y19GaW5kVmlzaWJsZVJlZ2lvbiwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldEZpZWxkcyIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2Y19HZXRGaWVsZHMsIE1FVEhfT0xEQVJHU30sCisgICAgeyJZVVZ0b1lVVjQyMkRDIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilzdmNfWVVWdG9ZVVY0MjJEQywgTUVUSF9PTERBUkdTfSwKKyAgICB7IllVVnRvWVVWNDIyRENfcXVhcnRlciIsKFB5Q0Z1bmN0aW9uKXN2Y19ZVVZ0b1lVVjQyMkRDX3F1YXJ0ZXIsIE1FVEhfT0xEQVJHU30sCisgICAgeyJZVVZ0b1lVVjQyMkRDX3NpeHRlZW50aCIsKFB5Q0Z1bmN0aW9uKXN2Y19ZVVZ0b1lVVjQyMkRDX3NpeHRlZW50aCwgTUVUSF9PTERBUkdTfSwKICNpZmRlZiBVU0VfR0wKLQl7ImxyZWN0d3JpdGUiLAkJKFB5Q0Z1bmN0aW9uKXN2Y19scmVjdHdyaXRlLCBNRVRIX09MREFSR1N9LAorICAgIHsibHJlY3R3cml0ZSIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZjX2xyZWN0d3JpdGUsIE1FVEhfT0xEQVJHU30sCiAjZW5kaWYKLQl7IndyaXRlZmlsZSIsCQkoUHlDRnVuY3Rpb24pc3ZjX3dyaXRlZmlsZSwgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfSAJCS8qIHNlbnRpbmVsICovCisgICAgeyJ3cml0ZWZpbGUiLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdmNfd3JpdGVmaWxlLCBNRVRIX09MREFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyB2b2lkCiBjYXB0dXJlX2RlYWxsb2MoY2FwdHVyZW9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfY2FwdHVyZSAhPSBOVUxMKSB7Ci0JCWlmIChzZWxmLT5vYl9tdXN0dW5sb2NrKQotCQkJKHZvaWQpc3ZVbmxvY2tDYXB0dXJlRGF0YShzZWxmLT5vYl9zdmlkZW8tPm9iX3N2aWRlbywKLQkJCQkJCSAgc2VsZi0+b2JfY2FwdHVyZSk7Ci0JCXNlbGYtPm9iX2NhcHR1cmUgPSBOVUxMOwotCQlQeV9ERUNSRUYoc2VsZi0+b2Jfc3ZpZGVvKTsKLQkJc2VsZi0+b2Jfc3ZpZGVvID0gTlVMTDsKLQl9Ci0JUHlPYmplY3RfRGVsKHNlbGYpOworICAgIGlmIChzZWxmLT5vYl9jYXB0dXJlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNlbGYtPm9iX211c3R1bmxvY2spCisgICAgICAgICAgICAodm9pZClzdlVubG9ja0NhcHR1cmVEYXRhKHNlbGYtPm9iX3N2aWRlby0+b2Jfc3ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9jYXB0dXJlKTsKKyAgICAgICAgc2VsZi0+b2JfY2FwdHVyZSA9IE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5vYl9zdmlkZW8pOworICAgICAgICBzZWxmLT5vYl9zdmlkZW8gPSBOVUxMOworICAgIH0KKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYXB0dXJlX2dldGF0dHIoc3ZvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoY2FwdHVyZV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChjYXB0dXJlX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCiBQeVR5cGVPYmplY3QgQ2FwdHVyZXR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJzdi5jYXB0dXJlIiwJCQkvKnRwX25hbWUqLwotCXNpemVvZihjYXB0dXJlb2JqZWN0KSwJCS8qdHBfc2l6ZSovCi0JMCwJCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWNhcHR1cmVfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpY2FwdHVyZV9nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCTAsCQkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCQkvKnRwX3JlcHIqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAic3YuY2FwdHVyZSIsICAgICAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihjYXB0dXJlb2JqZWN0KSwgICAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWNhcHR1cmVfZGVhbGxvYywgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWNhcHR1cmVfZ2V0YXR0ciwgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBuZXdjYXB0dXJlb2JqZWN0KHN2b2JqZWN0ICpzZWxmLCB2b2lkICpwdHIsIGludCBtdXN0dW5sb2NrKQogewotCWNhcHR1cmVvYmplY3QgKnA7CisgICAgY2FwdHVyZW9iamVjdCAqcDsKIAotCXAgPSBQeU9iamVjdF9OZXcoY2FwdHVyZW9iamVjdCwgJkNhcHR1cmV0eXBlKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwLT5vYl9zdmlkZW8gPSBzZWxmOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlwLT5vYl9jYXB0dXJlID0gcHRyOwotCXAtPm9iX211c3R1bmxvY2sgPSBtdXN0dW5sb2NrOwotCXAtPm9iX2luZm8gPSBzZWxmLT5vYl9pbmZvOwotCXJldHVybiAoUHlPYmplY3QgKikgcDsKKyAgICBwID0gUHlPYmplY3RfTmV3KGNhcHR1cmVvYmplY3QsICZDYXB0dXJldHlwZSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcC0+b2Jfc3ZpZGVvID0gc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcC0+b2JfY2FwdHVyZSA9IHB0cjsKKyAgICBwLT5vYl9tdXN0dW5sb2NrID0gbXVzdHVubG9jazsKKyAgICBwLT5vYl9pbmZvID0gc2VsZi0+b2JfaW5mbzsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9HZXRDYXB0dXJlRGF0YShzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jdm9pZCAqcHRyOwotCWxvbmcgZmllbGRJRDsKLQlQeU9iamVjdCAqcmVzLCAqYzsKKyAgICB2b2lkICpwdHI7CisgICAgbG9uZyBmaWVsZElEOworICAgIFB5T2JqZWN0ICpyZXMsICpjOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdkdldENhcHR1cmVEYXRhKHNlbGYtPm9iX3N2aWRlbywgJnB0ciwgJmZpZWxkSUQpKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZHZXRDYXB0dXJlRGF0YShzZWxmLT5vYl9zdmlkZW8sICZwdHIsICZmaWVsZElEKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlpZiAocHRyID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJubyBkYXRhIGF2YWlsYWJsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhTdkVycm9yLCAibm8gZGF0YSBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYyA9IG5ld2NhcHR1cmVvYmplY3Qoc2VsZiwgcHRyLCAxKTsKLQlpZiAoYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSBQeV9CdWlsZFZhbHVlKCIoT2kpIiwgYywgZmllbGRJRCk7Ci0JUHlfREVDUkVGKGMpOwotCXJldHVybiByZXM7CisgICAgYyA9IG5ld2NhcHR1cmVvYmplY3Qoc2VsZiwgcHRyLCAxKTsKKyAgICBpZiAoYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCIoT2kpIiwgYywgZmllbGRJRCk7CisgICAgUHlfREVDUkVGKGMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9CaW5kR0xXaW5kb3coc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgd2lkOwotCWludCBtb2RlOworICAgIGxvbmcgd2lkOworICAgIGludCBtb2RlOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZ3aWQsICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZ3aWQsICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZCaW5kR0xXaW5kb3coc2VsZi0+b2Jfc3ZpZGVvLCB3aWQsIG1vZGUpKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZCaW5kR0xXaW5kb3coc2VsZi0+b2Jfc3ZpZGVvLCB3aWQsIG1vZGUpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9FbmRDb250aW51b3VzQ2FwdHVyZShzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2RW5kQ29udGludW91c0NhcHR1cmUoc2VsZi0+b2Jfc3ZpZGVvKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2RW5kQ29udGludW91c0NhcHR1cmUoc2VsZi0+b2Jfc3ZpZGVvKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfSXNWaWRlb0Rpc3BsYXllZChzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHY7CisgICAgaW50IHY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdiA9IHN2SXNWaWRlb0Rpc3BsYXllZChzZWxmLT5vYl9zdmlkZW8pOwotCWlmICh2ID09IC0xKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICB2ID0gc3ZJc1ZpZGVvRGlzcGxheWVkKHNlbGYtPm9iX3N2aWRlbyk7CisgICAgaWYgKHYgPT0gLTEpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfT3V0cHV0T2Zmc2V0KHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgeF9vZmZzZXQ7Ci0JaW50IHlfb2Zmc2V0OworICAgIGludCB4X29mZnNldDsKKyAgICBpbnQgeV9vZmZzZXQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnhfb2Zmc2V0LCAmeV9vZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJnhfb2Zmc2V0LCAmeV9vZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdk91dHB1dE9mZnNldChzZWxmLT5vYl9zdmlkZW8sIHhfb2Zmc2V0LCB5X29mZnNldCkpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdk91dHB1dE9mZnNldChzZWxmLT5vYl9zdmlkZW8sIHhfb2Zmc2V0LCB5X29mZnNldCkpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X1B1dEZyYW1lKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpidWZmZXI7CisgICAgY2hhciAqYnVmZmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAicyIsICZidWZmZXIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICJzIiwgJmJ1ZmZlcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2UHV0RnJhbWUoc2VsZi0+b2Jfc3ZpZGVvLCBidWZmZXIpKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZQdXRGcmFtZShzZWxmLT5vYl9zdmlkZW8sIGJ1ZmZlcikpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X1F1ZXJ5U2l6ZShzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHc7Ci0JaW50IGg7Ci0JaW50IHJ3OwotCWludCByaDsKKyAgICBpbnQgdzsKKyAgICBpbnQgaDsKKyAgICBpbnQgcnc7CisgICAgaW50IHJoOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZ3LCAmaCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmdywgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdlF1ZXJ5U2l6ZShzZWxmLT5vYl9zdmlkZW8sIHcsIGgsICZydywgJnJoKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2UXVlcnlTaXplKHNlbGYtPm9iX3N2aWRlbywgdywgaCwgJnJ3LCAmcmgpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgKGxvbmcpIHJ3LCAobG9uZykgcmgpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWkpIiwgKGxvbmcpIHJ3LCAobG9uZykgcmgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfU2V0U2l6ZShzdm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHc7Ci0JaW50IGg7CisgICAgaW50IHc7CisgICAgaW50IGg7CiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWkpIiwgJncsICZoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZ3LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2U2V0U2l6ZShzZWxmLT5vYl9zdmlkZW8sIHcsIGgpKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZTZXRTaXplKHNlbGYtPm9iX3N2aWRlbywgdywgaCkpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X1NldFN0ZERlZmF1bHRzKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZTZXRTdGREZWZhdWx0cyhzZWxmLT5vYl9zdmlkZW8pKQotCQlyZXR1cm4gc3ZfZXJyb3IoKTsKKyAgICBpZiAoc3ZTZXRTdGREZWZhdWx0cyhzZWxmLT5vYl9zdmlkZW8pKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9Vc2VFeGNsdXNpdmUoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWJvb2xlYW4gb25vZmY7Ci0JaW50IG1vZGU7CisgICAgYm9vbGVhbiBvbm9mZjsKKyAgICBpbnQgbW9kZTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmb25vZmYsICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpKSIsICZvbm9mZiwgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChzdlVzZUV4Y2x1c2l2ZShzZWxmLT5vYl9zdmlkZW8sIG9ub2ZmLCBtb2RlKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2VXNlRXhjbHVzaXZlKHNlbGYtPm9iX3N2aWRlbywgb25vZmYsIG1vZGUpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9XaW5kb3dPZmZzZXQoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4X29mZnNldDsKLQlpbnQgeV9vZmZzZXQ7CisgICAgaW50IHhfb2Zmc2V0OworICAgIGludCB5X29mZnNldDsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmeF9vZmZzZXQsICZ5X29mZnNldCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaSkiLCAmeF9vZmZzZXQsICZ5X29mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN2V2luZG93T2Zmc2V0KHNlbGYtPm9iX3N2aWRlbywgeF9vZmZzZXQsIHlfb2Zmc2V0KSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKHN2V2luZG93T2Zmc2V0KHNlbGYtPm9iX3N2aWRlbywgeF9vZmZzZXQsIHlfb2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfQ2FwdHVyZUJ1cnN0KHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYnl0ZXMsIGk7Ci0Jc3ZDYXB0dXJlSW5mbyBpbmZvOwotCXZvaWQgKmJpdHZlY3RvciA9IE5VTEw7Ci0JUHlPYmplY3QgKnZpZGVvZGF0YSA9IE5VTEw7Ci0JUHlPYmplY3QgKmJpdHZlY29iaiA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0Jc3RhdGljIFB5T2JqZWN0ICpldmVuaXRlbSwgKm9kZGl0ZW07CisgICAgaW50IGJ5dGVzLCBpOworICAgIHN2Q2FwdHVyZUluZm8gaW5mbzsKKyAgICB2b2lkICpiaXR2ZWN0b3IgPSBOVUxMOworICAgIFB5T2JqZWN0ICp2aWRlb2RhdGEgPSBOVUxMOworICAgIFB5T2JqZWN0ICpiaXR2ZWNvYmogPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqZXZlbml0ZW0sICpvZGRpdGVtOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpaWlpKSIsICZpbmZvLmZvcm1hdCwKLQkJCSAmaW5mby53aWR0aCwgJmluZm8uaGVpZ2h0LAotCQkJICZpbmZvLnNpemUsICZpbmZvLnNhbXBsaW5ncmF0ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWlpaSkiLCAmaW5mby5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAmaW5mby53aWR0aCwgJmluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgJmluZm8uc2l6ZSwgJmluZm8uc2FtcGxpbmdyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzd2l0Y2ggKGluZm8uZm9ybWF0KSB7Ci0JY2FzZSBTVl9SR0I4X0ZSQU1FUzoKLQkJYml0dmVjdG9yID0gbWFsbG9jKFNWX0JJVFZFQ19TSVpFKGluZm8uc2l6ZSkpOwotCQlicmVhazsKLQljYXNlIFNWX1lVVjQxMV9GUkFNRVNfQU5EX0JMQU5LSU5HX0JVRkZFUjoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJpbGxlZ2FsIGZvcm1hdCBzcGVjaWZpZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHN3aXRjaCAoaW5mby5mb3JtYXQpIHsKKyAgICBjYXNlIFNWX1JHQjhfRlJBTUVTOgorICAgICAgICBiaXR2ZWN0b3IgPSBtYWxsb2MoU1ZfQklUVkVDX1NJWkUoaW5mby5zaXplKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1ZfWVVWNDExX0ZSQU1FU19BTkRfQkxBTktJTkdfQlVGRkVSOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImlsbGVnYWwgZm9ybWF0IHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoc3ZRdWVyeUNhcHR1cmVCdWZmZXJTaXplKHNlbGYtPm9iX3N2aWRlbywgJmluZm8sICZieXRlcykpIHsKLQkJcmVzID0gc3ZfZXJyb3IoKTsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBpZiAoc3ZRdWVyeUNhcHR1cmVCdWZmZXJTaXplKHNlbGYtPm9iX3N2aWRlbywgJmluZm8sICZieXRlcykpIHsKKyAgICAgICAgcmVzID0gc3ZfZXJyb3IoKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KIAotCWlmICghKHZpZGVvZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ5dGVzKSkpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpZiAoISh2aWRlb2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBieXRlcykpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CiAKLQkvKiBYWFggLS0gbmVlZCB0byBkbyBzb21ldGhpbmcgYWJvdXQgdGhlIGJpdHZlY3RvciAqLwotCXsKLQkJY2hhciogc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcodmlkZW9kYXRhKTsKLQkJaWYgKCFzdHIpCi0JCQlnb3RvIGZpbmFsbHk7Ci0JCQotCQlpZiAoc3ZDYXB0dXJlQnVyc3Qoc2VsZi0+b2Jfc3ZpZGVvLCAmaW5mbywgc3RyLCBiaXR2ZWN0b3IpKSB7Ci0JCQlyZXMgPSBzdl9lcnJvcigpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JfQorICAgIC8qIFhYWCAtLSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhYm91dCB0aGUgYml0dmVjdG9yICovCisgICAgeworICAgICAgICBjaGFyKiBzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyh2aWRlb2RhdGEpOworICAgICAgICBpZiAoIXN0cikKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmIChiaXR2ZWN0b3IpIHsKLQkJaWYgKGV2ZW5pdGVtID09IE5VTEwpIHsKLQkJCWlmICghKGV2ZW5pdGVtID0gUHlJbnRfRnJvbUxvbmcoMCkpKQotCQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlpZiAob2RkaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoIShvZGRpdGVtID0gUHlJbnRfRnJvbUxvbmcoMSkpKQotCQkJCWdvdG8gZmluYWxseTsKLQkJfQotCQlpZiAoIShiaXR2ZWNvYmogPSBQeVR1cGxlX05ldygyICogaW5mby5zaXplKSkpCi0JCQlnb3RvIGZpbmFsbHk7CisgICAgICAgIGlmIChzdkNhcHR1cmVCdXJzdChzZWxmLT5vYl9zdmlkZW8sICZpbmZvLCBzdHIsIGJpdHZlY3RvcikpIHsKKyAgICAgICAgICAgIHJlcyA9IHN2X2Vycm9yKCk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICB9CiAKLQkJZm9yIChpID0gMDsgaSA8IDIgKiBpbmZvLnNpemU7IGkrKykgewotCQkJaW50IHN0czsKKyAgICBpZiAoYml0dmVjdG9yKSB7CisgICAgICAgIGlmIChldmVuaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIShldmVuaXRlbSA9IFB5SW50X0Zyb21Mb25nKDApKSkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9kZGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCEob2RkaXRlbSA9IFB5SW50X0Zyb21Mb25nKDEpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoYml0dmVjb2JqID0gUHlUdXBsZV9OZXcoMiAqIGluZm8uc2l6ZSkpKQorICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQlpZiAoU1ZfR0VUX0ZJRUxEKGJpdHZlY3RvciwgaSkgPT0gU1ZfRVZFTl9GSUVMRCkgewotCQkJCVB5X0lOQ1JFRihldmVuaXRlbSk7Ci0JCQkJc3RzID0gUHlUdXBsZV9TZXRJdGVtKGJpdHZlY29iaiwgaSwgZXZlbml0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQlQeV9JTkNSRUYob2RkaXRlbSk7Ci0JCQkJc3RzID0gUHlUdXBsZV9TZXRJdGVtKGJpdHZlY29iaiwgaSwgb2RkaXRlbSk7Ci0JCQl9Ci0JCQlpZiAoc3RzIDwgMCkKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQl9IGVsc2UgewotCQliaXR2ZWNvYmogPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIGluZm8uc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgc3RzOwogCi0JcmVzID0gUHlfQnVpbGRWYWx1ZSgiKChpaWlpaSlPTykiLCBpbmZvLmZvcm1hdCwKLQkJCSAgICBpbmZvLndpZHRoLCBpbmZvLmhlaWdodCwKLQkJCSAgICBpbmZvLnNpemUsIGluZm8uc2FtcGxpbmdyYXRlLAotCQkJICAgIHZpZGVvZGF0YSwgYml0dmVjb2JqKTsKKyAgICAgICAgICAgIGlmIChTVl9HRVRfRklFTEQoYml0dmVjdG9yLCBpKSA9PSBTVl9FVkVOX0ZJRUxEKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGV2ZW5pdGVtKTsKKyAgICAgICAgICAgICAgICBzdHMgPSBQeVR1cGxlX1NldEl0ZW0oYml0dmVjb2JqLCBpLCBldmVuaXRlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihvZGRpdGVtKTsKKyAgICAgICAgICAgICAgICBzdHMgPSBQeVR1cGxlX1NldEl0ZW0oYml0dmVjb2JqLCBpLCBvZGRpdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHMgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGJpdHZlY29iaiA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICB9CisKKyAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCIoKGlpaWlpKU9PKSIsIGluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby53aWR0aCwgaW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNpemUsIGluZm8uc2FtcGxpbmdyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9kYXRhLCBiaXR2ZWNvYmopOwogCiAgIGZpbmFsbHk6Ci0JaWYgKGJpdHZlY3RvcikKLQkJZnJlZShiaXR2ZWN0b3IpOworICAgIGlmIChiaXR2ZWN0b3IpCisgICAgICAgIGZyZWUoYml0dmVjdG9yKTsKIAotCVB5X1hERUNSRUYodmlkZW9kYXRhKTsKLQlQeV9YREVDUkVGKGJpdHZlY29iaik7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9YREVDUkVGKHZpZGVvZGF0YSk7CisgICAgUHlfWERFQ1JFRihiaXR2ZWNvYmopOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9DYXB0dXJlT25lRnJhbWUoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN2Q2FwdHVyZUluZm8gaW5mbzsKLQlpbnQgZm9ybWF0LCB3aWR0aCwgaGVpZ2h0OwotCWludCBieXRlczsKLQlQeU9iamVjdCAqdmlkZW9kYXRhID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQljaGFyICpzdHI7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpaSkiLCAmZm9ybWF0LCAmd2lkdGgsICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzdkNhcHR1cmVJbmZvIGluZm87CisgICAgaW50IGZvcm1hdCwgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgYnl0ZXM7CisgICAgUHlPYmplY3QgKnZpZGVvZGF0YSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgY2hhciAqc3RyOwogCi0JaW5mby5mb3JtYXQgPSBmb3JtYXQ7Ci0JaW5mby53aWR0aCA9IHdpZHRoOwotCWluZm8uaGVpZ2h0ID0gaGVpZ2h0OwotCWluZm8uc2l6ZSA9IDA7Ci0JaW5mby5zYW1wbGluZ3JhdGUgPSAwOwotCWlmIChzdlF1ZXJ5Q2FwdHVyZUJ1ZmZlclNpemUoc2VsZi0+b2Jfc3ZpZGVvLCAmaW5mbywgJmJ5dGVzKSkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpaSkiLCAmZm9ybWF0LCAmd2lkdGgsICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghKHZpZGVvZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ5dGVzKSkpCi0JCXJldHVybiBOVUxMOwotCQotCXN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHZpZGVvZGF0YSk7Ci0JaWYgKCFzdHIpCi0JCWdvdG8gZmluYWxseTsKKyAgICBpbmZvLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBpbmZvLndpZHRoID0gd2lkdGg7CisgICAgaW5mby5oZWlnaHQgPSBoZWlnaHQ7CisgICAgaW5mby5zaXplID0gMDsKKyAgICBpbmZvLnNhbXBsaW5ncmF0ZSA9IDA7CisgICAgaWYgKHN2UXVlcnlDYXB0dXJlQnVmZmVyU2l6ZShzZWxmLT5vYl9zdmlkZW8sICZpbmZvLCAmYnl0ZXMpKQorICAgICAgICByZXR1cm4gc3ZfZXJyb3IoKTsKIAotCWlmIChzdkNhcHR1cmVPbmVGcmFtZShzZWxmLT5vYl9zdmlkZW8sIGZvcm1hdCwgJndpZHRoLCAmaGVpZ2h0LCBzdHIpKSB7Ci0JCXJlcyA9IHN2X2Vycm9yKCk7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKCEodmlkZW9kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnl0ZXMpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXMgPSBQeV9CdWlsZFZhbHVlKCIoaWlPKSIsIHdpZHRoLCBoZWlnaHQsIHZpZGVvZGF0YSk7CisgICAgc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcodmlkZW9kYXRhKTsKKyAgICBpZiAoIXN0cikKKyAgICAgICAgZ290byBmaW5hbGx5OworCisgICAgaWYgKHN2Q2FwdHVyZU9uZUZyYW1lKHNlbGYtPm9iX3N2aWRlbywgZm9ybWF0LCAmd2lkdGgsICZoZWlnaHQsIHN0cikpIHsKKyAgICAgICAgcmVzID0gc3ZfZXJyb3IoKTsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIHJlcyA9IFB5X0J1aWxkVmFsdWUoIihpaU8pIiwgd2lkdGgsIGhlaWdodCwgdmlkZW9kYXRhKTsKIAogICBmaW5hbGx5OgotCVB5X1hERUNSRUYodmlkZW9kYXRhKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X1hERUNSRUYodmlkZW9kYXRhKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfSW5pdENvbnRpbnVvdXNDYXB0dXJlKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzdkNhcHR1cmVJbmZvIGluZm87CisgICAgc3ZDYXB0dXJlSW5mbyBpbmZvOwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlpaWlpKSIsICZpbmZvLmZvcm1hdCwKLQkJCSAmaW5mby53aWR0aCwgJmluZm8uaGVpZ2h0LAotCQkJICZpbmZvLnNpemUsICZpbmZvLnNhbXBsaW5ncmF0ZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWlpaSkiLCAmaW5mby5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAmaW5mby53aWR0aCwgJmluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgJmluZm8uc2l6ZSwgJmluZm8uc2FtcGxpbmdyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZJbml0Q29udGludW91c0NhcHR1cmUoc2VsZi0+b2Jfc3ZpZGVvLCAmaW5mbykpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdkluaXRDb250aW51b3VzQ2FwdHVyZShzZWxmLT5vYl9zdmlkZW8sICZpbmZvKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlzZWxmLT5vYl9pbmZvID0gaW5mbzsKKyAgICBzZWxmLT5vYl9pbmZvID0gaW5mbzsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaWlpaWkpIiwgaW5mby5mb3JtYXQsIGluZm8ud2lkdGgsIGluZm8uaGVpZ2h0LAotCQkJICAgICBpbmZvLnNpemUsIGluZm8uc2FtcGxpbmdyYXRlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGlpaWlpKSIsIGluZm8uZm9ybWF0LCBpbmZvLndpZHRoLCBpbmZvLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNpemUsIGluZm8uc2FtcGxpbmdyYXRlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X0xvYWRNYXAoc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpyZ2I7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JcmdiX3R1cGxlICptYXBwID0gTlVMTDsKLQlpbnQgbWFwdHlwZTsKLQlpbnQgaSwgajsJCQkgICAgIC8qIGluZGljZXMgKi8KKyAgICBQeU9iamVjdCAqcmdiOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIHJnYl90dXBsZSAqbWFwcCA9IE5VTEw7CisgICAgaW50IG1hcHR5cGU7CisgICAgaW50IGksIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmRpY2VzICovCiAKLQlpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaU8pIiwgJm1hcHR5cGUsICZyZ2IpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaU8pIiwgJm1hcHR5cGUsICZyZ2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlMaXN0X0NoZWNrKHJnYikgfHwgUHlMaXN0X1NpemUocmdiKSAhPSAyNTYpIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKHJnYikgfHwgUHlMaXN0X1NpemUocmdiKSAhPSAyNTYpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCEobWFwcCA9IFB5TWVtX05FVyhyZ2JfdHVwbGUsIDI1NikpKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoIShtYXBwID0gUHlNZW1fTkVXKHJnYl90dXBsZSwgMjU2KSkpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCVB5T2JqZWN0KiB2ID0gUHlMaXN0X0dldEl0ZW0ocmdiLCBpKTsKLQkJaWYgKCF2KQotCQkJZ290byBmaW5hbGx5OworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBQeU9iamVjdCogdiA9IFB5TGlzdF9HZXRJdGVtKHJnYiwgaSk7CisgICAgICAgIGlmICghdikKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCQlpZiAoIVB5VHVwbGVfQ2hlY2sodikgfHwgUHlUdXBsZV9TaXplKHYpICE9IDMpIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlnb3RvIGZpbmFsbHk7Ci0JCX0KLQkJZm9yIChqID0gMDsgaiA8IDM7IGorKykgewotCQkJUHlPYmplY3QqIGNlbGwgPSBQeVR1cGxlX0dldEl0ZW0odiwgaik7Ci0JCQlpZiAoIWNlbGwpCi0JCQkJZ290byBmaW5hbGx5OworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2sodikgfHwgUHlUdXBsZV9TaXplKHYpICE9IDMpIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykgeworICAgICAgICAgICAgUHlPYmplY3QqIGNlbGwgPSBQeVR1cGxlX0dldEl0ZW0odiwgaik7CisgICAgICAgICAgICBpZiAoIWNlbGwpCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OwogCi0JCQlpZiAoIVB5SW50X0NoZWNrKGNlbGwpKSB7Ci0JCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCQlnb3RvIGZpbmFsbHk7Ci0JCQl9Ci0JCQlzd2l0Y2ggKGopIHsKLQkJCWNhc2UgMDogbWFwcFtpXS5yZWQgPSBQeUludF9Bc0xvbmcoY2VsbCk7IGJyZWFrOwotCQkJY2FzZSAxOiBtYXBwW2ldLmJsdWUgPSBQeUludF9Bc0xvbmcoY2VsbCk7IGJyZWFrOwotCQkJY2FzZSAyOiBtYXBwW2ldLmdyZWVuID0gUHlJbnRfQXNMb25nKGNlbGwpOyBicmVhazsKLQkJCX0KLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICAgICAgICAgIGlmICghUHlJbnRfQ2hlY2soY2VsbCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoaikgeworICAgICAgICAgICAgY2FzZSAwOiBtYXBwW2ldLnJlZCA9IFB5SW50X0FzTG9uZyhjZWxsKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IG1hcHBbaV0uYmx1ZSA9IFB5SW50X0FzTG9uZyhjZWxsKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IG1hcHBbaV0uZ3JlZW4gPSBQeUludF9Bc0xvbmcoY2VsbCk7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQogCi0JaWYgKHN2TG9hZE1hcChzZWxmLT5vYl9zdmlkZW8sIG1hcHR5cGUsIG1hcHApKSB7Ci0JCXJlcyA9IHN2X2Vycm9yKCk7Ci0JCWdvdG8gZmluYWxseTsKLQl9CisgICAgaWYgKHN2TG9hZE1hcChzZWxmLT5vYl9zdmlkZW8sIG1hcHR5cGUsIG1hcHApKSB7CisgICAgICAgIHJlcyA9IHN2X2Vycm9yKCk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmVzID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmVzID0gUHlfTm9uZTsKIAogICBmaW5hbGx5OgotCVB5TWVtX0RFTChtYXBwKTsKLQlyZXR1cm4gcmVzOworICAgIFB5TWVtX0RFTChtYXBwKTsKKyAgICByZXR1cm4gcmVzOwogfQotCQkKKwogc3RhdGljIFB5T2JqZWN0ICoKIHN2X0Nsb3NlVmlkZW8oc3ZvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc3ZDbG9zZVZpZGVvKHNlbGYtPm9iX3N2aWRlbykpCi0JCXJldHVybiBzdl9lcnJvcigpOworICAgIGlmIChzdkNsb3NlVmlkZW8oc2VsZi0+b2Jfc3ZpZGVvKSkKKyAgICAgICAgcmV0dXJuIHN2X2Vycm9yKCk7CiAKLQlzZWxmLT5vYl9zdmlkZW8gPSBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBzZWxmLT5vYl9zdmlkZW8gPSBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRvUGFyYW1zKHN2b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywKICAgICAgICAgIGludCAoKmZ1bmMpKFNWX25vZGVQLCBsb25nICosIGludCksIGludCBtb2RpZmllZCkKIHsKLQlQeU9iamVjdCAqbGlzdDsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlsb25nICpQVmJ1ZmZlciA9IE5VTEw7Ci0JbG9uZyBsZW5ndGg7Ci0JaW50IGk7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiTyIsICZsaXN0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKmxpc3Q7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgbG9uZyAqUFZidWZmZXIgPSBOVUxMOworICAgIGxvbmcgbGVuZ3RoOworICAgIGludCBpOwogCi0JaWYgKCFQeUxpc3RfQ2hlY2sobGlzdCkpIHsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIk8iLCAmbGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKChsZW5ndGggPSBQeUxpc3RfU2l6ZShsaXN0KSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhsaXN0KSkgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQVmJ1ZmZlciA9IFB5TWVtX05FVyhsb25nLCBsZW5ndGgpOwotCWlmIChQVmJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoKGxlbmd0aCA9IFB5TGlzdF9TaXplKGxpc3QpKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7Ci0JCWlmICghdikKLQkJCWdvdG8gZmluYWxseTsKKyAgICBQVmJ1ZmZlciA9IFB5TWVtX05FVyhsb25nLCBsZW5ndGgpOworICAgIGlmIChQVmJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCQlpZiAoIVB5SW50X0NoZWNrKHYpKSB7Ci0JCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQkJZ290byBmaW5hbGx5OwotCQl9Ci0JCVBWYnVmZmVyW2ldID0gUHlJbnRfQXNMb25nKHYpOwotCQkvKiBjYW4ndCBqdXN0IHRlc3QgdGhlIHJldHVybiB2YWx1ZSwgYmVjYXVzZSB3aGF0IGlmIHRoZQotCQkgICB2YWx1ZSB3YXMgLTE/IQotCQkqLwotCQlpZiAoUFZidWZmZXJbaV0gPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCWdvdG8gZmluYWxseTsKLQl9CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlMaXN0X0dldEl0ZW0obGlzdCwgaSk7CisgICAgICAgIGlmICghdikKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKIAotCWlmICgoKmZ1bmMpKHNlbGYtPm9iX3N2aWRlbywgUFZidWZmZXIsIGxlbmd0aCkpIHsKLQkJcmVzID0gc3ZfZXJyb3IoKTsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICAgICAgaWYgKCFQeUludF9DaGVjayh2KSkgeworICAgICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgfQorICAgICAgICBQVmJ1ZmZlcltpXSA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgLyogY2FuJ3QganVzdCB0ZXN0IHRoZSByZXR1cm4gdmFsdWUsIGJlY2F1c2Ugd2hhdCBpZiB0aGUKKyAgICAgICAgICAgdmFsdWUgd2FzIC0xPyEKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKFBWYnVmZmVyW2ldID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JaWYgKG1vZGlmaWVkKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJUHlPYmplY3QqIHYgPSBQeUludF9Gcm9tTG9uZyhQVmJ1ZmZlcltpXSk7Ci0JCQlpZiAoIXYgfHwgUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgdikgPCAwKQotCQkJCWdvdG8gZmluYWxseTsKLQkJfQotCX0KKyAgICBpZiAoKCpmdW5jKShzZWxmLT5vYl9zdmlkZW8sIFBWYnVmZmVyLCBsZW5ndGgpKSB7CisgICAgICAgIHJlcyA9IHN2X2Vycm9yKCk7CisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmVzID0gUHlfTm9uZTsKKyAgICBpZiAobW9kaWZpZWQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCogdiA9IFB5SW50X0Zyb21Mb25nKFBWYnVmZmVyW2ldKTsKKyAgICAgICAgICAgIGlmICghdiB8fCBQeUxpc3RfU2V0SXRlbShsaXN0LCBpLCB2KSA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICB9CisgICAgfQorCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJlcyA9IFB5X05vbmU7CiAKICAgZmluYWxseToKLQlQeU1lbV9ERUwoUFZidWZmZXIpOwotCXJldHVybiByZXM7CisgICAgUHlNZW1fREVMKFBWYnVmZmVyKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfR2V0UGFyYW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBkb1BhcmFtcyhzZWxmLCBhcmdzLCBzdkdldFBhcmFtLCAxKTsKKyAgICByZXR1cm4gZG9QYXJhbXMoc2VsZiwgYXJncywgc3ZHZXRQYXJhbSwgMSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9HZXRQYXJhbVJhbmdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9QYXJhbXMoc2VsZiwgYXJncywgc3ZHZXRQYXJhbVJhbmdlLCAxKTsKKyAgICByZXR1cm4gZG9QYXJhbXMoc2VsZiwgYXJncywgc3ZHZXRQYXJhbVJhbmdlLCAxKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X1NldFBhcmFtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gZG9QYXJhbXMoc2VsZiwgYXJncywgc3ZTZXRQYXJhbSwgMCk7CisgICAgcmV0dXJuIGRvUGFyYW1zKHNlbGYsIGFyZ3MsIHN2U2V0UGFyYW0sIDApOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3ZpZGVvX21ldGhvZHNbXSA9IHsKLQl7IkJpbmRHTFdpbmRvdyIsCShQeUNGdW5jdGlvbilzdl9CaW5kR0xXaW5kb3csIE1FVEhfT0xEQVJHU30sCi0JeyJFbmRDb250aW51b3VzQ2FwdHVyZSIsKFB5Q0Z1bmN0aW9uKXN2X0VuZENvbnRpbnVvdXNDYXB0dXJlLCBNRVRIX09MREFSR1N9LAotCXsiSXNWaWRlb0Rpc3BsYXllZCIsCShQeUNGdW5jdGlvbilzdl9Jc1ZpZGVvRGlzcGxheWVkLCBNRVRIX09MREFSR1N9LAotCXsiT3V0cHV0T2Zmc2V0IiwJKFB5Q0Z1bmN0aW9uKXN2X091dHB1dE9mZnNldCwgTUVUSF9PTERBUkdTfSwKLQl7IlB1dEZyYW1lIiwJCShQeUNGdW5jdGlvbilzdl9QdXRGcmFtZSwgTUVUSF9PTERBUkdTfSwKLQl7IlF1ZXJ5U2l6ZSIsCQkoUHlDRnVuY3Rpb24pc3ZfUXVlcnlTaXplLCBNRVRIX09MREFSR1N9LAotCXsiU2V0U2l6ZSIsCQkoUHlDRnVuY3Rpb24pc3ZfU2V0U2l6ZSwgTUVUSF9PTERBUkdTfSwKLQl7IlNldFN0ZERlZmF1bHRzIiwJKFB5Q0Z1bmN0aW9uKXN2X1NldFN0ZERlZmF1bHRzLCBNRVRIX09MREFSR1N9LAotCXsiVXNlRXhjbHVzaXZlIiwJKFB5Q0Z1bmN0aW9uKXN2X1VzZUV4Y2x1c2l2ZSwgTUVUSF9PTERBUkdTfSwKLQl7IldpbmRvd09mZnNldCIsCShQeUNGdW5jdGlvbilzdl9XaW5kb3dPZmZzZXQsIE1FVEhfT0xEQVJHU30sCi0JeyJJbml0Q29udGludW91c0NhcHR1cmUiLChQeUNGdW5jdGlvbilzdl9Jbml0Q29udGludW91c0NhcHR1cmUsIE1FVEhfT0xEQVJHU30sCi0JeyJDYXB0dXJlQnVyc3QiLAkoUHlDRnVuY3Rpb24pc3ZfQ2FwdHVyZUJ1cnN0LCBNRVRIX09MREFSR1N9LAotCXsiQ2FwdHVyZU9uZUZyYW1lIiwJKFB5Q0Z1bmN0aW9uKXN2X0NhcHR1cmVPbmVGcmFtZSwgTUVUSF9PTERBUkdTfSwKLQl7IkdldENhcHR1cmVEYXRhIiwJKFB5Q0Z1bmN0aW9uKXN2X0dldENhcHR1cmVEYXRhLCBNRVRIX09MREFSR1N9LAotCXsiQ2xvc2VWaWRlbyIsCQkoUHlDRnVuY3Rpb24pc3ZfQ2xvc2VWaWRlbywgTUVUSF9PTERBUkdTfSwKLQl7IkxvYWRNYXAiLAkJKFB5Q0Z1bmN0aW9uKXN2X0xvYWRNYXAsIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRQYXJhbSIsCQkoUHlDRnVuY3Rpb24pc3ZfR2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCi0JeyJHZXRQYXJhbVJhbmdlIiwJKFB5Q0Z1bmN0aW9uKXN2X0dldFBhcmFtUmFuZ2UsIE1FVEhfT0xEQVJHU30sCi0JeyJTZXRQYXJhbSIsCQkoUHlDRnVuY3Rpb24pc3ZfU2V0UGFyYW0sIE1FVEhfT0xEQVJHU30sCi0Je05VTEwsCQkJTlVMTH0gCQkvKiBzZW50aW5lbCAqLworICAgIHsiQmluZEdMV2luZG93IiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfQmluZEdMV2luZG93LCBNRVRIX09MREFSR1N9LAorICAgIHsiRW5kQ29udGludW91c0NhcHR1cmUiLChQeUNGdW5jdGlvbilzdl9FbmRDb250aW51b3VzQ2FwdHVyZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IklzVmlkZW9EaXNwbGF5ZWQiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0lzVmlkZW9EaXNwbGF5ZWQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJPdXRwdXRPZmZzZXQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9PdXRwdXRPZmZzZXQsIE1FVEhfT0xEQVJHU30sCisgICAgeyJQdXRGcmFtZSIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9QdXRGcmFtZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IlF1ZXJ5U2l6ZSIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X1F1ZXJ5U2l6ZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IlNldFNpemUiLCAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X1NldFNpemUsIE1FVEhfT0xEQVJHU30sCisgICAgeyJTZXRTdGREZWZhdWx0cyIsICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9TZXRTdGREZWZhdWx0cywgTUVUSF9PTERBUkdTfSwKKyAgICB7IlVzZUV4Y2x1c2l2ZSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X1VzZUV4Y2x1c2l2ZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IldpbmRvd09mZnNldCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X1dpbmRvd09mZnNldCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkluaXRDb250aW51b3VzQ2FwdHVyZSIsKFB5Q0Z1bmN0aW9uKXN2X0luaXRDb250aW51b3VzQ2FwdHVyZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkNhcHR1cmVCdXJzdCIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0NhcHR1cmVCdXJzdCwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkNhcHR1cmVPbmVGcmFtZSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0NhcHR1cmVPbmVGcmFtZSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldENhcHR1cmVEYXRhIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0dldENhcHR1cmVEYXRhLCBNRVRIX09MREFSR1N9LAorICAgIHsiQ2xvc2VWaWRlbyIsICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfQ2xvc2VWaWRlbywgTUVUSF9PTERBUkdTfSwKKyAgICB7IkxvYWRNYXAiLCAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0xvYWRNYXAsIE1FVEhfT0xEQVJHU30sCisgICAgeyJHZXRQYXJhbSIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9HZXRQYXJhbSwgTUVUSF9PTERBUkdTfSwKKyAgICB7IkdldFBhcmFtUmFuZ2UiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X0dldFBhcmFtUmFuZ2UsIE1FVEhfT0xEQVJHU30sCisgICAgeyJTZXRQYXJhbSIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9TZXRQYXJhbSwgTUVUSF9PTERBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfY29udmVyc2lvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKCpmdW5jdGlvbikoKSwKICAgICAgICAgICAgICAgaW50IGlucHV0ZmFjdG9yLCBmbG9hdCBmYWN0b3IpCiB7Ci0JaW50IGludmVydCwgd2lkdGgsIGhlaWdodCwgaW5wdXRsZW5ndGg7Ci0JY2hhciAqaW5wdXQsICpzdHI7Ci0JUHlPYmplY3QgKm91dHB1dDsKKyAgICBpbnQgaW52ZXJ0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dGxlbmd0aDsKKyAgICBjaGFyICppbnB1dCwgKnN0cjsKKyAgICBQeU9iamVjdCAqb3V0cHV0OwogCi0JaWYgKCFQeUFyZ19QYXJzZShhcmdzLCAiKGlzI2lpKSIsICZpbnZlcnQsCi0JCQkgJmlucHV0LCAmaW5wdXRsZW5ndGgsICZ3aWR0aCwgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2UoYXJncywgIihpcyNpaSkiLCAmaW52ZXJ0LAorICAgICAgICAgICAgICAgICAgICAgJmlucHV0LCAmaW5wdXRsZW5ndGgsICZ3aWR0aCwgJmhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHdpZHRoICogaGVpZ2h0ICogaW5wdXRmYWN0b3IgPiBpbnB1dGxlbmd0aCkgewotCQlQeUVycl9TZXRTdHJpbmcoU3ZFcnJvciwgImlucHV0IGJ1ZmZlciBub3QgbG9uZyBlbm91Z2giKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh3aWR0aCAqIGhlaWdodCAqIGlucHV0ZmFjdG9yID4gaW5wdXRsZW5ndGgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFN2RXJyb3IsICJpbnB1dCBidWZmZXIgbm90IGxvbmcgZW5vdWdoIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICghKG91dHB1dCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsCi0JCQkJCSAgICAgIChpbnQpKHdpZHRoICogaGVpZ2h0ICogZmFjdG9yKSkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIShvdXRwdXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkod2lkdGggKiBoZWlnaHQgKiBmYWN0b3IpKSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob3V0cHV0KTsKLQlpZiAoIXN0cikgewotCQlQeV9ERUNSRUYob3V0cHV0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSgqZnVuY3Rpb24pKGludmVydCwgaW5wdXQsIHN0ciwgd2lkdGgsIGhlaWdodCk7CisgICAgc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob3V0cHV0KTsKKyAgICBpZiAoIXN0cikgeworICAgICAgICBQeV9ERUNSRUYob3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICgqZnVuY3Rpb24pKGludmVydCwgaW5wdXQsIHN0ciwgd2lkdGgsIGhlaWdodCk7CiAKLQlyZXR1cm4gb3V0cHV0OworICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9JbnRlcmxlYXZlRmllbGRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZXR1cm4gc3ZfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdkludGVybGVhdmVGaWVsZHMsIDEsIDEuMCk7CisgICAgcmV0dXJuIHN2X2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZJbnRlcmxlYXZlRmllbGRzLCAxLCAxLjApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3ZfUkdCOHRvUkdCMzIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBzdl9jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHN2UkdCOHRvUkdCMzIsIDEsIChmbG9hdCkgc2l6ZW9mKGxvbmcpKTsKKyAgICByZXR1cm4gc3ZfY29udmVyc2lvbihzZWxmLCBhcmdzLCBzdlJHQjh0b1JHQjMyLCAxLCAoZmxvYXQpIHNpemVvZihsb25nKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdl9ZVVZ0b1JHQihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIHN2X2NvbnZlcnNpb24oc2VsZiwgYXJncywgc3ZZVVZ0b1JHQiwgMiwgKGZsb2F0KSBzaXplb2YobG9uZykpOworICAgIHJldHVybiBzdl9jb252ZXJzaW9uKHNlbGYsIGFyZ3MsIHN2WVVWdG9SR0IsIDIsIChmbG9hdCkgc2l6ZW9mKGxvbmcpKTsKIH0KIAogc3RhdGljIHZvaWQKIHN2aWRlb19kZWFsbG9jKHN2b2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9zdmlkZW8gIT0gTlVMTCkKLQkJKHZvaWQpIHN2Q2xvc2VWaWRlbyhzZWxmLT5vYl9zdmlkZW8pOwotCVB5T2JqZWN0X0RlbChzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2Jfc3ZpZGVvICE9IE5VTEwpCisgICAgICAgICh2b2lkKSBzdkNsb3NlVmlkZW8oc2VsZi0+b2Jfc3ZpZGVvKTsKKyAgICBQeU9iamVjdF9EZWwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdmlkZW9fZ2V0YXR0cihzdm9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChzdmlkZW9fbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc3ZpZGVvX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogfQogCiBQeVR5cGVPYmplY3QgU3Z0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkvKm9iX3NpemUqLwotCSJzdi5zdiIsCQkvKnRwX25hbWUqLwotCXNpemVvZihzdm9iamVjdCksCS8qdHBfc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3Ipc3ZpZGVvX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpc3ZpZGVvX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAic3Yuc3YiLCAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2Yoc3ZvYmplY3QpLCAgICAgICAgICAgLyp0cF9zaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXN2aWRlb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpc3ZpZGVvX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbmV3c3ZvYmplY3QoU1Zfbm9kZVAgc3ZwKQogewotCXN2b2JqZWN0ICpwOworICAgIHN2b2JqZWN0ICpwOwogCi0JcCA9IFB5T2JqZWN0X05ldyhzdm9iamVjdCwgJlN2dHlwZSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcC0+b2Jfc3ZpZGVvID0gc3ZwOwotCXAtPm9iX2luZm8uZm9ybWF0ID0gMDsKLQlwLT5vYl9pbmZvLnNpemUgPSAwOwotCXAtPm9iX2luZm8ud2lkdGggPSAwOwotCXAtPm9iX2luZm8uaGVpZ2h0ID0gMDsKLQlwLT5vYl9pbmZvLnNhbXBsaW5ncmF0ZSA9IDA7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBwOworICAgIHAgPSBQeU9iamVjdF9OZXcoc3ZvYmplY3QsICZTdnR5cGUpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPm9iX3N2aWRlbyA9IHN2cDsKKyAgICBwLT5vYl9pbmZvLmZvcm1hdCA9IDA7CisgICAgcC0+b2JfaW5mby5zaXplID0gMDsKKyAgICBwLT5vYl9pbmZvLndpZHRoID0gMDsKKyAgICBwLT5vYl9pbmZvLmhlaWdodCA9IDA7CisgICAgcC0+b2JfaW5mby5zYW1wbGluZ3JhdGUgPSAwOworICAgIHJldHVybiAoUHlPYmplY3QgKikgcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN2X09wZW5WaWRlbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JU1Zfbm9kZVAgc3ZwOworICAgIFNWX25vZGVQIHN2cDsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdnAgPSBzdk9wZW5WaWRlbygpOwotCWlmIChzdnAgPT0gTlVMTCkKLQkJcmV0dXJuIHN2X2Vycm9yKCk7CisgICAgc3ZwID0gc3ZPcGVuVmlkZW8oKTsKKyAgICBpZiAoc3ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBzdl9lcnJvcigpOwogCi0JcmV0dXJuIG5ld3N2b2JqZWN0KHN2cCk7CisgICAgcmV0dXJuIG5ld3N2b2JqZWN0KHN2cCk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzdl9tZXRob2RzW10gPSB7Ci0JeyJJbnRlcmxlYXZlRmllbGRzIiwJKFB5Q0Z1bmN0aW9uKXN2X0ludGVybGVhdmVGaWVsZHMsIE1FVEhfT0xEQVJHU30sCi0JeyJSR0I4dG9SR0IzMiIsCQkoUHlDRnVuY3Rpb24pc3ZfUkdCOHRvUkdCMzIsIE1FVEhfT0xEQVJHU30sCi0JeyJZVVZ0b1JHQiIsCQkoUHlDRnVuY3Rpb24pc3ZfWVVWdG9SR0IsIE1FVEhfT0xEQVJHU30sCi0JeyJPcGVuVmlkZW8iLAkJKFB5Q0Z1bmN0aW9uKXN2X09wZW5WaWRlbywgTUVUSF9PTERBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsiSW50ZXJsZWF2ZUZpZWxkcyIsICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfSW50ZXJsZWF2ZUZpZWxkcywgTUVUSF9PTERBUkdTfSwKKyAgICB7IlJHQjh0b1JHQjMyIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXN2X1JHQjh0b1JHQjMyLCBNRVRIX09MREFSR1N9LAorICAgIHsiWVVWdG9SR0IiLCAgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc3ZfWVVWdG9SR0IsIE1FVEhfT0xEQVJHU30sCisgICAgeyJPcGVuVmlkZW8iLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilzdl9PcGVuVmlkZW8sIE1FVEhfT0xEQVJHU30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgLyogU2VudGluZWwgKi8KIH07CiAKIHZvaWQKIGluaXRzdih2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQkKLQlpZiAoUHlFcnJfV2FyblB5M2soInRoZSBzdiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiAiCi0JICAgICAgICAgICAgICAgICAgICJQeXRob24gMy4wIiwgMikgPCAwKQotCSAgICByZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JbSA9IFB5X0luaXRNb2R1bGUoInN2Iiwgc3ZfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGlmIChQeUVycl9XYXJuUHkzaygidGhlIHN2IG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjAiLCAyKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCVN2RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInN2LmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JaWYgKFN2RXJyb3IgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBTdkVycm9yKSAhPSAwKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUoInN2Iiwgc3ZfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworCisgICAgU3ZFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigic3YuZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoU3ZFcnJvciA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIFN2RXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc3ltdGFibGVtb2R1bGUuYyBiL01vZHVsZXMvc3ltdGFibGVtb2R1bGUuYwppbmRleCA1M2U5ODdlLi44NmM2NDgxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3N5bXRhYmxlbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5jCkBAIC04LDgwICs4LDgwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3ltdGFibGVfc3ltdGFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCXN0cnVjdCBzeW10YWJsZSAqc3Q7Ci0JUHlPYmplY3QgKnQ7CisgICAgc3RydWN0IHN5bXRhYmxlICpzdDsKKyAgICBQeU9iamVjdCAqdDsKIAotCWNoYXIgKnN0cjsKLQljaGFyICpmaWxlbmFtZTsKLQljaGFyICpzdGFydHN0cjsKLQlpbnQgc3RhcnQ7CisgICAgY2hhciAqc3RyOworICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGNoYXIgKnN0YXJ0c3RyOworICAgIGludCBzdGFydDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3NzOnN5bXRhYmxlIiwgJnN0ciwgJmZpbGVuYW1lLCAKLQkJCSAgICAgICZzdGFydHN0cikpCi0JCXJldHVybiBOVUxMOwotCWlmIChzdHJjbXAoc3RhcnRzdHIsICJleGVjIikgPT0gMCkKLQkJc3RhcnQgPSBQeV9maWxlX2lucHV0OwotCWVsc2UgaWYgKHN0cmNtcChzdGFydHN0ciwgImV2YWwiKSA9PSAwKQotCQlzdGFydCA9IFB5X2V2YWxfaW5wdXQ7Ci0JZWxzZSBpZiAoc3RyY21wKHN0YXJ0c3RyLCAic2luZ2xlIikgPT0gMCkKLQkJc3RhcnQgPSBQeV9zaW5nbGVfaW5wdXQ7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkgICAic3ltdGFibGUoKSBhcmcgMyBtdXN0IGJlICdleGVjJyBvciAnZXZhbCcgb3IgJ3NpbmdsZSciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN0ID0gUHlfU3ltdGFibGVTdHJpbmcoc3RyLCBmaWxlbmFtZSwgc3RhcnQpOwotCWlmIChzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl0ID0gc3QtPnN0X3N5bWJvbHM7Ci0JUHlfSU5DUkVGKHQpOwotCVB5TWVtX0ZyZWUoKHZvaWQgKilzdC0+c3RfZnV0dXJlKTsKLQlQeVN5bXRhYmxlX0ZyZWUoc3QpOwotCXJldHVybiB0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3NzOnN5bXRhYmxlIiwgJnN0ciwgJmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoc3RyY21wKHN0YXJ0c3RyLCAiZXhlYyIpID09IDApCisgICAgICAgIHN0YXJ0ID0gUHlfZmlsZV9pbnB1dDsKKyAgICBlbHNlIGlmIChzdHJjbXAoc3RhcnRzdHIsICJldmFsIikgPT0gMCkKKyAgICAgICAgc3RhcnQgPSBQeV9ldmFsX2lucHV0OworICAgIGVsc2UgaWYgKHN0cmNtcChzdGFydHN0ciwgInNpbmdsZSIpID09IDApCisgICAgICAgIHN0YXJ0ID0gUHlfc2luZ2xlX2lucHV0OworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgInN5bXRhYmxlKCkgYXJnIDMgbXVzdCBiZSAnZXhlYycgb3IgJ2V2YWwnIG9yICdzaW5nbGUnIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdCA9IFB5X1N5bXRhYmxlU3RyaW5nKHN0ciwgZmlsZW5hbWUsIHN0YXJ0KTsKKyAgICBpZiAoc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdCA9IHN0LT5zdF9zeW1ib2xzOworICAgIFB5X0lOQ1JFRih0KTsKKyAgICBQeU1lbV9GcmVlKCh2b2lkICopc3QtPnN0X2Z1dHVyZSk7CisgICAgUHlTeW10YWJsZV9GcmVlKHN0KTsKKyAgICByZXR1cm4gdDsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHN5bXRhYmxlX21ldGhvZHNbXSA9IHsKLQl7InN5bXRhYmxlIiwJc3ltdGFibGVfc3ltdGFibGUsCU1FVEhfVkFSQVJHUywKLQkgUHlEb2NfU1RSKCJSZXR1cm4gc3ltYm9sIGFuZCBzY29wZSBkaWN0aW9uYXJpZXMiCi0JIAkgICAiIHVzZWQgaW50ZXJuYWxseSBieSBjb21waWxlci4iKX0sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InN5bXRhYmxlIiwgICAgICAgIHN5bXRhYmxlX3N5bXRhYmxlLCAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gc3ltYm9sIGFuZCBzY29wZSBkaWN0aW9uYXJpZXMiCisgICAgICAgICAgICAgICAiIHVzZWQgaW50ZXJuYWxseSBieSBjb21waWxlci4iKX0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0X3N5bXRhYmxlKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX3N5bXRhYmxlIiwgc3ltdGFibGVfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJVU0UiLCBVU0UpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfR0xPQkFMIiwgREVGX0dMT0JBTCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9MT0NBTCIsIERFRl9MT0NBTCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9QQVJBTSIsIERFRl9QQVJBTSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9TVEFSIiwgREVGX1NUQVIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfRE9VQkxFU1RBUiIsIERFRl9ET1VCTEVTVEFSKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0lOVFVQTEUiLCBERUZfSU5UVVBMRSk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9GUkVFIiwgREVGX0ZSRUUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfRlJFRV9HTE9CQUwiLCBERUZfRlJFRV9HTE9CQUwpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfRlJFRV9DTEFTUyIsIERFRl9GUkVFX0NMQVNTKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0lNUE9SVCIsIERFRl9JTVBPUlQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfQk9VTkQiLCBERUZfQk9VTkQpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfc3ltdGFibGUiLCBzeW10YWJsZV9tZXRob2RzKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlVTRSIsIFVTRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9HTE9CQUwiLCBERUZfR0xPQkFMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0xPQ0FMIiwgREVGX0xPQ0FMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX1BBUkFNIiwgREVGX1BBUkFNKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX1NUQVIiLCBERUZfU1RBUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9ET1VCTEVTVEFSIiwgREVGX0RPVUJMRVNUQVIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfSU5UVVBMRSIsIERFRl9JTlRVUExFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiREVGX0ZSRUUiLCBERUZfRlJFRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9GUkVFX0dMT0JBTCIsIERFRl9GUkVFX0dMT0JBTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9GUkVFX0NMQVNTIiwgREVGX0ZSRUVfQ0xBU1MpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZfSU1QT1JUIiwgREVGX0lNUE9SVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkRFRl9CT1VORCIsIERFRl9CT1VORCk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVFlQRV9GVU5DVElPTiIsIEZ1bmN0aW9uQmxvY2spOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUWVBFX0NMQVNTIiwgQ2xhc3NCbG9jayk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRZUEVfTU9EVUxFIiwgTW9kdWxlQmxvY2spOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJUWVBFX0ZVTkNUSU9OIiwgRnVuY3Rpb25CbG9jayk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlRZUEVfQ0xBU1MiLCBDbGFzc0Jsb2NrKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiVFlQRV9NT0RVTEUiLCBNb2R1bGVCbG9jayk7CiAKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiT1BUX0lNUE9SVF9TVEFSIiwgT1BUX0lNUE9SVF9TVEFSKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiT1BUX0VYRUMiLCBPUFRfRVhFQyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk9QVF9CQVJFX0VYRUMiLCBPUFRfQkFSRV9FWEVDKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiT1BUX0lNUE9SVF9TVEFSIiwgT1BUX0lNUE9SVF9TVEFSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiT1BUX0VYRUMiLCBPUFRfRVhFQyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk9QVF9CQVJFX0VYRUMiLCBPUFRfQkFSRV9FWEVDKTsKIAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0NBTCIsIExPQ0FMKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiR0xPQkFMX0VYUExJQ0lUIiwgR0xPQkFMX0VYUExJQ0lUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiR0xPQkFMX0lNUExJQ0lUIiwgR0xPQkFMX0lNUExJQ0lUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiRlJFRSIsIEZSRUUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJDRUxMIiwgQ0VMTCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPQ0FMIiwgTE9DQUwpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJHTE9CQUxfRVhQTElDSVQiLCBHTE9CQUxfRVhQTElDSVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJHTE9CQUxfSU1QTElDSVQiLCBHTE9CQUxfSU1QTElDSVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJGUkVFIiwgRlJFRSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkNFTEwiLCBDRUxMKTsKIAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTQ09QRV9PRkYiLCBTQ09QRV9PRkYpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJTQ09QRV9NQVNLIiwgU0NPUEVfTUFTSyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNDT1BFX09GRiIsIFNDT1BFX09GRik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlNDT1BFX01BU0siLCBTQ09QRV9NQVNLKTsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvc3lzbG9nbW9kdWxlLmMgYi9Nb2R1bGVzL3N5c2xvZ21vZHVsZS5jCmluZGV4IDllMWVkMDYuLmUwZmNhMGQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3lzbG9nbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zeXNsb2dtb2R1bGUuYwpAQCAtNCwyMCArNCwyMCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCiAKLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKLWRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLWJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgogc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBMYW5jZSBFbGxpbmdob3VzZQotbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIAorbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgogCiBMQU5DRSBFTExJTkdIT1VTRSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKLUZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIExBTkNFIEVMTElOR0hPVVNFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIAotSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIAotRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgCi1ORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiAKK0ZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIExBTkNFIEVMTElOR0hPVVNFIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsCitJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcKK0ZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgogV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ5LDEwOSArNDksMTA5IEBACiAjaW5jbHVkZSA8c3lzbG9nLmg+CiAKIC8qICBvbmx5IG9uZSBpbnN0YW5jZSwgb25seSBvbmUgc3lzbG9nLCBzbyBnbG9iYWxzIHNob3VsZCBiZSBvayAgKi8KLXN0YXRpYyBQeU9iamVjdCAqU19pZGVudF9vID0gTlVMTDsJCQkvKiAgaWRlbnRpZmllciwgaGVsZCBieSBvcGVubG9nKCkgICovCitzdGF0aWMgUHlPYmplY3QgKlNfaWRlbnRfbyA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgIC8qICBpZGVudGlmaWVyLCBoZWxkIGJ5IG9wZW5sb2coKSAgKi8KIAogCi1zdGF0aWMgUHlPYmplY3QgKiAKK3N0YXRpYyBQeU9iamVjdCAqCiBzeXNsb2dfb3BlbmxvZyhQeU9iamVjdCAqIHNlbGYsIFB5T2JqZWN0ICogYXJncykKIHsKLQlsb25nIGxvZ29wdCA9IDA7Ci0JbG9uZyBmYWNpbGl0eSA9IExPR19VU0VSOwotCVB5T2JqZWN0ICpuZXdfU19pZGVudF9vOworICAgIGxvbmcgbG9nb3B0ID0gMDsKKyAgICBsb25nIGZhY2lsaXR5ID0gTE9HX1VTRVI7CisgICAgUHlPYmplY3QgKm5ld19TX2lkZW50X287CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywKLQkJCSAgICAgICJTfGxsO2lkZW50IHN0cmluZyBbLCBsb2dvcHRpb24gWywgZmFjaWxpdHldXSIsCi0JCQkgICAgICAmbmV3X1NfaWRlbnRfbywgJmxvZ29wdCwgJmZhY2lsaXR5KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTfGxsO2lkZW50IHN0cmluZyBbLCBsb2dvcHRpb24gWywgZmFjaWxpdHldXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfU19pZGVudF9vLCAmbG9nb3B0LCAmZmFjaWxpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb3BlbmxvZygpIGRvZXMgTk9UIG1ha2UgYSBjb3B5Ci0JICogYW5kIHN5c2xvZygpIGxhdGVyIHVzZXMgaXQuLiBjYW5ub3QgdHJhc2ggaXQuCi0JICovCi0JUHlfWERFQ1JFRihTX2lkZW50X28pOwotCVNfaWRlbnRfbyA9IG5ld19TX2lkZW50X287Ci0JUHlfSU5DUkVGKFNfaWRlbnRfbyk7CisgICAgLyogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvcGVubG9nKCkgZG9lcyBOT1QgbWFrZSBhIGNvcHkKKyAgICAgKiBhbmQgc3lzbG9nKCkgbGF0ZXIgdXNlcyBpdC4uIGNhbm5vdCB0cmFzaCBpdC4KKyAgICAgKi8KKyAgICBQeV9YREVDUkVGKFNfaWRlbnRfbyk7CisgICAgU19pZGVudF9vID0gbmV3X1NfaWRlbnRfbzsKKyAgICBQeV9JTkNSRUYoU19pZGVudF9vKTsKIAotCW9wZW5sb2coUHlTdHJpbmdfQXNTdHJpbmcoU19pZGVudF9vKSwgbG9nb3B0LCBmYWNpbGl0eSk7CisgICAgb3BlbmxvZyhQeVN0cmluZ19Bc1N0cmluZyhTX2lkZW50X28pLCBsb2dvcHQsIGZhY2lsaXR5KTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX3N5c2xvZyhQeU9iamVjdCAqIHNlbGYsIFB5T2JqZWN0ICogYXJncykKIHsKLQljaGFyICptZXNzYWdlOwotCWludCAgIHByaW9yaXR5ID0gTE9HX0lORk87CisgICAgY2hhciAqbWVzc2FnZTsKKyAgICBpbnQgICBwcmlvcml0eSA9IExPR19JTkZPOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcztbcHJpb3JpdHksXSBtZXNzYWdlIHN0cmluZyIsCi0JCQkgICAgICAmcHJpb3JpdHksICZtZXNzYWdlKSkgewotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM7W3ByaW9yaXR5LF0gbWVzc2FnZSBzdHJpbmciLAotCQkJCSAgICAgICZtZXNzYWdlKSkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzO1twcmlvcml0eSxdIG1lc3NhZ2Ugc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaW9yaXR5LCAmbWVzc2FnZSkpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzO1twcmlvcml0eSxdIG1lc3NhZ2Ugc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFM7Ci0Jc3lzbG9nKHByaW9yaXR5LCAiJXMiLCBtZXNzYWdlKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUzsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUzsKKyAgICBzeXNsb2cocHJpb3JpdHksICIlcyIsIG1lc3NhZ2UpOworICAgIFB5X0VORF9BTExPV19USFJFQURTOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICogCitzdGF0aWMgUHlPYmplY3QgKgogc3lzbG9nX2Nsb3NlbG9nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCWNsb3NlbG9nKCk7Ci0JUHlfWERFQ1JFRihTX2lkZW50X28pOwotCVNfaWRlbnRfbyA9IE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNsb3NlbG9nKCk7CisgICAgUHlfWERFQ1JFRihTX2lkZW50X28pOworICAgIFNfaWRlbnRfbyA9IE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKiAKK3N0YXRpYyBQeU9iamVjdCAqCiBzeXNsb2dfc2V0bG9nbWFzayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBtYXNrcHJpLCBvbWFza3ByaTsKKyAgICBsb25nIG1hc2twcmksIG9tYXNrcHJpOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsO21hc2sgZm9yIHByaW9yaXR5IiwgJm1hc2twcmkpKQotCQlyZXR1cm4gTlVMTDsKLQlvbWFza3ByaSA9IHNldGxvZ21hc2sobWFza3ByaSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9tYXNrcHJpKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw7bWFzayBmb3IgcHJpb3JpdHkiLCAmbWFza3ByaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9tYXNrcHJpID0gc2V0bG9nbWFzayhtYXNrcHJpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcob21hc2twcmkpOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKiAKK3N0YXRpYyBQeU9iamVjdCAqCiBzeXNsb2dfbG9nX21hc2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgbWFzazsKLQlsb25nIHByaTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6TE9HX01BU0siLCAmcHJpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFzayA9IExPR19NQVNLKHByaSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1hc2spOworICAgIGxvbmcgbWFzazsKKyAgICBsb25nIHByaTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6TE9HX01BU0siLCAmcHJpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFzayA9IExPR19NQVNLKHByaSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1hc2spOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKiAKK3N0YXRpYyBQeU9iamVjdCAqCiBzeXNsb2dfbG9nX3VwdG8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgbWFzazsKLQlsb25nIHByaTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6TE9HX1VQVE8iLCAmcHJpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFzayA9IExPR19VUFRPKHByaSk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1hc2spOworICAgIGxvbmcgbWFzazsKKyAgICBsb25nIHByaTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6TE9HX1VQVE8iLCAmcHJpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFzayA9IExPR19VUFRPKHByaSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG1hc2spOwogfQogCiAvKiBMaXN0IG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIHN5c2xvZ19tZXRob2RzW10gPSB7Ci0JeyJvcGVubG9nIiwJc3lzbG9nX29wZW5sb2csCQlNRVRIX1ZBUkFSR1N9LAotCXsiY2xvc2Vsb2ciLAlzeXNsb2dfY2xvc2Vsb2csCU1FVEhfTk9BUkdTfSwKLQl7InN5c2xvZyIsCXN5c2xvZ19zeXNsb2csCQlNRVRIX1ZBUkFSR1N9LAotCXsic2V0bG9nbWFzayIsCXN5c2xvZ19zZXRsb2dtYXNrLAlNRVRIX1ZBUkFSR1N9LAotCXsiTE9HX01BU0siLAlzeXNsb2dfbG9nX21hc2ssCU1FVEhfVkFSQVJHU30sCi0JeyJMT0dfVVBUTyIsCXN5c2xvZ19sb2dfdXB0bywJTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCU5VTEwsCQkJMH0KKyAgICB7Im9wZW5sb2ciLCAgICAgICAgIHN5c2xvZ19vcGVubG9nLCAgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJjbG9zZWxvZyIsICAgICAgICBzeXNsb2dfY2xvc2Vsb2csICAgICAgICBNRVRIX05PQVJHU30sCisgICAgeyJzeXNsb2ciLCAgICAgICAgICBzeXNsb2dfc3lzbG9nLCAgICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHsic2V0bG9nbWFzayIsICAgICAgc3lzbG9nX3NldGxvZ21hc2ssICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkxPR19NQVNLIiwgICAgICAgIHN5c2xvZ19sb2dfbWFzaywgICAgICAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJMT0dfVVBUTyIsICAgICAgICBzeXNsb2dfbG9nX3VwdG8sICAgICAgICBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgMH0KIH07CiAKIC8qIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlICovCkBAIC0xNTksNjcgKzE1OSw2NyBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRzeXNsb2codm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlKCJzeXNsb2ciLCBzeXNsb2dfbWV0aG9kcyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIC8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJzeXNsb2ciLCBzeXNsb2dfbWV0aG9kcyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLwogCi0JLyogUHJpb3JpdGllcyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfRU1FUkciLAkgIExPR19FTUVSRyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19BTEVSVCIsCSAgTE9HX0FMRVJUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0NSSVQiLAkgIExPR19DUklUKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0VSUiIsCSAgTE9HX0VSUik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19XQVJOSU5HIiwgTE9HX1dBUk5JTkcpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTk9USUNFIiwgIExPR19OT1RJQ0UpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfSU5GTyIsCSAgTE9HX0lORk8pOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfREVCVUciLAkgIExPR19ERUJVRyk7CisgICAgLyogUHJpb3JpdGllcyAqLworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfRU1FUkciLCAgICAgICBMT0dfRU1FUkcpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfQUxFUlQiLCAgICAgICBMT0dfQUxFUlQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfQ1JJVCIsICAgICAgICBMT0dfQ1JJVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19FUlIiLCAgICAgICAgIExPR19FUlIpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfV0FSTklORyIsIExPR19XQVJOSU5HKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX05PVElDRSIsICBMT0dfTk9USUNFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0lORk8iLCAgICAgICAgTE9HX0lORk8pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfREVCVUciLCAgICAgICBMT0dfREVCVUcpOwogCi0JLyogb3BlbmxvZygpIG9wdGlvbiBmbGFncyAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfUElEIiwJICBMT0dfUElEKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0NPTlMiLAkgIExPR19DT05TKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX05ERUxBWSIsICBMT0dfTkRFTEFZKTsKKyAgICAvKiBvcGVubG9nKCkgb3B0aW9uIGZsYWdzICovCisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19QSUQiLCAgICAgICAgIExPR19QSUQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfQ09OUyIsICAgICAgICBMT0dfQ09OUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19OREVMQVkiLCAgTE9HX05ERUxBWSk7CiAjaWZkZWYgTE9HX05PV0FJVAotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTk9XQUlUIiwgIExPR19OT1dBSVQpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTk9XQUlUIiwgIExPR19OT1dBSVQpOwogI2VuZGlmCiAjaWZkZWYgTE9HX1BFUlJPUgotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfUEVSUk9SIiwgIExPR19QRVJST1IpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfUEVSUk9SIiwgIExPR19QRVJST1IpOwogI2VuZGlmCiAKLQkvKiBGYWNpbGl0aWVzICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19LRVJOIiwJICBMT0dfS0VSTik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19VU0VSIiwJICBMT0dfVVNFUik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19NQUlMIiwJICBMT0dfTUFJTCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19EQUVNT04iLCAgTE9HX0RBRU1PTik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19BVVRIIiwJICBMT0dfQVVUSCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19MUFIiLAkgIExPR19MUFIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUwwIiwgIExPR19MT0NBTDApOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUwxIiwgIExPR19MT0NBTDEpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUwyIiwgIExPR19MT0NBTDIpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUwzIiwgIExPR19MT0NBTDMpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUw0IiwgIExPR19MT0NBTDQpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUw1IiwgIExPR19MT0NBTDUpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUw2IiwgIExPR19MT0NBTDYpOwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTE9DQUw3IiwgIExPR19MT0NBTDcpOworICAgIC8qIEZhY2lsaXRpZXMgKi8KKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0tFUk4iLCAgICAgICAgTE9HX0tFUk4pOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfVVNFUiIsICAgICAgICBMT0dfVVNFUik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19NQUlMIiwgICAgICAgIExPR19NQUlMKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0RBRU1PTiIsICBMT0dfREFFTU9OKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0FVVEgiLCAgICAgICAgTE9HX0FVVEgpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTFBSIiwgICAgICAgICBMT0dfTFBSKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMCIsICBMT0dfTE9DQUwwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMSIsICBMT0dfTE9DQUwxKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMiIsICBMT0dfTE9DQUwyKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMMyIsICBMT0dfTE9DQUwzKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNCIsICBMT0dfTE9DQUw0KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNSIsICBMT0dfTE9DQUw1KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNiIsICBMT0dfTE9DQUw2KTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX0xPQ0FMNyIsICBMT0dfTE9DQUw3KTsKIAogI2lmbmRlZiBMT0dfU1lTTE9HCi0jZGVmaW5lIExPR19TWVNMT0cJCUxPR19EQUVNT04KKyNkZWZpbmUgTE9HX1NZU0xPRyAgICAgICAgICAgICAgTE9HX0RBRU1PTgogI2VuZGlmCiAjaWZuZGVmIExPR19ORVdTCi0jZGVmaW5lIExPR19ORVdTCQlMT0dfTUFJTAorI2RlZmluZSBMT0dfTkVXUyAgICAgICAgICAgICAgICBMT0dfTUFJTAogI2VuZGlmCiAjaWZuZGVmIExPR19VVUNQCi0jZGVmaW5lIExPR19VVUNQCQlMT0dfTUFJTAorI2RlZmluZSBMT0dfVVVDUCAgICAgICAgICAgICAgICBMT0dfTUFJTAogI2VuZGlmCiAjaWZuZGVmIExPR19DUk9OCi0jZGVmaW5lIExPR19DUk9OCQlMT0dfREFFTU9OCisjZGVmaW5lIExPR19DUk9OICAgICAgICAgICAgICAgIExPR19EQUVNT04KICNlbmRpZgogCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19TWVNMT0ciLCAgTE9HX1NZU0xPRyk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19DUk9OIiwJICBMT0dfQ1JPTik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19VVUNQIiwJICBMT0dfVVVDUCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19ORVdTIiwJICBMT0dfTkVXUyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19TWVNMT0ciLCAgTE9HX1NZU0xPRyk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIkxPR19DUk9OIiwgICAgICAgIExPR19DUk9OKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTE9HX1VVQ1AiLCAgICAgICAgTE9HX1VVQ1ApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJMT0dfTkVXUyIsICAgICAgICBMT0dfTkVXUyk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Rlcm1pb3MuYyBiL01vZHVsZXMvdGVybWlvcy5jCmluZGV4IGM1MzU2NmMuLjg0NTkyNTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGVybWlvcy5jCisrKyBiL01vZHVsZXMvdGVybWlvcy5jCkBAIC00NCwxNCArNDQsMTQgQEAKIAogc3RhdGljIGludCBmZGNvbnYoUHlPYmplY3QqIG9iaiwgdm9pZCogcCkKIHsKLQlpbnQgZmQ7CisgICAgaW50IGZkOwogCi0JZmQgPSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKG9iaik7Ci0JaWYgKGZkID49IDApIHsKLQkJKihpbnQqKXAgPSBmZDsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgIGZkID0gUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihvYmopOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgICooaW50KilwID0gZmQ7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKHRlcm1pb3NfdGNnZXRhdHRyX19kb2NfXywKQEAgLTY4LDY3ICs2OCw2NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlcm1pb3NfdGNnZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQ7Ci0Jc3RydWN0IHRlcm1pb3MgbW9kZTsKLQlQeU9iamVjdCAqY2M7Ci0Jc3BlZWRfdCBpc3BlZWQsIG9zcGVlZDsKLQlQeU9iamVjdCAqdjsKLQlpbnQgaTsKLQljaGFyIGNoOworICAgIGludCBmZDsKKyAgICBzdHJ1Y3QgdGVybWlvcyBtb2RlOworICAgIFB5T2JqZWN0ICpjYzsKKyAgICBzcGVlZF90IGlzcGVlZCwgb3NwZWVkOworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBpOworICAgIGNoYXIgY2g7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOnRjZ2V0YXR0ciIsIAotCQkJICAgICAgZmRjb252LCAodm9pZCopJmZkKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjp0Y2dldGF0dHIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZGNvbnYsICh2b2lkKikmZmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh0Y2dldGF0dHIoZmQsICZtb2RlKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIGlmICh0Y2dldGF0dHIoZmQsICZtb2RlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwogCi0JaXNwZWVkID0gY2ZnZXRpc3BlZWQoJm1vZGUpOwotCW9zcGVlZCA9IGNmZ2V0b3NwZWVkKCZtb2RlKTsKKyAgICBpc3BlZWQgPSBjZmdldGlzcGVlZCgmbW9kZSk7CisgICAgb3NwZWVkID0gY2ZnZXRvc3BlZWQoJm1vZGUpOwogCi0JY2MgPSBQeUxpc3RfTmV3KE5DQ1MpOwotCWlmIChjYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgTkNDUzsgaSsrKSB7Ci0JCWNoID0gKGNoYXIpbW9kZS5jX2NjW2ldOwotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoJmNoLCAxKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQlQeUxpc3RfU2V0SXRlbShjYywgaSwgdik7Ci0JfQorICAgIGNjID0gUHlMaXN0X05ldyhOQ0NTKTsKKyAgICBpZiAoY2MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IE5DQ1M7IGkrKykgeworICAgICAgICBjaCA9IChjaGFyKW1vZGUuY19jY1tpXTsKKyAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCZjaCwgMSk7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0oY2MsIGksIHYpOworICAgIH0KIAotCS8qIENvbnZlcnQgdGhlIE1JTiBhbmQgVElNRSBzbG90cyB0byBpbnRlZ2VyLiAgT24gc29tZSBzeXN0ZW1zLCB0aGUKLQkgICBNSU4gYW5kIFRJTUUgc2xvdHMgYXJlIHRoZSBzYW1lIGFzIHRoZSBFT0YgYW5kIEVPTCBzbG90cy4gIFNvIHdlCi0JICAgb25seSBkbyB0aGlzIGluIG5vbmNhbm9uaWNhbCBpbnB1dCBtb2RlLiAgKi8KLQlpZiAoKG1vZGUuY19sZmxhZyAmIElDQU5PTikgPT0gMCkgewotCQl2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2NjW1ZNSU5dKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQlQeUxpc3RfU2V0SXRlbShjYywgVk1JTiwgdik7Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfY2NbVlRJTUVdKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQlQeUxpc3RfU2V0SXRlbShjYywgVlRJTUUsIHYpOwotCX0KKyAgICAvKiBDb252ZXJ0IHRoZSBNSU4gYW5kIFRJTUUgc2xvdHMgdG8gaW50ZWdlci4gIE9uIHNvbWUgc3lzdGVtcywgdGhlCisgICAgICAgTUlOIGFuZCBUSU1FIHNsb3RzIGFyZSB0aGUgc2FtZSBhcyB0aGUgRU9GIGFuZCBFT0wgc2xvdHMuICBTbyB3ZQorICAgICAgIG9ubHkgZG8gdGhpcyBpbiBub25jYW5vbmljYWwgaW5wdXQgbW9kZS4gICovCisgICAgaWYgKChtb2RlLmNfbGZsYWcgJiBJQ0FOT04pID09IDApIHsKKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKW1vZGUuY19jY1tWTUlOXSk7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0oY2MsIFZNSU4sIHYpOworICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbW9kZS5jX2NjW1ZUSU1FXSk7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgUHlMaXN0X1NldEl0ZW0oY2MsIFZUSU1FLCB2KTsKKyAgICB9CiAKLQlpZiAoISh2ID0gUHlMaXN0X05ldyg3KSkpCi0JCWdvdG8gZXJyOworICAgIGlmICghKHYgPSBQeUxpc3RfTmV3KDcpKSkKKyAgICAgICAgZ290byBlcnI7CiAKLQlQeUxpc3RfU2V0SXRlbSh2LCAwLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfaWZsYWcpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCAxLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfb2ZsYWcpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCAyLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfY2ZsYWcpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCAzLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfbGZsYWcpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCA0LCBQeUludF9Gcm9tTG9uZygobG9uZylpc3BlZWQpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCA1LCBQeUludF9Gcm9tTG9uZygobG9uZylvc3BlZWQpKTsKLQlQeUxpc3RfU2V0SXRlbSh2LCA2LCBjYyk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpewotCQlQeV9ERUNSRUYodik7Ci0JCWdvdG8gZXJyOwotCX0KLQlyZXR1cm4gdjsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCAwLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfaWZsYWcpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCAxLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfb2ZsYWcpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCAyLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfY2ZsYWcpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCAzLCBQeUludF9Gcm9tTG9uZygobG9uZyltb2RlLmNfbGZsYWcpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCA0LCBQeUludF9Gcm9tTG9uZygobG9uZylpc3BlZWQpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCA1LCBQeUludF9Gcm9tTG9uZygobG9uZylvc3BlZWQpKTsKKyAgICBQeUxpc3RfU2V0SXRlbSh2LCA2LCBjYyk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICByZXR1cm4gdjsKICAgZXJyOgotCVB5X0RFQ1JFRihjYyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGNjKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHRlcm1pb3NfdGNzZXRhdHRyX19kb2NfXywKQEAgLTE0NSw2NCArMTQ1LDY0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGVybWlvc190Y3NldGF0dHIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZCwgd2hlbjsKLQlzdHJ1Y3QgdGVybWlvcyBtb2RlOwotCXNwZWVkX3QgaXNwZWVkLCBvc3BlZWQ7Ci0JUHlPYmplY3QgKnRlcm0sICpjYywgKnY7Ci0JaW50IGk7CisgICAgaW50IGZkLCB3aGVuOworICAgIHN0cnVjdCB0ZXJtaW9zIG1vZGU7CisgICAgc3BlZWRfdCBpc3BlZWQsIG9zcGVlZDsKKyAgICBQeU9iamVjdCAqdGVybSwgKmNjLCAqdjsKKyAgICBpbnQgaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpTzp0Y3NldGF0dHIiLCAKLQkJCSAgICAgIGZkY29udiwgJmZkLCAmd2hlbiwgJnRlcm0pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5TGlzdF9DaGVjayh0ZXJtKSB8fCBQeUxpc3RfU2l6ZSh0ZXJtKSAhPSA3KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotCQkJICAgICAidGNzZXRhdHRyLCBhcmcgMzogbXVzdCBiZSA3IGVsZW1lbnQgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmlPOnRjc2V0YXR0ciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZkY29udiwgJmZkLCAmd2hlbiwgJnRlcm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayh0ZXJtKSB8fCBQeUxpc3RfU2l6ZSh0ZXJtKSAhPSA3KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidGNzZXRhdHRyLCBhcmcgMzogbXVzdCBiZSA3IGVsZW1lbnQgbGlzdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBHZXQgdGhlIG9sZCBtb2RlLCBpbiBjYXNlIHRoZXJlIGFyZSBhbnkgaGlkZGVuIGZpZWxkcy4uLiAqLwotCWlmICh0Y2dldGF0dHIoZmQsICZtb2RlKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwotCW1vZGUuY19pZmxhZyA9ICh0Y2ZsYWdfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDApKTsKLQltb2RlLmNfb2ZsYWcgPSAodGNmbGFnX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCAxKSk7Ci0JbW9kZS5jX2NmbGFnID0gKHRjZmxhZ190KSBQeUludF9Bc0xvbmcoUHlMaXN0X0dldEl0ZW0odGVybSwgMikpOwotCW1vZGUuY19sZmxhZyA9ICh0Y2ZsYWdfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDMpKTsKLQlpc3BlZWQgPSAoc3BlZWRfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDQpKTsKLQlvc3BlZWQgPSAoc3BlZWRfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDUpKTsKLQljYyA9IFB5TGlzdF9HZXRJdGVtKHRlcm0sIDYpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBHZXQgdGhlIG9sZCBtb2RlLCBpbiBjYXNlIHRoZXJlIGFyZSBhbnkgaGlkZGVuIGZpZWxkcy4uLiAqLworICAgIGlmICh0Y2dldGF0dHIoZmQsICZtb2RlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIG1vZGUuY19pZmxhZyA9ICh0Y2ZsYWdfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDApKTsKKyAgICBtb2RlLmNfb2ZsYWcgPSAodGNmbGFnX3QpIFB5SW50X0FzTG9uZyhQeUxpc3RfR2V0SXRlbSh0ZXJtLCAxKSk7CisgICAgbW9kZS5jX2NmbGFnID0gKHRjZmxhZ190KSBQeUludF9Bc0xvbmcoUHlMaXN0X0dldEl0ZW0odGVybSwgMikpOworICAgIG1vZGUuY19sZmxhZyA9ICh0Y2ZsYWdfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDMpKTsKKyAgICBpc3BlZWQgPSAoc3BlZWRfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDQpKTsKKyAgICBvc3BlZWQgPSAoc3BlZWRfdCkgUHlJbnRfQXNMb25nKFB5TGlzdF9HZXRJdGVtKHRlcm0sIDUpKTsKKyAgICBjYyA9IFB5TGlzdF9HZXRJdGVtKHRlcm0sIDYpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlMaXN0X0NoZWNrKGNjKSB8fCBQeUxpc3RfU2l6ZShjYykgIT0gTkNDUykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCSJ0Y3NldGF0dHI6IGF0dHJpYnV0ZXNbNl0gbXVzdCBiZSAlZCBlbGVtZW50IGxpc3QiLAotCQkJICAgICBOQ0NTKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlMaXN0X0NoZWNrKGNjKSB8fCBQeUxpc3RfU2l6ZShjYykgIT0gTkNDUykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgInRjc2V0YXR0cjogYXR0cmlidXRlc1s2XSBtdXN0IGJlICVkIGVsZW1lbnQgbGlzdCIsCisgICAgICAgICAgICAgICAgIE5DQ1MpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTkNDUzsgaSsrKSB7Ci0JCXYgPSBQeUxpc3RfR2V0SXRlbShjYywgaSk7CisgICAgZm9yIChpID0gMDsgaSA8IE5DQ1M7IGkrKykgeworICAgICAgICB2ID0gUHlMaXN0X0dldEl0ZW0oY2MsIGkpOwogCi0JCWlmIChQeVN0cmluZ19DaGVjayh2KSAmJiBQeVN0cmluZ19TaXplKHYpID09IDEpCi0JCQltb2RlLmNfY2NbaV0gPSAoY2NfdCkgKiBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQkJZWxzZSBpZiAoUHlJbnRfQ2hlY2sodikpCi0JCQltb2RlLmNfY2NbaV0gPSAoY2NfdCkgUHlJbnRfQXNMb25nKHYpOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAorICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodikgJiYgUHlTdHJpbmdfU2l6ZSh2KSA9PSAxKQorICAgICAgICAgICAgbW9kZS5jX2NjW2ldID0gKGNjX3QpICogUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHYpKQorICAgICAgICAgICAgbW9kZS5jX2NjW2ldID0gKGNjX3QpIFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAidGNzZXRhdHRyOiBlbGVtZW50cyBvZiBhdHRyaWJ1dGVzIG11c3QgYmUgY2hhcmFjdGVycyBvciBpbnRlZ2VycyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgfQogCi0JaWYgKGNmc2V0aXNwZWVkKCZtb2RlLCAoc3BlZWRfdCkgaXNwZWVkKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwotCWlmIChjZnNldG9zcGVlZCgmbW9kZSwgKHNwZWVkX3QpIG9zcGVlZCkgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKLQlpZiAodGNzZXRhdHRyKGZkLCB3aGVuLCAmbW9kZSkgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKKyAgICBpZiAoY2ZzZXRpc3BlZWQoJm1vZGUsIChzcGVlZF90KSBpc3BlZWQpID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CisgICAgaWYgKGNmc2V0b3NwZWVkKCZtb2RlLCAoc3BlZWRfdCkgb3NwZWVkKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIGlmICh0Y3NldGF0dHIoZmQsIHdoZW4sICZtb2RlKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHRlcm1pb3NfdGNzZW5kYnJlYWtfX2RvY19fLApAQCAtMjE1LDE2ICsyMTUsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXJtaW9zX3Rjc2VuZGJyZWFrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgZmQsIGR1cmF0aW9uOworICAgIGludCBmZCwgZHVyYXRpb247CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTp0Y3NlbmRicmVhayIsIAotCQkJICAgICAgZmRjb252LCAmZmQsICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCWlmICh0Y3NlbmRicmVhayhmZCwgZHVyYXRpb24pID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6dGNzZW5kYnJlYWsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZGNvbnYsICZmZCwgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHRjc2VuZGJyZWFrKGZkLCBkdXJhdGlvbikgPT0gLTEpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZXJtaW9zX3RjZHJhaW5fX2RvY19fLApAQCAtMjM1LDE2ICsyMzUsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXJtaW9zX3RjZHJhaW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZDsKKyAgICBpbnQgZmQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mOnRjZHJhaW4iLCAKLQkJCSAgICAgIGZkY29udiwgJmZkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHRjZHJhaW4oZmQpID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJjp0Y2RyYWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmRjb252LCAmZmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodGNkcmFpbihmZCkgPT0gLTEpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oVGVybWlvc0Vycm9yKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUih0ZXJtaW9zX3RjZmx1c2hfX2RvY19fLApAQCAtMjU4LDE2ICsyNTgsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXJtaW9zX3RjZmx1c2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZCwgcXVldWU7CisgICAgaW50IGZkLCBxdWV1ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpOnRjZmx1c2giLCAKLQkJCSAgICAgIGZkY29udiwgJmZkLCAmcXVldWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodGNmbHVzaChmZCwgcXVldWUpID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6dGNmbHVzaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZkY29udiwgJmZkLCAmcXVldWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAodGNmbHVzaChmZCwgcXVldWUpID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFRlcm1pb3NFcnJvcik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIodGVybWlvc190Y2Zsb3dfX2RvY19fLApAQCAtMjgxLDMzICsyODEsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXJtaW9zX3RjZmxvdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkLCBhY3Rpb247CisgICAgaW50IGZkLCBhY3Rpb247CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTp0Y2Zsb3ciLCAKLQkJCSAgICAgIGZkY29udiwgJmZkLCAmYWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHRjZmxvdyhmZCwgYWN0aW9uKSA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpOnRjZmxvdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZkY29udiwgJmZkLCAmYWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHRjZmxvdyhmZCwgYWN0aW9uKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhUZXJtaW9zRXJyb3IpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHRlcm1pb3NfbWV0aG9kc1tdID0KIHsKLQl7InRjZ2V0YXR0ciIsIHRlcm1pb3NfdGNnZXRhdHRyLCAKLQkgTUVUSF9WQVJBUkdTLCB0ZXJtaW9zX3RjZ2V0YXR0cl9fZG9jX199LAotCXsidGNzZXRhdHRyIiwgdGVybWlvc190Y3NldGF0dHIsIAotCSBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNzZXRhdHRyX19kb2NfX30sCi0JeyJ0Y3NlbmRicmVhayIsIHRlcm1pb3NfdGNzZW5kYnJlYWssIAotCSBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNzZW5kYnJlYWtfX2RvY19ffSwKLQl7InRjZHJhaW4iLCB0ZXJtaW9zX3RjZHJhaW4sIAotCSBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNkcmFpbl9fZG9jX199LAotCXsidGNmbHVzaCIsIHRlcm1pb3NfdGNmbHVzaCwgCi0JIE1FVEhfVkFSQVJHUywgdGVybWlvc190Y2ZsdXNoX19kb2NfX30sCi0JeyJ0Y2Zsb3ciLCB0ZXJtaW9zX3RjZmxvdywgCi0JIE1FVEhfVkFSQVJHUywgdGVybWlvc190Y2Zsb3dfX2RvY19ffSwKLQl7TlVMTCwgTlVMTH0KKyAgICB7InRjZ2V0YXR0ciIsIHRlcm1pb3NfdGNnZXRhdHRyLAorICAgICBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNnZXRhdHRyX19kb2NfX30sCisgICAgeyJ0Y3NldGF0dHIiLCB0ZXJtaW9zX3Rjc2V0YXR0ciwKKyAgICAgTUVUSF9WQVJBUkdTLCB0ZXJtaW9zX3Rjc2V0YXR0cl9fZG9jX199LAorICAgIHsidGNzZW5kYnJlYWsiLCB0ZXJtaW9zX3Rjc2VuZGJyZWFrLAorICAgICBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNzZW5kYnJlYWtfX2RvY19ffSwKKyAgICB7InRjZHJhaW4iLCB0ZXJtaW9zX3RjZHJhaW4sCisgICAgIE1FVEhfVkFSQVJHUywgdGVybWlvc190Y2RyYWluX19kb2NfX30sCisgICAgeyJ0Y2ZsdXNoIiwgdGVybWlvc190Y2ZsdXNoLAorICAgICBNRVRIX1ZBUkFSR1MsIHRlcm1pb3NfdGNmbHVzaF9fZG9jX199LAorICAgIHsidGNmbG93IiwgdGVybWlvc190Y2Zsb3csCisgICAgIE1FVEhfVkFSQVJHUywgdGVybWlvc190Y2Zsb3dfX2RvY19ffSwKKyAgICB7TlVMTCwgTlVMTH0KIH07CiAKIApAQCAtMzIwLDYwNyArMzIwLDYwNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY29uc3RhbnQgewotCWNoYXIgKm5hbWU7Ci0JbG9uZyB2YWx1ZTsKKyAgICBjaGFyICpuYW1lOworICAgIGxvbmcgdmFsdWU7CiB9IHRlcm1pb3NfY29uc3RhbnRzW10gPSB7Ci0JLyogY2ZnZXRvc3BlZWQoKSwgY2ZzZXRvc3BlZWQoKSBjb25zdGFudHMgKi8KLQl7IkIwIiwgQjB9LAotCXsiQjUwIiwgQjUwfSwKLQl7IkI3NSIsIEI3NX0sCi0JeyJCMTEwIiwgQjExMH0sCi0JeyJCMTM0IiwgQjEzNH0sCi0JeyJCMTUwIiwgQjE1MH0sCi0JeyJCMjAwIiwgQjIwMH0sCi0JeyJCMzAwIiwgQjMwMH0sCi0JeyJCNjAwIiwgQjYwMH0sCi0JeyJCMTIwMCIsIEIxMjAwfSwKLQl7IkIxODAwIiwgQjE4MDB9LAotCXsiQjI0MDAiLCBCMjQwMH0sCi0JeyJCNDgwMCIsIEI0ODAwfSwKLQl7IkI5NjAwIiwgQjk2MDB9LAotCXsiQjE5MjAwIiwgQjE5MjAwfSwKLQl7IkIzODQwMCIsIEIzODQwMH0sCisgICAgLyogY2ZnZXRvc3BlZWQoKSwgY2ZzZXRvc3BlZWQoKSBjb25zdGFudHMgKi8KKyAgICB7IkIwIiwgQjB9LAorICAgIHsiQjUwIiwgQjUwfSwKKyAgICB7IkI3NSIsIEI3NX0sCisgICAgeyJCMTEwIiwgQjExMH0sCisgICAgeyJCMTM0IiwgQjEzNH0sCisgICAgeyJCMTUwIiwgQjE1MH0sCisgICAgeyJCMjAwIiwgQjIwMH0sCisgICAgeyJCMzAwIiwgQjMwMH0sCisgICAgeyJCNjAwIiwgQjYwMH0sCisgICAgeyJCMTIwMCIsIEIxMjAwfSwKKyAgICB7IkIxODAwIiwgQjE4MDB9LAorICAgIHsiQjI0MDAiLCBCMjQwMH0sCisgICAgeyJCNDgwMCIsIEI0ODAwfSwKKyAgICB7IkI5NjAwIiwgQjk2MDB9LAorICAgIHsiQjE5MjAwIiwgQjE5MjAwfSwKKyAgICB7IkIzODQwMCIsIEIzODQwMH0sCiAjaWZkZWYgQjU3NjAwCi0JeyJCNTc2MDAiLCBCNTc2MDB9LAorICAgIHsiQjU3NjAwIiwgQjU3NjAwfSwKICNlbmRpZgogI2lmZGVmIEIxMTUyMDAKLQl7IkIxMTUyMDAiLCBCMTE1MjAwfSwKKyAgICB7IkIxMTUyMDAiLCBCMTE1MjAwfSwKICNlbmRpZgogI2lmZGVmIEIyMzA0MDAKLQl7IkIyMzA0MDAiLCBCMjMwNDAwfSwKKyAgICB7IkIyMzA0MDAiLCBCMjMwNDAwfSwKICNlbmRpZgogI2lmZGVmIENCQVVERVgKLQl7IkNCQVVERVgiLCBDQkFVREVYfSwKKyAgICB7IkNCQVVERVgiLCBDQkFVREVYfSwKICNlbmRpZgogCi0JLyogdGNzZXRhdHRyKCkgY29uc3RhbnRzICovCi0JeyJUQ1NBTk9XIiwgVENTQU5PV30sCi0JeyJUQ1NBRFJBSU4iLCBUQ1NBRFJBSU59LAotCXsiVENTQUZMVVNIIiwgVENTQUZMVVNIfSwKKyAgICAvKiB0Y3NldGF0dHIoKSBjb25zdGFudHMgKi8KKyAgICB7IlRDU0FOT1ciLCBUQ1NBTk9XfSwKKyAgICB7IlRDU0FEUkFJTiIsIFRDU0FEUkFJTn0sCisgICAgeyJUQ1NBRkxVU0giLCBUQ1NBRkxVU0h9LAogCi0JLyogdGNmbHVzaCgpIGNvbnN0YW50cyAqLwotCXsiVENJRkxVU0giLCBUQ0lGTFVTSH0sCi0JeyJUQ09GTFVTSCIsIFRDT0ZMVVNIfSwKLQl7IlRDSU9GTFVTSCIsIFRDSU9GTFVTSH0sCisgICAgLyogdGNmbHVzaCgpIGNvbnN0YW50cyAqLworICAgIHsiVENJRkxVU0giLCBUQ0lGTFVTSH0sCisgICAgeyJUQ09GTFVTSCIsIFRDT0ZMVVNIfSwKKyAgICB7IlRDSU9GTFVTSCIsIFRDSU9GTFVTSH0sCiAKLQkvKiB0Y2Zsb3coKSBjb25zdGFudHMgKi8KLQl7IlRDT09GRiIsIFRDT09GRn0sCi0JeyJUQ09PTiIsIFRDT09OfSwKLQl7IlRDSU9GRiIsIFRDSU9GRn0sCi0JeyJUQ0lPTiIsIFRDSU9OfSwKKyAgICAvKiB0Y2Zsb3coKSBjb25zdGFudHMgKi8KKyAgICB7IlRDT09GRiIsIFRDT09GRn0sCisgICAgeyJUQ09PTiIsIFRDT09OfSwKKyAgICB7IlRDSU9GRiIsIFRDSU9GRn0sCisgICAgeyJUQ0lPTiIsIFRDSU9OfSwKIAotCS8qIHN0cnVjdCB0ZXJtaW9zLmNfaWZsYWcgY29uc3RhbnRzICovCi0JeyJJR05CUksiLCBJR05CUkt9LAotCXsiQlJLSU5UIiwgQlJLSU5UfSwKLQl7IklHTlBBUiIsIElHTlBBUn0sCi0JeyJQQVJNUksiLCBQQVJNUkt9LAotCXsiSU5QQ0siLCBJTlBDS30sCi0JeyJJU1RSSVAiLCBJU1RSSVB9LAotCXsiSU5MQ1IiLCBJTkxDUn0sCi0JeyJJR05DUiIsIElHTkNSfSwKLQl7IklDUk5MIiwgSUNSTkx9LAorICAgIC8qIHN0cnVjdCB0ZXJtaW9zLmNfaWZsYWcgY29uc3RhbnRzICovCisgICAgeyJJR05CUksiLCBJR05CUkt9LAorICAgIHsiQlJLSU5UIiwgQlJLSU5UfSwKKyAgICB7IklHTlBBUiIsIElHTlBBUn0sCisgICAgeyJQQVJNUksiLCBQQVJNUkt9LAorICAgIHsiSU5QQ0siLCBJTlBDS30sCisgICAgeyJJU1RSSVAiLCBJU1RSSVB9LAorICAgIHsiSU5MQ1IiLCBJTkxDUn0sCisgICAgeyJJR05DUiIsIElHTkNSfSwKKyAgICB7IklDUk5MIiwgSUNSTkx9LAogI2lmZGVmIElVQ0xDCi0JeyJJVUNMQyIsIElVQ0xDfSwKKyAgICB7IklVQ0xDIiwgSVVDTEN9LAogI2VuZGlmCi0JeyJJWE9OIiwgSVhPTn0sCi0JeyJJWEFOWSIsIElYQU5ZfSwKLQl7IklYT0ZGIiwgSVhPRkZ9LAorICAgIHsiSVhPTiIsIElYT059LAorICAgIHsiSVhBTlkiLCBJWEFOWX0sCisgICAgeyJJWE9GRiIsIElYT0ZGfSwKICNpZmRlZiBJTUFYQkVMCi0JeyJJTUFYQkVMIiwgSU1BWEJFTH0sCisgICAgeyJJTUFYQkVMIiwgSU1BWEJFTH0sCiAjZW5kaWYKIAotCS8qIHN0cnVjdCB0ZXJtaW9zLmNfb2ZsYWcgY29uc3RhbnRzICovCi0JeyJPUE9TVCIsIE9QT1NUfSwKKyAgICAvKiBzdHJ1Y3QgdGVybWlvcy5jX29mbGFnIGNvbnN0YW50cyAqLworICAgIHsiT1BPU1QiLCBPUE9TVH0sCiAjaWZkZWYgT0xDVUMKLQl7Ik9MQ1VDIiwgT0xDVUN9LAorICAgIHsiT0xDVUMiLCBPTENVQ30sCiAjZW5kaWYKICNpZmRlZiBPTkxDUgotCXsiT05MQ1IiLCBPTkxDUn0sCisgICAgeyJPTkxDUiIsIE9OTENSfSwKICNlbmRpZgogI2lmZGVmIE9DUk5MCi0JeyJPQ1JOTCIsIE9DUk5MfSwKKyAgICB7Ik9DUk5MIiwgT0NSTkx9LAogI2VuZGlmCiAjaWZkZWYgT05PQ1IKLQl7Ik9OT0NSIiwgT05PQ1J9LAorICAgIHsiT05PQ1IiLCBPTk9DUn0sCiAjZW5kaWYKICNpZmRlZiBPTkxSRVQKLQl7Ik9OTFJFVCIsIE9OTFJFVH0sCisgICAgeyJPTkxSRVQiLCBPTkxSRVR9LAogI2VuZGlmCiAjaWZkZWYgT0ZJTEwKLQl7Ik9GSUxMIiwgT0ZJTEx9LAorICAgIHsiT0ZJTEwiLCBPRklMTH0sCiAjZW5kaWYKICNpZmRlZiBPRkRFTAotCXsiT0ZERUwiLCBPRkRFTH0sCisgICAgeyJPRkRFTCIsIE9GREVMfSwKICNlbmRpZgogI2lmZGVmIE5MRExZCi0JeyJOTERMWSIsIE5MRExZfSwKKyAgICB7Ik5MRExZIiwgTkxETFl9LAogI2VuZGlmCiAjaWZkZWYgQ1JETFkKLQl7IkNSRExZIiwgQ1JETFl9LAorICAgIHsiQ1JETFkiLCBDUkRMWX0sCiAjZW5kaWYKICNpZmRlZiBUQUJETFkKLQl7IlRBQkRMWSIsIFRBQkRMWX0sCisgICAgeyJUQUJETFkiLCBUQUJETFl9LAogI2VuZGlmCiAjaWZkZWYgQlNETFkKLQl7IkJTRExZIiwgQlNETFl9LAorICAgIHsiQlNETFkiLCBCU0RMWX0sCiAjZW5kaWYKICNpZmRlZiBWVERMWQotCXsiVlRETFkiLCBWVERMWX0sCisgICAgeyJWVERMWSIsIFZURExZfSwKICNlbmRpZgogI2lmZGVmIEZGRExZCi0JeyJGRkRMWSIsIEZGRExZfSwKKyAgICB7IkZGRExZIiwgRkZETFl9LAogI2VuZGlmCiAKLQkvKiBzdHJ1Y3QgdGVybWlvcy5jX29mbGFnLXJlbGF0ZWQgdmFsdWVzIChkZWxheSBtYXNrKSAqLworICAgIC8qIHN0cnVjdCB0ZXJtaW9zLmNfb2ZsYWctcmVsYXRlZCB2YWx1ZXMgKGRlbGF5IG1hc2spICovCiAjaWZkZWYgTkwwCi0JeyJOTDAiLCBOTDB9LAorICAgIHsiTkwwIiwgTkwwfSwKICNlbmRpZgogI2lmZGVmIE5MMQotCXsiTkwxIiwgTkwxfSwKKyAgICB7Ik5MMSIsIE5MMX0sCiAjZW5kaWYKICNpZmRlZiBDUjAKLQl7IkNSMCIsIENSMH0sCisgICAgeyJDUjAiLCBDUjB9LAogI2VuZGlmCiAjaWZkZWYgQ1IxCi0JeyJDUjEiLCBDUjF9LAorICAgIHsiQ1IxIiwgQ1IxfSwKICNlbmRpZgogI2lmZGVmIENSMgotCXsiQ1IyIiwgQ1IyfSwKKyAgICB7IkNSMiIsIENSMn0sCiAjZW5kaWYKICNpZmRlZiBDUjMKLQl7IkNSMyIsIENSM30sCisgICAgeyJDUjMiLCBDUjN9LAogI2VuZGlmCiAjaWZkZWYgVEFCMAotCXsiVEFCMCIsIFRBQjB9LAorICAgIHsiVEFCMCIsIFRBQjB9LAogI2VuZGlmCiAjaWZkZWYgVEFCMQotCXsiVEFCMSIsIFRBQjF9LAorICAgIHsiVEFCMSIsIFRBQjF9LAogI2VuZGlmCiAjaWZkZWYgVEFCMgotCXsiVEFCMiIsIFRBQjJ9LAorICAgIHsiVEFCMiIsIFRBQjJ9LAogI2VuZGlmCiAjaWZkZWYgVEFCMwotCXsiVEFCMyIsIFRBQjN9LAorICAgIHsiVEFCMyIsIFRBQjN9LAogI2VuZGlmCiAjaWZkZWYgWFRBQlMKLQl7IlhUQUJTIiwgWFRBQlN9LAorICAgIHsiWFRBQlMiLCBYVEFCU30sCiAjZW5kaWYKICNpZmRlZiBCUzAKLQl7IkJTMCIsIEJTMH0sCisgICAgeyJCUzAiLCBCUzB9LAogI2VuZGlmCiAjaWZkZWYgQlMxCi0JeyJCUzEiLCBCUzF9LAorICAgIHsiQlMxIiwgQlMxfSwKICNlbmRpZgogI2lmZGVmIFZUMAotCXsiVlQwIiwgVlQwfSwKKyAgICB7IlZUMCIsIFZUMH0sCiAjZW5kaWYKICNpZmRlZiBWVDEKLQl7IlZUMSIsIFZUMX0sCisgICAgeyJWVDEiLCBWVDF9LAogI2VuZGlmCiAjaWZkZWYgRkYwCi0JeyJGRjAiLCBGRjB9LAorICAgIHsiRkYwIiwgRkYwfSwKICNlbmRpZgogI2lmZGVmIEZGMQotCXsiRkYxIiwgRkYxfSwKKyAgICB7IkZGMSIsIEZGMX0sCiAjZW5kaWYKIAotCS8qIHN0cnVjdCB0ZXJtaW9zLmNfY2ZsYWcgY29uc3RhbnRzICovCi0JeyJDU0laRSIsIENTSVpFfSwKLQl7IkNTVE9QQiIsIENTVE9QQn0sCi0JeyJDUkVBRCIsIENSRUFEfSwKLQl7IlBBUkVOQiIsIFBBUkVOQn0sCi0JeyJQQVJPREQiLCBQQVJPRER9LAotCXsiSFVQQ0wiLCBIVVBDTH0sCi0JeyJDTE9DQUwiLCBDTE9DQUx9LAorICAgIC8qIHN0cnVjdCB0ZXJtaW9zLmNfY2ZsYWcgY29uc3RhbnRzICovCisgICAgeyJDU0laRSIsIENTSVpFfSwKKyAgICB7IkNTVE9QQiIsIENTVE9QQn0sCisgICAgeyJDUkVBRCIsIENSRUFEfSwKKyAgICB7IlBBUkVOQiIsIFBBUkVOQn0sCisgICAgeyJQQVJPREQiLCBQQVJPRER9LAorICAgIHsiSFVQQ0wiLCBIVVBDTH0sCisgICAgeyJDTE9DQUwiLCBDTE9DQUx9LAogI2lmZGVmIENJQkFVRAotCXsiQ0lCQVVEIiwgQ0lCQVVEfSwKKyAgICB7IkNJQkFVRCIsIENJQkFVRH0sCiAjZW5kaWYKICNpZmRlZiBDUlRTQ1RTCi0JeyJDUlRTQ1RTIiwgKGxvbmcpQ1JUU0NUU30sCisgICAgeyJDUlRTQ1RTIiwgKGxvbmcpQ1JUU0NUU30sCiAjZW5kaWYKIAotCS8qIHN0cnVjdCB0ZXJtaW9zLmNfY2ZsYWctcmVsYXRlZCB2YWx1ZXMgKGNoYXJhY3RlciBzaXplKSAqLwotCXsiQ1M1IiwgQ1M1fSwKLQl7IkNTNiIsIENTNn0sCi0JeyJDUzciLCBDUzd9LAotCXsiQ1M4IiwgQ1M4fSwKKyAgICAvKiBzdHJ1Y3QgdGVybWlvcy5jX2NmbGFnLXJlbGF0ZWQgdmFsdWVzIChjaGFyYWN0ZXIgc2l6ZSkgKi8KKyAgICB7IkNTNSIsIENTNX0sCisgICAgeyJDUzYiLCBDUzZ9LAorICAgIHsiQ1M3IiwgQ1M3fSwKKyAgICB7IkNTOCIsIENTOH0sCiAKLQkvKiBzdHJ1Y3QgdGVybWlvcy5jX2xmbGFnIGNvbnN0YW50cyAqLwotCXsiSVNJRyIsIElTSUd9LAotCXsiSUNBTk9OIiwgSUNBTk9OfSwKKyAgICAvKiBzdHJ1Y3QgdGVybWlvcy5jX2xmbGFnIGNvbnN0YW50cyAqLworICAgIHsiSVNJRyIsIElTSUd9LAorICAgIHsiSUNBTk9OIiwgSUNBTk9OfSwKICNpZmRlZiBYQ0FTRQotCXsiWENBU0UiLCBYQ0FTRX0sCisgICAgeyJYQ0FTRSIsIFhDQVNFfSwKICNlbmRpZgotCXsiRUNITyIsIEVDSE99LAotCXsiRUNIT0UiLCBFQ0hPRX0sCi0JeyJFQ0hPSyIsIEVDSE9LfSwKLQl7IkVDSE9OTCIsIEVDSE9OTH0sCisgICAgeyJFQ0hPIiwgRUNIT30sCisgICAgeyJFQ0hPRSIsIEVDSE9FfSwKKyAgICB7IkVDSE9LIiwgRUNIT0t9LAorICAgIHsiRUNIT05MIiwgRUNIT05MfSwKICNpZmRlZiBFQ0hPQ1RMCi0JeyJFQ0hPQ1RMIiwgRUNIT0NUTH0sCisgICAgeyJFQ0hPQ1RMIiwgRUNIT0NUTH0sCiAjZW5kaWYKICNpZmRlZiBFQ0hPUFJUCi0JeyJFQ0hPUFJUIiwgRUNIT1BSVH0sCisgICAgeyJFQ0hPUFJUIiwgRUNIT1BSVH0sCiAjZW5kaWYKICNpZmRlZiBFQ0hPS0UKLQl7IkVDSE9LRSIsIEVDSE9LRX0sCisgICAgeyJFQ0hPS0UiLCBFQ0hPS0V9LAogI2VuZGlmCiAjaWZkZWYgRkxVU0hPCi0JeyJGTFVTSE8iLCBGTFVTSE99LAorICAgIHsiRkxVU0hPIiwgRkxVU0hPfSwKICNlbmRpZgotCXsiTk9GTFNIIiwgTk9GTFNIfSwKLQl7IlRPU1RPUCIsIFRPU1RPUH0sCisgICAgeyJOT0ZMU0giLCBOT0ZMU0h9LAorICAgIHsiVE9TVE9QIiwgVE9TVE9QfSwKICNpZmRlZiBQRU5ESU4KLQl7IlBFTkRJTiIsIFBFTkRJTn0sCisgICAgeyJQRU5ESU4iLCBQRU5ESU59LAogI2VuZGlmCi0JeyJJRVhURU4iLCBJRVhURU59LAorICAgIHsiSUVYVEVOIiwgSUVYVEVOfSwKIAotCS8qIGluZGV4ZXMgaW50byB0aGUgY29udHJvbCBjaGFycyBhcnJheSByZXR1cm5lZCBieSB0Y2dldGF0dHIoKSAqLwotCXsiVklOVFIiLCBWSU5UUn0sCi0JeyJWUVVJVCIsIFZRVUlUfSwKLQl7IlZFUkFTRSIsIFZFUkFTRX0sCi0JeyJWS0lMTCIsIFZLSUxMfSwKLQl7IlZFT0YiLCBWRU9GfSwKLQl7IlZUSU1FIiwgVlRJTUV9LAotCXsiVk1JTiIsIFZNSU59LAorICAgIC8qIGluZGV4ZXMgaW50byB0aGUgY29udHJvbCBjaGFycyBhcnJheSByZXR1cm5lZCBieSB0Y2dldGF0dHIoKSAqLworICAgIHsiVklOVFIiLCBWSU5UUn0sCisgICAgeyJWUVVJVCIsIFZRVUlUfSwKKyAgICB7IlZFUkFTRSIsIFZFUkFTRX0sCisgICAgeyJWS0lMTCIsIFZLSUxMfSwKKyAgICB7IlZFT0YiLCBWRU9GfSwKKyAgICB7IlZUSU1FIiwgVlRJTUV9LAorICAgIHsiVk1JTiIsIFZNSU59LAogI2lmZGVmIFZTV1RDCi0JLyogVGhlICNkZWZpbmVzIGFib3ZlIGVuc3VyZSB0aGF0IGlmIGVpdGhlciBpcyBkZWZpbmVkLCBib3RoIGFyZSwKLSAgICAgICAgICogYnV0IGJvdGggbWF5IGJlIG9taXR0ZWQgYnkgdGhlIHN5c3RlbSBoZWFkZXJzLiAgOy0oICAqLwotCXsiVlNXVEMiLCBWU1dUQ30sCi0JeyJWU1dUQ0giLCBWU1dUQ0h9LAorICAgIC8qIFRoZSAjZGVmaW5lcyBhYm92ZSBlbnN1cmUgdGhhdCBpZiBlaXRoZXIgaXMgZGVmaW5lZCwgYm90aCBhcmUsCisgICAgICogYnV0IGJvdGggbWF5IGJlIG9taXR0ZWQgYnkgdGhlIHN5c3RlbSBoZWFkZXJzLiAgOy0oICAqLworICAgIHsiVlNXVEMiLCBWU1dUQ30sCisgICAgeyJWU1dUQ0giLCBWU1dUQ0h9LAogI2VuZGlmCi0JeyJWU1RBUlQiLCBWU1RBUlR9LAotCXsiVlNUT1AiLCBWU1RPUH0sCi0JeyJWU1VTUCIsIFZTVVNQfSwKLQl7IlZFT0wiLCBWRU9MfSwKKyAgICB7IlZTVEFSVCIsIFZTVEFSVH0sCisgICAgeyJWU1RPUCIsIFZTVE9QfSwKKyAgICB7IlZTVVNQIiwgVlNVU1B9LAorICAgIHsiVkVPTCIsIFZFT0x9LAogI2lmZGVmIFZSRVBSSU5UCi0JeyJWUkVQUklOVCIsIFZSRVBSSU5UfSwKKyAgICB7IlZSRVBSSU5UIiwgVlJFUFJJTlR9LAogI2VuZGlmCiAjaWZkZWYgVkRJU0NBUkQKLQl7IlZESVNDQVJEIiwgVkRJU0NBUkR9LAorICAgIHsiVkRJU0NBUkQiLCBWRElTQ0FSRH0sCiAjZW5kaWYKICNpZmRlZiBWV0VSQVNFCi0JeyJWV0VSQVNFIiwgVldFUkFTRX0sCisgICAgeyJWV0VSQVNFIiwgVldFUkFTRX0sCiAjZW5kaWYKICNpZmRlZiBWTE5FWFQKLQl7IlZMTkVYVCIsIFZMTkVYVH0sCisgICAgeyJWTE5FWFQiLCBWTE5FWFR9LAogI2VuZGlmCiAjaWZkZWYgVkVPTDIKLQl7IlZFT0wyIiwgVkVPTDJ9LAorICAgIHsiVkVPTDIiLCBWRU9MMn0sCiAjZW5kaWYKIAogCiAjaWZkZWYgQjQ2MDgwMAotCXsiQjQ2MDgwMCIsIEI0NjA4MDB9LAorICAgIHsiQjQ2MDgwMCIsIEI0NjA4MDB9LAogI2VuZGlmCiAjaWZkZWYgQ0JBVUQKLQl7IkNCQVVEIiwgQ0JBVUR9LAorICAgIHsiQ0JBVUQiLCBDQkFVRH0sCiAjZW5kaWYKICNpZmRlZiBDREVMCi0JeyJDREVMIiwgQ0RFTH0sCisgICAgeyJDREVMIiwgQ0RFTH0sCiAjZW5kaWYKICNpZmRlZiBDRFNVU1AKLQl7IkNEU1VTUCIsIENEU1VTUH0sCisgICAgeyJDRFNVU1AiLCBDRFNVU1B9LAogI2VuZGlmCiAjaWZkZWYgQ0VPRgotCXsiQ0VPRiIsIENFT0Z9LAorICAgIHsiQ0VPRiIsIENFT0Z9LAogI2VuZGlmCiAjaWZkZWYgQ0VPTAotCXsiQ0VPTCIsIENFT0x9LAorICAgIHsiQ0VPTCIsIENFT0x9LAogI2VuZGlmCiAjaWZkZWYgQ0VPTDIKLQl7IkNFT0wyIiwgQ0VPTDJ9LAorICAgIHsiQ0VPTDIiLCBDRU9MMn0sCiAjZW5kaWYKICNpZmRlZiBDRU9UCi0JeyJDRU9UIiwgQ0VPVH0sCisgICAgeyJDRU9UIiwgQ0VPVH0sCiAjZW5kaWYKICNpZmRlZiBDRVJBU0UKLQl7IkNFUkFTRSIsIENFUkFTRX0sCisgICAgeyJDRVJBU0UiLCBDRVJBU0V9LAogI2VuZGlmCiAjaWZkZWYgQ0VTQwotCXsiQ0VTQyIsIENFU0N9LAorICAgIHsiQ0VTQyIsIENFU0N9LAogI2VuZGlmCiAjaWZkZWYgQ0ZMVVNICi0JeyJDRkxVU0giLCBDRkxVU0h9LAorICAgIHsiQ0ZMVVNIIiwgQ0ZMVVNIfSwKICNlbmRpZgogI2lmZGVmIENJTlRSCi0JeyJDSU5UUiIsIENJTlRSfSwKKyAgICB7IkNJTlRSIiwgQ0lOVFJ9LAogI2VuZGlmCiAjaWZkZWYgQ0tJTEwKLQl7IkNLSUxMIiwgQ0tJTEx9LAorICAgIHsiQ0tJTEwiLCBDS0lMTH0sCiAjZW5kaWYKICNpZmRlZiBDTE5FWFQKLQl7IkNMTkVYVCIsIENMTkVYVH0sCisgICAgeyJDTE5FWFQiLCBDTE5FWFR9LAogI2VuZGlmCiAjaWZkZWYgQ05VTAotCXsiQ05VTCIsIENOVUx9LAorICAgIHsiQ05VTCIsIENOVUx9LAogI2VuZGlmCiAjaWZkZWYgQ09NTU9OCi0JeyJDT01NT04iLCBDT01NT059LAorICAgIHsiQ09NTU9OIiwgQ09NTU9OfSwKICNlbmRpZgogI2lmZGVmIENRVUlUCi0JeyJDUVVJVCIsIENRVUlUfSwKKyAgICB7IkNRVUlUIiwgQ1FVSVR9LAogI2VuZGlmCiAjaWZkZWYgQ1JQUk5UCi0JeyJDUlBSTlQiLCBDUlBSTlR9LAorICAgIHsiQ1JQUk5UIiwgQ1JQUk5UfSwKICNlbmRpZgogI2lmZGVmIENTVEFSVAotCXsiQ1NUQVJUIiwgQ1NUQVJUfSwKKyAgICB7IkNTVEFSVCIsIENTVEFSVH0sCiAjZW5kaWYKICNpZmRlZiBDU1RPUAotCXsiQ1NUT1AiLCBDU1RPUH0sCisgICAgeyJDU1RPUCIsIENTVE9QfSwKICNlbmRpZgogI2lmZGVmIENTVVNQCi0JeyJDU1VTUCIsIENTVVNQfSwKKyAgICB7IkNTVVNQIiwgQ1NVU1B9LAogI2VuZGlmCiAjaWZkZWYgQ1NXVENICi0JeyJDU1dUQ0giLCBDU1dUQ0h9LAorICAgIHsiQ1NXVENIIiwgQ1NXVENIfSwKICNlbmRpZgogI2lmZGVmIENXRVJBU0UKLQl7IkNXRVJBU0UiLCBDV0VSQVNFfSwKKyAgICB7IkNXRVJBU0UiLCBDV0VSQVNFfSwKICNlbmRpZgogI2lmZGVmIEVYVEEKLQl7IkVYVEEiLCBFWFRBfSwKKyAgICB7IkVYVEEiLCBFWFRBfSwKICNlbmRpZgogI2lmZGVmIEVYVEIKLQl7IkVYVEIiLCBFWFRCfSwKKyAgICB7IkVYVEIiLCBFWFRCfSwKICNlbmRpZgogI2lmZGVmIEZJT0FTWU5DCi0JeyJGSU9BU1lOQyIsIEZJT0FTWU5DfSwKKyAgICB7IkZJT0FTWU5DIiwgRklPQVNZTkN9LAogI2VuZGlmCiAjaWZkZWYgRklPQ0xFWAotCXsiRklPQ0xFWCIsIEZJT0NMRVh9LAorICAgIHsiRklPQ0xFWCIsIEZJT0NMRVh9LAogI2VuZGlmCiAjaWZkZWYgRklPTkJJTwotCXsiRklPTkJJTyIsIEZJT05CSU99LAorICAgIHsiRklPTkJJTyIsIEZJT05CSU99LAogI2VuZGlmCiAjaWZkZWYgRklPTkNMRVgKLQl7IkZJT05DTEVYIiwgRklPTkNMRVh9LAorICAgIHsiRklPTkNMRVgiLCBGSU9OQ0xFWH0sCiAjZW5kaWYKICNpZmRlZiBGSU9OUkVBRAotCXsiRklPTlJFQUQiLCBGSU9OUkVBRH0sCisgICAgeyJGSU9OUkVBRCIsIEZJT05SRUFEfSwKICNlbmRpZgogI2lmZGVmIElCU0hJRlQKLQl7IklCU0hJRlQiLCBJQlNISUZUfSwKKyAgICB7IklCU0hJRlQiLCBJQlNISUZUfSwKICNlbmRpZgogI2lmZGVmIElOSVRfQ19DQwotCXsiSU5JVF9DX0NDIiwgSU5JVF9DX0NDfSwKKyAgICB7IklOSVRfQ19DQyIsIElOSVRfQ19DQ30sCiAjZW5kaWYKICNpZmRlZiBJT0NTSVpFX01BU0sKLQl7IklPQ1NJWkVfTUFTSyIsIElPQ1NJWkVfTUFTS30sCisgICAgeyJJT0NTSVpFX01BU0siLCBJT0NTSVpFX01BU0t9LAogI2VuZGlmCiAjaWZkZWYgSU9DU0laRV9TSElGVAotCXsiSU9DU0laRV9TSElGVCIsIElPQ1NJWkVfU0hJRlR9LAorICAgIHsiSU9DU0laRV9TSElGVCIsIElPQ1NJWkVfU0hJRlR9LAogI2VuZGlmCiAjaWZkZWYgTkNDCi0JeyJOQ0MiLCBOQ0N9LAorICAgIHsiTkNDIiwgTkNDfSwKICNlbmRpZgogI2lmZGVmIE5DQ1MKLQl7Ik5DQ1MiLCBOQ0NTfSwKKyAgICB7Ik5DQ1MiLCBOQ0NTfSwKICNlbmRpZgogI2lmZGVmIE5TV1RDSAotCXsiTlNXVENIIiwgTlNXVENIfSwKKyAgICB7Ik5TV1RDSCIsIE5TV1RDSH0sCiAjZW5kaWYKICNpZmRlZiBOX01PVVNFCi0JeyJOX01PVVNFIiwgTl9NT1VTRX0sCisgICAgeyJOX01PVVNFIiwgTl9NT1VTRX0sCiAjZW5kaWYKICNpZmRlZiBOX1BQUAotCXsiTl9QUFAiLCBOX1BQUH0sCisgICAgeyJOX1BQUCIsIE5fUFBQfSwKICNlbmRpZgogI2lmZGVmIE5fU0xJUAotCXsiTl9TTElQIiwgTl9TTElQfSwKKyAgICB7Ik5fU0xJUCIsIE5fU0xJUH0sCiAjZW5kaWYKICNpZmRlZiBOX1NUUklQCi0JeyJOX1NUUklQIiwgTl9TVFJJUH0sCisgICAgeyJOX1NUUklQIiwgTl9TVFJJUH0sCiAjZW5kaWYKICNpZmRlZiBOX1RUWQotCXsiTl9UVFkiLCBOX1RUWX0sCisgICAgeyJOX1RUWSIsIE5fVFRZfSwKICNlbmRpZgogI2lmZGVmIFRDRkxTSAotCXsiVENGTFNIIiwgVENGTFNIfSwKKyAgICB7IlRDRkxTSCIsIFRDRkxTSH0sCiAjZW5kaWYKICNpZmRlZiBUQ0dFVEEKLQl7IlRDR0VUQSIsIFRDR0VUQX0sCisgICAgeyJUQ0dFVEEiLCBUQ0dFVEF9LAogI2VuZGlmCiAjaWZkZWYgVENHRVRTCi0JeyJUQ0dFVFMiLCBUQ0dFVFN9LAorICAgIHsiVENHRVRTIiwgVENHRVRTfSwKICNlbmRpZgogI2lmZGVmIFRDU0JSSwotCXsiVENTQlJLIiwgVENTQlJLfSwKKyAgICB7IlRDU0JSSyIsIFRDU0JSS30sCiAjZW5kaWYKICNpZmRlZiBUQ1NCUktQCi0JeyJUQ1NCUktQIiwgVENTQlJLUH0sCisgICAgeyJUQ1NCUktQIiwgVENTQlJLUH0sCiAjZW5kaWYKICNpZmRlZiBUQ1NFVEEKLQl7IlRDU0VUQSIsIFRDU0VUQX0sCisgICAgeyJUQ1NFVEEiLCBUQ1NFVEF9LAogI2VuZGlmCiAjaWZkZWYgVENTRVRBRgotCXsiVENTRVRBRiIsIFRDU0VUQUZ9LAorICAgIHsiVENTRVRBRiIsIFRDU0VUQUZ9LAogI2VuZGlmCiAjaWZkZWYgVENTRVRBVwotCXsiVENTRVRBVyIsIFRDU0VUQVd9LAorICAgIHsiVENTRVRBVyIsIFRDU0VUQVd9LAogI2VuZGlmCiAjaWZkZWYgVENTRVRTCi0JeyJUQ1NFVFMiLCBUQ1NFVFN9LAorICAgIHsiVENTRVRTIiwgVENTRVRTfSwKICNlbmRpZgogI2lmZGVmIFRDU0VUU0YKLQl7IlRDU0VUU0YiLCBUQ1NFVFNGfSwKKyAgICB7IlRDU0VUU0YiLCBUQ1NFVFNGfSwKICNlbmRpZgogI2lmZGVmIFRDU0VUU1cKLQl7IlRDU0VUU1ciLCBUQ1NFVFNXfSwKKyAgICB7IlRDU0VUU1ciLCBUQ1NFVFNXfSwKICNlbmRpZgogI2lmZGVmIFRDWE9OQwotCXsiVENYT05DIiwgVENYT05DfSwKKyAgICB7IlRDWE9OQyIsIFRDWE9OQ30sCiAjZW5kaWYKICNpZmRlZiBUSU9DQ09OUwotCXsiVElPQ0NPTlMiLCBUSU9DQ09OU30sCisgICAgeyJUSU9DQ09OUyIsIFRJT0NDT05TfSwKICNlbmRpZgogI2lmZGVmIFRJT0NFWENMCi0JeyJUSU9DRVhDTCIsIFRJT0NFWENMfSwKKyAgICB7IlRJT0NFWENMIiwgVElPQ0VYQ0x9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0dFVEQKLQl7IlRJT0NHRVREIiwgVElPQ0dFVER9LAorICAgIHsiVElPQ0dFVEQiLCBUSU9DR0VURH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DR0lDT1VOVAotCXsiVElPQ0dJQ09VTlQiLCBUSU9DR0lDT1VOVH0sCisgICAgeyJUSU9DR0lDT1VOVCIsIFRJT0NHSUNPVU5UfSwKICNlbmRpZgogI2lmZGVmIFRJT0NHTENLVFJNSU9TCi0JeyJUSU9DR0xDS1RSTUlPUyIsIFRJT0NHTENLVFJNSU9TfSwKKyAgICB7IlRJT0NHTENLVFJNSU9TIiwgVElPQ0dMQ0tUUk1JT1N9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0dQR1JQCi0JeyJUSU9DR1BHUlAiLCBUSU9DR1BHUlB9LAorICAgIHsiVElPQ0dQR1JQIiwgVElPQ0dQR1JQfSwKICNlbmRpZgogI2lmZGVmIFRJT0NHU0VSSUFMCi0JeyJUSU9DR1NFUklBTCIsIFRJT0NHU0VSSUFMfSwKKyAgICB7IlRJT0NHU0VSSUFMIiwgVElPQ0dTRVJJQUx9LAogI2VuZGlmCiAjaWZkZWYgVElPQ0dTT0ZUQ0FSCi0JeyJUSU9DR1NPRlRDQVIiLCBUSU9DR1NPRlRDQVJ9LAorICAgIHsiVElPQ0dTT0ZUQ0FSIiwgVElPQ0dTT0ZUQ0FSfSwKICNlbmRpZgogI2lmZGVmIFRJT0NHV0lOU1oKLQl7IlRJT0NHV0lOU1oiLCBUSU9DR1dJTlNafSwKKyAgICB7IlRJT0NHV0lOU1oiLCBUSU9DR1dJTlNafSwKICNlbmRpZgogI2lmZGVmIFRJT0NJTlEKLQl7IlRJT0NJTlEiLCBUSU9DSU5RfSwKKyAgICB7IlRJT0NJTlEiLCBUSU9DSU5RfSwKICNlbmRpZgogI2lmZGVmIFRJT0NMSU5VWAotCXsiVElPQ0xJTlVYIiwgVElPQ0xJTlVYfSwKKyAgICB7IlRJT0NMSU5VWCIsIFRJT0NMSU5VWH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTUJJQwotCXsiVElPQ01CSUMiLCBUSU9DTUJJQ30sCisgICAgeyJUSU9DTUJJQyIsIFRJT0NNQklDfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNQklTCi0JeyJUSU9DTUJJUyIsIFRJT0NNQklTfSwKKyAgICB7IlRJT0NNQklTIiwgVElPQ01CSVN9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01HRVQKLQl7IlRJT0NNR0VUIiwgVElPQ01HRVR9LAorICAgIHsiVElPQ01HRVQiLCBUSU9DTUdFVH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTUlXQUlUCi0JeyJUSU9DTUlXQUlUIiwgVElPQ01JV0FJVH0sCisgICAgeyJUSU9DTUlXQUlUIiwgVElPQ01JV0FJVH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTVNFVAotCXsiVElPQ01TRVQiLCBUSU9DTVNFVH0sCisgICAgeyJUSU9DTVNFVCIsIFRJT0NNU0VUfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX0NBUgotCXsiVElPQ01fQ0FSIiwgVElPQ01fQ0FSfSwKKyAgICB7IlRJT0NNX0NBUiIsIFRJT0NNX0NBUn0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9DRAotCXsiVElPQ01fQ0QiLCBUSU9DTV9DRH0sCisgICAgeyJUSU9DTV9DRCIsIFRJT0NNX0NEfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX0NUUwotCXsiVElPQ01fQ1RTIiwgVElPQ01fQ1RTfSwKKyAgICB7IlRJT0NNX0NUUyIsIFRJT0NNX0NUU30sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9EU1IKLQl7IlRJT0NNX0RTUiIsIFRJT0NNX0RTUn0sCisgICAgeyJUSU9DTV9EU1IiLCBUSU9DTV9EU1J9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fRFRSCi0JeyJUSU9DTV9EVFIiLCBUSU9DTV9EVFJ9LAorICAgIHsiVElPQ01fRFRSIiwgVElPQ01fRFRSfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX0xFCi0JeyJUSU9DTV9MRSIsIFRJT0NNX0xFfSwKKyAgICB7IlRJT0NNX0xFIiwgVElPQ01fTEV9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fUkkKLQl7IlRJT0NNX1JJIiwgVElPQ01fUkl9LAorICAgIHsiVElPQ01fUkkiLCBUSU9DTV9SSX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTV9STkcKLQl7IlRJT0NNX1JORyIsIFRJT0NNX1JOR30sCisgICAgeyJUSU9DTV9STkciLCBUSU9DTV9STkd9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fUlRTCi0JeyJUSU9DTV9SVFMiLCBUSU9DTV9SVFN9LAorICAgIHsiVElPQ01fUlRTIiwgVElPQ01fUlRTfSwKICNlbmRpZgogI2lmZGVmIFRJT0NNX1NSCi0JeyJUSU9DTV9TUiIsIFRJT0NNX1NSfSwKKyAgICB7IlRJT0NNX1NSIiwgVElPQ01fU1J9LAogI2VuZGlmCiAjaWZkZWYgVElPQ01fU1QKLQl7IlRJT0NNX1NUIiwgVElPQ01fU1R9LAorICAgIHsiVElPQ01fU1QiLCBUSU9DTV9TVH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DTk9UVFkKLQl7IlRJT0NOT1RUWSIsIFRJT0NOT1RUWX0sCisgICAgeyJUSU9DTk9UVFkiLCBUSU9DTk9UVFl9LAogI2VuZGlmCiAjaWZkZWYgVElPQ05YQ0wKLQl7IlRJT0NOWENMIiwgVElPQ05YQ0x9LAorICAgIHsiVElPQ05YQ0wiLCBUSU9DTlhDTH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DT1VUUQotCXsiVElPQ09VVFEiLCBUSU9DT1VUUX0sCisgICAgeyJUSU9DT1VUUSIsIFRJT0NPVVRRfSwKICNlbmRpZgogI2lmZGVmIFRJT0NQS1QKLQl7IlRJT0NQS1QiLCBUSU9DUEtUfSwKKyAgICB7IlRJT0NQS1QiLCBUSU9DUEtUfSwKICNlbmRpZgogI2lmZGVmIFRJT0NQS1RfREFUQQotCXsiVElPQ1BLVF9EQVRBIiwgVElPQ1BLVF9EQVRBfSwKKyAgICB7IlRJT0NQS1RfREFUQSIsIFRJT0NQS1RfREFUQX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DUEtUX0RPU1RPUAotCXsiVElPQ1BLVF9ET1NUT1AiLCBUSU9DUEtUX0RPU1RPUH0sCisgICAgeyJUSU9DUEtUX0RPU1RPUCIsIFRJT0NQS1RfRE9TVE9QfSwKICNlbmRpZgogI2lmZGVmIFRJT0NQS1RfRkxVU0hSRUFECi0JeyJUSU9DUEtUX0ZMVVNIUkVBRCIsIFRJT0NQS1RfRkxVU0hSRUFEfSwKKyAgICB7IlRJT0NQS1RfRkxVU0hSRUFEIiwgVElPQ1BLVF9GTFVTSFJFQUR9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1BLVF9GTFVTSFdSSVRFCi0JeyJUSU9DUEtUX0ZMVVNIV1JJVEUiLCBUSU9DUEtUX0ZMVVNIV1JJVEV9LAorICAgIHsiVElPQ1BLVF9GTFVTSFdSSVRFIiwgVElPQ1BLVF9GTFVTSFdSSVRFfSwKICNlbmRpZgogI2lmZGVmIFRJT0NQS1RfTk9TVE9QCi0JeyJUSU9DUEtUX05PU1RPUCIsIFRJT0NQS1RfTk9TVE9QfSwKKyAgICB7IlRJT0NQS1RfTk9TVE9QIiwgVElPQ1BLVF9OT1NUT1B9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1BLVF9TVEFSVAotCXsiVElPQ1BLVF9TVEFSVCIsIFRJT0NQS1RfU1RBUlR9LAorICAgIHsiVElPQ1BLVF9TVEFSVCIsIFRJT0NQS1RfU1RBUlR9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1BLVF9TVE9QCi0JeyJUSU9DUEtUX1NUT1AiLCBUSU9DUEtUX1NUT1B9LAorICAgIHsiVElPQ1BLVF9TVE9QIiwgVElPQ1BLVF9TVE9QfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTQ1RUWQotCXsiVElPQ1NDVFRZIiwgVElPQ1NDVFRZfSwKKyAgICB7IlRJT0NTQ1RUWSIsIFRJT0NTQ1RUWX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0VSQ09ORklHCi0JeyJUSU9DU0VSQ09ORklHIiwgVElPQ1NFUkNPTkZJR30sCisgICAgeyJUSU9DU0VSQ09ORklHIiwgVElPQ1NFUkNPTkZJR30sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0VSR0VUTFNSCi0JeyJUSU9DU0VSR0VUTFNSIiwgVElPQ1NFUkdFVExTUn0sCisgICAgeyJUSU9DU0VSR0VUTFNSIiwgVElPQ1NFUkdFVExTUn0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0VSR0VUTVVMVEkKLQl7IlRJT0NTRVJHRVRNVUxUSSIsIFRJT0NTRVJHRVRNVUxUSX0sCisgICAgeyJUSU9DU0VSR0VUTVVMVEkiLCBUSU9DU0VSR0VUTVVMVEl9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NFUkdTVFJVQ1QKLQl7IlRJT0NTRVJHU1RSVUNUIiwgVElPQ1NFUkdTVFJVQ1R9LAorICAgIHsiVElPQ1NFUkdTVFJVQ1QiLCBUSU9DU0VSR1NUUlVDVH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0VSR1dJTEQKLQl7IlRJT0NTRVJHV0lMRCIsIFRJT0NTRVJHV0lMRH0sCisgICAgeyJUSU9DU0VSR1dJTEQiLCBUSU9DU0VSR1dJTER9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NFUlNFVE1VTFRJCi0JeyJUSU9DU0VSU0VUTVVMVEkiLCBUSU9DU0VSU0VUTVVMVEl9LAorICAgIHsiVElPQ1NFUlNFVE1VTFRJIiwgVElPQ1NFUlNFVE1VTFRJfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTRVJTV0lMRAotCXsiVElPQ1NFUlNXSUxEIiwgVElPQ1NFUlNXSUxEfSwKKyAgICB7IlRJT0NTRVJTV0lMRCIsIFRJT0NTRVJTV0lMRH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0VSX1RFTVQKLQl7IlRJT0NTRVJfVEVNVCIsIFRJT0NTRVJfVEVNVH0sCisgICAgeyJUSU9DU0VSX1RFTVQiLCBUSU9DU0VSX1RFTVR9LAogI2VuZGlmCiAjaWZkZWYgVElPQ1NFVEQKLQl7IlRJT0NTRVREIiwgVElPQ1NFVER9LAorICAgIHsiVElPQ1NFVEQiLCBUSU9DU0VURH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU0xDS1RSTUlPUwotCXsiVElPQ1NMQ0tUUk1JT1MiLCBUSU9DU0xDS1RSTUlPU30sCisgICAgeyJUSU9DU0xDS1RSTUlPUyIsIFRJT0NTTENLVFJNSU9TfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTUEdSUAotCXsiVElPQ1NQR1JQIiwgVElPQ1NQR1JQfSwKKyAgICB7IlRJT0NTUEdSUCIsIFRJT0NTUEdSUH0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU1NFUklBTAotCXsiVElPQ1NTRVJJQUwiLCBUSU9DU1NFUklBTH0sCisgICAgeyJUSU9DU1NFUklBTCIsIFRJT0NTU0VSSUFMfSwKICNlbmRpZgogI2lmZGVmIFRJT0NTU09GVENBUgotCXsiVElPQ1NTT0ZUQ0FSIiwgVElPQ1NTT0ZUQ0FSfSwKKyAgICB7IlRJT0NTU09GVENBUiIsIFRJT0NTU09GVENBUn0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU1RJCi0JeyJUSU9DU1RJIiwgVElPQ1NUSX0sCisgICAgeyJUSU9DU1RJIiwgVElPQ1NUSX0sCiAjZW5kaWYKICNpZmRlZiBUSU9DU1dJTlNaCi0JeyJUSU9DU1dJTlNaIiwgVElPQ1NXSU5TWn0sCisgICAgeyJUSU9DU1dJTlNaIiwgVElPQ1NXSU5TWn0sCiAjZW5kaWYKICNpZmRlZiBUSU9DVFRZR1NUUlVDVAotCXsiVElPQ1RUWUdTVFJVQ1QiLCBUSU9DVFRZR1NUUlVDVH0sCisgICAgeyJUSU9DVFRZR1NUUlVDVCIsIFRJT0NUVFlHU1RSVUNUfSwKICNlbmRpZgogCi0JLyogc2VudGluZWwgKi8KLQl7TlVMTCwgMH0KKyAgICAvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAwfQogfTsKIAogCiBQeU1PRElOSVRfRlVOQwogUHlJbml0X3Rlcm1pb3Modm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlzdHJ1Y3QgY29uc3RhbnQgKmNvbnN0YW50ID0gdGVybWlvc19jb25zdGFudHM7CisgICAgUHlPYmplY3QgKm07CisgICAgc3RydWN0IGNvbnN0YW50ICpjb25zdGFudCA9IHRlcm1pb3NfY29uc3RhbnRzOwogCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJ0ZXJtaW9zIiwgdGVybWlvc19tZXRob2RzLCB0ZXJtaW9zX19kb2NfXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgidGVybWlvcyIsIHRlcm1pb3NfbWV0aG9kcywgdGVybWlvc19fZG9jX18sCisgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKU5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFRlcm1pb3NFcnJvciA9PSBOVUxMKSB7Ci0JCVRlcm1pb3NFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigidGVybWlvcy5lcnJvciIsIE5VTEwsIE5VTEwpOwotCX0KLQlQeV9JTkNSRUYoVGVybWlvc0Vycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgVGVybWlvc0Vycm9yKTsKKyAgICBpZiAoVGVybWlvc0Vycm9yID09IE5VTEwpIHsKKyAgICAgICAgVGVybWlvc0Vycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJ0ZXJtaW9zLmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgfQorICAgIFB5X0lOQ1JFRihUZXJtaW9zRXJyb3IpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBUZXJtaW9zRXJyb3IpOwogCi0Jd2hpbGUgKGNvbnN0YW50LT5uYW1lICE9IE5VTEwpIHsKLQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgY29uc3RhbnQtPm5hbWUsIGNvbnN0YW50LT52YWx1ZSk7Ci0JCSsrY29uc3RhbnQ7Ci0JfQorICAgIHdoaWxlIChjb25zdGFudC0+bmFtZSAhPSBOVUxMKSB7CisgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sIGNvbnN0YW50LT5uYW1lLCBjb25zdGFudC0+dmFsdWUpOworICAgICAgICArK2NvbnN0YW50OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvdGVzdGNhcGlfbG9uZy5oIGIvTW9kdWxlcy90ZXN0Y2FwaV9sb25nLmgKaW5kZXggOGVkNmIwMi4uZDliNjY2MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy90ZXN0Y2FwaV9sb25nLmgKKysrIGIvTW9kdWxlcy90ZXN0Y2FwaV9sb25nLmgKQEAgLTEsMTY2ICsxLDE2NiBAQAogLyogUG9vci1tYW4ncyB0ZW1wbGF0ZS4gIE1hY3JvcyB1c2VkOgotICAgVEVTVE5BTUUJbmFtZSBvZiB0aGUgdGVzdCAobGlrZSB0ZXN0X2xvbmdfYXBpX2lubmVyKQotICAgVFlQRU5BTUUJdGhlIHNpZ25lZCB0eXBlIChsaWtlIGxvbmcpCi0gICBGX1NfVE9fUFkJY29udmVydCBzaWduZWQgdG8gcHlsb25nOyBUWVBFTkFNRSAtPiBQeU9iamVjdCoKLSAgIEZfUFlfVE9fUwljb252ZXJ0IHB5bG9uZyB0byBzaWduZWQ7IFB5T2JqZWN0KiAtPiBUWVBFTkFNRQotICAgRl9VX1RPX1BZCWNvbnZlcnQgdW5zaWduZWQgdG8gcHlsb25nOyB1bnNpZ25lZCBUWVBFTkFNRSAtPiBQeU9iamVjdCoKKyAgIFRFU1ROQU1FICAgICBuYW1lIG9mIHRoZSB0ZXN0IChsaWtlIHRlc3RfbG9uZ19hcGlfaW5uZXIpCisgICBUWVBFTkFNRSAgICAgdGhlIHNpZ25lZCB0eXBlIChsaWtlIGxvbmcpCisgICBGX1NfVE9fUFkgICAgY29udmVydCBzaWduZWQgdG8gcHlsb25nOyBUWVBFTkFNRSAtPiBQeU9iamVjdCoKKyAgIEZfUFlfVE9fUyAgICBjb252ZXJ0IHB5bG9uZyB0byBzaWduZWQ7IFB5T2JqZWN0KiAtPiBUWVBFTkFNRQorICAgRl9VX1RPX1BZICAgIGNvbnZlcnQgdW5zaWduZWQgdG8gcHlsb25nOyB1bnNpZ25lZCBUWVBFTkFNRSAtPiBQeU9iamVjdCoKICAgIEZfUFlfVE9fVSAgICBjb252ZXJ0IHB5bG9uZyB0byB1bnNpZ25lZDsgUHlPYmplY3QqIC0+IHVuc2lnbmVkIFRZUEVOQU1FCiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogVEVTVE5BTUUoUHlPYmplY3QgKmVycm9yKGNvbnN0IGNoYXIqKSkKIHsKLQljb25zdCBpbnQgTkJJVFMgPSBzaXplb2YoVFlQRU5BTUUpICogODsKLQl1bnNpZ25lZCBUWVBFTkFNRSBiYXNlOwotCVB5T2JqZWN0ICpweXJlc3VsdDsKLQlpbnQgaTsKKyAgICBjb25zdCBpbnQgTkJJVFMgPSBzaXplb2YoVFlQRU5BTUUpICogODsKKyAgICB1bnNpZ25lZCBUWVBFTkFNRSBiYXNlOworICAgIFB5T2JqZWN0ICpweXJlc3VsdDsKKyAgICBpbnQgaTsKIAotCS8qIE5vdGU6ICBUaGlzIHRlc3QgbGV0cyBQeU9iamVjdHMgbGVhayBpZiBhbiBlcnJvciBpcyByYWlzZWQuICBTaW5jZQotCSAgIGFuIGVycm9yIHNob3VsZCBuZXZlciBiZSByYWlzZWQsIGxlYWtzIGFyZSBpbXBvc3NpYmxlIDx3aW5rPi4gKi8KKyAgICAvKiBOb3RlOiAgVGhpcyB0ZXN0IGxldHMgUHlPYmplY3RzIGxlYWsgaWYgYW4gZXJyb3IgaXMgcmFpc2VkLiAgU2luY2UKKyAgICAgICBhbiBlcnJvciBzaG91bGQgbmV2ZXIgYmUgcmFpc2VkLCBsZWFrcyBhcmUgaW1wb3NzaWJsZSA8d2luaz4uICovCiAKLQkvKiBUZXN0IG5hdGl2ZSAtPiBQeUxvbmcgLT4gbmF0aXZlIHJvdW5kdHJpcCBpZGVudGl0eS4KLQkgKiBHZW5lcmF0ZSBhbGwgcG93ZXJzIG9mIDIsIGFuZCB0ZXN0IHRoZW0gYW5kIHRoZWlyIG5lZ2F0aW9ucywKLQkgKiBwbHVzIHRoZSBudW1iZXJzICstMSBvZmYgZnJvbSB0aGVtLgotCSAqLwotCWJhc2UgPSAxOwotCWZvciAoaSA9IDA7Ci0JICAgICBpIDwgTkJJVFMgKyAxOyAgLyogb24gbGFzdCwgYmFzZSBvdmVyZmxvd3MgdG8gMCAqLwotCSAgICAgKytpLCBiYXNlIDw8PSAxKQotCXsKLQkJaW50IGo7Ci0JCWZvciAoaiA9IDA7IGogPCA2OyArK2opIHsKLQkJCVRZUEVOQU1FIGluLCBvdXQ7Ci0JCQl1bnNpZ25lZCBUWVBFTkFNRSB1aW4sIHVvdXQ7CisgICAgLyogVGVzdCBuYXRpdmUgLT4gUHlMb25nIC0+IG5hdGl2ZSByb3VuZHRyaXAgaWRlbnRpdHkuCisgICAgICogR2VuZXJhdGUgYWxsIHBvd2VycyBvZiAyLCBhbmQgdGVzdCB0aGVtIGFuZCB0aGVpciBuZWdhdGlvbnMsCisgICAgICogcGx1cyB0aGUgbnVtYmVycyArLTEgb2ZmIGZyb20gdGhlbS4KKyAgICAgKi8KKyAgICBiYXNlID0gMTsKKyAgICBmb3IgKGkgPSAwOworICAgICAgICAgaSA8IE5CSVRTICsgMTsgIC8qIG9uIGxhc3QsIGJhc2Ugb3ZlcmZsb3dzIHRvIDAgKi8KKyAgICAgICAgICsraSwgYmFzZSA8PD0gMSkKKyAgICB7CisgICAgICAgIGludCBqOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjsgKytqKSB7CisgICAgICAgICAgICBUWVBFTkFNRSBpbiwgb3V0OworICAgICAgICAgICAgdW5zaWduZWQgVFlQRU5BTUUgdWluLCB1b3V0OwogCi0JCQkvKiBGb3IgMCwgMSwgMiB1c2UgYmFzZTsgZm9yIDMsIDQsIDUgdXNlIC1iYXNlICovCi0JCQl1aW4gPSBqIDwgMyA/IGJhc2UKLQkJCQkgICAgOiAodW5zaWduZWQgVFlQRU5BTUUpKC0oVFlQRU5BTUUpYmFzZSk7CisgICAgICAgICAgICAvKiBGb3IgMCwgMSwgMiB1c2UgYmFzZTsgZm9yIDMsIDQsIDUgdXNlIC1iYXNlICovCisgICAgICAgICAgICB1aW4gPSBqIDwgMyA/IGJhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKHVuc2lnbmVkIFRZUEVOQU1FKSgtKFRZUEVOQU1FKWJhc2UpOwogCi0JCQkvKiBGb3IgMCAmIDMsIHN1YnRyYWN0IDEuCi0JCQkgKiBGb3IgMSAmIDQsIGxlYXZlIGFsb25lLgotCQkJICogRm9yIDIgJiA1LCBhZGQgMS4KLQkJCSAqLwotCQkJdWluICs9ICh1bnNpZ25lZCBUWVBFTkFNRSkoVFlQRU5BTUUpKGogJSAzIC0gMSk7CisgICAgICAgICAgICAvKiBGb3IgMCAmIDMsIHN1YnRyYWN0IDEuCisgICAgICAgICAgICAgKiBGb3IgMSAmIDQsIGxlYXZlIGFsb25lLgorICAgICAgICAgICAgICogRm9yIDIgJiA1LCBhZGQgMS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdWluICs9ICh1bnNpZ25lZCBUWVBFTkFNRSkoVFlQRU5BTUUpKGogJSAzIC0gMSk7CiAKLQkJCXB5cmVzdWx0ID0gRl9VX1RPX1BZKHVpbik7Ci0JCQlpZiAocHlyZXN1bHQgPT0gTlVMTCkKLQkJCQlyZXR1cm4gZXJyb3IoCi0JCQkJICJ1bnNpZ25lZCB1bmV4cGVjdGVkIG51bGwgcmVzdWx0Iik7CisgICAgICAgICAgICBweXJlc3VsdCA9IEZfVV9UT19QWSh1aW4pOworICAgICAgICAgICAgaWYgKHB5cmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICAidW5zaWduZWQgdW5leHBlY3RlZCBudWxsIHJlc3VsdCIpOwogCi0JCQl1b3V0ID0gRl9QWV9UT19VKHB5cmVzdWx0KTsKLQkJCWlmICh1b3V0ID09ICh1bnNpZ25lZCBUWVBFTkFNRSktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiBlcnJvcigKLQkJCQkJInVuc2lnbmVkIHVuZXhwZWN0ZWQgLTEgcmVzdWx0Iik7Ci0JCQlpZiAodW91dCAhPSB1aW4pCi0JCQkJcmV0dXJuIGVycm9yKAotCQkJCQkidW5zaWduZWQgb3V0cHV0ICE9IGlucHV0Iik7Ci0JCQlVTkJJTkQocHlyZXN1bHQpOworICAgICAgICAgICAgdW91dCA9IEZfUFlfVE9fVShweXJlc3VsdCk7CisgICAgICAgICAgICBpZiAodW91dCA9PSAodW5zaWduZWQgVFlQRU5BTUUpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJ1bnNpZ25lZCB1bmV4cGVjdGVkIC0xIHJlc3VsdCIpOworICAgICAgICAgICAgaWYgKHVvdXQgIT0gdWluKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAgICAgInVuc2lnbmVkIG91dHB1dCAhPSBpbnB1dCIpOworICAgICAgICAgICAgVU5CSU5EKHB5cmVzdWx0KTsKIAotCQkJaW4gPSAoVFlQRU5BTUUpdWluOwotCQkJcHlyZXN1bHQgPSBGX1NfVE9fUFkoaW4pOwotCQkJaWYgKHB5cmVzdWx0ID09IE5VTEwpCi0JCQkJcmV0dXJuIGVycm9yKAotCQkJCQkic2lnbmVkIHVuZXhwZWN0ZWQgbnVsbCByZXN1bHQiKTsKKyAgICAgICAgICAgIGluID0gKFRZUEVOQU1FKXVpbjsKKyAgICAgICAgICAgIHB5cmVzdWx0ID0gRl9TX1RPX1BZKGluKTsKKyAgICAgICAgICAgIGlmIChweXJlc3VsdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAgICAgInNpZ25lZCB1bmV4cGVjdGVkIG51bGwgcmVzdWx0Iik7CiAKLQkJCW91dCA9IEZfUFlfVE9fUyhweXJlc3VsdCk7Ci0JCQlpZiAob3V0ID09IChUWVBFTkFNRSktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiBlcnJvcigKLQkJCQkJInNpZ25lZCB1bmV4cGVjdGVkIC0xIHJlc3VsdCIpOwotCQkJaWYgKG91dCAhPSBpbikKLQkJCQlyZXR1cm4gZXJyb3IoCi0JCQkJCSJzaWduZWQgb3V0cHV0ICE9IGlucHV0Iik7Ci0JCQlVTkJJTkQocHlyZXN1bHQpOwotCQl9Ci0JfQorICAgICAgICAgICAgb3V0ID0gRl9QWV9UT19TKHB5cmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChvdXQgPT0gKFRZUEVOQU1FKS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICAgICAic2lnbmVkIHVuZXhwZWN0ZWQgLTEgcmVzdWx0Iik7CisgICAgICAgICAgICBpZiAob3V0ICE9IGluKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAgICAgInNpZ25lZCBvdXRwdXQgIT0gaW5wdXQiKTsKKyAgICAgICAgICAgIFVOQklORChweXJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBPdmVyZmxvdyB0ZXN0cy4gIFRoZSBsb29wIGFib3ZlIGVuc3VyZWQgdGhhdCBhbGwgbGltaXQgY2FzZXMgdGhhdAotCSAqIHNob3VsZCBub3Qgb3ZlcmZsb3cgZG9uJ3Qgb3ZlcmZsb3csIHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGhlcmUgaXMKLQkgKiBwcm92b2tlIG9uZS1vdmVyLXRoZS1saW1pdCBjYXNlcyAobm90IGV4aGF1c3RpdmUsIGJ1dCBzaGFycCkuCi0JICovCi0JewotCQlQeU9iamVjdCAqb25lLCAqeCwgKnk7Ci0JCVRZUEVOQU1FIG91dDsKLQkJdW5zaWduZWQgVFlQRU5BTUUgdW91dDsKKyAgICAvKiBPdmVyZmxvdyB0ZXN0cy4gIFRoZSBsb29wIGFib3ZlIGVuc3VyZWQgdGhhdCBhbGwgbGltaXQgY2FzZXMgdGhhdAorICAgICAqIHNob3VsZCBub3Qgb3ZlcmZsb3cgZG9uJ3Qgb3ZlcmZsb3csIHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGhlcmUgaXMKKyAgICAgKiBwcm92b2tlIG9uZS1vdmVyLXRoZS1saW1pdCBjYXNlcyAobm90IGV4aGF1c3RpdmUsIGJ1dCBzaGFycCkuCisgICAgICovCisgICAgeworICAgICAgICBQeU9iamVjdCAqb25lLCAqeCwgKnk7CisgICAgICAgIFRZUEVOQU1FIG91dDsKKyAgICAgICAgdW5zaWduZWQgVFlQRU5BTUUgdW91dDsKIAotCQlvbmUgPSBQeUxvbmdfRnJvbUxvbmcoMSk7Ci0JCWlmIChvbmUgPT0gTlVMTCkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkidW5leHBlY3RlZCBOVUxMIGZyb20gUHlMb25nX0Zyb21Mb25nIik7CisgICAgICAgIG9uZSA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKKyAgICAgICAgaWYgKG9uZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeUxvbmdfRnJvbUxvbmciKTsKIAotCQkvKiBVbnNpZ25lZCBjb21wbGFpbnMgYWJvdXQgLTE/ICovCi0JCXggPSBQeU51bWJlcl9OZWdhdGl2ZShvbmUpOwotCQlpZiAoeCA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9OZWdhdGl2ZSIpOworICAgICAgICAvKiBVbnNpZ25lZCBjb21wbGFpbnMgYWJvdXQgLTE/ICovCisgICAgICAgIHggPSBQeU51bWJlcl9OZWdhdGl2ZShvbmUpOworICAgICAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9OZWdhdGl2ZSIpOwogCi0JCXVvdXQgPSBGX1BZX1RPX1UoeCk7Ci0JCWlmICh1b3V0ICE9ICh1bnNpZ25lZCBUWVBFTkFNRSktMSB8fCAhUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkiUHlMb25nX0FzVW5zaWduZWRYWFgoLTEpIGRpZG4ndCBjb21wbGFpbiIpOwotCQlQeUVycl9DbGVhcigpOwotCQlVTkJJTkQoeCk7CisgICAgICAgIHVvdXQgPSBGX1BZX1RPX1UoeCk7CisgICAgICAgIGlmICh1b3V0ICE9ICh1bnNpZ25lZCBUWVBFTkFNRSktMSB8fCAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAiUHlMb25nX0FzVW5zaWduZWRYWFgoLTEpIGRpZG4ndCBjb21wbGFpbiIpOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBVTkJJTkQoeCk7CiAKLQkJLyogVW5zaWduZWQgY29tcGxhaW5zIGFib3V0IDIqKk5CSVRTPyAqLwotCQl5ID0gUHlMb25nX0Zyb21Mb25nKChsb25nKU5CSVRTKTsKLQkJaWYgKHkgPT0gTlVMTCkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkidW5leHBlY3RlZCBOVUxMIGZyb20gUHlMb25nX0Zyb21Mb25nIik7CisgICAgICAgIC8qIFVuc2lnbmVkIGNvbXBsYWlucyBhYm91dCAyKipOQklUUz8gKi8KKyAgICAgICAgeSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylOQklUUyk7CisgICAgICAgIGlmICh5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TG9uZ19Gcm9tTG9uZyIpOwogCi0JCXggPSBQeU51bWJlcl9Mc2hpZnQob25lLCB5KTsgLyogMUwgPDwgTkJJVFMsID09IDIqKk5CSVRTICovCi0JCVVOQklORCh5KTsKLQkJaWYgKHggPT0gTlVMTCkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkidW5leHBlY3RlZCBOVUxMIGZyb20gUHlOdW1iZXJfTHNoaWZ0Iik7CisgICAgICAgIHggPSBQeU51bWJlcl9Mc2hpZnQob25lLCB5KTsgLyogMUwgPDwgTkJJVFMsID09IDIqKk5CSVRTICovCisgICAgICAgIFVOQklORCh5KTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigKKyAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBOVUxMIGZyb20gUHlOdW1iZXJfTHNoaWZ0Iik7CiAKLSAgCQl1b3V0ID0gRl9QWV9UT19VKHgpOwotCQlpZiAodW91dCAhPSAodW5zaWduZWQgVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJIlB5TG9uZ19Bc1Vuc2lnbmVkWFhYKDIqKk5CSVRTKSBkaWRuJ3QgIgotCQkJCSJjb21wbGFpbiIpOwotCQlQeUVycl9DbGVhcigpOworICAgICAgICB1b3V0ID0gRl9QWV9UT19VKHgpOworICAgICAgICBpZiAodW91dCAhPSAodW5zaWduZWQgVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkWFhYKDIqKk5CSVRTKSBkaWRuJ3QgIgorICAgICAgICAgICAgICAgICJjb21wbGFpbiIpOworICAgICAgICBQeUVycl9DbGVhcigpOwogCi0JCS8qIFNpZ25lZCBjb21wbGFpbnMgYWJvdXQgMioqKE5CSVRTLTEpPwotCQkgICB4IHN0aWxsIGhhcyAyKipOQklUUy4gKi8KLQkJeSA9IFB5TnVtYmVyX1JzaGlmdCh4LCBvbmUpOyAvKiAyKiooTkJJVFMtMSkgKi8KLQkJVU5CSU5EKHgpOwotCQlpZiAoeSA9PSBOVUxMKQotCQkJcmV0dXJuIGVycm9yKAotCQkJCSJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9Sc2hpZnQiKTsKKyAgICAgICAgLyogU2lnbmVkIGNvbXBsYWlucyBhYm91dCAyKiooTkJJVFMtMSk/CisgICAgICAgICAgIHggc3RpbGwgaGFzIDIqKk5CSVRTLiAqLworICAgICAgICB5ID0gUHlOdW1iZXJfUnNoaWZ0KHgsIG9uZSk7IC8qIDIqKihOQklUUy0xKSAqLworICAgICAgICBVTkJJTkQoeCk7CisgICAgICAgIGlmICh5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TnVtYmVyX1JzaGlmdCIpOwogCi0JCW91dCA9IEZfUFlfVE9fUyh5KTsKLQkJaWYgKG91dCAhPSAoVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJIlB5TG9uZ19Bc1hYWCgyKiooTkJJVFMtMSkpIGRpZG4ndCAiCi0JCQkJImNvbXBsYWluIik7Ci0JCVB5RXJyX0NsZWFyKCk7CisgICAgICAgIG91dCA9IEZfUFlfVE9fUyh5KTsKKyAgICAgICAgaWYgKG91dCAhPSAoVFlQRU5BTUUpLTEgfHwgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgIlB5TG9uZ19Bc1hYWCgyKiooTkJJVFMtMSkpIGRpZG4ndCAiCisgICAgICAgICAgICAgICAgImNvbXBsYWluIik7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAKLQkJLyogU2lnbmVkIGNvbXBsYWlucyBhYm91dCAtMioqKE5CSVRTLTEpLTE/OwotCQkgICB5IHN0aWxsIGhhcyAyKiooTkJJVFMtMSkuICovCi0JCXggPSBQeU51bWJlcl9OZWdhdGl2ZSh5KTsgIC8qIC0oMioqKE5CSVRTLTEpKSAqLwotCQlVTkJJTkQoeSk7Ci0JCWlmICh4ID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TnVtYmVyX05lZ2F0aXZlIik7CisgICAgICAgIC8qIFNpZ25lZCBjb21wbGFpbnMgYWJvdXQgLTIqKihOQklUUy0xKS0xPzsKKyAgICAgICAgICAgeSBzdGlsbCBoYXMgMioqKE5CSVRTLTEpLiAqLworICAgICAgICB4ID0gUHlOdW1iZXJfTmVnYXRpdmUoeSk7ICAvKiAtKDIqKihOQklUUy0xKSkgKi8KKyAgICAgICAgVU5CSU5EKHkpOworICAgICAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE5VTEwgZnJvbSBQeU51bWJlcl9OZWdhdGl2ZSIpOwogCi0JCXkgPSBQeU51bWJlcl9TdWJ0cmFjdCh4LCBvbmUpOyAvKiAtKDIqKihOQklUUy0xKSktMSAqLwotCQlVTkJJTkQoeCk7Ci0JCWlmICh5ID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyb3IoCi0JCQkJInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TnVtYmVyX1N1YnRyYWN0Iik7CisgICAgICAgIHkgPSBQeU51bWJlcl9TdWJ0cmFjdCh4LCBvbmUpOyAvKiAtKDIqKihOQklUUy0xKSktMSAqLworICAgICAgICBVTkJJTkQoeCk7CisgICAgICAgIGlmICh5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3IoCisgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgTlVMTCBmcm9tIFB5TnVtYmVyX1N1YnRyYWN0Iik7CiAKLQkJb3V0ID0gRl9QWV9UT19TKHkpOwotCQlpZiAob3V0ICE9IChUWVBFTkFNRSktMSB8fCAhUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBlcnJvcigKLQkJCQkiUHlMb25nX0FzWFhYKC0yKiooTkJJVFMtMSktMSkgZGlkbid0ICIKLQkJCQkiY29tcGxhaW4iKTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJVU5CSU5EKHkpOworICAgICAgICBvdXQgPSBGX1BZX1RPX1MoeSk7CisgICAgICAgIGlmIChvdXQgIT0gKFRZUEVOQU1FKS0xIHx8ICFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGVycm9yKAorICAgICAgICAgICAgICAgICJQeUxvbmdfQXNYWFgoLTIqKihOQklUUy0xKS0xKSBkaWRuJ3QgIgorICAgICAgICAgICAgICAgICJjb21wbGFpbiIpOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBVTkJJTkQoeSk7CiAKLQkJUHlfWERFQ1JFRih4KTsKLQkJUHlfWERFQ1JFRih5KTsKLQkJUHlfREVDUkVGKG9uZSk7Ci0JfQorICAgICAgICBQeV9YREVDUkVGKHgpOworICAgICAgICBQeV9YREVDUkVGKHkpOworICAgICAgICBQeV9ERUNSRUYob25lKTsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aHJlYWRtb2R1bGUuYyBiL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKaW5kZXggY2NkODhlMC4uZGUzNGFlMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy90aHJlYWRtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCkBAIC0xOCwzNiArMTgsMzYgQEAKIC8qIExvY2sgb2JqZWN0cyAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5VGhyZWFkX3R5cGVfbG9jayBsb2NrX2xvY2s7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrX2xvY2s7CiB9IGxvY2tvYmplY3Q7CiAKIHN0YXRpYyB2b2lkCiBsb2NrX2RlYWxsb2MobG9ja29iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+bG9ja19sb2NrICE9IE5VTEwpIHsKLQkJLyogVW5sb2NrIHRoZSBsb2NrIHNvIGl0J3Mgc2FmZSB0byBmcmVlIGl0ICovCi0JCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrX2xvY2ssIDApOwotCQlQeVRocmVhZF9yZWxlYXNlX2xvY2soc2VsZi0+bG9ja19sb2NrKTsKLQkJCi0JCVB5VGhyZWFkX2ZyZWVfbG9jayhzZWxmLT5sb2NrX2xvY2spOwotCX0KLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgaWYgKHNlbGYtPmxvY2tfbG9jayAhPSBOVUxMKSB7CisgICAgICAgIC8qIFVubG9jayB0aGUgbG9jayBzbyBpdCdzIHNhZmUgdG8gZnJlZSBpdCAqLworICAgICAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soc2VsZi0+bG9ja19sb2NrLCAwKTsKKyAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHNlbGYtPmxvY2tfbG9jayk7CisKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2tfbG9jayk7CisgICAgfQorICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvY2tfUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGxvY2tvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBpID0gMTsKKyAgICBpbnQgaSA9IDE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmFjcXVpcmUiLCAmaSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6YWNxdWlyZSIsICZpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JaSA9IFB5VGhyZWFkX2FjcXVpcmVfbG9jayhzZWxmLT5sb2NrX2xvY2ssIGkpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGkgPSBQeVRocmVhZF9hY3F1aXJlX2xvY2soc2VsZi0+bG9ja19sb2NrLCBpKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylpKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKWkpOwogfQogCiBQeURvY19TVFJWQVIoYWNxdWlyZV9kb2MsCkBAIC02NCwxNiArNjQsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NrX1B5VGhyZWFkX3JlbGVhc2VfbG9jayhsb2Nrb2JqZWN0ICpzZWxmKQogewotCS8qIFNhbml0eSBjaGVjazogdGhlIGxvY2sgbXVzdCBiZSBsb2NrZWQgKi8KLQlpZiAoUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHNlbGYtPmxvY2tfbG9jaywgMCkpIHsKLQkJUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHNlbGYtPmxvY2tfbG9jayk7Ci0JCVB5RXJyX1NldFN0cmluZyhUaHJlYWRFcnJvciwgInJlbGVhc2UgdW5sb2NrZWQgbG9jayIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogU2FuaXR5IGNoZWNrOiB0aGUgbG9jayBtdXN0IGJlIGxvY2tlZCAqLworICAgIGlmIChQeVRocmVhZF9hY3F1aXJlX2xvY2soc2VsZi0+bG9ja19sb2NrLCAwKSkgeworICAgICAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soc2VsZi0+bG9ja19sb2NrKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLCAicmVsZWFzZSB1bmxvY2tlZCBsb2NrIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhzZWxmLT5sb2NrX2xvY2spOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soc2VsZi0+bG9ja19sb2NrKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihyZWxlYXNlX2RvYywKQEAgLTg3LDExICs4NywxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxvY2tfbG9ja2VkX2xvY2sobG9ja29iamVjdCAqc2VsZikKIHsKLQlpZiAoUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHNlbGYtPmxvY2tfbG9jaywgMCkpIHsKLQkJUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHNlbGYtPmxvY2tfbG9jayk7Ci0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMEwpOwotCX0KLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDFMKTsKKyAgICBpZiAoUHlUaHJlYWRfYWNxdWlyZV9sb2NrKHNlbGYtPmxvY2tfbG9jaywgMCkpIHsKKyAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHNlbGYtPmxvY2tfbG9jayk7CisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMEwpOworICAgIH0KKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDFMKTsKIH0KIAogUHlEb2NfU1RSVkFSKGxvY2tlZF9kb2MsCkBAIC0xMDEsNTkgKzEwMSw1OSBAQAogUmV0dXJuIHdoZXRoZXIgdGhlIGxvY2sgaXMgaW4gdGhlIGxvY2tlZCBzdGF0ZS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGxvY2tfbWV0aG9kc1tdID0gewotCXsiYWNxdWlyZV9sb2NrIiwgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfYWNxdWlyZV9sb2NrLCAKLQkgTUVUSF9WQVJBUkdTLCBhY3F1aXJlX2RvY30sCi0JeyJhY3F1aXJlIiwgICAgICAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9hY3F1aXJlX2xvY2ssIAotCSBNRVRIX1ZBUkFSR1MsIGFjcXVpcmVfZG9jfSwKLQl7InJlbGVhc2VfbG9jayIsIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX3JlbGVhc2VfbG9jaywgCi0JIE1FVEhfTk9BUkdTLCByZWxlYXNlX2RvY30sCi0JeyJyZWxlYXNlIiwgICAgICAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2ssIAotCSBNRVRIX05PQVJHUywgcmVsZWFzZV9kb2N9LAotCXsibG9ja2VkX2xvY2siLCAgKFB5Q0Z1bmN0aW9uKWxvY2tfbG9ja2VkX2xvY2ssICAKLQkgTUVUSF9OT0FSR1MsIGxvY2tlZF9kb2N9LAotCXsibG9ja2VkIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfbG9ja2VkX2xvY2ssICAKLQkgTUVUSF9OT0FSR1MsIGxvY2tlZF9kb2N9LAotCXsiX19lbnRlcl9fIiwgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfYWNxdWlyZV9sb2NrLAotCSBNRVRIX1ZBUkFSR1MsIGFjcXVpcmVfZG9jfSwKLQl7Il9fZXhpdF9fIiwgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfcmVsZWFzZV9sb2NrLAotCSBNRVRIX1ZBUkFSR1MsIHJlbGVhc2VfZG9jfSwKLQl7TlVMTCwgICAgICAgICAgIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiYWNxdWlyZV9sb2NrIiwgKFB5Q0Z1bmN0aW9uKWxvY2tfUHlUaHJlYWRfYWNxdWlyZV9sb2NrLAorICAgICBNRVRIX1ZBUkFSR1MsIGFjcXVpcmVfZG9jfSwKKyAgICB7ImFjcXVpcmUiLCAgICAgIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jaywKKyAgICAgTUVUSF9WQVJBUkdTLCBhY3F1aXJlX2RvY30sCisgICAgeyJyZWxlYXNlX2xvY2siLCAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCByZWxlYXNlX2RvY30sCisgICAgeyJyZWxlYXNlIiwgICAgICAoUHlDRnVuY3Rpb24pbG9ja19QeVRocmVhZF9yZWxlYXNlX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCByZWxlYXNlX2RvY30sCisgICAgeyJsb2NrZWRfbG9jayIsICAoUHlDRnVuY3Rpb24pbG9ja19sb2NrZWRfbG9jaywKKyAgICAgTUVUSF9OT0FSR1MsIGxvY2tlZF9kb2N9LAorICAgIHsibG9ja2VkIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWxvY2tfbG9ja2VkX2xvY2ssCisgICAgIE1FVEhfTk9BUkdTLCBsb2NrZWRfZG9jfSwKKyAgICB7Il9fZW50ZXJfXyIsICAgIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX2FjcXVpcmVfbG9jaywKKyAgICAgTUVUSF9WQVJBUkdTLCBhY3F1aXJlX2RvY30sCisgICAgeyJfX2V4aXRfXyIsICAgIChQeUNGdW5jdGlvbilsb2NrX1B5VGhyZWFkX3JlbGVhc2VfbG9jaywKKyAgICAgTUVUSF9WQVJBUkdTLCByZWxlYXNlX2RvY30sCisgICAge05VTEwsICAgICAgICAgICBOVUxMfSAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NrX2dldGF0dHIobG9ja29iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChsb2NrX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGxvY2tfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTG9ja3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkidGhyZWFkLmxvY2siLAkJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKGxvY2tvYmplY3QpLAkJLyp0cF9zaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbG9ja19kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLwotCTAsCQkJCS8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYylsb2NrX2dldGF0dHIsCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJCS8qdHBfcmVwciovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAidGhyZWFkLmxvY2siLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIHNpemVvZihsb2Nrb2JqZWN0KSwgICAgICAgICAgICAgICAgIC8qdHBfc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWxvY2tfZGVhbGxvYywgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKWxvY2tfZ2V0YXR0ciwgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KIH07CiAKIHN0YXRpYyBsb2Nrb2JqZWN0ICoKIG5ld2xvY2tvYmplY3Qodm9pZCkKIHsKLQlsb2Nrb2JqZWN0ICpzZWxmOwotCXNlbGYgPSBQeU9iamVjdF9OZXcobG9ja29iamVjdCwgJkxvY2t0eXBlKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzZWxmLT5sb2NrX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKHNlbGYtPmxvY2tfbG9jayA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihzZWxmKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFRocmVhZEVycm9yLCAiY2FuJ3QgYWxsb2NhdGUgbG9jayIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHNlbGY7CisgICAgbG9ja29iamVjdCAqc2VsZjsKKyAgICBzZWxmID0gUHlPYmplY3RfTmV3KGxvY2tvYmplY3QsICZMb2NrdHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+bG9ja19sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgIGlmIChzZWxmLT5sb2NrX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhUaHJlYWRFcnJvciwgImNhbid0IGFsbG9jYXRlIGxvY2siKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiAvKiBUaHJlYWQtbG9jYWwgb2JqZWN0cyAqLwpAQCAtMTYxLDM1MSArMTYxLDM1MSBAQAogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICprZXk7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKmt3OwotCVB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICprdzsKKyAgICBQeU9iamVjdCAqZGljdDsKIH0gbG9jYWxvYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NhbF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCWxvY2Fsb2JqZWN0ICpzZWxmOwotCVB5T2JqZWN0ICp0ZGljdDsKKyAgICBsb2NhbG9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqdGRpY3Q7CiAKLQlpZiAodHlwZS0+dHBfaW5pdCA9PSBQeUJhc2VPYmplY3RfVHlwZS50cF9pbml0Ci0JICAgICYmICgoYXJncyAmJiBQeU9iamVjdF9Jc1RydWUoYXJncykpCi0JCXx8IChrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgIkluaXRpYWxpemF0aW9uIGFyZ3VtZW50cyBhcmUgbm90IHN1cHBvcnRlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2luaXQgPT0gUHlCYXNlT2JqZWN0X1R5cGUudHBfaW5pdAorICAgICAgICAmJiAoKGFyZ3MgJiYgUHlPYmplY3RfSXNUcnVlKGFyZ3MpKQorICAgICAgICB8fCAoa3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSkpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAiSW5pdGlhbGl6YXRpb24gYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNlbGYgPSAobG9jYWxvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzZWxmID0gKGxvY2Fsb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9YSU5DUkVGKGFyZ3MpOwotCXNlbGYtPmFyZ3MgPSBhcmdzOwotCVB5X1hJTkNSRUYoa3cpOwotCXNlbGYtPmt3ID0ga3c7Ci0Jc2VsZi0+ZGljdCA9IE5VTEw7CS8qIG1ha2luZyBzdXJlICovCi0Jc2VsZi0+a2V5ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgidGhyZWFkLmxvY2FsLiVwIiwgc2VsZik7Ci0JaWYgKHNlbGYtPmtleSA9PSBOVUxMKSAKLQkJZ290byBlcnI7CisgICAgUHlfWElOQ1JFRihhcmdzKTsKKyAgICBzZWxmLT5hcmdzID0gYXJnczsKKyAgICBQeV9YSU5DUkVGKGt3KTsKKyAgICBzZWxmLT5rdyA9IGt3OworICAgIHNlbGYtPmRpY3QgPSBOVUxMOyAgICAgICAgICAvKiBtYWtpbmcgc3VyZSAqLworICAgIHNlbGYtPmtleSA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInRocmVhZC5sb2NhbC4lcCIsIHNlbGYpOworICAgIGlmIChzZWxmLT5rZXkgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnI7CiAKLQlzZWxmLT5kaWN0ID0gUHlEaWN0X05ldygpOwotCWlmIChzZWxmLT5kaWN0ID09IE5VTEwpCi0JCWdvdG8gZXJyOworICAgIHNlbGYtPmRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKHNlbGYtPmRpY3QgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnI7CiAKLQl0ZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOwotCWlmICh0ZGljdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiQ291bGRuJ3QgZ2V0IHRocmVhZC1zdGF0ZSBkaWN0aW9uYXJ5Iik7Ci0JCWdvdG8gZXJyOwotCX0KKyAgICB0ZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIGlmICh0ZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBnZXQgdGhyZWFkLXN0YXRlIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQogCi0JaWYgKFB5RGljdF9TZXRJdGVtKHRkaWN0LCBzZWxmLT5rZXksIHNlbGYtPmRpY3QpIDwgMCkKLQkJZ290byBlcnI7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtKHRkaWN0LCBzZWxmLT5rZXksIHNlbGYtPmRpY3QpIDwgMCkKKyAgICAgICAgZ290byBlcnI7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIAogICBlcnI6Ci0JUHlfREVDUkVGKHNlbGYpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogbG9jYWxfdHJhdmVyc2UobG9jYWxvYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNlbGYtPmFyZ3MpOwotCVB5X1ZJU0lUKHNlbGYtPmt3KTsKLQlQeV9WSVNJVChzZWxmLT5kaWN0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChzZWxmLT5hcmdzKTsKKyAgICBQeV9WSVNJVChzZWxmLT5rdyk7CisgICAgUHlfVklTSVQoc2VsZi0+ZGljdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxvY2FsX2NsZWFyKGxvY2Fsb2JqZWN0ICpzZWxmKQogewotCVB5X0NMRUFSKHNlbGYtPmFyZ3MpOwotCVB5X0NMRUFSKHNlbGYtPmt3KTsKLQlQeV9DTEVBUihzZWxmLT5kaWN0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9DTEVBUihzZWxmLT5hcmdzKTsKKyAgICBQeV9DTEVBUihzZWxmLT5rdyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZGljdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBsb2NhbF9kZWFsbG9jKGxvY2Fsb2JqZWN0ICpzZWxmKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKLQlpZiAoc2VsZi0+a2V5Ci0JICAgICYmICh0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpKQotCSAgICAmJiB0c3RhdGUtPmludGVycCkgewotCQlmb3IodHN0YXRlID0gUHlJbnRlcnByZXRlclN0YXRlX1RocmVhZEhlYWQodHN0YXRlLT5pbnRlcnApOwotCQkgICAgdHN0YXRlOwotCQkgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9OZXh0KHRzdGF0ZSkpIAotCQkJaWYgKHRzdGF0ZS0+ZGljdCAmJgotCQkJICAgIFB5RGljdF9HZXRJdGVtKHRzdGF0ZS0+ZGljdCwgc2VsZi0+a2V5KSkKLQkJCQlQeURpY3RfRGVsSXRlbSh0c3RhdGUtPmRpY3QsIHNlbGYtPmtleSk7Ci0JfQorICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBpZiAoc2VsZi0+a2V5CisgICAgICAgICYmICh0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpKQorICAgICAgICAmJiB0c3RhdGUtPmludGVycCkgeworICAgICAgICBmb3IodHN0YXRlID0gUHlJbnRlcnByZXRlclN0YXRlX1RocmVhZEhlYWQodHN0YXRlLT5pbnRlcnApOworICAgICAgICAgICAgdHN0YXRlOworICAgICAgICAgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9OZXh0KHRzdGF0ZSkpCisgICAgICAgICAgICBpZiAodHN0YXRlLT5kaWN0ICYmCisgICAgICAgICAgICAgICAgUHlEaWN0X0dldEl0ZW0odHN0YXRlLT5kaWN0LCBzZWxmLT5rZXkpKQorICAgICAgICAgICAgICAgIFB5RGljdF9EZWxJdGVtKHRzdGF0ZS0+ZGljdCwgc2VsZi0+a2V5KTsKKyAgICB9CiAKLQlQeV9YREVDUkVGKHNlbGYtPmtleSk7Ci0JbG9jYWxfY2xlYXIoc2VsZik7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+a2V5KTsKKyAgICBsb2NhbF9jbGVhcihzZWxmKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfbGRpY3QobG9jYWxvYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKnRkaWN0LCAqbGRpY3Q7CisgICAgUHlPYmplY3QgKnRkaWN0LCAqbGRpY3Q7CiAKLQl0ZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOwotCWlmICh0ZGljdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiQ291bGRuJ3QgZ2V0IHRocmVhZC1zdGF0ZSBkaWN0aW9uYXJ5Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB0ZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOworICAgIGlmICh0ZGljdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBnZXQgdGhyZWFkLXN0YXRlIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbGRpY3QgPSBQeURpY3RfR2V0SXRlbSh0ZGljdCwgc2VsZi0+a2V5KTsKLQlpZiAobGRpY3QgPT0gTlVMTCkgewotCQlsZGljdCA9IFB5RGljdF9OZXcoKTsgLyogd2Ugb3duIGxkaWN0ICovCisgICAgbGRpY3QgPSBQeURpY3RfR2V0SXRlbSh0ZGljdCwgc2VsZi0+a2V5KTsKKyAgICBpZiAobGRpY3QgPT0gTlVMTCkgeworICAgICAgICBsZGljdCA9IFB5RGljdF9OZXcoKTsgLyogd2Ugb3duIGxkaWN0ICovCiAKLQkJaWYgKGxkaWN0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZWxzZSB7Ci0JCQlpbnQgaSA9IFB5RGljdF9TZXRJdGVtKHRkaWN0LCBzZWxmLT5rZXksIGxkaWN0KTsKLQkJCVB5X0RFQ1JFRihsZGljdCk7IC8qIG5vdyBsZGljdCBpcyBib3Jyb3dlZCAqLwotCQkJaWYgKGkgPCAwKSAKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBpZiAobGRpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBpID0gUHlEaWN0X1NldEl0ZW0odGRpY3QsIHNlbGYtPmtleSwgbGRpY3QpOworICAgICAgICAgICAgUHlfREVDUkVGKGxkaWN0KTsgLyogbm93IGxkaWN0IGlzIGJvcnJvd2VkICovCisgICAgICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlQeV9DTEVBUihzZWxmLT5kaWN0KTsKLQkJUHlfSU5DUkVGKGxkaWN0KTsKLQkJc2VsZi0+ZGljdCA9IGxkaWN0OyAvKiBzdGlsbCBib3Jyb3dlZCAqLworICAgICAgICBQeV9DTEVBUihzZWxmLT5kaWN0KTsKKyAgICAgICAgUHlfSU5DUkVGKGxkaWN0KTsKKyAgICAgICAgc2VsZi0+ZGljdCA9IGxkaWN0OyAvKiBzdGlsbCBib3Jyb3dlZCAqLwogCi0JCWlmIChQeV9UWVBFKHNlbGYpLT50cF9pbml0ICE9IFB5QmFzZU9iamVjdF9UeXBlLnRwX2luaXQgJiYKLQkJICAgIFB5X1RZUEUoc2VsZiktPnRwX2luaXQoKFB5T2JqZWN0KilzZWxmLCAKLQkJCQkJICAgc2VsZi0+YXJncywgc2VsZi0+a3cpIDwgMCkgewotCQkJLyogd2UgbmVlZCB0byBnZXQgcmlkIG9mIGxkaWN0IGZyb20gdGhyZWFkIHNvCi0JCQkgICB3ZSBjcmVhdGUgYSBuZXcgb25lIHRoZSBuZXh0IHRpbWUgd2UgZG8gYW4gYXR0cgotCQkJICAgYWNjZXMgKi8KLQkJCVB5RGljdF9EZWxJdGVtKHRkaWN0LCBzZWxmLT5rZXkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJCi0JfQorICAgICAgICBpZiAoUHlfVFlQRShzZWxmKS0+dHBfaW5pdCAhPSBQeUJhc2VPYmplY3RfVHlwZS50cF9pbml0ICYmCisgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9pbml0KChQeU9iamVjdCopc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+YXJncywgc2VsZi0+a3cpIDwgMCkgeworICAgICAgICAgICAgLyogd2UgbmVlZCB0byBnZXQgcmlkIG9mIGxkaWN0IGZyb20gdGhyZWFkIHNvCisgICAgICAgICAgICAgICB3ZSBjcmVhdGUgYSBuZXcgb25lIHRoZSBuZXh0IHRpbWUgd2UgZG8gYW4gYXR0cgorICAgICAgICAgICAgICAgYWNjZXMgKi8KKyAgICAgICAgICAgIFB5RGljdF9EZWxJdGVtKHRkaWN0LCBzZWxmLT5rZXkpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCS8qIFRoZSBjYWxsIHRvIHRwX2luaXQgYWJvdmUgbWF5IGhhdmUgY2F1c2VkIGFub3RoZXIgdGhyZWFkIHRvIHJ1bi4KLQkgICBJbnN0YWxsIG91ciBsZGljdCBhZ2Fpbi4gKi8KLQlpZiAoc2VsZi0+ZGljdCAhPSBsZGljdCkgewotCQlQeV9DTEVBUihzZWxmLT5kaWN0KTsKLQkJUHlfSU5DUkVGKGxkaWN0KTsKLQkJc2VsZi0+ZGljdCA9IGxkaWN0OwotCX0KKyAgICB9CiAKLQlyZXR1cm4gbGRpY3Q7CisgICAgLyogVGhlIGNhbGwgdG8gdHBfaW5pdCBhYm92ZSBtYXkgaGF2ZSBjYXVzZWQgYW5vdGhlciB0aHJlYWQgdG8gcnVuLgorICAgICAgIEluc3RhbGwgb3VyIGxkaWN0IGFnYWluLiAqLworICAgIGlmIChzZWxmLT5kaWN0ICE9IGxkaWN0KSB7CisgICAgICAgIFB5X0NMRUFSKHNlbGYtPmRpY3QpOworICAgICAgICBQeV9JTkNSRUYobGRpY3QpOworICAgICAgICBzZWxmLT5kaWN0ID0gbGRpY3Q7CisgICAgfQorCisgICAgcmV0dXJuIGxkaWN0OwogfQogCiBzdGF0aWMgaW50CiBsb2NhbF9zZXRhdHRybyhsb2NhbG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpsZGljdDsKLQkKLQlsZGljdCA9IF9sZGljdChzZWxmKTsKLQlpZiAobGRpY3QgPT0gTlVMTCkgCi0JCXJldHVybiAtMTsKKyAgICBQeU9iamVjdCAqbGRpY3Q7CiAKLQlyZXR1cm4gUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSwgdik7CisgICAgbGRpY3QgPSBfbGRpY3Qoc2VsZik7CisgICAgaWYgKGxkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiBQeU9iamVjdF9HZW5lcmljU2V0QXR0cigoUHlPYmplY3QgKilzZWxmLCBuYW1lLCB2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvY2FsX2dldGRpY3QobG9jYWxvYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaWYgKHNlbGYtPmRpY3QgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJfX2RpY3RfXyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPmRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJfX2RpY3RfXyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYoc2VsZi0+ZGljdCk7Ci0JcmV0dXJuIHNlbGYtPmRpY3Q7CisgICAgUHlfSU5DUkVGKHNlbGYtPmRpY3QpOworICAgIHJldHVybiBzZWxmLT5kaWN0OwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgbG9jYWxfZ2V0c2V0W10gPSB7Ci0JeyJfX2RpY3RfXyIsIChnZXR0ZXIpbG9jYWxfZ2V0ZGljdCwgKHNldHRlcilOVUxMLAotCSAiTG9jYWwtZGF0YSBkaWN0aW9uYXJ5IiwgTlVMTH0sCi0Je05VTEx9ICAvKiBTZW50aW5lbCAqLworICAgIHsiX19kaWN0X18iLCAoZ2V0dGVyKWxvY2FsX2dldGRpY3QsIChzZXR0ZXIpTlVMTCwKKyAgICAgIkxvY2FsLWRhdGEgZGljdGlvbmFyeSIsIE5VTEx9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqbG9jYWxfZ2V0YXR0cm8obG9jYWxvYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgbG9jYWx0eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCS8qIHRwX25hbWUgICAgICAgICAgICovICJ0aHJlYWQuX2xvY2FsIiwKLQkvKiB0cF9iYXNpY3NpemUgICAgICAqLyBzaXplb2YobG9jYWxvYmplY3QpLAotCS8qIHRwX2l0ZW1zaXplICAgICAgICovIDAsCi0JLyogdHBfZGVhbGxvYyAgICAgICAgKi8gKGRlc3RydWN0b3IpbG9jYWxfZGVhbGxvYywKLQkvKiB0cF9wcmludCAgICAgICAgICAqLyAwLAotCS8qIHRwX2dldGF0dHIgICAgICAgICovIDAsCi0JLyogdHBfc2V0YXR0ciAgICAgICAgKi8gMCwKLQkvKiB0cF9jb21wYXJlICAgICAgICAqLyAwLAotCS8qIHRwX3JlcHIgICAgICAgICAgICovIDAsCi0JLyogdHBfYXNfbnVtYmVyICAgICAgKi8gMCwKLQkvKiB0cF9hc19zZXF1ZW5jZSAgICAqLyAwLAotCS8qIHRwX2FzX21hcHBpbmcgICAgICovIDAsCi0JLyogdHBfaGFzaCAgICAgICAgICAgKi8gMCwKLQkvKiB0cF9jYWxsICAgICAgICAgICAqLyAwLAotCS8qIHRwX3N0ciAgICAgICAgICAgICovIDAsCi0JLyogdHBfZ2V0YXR0cm8gICAgICAgKi8gKGdldGF0dHJvZnVuYylsb2NhbF9nZXRhdHRybywKLQkvKiB0cF9zZXRhdHRybyAgICAgICAqLyAoc2V0YXR0cm9mdW5jKWxvY2FsX3NldGF0dHJvLAotCS8qIHRwX2FzX2J1ZmZlciAgICAgICovIDAsCi0JLyogdHBfZmxhZ3MgICAgICAgICAgKi8gUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwKLQkvKiB0cF9kb2MgICAgICAgICAgICAqLyAiVGhyZWFkLWxvY2FsIGRhdGEiLAotCS8qIHRwX3RyYXZlcnNlICAgICAgICovICh0cmF2ZXJzZXByb2MpbG9jYWxfdHJhdmVyc2UsCi0JLyogdHBfY2xlYXIgICAgICAgICAgKi8gKGlucXVpcnkpbG9jYWxfY2xlYXIsCi0JLyogdHBfcmljaGNvbXBhcmUgICAgKi8gMCwKLQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLyAwLAotCS8qIHRwX2l0ZXIgICAgICAgICAgICovIDAsCi0JLyogdHBfaXRlcm5leHQgICAgICAgKi8gMCwKLQkvKiB0cF9tZXRob2RzICAgICAgICAqLyAwLAotCS8qIHRwX21lbWJlcnMgICAgICAgICovIDAsCi0JLyogdHBfZ2V0c2V0ICAgICAgICAgKi8gbG9jYWxfZ2V0c2V0LAotCS8qIHRwX2Jhc2UgICAgICAgICAgICovIDAsCi0JLyogdHBfZGljdCAgICAgICAgICAgKi8gMCwgLyogaW50ZXJuYWwgdXNlICovCi0JLyogdHBfZGVzY3JfZ2V0ICAgICAgKi8gMCwKLQkvKiB0cF9kZXNjcl9zZXQgICAgICAqLyAwLAotCS8qIHRwX2RpY3RvZmZzZXQgICAgICovIG9mZnNldG9mKGxvY2Fsb2JqZWN0LCBkaWN0KSwKLQkvKiB0cF9pbml0ICAgICAgICAgICAqLyAwLAotCS8qIHRwX2FsbG9jICAgICAgICAgICovIDAsCi0JLyogdHBfbmV3ICAgICAgICAgICAgKi8gbG9jYWxfbmV3LAotCS8qIHRwX2ZyZWUgICAgICAgICAgICovIDAsIC8qIExvdy1sZXZlbCBmcmVlLW1lbSByb3V0aW5lICovCi0JLyogdHBfaXNfZ2MgICAgICAgICAgKi8gMCwgLyogRm9yIFB5T2JqZWN0X0lTX0dDICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgLyogdHBfbmFtZSAgICAgICAgICAgKi8gInRocmVhZC5fbG9jYWwiLAorICAgIC8qIHRwX2Jhc2ljc2l6ZSAgICAgICovIHNpemVvZihsb2NhbG9iamVjdCksCisgICAgLyogdHBfaXRlbXNpemUgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kZWFsbG9jICAgICAgICAqLyAoZGVzdHJ1Y3Rvcilsb2NhbF9kZWFsbG9jLAorICAgIC8qIHRwX3ByaW50ICAgICAgICAgICovIDAsCisgICAgLyogdHBfZ2V0YXR0ciAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9zZXRhdHRyICAgICAgICAqLyAwLAorICAgIC8qIHRwX2NvbXBhcmUgICAgICAgICovIDAsCisgICAgLyogdHBfcmVwciAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9hc19udW1iZXIgICAgICAqLyAwLAorICAgIC8qIHRwX2FzX3NlcXVlbmNlICAgICovIDAsCisgICAgLyogdHBfYXNfbWFwcGluZyAgICAgKi8gMCwKKyAgICAvKiB0cF9oYXNoICAgICAgICAgICAqLyAwLAorICAgIC8qIHRwX2NhbGwgICAgICAgICAgICovIDAsCisgICAgLyogdHBfc3RyICAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRhdHRybyAgICAgICAqLyAoZ2V0YXR0cm9mdW5jKWxvY2FsX2dldGF0dHJvLAorICAgIC8qIHRwX3NldGF0dHJvICAgICAgICovIChzZXRhdHRyb2Z1bmMpbG9jYWxfc2V0YXR0cm8sCisgICAgLyogdHBfYXNfYnVmZmVyICAgICAgKi8gMCwKKyAgICAvKiB0cF9mbGFncyAgICAgICAgICAqLyBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLAorICAgIC8qIHRwX2RvYyAgICAgICAgICAgICovICJUaHJlYWQtbG9jYWwgZGF0YSIsCisgICAgLyogdHBfdHJhdmVyc2UgICAgICAgKi8gKHRyYXZlcnNlcHJvYylsb2NhbF90cmF2ZXJzZSwKKyAgICAvKiB0cF9jbGVhciAgICAgICAgICAqLyAoaW5xdWlyeSlsb2NhbF9jbGVhciwKKyAgICAvKiB0cF9yaWNoY29tcGFyZSAgICAqLyAwLAorICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovIDAsCisgICAgLyogdHBfaXRlciAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9pdGVybmV4dCAgICAgICAqLyAwLAorICAgIC8qIHRwX21ldGhvZHMgICAgICAgICovIDAsCisgICAgLyogdHBfbWVtYmVycyAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9nZXRzZXQgICAgICAgICAqLyBsb2NhbF9nZXRzZXQsCisgICAgLyogdHBfYmFzZSAgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9kaWN0ICAgICAgICAgICAqLyAwLCAvKiBpbnRlcm5hbCB1c2UgKi8KKyAgICAvKiB0cF9kZXNjcl9nZXQgICAgICAqLyAwLAorICAgIC8qIHRwX2Rlc2NyX3NldCAgICAgICovIDAsCisgICAgLyogdHBfZGljdG9mZnNldCAgICAgKi8gb2Zmc2V0b2YobG9jYWxvYmplY3QsIGRpY3QpLAorICAgIC8qIHRwX2luaXQgICAgICAgICAgICovIDAsCisgICAgLyogdHBfYWxsb2MgICAgICAgICAgKi8gMCwKKyAgICAvKiB0cF9uZXcgICAgICAgICAgICAqLyBsb2NhbF9uZXcsCisgICAgLyogdHBfZnJlZSAgICAgICAgICAgKi8gMCwgLyogTG93LWxldmVsIGZyZWUtbWVtIHJvdXRpbmUgKi8KKyAgICAvKiB0cF9pc19nYyAgICAgICAgICAqLyAwLCAvKiBGb3IgUHlPYmplY3RfSVNfR0MgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2NhbF9nZXRhdHRybyhsb2NhbG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKmxkaWN0LCAqdmFsdWU7CisgICAgUHlPYmplY3QgKmxkaWN0LCAqdmFsdWU7CiAKLQlsZGljdCA9IF9sZGljdChzZWxmKTsKLQlpZiAobGRpY3QgPT0gTlVMTCkgCi0JCXJldHVybiBOVUxMOworICAgIGxkaWN0ID0gX2xkaWN0KHNlbGYpOworICAgIGlmIChsZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeV9UWVBFKHNlbGYpICE9ICZsb2NhbHR5cGUpCi0JCS8qIHVzZSBnZW5lcmljIGxvb2t1cCBmb3Igc3VidHlwZXMgKi8KLQkJcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIGlmIChQeV9UWVBFKHNlbGYpICE9ICZsb2NhbHR5cGUpCisgICAgICAgIC8qIHVzZSBnZW5lcmljIGxvb2t1cCBmb3Igc3VidHlwZXMgKi8KKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOwogCi0JLyogT3B0aW1pemF0aW9uOiBqdXN0IGxvb2sgaW4gZGljdCBvdXJzZWx2ZXMgKi8KLQl2YWx1ZSA9IFB5RGljdF9HZXRJdGVtKGxkaWN0LCBuYW1lKTsKLQlpZiAodmFsdWUgPT0gTlVMTCkgCi0JCS8qIEZhbGwgYmFjayBvbiBnZW5lcmljIHRvIGdldCBfX2NsYXNzX18gYW5kIF9fZGljdF9fICovCi0JCXJldHVybiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICAvKiBPcHRpbWl6YXRpb246IGp1c3QgbG9vayBpbiBkaWN0IG91cnNlbHZlcyAqLworICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW0obGRpY3QsIG5hbWUpOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAvKiBGYWxsIGJhY2sgb24gZ2VuZXJpYyB0byBnZXQgX19jbGFzc19fIGFuZCBfX2RpY3RfXyAqLworICAgICAgICByZXR1cm4gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiAKLQlQeV9JTkNSRUYodmFsdWUpOwotCXJldHVybiB2YWx1ZTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKIH0KIAogLyogTW9kdWxlIGZ1bmN0aW9ucyAqLwogCiBzdHJ1Y3QgYm9vdHN0YXRlIHsKLQlQeUludGVycHJldGVyU3RhdGUgKmludGVycDsKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqa2V5dzsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGU7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmtleXc7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwogfTsKIAogc3RhdGljIHZvaWQKIHRfYm9vdHN0cmFwKHZvaWQgKmJvb3RfcmF3KQogewotCXN0cnVjdCBib290c3RhdGUgKmJvb3QgPSAoc3RydWN0IGJvb3RzdGF0ZSAqKSBib290X3JhdzsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGU7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBzdHJ1Y3QgYm9vdHN0YXRlICpib290ID0gKHN0cnVjdCBib290c3RhdGUgKikgYm9vdF9yYXc7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQl0c3RhdGUgPSBib290LT50c3RhdGU7Ci0JdHN0YXRlLT50aHJlYWRfaWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7Ci0JX1B5VGhyZWFkU3RhdGVfSW5pdCh0c3RhdGUpOwotCVB5RXZhbF9BY3F1aXJlVGhyZWFkKHRzdGF0ZSk7Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoCi0JCWJvb3QtPmZ1bmMsIGJvb3QtPmFyZ3MsIGJvb3QtPmtleXcpOwotCWlmIChyZXMgPT0gTlVMTCkgewotCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWVsc2UgewotCQkJUHlPYmplY3QgKmZpbGU7Ci0JCQlQeVN5c19Xcml0ZVN0ZGVycigKLQkJCQkiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiB0aHJlYWQgc3RhcnRlZCBieSAiKTsKLQkJCWZpbGUgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOwotCQkJaWYgKGZpbGUpCi0JCQkJUHlGaWxlX1dyaXRlT2JqZWN0KGJvb3QtPmZ1bmMsIGZpbGUsIDApOwotCQkJZWxzZQotCQkJCVB5T2JqZWN0X1ByaW50KGJvb3QtPmZ1bmMsIHN0ZGVyciwgMCk7Ci0JCQlQeVN5c19Xcml0ZVN0ZGVycigiXG4iKTsKLQkJCVB5RXJyX1ByaW50RXgoMCk7Ci0JCX0KLQl9Ci0JZWxzZQotCQlQeV9ERUNSRUYocmVzKTsKLQlQeV9ERUNSRUYoYm9vdC0+ZnVuYyk7Ci0JUHlfREVDUkVGKGJvb3QtPmFyZ3MpOwotCVB5X1hERUNSRUYoYm9vdC0+a2V5dyk7Ci0JUHlNZW1fREVMKGJvb3RfcmF3KTsKLQlQeVRocmVhZFN0YXRlX0NsZWFyKHRzdGF0ZSk7Ci0JUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50KCk7Ci0JUHlUaHJlYWRfZXhpdF90aHJlYWQoKTsKKyAgICB0c3RhdGUgPSBib290LT50c3RhdGU7CisgICAgdHN0YXRlLT50aHJlYWRfaWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgX1B5VGhyZWFkU3RhdGVfSW5pdCh0c3RhdGUpOworICAgIFB5RXZhbF9BY3F1aXJlVGhyZWFkKHRzdGF0ZSk7CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoCisgICAgICAgIGJvb3QtPmZ1bmMsIGJvb3QtPmFyZ3MsIGJvb3QtPmtleXcpOworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKmZpbGU7CisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigKKyAgICAgICAgICAgICAgICAiVW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiB0aHJlYWQgc3RhcnRlZCBieSAiKTsKKyAgICAgICAgICAgIGZpbGUgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOworICAgICAgICAgICAgaWYgKGZpbGUpCisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlT2JqZWN0KGJvb3QtPmZ1bmMsIGZpbGUsIDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5T2JqZWN0X1ByaW50KGJvb3QtPmZ1bmMsIHN0ZGVyciwgMCk7CisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiXG4iKTsKKyAgICAgICAgICAgIFB5RXJyX1ByaW50RXgoMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICBQeV9ERUNSRUYoYm9vdC0+ZnVuYyk7CisgICAgUHlfREVDUkVGKGJvb3QtPmFyZ3MpOworICAgIFB5X1hERUNSRUYoYm9vdC0+a2V5dyk7CisgICAgUHlNZW1fREVMKGJvb3RfcmF3KTsKKyAgICBQeVRocmVhZFN0YXRlX0NsZWFyKHRzdGF0ZSk7CisgICAgUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50KCk7CisgICAgUHlUaHJlYWRfZXhpdF90aHJlYWQoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRocmVhZF9QeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmdzLCAqa2V5dyA9IE5VTEw7Ci0Jc3RydWN0IGJvb3RzdGF0ZSAqYm9vdDsKLQlsb25nIGlkZW50OworICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJncywgKmtleXcgPSBOVUxMOworICAgIHN0cnVjdCBib290c3RhdGUgKmJvb3Q7CisgICAgbG9uZyBpZGVudDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoZmFyZ3MsICJzdGFydF9uZXdfdGhyZWFkIiwgMiwgMywKLQkJICAgICAgICAgICAgICAgJmZ1bmMsICZhcmdzLCAma2V5dykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJmaXJzdCBhcmcgbXVzdCBiZSBjYWxsYWJsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIjJuZCBhcmcgbXVzdCBiZSBhIHR1cGxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoa2V5dyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5dykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkib3B0aW9uYWwgM3JkIGFyZyBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYm9vdCA9IFB5TWVtX05FVyhzdHJ1Y3QgYm9vdHN0YXRlLCAxKTsKLQlpZiAoYm9vdCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlib290LT5pbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7Ci0JYm9vdC0+ZnVuYyA9IGZ1bmM7Ci0JYm9vdC0+YXJncyA9IGFyZ3M7Ci0JYm9vdC0+a2V5dyA9IGtleXc7Ci0JYm9vdC0+dHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2MoYm9vdC0+aW50ZXJwKTsKLQlpZiAoYm9vdC0+dHN0YXRlID09IE5VTEwpIHsKLQkJUHlNZW1fREVMKGJvb3QpOwotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9Ci0JUHlfSU5DUkVGKGZ1bmMpOwotCVB5X0lOQ1JFRihhcmdzKTsKLQlQeV9YSU5DUkVGKGtleXcpOwotCVB5RXZhbF9Jbml0VGhyZWFkcygpOyAvKiBTdGFydCB0aGUgaW50ZXJwcmV0ZXIncyB0aHJlYWQtYXdhcmVuZXNzICovCi0JaWRlbnQgPSBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHRfYm9vdHN0cmFwLCAodm9pZCopIGJvb3QpOwotCWlmIChpZGVudCA9PSAtMSkgewotCQlQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJjYW4ndCBzdGFydCBuZXcgdGhyZWFkIik7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCQlQeV9YREVDUkVGKGtleXcpOwotCQlQeVRocmVhZFN0YXRlX0NsZWFyKGJvb3QtPnRzdGF0ZSk7Ci0JCVB5TWVtX0RFTChib290KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhpZGVudCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShmYXJncywgInN0YXJ0X25ld190aHJlYWQiLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bmMsICZhcmdzLCAma2V5dykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0IGFyZyBtdXN0IGJlIGNhbGxhYmxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICIybmQgYXJnIG11c3QgYmUgYSB0dXBsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGtleXcgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKGtleXcpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWwgM3JkIGFyZyBtdXN0IGJlIGEgZGljdGlvbmFyeSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYm9vdCA9IFB5TWVtX05FVyhzdHJ1Y3QgYm9vdHN0YXRlLCAxKTsKKyAgICBpZiAoYm9vdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBib290LT5pbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CisgICAgYm9vdC0+ZnVuYyA9IGZ1bmM7CisgICAgYm9vdC0+YXJncyA9IGFyZ3M7CisgICAgYm9vdC0+a2V5dyA9IGtleXc7CisgICAgYm9vdC0+dHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2MoYm9vdC0+aW50ZXJwKTsKKyAgICBpZiAoYm9vdC0+dHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fREVMKGJvb3QpOworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICBQeV9YSU5DUkVGKGtleXcpOworICAgIFB5RXZhbF9Jbml0VGhyZWFkcygpOyAvKiBTdGFydCB0aGUgaW50ZXJwcmV0ZXIncyB0aHJlYWQtYXdhcmVuZXNzICovCisgICAgaWRlbnQgPSBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHRfYm9vdHN0cmFwLCAodm9pZCopIGJvb3QpOworICAgIGlmIChpZGVudCA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJjYW4ndCBzdGFydCBuZXcgdGhyZWFkIik7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBQeV9YREVDUkVGKGtleXcpOworICAgICAgICBQeVRocmVhZFN0YXRlX0NsZWFyKGJvb3QtPnRzdGF0ZSk7CisgICAgICAgIFB5TWVtX0RFTChib290KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpZGVudCk7CiB9CiAKIFB5RG9jX1NUUlZBUihzdGFydF9uZXdfZG9jLApAQCAtNTIyLDggKzUyMiw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGhyZWFkX1B5VGhyZWFkX2V4aXRfdGhyZWFkKFB5T2JqZWN0ICpzZWxmKQogewotCVB5RXJyX1NldE5vbmUoUHlFeGNfU3lzdGVtRXhpdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TeXN0ZW1FeGl0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGV4aXRfZG9jLApAQCAtNTM2LDkgKzUzNiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGhyZWFkX1B5VGhyZWFkX2ludGVycnVwdF9tYWluKFB5T2JqZWN0ICogc2VsZikKIHsKLQlQeUVycl9TZXRJbnRlcnJ1cHQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlFcnJfU2V0SW50ZXJydXB0KCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoaW50ZXJydXB0X2RvYywKQEAgLTU1MiwxMSArNTUyLDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGhyZWFkX1B5VGhyZWFkX2V4aXRfcHJvZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0czsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6ZXhpdF9wcm9nIiwgJnN0cykpCi0JCXJldHVybiBOVUxMOwotCVB5X0V4aXQoc3RzKTsgLyogQ2FsbHMgUHlUaHJlYWRfZXhpdF9wcm9nKHN0cykgb3IgX1B5VGhyZWFkX2V4aXRfcHJvZyhzdHMpICovCi0JZm9yICg7OykgeyB9IC8qIFNob3VsZCBub3QgYmUgcmVhY2hlZCAqLworICAgIGludCBzdHM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOmV4aXRfcHJvZyIsICZzdHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9FeGl0KHN0cyk7IC8qIENhbGxzIFB5VGhyZWFkX2V4aXRfcHJvZyhzdHMpIG9yIF9QeVRocmVhZF9leGl0X3Byb2coc3RzKSAqLworICAgIGZvciAoOzspIHsgfSAvKiBTaG91bGQgbm90IGJlIHJlYWNoZWQgKi8KIH0KICNlbmRpZgogCkBAIC01NjUsNyArNTY1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aHJlYWRfUHlUaHJlYWRfYWxsb2NhdGVfbG9jayhQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIG5ld2xvY2tvYmplY3QoKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG5ld2xvY2tvYmplY3QoKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsbG9jYXRlX2RvYywKQEAgLTU3NywxMyArNTc3LDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGhyZWFkX2dldF9pZGVudChQeU9iamVjdCAqc2VsZikKIHsKLQlsb25nIGlkZW50OwotCWlkZW50ID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCWlmIChpZGVudCA9PSAtMSkgewotCQlQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJubyBjdXJyZW50IHRocmVhZCBpZGVudCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlkZW50KTsKKyAgICBsb25nIGlkZW50OworICAgIGlkZW50ID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIGlmIChpZGVudCA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsICJubyBjdXJyZW50IHRocmVhZCBpZGVudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlkZW50KTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldF9pZGVudF9kb2MsCkBAIC02MDAsMzUgKzYwMCwzNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRocmVhZF9zdGFja19zaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlzaXplX3Qgb2xkX3NpemU7Ci0JUHlfc3NpemVfdCBuZXdfc2l6ZSA9IDA7Ci0JaW50IHJjOworICAgIHNpemVfdCBvbGRfc2l6ZTsKKyAgICBQeV9zc2l6ZV90IG5ld19zaXplID0gMDsKKyAgICBpbnQgcmM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnN0YWNrX3NpemUiLCAmbmV3X3NpemUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnN0YWNrX3NpemUiLCAmbmV3X3NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChuZXdfc2l6ZSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInNpemUgbXVzdCBiZSAwIG9yIGEgcG9zaXRpdmUgdmFsdWUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChuZXdfc2l6ZSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSBtdXN0IGJlIDAgb3IgYSBwb3NpdGl2ZSB2YWx1ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlvbGRfc2l6ZSA9IFB5VGhyZWFkX2dldF9zdGFja3NpemUoKTsKKyAgICBvbGRfc2l6ZSA9IFB5VGhyZWFkX2dldF9zdGFja3NpemUoKTsKIAotCXJjID0gUHlUaHJlYWRfc2V0X3N0YWNrc2l6ZSgoc2l6ZV90KSBuZXdfc2l6ZSk7Ci0JaWYgKHJjID09IC0xKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAic2l6ZSBub3QgdmFsaWQ6ICV6ZCBieXRlcyIsCi0JCQkgICAgIG5ld19zaXplKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChyYyA9PSAtMikgewotCQlQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsCi0JCQkJInNldHRpbmcgc3RhY2sgc2l6ZSBub3Qgc3VwcG9ydGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICByYyA9IFB5VGhyZWFkX3NldF9zdGFja3NpemUoKHNpemVfdCkgbmV3X3NpemUpOworICAgIGlmIChyYyA9PSAtMSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJzaXplIG5vdCB2YWxpZDogJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5ld19zaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChyYyA9PSAtMikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2V0dGluZyBzdGFjayBzaXplIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KChQeV9zc2l6ZV90KSBvbGRfc2l6ZSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KChQeV9zc2l6ZV90KSBvbGRfc2l6ZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihzdGFja19zaXplX2RvYywKQEAgLTY1MiwzMiArNjUyLDMyIEBACiB0aGUgc3VnZ2VzdGVkIGFwcHJvYWNoIGluIHRoZSBhYnNlbmNlIG9mIG1vcmUgc3BlY2lmaWMgaW5mb3JtYXRpb24pLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgdGhyZWFkX21ldGhvZHNbXSA9IHsKLQl7InN0YXJ0X25ld190aHJlYWQiLAkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLAotCQkJCXN0YXJ0X25ld19kb2N9LAotCXsic3RhcnRfbmV3IiwJCShQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLAotCQkJCXN0YXJ0X25ld19kb2N9LAotCXsiYWxsb2NhdGVfbG9jayIsCShQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfYWxsb2NhdGVfbG9jaywgCi0JIE1FVEhfTk9BUkdTLCBhbGxvY2F0ZV9kb2N9LAotCXsiYWxsb2NhdGUiLAkJKFB5Q0Z1bmN0aW9uKXRocmVhZF9QeVRocmVhZF9hbGxvY2F0ZV9sb2NrLCAKLQkgTUVUSF9OT0FSR1MsIGFsbG9jYXRlX2RvY30sCi0JeyJleGl0X3RocmVhZCIsCQkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2V4aXRfdGhyZWFkLCAKLQkgTUVUSF9OT0FSR1MsIGV4aXRfZG9jfSwKLQl7ImV4aXQiLAkJKFB5Q0Z1bmN0aW9uKXRocmVhZF9QeVRocmVhZF9leGl0X3RocmVhZCwgCi0JIE1FVEhfTk9BUkdTLCBleGl0X2RvY30sCi0JeyJpbnRlcnJ1cHRfbWFpbiIsCShQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfaW50ZXJydXB0X21haW4sCi0JIE1FVEhfTk9BUkdTLCBpbnRlcnJ1cHRfZG9jfSwKLQl7ImdldF9pZGVudCIsCQkoUHlDRnVuY3Rpb24pdGhyZWFkX2dldF9pZGVudCwgCi0JIE1FVEhfTk9BUkdTLCBnZXRfaWRlbnRfZG9jfSwKLQl7InN0YWNrX3NpemUiLAkJKFB5Q0Z1bmN0aW9uKXRocmVhZF9zdGFja19zaXplLAotCQkJCU1FVEhfVkFSQVJHUywKLQkJCQlzdGFja19zaXplX2RvY30sCisgICAgeyJzdGFydF9uZXdfdGhyZWFkIiwgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbmV3X2RvY30sCisgICAgeyJzdGFydF9uZXciLCAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfbmV3X2RvY30sCisgICAgeyJhbGxvY2F0ZV9sb2NrIiwgICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfYWxsb2NhdGVfbG9jaywKKyAgICAgTUVUSF9OT0FSR1MsIGFsbG9jYXRlX2RvY30sCisgICAgeyJhbGxvY2F0ZSIsICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfYWxsb2NhdGVfbG9jaywKKyAgICAgTUVUSF9OT0FSR1MsIGFsbG9jYXRlX2RvY30sCisgICAgeyJleGl0X3RocmVhZCIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfZXhpdF90aHJlYWQsCisgICAgIE1FVEhfTk9BUkdTLCBleGl0X2RvY30sCisgICAgeyJleGl0IiwgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfZXhpdF90aHJlYWQsCisgICAgIE1FVEhfTk9BUkdTLCBleGl0X2RvY30sCisgICAgeyJpbnRlcnJ1cHRfbWFpbiIsICAgICAgICAgIChQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfaW50ZXJydXB0X21haW4sCisgICAgIE1FVEhfTk9BUkdTLCBpbnRlcnJ1cHRfZG9jfSwKKyAgICB7ImdldF9pZGVudCIsICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRocmVhZF9nZXRfaWRlbnQsCisgICAgIE1FVEhfTk9BUkdTLCBnZXRfaWRlbnRfZG9jfSwKKyAgICB7InN0YWNrX3NpemUiLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRocmVhZF9zdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja19zaXplX2RvY30sCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwotCXsiZXhpdF9wcm9nIiwJCShQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfZXhpdF9wcm9nLAotCSBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZXhpdF9wcm9nIiwgICAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX2V4aXRfcHJvZywKKyAgICAgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgotCXtOVUxMLAkJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtNzAyLDI5ICs3MDIsMjkgQEAKIFB5TU9ESU5JVF9GVU5DCiBpbml0dGhyZWFkKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCS8qIEluaXRpYWxpemUgdHlwZXM6ICovCi0JaWYgKFB5VHlwZV9SZWFkeSgmbG9jYWx0eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CiAKLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLQltID0gUHlfSW5pdE1vZHVsZTMoInRocmVhZCIsIHRocmVhZF9tZXRob2RzLCB0aHJlYWRfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgLyogSW5pdGlhbGl6ZSB0eXBlczogKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZsb2NhbHR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIGEgc3ltYm9saWMgY29uc3RhbnQgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlUaHJlYWRFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigidGhyZWFkLmVycm9yIiwgTlVMTCwgTlVMTCk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgVGhyZWFkRXJyb3IpOwotCUxvY2t0eXBlLnRwX2RvYyA9IGxvY2tfZG9jOwotCVB5X0lOQ1JFRigmTG9ja3R5cGUpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJMb2NrVHlwZSIsIChQeU9iamVjdCAqKSZMb2NrdHlwZSk7CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJ0aHJlYWQiLCB0aHJlYWRfbWV0aG9kcywgdGhyZWFkX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfSU5DUkVGKCZsb2NhbHR5cGUpOwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9sb2NhbCIsIChQeU9iamVjdCAqKSZsb2NhbHR5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIC8qIEFkZCBhIHN5bWJvbGljIGNvbnN0YW50ICovCisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgVGhyZWFkRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInRocmVhZC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIFRocmVhZEVycm9yKTsKKyAgICBMb2NrdHlwZS50cF9kb2MgPSBsb2NrX2RvYzsKKyAgICBQeV9JTkNSRUYoJkxvY2t0eXBlKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTG9ja1R5cGUiLCAoUHlPYmplY3QgKikmTG9ja3R5cGUpOwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgQyB0aHJlYWQgbGlicmFyeSAqLwotCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgUHlfSU5DUkVGKCZsb2NhbHR5cGUpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9sb2NhbCIsIChQeU9iamVjdCAqKSZsb2NhbHR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgQyB0aHJlYWQgbGlicmFyeSAqLworICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYyBiL01vZHVsZXMvdGltZW1vZHVsZS5jCmluZGV4IGU4ZGUyYzUuLmQ2ZDQxNjAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvdGltZW1vZHVsZS5jCkBAIC00NiwxMiArNDYsMTIgQEAKIHN0YXRpYyBIQU5ETEUgaEludGVycnVwdEV2ZW50ID0gTlVMTDsKIHN0YXRpYyBCT09MIFdJTkFQSSBQeUN0cmxIYW5kbGVyKERXT1JEIGR3Q3RybFR5cGUpCiB7Ci0JU2V0RXZlbnQoaEludGVycnVwdEV2ZW50KTsKLQkvKiBhbGxvdyBvdGhlciBkZWZhdWx0IGhhbmRsZXJzIHRvIGJlIGNhbGxlZC4KLQkgICBEZWZhdWx0IFB5dGhvbiBoYW5kbGVyIHdpbGwgc2V0dXAgdGhlCi0JICAgS2V5Ym9hcmRJbnRlcnJ1cHQgZXhjZXB0aW9uLgotCSovCi0JcmV0dXJuIEZBTFNFOworICAgIFNldEV2ZW50KGhJbnRlcnJ1cHRFdmVudCk7CisgICAgLyogYWxsb3cgb3RoZXIgZGVmYXVsdCBoYW5kbGVycyB0byBiZSBjYWxsZWQuCisgICAgICAgRGVmYXVsdCBQeXRob24gaGFuZGxlciB3aWxsIHNldHVwIHRoZQorICAgICAgIEtleWJvYXJkSW50ZXJydXB0IGV4Y2VwdGlvbi4KKyAgICAqLworICAgIHJldHVybiBGQUxTRTsKIH0KIHN0YXRpYyBsb25nIG1haW5fdGhyZWFkOwogCkBAIC0xMDIsMzggKzEwMiwzOCBAQAogdGltZV90CiBfUHlUaW1lX0RvdWJsZVRvVGltZXQoZG91YmxlIHgpCiB7Ci0JdGltZV90IHJlc3VsdDsKLQlkb3VibGUgZGlmZjsKKyAgICB0aW1lX3QgcmVzdWx0OworICAgIGRvdWJsZSBkaWZmOwogCi0JcmVzdWx0ID0gKHRpbWVfdCl4OwotCS8qIEhvdyBtdWNoIGluZm8gZGlkIHdlIGxvc2U/ICB0aW1lX3QgbWF5IGJlIGFuIGludGVncmFsIG9yCi0JICogZmxvYXRpbmcgdHlwZSwgYW5kIHdlIGRvbid0IGtub3cgd2hpY2guICBJZiBpdCdzIGludGVncmFsLAotCSAqIHdlIGRvbid0IGtub3cgd2hldGhlciBDIHRydW5jYXRlcywgcm91bmRzLCByZXR1cm5zIHRoZSBmbG9vciwKLQkgKiBldGMuICBJZiB3ZSBsb3N0IGEgc2Vjb25kIG9yIG1vcmUsIHRoZSBDIHJvdW5kaW5nIGlzCi0JICogdW5yZWFzb25hYmxlLCBvciB0aGUgaW5wdXQganVzdCBkb2Vzbid0IGZpdCBpbiBhIHRpbWVfdDsKLQkgKiBjYWxsIGl0IGFuIGVycm9yIHJlZ2FyZGxlc3MuICBOb3RlIHRoYXQgdGhlIG9yaWdpbmFsIGNhc3QgdG8KLQkgKiB0aW1lX3QgY2FuIGNhdXNlIGEgQyBlcnJvciB0b28sIGJ1dCBub3RoaW5nIHdlIGNhbiBkbyB0bwotCSAqIHdvcm0gYXJvdW5kIHRoYXQuCi0JICovCi0JZGlmZiA9IHggLSAoZG91YmxlKXJlc3VsdDsKLQlpZiAoZGlmZiA8PSAtMS4wIHx8IGRpZmYgPj0gMS4wKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UgZm9yIHBsYXRmb3JtIHRpbWVfdCIpOwotCQlyZXN1bHQgPSAodGltZV90KS0xOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9ICh0aW1lX3QpeDsKKyAgICAvKiBIb3cgbXVjaCBpbmZvIGRpZCB3ZSBsb3NlPyAgdGltZV90IG1heSBiZSBhbiBpbnRlZ3JhbCBvcgorICAgICAqIGZsb2F0aW5nIHR5cGUsIGFuZCB3ZSBkb24ndCBrbm93IHdoaWNoLiAgSWYgaXQncyBpbnRlZ3JhbCwKKyAgICAgKiB3ZSBkb24ndCBrbm93IHdoZXRoZXIgQyB0cnVuY2F0ZXMsIHJvdW5kcywgcmV0dXJucyB0aGUgZmxvb3IsCisgICAgICogZXRjLiAgSWYgd2UgbG9zdCBhIHNlY29uZCBvciBtb3JlLCB0aGUgQyByb3VuZGluZyBpcworICAgICAqIHVucmVhc29uYWJsZSwgb3IgdGhlIGlucHV0IGp1c3QgZG9lc24ndCBmaXQgaW4gYSB0aW1lX3Q7CisgICAgICogY2FsbCBpdCBhbiBlcnJvciByZWdhcmRsZXNzLiAgTm90ZSB0aGF0IHRoZSBvcmlnaW5hbCBjYXN0IHRvCisgICAgICogdGltZV90IGNhbiBjYXVzZSBhIEMgZXJyb3IgdG9vLCBidXQgbm90aGluZyB3ZSBjYW4gZG8gdG8KKyAgICAgKiB3b3JtIGFyb3VuZCB0aGF0LgorICAgICAqLworICAgIGRpZmYgPSB4IC0gKGRvdWJsZSlyZXN1bHQ7CisgICAgaWYgKGRpZmYgPD0gLTEuMCB8fCBkaWZmID49IDEuMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgb3V0IG9mIHJhbmdlIGZvciBwbGF0Zm9ybSB0aW1lX3QiKTsKKyAgICAgICAgcmVzdWx0ID0gKHRpbWVfdCktMTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfdGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlkb3VibGUgc2VjczsKLQlzZWNzID0gZmxvYXR0aW1lKCk7Ci0JaWYgKHNlY3MgPT0gMC4wKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoc2Vjcyk7CisgICAgZG91YmxlIHNlY3M7CisgICAgc2VjcyA9IGZsb2F0dGltZSgpOworICAgIGlmIChzZWNzID09IDAuMCkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHNlY3MpOwogfQogCiBQeURvY19TVFJWQVIodGltZV9kb2MsCkBAIC0xNTUsNyArMTU1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2Nsb2NrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQogewotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoKChkb3VibGUpY2xvY2soKSkgLyBDTE9DS1NfUEVSX1NFQyk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoKGRvdWJsZSljbG9jaygpKSAvIENMT0NLU19QRVJfU0VDKTsKIH0KICNlbmRpZiAvKiBIQVZFX0NMT0NLICovCiAKQEAgLTE2NCwyNSArMTY0LDI1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9jbG9jayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlzdGF0aWMgTEFSR0VfSU5URUdFUiBjdHJTdGFydDsKLQlzdGF0aWMgZG91YmxlIGRpdmlzb3IgPSAwLjA7Ci0JTEFSR0VfSU5URUdFUiBub3c7Ci0JZG91YmxlIGRpZmY7CisgICAgc3RhdGljIExBUkdFX0lOVEVHRVIgY3RyU3RhcnQ7CisgICAgc3RhdGljIGRvdWJsZSBkaXZpc29yID0gMC4wOworICAgIExBUkdFX0lOVEVHRVIgbm93OworICAgIGRvdWJsZSBkaWZmOwogCi0JaWYgKGRpdmlzb3IgPT0gMC4wKSB7Ci0JCUxBUkdFX0lOVEVHRVIgZnJlcTsKLQkJUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJmN0clN0YXJ0KTsKLQkJaWYgKCFRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZmcmVxKSB8fCBmcmVxLlF1YWRQYXJ0ID09IDApIHsKLQkJCS8qIFVubGlrZWx5IHRvIGhhcHBlbiAtIHRoaXMgd29ya3Mgb24gYWxsIGludGVsCi0JCQkgICBtYWNoaW5lcyBhdCBsZWFzdCEgIFJldmVydCB0byBjbG9jaygpICovCi0JCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKCgoZG91YmxlKWNsb2NrKCkpIC8KLQkJCQkJCSAgQ0xPQ0tTX1BFUl9TRUMpOwotCQl9Ci0JCWRpdmlzb3IgPSAoZG91YmxlKWZyZXEuUXVhZFBhcnQ7Ci0JfQotCVF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZub3cpOwotCWRpZmYgPSAoZG91YmxlKShub3cuUXVhZFBhcnQgLSBjdHJTdGFydC5RdWFkUGFydCk7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShkaWZmIC8gZGl2aXNvcik7CisgICAgaWYgKGRpdmlzb3IgPT0gMC4wKSB7CisgICAgICAgIExBUkdFX0lOVEVHRVIgZnJlcTsKKyAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJmN0clN0YXJ0KTsKKyAgICAgICAgaWYgKCFRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZmcmVxKSB8fCBmcmVxLlF1YWRQYXJ0ID09IDApIHsKKyAgICAgICAgICAgIC8qIFVubGlrZWx5IHRvIGhhcHBlbiAtIHRoaXMgd29ya3Mgb24gYWxsIGludGVsCisgICAgICAgICAgICAgICBtYWNoaW5lcyBhdCBsZWFzdCEgIFJldmVydCB0byBjbG9jaygpICovCisgICAgICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKCgoZG91YmxlKWNsb2NrKCkpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPQ0tTX1BFUl9TRUMpOworICAgICAgICB9CisgICAgICAgIGRpdmlzb3IgPSAoZG91YmxlKWZyZXEuUXVhZFBhcnQ7CisgICAgfQorICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCZub3cpOworICAgIGRpZmYgPSAoZG91YmxlKShub3cuUXVhZFBhcnQgLSBjdHJTdGFydC5RdWFkUGFydCk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShkaWZmIC8gZGl2aXNvcik7CiB9CiAKICNkZWZpbmUgSEFWRV9DTE9DSyAvKiBTbyBpdCBnZXRzIGluY2x1ZGVkIGluIHRoZSBtZXRob2RzICovCkBAIC0yMDAsMTMgKzIwMCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfc2xlZXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWRvdWJsZSBzZWNzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDpzbGVlcCIsICZzZWNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGZsb2F0c2xlZXAoc2VjcykgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGRvdWJsZSBzZWNzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDpzbGVlcCIsICZzZWNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGZsb2F0c2xlZXAoc2VjcykgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2xlZXBfZG9jLApAQCAtMjE2LDIzICsyMTYsMjMgQEAKIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGZvciBzdWJzZWNvbmQgcHJlY2lzaW9uLiIpOwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBzdHJ1Y3RfdGltZV90eXBlX2ZpZWxkc1tdID0gewotCXsidG1feWVhciIsIE5VTEx9LAotCXsidG1fbW9uIiwgTlVMTH0sCi0JeyJ0bV9tZGF5IiwgTlVMTH0sCi0JeyJ0bV9ob3VyIiwgTlVMTH0sCi0JeyJ0bV9taW4iLCBOVUxMfSwKLQl7InRtX3NlYyIsIE5VTEx9LAotCXsidG1fd2RheSIsIE5VTEx9LAotCXsidG1feWRheSIsIE5VTEx9LAotCXsidG1faXNkc3QiLCBOVUxMfSwKLQl7MH0KKyAgICB7InRtX3llYXIiLCBOVUxMfSwKKyAgICB7InRtX21vbiIsIE5VTEx9LAorICAgIHsidG1fbWRheSIsIE5VTEx9LAorICAgIHsidG1faG91ciIsIE5VTEx9LAorICAgIHsidG1fbWluIiwgTlVMTH0sCisgICAgeyJ0bV9zZWMiLCBOVUxMfSwKKyAgICB7InRtX3dkYXkiLCBOVUxMfSwKKyAgICB7InRtX3lkYXkiLCBOVUxMfSwKKyAgICB7InRtX2lzZHN0IiwgTlVMTH0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9EZXNjIHN0cnVjdF90aW1lX3R5cGVfZGVzYyA9IHsKLQkidGltZS5zdHJ1Y3RfdGltZSIsCi0JTlVMTCwKLQlzdHJ1Y3RfdGltZV90eXBlX2ZpZWxkcywKLQk5LAorICAgICJ0aW1lLnN0cnVjdF90aW1lIiwKKyAgICBOVUxMLAorICAgIHN0cnVjdF90aW1lX3R5cGVfZmllbGRzLAorICAgIDksCiB9OwogCiBzdGF0aWMgaW50IGluaXRpYWxpemVkOwpAQCAtMjQxLDQ4ICsyNDEsNDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0bXRvdHVwbGUoc3RydWN0IHRtICpwKQogewotCVB5T2JqZWN0ICp2ID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJlN0cnVjdFRpbWVUeXBlKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqdiA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZTdHJ1Y3RUaW1lVHlwZSk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNkZWZpbmUgU0VUKGksdmFsKSBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIGksIFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWwpKQogCi0JU0VUKDAsIHAtPnRtX3llYXIgKyAxOTAwKTsKLQlTRVQoMSwgcC0+dG1fbW9uICsgMSk7CSAgIC8qIFdhbnQgSmFudWFyeSA9PSAxICovCi0JU0VUKDIsIHAtPnRtX21kYXkpOwotCVNFVCgzLCBwLT50bV9ob3VyKTsKLQlTRVQoNCwgcC0+dG1fbWluKTsKLQlTRVQoNSwgcC0+dG1fc2VjKTsKLQlTRVQoNiwgKHAtPnRtX3dkYXkgKyA2KSAlIDcpOyAvKiBXYW50IE1vbmRheSA9PSAwICovCi0JU0VUKDcsIHAtPnRtX3lkYXkgKyAxKTsJICAgLyogV2FudCBKYW51YXJ5LCAxID09IDEgKi8KLQlTRVQoOCwgcC0+dG1faXNkc3QpOworICAgIFNFVCgwLCBwLT50bV95ZWFyICsgMTkwMCk7CisgICAgU0VUKDEsIHAtPnRtX21vbiArIDEpOyAgICAgICAgIC8qIFdhbnQgSmFudWFyeSA9PSAxICovCisgICAgU0VUKDIsIHAtPnRtX21kYXkpOworICAgIFNFVCgzLCBwLT50bV9ob3VyKTsKKyAgICBTRVQoNCwgcC0+dG1fbWluKTsKKyAgICBTRVQoNSwgcC0+dG1fc2VjKTsKKyAgICBTRVQoNiwgKHAtPnRtX3dkYXkgKyA2KSAlIDcpOyAvKiBXYW50IE1vbmRheSA9PSAwICovCisgICAgU0VUKDcsIHAtPnRtX3lkYXkgKyAxKTsgICAgICAgIC8qIFdhbnQgSmFudWFyeSwgMSA9PSAxICovCisgICAgU0VUKDgsIHAtPnRtX2lzZHN0KTsKICN1bmRlZiBTRVQKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeV9YREVDUkVGKHYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHY7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2NvbnZlcnQoZG91YmxlIHdoZW4sIHN0cnVjdCB0bSAqICgqZnVuY3Rpb24pKGNvbnN0IHRpbWVfdCAqKSkKIHsKLQlzdHJ1Y3QgdG0gKnA7Ci0JdGltZV90IHdoZW50ID0gX1B5VGltZV9Eb3VibGVUb1RpbWV0KHdoZW4pOworICAgIHN0cnVjdCB0bSAqcDsKKyAgICB0aW1lX3Qgd2hlbnQgPSBfUHlUaW1lX0RvdWJsZVRvVGltZXQod2hlbik7CiAKLQlpZiAod2hlbnQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQllcnJubyA9IDA7Ci0JcCA9IGZ1bmN0aW9uKCZ3aGVudCk7Ci0JaWYgKHAgPT0gTlVMTCkgeworICAgIGlmICh3aGVudCA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVycm5vID0gMDsKKyAgICBwID0gZnVuY3Rpb24oJndoZW50KTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CiAjaWZkZWYgRUlOVkFMCi0JCWlmIChlcnJubyA9PSAwKQotCQkJZXJybm8gPSBFSU5WQUw7CisgICAgICAgIGlmIChlcnJubyA9PSAwKQorICAgICAgICAgICAgZXJybm8gPSBFSU5WQUw7CiAjZW5kaWYKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19WYWx1ZUVycm9yKTsKLQl9Ci0JcmV0dXJuIHRtdG90dXBsZShwKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19WYWx1ZUVycm9yKTsKKyAgICB9CisgICAgcmV0dXJuIHRtdG90dXBsZShwKTsKIH0KIAogLyogUGFyc2UgYXJnIHR1cGxlIHRoYXQgY2FuIGNvbnRhaW4gYW4gb3B0aW9uYWwgZmxvYXQtb3ItTm9uZSB2YWx1ZTsKQEAgLTI5MiwyOCArMjkyLDI4IEBACiBzdGF0aWMgaW50CiBwYXJzZV90aW1lX2RvdWJsZV9hcmdzKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIGRvdWJsZSAqcHdoZW4pCiB7Ci0JUHlPYmplY3QgKm90ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqb3QgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIGZvcm1hdCwgJm90KSkKLQkJcmV0dXJuIDA7Ci0JaWYgKG90ID09IE5VTEwgfHwgb3QgPT0gUHlfTm9uZSkKLQkJKnB3aGVuID0gZmxvYXR0aW1lKCk7Ci0JZWxzZSB7Ci0JCWRvdWJsZSB3aGVuID0gUHlGbG9hdF9Bc0RvdWJsZShvdCk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIDA7Ci0JCSpwd2hlbiA9IHdoZW47Ci0JfQotCXJldHVybiAxOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBmb3JtYXQsICZvdCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChvdCA9PSBOVUxMIHx8IG90ID09IFB5X05vbmUpCisgICAgICAgICpwd2hlbiA9IGZsb2F0dGltZSgpOworICAgIGVsc2UgeworICAgICAgICBkb3VibGUgd2hlbiA9IFB5RmxvYXRfQXNEb3VibGUob3QpOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAqcHdoZW4gPSB3aGVuOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfZ210aW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlkb3VibGUgd2hlbjsKLQlpZiAoIXBhcnNlX3RpbWVfZG91YmxlX2FyZ3MoYXJncywgInxPOmdtdGltZSIsICZ3aGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHRpbWVfY29udmVydCh3aGVuLCBnbXRpbWUpOworICAgIGRvdWJsZSB3aGVuOworICAgIGlmICghcGFyc2VfdGltZV9kb3VibGVfYXJncyhhcmdzLCAifE86Z210aW1lIiwgJndoZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gdGltZV9jb252ZXJ0KHdoZW4sIGdtdGltZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihnbXRpbWVfZG9jLApAQCAtMzI2LDE1ICszMjYsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2xvY2FsdGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JZG91YmxlIHdoZW47Ci0JaWYgKCFwYXJzZV90aW1lX2RvdWJsZV9hcmdzKGFyZ3MsICJ8Tzpsb2NhbHRpbWUiLCAmd2hlbikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB0aW1lX2NvbnZlcnQod2hlbiwgbG9jYWx0aW1lKTsKKyAgICBkb3VibGUgd2hlbjsKKyAgICBpZiAoIXBhcnNlX3RpbWVfZG91YmxlX2FyZ3MoYXJncywgInxPOmxvY2FsdGltZSIsICZ3aGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHRpbWVfY29udmVydCh3aGVuLCBsb2NhbHRpbWUpOwogfQogCiBQeURvY19TVFJWQVIobG9jYWx0aW1lX2RvYywKICJsb2NhbHRpbWUoW3NlY29uZHNdKSAtPiAodG1feWVhcix0bV9tb24sdG1fbWRheSx0bV9ob3VyLHRtX21pbixcblwKLQkJCSAgdG1fc2VjLHRtX3dkYXksdG1feWRheSx0bV9pc2RzdClcblwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG1fc2VjLHRtX3dkYXksdG1feWRheSx0bV9pc2RzdClcblwKIFxuXAogQ29udmVydCBzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaCB0byBhIHRpbWUgdHVwbGUgZXhwcmVzc2luZyBsb2NhbCB0aW1lLlxuXAogV2hlbiAnc2Vjb25kcycgaXMgbm90IHBhc3NlZCBpbiwgY29udmVydCB0aGUgY3VycmVudCB0aW1lIGluc3RlYWQuIik7CkBAIC0zNDIsMTY2ICszNDIsMTY2IEBACiBzdGF0aWMgaW50CiBnZXR0bWFyZyhQeU9iamVjdCAqYXJncywgc3RydWN0IHRtICpwKQogewotCWludCB5OwotCW1lbXNldCgodm9pZCAqKSBwLCAnXDAnLCBzaXplb2Yoc3RydWN0IHRtKSk7CisgICAgaW50IHk7CisgICAgbWVtc2V0KCh2b2lkICopIHAsICdcMCcsIHNpemVvZihzdHJ1Y3QgdG0pKTsKIAotCWlmICghUHlBcmdfUGFyc2UoYXJncywgIihpaWlpaWlpaWkpIiwKLQkJCSAmeSwKLQkJCSAmcC0+dG1fbW9uLAotCQkJICZwLT50bV9tZGF5LAotCQkJICZwLT50bV9ob3VyLAotCQkJICZwLT50bV9taW4sCi0JCQkgJnAtPnRtX3NlYywKLQkJCSAmcC0+dG1fd2RheSwKLQkJCSAmcC0+dG1feWRheSwKLQkJCSAmcC0+dG1faXNkc3QpKQotCQlyZXR1cm4gMDsKLQlpZiAoeSA8IDE5MDApIHsKLQkJUHlPYmplY3QgKmFjY2VwdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZGRpY3QsCi0JCQkJCQkJImFjY2VwdDJkeWVhciIpOwotCQlpZiAoYWNjZXB0ID09IE5VTEwgfHwgIVB5SW50X0NoZWNrKGFjY2VwdCkgfHwKLQkJICAgIFB5SW50X0FzTG9uZyhhY2NlcHQpID09IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkieWVhciA+PSAxOTAwIHJlcXVpcmVkIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoNjkgPD0geSAmJiB5IDw9IDk5KQotCQkJeSArPSAxOTAwOwotCQllbHNlIGlmICgwIDw9IHkgJiYgeSA8PSA2OCkKLQkJCXkgKz0gMjAwMDsKLQkJZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInllYXIgb3V0IG9mIHJhbmdlIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlwLT50bV95ZWFyID0geSAtIDE5MDA7Ci0JcC0+dG1fbW9uLS07Ci0JcC0+dG1fd2RheSA9IChwLT50bV93ZGF5ICsgMSkgJSA3OwotCXAtPnRtX3lkYXktLTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ3MsICIoaWlpaWlpaWlpKSIsCisgICAgICAgICAgICAgICAgICAgICAmeSwKKyAgICAgICAgICAgICAgICAgICAgICZwLT50bV9tb24sCisgICAgICAgICAgICAgICAgICAgICAmcC0+dG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICZwLT50bV9ob3VyLAorICAgICAgICAgICAgICAgICAgICAgJnAtPnRtX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICZwLT50bV9zZWMsCisgICAgICAgICAgICAgICAgICAgICAmcC0+dG1fd2RheSwKKyAgICAgICAgICAgICAgICAgICAgICZwLT50bV95ZGF5LAorICAgICAgICAgICAgICAgICAgICAgJnAtPnRtX2lzZHN0KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHkgPCAxOTAwKSB7CisgICAgICAgIFB5T2JqZWN0ICphY2NlcHQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2RkaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjY2VwdDJkeWVhciIpOworICAgICAgICBpZiAoYWNjZXB0ID09IE5VTEwgfHwgIVB5SW50X0NoZWNrKGFjY2VwdCkgfHwKKyAgICAgICAgICAgIFB5SW50X0FzTG9uZyhhY2NlcHQpID09IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZWFyID49IDE5MDAgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICg2OSA8PSB5ICYmIHkgPD0gOTkpCisgICAgICAgICAgICB5ICs9IDE5MDA7CisgICAgICAgIGVsc2UgaWYgKDAgPD0geSAmJiB5IDw9IDY4KQorICAgICAgICAgICAgeSArPSAyMDAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZWFyIG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcC0+dG1feWVhciA9IHkgLSAxOTAwOworICAgIHAtPnRtX21vbi0tOworICAgIHAtPnRtX3dkYXkgPSAocC0+dG1fd2RheSArIDEpICUgNzsKKyAgICBwLT50bV95ZGF5LS07CisgICAgcmV0dXJuIDE7CiB9CiAKICNpZmRlZiBIQVZFX1NUUkZUSU1FCiBzdGF0aWMgUHlPYmplY3QgKgogdGltZV9zdHJmdGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnR1cCA9IE5VTEw7Ci0Jc3RydWN0IHRtIGJ1ZjsKLQljb25zdCBjaGFyICpmbXQ7Ci0Jc2l6ZV90IGZtdGxlbiwgYnVmbGVuOwotCWNoYXIgKm91dGJ1ZiA9IDA7Ci0Jc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnR1cCA9IE5VTEw7CisgICAgc3RydWN0IHRtIGJ1ZjsKKyAgICBjb25zdCBjaGFyICpmbXQ7CisgICAgc2l6ZV90IGZtdGxlbiwgYnVmbGVuOworICAgIGNoYXIgKm91dGJ1ZiA9IDA7CisgICAgc2l6ZV90IGk7CiAKLQltZW1zZXQoKHZvaWQgKikgJmJ1ZiwgJ1wwJywgc2l6ZW9mKGJ1ZikpOworICAgIG1lbXNldCgodm9pZCAqKSAmYnVmLCAnXDAnLCBzaXplb2YoYnVmKSk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8TzpzdHJmdGltZSIsICZmbXQsICZ0dXApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8TzpzdHJmdGltZSIsICZmbXQsICZ0dXApKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICh0dXAgPT0gTlVMTCkgewotCQl0aW1lX3QgdHQgPSB0aW1lKE5VTEwpOwotCQlidWYgPSAqbG9jYWx0aW1lKCZ0dCk7Ci0JfSBlbHNlIGlmICghZ2V0dG1hcmcodHVwLCAmYnVmKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR1cCA9PSBOVUxMKSB7CisgICAgICAgIHRpbWVfdCB0dCA9IHRpbWUoTlVMTCk7CisgICAgICAgIGJ1ZiA9ICpsb2NhbHRpbWUoJnR0KTsKKyAgICB9IGVsc2UgaWYgKCFnZXR0bWFyZyh0dXAsICZidWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICAvKiBDaGVja3MgYWRkZWQgdG8gbWFrZSBzdXJlIHN0cmZ0aW1lKCkgZG9lcyBub3QgY3Jhc2ggUHl0aG9uIGJ5Ci0gICAgICAgICAgICBpbmRleGluZyBibGluZGx5IGludG8gc29tZSBhcnJheSBmb3IgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uCi0gICAgICAgICAgICBieSBzb21lIGJhZCBpbmRleCAoZml4ZXMgYnVnICM4OTc2MjUpLgorICAgIC8qIENoZWNrcyBhZGRlZCB0byBtYWtlIHN1cmUgc3RyZnRpbWUoKSBkb2VzIG5vdCBjcmFzaCBQeXRob24gYnkKKyAgICAgICAgaW5kZXhpbmcgYmxpbmRseSBpbnRvIHNvbWUgYXJyYXkgZm9yIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbgorICAgICAgICBieSBzb21lIGJhZCBpbmRleCAoZml4ZXMgYnVnICM4OTc2MjUpLgogCi0JICAgIEFsc28gc3VwcG9ydCB2YWx1ZXMgb2YgemVybyBmcm9tIFB5dGhvbiBjb2RlIGZvciBhcmd1bWVudHMgaW4gd2hpY2gKLQkgICAgdGhhdCBpcyBvdXQgb2YgcmFuZ2UgYnkgZm9yY2luZyB0aGF0IHZhbHVlIHRvIHRoZSBsb3dlc3QgdmFsdWUgdGhhdAotCSAgICBpcyB2YWxpZCAoZml4ZWQgYnVnICMxNTIwOTE0KS4KKyAgICAgICAgQWxzbyBzdXBwb3J0IHZhbHVlcyBvZiB6ZXJvIGZyb20gUHl0aG9uIGNvZGUgZm9yIGFyZ3VtZW50cyBpbiB3aGljaAorICAgICAgICB0aGF0IGlzIG91dCBvZiByYW5nZSBieSBmb3JjaW5nIHRoYXQgdmFsdWUgdG8gdGhlIGxvd2VzdCB2YWx1ZSB0aGF0CisgICAgICAgIGlzIHZhbGlkIChmaXhlZCBidWcgIzE1MjA5MTQpLgogCi0JICAgIFZhbGlkIHJhbmdlcyBiYXNlZCBvbiB3aGF0IGlzIGFsbG93ZWQgaW4gc3RydWN0IHRtOgorICAgICAgICBWYWxpZCByYW5nZXMgYmFzZWQgb24gd2hhdCBpcyBhbGxvd2VkIGluIHN0cnVjdCB0bToKIAotCSAgICAtIHRtX3llYXI6IFswLCBtYXgoaW50KV0gKDEpCi0JICAgIC0gdG1fbW9uOiBbMCwgMTFdICgyKQotCSAgICAtIHRtX21kYXk6IFsxLCAzMV0KLQkgICAgLSB0bV9ob3VyOiBbMCwgMjNdCi0JICAgIC0gdG1fbWluOiBbMCwgNTldCi0JICAgIC0gdG1fc2VjOiBbMCwgNjBdCi0JICAgIC0gdG1fd2RheTogWzAsIDZdICgxKQotCSAgICAtIHRtX3lkYXk6IFswLCAzNjVdICgyKQotCSAgICAtIHRtX2lzZHN0OiBbLW1heChpbnQpLCBtYXgoaW50KV0KKyAgICAgICAgLSB0bV95ZWFyOiBbMCwgbWF4KGludCldICgxKQorICAgICAgICAtIHRtX21vbjogWzAsIDExXSAoMikKKyAgICAgICAgLSB0bV9tZGF5OiBbMSwgMzFdCisgICAgICAgIC0gdG1faG91cjogWzAsIDIzXQorICAgICAgICAtIHRtX21pbjogWzAsIDU5XQorICAgICAgICAtIHRtX3NlYzogWzAsIDYwXQorICAgICAgICAtIHRtX3dkYXk6IFswLCA2XSAoMSkKKyAgICAgICAgLSB0bV95ZGF5OiBbMCwgMzY1XSAoMikKKyAgICAgICAgLSB0bV9pc2RzdDogWy1tYXgoaW50KSwgbWF4KGludCldCiAKLQkgICAgKDEpIGdldHRtYXJnKCkgaGFuZGxlcyBib3VuZHMtY2hlY2tpbmcuCi0JICAgICgyKSBQeXRob24ncyBhY2NlcHRhYmxlIHJhbmdlIGlzIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJhbmdlIGluIEMsCi0JICAgICAgICB0aHVzIG5lZWQgdG8gY2hlY2sgYWdhaW5zdCBhdXRvbWF0aWMgZGVjcmVtZW50IGJ5IGdldHRtYXJnKCkuCi0gICAgICAgICovCi0JaWYgKGJ1Zi50bV9tb24gPT0gLTEpCi0JICAgIGJ1Zi50bV9tb24gPSAwOwotCWVsc2UgaWYgKGJ1Zi50bV9tb24gPCAwIHx8IGJ1Zi50bV9tb24gPiAxMSkgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJtb250aCBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAoMSkgZ2V0dG1hcmcoKSBoYW5kbGVzIGJvdW5kcy1jaGVja2luZy4KKyAgICAgICAgKDIpIFB5dGhvbidzIGFjY2VwdGFibGUgcmFuZ2UgaXMgb25lIGdyZWF0ZXIgdGhhbiB0aGUgcmFuZ2UgaW4gQywKKyAgICAgICAgdGh1cyBuZWVkIHRvIGNoZWNrIGFnYWluc3QgYXV0b21hdGljIGRlY3JlbWVudCBieSBnZXR0bWFyZygpLgorICAgICovCisgICAgaWYgKGJ1Zi50bV9tb24gPT0gLTEpCisgICAgICAgIGJ1Zi50bV9tb24gPSAwOworICAgIGVsc2UgaWYgKGJ1Zi50bV9tb24gPCAwIHx8IGJ1Zi50bV9tb24gPiAxMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1vbnRoIG91dCBvZiByYW5nZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGJ1Zi50bV9tZGF5ID09IDApCisgICAgICAgIGJ1Zi50bV9tZGF5ID0gMTsKKyAgICBlbHNlIGlmIChidWYudG1fbWRheSA8IDAgfHwgYnVmLnRtX21kYXkgPiAzMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRheSBvZiBtb250aCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChidWYudG1faG91ciA8IDAgfHwgYnVmLnRtX2hvdXIgPiAyMykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImhvdXIgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoYnVmLnRtX21pbiA8IDAgfHwgYnVmLnRtX21pbiA+IDU5KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibWludXRlIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGJ1Zi50bV9zZWMgPCAwIHx8IGJ1Zi50bV9zZWMgPiA2MSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInNlY29uZHMgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiB0bV93ZGF5IGRvZXMgbm90IG5lZWQgY2hlY2tpbmcgb2YgaXRzIHVwcGVyLWJvdW5kIHNpbmNlIHRha2luZworICAgIGBgJSA3YGAgaW4gZ2V0dG1hcmcoKSBhdXRvbWF0aWNhbGx5IHJlc3RyaWN0cyB0aGUgcmFuZ2UuICovCisgICAgaWYgKGJ1Zi50bV93ZGF5IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRheSBvZiB3ZWVrIG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGJ1Zi50bV95ZGF5ID09IC0xKQorICAgICAgICBidWYudG1feWRheSA9IDA7CisgICAgZWxzZSBpZiAoYnVmLnRtX3lkYXkgPCAwIHx8IGJ1Zi50bV95ZGF5ID4gMzY1KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF5IG9mIHllYXIgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoYnVmLnRtX2lzZHN0IDwgLTEgfHwgYnVmLnRtX2lzZHN0ID4gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkYXlsaWdodCBzYXZpbmdzIGZsYWcgb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZtdGxlbiA9IHN0cmxlbihmbXQpOworCisgICAgLyogSSBoYXRlIHRoZXNlIGZ1bmN0aW9ucyB0aGF0IHByZXN1bWUgeW91IGtub3cgaG93IGJpZyB0aGUgb3V0cHV0CisgICAgICogd2lsbCBiZSBhaGVhZCBvZiB0aW1lLi4uCisgICAgICovCisgICAgZm9yIChpID0gMTAyNDsgOyBpICs9IGkpIHsKKyAgICAgICAgb3V0YnVmID0gKGNoYXIgKiltYWxsb2MoaSk7CisgICAgICAgIGlmIChvdXRidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgIH0KLQlpZiAoYnVmLnRtX21kYXkgPT0gMCkKLQkgICAgYnVmLnRtX21kYXkgPSAxOwotCWVsc2UgaWYgKGJ1Zi50bV9tZGF5IDwgMCB8fCBidWYudG1fbWRheSA+IDMxKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRheSBvZiBtb250aCBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBidWZsZW4gPSBzdHJmdGltZShvdXRidWYsIGksIGZtdCwgJmJ1Zik7CisgICAgICAgIGlmIChidWZsZW4gPiAwIHx8IGkgPj0gMjU2ICogZm10bGVuKSB7CisgICAgICAgICAgICAvKiBJZiB0aGUgYnVmZmVyIGlzIDI1NiB0aW1lcyBhcyBsb25nIGFzIHRoZSBmb3JtYXQsCisgICAgICAgICAgICAgICBpdCdzIHByb2JhYmx5IG5vdCBmYWlsaW5nIGZvciBsYWNrIG9mIHJvb20hCisgICAgICAgICAgICAgICBNb3JlIGxpa2VseSwgdGhlIGZvcm1hdCB5aWVsZHMgYW4gZW1wdHkgcmVzdWx0LAorICAgICAgICAgICAgICAgZS5nLiBhbiBlbXB0eSBmb3JtYXQsIG9yICVaIHdoZW4gdGhlIHRpbWV6b25lCisgICAgICAgICAgICAgICBpcyB1bmtub3duLiAqLworICAgICAgICAgICAgUHlPYmplY3QgKnJldDsKKyAgICAgICAgICAgIHJldCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG91dGJ1ZiwgYnVmbGVuKTsKKyAgICAgICAgICAgIGZyZWUob3V0YnVmKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJ1Zi50bV9ob3VyIDwgMCB8fCBidWYudG1faG91ciA+IDIzKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImhvdXIgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmLnRtX21pbiA8IDAgfHwgYnVmLnRtX21pbiA+IDU5KSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1pbnV0ZSBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChidWYudG1fc2VjIDwgMCB8fCBidWYudG1fc2VjID4gNjEpIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2Vjb25kcyBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIC8qIHRtX3dkYXkgZG9lcyBub3QgbmVlZCBjaGVja2luZyBvZiBpdHMgdXBwZXItYm91bmQgc2luY2UgdGFraW5nCi0gICAgICAgIGBgJSA3YGAgaW4gZ2V0dG1hcmcoKSBhdXRvbWF0aWNhbGx5IHJlc3RyaWN0cyB0aGUgcmFuZ2UuICovCi0gICAgICAgIGlmIChidWYudG1fd2RheSA8IDApIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZGF5IG9mIHdlZWsgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCWlmIChidWYudG1feWRheSA9PSAtMSkKLQkgICAgYnVmLnRtX3lkYXkgPSAwOwotCWVsc2UgaWYgKGJ1Zi50bV95ZGF5IDwgMCB8fCBidWYudG1feWRheSA+IDM2NSkgewotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXkgb2YgeWVhciBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChidWYudG1faXNkc3QgPCAtMSB8fCBidWYudG1faXNkc3QgPiAxKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF5bGlnaHQgc2F2aW5ncyBmbGFnIG91dCBvZiByYW5nZSIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotCWZtdGxlbiA9IHN0cmxlbihmbXQpOwotCi0JLyogSSBoYXRlIHRoZXNlIGZ1bmN0aW9ucyB0aGF0IHByZXN1bWUgeW91IGtub3cgaG93IGJpZyB0aGUgb3V0cHV0Ci0JICogd2lsbCBiZSBhaGVhZCBvZiB0aW1lLi4uCi0JICovCi0JZm9yIChpID0gMTAyNDsgOyBpICs9IGkpIHsKLQkJb3V0YnVmID0gKGNoYXIgKiltYWxsb2MoaSk7Ci0JCWlmIChvdXRidWYgPT0gTlVMTCkgewotCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCX0KLQkJYnVmbGVuID0gc3RyZnRpbWUob3V0YnVmLCBpLCBmbXQsICZidWYpOwotCQlpZiAoYnVmbGVuID4gMCB8fCBpID49IDI1NiAqIGZtdGxlbikgewotCQkJLyogSWYgdGhlIGJ1ZmZlciBpcyAyNTYgdGltZXMgYXMgbG9uZyBhcyB0aGUgZm9ybWF0LAotCQkJICAgaXQncyBwcm9iYWJseSBub3QgZmFpbGluZyBmb3IgbGFjayBvZiByb29tIQotCQkJICAgTW9yZSBsaWtlbHksIHRoZSBmb3JtYXQgeWllbGRzIGFuIGVtcHR5IHJlc3VsdCwKLQkJCSAgIGUuZy4gYW4gZW1wdHkgZm9ybWF0LCBvciAlWiB3aGVuIHRoZSB0aW1lem9uZQotCQkJICAgaXMgdW5rbm93bi4gKi8KLQkJCVB5T2JqZWN0ICpyZXQ7Ci0JCQlyZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvdXRidWYsIGJ1Zmxlbik7Ci0JCQlmcmVlKG91dGJ1Zik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWZyZWUob3V0YnVmKTsKKyAgICAgICAgZnJlZShvdXRidWYpOwogI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTQwMCAmJiBkZWZpbmVkKF9fU1REQ19TRUNVUkVfTElCX18pCi0JCS8qIFZpc3VhbFN0dWRpbyAuTkVUIDIwMDUgZG9lcyB0aGlzIHByb3Blcmx5ICovCi0JCWlmIChidWZsZW4gPT0gMCAmJiBlcnJubyA9PSBFSU5WQUwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW52YWxpZCBmb3JtYXQgc3RyaW5nIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQorICAgICAgICAvKiBWaXN1YWxTdHVkaW8gLk5FVCAyMDA1IGRvZXMgdGhpcyBwcm9wZXJseSAqLworICAgICAgICBpZiAoYnVmbGVuID09IDAgJiYgZXJybm8gPT0gRUlOVkFMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkludmFsaWQgZm9ybWF0IHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICNlbmRpZgotCQkKLQl9CisKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihzdHJmdGltZV9kb2MsCkBAIC01MTksNyArNTE5LDcgQEAKICAgICBQeU9iamVjdCAqc3RycHRpbWVfcmVzdWx0OwogCiAgICAgaWYgKCFzdHJwdGltZV9tb2R1bGUpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIHN0cnB0aW1lX3Jlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3RycHRpbWVfbW9kdWxlLCAiX3N0cnB0aW1lX3RpbWUiLCAiTyIsIGFyZ3MpOwogICAgIFB5X0RFQ1JFRihzdHJwdGltZV9tb2R1bGUpOwogICAgIHJldHVybiBzdHJwdGltZV9yZXN1bHQ7CkBAIC01MzUsMjAgKzUzNSwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfYXNjdGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnR1cCA9IE5VTEw7Ci0Jc3RydWN0IHRtIGJ1ZjsKLQljaGFyICpwOwotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImFzY3RpbWUiLCAwLCAxLCAmdHVwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHR1cCA9PSBOVUxMKSB7Ci0JCXRpbWVfdCB0dCA9IHRpbWUoTlVMTCk7Ci0JCWJ1ZiA9ICpsb2NhbHRpbWUoJnR0KTsKLQl9IGVsc2UgaWYgKCFnZXR0bWFyZyh0dXAsICZidWYpKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gYXNjdGltZSgmYnVmKTsKLQlpZiAocFsyNF0gPT0gJ1xuJykKLQkJcFsyNF0gPSAnXDAnOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHApOworICAgIFB5T2JqZWN0ICp0dXAgPSBOVUxMOworICAgIHN0cnVjdCB0bSBidWY7CisgICAgY2hhciAqcDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJhc2N0aW1lIiwgMCwgMSwgJnR1cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh0dXAgPT0gTlVMTCkgeworICAgICAgICB0aW1lX3QgdHQgPSB0aW1lKE5VTEwpOworICAgICAgICBidWYgPSAqbG9jYWx0aW1lKCZ0dCk7CisgICAgfSBlbHNlIGlmICghZ2V0dG1hcmcodHVwLCAmYnVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IGFzY3RpbWUoJmJ1Zik7CisgICAgaWYgKHBbMjRdID09ICdcbicpCisgICAgICAgIHBbMjRdID0gJ1wwJzsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhwKTsKIH0KIAogUHlEb2NfU1RSVkFSKGFzY3RpbWVfZG9jLApAQCAtNTYxLDMwICs1NjEsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0aW1lX2N0aW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb3QgPSBOVUxMOwotCXRpbWVfdCB0dDsKLQljaGFyICpwOworICAgIFB5T2JqZWN0ICpvdCA9IE5VTEw7CisgICAgdGltZV90IHR0OworICAgIGNoYXIgKnA7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJjdGltZSIsIDAsIDEsICZvdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChvdCA9PSBOVUxMIHx8IG90ID09IFB5X05vbmUpCi0JCXR0ID0gdGltZShOVUxMKTsKLQllbHNlIHsKLQkJZG91YmxlIGR0ID0gUHlGbG9hdF9Bc0RvdWJsZShvdCk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXR0ID0gX1B5VGltZV9Eb3VibGVUb1RpbWV0KGR0KTsKLQkJaWYgKHR0ID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlwID0gY3RpbWUoJnR0KTsKLQlpZiAocCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidW5jb252ZXJ0aWJsZSB0aW1lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocFsyNF0gPT0gJ1xuJykKLQkJcFsyNF0gPSAnXDAnOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHApOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImN0aW1lIiwgMCwgMSwgJm90KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG90ID09IE5VTEwgfHwgb3QgPT0gUHlfTm9uZSkKKyAgICAgICAgdHQgPSB0aW1lKE5VTEwpOworICAgIGVsc2UgeworICAgICAgICBkb3VibGUgZHQgPSBQeUZsb2F0X0FzRG91YmxlKG90KTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgdHQgPSBfUHlUaW1lX0RvdWJsZVRvVGltZXQoZHQpOworICAgICAgICBpZiAodHQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHAgPSBjdGltZSgmdHQpOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ1bmNvbnZlcnRpYmxlIHRpbWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwWzI0XSA9PSAnXG4nKQorICAgICAgICBwWzI0XSA9ICdcMCc7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjdGltZV9kb2MsCkBAIC01OTgsMTcgKzU5OCwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfbWt0aW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdHVwKQogewotCXN0cnVjdCB0bSBidWY7Ci0JdGltZV90IHR0OwotCWlmICghZ2V0dG1hcmcodHVwLCAmYnVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdHQgPSBta3RpbWUoJmJ1Zik7Ci0JaWYgKHR0ID09ICh0aW1lX3QpKC0xKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibWt0aW1lIGFyZ3VtZW50IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKXR0KTsKKyAgICBzdHJ1Y3QgdG0gYnVmOworICAgIHRpbWVfdCB0dDsKKyAgICBpZiAoIWdldHRtYXJnKHR1cCwgJmJ1ZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHR0ID0gbWt0aW1lKCZidWYpOworICAgIGlmICh0dCA9PSAodGltZV90KSgtMSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWt0aW1lIGFyZ3VtZW50IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKXR0KTsKIH0KIAogUHlEb2NfU1RSVkFSKG1rdGltZV9kb2MsCkBAIC02MjMsMjEgKzYyMywyMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRpbWVfdHpzZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bnVzZWQpCiB7Ci0JUHlPYmplY3QqIG07CisgICAgUHlPYmplY3QqIG07CiAKLQltID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygidGltZSIpOwotCWlmIChtID09IE5VTEwpIHsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQorICAgIG0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJ0aW1lIik7CisgICAgaWYgKG0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl0enNldCgpOworICAgIHR6c2V0KCk7CiAKLQkvKiBSZXNldCB0aW1lem9uZSwgYWx0em9uZSwgZGF5bGlnaHQgYW5kIHR6bmFtZSAqLwotCWluaXR0aW1lem9uZShtKTsKLQlQeV9ERUNSRUYobSk7CisgICAgLyogUmVzZXQgdGltZXpvbmUsIGFsdHpvbmUsIGRheWxpZ2h0IGFuZCB0em5hbWUgKi8KKyAgICBpbml0dGltZXpvbmUobSk7CisgICAgUHlfREVDUkVGKG0pOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHR6c2V0X2RvYywKQEAgLTY1NywxMTMgKzY1NywxMTMgQEAKIHN0YXRpYyB2b2lkCiBpbml0dGltZXpvbmUoUHlPYmplY3QgKm0pIHsKICAgICAvKiBUaGlzIGNvZGUgbW92ZWQgZnJvbSBpbml0dGltZSB3aG9sZXNhbGUgdG8gYWxsb3cgY2FsbGluZyBpdCBmcm9tCi0JdGltZV90enNldC4gSW4gdGhlIGZ1dHVyZSwgc29tZSBwYXJ0cyBvZiBpdCBjYW4gYmUgbW92ZWQgYmFjawotCShmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgSEFWRV9XT1JLSU5HX1RaU0VULCB3aGVuIHdlIGtub3cgd2hhdCB0aGV5Ci0JYXJlKSwgYW5kIHRoZSBleHRyYW5lb3VzIGNhbGxzIHRvIHR6c2V0KDMpIHNob3VsZCBiZSByZW1vdmVkLgotCUkgaGF2ZW4ndCBkb25lIHRoaXMgeWV0LCBhcyBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoaXMgY29kZSBhcwotCWxpdHRsZSBhcyBwb3NzaWJsZSB3aGVuIGludHJvZHVjaW5nIHRoZSB0aW1lLnR6c2V0IGFuZCB0aW1lLnR6c2V0d2FsbAotCW1ldGhvZHMuIFRoaXMgc2hvdWxkIHNpbXBseSBiZSBhIG1ldGhvZCBvZiBkb2luZyB0aGUgZm9sbG93aW5nIG9uY2UsCi0JYXQgdGhlIHRvcCBvZiB0aGlzIGZ1bmN0aW9uIGFuZCByZW1vdmluZyB0aGUgY2FsbCB0byB0enNldCgpIGZyb20KLQl0aW1lX3R6c2V0KCk6CisgICAgdGltZV90enNldC4gSW4gdGhlIGZ1dHVyZSwgc29tZSBwYXJ0cyBvZiBpdCBjYW4gYmUgbW92ZWQgYmFjaworICAgIChmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgSEFWRV9XT1JLSU5HX1RaU0VULCB3aGVuIHdlIGtub3cgd2hhdCB0aGV5CisgICAgYXJlKSwgYW5kIHRoZSBleHRyYW5lb3VzIGNhbGxzIHRvIHR6c2V0KDMpIHNob3VsZCBiZSByZW1vdmVkLgorICAgIEkgaGF2ZW4ndCBkb25lIHRoaXMgeWV0LCBhcyBJIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoaXMgY29kZSBhcworICAgIGxpdHRsZSBhcyBwb3NzaWJsZSB3aGVuIGludHJvZHVjaW5nIHRoZSB0aW1lLnR6c2V0IGFuZCB0aW1lLnR6c2V0d2FsbAorICAgIG1ldGhvZHMuIFRoaXMgc2hvdWxkIHNpbXBseSBiZSBhIG1ldGhvZCBvZiBkb2luZyB0aGUgZm9sbG93aW5nIG9uY2UsCisgICAgYXQgdGhlIHRvcCBvZiB0aGlzIGZ1bmN0aW9uIGFuZCByZW1vdmluZyB0aGUgY2FsbCB0byB0enNldCgpIGZyb20KKyAgICB0aW1lX3R6c2V0KCk6CiAKLQkgICAgI2lmZGVmIEhBVkVfVFpTRVQKLQkgICAgdHpzZXQoKQotCSAgICAjZW5kaWYKKyAgICAgICAgI2lmZGVmIEhBVkVfVFpTRVQKKyAgICAgICAgdHpzZXQoKQorICAgICAgICAjZW5kaWYKIAotCUFuZCBJJ20gbGF6eSBhbmQgaGF0ZSBDIHNvIG55ZXIuCisgICAgQW5kIEknbSBsYXp5IGFuZCBoYXRlIEMgc28gbnllci4KICAgICAgKi8KICNpZiBkZWZpbmVkKEhBVkVfVFpOQU1FKSAmJiAhZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0JdHpzZXQoKTsKKyAgICB0enNldCgpOwogI2lmZGVmIFBZT1NfT1MyCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgInRpbWV6b25lIiwgX3RpbWV6b25lKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBfdGltZXpvbmUpOwogI2Vsc2UgLyogIVBZT1NfT1MyICovCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgInRpbWV6b25lIiwgdGltZXpvbmUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJ0aW1lem9uZSIsIHRpbWV6b25lKTsKICNlbmRpZiAvKiBQWU9TX09TMiAqLwogI2lmZGVmIEhBVkVfQUxUWk9ORQotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwgYWx0em9uZSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBhbHR6b25lKTsKICNlbHNlCiAjaWZkZWYgUFlPU19PUzIKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIF90aW1lem9uZS0zNjAwKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIF90aW1lem9uZS0zNjAwKTsKICNlbHNlIC8qICFQWU9TX09TMiAqLwotCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwgdGltZXpvbmUtMzYwMCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCB0aW1lem9uZS0zNjAwKTsKICNlbmRpZiAvKiBQWU9TX09TMiAqLwogI2VuZGlmCi0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRheWxpZ2h0IiwgZGF5bGlnaHQpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidHpuYW1lIiwKLQkJCSAgIFB5X0J1aWxkVmFsdWUoIih6eikiLCB0em5hbWVbMF0sIHR6bmFtZVsxXSkpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJkYXlsaWdodCIsIGRheWxpZ2h0KTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInR6bmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIih6eikiLCB0em5hbWVbMF0sIHR6bmFtZVsxXSkpOwogI2Vsc2UgLyogIUhBVkVfVFpOQU1FIHx8IF9fR0xJQkNfXyB8fCBfX0NZR1dJTl9fKi8KICNpZmRlZiBIQVZFX1NUUlVDVF9UTV9UTV9aT05FCi0JeworICAgIHsKICNkZWZpbmUgWUVBUiAoKHRpbWVfdCkoKDM2NSAqIDI0ICsgNikgKiAzNjAwKSkKLQkJdGltZV90IHQ7Ci0JCXN0cnVjdCB0bSAqcDsKLQkJbG9uZyBqYW56b25lLCBqdWx5em9uZTsKLQkJY2hhciBqYW5uYW1lWzEwXSwganVseW5hbWVbMTBdOwotCQl0ID0gKHRpbWUoKHRpbWVfdCAqKTApIC8gWUVBUikgKiBZRUFSOwotCQlwID0gbG9jYWx0aW1lKCZ0KTsKLQkJamFuem9uZSA9IC1wLT50bV9nbXRvZmY7Ci0JCXN0cm5jcHkoamFubmFtZSwgcC0+dG1fem9uZSA/IHAtPnRtX3pvbmUgOiAiICAgIiwgOSk7Ci0JCWphbm5hbWVbOV0gPSAnXDAnOwotCQl0ICs9IFlFQVIvMjsKLQkJcCA9IGxvY2FsdGltZSgmdCk7Ci0JCWp1bHl6b25lID0gLXAtPnRtX2dtdG9mZjsKLQkJc3RybmNweShqdWx5bmFtZSwgcC0+dG1fem9uZSA/IHAtPnRtX3pvbmUgOiAiICAgIiwgOSk7Ci0JCWp1bHluYW1lWzldID0gJ1wwJzsKKyAgICAgICAgdGltZV90IHQ7CisgICAgICAgIHN0cnVjdCB0bSAqcDsKKyAgICAgICAgbG9uZyBqYW56b25lLCBqdWx5em9uZTsKKyAgICAgICAgY2hhciBqYW5uYW1lWzEwXSwganVseW5hbWVbMTBdOworICAgICAgICB0ID0gKHRpbWUoKHRpbWVfdCAqKTApIC8gWUVBUikgKiBZRUFSOworICAgICAgICBwID0gbG9jYWx0aW1lKCZ0KTsKKyAgICAgICAgamFuem9uZSA9IC1wLT50bV9nbXRvZmY7CisgICAgICAgIHN0cm5jcHkoamFubmFtZSwgcC0+dG1fem9uZSA/IHAtPnRtX3pvbmUgOiAiICAgIiwgOSk7CisgICAgICAgIGphbm5hbWVbOV0gPSAnXDAnOworICAgICAgICB0ICs9IFlFQVIvMjsKKyAgICAgICAgcCA9IGxvY2FsdGltZSgmdCk7CisgICAgICAgIGp1bHl6b25lID0gLXAtPnRtX2dtdG9mZjsKKyAgICAgICAgc3RybmNweShqdWx5bmFtZSwgcC0+dG1fem9uZSA/IHAtPnRtX3pvbmUgOiAiICAgIiwgOSk7CisgICAgICAgIGp1bHluYW1lWzldID0gJ1wwJzsKIAotCQlpZiggamFuem9uZSA8IGp1bHl6b25lICkgewotCQkJLyogRFNUIGlzIHJldmVyc2VkIGluIHRoZSBzb3V0aGVybiBoZW1pc3BoZXJlICovCi0JCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBqdWx5em9uZSk7Ci0JCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIGphbnpvbmUpOwotCQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRheWxpZ2h0IiwKLQkJCQkJCWphbnpvbmUgIT0ganVseXpvbmUpOwotCQkJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0em5hbWUiLAotCQkJCQkgICBQeV9CdWlsZFZhbHVlKCIoenopIiwKLQkJCQkJCQkganVseW5hbWUsIGphbm5hbWUpKTsKLQkJfSBlbHNlIHsKLQkJCVB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJ0aW1lem9uZSIsIGphbnpvbmUpOwotCQkJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBqdWx5em9uZSk7Ci0JCQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGF5bGlnaHQiLAotCQkJCQkJamFuem9uZSAhPSBqdWx5em9uZSk7Ci0JCQlQeU1vZHVsZV9BZGRPYmplY3QobSwgInR6bmFtZSIsCi0JCQkJCSAgIFB5X0J1aWxkVmFsdWUoIih6eikiLAotCQkJCQkJCSBqYW5uYW1lLCBqdWx5bmFtZSkpOwotCQl9Ci0JfQorICAgICAgICBpZiggamFuem9uZSA8IGp1bHl6b25lICkgeworICAgICAgICAgICAgLyogRFNUIGlzIHJldmVyc2VkIGluIHRoZSBzb3V0aGVybiBoZW1pc3BoZXJlICovCisgICAgICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBqdWx5em9uZSk7CisgICAgICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIGphbnpvbmUpOworICAgICAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImRheWxpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphbnpvbmUgIT0ganVseXpvbmUpOworICAgICAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0em5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0J1aWxkVmFsdWUoIih6eikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVseW5hbWUsIGphbm5hbWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJ0aW1lem9uZSIsIGphbnpvbmUpOworICAgICAgICAgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFsdHpvbmUiLCBqdWx5em9uZSk7CisgICAgICAgICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGF5bGlnaHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFuem9uZSAhPSBqdWx5em9uZSk7CisgICAgICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInR6bmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfQnVpbGRWYWx1ZSgiKHp6KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYW5uYW1lLCBqdWx5bmFtZSkpOworICAgICAgICB9CisgICAgfQogI2Vsc2UKICNlbmRpZiAvKiBIQVZFX1NUUlVDVF9UTV9UTV9aT05FICovCiAjaWZkZWYgX19DWUdXSU5fXwotCXR6c2V0KCk7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgInRpbWV6b25lIiwgX3RpbWV6b25lKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiYWx0em9uZSIsIF90aW1lem9uZS0zNjAwKTsKLQlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiZGF5bGlnaHQiLCBfZGF5bGlnaHQpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAidHpuYW1lIiwKLQkJCSAgIFB5X0J1aWxkVmFsdWUoIih6eikiLCBfdHpuYW1lWzBdLCBfdHpuYW1lWzFdKSk7CisgICAgdHpzZXQoKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAidGltZXpvbmUiLCBfdGltZXpvbmUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJhbHR6b25lIiwgX3RpbWV6b25lLTM2MDApOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJkYXlsaWdodCIsIF9kYXlsaWdodCk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJ0em5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCIoenopIiwgX3R6bmFtZVswXSwgX3R6bmFtZVsxXSkpOwogI2VuZGlmIC8qIF9fQ1lHV0lOX18gKi8KICNlbmRpZiAvKiAhSEFWRV9UWk5BTUUgfHwgX19HTElCQ19fIHx8IF9fQ1lHV0lOX18qLwogfQogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0aW1lX21ldGhvZHNbXSA9IHsKLQl7InRpbWUiLAl0aW1lX3RpbWUsIE1FVEhfTk9BUkdTLCB0aW1lX2RvY30sCisgICAgeyJ0aW1lIiwgICAgICAgICAgICB0aW1lX3RpbWUsIE1FVEhfTk9BUkdTLCB0aW1lX2RvY30sCiAjaWZkZWYgSEFWRV9DTE9DSwotCXsiY2xvY2siLAl0aW1lX2Nsb2NrLCBNRVRIX05PQVJHUywgY2xvY2tfZG9jfSwKKyAgICB7ImNsb2NrIiwgICAgICAgICAgIHRpbWVfY2xvY2ssIE1FVEhfTk9BUkdTLCBjbG9ja19kb2N9LAogI2VuZGlmCi0JeyJzbGVlcCIsCXRpbWVfc2xlZXAsIE1FVEhfVkFSQVJHUywgc2xlZXBfZG9jfSwKLQl7ImdtdGltZSIsCXRpbWVfZ210aW1lLCBNRVRIX1ZBUkFSR1MsIGdtdGltZV9kb2N9LAotCXsibG9jYWx0aW1lIiwJdGltZV9sb2NhbHRpbWUsIE1FVEhfVkFSQVJHUywgbG9jYWx0aW1lX2RvY30sCi0JeyJhc2N0aW1lIiwJdGltZV9hc2N0aW1lLCBNRVRIX1ZBUkFSR1MsIGFzY3RpbWVfZG9jfSwKLQl7ImN0aW1lIiwJdGltZV9jdGltZSwgTUVUSF9WQVJBUkdTLCBjdGltZV9kb2N9LAorICAgIHsic2xlZXAiLCAgICAgICAgICAgdGltZV9zbGVlcCwgTUVUSF9WQVJBUkdTLCBzbGVlcF9kb2N9LAorICAgIHsiZ210aW1lIiwgICAgICAgICAgdGltZV9nbXRpbWUsIE1FVEhfVkFSQVJHUywgZ210aW1lX2RvY30sCisgICAgeyJsb2NhbHRpbWUiLCAgICAgICB0aW1lX2xvY2FsdGltZSwgTUVUSF9WQVJBUkdTLCBsb2NhbHRpbWVfZG9jfSwKKyAgICB7ImFzY3RpbWUiLCAgICAgICAgIHRpbWVfYXNjdGltZSwgTUVUSF9WQVJBUkdTLCBhc2N0aW1lX2RvY30sCisgICAgeyJjdGltZSIsICAgICAgICAgICB0aW1lX2N0aW1lLCBNRVRIX1ZBUkFSR1MsIGN0aW1lX2RvY30sCiAjaWZkZWYgSEFWRV9NS1RJTUUKLQl7Im1rdGltZSIsCXRpbWVfbWt0aW1lLCBNRVRIX08sIG1rdGltZV9kb2N9LAorICAgIHsibWt0aW1lIiwgICAgICAgICAgdGltZV9ta3RpbWUsIE1FVEhfTywgbWt0aW1lX2RvY30sCiAjZW5kaWYKICNpZmRlZiBIQVZFX1NUUkZUSU1FCi0JeyJzdHJmdGltZSIsCXRpbWVfc3RyZnRpbWUsIE1FVEhfVkFSQVJHUywgc3RyZnRpbWVfZG9jfSwKKyAgICB7InN0cmZ0aW1lIiwgICAgICAgIHRpbWVfc3RyZnRpbWUsIE1FVEhfVkFSQVJHUywgc3RyZnRpbWVfZG9jfSwKICNlbmRpZgotCXsic3RycHRpbWUiLAl0aW1lX3N0cnB0aW1lLCBNRVRIX1ZBUkFSR1MsIHN0cnB0aW1lX2RvY30sCisgICAgeyJzdHJwdGltZSIsICAgICAgICB0aW1lX3N0cnB0aW1lLCBNRVRIX1ZBUkFSR1MsIHN0cnB0aW1lX2RvY30sCiAjaWZkZWYgSEFWRV9XT1JLSU5HX1RaU0VUCi0JeyJ0enNldCIsCXRpbWVfdHpzZXQsIE1FVEhfTk9BUkdTLCB0enNldF9kb2N9LAorICAgIHsidHpzZXQiLCAgICAgICAgICAgdGltZV90enNldCwgTUVUSF9OT0FSR1MsIHR6c2V0X2RvY30sCiAjZW5kaWYKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKQEAgLTgxNiwzOCArODE2LDM4IEBACiBQeU1PRElOSVRfRlVOQwogaW5pdHRpbWUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQljaGFyICpwOwotCW0gPSBQeV9Jbml0TW9kdWxlMygidGltZSIsIHRpbWVfbWV0aG9kcywgbW9kdWxlX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptOworICAgIGNoYXIgKnA7CisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJ0aW1lIiwgdGltZV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBY2NlcHQgMi1kaWdpdCBkYXRlcyB1bmxlc3MgUFlUSE9OWTJLIGlzIHNldCBhbmQgbm9uLWVtcHR5ICovCi0JcCA9IFB5X0dFVEVOVigiUFlUSE9OWTJLIik7Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFjY2VwdDJkeWVhciIsIChsb25nKSAoIXAgfHwgISpwKSk7Ci0JLyogU3F1aXJyZWwgYXdheSB0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBmb3IgdGhlIHkyayBjaGVjayAqLwotCW1vZGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVB5X0lOQ1JFRihtb2RkaWN0KTsKKyAgICAvKiBBY2NlcHQgMi1kaWdpdCBkYXRlcyB1bmxlc3MgUFlUSE9OWTJLIGlzIHNldCBhbmQgbm9uLWVtcHR5ICovCisgICAgcCA9IFB5X0dFVEVOVigiUFlUSE9OWTJLIik7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgImFjY2VwdDJkeWVhciIsIChsb25nKSAoIXAgfHwgISpwKSk7CisgICAgLyogU3F1aXJyZWwgYXdheSB0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBmb3IgdGhlIHkyayBjaGVjayAqLworICAgIG1vZGRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFB5X0lOQ1JFRihtb2RkaWN0KTsKIAotCS8qIFNldCwgb3IgcmVzZXQsIG1vZHVsZSB2YXJpYWJsZXMgbGlrZSB0aW1lLnRpbWV6b25lICovCi0JaW5pdHRpbWV6b25lKG0pOworICAgIC8qIFNldCwgb3IgcmVzZXQsIG1vZHVsZSB2YXJpYWJsZXMgbGlrZSB0aW1lLnRpbWV6b25lICovCisgICAgaW5pdHRpbWV6b25lKG0pOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCS8qIEhlbHBlciB0byBhbGxvdyBpbnRlcnJ1cHRzIGZvciBXaW5kb3dzLgotCSAgIElmIEN0cmwrQyBldmVudCBkZWxpdmVyZWQgd2hpbGUgbm90IHNsZWVwaW5nCi0JICAgaXQgd2lsbCBiZSBpZ25vcmVkLgotCSovCi0JbWFpbl90aHJlYWQgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7Ci0JaEludGVycnVwdEV2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOwotCVNldENvbnNvbGVDdHJsSGFuZGxlciggUHlDdHJsSGFuZGxlciwgVFJVRSk7CisgICAgLyogSGVscGVyIHRvIGFsbG93IGludGVycnVwdHMgZm9yIFdpbmRvd3MuCisgICAgICAgSWYgQ3RybCtDIGV2ZW50IGRlbGl2ZXJlZCB3aGlsZSBub3Qgc2xlZXBpbmcKKyAgICAgICBpdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgKi8KKyAgICBtYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBoSW50ZXJydXB0RXZlbnQgPSBDcmVhdGVFdmVudChOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCk7CisgICAgU2V0Q29uc29sZUN0cmxIYW5kbGVyKCBQeUN0cmxIYW5kbGVyLCBUUlVFKTsKICNlbmRpZiAvKiBNU19XSU5ET1dTICovCi0JaWYgKCFpbml0aWFsaXplZCkgewotCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZTdHJ1Y3RUaW1lVHlwZSwKLQkJCQkJICAmc3RydWN0X3RpbWVfdHlwZV9kZXNjKTsKLQl9Ci0JUHlfSU5DUkVGKCZTdHJ1Y3RUaW1lVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzdHJ1Y3RfdGltZSIsIChQeU9iamVjdCopICZTdHJ1Y3RUaW1lVHlwZSk7Ci0JaW5pdGlhbGl6ZWQgPSAxOworICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RydWN0VGltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cnVjdF90aW1lX3R5cGVfZGVzYyk7CisgICAgfQorICAgIFB5X0lOQ1JFRigmU3RydWN0VGltZVR5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3RydWN0X3RpbWUiLCAoUHlPYmplY3QqKSAmU3RydWN0VGltZVR5cGUpOworICAgIGluaXRpYWxpemVkID0gMTsKIH0KIAogCkBAIC04NTYsMzggKzg1NiwzOCBAQAogc3RhdGljIGRvdWJsZQogZmxvYXR0aW1lKHZvaWQpCiB7Ci0JLyogVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gZ2V0IHRoZSB0aW1lOgotCSAgKDEpIGdldHRpbWVvZmRheSgpIC0tIHJlc29sdXRpb24gaW4gbWljcm9zZWNvbmRzCi0JICAoMikgZnRpbWUoKSAtLSByZXNvbHV0aW9uIGluIG1pbGxpc2Vjb25kcwotCSAgKDMpIHRpbWUoKSAtLSByZXNvbHV0aW9uIGluIHNlY29uZHMKLQkgIEluIGFsbCBjYXNlcyB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgZmxvYXQgaW4gc2Vjb25kcy4KLQkgIFNpbmNlIG9uIHNvbWUgc3lzdGVtcyAoZS5nLiBTQ08gT0RUIDMuMCkgZ2V0dGltZW9mZGF5KCkgbWF5Ci0JICBmYWlsLCBzbyB3ZSBmYWxsIGJhY2sgb24gZnRpbWUoKSBvciB0aW1lKCkuCi0JICBOb3RlOiBjbG9jayByZXNvbHV0aW9uIGRvZXMgbm90IGltcGx5IGNsb2NrIGFjY3VyYWN5ISAqLworICAgIC8qIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGdldCB0aGUgdGltZToKKyAgICAgICgxKSBnZXR0aW1lb2ZkYXkoKSAtLSByZXNvbHV0aW9uIGluIG1pY3Jvc2Vjb25kcworICAgICAgKDIpIGZ0aW1lKCkgLS0gcmVzb2x1dGlvbiBpbiBtaWxsaXNlY29uZHMKKyAgICAgICgzKSB0aW1lKCkgLS0gcmVzb2x1dGlvbiBpbiBzZWNvbmRzCisgICAgICBJbiBhbGwgY2FzZXMgdGhlIHJldHVybiB2YWx1ZSBpcyBhIGZsb2F0IGluIHNlY29uZHMuCisgICAgICBTaW5jZSBvbiBzb21lIHN5c3RlbXMgKGUuZy4gU0NPIE9EVCAzLjApIGdldHRpbWVvZmRheSgpIG1heQorICAgICAgZmFpbCwgc28gd2UgZmFsbCBiYWNrIG9uIGZ0aW1lKCkgb3IgdGltZSgpLgorICAgICAgTm90ZTogY2xvY2sgcmVzb2x1dGlvbiBkb2VzIG5vdCBpbXBseSBjbG9jayBhY2N1cmFjeSEgKi8KICNpZmRlZiBIQVZFX0dFVFRJTUVPRkRBWQotCXsKLQkJc3RydWN0IHRpbWV2YWwgdDsKKyAgICB7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHQ7CiAjaWZkZWYgR0VUVElNRU9GREFZX05PX1RaCi0JCWlmIChnZXR0aW1lb2ZkYXkoJnQpID09IDApCi0JCQlyZXR1cm4gKGRvdWJsZSl0LnR2X3NlYyArIHQudHZfdXNlYyowLjAwMDAwMTsKKyAgICAgICAgaWYgKGdldHRpbWVvZmRheSgmdCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAoZG91YmxlKXQudHZfc2VjICsgdC50dl91c2VjKjAuMDAwMDAxOwogI2Vsc2UgLyogIUdFVFRJTUVPRkRBWV9OT19UWiAqLwotCQlpZiAoZ2V0dGltZW9mZGF5KCZ0LCAoc3RydWN0IHRpbWV6b25lICopTlVMTCkgPT0gMCkKLQkJCXJldHVybiAoZG91YmxlKXQudHZfc2VjICsgdC50dl91c2VjKjAuMDAwMDAxOworICAgICAgICBpZiAoZ2V0dGltZW9mZGF5KCZ0LCAoc3RydWN0IHRpbWV6b25lICopTlVMTCkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAoZG91YmxlKXQudHZfc2VjICsgdC50dl91c2VjKjAuMDAwMDAxOwogI2VuZGlmIC8qICFHRVRUSU1FT0ZEQVlfTk9fVFogKi8KLQl9CisgICAgfQogCiAjZW5kaWYgLyogIUhBVkVfR0VUVElNRU9GREFZICovCi0JeworICAgIHsKICNpZiBkZWZpbmVkKEhBVkVfRlRJTUUpCi0JCXN0cnVjdCB0aW1lYiB0OwotCQlmdGltZSgmdCk7Ci0JCXJldHVybiAoZG91YmxlKXQudGltZSArIChkb3VibGUpdC5taWxsaXRtICogKGRvdWJsZSkwLjAwMTsKKyAgICAgICAgc3RydWN0IHRpbWViIHQ7CisgICAgICAgIGZ0aW1lKCZ0KTsKKyAgICAgICAgcmV0dXJuIChkb3VibGUpdC50aW1lICsgKGRvdWJsZSl0Lm1pbGxpdG0gKiAoZG91YmxlKTAuMDAxOwogI2Vsc2UgLyogIUhBVkVfRlRJTUUgKi8KLQkJdGltZV90IHNlY3M7Ci0JCXRpbWUoJnNlY3MpOwotCQlyZXR1cm4gKGRvdWJsZSlzZWNzOworICAgICAgICB0aW1lX3Qgc2VjczsKKyAgICAgICAgdGltZSgmc2Vjcyk7CisgICAgICAgIHJldHVybiAoZG91YmxlKXNlY3M7CiAjZW5kaWYgLyogIUhBVkVfRlRJTUUgKi8KLQl9CisgICAgfQogfQogCiAKQEAgLTkwMCwxMjIgKzkwMCwxMjIgQEAKIHsKIC8qIFhYWCBTaG91bGQgdGVzdCBmb3IgTVNfV0lORE9XUyBmaXJzdCEgKi8KICNpZiBkZWZpbmVkKEhBVkVfU0VMRUNUKSAmJiAhZGVmaW5lZChfX0JFT1NfXykgJiYgIWRlZmluZWQoX19FTVhfXykKLQlzdHJ1Y3QgdGltZXZhbCB0OwotCWRvdWJsZSBmcmFjOwotCWZyYWMgPSBmbW9kKHNlY3MsIDEuMCk7Ci0Jc2VjcyA9IGZsb29yKHNlY3MpOwotCXQudHZfc2VjID0gKGxvbmcpc2VjczsKLQl0LnR2X3VzZWMgPSAobG9uZykoZnJhYyoxMDAwMDAwLjApOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlpZiAoc2VsZWN0KDAsIChmZF9zZXQgKikwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsICZ0KSAhPSAwKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdDsKKyAgICBkb3VibGUgZnJhYzsKKyAgICBmcmFjID0gZm1vZChzZWNzLCAxLjApOworICAgIHNlY3MgPSBmbG9vcihzZWNzKTsKKyAgICB0LnR2X3NlYyA9IChsb25nKXNlY3M7CisgICAgdC50dl91c2VjID0gKGxvbmcpKGZyYWMqMTAwMDAwMC4wKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgaWYgKHNlbGVjdCgwLCAoZmRfc2V0ICopMCwgKGZkX3NldCAqKTAsIChmZF9zZXQgKikwLCAmdCkgIT0gMCkgewogI2lmZGVmIEVJTlRSCi0JCWlmIChlcnJubyAhPSBFSU5UUikgeworICAgICAgICBpZiAoZXJybm8gIT0gRUlOVFIpIHsKICNlbHNlCi0JCWlmICgxKSB7CisgICAgICAgIGlmICgxKSB7CiAjZW5kaWYKLQkJCVB5X0JMT0NLX1RIUkVBRFMKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZWxpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKSAmJiAhZGVmaW5lZChfX1FOWF9fKQotCS8qIFhYWCBDYW4ndCBpbnRlcnJ1cHQgdGhpcyBzbGVlcCAqLwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlkZWxheSgoaW50KShzZWNzICogMTAwMCArIDAuNSkpOyAgLyogZGVsYXkoKSB1c2VzIG1pbGxpc2Vjb25kcyAqLwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgLyogWFhYIENhbid0IGludGVycnVwdCB0aGlzIHNsZWVwICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGRlbGF5KChpbnQpKHNlY3MgKiAxMDAwICsgMC41KSk7ICAvKiBkZWxheSgpIHVzZXMgbWlsbGlzZWNvbmRzICovCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICNlbGlmIGRlZmluZWQoTVNfV0lORE9XUykKLQl7Ci0JCWRvdWJsZSBtaWxsaXNlY3MgPSBzZWNzICogMTAwMC4wOwotCQl1bnNpZ25lZCBsb25nIHVsX21pbGxpczsKKyAgICB7CisgICAgICAgIGRvdWJsZSBtaWxsaXNlY3MgPSBzZWNzICogMTAwMC4wOworICAgICAgICB1bnNpZ25lZCBsb25nIHVsX21pbGxpczsKIAotCQlpZiAobWlsbGlzZWNzID4gKGRvdWJsZSlVTE9OR19NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkic2xlZXAgbGVuZ3RoIGlzIHRvbyBsYXJnZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJLyogQWxsb3cgc2xlZXAoMCkgdG8gbWFpbnRhaW4gd2luMzIgc2VtYW50aWNzLCBhbmQgYXMgZGVjcmVlZAotCQkgKiBieSBHdWlkbywgb25seSB0aGUgbWFpbiB0aHJlYWQgY2FuIGJlIGludGVycnVwdGVkLgotCQkgKi8KLQkJdWxfbWlsbGlzID0gKHVuc2lnbmVkIGxvbmcpbWlsbGlzZWNzOwotCQlpZiAodWxfbWlsbGlzID09IDAgfHwKLQkJICAgIG1haW5fdGhyZWFkICE9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkKLQkJCVNsZWVwKHVsX21pbGxpcyk7Ci0JCWVsc2UgewotCQkJRFdPUkQgcmM7Ci0JCQlSZXNldEV2ZW50KGhJbnRlcnJ1cHRFdmVudCk7Ci0JCQlyYyA9IFdhaXRGb3JTaW5nbGVPYmplY3QoaEludGVycnVwdEV2ZW50LCB1bF9taWxsaXMpOwotCQkJaWYgKHJjID09IFdBSVRfT0JKRUNUXzApIHsKLQkJCQkvKiBZaWVsZCB0byBtYWtlIHN1cmUgcmVhbCBQeXRob24gc2lnbmFsCi0JCQkJICogaGFuZGxlciBjYWxsZWQuCi0JCQkJICovCi0JCQkJU2xlZXAoMSk7Ci0JCQkJUHlfQkxPQ0tfVEhSRUFEUwotCQkJCWVycm5vID0gRUlOVFI7Ci0JCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KKyAgICAgICAgaWYgKG1pbGxpc2VjcyA+IChkb3VibGUpVUxPTkdfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2xlZXAgbGVuZ3RoIGlzIHRvbyBsYXJnZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgLyogQWxsb3cgc2xlZXAoMCkgdG8gbWFpbnRhaW4gd2luMzIgc2VtYW50aWNzLCBhbmQgYXMgZGVjcmVlZAorICAgICAgICAgKiBieSBHdWlkbywgb25seSB0aGUgbWFpbiB0aHJlYWQgY2FuIGJlIGludGVycnVwdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdWxfbWlsbGlzID0gKHVuc2lnbmVkIGxvbmcpbWlsbGlzZWNzOworICAgICAgICBpZiAodWxfbWlsbGlzID09IDAgfHwKKyAgICAgICAgICAgIG1haW5fdGhyZWFkICE9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkKKyAgICAgICAgICAgIFNsZWVwKHVsX21pbGxpcyk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgRFdPUkQgcmM7CisgICAgICAgICAgICBSZXNldEV2ZW50KGhJbnRlcnJ1cHRFdmVudCk7CisgICAgICAgICAgICByYyA9IFdhaXRGb3JTaW5nbGVPYmplY3QoaEludGVycnVwdEV2ZW50LCB1bF9taWxsaXMpOworICAgICAgICAgICAgaWYgKHJjID09IFdBSVRfT0JKRUNUXzApIHsKKyAgICAgICAgICAgICAgICAvKiBZaWVsZCB0byBtYWtlIHN1cmUgcmVhbCBQeXRob24gc2lnbmFsCisgICAgICAgICAgICAgICAgICogaGFuZGxlciBjYWxsZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgU2xlZXAoMSk7CisgICAgICAgICAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgICAgIGVycm5vID0gRUlOVFI7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIH0KICNlbGlmIGRlZmluZWQoUFlPU19PUzIpCi0JLyogVGhpcyBTbGVlcCAqSVMqIEludGVycnVwdGFibGUgYnkgRXhjZXB0aW9ucyAqLwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlpZiAoRG9zU2xlZXAoc2VjcyAqIDEwMDApICE9IE5PX0VSUk9SKSB7Ci0JCVB5X0JMT0NLX1RIUkVBRFMKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgLyogVGhpcyBTbGVlcCAqSVMqIEludGVycnVwdGFibGUgYnkgRXhjZXB0aW9ucyAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAoRG9zU2xlZXAoc2VjcyAqIDEwMDApICE9IE5PX0VSUk9SKSB7CisgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZWxpZiBkZWZpbmVkKF9fQkVPU19fKQotCS8qIFRoaXMgc2xlZXAgKkNBTiBCRSogaW50ZXJydXB0ZWQuICovCi0JewotCQlpZiggc2VjcyA8PSAwLjAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KKyAgICAvKiBUaGlzIHNsZWVwICpDQU4gQkUqIGludGVycnVwdGVkLiAqLworICAgIHsKKyAgICAgICAgaWYoIHNlY3MgPD0gMC4wICkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkvKiBCZU9TIHNub296ZSgpIGlzIGluIG1pY3Jvc2Vjb25kcy4uLiAqLwotCQlpZiggc25vb3plKCAoYmlndGltZV90KSggc2VjcyAqIDEwMDAuMCAqIDEwMDAuMCApICkgPT0gQl9JTlRFUlJVUFRFRCApIHsKLQkJCVB5X0JMT0NLX1RIUkVBRFMKLQkJCVB5RXJyX1NldEZyb21FcnJubyggUHlFeGNfSU9FcnJvciApOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0VORF9BTExPV19USFJFQURTCi0JfQorICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIC8qIEJlT1Mgc25vb3plKCkgaXMgaW4gbWljcm9zZWNvbmRzLi4uICovCisgICAgICAgIGlmKCBzbm9vemUoIChiaWd0aW1lX3QpKCBzZWNzICogMTAwMC4wICogMTAwMC4wICkgKSA9PSBCX0lOVEVSUlVQVEVEICkgeworICAgICAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKCBQeUV4Y19JT0Vycm9yICk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CiAjZWxpZiBkZWZpbmVkKFJJU0NPUykKLQlpZiAoc2VjcyA8PSAwLjApCi0JCXJldHVybiAwOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkvKiBUaGlzIHNsZWVwICpDQU4gQkUqIGludGVycnVwdGVkLiAqLwotCWlmICggcmlzY29zX3NsZWVwKHNlY3MpICkKLQkJcmV0dXJuIC0xOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHNlY3MgPD0gMC4wKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgLyogVGhpcyBzbGVlcCAqQ0FOIEJFKiBpbnRlcnJ1cHRlZC4gKi8KKyAgICBpZiAoIHJpc2Nvc19zbGVlcChzZWNzKSApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogI2VsaWYgZGVmaW5lZChQTEFOOSkKLQl7Ci0JCWRvdWJsZSBtaWxsaXNlY3MgPSBzZWNzICogMTAwMC4wOwotCQlpZiAobWlsbGlzZWNzID4gKGRvdWJsZSlMT05HX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzbGVlcCBsZW5ndGggaXMgdG9vIGxhcmdlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJLyogVGhpcyBzbGVlcCAqQ0FOIEJFKiBpbnRlcnJ1cHRlZC4gKi8KLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlpZihzbGVlcCgobG9uZyltaWxsaXNlY3MpIDwgMCl7Ci0JCQlQeV9CTE9DS19USFJFQURTCi0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl9CisgICAgeworICAgICAgICBkb3VibGUgbWlsbGlzZWNzID0gc2VjcyAqIDEwMDAuMDsKKyAgICAgICAgaWYgKG1pbGxpc2VjcyA+IChkb3VibGUpTE9OR19NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic2xlZXAgbGVuZ3RoIGlzIHRvbyBsYXJnZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIC8qIFRoaXMgc2xlZXAgKkNBTiBCRSogaW50ZXJydXB0ZWQuICovCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYoc2xlZXAoKGxvbmcpbWlsbGlzZWNzKSA8IDApeworICAgICAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQogI2Vsc2UKLQkvKiBYWFggQ2FuJ3QgaW50ZXJydXB0IHRoaXMgc2xlZXAgKi8KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0Jc2xlZXAoKGludClzZWNzKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIC8qIFhYWCBDYW4ndCBpbnRlcnJ1cHQgdGhpcyBzbGVlcCAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBzbGVlcCgoaW50KXNlY3MpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAjZW5kaWYKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvdGltaW5nbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWluZ21vZHVsZS5jCmluZGV4IDBkYTVjNmIuLmE0ZTJjN2UgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGltaW5nbW9kdWxlLmMKKysrIGIvTW9kdWxlcy90aW1pbmdtb2R1bGUuYwpAQCAtMTAsNDUgKzEwLDQ1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RhcnRfdGltaW5nKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlCRUdJTlRJTUlORzsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgQkVHSU5USU1JTkc7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaW5pc2hfdGltaW5nKFB5T2JqZWN0ICpzZWxmKQogewotCUVORFRJTUlORyAgICAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgRU5EVElNSU5HCisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2Vjb25kcyhQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNSU5HUyk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUlOR1MpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWlsbGkoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUlOR01TKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNSU5HTVMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWljcm8oUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKFRJTUlOR1VTKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoVElNSU5HVVMpOwogfQogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0aW1pbmdfbWV0aG9kc1tdID0gewotCXsic3RhcnQiLCAgIChQeUNGdW5jdGlvbilzdGFydF90aW1pbmcsIE1FVEhfTk9BUkdTfSwKLQl7ImZpbmlzaCIsICAoUHlDRnVuY3Rpb24pZmluaXNoX3RpbWluZywgTUVUSF9OT0FSR1N9LAotCXsic2Vjb25kcyIsIChQeUNGdW5jdGlvbilzZWNvbmRzLCBNRVRIX05PQVJHU30sCi0JeyJtaWxsaSIsICAgKFB5Q0Z1bmN0aW9uKW1pbGxpLCBNRVRIX05PQVJHU30sCi0JeyJtaWNybyIsICAgKFB5Q0Z1bmN0aW9uKW1pY3JvLCBNRVRIX05PQVJHU30sCi0Je05VTEwsICAgICAgTlVMTH0KKyAgICB7InN0YXJ0IiwgICAoUHlDRnVuY3Rpb24pc3RhcnRfdGltaW5nLCBNRVRIX05PQVJHU30sCisgICAgeyJmaW5pc2giLCAgKFB5Q0Z1bmN0aW9uKWZpbmlzaF90aW1pbmcsIE1FVEhfTk9BUkdTfSwKKyAgICB7InNlY29uZHMiLCAoUHlDRnVuY3Rpb24pc2Vjb25kcywgTUVUSF9OT0FSR1N9LAorICAgIHsibWlsbGkiLCAgIChQeUNGdW5jdGlvbiltaWxsaSwgTUVUSF9OT0FSR1N9LAorICAgIHsibWljcm8iLCAgIChQeUNGdW5jdGlvbiltaWNybywgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgIE5VTEx9CiB9OwogCiAKQEAgLTU2LDcgKzU2LDcgQEAKIHsKICAgICBpZiAoUHlFcnJfV2FyblB5M2soInRoZSB0aW1pbmcgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAzLjA7IHVzZSB0aW1lLmNsb2NrKCkgaW5zdGVhZCIsIDIpIDwgMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotCSh2b2lkKVB5X0luaXRNb2R1bGUoInRpbWluZyIsIHRpbWluZ19tZXRob2RzKTsKKyAgICByZXR1cm47CisKKyAgICAodm9pZClQeV9Jbml0TW9kdWxlKCJ0aW1pbmciLCB0aW1pbmdfbWV0aG9kcyk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3RrYXBwaW5pdC5jIGIvTW9kdWxlcy90a2FwcGluaXQuYwppbmRleCBkZTA0YjBkLi4wNWM0OGE0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RrYXBwaW5pdC5jCisrKyBiL01vZHVsZXMvdGthcHBpbml0LmMKQEAgLTE5LDEzMSArMTksMTMxIEBACiBpbnQKIFRjbF9BcHBJbml0KFRjbF9JbnRlcnAgKmludGVycCkKIHsKLQlUa19XaW5kb3cgbWFpbl93aW5kb3c7Ci0JY29uc3QgY2hhciAqIF90a2ludGVyX3NraXBfdGtfaW5pdDsKKyAgICBUa19XaW5kb3cgbWFpbl93aW5kb3c7CisgICAgY29uc3QgY2hhciAqIF90a2ludGVyX3NraXBfdGtfaW5pdDsKIAogI2lmZGVmIFRLX0FRVUEKICNpZm5kZWYgTUFYX1BBVEhfTEVOCiAjZGVmaW5lIE1BWF9QQVRIX0xFTiAxMDI0CiAjZW5kaWYKLQljaGFyIHRjbExpYlBhdGhbTUFYX1BBVEhfTEVOXSwgdGtMaWJQYXRoW01BWF9QQVRIX0xFTl07Ci0JVGNsX09iaioJcGF0aFB0cjsKKyAgICBjaGFyIHRjbExpYlBhdGhbTUFYX1BBVEhfTEVOXSwgdGtMaWJQYXRoW01BWF9QQVRIX0xFTl07CisgICAgVGNsX09iaiogICAgICAgICAgICBwYXRoUHRyOwogCi0gICAgICAgIC8qIHByZS0gVGNsX0luaXQgY29kZSBjb3BpZWQgZnJvbSB0a01hY09TWEFwcEluaXQuYyAqLwotCVRrX01hY09TWE9wZW5CdW5kbGVSZXNvdXJjZXMgKGludGVycCwgImNvbS50Y2x0ay50Y2xsaWJyYXJ5IiwKLSAgICAgICAJdGNsTGliUGF0aCwgTUFYX1BBVEhfTEVOLCAwKTsKKyAgICAvKiBwcmUtIFRjbF9Jbml0IGNvZGUgY29waWVkIGZyb20gdGtNYWNPU1hBcHBJbml0LmMgKi8KKyAgICBUa19NYWNPU1hPcGVuQnVuZGxlUmVzb3VyY2VzIChpbnRlcnAsICJjb20udGNsdGsudGNsbGlicmFyeSIsCisgICAgdGNsTGliUGF0aCwgTUFYX1BBVEhfTEVOLCAwKTsKIAotCWlmICh0Y2xMaWJQYXRoWzBdICE9ICdcMCcpIHsKLSAgICAgICAJVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xfbGlicmFyeSIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7Ci0JCVRjbF9TZXRWYXIoaW50ZXJwLCAidGNsRGVmYXVsdExpYnJhcnkiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOwotCQlUY2xfU2V0VmFyKGludGVycCwgInRjbF9wa2dQYXRoIiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKLQl9Ci0JCi0gICAJaWYgKHRjbExpYlBhdGhbMF0gIT0gJ1wwJykgewotCQlUY2xfU2V0VmFyKGludGVycCwgInRjbF9saWJyYXJ5IiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKLQkJVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xEZWZhdWx0TGlicmFyeSIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7Ci0JCVRjbF9TZXRWYXIoaW50ZXJwLCAidGNsX3BrZ1BhdGgiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOwotCX0KKyAgICBpZiAodGNsTGliUGF0aFswXSAhPSAnXDAnKSB7CisgICAgVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xfbGlicmFyeSIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgICAgIFRjbF9TZXRWYXIoaW50ZXJwLCAidGNsRGVmYXVsdExpYnJhcnkiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOworICAgICAgICBUY2xfU2V0VmFyKGludGVycCwgInRjbF9wa2dQYXRoIiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICB9CisKKyAgICBpZiAodGNsTGliUGF0aFswXSAhPSAnXDAnKSB7CisgICAgICAgIFRjbF9TZXRWYXIoaW50ZXJwLCAidGNsX2xpYnJhcnkiLCB0Y2xMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOworICAgICAgICBUY2xfU2V0VmFyKGludGVycCwgInRjbERlZmF1bHRMaWJyYXJ5IiwgdGNsTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICAgICAgVGNsX1NldFZhcihpbnRlcnAsICJ0Y2xfcGtnUGF0aCIsIHRjbExpYlBhdGgsIFRDTF9HTE9CQUxfT05MWSk7CisgICAgfQogI2VuZGlmCi0JaWYgKFRjbF9Jbml0IChpbnRlcnApID09IFRDTF9FUlJPUikKLQkJcmV0dXJuIFRDTF9FUlJPUjsKKyAgICBpZiAoVGNsX0luaXQgKGludGVycCkgPT0gVENMX0VSUk9SKQorICAgICAgICByZXR1cm4gVENMX0VSUk9SOwogCiAjaWZkZWYgVEtfQVFVQQotICAgICAgICAvKiBwcmUtIFRrX0luaXQgY29kZSBjb3BpZWQgZnJvbSB0a01hY09TWEFwcEluaXQuYyAqLwotCVRrX01hY09TWE9wZW5CdW5kbGVSZXNvdXJjZXMgKGludGVycCwgImNvbS50Y2x0ay50a2xpYnJhcnkiLAotICAgICAgICAgICAgdGtMaWJQYXRoLCBNQVhfUEFUSF9MRU4sIDEpOworICAgIC8qIHByZS0gVGtfSW5pdCBjb2RlIGNvcGllZCBmcm9tIHRrTWFjT1NYQXBwSW5pdC5jICovCisgICAgVGtfTWFjT1NYT3BlbkJ1bmRsZVJlc291cmNlcyAoaW50ZXJwLCAiY29tLnRjbHRrLnRrbGlicmFyeSIsCisgICAgICAgIHRrTGliUGF0aCwgTUFYX1BBVEhfTEVOLCAxKTsKIAotCWlmICh0Y2xMaWJQYXRoWzBdICE9ICdcMCcpIHsKLQkJcGF0aFB0ciA9IFRjbF9OZXdTdHJpbmdPYmoodGNsTGliUGF0aCwgLTEpOwotCX0gZWxzZSB7Ci0JCVRjbF9PYmogKnBhdGhQdHIgPSBUY2xHZXRMaWJyYXJ5UGF0aCgpOwotCX0KKyAgICBpZiAodGNsTGliUGF0aFswXSAhPSAnXDAnKSB7CisgICAgICAgIHBhdGhQdHIgPSBUY2xfTmV3U3RyaW5nT2JqKHRjbExpYlBhdGgsIC0xKTsKKyAgICB9IGVsc2UgeworICAgICAgICBUY2xfT2JqICpwYXRoUHRyID0gVGNsR2V0TGlicmFyeVBhdGgoKTsKKyAgICB9CiAKLQlpZiAodGtMaWJQYXRoWzBdICE9ICdcMCcpIHsKLQkJVGNsX09iaiAqb2JqUHRyOworICAgIGlmICh0a0xpYlBhdGhbMF0gIT0gJ1wwJykgeworICAgICAgICBUY2xfT2JqICpvYmpQdHI7CiAKLQkJVGNsX1NldFZhcihpbnRlcnAsICJ0a19saWJyYXJ5IiwgdGtMaWJQYXRoLCBUQ0xfR0xPQkFMX09OTFkpOwotCQlvYmpQdHIgPSBUY2xfTmV3U3RyaW5nT2JqKHRrTGliUGF0aCwgLTEpOwotCQlUY2xfTGlzdE9iakFwcGVuZEVsZW1lbnQoTlVMTCwgcGF0aFB0ciwgb2JqUHRyKTsKLQl9CisgICAgICAgIFRjbF9TZXRWYXIoaW50ZXJwLCAidGtfbGlicmFyeSIsIHRrTGliUGF0aCwgVENMX0dMT0JBTF9PTkxZKTsKKyAgICAgICAgb2JqUHRyID0gVGNsX05ld1N0cmluZ09iaih0a0xpYlBhdGgsIC0xKTsKKyAgICAgICAgVGNsX0xpc3RPYmpBcHBlbmRFbGVtZW50KE5VTEwsIHBhdGhQdHIsIG9ialB0cik7CisgICAgfQogCi0JVGNsU2V0TGlicmFyeVBhdGgocGF0aFB0cik7CisgICAgVGNsU2V0TGlicmFyeVBhdGgocGF0aFB0cik7CiAjZW5kaWYKIAogI2lmZGVmIFdJVEhfWFhYCi0JCS8qIEluaXRpYWxpemUgbW9kdWxlcyB0aGF0IGRvbid0IHJlcXVpcmUgVGsgKi8KKyAgICAgICAgLyogSW5pdGlhbGl6ZSBtb2R1bGVzIHRoYXQgZG9uJ3QgcmVxdWlyZSBUayAqLwogI2VuZGlmCiAKLQlfdGtpbnRlcl9za2lwX3RrX2luaXQgPQlUY2xfR2V0VmFyKGludGVycCwgIl90a2ludGVyX3NraXBfdGtfaW5pdCIsIFRDTF9HTE9CQUxfT05MWSk7Ci0JaWYgKF90a2ludGVyX3NraXBfdGtfaW5pdCAhPSBOVUxMICYmIHN0cmNtcChfdGtpbnRlcl9za2lwX3RrX2luaXQsICIxIikJPT0gMCkgewotCQlyZXR1cm4gVENMX09LOwotCX0KLQlpZiAoVGtfSW5pdChpbnRlcnApID09IFRDTF9FUlJPUikKLQkJcmV0dXJuIFRDTF9FUlJPUjsKKyAgICBfdGtpbnRlcl9za2lwX3RrX2luaXQgPSAgICAgVGNsX0dldFZhcihpbnRlcnAsICJfdGtpbnRlcl9za2lwX3RrX2luaXQiLCBUQ0xfR0xPQkFMX09OTFkpOworICAgIGlmIChfdGtpbnRlcl9za2lwX3RrX2luaXQgIT0gTlVMTCAmJiBzdHJjbXAoX3RraW50ZXJfc2tpcF90a19pbml0LCAiMSIpICAgICA9PSAwKSB7CisgICAgICAgIHJldHVybiBUQ0xfT0s7CisgICAgfQorICAgIGlmIChUa19Jbml0KGludGVycCkgPT0gVENMX0VSUk9SKQorICAgICAgICByZXR1cm4gVENMX0VSUk9SOwogCi0JbWFpbl93aW5kb3cgPSBUa19NYWluV2luZG93KGludGVycCk7CisgICAgbWFpbl93aW5kb3cgPSBUa19NYWluV2luZG93KGludGVycCk7CiAKICNpZmRlZiBUS19BUVVBCi0JVGtNYWNPU1hJbml0QXBwbGVFdmVudHMoaW50ZXJwKTsKLQlUa01hY09TWEluaXRNZW51cyhpbnRlcnApOworICAgIFRrTWFjT1NYSW5pdEFwcGxlRXZlbnRzKGludGVycCk7CisgICAgVGtNYWNPU1hJbml0TWVudXMoaW50ZXJwKTsKICNlbmRpZgotICAgIAotI2lmZGVmIFdJVEhfTU9SRUJVVFRPTlMKLQl7Ci0JCWV4dGVybiBUY2xfQ21kUHJvYyBzdHVkQnV0dG9uQ21kOwotCQlleHRlcm4gVGNsX0NtZFByb2MgdHJpQnV0dG9uQ21kOwogCi0JCVRjbF9DcmVhdGVDb21tYW5kKGludGVycCwgInN0dWRidXR0b24iLCBzdHVkQnV0dG9uQ21kLAotCQkJCSAgKENsaWVudERhdGEpIG1haW5fd2luZG93LCBOVUxMKTsKLQkJVGNsX0NyZWF0ZUNvbW1hbmQoaW50ZXJwLCAidHJpYnV0dG9uIiwgdHJpQnV0dG9uQ21kLAotCQkJCSAgKENsaWVudERhdGEpIG1haW5fd2luZG93LCBOVUxMKTsKLQl9CisjaWZkZWYgV0lUSF9NT1JFQlVUVE9OUworICAgIHsKKyAgICAgICAgZXh0ZXJuIFRjbF9DbWRQcm9jIHN0dWRCdXR0b25DbWQ7CisgICAgICAgIGV4dGVybiBUY2xfQ21kUHJvYyB0cmlCdXR0b25DbWQ7CisKKyAgICAgICAgVGNsX0NyZWF0ZUNvbW1hbmQoaW50ZXJwLCAic3R1ZGJ1dHRvbiIsIHN0dWRCdXR0b25DbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGllbnREYXRhKSBtYWluX3dpbmRvdywgTlVMTCk7CisgICAgICAgIFRjbF9DcmVhdGVDb21tYW5kKGludGVycCwgInRyaWJ1dHRvbiIsIHRyaUJ1dHRvbkNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKENsaWVudERhdGEpIG1haW5fd2luZG93LCBOVUxMKTsKKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIFdJVEhfUElMIC8qIDAuMmI1IGFuZCBsYXRlciAtLSBub3QgeWV0IHJlbGVhc2VkIGFzIG9mIE1heSAxNCAqLwotCXsKLQkJZXh0ZXJuIHZvaWQgVGtJbWFnaW5nX0luaXQoVGNsX0ludGVycCAqKTsKLQkJVGtJbWFnaW5nX0luaXQoaW50ZXJwKTsKLQkJLyogWFhYIFRrSW1hZ2luZ19Jbml0KCkgZG9lc24ndCBoYXZlIHRoZSByaWdodCByZXR1cm4gdHlwZSAqLwotCQkvKlRjbF9TdGF0aWNQYWNrYWdlKGludGVycCwgIkltYWdpbmciLCBUa0ltYWdpbmdfSW5pdCwgTlVMTCk7Ki8KLQl9CisgICAgeworICAgICAgICBleHRlcm4gdm9pZCBUa0ltYWdpbmdfSW5pdChUY2xfSW50ZXJwICopOworICAgICAgICBUa0ltYWdpbmdfSW5pdChpbnRlcnApOworICAgICAgICAvKiBYWFggVGtJbWFnaW5nX0luaXQoKSBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IHJldHVybiB0eXBlICovCisgICAgICAgIC8qVGNsX1N0YXRpY1BhY2thZ2UoaW50ZXJwLCAiSW1hZ2luZyIsIFRrSW1hZ2luZ19Jbml0LCBOVUxMKTsqLworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgV0lUSF9QSUxfT0xEIC8qIDAuMmI0IGFuZCBlYXJsaWVyICovCi0JewotCQlleHRlcm4gdm9pZCBUa0ltYWdpbmdfSW5pdCh2b2lkKTsKLQkJLyogWFhYIFRrSW1hZ2luZ19Jbml0KCkgZG9lc24ndCBoYXZlIHRoZSByaWdodCBwcm90b3R5cGUgKi8KLQkJLypUY2xfU3RhdGljUGFja2FnZShpbnRlcnAsICJJbWFnaW5nIiwgVGtJbWFnaW5nX0luaXQsIE5VTEwpOyovCi0JfQorICAgIHsKKyAgICAgICAgZXh0ZXJuIHZvaWQgVGtJbWFnaW5nX0luaXQodm9pZCk7CisgICAgICAgIC8qIFhYWCBUa0ltYWdpbmdfSW5pdCgpIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgcHJvdG90eXBlICovCisgICAgICAgIC8qVGNsX1N0YXRpY1BhY2thZ2UoaW50ZXJwLCAiSW1hZ2luZyIsIFRrSW1hZ2luZ19Jbml0LCBOVUxMKTsqLworICAgIH0KICNlbmRpZgogCiAjaWZkZWYgV0lUSF9USVgKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgVGl4X0luaXQoVGNsX0ludGVycCAqaW50ZXJwKTsKLSAgICAgICAgICAgICAgICBleHRlcm4gaW50IFRpeF9TYWZlSW5pdChUY2xfSW50ZXJwICppbnRlcnApOwotICAgICAgICAgICAgICAgIFRjbF9TdGF0aWNQYWNrYWdlKE5VTEwsICJUaXgiLCBUaXhfSW5pdCwgVGl4X1NhZmVJbml0KTsKLSAgICAgICAgfQorICAgIHsKKyAgICAgICAgZXh0ZXJuIGludCBUaXhfSW5pdChUY2xfSW50ZXJwICppbnRlcnApOworICAgICAgICBleHRlcm4gaW50IFRpeF9TYWZlSW5pdChUY2xfSW50ZXJwICppbnRlcnApOworICAgICAgICBUY2xfU3RhdGljUGFja2FnZShOVUxMLCAiVGl4IiwgVGl4X0luaXQsIFRpeF9TYWZlSW5pdCk7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBXSVRIX0JMVAotCXsKLQkJZXh0ZXJuIGludCBCbHRfSW5pdChUY2xfSW50ZXJwICopOwotCQlleHRlcm4gaW50IEJsdF9TYWZlSW5pdChUY2xfSW50ZXJwICopOwotCQlUY2xfU3RhdGljUGFja2FnZShOVUxMLCAiQmx0IiwgQmx0X0luaXQsIEJsdF9TYWZlSW5pdCk7Ci0JfQorICAgIHsKKyAgICAgICAgZXh0ZXJuIGludCBCbHRfSW5pdChUY2xfSW50ZXJwICopOworICAgICAgICBleHRlcm4gaW50IEJsdF9TYWZlSW5pdChUY2xfSW50ZXJwICopOworICAgICAgICBUY2xfU3RhdGljUGFja2FnZShOVUxMLCAiQmx0IiwgQmx0X0luaXQsIEJsdF9TYWZlSW5pdCk7CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBXSVRIX1RPR0wKLQl7Ci0JCS8qIFhYWCBJJ3ZlIGhlYXJkIHJ1bW9ycyB0aGF0IHRoaXMgZG9lc24ndCB3b3JrICovCi0JCWV4dGVybiBpbnQgVG9nbF9Jbml0KFRjbF9JbnRlcnAgKik7Ci0JCS8qIFhYWCBJcyB0aGVyZSBubyBUb2dsX1NhZmVJbml0PyAqLwotCQlUY2xfU3RhdGljUGFja2FnZShOVUxMLCAiVG9nbCIsIFRvZ2xfSW5pdCwgTlVMTCk7Ci0JfQorICAgIHsKKyAgICAgICAgLyogWFhYIEkndmUgaGVhcmQgcnVtb3JzIHRoYXQgdGhpcyBkb2Vzbid0IHdvcmsgKi8KKyAgICAgICAgZXh0ZXJuIGludCBUb2dsX0luaXQoVGNsX0ludGVycCAqKTsKKyAgICAgICAgLyogWFhYIElzIHRoZXJlIG5vIFRvZ2xfU2FmZUluaXQ/ICovCisgICAgICAgIFRjbF9TdGF0aWNQYWNrYWdlKE5VTEwsICJUb2dsIiwgVG9nbF9Jbml0LCBOVUxMKTsKKyAgICB9CiAjZW5kaWYKIAogI2lmZGVmIFdJVEhfWFhYCiAKICNlbmRpZgotCXJldHVybiBUQ0xfT0s7CisgICAgcmV0dXJuIFRDTF9PSzsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvdW5pY29kZWRhdGEuYyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwppbmRleCAwZTYxODc3Li44MjkxZDU4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKKysrIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCkBAIC0xOSwxNCArMTksMTQgQEAKIC8qIGNoYXJhY3RlciBwcm9wZXJ0aWVzICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5OwkvKiBpbmRleCBpbnRvCi0JCQkJCSAgIF9QeVVuaWNvZGVfQ2F0ZWdvcnlOYW1lcyAqLwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIJY29tYmluaW5nOyAJLyogY29tYmluaW5nIGNsYXNzIHZhbHVlIDAgLSAyNTUgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyCWJpZGlyZWN0aW9uYWw7IAkvKiBpbmRleCBpbnRvCi0JCQkJCSAgIF9QeVVuaWNvZGVfQmlkaXJlY3Rpb25hbE5hbWVzICovCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciBtaXJyb3JlZDsJLyogdHJ1ZSBpZiBtaXJyb3JlZCBpbiBiaWRpciBtb2RlICovCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciBlYXN0X2FzaWFuX3dpZHRoOwkvKiBpbmRleCBpbnRvCi0JCQkJCQkgICBfUHlVbmljb2RlX0Vhc3RBc2lhbldpZHRoICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciBjYXRlZ29yeTsgICAgICAgLyogaW5kZXggaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVVuaWNvZGVfQ2F0ZWdvcnlOYW1lcyAqLworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgY29tYmluaW5nOyAgICAgIC8qIGNvbWJpbmluZyBjbGFzcyB2YWx1ZSAwIC0gMjU1ICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciBiaWRpcmVjdGlvbmFsOyAgLyogaW5kZXggaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVVuaWNvZGVfQmlkaXJlY3Rpb25hbE5hbWVzICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciBtaXJyb3JlZDsgICAgICAgLyogdHJ1ZSBpZiBtaXJyb3JlZCBpbiBiaWRpciBtb2RlICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciBlYXN0X2FzaWFuX3dpZHRoOyAgICAgICAvKiBpbmRleCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlX0Vhc3RBc2lhbldpZHRoICovCiB9IF9QeVVuaWNvZGVfRGF0YWJhc2VSZWNvcmQ7CiAKIHR5cGVkZWYgc3RydWN0IGNoYW5nZV9yZWNvcmQgewpAQCAtNjYsNyArNjYsNyBAQAogI2RlZmluZSBnZXRfb2xkX3JlY29yZChzZWxmLCB2KSAgICAoKCgoUHJldmlvdXNEQlZlcnNpb24qKXNlbGYpLT5nZXRyZWNvcmQpKHYpKQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgREJfbWVtYmVyc1tdID0gewotCXsidW5pZGF0YV92ZXJzaW9uIiwgVF9TVFJJTkcsIG9mZnNldG9mKFByZXZpb3VzREJWZXJzaW9uLCBuYW1lKSwgUkVBRE9OTFl9LAorICAgICAgICB7InVuaWRhdGFfdmVyc2lvbiIsIFRfU1RSSU5HLCBvZmZzZXRvZihQcmV2aW91c0RCVmVyc2lvbiwgbmFtZSksIFJFQURPTkxZfSwKICAgICAgICAge05VTEx9CiB9OwogCkBAIC03NywxNCArNzcsMTQgQEAKIG5ld19wcmV2aW91c192ZXJzaW9uKGNvbnN0IGNoYXIqbmFtZSwgY29uc3QgY2hhbmdlX3JlY29yZCogKCpnZXRyZWNvcmQpKFB5X1VDUzQpLAogICAgICAgICAgICAgICAgICAgICAgUHlfVUNTNCAoKm5vcm1hbGl6YXRpb24pKFB5X1VDUzQpKQogewotCVByZXZpb3VzREJWZXJzaW9uICpzZWxmOwotCXNlbGYgPSBQeU9iamVjdF9OZXcoUHJldmlvdXNEQlZlcnNpb24sICZVQ0RfVHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+bmFtZSA9IG5hbWU7Ci0Jc2VsZi0+Z2V0cmVjb3JkID0gZ2V0cmVjb3JkOworICAgICAgICBQcmV2aW91c0RCVmVyc2lvbiAqc2VsZjsKKyAgICAgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhQcmV2aW91c0RCVmVyc2lvbiwgJlVDRF9UeXBlKTsKKyAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc2VsZi0+bmFtZSA9IG5hbWU7CisgICAgICAgIHNlbGYtPmdldHJlY29yZCA9IGdldHJlY29yZDsKICAgICAgICAgc2VsZi0+bm9ybWFsaXphdGlvbiA9IG5vcm1hbGl6YXRpb247Ci0JcmV0dXJuIChQeU9iamVjdCopc2VsZjsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKIH0KIAogCkBAIC05MywxMiArOTMsMTIgQEAKICAgICBQeV9VTklDT0RFICp2ID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqKTsKIAogICAgIGlmIChQeVVuaWNvZGVfR0VUX1NJWkUob2JqKSA9PSAxKQotCXJldHVybiAqdjsKKyAgICAgICAgcmV0dXJuICp2OwogI2lmbmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBlbHNlIGlmICgoUHlVbmljb2RlX0dFVF9TSVpFKG9iaikgPT0gMikgJiYKICAgICAgICAgICAgICAoMHhEODAwIDw9IHZbMF0gJiYgdlswXSA8PSAweERCRkYpICYmCiAgICAgICAgICAgICAgKDB4REMwMCA8PSB2WzFdICYmIHZbMV0gPD0gMHhERkZGKSkKLQlyZXR1cm4gKCgodlswXSAmIDB4M0ZGKTw8MTApIHwgKHZbMV0gJiAweDNGRikpICsgMHgxMDAwMDsKKyAgICAgICAgcmV0dXJuICgoKHZbMF0gJiAweDNGRik8PDEwKSB8ICh2WzFdICYgMHgzRkYpKSArIDB4MTAwMDA7CiAjZW5kaWYKICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAibmVlZCBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlciBhcyBwYXJhbWV0ZXIiKTsKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgICAgICAgICAgLyogdW5hc3NpZ25lZCAqLwogICAgICAgICAgICAgaGF2ZV9vbGQgPSAxOwogICAgICAgICAgICAgcmMgPSAtMTsKLSAgICAgICAgfSAKKyAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChvbGQtPmRlY2ltYWxfY2hhbmdlZCAhPSAweEZGKSB7CiAgICAgICAgICAgICBoYXZlX29sZCA9IDE7CiAgICAgICAgICAgICByYyA9IG9sZC0+ZGVjaW1hbF9jaGFuZ2VkOwpAQCAtMTQ1LDE1ICsxNDUsMTUgQEAKICAgICBpZiAoIWhhdmVfb2xkKQogICAgICAgICByYyA9IFB5X1VOSUNPREVfVE9ERUNJTUFMKGMpOwogICAgIGlmIChyYyA8IDApIHsKLQlpZiAoZGVmb2JqID09IE5VTEwpIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgIm5vdCBhIGRlY2ltYWwiKTsKKyAgICAgICAgaWYgKGRlZm9iaiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGEgZGVjaW1hbCIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKLQkgICAgcmV0dXJuIGRlZm9iajsKLQl9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGVmb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZvYmo7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJjKTsKIH0KQEAgLTE4MCwxNCArMTgwLDE0IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJjID0gUHlfVU5JQ09ERV9UT0RJR0lUKGMpOwogICAgIGlmIChyYyA8IDApIHsKLQlpZiAoZGVmb2JqID09IE5VTEwpIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJub3QgYSBkaWdpdCIpOworICAgICAgICBpZiAoZGVmb2JqID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgZGlnaXQiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQllbHNlIHsKLQkgICAgUHlfSU5DUkVGKGRlZm9iaik7Ci0JICAgIHJldHVybiBkZWZvYmo7Ci0JfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKGRlZm9iaik7CisgICAgICAgICAgICByZXR1cm4gZGVmb2JqOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyYyk7CiB9CkBAIC0yMjAsNyArMjIwLDcgQEAKICAgICAgICAgICAgIC8qIHVuYXNzaWduZWQgKi8KICAgICAgICAgICAgIGhhdmVfb2xkID0gMTsKICAgICAgICAgICAgIHJjID0gLTEuMDsKLSAgICAgICAgfSAKKyAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChvbGQtPmRlY2ltYWxfY2hhbmdlZCAhPSAweEZGKSB7CiAgICAgICAgICAgICBoYXZlX29sZCA9IDE7CiAgICAgICAgICAgICByYyA9IG9sZC0+ZGVjaW1hbF9jaGFuZ2VkOwpAQCAtMjMwLDE0ICsyMzAsMTQgQEAKICAgICBpZiAoIWhhdmVfb2xkKQogICAgICAgICByYyA9IFB5X1VOSUNPREVfVE9OVU1FUklDKGMpOwogICAgIGlmIChyYyA9PSAtMS4wKSB7Ci0JaWYgKGRlZm9iaiA9PSBOVUxMKSB7Ci0JICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm90IGEgbnVtZXJpYyBjaGFyYWN0ZXIiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKLQkgICAgcmV0dXJuIGRlZm9iajsKLQl9CisgICAgICAgIGlmIChkZWZvYmogPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJub3QgYSBudW1lcmljIGNoYXJhY3RlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGVmb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZvYmo7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShyYyk7CiB9CkBAIC0yNTYsOCArMjU2LDggQEAKICAgICBQeV9VQ1M0IGM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmNhdGVnb3J5IiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjg1LDggKzI4NSw4IEBACiAgICAgUHlfVUNTNCBjOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpiaWRpcmVjdGlvbmFsIiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzE2LDggKzMxNiw4IEBACiAgICAgUHlfVUNTNCBjOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpjb21iaW5pbmciLAotCQkJICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VW5pY29kZV9UeXBlLCAmdikpCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGMgPSBnZXR1Y2hhcih2KTsKICAgICBpZiAoYyA9PSAoUHlfVUNTNCktMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNDUsOCArMzQ1LDggQEAKICAgICBQeV9VQ1M0IGM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOm1pcnJvcmVkIiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzc1LDggKzM3NSw4IEBACiAgICAgUHlfVUNTNCBjOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITplYXN0X2FzaWFuX3dpZHRoIiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDA2LDggKzQwNiw4IEBACiAgICAgUHlfVUNTNCBjOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPITpkZWNvbXBvc2l0aW9uIiwKLQkJCSAgJlB5VW5pY29kZV9UeXBlLCAmdikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVVuaWNvZGVfVHlwZSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBjID0gZ2V0dWNoYXIodik7CiAgICAgaWYgKGMgPT0gKFB5X1VDUzQpLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDUzLDcgKzQ1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wX2RhdGFbKytpbmRleF0pOwogICAgICAgICBpICs9IHN0cmxlbihkZWNvbXAgKyBpKTsKICAgICB9Ci0gICAgCisKICAgICBkZWNvbXBbaV0gPSAnXDAnOwogCiAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVjb21wKTsKQEAgLTQ3Myw3ICs0NzMsNyBAQAogICAgICAgICAqaW5kZXggPSBkZWNvbXBfaW5kZXgyWygqaW5kZXg8PERFQ09NUF9TSElGVCkrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUmKCgxPDxERUNPTVBfU0hJRlQpLTEpKV07CiAgICAgfQotCQorCiAgICAgLyogaGlnaCBieXRlIGlzIG51bWJlciBvZiBoZXggYnl0ZXMgKHVzdWFsbHkgb25lIG9yIHR3byksIGxvdyBieXRlCiAgICAgICAgaXMgcHJlZml4IGNvZGUgKGZyb20qLwogICAgICpjb3VudCA9IGRlY29tcF9kYXRhWyppbmRleF0gPj4gODsKQEAgLTQ5OCwxMSArNDk4LDExIEBACiAgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBQeV9VTklDT0RFICppLCAqZW5kLCAqbzsKICAgICAvKiBMb25nZXN0IGRlY29tcG9zaXRpb24gaW4gVW5pY29kZSAzLjI6IFUrRkRGQSAqLwotICAgIFB5X1VOSUNPREUgc3RhY2tbMjBdOyAKKyAgICBQeV9VTklDT0RFIHN0YWNrWzIwXTsKICAgICBQeV9zc2l6ZV90IHNwYWNlLCBpc2l6ZTsKICAgICBpbnQgaW5kZXgsIHByZWZpeCwgY291bnQsIHN0YWNrcHRyOwogICAgIHVuc2lnbmVkIGNoYXIgcHJldiwgY3VyOwotCQorCiAgICAgc3RhY2twdHIgPSAwOwogICAgIGlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKGlucHV0KTsKICAgICAvKiBPdmVyYWxsb2NhdGUgYXRtb3N0IDEwIGNoYXJhY3RlcnMuICovCkBAIC02MzksMTIgKzYzOSwxMiBAQAogICAgIGkgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOwogICAgIGVuZCA9IGkgKyBQeVVuaWNvZGVfR0VUX1NJWkUocmVzdWx0KTsKICAgICBvID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KTsKLQkKKwogICBhZ2FpbjoKICAgICB3aGlsZSAoaSA8IGVuZCkgewogICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3NraXBwZWQ7IGluZGV4KyspIHsKICAgICAgICAgICBpZiAoc2tpcHBlZFtpbmRleF0gPT0gaSkgewotICAgICAgICAgICAgICAvKiAqaSBjaGFyYWN0ZXIgaXMgc2tpcHBlZC4gCisgICAgICAgICAgICAgIC8qICppIGNoYXJhY3RlciBpcyBza2lwcGVkLgogICAgICAgICAgICAgICAgICBSZW1vdmUgZnJvbSBsaXN0LiAqLwogICAgICAgICAgICAgICBza2lwcGVkW2luZGV4XSA9IHNraXBwZWRbY3NraXBwZWQtMV07CiAgICAgICAgICAgICAgIGNza2lwcGVkLS07CkBAIC02NTUsNyArNjU1LDcgQEAKICAgICAgIC8qIEhhbmd1bCBDb21wb3NpdGlvbi4gV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgPExWLFQ+CiAgICAgICAgICBwYWlycywgc2luY2Ugd2UgYWx3YXlzIGhhdmUgZGVjb21wb3NlZCBkYXRhLiAqLwogICAgICAgaWYgKExCYXNlIDw9ICppICYmICppIDwgKExCYXNlK0xDb3VudCkgJiYKLSAgICAgICAgICBpICsgMSA8IGVuZCAmJiAKKyAgICAgICAgICBpICsgMSA8IGVuZCAmJgogICAgICAgICAgIFZCYXNlIDw9IGlbMV0gJiYgaVsxXSA8PSAoVkJhc2UrVkNvdW50KSkgewogICAgICAgICAgIGludCBMSW5kZXgsIFZJbmRleDsKICAgICAgICAgICBMSW5kZXggPSBpWzBdIC0gTEJhc2U7CkBAIC03MDQsNyArNzA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleCYoKDE8PENPTVBfU0hJRlQpLTEpKV07CiAgICAgICAgICAgaWYgKGNvZGUgPT0gMCkKICAgICAgICAgICAgICAgZ290byBub3RfY29tYmluYWJsZTsKLQkJCQorCiAgICAgICAgICAgLyogUmVwbGFjZSB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyLiAqLwogICAgICAgICAgICppID0gY29kZTsKICAgICAgICAgICAvKiBNYXJrIHRoZSBzZWNvbmQgY2hhcmFjdGVyIHVudXNlZC4gKi8KQEAgLTcyMCw3ICs3MjAsNyBAQAogICAgICAgICBQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIG8gLSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQotCQkKKwogUHlEb2NfU1RSVkFSKHVuaWNvZGVkYXRhX25vcm1hbGl6ZV9fZG9jX18sCiAibm9ybWFsaXplKGZvcm0sIHVuaXN0cilcblwKIFxuXApAQCAtODM2LDI5ICs4MzYsMjkgQEAKICAgICAgICAgaWYgKG9sZC0+Y2F0ZWdvcnlfY2hhbmdlZCA9PSAwKSB7CiAgICAgICAgICAgICAvKiB1bmFzc2lnbmVkICovCiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSAKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChTQmFzZSA8PSBjb2RlICYmIGNvZGUgPCBTQmFzZStTQ291bnQpIHsKLQkvKiBIYW5ndWwgc3lsbGFibGUuICovCi0JaW50IFNJbmRleCA9IGNvZGUgLSBTQmFzZTsKLQlpbnQgTCA9IFNJbmRleCAvIE5Db3VudDsKLQlpbnQgViA9IChTSW5kZXggJSBOQ291bnQpIC8gVENvdW50OwotCWludCBUID0gU0luZGV4ICUgVENvdW50OworICAgICAgICAvKiBIYW5ndWwgc3lsbGFibGUuICovCisgICAgICAgIGludCBTSW5kZXggPSBjb2RlIC0gU0Jhc2U7CisgICAgICAgIGludCBMID0gU0luZGV4IC8gTkNvdW50OworICAgICAgICBpbnQgViA9IChTSW5kZXggJSBOQ291bnQpIC8gVENvdW50OworICAgICAgICBpbnQgVCA9IFNJbmRleCAlIFRDb3VudDsKIAotCWlmIChidWZsZW4gPCAyNykKLQkgICAgLyogV29yc3QgY2FzZTogSEFOR1VMIFNZTExBQkxFIDwxMGNoYXJzPi4gKi8KLQkgICAgcmV0dXJuIDA7Ci0Jc3RyY3B5KGJ1ZmZlciwgIkhBTkdVTCBTWUxMQUJMRSAiKTsKLQlidWZmZXIgKz0gMTY7Ci0Jc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tMXVswXSk7Ci0JYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW0xdWzBdKTsKLQlzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW1ZdWzFdKTsKLQlidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbVl1bMV0pOwotCXN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbVF1bMl0pOwotCWJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tUXVsyXSk7Ci0JKmJ1ZmZlciA9ICdcMCc7Ci0JcmV0dXJuIDE7CisgICAgICAgIGlmIChidWZsZW4gPCAyNykKKyAgICAgICAgICAgIC8qIFdvcnN0IGNhc2U6IEhBTkdVTCBTWUxMQUJMRSA8MTBjaGFycz4uICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3RyY3B5KGJ1ZmZlciwgIkhBTkdVTCBTWUxMQUJMRSAiKTsKKyAgICAgICAgYnVmZmVyICs9IDE2OworICAgICAgICBzdHJjcHkoYnVmZmVyLCBoYW5ndWxfc3lsbGFibGVzW0xdWzBdKTsKKyAgICAgICAgYnVmZmVyICs9IHN0cmxlbihoYW5ndWxfc3lsbGFibGVzW0xdWzBdKTsKKyAgICAgICAgc3RyY3B5KGJ1ZmZlciwgaGFuZ3VsX3N5bGxhYmxlc1tWXVsxXSk7CisgICAgICAgIGJ1ZmZlciArPSBzdHJsZW4oaGFuZ3VsX3N5bGxhYmxlc1tWXVsxXSk7CisgICAgICAgIHN0cmNweShidWZmZXIsIGhhbmd1bF9zeWxsYWJsZXNbVF1bMl0pOworICAgICAgICBidWZmZXIgKz0gc3RybGVuKGhhbmd1bF9zeWxsYWJsZXNbVF1bMl0pOworICAgICAgICAqYnVmZmVyID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCiAgICAgaWYgKGlzX3VuaWZpZWRfaWRlb2dyYXBoKGNvZGUpKSB7CkBAIC05MjUsMjMgKzkyNSwyMyBAQAogICAgIHJldHVybiBidWZmZXJbbmFtZWxlbl0gPT0gJ1wwJzsKIH0KIAotc3RhdGljIHZvaWQgCitzdGF0aWMgdm9pZAogZmluZF9zeWxsYWJsZShjb25zdCBjaGFyICpzdHIsIGludCAqbGVuLCBpbnQgKnBvcywgaW50IGNvdW50LCBpbnQgY29sdW1uKQogewogICAgIGludCBpLCBsZW4xOwogICAgICpsZW4gPSAtMTsKICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCWNoYXIgKnMgPSBoYW5ndWxfc3lsbGFibGVzW2ldW2NvbHVtbl07Ci0JbGVuMSA9IHN0cmxlbihzKTsKLQlpZiAobGVuMSA8PSAqbGVuKQotCSAgICBjb250aW51ZTsKLQlpZiAoc3RybmNtcChzdHIsIHMsIGxlbjEpID09IDApIHsKLQkgICAgKmxlbiA9IGxlbjE7Ci0JICAgICpwb3MgPSBpOwotCX0KKyAgICAgICAgY2hhciAqcyA9IGhhbmd1bF9zeWxsYWJsZXNbaV1bY29sdW1uXTsKKyAgICAgICAgbGVuMSA9IHN0cmxlbihzKTsKKyAgICAgICAgaWYgKGxlbjEgPD0gKmxlbikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoc3RybmNtcChzdHIsIHMsIGxlbjEpID09IDApIHsKKyAgICAgICAgICAgICpsZW4gPSBsZW4xOworICAgICAgICAgICAgKnBvcyA9IGk7CisgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCpsZW4gPT0gLTEpIHsKLQkqbGVuID0gMDsKKyAgICAgICAgKmxlbiA9IDA7CiAgICAgfQogfQogCkBAIC05NTQsMTggKzk1NCwxOCBAQAogCiAgICAgLyogQ2hlY2sgZm9yIGhhbmd1bCBzeWxsYWJsZXMuICovCiAgICAgaWYgKHN0cm5jbXAobmFtZSwgIkhBTkdVTCBTWUxMQUJMRSAiLCAxNikgPT0gMCkgewotCWludCBsZW4sIEwgPSAtMSwgViA9IC0xLCBUID0gLTE7Ci0JY29uc3QgY2hhciAqcG9zID0gbmFtZSArIDE2OwotCWZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmTCwgTENvdW50LCAwKTsKLQlwb3MgKz0gbGVuOwotCWZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmViwgVkNvdW50LCAxKTsKLQlwb3MgKz0gbGVuOwotCWZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmVCwgVENvdW50LCAyKTsKLQlwb3MgKz0gbGVuOwotCWlmIChMICE9IC0xICYmIFYgIT0gLTEgJiYgVCAhPSAtMSAmJiBwb3MtbmFtZSA9PSBuYW1lbGVuKSB7Ci0JICAgICpjb2RlID0gU0Jhc2UgKyAoTCpWQ291bnQrVikqVENvdW50ICsgVDsKLQkgICAgcmV0dXJuIDE7Ci0JfQorICAgICAgICBpbnQgbGVuLCBMID0gLTEsIFYgPSAtMSwgVCA9IC0xOworICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBuYW1lICsgMTY7CisgICAgICAgIGZpbmRfc3lsbGFibGUocG9zLCAmbGVuLCAmTCwgTENvdW50LCAwKTsKKyAgICAgICAgcG9zICs9IGxlbjsKKyAgICAgICAgZmluZF9zeWxsYWJsZShwb3MsICZsZW4sICZWLCBWQ291bnQsIDEpOworICAgICAgICBwb3MgKz0gbGVuOworICAgICAgICBmaW5kX3N5bGxhYmxlKHBvcywgJmxlbiwgJlQsIFRDb3VudCwgMik7CisgICAgICAgIHBvcyArPSBsZW47CisgICAgICAgIGlmIChMICE9IC0xICYmIFYgIT0gLTEgJiYgVCAhPSAtMSAmJiBwb3MtbmFtZSA9PSBuYW1lbGVuKSB7CisgICAgICAgICAgICAqY29kZSA9IFNCYXNlICsgKEwqVkNvdW50K1YpKlRDb3VudCArIFQ7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQogICAgICAgICAvKiBPdGhlcndpc2UsIGl0J3MgYW4gaWxsZWdhbCBzeWxsYWJsZSBuYW1lLiAqLwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0xMDI1LDcgKzEwMjUsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGNvbnN0IF9QeVVuaWNvZGVfTmFtZV9DQVBJIGhhc2hBUEkgPSAKK3N0YXRpYyBjb25zdCBfUHlVbmljb2RlX05hbWVfQ0FQSSBoYXNoQVBJID0KIHsKICAgICBzaXplb2YoX1B5VW5pY29kZV9OYW1lX0NBUEkpLAogICAgIF9nZXR1Y25hbWUsCkBAIC0xMDU3LDE0ICsxMDU3LDE0IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKCFfZ2V0dWNuYW1lKHNlbGYsIGMsIG5hbWUsIHNpemVvZihuYW1lKSkpIHsKLQlpZiAoZGVmb2JqID09IE5VTEwpIHsKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJubyBzdWNoIG5hbWUiKTsKKyAgICAgICAgaWYgKGRlZm9iaiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIHN1Y2ggbmFtZSIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCSAgICBQeV9JTkNSRUYoZGVmb2JqKTsKLQkgICAgcmV0dXJuIGRlZm9iajsKLQl9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGVmb2JqKTsKKyAgICAgICAgICAgIHJldHVybiBkZWZvYmo7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIG5hbWUpOwpAQCAtMTEwMiw3ICsxMTAyLDcgQEAKICAgICB9CiAjZW5kaWYKICAgICBzdHJbMF0gPSAoUHlfVU5JQ09ERSkgY29kZTsKLSAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHN0ciwgMSk7ICAgIAorICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoc3RyLCAxKTsKIH0KIAogLyogWFhYIEFkZCBkb2Mgc3RyaW5ncy4gKi8KQEAgLTExMjcsMjcgKzExMjcsMjcgQEAKICAgICB7Imxvb2t1cCIsIHVuaWNvZGVkYXRhX2xvb2t1cCwgTUVUSF9WQVJBUkdTLCB1bmljb2RlZGF0YV9sb29rdXBfX2RvY19ffSwKICAgICB7Im5vcm1hbGl6ZSIsIHVuaWNvZGVkYXRhX25vcm1hbGl6ZSwgTUVUSF9WQVJBUkdTLAogICAgICAgICAgICAgICAgICAgdW5pY29kZWRhdGFfbm9ybWFsaXplX19kb2NfX30sCi0gICAge05VTEwsIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHtOVUxMLCBOVUxMfSAgICAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBVQ0RfVHlwZSA9IHsKLQkvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgotCSAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCi0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInVuaWNvZGVkYXRhLlVDRCIsCQkvKnRwX25hbWUqLwotCXNpemVvZihQcmV2aW91c0RCVmVyc2lvbiksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KKyAgICAgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KKyAgICAgICAgICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KKyAgICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgICAgICJ1bmljb2RlZGF0YS5VQ0QiLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICAgICAgc2l6ZW9mKFByZXZpb3VzREJWZXJzaW9uKSwgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgICAgICAvKiBtZXRob2RzICovCisgICAgICAgIChkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwgLyp0cF9kZWFsbG9jKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCiAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KICAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCkBAIC0xMjEzLDcgKzEyMTMsNyBAQAogICAgICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgInVjbmhhc2hfQ0FQSSIsIHYpOwogfQogCi0vKiAKKy8qCiBMb2NhbCB2YXJpYWJsZXM6CiBjLWJhc2ljLW9mZnNldDogNAogaW5kZW50LXRhYnMtbW9kZTogbmlsCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3h4bW9kdWxlLmMgYi9Nb2R1bGVzL3h4bW9kdWxlLmMKaW5kZXggNmI0OThkZC4uMWQ5YjA4YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eG1vZHVsZS5jCisrKyBiL01vZHVsZXMveHhtb2R1bGUuYwpAQCAtMTksMjMgKzE5LDIzIEBACiBzdGF0aWMgUHlPYmplY3QgKkVycm9yT2JqZWN0OwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0CSp4X2F0dHI7CS8qIEF0dHJpYnV0ZXMgZGljdGlvbmFyeSAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAgICAgICAgICAgICp4X2F0dHI7ICAgICAgICAvKiBBdHRyaWJ1dGVzIGRpY3Rpb25hcnkgKi8KIH0gWHhvT2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFh4b19UeXBlOwogCi0jZGVmaW5lIFh4b09iamVjdF9DaGVjayh2KQkoUHlfVFlQRSh2KSA9PSAmWHhvX1R5cGUpCisjZGVmaW5lIFh4b09iamVjdF9DaGVjayh2KSAgICAgIChQeV9UWVBFKHYpID09ICZYeG9fVHlwZSkKIAogc3RhdGljIFh4b09iamVjdCAqCiBuZXdYeG9PYmplY3QoUHlPYmplY3QgKmFyZykKIHsKLQlYeG9PYmplY3QgKnNlbGY7Ci0Jc2VsZiA9IFB5T2JqZWN0X05ldyhYeG9PYmplY3QsICZYeG9fVHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+eF9hdHRyID0gTlVMTDsKLQlyZXR1cm4gc2VsZjsKKyAgICBYeG9PYmplY3QgKnNlbGY7CisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhYeG9PYmplY3QsICZYeG9fVHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+eF9hdHRyID0gTlVMTDsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogLyogWHhvIG1ldGhvZHMgKi8KQEAgLTQzLDEwMSArNDMsMTAxIEBACiBzdGF0aWMgdm9pZAogWHhvX2RlYWxsb2MoWHhvT2JqZWN0ICpzZWxmKQogewotCVB5X1hERUNSRUYoc2VsZi0+eF9hdHRyKTsKLQlQeU9iamVjdF9EZWwoc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT54X2F0dHIpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFh4b19kZW1vKFh4b09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZGVtbyIpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZGVtbyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBYeG9fbWV0aG9kc1tdID0gewotCXsiZGVtbyIsCShQeUNGdW5jdGlvbilYeG9fZGVtbywJTUVUSF9WQVJBUkdTLAotCQlQeURvY19TVFIoImRlbW8oKSAtPiBOb25lIil9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJkZW1vIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pWHhvX2RlbW8sICBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiZGVtbygpIC0+IE5vbmUiKX0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBYeG9fZ2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JaWYgKHNlbGYtPnhfYXR0ciAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+eF9hdHRyLCBuYW1lKTsKLQkJaWYgKHYgIT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKHYpOwotCQkJcmV0dXJuIHY7Ci0JCX0KLQl9Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoWHhvX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIGlmIChzZWxmLT54X2F0dHIgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSk7CisgICAgICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKFh4b19tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIGludAogWHhvX3NldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpIHsKLQkJc2VsZi0+eF9hdHRyID0gUHlEaWN0X05ldygpOwotCQlpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh2ID09IE5VTEwpIHsKLQkJaW50IHJ2ID0gUHlEaWN0X0RlbEl0ZW1TdHJpbmcoc2VsZi0+eF9hdHRyLCBuYW1lKTsKLQkJaWYgKHJ2IDwgMCkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCSAgICAgICAgImRlbGV0ZSBub24tZXhpc3RpbmcgWHhvIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gcnY7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSwgdik7CisgICAgaWYgKHNlbGYtPnhfYXR0ciA9PSBOVUxMKSB7CisgICAgICAgIHNlbGYtPnhfYXR0ciA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKHNlbGYtPnhfYXR0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGludCBydiA9IFB5RGljdF9EZWxJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSk7CisgICAgICAgIGlmIChydiA8IDApCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgImRlbGV0ZSBub24tZXhpc3RpbmcgWHhvIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gcnY7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSwgdik7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgWHhvX1R5cGUgPSB7Ci0JLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KLQkgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLwotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQotCSJ4eG1vZHVsZS5YeG8iLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoWHhvT2JqZWN0KSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVh4b19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKVh4b19nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYylYeG9fc2V0YXR0ciwgLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KLSAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KKyAgICAvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgorICAgICAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInh4bW9kdWxlLlh4byIsICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFh4b09iamVjdCksICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKVh4b19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpWHhvX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKVh4b19zZXRhdHRyLCAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAvKnRwX2ZsYWdzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMTUxLDEyICsxNTEsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB4eF9mb28oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgaSwgajsKLQlsb25nIHJlczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsOmZvbyIsICZpLCAmaikpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9IGkrajsgLyogWFhYIERvIHNvbWV0aGluZyBoZXJlICovCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlcyk7CisgICAgbG9uZyBpLCBqOworICAgIGxvbmcgcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6Zm9vIiwgJmksICZqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gaStqOyAvKiBYWFggRG8gc29tZXRoaW5nIGhlcmUgKi8KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzKTsKIH0KIAogCkBAIC0xNjUsMTQgKzE2NSwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHh4X25ldyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JWHhvT2JqZWN0ICpydjsKKyAgICBYeG9PYmplY3QgKnJ2OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6bmV3IikpCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gbmV3WHhvT2JqZWN0KGFyZ3MpOwotCWlmIChydiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6bmV3IikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gbmV3WHhvT2JqZWN0KGFyZ3MpOworICAgIGlmIChydiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcnY7CiB9CiAKIC8qIEV4YW1wbGUgd2l0aCBzdWJ0bGUgYnVnIGZyb20gZXh0ZW5zaW9ucyBtYW51YWwgKCJUaGluIEljZSIpLiAqLwpAQCAtMTgwLDIwICsxODAsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB4eF9idWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpsaXN0LCAqaXRlbTsKKyAgICBQeU9iamVjdCAqbGlzdCwgKml0ZW07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86YnVnIiwgJmxpc3QpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86YnVnIiwgJmxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWl0ZW0gPSBQeUxpc3RfR2V0SXRlbShsaXN0LCAwKTsKLQkvKiBQeV9JTkNSRUYoaXRlbSk7ICovCi0JUHlMaXN0X1NldEl0ZW0obGlzdCwgMSwgUHlJbnRfRnJvbUxvbmcoMEwpKTsKLQlQeU9iamVjdF9QcmludChpdGVtLCBzdGRvdXQsIDApOwotCXByaW50ZigiXG4iKTsKLQkvKiBQeV9ERUNSRUYoaXRlbSk7ICovCisgICAgaXRlbSA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIDApOworICAgIC8qIFB5X0lOQ1JFRihpdGVtKTsgKi8KKyAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCAxLCBQeUludF9Gcm9tTG9uZygwTCkpOworICAgIFB5T2JqZWN0X1ByaW50KGl0ZW0sIHN0ZG91dCwgMCk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIC8qIFB5X0RFQ1JFRihpdGVtKTsgKi8KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIFRlc3QgYmFkIGZvcm1hdCBjaGFyYWN0ZXIgKi8KQEAgLTIwMSw2MSArMjAxLDYxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogeHhfcm9qKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqYTsKLQlsb25nIGI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIzpyb2oiLCAmYSwgJmIpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlPYmplY3QgKmE7CisgICAgbG9uZyBiOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyM6cm9qIiwgJmEsICZiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKIC8qIC0tLS0tLS0tLS0gKi8KIAogc3RhdGljIFB5VHlwZU9iamVjdCBTdHJfVHlwZSA9IHsKLQkvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgotCSAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCi0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JInh4bW9kdWxlLlN0ciIsCQkvKnRwX25hbWUqLwotCTAsCQkJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCTAsCQkJLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCi0JMCwJCQkvKnRwX2NhbGwqLwotCTAsCQkJLyp0cF9zdHIqLwotCTAsCQkJLyp0cF9nZXRhdHRybyovCi0JMCwJCQkvKnRwX3NldGF0dHJvKi8KLQkwLAkJCS8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KLQkwLAkJCS8qdHBfZG9jKi8KLQkwLAkJCS8qdHBfdHJhdmVyc2UqLwotCTAsCQkJLyp0cF9jbGVhciovCi0JMCwJCQkvKnRwX3JpY2hjb21wYXJlKi8KLQkwLAkJCS8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsCQkJLyp0cF9pdGVyKi8KLQkwLAkJCS8qdHBfaXRlcm5leHQqLwotCTAsCQkJLyp0cF9tZXRob2RzKi8KLQkwLAkJCS8qdHBfbWVtYmVycyovCi0JMCwJCQkvKnRwX2dldHNldCovCi0JMCwgLyogc2VlIGluaXR4eCAqLwkvKnRwX2Jhc2UqLwotCTAsCQkJLyp0cF9kaWN0Ki8KLQkwLAkJCS8qdHBfZGVzY3JfZ2V0Ki8KLQkwLAkJCS8qdHBfZGVzY3Jfc2V0Ki8KLQkwLAkJCS8qdHBfZGljdG9mZnNldCovCi0JMCwJCQkvKnRwX2luaXQqLwotCTAsCQkJLyp0cF9hbGxvYyovCi0JMCwJCQkvKnRwX25ldyovCi0JMCwJCQkvKnRwX2ZyZWUqLwotCTAsCQkJLyp0cF9pc19nYyovCisgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KKyAgICAgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJ4eG1vZHVsZS5TdHIiLCAgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgLyogc2VlIGluaXR4eCAqLyAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0gKi8KQEAgLTI2Myw1NCArMjYzLDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbnVsbF9yaWNoY29tcGFyZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyLCBpbnQgb3ApCiB7Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTnVsbF9UeXBlID0gewotCS8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCi0JICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkieHhtb2R1bGUuTnVsbCIsCS8qdHBfbmFtZSovCi0JMCwJCQkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JMCwJCQkvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwJCQkvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KLQkwLAkJCS8qdHBfY2FsbCovCi0JMCwJCQkvKnRwX3N0ciovCi0JMCwJCQkvKnRwX2dldGF0dHJvKi8KLQkwLAkJCS8qdHBfc2V0YXR0cm8qLwotCTAsCQkJLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLwotCTAsCQkJLyp0cF9kb2MqLwotCTAsCQkJLyp0cF90cmF2ZXJzZSovCi0JMCwJCQkvKnRwX2NsZWFyKi8KLQludWxsX3JpY2hjb21wYXJlLAkvKnRwX3JpY2hjb21wYXJlKi8KLQkwLAkJCS8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsCQkJLyp0cF9pdGVyKi8KLQkwLAkJCS8qdHBfaXRlcm5leHQqLwotCTAsCQkJLyp0cF9tZXRob2RzKi8KLQkwLAkJCS8qdHBfbWVtYmVycyovCi0JMCwJCQkvKnRwX2dldHNldCovCi0JMCwgLyogc2VlIGluaXR4eCAqLwkvKnRwX2Jhc2UqLwotCTAsCQkJLyp0cF9kaWN0Ki8KLQkwLAkJCS8qdHBfZGVzY3JfZ2V0Ki8KLQkwLAkJCS8qdHBfZGVzY3Jfc2V0Ki8KLQkwLAkJCS8qdHBfZGljdG9mZnNldCovCi0JMCwJCQkvKnRwX2luaXQqLwotCTAsCQkJLyp0cF9hbGxvYyovCi0JMCwgLyogc2VlIGluaXR4eCAqLwkvKnRwX25ldyovCi0JMCwJCQkvKnRwX2ZyZWUqLwotCTAsCQkJLyp0cF9pc19nYyovCisgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KKyAgICAgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJ4eG1vZHVsZS5OdWxsIiwgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIG51bGxfcmljaGNvbXBhcmUsICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgLyogc2VlIGluaXR4eCAqLyAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KKyAgICAwLCAvKiBzZWUgaW5pdHh4ICovICAgICAgICAgLyp0cF9uZXcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KIH07CiAKIApAQCAtMzIwLDE1ICszMjAsMTUgQEAKIC8qIExpc3Qgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgeHhfbWV0aG9kc1tdID0gewotCXsicm9qIiwJCXh4X3JvaiwJCU1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJyb2ooYSxiKSAtPiBOb25lIil9LAotCXsiZm9vIiwJCXh4X2ZvbywJCU1FVEhfVkFSQVJHUywKLQkgCXh4X2Zvb19kb2N9LAotCXsibmV3IiwJCXh4X25ldywJCU1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJuZXcoKSAtPiBuZXcgWHggb2JqZWN0Iil9LAotCXsiYnVnIiwJCXh4X2J1ZywJCU1FVEhfVkFSQVJHUywKLQkJUHlEb2NfU1RSKCJidWcobykgLT4gTm9uZSIpfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsicm9qIiwgICAgICAgICAgICAgeHhfcm9qLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJyb2ooYSxiKSAtPiBOb25lIil9LAorICAgIHsiZm9vIiwgICAgICAgICAgICAgeHhfZm9vLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgeHhfZm9vX2RvY30sCisgICAgeyJuZXciLCAgICAgICAgICAgICB4eF9uZXcsICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIm5ldygpIC0+IG5ldyBYeCBvYmplY3QiKX0sCisgICAgeyJidWciLCAgICAgICAgICAgICB4eF9idWcsICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImJ1ZyhvKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIobW9kdWxlX2RvYywKQEAgLTMzOSw0MSArMzM5LDQxIEBACiBQeU1PRElOSVRfRlVOQwogaW5pdHh4KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAKLQkvKiBEdWUgdG8gY3Jvc3MgcGxhdGZvcm0gY29tcGlsZXIgaXNzdWVzIHRoZSBzbG90cyBtdXN0IGJlIGZpbGxlZAotCSAqIGhlcmUuIEl0J3MgcmVxdWlyZWQgZm9yIHBvcnRhYmlsaXR5IHRvIFdpbmRvd3Mgd2l0aG91dCByZXF1aXJpbmcKLQkgKiBDKysuICovCi0JTnVsbF9UeXBlLnRwX2Jhc2UgPSAmUHlCYXNlT2JqZWN0X1R5cGU7Ci0JTnVsbF9UeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OwotCVN0cl9UeXBlLnRwX2Jhc2UgPSAmUHlVbmljb2RlX1R5cGU7CisgICAgLyogRHVlIHRvIGNyb3NzIHBsYXRmb3JtIGNvbXBpbGVyIGlzc3VlcyB0aGUgc2xvdHMgbXVzdCBiZSBmaWxsZWQKKyAgICAgKiBoZXJlLiBJdCdzIHJlcXVpcmVkIGZvciBwb3J0YWJpbGl0eSB0byBXaW5kb3dzIHdpdGhvdXQgcmVxdWlyaW5nCisgICAgICogQysrLiAqLworICAgIE51bGxfVHlwZS50cF9iYXNlID0gJlB5QmFzZU9iamVjdF9UeXBlOworICAgIE51bGxfVHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKKyAgICBTdHJfVHlwZS50cF9iYXNlID0gJlB5VW5pY29kZV9UeXBlOwogCi0JLyogRmluYWxpemUgdGhlIHR5cGUgb2JqZWN0IGluY2x1ZGluZyBzZXR0aW5nIHR5cGUgb2YgdGhlIG5ldyB0eXBlCi0JICogb2JqZWN0OyBkb2luZyBpdCBoZXJlIGlzIHJlcXVpcmVkIGZvciBwb3J0YWJpbGl0eSwgdG9vLiAqLwotCWlmIChQeVR5cGVfUmVhZHkoJlh4b19UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICAvKiBGaW5hbGl6ZSB0aGUgdHlwZSBvYmplY3QgaW5jbHVkaW5nIHNldHRpbmcgdHlwZSBvZiB0aGUgbmV3IHR5cGUKKyAgICAgKiBvYmplY3Q7IGRvaW5nIGl0IGhlcmUgaXMgcmVxdWlyZWQgZm9yIHBvcnRhYmlsaXR5LCB0b28uICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmWHhvX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJ4eCIsIHh4X21ldGhvZHMsIG1vZHVsZV9kb2MpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoInh4IiwgeHhfbWV0aG9kcywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlpZiAoRXJyb3JPYmplY3QgPT0gTlVMTCkgewotCQlFcnJvck9iamVjdCA9IFB5RXJyX05ld0V4Y2VwdGlvbigieHguZXJyb3IiLCBOVUxMLCBOVUxMKTsKLQkJaWYgKEVycm9yT2JqZWN0ID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfQotCVB5X0lOQ1JFRihFcnJvck9iamVjdCk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIEVycm9yT2JqZWN0KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGlmIChFcnJvck9iamVjdCA9PSBOVUxMKSB7CisgICAgICAgIEVycm9yT2JqZWN0ID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJ4eC5lcnJvciIsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoRXJyb3JPYmplY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUHlfSU5DUkVGKEVycm9yT2JqZWN0KTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgRXJyb3JPYmplY3QpOwogCi0JLyogQWRkIFN0ciAqLwotCWlmIChQeVR5cGVfUmVhZHkoJlN0cl9UeXBlKSA8IDApCi0JCXJldHVybjsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlN0ciIsIChQeU9iamVjdCAqKSZTdHJfVHlwZSk7CisgICAgLyogQWRkIFN0ciAqLworICAgIGlmIChQeVR5cGVfUmVhZHkoJlN0cl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlN0ciIsIChQeU9iamVjdCAqKSZTdHJfVHlwZSk7CiAKLQkvKiBBZGQgTnVsbCAqLwotCWlmIChQeVR5cGVfUmVhZHkoJk51bGxfVHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJOdWxsIiwgKFB5T2JqZWN0ICopJk51bGxfVHlwZSk7CisgICAgLyogQWRkIE51bGwgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZOdWxsX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTnVsbCIsIChQeU9iamVjdCAqKSZOdWxsX1R5cGUpOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy94eHN1YnR5cGUuYyBiL01vZHVsZXMveHhzdWJ0eXBlLmMKaW5kZXggMGNmMGI4MS4uZDQzMTZlNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eHN1YnR5cGUuYworKysgYi9Nb2R1bGVzL3h4c3VidHlwZS5jCkBAIC0xOSwyNzkgKzE5LDI3OSBAQAogLyogc3BhbWxpc3QgLS0gYSBsaXN0IHN1YnR5cGUgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5TGlzdE9iamVjdCBsaXN0OwotCWludCBzdGF0ZTsKKyAgICBQeUxpc3RPYmplY3QgbGlzdDsKKyAgICBpbnQgc3RhdGU7CiB9IHNwYW1saXN0b2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKgogc3BhbWxpc3RfZ2V0c3RhdGUoc3BhbWxpc3RvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldHN0YXRlIikpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5zdGF0ZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0c3RhdGUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHNlbGYtPnN0YXRlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNwYW1saXN0X3NldHN0YXRlKHNwYW1saXN0b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgc3RhdGU7CisgICAgaW50IHN0YXRlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldHN0YXRlIiwgJnN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2VsZi0+c3RhdGUgPSBzdGF0ZTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldHN0YXRlIiwgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+c3RhdGUgPSBzdGF0ZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcGFtbGlzdF9zcGVjaWFsbWV0aChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlUdXBsZV9OZXcoMyk7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5VHVwbGVfTmV3KDMpOwogCi0JaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JCWlmIChzZWxmID09IE5VTEwpCi0JCQlzZWxmID0gUHlfTm9uZTsKLQkJaWYgKGt3ID09IE5VTEwpCi0JCQlrdyA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIHNlbGYpOwotCQlQeV9JTkNSRUYoYXJncyk7Ci0JCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAxLCBhcmdzKTsKLQkJUHlfSU5DUkVGKGt3KTsKLQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDIsIGt3KTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgICAgIHNlbGYgPSBQeV9Ob25lOworICAgICAgICBpZiAoa3cgPT0gTlVMTCkKKyAgICAgICAgICAgIGt3ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwgc2VsZik7CisgICAgICAgIFB5X0lOQ1JFRihhcmdzKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDEsIGFyZ3MpOworICAgICAgICBQeV9JTkNSRUYoa3cpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMiwga3cpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3BhbWxpc3RfbWV0aG9kc1tdID0gewotCXsiZ2V0c3RhdGUiLCAoUHlDRnVuY3Rpb24pc3BhbWxpc3RfZ2V0c3RhdGUsIE1FVEhfVkFSQVJHUywKLQkgCVB5RG9jX1NUUigiZ2V0c3RhdGUoKSAtPiBzdGF0ZSIpfSwKLQl7InNldHN0YXRlIiwgKFB5Q0Z1bmN0aW9uKXNwYW1saXN0X3NldHN0YXRlLCBNRVRIX1ZBUkFSR1MsCi0JIAlQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSIpfSwKLQkvKiBUaGVzZSBlbnRyaWVzIGRpZmZlciBvbmx5IGluIHRoZSBmbGFnczsgdGhleSBhcmUgdXNlZCBieSB0aGUgdGVzdHMKLQkgICBpbiB0ZXN0LnRlc3RfZGVzY3IuICovCi0JeyJjbGFzc21ldGgiLCAoUHlDRnVuY3Rpb24pc3BhbWxpc3Rfc3BlY2lhbG1ldGgsCi0JCU1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAotCSAJUHlEb2NfU1RSKCJjbGFzc21ldGgoKmFyZ3MsICoqa3cpIil9LAotCXsic3RhdGljbWV0aCIsIChQeUNGdW5jdGlvbilzcGFtbGlzdF9zcGVjaWFsbWV0aCwKLQkJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUyB8IE1FVEhfU1RBVElDLAotCSAJUHlEb2NfU1RSKCJzdGF0aWNtZXRoKCphcmdzLCAqKmt3KSIpfSwKLQl7TlVMTCwJTlVMTH0sCisgICAgeyJnZXRzdGF0ZSIsIChQeUNGdW5jdGlvbilzcGFtbGlzdF9nZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImdldHN0YXRlKCkgLT4gc3RhdGUiKX0sCisgICAgeyJzZXRzdGF0ZSIsIChQeUNGdW5jdGlvbilzcGFtbGlzdF9zZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSIpfSwKKyAgICAvKiBUaGVzZSBlbnRyaWVzIGRpZmZlciBvbmx5IGluIHRoZSBmbGFnczsgdGhleSBhcmUgdXNlZCBieSB0aGUgdGVzdHMKKyAgICAgICBpbiB0ZXN0LnRlc3RfZGVzY3IuICovCisgICAgeyJjbGFzc21ldGgiLCAoUHlDRnVuY3Rpb24pc3BhbWxpc3Rfc3BlY2lhbG1ldGgsCisgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMgfCBNRVRIX0NMQVNTLAorICAgICAgICBQeURvY19TVFIoImNsYXNzbWV0aCgqYXJncywgKiprdykiKX0sCisgICAgeyJzdGF0aWNtZXRoIiwgKFB5Q0Z1bmN0aW9uKXNwYW1saXN0X3NwZWNpYWxtZXRoLAorICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTIHwgTUVUSF9TVEFUSUMsCisgICAgICAgIFB5RG9jX1NUUigic3RhdGljbWV0aCgqYXJncywgKiprdykiKX0sCisgICAge05VTEwsICAgICAgTlVMTH0sCiB9OwogCiBzdGF0aWMgaW50CiBzcGFtbGlzdF9pbml0KHNwYW1saXN0b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JaWYgKFB5TGlzdF9UeXBlLnRwX2luaXQoKFB5T2JqZWN0ICopc2VsZiwgYXJncywga3dkcykgPCAwKQotCQlyZXR1cm4gLTE7Ci0Jc2VsZi0+c3RhdGUgPSAwOwotCXJldHVybiAwOworICAgIGlmIChQeUxpc3RfVHlwZS50cF9pbml0KChQeU9iamVjdCAqKXNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNlbGYtPnN0YXRlID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNwYW1saXN0X3N0YXRlX2dldChzcGFtbGlzdG9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+c3RhdGUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5zdGF0ZSk7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBzcGFtbGlzdF9nZXRzZXRzW10gPSB7Ci0JeyJzdGF0ZSIsIChnZXR0ZXIpc3BhbWxpc3Rfc3RhdGVfZ2V0LCBOVUxMLAotCSBQeURvY19TVFIoImFuIGludCB2YXJpYWJsZSBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3NlcyIpfSwKLQl7MH0KKyAgICB7InN0YXRlIiwgKGdldHRlcilzcGFtbGlzdF9zdGF0ZV9nZXQsIE5VTEwsCisgICAgIFB5RG9jX1NUUigiYW4gaW50IHZhcmlhYmxlIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIil9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBzcGFtbGlzdF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCi0JInh4c3VidHlwZS5zcGFtbGlzdCIsCi0Jc2l6ZW9mKHNwYW1saXN0b2JqZWN0KSwKLQkwLAotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXNwYW1saXN0X21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0Jc3BhbWxpc3RfZ2V0c2V0cywJCQkvKiB0cF9nZXRzZXQgKi8KLQlERUZFUlJFRF9BRERSRVNTKCZQeUxpc3RfVHlwZSksCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JKGluaXRwcm9jKXNwYW1saXN0X2luaXQsCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCisgICAgInh4c3VidHlwZS5zcGFtbGlzdCIsCisgICAgc2l6ZW9mKHNwYW1saXN0b2JqZWN0KSwKKyAgICAwLAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzcGFtbGlzdF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBzcGFtbGlzdF9nZXRzZXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIERFRkVSUkVEX0FERFJFU1MoJlB5TGlzdF9UeXBlKSwgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2Mpc3BhbWxpc3RfaW5pdCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIC8qIHNwYW1kaWN0IC0tIGEgZGljdCBzdWJ0eXBlICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeURpY3RPYmplY3QgZGljdDsKLQlpbnQgc3RhdGU7CisgICAgUHlEaWN0T2JqZWN0IGRpY3Q7CisgICAgaW50IHN0YXRlOwogfSBzcGFtZGljdG9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNwYW1kaWN0X2dldHN0YXRlKHNwYW1kaWN0b2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRzdGF0ZSIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+c3RhdGUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldHN0YXRlIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhzZWxmLT5zdGF0ZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcGFtZGljdF9zZXRzdGF0ZShzcGFtZGljdG9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHN0YXRlOworICAgIGludCBzdGF0ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRzdGF0ZSIsICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPnN0YXRlID0gc3RhdGU7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRzdGF0ZSIsICZzdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnN0YXRlID0gc3RhdGU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3BhbWRpY3RfbWV0aG9kc1tdID0gewotCXsiZ2V0c3RhdGUiLCAoUHlDRnVuY3Rpb24pc3BhbWRpY3RfZ2V0c3RhdGUsIE1FVEhfVkFSQVJHUywKLQkgCVB5RG9jX1NUUigiZ2V0c3RhdGUoKSAtPiBzdGF0ZSIpfSwKLQl7InNldHN0YXRlIiwgKFB5Q0Z1bmN0aW9uKXNwYW1kaWN0X3NldHN0YXRlLCBNRVRIX1ZBUkFSR1MsCi0JIAlQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSIpfSwKLQl7TlVMTCwJTlVMTH0sCisgICAgeyJnZXRzdGF0ZSIsIChQeUNGdW5jdGlvbilzcGFtZGljdF9nZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImdldHN0YXRlKCkgLT4gc3RhdGUiKX0sCisgICAgeyJzZXRzdGF0ZSIsIChQeUNGdW5jdGlvbilzcGFtZGljdF9zZXRzdGF0ZSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoInNldHN0YXRlKHN0YXRlKSIpfSwKKyAgICB7TlVMTCwgICAgICBOVUxMfSwKIH07CiAKIHN0YXRpYyBpbnQKIHNwYW1kaWN0X2luaXQoc3BhbWRpY3RvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpZiAoUHlEaWN0X1R5cGUudHBfaW5pdCgoUHlPYmplY3QgKilzZWxmLCBhcmdzLCBrd2RzKSA8IDApCi0JCXJldHVybiAtMTsKLQlzZWxmLT5zdGF0ZSA9IDA7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5RGljdF9UeXBlLnRwX2luaXQoKFB5T2JqZWN0ICopc2VsZiwgYXJncywga3dkcykgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc2VsZi0+c3RhdGUgPSAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgc3BhbWRpY3RfbWVtYmVyc1tdID0gewotCXsic3RhdGUiLCBUX0lOVCwgb2Zmc2V0b2Yoc3BhbWRpY3RvYmplY3QsIHN0YXRlKSwgUkVBRE9OTFksCi0JIFB5RG9jX1NUUigiYW4gaW50IHZhcmlhYmxlIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIil9LAotCXswfQorICAgIHsic3RhdGUiLCBUX0lOVCwgb2Zmc2V0b2Yoc3BhbWRpY3RvYmplY3QsIHN0YXRlKSwgUkVBRE9OTFksCisgICAgIFB5RG9jX1NUUigiYW4gaW50IHZhcmlhYmxlIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIil9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBzcGFtZGljdF90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCi0JInh4c3VidHlwZS5zcGFtZGljdCIsCi0Jc2l6ZW9mKHNwYW1kaWN0b2JqZWN0KSwKLQkwLAotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXNwYW1kaWN0X21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCXNwYW1kaWN0X21lbWJlcnMsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQlERUZFUlJFRF9BRERSRVNTKCZQeURpY3RfVHlwZSksCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JKGluaXRwcm9jKXNwYW1kaWN0X2luaXQsCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JMCwJCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCisgICAgInh4c3VidHlwZS5zcGFtZGljdCIsCisgICAgc2l6ZW9mKHNwYW1kaWN0b2JqZWN0KSwKKyAgICAwLAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzcGFtZGljdF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBzcGFtZGljdF9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIERFRkVSUkVEX0FERFJFU1MoJlB5RGljdF9UeXBlKSwgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2Mpc3BhbWRpY3RfaW5pdCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcGFtX2JlbmNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqb2JqLCAqbmFtZSwgKnJlczsKLQlpbnQgbiA9IDEwMDA7Ci0JdGltZV90IHQwLCB0MTsKKyAgICBQeU9iamVjdCAqb2JqLCAqbmFtZSwgKnJlczsKKyAgICBpbnQgbiA9IDEwMDA7CisgICAgdGltZV90IHQwLCB0MTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT1N8aSIsICZvYmosICZuYW1lLCAmbikpCi0JCXJldHVybiBOVUxMOwotCXQwID0gY2xvY2soKTsKLQl3aGlsZSAoLS1uID49IDApIHsKLQkJcmVzID0gUHlPYmplY3RfR2V0QXR0cihvYmosIG5hbWUpOwotCQlpZiAocmVzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JfQotCXQxID0gY2xvY2soKTsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpKHQxLXQwKSAvIENMT0NLU19QRVJfU0VDKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9TfGkiLCAmb2JqLCAmbmFtZSwgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0MCA9IGNsb2NrKCk7CisgICAgd2hpbGUgKC0tbiA+PSAwKSB7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBuYW1lKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgIH0KKyAgICB0MSA9IGNsb2NrKCk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKSh0MS10MCkgLyBDTE9DS1NfUEVSX1NFQyk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB4eHN1YnR5cGVfZnVuY3Rpb25zW10gPSB7Ci0JeyJiZW5jaCIsCXNwYW1fYmVuY2gsIAlNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJiZW5jaCIsICAgICAgICAgICBzcGFtX2JlbmNoLCAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlNT0RJTklUX0ZVTkMKIGluaXR4eHN1YnR5cGUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAotCS8qIEZpbGwgaW4gZGVmZXJyZWQgZGF0YSBhZGRyZXNzZXMuICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKLQkgICBQeVR5cGVfUmVhZHkoKSBpcyBjYWxsZWQuICBOb3RlIHRoYXQgUHlUeXBlX1JlYWR5KCkgYXV0b21hdGljYWxseQotCSAgIGluaXRpYWxpemVzIHRoZSBvYi5vYl90eXBlIGZpZWxkIHRvICZQeVR5cGVfVHlwZSBpZiBpdCdzIE5VTEwsCi0JICAgc28gaXQncyBub3QgbmVjZXNzYXJ5IHRvIGZpbGwgaW4gb2JfdHlwZSBmaXJzdC4gKi8KLQlzcGFtZGljdF90eXBlLnRwX2Jhc2UgPSAmUHlEaWN0X1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWRpY3RfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgLyogRmlsbCBpbiBkZWZlcnJlZCBkYXRhIGFkZHJlc3Nlcy4gIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZQorICAgICAgIFB5VHlwZV9SZWFkeSgpIGlzIGNhbGxlZC4gIE5vdGUgdGhhdCBQeVR5cGVfUmVhZHkoKSBhdXRvbWF0aWNhbGx5CisgICAgICAgaW5pdGlhbGl6ZXMgdGhlIG9iLm9iX3R5cGUgZmllbGQgdG8gJlB5VHlwZV9UeXBlIGlmIGl0J3MgTlVMTCwKKyAgICAgICBzbyBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gZmlsbCBpbiBvYl90eXBlIGZpcnN0LiAqLworICAgIHNwYW1kaWN0X3R5cGUudHBfYmFzZSA9ICZQeURpY3RfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZzcGFtZGljdF90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCXNwYW1saXN0X3R5cGUudHBfYmFzZSA9ICZQeUxpc3RfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZzcGFtbGlzdF90eXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBzcGFtbGlzdF90eXBlLnRwX2Jhc2UgPSAmUHlMaXN0X1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWxpc3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQltID0gUHlfSW5pdE1vZHVsZTMoInh4c3VidHlwZSIsCi0JCQkgICB4eHN1YnR5cGVfZnVuY3Rpb25zLAotCQkJICAgeHhzdWJ0eXBlX19kb2NfXyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygieHhzdWJ0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdWJ0eXBlX2Z1bmN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgeHhzdWJ0eXBlX19kb2NfXyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWxpc3RfdHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWRpY3RfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWxpc3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmc3BhbWRpY3RfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CiAKLQlQeV9JTkNSRUYoJnNwYW1saXN0X3R5cGUpOwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgInNwYW1saXN0IiwKLQkJCSAgICAgICAoUHlPYmplY3QgKikgJnNwYW1saXN0X3R5cGUpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5X0lOQ1JFRigmc3BhbWxpc3RfdHlwZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3BhbWxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopICZzcGFtbGlzdF90eXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCVB5X0lOQ1JFRigmc3BhbWRpY3RfdHlwZSk7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAic3BhbWRpY3QiLAotCQkJICAgICAgIChQeU9iamVjdCAqKSAmc3BhbWRpY3RfdHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlfSU5DUkVGKCZzcGFtZGljdF90eXBlKTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJzcGFtZGljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKikgJnNwYW1kaWN0X3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy95dXYuaCBiL01vZHVsZXMveXV2LmgKaW5kZXggNzM4YzRlNS4uMWU1ZmQyOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy95dXYuaAorKysgYi9Nb2R1bGVzL3l1di5oCkBAIC0xOSw0MSArMTksNDEgQEAKICAqICstLS0tLS0tLS0tLS0tLS0tLS0tKwogICovCiBzdHJ1Y3QgeXV2NDExIHsKLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBpbnQgZHVtbXk6ODsKLQkJdW5zaWduZWQgaW50IHkwOjg7Ci0JCXVuc2lnbmVkIGludCB1MDoyOwotCQl1bnNpZ25lZCBpbnQgdjA6MjsKLQkJdW5zaWduZWQgaW50IHkxOjg7Ci0JCXVuc2lnbmVkIGludCB1MToyOwotCQl1bnNpZ25lZCBpbnQgdjE6MjsKLQl9IHZbNF07CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5zaWduZWQgaW50IGR1bW15Ojg7CisgICAgICAgIHVuc2lnbmVkIGludCB5MDo4OworICAgICAgICB1bnNpZ25lZCBpbnQgdTA6MjsKKyAgICAgICAgdW5zaWduZWQgaW50IHYwOjI7CisgICAgICAgIHVuc2lnbmVkIGludCB5MTo4OworICAgICAgICB1bnNpZ25lZCBpbnQgdTE6MjsKKyAgICAgICAgdW5zaWduZWQgaW50IHYxOjI7CisgICAgfSB2WzRdOwogfTsKIAotI2RlZmluZSBZVVY0MTFfWTAwKHkpCSh5KS52WzBdLnkwCi0jZGVmaW5lIFlVVjQxMV9ZMDEoeSkJKHkpLnZbMV0ueTAKLSNkZWZpbmUgWVVWNDExX1kwMih5KQkoeSkudlsyXS55MAotI2RlZmluZSBZVVY0MTFfWTAzKHkpCSh5KS52WzNdLnkwCi0jZGVmaW5lIFlVVjQxMV9ZMTAoeSkJKHkpLnZbMF0ueTEKLSNkZWZpbmUgWVVWNDExX1kxMSh5KQkoeSkudlsxXS55MQotI2RlZmluZSBZVVY0MTFfWTEyKHkpCSh5KS52WzJdLnkxCi0jZGVmaW5lIFlVVjQxMV9ZMTMoeSkJKHkpLnZbM10ueTEKLSNkZWZpbmUgWVVWNDExX1UwMCh5KQkoKHkpLnZbMF0udTA8PDZ8KHkpLnZbMV0udTA8PDR8KHkpLnZbMl0udTA8PDJ8KHkpLnZbM10udTApCi0jZGVmaW5lIFlVVjQxMV9VMDEoeSkJWVVWNDExX1UwMCh5KQotI2RlZmluZSBZVVY0MTFfVTAyKHkpCVlVVjQxMV9VMDAoeSkKLSNkZWZpbmUgWVVWNDExX1UwMyh5KQlZVVY0MTFfVTAwKHkpCi0jZGVmaW5lIFlVVjQxMV9VMTAoeSkJKCh5KS52WzBdLnUxPDw2fCh5KS52WzFdLnUxPDw0fCh5KS52WzJdLnUxPDwyfCh5KS52WzNdLnUxKQotI2RlZmluZSBZVVY0MTFfVTExKHkpCVlVVjQxMV9VMTAoeSkKLSNkZWZpbmUgWVVWNDExX1UxMih5KQlZVVY0MTFfVTEwKHkpCi0jZGVmaW5lIFlVVjQxMV9VMTMoeSkJWVVWNDExX1UxMCh5KQotI2RlZmluZSBZVVY0MTFfVjAwKHkpCSgoeSkudlswXS52MDw8NnwoeSkudlsxXS52MDw8NHwoeSkudlsyXS52MDw8MnwoeSkudlszXS52MCkKLSNkZWZpbmUgWVVWNDExX1YwMSh5KQlZVVY0MTFfVjAwKHkpCi0jZGVmaW5lIFlVVjQxMV9WMDIoeSkJWVVWNDExX1YwMCh5KQotI2RlZmluZSBZVVY0MTFfVjAzKHkpCVlVVjQxMV9WMDAoeSkKLSNkZWZpbmUgWVVWNDExX1YxMCh5KQkoKHkpLnZbMF0udjE8PDZ8KHkpLnZbMV0udjE8PDR8KHkpLnZbMl0udjE8PDJ8KHkpLnZbM10udjEpCi0jZGVmaW5lIFlVVjQxMV9WMTEoeSkJWVVWNDExX1YxMCh5KQotI2RlZmluZSBZVVY0MTFfVjEyKHkpCVlVVjQxMV9WMTAoeSkKLSNkZWZpbmUgWVVWNDExX1YxMyh5KQlZVVY0MTFfVjEwKHkpCisjZGVmaW5lIFlVVjQxMV9ZMDAoeSkgICAoeSkudlswXS55MAorI2RlZmluZSBZVVY0MTFfWTAxKHkpICAgKHkpLnZbMV0ueTAKKyNkZWZpbmUgWVVWNDExX1kwMih5KSAgICh5KS52WzJdLnkwCisjZGVmaW5lIFlVVjQxMV9ZMDMoeSkgICAoeSkudlszXS55MAorI2RlZmluZSBZVVY0MTFfWTEwKHkpICAgKHkpLnZbMF0ueTEKKyNkZWZpbmUgWVVWNDExX1kxMSh5KSAgICh5KS52WzFdLnkxCisjZGVmaW5lIFlVVjQxMV9ZMTIoeSkgICAoeSkudlsyXS55MQorI2RlZmluZSBZVVY0MTFfWTEzKHkpICAgKHkpLnZbM10ueTEKKyNkZWZpbmUgWVVWNDExX1UwMCh5KSAgICgoeSkudlswXS51MDw8NnwoeSkudlsxXS51MDw8NHwoeSkudlsyXS51MDw8MnwoeSkudlszXS51MCkKKyNkZWZpbmUgWVVWNDExX1UwMSh5KSAgIFlVVjQxMV9VMDAoeSkKKyNkZWZpbmUgWVVWNDExX1UwMih5KSAgIFlVVjQxMV9VMDAoeSkKKyNkZWZpbmUgWVVWNDExX1UwMyh5KSAgIFlVVjQxMV9VMDAoeSkKKyNkZWZpbmUgWVVWNDExX1UxMCh5KSAgICgoeSkudlswXS51MTw8NnwoeSkudlsxXS51MTw8NHwoeSkudlsyXS51MTw8MnwoeSkudlszXS51MSkKKyNkZWZpbmUgWVVWNDExX1UxMSh5KSAgIFlVVjQxMV9VMTAoeSkKKyNkZWZpbmUgWVVWNDExX1UxMih5KSAgIFlVVjQxMV9VMTAoeSkKKyNkZWZpbmUgWVVWNDExX1UxMyh5KSAgIFlVVjQxMV9VMTAoeSkKKyNkZWZpbmUgWVVWNDExX1YwMCh5KSAgICgoeSkudlswXS52MDw8NnwoeSkudlsxXS52MDw8NHwoeSkudlsyXS52MDw8MnwoeSkudlszXS52MCkKKyNkZWZpbmUgWVVWNDExX1YwMSh5KSAgIFlVVjQxMV9WMDAoeSkKKyNkZWZpbmUgWVVWNDExX1YwMih5KSAgIFlVVjQxMV9WMDAoeSkKKyNkZWZpbmUgWVVWNDExX1YwMyh5KSAgIFlVVjQxMV9WMDAoeSkKKyNkZWZpbmUgWVVWNDExX1YxMCh5KSAgICgoeSkudlswXS52MTw8NnwoeSkudlsxXS52MTw8NHwoeSkudlsyXS52MTw8MnwoeSkudlszXS52MSkKKyNkZWZpbmUgWVVWNDExX1YxMSh5KSAgIFlVVjQxMV9WMTAoeSkKKyNkZWZpbmUgWVVWNDExX1YxMih5KSAgIFlVVjQxMV9WMTAoeSkKKyNkZWZpbmUgWVVWNDExX1YxMyh5KSAgIFlVVjQxMV9WMTAoeSkKIAogLyoKICAqIENvbXByZXNzaW9uIExpYnJhcnkgWVVWIDQ6MjoyIGZvcm1hdC4KQEAgLTY1LDE3ICs2NSwxNyBAQAogICogKy0tLS0tLS0rCiAgKi8KIHN0cnVjdCB5dXY0MjIgewotCXVuc2lnbmVkIGludCB1Ojg7Ci0JdW5zaWduZWQgaW50IHkwOjg7Ci0JdW5zaWduZWQgaW50IHY6ODsKLQl1bnNpZ25lZCBpbnQgeTE6ODsKKyAgICB1bnNpZ25lZCBpbnQgdTo4OworICAgIHVuc2lnbmVkIGludCB5MDo4OworICAgIHVuc2lnbmVkIGludCB2Ojg7CisgICAgdW5zaWduZWQgaW50IHkxOjg7CiB9OwotI2RlZmluZSBZVVY0MjJfWTAoeSkJKHkpLnkwCi0jZGVmaW5lIFlVVjQyMl9ZMSh5KQkoeSkueTEKLSNkZWZpbmUgWVVWNDIyX1UwKHkpCSh5KS51Ci0jZGVmaW5lIFlVVjQyMl9VMSh5KQkoeSkudQotI2RlZmluZSBZVVY0MjJfVjAoeSkJKHkpLnYKLSNkZWZpbmUgWVVWNDIyX1YxKHkpCSh5KS52CisjZGVmaW5lIFlVVjQyMl9ZMCh5KSAgICAoeSkueTAKKyNkZWZpbmUgWVVWNDIyX1kxKHkpICAgICh5KS55MQorI2RlZmluZSBZVVY0MjJfVTAoeSkgICAgKHkpLnUKKyNkZWZpbmUgWVVWNDIyX1UxKHkpICAgICh5KS51CisjZGVmaW5lIFlVVjQyMl9WMCh5KSAgICAoeSkudgorI2RlZmluZSBZVVY0MjJfVjEoeSkgICAgKHkpLnYKIAogLyoKICAqIENvbXByZXNzaW9uIGxpYnJhcnkgWVVWIDQ6MjoyIER1cGxpY2F0ZSBDaHJvbWEgZm9ybWF0LgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy95dXZjb252ZXJ0LmMgYi9Nb2R1bGVzL3l1dmNvbnZlcnQuYwppbmRleCBlNTMzM2Q5Li5hMGZhNjM5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3l1dmNvbnZlcnQuYworKysgYi9Nb2R1bGVzL3l1dmNvbnZlcnQuYwpAQCAtNCwxMTUgKzQsMTE1IEBACiB2b2lkCiB5dXZfc3Y0MTFfdG9fY2w0MjJkYyhpbnQgaW52ZXJ0LCB2b2lkICpkYXRhLCB2b2lkICp5dXYsIGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKLQlzdHJ1Y3QgeXV2NDExICppbiA9IGRhdGE7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X2V2ZW4gPSB5dXY7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X29kZCA9IG91dF9ldmVuICsgd2lkdGggLyAyOwotCWludCBpLCBqOwkJLyogY291bnRlcnMgKi8KKyAgICBzdHJ1Y3QgeXV2NDExICppbiA9IGRhdGE7CisgICAgc3RydWN0IHl1djQyMiAqb3V0X2V2ZW4gPSB5dXY7CisgICAgc3RydWN0IHl1djQyMiAqb3V0X29kZCA9IG91dF9ldmVuICsgd2lkdGggLyAyOworICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVycyAqLwogCi0JZm9yIChpID0gaGVpZ2h0IC8gMjsgaS0tOyApIHsKLQkJZm9yIChqID0gd2lkdGggLyA0OyBqLS07ICkgewotCQkJWVVWNDIyX1kwKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKCppbik7Ci0JCQlZVVY0MjJfVTAoKm91dF9ldmVuKSA9IFlVVjQxMV9VMDAoKmluKTsKLQkJCVlVVjQyMl9WMCgqb3V0X2V2ZW4pID0gWVVWNDExX1YwMCgqaW4pOwotCQkJWVVWNDIyX1kxKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAxKCppbik7Ci0JCQlvdXRfZXZlbisrOwotCQkJWVVWNDIyX1kwKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAyKCppbik7Ci0JCQlZVVY0MjJfVTAoKm91dF9ldmVuKSA9IFlVVjQxMV9VMDIoKmluKTsKLQkJCVlVVjQyMl9WMCgqb3V0X2V2ZW4pID0gWVVWNDExX1YwMigqaW4pOwotCQkJWVVWNDIyX1kxKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAzKCppbik7Ci0JCQlvdXRfZXZlbisrOwotCQkJWVVWNDIyX1kwKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMTAoKmluKTsKLQkJCVlVVjQyMl9VMCgqb3V0X29kZCkgPSBZVVY0MTFfVTEwKCppbik7Ci0JCQlZVVY0MjJfVjAoKm91dF9vZGQpID0gWVVWNDExX1YxMCgqaW4pOwotCQkJWVVWNDIyX1kxKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMTEoKmluKTsKLQkJCW91dF9vZGQrKzsKLQkJCVlVVjQyMl9ZMCgqb3V0X29kZCkgPSBZVVY0MTFfWTEyKCppbik7Ci0JCQlZVVY0MjJfVTAoKm91dF9vZGQpID0gWVVWNDExX1UxMigqaW4pOwotCQkJWVVWNDIyX1YwKCpvdXRfb2RkKSA9IFlVVjQxMV9WMTIoKmluKTsKLQkJCVlVVjQyMl9ZMSgqb3V0X29kZCkgPSBZVVY0MTFfWTEzKCppbik7Ci0JCQlvdXRfb2RkKys7Ci0JCQlpbisrOwotCQl9Ci0JCW91dF9ldmVuICs9IHdpZHRoIC8gMjsKLQkJb3V0X29kZCArPSB3aWR0aCAvIDI7Ci0JfQorICAgIGZvciAoaSA9IGhlaWdodCAvIDI7IGktLTsgKSB7CisgICAgICAgIGZvciAoaiA9IHdpZHRoIC8gNDsgai0tOyApIHsKKyAgICAgICAgICAgIFlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMCgqaW4pOworICAgICAgICAgICAgWVVWNDIyX1UwKCpvdXRfZXZlbikgPSBZVVY0MTFfVTAwKCppbik7CisgICAgICAgICAgICBZVVY0MjJfVjAoKm91dF9ldmVuKSA9IFlVVjQxMV9WMDAoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9ZMSgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMSgqaW4pOworICAgICAgICAgICAgb3V0X2V2ZW4rKzsKKyAgICAgICAgICAgIFlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMigqaW4pOworICAgICAgICAgICAgWVVWNDIyX1UwKCpvdXRfZXZlbikgPSBZVVY0MTFfVTAyKCppbik7CisgICAgICAgICAgICBZVVY0MjJfVjAoKm91dF9ldmVuKSA9IFlVVjQxMV9WMDIoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9ZMSgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMygqaW4pOworICAgICAgICAgICAgb3V0X2V2ZW4rKzsKKyAgICAgICAgICAgIFlVVjQyMl9ZMCgqb3V0X29kZCkgPSBZVVY0MTFfWTEwKCppbik7CisgICAgICAgICAgICBZVVY0MjJfVTAoKm91dF9vZGQpID0gWVVWNDExX1UxMCgqaW4pOworICAgICAgICAgICAgWVVWNDIyX1YwKCpvdXRfb2RkKSA9IFlVVjQxMV9WMTAoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9ZMSgqb3V0X29kZCkgPSBZVVY0MTFfWTExKCppbik7CisgICAgICAgICAgICBvdXRfb2RkKys7CisgICAgICAgICAgICBZVVY0MjJfWTAoKm91dF9vZGQpID0gWVVWNDExX1kxMigqaW4pOworICAgICAgICAgICAgWVVWNDIyX1UwKCpvdXRfb2RkKSA9IFlVVjQxMV9VMTIoKmluKTsKKyAgICAgICAgICAgIFlVVjQyMl9WMCgqb3V0X29kZCkgPSBZVVY0MTFfVjEyKCppbik7CisgICAgICAgICAgICBZVVY0MjJfWTEoKm91dF9vZGQpID0gWVVWNDExX1kxMygqaW4pOworICAgICAgICAgICAgb3V0X29kZCsrOworICAgICAgICAgICAgaW4rKzsKKyAgICAgICAgfQorICAgICAgICBvdXRfZXZlbiArPSB3aWR0aCAvIDI7CisgICAgICAgIG91dF9vZGQgKz0gd2lkdGggLyAyOworICAgIH0KIH0KIAogdm9pZAogeXV2X3N2NDExX3RvX2NsNDIyZGNfcXVhcnRlcnNpemUoaW50IGludmVydCwgdm9pZCAqZGF0YSwgdm9pZCAqeXV2LAotCQkJCSBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7Ci0JaW50IHc0ID0gd2lkdGggLyA0OwkvKiBxdWFydGVyIG9mIHdpZHRoIGlzIHVzZWQgb2Z0ZW4gKi8KLQlzdHJ1Y3QgeXV2NDExICppbl9ldmVuID0gZGF0YTsKLQlzdHJ1Y3QgeXV2NDExICppbl9vZGQgPSBpbl9ldmVuICsgdzQ7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X2V2ZW4gPSB5dXY7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X29kZCA9IG91dF9ldmVuICsgdzQ7Ci0JaW50IGksIGo7CQkvKiBjb3VudGVycyAqLwotCWludCB1LCB2OwkJLyogVSBhbmQgViB2YWx1ZXMgKi8KKyAgICBpbnQgdzQgPSB3aWR0aCAvIDQ7ICAgICAgICAgLyogcXVhcnRlciBvZiB3aWR0aCBpcyB1c2VkIG9mdGVuICovCisgICAgc3RydWN0IHl1djQxMSAqaW5fZXZlbiA9IGRhdGE7CisgICAgc3RydWN0IHl1djQxMSAqaW5fb2RkID0gaW5fZXZlbiArIHc0OworICAgIHN0cnVjdCB5dXY0MjIgKm91dF9ldmVuID0geXV2OworICAgIHN0cnVjdCB5dXY0MjIgKm91dF9vZGQgPSBvdXRfZXZlbiArIHc0OworICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVycyAqLworICAgIGludCB1LCB2OyAgICAgICAgICAgICAgICAgICAvKiBVIGFuZCBWIHZhbHVlcyAqLwogCi0JZm9yIChpID0gaGVpZ2h0IC8gNDsgaS0tOyApIHsKLQkJZm9yIChqID0gdzQ7IGotLTsgKSB7Ci0JCQl1ID0gWVVWNDExX1UwMCgqaW5fZXZlbik7Ci0JCQl2ID0gWVVWNDExX1YwMCgqaW5fZXZlbik7CisgICAgZm9yIChpID0gaGVpZ2h0IC8gNDsgaS0tOyApIHsKKyAgICAgICAgZm9yIChqID0gdzQ7IGotLTsgKSB7CisgICAgICAgICAgICB1ID0gWVVWNDExX1UwMCgqaW5fZXZlbik7CisgICAgICAgICAgICB2ID0gWVVWNDExX1YwMCgqaW5fZXZlbik7CiAKLQkJCVlVVjQyMl9ZMCgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMCgqaW5fZXZlbik7Ci0JCQlZVVY0MjJfVTAoKm91dF9ldmVuKSA9IHU7Ci0JCQlZVVY0MjJfVjAoKm91dF9ldmVuKSA9IHY7Ci0JCQlZVVY0MjJfWTEoKm91dF9ldmVuKSA9IFlVVjQxMV9ZMDIoKmluX2V2ZW4pOworICAgICAgICAgICAgWVVWNDIyX1kwKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKCppbl9ldmVuKTsKKyAgICAgICAgICAgIFlVVjQyMl9VMCgqb3V0X2V2ZW4pID0gdTsKKyAgICAgICAgICAgIFlVVjQyMl9WMCgqb3V0X2V2ZW4pID0gdjsKKyAgICAgICAgICAgIFlVVjQyMl9ZMSgqb3V0X2V2ZW4pID0gWVVWNDExX1kwMigqaW5fZXZlbik7CiAKLQkJCVlVVjQyMl9ZMCgqb3V0X29kZCkgPSBZVVY0MTFfWTEwKCppbl9vZGQpOwotCQkJWVVWNDIyX1UwKCpvdXRfb2RkKSA9IHU7Ci0JCQlZVVY0MjJfVjAoKm91dF9vZGQpID0gdjsKLQkJCVlVVjQyMl9ZMSgqb3V0X29kZCkgPSBZVVY0MTFfWTEyKCppbl9vZGQpOworICAgICAgICAgICAgWVVWNDIyX1kwKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMTAoKmluX29kZCk7CisgICAgICAgICAgICBZVVY0MjJfVTAoKm91dF9vZGQpID0gdTsKKyAgICAgICAgICAgIFlVVjQyMl9WMCgqb3V0X29kZCkgPSB2OworICAgICAgICAgICAgWVVWNDIyX1kxKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMTIoKmluX29kZCk7CiAKLQkJCWluX2V2ZW4rKzsKLQkJCWluX29kZCsrOwotCQkJb3V0X2V2ZW4rKzsKLQkJCW91dF9vZGQrKzsKLQkJfQotCQlpbl9ldmVuICs9IHc0OwotCQlpbl9vZGQgKz0gdzQ7Ci0JCW91dF9ldmVuICs9IHc0OwotCQlvdXRfb2RkICs9IHc0OwotCX0KKyAgICAgICAgICAgIGluX2V2ZW4rKzsKKyAgICAgICAgICAgIGluX29kZCsrOworICAgICAgICAgICAgb3V0X2V2ZW4rKzsKKyAgICAgICAgICAgIG91dF9vZGQrKzsKKyAgICAgICAgfQorICAgICAgICBpbl9ldmVuICs9IHc0OworICAgICAgICBpbl9vZGQgKz0gdzQ7CisgICAgICAgIG91dF9ldmVuICs9IHc0OworICAgICAgICBvdXRfb2RkICs9IHc0OworICAgIH0KIH0KIAogdm9pZAogeXV2X3N2NDExX3RvX2NsNDIyZGNfc2l4dGVlbnRoc2l6ZShpbnQgaW52ZXJ0LCB2b2lkICpkYXRhLCB2b2lkICp5dXYsCi0JCQkJICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7Ci0JaW50IHc0XzMgPSAzICogd2lkdGggLyA0OyAvKiB0aHJlZSBxdWFydGVycyBvZiB3aWR0aCBpcyB1c2VkIG9mdGVuICovCi0JaW50IHc4ID0gd2lkdGggLyA4OwkvKiBhbmQgc28gaXMgb25lIGVpZ2h0aCAqLwotCXN0cnVjdCB5dXY0MTEgKmluX2V2ZW4gPSBkYXRhOwotCXN0cnVjdCB5dXY0MTEgKmluX29kZCA9IGluX2V2ZW4gKyB3aWR0aCAvIDI7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X2V2ZW4gPSB5dXY7Ci0Jc3RydWN0IHl1djQyMiAqb3V0X29kZCA9IG91dF9ldmVuICsgdzg7Ci0JaW50IGksIGo7CQkvKiBjb3VudGVycyAqLwotCWludCB1LCB2OwkJLyogVSBhbmQgViB2YWx1ZXMgKi8KKyAgICBpbnQgdzRfMyA9IDMgKiB3aWR0aCAvIDQ7IC8qIHRocmVlIHF1YXJ0ZXJzIG9mIHdpZHRoIGlzIHVzZWQgb2Z0ZW4gKi8KKyAgICBpbnQgdzggPSB3aWR0aCAvIDg7ICAgICAgICAgLyogYW5kIHNvIGlzIG9uZSBlaWdodGggKi8KKyAgICBzdHJ1Y3QgeXV2NDExICppbl9ldmVuID0gZGF0YTsKKyAgICBzdHJ1Y3QgeXV2NDExICppbl9vZGQgPSBpbl9ldmVuICsgd2lkdGggLyAyOworICAgIHN0cnVjdCB5dXY0MjIgKm91dF9ldmVuID0geXV2OworICAgIHN0cnVjdCB5dXY0MjIgKm91dF9vZGQgPSBvdXRfZXZlbiArIHc4OworICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVycyAqLworICAgIGludCB1LCB2OyAgICAgICAgICAgICAgICAgICAvKiBVIGFuZCBWIHZhbHVlcyAqLwogCi0JZm9yIChpID0gaGVpZ2h0IC8gODsgaS0tOyApIHsKLQkJZm9yIChqID0gdzg7IGotLTsgKSB7Ci0JCQl1ID0gWVVWNDExX1UwMChpbl9ldmVuWzBdKTsKLQkJCXYgPSBZVVY0MTFfVjAwKGluX2V2ZW5bMF0pOworICAgIGZvciAoaSA9IGhlaWdodCAvIDg7IGktLTsgKSB7CisgICAgICAgIGZvciAoaiA9IHc4OyBqLS07ICkgeworICAgICAgICAgICAgdSA9IFlVVjQxMV9VMDAoaW5fZXZlblswXSk7CisgICAgICAgICAgICB2ID0gWVVWNDExX1YwMChpbl9ldmVuWzBdKTsKIAotCQkJWVVWNDIyX1kwKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKGluX2V2ZW5bMF0pOwotCQkJWVVWNDIyX1UwKCpvdXRfZXZlbikgPSB1OwotCQkJWVVWNDIyX1YwKCpvdXRfZXZlbikgPSB2OwotCQkJWVVWNDIyX1kxKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKGluX2V2ZW5bMV0pOworICAgICAgICAgICAgWVVWNDIyX1kwKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKGluX2V2ZW5bMF0pOworICAgICAgICAgICAgWVVWNDIyX1UwKCpvdXRfZXZlbikgPSB1OworICAgICAgICAgICAgWVVWNDIyX1YwKCpvdXRfZXZlbikgPSB2OworICAgICAgICAgICAgWVVWNDIyX1kxKCpvdXRfZXZlbikgPSBZVVY0MTFfWTAwKGluX2V2ZW5bMV0pOwogCi0JCQlZVVY0MjJfWTAoKm91dF9vZGQpID0gWVVWNDExX1kwMChpbl9vZGRbMF0pOwotCQkJWVVWNDIyX1UwKCpvdXRfb2RkKSA9IHU7Ci0JCQlZVVY0MjJfVjAoKm91dF9vZGQpID0gdjsKLQkJCVlVVjQyMl9ZMSgqb3V0X29kZCkgPSBZVVY0MTFfWTAwKGluX2V2ZW5bMV0pOworICAgICAgICAgICAgWVVWNDIyX1kwKCpvdXRfb2RkKSA9IFlVVjQxMV9ZMDAoaW5fb2RkWzBdKTsKKyAgICAgICAgICAgIFlVVjQyMl9VMCgqb3V0X29kZCkgPSB1OworICAgICAgICAgICAgWVVWNDIyX1YwKCpvdXRfb2RkKSA9IHY7CisgICAgICAgICAgICBZVVY0MjJfWTEoKm91dF9vZGQpID0gWVVWNDExX1kwMChpbl9ldmVuWzFdKTsKIAotCQkJaW5fZXZlbiArPSAyOwotCQkJaW5fb2RkICs9IDI7Ci0JCQlvdXRfZXZlbisrOwotCQkJb3V0X29kZCsrOwotCQl9Ci0JCWluX2V2ZW4gKz0gdzRfMzsKLQkJaW5fb2RkICs9IHc0XzM7Ci0JCW91dF9ldmVuICs9IHc4OwotCQlvdXRfb2RkICs9IHc4OwotCX0KKyAgICAgICAgICAgIGluX2V2ZW4gKz0gMjsKKyAgICAgICAgICAgIGluX29kZCArPSAyOworICAgICAgICAgICAgb3V0X2V2ZW4rKzsKKyAgICAgICAgICAgIG91dF9vZGQrKzsKKyAgICAgICAgfQorICAgICAgICBpbl9ldmVuICs9IHc0XzM7CisgICAgICAgIGluX29kZCArPSB3NF8zOworICAgICAgICBvdXRfZXZlbiArPSB3ODsKKyAgICAgICAgb3V0X29kZCArPSB3ODsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3ppcGltcG9ydC5jIGIvTW9kdWxlcy96aXBpbXBvcnQuYwppbmRleCBlMzIwZGQ5Li4xOGM1YTdkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3ppcGltcG9ydC5jCisrKyBiL01vZHVsZXMvemlwaW1wb3J0LmMKQEAgLTEwLDggKzEwLDggQEAKICNkZWZpbmUgSVNfUEFDS0FHRSAgMHgyCiAKIHN0cnVjdCBzdF96aXBfc2VhcmNob3JkZXIgewotCWNoYXIgc3VmZml4WzE0XTsKLQlpbnQgdHlwZTsKKyAgICBjaGFyIHN1ZmZpeFsxNF07CisgICAgaW50IHR5cGU7CiB9OwogCiAvKiB6aXBfc2VhcmNob3JkZXIgZGVmaW5lcyBob3cgd2Ugc2VhcmNoIGZvciBhIG1vZHVsZSBpbiB0aGUgWmlwCkBAIC0yMCwxMyArMjAsMTMgQEAKICAgIGFyZSBzd2FwcGVkIGJ5IGluaXR6aXBpbXBvcnQoKSBpZiB3ZSBydW4gaW4gb3B0aW1pemVkIG1vZGUuIEFsc28sCiAgICAnLycgaXMgcmVwbGFjZWQgYnkgU0VQIHRoZXJlLiAqLwogc3RhdGljIHN0cnVjdCBzdF96aXBfc2VhcmNob3JkZXIgemlwX3NlYXJjaG9yZGVyW10gPSB7Ci0JeyIvX19pbml0X18ucHljIiwgSVNfUEFDS0FHRSB8IElTX0JZVEVDT0RFfSwKLQl7Ii9fX2luaXRfXy5weW8iLCBJU19QQUNLQUdFIHwgSVNfQllURUNPREV9LAotCXsiL19faW5pdF9fLnB5IiwgSVNfUEFDS0FHRSB8IElTX1NPVVJDRX0sCi0JeyIucHljIiwgSVNfQllURUNPREV9LAotCXsiLnB5byIsIElTX0JZVEVDT0RFfSwKLQl7Ii5weSIsIElTX1NPVVJDRX0sCi0JeyIiLCAwfQorICAgIHsiL19faW5pdF9fLnB5YyIsIElTX1BBQ0tBR0UgfCBJU19CWVRFQ09ERX0sCisgICAgeyIvX19pbml0X18ucHlvIiwgSVNfUEFDS0FHRSB8IElTX0JZVEVDT0RFfSwKKyAgICB7Ii9fX2luaXRfXy5weSIsIElTX1BBQ0tBR0UgfCBJU19TT1VSQ0V9LAorICAgIHsiLnB5YyIsIElTX0JZVEVDT0RFfSwKKyAgICB7Ii5weW8iLCBJU19CWVRFQ09ERX0sCisgICAgeyIucHkiLCBJU19TT1VSQ0V9LAorICAgIHsiIiwgMH0KIH07CiAKIC8qIHppcGltcG9ydGVyIG9iamVjdCBkZWZpbml0aW9uIGFuZCBzdXBwb3J0ICovCkBAIC0zNCwxMCArMzQsMTAgQEAKIHR5cGVkZWYgc3RydWN0IF96aXBpbXBvcnRlciBaaXBJbXBvcnRlcjsKIAogc3RydWN0IF96aXBpbXBvcnRlciB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICphcmNoaXZlOyAgLyogcGF0aG5hbWUgb2YgdGhlIFppcCBhcmNoaXZlICovCi0JUHlPYmplY3QgKnByZWZpeDsgICAvKiBmaWxlIHByZWZpeDogImEvc3ViL2RpcmVjdG9yeS8iICovCi0JUHlPYmplY3QgKmZpbGVzOyAgICAvKiBkaWN0IHdpdGggZmlsZSBpbmZvIHtwYXRoOiB0b2NfZW50cnl9ICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICphcmNoaXZlOyAgLyogcGF0aG5hbWUgb2YgdGhlIFppcCBhcmNoaXZlICovCisgICAgUHlPYmplY3QgKnByZWZpeDsgICAvKiBmaWxlIHByZWZpeDogImEvc3ViL2RpcmVjdG9yeS8iICovCisgICAgUHlPYmplY3QgKmZpbGVzOyAgICAvKiBkaWN0IHdpdGggZmlsZSBpbmZvIHtwYXRoOiB0b2NfZW50cnl9ICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKlppcEltcG9ydEVycm9yOwpAQCAtNDcsNyArNDcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICpyZWFkX2RpcmVjdG9yeShjaGFyICphcmNoaXZlKTsKIHN0YXRpYyBQeU9iamVjdCAqZ2V0X2RhdGEoY2hhciAqYXJjaGl2ZSwgUHlPYmplY3QgKnRvY19lbnRyeSk7CiBzdGF0aWMgUHlPYmplY3QgKmdldF9tb2R1bGVfY29kZShaaXBJbXBvcnRlciAqc2VsZiwgY2hhciAqZnVsbG5hbWUsCi0JCQkJIGludCAqcF9pc3BhY2thZ2UsIGNoYXIgKipwX21vZHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwX2lzcGFja2FnZSwgY2hhciAqKnBfbW9kcGF0aCk7CiAKIAogI2RlZmluZSBaaXBJbXBvcnRlcl9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmWmlwSW1wb3J0ZXJfVHlwZSkKQEAgLTYwLDE2MiArNjAsMTYyIEBACiBzdGF0aWMgaW50CiB6aXBpbXBvcnRlcl9pbml0KFppcEltcG9ydGVyICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JY2hhciAqcGF0aCwgKnAsICpwcmVmaXgsIGJ1ZltNQVhQQVRITEVOKzJdOwotCXNpemVfdCBsZW47CisgICAgY2hhciAqcGF0aCwgKnAsICpwcmVmaXgsIGJ1ZltNQVhQQVRITEVOKzJdOworICAgIHNpemVfdCBsZW47CiAKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJ6aXBpbXBvcnRlcigpIiwga3dkcykpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJ6aXBpbXBvcnRlcigpIiwga3dkcykpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlciIsCi0JCQkgICAgICAmcGF0aCkpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCkpCisgICAgICAgIHJldHVybiAtMTsKIAotCWxlbiA9IHN0cmxlbihwYXRoKTsKLQlpZiAobGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLCAiYXJjaGl2ZSBwYXRoIGlzIGVtcHR5Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGxlbiA+PSBNQVhQQVRITEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwKLQkJCQkiYXJjaGl2ZSBwYXRoIHRvbyBsb25nIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc3RyY3B5KGJ1ZiwgcGF0aCk7CisgICAgbGVuID0gc3RybGVuKHBhdGgpOworICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsICJhcmNoaXZlIHBhdGggaXMgZW1wdHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobGVuID49IE1BWFBBVEhMRU4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyY2hpdmUgcGF0aCB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHN0cmNweShidWYsIHBhdGgpOwogCiAjaWZkZWYgQUxUU0VQCi0JZm9yIChwID0gYnVmOyAqcDsgcCsrKSB7Ci0JCWlmICgqcCA9PSBBTFRTRVApCi0JCQkqcCA9IFNFUDsKLQl9CisgICAgZm9yIChwID0gYnVmOyAqcDsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSBBTFRTRVApCisgICAgICAgICAgICAqcCA9IFNFUDsKKyAgICB9CiAjZW5kaWYKIAotCXBhdGggPSBOVUxMOwotCXByZWZpeCA9IE5VTEw7Ci0JZm9yICg7OykgeworICAgIHBhdGggPSBOVUxMOworICAgIHByZWZpeCA9IE5VTEw7CisgICAgZm9yICg7OykgewogI2lmbmRlZiBSSVNDT1MKLQkJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLQkJaW50IHJ2OworICAgICAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgICAgICBpbnQgcnY7CiAKLQkJcnYgPSBzdGF0KGJ1ZiwgJnN0YXRidWYpOwotCQlpZiAocnYgPT0gMCkgewotCQkJLyogaXQgZXhpc3RzICovCi0JCQlpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpKQotCQkJCS8qIGl0J3MgYSBmaWxlICovCi0JCQkJcGF0aCA9IGJ1ZjsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIHJ2ID0gc3RhdChidWYsICZzdGF0YnVmKTsKKyAgICAgICAgaWYgKHJ2ID09IDApIHsKKyAgICAgICAgICAgIC8qIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkKKyAgICAgICAgICAgICAgICAvKiBpdCdzIGEgZmlsZSAqLworICAgICAgICAgICAgICAgIHBhdGggPSBidWY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogI2Vsc2UKLQkJaWYgKG9iamVjdF9leGlzdHMoYnVmKSkgewotCQkJLyogaXQgZXhpc3RzICovCi0JCQlpZiAoaXNmaWxlKGJ1ZikpCi0JCQkJLyogaXQncyBhIGZpbGUgKi8KLQkJCQlwYXRoID0gYnVmOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaWYgKG9iamVjdF9leGlzdHMoYnVmKSkgeworICAgICAgICAgICAgLyogaXQgZXhpc3RzICovCisgICAgICAgICAgICBpZiAoaXNmaWxlKGJ1ZikpCisgICAgICAgICAgICAgICAgLyogaXQncyBhIGZpbGUgKi8KKyAgICAgICAgICAgICAgICBwYXRoID0gYnVmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICNlbmRpZgotCQkvKiBiYWNrIHVwIG9uZSBwYXRoIGVsZW1lbnQgKi8KLQkJcCA9IHN0cnJjaHIoYnVmLCBTRVApOwotCQlpZiAocHJlZml4ICE9IE5VTEwpCi0JCQkqcHJlZml4ID0gU0VQOwotCQlpZiAocCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCSpwID0gJ1wwJzsKLQkJcHJlZml4ID0gcDsKLQl9Ci0JaWYgKHBhdGggIT0gTlVMTCkgewotCQlQeU9iamVjdCAqZmlsZXM7Ci0JCWZpbGVzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoemlwX2RpcmVjdG9yeV9jYWNoZSwgcGF0aCk7Ci0JCWlmIChmaWxlcyA9PSBOVUxMKSB7Ci0JCQlmaWxlcyA9IHJlYWRfZGlyZWN0b3J5KGJ1Zik7Ci0JCQlpZiAoZmlsZXMgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoemlwX2RpcmVjdG9yeV9jYWNoZSwgcGF0aCwKLQkJCQkJCSBmaWxlcykgIT0gMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQotCQkJUHlfSU5DUkVGKGZpbGVzKTsKLQkJc2VsZi0+ZmlsZXMgPSBmaWxlczsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwgIm5vdCBhIFppcCBmaWxlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgIC8qIGJhY2sgdXAgb25lIHBhdGggZWxlbWVudCAqLworICAgICAgICBwID0gc3RycmNocihidWYsIFNFUCk7CisgICAgICAgIGlmIChwcmVmaXggIT0gTlVMTCkKKyAgICAgICAgICAgICpwcmVmaXggPSBTRVA7CisgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKnAgPSAnXDAnOworICAgICAgICBwcmVmaXggPSBwOworICAgIH0KKyAgICBpZiAocGF0aCAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpmaWxlczsKKyAgICAgICAgZmlsZXMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyh6aXBfZGlyZWN0b3J5X2NhY2hlLCBwYXRoKTsKKyAgICAgICAgaWYgKGZpbGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZpbGVzID0gcmVhZF9kaXJlY3RvcnkoYnVmKTsKKyAgICAgICAgICAgIGlmIChmaWxlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh6aXBfZGlyZWN0b3J5X2NhY2hlLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9JTkNSRUYoZmlsZXMpOworICAgICAgICBzZWxmLT5maWxlcyA9IGZpbGVzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLCAibm90IGEgWmlwIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChwcmVmaXggPT0gTlVMTCkKLQkJcHJlZml4ID0gIiI7Ci0JZWxzZSB7Ci0JCXByZWZpeCsrOwotCQlsZW4gPSBzdHJsZW4ocHJlZml4KTsKLQkJaWYgKHByZWZpeFtsZW4tMV0gIT0gU0VQKSB7Ci0JCQkvKiBhZGQgdHJhaWxpbmcgU0VQICovCi0JCQlwcmVmaXhbbGVuXSA9IFNFUDsKLQkJCXByZWZpeFtsZW4gKyAxXSA9ICdcMCc7Ci0JCX0KLQl9CisgICAgaWYgKHByZWZpeCA9PSBOVUxMKQorICAgICAgICBwcmVmaXggPSAiIjsKKyAgICBlbHNlIHsKKyAgICAgICAgcHJlZml4Kys7CisgICAgICAgIGxlbiA9IHN0cmxlbihwcmVmaXgpOworICAgICAgICBpZiAocHJlZml4W2xlbi0xXSAhPSBTRVApIHsKKyAgICAgICAgICAgIC8qIGFkZCB0cmFpbGluZyBTRVAgKi8KKyAgICAgICAgICAgIHByZWZpeFtsZW5dID0gU0VQOworICAgICAgICAgICAgcHJlZml4W2xlbiArIDFdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0KIAotCXNlbGYtPmFyY2hpdmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7Ci0JaWYgKHNlbGYtPmFyY2hpdmUgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHNlbGYtPmFyY2hpdmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgaWYgKHNlbGYtPmFyY2hpdmUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0Jc2VsZi0+cHJlZml4ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwcmVmaXgpOwotCWlmIChzZWxmLT5wcmVmaXggPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIHNlbGYtPnByZWZpeCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocHJlZml4KTsKKyAgICBpZiAoc2VsZi0+cHJlZml4ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAvKiBHQyBzdXBwb3J0LiAqLwogc3RhdGljIGludAogemlwaW1wb3J0ZXJfdHJhdmVyc2UoUHlPYmplY3QgKm9iaiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7Ci0JUHlfVklTSVQoc2VsZi0+ZmlsZXMpOwotCXJldHVybiAwOworICAgIFppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOworICAgIFB5X1ZJU0lUKHNlbGYtPmZpbGVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIHppcGltcG9ydGVyX2RlYWxsb2MoWmlwSW1wb3J0ZXIgKnNlbGYpCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKLQlQeV9YREVDUkVGKHNlbGYtPmFyY2hpdmUpOwotCVB5X1hERUNSRUYoc2VsZi0+cHJlZml4KTsKLQlQeV9YREVDUkVGKHNlbGYtPmZpbGVzKTsKLQlQeV9UWVBFKHNlbGYpLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5hcmNoaXZlKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPnByZWZpeCk7CisgICAgUHlfWERFQ1JFRihzZWxmLT5maWxlcyk7CisgICAgUHlfVFlQRShzZWxmKS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHppcGltcG9ydGVyX3JlcHIoWmlwSW1wb3J0ZXIgKnNlbGYpCiB7Ci0JY2hhciBidWZbNTAwXTsKLQljaGFyICphcmNoaXZlID0gIj8/PyI7Ci0JY2hhciAqcHJlZml4ID0gIiI7CisgICAgY2hhciBidWZbNTAwXTsKKyAgICBjaGFyICphcmNoaXZlID0gIj8/PyI7CisgICAgY2hhciAqcHJlZml4ID0gIiI7CiAKLQlpZiAoc2VsZi0+YXJjaGl2ZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHNlbGYtPmFyY2hpdmUpKQotCQlhcmNoaXZlID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSk7Ci0JaWYgKHNlbGYtPnByZWZpeCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHNlbGYtPnByZWZpeCkpCi0JCXByZWZpeCA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCk7Ci0JaWYgKHByZWZpeCAhPSBOVUxMICYmICpwcmVmaXgpCi0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAgICI8emlwaW1wb3J0ZXIgb2JqZWN0IFwiJS4zMDBzJWMlLjE1MHNcIj4iLAotCQkJICAgICAgYXJjaGl2ZSwgU0VQLCBwcmVmaXgpOwotCWVsc2UKLQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJICAgICAgIjx6aXBpbXBvcnRlciBvYmplY3QgXCIlLjMwMHNcIj4iLAotCQkJICAgICAgYXJjaGl2ZSk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBpZiAoc2VsZi0+YXJjaGl2ZSAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHNlbGYtPmFyY2hpdmUpKQorICAgICAgICBhcmNoaXZlID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSk7CisgICAgaWYgKHNlbGYtPnByZWZpeCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHNlbGYtPnByZWZpeCkpCisgICAgICAgIHByZWZpeCA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCk7CisgICAgaWYgKHByZWZpeCAhPSBOVUxMICYmICpwcmVmaXgpCisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAiPHppcGltcG9ydGVyIG9iamVjdCBcIiUuMzAwcyVjJS4xNTBzXCI+IiwKKyAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlLCBTRVAsIHByZWZpeCk7CisgICAgZWxzZQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgIjx6aXBpbXBvcnRlciBvYmplY3QgXCIlLjMwMHNcIj4iLAorICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIC8qIHJldHVybiBmdWxsbmFtZS5zcGxpdCgiLiIpWy0xXSAqLwogc3RhdGljIGNoYXIgKgogZ2V0X3N1Ym5hbWUoY2hhciAqZnVsbG5hbWUpCiB7Ci0JY2hhciAqc3VibmFtZSA9IHN0cnJjaHIoZnVsbG5hbWUsICcuJyk7Ci0JaWYgKHN1Ym5hbWUgPT0gTlVMTCkKLQkJc3VibmFtZSA9IGZ1bGxuYW1lOwotCWVsc2UKLQkJc3VibmFtZSsrOwotCXJldHVybiBzdWJuYW1lOworICAgIGNoYXIgKnN1Ym5hbWUgPSBzdHJyY2hyKGZ1bGxuYW1lLCAnLicpOworICAgIGlmIChzdWJuYW1lID09IE5VTEwpCisgICAgICAgIHN1Ym5hbWUgPSBmdWxsbmFtZTsKKyAgICBlbHNlCisgICAgICAgIHN1Ym5hbWUrKzsKKyAgICByZXR1cm4gc3VibmFtZTsKIH0KIAogLyogR2l2ZW4gYSAoc3ViKW1vZHVsZW5hbWUsIHdyaXRlIHRoZSBwb3RlbnRpYWwgZmlsZSBwYXRoIGluIHRoZQpAQCAtMjI0LDU5ICsyMjQsNTkgQEAKIHN0YXRpYyBpbnQKIG1ha2VfZmlsZW5hbWUoY2hhciAqcHJlZml4LCBjaGFyICpuYW1lLCBjaGFyICpwYXRoKQogewotCXNpemVfdCBsZW47Ci0JY2hhciAqcDsKKyAgICBzaXplX3QgbGVuOworICAgIGNoYXIgKnA7CiAKLQlsZW4gPSBzdHJsZW4ocHJlZml4KTsKKyAgICBsZW4gPSBzdHJsZW4ocHJlZml4KTsKIAotCS8qIHNlbGYucHJlZml4ICsgbmFtZSBbKyBTRVAgKyAiX19pbml0X18iXSArICIucHlbY29dIiAqLwotCWlmIChsZW4gKyBzdHJsZW4obmFtZSkgKyAxMyA+PSBNQVhQQVRITEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwgInBhdGggdG9vIGxvbmciKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBzZWxmLnByZWZpeCArIG5hbWUgWysgU0VQICsgIl9faW5pdF9fIl0gKyAiLnB5W2NvXSIgKi8KKyAgICBpZiAobGVuICsgc3RybGVuKG5hbWUpICsgMTMgPj0gTUFYUEFUSExFTikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsICJwYXRoIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlzdHJjcHkocGF0aCwgcHJlZml4KTsKLQlzdHJjcHkocGF0aCArIGxlbiwgbmFtZSk7Ci0JZm9yIChwID0gcGF0aCArIGxlbjsgKnA7IHArKykgewotCQlpZiAoKnAgPT0gJy4nKQotCQkJKnAgPSBTRVA7Ci0JfQotCWxlbiArPSBzdHJsZW4obmFtZSk7Ci0JYXNzZXJ0KGxlbiA8IElOVF9NQVgpOwotCXJldHVybiAoaW50KWxlbjsKKyAgICBzdHJjcHkocGF0aCwgcHJlZml4KTsKKyAgICBzdHJjcHkocGF0aCArIGxlbiwgbmFtZSk7CisgICAgZm9yIChwID0gcGF0aCArIGxlbjsgKnA7IHArKykgeworICAgICAgICBpZiAoKnAgPT0gJy4nKQorICAgICAgICAgICAgKnAgPSBTRVA7CisgICAgfQorICAgIGxlbiArPSBzdHJsZW4obmFtZSk7CisgICAgYXNzZXJ0KGxlbiA8IElOVF9NQVgpOworICAgIHJldHVybiAoaW50KWxlbjsKIH0KIAogZW51bSB6aV9tb2R1bGVfaW5mbyB7Ci0JTUlfRVJST1IsCi0JTUlfTk9UX0ZPVU5ELAotCU1JX01PRFVMRSwKLQlNSV9QQUNLQUdFCisgICAgTUlfRVJST1IsCisgICAgTUlfTk9UX0ZPVU5ELAorICAgIE1JX01PRFVMRSwKKyAgICBNSV9QQUNLQUdFCiB9OwogCiAvKiBSZXR1cm4gc29tZSBpbmZvcm1hdGlvbiBhYm91dCBhIG1vZHVsZS4gKi8KIHN0YXRpYyBlbnVtIHppX21vZHVsZV9pbmZvCiBnZXRfbW9kdWxlX2luZm8oWmlwSW1wb3J0ZXIgKnNlbGYsIGNoYXIgKmZ1bGxuYW1lKQogewotCWNoYXIgKnN1Ym5hbWUsIHBhdGhbTUFYUEFUSExFTiArIDFdOwotCWludCBsZW47Ci0Jc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciAqenNvOworICAgIGNoYXIgKnN1Ym5hbWUsIHBhdGhbTUFYUEFUSExFTiArIDFdOworICAgIGludCBsZW47CisgICAgc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciAqenNvOwogCi0Jc3VibmFtZSA9IGdldF9zdWJuYW1lKGZ1bGxuYW1lKTsKKyAgICBzdWJuYW1lID0gZ2V0X3N1Ym5hbWUoZnVsbG5hbWUpOwogCi0JbGVuID0gbWFrZV9maWxlbmFtZShQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5wcmVmaXgpLCBzdWJuYW1lLCBwYXRoKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIE1JX0VSUk9SOworICAgIGxlbiA9IG1ha2VfZmlsZW5hbWUoUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+cHJlZml4KSwgc3VibmFtZSwgcGF0aCk7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIHJldHVybiBNSV9FUlJPUjsKIAotCWZvciAoenNvID0gemlwX3NlYXJjaG9yZGVyOyAqenNvLT5zdWZmaXg7IHpzbysrKSB7Ci0JCXN0cmNweShwYXRoICsgbGVuLCB6c28tPnN1ZmZpeCk7Ci0JCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5maWxlcywgcGF0aCkgIT0gTlVMTCkgewotCQkJaWYgKHpzby0+dHlwZSAmIElTX1BBQ0tBR0UpCi0JCQkJcmV0dXJuIE1JX1BBQ0tBR0U7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE1JX01PRFVMRTsKLQkJfQotCX0KLQlyZXR1cm4gTUlfTk9UX0ZPVU5EOworICAgIGZvciAoenNvID0gemlwX3NlYXJjaG9yZGVyOyAqenNvLT5zdWZmaXg7IHpzbysrKSB7CisgICAgICAgIHN0cmNweShwYXRoICsgbGVuLCB6c28tPnN1ZmZpeCk7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5maWxlcywgcGF0aCkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHpzby0+dHlwZSAmIElTX1BBQ0tBR0UpCisgICAgICAgICAgICAgICAgcmV0dXJuIE1JX1BBQ0tBR0U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIE1JX01PRFVMRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTUlfTk9UX0ZPVU5EOwogfQogCiAvKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBzYXRpc2Z5IHRoZSBpbXBvcnQgb2YgdGhlIG1vZHVsZSBuYW1lZCBieQpAQCAtMjg0LDg5ICsyODQsODkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB6aXBpbXBvcnRlcl9maW5kX21vZHVsZShQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKLQlQeU9iamVjdCAqcGF0aCA9IE5VTEw7Ci0JY2hhciAqZnVsbG5hbWU7Ci0JZW51bSB6aV9tb2R1bGVfaW5mbyBtaTsKKyAgICBaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKKyAgICBQeU9iamVjdCAqcGF0aCA9IE5VTEw7CisgICAgY2hhciAqZnVsbG5hbWU7CisgICAgZW51bSB6aV9tb2R1bGVfaW5mbyBtaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xPOnppcGltcG9ydGVyLmZpbmRfbW9kdWxlIiwKLQkJCSAgICAgICZmdWxsbmFtZSwgJnBhdGgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8Tzp6aXBpbXBvcnRlci5maW5kX21vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdWxsbmFtZSwgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1pID0gZ2V0X21vZHVsZV9pbmZvKHNlbGYsIGZ1bGxuYW1lKTsKLQlpZiAobWkgPT0gTUlfRVJST1IpCi0JCXJldHVybiBOVUxMOwotCWlmIChtaSA9PSBNSV9OT1RfRk9VTkQpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIG1pID0gZ2V0X21vZHVsZV9pbmZvKHNlbGYsIGZ1bGxuYW1lKTsKKyAgICBpZiAobWkgPT0gTUlfRVJST1IpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtaSA9PSBNSV9OT1RfRk9VTkQpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiAvKiBMb2FkIGFuZCByZXR1cm4gdGhlIG1vZHVsZSBuYW1lZCBieSAnZnVsbG5hbWUnLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHppcGltcG9ydGVyX2xvYWRfbW9kdWxlKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCVppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOwotCVB5T2JqZWN0ICpjb2RlLCAqbW9kLCAqZGljdDsKLQljaGFyICpmdWxsbmFtZSwgKm1vZHBhdGg7Ci0JaW50IGlzcGFja2FnZTsKKyAgICBaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKKyAgICBQeU9iamVjdCAqY29kZSwgKm1vZCwgKmRpY3Q7CisgICAgY2hhciAqZnVsbG5hbWUsICptb2RwYXRoOworICAgIGludCBpc3BhY2thZ2U7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIubG9hZF9tb2R1bGUiLAotCQkJICAgICAgJmZ1bGxuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmxvYWRfbW9kdWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQljb2RlID0gZ2V0X21vZHVsZV9jb2RlKHNlbGYsIGZ1bGxuYW1lLCAmaXNwYWNrYWdlLCAmbW9kcGF0aCk7Ci0JaWYgKGNvZGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY29kZSA9IGdldF9tb2R1bGVfY29kZShzZWxmLCBmdWxsbmFtZSwgJmlzcGFja2FnZSwgJm1vZHBhdGgpOworICAgIGlmIChjb2RlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKGZ1bGxuYW1lKTsKLQlpZiAobW9kID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGNvZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKKyAgICBtb2QgPSBQeUltcG9ydF9BZGRNb2R1bGUoZnVsbG5hbWUpOworICAgIGlmIChtb2QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoY29kZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2QpOwogCi0JLyogbW9kLl9fbG9hZGVyX18gPSBzZWxmICovCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2xvYWRlcl9fIiwgKFB5T2JqZWN0ICopc2VsZikgIT0gMCkKLQkJZ290byBlcnJvcjsKKyAgICAvKiBtb2QuX19sb2FkZXJfXyA9IHNlbGYgKi8KKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fbG9hZGVyX18iLCAoUHlPYmplY3QgKilzZWxmKSAhPSAwKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JaWYgKGlzcGFja2FnZSkgewotCQkvKiBhZGQgX19wYXRoX18gdG8gdGhlIG1vZHVsZSAqYmVmb3JlKiB0aGUgY29kZSBnZXRzCi0JCSAgIGV4ZWN1dGVkICovCi0JCVB5T2JqZWN0ICpwa2dwYXRoLCAqZnVsbHBhdGg7Ci0JCWNoYXIgKnByZWZpeCA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCk7Ci0JCWNoYXIgKnN1Ym5hbWUgPSBnZXRfc3VibmFtZShmdWxsbmFtZSk7Ci0JCWludCBlcnI7CisgICAgaWYgKGlzcGFja2FnZSkgeworICAgICAgICAvKiBhZGQgX19wYXRoX18gdG8gdGhlIG1vZHVsZSAqYmVmb3JlKiB0aGUgY29kZSBnZXRzCisgICAgICAgICAgIGV4ZWN1dGVkICovCisgICAgICAgIFB5T2JqZWN0ICpwa2dwYXRoLCAqZnVsbHBhdGg7CisgICAgICAgIGNoYXIgKnByZWZpeCA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCk7CisgICAgICAgIGNoYXIgKnN1Ym5hbWUgPSBnZXRfc3VibmFtZShmdWxsbmFtZSk7CisgICAgICAgIGludCBlcnI7CiAKLQkJZnVsbHBhdGggPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCIlcyVjJXMlcyIsCi0JCQkJCVB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLAotCQkJCQlTRVAsCi0JCQkJCSpwcmVmaXggPyBwcmVmaXggOiAiIiwKLQkJCQkJc3VibmFtZSk7Ci0JCWlmIChmdWxscGF0aCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKKyAgICAgICAgZnVsbHBhdGggPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCIlcyVjJXMlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwcmVmaXggPyBwcmVmaXggOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibmFtZSk7CisgICAgICAgIGlmIChmdWxscGF0aCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKIAotCQlwa2dwYXRoID0gUHlfQnVpbGRWYWx1ZSgiW09dIiwgZnVsbHBhdGgpOwotCQlQeV9ERUNSRUYoZnVsbHBhdGgpOwotCQlpZiAocGtncGF0aCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fcGF0aF9fIiwgcGtncGF0aCk7Ci0JCVB5X0RFQ1JFRihwa2dwYXRoKTsKLQkJaWYgKGVyciAhPSAwKQotCQkJZ290byBlcnJvcjsKLQl9Ci0JbW9kID0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChmdWxsbmFtZSwgY29kZSwgbW9kcGF0aCk7Ci0JUHlfREVDUkVGKGNvZGUpOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGxvYWRlZCBmcm9tIFppcCAlc1xuIiwKLQkJCQkgIGZ1bGxuYW1lLCBtb2RwYXRoKTsKLQlyZXR1cm4gbW9kOworICAgICAgICBwa2dwYXRoID0gUHlfQnVpbGRWYWx1ZSgiW09dIiwgZnVsbHBhdGgpOworICAgICAgICBQeV9ERUNSRUYoZnVsbHBhdGgpOworICAgICAgICBpZiAocGtncGF0aCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fcGF0aF9fIiwgcGtncGF0aCk7CisgICAgICAgIFB5X0RFQ1JFRihwa2dwYXRoKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgbW9kID0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChmdWxsbmFtZSwgY29kZSwgbW9kcGF0aCk7CisgICAgUHlfREVDUkVGKGNvZGUpOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGxvYWRlZCBmcm9tIFppcCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWUsIG1vZHBhdGgpOworICAgIHJldHVybiBtb2Q7CiBlcnJvcjoKLQlQeV9ERUNSRUYoY29kZSk7Ci0JUHlfREVDUkVGKG1vZCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGNvZGUpOworICAgIFB5X0RFQ1JFRihtb2QpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBSZXR1cm4gYSBzdHJpbmcgbWF0Y2hpbmcgX19maWxlX18gZm9yIHRoZSBuYW1lZCBtb2R1bGUgKi8KQEAgLTM4MCwxMyArMzgwLDEzIEBACiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIuX2dldF9maWxlbmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxuYW1lKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICAvKiBEZWNpZGluZyB0aGUgZmlsZW5hbWUgcmVxdWlyZXMgd29ya2luZyBvdXQgd2hlcmUgdGhlIGNvZGUKICAgICAgICB3b3VsZCBjb21lIGZyb20gaWYgdGhlIG1vZHVsZSB3YXMgYWN0dWFsbHkgbG9hZGVkICovCiAgICAgY29kZSA9IGdldF9tb2R1bGVfY29kZShzZWxmLCBmdWxsbmFtZSwgJmlzcGFja2FnZSwgJm1vZHBhdGgpOwogICAgIGlmIChjb2RlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIFB5X0RFQ1JFRihjb2RlKTsgLyogT25seSBuZWVkIHRoZSBwYXRoIGluZm8gKi8KIAogICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKG1vZHBhdGgpOwpAQCAtMzk2LDExOCArMzk2LDExOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHppcGltcG9ydGVyX2lzX3BhY2thZ2UoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7Ci0JY2hhciAqZnVsbG5hbWU7Ci0JZW51bSB6aV9tb2R1bGVfaW5mbyBtaTsKKyAgICBaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKKyAgICBjaGFyICpmdWxsbmFtZTsKKyAgICBlbnVtIHppX21vZHVsZV9pbmZvIG1pOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmlzX3BhY2thZ2UiLAotCQkJICAgICAgJmZ1bGxuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmlzX3BhY2thZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVsbG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1pID0gZ2V0X21vZHVsZV9pbmZvKHNlbGYsIGZ1bGxuYW1lKTsKLQlpZiAobWkgPT0gTUlfRVJST1IpCi0JCXJldHVybiBOVUxMOwotCWlmIChtaSA9PSBNSV9OT1RfRk9VTkQpIHsKLQkJUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgZmluZCBtb2R1bGUgJyUuMjAwcyciLAotCQkJICAgICBmdWxsbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKG1pID09IE1JX1BBQ0tBR0UpOworICAgIG1pID0gZ2V0X21vZHVsZV9pbmZvKHNlbGYsIGZ1bGxuYW1lKTsKKyAgICBpZiAobWkgPT0gTUlfRVJST1IpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtaSA9PSBNSV9OT1RfRk9VTkQpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgZmluZCBtb2R1bGUgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhtaSA9PSBNSV9QQUNLQUdFKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHppcGltcG9ydGVyX2dldF9kYXRhKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICphcmdzKQogewotCVppcEltcG9ydGVyICpzZWxmID0gKFppcEltcG9ydGVyICopb2JqOwotCWNoYXIgKnBhdGg7CisgICAgWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7CisgICAgY2hhciAqcGF0aDsKICNpZmRlZiBBTFRTRVAKLQljaGFyICpwLCBidWZbTUFYUEFUSExFTiArIDFdOworICAgIGNoYXIgKnAsIGJ1ZltNQVhQQVRITEVOICsgMV07CiAjZW5kaWYKLQlQeU9iamVjdCAqdG9jX2VudHJ5OwotCVB5X3NzaXplX3QgbGVuOworICAgIFB5T2JqZWN0ICp0b2NfZW50cnk7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIuZ2V0X2RhdGEiLCAmcGF0aCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlci5nZXRfZGF0YSIsICZwYXRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICNpZmRlZiBBTFRTRVAKLQlpZiAoc3RybGVuKHBhdGgpID49IE1BWFBBVEhMRU4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLCAicGF0aCB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RyY3B5KGJ1ZiwgcGF0aCk7Ci0JZm9yIChwID0gYnVmOyAqcDsgcCsrKSB7Ci0JCWlmICgqcCA9PSBBTFRTRVApCi0JCQkqcCA9IFNFUDsKLQl9Ci0JcGF0aCA9IGJ1ZjsKKyAgICBpZiAoc3RybGVuKHBhdGgpID49IE1BWFBBVEhMRU4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFppcEltcG9ydEVycm9yLCAicGF0aCB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RyY3B5KGJ1ZiwgcGF0aCk7CisgICAgZm9yIChwID0gYnVmOyAqcDsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSBBTFRTRVApCisgICAgICAgICAgICAqcCA9IFNFUDsKKyAgICB9CisgICAgcGF0aCA9IGJ1ZjsKICNlbmRpZgotCWxlbiA9IFB5U3RyaW5nX1NpemUoc2VsZi0+YXJjaGl2ZSk7Ci0JaWYgKChzaXplX3QpbGVuIDwgc3RybGVuKHBhdGgpICYmCi0JICAgIHN0cm5jbXAocGF0aCwgUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSksIGxlbikgPT0gMCAmJgotCSAgICBwYXRoW2xlbl0gPT0gU0VQKSB7Ci0JCXBhdGggPSBwYXRoICsgbGVuICsgMTsKLQl9CisgICAgbGVuID0gUHlTdHJpbmdfU2l6ZShzZWxmLT5hcmNoaXZlKTsKKyAgICBpZiAoKHNpemVfdClsZW4gPCBzdHJsZW4ocGF0aCkgJiYKKyAgICAgICAgc3RybmNtcChwYXRoLCBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5hcmNoaXZlKSwgbGVuKSA9PSAwICYmCisgICAgICAgIHBhdGhbbGVuXSA9PSBTRVApIHsKKyAgICAgICAgcGF0aCA9IHBhdGggKyBsZW4gKyAxOworICAgIH0KIAotCXRvY19lbnRyeSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPmZpbGVzLCBwYXRoKTsKLQlpZiAodG9jX2VudHJ5ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5RXhjX0lPRXJyb3IsIHBhdGgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGdldF9kYXRhKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLCB0b2NfZW50cnkpOworICAgIHRvY19lbnRyeSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPmZpbGVzLCBwYXRoKTsKKyAgICBpZiAodG9jX2VudHJ5ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lKFB5RXhjX0lPRXJyb3IsIHBhdGgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGdldF9kYXRhKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLCB0b2NfZW50cnkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogemlwaW1wb3J0ZXJfZ2V0X2NvZGUoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7Ci0JY2hhciAqZnVsbG5hbWU7CisgICAgWmlwSW1wb3J0ZXIgKnNlbGYgPSAoWmlwSW1wb3J0ZXIgKilvYmo7CisgICAgY2hhciAqZnVsbG5hbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIuZ2V0X2NvZGUiLCAmZnVsbG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6emlwaW1wb3J0ZXIuZ2V0X2NvZGUiLCAmZnVsbG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBnZXRfbW9kdWxlX2NvZGUoc2VsZiwgZnVsbG5hbWUsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiBnZXRfbW9kdWxlX2NvZGUoc2VsZiwgZnVsbG5hbWUsIE5VTEwsIE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogemlwaW1wb3J0ZXJfZ2V0X3NvdXJjZShQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXJncykKIHsKLQlaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKLQlQeU9iamVjdCAqdG9jX2VudHJ5OwotCWNoYXIgKmZ1bGxuYW1lLCAqc3VibmFtZSwgcGF0aFtNQVhQQVRITEVOKzFdOwotCWludCBsZW47Ci0JZW51bSB6aV9tb2R1bGVfaW5mbyBtaTsKKyAgICBaaXBJbXBvcnRlciAqc2VsZiA9IChaaXBJbXBvcnRlciAqKW9iajsKKyAgICBQeU9iamVjdCAqdG9jX2VudHJ5OworICAgIGNoYXIgKmZ1bGxuYW1lLCAqc3VibmFtZSwgcGF0aFtNQVhQQVRITEVOKzFdOworICAgIGludCBsZW47CisgICAgZW51bSB6aV9tb2R1bGVfaW5mbyBtaTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczp6aXBpbXBvcnRlci5nZXRfc291cmNlIiwgJmZ1bGxuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnppcGltcG9ydGVyLmdldF9zb3VyY2UiLCAmZnVsbG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW1pID0gZ2V0X21vZHVsZV9pbmZvKHNlbGYsIGZ1bGxuYW1lKTsKLQlpZiAobWkgPT0gTUlfRVJST1IpCi0JCXJldHVybiBOVUxMOwotCWlmIChtaSA9PSBNSV9OT1RfRk9VTkQpIHsKLQkJUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgZmluZCBtb2R1bGUgJyUuMjAwcyciLAotCQkJICAgICBmdWxsbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdWJuYW1lID0gZ2V0X3N1Ym5hbWUoZnVsbG5hbWUpOworICAgIG1pID0gZ2V0X21vZHVsZV9pbmZvKHNlbGYsIGZ1bGxuYW1lKTsKKyAgICBpZiAobWkgPT0gTUlfRVJST1IpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtaSA9PSBNSV9OT1RfRk9VTkQpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgZmluZCBtb2R1bGUgJyUuMjAwcyciLAorICAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3VibmFtZSA9IGdldF9zdWJuYW1lKGZ1bGxuYW1lKTsKIAotCWxlbiA9IG1ha2VfZmlsZW5hbWUoUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+cHJlZml4KSwgc3VibmFtZSwgcGF0aCk7Ci0JaWYgKGxlbiA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGxlbiA9IG1ha2VfZmlsZW5hbWUoUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+cHJlZml4KSwgc3VibmFtZSwgcGF0aCk7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKG1pID09IE1JX1BBQ0tBR0UpIHsKLQkJcGF0aFtsZW5dID0gU0VQOwotCQlzdHJjcHkocGF0aCArIGxlbiArIDEsICJfX2luaXRfXy5weSIpOwotCX0KLQllbHNlCi0JCXN0cmNweShwYXRoICsgbGVuLCAiLnB5Iik7CisgICAgaWYgKG1pID09IE1JX1BBQ0tBR0UpIHsKKyAgICAgICAgcGF0aFtsZW5dID0gU0VQOworICAgICAgICBzdHJjcHkocGF0aCArIGxlbiArIDEsICJfX2luaXRfXy5weSIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHN0cmNweShwYXRoICsgbGVuLCAiLnB5Iik7CiAKLQl0b2NfZW50cnkgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5maWxlcywgcGF0aCk7Ci0JaWYgKHRvY19lbnRyeSAhPSBOVUxMKQotCQlyZXR1cm4gZ2V0X2RhdGEoUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSksIHRvY19lbnRyeSk7CisgICAgdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOworICAgIGlmICh0b2NfZW50cnkgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGdldF9kYXRhKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPmFyY2hpdmUpLCB0b2NfZW50cnkpOwogCi0JLyogd2UgaGF2ZSB0aGUgbW9kdWxlLCBidXQgbm8gc291cmNlICovCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIC8qIHdlIGhhdmUgdGhlIG1vZHVsZSwgYnV0IG5vIHNvdXJjZSAqLworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGRvY19maW5kX21vZHVsZSwKQEAgLTU1OCwyOCArNTU4LDI4IEBACiBSZXR1cm4gdGhlIGZpbGVuYW1lIGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHppcGltcG9ydGVyX21ldGhvZHNbXSA9IHsKLQl7ImZpbmRfbW9kdWxlIiwgemlwaW1wb3J0ZXJfZmluZF9tb2R1bGUsIE1FVEhfVkFSQVJHUywKLQkgZG9jX2ZpbmRfbW9kdWxlfSwKLQl7ImxvYWRfbW9kdWxlIiwgemlwaW1wb3J0ZXJfbG9hZF9tb2R1bGUsIE1FVEhfVkFSQVJHUywKLQkgZG9jX2xvYWRfbW9kdWxlfSwKLQl7ImdldF9kYXRhIiwgemlwaW1wb3J0ZXJfZ2V0X2RhdGEsIE1FVEhfVkFSQVJHUywKLQkgZG9jX2dldF9kYXRhfSwKLQl7ImdldF9jb2RlIiwgemlwaW1wb3J0ZXJfZ2V0X2NvZGUsIE1FVEhfVkFSQVJHUywKLQkgZG9jX2dldF9jb2RlfSwKLQl7ImdldF9zb3VyY2UiLCB6aXBpbXBvcnRlcl9nZXRfc291cmNlLCBNRVRIX1ZBUkFSR1MsCi0JIGRvY19nZXRfc291cmNlfSwKLQl7Il9nZXRfZmlsZW5hbWUiLCB6aXBpbXBvcnRlcl9nZXRfZmlsZW5hbWUsIE1FVEhfVkFSQVJHUywKLQkgZG9jX2dldF9maWxlbmFtZX0sCi0JeyJpc19wYWNrYWdlIiwgemlwaW1wb3J0ZXJfaXNfcGFja2FnZSwgTUVUSF9WQVJBUkdTLAotCSBkb2NfaXNfcGFja2FnZX0sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiZmluZF9tb2R1bGUiLCB6aXBpbXBvcnRlcl9maW5kX21vZHVsZSwgTUVUSF9WQVJBUkdTLAorICAgICBkb2NfZmluZF9tb2R1bGV9LAorICAgIHsibG9hZF9tb2R1bGUiLCB6aXBpbXBvcnRlcl9sb2FkX21vZHVsZSwgTUVUSF9WQVJBUkdTLAorICAgICBkb2NfbG9hZF9tb2R1bGV9LAorICAgIHsiZ2V0X2RhdGEiLCB6aXBpbXBvcnRlcl9nZXRfZGF0YSwgTUVUSF9WQVJBUkdTLAorICAgICBkb2NfZ2V0X2RhdGF9LAorICAgIHsiZ2V0X2NvZGUiLCB6aXBpbXBvcnRlcl9nZXRfY29kZSwgTUVUSF9WQVJBUkdTLAorICAgICBkb2NfZ2V0X2NvZGV9LAorICAgIHsiZ2V0X3NvdXJjZSIsIHppcGltcG9ydGVyX2dldF9zb3VyY2UsIE1FVEhfVkFSQVJHUywKKyAgICAgZG9jX2dldF9zb3VyY2V9LAorICAgIHsiX2dldF9maWxlbmFtZSIsIHppcGltcG9ydGVyX2dldF9maWxlbmFtZSwgTUVUSF9WQVJBUkdTLAorICAgICBkb2NfZ2V0X2ZpbGVuYW1lfSwKKyAgICB7ImlzX3BhY2thZ2UiLCB6aXBpbXBvcnRlcl9pc19wYWNrYWdlLCBNRVRIX1ZBUkFSR1MsCisgICAgIGRvY19pc19wYWNrYWdlfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU1lbWJlckRlZiB6aXBpbXBvcnRlcl9tZW1iZXJzW10gPSB7Ci0JeyJhcmNoaXZlIiwgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgYXJjaGl2ZSksICBSRUFET05MWX0sCi0JeyJwcmVmaXgiLCAgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgcHJlZml4KSwgICBSRUFET05MWX0sCi0JeyJfZmlsZXMiLCAgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgZmlsZXMpLCAgICBSRUFET05MWX0sCi0Je05VTEx9CisgICAgeyJhcmNoaXZlIiwgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgYXJjaGl2ZSksICBSRUFET05MWX0sCisgICAgeyJwcmVmaXgiLCAgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgcHJlZml4KSwgICBSRUFET05MWX0sCisgICAgeyJfZmlsZXMiLCAgIFRfT0JKRUNULCBvZmZzZXRvZihaaXBJbXBvcnRlciwgZmlsZXMpLCAgICBSRUFET05MWX0sCisgICAge05VTEx9CiB9OwogCiBQeURvY19TVFJWQVIoemlwaW1wb3J0ZXJfZG9jLApAQCAtNTk5LDQ2ICs1OTksNDYgQEAKICNkZWZpbmUgREVGRVJSRURfQUREUkVTUyhBRERSKSAwCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgWmlwSW1wb3J0ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoREVGRVJSRURfQUREUkVTUygmUHlUeXBlX1R5cGUpLCAwKQotCSJ6aXBpbXBvcnQuemlwaW1wb3J0ZXIiLAotCXNpemVvZihaaXBJbXBvcnRlciksCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3IpemlwaW1wb3J0ZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyl6aXBpbXBvcnRlcl9yZXByLAkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwKLQkJUHlfVFBGTEFHU19IQVZFX0dDLAkJLyogdHBfZmxhZ3MgKi8KLQl6aXBpbXBvcnRlcl9kb2MsCQkJLyogdHBfZG9jICovCi0JemlwaW1wb3J0ZXJfdHJhdmVyc2UsCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXppcGltcG9ydGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCXppcGltcG9ydGVyX21lbWJlcnMsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYyl6aXBpbXBvcnRlcl9pbml0LAkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkJLyogdHBfYWxsb2MgKi8KLQlQeVR5cGVfR2VuZXJpY05ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChERUZFUlJFRF9BRERSRVNTKCZQeVR5cGVfVHlwZSksIDApCisgICAgInppcGltcG9ydC56aXBpbXBvcnRlciIsCisgICAgc2l6ZW9mKFppcEltcG9ydGVyKSwKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3IpemlwaW1wb3J0ZXJfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyl6aXBpbXBvcnRlcl9yZXByLCAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfAorICAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0MsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICB6aXBpbXBvcnRlcl9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIHppcGltcG9ydGVyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgemlwaW1wb3J0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgemlwaW1wb3J0ZXJfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKXppcGltcG9ydGVyX2luaXQsICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTY0OSwxNiArNjQ5LDE2IEBACiAgICBtYXJzaGFsLmM6cl9sb25nKCkgKi8KIHN0YXRpYyBsb25nCiBnZXRfbG9uZyh1bnNpZ25lZCBjaGFyICpidWYpIHsKLQlsb25nIHg7Ci0JeCA9ICBidWZbMF07Ci0JeCB8PSAobG9uZylidWZbMV0gPDwgIDg7Ci0JeCB8PSAobG9uZylidWZbMl0gPDwgMTY7Ci0JeCB8PSAobG9uZylidWZbM10gPDwgMjQ7CisgICAgbG9uZyB4OworICAgIHggPSAgYnVmWzBdOworICAgIHggfD0gKGxvbmcpYnVmWzFdIDw8ICA4OworICAgIHggfD0gKGxvbmcpYnVmWzJdIDw8IDE2OworICAgIHggfD0gKGxvbmcpYnVmWzNdIDw8IDI0OwogI2lmIFNJWkVPRl9MT05HID4gNAotCS8qIFNpZ24gZXh0ZW5zaW9uIGZvciA2NC1iaXQgbWFjaGluZXMgKi8KLQl4IHw9IC0oeCAmIDB4ODAwMDAwMDBMKTsKKyAgICAvKiBTaWduIGV4dGVuc2lvbiBmb3IgNjQtYml0IG1hY2hpbmVzICovCisgICAgeCB8PSAtKHggJiAweDgwMDAwMDAwTCk7CiAjZW5kaWYKLQlyZXR1cm4geDsKKyAgICByZXR1cm4geDsKIH0KIAogLyoKQEAgLTY3MCwxMyArNjcwLDEzIEBACiAgICBBIHRvY19lbnRyeSBpcyBhIHR1cGxlOgogCiAgICAgICAgKF9fZmlsZV9fLCAgICAgICMgdmFsdWUgdG8gdXNlIGZvciBfX2ZpbGVfXywgYXZhaWxhYmxlIGZvciBhbGwgZmlsZXMKLSAgICAgICAgY29tcHJlc3MsICAgICAgIyBjb21wcmVzc2lvbiBraW5kOyAwIGZvciB1bmNvbXByZXNzZWQKLSAgICAgICAgZGF0YV9zaXplLCAgICAgIyBzaXplIG9mIGNvbXByZXNzZWQgZGF0YSBvbiBkaXNrCi0gICAgICAgIGZpbGVfc2l6ZSwgICAgICMgc2l6ZSBvZiBkZWNvbXByZXNzZWQgZGF0YQotICAgICAgICBmaWxlX29mZnNldCwgICAjIG9mZnNldCBvZiBmaWxlIGhlYWRlciBmcm9tIHN0YXJ0IG9mIGFyY2hpdmUKLSAgICAgICAgdGltZSwgICAgICAgICAgIyBtb2QgdGltZSBvZiBmaWxlIChpbiBkb3MgZm9ybWF0KQotICAgICAgICBkYXRlLCAgICAgICAgICAjIG1vZCBkYXRhIG9mIGZpbGUgKGluIGRvcyBmb3JtYXQpCi0gICAgICAgIGNyYywgICAgICAgICAgICMgY3JjIGNoZWNrc3VtIG9mIHRoZSBkYXRhCisgICAgY29tcHJlc3MsICAgICAgIyBjb21wcmVzc2lvbiBraW5kOyAwIGZvciB1bmNvbXByZXNzZWQKKyAgICBkYXRhX3NpemUsICAgICAjIHNpemUgb2YgY29tcHJlc3NlZCBkYXRhIG9uIGRpc2sKKyAgICBmaWxlX3NpemUsICAgICAjIHNpemUgb2YgZGVjb21wcmVzc2VkIGRhdGEKKyAgICBmaWxlX29mZnNldCwgICAjIG9mZnNldCBvZiBmaWxlIGhlYWRlciBmcm9tIHN0YXJ0IG9mIGFyY2hpdmUKKyAgICB0aW1lLCAgICAgICAgICAjIG1vZCB0aW1lIG9mIGZpbGUgKGluIGRvcyBmb3JtYXQpCisgICAgZGF0ZSwgICAgICAgICAgIyBtb2QgZGF0YSBvZiBmaWxlIChpbiBkb3MgZm9ybWF0KQorICAgIGNyYywgICAgICAgICAgICMgY3JjIGNoZWNrc3VtIG9mIHRoZSBkYXRhCiAgICAgICAgKQogCiAgICBEaXJlY3RvcmllcyBjYW4gYmUgcmVjb2duaXplZCBieSB0aGUgdHJhaWxpbmcgU0VQIGluIHRoZSBuYW1lLApAQCAtNjg1LDExNSArNjg1LDExNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJlYWRfZGlyZWN0b3J5KGNoYXIgKmFyY2hpdmUpCiB7Ci0JUHlPYmplY3QgKmZpbGVzID0gTlVMTDsKLQlGSUxFICpmcDsKLQlsb25nIGNvbXByZXNzLCBjcmMsIGRhdGFfc2l6ZSwgZmlsZV9zaXplLCBmaWxlX29mZnNldCwgZGF0ZSwgdGltZTsKLQlsb25nIGhlYWRlcl9vZmZzZXQsIG5hbWVfc2l6ZSwgaGVhZGVyX3NpemUsIGhlYWRlcl9wb3NpdGlvbjsKLQlsb25nIGksIGwsIGNvdW50OwotCXNpemVfdCBsZW5ndGg7Ci0JY2hhciBwYXRoW01BWFBBVEhMRU4gKyA1XTsKLQljaGFyIG5hbWVbTUFYUEFUSExFTiArIDVdOwotCWNoYXIgKnAsIGVuZG9mX2NlbnRyYWxfZGlyWzIyXTsKLQlsb25nIGFyY19vZmZzZXQ7IC8qIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBmaWxlIHRvIHN0YXJ0IG9mIHppcC1hcmNoaXZlICovCisgICAgUHlPYmplY3QgKmZpbGVzID0gTlVMTDsKKyAgICBGSUxFICpmcDsKKyAgICBsb25nIGNvbXByZXNzLCBjcmMsIGRhdGFfc2l6ZSwgZmlsZV9zaXplLCBmaWxlX29mZnNldCwgZGF0ZSwgdGltZTsKKyAgICBsb25nIGhlYWRlcl9vZmZzZXQsIG5hbWVfc2l6ZSwgaGVhZGVyX3NpemUsIGhlYWRlcl9wb3NpdGlvbjsKKyAgICBsb25nIGksIGwsIGNvdW50OworICAgIHNpemVfdCBsZW5ndGg7CisgICAgY2hhciBwYXRoW01BWFBBVEhMRU4gKyA1XTsKKyAgICBjaGFyIG5hbWVbTUFYUEFUSExFTiArIDVdOworICAgIGNoYXIgKnAsIGVuZG9mX2NlbnRyYWxfZGlyWzIyXTsKKyAgICBsb25nIGFyY19vZmZzZXQ7IC8qIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBmaWxlIHRvIHN0YXJ0IG9mIHppcC1hcmNoaXZlICovCiAKLQlpZiAoc3RybGVuKGFyY2hpdmUpID4gTUFYUEFUSExFTikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkiWmlwIHBhdGggbmFtZSBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RyY3B5KHBhdGgsIGFyY2hpdmUpOworICAgIGlmIChzdHJsZW4oYXJjaGl2ZSkgPiBNQVhQQVRITEVOKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlppcCBwYXRoIG5hbWUgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cmNweShwYXRoLCBhcmNoaXZlKTsKIAotCWZwID0gZm9wZW4oYXJjaGl2ZSwgInJiIik7Ci0JaWYgKGZwID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3Qgb3BlbiBaaXAgZmlsZTogIgotCQkJICAgICAiJyUuMjAwcyciLCBhcmNoaXZlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZzZWVrKGZwLCAtMjIsIFNFRUtfRU5EKTsKLQloZWFkZXJfcG9zaXRpb24gPSBmdGVsbChmcCk7Ci0JaWYgKGZyZWFkKGVuZG9mX2NlbnRyYWxfZGlyLCAxLCAyMiwgZnApICE9IDIyKSB7Ci0JCWZjbG9zZShmcCk7Ci0JCVB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IHJlYWQgWmlwIGZpbGU6ICIKLQkJCSAgICAgIiclLjIwMHMnIiwgYXJjaGl2ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZ2V0X2xvbmcoKHVuc2lnbmVkIGNoYXIgKillbmRvZl9jZW50cmFsX2RpcikgIT0gMHgwNjA1NEI1MCkgewotCQkvKiBCYWQ6IEVuZCBvZiBDZW50cmFsIERpciBzaWduYXR1cmUgKi8KLQkJZmNsb3NlKGZwKTsKLQkJUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAibm90IGEgWmlwIGZpbGU6ICIKLQkJCSAgICAgIiclLjIwMHMnIiwgYXJjaGl2ZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmcCA9IGZvcGVuKGFyY2hpdmUsICJyYiIpOworICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwgImNhbid0IG9wZW4gWmlwIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICInJS4yMDBzJyIsIGFyY2hpdmUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnNlZWsoZnAsIC0yMiwgU0VFS19FTkQpOworICAgIGhlYWRlcl9wb3NpdGlvbiA9IGZ0ZWxsKGZwKTsKKyAgICBpZiAoZnJlYWQoZW5kb2ZfY2VudHJhbF9kaXIsIDEsIDIyLCBmcCkgIT0gMjIpIHsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgcmVhZCBaaXAgZmlsZTogIgorICAgICAgICAgICAgICAgICAgICAgIiclLjIwMHMnIiwgYXJjaGl2ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZ2V0X2xvbmcoKHVuc2lnbmVkIGNoYXIgKillbmRvZl9jZW50cmFsX2RpcikgIT0gMHgwNjA1NEI1MCkgeworICAgICAgICAvKiBCYWQ6IEVuZCBvZiBDZW50cmFsIERpciBzaWduYXR1cmUgKi8KKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAibm90IGEgWmlwIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICInJS4yMDBzJyIsIGFyY2hpdmUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQloZWFkZXJfc2l6ZSA9IGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopZW5kb2ZfY2VudHJhbF9kaXIgKyAxMik7Ci0JaGVhZGVyX29mZnNldCA9IGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopZW5kb2ZfY2VudHJhbF9kaXIgKyAxNik7Ci0JYXJjX29mZnNldCA9IGhlYWRlcl9wb3NpdGlvbiAtIGhlYWRlcl9vZmZzZXQgLSBoZWFkZXJfc2l6ZTsKLQloZWFkZXJfb2Zmc2V0ICs9IGFyY19vZmZzZXQ7CisgICAgaGVhZGVyX3NpemUgPSBnZXRfbG9uZygodW5zaWduZWQgY2hhciAqKWVuZG9mX2NlbnRyYWxfZGlyICsgMTIpOworICAgIGhlYWRlcl9vZmZzZXQgPSBnZXRfbG9uZygodW5zaWduZWQgY2hhciAqKWVuZG9mX2NlbnRyYWxfZGlyICsgMTYpOworICAgIGFyY19vZmZzZXQgPSBoZWFkZXJfcG9zaXRpb24gLSBoZWFkZXJfb2Zmc2V0IC0gaGVhZGVyX3NpemU7CisgICAgaGVhZGVyX29mZnNldCArPSBhcmNfb2Zmc2V0OwogCi0JZmlsZXMgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKGZpbGVzID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7CisgICAgZmlsZXMgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKGZpbGVzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlsZW5ndGggPSAobG9uZylzdHJsZW4ocGF0aCk7Ci0JcGF0aFtsZW5ndGhdID0gU0VQOworICAgIGxlbmd0aCA9IChsb25nKXN0cmxlbihwYXRoKTsKKyAgICBwYXRoW2xlbmd0aF0gPSBTRVA7CiAKLQkvKiBTdGFydCBvZiBDZW50cmFsIERpcmVjdG9yeSAqLwotCWNvdW50ID0gMDsKLQlmb3IgKDs7KSB7Ci0JCVB5T2JqZWN0ICp0OwotCQlpbnQgZXJyOworICAgIC8qIFN0YXJ0IG9mIENlbnRyYWwgRGlyZWN0b3J5ICovCisgICAgY291bnQgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgUHlPYmplY3QgKnQ7CisgICAgICAgIGludCBlcnI7CiAKLQkJZnNlZWsoZnAsIGhlYWRlcl9vZmZzZXQsIDApOyAgLyogU3RhcnQgb2YgZmlsZSBoZWFkZXIgKi8KLQkJbCA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQkJaWYgKGwgIT0gMHgwMjAxNEI1MCkKLQkJCWJyZWFrOwkvKiBCYWQ6IENlbnRyYWwgRGlyIEZpbGUgSGVhZGVyICovCi0JCWZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0ICsgMTAsIDApOwotCQljb21wcmVzcyA9IFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7Ci0JCXRpbWUgPSBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOwotCQlkYXRlID0gUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKLQkJY3JjID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwotCQlkYXRhX3NpemUgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7Ci0JCWZpbGVfc2l6ZSA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQkJbmFtZV9zaXplID0gUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKLQkJaGVhZGVyX3NpemUgPSA0NiArIG5hbWVfc2l6ZSArCi0JCSAgIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCkgKwotCQkgICBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOwotCQlmc2VlayhmcCwgaGVhZGVyX29mZnNldCArIDQyLCAwKTsKLQkJZmlsZV9vZmZzZXQgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCkgKyBhcmNfb2Zmc2V0OwotCQlpZiAobmFtZV9zaXplID4gTUFYUEFUSExFTikKLQkJCW5hbWVfc2l6ZSA9IE1BWFBBVEhMRU47CisgICAgICAgIGZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0LCAwKTsgIC8qIFN0YXJ0IG9mIGZpbGUgaGVhZGVyICovCisgICAgICAgIGwgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgICAgIGlmIChsICE9IDB4MDIwMTRCNTApCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIC8qIEJhZDogQ2VudHJhbCBEaXIgRmlsZSBIZWFkZXIgKi8KKyAgICAgICAgZnNlZWsoZnAsIGhlYWRlcl9vZmZzZXQgKyAxMCwgMCk7CisgICAgICAgIGNvbXByZXNzID0gUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsKKyAgICAgICAgdGltZSA9IFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7CisgICAgICAgIGRhdGUgPSBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOworICAgICAgICBjcmMgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgICAgIGRhdGFfc2l6ZSA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICAgICAgZmlsZV9zaXplID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgICAgICBuYW1lX3NpemUgPSBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApOworICAgICAgICBoZWFkZXJfc2l6ZSA9IDQ2ICsgbmFtZV9zaXplICsKKyAgICAgICAgICAgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKSArCisgICAgICAgICAgIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7CisgICAgICAgIGZzZWVrKGZwLCBoZWFkZXJfb2Zmc2V0ICsgNDIsIDApOworICAgICAgICBmaWxlX29mZnNldCA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKSArIGFyY19vZmZzZXQ7CisgICAgICAgIGlmIChuYW1lX3NpemUgPiBNQVhQQVRITEVOKQorICAgICAgICAgICAgbmFtZV9zaXplID0gTUFYUEFUSExFTjsKIAotCQlwID0gbmFtZTsKLQkJZm9yIChpID0gMDsgaSA8IG5hbWVfc2l6ZTsgaSsrKSB7Ci0JCQkqcCA9IChjaGFyKWdldGMoZnApOwotCQkJaWYgKCpwID09ICcvJykKLQkJCQkqcCA9IFNFUDsKLQkJCXArKzsKLQkJfQotCQkqcCA9IDA7CS8qIEFkZCB0ZXJtaW5hdGluZyBudWxsIGJ5dGUgKi8KLQkJaGVhZGVyX29mZnNldCArPSBoZWFkZXJfc2l6ZTsKKyAgICAgICAgcCA9IG5hbWU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYW1lX3NpemU7IGkrKykgeworICAgICAgICAgICAgKnAgPSAoY2hhcilnZXRjKGZwKTsKKyAgICAgICAgICAgIGlmICgqcCA9PSAnLycpCisgICAgICAgICAgICAgICAgKnAgPSBTRVA7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgKnAgPSAwOyAgICAgICAgIC8qIEFkZCB0ZXJtaW5hdGluZyBudWxsIGJ5dGUgKi8KKyAgICAgICAgaGVhZGVyX29mZnNldCArPSBoZWFkZXJfc2l6ZTsKIAotCQlzdHJuY3B5KHBhdGggKyBsZW5ndGggKyAxLCBuYW1lLCBNQVhQQVRITEVOIC0gbGVuZ3RoIC0gMSk7CisgICAgICAgIHN0cm5jcHkocGF0aCArIGxlbmd0aCArIDEsIG5hbWUsIE1BWFBBVEhMRU4gLSBsZW5ndGggLSAxKTsKIAotCQl0ID0gUHlfQnVpbGRWYWx1ZSgic2lpaWlpaWkiLCBwYXRoLCBjb21wcmVzcywgZGF0YV9zaXplLAotCQkJCSAgZmlsZV9zaXplLCBmaWxlX29mZnNldCwgdGltZSwgZGF0ZSwgY3JjKTsKLQkJaWYgKHQgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGZpbGVzLCBuYW1lLCB0KTsKLQkJUHlfREVDUkVGKHQpOwotCQlpZiAoZXJyICE9IDApCi0JCQlnb3RvIGVycm9yOwotCQljb3VudCsrOwotCX0KLQlmY2xvc2UoZnApOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgemlwaW1wb3J0OiBmb3VuZCAlbGQgbmFtZXMgaW4gJXNcbiIsCi0JCQljb3VudCwgYXJjaGl2ZSk7Ci0JcmV0dXJuIGZpbGVzOworICAgICAgICB0ID0gUHlfQnVpbGRWYWx1ZSgic2lpaWlpaWkiLCBwYXRoLCBjb21wcmVzcywgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUsIGZpbGVfb2Zmc2V0LCB0aW1lLCBkYXRlLCBjcmMpOworICAgICAgICBpZiAodCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZmlsZXMsIG5hbWUsIHQpOworICAgICAgICBQeV9ERUNSRUYodCk7CisgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgIGZjbG9zZShmcCk7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyB6aXBpbXBvcnQ6IGZvdW5kICVsZCBuYW1lcyBpbiAlc1xuIiwKKyAgICAgICAgICAgIGNvdW50LCBhcmNoaXZlKTsKKyAgICByZXR1cm4gZmlsZXM7CiBlcnJvcjoKLQlmY2xvc2UoZnApOwotCVB5X1hERUNSRUYoZmlsZXMpOwotCXJldHVybiBOVUxMOworICAgIGZjbG9zZShmcCk7CisgICAgUHlfWERFQ1JFRihmaWxlcyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFJldHVybiB0aGUgemxpYi5kZWNvbXByZXNzIGZ1bmN0aW9uIG9iamVjdCwgb3IgTlVMTCBpZiB6bGliIGNvdWxkbid0CkBAIC04MDMsMzEgKzgwMywzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9kZWNvbXByZXNzX2Z1bmModm9pZCkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmRlY29tcHJlc3MgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVjb21wcmVzcyA9IE5VTEw7CiAKLQlpZiAoZGVjb21wcmVzcyA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICp6bGliOwotCQlzdGF0aWMgaW50IGltcG9ydGluZ196bGliID0gMDsKKyAgICBpZiAoZGVjb21wcmVzcyA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICp6bGliOworICAgICAgICBzdGF0aWMgaW50IGltcG9ydGluZ196bGliID0gMDsKIAotCQlpZiAoaW1wb3J0aW5nX3psaWIgIT0gMCkKLQkJCS8qIFNvbWVvbmUgaGFzIGEgemxpYi5weVtjb10gaW4gdGhlaXIgWmlwIGZpbGU7Ci0JCQkgICBsZXQncyBhdm9pZCBhIHN0YWNrIG92ZXJmbG93LiAqLwotCQkJcmV0dXJuIE5VTEw7Ci0JCWltcG9ydGluZ196bGliID0gMTsKLQkJemxpYiA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInpsaWIiKTsKLQkJaW1wb3J0aW5nX3psaWIgPSAwOwotCQlpZiAoemxpYiAhPSBOVUxMKSB7Ci0JCQlkZWNvbXByZXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh6bGliLAotCQkJCQkJCSAgICAiZGVjb21wcmVzcyIpOwotCQkJUHlfREVDUkVGKHpsaWIpOwotCQl9Ci0JCWVsc2UKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIHppcGltcG9ydDogemxpYiAlc1xuIiwKLQkJCQl6bGliICE9IE5VTEwgPyAiYXZhaWxhYmxlIjogIlVOQVZBSUxBQkxFIik7Ci0JfQotCXJldHVybiBkZWNvbXByZXNzOworICAgICAgICBpZiAoaW1wb3J0aW5nX3psaWIgIT0gMCkKKyAgICAgICAgICAgIC8qIFNvbWVvbmUgaGFzIGEgemxpYi5weVtjb10gaW4gdGhlaXIgWmlwIGZpbGU7CisgICAgICAgICAgICAgICBsZXQncyBhdm9pZCBhIHN0YWNrIG92ZXJmbG93LiAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGltcG9ydGluZ196bGliID0gMTsKKyAgICAgICAgemxpYiA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soInpsaWIiKTsKKyAgICAgICAgaW1wb3J0aW5nX3psaWIgPSAwOworICAgICAgICBpZiAoemxpYiAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWNvbXByZXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh6bGliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlY29tcHJlc3MiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih6bGliKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyB6aXBpbXBvcnQ6IHpsaWIgJXNcbiIsCisgICAgICAgICAgICAgICAgemxpYiAhPSBOVUxMID8gImF2YWlsYWJsZSI6ICJVTkFWQUlMQUJMRSIpOworICAgIH0KKyAgICByZXR1cm4gZGVjb21wcmVzczsKIH0KIAogLyogR2l2ZW4gYSBwYXRoIHRvIGEgWmlwIGZpbGUgYW5kIGEgdG9jX2VudHJ5LCByZXR1cm4gdGhlICh1bmNvbXByZXNzZWQpCkBAIC04MzUsODUgKzgzNSw4NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9kYXRhKGNoYXIgKmFyY2hpdmUsIFB5T2JqZWN0ICp0b2NfZW50cnkpCiB7Ci0JUHlPYmplY3QgKnJhd19kYXRhLCAqZGF0YSA9IE5VTEwsICpkZWNvbXByZXNzOwotCWNoYXIgKmJ1ZjsKLQlGSUxFICpmcDsKLQlpbnQgZXJyOwotCVB5X3NzaXplX3QgYnl0ZXNfcmVhZCA9IDA7Ci0JbG9uZyBsOwotCWNoYXIgKmRhdGFwYXRoOwotCWxvbmcgY29tcHJlc3MsIGRhdGFfc2l6ZSwgZmlsZV9zaXplLCBmaWxlX29mZnNldDsKLQlsb25nIHRpbWUsIGRhdGUsIGNyYzsKKyAgICBQeU9iamVjdCAqcmF3X2RhdGEsICpkYXRhID0gTlVMTCwgKmRlY29tcHJlc3M7CisgICAgY2hhciAqYnVmOworICAgIEZJTEUgKmZwOworICAgIGludCBlcnI7CisgICAgUHlfc3NpemVfdCBieXRlc19yZWFkID0gMDsKKyAgICBsb25nIGw7CisgICAgY2hhciAqZGF0YXBhdGg7CisgICAgbG9uZyBjb21wcmVzcywgZGF0YV9zaXplLCBmaWxlX3NpemUsIGZpbGVfb2Zmc2V0OworICAgIGxvbmcgdGltZSwgZGF0ZSwgY3JjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHRvY19lbnRyeSwgInNsbGxsbGxsIiwgJmRhdGFwYXRoLCAmY29tcHJlc3MsCi0JCQkgICAgICAmZGF0YV9zaXplLCAmZmlsZV9zaXplLCAmZmlsZV9vZmZzZXQsICZ0aW1lLAotCQkJICAgICAgJmRhdGUsICZjcmMpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUodG9jX2VudHJ5LCAic2xsbGxsbGwiLCAmZGF0YXBhdGgsICZjb21wcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFfc2l6ZSwgJmZpbGVfc2l6ZSwgJmZpbGVfb2Zmc2V0LCAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGUsICZjcmMpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZwID0gZm9wZW4oYXJjaGl2ZSwgInJiIik7Ci0JaWYgKCFmcCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSU9FcnJvciwKLQkJICAgInppcGltcG9ydDogY2FuIG5vdCBvcGVuIGZpbGUgJXMiLCBhcmNoaXZlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGZwID0gZm9wZW4oYXJjaGl2ZSwgInJiIik7CisgICAgaWYgKCFmcCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSU9FcnJvciwKKyAgICAgICAgICAgInppcGltcG9ydDogY2FuIG5vdCBvcGVuIGZpbGUgJXMiLCBhcmNoaXZlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBsb2NhbCBmaWxlIGhlYWRlciBpcyBjb3JyZWN0ICovCi0JZnNlZWsoZnAsIGZpbGVfb2Zmc2V0LCAwKTsKLQlsID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwotCWlmIChsICE9IDB4MDQwMzRCNTApIHsKLQkJLyogQmFkOiBMb2NhbCBGaWxlIEhlYWRlciAqLwotCQlQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsCi0JCQkgICAgICJiYWQgbG9jYWwgZmlsZSBoZWFkZXIgaW4gJXMiLAotCQkJICAgICBhcmNoaXZlKTsKLQkJZmNsb3NlKGZwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZzZWVrKGZwLCBmaWxlX29mZnNldCArIDI2LCAwKTsKLQlsID0gMzAgKyBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoZnApICsKLQkgICAgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKTsJLyogbG9jYWwgaGVhZGVyIHNpemUgKi8KLQlmaWxlX29mZnNldCArPSBsOwkvKiBTdGFydCBvZiBmaWxlIGRhdGEgKi8KKyAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGxvY2FsIGZpbGUgaGVhZGVyIGlzIGNvcnJlY3QgKi8KKyAgICBmc2VlayhmcCwgZmlsZV9vZmZzZXQsIDApOworICAgIGwgPSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7CisgICAgaWYgKGwgIT0gMHgwNDAzNEI1MCkgeworICAgICAgICAvKiBCYWQ6IExvY2FsIEZpbGUgSGVhZGVyICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChaaXBJbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJiYWQgbG9jYWwgZmlsZSBoZWFkZXIgaW4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZSk7CisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmc2VlayhmcCwgZmlsZV9vZmZzZXQgKyAyNiwgMCk7CisgICAgbCA9IDMwICsgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKGZwKSArCisgICAgICAgIFB5TWFyc2hhbF9SZWFkU2hvcnRGcm9tRmlsZShmcCk7ICAgICAgICAvKiBsb2NhbCBoZWFkZXIgc2l6ZSAqLworICAgIGZpbGVfb2Zmc2V0ICs9IGw7ICAgICAgICAgICAvKiBTdGFydCBvZiBmaWxlIGRhdGEgKi8KIAotCXJhd19kYXRhID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBjb21wcmVzcyA9PSAwID8KLQkJCQkJICAgICAgZGF0YV9zaXplIDogZGF0YV9zaXplICsgMSk7Ci0JaWYgKHJhd19kYXRhID09IE5VTEwpIHsKLQkJZmNsb3NlKGZwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHJhd19kYXRhKTsKKyAgICByYXdfZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgY29tcHJlc3MgPT0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUgOiBkYXRhX3NpemUgKyAxKTsKKyAgICBpZiAocmF3X2RhdGEgPT0gTlVMTCkgeworICAgICAgICBmY2xvc2UoZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYnVmID0gUHlTdHJpbmdfQXNTdHJpbmcocmF3X2RhdGEpOwogCi0JZXJyID0gZnNlZWsoZnAsIGZpbGVfb2Zmc2V0LCAwKTsKLQlpZiAoZXJyID09IDApCi0JCWJ5dGVzX3JlYWQgPSBmcmVhZChidWYsIDEsIGRhdGFfc2l6ZSwgZnApOwotCWZjbG9zZShmcCk7Ci0JaWYgKGVyciB8fCBieXRlc19yZWFkICE9IGRhdGFfc2l6ZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJCQkiemlwaW1wb3J0OiBjYW4ndCByZWFkIGRhdGEiKTsKLQkJUHlfREVDUkVGKHJhd19kYXRhKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVyciA9IGZzZWVrKGZwLCBmaWxlX29mZnNldCwgMCk7CisgICAgaWYgKGVyciA9PSAwKQorICAgICAgICBieXRlc19yZWFkID0gZnJlYWQoYnVmLCAxLCBkYXRhX3NpemUsIGZwKTsKKyAgICBmY2xvc2UoZnApOworICAgIGlmIChlcnIgfHwgYnl0ZXNfcmVhZCAhPSBkYXRhX3NpemUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiemlwaW1wb3J0OiBjYW4ndCByZWFkIGRhdGEiKTsKKyAgICAgICAgUHlfREVDUkVGKHJhd19kYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGNvbXByZXNzICE9IDApIHsKLQkJYnVmW2RhdGFfc2l6ZV0gPSAnWic7ICAvKiBzYXcgdGhpcyBpbiB6aXBmaWxlLnB5ICovCi0JCWRhdGFfc2l6ZSsrOwotCX0KLQlidWZbZGF0YV9zaXplXSA9ICdcMCc7CisgICAgaWYgKGNvbXByZXNzICE9IDApIHsKKyAgICAgICAgYnVmW2RhdGFfc2l6ZV0gPSAnWic7ICAvKiBzYXcgdGhpcyBpbiB6aXBmaWxlLnB5ICovCisgICAgICAgIGRhdGFfc2l6ZSsrOworICAgIH0KKyAgICBidWZbZGF0YV9zaXplXSA9ICdcMCc7CiAKLQlpZiAoY29tcHJlc3MgPT0gMCkgIC8qIGRhdGEgaXMgbm90IGNvbXByZXNzZWQgKi8KLQkJcmV0dXJuIHJhd19kYXRhOworICAgIGlmIChjb21wcmVzcyA9PSAwKSAgLyogZGF0YSBpcyBub3QgY29tcHJlc3NlZCAqLworICAgICAgICByZXR1cm4gcmF3X2RhdGE7CiAKLQkvKiBEZWNvbXByZXNzIHdpdGggemxpYiAqLwotCWRlY29tcHJlc3MgPSBnZXRfZGVjb21wcmVzc19mdW5jKCk7Ci0JaWYgKGRlY29tcHJlc3MgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsCi0JCQkJImNhbid0IGRlY29tcHJlc3MgZGF0YTsgIgotCQkJCSJ6bGliIG5vdCBhdmFpbGFibGUiKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JZGF0YSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihkZWNvbXByZXNzLCAiT2kiLCByYXdfZGF0YSwgLTE1KTsKKyAgICAvKiBEZWNvbXByZXNzIHdpdGggemxpYiAqLworICAgIGRlY29tcHJlc3MgPSBnZXRfZGVjb21wcmVzc19mdW5jKCk7CisgICAgaWYgKGRlY29tcHJlc3MgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoWmlwSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVjb21wcmVzcyBkYXRhOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiemxpYiBub3QgYXZhaWxhYmxlIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGRhdGEgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZGVjb21wcmVzcywgIk9pIiwgcmF3X2RhdGEsIC0xNSk7CiBlcnJvcjoKLQlQeV9ERUNSRUYocmF3X2RhdGEpOwotCXJldHVybiBkYXRhOworICAgIFB5X0RFQ1JFRihyYXdfZGF0YSk7CisgICAgcmV0dXJuIGRhdGE7CiB9CiAKIC8qIExlbmllbnQgZGF0ZS90aW1lIGNvbXBhcmlzb24gZnVuY3Rpb24uIFRoZSBwcmVjaXNpb24gb2YgdGhlIG10aW1lCkBAIC05MjIsMTEgKzkyMiwxMSBAQAogc3RhdGljIGludAogZXFfbXRpbWUodGltZV90IHQxLCB0aW1lX3QgdDIpCiB7Ci0JdGltZV90IGQgPSB0MSAtIHQyOwotCWlmIChkIDwgMCkKLQkJZCA9IC1kOwotCS8qIGRvc3RpbWUgb25seSBzdG9yZXMgZXZlbiBzZWNvbmRzLCBzbyBiZSBsZW5pZW50ICovCi0JcmV0dXJuIGQgPD0gMTsKKyAgICB0aW1lX3QgZCA9IHQxIC0gdDI7CisgICAgaWYgKGQgPCAwKQorICAgICAgICBkID0gLWQ7CisgICAgLyogZG9zdGltZSBvbmx5IHN0b3JlcyBldmVuIHNlY29uZHMsIHNvIGJlIGxlbmllbnQgKi8KKyAgICByZXR1cm4gZCA8PSAxOwogfQogCiAvKiBHaXZlbiB0aGUgY29udGVudHMgb2YgYSAucHlbY29dIGZpbGUgaW4gYSBidWZmZXIsIHVubWFyc2hhbCB0aGUgZGF0YQpAQCAtOTM3LDQ0ICs5MzcsNDQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bm1hcnNoYWxfY29kZShjaGFyICpwYXRobmFtZSwgUHlPYmplY3QgKmRhdGEsIHRpbWVfdCBtdGltZSkKIHsKLQlQeU9iamVjdCAqY29kZTsKLQljaGFyICpidWYgPSBQeVN0cmluZ19Bc1N0cmluZyhkYXRhKTsKLQlQeV9zc2l6ZV90IHNpemUgPSBQeVN0cmluZ19TaXplKGRhdGEpOworICAgIFB5T2JqZWN0ICpjb2RlOworICAgIGNoYXIgKmJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKGRhdGEpOworICAgIFB5X3NzaXplX3Qgc2l6ZSA9IFB5U3RyaW5nX1NpemUoZGF0YSk7CiAKLQlpZiAoc2l6ZSA8PSA5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwKLQkJCQkiYmFkIHB5YyBkYXRhIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoc2l6ZSA8PSA5KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhaaXBJbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgcHljIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopYnVmKSAhPSBQeUltcG9ydF9HZXRNYWdpY051bWJlcigpKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbWFnaWNcbiIsCi0JCQkJCSAgcGF0aG5hbWUpOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOyAgLyogc2lnbmFsIGNhbGxlciB0byB0cnkgYWx0ZXJuYXRpdmUgKi8KLQl9CisgICAgaWYgKGdldF9sb25nKCh1bnNpZ25lZCBjaGFyICopYnVmKSAhPSBQeUltcG9ydF9HZXRNYWdpY051bWJlcigpKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbWFnaWNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSk7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7ICAvKiBzaWduYWwgY2FsbGVyIHRvIHRyeSBhbHRlcm5hdGl2ZSAqLworICAgIH0KIAotCWlmIChtdGltZSAhPSAwICYmICFlcV9tdGltZShnZXRfbG9uZygodW5zaWduZWQgY2hhciAqKWJ1ZiArIDQpLAotCQkJCSAgICBtdGltZSkpIHsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgJXMgaGFzIGJhZCBtdGltZVxuIiwKLQkJCQkJICBwYXRobmFtZSk7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7ICAvKiBzaWduYWwgY2FsbGVyIHRvIHRyeSBhbHRlcm5hdGl2ZSAqLwotCX0KKyAgICBpZiAobXRpbWUgIT0gMCAmJiAhZXFfbXRpbWUoZ2V0X2xvbmcoKHVuc2lnbmVkIGNoYXIgKilidWYgKyA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXRpbWUpKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbXRpbWVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSk7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7ICAvKiBzaWduYWwgY2FsbGVyIHRvIHRyeSBhbHRlcm5hdGl2ZSAqLworICAgIH0KIAotCWNvZGUgPSBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcoYnVmICsgOCwgc2l6ZSAtIDgpOwotCWlmIChjb2RlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlDb2RlX0NoZWNrKGNvZGUpKSB7Ci0JCVB5X0RFQ1JFRihjb2RlKTsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiY29tcGlsZWQgbW9kdWxlICUuMjAwcyBpcyBub3QgYSBjb2RlIG9iamVjdCIsCi0JCSAgICAgcGF0aG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGNvZGU7CisgICAgY29kZSA9IFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZyhidWYgKyA4LCBzaXplIC0gOCk7CisgICAgaWYgKGNvZGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUNvZGVfQ2hlY2soY29kZSkpIHsKKyAgICAgICAgUHlfREVDUkVGKGNvZGUpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICJjb21waWxlZCBtb2R1bGUgJS4yMDBzIGlzIG5vdCBhIGNvZGUgb2JqZWN0IiwKKyAgICAgICAgICAgICBwYXRobmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gY29kZTsKIH0KIAogLyogUmVwbGFjZSBhbnkgb2NjdXJhbmNlcyBvZiAiXHJcbj8iIGluIHRoZSBpbnB1dCBzdHJpbmcgd2l0aCAiXG4iLgpAQCAtOTg0LDM1ICs5ODQsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBub3JtYWxpemVfbGluZV9lbmRpbmdzKFB5T2JqZWN0ICpzb3VyY2UpCiB7Ci0JY2hhciAqYnVmLCAqcSwgKnAgPSBQeVN0cmluZ19Bc1N0cmluZyhzb3VyY2UpOwotCVB5T2JqZWN0ICpmaXhlZF9zb3VyY2U7CisgICAgY2hhciAqYnVmLCAqcSwgKnAgPSBQeVN0cmluZ19Bc1N0cmluZyhzb3VyY2UpOworICAgIFB5T2JqZWN0ICpmaXhlZF9zb3VyY2U7CiAKLQlpZiAoIXApCi0JCXJldHVybiBOVUxMOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBvbmUgY2hhciBleHRyYSBmb3IgdHJhaWxpbmcgXG4gYW5kIG9uZSBmb3IgdGVybWluYXRpbmcgXDAgKi8KLQlidWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhQeVN0cmluZ19TaXplKHNvdXJjZSkgKyAyKTsKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJCSJ6aXBpbXBvcnQ6IG5vIG1lbW9yeSB0byBhbGxvY2F0ZSAiCi0JCQkJInNvdXJjZSBidWZmZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIHJlcGxhY2UgIlxyXG4/IiBieSAiXG4iICovCi0JZm9yIChxID0gYnVmOyAqcCAhPSAnXDAnOyBwKyspIHsKLQkJaWYgKCpwID09ICdccicpIHsKLQkJCSpxKysgPSAnXG4nOwotCQkJaWYgKCoocCArIDEpID09ICdcbicpCi0JCQkJcCsrOwotCQl9Ci0JCWVsc2UKLQkJCSpxKysgPSAqcDsKLQl9Ci0JKnErKyA9ICdcbic7ICAvKiBhZGQgdHJhaWxpbmcgXG4gKi8KLQkqcSA9ICdcMCc7Ci0JZml4ZWRfc291cmNlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwotCVB5TWVtX0ZyZWUoYnVmKTsKLQlyZXR1cm4gZml4ZWRfc291cmNlOworICAgIC8qIG9uZSBjaGFyIGV4dHJhIGZvciB0cmFpbGluZyBcbiBhbmQgb25lIGZvciB0ZXJtaW5hdGluZyBcMCAqLworICAgIGJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKFB5U3RyaW5nX1NpemUoc291cmNlKSArIDIpOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiemlwaW1wb3J0OiBubyBtZW1vcnkgdG8gYWxsb2NhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIHJlcGxhY2UgIlxyXG4/IiBieSAiXG4iICovCisgICAgZm9yIChxID0gYnVmOyAqcCAhPSAnXDAnOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09ICdccicpIHsKKyAgICAgICAgICAgICpxKysgPSAnXG4nOworICAgICAgICAgICAgaWYgKCoocCArIDEpID09ICdcbicpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpxKysgPSAqcDsKKyAgICB9CisgICAgKnErKyA9ICdcbic7ICAvKiBhZGQgdHJhaWxpbmcgXG4gKi8KKyAgICAqcSA9ICdcMCc7CisgICAgZml4ZWRfc291cmNlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICByZXR1cm4gZml4ZWRfc291cmNlOwogfQogCiAvKiBHaXZlbiBhIHN0cmluZyBidWZmZXIgY29udGFpbmluZyBQeXRob24gc291cmNlIGNvZGUsIGNvbXBpbGUgaXQKQEAgLTEwMjAsMTYgKzEwMjAsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21waWxlX3NvdXJjZShjaGFyICpwYXRobmFtZSwgUHlPYmplY3QgKnNvdXJjZSkKIHsKLQlQeU9iamVjdCAqY29kZSwgKmZpeGVkX3NvdXJjZTsKKyAgICBQeU9iamVjdCAqY29kZSwgKmZpeGVkX3NvdXJjZTsKIAotCWZpeGVkX3NvdXJjZSA9IG5vcm1hbGl6ZV9saW5lX2VuZGluZ3Moc291cmNlKTsKLQlpZiAoZml4ZWRfc291cmNlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGZpeGVkX3NvdXJjZSA9IG5vcm1hbGl6ZV9saW5lX2VuZGluZ3Moc291cmNlKTsKKyAgICBpZiAoZml4ZWRfc291cmNlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY29kZSA9IFB5X0NvbXBpbGVTdHJpbmcoUHlTdHJpbmdfQXNTdHJpbmcoZml4ZWRfc291cmNlKSwgcGF0aG5hbWUsCi0JCQkJUHlfZmlsZV9pbnB1dCk7Ci0JUHlfREVDUkVGKGZpeGVkX3NvdXJjZSk7Ci0JcmV0dXJuIGNvZGU7CisgICAgY29kZSA9IFB5X0NvbXBpbGVTdHJpbmcoUHlTdHJpbmdfQXNTdHJpbmcoZml4ZWRfc291cmNlKSwgcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfZmlsZV9pbnB1dCk7CisgICAgUHlfREVDUkVGKGZpeGVkX3NvdXJjZSk7CisgICAgcmV0dXJuIGNvZGU7CiB9CiAKIC8qIENvbnZlcnQgdGhlIGRhdGUvdGltZSB2YWx1ZXMgZm91bmQgaW4gdGhlIFppcCBhcmNoaXZlIHRvIGEgdmFsdWUKQEAgLTEwMzcsMTkgKzEwMzcsMTkgQEAKIHN0YXRpYyB0aW1lX3QKIHBhcnNlX2Rvc3RpbWUoaW50IGRvc3RpbWUsIGludCBkb3NkYXRlKQogewotCXN0cnVjdCB0bSBzdG07CisgICAgc3RydWN0IHRtIHN0bTsKIAotCW1lbXNldCgodm9pZCAqKSAmc3RtLCAnXDAnLCBzaXplb2Yoc3RtKSk7CisgICAgbWVtc2V0KCh2b2lkICopICZzdG0sICdcMCcsIHNpemVvZihzdG0pKTsKIAotCXN0bS50bV9zZWMgICA9ICAoZG9zdGltZSAgICAgICAgJiAweDFmKSAqIDI7Ci0Jc3RtLnRtX21pbiAgID0gIChkb3N0aW1lID4+IDUpICAmIDB4M2Y7Ci0Jc3RtLnRtX2hvdXIgID0gIChkb3N0aW1lID4+IDExKSAmIDB4MWY7Ci0Jc3RtLnRtX21kYXkgID0gICBkb3NkYXRlICAgICAgICAmIDB4MWY7Ci0Jc3RtLnRtX21vbiAgID0gKChkb3NkYXRlID4+IDUpICAmIDB4MGYpIC0gMTsKLQlzdG0udG1feWVhciAgPSAoKGRvc2RhdGUgPj4gOSkgICYgMHg3ZikgKyA4MDsKLQlzdG0udG1faXNkc3QgPSAgIC0xOyAvKiB3ZGF5L3lkYXkgaXMgaWdub3JlZCAqLworICAgIHN0bS50bV9zZWMgICA9ICAoZG9zdGltZSAgICAgICAgJiAweDFmKSAqIDI7CisgICAgc3RtLnRtX21pbiAgID0gIChkb3N0aW1lID4+IDUpICAmIDB4M2Y7CisgICAgc3RtLnRtX2hvdXIgID0gIChkb3N0aW1lID4+IDExKSAmIDB4MWY7CisgICAgc3RtLnRtX21kYXkgID0gICBkb3NkYXRlICAgICAgICAmIDB4MWY7CisgICAgc3RtLnRtX21vbiAgID0gKChkb3NkYXRlID4+IDUpICAmIDB4MGYpIC0gMTsKKyAgICBzdG0udG1feWVhciAgPSAoKGRvc2RhdGUgPj4gOSkgICYgMHg3ZikgKyA4MDsKKyAgICBzdG0udG1faXNkc3QgPSAgIC0xOyAvKiB3ZGF5L3lkYXkgaXMgaWdub3JlZCAqLwogCi0JcmV0dXJuIG1rdGltZSgmc3RtKTsKKyAgICByZXR1cm4gbWt0aW1lKCZzdG0pOwogfQogCiAvKiBHaXZlbiBhIHBhdGggdG8gYSAucHljIG9yIC5weW8gZmlsZSBpbiB0aGUgYXJjaGl2ZSwgcmV0dXJuIHRoZQpAQCAtMTA1OCwxMDYgKzEwNTgsMTA2IEBACiBzdGF0aWMgdGltZV90CiBnZXRfbXRpbWVfb2Zfc291cmNlKFppcEltcG9ydGVyICpzZWxmLCBjaGFyICpwYXRoKQogewotCVB5T2JqZWN0ICp0b2NfZW50cnk7Ci0JdGltZV90IG10aW1lID0gMDsKLQlQeV9zc2l6ZV90IGxhc3RjaGFyID0gc3RybGVuKHBhdGgpIC0gMTsKLQljaGFyIHNhdmVjaGFyID0gcGF0aFtsYXN0Y2hhcl07Ci0JcGF0aFtsYXN0Y2hhcl0gPSAnXDAnOyAgLyogc3RyaXAgJ2MnIG9yICdvJyBmcm9tICoucHlbY29dICovCi0JdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOwotCWlmICh0b2NfZW50cnkgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKHRvY19lbnRyeSkgJiYKLQkgICAgUHlUdXBsZV9TaXplKHRvY19lbnRyeSkgPT0gOCkgewotCQkvKiBmZXRjaCB0aGUgdGltZSBzdGFtcCBvZiB0aGUgLnB5IGZpbGUgZm9yIGNvbXBhcmlzb24KLQkJICAgd2l0aCBhbiBlbWJlZGRlZCBweWMgdGltZSBzdGFtcCAqLwotCQlpbnQgdGltZSwgZGF0ZTsKLQkJdGltZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dldEl0ZW0odG9jX2VudHJ5LCA1KSk7Ci0JCWRhdGUgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgNikpOwotCQltdGltZSA9IHBhcnNlX2Rvc3RpbWUodGltZSwgZGF0ZSk7Ci0JfQotCXBhdGhbbGFzdGNoYXJdID0gc2F2ZWNoYXI7Ci0JcmV0dXJuIG10aW1lOworICAgIFB5T2JqZWN0ICp0b2NfZW50cnk7CisgICAgdGltZV90IG10aW1lID0gMDsKKyAgICBQeV9zc2l6ZV90IGxhc3RjaGFyID0gc3RybGVuKHBhdGgpIC0gMTsKKyAgICBjaGFyIHNhdmVjaGFyID0gcGF0aFtsYXN0Y2hhcl07CisgICAgcGF0aFtsYXN0Y2hhcl0gPSAnXDAnOyAgLyogc3RyaXAgJ2MnIG9yICdvJyBmcm9tICoucHlbY29dICovCisgICAgdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOworICAgIGlmICh0b2NfZW50cnkgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKHRvY19lbnRyeSkgJiYKKyAgICAgICAgUHlUdXBsZV9TaXplKHRvY19lbnRyeSkgPT0gOCkgeworICAgICAgICAvKiBmZXRjaCB0aGUgdGltZSBzdGFtcCBvZiB0aGUgLnB5IGZpbGUgZm9yIGNvbXBhcmlzb24KKyAgICAgICAgICAgd2l0aCBhbiBlbWJlZGRlZCBweWMgdGltZSBzdGFtcCAqLworICAgICAgICBpbnQgdGltZSwgZGF0ZTsKKyAgICAgICAgdGltZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dldEl0ZW0odG9jX2VudHJ5LCA1KSk7CisgICAgICAgIGRhdGUgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgNikpOworICAgICAgICBtdGltZSA9IHBhcnNlX2Rvc3RpbWUodGltZSwgZGF0ZSk7CisgICAgfQorICAgIHBhdGhbbGFzdGNoYXJdID0gc2F2ZWNoYXI7CisgICAgcmV0dXJuIG10aW1lOwogfQogCiAvKiBSZXR1cm4gdGhlIGNvZGUgb2JqZWN0IGZvciB0aGUgbW9kdWxlIG5hbWVkIGJ5ICdmdWxsbmFtZScgZnJvbSB0aGUKICAgIFppcCBhcmNoaXZlIGFzIGEgbmV3IHJlZmVyZW5jZS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY29kZV9mcm9tX2RhdGEoWmlwSW1wb3J0ZXIgKnNlbGYsIGludCBpc3BhY2thZ2UsIGludCBpc2J5dGVjb2RlLAotCQkgICB0aW1lX3QgbXRpbWUsIFB5T2JqZWN0ICp0b2NfZW50cnkpCisgICAgICAgICAgICAgICAgICAgdGltZV90IG10aW1lLCBQeU9iamVjdCAqdG9jX2VudHJ5KQogewotCVB5T2JqZWN0ICpkYXRhLCAqY29kZTsKLQljaGFyICptb2RwYXRoOwotCWNoYXIgKmFyY2hpdmUgPSBQeVN0cmluZ19Bc1N0cmluZyhzZWxmLT5hcmNoaXZlKTsKKyAgICBQeU9iamVjdCAqZGF0YSwgKmNvZGU7CisgICAgY2hhciAqbW9kcGF0aDsKKyAgICBjaGFyICphcmNoaXZlID0gUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSk7CiAKLQlpZiAoYXJjaGl2ZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJjaGl2ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWRhdGEgPSBnZXRfZGF0YShhcmNoaXZlLCB0b2NfZW50cnkpOwotCWlmIChkYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGRhdGEgPSBnZXRfZGF0YShhcmNoaXZlLCB0b2NfZW50cnkpOworICAgIGlmIChkYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbW9kcGF0aCA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5VHVwbGVfR2V0SXRlbSh0b2NfZW50cnksIDApKTsKKyAgICBtb2RwYXRoID0gUHlTdHJpbmdfQXNTdHJpbmcoUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgMCkpOwogCi0JaWYgKGlzYnl0ZWNvZGUpIHsKLQkJY29kZSA9IHVubWFyc2hhbF9jb2RlKG1vZHBhdGgsIGRhdGEsIG10aW1lKTsKLQl9Ci0JZWxzZSB7Ci0JCWNvZGUgPSBjb21waWxlX3NvdXJjZShtb2RwYXRoLCBkYXRhKTsKLQl9Ci0JUHlfREVDUkVGKGRhdGEpOwotCXJldHVybiBjb2RlOworICAgIGlmIChpc2J5dGVjb2RlKSB7CisgICAgICAgIGNvZGUgPSB1bm1hcnNoYWxfY29kZShtb2RwYXRoLCBkYXRhLCBtdGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjb2RlID0gY29tcGlsZV9zb3VyY2UobW9kcGF0aCwgZGF0YSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihkYXRhKTsKKyAgICByZXR1cm4gY29kZTsKIH0KIAogLyogR2V0IHRoZSBjb2RlIG9iamVjdCBhc3NvaWNpYXRlZCB3aXRoIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGJ5CiAgICAnZnVsbG5hbWUnLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9tb2R1bGVfY29kZShaaXBJbXBvcnRlciAqc2VsZiwgY2hhciAqZnVsbG5hbWUsCi0JCWludCAqcF9pc3BhY2thZ2UsIGNoYXIgKipwX21vZHBhdGgpCisgICAgICAgICAgICAgICAgaW50ICpwX2lzcGFja2FnZSwgY2hhciAqKnBfbW9kcGF0aCkKIHsKLQlQeU9iamVjdCAqdG9jX2VudHJ5OwotCWNoYXIgKnN1Ym5hbWUsIHBhdGhbTUFYUEFUSExFTiArIDFdOwotCWludCBsZW47Ci0Jc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciAqenNvOworICAgIFB5T2JqZWN0ICp0b2NfZW50cnk7CisgICAgY2hhciAqc3VibmFtZSwgcGF0aFtNQVhQQVRITEVOICsgMV07CisgICAgaW50IGxlbjsKKyAgICBzdHJ1Y3Qgc3RfemlwX3NlYXJjaG9yZGVyICp6c287CiAKLQlzdWJuYW1lID0gZ2V0X3N1Ym5hbWUoZnVsbG5hbWUpOworICAgIHN1Ym5hbWUgPSBnZXRfc3VibmFtZShmdWxsbmFtZSk7CiAKLQlsZW4gPSBtYWtlX2ZpbGVuYW1lKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCksIHN1Ym5hbWUsIHBhdGgpOwotCWlmIChsZW4gPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBsZW4gPSBtYWtlX2ZpbGVuYW1lKFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnByZWZpeCksIHN1Ym5hbWUsIHBhdGgpOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoenNvID0gemlwX3NlYXJjaG9yZGVyOyAqenNvLT5zdWZmaXg7IHpzbysrKSB7Ci0JCVB5T2JqZWN0ICpjb2RlID0gTlVMTDsKKyAgICBmb3IgKHpzbyA9IHppcF9zZWFyY2hvcmRlcjsgKnpzby0+c3VmZml4OyB6c28rKykgeworICAgICAgICBQeU9iamVjdCAqY29kZSA9IE5VTEw7CiAKLQkJc3RyY3B5KHBhdGggKyBsZW4sIHpzby0+c3VmZml4KTsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIHRyeWluZyAlcyVjJXNcbiIsCi0JCQkJCSAgUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSksCi0JCQkJCSAgU0VQLCBwYXRoKTsKLQkJdG9jX2VudHJ5ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+ZmlsZXMsIHBhdGgpOwotCQlpZiAodG9jX2VudHJ5ICE9IE5VTEwpIHsKLQkJCXRpbWVfdCBtdGltZSA9IDA7Ci0JCQlpbnQgaXNwYWNrYWdlID0genNvLT50eXBlICYgSVNfUEFDS0FHRTsKLQkJCWludCBpc2J5dGVjb2RlID0genNvLT50eXBlICYgSVNfQllURUNPREU7CisgICAgICAgIHN0cmNweShwYXRoICsgbGVuLCB6c28tPnN1ZmZpeCk7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZyA+IDEpCisgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyB0cnlpbmcgJXMlYyVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoc2VsZi0+YXJjaGl2ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVAsIHBhdGgpOworICAgICAgICB0b2NfZW50cnkgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5maWxlcywgcGF0aCk7CisgICAgICAgIGlmICh0b2NfZW50cnkgIT0gTlVMTCkgeworICAgICAgICAgICAgdGltZV90IG10aW1lID0gMDsKKyAgICAgICAgICAgIGludCBpc3BhY2thZ2UgPSB6c28tPnR5cGUgJiBJU19QQUNLQUdFOworICAgICAgICAgICAgaW50IGlzYnl0ZWNvZGUgPSB6c28tPnR5cGUgJiBJU19CWVRFQ09ERTsKIAotCQkJaWYgKGlzYnl0ZWNvZGUpCi0JCQkJbXRpbWUgPSBnZXRfbXRpbWVfb2Zfc291cmNlKHNlbGYsIHBhdGgpOwotCQkJaWYgKHBfaXNwYWNrYWdlICE9IE5VTEwpCi0JCQkJKnBfaXNwYWNrYWdlID0gaXNwYWNrYWdlOwotCQkJY29kZSA9IGdldF9jb2RlX2Zyb21fZGF0YShzZWxmLCBpc3BhY2thZ2UsCi0JCQkJCQkgIGlzYnl0ZWNvZGUsIG10aW1lLAotCQkJCQkJICB0b2NfZW50cnkpOwotCQkJaWYgKGNvZGUgPT0gUHlfTm9uZSkgewotCQkJCS8qIGJhZCBtYWdpYyBudW1iZXIgb3Igbm9uLW1hdGNoaW5nIG10aW1lCi0JCQkJICAgaW4gYnl0ZSBjb2RlLCB0cnkgbmV4dCAqLwotCQkJCVB5X0RFQ1JFRihjb2RlKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb2RlICE9IE5VTEwgJiYgcF9tb2RwYXRoICE9IE5VTEwpCi0JCQkJKnBfbW9kcGF0aCA9IFB5U3RyaW5nX0FzU3RyaW5nKAotCQkJCQlQeVR1cGxlX0dldEl0ZW0odG9jX2VudHJ5LCAwKSk7Ci0JCQlyZXR1cm4gY29kZTsKLQkJfQotCX0KLQlQeUVycl9Gb3JtYXQoWmlwSW1wb3J0RXJyb3IsICJjYW4ndCBmaW5kIG1vZHVsZSAnJS4yMDBzJyIsIGZ1bGxuYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmIChpc2J5dGVjb2RlKQorICAgICAgICAgICAgICAgIG10aW1lID0gZ2V0X210aW1lX29mX3NvdXJjZShzZWxmLCBwYXRoKTsKKyAgICAgICAgICAgIGlmIChwX2lzcGFja2FnZSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICpwX2lzcGFja2FnZSA9IGlzcGFja2FnZTsKKyAgICAgICAgICAgIGNvZGUgPSBnZXRfY29kZV9mcm9tX2RhdGEoc2VsZiwgaXNwYWNrYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2J5dGVjb2RlLCBtdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9jX2VudHJ5KTsKKyAgICAgICAgICAgIGlmIChjb2RlID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICAvKiBiYWQgbWFnaWMgbnVtYmVyIG9yIG5vbi1tYXRjaGluZyBtdGltZQorICAgICAgICAgICAgICAgICAgIGluIGJ5dGUgY29kZSwgdHJ5IG5leHQgKi8KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY29kZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29kZSAhPSBOVUxMICYmIHBfbW9kcGF0aCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICpwX21vZHBhdGggPSBQeVN0cmluZ19Bc1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HZXRJdGVtKHRvY19lbnRyeSwgMCkpOworICAgICAgICAgICAgcmV0dXJuIGNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfRm9ybWF0KFppcEltcG9ydEVycm9yLCAiY2FuJ3QgZmluZCBtb2R1bGUgJyUuMjAwcyciLCBmdWxsbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMTE4MCw1MSArMTE4MCw1MSBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXR6aXBpbXBvcnQodm9pZCkKIHsKLQlQeU9iamVjdCAqbW9kOworICAgIFB5T2JqZWN0ICptb2Q7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZaaXBJbXBvcnRlcl9UeXBlKSA8IDApCi0JCXJldHVybjsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZaaXBJbXBvcnRlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCS8qIENvcnJlY3QgZGlyZWN0b3J5IHNlcGFyYXRvciAqLwotCXppcF9zZWFyY2hvcmRlclswXS5zdWZmaXhbMF0gPSBTRVA7Ci0JemlwX3NlYXJjaG9yZGVyWzFdLnN1ZmZpeFswXSA9IFNFUDsKLQl6aXBfc2VhcmNob3JkZXJbMl0uc3VmZml4WzBdID0gU0VQOwotCWlmIChQeV9PcHRpbWl6ZUZsYWcpIHsKLQkJLyogUmV2ZXJzZSAqLnB5YyBhbmQgKi5weW8gKi8KLQkJc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciB0bXA7Ci0JCXRtcCA9IHppcF9zZWFyY2hvcmRlclswXTsKLQkJemlwX3NlYXJjaG9yZGVyWzBdID0gemlwX3NlYXJjaG9yZGVyWzFdOwotCQl6aXBfc2VhcmNob3JkZXJbMV0gPSB0bXA7Ci0JCXRtcCA9IHppcF9zZWFyY2hvcmRlclszXTsKLQkJemlwX3NlYXJjaG9yZGVyWzNdID0gemlwX3NlYXJjaG9yZGVyWzRdOwotCQl6aXBfc2VhcmNob3JkZXJbNF0gPSB0bXA7Ci0JfQorICAgIC8qIENvcnJlY3QgZGlyZWN0b3J5IHNlcGFyYXRvciAqLworICAgIHppcF9zZWFyY2hvcmRlclswXS5zdWZmaXhbMF0gPSBTRVA7CisgICAgemlwX3NlYXJjaG9yZGVyWzFdLnN1ZmZpeFswXSA9IFNFUDsKKyAgICB6aXBfc2VhcmNob3JkZXJbMl0uc3VmZml4WzBdID0gU0VQOworICAgIGlmIChQeV9PcHRpbWl6ZUZsYWcpIHsKKyAgICAgICAgLyogUmV2ZXJzZSAqLnB5YyBhbmQgKi5weW8gKi8KKyAgICAgICAgc3RydWN0IHN0X3ppcF9zZWFyY2hvcmRlciB0bXA7CisgICAgICAgIHRtcCA9IHppcF9zZWFyY2hvcmRlclswXTsKKyAgICAgICAgemlwX3NlYXJjaG9yZGVyWzBdID0gemlwX3NlYXJjaG9yZGVyWzFdOworICAgICAgICB6aXBfc2VhcmNob3JkZXJbMV0gPSB0bXA7CisgICAgICAgIHRtcCA9IHppcF9zZWFyY2hvcmRlclszXTsKKyAgICAgICAgemlwX3NlYXJjaG9yZGVyWzNdID0gemlwX3NlYXJjaG9yZGVyWzRdOworICAgICAgICB6aXBfc2VhcmNob3JkZXJbNF0gPSB0bXA7CisgICAgfQogCi0JbW9kID0gUHlfSW5pdE1vZHVsZTQoInppcGltcG9ydCIsIE5VTEwsIHppcGltcG9ydF9kb2MsCi0JCQkgICAgIE5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG1vZCA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgbW9kID0gUHlfSW5pdE1vZHVsZTQoInppcGltcG9ydCIsIE5VTEwsIHppcGltcG9ydF9kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAobW9kID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCVppcEltcG9ydEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJ6aXBpbXBvcnQuWmlwSW1wb3J0RXJyb3IiLAotCQkJCQkgICAgUHlFeGNfSW1wb3J0RXJyb3IsIE5VTEwpOwotCWlmIChaaXBJbXBvcnRFcnJvciA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgWmlwSW1wb3J0RXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24oInppcGltcG9ydC5aaXBJbXBvcnRFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfSW1wb3J0RXJyb3IsIE5VTEwpOworICAgIGlmIChaaXBJbXBvcnRFcnJvciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQlQeV9JTkNSRUYoWmlwSW1wb3J0RXJyb3IpOwotCWlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kLCAiWmlwSW1wb3J0RXJyb3IiLAotCQkJICAgICAgIFppcEltcG9ydEVycm9yKSA8IDApCi0JCXJldHVybjsKKyAgICBQeV9JTkNSRUYoWmlwSW1wb3J0RXJyb3IpOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobW9kLCAiWmlwSW1wb3J0RXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWmlwSW1wb3J0RXJyb3IpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JUHlfSU5DUkVGKCZaaXBJbXBvcnRlcl9UeXBlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZCwgInppcGltcG9ydGVyIiwKLQkJCSAgICAgICAoUHlPYmplY3QgKikmWmlwSW1wb3J0ZXJfVHlwZSkgPCAwKQotCQlyZXR1cm47CisgICAgUHlfSU5DUkVGKCZaaXBJbXBvcnRlcl9UeXBlKTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZCwgInppcGltcG9ydGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSZaaXBJbXBvcnRlcl9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCXppcF9kaXJlY3RvcnlfY2FjaGUgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKHppcF9kaXJlY3RvcnlfY2FjaGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCVB5X0lOQ1JFRih6aXBfZGlyZWN0b3J5X2NhY2hlKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZCwgIl96aXBfZGlyZWN0b3J5X2NhY2hlIiwKLQkJCSAgICAgICB6aXBfZGlyZWN0b3J5X2NhY2hlKSA8IDApCi0JCXJldHVybjsKKyAgICB6aXBfZGlyZWN0b3J5X2NhY2hlID0gUHlEaWN0X05ldygpOworICAgIGlmICh6aXBfZGlyZWN0b3J5X2NhY2hlID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoemlwX2RpcmVjdG9yeV9jYWNoZSk7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2QsICJfemlwX2RpcmVjdG9yeV9jYWNoZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBfZGlyZWN0b3J5X2NhY2hlKSA8IDApCisgICAgICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYm1vZHVsZS5jIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKaW5kZXggMGNiMWU2NC4uYmI1MmZkYyAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGlibW9kdWxlLmMKKysrIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKQEAgLTI4LDEyICsyOCwxMiBAQAogc3RhdGljIFB5VGhyZWFkX3R5cGVfbG9jayB6bGliX2xvY2sgPSBOVUxMOyAvKiBpbml0aWFsaXplZCBvbiBtb2R1bGUgbG9hZCAqLwogCiAjZGVmaW5lIEVOVEVSX1pMSUIgXAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgXAotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayh6bGliX2xvY2ssIDEpOyBcCi0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBcCisgICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayh6bGliX2xvY2ssIDEpOyBcCisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKICNkZWZpbmUgTEVBVkVfWkxJQiBcCi0JUHlUaHJlYWRfcmVsZWFzZV9sb2NrKHpsaWJfbG9jayk7CisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayh6bGliX2xvY2spOwogCiAjZWxzZQogCkBAIC03Myw5ICs3Myw5IEBACiB6bGliX2Vycm9yKHpfc3RyZWFtIHpzdCwgaW50IGVyciwgY2hhciAqbXNnKQogewogICAgIGlmICh6c3QubXNnID09IFpfTlVMTCkKLQlQeUVycl9Gb3JtYXQoWmxpYkVycm9yLCAiRXJyb3IgJWQgJXMiLCBlcnIsIG1zZyk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChabGliRXJyb3IsICJFcnJvciAlZCAlcyIsIGVyciwgbXNnKTsKICAgICBlbHNlCi0JUHlFcnJfRm9ybWF0KFpsaWJFcnJvciwgIkVycm9yICVkICVzOiAlLjIwMHMiLCBlcnIsIG1zZywgenN0Lm1zZyk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChabGliRXJyb3IsICJFcnJvciAlZCAlczogJS4yMDBzIiwgZXJyLCBtc2csIHpzdC5tc2cpOwogfQogCiBQeURvY19TVFJWQVIoY29tcHJlc3NvYmpfX2RvY19fLApAQCAtOTQsMTcgKzk0LDE3IEBACiAgICAgY29tcG9iamVjdCAqc2VsZjsKICAgICBzZWxmID0gUHlPYmplY3RfTmV3KGNvbXBvYmplY3QsIHR5cGUpOwogICAgIGlmIChzZWxmID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMDsKICAgICBzZWxmLT51bnVzZWRfZGF0YSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOwogICAgIGlmIChzZWxmLT51bnVzZWRfZGF0YSA9PSBOVUxMKSB7Ci0JUHlfREVDUkVGKHNlbGYpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBzZWxmLT51bmNvbnN1bWVkX3RhaWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKICAgICBpZiAoc2VsZi0+dW5jb25zdW1lZF90YWlsID09IE5VTEwpIHsKLQlQeV9ERUNSRUYoc2VsZik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBzZWxmOwogfQpAQCAtMTI0LDE1ICsxMjQsMTUgQEAKIAogICAgIC8qIHJlcXVpcmUgUHl0aG9uIHN0cmluZyBvYmplY3QsIG9wdGlvbmFsICdsZXZlbCcgYXJnICovCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xpOmNvbXByZXNzIiwgJmlucHV0LCAmbGVuZ3RoLCAmbGV2ZWwpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHpzdC5hdmFpbF9vdXQgPSBsZW5ndGggKyBsZW5ndGgvMTAwMCArIDEyICsgMTsKIAogICAgIG91dHB1dCA9IChCeXRlKiltYWxsb2MoenN0LmF2YWlsX291dCk7CiAgICAgaWYgKG91dHB1dCA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJIkNhbid0IGFsbG9jYXRlIG1lbW9yeSB0byBjb21wcmVzcyBkYXRhIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgdG8gY29tcHJlc3MgZGF0YSIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBQYXN0IHRoZSBwb2ludCBvZiBubyByZXR1cm4uICBGcm9tIGhlcmUgb24gb3V0LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQpAQCAtMTQ3LDE5ICsxNDcsMTkgQEAKIAogICAgIHN3aXRjaChlcnIpIHsKICAgICBjYXNlKFpfT0spOgotCWJyZWFrOworICAgICAgICBicmVhazsKICAgICBjYXNlKFpfTUVNX0VSUk9SKToKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0JCQkiT3V0IG9mIG1lbW9yeSB3aGlsZSBjb21wcmVzc2luZyBkYXRhIik7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk91dCBvZiBtZW1vcnkgd2hpbGUgY29tcHJlc3NpbmcgZGF0YSIpOworICAgICAgICBnb3RvIGVycm9yOwogICAgIGNhc2UoWl9TVFJFQU1fRVJST1IpOgotCVB5RXJyX1NldFN0cmluZyhabGliRXJyb3IsCi0JCQkiQmFkIGNvbXByZXNzaW9uIGxldmVsIik7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFpsaWJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgY29tcHJlc3Npb24gbGV2ZWwiKTsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICBkZWZhdWx0OgogICAgICAgICBkZWZsYXRlRW5kKCZ6c3QpOwotCXpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBjb21wcmVzc2luZyBkYXRhIik7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGNvbXByZXNzaW5nIGRhdGEiKTsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTOwpAQCAtMTY3LDE3ICsxNjcsMTcgQEAKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUzsKIAogICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7Ci0JemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGNvbXByZXNzaW5nIGRhdGEiKTsKLQlkZWZsYXRlRW5kKCZ6c3QpOwotCWdvdG8gZXJyb3I7CisgICAgICAgIHpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBjb21wcmVzc2luZyBkYXRhIik7CisgICAgICAgIGRlZmxhdGVFbmQoJnpzdCk7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgZXJyPWRlZmxhdGVFbmQoJnpzdCk7CiAgICAgaWYgKGVyciA9PSBaX09LKQotCVJldHVyblZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopb3V0cHV0LAotCQkJCQkgICAgICAgenN0LnRvdGFsX291dCk7CisgICAgICAgIFJldHVyblZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6c3QudG90YWxfb3V0KTsKICAgICBlbHNlCi0JemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGZpbmlzaGluZyBjb21wcmVzc2lvbiIpOworICAgICAgICB6bGliX2Vycm9yKHpzdCwgZXJyLCAid2hpbGUgZmluaXNoaW5nIGNvbXByZXNzaW9uIik7CiAKICBlcnJvcjoKICAgICBmcmVlKG91dHB1dCk7CkBAIC0yMDIsMTcgKzIwMiwxNyBAQAogICAgIHpfc3RyZWFtIHpzdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8aW46ZGVjb21wcmVzcyIsCi0JCQkgICZpbnB1dCwgJmxlbmd0aCwgJndzaXplLCAmcl9zdHJsZW4pKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsICZsZW5ndGgsICZ3c2l6ZSwgJnJfc3RybGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAocl9zdHJsZW4gPD0gMCkKLQlyX3N0cmxlbiA9IDE7CisgICAgICAgIHJfc3RybGVuID0gMTsKIAogICAgIHpzdC5hdmFpbF9pbiA9IGxlbmd0aDsKICAgICB6c3QuYXZhaWxfb3V0ID0gcl9zdHJsZW47CiAKICAgICBpZiAoIShyZXN1bHRfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcl9zdHJsZW4pKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICB6c3QuemFsbG9jID0gKGFsbG9jX2Z1bmMpTlVMTDsKICAgICB6c3QuemZyZWUgPSAoZnJlZV9mdW5jKVpfTlVMTDsKQEAgLTIyMiw2MCArMjIyLDYwIEBACiAKICAgICBzd2l0Y2goZXJyKSB7CiAgICAgY2FzZShaX09LKToKLQlicmVhazsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZShaX01FTV9FUlJPUik6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJIk91dCBvZiBtZW1vcnkgd2hpbGUgZGVjb21wcmVzc2luZyBkYXRhIik7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk91dCBvZiBtZW1vcnkgd2hpbGUgZGVjb21wcmVzc2luZyBkYXRhIik7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgZGVmYXVsdDoKICAgICAgICAgaW5mbGF0ZUVuZCgmenN0KTsKLQl6bGliX2Vycm9yKHpzdCwgZXJyLCAid2hpbGUgcHJlcGFyaW5nIHRvIGRlY29tcHJlc3MgZGF0YSIpOwotCWdvdG8gZXJyb3I7CisgICAgICAgIHpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBwcmVwYXJpbmcgdG8gZGVjb21wcmVzcyBkYXRhIik7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgZG8gewotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQllcnI9aW5mbGF0ZSgmenN0LCBaX0ZJTklTSCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBlcnI9aW5mbGF0ZSgmenN0LCBaX0ZJTklTSCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlzd2l0Y2goZXJyKSB7Ci0JY2FzZShaX1NUUkVBTV9FTkQpOgotCSAgICBicmVhazsKLQljYXNlKFpfQlVGX0VSUk9SKToKLQkgICAgLyoKLQkgICAgICogSWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBieXRlIG9mIHJvb20gYWNjb3JkaW5nIHRvIHpzdC5hdmFpbF9vdXQKLQkgICAgICogYW5kIHdlIGdldCB0aGlzIGVycm9yLCBhc3N1bWUgdGhhdCBpdCBtZWFucyB6bGliIGNhbm5vdAotCSAgICAgKiBwcm9jZXNzIHRoZSBpbmZsYXRlIGNhbGwoKSBkdWUgdG8gYW4gZXJyb3IgaW4gdGhlIGRhdGEuCi0JICAgICAqLwotCSAgICBpZiAoenN0LmF2YWlsX291dCA+IDApIHsKLQkJUHlFcnJfRm9ybWF0KFpsaWJFcnJvciwgIkVycm9yICVpIHdoaWxlIGRlY29tcHJlc3NpbmcgZGF0YSIsCi0JCQkgICAgIGVycik7Ci0JCWluZmxhdGVFbmQoJnpzdCk7Ci0JCWdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgICAgLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZShaX09LKToKLQkgICAgLyogbmVlZCBtb3JlIG1lbW9yeSAqLwotCSAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0X3N0ciwgcl9zdHJsZW4gPDwgMSkgPCAwKSB7Ci0JCWluZmxhdGVFbmQoJnpzdCk7Ci0JCWdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgICAgenN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0X3N0cikgXAotCQkrIHJfc3RybGVuOwotCSAgICB6c3QuYXZhaWxfb3V0ID0gcl9zdHJsZW47Ci0JICAgIHJfc3RybGVuID0gcl9zdHJsZW4gPDwgMTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgaW5mbGF0ZUVuZCgmenN0KTsKLQkgICAgemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGRlY29tcHJlc3NpbmcgZGF0YSIpOwotCSAgICBnb3RvIGVycm9yOwotCX0KKyAgICAgICAgc3dpdGNoKGVycikgeworICAgICAgICBjYXNlKFpfU1RSRUFNX0VORCk6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZShaX0JVRl9FUlJPUik6CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBieXRlIG9mIHJvb20gYWNjb3JkaW5nIHRvIHpzdC5hdmFpbF9vdXQKKyAgICAgICAgICAgICAqIGFuZCB3ZSBnZXQgdGhpcyBlcnJvciwgYXNzdW1lIHRoYXQgaXQgbWVhbnMgemxpYiBjYW5ub3QKKyAgICAgICAgICAgICAqIHByb2Nlc3MgdGhlIGluZmxhdGUgY2FsbCgpIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgZGF0YS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHpzdC5hdmFpbF9vdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFpsaWJFcnJvciwgIkVycm9yICVpIHdoaWxlIGRlY29tcHJlc3NpbmcgZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICAgICAgaW5mbGF0ZUVuZCgmenN0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UoWl9PSyk6CisgICAgICAgICAgICAvKiBuZWVkIG1vcmUgbWVtb3J5ICovCisgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0X3N0ciwgcl9zdHJsZW4gPDwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaW5mbGF0ZUVuZCgmenN0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgenN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0X3N0cikgXAorICAgICAgICAgICAgICAgICsgcl9zdHJsZW47CisgICAgICAgICAgICB6c3QuYXZhaWxfb3V0ID0gcl9zdHJsZW47CisgICAgICAgICAgICByX3N0cmxlbiA9IHJfc3RybGVuIDw8IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGluZmxhdGVFbmQoJnpzdCk7CisgICAgICAgICAgICB6bGliX2Vycm9yKHpzdCwgZXJyLCAid2hpbGUgZGVjb21wcmVzc2luZyBkYXRhIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAgICAgfSB3aGlsZSAoZXJyICE9IFpfU1RSRUFNX0VORCk7CiAKICAgICBlcnIgPSBpbmZsYXRlRW5kKCZ6c3QpOwogICAgIGlmIChlcnIgIT0gWl9PSykgewotCXpsaWJfZXJyb3IoenN0LCBlcnIsICJ3aGlsZSBmaW5pc2hpbmcgZGF0YSBkZWNvbXByZXNzaW9uIik7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgemxpYl9lcnJvcih6c3QsIGVyciwgIndoaWxlIGZpbmlzaGluZyBkYXRhIGRlY29tcHJlc3Npb24iKTsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHRfc3RyLCB6c3QudG90YWxfb3V0KTsKQEAgLTI5NCwxMiArMjk0LDEyIEBACiAgICAgaW50IHdiaXRzPU1BWF9XQklUUywgbWVtTGV2ZWw9REVGX01FTV9MRVZFTCwgc3RyYXRlZ3k9MCwgZXJyOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aWlpaWk6Y29tcHJlc3NvYmoiLCAmbGV2ZWwsICZtZXRob2QsICZ3Yml0cywKLQkJCSAgJm1lbUxldmVsLCAmc3RyYXRlZ3kpKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVtTGV2ZWwsICZzdHJhdGVneSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgc2VsZiA9IG5ld2NvbXBvYmplY3QoJkNvbXB0eXBlKTsKICAgICBpZiAoc2VsZj09TlVMTCkKLQlyZXR1cm4oTlVMTCk7CisgICAgICAgIHJldHVybihOVUxMKTsKICAgICBzZWxmLT56c3QuemFsbG9jID0gKGFsbG9jX2Z1bmMpTlVMTDsKICAgICBzZWxmLT56c3QuemZyZWUgPSAoZnJlZV9mdW5jKVpfTlVMTDsKICAgICBzZWxmLT56c3QubmV4dF9pbiA9IE5VTEw7CkBAIC0zMDcsMjEgKzMwNywyMSBAQAogICAgIGVyciA9IGRlZmxhdGVJbml0Migmc2VsZi0+enN0LCBsZXZlbCwgbWV0aG9kLCB3Yml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KTsKICAgICBzd2l0Y2goZXJyKSB7CiAgICAgY2FzZSAoWl9PSyk6Ci0Jc2VsZi0+aXNfaW5pdGlhbGlzZWQgPSAxOwotCXJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKICAgICBjYXNlIChaX01FTV9FUlJPUik6Ci0JUHlfREVDUkVGKHNlbGYpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKLQkJCSJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbXByZXNzaW9uIG9iamVjdCIpOwotCXJldHVybiBOVUxMOwotICAgIGNhc2UoWl9TVFJFQU1fRVJST1IpOgotCVB5X0RFQ1JFRihzZWxmKTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkludmFsaWQgaW5pdGlhbGl6YXRpb24gb3B0aW9uIik7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgZGVmYXVsdDoKLQl6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgY3JlYXRpbmcgY29tcHJlc3Npb24gb2JqZWN0Iik7CiAgICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tcHJlc3Npb24gb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNhc2UoWl9TVFJFQU1fRVJST1IpOgorICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW52YWxpZCBpbml0aWFsaXphdGlvbiBvcHRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGVmYXVsdDoKKyAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGNyZWF0aW5nIGNvbXByZXNzaW9uIG9iamVjdCIpOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIH0KIApAQCAtMzMxLDExICszMzEsMTEgQEAKICAgICBpbnQgd2JpdHM9REVGX1dCSVRTLCBlcnI7CiAgICAgY29tcG9iamVjdCAqc2VsZjsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmRlY29tcHJlc3NvYmoiLCAmd2JpdHMpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHNlbGYgPSBuZXdjb21wb2JqZWN0KCZEZWNvbXB0eXBlKTsKICAgICBpZiAoc2VsZiA9PSBOVUxMKQotCXJldHVybihOVUxMKTsKKyAgICAgICAgcmV0dXJuKE5VTEwpOwogICAgIHNlbGYtPnpzdC56YWxsb2MgPSAoYWxsb2NfZnVuYylOVUxMOwogICAgIHNlbGYtPnpzdC56ZnJlZSA9IChmcmVlX2Z1bmMpWl9OVUxMOwogICAgIHNlbGYtPnpzdC5uZXh0X2luID0gTlVMTDsKQEAgLTM0MywyMSArMzQzLDIxIEBACiAgICAgZXJyID0gaW5mbGF0ZUluaXQyKCZzZWxmLT56c3QsIHdiaXRzKTsKICAgICBzd2l0Y2goZXJyKSB7CiAgICAgY2FzZSAoWl9PSyk6Ci0Jc2VsZi0+aXNfaW5pdGlhbGlzZWQgPSAxOwotCXJldHVybiAoUHlPYmplY3QqKXNlbGY7CisgICAgICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopc2VsZjsKICAgICBjYXNlKFpfU1RSRUFNX0VSUk9SKToKLQlQeV9ERUNSRUYoc2VsZik7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJJbnZhbGlkIGluaXRpYWxpemF0aW9uIG9wdGlvbiIpOwotCXJldHVybiBOVUxMOwotICAgIGNhc2UgKFpfTUVNX0VSUk9SKToKLQlQeV9ERUNSRUYoc2VsZik7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAotCQkJIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGVjb21wcmVzc2lvbiBvYmplY3QiKTsKLQlyZXR1cm4gTlVMTDsKLSAgICBkZWZhdWx0OgotCXpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJ3aGlsZSBjcmVhdGluZyBkZWNvbXByZXNzaW9uIG9iamVjdCIpOwogICAgICAgICBQeV9ERUNSRUYoc2VsZik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW52YWxpZCBpbml0aWFsaXphdGlvbiBvcHRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSAoWl9NRU1fRVJST1IpOgorICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRlY29tcHJlc3Npb24gb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRlZmF1bHQ6CisgICAgICAgIHpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJ3aGlsZSBjcmVhdGluZyBkZWNvbXByZXNzaW9uIG9iamVjdCIpOworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIH0KIApAQCAtMzY1LDcgKzM2NSw3IEBACiBDb21wX2RlYWxsb2MoY29tcG9iamVjdCAqc2VsZikKIHsKICAgICBpZiAoc2VsZi0+aXNfaW5pdGlhbGlzZWQpCi0JZGVmbGF0ZUVuZCgmc2VsZi0+enN0KTsKKyAgICAgICAgZGVmbGF0ZUVuZCgmc2VsZi0+enN0KTsKICAgICBQeV9YREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsKICAgICBQeV9YREVDUkVGKHNlbGYtPnVuY29uc3VtZWRfdGFpbCk7CiAgICAgUHlPYmplY3RfRGVsKHNlbGYpOwpAQCAtMzc1LDcgKzM3NSw3IEBACiBEZWNvbXBfZGVhbGxvYyhjb21wb2JqZWN0ICpzZWxmKQogewogICAgIGlmIChzZWxmLT5pc19pbml0aWFsaXNlZCkKLQlpbmZsYXRlRW5kKCZzZWxmLT56c3QpOworICAgICAgICBpbmZsYXRlRW5kKCZzZWxmLT56c3QpOwogICAgIFB5X1hERUNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOwogICAgIFB5X1hERUNSRUYoc2VsZi0+dW5jb25zdW1lZF90YWlsKTsKICAgICBQeU9iamVjdF9EZWwoc2VsZik7CkBAIC0zOTksMTAgKzM5OSwxMCBAQAogICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfdG90YWxfb3V0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpjb21wcmVzcyIsICZpbnB1dCwgJmlucGxlbikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKCEoUmV0VmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuZ3RoKSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgRU5URVJfWkxJQgogCkBAIC00MTksMTYgKzQxOSwxNiBAQAogICAgIC8qIHdoaWxlIFpfT0sgYW5kIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwsIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0LAogICAgICAgIHNvIGV4dGVuZCB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdHJ5IGFnYWluICovCiAgICAgd2hpbGUgKGVyciA9PSBaX09LICYmIHNlbGYtPnpzdC5hdmFpbF9vdXQgPT0gMCkgewotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZSZXRWYWwsIGxlbmd0aCA8PCAxKSA8IDApCi0JICAgIGdvdG8gZXJyb3I7Ci0Jc2VsZi0+enN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoUmV0VmFsKSBcCi0JICAgICsgbGVuZ3RoOwotCXNlbGYtPnpzdC5hdmFpbF9vdXQgPSBsZW5ndGg7Ci0JbGVuZ3RoID0gbGVuZ3RoIDw8IDE7CisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZSZXRWYWwsIGxlbmd0aCA8PCAxKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBzZWxmLT56c3QubmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhSZXRWYWwpIFwKKyAgICAgICAgICAgICsgbGVuZ3RoOworICAgICAgICBzZWxmLT56c3QuYXZhaWxfb3V0ID0gbGVuZ3RoOworICAgICAgICBsZW5ndGggPSBsZW5ndGggPDwgMTsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQllcnIgPSBkZWZsYXRlKCYoc2VsZi0+enN0KSwgWl9OT19GTFVTSCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBlcnIgPSBkZWZsYXRlKCYoc2VsZi0+enN0KSwgWl9OT19GTFVTSCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgfQogICAgIC8qIFdlIHdpbGwgb25seSBnZXQgWl9CVUZfRVJST1IgaWYgdGhlIG91dHB1dCBidWZmZXIgd2FzIGZ1bGwgYnV0CiAgICAgICAgdGhlcmUgd2Fzbid0IG1vcmUgb3V0cHV0IHdoZW4gd2UgdHJpZWQgYWdhaW4sIHNvIGl0IGlzIG5vdCBhbiBlcnJvcgpAQCAtNDM2LDEwICs0MzYsMTAgQEAKICAgICAqLwogCiAgICAgaWYgKGVyciAhPSBaX09LICYmIGVyciAhPSBaX0JVRl9FUlJPUikgewotCXpsaWJfZXJyb3Ioc2VsZi0+enN0LCBlcnIsICJ3aGlsZSBjb21wcmVzc2luZyIpOwotCVB5X0RFQ1JFRihSZXRWYWwpOwotCVJldFZhbCA9IE5VTEw7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGNvbXByZXNzaW5nIik7CisgICAgICAgIFB5X0RFQ1JFRihSZXRWYWwpOworICAgICAgICBSZXRWYWwgPSBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgICBfUHlTdHJpbmdfUmVzaXplKCZSZXRWYWwsIHNlbGYtPnpzdC50b3RhbF9vdXQgLSBzdGFydF90b3RhbF9vdXQpOwogCkBAIC00NjksMTkgKzQ2OSwxOSBAQAogICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfdG90YWxfb3V0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xpOmRlY29tcHJlc3MiLCAmaW5wdXQsCi0JCQkgICZpbnBsZW4sICZtYXhfbGVuZ3RoKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucGxlbiwgJm1heF9sZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAobWF4X2xlbmd0aCA8IDApIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJtYXhfbGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWF4X2xlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIC8qIGxpbWl0IGFtb3VudCBvZiBkYXRhIGFsbG9jYXRlZCB0byBtYXhfbGVuZ3RoICovCiAgICAgaWYgKG1heF9sZW5ndGggJiYgbGVuZ3RoID4gbWF4X2xlbmd0aCkKLQlsZW5ndGggPSBtYXhfbGVuZ3RoOworICAgICAgICBsZW5ndGggPSBtYXhfbGVuZ3RoOwogICAgIGlmICghKFJldFZhbCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbmd0aCkpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIEVOVEVSX1pMSUIKIApAQCAtNDk5LDQwICs0OTksNDAgQEAKICAgICAgICBTbyBleHRlbmQgdGhlIG91dHB1dCBidWZmZXIgYW5kIHRyeSBhZ2Fpbi4KICAgICAqLwogICAgIHdoaWxlIChlcnIgPT0gWl9PSyAmJiBzZWxmLT56c3QuYXZhaWxfb3V0ID09IDApIHsKLQkvKiBJZiBtYXhfbGVuZ3RoIHNldCwgZG9uJ3QgY29udGludWUgZGVjb21wcmVzc2luZyBpZiB3ZSd2ZSBhbHJlYWR5Ci0JICAgcmVhY2hlZCB0aGUgbGltaXQuCi0JKi8KLQlpZiAobWF4X2xlbmd0aCAmJiBsZW5ndGggPj0gbWF4X2xlbmd0aCkKLQkgICAgYnJlYWs7CisgICAgICAgIC8qIElmIG1heF9sZW5ndGggc2V0LCBkb24ndCBjb250aW51ZSBkZWNvbXByZXNzaW5nIGlmIHdlJ3ZlIGFscmVhZHkKKyAgICAgICAgICAgcmVhY2hlZCB0aGUgbGltaXQuCisgICAgICAgICovCisgICAgICAgIGlmIChtYXhfbGVuZ3RoICYmIGxlbmd0aCA+PSBtYXhfbGVuZ3RoKQorICAgICAgICAgICAgYnJlYWs7CiAKLQkvKiBvdGhlcndpc2UsIC4uLiAqLwotCW9sZF9sZW5ndGggPSBsZW5ndGg7Ci0JbGVuZ3RoID0gbGVuZ3RoIDw8IDE7Ci0JaWYgKG1heF9sZW5ndGggJiYgbGVuZ3RoID4gbWF4X2xlbmd0aCkKLQkgICAgbGVuZ3RoID0gbWF4X2xlbmd0aDsKKyAgICAgICAgLyogb3RoZXJ3aXNlLCAuLi4gKi8KKyAgICAgICAgb2xkX2xlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIDw8IDE7CisgICAgICAgIGlmIChtYXhfbGVuZ3RoICYmIGxlbmd0aCA+IG1heF9sZW5ndGgpCisgICAgICAgICAgICBsZW5ndGggPSBtYXhfbGVuZ3RoOwogCi0JaWYgKF9QeVN0cmluZ19SZXNpemUoJlJldFZhbCwgbGVuZ3RoKSA8IDApCi0JICAgIGdvdG8gZXJyb3I7Ci0Jc2VsZi0+enN0Lm5leHRfb3V0ID0gKHVuc2lnbmVkIGNoYXIgKilQeVN0cmluZ19BU19TVFJJTkcoUmV0VmFsKSBcCi0JICAgICsgb2xkX2xlbmd0aDsKLQlzZWxmLT56c3QuYXZhaWxfb3V0ID0gbGVuZ3RoIC0gb2xkX2xlbmd0aDsKKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJlJldFZhbCwgbGVuZ3RoKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBzZWxmLT56c3QubmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhSZXRWYWwpIFwKKyAgICAgICAgICAgICsgb2xkX2xlbmd0aDsKKyAgICAgICAgc2VsZi0+enN0LmF2YWlsX291dCA9IGxlbmd0aCAtIG9sZF9sZW5ndGg7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZXJyID0gaW5mbGF0ZSgmKHNlbGYtPnpzdCksIFpfU1lOQ19GTFVTSCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBlcnIgPSBpbmZsYXRlKCYoc2VsZi0+enN0KSwgWl9TWU5DX0ZMVVNIKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICB9CiAKICAgICAvKiBOb3QgYWxsIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgY291bGQgYmUgYWNjb21tb2RhdGVkIGluIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAgICAgb2Ygc3BlY2lmaWVkIHNpemUuIFJldHVybiB0aGUgdW5jb25zdW1lZCB0YWlsIGluIGFuIGF0dHJpYnV0ZS4qLwogICAgIGlmKG1heF9sZW5ndGgpIHsKLQlQeV9ERUNSRUYoc2VsZi0+dW5jb25zdW1lZF90YWlsKTsKLQlzZWxmLT51bmNvbnN1bWVkX3RhaWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPnpzdC5uZXh0X2luLAotCQkJCQkJCSAgIHNlbGYtPnpzdC5hdmFpbF9pbik7Ci0JaWYoIXNlbGYtPnVuY29uc3VtZWRfdGFpbCkgewotCSAgICBQeV9ERUNSRUYoUmV0VmFsKTsKLQkgICAgUmV0VmFsID0gTlVMTDsKLQkgICAgZ290byBlcnJvcjsKLQl9CisgICAgICAgIFB5X0RFQ1JFRihzZWxmLT51bmNvbnN1bWVkX3RhaWwpOworICAgICAgICBzZWxmLT51bmNvbnN1bWVkX3RhaWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPnpzdC5uZXh0X2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT56c3QuYXZhaWxfaW4pOworICAgICAgICBpZighc2VsZi0+dW5jb25zdW1lZF90YWlsKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoUmV0VmFsKTsKKyAgICAgICAgICAgIFJldFZhbCA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyogVGhlIGVuZCBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGhhcyBiZWVuIHJlYWNoZWQsIHNvIHNldCB0aGUKQEAgLTU0MiwyMiArNTQyLDIyIEBACiAgICAgICAgcHJlc2VydmVkLgogICAgICovCiAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQpIHsKLQlQeV9YREVDUkVGKHNlbGYtPnVudXNlZF9kYXRhKTsgIC8qIEZyZWUgb3JpZ2luYWwgZW1wdHkgc3RyaW5nICovCi0Jc2VsZi0+dW51c2VkX2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkgICAgKGNoYXIgKilzZWxmLT56c3QubmV4dF9pbiwgc2VsZi0+enN0LmF2YWlsX2luKTsKLQlpZiAoc2VsZi0+dW51c2VkX2RhdGEgPT0gTlVMTCkgewotCSAgICBQeV9ERUNSRUYoUmV0VmFsKTsKLQkgICAgZ290byBlcnJvcjsKLQl9Ci0JLyogV2Ugd2lsbCBvbmx5IGdldCBaX0JVRl9FUlJPUiBpZiB0aGUgb3V0cHV0IGJ1ZmZlciB3YXMgZnVsbAotCSAgIGJ1dCB0aGVyZSB3YXNuJ3QgbW9yZSBvdXRwdXQgd2hlbiB3ZSB0cmllZCBhZ2Fpbiwgc28gaXQgaXMKLQkgICBub3QgYW4gZXJyb3IgY29uZGl0aW9uLgotCSovCisgICAgICAgIFB5X1hERUNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOyAgLyogRnJlZSBvcmlnaW5hbCBlbXB0eSBzdHJpbmcgKi8KKyAgICAgICAgc2VsZi0+dW51c2VkX2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgICAgIChjaGFyICopc2VsZi0+enN0Lm5leHRfaW4sIHNlbGYtPnpzdC5hdmFpbF9pbik7CisgICAgICAgIGlmIChzZWxmLT51bnVzZWRfZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoUmV0VmFsKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgLyogV2Ugd2lsbCBvbmx5IGdldCBaX0JVRl9FUlJPUiBpZiB0aGUgb3V0cHV0IGJ1ZmZlciB3YXMgZnVsbAorICAgICAgICAgICBidXQgdGhlcmUgd2Fzbid0IG1vcmUgb3V0cHV0IHdoZW4gd2UgdHJpZWQgYWdhaW4sIHNvIGl0IGlzCisgICAgICAgICAgIG5vdCBhbiBlcnJvciBjb25kaXRpb24uCisgICAgICAgICovCiAgICAgfSBlbHNlIGlmIChlcnIgIT0gWl9PSyAmJiBlcnIgIT0gWl9CVUZfRVJST1IpIHsKLQl6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgZGVjb21wcmVzc2luZyIpOwotCVB5X0RFQ1JFRihSZXRWYWwpOwotCVJldFZhbCA9IE5VTEw7Ci0JZ290byBlcnJvcjsKKyAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGRlY29tcHJlc3NpbmciKTsKKyAgICAgICAgUHlfREVDUkVGKFJldFZhbCk7CisgICAgICAgIFJldFZhbCA9IE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmUmV0VmFsLCBzZWxmLT56c3QudG90YWxfb3V0IC0gc3RhcnRfdG90YWxfb3V0KTsKQEAgLTU4NSwxNiArNTg1LDE2IEBACiAgICAgdW5zaWduZWQgbG9uZyBzdGFydF90b3RhbF9vdXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmZsdXNoIiwgJmZsdXNobW9kZSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogRmx1c2hpbmcgd2l0aCBaX05PX0ZMVVNIIGlzIGEgbm8tb3AsIHNvIHRoZXJlJ3Mgbm8gcG9pbnQgaW4KICAgICAgICBkb2luZyBhbnkgd29yayBhdCBhbGw7IGp1c3QgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4gKi8KICAgICBpZiAoZmx1c2htb2RlID09IFpfTk9fRkxVU0gpIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKICAgICB9CiAKICAgICBpZiAoIShSZXRWYWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW5ndGgpKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBFTlRFUl9aTElCCiAKQEAgLTYxMCw0MSArNjEwLDQxIEBACiAgICAgLyogd2hpbGUgWl9PSyBhbmQgdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCwgdGhlcmUgbWlnaHQgYmUgbW9yZSBvdXRwdXQsCiAgICAgICAgc28gZXh0ZW5kIHRoZSBvdXRwdXQgYnVmZmVyIGFuZCB0cnkgYWdhaW4gKi8KICAgICB3aGlsZSAoZXJyID09IFpfT0sgJiYgc2VsZi0+enN0LmF2YWlsX291dCA9PSAwKSB7Ci0JaWYgKF9QeVN0cmluZ19SZXNpemUoJlJldFZhbCwgbGVuZ3RoIDw8IDEpIDwgMCkKLQkgICAgZ290byBlcnJvcjsKLQlzZWxmLT56c3QubmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyhSZXRWYWwpIFwKLQkgICAgKyBsZW5ndGg7Ci0Jc2VsZi0+enN0LmF2YWlsX291dCA9IGxlbmd0aDsKLQlsZW5ndGggPSBsZW5ndGggPDwgMTsKKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJlJldFZhbCwgbGVuZ3RoIDw8IDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHNlbGYtPnpzdC5uZXh0X291dCA9ICh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKFJldFZhbCkgXAorICAgICAgICAgICAgKyBsZW5ndGg7CisgICAgICAgIHNlbGYtPnpzdC5hdmFpbF9vdXQgPSBsZW5ndGg7CisgICAgICAgIGxlbmd0aCA9IGxlbmd0aCA8PCAxOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWVyciA9IGRlZmxhdGUoJihzZWxmLT56c3QpLCBmbHVzaG1vZGUpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZXJyID0gZGVmbGF0ZSgmKHNlbGYtPnpzdCksIGZsdXNobW9kZSk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgfQogCiAgICAgLyogSWYgZmx1c2htb2RlIGlzIFpfRklOSVNILCB3ZSBhbHNvIGhhdmUgdG8gY2FsbCBkZWZsYXRlRW5kKCkgdG8gZnJlZQogICAgICAgIHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzLiBOb3RlIHdlIHNob3VsZCBvbmx5IGdldCBaX1NUUkVBTV9FTkQgd2hlbgogICAgICAgIGZsdXNobW9kZSBpcyBaX0ZJTklTSCwgYnV0IGNoZWNraW5nIGJvdGggZm9yIHNhZmV0eSovCiAgICAgaWYgKGVyciA9PSBaX1NUUkVBTV9FTkQgJiYgZmx1c2htb2RlID09IFpfRklOSVNIKSB7Ci0JZXJyID0gZGVmbGF0ZUVuZCgmKHNlbGYtPnpzdCkpOwotCWlmIChlcnIgIT0gWl9PSykgewotCSAgICB6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAiZnJvbSBkZWZsYXRlRW5kKCkiKTsKLQkgICAgUHlfREVDUkVGKFJldFZhbCk7Ci0JICAgIFJldFZhbCA9IE5VTEw7Ci0JICAgIGdvdG8gZXJyb3I7Ci0JfQotCWVsc2UKLQkgICAgc2VsZi0+aXNfaW5pdGlhbGlzZWQgPSAwOworICAgICAgICBlcnIgPSBkZWZsYXRlRW5kKCYoc2VsZi0+enN0KSk7CisgICAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICAgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgImZyb20gZGVmbGF0ZUVuZCgpIik7CisgICAgICAgICAgICBQeV9ERUNSRUYoUmV0VmFsKTsKKyAgICAgICAgICAgIFJldFZhbCA9IE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMDsKIAotCS8qIFdlIHdpbGwgb25seSBnZXQgWl9CVUZfRVJST1IgaWYgdGhlIG91dHB1dCBidWZmZXIgd2FzIGZ1bGwKLQkgICBidXQgdGhlcmUgd2Fzbid0IG1vcmUgb3V0cHV0IHdoZW4gd2UgdHJpZWQgYWdhaW4sIHNvIGl0IGlzCi0JICAgbm90IGFuIGVycm9yIGNvbmRpdGlvbi4KLQkqLworICAgICAgICAvKiBXZSB3aWxsIG9ubHkgZ2V0IFpfQlVGX0VSUk9SIGlmIHRoZSBvdXRwdXQgYnVmZmVyIHdhcyBmdWxsCisgICAgICAgICAgIGJ1dCB0aGVyZSB3YXNuJ3QgbW9yZSBvdXRwdXQgd2hlbiB3ZSB0cmllZCBhZ2Fpbiwgc28gaXQgaXMKKyAgICAgICAgICAgbm90IGFuIGVycm9yIGNvbmRpdGlvbi4KKyAgICAgICAgKi8KICAgICB9IGVsc2UgaWYgKGVyciE9Wl9PSyAmJiBlcnIhPVpfQlVGX0VSUk9SKSB7Ci0JemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgIndoaWxlIGZsdXNoaW5nIik7Ci0JUHlfREVDUkVGKFJldFZhbCk7Ci0JUmV0VmFsID0gTlVMTDsKLQlnb3RvIGVycm9yOworICAgICAgICB6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAid2hpbGUgZmx1c2hpbmciKTsKKyAgICAgICAgUHlfREVDUkVGKFJldFZhbCk7CisgICAgICAgIFJldFZhbCA9IE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmUmV0VmFsLCBzZWxmLT56c3QudG90YWxfb3V0IC0gc3RhcnRfdG90YWxfb3V0KTsKQEAgLTc3NCwxMyArNzc0LDEzIEBACiAgICAgdW5zaWduZWQgbG9uZyBzdGFydF90b3RhbF9vdXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmZsdXNoIiwgJmxlbmd0aCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChsZW5ndGggPD0gMCkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibGVuZ3RoIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKCEocmV0dmFsID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuZ3RoKSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAKICAgICBFTlRFUl9aTElCCkBAIC03OTYsMjkgKzc5NiwyOSBAQAogICAgIC8qIHdoaWxlIFpfT0sgYW5kIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwsIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0LAogICAgICAgIHNvIGV4dGVuZCB0aGUgb3V0cHV0IGJ1ZmZlciBhbmQgdHJ5IGFnYWluICovCiAgICAgd2hpbGUgKChlcnIgPT0gWl9PSyB8fCBlcnIgPT0gWl9CVUZfRVJST1IpICYmIHNlbGYtPnpzdC5hdmFpbF9vdXQgPT0gMCkgewotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXR2YWwsIGxlbmd0aCA8PCAxKSA8IDApCi0JICAgIGdvdG8gZXJyb3I7Ci0Jc2VsZi0+enN0Lm5leHRfb3V0ID0gKEJ5dGUgKilQeVN0cmluZ19BU19TVFJJTkcocmV0dmFsKSArIGxlbmd0aDsKLQlzZWxmLT56c3QuYXZhaWxfb3V0ID0gbGVuZ3RoOwotCWxlbmd0aCA9IGxlbmd0aCA8PCAxOworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0dmFsLCBsZW5ndGggPDwgMSkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgc2VsZi0+enN0Lm5leHRfb3V0ID0gKEJ5dGUgKilQeVN0cmluZ19BU19TVFJJTkcocmV0dmFsKSArIGxlbmd0aDsKKyAgICAgICAgc2VsZi0+enN0LmF2YWlsX291dCA9IGxlbmd0aDsKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3RoIDw8IDE7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZXJyID0gaW5mbGF0ZSgmKHNlbGYtPnpzdCksIFpfRklOSVNIKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGVyciA9IGluZmxhdGUoJihzZWxmLT56c3QpLCBaX0ZJTklTSCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgfQogCiAgICAgLyogSWYgZmx1c2htb2RlIGlzIFpfRklOSVNILCB3ZSBhbHNvIGhhdmUgdG8gY2FsbCBkZWZsYXRlRW5kKCkgdG8gZnJlZQogICAgICAgIHZhcmlvdXMgZGF0YSBzdHJ1Y3R1cmVzLiBOb3RlIHdlIHNob3VsZCBvbmx5IGdldCBaX1NUUkVBTV9FTkQgd2hlbgogICAgICAgIGZsdXNobW9kZSBpcyBaX0ZJTklTSCAqLwogICAgIGlmIChlcnIgPT0gWl9TVFJFQU1fRU5EKSB7Ci0JZXJyID0gaW5mbGF0ZUVuZCgmKHNlbGYtPnpzdCkpOworICAgICAgICBlcnIgPSBpbmZsYXRlRW5kKCYoc2VsZi0+enN0KSk7CiAgICAgICAgIHNlbGYtPmlzX2luaXRpYWxpc2VkID0gMDsKLQlpZiAoZXJyICE9IFpfT0spIHsKLQkgICAgemxpYl9lcnJvcihzZWxmLT56c3QsIGVyciwgImZyb20gaW5mbGF0ZUVuZCgpIik7Ci0JICAgIFB5X0RFQ1JFRihyZXR2YWwpOwotCSAgICByZXR2YWwgPSBOVUxMOwotCSAgICBnb3RvIGVycm9yOwotCX0KKyAgICAgICAgaWYgKGVyciAhPSBaX09LKSB7CisgICAgICAgICAgICB6bGliX2Vycm9yKHNlbGYtPnpzdCwgZXJyLCAiZnJvbSBpbmZsYXRlRW5kKCkiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KICAgICB9CiAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0dmFsLCBzZWxmLT56c3QudG90YWxfb3V0IC0gc3RhcnRfdG90YWxfb3V0KTsKIApAQCAtODcyLDEzICs4NzIsMTMgQEAKICAgICBFTlRFUl9aTElCCiAKICAgICBpZiAoc3RyY21wKG5hbWUsICJ1bnVzZWRfZGF0YSIpID09IDApIHsKLQlQeV9JTkNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOwotCXJldHZhbCA9IHNlbGYtPnVudXNlZF9kYXRhOworICAgICAgICBQeV9JTkNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOworICAgICAgICByZXR2YWwgPSBzZWxmLT51bnVzZWRfZGF0YTsKICAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAidW5jb25zdW1lZF90YWlsIikgPT0gMCkgewotCVB5X0lOQ1JFRihzZWxmLT51bmNvbnN1bWVkX3RhaWwpOwotCXJldHZhbCA9IHNlbGYtPnVuY29uc3VtZWRfdGFpbDsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnVuY29uc3VtZWRfdGFpbCk7CisgICAgICAgIHJldHZhbCA9IHNlbGYtPnVuY29uc3VtZWRfdGFpbDsKICAgICB9IGVsc2UKLQlyZXR2YWwgPSBQeV9GaW5kTWV0aG9kKERlY29tcF9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICAgICAgcmV0dmFsID0gUHlfRmluZE1ldGhvZChEZWNvbXBfbWV0aG9kcywgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiAKICAgICBMRUFWRV9aTElCCiAKQEAgLTg5OSw3ICs4OTksNyBAQAogICAgIGludCBsZW4sIHNpZ25lZF92YWw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfEk6YWRsZXIzMiIsICZidWYsICZsZW4sICZhZGxlcjMydmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgLyogSW4gUHl0aG9uIDIueCB3ZSByZXR1cm4gYSBzaWduZWQgaW50ZWdlciByZWdhcmRsZXNzIG9mIG5hdGl2ZSBwbGF0Zm9ybQogICAgICAqIGxvbmcgc2l6ZSAodGhlIDMyYml0IHVuc2lnbmVkIGxvbmcgaXMgdHJlYXRlZCBhcyAzMi1iaXQgc2lnbmVkIGFuZCBzaWduCiAgICAgICogZXh0ZW5kZWQgaW50byBhIDY0LWJpdCBsb25nIGluc2lkZSB0aGUgaW50ZWdlciBvYmplY3QpLiAgMy4wIGRvZXMgdGhlCkBAIC05MjIsNyArOTIyLDcgQEAKICAgICBpbnQgbGVuLCBzaWduZWRfdmFsOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xJOmNyYzMyIiwgJmJ1ZiwgJmxlbiwgJmNyYzMydmFsKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgLyogSW4gUHl0aG9uIDIueCB3ZSByZXR1cm4gYSBzaWduZWQgaW50ZWdlciByZWdhcmRsZXNzIG9mIG5hdGl2ZSBwbGF0Zm9ybQogICAgICAqIGxvbmcgc2l6ZSAodGhlIDMyYml0IHVuc2lnbmVkIGxvbmcgaXMgdHJlYXRlZCBhcyAzMi1iaXQgc2lnbmVkIGFuZCBzaWduCiAgICAgICogZXh0ZW5kZWQgaW50byBhIDY0LWJpdCBsb25nIGluc2lkZSB0aGUgaW50ZWdlciBvYmplY3QpLiAgMy4wIGRvZXMgdGhlCkBAIC0xMDAzLDE1ICsxMDAzLDE1IEBACiAgICAgUHlfVFlQRSgmQ29tcHR5cGUpID0gJlB5VHlwZV9UeXBlOwogICAgIFB5X1RZUEUoJkRlY29tcHR5cGUpID0gJlB5VHlwZV9UeXBlOwogICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgiemxpYiIsIHpsaWJfbWV0aG9kcywKLQkJICAgICAgIHpsaWJfbW9kdWxlX2RvY3VtZW50YXRpb24sCi0JCSAgICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgemxpYl9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CiAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIFpsaWJFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbigiemxpYi5lcnJvciIsIE5VTEwsIE5VTEwpOwogICAgIGlmIChabGliRXJyb3IgIT0gTlVMTCkgewogICAgICAgICBQeV9JTkNSRUYoWmxpYkVycm9yKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgImVycm9yIiwgWmxpYkVycm9yKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFpsaWJFcnJvcik7CiAgICAgfQogICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNQVhfV0JJVFMiLCBNQVhfV0JJVFMpOwogICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJERUZMQVRFRCIsIERFRkxBVEVEKTsKQEAgLTEwMzAsNyArMTAzMCw3IEBACiAKICAgICB2ZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFpMSUJfVkVSU0lPTik7CiAgICAgaWYgKHZlciAhPSBOVUxMKQotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiWkxJQl9WRVJTSU9OIiwgdmVyKTsKKyAgICAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJaTElCX1ZFUlNJT04iLCB2ZXIpOwogCiAgICAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fdmVyc2lvbl9fIiwgIjEuMCIpOwogCmRpZmYgLS1naXQgYS9PYmplY3RzL2Fic3RyYWN0LmMgYi9PYmplY3RzL2Fic3RyYWN0LmMKaW5kZXggMjJhNzJlMS4uZDUzYjE3ZiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9hYnN0cmFjdC5jCisrKyBiL09iamVjdHMvYWJzdHJhY3QuYwpAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlICJsb25naW50cmVwci5oIgogCiAjZGVmaW5lIE5FV19TVFlMRV9OVU1CRVIobykgUHlUeXBlX0hhc0ZlYXR1cmUoKG8pLT5vYl90eXBlLCBcCi0JCQkJUHlfVFBGTEFHU19DSEVDS1RZUEVTKQorICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykKIAogCiAvKiBTaG9ydGhhbmRzIHRvIHJldHVybiBjZXJ0YWluIGVycm9ycyAqLwpAQCAtMTQsMTcgKzE0LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9lcnJvcihjb25zdCBjaGFyICptc2csIFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgbXNnLCBvYmotPm9iX3R5cGUtPnRwX25hbWUpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIG1zZywgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG51bGxfZXJyb3Iodm9pZCkKIHsKLQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkibnVsbCBhcmd1bWVudCB0byBpbnRlcm5hbCByb3V0aW5lIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBhcmd1bWVudCB0byBpbnRlcm5hbCByb3V0aW5lIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIE9wZXJhdGlvbnMgb24gYW55IG9iamVjdCAqLwpAQCAtMzIsNTMgKzMyLDUzIEBACiBpbnQKIFB5T2JqZWN0X0NtcChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwgaW50ICpyZXN1bHQpCiB7Ci0JaW50IHI7CisgICAgaW50IHI7CiAKLQlpZiAobzEgPT0gTlVMTCB8fCBvMiA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyID0gUHlPYmplY3RfQ29tcGFyZShvMSwgbzIpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JKnJlc3VsdCA9IHI7Ci0JcmV0dXJuIDA7CisgICAgaWYgKG8xID09IE5VTEwgfHwgbzIgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgciA9IFB5T2JqZWN0X0NvbXBhcmUobzEsIG8yKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpyZXN1bHQgPSByOworICAgIHJldHVybiAwOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9UeXBlKFB5T2JqZWN0ICpvKQogewotCVB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQl2ID0gKFB5T2JqZWN0ICopby0+b2JfdHlwZTsKLQlQeV9JTkNSRUYodik7Ci0JcmV0dXJuIHY7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICB2ID0gKFB5T2JqZWN0ICopby0+b2JfdHlwZTsKKyAgICBQeV9JTkNSRUYodik7CisgICAgcmV0dXJuIHY7CiB9CiAKIFB5X3NzaXplX3QKIFB5T2JqZWN0X1NpemUoUHlPYmplY3QgKm8pCiB7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKm07CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAobyA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW0gPSBvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9sZW5ndGgpCi0JCXJldHVybiBtLT5zcV9sZW5ndGgobyk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX2xlbmd0aCkKKyAgICAgICAgcmV0dXJuIG0tPnNxX2xlbmd0aChvKTsKIAotCXJldHVybiBQeU1hcHBpbmdfU2l6ZShvKTsKKyAgICByZXR1cm4gUHlNYXBwaW5nX1NpemUobyk7CiB9CiAKICN1bmRlZiBQeU9iamVjdF9MZW5ndGgKIFB5X3NzaXplX3QKIFB5T2JqZWN0X0xlbmd0aChQeU9iamVjdCAqbykKIHsKLQlyZXR1cm4gUHlPYmplY3RfU2l6ZShvKTsKKyAgICByZXR1cm4gUHlPYmplY3RfU2l6ZShvKTsKIH0KICNkZWZpbmUgUHlPYmplY3RfTGVuZ3RoIFB5T2JqZWN0X1NpemUKIApAQCAtOTIsMjYzICs5MiwyNjMgQEAKIFB5X3NzaXplX3QKIF9QeU9iamVjdF9MZW5ndGhIaW50KFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGRlZmF1bHR2YWx1ZSkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmhpbnRzdHJvYmogPSBOVUxMOwotCVB5T2JqZWN0ICpybzsKLQlQeV9zc2l6ZV90IHJ2OworICAgIHN0YXRpYyBQeU9iamVjdCAqaGludHN0cm9iaiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJvOworICAgIFB5X3NzaXplX3QgcnY7CiAKLQkvKiB0cnkgby5fX2xlbl9fKCkgKi8KLQlydiA9IFB5T2JqZWN0X1NpemUobyk7Ci0JaWYgKHJ2ID49IDApCi0JCXJldHVybiBydjsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSAmJgotCQkJIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiAtMTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQl9CisgICAgLyogdHJ5IG8uX19sZW5fXygpICovCisgICAgcnYgPSBQeU9iamVjdF9TaXplKG8pOworICAgIGlmIChydiA+PSAwKQorICAgICAgICByZXR1cm4gcnY7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikgJiYKKyAgICAgICAgICAgICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQogCi0JLyogY2FjaGUgYSBoYXNoZWQgdmVyc2lvbiBvZiB0aGUgYXR0cmlidXRlIHN0cmluZyAqLwotCWlmIChoaW50c3Ryb2JqID09IE5VTEwpIHsKLQkJaGludHN0cm9iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbGVuZ3RoX2hpbnRfXyIpOwotCQlpZiAoaGludHN0cm9iaiA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBjYWNoZSBhIGhhc2hlZCB2ZXJzaW9uIG9mIHRoZSBhdHRyaWJ1dGUgc3RyaW5nICovCisgICAgaWYgKGhpbnRzdHJvYmogPT0gTlVMTCkgeworICAgICAgICBoaW50c3Ryb2JqID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19sZW5ndGhfaGludF9fIik7CisgICAgICAgIGlmIChoaW50c3Ryb2JqID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogdHJ5IG8uX19sZW5ndGhfaGludF9fKCkgKi8KLQlybyA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKG8sIGhpbnRzdHJvYmosIE5VTEwpOwotCWlmIChybyA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpICYmCi0JCQkhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJcmV0dXJuIC0xOwotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gZGVmYXVsdHZhbHVlOwotCX0KLQlydiA9IFB5TG9uZ19DaGVjayhybykgPyBQeUxvbmdfQXNTc2l6ZV90KHJvKSA6IGRlZmF1bHR2YWx1ZTsKLQlQeV9ERUNSRUYocm8pOwotCXJldHVybiBydjsKKyAgICAvKiB0cnkgby5fX2xlbmd0aF9oaW50X18oKSAqLworICAgIHJvID0gUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MobywgaGludHN0cm9iaiwgTlVMTCk7CisgICAgaWYgKHJvID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikgJiYKKyAgICAgICAgICAgICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBkZWZhdWx0dmFsdWU7CisgICAgfQorICAgIHJ2ID0gUHlMb25nX0NoZWNrKHJvKSA/IFB5TG9uZ19Bc1NzaXplX3Qocm8pIDogZGVmYXVsdHZhbHVlOworICAgIFB5X0RFQ1JFRihybyk7CisgICAgcmV0dXJuIHJ2OwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9HZXRJdGVtKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqa2V5KQogewotCVB5TWFwcGluZ01ldGhvZHMgKm07CisgICAgUHlNYXBwaW5nTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwgfHwga2V5ID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKG8gPT0gTlVMTCB8fCBrZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOwotCWlmIChtICYmIG0tPm1wX3N1YnNjcmlwdCkKLQkJcmV0dXJuIG0tPm1wX3N1YnNjcmlwdChvLCBrZXkpOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOworICAgIGlmIChtICYmIG0tPm1wX3N1YnNjcmlwdCkKKyAgICAgICAgcmV0dXJuIG0tPm1wX3N1YnNjcmlwdChvLCBrZXkpOwogCi0JaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlKSB7Ci0JCWlmIChQeUluZGV4X0NoZWNrKGtleSkpIHsKLQkJCVB5X3NzaXplX3Qga2V5X3ZhbHVlOwotCQkJa2V5X3ZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGtleSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCQlpZiAoa2V5X3ZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlyZXR1cm4gUHlTZXF1ZW5jZV9HZXRJdGVtKG8sIGtleV92YWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0pCi0JCQlyZXR1cm4gdHlwZV9lcnJvcigic2VxdWVuY2UgaW5kZXggbXVzdCAiCi0JCQkJCSAgImJlIGludGVnZXIsIG5vdCAnJS4yMDBzJyIsIGtleSk7Ci0JfQorICAgIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSkgeworICAgICAgICBpZiAoUHlJbmRleF9DaGVjayhrZXkpKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGtleV92YWx1ZTsKKyAgICAgICAgICAgIGtleV92YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdChrZXksIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICAgICAgaWYgKGtleV92YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIFB5U2VxdWVuY2VfR2V0SXRlbShvLCBrZXlfdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKQorICAgICAgICAgICAgcmV0dXJuIHR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIGludGVnZXIsIG5vdCAnJS4yMDBzJyIsIGtleSk7CisgICAgfQogCi0JcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBpcyB1bnN1YnNjcmlwdGFibGUiLCBvKTsKKyAgICByZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGlzIHVuc3Vic2NyaXB0YWJsZSIsIG8pOwogfQogCiBpbnQKIFB5T2JqZWN0X1NldEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU1hcHBpbmdNZXRob2RzICptOworICAgIFB5TWFwcGluZ01ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMIHx8IHZhbHVlID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOwotCWlmIChtICYmIG0tPm1wX2Fzc19zdWJzY3JpcHQpCi0JCXJldHVybiBtLT5tcF9hc3Nfc3Vic2NyaXB0KG8sIGtleSwgdmFsdWUpOworICAgIGlmIChvID09IE5VTEwgfHwga2V5ID09IE5VTEwgfHwgdmFsdWUgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmc7CisgICAgaWYgKG0gJiYgbS0+bXBfYXNzX3N1YnNjcmlwdCkKKyAgICAgICAgcmV0dXJuIG0tPm1wX2Fzc19zdWJzY3JpcHQobywga2V5LCB2YWx1ZSk7CiAKLQlpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UpIHsKLQkJaWYgKFB5SW5kZXhfQ2hlY2soa2V5KSkgewotCQkJUHlfc3NpemVfdCBrZXlfdmFsdWU7Ci0JCQlrZXlfdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3Qoa2V5LCBQeUV4Y19JbmRleEVycm9yKTsKLQkJCWlmIChrZXlfdmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gUHlTZXF1ZW5jZV9TZXRJdGVtKG8sIGtleV92YWx1ZSwgdmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9hc3NfaXRlbSkgewotCQkJdHlwZV9lcnJvcigic2VxdWVuY2UgaW5kZXggbXVzdCBiZSAiCi0JCQkJICAgImludGVnZXIsIG5vdCAnJS4yMDBzJyIsIGtleSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlKSB7CisgICAgICAgIGlmIChQeUluZGV4X0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qga2V5X3ZhbHVlOworICAgICAgICAgICAga2V5X3ZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGtleSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgICAgICBpZiAoa2V5X3ZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIFB5U2VxdWVuY2VfU2V0SXRlbShvLCBrZXlfdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfYXNzX2l0ZW0pIHsKKyAgICAgICAgICAgIHR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlciwgbm90ICclLjIwMHMnIiwga2V5KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCXR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCIsIG8pOwotCXJldHVybiAtMTsKKyAgICB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQiLCBvKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIGludAogUHlPYmplY3RfRGVsSXRlbShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSkKIHsKLQlQeU1hcHBpbmdNZXRob2RzICptOworICAgIFB5TWFwcGluZ01ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZzsKLQlpZiAobSAmJiBtLT5tcF9hc3Nfc3Vic2NyaXB0KQotCQlyZXR1cm4gbS0+bXBfYXNzX3N1YnNjcmlwdChvLCBrZXksIChQeU9iamVjdCopTlVMTCk7CisgICAgaWYgKG8gPT0gTlVMTCB8fCBrZXkgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmc7CisgICAgaWYgKG0gJiYgbS0+bXBfYXNzX3N1YnNjcmlwdCkKKyAgICAgICAgcmV0dXJuIG0tPm1wX2Fzc19zdWJzY3JpcHQobywga2V5LCAoUHlPYmplY3QqKU5VTEwpOwogCi0JaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlKSB7Ci0JCWlmIChQeUluZGV4X0NoZWNrKGtleSkpIHsKLQkJCVB5X3NzaXplX3Qga2V5X3ZhbHVlOwotCQkJa2V5X3ZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGtleSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCQlpZiAoa2V5X3ZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIFB5U2VxdWVuY2VfRGVsSXRlbShvLCBrZXlfdmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9hc3NfaXRlbSkgewotCQkJdHlwZV9lcnJvcigic2VxdWVuY2UgaW5kZXggbXVzdCBiZSAiCi0JCQkJICAgImludGVnZXIsIG5vdCAnJS4yMDBzJyIsIGtleSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlKSB7CisgICAgICAgIGlmIChQeUluZGV4X0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qga2V5X3ZhbHVlOworICAgICAgICAgICAga2V5X3ZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGtleSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgICAgICBpZiAoa2V5X3ZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIFB5U2VxdWVuY2VfRGVsSXRlbShvLCBrZXlfdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9hc3NfaXRlbSkgeworICAgICAgICAgICAgdHlwZV9lcnJvcigic2VxdWVuY2UgaW5kZXggbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyLCBub3QgJyUuMjAwcyciLCBrZXkpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIsIG8pOwotCXJldHVybiAtMTsKKyAgICB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIiwgbyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBpbnQKIFB5T2JqZWN0X0RlbEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSkKIHsKLQlQeU9iamVjdCAqb2tleTsKLQlpbnQgcmV0OworICAgIFB5T2JqZWN0ICpva2V5OworICAgIGludCByZXQ7CiAKLQlpZiAobyA9PSBOVUxMIHx8IGtleSA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlva2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOwotCWlmIChva2V5ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXQgPSBQeU9iamVjdF9EZWxJdGVtKG8sIG9rZXkpOwotCVB5X0RFQ1JFRihva2V5KTsKLQlyZXR1cm4gcmV0OworICAgIGlmIChvID09IE5VTEwgfHwga2V5ID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG9rZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7CisgICAgaWYgKG9rZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldCA9IFB5T2JqZWN0X0RlbEl0ZW0obywgb2tleSk7CisgICAgUHlfREVDUkVGKG9rZXkpOworICAgIHJldHVybiByZXQ7CiB9CiAKIGludAogUHlPYmplY3RfQXNDaGFyQnVmZmVyKFB5T2JqZWN0ICpvYmosCi0JCQkgIGNvbnN0IGNoYXIgKipidWZmZXIsCi0JCQkgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGI7Ci0JY2hhciAqcHA7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlCdWZmZXJQcm9jcyAqcGI7CisgICAgY2hhciAqcHA7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlpZiAob2JqID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyX2xlbiA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCWlmIChwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0Y2hhcmJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleHBlY3RlZCBhIGNoYXJhY3RlciBidWZmZXIgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCgqcGItPmJmX2dldHNlZ2NvdW50KShvYmosTlVMTCkgIT0gMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJleHBlY3RlZCBhIHNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlsZW4gPSAoKnBiLT5iZl9nZXRjaGFyYnVmZmVyKShvYmosIDAsICZwcCk7Ci0JaWYgKGxlbiA8IDApCi0JCXJldHVybiAtMTsKLQkqYnVmZmVyID0gcHA7Ci0JKmJ1ZmZlcl9sZW4gPSBsZW47Ci0JcmV0dXJuIDA7CisgICAgaWYgKG9iaiA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlcl9sZW4gPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcGIgPSBvYmotPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICBpZiAocGIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldGNoYXJidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBhIGNoYXJhY3RlciBidWZmZXIgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCgqcGItPmJmX2dldHNlZ2NvdW50KShvYmosTlVMTCkgIT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGxlbiA9ICgqcGItPmJmX2dldGNoYXJidWZmZXIpKG9iaiwgMCwgJnBwKTsKKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpidWZmZXIgPSBwcDsKKyAgICAqYnVmZmVyX2xlbiA9IGxlbjsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaikKIHsKLQlQeUJ1ZmZlclByb2NzICpwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gb2JqLT5vYl90eXBlLT50cF9hc19idWZmZXI7CiAKLQlpZiAocGIgPT0gTlVMTCB8fAotCSAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMIHx8Ci0JICAgICgqcGItPmJmX2dldHNlZ2NvdW50KShvYmosIE5VTEwpICE9IDEpCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgIGlmIChwYiA9PSBOVUxMIHx8CisgICAgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgfHwKKyAgICAgICAgKCpwYi0+YmZfZ2V0c2VnY291bnQpKG9iaiwgTlVMTCkgIT0gMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludCBQeU9iamVjdF9Bc1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaiwKLQkJCSAgY29uc3Qgdm9pZCAqKmJ1ZmZlciwKLQkJCSAgUHlfc3NpemVfdCAqYnVmZmVyX2xlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqYnVmZmVyX2xlbikKIHsKLQlQeUJ1ZmZlclByb2NzICpwYjsKLQl2b2lkICpwcDsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeUJ1ZmZlclByb2NzICpwYjsKKyAgICB2b2lkICpwcDsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmIChvYmogPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCB8fCBidWZmZXJfbGVuID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXBiID0gb2JqLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JaWYgKHBiID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImV4cGVjdGVkIGEgcmVhZGFibGUgYnVmZmVyIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkob2JqLCBOVUxMKSAhPSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImV4cGVjdGVkIGEgc2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWxlbiA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKG9iaiwgMCwgJnBwKTsKLQlpZiAobGVuIDwgMCkKLQkJcmV0dXJuIC0xOwotCSpidWZmZXIgPSBwcDsKLQkqYnVmZmVyX2xlbiA9IGxlbjsKLQlyZXR1cm4gMDsKKyAgICBpZiAob2JqID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyX2xlbiA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIGlmIChwYiA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgcmVhZGFibGUgYnVmZmVyIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkob2JqLCBOVUxMKSAhPSAxKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgYSBzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbGVuID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikob2JqLCAwLCAmcHApOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKmJ1ZmZlciA9IHBwOworICAgICpidWZmZXJfbGVuID0gbGVuOworICAgIHJldHVybiAwOwogfQogCiBpbnQgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcihQeU9iamVjdCAqb2JqLAotCQkJICAgdm9pZCAqKmJ1ZmZlciwKLQkJCSAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqYnVmZmVyX2xlbikKIHsKLQlQeUJ1ZmZlclByb2NzICpwYjsKLQl2b2lkKnBwOwotCVB5X3NzaXplX3QgbGVuOworICAgIFB5QnVmZmVyUHJvY3MgKnBiOworICAgIHZvaWQqcHA7CisgICAgUHlfc3NpemVfdCBsZW47CiAKLQlpZiAob2JqID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyX2xlbiA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwYiA9IG9iai0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwotCWlmIChwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0d3JpdGVidWZmZXIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZXhwZWN0ZWQgYSB3cml0ZWFibGUgYnVmZmVyIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkob2JqLCBOVUxMKSAhPSAxKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImV4cGVjdGVkIGEgc2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWxlbiA9ICgqcGItPmJmX2dldHdyaXRlYnVmZmVyKShvYmosMCwmcHApOwotCWlmIChsZW4gPCAwKQotCQlyZXR1cm4gLTE7Ci0JKmJ1ZmZlciA9IHBwOwotCSpidWZmZXJfbGVuID0gbGVuOwotCXJldHVybiAwOworICAgIGlmIChvYmogPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCB8fCBidWZmZXJfbGVuID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHBiID0gb2JqLT5vYl90eXBlLT50cF9hc19idWZmZXI7CisgICAgaWYgKHBiID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXR3cml0ZWJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgd3JpdGVhYmxlIGJ1ZmZlciBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKCpwYi0+YmZfZ2V0c2VnY291bnQpKG9iaiwgTlVMTCkgIT0gMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGEgc2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGxlbiA9ICgqcGItPmJmX2dldHdyaXRlYnVmZmVyKShvYmosMCwmcHApOworICAgIGlmIChsZW4gPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKmJ1ZmZlciA9IHBwOworICAgICpidWZmZXJfbGVuID0gbGVuOworICAgIHJldHVybiAwOwogfQogCiAvKiBCdWZmZXIgQy1BUEkgZm9yIFB5dGhvbiAzLjAgKi8KQEAgLTM1NiwxMTkgKzM1NiwxMTkgQEAKIGludAogUHlPYmplY3RfR2V0QnVmZmVyKFB5T2JqZWN0ICpvYmosIFB5X2J1ZmZlciAqdmlldywgaW50IGZsYWdzKQogewotCWlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyUxMDBzJyBkb2VzIG5vdCBoYXZlIHRoZSBidWZmZXIgaW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gKCoob2JqLT5vYl90eXBlLT50cF9hc19idWZmZXItPmJmX2dldGJ1ZmZlcikpKG9iaiwgdmlldywgZmxhZ3MpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclMTAwcycgZG9lcyBub3QgaGF2ZSB0aGUgYnVmZmVyIGludGVyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAoKihvYmotPm9iX3R5cGUtPnRwX2FzX2J1ZmZlci0+YmZfZ2V0YnVmZmVyKSkob2JqLCB2aWV3LCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQKIF9Jc0ZvcnRyYW5Db250aWd1b3VzKFB5X2J1ZmZlciAqdmlldykKIHsKLQlQeV9zc2l6ZV90IHNkLCBkaW07Ci0JaW50IGk7CisgICAgUHlfc3NpemVfdCBzZCwgZGltOworICAgIGludCBpOwogCi0JaWYgKHZpZXctPm5kaW0gPT0gMCkgcmV0dXJuIDE7Ci0JaWYgKHZpZXctPnN0cmlkZXMgPT0gTlVMTCkgcmV0dXJuICh2aWV3LT5uZGltID09IDEpOworICAgIGlmICh2aWV3LT5uZGltID09IDApIHJldHVybiAxOworICAgIGlmICh2aWV3LT5zdHJpZGVzID09IE5VTEwpIHJldHVybiAodmlldy0+bmRpbSA9PSAxKTsKIAotCXNkID0gdmlldy0+aXRlbXNpemU7Ci0JaWYgKHZpZXctPm5kaW0gPT0gMSkgcmV0dXJuICh2aWV3LT5zaGFwZVswXSA9PSAxIHx8Ci0JCQkJICAgc2QgPT0gdmlldy0+c3RyaWRlc1swXSk7Ci0JZm9yIChpPTA7IGk8dmlldy0+bmRpbTsgaSsrKSB7Ci0JCWRpbSA9IHZpZXctPnNoYXBlW2ldOwotCQlpZiAoZGltID09IDApIHJldHVybiAxOwotCQlpZiAodmlldy0+c3RyaWRlc1tpXSAhPSBzZCkgcmV0dXJuIDA7Ci0JCXNkICo9IGRpbTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgc2QgPSB2aWV3LT5pdGVtc2l6ZTsKKyAgICBpZiAodmlldy0+bmRpbSA9PSAxKSByZXR1cm4gKHZpZXctPnNoYXBlWzBdID09IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9PSB2aWV3LT5zdHJpZGVzWzBdKTsKKyAgICBmb3IgKGk9MDsgaTx2aWV3LT5uZGltOyBpKyspIHsKKyAgICAgICAgZGltID0gdmlldy0+c2hhcGVbaV07CisgICAgICAgIGlmIChkaW0gPT0gMCkgcmV0dXJuIDE7CisgICAgICAgIGlmICh2aWV3LT5zdHJpZGVzW2ldICE9IHNkKSByZXR1cm4gMDsKKyAgICAgICAgc2QgKj0gZGltOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogX0lzQ0NvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3KQogewotCVB5X3NzaXplX3Qgc2QsIGRpbTsKLQlpbnQgaTsKKyAgICBQeV9zc2l6ZV90IHNkLCBkaW07CisgICAgaW50IGk7CiAKLQlpZiAodmlldy0+bmRpbSA9PSAwKSByZXR1cm4gMTsKLQlpZiAodmlldy0+c3RyaWRlcyA9PSBOVUxMKSByZXR1cm4gMTsKKyAgICBpZiAodmlldy0+bmRpbSA9PSAwKSByZXR1cm4gMTsKKyAgICBpZiAodmlldy0+c3RyaWRlcyA9PSBOVUxMKSByZXR1cm4gMTsKIAotCXNkID0gdmlldy0+aXRlbXNpemU7Ci0JaWYgKHZpZXctPm5kaW0gPT0gMSkgcmV0dXJuICh2aWV3LT5zaGFwZVswXSA9PSAxIHx8Ci0JCQkJICAgc2QgPT0gdmlldy0+c3RyaWRlc1swXSk7Ci0JZm9yIChpPXZpZXctPm5kaW0tMTsgaT49MDsgaS0tKSB7Ci0JCWRpbSA9IHZpZXctPnNoYXBlW2ldOwotCQlpZiAoZGltID09IDApIHJldHVybiAxOwotCQlpZiAodmlldy0+c3RyaWRlc1tpXSAhPSBzZCkgcmV0dXJuIDA7Ci0JCXNkICo9IGRpbTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgc2QgPSB2aWV3LT5pdGVtc2l6ZTsKKyAgICBpZiAodmlldy0+bmRpbSA9PSAxKSByZXR1cm4gKHZpZXctPnNoYXBlWzBdID09IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9PSB2aWV3LT5zdHJpZGVzWzBdKTsKKyAgICBmb3IgKGk9dmlldy0+bmRpbS0xOyBpPj0wOyBpLS0pIHsKKyAgICAgICAgZGltID0gdmlldy0+c2hhcGVbaV07CisgICAgICAgIGlmIChkaW0gPT0gMCkgcmV0dXJuIDE7CisgICAgICAgIGlmICh2aWV3LT5zdHJpZGVzW2ldICE9IHNkKSByZXR1cm4gMDsKKyAgICAgICAgc2QgKj0gZGltOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3LCBjaGFyIGZvcnQpCiB7CiAKLQlpZiAodmlldy0+c3Vib2Zmc2V0cyAhPSBOVUxMKSByZXR1cm4gMDsKKyAgICBpZiAodmlldy0+c3Vib2Zmc2V0cyAhPSBOVUxMKSByZXR1cm4gMDsKIAotCWlmIChmb3J0ID09ICdDJykKLQkJcmV0dXJuIF9Jc0NDb250aWd1b3VzKHZpZXcpOwotCWVsc2UgaWYgKGZvcnQgPT0gJ0YnKQotCQlyZXR1cm4gX0lzRm9ydHJhbkNvbnRpZ3VvdXModmlldyk7Ci0JZWxzZSBpZiAoZm9ydCA9PSAnQScpCi0JCXJldHVybiAoX0lzQ0NvbnRpZ3VvdXModmlldykgfHwgX0lzRm9ydHJhbkNvbnRpZ3VvdXModmlldykpOwotCXJldHVybiAwOworICAgIGlmIChmb3J0ID09ICdDJykKKyAgICAgICAgcmV0dXJuIF9Jc0NDb250aWd1b3VzKHZpZXcpOworICAgIGVsc2UgaWYgKGZvcnQgPT0gJ0YnKQorICAgICAgICByZXR1cm4gX0lzRm9ydHJhbkNvbnRpZ3VvdXModmlldyk7CisgICAgZWxzZSBpZiAoZm9ydCA9PSAnQScpCisgICAgICAgIHJldHVybiAoX0lzQ0NvbnRpZ3VvdXModmlldykgfHwgX0lzRm9ydHJhbkNvbnRpZ3VvdXModmlldykpOworICAgIHJldHVybiAwOwogfQogCiAKIHZvaWQqCiBQeUJ1ZmZlcl9HZXRQb2ludGVyKFB5X2J1ZmZlciAqdmlldywgUHlfc3NpemVfdCAqaW5kaWNlcykKIHsKLQljaGFyKiBwb2ludGVyOwotCWludCBpOwotCXBvaW50ZXIgPSAoY2hhciAqKXZpZXctPmJ1ZjsKLQlmb3IgKGkgPSAwOyBpIDwgdmlldy0+bmRpbTsgaSsrKSB7Ci0JCXBvaW50ZXIgKz0gdmlldy0+c3RyaWRlc1tpXSppbmRpY2VzW2ldOwotCQlpZiAoKHZpZXctPnN1Ym9mZnNldHMgIT0gTlVMTCkgJiYgKHZpZXctPnN1Ym9mZnNldHNbaV0gPj0gMCkpIHsKLQkJCXBvaW50ZXIgPSAqKChjaGFyKiopcG9pbnRlcikgKyB2aWV3LT5zdWJvZmZzZXRzW2ldOwotCQl9Ci0JfQotCXJldHVybiAodm9pZCopcG9pbnRlcjsKKyAgICBjaGFyKiBwb2ludGVyOworICAgIGludCBpOworICAgIHBvaW50ZXIgPSAoY2hhciAqKXZpZXctPmJ1ZjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmlldy0+bmRpbTsgaSsrKSB7CisgICAgICAgIHBvaW50ZXIgKz0gdmlldy0+c3RyaWRlc1tpXSppbmRpY2VzW2ldOworICAgICAgICBpZiAoKHZpZXctPnN1Ym9mZnNldHMgIT0gTlVMTCkgJiYgKHZpZXctPnN1Ym9mZnNldHNbaV0gPj0gMCkpIHsKKyAgICAgICAgICAgIHBvaW50ZXIgPSAqKChjaGFyKiopcG9pbnRlcikgKyB2aWV3LT5zdWJvZmZzZXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAodm9pZCopcG9pbnRlcjsKIH0KIAogCiBzdGF0aWMgdm9pZAogX2FkZF9vbmVfdG9faW5kZXhfRihpbnQgbmQsIFB5X3NzaXplX3QgKmluZGV4LCBQeV9zc2l6ZV90ICpzaGFwZSkKIHsKLQlpbnQgazsKKyAgICBpbnQgazsKIAotCWZvciAoaz0wOyBrPG5kOyBrKyspIHsKLQkJaWYgKGluZGV4W2tdIDwgc2hhcGVba10tMSkgewotCQkJaW5kZXhba10rKzsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgewotCQkJaW5kZXhba10gPSAwOwotCQl9Ci0JfQorICAgIGZvciAoaz0wOyBrPG5kOyBrKyspIHsKKyAgICAgICAgaWYgKGluZGV4W2tdIDwgc2hhcGVba10tMSkgeworICAgICAgICAgICAgaW5kZXhba10rKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW5kZXhba10gPSAwOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogX2FkZF9vbmVfdG9faW5kZXhfQyhpbnQgbmQsIFB5X3NzaXplX3QgKmluZGV4LCBQeV9zc2l6ZV90ICpzaGFwZSkKIHsKLQlpbnQgazsKKyAgICBpbnQgazsKIAotCWZvciAoaz1uZC0xOyBrPj0wOyBrLS0pIHsKLQkJaWYgKGluZGV4W2tdIDwgc2hhcGVba10tMSkgewotCQkJaW5kZXhba10rKzsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgewotCQkJaW5kZXhba10gPSAwOwotCQl9Ci0JfQorICAgIGZvciAoaz1uZC0xOyBrPj0wOyBrLS0pIHsKKyAgICAgICAgaWYgKGluZGV4W2tdIDwgc2hhcGVba10tMSkgeworICAgICAgICAgICAgaW5kZXhba10rKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaW5kZXhba10gPSAwOworICAgICAgICB9CisgICAgfQogfQogCiAgIC8qIHZpZXcgaXMgbm90IGNoZWNrZWQgZm9yIGNvbnNpc3RlbmN5IGluIGVpdGhlciBvZiB0aGVzZS4gIEl0IGlzCkBAIC00NzksMzc0ICs0NzksMzc0IEBACiBpbnQKIFB5QnVmZmVyX1RvQ29udGlndW91cyh2b2lkICpidWYsIFB5X2J1ZmZlciAqdmlldywgUHlfc3NpemVfdCBsZW4sIGNoYXIgZm9ydCkKIHsKLQlpbnQgazsKLQl2b2lkICgqYWRkb25lKShpbnQsIFB5X3NzaXplX3QgKiwgUHlfc3NpemVfdCAqKTsKLQlQeV9zc2l6ZV90ICppbmRpY2VzLCBlbGVtZW50czsKLQljaGFyICpkZXN0LCAqcHRyOworICAgIGludCBrOworICAgIHZvaWQgKCphZGRvbmUpKGludCwgUHlfc3NpemVfdCAqLCBQeV9zc2l6ZV90ICopOworICAgIFB5X3NzaXplX3QgKmluZGljZXMsIGVsZW1lbnRzOworICAgIGNoYXIgKmRlc3QsICpwdHI7CiAKLQlpZiAobGVuID4gdmlldy0+bGVuKSB7Ci0JCWxlbiA9IHZpZXctPmxlbjsKLQl9CisgICAgaWYgKGxlbiA+IHZpZXctPmxlbikgeworICAgICAgICBsZW4gPSB2aWV3LT5sZW47CisgICAgfQogCi0JaWYgKFB5QnVmZmVyX0lzQ29udGlndW91cyh2aWV3LCBmb3J0KSkgewotCQkvKiBzaW1wbGVzdCBjb3B5IGlzIGFsbCB0aGF0IGlzIG5lZWRlZCAqLwotCQltZW1jcHkoYnVmLCB2aWV3LT5idWYsIGxlbik7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlCdWZmZXJfSXNDb250aWd1b3VzKHZpZXcsIGZvcnQpKSB7CisgICAgICAgIC8qIHNpbXBsZXN0IGNvcHkgaXMgYWxsIHRoYXQgaXMgbmVlZGVkICovCisgICAgICAgIG1lbWNweShidWYsIHZpZXctPmJ1ZiwgbGVuKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogT3RoZXJ3aXNlIGEgbW9yZSBlbGFib3JhdGUgc2NoZW1lIGlzIG5lZWRlZCAqLworICAgIC8qIE90aGVyd2lzZSBhIG1vcmUgZWxhYm9yYXRlIHNjaGVtZSBpcyBuZWVkZWQgKi8KIAotCS8qIFhYWChubm9yd2l0eik6IG5lZWQgdG8gY2hlY2sgZm9yIG92ZXJmbG93ISAqLwotCWluZGljZXMgPSAoUHlfc3NpemVfdCAqKVB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkqKHZpZXctPm5kaW0pKTsKLQlpZiAoaW5kaWNlcyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZm9yIChrPTA7IGs8dmlldy0+bmRpbTtrKyspIHsKLQkJaW5kaWNlc1trXSA9IDA7Ci0JfQorICAgIC8qIFhYWChubm9yd2l0eik6IG5lZWQgdG8gY2hlY2sgZm9yIG92ZXJmbG93ISAqLworICAgIGluZGljZXMgPSAoUHlfc3NpemVfdCAqKVB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkqKHZpZXctPm5kaW0pKTsKKyAgICBpZiAoaW5kaWNlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChrPTA7IGs8dmlldy0+bmRpbTtrKyspIHsKKyAgICAgICAgaW5kaWNlc1trXSA9IDA7CisgICAgfQogCi0JaWYgKGZvcnQgPT0gJ0YnKSB7Ci0JCWFkZG9uZSA9IF9hZGRfb25lX3RvX2luZGV4X0Y7Ci0JfQotCWVsc2UgewotCQlhZGRvbmUgPSBfYWRkX29uZV90b19pbmRleF9DOwotCX0KLQlkZXN0ID0gYnVmOwotCS8qIFhYWCA6IFRoaXMgaXMgbm90IGdvaW5nIHRvIGJlIHRoZSBmYXN0ZXN0IGNvZGUgaW4gdGhlIHdvcmxkCi0JCSBzZXZlcmFsIG9wdGltaXphdGlvbnMgYXJlIHBvc3NpYmxlLgotCSAqLwotCWVsZW1lbnRzID0gbGVuIC8gdmlldy0+aXRlbXNpemU7Ci0Jd2hpbGUgKGVsZW1lbnRzLS0pIHsKLQkJYWRkb25lKHZpZXctPm5kaW0sIGluZGljZXMsIHZpZXctPnNoYXBlKTsKLQkJcHRyID0gUHlCdWZmZXJfR2V0UG9pbnRlcih2aWV3LCBpbmRpY2VzKTsKLQkJbWVtY3B5KGRlc3QsIHB0ciwgdmlldy0+aXRlbXNpemUpOwotCQlkZXN0ICs9IHZpZXctPml0ZW1zaXplOwotCX0KLQlQeU1lbV9GcmVlKGluZGljZXMpOwotCXJldHVybiAwOworICAgIGlmIChmb3J0ID09ICdGJykgeworICAgICAgICBhZGRvbmUgPSBfYWRkX29uZV90b19pbmRleF9GOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWRkb25lID0gX2FkZF9vbmVfdG9faW5kZXhfQzsKKyAgICB9CisgICAgZGVzdCA9IGJ1ZjsKKyAgICAvKiBYWFggOiBUaGlzIGlzIG5vdCBnb2luZyB0byBiZSB0aGUgZmFzdGVzdCBjb2RlIGluIHRoZSB3b3JsZAorICAgICAgICAgICAgIHNldmVyYWwgb3B0aW1pemF0aW9ucyBhcmUgcG9zc2libGUuCisgICAgICovCisgICAgZWxlbWVudHMgPSBsZW4gLyB2aWV3LT5pdGVtc2l6ZTsKKyAgICB3aGlsZSAoZWxlbWVudHMtLSkgeworICAgICAgICBhZGRvbmUodmlldy0+bmRpbSwgaW5kaWNlcywgdmlldy0+c2hhcGUpOworICAgICAgICBwdHIgPSBQeUJ1ZmZlcl9HZXRQb2ludGVyKHZpZXcsIGluZGljZXMpOworICAgICAgICBtZW1jcHkoZGVzdCwgcHRyLCB2aWV3LT5pdGVtc2l6ZSk7CisgICAgICAgIGRlc3QgKz0gdmlldy0+aXRlbXNpemU7CisgICAgfQorICAgIFB5TWVtX0ZyZWUoaW5kaWNlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlCdWZmZXJfRnJvbUNvbnRpZ3VvdXMoUHlfYnVmZmVyICp2aWV3LCB2b2lkICpidWYsIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpCiB7Ci0JaW50IGs7Ci0Jdm9pZCAoKmFkZG9uZSkoaW50LCBQeV9zc2l6ZV90ICosIFB5X3NzaXplX3QgKik7Ci0JUHlfc3NpemVfdCAqaW5kaWNlcywgZWxlbWVudHM7Ci0JY2hhciAqc3JjLCAqcHRyOworICAgIGludCBrOworICAgIHZvaWQgKCphZGRvbmUpKGludCwgUHlfc3NpemVfdCAqLCBQeV9zc2l6ZV90ICopOworICAgIFB5X3NzaXplX3QgKmluZGljZXMsIGVsZW1lbnRzOworICAgIGNoYXIgKnNyYywgKnB0cjsKIAotCWlmIChsZW4gPiB2aWV3LT5sZW4pIHsKLQkJbGVuID0gdmlldy0+bGVuOwotCX0KKyAgICBpZiAobGVuID4gdmlldy0+bGVuKSB7CisgICAgICAgIGxlbiA9IHZpZXctPmxlbjsKKyAgICB9CiAKLQlpZiAoUHlCdWZmZXJfSXNDb250aWd1b3VzKHZpZXcsIGZvcnQpKSB7Ci0JCS8qIHNpbXBsZXN0IGNvcHkgaXMgYWxsIHRoYXQgaXMgbmVlZGVkICovCi0JCW1lbWNweSh2aWV3LT5idWYsIGJ1ZiwgbGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXModmlldywgZm9ydCkpIHsKKyAgICAgICAgLyogc2ltcGxlc3QgY29weSBpcyBhbGwgdGhhdCBpcyBuZWVkZWQgKi8KKyAgICAgICAgbWVtY3B5KHZpZXctPmJ1ZiwgYnVmLCBsZW4pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBPdGhlcndpc2UgYSBtb3JlIGVsYWJvcmF0ZSBzY2hlbWUgaXMgbmVlZGVkICovCisgICAgLyogT3RoZXJ3aXNlIGEgbW9yZSBlbGFib3JhdGUgc2NoZW1lIGlzIG5lZWRlZCAqLwogCi0JLyogWFhYKG5ub3J3aXR6KTogbmVlZCB0byBjaGVjayBmb3Igb3ZlcmZsb3chICovCi0JaW5kaWNlcyA9IChQeV9zc2l6ZV90ICopUHlNZW1fTWFsbG9jKHNpemVvZihQeV9zc2l6ZV90KSoodmlldy0+bmRpbSkpOwotCWlmIChpbmRpY2VzID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlmb3IgKGs9MDsgazx2aWV3LT5uZGltO2srKykgewotCQlpbmRpY2VzW2tdID0gMDsKLQl9CisgICAgLyogWFhYKG5ub3J3aXR6KTogbmVlZCB0byBjaGVjayBmb3Igb3ZlcmZsb3chICovCisgICAgaW5kaWNlcyA9IChQeV9zc2l6ZV90ICopUHlNZW1fTWFsbG9jKHNpemVvZihQeV9zc2l6ZV90KSoodmlldy0+bmRpbSkpOworICAgIGlmIChpbmRpY2VzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmb3IgKGs9MDsgazx2aWV3LT5uZGltO2srKykgeworICAgICAgICBpbmRpY2VzW2tdID0gMDsKKyAgICB9CiAKLQlpZiAoZm9ydCA9PSAnRicpIHsKLQkJYWRkb25lID0gX2FkZF9vbmVfdG9faW5kZXhfRjsKLQl9Ci0JZWxzZSB7Ci0JCWFkZG9uZSA9IF9hZGRfb25lX3RvX2luZGV4X0M7Ci0JfQotCXNyYyA9IGJ1ZjsKLQkvKiBYWFggOiBUaGlzIGlzIG5vdCBnb2luZyB0byBiZSB0aGUgZmFzdGVzdCBjb2RlIGluIHRoZSB3b3JsZAotCQkgc2V2ZXJhbCBvcHRpbWl6YXRpb25zIGFyZSBwb3NzaWJsZS4KLQkgKi8KLQllbGVtZW50cyA9IGxlbiAvIHZpZXctPml0ZW1zaXplOwotCXdoaWxlIChlbGVtZW50cy0tKSB7Ci0JCWFkZG9uZSh2aWV3LT5uZGltLCBpbmRpY2VzLCB2aWV3LT5zaGFwZSk7Ci0JCXB0ciA9IFB5QnVmZmVyX0dldFBvaW50ZXIodmlldywgaW5kaWNlcyk7Ci0JCW1lbWNweShwdHIsIHNyYywgdmlldy0+aXRlbXNpemUpOwotCQlzcmMgKz0gdmlldy0+aXRlbXNpemU7Ci0JfQorICAgIGlmIChmb3J0ID09ICdGJykgeworICAgICAgICBhZGRvbmUgPSBfYWRkX29uZV90b19pbmRleF9GOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWRkb25lID0gX2FkZF9vbmVfdG9faW5kZXhfQzsKKyAgICB9CisgICAgc3JjID0gYnVmOworICAgIC8qIFhYWCA6IFRoaXMgaXMgbm90IGdvaW5nIHRvIGJlIHRoZSBmYXN0ZXN0IGNvZGUgaW4gdGhlIHdvcmxkCisgICAgICAgICAgICAgc2V2ZXJhbCBvcHRpbWl6YXRpb25zIGFyZSBwb3NzaWJsZS4KKyAgICAgKi8KKyAgICBlbGVtZW50cyA9IGxlbiAvIHZpZXctPml0ZW1zaXplOworICAgIHdoaWxlIChlbGVtZW50cy0tKSB7CisgICAgICAgIGFkZG9uZSh2aWV3LT5uZGltLCBpbmRpY2VzLCB2aWV3LT5zaGFwZSk7CisgICAgICAgIHB0ciA9IFB5QnVmZmVyX0dldFBvaW50ZXIodmlldywgaW5kaWNlcyk7CisgICAgICAgIG1lbWNweShwdHIsIHNyYywgdmlldy0+aXRlbXNpemUpOworICAgICAgICBzcmMgKz0gdmlldy0+aXRlbXNpemU7CisgICAgfQogCi0JUHlNZW1fRnJlZShpbmRpY2VzKTsKLQlyZXR1cm4gMDsKKyAgICBQeU1lbV9GcmVlKGluZGljZXMpOworICAgIHJldHVybiAwOwogfQogCiBpbnQgUHlPYmplY3RfQ29weURhdGEoUHlPYmplY3QgKmRlc3QsIFB5T2JqZWN0ICpzcmMpCiB7Ci0JUHlfYnVmZmVyIHZpZXdfZGVzdCwgdmlld19zcmM7Ci0JaW50IGs7Ci0JUHlfc3NpemVfdCAqaW5kaWNlcywgZWxlbWVudHM7Ci0JY2hhciAqZHB0ciwgKnNwdHI7CisgICAgUHlfYnVmZmVyIHZpZXdfZGVzdCwgdmlld19zcmM7CisgICAgaW50IGs7CisgICAgUHlfc3NpemVfdCAqaW5kaWNlcywgZWxlbWVudHM7CisgICAgY2hhciAqZHB0ciwgKnNwdHI7CiAKLQlpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKGRlc3QpIHx8Ci0JICAgICFQeU9iamVjdF9DaGVja0J1ZmZlcihzcmMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImJvdGggZGVzdGluYXRpb24gYW5kIHNvdXJjZSBtdXN0IGhhdmUgdGhlICJcCi0JCQkJImJ1ZmZlciBpbnRlcmZhY2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKGRlc3QpIHx8CisgICAgICAgICFQeU9iamVjdF9DaGVja0J1ZmZlcihzcmMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYm90aCBkZXN0aW5hdGlvbiBhbmQgc291cmNlIG11c3QgaGF2ZSB0aGUgIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgaW50ZXJmYWNlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoUHlPYmplY3RfR2V0QnVmZmVyKGRlc3QsICZ2aWV3X2Rlc3QsIFB5QlVGX0ZVTEwpICE9IDApIHJldHVybiAtMTsKLQlpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHNyYywgJnZpZXdfc3JjLCBQeUJVRl9GVUxMX1JPKSAhPSAwKSB7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfZGVzdCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihkZXN0LCAmdmlld19kZXN0LCBQeUJVRl9GVUxMKSAhPSAwKSByZXR1cm4gLTE7CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzcmMsICZ2aWV3X3NyYywgUHlCVUZfRlVMTF9STykgIT0gMCkgeworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKHZpZXdfZGVzdC5sZW4gPCB2aWV3X3NyYy5sZW4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0J1ZmZlckVycm9yLAotCQkJCSJkZXN0aW5hdGlvbiBpcyB0b28gc21hbGwgdG8gcmVjZWl2ZSBkYXRhIGZyb20gc291cmNlIik7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfZGVzdCk7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfc3JjKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodmlld19kZXN0LmxlbiA8IHZpZXdfc3JjLmxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQnVmZmVyRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gaXMgdG9vIHNtYWxsIHRvIHJlY2VpdmUgZGF0YSBmcm9tIHNvdXJjZSIpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOworICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoKFB5QnVmZmVyX0lzQ29udGlndW91cygmdmlld19kZXN0LCAnQycpICYmCi0JICAgICBQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoJnZpZXdfc3JjLCAnQycpKSB8fAotCSAgICAoUHlCdWZmZXJfSXNDb250aWd1b3VzKCZ2aWV3X2Rlc3QsICdGJykgJiYKLQkgICAgIFB5QnVmZmVyX0lzQ29udGlndW91cygmdmlld19zcmMsICdGJykpKSB7Ci0JCS8qIHNpbXBsZXN0IGNvcHkgaXMgYWxsIHRoYXQgaXMgbmVlZGVkICovCi0JCW1lbWNweSh2aWV3X2Rlc3QuYnVmLCB2aWV3X3NyYy5idWYsIHZpZXdfc3JjLmxlbik7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfZGVzdCk7Ci0JCVB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfc3JjKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmICgoUHlCdWZmZXJfSXNDb250aWd1b3VzKCZ2aWV3X2Rlc3QsICdDJykgJiYKKyAgICAgICAgIFB5QnVmZmVyX0lzQ29udGlndW91cygmdmlld19zcmMsICdDJykpIHx8CisgICAgICAgIChQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoJnZpZXdfZGVzdCwgJ0YnKSAmJgorICAgICAgICAgUHlCdWZmZXJfSXNDb250aWd1b3VzKCZ2aWV3X3NyYywgJ0YnKSkpIHsKKyAgICAgICAgLyogc2ltcGxlc3QgY29weSBpcyBhbGwgdGhhdCBpcyBuZWVkZWQgKi8KKyAgICAgICAgbWVtY3B5KHZpZXdfZGVzdC5idWYsIHZpZXdfc3JjLmJ1Ziwgdmlld19zcmMubGVuKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlld19kZXN0KTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlld19zcmMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBPdGhlcndpc2UgYSBtb3JlIGVsYWJvcmF0ZSBjb3B5IHNjaGVtZSBpcyBuZWVkZWQgKi8KKyAgICAvKiBPdGhlcndpc2UgYSBtb3JlIGVsYWJvcmF0ZSBjb3B5IHNjaGVtZSBpcyBuZWVkZWQgKi8KIAotCS8qIFhYWChubm9yd2l0eik6IG5lZWQgdG8gY2hlY2sgZm9yIG92ZXJmbG93ISAqLwotCWluZGljZXMgPSAoUHlfc3NpemVfdCAqKVB5TWVtX01hbGxvYyhzaXplb2YoUHlfc3NpemVfdCkqdmlld19zcmMubmRpbSk7Ci0JaWYgKGluZGljZXMgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOwotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZm9yIChrPTA7IGs8dmlld19zcmMubmRpbTtrKyspIHsKLQkJaW5kaWNlc1trXSA9IDA7Ci0JfQotCWVsZW1lbnRzID0gMTsKLQlmb3IgKGs9MDsgazx2aWV3X3NyYy5uZGltOyBrKyspIHsKLQkJLyogWFhYKG5ub3J3aXR6KTogY2FuIHRoaXMgb3ZlcmZsb3c/ICovCi0JCWVsZW1lbnRzICo9IHZpZXdfc3JjLnNoYXBlW2tdOwotCX0KLQl3aGlsZSAoZWxlbWVudHMtLSkgewotCQlfYWRkX29uZV90b19pbmRleF9DKHZpZXdfc3JjLm5kaW0sIGluZGljZXMsIHZpZXdfc3JjLnNoYXBlKTsKLQkJZHB0ciA9IFB5QnVmZmVyX0dldFBvaW50ZXIoJnZpZXdfZGVzdCwgaW5kaWNlcyk7Ci0JCXNwdHIgPSBQeUJ1ZmZlcl9HZXRQb2ludGVyKCZ2aWV3X3NyYywgaW5kaWNlcyk7Ci0JCW1lbWNweShkcHRyLCBzcHRyLCB2aWV3X3NyYy5pdGVtc2l6ZSk7Ci0JfQotCVB5TWVtX0ZyZWUoaW5kaWNlcyk7Ci0JUHlCdWZmZXJfUmVsZWFzZSgmdmlld19kZXN0KTsKLQlQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X3NyYyk7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYKG5ub3J3aXR6KTogbmVlZCB0byBjaGVjayBmb3Igb3ZlcmZsb3chICovCisgICAgaW5kaWNlcyA9IChQeV9zc2l6ZV90ICopUHlNZW1fTWFsbG9jKHNpemVvZihQeV9zc2l6ZV90KSp2aWV3X3NyYy5uZGltKTsKKyAgICBpZiAoaW5kaWNlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfZGVzdCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfc3JjKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmb3IgKGs9MDsgazx2aWV3X3NyYy5uZGltO2srKykgeworICAgICAgICBpbmRpY2VzW2tdID0gMDsKKyAgICB9CisgICAgZWxlbWVudHMgPSAxOworICAgIGZvciAoaz0wOyBrPHZpZXdfc3JjLm5kaW07IGsrKykgeworICAgICAgICAvKiBYWFgobm5vcndpdHopOiBjYW4gdGhpcyBvdmVyZmxvdz8gKi8KKyAgICAgICAgZWxlbWVudHMgKj0gdmlld19zcmMuc2hhcGVba107CisgICAgfQorICAgIHdoaWxlIChlbGVtZW50cy0tKSB7CisgICAgICAgIF9hZGRfb25lX3RvX2luZGV4X0Modmlld19zcmMubmRpbSwgaW5kaWNlcywgdmlld19zcmMuc2hhcGUpOworICAgICAgICBkcHRyID0gUHlCdWZmZXJfR2V0UG9pbnRlcigmdmlld19kZXN0LCBpbmRpY2VzKTsKKyAgICAgICAgc3B0ciA9IFB5QnVmZmVyX0dldFBvaW50ZXIoJnZpZXdfc3JjLCBpbmRpY2VzKTsKKyAgICAgICAgbWVtY3B5KGRwdHIsIHNwdHIsIHZpZXdfc3JjLml0ZW1zaXplKTsKKyAgICB9CisgICAgUHlNZW1fRnJlZShpbmRpY2VzKTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3X2Rlc3QpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXdfc3JjKTsKKyAgICByZXR1cm4gMDsKIH0KIAogdm9pZAogUHlCdWZmZXJfRmlsbENvbnRpZ3VvdXNTdHJpZGVzKGludCBuZCwgUHlfc3NpemVfdCAqc2hhcGUsCi0JCQkgICAgICAgUHlfc3NpemVfdCAqc3RyaWRlcywgaW50IGl0ZW1zaXplLAotCQkJICAgICAgIGNoYXIgZm9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzdHJpZGVzLCBpbnQgaXRlbXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmb3J0KQogewotCWludCBrOwotCVB5X3NzaXplX3Qgc2Q7CisgICAgaW50IGs7CisgICAgUHlfc3NpemVfdCBzZDsKIAotCXNkID0gaXRlbXNpemU7Ci0JaWYgKGZvcnQgPT0gJ0YnKSB7Ci0JCWZvciAoaz0wOyBrPG5kOyBrKyspIHsKLQkJCXN0cmlkZXNba10gPSBzZDsKLQkJCXNkICo9IHNoYXBlW2tdOwotCQl9Ci0JfQotCWVsc2UgewotCQlmb3IgKGs9bmQtMTsgaz49MDsgay0tKSB7Ci0JCQlzdHJpZGVzW2tdID0gc2Q7Ci0JCQlzZCAqPSBzaGFwZVtrXTsKLQkJfQotCX0KLQlyZXR1cm47CisgICAgc2QgPSBpdGVtc2l6ZTsKKyAgICBpZiAoZm9ydCA9PSAnRicpIHsKKyAgICAgICAgZm9yIChrPTA7IGs8bmQ7IGsrKykgeworICAgICAgICAgICAgc3RyaWRlc1trXSA9IHNkOworICAgICAgICAgICAgc2QgKj0gc2hhcGVba107CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaz1uZC0xOyBrPj0wOyBrLS0pIHsKKyAgICAgICAgICAgIHN0cmlkZXNba10gPSBzZDsKKyAgICAgICAgICAgIHNkICo9IHNoYXBlW2tdOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybjsKIH0KIAogaW50CiBQeUJ1ZmZlcl9GaWxsSW5mbyhQeV9idWZmZXIgKnZpZXcsIFB5T2JqZWN0ICpvYmosIHZvaWQgKmJ1ZiwgUHlfc3NpemVfdCBsZW4sCi0JICAgICAgaW50IHJlYWRvbmx5LCBpbnQgZmxhZ3MpCisgICAgICAgICAgICAgIGludCByZWFkb25seSwgaW50IGZsYWdzKQogewotCWlmICh2aWV3ID09IE5VTEwpIHJldHVybiAwOwotCWlmICgoKGZsYWdzICYgUHlCVUZfV1JJVEFCTEUpID09IFB5QlVGX1dSSVRBQkxFKSAmJgotCSAgICAocmVhZG9ubHkgPT0gMSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0J1ZmZlckVycm9yLAotCQkJCSJPYmplY3QgaXMgbm90IHdyaXRhYmxlLiIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICh2aWV3ID09IE5VTEwpIHJldHVybiAwOworICAgIGlmICgoKGZsYWdzICYgUHlCVUZfV1JJVEFCTEUpID09IFB5QlVGX1dSSVRBQkxFKSAmJgorICAgICAgICAocmVhZG9ubHkgPT0gMSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0J1ZmZlckVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdCBpcyBub3Qgd3JpdGFibGUuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQl2aWV3LT5vYmogPSBvYmo7Ci0JaWYgKG9iaikKLQkJUHlfSU5DUkVGKG9iaik7Ci0Jdmlldy0+YnVmID0gYnVmOwotCXZpZXctPmxlbiA9IGxlbjsKLQl2aWV3LT5yZWFkb25seSA9IHJlYWRvbmx5OwotCXZpZXctPml0ZW1zaXplID0gMTsKLQl2aWV3LT5mb3JtYXQgPSBOVUxMOwotCWlmICgoZmxhZ3MgJiBQeUJVRl9GT1JNQVQpID09IFB5QlVGX0ZPUk1BVCkKLQkJdmlldy0+Zm9ybWF0ID0gIkIiOwotCXZpZXctPm5kaW0gPSAxOwotCXZpZXctPnNoYXBlID0gTlVMTDsKLQlpZiAoKGZsYWdzICYgUHlCVUZfTkQpID09IFB5QlVGX05EKQotCQl2aWV3LT5zaGFwZSA9ICYodmlldy0+bGVuKTsKLQl2aWV3LT5zdHJpZGVzID0gTlVMTDsKLQlpZiAoKGZsYWdzICYgUHlCVUZfU1RSSURFUykgPT0gUHlCVUZfU1RSSURFUykKLQkJdmlldy0+c3RyaWRlcyA9ICYodmlldy0+aXRlbXNpemUpOwotCXZpZXctPnN1Ym9mZnNldHMgPSBOVUxMOwotCXZpZXctPmludGVybmFsID0gTlVMTDsKLQlyZXR1cm4gMDsKKyAgICB2aWV3LT5vYmogPSBvYmo7CisgICAgaWYgKG9iaikKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgdmlldy0+YnVmID0gYnVmOworICAgIHZpZXctPmxlbiA9IGxlbjsKKyAgICB2aWV3LT5yZWFkb25seSA9IHJlYWRvbmx5OworICAgIHZpZXctPml0ZW1zaXplID0gMTsKKyAgICB2aWV3LT5mb3JtYXQgPSBOVUxMOworICAgIGlmICgoZmxhZ3MgJiBQeUJVRl9GT1JNQVQpID09IFB5QlVGX0ZPUk1BVCkKKyAgICAgICAgdmlldy0+Zm9ybWF0ID0gIkIiOworICAgIHZpZXctPm5kaW0gPSAxOworICAgIHZpZXctPnNoYXBlID0gTlVMTDsKKyAgICBpZiAoKGZsYWdzICYgUHlCVUZfTkQpID09IFB5QlVGX05EKQorICAgICAgICB2aWV3LT5zaGFwZSA9ICYodmlldy0+bGVuKTsKKyAgICB2aWV3LT5zdHJpZGVzID0gTlVMTDsKKyAgICBpZiAoKGZsYWdzICYgUHlCVUZfU1RSSURFUykgPT0gUHlCVUZfU1RSSURFUykKKyAgICAgICAgdmlldy0+c3RyaWRlcyA9ICYodmlldy0+aXRlbXNpemUpOworICAgIHZpZXctPnN1Ym9mZnNldHMgPSBOVUxMOworICAgIHZpZXctPmludGVybmFsID0gTlVMTDsKKyAgICByZXR1cm4gMDsKIH0KIAogdm9pZAogUHlCdWZmZXJfUmVsZWFzZShQeV9idWZmZXIgKnZpZXcpCiB7Ci0JUHlPYmplY3QgKm9iaiA9IHZpZXctPm9iajsKLQlpZiAob2JqICYmIFB5X1RZUEUob2JqKS0+dHBfYXNfYnVmZmVyICYmIFB5X1RZUEUob2JqKS0+dHBfYXNfYnVmZmVyLT5iZl9yZWxlYXNlYnVmZmVyKQotCQlQeV9UWVBFKG9iaiktPnRwX2FzX2J1ZmZlci0+YmZfcmVsZWFzZWJ1ZmZlcihvYmosIHZpZXcpOwotCVB5X1hERUNSRUYob2JqKTsKLQl2aWV3LT5vYmogPSBOVUxMOworICAgIFB5T2JqZWN0ICpvYmogPSB2aWV3LT5vYmo7CisgICAgaWYgKG9iaiAmJiBQeV9UWVBFKG9iaiktPnRwX2FzX2J1ZmZlciAmJiBQeV9UWVBFKG9iaiktPnRwX2FzX2J1ZmZlci0+YmZfcmVsZWFzZWJ1ZmZlcikKKyAgICAgICAgUHlfVFlQRShvYmopLT50cF9hc19idWZmZXItPmJmX3JlbGVhc2VidWZmZXIob2JqLCB2aWV3KTsKKyAgICBQeV9YREVDUkVGKG9iaik7CisgICAgdmlldy0+b2JqID0gTlVMTDsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfRm9ybWF0KFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0ICpmb3JtYXRfc3BlYykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKiBzdHJfX2Zvcm1hdF9fID0gTlVMTDsKLQlQeU9iamVjdCAqZW1wdHkgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCWludCBzcGVjX2lzX3VuaWNvZGU7Ci0JaW50IHJlc3VsdF9pc191bmljb2RlOworICAgIHN0YXRpYyBQeU9iamVjdCAqIHN0cl9fZm9ybWF0X18gPSBOVUxMOworICAgIFB5T2JqZWN0ICplbXB0eSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgaW50IHNwZWNfaXNfdW5pY29kZTsKKyAgICBpbnQgcmVzdWx0X2lzX3VuaWNvZGU7CiAKLQkvKiBJbml0aWFsaXplIGNhY2hlZCB2YWx1ZSAqLwotCWlmIChzdHJfX2Zvcm1hdF9fID09IE5VTEwpIHsKLQkJLyogSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGUgbmVlZGVkIGJ5IF9QeVR5cGVfTG9va3VwICovCi0JCXN0cl9fZm9ybWF0X18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2Zvcm1hdF9fIik7Ci0JCWlmIChzdHJfX2Zvcm1hdF9fID09IE5VTEwpCi0JCQlnb3RvIGRvbmU7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgY2FjaGVkIHZhbHVlICovCisgICAgaWYgKHN0cl9fZm9ybWF0X18gPT0gTlVMTCkgeworICAgICAgICAvKiBJbml0aWFsaXplIHN0YXRpYyB2YXJpYWJsZSBuZWVkZWQgYnkgX1B5VHlwZV9Mb29rdXAgKi8KKyAgICAgICAgc3RyX19mb3JtYXRfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZm9ybWF0X18iKTsKKyAgICAgICAgaWYgKHN0cl9fZm9ybWF0X18gPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQkvKiBJZiBubyBmb3JtYXRfc3BlYyBpcyBwcm92aWRlZCwgdXNlIGFuIGVtcHR5IHN0cmluZyAqLwotCWlmIChmb3JtYXRfc3BlYyA9PSBOVUxMKSB7Ci0JCWVtcHR5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7Ci0JCWZvcm1hdF9zcGVjID0gZW1wdHk7Ci0JfQorICAgIC8qIElmIG5vIGZvcm1hdF9zcGVjIGlzIHByb3ZpZGVkLCB1c2UgYW4gZW1wdHkgc3RyaW5nICovCisgICAgaWYgKGZvcm1hdF9zcGVjID09IE5VTEwpIHsKKyAgICAgICAgZW1wdHkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKKyAgICAgICAgZm9ybWF0X3NwZWMgPSBlbXB0eTsKKyAgICB9CiAKLQkvKiBDaGVjayB0aGUgZm9ybWF0X3NwZWMgdHlwZSwgYW5kIG1ha2Ugc3VyZSBpdCdzIHN0ciBvciB1bmljb2RlICovCi0JaWYgKFB5VW5pY29kZV9DaGVjayhmb3JtYXRfc3BlYykpCi0JCXNwZWNfaXNfdW5pY29kZSA9IDE7Ci0JZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soZm9ybWF0X3NwZWMpKQotCQlzcGVjX2lzX3VuaWNvZGUgPSAwOwotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZm9ybWF0IGV4cGVjdHMgYXJnIDIgdG8gYmUgc3RyaW5nICIKLQkJCSAgICAgIm9yIHVuaWNvZGUsIG5vdCAlLjEwMHMiLCBQeV9UWVBFKGZvcm1hdF9zcGVjKS0+dHBfbmFtZSk7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgLyogQ2hlY2sgdGhlIGZvcm1hdF9zcGVjIHR5cGUsIGFuZCBtYWtlIHN1cmUgaXQncyBzdHIgb3IgdW5pY29kZSAqLworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKQorICAgICAgICBzcGVjX2lzX3VuaWNvZGUgPSAxOworICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGZvcm1hdF9zcGVjKSkKKyAgICAgICAgc3BlY19pc191bmljb2RlID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgZXhwZWN0cyBhcmcgMiB0byBiZSBzdHJpbmcgIgorICAgICAgICAgICAgICAgICAgICAgIm9yIHVuaWNvZGUsIG5vdCAlLjEwMHMiLCBQeV9UWVBFKGZvcm1hdF9zcGVjKS0+dHBfbmFtZSk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQkvKiBNYWtlIHN1cmUgdGhlIHR5cGUgaXMgaW5pdGlhbGl6ZWQuICBmbG9hdCBnZXRzIGluaXRpYWxpemVkIGxhdGUgKi8KLQlpZiAoUHlfVFlQRShvYmopLT50cF9kaWN0ID09IE5VTEwpCi0JCWlmIChQeVR5cGVfUmVhZHkoUHlfVFlQRShvYmopKSA8IDApCi0JCQlnb3RvIGRvbmU7CisgICAgLyogTWFrZSBzdXJlIHRoZSB0eXBlIGlzIGluaXRpYWxpemVkLiAgZmxvYXQgZ2V0cyBpbml0aWFsaXplZCBsYXRlICovCisgICAgaWYgKFB5X1RZUEUob2JqKS0+dHBfZGljdCA9PSBOVUxMKQorICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KFB5X1RZUEUob2JqKSkgPCAwKQorICAgICAgICAgICAgZ290byBkb25lOwogCi0JLyogQ2hlY2sgZm9yIGEgX19mb3JtYXRfXyBtZXRob2QgYW5kIGNhbGwgaXQuICovCi0JaWYgKFB5SW5zdGFuY2VfQ2hlY2sob2JqKSkgewotCQkvKiBXZSdyZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzaWMgY2xhc3MgKi8KLQkJUHlPYmplY3QgKmJvdW5kX21ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIob2JqLAotCQkJCQkJCSAgc3RyX19mb3JtYXRfXyk7Ci0JCWlmIChib3VuZF9tZXRob2QgIT0gTlVMTCkgewotCQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhib3VuZF9tZXRob2QsCi0JCQkJCQkJICAgICAgZm9ybWF0X3NwZWMsCi0JCQkJCQkJICAgICAgTlVMTCk7Ci0JCQlQeV9ERUNSRUYoYm91bmRfbWV0aG9kKTsKLQkJfSBlbHNlIHsKLQkJCVB5T2JqZWN0ICpzZWxmX2FzX3N0cjsKLQkJCVB5T2JqZWN0ICpmb3JtYXRfbWV0aG9kOworICAgIC8qIENoZWNrIGZvciBhIF9fZm9ybWF0X18gbWV0aG9kIGFuZCBjYWxsIGl0LiAqLworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgLyogV2UncmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc2ljIGNsYXNzICovCisgICAgICAgIFB5T2JqZWN0ICpib3VuZF9tZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX19mb3JtYXRfXyk7CisgICAgICAgIGlmIChib3VuZF9tZXRob2QgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhib3VuZF9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihib3VuZF9tZXRob2QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKnNlbGZfYXNfc3RyOworICAgICAgICAgICAgUHlPYmplY3QgKmZvcm1hdF9tZXRob2Q7CiAKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkvKiBQZXIgdGhlIFBFUCwgY29udmVydCB0byBzdHIgKG9yIHVuaWNvZGUsCi0JCQkgICBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIGZvcm1hdAotCQkJICAgc3BlY2lmaWVyKS4gIEZvciBuZXctc3R5bGUgY2xhc3NlcywgdGhpcwotCQkJICAgbG9naWMgaXMgZG9uZSBieSBvYmplY3QuX19mb3JtYXRfXygpLiAqLwotCQkJaWYgKHNwZWNfaXNfdW5pY29kZSkKLQkJCQlzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1VuaWNvZGUob2JqKTsKLQkJCWVsc2UKLQkJCQlzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1N0cihvYmopOwotCQkJaWYgKHNlbGZfYXNfc3RyID09IE5VTEwpCi0JCQkJZ290byBkb25lOworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIC8qIFBlciB0aGUgUEVQLCBjb252ZXJ0IHRvIHN0ciAob3IgdW5pY29kZSwKKyAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICBzcGVjaWZpZXIpLiAgRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCB0aGlzCisgICAgICAgICAgICAgICBsb2dpYyBpcyBkb25lIGJ5IG9iamVjdC5fX2Zvcm1hdF9fKCkuICovCisgICAgICAgICAgICBpZiAoc3BlY19pc191bmljb2RlKQorICAgICAgICAgICAgICAgIHNlbGZfYXNfc3RyID0gUHlPYmplY3RfVW5pY29kZShvYmopOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNlbGZfYXNfc3RyID0gUHlPYmplY3RfU3RyKG9iaik7CisgICAgICAgICAgICBpZiAoc2VsZl9hc19zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAKLQkJCS8qIFRoZW4gY2FsbCBzdHIuX19mb3JtYXRfXyBvbiB0aGF0IHJlc3VsdCAqLwotCQkJZm9ybWF0X21ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIoc2VsZl9hc19zdHIsCi0JCQkJCQkJIHN0cl9fZm9ybWF0X18pOwotCQkJaWYgKGZvcm1hdF9tZXRob2QgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihzZWxmX2FzX3N0cik7Ci0JCQkJZ290byBkb25lOwotCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmb3JtYXRfbWV0aG9kLAotCQkJCQkJCSAgICAgIGZvcm1hdF9zcGVjLAotCQkJCQkJCSAgICAgIE5VTEwpOwotCQkJUHlfREVDUkVGKHNlbGZfYXNfc3RyKTsKLQkJCVB5X0RFQ1JFRihmb3JtYXRfbWV0aG9kKTsKLQkJCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJCQlnb3RvIGRvbmU7Ci0gICAgICAgICAgICAgICAgfQotCX0gZWxzZSB7Ci0JCS8qIE5vdCBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzaWMgY2xhc3MsIHVzZSB0aGUgY29kZQotCQkgICBmcm9tIHB5M2sgKi8KKyAgICAgICAgICAgIC8qIFRoZW4gY2FsbCBzdHIuX19mb3JtYXRfXyBvbiB0aGF0IHJlc3VsdCAqLworICAgICAgICAgICAgZm9ybWF0X21ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIoc2VsZl9hc19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfX2Zvcm1hdF9fKTsKKyAgICAgICAgICAgIGlmIChmb3JtYXRfbWV0aG9kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZl9hc19zdHIpOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZm9ybWF0X21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKHNlbGZfYXNfc3RyKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmb3JtYXRfbWV0aG9kKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBOb3QgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc2ljIGNsYXNzLCB1c2UgdGhlIGNvZGUKKyAgICAgICAgICAgZnJvbSBweTNrICovCiAKLQkJLyogRmluZCB0aGUgKHVuYm91bmQhKSBfX2Zvcm1hdF9fIG1ldGhvZCAoYSBib3Jyb3dlZAotCQkgICByZWZlcmVuY2UpICovCi0JCVB5T2JqZWN0ICptZXRob2QgPSBfUHlUeXBlX0xvb2t1cChQeV9UWVBFKG9iaiksCi0JCQkJCQkgIHN0cl9fZm9ybWF0X18pOwotCQlpZiAobWV0aG9kID09IE5VTEwpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiVHlwZSAlLjEwMHMgZG9lc24ndCBkZWZpbmUgX19mb3JtYXRfXyIsCi0JCQkJICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUpOwotCQkJZ290byBkb25lOwotCQl9Ci0JCS8qIEFuZCBjYWxsIGl0LCBiaW5kaW5nIGl0IHRvIHRoZSB2YWx1ZSAqLwotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKG1ldGhvZCwgb2JqLAotCQkJCQkJICAgICAgZm9ybWF0X3NwZWMsIE5VTEwpOwotCX0KKyAgICAgICAgLyogRmluZCB0aGUgKHVuYm91bmQhKSBfX2Zvcm1hdF9fIG1ldGhvZCAoYSBib3Jyb3dlZAorICAgICAgICAgICByZWZlcmVuY2UpICovCisgICAgICAgIFB5T2JqZWN0ICptZXRob2QgPSBfUHlUeXBlX0xvb2t1cChQeV9UWVBFKG9iaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfX2Zvcm1hdF9fKTsKKyAgICAgICAgaWYgKG1ldGhvZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlICUuMTAwcyBkb2Vzbid0IGRlZmluZSBfX2Zvcm1hdF9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUpOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgICAgIC8qIEFuZCBjYWxsIGl0LCBiaW5kaW5nIGl0IHRvIHRoZSB2YWx1ZSAqLworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKG1ldGhvZCwgb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjLCBOVUxMKTsKKyAgICB9CiAKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIGdvdG8gZG9uZTsKIAotCS8qIENoZWNrIHRoZSByZXN1bHQgdHlwZSwgYW5kIG1ha2Ugc3VyZSBpdCdzIHN0ciBvciB1bmljb2RlICovCi0JaWYgKFB5VW5pY29kZV9DaGVjayhyZXN1bHQpKQotCQlyZXN1bHRfaXNfdW5pY29kZSA9IDE7Ci0JZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkKLQkJcmVzdWx0X2lzX3VuaWNvZGUgPSAwOwotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJS4xMDBzLl9fZm9ybWF0X18gbXVzdCByZXR1cm4gc3RyaW5nIG9yICIKLQkJCSAgICAgInVuaWNvZGUsIG5vdCAlLjEwMHMiLCBQeV9UWVBFKG9iaiktPnRwX25hbWUsCi0JCQkgICAgIFB5X1RZUEUocmVzdWx0KS0+dHBfbmFtZSk7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBOVUxMOwotCQlnb3RvIGRvbmU7Ci0JfQorICAgIC8qIENoZWNrIHRoZSByZXN1bHQgdHlwZSwgYW5kIG1ha2Ugc3VyZSBpdCdzIHN0ciBvciB1bmljb2RlICovCisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhyZXN1bHQpKQorICAgICAgICByZXN1bHRfaXNfdW5pY29kZSA9IDE7CisgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socmVzdWx0KSkKKyAgICAgICAgcmVzdWx0X2lzX3VuaWNvZGUgPSAwOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiUuMTAwcy5fX2Zvcm1hdF9fIG11c3QgcmV0dXJuIHN0cmluZyBvciAiCisgICAgICAgICAgICAgICAgICAgICAidW5pY29kZSwgbm90ICUuMTAwcyIsIFB5X1RZUEUob2JqKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocmVzdWx0KS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCi0JLyogQ29udmVydCB0byB1bmljb2RlLCBpZiBuZWVkZWQuICBSZXF1aXJlZCBpZiBzcGVjIGlzIHVuaWNvZGUKLQkgICBhbmQgcmVzdWx0IGlzIHN0ciAqLwotCWlmIChzcGVjX2lzX3VuaWNvZGUgJiYgIXJlc3VsdF9pc191bmljb2RlKSB7Ci0JCVB5T2JqZWN0ICp0bXAgPSBQeU9iamVjdF9Vbmljb2RlKHJlc3VsdCk7Ci0JCS8qIFRoaXMgbG9naWMgd29ya3Mgd2hldGhlciBvciBub3QgdG1wIGlzIE5VTEwgKi8KLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJlc3VsdCA9IHRtcDsKLQl9CisgICAgLyogQ29udmVydCB0byB1bmljb2RlLCBpZiBuZWVkZWQuICBSZXF1aXJlZCBpZiBzcGVjIGlzIHVuaWNvZGUKKyAgICAgICBhbmQgcmVzdWx0IGlzIHN0ciAqLworICAgIGlmIChzcGVjX2lzX3VuaWNvZGUgJiYgIXJlc3VsdF9pc191bmljb2RlKSB7CisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSBQeU9iamVjdF9Vbmljb2RlKHJlc3VsdCk7CisgICAgICAgIC8qIFRoaXMgbG9naWMgd29ya3Mgd2hldGhlciBvciBub3QgdG1wIGlzIE5VTEwgKi8KKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IHRtcDsKKyAgICB9CiAKIGRvbmU6Ci0JUHlfWERFQ1JFRihlbXB0eSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGVtcHR5KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBPcGVyYXRpb25zIG9uIG51bWJlcnMgKi8KQEAgLTg1NCw5ICs4NTQsOSBAQAogaW50CiBQeU51bWJlcl9DaGVjayhQeU9iamVjdCAqbykKIHsKLQlyZXR1cm4gbyAmJiBvLT5vYl90eXBlLT50cF9hc19udW1iZXIgJiYKLQkgICAgICAgKG8tPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfaW50IHx8Ci0JCW8tPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfZmxvYXQpOworICAgIHJldHVybiBvICYmIG8tPm9iX3R5cGUtPnRwX2FzX251bWJlciAmJgorICAgICAgICAgICAoby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbnQgfHwKKyAgICAgICAgby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9mbG9hdCk7CiB9CiAKIC8qIEJpbmFyeSBvcGVyYXRvcnMgKi8KQEAgLTg2NSwxOSArODY1LDE5IEBACiAKICNkZWZpbmUgTkJfU0xPVCh4KSBvZmZzZXRvZihQeU51bWJlck1ldGhvZHMsIHgpCiAjZGVmaW5lIE5CX0JJTk9QKG5iX21ldGhvZHMsIHNsb3QpIFwKLQkJKCooYmluYXJ5ZnVuYyopKCYgKChjaGFyKiluYl9tZXRob2RzKVtzbG90XSkpCisgICAgICAgICgqKGJpbmFyeWZ1bmMqKSgmICgoY2hhciopbmJfbWV0aG9kcylbc2xvdF0pKQogI2RlZmluZSBOQl9URVJOT1AobmJfbWV0aG9kcywgc2xvdCkgXAotCQkoKih0ZXJuYXJ5ZnVuYyopKCYgKChjaGFyKiluYl9tZXRob2RzKVtzbG90XSkpCisgICAgICAgICgqKHRlcm5hcnlmdW5jKikoJiAoKGNoYXIqKW5iX21ldGhvZHMpW3Nsb3RdKSkKIAogLyoKICAgQ2FsbGluZyBzY2hlbWUgdXNlZCBmb3IgYmluYXJ5IG9wZXJhdGlvbnM6CiAKLSAgdgl3CUFjdGlvbgorICB2ICAgICB3ICAgICAgIEFjdGlvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIG5ldwluZXcJdy5vcCh2LHcpWypdLCB2Lm9wKHYsdyksIHcub3Aodix3KQotICBuZXcJb2xkCXYub3Aodix3KSwgY29lcmNlKHYsdyksIHYub3Aodix3KQotICBvbGQJbmV3CXcub3Aodix3KSwgY29lcmNlKHYsdyksIHYub3Aodix3KQotICBvbGQJb2xkCWNvZXJjZSh2LHcpLCB2Lm9wKHYsdykKKyAgbmV3ICAgbmV3ICAgICB3Lm9wKHYsdylbKl0sIHYub3Aodix3KSwgdy5vcCh2LHcpCisgIG5ldyAgIG9sZCAgICAgdi5vcCh2LHcpLCBjb2VyY2Uodix3KSwgdi5vcCh2LHcpCisgIG9sZCAgIG5ldyAgICAgdy5vcCh2LHcpLCBjb2VyY2Uodix3KSwgdi5vcCh2LHcpCisgIG9sZCAgIG9sZCAgICAgY29lcmNlKHYsdyksIHYub3Aodix3KQogCiAgIFsqXSBvbmx5IHdoZW4gdi0+b2JfdHlwZSAhPSB3LT5vYl90eXBlICYmIHctPm9iX3R5cGUgaXMgYSBzdWJjbGFzcyBvZgogICAgICAgdi0+b2JfdHlwZQpAQCAtODk0LDg0ICs4OTQsODQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5hcnlfb3AxKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgY29uc3QgaW50IG9wX3Nsb3QpCiB7Ci0JUHlPYmplY3QgKng7Ci0JYmluYXJ5ZnVuYyBzbG90diA9IE5VTEw7Ci0JYmluYXJ5ZnVuYyBzbG90dyA9IE5VTEw7CisgICAgUHlPYmplY3QgKng7CisgICAgYmluYXJ5ZnVuYyBzbG90diA9IE5VTEw7CisgICAgYmluYXJ5ZnVuYyBzbG90dyA9IE5VTEw7CiAKLQlpZiAodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgTkVXX1NUWUxFX05VTUJFUih2KSkKLQkJc2xvdHYgPSBOQl9CSU5PUCh2LT5vYl90eXBlLT50cF9hc19udW1iZXIsIG9wX3Nsb3QpOwotCWlmICh3LT5vYl90eXBlICE9IHYtPm9iX3R5cGUgJiYKLQkgICAgdy0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgTkVXX1NUWUxFX05VTUJFUih3KSkgewotCQlzbG90dyA9IE5CX0JJTk9QKHctPm9iX3R5cGUtPnRwX2FzX251bWJlciwgb3Bfc2xvdCk7Ci0JCWlmIChzbG90dyA9PSBzbG90dikKLQkJCXNsb3R3ID0gTlVMTDsKLQl9Ci0JaWYgKHNsb3R2KSB7Ci0JCWlmIChzbG90dyAmJiBQeVR5cGVfSXNTdWJ0eXBlKHctPm9iX3R5cGUsIHYtPm9iX3R5cGUpKSB7Ci0JCQl4ID0gc2xvdHcodiwgdyk7Ci0JCQlpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCQlyZXR1cm4geDsKLQkJCVB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KLQkJCXNsb3R3ID0gTlVMTDsKLQkJfQotCQl4ID0gc2xvdHYodiwgdyk7Ci0JCWlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHg7Ci0JCVB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KLQl9Ci0JaWYgKHNsb3R3KSB7Ci0JCXggPSBzbG90dyh2LCB3KTsKLQkJaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4geDsKLQkJUHlfREVDUkVGKHgpOyAvKiBjYW4ndCBkbyBpdCAqLwotCX0KLQlpZiAoIU5FV19TVFlMRV9OVU1CRVIodikgfHwgIU5FV19TVFlMRV9OVU1CRVIodykpIHsKLQkJaW50IGVyciA9IFB5TnVtYmVyX0NvZXJjZUV4KCZ2LCAmdyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoZXJyID09IDApIHsKLQkJCVB5TnVtYmVyTWV0aG9kcyAqbXYgPSB2LT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JCQlpZiAobXYpIHsKLQkJCQliaW5hcnlmdW5jIHNsb3Q7Ci0JCQkJc2xvdCA9IE5CX0JJTk9QKG12LCBvcF9zbG90KTsKLQkJCQlpZiAoc2xvdCkgewotCQkJCQl4ID0gc2xvdCh2LCB3KTsKLQkJCQkJUHlfREVDUkVGKHYpOwotCQkJCQlQeV9ERUNSRUYodyk7Ci0JCQkJCXJldHVybiB4OwotCQkJCX0KLQkJCX0KLQkJCS8qIENvZXJjZUV4IGluY3JlbWVudGVkIHRoZSByZWZlcmVuY2UgY291bnRzICovCi0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCX0KLQl9Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgaWYgKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmIE5FV19TVFlMRV9OVU1CRVIodikpCisgICAgICAgIHNsb3R2ID0gTkJfQklOT1Aodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLCBvcF9zbG90KTsKKyAgICBpZiAody0+b2JfdHlwZSAhPSB2LT5vYl90eXBlICYmCisgICAgICAgIHctPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmIE5FV19TVFlMRV9OVU1CRVIodykpIHsKKyAgICAgICAgc2xvdHcgPSBOQl9CSU5PUCh3LT5vYl90eXBlLT50cF9hc19udW1iZXIsIG9wX3Nsb3QpOworICAgICAgICBpZiAoc2xvdHcgPT0gc2xvdHYpCisgICAgICAgICAgICBzbG90dyA9IE5VTEw7CisgICAgfQorICAgIGlmIChzbG90dikgeworICAgICAgICBpZiAoc2xvdHcgJiYgUHlUeXBlX0lzU3VidHlwZSh3LT5vYl90eXBlLCB2LT5vYl90eXBlKSkgeworICAgICAgICAgICAgeCA9IHNsb3R3KHYsIHcpOworICAgICAgICAgICAgaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICBQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCisgICAgICAgICAgICBzbG90dyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgeCA9IHNsb3R2KHYsIHcpOworICAgICAgICBpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBQeV9ERUNSRUYoeCk7IC8qIGNhbid0IGRvIGl0ICovCisgICAgfQorICAgIGlmIChzbG90dykgeworICAgICAgICB4ID0gc2xvdHcodiwgdyk7CisgICAgICAgIGlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIFB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KKyAgICB9CisgICAgaWYgKCFORVdfU1RZTEVfTlVNQkVSKHYpIHx8ICFORVdfU1RZTEVfTlVNQkVSKHcpKSB7CisgICAgICAgIGludCBlcnIgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICBQeU51bWJlck1ldGhvZHMgKm12ID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgICAgICAgICAgaWYgKG12KSB7CisgICAgICAgICAgICAgICAgYmluYXJ5ZnVuYyBzbG90OworICAgICAgICAgICAgICAgIHNsb3QgPSBOQl9CSU5PUChtdiwgb3Bfc2xvdCk7CisgICAgICAgICAgICAgICAgaWYgKHNsb3QpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IHNsb3Qodiwgdyk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDb2VyY2VFeCBpbmNyZW1lbnRlZCB0aGUgcmVmZXJlbmNlIGNvdW50cyAqLworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICB9CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYmlub3BfdHlwZV9lcnJvcihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGNvbnN0IGNoYXIgKm9wX25hbWUpCiB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAlLjEwMHM6ICIKLQkJICAgICAiJyUuMTAwcycgYW5kICclLjEwMHMnIiwKLQkJICAgICBvcF9uYW1lLAotCQkgICAgIHYtPm9iX3R5cGUtPnRwX25hbWUsCi0JCSAgICAgdy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgJS4xMDBzOiAiCisgICAgICAgICAgICAgICAgICInJS4xMDBzJyBhbmQgJyUuMTAwcyciLAorICAgICAgICAgICAgICAgICBvcF9uYW1lLAorICAgICAgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICB3LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFyeV9vcChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGNvbnN0IGludCBvcF9zbG90LCBjb25zdCBjaGFyICpvcF9uYW1lKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfb3AxKHYsIHcsIG9wX3Nsb3QpOwotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBiaW5vcF90eXBlX2Vycm9yKHYsIHcsIG9wX25hbWUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfb3AxKHYsIHcsIG9wX3Nsb3QpOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBiaW5vcF90eXBlX2Vycm9yKHYsIHcsIG9wX25hbWUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKQEAgLTk4MCwxNiArOTgwLDE2IEBACiAKICAgKioqIEluIHNvbWUgY2FzZXMsIHcub3AgaXMgY2FsbGVkIGJlZm9yZSB2Lm9wOyBzZWUgYmluYXJ5X29wMS4gKioqCiAKLSAgdgl3CXoJQWN0aW9uCisgIHYgICAgIHcgICAgICAgeiAgICAgICBBY3Rpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBuZXcJbmV3CW5ldwl2Lm9wKHYsdyx6KSwgdy5vcCh2LHcseiksIHoub3Aodix3LHopCi0gIG5ldwlvbGQJbmV3CXYub3Aodix3LHopLCB6Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKLSAgb2xkCW5ldwluZXcJdy5vcCh2LHcseiksIHoub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQotICBvbGQJb2xkCW5ldwl6Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKLSAgbmV3CW5ldwlvbGQJdi5vcCh2LHcseiksIHcub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQotICBuZXcJb2xkCW9sZAl2Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKLSAgb2xkCW5ldwlvbGQJdy5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCi0gIG9sZAlvbGQJb2xkCWNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCisgIG5ldyAgIG5ldyAgICAgbmV3ICAgICB2Lm9wKHYsdyx6KSwgdy5vcCh2LHcseiksIHoub3Aodix3LHopCisgIG5ldyAgIG9sZCAgICAgbmV3ICAgICB2Lm9wKHYsdyx6KSwgei5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCisgIG9sZCAgIG5ldyAgICAgbmV3ICAgICB3Lm9wKHYsdyx6KSwgei5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCisgIG9sZCAgIG9sZCAgICAgbmV3ICAgICB6Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKKyAgbmV3ICAgbmV3ICAgICBvbGQgICAgIHYub3Aodix3LHopLCB3Lm9wKHYsdyx6KSwgY29lcmNlKHYsdyx6KSwgdi5vcCh2LHcseikKKyAgbmV3ICAgb2xkICAgICBvbGQgICAgIHYub3Aodix3LHopLCBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQorICBvbGQgICBuZXcgICAgIG9sZCAgICAgdy5vcCh2LHcseiksIGNvZXJjZSh2LHcseiksIHYub3Aodix3LHopCisgIG9sZCAgIG9sZCAgICAgb2xkICAgICBjb2VyY2Uodix3LHopLCB2Lm9wKHYsdyx6KQogCiAgIExlZ2VuZDoKICAgLS0tLS0tLQpAQCAtMTAwNSwxNDEgKzEwMDUsMTQxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0ZXJuYXJ5X29wKFB5T2JqZWN0ICp2LAotCSAgIFB5T2JqZWN0ICp3LAotCSAgIFB5T2JqZWN0ICp6LAotCSAgIGNvbnN0IGludCBvcF9zbG90LAotCSAgIGNvbnN0IGNoYXIgKm9wX25hbWUpCisgICAgICAgICAgIFB5T2JqZWN0ICp3LAorICAgICAgICAgICBQeU9iamVjdCAqeiwKKyAgICAgICAgICAgY29uc3QgaW50IG9wX3Nsb3QsCisgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wX25hbWUpCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptdiwgKm13LCAqbXo7Ci0JUHlPYmplY3QgKnggPSBOVUxMOwotCXRlcm5hcnlmdW5jIHNsb3R2ID0gTlVMTDsKLQl0ZXJuYXJ5ZnVuYyBzbG90dyA9IE5VTEw7Ci0JdGVybmFyeWZ1bmMgc2xvdHogPSBOVUxMOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbXYsICptdywgKm16OworICAgIFB5T2JqZWN0ICp4ID0gTlVMTDsKKyAgICB0ZXJuYXJ5ZnVuYyBzbG90diA9IE5VTEw7CisgICAgdGVybmFyeWZ1bmMgc2xvdHcgPSBOVUxMOworICAgIHRlcm5hcnlmdW5jIHNsb3R6ID0gTlVMTDsKIAotCW12ID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCW13ID0gdy0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChtdiAhPSBOVUxMICYmIE5FV19TVFlMRV9OVU1CRVIodikpCi0JCXNsb3R2ID0gTkJfVEVSTk9QKG12LCBvcF9zbG90KTsKLQlpZiAody0+b2JfdHlwZSAhPSB2LT5vYl90eXBlICYmCi0JICAgIG13ICE9IE5VTEwgJiYgTkVXX1NUWUxFX05VTUJFUih3KSkgewotCQlzbG90dyA9IE5CX1RFUk5PUChtdywgb3Bfc2xvdCk7Ci0JCWlmIChzbG90dyA9PSBzbG90dikKLQkJCXNsb3R3ID0gTlVMTDsKLQl9Ci0JaWYgKHNsb3R2KSB7Ci0JCWlmIChzbG90dyAmJiBQeVR5cGVfSXNTdWJ0eXBlKHctPm9iX3R5cGUsIHYtPm9iX3R5cGUpKSB7Ci0JCQl4ID0gc2xvdHcodiwgdywgeik7Ci0JCQlpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCQlyZXR1cm4geDsKLQkJCVB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KLQkJCXNsb3R3ID0gTlVMTDsKLQkJfQotCQl4ID0gc2xvdHYodiwgdywgeik7Ci0JCWlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHg7Ci0JCVB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KLQl9Ci0JaWYgKHNsb3R3KSB7Ci0JCXggPSBzbG90dyh2LCB3LCB6KTsKLQkJaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4geDsKLQkJUHlfREVDUkVGKHgpOyAvKiBjYW4ndCBkbyBpdCAqLwotCX0KLQlteiA9IHotPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobXogIT0gTlVMTCAmJiBORVdfU1RZTEVfTlVNQkVSKHopKSB7Ci0JCXNsb3R6ID0gTkJfVEVSTk9QKG16LCBvcF9zbG90KTsKLQkJaWYgKHNsb3R6ID09IHNsb3R2IHx8IHNsb3R6ID09IHNsb3R3KQotCQkJc2xvdHogPSBOVUxMOwotCQlpZiAoc2xvdHopIHsKLQkJCXggPSBzbG90eih2LCB3LCB6KTsKLQkJCWlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJCXJldHVybiB4OwotCQkJUHlfREVDUkVGKHgpOyAvKiBjYW4ndCBkbyBpdCAqLwotCQl9Ci0JfQorICAgIG12ID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIG13ID0gdy0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIGlmIChtdiAhPSBOVUxMICYmIE5FV19TVFlMRV9OVU1CRVIodikpCisgICAgICAgIHNsb3R2ID0gTkJfVEVSTk9QKG12LCBvcF9zbG90KTsKKyAgICBpZiAody0+b2JfdHlwZSAhPSB2LT5vYl90eXBlICYmCisgICAgICAgIG13ICE9IE5VTEwgJiYgTkVXX1NUWUxFX05VTUJFUih3KSkgeworICAgICAgICBzbG90dyA9IE5CX1RFUk5PUChtdywgb3Bfc2xvdCk7CisgICAgICAgIGlmIChzbG90dyA9PSBzbG90dikKKyAgICAgICAgICAgIHNsb3R3ID0gTlVMTDsKKyAgICB9CisgICAgaWYgKHNsb3R2KSB7CisgICAgICAgIGlmIChzbG90dyAmJiBQeVR5cGVfSXNTdWJ0eXBlKHctPm9iX3R5cGUsIHYtPm9iX3R5cGUpKSB7CisgICAgICAgICAgICB4ID0gc2xvdHcodiwgdywgeik7CisgICAgICAgICAgICBpZiAoeCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KKyAgICAgICAgICAgIHNsb3R3ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB4ID0gc2xvdHYodiwgdywgeik7CisgICAgICAgIGlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIFB5X0RFQ1JFRih4KTsgLyogY2FuJ3QgZG8gaXQgKi8KKyAgICB9CisgICAgaWYgKHNsb3R3KSB7CisgICAgICAgIHggPSBzbG90dyh2LCB3LCB6KTsKKyAgICAgICAgaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgUHlfREVDUkVGKHgpOyAvKiBjYW4ndCBkbyBpdCAqLworICAgIH0KKyAgICBteiA9IHotPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobXogIT0gTlVMTCAmJiBORVdfU1RZTEVfTlVNQkVSKHopKSB7CisgICAgICAgIHNsb3R6ID0gTkJfVEVSTk9QKG16LCBvcF9zbG90KTsKKyAgICAgICAgaWYgKHNsb3R6ID09IHNsb3R2IHx8IHNsb3R6ID09IHNsb3R3KQorICAgICAgICAgICAgc2xvdHogPSBOVUxMOworICAgICAgICBpZiAoc2xvdHopIHsKKyAgICAgICAgICAgIHggPSBzbG90eih2LCB3LCB6KTsKKyAgICAgICAgICAgIGlmICh4ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICAgICAgUHlfREVDUkVGKHgpOyAvKiBjYW4ndCBkbyBpdCAqLworICAgICAgICB9CisgICAgfQogCi0JaWYgKCFORVdfU1RZTEVfTlVNQkVSKHYpIHx8ICFORVdfU1RZTEVfTlVNQkVSKHcpIHx8Ci0JCQkoeiAhPSBQeV9Ob25lICYmICFORVdfU1RZTEVfTlVNQkVSKHopKSkgewotCQkvKiB3ZSBoYXZlIGFuIG9sZCBzdHlsZSBvcGVyYW5kLCBjb2VyY2UgKi8KLQkJUHlPYmplY3QgKnYxLCAqejEsICp3MiwgKnoyOwotCQlpbnQgYzsKKyAgICBpZiAoIU5FV19TVFlMRV9OVU1CRVIodikgfHwgIU5FV19TVFlMRV9OVU1CRVIodykgfHwKKyAgICAgICAgICAgICAgICAgICAgKHogIT0gUHlfTm9uZSAmJiAhTkVXX1NUWUxFX05VTUJFUih6KSkpIHsKKyAgICAgICAgLyogd2UgaGF2ZSBhbiBvbGQgc3R5bGUgb3BlcmFuZCwgY29lcmNlICovCisgICAgICAgIFB5T2JqZWN0ICp2MSwgKnoxLCAqdzIsICp6MjsKKyAgICAgICAgaW50IGM7CiAKLQkJYyA9IFB5TnVtYmVyX0NvZXJjZSgmdiwgJncpOwotCQlpZiAoYyAhPSAwKQotCQkJZ290byBlcnJvcjM7CisgICAgICAgIGMgPSBQeU51bWJlcl9Db2VyY2UoJnYsICZ3KTsKKyAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3IzOwogCi0JCS8qIFNwZWNpYWwgY2FzZTogaWYgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIE5vbmUsIGl0IGlzCi0JCSAgIHRyZWF0ZWQgYXMgYWJzZW50IGFyZ3VtZW50IGFuZCBub3QgY29lcmNlZC4gKi8KLQkJaWYgKHogPT0gUHlfTm9uZSkgewotCQkJaWYgKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcikgewotCQkJCXNsb3R6ID0gTkJfVEVSTk9QKHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciwKLQkJCQkJCSAgb3Bfc2xvdCk7Ci0JCQkJaWYgKHNsb3R6KQotCQkJCQl4ID0gc2xvdHoodiwgdywgeik7Ci0JCQkJZWxzZQotCQkJCQljID0gLTE7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJYyA9IC0xOwotCQkJZ290byBlcnJvcjI7Ci0JCX0KLQkJdjEgPSB2OwotCQl6MSA9IHo7Ci0JCWMgPSBQeU51bWJlcl9Db2VyY2UoJnYxLCAmejEpOwotCQlpZiAoYyAhPSAwKQotCQkJZ290byBlcnJvcjI7Ci0JCXcyID0gdzsKLQkJejIgPSB6MTsKLQkJYyA9IFB5TnVtYmVyX0NvZXJjZSgmdzIsICZ6Mik7Ci0JCWlmIChjICE9IDApCi0JCQlnb3RvIGVycm9yMTsKKyAgICAgICAgLyogU3BlY2lhbCBjYXNlOiBpZiB0aGUgdGhpcmQgYXJndW1lbnQgaXMgTm9uZSwgaXQgaXMKKyAgICAgICAgICAgdHJlYXRlZCBhcyBhYnNlbnQgYXJndW1lbnQgYW5kIG5vdCBjb2VyY2VkLiAqLworICAgICAgICBpZiAoeiA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBpZiAodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyKSB7CisgICAgICAgICAgICAgICAgc2xvdHogPSBOQl9URVJOT1Aodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3Nsb3QpOworICAgICAgICAgICAgICAgIGlmIChzbG90eikKKyAgICAgICAgICAgICAgICAgICAgeCA9IHNsb3R6KHYsIHcsIHopOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYyA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3IyOworICAgICAgICB9CisgICAgICAgIHYxID0gdjsKKyAgICAgICAgejEgPSB6OworICAgICAgICBjID0gUHlOdW1iZXJfQ29lcmNlKCZ2MSwgJnoxKTsKKyAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3IyOworICAgICAgICB3MiA9IHc7CisgICAgICAgIHoyID0gejE7CisgICAgICAgIGMgPSBQeU51bWJlcl9Db2VyY2UoJncyLCAmejIpOworICAgICAgICBpZiAoYyAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcjE7CiAKLQkJaWYgKHYxLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCkgewotCQkJc2xvdHYgPSBOQl9URVJOT1AodjEtPm9iX3R5cGUtPnRwX2FzX251bWJlciwKLQkJCQkJICBvcF9zbG90KTsKLQkJCWlmIChzbG90dikKLQkJCQl4ID0gc2xvdHYodjEsIHcyLCB6Mik7Ci0JCQllbHNlCi0JCQkJYyA9IC0xOwotCQl9Ci0JCWVsc2UKLQkJCWMgPSAtMTsKKyAgICAgICAgaWYgKHYxLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgc2xvdHYgPSBOQl9URVJOT1AodjEtPm9iX3R5cGUtPnRwX2FzX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX3Nsb3QpOworICAgICAgICAgICAgaWYgKHNsb3R2KQorICAgICAgICAgICAgICAgIHggPSBzbG90dih2MSwgdzIsIHoyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYyA9IC0xOwogCi0JCVB5X0RFQ1JFRih3Mik7Ci0JCVB5X0RFQ1JFRih6Mik7Ci0JZXJyb3IxOgotCQlQeV9ERUNSRUYodjEpOwotCQlQeV9ERUNSRUYoejEpOwotCWVycm9yMjoKLQkJUHlfREVDUkVGKHYpOwotCQlQeV9ERUNSRUYodyk7Ci0JZXJyb3IzOgotCQlpZiAoYyA+PSAwKQotCQkJcmV0dXJuIHg7Ci0JfQorICAgICAgICBQeV9ERUNSRUYodzIpOworICAgICAgICBQeV9ERUNSRUYoejIpOworICAgIGVycm9yMToKKyAgICAgICAgUHlfREVDUkVGKHYxKTsKKyAgICAgICAgUHlfREVDUkVGKHoxKTsKKyAgICBlcnJvcjI6CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgUHlfREVDUkVGKHcpOworICAgIGVycm9yMzoKKyAgICAgICAgaWYgKGMgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiB4OworICAgIH0KIAotCWlmICh6ID09IFB5X05vbmUpCi0JCVB5RXJyX0Zvcm1hdCgKLQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCSJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICoqIG9yIHBvdygpOiAiCi0JCQkiJyUuMTAwcycgYW5kICclLjEwMHMnIiwKLQkJCXYtPm9iX3R5cGUtPnRwX25hbWUsCi0JCQl3LT5vYl90eXBlLT50cF9uYW1lKTsKLQllbHNlCi0JCVB5RXJyX0Zvcm1hdCgKLQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCSJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHBvdygpOiAiCi0JCQkiJyUuMTAwcycsICclLjEwMHMnLCAnJS4xMDBzJyIsCi0JCQl2LT5vYl90eXBlLT50cF9uYW1lLAotCQkJdy0+b2JfdHlwZS0+dHBfbmFtZSwKLQkJCXotPm9iX3R5cGUtPnRwX25hbWUpOwotCXJldHVybiBOVUxMOworICAgIGlmICh6ID09IFB5X05vbmUpCisgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICoqIG9yIHBvdygpOiAiCisgICAgICAgICAgICAiJyUuMTAwcycgYW5kICclLjEwMHMnIiwKKyAgICAgICAgICAgIHYtPm9iX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICB3LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICBlbHNlCisgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIHBvdygpOiAiCisgICAgICAgICAgICAiJyUuMTAwcycsICclLjEwMHMnLCAnJS4xMDBzJyIsCisgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgdy0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgIHotPm9iX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiAjZGVmaW5lIEJJTkFSWV9GVU5DKGZ1bmMsIG9wLCBvcF9uYW1lKSBcCiAgICAgUHlPYmplY3QgKiBcCiAgICAgZnVuYyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpIHsgXAotCSAgICByZXR1cm4gYmluYXJ5X29wKHYsIHcsIE5CX1NMT1Qob3ApLCBvcF9uYW1lKTsgXAorICAgICAgICByZXR1cm4gYmluYXJ5X29wKHYsIHcsIE5CX1NMT1Qob3ApLCBvcF9uYW1lKTsgXAogICAgIH0KIAogQklOQVJZX0ZVTkMoUHlOdW1iZXJfT3IsIG5iX29yLCAifCIpCkBAIC0xMTU0LDc3ICsxMTU0LDc3IEBACiBQeU9iamVjdCAqCiBQeU51bWJlcl9BZGQoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfb3AxKHYsIHcsIE5CX1NMT1QobmJfYWRkKSk7Ci0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeVNlcXVlbmNlTWV0aG9kcyAqbSA9IHYtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJaWYgKG0gJiYgbS0+c3FfY29uY2F0KSB7Ci0JCQlyZXR1cm4gKCptLT5zcV9jb25jYXQpKHYsIHcpOwotCQl9Ci0JCXJlc3VsdCA9IGJpbm9wX3R5cGVfZXJyb3IodiwgdywgIisiKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X29wMSh2LCB3LCBOQl9TTE9UKG5iX2FkZCkpOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm0gPSB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIGlmIChtICYmIG0tPnNxX2NvbmNhdCkgeworICAgICAgICAgICAgcmV0dXJuICgqbS0+c3FfY29uY2F0KSh2LCB3KTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIrIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXF1ZW5jZV9yZXBlYXQoc3NpemVhcmdmdW5jIHJlcGVhdGZ1bmMsIFB5T2JqZWN0ICpzZXEsIFB5T2JqZWN0ICpuKQogewotCVB5X3NzaXplX3QgY291bnQ7Ci0JaWYgKFB5SW5kZXhfQ2hlY2sobikpIHsKLQkJY291bnQgPSBQeU51bWJlcl9Bc1NzaXplX3QobiwgUHlFeGNfT3ZlcmZsb3dFcnJvcik7Ci0JCWlmIChjb3VudCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gdHlwZV9lcnJvcigiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgIgotCQkJCSAgIm5vbi1pbnQgb2YgdHlwZSAnJS4yMDBzJyIsIG4pOwotCX0KLQlyZXR1cm4gKCpyZXBlYXRmdW5jKShzZXEsIGNvdW50KTsKKyAgICBQeV9zc2l6ZV90IGNvdW50OworICAgIGlmIChQeUluZGV4X0NoZWNrKG4pKSB7CisgICAgICAgIGNvdW50ID0gUHlOdW1iZXJfQXNTc2l6ZV90KG4sIFB5RXhjX092ZXJmbG93RXJyb3IpOworICAgICAgICBpZiAoY291bnQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHR5cGVfZXJyb3IoImNhbid0IG11bHRpcGx5IHNlcXVlbmNlIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1pbnQgb2YgdHlwZSAnJS4yMDBzJyIsIG4pOworICAgIH0KKyAgICByZXR1cm4gKCpyZXBlYXRmdW5jKShzZXEsIGNvdW50KTsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfTXVsdGlwbHkoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBiaW5hcnlfb3AxKHYsIHcsIE5CX1NMT1QobmJfbXVsdGlwbHkpKTsKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCVB5U2VxdWVuY2VNZXRob2RzICptdiA9IHYtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCQlQeVNlcXVlbmNlTWV0aG9kcyAqbXcgPSB3LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCWlmICAobXYgJiYgbXYtPnNxX3JlcGVhdCkgewotCQkJcmV0dXJuIHNlcXVlbmNlX3JlcGVhdChtdi0+c3FfcmVwZWF0LCB2LCB3KTsKLQkJfQotCQllbHNlIGlmIChtdyAmJiBtdy0+c3FfcmVwZWF0KSB7Ci0JCQlyZXR1cm4gc2VxdWVuY2VfcmVwZWF0KG13LT5zcV9yZXBlYXQsIHcsIHYpOwotCQl9Ci0JCXJlc3VsdCA9IGJpbm9wX3R5cGVfZXJyb3IodiwgdywgIioiKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X29wMSh2LCB3LCBOQl9TTE9UKG5iX211bHRpcGx5KSk7CisgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgeworICAgICAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbXYgPSB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm13ID0gdy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBpZiAgKG12ICYmIG12LT5zcV9yZXBlYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZV9yZXBlYXQobXYtPnNxX3JlcGVhdCwgdiwgdyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobXcgJiYgbXctPnNxX3JlcGVhdCkgeworICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlX3JlcGVhdChtdy0+c3FfcmVwZWF0LCB3LCB2KTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIqIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0Zsb29yRGl2aWRlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQkvKiBYWFggdHBfZmxhZ3MgdGVzdCAqLwotCXJldHVybiBiaW5hcnlfb3AodiwgdywgTkJfU0xPVChuYl9mbG9vcl9kaXZpZGUpLCAiLy8iKTsKKyAgICAvKiBYWFggdHBfZmxhZ3MgdGVzdCAqLworICAgIHJldHVybiBiaW5hcnlfb3AodiwgdywgTkJfU0xPVChuYl9mbG9vcl9kaXZpZGUpLCAiLy8iKTsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfVHJ1ZURpdmlkZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KLQlyZXR1cm4gYmluYXJ5X29wKHYsIHcsIE5CX1NMT1QobmJfdHJ1ZV9kaXZpZGUpLCAiLyIpOworICAgIC8qIFhYWCB0cF9mbGFncyB0ZXN0ICovCisgICAgcmV0dXJuIGJpbmFyeV9vcCh2LCB3LCBOQl9TTE9UKG5iX3RydWVfZGl2aWRlKSwgIi8iKTsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfUmVtYWluZGVyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlyZXR1cm4gYmluYXJ5X29wKHYsIHcsIE5CX1NMT1QobmJfcmVtYWluZGVyKSwgIiUiKTsKKyAgICByZXR1cm4gYmluYXJ5X29wKHYsIHcsIE5CX1NMT1QobmJfcmVtYWluZGVyKSwgIiUiKTsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfUG93ZXIoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBQeU9iamVjdCAqeikKIHsKLQlyZXR1cm4gdGVybmFyeV9vcCh2LCB3LCB6LCBOQl9TTE9UKG5iX3Bvd2VyKSwgIioqIG9yIHBvdygpIik7CisgICAgcmV0dXJuIHRlcm5hcnlfb3AodiwgdywgeiwgTkJfU0xPVChuYl9wb3dlciksICIqKiBvciBwb3coKSIpOwogfQogCiAvKiBCaW5hcnkgaW4tcGxhY2Ugb3BlcmF0b3JzICovCkBAIC0xMjQ0LDQyICsxMjQ0LDQyIEBACiAgICAqLwogCiAjZGVmaW5lIEhBU0lOUExBQ0UodCkgXAotCVB5VHlwZV9IYXNGZWF0dXJlKCh0KS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMpCisgICAgUHlUeXBlX0hhc0ZlYXR1cmUoKHQpLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUykKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFyeV9pb3AxKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgY29uc3QgaW50IGlvcF9zbG90LCBjb25zdCBpbnQgb3Bfc2xvdCkKIHsKLQlQeU51bWJlck1ldGhvZHMgKm12ID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChtdiAhPSBOVUxMICYmIEhBU0lOUExBQ0UodikpIHsKLQkJYmluYXJ5ZnVuYyBzbG90ID0gTkJfQklOT1AobXYsIGlvcF9zbG90KTsKLQkJaWYgKHNsb3QpIHsKLQkJCVB5T2JqZWN0ICp4ID0gKHNsb3QpKHYsIHcpOwotCQkJaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJCQlyZXR1cm4geDsKLQkJCX0KLQkJCVB5X0RFQ1JFRih4KTsKLQkJfQotCX0KLQlyZXR1cm4gYmluYXJ5X29wMSh2LCB3LCBvcF9zbG90KTsKKyAgICBQeU51bWJlck1ldGhvZHMgKm12ID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIGlmIChtdiAhPSBOVUxMICYmIEhBU0lOUExBQ0UodikpIHsKKyAgICAgICAgYmluYXJ5ZnVuYyBzbG90ID0gTkJfQklOT1AobXYsIGlvcF9zbG90KTsKKyAgICAgICAgaWYgKHNsb3QpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp4ID0gKHNsb3QpKHYsIHcpOworICAgICAgICAgICAgaWYgKHggIT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmluYXJ5X29wMSh2LCB3LCBvcF9zbG90KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJpbmFyeV9pb3AoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjb25zdCBpbnQgaW9wX3Nsb3QsIGNvbnN0IGludCBvcF9zbG90LAotCQljb25zdCBjaGFyICpvcF9uYW1lKQorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wX25hbWUpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9pb3AxKHYsIHcsIGlvcF9zbG90LCBvcF9zbG90KTsKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gYmlub3BfdHlwZV9lcnJvcih2LCB3LCBvcF9uYW1lKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X2lvcDEodiwgdywgaW9wX3Nsb3QsIG9wX3Nsb3QpOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBiaW5vcF90eXBlX2Vycm9yKHYsIHcsIG9wX25hbWUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAjZGVmaW5lIElOUExBQ0VfQklOT1AoZnVuYywgaW9wLCBvcCwgb3BfbmFtZSkgXAotCVB5T2JqZWN0ICogXAotCWZ1bmMoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KSB7IFwKLQkJcmV0dXJuIGJpbmFyeV9pb3AodiwgdywgTkJfU0xPVChpb3ApLCBOQl9TTE9UKG9wKSwgb3BfbmFtZSk7IFwKLQl9CisgICAgUHlPYmplY3QgKiBcCisgICAgZnVuYyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpIHsgXAorICAgICAgICByZXR1cm4gYmluYXJ5X2lvcCh2LCB3LCBOQl9TTE9UKGlvcCksIE5CX1NMT1Qob3ApLCBvcF9uYW1lKTsgXAorICAgIH0KIAogSU5QTEFDRV9CSU5PUChQeU51bWJlcl9JblBsYWNlT3IsIG5iX2lucGxhY2Vfb3IsIG5iX29yLCAifD0iKQogSU5QTEFDRV9CSU5PUChQeU51bWJlcl9JblBsYWNlWG9yLCBuYl9pbnBsYWNlX3hvciwgbmJfeG9yLCAiXj0iKQpAQCAtMTI5Miw4OCArMTI5Miw4OCBAQAogUHlPYmplY3QgKgogUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQkvKiBYWFggdHBfZmxhZ3MgdGVzdCAqLwotCXJldHVybiBiaW5hcnlfaW9wKHYsIHcsIE5CX1NMT1QobmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUpLAotCQkJICBOQl9TTE9UKG5iX2Zsb29yX2RpdmlkZSksICIvLz0iKTsKKyAgICAvKiBYWFggdHBfZmxhZ3MgdGVzdCAqLworICAgIHJldHVybiBiaW5hcnlfaW9wKHYsIHcsIE5CX1NMT1QobmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUpLAorICAgICAgICAgICAgICAgICAgICAgIE5CX1NMT1QobmJfZmxvb3JfZGl2aWRlKSwgIi8vPSIpOwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KLQlyZXR1cm4gYmluYXJ5X2lvcCh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUpLAotCQkJICBOQl9TTE9UKG5iX3RydWVfZGl2aWRlKSwgIi89Iik7CisgICAgLyogWFhYIHRwX2ZsYWdzIHRlc3QgKi8KKyAgICByZXR1cm4gYmluYXJ5X2lvcCh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUpLAorICAgICAgICAgICAgICAgICAgICAgIE5CX1NMT1QobmJfdHJ1ZV9kaXZpZGUpLCAiLz0iKTsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfSW5QbGFjZUFkZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9pb3AxKHYsIHcsIE5CX1NMT1QobmJfaW5wbGFjZV9hZGQpLAotCQkJCSAgICAgICBOQl9TTE9UKG5iX2FkZCkpOwotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJUHlTZXF1ZW5jZU1ldGhvZHMgKm0gPSB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCWlmIChtICE9IE5VTEwpIHsKLQkJCWJpbmFyeWZ1bmMgZiA9IE5VTEw7Ci0JCQlpZiAoSEFTSU5QTEFDRSh2KSkKLQkJCQlmID0gbS0+c3FfaW5wbGFjZV9jb25jYXQ7Ci0JCQlpZiAoZiA9PSBOVUxMKQotCQkJCWYgPSBtLT5zcV9jb25jYXQ7Ci0JCQlpZiAoZiAhPSBOVUxMKQotCQkJCXJldHVybiAoKmYpKHYsIHcpOwotCQl9Ci0JCXJlc3VsdCA9IGJpbm9wX3R5cGVfZXJyb3IodiwgdywgIis9Iik7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9pb3AxKHYsIHcsIE5CX1NMT1QobmJfaW5wbGFjZV9hZGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9TTE9UKG5iX2FkZCkpOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm0gPSB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIGlmIChtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJpbmFyeWZ1bmMgZiA9IE5VTEw7CisgICAgICAgICAgICBpZiAoSEFTSU5QTEFDRSh2KSkKKyAgICAgICAgICAgICAgICBmID0gbS0+c3FfaW5wbGFjZV9jb25jYXQ7CisgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGYgPSBtLT5zcV9jb25jYXQ7CisgICAgICAgICAgICBpZiAoZiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAoKmYpKHYsIHcpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IGJpbm9wX3R5cGVfZXJyb3IodiwgdywgIis9Iik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9pb3AxKHYsIHcsIE5CX1NMT1QobmJfaW5wbGFjZV9tdWx0aXBseSksCi0JCQkJICAgICAgIE5CX1NMT1QobmJfbXVsdGlwbHkpKTsKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCXNzaXplYXJnZnVuYyBmID0gTlVMTDsKLQkJUHlTZXF1ZW5jZU1ldGhvZHMgKm12ID0gdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JCVB5U2VxdWVuY2VNZXRob2RzICptdyA9IHctPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJaWYgKG12ICE9IE5VTEwpIHsKLQkJCWlmIChIQVNJTlBMQUNFKHYpKQotCQkJCWYgPSBtdi0+c3FfaW5wbGFjZV9yZXBlYXQ7Ci0JCQlpZiAoZiA9PSBOVUxMKQotCQkJCWYgPSBtdi0+c3FfcmVwZWF0OwotCQkJaWYgKGYgIT0gTlVMTCkKLQkJCQlyZXR1cm4gc2VxdWVuY2VfcmVwZWF0KGYsIHYsIHcpOwotCQl9Ci0JCWVsc2UgaWYgKG13ICE9IE5VTEwpIHsKLQkJCS8qIE5vdGUgdGhhdCB0aGUgcmlnaHQgaGFuZCBvcGVyYW5kIHNob3VsZCBub3QgYmUKLQkJCSAqIG11dGF0ZWQgaW4gdGhpcyBjYXNlIHNvIHNxX2lucGxhY2VfcmVwZWF0IGlzIG5vdAotCQkJICogdXNlZC4gKi8KLQkJCWlmIChtdy0+c3FfcmVwZWF0KQotCQkJCXJldHVybiBzZXF1ZW5jZV9yZXBlYXQobXctPnNxX3JlcGVhdCwgdywgdik7Ci0JCX0KLQkJcmVzdWx0ID0gYmlub3BfdHlwZV9lcnJvcih2LCB3LCAiKj0iKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X2lvcDEodiwgdywgTkJfU0xPVChuYl9pbnBsYWNlX211bHRpcGx5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJfU0xPVChuYl9tdWx0aXBseSkpOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgc3NpemVhcmdmdW5jIGYgPSBOVUxMOworICAgICAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbXYgPSB2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICAgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm13ID0gdy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICBpZiAobXYgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKEhBU0lOUExBQ0UodikpCisgICAgICAgICAgICAgICAgZiA9IG12LT5zcV9pbnBsYWNlX3JlcGVhdDsKKyAgICAgICAgICAgIGlmIChmID09IE5VTEwpCisgICAgICAgICAgICAgICAgZiA9IG12LT5zcV9yZXBlYXQ7CisgICAgICAgICAgICBpZiAoZiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZV9yZXBlYXQoZiwgdiwgdyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobXcgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogTm90ZSB0aGF0IHRoZSByaWdodCBoYW5kIG9wZXJhbmQgc2hvdWxkIG5vdCBiZQorICAgICAgICAgICAgICogbXV0YXRlZCBpbiB0aGlzIGNhc2Ugc28gc3FfaW5wbGFjZV9yZXBlYXQgaXMgbm90CisgICAgICAgICAgICAgKiB1c2VkLiAqLworICAgICAgICAgICAgaWYgKG13LT5zcV9yZXBlYXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlX3JlcGVhdChtdy0+c3FfcmVwZWF0LCB3LCB2KTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBiaW5vcF90eXBlX2Vycm9yKHYsIHcsICIqPSIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9JblBsYWNlUmVtYWluZGVyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlyZXR1cm4gYmluYXJ5X2lvcCh2LCB3LCBOQl9TTE9UKG5iX2lucGxhY2VfcmVtYWluZGVyKSwKLQkJCQlOQl9TTE9UKG5iX3JlbWFpbmRlciksICIlPSIpOworICAgIHJldHVybiBiaW5hcnlfaW9wKHYsIHcsIE5CX1NMT1QobmJfaW5wbGFjZV9yZW1haW5kZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CX1NMT1QobmJfcmVtYWluZGVyKSwgIiU9Iik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0luUGxhY2VQb3dlcihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp6KQogewotCWlmIChIQVNJTlBMQUNFKHYpICYmIHYtPm9iX3R5cGUtPnRwX2FzX251bWJlciAmJgotCSAgICB2LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2lucGxhY2VfcG93ZXIgIT0gTlVMTCkgewotCQlyZXR1cm4gdGVybmFyeV9vcCh2LCB3LCB6LCBOQl9TTE9UKG5iX2lucGxhY2VfcG93ZXIpLCAiKio9Iik7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gdGVybmFyeV9vcCh2LCB3LCB6LCBOQl9TTE9UKG5iX3Bvd2VyKSwgIioqPSIpOwotCX0KKyAgICBpZiAoSEFTSU5QTEFDRSh2KSAmJiB2LT5vYl90eXBlLT50cF9hc19udW1iZXIgJiYKKyAgICAgICAgdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbnBsYWNlX3Bvd2VyICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHRlcm5hcnlfb3AodiwgdywgeiwgTkJfU0xPVChuYl9pbnBsYWNlX3Bvd2VyKSwgIioqPSIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHRlcm5hcnlfb3AodiwgdywgeiwgTkJfU0xPVChuYl9wb3dlciksICIqKj0iKTsKKyAgICB9CiB9CiAKIApAQCAtMTM4MiwxMTAgKzEzODIsMTEwIEBACiBQeU9iamVjdCAqCiBQeU51bWJlcl9OZWdhdGl2ZShQeU9iamVjdCAqbykKIHsKLQlQeU51bWJlck1ldGhvZHMgKm07CisgICAgUHlOdW1iZXJNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChtICYmIG0tPm5iX25lZ2F0aXZlKQotCQlyZXR1cm4gKCptLT5uYl9uZWdhdGl2ZSkobyk7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIGlmIChtICYmIG0tPm5iX25lZ2F0aXZlKQorICAgICAgICByZXR1cm4gKCptLT5uYl9uZWdhdGl2ZSkobyk7CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgLTogJyUuMjAwcyciLCBvKTsKKyAgICByZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgLTogJyUuMjAwcyciLCBvKTsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfUG9zaXRpdmUoUHlPYmplY3QgKm8pCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7Ci0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobSAmJiBtLT5uYl9wb3NpdGl2ZSkKLQkJcmV0dXJuICgqbS0+bmJfcG9zaXRpdmUpKG8pOworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobSAmJiBtLT5uYl9wb3NpdGl2ZSkKKyAgICAgICAgcmV0dXJuICgqbS0+bmJfcG9zaXRpdmUpKG8pOwogCi0JcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5ICs6ICclLjIwMHMnIiwgbyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5ICs6ICclLjIwMHMnIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0ludmVydChQeU9iamVjdCAqbykKIHsKLQlQeU51bWJlck1ldGhvZHMgKm07CisgICAgUHlOdW1iZXJNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChtICYmIG0tPm5iX2ludmVydCkKLQkJcmV0dXJuICgqbS0+bmJfaW52ZXJ0KShvKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG0gJiYgbS0+bmJfaW52ZXJ0KQorICAgICAgICByZXR1cm4gKCptLT5uYl9pbnZlcnQpKG8pOwogCi0JcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IH46ICclLjIwMHMnIiwgbyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IH46ICclLjIwMHMnIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX0Fic29sdXRlKFB5T2JqZWN0ICpvKQogewotCVB5TnVtYmVyTWV0aG9kcyAqbTsKKyAgICBQeU51bWJlck1ldGhvZHMgKm07CiAKLQlpZiAobyA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOwotCW0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JaWYgKG0gJiYgbS0+bmJfYWJzb2x1dGUpCi0JCXJldHVybiBtLT5uYl9hYnNvbHV0ZShvKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CisgICAgaWYgKG0gJiYgbS0+bmJfYWJzb2x1dGUpCisgICAgICAgIHJldHVybiBtLT5uYl9hYnNvbHV0ZShvKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciBhYnMoKTogJyUuMjAwcyciLCBvKTsKKyAgICByZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgYWJzKCk6ICclLjIwMHMnIiwgbyk7CiB9CiAKIC8qIEFkZCBhIGNoZWNrIGZvciBlbWJlZGRlZCBOVUxMLWJ5dGVzIGluIHRoZSBhcmd1bWVudC4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfZnJvbV9zdHJpbmcoY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7Ci0JY2hhciAqZW5kOwotCVB5T2JqZWN0ICp4OworICAgIGNoYXIgKmVuZDsKKyAgICBQeU9iamVjdCAqeDsKIAotCXggPSBQeUludF9Gcm9tU3RyaW5nKChjaGFyKilzLCAmZW5kLCAxMCk7Ci0JaWYgKHggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGVuZCAhPSBzICsgbGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJudWxsIGJ5dGUgaW4gYXJndW1lbnQgZm9yIGludCgpIik7Ci0JCVB5X0RFQ1JFRih4KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB4OworICAgIHggPSBQeUludF9Gcm9tU3RyaW5nKChjaGFyKilzLCAmZW5kLCAxMCk7CisgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGVuZCAhPSBzICsgbGVuKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm51bGwgYnl0ZSBpbiBhcmd1bWVudCBmb3IgaW50KCkiKTsKKyAgICAgICAgUHlfREVDUkVGKHgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHg7CiB9CiAKLS8qIFJldHVybiBhIFB5dGhvbiBJbnQgb3IgTG9uZyBmcm9tIHRoZSBvYmplY3QgaXRlbSAKKy8qIFJldHVybiBhIFB5dGhvbiBJbnQgb3IgTG9uZyBmcm9tIHRoZSBvYmplY3QgaXRlbQogICAgUmFpc2UgVHlwZUVycm9yIGlmIHRoZSByZXN1bHQgaXMgbm90IGFuIGludC1vci1sb25nCi0gICBvciBpZiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbmRleC4gCisgICBvciBpZiB0aGUgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbmRleC4KICovCiBQeU9iamVjdCAqCiBQeU51bWJlcl9JbmRleChQeU9iamVjdCAqaXRlbSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlpZiAoaXRlbSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOwotCWlmIChQeUludF9DaGVjayhpdGVtKSB8fCBQeUxvbmdfQ2hlY2soaXRlbSkpIHsKLQkJUHlfSU5DUkVGKGl0ZW0pOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJcmVzdWx0ID0gaXRlbS0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbmRleChpdGVtKTsKLQkJaWYgKHJlc3VsdCAmJgotCQkgICAgIVB5SW50X0NoZWNrKHJlc3VsdCkgJiYgIVB5TG9uZ19DaGVjayhyZXN1bHQpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIl9faW5kZXhfXyByZXR1cm5lZCBub24tKGludCxsb25nKSAiIFwKLQkJCQkgICAgICIodHlwZSAlLjIwMHMpIiwKLQkJCQkgICAgIHJlc3VsdC0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJyUuMjAwcycgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCAiCi0JCQkgICAgICJhcyBhbiBpbmRleCIsIGl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKFB5SW50X0NoZWNrKGl0ZW0pIHx8IFB5TG9uZ19DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICByZXN1bHQgPSBpdGVtLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2luZGV4KGl0ZW0pOworICAgICAgICBpZiAocmVzdWx0ICYmCisgICAgICAgICAgICAhUHlJbnRfQ2hlY2socmVzdWx0KSAmJiAhUHlMb25nX0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9faW5kZXhfXyByZXR1cm5lZCBub24tKGludCxsb25nKSAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiKHR5cGUgJS4yMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJyUuMjAwcycgb2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAiYXMgYW4gaW5kZXgiLCBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIGFuIGVycm9yIG9uIE92ZXJmbG93IG9ubHkgaWYgZXJyIGlzIG5vdCBOVUxMKi8KQEAgLTE0OTMsMjk2ICsxNDkzLDI5NiBAQAogUHlfc3NpemVfdAogUHlOdW1iZXJfQXNTc2l6ZV90KFB5T2JqZWN0ICppdGVtLCBQeU9iamVjdCAqZXJyKQogewotCVB5X3NzaXplX3QgcmVzdWx0OwotCVB5T2JqZWN0ICpydW5lcnI7Ci0JUHlPYmplY3QgKnZhbHVlID0gUHlOdW1iZXJfSW5kZXgoaXRlbSk7Ci0JaWYgKHZhbHVlID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBQeV9zc2l6ZV90IHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcnVuZXJyOworICAgIFB5T2JqZWN0ICp2YWx1ZSA9IFB5TnVtYmVyX0luZGV4KGl0ZW0pOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQkvKiBXZSdyZSBkb25lIGlmIFB5SW50X0FzU3NpemVfdCgpIHJldHVybnMgd2l0aG91dCBlcnJvci4gKi8KLQlyZXN1bHQgPSBQeUludF9Bc1NzaXplX3QodmFsdWUpOwotCWlmIChyZXN1bHQgIT0gLTEgfHwgIShydW5lcnIgPSBQeUVycl9PY2N1cnJlZCgpKSkKLQkJZ290byBmaW5pc2g7CisgICAgLyogV2UncmUgZG9uZSBpZiBQeUludF9Bc1NzaXplX3QoKSByZXR1cm5zIHdpdGhvdXQgZXJyb3IuICovCisgICAgcmVzdWx0ID0gUHlJbnRfQXNTc2l6ZV90KHZhbHVlKTsKKyAgICBpZiAocmVzdWx0ICE9IC0xIHx8ICEocnVuZXJyID0gUHlFcnJfT2NjdXJyZWQoKSkpCisgICAgICAgIGdvdG8gZmluaXNoOwogCi0JLyogRXJyb3IgaGFuZGxpbmcgY29kZSAtLSBvbmx5IG1hbmFnZSBPdmVyZmxvd0Vycm9yIGRpZmZlcmVudGx5ICovCi0JaWYgKCFQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMocnVuZXJyLCBQeUV4Y19PdmVyZmxvd0Vycm9yKSkgCi0JCWdvdG8gZmluaXNoOworICAgIC8qIEVycm9yIGhhbmRsaW5nIGNvZGUgLS0gb25seSBtYW5hZ2UgT3ZlcmZsb3dFcnJvciBkaWZmZXJlbnRseSAqLworICAgIGlmICghUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKHJ1bmVyciwgUHlFeGNfT3ZlcmZsb3dFcnJvcikpCisgICAgICAgIGdvdG8gZmluaXNoOwogCi0JUHlFcnJfQ2xlYXIoKTsKLQkvKiBJZiBubyBlcnJvci1oYW5kbGluZyBkZXNpcmVkIHRoZW4gdGhlIGRlZmF1bHQgY2xpcHBpbmcgCi0JICAgaXMgc3VmZmljaWVudC4KLQkgKi8KLQlpZiAoIWVycikgewotCQlhc3NlcnQoUHlMb25nX0NoZWNrKHZhbHVlKSk7Ci0JCS8qIFdoZXRoZXIgb3Igbm90IGl0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAKLQkJICAgemVybyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzaWduIG9mIG9iX3NpemUKLQkJKi8KLQkJaWYgKF9QeUxvbmdfU2lnbih2YWx1ZSkgPCAwKSAKLQkJCXJlc3VsdCA9IFBZX1NTSVpFX1RfTUlOOwotCQllbHNlCi0JCQlyZXN1bHQgPSBQWV9TU0laRV9UX01BWDsKLQl9Ci0JZWxzZSB7Ci0JCS8qIE90aGVyd2lzZSByZXBsYWNlIHRoZSBlcnJvciB3aXRoIGNhbGxlcidzIGVycm9yIG9iamVjdC4gKi8KLQkJUHlFcnJfRm9ybWF0KGVyciwKLQkJCSAgICAgImNhbm5vdCBmaXQgJyUuMjAwcycgaW50byBhbiBpbmRleC1zaXplZCBpbnRlZ2VyIiwgCi0JCQkgICAgIGl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOyAKLQl9Ci0JCisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAvKiBJZiBubyBlcnJvci1oYW5kbGluZyBkZXNpcmVkIHRoZW4gdGhlIGRlZmF1bHQgY2xpcHBpbmcKKyAgICAgICBpcyBzdWZmaWNpZW50LgorICAgICAqLworICAgIGlmICghZXJyKSB7CisgICAgICAgIGFzc2VydChQeUxvbmdfQ2hlY2sodmFsdWUpKTsKKyAgICAgICAgLyogV2hldGhlciBvciBub3QgaXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCisgICAgICAgICAgIHplcm8gaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2lnbiBvZiBvYl9zaXplCisgICAgICAgICovCisgICAgICAgIGlmIChfUHlMb25nX1NpZ24odmFsdWUpIDwgMCkKKyAgICAgICAgICAgIHJlc3VsdCA9IFBZX1NTSVpFX1RfTUlOOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBQWV9TU0laRV9UX01BWDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIE90aGVyd2lzZSByZXBsYWNlIHRoZSBlcnJvciB3aXRoIGNhbGxlcidzIGVycm9yIG9iamVjdC4gKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KGVyciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgZml0ICclLjIwMHMnIGludG8gYW4gaW5kZXgtc2l6ZWQgaW50ZWdlciIsCisgICAgICAgICAgICAgICAgICAgICBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICB9CisKICBmaW5pc2g6Ci0JUHlfREVDUkVGKHZhbHVlKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCiBQeU9iamVjdCAqCiBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoUHlPYmplY3QgKmludGVncmFsLCBjb25zdCBjaGFyKiBlcnJvcl9mb3JtYXQpCiB7Ci0JY29uc3QgY2hhciAqdHlwZV9uYW1lOwotCXN0YXRpYyBQeU9iamVjdCAqaW50X25hbWUgPSBOVUxMOwotCWlmIChpbnRfbmFtZSA9PSBOVUxMKSB7Ci0JCWludF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbnRfXyIpOwotCQlpZiAoaW50X25hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBjb25zdCBjaGFyICp0eXBlX25hbWU7CisgICAgc3RhdGljIFB5T2JqZWN0ICppbnRfbmFtZSA9IE5VTEw7CisgICAgaWYgKGludF9uYW1lID09IE5VTEwpIHsKKyAgICAgICAgaW50X25hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2ludF9fIik7CisgICAgICAgIGlmIChpbnRfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGludGVncmFsICYmICghUHlJbnRfQ2hlY2soaW50ZWdyYWwpICYmCi0JCQkgIVB5TG9uZ19DaGVjayhpbnRlZ3JhbCkpKSB7Ci0JCS8qIERvbid0IGdvIHRocm91Z2ggdHBfYXNfbnVtYmVyLT5uYl9pbnQgdG8gYXZvaWQKLQkJICAgaGl0dGluZyB0aGUgY2xhc3NpYyBjbGFzcyBmYWxsYmFjayB0byBfX3RydW5jX18uICovCi0JCVB5T2JqZWN0ICppbnRfZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIoaW50ZWdyYWwsIGludF9uYW1lKTsKLQkJaWYgKGludF9mdW5jID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7IC8qIFJhaXNlIGEgZGlmZmVyZW50IGVycm9yLiAqLwotCQkJZ290byBub25faW50ZWdyYWxfZXJyb3I7Ci0JCX0KLQkJUHlfREVDUkVGKGludGVncmFsKTsKLQkJaW50ZWdyYWwgPSBQeUV2YWxfQ2FsbE9iamVjdChpbnRfZnVuYywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihpbnRfZnVuYyk7Ci0JCWlmIChpbnRlZ3JhbCAmJiAoIVB5SW50X0NoZWNrKGludGVncmFsKSAmJgotCQkJCSAgIVB5TG9uZ19DaGVjayhpbnRlZ3JhbCkpKSB7Ci0JCQlnb3RvIG5vbl9pbnRlZ3JhbF9lcnJvcjsKLQkJfQotCX0KLQlyZXR1cm4gaW50ZWdyYWw7CisgICAgaWYgKGludGVncmFsICYmICghUHlJbnRfQ2hlY2soaW50ZWdyYWwpICYmCisgICAgICAgICAgICAgICAgICAgICAhUHlMb25nX0NoZWNrKGludGVncmFsKSkpIHsKKyAgICAgICAgLyogRG9uJ3QgZ28gdGhyb3VnaCB0cF9hc19udW1iZXItPm5iX2ludCB0byBhdm9pZAorICAgICAgICAgICBoaXR0aW5nIHRoZSBjbGFzc2ljIGNsYXNzIGZhbGxiYWNrIHRvIF9fdHJ1bmNfXy4gKi8KKyAgICAgICAgUHlPYmplY3QgKmludF9mdW5jID0gUHlPYmplY3RfR2V0QXR0cihpbnRlZ3JhbCwgaW50X25hbWUpOworICAgICAgICBpZiAoaW50X2Z1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsgLyogUmFpc2UgYSBkaWZmZXJlbnQgZXJyb3IuICovCisgICAgICAgICAgICBnb3RvIG5vbl9pbnRlZ3JhbF9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoaW50ZWdyYWwpOworICAgICAgICBpbnRlZ3JhbCA9IFB5RXZhbF9DYWxsT2JqZWN0KGludF9mdW5jLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGludF9mdW5jKTsKKyAgICAgICAgaWYgKGludGVncmFsICYmICghUHlJbnRfQ2hlY2soaW50ZWdyYWwpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICFQeUxvbmdfQ2hlY2soaW50ZWdyYWwpKSkgeworICAgICAgICAgICAgZ290byBub25faW50ZWdyYWxfZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGludGVncmFsOwogCiBub25faW50ZWdyYWxfZXJyb3I6Ci0JaWYgKFB5SW5zdGFuY2VfQ2hlY2soaW50ZWdyYWwpKSB7Ci0JCXR5cGVfbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORygoKFB5SW5zdGFuY2VPYmplY3QgKilpbnRlZ3JhbCkKLQkJCQkJICAgICAgIC0+aW5fY2xhc3MtPmNsX25hbWUpOwotCX0KLQllbHNlIHsKLQkJdHlwZV9uYW1lID0gaW50ZWdyYWwtPm9iX3R5cGUtPnRwX25hbWU7Ci0JfQotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIGVycm9yX2Zvcm1hdCwgdHlwZV9uYW1lKTsKLQlQeV9ERUNSRUYoaW50ZWdyYWwpOwotCXJldHVybiBOVUxMOworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKGludGVncmFsKSkgeworICAgICAgICB0eXBlX25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoKChQeUluc3RhbmNlT2JqZWN0ICopaW50ZWdyYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmluX2NsYXNzLT5jbF9uYW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHR5cGVfbmFtZSA9IGludGVncmFsLT5vYl90eXBlLT50cF9uYW1lOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCBlcnJvcl9mb3JtYXQsIHR5cGVfbmFtZSk7CisgICAgUHlfREVDUkVGKGludGVncmFsKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9JbnQoUHlPYmplY3QgKm8pCiB7Ci0JUHlOdW1iZXJNZXRob2RzICptOwotCXN0YXRpYyBQeU9iamVjdCAqdHJ1bmNfbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnRydW5jX2Z1bmM7Ci0JY29uc3QgY2hhciAqYnVmZmVyOwotCVB5X3NzaXplX3QgYnVmZmVyX2xlbjsKKyAgICBQeU51bWJlck1ldGhvZHMgKm07CisgICAgc3RhdGljIFB5T2JqZWN0ICp0cnVuY19uYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdHJ1bmNfZnVuYzsKKyAgICBjb25zdCBjaGFyICpidWZmZXI7CisgICAgUHlfc3NpemVfdCBidWZmZXJfbGVuOwogCi0JaWYgKHRydW5jX25hbWUgPT0gTlVMTCkgewotCQl0cnVuY19uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX190cnVuY19fIik7Ci0JCWlmICh0cnVuY19uYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHRydW5jX25hbWUgPT0gTlVMTCkgeworICAgICAgICB0cnVuY19uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX190cnVuY19fIik7CisgICAgICAgIGlmICh0cnVuY19uYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAobyA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOwotCWlmIChQeUludF9DaGVja0V4YWN0KG8pKSB7Ci0JCVB5X0lOQ1JFRihvKTsKLQkJcmV0dXJuIG87Ci0JfQotCW0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JaWYgKG0gJiYgbS0+bmJfaW50KSB7IC8qIFRoaXMgc2hvdWxkIGluY2x1ZGUgc3ViY2xhc3NlcyBvZiBpbnQgKi8KLQkJLyogQ2xhc3NpYyBjbGFzc2VzIGFsd2F5cyB0YWtlIHRoaXMgYnJhbmNoLiAqLwotCQlQeU9iamVjdCAqcmVzID0gbS0+bmJfaW50KG8pOwotCQlpZiAocmVzICYmICghUHlJbnRfQ2hlY2socmVzKSAmJiAhUHlMb25nX0NoZWNrKHJlcykpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIl9faW50X18gcmV0dXJuZWQgbm9uLWludCAodHlwZSAlLjIwMHMpIiwKLQkJCQkgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCWlmIChQeUludF9DaGVjayhvKSkgeyAvKiBBIGludCBzdWJjbGFzcyB3aXRob3V0IG5iX2ludCAqLwotCQlQeUludE9iamVjdCAqaW8gPSAoUHlJbnRPYmplY3QqKW87Ci0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhpby0+b2JfaXZhbCk7Ci0JfQotCXRydW5jX2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyKG8sIHRydW5jX25hbWUpOwotCWlmICh0cnVuY19mdW5jKSB7Ci0JCVB5T2JqZWN0ICp0cnVuY2F0ZWQgPSBQeUV2YWxfQ2FsbE9iamVjdCh0cnVuY19mdW5jLCBOVUxMKTsKLQkJUHlfREVDUkVGKHRydW5jX2Z1bmMpOwotCQkvKiBfX3RydW5jX18gaXMgc3BlY2lmaWVkIHRvIHJldHVybiBhbiBJbnRlZ3JhbCB0eXBlLCBidXQKLQkJICAgaW50KCkgbmVlZHMgdG8gcmV0dXJuIGFuIGludC4gKi8KLQkJcmV0dXJuIF9QeU51bWJlcl9Db252ZXJ0SW50ZWdyYWxUb0ludCgKLQkJCXRydW5jYXRlZCwKLQkJCSJfX3RydW5jX18gcmV0dXJuZWQgbm9uLUludGVncmFsICh0eXBlICUuMjAwcykiKTsKLQl9Ci0JUHlFcnJfQ2xlYXIoKTsgIC8qIEl0J3Mgbm90IGFuIGVycm9yIGlmICBvLl9fdHJ1bmNfXyBkb2Vzbid0IGV4aXN0LiAqLworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QobykpIHsKKyAgICAgICAgUHlfSU5DUkVGKG8pOworICAgICAgICByZXR1cm4gbzsKKyAgICB9CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobSAmJiBtLT5uYl9pbnQpIHsgLyogVGhpcyBzaG91bGQgaW5jbHVkZSBzdWJjbGFzc2VzIG9mIGludCAqLworICAgICAgICAvKiBDbGFzc2ljIGNsYXNzZXMgYWx3YXlzIHRha2UgdGhpcyBicmFuY2guICovCisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBtLT5uYl9pbnQobyk7CisgICAgICAgIGlmIChyZXMgJiYgKCFQeUludF9DaGVjayhyZXMpICYmICFQeUxvbmdfQ2hlY2socmVzKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9faW50X18gcmV0dXJuZWQgbm9uLWludCAodHlwZSAlLjIwMHMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAoUHlJbnRfQ2hlY2sobykpIHsgLyogQSBpbnQgc3ViY2xhc3Mgd2l0aG91dCBuYl9pbnQgKi8KKyAgICAgICAgUHlJbnRPYmplY3QgKmlvID0gKFB5SW50T2JqZWN0KilvOworICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoaW8tPm9iX2l2YWwpOworICAgIH0KKyAgICB0cnVuY19mdW5jID0gUHlPYmplY3RfR2V0QXR0cihvLCB0cnVuY19uYW1lKTsKKyAgICBpZiAodHJ1bmNfZnVuYykgeworICAgICAgICBQeU9iamVjdCAqdHJ1bmNhdGVkID0gUHlFdmFsX0NhbGxPYmplY3QodHJ1bmNfZnVuYywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRih0cnVuY19mdW5jKTsKKyAgICAgICAgLyogX190cnVuY19fIGlzIHNwZWNpZmllZCB0byByZXR1cm4gYW4gSW50ZWdyYWwgdHlwZSwgYnV0CisgICAgICAgICAgIGludCgpIG5lZWRzIHRvIHJldHVybiBhbiBpbnQuICovCisgICAgICAgIHJldHVybiBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCisgICAgICAgICAgICB0cnVuY2F0ZWQsCisgICAgICAgICAgICAiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSAlLjIwMHMpIik7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7ICAvKiBJdCdzIG5vdCBhbiBlcnJvciBpZiAgby5fX3RydW5jX18gZG9lc24ndCBleGlzdC4gKi8KIAotCWlmIChQeVN0cmluZ19DaGVjayhvKSkKLQkJcmV0dXJuIGludF9mcm9tX3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcobyksCi0JCQkJICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKG8pKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sobykpCisgICAgICAgIHJldHVybiBpbnRfZnJvbV9zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKG8pKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhvKSkKLQkJcmV0dXJuIFB5SW50X0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKG8pLAotCQkJCQkgUHlVbmljb2RlX0dFVF9TSVpFKG8pLAotCQkJCQkgMTApOworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobykpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tVW5pY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERShvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRShvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwKTsKICNlbmRpZgotCWlmICghUHlPYmplY3RfQXNDaGFyQnVmZmVyKG8sICZidWZmZXIsICZidWZmZXJfbGVuKSkKLQkJcmV0dXJuIGludF9mcm9tX3N0cmluZygoY2hhciopYnVmZmVyLCBidWZmZXJfbGVuKTsKKyAgICBpZiAoIVB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihvLCAmYnVmZmVyLCAmYnVmZmVyX2xlbikpCisgICAgICAgIHJldHVybiBpbnRfZnJvbV9zdHJpbmcoKGNoYXIqKWJ1ZmZlciwgYnVmZmVyX2xlbik7CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigiaW50KCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhICIKLQkJCSAgIm51bWJlciwgbm90ICclLjIwMHMnIiwgbyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoImludCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSAiCisgICAgICAgICAgICAgICAgICAgICAgIm51bWJlciwgbm90ICclLjIwMHMnIiwgbyk7CiB9CiAKIC8qIEFkZCBhIGNoZWNrIGZvciBlbWJlZGRlZCBOVUxMLWJ5dGVzIGluIHRoZSBhcmd1bWVudC4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewotCWNoYXIgKmVuZDsKLQlQeU9iamVjdCAqeDsKKyAgICBjaGFyICplbmQ7CisgICAgUHlPYmplY3QgKng7CiAKLQl4ID0gUHlMb25nX0Zyb21TdHJpbmcoKGNoYXIqKXMsICZlbmQsIDEwKTsKLQlpZiAoeCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZW5kICE9IHMgKyBsZW4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm51bGwgYnl0ZSBpbiBhcmd1bWVudCBmb3IgbG9uZygpIik7Ci0JCVB5X0RFQ1JFRih4KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB4OworICAgIHggPSBQeUxvbmdfRnJvbVN0cmluZygoY2hhciopcywgJmVuZCwgMTApOworICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChlbmQgIT0gcyArIGxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJudWxsIGJ5dGUgaW4gYXJndW1lbnQgZm9yIGxvbmcoKSIpOworICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4geDsKIH0KIAogUHlPYmplY3QgKgogUHlOdW1iZXJfTG9uZyhQeU9iamVjdCAqbykKIHsKLQlQeU51bWJlck1ldGhvZHMgKm07Ci0Jc3RhdGljIFB5T2JqZWN0ICp0cnVuY19uYW1lID0gTlVMTDsKLQlQeU9iamVjdCAqdHJ1bmNfZnVuYzsKLQljb25zdCBjaGFyICpidWZmZXI7Ci0JUHlfc3NpemVfdCBidWZmZXJfbGVuOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnRydW5jX25hbWUgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0cnVuY19mdW5jOworICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcjsKKyAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9sZW47CiAKLQlpZiAodHJ1bmNfbmFtZSA9PSBOVUxMKSB7Ci0JCXRydW5jX25hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3RydW5jX18iKTsKLQkJaWYgKHRydW5jX25hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodHJ1bmNfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIHRydW5jX25hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3RydW5jX18iKTsKKyAgICAgICAgaWYgKHRydW5jX25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7Ci0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAobSAmJiBtLT5uYl9sb25nKSB7IC8qIFRoaXMgc2hvdWxkIGluY2x1ZGUgc3ViY2xhc3NlcyBvZiBsb25nICovCi0JCS8qIENsYXNzaWMgY2xhc3NlcyBhbHdheXMgdGFrZSB0aGlzIGJyYW5jaC4gKi8KLQkJUHlPYmplY3QgKnJlcyA9IG0tPm5iX2xvbmcobyk7Ci0JCWlmIChyZXMgJiYgKCFQeUludF9DaGVjayhyZXMpICYmICFQeUxvbmdfQ2hlY2socmVzKSkpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiX19sb25nX18gcmV0dXJuZWQgbm9uLWxvbmcgKHR5cGUgJS4yMDBzKSIsCi0JCQkJICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQlpZiAoUHlMb25nX0NoZWNrKG8pKSAvKiBBIGxvbmcgc3ViY2xhc3Mgd2l0aG91dCBuYl9sb25nICovCi0JCXJldHVybiBfUHlMb25nX0NvcHkoKFB5TG9uZ09iamVjdCAqKW8pOwotCXRydW5jX2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyKG8sIHRydW5jX25hbWUpOwotCWlmICh0cnVuY19mdW5jKSB7Ci0JCVB5T2JqZWN0ICp0cnVuY2F0ZWQgPSBQeUV2YWxfQ2FsbE9iamVjdCh0cnVuY19mdW5jLCBOVUxMKTsKLQkJUHlPYmplY3QgKmludF9pbnN0YW5jZTsKLQkJUHlfREVDUkVGKHRydW5jX2Z1bmMpOwotCQkvKiBfX3RydW5jX18gaXMgc3BlY2lmaWVkIHRvIHJldHVybiBhbiBJbnRlZ3JhbCB0eXBlLAotCQkgICBidXQgbG9uZygpIG5lZWRzIHRvIHJldHVybiBhIGxvbmcuICovCi0JCWludF9pbnN0YW5jZSA9IF9QeU51bWJlcl9Db252ZXJ0SW50ZWdyYWxUb0ludCgKLQkJCXRydW5jYXRlZCwKLQkJCSJfX3RydW5jX18gcmV0dXJuZWQgbm9uLUludGVncmFsICh0eXBlICUuMjAwcykiKTsKLQkJaWYgKGludF9pbnN0YW5jZSAmJiBQeUludF9DaGVjayhpbnRfaW5zdGFuY2UpKSB7Ci0JCQkvKiBNYWtlIHN1cmUgdGhhdCBsb25nKCkgcmV0dXJucyBhIGxvbmcgaW5zdGFuY2UuICovCi0JCQlsb25nIHZhbHVlID0gUHlJbnRfQVNfTE9ORyhpbnRfaW5zdGFuY2UpOwotCQkJUHlfREVDUkVGKGludF9pbnN0YW5jZSk7Ci0JCQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gaW50X2luc3RhbmNlOwotCX0KLQlQeUVycl9DbGVhcigpOyAgLyogSXQncyBub3QgYW4gZXJyb3IgaWYgIG8uX190cnVuY19fIGRvZXNuJ3QgZXhpc3QuICovCisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIGlmIChtICYmIG0tPm5iX2xvbmcpIHsgLyogVGhpcyBzaG91bGQgaW5jbHVkZSBzdWJjbGFzc2VzIG9mIGxvbmcgKi8KKyAgICAgICAgLyogQ2xhc3NpYyBjbGFzc2VzIGFsd2F5cyB0YWtlIHRoaXMgYnJhbmNoLiAqLworICAgICAgICBQeU9iamVjdCAqcmVzID0gbS0+bmJfbG9uZyhvKTsKKyAgICAgICAgaWYgKHJlcyAmJiAoIVB5SW50X0NoZWNrKHJlcykgJiYgIVB5TG9uZ19DaGVjayhyZXMpKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiX19sb25nX18gcmV0dXJuZWQgbm9uLWxvbmcgKHR5cGUgJS4yMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKFB5TG9uZ19DaGVjayhvKSkgLyogQSBsb25nIHN1YmNsYXNzIHdpdGhvdXQgbmJfbG9uZyAqLworICAgICAgICByZXR1cm4gX1B5TG9uZ19Db3B5KChQeUxvbmdPYmplY3QgKilvKTsKKyAgICB0cnVuY19mdW5jID0gUHlPYmplY3RfR2V0QXR0cihvLCB0cnVuY19uYW1lKTsKKyAgICBpZiAodHJ1bmNfZnVuYykgeworICAgICAgICBQeU9iamVjdCAqdHJ1bmNhdGVkID0gUHlFdmFsX0NhbGxPYmplY3QodHJ1bmNfZnVuYywgTlVMTCk7CisgICAgICAgIFB5T2JqZWN0ICppbnRfaW5zdGFuY2U7CisgICAgICAgIFB5X0RFQ1JFRih0cnVuY19mdW5jKTsKKyAgICAgICAgLyogX190cnVuY19fIGlzIHNwZWNpZmllZCB0byByZXR1cm4gYW4gSW50ZWdyYWwgdHlwZSwKKyAgICAgICAgICAgYnV0IGxvbmcoKSBuZWVkcyB0byByZXR1cm4gYSBsb25nLiAqLworICAgICAgICBpbnRfaW5zdGFuY2UgPSBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCisgICAgICAgICAgICB0cnVuY2F0ZWQsCisgICAgICAgICAgICAiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSAlLjIwMHMpIik7CisgICAgICAgIGlmIChpbnRfaW5zdGFuY2UgJiYgUHlJbnRfQ2hlY2soaW50X2luc3RhbmNlKSkgeworICAgICAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgbG9uZygpIHJldHVybnMgYSBsb25nIGluc3RhbmNlLiAqLworICAgICAgICAgICAgbG9uZyB2YWx1ZSA9IFB5SW50X0FTX0xPTkcoaW50X2luc3RhbmNlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbnRfaW5zdGFuY2UpOworICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGludF9pbnN0YW5jZTsKKyAgICB9CisgICAgUHlFcnJfQ2xlYXIoKTsgIC8qIEl0J3Mgbm90IGFuIGVycm9yIGlmICBvLl9fdHJ1bmNfXyBkb2Vzbid0IGV4aXN0LiAqLwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKG8pKQotCQkvKiBuZWVkIHRvIGRvIGV4dHJhIGVycm9yIGNoZWNraW5nIHRoYXQgUHlMb25nX0Zyb21TdHJpbmcoKQotCQkgKiBkb2Vzbid0IGRvLiAgSW4gcGFydGljdWxhciBsb25nKCc5LjUnKSBtdXN0IHJhaXNlIGFuCi0JCSAqIGV4Y2VwdGlvbiwgbm90IHRydW5jYXRlIHRoZSBmbG9hdC4KLQkJICovCi0JCXJldHVybiBsb25nX2Zyb21fc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyhvKSwKLQkJCQkJUHlTdHJpbmdfR0VUX1NJWkUobykpOworICAgIGlmIChQeVN0cmluZ19DaGVjayhvKSkKKyAgICAgICAgLyogbmVlZCB0byBkbyBleHRyYSBlcnJvciBjaGVja2luZyB0aGF0IFB5TG9uZ19Gcm9tU3RyaW5nKCkKKyAgICAgICAgICogZG9lc24ndCBkby4gIEluIHBhcnRpY3VsYXIgbG9uZygnOS41JykgbXVzdCByYWlzZSBhbgorICAgICAgICAgKiBleGNlcHRpb24sIG5vdCB0cnVuY2F0ZSB0aGUgZmxvYXQuCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gbG9uZ19mcm9tX3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcobyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKG8pKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayhvKSkKLQkJLyogVGhlIGFib3ZlIGNoZWNrIGlzIGRvbmUgaW4gUHlMb25nX0Zyb21Vbmljb2RlKCkuICovCi0JCXJldHVybiBQeUxvbmdfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUobyksCi0JCQkJCSAgUHlVbmljb2RlX0dFVF9TSVpFKG8pLAotCQkJCQkgIDEwKTsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG8pKQorICAgICAgICAvKiBUaGUgYWJvdmUgY2hlY2sgaXMgZG9uZSBpbiBQeUxvbmdfRnJvbVVuaWNvZGUoKS4gKi8KKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5pY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERShvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUobyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTApOwogI2VuZGlmCi0JaWYgKCFQeU9iamVjdF9Bc0NoYXJCdWZmZXIobywgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQotCQlyZXR1cm4gbG9uZ19mcm9tX3N0cmluZyhidWZmZXIsIGJ1ZmZlcl9sZW4pOworICAgIGlmICghUHlPYmplY3RfQXNDaGFyQnVmZmVyKG8sICZidWZmZXIsICZidWZmZXJfbGVuKSkKKyAgICAgICAgcmV0dXJuIGxvbmdfZnJvbV9zdHJpbmcoYnVmZmVyLCBidWZmZXJfbGVuKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJsb25nKCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhICIKLQkJCSAgIm51bWJlciwgbm90ICclLjIwMHMnIiwgbyk7CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoImxvbmcoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgIgorICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIsIG5vdCAnJS4yMDBzJyIsIG8pOwogfQogCiBQeU9iamVjdCAqCiBQeU51bWJlcl9GbG9hdChQeU9iamVjdCAqbykKIHsKLQlQeU51bWJlck1ldGhvZHMgKm07CisgICAgUHlOdW1iZXJNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKLQltID0gby0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOwotCWlmIChtICYmIG0tPm5iX2Zsb2F0KSB7IC8qIFRoaXMgc2hvdWxkIGluY2x1ZGUgc3ViY2xhc3NlcyBvZiBmbG9hdCAqLwotCQlQeU9iamVjdCAqcmVzID0gbS0+bmJfZmxvYXQobyk7Ci0JCWlmIChyZXMgJiYgIVB5RmxvYXRfQ2hlY2socmVzKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAgICAgICJfX2Zsb2F0X18gcmV0dXJuZWQgbm9uLWZsb2F0ICh0eXBlICUuMjAwcykiLAotCQkgICAgICAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JaWYgKFB5RmxvYXRfQ2hlY2sobykpIHsgLyogQSBmbG9hdCBzdWJjbGFzcyB3aXRoIG5iX2Zsb2F0ID09IE5VTEwgKi8KLQkJUHlGbG9hdE9iamVjdCAqcG8gPSAoUHlGbG9hdE9iamVjdCAqKW87Ci0JCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocG8tPm9iX2Z2YWwpOwotCX0KLQlyZXR1cm4gUHlGbG9hdF9Gcm9tU3RyaW5nKG8sIE5VTEwpOworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobSAmJiBtLT5uYl9mbG9hdCkgeyAvKiBUaGlzIHNob3VsZCBpbmNsdWRlIHN1YmNsYXNzZXMgb2YgZmxvYXQgKi8KKyAgICAgICAgUHlPYmplY3QgKnJlcyA9IG0tPm5iX2Zsb2F0KG8pOworICAgICAgICBpZiAocmVzICYmICFQeUZsb2F0X0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICJfX2Zsb2F0X18gcmV0dXJuZWQgbm9uLWZsb2F0ICh0eXBlICUuMjAwcykiLAorICAgICAgICAgICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpZiAoUHlGbG9hdF9DaGVjayhvKSkgeyAvKiBBIGZsb2F0IHN1YmNsYXNzIHdpdGggbmJfZmxvYXQgPT0gTlVMTCAqLworICAgICAgICBQeUZsb2F0T2JqZWN0ICpwbyA9IChQeUZsb2F0T2JqZWN0ICopbzsKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShwby0+b2JfZnZhbCk7CisgICAgfQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21TdHJpbmcobywgTlVMTCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TnVtYmVyX1RvQmFzZShQeU9iamVjdCAqbiwgaW50IGJhc2UpCiB7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JUHlPYmplY3QgKmluZGV4ID0gUHlOdW1iZXJfSW5kZXgobik7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmluZGV4ID0gUHlOdW1iZXJfSW5kZXgobik7CiAKLQlpZiAoIWluZGV4KQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlMb25nX0NoZWNrKGluZGV4KSkKLQkJcmVzID0gX1B5TG9uZ19Gb3JtYXQoaW5kZXgsIGJhc2UsIDAsIDEpOwotCWVsc2UgaWYgKFB5SW50X0NoZWNrKGluZGV4KSkKLQkgIAlyZXMgPSBfUHlJbnRfRm9ybWF0KChQeUludE9iamVjdCopaW5kZXgsIGJhc2UsIDEpOwotCWVsc2UKLQkJLyogSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBnZXQgaGVyZSwgYXMKLQkJICAgUHlOdW1iZXJfSW5kZXggYWxyZWFkeSBoYXMgYSBjaGVjayBmb3IgdGhlIHNhbWUKLQkJICAgY29uZGl0aW9uICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiUHlOdW1iZXJfVG9CYXNlOiBpbmRleCBub3QgIgotCQkJCSJpbnQgb3IgbG9uZyIpOwotCVB5X0RFQ1JFRihpbmRleCk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoIWluZGV4KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlMb25nX0NoZWNrKGluZGV4KSkKKyAgICAgICAgcmVzID0gX1B5TG9uZ19Gb3JtYXQoaW5kZXgsIGJhc2UsIDAsIDEpOworICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKGluZGV4KSkKKyAgICAgICAgcmVzID0gX1B5SW50X0Zvcm1hdCgoUHlJbnRPYmplY3QqKWluZGV4LCBiYXNlLCAxKTsKKyAgICBlbHNlCisgICAgICAgIC8qIEl0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gZ2V0IGhlcmUsIGFzCisgICAgICAgICAgIFB5TnVtYmVyX0luZGV4IGFscmVhZHkgaGFzIGEgY2hlY2sgZm9yIHRoZSBzYW1lCisgICAgICAgICAgIGNvbmRpdGlvbiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIlB5TnVtYmVyX1RvQmFzZTogaW5kZXggbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnQgb3IgbG9uZyIpOworICAgIFB5X0RFQ1JFRihpbmRleCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCkBAIC0xNzkxLDU0MiArMTc5MSw1NDIgQEAKIGludAogUHlTZXF1ZW5jZV9DaGVjayhQeU9iamVjdCAqcykKIHsKLQlpZiAocyAmJiBQeUluc3RhbmNlX0NoZWNrKHMpKQotCQlyZXR1cm4gUHlPYmplY3RfSGFzQXR0clN0cmluZyhzLCAiX19nZXRpdGVtX18iKTsKLQlpZiAoUHlPYmplY3RfSXNJbnN0YW5jZShzLCAoUHlPYmplY3QgKikmUHlEaWN0X1R5cGUpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gcyAhPSBOVUxMICYmIHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlICYmCi0JCXMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtICE9IE5VTEw7CisgICAgaWYgKHMgJiYgUHlJbnN0YW5jZV9DaGVjayhzKSkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcocywgIl9fZ2V0aXRlbV9fIik7CisgICAgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UocywgKFB5T2JqZWN0ICopJlB5RGljdF9UeXBlKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHMgIT0gTlVMTCAmJiBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAmJgorICAgICAgICBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfaXRlbSAhPSBOVUxMOwogfQogCiBQeV9zc2l6ZV90CiBQeVNlcXVlbmNlX1NpemUoUHlPYmplY3QgKnMpCiB7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKm07CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLQlpZiAocyA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9sZW5ndGgpCi0JCXJldHVybiBtLT5zcV9sZW5ndGgocyk7CisgICAgbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX2xlbmd0aCkKKyAgICAgICAgcmV0dXJuIG0tPnNxX2xlbmd0aChzKTsKIAotCXR5cGVfZXJyb3IoIm9iamVjdCBvZiB0eXBlICclLjIwMHMnIGhhcyBubyBsZW4oKSIsIHMpOwotCXJldHVybiAtMTsKKyAgICB0eXBlX2Vycm9yKCJvYmplY3Qgb2YgdHlwZSAnJS4yMDBzJyBoYXMgbm8gbGVuKCkiLCBzKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKICN1bmRlZiBQeVNlcXVlbmNlX0xlbmd0aAogUHlfc3NpemVfdAogUHlTZXF1ZW5jZV9MZW5ndGgoUHlPYmplY3QgKnMpCiB7Ci0JcmV0dXJuIFB5U2VxdWVuY2VfU2l6ZShzKTsKKyAgICByZXR1cm4gUHlTZXF1ZW5jZV9TaXplKHMpOwogfQogI2RlZmluZSBQeVNlcXVlbmNlX0xlbmd0aCBQeVNlcXVlbmNlX1NpemUKIAogUHlPYmplY3QgKgogUHlTZXF1ZW5jZV9Db25jYXQoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICpvKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKHMgPT0gTlVMTCB8fCBvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKHMgPT0gTlVMTCB8fCBvID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfY29uY2F0KQotCQlyZXR1cm4gbS0+c3FfY29uY2F0KHMsIG8pOworICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9jb25jYXQpCisgICAgICAgIHJldHVybiBtLT5zcV9jb25jYXQocywgbyk7CiAKLQkvKiBJbnN0YW5jZXMgb2YgdXNlciBjbGFzc2VzIGRlZmluaW5nIGFuIF9fYWRkX18oKSBtZXRob2Qgb25seQotCSAgIGhhdmUgYW4gbmJfYWRkIHNsb3QsIG5vdCBhbiBzcV9jb25jYXQgc2xvdC4gIFNvIHdlIGZhbGwgYmFjawotCSAgIHRvIG5iX2FkZCBpZiBib3RoIGFyZ3VtZW50cyBhcHBlYXIgdG8gYmUgc2VxdWVuY2VzLiAqLwotCWlmIChQeVNlcXVlbmNlX0NoZWNrKHMpICYmIFB5U2VxdWVuY2VfQ2hlY2sobykpIHsKLQkJUHlPYmplY3QgKnJlc3VsdCA9IGJpbmFyeV9vcDEocywgbywgTkJfU0xPVChuYl9hZGQpKTsKLQkJaWYgKHJlc3VsdCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZCIsIHMpOworICAgIC8qIEluc3RhbmNlcyBvZiB1c2VyIGNsYXNzZXMgZGVmaW5pbmcgYW4gX19hZGRfXygpIG1ldGhvZCBvbmx5CisgICAgICAgaGF2ZSBhbiBuYl9hZGQgc2xvdCwgbm90IGFuIHNxX2NvbmNhdCBzbG90LiAgU28gd2UgZmFsbCBiYWNrCisgICAgICAgdG8gbmJfYWRkIGlmIGJvdGggYXJndW1lbnRzIGFwcGVhciB0byBiZSBzZXF1ZW5jZXMuICovCisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2socykgJiYgUHlTZXF1ZW5jZV9DaGVjayhvKSkgeworICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X29wMShzLCBvLCBOQl9TTE9UKG5iX2FkZCkpOworICAgICAgICBpZiAocmVzdWx0ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIiwgcyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfUmVwZWF0KFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGNvdW50KQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAobyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOwotCWlmIChtICYmIG0tPnNxX3JlcGVhdCkKLQkJcmV0dXJuIG0tPnNxX3JlcGVhdChvLCBjb3VudCk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX3JlcGVhdCkKKyAgICAgICAgcmV0dXJuIG0tPnNxX3JlcGVhdChvLCBjb3VudCk7CiAKLQkvKiBJbnN0YW5jZXMgb2YgdXNlciBjbGFzc2VzIGRlZmluaW5nIGEgX19tdWxfXygpIG1ldGhvZCBvbmx5Ci0JICAgaGF2ZSBhbiBuYl9tdWx0aXBseSBzbG90LCBub3QgYW4gc3FfcmVwZWF0IHNsb3QuIHNvIHdlIGZhbGwgYmFjawotCSAgIHRvIG5iX211bHRpcGx5IGlmIG8gYXBwZWFycyB0byBiZSBhIHNlcXVlbmNlLiAqLwotCWlmIChQeVNlcXVlbmNlX0NoZWNrKG8pKSB7Ci0JCVB5T2JqZWN0ICpuLCAqcmVzdWx0OwotCQluID0gUHlJbnRfRnJvbVNzaXplX3QoY291bnQpOwotCQlpZiAobiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlc3VsdCA9IGJpbmFyeV9vcDEobywgbiwgTkJfU0xPVChuYl9tdWx0aXBseSkpOwotCQlQeV9ERUNSRUYobik7Ci0JCWlmIChyZXN1bHQgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQl9Ci0JcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSByZXBlYXRlZCIsIG8pOworICAgIC8qIEluc3RhbmNlcyBvZiB1c2VyIGNsYXNzZXMgZGVmaW5pbmcgYSBfX211bF9fKCkgbWV0aG9kIG9ubHkKKyAgICAgICBoYXZlIGFuIG5iX211bHRpcGx5IHNsb3QsIG5vdCBhbiBzcV9yZXBlYXQgc2xvdC4gc28gd2UgZmFsbCBiYWNrCisgICAgICAgdG8gbmJfbXVsdGlwbHkgaWYgbyBhcHBlYXJzIHRvIGJlIGEgc2VxdWVuY2UuICovCisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2sobykpIHsKKyAgICAgICAgUHlPYmplY3QgKm4sICpyZXN1bHQ7CisgICAgICAgIG4gPSBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CisgICAgICAgIGlmIChuID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzdWx0ID0gYmluYXJ5X29wMShvLCBuLCBOQl9TTE9UKG5iX211bHRpcGx5KSk7CisgICAgICAgIFB5X0RFQ1JFRihuKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIHJlcGVhdGVkIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdChQeU9iamVjdCAqcywgUHlPYmplY3QgKm8pCiB7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKm07CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLQlpZiAocyA9PSBOVUxMIHx8IG8gPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAocyA9PSBOVUxMIHx8IG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBIQVNJTlBMQUNFKHMpICYmIG0tPnNxX2lucGxhY2VfY29uY2F0KQotCQlyZXR1cm4gbS0+c3FfaW5wbGFjZV9jb25jYXQocywgbyk7Ci0JaWYgKG0gJiYgbS0+c3FfY29uY2F0KQotCQlyZXR1cm4gbS0+c3FfY29uY2F0KHMsIG8pOworICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBIQVNJTlBMQUNFKHMpICYmIG0tPnNxX2lucGxhY2VfY29uY2F0KQorICAgICAgICByZXR1cm4gbS0+c3FfaW5wbGFjZV9jb25jYXQocywgbyk7CisgICAgaWYgKG0gJiYgbS0+c3FfY29uY2F0KQorICAgICAgICByZXR1cm4gbS0+c3FfY29uY2F0KHMsIG8pOwogCi0JaWYgKFB5U2VxdWVuY2VfQ2hlY2socykgJiYgUHlTZXF1ZW5jZV9DaGVjayhvKSkgewotCQlQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X2lvcDEocywgbywgTkJfU0xPVChuYl9pbnBsYWNlX2FkZCksCi0JCQkJCSAgICAgICBOQl9TTE9UKG5iX2FkZCkpOwotCQlpZiAocmVzdWx0ICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JfQotCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIiwgcyk7CisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2socykgJiYgUHlTZXF1ZW5jZV9DaGVjayhvKSkgeworICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gYmluYXJ5X2lvcDEocywgbywgTkJfU0xPVChuYl9pbnBsYWNlX2FkZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQl9TTE9UKG5iX2FkZCkpOworICAgICAgICBpZiAocmVzdWx0ICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgY2FuJ3QgYmUgY29uY2F0ZW5hdGVkIiwgcyk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudCkKIHsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqbTsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKG8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW0gPSBvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBIQVNJTlBMQUNFKG8pICYmIG0tPnNxX2lucGxhY2VfcmVwZWF0KQotCQlyZXR1cm4gbS0+c3FfaW5wbGFjZV9yZXBlYXQobywgY291bnQpOwotCWlmIChtICYmIG0tPnNxX3JlcGVhdCkKLQkJcmV0dXJuIG0tPnNxX3JlcGVhdChvLCBjb3VudCk7CisgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIEhBU0lOUExBQ0UobykgJiYgbS0+c3FfaW5wbGFjZV9yZXBlYXQpCisgICAgICAgIHJldHVybiBtLT5zcV9pbnBsYWNlX3JlcGVhdChvLCBjb3VudCk7CisgICAgaWYgKG0gJiYgbS0+c3FfcmVwZWF0KQorICAgICAgICByZXR1cm4gbS0+c3FfcmVwZWF0KG8sIGNvdW50KTsKIAotCWlmIChQeVNlcXVlbmNlX0NoZWNrKG8pKSB7Ci0JCVB5T2JqZWN0ICpuLCAqcmVzdWx0OwotCQluID0gUHlJbnRfRnJvbVNzaXplX3QoY291bnQpOwotCQlpZiAobiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlc3VsdCA9IGJpbmFyeV9pb3AxKG8sIG4sIE5CX1NMT1QobmJfaW5wbGFjZV9tdWx0aXBseSksCi0JCQkJICAgICBOQl9TTE9UKG5iX211bHRpcGx5KSk7Ci0JCVB5X0RFQ1JFRihuKTsKLQkJaWYgKHJlc3VsdCAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIHJlcGVhdGVkIiwgbyk7CisgICAgaWYgKFB5U2VxdWVuY2VfQ2hlY2sobykpIHsKKyAgICAgICAgUHlPYmplY3QgKm4sICpyZXN1bHQ7CisgICAgICAgIG4gPSBQeUludF9Gcm9tU3NpemVfdChjb3VudCk7CisgICAgICAgIGlmIChuID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzdWx0ID0gYmluYXJ5X2lvcDEobywgbiwgTkJfU0xPVChuYl9pbnBsYWNlX211bHRpcGx5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJfU0xPVChuYl9tdWx0aXBseSkpOworICAgICAgICBQeV9ERUNSRUYobik7CisgICAgICAgIGlmIChyZXN1bHQgIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBjYW4ndCBiZSByZXBlYXRlZCIsIG8pOwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX0dldEl0ZW0oUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgaSkKIHsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqbTsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqbTsKIAotCWlmIChzID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9pdGVtKSB7Ci0JCWlmIChpIDwgMCkgewotCQkJaWYgKG0tPnNxX2xlbmd0aCkgewotCQkJCVB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKLQkJCQlpZiAobCA8IDApCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCWkgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3FfaXRlbShzLCBpKTsKLQl9CisgICAgbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX2l0ZW0pIHsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOworICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgaSArPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtLT5zcV9pdGVtKHMsIGkpOworICAgIH0KIAotCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGluZyIsIHMpOworICAgIHJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGluZyIsIHMpOwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX0dldFNsaWNlKFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOwotCVB5TWFwcGluZ01ldGhvZHMgKm1wOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5TWFwcGluZ01ldGhvZHMgKm1wOwogCi0JaWYgKCFzKSByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmICghcykgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9zbGljZSkgewotCQlpZiAoaTEgPCAwIHx8IGkyIDwgMCkgewotCQkJaWYgKG0tPnNxX2xlbmd0aCkgewotCQkJCVB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKLQkJCQlpZiAobCA8IDApCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCWlmIChpMSA8IDApCi0JCQkJCWkxICs9IGw7Ci0JCQkJaWYgKGkyIDwgMCkKLQkJCQkJaTIgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3Ffc2xpY2UocywgaTEsIGkyKTsKLQl9IGVsc2UgaWYgKChtcCA9IHMtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcpICYmIG1wLT5tcF9zdWJzY3JpcHQpIHsKLQkJUHlPYmplY3QgKnJlczsKLQkJUHlPYmplY3QgKnNsaWNlID0gX1B5U2xpY2VfRnJvbUluZGljZXMoaTEsIGkyKTsKLQkJaWYgKCFzbGljZSkKLQkJCXJldHVybiBOVUxMOwotCQlyZXMgPSBtcC0+bXBfc3Vic2NyaXB0KHMsIHNsaWNlKTsKLQkJUHlfREVDUkVGKHNsaWNlKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgbSA9IHMtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlOworICAgIGlmIChtICYmIG0tPnNxX3NsaWNlKSB7CisgICAgICAgIGlmIChpMSA8IDAgfHwgaTIgPCAwKSB7CisgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOworICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKGkxIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaTEgKz0gbDsKKyAgICAgICAgICAgICAgICBpZiAoaTIgPCAwKQorICAgICAgICAgICAgICAgICAgICBpMiArPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtLT5zcV9zbGljZShzLCBpMSwgaTIpOworICAgIH0gZWxzZSBpZiAoKG1wID0gcy0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZykgJiYgbXAtPm1wX3N1YnNjcmlwdCkgeworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBQeU9iamVjdCAqc2xpY2UgPSBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpMSwgaTIpOworICAgICAgICBpZiAoIXNsaWNlKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlcyA9IG1wLT5tcF9zdWJzY3JpcHQocywgc2xpY2UpOworICAgICAgICBQeV9ERUNSRUYoc2xpY2UpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgaXMgdW5zbGljZWFibGUiLCBzKTsKKyAgICByZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGlzIHVuc2xpY2VhYmxlIiwgcyk7CiB9CiAKIGludAogUHlTZXF1ZW5jZV9TZXRJdGVtKFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICpvKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfYXNzX2l0ZW0pIHsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlpZiAobS0+c3FfbGVuZ3RoKSB7Ci0JCQkJUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOwotCQkJCWlmIChsIDwgMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWkgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3FfYXNzX2l0ZW0ocywgaSwgbyk7Ci0JfQorICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9hc3NfaXRlbSkgeworICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIGlmIChtLT5zcV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7CisgICAgICAgICAgICAgICAgaWYgKGwgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgaSArPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtLT5zcV9hc3NfaXRlbShzLCBpLCBvKTsKKyAgICB9CiAKLQl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQiLCBzKTsKLQlyZXR1cm4gLTE7CisgICAgdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Iiwgcyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBpbnQKIFB5U2VxdWVuY2VfRGVsSXRlbShQeU9iamVjdCAqcywgUHlfc3NpemVfdCBpKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfYXNzX2l0ZW0pIHsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlpZiAobS0+c3FfbGVuZ3RoKSB7Ci0JCQkJUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOwotCQkJCWlmIChsIDwgMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWkgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3FfYXNzX2l0ZW0ocywgaSwgKFB5T2JqZWN0ICopTlVMTCk7Ci0JfQorICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9hc3NfaXRlbSkgeworICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgIGlmIChtLT5zcV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7CisgICAgICAgICAgICAgICAgaWYgKGwgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgaSArPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtLT5zcV9hc3NfaXRlbShzLCBpLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICB9CiAKLQl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lc24ndCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iLCBzKTsKLQlyZXR1cm4gLTE7CisgICAgdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIiwgcyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBpbnQKIFB5U2VxdWVuY2VfU2V0U2xpY2UoUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIsIFB5T2JqZWN0ICpvKQogewotCVB5U2VxdWVuY2VNZXRob2RzICptOwotCVB5TWFwcGluZ01ldGhvZHMgKm1wOworICAgIFB5U2VxdWVuY2VNZXRob2RzICptOworICAgIFB5TWFwcGluZ01ldGhvZHMgKm1wOwogCi0JaWYgKHMgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQltID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7Ci0JaWYgKG0gJiYgbS0+c3FfYXNzX3NsaWNlKSB7Ci0JCWlmIChpMSA8IDAgfHwgaTIgPCAwKSB7Ci0JCQlpZiAobS0+c3FfbGVuZ3RoKSB7Ci0JCQkJUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOwotCQkJCWlmIChsIDwgMCkKLQkJCQkJcmV0dXJuIC0xOwotCQkJCWlmIChpMSA8IDApCi0JCQkJCWkxICs9IGw7Ci0JCQkJaWYgKGkyIDwgMCkKLQkJCQkJaTIgKz0gbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbS0+c3FfYXNzX3NsaWNlKHMsIGkxLCBpMiwgbyk7Ci0JfSBlbHNlIGlmICgobXAgPSBzLT5vYl90eXBlLT50cF9hc19tYXBwaW5nKSAmJiBtcC0+bXBfYXNzX3N1YnNjcmlwdCkgewotCQlpbnQgcmVzOwotCQlQeU9iamVjdCAqc2xpY2UgPSBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpMSwgaTIpOwotCQlpZiAoIXNsaWNlKQotCQkJcmV0dXJuIC0xOwotCQlyZXMgPSBtcC0+bXBfYXNzX3N1YnNjcmlwdChzLCBzbGljZSwgbyk7Ci0JCVB5X0RFQ1JFRihzbGljZSk7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIG0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICBpZiAobSAmJiBtLT5zcV9hc3Nfc2xpY2UpIHsKKyAgICAgICAgaWYgKGkxIDwgMCB8fCBpMiA8IDApIHsKKyAgICAgICAgICAgIGlmIChtLT5zcV9sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7CisgICAgICAgICAgICAgICAgaWYgKGwgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgaWYgKGkxIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaTEgKz0gbDsKKyAgICAgICAgICAgICAgICBpZiAoaTIgPCAwKQorICAgICAgICAgICAgICAgICAgICBpMiArPSBsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtLT5zcV9hc3Nfc2xpY2UocywgaTEsIGkyLCBvKTsKKyAgICB9IGVsc2UgaWYgKChtcCA9IHMtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcpICYmIG1wLT5tcF9hc3Nfc3Vic2NyaXB0KSB7CisgICAgICAgIGludCByZXM7CisgICAgICAgIFB5T2JqZWN0ICpzbGljZSA9IF9QeVNsaWNlX0Zyb21JbmRpY2VzKGkxLCBpMik7CisgICAgICAgIGlmICghc2xpY2UpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlcyA9IG1wLT5tcF9hc3Nfc3Vic2NyaXB0KHMsIHNsaWNlLCBvKTsKKyAgICAgICAgUHlfREVDUkVGKHNsaWNlKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lc24ndCBzdXBwb3J0IHNsaWNlIGFzc2lnbm1lbnQiLCBzKTsKLQlyZXR1cm4gLTE7CisgICAgdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBhc3NpZ25tZW50Iiwgcyk7CisgICAgcmV0dXJuIC0xOwogfQogCiBpbnQKIFB5U2VxdWVuY2VfRGVsU2xpY2UoUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIpCiB7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKm07CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKm07CiAKLQlpZiAocyA9PSBOVUxMKSB7Ci0JCW51bGxfZXJyb3IoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW0gPSBzLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQlpZiAobSAmJiBtLT5zcV9hc3Nfc2xpY2UpIHsKLQkJaWYgKGkxIDwgMCB8fCBpMiA8IDApIHsKLQkJCWlmIChtLT5zcV9sZW5ndGgpIHsKLQkJCQlQeV9zc2l6ZV90IGwgPSAoKm0tPnNxX2xlbmd0aCkocyk7Ci0JCQkJaWYgKGwgPCAwKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJaWYgKGkxIDwgMCkKLQkJCQkJaTEgKz0gbDsKLQkJCQlpZiAoaTIgPCAwKQotCQkJCQlpMiArPSBsOwotCQkJfQotCQl9Ci0JCXJldHVybiBtLT5zcV9hc3Nfc2xpY2UocywgaTEsIGkyLCAoUHlPYmplY3QgKilOVUxMKTsKLQl9Ci0JdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBzbGljZSBkZWxldGlvbiIsIHMpOwotCXJldHVybiAtMTsKKyAgICBtID0gcy0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2U7CisgICAgaWYgKG0gJiYgbS0+c3FfYXNzX3NsaWNlKSB7CisgICAgICAgIGlmIChpMSA8IDAgfHwgaTIgPCAwKSB7CisgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOworICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGlmIChpMSA8IDApCisgICAgICAgICAgICAgICAgICAgIGkxICs9IGw7CisgICAgICAgICAgICAgICAgaWYgKGkyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaTIgKz0gbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbS0+c3FfYXNzX3NsaWNlKHMsIGkxLCBpMiwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgfQorICAgIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgZGVsZXRpb24iLCBzKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfVHVwbGUoUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKml0OyAgLyogaXRlcih2KSAqLwotCVB5X3NzaXplX3QgbjsgICAgICAgICAvKiBndWVzcyBmb3IgcmVzdWx0IHR1cGxlIHNpemUgKi8KLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlQeV9zc2l6ZV90IGo7CisgICAgUHlPYmplY3QgKml0OyAgLyogaXRlcih2KSAqLworICAgIFB5X3NzaXplX3QgbjsgICAgICAgICAvKiBndWVzcyBmb3IgcmVzdWx0IHR1cGxlIHNpemUgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGo7CiAKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQkvKiBTcGVjaWFsLWNhc2UgdGhlIGNvbW1vbiB0dXBsZSBhbmQgbGlzdCBjYXNlcywgZm9yIGVmZmljaWVuY3kuICovCi0JaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSkgewotCQkvKiBOb3RlIHRoYXQgd2UgY2FuJ3Qga25vdyB3aGV0aGVyIGl0J3Mgc2FmZSB0byByZXR1cm4KLQkJICAgYSB0dXBsZSAqc3ViY2xhc3MqIGluc3RhbmNlIGFzLWlzLCBoZW5jZSB0aGUgcmVzdHJpY3Rpb24KLQkJICAgdG8gZXhhY3QgdHVwbGVzIGhlcmUuICBJbiBjb250cmFzdCwgbGlzdHMgYWx3YXlzIG1ha2UKLQkJICAgYSBjb3B5LCBzbyB0aGVyZSdzIG5vIG5lZWQgZm9yIGV4YWN0bmVzcyBiZWxvdy4gKi8KLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gdjsKLQl9Ci0JaWYgKFB5TGlzdF9DaGVjayh2KSkKLQkJcmV0dXJuIFB5TGlzdF9Bc1R1cGxlKHYpOworICAgIC8qIFNwZWNpYWwtY2FzZSB0aGUgY29tbW9uIHR1cGxlIGFuZCBsaXN0IGNhc2VzLCBmb3IgZWZmaWNpZW5jeS4gKi8KKyAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBrbm93IHdoZXRoZXIgaXQncyBzYWZlIHRvIHJldHVybgorICAgICAgICAgICBhIHR1cGxlICpzdWJjbGFzcyogaW5zdGFuY2UgYXMtaXMsIGhlbmNlIHRoZSByZXN0cmljdGlvbgorICAgICAgICAgICB0byBleGFjdCB0dXBsZXMgaGVyZS4gIEluIGNvbnRyYXN0LCBsaXN0cyBhbHdheXMgbWFrZQorICAgICAgICAgICBhIGNvcHksIHNvIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgZXhhY3RuZXNzIGJlbG93LiAqLworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICBpZiAoUHlMaXN0X0NoZWNrKHYpKQorICAgICAgICByZXR1cm4gUHlMaXN0X0FzVHVwbGUodik7CiAKLQkvKiBHZXQgaXRlcmF0b3IuICovCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEd1ZXNzIHJlc3VsdCBzaXplIGFuZCBhbGxvY2F0ZSBzcGFjZS4gKi8KLQluID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQodiwgMTApOwotCWlmIChuID09IC0xKQotCQlnb3RvIEZhaWw7Ci0JcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgLyogR3Vlc3MgcmVzdWx0IHNpemUgYW5kIGFsbG9jYXRlIHNwYWNlLiAqLworICAgIG4gPSBfUHlPYmplY3RfTGVuZ3RoSGludCh2LCAxMCk7CisgICAgaWYgKG4gPT0gLTEpCisgICAgICAgIGdvdG8gRmFpbDsKKyAgICByZXN1bHQgPSBQeVR1cGxlX05ldyhuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCS8qIEZpbGwgdGhlIHR1cGxlLiAqLwotCWZvciAoaiA9IDA7IDsgKytqKSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlnb3RvIEZhaWw7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoaiA+PSBuKSB7Ci0JCQlQeV9zc2l6ZV90IG9sZG4gPSBuOwotCQkJLyogVGhlIG92ZXItYWxsb2NhdGlvbiBzdHJhdGVneSBjYW4gZ3JvdyBhIGJpdCBmYXN0ZXIKLQkJCSAgIHRoYW4gZm9yIGxpc3RzIGJlY2F1c2UgdW5saWtlIGxpc3RzIHRoZSAKLQkJCSAgIG92ZXItYWxsb2NhdGlvbiBpc24ndCBwZXJtYW5lbnQgLS0gd2UgcmVjbGFpbQotCQkJICAgdGhlIGV4Y2VzcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUuCi0JCQkgICBTbywgZ3JvdyBieSB0ZW4gYW5kIHRoZW4gYWRkIDI1JS4KLQkJCSovCi0JCQluICs9IDEwOwotCQkJbiArPSBuID4+IDI7Ci0JCQlpZiAobiA8IG9sZG4pIHsKLQkJCQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWw7IAotCQkJfQotCQkJaWYgKF9QeVR1cGxlX1Jlc2l6ZSgmcmVzdWx0LCBuKSAhPSAwKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbDsKLQkJCX0KLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaiwgaXRlbSk7Ci0JfQorICAgIC8qIEZpbGwgdGhlIHR1cGxlLiAqLworICAgIGZvciAoaiA9IDA7IDsgKytqKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaiA+PSBuKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG9sZG4gPSBuOworICAgICAgICAgICAgLyogVGhlIG92ZXItYWxsb2NhdGlvbiBzdHJhdGVneSBjYW4gZ3JvdyBhIGJpdCBmYXN0ZXIKKyAgICAgICAgICAgICAgIHRoYW4gZm9yIGxpc3RzIGJlY2F1c2UgdW5saWtlIGxpc3RzIHRoZQorICAgICAgICAgICAgICAgb3Zlci1hbGxvY2F0aW9uIGlzbid0IHBlcm1hbmVudCAtLSB3ZSByZWNsYWltCisgICAgICAgICAgICAgICB0aGUgZXhjZXNzIGJlZm9yZSB0aGUgZW5kIG9mIHRoaXMgcm91dGluZS4KKyAgICAgICAgICAgICAgIFNvLCBncm93IGJ5IHRlbiBhbmQgdGhlbiBhZGQgMjUlLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG4gKz0gMTA7CisgICAgICAgICAgICBuICs9IG4gPj4gMjsKKyAgICAgICAgICAgIGlmIChuIDwgb2xkbikgeworICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfUHlUdXBsZV9SZXNpemUoJnJlc3VsdCwgbikgIT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGosIGl0ZW0pOworICAgIH0KIAotCS8qIEN1dCB0dXBsZSBiYWNrIGlmIGd1ZXNzIHdhcyB0b28gbGFyZ2UuICovCi0JaWYgKGogPCBuICYmCi0JICAgIF9QeVR1cGxlX1Jlc2l6ZSgmcmVzdWx0LCBqKSAhPSAwKQotCQlnb3RvIEZhaWw7CisgICAgLyogQ3V0IHR1cGxlIGJhY2sgaWYgZ3Vlc3Mgd2FzIHRvbyBsYXJnZS4gKi8KKyAgICBpZiAoaiA8IG4gJiYKKyAgICAgICAgX1B5VHVwbGVfUmVzaXplKCZyZXN1bHQsIGopICE9IDApCisgICAgICAgIGdvdG8gRmFpbDsKIAotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9ERUNSRUYoaXQpOworICAgIHJldHVybiByZXN1bHQ7CiAKIEZhaWw6Ci0JUHlfWERFQ1JFRihyZXN1bHQpOwotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2VxdWVuY2VfTGlzdChQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OyAgLyogcmVzdWx0IGxpc3QgKi8KLQlQeU9iamVjdCAqcnY7ICAgICAgLyogcmV0dXJuIHZhbHVlIGZyb20gUHlMaXN0X0V4dGVuZCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAvKiByZXN1bHQgbGlzdCAqLworICAgIFB5T2JqZWN0ICpydjsgICAgICAvKiByZXR1cm4gdmFsdWUgZnJvbSBQeUxpc3RfRXh0ZW5kICovCiAKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQlyZXN1bHQgPSBQeUxpc3RfTmV3KDApOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcnYgPSBfUHlMaXN0X0V4dGVuZCgoUHlMaXN0T2JqZWN0ICopcmVzdWx0LCB2KTsKLQlpZiAocnYgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihydik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBydiA9IF9QeUxpc3RfRXh0ZW5kKChQeUxpc3RPYmplY3QgKilyZXN1bHQsIHYpOworICAgIGlmIChydiA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeVNlcXVlbmNlX0Zhc3QoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKm0pCiB7Ci0JUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdDsKIAotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCWlmIChQeUxpc3RfQ2hlY2tFeGFjdCh2KSB8fCBQeVR1cGxlX0NoZWNrRXhhY3QodikpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gdjsKLQl9CisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHYpIHx8IFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KIAotIAlpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JaWYgKGl0ID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG0pOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOworICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JdiA9IFB5U2VxdWVuY2VfTGlzdChpdCk7Ci0JUHlfREVDUkVGKGl0KTsKKyAgICB2ID0gUHlTZXF1ZW5jZV9MaXN0KGl0KTsKKyAgICBQeV9ERUNSRUYoaXQpOwogCi0JcmV0dXJuIHY7CisgICAgcmV0dXJuIHY7CiB9CiAKIC8qIEl0ZXJhdGUgb3ZlciBzZXEuICBSZXN1bHQgZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW9uOgogICAgUFlfSVRFUlNFQVJDSF9DT1VOVDogIC0xIGlmIGVycm9yLCBlbHNlICMgb2YgdGltZXMgb2JqIGFwcGVhcnMgaW4gc2VxLgogICAgUFlfSVRFUlNFQVJDSF9JTkRFWDogIDAtYmFzZWQgaW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZSBvZiBvYmogaW4gc2VxOwotICAgCXNldCBWYWx1ZUVycm9yIGFuZCByZXR1cm4gLTEgaWYgbm9uZSBmb3VuZDsgYWxzbyByZXR1cm4gLTEgb24gZXJyb3IuCisgICAgc2V0IFZhbHVlRXJyb3IgYW5kIHJldHVybiAtMSBpZiBub25lIGZvdW5kOyBhbHNvIHJldHVybiAtMSBvbiBlcnJvci4KICAgIFB5X0lURVJTRUFSQ0hfQ09OVEFJTlM6ICByZXR1cm4gMSBpZiBvYmogaW4gc2VxLCBlbHNlIDA7IC0xIG9uIGVycm9yLgogKi8KIFB5X3NzaXplX3QKIF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goUHlPYmplY3QgKnNlcSwgUHlPYmplY3QgKm9iaiwgaW50IG9wZXJhdGlvbikKIHsKLQlQeV9zc2l6ZV90IG47Ci0JaW50IHdyYXBwZWQ7ICAvKiBmb3IgUFlfSVRFUlNFQVJDSF9JTkRFWCwgdHJ1ZSBpZmYgbiB3cmFwcGVkIGFyb3VuZCAqLwotCVB5T2JqZWN0ICppdDsgIC8qIGl0ZXIoc2VxKSAqLworICAgIFB5X3NzaXplX3QgbjsKKyAgICBpbnQgd3JhcHBlZDsgIC8qIGZvciBQWV9JVEVSU0VBUkNIX0lOREVYLCB0cnVlIGlmZiBuIHdyYXBwZWQgYXJvdW5kICovCisgICAgUHlPYmplY3QgKml0OyAgLyogaXRlcihzZXEpICovCiAKLQlpZiAoc2VxID09IE5VTEwgfHwgb2JqID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChzZXEgPT0gTlVMTCB8fCBvYmogPT0gTlVMTCkgeworICAgICAgICBudWxsX2Vycm9yKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCkgewotCQl0eXBlX2Vycm9yKCJhcmd1bWVudCBvZiB0eXBlICclLjIwMHMnIGlzIG5vdCBpdGVyYWJsZSIsIHNlcSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgdHlwZV9lcnJvcigiYXJndW1lbnQgb2YgdHlwZSAnJS4yMDBzJyBpcyBub3QgaXRlcmFibGUiLCBzZXEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbiA9IHdyYXBwZWQgPSAwOwotCWZvciAoOzspIHsKLQkJaW50IGNtcDsKLQkJUHlPYmplY3QgKml0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gRmFpbDsKLQkJCWJyZWFrOwotCQl9CisgICAgbiA9IHdyYXBwZWQgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGNtcDsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKG9iaiwgaXRlbSwgUHlfRVEpOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCWlmIChjbXAgPCAwKQotCQkJZ290byBGYWlsOwotCQlpZiAoY21wID4gMCkgewotCQkJc3dpdGNoIChvcGVyYXRpb24pIHsKLQkJCWNhc2UgUFlfSVRFUlNFQVJDSF9DT1VOVDoKLQkJCQlpZiAobiA9PSBQWV9TU0laRV9UX01BWCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJICAgICAgICJjb3VudCBleGNlZWRzIEMgaW50ZWdlciBzaXplIik7Ci0JCQkJCWdvdG8gRmFpbDsKLQkJCQl9Ci0JCQkJKytuOwotCQkJCWJyZWFrOworICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wob2JqLCBpdGVtLCBQeV9FUSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIGlmIChjbXAgPiAwKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG9wZXJhdGlvbikgeworICAgICAgICAgICAgY2FzZSBQWV9JVEVSU0VBUkNIX0NPVU5UOgorICAgICAgICAgICAgICAgIGlmIChuID09IFBZX1NTSVpFX1RfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50IGV4Y2VlZHMgQyBpbnRlZ2VyIHNpemUiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK247CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCWNhc2UgUFlfSVRFUlNFQVJDSF9JTkRFWDoKLQkJCQlpZiAod3JhcHBlZCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJICAgICAgICJpbmRleCBleGNlZWRzIEMgaW50ZWdlciBzaXplIik7Ci0JCQkJCWdvdG8gRmFpbDsKLQkJCQl9Ci0JCQkJZ290byBEb25lOworICAgICAgICAgICAgY2FzZSBQWV9JVEVSU0VBUkNIX0lOREVYOgorICAgICAgICAgICAgICAgIGlmICh3cmFwcGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4IGV4Y2VlZHMgQyBpbnRlZ2VyIHNpemUiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CiAKLQkJCWNhc2UgUFlfSVRFUlNFQVJDSF9DT05UQUlOUzoKLQkJCQluID0gMTsKLQkJCQlnb3RvIERvbmU7CisgICAgICAgICAgICBjYXNlIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlM6CisgICAgICAgICAgICAgICAgbiA9IDE7CisgICAgICAgICAgICAgICAgZ290byBEb25lOwogCi0JCQlkZWZhdWx0OgotCQkJCWFzc2VydCghInVua25vd24gb3BlcmF0aW9uIik7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KCEidW5rbm93biBvcGVyYXRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCWlmIChvcGVyYXRpb24gPT0gUFlfSVRFUlNFQVJDSF9JTkRFWCkgewotCQkJaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpCi0JCQkJd3JhcHBlZCA9IDE7Ci0JCQkrK247Ci0JCX0KLQl9CisgICAgICAgIGlmIChvcGVyYXRpb24gPT0gUFlfSVRFUlNFQVJDSF9JTkRFWCkgeworICAgICAgICAgICAgaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpCisgICAgICAgICAgICAgICAgd3JhcHBlZCA9IDE7CisgICAgICAgICAgICArK247CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAob3BlcmF0aW9uICE9IFBZX0lURVJTRUFSQ0hfSU5ERVgpCi0JCWdvdG8gRG9uZTsKKyAgICBpZiAob3BlcmF0aW9uICE9IFBZX0lURVJTRUFSQ0hfSU5ERVgpCisgICAgICAgIGdvdG8gRG9uZTsKIAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkgICAgICAgICJzZXF1ZW5jZS5pbmRleCh4KTogeCBub3QgaW4gc2VxdWVuY2UiKTsKLQkvKiBmYWxsIGludG8gZmFpbHVyZSBjb2RlICovCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZS5pbmRleCh4KTogeCBub3QgaW4gc2VxdWVuY2UiKTsKKyAgICAvKiBmYWxsIGludG8gZmFpbHVyZSBjb2RlICovCiBGYWlsOgotCW4gPSAtMTsKLQkvKiBmYWxsIHRocm91Z2ggKi8KKyAgICBuID0gLTE7CisgICAgLyogZmFsbCB0aHJvdWdoICovCiBEb25lOgotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIG47CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gbjsKIAogfQogCkBAIC0yMzM0LDcgKzIzMzQsNyBAQAogUHlfc3NpemVfdAogUHlTZXF1ZW5jZV9Db3VudChQeU9iamVjdCAqcywgUHlPYmplY3QgKm8pCiB7Ci0JcmV0dXJuIF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2gocywgbywgUFlfSVRFUlNFQVJDSF9DT1VOVCk7CisgICAgcmV0dXJuIF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2gocywgbywgUFlfSVRFUlNFQVJDSF9DT1VOVCk7CiB9CiAKIC8qIFJldHVybiAtMSBpZiBlcnJvcjsgMSBpZiBvYiBpbiBzZXE7IDAgaWYgb2Igbm90IGluIHNlcS4KQEAgLTIzNDMsMTQgKzIzNDMsMTQgQEAKIGludAogUHlTZXF1ZW5jZV9Db250YWlucyhQeU9iamVjdCAqc2VxLCBQeU9iamVjdCAqb2IpCiB7Ci0JUHlfc3NpemVfdCByZXN1bHQ7Ci0JaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHNlcS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOKSkgewotCQlQeVNlcXVlbmNlTWV0aG9kcyAqc3FtID0gc2VxLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKLQkgICAgICAgIGlmIChzcW0gIT0gTlVMTCAmJiBzcW0tPnNxX2NvbnRhaW5zICE9IE5VTEwpCi0JCQlyZXR1cm4gKCpzcW0tPnNxX2NvbnRhaW5zKShzZXEsIG9iKTsKLQl9Ci0JcmVzdWx0ID0gX1B5U2VxdWVuY2VfSXRlclNlYXJjaChzZXEsIG9iLCBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TKTsKLQlyZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChyZXN1bHQsIFB5X3NzaXplX3QsIGludCk7CisgICAgUHlfc3NpemVfdCByZXN1bHQ7CisgICAgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHNlcS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOKSkgeworICAgICAgICBQeVNlcXVlbmNlTWV0aG9kcyAqc3FtID0gc2VxLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICAgICAgaWYgKHNxbSAhPSBOVUxMICYmIHNxbS0+c3FfY29udGFpbnMgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAoKnNxbS0+c3FfY29udGFpbnMpKHNlcSwgb2IpOworICAgIH0KKyAgICByZXN1bHQgPSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKHNlcSwgb2IsIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMpOworICAgIHJldHVybiBQeV9TQUZFX0RPV05DQVNUKHJlc3VsdCwgUHlfc3NpemVfdCwgaW50KTsKIH0KIAogLyogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KQEAgLTIzNTgsMTMgKzIzNTgsMTMgQEAKIGludAogUHlTZXF1ZW5jZV9JbihQeU9iamVjdCAqdywgUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5U2VxdWVuY2VfQ29udGFpbnModywgdik7CisgICAgcmV0dXJuIFB5U2VxdWVuY2VfQ29udGFpbnModywgdik7CiB9CiAKIFB5X3NzaXplX3QKIFB5U2VxdWVuY2VfSW5kZXgoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICpvKQogewotCXJldHVybiBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKHMsIG8sIFBZX0lURVJTRUFSQ0hfSU5ERVgpOworICAgIHJldHVybiBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKHMsIG8sIFBZX0lURVJTRUFSQ0hfSU5ERVgpOwogfQogCiAvKiBPcGVyYXRpb25zIG9uIG1hcHBpbmdzICovCkBAIC0yMzcyLDEwMiArMjM3MiwxMDIgQEAKIGludAogUHlNYXBwaW5nX0NoZWNrKFB5T2JqZWN0ICpvKQogewotCWlmIChvICYmIFB5SW5zdGFuY2VfQ2hlY2sobykpCi0JCXJldHVybiBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG8sICJfX2dldGl0ZW1fXyIpOworICAgIGlmIChvICYmIFB5SW5zdGFuY2VfQ2hlY2sobykpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG8sICJfX2dldGl0ZW1fXyIpOwogCi0JcmV0dXJuICBvICYmIG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmcgJiYKLQkJby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZy0+bXBfc3Vic2NyaXB0ICYmCi0JCSEoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYgCi0JCSAgby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX3NsaWNlKTsKKyAgICByZXR1cm4gIG8gJiYgby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZyAmJgorICAgICAgICBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nLT5tcF9zdWJzY3JpcHQgJiYKKyAgICAgICAgIShvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAmJgorICAgICAgICAgIG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9zbGljZSk7CiB9CiAKIFB5X3NzaXplX3QKIFB5TWFwcGluZ19TaXplKFB5T2JqZWN0ICpvKQogewotCVB5TWFwcGluZ01ldGhvZHMgKm07CisgICAgUHlNYXBwaW5nTWV0aG9kcyAqbTsKIAotCWlmIChvID09IE5VTEwpIHsKLQkJbnVsbF9lcnJvcigpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChvID09IE5VTEwpIHsKKyAgICAgICAgbnVsbF9lcnJvcigpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbSA9IG8tPm9iX3R5cGUtPnRwX2FzX21hcHBpbmc7Ci0JaWYgKG0gJiYgbS0+bXBfbGVuZ3RoKQotCQlyZXR1cm4gbS0+bXBfbGVuZ3RoKG8pOworICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOworICAgIGlmIChtICYmIG0tPm1wX2xlbmd0aCkKKyAgICAgICAgcmV0dXJuIG0tPm1wX2xlbmd0aChvKTsKIAotCXR5cGVfZXJyb3IoIm9iamVjdCBvZiB0eXBlICclLjIwMHMnIGhhcyBubyBsZW4oKSIsIG8pOwotCXJldHVybiAtMTsKKyAgICB0eXBlX2Vycm9yKCJvYmplY3Qgb2YgdHlwZSAnJS4yMDBzJyBoYXMgbm8gbGVuKCkiLCBvKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKICN1bmRlZiBQeU1hcHBpbmdfTGVuZ3RoCiBQeV9zc2l6ZV90CiBQeU1hcHBpbmdfTGVuZ3RoKFB5T2JqZWN0ICpvKQogewotCXJldHVybiBQeU1hcHBpbmdfU2l6ZShvKTsKKyAgICByZXR1cm4gUHlNYXBwaW5nX1NpemUobyk7CiB9CiAjZGVmaW5lIFB5TWFwcGluZ19MZW5ndGggUHlNYXBwaW5nX1NpemUKIAogUHlPYmplY3QgKgogUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSkKIHsKLQlQeU9iamVjdCAqb2tleSwgKnI7CisgICAgUHlPYmplY3QgKm9rZXksICpyOwogCi0JaWYgKGtleSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCW9rZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7Ci0JaWYgKG9rZXkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JciA9IFB5T2JqZWN0X0dldEl0ZW0obywgb2tleSk7Ci0JUHlfREVDUkVGKG9rZXkpOwotCXJldHVybiByOworICAgIG9rZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7CisgICAgaWYgKG9rZXkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgciA9IFB5T2JqZWN0X0dldEl0ZW0obywgb2tleSk7CisgICAgUHlfREVDUkVGKG9rZXkpOworICAgIHJldHVybiByOwogfQogCiBpbnQKIFB5TWFwcGluZ19TZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqb2tleTsKLQlpbnQgcjsKKyAgICBQeU9iamVjdCAqb2tleTsKKyAgICBpbnQgcjsKIAotCWlmIChrZXkgPT0gTlVMTCkgewotCQludWxsX2Vycm9yKCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKGtleSA9PSBOVUxMKSB7CisgICAgICAgIG51bGxfZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCW9rZXkgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7Ci0JaWYgKG9rZXkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXIgPSBQeU9iamVjdF9TZXRJdGVtKG8sIG9rZXksIHZhbHVlKTsKLQlQeV9ERUNSRUYob2tleSk7Ci0JcmV0dXJuIHI7CisgICAgb2tleSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoa2V5KTsKKyAgICBpZiAob2tleSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgciA9IFB5T2JqZWN0X1NldEl0ZW0obywgb2tleSwgdmFsdWUpOworICAgIFB5X0RFQ1JFRihva2V5KTsKKyAgICByZXR1cm4gcjsKIH0KIAogaW50CiBQeU1hcHBpbmdfSGFzS2V5U3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpCiB7Ci0JUHlPYmplY3QgKnY7CisgICAgUHlPYmplY3QgKnY7CiAKLQl2ID0gUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcobywga2V5KTsKLQlpZiAodikgewotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiAxOwotCX0KLQlQeUVycl9DbGVhcigpOwotCXJldHVybiAwOworICAgIHYgPSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyhvLCBrZXkpOworICAgIGlmICh2KSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlNYXBwaW5nX0hhc0tleShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSkKIHsKLQlQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqdjsKIAotCXYgPSBQeU9iamVjdF9HZXRJdGVtKG8sIGtleSk7Ci0JaWYgKHYpIHsKLQkJUHlfREVDUkVGKHYpOwotCQlyZXR1cm4gMTsKLQl9Ci0JUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gMDsKKyAgICB2ID0gUHlPYmplY3RfR2V0SXRlbShvLCBrZXkpOworICAgIGlmICh2KSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIE9wZXJhdGlvbnMgb24gY2FsbGFibGUgb2JqZWN0cyAqLwpAQCAtMjQ3NywyNTMgKzI0NzcsMjUzIEBACiBQeU9iamVjdCAqCiBQeU9iamVjdF9DYWxsT2JqZWN0KFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYSkKIHsKLQlyZXR1cm4gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMobywgYSwgTlVMTCk7CisgICAgcmV0dXJuIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKG8sIGEsIE5VTEwpOwogfQogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9DYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCiB7Ci0gICAgICAgIHRlcm5hcnlmdW5jIGNhbGw7CisgICAgdGVybmFyeWZ1bmMgY2FsbDsKIAotCWlmICgoY2FsbCA9IGZ1bmMtPm9iX3R5cGUtPnRwX2NhbGwpICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIGNhbGxpbmcgYSBQeXRob24gb2JqZWN0IikpCi0JCSAgICByZXR1cm4gTlVMTDsKLQkJcmVzdWx0ID0gKCpjYWxsKShmdW5jLCBhcmcsIGt3KTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQlQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiTlVMTCByZXN1bHQgd2l0aG91dCBlcnJvciBpbiBQeU9iamVjdF9DYWxsIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICInJS4yMDBzJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlIiwKLQkJICAgICBmdW5jLT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoKGNhbGwgPSBmdW5jLT5vYl90eXBlLT50cF9jYWxsKSAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBjYWxsaW5nIGEgUHl0aG9uIG9iamVjdCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlc3VsdCA9ICgqY2FsbCkoZnVuYywgYXJnLCBrdyk7CisgICAgICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgIk5VTEwgcmVzdWx0IHdpdGhvdXQgZXJyb3IgaW4gUHlPYmplY3RfQ2FsbCIpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZSIsCisgICAgICAgICAgICAgICAgIGZ1bmMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBjYWxsX2Z1bmN0aW9uX3RhaWwoUHlPYmplY3QgKmNhbGxhYmxlLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmV0dmFsOworICAgIFB5T2JqZWN0ICpyZXR2YWw7CiAKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlQeU9iamVjdCAqYTsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlPYmplY3QgKmE7CiAKLQkJYSA9IFB5VHVwbGVfTmV3KDEpOwotCQlpZiAoYSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYXJncyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKGEsIDAsIGFyZ3MpOwotCQlhcmdzID0gYTsKLQl9Ci0JcmV0dmFsID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7CisgICAgICAgIGEgPSBQeVR1cGxlX05ldygxKTsKKyAgICAgICAgaWYgKGEgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhLCAwLCBhcmdzKTsKKyAgICAgICAgYXJncyA9IGE7CisgICAgfQorICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOwogCi0JUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKIAotCXJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5T2JqZWN0ICpjYWxsYWJsZSwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCAqYXJnczsKKyAgICB2YV9saXN0IHZhOworICAgIFB5T2JqZWN0ICphcmdzOwogCi0JaWYgKGNhbGxhYmxlID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQlpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKLQkJdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JCWFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7Ci0JCXZhX2VuZCh2YSk7Ci0JfQotCWVsc2UKLQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkgeworICAgICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICAgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKyAgICAgICAgdmFfZW5kKHZhKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAKLQlyZXR1cm4gY2FsbF9mdW5jdGlvbl90YWlsKGNhbGxhYmxlLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mdW5jdGlvbl90YWlsKGNhbGxhYmxlLCBhcmdzKTsKIH0KIAogUHlPYmplY3QgKgogX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVChQeU9iamVjdCAqY2FsbGFibGUsIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QgKmFyZ3M7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCAqYXJnczsKIAotCWlmIChjYWxsYWJsZSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7Ci0JCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCQlhcmdzID0gX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChmb3JtYXQsIHZhKTsKLQkJdmFfZW5kKHZhKTsKLQl9Ci0JZWxzZQotCQlhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKGZvcm1hdCAmJiAqZm9ybWF0KSB7CisgICAgICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOworICAgICAgICBhcmdzID0gX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChmb3JtYXQsIHZhKTsKKyAgICAgICAgdmFfZW5kKHZhKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAKLQlyZXR1cm4gY2FsbF9mdW5jdGlvbl90YWlsKGNhbGxhYmxlLCBhcmdzKTsKKyAgICByZXR1cm4gY2FsbF9mdW5jdGlvbl90YWlsKGNhbGxhYmxlLCBhcmdzKTsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfQ2FsbE1ldGhvZChQeU9iamVjdCAqbywgY2hhciAqbmFtZSwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqZnVuYyA9IE5VTEw7Ci0JUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CiAKLQlpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAobyA9PSBOVUxMIHx8IG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAotCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sIG5hbWUpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sIG5hbWUpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCXR5cGVfZXJyb3IoImF0dHJpYnV0ZSBvZiB0eXBlICclLjIwMHMnIGlzIG5vdCBjYWxsYWJsZSIsIGZ1bmMpOyAKLQkJZ290byBleGl0OwotCX0KKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgdHlwZV9lcnJvcigiYXR0cmlidXRlIG9mIHR5cGUgJyUuMjAwcycgaXMgbm90IGNhbGxhYmxlIiwgZnVuYyk7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAKLQlpZiAoZm9ybWF0ICYmICpmb3JtYXQpIHsKLQkJdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JCWFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7Ci0JCXZhX2VuZCh2YSk7Ci0JfQotCWVsc2UKLQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkgeworICAgICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICAgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKKyAgICAgICAgdmFfZW5kKHZhKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAKLQlyZXR2YWwgPSBjYWxsX2Z1bmN0aW9uX3RhaWwoZnVuYywgYXJncyk7CisgICAgcmV0dmFsID0gY2FsbF9mdW5jdGlvbl90YWlsKGZ1bmMsIGFyZ3MpOwogCiAgIGV4aXQ6Ci0JLyogYXJncyBnZXRzIGNvbnN1bWVkIGluIGNhbGxfZnVuY3Rpb25fdGFpbCAqLwotCVB5X1hERUNSRUYoZnVuYyk7CisgICAgLyogYXJncyBnZXRzIGNvbnN1bWVkIGluIGNhbGxfZnVuY3Rpb25fdGFpbCAqLworICAgIFB5X1hERUNSRUYoZnVuYyk7CiAKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUKFB5T2JqZWN0ICpvLCBjaGFyICpuYW1lLCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpmdW5jID0gTlVMTDsKLQlQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKKyAgICB2YV9saXN0IHZhOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpmdW5jID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKIAotCWlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChvID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgbmFtZSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgbmFtZSk7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKLQkJdHlwZV9lcnJvcigiYXR0cmlidXRlIG9mIHR5cGUgJyUuMjAwcycgaXMgbm90IGNhbGxhYmxlIiwgZnVuYyk7IAotCQlnb3RvIGV4aXQ7Ci0JfQorICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgeworICAgICAgICB0eXBlX2Vycm9yKCJhdHRyaWJ1dGUgb2YgdHlwZSAnJS4yMDBzJyBpcyBub3QgY2FsbGFibGUiLCBmdW5jKTsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KIAotCWlmIChmb3JtYXQgJiYgKmZvcm1hdCkgewotCQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQkJYXJncyA9IF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoZm9ybWF0LCB2YSk7Ci0JCXZhX2VuZCh2YSk7Ci0JfQotCWVsc2UKLQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChmb3JtYXQgJiYgKmZvcm1hdCkgeworICAgICAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICAgICAgYXJncyA9IF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoZm9ybWF0LCB2YSk7CisgICAgICAgIHZhX2VuZCh2YSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwogCi0JcmV0dmFsID0gY2FsbF9mdW5jdGlvbl90YWlsKGZ1bmMsIGFyZ3MpOworICAgIHJldHZhbCA9IGNhbGxfZnVuY3Rpb25fdGFpbChmdW5jLCBhcmdzKTsKIAogICBleGl0OgotCS8qIGFyZ3MgZ2V0cyBjb25zdW1lZCBpbiBjYWxsX2Z1bmN0aW9uX3RhaWwgKi8KLQlQeV9YREVDUkVGKGZ1bmMpOworICAgIC8qIGFyZ3MgZ2V0cyBjb25zdW1lZCBpbiBjYWxsX2Z1bmN0aW9uX3RhaWwgKi8KKyAgICBQeV9YREVDUkVGKGZ1bmMpOwogCi0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvYmphcmdzX21rdHVwbGUodmFfbGlzdCB2YSkKIHsKLQlpbnQgaSwgbiA9IDA7Ci0JdmFfbGlzdCBjb3VudHZhOwotCVB5T2JqZWN0ICpyZXN1bHQsICp0bXA7CisgICAgaW50IGksIG4gPSAwOworICAgIHZhX2xpc3QgY291bnR2YTsKKyAgICBQeU9iamVjdCAqcmVzdWx0LCAqdG1wOwogCiAjaWZkZWYgVkFfTElTVF9JU19BUlJBWQotCW1lbWNweShjb3VudHZhLCB2YSwgc2l6ZW9mKHZhX2xpc3QpKTsKKyAgICBtZW1jcHkoY291bnR2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CiAjZWxzZQogI2lmZGVmIF9fdmFfY29weQotCV9fdmFfY29weShjb3VudHZhLCB2YSk7CisgICAgX192YV9jb3B5KGNvdW50dmEsIHZhKTsKICNlbHNlCi0JY291bnR2YSA9IHZhOworICAgIGNvdW50dmEgPSB2YTsKICNlbmRpZgogI2VuZGlmCiAKLQl3aGlsZSAoKChQeU9iamVjdCAqKXZhX2FyZyhjb3VudHZhLCBQeU9iamVjdCAqKSkgIT0gTlVMTCkKLQkJKytuOwotCXJlc3VsdCA9IFB5VHVwbGVfTmV3KG4pOwotCWlmIChyZXN1bHQgIT0gTlVMTCAmJiBuID4gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCQl0bXAgPSAoUHlPYmplY3QgKil2YV9hcmcodmEsIFB5T2JqZWN0ICopOwotCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIHRtcCk7Ci0JCQlQeV9JTkNSRUYodG1wKTsKLQkJfQotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIHdoaWxlICgoKFB5T2JqZWN0ICopdmFfYXJnKGNvdW50dmEsIFB5T2JqZWN0ICopKSAhPSBOVUxMKQorICAgICAgICArK247CisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIG4gPiAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIHRtcCA9IChQeU9iamVjdCAqKXZhX2FyZyh2YSwgUHlPYmplY3QgKik7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdG1wKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0bXApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKFB5T2JqZWN0ICpjYWxsYWJsZSwgUHlPYmplY3QgKm5hbWUsIC4uLikKIHsKLQlQeU9iamVjdCAqYXJncywgKnRtcDsKLQl2YV9saXN0IHZhcmdzOworICAgIFB5T2JqZWN0ICphcmdzLCAqdG1wOworICAgIHZhX2xpc3QgdmFyZ3M7CiAKLQlpZiAoY2FsbGFibGUgPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOwogCi0JY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKGNhbGxhYmxlLCBuYW1lKTsKLQlpZiAoY2FsbGFibGUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyKGNhbGxhYmxlLCBuYW1lKTsKKyAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBjb3VudCB0aGUgYXJncyAqLwotCXZhX3N0YXJ0KHZhcmdzLCBuYW1lKTsKLQlhcmdzID0gb2JqYXJnc19ta3R1cGxlKHZhcmdzKTsKLQl2YV9lbmQodmFyZ3MpOwotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGNhbGxhYmxlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXRtcCA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIGFyZ3MsIE5VTEwpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoY2FsbGFibGUpOworICAgIC8qIGNvdW50IHRoZSBhcmdzICovCisgICAgdmFfc3RhcnQodmFyZ3MsIG5hbWUpOworICAgIGFyZ3MgPSBvYmphcmdzX21rdHVwbGUodmFyZ3MpOworICAgIHZhX2VuZCh2YXJncyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdG1wID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CiAKLQlyZXR1cm4gdG1wOworICAgIHJldHVybiB0bXA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoUHlPYmplY3QgKmNhbGxhYmxlLCAuLi4pCiB7Ci0JUHlPYmplY3QgKmFyZ3MsICp0bXA7Ci0JdmFfbGlzdCB2YXJnczsKKyAgICBQeU9iamVjdCAqYXJncywgKnRtcDsKKyAgICB2YV9saXN0IHZhcmdzOwogCi0JaWYgKGNhbGxhYmxlID09IE5VTEwpCi0JCXJldHVybiBudWxsX2Vycm9yKCk7CisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKLQkvKiBjb3VudCB0aGUgYXJncyAqLwotCXZhX3N0YXJ0KHZhcmdzLCBjYWxsYWJsZSk7Ci0JYXJncyA9IG9iamFyZ3NfbWt0dXBsZSh2YXJncyk7Ci0JdmFfZW5kKHZhcmdzKTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl0bXAgPSBQeU9iamVjdF9DYWxsKGNhbGxhYmxlLCBhcmdzLCBOVUxMKTsKLQlQeV9ERUNSRUYoYXJncyk7CisgICAgLyogY291bnQgdGhlIGFyZ3MgKi8KKyAgICB2YV9zdGFydCh2YXJncywgY2FsbGFibGUpOworICAgIGFyZ3MgPSBvYmphcmdzX21rdHVwbGUodmFyZ3MpOworICAgIHZhX2VuZCh2YXJncyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdG1wID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgYXJncywgTlVMTCk7CisgICAgUHlfREVDUkVGKGFyZ3MpOwogCi0JcmV0dXJuIHRtcDsKKyAgICByZXR1cm4gdG1wOwogfQogCiAKQEAgLTI3NTgsMzA3ICsyNzU4LDMwNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGFic3RyYWN0X2dldF9iYXNlcyhQeU9iamVjdCAqY2xzKQogewotCXN0YXRpYyBQeU9iamVjdCAqX19iYXNlc19fID0gTlVMTDsKLQlQeU9iamVjdCAqYmFzZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpfX2Jhc2VzX18gPSBOVUxMOworICAgIFB5T2JqZWN0ICpiYXNlczsKIAotCWlmIChfX2Jhc2VzX18gPT0gTlVMTCkgewotCQlfX2Jhc2VzX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2Jhc2VzX18iKTsKLQkJaWYgKF9fYmFzZXNfXyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWJhc2VzID0gUHlPYmplY3RfR2V0QXR0cihjbHMsIF9fYmFzZXNfXyk7Ci0JaWYgKGJhc2VzID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlUdXBsZV9DaGVjayhiYXNlcykpIHsKLQkgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gYmFzZXM7CisgICAgaWYgKF9fYmFzZXNfXyA9PSBOVUxMKSB7CisgICAgICAgIF9fYmFzZXNfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fYmFzZXNfXyIpOworICAgICAgICBpZiAoX19iYXNlc19fID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYmFzZXMgPSBQeU9iamVjdF9HZXRBdHRyKGNscywgX19iYXNlc19fKTsKKyAgICBpZiAoYmFzZXMgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGJhc2VzKSkgeworICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGJhc2VzOwogfQogCiAKIHN0YXRpYyBpbnQKIGFic3RyYWN0X2lzc3ViY2xhc3MoUHlPYmplY3QgKmRlcml2ZWQsIFB5T2JqZWN0ICpjbHMpCiB7Ci0JUHlPYmplY3QgKmJhc2VzID0gTlVMTDsKLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IHIgPSAwOworICAgIFB5T2JqZWN0ICpiYXNlcyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIGludCByID0gMDsKIAotCXdoaWxlICgxKSB7Ci0JCWlmIChkZXJpdmVkID09IGNscykKLQkJCXJldHVybiAxOwotCQliYXNlcyA9IGFic3RyYWN0X2dldF9iYXNlcyhkZXJpdmVkKTsKLQkJaWYgKGJhc2VzID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQkJaWYgKG4gPT0gMCkgewotCQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCS8qIEF2b2lkIHJlY3Vyc2l2aXR5IGluIHRoZSBzaW5nbGUgaW5oZXJpdGFuY2UgY2FzZSAqLwotCQlpZiAobiA9PSAxKSB7Ci0JCQlkZXJpdmVkID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgMCk7Ci0JCQlQeV9ERUNSRUYoYmFzZXMpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJciA9IGFic3RyYWN0X2lzc3ViY2xhc3MoUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSksIGNscyk7Ci0JCQlpZiAociAhPSAwKQotCQkJCWJyZWFrOwotCQl9Ci0JCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCXJldHVybiByOwotCX0KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZGVyaXZlZCA9PSBjbHMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgYmFzZXMgPSBhYnN0cmFjdF9nZXRfYmFzZXMoZGVyaXZlZCk7CisgICAgICAgIGlmIChiYXNlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBuID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7CisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBBdm9pZCByZWN1cnNpdml0eSBpbiB0aGUgc2luZ2xlIGluaGVyaXRhbmNlIGNhc2UgKi8KKyAgICAgICAgaWYgKG4gPT0gMSkgeworICAgICAgICAgICAgZGVyaXZlZCA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIDApOworICAgICAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHIgPSBhYnN0cmFjdF9pc3N1YmNsYXNzKFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpLCBjbHMpOworICAgICAgICAgICAgaWYgKHIgIT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGNoZWNrX2NsYXNzKFB5T2JqZWN0ICpjbHMsIGNvbnN0IGNoYXIgKmVycm9yKQogewotCVB5T2JqZWN0ICpiYXNlcyA9IGFic3RyYWN0X2dldF9iYXNlcyhjbHMpOwotCWlmIChiYXNlcyA9PSBOVUxMKSB7Ci0JCS8qIERvIG5vdCBtYXNrIGVycm9ycy4gKi8KLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZXJyb3IpOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfREVDUkVGKGJhc2VzKTsKLQlyZXR1cm4gLTE7CisgICAgUHlPYmplY3QgKmJhc2VzID0gYWJzdHJhY3RfZ2V0X2Jhc2VzKGNscyk7CisgICAgaWYgKGJhc2VzID09IE5VTEwpIHsKKyAgICAgICAgLyogRG8gbm90IG1hc2sgZXJyb3JzLiAqLworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBlcnJvcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIGludAogcmVjdXJzaXZlX2lzaW5zdGFuY2UoUHlPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpjbHMpCiB7Ci0JUHlPYmplY3QgKmljbHM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpfX2NsYXNzX18gPSBOVUxMOwotCWludCByZXR2YWwgPSAwOworICAgIFB5T2JqZWN0ICppY2xzOworICAgIHN0YXRpYyBQeU9iamVjdCAqX19jbGFzc19fID0gTlVMTDsKKyAgICBpbnQgcmV0dmFsID0gMDsKIAotCWlmIChfX2NsYXNzX18gPT0gTlVMTCkgewotCQlfX2NsYXNzX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NsYXNzX18iKTsKLQkJaWYgKF9fY2xhc3NfXyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoX19jbGFzc19fID09IE5VTEwpIHsKKyAgICAgICAgX19jbGFzc19fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jbGFzc19fIik7CisgICAgICAgIGlmIChfX2NsYXNzX18gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoUHlDbGFzc19DaGVjayhjbHMpICYmIFB5SW5zdGFuY2VfQ2hlY2soaW5zdCkpIHsKLQkJUHlPYmplY3QgKmluY2xhc3MgPQotCQkJKFB5T2JqZWN0KikoKFB5SW5zdGFuY2VPYmplY3QqKWluc3QpLT5pbl9jbGFzczsKLQkJcmV0dmFsID0gUHlDbGFzc19Jc1N1YmNsYXNzKGluY2xhc3MsIGNscyk7Ci0JfQotCWVsc2UgaWYgKFB5VHlwZV9DaGVjayhjbHMpKSB7Ci0JCXJldHZhbCA9IFB5T2JqZWN0X1R5cGVDaGVjayhpbnN0LCAoUHlUeXBlT2JqZWN0ICopY2xzKTsKLQkJaWYgKHJldHZhbCA9PSAwKSB7Ci0JCQlQeU9iamVjdCAqYyA9IFB5T2JqZWN0X0dldEF0dHIoaW5zdCwgX19jbGFzc19fKTsKLQkJCWlmIChjID09IE5VTEwpIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGMgIT0gKFB5T2JqZWN0ICopKGluc3QtPm9iX3R5cGUpICYmCi0JCQkJICAgIFB5VHlwZV9DaGVjayhjKSkKLQkJCQkJcmV0dmFsID0gUHlUeXBlX0lzU3VidHlwZSgKLQkJCQkJCShQeVR5cGVPYmplY3QgKiljLAotCQkJCQkJKFB5VHlwZU9iamVjdCAqKWNscyk7Ci0JCQkJUHlfREVDUkVGKGMpOwotCQkJfQotCQl9Ci0JfQotCWVsc2UgewotCQlpZiAoIWNoZWNrX2NsYXNzKGNscywKLQkJCSJpc2luc3RhbmNlKCkgYXJnIDIgbXVzdCBiZSBhIGNsYXNzLCB0eXBlLCIKLQkJCSIgb3IgdHVwbGUgb2YgY2xhc3NlcyBhbmQgdHlwZXMiKSkKLQkJCXJldHVybiAtMTsKLQkJaWNscyA9IFB5T2JqZWN0X0dldEF0dHIoaW5zdCwgX19jbGFzc19fKTsKLQkJaWYgKGljbHMgPT0gTlVMTCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHZhbCA9IDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR2YWwgPSBhYnN0cmFjdF9pc3N1YmNsYXNzKGljbHMsIGNscyk7Ci0JCQlQeV9ERUNSRUYoaWNscyk7Ci0JCX0KLQl9CisgICAgaWYgKFB5Q2xhc3NfQ2hlY2soY2xzKSAmJiBQeUluc3RhbmNlX0NoZWNrKGluc3QpKSB7CisgICAgICAgIFB5T2JqZWN0ICppbmNsYXNzID0KKyAgICAgICAgICAgIChQeU9iamVjdCopKChQeUluc3RhbmNlT2JqZWN0KilpbnN0KS0+aW5fY2xhc3M7CisgICAgICAgIHJldHZhbCA9IFB5Q2xhc3NfSXNTdWJjbGFzcyhpbmNsYXNzLCBjbHMpOworICAgIH0KKyAgICBlbHNlIGlmIChQeVR5cGVfQ2hlY2soY2xzKSkgeworICAgICAgICByZXR2YWwgPSBQeU9iamVjdF9UeXBlQ2hlY2soaW5zdCwgKFB5VHlwZU9iamVjdCAqKWNscyk7CisgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICAgICAgUHlPYmplY3QgKmMgPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fY2xhc3NfXyk7CisgICAgICAgICAgICBpZiAoYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjICE9IChQeU9iamVjdCAqKShpbnN0LT5vYl90eXBlKSAmJgorICAgICAgICAgICAgICAgICAgICBQeVR5cGVfQ2hlY2soYykpCisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFB5VHlwZV9Jc1N1YnR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAoUHlUeXBlT2JqZWN0ICopYywKKyAgICAgICAgICAgICAgICAgICAgICAgIChQeVR5cGVPYmplY3QgKiljbHMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFjaGVja19jbGFzcyhjbHMsCisgICAgICAgICAgICAiaXNpbnN0YW5jZSgpIGFyZyAyIG11c3QgYmUgYSBjbGFzcywgdHlwZSwiCisgICAgICAgICAgICAiIG9yIHR1cGxlIG9mIGNsYXNzZXMgYW5kIHR5cGVzIikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGljbHMgPSBQeU9iamVjdF9HZXRBdHRyKGluc3QsIF9fY2xhc3NfXyk7CisgICAgICAgIGlmIChpY2xzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR2YWwgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dmFsID0gYWJzdHJhY3RfaXNzdWJjbGFzcyhpY2xzLCBjbHMpOworICAgICAgICAgICAgUHlfREVDUkVGKGljbHMpOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBpbnQKIFB5T2JqZWN0X0lzSW5zdGFuY2UoUHlPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpjbHMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpuYW1lID0gTlVMTDsKLQlQeU9iamVjdCAqY2hlY2tlcjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm5hbWUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpjaGVja2VyOwogCi0JLyogUXVpY2sgdGVzdCBmb3IgYW4gZXhhY3QgbWF0Y2ggKi8KLQlpZiAoUHlfVFlQRShpbnN0KSA9PSAoUHlUeXBlT2JqZWN0ICopY2xzKQotCQlyZXR1cm4gMTsKKyAgICAvKiBRdWljayB0ZXN0IGZvciBhbiBleGFjdCBtYXRjaCAqLworICAgIGlmIChQeV9UWVBFKGluc3QpID09IChQeVR5cGVPYmplY3QgKiljbHMpCisgICAgICAgIHJldHVybiAxOwogCi0JaWYgKFB5VHVwbGVfQ2hlY2soY2xzKSkgewotCQlQeV9zc2l6ZV90IGk7Ci0JCVB5X3NzaXplX3QgbjsKLQkJaW50IHIgPSAwOworICAgIGlmIChQeVR1cGxlX0NoZWNrKGNscykpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBQeV9zc2l6ZV90IG47CisgICAgICAgIGludCByID0gMDsKIAotCQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19pbnN0YW5jZWNoZWNrX18iKSkKLQkJCXJldHVybiAtMTsKLQkJbiA9IFB5VHVwbGVfR0VUX1NJWkUoY2xzKTsKLQkJZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQkJUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGNscywgaSk7Ci0JCQlyID0gUHlPYmplY3RfSXNJbnN0YW5jZShpbnN0LCBpdGVtKTsKLQkJCWlmIChyICE9IDApCi0JCQkJLyogZWl0aGVyIGZvdW5kIGl0LCBvciBnb3QgYW4gZXJyb3IgKi8KLQkJCQlicmVhazsKLQkJfQotCQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQkJcmV0dXJuIHI7Ci0JfQotCWlmIChuYW1lID09IE5VTEwpIHsKLQkJbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faW5zdGFuY2VjaGVja19fIik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWNoZWNrZXIgPSBQeU9iamVjdF9HZXRBdHRyKGNscywgbmFtZSk7Ci0JaWYgKGNoZWNrZXIgPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlQeUVycl9DbGVhcigpOwotCWlmIChjaGVja2VyICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnJlczsKLQkJaW50IG9rID0gLTE7Ci0JCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBpbiBfX2luc3RhbmNlY2hlY2tfXyIpKSB7Ci0JCQlQeV9ERUNSRUYoY2hlY2tlcik7Ci0JCQlyZXR1cm4gb2s7Ci0JCX0KLQkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjaGVja2VyLCBpbnN0LCBOVUxMKTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JCVB5X0RFQ1JFRihjaGVja2VyKTsKLQkJaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCX0KLQkJcmV0dXJuIG9rOwotCX0KLQlyZXR1cm4gcmVjdXJzaXZlX2lzaW5zdGFuY2UoaW5zdCwgY2xzKTsKKyAgICAgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9faW5zdGFuY2VjaGVja19fIikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGNscyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShjbHMsIGkpOworICAgICAgICAgICAgciA9IFB5T2JqZWN0X0lzSW5zdGFuY2UoaW5zdCwgaXRlbSk7CisgICAgICAgICAgICBpZiAociAhPSAwKQorICAgICAgICAgICAgICAgIC8qIGVpdGhlciBmb3VuZCBpdCwgb3IgZ290IGFuIGVycm9yICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIG5hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2luc3RhbmNlY2hlY2tfXyIpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjaGVja2VyID0gUHlPYmplY3RfR2V0QXR0cihjbHMsIG5hbWUpOworICAgIGlmIChjaGVja2VyID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBpZiAoY2hlY2tlciAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIGludCBvayA9IC0xOworICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19pbnN0YW5jZWNoZWNrX18iKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGNoZWNrZXIpOworICAgICAgICAgICAgcmV0dXJuIG9rOworICAgICAgICB9CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2hlY2tlciwgaW5zdCwgTlVMTCk7CisgICAgICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgICAgICBQeV9ERUNSRUYoY2hlY2tlcik7CisgICAgICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvazsKKyAgICB9CisgICAgcmV0dXJuIHJlY3Vyc2l2ZV9pc2luc3RhbmNlKGluc3QsIGNscyk7CiB9CiAKIHN0YXRpYyAgaW50CiByZWN1cnNpdmVfaXNzdWJjbGFzcyhQeU9iamVjdCAqZGVyaXZlZCwgUHlPYmplY3QgKmNscykKIHsKLQlpbnQgcmV0dmFsOworICAgIGludCByZXR2YWw7CiAKLSAJaWYgKFB5VHlwZV9DaGVjayhjbHMpICYmIFB5VHlwZV9DaGVjayhkZXJpdmVkKSkgewotIAkJLyogRmFzdCBwYXRoIChub24tcmVjdXJzaXZlKSAqLwotIAkJcmV0dXJuIFB5VHlwZV9Jc1N1YnR5cGUoCi0JCQkoUHlUeXBlT2JqZWN0ICopZGVyaXZlZCwgKFB5VHlwZU9iamVjdCAqKWNscyk7Ci0gCX0KLQlpZiAoIVB5Q2xhc3NfQ2hlY2soZGVyaXZlZCkgfHwgIVB5Q2xhc3NfQ2hlY2soY2xzKSkgewotCQlpZiAoIWNoZWNrX2NsYXNzKGRlcml2ZWQsCi0JCQkJICJpc3N1YmNsYXNzKCkgYXJnIDEgbXVzdCBiZSBhIGNsYXNzIikpCi0JCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5VHlwZV9DaGVjayhjbHMpICYmIFB5VHlwZV9DaGVjayhkZXJpdmVkKSkgeworICAgICAgICAvKiBGYXN0IHBhdGggKG5vbi1yZWN1cnNpdmUpICovCisgICAgICAgIHJldHVybiBQeVR5cGVfSXNTdWJ0eXBlKAorICAgICAgICAgICAgKFB5VHlwZU9iamVjdCAqKWRlcml2ZWQsIChQeVR5cGVPYmplY3QgKiljbHMpOworICAgIH0KKyAgICBpZiAoIVB5Q2xhc3NfQ2hlY2soZGVyaXZlZCkgfHwgIVB5Q2xhc3NfQ2hlY2soY2xzKSkgeworICAgICAgICBpZiAoIWNoZWNrX2NsYXNzKGRlcml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgImlzc3ViY2xhc3MoKSBhcmcgMSBtdXN0IGJlIGEgY2xhc3MiKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAoIWNoZWNrX2NsYXNzKGNscywKLQkJCQkiaXNzdWJjbGFzcygpIGFyZyAyIG11c3QgYmUgYSBjbGFzcyIKLQkJCQkiIG9yIHR1cGxlIG9mIGNsYXNzZXMiKSkKLQkJCXJldHVybiAtMTsKLQkJcmV0dmFsID0gYWJzdHJhY3RfaXNzdWJjbGFzcyhkZXJpdmVkLCBjbHMpOwotCX0KLQllbHNlIHsKLQkJLyogc2hvcnRjdXQgKi8KLQkgIAlpZiAoIShyZXR2YWwgPSAoZGVyaXZlZCA9PSBjbHMpKSkKLQkJCXJldHZhbCA9IFB5Q2xhc3NfSXNTdWJjbGFzcyhkZXJpdmVkLCBjbHMpOwotCX0KKyAgICAgICAgaWYgKCFjaGVja19jbGFzcyhjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAiaXNzdWJjbGFzcygpIGFyZyAyIG11c3QgYmUgYSBjbGFzcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgb3IgdHVwbGUgb2YgY2xhc3NlcyIpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR2YWwgPSBhYnN0cmFjdF9pc3N1YmNsYXNzKGRlcml2ZWQsIGNscyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBzaG9ydGN1dCAqLworICAgICAgICBpZiAoIShyZXR2YWwgPSAoZGVyaXZlZCA9PSBjbHMpKSkKKyAgICAgICAgICAgIHJldHZhbCA9IFB5Q2xhc3NfSXNTdWJjbGFzcyhkZXJpdmVkLCBjbHMpOworICAgIH0KIAotCXJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogaW50CiBQeU9iamVjdF9Jc1N1YmNsYXNzKFB5T2JqZWN0ICpkZXJpdmVkLCBQeU9iamVjdCAqY2xzKQogewotCXN0YXRpYyBQeU9iamVjdCAqbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnQsICp2LCAqdGI7Ci0JUHlPYmplY3QgKmNoZWNrZXI7Ci0JCi0gCWlmIChQeVR1cGxlX0NoZWNrKGNscykpIHsKLSAJCVB5X3NzaXplX3QgaTsKLSAJCVB5X3NzaXplX3QgbjsKLSAJCWludCByID0gMDsKLSAKLSAJCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBpbiBfX3N1YmNsYXNzY2hlY2tfXyIpKQotIAkJCXJldHVybiAtMTsKLSAJCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGNscyk7Ci0gCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gCQkJUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGNscywgaSk7Ci0gCQkJciA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoZGVyaXZlZCwgaXRlbSk7Ci0gCQkJaWYgKHIgIT0gMCkKLSAJCQkJLyogZWl0aGVyIGZvdW5kIGl0LCBvciBnb3QgYW4gZXJyb3IgKi8KLSAJCQkJYnJlYWs7Ci0gCQl9Ci0gCQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLSAJCXJldHVybiByOwotIAl9Ci0JaWYgKG5hbWUgPT0gTlVMTCkgewotCQluYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zdWJjbGFzc2NoZWNrX18iKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JUHlFcnJfRmV0Y2goJnQsICZ2LCAmdGIpOwotCWNoZWNrZXIgPSBQeU9iamVjdF9HZXRBdHRyKGNscywgbmFtZSk7Ci0JUHlFcnJfUmVzdG9yZSh0LCB2LCB0Yik7Ci0JaWYgKGNoZWNrZXIgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcmVzOwotCQlpbnQgb2sgPSAtMTsKLQkJaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9fc3ViY2xhc3NjaGVja19fIikpIHsKLQkJCVB5X0RFQ1JFRihjaGVja2VyKTsKLQkJCXJldHVybiBvazsKLQkJfQotCQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNoZWNrZXIsIGRlcml2ZWQsIE5VTEwpOwotCQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQkJUHlfREVDUkVGKGNoZWNrZXIpOwotCQlpZiAocmVzICE9IE5VTEwpIHsKLQkJCW9rID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCXJldHVybiByZWN1cnNpdmVfaXNzdWJjbGFzcyhkZXJpdmVkLCBjbHMpOworICAgIHN0YXRpYyBQeU9iamVjdCAqbmFtZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnQsICp2LCAqdGI7CisgICAgUHlPYmplY3QgKmNoZWNrZXI7CisKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhjbHMpKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgUHlfc3NpemVfdCBuOworICAgICAgICBpbnQgciA9IDA7CisKKyAgICAgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9fc3ViY2xhc3NjaGVja19fIikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGNscyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShjbHMsIGkpOworICAgICAgICAgICAgciA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoZGVyaXZlZCwgaXRlbSk7CisgICAgICAgICAgICBpZiAociAhPSAwKQorICAgICAgICAgICAgICAgIC8qIGVpdGhlciBmb3VuZCBpdCwgb3IgZ290IGFuIGVycm9yICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIG5hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3N1YmNsYXNzY2hlY2tfXyIpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeUVycl9GZXRjaCgmdCwgJnYsICZ0Yik7CisgICAgY2hlY2tlciA9IFB5T2JqZWN0X0dldEF0dHIoY2xzLCBuYW1lKTsKKyAgICBQeUVycl9SZXN0b3JlKHQsIHYsIHRiKTsKKyAgICBpZiAoY2hlY2tlciAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIGludCBvayA9IC0xOworICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19zdWJjbGFzc2NoZWNrX18iKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGNoZWNrZXIpOworICAgICAgICAgICAgcmV0dXJuIG9rOworICAgICAgICB9CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY2hlY2tlciwgZGVyaXZlZCwgTlVMTCk7CisgICAgICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgICAgICBQeV9ERUNSRUYoY2hlY2tlcik7CisgICAgICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvazsKKyAgICB9CisgICAgcmV0dXJuIHJlY3Vyc2l2ZV9pc3N1YmNsYXNzKGRlcml2ZWQsIGNscyk7CiB9CiAKIGludAogX1B5T2JqZWN0X1JlYWxJc0luc3RhbmNlKFB5T2JqZWN0ICppbnN0LCBQeU9iamVjdCAqY2xzKQogewotCXJldHVybiByZWN1cnNpdmVfaXNpbnN0YW5jZShpbnN0LCBjbHMpOworICAgIHJldHVybiByZWN1cnNpdmVfaXNpbnN0YW5jZShpbnN0LCBjbHMpOwogfQogCiBpbnQKIF9QeU9iamVjdF9SZWFsSXNTdWJjbGFzcyhQeU9iamVjdCAqZGVyaXZlZCwgUHlPYmplY3QgKmNscykKIHsKLQlyZXR1cm4gcmVjdXJzaXZlX2lzc3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKKyAgICByZXR1cm4gcmVjdXJzaXZlX2lzc3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKIH0KIAogCiBQeU9iamVjdCAqCiBQeU9iamVjdF9HZXRJdGVyKFB5T2JqZWN0ICpvKQogewotCVB5VHlwZU9iamVjdCAqdCA9IG8tPm9iX3R5cGU7Ci0JZ2V0aXRlcmZ1bmMgZiA9IE5VTEw7Ci0JaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHQsIFB5X1RQRkxBR1NfSEFWRV9JVEVSKSkKLQkJZiA9IHQtPnRwX2l0ZXI7Ci0JaWYgKGYgPT0gTlVMTCkgewotCQlpZiAoUHlTZXF1ZW5jZV9DaGVjayhvKSkKLQkJCXJldHVybiBQeVNlcUl0ZXJfTmV3KG8pOwotCQlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZSIsIG8pOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3QgKnJlcyA9ICgqZikobyk7Ci0JCWlmIChyZXMgIT0gTlVMTCAmJiAhUHlJdGVyX0NoZWNrKHJlcykpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiaXRlcigpIHJldHVybmVkIG5vbi1pdGVyYXRvciAiCi0JCQkJICAgICAib2YgdHlwZSAnJS4xMDBzJyIsCi0JCQkJICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHJlcyk7Ci0JCQlyZXMgPSBOVUxMOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIFB5VHlwZU9iamVjdCAqdCA9IG8tPm9iX3R5cGU7CisgICAgZ2V0aXRlcmZ1bmMgZiA9IE5VTEw7CisgICAgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHQsIFB5X1RQRkxBR1NfSEFWRV9JVEVSKSkKKyAgICAgICAgZiA9IHQtPnRwX2l0ZXI7CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlTZXF1ZW5jZV9DaGVjayhvKSkKKyAgICAgICAgICAgIHJldHVybiBQeVNlcUl0ZXJfTmV3KG8pOworICAgICAgICByZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZSIsIG8pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKnJlcyA9ICgqZikobyk7CisgICAgICAgIGlmIChyZXMgIT0gTlVMTCAmJiAhUHlJdGVyX0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXIoKSByZXR1cm5lZCBub24taXRlcmF0b3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvZiB0eXBlICclLjEwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogfQogCiAvKiBSZXR1cm4gbmV4dCBpdGVtLgpAQCAtMzA3MSwxMiArMzA3MSwxMiBAQAogUHlPYmplY3QgKgogUHlJdGVyX05leHQoUHlPYmplY3QgKml0ZXIpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlhc3NlcnQoUHlJdGVyX0NoZWNrKGl0ZXIpKTsKLQlyZXN1bHQgPSAoKml0ZXItPm9iX3R5cGUtPnRwX2l0ZXJuZXh0KShpdGVyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwgJiYKLQkgICAgUHlFcnJfT2NjdXJyZWQoKSAmJgotCSAgICBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCQlQeUVycl9DbGVhcigpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBhc3NlcnQoUHlJdGVyX0NoZWNrKGl0ZXIpKTsKKyAgICByZXN1bHQgPSAoKml0ZXItPm9iX3R5cGUtPnRwX2l0ZXJuZXh0KShpdGVyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwgJiYKKyAgICAgICAgUHlFcnJfT2NjdXJyZWQoKSAmJgorICAgICAgICBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2Jvb2xvYmplY3QuYyBiL09iamVjdHMvYm9vbG9iamVjdC5jCmluZGV4IGZkNzNkMjguLjU5NTgzMmEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYm9vbG9iamVjdC5jCisrKyBiL09iamVjdHMvYm9vbG9iamVjdC5jCkBAIC03LDEwICs3LDEwIEBACiBzdGF0aWMgaW50CiBib29sX3ByaW50KFB5Qm9vbE9iamVjdCAqc2VsZiwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnB1dHMoc2VsZi0+b2JfaXZhbCA9PSAwID8gIkZhbHNlIiA6ICJUcnVlIiwgZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JcmV0dXJuIDA7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwdXRzKHNlbGYtPm9iX2l2YWwgPT0gMCA/ICJGYWxzZSIgOiAiVHJ1ZSIsIGZwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiAwOwogfQogCiAvKiBXZSBkZWZpbmUgYm9vbF9yZXByIHRvIHJldHVybiAiRmFsc2UiIG9yICJUcnVlIiAqLwpAQCAtMjEsMzAgKzIxLDMwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYm9vbF9yZXByKFB5Qm9vbE9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqczsKKyAgICBQeU9iamVjdCAqczsKIAotCWlmIChzZWxmLT5vYl9pdmFsKQotCQlzID0gdHJ1ZV9zdHIgPyB0cnVlX3N0ciA6Ci0JCQkodHJ1ZV9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJUcnVlIikpOwotCWVsc2UKLQkJcyA9IGZhbHNlX3N0ciA/IGZhbHNlX3N0ciA6Ci0JCQkoZmFsc2Vfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiRmFsc2UiKSk7Ci0JUHlfWElOQ1JFRihzKTsKLQlyZXR1cm4gczsKKyAgICBpZiAoc2VsZi0+b2JfaXZhbCkKKyAgICAgICAgcyA9IHRydWVfc3RyID8gdHJ1ZV9zdHIgOgorICAgICAgICAgICAgKHRydWVfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiVHJ1ZSIpKTsKKyAgICBlbHNlCisgICAgICAgIHMgPSBmYWxzZV9zdHIgPyBmYWxzZV9zdHIgOgorICAgICAgICAgICAgKGZhbHNlX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIkZhbHNlIikpOworICAgIFB5X1hJTkNSRUYocyk7CisgICAgcmV0dXJuIHM7CiB9CiAKIC8qIEZ1bmN0aW9uIHRvIHJldHVybiBhIGJvb2wgZnJvbSBhIEMgbG9uZyAqLwogCiBQeU9iamVjdCAqUHlCb29sX0Zyb21Mb25nKGxvbmcgb2spCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKG9rKQotCQlyZXN1bHQgPSBQeV9UcnVlOwotCWVsc2UKLQkJcmVzdWx0ID0gUHlfRmFsc2U7Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAob2spCisgICAgICAgIHJlc3VsdCA9IFB5X1RydWU7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeV9GYWxzZTsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBXZSBkZWZpbmUgYm9vbF9uZXcgdG8gYWx3YXlzIHJldHVybiBlaXRoZXIgUHlfVHJ1ZSBvciBQeV9GYWxzZSAqLwpAQCAtNTIsMTYgKzUyLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYm9vbF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJ4IiwgMH07Ci0JUHlPYmplY3QgKnggPSBQeV9GYWxzZTsKLQlsb25nIG9rOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsieCIsIDB9OworICAgIFB5T2JqZWN0ICp4ID0gUHlfRmFsc2U7CisgICAgbG9uZyBvazsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8Tzpib29sIiwga3dsaXN0LCAmeCkpCi0JCXJldHVybiBOVUxMOwotCW9rID0gUHlPYmplY3RfSXNUcnVlKHgpOwotCWlmIChvayA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcob2spOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8Tzpib29sIiwga3dsaXN0LCAmeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKHgpOworICAgIGlmIChvayA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcob2spOwogfQogCiAvKiBBcml0aG1ldGljIG9wZXJhdGlvbnMgcmVkZWZpbmVkIHRvIHJldHVybiBib29sIGlmIGJvdGggYXJncyBhcmUgYm9vbC4gKi8KQEAgLTY5LDI4ICs2OSwyOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJvb2xfYW5kKFB5T2JqZWN0ICphLCBQeU9iamVjdCAqYikKIHsKLQlpZiAoIVB5Qm9vbF9DaGVjayhhKSB8fCAhUHlCb29sX0NoZWNrKGIpKQotCQlyZXR1cm4gUHlJbnRfVHlwZS50cF9hc19udW1iZXItPm5iX2FuZChhLCBiKTsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKAotCQkoKFB5Qm9vbE9iamVjdCAqKWEpLT5vYl9pdmFsICYgKChQeUJvb2xPYmplY3QgKiliKS0+b2JfaXZhbCk7CisgICAgaWYgKCFQeUJvb2xfQ2hlY2soYSkgfHwgIVB5Qm9vbF9DaGVjayhiKSkKKyAgICAgICAgcmV0dXJuIFB5SW50X1R5cGUudHBfYXNfbnVtYmVyLT5uYl9hbmQoYSwgYik7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygKKyAgICAgICAgKChQeUJvb2xPYmplY3QgKilhKS0+b2JfaXZhbCAmICgoUHlCb29sT2JqZWN0ICopYiktPm9iX2l2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYm9vbF9vcihQeU9iamVjdCAqYSwgUHlPYmplY3QgKmIpCiB7Ci0JaWYgKCFQeUJvb2xfQ2hlY2soYSkgfHwgIVB5Qm9vbF9DaGVjayhiKSkKLQkJcmV0dXJuIFB5SW50X1R5cGUudHBfYXNfbnVtYmVyLT5uYl9vcihhLCBiKTsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKAotCQkoKFB5Qm9vbE9iamVjdCAqKWEpLT5vYl9pdmFsIHwgKChQeUJvb2xPYmplY3QgKiliKS0+b2JfaXZhbCk7CisgICAgaWYgKCFQeUJvb2xfQ2hlY2soYSkgfHwgIVB5Qm9vbF9DaGVjayhiKSkKKyAgICAgICAgcmV0dXJuIFB5SW50X1R5cGUudHBfYXNfbnVtYmVyLT5uYl9vcihhLCBiKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKAorICAgICAgICAoKFB5Qm9vbE9iamVjdCAqKWEpLT5vYl9pdmFsIHwgKChQeUJvb2xPYmplY3QgKiliKS0+b2JfaXZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBib29sX3hvcihQeU9iamVjdCAqYSwgUHlPYmplY3QgKmIpCiB7Ci0JaWYgKCFQeUJvb2xfQ2hlY2soYSkgfHwgIVB5Qm9vbF9DaGVjayhiKSkKLQkJcmV0dXJuIFB5SW50X1R5cGUudHBfYXNfbnVtYmVyLT5uYl94b3IoYSwgYik7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygKLQkJKChQeUJvb2xPYmplY3QgKilhKS0+b2JfaXZhbCBeICgoUHlCb29sT2JqZWN0ICopYiktPm9iX2l2YWwpOworICAgIGlmICghUHlCb29sX0NoZWNrKGEpIHx8ICFQeUJvb2xfQ2hlY2soYikpCisgICAgICAgIHJldHVybiBQeUludF9UeXBlLnRwX2FzX251bWJlci0+bmJfeG9yKGEsIGIpOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoCisgICAgICAgICgoUHlCb29sT2JqZWN0ICopYSktPm9iX2l2YWwgXiAoKFB5Qm9vbE9iamVjdCAqKWIpLT5vYl9pdmFsKTsKIH0KIAogLyogRG9jIHN0cmluZyAqLwpAQCAtMTA1LDk4ICsxMDUsOTggQEAKIC8qIEFyaXRobWV0aWMgbWV0aG9kcyAtLSBvbmx5IHNvIHdlIGNhbiBvdmVycmlkZSAmLCB8LCBeLiAqLwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGJvb2xfYXNfbnVtYmVyID0gewotCTAsCQkJLyogbmJfYWRkICovCi0JMCwJCQkvKiBuYl9zdWJ0cmFjdCAqLwotCTAsCQkJLyogbmJfbXVsdGlwbHkgKi8KLQkwLAkJCS8qIG5iX2RpdmlkZSAqLwotCTAsCQkJLyogbmJfcmVtYWluZGVyICovCi0JMCwJCQkvKiBuYl9kaXZtb2QgKi8KLQkwLAkJCS8qIG5iX3Bvd2VyICovCi0JMCwJCQkvKiBuYl9uZWdhdGl2ZSAqLwotCTAsCQkJLyogbmJfcG9zaXRpdmUgKi8KLQkwLAkJCS8qIG5iX2Fic29sdXRlICovCi0JMCwJCQkvKiBuYl9ub256ZXJvICovCi0JMCwJCQkvKiBuYl9pbnZlcnQgKi8KLQkwLAkJCS8qIG5iX2xzaGlmdCAqLwotCTAsCQkJLyogbmJfcnNoaWZ0ICovCi0JYm9vbF9hbmQsCQkvKiBuYl9hbmQgKi8KLQlib29sX3hvciwJCS8qIG5iX3hvciAqLwotCWJvb2xfb3IsCQkvKiBuYl9vciAqLwotCTAsCQkJLyogbmJfY29lcmNlICovCi0JMCwJCQkvKiBuYl9pbnQgKi8KLQkwLAkJCS8qIG5iX2xvbmcgKi8KLQkwLAkJCS8qIG5iX2Zsb2F0ICovCi0JMCwJCQkvKiBuYl9vY3QgKi8KLQkwLAkJIAkvKiBuYl9oZXggKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfYWRkICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfcG93ZXIgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9hbmQgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfeG9yICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX29yICovCi0JMCwJCQkvKiBuYl9mbG9vcl9kaXZpZGUgKi8KLQkwLAkJCS8qIG5iX3RydWVfZGl2aWRlICovCi0JMCwJCQkvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbXVsdGlwbHkgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9kaXZtb2QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbmVnYXRpdmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG9zaXRpdmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbm9uemVybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnZlcnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbHNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3JzaGlmdCAqLworICAgIGJvb2xfYW5kLCAgICAgICAgICAgICAgICAgICAvKiBuYl9hbmQgKi8KKyAgICBib29sX3hvciwgICAgICAgICAgICAgICAgICAgLyogbmJfeG9yICovCisgICAgYm9vbF9vciwgICAgICAgICAgICAgICAgICAgIC8qIG5iX29yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2NvZXJjZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbG9uZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9mbG9hdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9vY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaGV4ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfYWRkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9tdWx0aXBseSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3Bvd2VyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfYW5kICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfeG9yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfb3IgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZmxvb3JfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX3RydWVfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KIH07CiAKIC8qIFRoZSB0eXBlIG9iamVjdCBmb3IgYm9vbC4gIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBiZSBzdWJjbGFzc2VkISAqLwogCiBQeVR5cGVPYmplY3QgUHlCb29sX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiYm9vbCIsCi0Jc2l6ZW9mKFB5SW50T2JqZWN0KSwKLQkwLAotCTAsCQkJCQkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYylib29sX3ByaW50LAkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWJvb2xfcmVwciwJCQkvKiB0cF9yZXByICovCi0JJmJvb2xfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLSAgICAgICAgMCwJCQkJCS8qIHRwX2NhbGwgKi8KLSAgICAgICAgKHJlcHJmdW5jKWJvb2xfcmVwciwJCQkvKiB0cF9zdHIgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTLCAvKiB0cF9mbGFncyAqLwotCWJvb2xfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JJlB5SW50X1R5cGUsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWJvb2xfbmV3LAkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJib29sIiwKKyAgICBzaXplb2YoUHlJbnRPYmplY3QpLAorICAgIDAsCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKHByaW50ZnVuYylib29sX3ByaW50LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylib29sX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZib29sX2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYylib29sX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUywgLyogdHBfZmxhZ3MgKi8KKyAgICBib29sX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAmUHlJbnRfVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGJvb2xfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAvKiBUaGUgb2JqZWN0cyByZXByZXNlbnRpbmcgYm9vbCB2YWx1ZXMgRmFsc2UgYW5kIFRydWUgKi8KIAogLyogTmFtZWQgWmVybyBmb3IgbGluay1sZXZlbCBjb21wYXRpYmlsaXR5ICovCiBQeUludE9iamVjdCBfUHlfWmVyb1N0cnVjdCA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5Qm9vbF9UeXBlKQotCTAKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5Qm9vbF9UeXBlKQorICAgIDAKIH07CiAKIFB5SW50T2JqZWN0IF9QeV9UcnVlU3RydWN0ID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlCb29sX1R5cGUpCi0JMQorICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlCb29sX1R5cGUpCisgICAgMQogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvYnVmZmVyb2JqZWN0LmMgYi9PYmplY3RzL2J1ZmZlcm9iamVjdC5jCmluZGV4IDViMDhlMWUuLjBmN2U3NjMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYnVmZmVyb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9idWZmZXJvYmplY3QuYwpAQCAtNSwxMyArNSwxMyBAQAogCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmJfYmFzZTsKLQl2b2lkICpiX3B0cjsKLQlQeV9zc2l6ZV90IGJfc2l6ZTsKLQlQeV9zc2l6ZV90IGJfb2Zmc2V0OwotCWludCBiX3JlYWRvbmx5OwotCWxvbmcgYl9oYXNoOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqYl9iYXNlOworICAgIHZvaWQgKmJfcHRyOworICAgIFB5X3NzaXplX3QgYl9zaXplOworICAgIFB5X3NzaXplX3QgYl9vZmZzZXQ7CisgICAgaW50IGJfcmVhZG9ubHk7CisgICAgbG9uZyBiX2hhc2g7CiB9IFB5QnVmZmVyT2JqZWN0OwogCiAKQEAgLTI0LDIwNyArMjQsMjA3IEBACiAKIHN0YXRpYyBpbnQKIGdldF9idWYoUHlCdWZmZXJPYmplY3QgKnNlbGYsIHZvaWQgKipwdHIsIFB5X3NzaXplX3QgKnNpemUsCi0JZW51bSBidWZmZXJfdCBidWZmZXJfdHlwZSkKKyAgICBlbnVtIGJ1ZmZlcl90IGJ1ZmZlcl90eXBlKQogewotCWlmIChzZWxmLT5iX2Jhc2UgPT0gTlVMTCkgewotCQlhc3NlcnQgKHB0ciAhPSBOVUxMKTsKLQkJKnB0ciA9IHNlbGYtPmJfcHRyOwotCQkqc2l6ZSA9IHNlbGYtPmJfc2l6ZTsKLQl9Ci0JZWxzZSB7Ci0JCVB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKLQkJcmVhZGJ1ZmZlcnByb2MgcHJvYyA9IDA7Ci0JCVB5QnVmZmVyUHJvY3MgKmJwID0gc2VsZi0+Yl9iYXNlLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JCWlmICgoKmJwLT5iZl9nZXRzZWdjb3VudCkoc2VsZi0+Yl9iYXNlLCBOVUxMKSAhPSAxKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoKGJ1ZmZlcl90eXBlID09IFJFQURfQlVGRkVSKSB8fAotCQkJKChidWZmZXJfdHlwZSA9PSBBTllfQlVGRkVSKSAmJiBzZWxmLT5iX3JlYWRvbmx5KSkKLQkJICAgIHByb2MgPSBicC0+YmZfZ2V0cmVhZGJ1ZmZlcjsKLQkJZWxzZSBpZiAoKGJ1ZmZlcl90eXBlID09IFdSSVRFX0JVRkZFUikgfHwKLQkJCShidWZmZXJfdHlwZSA9PSBBTllfQlVGRkVSKSkKLSAgICAJCSAgICBwcm9jID0gKHJlYWRidWZmZXJwcm9jKWJwLT5iZl9nZXR3cml0ZWJ1ZmZlcjsKLQkJZWxzZSBpZiAoYnVmZmVyX3R5cGUgPT0gQ0hBUl9CVUZGRVIpIHsKLQkJICAgIGlmICghUHlUeXBlX0hhc0ZlYXR1cmUoc2VsZi0+b2JfdHlwZSwKLQkJCQlQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIlB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSIG5lZWRlZCIpOwotCQkJcmV0dXJuIDA7Ci0JCSAgICB9Ci0JCSAgICBwcm9jID0gKHJlYWRidWZmZXJwcm9jKWJwLT5iZl9nZXRjaGFyYnVmZmVyOwotCQl9Ci0JCWlmICghcHJvYykgewotCQkgICAgY2hhciAqYnVmZmVyX3R5cGVfbmFtZTsKLQkJICAgIHN3aXRjaCAoYnVmZmVyX3R5cGUpIHsKLQkJCWNhc2UgUkVBRF9CVUZGRVI6Ci0JCQkgICAgYnVmZmVyX3R5cGVfbmFtZSA9ICJyZWFkIjsKLQkJCSAgICBicmVhazsKLQkJCWNhc2UgV1JJVEVfQlVGRkVSOgotCQkJICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAid3JpdGUiOwotCQkJICAgIGJyZWFrOwotCQkJY2FzZSBDSEFSX0JVRkZFUjoKLQkJCSAgICBidWZmZXJfdHlwZV9uYW1lID0gImNoYXIiOwotCQkJICAgIGJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCSAgICBidWZmZXJfdHlwZV9uYW1lID0gIm5vIjsKLQkJCSAgICBicmVhazsKLQkJICAgIH0KLQkJICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgIiVzIGJ1ZmZlciB0eXBlIG5vdCBhdmFpbGFibGUiLAotCQkJICAgIGJ1ZmZlcl90eXBlX25hbWUpOwotCQkgICAgcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKChjb3VudCA9ICgqcHJvYykoc2VsZi0+Yl9iYXNlLCAwLCBwdHIpKSA8IDApCi0JCQlyZXR1cm4gMDsKLQkJLyogYXBwbHkgY29uc3RyYWludHMgdG8gdGhlIHN0YXJ0L2VuZCAqLwotCQlpZiAoc2VsZi0+Yl9vZmZzZXQgPiBjb3VudCkKLQkJCW9mZnNldCA9IGNvdW50OwotCQllbHNlCi0JCQlvZmZzZXQgPSBzZWxmLT5iX29mZnNldDsKLQkJKihjaGFyICoqKXB0ciA9ICooY2hhciAqKilwdHIgKyBvZmZzZXQ7Ci0JCWlmIChzZWxmLT5iX3NpemUgPT0gUHlfRU5EX09GX0JVRkZFUikKLQkJCSpzaXplID0gY291bnQ7Ci0JCWVsc2UKLQkJCSpzaXplID0gc2VsZi0+Yl9zaXplOwotCQlpZiAob2Zmc2V0ICsgKnNpemUgPiBjb3VudCkKLQkJCSpzaXplID0gY291bnQgLSBvZmZzZXQ7Ci0JfQotCXJldHVybiAxOworICAgIGlmIChzZWxmLT5iX2Jhc2UgPT0gTlVMTCkgeworICAgICAgICBhc3NlcnQgKHB0ciAhPSBOVUxMKTsKKyAgICAgICAgKnB0ciA9IHNlbGYtPmJfcHRyOworICAgICAgICAqc2l6ZSA9IHNlbGYtPmJfc2l6ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKKyAgICAgICAgcmVhZGJ1ZmZlcnByb2MgcHJvYyA9IDA7CisgICAgICAgIFB5QnVmZmVyUHJvY3MgKmJwID0gc2VsZi0+Yl9iYXNlLT5vYl90eXBlLT50cF9hc19idWZmZXI7CisgICAgICAgIGlmICgoKmJwLT5iZl9nZXRzZWdjb3VudCkoc2VsZi0+Yl9iYXNlLCBOVUxMKSAhPSAxKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGJ1ZmZlcl90eXBlID09IFJFQURfQlVGRkVSKSB8fAorICAgICAgICAgICAgKChidWZmZXJfdHlwZSA9PSBBTllfQlVGRkVSKSAmJiBzZWxmLT5iX3JlYWRvbmx5KSkKKyAgICAgICAgICAgIHByb2MgPSBicC0+YmZfZ2V0cmVhZGJ1ZmZlcjsKKyAgICAgICAgZWxzZSBpZiAoKGJ1ZmZlcl90eXBlID09IFdSSVRFX0JVRkZFUikgfHwKKyAgICAgICAgICAgIChidWZmZXJfdHlwZSA9PSBBTllfQlVGRkVSKSkKKyAgICAgICAgICAgIHByb2MgPSAocmVhZGJ1ZmZlcnByb2MpYnAtPmJmX2dldHdyaXRlYnVmZmVyOworICAgICAgICBlbHNlIGlmIChidWZmZXJfdHlwZSA9PSBDSEFSX0JVRkZFUikgeworICAgICAgICAgICAgaWYgKCFQeVR5cGVfSGFzRmVhdHVyZShzZWxmLT5vYl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUiBuZWVkZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvYyA9IChyZWFkYnVmZmVycHJvYylicC0+YmZfZ2V0Y2hhcmJ1ZmZlcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXByb2MpIHsKKyAgICAgICAgICAgIGNoYXIgKmJ1ZmZlcl90eXBlX25hbWU7CisgICAgICAgICAgICBzd2l0Y2ggKGJ1ZmZlcl90eXBlKSB7CisgICAgICAgICAgICBjYXNlIFJFQURfQlVGRkVSOgorICAgICAgICAgICAgICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAicmVhZCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFdSSVRFX0JVRkZFUjoKKyAgICAgICAgICAgICAgICBidWZmZXJfdHlwZV9uYW1lID0gIndyaXRlIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0hBUl9CVUZGRVI6CisgICAgICAgICAgICAgICAgYnVmZmVyX3R5cGVfbmFtZSA9ICJjaGFyIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnVmZmVyX3R5cGVfbmFtZSA9ICJubyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICIlcyBidWZmZXIgdHlwZSBub3QgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICBidWZmZXJfdHlwZV9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICgoY291bnQgPSAoKnByb2MpKHNlbGYtPmJfYmFzZSwgMCwgcHRyKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIC8qIGFwcGx5IGNvbnN0cmFpbnRzIHRvIHRoZSBzdGFydC9lbmQgKi8KKyAgICAgICAgaWYgKHNlbGYtPmJfb2Zmc2V0ID4gY291bnQpCisgICAgICAgICAgICBvZmZzZXQgPSBjb3VudDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgb2Zmc2V0ID0gc2VsZi0+Yl9vZmZzZXQ7CisgICAgICAgICooY2hhciAqKilwdHIgPSAqKGNoYXIgKiopcHRyICsgb2Zmc2V0OworICAgICAgICBpZiAoc2VsZi0+Yl9zaXplID09IFB5X0VORF9PRl9CVUZGRVIpCisgICAgICAgICAgICAqc2l6ZSA9IGNvdW50OworICAgICAgICBlbHNlCisgICAgICAgICAgICAqc2l6ZSA9IHNlbGYtPmJfc2l6ZTsKKyAgICAgICAgaWYgKG9mZnNldCArICpzaXplID4gY291bnQpCisgICAgICAgICAgICAqc2l6ZSA9IGNvdW50IC0gb2Zmc2V0OworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVmZmVyX2Zyb21fbWVtb3J5KFB5T2JqZWN0ICpiYXNlLCBQeV9zc2l6ZV90IHNpemUsIFB5X3NzaXplX3Qgb2Zmc2V0LCB2b2lkICpwdHIsCi0JCSAgIGludCByZWFkb25seSkKKyAgICAgICAgICAgICAgICAgICBpbnQgcmVhZG9ubHkpCiB7Ci0JUHlCdWZmZXJPYmplY3QgKiBiOworICAgIFB5QnVmZmVyT2JqZWN0ICogYjsKIAotCWlmIChzaXplIDwgMCAmJiBzaXplICE9IFB5X0VORF9PRl9CVUZGRVIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInNpemUgbXVzdCBiZSB6ZXJvIG9yIHBvc2l0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAob2Zmc2V0IDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkib2Zmc2V0IG11c3QgYmUgemVybyBvciBwb3NpdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNpemUgPCAwICYmIHNpemUgIT0gUHlfRU5EX09GX0JVRkZFUikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIG11c3QgYmUgemVybyBvciBwb3NpdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0IG11c3QgYmUgemVybyBvciBwb3NpdGl2ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQliID0gUHlPYmplY3RfTkVXKFB5QnVmZmVyT2JqZWN0LCAmUHlCdWZmZXJfVHlwZSk7Ci0JaWYgKCBiID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBiID0gUHlPYmplY3RfTkVXKFB5QnVmZmVyT2JqZWN0LCAmUHlCdWZmZXJfVHlwZSk7CisgICAgaWYgKCBiID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X1hJTkNSRUYoYmFzZSk7Ci0JYi0+Yl9iYXNlID0gYmFzZTsKLQliLT5iX3B0ciA9IHB0cjsKLQliLT5iX3NpemUgPSBzaXplOwotCWItPmJfb2Zmc2V0ID0gb2Zmc2V0OwotCWItPmJfcmVhZG9ubHkgPSByZWFkb25seTsKLQliLT5iX2hhc2ggPSAtMTsKKyAgICBQeV9YSU5DUkVGKGJhc2UpOworICAgIGItPmJfYmFzZSA9IGJhc2U7CisgICAgYi0+Yl9wdHIgPSBwdHI7CisgICAgYi0+Yl9zaXplID0gc2l6ZTsKKyAgICBiLT5iX29mZnNldCA9IG9mZnNldDsKKyAgICBiLT5iX3JlYWRvbmx5ID0gcmVhZG9ubHk7CisgICAgYi0+Yl9oYXNoID0gLTE7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopIGI7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBiOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVmZmVyX2Zyb21fb2JqZWN0KFB5T2JqZWN0ICpiYXNlLCBQeV9zc2l6ZV90IHNpemUsIFB5X3NzaXplX3Qgb2Zmc2V0LCBpbnQgcmVhZG9ubHkpCiB7Ci0JaWYgKG9mZnNldCA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIm9mZnNldCBtdXN0IGJlIHplcm8gb3IgcG9zaXRpdmUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICggUHlCdWZmZXJfQ2hlY2soYmFzZSkgJiYgKCgoUHlCdWZmZXJPYmplY3QgKiliYXNlKS0+Yl9iYXNlKSApIHsKLQkJLyogYW5vdGhlciBidWZmZXIsIHJlZmVyIHRvIHRoZSBiYXNlIG9iamVjdCAqLwotCQlQeUJ1ZmZlck9iamVjdCAqYiA9IChQeUJ1ZmZlck9iamVjdCAqKWJhc2U7Ci0JCWlmIChiLT5iX3NpemUgIT0gUHlfRU5EX09GX0JVRkZFUikgewotCQkJUHlfc3NpemVfdCBiYXNlX3NpemUgPSBiLT5iX3NpemUgLSBvZmZzZXQ7Ci0JCQlpZiAoYmFzZV9zaXplIDwgMCkKLQkJCQliYXNlX3NpemUgPSAwOwotCQkJaWYgKHNpemUgPT0gUHlfRU5EX09GX0JVRkZFUiB8fCBzaXplID4gYmFzZV9zaXplKQotCQkJCXNpemUgPSBiYXNlX3NpemU7Ci0JCX0KLQkJb2Zmc2V0ICs9IGItPmJfb2Zmc2V0OwotCQliYXNlID0gYi0+Yl9iYXNlOwotCX0KLQlyZXR1cm4gYnVmZmVyX2Zyb21fbWVtb3J5KGJhc2UsIHNpemUsIG9mZnNldCwgTlVMTCwgcmVhZG9ubHkpOworICAgIGlmIChvZmZzZXQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCBtdXN0IGJlIHplcm8gb3IgcG9zaXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggUHlCdWZmZXJfQ2hlY2soYmFzZSkgJiYgKCgoUHlCdWZmZXJPYmplY3QgKiliYXNlKS0+Yl9iYXNlKSApIHsKKyAgICAgICAgLyogYW5vdGhlciBidWZmZXIsIHJlZmVyIHRvIHRoZSBiYXNlIG9iamVjdCAqLworICAgICAgICBQeUJ1ZmZlck9iamVjdCAqYiA9IChQeUJ1ZmZlck9iamVjdCAqKWJhc2U7CisgICAgICAgIGlmIChiLT5iX3NpemUgIT0gUHlfRU5EX09GX0JVRkZFUikgeworICAgICAgICAgICAgUHlfc3NpemVfdCBiYXNlX3NpemUgPSBiLT5iX3NpemUgLSBvZmZzZXQ7CisgICAgICAgICAgICBpZiAoYmFzZV9zaXplIDwgMCkKKyAgICAgICAgICAgICAgICBiYXNlX3NpemUgPSAwOworICAgICAgICAgICAgaWYgKHNpemUgPT0gUHlfRU5EX09GX0JVRkZFUiB8fCBzaXplID4gYmFzZV9zaXplKQorICAgICAgICAgICAgICAgIHNpemUgPSBiYXNlX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IGItPmJfb2Zmc2V0OworICAgICAgICBiYXNlID0gYi0+Yl9iYXNlOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyX2Zyb21fbWVtb3J5KGJhc2UsIHNpemUsIG9mZnNldCwgTlVMTCwgcmVhZG9ubHkpOwogfQogCiAKIFB5T2JqZWN0ICoKIFB5QnVmZmVyX0Zyb21PYmplY3QoUHlPYmplY3QgKmJhc2UsIFB5X3NzaXplX3Qgb2Zmc2V0LCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGIgPSBiYXNlLT5vYl90eXBlLT50cF9hc19idWZmZXI7CisgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSBiYXNlLT5vYl90eXBlLT50cF9hc19idWZmZXI7CiAKLQlpZiAoIHBiID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIHBiID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBidWZmZXJfZnJvbV9vYmplY3QoYmFzZSwgc2l6ZSwgb2Zmc2V0LCAxKTsKKyAgICByZXR1cm4gYnVmZmVyX2Zyb21fb2JqZWN0KGJhc2UsIHNpemUsIG9mZnNldCwgMSk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5QnVmZmVyX0Zyb21SZWFkV3JpdGVPYmplY3QoUHlPYmplY3QgKmJhc2UsIFB5X3NzaXplX3Qgb2Zmc2V0LCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGIgPSBiYXNlLT5vYl90eXBlLT50cF9hc19idWZmZXI7CisgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSBiYXNlLT5vYl90eXBlLT50cF9hc19idWZmZXI7CiAKLQlpZiAoIHBiID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXR3cml0ZWJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCBwYiA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0d3JpdGVidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIGJ1ZmZlcl9mcm9tX29iamVjdChiYXNlLCBzaXplLCAgb2Zmc2V0LCAwKTsKKyAgICByZXR1cm4gYnVmZmVyX2Zyb21fb2JqZWN0KGJhc2UsIHNpemUsICBvZmZzZXQsIDApOwogfQogCiBQeU9iamVjdCAqCiBQeUJ1ZmZlcl9Gcm9tTWVtb3J5KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKQogewotCXJldHVybiBidWZmZXJfZnJvbV9tZW1vcnkoTlVMTCwgc2l6ZSwgMCwgcHRyLCAxKTsKKyAgICByZXR1cm4gYnVmZmVyX2Zyb21fbWVtb3J5KE5VTEwsIHNpemUsIDAsIHB0ciwgMSk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5QnVmZmVyX0Zyb21SZWFkV3JpdGVNZW1vcnkodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIGJ1ZmZlcl9mcm9tX21lbW9yeShOVUxMLCBzaXplLCAwLCBwdHIsIDApOworICAgIHJldHVybiBidWZmZXJfZnJvbV9tZW1vcnkoTlVMTCwgc2l6ZSwgMCwgcHRyLCAwKTsKIH0KIAogUHlPYmplY3QgKgogUHlCdWZmZXJfTmV3KFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQeU9iamVjdCAqbzsKLQlQeUJ1ZmZlck9iamVjdCAqIGI7CisgICAgUHlPYmplY3QgKm87CisgICAgUHlCdWZmZXJPYmplY3QgKiBiOwogCi0JaWYgKHNpemUgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzaXplIG11c3QgYmUgemVybyBvciBwb3NpdGl2ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHNpemVvZigqYikgPiBQWV9TU0laRV9UX01BWCAtIHNpemUpIHsKLQkJLyogdW5saWtlbHkgKi8KLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQotCS8qIElubGluZSBQeU9iamVjdF9OZXcgKi8KLQlvID0gKFB5T2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKHNpemVvZigqYikgKyBzaXplKTsKLQlpZiAoIG8gPT0gTlVMTCApCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWIgPSAoUHlCdWZmZXJPYmplY3QgKikgUHlPYmplY3RfSU5JVChvLCAmUHlCdWZmZXJfVHlwZSk7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgbXVzdCBiZSB6ZXJvIG9yIHBvc2l0aXZlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2l6ZW9mKCpiKSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZSkgeworICAgICAgICAvKiB1bmxpa2VseSAqLworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisgICAgLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLworICAgIG8gPSAoUHlPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKCpiKSArIHNpemUpOworICAgIGlmICggbyA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgYiA9IChQeUJ1ZmZlck9iamVjdCAqKSBQeU9iamVjdF9JTklUKG8sICZQeUJ1ZmZlcl9UeXBlKTsKIAotCWItPmJfYmFzZSA9IE5VTEw7Ci0JYi0+Yl9wdHIgPSAodm9pZCAqKShiICsgMSk7Ci0JYi0+Yl9zaXplID0gc2l6ZTsKLQliLT5iX29mZnNldCA9IDA7Ci0JYi0+Yl9yZWFkb25seSA9IDA7Ci0JYi0+Yl9oYXNoID0gLTE7CisgICAgYi0+Yl9iYXNlID0gTlVMTDsKKyAgICBiLT5iX3B0ciA9ICh2b2lkICopKGIgKyAxKTsKKyAgICBiLT5iX3NpemUgPSBzaXplOworICAgIGItPmJfb2Zmc2V0ID0gMDsKKyAgICBiLT5iX3JlYWRvbmx5ID0gMDsKKyAgICBiLT5iX2hhc2ggPSAtMTsKIAotCXJldHVybiBvOworICAgIHJldHVybiBvOwogfQogCiAvKiBNZXRob2RzICovCkBAIC0yMzIsMTkgKzIzMiwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1ZmZlcl9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpvYjsKLQlQeV9zc2l6ZV90IG9mZnNldCA9IDA7Ci0JUHlfc3NpemVfdCBzaXplID0gUHlfRU5EX09GX0JVRkZFUjsKKyAgICBQeU9iamVjdCAqb2I7CisgICAgUHlfc3NpemVfdCBvZmZzZXQgPSAwOworICAgIFB5X3NzaXplX3Qgc2l6ZSA9IFB5X0VORF9PRl9CVUZGRVI7CiAKLQlpZiAoUHlFcnJfV2FyblB5M2soImJ1ZmZlcigpIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJidWZmZXIoKSIsIGt3KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJidWZmZXIoKSBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98bm46YnVmZmVyIiwgJm9iLCAmb2Zmc2V0LCAmc2l6ZSkpCi0JICAgIHJldHVybiBOVUxMOwotCXJldHVybiBQeUJ1ZmZlcl9Gcm9tT2JqZWN0KG9iLCBvZmZzZXQsIHNpemUpOworICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoImJ1ZmZlcigpIiwga3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xubjpidWZmZXIiLCAmb2IsICZvZmZzZXQsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5QnVmZmVyX0Zyb21PYmplY3Qob2IsIG9mZnNldCwgc2l6ZSk7CiB9CiAKIFB5RG9jX1NUUlZBUihidWZmZXJfZG9jLApAQCAtMjU5LDk5ICsyNTksOTkgQEAKIHN0YXRpYyB2b2lkCiBidWZmZXJfZGVhbGxvYyhQeUJ1ZmZlck9iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPmJfYmFzZSk7Ci0JUHlPYmplY3RfREVMKHNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+Yl9iYXNlKTsKKyAgICBQeU9iamVjdF9ERUwoc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIGJ1ZmZlcl9jb21wYXJlKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeUJ1ZmZlck9iamVjdCAqb3RoZXIpCiB7Ci0Jdm9pZCAqcDEsICpwMjsKLQlQeV9zc2l6ZV90IGxlbl9zZWxmLCBsZW5fb3RoZXIsIG1pbl9sZW47Ci0JaW50IGNtcDsKKyAgICB2b2lkICpwMSwgKnAyOworICAgIFB5X3NzaXplX3QgbGVuX3NlbGYsIGxlbl9vdGhlciwgbWluX2xlbjsKKyAgICBpbnQgY21wOwogCi0JaWYgKCFnZXRfYnVmKHNlbGYsICZwMSwgJmxlbl9zZWxmLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOwotCWlmICghZ2V0X2J1ZihvdGhlciwgJnAyLCAmbGVuX290aGVyLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOwotCW1pbl9sZW4gPSAobGVuX3NlbGYgPCBsZW5fb3RoZXIpID8gbGVuX3NlbGYgOiBsZW5fb3RoZXI7Ci0JaWYgKG1pbl9sZW4gPiAwKSB7Ci0JCWNtcCA9IG1lbWNtcChwMSwgcDIsIG1pbl9sZW4pOwotCQlpZiAoY21wICE9IDApCi0JCQlyZXR1cm4gY21wIDwgMCA/IC0xIDogMTsKLQl9Ci0JcmV0dXJuIChsZW5fc2VsZiA8IGxlbl9vdGhlcikgPyAtMSA6IChsZW5fc2VsZiA+IGxlbl9vdGhlcikgPyAxIDogMDsKKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnAxLCAmbGVuX3NlbGYsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFnZXRfYnVmKG90aGVyLCAmcDIsICZsZW5fb3RoZXIsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgbWluX2xlbiA9IChsZW5fc2VsZiA8IGxlbl9vdGhlcikgPyBsZW5fc2VsZiA6IGxlbl9vdGhlcjsKKyAgICBpZiAobWluX2xlbiA+IDApIHsKKyAgICAgICAgY21wID0gbWVtY21wKHAxLCBwMiwgbWluX2xlbik7CisgICAgICAgIGlmIChjbXAgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBjbXAgPCAwID8gLTEgOiAxOworICAgIH0KKyAgICByZXR1cm4gKGxlbl9zZWxmIDwgbGVuX290aGVyKSA/IC0xIDogKGxlbl9zZWxmID4gbGVuX290aGVyKSA/IDEgOiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVmZmVyX3JlcHIoUHlCdWZmZXJPYmplY3QgKnNlbGYpCiB7Ci0JY29uc3QgY2hhciAqc3RhdHVzID0gc2VsZi0+Yl9yZWFkb25seSA/ICJyZWFkLW9ubHkiIDogInJlYWQtd3JpdGUiOworICAgIGNvbnN0IGNoYXIgKnN0YXR1cyA9IHNlbGYtPmJfcmVhZG9ubHkgPyAicmVhZC1vbmx5IiA6ICJyZWFkLXdyaXRlIjsKIAotCWlmICggc2VsZi0+Yl9iYXNlID09IE5VTEwgKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIGJ1ZmZlciBwdHIgJXAsIHNpemUgJXpkIGF0ICVwPiIsCi0JCQkJCSAgIHN0YXR1cywKLQkJCQkJICAgc2VsZi0+Yl9wdHIsCi0JCQkJCSAgIHNlbGYtPmJfc2l6ZSwKLQkJCQkJICAgc2VsZik7Ci0JZWxzZQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgKLQkJCSI8JXMgYnVmZmVyIGZvciAlcCwgc2l6ZSAlemQsIG9mZnNldCAlemQgYXQgJXA+IiwKLQkJCXN0YXR1cywKLQkJCXNlbGYtPmJfYmFzZSwKLQkJCXNlbGYtPmJfc2l6ZSwKLQkJCXNlbGYtPmJfb2Zmc2V0LAotCQkJc2VsZik7CisgICAgaWYgKCBzZWxmLT5iX2Jhc2UgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgYnVmZmVyIHB0ciAlcCwgc2l6ZSAlemQgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5iX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Yl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgICAgICAgICAgIjwlcyBidWZmZXIgZm9yICVwLCBzaXplICV6ZCwgb2Zmc2V0ICV6ZCBhdCAlcD4iLAorICAgICAgICAgICAgc3RhdHVzLAorICAgICAgICAgICAgc2VsZi0+Yl9iYXNlLAorICAgICAgICAgICAgc2VsZi0+Yl9zaXplLAorICAgICAgICAgICAgc2VsZi0+Yl9vZmZzZXQsCisgICAgICAgICAgICBzZWxmKTsKIH0KIAogc3RhdGljIGxvbmcKIGJ1ZmZlcl9oYXNoKFB5QnVmZmVyT2JqZWN0ICpzZWxmKQogewotCXZvaWQgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBsZW47Ci0JcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcDsKLQlyZWdpc3RlciBsb25nIHg7CisgICAgdm9pZCAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGxlbjsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOworICAgIHJlZ2lzdGVyIGxvbmcgeDsKIAotCWlmICggc2VsZi0+Yl9oYXNoICE9IC0xICkKLQkJcmV0dXJuIHNlbGYtPmJfaGFzaDsKKyAgICBpZiAoIHNlbGYtPmJfaGFzaCAhPSAtMSApCisgICAgICAgIHJldHVybiBzZWxmLT5iX2hhc2g7CiAKLQkvKiBYWFggcG90ZW50aWFsIGJ1Z3MgaGVyZSwgYSByZWFkb25seSBidWZmZXIgZG9lcyBub3QgaW1wbHkgdGhhdCB0aGUKLQkgKiB1bmRlcmx5aW5nIG1lbW9yeSBpcyBpbW11dGFibGUuICBiX3JlYWRvbmx5IGlzIGEgbmVjZXNzYXJ5IGJ1dCBub3QKLQkgKiBzdWZmaWNpZW50IGNvbmRpdGlvbiBmb3IgYSBidWZmZXIgdG8gYmUgaGFzaGFibGUuICBQZXJoYXBzIGl0IHdvdWxkCi0JICogYmUgYmV0dGVyIHRvIG9ubHkgYWxsb3cgaGFzaGluZyBpZiB0aGUgdW5kZXJseWluZyBvYmplY3QgaXMga25vd24gdG8KLQkgKiBiZSBpbW11dGFibGUgKGUuZy4gUHlTdHJpbmdfQ2hlY2soKSBpcyB0cnVlKS4gIEFub3RoZXIgaWRlYSB3b3VsZAotCSAqIGJlIHRvIGNhbGwgdHBfaGFzaCBvbiB0aGUgdW5kZXJseWluZyBvYmplY3QgYW5kIHNlZSBpZiBpdCByYWlzZXMKLQkgKiBhbiBlcnJvci4gKi8KLQlpZiAoICFzZWxmLT5iX3JlYWRvbmx5ICkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIndyaXRhYmxlIGJ1ZmZlcnMgYXJlIG5vdCBoYXNoYWJsZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIFhYWCBwb3RlbnRpYWwgYnVncyBoZXJlLCBhIHJlYWRvbmx5IGJ1ZmZlciBkb2VzIG5vdCBpbXBseSB0aGF0IHRoZQorICAgICAqIHVuZGVybHlpbmcgbWVtb3J5IGlzIGltbXV0YWJsZS4gIGJfcmVhZG9ubHkgaXMgYSBuZWNlc3NhcnkgYnV0IG5vdAorICAgICAqIHN1ZmZpY2llbnQgY29uZGl0aW9uIGZvciBhIGJ1ZmZlciB0byBiZSBoYXNoYWJsZS4gIFBlcmhhcHMgaXQgd291bGQKKyAgICAgKiBiZSBiZXR0ZXIgdG8gb25seSBhbGxvdyBoYXNoaW5nIGlmIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBpcyBrbm93biB0bworICAgICAqIGJlIGltbXV0YWJsZSAoZS5nLiBQeVN0cmluZ19DaGVjaygpIGlzIHRydWUpLiAgQW5vdGhlciBpZGVhIHdvdWxkCisgICAgICogYmUgdG8gY2FsbCB0cF9oYXNoIG9uIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBhbmQgc2VlIGlmIGl0IHJhaXNlcworICAgICAqIGFuIGVycm9yLiAqLworICAgIGlmICggIXNlbGYtPmJfcmVhZG9ubHkgKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0YWJsZSBidWZmZXJzIGFyZSBub3QgaGFzaGFibGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiAtMTsKLQlwID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOwotCWxlbiA9IHNpemU7Ci0JeCA9ICpwIDw8IDc7Ci0Jd2hpbGUgKC0tbGVuID49IDApCi0JCXggPSAoMTAwMDAwMyp4KSBeICpwKys7Ci0JeCBePSBzaXplOwotCWlmICh4ID09IC0xKQotCQl4ID0gLTI7Ci0Jc2VsZi0+Yl9oYXNoID0geDsKLQlyZXR1cm4geDsKKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIHB0cjsKKyAgICBsZW4gPSBzaXplOworICAgIHggPSAqcCA8PCA3OworICAgIHdoaWxlICgtLWxlbiA+PSAwKQorICAgICAgICB4ID0gKDEwMDAwMDMqeCkgXiAqcCsrOworICAgIHggXj0gc2l6ZTsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgeCA9IC0yOworICAgIHNlbGYtPmJfaGFzaCA9IHg7CisgICAgcmV0dXJuIHg7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfc3RyKFB5QnVmZmVyT2JqZWN0ICpzZWxmKQogewotCXZvaWQgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjb25zdCBjaGFyICopcHRyLCBzaXplKTsKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY29uc3QgY2hhciAqKXB0ciwgc2l6ZSk7CiB9CiAKIC8qIFNlcXVlbmNlIG1ldGhvZHMgKi8KQEAgLTM1OSwzNzIgKzM1OSwzNzIgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBidWZmZXJfbGVuZ3RoKFB5QnVmZmVyT2JqZWN0ICpzZWxmKQogewotCXZvaWQgKnB0cjsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBzaXplOworICAgIHZvaWQgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBzaXplOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVmZmVyX2NvbmNhdChQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyKQogewotCVB5QnVmZmVyUHJvY3MgKnBiID0gb3RoZXItPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKLQl2b2lkICpwdHIxLCAqcHRyMjsKLQljaGFyICpwOwotCVB5T2JqZWN0ICpvYjsKLQlQeV9zc2l6ZV90IHNpemUsIGNvdW50OworICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gb3RoZXItPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKKyAgICB2b2lkICpwdHIxLCAqcHRyMjsKKyAgICBjaGFyICpwOworICAgIFB5T2JqZWN0ICpvYjsKKyAgICBQeV9zc2l6ZV90IHNpemUsIGNvdW50OwogCi0JaWYgKCBwYiA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8Ci0JICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCi0JewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKCAoKnBiLT5iZl9nZXRzZWdjb3VudCkob3RoZXIsIE5VTEwpICE9IDEgKQotCXsKLQkJLyogIyMjIHVzZSBhIGRpZmZlcmVudCBleGNlcHRpb24gdHlwZS9tZXNzYWdlPyAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIHBiID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoICgqcGItPmJmX2dldHNlZ2NvdW50KShvdGhlciwgTlVMTCkgIT0gMSApCisgICAgeworICAgICAgICAvKiAjIyMgdXNlIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0eXBlL21lc3NhZ2U/ICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAJaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0gCQlyZXR1cm4gTlVMTDsKLSAKLQkvKiBvcHRpbWl6ZSBzcGVjaWFsIGNhc2UgKi8KLQlpZiAoIHNpemUgPT0gMCApCi0JewotCSAgICBQeV9JTkNSRUYob3RoZXIpOwotCSAgICByZXR1cm4gb3RoZXI7Ci0JfQorICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICggKGNvdW50ID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikob3RoZXIsIDAsICZwdHIyKSkgPCAwICkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogb3B0aW1pemUgc3BlY2lhbCBjYXNlICovCisgICAgaWYgKCBzaXplID09IDAgKQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKG90aGVyKTsKKyAgICAgICAgcmV0dXJuIG90aGVyOworICAgIH0KIAotCWFzc2VydChjb3VudCA8PSBQWV9TSVpFX01BWCAtIHNpemUpOworICAgIGlmICggKGNvdW50ID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikob3RoZXIsIDAsICZwdHIyKSkgPCAwICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAJb2IgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplICsgY291bnQpOwotCWlmICggb2IgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotIAlwID0gUHlTdHJpbmdfQVNfU1RSSU5HKG9iKTsKLSAJbWVtY3B5KHAsIHB0cjEsIHNpemUpOwotIAltZW1jcHkocCArIHNpemUsIHB0cjIsIGNvdW50KTsKKyAgICBhc3NlcnQoY291bnQgPD0gUFlfU0laRV9NQVggLSBzaXplKTsKIAotCS8qIHRoZXJlIGlzIGFuIGV4dHJhIGJ5dGUgaW4gdGhlIHN0cmluZyBvYmplY3QsIHNvIHRoaXMgaXMgc2FmZSAqLwotCXBbc2l6ZSArIGNvdW50XSA9ICdcMCc7CisgICAgb2IgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplICsgY291bnQpOworICAgIGlmICggb2IgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSBQeVN0cmluZ19BU19TVFJJTkcob2IpOworICAgIG1lbWNweShwLCBwdHIxLCBzaXplKTsKKyAgICBtZW1jcHkocCArIHNpemUsIHB0cjIsIGNvdW50KTsKIAotCXJldHVybiBvYjsKKyAgICAvKiB0aGVyZSBpcyBhbiBleHRyYSBieXRlIGluIHRoZSBzdHJpbmcgb2JqZWN0LCBzbyB0aGlzIGlzIHNhZmUgKi8KKyAgICBwW3NpemUgKyBjb3VudF0gPSAnXDAnOworCisgICAgcmV0dXJuIG9iOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVmZmVyX3JlcGVhdChQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBjb3VudCkKIHsKLQlQeU9iamVjdCAqb2I7Ci0JcmVnaXN0ZXIgY2hhciAqcDsKLQl2b2lkICpwdHI7Ci0JUHlfc3NpemVfdCBzaXplOworICAgIFB5T2JqZWN0ICpvYjsKKyAgICByZWdpc3RlciBjaGFyICpwOworICAgIHZvaWQgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlpZiAoIGNvdW50IDwgMCApCi0JCWNvdW50ID0gMDsKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoY291bnQgPiBQWV9TU0laRV9UX01BWCAvIHNpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAicmVzdWx0IHRvbyBsYXJnZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb2IgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplICogY291bnQpOwotCWlmICggb2IgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOworICAgIGlmICggY291bnQgPCAwICkKKyAgICAgICAgY291bnQgPSAwOworICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjb3VudCA+IFBZX1NTSVpFX1RfTUFYIC8gc2l6ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJyZXN1bHQgdG9vIGxhcmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvYiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUgKiBjb3VudCk7CisgICAgaWYgKCBvYiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlwID0gUHlTdHJpbmdfQVNfU1RSSU5HKG9iKTsKLQl3aGlsZSAoIGNvdW50LS0gKQotCXsKLQkgICAgbWVtY3B5KHAsIHB0ciwgc2l6ZSk7Ci0JICAgIHAgKz0gc2l6ZTsKLQl9CisgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyhvYik7CisgICAgd2hpbGUgKCBjb3VudC0tICkKKyAgICB7CisgICAgICAgIG1lbWNweShwLCBwdHIsIHNpemUpOworICAgICAgICBwICs9IHNpemU7CisgICAgfQogCi0JLyogdGhlcmUgaXMgYW4gZXh0cmEgYnl0ZSBpbiB0aGUgc3RyaW5nIG9iamVjdCwgc28gdGhpcyBpcyBzYWZlICovCi0JKnAgPSAnXDAnOworICAgIC8qIHRoZXJlIGlzIGFuIGV4dHJhIGJ5dGUgaW4gdGhlIHN0cmluZyBvYmplY3QsIHNvIHRoaXMgaXMgc2FmZSAqLworICAgICpwID0gJ1wwJzsKIAotCXJldHVybiBvYjsKKyAgICByZXR1cm4gb2I7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfaXRlbShQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpZHgpCiB7Ci0Jdm9pZCAqcHRyOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIGlkeCA8IDAgfHwgaWR4ID49IHNpemUgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiYnVmZmVyIGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopcHRyICsgaWR4LCAxKTsKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggaWR4IDwgMCB8fCBpZHggPj0gc2l6ZSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJidWZmZXIgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilwdHIgKyBpZHgsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVmZmVyX3NsaWNlKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGxlZnQsIFB5X3NzaXplX3QgcmlnaHQpCiB7Ci0Jdm9pZCAqcHRyOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIGxlZnQgPCAwICkKLQkJbGVmdCA9IDA7Ci0JaWYgKCByaWdodCA8IDAgKQotCQlyaWdodCA9IDA7Ci0JaWYgKCByaWdodCA+IHNpemUgKQotCQlyaWdodCA9IHNpemU7Ci0JaWYgKCByaWdodCA8IGxlZnQgKQotCQlyaWdodCA9IGxlZnQ7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopcHRyICsgbGVmdCwKLQkJCQkJICByaWdodCAtIGxlZnQpOworICAgIHZvaWQgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCBsZWZ0IDwgMCApCisgICAgICAgIGxlZnQgPSAwOworICAgIGlmICggcmlnaHQgPCAwICkKKyAgICAgICAgcmlnaHQgPSAwOworICAgIGlmICggcmlnaHQgPiBzaXplICkKKyAgICAgICAgcmlnaHQgPSBzaXplOworICAgIGlmICggcmlnaHQgPCBsZWZ0ICkKKyAgICAgICAgcmlnaHQgPSBsZWZ0OworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXB0ciArIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWZmZXJfc3Vic2NyaXB0KFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaXRlbSkKIHsKLQl2b2lkICpwOwotCVB5X3NzaXplX3Qgc2l6ZTsKLQkKLQlpZiAoIWdldF9idWYoc2VsZiwgJnAsICZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gc2l6ZTsKLQkJcmV0dXJuIGJ1ZmZlcl9pdGVtKHNlbGYsIGkpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoLCBjdXIsIGk7CisgICAgdm9pZCAqcDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0KilpdGVtLCBzaXplLAotCQkJCSAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKKyAgICAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IHNpemU7CisgICAgICAgIHJldHVybiBidWZmZXJfaXRlbShzZWxmLCBpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOwogCi0JCWlmIChzbGljZWxlbmd0aCA8PSAwKQotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCIiLCAwKTsKLQkJZWxzZSBpZiAoc3RlcCA9PSAxKQotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopcCArIHN0YXJ0LAotCQkJCQkJCSAgc3RvcCAtIHN0YXJ0KTsKLQkJZWxzZSB7Ci0JCQlQeU9iamVjdCAqcmVzdWx0OwotCQkJY2hhciAqc291cmNlX2J1ZiA9IChjaGFyICopcDsKLQkJCWNoYXIgKnJlc3VsdF9idWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhzbGljZWxlbmd0aCk7CisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJCWlmIChyZXN1bHRfYnVmID09IE5VTEwpCi0JCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGlmIChzbGljZWxlbmd0aCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCIiLCAwKTsKKyAgICAgICAgZWxzZSBpZiAoc3RlcCA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopcCArIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgLSBzdGFydCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgICAgIGNoYXIgKnNvdXJjZV9idWYgPSAoY2hhciAqKXA7CisgICAgICAgICAgICBjaGFyICpyZXN1bHRfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2Moc2xpY2VsZW5ndGgpOwogCi0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOwotCQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkJcmVzdWx0X2J1ZltpXSA9IHNvdXJjZV9idWZbY3VyXTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChyZXN1bHRfYnVmID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQkJCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlc3VsdF9idWYsCi0JCQkJCQkJICAgIHNsaWNlbGVuZ3RoKTsKLQkJCVB5TWVtX0ZyZWUocmVzdWx0X2J1Zik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzZXF1ZW5jZSBpbmRleCBtdXN0IGJlIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIHJlc3VsdF9idWZbaV0gPSBzb3VyY2VfYnVmW2N1cl07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlc3VsdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbmd0aCk7CisgICAgICAgICAgICBQeU1lbV9GcmVlKHJlc3VsdF9idWYpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSBpbmRleCBtdXN0IGJlIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBidWZmZXJfYXNzX2l0ZW0oUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaWR4LCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGI7Ci0Jdm9pZCAqcHRyMSwgKnB0cjI7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5X3NzaXplX3QgY291bnQ7CisgICAgUHlCdWZmZXJQcm9jcyAqcGI7CisgICAgdm9pZCAqcHRyMSwgKnB0cjI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5X3NzaXplX3QgY291bnQ7CiAKLQlpZiAoIHNlbGYtPmJfcmVhZG9ubHkgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImJ1ZmZlciBpcyByZWFkLW9ubHkiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIHNlbGYtPmJfcmVhZG9ubHkgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIGlzIHJlYWQtb25seSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKGlkeCA8IDAgfHwgaWR4ID49IHNpemUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJImJ1ZmZlciBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzaXplKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcGIgPSBvdGhlciA/IG90aGVyLT5vYl90eXBlLT50cF9hc19idWZmZXIgOiBOVUxMOwotCWlmICggcGIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQotCXsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoICgqcGItPmJmX2dldHNlZ2NvdW50KShvdGhlciwgTlVMTCkgIT0gMSApCi0JewotCQkvKiAjIyMgdXNlIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0eXBlL21lc3NhZ2U/ICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBwYiA9IG90aGVyID8gb3RoZXItPm9iX3R5cGUtPnRwX2FzX2J1ZmZlciA6IE5VTEw7CisgICAgaWYgKCBwYiA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCisgICAgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICggKCpwYi0+YmZfZ2V0c2VnY291bnQpKG90aGVyLCBOVUxMKSAhPSAxICkKKyAgICB7CisgICAgICAgIC8qICMjIyB1c2UgYSBkaWZmZXJlbnQgZXhjZXB0aW9uIHR5cGUvbWVzc2FnZT8gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoIChjb3VudCA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKG90aGVyLCAwLCAmcHRyMikpIDwgMCApCi0JCXJldHVybiAtMTsKLQlpZiAoIGNvdW50ICE9IDEgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInJpZ2h0IG9wZXJhbmQgbXVzdCBiZSBhIHNpbmdsZSBieXRlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCAoY291bnQgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKShvdGhlciwgMCwgJnB0cjIpKSA8IDAgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCBjb3VudCAhPSAxICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJpZ2h0IG9wZXJhbmQgbXVzdCBiZSBhIHNpbmdsZSBieXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkoKGNoYXIgKilwdHIxKVtpZHhdID0gKihjaGFyICopcHRyMjsKLQlyZXR1cm4gMDsKKyAgICAoKGNoYXIgKilwdHIxKVtpZHhdID0gKihjaGFyICopcHRyMjsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogYnVmZmVyX2Fzc19zbGljZShQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBsZWZ0LCBQeV9zc2l6ZV90IHJpZ2h0LCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGI7Ci0Jdm9pZCAqcHRyMSwgKnB0cjI7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5X3NzaXplX3Qgc2xpY2VfbGVuOwotCVB5X3NzaXplX3QgY291bnQ7CisgICAgUHlCdWZmZXJQcm9jcyAqcGI7CisgICAgdm9pZCAqcHRyMSwgKnB0cjI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5X3NzaXplX3Qgc2xpY2VfbGVuOworICAgIFB5X3NzaXplX3QgY291bnQ7CiAKLQlpZiAoIHNlbGYtPmJfcmVhZG9ubHkgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImJ1ZmZlciBpcyByZWFkLW9ubHkiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIHNlbGYtPmJfcmVhZG9ubHkgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIGlzIHJlYWQtb25seSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcGIgPSBvdGhlciA/IG90aGVyLT5vYl90eXBlLT50cF9hc19idWZmZXIgOiBOVUxMOwotCWlmICggcGIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAotCSAgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgKQotCXsKLQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoICgqcGItPmJmX2dldHNlZ2NvdW50KShvdGhlciwgTlVMTCkgIT0gMSApCi0JewotCQkvKiAjIyMgdXNlIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiB0eXBlL21lc3NhZ2U/ICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplLCBBTllfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOwotCWlmICggKGNvdW50ID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikob3RoZXIsIDAsICZwdHIyKSkgPCAwICkKLQkJcmV0dXJuIC0xOworICAgIHBiID0gb3RoZXIgPyBvdGhlci0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyIDogTlVMTDsKKyAgICBpZiAoIHBiID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCAoKnBiLT5iZl9nZXRzZWdjb3VudCkob3RoZXIsIE5VTEwpICE9IDEgKQorICAgIHsKKyAgICAgICAgLyogIyMjIHVzZSBhIGRpZmZlcmVudCBleGNlcHRpb24gdHlwZS9tZXNzYWdlPyAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICggKGNvdW50ID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikob3RoZXIsIDAsICZwdHIyKSkgPCAwICkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCBsZWZ0IDwgMCApCi0JCWxlZnQgPSAwOwotCWVsc2UgaWYgKCBsZWZ0ID4gc2l6ZSApCi0JCWxlZnQgPSBzaXplOwotCWlmICggcmlnaHQgPCBsZWZ0ICkKLQkJcmlnaHQgPSBsZWZ0OwotCWVsc2UgaWYgKCByaWdodCA+IHNpemUgKQotCQlyaWdodCA9IHNpemU7Ci0Jc2xpY2VfbGVuID0gcmlnaHQgLSBsZWZ0OworICAgIGlmICggbGVmdCA8IDAgKQorICAgICAgICBsZWZ0ID0gMDsKKyAgICBlbHNlIGlmICggbGVmdCA+IHNpemUgKQorICAgICAgICBsZWZ0ID0gc2l6ZTsKKyAgICBpZiAoIHJpZ2h0IDwgbGVmdCApCisgICAgICAgIHJpZ2h0ID0gbGVmdDsKKyAgICBlbHNlIGlmICggcmlnaHQgPiBzaXplICkKKyAgICAgICAgcmlnaHQgPSBzaXplOworICAgIHNsaWNlX2xlbiA9IHJpZ2h0IC0gbGVmdDsKIAotCWlmICggY291bnQgIT0gc2xpY2VfbGVuICkgewotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkicmlnaHQgb3BlcmFuZCBsZW5ndGggbXVzdCBtYXRjaCBzbGljZSBsZW5ndGgiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIGNvdW50ICE9IHNsaWNlX2xlbiApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgInJpZ2h0IG9wZXJhbmQgbGVuZ3RoIG11c3QgbWF0Y2ggc2xpY2UgbGVuZ3RoIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoIHNsaWNlX2xlbiApCi0JICAgIG1lbWNweSgoY2hhciAqKXB0cjEgKyBsZWZ0LCBwdHIyLCBzbGljZV9sZW4pOworICAgIGlmICggc2xpY2VfbGVuICkKKyAgICAgICAgbWVtY3B5KChjaGFyICopcHRyMSArIGxlZnQsIHB0cjIsIHNsaWNlX2xlbik7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogYnVmZmVyX2Fzc19zdWJzY3JpcHQoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppdGVtLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGI7Ci0Jdm9pZCAqcHRyMSwgKnB0cjI7Ci0JUHlfc3NpemVfdCBzZWxmc2l6ZTsKLQlQeV9zc2l6ZV90IG90aGVyc2l6ZTsKKyAgICBQeUJ1ZmZlclByb2NzICpwYjsKKyAgICB2b2lkICpwdHIxLCAqcHRyMjsKKyAgICBQeV9zc2l6ZV90IHNlbGZzaXplOworICAgIFB5X3NzaXplX3Qgb3RoZXJzaXplOwogCi0JaWYgKCBzZWxmLT5iX3JlYWRvbmx5ICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJidWZmZXIgaXMgcmVhZC1vbmx5Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCBzZWxmLT5iX3JlYWRvbmx5ICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBpcyByZWFkLW9ubHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXBiID0gdmFsdWUgPyB2YWx1ZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyIDogTlVMTDsKLQlpZiAoIHBiID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKLQkgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMICkKLQl7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCAoKnBiLT5iZl9nZXRzZWdjb3VudCkodmFsdWUsIE5VTEwpICE9IDEgKQotCXsKLQkJLyogIyMjIHVzZSBhIGRpZmZlcmVudCBleGNlcHRpb24gdHlwZS9tZXNzYWdlPyAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2VsZnNpemUsIEFOWV9CVUZGRVIpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoaSA8IDApCi0JCQlpICs9IHNlbGZzaXplOwotCQlyZXR1cm4gYnVmZmVyX2Fzc19pdGVtKHNlbGYsIGksIHZhbHVlKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aDsKLQkJCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCAqKWl0ZW0sIHNlbGZzaXplLAotCQkJCSZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkKLQkJCXJldHVybiAtMTsKKyAgICBwYiA9IHZhbHVlID8gdmFsdWUtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlciA6IE5VTEw7CisgICAgaWYgKCBwYiA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0cmVhZGJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCApCisgICAgeworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICggKCpwYi0+YmZfZ2V0c2VnY291bnQpKHZhbHVlLCBOVUxMKSAhPSAxICkKKyAgICB7CisgICAgICAgIC8qICMjIyB1c2UgYSBkaWZmZXJlbnQgZXhjZXB0aW9uIHR5cGUvbWVzc2FnZT8gKi8KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaW5nbGUtc2VnbWVudCBidWZmZXIgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2VsZnNpemUsIEFOWV9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoaSA8IDApCisgICAgICAgICAgICBpICs9IHNlbGZzaXplOworICAgICAgICByZXR1cm4gYnVmZmVyX2Fzc19pdGVtKHNlbGYsIGksIHZhbHVlKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aDsKIAotCQlpZiAoKG90aGVyc2l6ZSA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKHZhbHVlLCAwLCAmcHRyMikpIDwgMCkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwgc2VsZnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJaWYgKG90aGVyc2l6ZSAhPSBzbGljZWxlbmd0aCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkicmlnaHQgb3BlcmFuZCBsZW5ndGggbXVzdCBtYXRjaCBzbGljZSBsZW5ndGgiKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBpZiAoKG90aGVyc2l6ZSA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKHZhbHVlLCAwLCAmcHRyMikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAoc2xpY2VsZW5ndGggPT0gMCkKLQkJCXJldHVybiAwOwotCQllbHNlIGlmIChzdGVwID09IDEpIHsKLQkJCW1lbWNweSgoY2hhciAqKXB0cjEgKyBzdGFydCwgcHRyMiwgc2xpY2VsZW5ndGgpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeV9zc2l6ZV90IGN1ciwgaTsKLQkJCQotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCSgoY2hhciAqKXB0cjEpW2N1cl0gPSAoKGNoYXIgKilwdHIyKVtpXTsKLQkJCX0KKyAgICAgICAgaWYgKG90aGVyc2l6ZSAhPSBzbGljZWxlbmd0aCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAicmlnaHQgb3BlcmFuZCBsZW5ndGggbXVzdCBtYXRjaCBzbGljZSBsZW5ndGgiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImJ1ZmZlciBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgaWYgKHNsaWNlbGVuZ3RoID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZSBpZiAoc3RlcCA9PSAxKSB7CisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilwdHIxICsgc3RhcnQsIHB0cjIsIHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfc3NpemVfdCBjdXIsIGk7CisKKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICAoKGNoYXIgKilwdHIxKVtjdXJdID0gKChjaGFyICopcHRyMilbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKIC8qIEJ1ZmZlciBtZXRob2RzICovCkBAIC03MzIsMTI2ICs3MzIsMTI2IEBACiBzdGF0aWMgUHlfc3NpemVfdAogYnVmZmVyX2dldHJlYWRidWYoUHlCdWZmZXJPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaWR4LCB2b2lkICoqcHApCiB7Ci0JUHlfc3NpemVfdCBzaXplOwotCWlmICggaWR4ICE9IDAgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBidWZmZXIgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghZ2V0X2J1ZihzZWxmLCBwcCwgJnNpemUsIFJFQURfQlVGRkVSKSkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBzaXplOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIGlkeCAhPSAwICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBidWZmZXIgc2VnbWVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghZ2V0X2J1ZihzZWxmLCBwcCwgJnNpemUsIFJFQURfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBzaXplOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogYnVmZmVyX2dldHdyaXRlYnVmKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlkeCwgdm9pZCAqKnBwKQogewotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlpZiAoIHNlbGYtPmJfcmVhZG9ubHkgKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBpcyByZWFkLW9ubHkiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIHNlbGYtPmJfcmVhZG9ubHkgKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBpcyByZWFkLW9ubHkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmICggaWR4ICE9IDAgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBidWZmZXIgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghZ2V0X2J1ZihzZWxmLCBwcCwgJnNpemUsIFdSSVRFX0JVRkZFUikpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gc2l6ZTsKKyAgICBpZiAoIGlkeCAhPSAwICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBidWZmZXIgc2VnbWVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghZ2V0X2J1ZihzZWxmLCBwcCwgJnNpemUsIFdSSVRFX0JVRkZFUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gc2l6ZTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGJ1ZmZlcl9nZXRzZWdjb3VudChQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCAqbGVucCkKIHsKLQl2b2lkICpwdHI7Ci0JUHlfc3NpemVfdCBzaXplOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCi0JCXJldHVybiAtMTsKLQlpZiAobGVucCkKLQkJKmxlbnAgPSBzaXplOwotCXJldHVybiAxOworICAgIHZvaWQgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChsZW5wKQorICAgICAgICAqbGVucCA9IHNpemU7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBidWZmZXJfZ2V0Y2hhcmJ1ZihQeUJ1ZmZlck9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpZHgsIGNvbnN0IGNoYXIgKipwcCkKIHsKLQl2b2lkICpwdHI7Ci0JUHlfc3NpemVfdCBzaXplOwotCWlmICggaWR4ICE9IDAgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBidWZmZXIgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQ0hBUl9CVUZGRVIpKQotCQlyZXR1cm4gLTE7Ci0JKnBwID0gKGNvbnN0IGNoYXIgKilwdHI7Ci0JcmV0dXJuIHNpemU7CisgICAgdm9pZCAqcHRyOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBpZiAoIGlkeCAhPSAwICkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBidWZmZXIgc2VnbWVudCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQ0hBUl9CVUZGRVIpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgKnBwID0gKGNvbnN0IGNoYXIgKilwdHI7CisgICAgcmV0dXJuIHNpemU7CiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBidWZmZXJfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpYnVmZmVyX2xlbmd0aCwgLypzcV9sZW5ndGgqLwotCShiaW5hcnlmdW5jKWJ1ZmZlcl9jb25jYXQsIC8qc3FfY29uY2F0Ki8KLQkoc3NpemVhcmdmdW5jKWJ1ZmZlcl9yZXBlYXQsIC8qc3FfcmVwZWF0Ki8KLQkoc3NpemVhcmdmdW5jKWJ1ZmZlcl9pdGVtLCAvKnNxX2l0ZW0qLwotCShzc2l6ZXNzaXplYXJnZnVuYylidWZmZXJfc2xpY2UsIC8qc3Ffc2xpY2UqLwotCShzc2l6ZW9iamFyZ3Byb2MpYnVmZmVyX2Fzc19pdGVtLCAvKnNxX2Fzc19pdGVtKi8KLQkoc3NpemVzc2l6ZW9iamFyZ3Byb2MpYnVmZmVyX2Fzc19zbGljZSwgLypzcV9hc3Nfc2xpY2UqLworICAgIChsZW5mdW5jKWJ1ZmZlcl9sZW5ndGgsIC8qc3FfbGVuZ3RoKi8KKyAgICAoYmluYXJ5ZnVuYylidWZmZXJfY29uY2F0LCAvKnNxX2NvbmNhdCovCisgICAgKHNzaXplYXJnZnVuYylidWZmZXJfcmVwZWF0LCAvKnNxX3JlcGVhdCovCisgICAgKHNzaXplYXJnZnVuYylidWZmZXJfaXRlbSwgLypzcV9pdGVtKi8KKyAgICAoc3NpemVzc2l6ZWFyZ2Z1bmMpYnVmZmVyX3NsaWNlLCAvKnNxX3NsaWNlKi8KKyAgICAoc3NpemVvYmphcmdwcm9jKWJ1ZmZlcl9hc3NfaXRlbSwgLypzcV9hc3NfaXRlbSovCisgICAgKHNzaXplc3NpemVvYmphcmdwcm9jKWJ1ZmZlcl9hc3Nfc2xpY2UsIC8qc3FfYXNzX3NsaWNlKi8KIH07CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIGJ1ZmZlcl9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKWJ1ZmZlcl9sZW5ndGgsCi0JKGJpbmFyeWZ1bmMpYnVmZmVyX3N1YnNjcmlwdCwKLQkob2Jqb2JqYXJncHJvYylidWZmZXJfYXNzX3N1YnNjcmlwdCwKKyAgICAobGVuZnVuYylidWZmZXJfbGVuZ3RoLAorICAgIChiaW5hcnlmdW5jKWJ1ZmZlcl9zdWJzY3JpcHQsCisgICAgKG9iam9iamFyZ3Byb2MpYnVmZmVyX2Fzc19zdWJzY3JpcHQsCiB9OwogCiBzdGF0aWMgUHlCdWZmZXJQcm9jcyBidWZmZXJfYXNfYnVmZmVyID0gewotCShyZWFkYnVmZmVycHJvYylidWZmZXJfZ2V0cmVhZGJ1ZiwKLQkod3JpdGVidWZmZXJwcm9jKWJ1ZmZlcl9nZXR3cml0ZWJ1ZiwKLQkoc2VnY291bnRwcm9jKWJ1ZmZlcl9nZXRzZWdjb3VudCwKLQkoY2hhcmJ1ZmZlcnByb2MpYnVmZmVyX2dldGNoYXJidWYsCisgICAgKHJlYWRidWZmZXJwcm9jKWJ1ZmZlcl9nZXRyZWFkYnVmLAorICAgICh3cml0ZWJ1ZmZlcnByb2MpYnVmZmVyX2dldHdyaXRlYnVmLAorICAgIChzZWdjb3VudHByb2MpYnVmZmVyX2dldHNlZ2NvdW50LAorICAgIChjaGFyYnVmZmVycHJvYylidWZmZXJfZ2V0Y2hhcmJ1ZiwKIH07CiAKIFB5VHlwZU9iamVjdCBQeUJ1ZmZlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImJ1ZmZlciIsCi0Jc2l6ZW9mKFB5QnVmZmVyT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWJ1ZmZlcl9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpYnVmZmVyX2NvbXBhcmUsCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWJ1ZmZlcl9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJmJ1ZmZlcl9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZidWZmZXJfYXNfbWFwcGluZywJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWJ1ZmZlcl9oYXNoLAkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCShyZXByZnVuYylidWZmZXJfc3RyLAkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkmYnVmZmVyX2FzX2J1ZmZlciwJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUiwgLyogdHBfZmxhZ3MgKi8KLQlidWZmZXJfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCQotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlidWZmZXJfbmV3LAkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJidWZmZXIiLAorICAgIHNpemVvZihQeUJ1ZmZlck9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilidWZmZXJfZGVhbGxvYywgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpYnVmZmVyX2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWJ1ZmZlcl9yZXByLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmYnVmZmVyX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJmJ1ZmZlcl9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWJ1ZmZlcl9oYXNoLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKWJ1ZmZlcl9zdHIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZidWZmZXJfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIsIC8qIHRwX2ZsYWdzICovCisgICAgYnVmZmVyX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBidWZmZXJfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jIGIvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKaW5kZXggZGU4NzkwNS4uOGNlMDg1NiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKKysrIGIvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMKQEAgLTIzNyw3ICsyMzcsNyBAQAogCiAgICAgZSA9IHAgKyBsZW47CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoIUlTU1BBQ0UoKnApKQorICAgICAgICBpZiAoIUlTU1BBQ0UoKnApKQogICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogICAgIH0KICAgICBQeV9SRVRVUk5fVFJVRTsKQEAgLTI1OSwxNiArMjU5LDE2IEBACiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAxICYmIElTQUxQSEEoKnApKQotCVB5X1JFVFVSTl9UUlVFOworICAgICAgICBQeV9SRVRVUk5fVFJVRTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMCkKLQlQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKIAogICAgIGUgPSBwICsgbGVuOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKCFJU0FMUEhBKCpwKSkKLQkgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBpZiAoIUlTQUxQSEEoKnApKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogICAgIH0KICAgICBQeV9SRVRVUk5fVFJVRTsKIH0KQEAgLTI4OSwxNiArMjg5LDE2IEBACiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAxICYmIElTQUxOVU0oKnApKQotCVB5X1JFVFVSTl9UUlVFOworICAgICAgICBQeV9SRVRVUk5fVFJVRTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMCkKLQlQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKIAogICAgIGUgPSBwICsgbGVuOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKCFJU0FMTlVNKCpwKSkKLQkgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBpZiAoIUlTQUxOVU0oKnApKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogICAgIH0KICAgICBQeV9SRVRVUk5fVFJVRTsKIH0KQEAgLTMxOSwxNiArMzE5LDE2IEBACiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAxICYmIElTRElHSVQoKnApKQotCVB5X1JFVFVSTl9UUlVFOworICAgICAgICBQeV9SRVRVUk5fVFJVRTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMCkKLQlQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKIAogICAgIGUgPSBwICsgbGVuOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKCFJU0RJR0lUKCpwKSkKLQkgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBpZiAoIUlTRElHSVQoKnApKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogICAgIH0KICAgICBQeV9SRVRVUk5fVFJVRTsKIH0KQEAgLTM1MCwxOSArMzUwLDE5IEBACiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAxKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoSVNMT1dFUigqcCkpOworICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKElTTE9XRVIoKnApKTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMCkKLQlQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKIAogICAgIGUgPSBwICsgbGVuOwogICAgIGNhc2VkID0gMDsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmIChJU1VQUEVSKCpwKSkKLQkgICAgUHlfUkVUVVJOX0ZBTFNFOwotCWVsc2UgaWYgKCFjYXNlZCAmJiBJU0xPV0VSKCpwKSkKLQkgICAgY2FzZWQgPSAxOworICAgICAgICBpZiAoSVNVUFBFUigqcCkpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIGVsc2UgaWYgKCFjYXNlZCAmJiBJU0xPV0VSKCpwKSkKKyAgICAgICAgICAgIGNhc2VkID0gMTsKICAgICB9CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhjYXNlZCk7CiB9CkBAIC0zODQsMTkgKzM4NCwxOSBAQAogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChsZW4gPT0gMSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKElTVVBQRVIoKnApKTsKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhJU1VQUEVSKCpwKSk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDApCi0JUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CiAKICAgICBlID0gcCArIGxlbjsKICAgICBjYXNlZCA9IDA7CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoSVNMT1dFUigqcCkpCi0JICAgIFB5X1JFVFVSTl9GQUxTRTsKLQllbHNlIGlmICghY2FzZWQgJiYgSVNVUFBFUigqcCkpCi0JICAgIGNhc2VkID0gMTsKKyAgICAgICAgaWYgKElTTE9XRVIoKnApKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBlbHNlIGlmICghY2FzZWQgJiYgSVNVUFBFUigqcCkpCisgICAgICAgICAgICBjYXNlZCA9IDE7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoY2FzZWQpOwogfQpAQCAtNDIwLDMyICs0MjAsMzIgQEAKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAobGVuID09IDEpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhJU1VQUEVSKCpwKSk7CisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoSVNVUFBFUigqcCkpOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKGxlbiA9PSAwKQotCVB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogCiAgICAgZSA9IHAgKyBsZW47CiAgICAgY2FzZWQgPSAwOwogICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCXJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2ggPSAqcDsKKyAgICAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciBjaCA9ICpwOwogCi0JaWYgKElTVVBQRVIoY2gpKSB7Ci0JICAgIGlmIChwcmV2aW91c19pc19jYXNlZCkKLQkJUHlfUkVUVVJOX0ZBTFNFOwotCSAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7Ci0JICAgIGNhc2VkID0gMTsKLQl9Ci0JZWxzZSBpZiAoSVNMT1dFUihjaCkpIHsKLQkgICAgaWYgKCFwcmV2aW91c19pc19jYXNlZCkKLQkJUHlfUkVUVVJOX0ZBTFNFOwotCSAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7Ci0JICAgIGNhc2VkID0gMTsKLQl9Ci0JZWxzZQotCSAgICBwcmV2aW91c19pc19jYXNlZCA9IDA7CisgICAgICAgIGlmIChJU1VQUEVSKGNoKSkgeworICAgICAgICAgICAgaWYgKHByZXZpb3VzX2lzX2Nhc2VkKQorICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKKyAgICAgICAgICAgIGNhc2VkID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChJU0xPV0VSKGNoKSkgeworICAgICAgICAgICAgaWYgKCFwcmV2aW91c19pc19jYXNlZCkKKyAgICAgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7CisgICAgICAgICAgICBjYXNlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAwOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGNhc2VkKTsKIH0KQEAgLTQ1OSwyMyArNDU5LDIzIEBACiB2b2lkCiBfUHlfYnl0ZXNfbG93ZXIoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbikKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgICAgIFB5X3NzaXplX3QgaTsKIAogICAgICAgICAvKgotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbik7Ci0JaWYgKCFuZXdvYmopCi0JCXJldHVybiBOVUxMOworICAgICAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgICAgICBpZiAoIW5ld29iaikKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCXMgPSBQeVN0cmluZ19BU19TVFJJTkcobmV3b2JqKTsKKyAgICAgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOwogICAgICAgICAqLwogCi0JUHlfTUVNQ1BZKHJlc3VsdCwgY3B0ciwgbGVuKTsKKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdCwgY3B0ciwgbGVuKTsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKHJlc3VsdFtpXSk7Ci0JCWlmIChJU1VQUEVSKGMpKQotCQkJcmVzdWx0W2ldID0gVE9MT1dFUihjKTsKLQl9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0socmVzdWx0W2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoSVNVUFBFUihjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IFRPTE9XRVIoYyk7CisgICAgICAgIH0KIH0KIAogCkBAIC00ODcsMjMgKzQ4NywyMyBAQAogdm9pZAogX1B5X2J5dGVzX3VwcGVyKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pCiB7Ci0JUHlfc3NpemVfdCBpOworICAgICAgICBQeV9zc2l6ZV90IGk7CiAKICAgICAgICAgLyoKLQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmICghbmV3b2JqKQotCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKKyAgICAgICAgaWYgKCFuZXdvYmopCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld29iaik7CisgICAgICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcobmV3b2JqKTsKICAgICAgICAgKi8KIAotCVB5X01FTUNQWShyZXN1bHQsIGNwdHIsIGxlbik7CisgICAgICAgIFB5X01FTUNQWShyZXN1bHQsIGNwdHIsIGxlbik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSyhyZXN1bHRbaV0pOwotCQlpZiAoSVNMT1dFUihjKSkKLQkJCXJlc3VsdFtpXSA9IFRPVVBQRVIoYyk7Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKHJlc3VsdFtpXSk7CisgICAgICAgICAgICAgICAgaWYgKElTTE9XRVIoYykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBUT1VQUEVSKGMpOworICAgICAgICB9CiB9CiAKIApAQCAtNTE2LDI5ICs1MTYsMjkgQEAKIHZvaWQKIF9QeV9ieXRlc190aXRsZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewotCVB5X3NzaXplX3QgaTsKLQlpbnQgcHJldmlvdXNfaXNfY2FzZWQgPSAwOworICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgIGludCBwcmV2aW91c19pc19jYXNlZCA9IDA7CiAKICAgICAgICAgLyoKLQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwotCWlmIChuZXdvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc19uZXcgPSBQeVN0cmluZ19Bc1N0cmluZyhuZXdvYmopOworICAgICAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOworICAgICAgICBpZiAobmV3b2JqID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKICAgICAgICAgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKElTTE9XRVIoYykpIHsKLQkJCWlmICghcHJldmlvdXNfaXNfY2FzZWQpCi0JCQkgICAgYyA9IFRPVVBQRVIoYyk7Ci0JCQlwcmV2aW91c19pc19jYXNlZCA9IDE7Ci0JCX0gZWxzZSBpZiAoSVNVUFBFUihjKSkgewotCQkJaWYgKHByZXZpb3VzX2lzX2Nhc2VkKQotCQkJICAgIGMgPSBUT0xPV0VSKGMpOwotCQkJcHJldmlvdXNfaXNfY2FzZWQgPSAxOwotCQl9IGVsc2UKLQkJCXByZXZpb3VzX2lzX2Nhc2VkID0gMDsKLQkJKnJlc3VsdCsrID0gYzsKLQl9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgICAgICAgICAgaWYgKElTTE9XRVIoYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJldmlvdXNfaXNfY2FzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IFRPVVBQRVIoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU1VQUEVSKGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNfaXNfY2FzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IFRPTE9XRVIoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDA7CisgICAgICAgICAgICAgICAgKnJlc3VsdCsrID0gYzsKKyAgICAgICAgfQogfQogCiAKQEAgLTU1MCwzMCArNTUwLDMwIEBACiB2b2lkCiBfUHlfYnl0ZXNfY2FwaXRhbGl6ZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewotCVB5X3NzaXplX3QgaTsKKyAgICAgICAgUHlfc3NpemVfdCBpOwogCiAgICAgICAgIC8qCi0JbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKLQlpZiAobmV3b2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKKyAgICAgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKKyAgICAgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CiAgICAgICAgICovCi0JaWYgKDAgPCBsZW4pIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKElTTE9XRVIoYykpCi0JCQkqcmVzdWx0ID0gVE9VUFBFUihjKTsKLQkJZWxzZQotCQkJKnJlc3VsdCA9IGM7Ci0JCXJlc3VsdCsrOwotCX0KLQlmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKLQkJaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKLQkJaWYgKElTVVBQRVIoYykpCi0JCQkqcmVzdWx0ID0gVE9MT1dFUihjKTsKLQkJZWxzZQotCQkJKnJlc3VsdCA9IGM7Ci0JCXJlc3VsdCsrOwotCX0KKyAgICAgICAgaWYgKDAgPCBsZW4pIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICAgICAgICAgIGlmIChJU0xPV0VSKGMpKQorICAgICAgICAgICAgICAgICAgICAgICAgKnJlc3VsdCA9IFRPVVBQRVIoYyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKnJlc3VsdCA9IGM7CisgICAgICAgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGMgPSBQeV9DSEFSTUFTSygqcysrKTsKKyAgICAgICAgICAgICAgICBpZiAoSVNVUFBFUihjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBUT0xPV0VSKGMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBjOworICAgICAgICAgICAgICAgIHJlc3VsdCsrOworICAgICAgICB9CiB9CiAKIApAQCAtNTg2LDI1ICs1ODYsMjUgQEAKIHZvaWQKIF9QeV9ieXRlc19zd2FwY2FzZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewotCVB5X3NzaXplX3QgaTsKKyAgICAgICAgUHlfc3NpemVfdCBpOwogCiAgICAgICAgIC8qCi0JbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKLQlpZiAobmV3b2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKKyAgICAgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKTsKKyAgICAgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CiAgICAgICAgICovCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChJU0xPV0VSKGMpKSB7Ci0JCQkqcmVzdWx0ID0gVE9VUFBFUihjKTsKLQkJfQotCQllbHNlIGlmIChJU1VQUEVSKGMpKSB7Ci0JCQkqcmVzdWx0ID0gVE9MT1dFUihjKTsKLQkJfQotCQllbHNlCi0JCQkqcmVzdWx0ID0gYzsKLQkJcmVzdWx0Kys7Ci0JfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICAgICAgICAgIGlmIChJU0xPV0VSKGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcmVzdWx0ID0gVE9VUFBFUihjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNVUFBFUihjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnJlc3VsdCA9IFRPTE9XRVIoYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXN1bHQgPSBjOworICAgICAgICAgICAgICAgIHJlc3VsdCsrOworICAgICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvY2VsbG9iamVjdC5jIGIvT2JqZWN0cy9jZWxsb2JqZWN0LmMKaW5kZXggNGUwYmNmOC4uZDBmNmNkYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jZWxsb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jZWxsb2JqZWN0LmMKQEAgLTUsMTQxICs1LDE0MSBAQAogUHlPYmplY3QgKgogUHlDZWxsX05ldyhQeU9iamVjdCAqb2JqKQogewotCVB5Q2VsbE9iamVjdCAqb3A7CisgICAgUHlDZWxsT2JqZWN0ICpvcDsKIAotCW9wID0gKFB5Q2VsbE9iamVjdCAqKVB5T2JqZWN0X0dDX05ldyhQeUNlbGxPYmplY3QsICZQeUNlbGxfVHlwZSk7Ci0JaWYgKG9wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW9wLT5vYl9yZWYgPSBvYmo7Ci0JUHlfWElOQ1JFRihvYmopOworICAgIG9wID0gKFB5Q2VsbE9iamVjdCAqKVB5T2JqZWN0X0dDX05ldyhQeUNlbGxPYmplY3QsICZQeUNlbGxfVHlwZSk7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9wLT5vYl9yZWYgPSBvYmo7CisgICAgUHlfWElOQ1JFRihvYmopOwogCi0JX1B5T2JqZWN0X0dDX1RSQUNLKG9wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopb3A7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKG9wKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb3A7CiB9CiAKIFB5T2JqZWN0ICoKIFB5Q2VsbF9HZXQoUHlPYmplY3QgKm9wKQogewotCWlmICghUHlDZWxsX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X1hJTkNSRUYoKChQeUNlbGxPYmplY3QqKW9wKS0+b2JfcmVmKTsKLQlyZXR1cm4gUHlDZWxsX0dFVChvcCk7CisgICAgaWYgKCFQeUNlbGxfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfWElOQ1JFRigoKFB5Q2VsbE9iamVjdCopb3ApLT5vYl9yZWYpOworICAgIHJldHVybiBQeUNlbGxfR0VUKG9wKTsKIH0KIAogaW50CiBQeUNlbGxfU2V0KFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCogb2xkb2JqOwotCWlmICghUHlDZWxsX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlvbGRvYmogPSBQeUNlbGxfR0VUKG9wKTsKLQlQeV9YSU5DUkVGKG9iaik7Ci0JUHlDZWxsX1NFVChvcCwgb2JqKTsKLQlQeV9YREVDUkVGKG9sZG9iaik7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QqIG9sZG9iajsKKyAgICBpZiAoIVB5Q2VsbF9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb2xkb2JqID0gUHlDZWxsX0dFVChvcCk7CisgICAgUHlfWElOQ1JFRihvYmopOworICAgIFB5Q2VsbF9TRVQob3AsIG9iaik7CisgICAgUHlfWERFQ1JFRihvbGRvYmopOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogY2VsbF9kZWFsbG9jKFB5Q2VsbE9iamVjdCAqb3ApCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0sob3ApOwotCVB5X1hERUNSRUYob3AtPm9iX3JlZik7Ci0JUHlPYmplY3RfR0NfRGVsKG9wKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhvcCk7CisgICAgUHlfWERFQ1JFRihvcC0+b2JfcmVmKTsKKyAgICBQeU9iamVjdF9HQ19EZWwob3ApOwogfQogCiBzdGF0aWMgaW50CiBjZWxsX2NvbXBhcmUoUHlDZWxsT2JqZWN0ICphLCBQeUNlbGxPYmplY3QgKmIpCiB7Ci0JLyogUHkzSyB3YXJuaW5nIGZvciBjb21wYXJpc29ucyAgKi8KLQlpZiAoUHlFcnJfV2FyblB5M2soImNlbGwgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCBpbiAzLngiLAotCQkJICAgMSkgPCAwKSB7Ci0JCXJldHVybiAtMjsKLQl9CisgICAgLyogUHkzSyB3YXJuaW5nIGZvciBjb21wYXJpc29ucyAgKi8KKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImNlbGwgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCBpbiAzLngiLAorICAgICAgICAgICAgICAgICAgICAgICAxKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KIAotCWlmIChhLT5vYl9yZWYgPT0gTlVMTCkgewotCQlpZiAoYi0+b2JfcmVmID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIC0xOwotCX0gZWxzZSBpZiAoYi0+b2JfcmVmID09IE5VTEwpCi0JCXJldHVybiAxOwotCXJldHVybiBQeU9iamVjdF9Db21wYXJlKGEtPm9iX3JlZiwgYi0+b2JfcmVmKTsKKyAgICBpZiAoYS0+b2JfcmVmID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGItPm9iX3JlZiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKGItPm9iX3JlZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ29tcGFyZShhLT5vYl9yZWYsIGItPm9iX3JlZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjZWxsX3JlcHIoUHlDZWxsT2JqZWN0ICpvcCkKIHsKLQlpZiAob3AtPm9iX3JlZiA9PSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGNlbGwgYXQgJXA6IGVtcHR5PiIsIG9wKTsKKyAgICBpZiAob3AtPm9iX3JlZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGNlbGwgYXQgJXA6IGVtcHR5PiIsIG9wKTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Y2VsbCBhdCAlcDogJS44MHMgb2JqZWN0IGF0ICVwPiIsCi0JCQkJICAgb3AsIG9wLT5vYl9yZWYtPm9iX3R5cGUtPnRwX25hbWUsCi0JCQkJICAgb3AtPm9iX3JlZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxjZWxsIGF0ICVwOiAlLjgwcyBvYmplY3QgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCwgb3AtPm9iX3JlZi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+b2JfcmVmKTsKIH0KIAogc3RhdGljIGludAogY2VsbF90cmF2ZXJzZShQeUNlbGxPYmplY3QgKm9wLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChvcC0+b2JfcmVmKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChvcC0+b2JfcmVmKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogY2VsbF9jbGVhcihQeUNlbGxPYmplY3QgKm9wKQogewotCVB5X0NMRUFSKG9wLT5vYl9yZWYpOwotCXJldHVybiAwOworICAgIFB5X0NMRUFSKG9wLT5vYl9yZWYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2VsbF9nZXRfY29udGVudHMoUHlDZWxsT2JqZWN0ICpvcCwgdm9pZCAqY2xvc3VyZSkKIHsKLQlpZiAob3AtPm9iX3JlZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJDZWxsIGlzIGVtcHR5Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYob3AtPm9iX3JlZik7Ci0JcmV0dXJuIG9wLT5vYl9yZWY7CisgICAgaWYgKG9wLT5vYl9yZWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiQ2VsbCBpcyBlbXB0eSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKG9wLT5vYl9yZWYpOworICAgIHJldHVybiBvcC0+b2JfcmVmOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgY2VsbF9nZXRzZXRsaXN0W10gPSB7Ci0JeyJjZWxsX2NvbnRlbnRzIiwgKGdldHRlciljZWxsX2dldF9jb250ZW50cywgTlVMTH0sCi0Je05VTEx9IC8qIHNlbnRpbmVsICovCisgICAgeyJjZWxsX2NvbnRlbnRzIiwgKGdldHRlciljZWxsX2dldF9jb250ZW50cywgTlVMTH0sCisgICAge05VTEx9IC8qIHNlbnRpbmVsICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlDZWxsX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiY2VsbCIsCi0Jc2l6ZW9mKFB5Q2VsbE9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvciljZWxsX2RlYWxsb2MsICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLwotCTAsCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpY2VsbF9jb21wYXJlLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpY2VsbF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKWNlbGxfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotIAkoaW5xdWlyeSljZWxsX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwgCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCWNlbGxfZ2V0c2V0bGlzdCwJCQkvKiB0cF9nZXRzZXQgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJjZWxsIiwKKyAgICBzaXplb2YoUHlDZWxsT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWNlbGxfZGVhbGxvYywgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpY2VsbF9jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWNlbGxfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNlbGxfdHJhdmVyc2UsICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpY2VsbF9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGNlbGxfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiB9OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jbGFzc29iamVjdC5jIGIvT2JqZWN0cy9jbGFzc29iamVjdC5jCmluZGV4IDdkM2QwNDguLjhjMzM4MjMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY2xhc3NvYmplY3QuYworKysgYi9PYmplY3RzL2NsYXNzb2JqZWN0LmMKQEAgLTE4LDcgKzE4LDcgQEAKIAogLyogRm9yd2FyZCAqLwogc3RhdGljIFB5T2JqZWN0ICpjbGFzc19sb29rdXAoUHlDbGFzc09iamVjdCAqLCBQeU9iamVjdCAqLAotCQkJICAgICAgUHlDbGFzc09iamVjdCAqKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNsYXNzT2JqZWN0ICoqKTsKIHN0YXRpYyBQeU9iamVjdCAqaW5zdGFuY2VfZ2V0YXR0cjEoUHlJbnN0YW5jZU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBQeU9iamVjdCAqaW5zdGFuY2VfZ2V0YXR0cjIoUHlJbnN0YW5jZU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIApAQCAtMjksMTM5ICsyOSwxMzkgQEAKIFB5Q2xhc3NfTmV3KFB5T2JqZWN0ICpiYXNlcywgUHlPYmplY3QgKmRpY3QsIFB5T2JqZWN0ICpuYW1lKQogICAgICAvKiBiYXNlcyBpcyBOVUxMIG9yIHR1cGxlIG9mIGNsYXNzb2JqZWN0cyEgKi8KIHsKLQlQeUNsYXNzT2JqZWN0ICpvcCwgKmR1bW15OwotCXN0YXRpYyBQeU9iamVjdCAqZG9jc3RyLCAqbW9kc3RyLCAqbmFtZXN0cjsKLQlpZiAoZG9jc3RyID09IE5VTEwpIHsKLQkJZG9jc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RvY19fIik7Ci0JCWlmIChkb2NzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAobW9kc3RyID09IE5VTEwpIHsKLQkJbW9kc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX21vZHVsZV9fIik7Ci0JCWlmIChtb2RzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAobmFtZXN0ciA9PSBOVUxMKSB7Ci0JCW5hbWVzdHI9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbmFtZV9fIik7Ci0JCWlmIChuYW1lc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKG5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiUHlDbGFzc19OZXc6IG5hbWUgbXVzdCBiZSBhIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGRpY3QgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGRpY3QpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIlB5Q2xhc3NfTmV3OiBkaWN0IG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlEaWN0X0dldEl0ZW0oZGljdCwgZG9jc3RyKSA9PSBOVUxMKSB7Ci0JCWlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBkb2NzdHIsIFB5X05vbmUpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlEaWN0X0dldEl0ZW0oZGljdCwgbW9kc3RyKSA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKLQkJaWYgKGdsb2JhbHMgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKm1vZG5hbWUgPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBuYW1lc3RyKTsKLQkJCWlmIChtb2RuYW1lICE9IE5VTEwpIHsKLQkJCQlpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgbW9kc3RyLCBtb2RuYW1lKSA8IDApCi0JCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQotCWlmIChiYXNlcyA9PSBOVUxMKSB7Ci0JCWJhc2VzID0gUHlUdXBsZV9OZXcoMCk7Ci0JCWlmIChiYXNlcyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCQlQeV9zc2l6ZV90IGksIG47Ci0JCVB5T2JqZWN0ICpiYXNlOwotCQlpZiAoIVB5VHVwbGVfQ2hlY2soYmFzZXMpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiUHlDbGFzc19OZXc6IGJhc2VzIG11c3QgYmUgYSB0dXBsZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbiA9IFB5VHVwbGVfU2l6ZShiYXNlcyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWJhc2UgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJCWlmICghUHlDbGFzc19DaGVjayhiYXNlKSkgewotCQkJCWlmIChQeUNhbGxhYmxlX0NoZWNrKAotCQkJCQkoUHlPYmplY3QgKikgYmFzZS0+b2JfdHlwZSkpCi0JCQkJCXJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKAotCQkJCQkJKFB5T2JqZWN0ICopIGJhc2UtPm9iX3R5cGUsCi0JCQkJCQluYW1lLCBiYXNlcywgZGljdCwgTlVMTCk7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIlB5Q2xhc3NfTmV3OiBiYXNlIG11c3QgYmUgYSBjbGFzcyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JCVB5X0lOQ1JFRihiYXNlcyk7Ci0JfQorICAgIFB5Q2xhc3NPYmplY3QgKm9wLCAqZHVtbXk7CisgICAgc3RhdGljIFB5T2JqZWN0ICpkb2NzdHIsICptb2RzdHIsICpuYW1lc3RyOworICAgIGlmIChkb2NzdHIgPT0gTlVMTCkgeworICAgICAgICBkb2NzdHI9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZG9jX18iKTsKKyAgICAgICAgaWYgKGRvY3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChtb2RzdHIgPT0gTlVMTCkgeworICAgICAgICBtb2RzdHI9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbW9kdWxlX18iKTsKKyAgICAgICAgaWYgKG1vZHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuYW1lc3RyID09IE5VTEwpIHsKKyAgICAgICAgbmFtZXN0cj0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uYW1lX18iKTsKKyAgICAgICAgaWYgKG5hbWVzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlB5Q2xhc3NfTmV3OiBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChkaWN0ID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhkaWN0KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlB5Q2xhc3NfTmV3OiBkaWN0IG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlEaWN0X0dldEl0ZW0oZGljdCwgZG9jc3RyKSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBkb2NzdHIsIFB5X05vbmUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlEaWN0X0dldEl0ZW0oZGljdCwgbW9kc3RyKSA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKKyAgICAgICAgaWYgKGdsb2JhbHMgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKm1vZG5hbWUgPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBuYW1lc3RyKTsKKyAgICAgICAgICAgIGlmIChtb2RuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZGljdCwgbW9kc3RyLCBtb2RuYW1lKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChiYXNlcyA9PSBOVUxMKSB7CisgICAgICAgIGJhc2VzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGlmIChiYXNlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9zc2l6ZV90IGksIG47CisgICAgICAgIFB5T2JqZWN0ICpiYXNlOworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYmFzZXMpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeUNsYXNzX05ldzogYmFzZXMgbXVzdCBiZSBhIHR1cGxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBuID0gUHlUdXBsZV9TaXplKGJhc2VzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOworICAgICAgICAgICAgaWYgKCFQeUNsYXNzX0NoZWNrKGJhc2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2soCisgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKSBiYXNlLT5vYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKikgYmFzZS0+b2JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGJhc2VzLCBkaWN0LCBOVUxMKTsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiUHlDbGFzc19OZXc6IGJhc2UgbXVzdCBiZSBhIGNsYXNzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKGJhc2VzKTsKKyAgICB9CiAKLQlpZiAoZ2V0YXR0cnN0ciA9PSBOVUxMKSB7Ci0JCWdldGF0dHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGF0dHJfXyIpOwotCQlpZiAoZ2V0YXR0cnN0ciA9PSBOVUxMKQotCQkJZ290byBhbGxvY19lcnJvcjsKLQkJc2V0YXR0cnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc2V0YXR0cl9fIik7Ci0JCWlmIChzZXRhdHRyc3RyID09IE5VTEwpCi0JCQlnb3RvIGFsbG9jX2Vycm9yOwotCQlkZWxhdHRyc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxhdHRyX18iKTsKLQkJaWYgKGRlbGF0dHJzdHIgPT0gTlVMTCkKLQkJCWdvdG8gYWxsb2NfZXJyb3I7Ci0JfQorICAgIGlmIChnZXRhdHRyc3RyID09IE5VTEwpIHsKKyAgICAgICAgZ2V0YXR0cnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0YXR0cl9fIik7CisgICAgICAgIGlmIChnZXRhdHRyc3RyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGFsbG9jX2Vycm9yOworICAgICAgICBzZXRhdHRyc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRhdHRyX18iKTsKKyAgICAgICAgaWYgKHNldGF0dHJzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gYWxsb2NfZXJyb3I7CisgICAgICAgIGRlbGF0dHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbGF0dHJfXyIpOworICAgICAgICBpZiAoZGVsYXR0cnN0ciA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBhbGxvY19lcnJvcjsKKyAgICB9CiAKLQlvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUNsYXNzT2JqZWN0LCAmUHlDbGFzc19UeXBlKTsKLQlpZiAob3AgPT0gTlVMTCkgeworICAgIG9wID0gUHlPYmplY3RfR0NfTmV3KFB5Q2xhc3NPYmplY3QsICZQeUNsYXNzX1R5cGUpOworICAgIGlmIChvcCA9PSBOVUxMKSB7CiBhbGxvY19lcnJvcjoKLQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9wLT5jbF9iYXNlcyA9IGJhc2VzOwotCVB5X0lOQ1JFRihkaWN0KTsKLQlvcC0+Y2xfZGljdCA9IGRpY3Q7Ci0JUHlfWElOQ1JFRihuYW1lKTsKLQlvcC0+Y2xfbmFtZSA9IG5hbWU7CisgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvcC0+Y2xfYmFzZXMgPSBiYXNlczsKKyAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgb3AtPmNsX2RpY3QgPSBkaWN0OworICAgIFB5X1hJTkNSRUYobmFtZSk7CisgICAgb3AtPmNsX25hbWUgPSBuYW1lOwogCi0Jb3AtPmNsX2dldGF0dHIgPSBjbGFzc19sb29rdXAob3AsIGdldGF0dHJzdHIsICZkdW1teSk7Ci0Jb3AtPmNsX3NldGF0dHIgPSBjbGFzc19sb29rdXAob3AsIHNldGF0dHJzdHIsICZkdW1teSk7Ci0Jb3AtPmNsX2RlbGF0dHIgPSBjbGFzc19sb29rdXAob3AsIGRlbGF0dHJzdHIsICZkdW1teSk7Ci0JUHlfWElOQ1JFRihvcC0+Y2xfZ2V0YXR0cik7Ci0JUHlfWElOQ1JFRihvcC0+Y2xfc2V0YXR0cik7Ci0JUHlfWElOQ1JFRihvcC0+Y2xfZGVsYXR0cik7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKG9wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIG9wLT5jbF9nZXRhdHRyID0gY2xhc3NfbG9va3VwKG9wLCBnZXRhdHRyc3RyLCAmZHVtbXkpOworICAgIG9wLT5jbF9zZXRhdHRyID0gY2xhc3NfbG9va3VwKG9wLCBzZXRhdHRyc3RyLCAmZHVtbXkpOworICAgIG9wLT5jbF9kZWxhdHRyID0gY2xhc3NfbG9va3VwKG9wLCBkZWxhdHRyc3RyLCAmZHVtbXkpOworICAgIFB5X1hJTkNSRUYob3AtPmNsX2dldGF0dHIpOworICAgIFB5X1hJTkNSRUYob3AtPmNsX3NldGF0dHIpOworICAgIFB5X1hJTkNSRUYob3AtPmNsX2RlbGF0dHIpOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogUHlPYmplY3QgKgogUHlNZXRob2RfRnVuY3Rpb24oUHlPYmplY3QgKmltKQogewotCWlmICghUHlNZXRob2RfQ2hlY2soaW0pKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlNZXRob2RPYmplY3QgKilpbSktPmltX2Z1bmM7CisgICAgaWYgKCFQeU1ldGhvZF9DaGVjayhpbSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeU1ldGhvZE9iamVjdCAqKWltKS0+aW1fZnVuYzsKIH0KIAogUHlPYmplY3QgKgogUHlNZXRob2RfU2VsZihQeU9iamVjdCAqaW0pCiB7Ci0JaWYgKCFQeU1ldGhvZF9DaGVjayhpbSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeU1ldGhvZE9iamVjdCAqKWltKS0+aW1fc2VsZjsKKyAgICBpZiAoIVB5TWV0aG9kX0NoZWNrKGltKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5TWV0aG9kT2JqZWN0ICopaW0pLT5pbV9zZWxmOwogfQogCiBQeU9iamVjdCAqCiBQeU1ldGhvZF9DbGFzcyhQeU9iamVjdCAqaW0pCiB7Ci0JaWYgKCFQeU1ldGhvZF9DaGVjayhpbSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeU1ldGhvZE9iamVjdCAqKWltKS0+aW1fY2xhc3M7CisgICAgaWYgKCFQeU1ldGhvZF9DaGVjayhpbSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeU1ldGhvZE9iamVjdCAqKWltKS0+aW1fY2xhc3M7CiB9CiAKIFB5RG9jX1NUUlZBUihjbGFzc19kb2MsCkBAIC0xNzMsMTMgKzE3MywxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNsYXNzX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqbmFtZSwgKmJhc2VzLCAqZGljdDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im5hbWUiLCAiYmFzZXMiLCAiZGljdCIsIDB9OworICAgIFB5T2JqZWN0ICpuYW1lLCAqYmFzZXMsICpkaWN0OworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJiYXNlcyIsICJkaWN0IiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiU09PIiwga3dsaXN0LAotCQkJCQkgJm5hbWUsICZiYXNlcywgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlDbGFzc19OZXcoYmFzZXMsIGRpY3QsIG5hbWUpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJTT08iLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsICZiYXNlcywgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlDbGFzc19OZXcoYmFzZXMsIGRpY3QsIG5hbWUpOwogfQogCiAvKiBDbGFzcyBtZXRob2RzICovCkBAIC0xODcsMzEzICsxODcsMzEzIEBACiBzdGF0aWMgdm9pZAogY2xhc3NfZGVhbGxvYyhQeUNsYXNzT2JqZWN0ICpvcCkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhvcCk7Ci0JUHlfREVDUkVGKG9wLT5jbF9iYXNlcyk7Ci0JUHlfREVDUkVGKG9wLT5jbF9kaWN0KTsKLQlQeV9YREVDUkVGKG9wLT5jbF9uYW1lKTsKLQlQeV9YREVDUkVGKG9wLT5jbF9nZXRhdHRyKTsKLQlQeV9YREVDUkVGKG9wLT5jbF9zZXRhdHRyKTsKLQlQeV9YREVDUkVGKG9wLT5jbF9kZWxhdHRyKTsKLQlQeU9iamVjdF9HQ19EZWwob3ApOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKG9wKTsKKyAgICBQeV9ERUNSRUYob3AtPmNsX2Jhc2VzKTsKKyAgICBQeV9ERUNSRUYob3AtPmNsX2RpY3QpOworICAgIFB5X1hERUNSRUYob3AtPmNsX25hbWUpOworICAgIFB5X1hERUNSRUYob3AtPmNsX2dldGF0dHIpOworICAgIFB5X1hERUNSRUYob3AtPmNsX3NldGF0dHIpOworICAgIFB5X1hERUNSRUYob3AtPmNsX2RlbGF0dHIpOworICAgIFB5T2JqZWN0X0dDX0RlbChvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGFzc19sb29rdXAoUHlDbGFzc09iamVjdCAqY3AsIFB5T2JqZWN0ICpuYW1lLCBQeUNsYXNzT2JqZWN0ICoqcGNsYXNzKQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqdmFsdWUgPSBQeURpY3RfR2V0SXRlbShjcC0+Y2xfZGljdCwgbmFtZSk7Ci0JaWYgKHZhbHVlICE9IE5VTEwpIHsKLQkJKnBjbGFzcyA9IGNwOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCW4gPSBQeVR1cGxlX1NpemUoY3AtPmNsX2Jhc2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCS8qIFhYWCBXaGF0IGlmIG9uZSBvZiB0aGUgYmFzZXMgaXMgbm90IGEgY2xhc3M/ICovCi0JCVB5T2JqZWN0ICp2ID0gY2xhc3NfbG9va3VwKAotCQkJKFB5Q2xhc3NPYmplY3QgKikKLQkJCVB5VHVwbGVfR2V0SXRlbShjcC0+Y2xfYmFzZXMsIGkpLCBuYW1lLCBwY2xhc3MpOwotCQlpZiAodiAhPSBOVUxMKQotCQkJcmV0dXJuIHY7Ci0JfQotCXJldHVybiBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSBQeURpY3RfR2V0SXRlbShjcC0+Y2xfZGljdCwgbmFtZSk7CisgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgKnBjbGFzcyA9IGNwOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorICAgIG4gPSBQeVR1cGxlX1NpemUoY3AtPmNsX2Jhc2VzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIC8qIFhYWCBXaGF0IGlmIG9uZSBvZiB0aGUgYmFzZXMgaXMgbm90IGEgY2xhc3M/ICovCisgICAgICAgIFB5T2JqZWN0ICp2ID0gY2xhc3NfbG9va3VwKAorICAgICAgICAgICAgKFB5Q2xhc3NPYmplY3QgKikKKyAgICAgICAgICAgIFB5VHVwbGVfR2V0SXRlbShjcC0+Y2xfYmFzZXMsIGkpLCBuYW1lLCBwY2xhc3MpOworICAgICAgICBpZiAodiAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xhc3NfZ2V0YXR0cihyZWdpc3RlciBQeUNsYXNzT2JqZWN0ICpvcCwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKnY7Ci0JcmVnaXN0ZXIgY2hhciAqc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKLQlQeUNsYXNzT2JqZWN0ICprbGFzczsKLQlkZXNjcmdldGZ1bmMgZjsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqdjsKKyAgICByZWdpc3RlciBjaGFyICpzbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOworICAgIFB5Q2xhc3NPYmplY3QgKmtsYXNzOworICAgIGRlc2NyZ2V0ZnVuYyBmOwogCi0JaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKLQkJaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkgewotCQkJaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgImNsYXNzLl9fZGljdF9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlfSU5DUkVGKG9wLT5jbF9kaWN0KTsKLQkJCXJldHVybiBvcC0+Y2xfZGljdDsKLQkJfQotCQlpZiAoc3RyY21wKHNuYW1lLCAiX19iYXNlc19fIikgPT0gMCkgewotCQkJUHlfSU5DUkVGKG9wLT5jbF9iYXNlcyk7Ci0JCQlyZXR1cm4gb3AtPmNsX2Jhc2VzOwotCQl9Ci0JCWlmIChzdHJjbXAoc25hbWUsICJfX25hbWVfXyIpID09IDApIHsKLQkJCWlmIChvcC0+Y2xfbmFtZSA9PSBOVUxMKQotCQkJCXYgPSBQeV9Ob25lOwotCQkJZWxzZQotCQkJCXYgPSBvcC0+Y2xfbmFtZTsKLQkJCVB5X0lOQ1JFRih2KTsKLQkJCXJldHVybiB2OwotCQl9Ci0JfQotCXYgPSBjbGFzc19sb29rdXAob3AsIG5hbWUsICZrbGFzcyk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkgICAgICJjbGFzcyAlLjUwcyBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKLQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG9wLT5jbF9uYW1lKSwgc25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZiA9IFRQX0RFU0NSX0dFVCh2LT5vYl90eXBlKTsKLQlpZiAoZiA9PSBOVUxMKQotCQlQeV9JTkNSRUYodik7Ci0JZWxzZQotCQl2ID0gZih2LCAoUHlPYmplY3QgKilOVUxMLCAoUHlPYmplY3QgKilvcCk7Ci0JcmV0dXJuIHY7CisgICAgaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKKyAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkgeworICAgICAgICAgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgImNsYXNzLl9fZGljdF9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfSU5DUkVGKG9wLT5jbF9kaWN0KTsKKyAgICAgICAgICAgIHJldHVybiBvcC0+Y2xfZGljdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKHNuYW1lLCAiX19iYXNlc19fIikgPT0gMCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKG9wLT5jbF9iYXNlcyk7CisgICAgICAgICAgICByZXR1cm4gb3AtPmNsX2Jhc2VzOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJjbXAoc25hbWUsICJfX25hbWVfXyIpID09IDApIHsKKyAgICAgICAgICAgIGlmIChvcC0+Y2xfbmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHYgPSBQeV9Ob25lOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYgPSBvcC0+Y2xfbmFtZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorICAgIHYgPSBjbGFzc19sb29rdXAob3AsIG5hbWUsICZrbGFzcyk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgJS41MHMgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcob3AtPmNsX25hbWUpLCBzbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmID0gVFBfREVTQ1JfR0VUKHYtPm9iX3R5cGUpOworICAgIGlmIChmID09IE5VTEwpCisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICBlbHNlCisgICAgICAgIHYgPSBmKHYsIChQeU9iamVjdCAqKU5VTEwsIChQeU9iamVjdCAqKW9wKTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIHZvaWQKIHNldF9zbG90KFB5T2JqZWN0ICoqc2xvdCwgUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKnRlbXAgPSAqc2xvdDsKLQlQeV9YSU5DUkVGKHYpOwotCSpzbG90ID0gdjsKLQlQeV9YREVDUkVGKHRlbXApOworICAgIFB5T2JqZWN0ICp0ZW1wID0gKnNsb3Q7CisgICAgUHlfWElOQ1JFRih2KTsKKyAgICAqc2xvdCA9IHY7CisgICAgUHlfWERFQ1JFRih0ZW1wKTsKIH0KIAogc3RhdGljIHZvaWQKIHNldF9hdHRyX3Nsb3RzKFB5Q2xhc3NPYmplY3QgKmMpCiB7Ci0JUHlDbGFzc09iamVjdCAqZHVtbXk7CisgICAgUHlDbGFzc09iamVjdCAqZHVtbXk7CiAKLQlzZXRfc2xvdCgmYy0+Y2xfZ2V0YXR0ciwgY2xhc3NfbG9va3VwKGMsIGdldGF0dHJzdHIsICZkdW1teSkpOwotCXNldF9zbG90KCZjLT5jbF9zZXRhdHRyLCBjbGFzc19sb29rdXAoYywgc2V0YXR0cnN0ciwgJmR1bW15KSk7Ci0Jc2V0X3Nsb3QoJmMtPmNsX2RlbGF0dHIsIGNsYXNzX2xvb2t1cChjLCBkZWxhdHRyc3RyLCAmZHVtbXkpKTsKKyAgICBzZXRfc2xvdCgmYy0+Y2xfZ2V0YXR0ciwgY2xhc3NfbG9va3VwKGMsIGdldGF0dHJzdHIsICZkdW1teSkpOworICAgIHNldF9zbG90KCZjLT5jbF9zZXRhdHRyLCBjbGFzc19sb29rdXAoYywgc2V0YXR0cnN0ciwgJmR1bW15KSk7CisgICAgc2V0X3Nsb3QoJmMtPmNsX2RlbGF0dHIsIGNsYXNzX2xvb2t1cChjLCBkZWxhdHRyc3RyLCAmZHVtbXkpKTsKIH0KIAogc3RhdGljIGNoYXIgKgogc2V0X2RpY3QoUHlDbGFzc09iamVjdCAqYywgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKHYgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKHYpKQotCQlyZXR1cm4gIl9fZGljdF9fIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9iamVjdCI7Ci0Jc2V0X3Nsb3QoJmMtPmNsX2RpY3QsIHYpOwotCXNldF9hdHRyX3Nsb3RzKGMpOwotCXJldHVybiAiIjsKKyAgICBpZiAodiA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2sodikpCisgICAgICAgIHJldHVybiAiX19kaWN0X18gbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2JqZWN0IjsKKyAgICBzZXRfc2xvdCgmYy0+Y2xfZGljdCwgdik7CisgICAgc2V0X2F0dHJfc2xvdHMoYyk7CisgICAgcmV0dXJuICIiOwogfQogCiBzdGF0aWMgY2hhciAqCiBzZXRfYmFzZXMoUHlDbGFzc09iamVjdCAqYywgUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWlmICh2ID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2sodikpCi0JCXJldHVybiAiX19iYXNlc19fIG11c3QgYmUgYSB0dXBsZSBvYmplY3QiOwotCW4gPSBQeVR1cGxlX1NpemUodik7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqeCA9IFB5VHVwbGVfR0VUX0lURU0odiwgaSk7Ci0JCWlmICghUHlDbGFzc19DaGVjayh4KSkKLQkJCXJldHVybiAiX19iYXNlc19fIGl0ZW1zIG11c3QgYmUgY2xhc3NlcyI7Ci0JCWlmIChQeUNsYXNzX0lzU3ViY2xhc3MoeCwgKFB5T2JqZWN0ICopYykpCi0JCQlyZXR1cm4gImEgX19iYXNlc19fIGl0ZW0gY2F1c2VzIGFuIGluaGVyaXRhbmNlIGN5Y2xlIjsKLQl9Ci0Jc2V0X3Nsb3QoJmMtPmNsX2Jhc2VzLCB2KTsKLQlzZXRfYXR0cl9zbG90cyhjKTsKLQlyZXR1cm4gIiI7CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayh2KSkKKyAgICAgICAgcmV0dXJuICJfX2Jhc2VzX18gbXVzdCBiZSBhIHR1cGxlIG9iamVjdCI7CisgICAgbiA9IFB5VHVwbGVfU2l6ZSh2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp4ID0gUHlUdXBsZV9HRVRfSVRFTSh2LCBpKTsKKyAgICAgICAgaWYgKCFQeUNsYXNzX0NoZWNrKHgpKQorICAgICAgICAgICAgcmV0dXJuICJfX2Jhc2VzX18gaXRlbXMgbXVzdCBiZSBjbGFzc2VzIjsKKyAgICAgICAgaWYgKFB5Q2xhc3NfSXNTdWJjbGFzcyh4LCAoUHlPYmplY3QgKiljKSkKKyAgICAgICAgICAgIHJldHVybiAiYSBfX2Jhc2VzX18gaXRlbSBjYXVzZXMgYW4gaW5oZXJpdGFuY2UgY3ljbGUiOworICAgIH0KKyAgICBzZXRfc2xvdCgmYy0+Y2xfYmFzZXMsIHYpOworICAgIHNldF9hdHRyX3Nsb3RzKGMpOworICAgIHJldHVybiAiIjsKIH0KIAogc3RhdGljIGNoYXIgKgogc2V0X25hbWUoUHlDbGFzc09iamVjdCAqYywgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKHYgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sodikpCi0JCXJldHVybiAiX19uYW1lX18gbXVzdCBiZSBhIHN0cmluZyBvYmplY3QiOwotCWlmIChzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHYpKSAhPSAoc2l6ZV90KVB5U3RyaW5nX0dFVF9TSVpFKHYpKQotCQlyZXR1cm4gIl9fbmFtZV9fIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyI7Ci0Jc2V0X3Nsb3QoJmMtPmNsX25hbWUsIHYpOwotCXJldHVybiAiIjsKKyAgICBpZiAodiA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayh2KSkKKyAgICAgICAgcmV0dXJuICJfX25hbWVfXyBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdCI7CisgICAgaWYgKHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcodikpICE9IChzaXplX3QpUHlTdHJpbmdfR0VUX1NJWkUodikpCisgICAgICAgIHJldHVybiAiX19uYW1lX18gbXVzdCBub3QgY29udGFpbiBudWxsIGJ5dGVzIjsKKyAgICBzZXRfc2xvdCgmYy0+Y2xfbmFtZSwgdik7CisgICAgcmV0dXJuICIiOwogfQogCiBzdGF0aWMgaW50CiBjbGFzc19zZXRhdHRyKFB5Q2xhc3NPYmplY3QgKm9wLCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JY2hhciAqc25hbWU7Ci0JaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJjbGFzc2VzIGFyZSByZWFkLW9ubHkgaW4gcmVzdHJpY3RlZCBtb2RlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKLQlpZiAoc25hbWVbMF0gPT0gJ18nICYmIHNuYW1lWzFdID09ICdfJykgewotCQlQeV9zc2l6ZV90IG4gPSBQeVN0cmluZ19TaXplKG5hbWUpOwotCQlpZiAoc25hbWVbbi0xXSA9PSAnXycgJiYgc25hbWVbbi0yXSA9PSAnXycpIHsKLQkJCWNoYXIgKmVyciA9IE5VTEw7Ci0JCQlpZiAoc3RyY21wKHNuYW1lLCAiX19kaWN0X18iKSA9PSAwKQotCQkJCWVyciA9IHNldF9kaWN0KG9wLCB2KTsKLQkJCWVsc2UgaWYgKHN0cmNtcChzbmFtZSwgIl9fYmFzZXNfXyIpID09IDApCi0JCQkJZXJyID0gc2V0X2Jhc2VzKG9wLCB2KTsKLQkJCWVsc2UgaWYgKHN0cmNtcChzbmFtZSwgIl9fbmFtZV9fIikgPT0gMCkKLQkJCQllcnIgPSBzZXRfbmFtZShvcCwgdik7Ci0JCQllbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX2dldGF0dHJfXyIpID09IDApCi0JCQkJc2V0X3Nsb3QoJm9wLT5jbF9nZXRhdHRyLCB2KTsKLQkJCWVsc2UgaWYgKHN0cmNtcChzbmFtZSwgIl9fc2V0YXR0cl9fIikgPT0gMCkKLQkJCQlzZXRfc2xvdCgmb3AtPmNsX3NldGF0dHIsIHYpOwotCQkJZWxzZSBpZiAoc3RyY21wKHNuYW1lLCAiX19kZWxhdHRyX18iKSA9PSAwKQotCQkJCXNldF9zbG90KCZvcC0+Y2xfZGVsYXR0ciwgdik7Ci0JCQkvKiBGb3IgdGhlIGxhc3QgdGhyZWUsIHdlIGZhbGwgdGhyb3VnaCB0byB1cGRhdGUgdGhlCi0JCQkgICBkaWN0aW9uYXJ5IGFzIHdlbGwuICovCi0JCQlpZiAoZXJyICE9IE5VTEwpIHsKLQkJCQlpZiAoKmVyciA9PSAnXDAnKQotCQkJCQlyZXR1cm4gMDsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBlcnIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCX0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCWludCBydiA9IFB5RGljdF9EZWxJdGVtKG9wLT5jbF9kaWN0LCBuYW1lKTsKLQkJaWYgKHJ2IDwgMCkKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkgICAgICJjbGFzcyAlLjUwcyBoYXMgbm8gYXR0cmlidXRlICclLjQwMHMnIiwKLQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhvcC0+Y2xfbmFtZSksIHNuYW1lKTsKLQkJcmV0dXJuIHJ2OwotCX0KLQllbHNlCi0JCXJldHVybiBQeURpY3RfU2V0SXRlbShvcC0+Y2xfZGljdCwgbmFtZSwgdik7CisgICAgY2hhciAqc25hbWU7CisgICAgaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiY2xhc3NlcyBhcmUgcmVhZC1vbmx5IGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7CisgICAgaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKKyAgICAgICAgUHlfc3NpemVfdCBuID0gUHlTdHJpbmdfU2l6ZShuYW1lKTsKKyAgICAgICAgaWYgKHNuYW1lW24tMV0gPT0gJ18nICYmIHNuYW1lW24tMl0gPT0gJ18nKSB7CisgICAgICAgICAgICBjaGFyICplcnIgPSBOVUxMOworICAgICAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkKKyAgICAgICAgICAgICAgICBlcnIgPSBzZXRfZGljdChvcCwgdik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX2Jhc2VzX18iKSA9PSAwKQorICAgICAgICAgICAgICAgIGVyciA9IHNldF9iYXNlcyhvcCwgdik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX25hbWVfXyIpID09IDApCisgICAgICAgICAgICAgICAgZXJyID0gc2V0X25hbWUob3AsIHYpOworICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKHNuYW1lLCAiX19nZXRhdHRyX18iKSA9PSAwKQorICAgICAgICAgICAgICAgIHNldF9zbG90KCZvcC0+Y2xfZ2V0YXR0ciwgdik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAoc25hbWUsICJfX3NldGF0dHJfXyIpID09IDApCisgICAgICAgICAgICAgICAgc2V0X3Nsb3QoJm9wLT5jbF9zZXRhdHRyLCB2KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGVsYXR0cl9fIikgPT0gMCkKKyAgICAgICAgICAgICAgICBzZXRfc2xvdCgmb3AtPmNsX2RlbGF0dHIsIHYpOworICAgICAgICAgICAgLyogRm9yIHRoZSBsYXN0IHRocmVlLCB3ZSBmYWxsIHRocm91Z2ggdG8gdXBkYXRlIHRoZQorICAgICAgICAgICAgICAgZGljdGlvbmFyeSBhcyB3ZWxsLiAqLworICAgICAgICAgICAgaWYgKGVyciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKCplcnIgPT0gJ1wwJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBpbnQgcnYgPSBQeURpY3RfRGVsSXRlbShvcC0+Y2xfZGljdCwgbmFtZSk7CisgICAgICAgIGlmIChydiA8IDApCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzICUuNTBzIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhvcC0+Y2xfbmFtZSksIHNuYW1lKTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeURpY3RfU2V0SXRlbShvcC0+Y2xfZGljdCwgbmFtZSwgdik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGFzc19yZXByKFB5Q2xhc3NPYmplY3QgKm9wKQogewotCVB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhvcC0+Y2xfZGljdCwgIl9fbW9kdWxlX18iKTsKLQljaGFyICpuYW1lOwotCWlmIChvcC0+Y2xfbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhvcC0+Y2xfbmFtZSkpCi0JCW5hbWUgPSAiPyI7Ci0JZWxzZQotCQluYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcob3AtPmNsX25hbWUpOwotCWlmIChtb2QgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobW9kKSkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxjbGFzcyA/LiVzIGF0ICVwPiIsIG5hbWUsIG9wKTsKLQllbHNlCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Y2xhc3MgJXMuJXMgYXQgJXA+IiwKLQkJCQkJICAgUHlTdHJpbmdfQXNTdHJpbmcobW9kKSwKLQkJCQkJICAgbmFtZSwgb3ApOworICAgIFB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhvcC0+Y2xfZGljdCwgIl9fbW9kdWxlX18iKTsKKyAgICBjaGFyICpuYW1lOworICAgIGlmIChvcC0+Y2xfbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhvcC0+Y2xfbmFtZSkpCisgICAgICAgIG5hbWUgPSAiPyI7CisgICAgZWxzZQorICAgICAgICBuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcob3AtPmNsX25hbWUpOworICAgIGlmIChtb2QgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobW9kKSkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxjbGFzcyA/LiVzIGF0ICVwPiIsIG5hbWUsIG9wKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Y2xhc3MgJXMuJXMgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcobW9kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgb3ApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xhc3Nfc3RyKFB5Q2xhc3NPYmplY3QgKm9wKQogewotCVB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhvcC0+Y2xfZGljdCwgIl9fbW9kdWxlX18iKTsKLQlQeU9iamVjdCAqbmFtZSA9IG9wLT5jbF9uYW1lOwotCVB5T2JqZWN0ICpyZXM7Ci0JUHlfc3NpemVfdCBtLCBuOworICAgIFB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhvcC0+Y2xfZGljdCwgIl9fbW9kdWxlX18iKTsKKyAgICBQeU9iamVjdCAqbmFtZSA9IG9wLT5jbF9uYW1lOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgUHlfc3NpemVfdCBtLCBuOwogCi0JaWYgKG5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobmFtZSkpCi0JCXJldHVybiBjbGFzc19yZXByKG9wKTsKLQlpZiAobW9kID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZCkpIHsKLQkJUHlfSU5DUkVGKG5hbWUpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JbSA9IFB5U3RyaW5nX0dFVF9TSVpFKG1vZCk7Ci0JbiA9IFB5U3RyaW5nX0dFVF9TSVpFKG5hbWUpOwotCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbSsxK24pOwotCWlmIChyZXMgIT0gTlVMTCkgewotCQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlcyk7Ci0JCW1lbWNweShzLCBQeVN0cmluZ19BU19TVFJJTkcobW9kKSwgbSk7Ci0JCXMgKz0gbTsKLQkJKnMrKyA9ICcuJzsKLQkJbWVtY3B5KHMsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgbik7Ci0JfQotCXJldHVybiByZXM7CisgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobmFtZSkpCisgICAgICAgIHJldHVybiBjbGFzc19yZXByKG9wKTsKKyAgICBpZiAobW9kID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKG5hbWUpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisgICAgbSA9IFB5U3RyaW5nX0dFVF9TSVpFKG1vZCk7CisgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKG5hbWUpOworICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbSsxK24pOworICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlcyk7CisgICAgICAgIG1lbWNweShzLCBQeVN0cmluZ19BU19TVFJJTkcobW9kKSwgbSk7CisgICAgICAgIHMgKz0gbTsKKyAgICAgICAgKnMrKyA9ICcuJzsKKyAgICAgICAgbWVtY3B5KHMsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgbik7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQKIGNsYXNzX3RyYXZlcnNlKFB5Q2xhc3NPYmplY3QgKm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKG8tPmNsX2Jhc2VzKTsKLQlQeV9WSVNJVChvLT5jbF9kaWN0KTsKLQlQeV9WSVNJVChvLT5jbF9uYW1lKTsKLQlQeV9WSVNJVChvLT5jbF9nZXRhdHRyKTsKLQlQeV9WSVNJVChvLT5jbF9zZXRhdHRyKTsKLQlQeV9WSVNJVChvLT5jbF9kZWxhdHRyKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChvLT5jbF9iYXNlcyk7CisgICAgUHlfVklTSVQoby0+Y2xfZGljdCk7CisgICAgUHlfVklTSVQoby0+Y2xfbmFtZSk7CisgICAgUHlfVklTSVQoby0+Y2xfZ2V0YXR0cik7CisgICAgUHlfVklTSVQoby0+Y2xfc2V0YXR0cik7CisgICAgUHlfVklTSVQoby0+Y2xfZGVsYXR0cik7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5VHlwZU9iamVjdCBQeUNsYXNzX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAotCSJjbGFzc29iaiIsCi0Jc2l6ZW9mKFB5Q2xhc3NPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpY2xhc3NfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpY2xhc3NfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQlQeUluc3RhbmNlX05ldywJCQkJLyogdHBfY2FsbCAqLwotCShyZXByZnVuYyljbGFzc19zdHIsCQkJLyogdHBfc3RyICovCi0JKGdldGF0dHJvZnVuYyljbGFzc19nZXRhdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkoc2V0YXR0cm9mdW5jKWNsYXNzX3NldGF0dHIsCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQljbGFzc19kb2MsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY2xhc3NfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWNsYXNzX25ldywJCQkJLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLAorICAgICJjbGFzc29iaiIsCisgICAgc2l6ZW9mKFB5Q2xhc3NPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpY2xhc3NfZGVhbGxvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyljbGFzc19yZXByLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIFB5SW5zdGFuY2VfTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYyljbGFzc19zdHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgKGdldGF0dHJvZnVuYyljbGFzc19nZXRhdHRyLCAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIChzZXRhdHRyb2Z1bmMpY2xhc3Nfc2V0YXR0ciwgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIGNsYXNzX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyljbGFzc190cmF2ZXJzZSwgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgY2xhc3NfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIGludAogUHlDbGFzc19Jc1N1YmNsYXNzKFB5T2JqZWN0ICprbGFzcywgUHlPYmplY3QgKmJhc2UpCiB7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5Q2xhc3NPYmplY3QgKmNwOwotCWlmIChrbGFzcyA9PSBiYXNlKQotCQlyZXR1cm4gMTsKLQlpZiAoUHlUdXBsZV9DaGVjayhiYXNlKSkgewotCQluID0gUHlUdXBsZV9HRVRfU0laRShiYXNlKTsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJaWYgKFB5Q2xhc3NfSXNTdWJjbGFzcyhrbGFzcywgUHlUdXBsZV9HRVRfSVRFTShiYXNlLCBpKSkpCi0JCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChrbGFzcyA9PSBOVUxMIHx8ICFQeUNsYXNzX0NoZWNrKGtsYXNzKSkKLQkJcmV0dXJuIDA7Ci0JY3AgPSAoUHlDbGFzc09iamVjdCAqKWtsYXNzOwotCW4gPSBQeVR1cGxlX1NpemUoY3AtPmNsX2Jhc2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWlmIChQeUNsYXNzX0lzU3ViY2xhc3MoUHlUdXBsZV9HZXRJdGVtKGNwLT5jbF9iYXNlcywgaSksIGJhc2UpKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeUNsYXNzT2JqZWN0ICpjcDsKKyAgICBpZiAoa2xhc3MgPT0gYmFzZSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soYmFzZSkpIHsKKyAgICAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQeUNsYXNzX0lzU3ViY2xhc3Moa2xhc3MsIFB5VHVwbGVfR0VUX0lURU0oYmFzZSwgaSkpKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoa2xhc3MgPT0gTlVMTCB8fCAhUHlDbGFzc19DaGVjayhrbGFzcykpCisgICAgICAgIHJldHVybiAwOworICAgIGNwID0gKFB5Q2xhc3NPYmplY3QgKilrbGFzczsKKyAgICBuID0gUHlUdXBsZV9TaXplKGNwLT5jbF9iYXNlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpZiAoUHlDbGFzc19Jc1N1YmNsYXNzKFB5VHVwbGVfR2V0SXRlbShjcC0+Y2xfYmFzZXMsIGkpLCBiYXNlKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC01MDIsODYgKzUwMiw4NiBAQAogUHlPYmplY3QgKgogUHlJbnN0YW5jZV9OZXdSYXcoUHlPYmplY3QgKmtsYXNzLCBQeU9iamVjdCAqZGljdCkKIHsKLQlQeUluc3RhbmNlT2JqZWN0ICppbnN0OworICAgIFB5SW5zdGFuY2VPYmplY3QgKmluc3Q7CiAKLQlpZiAoIVB5Q2xhc3NfQ2hlY2soa2xhc3MpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlkaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAoZGljdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCQlpZiAoIVB5RGljdF9DaGVjayhkaWN0KSkgewotCQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9JTkNSRUYoZGljdCk7Ci0JfQotCWluc3QgPSBQeU9iamVjdF9HQ19OZXcoUHlJbnN0YW5jZU9iamVjdCwgJlB5SW5zdGFuY2VfVHlwZSk7Ci0JaWYgKGluc3QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoZGljdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpbnN0LT5pbl93ZWFrcmVmbGlzdCA9IE5VTEw7Ci0JUHlfSU5DUkVGKGtsYXNzKTsKLQlpbnN0LT5pbl9jbGFzcyA9IChQeUNsYXNzT2JqZWN0ICopa2xhc3M7Ci0JaW5zdC0+aW5fZGljdCA9IGRpY3Q7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGluc3QpOwotCXJldHVybiAoUHlPYmplY3QgKilpbnN0OworICAgIGlmICghUHlDbGFzc19DaGVjayhrbGFzcykpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghUHlEaWN0X0NoZWNrKGRpY3QpKSB7CisgICAgICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICB9CisgICAgaW5zdCA9IFB5T2JqZWN0X0dDX05ldyhQeUluc3RhbmNlT2JqZWN0LCAmUHlJbnN0YW5jZV9UeXBlKTsKKyAgICBpZiAoaW5zdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGluc3QtPmluX3dlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICBQeV9JTkNSRUYoa2xhc3MpOworICAgIGluc3QtPmluX2NsYXNzID0gKFB5Q2xhc3NPYmplY3QgKilrbGFzczsKKyAgICBpbnN0LT5pbl9kaWN0ID0gZGljdDsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soaW5zdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWluc3Q7CiB9CiAKIFB5T2JqZWN0ICoKIFB5SW5zdGFuY2VfTmV3KFB5T2JqZWN0ICprbGFzcywgUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKmt3KQogewotCXJlZ2lzdGVyIFB5SW5zdGFuY2VPYmplY3QgKmluc3Q7Ci0JUHlPYmplY3QgKmluaXQ7Ci0Jc3RhdGljIFB5T2JqZWN0ICppbml0c3RyOworICAgIHJlZ2lzdGVyIFB5SW5zdGFuY2VPYmplY3QgKmluc3Q7CisgICAgUHlPYmplY3QgKmluaXQ7CisgICAgc3RhdGljIFB5T2JqZWN0ICppbml0c3RyOwogCi0JaWYgKGluaXRzdHIgPT0gTlVMTCkgewotCQlpbml0c3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbml0X18iKTsKLQkJaWYgKGluaXRzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpbnN0ID0gKFB5SW5zdGFuY2VPYmplY3QgKikgUHlJbnN0YW5jZV9OZXdSYXcoa2xhc3MsIE5VTEwpOwotCWlmIChpbnN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWluaXQgPSBpbnN0YW5jZV9nZXRhdHRyMihpbnN0LCBpbml0c3RyKTsKLQlpZiAoaW5pdCA9PSBOVUxMKSB7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeV9ERUNSRUYoaW5zdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoKGFyZyAhPSBOVUxMICYmICghUHlUdXBsZV9DaGVjayhhcmcpIHx8Ci0JCQkJICAgICBQeVR1cGxlX1NpemUoYXJnKSAhPSAwKSkKLQkJICAgIHx8IChrdyAhPSBOVUxMICYmICghUHlEaWN0X0NoZWNrKGt3KSB8fAotCQkJCSAgICAgIFB5RGljdF9TaXplKGt3KSAhPSAwKSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgInRoaXMgY29uc3RydWN0b3IgdGFrZXMgbm8gYXJndW1lbnRzIik7Ci0JCQlQeV9ERUNSRUYoaW5zdCk7Ci0JCQlpbnN0ID0gTlVMTDsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlPYmplY3QgKnJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGluaXQsIGFyZywga3cpOwotCQlQeV9ERUNSRUYoaW5pdCk7Ci0JCWlmIChyZXMgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGluc3QpOwotCQkJaW5zdCA9IE5VTEw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocmVzICE9IFB5X05vbmUpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgICAiX19pbml0X18oKSBzaG91bGQgcmV0dXJuIE5vbmUiKTsKLQkJCQlQeV9ERUNSRUYoaW5zdCk7Ci0JCQkJaW5zdCA9IE5VTEw7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopaW5zdDsKKyAgICBpZiAoaW5pdHN0ciA9PSBOVUxMKSB7CisgICAgICAgIGluaXRzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2luaXRfXyIpOworICAgICAgICBpZiAoaW5pdHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGluc3QgPSAoUHlJbnN0YW5jZU9iamVjdCAqKSBQeUluc3RhbmNlX05ld1JhdyhrbGFzcywgTlVMTCk7CisgICAgaWYgKGluc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaW5pdCA9IGluc3RhbmNlX2dldGF0dHIyKGluc3QsIGluaXRzdHIpOworICAgIGlmIChpbml0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbnN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICgoYXJnICE9IE5VTEwgJiYgKCFQeVR1cGxlX0NoZWNrKGFyZykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TaXplKGFyZykgIT0gMCkpCisgICAgICAgICAgICB8fCAoa3cgIT0gTlVMTCAmJiAoIVB5RGljdF9DaGVjayhrdykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RGljdF9TaXplKGt3KSAhPSAwKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGNvbnN0cnVjdG9yIHRha2VzIG5vIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgUHlfREVDUkVGKGluc3QpOworICAgICAgICAgICAgaW5zdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3Jkcyhpbml0LCBhcmcsIGt3KTsKKyAgICAgICAgUHlfREVDUkVGKGluaXQpOworICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbnN0KTsKKyAgICAgICAgICAgIGluc3QgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHJlcyAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2luaXRfXygpIHNob3VsZCByZXR1cm4gTm9uZSIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpbnN0KTsKKyAgICAgICAgICAgICAgICBpbnN0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilpbnN0OwogfQogCiAvKiBJbnN0YW5jZSBtZXRob2RzICovCkBAIC01OTYsMTc0ICs1OTYsMTc0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfbmV3KFB5VHlwZU9iamVjdCogdHlwZSwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqa2xhc3M7Ci0JUHlPYmplY3QgKmRpY3QgPSBQeV9Ob25lOworICAgIFB5T2JqZWN0ICprbGFzczsKKyAgICBQeU9iamVjdCAqZGljdCA9IFB5X05vbmU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86aW5zdGFuY2UiLAotCQkJICAgICAgJlB5Q2xhc3NfVHlwZSwgJmtsYXNzLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8TzppbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUNsYXNzX1R5cGUsICZrbGFzcywgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChkaWN0ID09IFB5X05vbmUpCi0JCWRpY3QgPSBOVUxMOwotCWVsc2UgaWYgKCFQeURpY3RfQ2hlY2soZGljdCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAgImluc3RhbmNlKCkgc2Vjb25kIGFyZyBtdXN0IGJlIGRpY3Rpb25hcnkgb3IgTm9uZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW5zdGFuY2VfTmV3UmF3KGtsYXNzLCBkaWN0KTsKKyAgICBpZiAoZGljdCA9PSBQeV9Ob25lKQorICAgICAgICBkaWN0ID0gTlVMTDsKKyAgICBlbHNlIGlmICghUHlEaWN0X0NoZWNrKGRpY3QpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICJpbnN0YW5jZSgpIHNlY29uZCBhcmcgbXVzdCBiZSBkaWN0aW9uYXJ5IG9yIE5vbmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUluc3RhbmNlX05ld1JhdyhrbGFzcywgZGljdCk7CiB9CiAKIAogc3RhdGljIHZvaWQKIGluc3RhbmNlX2RlYWxsb2MocmVnaXN0ZXIgUHlJbnN0YW5jZU9iamVjdCAqaW5zdCkKIHsKLQlQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOwotCVB5T2JqZWN0ICpkZWw7Ci0Jc3RhdGljIFB5T2JqZWN0ICpkZWxzdHI7CisgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKKyAgICBQeU9iamVjdCAqZGVsOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsc3RyOwogCi0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soaW5zdCk7Ci0JaWYgKGluc3QtPmluX3dlYWtyZWZsaXN0ICE9IE5VTEwpCi0JCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIGluc3QpOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKGluc3QpOworICAgIGlmIChpbnN0LT5pbl93ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBpbnN0KTsKIAotCS8qIFRlbXBvcmFyaWx5IHJlc3VycmVjdCB0aGUgb2JqZWN0LiAqLwotCWFzc2VydChpbnN0LT5vYl90eXBlID09ICZQeUluc3RhbmNlX1R5cGUpOwotCWFzc2VydChpbnN0LT5vYl9yZWZjbnQgPT0gMCk7Ci0JaW5zdC0+b2JfcmVmY250ID0gMTsKKyAgICAvKiBUZW1wb3JhcmlseSByZXN1cnJlY3QgdGhlIG9iamVjdC4gKi8KKyAgICBhc3NlcnQoaW5zdC0+b2JfdHlwZSA9PSAmUHlJbnN0YW5jZV9UeXBlKTsKKyAgICBhc3NlcnQoaW5zdC0+b2JfcmVmY250ID09IDApOworICAgIGluc3QtPm9iX3JlZmNudCA9IDE7CiAKLQkvKiBTYXZlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgaWYgYW55LiAqLwotCVB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwotCS8qIEV4ZWN1dGUgX19kZWxfXyBtZXRob2QsIGlmIGFueS4gKi8KLQlpZiAoZGVsc3RyID09IE5VTEwpIHsKLQkJZGVsc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxfXyIpOwotCQlpZiAoZGVsc3RyID09IE5VTEwpCi0JCQlQeUVycl9Xcml0ZVVucmFpc2FibGUoKFB5T2JqZWN0KilpbnN0KTsKLQl9Ci0JaWYgKGRlbHN0ciAmJiAoZGVsID0gaW5zdGFuY2VfZ2V0YXR0cjIoaW5zdCwgZGVsc3RyKSkgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZGVsLCAoUHlPYmplY3QgKilOVUxMKTsKLQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGRlbCk7Ci0JCWVsc2UKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQlQeV9ERUNSRUYoZGVsKTsKLQl9Ci0JLyogUmVzdG9yZSB0aGUgc2F2ZWQgZXhjZXB0aW9uLiAqLwotCVB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7CisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KKyAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKKyAgICAvKiBFeGVjdXRlIF9fZGVsX18gbWV0aG9kLCBpZiBhbnkuICovCisgICAgaWYgKGRlbHN0ciA9PSBOVUxMKSB7CisgICAgICAgIGRlbHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsX18iKTsKKyAgICAgICAgaWYgKGRlbHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKChQeU9iamVjdCopaW5zdCk7CisgICAgfQorICAgIGlmIChkZWxzdHIgJiYgKGRlbCA9IGluc3RhbmNlX2dldGF0dHIyKGluc3QsIGRlbHN0cikpICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGRlbCwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShkZWwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgUHlfREVDUkVGKGRlbCk7CisgICAgfQorICAgIC8qIFJlc3RvcmUgdGhlIHNhdmVkIGV4Y2VwdGlvbi4gKi8KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOwogCi0JLyogVW5kbyB0aGUgdGVtcG9yYXJ5IHJlc3VycmVjdGlvbjsgY2FuJ3QgdXNlIERFQ1JFRiBoZXJlLCBpdCB3b3VsZAotCSAqIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwuCi0JICovCi0JYXNzZXJ0KGluc3QtPm9iX3JlZmNudCA+IDApOwotCWlmICgtLWluc3QtPm9iX3JlZmNudCA9PSAwKSB7CisgICAgLyogVW5kbyB0aGUgdGVtcG9yYXJ5IHJlc3VycmVjdGlvbjsgY2FuJ3QgdXNlIERFQ1JFRiBoZXJlLCBpdCB3b3VsZAorICAgICAqIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwuCisgICAgICovCisgICAgYXNzZXJ0KGluc3QtPm9iX3JlZmNudCA+IDApOworICAgIGlmICgtLWluc3QtPm9iX3JlZmNudCA9PSAwKSB7CiAKLQkJLyogTmV3IHdlYWtyZWZzIGNvdWxkIGJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBmaW5hbGl6ZXIgY2FsbC4KLQkJICAgIElmIHRoaXMgb2NjdXJzLCBjbGVhciB0aGVtIG91dCB3aXRob3V0IGNhbGxpbmcgdGhlaXIKLQkJICAgIGZpbmFsaXplcnMgc2luY2UgdGhleSBtaWdodCByZWx5IG9uIHBhcnQgb2YgdGhlIG9iamVjdAotCQkgICAgYmVpbmcgZmluYWxpemVkIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQuICovCi0JCXdoaWxlIChpbnN0LT5pbl93ZWFrcmVmbGlzdCAhPSBOVUxMKSB7Ci0JCQlfUHlXZWFrcmVmX0NsZWFyUmVmKChQeVdlYWtSZWZlcmVuY2UgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluc3QtPmluX3dlYWtyZWZsaXN0KSk7Ci0JCX0KKyAgICAgICAgLyogTmV3IHdlYWtyZWZzIGNvdWxkIGJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBmaW5hbGl6ZXIgY2FsbC4KKyAgICAgICAgICAgIElmIHRoaXMgb2NjdXJzLCBjbGVhciB0aGVtIG91dCB3aXRob3V0IGNhbGxpbmcgdGhlaXIKKyAgICAgICAgICAgIGZpbmFsaXplcnMgc2luY2UgdGhleSBtaWdodCByZWx5IG9uIHBhcnQgb2YgdGhlIG9iamVjdAorICAgICAgICAgICAgYmVpbmcgZmluYWxpemVkIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQuICovCisgICAgICAgIHdoaWxlIChpbnN0LT5pbl93ZWFrcmVmbGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBfUHlXZWFrcmVmX0NsZWFyUmVmKChQeVdlYWtSZWZlcmVuY2UgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluc3QtPmluX3dlYWtyZWZsaXN0KSk7CisgICAgICAgIH0KIAotCQlQeV9ERUNSRUYoaW5zdC0+aW5fY2xhc3MpOwotCQlQeV9YREVDUkVGKGluc3QtPmluX2RpY3QpOwotCQlQeU9iamVjdF9HQ19EZWwoaW5zdCk7Ci0JfQotCWVsc2UgewotCQlQeV9zc2l6ZV90IHJlZmNudCA9IGluc3QtPm9iX3JlZmNudDsKLQkJLyogX19kZWxfXyByZXN1cnJlY3RlZCBpdCEgIE1ha2UgaXQgbG9vayBsaWtlIHRoZSBvcmlnaW5hbAotCQkgKiBQeV9ERUNSRUYgbmV2ZXIgaGFwcGVuZWQuCi0JCSAqLwotCQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKWluc3QpOwotCQlpbnN0LT5vYl9yZWZjbnQgPSByZWZjbnQ7Ci0JCV9QeU9iamVjdF9HQ19UUkFDSyhpbnN0KTsKLQkJLyogSWYgUHlfUkVGX0RFQlVHLCBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCBfUHlfUmVmVG90YWwsIHNvCi0JCSAqIHdlIG5lZWQgdG8gdW5kbyB0aGF0LiAqLwotCQlfUHlfREVDX1JFRlRPVEFMOwotCQkvKiBJZiBQeV9UUkFDRV9SRUZTLCBfUHlfTmV3UmVmZXJlbmNlIHJlLWFkZGVkIHNlbGYgdG8gdGhlCi0JCSAqIG9iamVjdCBjaGFpbiwgc28gbm8gbW9yZSB0byBkbyB0aGVyZS4KLQkJICogSWYgQ09VTlRfQUxMT0NTLCB0aGUgb3JpZ2luYWwgZGVjcmVmIGJ1bXBlZCB0cF9mcmVlcywgYW5kCi0JCSAqIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIHRwX2FsbG9jczogYm90aCBvZiB0aG9zZSBuZWVkIHRvIGJlCi0JCSAqIHVuZG9uZS4KLQkJICovCisgICAgICAgIFB5X0RFQ1JFRihpbnN0LT5pbl9jbGFzcyk7CisgICAgICAgIFB5X1hERUNSRUYoaW5zdC0+aW5fZGljdCk7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChpbnN0KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X3NzaXplX3QgcmVmY250ID0gaW5zdC0+b2JfcmVmY250OworICAgICAgICAvKiBfX2RlbF9fIHJlc3VycmVjdGVkIGl0ISAgTWFrZSBpdCBsb29rIGxpa2UgdGhlIG9yaWdpbmFsCisgICAgICAgICAqIFB5X0RFQ1JFRiBuZXZlciBoYXBwZW5lZC4KKyAgICAgICAgICovCisgICAgICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopaW5zdCk7CisgICAgICAgIGluc3QtPm9iX3JlZmNudCA9IHJlZmNudDsKKyAgICAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGluc3QpOworICAgICAgICAvKiBJZiBQeV9SRUZfREVCVUcsIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIF9QeV9SZWZUb3RhbCwgc28KKyAgICAgICAgICogd2UgbmVlZCB0byB1bmRvIHRoYXQuICovCisgICAgICAgIF9QeV9ERUNfUkVGVE9UQUw7CisgICAgICAgIC8qIElmIFB5X1RSQUNFX1JFRlMsIF9QeV9OZXdSZWZlcmVuY2UgcmUtYWRkZWQgc2VsZiB0byB0aGUKKyAgICAgICAgICogb2JqZWN0IGNoYWluLCBzbyBubyBtb3JlIHRvIGRvIHRoZXJlLgorICAgICAgICAgKiBJZiBDT1VOVF9BTExPQ1MsIHRoZSBvcmlnaW5hbCBkZWNyZWYgYnVtcGVkIHRwX2ZyZWVzLCBhbmQKKyAgICAgICAgICogX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgdHBfYWxsb2NzOiBib3RoIG9mIHRob3NlIG5lZWQgdG8gYmUKKyAgICAgICAgICogdW5kb25lLgorICAgICAgICAgKi8KICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkJLS1pbnN0LT5vYl90eXBlLT50cF9mcmVlczsKLQkJLS1pbnN0LT5vYl90eXBlLT50cF9hbGxvY3M7CisgICAgICAgIC0taW5zdC0+b2JfdHlwZS0+dHBfZnJlZXM7CisgICAgICAgIC0taW5zdC0+b2JfdHlwZS0+dHBfYWxsb2NzOwogI2VuZGlmCi0JfQorICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2dldGF0dHIxKHJlZ2lzdGVyIFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpuYW1lKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCXJlZ2lzdGVyIGNoYXIgKnNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSk7Ci0JaWYgKHNuYW1lWzBdID09ICdfJyAmJiBzbmFtZVsxXSA9PSAnXycpIHsKLQkJaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkgewotCQkJaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJImluc3RhbmNlLl9fZGljdF9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJUHlfSU5DUkVGKGluc3QtPmluX2RpY3QpOwotCQkJcmV0dXJuIGluc3QtPmluX2RpY3Q7Ci0JCX0KLQkJaWYgKHN0cmNtcChzbmFtZSwgIl9fY2xhc3NfXyIpID09IDApIHsKLQkJCVB5X0lOQ1JFRihpbnN0LT5pbl9jbGFzcyk7Ci0JCQlyZXR1cm4gKFB5T2JqZWN0ICopaW5zdC0+aW5fY2xhc3M7Ci0JCX0KLQl9Ci0JdiA9IGluc3RhbmNlX2dldGF0dHIyKGluc3QsIG5hbWUpOwotCWlmICh2ID09IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICAgICAiJS41MHMgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCi0JCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhpbnN0LT5pbl9jbGFzcy0+Y2xfbmFtZSksIHNuYW1lKTsKLQl9Ci0JcmV0dXJuIHY7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnY7CisgICAgcmVnaXN0ZXIgY2hhciAqc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKKyAgICBpZiAoc25hbWVbMF0gPT0gJ18nICYmIHNuYW1lWzFdID09ICdfJykgeworICAgICAgICBpZiAoc3RyY21wKHNuYW1lLCAiX19kaWN0X18iKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAiaW5zdGFuY2UuX19kaWN0X18gbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9JTkNSRUYoaW5zdC0+aW5fZGljdCk7CisgICAgICAgICAgICByZXR1cm4gaW5zdC0+aW5fZGljdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKHNuYW1lLCAiX19jbGFzc19fIikgPT0gMCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGluc3QtPmluX2NsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilpbnN0LT5pbl9jbGFzczsKKyAgICAgICAgfQorICAgIH0KKyAgICB2ID0gaW5zdGFuY2VfZ2V0YXR0cjIoaW5zdCwgbmFtZSk7CisgICAgaWYgKHYgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJS41MHMgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoaW5zdC0+aW5fY2xhc3MtPmNsX25hbWUpLCBzbmFtZSk7CisgICAgfQorICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfZ2V0YXR0cjIocmVnaXN0ZXIgUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKnY7Ci0JUHlDbGFzc09iamVjdCAqa2xhc3M7Ci0JZGVzY3JnZXRmdW5jIGY7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnY7CisgICAgUHlDbGFzc09iamVjdCAqa2xhc3M7CisgICAgZGVzY3JnZXRmdW5jIGY7CiAKLQl2ID0gUHlEaWN0X0dldEl0ZW0oaW5zdC0+aW5fZGljdCwgbmFtZSk7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiB2OwotCX0KLQl2ID0gY2xhc3NfbG9va3VwKGluc3QtPmluX2NsYXNzLCBuYW1lLCAma2xhc3MpOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlmID0gVFBfREVTQ1JfR0VUKHYtPm9iX3R5cGUpOwotCQlpZiAoZiAhPSBOVUxMKSB7Ci0JCQlQeU9iamVjdCAqdyA9IGYodiwgKFB5T2JqZWN0ICopaW5zdCwKLQkJCQkJKFB5T2JqZWN0ICopKGluc3QtPmluX2NsYXNzKSk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQl2ID0gdzsKLQkJfQotCX0KLQlyZXR1cm4gdjsKKyAgICB2ID0gUHlEaWN0X0dldEl0ZW0oaW5zdC0+aW5fZGljdCwgbmFtZSk7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICB2ID0gY2xhc3NfbG9va3VwKGluc3QtPmluX2NsYXNzLCBuYW1lLCAma2xhc3MpOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBmID0gVFBfREVTQ1JfR0VUKHYtPm9iX3R5cGUpOworICAgICAgICBpZiAoZiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdyA9IGYodiwgKFB5T2JqZWN0ICopaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKikoaW5zdC0+aW5fY2xhc3MpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHYgPSB3OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfZ2V0YXR0cihyZWdpc3RlciBQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeU9iamVjdCAqbmFtZSkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqZnVuYywgKnJlczsKLQlyZXMgPSBpbnN0YW5jZV9nZXRhdHRyMShpbnN0LCBuYW1lKTsKLQlpZiAocmVzID09IE5VTEwgJiYgKGZ1bmMgPSBpbnN0LT5pbl9jbGFzcy0+Y2xfZ2V0YXR0cikgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqYXJnczsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiBOVUxMOwotCQlQeUVycl9DbGVhcigpOwotCQlhcmdzID0gUHlUdXBsZV9QYWNrKDIsIGluc3QsIG5hbWUpOwotCQlpZiAoYXJncyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JfQotCXJldHVybiByZXM7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKmZ1bmMsICpyZXM7CisgICAgcmVzID0gaW5zdGFuY2VfZ2V0YXR0cjEoaW5zdCwgbmFtZSk7CisgICAgaWYgKHJlcyA9PSBOVUxMICYmIChmdW5jID0gaW5zdC0+aW5fY2xhc3MtPmNsX2dldGF0dHIpICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygyLCBpbnN0LCBuYW1lKTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiBTZWUgY2xhc3NvYmplY3QuaCBjb21tZW50czogIHRoaXMgb25seSBkb2VzIGRpY3QgbG9va3VwcywgYW5kIGlzIGFsd2F5cwpAQCAtNzcyLDIzNSArNzcyLDIzNSBAQAogUHlPYmplY3QgKgogX1B5SW5zdGFuY2VfTG9va3VwKFB5T2JqZWN0ICpwaW5zdCwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JUHlDbGFzc09iamVjdCAqa2xhc3M7Ci0JUHlJbnN0YW5jZU9iamVjdCAqaW5zdDsJLyogcGluc3QgY2FzdCB0byB0aGUgcmlnaHQgdHlwZSAqLworICAgIFB5T2JqZWN0ICp2OworICAgIFB5Q2xhc3NPYmplY3QgKmtsYXNzOworICAgIFB5SW5zdGFuY2VPYmplY3QgKmluc3Q7ICAgICAvKiBwaW5zdCBjYXN0IHRvIHRoZSByaWdodCB0eXBlICovCiAKLQlhc3NlcnQoUHlJbnN0YW5jZV9DaGVjayhwaW5zdCkpOwotCWluc3QgPSAoUHlJbnN0YW5jZU9iamVjdCAqKXBpbnN0OworICAgIGFzc2VydChQeUluc3RhbmNlX0NoZWNrKHBpbnN0KSk7CisgICAgaW5zdCA9IChQeUluc3RhbmNlT2JqZWN0ICopcGluc3Q7CiAKLQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2sobmFtZSkpOworICAgIGFzc2VydChQeVN0cmluZ19DaGVjayhuYW1lKSk7CiAKLSAJdiA9IFB5RGljdF9HZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUpOwotCWlmICh2ID09IE5VTEwpCi0JCXYgPSBjbGFzc19sb29rdXAoaW5zdC0+aW5fY2xhc3MsIG5hbWUsICZrbGFzcyk7Ci0JcmV0dXJuIHY7CisgICAgdiA9IFB5RGljdF9HZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHYgPSBjbGFzc19sb29rdXAoaW5zdC0+aW5fY2xhc3MsIG5hbWUsICZrbGFzcyk7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBpbnQKIGluc3RhbmNlX3NldGF0dHIxKFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCWludCBydiA9IFB5RGljdF9EZWxJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUpOwotCQlpZiAocnYgPCAwKQotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSAgICAgIiUuNTBzIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAotCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGluc3QtPmluX2NsYXNzLT5jbF9uYW1lKSwKLQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JCXJldHVybiBydjsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gUHlEaWN0X1NldEl0ZW0oaW5zdC0+aW5fZGljdCwgbmFtZSwgdik7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBpbnQgcnYgPSBQeURpY3RfRGVsSXRlbShpbnN0LT5pbl9kaWN0LCBuYW1lKTsKKyAgICAgICAgaWYgKHJ2IDwgMCkKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJS41MHMgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGluc3QtPmluX2NsYXNzLT5jbF9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgICAgICByZXR1cm4gcnY7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RGljdF9TZXRJdGVtKGluc3QtPmluX2RpY3QsIG5hbWUsIHYpOwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV9zZXRhdHRyKFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqZnVuYywgKmFyZ3MsICpyZXMsICp0bXA7Ci0JY2hhciAqc25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKTsKLQlpZiAoc25hbWVbMF0gPT0gJ18nICYmIHNuYW1lWzFdID09ICdfJykgewotCQlQeV9zc2l6ZV90IG4gPSBQeVN0cmluZ19TaXplKG5hbWUpOwotCQlpZiAoc25hbWVbbi0xXSA9PSAnXycgJiYgc25hbWVbbi0yXSA9PSAnXycpIHsKLQkJCWlmIChzdHJjbXAoc25hbWUsICJfX2RpY3RfXyIpID09IDApIHsKLQkJCQlpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSAiX19kaWN0X18gbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJaWYgKHYgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKHYpKSB7Ci0JCQkJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAgICJfX2RpY3RfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Rpb25hcnkiKTsKLQkJCQkgICAgcmV0dXJuIC0xOwotCQkJCX0KLQkJCQl0bXAgPSBpbnN0LT5pbl9kaWN0OwotCQkJCVB5X0lOQ1JFRih2KTsKLQkJCQlpbnN0LT5pbl9kaWN0ID0gdjsKLQkJCQlQeV9ERUNSRUYodG1wKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChzdHJjbXAoc25hbWUsICJfX2NsYXNzX18iKSA9PSAwKSB7Ci0JCQkJaWYgKFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiX19jbGFzc19fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWlmICh2ID09IE5VTEwgfHwgIVB5Q2xhc3NfQ2hlY2sodikpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgIl9fY2xhc3NfXyBtdXN0IGJlIHNldCB0byBhIGNsYXNzIik7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJdG1wID0gKFB5T2JqZWN0ICopKGluc3QtPmluX2NsYXNzKTsKLQkJCQlQeV9JTkNSRUYodik7Ci0JCQkJaW5zdC0+aW5fY2xhc3MgPSAoUHlDbGFzc09iamVjdCAqKXY7Ci0JCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKHYgPT0gTlVMTCkKLQkJZnVuYyA9IGluc3QtPmluX2NsYXNzLT5jbF9kZWxhdHRyOwotCWVsc2UKLQkJZnVuYyA9IGluc3QtPmluX2NsYXNzLT5jbF9zZXRhdHRyOwotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybiBpbnN0YW5jZV9zZXRhdHRyMShpbnN0LCBuYW1lLCB2KTsKLQlpZiAodiA9PSBOVUxMKQotCQlhcmdzID0gUHlUdXBsZV9QYWNrKDIsIGluc3QsIG5hbWUpOwotCWVsc2UKLQkJYXJncyA9IFB5VHVwbGVfUGFjaygzLCBpbnN0LCBuYW1lLCB2KTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJncywgKnJlcywgKnRtcDsKKyAgICBjaGFyICpzbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpOworICAgIGlmIChzbmFtZVswXSA9PSAnXycgJiYgc25hbWVbMV0gPT0gJ18nKSB7CisgICAgICAgIFB5X3NzaXplX3QgbiA9IFB5U3RyaW5nX1NpemUobmFtZSk7CisgICAgICAgIGlmIChzbmFtZVtuLTFdID09ICdfJyAmJiBzbmFtZVtuLTJdID09ICdfJykgeworICAgICAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fZGljdF9fIikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICJfX2RpY3RfXyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIl9fZGljdF9fIG11c3QgYmUgc2V0IHRvIGEgZGljdGlvbmFyeSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRtcCA9IGluc3QtPmluX2RpY3Q7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICAgICAgICAgIGluc3QtPmluX2RpY3QgPSB2OworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmNtcChzbmFtZSwgIl9fY2xhc3NfXyIpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICJfX2NsYXNzX18gbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlDbGFzc19DaGVjayh2KSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiX19jbGFzc19fIG11c3QgYmUgc2V0IHRvIGEgY2xhc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0bXAgPSAoUHlPYmplY3QgKikoaW5zdC0+aW5fY2xhc3MpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgICAgICBpbnN0LT5pbl9jbGFzcyA9IChQeUNsYXNzT2JqZWN0ICopdjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBmdW5jID0gaW5zdC0+aW5fY2xhc3MtPmNsX2RlbGF0dHI7CisgICAgZWxzZQorICAgICAgICBmdW5jID0gaW5zdC0+aW5fY2xhc3MtPmNsX3NldGF0dHI7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlX3NldGF0dHIxKGluc3QsIG5hbWUsIHYpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMiwgaW5zdCwgbmFtZSk7CisgICAgZWxzZQorICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDMsIGluc3QsIG5hbWUsIHYpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9yZXByKFB5SW5zdGFuY2VPYmplY3QgKmluc3QpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKnJlcHJzdHI7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnJlcHJzdHI7CiAKLQlpZiAocmVwcnN0ciA9PSBOVUxMKSB7Ci0JCXJlcHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3JlcHJfXyIpOwotCQlpZiAocmVwcnN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHJlcHJzdHIpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlPYmplY3QgKmNsYXNzbmFtZSwgKm1vZDsKLQkJY2hhciAqY25hbWU7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJY2xhc3NuYW1lID0gaW5zdC0+aW5fY2xhc3MtPmNsX25hbWU7Ci0JCW1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGluc3QtPmluX2NsYXNzLT5jbF9kaWN0LAotCQkJCQkgICAiX19tb2R1bGVfXyIpOwotCQlpZiAoY2xhc3NuYW1lICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2soY2xhc3NuYW1lKSkKLQkJCWNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoY2xhc3NuYW1lKTsKLQkJZWxzZQotCQkJY25hbWUgPSAiPyI7Ci0JCWlmIChtb2QgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobW9kKSkKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Py4lcyBpbnN0YW5jZSBhdCAlcD4iLAotCQkJCQkJICAgY25hbWUsIGluc3QpOwotCQllbHNlCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzLiVzIGluc3RhbmNlIGF0ICVwPiIsCi0JCQkJCQkgICBQeVN0cmluZ19Bc1N0cmluZyhtb2QpLAotCQkJCQkJICAgY25hbWUsIGluc3QpOwotCX0KLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAocmVwcnN0ciA9PSBOVUxMKSB7CisgICAgICAgIHJlcHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3JlcHJfXyIpOworICAgICAgICBpZiAocmVwcnN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHJlcHJzdHIpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmNsYXNzbmFtZSwgKm1vZDsKKyAgICAgICAgY2hhciAqY25hbWU7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgY2xhc3NuYW1lID0gaW5zdC0+aW5fY2xhc3MtPmNsX25hbWU7CisgICAgICAgIG1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGluc3QtPmluX2NsYXNzLT5jbF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19tb2R1bGVfXyIpOworICAgICAgICBpZiAoY2xhc3NuYW1lICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2soY2xhc3NuYW1lKSkKKyAgICAgICAgICAgIGNuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoY2xhc3NuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY25hbWUgPSAiPyI7CisgICAgICAgIGlmIChtb2QgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobW9kKSkKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8Py4lcyBpbnN0YW5jZSBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUsIGluc3QpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzLiVzIGluc3RhbmNlIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhtb2QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUsIGluc3QpOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX3N0cihQeUluc3RhbmNlT2JqZWN0ICppbnN0KQogewotCVB5T2JqZWN0ICpmdW5jOwotCVB5T2JqZWN0ICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpzdHJzdHI7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnN0cnN0cjsKIAotCWlmIChzdHJzdHIgPT0gTlVMTCkgewotCQlzdHJzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3N0cl9fIik7Ci0JCWlmIChzdHJzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBzdHJzdHIpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiBOVUxMOwotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gaW5zdGFuY2VfcmVwcihpbnN0KTsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCXJldHVybiByZXM7CisgICAgaWYgKHN0cnN0ciA9PSBOVUxMKSB7CisgICAgICAgIHN0cnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc3RyX18iKTsKKyAgICAgICAgaWYgKHN0cnN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHN0cnN0cik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZV9yZXByKGluc3QpOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGxvbmcKIGluc3RhbmNlX2hhc2goUHlJbnN0YW5jZU9iamVjdCAqaW5zdCkKIHsKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqcmVzOwotCWxvbmcgb3V0Y29tZTsKLQlzdGF0aWMgUHlPYmplY3QgKmhhc2hzdHIsICplcXN0ciwgKmNtcHN0cjsKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIGxvbmcgb3V0Y29tZTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmhhc2hzdHIsICplcXN0ciwgKmNtcHN0cjsKIAotCWlmIChoYXNoc3RyID09IE5VTEwpIHsKLQkJaGFzaHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faGFzaF9fIik7Ci0JCWlmIChoYXNoc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGhhc2hzdHIpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiAtMTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJLyogSWYgdGhlcmUgaXMgbm8gX19lcV9fIGFuZCBubyBfX2NtcF9fIG1ldGhvZCwgd2UgaGFzaCBvbiB0aGUKLQkJICAgYWRkcmVzcy4gIElmIGFuIF9fZXFfXyBvciBfX2NtcF9fIG1ldGhvZCBleGlzdHMsIHRoZXJlIG11c3QKLQkJICAgYmUgYSBfX2hhc2hfXy4gKi8KLQkJaWYgKGVxc3RyID09IE5VTEwpIHsKLQkJCWVxc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19lcV9fIik7Ci0JCQlpZiAoZXFzdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZXFzdHIpOwotCQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiAtMTsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlpZiAoY21wc3RyID09IE5VTEwpIHsKLQkJCQljbXBzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NtcF9fIik7Ci0JCQkJaWYgKGNtcHN0ciA9PSBOVUxMKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBjbXBzdHIpOwotCQkJaWYgKGZ1bmMgPT0gTlVMTCkgewotCQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcygKLQkJCQkJUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlyZXR1cm4gX1B5X0hhc2hQb2ludGVyKGluc3QpOwotCQkJfQotCQl9Ci0JCVB5X1hERUNSRUYoZnVuYyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIGluc3RhbmNlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChQeUludF9DaGVjayhyZXMpIHx8IFB5TG9uZ19DaGVjayhyZXMpKQotCQkvKiBUaGlzIGFscmVhZHkgY29udmVydHMgYSAtMSByZXN1bHQgdG8gLTIuICovCi0JCW91dGNvbWUgPSByZXMtPm9iX3R5cGUtPnRwX2hhc2gocmVzKTsKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19oYXNoX18oKSBzaG91bGQgcmV0dXJuIGFuIGludCIpOwotCQlvdXRjb21lID0gLTE7Ci0JfQotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBvdXRjb21lOworICAgIGlmIChoYXNoc3RyID09IE5VTEwpIHsKKyAgICAgICAgaGFzaHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faGFzaF9fIik7CisgICAgICAgIGlmIChoYXNoc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGhhc2hzdHIpOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgLyogSWYgdGhlcmUgaXMgbm8gX19lcV9fIGFuZCBubyBfX2NtcF9fIG1ldGhvZCwgd2UgaGFzaCBvbiB0aGUKKyAgICAgICAgICAgYWRkcmVzcy4gIElmIGFuIF9fZXFfXyBvciBfX2NtcF9fIG1ldGhvZCBleGlzdHMsIHRoZXJlIG11c3QKKyAgICAgICAgICAgYmUgYSBfX2hhc2hfXy4gKi8KKyAgICAgICAgaWYgKGVxc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGVxc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19lcV9fIik7CisgICAgICAgICAgICBpZiAoZXFzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZXFzdHIpOworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBpZiAoY21wc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjbXBzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NtcF9fIik7CisgICAgICAgICAgICAgICAgaWYgKGNtcHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBjbXBzdHIpOworICAgICAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcygKKyAgICAgICAgICAgICAgICAgICAgUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX1B5X0hhc2hQb2ludGVyKGluc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYoZnVuYyk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIGluc3RhbmNlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChQeUludF9DaGVjayhyZXMpIHx8IFB5TG9uZ19DaGVjayhyZXMpKQorICAgICAgICAvKiBUaGlzIGFscmVhZHkgY29udmVydHMgYSAtMSByZXN1bHQgdG8gLTIuICovCisgICAgICAgIG91dGNvbWUgPSByZXMtPm9iX3R5cGUtPnRwX2hhc2gocmVzKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2hhc2hfXygpIHNob3VsZCByZXR1cm4gYW4gaW50Iik7CisgICAgICAgIG91dGNvbWUgPSAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIG91dGNvbWU7CiB9CiAKIHN0YXRpYyBpbnQKIGluc3RhbmNlX3RyYXZlcnNlKFB5SW5zdGFuY2VPYmplY3QgKm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKG8tPmluX2NsYXNzKTsKLQlQeV9WSVNJVChvLT5pbl9kaWN0KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChvLT5pbl9jbGFzcyk7CisgICAgUHlfVklTSVQoby0+aW5fZGljdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqZ2V0aXRlbXN0ciwgKnNldGl0ZW1zdHIsICpkZWxpdGVtc3RyLCAqbGVuc3RyOwpAQCAtMTAwOSw0MTMgKzEwMDksNDEzIEBACiBzdGF0aWMgUHlfc3NpemVfdAogaW5zdGFuY2VfbGVuZ3RoKFB5SW5zdGFuY2VPYmplY3QgKmluc3QpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKnJlczsKLQlQeV9zc2l6ZV90IG91dGNvbWU7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBQeV9zc2l6ZV90IG91dGNvbWU7CiAKLQlpZiAobGVuc3RyID09IE5VTEwpIHsKLQkJbGVuc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19sZW5fXyIpOwotCQlpZiAobGVuc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGxlbnN0cik7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoUHlJbnRfQ2hlY2socmVzKSkgewotCQlvdXRjb21lID0gUHlJbnRfQXNTc2l6ZV90KHJlcyk7Ci0JCWlmIChvdXRjb21lID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgaWYgKGxlbnN0ciA9PSBOVUxMKSB7CisgICAgICAgIGxlbnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbGVuX18iKTsKKyAgICAgICAgaWYgKGxlbnN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBsZW5zdHIpOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5SW50X0NoZWNrKHJlcykpIHsKKyAgICAgICAgb3V0Y29tZSA9IFB5SW50X0FzU3NpemVfdChyZXMpOworICAgICAgICBpZiAob3V0Y29tZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogI2lmIFNJWkVPRl9TSVpFX1QgPCBTSVpFT0ZfSU5UCi0JCS8qIE92ZXJmbG93IGNoZWNrIC0tIHJhbmdlIG9mIFB5SW50IGlzIG1vcmUgdGhhbiBDIGludCAqLwotCQlpZiAob3V0Y29tZSAhPSAoaW50KW91dGNvbWUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJICJfX2xlbl9fKCkgc2hvdWxkIHJldHVybiAwIDw9IG91dGNvbWUgPCAyKiozMSIpOwotCQkJb3V0Y29tZSA9IC0xOwotCQl9Ci0JCWVsc2UKKyAgICAgICAgLyogT3ZlcmZsb3cgY2hlY2sgLS0gcmFuZ2Ugb2YgUHlJbnQgaXMgbW9yZSB0aGFuIEMgaW50ICovCisgICAgICAgIGlmIChvdXRjb21lICE9IChpbnQpb3V0Y29tZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgIl9fbGVuX18oKSBzaG91bGQgcmV0dXJuIDAgPD0gb3V0Y29tZSA8IDIqKjMxIik7CisgICAgICAgICAgICBvdXRjb21lID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogI2VuZGlmCi0JCWlmIChvdXRjb21lIDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJfX2xlbl9fKCkgc2hvdWxkIHJldHVybiA+PSAwIik7Ci0JCQlvdXRjb21lID0gLTE7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl9fbGVuX18oKSBzaG91bGQgcmV0dXJuIGFuIGludCIpOwotCQlvdXRjb21lID0gLTE7Ci0JfQotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBvdXRjb21lOworICAgICAgICBpZiAob3V0Y29tZSA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2xlbl9fKCkgc2hvdWxkIHJldHVybiA+PSAwIik7CisgICAgICAgICAgICBvdXRjb21lID0gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19sZW5fXygpIHNob3VsZCByZXR1cm4gYW4gaW50Iik7CisgICAgICAgIG91dGNvbWUgPSAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIG91dGNvbWU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9zdWJzY3JpcHQoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKmtleSkKIHsKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqYXJnOwotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKmFyZzsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkgewotCQlnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKLQkJaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRpdGVtc3RyKTsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhcmcgPSBQeVR1cGxlX1BhY2soMSwga2V5KTsKLQlpZiAoYXJnID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JUHlfREVDUkVGKGFyZyk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKSB7CisgICAgICAgIGdldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOworICAgICAgICBpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGdldGl0ZW1zdHIpOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZyA9IFB5VHVwbGVfUGFjaygxLCBrZXkpOworICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV9hc3Nfc3Vic2NyaXB0KFB5SW5zdGFuY2VPYmplY3QgKmluc3QsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqYXJnOwotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKmFyZzsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkgewotCQkJZGVsaXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsaXRlbV9fIik7Ci0JCQlpZiAoZGVsaXRlbXN0ciA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBkZWxpdGVtc3RyKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChzZXRpdGVtc3RyID09IE5VTEwpIHsKLQkJCXNldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldGl0ZW1fXyIpOwotCQkJaWYgKHNldGl0ZW1zdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgc2V0aXRlbXN0cik7Ci0JfQotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJYXJnID0gUHlUdXBsZV9QYWNrKDEsIGtleSk7Ci0JZWxzZQotCQlhcmcgPSBQeVR1cGxlX1BhY2soMiwga2V5LCB2YWx1ZSk7Ci0JaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlQeV9ERUNSRUYoYXJnKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBpZiAoZGVsaXRlbXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBkZWxpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxpdGVtX18iKTsKKyAgICAgICAgICAgIGlmIChkZWxpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGRlbGl0ZW1zdHIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHNldGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgc2V0aXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc2V0aXRlbV9fIik7CisgICAgICAgICAgICBpZiAoc2V0aXRlbXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBzZXRpdGVtc3RyKTsKKyAgICB9CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICBhcmcgPSBQeVR1cGxlX1BhY2soMSwga2V5KTsKKyAgICBlbHNlCisgICAgICAgIGFyZyA9IFB5VHVwbGVfUGFjaygyLCBrZXksIHZhbHVlKTsKKyAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIFB5X0RFQ1JFRihhcmcpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBpbnN0YW5jZV9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKWluc3RhbmNlX2xlbmd0aCwJCS8qIG1wX2xlbmd0aCAqLwotCShiaW5hcnlmdW5jKWluc3RhbmNlX3N1YnNjcmlwdCwJCS8qIG1wX3N1YnNjcmlwdCAqLwotCShvYmpvYmphcmdwcm9jKWluc3RhbmNlX2Fzc19zdWJzY3JpcHQsCS8qIG1wX2Fzc19zdWJzY3JpcHQgKi8KKyAgICAobGVuZnVuYylpbnN0YW5jZV9sZW5ndGgsICAgICAgICAgICAgICAgICAgIC8qIG1wX2xlbmd0aCAqLworICAgIChiaW5hcnlmdW5jKWluc3RhbmNlX3N1YnNjcmlwdCwgICAgICAgICAgICAgLyogbXBfc3Vic2NyaXB0ICovCisgICAgKG9iam9iamFyZ3Byb2MpaW5zdGFuY2VfYXNzX3N1YnNjcmlwdCwgICAgICAvKiBtcF9hc3Nfc3Vic2NyaXB0ICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfaXRlbShQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeV9zc2l6ZV90IGkpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXM7CiAKLQlpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKSB7Ci0JCWdldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOwotCQlpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGdldGl0ZW1zdHIpOwotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCAibiIsIGkpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChnZXRpdGVtc3RyID09IE5VTEwpIHsKKyAgICAgICAgZ2V0aXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0aXRlbV9fIik7CisgICAgICAgIGlmIChnZXRpdGVtc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZ2V0aXRlbXN0cik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsICJuIiwgaSk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9zbGljZShQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeV9zc2l6ZV90IGksIFB5X3NzaXplX3QgaikKIHsKLQlQeU9iamVjdCAqZnVuYywgKmFyZywgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKmdldHNsaWNlc3RyOworICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJnLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqZ2V0c2xpY2VzdHI7CiAKLQlpZiAoZ2V0c2xpY2VzdHIgPT0gTlVMTCkgewotCQlnZXRzbGljZXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0c2xpY2VfXyIpOwotCQlpZiAoZ2V0c2xpY2VzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRzbGljZXN0cik7CisgICAgaWYgKGdldHNsaWNlc3RyID09IE5VTEwpIHsKKyAgICAgICAgZ2V0c2xpY2VzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldHNsaWNlX18iKTsKKyAgICAgICAgaWYgKGdldHNsaWNlc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZ2V0c2xpY2VzdHIpOwogCi0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAKLQkJaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkgewotCQkJZ2V0aXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0aXRlbV9fIik7Ci0JCQlpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIGdldGl0ZW1zdHIpOwotCQlpZiAoZnVuYyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihOKSIsIF9QeVNsaWNlX0Zyb21JbmRpY2VzKGksIGopKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX2dldHNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZDsgIgotCQkJCSAgICJ1c2UgX19nZXRpdGVtX18iLCAxKSA8IDApIHsKLQkJCVB5X0RFQ1JFRihmdW5jKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihubikiLCBpLCBqKTsKLQl9CisgICAgICAgIGlmIChnZXRpdGVtc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOworICAgICAgICAgICAgaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBnZXRpdGVtc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIoTikiLCBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpLCBqKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19nZXRzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgX19nZXRpdGVtX18iLCAxKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGFyZyA9IFB5X0J1aWxkVmFsdWUoIihubikiLCBpLCBqKTsKKyAgICB9CiAKLQlpZiAoYXJnID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JUHlfREVDUkVGKGFyZyk7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogaW5zdGFuY2VfYXNzX2l0ZW0oUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqaXRlbSkKIHsKLQlQeU9iamVjdCAqZnVuYywgKmFyZywgKnJlczsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZywgKnJlczsKIAotCWlmIChpdGVtID09IE5VTEwpIHsKLQkJaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkgewotCQkJZGVsaXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsaXRlbV9fIik7Ci0JCQlpZiAoZGVsaXRlbXN0ciA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBkZWxpdGVtc3RyKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChzZXRpdGVtc3RyID09IE5VTEwpIHsKLQkJCXNldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldGl0ZW1fXyIpOwotCQkJaWYgKHNldGl0ZW1zdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgc2V0aXRlbXN0cik7Ci0JfQotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoaXRlbSA9PSBOVUxMKQotCQlhcmcgPSBQeUludF9Gcm9tU3NpemVfdChpKTsKLQllbHNlCi0JCWFyZyA9IFB5X0J1aWxkVmFsdWUoIihuTykiLCBpLCBpdGVtKTsKLQlpZiAoYXJnID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCVB5X0RFQ1JFRihhcmcpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgZGVsaXRlbXN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsaXRlbV9fIik7CisgICAgICAgICAgICBpZiAoZGVsaXRlbXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBkZWxpdGVtc3RyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzZXRpdGVtc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldGl0ZW1fXyIpOworICAgICAgICAgICAgaWYgKHNldGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgc2V0aXRlbXN0cik7CisgICAgfQorICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICBhcmcgPSBQeUludF9Gcm9tU3NpemVfdChpKTsKKyAgICBlbHNlCisgICAgICAgIGFyZyA9IFB5X0J1aWxkVmFsdWUoIihuTykiLCBpLCBpdGVtKTsKKyAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIFB5X0RFQ1JFRihhcmcpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV9hc3Nfc2xpY2UoUHlJbnN0YW5jZU9iamVjdCAqaW5zdCwgUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IGosIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqZnVuYywgKmFyZywgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKnNldHNsaWNlc3RyLCAqZGVsc2xpY2VzdHI7CisgICAgUHlPYmplY3QgKmZ1bmMsICphcmcsICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpzZXRzbGljZXN0ciwgKmRlbHNsaWNlc3RyOwogCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJaWYgKGRlbHNsaWNlc3RyID09IE5VTEwpIHsKLQkJCWRlbHNsaWNlc3RyID0KLQkJCQlQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RlbHNsaWNlX18iKTsKLQkJCWlmIChkZWxzbGljZXN0ciA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBkZWxzbGljZXN0cik7Ci0JCWlmIChmdW5jID09IE5VTEwpIHsKLQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJcmV0dXJuIC0xOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWlmIChkZWxpdGVtc3RyID09IE5VTEwpIHsKLQkJCQlkZWxpdGVtc3RyID0KLQkJCQkgICAgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxpdGVtX18iKTsKLQkJCQlpZiAoZGVsaXRlbXN0ciA9PSBOVUxMKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihpbnN0LCBkZWxpdGVtc3RyKTsKLQkJCWlmIChmdW5jID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChkZWxzbGljZXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBkZWxzbGljZXN0ciA9CisgICAgICAgICAgICAgICAgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kZWxzbGljZV9fIik7CisgICAgICAgICAgICBpZiAoZGVsc2xpY2VzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsc2xpY2VzdHIpOworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBpZiAoZGVsaXRlbXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZGVsaXRlbXN0ciA9CisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGVsaXRlbV9fIik7CisgICAgICAgICAgICAgICAgaWYgKGRlbGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgZGVsaXRlbXN0cik7CisgICAgICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQkJYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE4pIiwKLQkJCQkJICAgIF9QeVNsaWNlX0Zyb21JbmRpY2VzKGksIGopKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX2RlbHNsaWNlX18gaGFzIGJlZW4gIgotCQkJCSAgICAgICAgICAgICJyZW1vdmVkOyB1c2UgX19kZWxpdGVtX18iLCAxKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJYXJnID0gUHlfQnVpbGRWYWx1ZSgiKG5uKSIsIGksIGopOwotCQl9Ci0JfQotCWVsc2UgewotCQlpZiAoc2V0c2xpY2VzdHIgPT0gTlVMTCkgewotCQkJc2V0c2xpY2VzdHIgPQotCQkJCVB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc2V0c2xpY2VfXyIpOwotCQkJaWYgKHNldHNsaWNlc3RyID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldHNsaWNlc3RyKTsKLQkJaWYgKGZ1bmMgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJaWYgKHNldGl0ZW1zdHIgPT0gTlVMTCkgewotCQkJCXNldGl0ZW1zdHIgPQotCQkJCSAgICBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3NldGl0ZW1fXyIpOwotCQkJCWlmIChzZXRpdGVtc3RyID09IE5VTEwpCi0JCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIHNldGl0ZW1zdHIpOwotCQkJaWYgKGZ1bmMgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7CisgICAgICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIoTikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpLCBqKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19kZWxzbGljZV9fIGhhcyBiZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZWQ7IHVzZSBfX2RlbGl0ZW1fXyIsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIobm4pIiwgaSwgaik7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChzZXRzbGljZXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBzZXRzbGljZXN0ciA9CisgICAgICAgICAgICAgICAgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zZXRzbGljZV9fIik7CisgICAgICAgICAgICBpZiAoc2V0c2xpY2VzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgc2V0c2xpY2VzdHIpOworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBpZiAoc2V0aXRlbXN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2V0aXRlbXN0ciA9CisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc2V0aXRlbV9fIik7CisgICAgICAgICAgICAgICAgaWYgKHNldGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgc2V0aXRlbXN0cik7CisgICAgICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQkJYXJnID0gUHlfQnVpbGRWYWx1ZSgiKE5PKSIsCi0JCQkJCSAgICBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpLCBqKSwgdmFsdWUpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFB5RXJyX1dhcm5QeTNrKCJpbiAzLngsIF9fc2V0c2xpY2VfXyBoYXMgYmVlbiAiCi0JCQkJCSAgICJyZW1vdmVkOyB1c2UgX19zZXRpdGVtX18iLCAxKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJYXJnID0gUHlfQnVpbGRWYWx1ZSgiKG5uTykiLCBpLCBqLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0JaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlQeV9ERUNSRUYoYXJnKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgICAgIGFyZyA9IFB5X0J1aWxkVmFsdWUoIihOTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlTbGljZV9Gcm9tSW5kaWNlcyhpLCBqKSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJpbiAzLngsIF9fc2V0c2xpY2VfXyBoYXMgYmVlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZWQ7IHVzZSBfX3NldGl0ZW1fXyIsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmcgPSBQeV9CdWlsZFZhbHVlKCIobm5PKSIsIGksIGosIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIFB5X0RFQ1JFRihhcmcpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV9jb250YWlucyhQeUluc3RhbmNlT2JqZWN0ICppbnN0LCBQeU9iamVjdCAqbWVtYmVyKQogewotCXN0YXRpYyBQeU9iamVjdCAqX19jb250YWluc19fOwotCVB5T2JqZWN0ICpmdW5jOworICAgIHN0YXRpYyBQeU9iamVjdCAqX19jb250YWluc19fOworICAgIFB5T2JqZWN0ICpmdW5jOwogCi0JLyogVHJ5IF9fY29udGFpbnNfXyBmaXJzdC4KLQkgKiBJZiB0aGF0IGNhbid0IGJlIGRvbmUsIHRyeSBpdGVyYXRvci1iYXNlZCBzZWFyY2hpbmcuCi0JICovCisgICAgLyogVHJ5IF9fY29udGFpbnNfXyBmaXJzdC4KKyAgICAgKiBJZiB0aGF0IGNhbid0IGJlIGRvbmUsIHRyeSBpdGVyYXRvci1iYXNlZCBzZWFyY2hpbmcuCisgICAgICovCiAKLQlpZihfX2NvbnRhaW5zX18gPT0gTlVMTCkgewotCQlfX2NvbnRhaW5zX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NvbnRhaW5zX18iKTsKLQkJaWYoX19jb250YWluc19fID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKGluc3QsIF9fY29udGFpbnNfXyk7Ci0JaWYgKGZ1bmMpIHsKLQkJUHlPYmplY3QgKnJlczsKLQkJaW50IHJldDsKLQkJUHlPYmplY3QgKmFyZyA9IFB5VHVwbGVfUGFjaygxLCBtZW1iZXIpOwotCQlpZihhcmcgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJUHlfREVDUkVGKGFyZyk7Ci0JCWlmKHJlcyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlyZXQgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiByZXQ7Ci0JfQorICAgIGlmKF9fY29udGFpbnNfXyA9PSBOVUxMKSB7CisgICAgICAgIF9fY29udGFpbnNfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29udGFpbnNfXyIpOworICAgICAgICBpZihfX2NvbnRhaW5zX18gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoaW5zdCwgX19jb250YWluc19fKTsKKyAgICBpZiAoZnVuYykgeworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBpbnQgcmV0OworICAgICAgICBQeU9iamVjdCAqYXJnID0gUHlUdXBsZV9QYWNrKDEsIG1lbWJlcik7CisgICAgICAgIGlmKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJnKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgaWYocmVzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldCA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKLQkvKiBDb3VsZG4ndCBmaW5kIF9fY29udGFpbnNfXy4gKi8KLQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpIHsKLQkJUHlfc3NpemVfdCByYzsKLQkJLyogQXNzdW1lIHRoZSBmYWlsdXJlIHdhcyBzaW1wbHkgZHVlIHRvIHRoYXQgdGhlcmUgaXMgbm8KLQkJICogX19jb250YWluc19fIGF0dHJpYnV0ZSwgYW5kIHRyeSBpdGVyYXRpbmcgaW5zdGVhZC4KLQkJICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJjID0gX1B5U2VxdWVuY2VfSXRlclNlYXJjaCgoUHlPYmplY3QgKilpbnN0LCBtZW1iZXIsCi0JCQkJCSAgICBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TKTsKLQkJaWYgKHJjID49IDApCi0JCQlyZXR1cm4gcmMgPiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQ291bGRuJ3QgZmluZCBfX2NvbnRhaW5zX18uICovCisgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7CisgICAgICAgIFB5X3NzaXplX3QgcmM7CisgICAgICAgIC8qIEFzc3VtZSB0aGUgZmFpbHVyZSB3YXMgc2ltcGx5IGR1ZSB0byB0aGF0IHRoZXJlIGlzIG5vCisgICAgICAgICAqIF9fY29udGFpbnNfXyBhdHRyaWJ1dGUsIGFuZCB0cnkgaXRlcmF0aW5nIGluc3RlYWQuCisgICAgICAgICAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByYyA9IF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goKFB5T2JqZWN0ICopaW5zdCwgbWVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFlfSVRFUlNFQVJDSF9DT05UQUlOUyk7CisgICAgICAgIGlmIChyYyA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIHJjID4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMKIGluc3RhbmNlX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKWluc3RhbmNlX2xlbmd0aCwJCS8qIHNxX2xlbmd0aCAqLwotCTAsCQkJCQkvKiBzcV9jb25jYXQgKi8KLQkwLAkJCQkJLyogc3FfcmVwZWF0ICovCi0JKHNzaXplYXJnZnVuYylpbnN0YW5jZV9pdGVtLAkJLyogc3FfaXRlbSAqLwotCShzc2l6ZXNzaXplYXJnZnVuYylpbnN0YW5jZV9zbGljZSwJLyogc3Ffc2xpY2UgKi8KLQkoc3NpemVvYmphcmdwcm9jKWluc3RhbmNlX2Fzc19pdGVtLAkvKiBzcV9hc3NfaXRlbSAqLwotCShzc2l6ZXNzaXplb2JqYXJncHJvYylpbnN0YW5jZV9hc3Nfc2xpY2UsLyogc3FfYXNzX3NsaWNlICovCi0JKG9iam9ianByb2MpaW5zdGFuY2VfY29udGFpbnMsCQkvKiBzcV9jb250YWlucyAqLworICAgIChsZW5mdW5jKWluc3RhbmNlX2xlbmd0aCwgICAgICAgICAgICAgICAgICAgLyogc3FfbGVuZ3RoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb25jYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdCAqLworICAgIChzc2l6ZWFyZ2Z1bmMpaW5zdGFuY2VfaXRlbSwgICAgICAgICAgICAgICAgLyogc3FfaXRlbSAqLworICAgIChzc2l6ZXNzaXplYXJnZnVuYylpbnN0YW5jZV9zbGljZSwgICAgICAgICAgLyogc3Ffc2xpY2UgKi8KKyAgICAoc3NpemVvYmphcmdwcm9jKWluc3RhbmNlX2Fzc19pdGVtLCAgICAgICAgIC8qIHNxX2Fzc19pdGVtICovCisgICAgKHNzaXplc3NpemVvYmphcmdwcm9jKWluc3RhbmNlX2Fzc19zbGljZSwvKiBzcV9hc3Nfc2xpY2UgKi8KKyAgICAob2Jqb2JqcHJvYylpbnN0YW5jZV9jb250YWlucywgICAgICAgICAgICAgIC8qIHNxX2NvbnRhaW5zICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY191bmFyeV9vcChQeUluc3RhbmNlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbWV0aG9kbmFtZSkKIHsKLQlQeU9iamVjdCAqZnVuYywgKnJlczsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlczsKIAotCWlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgbWV0aG9kbmFtZSkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzOworICAgIGlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgbWV0aG9kbmFtZSkpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuZXJpY19iaW5hcnlfb3AoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBjaGFyICpvcG5hbWUpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgb3BuYW1lKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHcpOwotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsIG9wbmFtZSk7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC0xNDI0LDcwICsxNDI0LDcwIEBACiAvKiBUcnkgb25lIGhhbGYgb2YgYSBiaW5hcnkgb3BlcmF0b3IgaW52b2x2aW5nIGEgY2xhc3MgaW5zdGFuY2UuICovCiBzdGF0aWMgUHlPYmplY3QgKgogaGFsZl9iaW5vcChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGNoYXIgKm9wbmFtZSwgYmluYXJ5ZnVuYyB0aGlzZnVuYywKLQkJaW50IHN3YXBwZWQpCisgICAgICAgICAgICAgICAgaW50IHN3YXBwZWQpCiB7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKmNvZXJjZWZ1bmM7Ci0JUHlPYmplY3QgKmNvZXJjZWQgPSBOVUxMOwotCVB5T2JqZWN0ICp2MTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpjb2VyY2VmdW5jOworICAgIFB5T2JqZWN0ICpjb2VyY2VkID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdjE7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlJbnN0YW5jZV9DaGVjayh2KSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGlmICghUHlJbnN0YW5jZV9DaGVjayh2KSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkgewotCQljb2VyY2Vfb2JqID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jb2VyY2VfXyIpOwotCQlpZiAoY29lcmNlX29iaiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNvZXJjZWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIGNvZXJjZV9vYmopOwotCWlmIChjb2VyY2VmdW5jID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiBOVUxMOwotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gZ2VuZXJpY19iaW5hcnlfb3Aodiwgdywgb3BuYW1lKTsKLQl9CisgICAgaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkgeworICAgICAgICBjb2VyY2Vfb2JqID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jb2VyY2VfXyIpOworICAgICAgICBpZiAoY29lcmNlX29iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNvZXJjZWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIGNvZXJjZV9vYmopOworICAgIGlmIChjb2VyY2VmdW5jID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gZ2VuZXJpY19iaW5hcnlfb3Aodiwgdywgb3BuYW1lKTsKKyAgICB9CiAKLQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHcpOwotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGNvZXJjZWZ1bmMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JY29lcmNlZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNvZXJjZWZ1bmMsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoY29lcmNlZnVuYyk7Ci0JaWYgKGNvZXJjZWQgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGNvZXJjZWQgPT0gUHlfTm9uZSB8fCBjb2VyY2VkID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCVB5X0RFQ1JFRihjb2VyY2VkKTsKLQkJcmV0dXJuIGdlbmVyaWNfYmluYXJ5X29wKHYsIHcsIG9wbmFtZSk7Ci0JfQotCWlmICghUHlUdXBsZV9DaGVjayhjb2VyY2VkKSB8fCBQeVR1cGxlX1NpemUoY29lcmNlZCkgIT0gMikgewotCQlQeV9ERUNSRUYoY29lcmNlZCk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNvZXJjaW9uIHNob3VsZCByZXR1cm4gTm9uZSBvciAyLXR1cGxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2MSA9IFB5VHVwbGVfR2V0SXRlbShjb2VyY2VkLCAwKTsKLQl3ID0gUHlUdXBsZV9HZXRJdGVtKGNvZXJjZWQsIDEpOwotCWlmICh2MS0+b2JfdHlwZSA9PSB2LT5vYl90eXBlICYmIFB5SW5zdGFuY2VfQ2hlY2sodikpIHsKLQkJLyogcHJldmVudCByZWN1cnNpb24gaWYgX19jb2VyY2VfXyByZXR1cm5zIHNlbGYgYXMgdGhlIGZpcnN0Ci0JCSAqIGFyZ3VtZW50ICovCi0JCXJlc3VsdCA9IGdlbmVyaWNfYmluYXJ5X29wKHYxLCB3LCBvcG5hbWUpOwotCX0gZWxzZSB7Ci0JCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBhZnRlciBjb2VyY2lvbiIpKQotCQkgICAgcmV0dXJuIE5VTEw7Ci0JCWlmIChzd2FwcGVkKQotCQkJcmVzdWx0ID0gKHRoaXNmdW5jKSh3LCB2MSk7Ci0JCWVsc2UKLQkJCXJlc3VsdCA9ICh0aGlzZnVuYykodjEsIHcpOwotCQlQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKLQl9Ci0JUHlfREVDUkVGKGNvZXJjZWQpOwotCXJldHVybiByZXN1bHQ7CisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihjb2VyY2VmdW5jKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNvZXJjZWQgPSBQeUV2YWxfQ2FsbE9iamVjdChjb2VyY2VmdW5jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGNvZXJjZWZ1bmMpOworICAgIGlmIChjb2VyY2VkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChjb2VyY2VkID09IFB5X05vbmUgfHwgY29lcmNlZCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgeworICAgICAgICBQeV9ERUNSRUYoY29lcmNlZCk7CisgICAgICAgIHJldHVybiBnZW5lcmljX2JpbmFyeV9vcCh2LCB3LCBvcG5hbWUpOworICAgIH0KKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soY29lcmNlZCkgfHwgUHlUdXBsZV9TaXplKGNvZXJjZWQpICE9IDIpIHsKKyAgICAgICAgUHlfREVDUkVGKGNvZXJjZWQpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvZXJjaW9uIHNob3VsZCByZXR1cm4gTm9uZSBvciAyLXR1cGxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2MSA9IFB5VHVwbGVfR2V0SXRlbShjb2VyY2VkLCAwKTsKKyAgICB3ID0gUHlUdXBsZV9HZXRJdGVtKGNvZXJjZWQsIDEpOworICAgIGlmICh2MS0+b2JfdHlwZSA9PSB2LT5vYl90eXBlICYmIFB5SW5zdGFuY2VfQ2hlY2sodikpIHsKKyAgICAgICAgLyogcHJldmVudCByZWN1cnNpb24gaWYgX19jb2VyY2VfXyByZXR1cm5zIHNlbGYgYXMgdGhlIGZpcnN0CisgICAgICAgICAqIGFyZ3VtZW50ICovCisgICAgICAgIHJlc3VsdCA9IGdlbmVyaWNfYmluYXJ5X29wKHYxLCB3LCBvcG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBhZnRlciBjb2VyY2lvbiIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzd2FwcGVkKQorICAgICAgICAgICAgcmVzdWx0ID0gKHRoaXNmdW5jKSh3LCB2MSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9ICh0aGlzZnVuYykodjEsIHcpOworICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICB9CisgICAgUHlfREVDUkVGKGNvZXJjZWQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEltcGxlbWVudCBhIGJpbmFyeSBvcGVyYXRvciBpbnZvbHZpbmcgYXQgbGVhc3Qgb25lIGNsYXNzIGluc3RhbmNlLiAqLwpAQCAtMTQ5NSwxMTAgKzE0OTUsMTEwIEBACiBkb19iaW5vcChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGNoYXIgKm9wbmFtZSwgY2hhciAqcm9wbmFtZSwKICAgICAgICAgICAgICAgICAgICBiaW5hcnlmdW5jIHRoaXNmdW5jKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBoYWxmX2Jpbm9wKHYsIHcsIG9wbmFtZSwgdGhpc2Z1bmMsIDApOwotCWlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJlc3VsdCA9IGhhbGZfYmlub3Aodywgdiwgcm9wbmFtZSwgdGhpc2Z1bmMsIDEpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBoYWxmX2Jpbm9wKHYsIHcsIG9wbmFtZSwgdGhpc2Z1bmMsIDApOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IGhhbGZfYmlub3Aodywgdiwgcm9wbmFtZSwgdGhpc2Z1bmMsIDEpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9fYmlub3BfaW5wbGFjZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGNoYXIgKmlvcG5hbWUsIGNoYXIgKm9wbmFtZSwKLQkJCWNoYXIgKnJvcG5hbWUsIGJpbmFyeWZ1bmMgdGhpc2Z1bmMpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyb3BuYW1lLCBiaW5hcnlmdW5jIHRoaXNmdW5jKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBoYWxmX2Jpbm9wKHYsIHcsIGlvcG5hbWUsIHRoaXNmdW5jLCAwKTsKLQlpZiAocmVzdWx0ID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBkb19iaW5vcCh2LCB3LCBvcG5hbWUsIHJvcG5hbWUsIHRoaXNmdW5jKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gaGFsZl9iaW5vcCh2LCB3LCBpb3BuYW1lLCB0aGlzZnVuYywgMCk7CisgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gZG9fYmlub3Aodiwgdywgb3BuYW1lLCByb3BuYW1lLCB0aGlzZnVuYyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQKIGluc3RhbmNlX2NvZXJjZShQeU9iamVjdCAqKnB2LCBQeU9iamVjdCAqKnB3KQogewotCVB5T2JqZWN0ICp2ID0gKnB2OwotCVB5T2JqZWN0ICp3ID0gKnB3OwotCVB5T2JqZWN0ICpjb2VyY2VmdW5jOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpjb2VyY2VkOworICAgIFB5T2JqZWN0ICp2ID0gKnB2OworICAgIFB5T2JqZWN0ICp3ID0gKnB3OworICAgIFB5T2JqZWN0ICpjb2VyY2VmdW5jOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpjb2VyY2VkOwogCi0JaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkgewotCQljb2VyY2Vfb2JqID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jb2VyY2VfXyIpOwotCQlpZiAoY29lcmNlX29iaiA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQljb2VyY2VmdW5jID0gUHlPYmplY3RfR2V0QXR0cih2LCBjb2VyY2Vfb2JqKTsKLQlpZiAoY29lcmNlZnVuYyA9PSBOVUxMKSB7Ci0JCS8qIE5vIF9fY29lcmNlX18gbWV0aG9kICovCi0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybiAxOwotCX0KLQkvKiBIYXMgX19jb2VyY2VfXyBtZXRob2Q6IGNhbGwgaXQgKi8KLQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHcpOwotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQljb2VyY2VkID0gUHlFdmFsX0NhbGxPYmplY3QoY29lcmNlZnVuYywgYXJncyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCVB5X0RFQ1JFRihjb2VyY2VmdW5jKTsKLQlpZiAoY29lcmNlZCA9PSBOVUxMKSB7Ci0JCS8qIF9fY29lcmNlX18gY2FsbCByYWlzZWQgYW4gZXhjZXB0aW9uICovCi0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGNvZXJjZWQgPT0gUHlfTm9uZSB8fCBjb2VyY2VkID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCS8qIF9fY29lcmNlX18gc2F5cyAiSSBjYW4ndCBkbyBpdCIgKi8KLQkJUHlfREVDUkVGKGNvZXJjZWQpOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKGNvZXJjZWQpIHx8IFB5VHVwbGVfU2l6ZShjb2VyY2VkKSAhPSAyKSB7Ci0JCS8qIF9fY29lcmNlX18gcmV0dXJuIHZhbHVlIGlzIG1hbGZvcm1lZCAqLwotCQlQeV9ERUNSRUYoY29lcmNlZCk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAiY29lcmNpb24gc2hvdWxkIHJldHVybiBOb25lIG9yIDItdHVwbGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiBfX2NvZXJjZV9fIHJldHVybmVkIHR3byBuZXcgdmFsdWVzICovCi0JKnB2ID0gUHlUdXBsZV9HZXRJdGVtKGNvZXJjZWQsIDApOwotCSpwdyA9IFB5VHVwbGVfR2V0SXRlbShjb2VyY2VkLCAxKTsKLQlQeV9JTkNSRUYoKnB2KTsKLQlQeV9JTkNSRUYoKnB3KTsKLQlQeV9ERUNSRUYoY29lcmNlZCk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGNvZXJjZV9vYmogPT0gTlVMTCkgeworICAgICAgICBjb2VyY2Vfb2JqID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jb2VyY2VfXyIpOworICAgICAgICBpZiAoY29lcmNlX29iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjb2VyY2VmdW5jID0gUHlPYmplY3RfR2V0QXR0cih2LCBjb2VyY2Vfb2JqKTsKKyAgICBpZiAoY29lcmNlZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIC8qIE5vIF9fY29lcmNlX18gbWV0aG9kICovCisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvKiBIYXMgX19jb2VyY2VfXyBtZXRob2Q6IGNhbGwgaXQgKi8KKyAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHcpOworICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjb2VyY2VkID0gUHlFdmFsX0NhbGxPYmplY3QoY29lcmNlZnVuYywgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihjb2VyY2VmdW5jKTsKKyAgICBpZiAoY29lcmNlZCA9PSBOVUxMKSB7CisgICAgICAgIC8qIF9fY29lcmNlX18gY2FsbCByYWlzZWQgYW4gZXhjZXB0aW9uICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGNvZXJjZWQgPT0gUHlfTm9uZSB8fCBjb2VyY2VkID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgIC8qIF9fY29lcmNlX18gc2F5cyAiSSBjYW4ndCBkbyBpdCIgKi8KKyAgICAgICAgUHlfREVDUkVGKGNvZXJjZWQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGNvZXJjZWQpIHx8IFB5VHVwbGVfU2l6ZShjb2VyY2VkKSAhPSAyKSB7CisgICAgICAgIC8qIF9fY29lcmNlX18gcmV0dXJuIHZhbHVlIGlzIG1hbGZvcm1lZCAqLworICAgICAgICBQeV9ERUNSRUYoY29lcmNlZCk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgImNvZXJjaW9uIHNob3VsZCByZXR1cm4gTm9uZSBvciAyLXR1cGxlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogX19jb2VyY2VfXyByZXR1cm5lZCB0d28gbmV3IHZhbHVlcyAqLworICAgICpwdiA9IFB5VHVwbGVfR2V0SXRlbShjb2VyY2VkLCAwKTsKKyAgICAqcHcgPSBQeVR1cGxlX0dldEl0ZW0oY29lcmNlZCwgMSk7CisgICAgUHlfSU5DUkVGKCpwdik7CisgICAgUHlfSU5DUkVGKCpwdyk7CisgICAgUHlfREVDUkVGKGNvZXJjZWQpOworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIFVOQVJZKGZ1bmNuYW1lLCBtZXRob2RuYW1lKSBcCiBzdGF0aWMgUHlPYmplY3QgKmZ1bmNuYW1lKFB5SW5zdGFuY2VPYmplY3QgKnNlbGYpIHsgXAotCXN0YXRpYyBQeU9iamVjdCAqbzsgXAotCWlmIChvID09IE5VTEwpIHsgbyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobWV0aG9kbmFtZSk7IFwKLQkJCSBpZiAobyA9PSBOVUxMKSByZXR1cm4gTlVMTDsgfSBcCi0JcmV0dXJuIGdlbmVyaWNfdW5hcnlfb3Aoc2VsZiwgbyk7IFwKKyAgICBzdGF0aWMgUHlPYmplY3QgKm87IFwKKyAgICBpZiAobyA9PSBOVUxMKSB7IG8gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKG1ldGhvZG5hbWUpOyBcCisgICAgICAgICAgICAgICAgICAgICBpZiAobyA9PSBOVUxMKSByZXR1cm4gTlVMTDsgfSBcCisgICAgcmV0dXJuIGdlbmVyaWNfdW5hcnlfb3Aoc2VsZiwgbyk7IFwKIH0KIAogLyogdW5hcnkgZnVuY3Rpb24gd2l0aCBhIGZhbGxiYWNrICovCiAjZGVmaW5lIFVOQVJZX0ZCKGZ1bmNuYW1lLCBtZXRob2RuYW1lLCBmdW5jbmFtZV9mYikgXAogc3RhdGljIFB5T2JqZWN0ICpmdW5jbmFtZShQeUluc3RhbmNlT2JqZWN0ICpzZWxmKSB7IFwKLQlzdGF0aWMgUHlPYmplY3QgKm87IFwKLQlpZiAobyA9PSBOVUxMKSB7IG8gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKG1ldGhvZG5hbWUpOyBcCi0JCQkgaWYgKG8gPT0gTlVMTCkgcmV0dXJuIE5VTEw7IH0gXAotCWlmIChQeU9iamVjdF9IYXNBdHRyKChQeU9iamVjdCopc2VsZiwgbykpIFwKLQkJcmV0dXJuIGdlbmVyaWNfdW5hcnlfb3Aoc2VsZiwgbyk7IFwKLQllbHNlIFwKLQkJcmV0dXJuIGZ1bmNuYW1lX2ZiKHNlbGYpOyBcCisgICAgc3RhdGljIFB5T2JqZWN0ICpvOyBcCisgICAgaWYgKG8gPT0gTlVMTCkgeyBvID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhtZXRob2RuYW1lKTsgXAorICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPT0gTlVMTCkgcmV0dXJuIE5VTEw7IH0gXAorICAgIGlmIChQeU9iamVjdF9IYXNBdHRyKChQeU9iamVjdCopc2VsZiwgbykpIFwKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNfdW5hcnlfb3Aoc2VsZiwgbyk7IFwKKyAgICBlbHNlIFwKKyAgICAgICAgcmV0dXJuIGZ1bmNuYW1lX2ZiKHNlbGYpOyBcCiB9CiAKICNkZWZpbmUgQklOQVJZKGYsIG0sIG4pIFwKIHN0YXRpYyBQeU9iamVjdCAqZihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpIHsgXAotCXJldHVybiBkb19iaW5vcCh2LCB3LCAiX18iIG0gIl9fIiwgIl9fciIgbSAiX18iLCBuKTsgXAorICAgIHJldHVybiBkb19iaW5vcCh2LCB3LCAiX18iIG0gIl9fIiwgIl9fciIgbSAiX18iLCBuKTsgXAogfQogCiAjZGVmaW5lIEJJTkFSWV9JTlBMQUNFKGYsIG0sIG4pIFwKIHN0YXRpYyBQeU9iamVjdCAqZihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpIHsgXAotCXJldHVybiBkb19iaW5vcF9pbnBsYWNlKHYsIHcsICJfX2kiIG0gIl9fIiwgIl9fIiBtICJfXyIsIFwKLQkJCSJfX3IiIG0gIl9fIiwgbik7IFwKKyAgICByZXR1cm4gZG9fYmlub3BfaW5wbGFjZSh2LCB3LCAiX19pIiBtICJfXyIsICJfXyIgbSAiX18iLCBcCisgICAgICAgICAgICAgICAgICAgICJfX3IiIG0gIl9fIiwgbik7IFwKIH0KIAogVU5BUlkoaW5zdGFuY2VfbmVnLCAiX19uZWdfXyIpCkBAIC0xNjQyLDU1ICsxNjQyLDU1IEBACiBzdGF0aWMgaW50CiBoYWxmX2NtcChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjbXBfb2JqOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpjbXBfZnVuYzsKLQlQeU9iamVjdCAqcmVzdWx0OwotCWxvbmcgbDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNtcF9vYmo7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKmNtcF9mdW5jOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgbG9uZyBsOwogCi0JYXNzZXJ0KFB5SW5zdGFuY2VfQ2hlY2sodikpOworICAgIGFzc2VydChQeUluc3RhbmNlX0NoZWNrKHYpKTsKIAotCWlmIChjbXBfb2JqID09IE5VTEwpIHsKLQkJY21wX29iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY21wX18iKTsKLQkJaWYgKGNtcF9vYmogPT0gTlVMTCkKLQkJCXJldHVybiAtMjsKLQl9CisgICAgaWYgKGNtcF9vYmogPT0gTlVMTCkgeworICAgICAgICBjbXBfb2JqID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19jbXBfXyIpOworICAgICAgICBpZiAoY21wX29iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgIH0KIAotCWNtcF9mdW5jID0gUHlPYmplY3RfR2V0QXR0cih2LCBjbXBfb2JqKTsKLQlpZiAoY21wX2Z1bmMgPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIC0yOwotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gMjsKLQl9CisgICAgY21wX2Z1bmMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIGNtcF9vYmopOworICAgIGlmIChjbXBfZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KIAotCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdyk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoY21wX2Z1bmMpOwotCQlyZXR1cm4gLTI7Ci0JfQorICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgdyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoY21wX2Z1bmMpOworICAgICAgICByZXR1cm4gLTI7CisgICAgfQogCi0JcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoY21wX2Z1bmMsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoY21wX2Z1bmMpOworICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNtcF9mdW5jLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGNtcF9mdW5jKTsKIAotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIC0yOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0yOwogCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIDI7Ci0JfQorICAgIGlmIChyZXN1bHQgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KIAotCWwgPSBQeUludF9Bc0xvbmcocmVzdWx0KTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlpZiAobCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjb21wYXJpc29uIGRpZCBub3QgcmV0dXJuIGFuIGludCIpOwotCQlyZXR1cm4gLTI7Ci0JfQorICAgIGwgPSBQeUludF9Bc0xvbmcocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBpZiAobCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY29tcGFyaXNvbiBkaWQgbm90IHJldHVybiBhbiBpbnQiKTsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KIAotCXJldHVybiBsIDwgMCA/IC0xIDogbCA+IDAgPyAxIDogMDsKKyAgICByZXR1cm4gbCA8IDAgPyAtMSA6IGwgPiAwID8gMSA6IDA7CiB9CiAKIC8qIFRyeSBhIDMtd2F5IGNvbXBhcmlzb24sIHJldHVybmluZyBhbiBpbnQ7IGVpdGhlciB2IG9yIHcgaXMgYW4gaW5zdGFuY2UuCkBAIC0xNzA1LDEyNCArMTcwNSwxMjQgQEAKIHN0YXRpYyBpbnQKIGluc3RhbmNlX2NvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCWludCBjOworICAgIGludCBjOwogCi0JYyA9IFB5TnVtYmVyX0NvZXJjZUV4KCZ2LCAmdyk7Ci0JaWYgKGMgPCAwKQotCQlyZXR1cm4gLTI7Ci0JaWYgKGMgPT0gMCkgewotCQkvKiBJZiBuZWl0aGVyIGlzIG5vdyBhbiBpbnN0YW5jZSwgdXNlIHJlZ3VsYXIgY29tcGFyaXNvbiAqLwotCQlpZiAoIVB5SW5zdGFuY2VfQ2hlY2sodikgJiYgIVB5SW5zdGFuY2VfQ2hlY2sodykpIHsKLQkJCWMgPSBQeU9iamVjdF9Db21wYXJlKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0yOwotCQkJcmV0dXJuIGMgPCAwID8gLTEgOiBjID4gMCA/IDEgOiAwOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBUaGUgY29lcmNpb24gZGlkbid0IGRvIGFueXRoaW5nLgotCQkgICBUcmVhdCB0aGlzIHRoZSBzYW1lIGFzIHJldHVybmluZyB2IGFuZCB3IHVuY2hhbmdlZC4gKi8KLQkJUHlfSU5DUkVGKHYpOwotCQlQeV9JTkNSRUYodyk7Ci0JfQorICAgIGMgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOworICAgIGlmIChjIDwgMCkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmIChjID09IDApIHsKKyAgICAgICAgLyogSWYgbmVpdGhlciBpcyBub3cgYW4gaW5zdGFuY2UsIHVzZSByZWd1bGFyIGNvbXBhcmlzb24gKi8KKyAgICAgICAgaWYgKCFQeUluc3RhbmNlX0NoZWNrKHYpICYmICFQeUluc3RhbmNlX0NoZWNrKHcpKSB7CisgICAgICAgICAgICBjID0gUHlPYmplY3RfQ29tcGFyZSh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgICAgIHJldHVybiBjIDwgMCA/IC0xIDogYyA+IDAgPyAxIDogMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogVGhlIGNvZXJjaW9uIGRpZG4ndCBkbyBhbnl0aGluZy4KKyAgICAgICAgICAgVHJlYXQgdGhpcyB0aGUgc2FtZSBhcyByZXR1cm5pbmcgdiBhbmQgdyB1bmNoYW5nZWQuICovCisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgUHlfSU5DUkVGKHcpOworICAgIH0KIAotCWlmIChQeUluc3RhbmNlX0NoZWNrKHYpKSB7Ci0JCWMgPSBoYWxmX2NtcCh2LCB3KTsKLQkJaWYgKGMgPD0gMSkgewotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJcmV0dXJuIGM7Ci0JCX0KLQl9Ci0JaWYgKFB5SW5zdGFuY2VfQ2hlY2sodykpIHsKLQkJYyA9IGhhbGZfY21wKHcsIHYpOwotCQlpZiAoYyA8PSAxKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlpZiAoYyA+PSAtMSkKLQkJCQljID0gLWM7Ci0JCQlyZXR1cm4gYzsKLQkJfQotCX0KLQlQeV9ERUNSRUYodik7Ci0JUHlfREVDUkVGKHcpOwotCXJldHVybiAyOworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHYpKSB7CisgICAgICAgIGMgPSBoYWxmX2NtcCh2LCB3KTsKKyAgICAgICAgaWYgKGMgPD0gMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKFB5SW5zdGFuY2VfQ2hlY2sodykpIHsKKyAgICAgICAgYyA9IGhhbGZfY21wKHcsIHYpOworICAgICAgICBpZiAoYyA8PSAxKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBpZiAoYyA+PSAtMSkKKyAgICAgICAgICAgICAgICBjID0gLWM7CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYodik7CisgICAgUHlfREVDUkVGKHcpOworICAgIHJldHVybiAyOwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZV9ub256ZXJvKFB5SW5zdGFuY2VPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7Ci0JbG9uZyBvdXRjb21lOwotCXN0YXRpYyBQeU9iamVjdCAqbm9uemVyb3N0cjsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJlczsKKyAgICBsb25nIG91dGNvbWU7CisgICAgc3RhdGljIFB5T2JqZWN0ICpub256ZXJvc3RyOwogCi0JaWYgKG5vbnplcm9zdHIgPT0gTlVMTCkgewotCQlub256ZXJvc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19ub256ZXJvX18iKTsKLQkJaWYgKG5vbnplcm9zdHIgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBub256ZXJvc3RyKSkgPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIC0xOwotCQlQeUVycl9DbGVhcigpOwotCQlpZiAobGVuc3RyID09IE5VTEwpIHsKLQkJCWxlbnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbGVuX18iKTsKLQkJCWlmIChsZW5zdHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBsZW5zdHIpKSA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiAtMTsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkvKiBGYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3I6Ci0JCQkgICBhbGwgaW5zdGFuY2VzIGFyZSBub256ZXJvICovCi0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFQeUludF9DaGVjayhyZXMpKSB7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX25vbnplcm9fXyBzaG91bGQgcmV0dXJuIGFuIGludCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW91dGNvbWUgPSBQeUludF9Bc0xvbmcocmVzKTsKLQlQeV9ERUNSRUYocmVzKTsKLQlpZiAob3V0Y29tZSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIl9fbm9uemVyb19fIHNob3VsZCByZXR1cm4gPj0gMCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBvdXRjb21lID4gMDsKKyAgICBpZiAobm9uemVyb3N0ciA9PSBOVUxMKSB7CisgICAgICAgIG5vbnplcm9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25vbnplcm9fXyIpOworICAgICAgICBpZiAobm9uemVyb3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIG5vbnplcm9zdHIpKSA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChsZW5zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgbGVuc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19sZW5fXyIpOworICAgICAgICAgICAgaWYgKGxlbnN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIGxlbnN0cikpID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIC8qIEZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvcjoKKyAgICAgICAgICAgICAgIGFsbCBpbnN0YW5jZXMgYXJlIG5vbnplcm8gKi8KKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIVB5SW50X0NoZWNrKHJlcykpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19ub256ZXJvX18gc2hvdWxkIHJldHVybiBhbiBpbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBvdXRjb21lID0gUHlJbnRfQXNMb25nKHJlcyk7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgaWYgKG91dGNvbWUgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fbm9uemVyb19fIHNob3VsZCByZXR1cm4gPj0gMCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBvdXRjb21lID4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX2luZGV4KFB5SW5zdGFuY2VPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICppbmRleHN0ciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICppbmRleHN0ciA9IE5VTEw7CiAKLQlpZiAoaW5kZXhzdHIgPT0gTlVMTCkgewotCQlpbmRleHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faW5kZXhfXyIpOwotCQlpZiAoaW5kZXhzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0JCi0JaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBpbmRleHN0cikpID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCXJldHVybiBOVUxMOwotCQlQeUVycl9DbGVhcigpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKLQkJCQkib2JqZWN0IGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBpbmRleCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCXJldHVybiByZXM7CisgICAgaWYgKGluZGV4c3RyID09IE5VTEwpIHsKKyAgICAgICAgaW5kZXhzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2luZGV4X18iKTsKKyAgICAgICAgaWYgKGluZGV4c3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBpbmRleHN0cikpID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gaW5kZXgiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAKQEAgLTE4MzIsMjIgKzE4MzIsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZV9pbnQoUHlJbnN0YW5jZU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqdHJ1bmNhdGVkOwotCXN0YXRpYyBQeU9iamVjdCAqaW50X25hbWU7Ci0JaWYgKGludF9uYW1lID09IE5VTEwpIHsKLQkJaW50X25hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2ludF9fIik7Ci0JCWlmIChpbnRfbmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeU9iamVjdF9IYXNBdHRyKChQeU9iamVjdCopc2VsZiwgaW50X25hbWUpKQotCQlyZXR1cm4gZ2VuZXJpY191bmFyeV9vcChzZWxmLCBpbnRfbmFtZSk7CisgICAgUHlPYmplY3QgKnRydW5jYXRlZDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmludF9uYW1lOworICAgIGlmIChpbnRfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGludF9uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pbnRfXyIpOworICAgICAgICBpZiAoaW50X25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfSGFzQXR0cigoUHlPYmplY3QqKXNlbGYsIGludF9uYW1lKSkKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNfdW5hcnlfb3Aoc2VsZiwgaW50X25hbWUpOwogCi0JdHJ1bmNhdGVkID0gX2luc3RhbmNlX3RydW5jKHNlbGYpOwotCS8qIF9fdHJ1bmNfXyBpcyBzcGVjaWZpZWQgdG8gcmV0dXJuIGFuIEludGVncmFsIHR5cGUsIGJ1dAotCSAgIGludCgpIG5lZWRzIHRvIHJldHVybiBhbiBpbnQuICovCi0JcmV0dXJuIF9QeU51bWJlcl9Db252ZXJ0SW50ZWdyYWxUb0ludCgKLQkJdHJ1bmNhdGVkLAotCQkiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSAlLjIwMHMpIik7CisgICAgdHJ1bmNhdGVkID0gX2luc3RhbmNlX3RydW5jKHNlbGYpOworICAgIC8qIF9fdHJ1bmNfXyBpcyBzcGVjaWZpZWQgdG8gcmV0dXJuIGFuIEludGVncmFsIHR5cGUsIGJ1dAorICAgICAgIGludCgpIG5lZWRzIHRvIHJldHVybiBhbiBpbnQuICovCisgICAgcmV0dXJuIF9QeU51bWJlcl9Db252ZXJ0SW50ZWdyYWxUb0ludCgKKyAgICAgICAgdHJ1bmNhdGVkLAorICAgICAgICAiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCAodHlwZSAlLjIwMHMpIik7CiB9CiAKIFVOQVJZX0ZCKGluc3RhbmNlX2xvbmcsICJfX2xvbmdfXyIsIGluc3RhbmNlX2ludCkKQEAgLTE4NTgsNzQgKzE4NTgsNzQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBiaW5fcG93ZXIoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCXJldHVybiBQeU51bWJlcl9Qb3dlcih2LCB3LCBQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlOdW1iZXJfUG93ZXIodiwgdywgUHlfTm9uZSk7CiB9CiAKIC8qIFRoaXMgdmVyc2lvbiBpcyBmb3IgdGVybmFyeSBjYWxscyBvbmx5ICh6ICE9IE5vbmUpICovCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfcG93KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgUHlPYmplY3QgKnopCiB7Ci0JaWYgKHogPT0gUHlfTm9uZSkgewotCQlyZXR1cm4gZG9fYmlub3AodiwgdywgIl9fcG93X18iLCAiX19ycG93X18iLCBiaW5fcG93ZXIpOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3QgKmZ1bmM7Ci0JCVB5T2JqZWN0ICphcmdzOwotCQlQeU9iamVjdCAqcmVzdWx0OworICAgIGlmICh6ID09IFB5X05vbmUpIHsKKyAgICAgICAgcmV0dXJuIGRvX2Jpbm9wKHYsIHcsICJfX3Bvd19fIiwgIl9fcnBvd19fIiwgYmluX3Bvd2VyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpmdW5jOworICAgICAgICBQeU9iamVjdCAqYXJnczsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCQkvKiBYWFggRG9lc24ndCBkbyBjb2VyY2lvbnMuLi4gKi8KLQkJZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9fcG93X18iKTsKLQkJaWYgKGZ1bmMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlhcmdzID0gUHlUdXBsZV9QYWNrKDIsIHcsIHopOwotCQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgICAgICAvKiBYWFggRG9lc24ndCBkbyBjb2VyY2lvbnMuLi4gKi8KKyAgICAgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9fcG93X18iKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDIsIHcsIHopOworICAgICAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYmluX2lucGxhY2VfcG93ZXIoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCXJldHVybiBQeU51bWJlcl9JblBsYWNlUG93ZXIodiwgdywgUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5TnVtYmVyX0luUGxhY2VQb3dlcih2LCB3LCBQeV9Ob25lKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfaXBvdyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp6KQogewotCWlmICh6ID09IFB5X05vbmUpIHsKLQkJcmV0dXJuIGRvX2Jpbm9wX2lucGxhY2UodiwgdywgIl9faXBvd19fIiwgIl9fcG93X18iLAotCQkJIl9fcnBvd19fIiwgYmluX2lucGxhY2VfcG93ZXIpOwotCX0KLQllbHNlIHsKLQkJLyogWFhYIERvZXNuJ3QgZG8gY29lcmNpb25zLi4uICovCi0JCVB5T2JqZWN0ICpmdW5jOwotCQlQeU9iamVjdCAqYXJnczsKLQkJUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpZiAoeiA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJldHVybiBkb19iaW5vcF9pbnBsYWNlKHYsIHcsICJfX2lwb3dfXyIsICJfX3Bvd19fIiwKKyAgICAgICAgICAgICJfX3Jwb3dfXyIsIGJpbl9pbnBsYWNlX3Bvd2VyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFhYWCBEb2Vzbid0IGRvIGNvZXJjaW9ucy4uLiAqLworICAgICAgICBQeU9iamVjdCAqZnVuYzsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQkJZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgIl9faXBvd19fIik7Ci0JCWlmIChmdW5jID09IE5VTEwpIHsKLQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJcmV0dXJuIGluc3RhbmNlX3Bvdyh2LCB3LCB6KTsKLQkJfQotCQlhcmdzID0gUHlUdXBsZV9QYWNrKDIsIHcsIHopOwotCQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQorICAgICAgICBmdW5jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCAiX19pcG93X18iKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2VfcG93KHYsIHcsIHopOworICAgICAgICB9CisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMiwgdywgeik7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiB9CiAKIApAQCAtMTkzNiw5MyArMTkzNiw5MyBAQAogc3RhdGljIGludAogaW5pdF9uYW1lX29wKHZvaWQpCiB7Ci0JaW50IGk7Ci0JY2hhciAqX25hbWVfb3BbXSA9IHsKLQkJIl9fbHRfXyIsCi0JCSJfX2xlX18iLAotCQkiX19lcV9fIiwKLQkJIl9fbmVfXyIsCi0JCSJfX2d0X18iLAotCQkiX19nZV9fIiwKLQl9OworICAgIGludCBpOworICAgIGNoYXIgKl9uYW1lX29wW10gPSB7CisgICAgICAgICJfX2x0X18iLAorICAgICAgICAiX19sZV9fIiwKKyAgICAgICAgIl9fZXFfXyIsCisgICAgICAgICJfX25lX18iLAorICAgICAgICAiX19ndF9fIiwKKyAgICAgICAgIl9fZ2VfXyIsCisgICAgfTsKIAotCW5hbWVfb3AgPSAoUHlPYmplY3QgKiopbWFsbG9jKHNpemVvZihQeU9iamVjdCAqKSAqIE5BTUVfT1BTKTsKLQlpZiAobmFtZV9vcCA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZm9yIChpID0gMDsgaSA8IE5BTUVfT1BTOyArK2kpIHsKLQkJbmFtZV9vcFtpXSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoX25hbWVfb3BbaV0pOwotCQlpZiAobmFtZV9vcFtpXSA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBuYW1lX29wID0gKFB5T2JqZWN0ICoqKW1hbGxvYyhzaXplb2YoUHlPYmplY3QgKikgKiBOQU1FX09QUyk7CisgICAgaWYgKG5hbWVfb3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBOQU1FX09QUzsgKytpKSB7CisgICAgICAgIG5hbWVfb3BbaV0gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKF9uYW1lX29wW2ldKTsKKyAgICAgICAgaWYgKG5hbWVfb3BbaV0gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBoYWxmX3JpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5T2JqZWN0ICptZXRob2Q7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqbWV0aG9kOworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlhc3NlcnQoUHlJbnN0YW5jZV9DaGVjayh2KSk7CisgICAgYXNzZXJ0KFB5SW5zdGFuY2VfQ2hlY2sodikpOwogCi0JaWYgKG5hbWVfb3AgPT0gTlVMTCkgewotCQlpZiAoaW5pdF9uYW1lX29wKCkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIElmIHRoZSBpbnN0YW5jZSBkb2Vzbid0IGRlZmluZSBhbiBfX2dldGF0dHJfXyBtZXRob2QsIHVzZQotCSAgIGluc3RhbmNlX2dldGF0dHIyIGRpcmVjdGx5IGJlY2F1c2UgaXQgd2lsbCBub3Qgc2V0IGFuCi0JICAgZXhjZXB0aW9uIG9uIGZhaWx1cmUuICovCi0JaWYgKCgoUHlJbnN0YW5jZU9iamVjdCAqKXYpLT5pbl9jbGFzcy0+Y2xfZ2V0YXR0ciA9PSBOVUxMKQotCQltZXRob2QgPSBpbnN0YW5jZV9nZXRhdHRyMigoUHlJbnN0YW5jZU9iamVjdCAqKXYsCi0JCQkJCSAgIG5hbWVfb3Bbb3BdKTsKLQllbHNlCi0JCW1ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZV9vcFtvcF0pOwotCWlmIChtZXRob2QgPT0gTlVMTCkgewotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQkJcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JCVB5X0lOQ1JFRihyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KKyAgICBpZiAobmFtZV9vcCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChpbml0X25hbWVfb3AoKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogSWYgdGhlIGluc3RhbmNlIGRvZXNuJ3QgZGVmaW5lIGFuIF9fZ2V0YXR0cl9fIG1ldGhvZCwgdXNlCisgICAgICAgaW5zdGFuY2VfZ2V0YXR0cjIgZGlyZWN0bHkgYmVjYXVzZSBpdCB3aWxsIG5vdCBzZXQgYW4KKyAgICAgICBleGNlcHRpb24gb24gZmFpbHVyZS4gKi8KKyAgICBpZiAoKChQeUluc3RhbmNlT2JqZWN0ICopdiktPmluX2NsYXNzLT5jbF9nZXRhdHRyID09IE5VTEwpCisgICAgICAgIG1ldGhvZCA9IGluc3RhbmNlX2dldGF0dHIyKChQeUluc3RhbmNlT2JqZWN0ICopdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9vcFtvcF0pOworICAgIGVsc2UKKyAgICAgICAgbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0cih2LCBuYW1lX29wW29wXSk7CisgICAgaWYgKG1ldGhvZCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCi0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihtZXRob2QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB3KTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihtZXRob2QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChtZXRob2QsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYobWV0aG9kKTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChtZXRob2QsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYobWV0aG9kKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlX3JpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChQeUluc3RhbmNlX0NoZWNrKHYpKSB7Ci0JCXJlcyA9IGhhbGZfcmljaGNvbXBhcmUodiwgdywgb3ApOwotCQlpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQotCQkJcmV0dXJuIHJlczsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JfQorICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHYpKSB7CisgICAgICAgIHJlcyA9IGhhbGZfcmljaGNvbXBhcmUodiwgdywgb3ApOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQogCi0JaWYgKFB5SW5zdGFuY2VfQ2hlY2sodykpIHsKLQkJcmVzID0gaGFsZl9yaWNoY29tcGFyZSh3LCB2LCBfUHlfU3dhcHBlZE9wW29wXSk7Ci0JCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzOwotCQlQeV9ERUNSRUYocmVzKTsKLQl9CisgICAgaWYgKFB5SW5zdGFuY2VfQ2hlY2sodykpIHsKKyAgICAgICAgcmVzID0gaGFsZl9yaWNoY29tcGFyZSh3LCB2LCBfUHlfU3dhcHBlZE9wW29wXSk7CisgICAgICAgIGlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKIH0KIAogCkBAIC0yMDMwLDQyICsyMDMwLDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfZ2V0aXRlcihQeUluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpmdW5jOwogCi0JaWYgKGl0ZXJzdHIgPT0gTlVMTCkgewotCQlpdGVyc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19pdGVyX18iKTsKLQkJaWYgKGl0ZXJzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKSB7Ci0JCWdldGl0ZW1zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGl0ZW1fXyIpOwotCQlpZiAoZ2V0aXRlbXN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChpdGVyc3RyID09IE5VTEwpIHsKKyAgICAgICAgaXRlcnN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faXRlcl9fIik7CisgICAgICAgIGlmIChpdGVyc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkgeworICAgICAgICBnZXRpdGVtc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRpdGVtX18iKTsKKyAgICAgICAgaWYgKGdldGl0ZW1zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgaXRlcnN0cikpICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOwotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCWlmIChyZXMgIT0gTlVMTCAmJiAhUHlJdGVyX0NoZWNrKHJlcykpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiX19pdGVyX18gcmV0dXJuZWQgbm9uLWl0ZXJhdG9yICIKLQkJCQkgICAgICJvZiB0eXBlICclLjEwMHMnIiwKLQkJCQkgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJCXJlcyA9IE5VTEw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlFcnJfQ2xlYXIoKTsKLQlpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIGdldGl0ZW1zdHIpKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIml0ZXJhdGlvbiBvdmVyIG5vbi1zZXF1ZW5jZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfREVDUkVGKGZ1bmMpOwotCXJldHVybiBQeVNlcUl0ZXJfTmV3KChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmICgoZnVuYyA9IGluc3RhbmNlX2dldGF0dHIoc2VsZiwgaXRlcnN0cikpICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIGlmIChyZXMgIT0gTlVMTCAmJiAhUHlJdGVyX0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9faXRlcl9fIHJldHVybmVkIG5vbi1pdGVyYXRvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHR5cGUgJyUuMTAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIGdldGl0ZW1zdHIpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIFB5U2VxSXRlcl9OZXcoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIApAQCAtMjA3MywxNDYgKzIwNzMsMTQ2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfaXRlcm5leHQoUHlJbnN0YW5jZU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqZnVuYzsKIAotCWlmIChuZXh0c3RyID09IE5VTEwpIHsKLQkJbmV4dHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIm5leHQiKTsKLQkJaWYgKG5leHRzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobmV4dHN0ciA9PSBOVUxMKSB7CisgICAgICAgIG5leHRzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJuZXh0Iik7CisgICAgICAgIGlmIChuZXh0c3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoKGZ1bmMgPSBpbnN0YW5jZV9nZXRhdHRyKHNlbGYsIG5leHRzdHIpKSAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCAoUHlPYmplY3QgKilOVUxMKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlpZiAocmVzICE9IE5VTEwpIHsKLQkJCXJldHVybiByZXM7Ci0JCX0KLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImluc3RhbmNlIGhhcyBubyBuZXh0KCkgbWV0aG9kIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKChmdW5jID0gaW5zdGFuY2VfZ2V0YXR0cihzZWxmLCBuZXh0c3RyKSkgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJpbnN0YW5jZSBoYXMgbm8gbmV4dCgpIG1ldGhvZCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VfY2FsbChQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpyZXMsICpjYWxsID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmdW5jLCAiX19jYWxsX18iKTsKLQlpZiAoY2FsbCA9PSBOVUxMKSB7Ci0JCVB5SW5zdGFuY2VPYmplY3QgKmluc3QgPSAoUHlJbnN0YW5jZU9iamVjdCopIGZ1bmM7Ci0JCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICAgICAiJS4yMDBzIGluc3RhbmNlIGhhcyBubyBfX2NhbGxfXyBtZXRob2QiLAotCQkJICAgICBQeVN0cmluZ19Bc1N0cmluZyhpbnN0LT5pbl9jbGFzcy0+Y2xfbmFtZSkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogV2UgbXVzdCBjaGVjayBhbmQgaW5jcmVtZW50IHRoZSByZWN1cnNpb24gZGVwdGggaGVyZS4gU2NlbmFyaW86Ci0JICAgICAgIGNsYXNzIEE6Ci0JICAgICAgICAgICBwYXNzCi0JICAgICAgIEEuX19jYWxsX18gPSBBKCkgIyB0aGF0J3MgcmlnaHQKLQkgICAgICAgYSA9IEEoKSAjIG9rCi0JICAgICAgIGEoKSAjIGluZmluaXRlIHJlY3Vyc2lvbgotCSAgIFRoaXMgYm91bmNlcyBiZXR3ZWVuIGluc3RhbmNlX2NhbGwoKSBhbmQgUHlPYmplY3RfQ2FsbCgpIHdpdGhvdXQKLQkgICBldmVyIGhpdHRpbmcgZXZhbF9mcmFtZSgpICh3aGljaCBoYXMgdGhlIG1haW4gcmVjdXJzaW9uIGNoZWNrKS4gKi8KLQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gX19jYWxsX18iKSkgewotCQlyZXMgPSBOVUxMOwotCX0KLQllbHNlIHsKLQkJcmVzID0gUHlPYmplY3RfQ2FsbChjYWxsLCBhcmcsIGt3KTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JfQotCVB5X0RFQ1JFRihjYWxsKTsKLQlyZXR1cm4gcmVzOworICAgIFB5T2JqZWN0ICpyZXMsICpjYWxsID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmdW5jLCAiX19jYWxsX18iKTsKKyAgICBpZiAoY2FsbCA9PSBOVUxMKSB7CisgICAgICAgIFB5SW5zdGFuY2VPYmplY3QgKmluc3QgPSAoUHlJbnN0YW5jZU9iamVjdCopIGZ1bmM7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcyBpbnN0YW5jZSBoYXMgbm8gX19jYWxsX18gbWV0aG9kIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGluc3QtPmluX2NsYXNzLT5jbF9uYW1lKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBXZSBtdXN0IGNoZWNrIGFuZCBpbmNyZW1lbnQgdGhlIHJlY3Vyc2lvbiBkZXB0aCBoZXJlLiBTY2VuYXJpbzoKKyAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgcGFzcworICAgICAgICAgICBBLl9fY2FsbF9fID0gQSgpICMgdGhhdCdzIHJpZ2h0CisgICAgICAgICAgIGEgPSBBKCkgIyBvaworICAgICAgICAgICBhKCkgIyBpbmZpbml0ZSByZWN1cnNpb24KKyAgICAgICBUaGlzIGJvdW5jZXMgYmV0d2VlbiBpbnN0YW5jZV9jYWxsKCkgYW5kIFB5T2JqZWN0X0NhbGwoKSB3aXRob3V0CisgICAgICAgZXZlciBoaXR0aW5nIGV2YWxfZnJhbWUoKSAod2hpY2ggaGFzIHRoZSBtYWluIHJlY3Vyc2lvbiBjaGVjaykuICovCisgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIF9fY2FsbF9fIikpIHsKKyAgICAgICAgcmVzID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoY2FsbCwgYXJnLCBrdyk7CisgICAgICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgIH0KKyAgICBQeV9ERUNSRUYoY2FsbCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGluc3RhbmNlX2FzX251bWJlciA9IHsKLQlpbnN0YW5jZV9hZGQsCQkJLyogbmJfYWRkICovCi0JaW5zdGFuY2Vfc3ViLAkJCS8qIG5iX3N1YnRyYWN0ICovCi0JaW5zdGFuY2VfbXVsLAkJCS8qIG5iX211bHRpcGx5ICovCi0JaW5zdGFuY2VfZGl2LAkJCS8qIG5iX2RpdmlkZSAqLwotCWluc3RhbmNlX21vZCwJCQkvKiBuYl9yZW1haW5kZXIgKi8KLQlpbnN0YW5jZV9kaXZtb2QsCQkvKiBuYl9kaXZtb2QgKi8KLQlpbnN0YW5jZV9wb3csCQkJLyogbmJfcG93ZXIgKi8KLQkodW5hcnlmdW5jKWluc3RhbmNlX25lZywJLyogbmJfbmVnYXRpdmUgKi8KLQkodW5hcnlmdW5jKWluc3RhbmNlX3BvcywJLyogbmJfcG9zaXRpdmUgKi8KLQkodW5hcnlmdW5jKWluc3RhbmNlX2FicywJLyogbmJfYWJzb2x1dGUgKi8KLQkoaW5xdWlyeSlpbnN0YW5jZV9ub256ZXJvLAkvKiBuYl9ub256ZXJvICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9pbnZlcnQsCS8qIG5iX2ludmVydCAqLwotCWluc3RhbmNlX2xzaGlmdCwJCS8qIG5iX2xzaGlmdCAqLwotCWluc3RhbmNlX3JzaGlmdCwJCS8qIG5iX3JzaGlmdCAqLwotCWluc3RhbmNlX2FuZCwJCQkvKiBuYl9hbmQgKi8KLQlpbnN0YW5jZV94b3IsCQkJLyogbmJfeG9yICovCi0JaW5zdGFuY2Vfb3IsCQkJLyogbmJfb3IgKi8KLQlpbnN0YW5jZV9jb2VyY2UsCQkvKiBuYl9jb2VyY2UgKi8KLQkodW5hcnlmdW5jKWluc3RhbmNlX2ludCwJLyogbmJfaW50ICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9sb25nLAkvKiBuYl9sb25nICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9mbG9hdCwJLyogbmJfZmxvYXQgKi8KLQkodW5hcnlmdW5jKWluc3RhbmNlX29jdCwJLyogbmJfb2N0ICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9oZXgsCS8qIG5iX2hleCAqLwotCWluc3RhbmNlX2lhZGQsCQkJLyogbmJfaW5wbGFjZV9hZGQgKi8KLQlpbnN0YW5jZV9pc3ViLAkJCS8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KLQlpbnN0YW5jZV9pbXVsLAkJCS8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KLQlpbnN0YW5jZV9pZGl2LAkJCS8qIG5iX2lucGxhY2VfZGl2aWRlICovCi0JaW5zdGFuY2VfaW1vZCwJCQkvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLwotCWluc3RhbmNlX2lwb3csCQkJLyogbmJfaW5wbGFjZV9wb3dlciAqLwotCWluc3RhbmNlX2lsc2hpZnQsCQkvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLwotCWluc3RhbmNlX2lyc2hpZnQsCQkvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLwotCWluc3RhbmNlX2lhbmQsCQkJLyogbmJfaW5wbGFjZV9hbmQgKi8KLQlpbnN0YW5jZV9peG9yLAkJCS8qIG5iX2lucGxhY2VfeG9yICovCi0JaW5zdGFuY2VfaW9yLAkJCS8qIG5iX2lucGxhY2Vfb3IgKi8KLQlpbnN0YW5jZV9mbG9vcmRpdiwJCS8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCWluc3RhbmNlX3RydWVkaXYsCQkvKiBuYl90cnVlX2RpdmlkZSAqLwotCWluc3RhbmNlX2lmbG9vcmRpdiwJCS8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCi0JaW5zdGFuY2VfaXRydWVkaXYsCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCi0JKHVuYXJ5ZnVuYylpbnN0YW5jZV9pbmRleCwJLyogbmJfaW5kZXggKi8KKyAgICBpbnN0YW5jZV9hZGQsICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICBpbnN0YW5jZV9zdWIsICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9zdWJ0cmFjdCAqLworICAgIGluc3RhbmNlX211bCwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX211bHRpcGx5ICovCisgICAgaW5zdGFuY2VfZGl2LCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgaW5zdGFuY2VfbW9kLCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcmVtYWluZGVyICovCisgICAgaW5zdGFuY2VfZGl2bW9kLCAgICAgICAgICAgICAgICAgICAgLyogbmJfZGl2bW9kICovCisgICAgaW5zdGFuY2VfcG93LCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAodW5hcnlmdW5jKWluc3RhbmNlX25lZywgICAgICAgICAgICAvKiBuYl9uZWdhdGl2ZSAqLworICAgICh1bmFyeWZ1bmMpaW5zdGFuY2VfcG9zLCAgICAgICAgICAgIC8qIG5iX3Bvc2l0aXZlICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9hYnMsICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSlpbnN0YW5jZV9ub256ZXJvLCAgICAgICAgICAvKiBuYl9ub256ZXJvICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9pbnZlcnQsICAgICAgICAgLyogbmJfaW52ZXJ0ICovCisgICAgaW5zdGFuY2VfbHNoaWZ0LCAgICAgICAgICAgICAgICAgICAgLyogbmJfbHNoaWZ0ICovCisgICAgaW5zdGFuY2VfcnNoaWZ0LCAgICAgICAgICAgICAgICAgICAgLyogbmJfcnNoaWZ0ICovCisgICAgaW5zdGFuY2VfYW5kLCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfYW5kICovCisgICAgaW5zdGFuY2VfeG9yLCAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfeG9yICovCisgICAgaW5zdGFuY2Vfb3IsICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfb3IgKi8KKyAgICBpbnN0YW5jZV9jb2VyY2UsICAgICAgICAgICAgICAgICAgICAvKiBuYl9jb2VyY2UgKi8KKyAgICAodW5hcnlmdW5jKWluc3RhbmNlX2ludCwgICAgICAgICAgICAvKiBuYl9pbnQgKi8KKyAgICAodW5hcnlmdW5jKWluc3RhbmNlX2xvbmcsICAgICAgICAgICAvKiBuYl9sb25nICovCisgICAgKHVuYXJ5ZnVuYylpbnN0YW5jZV9mbG9hdCwgICAgICAgICAgLyogbmJfZmxvYXQgKi8KKyAgICAodW5hcnlmdW5jKWluc3RhbmNlX29jdCwgICAgICAgICAgICAvKiBuYl9vY3QgKi8KKyAgICAodW5hcnlmdW5jKWluc3RhbmNlX2hleCwgICAgICAgICAgICAvKiBuYl9oZXggKi8KKyAgICBpbnN0YW5jZV9pYWRkLCAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2FkZCAqLworICAgIGluc3RhbmNlX2lzdWIsICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KKyAgICBpbnN0YW5jZV9pbXVsLCAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCisgICAgaW5zdGFuY2VfaWRpdiwgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9kaXZpZGUgKi8KKyAgICBpbnN0YW5jZV9pbW9kLCAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLworICAgIGluc3RhbmNlX2lwb3csICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcG93ZXIgKi8KKyAgICBpbnN0YW5jZV9pbHNoaWZ0LCAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLworICAgIGluc3RhbmNlX2lyc2hpZnQsICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCisgICAgaW5zdGFuY2VfaWFuZCwgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hbmQgKi8KKyAgICBpbnN0YW5jZV9peG9yLCAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3hvciAqLworICAgIGluc3RhbmNlX2lvciwgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfb3IgKi8KKyAgICBpbnN0YW5jZV9mbG9vcmRpdiwgICAgICAgICAgICAgICAgICAvKiBuYl9mbG9vcl9kaXZpZGUgKi8KKyAgICBpbnN0YW5jZV90cnVlZGl2LCAgICAgICAgICAgICAgICAgICAvKiBuYl90cnVlX2RpdmlkZSAqLworICAgIGluc3RhbmNlX2lmbG9vcmRpdiwgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCisgICAgaW5zdGFuY2VfaXRydWVkaXYsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLworICAgICh1bmFyeWZ1bmMpaW5zdGFuY2VfaW5kZXgsICAgICAgICAgIC8qIG5iX2luZGV4ICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlJbnN0YW5jZV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwKLQkiaW5zdGFuY2UiLAotCXNpemVvZihQeUluc3RhbmNlT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWluc3RhbmNlX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCWluc3RhbmNlX2NvbXBhcmUsCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylpbnN0YW5jZV9yZXByLAkJLyogdHBfcmVwciAqLwotCSZpbnN0YW5jZV9hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJmluc3RhbmNlX2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JJmluc3RhbmNlX2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylpbnN0YW5jZV9oYXNoLAkJLyogdHBfaGFzaCAqLwotCWluc3RhbmNlX2NhbGwsCQkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpaW5zdGFuY2Vfc3RyLAkJCS8qIHRwX3N0ciAqLwotCShnZXRhdHRyb2Z1bmMpaW5zdGFuY2VfZ2V0YXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JKHNldGF0dHJvZnVuYylpbnN0YW5jZV9zZXRhdHRyLAkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTLC8qdHBfZmxhZ3MqLwotCWluc3RhbmNlX2RvYywJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpbnN0YW5jZV90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQlpbnN0YW5jZV9yaWNoY29tcGFyZSwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotIAlvZmZzZXRvZihQeUluc3RhbmNlT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JKGdldGl0ZXJmdW5jKWluc3RhbmNlX2dldGl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylpbnN0YW5jZV9pdGVybmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlpbnN0YW5jZV9uZXcsCQkJCS8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwKKyAgICAiaW5zdGFuY2UiLAorICAgIHNpemVvZihQeUluc3RhbmNlT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWluc3RhbmNlX2RlYWxsb2MsICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICBpbnN0YW5jZV9jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpaW5zdGFuY2VfcmVwciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmaW5zdGFuY2VfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZpbnN0YW5jZV9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmaW5zdGFuY2VfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpaW5zdGFuY2VfaGFzaCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICBpbnN0YW5jZV9jYWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpaW5zdGFuY2Vfc3RyLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIChnZXRhdHRyb2Z1bmMpaW5zdGFuY2VfZ2V0YXR0ciwgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAoc2V0YXR0cm9mdW5jKWluc3RhbmNlX3NldGF0dHIsICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMsLyp0cF9mbGFncyovCisgICAgaW5zdGFuY2VfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWluc3RhbmNlX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIGluc3RhbmNlX3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeUluc3RhbmNlT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgKGdldGl0ZXJmdW5jKWluc3RhbmNlX2dldGl0ZXIsICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylpbnN0YW5jZV9pdGVybmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpbnN0YW5jZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogCkBAIC0yMjI1LDMxICsyMjI1LDMxIEBACiBQeU9iamVjdCAqCiBQeU1ldGhvZF9OZXcoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqa2xhc3MpCiB7Ci0JcmVnaXN0ZXIgUHlNZXRob2RPYmplY3QgKmltOwotCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWltID0gZnJlZV9saXN0OwotCWlmIChpbSAhPSBOVUxMKSB7Ci0JCWZyZWVfbGlzdCA9IChQeU1ldGhvZE9iamVjdCAqKShpbS0+aW1fc2VsZik7Ci0JCVB5T2JqZWN0X0lOSVQoaW0sICZQeU1ldGhvZF9UeXBlKTsKLQkJbnVtZnJlZS0tOwotCX0KLQllbHNlIHsKLQkJaW0gPSBQeU9iamVjdF9HQ19OZXcoUHlNZXRob2RPYmplY3QsICZQeU1ldGhvZF9UeXBlKTsKLQkJaWYgKGltID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaW0tPmltX3dlYWtyZWZsaXN0ID0gTlVMTDsKLQlQeV9JTkNSRUYoZnVuYyk7Ci0JaW0tPmltX2Z1bmMgPSBmdW5jOwotCVB5X1hJTkNSRUYoc2VsZik7Ci0JaW0tPmltX3NlbGYgPSBzZWxmOwotCVB5X1hJTkNSRUYoa2xhc3MpOwotCWltLT5pbV9jbGFzcyA9IGtsYXNzOwotCV9QeU9iamVjdF9HQ19UUkFDSyhpbSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWltOworICAgIHJlZ2lzdGVyIFB5TWV0aG9kT2JqZWN0ICppbTsKKyAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZnVuYykpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpbSA9IGZyZWVfbGlzdDsKKyAgICBpZiAoaW0gIT0gTlVMTCkgeworICAgICAgICBmcmVlX2xpc3QgPSAoUHlNZXRob2RPYmplY3QgKikoaW0tPmltX3NlbGYpOworICAgICAgICBQeU9iamVjdF9JTklUKGltLCAmUHlNZXRob2RfVHlwZSk7CisgICAgICAgIG51bWZyZWUtLTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGltID0gUHlPYmplY3RfR0NfTmV3KFB5TWV0aG9kT2JqZWN0LCAmUHlNZXRob2RfVHlwZSk7CisgICAgICAgIGlmIChpbSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGltLT5pbV93ZWFrcmVmbGlzdCA9IE5VTEw7CisgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgIGltLT5pbV9mdW5jID0gZnVuYzsKKyAgICBQeV9YSU5DUkVGKHNlbGYpOworICAgIGltLT5pbV9zZWxmID0gc2VsZjsKKyAgICBQeV9YSU5DUkVGKGtsYXNzKTsKKyAgICBpbS0+aW1fY2xhc3MgPSBrbGFzczsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soaW0pOworICAgIHJldHVybiAoUHlPYmplY3QgKilpbTsKIH0KIAogLyogRGVzY3JpcHRvcnMgZm9yIFB5TWV0aG9kIGF0dHJpYnV0ZXMgKi8KQEAgLTIyNTksMTcgKzIyNTksMTcgQEAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKFB5TWV0aG9kT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgaW5zdGFuY2VtZXRob2RfbWVtYmVybGlzdFtdID0gewotCXsiaW1fY2xhc3MiLAlUX09CSkVDVCwJT0ZGKGltX2NsYXNzKSwJUkVBRE9OTFl8UkVTVFJJQ1RFRCwKLQkgInRoZSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QifSwKLQl7ImltX2Z1bmMiLAlUX09CSkVDVCwJT0ZGKGltX2Z1bmMpLAlSRUFET05MWXxSRVNUUklDVEVELAotCSAidGhlIGZ1bmN0aW9uIChvciBvdGhlciBjYWxsYWJsZSkgaW1wbGVtZW50aW5nIGEgbWV0aG9kIn0sCi0JeyJfX2Z1bmNfXyIsCVRfT0JKRUNULAlPRkYoaW1fZnVuYyksCVJFQURPTkxZfFJFU1RSSUNURUQsCi0JICJ0aGUgZnVuY3Rpb24gKG9yIG90aGVyIGNhbGxhYmxlKSBpbXBsZW1lbnRpbmcgYSBtZXRob2QifSwKLQl7ImltX3NlbGYiLAlUX09CSkVDVCwJT0ZGKGltX3NlbGYpLAlSRUFET05MWXxSRVNUUklDVEVELAotCSAidGhlIGluc3RhbmNlIHRvIHdoaWNoIGEgbWV0aG9kIGlzIGJvdW5kOyBOb25lIGZvciB1bmJvdW5kIG1ldGhvZHMifSwKLQl7Il9fc2VsZl9fIiwJVF9PQkpFQ1QsCU9GRihpbV9zZWxmKSwJUkVBRE9OTFl8UkVTVFJJQ1RFRCwKLQkgInRoZSBpbnN0YW5jZSB0byB3aGljaCBhIG1ldGhvZCBpcyBib3VuZDsgTm9uZSBmb3IgdW5ib3VuZCBtZXRob2RzIn0sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJpbV9jbGFzcyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGltX2NsYXNzKSwgIFJFQURPTkxZfFJFU1RSSUNURUQsCisgICAgICJ0aGUgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kIn0sCisgICAgeyJpbV9mdW5jIiwgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGltX2Z1bmMpLCAgIFJFQURPTkxZfFJFU1RSSUNURUQsCisgICAgICJ0aGUgZnVuY3Rpb24gKG9yIG90aGVyIGNhbGxhYmxlKSBpbXBsZW1lbnRpbmcgYSBtZXRob2QifSwKKyAgICB7Il9fZnVuY19fIiwgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoaW1fZnVuYyksICAgUkVBRE9OTFl8UkVTVFJJQ1RFRCwKKyAgICAgInRoZSBmdW5jdGlvbiAob3Igb3RoZXIgY2FsbGFibGUpIGltcGxlbWVudGluZyBhIG1ldGhvZCJ9LAorICAgIHsiaW1fc2VsZiIsICAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihpbV9zZWxmKSwgICBSRUFET05MWXxSRVNUUklDVEVELAorICAgICAidGhlIGluc3RhbmNlIHRvIHdoaWNoIGEgbWV0aG9kIGlzIGJvdW5kOyBOb25lIGZvciB1bmJvdW5kIG1ldGhvZHMifSwKKyAgICB7Il9fc2VsZl9fIiwgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoaW1fc2VsZiksICAgUkVBRE9OTFl8UkVTVFJJQ1RFRCwKKyAgICAgInRoZSBpbnN0YW5jZSB0byB3aGljaCBhIG1ldGhvZCBpcyBib3VuZDsgTm9uZSBmb3IgdW5ib3VuZCBtZXRob2RzIn0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIC8qIENocmlzdGlhbiBUaXNtZXIgYXJndWVkIGNvbnZpbmNpbmdseSB0aGF0IG1ldGhvZCBhdHRyaWJ1dGVzIHNob3VsZApAQCAtMjI4MCw0NiArMjI4MCw0NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlbWV0aG9kX2dldF9kb2MoUHlNZXRob2RPYmplY3QgKmltLCB2b2lkICpjb250ZXh0KQogewotCXN0YXRpYyBQeU9iamVjdCAqZG9jc3RyOwotCWlmIChkb2NzdHIgPT0gTlVMTCkgewotCQlkb2NzdHI9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZG9jX18iKTsKLQkJaWYgKGRvY3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeU9iamVjdF9HZXRBdHRyKGltLT5pbV9mdW5jLCBkb2NzdHIpOworICAgIHN0YXRpYyBQeU9iamVjdCAqZG9jc3RyOworICAgIGlmIChkb2NzdHIgPT0gTlVMTCkgeworICAgICAgICBkb2NzdHI9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZG9jX18iKTsKKyAgICAgICAgaWYgKGRvY3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeU9iamVjdF9HZXRBdHRyKGltLT5pbV9mdW5jLCBkb2NzdHIpOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgaW5zdGFuY2VtZXRob2RfZ2V0c2V0W10gPSB7Ci0JeyJfX2RvY19fIiwgKGdldHRlcilpbnN0YW5jZW1ldGhvZF9nZXRfZG9jLCBOVUxMLCBOVUxMfSwKLQl7MH0KKyAgICB7Il9fZG9jX18iLCAoZ2V0dGVyKWluc3RhbmNlbWV0aG9kX2dldF9kb2MsIE5VTEwsIE5VTEx9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlbWV0aG9kX2dldGF0dHJvKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICpuYW1lKQogewotCVB5TWV0aG9kT2JqZWN0ICppbSA9IChQeU1ldGhvZE9iamVjdCAqKW9iajsKLQlQeVR5cGVPYmplY3QgKnRwID0gb2JqLT5vYl90eXBlOwotCVB5T2JqZWN0ICpkZXNjciA9IE5VTEw7CisgICAgUHlNZXRob2RPYmplY3QgKmltID0gKFB5TWV0aG9kT2JqZWN0ICopb2JqOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSBvYmotPm9iX3R5cGU7CisgICAgUHlPYmplY3QgKmRlc2NyID0gTlVMTDsKIAotCWlmIChQeVR5cGVfSGFzRmVhdHVyZSh0cCwgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkgewotCQlpZiAodHAtPnRwX2RpY3QgPT0gTlVMTCkgewotCQkJaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOwotCX0KKyAgICBpZiAoUHlUeXBlX0hhc0ZlYXR1cmUodHAsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpIHsKKyAgICAgICAgaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChQeVR5cGVfUmVhZHkodHApIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBkZXNjciA9IF9QeVR5cGVfTG9va3VwKHRwLCBuYW1lKTsKKyAgICB9CiAKLQlpZiAoZGVzY3IgIT0gTlVMTCkgewotCQlkZXNjcmdldGZ1bmMgZiA9IFRQX0RFU0NSX0dFVChkZXNjci0+b2JfdHlwZSk7Ci0JCWlmIChmICE9IE5VTEwpCi0JCQlyZXR1cm4gZihkZXNjciwgb2JqLCAoUHlPYmplY3QgKilvYmotPm9iX3R5cGUpOwotCQllbHNlIHsKLQkJCVB5X0lOQ1JFRihkZXNjcik7Ci0JCQlyZXR1cm4gZGVzY3I7Ci0JCX0KLQl9CisgICAgaWYgKGRlc2NyICE9IE5VTEwpIHsKKyAgICAgICAgZGVzY3JnZXRmdW5jIGYgPSBUUF9ERVNDUl9HRVQoZGVzY3ItPm9iX3R5cGUpOworICAgICAgICBpZiAoZiAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGYoZGVzY3IsIG9iaiwgKFB5T2JqZWN0ICopb2JqLT5vYl90eXBlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGVzY3IpOworICAgICAgICAgICAgcmV0dXJuIGRlc2NyOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIFB5T2JqZWN0X0dldEF0dHIoaW0tPmltX2Z1bmMsIG5hbWUpOworICAgIHJldHVybiBQeU9iamVjdF9HZXRBdHRyKGltLT5pbV9mdW5jLCBuYW1lKTsKIH0KIAogUHlEb2NfU1RSVkFSKGluc3RhbmNlbWV0aG9kX2RvYywKQEAgLTIzMzAsMzIzICsyMzMwLDMyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlbWV0aG9kX25ldyhQeVR5cGVPYmplY3QqIHR5cGUsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JUHlPYmplY3QgKmNsYXNzT2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqY2xhc3NPYmogPSBOVUxMOwogCi0JaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiaW5zdGFuY2VtZXRob2QiLCBrdykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImluc3RhbmNlbWV0aG9kIiwgMiwgMywKLQkJCSAgICAgICZmdW5jLCAmc2VsZiwgJmNsYXNzT2JqKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImZpcnN0IGFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzZWxmID09IFB5X05vbmUpCi0JCXNlbGYgPSBOVUxMOwotCWlmIChzZWxmID09IE5VTEwgJiYgY2xhc3NPYmogPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJInVuYm91bmQgbWV0aG9kcyBtdXN0IGhhdmUgbm9uLU5VTEwgaW1fY2xhc3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoImluc3RhbmNlbWV0aG9kIiwga3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpbnN0YW5jZW1ldGhvZCIsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmdW5jLCAmc2VsZiwgJmNsYXNzT2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHNlbGYgPT0gUHlfTm9uZSkKKyAgICAgICAgc2VsZiA9IE5VTEw7CisgICAgaWYgKHNlbGYgPT0gTlVMTCAmJiBjbGFzc09iaiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAidW5ib3VuZCBtZXRob2RzIG11c3QgaGF2ZSBub24tTlVMTCBpbV9jbGFzcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlNZXRob2RfTmV3KGZ1bmMsIHNlbGYsIGNsYXNzT2JqKTsKKyAgICByZXR1cm4gUHlNZXRob2RfTmV3KGZ1bmMsIHNlbGYsIGNsYXNzT2JqKTsKIH0KIAogc3RhdGljIHZvaWQKIGluc3RhbmNlbWV0aG9kX2RlYWxsb2MocmVnaXN0ZXIgUHlNZXRob2RPYmplY3QgKmltKQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKGltKTsKLQlpZiAoaW0tPmltX3dlYWtyZWZsaXN0ICE9IE5VTEwpCi0JCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopaW0pOwotCVB5X0RFQ1JFRihpbS0+aW1fZnVuYyk7Ci0JUHlfWERFQ1JFRihpbS0+aW1fc2VsZik7Ci0JUHlfWERFQ1JFRihpbS0+aW1fY2xhc3MpOwotCWlmIChudW1mcmVlIDwgUHlNZXRob2RfTUFYRlJFRUxJU1QpIHsKLQkJaW0tPmltX3NlbGYgPSAoUHlPYmplY3QgKilmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IGltOwotCQludW1mcmVlKys7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdF9HQ19EZWwoaW0pOwotCX0KKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhpbSk7CisgICAgaWYgKGltLT5pbV93ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKWltKTsKKyAgICBQeV9ERUNSRUYoaW0tPmltX2Z1bmMpOworICAgIFB5X1hERUNSRUYoaW0tPmltX3NlbGYpOworICAgIFB5X1hERUNSRUYoaW0tPmltX2NsYXNzKTsKKyAgICBpZiAobnVtZnJlZSA8IFB5TWV0aG9kX01BWEZSRUVMSVNUKSB7CisgICAgICAgIGltLT5pbV9zZWxmID0gKFB5T2JqZWN0ICopZnJlZV9saXN0OworICAgICAgICBmcmVlX2xpc3QgPSBpbTsKKyAgICAgICAgbnVtZnJlZSsrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3RfR0NfRGVsKGltKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGluc3RhbmNlbWV0aG9kX2NvbXBhcmUoUHlNZXRob2RPYmplY3QgKmEsIFB5TWV0aG9kT2JqZWN0ICpiKQogewotCWludCBjbXA7Ci0JY21wID0gUHlPYmplY3RfQ29tcGFyZShhLT5pbV9mdW5jLCBiLT5pbV9mdW5jKTsKLQlpZiAoY21wKQotCQlyZXR1cm4gY21wOworICAgIGludCBjbXA7CisgICAgY21wID0gUHlPYmplY3RfQ29tcGFyZShhLT5pbV9mdW5jLCBiLT5pbV9mdW5jKTsKKyAgICBpZiAoY21wKQorICAgICAgICByZXR1cm4gY21wOwogCi0JaWYgKGEtPmltX3NlbGYgPT0gYi0+aW1fc2VsZikKLQkJcmV0dXJuIDA7Ci0JaWYgKGEtPmltX3NlbGYgPT0gTlVMTCB8fCBiLT5pbV9zZWxmID09IE5VTEwpCi0JCXJldHVybiAoYS0+aW1fc2VsZiA8IGItPmltX3NlbGYpID8gLTEgOiAxOwotCWVsc2UKLQkJcmV0dXJuIFB5T2JqZWN0X0NvbXBhcmUoYS0+aW1fc2VsZiwgYi0+aW1fc2VsZik7CisgICAgaWYgKGEtPmltX3NlbGYgPT0gYi0+aW1fc2VsZikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGEtPmltX3NlbGYgPT0gTlVMTCB8fCBiLT5pbV9zZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiAoYS0+aW1fc2VsZiA8IGItPmltX3NlbGYpID8gLTEgOiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NvbXBhcmUoYS0+aW1fc2VsZiwgYi0+aW1fc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnN0YW5jZW1ldGhvZF9yZXByKFB5TWV0aG9kT2JqZWN0ICphKQogewotCVB5T2JqZWN0ICpzZWxmID0gYS0+aW1fc2VsZjsKLQlQeU9iamVjdCAqZnVuYyA9IGEtPmltX2Z1bmM7Ci0JUHlPYmplY3QgKmtsYXNzID0gYS0+aW1fY2xhc3M7Ci0JUHlPYmplY3QgKmZ1bmNuYW1lID0gTlVMTCwgKmtsYXNzbmFtZSA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOwotCWNoYXIgKnNmdW5jbmFtZSA9ICI/IiwgKnNrbGFzc25hbWUgPSAiPyI7CisgICAgUHlPYmplY3QgKnNlbGYgPSBhLT5pbV9zZWxmOworICAgIFB5T2JqZWN0ICpmdW5jID0gYS0+aW1fZnVuYzsKKyAgICBQeU9iamVjdCAqa2xhc3MgPSBhLT5pbV9jbGFzczsKKyAgICBQeU9iamVjdCAqZnVuY25hbWUgPSBOVUxMLCAqa2xhc3NuYW1lID0gTlVMTCwgKnJlc3VsdCA9IE5VTEw7CisgICAgY2hhciAqc2Z1bmNuYW1lID0gIj8iLCAqc2tsYXNzbmFtZSA9ICI/IjsKIAotCWZ1bmNuYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmdW5jLCAiX19uYW1lX18iKTsKLQlpZiAoZnVuY25hbWUgPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhmdW5jbmFtZSkpIHsKLQkJUHlfREVDUkVGKGZ1bmNuYW1lKTsKLQkJZnVuY25hbWUgPSBOVUxMOwotCX0KLQllbHNlCi0JCXNmdW5jbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhmdW5jbmFtZSk7Ci0JaWYgKGtsYXNzID09IE5VTEwpCi0JCWtsYXNzbmFtZSA9IE5VTEw7Ci0JZWxzZSB7Ci0JCWtsYXNzbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoa2xhc3MsICJfX25hbWVfXyIpOwotCQlpZiAoa2xhc3NuYW1lID09IE5VTEwpIHsKLQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlQeUVycl9DbGVhcigpOwotCQl9Ci0JCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhrbGFzc25hbWUpKSB7Ci0JCQlQeV9ERUNSRUYoa2xhc3NuYW1lKTsKLQkJCWtsYXNzbmFtZSA9IE5VTEw7Ci0JCX0KLQkJZWxzZQotCQkJc2tsYXNzbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhrbGFzc25hbWUpOwotCX0KLQlpZiAoc2VsZiA9PSBOVUxMKQotCQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8dW5ib3VuZCBtZXRob2QgJXMuJXM+IiwKLQkJCQkJICAgICBza2xhc3NuYW1lLCBzZnVuY25hbWUpOwotCWVsc2UgewotCQkvKiBYWFggU2hvdWxkbid0IHVzZSByZXByKCkgaGVyZSEgKi8KLQkJUHlPYmplY3QgKnNlbGZyZXByID0gUHlPYmplY3RfUmVwcihzZWxmKTsKLQkJaWYgKHNlbGZyZXByID09IE5VTEwpCi0JCQlnb3RvIGZhaWw7Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2soc2VsZnJlcHIpKSB7Ci0JCQlQeV9ERUNSRUYoc2VsZnJlcHIpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxib3VuZCBtZXRob2QgJXMuJXMgb2YgJXM+IiwKLQkJCQkJICAgICBza2xhc3NuYW1lLCBzZnVuY25hbWUsCi0JCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGZyZXByKSk7Ci0JCVB5X0RFQ1JFRihzZWxmcmVwcik7Ci0JfQorICAgIGZ1bmNuYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmdW5jLCAiX19uYW1lX18iKTsKKyAgICBpZiAoZnVuY25hbWUgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhmdW5jbmFtZSkpIHsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmNuYW1lKTsKKyAgICAgICAgZnVuY25hbWUgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHNmdW5jbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhmdW5jbmFtZSk7CisgICAgaWYgKGtsYXNzID09IE5VTEwpCisgICAgICAgIGtsYXNzbmFtZSA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIGtsYXNzbmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoa2xhc3MsICJfX25hbWVfXyIpOworICAgICAgICBpZiAoa2xhc3NuYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhrbGFzc25hbWUpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2xhc3NuYW1lKTsKKyAgICAgICAgICAgIGtsYXNzbmFtZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2tsYXNzbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhrbGFzc25hbWUpOworICAgIH0KKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8dW5ib3VuZCBtZXRob2QgJXMuJXM+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2xhc3NuYW1lLCBzZnVuY25hbWUpOworICAgIGVsc2UgeworICAgICAgICAvKiBYWFggU2hvdWxkbid0IHVzZSByZXByKCkgaGVyZSEgKi8KKyAgICAgICAgUHlPYmplY3QgKnNlbGZyZXByID0gUHlPYmplY3RfUmVwcihzZWxmKTsKKyAgICAgICAgaWYgKHNlbGZyZXByID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soc2VsZnJlcHIpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VsZnJlcHIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxib3VuZCBtZXRob2QgJXMuJXMgb2YgJXM+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2xhc3NuYW1lLCBzZnVuY25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGZyZXByKSk7CisgICAgICAgIFB5X0RFQ1JFRihzZWxmcmVwcik7CisgICAgfQogICBmYWlsOgotCVB5X1hERUNSRUYoZnVuY25hbWUpOwotCVB5X1hERUNSRUYoa2xhc3NuYW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYoZnVuY25hbWUpOworICAgIFB5X1hERUNSRUYoa2xhc3NuYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgbG9uZwogaW5zdGFuY2VtZXRob2RfaGFzaChQeU1ldGhvZE9iamVjdCAqYSkKIHsKLQlsb25nIHgsIHk7Ci0JaWYgKGEtPmltX3NlbGYgPT0gTlVMTCkKLQkJeCA9IFB5T2JqZWN0X0hhc2goUHlfTm9uZSk7Ci0JZWxzZQotCQl4ID0gUHlPYmplY3RfSGFzaChhLT5pbV9zZWxmKTsKLQlpZiAoeCA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCXkgPSBQeU9iamVjdF9IYXNoKGEtPmltX2Z1bmMpOwotCWlmICh5ID09IC0xKQotCQlyZXR1cm4gLTE7Ci0JeCA9IHggXiB5OwotCWlmICh4ID09IC0xKQotCQl4ID0gLTI7Ci0JcmV0dXJuIHg7CisgICAgbG9uZyB4LCB5OworICAgIGlmIChhLT5pbV9zZWxmID09IE5VTEwpCisgICAgICAgIHggPSBQeU9iamVjdF9IYXNoKFB5X05vbmUpOworICAgIGVsc2UKKyAgICAgICAgeCA9IFB5T2JqZWN0X0hhc2goYS0+aW1fc2VsZik7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB5ID0gUHlPYmplY3RfSGFzaChhLT5pbV9mdW5jKTsKKyAgICBpZiAoeSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHggPSB4IF4geTsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgeCA9IC0yOworICAgIHJldHVybiB4OwogfQogCiBzdGF0aWMgaW50CiBpbnN0YW5jZW1ldGhvZF90cmF2ZXJzZShQeU1ldGhvZE9iamVjdCAqaW0sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGltLT5pbV9mdW5jKTsKLQlQeV9WSVNJVChpbS0+aW1fc2VsZik7Ci0JUHlfVklTSVQoaW0tPmltX2NsYXNzKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpbS0+aW1fZnVuYyk7CisgICAgUHlfVklTSVQoaW0tPmltX3NlbGYpOworICAgIFB5X1ZJU0lUKGltLT5pbV9jbGFzcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBnZXRjbGFzc25hbWUoUHlPYmplY3QgKmtsYXNzLCBjaGFyICpidWYsIGludCBidWZzaXplKQogewotCVB5T2JqZWN0ICpuYW1lOworICAgIFB5T2JqZWN0ICpuYW1lOwogCi0JYXNzZXJ0KGJ1ZnNpemUgPiAxKTsKLQlzdHJjcHkoYnVmLCAiPyIpOyAvKiBEZWZhdWx0IG91dGNvbWUgKi8KLQlpZiAoa2xhc3MgPT0gTlVMTCkKLQkJcmV0dXJuOwotCW5hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGtsYXNzLCAiX19uYW1lX18iKTsKLQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCS8qIFRoaXMgZnVuY3Rpb24gY2Fubm90IHJldHVybiBhbiBleGNlcHRpb24gKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKLQkJc3RybmNweShidWYsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgYnVmc2l6ZSk7Ci0JCWJ1ZltidWZzaXplLTFdID0gJ1wwJzsKLQl9Ci0JUHlfREVDUkVGKG5hbWUpOworICAgIGFzc2VydChidWZzaXplID4gMSk7CisgICAgc3RyY3B5KGJ1ZiwgIj8iKTsgLyogRGVmYXVsdCBvdXRjb21lICovCisgICAgaWYgKGtsYXNzID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBuYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhrbGFzcywgIl9fbmFtZV9fIik7CisgICAgaWYgKG5hbWUgPT0gTlVMTCkgeworICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYW4gZXhjZXB0aW9uICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIHN0cm5jcHkoYnVmLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksIGJ1ZnNpemUpOworICAgICAgICBidWZbYnVmc2l6ZS0xXSA9ICdcMCc7CisgICAgfQorICAgIFB5X0RFQ1JFRihuYW1lKTsKIH0KIAogc3RhdGljIHZvaWQKIGdldGluc3RjbGFzc25hbWUoUHlPYmplY3QgKmluc3QsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnNpemUpCiB7Ci0JUHlPYmplY3QgKmtsYXNzOworICAgIFB5T2JqZWN0ICprbGFzczsKIAotCWlmIChpbnN0ID09IE5VTEwpIHsKLQkJYXNzZXJ0KGJ1ZnNpemUgPiAwICYmIChzaXplX3QpYnVmc2l6ZSA+IHN0cmxlbigibm90aGluZyIpKTsKLQkJc3RyY3B5KGJ1ZiwgIm5vdGhpbmciKTsKLQkJcmV0dXJuOwotCX0KKyAgICBpZiAoaW5zdCA9PSBOVUxMKSB7CisgICAgICAgIGFzc2VydChidWZzaXplID4gMCAmJiAoc2l6ZV90KWJ1ZnNpemUgPiBzdHJsZW4oIm5vdGhpbmciKSk7CisgICAgICAgIHN0cmNweShidWYsICJub3RoaW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlrbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoaW5zdCwgIl9fY2xhc3NfXyIpOwotCWlmIChrbGFzcyA9PSBOVUxMKSB7Ci0JCS8qIFRoaXMgZnVuY3Rpb24gY2Fubm90IHJldHVybiBhbiBleGNlcHRpb24gKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQkJa2xhc3MgPSAoUHlPYmplY3QgKikoaW5zdC0+b2JfdHlwZSk7Ci0JCVB5X0lOQ1JFRihrbGFzcyk7Ci0JfQotCWdldGNsYXNzbmFtZShrbGFzcywgYnVmLCBidWZzaXplKTsKLQlQeV9YREVDUkVGKGtsYXNzKTsKKyAgICBrbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoaW5zdCwgIl9fY2xhc3NfXyIpOworICAgIGlmIChrbGFzcyA9PSBOVUxMKSB7CisgICAgICAgIC8qIFRoaXMgZnVuY3Rpb24gY2Fubm90IHJldHVybiBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAga2xhc3MgPSAoUHlPYmplY3QgKikoaW5zdC0+b2JfdHlwZSk7CisgICAgICAgIFB5X0lOQ1JFRihrbGFzcyk7CisgICAgfQorICAgIGdldGNsYXNzbmFtZShrbGFzcywgYnVmLCBidWZzaXplKTsKKyAgICBQeV9YREVDUkVGKGtsYXNzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGluc3RhbmNlbWV0aG9kX2NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqc2VsZiA9IFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpOwotCVB5T2JqZWN0ICprbGFzcyA9IFB5TWV0aG9kX0dFVF9DTEFTUyhmdW5jKTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpzZWxmID0gUHlNZXRob2RfR0VUX1NFTEYoZnVuYyk7CisgICAgUHlPYmplY3QgKmtsYXNzID0gUHlNZXRob2RfR0VUX0NMQVNTKGZ1bmMpOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlmdW5jID0gUHlNZXRob2RfR0VUX0ZVTkNUSU9OKGZ1bmMpOwotCWlmIChzZWxmID09IE5VTEwpIHsKLQkJLyogVW5ib3VuZCBtZXRob2RzIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gaW5zdGFuY2Ugb2YKLQkJICAgdGhlIGNsYXNzIChvciBhIGRlcml2ZWQgY2xhc3MpIGFzIGZpcnN0IGFyZ3VtZW50ICovCi0JCWludCBvazsKLQkJaWYgKFB5VHVwbGVfU2l6ZShhcmcpID49IDEpCi0JCQlzZWxmID0gUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApOwotCQlpZiAoc2VsZiA9PSBOVUxMKQotCQkJb2sgPSAwOwotCQllbHNlIHsKLQkJCW9rID0gUHlPYmplY3RfSXNJbnN0YW5jZShzZWxmLCBrbGFzcyk7Ci0JCQlpZiAob2sgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmICghb2spIHsKLQkJCWNoYXIgY2xzYnVmWzI1Nl07Ci0JCQljaGFyIGluc3RidWZbMjU2XTsKLQkJCWdldGNsYXNzbmFtZShrbGFzcywgY2xzYnVmLCBzaXplb2YoY2xzYnVmKSk7Ci0JCQlnZXRpbnN0Y2xhc3NuYW1lKHNlbGYsIGluc3RidWYsIHNpemVvZihpbnN0YnVmKSk7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgInVuYm91bmQgbWV0aG9kICVzJXMgbXVzdCBiZSBjYWxsZWQgd2l0aCAiCi0JCQkJICAgICAiJXMgaW5zdGFuY2UgYXMgZmlyc3QgYXJndW1lbnQgIgotCQkJCSAgICAgIihnb3QgJXMlcyBpbnN0ZWFkKSIsCi0JCQkJICAgICBQeUV2YWxfR2V0RnVuY05hbWUoZnVuYyksCi0JCQkJICAgICBQeUV2YWxfR2V0RnVuY0Rlc2MoZnVuYyksCi0JCQkJICAgICBjbHNidWYsCi0JCQkJICAgICBpbnN0YnVmLAotCQkJCSAgICAgc2VsZiA9PSBOVUxMID8gIiIgOiAiIGluc3RhbmNlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9JTkNSRUYoYXJnKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5X3NzaXplX3QgYXJnY291bnQgPSBQeVR1cGxlX1NpemUoYXJnKTsKLQkJUHlPYmplY3QgKm5ld2FyZyA9IFB5VHVwbGVfTmV3KGFyZ2NvdW50ICsgMSk7Ci0JCWludCBpOwotCQlpZiAobmV3YXJnID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZywgMCwgc2VsZik7Ci0JCWZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCBpKTsKLQkJCVB5X1hJTkNSRUYodik7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZywgaSsxLCB2KTsKLQkJfQotCQlhcmcgPSBuZXdhcmc7Ci0JfQotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0ICopZnVuYywgYXJnLCBrdyk7Ci0JUHlfREVDUkVGKGFyZyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmdW5jID0gUHlNZXRob2RfR0VUX0ZVTkNUSU9OKGZ1bmMpOworICAgIGlmIChzZWxmID09IE5VTEwpIHsKKyAgICAgICAgLyogVW5ib3VuZCBtZXRob2RzIG11c3QgYmUgY2FsbGVkIHdpdGggYW4gaW5zdGFuY2Ugb2YKKyAgICAgICAgICAgdGhlIGNsYXNzIChvciBhIGRlcml2ZWQgY2xhc3MpIGFzIGZpcnN0IGFyZ3VtZW50ICovCisgICAgICAgIGludCBvazsKKyAgICAgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmcpID49IDEpCisgICAgICAgICAgICBzZWxmID0gUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApOworICAgICAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICAgICAgb2sgPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNJbnN0YW5jZShzZWxmLCBrbGFzcyk7CisgICAgICAgICAgICBpZiAob2sgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgIGNoYXIgY2xzYnVmWzI1Nl07CisgICAgICAgICAgICBjaGFyIGluc3RidWZbMjU2XTsKKyAgICAgICAgICAgIGdldGNsYXNzbmFtZShrbGFzcywgY2xzYnVmLCBzaXplb2YoY2xzYnVmKSk7CisgICAgICAgICAgICBnZXRpbnN0Y2xhc3NuYW1lKHNlbGYsIGluc3RidWYsIHNpemVvZihpbnN0YnVmKSk7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmJvdW5kIG1ldGhvZCAlcyVzIG11c3QgYmUgY2FsbGVkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBpbnN0YW5jZSBhcyBmaXJzdCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIihnb3QgJXMlcyBpbnN0ZWFkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRGdW5jRGVzYyhmdW5jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbHNidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmID09IE5VTEwgPyAiIiA6ICIgaW5zdGFuY2UiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihhcmcpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfc3NpemVfdCBhcmdjb3VudCA9IFB5VHVwbGVfU2l6ZShhcmcpOworICAgICAgICBQeU9iamVjdCAqbmV3YXJnID0gUHlUdXBsZV9OZXcoYXJnY291bnQgKyAxKTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmIChuZXdhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJnLCAwLCBzZWxmKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmcsIGkpOworICAgICAgICAgICAgUHlfWElOQ1JFRih2KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJnLCBpKzEsIHYpOworICAgICAgICB9CisgICAgICAgIGFyZyA9IG5ld2FyZzsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbCgoUHlPYmplY3QgKilmdW5jLCBhcmcsIGt3KTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW5zdGFuY2VtZXRob2RfZGVzY3JfZ2V0KFB5T2JqZWN0ICptZXRoLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqY2xzKQogewotCS8qIERvbid0IHJlYmluZCBhbiBhbHJlYWR5IGJvdW5kIG1ldGhvZCwgb3IgYW4gdW5ib3VuZCBtZXRob2QKLQkgICBvZiBhIGNsYXNzIHRoYXQncyBub3QgYSBiYXNlIGNsYXNzIG9mIGNscy4gKi8KKyAgICAvKiBEb24ndCByZWJpbmQgYW4gYWxyZWFkeSBib3VuZCBtZXRob2QsIG9yIGFuIHVuYm91bmQgbWV0aG9kCisgICAgICAgb2YgYSBjbGFzcyB0aGF0J3Mgbm90IGEgYmFzZSBjbGFzcyBvZiBjbHMuICovCiAKLQlpZiAoUHlNZXRob2RfR0VUX1NFTEYobWV0aCkgIT0gTlVMTCkgewotCQkvKiBBbHJlYWR5IGJvdW5kICovCi0JCVB5X0lOQ1JFRihtZXRoKTsKLQkJcmV0dXJuIG1ldGg7Ci0JfQotCS8qIE5vLCBpdCBpcyBhbiB1bmJvdW5kIG1ldGhvZCAqLwotCWlmIChQeU1ldGhvZF9HRVRfQ0xBU1MobWV0aCkgIT0gTlVMTCAmJiBjbHMgIT0gTlVMTCkgewotCQkvKiBEbyBzdWJjbGFzcyB0ZXN0LiAgSWYgaXQgZmFpbHMsIHJldHVybiBtZXRoIHVuY2hhbmdlZC4gKi8KLQkJaW50IG9rID0gUHlPYmplY3RfSXNTdWJjbGFzcyhjbHMsIFB5TWV0aG9kX0dFVF9DTEFTUyhtZXRoKSk7Ci0JCWlmIChvayA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCFvaykgewotCQkJUHlfSU5DUkVGKG1ldGgpOwotCQkJcmV0dXJuIG1ldGg7Ci0JCX0KLQl9Ci0JLyogQmluZCBpdCB0byBvYmogKi8KLQlyZXR1cm4gUHlNZXRob2RfTmV3KFB5TWV0aG9kX0dFVF9GVU5DVElPTihtZXRoKSwgb2JqLCBjbHMpOworICAgIGlmIChQeU1ldGhvZF9HRVRfU0VMRihtZXRoKSAhPSBOVUxMKSB7CisgICAgICAgIC8qIEFscmVhZHkgYm91bmQgKi8KKyAgICAgICAgUHlfSU5DUkVGKG1ldGgpOworICAgICAgICByZXR1cm4gbWV0aDsKKyAgICB9CisgICAgLyogTm8sIGl0IGlzIGFuIHVuYm91bmQgbWV0aG9kICovCisgICAgaWYgKFB5TWV0aG9kX0dFVF9DTEFTUyhtZXRoKSAhPSBOVUxMICYmIGNscyAhPSBOVUxMKSB7CisgICAgICAgIC8qIERvIHN1YmNsYXNzIHRlc3QuICBJZiBpdCBmYWlscywgcmV0dXJuIG1ldGggdW5jaGFuZ2VkLiAqLworICAgICAgICBpbnQgb2sgPSBQeU9iamVjdF9Jc1N1YmNsYXNzKGNscywgUHlNZXRob2RfR0VUX0NMQVNTKG1ldGgpKTsKKyAgICAgICAgaWYgKG9rIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIW9rKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYobWV0aCk7CisgICAgICAgICAgICByZXR1cm4gbWV0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBCaW5kIGl0IHRvIG9iaiAqLworICAgIHJldHVybiBQeU1ldGhvZF9OZXcoUHlNZXRob2RfR0VUX0ZVTkNUSU9OKG1ldGgpLCBvYmosIGNscyk7CiB9CiAKIFB5VHlwZU9iamVjdCBQeU1ldGhvZF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwKLQkiaW5zdGFuY2VtZXRob2QiLAotCXNpemVvZihQeU1ldGhvZE9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilpbnN0YW5jZW1ldGhvZF9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKWluc3RhbmNlbWV0aG9kX2NvbXBhcmUsCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpaW5zdGFuY2VtZXRob2RfcmVwciwJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpaW5zdGFuY2VtZXRob2RfaGFzaCwJCS8qIHRwX2hhc2ggKi8KLQlpbnN0YW5jZW1ldGhvZF9jYWxsLAkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JaW5zdGFuY2VtZXRob2RfZ2V0YXR0cm8sCQkvKiB0cF9nZXRhdHRybyAqLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDICB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgLyogdHBfZmxhZ3MgKi8KLQlpbnN0YW5jZW1ldGhvZF9kb2MsCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylpbnN0YW5jZW1ldGhvZF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLSAJb2Zmc2V0b2YoUHlNZXRob2RPYmplY3QsIGltX3dlYWtyZWZsaXN0KSwgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JaW5zdGFuY2VtZXRob2RfbWVtYmVybGlzdCwJCS8qIHRwX21lbWJlcnMgKi8KLQlpbnN0YW5jZW1ldGhvZF9nZXRzZXQsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCWluc3RhbmNlbWV0aG9kX2Rlc2NyX2dldCwJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JaW5zdGFuY2VtZXRob2RfbmV3LAkJCS8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCisgICAgMCwKKyAgICAiaW5zdGFuY2VtZXRob2QiLAorICAgIHNpemVvZihQeU1ldGhvZE9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilpbnN0YW5jZW1ldGhvZF9kZWFsbG9jLCAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpaW5zdGFuY2VtZXRob2RfY29tcGFyZSwgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWluc3RhbmNlbWV0aG9kX3JlcHIsICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWluc3RhbmNlbWV0aG9kX2hhc2gsICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgaW5zdGFuY2VtZXRob2RfY2FsbCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBpbnN0YW5jZW1ldGhvZF9nZXRhdHRybywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDICB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUywgLyogdHBfZmxhZ3MgKi8KKyAgICBpbnN0YW5jZW1ldGhvZF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpaW5zdGFuY2VtZXRob2RfdHJhdmVyc2UsICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIG9mZnNldG9mKFB5TWV0aG9kT2JqZWN0LCBpbV93ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGluc3RhbmNlbWV0aG9kX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGluc3RhbmNlbWV0aG9kX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgaW5zdGFuY2VtZXRob2RfZGVzY3JfZ2V0LCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpbnN0YW5jZW1ldGhvZF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogLyogQ2xlYXIgb3V0IHRoZSBmcmVlIGxpc3QgKi8KQEAgLTI2NTQsMjAgKzI2NTQsMjAgQEAKIGludAogUHlNZXRob2RfQ2xlYXJGcmVlTGlzdCh2b2lkKQogewotCWludCBmcmVlbGlzdF9zaXplID0gbnVtZnJlZTsKLQkKLQl3aGlsZSAoZnJlZV9saXN0KSB7Ci0JCVB5TWV0aG9kT2JqZWN0ICppbSA9IGZyZWVfbGlzdDsKLQkJZnJlZV9saXN0ID0gKFB5TWV0aG9kT2JqZWN0ICopKGltLT5pbV9zZWxmKTsKLQkJUHlPYmplY3RfR0NfRGVsKGltKTsKLQkJbnVtZnJlZS0tOwotCX0KLQlhc3NlcnQobnVtZnJlZSA9PSAwKTsKLQlyZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKKyAgICBpbnQgZnJlZWxpc3Rfc2l6ZSA9IG51bWZyZWU7CisKKyAgICB3aGlsZSAoZnJlZV9saXN0KSB7CisgICAgICAgIFB5TWV0aG9kT2JqZWN0ICppbSA9IGZyZWVfbGlzdDsKKyAgICAgICAgZnJlZV9saXN0ID0gKFB5TWV0aG9kT2JqZWN0ICopKGltLT5pbV9zZWxmKTsKKyAgICAgICAgUHlPYmplY3RfR0NfRGVsKGltKTsKKyAgICAgICAgbnVtZnJlZS0tOworICAgIH0KKyAgICBhc3NlcnQobnVtZnJlZSA9PSAwKTsKKyAgICByZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKIH0KIAogdm9pZAogUHlNZXRob2RfRmluaSh2b2lkKQogewotCSh2b2lkKVB5TWV0aG9kX0NsZWFyRnJlZUxpc3QoKTsKKyAgICAodm9pZClQeU1ldGhvZF9DbGVhckZyZWVMaXN0KCk7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2NvZGVvYmplY3QuYyBiL09iamVjdHMvY29kZW9iamVjdC5jCmluZGV4IGU5NGI0Y2MuLjljM2JmZWUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvY29kZW9iamVjdC5jCisrKyBiL09iamVjdHMvY29kZW9iamVjdC5jCkBAIC0zLDEyOSArMywxMjkgQEAKICNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKIAogI2RlZmluZSBOQU1FX0NIQVJTIFwKLQkiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgorICAgICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCiAKIC8qIGFsbF9uYW1lX2NoYXJzKHMpOiB0cnVlIGlmZiBhbGwgY2hhcnMgaW4gcyBhcmUgdmFsaWQgTkFNRV9DSEFSUyAqLwogCiBzdGF0aWMgaW50CiBhbGxfbmFtZV9jaGFycyh1bnNpZ25lZCBjaGFyICpzKQogewotCXN0YXRpYyBjaGFyIG9rX25hbWVfY2hhclsyNTZdOwotCXN0YXRpYyB1bnNpZ25lZCBjaGFyICpuYW1lX2NoYXJzID0gKHVuc2lnbmVkIGNoYXIgKilOQU1FX0NIQVJTOworICAgIHN0YXRpYyBjaGFyIG9rX25hbWVfY2hhclsyNTZdOworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpuYW1lX2NoYXJzID0gKHVuc2lnbmVkIGNoYXIgKilOQU1FX0NIQVJTOwogCi0JaWYgKG9rX25hbWVfY2hhclsqbmFtZV9jaGFyc10gPT0gMCkgewotCQl1bnNpZ25lZCBjaGFyICpwOwotCQlmb3IgKHAgPSBuYW1lX2NoYXJzOyAqcDsgcCsrKQotCQkJb2tfbmFtZV9jaGFyWypwXSA9IDE7Ci0JfQotCXdoaWxlICgqcykgewotCQlpZiAob2tfbmFtZV9jaGFyWypzKytdID09IDApCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKG9rX25hbWVfY2hhclsqbmFtZV9jaGFyc10gPT0gMCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyICpwOworICAgICAgICBmb3IgKHAgPSBuYW1lX2NoYXJzOyAqcDsgcCsrKQorICAgICAgICAgICAgb2tfbmFtZV9jaGFyWypwXSA9IDE7CisgICAgfQorICAgIHdoaWxlICgqcykgeworICAgICAgICBpZiAob2tfbmFtZV9jaGFyWypzKytdID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkCiBpbnRlcm5fc3RyaW5ncyhQeU9iamVjdCAqdHVwbGUpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaSA9IFB5VHVwbGVfR0VUX1NJWkUodHVwbGUpOyAtLWkgPj0gMDsgKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HRVRfSVRFTSh0dXBsZSwgaSk7Ci0JCWlmICh2ID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrRXhhY3QodikpIHsKLQkJCVB5X0ZhdGFsRXJyb3IoIm5vbi1zdHJpbmcgZm91bmQgaW4gY29kZSBzbG90Iik7Ci0JCX0KLQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmUHlUdXBsZV9HRVRfSVRFTSh0dXBsZSwgaSkpOwotCX0KKyAgICBmb3IgKGkgPSBQeVR1cGxlX0dFVF9TSVpFKHR1cGxlKTsgLS1pID49IDA7ICkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5VHVwbGVfR0VUX0lURU0odHVwbGUsIGkpOworICAgICAgICBpZiAodiA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVja0V4YWN0KHYpKSB7CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJub24tc3RyaW5nIGZvdW5kIGluIGNvZGUgc2xvdCIpOworICAgICAgICB9CisgICAgICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJlB5VHVwbGVfR0VUX0lURU0odHVwbGUsIGkpKTsKKyAgICB9CiB9CiAKIAogUHlDb2RlT2JqZWN0ICoKIFB5Q29kZV9OZXcoaW50IGFyZ2NvdW50LCBpbnQgbmxvY2FscywgaW50IHN0YWNrc2l6ZSwgaW50IGZsYWdzLAotCSAgIFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCAqY29uc3RzLCBQeU9iamVjdCAqbmFtZXMsCi0JICAgUHlPYmplY3QgKnZhcm5hbWVzLCBQeU9iamVjdCAqZnJlZXZhcnMsIFB5T2JqZWN0ICpjZWxsdmFycywKLQkgICBQeU9iamVjdCAqZmlsZW5hbWUsIFB5T2JqZWN0ICpuYW1lLCBpbnQgZmlyc3RsaW5lbm8sCi0JICAgUHlPYmplY3QgKmxub3RhYikKKyAgICAgICAgICAgUHlPYmplY3QgKmNvZGUsIFB5T2JqZWN0ICpjb25zdHMsIFB5T2JqZWN0ICpuYW1lcywKKyAgICAgICAgICAgUHlPYmplY3QgKnZhcm5hbWVzLCBQeU9iamVjdCAqZnJlZXZhcnMsIFB5T2JqZWN0ICpjZWxsdmFycywKKyAgICAgICAgICAgUHlPYmplY3QgKmZpbGVuYW1lLCBQeU9iamVjdCAqbmFtZSwgaW50IGZpcnN0bGluZW5vLAorICAgICAgICAgICBQeU9iamVjdCAqbG5vdGFiKQogewotCVB5Q29kZU9iamVjdCAqY287Ci0JUHlfc3NpemVfdCBpOwotCS8qIENoZWNrIGFyZ3VtZW50IHR5cGVzICovCi0JaWYgKGFyZ2NvdW50IDwgMCB8fCBubG9jYWxzIDwgMCB8fAotCSAgICBjb2RlID09IE5VTEwgfHwKLQkgICAgY29uc3RzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soY29uc3RzKSB8fAotCSAgICBuYW1lcyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKG5hbWVzKSB8fAotCSAgICB2YXJuYW1lcyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKHZhcm5hbWVzKSB8fAotCSAgICBmcmVldmFycyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGZyZWV2YXJzKSB8fAotCSAgICBjZWxsdmFycyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGNlbGx2YXJzKSB8fAotCSAgICBuYW1lID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG5hbWUpIHx8Ci0JICAgIGZpbGVuYW1lID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKGZpbGVuYW1lKSB8fAotCSAgICBsbm90YWIgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sobG5vdGFiKSB8fAotCSAgICAhUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyKGNvZGUpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaW50ZXJuX3N0cmluZ3MobmFtZXMpOwotCWludGVybl9zdHJpbmdzKHZhcm5hbWVzKTsKLQlpbnRlcm5fc3RyaW5ncyhmcmVldmFycyk7Ci0JaW50ZXJuX3N0cmluZ3MoY2VsbHZhcnMpOwotCS8qIEludGVybiBzZWxlY3RlZCBzdHJpbmcgY29uc3RhbnRzICovCi0JZm9yIChpID0gUHlUdXBsZV9TaXplKGNvbnN0cyk7IC0taSA+PSAwOyApIHsKLQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dldEl0ZW0oY29uc3RzLCBpKTsKLQkJaWYgKCFQeVN0cmluZ19DaGVjayh2KSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIWFsbF9uYW1lX2NoYXJzKCh1bnNpZ25lZCBjaGFyICopUHlTdHJpbmdfQVNfU1RSSU5HKHYpKSkKLQkJCWNvbnRpbnVlOwotCQlQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZQeVR1cGxlX0dFVF9JVEVNKGNvbnN0cywgaSkpOwotCX0KLQljbyA9IFB5T2JqZWN0X05FVyhQeUNvZGVPYmplY3QsICZQeUNvZGVfVHlwZSk7Ci0JaWYgKGNvICE9IE5VTEwpIHsKLQkJY28tPmNvX2FyZ2NvdW50ID0gYXJnY291bnQ7Ci0JCWNvLT5jb19ubG9jYWxzID0gbmxvY2FsczsKLQkJY28tPmNvX3N0YWNrc2l6ZSA9IHN0YWNrc2l6ZTsKLQkJY28tPmNvX2ZsYWdzID0gZmxhZ3M7Ci0JCVB5X0lOQ1JFRihjb2RlKTsKLQkJY28tPmNvX2NvZGUgPSBjb2RlOwotCQlQeV9JTkNSRUYoY29uc3RzKTsKLQkJY28tPmNvX2NvbnN0cyA9IGNvbnN0czsKLQkJUHlfSU5DUkVGKG5hbWVzKTsKLQkJY28tPmNvX25hbWVzID0gbmFtZXM7Ci0JCVB5X0lOQ1JFRih2YXJuYW1lcyk7Ci0JCWNvLT5jb192YXJuYW1lcyA9IHZhcm5hbWVzOwotCQlQeV9JTkNSRUYoZnJlZXZhcnMpOwotCQljby0+Y29fZnJlZXZhcnMgPSBmcmVldmFyczsKLQkJUHlfSU5DUkVGKGNlbGx2YXJzKTsKLQkJY28tPmNvX2NlbGx2YXJzID0gY2VsbHZhcnM7Ci0JCVB5X0lOQ1JFRihmaWxlbmFtZSk7Ci0JCWNvLT5jb19maWxlbmFtZSA9IGZpbGVuYW1lOwotCQlQeV9JTkNSRUYobmFtZSk7Ci0JCWNvLT5jb19uYW1lID0gbmFtZTsKLQkJY28tPmNvX2ZpcnN0bGluZW5vID0gZmlyc3RsaW5lbm87Ci0JCVB5X0lOQ1JFRihsbm90YWIpOwotCQljby0+Y29fbG5vdGFiID0gbG5vdGFiOwotICAgICAgICAgICAgICAgIGNvLT5jb196b21iaWVmcmFtZSA9IE5VTEw7Ci0JfQotCXJldHVybiBjbzsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIFB5X3NzaXplX3QgaTsKKyAgICAvKiBDaGVjayBhcmd1bWVudCB0eXBlcyAqLworICAgIGlmIChhcmdjb3VudCA8IDAgfHwgbmxvY2FscyA8IDAgfHwKKyAgICAgICAgY29kZSA9PSBOVUxMIHx8CisgICAgICAgIGNvbnN0cyA9PSBOVUxMIHx8ICFQeVR1cGxlX0NoZWNrKGNvbnN0cykgfHwKKyAgICAgICAgbmFtZXMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhuYW1lcykgfHwKKyAgICAgICAgdmFybmFtZXMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayh2YXJuYW1lcykgfHwKKyAgICAgICAgZnJlZXZhcnMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhmcmVldmFycykgfHwKKyAgICAgICAgY2VsbHZhcnMgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhjZWxsdmFycykgfHwKKyAgICAgICAgbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhuYW1lKSB8fAorICAgICAgICBmaWxlbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhmaWxlbmFtZSkgfHwKKyAgICAgICAgbG5vdGFiID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKGxub3RhYikgfHwKKyAgICAgICAgIVB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcihjb2RlKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGludGVybl9zdHJpbmdzKG5hbWVzKTsKKyAgICBpbnRlcm5fc3RyaW5ncyh2YXJuYW1lcyk7CisgICAgaW50ZXJuX3N0cmluZ3MoZnJlZXZhcnMpOworICAgIGludGVybl9zdHJpbmdzKGNlbGx2YXJzKTsKKyAgICAvKiBJbnRlcm4gc2VsZWN0ZWQgc3RyaW5nIGNvbnN0YW50cyAqLworICAgIGZvciAoaSA9IFB5VHVwbGVfU2l6ZShjb25zdHMpOyAtLWkgPj0gMDsgKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HZXRJdGVtKGNvbnN0cywgaSk7CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCFhbGxfbmFtZV9jaGFycygodW5zaWduZWQgY2hhciAqKVB5U3RyaW5nX0FTX1NUUklORyh2KSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmUHlUdXBsZV9HRVRfSVRFTShjb25zdHMsIGkpKTsKKyAgICB9CisgICAgY28gPSBQeU9iamVjdF9ORVcoUHlDb2RlT2JqZWN0LCAmUHlDb2RlX1R5cGUpOworICAgIGlmIChjbyAhPSBOVUxMKSB7CisgICAgICAgIGNvLT5jb19hcmdjb3VudCA9IGFyZ2NvdW50OworICAgICAgICBjby0+Y29fbmxvY2FscyA9IG5sb2NhbHM7CisgICAgICAgIGNvLT5jb19zdGFja3NpemUgPSBzdGFja3NpemU7CisgICAgICAgIGNvLT5jb19mbGFncyA9IGZsYWdzOworICAgICAgICBQeV9JTkNSRUYoY29kZSk7CisgICAgICAgIGNvLT5jb19jb2RlID0gY29kZTsKKyAgICAgICAgUHlfSU5DUkVGKGNvbnN0cyk7CisgICAgICAgIGNvLT5jb19jb25zdHMgPSBjb25zdHM7CisgICAgICAgIFB5X0lOQ1JFRihuYW1lcyk7CisgICAgICAgIGNvLT5jb19uYW1lcyA9IG5hbWVzOworICAgICAgICBQeV9JTkNSRUYodmFybmFtZXMpOworICAgICAgICBjby0+Y29fdmFybmFtZXMgPSB2YXJuYW1lczsKKyAgICAgICAgUHlfSU5DUkVGKGZyZWV2YXJzKTsKKyAgICAgICAgY28tPmNvX2ZyZWV2YXJzID0gZnJlZXZhcnM7CisgICAgICAgIFB5X0lOQ1JFRihjZWxsdmFycyk7CisgICAgICAgIGNvLT5jb19jZWxsdmFycyA9IGNlbGx2YXJzOworICAgICAgICBQeV9JTkNSRUYoZmlsZW5hbWUpOworICAgICAgICBjby0+Y29fZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgICAgICAgUHlfSU5DUkVGKG5hbWUpOworICAgICAgICBjby0+Y29fbmFtZSA9IG5hbWU7CisgICAgICAgIGNvLT5jb19maXJzdGxpbmVubyA9IGZpcnN0bGluZW5vOworICAgICAgICBQeV9JTkNSRUYobG5vdGFiKTsKKyAgICAgICAgY28tPmNvX2xub3RhYiA9IGxub3RhYjsKKyAgICAgICAgY28tPmNvX3pvbWJpZWZyYW1lID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGNvOwogfQogCiAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKFB5Q29kZU9iamVjdCwgeCkKIAogc3RhdGljIFB5TWVtYmVyRGVmIGNvZGVfbWVtYmVybGlzdFtdID0gewotCXsiY29fYXJnY291bnQiLAlUX0lOVCwJCU9GRihjb19hcmdjb3VudCksCVJFQURPTkxZfSwKLQl7ImNvX25sb2NhbHMiLAlUX0lOVCwJCU9GRihjb19ubG9jYWxzKSwJUkVBRE9OTFl9LAotCXsiY29fc3RhY2tzaXplIixUX0lOVCwJCU9GRihjb19zdGFja3NpemUpLAlSRUFET05MWX0sCi0JeyJjb19mbGFncyIsCVRfSU5ULAkJT0ZGKGNvX2ZsYWdzKSwJCVJFQURPTkxZfSwKLQl7ImNvX2NvZGUiLAlUX09CSkVDVCwJT0ZGKGNvX2NvZGUpLAkJUkVBRE9OTFl9LAotCXsiY29fY29uc3RzIiwJVF9PQkpFQ1QsCU9GRihjb19jb25zdHMpLAkJUkVBRE9OTFl9LAotCXsiY29fbmFtZXMiLAlUX09CSkVDVCwJT0ZGKGNvX25hbWVzKSwJCVJFQURPTkxZfSwKLQl7ImNvX3Zhcm5hbWVzIiwJVF9PQkpFQ1QsCU9GRihjb192YXJuYW1lcyksCVJFQURPTkxZfSwKLQl7ImNvX2ZyZWV2YXJzIiwJVF9PQkpFQ1QsCU9GRihjb19mcmVldmFycyksCVJFQURPTkxZfSwKLQl7ImNvX2NlbGx2YXJzIiwJVF9PQkpFQ1QsCU9GRihjb19jZWxsdmFycyksCVJFQURPTkxZfSwKLQl7ImNvX2ZpbGVuYW1lIiwJVF9PQkpFQ1QsCU9GRihjb19maWxlbmFtZSksCVJFQURPTkxZfSwKLQl7ImNvX25hbWUiLAlUX09CSkVDVCwJT0ZGKGNvX25hbWUpLAkJUkVBRE9OTFl9LAotCXsiY29fZmlyc3RsaW5lbm8iLCBUX0lOVCwJT0ZGKGNvX2ZpcnN0bGluZW5vKSwJUkVBRE9OTFl9LAotCXsiY29fbG5vdGFiIiwJVF9PQkpFQ1QsCU9GRihjb19sbm90YWIpLAkJUkVBRE9OTFl9LAotCXtOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsiY29fYXJnY291bnQiLCAgICAgVF9JTlQsICAgICAgICAgIE9GRihjb19hcmdjb3VudCksICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX25sb2NhbHMiLCAgICAgIFRfSU5ULCAgICAgICAgICBPRkYoY29fbmxvY2FscyksICAgICAgICBSRUFET05MWX0sCisgICAgeyJjb19zdGFja3NpemUiLFRfSU5ULCAgICAgICAgICAgICAgT0ZGKGNvX3N0YWNrc2l6ZSksICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fZmxhZ3MiLCAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihjb19mbGFncyksICAgICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX2NvZGUiLCAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoY29fY29kZSksICAgICAgICAgICBSRUFET05MWX0sCisgICAgeyJjb19jb25zdHMiLCAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGNvX2NvbnN0cyksICAgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fbmFtZXMiLCAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihjb19uYW1lcyksICAgICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX3Zhcm5hbWVzIiwgICAgIFRfT0JKRUNULCAgICAgICBPRkYoY29fdmFybmFtZXMpLCAgICAgICBSRUFET05MWX0sCisgICAgeyJjb19mcmVldmFycyIsICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGNvX2ZyZWV2YXJzKSwgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fY2VsbHZhcnMiLCAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihjb19jZWxsdmFycyksICAgICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX2ZpbGVuYW1lIiwgICAgIFRfT0JKRUNULCAgICAgICBPRkYoY29fZmlsZW5hbWUpLCAgICAgICBSRUFET05MWX0sCisgICAgeyJjb19uYW1lIiwgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGNvX25hbWUpLCAgICAgICAgICAgUkVBRE9OTFl9LAorICAgIHsiY29fZmlyc3RsaW5lbm8iLCBUX0lOVCwgICAgICAgICAgIE9GRihjb19maXJzdGxpbmVubyksICAgIFJFQURPTkxZfSwKKyAgICB7ImNvX2xub3RhYiIsICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoY29fbG5vdGFiKSwgICAgICAgICBSRUFET05MWX0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIC8qIEhlbHBlciBmb3IgY29kZV9uZXc6IHJldHVybiBhIHNoYWxsb3cgY29weSBvZiBhIHR1cGxlIHRoYXQgaXMKQEAgLTEzNCw0MiArMTM0LDQyIEBACiBzdGF0aWMgUHlPYmplY3QqCiB2YWxpZGF0ZV9hbmRfY29weV90dXBsZShQeU9iamVjdCAqdHVwKQogewotCVB5T2JqZWN0ICpuZXd0dXBsZTsKLQlQeU9iamVjdCAqaXRlbTsKLQlQeV9zc2l6ZV90IGksIGxlbjsKKyAgICBQeU9iamVjdCAqbmV3dHVwbGU7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgUHlfc3NpemVfdCBpLCBsZW47CiAKLQlsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKHR1cCk7Ci0JbmV3dHVwbGUgPSBQeVR1cGxlX05ldyhsZW4pOwotCWlmIChuZXd0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKHR1cCk7CisgICAgbmV3dHVwbGUgPSBQeVR1cGxlX05ldyhsZW4pOworICAgIGlmIChuZXd0dXBsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlpdGVtID0gUHlUdXBsZV9HRVRfSVRFTSh0dXAsIGkpOwotCQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChpdGVtKSkgewotCQkJUHlfSU5DUkVGKGl0ZW0pOwotCQl9Ci0JCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhpdGVtKSkgewotCQkJUHlFcnJfRm9ybWF0KAotCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCQkibmFtZSB0dXBsZXMgbXVzdCBjb250YWluIG9ubHkgIgotCQkJCSJzdHJpbmdzLCBub3QgJyUuNTAwcyciLAotCQkJCWl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKG5ld3R1cGxlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVsc2UgewotCQkJaXRlbSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQkJCVB5U3RyaW5nX0FTX1NUUklORyhpdGVtKSwKLQkJCQlQeVN0cmluZ19HRVRfU0laRShpdGVtKSk7Ci0JCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKG5ld3R1cGxlKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKG5ld3R1cGxlLCBpLCBpdGVtKTsKLQl9CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHR1cCwgaSk7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KGl0ZW0pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJuYW1lIHR1cGxlcyBtdXN0IGNvbnRhaW4gb25seSAiCisgICAgICAgICAgICAgICAgInN0cmluZ3MsIG5vdCAnJS41MDBzJyIsCisgICAgICAgICAgICAgICAgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3dHVwbGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLAorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pKTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3dHVwbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3dHVwbGUsIGksIGl0ZW0pOworICAgIH0KIAotCXJldHVybiBuZXd0dXBsZTsKKyAgICByZXR1cm4gbmV3dHVwbGU7CiB9CiAKIFB5RG9jX1NUUlZBUihjb2RlX2RvYywKQEAgLTE4MSwyODQgKzE4MSwyODQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb2RlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JaW50IGFyZ2NvdW50OwotCWludCBubG9jYWxzOwotCWludCBzdGFja3NpemU7Ci0JaW50IGZsYWdzOwotCVB5T2JqZWN0ICpjbyA9IE5VTEw7Ci0JUHlPYmplY3QgKmNvZGU7Ci0JUHlPYmplY3QgKmNvbnN0czsKLQlQeU9iamVjdCAqbmFtZXMsICpvdXJuYW1lcyA9IE5VTEw7Ci0JUHlPYmplY3QgKnZhcm5hbWVzLCAqb3VydmFybmFtZXMgPSBOVUxMOwotCVB5T2JqZWN0ICpmcmVldmFycyA9IE5VTEwsICpvdXJmcmVldmFycyA9IE5VTEw7Ci0JUHlPYmplY3QgKmNlbGx2YXJzID0gTlVMTCwgKm91cmNlbGx2YXJzID0gTlVMTDsKLQlQeU9iamVjdCAqZmlsZW5hbWU7Ci0JUHlPYmplY3QgKm5hbWU7Ci0JaW50IGZpcnN0bGluZW5vOwotCVB5T2JqZWN0ICpsbm90YWI7CisgICAgaW50IGFyZ2NvdW50OworICAgIGludCBubG9jYWxzOworICAgIGludCBzdGFja3NpemU7CisgICAgaW50IGZsYWdzOworICAgIFB5T2JqZWN0ICpjbyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNvZGU7CisgICAgUHlPYmplY3QgKmNvbnN0czsKKyAgICBQeU9iamVjdCAqbmFtZXMsICpvdXJuYW1lcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnZhcm5hbWVzLCAqb3VydmFybmFtZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmcmVldmFycyA9IE5VTEwsICpvdXJmcmVldmFycyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNlbGx2YXJzID0gTlVMTCwgKm91cmNlbGx2YXJzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZmlsZW5hbWU7CisgICAgUHlPYmplY3QgKm5hbWU7CisgICAgaW50IGZpcnN0bGluZW5vOworICAgIFB5T2JqZWN0ICpsbm90YWI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpaWlTTyFPIU8hU1NpU3xPIU8hOmNvZGUiLAotCQkJICAgICAgJmFyZ2NvdW50LCAmbmxvY2FscywgJnN0YWNrc2l6ZSwgJmZsYWdzLAotCQkJICAgICAgJmNvZGUsCi0JCQkgICAgICAmUHlUdXBsZV9UeXBlLCAmY29uc3RzLAotCQkJICAgICAgJlB5VHVwbGVfVHlwZSwgJm5hbWVzLAotCQkJICAgICAgJlB5VHVwbGVfVHlwZSwgJnZhcm5hbWVzLAotCQkJICAgICAgJmZpbGVuYW1lLCAmbmFtZSwKLQkJCSAgICAgICZmaXJzdGxpbmVubywgJmxub3RhYiwKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZmcmVldmFycywKLQkJCSAgICAgICZQeVR1cGxlX1R5cGUsICZjZWxsdmFycykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlpaVNPIU8hTyFTU2lTfE8hTyE6Y29kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmdjb3VudCwgJm5sb2NhbHMsICZzdGFja3NpemUsICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVR1cGxlX1R5cGUsICZjb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVR1cGxlX1R5cGUsICZuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJnZhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZW5hbWUsICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RsaW5lbm8sICZsbm90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeVR1cGxlX1R5cGUsICZmcmVldmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmNlbGx2YXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoYXJnY291bnQgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCVB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkiY29kZTogYXJnY291bnQgbXVzdCBub3QgYmUgbmVnYXRpdmUiKTsKLQkJZ290byBjbGVhbnVwOwotCX0KKyAgICBpZiAoYXJnY291bnQgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAiY29kZTogYXJnY291bnQgbXVzdCBub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCWlmIChubG9jYWxzIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoCi0JCQlQeUV4Y19WYWx1ZUVycm9yLAotCQkJImNvZGU6IG5sb2NhbHMgbXVzdCBub3QgYmUgbmVnYXRpdmUiKTsKLQkJZ290byBjbGVhbnVwOwotCX0KKyAgICBpZiAobmxvY2FscyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJjb2RlOiBubG9jYWxzIG11c3Qgbm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKLQlvdXJuYW1lcyA9IHZhbGlkYXRlX2FuZF9jb3B5X3R1cGxlKG5hbWVzKTsKLQlpZiAob3VybmFtZXMgPT0gTlVMTCkKLQkJZ290byBjbGVhbnVwOwotCW91cnZhcm5hbWVzID0gdmFsaWRhdGVfYW5kX2NvcHlfdHVwbGUodmFybmFtZXMpOwotCWlmIChvdXJ2YXJuYW1lcyA9PSBOVUxMKQotCQlnb3RvIGNsZWFudXA7Ci0JaWYgKGZyZWV2YXJzKQotCQlvdXJmcmVldmFycyA9IHZhbGlkYXRlX2FuZF9jb3B5X3R1cGxlKGZyZWV2YXJzKTsKLQllbHNlCi0JCW91cmZyZWV2YXJzID0gUHlUdXBsZV9OZXcoMCk7Ci0JaWYgKG91cmZyZWV2YXJzID09IE5VTEwpCi0JCWdvdG8gY2xlYW51cDsKLQlpZiAoY2VsbHZhcnMpCi0JCW91cmNlbGx2YXJzID0gdmFsaWRhdGVfYW5kX2NvcHlfdHVwbGUoY2VsbHZhcnMpOwotCWVsc2UKLQkJb3VyY2VsbHZhcnMgPSBQeVR1cGxlX05ldygwKTsKLQlpZiAob3VyY2VsbHZhcnMgPT0gTlVMTCkKLQkJZ290byBjbGVhbnVwOworICAgIG91cm5hbWVzID0gdmFsaWRhdGVfYW5kX2NvcHlfdHVwbGUobmFtZXMpOworICAgIGlmIChvdXJuYW1lcyA9PSBOVUxMKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgb3VydmFybmFtZXMgPSB2YWxpZGF0ZV9hbmRfY29weV90dXBsZSh2YXJuYW1lcyk7CisgICAgaWYgKG91cnZhcm5hbWVzID09IE5VTEwpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBpZiAoZnJlZXZhcnMpCisgICAgICAgIG91cmZyZWV2YXJzID0gdmFsaWRhdGVfYW5kX2NvcHlfdHVwbGUoZnJlZXZhcnMpOworICAgIGVsc2UKKyAgICAgICAgb3VyZnJlZXZhcnMgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAob3VyZnJlZXZhcnMgPT0gTlVMTCkKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGlmIChjZWxsdmFycykKKyAgICAgICAgb3VyY2VsbHZhcnMgPSB2YWxpZGF0ZV9hbmRfY29weV90dXBsZShjZWxsdmFycyk7CisgICAgZWxzZQorICAgICAgICBvdXJjZWxsdmFycyA9IFB5VHVwbGVfTmV3KDApOworICAgIGlmIChvdXJjZWxsdmFycyA9PSBOVUxMKQorICAgICAgICBnb3RvIGNsZWFudXA7CiAKLQljbyA9IChQeU9iamVjdCAqKVB5Q29kZV9OZXcoYXJnY291bnQsIG5sb2NhbHMsIHN0YWNrc2l6ZSwgZmxhZ3MsCi0JCQkJICAgIGNvZGUsIGNvbnN0cywgb3VybmFtZXMsIG91cnZhcm5hbWVzLAotCQkJCSAgICBvdXJmcmVldmFycywgb3VyY2VsbHZhcnMsIGZpbGVuYW1lLAotCQkJCSAgICBuYW1lLCBmaXJzdGxpbmVubywgbG5vdGFiKTsKKyAgICBjbyA9IChQeU9iamVjdCAqKVB5Q29kZV9OZXcoYXJnY291bnQsIG5sb2NhbHMsIHN0YWNrc2l6ZSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsIGNvbnN0cywgb3VybmFtZXMsIG91cnZhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXJmcmVldmFycywgb3VyY2VsbHZhcnMsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaXJzdGxpbmVubywgbG5vdGFiKTsKICAgY2xlYW51cDoKLQlQeV9YREVDUkVGKG91cm5hbWVzKTsKLQlQeV9YREVDUkVGKG91cnZhcm5hbWVzKTsKLQlQeV9YREVDUkVGKG91cmZyZWV2YXJzKTsKLQlQeV9YREVDUkVGKG91cmNlbGx2YXJzKTsKLQlyZXR1cm4gY287CisgICAgUHlfWERFQ1JFRihvdXJuYW1lcyk7CisgICAgUHlfWERFQ1JFRihvdXJ2YXJuYW1lcyk7CisgICAgUHlfWERFQ1JFRihvdXJmcmVldmFycyk7CisgICAgUHlfWERFQ1JFRihvdXJjZWxsdmFycyk7CisgICAgcmV0dXJuIGNvOwogfQogCiBzdGF0aWMgdm9pZAogY29kZV9kZWFsbG9jKFB5Q29kZU9iamVjdCAqY28pCiB7Ci0JUHlfWERFQ1JFRihjby0+Y29fY29kZSk7Ci0JUHlfWERFQ1JFRihjby0+Y29fY29uc3RzKTsKLQlQeV9YREVDUkVGKGNvLT5jb19uYW1lcyk7Ci0JUHlfWERFQ1JFRihjby0+Y29fdmFybmFtZXMpOwotCVB5X1hERUNSRUYoY28tPmNvX2ZyZWV2YXJzKTsKLQlQeV9YREVDUkVGKGNvLT5jb19jZWxsdmFycyk7Ci0JUHlfWERFQ1JFRihjby0+Y29fZmlsZW5hbWUpOwotCVB5X1hERUNSRUYoY28tPmNvX25hbWUpOwotCVB5X1hERUNSRUYoY28tPmNvX2xub3RhYik7Ci0gICAgICAgIGlmIChjby0+Y29fem9tYmllZnJhbWUgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBQeU9iamVjdF9HQ19EZWwoY28tPmNvX3pvbWJpZWZyYW1lKTsKLQlQeU9iamVjdF9ERUwoY28pOworICAgIFB5X1hERUNSRUYoY28tPmNvX2NvZGUpOworICAgIFB5X1hERUNSRUYoY28tPmNvX2NvbnN0cyk7CisgICAgUHlfWERFQ1JFRihjby0+Y29fbmFtZXMpOworICAgIFB5X1hERUNSRUYoY28tPmNvX3Zhcm5hbWVzKTsKKyAgICBQeV9YREVDUkVGKGNvLT5jb19mcmVldmFycyk7CisgICAgUHlfWERFQ1JFRihjby0+Y29fY2VsbHZhcnMpOworICAgIFB5X1hERUNSRUYoY28tPmNvX2ZpbGVuYW1lKTsKKyAgICBQeV9YREVDUkVGKGNvLT5jb19uYW1lKTsKKyAgICBQeV9YREVDUkVGKGNvLT5jb19sbm90YWIpOworICAgIGlmIChjby0+Y29fem9tYmllZnJhbWUgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfR0NfRGVsKGNvLT5jb196b21iaWVmcmFtZSk7CisgICAgUHlPYmplY3RfREVMKGNvKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvZGVfcmVwcihQeUNvZGVPYmplY3QgKmNvKQogewotCWNoYXIgYnVmWzUwMF07Ci0JaW50IGxpbmVubyA9IC0xOwotCWNoYXIgKmZpbGVuYW1lID0gIj8/PyI7Ci0JY2hhciAqbmFtZSA9ICI/Pz8iOworICAgIGNoYXIgYnVmWzUwMF07CisgICAgaW50IGxpbmVubyA9IC0xOworICAgIGNoYXIgKmZpbGVuYW1lID0gIj8/PyI7CisgICAgY2hhciAqbmFtZSA9ICI/Pz8iOwogCi0JaWYgKGNvLT5jb19maXJzdGxpbmVubyAhPSAwKQotCQlsaW5lbm8gPSBjby0+Y29fZmlyc3RsaW5lbm87Ci0JaWYgKGNvLT5jb19maWxlbmFtZSAmJiBQeVN0cmluZ19DaGVjayhjby0+Y29fZmlsZW5hbWUpKQotCQlmaWxlbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fZmlsZW5hbWUpOwotCWlmIChjby0+Y29fbmFtZSAmJiBQeVN0cmluZ19DaGVjayhjby0+Y29fbmFtZSkpCi0JCW5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoY28tPmNvX25hbWUpOwotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJICAgICAgIjxjb2RlIG9iamVjdCAlLjEwMHMgYXQgJXAsIGZpbGUgXCIlLjMwMHNcIiwgbGluZSAlZD4iLAotCQkgICAgICBuYW1lLCBjbywgZmlsZW5hbWUsIGxpbmVubyk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBpZiAoY28tPmNvX2ZpcnN0bGluZW5vICE9IDApCisgICAgICAgIGxpbmVubyA9IGNvLT5jb19maXJzdGxpbmVubzsKKyAgICBpZiAoY28tPmNvX2ZpbGVuYW1lICYmIFB5U3RyaW5nX0NoZWNrKGNvLT5jb19maWxlbmFtZSkpCisgICAgICAgIGZpbGVuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19maWxlbmFtZSk7CisgICAgaWYgKGNvLT5jb19uYW1lICYmIFB5U3RyaW5nX0NoZWNrKGNvLT5jb19uYW1lKSkKKyAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhjby0+Y29fbmFtZSk7CisgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgIjxjb2RlIG9iamVjdCAlLjEwMHMgYXQgJXAsIGZpbGUgXCIlLjMwMHNcIiwgbGluZSAlZD4iLAorICAgICAgICAgICAgICAgICAgbmFtZSwgY28sIGZpbGVuYW1lLCBsaW5lbm8pOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQKIGNvZGVfY29tcGFyZShQeUNvZGVPYmplY3QgKmNvLCBQeUNvZGVPYmplY3QgKmNwKQogewotCWludCBjbXA7Ci0JY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fbmFtZSwgY3AtPmNvX25hbWUpOwotCWlmIChjbXApIHJldHVybiBjbXA7Ci0JY21wID0gY28tPmNvX2FyZ2NvdW50IC0gY3AtPmNvX2FyZ2NvdW50OwotCWlmIChjbXApIGdvdG8gbm9ybWFsaXplOwotCWNtcCA9IGNvLT5jb19ubG9jYWxzIC0gY3AtPmNvX25sb2NhbHM7Ci0JaWYgKGNtcCkgZ290byBub3JtYWxpemU7Ci0JY21wID0gY28tPmNvX2ZsYWdzIC0gY3AtPmNvX2ZsYWdzOwotCWlmIChjbXApIGdvdG8gbm9ybWFsaXplOwotCWNtcCA9IGNvLT5jb19maXJzdGxpbmVubyAtIGNwLT5jb19maXJzdGxpbmVubzsKLQlpZiAoY21wKSBnb3RvIG5vcm1hbGl6ZTsKLQljbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19jb2RlLCBjcC0+Y29fY29kZSk7Ci0JaWYgKGNtcCkgcmV0dXJuIGNtcDsKLQljbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19jb25zdHMsIGNwLT5jb19jb25zdHMpOwotCWlmIChjbXApIHJldHVybiBjbXA7Ci0JY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fbmFtZXMsIGNwLT5jb19uYW1lcyk7Ci0JaWYgKGNtcCkgcmV0dXJuIGNtcDsKLQljbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb192YXJuYW1lcywgY3AtPmNvX3Zhcm5hbWVzKTsKLQlpZiAoY21wKSByZXR1cm4gY21wOwotCWNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX2ZyZWV2YXJzLCBjcC0+Y29fZnJlZXZhcnMpOwotCWlmIChjbXApIHJldHVybiBjbXA7Ci0JY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fY2VsbHZhcnMsIGNwLT5jb19jZWxsdmFycyk7Ci0JcmV0dXJuIGNtcDsKKyAgICBpbnQgY21wOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX25hbWUsIGNwLT5jb19uYW1lKTsKKyAgICBpZiAoY21wKSByZXR1cm4gY21wOworICAgIGNtcCA9IGNvLT5jb19hcmdjb3VudCAtIGNwLT5jb19hcmdjb3VudDsKKyAgICBpZiAoY21wKSBnb3RvIG5vcm1hbGl6ZTsKKyAgICBjbXAgPSBjby0+Y29fbmxvY2FscyAtIGNwLT5jb19ubG9jYWxzOworICAgIGlmIChjbXApIGdvdG8gbm9ybWFsaXplOworICAgIGNtcCA9IGNvLT5jb19mbGFncyAtIGNwLT5jb19mbGFnczsKKyAgICBpZiAoY21wKSBnb3RvIG5vcm1hbGl6ZTsKKyAgICBjbXAgPSBjby0+Y29fZmlyc3RsaW5lbm8gLSBjcC0+Y29fZmlyc3RsaW5lbm87CisgICAgaWYgKGNtcCkgZ290byBub3JtYWxpemU7CisgICAgY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fY29kZSwgY3AtPmNvX2NvZGUpOworICAgIGlmIChjbXApIHJldHVybiBjbXA7CisgICAgY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fY29uc3RzLCBjcC0+Y29fY29uc3RzKTsKKyAgICBpZiAoY21wKSByZXR1cm4gY21wOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX25hbWVzLCBjcC0+Y29fbmFtZXMpOworICAgIGlmIChjbXApIHJldHVybiBjbXA7CisgICAgY21wID0gUHlPYmplY3RfQ29tcGFyZShjby0+Y29fdmFybmFtZXMsIGNwLT5jb192YXJuYW1lcyk7CisgICAgaWYgKGNtcCkgcmV0dXJuIGNtcDsKKyAgICBjbXAgPSBQeU9iamVjdF9Db21wYXJlKGNvLT5jb19mcmVldmFycywgY3AtPmNvX2ZyZWV2YXJzKTsKKyAgICBpZiAoY21wKSByZXR1cm4gY21wOworICAgIGNtcCA9IFB5T2JqZWN0X0NvbXBhcmUoY28tPmNvX2NlbGx2YXJzLCBjcC0+Y29fY2VsbHZhcnMpOworICAgIHJldHVybiBjbXA7CiAKICBub3JtYWxpemU6Ci0JaWYgKGNtcCA+IDApCi0JCXJldHVybiAxOwotCWVsc2UgaWYgKGNtcCA8IDApCi0JCXJldHVybiAtMTsKLQllbHNlCi0JCXJldHVybiAwOworICAgIGlmIChjbXAgPiAwKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvZGVfcmljaGNvbXBhcmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewotCVB5Q29kZU9iamVjdCAqY28sICpjcDsKLQlpbnQgZXE7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeUNvZGVPYmplY3QgKmNvLCAqY3A7CisgICAgaW50IGVxOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoKG9wICE9IFB5X0VRICYmIG9wICE9IFB5X05FKSB8fAotCSAgICAhUHlDb2RlX0NoZWNrKHNlbGYpIHx8Ci0JICAgICFQeUNvZGVfQ2hlY2sob3RoZXIpKSB7CisgICAgaWYgKChvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSkgfHwKKyAgICAgICAgIVB5Q29kZV9DaGVjayhzZWxmKSB8fAorICAgICAgICAhUHlDb2RlX0NoZWNrKG90aGVyKSkgewogCi0JCS8qIFB5M0sgd2FybmluZyBpZiB0eXBlcyBhcmUgbm90IGVxdWFsIGFuZCBjb21wYXJpc29uCi0JCWlzbid0ID09IG9yICE9ICAqLwotCQlpZiAoUHlFcnJfV2FyblB5M2soImNvZGUgaW5lcXVhbGl0eSBjb21wYXJpc29ucyBub3Qgc3VwcG9ydGVkICIKLQkJCQkgICAiaW4gMy54IiwgMSkgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICAvKiBQeTNLIHdhcm5pbmcgaWYgdHlwZXMgYXJlIG5vdCBlcXVhbCBhbmQgY29tcGFyaXNvbgorICAgICAgICBpc24ndCA9PSBvciAhPSAgKi8KKyAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJjb2RlIGluZXF1YWxpdHkgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gMy54IiwgMSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CiAKLQljbyA9IChQeUNvZGVPYmplY3QgKilzZWxmOwotCWNwID0gKFB5Q29kZU9iamVjdCAqKW90aGVyOworICAgIGNvID0gKFB5Q29kZU9iamVjdCAqKXNlbGY7CisgICAgY3AgPSAoUHlDb2RlT2JqZWN0ICopb3RoZXI7CiAKLQllcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fbmFtZSwgY3AtPmNvX25hbWUsIFB5X0VRKTsKLQlpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOwotCWVxID0gY28tPmNvX2FyZ2NvdW50ID09IGNwLT5jb19hcmdjb3VudDsKLQlpZiAoIWVxKSBnb3RvIHVuZXF1YWw7Ci0JZXEgPSBjby0+Y29fbmxvY2FscyA9PSBjcC0+Y29fbmxvY2FsczsKLQlpZiAoIWVxKSBnb3RvIHVuZXF1YWw7Ci0JZXEgPSBjby0+Y29fZmxhZ3MgPT0gY3AtPmNvX2ZsYWdzOwotCWlmICghZXEpIGdvdG8gdW5lcXVhbDsKLQllcSA9IGNvLT5jb19maXJzdGxpbmVubyA9PSBjcC0+Y29fZmlyc3RsaW5lbm87Ci0JaWYgKCFlcSkgZ290byB1bmVxdWFsOwotCWVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19jb2RlLCBjcC0+Y29fY29kZSwgUHlfRVEpOwotCWlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7Ci0JZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX2NvbnN0cywgY3AtPmNvX2NvbnN0cywgUHlfRVEpOwotCWlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7Ci0JZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX25hbWVzLCBjcC0+Y29fbmFtZXMsIFB5X0VRKTsKLQlpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOwotCWVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb192YXJuYW1lcywgY3AtPmNvX3Zhcm5hbWVzLCBQeV9FUSk7Ci0JaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKLQllcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fZnJlZXZhcnMsIGNwLT5jb19mcmVldmFycywgUHlfRVEpOwotCWlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7Ci0JZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX2NlbGx2YXJzLCBjcC0+Y29fY2VsbHZhcnMsIFB5X0VRKTsKLQlpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOworICAgIGVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19uYW1lLCBjcC0+Y29fbmFtZSwgUHlfRVEpOworICAgIGlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBjby0+Y29fYXJnY291bnQgPT0gY3AtPmNvX2FyZ2NvdW50OworICAgIGlmICghZXEpIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IGNvLT5jb19ubG9jYWxzID09IGNwLT5jb19ubG9jYWxzOworICAgIGlmICghZXEpIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IGNvLT5jb19mbGFncyA9PSBjcC0+Y29fZmxhZ3M7CisgICAgaWYgKCFlcSkgZ290byB1bmVxdWFsOworICAgIGVxID0gY28tPmNvX2ZpcnN0bGluZW5vID09IGNwLT5jb19maXJzdGxpbmVubzsKKyAgICBpZiAoIWVxKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX2NvZGUsIGNwLT5jb19jb2RlLCBQeV9FUSk7CisgICAgaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fY29uc3RzLCBjcC0+Y29fY29uc3RzLCBQeV9FUSk7CisgICAgaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fbmFtZXMsIGNwLT5jb19uYW1lcywgUHlfRVEpOworICAgIGlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7CisgICAgZXEgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woY28tPmNvX3Zhcm5hbWVzLCBjcC0+Y29fdmFybmFtZXMsIFB5X0VRKTsKKyAgICBpZiAoZXEgPD0gMCkgZ290byB1bmVxdWFsOworICAgIGVxID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGNvLT5jb19mcmVldmFycywgY3AtPmNvX2ZyZWV2YXJzLCBQeV9FUSk7CisgICAgaWYgKGVxIDw9IDApIGdvdG8gdW5lcXVhbDsKKyAgICBlcSA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChjby0+Y29fY2VsbHZhcnMsIGNwLT5jb19jZWxsdmFycywgUHlfRVEpOworICAgIGlmIChlcSA8PSAwKSBnb3RvIHVuZXF1YWw7CiAKLQlpZiAob3AgPT0gUHlfRVEpCi0JCXJlcyA9IFB5X1RydWU7Ci0JZWxzZQotCQlyZXMgPSBQeV9GYWxzZTsKLQlnb3RvIGRvbmU7CisgICAgaWYgKG9wID09IFB5X0VRKQorICAgICAgICByZXMgPSBQeV9UcnVlOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlfRmFsc2U7CisgICAgZ290byBkb25lOwogCiAgIHVuZXF1YWw6Ci0JaWYgKGVxIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG9wID09IFB5X05FKQotCQlyZXMgPSBQeV9UcnVlOwotCWVsc2UKLQkJcmVzID0gUHlfRmFsc2U7CisgICAgaWYgKGVxIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG9wID09IFB5X05FKQorICAgICAgICByZXMgPSBQeV9UcnVlOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlfRmFsc2U7CiAKICAgZG9uZToKLQlQeV9JTkNSRUYocmVzKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X0lOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBsb25nCiBjb2RlX2hhc2goUHlDb2RlT2JqZWN0ICpjbykKIHsKLQlsb25nIGgsIGgwLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2OwotCWgwID0gUHlPYmplY3RfSGFzaChjby0+Y29fbmFtZSk7Ci0JaWYgKGgwID09IC0xKSByZXR1cm4gLTE7Ci0JaDEgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19jb2RlKTsKLQlpZiAoaDEgPT0gLTEpIHJldHVybiAtMTsKLQloMiA9IFB5T2JqZWN0X0hhc2goY28tPmNvX2NvbnN0cyk7Ci0JaWYgKGgyID09IC0xKSByZXR1cm4gLTE7Ci0JaDMgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19uYW1lcyk7Ci0JaWYgKGgzID09IC0xKSByZXR1cm4gLTE7Ci0JaDQgPSBQeU9iamVjdF9IYXNoKGNvLT5jb192YXJuYW1lcyk7Ci0JaWYgKGg0ID09IC0xKSByZXR1cm4gLTE7Ci0JaDUgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19mcmVldmFycyk7Ci0JaWYgKGg1ID09IC0xKSByZXR1cm4gLTE7Ci0JaDYgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19jZWxsdmFycyk7Ci0JaWYgKGg2ID09IC0xKSByZXR1cm4gLTE7Ci0JaCA9IGgwIF4gaDEgXiBoMiBeIGgzIF4gaDQgXiBoNSBeIGg2IF4KLQkJY28tPmNvX2FyZ2NvdW50IF4gY28tPmNvX25sb2NhbHMgXiBjby0+Y29fZmxhZ3M7Ci0JaWYgKGggPT0gLTEpIGggPSAtMjsKLQlyZXR1cm4gaDsKKyAgICBsb25nIGgsIGgwLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2OworICAgIGgwID0gUHlPYmplY3RfSGFzaChjby0+Y29fbmFtZSk7CisgICAgaWYgKGgwID09IC0xKSByZXR1cm4gLTE7CisgICAgaDEgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19jb2RlKTsKKyAgICBpZiAoaDEgPT0gLTEpIHJldHVybiAtMTsKKyAgICBoMiA9IFB5T2JqZWN0X0hhc2goY28tPmNvX2NvbnN0cyk7CisgICAgaWYgKGgyID09IC0xKSByZXR1cm4gLTE7CisgICAgaDMgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19uYW1lcyk7CisgICAgaWYgKGgzID09IC0xKSByZXR1cm4gLTE7CisgICAgaDQgPSBQeU9iamVjdF9IYXNoKGNvLT5jb192YXJuYW1lcyk7CisgICAgaWYgKGg0ID09IC0xKSByZXR1cm4gLTE7CisgICAgaDUgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19mcmVldmFycyk7CisgICAgaWYgKGg1ID09IC0xKSByZXR1cm4gLTE7CisgICAgaDYgPSBQeU9iamVjdF9IYXNoKGNvLT5jb19jZWxsdmFycyk7CisgICAgaWYgKGg2ID09IC0xKSByZXR1cm4gLTE7CisgICAgaCA9IGgwIF4gaDEgXiBoMiBeIGgzIF4gaDQgXiBoNSBeIGg2IF4KKyAgICAgICAgY28tPmNvX2FyZ2NvdW50IF4gY28tPmNvX25sb2NhbHMgXiBjby0+Y29fZmxhZ3M7CisgICAgaWYgKGggPT0gLTEpIGggPSAtMjsKKyAgICByZXR1cm4gaDsKIH0KIAogLyogWFhYIGNvZGUgb2JqZWN0cyBuZWVkIHRvIHBhcnRpY2lwYXRlIGluIEdDPyAqLwogCiBQeVR5cGVPYmplY3QgUHlDb2RlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiY29kZSIsCi0Jc2l6ZW9mKFB5Q29kZU9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3Rvciljb2RlX2RlYWxsb2MsIAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJLyogdHBfcHJpbnQgKi8KLQkwLCAJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYyljb2RlX2NvbXBhcmUsIAkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyljb2RlX3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWNvZGVfaGFzaCwgCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJLyogdHBfZmxhZ3MgKi8KLQljb2RlX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCS8qIHRwX2NsZWFyICovCi0JY29kZV9yaWNoY29tcGFyZSwJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQljb2RlX21lbWJlcmxpc3QsCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCS8qIHRwX2FsbG9jICovCi0JY29kZV9uZXcsCQkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiY29kZSIsCisgICAgc2l6ZW9mKFB5Q29kZU9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3Rvciljb2RlX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKWNvZGVfY29tcGFyZSwgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpY29kZV9yZXByLCAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWNvZGVfaGFzaCwgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBjb2RlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgY29kZV9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgY29kZV9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGNvZGVfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogfTsKIAogLyogQWxsIGFib3V0IGNfbG5vdGFiLgpAQCAtNDcxLDkgKzQ3MSw5IEBACiBwYWlycy4gIFRoZSBkZXRhaWxzIGFyZSBpbXBvcnRhbnQgYW5kIGRlbGljYXRlLCBiZXN0IGlsbHVzdHJhdGVkIGJ5IGV4YW1wbGU6CiAKICAgICBieXRlIGNvZGUgb2Zmc2V0ICAgIHNvdXJjZSBjb2RlIGxpbmUgbnVtYmVyCi0gICAgICAgIDAJCSAgICAxCi0gICAgICAgIDYJCSAgICAyCi0gICAgICAgNTAJCSAgICA3CisgICAgMCAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIDYgICAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICA1MCAgICAgICAgICAgICAgICAgICA3CiAgICAgICAzNTAgICAgICAgICAgICAgICAgIDMwNwogICAgICAgMzYxICAgICAgICAgICAgICAgICAzMDgKIApAQCAtNDkzLDEwICs0OTMsMTAgQEAKIAogICAgIGxpbmVubyA9IGFkZHIgPSAwCiAgICAgZm9yIGFkZHJfaW5jciwgbGluZV9pbmNyIGluIGNfbG5vdGFiOgotICAgICAgICBhZGRyICs9IGFkZHJfaW5jcgotICAgICAgICBpZiBhZGRyID4gQToKLSAgICAgICAgICAgIHJldHVybiBsaW5lbm8KLSAgICAgICAgbGluZW5vICs9IGxpbmVfaW5jcgorICAgIGFkZHIgKz0gYWRkcl9pbmNyCisgICAgaWYgYWRkciA+IEE6CisgICAgICAgIHJldHVybiBsaW5lbm8KKyAgICBsaW5lbm8gKz0gbGluZV9pbmNyCiAKIEluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmssIHdoZW4gdGhlIGFkZHIgZmllbGQgaW5jcmVtZW50cyBieSBtb3JlIHRoYW4gMjU1LAogdGhlIGxpbmUgIyBpbmNyZW1lbnQgaW4gZWFjaCBwYWlyIGdlbmVyYXRlZCBtdXN0IGJlIDAgdW50aWwgdGhlIHJlbWFpbmluZyBhZGRyCkBAIC01MDgsMTQ5ICs1MDgsMTQ5IEBACiBpbnQKIFB5Q29kZV9BZGRyMkxpbmUoUHlDb2RlT2JqZWN0ICpjbywgaW50IGFkZHJxKQogewotCWludCBzaXplID0gUHlTdHJpbmdfU2l6ZShjby0+Y29fbG5vdGFiKSAvIDI7Ci0JdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyKilQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fbG5vdGFiKTsKLQlpbnQgbGluZSA9IGNvLT5jb19maXJzdGxpbmVubzsKLQlpbnQgYWRkciA9IDA7Ci0Jd2hpbGUgKC0tc2l6ZSA+PSAwKSB7Ci0JCWFkZHIgKz0gKnArKzsKLQkJaWYgKGFkZHIgPiBhZGRycSkKLQkJCWJyZWFrOwotCQlsaW5lICs9ICpwKys7Ci0JfQotCXJldHVybiBsaW5lOworICAgIGludCBzaXplID0gUHlTdHJpbmdfU2l6ZShjby0+Y29fbG5vdGFiKSAvIDI7CisgICAgdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyKilQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fbG5vdGFiKTsKKyAgICBpbnQgbGluZSA9IGNvLT5jb19maXJzdGxpbmVubzsKKyAgICBpbnQgYWRkciA9IDA7CisgICAgd2hpbGUgKC0tc2l6ZSA+PSAwKSB7CisgICAgICAgIGFkZHIgKz0gKnArKzsKKyAgICAgICAgaWYgKGFkZHIgPiBhZGRycSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBsaW5lICs9ICpwKys7CisgICAgfQorICAgIHJldHVybiBsaW5lOwogfQogCi0vKiAKKy8qCiAgICBDaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGlzIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUuCiAKICAqLwogCi0JLyogVGhlIHRoZW9yeSBvZiBTRVRfTElORU5PLWxlc3MgdHJhY2luZy4KKyAgICAvKiBUaGUgdGhlb3J5IG9mIFNFVF9MSU5FTk8tbGVzcyB0cmFjaW5nLgogCi0JICAgSW4gYSBudXRzaGVsbCwgd2UgdXNlIHRoZSBjb19sbm90YWIgZmllbGQgb2YgdGhlIGNvZGUgb2JqZWN0Ci0JICAgdG8gdGVsbCB3aGVuIGV4ZWN1dGlvbiBoYXMgbW92ZWQgb250byBhIGRpZmZlcmVudCBsaW5lLgorICAgICAgIEluIGEgbnV0c2hlbGwsIHdlIHVzZSB0aGUgY29fbG5vdGFiIGZpZWxkIG9mIHRoZSBjb2RlIG9iamVjdAorICAgICAgIHRvIHRlbGwgd2hlbiBleGVjdXRpb24gaGFzIG1vdmVkIG9udG8gYSBkaWZmZXJlbnQgbGluZS4KIAotCSAgIEFzIG1lbnRpb25lZCBhYm92ZSwgdGhlIGJhc2ljIGlkZWEgaXMgc28gc2V0IHRoaW5ncyB1cCBzbwotCSAgIHRoYXQKKyAgICAgICBBcyBtZW50aW9uZWQgYWJvdmUsIHRoZSBiYXNpYyBpZGVhIGlzIHNvIHNldCB0aGluZ3MgdXAgc28KKyAgICAgICB0aGF0CiAKLQkgICAgICAgICAqaW5zdHJfbGIgPD0gZnJhbWUtPmZfbGFzdGkgPCAqaW5zdHJfdWIKKyAgICAgICAgICppbnN0cl9sYiA8PSBmcmFtZS0+Zl9sYXN0aSA8ICppbnN0cl91YgogCi0JICAgaXMgdHJ1ZSBzbyBsb25nIGFzIGV4ZWN1dGlvbiBkb2VzIG5vdCBjaGFuZ2UgbGluZXMuCisgICAgICAgaXMgdHJ1ZSBzbyBsb25nIGFzIGV4ZWN1dGlvbiBkb2VzIG5vdCBjaGFuZ2UgbGluZXMuCiAKLQkgICBUaGlzIGlzIGFsbCBmYWlybHkgc2ltcGxlLiAgRGlnZ2luZyB0aGUgaW5mb3JtYXRpb24gb3V0IG9mCi0JICAgY29fbG5vdGFiIHRha2VzIHNvbWUgd29yaywgYnV0IGlzIGNvbmNlcHR1YWxseSBjbGVhci4KKyAgICAgICBUaGlzIGlzIGFsbCBmYWlybHkgc2ltcGxlLiAgRGlnZ2luZyB0aGUgaW5mb3JtYXRpb24gb3V0IG9mCisgICAgICAgY29fbG5vdGFiIHRha2VzIHNvbWUgd29yaywgYnV0IGlzIGNvbmNlcHR1YWxseSBjbGVhci4KIAotCSAgIFNvbWV3aGF0IGhhcmRlciB0byBleHBsYWluIGlzIHdoeSB3ZSBkb24ndCAqYWx3YXlzKiBjYWxsIHRoZQotCSAgIGxpbmUgdHJhY2UgZnVuY3Rpb24gd2hlbiB0aGUgYWJvdmUgdGVzdCBmYWlscy4KKyAgICAgICBTb21ld2hhdCBoYXJkZXIgdG8gZXhwbGFpbiBpcyB3aHkgd2UgZG9uJ3QgKmFsd2F5cyogY2FsbCB0aGUKKyAgICAgICBsaW5lIHRyYWNlIGZ1bmN0aW9uIHdoZW4gdGhlIGFib3ZlIHRlc3QgZmFpbHMuCiAKLQkgICBDb25zaWRlciB0aGlzIGNvZGU6CisgICAgICAgQ29uc2lkZXIgdGhpcyBjb2RlOgogCi0JICAgMTogZGVmIGYoYSk6Ci0JICAgMjogICAgIGlmIGE6Ci0JICAgMzogICAgICAgIHByaW50IDEKLQkgICA0OiAgICAgZWxzZToKLQkgICA1OiAgICAgICAgcHJpbnQgMgorICAgICAgIDE6IGRlZiBmKGEpOgorICAgICAgIDI6ICAgICBpZiBhOgorICAgICAgIDM6ICAgICAgICBwcmludCAxCisgICAgICAgNDogICAgIGVsc2U6CisgICAgICAgNTogICAgICAgIHByaW50IDIKIAotCSAgIHdoaWNoIGNvbXBpbGVzIHRvIHRoaXM6CisgICAgICAgd2hpY2ggY29tcGlsZXMgdG8gdGhpczoKIAotCSAgIDIgICAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGEpCi0JCSAgICAgICAzIEpVTVBfSUZfRkFMU0UgICAgICAgICAgICA5ICh0byAxNSkKLQkJICAgICAgIDYgUE9QX1RPUAorICAgICAgIDIgICAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGEpCisgICAgICAgICAgICAgICAgICAgMyBKVU1QX0lGX0ZBTFNFICAgICAgICAgICAgOSAodG8gMTUpCisgICAgICAgICAgICAgICAgICAgNiBQT1BfVE9QCiAKLQkgICAzICAgICAgICAgICA3IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotCQkgICAgICAxMCBQUklOVF9JVEVNCi0JCSAgICAgIDExIFBSSU5UX05FV0xJTkUKLQkJICAgICAgMTIgSlVNUF9GT1JXQVJEICAgICAgICAgICAgIDYgKHRvIDIxKQotCQkgPj4gICAxNSBQT1BfVE9QCisgICAgICAgMyAgICAgICAgICAgNyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgICAgICAgICAgIDEwIFBSSU5UX0lURU0KKyAgICAgICAgICAgICAgICAgIDExIFBSSU5UX05FV0xJTkUKKyAgICAgICAgICAgICAgICAgIDEyIEpVTVBfRk9SV0FSRCAgICAgICAgICAgICA2ICh0byAyMSkKKyAgICAgICAgID4+ICAgMTUgUE9QX1RPUAogCi0JICAgNSAgICAgICAgICAxNiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMikKLQkJICAgICAgMTkgUFJJTlRfSVRFTQotCQkgICAgICAyMCBQUklOVF9ORVdMSU5FCi0JCSA+PiAgIDIxIExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotCQkgICAgICAyNCBSRVRVUk5fVkFMVUUKKyAgICAgICA1ICAgICAgICAgIDE2IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICgyKQorICAgICAgICAgICAgICAgICAgMTkgUFJJTlRfSVRFTQorICAgICAgICAgICAgICAgICAgMjAgUFJJTlRfTkVXTElORQorICAgICAgICAgPj4gICAyMSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKyAgICAgICAgICAgICAgMjQgUkVUVVJOX1ZBTFVFCiAKLQkgICBJZiAnYScgaXMgZmFsc2UsIGV4ZWN1dGlvbiB3aWxsIGp1bXAgdG8gaW5zdHJ1Y3Rpb24gYXQgb2Zmc2V0Ci0JICAgMTUgYW5kIHRoZSBjb19sbm90YWIgd2lsbCBjbGFpbSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8KLQkgICBsaW5lIDMuICBUaGlzIGlzIGF0IGJlc3QgbWlzbGVhZGluZy4gIEluIHRoaXMgY2FzZSB3ZSBjb3VsZAotCSAgIGFzc29jaWF0ZSB0aGUgUE9QX1RPUCB3aXRoIGxpbmUgNCwgYnV0IHRoYXQgZG9lc24ndCBtYWtlCi0JICAgc2Vuc2UgaW4gYWxsIGNhc2VzIChJIHRoaW5rKS4KKyAgICAgICBJZiAnYScgaXMgZmFsc2UsIGV4ZWN1dGlvbiB3aWxsIGp1bXAgdG8gaW5zdHJ1Y3Rpb24gYXQgb2Zmc2V0CisgICAgICAgMTUgYW5kIHRoZSBjb19sbm90YWIgd2lsbCBjbGFpbSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8KKyAgICAgICBsaW5lIDMuICBUaGlzIGlzIGF0IGJlc3QgbWlzbGVhZGluZy4gIEluIHRoaXMgY2FzZSB3ZSBjb3VsZAorICAgICAgIGFzc29jaWF0ZSB0aGUgUE9QX1RPUCB3aXRoIGxpbmUgNCwgYnV0IHRoYXQgZG9lc24ndCBtYWtlCisgICAgICAgc2Vuc2UgaW4gYWxsIGNhc2VzIChJIHRoaW5rKS4KIAotCSAgIFdoYXQgd2UgZG8gaXMgb25seSBjYWxsIHRoZSBsaW5lIHRyYWNlIGZ1bmN0aW9uIGlmIHRoZSBjb19sbm90YWIKLQkgICBpbmRpY2F0ZXMgd2UgaGF2ZSBqdW1wZWQgdG8gdGhlICpzdGFydCogb2YgYSBsaW5lLCBpLmUuIGlmIHRoZQotCSAgIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gb2Zmc2V0IG1hdGNoZXMgdGhlIG9mZnNldCBnaXZlbiBmb3IgdGhlCi0JICAgc3RhcnQgb2YgYSBsaW5lIGJ5IHRoZSBjb19sbm90YWIuCisgICAgICAgV2hhdCB3ZSBkbyBpcyBvbmx5IGNhbGwgdGhlIGxpbmUgdHJhY2UgZnVuY3Rpb24gaWYgdGhlIGNvX2xub3RhYgorICAgICAgIGluZGljYXRlcyB3ZSBoYXZlIGp1bXBlZCB0byB0aGUgKnN0YXJ0KiBvZiBhIGxpbmUsIGkuZS4gaWYgdGhlCisgICAgICAgY3VycmVudCBpbnN0cnVjdGlvbiBvZmZzZXQgbWF0Y2hlcyB0aGUgb2Zmc2V0IGdpdmVuIGZvciB0aGUKKyAgICAgICBzdGFydCBvZiBhIGxpbmUgYnkgdGhlIGNvX2xub3RhYi4KIAotCSAgIFRoaXMgYWxzbyB0YWtlcyBjYXJlIG9mIHRoZSBzaXR1YXRpb24gd2hlcmUgJ2EnIGlzIHRydWUuCi0JICAgRXhlY3V0aW9uIHdpbGwganVtcCBmcm9tIGluc3RydWN0aW9uIG9mZnNldCAxMiB0byBvZmZzZXQgMjEuCi0JICAgVGhlbiB0aGUgY29fbG5vdGFiIHdvdWxkIGltcGx5IHRoYXQgZXhlY3V0aW9uIGhhcyBtb3ZlZCB0byBsaW5lCi0JICAgNSwgd2hpY2ggaXMgYWdhaW4gbWlzbGVhZGluZy4KKyAgICAgICBUaGlzIGFsc28gdGFrZXMgY2FyZSBvZiB0aGUgc2l0dWF0aW9uIHdoZXJlICdhJyBpcyB0cnVlLgorICAgICAgIEV4ZWN1dGlvbiB3aWxsIGp1bXAgZnJvbSBpbnN0cnVjdGlvbiBvZmZzZXQgMTIgdG8gb2Zmc2V0IDIxLgorICAgICAgIFRoZW4gdGhlIGNvX2xub3RhYiB3b3VsZCBpbXBseSB0aGF0IGV4ZWN1dGlvbiBoYXMgbW92ZWQgdG8gbGluZQorICAgICAgIDUsIHdoaWNoIGlzIGFnYWluIG1pc2xlYWRpbmcuCiAKLQkgICBXaHkgZG8gd2Ugc2V0IGZfbGluZW5vIHdoZW4gdHJhY2luZz8gIFdlbGwsIGNvbnNpZGVyIHRoZSBjb2RlCi0JICAgYWJvdmUgd2hlbiAnYScgaXMgdHJ1ZS4gIElmIHN0ZXBwaW5nIHRocm91Z2ggdGhpcyB3aXRoICduJyBpbgotCSAgIHBkYiwgeW91IHdvdWxkIHN0b3AgYXQgbGluZSAxIHdpdGggYSAiY2FsbCIgdHlwZSBldmVudCwgdGhlbgotCSAgIGxpbmUgZXZlbnRzIG9uIGxpbmVzIDIgYW5kIDMsIHRoZW4gYSAicmV0dXJuIiB0eXBlIGV2ZW50IC0tIGJ1dAotCSAgIHlvdSB3b3VsZCBiZSBzaG93biBsaW5lIDUgZHVyaW5nIHRoaXMgZXZlbnQuICBUaGlzIGlzIGEgY2hhbmdlCi0JICAgZnJvbSB0aGUgYmVoYXZpb3VyIGluIDIuMiBhbmQgYmVmb3JlLCBhbmQgSSd2ZSBmb3VuZCBpdAotCSAgIGNvbmZ1c2luZyBpbiBwcmFjdGljZS4gIEJ5IHNldHRpbmcgYW5kIHVzaW5nIGZfbGluZW5vIHdoZW4KLQkgICB0cmFjaW5nLCBvbmUgY2FuIHJlcG9ydCBhIGxpbmUgbnVtYmVyIGRpZmZlcmVudCBmcm9tIHRoYXQKLQkgICBzdWdnZXN0ZWQgYnkgZl9sYXN0aSBvbiB0aGlzIG9uZSBvY2Nhc2lvbiB3aGVyZSBpdCdzIGRlc2lyYWJsZS4KLQkqLworICAgICAgIFdoeSBkbyB3ZSBzZXQgZl9saW5lbm8gd2hlbiB0cmFjaW5nPyAgV2VsbCwgY29uc2lkZXIgdGhlIGNvZGUKKyAgICAgICBhYm92ZSB3aGVuICdhJyBpcyB0cnVlLiAgSWYgc3RlcHBpbmcgdGhyb3VnaCB0aGlzIHdpdGggJ24nIGluCisgICAgICAgcGRiLCB5b3Ugd291bGQgc3RvcCBhdCBsaW5lIDEgd2l0aCBhICJjYWxsIiB0eXBlIGV2ZW50LCB0aGVuCisgICAgICAgbGluZSBldmVudHMgb24gbGluZXMgMiBhbmQgMywgdGhlbiBhICJyZXR1cm4iIHR5cGUgZXZlbnQgLS0gYnV0CisgICAgICAgeW91IHdvdWxkIGJlIHNob3duIGxpbmUgNSBkdXJpbmcgdGhpcyBldmVudC4gIFRoaXMgaXMgYSBjaGFuZ2UKKyAgICAgICBmcm9tIHRoZSBiZWhhdmlvdXIgaW4gMi4yIGFuZCBiZWZvcmUsIGFuZCBJJ3ZlIGZvdW5kIGl0CisgICAgICAgY29uZnVzaW5nIGluIHByYWN0aWNlLiAgQnkgc2V0dGluZyBhbmQgdXNpbmcgZl9saW5lbm8gd2hlbgorICAgICAgIHRyYWNpbmcsIG9uZSBjYW4gcmVwb3J0IGEgbGluZSBudW1iZXIgZGlmZmVyZW50IGZyb20gdGhhdAorICAgICAgIHN1Z2dlc3RlZCBieSBmX2xhc3RpIG9uIHRoaXMgb25lIG9jY2FzaW9uIHdoZXJlIGl0J3MgZGVzaXJhYmxlLgorICAgICovCiAKIAotaW50IAoraW50CiBQeUNvZGVfQ2hlY2tMaW5lTnVtYmVyKFB5Q29kZU9iamVjdCogY28sIGludCBsYXN0aSwgUHlBZGRyUGFpciAqYm91bmRzKQogewotICAgICAgICBpbnQgc2l6ZSwgYWRkciwgbGluZTsKLSAgICAgICAgdW5zaWduZWQgY2hhciogcDsKKyAgICBpbnQgc2l6ZSwgYWRkciwgbGluZTsKKyAgICB1bnNpZ25lZCBjaGFyKiBwOwogCi0gICAgICAgIHAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19sbm90YWIpOwotICAgICAgICBzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoY28tPmNvX2xub3RhYikgLyAyOworICAgIHAgPSAodW5zaWduZWQgY2hhciopUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19sbm90YWIpOworICAgIHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShjby0+Y29fbG5vdGFiKSAvIDI7CiAKLSAgICAgICAgYWRkciA9IDA7Ci0gICAgICAgIGxpbmUgPSBjby0+Y29fZmlyc3RsaW5lbm87Ci0gICAgICAgIGFzc2VydChsaW5lID4gMCk7CisgICAgYWRkciA9IDA7CisgICAgbGluZSA9IGNvLT5jb19maXJzdGxpbmVubzsKKyAgICBhc3NlcnQobGluZSA+IDApOwogCi0gICAgICAgIC8qIHBvc3NpYmxlIG9wdGltaXphdGlvbjogaWYgZi0+Zl9sYXN0aSA9PSBpbnN0cl91YgotICAgICAgICAgICAobGlrZWx5IHRvIGJlIGEgY29tbW9uIGNhc2UpIHRoZW4gd2UgYWxyZWFkeSBrbm93Ci0gICAgICAgICAgIGluc3RyX2xiIC0tIGlmIHdlIHN0b3JlZCB0aGUgbWF0Y2hpbmcgdmFsdWUgb2YgcAotICAgICAgICAgICBzb213aGVyZSB3ZSBjb3VsZCBza2lwIHRoZSBmaXJzdCB3aGlsZSBsb29wLiAqLworICAgIC8qIHBvc3NpYmxlIG9wdGltaXphdGlvbjogaWYgZi0+Zl9sYXN0aSA9PSBpbnN0cl91YgorICAgICAgIChsaWtlbHkgdG8gYmUgYSBjb21tb24gY2FzZSkgdGhlbiB3ZSBhbHJlYWR5IGtub3cKKyAgICAgICBpbnN0cl9sYiAtLSBpZiB3ZSBzdG9yZWQgdGhlIG1hdGNoaW5nIHZhbHVlIG9mIHAKKyAgICAgICBzb213aGVyZSB3ZSBjb3VsZCBza2lwIHRoZSBmaXJzdCB3aGlsZSBsb29wLiAqLwogCi0gICAgICAgIC8qIHNlZSBjb21tZW50cyBpbiBjb21waWxlLmMgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZgotICAgICAgICAgICBjb19sbm90YWIuICBBIHBvaW50IHRvIHJlbWVtYmVyOiBpbmNyZW1lbnRzIHRvIHAKLSAgICAgICAgICAgc2hvdWxkIGNvbWUgaW4gcGFpcnMgLS0gYWx0aG91Z2ggd2UgZG9uJ3QgY2FyZSBhYm91dAotICAgICAgICAgICB0aGUgbGluZSBpbmNyZW1lbnRzIGhlcmUsIHRyZWF0aW5nIHRoZW0gYXMgYnl0ZQotICAgICAgICAgICBpbmNyZW1lbnRzIGdldHMgY29uZnVzaW5nLCB0byBzYXkgdGhlIGxlYXN0LiAqLworICAgIC8qIHNlZSBjb21tZW50cyBpbiBjb21waWxlLmMgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZgorICAgICAgIGNvX2xub3RhYi4gIEEgcG9pbnQgdG8gcmVtZW1iZXI6IGluY3JlbWVudHMgdG8gcAorICAgICAgIHNob3VsZCBjb21lIGluIHBhaXJzIC0tIGFsdGhvdWdoIHdlIGRvbid0IGNhcmUgYWJvdXQKKyAgICAgICB0aGUgbGluZSBpbmNyZW1lbnRzIGhlcmUsIHRyZWF0aW5nIHRoZW0gYXMgYnl0ZQorICAgICAgIGluY3JlbWVudHMgZ2V0cyBjb25mdXNpbmcsIHRvIHNheSB0aGUgbGVhc3QuICovCiAKLSAgICAgICAgYm91bmRzLT5hcF9sb3dlciA9IDA7Ci0gICAgICAgIHdoaWxlIChzaXplID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChhZGRyICsgKnAgPiBsYXN0aSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGFkZHIgKz0gKnArKzsKLSAgICAgICAgICAgICAgICBpZiAoKnApIAotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLT5hcF9sb3dlciA9IGFkZHI7Ci0gICAgICAgICAgICAgICAgbGluZSArPSAqcCsrOwotICAgICAgICAgICAgICAgIC0tc2l6ZTsKKyAgICBib3VuZHMtPmFwX2xvd2VyID0gMDsKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgaWYgKGFkZHIgKyAqcCA+IGxhc3RpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGFkZHIgKz0gKnArKzsKKyAgICAgICAgaWYgKCpwKQorICAgICAgICAgICAgYm91bmRzLT5hcF9sb3dlciA9IGFkZHI7CisgICAgICAgIGxpbmUgKz0gKnArKzsKKyAgICAgICAgLS1zaXplOworICAgIH0KKworICAgIC8qIElmIGxhc3RpIGFuZCBhZGRyIGRvbid0IG1hdGNoIGV4YWN0bHksIHdlIGRvbid0IHdhbnQgdG8KKyAgICAgICBjaGFuZ2UgdGhlIGxpbmVubyBzbG90IG9uIHRoZSBmcmFtZSBvciBleGVjdXRlIGEgdHJhY2UKKyAgICAgICBmdW5jdGlvbi4gIFJldHVybiAtMSBpbnN0ZWFkLgorICAgICovCisgICAgaWYgKGFkZHIgIT0gbGFzdGkpCisgICAgICAgIGxpbmUgPSAtMTsKKworICAgIGlmIChzaXplID4gMCkgeworICAgICAgICB3aGlsZSAoLS1zaXplID49IDApIHsKKyAgICAgICAgICAgIGFkZHIgKz0gKnArKzsKKyAgICAgICAgICAgIGlmICgqcCsrKQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGJvdW5kcy0+YXBfdXBwZXIgPSBhZGRyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYm91bmRzLT5hcF91cHBlciA9IElOVF9NQVg7CisgICAgfQogCi0gICAgICAgIC8qIElmIGxhc3RpIGFuZCBhZGRyIGRvbid0IG1hdGNoIGV4YWN0bHksIHdlIGRvbid0IHdhbnQgdG8KLSAgICAgICAgICAgY2hhbmdlIHRoZSBsaW5lbm8gc2xvdCBvbiB0aGUgZnJhbWUgb3IgZXhlY3V0ZSBhIHRyYWNlCi0gICAgICAgICAgIGZ1bmN0aW9uLiAgUmV0dXJuIC0xIGluc3RlYWQuCi0gICAgICAgICovCi0gICAgICAgIGlmIChhZGRyICE9IGxhc3RpKQotICAgICAgICAgICAgICAgIGxpbmUgPSAtMTsKLSAgICAgICAgCi0gICAgICAgIGlmIChzaXplID4gMCkgewotICAgICAgICAgICAgICAgIHdoaWxlICgtLXNpemUgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkciArPSAqcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpwKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBib3VuZHMtPmFwX3VwcGVyID0gYWRkcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBib3VuZHMtPmFwX3VwcGVyID0gSU5UX01BWDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsaW5lOworICAgIHJldHVybiBsaW5lOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMgYi9PYmplY3RzL2NvbXBsZXhvYmplY3QuYwppbmRleCBhMjMzNGM5Li5lOGM4ZWJiIDEwMDY0NAotLS0gYS9PYmplY3RzL2NvbXBsZXhvYmplY3QuYworKysgYi9PYmplY3RzL2NvbXBsZXhvYmplY3QuYwpAQCAtMjcsOCArMjcsOCBAQAogICAgcHJlY2lzaW9uIGZvciBwcmFjdGljYWwgdXNlLgogKi8KIAotI2RlZmluZSBQUkVDX1JFUFIJMTcKLSNkZWZpbmUgUFJFQ19TVFIJMTIKKyNkZWZpbmUgUFJFQ19SRVBSICAgICAgIDE3CisjZGVmaW5lIFBSRUNfU1RSICAgICAgICAxMgogCiAvKiBlbGVtZW50YXJ5IG9wZXJhdGlvbnMgb24gY29tcGxleCBudW1iZXJzICovCiAKQEAgLTM3LDQyOSArMzcsNDI5IEBACiBQeV9jb21wbGV4CiBjX3N1bShQeV9jb21wbGV4IGEsIFB5X2NvbXBsZXggYikKIHsKLQlQeV9jb21wbGV4IHI7Ci0Jci5yZWFsID0gYS5yZWFsICsgYi5yZWFsOwotCXIuaW1hZyA9IGEuaW1hZyArIGIuaW1hZzsKLQlyZXR1cm4gcjsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgci5yZWFsID0gYS5yZWFsICsgYi5yZWFsOworICAgIHIuaW1hZyA9IGEuaW1hZyArIGIuaW1hZzsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlfY29tcGxleAogY19kaWZmKFB5X2NvbXBsZXggYSwgUHlfY29tcGxleCBiKQogewotCVB5X2NvbXBsZXggcjsKLQlyLnJlYWwgPSBhLnJlYWwgLSBiLnJlYWw7Ci0Jci5pbWFnID0gYS5pbWFnIC0gYi5pbWFnOwotCXJldHVybiByOworICAgIFB5X2NvbXBsZXggcjsKKyAgICByLnJlYWwgPSBhLnJlYWwgLSBiLnJlYWw7CisgICAgci5pbWFnID0gYS5pbWFnIC0gYi5pbWFnOworICAgIHJldHVybiByOwogfQogCiBQeV9jb21wbGV4CiBjX25lZyhQeV9jb21wbGV4IGEpCiB7Ci0JUHlfY29tcGxleCByOwotCXIucmVhbCA9IC1hLnJlYWw7Ci0Jci5pbWFnID0gLWEuaW1hZzsKLQlyZXR1cm4gcjsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgci5yZWFsID0gLWEucmVhbDsKKyAgICByLmltYWcgPSAtYS5pbWFnOworICAgIHJldHVybiByOwogfQogCiBQeV9jb21wbGV4CiBjX3Byb2QoUHlfY29tcGxleCBhLCBQeV9jb21wbGV4IGIpCiB7Ci0JUHlfY29tcGxleCByOwotCXIucmVhbCA9IGEucmVhbCpiLnJlYWwgLSBhLmltYWcqYi5pbWFnOwotCXIuaW1hZyA9IGEucmVhbCpiLmltYWcgKyBhLmltYWcqYi5yZWFsOwotCXJldHVybiByOworICAgIFB5X2NvbXBsZXggcjsKKyAgICByLnJlYWwgPSBhLnJlYWwqYi5yZWFsIC0gYS5pbWFnKmIuaW1hZzsKKyAgICByLmltYWcgPSBhLnJlYWwqYi5pbWFnICsgYS5pbWFnKmIucmVhbDsKKyAgICByZXR1cm4gcjsKIH0KIAogUHlfY29tcGxleAogY19xdW90KFB5X2NvbXBsZXggYSwgUHlfY29tcGxleCBiKQogewotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlUaGlzIHdhcyB0aGUgb3JpZ2luYWwgYWxnb3JpdGhtLiAgSXQncyBncm9zc2x5IHByb25lIHRvIHNwdXJpb3VzCi0Jb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyBlcnJvcnMuICBJdCBhbHNvIG1lcnJpbHkgZGl2aWRlcyBieSAwIGRlc3BpdGUKLQljaGVja2luZyBmb3IgdGhhdCghKS4gIFRoZSBjb2RlIHN0aWxsIHNlcnZlcyBhIGRvYyBwdXJwb3NlIGhlcmUsIGFzCi0JdGhlIGFsZ29yaXRobSBmb2xsb3dpbmcgaXMgYSBzaW1wbGUgYnktY2FzZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhpcwotCW9uZToKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgVGhpcyB3YXMgdGhlIG9yaWdpbmFsIGFsZ29yaXRobS4gIEl0J3MgZ3Jvc3NseSBwcm9uZSB0byBzcHVyaW91cworICAgIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgZXJyb3JzLiAgSXQgYWxzbyBtZXJyaWx5IGRpdmlkZXMgYnkgMCBkZXNwaXRlCisgICAgY2hlY2tpbmcgZm9yIHRoYXQoISkuICBUaGUgY29kZSBzdGlsbCBzZXJ2ZXMgYSBkb2MgcHVycG9zZSBoZXJlLCBhcworICAgIHRoZSBhbGdvcml0aG0gZm9sbG93aW5nIGlzIGEgc2ltcGxlIGJ5LWNhc2VzIHRyYW5zZm9ybWF0aW9uIG9mIHRoaXMKKyAgICBvbmU6CiAKLQlQeV9jb21wbGV4IHI7Ci0JZG91YmxlIGQgPSBiLnJlYWwqYi5yZWFsICsgYi5pbWFnKmIuaW1hZzsKLQlpZiAoZCA9PSAwLikKLQkJZXJybm8gPSBFRE9NOwotCXIucmVhbCA9IChhLnJlYWwqYi5yZWFsICsgYS5pbWFnKmIuaW1hZykvZDsKLQlyLmltYWcgPSAoYS5pbWFnKmIucmVhbCAtIGEucmVhbCpiLmltYWcpL2Q7Ci0JcmV0dXJuIHI7Ci0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIFB5X2NvbXBsZXggcjsKKyAgICBkb3VibGUgZCA9IGIucmVhbCpiLnJlYWwgKyBiLmltYWcqYi5pbWFnOworICAgIGlmIChkID09IDAuKQorICAgICAgICBlcnJubyA9IEVET007CisgICAgci5yZWFsID0gKGEucmVhbCpiLnJlYWwgKyBhLmltYWcqYi5pbWFnKS9kOworICAgIHIuaW1hZyA9IChhLmltYWcqYi5yZWFsIC0gYS5yZWFsKmIuaW1hZykvZDsKKyAgICByZXR1cm4gcjsKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkvKiBUaGlzIGFsZ29yaXRobSBpcyBiZXR0ZXIsIGFuZCBpcyBwcmV0dHkgb2J2aW91czogIGZpcnN0IGRpdmlkZSB0aGUKLQkgKiBudW1lcmF0b3JzIGFuZCBkZW5vbWluYXRvciBieSB3aGljaGV2ZXIgb2Yge2IucmVhbCwgYi5pbWFnfSBoYXMKLQkgKiBsYXJnZXIgbWFnbml0dWRlLiAgVGhlIGVhcmxpZXN0IHJlZmVyZW5jZSBJIGZvdW5kIHdhcyB0byBDQUNNCi0JICogQWxnb3JpdGhtIDExNiAoQ29tcGxleCBEaXZpc2lvbiwgUm9iZXJ0IEwuIFNtaXRoLCBTdGFuZm9yZAotCSAqIFVuaXZlcnNpdHkpLiAgQXMgdXN1YWwsIHRob3VnaCwgd2UncmUgc3RpbGwgaWdub3JpbmcgYWxsIElFRUUKLQkgKiBlbmRjYXNlcy4KLQkgKi8KLQkgUHlfY29tcGxleCByOwkvKiB0aGUgcmVzdWx0ICovCi0gCSBjb25zdCBkb3VibGUgYWJzX2JyZWFsID0gYi5yZWFsIDwgMCA/IC1iLnJlYWwgOiBiLnJlYWw7Ci0JIGNvbnN0IGRvdWJsZSBhYnNfYmltYWcgPSBiLmltYWcgPCAwID8gLWIuaW1hZyA6IGIuaW1hZzsKKyAgICAvKiBUaGlzIGFsZ29yaXRobSBpcyBiZXR0ZXIsIGFuZCBpcyBwcmV0dHkgb2J2aW91czogIGZpcnN0IGRpdmlkZSB0aGUKKyAgICAgKiBudW1lcmF0b3JzIGFuZCBkZW5vbWluYXRvciBieSB3aGljaGV2ZXIgb2Yge2IucmVhbCwgYi5pbWFnfSBoYXMKKyAgICAgKiBsYXJnZXIgbWFnbml0dWRlLiAgVGhlIGVhcmxpZXN0IHJlZmVyZW5jZSBJIGZvdW5kIHdhcyB0byBDQUNNCisgICAgICogQWxnb3JpdGhtIDExNiAoQ29tcGxleCBEaXZpc2lvbiwgUm9iZXJ0IEwuIFNtaXRoLCBTdGFuZm9yZAorICAgICAqIFVuaXZlcnNpdHkpLiAgQXMgdXN1YWwsIHRob3VnaCwgd2UncmUgc3RpbGwgaWdub3JpbmcgYWxsIElFRUUKKyAgICAgKiBlbmRjYXNlcy4KKyAgICAgKi8KKyAgICAgUHlfY29tcGxleCByOyAgICAgIC8qIHRoZSByZXN1bHQgKi8KKyAgICAgY29uc3QgZG91YmxlIGFic19icmVhbCA9IGIucmVhbCA8IDAgPyAtYi5yZWFsIDogYi5yZWFsOworICAgICBjb25zdCBkb3VibGUgYWJzX2JpbWFnID0gYi5pbWFnIDwgMCA/IC1iLmltYWcgOiBiLmltYWc7CiAKLQkgaWYgKGFic19icmVhbCA+PSBhYnNfYmltYWcpIHsKLSAJCS8qIGRpdmlkZSB0b3BzIGFuZCBib3R0b20gYnkgYi5yZWFsICovCi0JIAlpZiAoYWJzX2JyZWFsID09IDAuMCkgewotCSAJCWVycm5vID0gRURPTTsKLQkgCQlyLnJlYWwgPSByLmltYWcgPSAwLjA7Ci0JIAl9Ci0JIAllbHNlIHsKLQkgCQljb25zdCBkb3VibGUgcmF0aW8gPSBiLmltYWcgLyBiLnJlYWw7Ci0JIAkJY29uc3QgZG91YmxlIGRlbm9tID0gYi5yZWFsICsgYi5pbWFnICogcmF0aW87Ci0JIAkJci5yZWFsID0gKGEucmVhbCArIGEuaW1hZyAqIHJhdGlvKSAvIGRlbm9tOwotCSAJCXIuaW1hZyA9IChhLmltYWcgLSBhLnJlYWwgKiByYXRpbykgLyBkZW5vbTsKLQkgCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qIGRpdmlkZSB0b3BzIGFuZCBib3R0b20gYnkgYi5pbWFnICovCi0JCWNvbnN0IGRvdWJsZSByYXRpbyA9IGIucmVhbCAvIGIuaW1hZzsKLQkJY29uc3QgZG91YmxlIGRlbm9tID0gYi5yZWFsICogcmF0aW8gKyBiLmltYWc7Ci0JCWFzc2VydChiLmltYWcgIT0gMC4wKTsKLQkJci5yZWFsID0gKGEucmVhbCAqIHJhdGlvICsgYS5pbWFnKSAvIGRlbm9tOwotCQlyLmltYWcgPSAoYS5pbWFnICogcmF0aW8gLSBhLnJlYWwpIC8gZGVub207Ci0JfQotCXJldHVybiByOworICAgICBpZiAoYWJzX2JyZWFsID49IGFic19iaW1hZykgeworICAgICAgICAvKiBkaXZpZGUgdG9wcyBhbmQgYm90dG9tIGJ5IGIucmVhbCAqLworICAgICAgICBpZiAoYWJzX2JyZWFsID09IDAuMCkgeworICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICAgICAgci5yZWFsID0gci5pbWFnID0gMC4wOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3QgZG91YmxlIHJhdGlvID0gYi5pbWFnIC8gYi5yZWFsOworICAgICAgICAgICAgY29uc3QgZG91YmxlIGRlbm9tID0gYi5yZWFsICsgYi5pbWFnICogcmF0aW87CisgICAgICAgICAgICByLnJlYWwgPSAoYS5yZWFsICsgYS5pbWFnICogcmF0aW8pIC8gZGVub207CisgICAgICAgICAgICByLmltYWcgPSAoYS5pbWFnIC0gYS5yZWFsICogcmF0aW8pIC8gZGVub207CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGRpdmlkZSB0b3BzIGFuZCBib3R0b20gYnkgYi5pbWFnICovCisgICAgICAgIGNvbnN0IGRvdWJsZSByYXRpbyA9IGIucmVhbCAvIGIuaW1hZzsKKyAgICAgICAgY29uc3QgZG91YmxlIGRlbm9tID0gYi5yZWFsICogcmF0aW8gKyBiLmltYWc7CisgICAgICAgIGFzc2VydChiLmltYWcgIT0gMC4wKTsKKyAgICAgICAgci5yZWFsID0gKGEucmVhbCAqIHJhdGlvICsgYS5pbWFnKSAvIGRlbm9tOworICAgICAgICByLmltYWcgPSAoYS5pbWFnICogcmF0aW8gLSBhLnJlYWwpIC8gZGVub207CisgICAgfQorICAgIHJldHVybiByOwogfQogCiBQeV9jb21wbGV4CiBjX3BvdyhQeV9jb21wbGV4IGEsIFB5X2NvbXBsZXggYikKIHsKLQlQeV9jb21wbGV4IHI7Ci0JZG91YmxlIHZhYnMsbGVuLGF0LHBoYXNlOwotCWlmIChiLnJlYWwgPT0gMC4gJiYgYi5pbWFnID09IDAuKSB7Ci0JCXIucmVhbCA9IDEuOwotCQlyLmltYWcgPSAwLjsKLQl9Ci0JZWxzZSBpZiAoYS5yZWFsID09IDAuICYmIGEuaW1hZyA9PSAwLikgewotCQlpZiAoYi5pbWFnICE9IDAuIHx8IGIucmVhbCA8IDAuKQotCQkJZXJybm8gPSBFRE9NOwotCQlyLnJlYWwgPSAwLjsKLQkJci5pbWFnID0gMC47Ci0JfQotCWVsc2UgewotCQl2YWJzID0gaHlwb3QoYS5yZWFsLGEuaW1hZyk7Ci0JCWxlbiA9IHBvdyh2YWJzLGIucmVhbCk7Ci0JCWF0ID0gYXRhbjIoYS5pbWFnLCBhLnJlYWwpOwotCQlwaGFzZSA9IGF0KmIucmVhbDsKLQkJaWYgKGIuaW1hZyAhPSAwLjApIHsKLQkJCWxlbiAvPSBleHAoYXQqYi5pbWFnKTsKLQkJCXBoYXNlICs9IGIuaW1hZypsb2codmFicyk7Ci0JCX0KLQkJci5yZWFsID0gbGVuKmNvcyhwaGFzZSk7Ci0JCXIuaW1hZyA9IGxlbipzaW4ocGhhc2UpOwotCX0KLQlyZXR1cm4gcjsKKyAgICBQeV9jb21wbGV4IHI7CisgICAgZG91YmxlIHZhYnMsbGVuLGF0LHBoYXNlOworICAgIGlmIChiLnJlYWwgPT0gMC4gJiYgYi5pbWFnID09IDAuKSB7CisgICAgICAgIHIucmVhbCA9IDEuOworICAgICAgICByLmltYWcgPSAwLjsKKyAgICB9CisgICAgZWxzZSBpZiAoYS5yZWFsID09IDAuICYmIGEuaW1hZyA9PSAwLikgeworICAgICAgICBpZiAoYi5pbWFnICE9IDAuIHx8IGIucmVhbCA8IDAuKQorICAgICAgICAgICAgZXJybm8gPSBFRE9NOworICAgICAgICByLnJlYWwgPSAwLjsKKyAgICAgICAgci5pbWFnID0gMC47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB2YWJzID0gaHlwb3QoYS5yZWFsLGEuaW1hZyk7CisgICAgICAgIGxlbiA9IHBvdyh2YWJzLGIucmVhbCk7CisgICAgICAgIGF0ID0gYXRhbjIoYS5pbWFnLCBhLnJlYWwpOworICAgICAgICBwaGFzZSA9IGF0KmIucmVhbDsKKyAgICAgICAgaWYgKGIuaW1hZyAhPSAwLjApIHsKKyAgICAgICAgICAgIGxlbiAvPSBleHAoYXQqYi5pbWFnKTsKKyAgICAgICAgICAgIHBoYXNlICs9IGIuaW1hZypsb2codmFicyk7CisgICAgICAgIH0KKyAgICAgICAgci5yZWFsID0gbGVuKmNvcyhwaGFzZSk7CisgICAgICAgIHIuaW1hZyA9IGxlbipzaW4ocGhhc2UpOworICAgIH0KKyAgICByZXR1cm4gcjsKIH0KIAogc3RhdGljIFB5X2NvbXBsZXgKIGNfcG93dShQeV9jb21wbGV4IHgsIGxvbmcgbikKIHsKLQlQeV9jb21wbGV4IHIsIHA7Ci0JbG9uZyBtYXNrID0gMTsKLQlyID0gY18xOwotCXAgPSB4OwotCXdoaWxlIChtYXNrID4gMCAmJiBuID49IG1hc2spIHsKLQkJaWYgKG4gJiBtYXNrKQotCQkJciA9IGNfcHJvZChyLHApOwotCQltYXNrIDw8PSAxOwotCQlwID0gY19wcm9kKHAscCk7Ci0JfQotCXJldHVybiByOworICAgIFB5X2NvbXBsZXggciwgcDsKKyAgICBsb25nIG1hc2sgPSAxOworICAgIHIgPSBjXzE7CisgICAgcCA9IHg7CisgICAgd2hpbGUgKG1hc2sgPiAwICYmIG4gPj0gbWFzaykgeworICAgICAgICBpZiAobiAmIG1hc2spCisgICAgICAgICAgICByID0gY19wcm9kKHIscCk7CisgICAgICAgIG1hc2sgPDw9IDE7CisgICAgICAgIHAgPSBjX3Byb2QocCxwKTsKKyAgICB9CisgICAgcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBQeV9jb21wbGV4CiBjX3Bvd2koUHlfY29tcGxleCB4LCBsb25nIG4pCiB7Ci0JUHlfY29tcGxleCBjbjsKKyAgICBQeV9jb21wbGV4IGNuOwogCi0JaWYgKG4gPiAxMDAgfHwgbiA8IC0xMDApIHsKLQkJY24ucmVhbCA9IChkb3VibGUpIG47Ci0JCWNuLmltYWcgPSAwLjsKLQkJcmV0dXJuIGNfcG93KHgsY24pOwotCX0KLQllbHNlIGlmIChuID4gMCkKLQkJcmV0dXJuIGNfcG93dSh4LG4pOwotCWVsc2UKLQkJcmV0dXJuIGNfcXVvdChjXzEsY19wb3d1KHgsLW4pKTsKKyAgICBpZiAobiA+IDEwMCB8fCBuIDwgLTEwMCkgeworICAgICAgICBjbi5yZWFsID0gKGRvdWJsZSkgbjsKKyAgICAgICAgY24uaW1hZyA9IDAuOworICAgICAgICByZXR1cm4gY19wb3coeCxjbik7CisgICAgfQorICAgIGVsc2UgaWYgKG4gPiAwKQorICAgICAgICByZXR1cm4gY19wb3d1KHgsbik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gY19xdW90KGNfMSxjX3Bvd3UoeCwtbikpOwogCiB9CiAKIGRvdWJsZQogY19hYnMoUHlfY29tcGxleCB6KQogewotCS8qIHNldHMgZXJybm8gPSBFUkFOR0Ugb24gb3ZlcmZsb3c7ICBvdGhlcndpc2UgZXJybm8gPSAwICovCi0JZG91YmxlIHJlc3VsdDsKKyAgICAvKiBzZXRzIGVycm5vID0gRVJBTkdFIG9uIG92ZXJmbG93OyAgb3RoZXJ3aXNlIGVycm5vID0gMCAqLworICAgIGRvdWJsZSByZXN1bHQ7CiAKLQlpZiAoIVB5X0lTX0ZJTklURSh6LnJlYWwpIHx8ICFQeV9JU19GSU5JVEUoei5pbWFnKSkgewotCQkvKiBDOTkgcnVsZXM6IGlmIGVpdGhlciB0aGUgcmVhbCBvciB0aGUgaW1hZ2luYXJ5IHBhcnQgaXMgYW4KLQkJICAgaW5maW5pdHksIHJldHVybiBpbmZpbml0eSwgZXZlbiBpZiB0aGUgb3RoZXIgcGFydCBpcyBhCi0JCSAgIE5hTi4gKi8KLQkJaWYgKFB5X0lTX0lORklOSVRZKHoucmVhbCkpIHsKLQkJCXJlc3VsdCA9IGZhYnMoei5yZWFsKTsKLQkJCWVycm5vID0gMDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKFB5X0lTX0lORklOSVRZKHouaW1hZykpIHsKLQkJCXJlc3VsdCA9IGZhYnMoei5pbWFnKTsKLQkJCWVycm5vID0gMDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJLyogZWl0aGVyIHRoZSByZWFsIG9yIGltYWdpbmFyeSBwYXJ0IGlzIGEgTmFOLAotCQkgICBhbmQgbmVpdGhlciBpcyBpbmZpbml0ZS4gUmVzdWx0IHNob3VsZCBiZSBOYU4uICovCi0JCXJldHVybiBQeV9OQU47Ci0JfQotCXJlc3VsdCA9IGh5cG90KHoucmVhbCwgei5pbWFnKTsKLQlpZiAoIVB5X0lTX0ZJTklURShyZXN1bHQpKQotCQllcnJubyA9IEVSQU5HRTsKLQllbHNlCi0JCWVycm5vID0gMDsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICghUHlfSVNfRklOSVRFKHoucmVhbCkgfHwgIVB5X0lTX0ZJTklURSh6LmltYWcpKSB7CisgICAgICAgIC8qIEM5OSBydWxlczogaWYgZWl0aGVyIHRoZSByZWFsIG9yIHRoZSBpbWFnaW5hcnkgcGFydCBpcyBhbgorICAgICAgICAgICBpbmZpbml0eSwgcmV0dXJuIGluZmluaXR5LCBldmVuIGlmIHRoZSBvdGhlciBwYXJ0IGlzIGEKKyAgICAgICAgICAgTmFOLiAqLworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoei5yZWFsKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gZmFicyh6LnJlYWwpOworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoei5pbWFnKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gZmFicyh6LmltYWcpOworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAvKiBlaXRoZXIgdGhlIHJlYWwgb3IgaW1hZ2luYXJ5IHBhcnQgaXMgYSBOYU4sCisgICAgICAgICAgIGFuZCBuZWl0aGVyIGlzIGluZmluaXRlLiBSZXN1bHQgc2hvdWxkIGJlIE5hTi4gKi8KKyAgICAgICAgcmV0dXJuIFB5X05BTjsKKyAgICB9CisgICAgcmVzdWx0ID0gaHlwb3Qoei5yZWFsLCB6LmltYWcpOworICAgIGlmICghUHlfSVNfRklOSVRFKHJlc3VsdCkpCisgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgIGVsc2UKKyAgICAgICAgZXJybm8gPSAwOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X3N1YnR5cGVfZnJvbV9jX2NvbXBsZXgoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9jb21wbGV4IGN2YWwpCiB7Ci0JUHlPYmplY3QgKm9wOworICAgIFB5T2JqZWN0ICpvcDsKIAotCW9wID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JaWYgKG9wICE9IE5VTEwpCi0JCSgoUHlDb21wbGV4T2JqZWN0ICopb3ApLT5jdmFsID0gY3ZhbDsKLQlyZXR1cm4gb3A7CisgICAgb3AgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAob3AgIT0gTlVMTCkKKyAgICAgICAgKChQeUNvbXBsZXhPYmplY3QgKilvcCktPmN2YWwgPSBjdmFsOworICAgIHJldHVybiBvcDsKIH0KIAogUHlPYmplY3QgKgogUHlDb21wbGV4X0Zyb21DQ29tcGxleChQeV9jb21wbGV4IGN2YWwpCiB7Ci0JcmVnaXN0ZXIgUHlDb21wbGV4T2JqZWN0ICpvcDsKKyAgICByZWdpc3RlciBQeUNvbXBsZXhPYmplY3QgKm9wOwogCi0JLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLwotCW9wID0gKFB5Q29tcGxleE9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5Q29tcGxleE9iamVjdCkpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeU9iamVjdF9JTklUKG9wLCAmUHlDb21wbGV4X1R5cGUpOwotCW9wLT5jdmFsID0gY3ZhbDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIC8qIElubGluZSBQeU9iamVjdF9OZXcgKi8KKyAgICBvcCA9IChQeUNvbXBsZXhPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeUNvbXBsZXhPYmplY3QpKTsKKyAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgUHlPYmplY3RfSU5JVChvcCwgJlB5Q29tcGxleF9UeXBlKTsKKyAgICBvcC0+Y3ZhbCA9IGN2YWw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfc3VidHlwZV9mcm9tX2RvdWJsZXMoUHlUeXBlT2JqZWN0ICp0eXBlLCBkb3VibGUgcmVhbCwgZG91YmxlIGltYWcpCiB7Ci0JUHlfY29tcGxleCBjOwotCWMucmVhbCA9IHJlYWw7Ci0JYy5pbWFnID0gaW1hZzsKLQlyZXR1cm4gY29tcGxleF9zdWJ0eXBlX2Zyb21fY19jb21wbGV4KHR5cGUsIGMpOworICAgIFB5X2NvbXBsZXggYzsKKyAgICBjLnJlYWwgPSByZWFsOworICAgIGMuaW1hZyA9IGltYWc7CisgICAgcmV0dXJuIGNvbXBsZXhfc3VidHlwZV9mcm9tX2NfY29tcGxleCh0eXBlLCBjKTsKIH0KIAogUHlPYmplY3QgKgogUHlDb21wbGV4X0Zyb21Eb3VibGVzKGRvdWJsZSByZWFsLCBkb3VibGUgaW1hZykKIHsKLQlQeV9jb21wbGV4IGM7Ci0JYy5yZWFsID0gcmVhbDsKLQljLmltYWcgPSBpbWFnOwotCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGMpOworICAgIFB5X2NvbXBsZXggYzsKKyAgICBjLnJlYWwgPSByZWFsOworICAgIGMuaW1hZyA9IGltYWc7CisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7CiB9CiAKIGRvdWJsZQogUHlDb21wbGV4X1JlYWxBc0RvdWJsZShQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKFB5Q29tcGxleF9DaGVjayhvcCkpIHsKLQkJcmV0dXJuICgoUHlDb21wbGV4T2JqZWN0ICopb3ApLT5jdmFsLnJlYWw7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4gUHlGbG9hdF9Bc0RvdWJsZShvcCk7Ci0JfQorICAgIGlmIChQeUNvbXBsZXhfQ2hlY2sob3ApKSB7CisgICAgICAgIHJldHVybiAoKFB5Q29tcGxleE9iamVjdCAqKW9wKS0+Y3ZhbC5yZWFsOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfQXNEb3VibGUob3ApOworICAgIH0KIH0KIAogZG91YmxlCiBQeUNvbXBsZXhfSW1hZ0FzRG91YmxlKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoUHlDb21wbGV4X0NoZWNrKG9wKSkgewotCQlyZXR1cm4gKChQeUNvbXBsZXhPYmplY3QgKilvcCktPmN2YWwuaW1hZzsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiAwLjA7Ci0JfQorICAgIGlmIChQeUNvbXBsZXhfQ2hlY2sob3ApKSB7CisgICAgICAgIHJldHVybiAoKFB5Q29tcGxleE9iamVjdCAqKW9wKS0+Y3ZhbC5pbWFnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDAuMDsKKyAgICB9CiB9CiAKIFB5X2NvbXBsZXgKIFB5Q29tcGxleF9Bc0NDb21wbGV4KFB5T2JqZWN0ICpvcCkKIHsKLQlQeV9jb21wbGV4IGN2OwotCVB5T2JqZWN0ICpuZXdvcCA9IE5VTEw7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjb21wbGV4X3N0ciA9IE5VTEw7CisgICAgUHlfY29tcGxleCBjdjsKKyAgICBQeU9iamVjdCAqbmV3b3AgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqY29tcGxleF9zdHIgPSBOVUxMOwogCi0JYXNzZXJ0KG9wKTsKLQkvKiBJZiBvcCBpcyBhbHJlYWR5IG9mIHR5cGUgUHlDb21wbGV4X1R5cGUsIHJldHVybiBpdHMgdmFsdWUgKi8KLQlpZiAoUHlDb21wbGV4X0NoZWNrKG9wKSkgewotCQlyZXR1cm4gKChQeUNvbXBsZXhPYmplY3QgKilvcCktPmN2YWw7Ci0JfQotCS8qIElmIG5vdCwgdXNlIG9wJ3MgX19jb21wbGV4X18gIG1ldGhvZCwgaWYgaXQgZXhpc3RzICovCisgICAgYXNzZXJ0KG9wKTsKKyAgICAvKiBJZiBvcCBpcyBhbHJlYWR5IG9mIHR5cGUgUHlDb21wbGV4X1R5cGUsIHJldHVybiBpdHMgdmFsdWUgKi8KKyAgICBpZiAoUHlDb21wbGV4X0NoZWNrKG9wKSkgeworICAgICAgICByZXR1cm4gKChQeUNvbXBsZXhPYmplY3QgKilvcCktPmN2YWw7CisgICAgfQorICAgIC8qIElmIG5vdCwgdXNlIG9wJ3MgX19jb21wbGV4X18gIG1ldGhvZCwgaWYgaXQgZXhpc3RzICovCiAKLQkvKiByZXR1cm4gLTEgb24gZmFpbHVyZSAqLwotCWN2LnJlYWwgPSAtMS47Ci0JY3YuaW1hZyA9IDAuOworICAgIC8qIHJldHVybiAtMSBvbiBmYWlsdXJlICovCisgICAgY3YucmVhbCA9IC0xLjsKKyAgICBjdi5pbWFnID0gMC47CiAKLQlpZiAoY29tcGxleF9zdHIgPT0gTlVMTCkgewotCQlpZiAoIShjb21wbGV4X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29tcGxleF9fIikpKQotCQkJcmV0dXJuIGN2OwotCX0KLQkKLQlpZiAoUHlJbnN0YW5jZV9DaGVjayhvcCkpIHsKLQkJLyogdGhpcyBjYW4gZ28gYXdheSBpbiBweXRob24gMzAwMCAqLwotCQlpZiAoUHlPYmplY3RfSGFzQXR0cihvcCwgY29tcGxleF9zdHIpKSB7Ci0JCQluZXdvcCA9IFB5T2JqZWN0X0NhbGxNZXRob2Qob3AsICJfX2NvbXBsZXhfXyIsIE5VTEwpOwotCQkJaWYgKCFuZXdvcCkKLQkJCQlyZXR1cm4gY3Y7Ci0JCX0KLQkJLyogZWxzZSB0cnkgX19mbG9hdF9fICovCi0JfSBlbHNlIHsKLQkJUHlPYmplY3QgKmNvbXBsZXhmdW5jOwotCQljb21wbGV4ZnVuYyA9IF9QeVR5cGVfTG9va3VwKG9wLT5vYl90eXBlLCBjb21wbGV4X3N0cik7Ci0JCS8qIGNvbXBsZXhmdW5jIGlzIGEgYm9ycm93ZWQgcmVmZXJlbmNlICovCi0JCWlmIChjb21wbGV4ZnVuYykgewotCQkJbmV3b3AgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGNvbXBsZXhmdW5jLCBvcCwgTlVMTCk7Ci0JCQlpZiAoIW5ld29wKQotCQkJCXJldHVybiBjdjsKLQkJfQotCX0KKyAgICBpZiAoY29tcGxleF9zdHIgPT0gTlVMTCkgeworICAgICAgICBpZiAoIShjb21wbGV4X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29tcGxleF9fIikpKQorICAgICAgICAgICAgcmV0dXJuIGN2OworICAgIH0KIAotCWlmIChuZXdvcCkgewotCQlpZiAoIVB5Q29tcGxleF9DaGVjayhuZXdvcCkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl9fY29tcGxleF9fIHNob3VsZCByZXR1cm4gYSBjb21wbGV4IG9iamVjdCIpOwotCQkJUHlfREVDUkVGKG5ld29wKTsKLQkJCXJldHVybiBjdjsKLQkJfQotCQljdiA9ICgoUHlDb21wbGV4T2JqZWN0ICopbmV3b3ApLT5jdmFsOwotCQlQeV9ERUNSRUYobmV3b3ApOwotCQlyZXR1cm4gY3Y7Ci0JfQotCS8qIElmIG5laXRoZXIgb2YgdGhlIGFib3ZlIHdvcmtzLCBpbnRlcnByZXQgb3AgYXMgYSBmbG9hdCBnaXZpbmcgdGhlCi0JICAgcmVhbCBwYXJ0IG9mIHRoZSByZXN1bHQsIGFuZCBmaWxsIGluIHRoZSBpbWFnaW5hcnkgcGFydCBhcyAwLiAqLwotCWVsc2UgewotCQkvKiBQeUZsb2F0X0FzRG91YmxlIHdpbGwgcmV0dXJuIC0xIG9uIGZhaWx1cmUgKi8KLQkJY3YucmVhbCA9IFB5RmxvYXRfQXNEb3VibGUob3ApOwotCQlyZXR1cm4gY3Y7Ci0JfQorICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKG9wKSkgeworICAgICAgICAvKiB0aGlzIGNhbiBnbyBhd2F5IGluIHB5dGhvbiAzMDAwICovCisgICAgICAgIGlmIChQeU9iamVjdF9IYXNBdHRyKG9wLCBjb21wbGV4X3N0cikpIHsKKyAgICAgICAgICAgIG5ld29wID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvcCwgIl9fY29tcGxleF9fIiwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIW5ld29wKQorICAgICAgICAgICAgICAgIHJldHVybiBjdjsKKyAgICAgICAgfQorICAgICAgICAvKiBlbHNlIHRyeSBfX2Zsb2F0X18gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBQeU9iamVjdCAqY29tcGxleGZ1bmM7CisgICAgICAgIGNvbXBsZXhmdW5jID0gX1B5VHlwZV9Mb29rdXAob3AtPm9iX3R5cGUsIGNvbXBsZXhfc3RyKTsKKyAgICAgICAgLyogY29tcGxleGZ1bmMgaXMgYSBib3Jyb3dlZCByZWZlcmVuY2UgKi8KKyAgICAgICAgaWYgKGNvbXBsZXhmdW5jKSB7CisgICAgICAgICAgICBuZXdvcCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY29tcGxleGZ1bmMsIG9wLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghbmV3b3ApCisgICAgICAgICAgICAgICAgcmV0dXJuIGN2OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5ld29wKSB7CisgICAgICAgIGlmICghUHlDb21wbGV4X0NoZWNrKG5ld29wKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiX19jb21wbGV4X18gc2hvdWxkIHJldHVybiBhIGNvbXBsZXggb2JqZWN0Iik7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3b3ApOworICAgICAgICAgICAgcmV0dXJuIGN2OworICAgICAgICB9CisgICAgICAgIGN2ID0gKChQeUNvbXBsZXhPYmplY3QgKiluZXdvcCktPmN2YWw7CisgICAgICAgIFB5X0RFQ1JFRihuZXdvcCk7CisgICAgICAgIHJldHVybiBjdjsKKyAgICB9CisgICAgLyogSWYgbmVpdGhlciBvZiB0aGUgYWJvdmUgd29ya3MsIGludGVycHJldCBvcCBhcyBhIGZsb2F0IGdpdmluZyB0aGUKKyAgICAgICByZWFsIHBhcnQgb2YgdGhlIHJlc3VsdCwgYW5kIGZpbGwgaW4gdGhlIGltYWdpbmFyeSBwYXJ0IGFzIDAuICovCisgICAgZWxzZSB7CisgICAgICAgIC8qIFB5RmxvYXRfQXNEb3VibGUgd2lsbCByZXR1cm4gLTEgb24gZmFpbHVyZSAqLworICAgICAgICBjdi5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZShvcCk7CisgICAgICAgIHJldHVybiBjdjsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiBjb21wbGV4X2RlYWxsb2MoUHlPYmplY3QgKm9wKQogewotCW9wLT5vYl90eXBlLT50cF9mcmVlKG9wKTsKKyAgICBvcC0+b2JfdHlwZS0+dHBfZnJlZShvcCk7CiB9CiAKIAogc3RhdGljIHZvaWQKIGNvbXBsZXhfdG9fYnVmKGNoYXIgKmJ1ZiwgaW50IGJ1ZnN6LCBQeUNvbXBsZXhPYmplY3QgKnYsIGludCBwcmVjaXNpb24pCiB7Ci0JY2hhciBmb3JtYXRbMzJdOwotCWlmICh2LT5jdmFsLnJlYWwgPT0gMC4pIHsKLQkJaWYgKCFQeV9JU19GSU5JVEUodi0+Y3ZhbC5pbWFnKSkgewotCQkJaWYgKFB5X0lTX05BTih2LT5jdmFsLmltYWcpKQotCQkJCXN0cm5jcHkoYnVmLCAibmFuKmoiLCA2KTsKLQkJCWVsc2UgaWYgKGNvcHlzaWduKDEsIHYtPmN2YWwuaW1hZykgPT0gMSkKLQkJCQlzdHJuY3B5KGJ1ZiwgImluZipqIiwgNik7Ci0JCQllbHNlCi0JCQkJc3RybmNweShidWYsICItaW5mKmoiLCA3KTsKLQkJfQotCQllbHNlIHsKLQkJCVB5T1Nfc25wcmludGYoZm9ybWF0LCBzaXplb2YoZm9ybWF0KSwgIiUlLiVpZyIsIHByZWNpc2lvbik7Ci0JCQlQeU9TX2FzY2lpX2Zvcm1hdGQoYnVmLCBidWZzeiAtIDEsIGZvcm1hdCwgdi0+Y3ZhbC5pbWFnKTsKLQkJCXN0cm5jYXQoYnVmLCAiaiIsIDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJY2hhciByZVs2NF0sIGltWzY0XTsKLQkJLyogRm9ybWF0IGltYWdpbmFyeSBwYXJ0IHdpdGggc2lnbiwgcmVhbCBwYXJ0IHdpdGhvdXQgKi8KLQkJaWYgKCFQeV9JU19GSU5JVEUodi0+Y3ZhbC5yZWFsKSkgewotCQkJaWYgKFB5X0lTX05BTih2LT5jdmFsLnJlYWwpKQotCQkJCXN0cm5jcHkocmUsICJuYW4iLCA0KTsKLQkJCS8qIGVsc2UgaWYgKGNvcHlzaWduKDEsIHYtPmN2YWwucmVhbCkgPT0gMSkgKi8KLQkJCWVsc2UgaWYgKHYtPmN2YWwucmVhbCA+IDApCi0JCQkJc3RybmNweShyZSwgImluZiIsIDQpOwotCQkJZWxzZQotCQkJCXN0cm5jcHkocmUsICItaW5mIiwgNSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeU9TX3NucHJpbnRmKGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCksICIlJS4laWciLCBwcmVjaXNpb24pOwotCQkJUHlPU19hc2NpaV9mb3JtYXRkKHJlLCBzaXplb2YocmUpLCBmb3JtYXQsIHYtPmN2YWwucmVhbCk7Ci0JCX0KLQkJaWYgKCFQeV9JU19GSU5JVEUodi0+Y3ZhbC5pbWFnKSkgewotCQkJaWYgKFB5X0lTX05BTih2LT5jdmFsLmltYWcpKQotCQkJCXN0cm5jcHkoaW0sICIrbmFuKiIsIDYpOwotCQkJLyogZWxzZSBpZiAoY29weXNpZ24oMSwgdi0+Y3ZhbC5pbWFnKSA9PSAxKSAqLwotCQkJZWxzZSBpZiAodi0+Y3ZhbC5pbWFnID4gMCkKLQkJCQlzdHJuY3B5KGltLCAiK2luZioiLCA2KTsKLQkJCWVsc2UKLQkJCQlzdHJuY3B5KGltLCAiLWluZioiLCA2KTsKLQkJfQotCQllbHNlIHsKLQkJCVB5T1Nfc25wcmludGYoZm9ybWF0LCBzaXplb2YoZm9ybWF0KSwgIiUlKy4laWciLCBwcmVjaXNpb24pOwotCQkJUHlPU19hc2NpaV9mb3JtYXRkKGltLCBzaXplb2YoaW0pLCBmb3JtYXQsIHYtPmN2YWwuaW1hZyk7Ci0JCX0KLQkJUHlPU19zbnByaW50ZihidWYsIGJ1ZnN6LCAiKCVzJXNqKSIsIHJlLCBpbSk7Ci0JfQorICAgIGNoYXIgZm9ybWF0WzMyXTsKKyAgICBpZiAodi0+Y3ZhbC5yZWFsID09IDAuKSB7CisgICAgICAgIGlmICghUHlfSVNfRklOSVRFKHYtPmN2YWwuaW1hZykpIHsKKyAgICAgICAgICAgIGlmIChQeV9JU19OQU4odi0+Y3ZhbC5pbWFnKSkKKyAgICAgICAgICAgICAgICBzdHJuY3B5KGJ1ZiwgIm5hbipqIiwgNik7CisgICAgICAgICAgICBlbHNlIGlmIChjb3B5c2lnbigxLCB2LT5jdmFsLmltYWcpID09IDEpCisgICAgICAgICAgICAgICAgc3RybmNweShidWYsICJpbmYqaiIsIDYpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0cm5jcHkoYnVmLCAiLWluZipqIiwgNyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCksICIlJS4laWciLCBwcmVjaXNpb24pOworICAgICAgICAgICAgUHlPU19hc2NpaV9mb3JtYXRkKGJ1ZiwgYnVmc3ogLSAxLCBmb3JtYXQsIHYtPmN2YWwuaW1hZyk7CisgICAgICAgICAgICBzdHJuY2F0KGJ1ZiwgImoiLCAxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgcmVbNjRdLCBpbVs2NF07CisgICAgICAgIC8qIEZvcm1hdCBpbWFnaW5hcnkgcGFydCB3aXRoIHNpZ24sIHJlYWwgcGFydCB3aXRob3V0ICovCisgICAgICAgIGlmICghUHlfSVNfRklOSVRFKHYtPmN2YWwucmVhbCkpIHsKKyAgICAgICAgICAgIGlmIChQeV9JU19OQU4odi0+Y3ZhbC5yZWFsKSkKKyAgICAgICAgICAgICAgICBzdHJuY3B5KHJlLCAibmFuIiwgNCk7CisgICAgICAgICAgICAvKiBlbHNlIGlmIChjb3B5c2lnbigxLCB2LT5jdmFsLnJlYWwpID09IDEpICovCisgICAgICAgICAgICBlbHNlIGlmICh2LT5jdmFsLnJlYWwgPiAwKQorICAgICAgICAgICAgICAgIHN0cm5jcHkocmUsICJpbmYiLCA0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdHJuY3B5KHJlLCAiLWluZiIsIDUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPU19zbnByaW50Zihmb3JtYXQsIHNpemVvZihmb3JtYXQpLCAiJSUuJWlnIiwgcHJlY2lzaW9uKTsKKyAgICAgICAgICAgIFB5T1NfYXNjaWlfZm9ybWF0ZChyZSwgc2l6ZW9mKHJlKSwgZm9ybWF0LCB2LT5jdmFsLnJlYWwpOworICAgICAgICB9CisgICAgICAgIGlmICghUHlfSVNfRklOSVRFKHYtPmN2YWwuaW1hZykpIHsKKyAgICAgICAgICAgIGlmIChQeV9JU19OQU4odi0+Y3ZhbC5pbWFnKSkKKyAgICAgICAgICAgICAgICBzdHJuY3B5KGltLCAiK25hbioiLCA2KTsKKyAgICAgICAgICAgIC8qIGVsc2UgaWYgKGNvcHlzaWduKDEsIHYtPmN2YWwuaW1hZykgPT0gMSkgKi8KKyAgICAgICAgICAgIGVsc2UgaWYgKHYtPmN2YWwuaW1hZyA+IDApCisgICAgICAgICAgICAgICAgc3RybmNweShpbSwgIitpbmYqIiwgNik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RybmNweShpbSwgIi1pbmYqIiwgNik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCksICIlJSsuJWlnIiwgcHJlY2lzaW9uKTsKKyAgICAgICAgICAgIFB5T1NfYXNjaWlfZm9ybWF0ZChpbSwgc2l6ZW9mKGltKSwgZm9ybWF0LCB2LT5jdmFsLmltYWcpOworICAgICAgICB9CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBidWZzeiwgIiglcyVzaikiLCByZSwgaW0pOworICAgIH0KIH0KIAogc3RhdGljIGludAogY29tcGxleF9wcmludChQeUNvbXBsZXhPYmplY3QgKnYsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQljb21wbGV4X3RvX2J1ZihidWYsIHNpemVvZihidWYpLCB2LAotCQkgICAgICAgKGZsYWdzICYgUHlfUFJJTlRfUkFXKSA/IFBSRUNfU1RSIDogUFJFQ19SRVBSKTsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnB1dHMoYnVmLCBmcCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlyZXR1cm4gMDsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIGNvbXBsZXhfdG9fYnVmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHYsCisgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgUHlfUFJJTlRfUkFXKSA/IFBSRUNfU1RSIDogUFJFQ19SRVBSKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnB1dHMoYnVmLCBmcCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfcmVwcihQeUNvbXBsZXhPYmplY3QgKnYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQljb21wbGV4X3RvX2J1ZihidWYsIHNpemVvZihidWYpLCB2LCBQUkVDX1JFUFIpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBjb21wbGV4X3RvX2J1ZihidWYsIHNpemVvZihidWYpLCB2LCBQUkVDX1JFUFIpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X3N0cihQeUNvbXBsZXhPYmplY3QgKnYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQljb21wbGV4X3RvX2J1ZihidWYsIHNpemVvZihidWYpLCB2LCBQUkVDX1NUUik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIGNvbXBsZXhfdG9fYnVmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHYsIFBSRUNfU1RSKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgbG9uZwogY29tcGxleF9oYXNoKFB5Q29tcGxleE9iamVjdCAqdikKIHsKLQlsb25nIGhhc2hyZWFsLCBoYXNoaW1hZywgY29tYmluZWQ7Ci0JaGFzaHJlYWwgPSBfUHlfSGFzaERvdWJsZSh2LT5jdmFsLnJlYWwpOwotCWlmIChoYXNocmVhbCA9PSAtMSkKLQkJcmV0dXJuIC0xOwotCWhhc2hpbWFnID0gX1B5X0hhc2hEb3VibGUodi0+Y3ZhbC5pbWFnKTsKLQlpZiAoaGFzaGltYWcgPT0gLTEpCi0JCXJldHVybiAtMTsKLQkvKiBOb3RlOiAgaWYgdGhlIGltYWdpbmFyeSBwYXJ0IGlzIDAsIGhhc2hpbWFnIGlzIDAgbm93LAotCSAqIHNvIHRoZSBmb2xsb3dpbmcgcmV0dXJucyBoYXNocmVhbCB1bmNoYW5nZWQuICBUaGlzIGlzCi0JICogaW1wb3J0YW50IGJlY2F1c2UgbnVtYmVycyBvZiBkaWZmZXJlbnQgdHlwZXMgdGhhdAotCSAqIGNvbXBhcmUgZXF1YWwgbXVzdCBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWUsIHNvIHRoYXQKLQkgKiBoYXNoKHggKyAwKmopIG11c3QgZXF1YWwgaGFzaCh4KS4KLQkgKi8KLQljb21iaW5lZCA9IGhhc2hyZWFsICsgMTAwMDAwMyAqIGhhc2hpbWFnOwotCWlmIChjb21iaW5lZCA9PSAtMSkKLQkJY29tYmluZWQgPSAtMjsKLQlyZXR1cm4gY29tYmluZWQ7CisgICAgbG9uZyBoYXNocmVhbCwgaGFzaGltYWcsIGNvbWJpbmVkOworICAgIGhhc2hyZWFsID0gX1B5X0hhc2hEb3VibGUodi0+Y3ZhbC5yZWFsKTsKKyAgICBpZiAoaGFzaHJlYWwgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBoYXNoaW1hZyA9IF9QeV9IYXNoRG91YmxlKHYtPmN2YWwuaW1hZyk7CisgICAgaWYgKGhhc2hpbWFnID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogTm90ZTogIGlmIHRoZSBpbWFnaW5hcnkgcGFydCBpcyAwLCBoYXNoaW1hZyBpcyAwIG5vdywKKyAgICAgKiBzbyB0aGUgZm9sbG93aW5nIHJldHVybnMgaGFzaHJlYWwgdW5jaGFuZ2VkLiAgVGhpcyBpcworICAgICAqIGltcG9ydGFudCBiZWNhdXNlIG51bWJlcnMgb2YgZGlmZmVyZW50IHR5cGVzIHRoYXQKKyAgICAgKiBjb21wYXJlIGVxdWFsIG11c3QgaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlLCBzbyB0aGF0CisgICAgICogaGFzaCh4ICsgMCpqKSBtdXN0IGVxdWFsIGhhc2goeCkuCisgICAgICovCisgICAgY29tYmluZWQgPSBoYXNocmVhbCArIDEwMDAwMDMgKiBoYXNoaW1hZzsKKyAgICBpZiAoY29tYmluZWQgPT0gLTEpCisgICAgICAgIGNvbWJpbmVkID0gLTI7CisgICAgcmV0dXJuIGNvbWJpbmVkOwogfQogCiAvKiBUaGlzIG1hY3JvIG1heSByZXR1cm4hICovCiAjZGVmaW5lIFRPX0NPTVBMRVgob2JqLCBjKSBcCi0JaWYgKFB5Q29tcGxleF9DaGVjayhvYmopKSBcCi0JCWMgPSAoKFB5Q29tcGxleE9iamVjdCAqKShvYmopKS0+Y3ZhbDsgXAotCWVsc2UgaWYgKHRvX2NvbXBsZXgoJihvYmopLCAmKGMpKSA8IDApIFwKLQkJcmV0dXJuIChvYmopCisgICAgaWYgKFB5Q29tcGxleF9DaGVjayhvYmopKSBcCisgICAgICAgIGMgPSAoKFB5Q29tcGxleE9iamVjdCAqKShvYmopKS0+Y3ZhbDsgXAorICAgIGVsc2UgaWYgKHRvX2NvbXBsZXgoJihvYmopLCAmKGMpKSA8IDApIFwKKyAgICAgICAgcmV0dXJuIChvYmopCiAKIHN0YXRpYyBpbnQKIHRvX2NvbXBsZXgoUHlPYmplY3QgKipwb2JqLCBQeV9jb21wbGV4ICpwYykKQEAgLTQ2OCwzNTAgKzQ2OCwzNTAgQEAKIAogICAgIHBjLT5yZWFsID0gcGMtPmltYWcgPSAwLjA7CiAgICAgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKLSAgICAgICAgcGMtPnJlYWwgPSBQeUludF9BU19MT05HKG9iaik7Ci0gICAgICAgIHJldHVybiAwOworICAgIHBjLT5yZWFsID0gUHlJbnRfQVNfTE9ORyhvYmopOworICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKLSAgICAgICAgcGMtPnJlYWwgPSBQeUxvbmdfQXNEb3VibGUob2JqKTsKLSAgICAgICAgaWYgKHBjLT5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgKnBvYmogPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgIHBjLT5yZWFsID0gUHlMb25nX0FzRG91YmxlKG9iaik7CisgICAgaWYgKHBjLT5yZWFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAqcG9iaiA9IE5VTEw7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKLSAgICAgICAgcGMtPnJlYWwgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7Ci0gICAgICAgIHJldHVybiAwOworICAgIHBjLT5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOworICAgIHJldHVybiAwOwogICAgIH0KICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwogICAgICpwb2JqID0gUHlfTm90SW1wbGVtZW50ZWQ7CiAgICAgcmV0dXJuIC0xOwogfQotCQkKKwogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9hZGQoUHlDb21wbGV4T2JqZWN0ICp2LCBQeUNvbXBsZXhPYmplY3QgKncpCiB7Ci0JUHlfY29tcGxleCByZXN1bHQ7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9hZGQiLCByZXR1cm4gMCkKLQlyZXN1bHQgPSBjX3N1bSh2LT5jdmFsLHctPmN2YWwpOwotCVB5RlBFX0VORF9QUk9URUNUKHJlc3VsdCkKLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChyZXN1bHQpOworICAgIFB5X2NvbXBsZXggcmVzdWx0OworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfYWRkIiwgcmV0dXJuIDApCisgICAgcmVzdWx0ID0gY19zdW0odi0+Y3ZhbCx3LT5jdmFsKTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChyZXN1bHQpCisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocmVzdWx0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfc3ViKFB5Q29tcGxleE9iamVjdCAqdiwgUHlDb21wbGV4T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggcmVzdWx0OwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfc3ViIiwgcmV0dXJuIDApCi0JcmVzdWx0ID0gY19kaWZmKHYtPmN2YWwsdy0+Y3ZhbCk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QocmVzdWx0KQotCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHJlc3VsdCk7CisgICAgUHlfY29tcGxleCByZXN1bHQ7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9zdWIiLCByZXR1cm4gMCkKKyAgICByZXN1bHQgPSBjX2RpZmYodi0+Y3ZhbCx3LT5jdmFsKTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChyZXN1bHQpCisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocmVzdWx0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfbXVsKFB5Q29tcGxleE9iamVjdCAqdiwgUHlDb21wbGV4T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggcmVzdWx0OwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfbXVsIiwgcmV0dXJuIDApCi0JcmVzdWx0ID0gY19wcm9kKHYtPmN2YWwsdy0+Y3ZhbCk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QocmVzdWx0KQotCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHJlc3VsdCk7CisgICAgUHlfY29tcGxleCByZXN1bHQ7CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9tdWwiLCByZXR1cm4gMCkKKyAgICByZXN1bHQgPSBjX3Byb2Qodi0+Y3ZhbCx3LT5jdmFsKTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChyZXN1bHQpCisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocmVzdWx0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfZGl2KFB5Q29tcGxleE9iamVjdCAqdiwgUHlDb21wbGV4T2JqZWN0ICp3KQogewotCVB5X2NvbXBsZXggcXVvdDsKKyAgICBQeV9jb21wbGV4IHF1b3Q7CiAKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2RpdiIsIHJldHVybiAwKQotCWVycm5vID0gMDsKLQlxdW90ID0gY19xdW90KHYtPmN2YWwsdy0+Y3ZhbCk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QocXVvdCkKLQlpZiAoZXJybm8gPT0gRURPTSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IGRpdmlzaW9uIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChxdW90KTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2RpdiIsIHJldHVybiAwKQorICAgIGVycm5vID0gMDsKKyAgICBxdW90ID0gY19xdW90KHYtPmN2YWwsdy0+Y3ZhbCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QocXVvdCkKKyAgICBpZiAoZXJybm8gPT0gRURPTSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IGRpdmlzaW9uIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChxdW90KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfY2xhc3NpY19kaXYoUHlDb21wbGV4T2JqZWN0ICp2LCBQeUNvbXBsZXhPYmplY3QgKncpCiB7Ci0JUHlfY29tcGxleCBxdW90OworICAgIFB5X2NvbXBsZXggcXVvdDsKIAotCWlmIChQeV9EaXZpc2lvbldhcm5pbmdGbGFnID49IDIgJiYKLQkgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCSAgICAgICAiY2xhc3NpYyBjb21wbGV4IGRpdmlzaW9uIikgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA+PSAyICYmCisgICAgICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICJjbGFzc2ljIGNvbXBsZXggZGl2aXNpb24iKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9jbGFzc2ljX2RpdiIsIHJldHVybiAwKQotCWVycm5vID0gMDsKLQlxdW90ID0gY19xdW90KHYtPmN2YWwsdy0+Y3ZhbCk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QocXVvdCkKLQlpZiAoZXJybm8gPT0gRURPTSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IGRpdmlzaW9uIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChxdW90KTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X2NsYXNzaWNfZGl2IiwgcmV0dXJuIDApCisgICAgZXJybm8gPSAwOworICAgIHF1b3QgPSBjX3F1b3Qodi0+Y3ZhbCx3LT5jdmFsKTsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChxdW90KQorICAgIGlmIChlcnJubyA9PSBFRE9NKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwgImNvbXBsZXggZGl2aXNpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHF1b3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9yZW1haW5kZXIoUHlDb21wbGV4T2JqZWN0ICp2LCBQeUNvbXBsZXhPYmplY3QgKncpCiB7Ci0JUHlfY29tcGxleCBkaXYsIG1vZDsKKyAgICBQeV9jb21wbGV4IGRpdiwgbW9kOwogCi0JaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkgICAgICAgImNvbXBsZXggZGl2bW9kKCksIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkIikgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgImNvbXBsZXggZGl2bW9kKCksIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkIikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVycm5vID0gMDsKLQlkaXYgPSBjX3F1b3Qodi0+Y3ZhbCx3LT5jdmFsKTsgLyogVGhlIHJhdyBkaXZpc29yIHZhbHVlLiAqLwotCWlmIChlcnJubyA9PSBFRE9NKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwgImNvbXBsZXggcmVtYWluZGVyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkaXYucmVhbCA9IGZsb29yKGRpdi5yZWFsKTsgLyogVXNlIHRoZSBmbG9vciBvZiB0aGUgcmVhbCBwYXJ0LiAqLwotCWRpdi5pbWFnID0gMC4wOwotCW1vZCA9IGNfZGlmZih2LT5jdmFsLCBjX3Byb2Qody0+Y3ZhbCwgZGl2KSk7CisgICAgZXJybm8gPSAwOworICAgIGRpdiA9IGNfcXVvdCh2LT5jdmFsLHctPmN2YWwpOyAvKiBUaGUgcmF3IGRpdmlzb3IgdmFsdWUuICovCisgICAgaWYgKGVycm5vID09IEVET00pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiY29tcGxleCByZW1haW5kZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRpdi5yZWFsID0gZmxvb3IoZGl2LnJlYWwpOyAvKiBVc2UgdGhlIGZsb29yIG9mIHRoZSByZWFsIHBhcnQuICovCisgICAgZGl2LmltYWcgPSAwLjA7CisgICAgbW9kID0gY19kaWZmKHYtPmN2YWwsIGNfcHJvZCh3LT5jdmFsLCBkaXYpKTsKIAotCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KG1vZCk7CisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgobW9kKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9kaXZtb2QoUHlDb21wbGV4T2JqZWN0ICp2LCBQeUNvbXBsZXhPYmplY3QgKncpCiB7Ci0JUHlfY29tcGxleCBkaXYsIG1vZDsKLQlQeU9iamVjdCAqZCwgKm0sICp6OworICAgIFB5X2NvbXBsZXggZGl2LCBtb2Q7CisgICAgUHlPYmplY3QgKmQsICptLCAqejsKIAotCWlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJICAgICAgICJjb21wbGV4IGRpdm1vZCgpLCAvLyBhbmQgJSBhcmUgZGVwcmVjYXRlZCIpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICJjb21wbGV4IGRpdm1vZCgpLCAvLyBhbmQgJSBhcmUgZGVwcmVjYXRlZCIpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnJubyA9IDA7Ci0JZGl2ID0gY19xdW90KHYtPmN2YWwsdy0+Y3ZhbCk7IC8qIFRoZSByYXcgZGl2aXNvciB2YWx1ZS4gKi8KLQlpZiAoZXJybm8gPT0gRURPTSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJjb21wbGV4IGRpdm1vZCgpIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkaXYucmVhbCA9IGZsb29yKGRpdi5yZWFsKTsgLyogVXNlIHRoZSBmbG9vciBvZiB0aGUgcmVhbCBwYXJ0LiAqLwotCWRpdi5pbWFnID0gMC4wOwotCW1vZCA9IGNfZGlmZih2LT5jdmFsLCBjX3Byb2Qody0+Y3ZhbCwgZGl2KSk7Ci0JZCA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoZGl2KTsKLQltID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChtb2QpOwotCXogPSBQeVR1cGxlX1BhY2soMiwgZCwgbSk7Ci0JUHlfWERFQ1JFRihkKTsKLQlQeV9YREVDUkVGKG0pOwotCXJldHVybiB6OworICAgIGVycm5vID0gMDsKKyAgICBkaXYgPSBjX3F1b3Qodi0+Y3ZhbCx3LT5jdmFsKTsgLyogVGhlIHJhdyBkaXZpc29yIHZhbHVlLiAqLworICAgIGlmIChlcnJubyA9PSBFRE9NKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwgImNvbXBsZXggZGl2bW9kKCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRpdi5yZWFsID0gZmxvb3IoZGl2LnJlYWwpOyAvKiBVc2UgdGhlIGZsb29yIG9mIHRoZSByZWFsIHBhcnQuICovCisgICAgZGl2LmltYWcgPSAwLjA7CisgICAgbW9kID0gY19kaWZmKHYtPmN2YWwsIGNfcHJvZCh3LT5jdmFsLCBkaXYpKTsKKyAgICBkID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChkaXYpOworICAgIG0gPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KG1vZCk7CisgICAgeiA9IFB5VHVwbGVfUGFjaygyLCBkLCBtKTsKKyAgICBQeV9YREVDUkVGKGQpOworICAgIFB5X1hERUNSRUYobSk7CisgICAgcmV0dXJuIHo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X3BvdyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp6KQogewotCVB5X2NvbXBsZXggcDsKLQlQeV9jb21wbGV4IGV4cG9uZW50OwotCWxvbmcgaW50X2V4cG9uZW50OwotCVB5X2NvbXBsZXggYSwgYjsKLQlUT19DT01QTEVYKHYsIGEpOwotCVRPX0NPTVBMRVgodywgYik7CisgICAgUHlfY29tcGxleCBwOworICAgIFB5X2NvbXBsZXggZXhwb25lbnQ7CisgICAgbG9uZyBpbnRfZXhwb25lbnQ7CisgICAgUHlfY29tcGxleCBhLCBiOworICAgIFRPX0NPTVBMRVgodiwgYSk7CisgICAgVE9fQ09NUExFWCh3LCBiKTsKIAotIAlpZiAoeiE9UHlfTm9uZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImNvbXBsZXggbW9kdWxvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4X3BvdyIsIHJldHVybiAwKQotCWVycm5vID0gMDsKLQlleHBvbmVudCA9IGI7Ci0JaW50X2V4cG9uZW50ID0gKGxvbmcpZXhwb25lbnQucmVhbDsKLQlpZiAoZXhwb25lbnQuaW1hZyA9PSAwLiAmJiBleHBvbmVudC5yZWFsID09IGludF9leHBvbmVudCkKLQkJcCA9IGNfcG93aShhLGludF9leHBvbmVudCk7Ci0JZWxzZQotCQlwID0gY19wb3coYSxleHBvbmVudCk7CisgICAgaWYgKHohPVB5X05vbmUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJjb21wbGV4IG1vZHVsbyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleF9wb3ciLCByZXR1cm4gMCkKKyAgICBlcnJubyA9IDA7CisgICAgZXhwb25lbnQgPSBiOworICAgIGludF9leHBvbmVudCA9IChsb25nKWV4cG9uZW50LnJlYWw7CisgICAgaWYgKGV4cG9uZW50LmltYWcgPT0gMC4gJiYgZXhwb25lbnQucmVhbCA9PSBpbnRfZXhwb25lbnQpCisgICAgICAgIHAgPSBjX3Bvd2koYSxpbnRfZXhwb25lbnQpOworICAgIGVsc2UKKyAgICAgICAgcCA9IGNfcG93KGEsZXhwb25lbnQpOwogCi0JUHlGUEVfRU5EX1BST1RFQ1QocCkKLQlQeV9BREpVU1RfRVJBTkdFMihwLnJlYWwsIHAuaW1hZyk7Ci0JaWYgKGVycm5vID09IEVET00pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAotCQkJCSIwLjAgdG8gYSBuZWdhdGl2ZSBvciBjb21wbGV4IHBvd2VyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImNvbXBsZXggZXhwb25lbnRpYXRpb24iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHApOworICAgIFB5RlBFX0VORF9QUk9URUNUKHApCisgICAgUHlfQURKVVNUX0VSQU5HRTIocC5yZWFsLCBwLmltYWcpOworICAgIGlmIChlcnJubyA9PSBFRE9NKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICIwLjAgdG8gYSBuZWdhdGl2ZSBvciBjb21wbGV4IHBvd2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGxleCBleHBvbmVudGlhdGlvbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgocCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X2ludF9kaXYoUHlDb21wbGV4T2JqZWN0ICp2LCBQeUNvbXBsZXhPYmplY3QgKncpCiB7Ci0JUHlPYmplY3QgKnQsICpyOwotCQotCWlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJICAgICAgICJjb21wbGV4IGRpdm1vZCgpLCAvLyBhbmQgJSBhcmUgZGVwcmVjYXRlZCIpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKnQsICpyOwogCi0JdCA9IGNvbXBsZXhfZGl2bW9kKHYsIHcpOwotCWlmICh0ICE9IE5VTEwpIHsKLQkJciA9IFB5VHVwbGVfR0VUX0lURU0odCwgMCk7Ci0JCVB5X0lOQ1JFRihyKTsKLQkJUHlfREVDUkVGKHQpOwotCQlyZXR1cm4gcjsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICJjb21wbGV4IGRpdm1vZCgpLCAvLyBhbmQgJSBhcmUgZGVwcmVjYXRlZCIpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB0ID0gY29tcGxleF9kaXZtb2Qodiwgdyk7CisgICAgaWYgKHQgIT0gTlVMTCkgeworICAgICAgICByID0gUHlUdXBsZV9HRVRfSVRFTSh0LCAwKTsKKyAgICAgICAgUHlfSU5DUkVGKHIpOworICAgICAgICBQeV9ERUNSRUYodCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfbmVnKFB5Q29tcGxleE9iamVjdCAqdikKIHsKLQlQeV9jb21wbGV4IG5lZzsKLQluZWcucmVhbCA9IC12LT5jdmFsLnJlYWw7Ci0JbmVnLmltYWcgPSAtdi0+Y3ZhbC5pbWFnOwotCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KG5lZyk7CisgICAgUHlfY29tcGxleCBuZWc7CisgICAgbmVnLnJlYWwgPSAtdi0+Y3ZhbC5yZWFsOworICAgIG5lZy5pbWFnID0gLXYtPmN2YWwuaW1hZzsKKyAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChuZWcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9wb3MoUHlDb21wbGV4T2JqZWN0ICp2KQogewotCWlmIChQeUNvbXBsZXhfQ2hlY2tFeGFjdCh2KSkgewotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiAoUHlPYmplY3QgKil2OwotCX0KLQllbHNlCi0JCXJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHYtPmN2YWwpOworICAgIGlmIChQeUNvbXBsZXhfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKil2OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KHYtPmN2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9hYnMoUHlDb21wbGV4T2JqZWN0ICp2KQogewotCWRvdWJsZSByZXN1bHQ7CisgICAgZG91YmxlIHJlc3VsdDsKIAotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfYWJzIiwgcmV0dXJuIDApCi0JcmVzdWx0ID0gY19hYnModi0+Y3ZhbCk7Ci0JUHlGUEVfRU5EX1BST1RFQ1QocmVzdWx0KQorICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXhfYWJzIiwgcmV0dXJuIDApCisgICAgcmVzdWx0ID0gY19hYnModi0+Y3ZhbCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QocmVzdWx0KQogCi0JaWYgKGVycm5vID09IEVSQU5HRSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkiYWJzb2x1dGUgdmFsdWUgdG9vIGxhcmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CisgICAgaWYgKGVycm5vID09IEVSQU5HRSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhYnNvbHV0ZSB2YWx1ZSB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocmVzdWx0KTsKIH0KIAogc3RhdGljIGludAogY29tcGxleF9ub256ZXJvKFB5Q29tcGxleE9iamVjdCAqdikKIHsKLQlyZXR1cm4gdi0+Y3ZhbC5yZWFsICE9IDAuMCB8fCB2LT5jdmFsLmltYWcgIT0gMC4wOworICAgIHJldHVybiB2LT5jdmFsLnJlYWwgIT0gMC4wIHx8IHYtPmN2YWwuaW1hZyAhPSAwLjA7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBsZXhfY29lcmNlKFB5T2JqZWN0ICoqcHYsIFB5T2JqZWN0ICoqcHcpCiB7Ci0JUHlfY29tcGxleCBjdmFsOwotCWN2YWwuaW1hZyA9IDAuOwotCWlmIChQeUludF9DaGVjaygqcHcpKSB7Ci0JCWN2YWwucmVhbCA9IChkb3VibGUpUHlJbnRfQXNMb25nKCpwdyk7Ci0JCSpwdyA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoY3ZhbCk7Ci0JCVB5X0lOQ1JFRigqcHYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKCpwdykpIHsKLQkJY3ZhbC5yZWFsID0gUHlMb25nX0FzRG91YmxlKCpwdyk7Ci0JCWlmIChjdmFsLnJlYWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqcHcgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGN2YWwpOwotCQlQeV9JTkNSRUYoKnB2KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKFB5RmxvYXRfQ2hlY2soKnB3KSkgewotCQljdmFsLnJlYWwgPSBQeUZsb2F0X0FzRG91YmxlKCpwdyk7Ci0JCSpwdyA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoY3ZhbCk7Ci0JCVB5X0lOQ1JFRigqcHYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoUHlDb21wbGV4X0NoZWNrKCpwdykpIHsKLQkJUHlfSU5DUkVGKCpwdik7Ci0JCVB5X0lOQ1JFRigqcHcpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7IC8qIENhbid0IGRvIGl0ICovCisgICAgUHlfY29tcGxleCBjdmFsOworICAgIGN2YWwuaW1hZyA9IDAuOworICAgIGlmIChQeUludF9DaGVjaygqcHcpKSB7CisgICAgICAgIGN2YWwucmVhbCA9IChkb3VibGUpUHlJbnRfQXNMb25nKCpwdyk7CisgICAgICAgICpwdyA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoY3ZhbCk7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKCpwdykpIHsKKyAgICAgICAgY3ZhbC5yZWFsID0gUHlMb25nX0FzRG91YmxlKCpwdyk7CisgICAgICAgIGlmIChjdmFsLnJlYWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqcHcgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGN2YWwpOworICAgICAgICBQeV9JTkNSRUYoKnB2KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2soKnB3KSkgeworICAgICAgICBjdmFsLnJlYWwgPSBQeUZsb2F0X0FzRG91YmxlKCpwdyk7CisgICAgICAgICpwdyA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoY3ZhbCk7CisgICAgICAgIFB5X0lOQ1JFRigqcHYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlDb21wbGV4X0NoZWNrKCpwdykpIHsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIFB5X0lOQ1JFRigqcHcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7IC8qIENhbid0IGRvIGl0ICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X3JpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCWludCBjOwotCVB5X2NvbXBsZXggaSwgajsKLQlQeU9iamVjdCAqcmVzOworICAgIGludCBjOworICAgIFB5X2NvbXBsZXggaSwgajsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JYyA9IFB5TnVtYmVyX0NvZXJjZUV4KCZ2LCAmdyk7Ci0JaWYgKGMgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYyA+IDApIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQkvKiBNYWtlIHN1cmUgYm90aCBhcmd1bWVudHMgYXJlIGNvbXBsZXguICovCi0JaWYgKCEoUHlDb21wbGV4X0NoZWNrKHYpICYmIFB5Q29tcGxleF9DaGVjayh3KSkpIHsKLQkJUHlfREVDUkVGKHYpOwotCQlQeV9ERUNSRUYodyk7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9CisgICAgYyA9IFB5TnVtYmVyX0NvZXJjZUV4KCZ2LCAmdyk7CisgICAgaWYgKGMgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYyA+IDApIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICAvKiBNYWtlIHN1cmUgYm90aCBhcmd1bWVudHMgYXJlIGNvbXBsZXguICovCisgICAgaWYgKCEoUHlDb21wbGV4X0NoZWNrKHYpICYmIFB5Q29tcGxleF9DaGVjayh3KSkpIHsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CiAKLQlpID0gKChQeUNvbXBsZXhPYmplY3QgKil2KS0+Y3ZhbDsKLQlqID0gKChQeUNvbXBsZXhPYmplY3QgKil3KS0+Y3ZhbDsKLQlQeV9ERUNSRUYodik7Ci0JUHlfREVDUkVGKHcpOworICAgIGkgPSAoKFB5Q29tcGxleE9iamVjdCAqKXYpLT5jdmFsOworICAgIGogPSAoKFB5Q29tcGxleE9iamVjdCAqKXcpLT5jdmFsOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBQeV9ERUNSRUYodyk7CiAKLQlpZiAob3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJubyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIm5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoKGkucmVhbCA9PSBqLnJlYWwgJiYgaS5pbWFnID09IGouaW1hZykgPT0gKG9wID09IFB5X0VRKSkKLQkJcmVzID0gUHlfVHJ1ZTsKLQllbHNlCi0JCXJlcyA9IFB5X0ZhbHNlOworICAgIGlmICgoaS5yZWFsID09IGoucmVhbCAmJiBpLmltYWcgPT0gai5pbWFnKSA9PSAob3AgPT0gUHlfRVEpKQorICAgICAgICByZXMgPSBQeV9UcnVlOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlfRmFsc2U7CiAKLQlQeV9JTkNSRUYocmVzKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X0lOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X2ludChQeU9iamVjdCAqdikKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkgICAiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGludCIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGludCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9sb25nKFB5T2JqZWN0ICp2KQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICJjYW4ndCBjb252ZXJ0IGNvbXBsZXggdG8gbG9uZyIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGxvbmciKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfZmxvYXQoUHlPYmplY3QgKnYpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgImNhbid0IGNvbnZlcnQgY29tcGxleCB0byBmbG9hdCIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAiY2FuJ3QgY29udmVydCBjb21wbGV4IHRvIGZsb2F0Iik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X2Nvbmp1Z2F0ZShQeU9iamVjdCAqc2VsZikKIHsKLQlQeV9jb21wbGV4IGM7Ci0JYyA9ICgoUHlDb21wbGV4T2JqZWN0ICopc2VsZiktPmN2YWw7Ci0JYy5pbWFnID0gLWMuaW1hZzsKLQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjKTsKKyAgICBQeV9jb21wbGV4IGM7CisgICAgYyA9ICgoUHlDb21wbGV4T2JqZWN0ICopc2VsZiktPmN2YWw7CisgICAgYy5pbWFnID0gLWMuaW1hZzsKKyAgICByZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvbXBsZXhfY29uanVnYXRlX2RvYywKQEAgLTgyMiwxOCArODIyLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9nZXRuZXdhcmdzKFB5Q29tcGxleE9iamVjdCAqdikKIHsKLQlQeV9jb21wbGV4IGMgPSB2LT5jdmFsOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGQpIiwgYy5yZWFsLCBjLmltYWcpOworICAgIFB5X2NvbXBsZXggYyA9IHYtPmN2YWw7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkZCkiLCBjLnJlYWwsIGMuaW1hZyk7CiB9CiAKICNpZiAwCiBzdGF0aWMgUHlPYmplY3QgKgogY29tcGxleF9pc19maW5pdGUoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfY29tcGxleCBjOwotCWMgPSAoKFB5Q29tcGxleE9iamVjdCAqKXNlbGYpLT5jdmFsOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpKFB5X0lTX0ZJTklURShjLnJlYWwpICYmCi0JCQkJICAgICAgUHlfSVNfRklOSVRFKGMuaW1hZykpKTsKKyAgICBQeV9jb21wbGV4IGM7CisgICAgYyA9ICgoUHlDb21wbGV4T2JqZWN0ICopc2VsZiktPmN2YWw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykoUHlfSVNfRklOSVRFKGMucmVhbCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9JU19GSU5JVEUoYy5pbWFnKSkpOwogfQogCiBQeURvY19TVFJWQVIoY29tcGxleF9pc19maW5pdGVfZG9jLApAQCAtODQzLDM0MiArODQzLDM0MiBAQAogI2VuZGlmCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjb21wbGV4X21ldGhvZHNbXSA9IHsKLQl7ImNvbmp1Z2F0ZSIsCShQeUNGdW5jdGlvbiljb21wbGV4X2Nvbmp1Z2F0ZSwJTUVUSF9OT0FSR1MsCi0JIGNvbXBsZXhfY29uanVnYXRlX2RvY30sCisgICAgeyJjb25qdWdhdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pY29tcGxleF9jb25qdWdhdGUsIE1FVEhfTk9BUkdTLAorICAgICBjb21wbGV4X2Nvbmp1Z2F0ZV9kb2N9LAogI2lmIDAKLQl7ImlzX2Zpbml0ZSIsCShQeUNGdW5jdGlvbiljb21wbGV4X2lzX2Zpbml0ZSwJTUVUSF9OT0FSR1MsCi0JIGNvbXBsZXhfaXNfZmluaXRlX2RvY30sCisgICAgeyJpc19maW5pdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pY29tcGxleF9pc19maW5pdGUsIE1FVEhfTk9BUkdTLAorICAgICBjb21wbGV4X2lzX2Zpbml0ZV9kb2N9LAogI2VuZGlmCi0JeyJfX2dldG5ld2FyZ3NfXyIsCShQeUNGdW5jdGlvbiljb21wbGV4X2dldG5ld2FyZ3MsCU1FVEhfTk9BUkdTfSwKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19nZXRuZXdhcmdzX18iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pY29tcGxleF9nZXRuZXdhcmdzLCAgICAgICAgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlNZW1iZXJEZWYgY29tcGxleF9tZW1iZXJzW10gPSB7Ci0JeyJyZWFsIiwgVF9ET1VCTEUsIG9mZnNldG9mKFB5Q29tcGxleE9iamVjdCwgY3ZhbC5yZWFsKSwgUkVBRE9OTFksCi0JICJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIifSwKLQl7ImltYWciLCBUX0RPVUJMRSwgb2Zmc2V0b2YoUHlDb21wbGV4T2JqZWN0LCBjdmFsLmltYWcpLCBSRUFET05MWSwKLQkgInRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIn0sCi0JezB9LAorICAgIHsicmVhbCIsIFRfRE9VQkxFLCBvZmZzZXRvZihQeUNvbXBsZXhPYmplY3QsIGN2YWwucmVhbCksIFJFQURPTkxZLAorICAgICAidGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIn0sCisgICAgeyJpbWFnIiwgVF9ET1VCTEUsIG9mZnNldG9mKFB5Q29tcGxleE9iamVjdCwgY3ZhbC5pbWFnKSwgUkVBRE9OTFksCisgICAgICJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciJ9LAorICAgIHswfSwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdikKIHsKLQljb25zdCBjaGFyICpzLCAqc3RhcnQ7Ci0JY2hhciAqZW5kOwotCWRvdWJsZSB4PTAuMCwgeT0wLjAsIHo7Ci0JaW50IGdvdF9yZT0wLCBnb3RfaW09MCwgZ290X2JyYWNrZXQ9MCwgZG9uZT0wOwotCWludCBkaWdpdF9vcl9kb3Q7Ci0JaW50IHN3X2Vycm9yPTA7Ci0JaW50IHNpZ247Ci0JY2hhciBidWZmZXJbMjU2XTsgLyogRm9yIGVycm9ycyAqLworICAgIGNvbnN0IGNoYXIgKnMsICpzdGFydDsKKyAgICBjaGFyICplbmQ7CisgICAgZG91YmxlIHg9MC4wLCB5PTAuMCwgejsKKyAgICBpbnQgZ290X3JlPTAsIGdvdF9pbT0wLCBnb3RfYnJhY2tldD0wLCBkb25lPTA7CisgICAgaW50IGRpZ2l0X29yX2RvdDsKKyAgICBpbnQgc3dfZXJyb3I9MDsKKyAgICBpbnQgc2lnbjsKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOyAvKiBGb3IgZXJyb3JzICovCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWNoYXIgc19idWZmZXJbMjU2XTsKKyAgICBjaGFyIHNfYnVmZmVyWzI1Nl07CiAjZW5kaWYKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIAotCWlmIChQeVN0cmluZ19DaGVjayh2KSkgewotCQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpOwotCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcodik7CisgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JCWlmIChQeVVuaWNvZGVfR0VUX1NJWkUodikgPj0gKFB5X3NzaXplX3Qpc2l6ZW9mKHNfYnVmZmVyKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICJjb21wbGV4KCkgbGl0ZXJhbCB0b28gbGFyZ2UgdG8gY29udmVydCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsKFB5VW5pY29kZV9BU19VTklDT0RFKHYpLAotCQkJCQkgICAgUHlVbmljb2RlX0dFVF9TSVpFKHYpLAotCQkJCQkgICAgc19idWZmZXIsCi0JCQkJCSAgICBOVUxMKSkKLQkJCXJldHVybiBOVUxMOwotCQlzID0gc19idWZmZXI7Ci0JCWxlbiA9IHN0cmxlbihzKTsKLQl9CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIGlmIChQeVVuaWNvZGVfR0VUX1NJWkUodikgPj0gKFB5X3NzaXplX3Qpc2l6ZW9mKHNfYnVmZmVyKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY29tcGxleCgpIGxpdGVyYWwgdG9vIGxhcmdlIHRvIGNvbnZlcnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbChQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRSh2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcyA9IHNfYnVmZmVyOworICAgICAgICBsZW4gPSBzdHJsZW4ocyk7CisgICAgfQogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHYsICZzLCAmbGVuKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjb21wbGV4KCkgYXJnIGlzIG5vdCBhIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHYsICZzLCAmbGVuKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXgoKSBhcmcgaXMgbm90IGEgc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIHBvc2l0aW9uIG9uIGZpcnN0IG5vbmJsYW5rICovCi0Jc3RhcnQgPSBzOwotCXdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCi0JCXMrKzsKLQlpZiAoc1swXSA9PSAnXDAnKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjb21wbGV4KCkgYXJnIGlzIGFuIGVtcHR5IHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHNbMF0gPT0gJygnKSB7Ci0JCS8qIFNraXAgb3ZlciBwb3NzaWJsZSBicmFja2V0IGZyb20gcmVwcigpLiAqLwotCQlnb3RfYnJhY2tldCA9IDE7Ci0JCXMrKzsKLQkJd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKLQkJCXMrKzsKLQl9CisgICAgLyogcG9zaXRpb24gb24gZmlyc3Qgbm9uYmxhbmsgKi8KKyAgICBzdGFydCA9IHM7CisgICAgd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKKyAgICAgICAgcysrOworICAgIGlmIChzWzBdID09ICdcMCcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGxleCgpIGFyZyBpcyBhbiBlbXB0eSBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzWzBdID09ICcoJykgeworICAgICAgICAvKiBTa2lwIG92ZXIgcG9zc2libGUgYnJhY2tldCBmcm9tIHJlcHIoKS4gKi8KKyAgICAgICAgZ290X2JyYWNrZXQgPSAxOworICAgICAgICBzKys7CisgICAgICAgIHdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCisgICAgICAgICAgICBzKys7CisgICAgfQogCi0JeiA9IC0xLjA7Ci0Jc2lnbiA9IDE7Ci0JZG8geworICAgIHogPSAtMS4wOworICAgIHNpZ24gPSAxOworICAgIGRvIHsKIAotCQlzd2l0Y2ggKCpzKSB7CisgICAgICAgIHN3aXRjaCAoKnMpIHsKIAotCQljYXNlICdcMCc6Ci0JCQlpZiAocy1zdGFydCAhPSBsZW4pIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJCVB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJjb21wbGV4KCkgYXJnIGNvbnRhaW5zIGEgbnVsbCBieXRlIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlpZighZG9uZSkgc3dfZXJyb3I9MTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICBpZiAocy1zdGFydCAhPSBsZW4pIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KCkgYXJnIGNvbnRhaW5zIGEgbnVsbCBieXRlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighZG9uZSkgc3dfZXJyb3I9MTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgJyknOgotCQkJaWYgKCFnb3RfYnJhY2tldCB8fCAhKGdvdF9yZSB8fCBnb3RfaW0pKSB7Ci0JCQkJc3dfZXJyb3I9MTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWdvdF9icmFja2V0PTA7Ci0JCQlkb25lPTE7Ci0JCQlzKys7Ci0JCQl3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQotCQkJCXMrKzsKLQkJCWlmICgqcykgc3dfZXJyb3I9MTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICcpJzoKKyAgICAgICAgICAgIGlmICghZ290X2JyYWNrZXQgfHwgIShnb3RfcmUgfHwgZ290X2ltKSkgeworICAgICAgICAgICAgICAgIHN3X2Vycm9yPTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RfYnJhY2tldD0wOworICAgICAgICAgICAgZG9uZT0xOworICAgICAgICAgICAgcysrOworICAgICAgICAgICAgd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKKyAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICBpZiAoKnMpIHN3X2Vycm9yPTE7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICctJzoKLQkJCXNpZ24gPSAtMTsKLQkJCQkvKiBGYWxsdGhyb3VnaCAqLwotCQljYXNlICcrJzoKLQkJCWlmIChkb25lKSAgc3dfZXJyb3I9MTsKLQkJCXMrKzsKLQkJCWlmICAoICAqcz09J1wwJ3x8KnM9PScrJ3x8KnM9PSctJ3x8KnM9PScpJ3x8Ci0JCQkgICAgICAgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpICApICBzd19lcnJvcj0xOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgc2lnbiA9IC0xOworICAgICAgICAgICAgICAgIC8qIEZhbGx0aHJvdWdoICovCisgICAgICAgIGNhc2UgJysnOgorICAgICAgICAgICAgaWYgKGRvbmUpICBzd19lcnJvcj0xOworICAgICAgICAgICAgcysrOworICAgICAgICAgICAgaWYgICggICpzPT0nXDAnfHwqcz09JysnfHwqcz09Jy0nfHwqcz09JyknfHwKKyAgICAgICAgICAgICAgICAgICBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkgICkgIHN3X2Vycm9yPTE7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlICdKJzoKLQkJY2FzZSAnaic6Ci0JCQlpZiAoZ290X2ltIHx8IGRvbmUpIHsKLQkJCQlzd19lcnJvciA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAgKHo8MC4wKSB7Ci0JCQkJeT1zaWduOwotCQkJfQotCQkJZWxzZXsKLQkJCQl5PXNpZ24qejsKLQkJCX0KLQkJCWdvdF9pbT0xOwotCQkJcysrOwotCQkJaWYgICgqcyE9JysnICYmICpzIT0nLScgKQotCQkJCWRvbmU9MTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgY2FzZSAnaic6CisgICAgICAgICAgICBpZiAoZ290X2ltIHx8IGRvbmUpIHsKKyAgICAgICAgICAgICAgICBzd19lcnJvciA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAgKHo8MC4wKSB7CisgICAgICAgICAgICAgICAgeT1zaWduOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICB5PXNpZ24qejsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvdF9pbT0xOworICAgICAgICAgICAgcysrOworICAgICAgICAgICAgaWYgICgqcyE9JysnICYmICpzIT0nLScgKQorICAgICAgICAgICAgICAgIGRvbmU9MTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCQlpZiAoaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKSB7Ci0JCQkJd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKLQkJCQkJcysrOwotCQkJCWlmICgqcyAmJiAqcyAhPSAnKScpCi0JCQkJCXN3X2Vycm9yPTE7Ci0JCQkJZWxzZQotCQkJCQlkb25lID0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRpZ2l0X29yX2RvdCA9Ci0JCQkJKCpzPT0nLicgfHwgaXNkaWdpdChQeV9DSEFSTUFTSygqcykpKTsKLQkJCWlmICAoZG9uZXx8IWRpZ2l0X29yX2RvdCkgewotCQkJCXN3X2Vycm9yPTE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllcnJubyA9IDA7Ci0JCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJzdHJ0b2QiLCByZXR1cm4gMCkKLQkJCXogPSBQeU9TX2FzY2lpX3N0cnRvZChzLCAmZW5kKSA7Ci0JCQlQeUZQRV9FTkRfUFJPVEVDVCh6KQotCQkJaWYgKGVycm5vID09IEVSQU5HRSAmJiBmYWJzKHopID49IDEuMCkgewotCQkJCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCQkJImZsb2F0KCkgb3V0IG9mIHJhbmdlOiAlLjE1MHMiLCBzKTsKLQkJCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJCVB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCWJ1ZmZlcik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlzPWVuZDsKLQkJCWlmICAoKnM9PSdKJyB8fCAqcz09J2onKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKKyAgICAgICAgICAgICAgICAgICAgcysrOworICAgICAgICAgICAgICAgIGlmICgqcyAmJiAqcyAhPSAnKScpCisgICAgICAgICAgICAgICAgICAgIHN3X2Vycm9yPTE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpZ2l0X29yX2RvdCA9CisgICAgICAgICAgICAgICAgKCpzPT0nLicgfHwgaXNkaWdpdChQeV9DSEFSTUFTSygqcykpKTsKKyAgICAgICAgICAgIGlmICAoZG9uZXx8IWRpZ2l0X29yX2RvdCkgeworICAgICAgICAgICAgICAgIHN3X2Vycm9yPTE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJzdHJ0b2QiLCByZXR1cm4gMCkKKyAgICAgICAgICAgIHogPSBQeU9TX2FzY2lpX3N0cnRvZChzLCAmZW5kKSA7CisgICAgICAgICAgICBQeUZQRV9FTkRfUFJPVEVDVCh6KQorICAgICAgICAgICAgaWYgKGVycm5vID09IEVSQU5HRSAmJiBmYWJzKHopID49IDEuMCkgeworICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgImZsb2F0KCkgb3V0IG9mIHJhbmdlOiAlLjE1MHMiLCBzKTsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzPWVuZDsKKyAgICAgICAgICAgIGlmICAoKnM9PSdKJyB8fCAqcz09J2onKSB7CiAKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICAoZ290X3JlKSB7Ci0JCQkJc3dfZXJyb3I9MTsKLQkJCQlicmVhazsKLQkJCX0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICAoZ290X3JlKSB7CisgICAgICAgICAgICAgICAgc3dfZXJyb3I9MTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAotCQkJCS8qIGFjY2VwdCBhIHJlYWwgcGFydCAqLwotCQkJeD1zaWduKno7Ci0JCQlnb3RfcmU9MTsKLQkJCWlmICAoZ290X2ltKSAgZG9uZT0xOwotCQkJeiA9IC0xLjA7Ci0JCQlzaWduID0gMTsKLQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIGFjY2VwdCBhIHJlYWwgcGFydCAqLworICAgICAgICAgICAgeD1zaWduKno7CisgICAgICAgICAgICBnb3RfcmU9MTsKKyAgICAgICAgICAgIGlmICAoZ290X2ltKSAgZG9uZT0xOworICAgICAgICAgICAgeiA9IC0xLjA7CisgICAgICAgICAgICBzaWduID0gMTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCX0gIC8qIGVuZCBvZiBzd2l0Y2ggICovCisgICAgICAgIH0gIC8qIGVuZCBvZiBzd2l0Y2ggICovCiAKLQl9IHdoaWxlIChzIC0gc3RhcnQgPCBsZW4gJiYgIXN3X2Vycm9yKTsKKyAgICB9IHdoaWxlIChzIC0gc3RhcnQgPCBsZW4gJiYgIXN3X2Vycm9yKTsKIAotCWlmIChzd19lcnJvciB8fCBnb3RfYnJhY2tldCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY29tcGxleCgpIGFyZyBpcyBhIG1hbGZvcm1lZCBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzd19lcnJvciB8fCBnb3RfYnJhY2tldCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KCkgYXJnIGlzIGEgbWFsZm9ybWVkIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gY29tcGxleF9zdWJ0eXBlX2Zyb21fZG91Ymxlcyh0eXBlLCB4LCB5KTsKKyAgICByZXR1cm4gY29tcGxleF9zdWJ0eXBlX2Zyb21fZG91Ymxlcyh0eXBlLCB4LCB5KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBsZXhfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpyLCAqaSwgKnRtcCwgKmY7Ci0JUHlOdW1iZXJNZXRob2RzICpuYnIsICpuYmkgPSBOVUxMOwotCVB5X2NvbXBsZXggY3IsIGNpOwotCWludCBvd25fciA9IDA7Ci0JaW50IGNyX2lzX2NvbXBsZXggPSAwOwotCWludCBjaV9pc19jb21wbGV4ID0gMDsKLQlzdGF0aWMgUHlPYmplY3QgKmNvbXBsZXhzdHI7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJyZWFsIiwgImltYWciLCAwfTsKKyAgICBQeU9iamVjdCAqciwgKmksICp0bXAsICpmOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbmJyLCAqbmJpID0gTlVMTDsKKyAgICBQeV9jb21wbGV4IGNyLCBjaTsKKyAgICBpbnQgb3duX3IgPSAwOworICAgIGludCBjcl9pc19jb21wbGV4ID0gMDsKKyAgICBpbnQgY2lfaXNfY29tcGxleCA9IDA7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb21wbGV4c3RyOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsicmVhbCIsICJpbWFnIiwgMH07CiAKLQlyID0gUHlfRmFsc2U7Ci0JaSA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPTzpjb21wbGV4Iiwga3dsaXN0LAotCQkJCQkgJnIsICZpKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgciA9IFB5X0ZhbHNlOworICAgIGkgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T086Y29tcGxleCIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmciwgJmkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFNwZWNpYWwtY2FzZSBmb3IgYSBzaW5nbGUgYXJndW1lbnQgd2hlbiB0eXBlKGFyZykgaXMgY29tcGxleC4gKi8KLQlpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QocikgJiYgaSA9PSBOVUxMICYmCi0JICAgIHR5cGUgPT0gJlB5Q29tcGxleF9UeXBlKSB7Ci0JCS8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBrbm93IHdoZXRoZXIgaXQncyBzYWZlIHRvIHJldHVybgotCQkgICBhIGNvbXBsZXggKnN1YmNsYXNzKiBpbnN0YW5jZSBhcy1pcywgaGVuY2UgdGhlIHJlc3RyaWN0aW9uCi0JCSAgIHRvIGV4YWN0IGNvbXBsZXhlcyBoZXJlLiAgSWYgZWl0aGVyIHRoZSBpbnB1dCBvciB0aGUKLQkJICAgb3V0cHV0IGlzIGEgY29tcGxleCBzdWJjbGFzcywgaXQgd2lsbCBiZSBoYW5kbGVkIGJlbG93IAotCQkgICBhcyBhIG5vbi1vcnRob2dvbmFsIHZlY3Rvci4gICovCi0JCVB5X0lOQ1JFRihyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCWlmIChQeVN0cmluZ19DaGVjayhyKSB8fCBQeVVuaWNvZGVfQ2hlY2socikpIHsKLQkJaWYgKGkgIT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNvbXBsZXgoKSBjYW4ndCB0YWtlIHNlY29uZCBhcmciCi0JCQkJCSIgaWYgZmlyc3QgaXMgYSBzdHJpbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBjb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcodHlwZSwgcik7Ci0JfQotCWlmIChpICE9IE5VTEwgJiYgKFB5U3RyaW5nX0NoZWNrKGkpIHx8IFB5VW5pY29kZV9DaGVjayhpKSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY29tcGxleCgpIHNlY29uZCBhcmcgY2FuJ3QgYmUgYSBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFNwZWNpYWwtY2FzZSBmb3IgYSBzaW5nbGUgYXJndW1lbnQgd2hlbiB0eXBlKGFyZykgaXMgY29tcGxleC4gKi8KKyAgICBpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QocikgJiYgaSA9PSBOVUxMICYmCisgICAgICAgIHR5cGUgPT0gJlB5Q29tcGxleF9UeXBlKSB7CisgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBrbm93IHdoZXRoZXIgaXQncyBzYWZlIHRvIHJldHVybgorICAgICAgICAgICBhIGNvbXBsZXggKnN1YmNsYXNzKiBpbnN0YW5jZSBhcy1pcywgaGVuY2UgdGhlIHJlc3RyaWN0aW9uCisgICAgICAgICAgIHRvIGV4YWN0IGNvbXBsZXhlcyBoZXJlLiAgSWYgZWl0aGVyIHRoZSBpbnB1dCBvciB0aGUKKyAgICAgICAgICAgb3V0cHV0IGlzIGEgY29tcGxleCBzdWJjbGFzcywgaXQgd2lsbCBiZSBoYW5kbGVkIGJlbG93CisgICAgICAgICAgIGFzIGEgbm9uLW9ydGhvZ29uYWwgdmVjdG9yLiAgKi8KKyAgICAgICAgUHlfSU5DUkVGKHIpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHIpIHx8IFB5VW5pY29kZV9DaGVjayhyKSkgeworICAgICAgICBpZiAoaSAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KCkgY2FuJ3QgdGFrZSBzZWNvbmQgYXJnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaWYgZmlyc3QgaXMgYSBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21wbGV4X3N1YnR5cGVfZnJvbV9zdHJpbmcodHlwZSwgcik7CisgICAgfQorICAgIGlmIChpICE9IE5VTEwgJiYgKFB5U3RyaW5nX0NoZWNrKGkpIHx8IFB5VW5pY29kZV9DaGVjayhpKSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KCkgc2Vjb25kIGFyZyBjYW4ndCBiZSBhIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBYWFggSGFjayB0byBzdXBwb3J0IGNsYXNzZXMgd2l0aCBfX2NvbXBsZXhfXyBtZXRob2QgKi8KLQlpZiAoY29tcGxleHN0ciA9PSBOVUxMKSB7Ci0JCWNvbXBsZXhzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2NvbXBsZXhfXyIpOwotCQlpZiAoY29tcGxleHN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWYgPSBQeU9iamVjdF9HZXRBdHRyKHIsIGNvbXBsZXhzdHIpOwotCWlmIChmID09IE5VTEwpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0JCWlmIChhcmdzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJciA9IFB5RXZhbF9DYWxsT2JqZWN0KGYsIGFyZ3MpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCVB5X0RFQ1JFRihmKTsKLQkJaWYgKHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlvd25fciA9IDE7Ci0JfQotCW5iciA9IHItPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKLQlpZiAoaSAhPSBOVUxMKQotCQluYmkgPSBpLT5vYl90eXBlLT50cF9hc19udW1iZXI7Ci0JaWYgKG5iciA9PSBOVUxMIHx8IG5ici0+bmJfZmxvYXQgPT0gTlVMTCB8fAotCSAgICAoKGkgIT0gTlVMTCkgJiYgKG5iaSA9PSBOVUxMIHx8IG5iaS0+bmJfZmxvYXQgPT0gTlVMTCkpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAiY29tcGxleCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIiKTsKLQkJaWYgKG93bl9yKSB7Ci0JCQlQeV9ERUNSRUYocik7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFhYWCBIYWNrIHRvIHN1cHBvcnQgY2xhc3NlcyB3aXRoIF9fY29tcGxleF9fIG1ldGhvZCAqLworICAgIGlmIChjb21wbGV4c3RyID09IE5VTEwpIHsKKyAgICAgICAgY29tcGxleHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fY29tcGxleF9fIik7CisgICAgICAgIGlmIChjb21wbGV4c3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZiA9IFB5T2JqZWN0X0dldEF0dHIociwgY29tcGxleHN0cik7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByID0gUHlFdmFsX0NhbGxPYmplY3QoZiwgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGYpOworICAgICAgICBpZiAociA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG93bl9yID0gMTsKKyAgICB9CisgICAgbmJyID0gci0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyOworICAgIGlmIChpICE9IE5VTEwpCisgICAgICAgIG5iaSA9IGktPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKKyAgICBpZiAobmJyID09IE5VTEwgfHwgbmJyLT5uYl9mbG9hdCA9PSBOVUxMIHx8CisgICAgICAgICgoaSAhPSBOVUxMKSAmJiAobmJpID09IE5VTEwgfHwgbmJpLT5uYl9mbG9hdCA9PSBOVUxMKSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiY29tcGxleCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIiKTsKKyAgICAgICAgaWYgKG93bl9yKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogSWYgd2UgZ2V0IHRoaXMgZmFyLCB0aGVuIHRoZSAicmVhbCIgYW5kICJpbWFnIiBwYXJ0cyBzaG91bGQKLQkgICBib3RoIGJlIHRyZWF0ZWQgYXMgbnVtYmVycywgYW5kIHRoZSBjb25zdHJ1Y3RvciBzaG91bGQgcmV0dXJuIGEKLQkgICBjb21wbGV4IG51bWJlciBlcXVhbCB0byAocmVhbCArIGltYWcqMWopLgorICAgIC8qIElmIHdlIGdldCB0aGlzIGZhciwgdGhlbiB0aGUgInJlYWwiIGFuZCAiaW1hZyIgcGFydHMgc2hvdWxkCisgICAgICAgYm90aCBiZSB0cmVhdGVkIGFzIG51bWJlcnMsIGFuZCB0aGUgY29uc3RydWN0b3Igc2hvdWxkIHJldHVybiBhCisgICAgICAgY29tcGxleCBudW1iZXIgZXF1YWwgdG8gKHJlYWwgKyBpbWFnKjFqKS4KIAotIAkgICBOb3RlIHRoYXQgd2UgZG8gTk9UIGFzc3VtZSB0aGUgaW5wdXQgdG8gYWxyZWFkeSBiZSBpbiBjYW5vbmljYWwKLQkgICBmb3JtOyB0aGUgInJlYWwiIGFuZCAiaW1hZyIgcGFydHMgbWlnaHQgdGhlbXNlbHZlcyBiZSBjb21wbGV4Ci0JICAgbnVtYmVycywgd2hpY2ggc2xpZ2h0bHkgY29tcGxpY2F0ZXMgdGhlIGNvZGUgYmVsb3cuICovCi0JaWYgKFB5Q29tcGxleF9DaGVjayhyKSkgewotCQkvKiBOb3RlIHRoYXQgaWYgciBpcyBvZiBhIGNvbXBsZXggc3VidHlwZSwgd2UncmUgb25seQotCQkgICByZXRhaW5pbmcgaXRzIHJlYWwgJiBpbWFnIHBhcnRzIGhlcmUsIGFuZCB0aGUgcmV0dXJuCi0JCSAgIHZhbHVlIGlzIChwcm9wZXJseSkgb2YgdGhlIGJ1aWx0aW4gY29tcGxleCB0eXBlLiAqLwotCQljciA9ICgoUHlDb21wbGV4T2JqZWN0KilyKS0+Y3ZhbDsKLQkJY3JfaXNfY29tcGxleCA9IDE7Ci0JCWlmIChvd25fcikgewotCQkJUHlfREVDUkVGKHIpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiBUaGUgInJlYWwiIHBhcnQgcmVhbGx5IGlzIGVudGlyZWx5IHJlYWwsIGFuZCBjb250cmlidXRlcwotCQkgICBub3RoaW5nIGluIHRoZSBpbWFnaW5hcnkgZGlyZWN0aW9uLiAgCi0JCSAgIEp1c3QgdHJlYXQgaXQgYXMgYSBkb3VibGUuICovCi0JCXRtcCA9IFB5TnVtYmVyX0Zsb2F0KHIpOwotCQlpZiAob3duX3IpIHsKLQkJCS8qIHIgd2FzIGEgbmV3bHkgY3JlYXRlZCBjb21wbGV4IG51bWJlciwgcmF0aGVyCi0JCQkgICB0aGFuIHRoZSBvcmlnaW5hbCAicmVhbCIgYXJndW1lbnQuICovCi0JCQlQeV9ERUNSRUYocik7Ci0JCX0KLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICghUHlGbG9hdF9DaGVjayh0bXApKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiZmxvYXQocikgZGlkbid0IHJldHVybiBhIGZsb2F0Iik7Ci0JCQlQeV9ERUNSRUYodG1wKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWNyLnJlYWwgPSBQeUZsb2F0X0FzRG91YmxlKHRtcCk7Ci0JCWNyLmltYWcgPSAwLjA7IC8qIFNodXQgdXAgY29tcGlsZXIgd2FybmluZyAqLwotCQlQeV9ERUNSRUYodG1wKTsKLQl9Ci0JaWYgKGkgPT0gTlVMTCkgewotCQljaS5yZWFsID0gMC4wOwotCX0KLQllbHNlIGlmIChQeUNvbXBsZXhfQ2hlY2soaSkpIHsKLQkJY2kgPSAoKFB5Q29tcGxleE9iamVjdCopaSktPmN2YWw7Ci0JCWNpX2lzX2NvbXBsZXggPSAxOwotCX0gZWxzZSB7Ci0JCS8qIFRoZSAiaW1hZyIgcGFydCByZWFsbHkgaXMgZW50aXJlbHkgaW1hZ2luYXJ5LCBhbmQKLQkJICAgY29udHJpYnV0ZXMgbm90aGluZyBpbiB0aGUgcmVhbCBkaXJlY3Rpb24uCi0JCSAgIEp1c3QgdHJlYXQgaXQgYXMgYSBkb3VibGUuICovCi0JCXRtcCA9ICgqbmJpLT5uYl9mbG9hdCkoaSk7Ci0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQljaS5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZSh0bXApOwotCQlQeV9ERUNSRUYodG1wKTsKLQl9Ci0JLyogIElmIHRoZSBpbnB1dCB3YXMgaW4gY2Fub25pY2FsIGZvcm0sIHRoZW4gdGhlICJyZWFsIiBhbmQgImltYWciCi0JICAgIHBhcnRzIGFyZSByZWFsIG51bWJlcnMsIHNvIHRoYXQgY2kuaW1hZyBhbmQgY3IuaW1hZyBhcmUgemVyby4KLQkgICAgV2UgbmVlZCB0aGlzIGNvcnJlY3Rpb24gaW4gY2FzZSB0aGV5IHdlcmUgbm90IHJlYWwgbnVtYmVycy4gKi8KKyAgICAgICBOb3RlIHRoYXQgd2UgZG8gTk9UIGFzc3VtZSB0aGUgaW5wdXQgdG8gYWxyZWFkeSBiZSBpbiBjYW5vbmljYWwKKyAgICAgICBmb3JtOyB0aGUgInJlYWwiIGFuZCAiaW1hZyIgcGFydHMgbWlnaHQgdGhlbXNlbHZlcyBiZSBjb21wbGV4CisgICAgICAgbnVtYmVycywgd2hpY2ggc2xpZ2h0bHkgY29tcGxpY2F0ZXMgdGhlIGNvZGUgYmVsb3cuICovCisgICAgaWYgKFB5Q29tcGxleF9DaGVjayhyKSkgeworICAgICAgICAvKiBOb3RlIHRoYXQgaWYgciBpcyBvZiBhIGNvbXBsZXggc3VidHlwZSwgd2UncmUgb25seQorICAgICAgICAgICByZXRhaW5pbmcgaXRzIHJlYWwgJiBpbWFnIHBhcnRzIGhlcmUsIGFuZCB0aGUgcmV0dXJuCisgICAgICAgICAgIHZhbHVlIGlzIChwcm9wZXJseSkgb2YgdGhlIGJ1aWx0aW4gY29tcGxleCB0eXBlLiAqLworICAgICAgICBjciA9ICgoUHlDb21wbGV4T2JqZWN0KilyKS0+Y3ZhbDsKKyAgICAgICAgY3JfaXNfY29tcGxleCA9IDE7CisgICAgICAgIGlmIChvd25fcikgeworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBUaGUgInJlYWwiIHBhcnQgcmVhbGx5IGlzIGVudGlyZWx5IHJlYWwsIGFuZCBjb250cmlidXRlcworICAgICAgICAgICBub3RoaW5nIGluIHRoZSBpbWFnaW5hcnkgZGlyZWN0aW9uLgorICAgICAgICAgICBKdXN0IHRyZWF0IGl0IGFzIGEgZG91YmxlLiAqLworICAgICAgICB0bXAgPSBQeU51bWJlcl9GbG9hdChyKTsKKyAgICAgICAgaWYgKG93bl9yKSB7CisgICAgICAgICAgICAvKiByIHdhcyBhIG5ld2x5IGNyZWF0ZWQgY29tcGxleCBudW1iZXIsIHJhdGhlcgorICAgICAgICAgICAgICAgdGhhbiB0aGUgb3JpZ2luYWwgInJlYWwiIGFyZ3VtZW50LiAqLworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICB9CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5RmxvYXRfQ2hlY2sodG1wKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQocikgZGlkbid0IHJldHVybiBhIGZsb2F0Iik7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGNyLnJlYWwgPSBQeUZsb2F0X0FzRG91YmxlKHRtcCk7CisgICAgICAgIGNyLmltYWcgPSAwLjA7IC8qIFNodXQgdXAgY29tcGlsZXIgd2FybmluZyAqLworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CisgICAgaWYgKGkgPT0gTlVMTCkgeworICAgICAgICBjaS5yZWFsID0gMC4wOworICAgIH0KKyAgICBlbHNlIGlmIChQeUNvbXBsZXhfQ2hlY2soaSkpIHsKKyAgICAgICAgY2kgPSAoKFB5Q29tcGxleE9iamVjdCopaSktPmN2YWw7CisgICAgICAgIGNpX2lzX2NvbXBsZXggPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoZSAiaW1hZyIgcGFydCByZWFsbHkgaXMgZW50aXJlbHkgaW1hZ2luYXJ5LCBhbmQKKyAgICAgICAgICAgY29udHJpYnV0ZXMgbm90aGluZyBpbiB0aGUgcmVhbCBkaXJlY3Rpb24uCisgICAgICAgICAgIEp1c3QgdHJlYXQgaXQgYXMgYSBkb3VibGUuICovCisgICAgICAgIHRtcCA9ICgqbmJpLT5uYl9mbG9hdCkoaSk7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjaS5yZWFsID0gUHlGbG9hdF9Bc0RvdWJsZSh0bXApOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CisgICAgLyogIElmIHRoZSBpbnB1dCB3YXMgaW4gY2Fub25pY2FsIGZvcm0sIHRoZW4gdGhlICJyZWFsIiBhbmQgImltYWciCisgICAgICAgIHBhcnRzIGFyZSByZWFsIG51bWJlcnMsIHNvIHRoYXQgY2kuaW1hZyBhbmQgY3IuaW1hZyBhcmUgemVyby4KKyAgICAgICAgV2UgbmVlZCB0aGlzIGNvcnJlY3Rpb24gaW4gY2FzZSB0aGV5IHdlcmUgbm90IHJlYWwgbnVtYmVycy4gKi8KIAotCWlmIChjaV9pc19jb21wbGV4KSB7Ci0JCWNyLnJlYWwgLT0gY2kuaW1hZzsKLQl9Ci0JaWYgKGNyX2lzX2NvbXBsZXgpIHsKLQkJY2kucmVhbCArPSBjci5pbWFnOwotCX0KLQlyZXR1cm4gY29tcGxleF9zdWJ0eXBlX2Zyb21fZG91Ymxlcyh0eXBlLCBjci5yZWFsLCBjaS5yZWFsKTsKKyAgICBpZiAoY2lfaXNfY29tcGxleCkgeworICAgICAgICBjci5yZWFsIC09IGNpLmltYWc7CisgICAgfQorICAgIGlmIChjcl9pc19jb21wbGV4KSB7CisgICAgICAgIGNpLnJlYWwgKz0gY3IuaW1hZzsKKyAgICB9CisgICAgcmV0dXJuIGNvbXBsZXhfc3VidHlwZV9mcm9tX2RvdWJsZXModHlwZSwgY3IucmVhbCwgY2kucmVhbCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjb21wbGV4X2RvYywKQEAgLTExODgsODYgKzExODgsODYgQEAKICJUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKHJlYWwgKyBpbWFnKjFqKSB3aGVyZSBpbWFnIGRlZmF1bHRzIHRvIDAuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgY29tcGxleF9hc19udW1iZXIgPSB7Ci0JKGJpbmFyeWZ1bmMpY29tcGxleF9hZGQsIAkJLyogbmJfYWRkICovCi0JKGJpbmFyeWZ1bmMpY29tcGxleF9zdWIsIAkJLyogbmJfc3VidHJhY3QgKi8KLQkoYmluYXJ5ZnVuYyljb21wbGV4X211bCwgCQkvKiBuYl9tdWx0aXBseSAqLwotCShiaW5hcnlmdW5jKWNvbXBsZXhfY2xhc3NpY19kaXYsCS8qIG5iX2RpdmlkZSAqLwotCShiaW5hcnlmdW5jKWNvbXBsZXhfcmVtYWluZGVyLAkJLyogbmJfcmVtYWluZGVyICovCi0JKGJpbmFyeWZ1bmMpY29tcGxleF9kaXZtb2QsCQkvKiBuYl9kaXZtb2QgKi8KLQkodGVybmFyeWZ1bmMpY29tcGxleF9wb3csCQkvKiBuYl9wb3dlciAqLwotCSh1bmFyeWZ1bmMpY29tcGxleF9uZWcsCQkJLyogbmJfbmVnYXRpdmUgKi8KLQkodW5hcnlmdW5jKWNvbXBsZXhfcG9zLAkJCS8qIG5iX3Bvc2l0aXZlICovCi0JKHVuYXJ5ZnVuYyljb21wbGV4X2FicywJCQkvKiBuYl9hYnNvbHV0ZSAqLwotCShpbnF1aXJ5KWNvbXBsZXhfbm9uemVybywJCS8qIG5iX25vbnplcm8gKi8KLQkwLAkJCQkJLyogbmJfaW52ZXJ0ICovCi0JMCwJCQkJCS8qIG5iX2xzaGlmdCAqLwotCTAsCQkJCQkvKiBuYl9yc2hpZnQgKi8KLQkwLAkJCQkJLyogbmJfYW5kICovCi0JMCwJCQkJCS8qIG5iX3hvciAqLwotCTAsCQkJCQkvKiBuYl9vciAqLwotCWNvbXBsZXhfY29lcmNlLAkJCQkvKiBuYl9jb2VyY2UgKi8KLQljb21wbGV4X2ludCwJCQkJLyogbmJfaW50ICovCi0JY29tcGxleF9sb25nLAkJCQkvKiBuYl9sb25nICovCi0JY29tcGxleF9mbG9hdCwJCQkJLyogbmJfZmxvYXQgKi8KLQkwLAkJCQkJLyogbmJfb2N0ICovCi0JMCwJCQkJCS8qIG5iX2hleCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2FkZCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCi0JMCwJCQkJCS8qIG5iX2lucGxhY2VfbXVsdGlwbHkqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLwotCTAsIAkJCQkJLyogbmJfaW5wbGFjZV9wb3dlciAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2FuZCAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3hvciAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX29yICovCi0JKGJpbmFyeWZ1bmMpY29tcGxleF9pbnRfZGl2LAkJLyogbmJfZmxvb3JfZGl2aWRlICovCi0JKGJpbmFyeWZ1bmMpY29tcGxleF9kaXYsCQkvKiBuYl90cnVlX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLwotCTAsCQkJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisgICAgKGJpbmFyeWZ1bmMpY29tcGxleF9hZGQsICAgICAgICAgICAgICAgICAgICAvKiBuYl9hZGQgKi8KKyAgICAoYmluYXJ5ZnVuYyljb21wbGV4X3N1YiwgICAgICAgICAgICAgICAgICAgIC8qIG5iX3N1YnRyYWN0ICovCisgICAgKGJpbmFyeWZ1bmMpY29tcGxleF9tdWwsICAgICAgICAgICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIChiaW5hcnlmdW5jKWNvbXBsZXhfY2xhc3NpY19kaXYsICAgICAgICAgICAgLyogbmJfZGl2aWRlICovCisgICAgKGJpbmFyeWZ1bmMpY29tcGxleF9yZW1haW5kZXIsICAgICAgICAgICAgICAvKiBuYl9yZW1haW5kZXIgKi8KKyAgICAoYmluYXJ5ZnVuYyljb21wbGV4X2Rpdm1vZCwgICAgICAgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgICh0ZXJuYXJ5ZnVuYyljb21wbGV4X3BvdywgICAgICAgICAgICAgICAgICAgLyogbmJfcG93ZXIgKi8KKyAgICAodW5hcnlmdW5jKWNvbXBsZXhfbmVnLCAgICAgICAgICAgICAgICAgICAgIC8qIG5iX25lZ2F0aXZlICovCisgICAgKHVuYXJ5ZnVuYyljb21wbGV4X3BvcywgICAgICAgICAgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgICh1bmFyeWZ1bmMpY29tcGxleF9hYnMsICAgICAgICAgICAgICAgICAgICAgLyogbmJfYWJzb2x1dGUgKi8KKyAgICAoaW5xdWlyeSljb21wbGV4X25vbnplcm8sICAgICAgICAgICAgICAgICAgIC8qIG5iX25vbnplcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2ludmVydCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfbHNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9yc2hpZnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2FuZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfeG9yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9vciAqLworICAgIGNvbXBsZXhfY29lcmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfY29lcmNlICovCisgICAgY29tcGxleF9pbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnQgKi8KKyAgICBjb21wbGV4X2xvbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2xvbmcgKi8KKyAgICBjb21wbGV4X2Zsb2F0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Zsb2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9vY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2hleCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hZGQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfbXVsdGlwbHkqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3Bvd2VyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2xzaGlmdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfYW5kICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3hvciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9vciAqLworICAgIChiaW5hcnlmdW5jKWNvbXBsZXhfaW50X2RpdiwgICAgICAgICAgICAgICAgLyogbmJfZmxvb3JfZGl2aWRlICovCisgICAgKGJpbmFyeWZ1bmMpY29tcGxleF9kaXYsICAgICAgICAgICAgICAgICAgICAvKiBuYl90cnVlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUNvbXBsZXhfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJjb21wbGV4IiwKLQlzaXplb2YoUHlDb21wbGV4T2JqZWN0KSwKLQkwLAotCWNvbXBsZXhfZGVhbGxvYywJCQkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYyljb21wbGV4X3ByaW50LAkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpY29tcGxleF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkmY29tcGxleF9hc19udW1iZXIsICAgIAkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKWNvbXBsZXhfaGFzaCwgCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpY29tcGxleF9zdHIsCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCWNvbXBsZXhfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQljb21wbGV4X3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQljb21wbGV4X21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCWNvbXBsZXhfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JY29tcGxleF9uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwgICAgICAgICAgIAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImNvbXBsZXgiLAorICAgIHNpemVvZihQeUNvbXBsZXhPYmplY3QpLAorICAgIDAsCisgICAgY29tcGxleF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKHByaW50ZnVuYyljb21wbGV4X3ByaW50LCAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyljb21wbGV4X3JlcHIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZjb21wbGV4X2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYyljb21wbGV4X2hhc2gsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIChyZXByZnVuYyljb21wbGV4X3N0ciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgY29tcGxleF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIGNvbXBsZXhfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGNvbXBsZXhfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGNvbXBsZXhfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBjb21wbGV4X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKaW5kZXggMDBjZGEzYy4uYmZlNjY1NiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9kZXNjcm9iamVjdC5jCisrKyBiL09iamVjdHMvZGVzY3JvYmplY3QuYwpAQCAtNiw2NDUgKzYsNjQ1IEBACiBzdGF0aWMgdm9pZAogZGVzY3JfZGVhbGxvYyhQeURlc2NyT2JqZWN0ICpkZXNjcikKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhkZXNjcik7Ci0JUHlfWERFQ1JFRihkZXNjci0+ZF90eXBlKTsKLQlQeV9YREVDUkVGKGRlc2NyLT5kX25hbWUpOwotCVB5T2JqZWN0X0dDX0RlbChkZXNjcik7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soZGVzY3IpOworICAgIFB5X1hERUNSRUYoZGVzY3ItPmRfdHlwZSk7CisgICAgUHlfWERFQ1JFRihkZXNjci0+ZF9uYW1lKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoZGVzY3IpOwogfQogCiBzdGF0aWMgY2hhciAqCiBkZXNjcl9uYW1lKFB5RGVzY3JPYmplY3QgKmRlc2NyKQogewotCWlmIChkZXNjci0+ZF9uYW1lICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2soZGVzY3ItPmRfbmFtZSkpCi0JCXJldHVybiBQeVN0cmluZ19BU19TVFJJTkcoZGVzY3ItPmRfbmFtZSk7Ci0JZWxzZQotCQlyZXR1cm4gIj8iOworICAgIGlmIChkZXNjci0+ZF9uYW1lICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2soZGVzY3ItPmRfbmFtZSkpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19BU19TVFJJTkcoZGVzY3ItPmRfbmFtZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gIj8iOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGVzY3JfcmVwcihQeURlc2NyT2JqZWN0ICpkZXNjciwgY2hhciAqZm9ybWF0KQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KGZvcm1hdCwgZGVzY3JfbmFtZShkZXNjciksCi0JCQkJICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoZm9ybWF0LCBkZXNjcl9uYW1lKGRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ldGhvZF9yZXByKFB5TWV0aG9kRGVzY3JPYmplY3QgKmRlc2NyKQogewotCXJldHVybiBkZXNjcl9yZXByKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIAotCQkJICAiPG1ldGhvZCAnJXMnIG9mICclcycgb2JqZWN0cz4iKTsKKyAgICByZXR1cm4gZGVzY3JfcmVwcigoUHlEZXNjck9iamVjdCAqKWRlc2NyLAorICAgICAgICAgICAgICAgICAgICAgICI8bWV0aG9kICclcycgb2YgJyVzJyBvYmplY3RzPiIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWVtYmVyX3JlcHIoUHlNZW1iZXJEZXNjck9iamVjdCAqZGVzY3IpCiB7Ci0JcmV0dXJuIGRlc2NyX3JlcHIoKFB5RGVzY3JPYmplY3QgKilkZXNjciwgCi0JCQkgICI8bWVtYmVyICclcycgb2YgJyVzJyBvYmplY3RzPiIpOworICAgIHJldHVybiBkZXNjcl9yZXByKChQeURlc2NyT2JqZWN0ICopZGVzY3IsCisgICAgICAgICAgICAgICAgICAgICAgIjxtZW1iZXIgJyVzJyBvZiAnJXMnIG9iamVjdHM+Iik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRzZXRfcmVwcihQeUdldFNldERlc2NyT2JqZWN0ICpkZXNjcikKIHsKLQlyZXR1cm4gZGVzY3JfcmVwcigoUHlEZXNjck9iamVjdCAqKWRlc2NyLCAKLQkJCSAgIjxhdHRyaWJ1dGUgJyVzJyBvZiAnJXMnIG9iamVjdHM+Iik7CisgICAgcmV0dXJuIGRlc2NyX3JlcHIoKFB5RGVzY3JPYmplY3QgKilkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAiPGF0dHJpYnV0ZSAnJXMnIG9mICclcycgb2JqZWN0cz4iKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBwZXJkZXNjcl9yZXByKFB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjcikKIHsKLQlyZXR1cm4gZGVzY3JfcmVwcigoUHlEZXNjck9iamVjdCAqKWRlc2NyLCAKLQkJCSAgIjxzbG90IHdyYXBwZXIgJyVzJyBvZiAnJXMnIG9iamVjdHM+Iik7CisgICAgcmV0dXJuIGRlc2NyX3JlcHIoKFB5RGVzY3JPYmplY3QgKilkZXNjciwKKyAgICAgICAgICAgICAgICAgICAgICAiPHNsb3Qgd3JhcHBlciAnJXMnIG9mICclcycgb2JqZWN0cz4iKTsKIH0KIAogc3RhdGljIGludAogZGVzY3JfY2hlY2soUHlEZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICoqcHJlcykKIHsKLQlpZiAob2JqID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKGRlc2NyKTsKLQkJKnByZXMgPSAoUHlPYmplY3QgKilkZXNjcjsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKG9iaiwgZGVzY3ItPmRfdHlwZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImRlc2NyaXB0b3IgJyVzJyBmb3IgJyVzJyBvYmplY3RzICIKLQkJCSAgICAgImRvZXNuJ3QgYXBwbHkgdG8gJyVzJyBvYmplY3QiLAotCQkJICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAotCQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAotCQkJICAgICBvYmotPm9iX3R5cGUtPnRwX25hbWUpOwotCQkqcHJlcyA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlc2NyKTsKKyAgICAgICAgKnByZXMgPSAoUHlPYmplY3QgKilkZXNjcjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKG9iaiwgZGVzY3ItPmRfdHlwZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yICclcycgZm9yICclcycgb2JqZWN0cyAiCisgICAgICAgICAgICAgICAgICAgICAiZG9lc24ndCBhcHBseSB0byAnJXMnIG9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICpwcmVzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xhc3NtZXRob2RfZ2V0KFB5TWV0aG9kRGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQkvKiBFbnN1cmUgYSB2YWxpZCB0eXBlLiAgQ2xhc3MgbWV0aG9kcyBpZ25vcmUgb2JqLiAqLwotCWlmICh0eXBlID09IE5VTEwpIHsKLQkJaWYgKG9iaiAhPSBOVUxMKQotCQkJdHlwZSA9IChQeU9iamVjdCAqKW9iai0+b2JfdHlwZTsKLQkJZWxzZSB7Ci0JCQkvKiBXb3QgLSBubyB0eXBlPyEgKi8KLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiZGVzY3JpcHRvciAnJXMnIGZvciB0eXBlICclcycgIgotCQkJCSAgICAgIm5lZWRzIGVpdGhlciBhbiBvYmplY3Qgb3IgYSB0eXBlIiwKLQkJCQkgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCi0JCQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWlmICghUHlUeXBlX0NoZWNrKHR5cGUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJkZXNjcmlwdG9yICclcycgZm9yIHR5cGUgJyVzJyAiCi0JCQkgICAgICJuZWVkcyBhIHR5cGUsIG5vdCBhICclcycgYXMgYXJnIDIiLAotCQkJICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAotCQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAotCQkJICAgICB0eXBlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlUeXBlX0lzU3VidHlwZSgoUHlUeXBlT2JqZWN0ICopdHlwZSwgZGVzY3ItPmRfdHlwZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImRlc2NyaXB0b3IgJyVzJyBmb3IgdHlwZSAnJXMnICIKLQkJCSAgICAgImRvZXNuJ3QgYXBwbHkgdG8gdHlwZSAnJXMnIiwKLQkJCSAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKLQkJCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlDRnVuY3Rpb25fTmV3KGRlc2NyLT5kX21ldGhvZCwgdHlwZSk7CisgICAgLyogRW5zdXJlIGEgdmFsaWQgdHlwZS4gIENsYXNzIG1ldGhvZHMgaWdub3JlIG9iai4gKi8KKyAgICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChvYmogIT0gTlVMTCkKKyAgICAgICAgICAgIHR5cGUgPSAoUHlPYmplY3QgKilvYmotPm9iX3R5cGU7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogV290IC0gbm8gdHlwZT8hICovCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yICclcycgZm9yIHR5cGUgJyVzJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRzIGVpdGhlciBhbiBvYmplY3Qgb3IgYSB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFQeVR5cGVfQ2hlY2sodHlwZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yICclcycgZm9yIHR5cGUgJyVzJyAiCisgICAgICAgICAgICAgICAgICAgICAibmVlZHMgYSB0eXBlLCBub3QgYSAnJXMnIGFzIGFyZyAyIiwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoKFB5VHlwZU9iamVjdCAqKXR5cGUsIGRlc2NyLT5kX3R5cGUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJXMnIGZvciB0eXBlICclcycgIgorICAgICAgICAgICAgICAgICAgICAgImRvZXNuJ3QgYXBwbHkgdG8gdHlwZSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QgKil0eXBlKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlDRnVuY3Rpb25fTmV3KGRlc2NyLT5kX21ldGhvZCwgdHlwZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRob2RfZ2V0KFB5TWV0aG9kRGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoZGVzY3JfY2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCAmcmVzKSkKLQkJcmV0dXJuIHJlczsKLQlyZXR1cm4gUHlDRnVuY3Rpb25fTmV3KGRlc2NyLT5kX21ldGhvZCwgb2JqKTsKKyAgICBpZiAoZGVzY3JfY2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCAmcmVzKSkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICByZXR1cm4gUHlDRnVuY3Rpb25fTmV3KGRlc2NyLT5kX21ldGhvZCwgb2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1lbWJlcl9nZXQoUHlNZW1iZXJEZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChkZXNjcl9jaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosICZyZXMpKQotCQlyZXR1cm4gcmVzOwotCXJldHVybiBQeU1lbWJlcl9HZXRPbmUoKGNoYXIgKilvYmosIGRlc2NyLT5kX21lbWJlcik7CisgICAgaWYgKGRlc2NyX2NoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgJnJlcykpCisgICAgICAgIHJldHVybiByZXM7CisgICAgcmV0dXJuIFB5TWVtYmVyX0dldE9uZSgoY2hhciAqKW9iaiwgZGVzY3ItPmRfbWVtYmVyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldHNldF9nZXQoUHlHZXRTZXREZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChkZXNjcl9jaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosICZyZXMpKQotCQlyZXR1cm4gcmVzOwotCWlmIChkZXNjci0+ZF9nZXRzZXQtPmdldCAhPSBOVUxMKQotCQlyZXR1cm4gZGVzY3ItPmRfZ2V0c2V0LT5nZXQob2JqLCBkZXNjci0+ZF9nZXRzZXQtPmNsb3N1cmUpOwotCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJICAgICAiYXR0cmlidXRlICclLjMwMHMnIG9mICclLjEwMHMnIG9iamVjdHMgaXMgbm90IHJlYWRhYmxlIiwKLQkJICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAotCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOwotCXJldHVybiBOVUxMOworICAgIGlmIChkZXNjcl9jaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosICZyZXMpKQorICAgICAgICByZXR1cm4gcmVzOworICAgIGlmIChkZXNjci0+ZF9nZXRzZXQtPmdldCAhPSBOVUxMKQorICAgICAgICByZXR1cm4gZGVzY3ItPmRfZ2V0c2V0LT5nZXQob2JqLCBkZXNjci0+ZF9nZXRzZXQtPmNsb3N1cmUpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSAnJS4zMDBzJyBvZiAnJS4xMDBzJyBvYmplY3RzIGlzIG5vdCByZWFkYWJsZSIsCisgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcHBlcmRlc2NyX2dldChQeVdyYXBwZXJEZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChkZXNjcl9jaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosICZyZXMpKQotCQlyZXR1cm4gcmVzOwotCXJldHVybiBQeVdyYXBwZXJfTmV3KChQeU9iamVjdCAqKWRlc2NyLCBvYmopOworICAgIGlmIChkZXNjcl9jaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosICZyZXMpKQorICAgICAgICByZXR1cm4gcmVzOworICAgIHJldHVybiBQeVdyYXBwZXJfTmV3KChQeU9iamVjdCAqKWRlc2NyLCBvYmopOwogfQogCiBzdGF0aWMgaW50CiBkZXNjcl9zZXRjaGVjayhQeURlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnZhbHVlLAotCSAgICAgICBpbnQgKnByZXMpCisgICAgICAgICAgICAgICBpbnQgKnByZXMpCiB7Ci0JYXNzZXJ0KG9iaiAhPSBOVUxMKTsKLQlpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvYmosIGRlc2NyLT5kX3R5cGUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJkZXNjcmlwdG9yICclLjIwMHMnIGZvciAnJS4xMDBzJyBvYmplY3RzICIKLQkJCSAgICAgImRvZXNuJ3QgYXBwbHkgdG8gJyUuMTAwcycgb2JqZWN0IiwKLQkJCSAgICAgZGVzY3JfbmFtZShkZXNjciksCi0JCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCi0JCQkgICAgIG9iai0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCSpwcmVzID0gLTE7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQob2JqICE9IE5VTEwpOworICAgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKG9iaiwgZGVzY3ItPmRfdHlwZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yICclLjIwMHMnIGZvciAnJS4xMDBzJyBvYmplY3RzICIKKyAgICAgICAgICAgICAgICAgICAgICJkb2Vzbid0IGFwcGx5IHRvICclLjEwMHMnIG9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICBkZXNjcl9uYW1lKGRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBvYmotPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAqcHJlcyA9IC0xOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIG1lbWJlcl9zZXQoUHlNZW1iZXJEZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlpbnQgcmVzOworICAgIGludCByZXM7CiAKLQlpZiAoZGVzY3Jfc2V0Y2hlY2soKFB5RGVzY3JPYmplY3QgKilkZXNjciwgb2JqLCB2YWx1ZSwgJnJlcykpCi0JCXJldHVybiByZXM7Ci0JcmV0dXJuIFB5TWVtYmVyX1NldE9uZSgoY2hhciAqKW9iaiwgZGVzY3ItPmRfbWVtYmVyLCB2YWx1ZSk7CisgICAgaWYgKGRlc2NyX3NldGNoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgdmFsdWUsICZyZXMpKQorICAgICAgICByZXR1cm4gcmVzOworICAgIHJldHVybiBQeU1lbWJlcl9TZXRPbmUoKGNoYXIgKilvYmosIGRlc2NyLT5kX21lbWJlciwgdmFsdWUpOwogfQogCiBzdGF0aWMgaW50CiBnZXRzZXRfc2V0KFB5R2V0U2V0RGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JaW50IHJlczsKKyAgICBpbnQgcmVzOwogCi0JaWYgKGRlc2NyX3NldGNoZWNrKChQeURlc2NyT2JqZWN0ICopZGVzY3IsIG9iaiwgdmFsdWUsICZyZXMpKQotCQlyZXR1cm4gcmVzOwotCWlmIChkZXNjci0+ZF9nZXRzZXQtPnNldCAhPSBOVUxMKQotCQlyZXR1cm4gZGVzY3ItPmRfZ2V0c2V0LT5zZXQob2JqLCB2YWx1ZSwKLQkJCQkJICAgIGRlc2NyLT5kX2dldHNldC0+Y2xvc3VyZSk7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkgICAgICJhdHRyaWJ1dGUgJyUuMzAwcycgb2YgJyUuMTAwcycgb2JqZWN0cyBpcyBub3Qgd3JpdGFibGUiLAotCQkgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCi0JCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIC0xOworICAgIGlmIChkZXNjcl9zZXRjaGVjaygoUHlEZXNjck9iamVjdCAqKWRlc2NyLCBvYmosIHZhbHVlLCAmcmVzKSkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBpZiAoZGVzY3ItPmRfZ2V0c2V0LT5zZXQgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGRlc2NyLT5kX2dldHNldC0+c2V0KG9iaiwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF9nZXRzZXQtPmNsb3N1cmUpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSAnJS4zMDBzJyBvZiAnJS4xMDBzJyBvYmplY3RzIGlzIG5vdCB3cml0YWJsZSIsCisgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ldGhvZGRlc2NyX2NhbGwoUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3IsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeV9zc2l6ZV90IGFyZ2M7Ci0JUHlPYmplY3QgKnNlbGYsICpmdW5jLCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgYXJnYzsKKyAgICBQeU9iamVjdCAqc2VsZiwgKmZ1bmMsICpyZXN1bHQ7CiAKLQkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYWNjZXB0YWJsZSBhcyAnc2VsZicgKi8KLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JYXJnYyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JaWYgKGFyZ2MgPCAxKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJkZXNjcmlwdG9yICclLjMwMHMnIG9mICclLjEwMHMnICIKLQkJCSAgICAgIm9iamVjdCBuZWVkcyBhbiBhcmd1bWVudCIsCi0JCQkgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCi0JCQkgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2VsZiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKCFQeU9iamVjdF9Jc0luc3RhbmNlKHNlbGYsIChQeU9iamVjdCAqKShkZXNjci0+ZF90eXBlKSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImRlc2NyaXB0b3IgJyUuMjAwcycgIgotCQkJICAgICAicmVxdWlyZXMgYSAnJS4xMDBzJyBvYmplY3QgIgotCQkJICAgICAiYnV0IHJlY2VpdmVkIGEgJyUuMTAwcyciLAotCQkJICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAotCQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAotCQkJICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhY2NlcHRhYmxlIGFzICdzZWxmJyAqLworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICBhcmdjID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICBpZiAoYXJnYyA8IDEpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yICclLjMwMHMnIG9mICclLjEwMHMnICIKKyAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgbmVlZHMgYW4gYXJndW1lbnQiLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2VsZiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgaWYgKCFQeU9iamVjdF9Jc0luc3RhbmNlKHNlbGYsIChQeU9iamVjdCAqKShkZXNjci0+ZF90eXBlKSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yICclLjIwMHMnICIKKyAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlcyBhICclLjEwMHMnIG9iamVjdCAiCisgICAgICAgICAgICAgICAgICAgICAiYnV0IHJlY2VpdmVkIGEgJyUuMTAwcyciLAorICAgICAgICAgICAgICAgICAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyLT5kX3R5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyhkZXNjci0+ZF9tZXRob2QsIHNlbGYpOwotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIGFyZ2MpOwotCWlmIChhcmdzID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJncywga3dkcyk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcoZGVzY3ItPmRfbWV0aG9kLCBzZWxmKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBhcmdjKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZ3MsIGt3ZHMpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsYXNzbWV0aG9kZGVzY3JfY2FsbChQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjciwgUHlPYmplY3QgKmFyZ3MsCi0JCSAgICAgIFB5T2JqZWN0ICprd2RzKQorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpmdW5jLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzdWx0OwogCi0JZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyhkZXNjci0+ZF9tZXRob2QsIChQeU9iamVjdCAqKWRlc2NyLT5kX3R5cGUpOwotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcoZGVzY3ItPmRfbWV0aG9kLCAoUHlPYmplY3QgKilkZXNjci0+ZF90eXBlKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZ3MsIGt3ZHMpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZ3MsIGt3ZHMpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcHBlcmRlc2NyX2NhbGwoUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlfc3NpemVfdCBhcmdjOwotCVB5T2JqZWN0ICpzZWxmLCAqZnVuYywgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGFyZ2M7CisgICAgUHlPYmplY3QgKnNlbGYsICpmdW5jLCAqcmVzdWx0OwogCi0JLyogTWFrZSBzdXJlIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFjY2VwdGFibGUgYXMgJ3NlbGYnICovCi0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOwotCWFyZ2MgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCWlmIChhcmdjIDwgMSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZGVzY3JpcHRvciAnJS4zMDBzJyBvZiAnJS4xMDBzJyAiCi0JCQkgICAgICJvYmplY3QgbmVlZHMgYW4gYXJndW1lbnQiLAotCQkJICAgICBkZXNjcl9uYW1lKChQeURlc2NyT2JqZWN0ICopZGVzY3IpLAotCQkJICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNlbGYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCWlmICghUHlPYmplY3RfSXNJbnN0YW5jZShzZWxmLCAoUHlPYmplY3QgKikoZGVzY3ItPmRfdHlwZSkpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJkZXNjcmlwdG9yICclLjIwMHMnICIKLQkJCSAgICAgInJlcXVpcmVzIGEgJyUuMTAwcycgb2JqZWN0ICIKLQkJCSAgICAgImJ1dCByZWNlaXZlZCBhICclLjEwMHMnIiwKLQkJCSAgICAgZGVzY3JfbmFtZSgoUHlEZXNjck9iamVjdCAqKWRlc2NyKSwKLQkJCSAgICAgZGVzY3ItPmRfdHlwZS0+dHBfbmFtZSwKLQkJCSAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYWNjZXB0YWJsZSBhcyAnc2VsZicgKi8KKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgYXJnYyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJS4zMDBzJyBvZiAnJS4xMDBzJyAiCisgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNlbGYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIGlmICghUHlPYmplY3RfSXNJbnN0YW5jZShzZWxmLCAoUHlPYmplY3QgKikoZGVzY3ItPmRfdHlwZSkpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvciAnJS4yMDBzJyAiCisgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZXMgYSAnJS4xMDBzJyBvYmplY3QgIgorICAgICAgICAgICAgICAgICAgICAgImJ1dCByZWNlaXZlZCBhICclLjEwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgIGRlc2NyX25hbWUoKFB5RGVzY3JPYmplY3QgKilkZXNjciksCisgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZF90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZ1bmMgPSBQeVdyYXBwZXJfTmV3KChQeU9iamVjdCAqKWRlc2NyLCBzZWxmKTsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCBhcmdjKTsKLQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZ3MsIGt3ZHMpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoZnVuYyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmdW5jID0gUHlXcmFwcGVyX05ldygoUHlPYmplY3QgKilkZXNjciwgc2VsZik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgYXJnYyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmdzLCBrd2RzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRob2RfZ2V0X2RvYyhQeU1ldGhvZERlc2NyT2JqZWN0ICpkZXNjciwgdm9pZCAqY2xvc3VyZSkKIHsKLQlpZiAoZGVzY3ItPmRfbWV0aG9kLT5tbF9kb2MgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZXNjci0+ZF9tZXRob2QtPm1sX2RvYyk7CisgICAgaWYgKGRlc2NyLT5kX21ldGhvZC0+bWxfZG9jID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVzY3ItPmRfbWV0aG9kLT5tbF9kb2MpOwogfQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZGVzY3JfbWVtYmVyc1tdID0gewotCXsiX19vYmpjbGFzc19fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5RGVzY3JPYmplY3QsIGRfdHlwZSksIFJFQURPTkxZfSwKLQl7Il9fbmFtZV9fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5RGVzY3JPYmplY3QsIGRfbmFtZSksIFJFQURPTkxZfSwKLQl7MH0KKyAgICB7Il9fb2JqY2xhc3NfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeURlc2NyT2JqZWN0LCBkX3R5cGUpLCBSRUFET05MWX0sCisgICAgeyJfX25hbWVfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeURlc2NyT2JqZWN0LCBkX25hbWUpLCBSRUFET05MWX0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlHZXRTZXREZWYgbWV0aG9kX2dldHNldFtdID0gewotCXsiX19kb2NfXyIsIChnZXR0ZXIpbWV0aG9kX2dldF9kb2N9LAotCXswfQorICAgIHsiX19kb2NfXyIsIChnZXR0ZXIpbWV0aG9kX2dldF9kb2N9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1lbWJlcl9nZXRfZG9jKFB5TWVtYmVyRGVzY3JPYmplY3QgKmRlc2NyLCB2b2lkICpjbG9zdXJlKQogewotCWlmIChkZXNjci0+ZF9tZW1iZXItPmRvYyA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlc2NyLT5kX21lbWJlci0+ZG9jKTsKKyAgICBpZiAoZGVzY3ItPmRfbWVtYmVyLT5kb2MgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkZXNjci0+ZF9tZW1iZXItPmRvYyk7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBtZW1iZXJfZ2V0c2V0W10gPSB7Ci0JeyJfX2RvY19fIiwgKGdldHRlciltZW1iZXJfZ2V0X2RvY30sCi0JezB9CisgICAgeyJfX2RvY19fIiwgKGdldHRlciltZW1iZXJfZ2V0X2RvY30sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0c2V0X2dldF9kb2MoUHlHZXRTZXREZXNjck9iamVjdCAqZGVzY3IsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaWYgKGRlc2NyLT5kX2dldHNldC0+ZG9jID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZGVzY3ItPmRfZ2V0c2V0LT5kb2MpOworICAgIGlmIChkZXNjci0+ZF9nZXRzZXQtPmRvYyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlc2NyLT5kX2dldHNldC0+ZG9jKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGdldHNldF9nZXRzZXRbXSA9IHsKLQl7Il9fZG9jX18iLCAoZ2V0dGVyKWdldHNldF9nZXRfZG9jfSwKLQl7MH0KKyAgICB7Il9fZG9jX18iLCAoZ2V0dGVyKWdldHNldF9nZXRfZG9jfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwcGVyZGVzY3JfZ2V0X2RvYyhQeVdyYXBwZXJEZXNjck9iamVjdCAqZGVzY3IsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaWYgKGRlc2NyLT5kX2Jhc2UtPmRvYyA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlc2NyLT5kX2Jhc2UtPmRvYyk7CisgICAgaWYgKGRlc2NyLT5kX2Jhc2UtPmRvYyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGRlc2NyLT5kX2Jhc2UtPmRvYyk7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiB3cmFwcGVyZGVzY3JfZ2V0c2V0W10gPSB7Ci0JeyJfX2RvY19fIiwgKGdldHRlcil3cmFwcGVyZGVzY3JfZ2V0X2RvY30sCi0JezB9CisgICAgeyJfX2RvY19fIiwgKGdldHRlcil3cmFwcGVyZGVzY3JfZ2V0X2RvY30sCisgICAgezB9CiB9OwogCiBzdGF0aWMgaW50CiBkZXNjcl90cmF2ZXJzZShQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlEZXNjck9iamVjdCAqZGVzY3IgPSAoUHlEZXNjck9iamVjdCAqKXNlbGY7Ci0JUHlfVklTSVQoZGVzY3ItPmRfdHlwZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlEZXNjck9iamVjdCAqZGVzY3IgPSAoUHlEZXNjck9iamVjdCAqKXNlbGY7CisgICAgUHlfVklTSVQoZGVzY3ItPmRfdHlwZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlNZXRob2REZXNjcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JIm1ldGhvZF9kZXNjcmlwdG9yIiwKLQlzaXplb2YoUHlNZXRob2REZXNjck9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilkZXNjcl9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyltZXRob2RfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkodGVybmFyeWZ1bmMpbWV0aG9kZGVzY3JfY2FsbCwJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCWRlc2NyX3RyYXZlcnNlLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlkZXNjcl9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JbWV0aG9kX2dldHNldCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCShkZXNjcmdldGZ1bmMpbWV0aG9kX2dldCwJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJtZXRob2RfZGVzY3JpcHRvciIsCisgICAgc2l6ZW9mKFB5TWV0aG9kRGVzY3JPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpZGVzY3JfZGVhbGxvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyltZXRob2RfcmVwciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYyltZXRob2RkZXNjcl9jYWxsLCAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIGRlc2NyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZGVzY3JfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgbWV0aG9kX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAoZGVzY3JnZXRmdW5jKW1ldGhvZF9nZXQsICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCiB9OwogCiAvKiBUaGlzIGlzIGZvciBNRVRIX0NMQVNTIGluIEMsIG5vdCBmb3IgImYgPSBjbGFzc21ldGhvZChmKSIgaW4gUHl0aG9uISAqLwogc3RhdGljIFB5VHlwZU9iamVjdCBQeUNsYXNzTWV0aG9kRGVzY3JfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJjbGFzc21ldGhvZF9kZXNjcmlwdG9yIiwKLQlzaXplb2YoUHlNZXRob2REZXNjck9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilkZXNjcl9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyltZXRob2RfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkodGVybmFyeWZ1bmMpY2xhc3NtZXRob2RkZXNjcl9jYWxsLAkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQlkZXNjcl90cmF2ZXJzZSwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JZGVzY3JfbWVtYmVycywJCQkJLyogdHBfbWVtYmVycyAqLwotCW1ldGhvZF9nZXRzZXQsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkoZGVzY3JnZXRmdW5jKWNsYXNzbWV0aG9kX2dldCwJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJjbGFzc21ldGhvZF9kZXNjcmlwdG9yIiwKKyAgICBzaXplb2YoUHlNZXRob2REZXNjck9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilkZXNjcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKW1ldGhvZF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKWNsYXNzbWV0aG9kZGVzY3JfY2FsbCwgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgZGVzY3JfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkZXNjcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBtZXRob2RfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIChkZXNjcmdldGZ1bmMpY2xhc3NtZXRob2RfZ2V0LCAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeU1lbWJlckRlc2NyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkibWVtYmVyX2Rlc2NyaXB0b3IiLAotCXNpemVvZihQeU1lbWJlckRlc2NyT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKWRlc2NyX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKW1lbWJlcl9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQlkZXNjcl90cmF2ZXJzZSwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JZGVzY3JfbWVtYmVycywJCQkJLyogdHBfbWVtYmVycyAqLwotCW1lbWJlcl9nZXRzZXQsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkoZGVzY3JnZXRmdW5jKW1lbWJlcl9nZXQsCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkoZGVzY3JzZXRmdW5jKW1lbWJlcl9zZXQsCQkvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJtZW1iZXJfZGVzY3JpcHRvciIsCisgICAgc2l6ZW9mKFB5TWVtYmVyRGVzY3JPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpZGVzY3JfZGVhbGxvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyltZW1iZXJfcmVwciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIGRlc2NyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZGVzY3JfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgbWVtYmVyX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAoZGVzY3JnZXRmdW5jKW1lbWJlcl9nZXQsICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIChkZXNjcnNldGZ1bmMpbWVtYmVyX3NldCwgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlHZXRTZXREZXNjcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImdldHNldF9kZXNjcmlwdG9yIiwKLQlzaXplb2YoUHlHZXRTZXREZXNjck9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilkZXNjcl9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylnZXRzZXRfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JZGVzY3JfdHJhdmVyc2UsCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCWRlc2NyX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlnZXRzZXRfZ2V0c2V0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JKGRlc2NyZ2V0ZnVuYylnZXRzZXRfZ2V0LAkJLyogdHBfZGVzY3JfZ2V0ICovCi0JKGRlc2Nyc2V0ZnVuYylnZXRzZXRfc2V0LAkJLyogdHBfZGVzY3Jfc2V0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZ2V0c2V0X2Rlc2NyaXB0b3IiLAorICAgIHNpemVvZihQeUdldFNldERlc2NyT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWRlc2NyX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpZ2V0c2V0X3JlcHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBkZXNjcl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGRlc2NyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGdldHNldF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgKGRlc2NyZ2V0ZnVuYylnZXRzZXRfZ2V0LCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAoZGVzY3JzZXRmdW5jKWdldHNldF9zZXQsICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5V3JhcHBlckRlc2NyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkid3JhcHBlcl9kZXNjcmlwdG9yIiwKLQlzaXplb2YoUHlXcmFwcGVyRGVzY3JPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZGVzY3JfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpd3JhcHBlcmRlc2NyX3JlcHIsCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkodGVybmFyeWZ1bmMpd3JhcHBlcmRlc2NyX2NhbGwsCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQlkZXNjcl90cmF2ZXJzZSwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JZGVzY3JfbWVtYmVycywJCQkJLyogdHBfbWVtYmVycyAqLwotCXdyYXBwZXJkZXNjcl9nZXRzZXQsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCShkZXNjcmdldGZ1bmMpd3JhcHBlcmRlc2NyX2dldCwJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJ3cmFwcGVyX2Rlc2NyaXB0b3IiLAorICAgIHNpemVvZihQeVdyYXBwZXJEZXNjck9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilkZXNjcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXdyYXBwZXJkZXNjcl9yZXByLCAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKXdyYXBwZXJkZXNjcl9jYWxsLCAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgZGVzY3JfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBkZXNjcl9tZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICB3cmFwcGVyZGVzY3JfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIChkZXNjcmdldGZ1bmMpd3JhcHBlcmRlc2NyX2dldCwgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KIH07CiAKIHN0YXRpYyBQeURlc2NyT2JqZWN0ICoKIGRlc2NyX25ldyhQeVR5cGVPYmplY3QgKmRlc2NydHlwZSwgUHlUeXBlT2JqZWN0ICp0eXBlLCBjb25zdCBjaGFyICpuYW1lKQogewotCVB5RGVzY3JPYmplY3QgKmRlc2NyOworICAgIFB5RGVzY3JPYmplY3QgKmRlc2NyOwogCi0JZGVzY3IgPSAoUHlEZXNjck9iamVjdCAqKVB5VHlwZV9HZW5lcmljQWxsb2MoZGVzY3J0eXBlLCAwKTsKLQlpZiAoZGVzY3IgIT0gTlVMTCkgewotCQlQeV9YSU5DUkVGKHR5cGUpOwotCQlkZXNjci0+ZF90eXBlID0gdHlwZTsKLQkJZGVzY3ItPmRfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobmFtZSk7Ci0JCWlmIChkZXNjci0+ZF9uYW1lID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihkZXNjcik7Ci0JCQlkZXNjciA9IE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIGRlc2NyOworICAgIGRlc2NyID0gKFB5RGVzY3JPYmplY3QgKilQeVR5cGVfR2VuZXJpY0FsbG9jKGRlc2NydHlwZSwgMCk7CisgICAgaWYgKGRlc2NyICE9IE5VTEwpIHsKKyAgICAgICAgUHlfWElOQ1JFRih0eXBlKTsKKyAgICAgICAgZGVzY3ItPmRfdHlwZSA9IHR5cGU7CisgICAgICAgIGRlc2NyLT5kX25hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKG5hbWUpOworICAgICAgICBpZiAoZGVzY3ItPmRfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgICAgICAgICAgZGVzY3IgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXNjcjsKIH0KIAogUHlPYmplY3QgKgogUHlEZXNjcl9OZXdNZXRob2QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU1ldGhvZERlZiAqbWV0aG9kKQogewotCVB5TWV0aG9kRGVzY3JPYmplY3QgKmRlc2NyOworICAgIFB5TWV0aG9kRGVzY3JPYmplY3QgKmRlc2NyOwogCi0JZGVzY3IgPSAoUHlNZXRob2REZXNjck9iamVjdCAqKWRlc2NyX25ldygmUHlNZXRob2REZXNjcl9UeXBlLAotCQkJCQkJIHR5cGUsIG1ldGhvZC0+bWxfbmFtZSk7Ci0JaWYgKGRlc2NyICE9IE5VTEwpCi0JCWRlc2NyLT5kX21ldGhvZCA9IG1ldGhvZDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZGVzY3I7CisgICAgZGVzY3IgPSAoUHlNZXRob2REZXNjck9iamVjdCAqKWRlc2NyX25ldygmUHlNZXRob2REZXNjcl9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbWV0aG9kLT5tbF9uYW1lKTsKKyAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgZGVzY3ItPmRfbWV0aG9kID0gbWV0aG9kOworICAgIHJldHVybiAoUHlPYmplY3QgKilkZXNjcjsKIH0KIAogUHlPYmplY3QgKgogUHlEZXNjcl9OZXdDbGFzc01ldGhvZChQeVR5cGVPYmplY3QgKnR5cGUsIFB5TWV0aG9kRGVmICptZXRob2QpCiB7Ci0JUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3I7CisgICAgUHlNZXRob2REZXNjck9iamVjdCAqZGVzY3I7CiAKLQlkZXNjciA9IChQeU1ldGhvZERlc2NyT2JqZWN0ICopZGVzY3JfbmV3KCZQeUNsYXNzTWV0aG9kRGVzY3JfVHlwZSwKLQkJCQkJCSB0eXBlLCBtZXRob2QtPm1sX25hbWUpOwotCWlmIChkZXNjciAhPSBOVUxMKQotCQlkZXNjci0+ZF9tZXRob2QgPSBtZXRob2Q7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWRlc2NyOworICAgIGRlc2NyID0gKFB5TWV0aG9kRGVzY3JPYmplY3QgKilkZXNjcl9uZXcoJlB5Q2xhc3NNZXRob2REZXNjcl9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbWV0aG9kLT5tbF9uYW1lKTsKKyAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgZGVzY3ItPmRfbWV0aG9kID0gbWV0aG9kOworICAgIHJldHVybiAoUHlPYmplY3QgKilkZXNjcjsKIH0KIAogUHlPYmplY3QgKgogUHlEZXNjcl9OZXdNZW1iZXIoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU1lbWJlckRlZiAqbWVtYmVyKQogewotCVB5TWVtYmVyRGVzY3JPYmplY3QgKmRlc2NyOworICAgIFB5TWVtYmVyRGVzY3JPYmplY3QgKmRlc2NyOwogCi0JZGVzY3IgPSAoUHlNZW1iZXJEZXNjck9iamVjdCAqKWRlc2NyX25ldygmUHlNZW1iZXJEZXNjcl9UeXBlLAotCQkJCQkJIHR5cGUsIG1lbWJlci0+bmFtZSk7Ci0JaWYgKGRlc2NyICE9IE5VTEwpCi0JCWRlc2NyLT5kX21lbWJlciA9IG1lbWJlcjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZGVzY3I7CisgICAgZGVzY3IgPSAoUHlNZW1iZXJEZXNjck9iamVjdCAqKWRlc2NyX25ldygmUHlNZW1iZXJEZXNjcl9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbWVtYmVyLT5uYW1lKTsKKyAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgZGVzY3ItPmRfbWVtYmVyID0gbWVtYmVyOworICAgIHJldHVybiAoUHlPYmplY3QgKilkZXNjcjsKIH0KIAogUHlPYmplY3QgKgogUHlEZXNjcl9OZXdHZXRTZXQoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeUdldFNldERlZiAqZ2V0c2V0KQogewotCVB5R2V0U2V0RGVzY3JPYmplY3QgKmRlc2NyOworICAgIFB5R2V0U2V0RGVzY3JPYmplY3QgKmRlc2NyOwogCi0JZGVzY3IgPSAoUHlHZXRTZXREZXNjck9iamVjdCAqKWRlc2NyX25ldygmUHlHZXRTZXREZXNjcl9UeXBlLAotCQkJCQkJIHR5cGUsIGdldHNldC0+bmFtZSk7Ci0JaWYgKGRlc2NyICE9IE5VTEwpCi0JCWRlc2NyLT5kX2dldHNldCA9IGdldHNldDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZGVzY3I7CisgICAgZGVzY3IgPSAoUHlHZXRTZXREZXNjck9iamVjdCAqKWRlc2NyX25ldygmUHlHZXRTZXREZXNjcl9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgZ2V0c2V0LT5uYW1lKTsKKyAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgZGVzY3ItPmRfZ2V0c2V0ID0gZ2V0c2V0OworICAgIHJldHVybiAoUHlPYmplY3QgKilkZXNjcjsKIH0KIAogUHlPYmplY3QgKgogUHlEZXNjcl9OZXdXcmFwcGVyKFB5VHlwZU9iamVjdCAqdHlwZSwgc3RydWN0IHdyYXBwZXJiYXNlICpiYXNlLCB2b2lkICp3cmFwcGVkKQogewotCVB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjcjsKKyAgICBQeVdyYXBwZXJEZXNjck9iamVjdCAqZGVzY3I7CiAKLQlkZXNjciA9IChQeVdyYXBwZXJEZXNjck9iamVjdCAqKWRlc2NyX25ldygmUHlXcmFwcGVyRGVzY3JfVHlwZSwKLQkJCQkJCSB0eXBlLCBiYXNlLT5uYW1lKTsKLQlpZiAoZGVzY3IgIT0gTlVMTCkgewotCQlkZXNjci0+ZF9iYXNlID0gYmFzZTsKLQkJZGVzY3ItPmRfd3JhcHBlZCA9IHdyYXBwZWQ7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilkZXNjcjsKKyAgICBkZXNjciA9IChQeVdyYXBwZXJEZXNjck9iamVjdCAqKWRlc2NyX25ldygmUHlXcmFwcGVyRGVzY3JfVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIGJhc2UtPm5hbWUpOworICAgIGlmIChkZXNjciAhPSBOVUxMKSB7CisgICAgICAgIGRlc2NyLT5kX2Jhc2UgPSBiYXNlOworICAgICAgICBkZXNjci0+ZF93cmFwcGVkID0gd3JhcHBlZDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlc2NyOwogfQogCiAKQEAgLTY1NCwyMjEgKzY1NCwyMjEgQEAKICAgIGJpdCBvZiBhIHBhaW4gKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmRpY3Q7CiB9IHByb3h5b2JqZWN0OwogCiBzdGF0aWMgUHlfc3NpemVfdAogcHJveHlfbGVuKHByb3h5b2JqZWN0ICpwcCkKIHsKLQlyZXR1cm4gUHlPYmplY3RfU2l6ZShwcC0+ZGljdCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X1NpemUocHAtPmRpY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfZ2V0aXRlbShwcm94eW9iamVjdCAqcHAsIFB5T2JqZWN0ICprZXkpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0dldEl0ZW0ocHAtPmRpY3QsIGtleSk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0dldEl0ZW0ocHAtPmRpY3QsIGtleSk7CiB9CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIHByb3h5X2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpcHJveHlfbGVuLAkJCS8qIG1wX2xlbmd0aCAqLwotCShiaW5hcnlmdW5jKXByb3h5X2dldGl0ZW0sCQkvKiBtcF9zdWJzY3JpcHQgKi8KLQkwLAkJCQkJLyogbXBfYXNzX3N1YnNjcmlwdCAqLworICAgIChsZW5mdW5jKXByb3h5X2xlbiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogbXBfbGVuZ3RoICovCisgICAgKGJpbmFyeWZ1bmMpcHJveHlfZ2V0aXRlbSwgICAgICAgICAgICAgICAgICAvKiBtcF9zdWJzY3JpcHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1wX2Fzc19zdWJzY3JpcHQgKi8KIH07CiAKIHN0YXRpYyBpbnQKIHByb3h5X2NvbnRhaW5zKHByb3h5b2JqZWN0ICpwcCwgUHlPYmplY3QgKmtleSkKIHsKLQlyZXR1cm4gUHlEaWN0X0NvbnRhaW5zKHBwLT5kaWN0LCBrZXkpOworICAgIHJldHVybiBQeURpY3RfQ29udGFpbnMocHAtPmRpY3QsIGtleSk7CiB9CiAKIHN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBwcm94eV9hc19zZXF1ZW5jZSA9IHsKLQkwLAkJCQkJLyogc3FfbGVuZ3RoICovCi0JMCwJCQkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJCQkvKiBzcV9yZXBlYXQgKi8KLQkwLAkJCQkJLyogc3FfaXRlbSAqLwotCTAsCQkJCQkvKiBzcV9zbGljZSAqLwotCTAsCQkJCQkvKiBzcV9hc3NfaXRlbSAqLwotCTAsCQkJCQkvKiBzcV9hc3Nfc2xpY2UgKi8KLQkob2Jqb2JqcHJvYylwcm94eV9jb250YWlucywJCS8qIHNxX2NvbnRhaW5zICovCi0JMCwJCQkJCS8qIHNxX2lucGxhY2VfY29uY2F0ICovCi0JMCwJCQkJCS8qIHNxX2lucGxhY2VfcmVwZWF0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9zbGljZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19zbGljZSAqLworICAgIChvYmpvYmpwcm9jKXByb3h5X2NvbnRhaW5zLCAgICAgICAgICAgICAgICAgLyogc3FfY29udGFpbnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9pbnBsYWNlX3JlcGVhdCAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X2hhc19rZXkocHJveHlvYmplY3QgKnBwLCBQeU9iamVjdCAqa2V5KQogewotCWludCByZXMgPSBQeURpY3RfQ29udGFpbnMocHAtPmRpY3QsIGtleSk7Ci0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzKTsKKyAgICBpbnQgcmVzID0gUHlEaWN0X0NvbnRhaW5zKHBwLT5kaWN0LCBrZXkpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9nZXQocHJveHlvYmplY3QgKnBwLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqa2V5LCAqZGVmID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqa2V5LCAqZGVmID0gUHlfTm9uZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImdldCIsIDEsIDIsICZrZXksICZkZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcC0+ZGljdCwgImdldCIsICIoT08pIiwga2V5LCBkZWYpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImdldCIsIDEsIDIsICZrZXksICZkZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcC0+ZGljdCwgImdldCIsICIoT08pIiwga2V5LCBkZWYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfa2V5cyhwcm94eW9iamVjdCAqcHApCiB7Ci0JcmV0dXJuIFB5TWFwcGluZ19LZXlzKHBwLT5kaWN0KTsKKyAgICByZXR1cm4gUHlNYXBwaW5nX0tleXMocHAtPmRpY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfdmFsdWVzKHByb3h5b2JqZWN0ICpwcCkKIHsKLQlyZXR1cm4gUHlNYXBwaW5nX1ZhbHVlcyhwcC0+ZGljdCk7CisgICAgcmV0dXJuIFB5TWFwcGluZ19WYWx1ZXMocHAtPmRpY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfaXRlbXMocHJveHlvYmplY3QgKnBwKQogewotCXJldHVybiBQeU1hcHBpbmdfSXRlbXMocHAtPmRpY3QpOworICAgIHJldHVybiBQeU1hcHBpbmdfSXRlbXMocHAtPmRpY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfaXRlcmtleXMocHJveHlvYmplY3QgKnBwKQogewotCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHBwLT5kaWN0LCAiaXRlcmtleXMiLCBOVUxMKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcC0+ZGljdCwgIml0ZXJrZXlzIiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9pdGVydmFsdWVzKHByb3h5b2JqZWN0ICpwcCkKIHsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcC0+ZGljdCwgIml0ZXJ2YWx1ZXMiLCBOVUxMKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcC0+ZGljdCwgIml0ZXJ2YWx1ZXMiLCBOVUxMKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X2l0ZXJpdGVtcyhwcm94eW9iamVjdCAqcHApCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHAtPmRpY3QsICJpdGVyaXRlbXMiLCBOVUxMKTsKKyAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcC0+ZGljdCwgIml0ZXJpdGVtcyIsIE5VTEwpOwogfQogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X2NvcHkocHJveHlvYmplY3QgKnBwKQogewotCXJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHBwLT5kaWN0LCAiY29weSIsIE5VTEwpOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHBwLT5kaWN0LCAiY29weSIsIE5VTEwpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgcHJveHlfbWV0aG9kc1tdID0gewotCXsiaGFzX2tleSIsICAgKFB5Q0Z1bmN0aW9uKXByb3h5X2hhc19rZXksICAgIE1FVEhfTywKLQkgUHlEb2NfU1RSKCJELmhhc19rZXkoaykgLT4gVHJ1ZSBpZiBEIGhhcyBhIGtleSBrLCBlbHNlIEZhbHNlIil9LAotCXsiZ2V0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKXByb3h5X2dldCwgICAgICAgIE1FVEhfVkFSQVJHUywKLQkgUHlEb2NfU1RSKCJELmdldChrWyxkXSkgLT4gRFtrXSBpZiBELmhhc19rZXkoayksIGVsc2UgZC4iCi0JIAkJCQkiICBkIGRlZmF1bHRzIHRvIE5vbmUuIil9LAotCXsia2V5cyIsICAgICAgKFB5Q0Z1bmN0aW9uKXByb3h5X2tleXMsICAgICAgIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIkQua2V5cygpIC0+IGxpc3Qgb2YgRCdzIGtleXMiKX0sCi0JeyJ2YWx1ZXMiLCAgICAoUHlDRnVuY3Rpb24pcHJveHlfdmFsdWVzLCAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiRC52YWx1ZXMoKSAtPiBsaXN0IG9mIEQncyB2YWx1ZXMiKX0sCi0JeyJpdGVtcyIsICAgICAoUHlDRnVuY3Rpb24pcHJveHlfaXRlbXMsICAgICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiRC5pdGVtcygpIC0+IGxpc3Qgb2YgRCdzIChrZXksIHZhbHVlKSBwYWlycywgYXMgMi10dXBsZXMiKX0sCi0JeyJpdGVya2V5cyIsICAoUHlDRnVuY3Rpb24pcHJveHlfaXRlcmtleXMsICAgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiRC5pdGVya2V5cygpIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgRCIpfSwKLQl7Iml0ZXJ2YWx1ZXMiLChQeUNGdW5jdGlvbilwcm94eV9pdGVydmFsdWVzLCBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJELml0ZXJ2YWx1ZXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgRCIpfSwKLQl7Iml0ZXJpdGVtcyIsIChQeUNGdW5jdGlvbilwcm94eV9pdGVyaXRlbXMsICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJELml0ZXJpdGVtcygpIC0+IgotCSAJICAgIiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgaXRlbXMgb2YgRCIpfSwKLQl7ImNvcHkiLCAgICAgIChQeUNGdW5jdGlvbilwcm94eV9jb3B5LCAgICAgICBNRVRIX05PQVJHUywKLQkgUHlEb2NfU1RSKCJELmNvcHkoKSAtPiBhIHNoYWxsb3cgY29weSBvZiBEIil9LAotCXswfQorICAgIHsiaGFzX2tleSIsICAgKFB5Q0Z1bmN0aW9uKXByb3h5X2hhc19rZXksICAgIE1FVEhfTywKKyAgICAgUHlEb2NfU1RSKCJELmhhc19rZXkoaykgLT4gVHJ1ZSBpZiBEIGhhcyBhIGtleSBrLCBlbHNlIEZhbHNlIil9LAorICAgIHsiZ2V0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKXByb3h5X2dldCwgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgUHlEb2NfU1RSKCJELmdldChrWyxkXSkgLT4gRFtrXSBpZiBELmhhc19rZXkoayksIGVsc2UgZC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBkIGRlZmF1bHRzIHRvIE5vbmUuIil9LAorICAgIHsia2V5cyIsICAgICAgKFB5Q0Z1bmN0aW9uKXByb3h5X2tleXMsICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoIkQua2V5cygpIC0+IGxpc3Qgb2YgRCdzIGtleXMiKX0sCisgICAgeyJ2YWx1ZXMiLCAgICAoUHlDRnVuY3Rpb24pcHJveHlfdmFsdWVzLCAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiRC52YWx1ZXMoKSAtPiBsaXN0IG9mIEQncyB2YWx1ZXMiKX0sCisgICAgeyJpdGVtcyIsICAgICAoUHlDRnVuY3Rpb24pcHJveHlfaXRlbXMsICAgICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiRC5pdGVtcygpIC0+IGxpc3Qgb2YgRCdzIChrZXksIHZhbHVlKSBwYWlycywgYXMgMi10dXBsZXMiKX0sCisgICAgeyJpdGVya2V5cyIsICAoUHlDRnVuY3Rpb24pcHJveHlfaXRlcmtleXMsICAgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigiRC5pdGVya2V5cygpIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgRCIpfSwKKyAgICB7Iml0ZXJ2YWx1ZXMiLChQeUNGdW5jdGlvbilwcm94eV9pdGVydmFsdWVzLCBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJELml0ZXJ2YWx1ZXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgRCIpfSwKKyAgICB7Iml0ZXJpdGVtcyIsIChQeUNGdW5jdGlvbilwcm94eV9pdGVyaXRlbXMsICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJELml0ZXJpdGVtcygpIC0+IgorICAgICAgICAgICAgICAgIiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgaXRlbXMgb2YgRCIpfSwKKyAgICB7ImNvcHkiLCAgICAgIChQeUNGdW5jdGlvbilwcm94eV9jb3B5LCAgICAgICBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJELmNvcHkoKSAtPiBhIHNoYWxsb3cgY29weSBvZiBEIil9LAorICAgIHswfQogfTsKIAogc3RhdGljIHZvaWQKIHByb3h5X2RlYWxsb2MocHJveHlvYmplY3QgKnBwKQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKHBwKTsKLQlQeV9ERUNSRUYocHAtPmRpY3QpOwotCVB5T2JqZWN0X0dDX0RlbChwcCk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0socHApOworICAgIFB5X0RFQ1JFRihwcC0+ZGljdCk7CisgICAgUHlPYmplY3RfR0NfRGVsKHBwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3h5X2dldGl0ZXIocHJveHlvYmplY3QgKnBwKQogewotCXJldHVybiBQeU9iamVjdF9HZXRJdGVyKHBwLT5kaWN0KTsKKyAgICByZXR1cm4gUHlPYmplY3RfR2V0SXRlcihwcC0+ZGljdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm94eV9zdHIocHJveHlvYmplY3QgKnBwKQogewotCXJldHVybiBQeU9iamVjdF9TdHIocHAtPmRpY3QpOworICAgIHJldHVybiBQeU9iamVjdF9TdHIocHAtPmRpY3QpOwogfQogCiBzdGF0aWMgaW50CiBwcm94eV90cmF2ZXJzZShQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JcHJveHlvYmplY3QgKnBwID0gKHByb3h5b2JqZWN0ICopc2VsZjsKLQlQeV9WSVNJVChwcC0+ZGljdCk7Ci0JcmV0dXJuIDA7CisgICAgcHJveHlvYmplY3QgKnBwID0gKHByb3h5b2JqZWN0ICopc2VsZjsKKyAgICBQeV9WSVNJVChwcC0+ZGljdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHByb3h5X2NvbXBhcmUocHJveHlvYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCXJldHVybiBQeU9iamVjdF9Db21wYXJlKHYtPmRpY3QsIHcpOworICAgIHJldHVybiBQeU9iamVjdF9Db21wYXJlKHYtPmRpY3QsIHcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJveHlfcmljaGNvbXBhcmUocHJveHlvYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKHYtPmRpY3QsIHcsIG9wKTsKKyAgICByZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUodi0+ZGljdCwgdywgb3ApOwogfQogCiBQeVR5cGVPYmplY3QgUHlEaWN0UHJveHlfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJkaWN0cHJveHkiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHByb3h5b2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpcHJveHlfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKXByb3h5X2NvbXBhcmUsCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZwcm94eV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZwcm94eV9hc19tYXBwaW5nLAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JKHJlcHJmdW5jKXByb3h5X3N0ciwJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotCXByb3h5X3RyYXZlcnNlLAkJCQkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkocmljaGNtcGZ1bmMpcHJveHlfcmljaGNvbXBhcmUsCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylwcm94eV9nZXRpdGVyLAkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXByb3h5X21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJkaWN0cHJveHkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihwcm94eW9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilwcm94eV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpcHJveHlfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmcHJveHlfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJnByb3h5X2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgKHJlcHJmdW5jKXByb3h5X3N0ciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgcHJveHlfdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAocmljaGNtcGZ1bmMpcHJveHlfcmljaGNvbXBhcmUsICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylwcm94eV9nZXRpdGVyLCAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBwcm94eV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KIH07CiAKIFB5T2JqZWN0ICoKIFB5RGljdFByb3h5X05ldyhQeU9iamVjdCAqZGljdCkKIHsKLQlwcm94eW9iamVjdCAqcHA7CisgICAgcHJveHlvYmplY3QgKnBwOwogCi0JcHAgPSBQeU9iamVjdF9HQ19OZXcocHJveHlvYmplY3QsICZQeURpY3RQcm94eV9UeXBlKTsKLQlpZiAocHAgIT0gTlVMTCkgewotCQlQeV9JTkNSRUYoZGljdCk7Ci0JCXBwLT5kaWN0ID0gZGljdDsKLQkJX1B5T2JqZWN0X0dDX1RSQUNLKHBwKTsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXBwOworICAgIHBwID0gUHlPYmplY3RfR0NfTmV3KHByb3h5b2JqZWN0LCAmUHlEaWN0UHJveHlfVHlwZSk7CisgICAgaWYgKHBwICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRpY3QpOworICAgICAgICBwcC0+ZGljdCA9IGRpY3Q7CisgICAgICAgIF9QeU9iamVjdF9HQ19UUkFDSyhwcCk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilwcDsKIH0KIAogCkBAIC04NzgsMTg1ICs4NzgsMTg1IEBACiAgICBiaXQgb2YgYSBwYWluICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyOwotCVB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeVdyYXBwZXJEZXNjck9iamVjdCAqZGVzY3I7CisgICAgUHlPYmplY3QgKnNlbGY7CiB9IHdyYXBwZXJvYmplY3Q7CiAKIHN0YXRpYyB2b2lkCiB3cmFwcGVyX2RlYWxsb2Mod3JhcHBlcm9iamVjdCAqd3ApCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayh3cCk7Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTih3cCkKLQlQeV9YREVDUkVGKHdwLT5kZXNjcik7Ci0JUHlfWERFQ1JFRih3cC0+c2VsZik7Ci0JUHlPYmplY3RfR0NfRGVsKHdwKTsKLQlQeV9UUkFTSENBTl9TQUZFX0VORCh3cCkKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHdwKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHdwKQorICAgIFB5X1hERUNSRUYod3AtPmRlc2NyKTsKKyAgICBQeV9YREVDUkVGKHdwLT5zZWxmKTsKKyAgICBQeU9iamVjdF9HQ19EZWwod3ApOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKHdwKQogfQogCiBzdGF0aWMgaW50CiB3cmFwcGVyX2NvbXBhcmUod3JhcHBlcm9iamVjdCAqYSwgd3JhcHBlcm9iamVjdCAqYikKIHsKLQlpZiAoYS0+ZGVzY3IgPT0gYi0+ZGVzY3IpCi0JCXJldHVybiBQeU9iamVjdF9Db21wYXJlKGEtPnNlbGYsIGItPnNlbGYpOwotCWVsc2UKLQkJcmV0dXJuIChhLT5kZXNjciA8IGItPmRlc2NyKSA/IC0xIDogMTsKKyAgICBpZiAoYS0+ZGVzY3IgPT0gYi0+ZGVzY3IpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9Db21wYXJlKGEtPnNlbGYsIGItPnNlbGYpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIChhLT5kZXNjciA8IGItPmRlc2NyKSA/IC0xIDogMTsKIH0KIAogc3RhdGljIGxvbmcKIHdyYXBwZXJfaGFzaCh3cmFwcGVyb2JqZWN0ICp3cCkKIHsKLQlpbnQgeCwgeTsKLQl4ID0gX1B5X0hhc2hQb2ludGVyKHdwLT5kZXNjcik7Ci0JaWYgKHggPT0gLTEpCi0JCXJldHVybiAtMTsKLQl5ID0gUHlPYmplY3RfSGFzaCh3cC0+c2VsZik7Ci0JaWYgKHkgPT0gLTEpCi0JCXJldHVybiAtMTsKLQl4ID0geCBeIHk7Ci0JaWYgKHggPT0gLTEpCi0JCXggPSAtMjsKLQlyZXR1cm4geDsKKyAgICBpbnQgeCwgeTsKKyAgICB4ID0gX1B5X0hhc2hQb2ludGVyKHdwLT5kZXNjcik7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB5ID0gUHlPYmplY3RfSGFzaCh3cC0+c2VsZik7CisgICAgaWYgKHkgPT0gLTEpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB4ID0geCBeIHk7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBwZXJfcmVwcih3cmFwcGVyb2JqZWN0ICp3cCkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPG1ldGhvZC13cmFwcGVyICclcycgb2YgJXMgb2JqZWN0IGF0ICVwPiIsCi0JCQkJICAgd3AtPmRlc2NyLT5kX2Jhc2UtPm5hbWUsCi0JCQkJICAgd3AtPnNlbGYtPm9iX3R5cGUtPnRwX25hbWUsCi0JCQkJICAgd3AtPnNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8bWV0aG9kLXdyYXBwZXIgJyVzJyBvZiAlcyBvYmplY3QgYXQgJXA+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cC0+ZGVzY3ItPmRfYmFzZS0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cC0+c2VsZi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cC0+c2VsZik7CiB9CiAKIHN0YXRpYyBQeU1lbWJlckRlZiB3cmFwcGVyX21lbWJlcnNbXSA9IHsKLQl7Il9fc2VsZl9fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHdyYXBwZXJvYmplY3QsIHNlbGYpLCBSRUFET05MWX0sCi0JezB9CisgICAgeyJfX3NlbGZfXyIsIFRfT0JKRUNULCBvZmZzZXRvZih3cmFwcGVyb2JqZWN0LCBzZWxmKSwgUkVBRE9OTFl9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBwZXJfb2JqY2xhc3Mod3JhcHBlcm9iamVjdCAqd3ApCiB7Ci0JUHlPYmplY3QgKmMgPSAoUHlPYmplY3QgKil3cC0+ZGVzY3ItPmRfdHlwZTsKKyAgICBQeU9iamVjdCAqYyA9IChQeU9iamVjdCAqKXdwLT5kZXNjci0+ZF90eXBlOwogCi0JUHlfSU5DUkVGKGMpOwotCXJldHVybiBjOworICAgIFB5X0lOQ1JFRihjKTsKKyAgICByZXR1cm4gYzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBwZXJfbmFtZSh3cmFwcGVyb2JqZWN0ICp3cCkKIHsKLQljaGFyICpzID0gd3AtPmRlc2NyLT5kX2Jhc2UtPm5hbWU7CisgICAgY2hhciAqcyA9IHdwLT5kZXNjci0+ZF9iYXNlLT5uYW1lOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwcGVyX2RvYyh3cmFwcGVyb2JqZWN0ICp3cCkKIHsKLQljaGFyICpzID0gd3AtPmRlc2NyLT5kX2Jhc2UtPmRvYzsKKyAgICBjaGFyICpzID0gd3AtPmRlc2NyLT5kX2Jhc2UtPmRvYzsKIAotCWlmIChzID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOwotCX0KKyAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiB3cmFwcGVyX2dldHNldHNbXSA9IHsKLQl7Il9fb2JqY2xhc3NfXyIsIChnZXR0ZXIpd3JhcHBlcl9vYmpjbGFzc30sCi0JeyJfX25hbWVfXyIsIChnZXR0ZXIpd3JhcHBlcl9uYW1lfSwKLQl7Il9fZG9jX18iLCAoZ2V0dGVyKXdyYXBwZXJfZG9jfSwKLQl7MH0KKyAgICB7Il9fb2JqY2xhc3NfXyIsIChnZXR0ZXIpd3JhcHBlcl9vYmpjbGFzc30sCisgICAgeyJfX25hbWVfXyIsIChnZXR0ZXIpd3JhcHBlcl9uYW1lfSwKKyAgICB7Il9fZG9jX18iLCAoZ2V0dGVyKXdyYXBwZXJfZG9jfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwcGVyX2NhbGwod3JhcHBlcm9iamVjdCAqd3AsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQl3cmFwcGVyZnVuYyB3cmFwcGVyID0gd3AtPmRlc2NyLT5kX2Jhc2UtPndyYXBwZXI7Ci0JUHlPYmplY3QgKnNlbGYgPSB3cC0+c2VsZjsKKyAgICB3cmFwcGVyZnVuYyB3cmFwcGVyID0gd3AtPmRlc2NyLT5kX2Jhc2UtPndyYXBwZXI7CisgICAgUHlPYmplY3QgKnNlbGYgPSB3cC0+c2VsZjsKIAotCWlmICh3cC0+ZGVzY3ItPmRfYmFzZS0+ZmxhZ3MgJiBQeVdyYXBwZXJGbGFnX0tFWVdPUkRTKSB7Ci0JCXdyYXBwZXJmdW5jX2t3ZHMgd2sgPSAod3JhcHBlcmZ1bmNfa3dkcyl3cmFwcGVyOwotCQlyZXR1cm4gKCp3aykoc2VsZiwgYXJncywgd3AtPmRlc2NyLT5kX3dyYXBwZWQsIGt3ZHMpOwotCX0KKyAgICBpZiAod3AtPmRlc2NyLT5kX2Jhc2UtPmZsYWdzICYgUHlXcmFwcGVyRmxhZ19LRVlXT1JEUykgeworICAgICAgICB3cmFwcGVyZnVuY19rd2RzIHdrID0gKHdyYXBwZXJmdW5jX2t3ZHMpd3JhcHBlcjsKKyAgICAgICAgcmV0dXJuICgqd2spKHNlbGYsIGFyZ3MsIHdwLT5kZXNjci0+ZF93cmFwcGVkLCBrd2RzKTsKKyAgICB9CiAKLQlpZiAoa3dkcyAhPSBOVUxMICYmICghUHlEaWN0X0NoZWNrKGt3ZHMpIHx8IFB5RGljdF9TaXplKGt3ZHMpICE9IDApKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJ3cmFwcGVyICVzIGRvZXNuJ3QgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyIsCi0JCQkgICAgIHdwLT5kZXNjci0+ZF9iYXNlLT5uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKndyYXBwZXIpKHNlbGYsIGFyZ3MsIHdwLT5kZXNjci0+ZF93cmFwcGVkKTsKKyAgICBpZiAoa3dkcyAhPSBOVUxMICYmICghUHlEaWN0X0NoZWNrKGt3ZHMpIHx8IFB5RGljdF9TaXplKGt3ZHMpICE9IDApKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAid3JhcHBlciAlcyBkb2Vzbid0IHRha2Uga2V5d29yZCBhcmd1bWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgd3AtPmRlc2NyLT5kX2Jhc2UtPm5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgqd3JhcHBlcikoc2VsZiwgYXJncywgd3AtPmRlc2NyLT5kX3dyYXBwZWQpOwogfQogCiBzdGF0aWMgaW50CiB3cmFwcGVyX3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQl3cmFwcGVyb2JqZWN0ICp3cCA9ICh3cmFwcGVyb2JqZWN0ICopc2VsZjsKLQlQeV9WSVNJVCh3cC0+ZGVzY3IpOwotCVB5X1ZJU0lUKHdwLT5zZWxmKTsKLQlyZXR1cm4gMDsKKyAgICB3cmFwcGVyb2JqZWN0ICp3cCA9ICh3cmFwcGVyb2JqZWN0ICopc2VsZjsKKyAgICBQeV9WSVNJVCh3cC0+ZGVzY3IpOworICAgIFB5X1ZJU0lUKHdwLT5zZWxmKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCB3cmFwcGVydHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJtZXRob2Qtd3JhcHBlciIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZih3cmFwcGVyb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3Ipd3JhcHBlcl9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpd3JhcHBlcl9jb21wYXJlLAkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyl3cmFwcGVyX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJICAgICAgIAkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpd3JhcHBlcl9oYXNoLAkJCS8qIHRwX2hhc2ggKi8KLQkodGVybmFyeWZ1bmMpd3JhcHBlcl9jYWxsLAkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotCXdyYXBwZXJfdHJhdmVyc2UsCQkJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCXdyYXBwZXJfbWVtYmVycywJCQkvKiB0cF9tZW1iZXJzICovCi0Jd3JhcHBlcl9nZXRzZXRzLAkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgIm1ldGhvZC13cmFwcGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHdyYXBwZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXdyYXBwZXJfZGVhbGxvYywgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYyl3cmFwcGVyX2NvbXBhcmUsICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpd3JhcHBlcl9yZXByLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpd3JhcHBlcl9oYXNoLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAodGVybmFyeWZ1bmMpd3JhcHBlcl9jYWxsLCAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICB3cmFwcGVyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHdyYXBwZXJfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIHdyYXBwZXJfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwogfTsKIAogUHlPYmplY3QgKgogUHlXcmFwcGVyX05ldyhQeU9iamVjdCAqZCwgUHlPYmplY3QgKnNlbGYpCiB7Ci0Jd3JhcHBlcm9iamVjdCAqd3A7Ci0JUHlXcmFwcGVyRGVzY3JPYmplY3QgKmRlc2NyOworICAgIHdyYXBwZXJvYmplY3QgKndwOworICAgIFB5V3JhcHBlckRlc2NyT2JqZWN0ICpkZXNjcjsKIAotCWFzc2VydChQeU9iamVjdF9UeXBlQ2hlY2soZCwgJlB5V3JhcHBlckRlc2NyX1R5cGUpKTsKLQlkZXNjciA9IChQeVdyYXBwZXJEZXNjck9iamVjdCAqKWQ7Ci0JYXNzZXJ0KFB5T2JqZWN0X0lzSW5zdGFuY2Uoc2VsZiwgKFB5T2JqZWN0ICopKGRlc2NyLT5kX3R5cGUpKSk7CisgICAgYXNzZXJ0KFB5T2JqZWN0X1R5cGVDaGVjayhkLCAmUHlXcmFwcGVyRGVzY3JfVHlwZSkpOworICAgIGRlc2NyID0gKFB5V3JhcHBlckRlc2NyT2JqZWN0ICopZDsKKyAgICBhc3NlcnQoUHlPYmplY3RfSXNJbnN0YW5jZShzZWxmLCAoUHlPYmplY3QgKikoZGVzY3ItPmRfdHlwZSkpKTsKIAotCXdwID0gUHlPYmplY3RfR0NfTmV3KHdyYXBwZXJvYmplY3QsICZ3cmFwcGVydHlwZSk7Ci0JaWYgKHdwICE9IE5VTEwpIHsKLQkJUHlfSU5DUkVGKGRlc2NyKTsKLQkJd3AtPmRlc2NyID0gZGVzY3I7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJd3AtPnNlbGYgPSBzZWxmOwotCQlfUHlPYmplY3RfR0NfVFJBQ0sod3ApOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopd3A7CisgICAgd3AgPSBQeU9iamVjdF9HQ19OZXcod3JhcHBlcm9iamVjdCwgJndyYXBwZXJ0eXBlKTsKKyAgICBpZiAod3AgIT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoZGVzY3IpOworICAgICAgICB3cC0+ZGVzY3IgPSBkZXNjcjsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICB3cC0+c2VsZiA9IHNlbGY7CisgICAgICAgIF9QeU9iamVjdF9HQ19UUkFDSyh3cCk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKil3cDsKIH0KIAogCkBAIC0xMDY1LDI0NCArMTA2NSwyNDQgQEAKIC8qCiAgICAgY2xhc3MgcHJvcGVydHkob2JqZWN0KToKIAotICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZmdldD1Ob25lLCBmc2V0PU5vbmUsIGZkZWw9Tm9uZSwgZG9jPU5vbmUpOgotICAgICAgICAgICAgaWYgZG9jIGlzIE5vbmUgYW5kIGZnZXQgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIoZmdldCwgIl9fZG9jX18iKToKLSAgICAgICAgICAgICAgICBkb2MgPSBmZ2V0Ll9fZG9jX18KLSAgICAgICAgICAgIHNlbGYuX19nZXQgPSBmZ2V0Ci0gICAgICAgICAgICBzZWxmLl9fc2V0ID0gZnNldAotICAgICAgICAgICAgc2VsZi5fX2RlbCA9IGZkZWwKLSAgICAgICAgICAgIHNlbGYuX19kb2NfXyA9IGRvYworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmZ2V0PU5vbmUsIGZzZXQ9Tm9uZSwgZmRlbD1Ob25lLCBkb2M9Tm9uZSk6CisgICAgICAgIGlmIGRvYyBpcyBOb25lIGFuZCBmZ2V0IGlzIG5vdCBOb25lIGFuZCBoYXNhdHRyKGZnZXQsICJfX2RvY19fIik6CisgICAgICAgIGRvYyA9IGZnZXQuX19kb2NfXworICAgICAgICBzZWxmLl9fZ2V0ID0gZmdldAorICAgICAgICBzZWxmLl9fc2V0ID0gZnNldAorICAgICAgICBzZWxmLl9fZGVsID0gZmRlbAorICAgICAgICBzZWxmLl9fZG9jX18gPSBkb2MKIAotICAgICAgICBkZWYgX19nZXRfXyhzZWxmLCBpbnN0LCB0eXBlPU5vbmUpOgotICAgICAgICAgICAgaWYgaW5zdCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCi0gICAgICAgICAgICBpZiBzZWxmLl9fZ2V0IGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICJ1bnJlYWRhYmxlIGF0dHJpYnV0ZSIKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZ2V0KGluc3QpCisgICAgZGVmIF9fZ2V0X18oc2VsZiwgaW5zdCwgdHlwZT1Ob25lKToKKyAgICAgICAgaWYgaW5zdCBpcyBOb25lOgorICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBpZiBzZWxmLl9fZ2V0IGlzIE5vbmU6CisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCAidW5yZWFkYWJsZSBhdHRyaWJ1dGUiCisgICAgICAgIHJldHVybiBzZWxmLl9fZ2V0KGluc3QpCiAKLSAgICAgICAgZGVmIF9fc2V0X18oc2VsZiwgaW5zdCwgdmFsdWUpOgotICAgICAgICAgICAgaWYgc2VsZi5fX3NldCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCAiY2FuJ3Qgc2V0IGF0dHJpYnV0ZSIKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9fc2V0KGluc3QsIHZhbHVlKQorICAgIGRlZiBfX3NldF9fKHNlbGYsIGluc3QsIHZhbHVlKToKKyAgICAgICAgaWYgc2VsZi5fX3NldCBpcyBOb25lOgorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgImNhbid0IHNldCBhdHRyaWJ1dGUiCisgICAgICAgIHJldHVybiBzZWxmLl9fc2V0KGluc3QsIHZhbHVlKQogCi0gICAgICAgIGRlZiBfX2RlbGV0ZV9fKHNlbGYsIGluc3QpOgotICAgICAgICAgICAgaWYgc2VsZi5fX2RlbCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCAiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZSIKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVsKGluc3QpCisgICAgZGVmIF9fZGVsZXRlX18oc2VsZiwgaW5zdCk6CisgICAgICAgIGlmIHNlbGYuX19kZWwgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIgorICAgICAgICByZXR1cm4gc2VsZi5fX2RlbChpbnN0KQogCiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpwcm9wX2dldDsKLQlQeU9iamVjdCAqcHJvcF9zZXQ7Ci0JUHlPYmplY3QgKnByb3BfZGVsOwotCVB5T2JqZWN0ICpwcm9wX2RvYzsKLQlpbnQgZ2V0dGVyX2RvYzsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnByb3BfZ2V0OworICAgIFB5T2JqZWN0ICpwcm9wX3NldDsKKyAgICBQeU9iamVjdCAqcHJvcF9kZWw7CisgICAgUHlPYmplY3QgKnByb3BfZG9jOworICAgIGludCBnZXR0ZXJfZG9jOwogfSBwcm9wZXJ0eW9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICogcHJvcGVydHlfY29weShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqLAotCQkJCSAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBwcm9wZXJ0eV9tZW1iZXJzW10gPSB7Ci0JeyJmZ2V0IiwgVF9PQkpFQ1QsIG9mZnNldG9mKHByb3BlcnR5b2JqZWN0LCBwcm9wX2dldCksIFJFQURPTkxZfSwKLQl7ImZzZXQiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHJvcGVydHlvYmplY3QsIHByb3Bfc2V0KSwgUkVBRE9OTFl9LAotCXsiZmRlbCIsIFRfT0JKRUNULCBvZmZzZXRvZihwcm9wZXJ0eW9iamVjdCwgcHJvcF9kZWwpLCBSRUFET05MWX0sCi0JeyJfX2RvY19fIiwgIFRfT0JKRUNULCBvZmZzZXRvZihwcm9wZXJ0eW9iamVjdCwgcHJvcF9kb2MpLCBSRUFET05MWX0sCi0JezB9CisgICAgeyJmZ2V0IiwgVF9PQkpFQ1QsIG9mZnNldG9mKHByb3BlcnR5b2JqZWN0LCBwcm9wX2dldCksIFJFQURPTkxZfSwKKyAgICB7ImZzZXQiLCBUX09CSkVDVCwgb2Zmc2V0b2YocHJvcGVydHlvYmplY3QsIHByb3Bfc2V0KSwgUkVBRE9OTFl9LAorICAgIHsiZmRlbCIsIFRfT0JKRUNULCBvZmZzZXRvZihwcm9wZXJ0eW9iamVjdCwgcHJvcF9kZWwpLCBSRUFET05MWX0sCisgICAgeyJfX2RvY19fIiwgIFRfT0JKRUNULCBvZmZzZXRvZihwcm9wZXJ0eW9iamVjdCwgcHJvcF9kb2MpLCBSRUFET05MWX0sCisgICAgezB9CiB9OwogCiAKIFB5RG9jX1NUUlZBUihnZXR0ZXJfZG9jLAotCSAgICAgIkRlc2NyaXB0b3IgdG8gY2hhbmdlIHRoZSBnZXR0ZXIgb24gYSBwcm9wZXJ0eS4iKTsKKyAgICAgICAgICAgICAiRGVzY3JpcHRvciB0byBjaGFuZ2UgdGhlIGdldHRlciBvbiBhIHByb3BlcnR5LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJvcGVydHlfZ2V0dGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZ2V0dGVyKQogewotCXJldHVybiBwcm9wZXJ0eV9jb3B5KHNlbGYsIGdldHRlciwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIHByb3BlcnR5X2NvcHkoc2VsZiwgZ2V0dGVyLCBOVUxMLCBOVUxMLCBOVUxMKTsKIH0KIAogCiBQeURvY19TVFJWQVIoc2V0dGVyX2RvYywKLQkgICAgICJEZXNjcmlwdG9yIHRvIGNoYW5nZSB0aGUgc2V0dGVyIG9uIGEgcHJvcGVydHkuIik7CisgICAgICAgICAgICAgIkRlc2NyaXB0b3IgdG8gY2hhbmdlIHRoZSBzZXR0ZXIgb24gYSBwcm9wZXJ0eS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3BlcnR5X3NldHRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNldHRlcikKIHsKLQlyZXR1cm4gcHJvcGVydHlfY29weShzZWxmLCBOVUxMLCBzZXR0ZXIsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiBwcm9wZXJ0eV9jb3B5KHNlbGYsIE5VTEwsIHNldHRlciwgTlVMTCwgTlVMTCk7CiB9CiAKIAogUHlEb2NfU1RSVkFSKGRlbGV0ZXJfZG9jLAotCSAgICAgIkRlc2NyaXB0b3IgdG8gY2hhbmdlIHRoZSBkZWxldGVyIG9uIGEgcHJvcGVydHkuIik7CisgICAgICAgICAgICAgIkRlc2NyaXB0b3IgdG8gY2hhbmdlIHRoZSBkZWxldGVyIG9uIGEgcHJvcGVydHkuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBwcm9wZXJ0eV9kZWxldGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqZGVsZXRlcikKIHsKLQlyZXR1cm4gcHJvcGVydHlfY29weShzZWxmLCBOVUxMLCBOVUxMLCBkZWxldGVyLCBOVUxMKTsKKyAgICByZXR1cm4gcHJvcGVydHlfY29weShzZWxmLCBOVUxMLCBOVUxMLCBkZWxldGVyLCBOVUxMKTsKIH0KIAogCiBzdGF0aWMgUHlNZXRob2REZWYgcHJvcGVydHlfbWV0aG9kc1tdID0gewotCXsiZ2V0dGVyIiwgcHJvcGVydHlfZ2V0dGVyLCBNRVRIX08sIGdldHRlcl9kb2N9LAotCXsic2V0dGVyIiwgcHJvcGVydHlfc2V0dGVyLCBNRVRIX08sIHNldHRlcl9kb2N9LAotCXsiZGVsZXRlciIsIHByb3BlcnR5X2RlbGV0ZXIsIE1FVEhfTywgZGVsZXRlcl9kb2N9LAotCXswfQorICAgIHsiZ2V0dGVyIiwgcHJvcGVydHlfZ2V0dGVyLCBNRVRIX08sIGdldHRlcl9kb2N9LAorICAgIHsic2V0dGVyIiwgcHJvcGVydHlfc2V0dGVyLCBNRVRIX08sIHNldHRlcl9kb2N9LAorICAgIHsiZGVsZXRlciIsIHByb3BlcnR5X2RlbGV0ZXIsIE1FVEhfTywgZGVsZXRlcl9kb2N9LAorICAgIHswfQogfTsKIAogCiBzdGF0aWMgdm9pZAogcHJvcGVydHlfZGVhbGxvYyhQeU9iamVjdCAqc2VsZikKIHsKLQlwcm9wZXJ0eW9iamVjdCAqZ3MgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOworICAgIHByb3BlcnR5b2JqZWN0ICpncyA9IChwcm9wZXJ0eW9iamVjdCAqKXNlbGY7CiAKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKLQlQeV9YREVDUkVGKGdzLT5wcm9wX2dldCk7Ci0JUHlfWERFQ1JFRihncy0+cHJvcF9zZXQpOwotCVB5X1hERUNSRUYoZ3MtPnByb3BfZGVsKTsKLQlQeV9YREVDUkVGKGdzLT5wcm9wX2RvYyk7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZShzZWxmKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKKyAgICBQeV9YREVDUkVGKGdzLT5wcm9wX2dldCk7CisgICAgUHlfWERFQ1JFRihncy0+cHJvcF9zZXQpOworICAgIFB5X1hERUNSRUYoZ3MtPnByb3BfZGVsKTsKKyAgICBQeV9YREVDUkVGKGdzLT5wcm9wX2RvYyk7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZShzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHByb3BlcnR5X2Rlc2NyX2dldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnR5cGUpCiB7Ci0JcHJvcGVydHlvYmplY3QgKmdzID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKKyAgICBwcm9wZXJ0eW9iamVjdCAqZ3MgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOwogCi0JaWYgKG9iaiA9PSBOVUxMIHx8IG9iaiA9PSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihzZWxmKTsKLQkJcmV0dXJuIHNlbGY7Ci0JfQotCWlmIChncy0+cHJvcF9nZXQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJ1bnJlYWRhYmxlIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihncy0+cHJvcF9nZXQsICIoTykiLCBvYmopOworICAgIGlmIChvYmogPT0gTlVMTCB8fCBvYmogPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKyAgICBpZiAoZ3MtPnByb3BfZ2V0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAidW5yZWFkYWJsZSBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZ3MtPnByb3BfZ2V0LCAiKE8pIiwgb2JqKTsKIH0KIAogc3RhdGljIGludAogcHJvcGVydHlfZGVzY3Jfc2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JcHJvcGVydHlvYmplY3QgKmdzID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKLQlQeU9iamVjdCAqZnVuYywgKnJlczsKKyAgICBwcm9wZXJ0eW9iamVjdCAqZ3MgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzOwogCi0JaWYgKHZhbHVlID09IE5VTEwpCi0JCWZ1bmMgPSBncy0+cHJvcF9kZWw7Ci0JZWxzZQotCQlmdW5jID0gZ3MtPnByb3Bfc2V0OwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCXZhbHVlID09IE5VTEwgPwotCQkJCSJjYW4ndCBkZWxldGUgYXR0cmlidXRlIiA6Ci0JCQkJImNhbid0IHNldCBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsICIoTykiLCBvYmopOwotCWVsc2UKLQkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGZ1bmMsICIoT08pIiwgb2JqLCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGZ1bmMgPSBncy0+cHJvcF9kZWw7CisgICAgZWxzZQorICAgICAgICBmdW5jID0gZ3MtPnByb3Bfc2V0OworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT0gTlVMTCA/CisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIGF0dHJpYnV0ZSIgOgorICAgICAgICAgICAgICAgICJjYW4ndCBzZXQgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCAiKE8pIiwgb2JqKTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihmdW5jLCAiKE9PKSIsIG9iaiwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcHJvcGVydHlfY29weShQeU9iamVjdCAqb2xkLCBQeU9iamVjdCAqZ2V0LCBQeU9iamVjdCAqc2V0LCBQeU9iamVjdCAqZGVsLAotCQlQeU9iamVjdCAqZG9jKQorICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkb2MpCiB7Ci0JcHJvcGVydHlvYmplY3QgKnBvbGQgPSAocHJvcGVydHlvYmplY3QgKilvbGQ7Ci0JUHlPYmplY3QgKm5ldywgKnR5cGU7CisgICAgcHJvcGVydHlvYmplY3QgKnBvbGQgPSAocHJvcGVydHlvYmplY3QgKilvbGQ7CisgICAgUHlPYmplY3QgKm5ldywgKnR5cGU7CiAKLQl0eXBlID0gUHlPYmplY3RfVHlwZShvbGQpOwotCWlmICh0eXBlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHR5cGUgPSBQeU9iamVjdF9UeXBlKG9sZCk7CisgICAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZ2V0ID09IE5VTEwgfHwgZ2V0ID09IFB5X05vbmUpIHsKLQkJUHlfWERFQ1JFRihnZXQpOwotCQlnZXQgPSBwb2xkLT5wcm9wX2dldCA/IHBvbGQtPnByb3BfZ2V0IDogUHlfTm9uZTsKLQl9Ci0JaWYgKHNldCA9PSBOVUxMIHx8IHNldCA9PSBQeV9Ob25lKSB7Ci0JCVB5X1hERUNSRUYoc2V0KTsKLQkJc2V0ID0gcG9sZC0+cHJvcF9zZXQgPyBwb2xkLT5wcm9wX3NldCA6IFB5X05vbmU7Ci0JfQotCWlmIChkZWwgPT0gTlVMTCB8fCBkZWwgPT0gUHlfTm9uZSkgewotCQlQeV9YREVDUkVGKGRlbCk7Ci0JCWRlbCA9IHBvbGQtPnByb3BfZGVsID8gcG9sZC0+cHJvcF9kZWwgOiBQeV9Ob25lOwotCX0KLQlpZiAoZG9jID09IE5VTEwgfHwgZG9jID09IFB5X05vbmUpIHsKLQkJUHlfWERFQ1JFRihkb2MpOwotCQlpZiAocG9sZC0+Z2V0dGVyX2RvYyAmJiBnZXQgIT0gUHlfTm9uZSkgewotCQkJLyogbWFrZSBfaW5pdCB1c2UgX19kb2NfXyBmcm9tIGdldHRlciAqLwotCQkJZG9jID0gUHlfTm9uZTsKLQkJfQotCQllbHNlIHsKLQkJCWRvYyA9IHBvbGQtPnByb3BfZG9jID8gcG9sZC0+cHJvcF9kb2MgOiBQeV9Ob25lOwotCQl9Ci0JfQorICAgIGlmIChnZXQgPT0gTlVMTCB8fCBnZXQgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9YREVDUkVGKGdldCk7CisgICAgICAgIGdldCA9IHBvbGQtPnByb3BfZ2V0ID8gcG9sZC0+cHJvcF9nZXQgOiBQeV9Ob25lOworICAgIH0KKyAgICBpZiAoc2V0ID09IE5VTEwgfHwgc2V0ID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfWERFQ1JFRihzZXQpOworICAgICAgICBzZXQgPSBwb2xkLT5wcm9wX3NldCA/IHBvbGQtPnByb3Bfc2V0IDogUHlfTm9uZTsKKyAgICB9CisgICAgaWYgKGRlbCA9PSBOVUxMIHx8IGRlbCA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X1hERUNSRUYoZGVsKTsKKyAgICAgICAgZGVsID0gcG9sZC0+cHJvcF9kZWwgPyBwb2xkLT5wcm9wX2RlbCA6IFB5X05vbmU7CisgICAgfQorICAgIGlmIChkb2MgPT0gTlVMTCB8fCBkb2MgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9YREVDUkVGKGRvYyk7CisgICAgICAgIGlmIChwb2xkLT5nZXR0ZXJfZG9jICYmIGdldCAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAvKiBtYWtlIF9pbml0IHVzZSBfX2RvY19fIGZyb20gZ2V0dGVyICovCisgICAgICAgICAgICBkb2MgPSBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZG9jID0gcG9sZC0+cHJvcF9kb2MgPyBwb2xkLT5wcm9wX2RvYyA6IFB5X05vbmU7CisgICAgICAgIH0KKyAgICB9CiAKLQluZXcgPSAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHR5cGUsICJPT09PIiwgZ2V0LCBzZXQsIGRlbCwgZG9jKTsKLQlQeV9ERUNSRUYodHlwZSk7Ci0JaWYgKG5ldyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbmV3OworICAgIG5ldyA9ICBQeU9iamVjdF9DYWxsRnVuY3Rpb24odHlwZSwgIk9PT08iLCBnZXQsIHNldCwgZGVsLCBkb2MpOworICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICBpZiAobmV3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBuZXc7CiB9CiAKIHN0YXRpYyBpbnQKIHByb3BlcnR5X2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqZ2V0ID0gTlVMTCwgKnNldCA9IE5VTEwsICpkZWwgPSBOVUxMLCAqZG9jID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZnZXQiLCAiZnNldCIsICJmZGVsIiwgImRvYyIsIDB9OwotCXByb3BlcnR5b2JqZWN0ICpwcm9wID0gKHByb3BlcnR5b2JqZWN0ICopc2VsZjsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9PT086cHJvcGVydHkiLAotCQkJCQkga3dsaXN0LCAmZ2V0LCAmc2V0LCAmZGVsLCAmZG9jKSkKLQkJcmV0dXJuIC0xOworICAgIFB5T2JqZWN0ICpnZXQgPSBOVUxMLCAqc2V0ID0gTlVMTCwgKmRlbCA9IE5VTEwsICpkb2MgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiZmdldCIsICJmc2V0IiwgImZkZWwiLCAiZG9jIiwgMH07CisgICAgcHJvcGVydHlvYmplY3QgKnByb3AgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOwogCi0JaWYgKGdldCA9PSBQeV9Ob25lKQotCQlnZXQgPSBOVUxMOwotCWlmIChzZXQgPT0gUHlfTm9uZSkKLQkJc2V0ID0gTlVMTDsKLQlpZiAoZGVsID09IFB5X05vbmUpCi0JCWRlbCA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPT09POnByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZnZXQsICZzZXQsICZkZWwsICZkb2MpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9YSU5DUkVGKGdldCk7Ci0JUHlfWElOQ1JFRihzZXQpOwotCVB5X1hJTkNSRUYoZGVsKTsKLQlQeV9YSU5DUkVGKGRvYyk7CisgICAgaWYgKGdldCA9PSBQeV9Ob25lKQorICAgICAgICBnZXQgPSBOVUxMOworICAgIGlmIChzZXQgPT0gUHlfTm9uZSkKKyAgICAgICAgc2V0ID0gTlVMTDsKKyAgICBpZiAoZGVsID09IFB5X05vbmUpCisgICAgICAgIGRlbCA9IE5VTEw7CiAKLQlwcm9wLT5wcm9wX2dldCA9IGdldDsKLQlwcm9wLT5wcm9wX3NldCA9IHNldDsKLQlwcm9wLT5wcm9wX2RlbCA9IGRlbDsKLQlwcm9wLT5wcm9wX2RvYyA9IGRvYzsKLQlwcm9wLT5nZXR0ZXJfZG9jID0gMDsKKyAgICBQeV9YSU5DUkVGKGdldCk7CisgICAgUHlfWElOQ1JFRihzZXQpOworICAgIFB5X1hJTkNSRUYoZGVsKTsKKyAgICBQeV9YSU5DUkVGKGRvYyk7CiAKLQkvKiBpZiBubyBkb2NzdHJpbmcgZ2l2ZW4gYW5kIHRoZSBnZXR0ZXIgaGFzIG9uZSwgdXNlIHRoYXQgb25lICovCi0JaWYgKChkb2MgPT0gTlVMTCB8fCBkb2MgPT0gUHlfTm9uZSkgJiYgZ2V0ICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmdldF9kb2MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGdldCwgIl9fZG9jX18iKTsKLQkJaWYgKGdldF9kb2MgIT0gTlVMTCkgewotCQkJLyogZ2V0X2RvYyBhbHJlYWR5IElOQ1JFRidkIGJ5IEdldEF0dHIgKi8KLQkJCWlmIChQeV9UWVBFKHNlbGYpPT0mUHlQcm9wZXJ0eV9UeXBlKSB7Ci0JCQkJUHlfWERFQ1JFRihwcm9wLT5wcm9wX2RvYyk7Ci0JCQkJcHJvcC0+cHJvcF9kb2MgPSBnZXRfZG9jOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBQdXQgX19kb2NfXyBpbiBkaWN0IG9mIHRoZSBzdWJjbGFzcyBpbnN0YW5jZSBpbnN0ZWFkLAotCQkJCW90aGVyd2lzZSBpdCBnZXRzIHNoYWRvd2VkIGJ5IGNsYXNzJ3MgX19kb2NfXy4gKi8KLQkJCQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiX19kb2NfXyIsIGdldF9kb2MpICE9IDApCi0JCQkJewotCQkJCQkvKiBERUNSRUYgZm9yIHByb3BzIGhhbmRsZWQgYnkgX2RlYWxsb2MgKi8KLQkJCQkJUHlfREVDUkVGKGdldF9kb2MpOwotCQkJCQlyZXR1cm4gLTE7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZ2V0X2RvYyk7Ci0JCQl9Ci0JCQlwcm9wLT5nZXR0ZXJfZG9jID0gMTsKLQkJfSBlbHNlIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQl9CisgICAgcHJvcC0+cHJvcF9nZXQgPSBnZXQ7CisgICAgcHJvcC0+cHJvcF9zZXQgPSBzZXQ7CisgICAgcHJvcC0+cHJvcF9kZWwgPSBkZWw7CisgICAgcHJvcC0+cHJvcF9kb2MgPSBkb2M7CisgICAgcHJvcC0+Z2V0dGVyX2RvYyA9IDA7CiAKLQlyZXR1cm4gMDsKKyAgICAvKiBpZiBubyBkb2NzdHJpbmcgZ2l2ZW4gYW5kIHRoZSBnZXR0ZXIgaGFzIG9uZSwgdXNlIHRoYXQgb25lICovCisgICAgaWYgKChkb2MgPT0gTlVMTCB8fCBkb2MgPT0gUHlfTm9uZSkgJiYgZ2V0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmdldF9kb2MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGdldCwgIl9fZG9jX18iKTsKKyAgICAgICAgaWYgKGdldF9kb2MgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogZ2V0X2RvYyBhbHJlYWR5IElOQ1JFRidkIGJ5IEdldEF0dHIgKi8KKyAgICAgICAgICAgIGlmIChQeV9UWVBFKHNlbGYpPT0mUHlQcm9wZXJ0eV9UeXBlKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihwcm9wLT5wcm9wX2RvYyk7CisgICAgICAgICAgICAgICAgcHJvcC0+cHJvcF9kb2MgPSBnZXRfZG9jOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBQdXQgX19kb2NfXyBpbiBkaWN0IG9mIHRoZSBzdWJjbGFzcyBpbnN0YW5jZSBpbnN0ZWFkLAorICAgICAgICAgICAgICAgIG90aGVyd2lzZSBpdCBnZXRzIHNoYWRvd2VkIGJ5IGNsYXNzJ3MgX19kb2NfXy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiX19kb2NfXyIsIGdldF9kb2MpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBERUNSRUYgZm9yIHByb3BzIGhhbmRsZWQgYnkgX2RlYWxsb2MgKi8KKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGdldF9kb2MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihnZXRfZG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3AtPmdldHRlcl9kb2MgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOwogfQogCiBQeURvY19TVFJWQVIocHJvcGVydHlfZG9jLApAQCAtMTMzMCw1NCArMTMzMCw1NCBAQAogc3RhdGljIGludAogcHJvcGVydHlfdHJhdmVyc2UoUHlPYmplY3QgKnNlbGYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCXByb3BlcnR5b2JqZWN0ICpwcCA9IChwcm9wZXJ0eW9iamVjdCAqKXNlbGY7Ci0JUHlfVklTSVQocHAtPnByb3BfZ2V0KTsKLQlQeV9WSVNJVChwcC0+cHJvcF9zZXQpOwotCVB5X1ZJU0lUKHBwLT5wcm9wX2RlbCk7Ci0JUHlfVklTSVQocHAtPnByb3BfZG9jKTsKLQlyZXR1cm4gMDsKKyAgICBwcm9wZXJ0eW9iamVjdCAqcHAgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOworICAgIFB5X1ZJU0lUKHBwLT5wcm9wX2dldCk7CisgICAgUHlfVklTSVQocHAtPnByb3Bfc2V0KTsKKyAgICBQeV9WSVNJVChwcC0+cHJvcF9kZWwpOworICAgIFB5X1ZJU0lUKHBwLT5wcm9wX2RvYyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5VHlwZU9iamVjdCBQeVByb3BlcnR5X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkicHJvcGVydHkiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKHByb3BlcnR5b2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JcHJvcGVydHlfZGVhbGxvYywJIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkgICAgICAgCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLAkJLyogdHBfZmxhZ3MgKi8KLSAJcHJvcGVydHlfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQlwcm9wZXJ0eV90cmF2ZXJzZSwJCQkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXByb3BlcnR5X21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCXByb3BlcnR5X21lbWJlcnMsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JcHJvcGVydHlfZGVzY3JfZ2V0LAkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCXByb3BlcnR5X2Rlc2NyX3NldCwJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCXByb3BlcnR5X2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgIAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInByb3BlcnR5IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHByb3BlcnR5b2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIHByb3BlcnR5X2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBwcm9wZXJ0eV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIHByb3BlcnR5X3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgcHJvcGVydHlfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgcHJvcGVydHlfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICBwcm9wZXJ0eV9kZXNjcl9nZXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIHByb3BlcnR5X2Rlc2NyX3NldCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgcHJvcGVydHlfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kaWN0b2JqZWN0LmMgYi9PYmplY3RzL2RpY3RvYmplY3QuYwppbmRleCA1Y2Y5YWQxLi45ZDE5YjFkIDEwMDY0NAotLS0gYS9PYmplY3RzL2RpY3RvYmplY3QuYworKysgYi9PYmplY3RzL2RpY3RvYmplY3QuYwpAQCAtMTYsMTIgKzE2LDEyIEBACiBzdGF0aWMgdm9pZAogc2V0X2tleV9lcnJvcihQeU9iamVjdCAqYXJnKQogewotCVB5T2JqZWN0ICp0dXA7Ci0JdHVwID0gUHlUdXBsZV9QYWNrKDEsIGFyZyk7Ci0JaWYgKCF0dXApCi0JCXJldHVybjsgLyogY2FsbGVyIHdpbGwgZXhwZWN0IGVycm9yIHRvIGJlIHNldCBhbnl3YXkgKi8KLQlQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7Ci0JUHlfREVDUkVGKHR1cCk7CisgICAgUHlPYmplY3QgKnR1cDsKKyAgICB0dXAgPSBQeVR1cGxlX1BhY2soMSwgYXJnKTsKKyAgICBpZiAoIXR1cCkKKyAgICAgICAgcmV0dXJuOyAvKiBjYWxsZXIgd2lsbCBleHBlY3QgZXJyb3IgdG8gYmUgc2V0IGFueXdheSAqLworICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwgdHVwKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKIH0KIAogLyogRGVmaW5lIHRoaXMgb3V0IGlmIHlvdSBkb24ndCB3YW50IGNvbnZlcnNpb24gc3RhdGlzdGljcyBvbiBleGl0LiAqLwpAQCAtMTQxLDcgKzE0MSw3IEBACiBQeU9iamVjdCAqCiBfUHlEaWN0X0R1bW15KHZvaWQpCiB7Ci0JcmV0dXJuIGR1bW15OworICAgIHJldHVybiBkdW1teTsKIH0KICNlbmRpZgogCkBAIC0xNTYsOSArMTU2LDkgQEAKIHN0YXRpYyB2b2lkCiBzaG93X2NvdW50cyh2b2lkKQogewotCWZwcmludGYoc3RkZXJyLCAiY3JlYXRlZCAlbGQgc3RyaW5nIGRpY3RzXG4iLCBjcmVhdGVkKTsKLQlmcHJpbnRmKHN0ZGVyciwgImNvbnZlcnRlZCAlbGQgdG8gbm9ybWFsIGRpY3RzXG4iLCBjb252ZXJ0ZWQpOwotCWZwcmludGYoc3RkZXJyLCAiJS4yZiUlIGNvbnZlcnNpb24gcmF0ZVxuIiwgKDEwMC4wKmNvbnZlcnRlZCkvY3JlYXRlZCk7CisgICAgZnByaW50ZihzdGRlcnIsICJjcmVhdGVkICVsZCBzdHJpbmcgZGljdHNcbiIsIGNyZWF0ZWQpOworICAgIGZwcmludGYoc3RkZXJyLCAiY29udmVydGVkICVsZCB0byBub3JtYWwgZGljdHNcbiIsIGNvbnZlcnRlZCk7CisgICAgZnByaW50ZihzdGRlcnIsICIlLjJmJSUgY29udmVyc2lvbiByYXRlXG4iLCAoMTAwLjAqY29udmVydGVkKS9jcmVhdGVkKTsKIH0KICNlbmRpZgogCkBAIC0xNzEsMTIgKzE3MSwxMiBAQAogc3RhdGljIHZvaWQKIHNob3dfYWxsb2Modm9pZCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkRpY3QgYWxsb2NhdGlvbnM6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCi0JCWNvdW50X2FsbG9jKTsKLQlmcHJpbnRmKHN0ZGVyciwgIkRpY3QgcmV1c2UgdGhyb3VnaCBmcmVlbGlzdDogJSIgUFlfRk9STUFUX1NJWkVfVAotCQkiZFxuIiwgY291bnRfcmV1c2UpOwotCWZwcmludGYoc3RkZXJyLCAiJS4yZiUlIHJldXNlIHJhdGVcblxuIiwKLQkJKDEwMC4wKmNvdW50X3JldXNlLyhjb3VudF9hbGxvYytjb3VudF9yZXVzZSkpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRpY3QgYWxsb2NhdGlvbnM6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCisgICAgICAgIGNvdW50X2FsbG9jKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRpY3QgcmV1c2UgdGhyb3VnaCBmcmVlbGlzdDogJSIgUFlfRk9STUFUX1NJWkVfVAorICAgICAgICAiZFxuIiwgY291bnRfcmV1c2UpOworICAgIGZwcmludGYoc3RkZXJyLCAiJS4yZiUlIHJldXNlIHJhdGVcblxuIiwKKyAgICAgICAgKDEwMC4wKmNvdW50X3JldXNlLyhjb3VudF9hbGxvYytjb3VudF9yZXVzZSkpKTsKIH0KICNlbmRpZgogCkBAIC0xODksMTUgKzE4OSwxNSBAQAogICAgYW4gZXhjZWxsZW50IHJlYXNvbiBub3QgdG8pLgogKi8KIAotI2RlZmluZSBJTklUX05PTlpFUk9fRElDVF9TTE9UUyhtcCkgZG8gewkJCQlcCi0JKG1wKS0+bWFfdGFibGUgPSAobXApLT5tYV9zbWFsbHRhYmxlOwkJCQlcCi0JKG1wKS0+bWFfbWFzayA9IFB5RGljdF9NSU5TSVpFIC0gMTsJCQkJXAorI2RlZmluZSBJTklUX05PTlpFUk9fRElDVF9TTE9UUyhtcCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChtcCktPm1hX3RhYmxlID0gKG1wKS0+bWFfc21hbGx0YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChtcCktPm1hX21hc2sgPSBQeURpY3RfTUlOU0laRSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUoMCkKIAotI2RlZmluZSBFTVBUWV9UT19NSU5TSVpFKG1wKSBkbyB7CQkJCQlcCi0JbWVtc2V0KChtcCktPm1hX3NtYWxsdGFibGUsIDAsIHNpemVvZigobXApLT5tYV9zbWFsbHRhYmxlKSk7CVwKLQkobXApLT5tYV91c2VkID0gKG1wKS0+bWFfZmlsbCA9IDA7CQkJCVwKLQlJTklUX05PTlpFUk9fRElDVF9TTE9UUyhtcCk7CQkJCQlcCisjZGVmaW5lIEVNUFRZX1RPX01JTlNJWkUobXApIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtc2V0KChtcCktPm1hX3NtYWxsdGFibGUsIDAsIHNpemVvZigobXApLT5tYV9zbWFsbHRhYmxlKSk7ICAgICAgICBcCisgICAgKG1wKS0+bWFfdXNlZCA9IChtcCktPm1hX2ZpbGwgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMobXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSgwKQogCiAvKiBEaWN0aW9uYXJ5IHJldXNlIHNjaGVtZSB0byBzYXZlIGNhbGxzIHRvIG1hbGxvYywgZnJlZSwgYW5kIG1lbXNldCAqLwpAQCAtMjEwLDYzICsyMTAsNjMgQEAKIHZvaWQKIFB5RGljdF9GaW5pKHZvaWQpCiB7Ci0JUHlEaWN0T2JqZWN0ICpvcDsKKyAgICBQeURpY3RPYmplY3QgKm9wOwogCi0Jd2hpbGUgKG51bWZyZWUpIHsKLQkJb3AgPSBmcmVlX2xpc3RbLS1udW1mcmVlXTsKLQkJYXNzZXJ0KFB5RGljdF9DaGVja0V4YWN0KG9wKSk7Ci0JCVB5T2JqZWN0X0dDX0RlbChvcCk7Ci0JfQorICAgIHdoaWxlIChudW1mcmVlKSB7CisgICAgICAgIG9wID0gZnJlZV9saXN0Wy0tbnVtZnJlZV07CisgICAgICAgIGFzc2VydChQeURpY3RfQ2hlY2tFeGFjdChvcCkpOworICAgICAgICBQeU9iamVjdF9HQ19EZWwob3ApOworICAgIH0KIH0KIAogUHlPYmplY3QgKgogUHlEaWN0X05ldyh2b2lkKQogewotCXJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXA7Ci0JaWYgKGR1bW15ID09IE5VTEwpIHsgLyogQXV0by1pbml0aWFsaXplIGR1bW15ICovCi0JCWR1bW15ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPGR1bW15IGtleT4iKTsKLQkJaWYgKGR1bW15ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICByZWdpc3RlciBQeURpY3RPYmplY3QgKm1wOworICAgIGlmIChkdW1teSA9PSBOVUxMKSB7IC8qIEF1dG8taW5pdGlhbGl6ZSBkdW1teSAqLworICAgICAgICBkdW1teSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxkdW1teSBrZXk+Iik7CisgICAgICAgIGlmIChkdW1teSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgU0hPV19DT05WRVJTSU9OX0NPVU5UUwotCQlQeV9BdEV4aXQoc2hvd19jb3VudHMpOworICAgICAgICBQeV9BdEV4aXQoc2hvd19jb3VudHMpOwogI2VuZGlmCiAjaWZkZWYgU0hPV19BTExPQ19DT1VOVAotCQlQeV9BdEV4aXQoc2hvd19hbGxvYyk7CisgICAgICAgIFB5X0F0RXhpdChzaG93X2FsbG9jKTsKICNlbmRpZgotCX0KLQlpZiAobnVtZnJlZSkgewotCQltcCA9IGZyZWVfbGlzdFstLW51bWZyZWVdOwotCQlhc3NlcnQgKG1wICE9IE5VTEwpOwotCQlhc3NlcnQgKFB5X1RZUEUobXApID09ICZQeURpY3RfVHlwZSk7Ci0JCV9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopbXApOwotCQlpZiAobXAtPm1hX2ZpbGwpIHsKLQkJCUVNUFRZX1RPX01JTlNJWkUobXApOwotCQl9IGVsc2UgewotCQkJLyogQXQgbGVhc3Qgc2V0IG1hX3RhYmxlIGFuZCBtYV9tYXNrOyB0aGVzZSBhcmUgd3JvbmcKLQkJCSAgIGlmIGFuIGVtcHR5IGJ1dCBwcmVzaXplZCBkaWN0IGlzIGFkZGVkIHRvIGZyZWVsaXN0ICovCi0JCQlJTklUX05PTlpFUk9fRElDVF9TTE9UUyhtcCk7Ci0JCX0KLQkJYXNzZXJ0IChtcC0+bWFfdXNlZCA9PSAwKTsKLQkJYXNzZXJ0IChtcC0+bWFfdGFibGUgPT0gbXAtPm1hX3NtYWxsdGFibGUpOwotCQlhc3NlcnQgKG1wLT5tYV9tYXNrID09IFB5RGljdF9NSU5TSVpFIC0gMSk7CisgICAgfQorICAgIGlmIChudW1mcmVlKSB7CisgICAgICAgIG1wID0gZnJlZV9saXN0Wy0tbnVtZnJlZV07CisgICAgICAgIGFzc2VydCAobXAgIT0gTlVMTCk7CisgICAgICAgIGFzc2VydCAoUHlfVFlQRShtcCkgPT0gJlB5RGljdF9UeXBlKTsKKyAgICAgICAgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKiltcCk7CisgICAgICAgIGlmIChtcC0+bWFfZmlsbCkgeworICAgICAgICAgICAgRU1QVFlfVE9fTUlOU0laRShtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBBdCBsZWFzdCBzZXQgbWFfdGFibGUgYW5kIG1hX21hc2s7IHRoZXNlIGFyZSB3cm9uZworICAgICAgICAgICAgICAgaWYgYW4gZW1wdHkgYnV0IHByZXNpemVkIGRpY3QgaXMgYWRkZWQgdG8gZnJlZWxpc3QgKi8KKyAgICAgICAgICAgIElOSVRfTk9OWkVST19ESUNUX1NMT1RTKG1wKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgKG1wLT5tYV91c2VkID09IDApOworICAgICAgICBhc3NlcnQgKG1wLT5tYV90YWJsZSA9PSBtcC0+bWFfc21hbGx0YWJsZSk7CisgICAgICAgIGFzc2VydCAobXAtPm1hX21hc2sgPT0gUHlEaWN0X01JTlNJWkUgLSAxKTsKICNpZmRlZiBTSE9XX0FMTE9DX0NPVU5UCi0JCWNvdW50X3JldXNlKys7CisgICAgICAgIGNvdW50X3JldXNlKys7CiAjZW5kaWYKLQl9IGVsc2UgewotCQltcCA9IFB5T2JqZWN0X0dDX05ldyhQeURpY3RPYmplY3QsICZQeURpY3RfVHlwZSk7Ci0JCWlmIChtcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCUVNUFRZX1RPX01JTlNJWkUobXApOworICAgIH0gZWxzZSB7CisgICAgICAgIG1wID0gUHlPYmplY3RfR0NfTmV3KFB5RGljdE9iamVjdCwgJlB5RGljdF9UeXBlKTsKKyAgICAgICAgaWYgKG1wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgRU1QVFlfVE9fTUlOU0laRShtcCk7CiAjaWZkZWYgU0hPV19BTExPQ19DT1VOVAotCQljb3VudF9hbGxvYysrOworICAgICAgICBjb3VudF9hbGxvYysrOwogI2VuZGlmCi0JfQotCW1wLT5tYV9sb29rdXAgPSBsb29rZGljdF9zdHJpbmc7CisgICAgfQorICAgIG1wLT5tYV9sb29rdXAgPSBsb29rZGljdF9zdHJpbmc7CiAjaWZkZWYgU0hPV19DT05WRVJTSU9OX0NPVU5UUwotCSsrY3JlYXRlZDsKKyAgICArK2NyZWF0ZWQ7CiAjZW5kaWYKLQlfUHlPYmplY3RfR0NfVFJBQ0sobXApOwotCXJldHVybiAoUHlPYmplY3QgKiltcDsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0sobXApOworICAgIHJldHVybiAoUHlPYmplY3QgKiltcDsKIH0KIAogLyoKQEAgLTI5Niw4MCArMjk2LDgwIEBACiBzdGF0aWMgUHlEaWN0RW50cnkgKgogbG9va2RpY3QoUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgcmVnaXN0ZXIgbG9uZyBoYXNoKQogewotCXJlZ2lzdGVyIHNpemVfdCBpOwotCXJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOwotCXJlZ2lzdGVyIFB5RGljdEVudHJ5ICpmcmVlc2xvdDsKLQlyZWdpc3RlciBzaXplX3QgbWFzayA9IChzaXplX3QpbXAtPm1hX21hc2s7Ci0JUHlEaWN0RW50cnkgKmVwMCA9IG1wLT5tYV90YWJsZTsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7Ci0JcmVnaXN0ZXIgaW50IGNtcDsKLQlQeU9iamVjdCAqc3RhcnRrZXk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmZyZWVzbG90OworICAgIHJlZ2lzdGVyIHNpemVfdCBtYXNrID0gKHNpemVfdCltcC0+bWFfbWFzazsKKyAgICBQeURpY3RFbnRyeSAqZXAwID0gbXAtPm1hX3RhYmxlOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKKyAgICByZWdpc3RlciBpbnQgY21wOworICAgIFB5T2JqZWN0ICpzdGFydGtleTsKIAotCWkgPSAoc2l6ZV90KWhhc2ggJiBtYXNrOwotCWVwID0gJmVwMFtpXTsKLQlpZiAoZXAtPm1lX2tleSA9PSBOVUxMIHx8IGVwLT5tZV9rZXkgPT0ga2V5KQotCQlyZXR1cm4gZXA7CisgICAgaSA9IChzaXplX3QpaGFzaCAmIG1hc2s7CisgICAgZXAgPSAmZXAwW2ldOworICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwgfHwgZXAtPm1lX2tleSA9PSBrZXkpCisgICAgICAgIHJldHVybiBlcDsKIAotCWlmIChlcC0+bWVfa2V5ID09IGR1bW15KQotCQlmcmVlc2xvdCA9IGVwOwotCWVsc2UgewotCQlpZiAoZXAtPm1lX2hhc2ggPT0gaGFzaCkgewotCQkJc3RhcnRrZXkgPSBlcC0+bWVfa2V5OwotCQkJUHlfSU5DUkVGKHN0YXJ0a2V5KTsKLQkJCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7Ci0JCQlQeV9ERUNSRUYoc3RhcnRrZXkpOwotCQkJaWYgKGNtcCA8IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpZiAoZXAwID09IG1wLT5tYV90YWJsZSAmJiBlcC0+bWVfa2V5ID09IHN0YXJ0a2V5KSB7Ci0JCQkJaWYgKGNtcCA+IDApCi0JCQkJCXJldHVybiBlcDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIFRoZSBjb21wYXJlIGRpZCBtYWpvciBuYXN0eSBzdHVmZiB0byB0aGUKLQkJCQkgKiBkaWN0OiAgc3RhcnQgb3Zlci4KLQkJCQkgKiBYWFggQSBjbGV2ZXIgYWR2ZXJzYXJ5IGNvdWxkIHByZXZlbnQgdGhpcwotCQkJCSAqIFhYWCBmcm9tIHRlcm1pbmF0aW5nLgotIAkJCQkgKi8KLSAJCQkJcmV0dXJuIGxvb2tkaWN0KG1wLCBrZXksIGhhc2gpOwotIAkJCX0KLQkJfQotCQlmcmVlc2xvdCA9IE5VTEw7Ci0JfQorICAgIGlmIChlcC0+bWVfa2V5ID09IGR1bW15KQorICAgICAgICBmcmVlc2xvdCA9IGVwOworICAgIGVsc2UgeworICAgICAgICBpZiAoZXAtPm1lX2hhc2ggPT0gaGFzaCkgeworICAgICAgICAgICAgc3RhcnRrZXkgPSBlcC0+bWVfa2V5OworICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcnRrZXkpOworICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAoZXAwID09IG1wLT5tYV90YWJsZSAmJiBlcC0+bWVfa2V5ID09IHN0YXJ0a2V5KSB7CisgICAgICAgICAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFRoZSBjb21wYXJlIGRpZCBtYWpvciBuYXN0eSBzdHVmZiB0byB0aGUKKyAgICAgICAgICAgICAgICAgKiBkaWN0OiAgc3RhcnQgb3Zlci4KKyAgICAgICAgICAgICAgICAgKiBYWFggQSBjbGV2ZXIgYWR2ZXJzYXJ5IGNvdWxkIHByZXZlbnQgdGhpcworICAgICAgICAgICAgICAgICAqIFhYWCBmcm9tIHRlcm1pbmF0aW5nLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmVlc2xvdCA9IE5VTEw7CisgICAgfQogCi0JLyogSW4gdGhlIGxvb3AsIG1lX2tleSA9PSBkdW1teSBpcyBieSBmYXIgKGZhY3RvciBvZiAxMDBzKSB0aGUKLQkgICBsZWFzdCBsaWtlbHkgb3V0Y29tZSwgc28gdGVzdCBmb3IgdGhhdCBsYXN0LiAqLwotCWZvciAocGVydHVyYiA9IGhhc2g7IDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgewotCQlpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7Ci0JCWVwID0gJmVwMFtpICYgbWFza107Ci0JCWlmIChlcC0+bWVfa2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVwIDogZnJlZXNsb3Q7Ci0JCWlmIChlcC0+bWVfa2V5ID09IGtleSkKLQkJCXJldHVybiBlcDsKLQkJaWYgKGVwLT5tZV9oYXNoID09IGhhc2ggJiYgZXAtPm1lX2tleSAhPSBkdW1teSkgewotCQkJc3RhcnRrZXkgPSBlcC0+bWVfa2V5OwotCQkJUHlfSU5DUkVGKHN0YXJ0a2V5KTsKLQkJCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7Ci0JCQlQeV9ERUNSRUYoc3RhcnRrZXkpOwotCQkJaWYgKGNtcCA8IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpZiAoZXAwID09IG1wLT5tYV90YWJsZSAmJiBlcC0+bWVfa2V5ID09IHN0YXJ0a2V5KSB7Ci0JCQkJaWYgKGNtcCA+IDApCi0JCQkJCXJldHVybiBlcDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIFRoZSBjb21wYXJlIGRpZCBtYWpvciBuYXN0eSBzdHVmZiB0byB0aGUKLQkJCQkgKiBkaWN0OiAgc3RhcnQgb3Zlci4KLQkJCQkgKiBYWFggQSBjbGV2ZXIgYWR2ZXJzYXJ5IGNvdWxkIHByZXZlbnQgdGhpcwotCQkJCSAqIFhYWCBmcm9tIHRlcm1pbmF0aW5nLgotIAkJCQkgKi8KLSAJCQkJcmV0dXJuIGxvb2tkaWN0KG1wLCBrZXksIGhhc2gpOwotIAkJCX0KLQkJfQotCQllbHNlIGlmIChlcC0+bWVfa2V5ID09IGR1bW15ICYmIGZyZWVzbG90ID09IE5VTEwpCi0JCQlmcmVlc2xvdCA9IGVwOwotCX0KLQlhc3NlcnQoMCk7CS8qIE5PVCBSRUFDSEVEICovCi0JcmV0dXJuIDA7CisgICAgLyogSW4gdGhlIGxvb3AsIG1lX2tleSA9PSBkdW1teSBpcyBieSBmYXIgKGZhY3RvciBvZiAxMDBzKSB0aGUKKyAgICAgICBsZWFzdCBsaWtlbHkgb3V0Y29tZSwgc28gdGVzdCBmb3IgdGhhdCBsYXN0LiAqLworICAgIGZvciAocGVydHVyYiA9IGhhc2g7IDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgeworICAgICAgICBpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7CisgICAgICAgIGVwID0gJmVwMFtpICYgbWFza107CisgICAgICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVwIDogZnJlZXNsb3Q7CisgICAgICAgIGlmIChlcC0+bWVfa2V5ID09IGtleSkKKyAgICAgICAgICAgIHJldHVybiBlcDsKKyAgICAgICAgaWYgKGVwLT5tZV9oYXNoID09IGhhc2ggJiYgZXAtPm1lX2tleSAhPSBkdW1teSkgeworICAgICAgICAgICAgc3RhcnRrZXkgPSBlcC0+bWVfa2V5OworICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcnRrZXkpOworICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAoZXAwID09IG1wLT5tYV90YWJsZSAmJiBlcC0+bWVfa2V5ID09IHN0YXJ0a2V5KSB7CisgICAgICAgICAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFRoZSBjb21wYXJlIGRpZCBtYWpvciBuYXN0eSBzdHVmZiB0byB0aGUKKyAgICAgICAgICAgICAgICAgKiBkaWN0OiAgc3RhcnQgb3Zlci4KKyAgICAgICAgICAgICAgICAgKiBYWFggQSBjbGV2ZXIgYWR2ZXJzYXJ5IGNvdWxkIHByZXZlbnQgdGhpcworICAgICAgICAgICAgICAgICAqIFhYWCBmcm9tIHRlcm1pbmF0aW5nLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHJldHVybiBsb29rZGljdChtcCwga2V5LCBoYXNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlcC0+bWVfa2V5ID09IGR1bW15ICYmIGZyZWVzbG90ID09IE5VTEwpCisgICAgICAgICAgICBmcmVlc2xvdCA9IGVwOworICAgIH0KKyAgICBhc3NlcnQoMCk7ICAgICAgICAgIC8qIE5PVCBSRUFDSEVEICovCisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0zODQsNTMgKzM4NCw1MyBAQAogc3RhdGljIFB5RGljdEVudHJ5ICoKIGxvb2tkaWN0X3N0cmluZyhQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCByZWdpc3RlciBsb25nIGhhc2gpCiB7Ci0JcmVnaXN0ZXIgc2l6ZV90IGk7Ci0JcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmZyZWVzbG90OwotCXJlZ2lzdGVyIHNpemVfdCBtYXNrID0gKHNpemVfdCltcC0+bWFfbWFzazsKLQlQeURpY3RFbnRyeSAqZXAwID0gbXAtPm1hX3RhYmxlOwotCXJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKKyAgICByZWdpc3RlciBzaXplX3QgaTsKKyAgICByZWdpc3RlciBzaXplX3QgcGVydHVyYjsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZnJlZXNsb3Q7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSAoc2l6ZV90KW1wLT5tYV9tYXNrOworICAgIFB5RGljdEVudHJ5ICplcDAgPSBtcC0+bWFfdGFibGU7CisgICAgcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwogCi0JLyogTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBoYXZlIHRvIGhhbmRsZSBub24tc3RyaW5nIGtleXMsCi0JICAgaW5jbHVkaW5nIHN1YmNsYXNzZXMgb2Ygc3RyOyBlLmcuLCBvbmUgcmVhc29uIHRvIHN1YmNsYXNzCi0JICAgc3RyaW5ncyBpcyB0byBvdmVycmlkZSBfX2VxX18sIGFuZCBmb3Igc3BlZWQgd2UgZG9uJ3QgY2F0ZXIgdG8KLQkgICB0aGF0IGhlcmUuICovCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKKyAgICAvKiBNYWtlIHN1cmUgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgdG8gaGFuZGxlIG5vbi1zdHJpbmcga2V5cywKKyAgICAgICBpbmNsdWRpbmcgc3ViY2xhc3NlcyBvZiBzdHI7IGUuZy4sIG9uZSByZWFzb24gdG8gc3ViY2xhc3MKKyAgICAgICBzdHJpbmdzIGlzIHRvIG92ZXJyaWRlIF9fZXFfXywgYW5kIGZvciBzcGVlZCB3ZSBkb24ndCBjYXRlciB0bworICAgICAgIHRoYXQgaGVyZS4gKi8KKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSkgewogI2lmZGVmIFNIT1dfQ09OVkVSU0lPTl9DT1VOVFMKLQkJKytjb252ZXJ0ZWQ7CisgICAgICAgICsrY29udmVydGVkOwogI2VuZGlmCi0JCW1wLT5tYV9sb29rdXAgPSBsb29rZGljdDsKLQkJcmV0dXJuIGxvb2tkaWN0KG1wLCBrZXksIGhhc2gpOwotCX0KLQlpID0gaGFzaCAmIG1hc2s7Ci0JZXAgPSAmZXAwW2ldOwotCWlmIChlcC0+bWVfa2V5ID09IE5VTEwgfHwgZXAtPm1lX2tleSA9PSBrZXkpCi0JCXJldHVybiBlcDsKLQlpZiAoZXAtPm1lX2tleSA9PSBkdW1teSkKLQkJZnJlZXNsb3QgPSBlcDsKLQllbHNlIHsKLQkJaWYgKGVwLT5tZV9oYXNoID09IGhhc2ggJiYgX1B5U3RyaW5nX0VxKGVwLT5tZV9rZXksIGtleSkpCi0JCQlyZXR1cm4gZXA7Ci0JCWZyZWVzbG90ID0gTlVMTDsKLQl9CisgICAgICAgIG1wLT5tYV9sb29rdXAgPSBsb29rZGljdDsKKyAgICAgICAgcmV0dXJuIGxvb2tkaWN0KG1wLCBrZXksIGhhc2gpOworICAgIH0KKyAgICBpID0gaGFzaCAmIG1hc2s7CisgICAgZXAgPSAmZXAwW2ldOworICAgIGlmIChlcC0+bWVfa2V5ID09IE5VTEwgfHwgZXAtPm1lX2tleSA9PSBrZXkpCisgICAgICAgIHJldHVybiBlcDsKKyAgICBpZiAoZXAtPm1lX2tleSA9PSBkdW1teSkKKyAgICAgICAgZnJlZXNsb3QgPSBlcDsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGVwLT5tZV9oYXNoID09IGhhc2ggJiYgX1B5U3RyaW5nX0VxKGVwLT5tZV9rZXksIGtleSkpCisgICAgICAgICAgICByZXR1cm4gZXA7CisgICAgICAgIGZyZWVzbG90ID0gTlVMTDsKKyAgICB9CiAKLQkvKiBJbiB0aGUgbG9vcCwgbWVfa2V5ID09IGR1bW15IGlzIGJ5IGZhciAoZmFjdG9yIG9mIDEwMHMpIHRoZQotCSAgIGxlYXN0IGxpa2VseSBvdXRjb21lLCBzbyB0ZXN0IGZvciB0aGF0IGxhc3QuICovCi0JZm9yIChwZXJ0dXJiID0gaGFzaDsgOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7Ci0JCWkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKLQkJZXAgPSAmZXAwW2kgJiBtYXNrXTsKLQkJaWYgKGVwLT5tZV9rZXkgPT0gTlVMTCkKLQkJCXJldHVybiBmcmVlc2xvdCA9PSBOVUxMID8gZXAgOiBmcmVlc2xvdDsKLQkJaWYgKGVwLT5tZV9rZXkgPT0ga2V5Ci0JCSAgICB8fCAoZXAtPm1lX2hhc2ggPT0gaGFzaAotCQkgICAgICAgICYmIGVwLT5tZV9rZXkgIT0gZHVtbXkKLQkJCSYmIF9QeVN0cmluZ19FcShlcC0+bWVfa2V5LCBrZXkpKSkKLQkJCXJldHVybiBlcDsKLQkJaWYgKGVwLT5tZV9rZXkgPT0gZHVtbXkgJiYgZnJlZXNsb3QgPT0gTlVMTCkKLQkJCWZyZWVzbG90ID0gZXA7Ci0JfQotCWFzc2VydCgwKTsJLyogTk9UIFJFQUNIRUQgKi8KLQlyZXR1cm4gMDsKKyAgICAvKiBJbiB0aGUgbG9vcCwgbWVfa2V5ID09IGR1bW15IGlzIGJ5IGZhciAoZmFjdG9yIG9mIDEwMHMpIHRoZQorICAgICAgIGxlYXN0IGxpa2VseSBvdXRjb21lLCBzbyB0ZXN0IGZvciB0aGF0IGxhc3QuICovCisgICAgZm9yIChwZXJ0dXJiID0gaGFzaDsgOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7CisgICAgICAgIGkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKKyAgICAgICAgZXAgPSAmZXAwW2kgJiBtYXNrXTsKKyAgICAgICAgaWYgKGVwLT5tZV9rZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBmcmVlc2xvdCA9PSBOVUxMID8gZXAgOiBmcmVlc2xvdDsKKyAgICAgICAgaWYgKGVwLT5tZV9rZXkgPT0ga2V5CisgICAgICAgICAgICB8fCAoZXAtPm1lX2hhc2ggPT0gaGFzaAorICAgICAgICAgICAgJiYgZXAtPm1lX2tleSAhPSBkdW1teQorICAgICAgICAgICAgJiYgX1B5U3RyaW5nX0VxKGVwLT5tZV9rZXksIGtleSkpKQorICAgICAgICAgICAgcmV0dXJuIGVwOworICAgICAgICBpZiAoZXAtPm1lX2tleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgZnJlZXNsb3QgPSBlcDsKKyAgICB9CisgICAgYXNzZXJ0KDApOyAgICAgICAgICAvKiBOT1QgUkVBQ0hFRCAqLworICAgIHJldHVybiAwOwogfQogCiAvKgpAQCAtNDQyLDM2ICs0NDIsMzYgQEAKIHN0YXRpYyBpbnQKIGluc2VydGRpY3QocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKm9sZF92YWx1ZTsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7Ci0JdHlwZWRlZiBQeURpY3RFbnRyeSAqKCpsb29rdXBmdW5jKShQeURpY3RPYmplY3QgKiwgUHlPYmplY3QgKiwgbG9uZyk7CisgICAgUHlPYmplY3QgKm9sZF92YWx1ZTsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgdHlwZWRlZiBQeURpY3RFbnRyeSAqKCpsb29rdXBmdW5jKShQeURpY3RPYmplY3QgKiwgUHlPYmplY3QgKiwgbG9uZyk7CiAKLQlhc3NlcnQobXAtPm1hX2xvb2t1cCAhPSBOVUxMKTsKLQllcCA9IG1wLT5tYV9sb29rdXAobXAsIGtleSwgaGFzaCk7Ci0JaWYgKGVwID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGVwLT5tZV92YWx1ZSAhPSBOVUxMKSB7Ci0JCW9sZF92YWx1ZSA9IGVwLT5tZV92YWx1ZTsKLQkJZXAtPm1lX3ZhbHVlID0gdmFsdWU7Ci0JCVB5X0RFQ1JFRihvbGRfdmFsdWUpOyAvKiB3aGljaCAqKkNBTioqIHJlLWVudGVyICovCi0JCVB5X0RFQ1JFRihrZXkpOwotCX0KLQllbHNlIHsKLQkJaWYgKGVwLT5tZV9rZXkgPT0gTlVMTCkKLQkJCW1wLT5tYV9maWxsKys7Ci0JCWVsc2UgewotCQkJYXNzZXJ0KGVwLT5tZV9rZXkgPT0gZHVtbXkpOwotCQkJUHlfREVDUkVGKGR1bW15KTsKLQkJfQotCQllcC0+bWVfa2V5ID0ga2V5OwotCQllcC0+bWVfaGFzaCA9IChQeV9zc2l6ZV90KWhhc2g7Ci0JCWVwLT5tZV92YWx1ZSA9IHZhbHVlOwotCQltcC0+bWFfdXNlZCsrOwotCX0KLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQobXAtPm1hX2xvb2t1cCAhPSBOVUxMKTsKKyAgICBlcCA9IG1wLT5tYV9sb29rdXAobXAsIGtleSwgaGFzaCk7CisgICAgaWYgKGVwID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGVwLT5tZV92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIG9sZF92YWx1ZSA9IGVwLT5tZV92YWx1ZTsKKyAgICAgICAgZXAtPm1lX3ZhbHVlID0gdmFsdWU7CisgICAgICAgIFB5X0RFQ1JFRihvbGRfdmFsdWUpOyAvKiB3aGljaCAqKkNBTioqIHJlLWVudGVyICovCisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGVwLT5tZV9rZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIG1wLT5tYV9maWxsKys7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGVwLT5tZV9rZXkgPT0gZHVtbXkpOworICAgICAgICAgICAgUHlfREVDUkVGKGR1bW15KTsKKyAgICAgICAgfQorICAgICAgICBlcC0+bWVfa2V5ID0ga2V5OworICAgICAgICBlcC0+bWVfaGFzaCA9IChQeV9zc2l6ZV90KWhhc2g7CisgICAgICAgIGVwLT5tZV92YWx1ZSA9IHZhbHVlOworICAgICAgICBtcC0+bWFfdXNlZCsrOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQ4NCwyNiArNDg0LDI2IEBACiAqLwogc3RhdGljIHZvaWQKIGluc2VydGRpY3RfY2xlYW4ocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoLAotCQkgUHlPYmplY3QgKnZhbHVlKQorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JcmVnaXN0ZXIgc2l6ZV90IGk7Ci0JcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7Ci0JcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSAoc2l6ZV90KW1wLT5tYV9tYXNrOwotCVB5RGljdEVudHJ5ICplcDAgPSBtcC0+bWFfdGFibGU7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOworICAgIHJlZ2lzdGVyIHNpemVfdCBpOworICAgIHJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOworICAgIHJlZ2lzdGVyIHNpemVfdCBtYXNrID0gKHNpemVfdCltcC0+bWFfbWFzazsKKyAgICBQeURpY3RFbnRyeSAqZXAwID0gbXAtPm1hX3RhYmxlOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKIAotCWkgPSBoYXNoICYgbWFzazsKLQllcCA9ICZlcDBbaV07Ci0JZm9yIChwZXJ0dXJiID0gaGFzaDsgZXAtPm1lX2tleSAhPSBOVUxMOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7Ci0JCWkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKLQkJZXAgPSAmZXAwW2kgJiBtYXNrXTsKLQl9Ci0JYXNzZXJ0KGVwLT5tZV92YWx1ZSA9PSBOVUxMKTsKLQltcC0+bWFfZmlsbCsrOwotCWVwLT5tZV9rZXkgPSBrZXk7Ci0JZXAtPm1lX2hhc2ggPSAoUHlfc3NpemVfdCloYXNoOwotCWVwLT5tZV92YWx1ZSA9IHZhbHVlOwotCW1wLT5tYV91c2VkKys7CisgICAgaSA9IGhhc2ggJiBtYXNrOworICAgIGVwID0gJmVwMFtpXTsKKyAgICBmb3IgKHBlcnR1cmIgPSBoYXNoOyBlcC0+bWVfa2V5ICE9IE5VTEw7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKKyAgICAgICAgaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOworICAgICAgICBlcCA9ICZlcDBbaSAmIG1hc2tdOworICAgIH0KKyAgICBhc3NlcnQoZXAtPm1lX3ZhbHVlID09IE5VTEwpOworICAgIG1wLT5tYV9maWxsKys7CisgICAgZXAtPm1lX2tleSA9IGtleTsKKyAgICBlcC0+bWVfaGFzaCA9IChQeV9zc2l6ZV90KWhhc2g7CisgICAgZXAtPm1lX3ZhbHVlID0gdmFsdWU7CisgICAgbXAtPm1hX3VzZWQrKzsKIH0KIAogLyoKQEAgLTUxNCw4NCArNTE0LDg0IEBACiBzdGF0aWMgaW50CiBkaWN0cmVzaXplKFB5RGljdE9iamVjdCAqbXAsIFB5X3NzaXplX3QgbWludXNlZCkKIHsKLQlQeV9zc2l6ZV90IG5ld3NpemU7Ci0JUHlEaWN0RW50cnkgKm9sZHRhYmxlLCAqbmV3dGFibGUsICplcDsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IGlzX29sZHRhYmxlX21hbGxvY2VkOwotCVB5RGljdEVudHJ5IHNtYWxsX2NvcHlbUHlEaWN0X01JTlNJWkVdOworICAgIFB5X3NzaXplX3QgbmV3c2l6ZTsKKyAgICBQeURpY3RFbnRyeSAqb2xkdGFibGUsICpuZXd0YWJsZSwgKmVwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgaXNfb2xkdGFibGVfbWFsbG9jZWQ7CisgICAgUHlEaWN0RW50cnkgc21hbGxfY29weVtQeURpY3RfTUlOU0laRV07CiAKLQlhc3NlcnQobWludXNlZCA+PSAwKTsKKyAgICBhc3NlcnQobWludXNlZCA+PSAwKTsKIAotCS8qIEZpbmQgdGhlIHNtYWxsZXN0IHRhYmxlIHNpemUgPiBtaW51c2VkLiAqLwotCWZvciAobmV3c2l6ZSA9IFB5RGljdF9NSU5TSVpFOwotCSAgICAgbmV3c2l6ZSA8PSBtaW51c2VkICYmIG5ld3NpemUgPiAwOwotCSAgICAgbmV3c2l6ZSA8PD0gMSkKLQkJOwotCWlmIChuZXdzaXplIDw9IDApIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBGaW5kIHRoZSBzbWFsbGVzdCB0YWJsZSBzaXplID4gbWludXNlZC4gKi8KKyAgICBmb3IgKG5ld3NpemUgPSBQeURpY3RfTUlOU0laRTsKKyAgICAgICAgIG5ld3NpemUgPD0gbWludXNlZCAmJiBuZXdzaXplID4gMDsKKyAgICAgICAgIG5ld3NpemUgPDw9IDEpCisgICAgICAgIDsKKyAgICBpZiAobmV3c2l6ZSA8PSAwKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBHZXQgc3BhY2UgZm9yIGEgbmV3IHRhYmxlLiAqLwotCW9sZHRhYmxlID0gbXAtPm1hX3RhYmxlOwotCWFzc2VydChvbGR0YWJsZSAhPSBOVUxMKTsKLQlpc19vbGR0YWJsZV9tYWxsb2NlZCA9IG9sZHRhYmxlICE9IG1wLT5tYV9zbWFsbHRhYmxlOworICAgIC8qIEdldCBzcGFjZSBmb3IgYSBuZXcgdGFibGUuICovCisgICAgb2xkdGFibGUgPSBtcC0+bWFfdGFibGU7CisgICAgYXNzZXJ0KG9sZHRhYmxlICE9IE5VTEwpOworICAgIGlzX29sZHRhYmxlX21hbGxvY2VkID0gb2xkdGFibGUgIT0gbXAtPm1hX3NtYWxsdGFibGU7CiAKLQlpZiAobmV3c2l6ZSA9PSBQeURpY3RfTUlOU0laRSkgewotCQkvKiBBIGxhcmdlIHRhYmxlIGlzIHNocmlua2luZywgb3Igd2UgY2FuJ3QgZ2V0IGFueSBzbWFsbGVyLiAqLwotCQluZXd0YWJsZSA9IG1wLT5tYV9zbWFsbHRhYmxlOwotCQlpZiAobmV3dGFibGUgPT0gb2xkdGFibGUpIHsKLQkJCWlmIChtcC0+bWFfZmlsbCA9PSBtcC0+bWFfdXNlZCkgewotCQkJCS8qIE5vIGR1bW1pZXMsIHNvIG5vIHBvaW50IGRvaW5nIGFueXRoaW5nLiAqLwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJLyogV2UncmUgbm90IGdvaW5nIHRvIHJlc2l6ZSBpdCwgYnV0IHJlYnVpbGQgdGhlCi0JCQkgICB0YWJsZSBhbnl3YXkgdG8gcHVyZ2Ugb2xkIGR1bW15IGVudHJpZXMuCi0JCQkgICBTdWJ0bGU6ICBUaGlzIGlzICpuZWNlc3NhcnkqIGlmIGZpbGw9PXNpemUsCi0JCQkgICBhcyBsb29rZGljdCBuZWVkcyBhdCBsZWFzdCBvbmUgdmlyZ2luIHNsb3QgdG8KLQkJCSAgIHRlcm1pbmF0ZSBmYWlsaW5nIHNlYXJjaGVzLiAgSWYgZmlsbCA8IHNpemUsIGl0J3MKLQkJCSAgIG1lcmVseSBkZXNpcmFibGUsIGFzIGR1bW1pZXMgc2xvdyBzZWFyY2hlcy4gKi8KLQkJCWFzc2VydChtcC0+bWFfZmlsbCA+IG1wLT5tYV91c2VkKTsKLQkJCW1lbWNweShzbWFsbF9jb3B5LCBvbGR0YWJsZSwgc2l6ZW9mKHNtYWxsX2NvcHkpKTsKLQkJCW9sZHRhYmxlID0gc21hbGxfY29weTsKLQkJfQotCX0KLQllbHNlIHsKLQkJbmV3dGFibGUgPSBQeU1lbV9ORVcoUHlEaWN0RW50cnksIG5ld3NpemUpOwotCQlpZiAobmV3dGFibGUgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICBpZiAobmV3c2l6ZSA9PSBQeURpY3RfTUlOU0laRSkgeworICAgICAgICAvKiBBIGxhcmdlIHRhYmxlIGlzIHNocmlua2luZywgb3Igd2UgY2FuJ3QgZ2V0IGFueSBzbWFsbGVyLiAqLworICAgICAgICBuZXd0YWJsZSA9IG1wLT5tYV9zbWFsbHRhYmxlOworICAgICAgICBpZiAobmV3dGFibGUgPT0gb2xkdGFibGUpIHsKKyAgICAgICAgICAgIGlmIChtcC0+bWFfZmlsbCA9PSBtcC0+bWFfdXNlZCkgeworICAgICAgICAgICAgICAgIC8qIE5vIGR1bW1pZXMsIHNvIG5vIHBvaW50IGRvaW5nIGFueXRoaW5nLiAqLworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogV2UncmUgbm90IGdvaW5nIHRvIHJlc2l6ZSBpdCwgYnV0IHJlYnVpbGQgdGhlCisgICAgICAgICAgICAgICB0YWJsZSBhbnl3YXkgdG8gcHVyZ2Ugb2xkIGR1bW15IGVudHJpZXMuCisgICAgICAgICAgICAgICBTdWJ0bGU6ICBUaGlzIGlzICpuZWNlc3NhcnkqIGlmIGZpbGw9PXNpemUsCisgICAgICAgICAgICAgICBhcyBsb29rZGljdCBuZWVkcyBhdCBsZWFzdCBvbmUgdmlyZ2luIHNsb3QgdG8KKyAgICAgICAgICAgICAgIHRlcm1pbmF0ZSBmYWlsaW5nIHNlYXJjaGVzLiAgSWYgZmlsbCA8IHNpemUsIGl0J3MKKyAgICAgICAgICAgICAgIG1lcmVseSBkZXNpcmFibGUsIGFzIGR1bW1pZXMgc2xvdyBzZWFyY2hlcy4gKi8KKyAgICAgICAgICAgIGFzc2VydChtcC0+bWFfZmlsbCA+IG1wLT5tYV91c2VkKTsKKyAgICAgICAgICAgIG1lbWNweShzbWFsbF9jb3B5LCBvbGR0YWJsZSwgc2l6ZW9mKHNtYWxsX2NvcHkpKTsKKyAgICAgICAgICAgIG9sZHRhYmxlID0gc21hbGxfY29weTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbmV3dGFibGUgPSBQeU1lbV9ORVcoUHlEaWN0RW50cnksIG5ld3NpemUpOworICAgICAgICBpZiAobmV3dGFibGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIE1ha2UgdGhlIGRpY3QgZW1wdHksIHVzaW5nIHRoZSBuZXcgdGFibGUuICovCi0JYXNzZXJ0KG5ld3RhYmxlICE9IG9sZHRhYmxlKTsKLQltcC0+bWFfdGFibGUgPSBuZXd0YWJsZTsKLQltcC0+bWFfbWFzayA9IG5ld3NpemUgLSAxOwotCW1lbXNldChuZXd0YWJsZSwgMCwgc2l6ZW9mKFB5RGljdEVudHJ5KSAqIG5ld3NpemUpOwotCW1wLT5tYV91c2VkID0gMDsKLQlpID0gbXAtPm1hX2ZpbGw7Ci0JbXAtPm1hX2ZpbGwgPSAwOworICAgIC8qIE1ha2UgdGhlIGRpY3QgZW1wdHksIHVzaW5nIHRoZSBuZXcgdGFibGUuICovCisgICAgYXNzZXJ0KG5ld3RhYmxlICE9IG9sZHRhYmxlKTsKKyAgICBtcC0+bWFfdGFibGUgPSBuZXd0YWJsZTsKKyAgICBtcC0+bWFfbWFzayA9IG5ld3NpemUgLSAxOworICAgIG1lbXNldChuZXd0YWJsZSwgMCwgc2l6ZW9mKFB5RGljdEVudHJ5KSAqIG5ld3NpemUpOworICAgIG1wLT5tYV91c2VkID0gMDsKKyAgICBpID0gbXAtPm1hX2ZpbGw7CisgICAgbXAtPm1hX2ZpbGwgPSAwOwogCi0JLyogQ29weSB0aGUgZGF0YSBvdmVyOyB0aGlzIGlzIHJlZmNvdW50LW5ldXRyYWwgZm9yIGFjdGl2ZSBlbnRyaWVzOwotCSAgIGR1bW15IGVudHJpZXMgYXJlbid0IGNvcGllZCBvdmVyLCBvZiBjb3Vyc2UgKi8KLQlmb3IgKGVwID0gb2xkdGFibGU7IGkgPiAwOyBlcCsrKSB7Ci0JCWlmIChlcC0+bWVfdmFsdWUgIT0gTlVMTCkgewkvKiBhY3RpdmUgZW50cnkgKi8KLQkJCS0taTsKLQkJCWluc2VydGRpY3RfY2xlYW4obXAsIGVwLT5tZV9rZXksIChsb25nKWVwLT5tZV9oYXNoLAotCQkJCQkgZXAtPm1lX3ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChlcC0+bWVfa2V5ICE9IE5VTEwpIHsJLyogZHVtbXkgZW50cnkgKi8KLQkJCS0taTsKLQkJCWFzc2VydChlcC0+bWVfa2V5ID09IGR1bW15KTsKLQkJCVB5X0RFQ1JFRihlcC0+bWVfa2V5KTsKLQkJfQotCQkvKiBlbHNlIGtleSA9PSB2YWx1ZSA9PSBOVUxMOiAgbm90aGluZyB0byBkbyAqLwotCX0KKyAgICAvKiBDb3B5IHRoZSBkYXRhIG92ZXI7IHRoaXMgaXMgcmVmY291bnQtbmV1dHJhbCBmb3IgYWN0aXZlIGVudHJpZXM7CisgICAgICAgZHVtbXkgZW50cmllcyBhcmVuJ3QgY29waWVkIG92ZXIsIG9mIGNvdXJzZSAqLworICAgIGZvciAoZXAgPSBvbGR0YWJsZTsgaSA+IDA7IGVwKyspIHsKKyAgICAgICAgaWYgKGVwLT5tZV92YWx1ZSAhPSBOVUxMKSB7ICAgICAgICAgICAgIC8qIGFjdGl2ZSBlbnRyeSAqLworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgaW5zZXJ0ZGljdF9jbGVhbihtcCwgZXAtPm1lX2tleSwgKGxvbmcpZXAtPm1lX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwLT5tZV92YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXAtPm1lX2tleSAhPSBOVUxMKSB7ICAgICAgICAgIC8qIGR1bW15IGVudHJ5ICovCisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBhc3NlcnQoZXAtPm1lX2tleSA9PSBkdW1teSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXAtPm1lX2tleSk7CisgICAgICAgIH0KKyAgICAgICAgLyogZWxzZSBrZXkgPT0gdmFsdWUgPT0gTlVMTDogIG5vdGhpbmcgdG8gZG8gKi8KKyAgICB9CiAKLQlpZiAoaXNfb2xkdGFibGVfbWFsbG9jZWQpCi0JCVB5TWVtX0RFTChvbGR0YWJsZSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGlzX29sZHRhYmxlX21hbGxvY2VkKQorICAgICAgICBQeU1lbV9ERUwob2xkdGFibGUpOworICAgIHJldHVybiAwOwogfQogCiAvKiBDcmVhdGUgYSBuZXcgZGljdGlvbmFyeSBwcmUtc2l6ZWQgdG8gaG9sZCBhbiBlc3RpbWF0ZWQgbnVtYmVyIG9mIGVsZW1lbnRzLgpAQCAtNjAyLDEzICs2MDIsMTMgQEAKIFB5T2JqZWN0ICoKIF9QeURpY3RfTmV3UHJlc2l6ZWQoUHlfc3NpemVfdCBtaW51c2VkKQogewotCVB5T2JqZWN0ICpvcCA9IFB5RGljdF9OZXcoKTsKKyAgICBQeU9iamVjdCAqb3AgPSBQeURpY3RfTmV3KCk7CiAKLQlpZiAobWludXNlZD41ICYmIG9wICE9IE5VTEwgJiYgZGljdHJlc2l6ZSgoUHlEaWN0T2JqZWN0ICopb3AsIG1pbnVzZWQpID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihvcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gb3A7CisgICAgaWYgKG1pbnVzZWQ+NSAmJiBvcCAhPSBOVUxMICYmIGRpY3RyZXNpemUoKFB5RGljdE9iamVjdCAqKW9wLCBtaW51c2VkKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYob3ApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG9wOwogfQogCiAvKiBOb3RlIHRoYXQsIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIFB5RGljdF9HZXRJdGVtKCkgc3VwcHJlc3NlcyBhbGwgZXJyb3JzCkBAIC02MjQsNDQgKzYyNCw0NCBAQAogUHlPYmplY3QgKgogUHlEaWN0X0dldEl0ZW0oUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5KQogewotCWxvbmcgaGFzaDsKLQlQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKW9wOwotCVB5RGljdEVudHJ5ICplcDsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGU7Ci0JaWYgKCFQeURpY3RfQ2hlY2sob3ApKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKQotCXsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBsb25nIGhhc2g7CisgICAgUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKKyAgICBQeURpY3RFbnRyeSAqZXA7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIGlmICghUHlEaWN0X0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKKyAgICAgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkKKyAgICB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBXZSBjYW4gYXJyaXZlIGhlcmUgd2l0aCBhIE5VTEwgdHN0YXRlIGR1cmluZyBpbml0aWFsaXphdGlvbjoKLQkgICB0cnkgcnVubmluZyAicHl0aG9uIC1XaSIgZm9yIGFuIGV4YW1wbGUgcmVsYXRlZCB0byBzdHJpbmcKLQkgICBpbnRlcm5pbmcuICBMZXQncyBqdXN0IGhvcGUgdGhhdCBubyBleGNlcHRpb24gb2NjdXJzIHRoZW4uLi4gKi8KLQl0c3RhdGUgPSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OwotCWlmICh0c3RhdGUgIT0gTlVMTCAmJiB0c3RhdGUtPmN1cmV4Y190eXBlICE9IE5VTEwpIHsKLQkJLyogcHJlc2VydmUgdGhlIGV4aXN0aW5nIGV4Y2VwdGlvbiAqLwotCQlQeU9iamVjdCAqZXJyX3R5cGUsICplcnJfdmFsdWUsICplcnJfdGI7Ci0JCVB5RXJyX0ZldGNoKCZlcnJfdHlwZSwgJmVycl92YWx1ZSwgJmVycl90Yik7Ci0JCWVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOwotCQkvKiBpZ25vcmUgZXJyb3JzICovCi0JCVB5RXJyX1Jlc3RvcmUoZXJyX3R5cGUsIGVycl92YWx1ZSwgZXJyX3RiKTsKLQkJaWYgKGVwID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCWVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOwotCQlpZiAoZXAgPT0gTlVMTCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBlcC0+bWVfdmFsdWU7CisgICAgLyogV2UgY2FuIGFycml2ZSBoZXJlIHdpdGggYSBOVUxMIHRzdGF0ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb246CisgICAgICAgdHJ5IHJ1bm5pbmcgInB5dGhvbiAtV2kiIGZvciBhbiBleGFtcGxlIHJlbGF0ZWQgdG8gc3RyaW5nCisgICAgICAgaW50ZXJuaW5nLiAgTGV0J3MganVzdCBob3BlIHRoYXQgbm8gZXhjZXB0aW9uIG9jY3VycyB0aGVuLi4uICovCisgICAgdHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKKyAgICBpZiAodHN0YXRlICE9IE5VTEwgJiYgdHN0YXRlLT5jdXJleGNfdHlwZSAhPSBOVUxMKSB7CisgICAgICAgIC8qIHByZXNlcnZlIHRoZSBleGlzdGluZyBleGNlcHRpb24gKi8KKyAgICAgICAgUHlPYmplY3QgKmVycl90eXBlLCAqZXJyX3ZhbHVlLCAqZXJyX3RiOworICAgICAgICBQeUVycl9GZXRjaCgmZXJyX3R5cGUsICZlcnJfdmFsdWUsICZlcnJfdGIpOworICAgICAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICAgICAgLyogaWdub3JlIGVycm9ycyAqLworICAgICAgICBQeUVycl9SZXN0b3JlKGVycl90eXBlLCBlcnJfdmFsdWUsIGVycl90Yik7CisgICAgICAgIGlmIChlcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICAgICAgaWYgKGVwID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXAtPm1lX3ZhbHVlOwogfQogCiAvKiBDQVVUSU9OOiBQeURpY3RfU2V0SXRlbSgpIG11c3QgZ3VhcmFudGVlIHRoYXQgaXQgd29uJ3QgcmVzaXplIHRoZQpAQCAtNjczLDE1NyArNjczLDE1NyBAQAogaW50CiBQeURpY3RfU2V0SXRlbShyZWdpc3RlciBQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wOwotCXJlZ2lzdGVyIGxvbmcgaGFzaDsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IG5fdXNlZDsKKyAgICByZWdpc3RlciBQeURpY3RPYmplY3QgKm1wOworICAgIHJlZ2lzdGVyIGxvbmcgaGFzaDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IG5fdXNlZDsKIAotCWlmICghUHlEaWN0X0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlhc3NlcnQoa2V5KTsKLQlhc3NlcnQodmFsdWUpOwotCW1wID0gKFB5RGljdE9iamVjdCAqKW9wOwotCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKLQkJaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKilrZXkpLT5vYl9zaGFzaDsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCX0KLQllbHNlIHsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWFzc2VydChtcC0+bWFfZmlsbCA8PSBtcC0+bWFfbWFzayk7ICAvKiBhdCBsZWFzdCBvbmUgZW1wdHkgc2xvdCAqLwotCW5fdXNlZCA9IG1wLT5tYV91c2VkOwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JUHlfSU5DUkVGKGtleSk7Ci0JaWYgKGluc2VydGRpY3QobXAsIGtleSwgaGFzaCwgdmFsdWUpICE9IDApCi0JCXJldHVybiAtMTsKLQkvKiBJZiB3ZSBhZGRlZCBhIGtleSwgd2UgY2FuIHNhZmVseSByZXNpemUuICBPdGhlcndpc2UganVzdCByZXR1cm4hCi0JICogSWYgZmlsbCA+PSAyLzMgc2l6ZSwgYWRqdXN0IHNpemUuICBOb3JtYWxseSwgdGhpcyBkb3VibGVzIG9yCi0JICogcXVhZHVwbGVzIHRoZSBzaXplLCBidXQgaXQncyBhbHNvIHBvc3NpYmxlIGZvciB0aGUgZGljdCB0byBzaHJpbmsKLQkgKiAoaWYgbWFfZmlsbCBpcyBtdWNoIGxhcmdlciB0aGFuIG1hX3VzZWQsIG1lYW5pbmcgYSBsb3Qgb2YgZGljdAotCSAqIGtleXMgaGF2ZSBiZWVuICogZGVsZXRlZCkuCi0JICoKLQkgKiBRdWFkcnVwbGluZyB0aGUgc2l6ZSBpbXByb3ZlcyBhdmVyYWdlIGRpY3Rpb25hcnkgc3BhcnNlbmVzcwotCSAqIChyZWR1Y2luZyBjb2xsaXNpb25zKSBhdCB0aGUgY29zdCBvZiBzb21lIG1lbW9yeSBhbmQgaXRlcmF0aW9uCi0JICogc3BlZWQgKHdoaWNoIGxvb3BzIG92ZXIgZXZlcnkgcG9zc2libGUgZW50cnkpLiAgSXQgYWxzbyBoYWx2ZXMKLQkgKiB0aGUgbnVtYmVyIG9mIGV4cGVuc2l2ZSByZXNpemUgb3BlcmF0aW9ucyBpbiBhIGdyb3dpbmcgZGljdGlvbmFyeS4KLQkgKgotCSAqIFZlcnkgbGFyZ2UgZGljdGlvbmFyaWVzIChvdmVyIDUwSyBpdGVtcykgdXNlIGRvdWJsaW5nIGluc3RlYWQuCi0JICogVGhpcyBtYXkgaGVscCBhcHBsaWNhdGlvbnMgd2l0aCBzZXZlcmUgbWVtb3J5IGNvbnN0cmFpbnRzLgotCSAqLwotCWlmICghKG1wLT5tYV91c2VkID4gbl91c2VkICYmIG1wLT5tYV9maWxsKjMgPj0gKG1wLT5tYV9tYXNrKzEpKjIpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gZGljdHJlc2l6ZShtcCwgKG1wLT5tYV91c2VkID4gNTAwMDAgPyAyIDogNCkgKiBtcC0+bWFfdXNlZCk7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFzc2VydChrZXkpOworICAgIGFzc2VydCh2YWx1ZSk7CisgICAgbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSkgeworICAgICAgICBoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKWtleSktPm9iX3NoYXNoOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYXNzZXJ0KG1wLT5tYV9maWxsIDw9IG1wLT5tYV9tYXNrKTsgIC8qIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90ICovCisgICAgbl91c2VkID0gbXAtPm1hX3VzZWQ7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICBpZiAoaW5zZXJ0ZGljdChtcCwga2V5LCBoYXNoLCB2YWx1ZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIElmIHdlIGFkZGVkIGEga2V5LCB3ZSBjYW4gc2FmZWx5IHJlc2l6ZS4gIE90aGVyd2lzZSBqdXN0IHJldHVybiEKKyAgICAgKiBJZiBmaWxsID49IDIvMyBzaXplLCBhZGp1c3Qgc2l6ZS4gIE5vcm1hbGx5LCB0aGlzIGRvdWJsZXMgb3IKKyAgICAgKiBxdWFkdXBsZXMgdGhlIHNpemUsIGJ1dCBpdCdzIGFsc28gcG9zc2libGUgZm9yIHRoZSBkaWN0IHRvIHNocmluaworICAgICAqIChpZiBtYV9maWxsIGlzIG11Y2ggbGFyZ2VyIHRoYW4gbWFfdXNlZCwgbWVhbmluZyBhIGxvdCBvZiBkaWN0CisgICAgICoga2V5cyBoYXZlIGJlZW4gKiBkZWxldGVkKS4KKyAgICAgKgorICAgICAqIFF1YWRydXBsaW5nIHRoZSBzaXplIGltcHJvdmVzIGF2ZXJhZ2UgZGljdGlvbmFyeSBzcGFyc2VuZXNzCisgICAgICogKHJlZHVjaW5nIGNvbGxpc2lvbnMpIGF0IHRoZSBjb3N0IG9mIHNvbWUgbWVtb3J5IGFuZCBpdGVyYXRpb24KKyAgICAgKiBzcGVlZCAod2hpY2ggbG9vcHMgb3ZlciBldmVyeSBwb3NzaWJsZSBlbnRyeSkuICBJdCBhbHNvIGhhbHZlcworICAgICAqIHRoZSBudW1iZXIgb2YgZXhwZW5zaXZlIHJlc2l6ZSBvcGVyYXRpb25zIGluIGEgZ3Jvd2luZyBkaWN0aW9uYXJ5LgorICAgICAqCisgICAgICogVmVyeSBsYXJnZSBkaWN0aW9uYXJpZXMgKG92ZXIgNTBLIGl0ZW1zKSB1c2UgZG91YmxpbmcgaW5zdGVhZC4KKyAgICAgKiBUaGlzIG1heSBoZWxwIGFwcGxpY2F0aW9ucyB3aXRoIHNldmVyZSBtZW1vcnkgY29uc3RyYWludHMuCisgICAgICovCisgICAgaWYgKCEobXAtPm1hX3VzZWQgPiBuX3VzZWQgJiYgbXAtPm1hX2ZpbGwqMyA+PSAobXAtPm1hX21hc2srMSkqMikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBkaWN0cmVzaXplKG1wLCAobXAtPm1hX3VzZWQgPiA1MDAwMCA/IDIgOiA0KSAqIG1wLT5tYV91c2VkKTsKIH0KIAogaW50CiBQeURpY3RfRGVsSXRlbShQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICprZXkpCiB7Ci0JcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcDsKLQlyZWdpc3RlciBsb25nIGhhc2g7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCVB5T2JqZWN0ICpvbGRfdmFsdWUsICpvbGRfa2V5OworICAgIHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXA7CisgICAgcmVnaXN0ZXIgbG9uZyBoYXNoOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeU9iamVjdCAqb2xkX3ZhbHVlLCAqb2xkX2tleTsKIAotCWlmICghUHlEaWN0X0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlhc3NlcnQoa2V5KTsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQltcCA9IChQeURpY3RPYmplY3QgKilvcDsKLQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQlpZiAoZXAgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChlcC0+bWVfdmFsdWUgPT0gTlVMTCkgewotCQlzZXRfa2V5X2Vycm9yKGtleSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jb2xkX2tleSA9IGVwLT5tZV9rZXk7Ci0JUHlfSU5DUkVGKGR1bW15KTsKLQllcC0+bWVfa2V5ID0gZHVtbXk7Ci0Jb2xkX3ZhbHVlID0gZXAtPm1lX3ZhbHVlOwotCWVwLT5tZV92YWx1ZSA9IE5VTEw7Ci0JbXAtPm1hX3VzZWQtLTsKLQlQeV9ERUNSRUYob2xkX3ZhbHVlKTsKLQlQeV9ERUNSRUYob2xkX2tleSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFzc2VydChrZXkpOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1wID0gKFB5RGljdE9iamVjdCAqKW9wOworICAgIGVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOworICAgIGlmIChlcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGVwLT5tZV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHNldF9rZXlfZXJyb3Ioa2V5KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBvbGRfa2V5ID0gZXAtPm1lX2tleTsKKyAgICBQeV9JTkNSRUYoZHVtbXkpOworICAgIGVwLT5tZV9rZXkgPSBkdW1teTsKKyAgICBvbGRfdmFsdWUgPSBlcC0+bWVfdmFsdWU7CisgICAgZXAtPm1lX3ZhbHVlID0gTlVMTDsKKyAgICBtcC0+bWFfdXNlZC0tOworICAgIFB5X0RFQ1JFRihvbGRfdmFsdWUpOworICAgIFB5X0RFQ1JFRihvbGRfa2V5KTsKKyAgICByZXR1cm4gMDsKIH0KIAogdm9pZAogUHlEaWN0X0NsZWFyKFB5T2JqZWN0ICpvcCkKIHsKLQlQeURpY3RPYmplY3QgKm1wOwotCVB5RGljdEVudHJ5ICplcCwgKnRhYmxlOwotCWludCB0YWJsZV9pc19tYWxsb2NlZDsKLQlQeV9zc2l6ZV90IGZpbGw7Ci0JUHlEaWN0RW50cnkgc21hbGxfY29weVtQeURpY3RfTUlOU0laRV07CisgICAgUHlEaWN0T2JqZWN0ICptcDsKKyAgICBQeURpY3RFbnRyeSAqZXAsICp0YWJsZTsKKyAgICBpbnQgdGFibGVfaXNfbWFsbG9jZWQ7CisgICAgUHlfc3NpemVfdCBmaWxsOworICAgIFB5RGljdEVudHJ5IHNtYWxsX2NvcHlbUHlEaWN0X01JTlNJWkVdOwogI2lmZGVmIFB5X0RFQlVHCi0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5X3NzaXplX3QgaSwgbjsKICNlbmRpZgogCi0JaWYgKCFQeURpY3RfQ2hlY2sob3ApKQotCQlyZXR1cm47Ci0JbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm47CisgICAgbXAgPSAoUHlEaWN0T2JqZWN0ICopb3A7CiAjaWZkZWYgUHlfREVCVUcKLQluID0gbXAtPm1hX21hc2sgKyAxOwotCWkgPSAwOworICAgIG4gPSBtcC0+bWFfbWFzayArIDE7CisgICAgaSA9IDA7CiAjZW5kaWYKIAotCXRhYmxlID0gbXAtPm1hX3RhYmxlOwotCWFzc2VydCh0YWJsZSAhPSBOVUxMKTsKLQl0YWJsZV9pc19tYWxsb2NlZCA9IHRhYmxlICE9IG1wLT5tYV9zbWFsbHRhYmxlOworICAgIHRhYmxlID0gbXAtPm1hX3RhYmxlOworICAgIGFzc2VydCh0YWJsZSAhPSBOVUxMKTsKKyAgICB0YWJsZV9pc19tYWxsb2NlZCA9IHRhYmxlICE9IG1wLT5tYV9zbWFsbHRhYmxlOwogCi0JLyogVGhpcyBpcyBkZWxpY2F0ZS4gIER1cmluZyB0aGUgcHJvY2VzcyBvZiBjbGVhcmluZyB0aGUgZGljdCwKLQkgKiBkZWNyZWZzIGNhbiBjYXVzZSB0aGUgZGljdCB0byBtdXRhdGUuICBUbyBhdm9pZCBmYXRhbCBjb25mdXNpb24KLQkgKiAodm9pY2Ugb2YgZXhwZXJpZW5jZSksIHdlIGhhdmUgdG8gbWFrZSB0aGUgZGljdCBlbXB0eSBiZWZvcmUKLQkgKiBjbGVhcmluZyB0aGUgc2xvdHMsIGFuZCBuZXZlciByZWZlciB0byBhbnl0aGluZyB2aWEgbXAtPnh4eCB3aGlsZQotCSAqIGNsZWFyaW5nLgotCSAqLwotCWZpbGwgPSBtcC0+bWFfZmlsbDsKLQlpZiAodGFibGVfaXNfbWFsbG9jZWQpCi0JCUVNUFRZX1RPX01JTlNJWkUobXApOworICAgIC8qIFRoaXMgaXMgZGVsaWNhdGUuICBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY2xlYXJpbmcgdGhlIGRpY3QsCisgICAgICogZGVjcmVmcyBjYW4gY2F1c2UgdGhlIGRpY3QgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uCisgICAgICogKHZvaWNlIG9mIGV4cGVyaWVuY2UpLCB3ZSBoYXZlIHRvIG1ha2UgdGhlIGRpY3QgZW1wdHkgYmVmb3JlCisgICAgICogY2xlYXJpbmcgdGhlIHNsb3RzLCBhbmQgbmV2ZXIgcmVmZXIgdG8gYW55dGhpbmcgdmlhIG1wLT54eHggd2hpbGUKKyAgICAgKiBjbGVhcmluZy4KKyAgICAgKi8KKyAgICBmaWxsID0gbXAtPm1hX2ZpbGw7CisgICAgaWYgKHRhYmxlX2lzX21hbGxvY2VkKQorICAgICAgICBFTVBUWV9UT19NSU5TSVpFKG1wKTsKIAotCWVsc2UgaWYgKGZpbGwgPiAwKSB7Ci0JCS8qIEl0J3MgYSBzbWFsbCB0YWJsZSB3aXRoIHNvbWV0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGNsZWFyZWQuCi0JCSAqIEFmcmFpZCB0aGUgb25seSBzYWZlIHdheSBpcyB0byBjb3B5IHRoZSBkaWN0IGVudHJpZXMgaW50bwotCQkgKiBhbm90aGVyIHNtYWxsIHRhYmxlIGZpcnN0LgotCQkgKi8KLQkJbWVtY3B5KHNtYWxsX2NvcHksIHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOwotCQl0YWJsZSA9IHNtYWxsX2NvcHk7Ci0JCUVNUFRZX1RPX01JTlNJWkUobXApOwotCX0KLQkvKiBlbHNlIGl0J3MgYSBzbWFsbCB0YWJsZSB0aGF0J3MgYWxyZWFkeSBlbXB0eSAqLworICAgIGVsc2UgaWYgKGZpbGwgPiAwKSB7CisgICAgICAgIC8qIEl0J3MgYSBzbWFsbCB0YWJsZSB3aXRoIHNvbWV0aGluZyB0aGF0IG5lZWRzIHRvIGJlIGNsZWFyZWQuCisgICAgICAgICAqIEFmcmFpZCB0aGUgb25seSBzYWZlIHdheSBpcyB0byBjb3B5IHRoZSBkaWN0IGVudHJpZXMgaW50bworICAgICAgICAgKiBhbm90aGVyIHNtYWxsIHRhYmxlIGZpcnN0LgorICAgICAgICAgKi8KKyAgICAgICAgbWVtY3B5KHNtYWxsX2NvcHksIHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOworICAgICAgICB0YWJsZSA9IHNtYWxsX2NvcHk7CisgICAgICAgIEVNUFRZX1RPX01JTlNJWkUobXApOworICAgIH0KKyAgICAvKiBlbHNlIGl0J3MgYSBzbWFsbCB0YWJsZSB0aGF0J3MgYWxyZWFkeSBlbXB0eSAqLwogCi0JLyogTm93IHdlIGNhbiBmaW5hbGx5IGNsZWFyIHRoaW5ncy4gIElmIEMgaGFkIHJlZmNvdW50cywgd2UgY291bGQKLQkgKiBhc3NlcnQgdGhhdCB0aGUgcmVmY291bnQgb24gdGFibGUgaXMgMSBub3csIGkuZS4gdGhhdCB0aGlzIGZ1bmN0aW9uCi0JICogaGFzIHVuaXF1ZSBhY2Nlc3MgdG8gaXQsIHNvIGRlY3JlZiBzaWRlLWVmZmVjdHMgY2FuJ3QgYWx0ZXIgaXQuCi0JICovCi0JZm9yIChlcCA9IHRhYmxlOyBmaWxsID4gMDsgKytlcCkgeworICAgIC8qIE5vdyB3ZSBjYW4gZmluYWxseSBjbGVhciB0aGluZ3MuICBJZiBDIGhhZCByZWZjb3VudHMsIHdlIGNvdWxkCisgICAgICogYXNzZXJ0IHRoYXQgdGhlIHJlZmNvdW50IG9uIHRhYmxlIGlzIDEgbm93LCBpLmUuIHRoYXQgdGhpcyBmdW5jdGlvbgorICAgICAqIGhhcyB1bmlxdWUgYWNjZXNzIHRvIGl0LCBzbyBkZWNyZWYgc2lkZS1lZmZlY3RzIGNhbid0IGFsdGVyIGl0LgorICAgICAqLworICAgIGZvciAoZXAgPSB0YWJsZTsgZmlsbCA+IDA7ICsrZXApIHsKICNpZmRlZiBQeV9ERUJVRwotCQlhc3NlcnQoaSA8IG4pOwotCQkrK2k7CisgICAgICAgIGFzc2VydChpIDwgbik7CisgICAgICAgICsraTsKICNlbmRpZgotCQlpZiAoZXAtPm1lX2tleSkgewotCQkJLS1maWxsOwotCQkJUHlfREVDUkVGKGVwLT5tZV9rZXkpOwotCQkJUHlfWERFQ1JFRihlcC0+bWVfdmFsdWUpOwotCQl9CisgICAgICAgIGlmIChlcC0+bWVfa2V5KSB7CisgICAgICAgICAgICAtLWZpbGw7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXAtPm1lX2tleSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGVwLT5tZV92YWx1ZSk7CisgICAgICAgIH0KICNpZmRlZiBQeV9ERUJVRwotCQllbHNlCi0JCQlhc3NlcnQoZXAtPm1lX3ZhbHVlID09IE5VTEwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoZXAtPm1lX3ZhbHVlID09IE5VTEwpOwogI2VuZGlmCi0JfQorICAgIH0KIAotCWlmICh0YWJsZV9pc19tYWxsb2NlZCkKLQkJUHlNZW1fREVMKHRhYmxlKTsKKyAgICBpZiAodGFibGVfaXNfbWFsbG9jZWQpCisgICAgICAgIFB5TWVtX0RFTCh0YWJsZSk7CiB9CiAKIC8qCkBAIC04NDQsNTUgKzg0NCw1NSBAQAogaW50CiBQeURpY3RfTmV4dChQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgKnBwb3MsIFB5T2JqZWN0ICoqcGtleSwgUHlPYmplY3QgKipwdmFsdWUpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgbWFzazsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgbWFzazsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CiAKLQlpZiAoIVB5RGljdF9DaGVjayhvcCkpCi0JCXJldHVybiAwOwotCWkgPSAqcHBvczsKLQlpZiAoaSA8IDApCi0JCXJldHVybiAwOwotCWVwID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX3RhYmxlOwotCW1hc2sgPSAoKFB5RGljdE9iamVjdCAqKW9wKS0+bWFfbWFzazsKLQl3aGlsZSAoaSA8PSBtYXNrICYmIGVwW2ldLm1lX3ZhbHVlID09IE5VTEwpCi0JCWkrKzsKLQkqcHBvcyA9IGkrMTsKLQlpZiAoaSA+IG1hc2spCi0JCXJldHVybiAwOwotCWlmIChwa2V5KQotCQkqcGtleSA9IGVwW2ldLm1lX2tleTsKLQlpZiAocHZhbHVlKQotCQkqcHZhbHVlID0gZXBbaV0ubWVfdmFsdWU7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpID0gKnBwb3M7CisgICAgaWYgKGkgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlcCA9ICgoUHlEaWN0T2JqZWN0ICopb3ApLT5tYV90YWJsZTsKKyAgICBtYXNrID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX21hc2s7CisgICAgd2hpbGUgKGkgPD0gbWFzayAmJiBlcFtpXS5tZV92YWx1ZSA9PSBOVUxMKQorICAgICAgICBpKys7CisgICAgKnBwb3MgPSBpKzE7CisgICAgaWYgKGkgPiBtYXNrKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocGtleSkKKyAgICAgICAgKnBrZXkgPSBlcFtpXS5tZV9rZXk7CisgICAgaWYgKHB2YWx1ZSkKKyAgICAgICAgKnB2YWx1ZSA9IGVwW2ldLm1lX3ZhbHVlOworICAgIHJldHVybiAxOwogfQogCiAvKiBJbnRlcm5hbCB2ZXJzaW9uIG9mIFB5RGljdF9OZXh0IHRoYXQgcmV0dXJucyBhIGhhc2ggdmFsdWUgaW4gYWRkaXRpb24gdG8gdGhlIGtleSBhbmQgdmFsdWUuKi8KIGludAogX1B5RGljdF9OZXh0KFB5T2JqZWN0ICpvcCwgUHlfc3NpemVfdCAqcHBvcywgUHlPYmplY3QgKipwa2V5LCBQeU9iamVjdCAqKnB2YWx1ZSwgbG9uZyAqcGhhc2gpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgbWFzazsKLQlyZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgbWFzazsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CiAKLQlpZiAoIVB5RGljdF9DaGVjayhvcCkpCi0JCXJldHVybiAwOwotCWkgPSAqcHBvczsKLQlpZiAoaSA8IDApCi0JCXJldHVybiAwOwotCWVwID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX3RhYmxlOwotCW1hc2sgPSAoKFB5RGljdE9iamVjdCAqKW9wKS0+bWFfbWFzazsKLQl3aGlsZSAoaSA8PSBtYXNrICYmIGVwW2ldLm1lX3ZhbHVlID09IE5VTEwpCi0JCWkrKzsKLQkqcHBvcyA9IGkrMTsKLQlpZiAoaSA+IG1hc2spCi0JCXJldHVybiAwOwotICAgICAgICAqcGhhc2ggPSAobG9uZykoZXBbaV0ubWVfaGFzaCk7Ci0JaWYgKHBrZXkpCi0JCSpwa2V5ID0gZXBbaV0ubWVfa2V5OwotCWlmIChwdmFsdWUpCi0JCSpwdmFsdWUgPSBlcFtpXS5tZV92YWx1ZTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5RGljdF9DaGVjayhvcCkpCisgICAgICAgIHJldHVybiAwOworICAgIGkgPSAqcHBvczsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGVwID0gKChQeURpY3RPYmplY3QgKilvcCktPm1hX3RhYmxlOworICAgIG1hc2sgPSAoKFB5RGljdE9iamVjdCAqKW9wKS0+bWFfbWFzazsKKyAgICB3aGlsZSAoaSA8PSBtYXNrICYmIGVwW2ldLm1lX3ZhbHVlID09IE5VTEwpCisgICAgICAgIGkrKzsKKyAgICAqcHBvcyA9IGkrMTsKKyAgICBpZiAoaSA+IG1hc2spCisgICAgICAgIHJldHVybiAwOworICAgICpwaGFzaCA9IChsb25nKShlcFtpXS5tZV9oYXNoKTsKKyAgICBpZiAocGtleSkKKyAgICAgICAgKnBrZXkgPSBlcFtpXS5tZV9rZXk7CisgICAgaWYgKHB2YWx1ZSkKKyAgICAgICAgKnB2YWx1ZSA9IGVwW2ldLm1lX3ZhbHVlOworICAgIHJldHVybiAxOwogfQogCiAvKiBNZXRob2RzICovCkBAIC05MDAsNDUyICs5MDAsNDUyIEBACiBzdGF0aWMgdm9pZAogZGljdF9kZWFsbG9jKHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXApCiB7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCVB5X3NzaXplX3QgZmlsbCA9IG1wLT5tYV9maWxsOwotIAlQeU9iamVjdF9HQ19VblRyYWNrKG1wKTsKLQlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG1wKQotCWZvciAoZXAgPSBtcC0+bWFfdGFibGU7IGZpbGwgPiAwOyBlcCsrKSB7Ci0JCWlmIChlcC0+bWVfa2V5KSB7Ci0JCQktLWZpbGw7Ci0JCQlQeV9ERUNSRUYoZXAtPm1lX2tleSk7Ci0JCQlQeV9YREVDUkVGKGVwLT5tZV92YWx1ZSk7Ci0JCX0KLQl9Ci0JaWYgKG1wLT5tYV90YWJsZSAhPSBtcC0+bWFfc21hbGx0YWJsZSkKLQkJUHlNZW1fREVMKG1wLT5tYV90YWJsZSk7Ci0JaWYgKG51bWZyZWUgPCBQeURpY3RfTUFYRlJFRUxJU1QgJiYgUHlfVFlQRShtcCkgPT0gJlB5RGljdF9UeXBlKQotCQlmcmVlX2xpc3RbbnVtZnJlZSsrXSA9IG1wOwotCWVsc2UKLQkJUHlfVFlQRShtcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopbXApOwotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKG1wKQorICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeV9zc2l6ZV90IGZpbGwgPSBtcC0+bWFfZmlsbDsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKG1wKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG1wKQorICAgIGZvciAoZXAgPSBtcC0+bWFfdGFibGU7IGZpbGwgPiAwOyBlcCsrKSB7CisgICAgICAgIGlmIChlcC0+bWVfa2V5KSB7CisgICAgICAgICAgICAtLWZpbGw7CisgICAgICAgICAgICBQeV9ERUNSRUYoZXAtPm1lX2tleSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGVwLT5tZV92YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1wLT5tYV90YWJsZSAhPSBtcC0+bWFfc21hbGx0YWJsZSkKKyAgICAgICAgUHlNZW1fREVMKG1wLT5tYV90YWJsZSk7CisgICAgaWYgKG51bWZyZWUgPCBQeURpY3RfTUFYRlJFRUxJU1QgJiYgUHlfVFlQRShtcCkgPT0gJlB5RGljdF9UeXBlKQorICAgICAgICBmcmVlX2xpc3RbbnVtZnJlZSsrXSA9IG1wOworICAgIGVsc2UKKyAgICAgICAgUHlfVFlQRShtcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopbXApOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKG1wKQogfQogCiBzdGF0aWMgaW50CiBkaWN0X3ByaW50KHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsIHJlZ2lzdGVyIEZJTEUgKmZwLCByZWdpc3RlciBpbnQgZmxhZ3MpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgYW55OwotCWludCBzdGF0dXM7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgYW55OworICAgIGludCBzdGF0dXM7CiAKLQlzdGF0dXMgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0KiltcCk7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmcHJpbnRmKGZwLCAiey4uLn0iKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHN0YXR1cyA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKW1wKTsKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGZwcmludGYoZnAsICJ7Li4ufSIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnByaW50ZihmcCwgInsiKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWFueSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8PSBtcC0+bWFfbWFzazsgaSsrKSB7Ci0JCVB5RGljdEVudHJ5ICplcCA9IG1wLT5tYV90YWJsZSArIGk7Ci0JCVB5T2JqZWN0ICpwdmFsdWUgPSBlcC0+bWVfdmFsdWU7Ci0JCWlmIChwdmFsdWUgIT0gTlVMTCkgewotCQkJLyogUHJldmVudCBQeU9iamVjdF9SZXByIGZyb20gZGVsZXRpbmcgdmFsdWUgZHVyaW5nCi0JCQkgICBrZXkgZm9ybWF0ICovCi0JCQlQeV9JTkNSRUYocHZhbHVlKTsKLQkJCWlmIChhbnkrKyA+IDApIHsKLQkJCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQkJZnByaW50ZihmcCwgIiwgIik7Ci0JCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCX0KLQkJCWlmIChQeU9iamVjdF9QcmludCgoUHlPYmplY3QgKillcC0+bWVfa2V5LCBmcCwgMCkhPTApIHsKLQkJCQlQeV9ERUNSRUYocHZhbHVlKTsKLQkJCQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0KiltcCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkJZnByaW50ZihmcCwgIjogIik7Ci0JCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQkJaWYgKFB5T2JqZWN0X1ByaW50KHB2YWx1ZSwgZnAsIDApICE9IDApIHsKLQkJCQlQeV9ERUNSRUYocHZhbHVlKTsKLQkJCQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0KiltcCk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJUHlfREVDUkVGKHB2YWx1ZSk7Ci0JCX0KLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICJ9Iik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0KiltcCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICJ7Iik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBhbnkgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPD0gbXAtPm1hX21hc2s7IGkrKykgeworICAgICAgICBQeURpY3RFbnRyeSAqZXAgPSBtcC0+bWFfdGFibGUgKyBpOworICAgICAgICBQeU9iamVjdCAqcHZhbHVlID0gZXAtPm1lX3ZhbHVlOworICAgICAgICBpZiAocHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIFByZXZlbnQgUHlPYmplY3RfUmVwciBmcm9tIGRlbGV0aW5nIHZhbHVlIGR1cmluZworICAgICAgICAgICAgICAga2V5IGZvcm1hdCAqLworICAgICAgICAgICAgUHlfSU5DUkVGKHB2YWx1ZSk7CisgICAgICAgICAgICBpZiAoYW55KysgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIsICIpOworICAgICAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfUHJpbnQoKFB5T2JqZWN0ICopZXAtPm1lX2tleSwgZnAsIDApIT0wKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHB2YWx1ZSk7CisgICAgICAgICAgICAgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCopbXApOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGZwcmludGYoZnAsICI6ICIpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9QcmludChwdmFsdWUsIGZwLCAwKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHB2YWx1ZSk7CisgICAgICAgICAgICAgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCopbXApOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihwdmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmcHJpbnRmKGZwLCAifSIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCopbXApOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9yZXByKFB5RGljdE9iamVjdCAqbXApCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICpzLCAqdGVtcCwgKmNvbG9uID0gTlVMTDsKLQlQeU9iamVjdCAqcGllY2VzID0gTlVMTCwgKnJlc3VsdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcywgKnRlbXAsICpjb2xvbiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnBpZWNlcyA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZTsKIAotCWkgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0ICopbXApOwotCWlmIChpICE9IDApIHsKLQkJcmV0dXJuIGkgPiAwID8gUHlTdHJpbmdfRnJvbVN0cmluZygiey4uLn0iKSA6IE5VTEw7Ci0JfQorICAgIGkgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0ICopbXApOworICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGkgPiAwID8gUHlTdHJpbmdfRnJvbVN0cmluZygiey4uLn0iKSA6IE5VTEw7CisgICAgfQogCi0JaWYgKG1wLT5tYV91c2VkID09IDApIHsKLQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygie30iKTsKLQkJZ290byBEb25lOwotCX0KKyAgICBpZiAobXAtPm1hX3VzZWQgPT0gMCkgeworICAgICAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJ7fSIpOworICAgICAgICBnb3RvIERvbmU7CisgICAgfQogCi0JcGllY2VzID0gUHlMaXN0X05ldygwKTsKLQlpZiAocGllY2VzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICBwaWVjZXMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChwaWVjZXMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JY29sb24gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI6ICIpOwotCWlmIChjb2xvbiA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgY29sb24gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI6ICIpOworICAgIGlmIChjb2xvbiA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQkvKiBEbyByZXByKCkgb24gZWFjaCBrZXkrdmFsdWUgcGFpciwgYW5kIGluc2VydCAiOiAiIGJldHdlZW4gdGhlbS4KLQkgICBOb3RlIHRoYXQgcmVwciBtYXkgbXV0YXRlIHRoZSBkaWN0LiAqLwotCWkgPSAwOwotCXdoaWxlIChQeURpY3RfTmV4dCgoUHlPYmplY3QgKiltcCwgJmksICZrZXksICZ2YWx1ZSkpIHsKLQkJaW50IHN0YXR1czsKLQkJLyogUHJldmVudCByZXByIGZyb20gZGVsZXRpbmcgdmFsdWUgZHVyaW5nIGtleSBmb3JtYXQuICovCi0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCXMgPSBQeU9iamVjdF9SZXByKGtleSk7Ci0JCVB5U3RyaW5nX0NvbmNhdCgmcywgY29sb24pOwotCQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5T2JqZWN0X1JlcHIodmFsdWUpKTsKLQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCWdvdG8gRG9uZTsKLQkJc3RhdHVzID0gUHlMaXN0X0FwcGVuZChwaWVjZXMsIHMpOwotCQlQeV9ERUNSRUYocyk7ICAvKiBhcHBlbmQgY3JlYXRlZCBhIG5ldyByZWYgKi8KLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlnb3RvIERvbmU7Ci0JfQorICAgIC8qIERvIHJlcHIoKSBvbiBlYWNoIGtleSt2YWx1ZSBwYWlyLCBhbmQgaW5zZXJ0ICI6ICIgYmV0d2VlbiB0aGVtLgorICAgICAgIE5vdGUgdGhhdCByZXByIG1heSBtdXRhdGUgdGhlIGRpY3QuICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KChQeU9iamVjdCAqKW1wLCAmaSwgJmtleSwgJnZhbHVlKSkgeworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICAvKiBQcmV2ZW50IHJlcHIgZnJvbSBkZWxldGluZyB2YWx1ZSBkdXJpbmcga2V5IGZvcm1hdC4gKi8KKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgcyA9IFB5T2JqZWN0X1JlcHIoa2V5KTsKKyAgICAgICAgUHlTdHJpbmdfQ29uY2F0KCZzLCBjb2xvbik7CisgICAgICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlPYmplY3RfUmVwcih2YWx1ZSkpOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICBzdGF0dXMgPSBQeUxpc3RfQXBwZW5kKHBpZWNlcywgcyk7CisgICAgICAgIFB5X0RFQ1JFRihzKTsgIC8qIGFwcGVuZCBjcmVhdGVkIGEgbmV3IHJlZiAqLworICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CiAKLQkvKiBBZGQgInt9IiBkZWNvcmF0aW9ucyB0byB0aGUgZmlyc3QgYW5kIGxhc3QgaXRlbXMuICovCi0JYXNzZXJ0KFB5TGlzdF9HRVRfU0laRShwaWVjZXMpID4gMCk7Ci0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoInsiKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JdGVtcCA9IFB5TGlzdF9HRVRfSVRFTShwaWVjZXMsIDApOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgdGVtcCk7Ci0JUHlMaXN0X1NFVF9JVEVNKHBpZWNlcywgMCwgcyk7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIC8qIEFkZCAie30iIGRlY29yYXRpb25zIHRvIHRoZSBmaXJzdCBhbmQgbGFzdCBpdGVtcy4gKi8KKyAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgPiAwKTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZygieyIpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB0ZW1wID0gUHlMaXN0X0dFVF9JVEVNKHBpZWNlcywgMCk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0ZW1wKTsKKyAgICBQeUxpc3RfU0VUX0lURU0ocGllY2VzLCAwLCBzKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygifSIpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl0ZW1wID0gUHlMaXN0X0dFVF9JVEVNKHBpZWNlcywgUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgLSAxKTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnRlbXAsIHMpOwotCVB5TGlzdF9TRVRfSVRFTShwaWVjZXMsIFB5TGlzdF9HRVRfU0laRShwaWVjZXMpIC0gMSwgdGVtcCk7Ci0JaWYgKHRlbXAgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJ9Iik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHRlbXAgPSBQeUxpc3RfR0VUX0lURU0ocGllY2VzLCBQeUxpc3RfR0VUX1NJWkUocGllY2VzKSAtIDEpOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmdGVtcCwgcyk7CisgICAgUHlMaXN0X1NFVF9JVEVNKHBpZWNlcywgUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgLSAxLCB0ZW1wKTsKKyAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQkvKiBQYXN0ZSB0aGVtIGFsbCB0b2dldGhlciB3aXRoICIsICIgYmV0d2Vlbi4gKi8KLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7Ci0JcmVzdWx0ID0gX1B5U3RyaW5nX0pvaW4ocywgcGllY2VzKTsKLQlQeV9ERUNSRUYocyk7CisgICAgLyogUGFzdGUgdGhlbSBhbGwgdG9nZXRoZXIgd2l0aCAiLCAiIGJldHdlZW4uICovCisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgIik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHJlc3VsdCA9IF9QeVN0cmluZ19Kb2luKHMsIHBpZWNlcyk7CisgICAgUHlfREVDUkVGKHMpOwogCiBEb25lOgotCVB5X1hERUNSRUYocGllY2VzKTsKLQlQeV9YREVDUkVGKGNvbG9uKTsKLQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopbXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihwaWVjZXMpOworICAgIFB5X1hERUNSRUYoY29sb24pOworICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QgKiltcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGRpY3RfbGVuZ3RoKFB5RGljdE9iamVjdCAqbXApCiB7Ci0JcmV0dXJuIG1wLT5tYV91c2VkOworICAgIHJldHVybiBtcC0+bWFfdXNlZDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3Rfc3Vic2NyaXB0KFB5RGljdE9iamVjdCAqbXAsIHJlZ2lzdGVyIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JbG9uZyBoYXNoOwotCVB5RGljdEVudHJ5ICplcDsKLQlhc3NlcnQobXAtPm1hX3RhYmxlICE9IE5VTEwpOwotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8Ci0JICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7Ci0JaWYgKGVwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXYgPSBlcC0+bWVfdmFsdWU7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlpZiAoIVB5RGljdF9DaGVja0V4YWN0KG1wKSkgewotCQkJLyogTG9vayB1cCBfX21pc3NpbmdfXyBtZXRob2QgaWYgd2UncmUgYSBzdWJjbGFzcy4gKi8KLQkJICAgIAlQeU9iamVjdCAqbWlzc2luZzsKLQkJCXN0YXRpYyBQeU9iamVjdCAqbWlzc2luZ19zdHIgPSBOVUxMOwotCQkJaWYgKG1pc3Npbmdfc3RyID09IE5VTEwpCi0JCQkJbWlzc2luZ19zdHIgPQotCQkJCSAgUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19taXNzaW5nX18iKTsKLQkJCW1pc3NpbmcgPSBfUHlUeXBlX0xvb2t1cChQeV9UWVBFKG1wKSwgbWlzc2luZ19zdHIpOwotCQkJaWYgKG1pc3NpbmcgIT0gTlVMTCkKLQkJCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtaXNzaW5nLAotCQkJCQkoUHlPYmplY3QgKiltcCwga2V5LCBOVUxMKTsKLQkJfQotCQlzZXRfa2V5X2Vycm9yKGtleSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRih2KTsKLQlyZXR1cm4gdjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBsb25nIGhhc2g7CisgICAgUHlEaWN0RW50cnkgKmVwOworICAgIGFzc2VydChtcC0+bWFfdGFibGUgIT0gTlVMTCk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKKyAgICAgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICBpZiAoZXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdiA9IGVwLT5tZV92YWx1ZTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlEaWN0X0NoZWNrRXhhY3QobXApKSB7CisgICAgICAgICAgICAvKiBMb29rIHVwIF9fbWlzc2luZ19fIG1ldGhvZCBpZiB3ZSdyZSBhIHN1YmNsYXNzLiAqLworICAgICAgICAgICAgUHlPYmplY3QgKm1pc3Npbmc7CisgICAgICAgICAgICBzdGF0aWMgUHlPYmplY3QgKm1pc3Npbmdfc3RyID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChtaXNzaW5nX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIG1pc3Npbmdfc3RyID0KKyAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbWlzc2luZ19fIik7CisgICAgICAgICAgICBtaXNzaW5nID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShtcCksIG1pc3Npbmdfc3RyKTsKKyAgICAgICAgICAgIGlmIChtaXNzaW5nICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopbXAsIGtleSwgTlVMTCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0X2tleV9lcnJvcihrZXkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYodik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBpbnQKIGRpY3RfYXNzX3N1YihQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JaWYgKHcgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RGljdF9EZWxJdGVtKChQeU9iamVjdCAqKW1wLCB2KTsKLQllbHNlCi0JCXJldHVybiBQeURpY3RfU2V0SXRlbSgoUHlPYmplY3QgKiltcCwgdiwgdyk7CisgICAgaWYgKHcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RGljdF9EZWxJdGVtKChQeU9iamVjdCAqKW1wLCB2KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeURpY3RfU2V0SXRlbSgoUHlPYmplY3QgKiltcCwgdiwgdyk7CiB9CiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIGRpY3RfYXNfbWFwcGluZyA9IHsKLQkobGVuZnVuYylkaWN0X2xlbmd0aCwgLyptcF9sZW5ndGgqLwotCShiaW5hcnlmdW5jKWRpY3Rfc3Vic2NyaXB0LCAvKm1wX3N1YnNjcmlwdCovCi0JKG9iam9iamFyZ3Byb2MpZGljdF9hc3Nfc3ViLCAvKm1wX2Fzc19zdWJzY3JpcHQqLworICAgIChsZW5mdW5jKWRpY3RfbGVuZ3RoLCAvKm1wX2xlbmd0aCovCisgICAgKGJpbmFyeWZ1bmMpZGljdF9zdWJzY3JpcHQsIC8qbXBfc3Vic2NyaXB0Ki8KKyAgICAob2Jqb2JqYXJncHJvYylkaWN0X2Fzc19zdWIsIC8qbXBfYXNzX3N1YnNjcmlwdCovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9rZXlzKHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXApCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKnY7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqOwotCVB5RGljdEVudHJ5ICplcDsKLQlQeV9zc2l6ZV90IG1hc2ssIG47CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnY7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqOworICAgIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeV9zc2l6ZV90IG1hc2ssIG47CiAKICAgYWdhaW46Ci0JbiA9IG1wLT5tYV91c2VkOwotCXYgPSBQeUxpc3RfTmV3KG4pOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChuICE9IG1wLT5tYV91c2VkKSB7Ci0JCS8qIER1cm5pdC4gIFRoZSBhbGxvY2F0aW9ucyBjYXVzZWQgdGhlIGRpY3QgdG8gcmVzaXplLgotCQkgKiBKdXN0IHN0YXJ0IG92ZXIsIHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4KLQkJICovCi0JCVB5X0RFQ1JFRih2KTsKLQkJZ290byBhZ2FpbjsKLQl9Ci0JZXAgPSBtcC0+bWFfdGFibGU7Ci0JbWFzayA9IG1wLT5tYV9tYXNrOwotCWZvciAoaSA9IDAsIGogPSAwOyBpIDw9IG1hc2s7IGkrKykgewotCQlpZiAoZXBbaV0ubWVfdmFsdWUgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKmtleSA9IGVwW2ldLm1lX2tleTsKLQkJCVB5X0lOQ1JFRihrZXkpOwotCQkJUHlMaXN0X1NFVF9JVEVNKHYsIGosIGtleSk7Ci0JCQlqKys7Ci0JCX0KLQl9Ci0JYXNzZXJ0KGogPT0gbik7Ci0JcmV0dXJuIHY7CisgICAgbiA9IG1wLT5tYV91c2VkOworICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuICE9IG1wLT5tYV91c2VkKSB7CisgICAgICAgIC8qIER1cm5pdC4gIFRoZSBhbGxvY2F0aW9ucyBjYXVzZWQgdGhlIGRpY3QgdG8gcmVzaXplLgorICAgICAgICAgKiBKdXN0IHN0YXJ0IG92ZXIsIHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4KKyAgICAgICAgICovCisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisgICAgZXAgPSBtcC0+bWFfdGFibGU7CisgICAgbWFzayA9IG1wLT5tYV9tYXNrOworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDw9IG1hc2s7IGkrKykgeworICAgICAgICBpZiAoZXBbaV0ubWVfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKmtleSA9IGVwW2ldLm1lX2tleTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOworICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHYsIGosIGtleSk7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KGogPT0gbik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X3ZhbHVlcyhyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgajsKLQlQeURpY3RFbnRyeSAqZXA7Ci0JUHlfc3NpemVfdCBtYXNrLCBuOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgajsKKyAgICBQeURpY3RFbnRyeSAqZXA7CisgICAgUHlfc3NpemVfdCBtYXNrLCBuOwogCiAgIGFnYWluOgotCW4gPSBtcC0+bWFfdXNlZDsKLQl2ID0gUHlMaXN0X05ldyhuKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobiAhPSBtcC0+bWFfdXNlZCkgewotCQkvKiBEdXJuaXQuICBUaGUgYWxsb2NhdGlvbnMgY2F1c2VkIHRoZSBkaWN0IHRvIHJlc2l6ZS4KLQkJICogSnVzdCBzdGFydCBvdmVyLCB0aGlzIHNob3VsZG4ndCBub3JtYWxseSBoYXBwZW4uCi0JCSAqLwotCQlQeV9ERUNSRUYodik7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCWVwID0gbXAtPm1hX3RhYmxlOwotCW1hc2sgPSBtcC0+bWFfbWFzazsKLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8PSBtYXNrOyBpKyspIHsKLQkJaWYgKGVwW2ldLm1lX3ZhbHVlICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICp2YWx1ZSA9IGVwW2ldLm1lX3ZhbHVlOwotCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCVB5TGlzdF9TRVRfSVRFTSh2LCBqLCB2YWx1ZSk7Ci0JCQlqKys7Ci0JCX0KLQl9Ci0JYXNzZXJ0KGogPT0gbik7Ci0JcmV0dXJuIHY7CisgICAgbiA9IG1wLT5tYV91c2VkOworICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChuICE9IG1wLT5tYV91c2VkKSB7CisgICAgICAgIC8qIER1cm5pdC4gIFRoZSBhbGxvY2F0aW9ucyBjYXVzZWQgdGhlIGRpY3QgdG8gcmVzaXplLgorICAgICAgICAgKiBKdXN0IHN0YXJ0IG92ZXIsIHRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4KKyAgICAgICAgICovCisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgZ290byBhZ2FpbjsKKyAgICB9CisgICAgZXAgPSBtcC0+bWFfdGFibGU7CisgICAgbWFzayA9IG1wLT5tYV9tYXNrOworICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDw9IG1hc2s7IGkrKykgeworICAgICAgICBpZiAoZXBbaV0ubWVfdmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnZhbHVlID0gZXBbaV0ubWVfdmFsdWU7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHYsIGosIHZhbHVlKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoaiA9PSBuKTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfaXRlbXMocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqdjsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGksIGosIG47Ci0JUHlfc3NpemVfdCBtYXNrOwotCVB5T2JqZWN0ICppdGVtLCAqa2V5LCAqdmFsdWU7Ci0JUHlEaWN0RW50cnkgKmVwOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgaiwgbjsKKyAgICBQeV9zc2l6ZV90IG1hc2s7CisgICAgUHlPYmplY3QgKml0ZW0sICprZXksICp2YWx1ZTsKKyAgICBQeURpY3RFbnRyeSAqZXA7CiAKLQkvKiBQcmVhbGxvY2F0ZSB0aGUgbGlzdCBvZiB0dXBsZXMsIHRvIGF2b2lkIGFsbG9jYXRpb25zIGR1cmluZwotCSAqIHRoZSBsb29wIG92ZXIgdGhlIGl0ZW1zLCB3aGljaCBjb3VsZCB0cmlnZ2VyIEdDLCB3aGljaAotCSAqIGNvdWxkIHJlc2l6ZSB0aGUgZGljdC4gOi0oCi0JICovCisgICAgLyogUHJlYWxsb2NhdGUgdGhlIGxpc3Qgb2YgdHVwbGVzLCB0byBhdm9pZCBhbGxvY2F0aW9ucyBkdXJpbmcKKyAgICAgKiB0aGUgbG9vcCBvdmVyIHRoZSBpdGVtcywgd2hpY2ggY291bGQgdHJpZ2dlciBHQywgd2hpY2gKKyAgICAgKiBjb3VsZCByZXNpemUgdGhlIGRpY3QuIDotKAorICAgICAqLwogICBhZ2FpbjoKLQluID0gbXAtPm1hX3VzZWQ7Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlpdGVtID0gUHlUdXBsZV9OZXcoMik7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TRVRfSVRFTSh2LCBpLCBpdGVtKTsKLQl9Ci0JaWYgKG4gIT0gbXAtPm1hX3VzZWQpIHsKLQkJLyogRHVybml0LiAgVGhlIGFsbG9jYXRpb25zIGNhdXNlZCB0aGUgZGljdCB0byByZXNpemUuCi0JCSAqIEp1c3Qgc3RhcnQgb3ZlciwgdGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgaGFwcGVuLgotCQkgKi8KLQkJUHlfREVDUkVGKHYpOwotCQlnb3RvIGFnYWluOwotCX0KLQkvKiBOb3RoaW5nIHdlIGRvIGJlbG93IG1ha2VzIGFueSBmdW5jdGlvbiBjYWxscy4gKi8KLQllcCA9IG1wLT5tYV90YWJsZTsKLQltYXNrID0gbXAtPm1hX21hc2s7Ci0JZm9yIChpID0gMCwgaiA9IDA7IGkgPD0gbWFzazsgaSsrKSB7Ci0JCWlmICgodmFsdWU9ZXBbaV0ubWVfdmFsdWUpICE9IE5VTEwpIHsKLQkJCWtleSA9IGVwW2ldLm1lX2tleTsKLQkJCWl0ZW0gPSBQeUxpc3RfR0VUX0lURU0odiwgaik7Ci0JCQlQeV9JTkNSRUYoa2V5KTsKLQkJCVB5VHVwbGVfU0VUX0lURU0oaXRlbSwgMCwga2V5KTsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKGl0ZW0sIDEsIHZhbHVlKTsKLQkJCWorKzsKLQkJfQotCX0KLQlhc3NlcnQoaiA9PSBuKTsKLQlyZXR1cm4gdjsKKyAgICBuID0gbXAtPm1hX3VzZWQ7CisgICAgdiA9IFB5TGlzdF9OZXcobik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpdGVtID0gUHlUdXBsZV9OZXcoMik7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTSh2LCBpLCBpdGVtKTsKKyAgICB9CisgICAgaWYgKG4gIT0gbXAtPm1hX3VzZWQpIHsKKyAgICAgICAgLyogRHVybml0LiAgVGhlIGFsbG9jYXRpb25zIGNhdXNlZCB0aGUgZGljdCB0byByZXNpemUuCisgICAgICAgICAqIEp1c3Qgc3RhcnQgb3ZlciwgdGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgaGFwcGVuLgorICAgICAgICAgKi8KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBnb3RvIGFnYWluOworICAgIH0KKyAgICAvKiBOb3RoaW5nIHdlIGRvIGJlbG93IG1ha2VzIGFueSBmdW5jdGlvbiBjYWxscy4gKi8KKyAgICBlcCA9IG1wLT5tYV90YWJsZTsKKyAgICBtYXNrID0gbXAtPm1hX21hc2s7CisgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPD0gbWFzazsgaSsrKSB7CisgICAgICAgIGlmICgodmFsdWU9ZXBbaV0ubWVfdmFsdWUpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGtleSA9IGVwW2ldLm1lX2tleTsKKyAgICAgICAgICAgIGl0ZW0gPSBQeUxpc3RfR0VUX0lURU0odiwgaik7CisgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oaXRlbSwgMCwga2V5KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGl0ZW0sIDEsIHZhbHVlKTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoaiA9PSBuKTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfZnJvbWtleXMoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNlcTsKLQlQeU9iamVjdCAqdmFsdWUgPSBQeV9Ob25lOwotCVB5T2JqZWN0ICppdDsJLyogaXRlcihzZXEpICovCi0JUHlPYmplY3QgKmtleTsKLQlQeU9iamVjdCAqZDsKLQlpbnQgc3RhdHVzOworICAgIFB5T2JqZWN0ICpzZXE7CisgICAgUHlPYmplY3QgKnZhbHVlID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqaXQ7ICAgICAgIC8qIGl0ZXIoc2VxKSAqLworICAgIFB5T2JqZWN0ICprZXk7CisgICAgUHlPYmplY3QgKmQ7CisgICAgaW50IHN0YXR1czsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZyb21rZXlzIiwgMSwgMiwgJnNlcSwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZnJvbWtleXMiLCAxLCAyLCAmc2VxLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNscywgTlVMTCk7Ci0JaWYgKGQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2xzLCBOVUxMKTsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChkKSAmJiBQeURpY3RfQ2hlY2tFeGFjdChzZXEpKSB7Ci0JCVB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopZDsKLQkJUHlPYmplY3QgKm9sZHZhbHVlOwotCQlQeV9zc2l6ZV90IHBvcyA9IDA7Ci0JCVB5T2JqZWN0ICprZXk7Ci0JCWxvbmcgaGFzaDsKKyAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZCkgJiYgUHlEaWN0X0NoZWNrRXhhY3Qoc2VxKSkgeworICAgICAgICBQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKWQ7CisgICAgICAgIFB5T2JqZWN0ICpvbGR2YWx1ZTsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICBQeU9iamVjdCAqa2V5OworICAgICAgICBsb25nIGhhc2g7CiAKLQkJaWYgKGRpY3RyZXNpemUobXAsIFB5X1NJWkUoc2VxKSkpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGRpY3RyZXNpemUobXAsIFB5X1NJWkUoc2VxKSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQl3aGlsZSAoX1B5RGljdF9OZXh0KHNlcSwgJnBvcywgJmtleSwgJm9sZHZhbHVlLCAmaGFzaCkpIHsKLQkJCVB5X0lOQ1JFRihrZXkpOwotCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCWlmIChpbnNlcnRkaWN0KG1wLCBrZXksIGhhc2gsIHZhbHVlKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gZDsKLQl9CisgICAgICAgIHdoaWxlIChfUHlEaWN0X05leHQoc2VxLCAmcG9zLCAma2V5LCAmb2xkdmFsdWUsICZoYXNoKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgaWYgKGluc2VydGRpY3QobXAsIGtleSwgaGFzaCwgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkOworICAgIH0KIAotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChkKSAmJiBQeUFueVNldF9DaGVja0V4YWN0KHNlcSkpIHsKLQkJUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilkOwotCQlQeV9zc2l6ZV90IHBvcyA9IDA7Ci0JCVB5T2JqZWN0ICprZXk7Ci0JCWxvbmcgaGFzaDsKKyAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZCkgJiYgUHlBbnlTZXRfQ2hlY2tFeGFjdChzZXEpKSB7CisgICAgICAgIFB5RGljdE9iamVjdCAqbXAgPSAoUHlEaWN0T2JqZWN0ICopZDsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICBQeU9iamVjdCAqa2V5OworICAgICAgICBsb25nIGhhc2g7CiAKLQkJaWYgKGRpY3RyZXNpemUobXAsIFB5U2V0X0dFVF9TSVpFKHNlcSkpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChkaWN0cmVzaXplKG1wLCBQeVNldF9HRVRfU0laRShzZXEpKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCXdoaWxlIChfUHlTZXRfTmV4dEVudHJ5KHNlcSwgJnBvcywgJmtleSwgJmhhc2gpKSB7Ci0JCQlQeV9JTkNSRUYoa2V5KTsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCQlpZiAoaW5zZXJ0ZGljdChtcCwga2V5LCBoYXNoLCB2YWx1ZSkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIGQ7Ci0JfQorICAgICAgICB3aGlsZSAoX1B5U2V0X05leHRFbnRyeShzZXEsICZwb3MsICZrZXksICZoYXNoKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICAgICAgaWYgKGluc2VydGRpY3QobXAsIGtleSwgaGFzaCwgdmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCWlmIChpdCA9PSBOVUxMKXsKLQkJUHlfREVDUkVGKGQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ID09IE5VTEwpeworICAgICAgICBQeV9ERUNSRUYoZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChkKSkgewotCQl3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotCQkJc3RhdHVzID0gUHlEaWN0X1NldEl0ZW0oZCwga2V5LCB2YWx1ZSk7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCWdvdG8gRmFpbDsKLQkJfQotCX0gZWxzZSB7Ci0JCXdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCQlzdGF0dXMgPSBQeU9iamVjdF9TZXRJdGVtKGQsIGtleSwgdmFsdWUpOwotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlnb3RvIEZhaWw7Ci0JCX0KLQl9CisgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGQpKSB7CisgICAgICAgIHdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBQeURpY3RfU2V0SXRlbShkLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFB5T2JqZWN0X1NldEl0ZW0oZCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlnb3RvIEZhaWw7Ci0JUHlfREVDUkVGKGl0KTsKLQlyZXR1cm4gZDsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBGYWlsOworICAgIFB5X0RFQ1JFRihpdCk7CisgICAgcmV0dXJuIGQ7CiAKIEZhaWw6Ci0JUHlfREVDUkVGKGl0KTsKLQlQeV9ERUNSRUYoZCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9ERUNSRUYoZCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGRpY3RfdXBkYXRlX2NvbW1vbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBjaGFyICptZXRobmFtZSkKIHsKLQlQeU9iamVjdCAqYXJnID0gTlVMTDsKLQlpbnQgcmVzdWx0ID0gMDsKKyAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgbWV0aG5hbWUsIDAsIDEsICZhcmcpKQotCQlyZXN1bHQgPSAtMTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIG1ldGhuYW1lLCAwLCAxLCAmYXJnKSkKKyAgICAgICAgcmVzdWx0ID0gLTE7CiAKLQllbHNlIGlmIChhcmcgIT0gTlVMTCkgewotCQlpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhhcmcsICJrZXlzIikpCi0JCQlyZXN1bHQgPSBQeURpY3RfTWVyZ2Uoc2VsZiwgYXJnLCAxKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gUHlEaWN0X01lcmdlRnJvbVNlcTIoc2VsZiwgYXJnLCAxKTsKLQl9Ci0JaWYgKHJlc3VsdCA9PSAwICYmIGt3ZHMgIT0gTlVMTCkKLQkJcmVzdWx0ID0gUHlEaWN0X01lcmdlKHNlbGYsIGt3ZHMsIDEpOwotCXJldHVybiByZXN1bHQ7CisgICAgZWxzZSBpZiAoYXJnICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoYXJnLCAia2V5cyIpKQorICAgICAgICAgICAgcmVzdWx0ID0gUHlEaWN0X01lcmdlKHNlbGYsIGFyZywgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5RGljdF9NZXJnZUZyb21TZXEyKHNlbGYsIGFyZywgMSk7CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gMCAmJiBrd2RzICE9IE5VTEwpCisgICAgICAgIHJlc3VsdCA9IFB5RGljdF9NZXJnZShzZWxmLCBrd2RzLCAxKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF91cGRhdGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpZiAoZGljdF91cGRhdGVfY29tbW9uKHNlbGYsIGFyZ3MsIGt3ZHMsICJ1cGRhdGUiKSAhPSAtMSkKLQkJUHlfUkVUVVJOX05PTkU7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGRpY3RfdXBkYXRlX2NvbW1vbihzZWxmLCBhcmdzLCBrd2RzLCAidXBkYXRlIikgIT0gLTEpCisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBVcGRhdGUgdW5jb25kaXRpb25hbGx5IHJlcGxhY2VzIGV4aXN0aW5nIGl0ZW1zLgpAQCAtMTM2MSwyMzggKzEzNjEsMjM4IEBACiBpbnQKIFB5RGljdF9NZXJnZUZyb21TZXEyKFB5T2JqZWN0ICpkLCBQeU9iamVjdCAqc2VxMiwgaW50IG92ZXJyaWRlKQogewotCVB5T2JqZWN0ICppdDsJLyogaXRlcihzZXEyKSAqLwotCVB5X3NzaXplX3QgaTsJLyogaW5kZXggaW50byBzZXEyIG9mIGN1cnJlbnQgZWxlbWVudCAqLwotCVB5T2JqZWN0ICppdGVtOwkvKiBzZXEyW2ldICovCi0JUHlPYmplY3QgKmZhc3Q7CS8qIGl0ZW0gYXMgYSAyLXR1cGxlIG9yIDItbGlzdCAqLworICAgIFB5T2JqZWN0ICppdDsgICAgICAgLyogaXRlcihzZXEyKSAqLworICAgIFB5X3NzaXplX3QgaTsgICAgICAgLyogaW5kZXggaW50byBzZXEyIG9mIGN1cnJlbnQgZWxlbWVudCAqLworICAgIFB5T2JqZWN0ICppdGVtOyAgICAgLyogc2VxMltpXSAqLworICAgIFB5T2JqZWN0ICpmYXN0OyAgICAgLyogaXRlbSBhcyBhIDItdHVwbGUgb3IgMi1saXN0ICovCiAKLQlhc3NlcnQoZCAhPSBOVUxMKTsKLQlhc3NlcnQoUHlEaWN0X0NoZWNrKGQpKTsKLQlhc3NlcnQoc2VxMiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoZCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlEaWN0X0NoZWNrKGQpKTsKKyAgICBhc3NlcnQoc2VxMiAhPSBOVUxMKTsKIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEyKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEyKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JZm9yIChpID0gMDsgOyArK2kpIHsKLQkJUHlPYmplY3QgKmtleSwgKnZhbHVlOwotCQlQeV9zc2l6ZV90IG47CisgICAgZm9yIChpID0gMDsgOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgICAgICBQeV9zc2l6ZV90IG47CiAKLQkJZmFzdCA9IE5VTEw7Ci0JCWl0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gRmFpbDsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGZhc3QgPSBOVUxMOworICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCS8qIENvbnZlcnQgaXRlbSB0byBzZXF1ZW5jZSwgYW5kIHZlcmlmeSBsZW5ndGggMi4gKi8KLQkJZmFzdCA9IFB5U2VxdWVuY2VfRmFzdChpdGVtLCAiIik7Ci0JCWlmIChmYXN0ID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNhbm5vdCBjb252ZXJ0IGRpY3Rpb25hcnkgdXBkYXRlICIKLQkJCQkJInNlcXVlbmNlIGVsZW1lbnQgIyV6ZCB0byBhIHNlcXVlbmNlIiwKLQkJCQkJaSk7Ci0JCQlnb3RvIEZhaWw7Ci0JCX0KLQkJbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShmYXN0KTsKLQkJaWYgKG4gIT0gMikgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgICAiZGljdGlvbmFyeSB1cGRhdGUgc2VxdWVuY2UgZWxlbWVudCAjJXpkICIKLQkJCQkgICAgICJoYXMgbGVuZ3RoICV6ZDsgMiBpcyByZXF1aXJlZCIsCi0JCQkJICAgICBpLCBuKTsKLQkJCWdvdG8gRmFpbDsKLQkJfQorICAgICAgICAvKiBDb252ZXJ0IGl0ZW0gdG8gc2VxdWVuY2UsIGFuZCB2ZXJpZnkgbGVuZ3RoIDIuICovCisgICAgICAgIGZhc3QgPSBQeVNlcXVlbmNlX0Zhc3QoaXRlbSwgIiIpOworICAgICAgICBpZiAoZmFzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBkaWN0aW9uYXJ5IHVwZGF0ZSAiCisgICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSBlbGVtZW50ICMlemQgdG8gYSBzZXF1ZW5jZSIsCisgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgICAgIG4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmFzdCk7CisgICAgICAgIGlmIChuICE9IDIpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5IHVwZGF0ZSBzZXF1ZW5jZSBlbGVtZW50ICMlemQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJoYXMgbGVuZ3RoICV6ZDsgMiBpcyByZXF1aXJlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbik7CisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KIAotCQkvKiBVcGRhdGUvbWVyZ2Ugd2l0aCB0aGlzIChrZXksIHZhbHVlKSBwYWlyLiAqLwotCQlrZXkgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZmFzdCwgMCk7Ci0JCXZhbHVlID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZhc3QsIDEpOwotCQlpZiAob3ZlcnJpZGUgfHwgUHlEaWN0X0dldEl0ZW0oZCwga2V5KSA9PSBOVUxMKSB7Ci0JCQlpbnQgc3RhdHVzID0gUHlEaWN0X1NldEl0ZW0oZCwga2V5LCB2YWx1ZSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlnb3RvIEZhaWw7Ci0JCX0KLQkJUHlfREVDUkVGKGZhc3QpOwotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQorICAgICAgICAvKiBVcGRhdGUvbWVyZ2Ugd2l0aCB0aGlzIChrZXksIHZhbHVlKSBwYWlyLiAqLworICAgICAgICBrZXkgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oZmFzdCwgMCk7CisgICAgICAgIHZhbHVlID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZhc3QsIDEpOworICAgICAgICBpZiAob3ZlcnJpZGUgfHwgUHlEaWN0X0dldEl0ZW0oZCwga2V5KSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gUHlEaWN0X1NldEl0ZW0oZCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGZhc3QpOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQogCi0JaSA9IDA7Ci0JZ290byBSZXR1cm47CisgICAgaSA9IDA7CisgICAgZ290byBSZXR1cm47CiBGYWlsOgotCVB5X1hERUNSRUYoaXRlbSk7Ci0JUHlfWERFQ1JFRihmYXN0KTsKLQlpID0gLTE7CisgICAgUHlfWERFQ1JFRihpdGVtKTsKKyAgICBQeV9YREVDUkVGKGZhc3QpOworICAgIGkgPSAtMTsKIFJldHVybjoKLQlQeV9ERUNSRUYoaXQpOwotCXJldHVybiBQeV9TQUZFX0RPV05DQVNUKGksIFB5X3NzaXplX3QsIGludCk7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChpLCBQeV9zc2l6ZV90LCBpbnQpOwogfQogCiBpbnQKIFB5RGljdF9VcGRhdGUoUHlPYmplY3QgKmEsIFB5T2JqZWN0ICpiKQogewotCXJldHVybiBQeURpY3RfTWVyZ2UoYSwgYiwgMSk7CisgICAgcmV0dXJuIFB5RGljdF9NZXJnZShhLCBiLCAxKTsKIH0KIAogaW50CiBQeURpY3RfTWVyZ2UoUHlPYmplY3QgKmEsIFB5T2JqZWN0ICpiLCBpbnQgb3ZlcnJpZGUpCiB7Ci0JcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgKm90aGVyOwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlQeURpY3RFbnRyeSAqZW50cnk7CisgICAgcmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgKm90aGVyOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICBQeURpY3RFbnRyeSAqZW50cnk7CiAKLQkvKiBXZSBhY2NlcHQgZm9yIHRoZSBhcmd1bWVudCBlaXRoZXIgYSBjb25jcmV0ZSBkaWN0aW9uYXJ5IG9iamVjdCwKLQkgKiBvciBhbiBhYnN0cmFjdCAibWFwcGluZyIgb2JqZWN0LiAgRm9yIHRoZSBmb3JtZXIsIHdlIGNhbiBkbwotCSAqIHRoaW5ncyBxdWl0ZSBlZmZpY2llbnRseS4gIEZvciB0aGUgbGF0dGVyLCB3ZSBvbmx5IHJlcXVpcmUgdGhhdAotCSAqIFB5TWFwcGluZ19LZXlzKCkgYW5kIFB5T2JqZWN0X0dldEl0ZW0oKSBiZSBzdXBwb3J0ZWQuCi0JICovCi0JaWYgKGEgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGEpIHx8IGIgPT0gTlVMTCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltcCA9IChQeURpY3RPYmplY3QqKWE7Ci0JaWYgKFB5RGljdF9DaGVjayhiKSkgewotCQlvdGhlciA9IChQeURpY3RPYmplY3QqKWI7Ci0JCWlmIChvdGhlciA9PSBtcCB8fCBvdGhlci0+bWFfdXNlZCA9PSAwKQotCQkJLyogYS51cGRhdGUoYSkgb3IgYS51cGRhdGUoe30pOyBub3RoaW5nIHRvIGRvICovCi0JCQlyZXR1cm4gMDsKLQkJaWYgKG1wLT5tYV91c2VkID09IDApCi0JCQkvKiBTaW5jZSB0aGUgdGFyZ2V0IGRpY3QgaXMgZW1wdHksIFB5RGljdF9HZXRJdGVtKCkKLQkJCSAqIGFsd2F5cyByZXR1cm5zIE5VTEwuICBTZXR0aW5nIG92ZXJyaWRlIHRvIDEKLQkJCSAqIHNraXBzIHRoZSB1bm5lY2Vzc2FyeSB0ZXN0LgotCQkJICovCi0JCQlvdmVycmlkZSA9IDE7Ci0JCS8qIERvIG9uZSBiaWcgcmVzaXplIGF0IHRoZSBzdGFydCwgcmF0aGVyIHRoYW4KLQkJICogaW5jcmVtZW50YWxseSByZXNpemluZyBhcyB3ZSBpbnNlcnQgbmV3IGl0ZW1zLiAgRXhwZWN0Ci0JCSAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgotCQkgKi8KLQkJaWYgKChtcC0+bWFfZmlsbCArIG90aGVyLT5tYV91c2VkKSozID49IChtcC0+bWFfbWFzaysxKSoyKSB7Ci0JCSAgIGlmIChkaWN0cmVzaXplKG1wLCAobXAtPm1hX3VzZWQgKyBvdGhlci0+bWFfdXNlZCkqMikgIT0gMCkKLQkJCSAgIHJldHVybiAtMTsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDw9IG90aGVyLT5tYV9tYXNrOyBpKyspIHsKLQkJCWVudHJ5ID0gJm90aGVyLT5tYV90YWJsZVtpXTsKLQkJCWlmIChlbnRyeS0+bWVfdmFsdWUgIT0gTlVMTCAmJgotCQkJICAgIChvdmVycmlkZSB8fAotCQkJICAgICBQeURpY3RfR2V0SXRlbShhLCBlbnRyeS0+bWVfa2V5KSA9PSBOVUxMKSkgewotCQkJCVB5X0lOQ1JFRihlbnRyeS0+bWVfa2V5KTsKLQkJCQlQeV9JTkNSRUYoZW50cnktPm1lX3ZhbHVlKTsKLQkJCQlpZiAoaW5zZXJ0ZGljdChtcCwgZW50cnktPm1lX2tleSwKLQkJCQkJICAgICAgIChsb25nKWVudHJ5LT5tZV9oYXNoLAotCQkJCQkgICAgICAgZW50cnktPm1lX3ZhbHVlKSAhPSAwKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qIERvIGl0IHRoZSBnZW5lcmljLCBzbG93ZXIgd2F5ICovCi0JCVB5T2JqZWN0ICprZXlzID0gUHlNYXBwaW5nX0tleXMoYik7Ci0JCVB5T2JqZWN0ICppdGVyOwotCQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7Ci0JCWludCBzdGF0dXM7CisgICAgLyogV2UgYWNjZXB0IGZvciB0aGUgYXJndW1lbnQgZWl0aGVyIGEgY29uY3JldGUgZGljdGlvbmFyeSBvYmplY3QsCisgICAgICogb3IgYW4gYWJzdHJhY3QgIm1hcHBpbmciIG9iamVjdC4gIEZvciB0aGUgZm9ybWVyLCB3ZSBjYW4gZG8KKyAgICAgKiB0aGluZ3MgcXVpdGUgZWZmaWNpZW50bHkuICBGb3IgdGhlIGxhdHRlciwgd2Ugb25seSByZXF1aXJlIHRoYXQKKyAgICAgKiBQeU1hcHBpbmdfS2V5cygpIGFuZCBQeU9iamVjdF9HZXRJdGVtKCkgYmUgc3VwcG9ydGVkLgorICAgICAqLworICAgIGlmIChhID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhhKSB8fCBiID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbXAgPSAoUHlEaWN0T2JqZWN0KilhOworICAgIGlmIChQeURpY3RfQ2hlY2soYikpIHsKKyAgICAgICAgb3RoZXIgPSAoUHlEaWN0T2JqZWN0KiliOworICAgICAgICBpZiAob3RoZXIgPT0gbXAgfHwgb3RoZXItPm1hX3VzZWQgPT0gMCkKKyAgICAgICAgICAgIC8qIGEudXBkYXRlKGEpIG9yIGEudXBkYXRlKHt9KTsgbm90aGluZyB0byBkbyAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChtcC0+bWFfdXNlZCA9PSAwKQorICAgICAgICAgICAgLyogU2luY2UgdGhlIHRhcmdldCBkaWN0IGlzIGVtcHR5LCBQeURpY3RfR2V0SXRlbSgpCisgICAgICAgICAgICAgKiBhbHdheXMgcmV0dXJucyBOVUxMLiAgU2V0dGluZyBvdmVycmlkZSB0byAxCisgICAgICAgICAgICAgKiBza2lwcyB0aGUgdW5uZWNlc3NhcnkgdGVzdC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb3ZlcnJpZGUgPSAxOworICAgICAgICAvKiBEbyBvbmUgYmlnIHJlc2l6ZSBhdCB0aGUgc3RhcnQsIHJhdGhlciB0aGFuCisgICAgICAgICAqIGluY3JlbWVudGFsbHkgcmVzaXppbmcgYXMgd2UgaW5zZXJ0IG5ldyBpdGVtcy4gIEV4cGVjdAorICAgICAgICAgKiB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gKG9yIGZldykgb3ZlcmxhcHBpbmcga2V5cy4KKyAgICAgICAgICovCisgICAgICAgIGlmICgobXAtPm1hX2ZpbGwgKyBvdGhlci0+bWFfdXNlZCkqMyA+PSAobXAtPm1hX21hc2srMSkqMikgeworICAgICAgICAgICBpZiAoZGljdHJlc2l6ZShtcCwgKG1wLT5tYV91c2VkICsgb3RoZXItPm1hX3VzZWQpKjIpICE9IDApCisgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBvdGhlci0+bWFfbWFzazsgaSsrKSB7CisgICAgICAgICAgICBlbnRyeSA9ICZvdGhlci0+bWFfdGFibGVbaV07CisgICAgICAgICAgICBpZiAoZW50cnktPm1lX3ZhbHVlICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAob3ZlcnJpZGUgfHwKKyAgICAgICAgICAgICAgICAgUHlEaWN0X0dldEl0ZW0oYSwgZW50cnktPm1lX2tleSkgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZW50cnktPm1lX2tleSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVudHJ5LT5tZV92YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGluc2VydGRpY3QobXAsIGVudHJ5LT5tZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpZW50cnktPm1lX2hhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPm1lX3ZhbHVlKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIERvIGl0IHRoZSBnZW5lcmljLCBzbG93ZXIgd2F5ICovCisgICAgICAgIFB5T2JqZWN0ICprZXlzID0gUHlNYXBwaW5nX0tleXMoYik7CisgICAgICAgIFB5T2JqZWN0ICppdGVyOworICAgICAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgICAgIGludCBzdGF0dXM7CiAKLQkJaWYgKGtleXMgPT0gTlVMTCkKLQkJCS8qIERvY3N0cmluZyBzYXlzIHRoaXMgaXMgZXF1aXZhbGVudCB0byBFLmtleXMoKSBzbwotCQkJICogaWYgRSBkb2Vzbid0IGhhdmUgYSAua2V5cygpIG1ldGhvZCB3ZSB3YW50Ci0JCQkgKiBBdHRyaWJ1dGVFcnJvciB0byBwZXJjb2xhdGUgdXAuICBNaWdodCBhcyB3ZWxsCi0JCQkgKiBkbyB0aGUgc2FtZSBmb3IgYW55IG90aGVyIGVycm9yLgotCQkJICovCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGlmIChrZXlzID09IE5VTEwpCisgICAgICAgICAgICAvKiBEb2NzdHJpbmcgc2F5cyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gRS5rZXlzKCkgc28KKyAgICAgICAgICAgICAqIGlmIEUgZG9lc24ndCBoYXZlIGEgLmtleXMoKSBtZXRob2Qgd2Ugd2FudAorICAgICAgICAgICAgICogQXR0cmlidXRlRXJyb3IgdG8gcGVyY29sYXRlIHVwLiAgTWlnaHQgYXMgd2VsbAorICAgICAgICAgICAgICogZG8gdGhlIHNhbWUgZm9yIGFueSBvdGhlciBlcnJvci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKGtleXMpOwotCQlQeV9ERUNSRUYoa2V5cyk7Ci0JCWlmIChpdGVyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGl0ZXIgPSBQeU9iamVjdF9HZXRJdGVyKGtleXMpOworICAgICAgICBQeV9ERUNSRUYoa2V5cyk7CisgICAgICAgIGlmIChpdGVyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLQkJZm9yIChrZXkgPSBQeUl0ZXJfTmV4dChpdGVyKTsga2V5OyBrZXkgPSBQeUl0ZXJfTmV4dChpdGVyKSkgewotCQkJaWYgKCFvdmVycmlkZSAmJiBQeURpY3RfR2V0SXRlbShhLCBrZXkpICE9IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoa2V5KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXZhbHVlID0gUHlPYmplY3RfR2V0SXRlbShiLCBrZXkpOwotCQkJaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlcik7Ci0JCQkJUHlfREVDUkVGKGtleSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJc3RhdHVzID0gUHlEaWN0X1NldEl0ZW0oYSwga2V5LCB2YWx1ZSk7Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJCVB5X0RFQ1JFRihpdGVyKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJUHlfREVDUkVGKGl0ZXIpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCS8qIEl0ZXJhdG9yIGNvbXBsZXRlZCwgdmlhIGVycm9yICovCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgICAgICBmb3IgKGtleSA9IFB5SXRlcl9OZXh0KGl0ZXIpOyBrZXk7IGtleSA9IFB5SXRlcl9OZXh0KGl0ZXIpKSB7CisgICAgICAgICAgICBpZiAoIW92ZXJyaWRlICYmIFB5RGljdF9HZXRJdGVtKGEsIGtleSkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsdWUgPSBQeU9iamVjdF9HZXRJdGVtKGIsIGtleSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBQeURpY3RfU2V0SXRlbShhLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZXIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgLyogSXRlcmF0b3IgY29tcGxldGVkLCB2aWEgZXJyb3IgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2NvcHkocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCkKIHsKLQlyZXR1cm4gUHlEaWN0X0NvcHkoKFB5T2JqZWN0KiltcCk7CisgICAgcmV0dXJuIFB5RGljdF9Db3B5KChQeU9iamVjdCopbXApOwogfQogCiBQeU9iamVjdCAqCiBQeURpY3RfQ29weShQeU9iamVjdCAqbykKIHsKLQlQeU9iamVjdCAqY29weTsKKyAgICBQeU9iamVjdCAqY29weTsKIAotCWlmIChvID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhvKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNvcHkgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKGNvcHkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5RGljdF9NZXJnZShjb3B5LCBvLCAxKSA9PSAwKQotCQlyZXR1cm4gY29weTsKLQlQeV9ERUNSRUYoY29weSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKG8gPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG8pKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY29weSA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoY29weSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X01lcmdlKGNvcHksIG8sIDEpID09IDApCisgICAgICAgIHJldHVybiBjb3B5OworICAgIFB5X0RFQ1JFRihjb3B5KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlfc3NpemVfdAogUHlEaWN0X1NpemUoUHlPYmplY3QgKm1wKQogewotCWlmIChtcCA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2sobXApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAoKFB5RGljdE9iamVjdCAqKW1wKS0+bWFfdXNlZDsKKyAgICBpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gKChQeURpY3RPYmplY3QgKiltcCktPm1hX3VzZWQ7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RGljdF9LZXlzKFB5T2JqZWN0ICptcCkKIHsKLQlpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBkaWN0X2tleXMoKFB5RGljdE9iamVjdCAqKW1wKTsKKyAgICBpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkaWN0X2tleXMoKFB5RGljdE9iamVjdCAqKW1wKTsKIH0KIAogUHlPYmplY3QgKgogUHlEaWN0X1ZhbHVlcyhQeU9iamVjdCAqbXApCiB7Ci0JaWYgKG1wID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhtcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZGljdF92YWx1ZXMoKFB5RGljdE9iamVjdCAqKW1wKTsKKyAgICBpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkaWN0X3ZhbHVlcygoUHlEaWN0T2JqZWN0ICopbXApOwogfQogCiBQeU9iamVjdCAqCiBQeURpY3RfSXRlbXMoUHlPYmplY3QgKm1wKQogewotCWlmIChtcCA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2sobXApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGRpY3RfaXRlbXMoKFB5RGljdE9iamVjdCAqKW1wKTsKKyAgICBpZiAobXAgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKG1wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBkaWN0X2l0ZW1zKChQeURpY3RPYmplY3QgKiltcCk7CiB9CiAKIC8qIFN1YnJvdXRpbmUgd2hpY2ggcmV0dXJucyB0aGUgc21hbGxlc3Qga2V5IGluIGEgZm9yIHdoaWNoIGIncyB2YWx1ZQpAQCAtMTYwNiwxMjMgKzE2MDYsMTIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2hhcmFjdGVyaXplKFB5RGljdE9iamVjdCAqYSwgUHlEaWN0T2JqZWN0ICpiLCBQeU9iamVjdCAqKnB2YWwpCiB7Ci0JUHlPYmplY3QgKmFrZXkgPSBOVUxMOyAvKiBzbWFsbGVzdCBrZXkgaW4gYSBzLnQuIGFbYWtleV0gIT0gYltha2V5XSAqLwotCVB5T2JqZWN0ICphdmFsID0gTlVMTDsgLyogYVtha2V5XSAqLwotCVB5X3NzaXplX3QgaTsKLQlpbnQgY21wOworICAgIFB5T2JqZWN0ICpha2V5ID0gTlVMTDsgLyogc21hbGxlc3Qga2V5IGluIGEgcy50LiBhW2FrZXldICE9IGJbYWtleV0gKi8KKyAgICBQeU9iamVjdCAqYXZhbCA9IE5VTEw7IC8qIGFbYWtleV0gKi8KKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGNtcDsKIAotCWZvciAoaSA9IDA7IGkgPD0gYS0+bWFfbWFzazsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp0aGlza2V5LCAqdGhpc2F2YWwsICp0aGlzYnZhbDsKLQkJaWYgKGEtPm1hX3RhYmxlW2ldLm1lX3ZhbHVlID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJdGhpc2tleSA9IGEtPm1hX3RhYmxlW2ldLm1lX2tleTsKLQkJUHlfSU5DUkVGKHRoaXNrZXkpOyAgLyoga2VlcCBhbGl2ZSBhY3Jvc3MgY29tcGFyZXMgKi8KLQkJaWYgKGFrZXkgIT0gTlVMTCkgewotCQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGFrZXksIHRoaXNrZXksIFB5X0xUKTsKLQkJCWlmIChjbXAgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKHRoaXNrZXkpOwotCQkJCWdvdG8gRmFpbDsKLQkJCX0KLQkJCWlmIChjbXAgPiAwIHx8Ci0JCQkgICAgaSA+IGEtPm1hX21hc2sgfHwKLQkJCSAgICBhLT5tYV90YWJsZVtpXS5tZV92YWx1ZSA9PSBOVUxMKQotCQkJewotCQkJCS8qIE5vdCB0aGUgKnNtYWxsZXN0KiBhIGtleTsgb3IgbWF5YmUgaXQgaXMKLQkJCQkgKiBidXQgdGhlIGNvbXBhcmUgc2hydW5rIHRoZSBkaWN0IHNvIHdlIGNhbid0Ci0JCQkJICogZmluZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSBhbnltb3JlOyBvcgotCQkJCSAqIG1heWJlIGl0IGlzIGJ1dCB0aGUgY29tcGFyZSBkZWxldGVkIHRoZQotCQkJCSAqIGFbdGhpc2tleV0gZW50cnkuCi0JCQkJICovCi0JCQkJUHlfREVDUkVGKHRoaXNrZXkpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9CisgICAgZm9yIChpID0gMDsgaSA8PSBhLT5tYV9tYXNrOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnRoaXNrZXksICp0aGlzYXZhbCwgKnRoaXNidmFsOworICAgICAgICBpZiAoYS0+bWFfdGFibGVbaV0ubWVfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB0aGlza2V5ID0gYS0+bWFfdGFibGVbaV0ubWVfa2V5OworICAgICAgICBQeV9JTkNSRUYodGhpc2tleSk7ICAvKiBrZWVwIGFsaXZlIGFjcm9zcyBjb21wYXJlcyAqLworICAgICAgICBpZiAoYWtleSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woYWtleSwgdGhpc2tleSwgUHlfTFQpOworICAgICAgICAgICAgaWYgKGNtcCA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGhpc2tleSk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNtcCA+IDAgfHwKKyAgICAgICAgICAgICAgICBpID4gYS0+bWFfbWFzayB8fAorICAgICAgICAgICAgICAgIGEtPm1hX3RhYmxlW2ldLm1lX3ZhbHVlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogTm90IHRoZSAqc21hbGxlc3QqIGEga2V5OyBvciBtYXliZSBpdCBpcworICAgICAgICAgICAgICAgICAqIGJ1dCB0aGUgY29tcGFyZSBzaHJ1bmsgdGhlIGRpY3Qgc28gd2UgY2FuJ3QKKyAgICAgICAgICAgICAgICAgKiBmaW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlIGFueW1vcmU7IG9yCisgICAgICAgICAgICAgICAgICogbWF5YmUgaXQgaXMgYnV0IHRoZSBjb21wYXJlIGRlbGV0ZWQgdGhlCisgICAgICAgICAgICAgICAgICogYVt0aGlza2V5XSBlbnRyeS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGhpc2tleSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBDb21wYXJlIGFbdGhpc2tleV0gdG8gYlt0aGlza2V5XTsgY21wIDwtIHRydWUgaWZmIGVxdWFsLiAqLwotCQl0aGlzYXZhbCA9IGEtPm1hX3RhYmxlW2ldLm1lX3ZhbHVlOwotCQlhc3NlcnQodGhpc2F2YWwpOwotCQlQeV9JTkNSRUYodGhpc2F2YWwpOyAgIC8qIGtlZXAgYWxpdmUgKi8KLQkJdGhpc2J2YWwgPSBQeURpY3RfR2V0SXRlbSgoUHlPYmplY3QgKiliLCB0aGlza2V5KTsKLQkJaWYgKHRoaXNidmFsID09IE5VTEwpCi0JCQljbXAgPSAwOwotCQllbHNlIHsKLQkJCS8qIGJvdGggZGljdHMgaGF2ZSB0aGlza2V5OiAgc2FtZSB2YWx1ZXM/ICovCi0JCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woCi0JCQkJCQl0aGlzYXZhbCwgdGhpc2J2YWwsIFB5X0VRKTsKLQkJCWlmIChjbXAgPCAwKSB7Ci0JCSAgICAJCVB5X0RFQ1JFRih0aGlza2V5KTsKLQkJICAgIAkJUHlfREVDUkVGKHRoaXNhdmFsKTsKLQkJICAgIAkJZ290byBGYWlsOwotCQkJfQotCQl9Ci0JCWlmIChjbXAgPT0gMCkgewotCQkJLyogTmV3IHdpbm5lci4gKi8KLQkJCVB5X1hERUNSRUYoYWtleSk7Ci0JCQlQeV9YREVDUkVGKGF2YWwpOwotCQkJYWtleSA9IHRoaXNrZXk7Ci0JCQlhdmFsID0gdGhpc2F2YWw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeV9ERUNSRUYodGhpc2tleSk7Ci0JCQlQeV9ERUNSRUYodGhpc2F2YWwpOwotCQl9Ci0JfQotCSpwdmFsID0gYXZhbDsKLQlyZXR1cm4gYWtleTsKKyAgICAgICAgLyogQ29tcGFyZSBhW3RoaXNrZXldIHRvIGJbdGhpc2tleV07IGNtcCA8LSB0cnVlIGlmZiBlcXVhbC4gKi8KKyAgICAgICAgdGhpc2F2YWwgPSBhLT5tYV90YWJsZVtpXS5tZV92YWx1ZTsKKyAgICAgICAgYXNzZXJ0KHRoaXNhdmFsKTsKKyAgICAgICAgUHlfSU5DUkVGKHRoaXNhdmFsKTsgICAvKiBrZWVwIGFsaXZlICovCisgICAgICAgIHRoaXNidmFsID0gUHlEaWN0X0dldEl0ZW0oKFB5T2JqZWN0ICopYiwgdGhpc2tleSk7CisgICAgICAgIGlmICh0aGlzYnZhbCA9PSBOVUxMKQorICAgICAgICAgICAgY21wID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBib3RoIGRpY3RzIGhhdmUgdGhpc2tleTogIHNhbWUgdmFsdWVzPyAqLworICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc2F2YWwsIHRoaXNidmFsLCBQeV9FUSk7CisgICAgICAgICAgICBpZiAoY21wIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0aGlza2V5KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGhpc2F2YWwpOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY21wID09IDApIHsKKyAgICAgICAgICAgIC8qIE5ldyB3aW5uZXIuICovCisgICAgICAgICAgICBQeV9YREVDUkVGKGFrZXkpOworICAgICAgICAgICAgUHlfWERFQ1JFRihhdmFsKTsKKyAgICAgICAgICAgIGFrZXkgPSB0aGlza2V5OworICAgICAgICAgICAgYXZhbCA9IHRoaXNhdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfREVDUkVGKHRoaXNrZXkpOworICAgICAgICAgICAgUHlfREVDUkVGKHRoaXNhdmFsKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqcHZhbCA9IGF2YWw7CisgICAgcmV0dXJuIGFrZXk7CiAKIEZhaWw6Ci0JUHlfWERFQ1JFRihha2V5KTsKLQlQeV9YREVDUkVGKGF2YWwpOwotCSpwdmFsID0gTlVMTDsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGFrZXkpOworICAgIFB5X1hERUNSRUYoYXZhbCk7CisgICAgKnB2YWwgPSBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBkaWN0X2NvbXBhcmUoUHlEaWN0T2JqZWN0ICphLCBQeURpY3RPYmplY3QgKmIpCiB7Ci0JUHlPYmplY3QgKmFkaWZmLCAqYmRpZmYsICphdmFsLCAqYnZhbDsKLQlpbnQgcmVzOworICAgIFB5T2JqZWN0ICphZGlmZiwgKmJkaWZmLCAqYXZhbCwgKmJ2YWw7CisgICAgaW50IHJlczsKIAotCS8qIENvbXBhcmUgbGVuZ3RocyBmaXJzdCAqLwotCWlmIChhLT5tYV91c2VkIDwgYi0+bWFfdXNlZCkKLQkJcmV0dXJuIC0xOwkvKiBhIGlzIHNob3J0ZXIgKi8KLQllbHNlIGlmIChhLT5tYV91c2VkID4gYi0+bWFfdXNlZCkKLQkJcmV0dXJuIDE7CS8qIGIgaXMgc2hvcnRlciAqLworICAgIC8qIENvbXBhcmUgbGVuZ3RocyBmaXJzdCAqLworICAgIGlmIChhLT5tYV91c2VkIDwgYi0+bWFfdXNlZCkKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgLyogYSBpcyBzaG9ydGVyICovCisgICAgZWxzZSBpZiAoYS0+bWFfdXNlZCA+IGItPm1hX3VzZWQpCisgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgIC8qIGIgaXMgc2hvcnRlciAqLwogCi0JLyogU2FtZSBsZW5ndGggLS0gY2hlY2sgYWxsIGtleXMgKi8KLQliZGlmZiA9IGJ2YWwgPSBOVUxMOwotCWFkaWZmID0gY2hhcmFjdGVyaXplKGEsIGIsICZhdmFsKTsKLQlpZiAoYWRpZmYgPT0gTlVMTCkgewotCQlhc3NlcnQoIWF2YWwpOwotCQkvKiBFaXRoZXIgYW4gZXJyb3IsIG9yIGEgaXMgYSBzdWJzZXQgd2l0aCB0aGUgc2FtZSBsZW5ndGggc28KLQkJICogbXVzdCBiZSBlcXVhbC4KLQkJICovCi0JCXJlcyA9IFB5RXJyX09jY3VycmVkKCkgPyAtMSA6IDA7Ci0JCWdvdG8gRmluaXNoZWQ7Ci0JfQotCWJkaWZmID0gY2hhcmFjdGVyaXplKGIsIGEsICZidmFsKTsKLQlpZiAoYmRpZmYgPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWFzc2VydCghYnZhbCk7Ci0JCXJlcyA9IC0xOwotCQlnb3RvIEZpbmlzaGVkOwotCX0KLQlyZXMgPSAwOwotCWlmIChiZGlmZikgewotCQkvKiBiZGlmZiA9PSBOVUxMICJzaG91bGQgYmUiIGltcG9zc2libGUgbm93LCBidXQgcGVyaGFwcwotCQkgKiB0aGUgbGFzdCBjb21wYXJpc29uIGRvbmUgYnkgdGhlIGNoYXJhY3Rlcml6ZSgpIG9uIGEgaGFkCi0JCSAqIHRoZSBzaWRlIGVmZmVjdCBvZiBtYWtpbmcgdGhlIGRpY3RzIGVxdWFsIQotCQkgKi8KLQkJcmVzID0gUHlPYmplY3RfQ29tcGFyZShhZGlmZiwgYmRpZmYpOwotCX0KLQlpZiAocmVzID09IDAgJiYgYnZhbCAhPSBOVUxMKQotCQlyZXMgPSBQeU9iamVjdF9Db21wYXJlKGF2YWwsIGJ2YWwpOworICAgIC8qIFNhbWUgbGVuZ3RoIC0tIGNoZWNrIGFsbCBrZXlzICovCisgICAgYmRpZmYgPSBidmFsID0gTlVMTDsKKyAgICBhZGlmZiA9IGNoYXJhY3Rlcml6ZShhLCBiLCAmYXZhbCk7CisgICAgaWYgKGFkaWZmID09IE5VTEwpIHsKKyAgICAgICAgYXNzZXJ0KCFhdmFsKTsKKyAgICAgICAgLyogRWl0aGVyIGFuIGVycm9yLCBvciBhIGlzIGEgc3Vic2V0IHdpdGggdGhlIHNhbWUgbGVuZ3RoIHNvCisgICAgICAgICAqIG11c3QgYmUgZXF1YWwuCisgICAgICAgICAqLworICAgICAgICByZXMgPSBQeUVycl9PY2N1cnJlZCgpID8gLTEgOiAwOworICAgICAgICBnb3RvIEZpbmlzaGVkOworICAgIH0KKyAgICBiZGlmZiA9IGNoYXJhY3Rlcml6ZShiLCBhLCAmYnZhbCk7CisgICAgaWYgKGJkaWZmID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBhc3NlcnQoIWJ2YWwpOworICAgICAgICByZXMgPSAtMTsKKyAgICAgICAgZ290byBGaW5pc2hlZDsKKyAgICB9CisgICAgcmVzID0gMDsKKyAgICBpZiAoYmRpZmYpIHsKKyAgICAgICAgLyogYmRpZmYgPT0gTlVMTCAic2hvdWxkIGJlIiBpbXBvc3NpYmxlIG5vdywgYnV0IHBlcmhhcHMKKyAgICAgICAgICogdGhlIGxhc3QgY29tcGFyaXNvbiBkb25lIGJ5IHRoZSBjaGFyYWN0ZXJpemUoKSBvbiBhIGhhZAorICAgICAgICAgKiB0aGUgc2lkZSBlZmZlY3Qgb2YgbWFraW5nIHRoZSBkaWN0cyBlcXVhbCEKKyAgICAgICAgICovCisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NvbXBhcmUoYWRpZmYsIGJkaWZmKTsKKyAgICB9CisgICAgaWYgKHJlcyA9PSAwICYmIGJ2YWwgIT0gTlVMTCkKKyAgICAgICAgcmVzID0gUHlPYmplY3RfQ29tcGFyZShhdmFsLCBidmFsKTsKIAogRmluaXNoZWQ6Ci0JUHlfWERFQ1JFRihhZGlmZik7Ci0JUHlfWERFQ1JFRihiZGlmZik7Ci0JUHlfWERFQ1JFRihhdmFsKTsKLQlQeV9YREVDUkVGKGJ2YWwpOwotCXJldHVybiByZXM7CisgICAgUHlfWERFQ1JFRihhZGlmZik7CisgICAgUHlfWERFQ1JFRihiZGlmZik7CisgICAgUHlfWERFQ1JFRihhdmFsKTsKKyAgICBQeV9YREVDUkVGKGJ2YWwpOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qIFJldHVybiAxIGlmIGRpY3RzIGVxdWFsLCAwIGlmIG5vdCwgLTEgaWYgZXJyb3IuCkBAIC0xNzMyLDI4NCArMTczMiwyODQgQEAKIHN0YXRpYyBpbnQKIGRpY3RfZXF1YWwoUHlEaWN0T2JqZWN0ICphLCBQeURpY3RPYmplY3QgKmIpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmIChhLT5tYV91c2VkICE9IGItPm1hX3VzZWQpCi0JCS8qIGNhbid0IGJlIGVxdWFsIGlmICMgb2YgZW50cmllcyBkaWZmZXIgKi8KLQkJcmV0dXJuIDA7CisgICAgaWYgKGEtPm1hX3VzZWQgIT0gYi0+bWFfdXNlZCkKKyAgICAgICAgLyogY2FuJ3QgYmUgZXF1YWwgaWYgIyBvZiBlbnRyaWVzIGRpZmZlciAqLworICAgICAgICByZXR1cm4gMDsKIAotCS8qIFNhbWUgIyBvZiBlbnRyaWVzIC0tIGNoZWNrIGFsbCBvZiAnZW0uICBFeGl0IGVhcmx5IG9uIGFueSBkaWZmLiAqLwotCWZvciAoaSA9IDA7IGkgPD0gYS0+bWFfbWFzazsgaSsrKSB7Ci0JCVB5T2JqZWN0ICphdmFsID0gYS0+bWFfdGFibGVbaV0ubWVfdmFsdWU7Ci0JCWlmIChhdmFsICE9IE5VTEwpIHsKLQkJCWludCBjbXA7Ci0JCQlQeU9iamVjdCAqYnZhbDsKLQkJCVB5T2JqZWN0ICprZXkgPSBhLT5tYV90YWJsZVtpXS5tZV9rZXk7Ci0JCQkvKiB0ZW1wb3JhcmlseSBidW1wIGF2YWwncyByZWZjb3VudCB0byBlbnN1cmUgaXQgc3RheXMKLQkJCSAgIGFsaXZlIHVudGlsIHdlJ3JlIGRvbmUgd2l0aCBpdCAqLwotCQkJUHlfSU5DUkVGKGF2YWwpOwotCQkJLyogZGl0dG8gZm9yIGtleSAqLwotCQkJUHlfSU5DUkVGKGtleSk7Ci0JCQlidmFsID0gUHlEaWN0X0dldEl0ZW0oKFB5T2JqZWN0ICopYiwga2V5KTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJaWYgKGJ2YWwgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihhdmFsKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChhdmFsLCBidmFsLCBQeV9FUSk7Ci0JCQlQeV9ERUNSRUYoYXZhbCk7Ci0JCQlpZiAoY21wIDw9IDApICAvKiBlcnJvciBvciBub3QgZXF1YWwgKi8KLQkJCQlyZXR1cm4gY21wOwotIAkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICAvKiBTYW1lICMgb2YgZW50cmllcyAtLSBjaGVjayBhbGwgb2YgJ2VtLiAgRXhpdCBlYXJseSBvbiBhbnkgZGlmZi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDw9IGEtPm1hX21hc2s7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqYXZhbCA9IGEtPm1hX3RhYmxlW2ldLm1lX3ZhbHVlOworICAgICAgICBpZiAoYXZhbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgY21wOworICAgICAgICAgICAgUHlPYmplY3QgKmJ2YWw7CisgICAgICAgICAgICBQeU9iamVjdCAqa2V5ID0gYS0+bWFfdGFibGVbaV0ubWVfa2V5OworICAgICAgICAgICAgLyogdGVtcG9yYXJpbHkgYnVtcCBhdmFsJ3MgcmVmY291bnQgdG8gZW5zdXJlIGl0IHN0YXlzCisgICAgICAgICAgICAgICBhbGl2ZSB1bnRpbCB3ZSdyZSBkb25lIHdpdGggaXQgKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihhdmFsKTsKKyAgICAgICAgICAgIC8qIGRpdHRvIGZvciBrZXkgKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOworICAgICAgICAgICAgYnZhbCA9IFB5RGljdF9HZXRJdGVtKChQeU9iamVjdCAqKWIsIGtleSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgIGlmIChidmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXZhbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woYXZhbCwgYnZhbCwgUHlfRVEpOworICAgICAgICAgICAgUHlfREVDUkVGKGF2YWwpOworICAgICAgICAgICAgaWYgKGNtcCA8PSAwKSAgLyogZXJyb3Igb3Igbm90IGVxdWFsICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKICB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X3JpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCWludCBjbXA7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBpbnQgY21wOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoIVB5RGljdF9DaGVjayh2KSB8fCAhUHlEaWN0X0NoZWNrKHcpKSB7Ci0JCXJlcyA9IFB5X05vdEltcGxlbWVudGVkOwotCX0KLQllbHNlIGlmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkgewotCQljbXAgPSBkaWN0X2VxdWFsKChQeURpY3RPYmplY3QgKil2LCAoUHlEaWN0T2JqZWN0ICopdyk7Ci0JCWlmIChjbXAgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlcyA9IChjbXAgPT0gKG9wID09IFB5X0VRKSkgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JfQotCWVsc2UgewotCQkvKiBQeTNLIHdhcm5pbmcgaWYgY29tcGFyaXNvbiBpc24ndCA9PSBvciAhPSAgKi8KLQkJaWYgKFB5RXJyX1dhcm5QeTNrKCJkaWN0IGluZXF1YWxpdHkgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCAiCi0JCQkJICAgImluIDMueCIsIDEpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCVB5X0lOQ1JFRihyZXMpOwotCXJldHVybiByZXM7CisgICAgaWYgKCFQeURpY3RfQ2hlY2sodikgfHwgIVB5RGljdF9DaGVjayh3KSkgeworICAgICAgICByZXMgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgZWxzZSBpZiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpIHsKKyAgICAgICAgY21wID0gZGljdF9lcXVhbCgoUHlEaWN0T2JqZWN0ICopdiwgKFB5RGljdE9iamVjdCAqKXcpOworICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXMgPSAoY21wID09IChvcCA9PSBQeV9FUSkpID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogUHkzSyB3YXJuaW5nIGlmIGNvbXBhcmlzb24gaXNuJ3QgPT0gb3IgIT0gICovCisgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiZGljdCBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIDMueCIsIDEpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIFB5X0lOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7CiAgfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9jb250YWlucyhyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5KQogewotCWxvbmcgaGFzaDsKLQlQeURpY3RFbnRyeSAqZXA7CisgICAgbG9uZyBoYXNoOworICAgIFB5RGljdEVudHJ5ICplcDsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8Ci0JICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7Ci0JaWYgKGVwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoZXAtPm1lX3ZhbHVlICE9IE5VTEwpOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgaWYgKGVwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoZXAtPm1lX3ZhbHVlICE9IE5VTEwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9oYXNfa2V5KHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXkpCiB7Ci0JaWYgKFB5RXJyX1dhcm5QeTNrKCJkaWN0Lmhhc19rZXkoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgotCQkJICAgInVzZSB0aGUgaW4gb3BlcmF0b3IiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBkaWN0X2NvbnRhaW5zKG1wLCBrZXkpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiZGljdC5oYXNfa2V5KCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInVzZSB0aGUgaW4gb3BlcmF0b3IiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBkaWN0X2NvbnRhaW5zKG1wLCBrZXkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9nZXQocmVnaXN0ZXIgUHlEaWN0T2JqZWN0ICptcCwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmtleTsKLQlQeU9iamVjdCAqZmFpbG9iaiA9IFB5X05vbmU7Ci0JUHlPYmplY3QgKnZhbCA9IE5VTEw7Ci0JbG9uZyBoYXNoOwotCVB5RGljdEVudHJ5ICplcDsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5T2JqZWN0ICpmYWlsb2JqID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqdmFsID0gTlVMTDsKKyAgICBsb25nIGhhc2g7CisgICAgUHlEaWN0RW50cnkgKmVwOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZ2V0IiwgMSwgMiwgJmtleSwgJmZhaWxvYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJnZXQiLCAxLCAyLCAma2V5LCAmZmFpbG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQlpZiAoZXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdmFsID0gZXAtPm1lX3ZhbHVlOwotCWlmICh2YWwgPT0gTlVMTCkKLQkJdmFsID0gZmFpbG9iajsKLQlQeV9JTkNSRUYodmFsKTsKLQlyZXR1cm4gdmFsOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgaWYgKGVwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHZhbCA9IGVwLT5tZV92YWx1ZTsKKyAgICBpZiAodmFsID09IE5VTEwpCisgICAgICAgIHZhbCA9IGZhaWxvYmo7CisgICAgUHlfSU5DUkVGKHZhbCk7CisgICAgcmV0dXJuIHZhbDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9zZXRkZWZhdWx0KHJlZ2lzdGVyIFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICprZXk7Ci0JUHlPYmplY3QgKmZhaWxvYmogPSBQeV9Ob25lOwotCVB5T2JqZWN0ICp2YWwgPSBOVUxMOwotCWxvbmcgaGFzaDsKLQlQeURpY3RFbnRyeSAqZXA7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICBQeU9iamVjdCAqZmFpbG9iaiA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnZhbCA9IE5VTEw7CisgICAgbG9uZyBoYXNoOworICAgIFB5RGljdEVudHJ5ICplcDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldGRlZmF1bHQiLCAxLCAyLCAma2V5LCAmZmFpbG9iaikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldGRlZmF1bHQiLCAxLCAyLCAma2V5LCAmZmFpbG9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKLQkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewotCQloYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOwotCQlpZiAoaGFzaCA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQlpZiAoZXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdmFsID0gZXAtPm1lX3ZhbHVlOwotCWlmICh2YWwgPT0gTlVMTCkgewotCQl2YWwgPSBmYWlsb2JqOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0oKFB5T2JqZWN0KiltcCwga2V5LCBmYWlsb2JqKSkKLQkJCXZhbCA9IE5VTEw7Ci0JfQotCVB5X1hJTkNSRUYodmFsKTsKLQlyZXR1cm4gdmFsOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXAgPSAobXAtPm1hX2xvb2t1cCkobXAsIGtleSwgaGFzaCk7CisgICAgaWYgKGVwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHZhbCA9IGVwLT5tZV92YWx1ZTsKKyAgICBpZiAodmFsID09IE5VTEwpIHsKKyAgICAgICAgdmFsID0gZmFpbG9iajsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKChQeU9iamVjdCopbXAsIGtleSwgZmFpbG9iaikpCisgICAgICAgICAgICB2YWwgPSBOVUxMOworICAgIH0KKyAgICBQeV9YSU5DUkVGKHZhbCk7CisgICAgcmV0dXJuIHZhbDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9jbGVhcihyZWdpc3RlciBQeURpY3RPYmplY3QgKm1wKQogewotCVB5RGljdF9DbGVhcigoUHlPYmplY3QgKiltcCk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlEaWN0X0NsZWFyKChQeU9iamVjdCAqKW1wKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfcG9wKFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgaGFzaDsKLQlQeURpY3RFbnRyeSAqZXA7Ci0JUHlPYmplY3QgKm9sZF92YWx1ZSwgKm9sZF9rZXk7Ci0JUHlPYmplY3QgKmtleSwgKmRlZmx0ID0gTlVMTDsKKyAgICBsb25nIGhhc2g7CisgICAgUHlEaWN0RW50cnkgKmVwOworICAgIFB5T2JqZWN0ICpvbGRfdmFsdWUsICpvbGRfa2V5OworICAgIFB5T2JqZWN0ICprZXksICpkZWZsdCA9IE5VTEw7CiAKLQlpZighUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvcCIsIDEsIDIsICZrZXksICZkZWZsdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChtcC0+bWFfdXNlZCA9PSAwKSB7Ci0JCWlmIChkZWZsdCkgewotCQkJUHlfSU5DUkVGKGRlZmx0KTsKLQkJCXJldHVybiBkZWZsdDsKLQkJfQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCi0JCQkJInBvcCgpOiBkaWN0aW9uYXJ5IGlzIGVtcHR5Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOwotCWlmIChlcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZXAtPm1lX3ZhbHVlID09IE5VTEwpIHsKLQkJaWYgKGRlZmx0KSB7Ci0JCQlQeV9JTkNSRUYoZGVmbHQpOwotCQkJcmV0dXJuIGRlZmx0OwotCQl9Ci0JCXNldF9rZXlfZXJyb3Ioa2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW9sZF9rZXkgPSBlcC0+bWVfa2V5OwotCVB5X0lOQ1JFRihkdW1teSk7Ci0JZXAtPm1lX2tleSA9IGR1bW15OwotCW9sZF92YWx1ZSA9IGVwLT5tZV92YWx1ZTsKLQllcC0+bWVfdmFsdWUgPSBOVUxMOwotCW1wLT5tYV91c2VkLS07Ci0JUHlfREVDUkVGKG9sZF9rZXkpOwotCXJldHVybiBvbGRfdmFsdWU7CisgICAgaWYoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJwb3AiLCAxLCAyLCAma2V5LCAmZGVmbHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobXAtPm1hX3VzZWQgPT0gMCkgeworICAgICAgICBpZiAoZGVmbHQpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihkZWZsdCk7CisgICAgICAgICAgICByZXR1cm4gZGVmbHQ7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInBvcCgpOiBkaWN0aW9uYXJ5IGlzIGVtcHR5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOworICAgIGlmIChlcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoZXAtPm1lX3ZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlZmx0KSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZGVmbHQpOworICAgICAgICAgICAgcmV0dXJuIGRlZmx0OworICAgICAgICB9CisgICAgICAgIHNldF9rZXlfZXJyb3Ioa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9sZF9rZXkgPSBlcC0+bWVfa2V5OworICAgIFB5X0lOQ1JFRihkdW1teSk7CisgICAgZXAtPm1lX2tleSA9IGR1bW15OworICAgIG9sZF92YWx1ZSA9IGVwLT5tZV92YWx1ZTsKKyAgICBlcC0+bWVfdmFsdWUgPSBOVUxMOworICAgIG1wLT5tYV91c2VkLS07CisgICAgUHlfREVDUkVGKG9sZF9rZXkpOworICAgIHJldHVybiBvbGRfdmFsdWU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X3BvcGl0ZW0oUHlEaWN0T2JqZWN0ICptcCkKIHsKLQlQeV9zc2l6ZV90IGkgPSAwOwotCVB5RGljdEVudHJ5ICplcDsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5X3NzaXplX3QgaSA9IDA7CisgICAgUHlEaWN0RW50cnkgKmVwOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQkvKiBBbGxvY2F0ZSB0aGUgcmVzdWx0IHR1cGxlIGJlZm9yZSBjaGVja2luZyB0aGUgc2l6ZS4gIEJlbGlldmUgaXQKLQkgKiBvciBub3QsIHRoaXMgYWxsb2NhdGlvbiBjb3VsZCB0cmlnZ2VyIGEgZ2FyYmFnZSBjb2xsZWN0aW9uIHdoaWNoCi0JICogY291bGQgZW1wdHkgdGhlIGRpY3QsIHNvIGlmIHdlIGNoZWNrZWQgdGhlIHNpemUgZmlyc3QgYW5kIHRoYXQKLQkgKiBoYXBwZW5lZCwgdGhlIHJlc3VsdCB3b3VsZCBiZSBhbiBpbmZpbml0ZSBsb29wIChzZWFyY2hpbmcgZm9yIGFuCi0JICogZW50cnkgdGhhdCBubyBsb25nZXIgZXhpc3RzKS4gIE5vdGUgdGhhdCB0aGUgdXN1YWwgcG9waXRlbSgpCi0JICogaWRpb20gaXMgIndoaWxlIGQ6IGssIHYgPSBkLnBvcGl0ZW0oKSIuIHNvIG5lZWRpbmcgdG8gdGhyb3cgdGhlCi0JICogdHVwbGUgYXdheSBpZiB0aGUgZGljdCAqaXMqIGVtcHR5IGlzbid0IGEgc2lnbmlmaWNhbnQKLQkgKiBpbmVmZmljaWVuY3kgLS0gcG9zc2libGUsIGJ1dCB1bmxpa2VseSBpbiBwcmFjdGljZS4KLQkgKi8KLQlyZXMgPSBQeVR1cGxlX05ldygyKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChtcC0+bWFfdXNlZCA9PSAwKSB7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCi0JCQkJInBvcGl0ZW0oKTogZGljdGlvbmFyeSBpcyBlbXB0eSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogU2V0IGVwIHRvICJ0aGUgZmlyc3QiIGRpY3QgZW50cnkgd2l0aCBhIHZhbHVlLiAgV2UgYWJ1c2UgdGhlIGhhc2gKLQkgKiBmaWVsZCBvZiBzbG90IDAgdG8gaG9sZCBhIHNlYXJjaCBmaW5nZXI6Ci0JICogSWYgc2xvdCAwIGhhcyBhIHZhbHVlLCB1c2Ugc2xvdCAwLgotCSAqIEVsc2Ugc2xvdCAwIGlzIGJlaW5nIHVzZWQgdG8gaG9sZCBhIHNlYXJjaCBmaW5nZXIsCi0JICogYW5kIHdlIHVzZSBpdHMgaGFzaCB2YWx1ZSBhcyB0aGUgZmlyc3QgaW5kZXggdG8gbG9vay4KLQkgKi8KLQllcCA9ICZtcC0+bWFfdGFibGVbMF07Ci0JaWYgKGVwLT5tZV92YWx1ZSA9PSBOVUxMKSB7Ci0JCWkgPSBlcC0+bWVfaGFzaDsKLQkJLyogVGhlIGhhc2ggZmllbGQgbWF5IGJlIGEgcmVhbCBoYXNoIHZhbHVlLCBvciBpdCBtYXkgYmUgYQotCQkgKiBsZWdpdCBzZWFyY2ggZmluZ2VyLCBvciBpdCBtYXkgYmUgYSBvbmNlLWxlZ2l0IHNlYXJjaAotCQkgKiBmaW5nZXIgdGhhdCdzIG91dCBvZiBib3VuZHMgbm93IGJlY2F1c2UgaXQgd3JhcHBlZCBhcm91bmQKLQkJICogb3IgdGhlIHRhYmxlIHNocnVuayAtLSBzaW1wbHkgbWFrZSBzdXJlIGl0J3MgaW4gYm91bmRzIG5vdy4KLQkJICovCi0JCWlmIChpID4gbXAtPm1hX21hc2sgfHwgaSA8IDEpCi0JCQlpID0gMTsJLyogc2tpcCBzbG90IDAgKi8KLQkJd2hpbGUgKChlcCA9ICZtcC0+bWFfdGFibGVbaV0pLT5tZV92YWx1ZSA9PSBOVUxMKSB7Ci0JCQlpKys7Ci0JCQlpZiAoaSA+IG1wLT5tYV9tYXNrKQotCQkJCWkgPSAxOwotCQl9Ci0JfQotCVB5VHVwbGVfU0VUX0lURU0ocmVzLCAwLCBlcC0+bWVfa2V5KTsKLQlQeVR1cGxlX1NFVF9JVEVNKHJlcywgMSwgZXAtPm1lX3ZhbHVlKTsKLQlQeV9JTkNSRUYoZHVtbXkpOwotCWVwLT5tZV9rZXkgPSBkdW1teTsKLQllcC0+bWVfdmFsdWUgPSBOVUxMOwotCW1wLT5tYV91c2VkLS07Ci0JYXNzZXJ0KG1wLT5tYV90YWJsZVswXS5tZV92YWx1ZSA9PSBOVUxMKTsKLQltcC0+bWFfdGFibGVbMF0ubWVfaGFzaCA9IGkgKyAxOyAgLyogbmV4dCBwbGFjZSB0byBzdGFydCAqLwotCXJldHVybiByZXM7CisgICAgLyogQWxsb2NhdGUgdGhlIHJlc3VsdCB0dXBsZSBiZWZvcmUgY2hlY2tpbmcgdGhlIHNpemUuICBCZWxpZXZlIGl0CisgICAgICogb3Igbm90LCB0aGlzIGFsbG9jYXRpb24gY291bGQgdHJpZ2dlciBhIGdhcmJhZ2UgY29sbGVjdGlvbiB3aGljaAorICAgICAqIGNvdWxkIGVtcHR5IHRoZSBkaWN0LCBzbyBpZiB3ZSBjaGVja2VkIHRoZSBzaXplIGZpcnN0IGFuZCB0aGF0CisgICAgICogaGFwcGVuZWQsIHRoZSByZXN1bHQgd291bGQgYmUgYW4gaW5maW5pdGUgbG9vcCAoc2VhcmNoaW5nIGZvciBhbgorICAgICAqIGVudHJ5IHRoYXQgbm8gbG9uZ2VyIGV4aXN0cykuICBOb3RlIHRoYXQgdGhlIHVzdWFsIHBvcGl0ZW0oKQorICAgICAqIGlkaW9tIGlzICJ3aGlsZSBkOiBrLCB2ID0gZC5wb3BpdGVtKCkiLiBzbyBuZWVkaW5nIHRvIHRocm93IHRoZQorICAgICAqIHR1cGxlIGF3YXkgaWYgdGhlIGRpY3QgKmlzKiBlbXB0eSBpc24ndCBhIHNpZ25pZmljYW50CisgICAgICogaW5lZmZpY2llbmN5IC0tIHBvc3NpYmxlLCBidXQgdW5saWtlbHkgaW4gcHJhY3RpY2UuCisgICAgICovCisgICAgcmVzID0gUHlUdXBsZV9OZXcoMik7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobXAtPm1hX3VzZWQgPT0gMCkgeworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInBvcGl0ZW0oKTogZGljdGlvbmFyeSBpcyBlbXB0eSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogU2V0IGVwIHRvICJ0aGUgZmlyc3QiIGRpY3QgZW50cnkgd2l0aCBhIHZhbHVlLiAgV2UgYWJ1c2UgdGhlIGhhc2gKKyAgICAgKiBmaWVsZCBvZiBzbG90IDAgdG8gaG9sZCBhIHNlYXJjaCBmaW5nZXI6CisgICAgICogSWYgc2xvdCAwIGhhcyBhIHZhbHVlLCB1c2Ugc2xvdCAwLgorICAgICAqIEVsc2Ugc2xvdCAwIGlzIGJlaW5nIHVzZWQgdG8gaG9sZCBhIHNlYXJjaCBmaW5nZXIsCisgICAgICogYW5kIHdlIHVzZSBpdHMgaGFzaCB2YWx1ZSBhcyB0aGUgZmlyc3QgaW5kZXggdG8gbG9vay4KKyAgICAgKi8KKyAgICBlcCA9ICZtcC0+bWFfdGFibGVbMF07CisgICAgaWYgKGVwLT5tZV92YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIGkgPSBlcC0+bWVfaGFzaDsKKyAgICAgICAgLyogVGhlIGhhc2ggZmllbGQgbWF5IGJlIGEgcmVhbCBoYXNoIHZhbHVlLCBvciBpdCBtYXkgYmUgYQorICAgICAgICAgKiBsZWdpdCBzZWFyY2ggZmluZ2VyLCBvciBpdCBtYXkgYmUgYSBvbmNlLWxlZ2l0IHNlYXJjaAorICAgICAgICAgKiBmaW5nZXIgdGhhdCdzIG91dCBvZiBib3VuZHMgbm93IGJlY2F1c2UgaXQgd3JhcHBlZCBhcm91bmQKKyAgICAgICAgICogb3IgdGhlIHRhYmxlIHNocnVuayAtLSBzaW1wbHkgbWFrZSBzdXJlIGl0J3MgaW4gYm91bmRzIG5vdy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChpID4gbXAtPm1hX21hc2sgfHwgaSA8IDEpCisgICAgICAgICAgICBpID0gMTsgICAgICAgICAgICAgIC8qIHNraXAgc2xvdCAwICovCisgICAgICAgIHdoaWxlICgoZXAgPSAmbXAtPm1hX3RhYmxlW2ldKS0+bWVfdmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaWYgKGkgPiBtcC0+bWFfbWFzaykKKyAgICAgICAgICAgICAgICBpID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHJlcywgMCwgZXAtPm1lX2tleSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXMsIDEsIGVwLT5tZV92YWx1ZSk7CisgICAgUHlfSU5DUkVGKGR1bW15KTsKKyAgICBlcC0+bWVfa2V5ID0gZHVtbXk7CisgICAgZXAtPm1lX3ZhbHVlID0gTlVMTDsKKyAgICBtcC0+bWFfdXNlZC0tOworICAgIGFzc2VydChtcC0+bWFfdGFibGVbMF0ubWVfdmFsdWUgPT0gTlVMTCk7CisgICAgbXAtPm1hX3RhYmxlWzBdLm1lX2hhc2ggPSBpICsgMTsgIC8qIG5leHQgcGxhY2UgdG8gc3RhcnQgKi8KKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50CiBkaWN0X3RyYXZlcnNlKFB5T2JqZWN0ICpvcCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfc3NpemVfdCBpID0gMDsKLQlQeU9iamVjdCAqcGs7Ci0JUHlPYmplY3QgKnB2OworICAgIFB5X3NzaXplX3QgaSA9IDA7CisgICAgUHlPYmplY3QgKnBrOworICAgIFB5T2JqZWN0ICpwdjsKIAotCXdoaWxlIChQeURpY3RfTmV4dChvcCwgJmksICZwaywgJnB2KSkgewotCQlQeV9WSVNJVChwayk7Ci0JCVB5X1ZJU0lUKHB2KTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KG9wLCAmaSwgJnBrLCAmcHYpKSB7CisgICAgICAgIFB5X1ZJU0lUKHBrKTsKKyAgICAgICAgUHlfVklTSVQocHYpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogZGljdF90cF9jbGVhcihQeU9iamVjdCAqb3ApCiB7Ci0JUHlEaWN0X0NsZWFyKG9wKTsKLQlyZXR1cm4gMDsKKyAgICBQeURpY3RfQ2xlYXIob3ApOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTIwMjEsMzAgKzIwMjEsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2l0ZXJrZXlzKFB5RGljdE9iamVjdCAqZGljdCkKIHsKLQlyZXR1cm4gZGljdGl0ZXJfbmV3KGRpY3QsICZQeURpY3RJdGVyS2V5X1R5cGUpOworICAgIHJldHVybiBkaWN0aXRlcl9uZXcoZGljdCwgJlB5RGljdEl0ZXJLZXlfVHlwZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2l0ZXJ2YWx1ZXMoUHlEaWN0T2JqZWN0ICpkaWN0KQogewotCXJldHVybiBkaWN0aXRlcl9uZXcoZGljdCwgJlB5RGljdEl0ZXJWYWx1ZV9UeXBlKTsKKyAgICByZXR1cm4gZGljdGl0ZXJfbmV3KGRpY3QsICZQeURpY3RJdGVyVmFsdWVfVHlwZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X2l0ZXJpdGVtcyhQeURpY3RPYmplY3QgKmRpY3QpCiB7Ci0JcmV0dXJuIGRpY3RpdGVyX25ldyhkaWN0LCAmUHlEaWN0SXRlckl0ZW1fVHlwZSk7CisgICAgcmV0dXJuIGRpY3RpdGVyX25ldyhkaWN0LCAmUHlEaWN0SXRlckl0ZW1fVHlwZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0X3NpemVvZihQeURpY3RPYmplY3QgKm1wKQogewotCVB5X3NzaXplX3QgcmVzOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0JcmVzID0gc2l6ZW9mKFB5RGljdE9iamVjdCk7Ci0JaWYgKG1wLT5tYV90YWJsZSAhPSBtcC0+bWFfc21hbGx0YWJsZSkKLQkJcmVzID0gcmVzICsgKG1wLT5tYV9tYXNrICsgMSkgKiBzaXplb2YoUHlEaWN0RW50cnkpOwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOworICAgIHJlcyA9IHNpemVvZihQeURpY3RPYmplY3QpOworICAgIGlmIChtcC0+bWFfdGFibGUgIT0gbXAtPm1hX3NtYWxsdGFibGUpCisgICAgICAgIHJlcyA9IHJlcyArIChtcC0+bWFfbWFzayArIDEpICogc2l6ZW9mKFB5RGljdEVudHJ5KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogUHlEb2NfU1RSVkFSKGhhc19rZXlfX2RvY19fLApAQCAtMjEwNywxMTggKzIxMDcsMTE4IEBACiAiRC5pdGVyaXRlbXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgaXRlbXMgb2YgRCIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgbWFwcF9tZXRob2RzW10gPSB7Ci0JeyJfX2NvbnRhaW5zX18iLChQeUNGdW5jdGlvbilkaWN0X2NvbnRhaW5zLAlNRVRIX08gfCBNRVRIX0NPRVhJU1QsCi0JIGNvbnRhaW5zX19kb2NfX30sCi0JeyJfX2dldGl0ZW1fXyIsIChQeUNGdW5jdGlvbilkaWN0X3N1YnNjcmlwdCwJTUVUSF9PIHwgTUVUSF9DT0VYSVNULAotCSBnZXRpdGVtX19kb2NfX30sCi0JeyJfX3NpemVvZl9fIiwJKFB5Q0Z1bmN0aW9uKWRpY3Rfc2l6ZW9mLAlNRVRIX05PQVJHUywKLQkgc2l6ZW9mX19kb2NfX30sCi0JeyJoYXNfa2V5IiwJKFB5Q0Z1bmN0aW9uKWRpY3RfaGFzX2tleSwgICAgICBNRVRIX08sCi0JIGhhc19rZXlfX2RvY19ffSwKLQl7ImdldCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfZ2V0LCAgICAgICAgICBNRVRIX1ZBUkFSR1MsCi0JIGdldF9fZG9jX199LAotCXsic2V0ZGVmYXVsdCIsICAoUHlDRnVuY3Rpb24pZGljdF9zZXRkZWZhdWx0LCAgIE1FVEhfVkFSQVJHUywKLQkgc2V0ZGVmYXVsdF9kb2NfX30sCi0JeyJwb3AiLCAgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X3BvcCwgICAgICAgICAgTUVUSF9WQVJBUkdTLAotCSBwb3BfX2RvY19ffSwKLQl7InBvcGl0ZW0iLAkoUHlDRnVuY3Rpb24pZGljdF9wb3BpdGVtLAlNRVRIX05PQVJHUywKLQkgcG9waXRlbV9fZG9jX199LAotCXsia2V5cyIsCShQeUNGdW5jdGlvbilkaWN0X2tleXMsCQlNRVRIX05PQVJHUywKLQlrZXlzX19kb2NfX30sCi0JeyJpdGVtcyIsCShQeUNGdW5jdGlvbilkaWN0X2l0ZW1zLAlNRVRIX05PQVJHUywKLQkgaXRlbXNfX2RvY19ffSwKLQl7InZhbHVlcyIsCShQeUNGdW5jdGlvbilkaWN0X3ZhbHVlcywJTUVUSF9OT0FSR1MsCi0JIHZhbHVlc19fZG9jX199LAotCXsidXBkYXRlIiwJKFB5Q0Z1bmN0aW9uKWRpY3RfdXBkYXRlLAlNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotCSB1cGRhdGVfX2RvY19ffSwKLQl7ImZyb21rZXlzIiwJKFB5Q0Z1bmN0aW9uKWRpY3RfZnJvbWtleXMsCU1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsCi0JIGZyb21rZXlzX19kb2NfX30sCi0JeyJjbGVhciIsCShQeUNGdW5jdGlvbilkaWN0X2NsZWFyLAlNRVRIX05PQVJHUywKLQkgY2xlYXJfX2RvY19ffSwKLQl7ImNvcHkiLAkoUHlDRnVuY3Rpb24pZGljdF9jb3B5LAkJTUVUSF9OT0FSR1MsCi0JIGNvcHlfX2RvY19ffSwKLQl7Iml0ZXJrZXlzIiwJKFB5Q0Z1bmN0aW9uKWRpY3RfaXRlcmtleXMsCU1FVEhfTk9BUkdTLAotCSBpdGVya2V5c19fZG9jX199LAotCXsiaXRlcnZhbHVlcyIsCShQeUNGdW5jdGlvbilkaWN0X2l0ZXJ2YWx1ZXMsCU1FVEhfTk9BUkdTLAotCSBpdGVydmFsdWVzX19kb2NfX30sCi0JeyJpdGVyaXRlbXMiLAkoUHlDRnVuY3Rpb24pZGljdF9pdGVyaXRlbXMsCU1FVEhfTk9BUkdTLAotCSBpdGVyaXRlbXNfX2RvY19ffSwKLQl7TlVMTCwJCU5VTEx9CS8qIHNlbnRpbmVsICovCisgICAgeyJfX2NvbnRhaW5zX18iLChQeUNGdW5jdGlvbilkaWN0X2NvbnRhaW5zLCAgICAgICAgIE1FVEhfTyB8IE1FVEhfQ09FWElTVCwKKyAgICAgY29udGFpbnNfX2RvY19ffSwKKyAgICB7Il9fZ2V0aXRlbV9fIiwgKFB5Q0Z1bmN0aW9uKWRpY3Rfc3Vic2NyaXB0LCAgICAgICAgTUVUSF9PIHwgTUVUSF9DT0VYSVNULAorICAgICBnZXRpdGVtX19kb2NfX30sCisgICAgeyJfX3NpemVvZl9fIiwgICAgICAoUHlDRnVuY3Rpb24pZGljdF9zaXplb2YsICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBzaXplb2ZfX2RvY19ffSwKKyAgICB7Imhhc19rZXkiLCAgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X2hhc19rZXksICAgICAgTUVUSF9PLAorICAgICBoYXNfa2V5X19kb2NfX30sCisgICAgeyJnZXQiLCAgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X2dldCwgICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBnZXRfX2RvY19ffSwKKyAgICB7InNldGRlZmF1bHQiLCAgKFB5Q0Z1bmN0aW9uKWRpY3Rfc2V0ZGVmYXVsdCwgICBNRVRIX1ZBUkFSR1MsCisgICAgIHNldGRlZmF1bHRfZG9jX199LAorICAgIHsicG9wIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9wb3AsICAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgcG9wX19kb2NfX30sCisgICAgeyJwb3BpdGVtIiwgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9wb3BpdGVtLCAgICAgIE1FVEhfTk9BUkdTLAorICAgICBwb3BpdGVtX19kb2NfX30sCisgICAgeyJrZXlzIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9rZXlzLCAgICAgICAgIE1FVEhfTk9BUkdTLAorICAgIGtleXNfX2RvY19ffSwKKyAgICB7Iml0ZW1zIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X2l0ZW1zLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIGl0ZW1zX19kb2NfX30sCisgICAgeyJ2YWx1ZXMiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF92YWx1ZXMsICAgICAgIE1FVEhfTk9BUkdTLAorICAgICB2YWx1ZXNfX2RvY19ffSwKKyAgICB7InVwZGF0ZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilkaWN0X3VwZGF0ZSwgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKKyAgICAgdXBkYXRlX19kb2NfX30sCisgICAgeyJmcm9ta2V5cyIsICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9mcm9ta2V5cywgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfQ0xBU1MsCisgICAgIGZyb21rZXlzX19kb2NfX30sCisgICAgeyJjbGVhciIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pZGljdF9jbGVhciwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBjbGVhcl9fZG9jX199LAorICAgIHsiY29weSIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfY29weSwgICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgY29weV9fZG9jX199LAorICAgIHsiaXRlcmtleXMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWRpY3RfaXRlcmtleXMsICAgICBNRVRIX05PQVJHUywKKyAgICAgaXRlcmtleXNfX2RvY19ffSwKKyAgICB7Iml0ZXJ2YWx1ZXMiLCAgICAgIChQeUNGdW5jdGlvbilkaWN0X2l0ZXJ2YWx1ZXMsICAgTUVUSF9OT0FSR1MsCisgICAgIGl0ZXJ2YWx1ZXNfX2RvY19ffSwKKyAgICB7Iml0ZXJpdGVtcyIsICAgICAgIChQeUNGdW5jdGlvbilkaWN0X2l0ZXJpdGVtcywgICAgTUVUSF9OT0FSR1MsCisgICAgIGl0ZXJpdGVtc19fZG9jX199LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogUmV0dXJuIDEgaWYgYGtleWAgaXMgaW4gZGljdCBgb3BgLCAwIGlmIG5vdCwgYW5kIC0xIG9uIGVycm9yLiAqLwogaW50CiBQeURpY3RfQ29udGFpbnMoUHlPYmplY3QgKm9wLCBQeU9iamVjdCAqa2V5KQogewotCWxvbmcgaGFzaDsKLQlQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKW9wOwotCVB5RGljdEVudHJ5ICplcDsKKyAgICBsb25nIGhhc2g7CisgICAgUHlEaWN0T2JqZWN0ICptcCA9IChQeURpY3RPYmplY3QgKilvcDsKKyAgICBQeURpY3RFbnRyeSAqZXA7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQllcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKLQlyZXR1cm4gZXAgPT0gTlVMTCA/IC0xIDogKGVwLT5tZV92YWx1ZSAhPSBOVUxMKTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlcCA9IChtcC0+bWFfbG9va3VwKShtcCwga2V5LCBoYXNoKTsKKyAgICByZXR1cm4gZXAgPT0gTlVMTCA/IC0xIDogKGVwLT5tZV92YWx1ZSAhPSBOVUxMKTsKIH0KIAogLyogSW50ZXJuYWwgdmVyc2lvbiBvZiBQeURpY3RfQ29udGFpbnMgdXNlZCB3aGVuIHRoZSBoYXNoIHZhbHVlIGlzIGFscmVhZHkga25vd24gKi8KIGludAogX1B5RGljdF9Db250YWlucyhQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCkKIHsKLQlQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKW9wOwotCVB5RGljdEVudHJ5ICplcDsKKyAgICBQeURpY3RPYmplY3QgKm1wID0gKFB5RGljdE9iamVjdCAqKW9wOworICAgIFB5RGljdEVudHJ5ICplcDsKIAotCWVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOwotCXJldHVybiBlcCA9PSBOVUxMID8gLTEgOiAoZXAtPm1lX3ZhbHVlICE9IE5VTEwpOworICAgIGVwID0gKG1wLT5tYV9sb29rdXApKG1wLCBrZXksIGhhc2gpOworICAgIHJldHVybiBlcCA9PSBOVUxMID8gLTEgOiAoZXAtPm1lX3ZhbHVlICE9IE5VTEwpOwogfQogCiAvKiBIYWNrIHRvIGltcGxlbWVudCAia2V5IGluIGRpY3QiICovCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgZGljdF9hc19zZXF1ZW5jZSA9IHsKLQkwLAkJCS8qIHNxX2xlbmd0aCAqLwotCTAsCQkJLyogc3FfY29uY2F0ICovCi0JMCwJCQkvKiBzcV9yZXBlYXQgKi8KLQkwLAkJCS8qIHNxX2l0ZW0gKi8KLQkwLAkJCS8qIHNxX3NsaWNlICovCi0JMCwJCQkvKiBzcV9hc3NfaXRlbSAqLwotCTAsCQkJLyogc3FfYXNzX3NsaWNlICovCi0JUHlEaWN0X0NvbnRhaW5zLAkvKiBzcV9jb250YWlucyAqLwotCTAsCQkJLyogc3FfaW5wbGFjZV9jb25jYXQgKi8KLQkwLAkJCS8qIHNxX2lucGxhY2VfcmVwZWF0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb25jYXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfcmVwZWF0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Ffc2xpY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX3NsaWNlICovCisgICAgUHlEaWN0X0NvbnRhaW5zLCAgICAgICAgICAgIC8qIHNxX2NvbnRhaW5zICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2lucGxhY2VfcmVwZWF0ICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CiAKLQlhc3NlcnQodHlwZSAhPSBOVUxMICYmIHR5cGUtPnRwX2FsbG9jICE9IE5VTEwpOwotCXNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiAhPSBOVUxMKSB7Ci0JCVB5RGljdE9iamVjdCAqZCA9IChQeURpY3RPYmplY3QgKilzZWxmOwotCQkvKiBJdCdzIGd1YXJhbnRlZWQgdGhhdCB0cC0+YWxsb2MgemVyb2VkIG91dCB0aGUgc3RydWN0LiAqLwotCQlhc3NlcnQoZC0+bWFfdGFibGUgPT0gTlVMTCAmJiBkLT5tYV9maWxsID09IDAgJiYgZC0+bWFfdXNlZCA9PSAwKTsKLQkJSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMoZCk7Ci0JCWQtPm1hX2xvb2t1cCA9IGxvb2tkaWN0X3N0cmluZzsKKyAgICBhc3NlcnQodHlwZSAhPSBOVUxMICYmIHR5cGUtPnRwX2FsbG9jICE9IE5VTEwpOworICAgIHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIFB5RGljdE9iamVjdCAqZCA9IChQeURpY3RPYmplY3QgKilzZWxmOworICAgICAgICAvKiBJdCdzIGd1YXJhbnRlZWQgdGhhdCB0cC0+YWxsb2MgemVyb2VkIG91dCB0aGUgc3RydWN0LiAqLworICAgICAgICBhc3NlcnQoZC0+bWFfdGFibGUgPT0gTlVMTCAmJiBkLT5tYV9maWxsID09IDAgJiYgZC0+bWFfdXNlZCA9PSAwKTsKKyAgICAgICAgSU5JVF9OT05aRVJPX0RJQ1RfU0xPVFMoZCk7CisgICAgICAgIGQtPm1hX2xvb2t1cCA9IGxvb2tkaWN0X3N0cmluZzsKICNpZmRlZiBTSE9XX0NPTlZFUlNJT05fQ09VTlRTCi0JCSsrY3JlYXRlZDsKKyAgICAgICAgKytjcmVhdGVkOwogI2VuZGlmCi0JfQotCXJldHVybiBzZWxmOworICAgIH0KKyAgICByZXR1cm4gc2VsZjsKIH0KIAogc3RhdGljIGludAogZGljdF9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcmV0dXJuIGRpY3RfdXBkYXRlX2NvbW1vbihzZWxmLCBhcmdzLCBrd2RzLCAiZGljdCIpOworICAgIHJldHVybiBkaWN0X3VwZGF0ZV9jb21tb24oc2VsZiwgYXJncywga3dkcywgImRpY3QiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RfaXRlcihQeURpY3RPYmplY3QgKmRpY3QpCiB7Ci0JcmV0dXJuIGRpY3RpdGVyX25ldyhkaWN0LCAmUHlEaWN0SXRlcktleV9UeXBlKTsKKyAgICByZXR1cm4gZGljdGl0ZXJfbmV3KGRpY3QsICZQeURpY3RJdGVyS2V5X1R5cGUpOwogfQogCiBQeURvY19TVFJWQVIoZGljdGlvbmFyeV9kb2MsCkBAIC0yMjMzLDQ2ICsyMjMzLDQ2IEBACiAiICAgIGluIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGxpc3QuICBGb3IgZXhhbXBsZTogIGRpY3Qob25lPTEsIHR3bz0yKSIpOwogCiBQeVR5cGVPYmplY3QgUHlEaWN0X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZGljdCIsCi0Jc2l6ZW9mKFB5RGljdE9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilkaWN0X2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JKHByaW50ZnVuYylkaWN0X3ByaW50LAkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCShjbXBmdW5jKWRpY3RfY29tcGFyZSwJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWRpY3RfcmVwciwJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCSZkaWN0X2FzX3NlcXVlbmNlLAkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JJmRpY3RfYXNfbWFwcGluZywJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKVB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfRElDVF9TVUJDTEFTUywJLyogdHBfZmxhZ3MgKi8KLQlkaWN0aW9uYXJ5X2RvYywJCQkJLyogdHBfZG9jICovCi0JZGljdF90cmF2ZXJzZSwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQlkaWN0X3RwX2NsZWFyLAkJCQkvKiB0cF9jbGVhciAqLwotCWRpY3RfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkoZ2V0aXRlcmZ1bmMpZGljdF9pdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQltYXBwX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCWRpY3RfaW5pdCwJCQkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkJLyogdHBfYWxsb2MgKi8KLQlkaWN0X25ldywJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLCAgICAgICAgCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZGljdCIsCisgICAgc2l6ZW9mKFB5RGljdE9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilkaWN0X2RlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKWRpY3RfcHJpbnQsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpZGljdF9jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWRpY3RfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmZGljdF9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJmRpY3RfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKVB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfRElDVF9TVUJDTEFTUywgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGRpY3Rpb25hcnlfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgZGljdF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIGRpY3RfdHBfY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICBkaWN0X3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylkaWN0X2l0ZXIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBtYXBwX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICBkaWN0X2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZGljdF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGRpY3Rpb25hcnkgaW50ZXJmYWNlICovCkBAIC0yMjgwLDMzNiArMjI4MCwzMzYgQEAKIFB5T2JqZWN0ICoKIFB5RGljdF9HZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICp2LCBjb25zdCBjaGFyICprZXkpCiB7Ci0JUHlPYmplY3QgKmt2LCAqcnY7Ci0Ja3YgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGtleSk7Ci0JaWYgKGt2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gUHlEaWN0X0dldEl0ZW0odiwga3YpOwotCVB5X0RFQ1JFRihrdik7Ci0JcmV0dXJuIHJ2OworICAgIFB5T2JqZWN0ICprdiwgKnJ2OworICAgIGt2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOworICAgIGlmIChrdiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IFB5RGljdF9HZXRJdGVtKHYsIGt2KTsKKyAgICBQeV9ERUNSRUYoa3YpOworICAgIHJldHVybiBydjsKIH0KIAogaW50CiBQeURpY3RfU2V0SXRlbVN0cmluZyhQeU9iamVjdCAqdiwgY29uc3QgY2hhciAqa2V5LCBQeU9iamVjdCAqaXRlbSkKIHsKLQlQeU9iamVjdCAqa3Y7Ci0JaW50IGVycjsKLQlrdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoa2V5KTsKLQlpZiAoa3YgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5U3RyaW5nX0ludGVybkluUGxhY2UoJmt2KTsgLyogWFhYIFNob3VsZCB3ZSByZWFsbHk/ICovCi0JZXJyID0gUHlEaWN0X1NldEl0ZW0odiwga3YsIGl0ZW0pOwotCVB5X0RFQ1JFRihrdik7Ci0JcmV0dXJuIGVycjsKKyAgICBQeU9iamVjdCAqa3Y7CisgICAgaW50IGVycjsKKyAgICBrdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoa2V5KTsKKyAgICBpZiAoa3YgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJmt2KTsgLyogWFhYIFNob3VsZCB3ZSByZWFsbHk/ICovCisgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0odiwga3YsIGl0ZW0pOworICAgIFB5X0RFQ1JFRihrdik7CisgICAgcmV0dXJuIGVycjsKIH0KIAogaW50CiBQeURpY3RfRGVsSXRlbVN0cmluZyhQeU9iamVjdCAqdiwgY29uc3QgY2hhciAqa2V5KQogewotCVB5T2JqZWN0ICprdjsKLQlpbnQgZXJyOwotCWt2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhrZXkpOwotCWlmIChrdiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZXJyID0gUHlEaWN0X0RlbEl0ZW0odiwga3YpOwotCVB5X0RFQ1JFRihrdik7Ci0JcmV0dXJuIGVycjsKKyAgICBQeU9iamVjdCAqa3Y7CisgICAgaW50IGVycjsKKyAgICBrdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoa2V5KTsKKyAgICBpZiAoa3YgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVyciA9IFB5RGljdF9EZWxJdGVtKHYsIGt2KTsKKyAgICBQeV9ERUNSRUYoa3YpOworICAgIHJldHVybiBlcnI7CiB9CiAKIC8qIERpY3Rpb25hcnkgaXRlcmF0b3IgdHlwZXMgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeURpY3RPYmplY3QgKmRpX2RpY3Q7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCi0JUHlfc3NpemVfdCBkaV91c2VkOwotCVB5X3NzaXplX3QgZGlfcG9zOwotCVB5T2JqZWN0KiBkaV9yZXN1bHQ7IC8qIHJldXNhYmxlIHJlc3VsdCB0dXBsZSBmb3IgaXRlcml0ZW1zICovCi0JUHlfc3NpemVfdCBsZW47CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5RGljdE9iamVjdCAqZGlfZGljdDsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeV9zc2l6ZV90IGRpX3VzZWQ7CisgICAgUHlfc3NpemVfdCBkaV9wb3M7CisgICAgUHlPYmplY3QqIGRpX3Jlc3VsdDsgLyogcmV1c2FibGUgcmVzdWx0IHR1cGxlIGZvciBpdGVyaXRlbXMgKi8KKyAgICBQeV9zc2l6ZV90IGxlbjsKIH0gZGljdGl0ZXJvYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkaWN0aXRlcl9uZXcoUHlEaWN0T2JqZWN0ICpkaWN0LCBQeVR5cGVPYmplY3QgKml0ZXJ0eXBlKQogewotCWRpY3RpdGVyb2JqZWN0ICpkaTsKLQlkaSA9IFB5T2JqZWN0X0dDX05ldyhkaWN0aXRlcm9iamVjdCwgaXRlcnR5cGUpOwotCWlmIChkaSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoZGljdCk7Ci0JZGktPmRpX2RpY3QgPSBkaWN0OwotCWRpLT5kaV91c2VkID0gZGljdC0+bWFfdXNlZDsKLQlkaS0+ZGlfcG9zID0gMDsKLQlkaS0+bGVuID0gZGljdC0+bWFfdXNlZDsKLQlpZiAoaXRlcnR5cGUgPT0gJlB5RGljdEl0ZXJJdGVtX1R5cGUpIHsKLQkJZGktPmRpX3Jlc3VsdCA9IFB5VHVwbGVfUGFjaygyLCBQeV9Ob25lLCBQeV9Ob25lKTsKLQkJaWYgKGRpLT5kaV9yZXN1bHQgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGRpKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UKLQkJZGktPmRpX3Jlc3VsdCA9IE5VTEw7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGRpKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZGk7CisgICAgZGljdGl0ZXJvYmplY3QgKmRpOworICAgIGRpID0gUHlPYmplY3RfR0NfTmV3KGRpY3RpdGVyb2JqZWN0LCBpdGVydHlwZSk7CisgICAgaWYgKGRpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICBkaS0+ZGlfZGljdCA9IGRpY3Q7CisgICAgZGktPmRpX3VzZWQgPSBkaWN0LT5tYV91c2VkOworICAgIGRpLT5kaV9wb3MgPSAwOworICAgIGRpLT5sZW4gPSBkaWN0LT5tYV91c2VkOworICAgIGlmIChpdGVydHlwZSA9PSAmUHlEaWN0SXRlckl0ZW1fVHlwZSkgeworICAgICAgICBkaS0+ZGlfcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIFB5X05vbmUsIFB5X05vbmUpOworICAgICAgICBpZiAoZGktPmRpX3Jlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGkpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBkaS0+ZGlfcmVzdWx0ID0gTlVMTDsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soZGkpOworICAgIHJldHVybiAoUHlPYmplY3QgKilkaTsKIH0KIAogc3RhdGljIHZvaWQKIGRpY3RpdGVyX2RlYWxsb2MoZGljdGl0ZXJvYmplY3QgKmRpKQogewotCVB5X1hERUNSRUYoZGktPmRpX2RpY3QpOwotCVB5X1hERUNSRUYoZGktPmRpX3Jlc3VsdCk7Ci0JUHlPYmplY3RfR0NfRGVsKGRpKTsKKyAgICBQeV9YREVDUkVGKGRpLT5kaV9kaWN0KTsKKyAgICBQeV9YREVDUkVGKGRpLT5kaV9yZXN1bHQpOworICAgIFB5T2JqZWN0X0dDX0RlbChkaSk7CiB9CiAKIHN0YXRpYyBpbnQKIGRpY3RpdGVyX3RyYXZlcnNlKGRpY3RpdGVyb2JqZWN0ICpkaSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoZGktPmRpX2RpY3QpOwotCVB5X1ZJU0lUKGRpLT5kaV9yZXN1bHQpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGRpLT5kaV9kaWN0KTsKKyAgICBQeV9WSVNJVChkaS0+ZGlfcmVzdWx0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RpdGVyX2xlbihkaWN0aXRlcm9iamVjdCAqZGkpCiB7Ci0JUHlfc3NpemVfdCBsZW4gPSAwOwotCWlmIChkaS0+ZGlfZGljdCAhPSBOVUxMICYmIGRpLT5kaV91c2VkID09IGRpLT5kaV9kaWN0LT5tYV91c2VkKQotCQlsZW4gPSBkaS0+bGVuOwotCXJldHVybiBQeUludF9Gcm9tU2l6ZV90KGxlbik7CisgICAgUHlfc3NpemVfdCBsZW4gPSAwOworICAgIGlmIChkaS0+ZGlfZGljdCAhPSBOVUxMICYmIGRpLT5kaV91c2VkID09IGRpLT5kaV9kaWN0LT5tYV91c2VkKQorICAgICAgICBsZW4gPSBkaS0+bGVuOworICAgIHJldHVybiBQeUludF9Gcm9tU2l6ZV90KGxlbik7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGRpY3RpdGVyX21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilkaWN0aXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWRpY3RpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqZGljdGl0ZXJfaXRlcm5leHRrZXkoZGljdGl0ZXJvYmplY3QgKmRpKQogewotCVB5T2JqZWN0ICprZXk7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBtYXNrOwotCXJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKLQlQeURpY3RPYmplY3QgKmQgPSBkaS0+ZGlfZGljdDsKKyAgICBQeU9iamVjdCAqa2V5OworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgbWFzazsKKyAgICByZWdpc3RlciBQeURpY3RFbnRyeSAqZXA7CisgICAgUHlEaWN0T2JqZWN0ICpkID0gZGktPmRpX2RpY3Q7CiAKLQlpZiAoZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQgKFB5RGljdF9DaGVjayhkKSk7CisgICAgaWYgKGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0IChQeURpY3RfQ2hlY2soZCkpOwogCi0JaWYgKGRpLT5kaV91c2VkICE9IGQtPm1hX3VzZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiZGljdGlvbmFyeSBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOwotCQlkaS0+ZGlfdXNlZCA9IC0xOyAvKiBNYWtlIHRoaXMgc3RhdGUgc3RpY2t5ICovCi0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZGktPmRpX3VzZWQgIT0gZC0+bWFfdXNlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKKyAgICAgICAgZGktPmRpX3VzZWQgPSAtMTsgLyogTWFrZSB0aGlzIHN0YXRlIHN0aWNreSAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpID0gZGktPmRpX3BvczsKLQlpZiAoaSA8IDApCi0JCWdvdG8gZmFpbDsKLQllcCA9IGQtPm1hX3RhYmxlOwotCW1hc2sgPSBkLT5tYV9tYXNrOwotCXdoaWxlIChpIDw9IG1hc2sgJiYgZXBbaV0ubWVfdmFsdWUgPT0gTlVMTCkKLQkJaSsrOwotCWRpLT5kaV9wb3MgPSBpKzE7Ci0JaWYgKGkgPiBtYXNrKQotCQlnb3RvIGZhaWw7Ci0JZGktPmxlbi0tOwotCWtleSA9IGVwW2ldLm1lX2tleTsKLQlQeV9JTkNSRUYoa2V5KTsKLQlyZXR1cm4ga2V5OworICAgIGkgPSBkaS0+ZGlfcG9zOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGVwID0gZC0+bWFfdGFibGU7CisgICAgbWFzayA9IGQtPm1hX21hc2s7CisgICAgd2hpbGUgKGkgPD0gbWFzayAmJiBlcFtpXS5tZV92YWx1ZSA9PSBOVUxMKQorICAgICAgICBpKys7CisgICAgZGktPmRpX3BvcyA9IGkrMTsKKyAgICBpZiAoaSA+IG1hc2spCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBkaS0+bGVuLS07CisgICAga2V5ID0gZXBbaV0ubWVfa2V5OworICAgIFB5X0lOQ1JFRihrZXkpOworICAgIHJldHVybiBrZXk7CiAKIGZhaWw6Ci0JUHlfREVDUkVGKGQpOwotCWRpLT5kaV9kaWN0ID0gTlVMTDsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYoZCk7CisgICAgZGktPmRpX2RpY3QgPSBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeVR5cGVPYmplY3QgUHlEaWN0SXRlcktleV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImRpY3Rpb25hcnkta2V5aXRlcmF0b3IiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihkaWN0aXRlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWRpY3RpdGVyX2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotIAkwLAkJCQkJLyogdHBfZG9jICovCi0gCSh0cmF2ZXJzZXByb2MpZGljdGl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0gCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWRpY3RpdGVyX2l0ZXJuZXh0a2V5LAkvKiB0cF9pdGVybmV4dCAqLwotCWRpY3RpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZGljdGlvbmFyeS1rZXlpdGVyYXRvciIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZGljdGl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZGljdGl0ZXJfZGVhbGxvYywgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkaWN0aXRlcl90cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZGljdGl0ZXJfaXRlcm5leHRrZXksICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkaWN0aXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpkaWN0aXRlcl9pdGVybmV4dHZhbHVlKGRpY3RpdGVyb2JqZWN0ICpkaSkKIHsKLQlQeU9iamVjdCAqdmFsdWU7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBtYXNrOwotCXJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKLQlQeURpY3RPYmplY3QgKmQgPSBkaS0+ZGlfZGljdDsKKyAgICBQeU9iamVjdCAqdmFsdWU7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBtYXNrOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeURpY3RPYmplY3QgKmQgPSBkaS0+ZGlfZGljdDsKIAotCWlmIChkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydCAoUHlEaWN0X0NoZWNrKGQpKTsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQgKFB5RGljdF9DaGVjayhkKSk7CiAKLQlpZiAoZGktPmRpX3VzZWQgIT0gZC0+bWFfdXNlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJkaWN0aW9uYXJ5IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7Ci0JCWRpLT5kaV91c2VkID0gLTE7IC8qIE1ha2UgdGhpcyBzdGF0ZSBzdGlja3kgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChkaS0+ZGlfdXNlZCAhPSBkLT5tYV91c2VkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGljdGlvbmFyeSBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICBkaS0+ZGlfdXNlZCA9IC0xOyAvKiBNYWtlIHRoaXMgc3RhdGUgc3RpY2t5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWkgPSBkaS0+ZGlfcG9zOwotCW1hc2sgPSBkLT5tYV9tYXNrOwotCWlmIChpIDwgMCB8fCBpID4gbWFzaykKLQkJZ290byBmYWlsOwotCWVwID0gZC0+bWFfdGFibGU7Ci0Jd2hpbGUgKCh2YWx1ZT1lcFtpXS5tZV92YWx1ZSkgPT0gTlVMTCkgewotCQlpKys7Ci0JCWlmIChpID4gbWFzaykKLQkJCWdvdG8gZmFpbDsKLQl9Ci0JZGktPmRpX3BvcyA9IGkrMTsKLQlkaS0+bGVuLS07Ci0JUHlfSU5DUkVGKHZhbHVlKTsKLQlyZXR1cm4gdmFsdWU7CisgICAgaSA9IGRpLT5kaV9wb3M7CisgICAgbWFzayA9IGQtPm1hX21hc2s7CisgICAgaWYgKGkgPCAwIHx8IGkgPiBtYXNrKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZXAgPSBkLT5tYV90YWJsZTsKKyAgICB3aGlsZSAoKHZhbHVlPWVwW2ldLm1lX3ZhbHVlKSA9PSBOVUxMKSB7CisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKGkgPiBtYXNrKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBkaS0+ZGlfcG9zID0gaSsxOworICAgIGRpLT5sZW4tLTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIHJldHVybiB2YWx1ZTsKIAogZmFpbDoKLQlQeV9ERUNSRUYoZCk7Ci0JZGktPmRpX2RpY3QgPSBOVUxMOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihkKTsKKyAgICBkaS0+ZGlfZGljdCA9IE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5VHlwZU9iamVjdCBQeURpY3RJdGVyVmFsdWVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJkaWN0aW9uYXJ5LXZhbHVlaXRlcmF0b3IiLAkJLyogdHBfbmFtZSAqLwotCXNpemVvZihkaWN0aXRlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWRpY3RpdGVyX2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotIAkwLAkJCQkJLyogdHBfZG9jICovCi0gCSh0cmF2ZXJzZXByb2MpZGljdGl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0gCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLQkoaXRlcm5leHRmdW5jKWRpY3RpdGVyX2l0ZXJuZXh0dmFsdWUsCS8qIHRwX2l0ZXJuZXh0ICovCi0JZGljdGl0ZXJfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwKKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJkaWN0aW9uYXJ5LXZhbHVlaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihkaWN0aXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilkaWN0aXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWRpY3RpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylkaWN0aXRlcl9pdGVybmV4dHZhbHVlLCAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGRpY3RpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKmRpY3RpdGVyX2l0ZXJuZXh0aXRlbShkaWN0aXRlcm9iamVjdCAqZGkpCiB7Ci0JUHlPYmplY3QgKmtleSwgKnZhbHVlLCAqcmVzdWx0ID0gZGktPmRpX3Jlc3VsdDsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGksIG1hc2s7Ci0JcmVnaXN0ZXIgUHlEaWN0RW50cnkgKmVwOwotCVB5RGljdE9iamVjdCAqZCA9IGRpLT5kaV9kaWN0OworICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZSwgKnJlc3VsdCA9IGRpLT5kaV9yZXN1bHQ7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBtYXNrOworICAgIHJlZ2lzdGVyIFB5RGljdEVudHJ5ICplcDsKKyAgICBQeURpY3RPYmplY3QgKmQgPSBkaS0+ZGlfZGljdDsKIAotCWlmIChkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydCAoUHlEaWN0X0NoZWNrKGQpKTsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQgKFB5RGljdF9DaGVjayhkKSk7CiAKLQlpZiAoZGktPmRpX3VzZWQgIT0gZC0+bWFfdXNlZCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJkaWN0aW9uYXJ5IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7Ci0JCWRpLT5kaV91c2VkID0gLTE7IC8qIE1ha2UgdGhpcyBzdGF0ZSBzdGlja3kgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChkaS0+ZGlfdXNlZCAhPSBkLT5tYV91c2VkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGljdGlvbmFyeSBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICBkaS0+ZGlfdXNlZCA9IC0xOyAvKiBNYWtlIHRoaXMgc3RhdGUgc3RpY2t5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWkgPSBkaS0+ZGlfcG9zOwotCWlmIChpIDwgMCkKLQkJZ290byBmYWlsOwotCWVwID0gZC0+bWFfdGFibGU7Ci0JbWFzayA9IGQtPm1hX21hc2s7Ci0Jd2hpbGUgKGkgPD0gbWFzayAmJiBlcFtpXS5tZV92YWx1ZSA9PSBOVUxMKQotCQlpKys7Ci0JZGktPmRpX3BvcyA9IGkrMTsKLQlpZiAoaSA+IG1hc2spCi0JCWdvdG8gZmFpbDsKKyAgICBpID0gZGktPmRpX3BvczsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBlcCA9IGQtPm1hX3RhYmxlOworICAgIG1hc2sgPSBkLT5tYV9tYXNrOworICAgIHdoaWxlIChpIDw9IG1hc2sgJiYgZXBbaV0ubWVfdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgaSsrOworICAgIGRpLT5kaV9wb3MgPSBpKzE7CisgICAgaWYgKGkgPiBtYXNrKQorICAgICAgICBnb3RvIGZhaWw7CiAKLQlpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkgewotCQlQeV9JTkNSRUYocmVzdWx0KTsKLQkJUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAwKSk7Ci0JCVB5X0RFQ1JFRihQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgMSkpOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IFB5VHVwbGVfTmV3KDIpOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGktPmxlbi0tOwotCWtleSA9IGVwW2ldLm1lX2tleTsKLQl2YWx1ZSA9IGVwW2ldLm1lX3ZhbHVlOwotCVB5X0lOQ1JFRihrZXkpOwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIGtleSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDEsIHZhbHVlKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDApKTsKKyAgICAgICAgUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcoMik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaS0+bGVuLS07CisgICAga2V5ID0gZXBbaV0ubWVfa2V5OworICAgIHZhbHVlID0gZXBbaV0ubWVfdmFsdWU7CisgICAgUHlfSU5DUkVGKGtleSk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwga2V5KTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMSwgdmFsdWUpOworICAgIHJldHVybiByZXN1bHQ7CiAKIGZhaWw6Ci0JUHlfREVDUkVGKGQpOwotCWRpLT5kaV9kaWN0ID0gTlVMTDsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYoZCk7CisgICAgZGktPmRpX2RpY3QgPSBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeVR5cGVPYmplY3QgUHlEaWN0SXRlckl0ZW1fVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJkaWN0aW9uYXJ5LWl0ZW1pdGVyYXRvciIsCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGRpY3RpdGVyb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZGljdGl0ZXJfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYylkaWN0aXRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZGljdGl0ZXJfaXRlcm5leHRpdGVtLAkvKiB0cF9pdGVybmV4dCAqLwotCWRpY3RpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZGljdGlvbmFyeS1pdGVtaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoZGljdGl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZGljdGl0ZXJfZGVhbGxvYywgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylkaWN0aXRlcl90cmF2ZXJzZSwgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZGljdGl0ZXJfaXRlcm5leHRpdGVtLCAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBkaWN0aXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvZW51bW9iamVjdC5jIGIvT2JqZWN0cy9lbnVtb2JqZWN0LmMKaW5kZXggMzU4NjRmNi4uNjkxMzcwOSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9lbnVtb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9lbnVtb2JqZWN0LmMKQEAgLTMsMTU5ICszLDE1OSBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5X3NzaXplX3QgZW5faW5kZXg7CSAgIC8qIGN1cnJlbnQgaW5kZXggb2YgZW51bWVyYXRpb24gKi8KLQlQeU9iamVjdCogZW5fc2l0OyAgICAgICAgICAvKiBzZWNvbmRhcnkgaXRlcmF0b3Igb2YgZW51bWVyYXRpb24gKi8KLQlQeU9iamVjdCogZW5fcmVzdWx0OwkgICAvKiByZXN1bHQgdHVwbGUgICovCi0JUHlPYmplY3QqIGVuX2xvbmdpbmRleDsJICAgLyogaW5kZXggZm9yIHNlcXVlbmNlcyA+PSBQWV9TU0laRV9UX01BWCAqLworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IGVuX2luZGV4OyAgICAgICAgICAgLyogY3VycmVudCBpbmRleCBvZiBlbnVtZXJhdGlvbiAqLworICAgIFB5T2JqZWN0KiBlbl9zaXQ7ICAgICAgICAgIC8qIHNlY29uZGFyeSBpdGVyYXRvciBvZiBlbnVtZXJhdGlvbiAqLworICAgIFB5T2JqZWN0KiBlbl9yZXN1bHQ7ICAgICAgICAgICAvKiByZXN1bHQgdHVwbGUgICovCisgICAgUHlPYmplY3QqIGVuX2xvbmdpbmRleDsgICAgICAgIC8qIGluZGV4IGZvciBzZXF1ZW5jZXMgPj0gUFlfU1NJWkVfVF9NQVggKi8KIH0gZW51bW9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGVudW1fbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWVudW1vYmplY3QgKmVuOwotCVB5T2JqZWN0ICpzZXEgPSBOVUxMOwotCVB5T2JqZWN0ICpzdGFydCA9IE5VTEw7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzZXF1ZW5jZSIsICJzdGFydCIsIDB9OworICAgIGVudW1vYmplY3QgKmVuOworICAgIFB5T2JqZWN0ICpzZXEgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzdGFydCA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzZXF1ZW5jZSIsICJzdGFydCIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98TzplbnVtZXJhdGUiLCBrd2xpc3QsCi0JCQkJCSAmc2VxLCAmc3RhcnQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPOmVudW1lcmF0ZSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VxLCAmc3RhcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWVuID0gKGVudW1vYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoZW4gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHN0YXJ0ICE9IE5VTEwpIHsKLQkJc3RhcnQgPSBQeU51bWJlcl9JbmRleChzdGFydCk7Ci0JCWlmIChzdGFydCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZW4pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJYXNzZXJ0KFB5SW50X0NoZWNrKHN0YXJ0KSB8fCBQeUxvbmdfQ2hlY2soc3RhcnQpKTsKLQkJZW4tPmVuX2luZGV4ID0gUHlJbnRfQXNTc2l6ZV90KHN0YXJ0KTsKLQkJaWYgKGVuLT5lbl9pbmRleCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJZW4tPmVuX2luZGV4ID0gUFlfU1NJWkVfVF9NQVg7Ci0JCQllbi0+ZW5fbG9uZ2luZGV4ID0gc3RhcnQ7Ci0JCX0gZWxzZSB7Ci0JCQllbi0+ZW5fbG9uZ2luZGV4ID0gTlVMTDsKLQkJCVB5X0RFQ1JFRihzdGFydCk7Ci0JCX0KLQl9IGVsc2UgewotCQllbi0+ZW5faW5kZXggPSAwOwotCQllbi0+ZW5fbG9uZ2luZGV4ID0gTlVMTDsKLQl9Ci0JZW4tPmVuX3NpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoZW4tPmVuX3NpdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihlbik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbi0+ZW5fcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIFB5X05vbmUsIFB5X05vbmUpOwotCWlmIChlbi0+ZW5fcmVzdWx0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGVuKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKillbjsKKyAgICBlbiA9IChlbnVtb2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CisgICAgaWYgKGVuID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzdGFydCAhPSBOVUxMKSB7CisgICAgICAgIHN0YXJ0ID0gUHlOdW1iZXJfSW5kZXgoc3RhcnQpOworICAgICAgICBpZiAoc3RhcnQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVuKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGFzc2VydChQeUludF9DaGVjayhzdGFydCkgfHwgUHlMb25nX0NoZWNrKHN0YXJ0KSk7CisgICAgICAgIGVuLT5lbl9pbmRleCA9IFB5SW50X0FzU3NpemVfdChzdGFydCk7CisgICAgICAgIGlmIChlbi0+ZW5faW5kZXggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGVuLT5lbl9pbmRleCA9IFBZX1NTSVpFX1RfTUFYOworICAgICAgICAgICAgZW4tPmVuX2xvbmdpbmRleCA9IHN0YXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW4tPmVuX2xvbmdpbmRleCA9IE5VTEw7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcnQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW4tPmVuX2luZGV4ID0gMDsKKyAgICAgICAgZW4tPmVuX2xvbmdpbmRleCA9IE5VTEw7CisgICAgfQorICAgIGVuLT5lbl9zaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGVuLT5lbl9zaXQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZW4tPmVuX3Jlc3VsdCA9IFB5VHVwbGVfUGFjaygyLCBQeV9Ob25lLCBQeV9Ob25lKTsKKyAgICBpZiAoZW4tPmVuX3Jlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihlbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZW47CiB9CiAKIHN0YXRpYyB2b2lkCiBlbnVtX2RlYWxsb2MoZW51bW9iamVjdCAqZW4pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhlbik7Ci0JUHlfWERFQ1JFRihlbi0+ZW5fc2l0KTsKLQlQeV9YREVDUkVGKGVuLT5lbl9yZXN1bHQpOwotCVB5X1hERUNSRUYoZW4tPmVuX2xvbmdpbmRleCk7Ci0JUHlfVFlQRShlbiktPnRwX2ZyZWUoZW4pOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2soZW4pOworICAgIFB5X1hERUNSRUYoZW4tPmVuX3NpdCk7CisgICAgUHlfWERFQ1JFRihlbi0+ZW5fcmVzdWx0KTsKKyAgICBQeV9YREVDUkVGKGVuLT5lbl9sb25naW5kZXgpOworICAgIFB5X1RZUEUoZW4pLT50cF9mcmVlKGVuKTsKIH0KIAogc3RhdGljIGludAogZW51bV90cmF2ZXJzZShlbnVtb2JqZWN0ICplbiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoZW4tPmVuX3NpdCk7Ci0JUHlfVklTSVQoZW4tPmVuX3Jlc3VsdCk7Ci0JUHlfVklTSVQoZW4tPmVuX2xvbmdpbmRleCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoZW4tPmVuX3NpdCk7CisgICAgUHlfVklTSVQoZW4tPmVuX3Jlc3VsdCk7CisgICAgUHlfVklTSVQoZW4tPmVuX2xvbmdpbmRleCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBlbnVtX25leHRfbG9uZyhlbnVtb2JqZWN0ICplbiwgUHlPYmplY3QqIG5leHRfaXRlbSkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKm9uZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IGVuLT5lbl9yZXN1bHQ7Ci0JUHlPYmplY3QgKm5leHRfaW5kZXg7Ci0JUHlPYmplY3QgKnN0ZXBwZWRfdXA7CisgICAgc3RhdGljIFB5T2JqZWN0ICpvbmUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBlbi0+ZW5fcmVzdWx0OworICAgIFB5T2JqZWN0ICpuZXh0X2luZGV4OworICAgIFB5T2JqZWN0ICpzdGVwcGVkX3VwOwogCi0JaWYgKGVuLT5lbl9sb25naW5kZXggPT0gTlVMTCkgewotCQllbi0+ZW5fbG9uZ2luZGV4ID0gUHlJbnRfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NQVgpOwotCQlpZiAoZW4tPmVuX2xvbmdpbmRleCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChvbmUgPT0gTlVMTCkgewotCQlvbmUgPSBQeUludF9Gcm9tTG9uZygxKTsKLQkJaWYgKG9uZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5leHRfaW5kZXggPSBlbi0+ZW5fbG9uZ2luZGV4OwotCWFzc2VydChuZXh0X2luZGV4ICE9IE5VTEwpOwotCXN0ZXBwZWRfdXAgPSBQeU51bWJlcl9BZGQobmV4dF9pbmRleCwgb25lKTsKLQlpZiAoc3RlcHBlZF91cCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQllbi0+ZW5fbG9uZ2luZGV4ID0gc3RlcHBlZF91cDsKKyAgICBpZiAoZW4tPmVuX2xvbmdpbmRleCA9PSBOVUxMKSB7CisgICAgICAgIGVuLT5lbl9sb25naW5kZXggPSBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCk7CisgICAgICAgIGlmIChlbi0+ZW5fbG9uZ2luZGV4ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKG9uZSA9PSBOVUxMKSB7CisgICAgICAgIG9uZSA9IFB5SW50X0Zyb21Mb25nKDEpOworICAgICAgICBpZiAob25lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbmV4dF9pbmRleCA9IGVuLT5lbl9sb25naW5kZXg7CisgICAgYXNzZXJ0KG5leHRfaW5kZXggIT0gTlVMTCk7CisgICAgc3RlcHBlZF91cCA9IFB5TnVtYmVyX0FkZChuZXh0X2luZGV4LCBvbmUpOworICAgIGlmIChzdGVwcGVkX3VwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVuLT5lbl9sb25naW5kZXggPSBzdGVwcGVkX3VwOwogCi0JaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpIHsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRihQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgMCkpOwotCQlQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDEpKTsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBQeVR1cGxlX05ldygyKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYobmV4dF9pbmRleCk7Ci0JCQlQeV9ERUNSRUYobmV4dF9pdGVtKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAwLCBuZXh0X2luZGV4KTsKLQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMSwgbmV4dF9pdGVtKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDApKTsKKyAgICAgICAgUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcoMik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG5leHRfaW5kZXgpOworICAgICAgICAgICAgUHlfREVDUkVGKG5leHRfaXRlbSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwgbmV4dF9pbmRleCk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDEsIG5leHRfaXRlbSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGVudW1fbmV4dChlbnVtb2JqZWN0ICplbikKIHsKLQlQeU9iamVjdCAqbmV4dF9pbmRleDsKLQlQeU9iamVjdCAqbmV4dF9pdGVtOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBlbi0+ZW5fcmVzdWx0OwotCVB5T2JqZWN0ICppdCA9IGVuLT5lbl9zaXQ7CisgICAgUHlPYmplY3QgKm5leHRfaW5kZXg7CisgICAgUHlPYmplY3QgKm5leHRfaXRlbTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gZW4tPmVuX3Jlc3VsdDsKKyAgICBQeU9iamVjdCAqaXQgPSBlbi0+ZW5fc2l0OwogCi0JbmV4dF9pdGVtID0gKCpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQpKGl0KTsKLQlpZiAobmV4dF9pdGVtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG5leHRfaXRlbSA9ICgqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KShpdCk7CisgICAgaWYgKG5leHRfaXRlbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChlbi0+ZW5faW5kZXggPT0gUFlfU1NJWkVfVF9NQVgpCi0JCXJldHVybiBlbnVtX25leHRfbG9uZyhlbiwgbmV4dF9pdGVtKTsKKyAgICBpZiAoZW4tPmVuX2luZGV4ID09IFBZX1NTSVpFX1RfTUFYKQorICAgICAgICByZXR1cm4gZW51bV9uZXh0X2xvbmcoZW4sIG5leHRfaXRlbSk7CiAKLQluZXh0X2luZGV4ID0gUHlJbnRfRnJvbVNzaXplX3QoZW4tPmVuX2luZGV4KTsKLQlpZiAobmV4dF9pbmRleCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihuZXh0X2l0ZW0pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZW4tPmVuX2luZGV4Kys7CisgICAgbmV4dF9pbmRleCA9IFB5SW50X0Zyb21Tc2l6ZV90KGVuLT5lbl9pbmRleCk7CisgICAgaWYgKG5leHRfaW5kZXggPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYobmV4dF9pdGVtKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVuLT5lbl9pbmRleCsrOwogCi0JaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpIHsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRihQeVR1cGxlX0dFVF9JVEVNKHJlc3VsdCwgMCkpOwotCQlQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDEpKTsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSBQeVR1cGxlX05ldygyKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYobmV4dF9pbmRleCk7Ci0JCQlQeV9ERUNSRUYobmV4dF9pdGVtKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCAwLCBuZXh0X2luZGV4KTsKLQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMSwgbmV4dF9pdGVtKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYoUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsIDApKTsKKyAgICAgICAgUHlfREVDUkVGKFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LCAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcoMik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG5leHRfaW5kZXgpOworICAgICAgICAgICAgUHlfREVDUkVGKG5leHRfaXRlbSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgMCwgbmV4dF9pbmRleCk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDEsIG5leHRfaXRlbSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGVudW1fZG9jLApAQCAtMTY3LDEyNyArMTY3LDEyNyBAQAogImZvciBvYnRhaW5pbmcgYW4gaW5kZXhlZCBsaXN0OiAoMCwgc2VxWzBdKSwgKDEsIHNlcVsxXSksICgyLCBzZXFbMl0pLCAuLi4iKTsKIAogUHlUeXBlT2JqZWN0IFB5RW51bV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImVudW1lcmF0ZSIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGVudW1vYmplY3QpLCAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKWVudW1fZGVhbGxvYywgICAgICAgLyogdHBfZGVhbGxvYyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAvKiB0cF9mbGFncyAqLwotCWVudW1fZG9jLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYyllbnVtX3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCVB5T2JqZWN0X1NlbGZJdGVyLAkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZW51bV9uZXh0LCAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCi0JZW51bV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJlbnVtZXJhdGUiLCAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihlbnVtb2JqZWN0KSwgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcillbnVtX2RlYWxsb2MsICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBlbnVtX2RvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZW51bV90cmF2ZXJzZSwgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYyllbnVtX25leHQsICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBlbnVtX25ldywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogUmV2ZXJzZWQgT2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X0hFQUQKLQlQeV9zc2l6ZV90ICAgICAgaW5kZXg7Ci0JUHlPYmplY3QqIHNlcTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCAgICAgIGluZGV4OworICAgIFB5T2JqZWN0KiBzZXE7CiB9IHJldmVyc2Vkb2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKgogcmV2ZXJzZWRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5X3NzaXplX3QgbjsKLQlQeU9iamVjdCAqc2VxOwotCXJldmVyc2Vkb2JqZWN0ICpybzsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlPYmplY3QgKnNlcTsKKyAgICByZXZlcnNlZG9iamVjdCAqcm87CiAKLQlpZiAodHlwZSA9PSAmUHlSZXZlcnNlZF9UeXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygicmV2ZXJzZWQoKSIsIGt3ZHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAodHlwZSA9PSAmUHlSZXZlcnNlZF9UeXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygicmV2ZXJzZWQoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJldmVyc2VkIiwgMSwgMSwgJnNlcSkgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZXZlcnNlZCIsIDEsIDEsICZzZXEpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhzZXEsICJfX3JldmVyc2VkX18iKSkKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2Qoc2VxLCAiX19yZXZlcnNlZF9fIiwgTlVMTCk7CisgICAgaWYgKFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoc2VxLCAiX19yZXZlcnNlZF9fIikpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsTWV0aG9kKHNlcSwgIl9fcmV2ZXJzZWRfXyIsIE5VTEwpOwogCi0JaWYgKCFQeVNlcXVlbmNlX0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJndW1lbnQgdG8gcmV2ZXJzZWQoKSBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlTZXF1ZW5jZV9DaGVjayhzZXEpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgdG8gcmV2ZXJzZWQoKSBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbiA9IFB5U2VxdWVuY2VfU2l6ZShzZXEpOwotCWlmIChuID09IC0xKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuID0gUHlTZXF1ZW5jZV9TaXplKHNlcSk7CisgICAgaWYgKG4gPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jcm8gPSAocmV2ZXJzZWRvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAocm8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcm8gPSAocmV2ZXJzZWRvYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAocm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyby0+aW5kZXggPSBuLTE7Ci0JUHlfSU5DUkVGKHNlcSk7Ci0Jcm8tPnNlcSA9IHNlcTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopcm87CisgICAgcm8tPmluZGV4ID0gbi0xOworICAgIFB5X0lOQ1JFRihzZXEpOworICAgIHJvLT5zZXEgPSBzZXE7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJvOwogfQogCiBzdGF0aWMgdm9pZAogcmV2ZXJzZWRfZGVhbGxvYyhyZXZlcnNlZG9iamVjdCAqcm8pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhybyk7Ci0JUHlfWERFQ1JFRihyby0+c2VxKTsKLQlQeV9UWVBFKHJvKS0+dHBfZnJlZShybyk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhybyk7CisgICAgUHlfWERFQ1JFRihyby0+c2VxKTsKKyAgICBQeV9UWVBFKHJvKS0+dHBfZnJlZShybyk7CiB9CiAKIHN0YXRpYyBpbnQKIHJldmVyc2VkX3RyYXZlcnNlKHJldmVyc2Vkb2JqZWN0ICpybywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQocm8tPnNlcSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQocm8tPnNlcSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZXZlcnNlZF9uZXh0KHJldmVyc2Vkb2JqZWN0ICpybykKIHsKLQlQeU9iamVjdCAqaXRlbTsKLQlQeV9zc2l6ZV90IGluZGV4ID0gcm8tPmluZGV4OworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5X3NzaXplX3QgaW5kZXggPSByby0+aW5kZXg7CiAKLQlpZiAoaW5kZXggPj0gMCkgewotCQlpdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHJvLT5zZXEsIGluZGV4KTsKLQkJaWYgKGl0ZW0gIT0gTlVMTCkgewotCQkJcm8tPmluZGV4LS07Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfQotCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbmRleEVycm9yKSB8fAotCQkgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JfQotCXJvLT5pbmRleCA9IC0xOwotCVB5X0NMRUFSKHJvLT5zZXEpOwotCXJldHVybiBOVUxMOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0ocm8tPnNlcSwgaW5kZXgpOworICAgICAgICBpZiAoaXRlbSAhPSBOVUxMKSB7CisgICAgICAgICAgICByby0+aW5kZXgtLTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0luZGV4RXJyb3IpIHx8CisgICAgICAgICAgICBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgcm8tPmluZGV4ID0gLTE7CisgICAgUHlfQ0xFQVIocm8tPnNlcSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihyZXZlcnNlZF9kb2MsCkBAIC0yOTgsNjQgKzI5OCw2NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJldmVyc2VkX2xlbihyZXZlcnNlZG9iamVjdCAqcm8pCiB7Ci0JUHlfc3NpemVfdCBwb3NpdGlvbiwgc2Vxc2l6ZTsKKyAgICBQeV9zc2l6ZV90IHBvc2l0aW9uLCBzZXFzaXplOwogCi0JaWYgKHJvLT5zZXEgPT0gTlVMTCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOwotCXNlcXNpemUgPSBQeVNlcXVlbmNlX1NpemUocm8tPnNlcSk7Ci0JaWYgKHNlcXNpemUgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCXBvc2l0aW9uID0gcm8tPmluZGV4ICsgMTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoKHNlcXNpemUgPCBwb3NpdGlvbikgID8gIDAgIDogIHBvc2l0aW9uKTsKKyAgICBpZiAocm8tPnNlcSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgc2Vxc2l6ZSA9IFB5U2VxdWVuY2VfU2l6ZShyby0+c2VxKTsKKyAgICBpZiAoc2Vxc2l6ZSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcG9zaXRpb24gPSByby0+aW5kZXggKyAxOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoc2Vxc2l6ZSA8IHBvc2l0aW9uKSAgPyAgMCAgOiAgcG9zaXRpb24pOwogfQogCiBQeURvY19TVFJWQVIobGVuZ3RoX2hpbnRfZG9jLCAiUHJpdmF0ZSBtZXRob2QgcmV0dXJuaW5nIGFuIGVzdGltYXRlIG9mIGxlbihsaXN0KGl0KSkuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiByZXZlcnNlZGl0ZXJfbWV0aG9kc1tdID0gewotCXsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKXJldmVyc2VkX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pcmV2ZXJzZWRfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5UmV2ZXJzZWRfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJyZXZlcnNlZCIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwotCXNpemVvZihyZXZlcnNlZG9iamVjdCksICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilyZXZlcnNlZF9kZWFsbG9jLCAgIC8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsICAgIC8qIHRwX2ZsYWdzICovCi0JcmV2ZXJzZWRfZG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXJldmVyc2VkX3RyYXZlcnNlLC8qIHRwX3RyYXZlcnNlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylyZXZlcnNlZF9uZXh0LCAgICAvKiB0cF9pdGVybmV4dCAqLwotCXJldmVyc2VkaXRlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KLQlyZXZlcnNlZF9uZXcsICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInJldmVyc2VkIiwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHJldmVyc2Vkb2JqZWN0KSwgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXJldmVyc2VkX2RlYWxsb2MsICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgLyogdHBfZmxhZ3MgKi8KKyAgICByZXZlcnNlZF9kb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpcmV2ZXJzZWRfdHJhdmVyc2UsLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylyZXZlcnNlZF9uZXh0LCAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHJldmVyc2VkaXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgcmV2ZXJzZWRfbmV3LCAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL2V4Y2VwdGlvbnMuYyBiL09iamVjdHMvZXhjZXB0aW9ucy5jCmluZGV4IGQ5OGRjOWMuLmFmNjdjYzcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZXhjZXB0aW9ucy5jCisrKyBiL09iamVjdHMvZXhjZXB0aW9ucy5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIHN0YXRpYyBQeU1ldGhvZERlZiBCYXNlRXhjZXB0aW9uX21ldGhvZHNbXSA9IHsKICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilCYXNlRXhjZXB0aW9uX3JlZHVjZSwgTUVUSF9OT0FSR1MgfSwKICAgIHsiX19zZXRzdGF0ZV9fIiwgKFB5Q0Z1bmN0aW9uKUJhc2VFeGNlcHRpb25fc2V0c3RhdGUsIE1FVEhfTyB9LAotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUgICAKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAgICB7Il9fdW5pY29kZV9fIiwgKFB5Q0Z1bmN0aW9uKUJhc2VFeGNlcHRpb25fdW5pY29kZSwgTUVUSF9OT0FSR1MgfSwKICNlbmRpZgogICAge05VTEwsIE5VTEwsIDAsIE5VTEx9LApAQCAtMjM3LDcgKzIzNyw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBCYXNlRXhjZXB0aW9uX2dldHNsaWNlKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZiwKLQkJCVB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3Qgc3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3Qgc3RvcCkKIHsKICAgICBpZiAoUHlFcnJfV2FyblB5M2soIl9fZ2V0c2xpY2VfXyBub3Qgc3VwcG9ydGVkIGZvciBleGNlcHRpb24gIgogICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NlcyBpbiAzLng7IHVzZSBhcmdzIGF0dHJpYnV0ZSIsIDEpIDwgMCkKQEAgLTMxNyw3ICszMTcsNyBAQAogQmFzZUV4Y2VwdGlvbl9nZXRfbWVzc2FnZShQeUJhc2VFeGNlcHRpb25PYmplY3QgKnNlbGYpCiB7CiAgICAgUHlPYmplY3QgKm1zZzsKLSAgICAKKwogICAgIC8qIGlmICJtZXNzYWdlIiBpcyBpbiBzZWxmLT5kaWN0LCBhY2Nlc3NpbmcgYSB1c2VyLXNldCBtZXNzYWdlIGF0dHJpYnV0ZSAqLwogICAgIGlmIChzZWxmLT5kaWN0ICYmCiAgICAgICAgIChtc2cgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzZWxmLT5kaWN0LCAibWVzc2FnZSIpKSkgewpAQCAtMzUzLDcgKzM1Myw3IEBACiAgICAgICAgIHNlbGYtPm1lc3NhZ2UgPSBOVUxMOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgCisKICAgICAvKiBlbHNlIHNldCBpdCBpbiBfX2RpY3RfXywgYnV0IG1heSBuZWVkIHRvIGNyZWF0ZSB0aGUgZGljdCBmaXJzdCAqLwogICAgIGlmIChzZWxmLT5kaWN0ID09IE5VTEwpIHsKICAgICAgICAgc2VsZi0+ZGljdCA9IFB5RGljdF9OZXcoKTsKQEAgLTM2Nyw3ICszNjcsNyBAQAogICAgIHsiX19kaWN0X18iLCAoZ2V0dGVyKUJhc2VFeGNlcHRpb25fZ2V0X2RpY3QsIChzZXR0ZXIpQmFzZUV4Y2VwdGlvbl9zZXRfZGljdH0sCiAgICAgeyJhcmdzIiwgKGdldHRlcilCYXNlRXhjZXB0aW9uX2dldF9hcmdzLCAoc2V0dGVyKUJhc2VFeGNlcHRpb25fc2V0X2FyZ3N9LAogICAgIHsibWVzc2FnZSIsIChnZXR0ZXIpQmFzZUV4Y2VwdGlvbl9nZXRfbWVzc2FnZSwKLQkgICAgKHNldHRlcilCYXNlRXhjZXB0aW9uX3NldF9tZXNzYWdlfSwKKyAgICAgICAgICAgIChzZXR0ZXIpQmFzZUV4Y2VwdGlvbl9zZXRfbWVzc2FnZX0sCiAgICAge05VTEx9LAogfTsKIApAQCAtMzk0LDcgKzM5NCw3IEBACiAgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsICAgIC8qdHBfc2V0YXR0cm8qLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0gICAgCVB5X1RQRkxBR1NfQkFTRV9FWENfU1VCQ0xBU1MsICAvKnRwX2ZsYWdzKi8KKyAgICAgICAgUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUywgIC8qdHBfZmxhZ3MqLwogICAgIFB5RG9jX1NUUigiQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIiksIC8qIHRwX2RvYyAqLwogICAgICh0cmF2ZXJzZXByb2MpQmFzZUV4Y2VwdGlvbl90cmF2ZXJzZSwgLyogdHBfdHJhdmVyc2UgKi8KICAgICAoaW5xdWlyeSlCYXNlRXhjZXB0aW9uX2NsZWFyLCAvKiB0cF9jbGVhciAqLwpAQCAtMjA1NCw4ICsyMDU0LDggQEAKIC8qIGNydCB2YXJpYWJsZSBjaGVja2luZyBpbiBWaXN1YWxTdHVkaW8gLk5FVCAyMDA1ICovCiAjaW5jbHVkZSA8Y3J0ZGJnLmg+CiAKLXN0YXRpYyBpbnQJcHJldkNydFJlcG9ydE1vZGU7Ci1zdGF0aWMgX2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXIJcHJldkNydEhhbmRsZXI7CitzdGF0aWMgaW50ICAgICAgcHJldkNydFJlcG9ydE1vZGU7CitzdGF0aWMgX2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXIgICAgICAgcHJldkNydEhhbmRsZXI7CiAKIC8qIEludmFsaWQgcGFyYW1ldGVyIGhhbmRsZXIuICBTZXRzIGEgVmFsdWVFcnJvciBleGNlcHRpb24gKi8KIHN0YXRpYyB2b2lkCkBAIC0yMjA5LDI1ICsyMjA5LDI1IEBACiAKICAgICBQeUV4Y19SZWN1cnNpb25FcnJvckluc3QgPSBCYXNlRXhjZXB0aW9uX25ldygmX1B5RXhjX1J1bnRpbWVFcnJvciwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKCFQeUV4Y19SZWN1cnNpb25FcnJvckluc3QpCi0JUHlfRmF0YWxFcnJvcigiQ2Fubm90IHByZS1hbGxvY2F0ZSBSdW50aW1lRXJyb3IgaW5zdGFuY2UgZm9yICIKLQkJCSJyZWN1cnNpb24gZXJyb3JzIik7CisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbm5vdCBwcmUtYWxsb2NhdGUgUnVudGltZUVycm9yIGluc3RhbmNlIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAicmVjdXJzaW9uIGVycm9ycyIpOwogICAgIGVsc2UgewotCVB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqZXJyX2luc3QgPQotCSAgICAoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0OwotCVB5T2JqZWN0ICphcmdzX3R1cGxlOwotCVB5T2JqZWN0ICpleGNfbWVzc2FnZTsKLQlleGNfbWVzc2FnZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIm1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkIik7Ci0JaWYgKCFleGNfbWVzc2FnZSkKLQkgICAgUHlfRmF0YWxFcnJvcigiY2Fubm90IGFsbG9jYXRlIGFyZ3VtZW50IGZvciBSdW50aW1lRXJyb3IgIgotCQkJICAgICJwcmUtYWxsb2NhdGlvbiIpOwotCWFyZ3NfdHVwbGUgPSBQeVR1cGxlX1BhY2soMSwgZXhjX21lc3NhZ2UpOwotCWlmICghYXJnc190dXBsZSkKLQkgICAgUHlfRmF0YWxFcnJvcigiY2Fubm90IGFsbG9jYXRlIHR1cGxlIGZvciBSdW50aW1lRXJyb3IgIgotCQkJICAgICJwcmUtYWxsb2NhdGlvbiIpOwotCVB5X0RFQ1JFRihleGNfbWVzc2FnZSk7Ci0JaWYgKEJhc2VFeGNlcHRpb25faW5pdChlcnJfaW5zdCwgYXJnc190dXBsZSwgTlVMTCkpCi0JICAgIFB5X0ZhdGFsRXJyb3IoImluaXQgb2YgcHJlLWFsbG9jYXRlZCBSdW50aW1lRXJyb3IgZmFpbGVkIik7Ci0JUHlfREVDUkVGKGFyZ3NfdHVwbGUpOworICAgICAgICBQeUJhc2VFeGNlcHRpb25PYmplY3QgKmVycl9pbnN0ID0KKyAgICAgICAgICAgIChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilQeUV4Y19SZWN1cnNpb25FcnJvckluc3Q7CisgICAgICAgIFB5T2JqZWN0ICphcmdzX3R1cGxlOworICAgICAgICBQeU9iamVjdCAqZXhjX21lc3NhZ2U7CisgICAgICAgIGV4Y19tZXNzYWdlID0gUHlTdHJpbmdfRnJvbVN0cmluZygibWF4aW11bSByZWN1cnNpb24gZGVwdGggZXhjZWVkZWQiKTsKKyAgICAgICAgaWYgKCFleGNfbWVzc2FnZSkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbm5vdCBhbGxvY2F0ZSBhcmd1bWVudCBmb3IgUnVudGltZUVycm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlLWFsbG9jYXRpb24iKTsKKyAgICAgICAgYXJnc190dXBsZSA9IFB5VHVwbGVfUGFjaygxLCBleGNfbWVzc2FnZSk7CisgICAgICAgIGlmICghYXJnc190dXBsZSkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbm5vdCBhbGxvY2F0ZSB0dXBsZSBmb3IgUnVudGltZUVycm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlLWFsbG9jYXRpb24iKTsKKyAgICAgICAgUHlfREVDUkVGKGV4Y19tZXNzYWdlKTsKKyAgICAgICAgaWYgKEJhc2VFeGNlcHRpb25faW5pdChlcnJfaW5zdCwgYXJnc190dXBsZSwgTlVMTCkpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJpbml0IG9mIHByZS1hbGxvY2F0ZWQgUnVudGltZUVycm9yIGZhaWxlZCIpOworICAgICAgICBQeV9ERUNSRUYoYXJnc190dXBsZSk7CiAgICAgfQogCiAgICAgUHlfREVDUkVGKGJsdGlubW9kKTsKZGlmZiAtLWdpdCBhL09iamVjdHMvZmlsZW9iamVjdC5jIGIvT2JqZWN0cy9maWxlb2JqZWN0LmMKaW5kZXggNTJkODEyMC4uYjlkOTA5NyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9maWxlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9maWxlb2JqZWN0LmMKQEAgLTQzLDEwICs0MywxMCBAQAogI2VuZGlmCiAKIC8qIEJpdHMgaW4gZl9uZXdsaW5ldHlwZXMgKi8KLSNkZWZpbmUgTkVXTElORV9VTktOT1dOCTAJLyogTm8gbmV3bGluZSBzZWVuLCB5ZXQgKi8KLSNkZWZpbmUgTkVXTElORV9DUiAxCQkvKiBcciBuZXdsaW5lIHNlZW4gKi8KLSNkZWZpbmUgTkVXTElORV9MRiAyCQkvKiBcbiBuZXdsaW5lIHNlZW4gKi8KLSNkZWZpbmUgTkVXTElORV9DUkxGIDQJCS8qIFxyXG4gbmV3bGluZSBzZWVuICovCisjZGVmaW5lIE5FV0xJTkVfVU5LTk9XTiAwICAgICAgIC8qIE5vIG5ld2xpbmUgc2VlbiwgeWV0ICovCisjZGVmaW5lIE5FV0xJTkVfQ1IgMSAgICAgICAgICAgIC8qIFxyIG5ld2xpbmUgc2VlbiAqLworI2RlZmluZSBORVdMSU5FX0xGIDIgICAgICAgICAgICAvKiBcbiBuZXdsaW5lIHNlZW4gKi8KKyNkZWZpbmUgTkVXTElORV9DUkxGIDQgICAgICAgICAgLyogXHJcbiBuZXdsaW5lIHNlZW4gKi8KIAogLyoKICAqIFRoZXNlIG1hY3JvcyByZWxlYXNlIHRoZSBHSUwgd2hpbGUgcHJldmVudGluZyB0aGUgZl9jbG9zZSgpIGZ1bmN0aW9uIGJlaW5nCkBAIC01OCwxOSArNTgsMTkgQEAKIAogI2RlZmluZSBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZm9iaikgXAogeyBcCi0JZm9iai0+dW5sb2NrZWRfY291bnQrKzsgXAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmb2JqLT51bmxvY2tlZF9jb3VudCsrOyBcCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCiAjZGVmaW5lIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZm9iaikgXAotCVB5X0VORF9BTExPV19USFJFQURTIFwKLQlmb2JqLT51bmxvY2tlZF9jb3VudC0tOyBcCi0JYXNzZXJ0KGZvYmotPnVubG9ja2VkX2NvdW50ID49IDApOyBcCisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMgXAorICAgIGZvYmotPnVubG9ja2VkX2NvdW50LS07IFwKKyAgICBhc3NlcnQoZm9iai0+dW5sb2NrZWRfY291bnQgPj0gMCk7IFwKIH0KIAogI2RlZmluZSBGSUxFX0FCT1JUX0FMTE9XX1RIUkVBRFMoZm9iaikgXAotCVB5X0JMT0NLX1RIUkVBRFMgXAotCWZvYmotPnVubG9ja2VkX2NvdW50LS07IFwKLQlhc3NlcnQoZm9iai0+dW5sb2NrZWRfY291bnQgPj0gMCk7CisgICAgUHlfQkxPQ0tfVEhSRUFEUyBcCisgICAgZm9iai0+dW5sb2NrZWRfY291bnQtLTsgXAorICAgIGFzc2VydChmb2JqLT51bmxvY2tlZF9jb3VudCA+PSAwKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKQEAgLTc5LDMwICs3OSwzMCBAQAogRklMRSAqCiBQeUZpbGVfQXNGaWxlKFB5T2JqZWN0ICpmKQogewotCWlmIChmID09IE5VTEwgfHwgIVB5RmlsZV9DaGVjayhmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gKChQeUZpbGVPYmplY3QgKilmKS0+Zl9mcDsKKyAgICBpZiAoZiA9PSBOVUxMIHx8ICFQeUZpbGVfQ2hlY2soZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICgoUHlGaWxlT2JqZWN0ICopZiktPmZfZnA7CiB9CiAKIHZvaWQgUHlGaWxlX0luY1VzZUNvdW50KFB5RmlsZU9iamVjdCAqZm9iaikKIHsKLQlmb2JqLT51bmxvY2tlZF9jb3VudCsrOworICAgIGZvYmotPnVubG9ja2VkX2NvdW50Kys7CiB9CiAKIHZvaWQgUHlGaWxlX0RlY1VzZUNvdW50KFB5RmlsZU9iamVjdCAqZm9iaikKIHsKLQlmb2JqLT51bmxvY2tlZF9jb3VudC0tOwotCWFzc2VydChmb2JqLT51bmxvY2tlZF9jb3VudCA+PSAwKTsKKyAgICBmb2JqLT51bmxvY2tlZF9jb3VudC0tOworICAgIGFzc2VydChmb2JqLT51bmxvY2tlZF9jb3VudCA+PSAwKTsKIH0KIAogUHlPYmplY3QgKgogUHlGaWxlX05hbWUoUHlPYmplY3QgKmYpCiB7Ci0JaWYgKGYgPT0gTlVMTCB8fCAhUHlGaWxlX0NoZWNrKGYpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiAoKFB5RmlsZU9iamVjdCAqKWYpLT5mX25hbWU7CisgICAgaWYgKGYgPT0gTlVMTCB8fCAhUHlGaWxlX0NoZWNrKGYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAoKFB5RmlsZU9iamVjdCAqKWYpLT5mX25hbWU7CiB9CiAKIC8qIFRoaXMgaXMgYSBzYWZlIHdyYXBwZXIgYXJvdW5kIFB5T2JqZWN0X1ByaW50IHRvIHByaW50IHRvIHRoZSBGSUxFCkBAIC0xMTEsMTEgKzExMSwxMSBAQAogc3RhdGljIGludAogZmlsZV9QeU9iamVjdF9QcmludChQeU9iamVjdCAqb3AsIFB5RmlsZU9iamVjdCAqZiwgaW50IGZsYWdzKQogewotCWludCByZXN1bHQ7Ci0JUHlGaWxlX0luY1VzZUNvdW50KGYpOwotCXJlc3VsdCA9IFB5T2JqZWN0X1ByaW50KG9wLCBmLT5mX2ZwLCBmbGFncyk7Ci0JUHlGaWxlX0RlY1VzZUNvdW50KGYpOwotCXJldHVybiByZXN1bHQ7CisgICAgaW50IHJlc3VsdDsKKyAgICBQeUZpbGVfSW5jVXNlQ291bnQoZik7CisgICAgcmVzdWx0ID0gUHlPYmplY3RfUHJpbnQob3AsIGYtPmZfZnAsIGZsYWdzKTsKKyAgICBQeUZpbGVfRGVjVXNlQ291bnQoZik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogT24gVW5peCwgZm9wZW4gd2lsbCBzdWNjZWVkIGZvciBkaXJlY3Rvcmllcy4KQEAgLTEyNiw2NiArMTI2LDY2IEBACiBkaXJjaGVjayhQeUZpbGVPYmplY3QqIGYpCiB7CiAjaWYgZGVmaW5lZChIQVZFX0ZTVEFUKSAmJiBkZWZpbmVkKFNfSUZESVIpICYmIGRlZmluZWQoRUlTRElSKQotCXN0cnVjdCBzdGF0IGJ1ZjsKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZjsKLQlpZiAoZnN0YXQoZmlsZW5vKGYtPmZfZnApLCAmYnVmKSA9PSAwICYmCi0JICAgIFNfSVNESVIoYnVmLnN0X21vZGUpKSB7Ci0JCWNoYXIgKm1zZyA9IHN0cmVycm9yKEVJU0RJUik7Ci0JCVB5T2JqZWN0ICpleGMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oUHlFeGNfSU9FcnJvciwgIihpc08pIiwKLQkJCQkJCSAgICAgIEVJU0RJUiwgbXNnLCBmLT5mX25hbWUpOwotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfSU9FcnJvciwgZXhjKTsKLQkJUHlfWERFQ1JFRihleGMpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBmOworICAgIGlmIChmc3RhdChmaWxlbm8oZi0+Zl9mcCksICZidWYpID09IDAgJiYKKyAgICAgICAgU19JU0RJUihidWYuc3RfbW9kZSkpIHsKKyAgICAgICAgY2hhciAqbXNnID0gc3RyZXJyb3IoRUlTRElSKTsKKyAgICAgICAgUHlPYmplY3QgKmV4YyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeUV4Y19JT0Vycm9yLCAiKGlzTykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJU0RJUiwgbXNnLCBmLT5mX25hbWUpOworICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfSU9FcnJvciwgZXhjKTsKKyAgICAgICAgUHlfWERFQ1JFRihleGMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gZjsKKyAgICByZXR1cm4gZjsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsbF9maWxlX2ZpZWxkcyhQeUZpbGVPYmplY3QgKmYsIEZJTEUgKmZwLCBQeU9iamVjdCAqbmFtZSwgY2hhciAqbW9kZSwKLQkJIGludCAoKmNsb3NlKShGSUxFICopKQorICAgICAgICAgICAgICAgICBpbnQgKCpjbG9zZSkoRklMRSAqKSkKIHsKLQlhc3NlcnQobmFtZSAhPSBOVUxMKTsKLQlhc3NlcnQoZiAhPSBOVUxMKTsKLQlhc3NlcnQoUHlGaWxlX0NoZWNrKGYpKTsKLQlhc3NlcnQoZi0+Zl9mcCA9PSBOVUxMKTsKKyAgICBhc3NlcnQobmFtZSAhPSBOVUxMKTsKKyAgICBhc3NlcnQoZiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlGaWxlX0NoZWNrKGYpKTsKKyAgICBhc3NlcnQoZi0+Zl9mcCA9PSBOVUxMKTsKIAotCVB5X0RFQ1JFRihmLT5mX25hbWUpOwotCVB5X0RFQ1JFRihmLT5mX21vZGUpOwotCVB5X0RFQ1JFRihmLT5mX2VuY29kaW5nKTsKLQlQeV9ERUNSRUYoZi0+Zl9lcnJvcnMpOworICAgIFB5X0RFQ1JFRihmLT5mX25hbWUpOworICAgIFB5X0RFQ1JFRihmLT5mX21vZGUpOworICAgIFB5X0RFQ1JFRihmLT5mX2VuY29kaW5nKTsKKyAgICBQeV9ERUNSRUYoZi0+Zl9lcnJvcnMpOwogCi0gICAgICAgIFB5X0lOQ1JFRihuYW1lKTsKLSAgICAgICAgZi0+Zl9uYW1lID0gbmFtZTsKKyAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgZi0+Zl9uYW1lID0gbmFtZTsKIAotCWYtPmZfbW9kZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobW9kZSk7CisgICAgZi0+Zl9tb2RlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhtb2RlKTsKIAotCWYtPmZfY2xvc2UgPSBjbG9zZTsKLQlmLT5mX3NvZnRzcGFjZSA9IDA7Ci0JZi0+Zl9iaW5hcnkgPSBzdHJjaHIobW9kZSwnYicpICE9IE5VTEw7Ci0JZi0+Zl9idWYgPSBOVUxMOwotCWYtPmZfdW5pdl9uZXdsaW5lID0gKHN0cmNocihtb2RlLCAnVScpICE9IE5VTEwpOwotCWYtPmZfbmV3bGluZXR5cGVzID0gTkVXTElORV9VTktOT1dOOwotCWYtPmZfc2tpcG5leHRsZiA9IDA7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCWYtPmZfZW5jb2RpbmcgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlmLT5mX2Vycm9ycyA9IFB5X05vbmU7Ci0JZi0+cmVhZGFibGUgPSBmLT53cml0YWJsZSA9IDA7Ci0JaWYgKHN0cmNocihtb2RlLCAncicpICE9IE5VTEwgfHwgZi0+Zl91bml2X25ld2xpbmUpCi0JCWYtPnJlYWRhYmxlID0gMTsKLQlpZiAoc3RyY2hyKG1vZGUsICd3JykgIT0gTlVMTCB8fCBzdHJjaHIobW9kZSwgJ2EnKSAhPSBOVUxMKQotCQlmLT53cml0YWJsZSA9IDE7Ci0JaWYgKHN0cmNocihtb2RlLCAnKycpICE9IE5VTEwpCi0JCWYtPnJlYWRhYmxlID0gZi0+d3JpdGFibGUgPSAxOworICAgIGYtPmZfY2xvc2UgPSBjbG9zZTsKKyAgICBmLT5mX3NvZnRzcGFjZSA9IDA7CisgICAgZi0+Zl9iaW5hcnkgPSBzdHJjaHIobW9kZSwnYicpICE9IE5VTEw7CisgICAgZi0+Zl9idWYgPSBOVUxMOworICAgIGYtPmZfdW5pdl9uZXdsaW5lID0gKHN0cmNocihtb2RlLCAnVScpICE9IE5VTEwpOworICAgIGYtPmZfbmV3bGluZXR5cGVzID0gTkVXTElORV9VTktOT1dOOworICAgIGYtPmZfc2tpcG5leHRsZiA9IDA7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIGYtPmZfZW5jb2RpbmcgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBmLT5mX2Vycm9ycyA9IFB5X05vbmU7CisgICAgZi0+cmVhZGFibGUgPSBmLT53cml0YWJsZSA9IDA7CisgICAgaWYgKHN0cmNocihtb2RlLCAncicpICE9IE5VTEwgfHwgZi0+Zl91bml2X25ld2xpbmUpCisgICAgICAgIGYtPnJlYWRhYmxlID0gMTsKKyAgICBpZiAoc3RyY2hyKG1vZGUsICd3JykgIT0gTlVMTCB8fCBzdHJjaHIobW9kZSwgJ2EnKSAhPSBOVUxMKQorICAgICAgICBmLT53cml0YWJsZSA9IDE7CisgICAgaWYgKHN0cmNocihtb2RlLCAnKycpICE9IE5VTEwpCisgICAgICAgIGYtPnJlYWRhYmxlID0gZi0+d3JpdGFibGUgPSAxOwogCi0JaWYgKGYtPmZfbW9kZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmLT5mX2ZwID0gZnA7Ci0gICAgICAgIGYgPSBkaXJjaGVjayhmKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIGY7CisgICAgaWYgKGYtPmZfbW9kZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmLT5mX2ZwID0gZnA7CisgICAgZiA9IGRpcmNoZWNrKGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKikgZjsKIH0KIAogLyogY2hlY2sgZm9yIGtub3duIGluY29ycmVjdCBtb2RlIHN0cmluZ3MgLSBwcm9ibGVtIGlzLCBwbGF0Zm9ybXMgYXJlCkBAIC0xOTcsMjU4ICsxOTcsMjU4IEBACiBpbnQKIF9QeUZpbGVfU2FuaXRpemVNb2RlKGNoYXIgKm1vZGUpCiB7Ci0JY2hhciAqdXBvczsKLQlzaXplX3QgbGVuID0gc3RybGVuKG1vZGUpOworICAgIGNoYXIgKnVwb3M7CisgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihtb2RlKTsKIAotCWlmICghbGVuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgbW9kZSBzdHJpbmciKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoIWxlbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IG1vZGUgc3RyaW5nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQl1cG9zID0gc3RyY2hyKG1vZGUsICdVJyk7Ci0JaWYgKHVwb3MpIHsKLQkJbWVtbW92ZSh1cG9zLCB1cG9zKzEsIGxlbi0odXBvcy1tb2RlKSk7IC8qIGluY2wgbnVsbCBjaGFyICovCisgICAgdXBvcyA9IHN0cmNocihtb2RlLCAnVScpOworICAgIGlmICh1cG9zKSB7CisgICAgICAgIG1lbW1vdmUodXBvcywgdXBvcysxLCBsZW4tKHVwb3MtbW9kZSkpOyAvKiBpbmNsIG51bGwgY2hhciAqLwogCi0JCWlmIChtb2RlWzBdID09ICd3JyB8fCBtb2RlWzBdID09ICdhJykgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bml2ZXJzYWwgbmV3bGluZSAiCi0JCQkgICAgICAgICAgICAgIm1vZGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIG1vZGVzICIKLQkJCQkgICAgICJzdGFydGluZyB3aXRoICdyJyIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIGlmIChtb2RlWzBdID09ICd3JyB8fCBtb2RlWzBdID09ICdhJykgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJ1bml2ZXJzYWwgbmV3bGluZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZGUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIG1vZGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RhcnRpbmcgd2l0aCAnciciKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCWlmIChtb2RlWzBdICE9ICdyJykgewotCQkJbWVtbW92ZShtb2RlKzEsIG1vZGUsIHN0cmxlbihtb2RlKSsxKTsKLQkJCW1vZGVbMF0gPSAncic7Ci0JCX0KKyAgICAgICAgaWYgKG1vZGVbMF0gIT0gJ3InKSB7CisgICAgICAgICAgICBtZW1tb3ZlKG1vZGUrMSwgbW9kZSwgc3RybGVuKG1vZGUpKzEpOworICAgICAgICAgICAgbW9kZVswXSA9ICdyJzsKKyAgICAgICAgfQogCi0JCWlmICghc3RyY2hyKG1vZGUsICdiJykpIHsKLQkJCW1lbW1vdmUobW9kZSsyLCBtb2RlKzEsIHN0cmxlbihtb2RlKSk7Ci0JCQltb2RlWzFdID0gJ2InOwotCQl9Ci0JfSBlbHNlIGlmIChtb2RlWzBdICE9ICdyJyAmJiBtb2RlWzBdICE9ICd3JyAmJiBtb2RlWzBdICE9ICdhJykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIm1vZGUgc3RyaW5nIG11c3QgYmVnaW4gd2l0aCAiCi0JICAgICAgICAJICAgICJvbmUgb2YgJ3InLCAndycsICdhJyBvciAnVScsIG5vdCAnJS4yMDBzJyIsIG1vZGUpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgICAgICBpZiAoIXN0cmNocihtb2RlLCAnYicpKSB7CisgICAgICAgICAgICBtZW1tb3ZlKG1vZGUrMiwgbW9kZSsxLCBzdHJsZW4obW9kZSkpOworICAgICAgICAgICAgbW9kZVsxXSA9ICdiJzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobW9kZVswXSAhPSAncicgJiYgbW9kZVswXSAhPSAndycgJiYgbW9kZVswXSAhPSAnYScpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJtb2RlIHN0cmluZyBtdXN0IGJlZ2luIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAib25lIG9mICdyJywgJ3cnLCAnYScgb3IgJ1UnLCBub3QgJyUuMjAwcyciLCBtb2RlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb3Blbl90aGVfZmlsZShQeUZpbGVPYmplY3QgKmYsIGNoYXIgKm5hbWUsIGNoYXIgKm1vZGUpCiB7Ci0JY2hhciAqbmV3bW9kZTsKLQlhc3NlcnQoZiAhPSBOVUxMKTsKLQlhc3NlcnQoUHlGaWxlX0NoZWNrKGYpKTsKKyAgICBjaGFyICpuZXdtb2RlOworICAgIGFzc2VydChmICE9IE5VTEwpOworICAgIGFzc2VydChQeUZpbGVfQ2hlY2soZikpOwogI2lmZGVmIE1TX1dJTkRPV1MKLQkvKiB3aW5kb3dzIGlnbm9yZXMgdGhlIHBhc3NlZCBuYW1lIGluIG9yZGVyIHRvIHN1cHBvcnQgVW5pY29kZSAqLwotCWFzc2VydChmLT5mX25hbWUgIT0gTlVMTCk7CisgICAgLyogd2luZG93cyBpZ25vcmVzIHRoZSBwYXNzZWQgbmFtZSBpbiBvcmRlciB0byBzdXBwb3J0IFVuaWNvZGUgKi8KKyAgICBhc3NlcnQoZi0+Zl9uYW1lICE9IE5VTEwpOwogI2Vsc2UKLQlhc3NlcnQobmFtZSAhPSBOVUxMKTsKKyAgICBhc3NlcnQobmFtZSAhPSBOVUxMKTsKICNlbmRpZgotCWFzc2VydChtb2RlICE9IE5VTEwpOwotCWFzc2VydChmLT5mX2ZwID09IE5VTEwpOworICAgIGFzc2VydChtb2RlICE9IE5VTEwpOworICAgIGFzc2VydChmLT5mX2ZwID09IE5VTEwpOwogCi0JLyogcHJvYmFibHkgbmVlZCB0byByZXBsYWNlICdVJyBieSAncmInICovCi0JbmV3bW9kZSA9IFB5TWVtX01BTExPQyhzdHJsZW4obW9kZSkgKyAzKTsKLQlpZiAoIW5ld21vZGUpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN0cmNweShuZXdtb2RlLCBtb2RlKTsKKyAgICAvKiBwcm9iYWJseSBuZWVkIHRvIHJlcGxhY2UgJ1UnIGJ5ICdyYicgKi8KKyAgICBuZXdtb2RlID0gUHlNZW1fTUFMTE9DKHN0cmxlbihtb2RlKSArIDMpOworICAgIGlmICghbmV3bW9kZSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RyY3B5KG5ld21vZGUsIG1vZGUpOwogCi0JaWYgKF9QeUZpbGVfU2FuaXRpemVNb2RlKG5ld21vZGUpKSB7Ci0JCWYgPSBOVUxMOwotCQlnb3RvIGNsZWFudXA7Ci0JfQorICAgIGlmIChfUHlGaWxlX1Nhbml0aXplTW9kZShuZXdtb2RlKSkgeworICAgICAgICBmID0gTlVMTDsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KIAotCS8qIHJleGVjLnB5IGNhbid0IHN0b3AgYSB1c2VyIGZyb20gZ2V0dGluZyB0aGUgZmlsZSgpIGNvbnN0cnVjdG9yIC0tCi0JICAgYWxsIHRoZXkgaGF2ZSB0byBkbyBpcyBnZXQgKmFueSogZmlsZSBvYmplY3QgZiwgYW5kIHRoZW4gZG8KLQkgICB0eXBlKGYpLiAgSGVyZSB3ZSBwcmV2ZW50IHRoZW0gZnJvbSBkb2luZyBkYW1hZ2Ugd2l0aCBpdC4gKi8KLQlpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKLQkJImZpbGUoKSBjb25zdHJ1Y3RvciBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKLQkJZiA9IE5VTEw7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0JZXJybm8gPSAwOworICAgIC8qIHJleGVjLnB5IGNhbid0IHN0b3AgYSB1c2VyIGZyb20gZ2V0dGluZyB0aGUgZmlsZSgpIGNvbnN0cnVjdG9yIC0tCisgICAgICAgYWxsIHRoZXkgaGF2ZSB0byBkbyBpcyBnZXQgKmFueSogZmlsZSBvYmplY3QgZiwgYW5kIHRoZW4gZG8KKyAgICAgICB0eXBlKGYpLiAgSGVyZSB3ZSBwcmV2ZW50IHRoZW0gZnJvbSBkb2luZyBkYW1hZ2Ugd2l0aCBpdC4gKi8KKyAgICBpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwKKyAgICAgICAgImZpbGUoKSBjb25zdHJ1Y3RvciBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKKyAgICAgICAgZiA9IE5VTEw7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgZXJybm8gPSAwOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCWlmIChQeVVuaWNvZGVfQ2hlY2soZi0+Zl9uYW1lKSkgewotCQlQeU9iamVjdCAqd21vZGU7Ci0JCXdtb2RlID0gUHlVbmljb2RlX0RlY29kZUFTQ0lJKG5ld21vZGUsIHN0cmxlbihuZXdtb2RlKSwgTlVMTCk7Ci0JCWlmIChmLT5mX25hbWUgJiYgd21vZGUpIHsKLQkJCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQkJLyogUHlVbmljb2RlX0FTX1VOSUNPREUgT0sgd2l0aG91dCB0aHJlYWQKLQkJCSAgIGxvY2sgYXMgaXQgaXMgYSBzaW1wbGUgZGVyZWZlcmVuY2UuICovCi0JCQlmLT5mX2ZwID0gX3dmb3BlbihQeVVuaWNvZGVfQVNfVU5JQ09ERShmLT5mX25hbWUpLAotCQkJCQkgIFB5VW5pY29kZV9BU19VTklDT0RFKHdtb2RlKSk7Ci0JCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JCX0KLQkJUHlfWERFQ1JFRih3bW9kZSk7Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZi0+Zl9uYW1lKSkgeworICAgICAgICBQeU9iamVjdCAqd21vZGU7CisgICAgICAgIHdtb2RlID0gUHlVbmljb2RlX0RlY29kZUFTQ0lJKG5ld21vZGUsIHN0cmxlbihuZXdtb2RlKSwgTlVMTCk7CisgICAgICAgIGlmIChmLT5mX25hbWUgJiYgd21vZGUpIHsKKyAgICAgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICAgICAgLyogUHlVbmljb2RlX0FTX1VOSUNPREUgT0sgd2l0aG91dCB0aHJlYWQKKyAgICAgICAgICAgICAgIGxvY2sgYXMgaXQgaXMgYSBzaW1wbGUgZGVyZWZlcmVuY2UuICovCisgICAgICAgICAgICBmLT5mX2ZwID0gX3dmb3BlbihQeVVuaWNvZGVfQVNfVU5JQ09ERShmLT5mX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FTX1VOSUNPREUod21vZGUpKTsKKyAgICAgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKHdtb2RlKTsKKyAgICB9CiAjZW5kaWYKLQlpZiAoTlVMTCA9PSBmLT5mX2ZwICYmIE5VTEwgIT0gbmFtZSkgewotCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJZi0+Zl9mcCA9IGZvcGVuKG5hbWUsIG5ld21vZGUpOwotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JfQorICAgIGlmIChOVUxMID09IGYtPmZfZnAgJiYgTlVMTCAhPSBuYW1lKSB7CisgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBmLT5mX2ZwID0gZm9wZW4obmFtZSwgbmV3bW9kZSk7CisgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICB9CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKSB7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkgewogI2lmIGRlZmluZWQgIF9NU0NfVkVSICYmIChfTVNDX1ZFUiA8IDE0MDAgfHwgIWRlZmluZWQoX19TVERDX1NFQ1VSRV9MSUJfXykpCi0JCS8qIE1TVkMgNiAoTWljcm9zb2Z0KSBsZWF2ZXMgZXJybm8gYXQgMCBmb3IgYmFkIG1vZGUgc3RyaW5ncywKLQkJICogYWNyb3NzIGFsbCBXaW5kb3dzIGZsYXZvcnMuICBXaGVuIGl0IHNldHMgRUlOVkFMIHZhcmllcwotCQkgKiBhY3Jvc3MgV2luZG93cyBmbGF2b3JzLCB0aGUgZXhhY3QgY29uZGl0aW9ucyBhcmVuJ3QKLQkJICogZG9jdW1lbnRlZCwgYW5kIHRoZSBhbnN3ZXIgbGllcyBpbiB0aGUgT1MncyBpbXBsZW1lbnRhdGlvbgotCQkgKiBvZiBXaW4zMidzIENyZWF0ZUZpbGUgZnVuY3Rpb24gKHdob3NlIHNvdXJjZSBpcyBzZWNyZXQpLgotCQkgKiBTZWVtcyB0aGUgYmVzdCB3ZSBjYW4gZG8gaXMgbWFwIEVJTlZBTCB0byBFTk9FTlQuCi0JCSAqIFN0YXJ0aW5nIHdpdGggVmlzdWFsIFN0dWRpbyAuTkVUIDIwMDUsIEVJTlZBTCBpcyBjb3JyZWN0bHkKLQkJICogc2V0IGJ5IG91ciBDUlQgZXJyb3IgaGFuZGxlciAoc2V0IGluIGV4Y2VwdGlvbnMuYy4pCi0JCSAqLwotCQlpZiAoZXJybm8gPT0gMCkJLyogYmFkIG1vZGUgc3RyaW5nICovCi0JCQllcnJubyA9IEVJTlZBTDsKLQkJZWxzZSBpZiAoZXJybm8gPT0gRUlOVkFMKSAvKiB1bmtub3duLCBidXQgbm90IGEgbW9kZSBzdHJpbmcgKi8KLQkJCWVycm5vID0gRU5PRU5UOworICAgICAgICAvKiBNU1ZDIDYgKE1pY3Jvc29mdCkgbGVhdmVzIGVycm5vIGF0IDAgZm9yIGJhZCBtb2RlIHN0cmluZ3MsCisgICAgICAgICAqIGFjcm9zcyBhbGwgV2luZG93cyBmbGF2b3JzLiAgV2hlbiBpdCBzZXRzIEVJTlZBTCB2YXJpZXMKKyAgICAgICAgICogYWNyb3NzIFdpbmRvd3MgZmxhdm9ycywgdGhlIGV4YWN0IGNvbmRpdGlvbnMgYXJlbid0CisgICAgICAgICAqIGRvY3VtZW50ZWQsIGFuZCB0aGUgYW5zd2VyIGxpZXMgaW4gdGhlIE9TJ3MgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICogb2YgV2luMzIncyBDcmVhdGVGaWxlIGZ1bmN0aW9uICh3aG9zZSBzb3VyY2UgaXMgc2VjcmV0KS4KKyAgICAgICAgICogU2VlbXMgdGhlIGJlc3Qgd2UgY2FuIGRvIGlzIG1hcCBFSU5WQUwgdG8gRU5PRU5ULgorICAgICAgICAgKiBTdGFydGluZyB3aXRoIFZpc3VhbCBTdHVkaW8gLk5FVCAyMDA1LCBFSU5WQUwgaXMgY29ycmVjdGx5CisgICAgICAgICAqIHNldCBieSBvdXIgQ1JUIGVycm9yIGhhbmRsZXIgKHNldCBpbiBleGNlcHRpb25zLmMuKQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGVycm5vID09IDApICAgICAgICAgLyogYmFkIG1vZGUgc3RyaW5nICovCisgICAgICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgZWxzZSBpZiAoZXJybm8gPT0gRUlOVkFMKSAvKiB1bmtub3duLCBidXQgbm90IGEgbW9kZSBzdHJpbmcgKi8KKyAgICAgICAgICAgIGVycm5vID0gRU5PRU5UOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgLyogRUlOVkFMIGlzIHJldHVybmVkIHdoZW4gYW4gaW52YWxpZCBmaWxlbmFtZSBvcgotICAgICAgICAgICAgICAgICAqIGFuIGludmFsaWQgbW9kZSBpcyBzdXBwbGllZC4gKi8KLQkJaWYgKGVycm5vID09IEVJTlZBTCkgewotCQkJUHlPYmplY3QgKnY7Ci0JCQljaGFyIG1lc3NhZ2VbMTAwXTsKLQkJCVB5T1Nfc25wcmludGYobWVzc2FnZSwgMTAwLCAKLQkJCSAgICAiaW52YWxpZCBtb2RlICgnJS41MHMnKSBvciBmaWxlbmFtZSIsIG1vZGUpOwotCQkJdiA9IFB5X0J1aWxkVmFsdWUoIihpc08pIiwgZXJybm8sIG1lc3NhZ2UsIGYtPmZfbmFtZSk7Ci0JCQlpZiAodiAhPSBOVUxMKSB7Ci0JCQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0lPRXJyb3IsIHYpOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQlQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoUHlFeGNfSU9FcnJvciwgZi0+Zl9uYW1lKTsKLQkJZiA9IE5VTEw7Ci0JfQotCWlmIChmICE9IE5VTEwpCi0JCWYgPSBkaXJjaGVjayhmKTsKKyAgICAgICAgLyogRUlOVkFMIGlzIHJldHVybmVkIHdoZW4gYW4gaW52YWxpZCBmaWxlbmFtZSBvcgorICAgICAgICAgKiBhbiBpbnZhbGlkIG1vZGUgaXMgc3VwcGxpZWQuICovCisgICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICAgICAgY2hhciBtZXNzYWdlWzEwMF07CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKG1lc3NhZ2UsIDEwMCwKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBtb2RlICgnJS41MHMnKSBvciBmaWxlbmFtZSIsIG1vZGUpOworICAgICAgICAgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpc08pIiwgZXJybm8sIG1lc3NhZ2UsIGYtPmZfbmFtZSk7CisgICAgICAgICAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0lPRXJyb3IsIHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoUHlFeGNfSU9FcnJvciwgZi0+Zl9uYW1lKTsKKyAgICAgICAgZiA9IE5VTEw7CisgICAgfQorICAgIGlmIChmICE9IE5VTEwpCisgICAgICAgIGYgPSBkaXJjaGVjayhmKTsKIAogY2xlYW51cDoKLQlQeU1lbV9GUkVFKG5ld21vZGUpOworICAgIFB5TWVtX0ZSRUUobmV3bW9kZSk7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNsb3NlX3RoZV9maWxlKFB5RmlsZU9iamVjdCAqZikKIHsKLQlpbnQgc3RzID0gMDsKLQlpbnQgKCpsb2NhbF9jbG9zZSkoRklMRSAqKTsKLQlGSUxFICpsb2NhbF9mcCA9IGYtPmZfZnA7Ci0JaWYgKGxvY2FsX2ZwICE9IE5VTEwpIHsKLQkJbG9jYWxfY2xvc2UgPSBmLT5mX2Nsb3NlOwotCQlpZiAobG9jYWxfY2xvc2UgIT0gTlVMTCAmJiBmLT51bmxvY2tlZF9jb3VudCA+IDApIHsKLQkJCWlmIChmLT5vYl9yZWZjbnQgPiAwKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsCi0JCQkJCSJjbG9zZSgpIGNhbGxlZCBkdXJpbmcgY29uY3VycmVudCAiCi0JCQkJCSJvcGVyYXRpb24gb24gdGhlIHNhbWUgZmlsZSBvYmplY3QuIik7Ci0JCQl9IGVsc2UgewotCQkJCS8qIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHNvbWVvbmUgaXMKLQkJCQkgKiBjYXJlbGVzc2x5IHBsYXlpbmcgd2l0aCB0aGUgUHlGaWxlT2JqZWN0Ci0JCQkJICogc3RydWN0IGZpZWxkcyBhbmQvb3IgaXRzIGFzc29jaWF0ZWQgRklMRQotCQkJCSAqIHBvaW50ZXIuICovCi0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkiUHlGaWxlT2JqZWN0IGxvY2tpbmcgZXJyb3IgaW4gIgotCQkJCQkiZGVzdHJ1Y3RvciAocmVmY250IDw9IDAgYXQgY2xvc2UpLiIpOwotCQkJfQotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJLyogTlVMTCBvdXQgdGhlIEZJTEUgcG9pbnRlciBiZWZvcmUgcmVsZWFzaW5nIHRoZSBHSUwsIGJlY2F1c2UKLQkJICogaXQgd2lsbCBub3QgYmUgdmFsaWQgYW55bW9yZSBhZnRlciB0aGUgY2xvc2UoKSBmdW5jdGlvbiBpcwotCQkgKiBjYWxsZWQuICovCi0JCWYtPmZfZnAgPSBOVUxMOwotCQlpZiAobG9jYWxfY2xvc2UgIT0gTlVMTCkgewotCQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQkJZXJybm8gPSAwOwotCQkJc3RzID0gKCpsb2NhbF9jbG9zZSkobG9jYWxfZnApOwotCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJCWlmIChzdHMgPT0gRU9GKQotCQkJCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQlpZiAoc3RzICE9IDApCi0JCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXN0cyk7Ci0JCX0KLQl9Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaW50IHN0cyA9IDA7CisgICAgaW50ICgqbG9jYWxfY2xvc2UpKEZJTEUgKik7CisgICAgRklMRSAqbG9jYWxfZnAgPSBmLT5mX2ZwOworICAgIGlmIChsb2NhbF9mcCAhPSBOVUxMKSB7CisgICAgICAgIGxvY2FsX2Nsb3NlID0gZi0+Zl9jbG9zZTsKKyAgICAgICAgaWYgKGxvY2FsX2Nsb3NlICE9IE5VTEwgJiYgZi0+dW5sb2NrZWRfY291bnQgPiAwKSB7CisgICAgICAgICAgICBpZiAoZi0+b2JfcmVmY250ID4gMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2xvc2UoKSBjYWxsZWQgZHVyaW5nIGNvbmN1cnJlbnQgIgorICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9uIG9uIHRoZSBzYW1lIGZpbGUgb2JqZWN0LiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyBzb21lb25lIGlzCisgICAgICAgICAgICAgICAgICogY2FyZWxlc3NseSBwbGF5aW5nIHdpdGggdGhlIFB5RmlsZU9iamVjdAorICAgICAgICAgICAgICAgICAqIHN0cnVjdCBmaWVsZHMgYW5kL29yIGl0cyBhc3NvY2lhdGVkIEZJTEUKKyAgICAgICAgICAgICAgICAgKiBwb2ludGVyLiAqLworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIlB5RmlsZU9iamVjdCBsb2NraW5nIGVycm9yIGluICIKKyAgICAgICAgICAgICAgICAgICAgImRlc3RydWN0b3IgKHJlZmNudCA8PSAwIGF0IGNsb3NlKS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIE5VTEwgb3V0IHRoZSBGSUxFIHBvaW50ZXIgYmVmb3JlIHJlbGVhc2luZyB0aGUgR0lMLCBiZWNhdXNlCisgICAgICAgICAqIGl0IHdpbGwgbm90IGJlIHZhbGlkIGFueW1vcmUgYWZ0ZXIgdGhlIGNsb3NlKCkgZnVuY3Rpb24gaXMKKyAgICAgICAgICogY2FsbGVkLiAqLworICAgICAgICBmLT5mX2ZwID0gTlVMTDsKKyAgICAgICAgaWYgKGxvY2FsX2Nsb3NlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgIHN0cyA9ICgqbG9jYWxfY2xvc2UpKGxvY2FsX2ZwKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgICAgICBpZiAoc3RzID09IEVPRikKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgaWYgKHN0cyAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzdHMpOworICAgICAgICB9CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeU9iamVjdCAqCiBQeUZpbGVfRnJvbUZpbGUoRklMRSAqZnAsIGNoYXIgKm5hbWUsIGNoYXIgKm1vZGUsIGludCAoKmNsb3NlKShGSUxFICopKQogewotCVB5RmlsZU9iamVjdCAqZiA9IChQeUZpbGVPYmplY3QgKilQeUZpbGVfVHlwZS50cF9uZXcoJlB5RmlsZV9UeXBlLAotCQkJCQkJCSAgICAgTlVMTCwgTlVMTCk7Ci0JaWYgKGYgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqb19uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKLQkJaWYgKG9fbmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChmaWxsX2ZpbGVfZmllbGRzKGYsIGZwLCBvX25hbWUsIG1vZGUsIGNsb3NlKSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZik7Ci0JCQlmID0gTlVMTDsKLQkJfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvX25hbWUpOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIGY7CisgICAgUHlGaWxlT2JqZWN0ICpmID0gKFB5RmlsZU9iamVjdCAqKVB5RmlsZV9UeXBlLnRwX25ldygmUHlGaWxlX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZiAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpvX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgICAgICBpZiAob19uYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGZpbGxfZmlsZV9maWVsZHMoZiwgZnAsIG9fbmFtZSwgbW9kZSwgY2xvc2UpID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmKTsKKyAgICAgICAgICAgIGYgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihvX25hbWUpOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIGY7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RmlsZV9Gcm9tU3RyaW5nKGNoYXIgKm5hbWUsIGNoYXIgKm1vZGUpCiB7Ci0JZXh0ZXJuIGludCBmY2xvc2UoRklMRSAqKTsKLQlQeUZpbGVPYmplY3QgKmY7CisgICAgZXh0ZXJuIGludCBmY2xvc2UoRklMRSAqKTsKKyAgICBQeUZpbGVPYmplY3QgKmY7CiAKLQlmID0gKFB5RmlsZU9iamVjdCAqKVB5RmlsZV9Gcm9tRmlsZSgoRklMRSAqKU5VTEwsIG5hbWUsIG1vZGUsIGZjbG9zZSk7Ci0JaWYgKGYgIT0gTlVMTCkgewotCQlpZiAob3Blbl90aGVfZmlsZShmLCBuYW1lLCBtb2RlKSA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZik7Ci0JCQlmID0gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopZjsKKyAgICBmID0gKFB5RmlsZU9iamVjdCAqKVB5RmlsZV9Gcm9tRmlsZSgoRklMRSAqKU5VTEwsIG5hbWUsIG1vZGUsIGZjbG9zZSk7CisgICAgaWYgKGYgIT0gTlVMTCkgeworICAgICAgICBpZiAob3Blbl90aGVfZmlsZShmLCBuYW1lLCBtb2RlKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgICAgICAgICBmID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZjsKIH0KIAogdm9pZAogUHlGaWxlX1NldEJ1ZlNpemUoUHlPYmplY3QgKmYsIGludCBidWZzaXplKQogewotCVB5RmlsZU9iamVjdCAqZmlsZSA9IChQeUZpbGVPYmplY3QgKilmOwotCWlmIChidWZzaXplID49IDApIHsKLQkJaW50IHR5cGU7Ci0JCXN3aXRjaCAoYnVmc2l6ZSkgewotCQljYXNlIDA6Ci0JCQl0eXBlID0gX0lPTkJGOwotCQkJYnJlYWs7CisgICAgUHlGaWxlT2JqZWN0ICpmaWxlID0gKFB5RmlsZU9iamVjdCAqKWY7CisgICAgaWYgKGJ1ZnNpemUgPj0gMCkgeworICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgc3dpdGNoIChidWZzaXplKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHR5cGUgPSBfSU9OQkY7CisgICAgICAgICAgICBicmVhazsKICNpZmRlZiBIQVZFX1NFVFZCVUYKLQkJY2FzZSAxOgotCQkJdHlwZSA9IF9JT0xCRjsKLQkJCWJ1ZnNpemUgPSBCVUZTSVo7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdHlwZSA9IF9JT0xCRjsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBCVUZTSVo7CisgICAgICAgICAgICBicmVhazsKICNlbmRpZgotCQlkZWZhdWx0OgotCQkJdHlwZSA9IF9JT0ZCRjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHR5cGUgPSBfSU9GQkY7CiAjaWZuZGVmIEhBVkVfU0VUVkJVRgotCQkJYnVmc2l6ZSA9IEJVRlNJWjsKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBCVUZTSVo7CiAjZW5kaWYKLQkJCWJyZWFrOwotCQl9Ci0JCWZmbHVzaChmaWxlLT5mX2ZwKTsKLQkJaWYgKHR5cGUgPT0gX0lPTkJGKSB7Ci0JCQlQeU1lbV9GcmVlKGZpbGUtPmZfc2V0YnVmKTsKLQkJCWZpbGUtPmZfc2V0YnVmID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCWZpbGUtPmZfc2V0YnVmID0gKGNoYXIgKilQeU1lbV9SZWFsbG9jKGZpbGUtPmZfc2V0YnVmLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplKTsKLQkJfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZmZsdXNoKGZpbGUtPmZfZnApOworICAgICAgICBpZiAodHlwZSA9PSBfSU9OQkYpIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoZmlsZS0+Zl9zZXRidWYpOworICAgICAgICAgICAgZmlsZS0+Zl9zZXRidWYgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsZS0+Zl9zZXRidWYgPSAoY2hhciAqKVB5TWVtX1JlYWxsb2MoZmlsZS0+Zl9zZXRidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSk7CisgICAgICAgIH0KICNpZmRlZiBIQVZFX1NFVFZCVUYKLQkJc2V0dmJ1ZihmaWxlLT5mX2ZwLCBmaWxlLT5mX3NldGJ1ZiwgdHlwZSwgYnVmc2l6ZSk7CisgICAgICAgIHNldHZidWYoZmlsZS0+Zl9mcCwgZmlsZS0+Zl9zZXRidWYsIHR5cGUsIGJ1ZnNpemUpOwogI2Vsc2UgLyogIUhBVkVfU0VUVkJVRiAqLwotCQlzZXRidWYoZmlsZS0+Zl9mcCwgZmlsZS0+Zl9zZXRidWYpOworICAgICAgICBzZXRidWYoZmlsZS0+Zl9mcCwgZmlsZS0+Zl9zZXRidWYpOwogI2VuZGlmIC8qICFIQVZFX1NFVFZCVUYgKi8KLQl9CisgICAgfQogfQogCiAvKiBTZXQgdGhlIGVuY29kaW5nIHVzZWQgdG8gb3V0cHV0IFVuaWNvZGUgc3RyaW5ncy4KQEAgLTQ1Nyw0OCArNDU3LDQ4IEBACiBpbnQKIFB5RmlsZV9TZXRFbmNvZGluZyhQeU9iamVjdCAqZiwgY29uc3QgY2hhciAqZW5jKQogewotCXJldHVybiBQeUZpbGVfU2V0RW5jb2RpbmdBbmRFcnJvcnMoZiwgZW5jLCBOVUxMKTsKKyAgICByZXR1cm4gUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKGYsIGVuYywgTlVMTCk7CiB9CiAKIGludAogUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKFB5T2JqZWN0ICpmLCBjb25zdCBjaGFyICplbmMsIGNoYXIqIGVycm9ycykKIHsKLQlQeUZpbGVPYmplY3QgKmZpbGUgPSAoUHlGaWxlT2JqZWN0KilmOwotCVB5T2JqZWN0ICpzdHIsICpvZXJyb3JzOworICAgIFB5RmlsZU9iamVjdCAqZmlsZSA9IChQeUZpbGVPYmplY3QqKWY7CisgICAgUHlPYmplY3QgKnN0ciwgKm9lcnJvcnM7CiAKLQlhc3NlcnQoUHlGaWxlX0NoZWNrKGYpKTsKLQlzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGVuYyk7Ci0JaWYgKCFzdHIpCi0JCXJldHVybiAwOwotCWlmIChlcnJvcnMpIHsKLQkJb2Vycm9ycyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZXJyb3JzKTsKLQkJaWYgKCFvZXJyb3JzKSB7Ci0JCQlQeV9ERUNSRUYoc3RyKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJb2Vycm9ycyA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQl9Ci0JUHlfREVDUkVGKGZpbGUtPmZfZW5jb2RpbmcpOwotCWZpbGUtPmZfZW5jb2RpbmcgPSBzdHI7Ci0JUHlfREVDUkVGKGZpbGUtPmZfZXJyb3JzKTsKLQlmaWxlLT5mX2Vycm9ycyA9IG9lcnJvcnM7Ci0JcmV0dXJuIDE7CisgICAgYXNzZXJ0KFB5RmlsZV9DaGVjayhmKSk7CisgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZyhlbmMpOworICAgIGlmICghc3RyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZXJyb3JzKSB7CisgICAgICAgIG9lcnJvcnMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGVycm9ycyk7CisgICAgICAgIGlmICghb2Vycm9ycykgeworICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG9lcnJvcnMgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihmaWxlLT5mX2VuY29kaW5nKTsKKyAgICBmaWxlLT5mX2VuY29kaW5nID0gc3RyOworICAgIFB5X0RFQ1JFRihmaWxlLT5mX2Vycm9ycyk7CisgICAgZmlsZS0+Zl9lcnJvcnMgPSBvZXJyb3JzOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZXJyX2Nsb3NlZCh2b2lkKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZXJyX21vZGUoY2hhciAqYWN0aW9uKQogewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSU9FcnJvciwgIkZpbGUgbm90IG9wZW4gZm9yICVzIiwgYWN0aW9uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0lPRXJyb3IsICJGaWxlIG5vdCBvcGVuIGZvciAlcyIsIGFjdGlvbik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIFJlZnVzZSByZWd1bGFyIGZpbGUgSS9PIGlmIHRoZXJlJ3MgZGF0YSBpbiB0aGUgaXRlcmF0aW9uLWJ1ZmZlci4KQEAgLTUwNyw5ICs1MDcsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGVycl9pdGVyYnVmZmVyZWQodm9pZCkKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJIk1peGluZyBpdGVyYXRpb24gYW5kIHJlYWQgbWV0aG9kcyB3b3VsZCBsb3NlIGRhdGEiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgIk1peGluZyBpdGVyYXRpb24gYW5kIHJlYWQgbWV0aG9kcyB3b3VsZCBsb3NlIGRhdGEiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgZHJvcF9yZWFkYWhlYWQoUHlGaWxlT2JqZWN0ICopOwpAQCAtNTE5LDU4ICs1MTksNTggQEAKIHN0YXRpYyB2b2lkCiBmaWxlX2RlYWxsb2MoUHlGaWxlT2JqZWN0ICpmKQogewotCVB5T2JqZWN0ICpyZXQ7Ci0JaWYgKGYtPndlYWtyZWZsaXN0ICE9IE5VTEwpCi0JCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIGYpOwotCXJldCA9IGNsb3NlX3RoZV9maWxlKGYpOwotCWlmICghcmV0KSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJjbG9zZSBmYWlsZWQgaW4gZmlsZSBvYmplY3QgZGVzdHJ1Y3RvcjpcbiIpOwotCQlQeUVycl9QcmludCgpOwotCX0KLQllbHNlIHsKLQkJUHlfREVDUkVGKHJldCk7Ci0JfQotCVB5TWVtX0ZyZWUoZi0+Zl9zZXRidWYpOwotCVB5X1hERUNSRUYoZi0+Zl9uYW1lKTsKLQlQeV9YREVDUkVGKGYtPmZfbW9kZSk7Ci0JUHlfWERFQ1JFRihmLT5mX2VuY29kaW5nKTsKLQlQeV9YREVDUkVGKGYtPmZfZXJyb3JzKTsKLQlkcm9wX3JlYWRhaGVhZChmKTsKLQlQeV9UWVBFKGYpLT50cF9mcmVlKChQeU9iamVjdCAqKWYpOworICAgIFB5T2JqZWN0ICpyZXQ7CisgICAgaWYgKGYtPndlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIGYpOworICAgIHJldCA9IGNsb3NlX3RoZV9maWxlKGYpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJjbG9zZSBmYWlsZWQgaW4gZmlsZSBvYmplY3QgZGVzdHJ1Y3RvcjpcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgfQorICAgIFB5TWVtX0ZyZWUoZi0+Zl9zZXRidWYpOworICAgIFB5X1hERUNSRUYoZi0+Zl9uYW1lKTsKKyAgICBQeV9YREVDUkVGKGYtPmZfbW9kZSk7CisgICAgUHlfWERFQ1JFRihmLT5mX2VuY29kaW5nKTsKKyAgICBQeV9YREVDUkVGKGYtPmZfZXJyb3JzKTsKKyAgICBkcm9wX3JlYWRhaGVhZChmKTsKKyAgICBQeV9UWVBFKGYpLT50cF9mcmVlKChQeU9iamVjdCAqKWYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9yZXByKFB5RmlsZU9iamVjdCAqZikKIHsKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGYtPmZfbmFtZSkpIHsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGYtPmZfbmFtZSkpIHsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCVB5T2JqZWN0ICpyZXQgPSBOVUxMOwotCQlQeU9iamVjdCAqbmFtZSA9IFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoZi0+Zl9uYW1lKTsKLQkJY29uc3QgY2hhciAqbmFtZV9zdHIgPSBuYW1lID8gUHlTdHJpbmdfQXNTdHJpbmcobmFtZSkgOiAiPyI7Ci0JCXJldCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBmaWxlIHUnJXMnLCBtb2RlICclcycgYXQgJXA+IiwKLQkJCQkgICBmLT5mX2ZwID09IE5VTEwgPyAiY2xvc2VkIiA6ICJvcGVuIiwKLQkJCQkgICBuYW1lX3N0ciwKLQkJCQkgICBQeVN0cmluZ19Bc1N0cmluZyhmLT5mX21vZGUpLAotCQkJCSAgIGYpOwotCQlQeV9YREVDUkVGKG5hbWUpOwotCQlyZXR1cm4gcmV0OworICAgICAgICBQeU9iamVjdCAqcmV0ID0gTlVMTDsKKyAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nKGYtPmZfbmFtZSk7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWVfc3RyID0gbmFtZSA/IFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpIDogIj8iOworICAgICAgICByZXQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgZmlsZSB1JyVzJywgbW9kZSAnJXMnIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2ZwID09IE5VTEwgPyAiY2xvc2VkIiA6ICJvcGVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoZi0+Zl9tb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGYpOworICAgICAgICBQeV9YREVDUkVGKG5hbWUpOworICAgICAgICByZXR1cm4gcmV0OwogI2VuZGlmCi0JfSBlbHNlIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBmaWxlICclcycsIG1vZGUgJyVzJyBhdCAlcD4iLAotCQkJCSAgIGYtPmZfZnAgPT0gTlVMTCA/ICJjbG9zZWQiIDogIm9wZW4iLAotCQkJCSAgIFB5U3RyaW5nX0FzU3RyaW5nKGYtPmZfbmFtZSksCi0JCQkJICAgUHlTdHJpbmdfQXNTdHJpbmcoZi0+Zl9tb2RlKSwKLQkJCQkgICBmKTsKLQl9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBmaWxlICclcycsIG1vZGUgJyVzJyBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9mcCA9PSBOVUxMID8gImNsb3NlZCIgOiAib3BlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhmLT5mX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoZi0+Zl9tb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGYpOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfY2xvc2UoUHlGaWxlT2JqZWN0ICpmKQogewotCVB5T2JqZWN0ICpzdHMgPSBjbG9zZV90aGVfZmlsZShmKTsKLQlQeU1lbV9GcmVlKGYtPmZfc2V0YnVmKTsKLQlmLT5mX3NldGJ1ZiA9IE5VTEw7Ci0JcmV0dXJuIHN0czsKKyAgICBQeU9iamVjdCAqc3RzID0gY2xvc2VfdGhlX2ZpbGUoZik7CisgICAgUHlNZW1fRnJlZShmLT5mX3NldGJ1Zik7CisgICAgZi0+Zl9zZXRidWYgPSBOVUxMOworICAgIHJldHVybiBzdHM7CiB9CiAKIApAQCAtNTkyLDM2ICs1OTIsMzYgQEAKIF9wb3J0YWJsZV9mc2VlayhGSUxFICpmcCwgUHlfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKQogewogI2lmICFkZWZpbmVkKEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQpCi0JcmV0dXJuIGZzZWVrKGZwLCBvZmZzZXQsIHdoZW5jZSk7CisgICAgcmV0dXJuIGZzZWVrKGZwLCBvZmZzZXQsIHdoZW5jZSk7CiAjZWxpZiBkZWZpbmVkKEhBVkVfRlNFRUtPKSAmJiBTSVpFT0ZfT0ZGX1QgPj0gOAotCXJldHVybiBmc2Vla28oZnAsIG9mZnNldCwgd2hlbmNlKTsKKyAgICByZXR1cm4gZnNlZWtvKGZwLCBvZmZzZXQsIHdoZW5jZSk7CiAjZWxpZiBkZWZpbmVkKEhBVkVfRlNFRUs2NCkKLQlyZXR1cm4gZnNlZWs2NChmcCwgb2Zmc2V0LCB3aGVuY2UpOworICAgIHJldHVybiBmc2VlazY0KGZwLCBvZmZzZXQsIHdoZW5jZSk7CiAjZWxpZiBkZWZpbmVkKF9fQkVPU19fKQotCXJldHVybiBfZnNlZWsoZnAsIG9mZnNldCwgd2hlbmNlKTsKKyAgICByZXR1cm4gX2ZzZWVrKGZwLCBvZmZzZXQsIHdoZW5jZSk7CiAjZWxpZiBTSVpFT0ZfRlBPU19UID49IDgKLQkvKiBsYWNraW5nIGEgNjQtYml0IGNhcGFibGUgZnNlZWsoKSwgdXNlIGEgNjQtYml0IGNhcGFibGUgZnNldHBvcygpCi0JICAgYW5kIGZnZXRwb3MoKSB0byBpbXBsZW1lbnQgZnNlZWsoKSovCi0JZnBvc190IHBvczsKLQlzd2l0Y2ggKHdoZW5jZSkgewotCWNhc2UgU0VFS19FTkQ6CisgICAgLyogbGFja2luZyBhIDY0LWJpdCBjYXBhYmxlIGZzZWVrKCksIHVzZSBhIDY0LWJpdCBjYXBhYmxlIGZzZXRwb3MoKQorICAgICAgIGFuZCBmZ2V0cG9zKCkgdG8gaW1wbGVtZW50IGZzZWVrKCkqLworICAgIGZwb3NfdCBwb3M7CisgICAgc3dpdGNoICh3aGVuY2UpIHsKKyAgICBjYXNlIFNFRUtfRU5EOgogI2lmZGVmIE1TX1dJTkRPV1MKLQkJZmZsdXNoKGZwKTsKLQkJaWYgKF9sc2Vla2k2NChmaWxlbm8oZnApLCAwLCAyKSA9PSAtMSkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgZmZsdXNoKGZwKTsKKyAgICAgICAgaWYgKF9sc2Vla2k2NChmaWxlbm8oZnApLCAwLCAyKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKICNlbHNlCi0JCWlmIChmc2VlayhmcCwgMCwgU0VFS19FTkQpICE9IDApCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGlmIChmc2VlayhmcCwgMCwgU0VFS19FTkQpICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAjZW5kaWYKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBTRUVLX0NVUjoKLQkJaWYgKGZnZXRwb3MoZnAsICZwb3MpICE9IDApCi0JCQlyZXR1cm4gLTE7Ci0JCW9mZnNldCArPSBwb3M7Ci0JCWJyZWFrOwotCS8qIGNhc2UgU0VFS19TRVQ6IGJyZWFrOyAqLwotCX0KLQlyZXR1cm4gZnNldHBvcyhmcCwgJm9mZnNldCk7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgU0VFS19DVVI6CisgICAgICAgIGlmIChmZ2V0cG9zKGZwLCAmcG9zKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBvZmZzZXQgKz0gcG9zOworICAgICAgICBicmVhazsKKyAgICAvKiBjYXNlIFNFRUtfU0VUOiBicmVhazsgKi8KKyAgICB9CisgICAgcmV0dXJuIGZzZXRwb3MoZnAsICZvZmZzZXQpOwogI2Vsc2UKICNlcnJvciAiTGFyZ2UgZmlsZSBzdXBwb3J0LCBidXQgbm8gd2F5IHRvIGZzZWVrLiIKICNlbmRpZgpAQCAtNjM1LDE2ICs2MzUsMTYgQEAKIF9wb3J0YWJsZV9mdGVsbChGSUxFKiBmcCkKIHsKICNpZiAhZGVmaW5lZChIQVZFX0xBUkdFRklMRV9TVVBQT1JUKQotCXJldHVybiBmdGVsbChmcCk7CisgICAgcmV0dXJuIGZ0ZWxsKGZwKTsKICNlbGlmIGRlZmluZWQoSEFWRV9GVEVMTE8pICYmIFNJWkVPRl9PRkZfVCA+PSA4Ci0JcmV0dXJuIGZ0ZWxsbyhmcCk7CisgICAgcmV0dXJuIGZ0ZWxsbyhmcCk7CiAjZWxpZiBkZWZpbmVkKEhBVkVfRlRFTEw2NCkKLQlyZXR1cm4gZnRlbGw2NChmcCk7CisgICAgcmV0dXJuIGZ0ZWxsNjQoZnApOwogI2VsaWYgU0laRU9GX0ZQT1NfVCA+PSA4Ci0JZnBvc190IHBvczsKLQlpZiAoZmdldHBvcyhmcCwgJnBvcykgIT0gMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiBwb3M7CisgICAgZnBvc190IHBvczsKKyAgICBpZiAoZmdldHBvcyhmcCwgJnBvcykgIT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBwb3M7CiAjZWxzZQogI2Vycm9yICJMYXJnZSBmaWxlIHN1cHBvcnQsIGJ1dCBubyB3YXkgdG8gZnRlbGwuIgogI2VuZGlmCkBAIC02NTQsNTMgKzY1NCw1MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfc2VlayhQeUZpbGVPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB3aGVuY2U7Ci0JaW50IHJldDsKLQlQeV9vZmZfdCBvZmZzZXQ7Ci0JUHlPYmplY3QgKm9mZm9iaiwgKm9mZl9pbmRleDsKKyAgICBpbnQgd2hlbmNlOworICAgIGludCByZXQ7CisgICAgUHlfb2ZmX3Qgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpvZmZvYmosICpvZmZfaW5kZXg7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWRyb3BfcmVhZGFoZWFkKGYpOwotCXdoZW5jZSA9IDA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6c2VlayIsICZvZmZvYmosICZ3aGVuY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlvZmZfaW5kZXggPSBQeU51bWJlcl9JbmRleChvZmZvYmopOwotCWlmICghb2ZmX2luZGV4KSB7Ci0JCWlmICghUHlGbG9hdF9DaGVjayhvZmZvYmopKQotCQkJcmV0dXJuIE5VTEw7Ci0JCS8qIERlcHJlY2F0ZWQgaW4gMi42ICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCWlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCSAiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IGZsb2F0IiwKLQkJCQkgMSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW9mZl9pbmRleCA9IG9mZm9iajsKLQkJUHlfSU5DUkVGKG9mZm9iaik7Ci0JfQorICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgZHJvcF9yZWFkYWhlYWQoZik7CisgICAgd2hlbmNlID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpzZWVrIiwgJm9mZm9iaiwgJndoZW5jZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9mZl9pbmRleCA9IFB5TnVtYmVyX0luZGV4KG9mZm9iaik7CisgICAgaWYgKCFvZmZfaW5kZXgpIHsKKyAgICAgICAgaWYgKCFQeUZsb2F0X0NoZWNrKG9mZm9iaikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgLyogRGVwcmVjYXRlZCBpbiAyLjYgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG9mZl9pbmRleCA9IG9mZm9iajsKKyAgICAgICAgUHlfSU5DUkVGKG9mZm9iaik7CisgICAgfQogI2lmICFkZWZpbmVkKEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQpCi0Jb2Zmc2V0ID0gUHlJbnRfQXNMb25nKG9mZl9pbmRleCk7CisgICAgb2Zmc2V0ID0gUHlJbnRfQXNMb25nKG9mZl9pbmRleCk7CiAjZWxzZQotCW9mZnNldCA9IFB5TG9uZ19DaGVjayhvZmZfaW5kZXgpID8KLQkJUHlMb25nX0FzTG9uZ0xvbmcob2ZmX2luZGV4KSA6IFB5SW50X0FzTG9uZyhvZmZfaW5kZXgpOworICAgIG9mZnNldCA9IFB5TG9uZ19DaGVjayhvZmZfaW5kZXgpID8KKyAgICAgICAgUHlMb25nX0FzTG9uZ0xvbmcob2ZmX2luZGV4KSA6IFB5SW50X0FzTG9uZyhvZmZfaW5kZXgpOwogI2VuZGlmCi0JUHlfREVDUkVGKG9mZl9pbmRleCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihvZmZfaW5kZXgpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotIAlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQllcnJubyA9IDA7Ci0JcmV0ID0gX3BvcnRhYmxlX2ZzZWVrKGYtPmZfZnAsIG9mZnNldCwgd2hlbmNlKTsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgZXJybm8gPSAwOworICAgIHJldCA9IF9wb3J0YWJsZV9mc2VlayhmLT5mX2ZwLCBvZmZzZXQsIHdoZW5jZSk7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQogCi0JaWYgKHJldCAhPSAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJY2xlYXJlcnIoZi0+Zl9mcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmLT5mX3NraXBuZXh0bGYgPSAwOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGYtPmZfc2tpcG5leHRsZiA9IDA7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKQEAgLTcwOCwxODYgKzcwOCwxODYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX3RydW5jYXRlKFB5RmlsZU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfb2ZmX3QgbmV3c2l6ZTsKLQlQeU9iamVjdCAqbmV3c2l6ZW9iaiA9IE5VTEw7Ci0JUHlfb2ZmX3QgaW5pdGlhbHBvczsKLQlpbnQgcmV0OworICAgIFB5X29mZl90IG5ld3NpemU7CisgICAgUHlPYmplY3QgKm5ld3NpemVvYmogPSBOVUxMOworICAgIFB5X29mZl90IGluaXRpYWxwb3M7CisgICAgaW50IHJldDsKIAotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JaWYgKCFmLT53cml0YWJsZSkKLQkJcmV0dXJuIGVycl9tb2RlKCJ3cml0aW5nIik7Ci0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJ1bmNhdGUiLCAwLCAxLCAmbmV3c2l6ZW9iaikpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgaWYgKCFmLT53cml0YWJsZSkKKyAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJ3cml0aW5nIik7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJ1bmNhdGUiLCAwLCAxLCAmbmV3c2l6ZW9iaikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogR2V0IGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4gIElmIHRoZSBmaWxlIGhhcHBlbnMgdG8gYmUgb3BlbiBmb3IKLQkgKiB1cGRhdGUgYW5kIHRoZSBsYXN0IG9wZXJhdGlvbiB3YXMgYW4gaW5wdXQgb3BlcmF0aW9uLCBDIGRvZXNuJ3QKLQkgKiBkZWZpbmUgd2hhdCB0aGUgbGF0ZXIgZmZsdXNoKCkgd2lsbCBkbywgYnV0IHdlIHByb21pc2UgdHJ1bmNhdGUoKQotCSAqIHdvbid0IGNoYW5nZSB0aGUgY3VycmVudCBwb3NpdGlvbiAoYW5kIGZmbHVzaCgpICpkb2VzKiBjaGFuZ2UgaXQKLQkgKiB0aGVuIGF0IGxlYXN0IG9uIFdpbmRvd3MpLiAgVGhlIGVhc2llc3QgdGhpbmcgaXMgdG8gY2FwdHVyZQotCSAqIGN1cnJlbnQgcG9zIG5vdyBhbmQgc2VlayBiYWNrIHRvIGl0IGF0IHRoZSBlbmQuCi0JICovCi0JRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JZXJybm8gPSAwOwotCWluaXRpYWxwb3MgPSBfcG9ydGFibGVfZnRlbGwoZi0+Zl9mcCk7Ci0JRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCWlmIChpbml0aWFscG9zID09IC0xKQotCQlnb3RvIG9uaW9lcnJvcjsKKyAgICAvKiBHZXQgY3VycmVudCBmaWxlIHBvc2l0aW9uLiAgSWYgdGhlIGZpbGUgaGFwcGVucyB0byBiZSBvcGVuIGZvcgorICAgICAqIHVwZGF0ZSBhbmQgdGhlIGxhc3Qgb3BlcmF0aW9uIHdhcyBhbiBpbnB1dCBvcGVyYXRpb24sIEMgZG9lc24ndAorICAgICAqIGRlZmluZSB3aGF0IHRoZSBsYXRlciBmZmx1c2goKSB3aWxsIGRvLCBidXQgd2UgcHJvbWlzZSB0cnVuY2F0ZSgpCisgICAgICogd29uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IHBvc2l0aW9uIChhbmQgZmZsdXNoKCkgKmRvZXMqIGNoYW5nZSBpdAorICAgICAqIHRoZW4gYXQgbGVhc3Qgb24gV2luZG93cykuICBUaGUgZWFzaWVzdCB0aGluZyBpcyB0byBjYXB0dXJlCisgICAgICogY3VycmVudCBwb3Mgbm93IGFuZCBzZWVrIGJhY2sgdG8gaXQgYXQgdGhlIGVuZC4KKyAgICAgKi8KKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICBlcnJubyA9IDA7CisgICAgaW5pdGlhbHBvcyA9IF9wb3J0YWJsZV9mdGVsbChmLT5mX2ZwKTsKKyAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgaWYgKGluaXRpYWxwb3MgPT0gLTEpCisgICAgICAgIGdvdG8gb25pb2Vycm9yOwogCi0JLyogU2V0IG5ld3NpemUgdG8gY3VycmVudCBwb3N0aW9uIGlmIG5ld3NpemVvYmogTlVMTCwgZWxzZSB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JaWYgKG5ld3NpemVvYmogIT0gTlVMTCkgeworICAgIC8qIFNldCBuZXdzaXplIHRvIGN1cnJlbnQgcG9zdGlvbiBpZiBuZXdzaXplb2JqIE5VTEwsIGVsc2UgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHZhbHVlLgorICAgICAqLworICAgIGlmIChuZXdzaXplb2JqICE9IE5VTEwpIHsKICNpZiAhZGVmaW5lZChIQVZFX0xBUkdFRklMRV9TVVBQT1JUKQotCQluZXdzaXplID0gUHlJbnRfQXNMb25nKG5ld3NpemVvYmopOworICAgICAgICBuZXdzaXplID0gUHlJbnRfQXNMb25nKG5ld3NpemVvYmopOwogI2Vsc2UKLQkJbmV3c2l6ZSA9IFB5TG9uZ19DaGVjayhuZXdzaXplb2JqKSA/Ci0JCQkJUHlMb25nX0FzTG9uZ0xvbmcobmV3c2l6ZW9iaikgOgotCQkJCVB5SW50X0FzTG9uZyhuZXdzaXplb2JqKTsKKyAgICAgICAgbmV3c2l6ZSA9IFB5TG9uZ19DaGVjayhuZXdzaXplb2JqKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBQeUxvbmdfQXNMb25nTG9uZyhuZXdzaXplb2JqKSA6CisgICAgICAgICAgICAgICAgUHlJbnRfQXNMb25nKG5ld3NpemVvYmopOwogI2VuZGlmCi0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgLyogZGVmYXVsdCB0byBjdXJyZW50IHBvc2l0aW9uICovCi0JCW5ld3NpemUgPSBpbml0aWFscG9zOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIC8qIGRlZmF1bHQgdG8gY3VycmVudCBwb3NpdGlvbiAqLworICAgICAgICBuZXdzaXplID0gaW5pdGlhbHBvczsKIAotCS8qIEZsdXNoIHRoZSBzdHJlYW0uICBXZSdyZSBtaXhpbmcgc3RyZWFtLWxldmVsIEkvTyB3aXRoIGxvd2VyLWxldmVsCi0JICogSS9PLCBhbmQgYSBmbHVzaCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHN5bmNoIGJvdGggcGxhdGZvcm0gdmlld3MKLQkgKiBvZiB0aGUgY3VycmVudCBmaWxlIHN0YXRlLgotCSAqLwotCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCWVycm5vID0gMDsKLQlyZXQgPSBmZmx1c2goZi0+Zl9mcCk7Ci0JRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCWlmIChyZXQgIT0gMCkKLQkJZ290byBvbmlvZXJyb3I7CisgICAgLyogRmx1c2ggdGhlIHN0cmVhbS4gIFdlJ3JlIG1peGluZyBzdHJlYW0tbGV2ZWwgSS9PIHdpdGggbG93ZXItbGV2ZWwKKyAgICAgKiBJL08sIGFuZCBhIGZsdXNoIG1heSBiZSBuZWNlc3NhcnkgdG8gc3luY2ggYm90aCBwbGF0Zm9ybSB2aWV3cworICAgICAqIG9mIHRoZSBjdXJyZW50IGZpbGUgc3RhdGUuCisgICAgICovCisgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgZXJybm8gPSAwOworICAgIHJldCA9IGZmbHVzaChmLT5mX2ZwKTsKKyAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgaWYgKHJldCAhPSAwKQorICAgICAgICBnb3RvIG9uaW9lcnJvcjsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQkvKiBNUyBfY2hzaXplIGRvZXNuJ3Qgd29yayBpZiBuZXdzaXplIGRvZXNuJ3QgZml0IGluIDMyIGJpdHMsCi0JICAgc28gZG9uJ3QgZXZlbiB0cnkgdXNpbmcgaXQuICovCi0JewotCQlIQU5ETEUgaEZpbGU7CisgICAgLyogTVMgX2Noc2l6ZSBkb2Vzbid0IHdvcmsgaWYgbmV3c2l6ZSBkb2Vzbid0IGZpdCBpbiAzMiBiaXRzLAorICAgICAgIHNvIGRvbid0IGV2ZW4gdHJ5IHVzaW5nIGl0LiAqLworICAgIHsKKyAgICAgICAgSEFORExFIGhGaWxlOwogCi0JCS8qIEhhdmUgdG8gbW92ZSBjdXJyZW50IHBvcyB0byBkZXNpcmVkIGVuZHBvaW50IG9uIFdpbmRvd3MuICovCi0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQllcnJubyA9IDA7Ci0JCXJldCA9IF9wb3J0YWJsZV9mc2VlayhmLT5mX2ZwLCBuZXdzaXplLCBTRUVLX1NFVCkgIT0gMDsKLQkJRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCQlpZiAocmV0KQotCQkJZ290byBvbmlvZXJyb3I7CisgICAgICAgIC8qIEhhdmUgdG8gbW92ZSBjdXJyZW50IHBvcyB0byBkZXNpcmVkIGVuZHBvaW50IG9uIFdpbmRvd3MuICovCisgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIHJldCA9IF9wb3J0YWJsZV9mc2VlayhmLT5mX2ZwLCBuZXdzaXplLCBTRUVLX1NFVCkgIT0gMDsKKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgZ290byBvbmlvZXJyb3I7CiAKLQkJLyogVHJ1bmNhdGUuICBOb3RlIHRoYXQgdGhpcyBtYXkgZ3JvdyB0aGUgZmlsZSEgKi8KLQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCWVycm5vID0gMDsKLQkJaEZpbGUgPSAoSEFORExFKV9nZXRfb3NmaGFuZGxlKGZpbGVubyhmLT5mX2ZwKSk7Ci0JCXJldCA9IGhGaWxlID09IChIQU5ETEUpLTE7Ci0JCWlmIChyZXQgPT0gMCkgewotCQkJcmV0ID0gU2V0RW5kT2ZGaWxlKGhGaWxlKSA9PSAwOwotCQkJaWYgKHJldCkKLQkJCQllcnJubyA9IEVBQ0NFUzsKLQkJfQotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JCWlmIChyZXQpCi0JCQlnb3RvIG9uaW9lcnJvcjsKLQl9CisgICAgICAgIC8qIFRydW5jYXRlLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGdyb3cgdGhlIGZpbGUhICovCisgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGhGaWxlID0gKEhBTkRMRSlfZ2V0X29zZmhhbmRsZShmaWxlbm8oZi0+Zl9mcCkpOworICAgICAgICByZXQgPSBoRmlsZSA9PSAoSEFORExFKS0xOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIHJldCA9IFNldEVuZE9mRmlsZShoRmlsZSkgPT0gMDsKKyAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgZXJybm8gPSBFQUNDRVM7CisgICAgICAgIH0KKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgZ290byBvbmlvZXJyb3I7CisgICAgfQogI2Vsc2UKLQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQllcnJubyA9IDA7Ci0JcmV0ID0gZnRydW5jYXRlKGZpbGVubyhmLT5mX2ZwKSwgbmV3c2l6ZSk7Ci0JRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCWlmIChyZXQgIT0gMCkKLQkJZ290byBvbmlvZXJyb3I7CisgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgZXJybm8gPSAwOworICAgIHJldCA9IGZ0cnVuY2F0ZShmaWxlbm8oZi0+Zl9mcCksIG5ld3NpemUpOworICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICBpZiAocmV0ICE9IDApCisgICAgICAgIGdvdG8gb25pb2Vycm9yOwogI2VuZGlmIC8qICFNU19XSU5ET1dTICovCiAKLQkvKiBSZXN0b3JlIG9yaWdpbmFsIGZpbGUgcG9zaXRpb24uICovCi0JRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JZXJybm8gPSAwOwotCXJldCA9IF9wb3J0YWJsZV9mc2VlayhmLT5mX2ZwLCBpbml0aWFscG9zLCBTRUVLX1NFVCkgIT0gMDsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JaWYgKHJldCkKLQkJZ290byBvbmlvZXJyb3I7CisgICAgLyogUmVzdG9yZSBvcmlnaW5hbCBmaWxlIHBvc2l0aW9uLiAqLworICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgIGVycm5vID0gMDsKKyAgICByZXQgPSBfcG9ydGFibGVfZnNlZWsoZi0+Zl9mcCwgaW5pdGlhbHBvcywgU0VFS19TRVQpICE9IDA7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIGlmIChyZXQpCisgICAgICAgIGdvdG8gb25pb2Vycm9yOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIAogb25pb2Vycm9yOgotCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQljbGVhcmVycihmLT5mX2ZwKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYgLyogSEFWRV9GVFJVTkNBVEUgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfdGVsbChQeUZpbGVPYmplY3QgKmYpCiB7Ci0JUHlfb2ZmX3QgcG9zOworICAgIFB5X29mZl90IHBvczsKIAotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JZXJybm8gPSAwOwotCXBvcyA9IF9wb3J0YWJsZV9mdGVsbChmLT5mX2ZwKTsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICBlcnJubyA9IDA7CisgICAgcG9zID0gX3BvcnRhYmxlX2Z0ZWxsKGYtPmZfZnApOworICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKIAotCWlmIChwb3MgPT0gLTEpIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChmLT5mX3NraXBuZXh0bGYpIHsKLQkJaW50IGM7Ci0JCWMgPSBHRVRDKGYtPmZfZnApOwotCQlpZiAoYyA9PSAnXG4nKSB7Ci0JCQlmLT5mX25ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7Ci0JCQlwb3MrKzsKLQkJCWYtPmZfc2tpcG5leHRsZiA9IDA7Ci0JCX0gZWxzZSBpZiAoYyAhPSBFT0YpIHVuZ2V0YyhjLCBmLT5mX2ZwKTsKLQl9CisgICAgaWYgKHBvcyA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGYtPmZfc2tpcG5leHRsZikgeworICAgICAgICBpbnQgYzsKKyAgICAgICAgYyA9IEdFVEMoZi0+Zl9mcCk7CisgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgIGYtPmZfbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1JMRjsKKyAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgZi0+Zl9za2lwbmV4dGxmID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChjICE9IEVPRikgdW5nZXRjKGMsIGYtPmZfZnApOworICAgIH0KICNpZiAhZGVmaW5lZChIQVZFX0xBUkdFRklMRV9TVVBQT1JUKQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhwb3MpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhwb3MpOwogI2Vsc2UKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyhwb3MpOworICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHBvcyk7CiAjZW5kaWYKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfZmlsZW5vKFB5RmlsZU9iamVjdCAqZikKIHsKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZmlsZW5vKGYtPmZfZnApKTsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgZmlsZW5vKGYtPmZfZnApKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfZmx1c2goUHlGaWxlT2JqZWN0ICpmKQogewotCWludCByZXM7CisgICAgaW50IHJlczsKIAotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JZXJybm8gPSAwOwotCXJlcyA9IGZmbHVzaChmLT5mX2ZwKTsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JaWYgKHJlcyAhPSAwKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJY2xlYXJlcnIoZi0+Zl9mcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICBlcnJubyA9IDA7CisgICAgcmVzID0gZmZsdXNoKGYtPmZfZnApOworICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfaXNhdHR5KFB5RmlsZU9iamVjdCAqZikKIHsKLQlsb25nIHJlczsKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCXJlcyA9IGlzYXR0eSgoaW50KWZpbGVubyhmLT5mX2ZwKSk7Ci0JRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzKTsKKyAgICBsb25nIHJlczsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgIHJlcyA9IGlzYXR0eSgoaW50KWZpbGVubyhmLT5mX2ZwKSk7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzKTsKIH0KIAogCkBAIC05MDcsMzkgKzkwNywzOSBAQAogbmV3X2J1ZmZlcnNpemUoUHlGaWxlT2JqZWN0ICpmLCBzaXplX3QgY3VycmVudHNpemUpCiB7CiAjaWZkZWYgSEFWRV9GU1RBVAotCW9mZl90IHBvcywgZW5kOwotCXN0cnVjdCBzdGF0IHN0OwotCWlmIChmc3RhdChmaWxlbm8oZi0+Zl9mcCksICZzdCkgPT0gMCkgewotCQllbmQgPSBzdC5zdF9zaXplOwotCQkvKiBUaGUgZm9sbG93aW5nIGlzIG5vdCBhIGJ1Zzogd2UgcmVhbGx5IG5lZWQgdG8gY2FsbCBsc2VlaygpCi0JCSAgICphbmQqIGZ0ZWxsKCkuICBUaGUgcmVhc29uIGlzIHRoYXQgc29tZSBzdGRpbyBsaWJyYXJpZXMKLQkJICAgbWlzdGFrZW5seSBmbHVzaCB0aGVpciBidWZmZXIgd2hlbiBmdGVsbCgpIGlzIGNhbGxlZCBhbmQKLQkJICAgdGhlIGxzZWVrKCkgY2FsbCBpdCBtYWtlcyBmYWlscywgdGhlcmVieSB0aHJvd2luZyBhd2F5Ci0JCSAgIGRhdGEgdGhhdCBjYW5ub3QgYmUgcmVjb3ZlcmVkIGluIGFueSB3YXkuICBUbyBhdm9pZCB0aGlzLAotCQkgICB3ZSBmaXJzdCB0ZXN0IGxzZWVrKCksIGFuZCBvbmx5IGNhbGwgZnRlbGwoKSBpZiBsc2VlaygpCi0JCSAgIHdvcmtzLiAgV2UgY2FuJ3QgdXNlIHRoZSBsc2VlaygpIHZhbHVlIGVpdGhlciwgYmVjYXVzZSB3ZQotCQkgICBuZWVkIHRvIHRha2UgdGhlIGFtb3VudCBvZiBidWZmZXJlZCBkYXRhIGludG8gYWNjb3VudC4KLQkJICAgKFlldCBhbm90aGVyIHJlYXNvbiB3aHkgc3RkaW8gc3RpbmtzLiA6LSkgKi8KLQkJcG9zID0gbHNlZWsoZmlsZW5vKGYtPmZfZnApLCAwTCwgU0VFS19DVVIpOwotCQlpZiAocG9zID49IDApIHsKLQkJCXBvcyA9IGZ0ZWxsKGYtPmZfZnApOwotCQl9Ci0JCWlmIChwb3MgPCAwKQotCQkJY2xlYXJlcnIoZi0+Zl9mcCk7Ci0JCWlmIChlbmQgPiBwb3MgJiYgcG9zID49IDApCi0JCQlyZXR1cm4gY3VycmVudHNpemUgKyBlbmQgLSBwb3MgKyAxOwotCQkvKiBBZGQgMSBzbyBpZiB0aGUgZmlsZSB3ZXJlIHRvIGdyb3cgd2UnZCBub3RpY2UuICovCi0JfQorICAgIG9mZl90IHBvcywgZW5kOworICAgIHN0cnVjdCBzdGF0IHN0OworICAgIGlmIChmc3RhdChmaWxlbm8oZi0+Zl9mcCksICZzdCkgPT0gMCkgeworICAgICAgICBlbmQgPSBzdC5zdF9zaXplOworICAgICAgICAvKiBUaGUgZm9sbG93aW5nIGlzIG5vdCBhIGJ1Zzogd2UgcmVhbGx5IG5lZWQgdG8gY2FsbCBsc2VlaygpCisgICAgICAgICAgICphbmQqIGZ0ZWxsKCkuICBUaGUgcmVhc29uIGlzIHRoYXQgc29tZSBzdGRpbyBsaWJyYXJpZXMKKyAgICAgICAgICAgbWlzdGFrZW5seSBmbHVzaCB0aGVpciBidWZmZXIgd2hlbiBmdGVsbCgpIGlzIGNhbGxlZCBhbmQKKyAgICAgICAgICAgdGhlIGxzZWVrKCkgY2FsbCBpdCBtYWtlcyBmYWlscywgdGhlcmVieSB0aHJvd2luZyBhd2F5CisgICAgICAgICAgIGRhdGEgdGhhdCBjYW5ub3QgYmUgcmVjb3ZlcmVkIGluIGFueSB3YXkuICBUbyBhdm9pZCB0aGlzLAorICAgICAgICAgICB3ZSBmaXJzdCB0ZXN0IGxzZWVrKCksIGFuZCBvbmx5IGNhbGwgZnRlbGwoKSBpZiBsc2VlaygpCisgICAgICAgICAgIHdvcmtzLiAgV2UgY2FuJ3QgdXNlIHRoZSBsc2VlaygpIHZhbHVlIGVpdGhlciwgYmVjYXVzZSB3ZQorICAgICAgICAgICBuZWVkIHRvIHRha2UgdGhlIGFtb3VudCBvZiBidWZmZXJlZCBkYXRhIGludG8gYWNjb3VudC4KKyAgICAgICAgICAgKFlldCBhbm90aGVyIHJlYXNvbiB3aHkgc3RkaW8gc3RpbmtzLiA6LSkgKi8KKyAgICAgICAgcG9zID0gbHNlZWsoZmlsZW5vKGYtPmZfZnApLCAwTCwgU0VFS19DVVIpOworICAgICAgICBpZiAocG9zID49IDApIHsKKyAgICAgICAgICAgIHBvcyA9IGZ0ZWxsKGYtPmZfZnApOworICAgICAgICB9CisgICAgICAgIGlmIChwb3MgPCAwKQorICAgICAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgIGlmIChlbmQgPiBwb3MgJiYgcG9zID49IDApCisgICAgICAgICAgICByZXR1cm4gY3VycmVudHNpemUgKyBlbmQgLSBwb3MgKyAxOworICAgICAgICAvKiBBZGQgMSBzbyBpZiB0aGUgZmlsZSB3ZXJlIHRvIGdyb3cgd2UnZCBub3RpY2UuICovCisgICAgfQogI2VuZGlmCi0JaWYgKGN1cnJlbnRzaXplID4gU01BTExDSFVOSykgewotCQkvKiBLZWVwIGRvdWJsaW5nIHVudGlsIHdlIHJlYWNoIEJJR0NIVU5LOwotCQkgICB0aGVuIGtlZXAgYWRkaW5nIEJJR0NIVU5LLiAqLwotCQlpZiAoY3VycmVudHNpemUgPD0gQklHQ0hVTkspCi0JCQlyZXR1cm4gY3VycmVudHNpemUgKyBjdXJyZW50c2l6ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGN1cnJlbnRzaXplICsgQklHQ0hVTks7Ci0JfQotCXJldHVybiBjdXJyZW50c2l6ZSArIFNNQUxMQ0hVTks7CisgICAgaWYgKGN1cnJlbnRzaXplID4gU01BTExDSFVOSykgeworICAgICAgICAvKiBLZWVwIGRvdWJsaW5nIHVudGlsIHdlIHJlYWNoIEJJR0NIVU5LOworICAgICAgICAgICB0aGVuIGtlZXAgYWRkaW5nIEJJR0NIVU5LLiAqLworICAgICAgICBpZiAoY3VycmVudHNpemUgPD0gQklHQ0hVTkspCisgICAgICAgICAgICByZXR1cm4gY3VycmVudHNpemUgKyBjdXJyZW50c2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRzaXplICsgQklHQ0hVTks7CisgICAgfQorICAgIHJldHVybiBjdXJyZW50c2l6ZSArIFNNQUxMQ0hVTks7CiB9CiAKICNpZiBkZWZpbmVkKEVXT1VMREJMT0NLKSAmJiBkZWZpbmVkKEVBR0FJTikgJiYgRVdPVUxEQkxPQ0sgIT0gRUFHQUlOCkBAIC05NTksMTE0ICs5NTksMTE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9yZWFkKFB5RmlsZU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBieXRlc3JlcXVlc3RlZCA9IC0xOwotCXNpemVfdCBieXRlc3JlYWQsIGJ1ZmZlcnNpemUsIGNodW5rc2l6ZTsKLQlQeU9iamVjdCAqdjsKKyAgICBsb25nIGJ5dGVzcmVxdWVzdGVkID0gLTE7CisgICAgc2l6ZV90IGJ5dGVzcmVhZCwgYnVmZmVyc2l6ZSwgY2h1bmtzaXplOworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlpZiAoIWYtPnJlYWRhYmxlKQotCQlyZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKLQkvKiByZWZ1c2UgdG8gbWl4IHdpdGggZi5uZXh0KCkgKi8KLQlpZiAoZi0+Zl9idWYgIT0gTlVMTCAmJgotCSAgICAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPiAwICYmCi0JICAgIGYtPmZfYnVmWzBdICE9ICdcMCcpCi0JCXJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bDpyZWFkIiwgJmJ5dGVzcmVxdWVzdGVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGJ5dGVzcmVxdWVzdGVkIDwgMCkKLQkJYnVmZmVyc2l6ZSA9IG5ld19idWZmZXJzaXplKGYsIChzaXplX3QpMCk7Ci0JZWxzZQotCQlidWZmZXJzaXplID0gYnl0ZXNyZXF1ZXN0ZWQ7Ci0JaWYgKGJ1ZmZlcnNpemUgPiBQWV9TU0laRV9UX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkicmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBpcyBtb3JlIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBidWZmZXJzaXplKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlieXRlc3JlYWQgPSAwOwotCWZvciAoOzspIHsKLQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCWVycm5vID0gMDsKLQkJY2h1bmtzaXplID0gUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKEJVRih2KSArIGJ5dGVzcmVhZCwKLQkJCSAgYnVmZmVyc2l6ZSAtIGJ5dGVzcmVhZCwgZi0+Zl9mcCwgKFB5T2JqZWN0ICopZik7Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQkJaWYgKGNodW5rc2l6ZSA9PSAwKSB7Ci0JCQlpZiAoIWZlcnJvcihmLT5mX2ZwKSkKLQkJCQlicmVhazsKLQkJCWNsZWFyZXJyKGYtPmZfZnApOwotCQkJLyogV2hlbiBpbiBub24tYmxvY2tpbmcgbW9kZSwgZGF0YSBzaG91bGRuJ3QKLQkJCSAqIGJlIGRpc2NhcmRlZCBpZiBhIGJsb2NraW5nIHNpZ25hbCB3YXMKLQkJCSAqIHJlY2VpdmVkLiBUaGF0IHdpbGwgYWxzbyBoYXBwZW4gaWYKLQkJCSAqIGNodW5rc2l6ZSAhPSAwLCBidXQgYnl0ZXNyZWFkIDwgYnVmZmVyc2l6ZS4gKi8KLQkJCWlmIChieXRlc3JlYWQgPiAwICYmIEJMT0NLRURfRVJSTk8oZXJybm8pKQotCQkJCWJyZWFrOwotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJYnl0ZXNyZWFkICs9IGNodW5rc2l6ZTsKLQkJaWYgKGJ5dGVzcmVhZCA8IGJ1ZmZlcnNpemUpIHsKLQkJCWNsZWFyZXJyKGYtPmZfZnApOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGJ5dGVzcmVxdWVzdGVkIDwgMCkgewotCQkJYnVmZmVyc2l6ZSA9IG5ld19idWZmZXJzaXplKGYsIGJ1ZmZlcnNpemUpOwotCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIGJ1ZmZlcnNpemUpIDwgMCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCS8qIEdvdCB3aGF0IHdhcyByZXF1ZXN0ZWQuICovCi0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoYnl0ZXNyZWFkICE9IGJ1ZmZlcnNpemUpCi0JCV9QeVN0cmluZ19SZXNpemUoJnYsIGJ5dGVzcmVhZCk7Ci0JcmV0dXJuIHY7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBpZiAoIWYtPnJlYWRhYmxlKQorICAgICAgICByZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKKyAgICAvKiByZWZ1c2UgdG8gbWl4IHdpdGggZi5uZXh0KCkgKi8KKyAgICBpZiAoZi0+Zl9idWYgIT0gTlVMTCAmJgorICAgICAgICAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPiAwICYmCisgICAgICAgIGYtPmZfYnVmWzBdICE9ICdcMCcpCisgICAgICAgIHJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bDpyZWFkIiwgJmJ5dGVzcmVxdWVzdGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGJ5dGVzcmVxdWVzdGVkIDwgMCkKKyAgICAgICAgYnVmZmVyc2l6ZSA9IG5ld19idWZmZXJzaXplKGYsIChzaXplX3QpMCk7CisgICAgZWxzZQorICAgICAgICBidWZmZXJzaXplID0gYnl0ZXNyZXF1ZXN0ZWQ7CisgICAgaWYgKGJ1ZmZlcnNpemUgPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAicmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBpcyBtb3JlIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBidWZmZXJzaXplKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBieXRlc3JlYWQgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgY2h1bmtzaXplID0gUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKEJVRih2KSArIGJ5dGVzcmVhZCwKKyAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNpemUgLSBieXRlc3JlYWQsIGYtPmZfZnAsIChQeU9iamVjdCAqKWYpOworICAgICAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgICAgIGlmIChjaHVua3NpemUgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFmZXJyb3IoZi0+Zl9mcCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgICAgIC8qIFdoZW4gaW4gbm9uLWJsb2NraW5nIG1vZGUsIGRhdGEgc2hvdWxkbid0CisgICAgICAgICAgICAgKiBiZSBkaXNjYXJkZWQgaWYgYSBibG9ja2luZyBzaWduYWwgd2FzCisgICAgICAgICAgICAgKiByZWNlaXZlZC4gVGhhdCB3aWxsIGFsc28gaGFwcGVuIGlmCisgICAgICAgICAgICAgKiBjaHVua3NpemUgIT0gMCwgYnV0IGJ5dGVzcmVhZCA8IGJ1ZmZlcnNpemUuICovCisgICAgICAgICAgICBpZiAoYnl0ZXNyZWFkID4gMCAmJiBCTE9DS0VEX0VSUk5PKGVycm5vKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGJ5dGVzcmVhZCArPSBjaHVua3NpemU7CisgICAgICAgIGlmIChieXRlc3JlYWQgPCBidWZmZXJzaXplKSB7CisgICAgICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlc3JlcXVlc3RlZCA8IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlcnNpemUgPSBuZXdfYnVmZmVyc2l6ZShmLCBidWZmZXJzaXplKTsKKyAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCBidWZmZXJzaXplKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBHb3Qgd2hhdCB3YXMgcmVxdWVzdGVkLiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ5dGVzcmVhZCAhPSBidWZmZXJzaXplKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZ2LCBieXRlc3JlYWQpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9yZWFkaW50byhQeUZpbGVPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnB0cjsKLQlQeV9zc2l6ZV90IG50b2RvOwotCVB5X3NzaXplX3QgbmRvbmUsIG5ub3c7Ci0JUHlfYnVmZmVyIHBidWY7CisgICAgY2hhciAqcHRyOworICAgIFB5X3NzaXplX3QgbnRvZG87CisgICAgUHlfc3NpemVfdCBuZG9uZSwgbm5vdzsKKyAgICBQeV9idWZmZXIgcGJ1ZjsKIAotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JaWYgKCFmLT5yZWFkYWJsZSkKLQkJcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7Ci0JLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCi0JaWYgKGYtPmZfYnVmICE9IE5VTEwgJiYKLQkgICAgKGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHIpID4gMCAmJgotCSAgICBmLT5mX2J1ZlswXSAhPSAnXDAnKQotCQlyZXR1cm4gZXJyX2l0ZXJidWZmZXJlZCgpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidyoiLCAmcGJ1ZikpCi0JCXJldHVybiBOVUxMOwotCXB0ciA9IHBidWYuYnVmOwotCW50b2RvID0gcGJ1Zi5sZW47Ci0JbmRvbmUgPSAwOwotCXdoaWxlIChudG9kbyA+IDApIHsKLQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCWVycm5vID0gMDsKLQkJbm5vdyA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZChwdHIrbmRvbmUsIG50b2RvLCBmLT5mX2ZwLAotCQkJCQkJKFB5T2JqZWN0ICopZik7Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQkJaWYgKG5ub3cgPT0gMCkgewotCQkJaWYgKCFmZXJyb3IoZi0+Zl9mcCkpCi0JCQkJYnJlYWs7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQljbGVhcmVycihmLT5mX2ZwKTsKLQkJCVB5QnVmZmVyX1JlbGVhc2UoJnBidWYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbmRvbmUgKz0gbm5vdzsKLQkJbnRvZG8gLT0gbm5vdzsKLQl9Ci0JUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KG5kb25lKTsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIGlmICghZi0+cmVhZGFibGUpCisgICAgICAgIHJldHVybiBlcnJfbW9kZSgicmVhZGluZyIpOworICAgIC8qIHJlZnVzZSB0byBtaXggd2l0aCBmLm5leHQoKSAqLworICAgIGlmIChmLT5mX2J1ZiAhPSBOVUxMICYmCisgICAgICAgIChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+IDAgJiYKKyAgICAgICAgZi0+Zl9idWZbMF0gIT0gJ1wwJykKKyAgICAgICAgcmV0dXJuIGVycl9pdGVyYnVmZmVyZWQoKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIncqIiwgJnBidWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSBwYnVmLmJ1ZjsKKyAgICBudG9kbyA9IHBidWYubGVuOworICAgIG5kb25lID0gMDsKKyAgICB3aGlsZSAobnRvZG8gPiAwKSB7CisgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIG5ub3cgPSBQeV9Vbml2ZXJzYWxOZXdsaW5lRnJlYWQocHRyK25kb25lLCBudG9kbywgZi0+Zl9mcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilmKTsKKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBpZiAobm5vdyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIWZlcnJvcihmLT5mX2ZwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBuZG9uZSArPSBubm93OworICAgICAgICBudG9kbyAtPSBubm93OworICAgIH0KKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobmRvbmUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwODgsOSArMTA4OCw5IEBACiAKIFJlcG9ydHMgZnJvbSBvdGhlciBwbGF0Zm9ybXMgb24gdGhpcyBtZXRob2QgdnMgZ2V0Y191bmxvY2tlZCAod2hpY2ggTVMgZG9lc24ndAogaGF2ZSk6Ci0JTGludXgJCWEgd2FzaAotCVNvbGFyaXMJCWEgd2FzaAotCVRydTY0IFVuaXgJZ2V0bGluZV92aWFfZmdldHMgc2lnbmlmaWNhbnRseSBmYXN0ZXIKKyAgICBMaW51eCAgICAgICAgICAgICAgIGEgd2FzaAorICAgIFNvbGFyaXMgICAgICAgICAgICAgYSB3YXNoCisgICAgVHJ1NjQgVW5peCAgICAgICAgICBnZXRsaW5lX3ZpYV9mZ2V0cyBzaWduaWZpY2FudGx5IGZhc3RlcgogCiBDQVVUSU9OOiAgVGhlIEMgc3RkIGlzbid0IGNsZWFyIGFib3V0IHRoaXM6ICBpbiB0aG9zZSBjYXNlcyB3aGVyZSBmZ2V0cwogd3JpdGVzIHNvbWV0aGluZyBpbnRvIHRoZSBidWZmZXIsIGNhbiBpdCB3cml0ZSBpbnRvIGFueSBwb3NpdGlvbiBiZXlvbmQgdGhlCkBAIC0xMTM3LDE1MSArMTEzNywxNTEgQEAKICAqLwogI2RlZmluZSBJTklUQlVGU0laRSAxMDAKICNkZWZpbmUgTUFYQlVGU0laRSAzMDAKLQljaGFyKiBwOwkvKiB0ZW1wICovCi0JY2hhciBidWZbTUFYQlVGU0laRV07Ci0JUHlPYmplY3QqIHY7CS8qIHRoZSBzdHJpbmcgb2JqZWN0IHJlc3VsdCAqLwotCWNoYXIqIHB2ZnJlZTsJLyogYWRkcmVzcyBvZiBuZXh0IGZyZWUgc2xvdCAqLwotCWNoYXIqIHB2ZW5kOyAgICAvKiBhZGRyZXNzIG9uZSBiZXlvbmQgbGFzdCBmcmVlIHNsb3QgKi8KLQlzaXplX3QgbmZyZWU7CS8qICMgb2YgZnJlZSBidWZmZXIgc2xvdHM7IHB2ZW5kLXB2ZnJlZSAqLwotCXNpemVfdCB0b3RhbF92X3NpemU7ICAvKiB0b3RhbCAjIG9mIHNsb3RzIGluIGJ1ZmZlciAqLwotCXNpemVfdCBpbmNyZW1lbnQ7CS8qIGFtb3VudCB0byBpbmNyZW1lbnQgdGhlIGJ1ZmZlciAqLwotCXNpemVfdCBwcmV2X3Zfc2l6ZTsKKyAgICBjaGFyKiBwOyAgICAgICAgICAgIC8qIHRlbXAgKi8KKyAgICBjaGFyIGJ1ZltNQVhCVUZTSVpFXTsKKyAgICBQeU9iamVjdCogdjsgICAgICAgIC8qIHRoZSBzdHJpbmcgb2JqZWN0IHJlc3VsdCAqLworICAgIGNoYXIqIHB2ZnJlZTsgICAgICAgLyogYWRkcmVzcyBvZiBuZXh0IGZyZWUgc2xvdCAqLworICAgIGNoYXIqIHB2ZW5kOyAgICAvKiBhZGRyZXNzIG9uZSBiZXlvbmQgbGFzdCBmcmVlIHNsb3QgKi8KKyAgICBzaXplX3QgbmZyZWU7ICAgICAgIC8qICMgb2YgZnJlZSBidWZmZXIgc2xvdHM7IHB2ZW5kLXB2ZnJlZSAqLworICAgIHNpemVfdCB0b3RhbF92X3NpemU7ICAvKiB0b3RhbCAjIG9mIHNsb3RzIGluIGJ1ZmZlciAqLworICAgIHNpemVfdCBpbmNyZW1lbnQ7ICAgICAgICAgICAvKiBhbW91bnQgdG8gaW5jcmVtZW50IHRoZSBidWZmZXIgKi8KKyAgICBzaXplX3QgcHJldl92X3NpemU7CiAKLQkvKiBPcHRpbWl6ZSBmb3Igbm9ybWFsIGNhc2U6ICBhdm9pZCBfUHlTdHJpbmdfUmVzaXplIGlmIGF0IGFsbAotCSAqIHBvc3NpYmxlIHZpYSBmaXJzdCByZWFkaW5nIGludG8gc3RhY2sgYnVmZmVyICJidWYiLgotCSAqLwotCXRvdGFsX3Zfc2l6ZSA9IElOSVRCVUZTSVpFOwkvKiBzdGFydCBzbWFsbCBhbmQgcHJheSAqLwotCXB2ZnJlZSA9IGJ1ZjsKLQlmb3IgKDs7KSB7Ci0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCQlwdmVuZCA9IGJ1ZiArIHRvdGFsX3Zfc2l6ZTsKLQkJbmZyZWUgPSBwdmVuZCAtIHB2ZnJlZTsKLQkJbWVtc2V0KHB2ZnJlZSwgJ1xuJywgbmZyZWUpOwotCQlhc3NlcnQobmZyZWUgPCBJTlRfTUFYKTsgLyogU2hvdWxkIGJlIGF0bW9zdCBNQVhCVUZTSVpFICovCi0JCXAgPSBmZ2V0cyhwdmZyZWUsIChpbnQpbmZyZWUsIGZwKTsKLQkJRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIC8qIE9wdGltaXplIGZvciBub3JtYWwgY2FzZTogIGF2b2lkIF9QeVN0cmluZ19SZXNpemUgaWYgYXQgYWxsCisgICAgICogcG9zc2libGUgdmlhIGZpcnN0IHJlYWRpbmcgaW50byBzdGFjayBidWZmZXIgImJ1ZiIuCisgICAgICovCisgICAgdG90YWxfdl9zaXplID0gSU5JVEJVRlNJWkU7ICAgICAgICAgLyogc3RhcnQgc21hbGwgYW5kIHByYXkgKi8KKyAgICBwdmZyZWUgPSBidWY7CisgICAgZm9yICg7OykgeworICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgcHZlbmQgPSBidWYgKyB0b3RhbF92X3NpemU7CisgICAgICAgIG5mcmVlID0gcHZlbmQgLSBwdmZyZWU7CisgICAgICAgIG1lbXNldChwdmZyZWUsICdcbicsIG5mcmVlKTsKKyAgICAgICAgYXNzZXJ0KG5mcmVlIDwgSU5UX01BWCk7IC8qIFNob3VsZCBiZSBhdG1vc3QgTUFYQlVGU0laRSAqLworICAgICAgICBwID0gZmdldHMocHZmcmVlLCAoaW50KW5mcmVlLCBmcCk7CisgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKIAotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQljbGVhcmVycihmcCk7Ci0JCQlpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBwdmZyZWUgLSBidWYpOwotCQkJcmV0dXJuIHY7Ci0JCX0KLQkJLyogZmdldHMgcmVhZCAqc29tZXRoaW5nKiAqLwotCQlwID0gbWVtY2hyKHB2ZnJlZSwgJ1xuJywgbmZyZWUpOwotCQlpZiAocCAhPSBOVUxMKSB7Ci0JCQkvKiBEaWQgdGhlIFxuIGNvbWUgZnJvbSBmZ2V0cyBvciBmcm9tIHVzPwotCQkJICogU2luY2UgZmdldHMgc3RvcHMgYXQgdGhlIGZpcnN0IFxuLCBhbmQgdGhlbiB3cml0ZXMKLQkJCSAqIFwwLCBpZiBpdCdzIGZyb20gZmdldHMgYSBcMCBtdXN0IGJlIG5leHQuICBCdXQgaWYKLQkJCSAqIHRoYXQncyBzbywgaXQgY291bGQgbm90IGhhdmUgY29tZSBmcm9tIHVzLCBzaW5jZQotCQkJICogdGhlIFxuJ3Mgd2UgZmlsbGVkIHRoZSBidWZmZXIgd2l0aCBoYXZlIG9ubHkgbW9yZQotCQkJICogXG4ncyB0byB0aGUgcmlnaHQuCi0JCQkgKi8KLQkJCWlmIChwKzEgPCBwdmVuZCAmJiAqKHArMSkgPT0gJ1wwJykgewotCQkJCS8qIEl0J3MgZnJvbSBmZ2V0czogIHdlIHdpbiEgIEluIHBhcnRpY3VsYXIsCi0JCQkJICogd2UgaGF2ZW4ndCBkb25lIGFueSBtYWxsb2NzIHlldCwgYW5kIGNhbgotCQkJCSAqIGJ1aWxkIHRoZSBmaW5hbCByZXN1bHQgb24gdGhlIGZpcnN0IHRyeS4KLQkJCQkgKi8KLQkJCQkrK3A7CS8qIGluY2x1ZGUgXG4gZnJvbSBmZ2V0cyAqLwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogTXVzdCBiZSBmcm9tIHVzOiAgZmdldHMgZGlkbid0IGZpbGwgdGhlCi0JCQkJICogYnVmZmVyIGFuZCBkaWRuJ3QgZmluZCBhIG5ld2xpbmUsIHNvIGl0Ci0JCQkJICogbXVzdCBiZSB0aGUgbGFzdCBhbmQgbmV3bGluZS1mcmVlIGxpbmUgb2YKLQkJCQkgKiB0aGUgZmlsZS4KLQkJCQkgKi8KLQkJCQlhc3NlcnQocCA+IHB2ZnJlZSAmJiAqKHAtMSkgPT0gJ1wwJyk7Ci0JCQkJLS1wOwkvKiBkb24ndCBpbmNsdWRlIFwwIGZyb20gZmdldHMgKi8KLQkJCX0KLQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIHAgLSBidWYpOwotCQkJcmV0dXJuIHY7Ci0JCX0KLQkJLyogeXVjazogIGZnZXRzIG92ZXJ3cm90ZSBhbGwgdGhlIG5ld2xpbmVzLCBpLmUuIHRoZSBlbnRpcmUKLQkJICogYnVmZmVyLiAgU28gdGhpcyBsaW5lIGlzbid0IG92ZXIgeWV0LCBvciBtYXliZSBpdCBpcyBidXQKLQkJICogd2UncmUgZXhhY3RseSBhdCBFT0YuICBJZiB3ZSBoYXZlbid0IGFscmVhZHksIHRyeSB1c2luZyB0aGUKLQkJICogcmVzdCBvZiB0aGUgc3RhY2sgYnVmZmVyLgotCQkgKi8KLQkJYXNzZXJ0KCoocHZlbmQtMSkgPT0gJ1wwJyk7Ci0JCWlmIChwdmZyZWUgPT0gYnVmKSB7Ci0JCQlwdmZyZWUgPSBwdmVuZCAtIDE7CS8qIG92ZXJ3cml0ZSB0cmFpbGluZyBudWxsICovCi0JCQl0b3RhbF92X3NpemUgPSBNQVhCVUZTSVpFOwotCQl9Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KKyAgICAgICAgaWYgKHAgPT0gTlVMTCkgeworICAgICAgICAgICAgY2xlYXJlcnIoZnApOworICAgICAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgcHZmcmVlIC0gYnVmKTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgICAgIC8qIGZnZXRzIHJlYWQgKnNvbWV0aGluZyogKi8KKyAgICAgICAgcCA9IG1lbWNocihwdmZyZWUsICdcbicsIG5mcmVlKTsKKyAgICAgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogRGlkIHRoZSBcbiBjb21lIGZyb20gZmdldHMgb3IgZnJvbSB1cz8KKyAgICAgICAgICAgICAqIFNpbmNlIGZnZXRzIHN0b3BzIGF0IHRoZSBmaXJzdCBcbiwgYW5kIHRoZW4gd3JpdGVzCisgICAgICAgICAgICAgKiBcMCwgaWYgaXQncyBmcm9tIGZnZXRzIGEgXDAgbXVzdCBiZSBuZXh0LiAgQnV0IGlmCisgICAgICAgICAgICAgKiB0aGF0J3Mgc28sIGl0IGNvdWxkIG5vdCBoYXZlIGNvbWUgZnJvbSB1cywgc2luY2UKKyAgICAgICAgICAgICAqIHRoZSBcbidzIHdlIGZpbGxlZCB0aGUgYnVmZmVyIHdpdGggaGF2ZSBvbmx5IG1vcmUKKyAgICAgICAgICAgICAqIFxuJ3MgdG8gdGhlIHJpZ2h0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocCsxIDwgcHZlbmQgJiYgKihwKzEpID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICAvKiBJdCdzIGZyb20gZmdldHM6ICB3ZSB3aW4hICBJbiBwYXJ0aWN1bGFyLAorICAgICAgICAgICAgICAgICAqIHdlIGhhdmVuJ3QgZG9uZSBhbnkgbWFsbG9jcyB5ZXQsIGFuZCBjYW4KKyAgICAgICAgICAgICAgICAgKiBidWlsZCB0aGUgZmluYWwgcmVzdWx0IG9uIHRoZSBmaXJzdCB0cnkuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgKytwOyAgICAgICAgICAgICAgICAgICAgLyogaW5jbHVkZSBcbiBmcm9tIGZnZXRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBNdXN0IGJlIGZyb20gdXM6ICBmZ2V0cyBkaWRuJ3QgZmlsbCB0aGUKKyAgICAgICAgICAgICAgICAgKiBidWZmZXIgYW5kIGRpZG4ndCBmaW5kIGEgbmV3bGluZSwgc28gaXQKKyAgICAgICAgICAgICAgICAgKiBtdXN0IGJlIHRoZSBsYXN0IGFuZCBuZXdsaW5lLWZyZWUgbGluZSBvZgorICAgICAgICAgICAgICAgICAqIHRoZSBmaWxlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGFzc2VydChwID4gcHZmcmVlICYmICoocC0xKSA9PSAnXDAnKTsKKyAgICAgICAgICAgICAgICAtLXA7ICAgICAgICAgICAgICAgICAgICAvKiBkb24ndCBpbmNsdWRlIFwwIGZyb20gZmdldHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWYsIHAgLSBidWYpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICAgICAgLyogeXVjazogIGZnZXRzIG92ZXJ3cm90ZSBhbGwgdGhlIG5ld2xpbmVzLCBpLmUuIHRoZSBlbnRpcmUKKyAgICAgICAgICogYnVmZmVyLiAgU28gdGhpcyBsaW5lIGlzbid0IG92ZXIgeWV0LCBvciBtYXliZSBpdCBpcyBidXQKKyAgICAgICAgICogd2UncmUgZXhhY3RseSBhdCBFT0YuICBJZiB3ZSBoYXZlbid0IGFscmVhZHksIHRyeSB1c2luZyB0aGUKKyAgICAgICAgICogcmVzdCBvZiB0aGUgc3RhY2sgYnVmZmVyLgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KCoocHZlbmQtMSkgPT0gJ1wwJyk7CisgICAgICAgIGlmIChwdmZyZWUgPT0gYnVmKSB7CisgICAgICAgICAgICBwdmZyZWUgPSBwdmVuZCAtIDE7ICAgICAgICAgICAgICAgICAvKiBvdmVyd3JpdGUgdHJhaWxpbmcgbnVsbCAqLworICAgICAgICAgICAgdG90YWxfdl9zaXplID0gTUFYQlVGU0laRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiAKLQkvKiBUaGUgc3RhY2sgYnVmZmVyIGlzbid0IGJpZyBlbm91Z2g7IG1hbGxvYyBhIHN0cmluZyBvYmplY3QgYW5kIHJlYWQKLQkgKiBpbnRvIGl0cyBidWZmZXIuCi0JICovCi0JdG90YWxfdl9zaXplID0gTUFYQlVGU0laRSA8PCAxOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopTlVMTCwgKGludCl0b3RhbF92X3NpemUpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiB2OwotCS8qIGNvcHkgb3ZlciBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgbGFzdCBudWxsIGJ5dGUgKi8KLQltZW1jcHkoQlVGKHYpLCBidWYsIE1BWEJVRlNJWkUtMSk7Ci0JcHZmcmVlID0gQlVGKHYpICsgTUFYQlVGU0laRSAtIDE7CisgICAgLyogVGhlIHN0YWNrIGJ1ZmZlciBpc24ndCBiaWcgZW5vdWdoOyBtYWxsb2MgYSBzdHJpbmcgb2JqZWN0IGFuZCByZWFkCisgICAgICogaW50byBpdHMgYnVmZmVyLgorICAgICAqLworICAgIHRvdGFsX3Zfc2l6ZSA9IE1BWEJVRlNJWkUgPDwgMTsKKyAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKU5VTEwsIChpbnQpdG90YWxfdl9zaXplKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gdjsKKyAgICAvKiBjb3B5IG92ZXIgZXZlcnl0aGluZyBleGNlcHQgdGhlIGxhc3QgbnVsbCBieXRlICovCisgICAgbWVtY3B5KEJVRih2KSwgYnVmLCBNQVhCVUZTSVpFLTEpOworICAgIHB2ZnJlZSA9IEJVRih2KSArIE1BWEJVRlNJWkUgLSAxOwogCi0JLyogS2VlcCByZWFkaW5nIHN0dWZmIGludG8gdjsgaWYgaXQgZXZlciBlbmRzIHN1Y2Nlc3NmdWxseSwgYnJlYWsKLQkgKiBhZnRlciBzZXR0aW5nIHAgb25lIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgVGhlIGNvZGUgaGVyZSBpcwotCSAqIHZlcnkgbXVjaCBsaWtlIHRoZSBjb2RlIGFib3ZlLCBleGNlcHQgcmVhZHMgaW50byB2J3MgYnVmZmVyOyBzZWUKLQkgKiB0aGUgY29kZSBhYm92ZSBmb3IgZGV0YWlsZWQgY29tbWVudHMgYWJvdXQgdGhlIGxvZ2ljLgotCSAqLwotCWZvciAoOzspIHsKLQkJRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JCXB2ZW5kID0gQlVGKHYpICsgdG90YWxfdl9zaXplOwotCQluZnJlZSA9IHB2ZW5kIC0gcHZmcmVlOwotCQltZW1zZXQocHZmcmVlLCAnXG4nLCBuZnJlZSk7Ci0JCWFzc2VydChuZnJlZSA8IElOVF9NQVgpOwotCQlwID0gZmdldHMocHZmcmVlLCAoaW50KW5mcmVlLCBmcCk7Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAvKiBLZWVwIHJlYWRpbmcgc3R1ZmYgaW50byB2OyBpZiBpdCBldmVyIGVuZHMgc3VjY2Vzc2Z1bGx5LCBicmVhaworICAgICAqIGFmdGVyIHNldHRpbmcgcCBvbmUgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGxpbmUuICBUaGUgY29kZSBoZXJlIGlzCisgICAgICogdmVyeSBtdWNoIGxpa2UgdGhlIGNvZGUgYWJvdmUsIGV4Y2VwdCByZWFkcyBpbnRvIHYncyBidWZmZXI7IHNlZQorICAgICAqIHRoZSBjb2RlIGFib3ZlIGZvciBkZXRhaWxlZCBjb21tZW50cyBhYm91dCB0aGUgbG9naWMuCisgICAgICovCisgICAgZm9yICg7OykgeworICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgcHZlbmQgPSBCVUYodikgKyB0b3RhbF92X3NpemU7CisgICAgICAgIG5mcmVlID0gcHZlbmQgLSBwdmZyZWU7CisgICAgICAgIG1lbXNldChwdmZyZWUsICdcbicsIG5mcmVlKTsKKyAgICAgICAgYXNzZXJ0KG5mcmVlIDwgSU5UX01BWCk7CisgICAgICAgIHAgPSBmZ2V0cyhwdmZyZWUsIChpbnQpbmZyZWUsIGZwKTsKKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQogCi0JCWlmIChwID09IE5VTEwpIHsKLQkJCWNsZWFyZXJyKGZwKTsKLQkJCWlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgewotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXAgPSBwdmZyZWU7Ci0JCQlicmVhazsKLQkJfQotCQlwID0gbWVtY2hyKHB2ZnJlZSwgJ1xuJywgbmZyZWUpOwotCQlpZiAocCAhPSBOVUxMKSB7Ci0JCQlpZiAocCsxIDwgcHZlbmQgJiYgKihwKzEpID09ICdcMCcpIHsKLQkJCQkvKiBcbiBjYW1lIGZyb20gZmdldHMgKi8KLQkJCQkrK3A7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiBcbiBjYW1lIGZyb20gdXM7IGxhc3QgbGluZSBvZiBmaWxlLCBubyBuZXdsaW5lICovCi0JCQlhc3NlcnQocCA+IHB2ZnJlZSAmJiAqKHAtMSkgPT0gJ1wwJyk7Ci0JCQktLXA7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBleHBhbmQgYnVmZmVyIGFuZCB0cnkgYWdhaW4gKi8KLQkJYXNzZXJ0KCoocHZlbmQtMSkgPT0gJ1wwJyk7Ci0JCWluY3JlbWVudCA9IHRvdGFsX3Zfc2l6ZSA+PiAyOwkvKiBtaWxkIGV4cG9uZW50aWFsIGdyb3d0aCAqLwotCQlwcmV2X3Zfc2l6ZSA9IHRvdGFsX3Zfc2l6ZTsKLQkJdG90YWxfdl9zaXplICs9IGluY3JlbWVudDsKLQkJLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCi0JCWlmICh0b3RhbF92X3NpemUgPD0gcHJldl92X3NpemUgfHwKLQkJICAgIHRvdGFsX3Zfc2l6ZSA+IFBZX1NTSVpFX1RfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSAgICAibGluZSBpcyBsb25nZXIgdGhhbiBhIFB5dGhvbiBzdHJpbmcgY2FuIGhvbGQiKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCAoaW50KXRvdGFsX3Zfc2l6ZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCS8qIG92ZXJ3cml0ZSB0aGUgdHJhaWxpbmcgbnVsbCBieXRlICovCi0JCXB2ZnJlZSA9IEJVRih2KSArIChwcmV2X3Zfc2l6ZSAtIDEpOwotCX0KLQlpZiAoQlVGKHYpICsgdG90YWxfdl9zaXplICE9IHApCi0JCV9QeVN0cmluZ19SZXNpemUoJnYsIHAgLSBCVUYodikpOwotCXJldHVybiB2OworICAgICAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgICAgICBjbGVhcmVycihmcCk7CisgICAgICAgICAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwID0gcHZmcmVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcCA9IG1lbWNocihwdmZyZWUsICdcbicsIG5mcmVlKTsKKyAgICAgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHArMSA8IHB2ZW5kICYmICoocCsxKSA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgLyogXG4gY2FtZSBmcm9tIGZnZXRzICovCisgICAgICAgICAgICAgICAgKytwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogXG4gY2FtZSBmcm9tIHVzOyBsYXN0IGxpbmUgb2YgZmlsZSwgbm8gbmV3bGluZSAqLworICAgICAgICAgICAgYXNzZXJ0KHAgPiBwdmZyZWUgJiYgKihwLTEpID09ICdcMCcpOworICAgICAgICAgICAgLS1wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogZXhwYW5kIGJ1ZmZlciBhbmQgdHJ5IGFnYWluICovCisgICAgICAgIGFzc2VydCgqKHB2ZW5kLTEpID09ICdcMCcpOworICAgICAgICBpbmNyZW1lbnQgPSB0b3RhbF92X3NpemUgPj4gMjsgICAgICAgICAgLyogbWlsZCBleHBvbmVudGlhbCBncm93dGggKi8KKyAgICAgICAgcHJldl92X3NpemUgPSB0b3RhbF92X3NpemU7CisgICAgICAgIHRvdGFsX3Zfc2l6ZSArPSBpbmNyZW1lbnQ7CisgICAgICAgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLworICAgICAgICBpZiAodG90YWxfdl9zaXplIDw9IHByZXZfdl9zaXplIHx8CisgICAgICAgICAgICB0b3RhbF92X3NpemUgPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgKGludCl0b3RhbF92X3NpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAvKiBvdmVyd3JpdGUgdGhlIHRyYWlsaW5nIG51bGwgYnl0ZSAqLworICAgICAgICBwdmZyZWUgPSBCVUYodikgKyAocHJldl92X3NpemUgLSAxKTsKKyAgICB9CisgICAgaWYgKEJVRih2KSArIHRvdGFsX3Zfc2l6ZSAhPSBwKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZ2LCBwIC0gQlVGKHYpKTsKKyAgICByZXR1cm4gdjsKICN1bmRlZiBJTklUQlVGU0laRQogI3VuZGVmIE1BWEJVRlNJWkUKIH0KLSNlbmRpZgkvKiBpZmRlZiBVU0VfRkdFVFNfSU5fR0VUTElORSAqLworI2VuZGlmICAvKiBpZmRlZiBVU0VfRkdFVFNfSU5fR0VUTElORSAqLwogCiAvKiBJbnRlcm5hbCByb3V0aW5lIHRvIGdldCBhIGxpbmUuCiAgICBTaXplIGFyZ3VtZW50IGludGVycHJldGF0aW9uOgpAQCAtMTI5MiwxMDUgKzEyOTIsMTA1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2xpbmUoUHlGaWxlT2JqZWN0ICpmLCBpbnQgbikKIHsKLQlGSUxFICpmcCA9IGYtPmZfZnA7Ci0JaW50IGM7Ci0JY2hhciAqYnVmLCAqZW5kOwotCXNpemVfdCB0b3RhbF92X3NpemU7CS8qIHRvdGFsICMgb2Ygc2xvdHMgaW4gYnVmZmVyICovCi0Jc2l6ZV90IHVzZWRfdl9zaXplOwkvKiAjIHVzZWQgc2xvdHMgaW4gYnVmZmVyICovCi0Jc2l6ZV90IGluY3JlbWVudDsgICAgICAgLyogYW1vdW50IHRvIGluY3JlbWVudCB0aGUgYnVmZmVyICovCi0JUHlPYmplY3QgKnY7Ci0JaW50IG5ld2xpbmV0eXBlcyA9IGYtPmZfbmV3bGluZXR5cGVzOwotCWludCBza2lwbmV4dGxmID0gZi0+Zl9za2lwbmV4dGxmOwotCWludCB1bml2X25ld2xpbmUgPSBmLT5mX3VuaXZfbmV3bGluZTsKKyAgICBGSUxFICpmcCA9IGYtPmZfZnA7CisgICAgaW50IGM7CisgICAgY2hhciAqYnVmLCAqZW5kOworICAgIHNpemVfdCB0b3RhbF92X3NpemU7ICAgICAgICAvKiB0b3RhbCAjIG9mIHNsb3RzIGluIGJ1ZmZlciAqLworICAgIHNpemVfdCB1c2VkX3Zfc2l6ZTsgICAgICAgICAvKiAjIHVzZWQgc2xvdHMgaW4gYnVmZmVyICovCisgICAgc2l6ZV90IGluY3JlbWVudDsgICAgICAgLyogYW1vdW50IHRvIGluY3JlbWVudCB0aGUgYnVmZmVyICovCisgICAgUHlPYmplY3QgKnY7CisgICAgaW50IG5ld2xpbmV0eXBlcyA9IGYtPmZfbmV3bGluZXR5cGVzOworICAgIGludCBza2lwbmV4dGxmID0gZi0+Zl9za2lwbmV4dGxmOworICAgIGludCB1bml2X25ld2xpbmUgPSBmLT5mX3VuaXZfbmV3bGluZTsKIAogI2lmIGRlZmluZWQoVVNFX0ZHRVRTX0lOX0dFVExJTkUpCi0JaWYgKG4gPD0gMCAmJiAhdW5pdl9uZXdsaW5lICkKLQkJcmV0dXJuIGdldGxpbmVfdmlhX2ZnZXRzKGYsIGZwKTsKKyAgICBpZiAobiA8PSAwICYmICF1bml2X25ld2xpbmUgKQorICAgICAgICByZXR1cm4gZ2V0bGluZV92aWFfZmdldHMoZiwgZnApOwogI2VuZGlmCi0JdG90YWxfdl9zaXplID0gbiA+IDAgPyBuIDogMTAwOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHRvdGFsX3Zfc2l6ZSk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYnVmID0gQlVGKHYpOwotCWVuZCA9IGJ1ZiArIHRvdGFsX3Zfc2l6ZTsKKyAgICB0b3RhbF92X3NpemUgPSBuID4gMCA/IG4gOiAxMDA7CisgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgdG90YWxfdl9zaXplKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBidWYgPSBCVUYodik7CisgICAgZW5kID0gYnVmICsgdG90YWxfdl9zaXplOwogCi0JZm9yICg7OykgewotCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJRkxPQ0tGSUxFKGZwKTsKLQkJaWYgKHVuaXZfbmV3bGluZSkgewotCQkJYyA9ICd4JzsgLyogU2h1dCB1cCBnY2Mgd2FybmluZyAqLwotCQkJd2hpbGUgKCBidWYgIT0gZW5kICYmIChjID0gR0VUQyhmcCkpICE9IEVPRiApIHsKLQkJCQlpZiAoc2tpcG5leHRsZiApIHsKLQkJCQkJc2tpcG5leHRsZiA9IDA7Ci0JCQkJCWlmIChjID09ICdcbicpIHsKLQkJCQkJCS8qIFNlZWluZyBhIFxuIGhlcmUgd2l0aAotCQkJCQkJICogc2tpcG5leHRsZiB0cnVlIG1lYW5zIHdlCi0JCQkJCQkgKiBzYXcgYSBcciBiZWZvcmUuCi0JCQkJCQkgKi8KLQkJCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7Ci0JCQkJCQljID0gR0VUQyhmcCk7Ci0JCQkJCQlpZiAoYyA9PSBFT0YpIGJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGMgPT0gJ1xyJykgewotCQkJCQlza2lwbmV4dGxmID0gMTsKLQkJCQkJYyA9ICdcbic7Ci0JCQkJfSBlbHNlIGlmICggYyA9PSAnXG4nKQotCQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9MRjsKLQkJCQkqYnVmKysgPSBjOwotCQkJCWlmIChjID09ICdcbicpIGJyZWFrOwotCQkJfQotCQkJaWYgKCBjID09IEVPRiAmJiBza2lwbmV4dGxmICkKLQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKLQkJfSBlbHNlIC8qIElmIG5vdCB1bml2ZXJzYWwgbmV3bGluZXMgdXNlIHRoZSBub3JtYWwgbG9vcCAqLwotCQl3aGlsZSAoKGMgPSBHRVRDKGZwKSkgIT0gRU9GICYmCi0JCSAgICAgICAoKmJ1ZisrID0gYykgIT0gJ1xuJyAmJgotCQkJYnVmICE9IGVuZCkKLQkJCTsKLQkJRlVOTE9DS0ZJTEUoZnApOwotCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JCWYtPmZfbmV3bGluZXR5cGVzID0gbmV3bGluZXR5cGVzOwotCQlmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOwotCQlpZiAoYyA9PSAnXG4nKQotCQkJYnJlYWs7Ci0JCWlmIChjID09IEVPRikgewotCQkJaWYgKGZlcnJvcihmcCkpIHsKLQkJCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQkJY2xlYXJlcnIoZnApOwotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWNsZWFyZXJyKGZwKTsKLQkJCWlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgewotCQkJCVB5X0RFQ1JFRih2KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCS8qIE11c3QgYmUgYmVjYXVzZSBidWYgPT0gZW5kICovCi0JCWlmIChuID4gMCkKLQkJCWJyZWFrOwotCQl1c2VkX3Zfc2l6ZSA9IHRvdGFsX3Zfc2l6ZTsKLQkJaW5jcmVtZW50ID0gdG90YWxfdl9zaXplID4+IDI7IC8qIG1pbGQgZXhwb25lbnRpYWwgZ3Jvd3RoICovCi0JCXRvdGFsX3Zfc2l6ZSArPSBpbmNyZW1lbnQ7Ci0JCWlmICh0b3RhbF92X3NpemUgPiBQWV9TU0laRV9UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdG90YWxfdl9zaXplKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJYnVmID0gQlVGKHYpICsgdXNlZF92X3NpemU7Ci0JCWVuZCA9IEJVRih2KSArIHRvdGFsX3Zfc2l6ZTsKLQl9CisgICAgZm9yICg7OykgeworICAgICAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgRkxPQ0tGSUxFKGZwKTsKKyAgICAgICAgaWYgKHVuaXZfbmV3bGluZSkgeworICAgICAgICAgICAgYyA9ICd4JzsgLyogU2h1dCB1cCBnY2Mgd2FybmluZyAqLworICAgICAgICAgICAgd2hpbGUgKCBidWYgIT0gZW5kICYmIChjID0gR0VUQyhmcCkpICE9IEVPRiApIHsKKyAgICAgICAgICAgICAgICBpZiAoc2tpcG5leHRsZiApIHsKKyAgICAgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZWluZyBhIFxuIGhlcmUgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICogc2tpcG5leHRsZiB0cnVlIG1lYW5zIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzYXcgYSBcciBiZWZvcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gR0VUQyhmcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSBFT0YpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgICAgICBza2lwbmV4dGxmID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYyA9ICdcbic7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9MRjsKKyAgICAgICAgICAgICAgICAqYnVmKysgPSBjOworICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBjID09IEVPRiAmJiBza2lwbmV4dGxmICkKKyAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgfSBlbHNlIC8qIElmIG5vdCB1bml2ZXJzYWwgbmV3bGluZXMgdXNlIHRoZSBub3JtYWwgbG9vcCAqLworICAgICAgICB3aGlsZSAoKGMgPSBHRVRDKGZwKSkgIT0gRU9GICYmCisgICAgICAgICAgICAgICAoKmJ1ZisrID0gYykgIT0gJ1xuJyAmJgorICAgICAgICAgICAgYnVmICE9IGVuZCkKKyAgICAgICAgICAgIDsKKyAgICAgICAgRlVOTE9DS0ZJTEUoZnApOworICAgICAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgICAgIGYtPmZfbmV3bGluZXR5cGVzID0gbmV3bGluZXR5cGVzOworICAgICAgICBmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOworICAgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChjID09IEVPRikgeworICAgICAgICAgICAgaWYgKGZlcnJvcihmcCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICAgICAgY2xlYXJlcnIoZnApOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFyZXJyKGZwKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8qIE11c3QgYmUgYmVjYXVzZSBidWYgPT0gZW5kICovCisgICAgICAgIGlmIChuID4gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB1c2VkX3Zfc2l6ZSA9IHRvdGFsX3Zfc2l6ZTsKKyAgICAgICAgaW5jcmVtZW50ID0gdG90YWxfdl9zaXplID4+IDI7IC8qIG1pbGQgZXhwb25lbnRpYWwgZ3Jvd3RoICovCisgICAgICAgIHRvdGFsX3Zfc2l6ZSArPSBpbmNyZW1lbnQ7CisgICAgICAgIGlmICh0b3RhbF92X3NpemUgPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdG90YWxfdl9zaXplKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYnVmID0gQlVGKHYpICsgdXNlZF92X3NpemU7CisgICAgICAgIGVuZCA9IEJVRih2KSArIHRvdGFsX3Zfc2l6ZTsKKyAgICB9CiAKLQl1c2VkX3Zfc2l6ZSA9IGJ1ZiAtIEJVRih2KTsKLQlpZiAodXNlZF92X3NpemUgIT0gdG90YWxfdl9zaXplKQotCQlfUHlTdHJpbmdfUmVzaXplKCZ2LCB1c2VkX3Zfc2l6ZSk7Ci0JcmV0dXJuIHY7CisgICAgdXNlZF92X3NpemUgPSBidWYgLSBCVUYodik7CisgICAgaWYgKHVzZWRfdl9zaXplICE9IHRvdGFsX3Zfc2l6ZSkKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgdXNlZF92X3NpemUpOworICAgIHJldHVybiB2OwogfQogCiAvKiBFeHRlcm5hbCBDIGludGVyZmFjZSAqLwpAQCAtMTM5OCw5NiArMTM5OCw5NiBAQAogUHlPYmplY3QgKgogUHlGaWxlX0dldExpbmUoUHlPYmplY3QgKmYsIGludCBuKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChmID09IE5VTEwpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoUHlGaWxlX0NoZWNrKGYpKSB7Ci0JCVB5RmlsZU9iamVjdCAqZm8gPSAoUHlGaWxlT2JqZWN0ICopZjsKLQkJaWYgKGZvLT5mX2ZwID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCQlpZiAoIWZvLT5yZWFkYWJsZSkKLQkJCXJldHVybiBlcnJfbW9kZSgicmVhZGluZyIpOwotCQkvKiByZWZ1c2UgdG8gbWl4IHdpdGggZi5uZXh0KCkgKi8KLQkJaWYgKGZvLT5mX2J1ZiAhPSBOVUxMICYmCi0JCSAgICAoZm8tPmZfYnVmZW5kIC0gZm8tPmZfYnVmcHRyKSA+IDAgJiYKLQkJICAgIGZvLT5mX2J1ZlswXSAhPSAnXDAnKQotCQkJcmV0dXJuIGVycl9pdGVyYnVmZmVyZWQoKTsKLQkJcmVzdWx0ID0gZ2V0X2xpbmUoZm8sIG4pOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3QgKnJlYWRlcjsKLQkJUHlPYmplY3QgKmFyZ3M7CisgICAgaWYgKFB5RmlsZV9DaGVjayhmKSkgeworICAgICAgICBQeUZpbGVPYmplY3QgKmZvID0gKFB5RmlsZU9iamVjdCAqKWY7CisgICAgICAgIGlmIChmby0+Zl9mcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICAgICAgaWYgKCFmby0+cmVhZGFibGUpCisgICAgICAgICAgICByZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKKyAgICAgICAgLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCisgICAgICAgIGlmIChmby0+Zl9idWYgIT0gTlVMTCAmJgorICAgICAgICAgICAgKGZvLT5mX2J1ZmVuZCAtIGZvLT5mX2J1ZnB0cikgPiAwICYmCisgICAgICAgICAgICBmby0+Zl9idWZbMF0gIT0gJ1wwJykKKyAgICAgICAgICAgIHJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7CisgICAgICAgIHJlc3VsdCA9IGdldF9saW5lKGZvLCBuKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpyZWFkZXI7CisgICAgICAgIFB5T2JqZWN0ICphcmdzOwogCi0JCXJlYWRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZiwgInJlYWRsaW5lIik7Ci0JCWlmIChyZWFkZXIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAobiA8PSAwKQotCQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOwotCQllbHNlCi0JCQlhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKGkpIiwgbik7Ci0JCWlmIChhcmdzID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZWFkZXIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QocmVhZGVyLCBhcmdzKTsKLQkJUHlfREVDUkVGKHJlYWRlcik7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQkJaWYgKHJlc3VsdCAhPSBOVUxMICYmICFQeVN0cmluZ19DaGVjayhyZXN1bHQpICYmCi0JCSAgICAhUHlVbmljb2RlX0NoZWNrKHJlc3VsdCkpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmVzdWx0ID0gTlVMTDsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgIm9iamVjdC5yZWFkbGluZSgpIHJldHVybmVkIG5vbi1zdHJpbmciKTsKLQkJfQotCX0KKyAgICAgICAgcmVhZGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmLCAicmVhZGxpbmUiKTsKKyAgICAgICAgaWYgKHJlYWRlciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChuIDw9IDApCisgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoaSkiLCBuKTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChyZWFkZXIsIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYocmVhZGVyKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwgJiYgIVB5U3RyaW5nX0NoZWNrKHJlc3VsdCkgJiYKKyAgICAgICAgICAgICFQeVVuaWNvZGVfQ2hlY2socmVzdWx0KSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdC5yZWFkbGluZSgpIHJldHVybmVkIG5vbi1zdHJpbmciKTsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChuIDwgMCAmJiByZXN1bHQgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhyZXN1bHQpKSB7Ci0JCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKLQkJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShyZXN1bHQpOwotCQlpZiAobGVuID09IDApIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmVzdWx0ID0gTlVMTDsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkJIkVPRiB3aGVuIHJlYWRpbmcgYSBsaW5lIik7Ci0JCX0KLQkJZWxzZSBpZiAoc1tsZW4tMV0gPT0gJ1xuJykgewotCQkJaWYgKHJlc3VsdC0+b2JfcmVmY250ID09IDEpCi0JCQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBsZW4tMSk7Ci0JCQllbHNlIHsKLQkJCQlQeU9iamVjdCAqdjsKLQkJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuLTEpOwotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJlc3VsdCA9IHY7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKG4gPCAwICYmIHJlc3VsdCAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKHJlc3VsdCkpIHsKKyAgICAgICAgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOworICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHJlc3VsdCk7CisgICAgICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFT0Ygd2hlbiByZWFkaW5nIGEgbGluZSIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNbbGVuLTFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQtPm9iX3JlZmNudCA9PSAxKQorICAgICAgICAgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgbGVuLTEpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgICAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbi0xKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAobiA8IDAgJiYgcmVzdWx0ICE9IE5VTEwgJiYgUHlVbmljb2RlX0NoZWNrKHJlc3VsdCkpIHsKLQkJUHlfVU5JQ09ERSAqcyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdCk7Ci0JCVB5X3NzaXplX3QgbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKHJlc3VsdCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXN1bHQgPSBOVUxMOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHdoZW4gcmVhZGluZyBhIGxpbmUiKTsKLQkJfQotCQllbHNlIGlmIChzW2xlbi0xXSA9PSAnXG4nKSB7Ci0JCQlpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkKLQkJCQlQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIGxlbi0xKTsKLQkJCWVsc2UgewotCQkJCVB5T2JqZWN0ICp2OwotCQkJCXYgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUocywgbGVuLTEpOwotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJlc3VsdCA9IHY7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKG4gPCAwICYmIHJlc3VsdCAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayhyZXN1bHQpKSB7CisgICAgICAgIFB5X1VOSUNPREUgKnMgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpOworICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5VW5pY29kZV9HRVRfU0laRShyZXN1bHQpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRU9GIHdoZW4gcmVhZGluZyBhIGxpbmUiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzW2xlbi0xXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0LT5vYl9yZWZjbnQgPT0gMSkKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUmVzaXplKCZyZXN1bHQsIGxlbi0xKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICAgICAgICAgIHYgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUocywgbGVuLTEpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFB5dGhvbiBtZXRob2QgKi8KQEAgLTE0OTUsMzQxICsxNDk1LDM0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfcmVhZGxpbmUoUHlGaWxlT2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbiA9IC0xOworICAgIGludCBuID0gLTE7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWlmICghZi0+cmVhZGFibGUpCi0JCXJldHVybiBlcnJfbW9kZSgicmVhZGluZyIpOwotCS8qIHJlZnVzZSB0byBtaXggd2l0aCBmLm5leHQoKSAqLwotCWlmIChmLT5mX2J1ZiAhPSBOVUxMICYmCi0JICAgIChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+IDAgJiYKLQkgICAgZi0+Zl9idWZbMF0gIT0gJ1wwJykKLQkJcmV0dXJuIGVycl9pdGVyYnVmZmVyZWQoKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWRsaW5lIiwgJm4pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobiA9PSAwKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JaWYgKG4gPCAwKQotCQluID0gMDsKLQlyZXR1cm4gZ2V0X2xpbmUoZiwgbik7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBpZiAoIWYtPnJlYWRhYmxlKQorICAgICAgICByZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKKyAgICAvKiByZWZ1c2UgdG8gbWl4IHdpdGggZi5uZXh0KCkgKi8KKyAgICBpZiAoZi0+Zl9idWYgIT0gTlVMTCAmJgorICAgICAgICAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPiAwICYmCisgICAgICAgIGYtPmZfYnVmWzBdICE9ICdcMCcpCisgICAgICAgIHJldHVybiBlcnJfaXRlcmJ1ZmZlcmVkKCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpyZWFkbGluZSIsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgbiA9IDA7CisgICAgcmV0dXJuIGdldF9saW5lKGYsIG4pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV9yZWFkbGluZXMoUHlGaWxlT2JqZWN0ICpmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIHNpemVoaW50ID0gMDsKLQlQeU9iamVjdCAqbGlzdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmxpbmU7Ci0JY2hhciBzbWFsbF9idWZmZXJbU01BTExDSFVOS107Ci0JY2hhciAqYnVmZmVyID0gc21hbGxfYnVmZmVyOwotCXNpemVfdCBidWZmZXJzaXplID0gU01BTExDSFVOSzsKLQlQeU9iamVjdCAqYmlnX2J1ZmZlciA9IE5VTEw7Ci0Jc2l6ZV90IG5maWxsZWQgPSAwOwotCXNpemVfdCBucmVhZDsKLQlzaXplX3QgdG90YWxyZWFkID0gMDsKLQljaGFyICpwLCAqcSwgKmVuZDsKLQlpbnQgZXJyOwotCWludCBzaG9ydHJlYWQgPSAwOworICAgIGxvbmcgc2l6ZWhpbnQgPSAwOworICAgIFB5T2JqZWN0ICpsaXN0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbGluZTsKKyAgICBjaGFyIHNtYWxsX2J1ZmZlcltTTUFMTENIVU5LXTsKKyAgICBjaGFyICpidWZmZXIgPSBzbWFsbF9idWZmZXI7CisgICAgc2l6ZV90IGJ1ZmZlcnNpemUgPSBTTUFMTENIVU5LOworICAgIFB5T2JqZWN0ICpiaWdfYnVmZmVyID0gTlVMTDsKKyAgICBzaXplX3QgbmZpbGxlZCA9IDA7CisgICAgc2l6ZV90IG5yZWFkOworICAgIHNpemVfdCB0b3RhbHJlYWQgPSAwOworICAgIGNoYXIgKnAsICpxLCAqZW5kOworICAgIGludCBlcnI7CisgICAgaW50IHNob3J0cmVhZCA9IDA7CiAKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWlmICghZi0+cmVhZGFibGUpCi0JCXJldHVybiBlcnJfbW9kZSgicmVhZGluZyIpOwotCS8qIHJlZnVzZSB0byBtaXggd2l0aCBmLm5leHQoKSAqLwotCWlmIChmLT5mX2J1ZiAhPSBOVUxMICYmCi0JICAgIChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+IDAgJiYKLQkgICAgZi0+Zl9idWZbMF0gIT0gJ1wwJykKLQkJcmV0dXJuIGVycl9pdGVyYnVmZmVyZWQoKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxsOnJlYWRsaW5lcyIsICZzaXplaGludCkpCi0JCXJldHVybiBOVUxMOwotCWlmICgobGlzdCA9IFB5TGlzdF9OZXcoMCkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoOzspIHsKLQkJaWYgKHNob3J0cmVhZCkKLQkJCW5yZWFkID0gMDsKLQkJZWxzZSB7Ci0JCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJCWVycm5vID0gMDsKLQkJCW5yZWFkID0gUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKGJ1ZmZlcituZmlsbGVkLAotCQkJCWJ1ZmZlcnNpemUtbmZpbGxlZCwgZi0+Zl9mcCwgKFB5T2JqZWN0ICopZik7Ci0JCQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JCQlzaG9ydHJlYWQgPSAobnJlYWQgPCBidWZmZXJzaXplLW5maWxsZWQpOwotCQl9Ci0JCWlmIChucmVhZCA9PSAwKSB7Ci0JCQlzaXplaGludCA9IDA7Ci0JCQlpZiAoIWZlcnJvcihmLT5mX2ZwKSkKLQkJCQlicmVhazsKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQkJCWNsZWFyZXJyKGYtPmZfZnApOwotCQkJZ290byBlcnJvcjsKLQkJfQotCQl0b3RhbHJlYWQgKz0gbnJlYWQ7Ci0JCXAgPSAoY2hhciAqKW1lbWNocihidWZmZXIrbmZpbGxlZCwgJ1xuJywgbnJlYWQpOwotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQkvKiBOZWVkIGEgbGFyZ2VyIGJ1ZmZlciB0byBmaXQgdGhpcyBsaW5lICovCi0JCQluZmlsbGVkICs9IG5yZWFkOwotCQkJYnVmZmVyc2l6ZSAqPSAyOwotCQkJaWYgKGJ1ZmZlcnNpemUgPiBQWV9TU0laRV9UX01BWCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJICAgICJsaW5lIGlzIGxvbmdlciB0aGFuIGEgUHl0aG9uIHN0cmluZyBjYW4gaG9sZCIpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJLyogQ3JlYXRlIHRoZSBiaWcgYnVmZmVyICovCi0JCQkJYmlnX2J1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQkJCQlOVUxMLCBidWZmZXJzaXplKTsKLQkJCQlpZiAoYmlnX2J1ZmZlciA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCWJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKLQkJCQltZW1jcHkoYnVmZmVyLCBzbWFsbF9idWZmZXIsIG5maWxsZWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogR3JvdyB0aGUgYmlnIGJ1ZmZlciAqLwotCQkJCWlmICggX1B5U3RyaW5nX1Jlc2l6ZSgmYmlnX2J1ZmZlciwgYnVmZmVyc2l6ZSkgPCAwICkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcoYmlnX2J1ZmZlcik7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQllbmQgPSBidWZmZXIrbmZpbGxlZCtucmVhZDsKLQkJcSA9IGJ1ZmZlcjsKLQkJZG8gewotCQkJLyogUHJvY2VzcyBjb21wbGV0ZSBsaW5lcyAqLwotCQkJcCsrOwotCQkJbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHEsIHAtcSk7Ci0JCQlpZiAobGluZSA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOwotCQkJUHlfREVDUkVGKGxpbmUpOwotCQkJaWYgKGVyciAhPSAwKQotCQkJCWdvdG8gZXJyb3I7Ci0JCQlxID0gcDsKLQkJCXAgPSAoY2hhciAqKW1lbWNocihxLCAnXG4nLCBlbmQtcSk7Ci0JCX0gd2hpbGUgKHAgIT0gTlVMTCk7Ci0JCS8qIE1vdmUgdGhlIHJlbWFpbmluZyBpbmNvbXBsZXRlIGxpbmUgdG8gdGhlIHN0YXJ0ICovCi0JCW5maWxsZWQgPSBlbmQtcTsKLQkJbWVtbW92ZShidWZmZXIsIHEsIG5maWxsZWQpOwotCQlpZiAoc2l6ZWhpbnQgPiAwKQotCQkJaWYgKHRvdGFscmVhZCA+PSAoc2l6ZV90KXNpemVoaW50KQotCQkJCWJyZWFrOwotCX0KLQlpZiAobmZpbGxlZCAhPSAwKSB7Ci0JCS8qIFBhcnRpYWwgbGFzdCBsaW5lICovCi0JCWxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIG5maWxsZWQpOwotCQlpZiAobGluZSA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKHNpemVoaW50ID4gMCkgewotCQkJLyogTmVlZCB0byBjb21wbGV0ZSB0aGUgbGFzdCBsaW5lICovCi0JCQlQeU9iamVjdCAqcmVzdCA9IGdldF9saW5lKGYsIDApOwotCQkJaWYgKHJlc3QgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihsaW5lKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJUHlTdHJpbmdfQ29uY2F0KCZsaW5lLCByZXN0KTsKLQkJCVB5X0RFQ1JFRihyZXN0KTsKLQkJCWlmIChsaW5lID09IE5VTEwpCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCQllcnIgPSBQeUxpc3RfQXBwZW5kKGxpc3QsIGxpbmUpOwotCQlQeV9ERUNSRUYobGluZSk7Ci0JCWlmIChlcnIgIT0gMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgaWYgKCFmLT5yZWFkYWJsZSkKKyAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7CisgICAgLyogcmVmdXNlIHRvIG1peCB3aXRoIGYubmV4dCgpICovCisgICAgaWYgKGYtPmZfYnVmICE9IE5VTEwgJiYKKyAgICAgICAgKGYtPmZfYnVmZW5kIC0gZi0+Zl9idWZwdHIpID4gMCAmJgorICAgICAgICBmLT5mX2J1ZlswXSAhPSAnXDAnKQorICAgICAgICByZXR1cm4gZXJyX2l0ZXJidWZmZXJlZCgpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGw6cmVhZGxpbmVzIiwgJnNpemVoaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChsaXN0ID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoc2hvcnRyZWFkKQorICAgICAgICAgICAgbnJlYWQgPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgbnJlYWQgPSBQeV9Vbml2ZXJzYWxOZXdsaW5lRnJlYWQoYnVmZmVyK25maWxsZWQsCisgICAgICAgICAgICAgICAgYnVmZmVyc2l6ZS1uZmlsbGVkLCBmLT5mX2ZwLCAoUHlPYmplY3QgKilmKTsKKyAgICAgICAgICAgIEZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKKyAgICAgICAgICAgIHNob3J0cmVhZCA9IChucmVhZCA8IGJ1ZmZlcnNpemUtbmZpbGxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5yZWFkID09IDApIHsKKyAgICAgICAgICAgIHNpemVoaW50ID0gMDsKKyAgICAgICAgICAgIGlmICghZmVycm9yKGYtPmZfZnApKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgY2xlYXJlcnIoZi0+Zl9mcCk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHRvdGFscmVhZCArPSBucmVhZDsKKyAgICAgICAgcCA9IChjaGFyICopbWVtY2hyKGJ1ZmZlcituZmlsbGVkLCAnXG4nLCBucmVhZCk7CisgICAgICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIE5lZWQgYSBsYXJnZXIgYnVmZmVyIHRvIGZpdCB0aGlzIGxpbmUgKi8KKyAgICAgICAgICAgIG5maWxsZWQgKz0gbnJlYWQ7CisgICAgICAgICAgICBidWZmZXJzaXplICo9IDI7CisgICAgICAgICAgICBpZiAoYnVmZmVyc2l6ZSA+IFBZX1NTSVpFX1RfTUFYKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImxpbmUgaXMgbG9uZ2VyIHRoYW4gYSBQeXRob24gc3RyaW5nIGNhbiBob2xkIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaWdfYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgdGhlIGJpZyBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBiaWdfYnVmZmVyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIGJ1ZmZlcnNpemUpOworICAgICAgICAgICAgICAgIGlmIChiaWdfYnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gUHlTdHJpbmdfQVNfU1RSSU5HKGJpZ19idWZmZXIpOworICAgICAgICAgICAgICAgIG1lbWNweShidWZmZXIsIHNtYWxsX2J1ZmZlciwgbmZpbGxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBHcm93IHRoZSBiaWcgYnVmZmVyICovCisgICAgICAgICAgICAgICAgaWYgKCBfUHlTdHJpbmdfUmVzaXplKCZiaWdfYnVmZmVyLCBidWZmZXJzaXplKSA8IDAgKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhiaWdfYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVuZCA9IGJ1ZmZlcituZmlsbGVkK25yZWFkOworICAgICAgICBxID0gYnVmZmVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICAvKiBQcm9jZXNzIGNvbXBsZXRlIGxpbmVzICovCisgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBsaW5lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocSwgcC1xKTsKKyAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbGluZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYobGluZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIHEgPSBwOworICAgICAgICAgICAgcCA9IChjaGFyICopbWVtY2hyKHEsICdcbicsIGVuZC1xKTsKKyAgICAgICAgfSB3aGlsZSAocCAhPSBOVUxMKTsKKyAgICAgICAgLyogTW92ZSB0aGUgcmVtYWluaW5nIGluY29tcGxldGUgbGluZSB0byB0aGUgc3RhcnQgKi8KKyAgICAgICAgbmZpbGxlZCA9IGVuZC1xOworICAgICAgICBtZW1tb3ZlKGJ1ZmZlciwgcSwgbmZpbGxlZCk7CisgICAgICAgIGlmIChzaXplaGludCA+IDApCisgICAgICAgICAgICBpZiAodG90YWxyZWFkID49IChzaXplX3Qpc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChuZmlsbGVkICE9IDApIHsKKyAgICAgICAgLyogUGFydGlhbCBsYXN0IGxpbmUgKi8KKyAgICAgICAgbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwgbmZpbGxlZCk7CisgICAgICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAoc2l6ZWhpbnQgPiAwKSB7CisgICAgICAgICAgICAvKiBOZWVkIHRvIGNvbXBsZXRlIHRoZSBsYXN0IGxpbmUgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN0ID0gZ2V0X2xpbmUoZiwgMCk7CisgICAgICAgICAgICBpZiAocmVzdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxpbmUpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVN0cmluZ19Db25jYXQoJmxpbmUsIHJlc3QpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3QpOworICAgICAgICAgICAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbGluZSk7CisgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKIGNsZWFudXA6Ci0JUHlfWERFQ1JFRihiaWdfYnVmZmVyKTsKLQlyZXR1cm4gbGlzdDsKKyAgICBQeV9YREVDUkVGKGJpZ19idWZmZXIpOworICAgIHJldHVybiBsaXN0OwogCiBlcnJvcjoKLQlQeV9DTEVBUihsaXN0KTsKLQlnb3RvIGNsZWFudXA7CisgICAgUHlfQ0xFQVIobGlzdCk7CisgICAgZ290byBjbGVhbnVwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV93cml0ZShQeUZpbGVPYmplY3QgKmYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X2J1ZmZlciBwYnVmOwotCWNoYXIgKnM7Ci0JUHlfc3NpemVfdCBuLCBuMjsKLQlpZiAoZi0+Zl9mcCA9PSBOVUxMKQotCQlyZXR1cm4gZXJyX2Nsb3NlZCgpOwotCWlmICghZi0+d3JpdGFibGUpCi0JCXJldHVybiBlcnJfbW9kZSgid3JpdGluZyIpOwotCWlmIChmLT5mX2JpbmFyeSkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqIiwgJnBidWYpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXMgPSBwYnVmLmJ1ZjsKLQkJbiA9IHBidWYubGVuOwotCX0gZWxzZQotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjIiwgJnMsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZi0+Zl9zb2Z0c3BhY2UgPSAwOwotCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQotCWVycm5vID0gMDsKLQluMiA9IGZ3cml0ZShzLCAxLCBuLCBmLT5mX2ZwKTsKLQlGSUxFX0VORF9BTExPV19USFJFQURTKGYpCi0JaWYgKGYtPmZfYmluYXJ5KQotCQlQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKLQlpZiAobjIgIT0gbikgewotCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCWNsZWFyZXJyKGYtPmZfZnApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X2J1ZmZlciBwYnVmOworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBuLCBuMjsKKyAgICBpZiAoZi0+Zl9mcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZXJyX2Nsb3NlZCgpOworICAgIGlmICghZi0+d3JpdGFibGUpCisgICAgICAgIHJldHVybiBlcnJfbW9kZSgid3JpdGluZyIpOworICAgIGlmIChmLT5mX2JpbmFyeSkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqIiwgJnBidWYpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHMgPSBwYnVmLmJ1ZjsKKyAgICAgICAgbiA9IHBidWYubGVuOworICAgIH0gZWxzZQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjIiwgJnMsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZi0+Zl9zb2Z0c3BhY2UgPSAwOworICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgIGVycm5vID0gMDsKKyAgICBuMiA9IGZ3cml0ZShzLCAxLCBuLCBmLT5mX2ZwKTsKKyAgICBGSUxFX0VORF9BTExPV19USFJFQURTKGYpCisgICAgaWYgKGYtPmZfYmluYXJ5KQorICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwYnVmKTsKKyAgICBpZiAobjIgIT0gbikgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV93cml0ZWxpbmVzKFB5RmlsZU9iamVjdCAqZiwgUHlPYmplY3QgKnNlcSkKIHsKICNkZWZpbmUgQ0hVTktTSVpFIDEwMDAKLQlQeU9iamVjdCAqbGlzdCwgKmxpbmU7Ci0JUHlPYmplY3QgKml0OwkvKiBpdGVyKHNlcSkgKi8KLQlQeU9iamVjdCAqcmVzdWx0OwotCWludCBpbmRleCwgaXNsaXN0OwotCVB5X3NzaXplX3QgaSwgaiwgbndyaXR0ZW4sIGxlbjsKKyAgICBQeU9iamVjdCAqbGlzdCwgKmxpbmU7CisgICAgUHlPYmplY3QgKml0OyAgICAgICAvKiBpdGVyKHNlcSkgKi8KKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBpbmRleCwgaXNsaXN0OworICAgIFB5X3NzaXplX3QgaSwgaiwgbndyaXR0ZW4sIGxlbjsKIAotCWFzc2VydChzZXEgIT0gTlVMTCk7Ci0JaWYgKGYtPmZfZnAgPT0gTlVMTCkKLQkJcmV0dXJuIGVycl9jbG9zZWQoKTsKLQlpZiAoIWYtPndyaXRhYmxlKQotCQlyZXR1cm4gZXJyX21vZGUoIndyaXRpbmciKTsKKyAgICBhc3NlcnQoc2VxICE9IE5VTEwpOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgaWYgKCFmLT53cml0YWJsZSkKKyAgICAgICAgcmV0dXJuIGVycl9tb2RlKCJ3cml0aW5nIik7CiAKLQlyZXN1bHQgPSBOVUxMOwotCWxpc3QgPSBOVUxMOwotCWlzbGlzdCA9IFB5TGlzdF9DaGVjayhzZXEpOwotCWlmICAoaXNsaXN0KQotCQlpdCA9IE5VTEw7Ci0JZWxzZSB7Ci0JCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwotCQlpZiAoaXQgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkid3JpdGVsaW5lcygpIHJlcXVpcmVzIGFuIGl0ZXJhYmxlIGFyZ3VtZW50Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiBGcm9tIGhlcmUgb24sIGZhaWwgYnkgZ29pbmcgdG8gZXJyb3IsIHRvIHJlY2xhaW0gIml0Ii4gKi8KLQkJbGlzdCA9IFB5TGlzdF9OZXcoQ0hVTktTSVpFKTsKLQkJaWYgKGxpc3QgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQorICAgIHJlc3VsdCA9IE5VTEw7CisgICAgbGlzdCA9IE5VTEw7CisgICAgaXNsaXN0ID0gUHlMaXN0X0NoZWNrKHNlcSk7CisgICAgaWYgIChpc2xpc3QpCisgICAgICAgIGl0ID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJ3cml0ZWxpbmVzKCkgcmVxdWlyZXMgYW4gaXRlcmFibGUgYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIEZyb20gaGVyZSBvbiwgZmFpbCBieSBnb2luZyB0byBlcnJvciwgdG8gcmVjbGFpbSAiaXQiLiAqLworICAgICAgICBsaXN0ID0gUHlMaXN0X05ldyhDSFVOS1NJWkUpOworICAgICAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBTdHJhdGVneTogc2x1cnAgQ0hVTktTSVpFIGxpbmVzIGludG8gYSBwcml2YXRlIGxpc3QsCi0JICAgY2hlY2tpbmcgdGhhdCB0aGV5IGFyZSBhbGwgc3RyaW5ncywgdGhlbiB3cml0ZSB0aGF0IGxpc3QKLQkgICB3aXRob3V0IGhvbGRpbmcgdGhlIGludGVycHJldGVyIGxvY2ssIHRoZW4gY29tZSBiYWNrIGZvciBtb3JlLiAqLwotCWZvciAoaW5kZXggPSAwOyA7IGluZGV4ICs9IENIVU5LU0laRSkgewotCQlpZiAoaXNsaXN0KSB7Ci0JCQlQeV9YREVDUkVGKGxpc3QpOwotCQkJbGlzdCA9IFB5TGlzdF9HZXRTbGljZShzZXEsIGluZGV4LCBpbmRleCtDSFVOS1NJWkUpOwotCQkJaWYgKGxpc3QgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJaiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaiA9IDA7IGogPCBDSFVOS1NJWkU7IGorKykgewotCQkJCWxpbmUgPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCQkJaWYgKGxpbmUgPT0gTlVMTCkgewotCQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJCWdvdG8gZXJyb3I7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlQeUxpc3RfU2V0SXRlbShsaXN0LCBqLCBsaW5lKTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSAwKQotCQkJYnJlYWs7CisgICAgLyogU3RyYXRlZ3k6IHNsdXJwIENIVU5LU0laRSBsaW5lcyBpbnRvIGEgcHJpdmF0ZSBsaXN0LAorICAgICAgIGNoZWNraW5nIHRoYXQgdGhleSBhcmUgYWxsIHN0cmluZ3MsIHRoZW4gd3JpdGUgdGhhdCBsaXN0CisgICAgICAgd2l0aG91dCBob2xkaW5nIHRoZSBpbnRlcnByZXRlciBsb2NrLCB0aGVuIGNvbWUgYmFjayBmb3IgbW9yZS4gKi8KKyAgICBmb3IgKGluZGV4ID0gMDsgOyBpbmRleCArPSBDSFVOS1NJWkUpIHsKKyAgICAgICAgaWYgKGlzbGlzdCkgeworICAgICAgICAgICAgUHlfWERFQ1JFRihsaXN0KTsKKyAgICAgICAgICAgIGxpc3QgPSBQeUxpc3RfR2V0U2xpY2Uoc2VxLCBpbmRleCwgaW5kZXgrQ0hVTktTSVpFKTsKKyAgICAgICAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGogPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgQ0hVTktTSVpFOyBqKyspIHsKKyAgICAgICAgICAgICAgICBsaW5lID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICAgICAgICAgIGlmIChsaW5lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgaiwgbGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPT0gMCkKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCS8qIENoZWNrIHRoYXQgYWxsIGVudHJpZXMgYXJlIGluZGVlZCBzdHJpbmdzLiBJZiBub3QsCi0JCSAgIGFwcGx5IHRoZSBzYW1lIHJ1bGVzIGFzIGZvciBmaWxlLndyaXRlKCkgYW5kCi0JCSAgIGNvbnZlcnQgdGhlIHJlc3VsdHMgdG8gc3RyaW5ncy4gVGhpcyBpcyBzbG93LCBidXQKLQkJICAgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHNpbmNlIGFsbCBjb252ZXJzaW9uIEFQSXMKLQkJICAgY291bGQgcG90ZW50aWFsbHkgZXhlY3V0ZSBQeXRob24gY29kZS4gKi8KLQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCQkgICAgCWNvbnN0IGNoYXIgKmJ1ZmZlcjsKLQkJCQlpZiAoKChmLT5mX2JpbmFyeSAmJgotCQkJCSAgICAgIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcih2LAotCQkJCQkgICAgICAoY29uc3Qgdm9pZCoqKSZidWZmZXIsCi0JCQkJCQkJICAgICZsZW4pKSB8fAotCQkJCSAgICAgUHlPYmplY3RfQXNDaGFyQnVmZmVyKHYsCi0JCQkJCQkJICAgJmJ1ZmZlciwKLQkJCQkJCQkgICAmbGVuKSkpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ3cml0ZWxpbmVzKCkgYXJndW1lbnQgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3MiKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJbGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZmZlciwKLQkJCQkJCQkJICBsZW4pOwotCQkJCWlmIChsaW5lID09IE5VTEwpCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCVB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCBsaW5lKTsKLQkJCX0KLQkJfQorICAgICAgICAvKiBDaGVjayB0aGF0IGFsbCBlbnRyaWVzIGFyZSBpbmRlZWQgc3RyaW5ncy4gSWYgbm90LAorICAgICAgICAgICBhcHBseSB0aGUgc2FtZSBydWxlcyBhcyBmb3IgZmlsZS53cml0ZSgpIGFuZAorICAgICAgICAgICBjb252ZXJ0IHRoZSByZXN1bHRzIHRvIHN0cmluZ3MuIFRoaXMgaXMgc2xvdywgYnV0CisgICAgICAgICAgIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSBzaW5jZSBhbGwgY29udmVyc2lvbiBBUElzCisgICAgICAgICAgIGNvdWxkIHBvdGVudGlhbGx5IGV4ZWN1dGUgUHl0aG9uIGNvZGUuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOworICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAoKChmLT5mX2JpbmFyeSAmJgorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcih2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCoqKSZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbikpIHx8CisgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdF9Bc0NoYXJCdWZmZXIodiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIndyaXRlbGluZXMoKSBhcmd1bWVudCBtdXN0IGJlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbik7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QsIGksIGxpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLyogU2luY2Ugd2UgYXJlIHJlbGVhc2luZyB0aGUgZ2xvYmFsIGxvY2ssIHRoZQotCQkgICBmb2xsb3dpbmcgY29kZSBtYXkgKm5vdCogZXhlY3V0ZSBQeXRob24gY29kZS4gKi8KLQkJZi0+Zl9zb2Z0c3BhY2UgPSAwOwotCQlGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKLQkJZXJybm8gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCSAgICAJbGluZSA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKLQkJCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGxpbmUpOwotCQkJbndyaXR0ZW4gPSBmd3JpdGUoUHlTdHJpbmdfQVNfU1RSSU5HKGxpbmUpLAotCQkJCQkgIDEsIGxlbiwgZi0+Zl9mcCk7Ci0JCQlpZiAobndyaXR0ZW4gIT0gbGVuKSB7Ci0JCQkJRklMRV9BQk9SVF9BTExPV19USFJFQURTKGYpCi0JCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJCWNsZWFyZXJyKGYtPmZfZnApOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCX0KLQkJRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICAvKiBTaW5jZSB3ZSBhcmUgcmVsZWFzaW5nIHRoZSBnbG9iYWwgbG9jaywgdGhlCisgICAgICAgICAgIGZvbGxvd2luZyBjb2RlIG1heSAqbm90KiBleGVjdXRlIFB5dGhvbiBjb2RlLiAqLworICAgICAgICBmLT5mX3NvZnRzcGFjZSA9IDA7CisgICAgICAgIEZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmKQorICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKKyAgICAgICAgICAgIGxpbmUgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CisgICAgICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShsaW5lKTsKKyAgICAgICAgICAgIG53cml0dGVuID0gZndyaXRlKFB5U3RyaW5nX0FTX1NUUklORyhsaW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGxlbiwgZi0+Zl9mcCk7CisgICAgICAgICAgICBpZiAobndyaXR0ZW4gIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgRklMRV9BQk9SVF9BTExPV19USFJFQURTKGYpCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgICAgIGNsZWFyZXJyKGYtPmZfZnApOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQogCi0JCWlmIChqIDwgQ0hVTktTSVpFKQotCQkJYnJlYWs7Ci0JfQorICAgICAgICBpZiAoaiA8IENIVU5LU0laRSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXN1bHQgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXN1bHQgPSBQeV9Ob25lOwogICBlcnJvcjoKLQlQeV9YREVDUkVGKGxpc3QpOwotICAJUHlfWERFQ1JFRihpdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGxpc3QpOworICAgIFB5X1hERUNSRUYoaXQpOworICAgIHJldHVybiByZXN1bHQ7CiAjdW5kZWYgQ0hVTktTSVpFCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX3NlbGYoUHlGaWxlT2JqZWN0ICpmKQogewotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JUHlfSU5DUkVGKGYpOwotCXJldHVybiAoUHlPYmplY3QgKilmOworICAgIGlmIChmLT5mX2ZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBlcnJfY2xvc2VkKCk7CisgICAgUHlfSU5DUkVGKGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmlsZV94cmVhZGxpbmVzKFB5RmlsZU9iamVjdCAqZikKIHsKLQlpZiAoUHlFcnJfV2FyblB5M2soImYueHJlYWRsaW5lcygpIG5vdCBzdXBwb3J0ZWQgaW4gMy54LCAiCi0JCQkgICAidHJ5ICdmb3IgbGluZSBpbiBmJyBpbnN0ZWFkIiwgMSkgPCAwKQotCSAgICAgICByZXR1cm4gTlVMTDsKLQlyZXR1cm4gZmlsZV9zZWxmKGYpOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiZi54cmVhZGxpbmVzKCkgbm90IHN1cHBvcnRlZCBpbiAzLngsICIKKyAgICAgICAgICAgICAgICAgICAgICAgInRyeSAnZm9yIGxpbmUgaW4gZicgaW5zdGVhZCIsIDEpIDwgMCkKKyAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGZpbGVfc2VsZihmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfZXhpdChQeU9iamVjdCAqZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnJldCA9IFB5T2JqZWN0X0NhbGxNZXRob2QoZiwgImNsb3NlIiwgTlVMTCk7Ci0JaWYgKCFyZXQpCi0JCS8qIElmIGVycm9yIG9jY3VycmVkLCBwYXNzIHRocm91Z2ggKi8KLQkJcmV0dXJuIE5VTEw7Ci0JUHlfREVDUkVGKHJldCk7Ci0JLyogV2UgY2Fubm90IHJldHVybiB0aGUgcmVzdWx0IG9mIGNsb3NlIHNpbmNlIGEgdHJ1ZQotCSAqIHZhbHVlIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgInllcywgc3dhbGxvdyB0aGUKLQkgKiBleGNlcHRpb24gaWYgb25lIHdhcyByYWlzZWQgaW5zaWRlIHRoZSB3aXRoIGJsb2NrIi4gKi8KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeU9iamVjdCAqcmV0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChmLCAiY2xvc2UiLCBOVUxMKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgLyogSWYgZXJyb3Igb2NjdXJyZWQsIHBhc3MgdGhyb3VnaCAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmV0KTsKKyAgICAvKiBXZSBjYW5ub3QgcmV0dXJuIHRoZSByZXN1bHQgb2YgY2xvc2Ugc2luY2UgYSB0cnVlCisgICAgICogdmFsdWUgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyAieWVzLCBzd2FsbG93IHRoZQorICAgICAqIGV4Y2VwdGlvbiBpZiBvbmUgd2FzIHJhaXNlZCBpbnNpZGUgdGhlIHdpdGggYmxvY2siLiAqLworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIocmVhZGxpbmVfZG9jLApAQCAtMTkxNywxMjYgKzE5MTcsMTI2IEBACiAiaXNhdHR5KCkgLT4gdHJ1ZSBvciBmYWxzZS4gIFRydWUgaWYgdGhlIGZpbGUgaXMgY29ubmVjdGVkIHRvIGEgdHR5IGRldmljZS4iKTsKIAogUHlEb2NfU1RSVkFSKGVudGVyX2RvYywKLQkgICAgICJfX2VudGVyX18oKSAtPiBzZWxmLiIpOworICAgICAgICAgICAgICJfX2VudGVyX18oKSAtPiBzZWxmLiIpOwogCiBQeURvY19TVFJWQVIoZXhpdF9kb2MsCi0JICAgICAiX19leGl0X18oKmV4Y2luZm8pIC0+IE5vbmUuICBDbG9zZXMgdGhlIGZpbGUuIik7CisgICAgICAgICAgICAgIl9fZXhpdF9fKCpleGNpbmZvKSAtPiBOb25lLiAgQ2xvc2VzIHRoZSBmaWxlLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgZmlsZV9tZXRob2RzW10gPSB7Ci0JeyJyZWFkbGluZSIsICAoUHlDRnVuY3Rpb24pZmlsZV9yZWFkbGluZSwgTUVUSF9WQVJBUkdTLCByZWFkbGluZV9kb2N9LAotCXsicmVhZCIsICAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfcmVhZCwgICAgIE1FVEhfVkFSQVJHUywgcmVhZF9kb2N9LAotCXsid3JpdGUiLCAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfd3JpdGUsICAgIE1FVEhfVkFSQVJHUywgd3JpdGVfZG9jfSwKLQl7ImZpbGVubyIsICAgIChQeUNGdW5jdGlvbilmaWxlX2ZpbGVubywgICBNRVRIX05PQVJHUywgIGZpbGVub19kb2N9LAotCXsic2VlayIsICAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfc2VlaywgICAgIE1FVEhfVkFSQVJHUywgc2Vla19kb2N9LAorICAgIHsicmVhZGxpbmUiLCAgKFB5Q0Z1bmN0aW9uKWZpbGVfcmVhZGxpbmUsIE1FVEhfVkFSQVJHUywgcmVhZGxpbmVfZG9jfSwKKyAgICB7InJlYWQiLCAgICAgIChQeUNGdW5jdGlvbilmaWxlX3JlYWQsICAgICBNRVRIX1ZBUkFSR1MsIHJlYWRfZG9jfSwKKyAgICB7IndyaXRlIiwgICAgIChQeUNGdW5jdGlvbilmaWxlX3dyaXRlLCAgICBNRVRIX1ZBUkFSR1MsIHdyaXRlX2RvY30sCisgICAgeyJmaWxlbm8iLCAgICAoUHlDRnVuY3Rpb24pZmlsZV9maWxlbm8sICAgTUVUSF9OT0FSR1MsICBmaWxlbm9fZG9jfSwKKyAgICB7InNlZWsiLCAgICAgIChQeUNGdW5jdGlvbilmaWxlX3NlZWssICAgICBNRVRIX1ZBUkFSR1MsIHNlZWtfZG9jfSwKICNpZmRlZiBIQVZFX0ZUUlVOQ0FURQotCXsidHJ1bmNhdGUiLCAgKFB5Q0Z1bmN0aW9uKWZpbGVfdHJ1bmNhdGUsIE1FVEhfVkFSQVJHUywgdHJ1bmNhdGVfZG9jfSwKKyAgICB7InRydW5jYXRlIiwgIChQeUNGdW5jdGlvbilmaWxlX3RydW5jYXRlLCBNRVRIX1ZBUkFSR1MsIHRydW5jYXRlX2RvY30sCiAjZW5kaWYKLQl7InRlbGwiLCAgICAgIChQeUNGdW5jdGlvbilmaWxlX3RlbGwsICAgICBNRVRIX05PQVJHUywgIHRlbGxfZG9jfSwKLQl7InJlYWRpbnRvIiwgIChQeUNGdW5jdGlvbilmaWxlX3JlYWRpbnRvLCBNRVRIX1ZBUkFSR1MsIHJlYWRpbnRvX2RvY30sCi0JeyJyZWFkbGluZXMiLCAoUHlDRnVuY3Rpb24pZmlsZV9yZWFkbGluZXMsIE1FVEhfVkFSQVJHUywgcmVhZGxpbmVzX2RvY30sCi0JeyJ4cmVhZGxpbmVzIiwoUHlDRnVuY3Rpb24pZmlsZV94cmVhZGxpbmVzLCBNRVRIX05PQVJHUywgeHJlYWRsaW5lc19kb2N9LAotCXsid3JpdGVsaW5lcyIsKFB5Q0Z1bmN0aW9uKWZpbGVfd3JpdGVsaW5lcywgTUVUSF9PLCAgICAgd3JpdGVsaW5lc19kb2N9LAotCXsiZmx1c2giLCAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfZmx1c2gsICAgIE1FVEhfTk9BUkdTLCAgZmx1c2hfZG9jfSwKLQl7ImNsb3NlIiwgICAgIChQeUNGdW5jdGlvbilmaWxlX2Nsb3NlLCAgICBNRVRIX05PQVJHUywgIGNsb3NlX2RvY30sCi0JeyJpc2F0dHkiLCAgICAoUHlDRnVuY3Rpb24pZmlsZV9pc2F0dHksICAgTUVUSF9OT0FSR1MsICBpc2F0dHlfZG9jfSwKLQl7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilmaWxlX3NlbGYsICAgICBNRVRIX05PQVJHUywgIGVudGVyX2RvY30sCi0JeyJfX2V4aXRfXyIsICAoUHlDRnVuY3Rpb24pZmlsZV9leGl0LCAgICAgTUVUSF9WQVJBUkdTLCBleGl0X2RvY30sCi0Je05VTEwsCSAgICAgIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsidGVsbCIsICAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfdGVsbCwgICAgIE1FVEhfTk9BUkdTLCAgdGVsbF9kb2N9LAorICAgIHsicmVhZGludG8iLCAgKFB5Q0Z1bmN0aW9uKWZpbGVfcmVhZGludG8sIE1FVEhfVkFSQVJHUywgcmVhZGludG9fZG9jfSwKKyAgICB7InJlYWRsaW5lcyIsIChQeUNGdW5jdGlvbilmaWxlX3JlYWRsaW5lcywgTUVUSF9WQVJBUkdTLCByZWFkbGluZXNfZG9jfSwKKyAgICB7InhyZWFkbGluZXMiLChQeUNGdW5jdGlvbilmaWxlX3hyZWFkbGluZXMsIE1FVEhfTk9BUkdTLCB4cmVhZGxpbmVzX2RvY30sCisgICAgeyJ3cml0ZWxpbmVzIiwoUHlDRnVuY3Rpb24pZmlsZV93cml0ZWxpbmVzLCBNRVRIX08sICAgICB3cml0ZWxpbmVzX2RvY30sCisgICAgeyJmbHVzaCIsICAgICAoUHlDRnVuY3Rpb24pZmlsZV9mbHVzaCwgICAgTUVUSF9OT0FSR1MsICBmbHVzaF9kb2N9LAorICAgIHsiY2xvc2UiLCAgICAgKFB5Q0Z1bmN0aW9uKWZpbGVfY2xvc2UsICAgIE1FVEhfTk9BUkdTLCAgY2xvc2VfZG9jfSwKKyAgICB7ImlzYXR0eSIsICAgIChQeUNGdW5jdGlvbilmaWxlX2lzYXR0eSwgICBNRVRIX05PQVJHUywgIGlzYXR0eV9kb2N9LAorICAgIHsiX19lbnRlcl9fIiwgKFB5Q0Z1bmN0aW9uKWZpbGVfc2VsZiwgICAgIE1FVEhfTk9BUkdTLCAgZW50ZXJfZG9jfSwKKyAgICB7Il9fZXhpdF9fIiwgIChQeUNGdW5jdGlvbilmaWxlX2V4aXQsICAgICBNRVRIX1ZBUkFSR1MsIGV4aXRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoUHlGaWxlT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZmlsZV9tZW1iZXJsaXN0W10gPSB7Ci0JeyJtb2RlIiwJVF9PQkpFQ1QsCU9GRihmX21vZGUpLAlSTywKLQkgImZpbGUgbW9kZSAoJ3InLCAnVScsICd3JywgJ2EnLCBwb3NzaWJseSB3aXRoICdiJyBvciAnKycgYWRkZWQpIn0sCi0JeyJuYW1lIiwJVF9PQkpFQ1QsCU9GRihmX25hbWUpLAlSTywKLQkgImZpbGUgbmFtZSJ9LAotCXsiZW5jb2RpbmciLAlUX09CSkVDVCwJT0ZGKGZfZW5jb2RpbmcpLAlSTywKLQkgImZpbGUgZW5jb2RpbmcifSwKLQl7ImVycm9ycyIsCVRfT0JKRUNULAlPRkYoZl9lcnJvcnMpLAlSTywKLQkgIlVuaWNvZGUgZXJyb3IgaGFuZGxlciJ9LAotCS8qIGdldGF0dHIoZiwgImNsb3NlZCIpIGlzIGltcGxlbWVudGVkIHdpdGhvdXQgdGhpcyB0YWJsZSAqLwotCXtOVUxMfQkvKiBTZW50aW5lbCAqLworICAgIHsibW9kZSIsICAgICAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihmX21vZGUpLCAgICBSTywKKyAgICAgImZpbGUgbW9kZSAoJ3InLCAnVScsICd3JywgJ2EnLCBwb3NzaWJseSB3aXRoICdiJyBvciAnKycgYWRkZWQpIn0sCisgICAgeyJuYW1lIiwgICAgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfbmFtZSksICAgIFJPLAorICAgICAiZmlsZSBuYW1lIn0sCisgICAgeyJlbmNvZGluZyIsICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfZW5jb2RpbmcpLCAgICAgICAgUk8sCisgICAgICJmaWxlIGVuY29kaW5nIn0sCisgICAgeyJlcnJvcnMiLCAgICAgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfZXJyb3JzKSwgIFJPLAorICAgICAiVW5pY29kZSBlcnJvciBoYW5kbGVyIn0sCisgICAgLyogZ2V0YXR0cihmLCAiY2xvc2VkIikgaXMgaW1wbGVtZW50ZWQgd2l0aG91dCB0aGlzIHRhYmxlICovCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfY2xvc2VkKFB5RmlsZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShmLT5mX2ZwID09IDApKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKShmLT5mX2ZwID09IDApKTsKIH0KIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfbmV3bGluZXMoUHlGaWxlT2JqZWN0ICpmLCB2b2lkICpjbG9zdXJlKQogewotCXN3aXRjaCAoZi0+Zl9uZXdsaW5ldHlwZXMpIHsKLQljYXNlIE5FV0xJTkVfVU5LTk9XTjoKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQljYXNlIE5FV0xJTkVfQ1I6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcciIpOwotCWNhc2UgTkVXTElORV9MRjoKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIlxuIik7Ci0JY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxuIik7Ci0JY2FzZSBORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcclxuIik7Ci0JY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfQ1JMRjoKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzcykiLCAiXHIiLCAiXHJcbiIpOwotCWNhc2UgTkVXTElORV9MRnxORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxuIiwgIlxyXG4iKTsKLQljYXNlIE5FV0xJTkVfQ1J8TkVXTElORV9MRnxORVdMSU5FX0NSTEY6Ci0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3NzKSIsICJcciIsICJcbiIsICJcclxuIik7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJICAgICAiVW5rbm93biBuZXdsaW5lcyB2YWx1ZSAweCV4XG4iLAotCQkJICAgICBmLT5mX25ld2xpbmV0eXBlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBzd2l0Y2ggKGYtPmZfbmV3bGluZXR5cGVzKSB7CisgICAgY2FzZSBORVdMSU5FX1VOS05PV046CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgY2FzZSBORVdMSU5FX0NSOgorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXHIiKTsKKyAgICBjYXNlIE5FV0xJTkVfTEY6CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcbiIpOworICAgIGNhc2UgTkVXTElORV9DUnxORVdMSU5FX0xGOgorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcciIsICJcbiIpOworICAgIGNhc2UgTkVXTElORV9DUkxGOgorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiXHJcbiIpOworICAgIGNhc2UgTkVXTElORV9DUnxORVdMSU5FX0NSTEY6CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoc3MpIiwgIlxyIiwgIlxyXG4iKTsKKyAgICBjYXNlIE5FV0xJTkVfTEZ8TkVXTElORV9DUkxGOgorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzKSIsICJcbiIsICJcclxuIik7CisgICAgY2FzZSBORVdMSU5FX0NSfE5FV0xJTkVfTEZ8TkVXTElORV9DUkxGOgorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHNzcykiLCAiXHIiLCAiXG4iLCAiXHJcbiIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIG5ld2xpbmVzIHZhbHVlIDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgICBmLT5mX25ld2xpbmV0eXBlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9zb2Z0c3BhY2UoUHlGaWxlT2JqZWN0ICpmLCB2b2lkICpjbG9zdXJlKQogewotCWlmIChQeUVycl9XYXJuUHkzaygiZmlsZS5zb2Z0c3BhY2Ugbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhmLT5mX3NvZnRzcGFjZSk7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJmaWxlLnNvZnRzcGFjZSBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGYtPmZfc29mdHNwYWNlKTsKIH0KIAogc3RhdGljIGludAogc2V0X3NvZnRzcGFjZShQeUZpbGVPYmplY3QgKmYsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlpbnQgbmV3OwotCWlmIChQeUVycl9XYXJuUHkzaygiZmlsZS5zb2Z0c3BhY2Ugbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCi0JCXJldHVybiAtMTsKKyAgICBpbnQgbmV3OworICAgIGlmIChQeUVycl9XYXJuUHkzaygiZmlsZS5zb2Z0c3BhY2Ugbm90IHN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNhbid0IGRlbGV0ZSBzb2Z0c3BhY2UgYXR0cmlidXRlIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgc29mdHNwYWNlIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbmV3ID0gUHlJbnRfQXNMb25nKHZhbHVlKTsKLQlpZiAobmV3ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiAtMTsKLQlmLT5mX3NvZnRzcGFjZSA9IG5ldzsKLQlyZXR1cm4gMDsKKyAgICBuZXcgPSBQeUludF9Bc0xvbmcodmFsdWUpOworICAgIGlmIChuZXcgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGYtPmZfc29mdHNwYWNlID0gbmV3OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgZmlsZV9nZXRzZXRsaXN0W10gPSB7Ci0JeyJjbG9zZWQiLCAoZ2V0dGVyKWdldF9jbG9zZWQsIE5VTEwsICJUcnVlIGlmIHRoZSBmaWxlIGlzIGNsb3NlZCJ9LAotCXsibmV3bGluZXMiLCAoZ2V0dGVyKWdldF9uZXdsaW5lcywgTlVMTCwKLQkgImVuZC1vZi1saW5lIGNvbnZlbnRpb24gdXNlZCBpbiB0aGlzIGZpbGUifSwKLQl7InNvZnRzcGFjZSIsIChnZXR0ZXIpZ2V0X3NvZnRzcGFjZSwgKHNldHRlcilzZXRfc29mdHNwYWNlLAotCSAiZmxhZyBpbmRpY2F0aW5nIHRoYXQgYSBzcGFjZSBuZWVkcyB0byBiZSBwcmludGVkOyB1c2VkIGJ5IHByaW50In0sCi0JezB9LAorICAgIHsiY2xvc2VkIiwgKGdldHRlcilnZXRfY2xvc2VkLCBOVUxMLCAiVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjbG9zZWQifSwKKyAgICB7Im5ld2xpbmVzIiwgKGdldHRlcilnZXRfbmV3bGluZXMsIE5VTEwsCisgICAgICJlbmQtb2YtbGluZSBjb252ZW50aW9uIHVzZWQgaW4gdGhpcyBmaWxlIn0sCisgICAgeyJzb2Z0c3BhY2UiLCAoZ2V0dGVyKWdldF9zb2Z0c3BhY2UsIChzZXR0ZXIpc2V0X3NvZnRzcGFjZSwKKyAgICAgImZsYWcgaW5kaWNhdGluZyB0aGF0IGEgc3BhY2UgbmVlZHMgdG8gYmUgcHJpbnRlZDsgdXNlZCBieSBwcmludCJ9LAorICAgIHswfSwKIH07CiAKIHN0YXRpYyB2b2lkCiBkcm9wX3JlYWRhaGVhZChQeUZpbGVPYmplY3QgKmYpCiB7Ci0JaWYgKGYtPmZfYnVmICE9IE5VTEwpIHsKLQkJUHlNZW1fRnJlZShmLT5mX2J1Zik7Ci0JCWYtPmZfYnVmID0gTlVMTDsKLQl9CisgICAgaWYgKGYtPmZfYnVmICE9IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fRnJlZShmLT5mX2J1Zik7CisgICAgICAgIGYtPmZfYnVmID0gTlVMTDsKKyAgICB9CiB9CiAKIC8qIE1ha2Ugc3VyZSB0aGF0IGZpbGUgaGFzIGEgcmVhZGFoZWFkIGJ1ZmZlciB3aXRoIGF0IGxlYXN0IG9uZSBieXRlCkBAIC0yMDQ1LDM0ICsyMDQ1LDM0IEBACiBzdGF0aWMgaW50CiByZWFkYWhlYWQoUHlGaWxlT2JqZWN0ICpmLCBpbnQgYnVmc2l6ZSkKIHsKLQlQeV9zc2l6ZV90IGNodW5rc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGNodW5rc2l6ZTsKIAotCWlmIChmLT5mX2J1ZiAhPSBOVUxMKSB7Ci0JCWlmKCAoZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cikgPj0gMSkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlkcm9wX3JlYWRhaGVhZChmKTsKLQl9Ci0JaWYgKChmLT5mX2J1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JRklMRV9CRUdJTl9BTExPV19USFJFQURTKGYpCi0JZXJybm8gPSAwOwotCWNodW5rc2l6ZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZCgKLQkJZi0+Zl9idWYsIGJ1ZnNpemUsIGYtPmZfZnAsIChQeU9iamVjdCAqKWYpOwotCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZikKLQlpZiAoY2h1bmtzaXplID09IDApIHsKLQkJaWYgKGZlcnJvcihmLT5mX2ZwKSkgewotCQkJUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwotCQkJY2xlYXJlcnIoZi0+Zl9mcCk7Ci0JCQlkcm9wX3JlYWRhaGVhZChmKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlmLT5mX2J1ZnB0ciA9IGYtPmZfYnVmOwotCWYtPmZfYnVmZW5kID0gZi0+Zl9idWYgKyBjaHVua3NpemU7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGYtPmZfYnVmICE9IE5VTEwpIHsKKyAgICAgICAgaWYoIChmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyKSA+PSAxKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRyb3BfcmVhZGFoZWFkKGYpOworICAgIH0KKyAgICBpZiAoKGYtPmZfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2MoYnVmc2l6ZSkpID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBGSUxFX0JFR0lOX0FMTE9XX1RIUkVBRFMoZikKKyAgICBlcnJubyA9IDA7CisgICAgY2h1bmtzaXplID0gUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKAorICAgICAgICBmLT5mX2J1ZiwgYnVmc2l6ZSwgZi0+Zl9mcCwgKFB5T2JqZWN0ICopZik7CisgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmKQorICAgIGlmIChjaHVua3NpemUgPT0gMCkgeworICAgICAgICBpZiAoZmVycm9yKGYtPmZfZnApKSB7CisgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgICAgICBjbGVhcmVycihmLT5mX2ZwKTsKKyAgICAgICAgICAgIGRyb3BfcmVhZGFoZWFkKGYpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGYtPmZfYnVmcHRyID0gZi0+Zl9idWY7CisgICAgZi0+Zl9idWZlbmQgPSBmLT5mX2J1ZiArIGNodW5rc2l6ZTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogVXNlZCBieSBmaWxlX2l0ZXJuZXh0LiAgVGhlIHJldHVybmVkIHN0cmluZyB3aWxsIHN0YXJ0IHdpdGggJ3NraXAnCkBAIC0yMDgzLDQ2ICsyMDgzLDQ2IEBACiBzdGF0aWMgUHlTdHJpbmdPYmplY3QgKgogcmVhZGFoZWFkX2dldF9saW5lX3NraXAoUHlGaWxlT2JqZWN0ICpmLCBpbnQgc2tpcCwgaW50IGJ1ZnNpemUpCiB7Ci0JUHlTdHJpbmdPYmplY3QqIHM7Ci0JY2hhciAqYnVmcHRyOwotCWNoYXIgKmJ1ZjsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBQeVN0cmluZ09iamVjdCogczsKKyAgICBjaGFyICpidWZwdHI7CisgICAgY2hhciAqYnVmOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKGYtPmZfYnVmID09IE5VTEwpCi0JCWlmIChyZWFkYWhlYWQoZiwgYnVmc2l6ZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGYtPmZfYnVmID09IE5VTEwpCisgICAgICAgIGlmIChyZWFkYWhlYWQoZiwgYnVmc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlsZW4gPSBmLT5mX2J1ZmVuZCAtIGYtPmZfYnVmcHRyOwotCWlmIChsZW4gPT0gMCkKLQkJcmV0dXJuIChQeVN0cmluZ09iamVjdCAqKQotCQkJUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2tpcCk7Ci0JYnVmcHRyID0gKGNoYXIgKiltZW1jaHIoZi0+Zl9idWZwdHIsICdcbicsIGxlbik7Ci0JaWYgKGJ1ZnB0ciAhPSBOVUxMKSB7Ci0JCWJ1ZnB0cisrOwkJCS8qIENvdW50IHRoZSAnXG4nICovCi0JCWxlbiA9IGJ1ZnB0ciAtIGYtPmZfYnVmcHRyOwotCQlzID0gKFB5U3RyaW5nT2JqZWN0ICopCi0JCQlQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBza2lwK2xlbik7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyhzKStza2lwLCBmLT5mX2J1ZnB0ciwgbGVuKTsKLQkJZi0+Zl9idWZwdHIgPSBidWZwdHI7Ci0JCWlmIChidWZwdHIgPT0gZi0+Zl9idWZlbmQpCi0JCQlkcm9wX3JlYWRhaGVhZChmKTsKLQl9IGVsc2UgewotCQlidWZwdHIgPSBmLT5mX2J1ZnB0cjsKLQkJYnVmID0gZi0+Zl9idWY7Ci0JCWYtPmZfYnVmID0gTlVMTDsgCS8qIEZvcmNlIG5ldyByZWFkYWhlYWQgYnVmZmVyICovCi0JCWFzc2VydChza2lwK2xlbiA8IElOVF9NQVgpOwotICAgICAgICAgICAgICAgIHMgPSByZWFkYWhlYWRfZ2V0X2xpbmVfc2tpcCgKLQkJCWYsIChpbnQpKHNraXArbGVuKSwgYnVmc2l6ZSArIChidWZzaXplPj4yKSApOwotCQlpZiAocyA9PSBOVUxMKSB7Ci0JCSAgICAgICAgUHlNZW1fRnJlZShidWYpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbWVtY3B5KFB5U3RyaW5nX0FTX1NUUklORyhzKStza2lwLCBidWZwdHIsIGxlbik7Ci0JCVB5TWVtX0ZyZWUoYnVmKTsKLQl9Ci0JcmV0dXJuIHM7CisgICAgbGVuID0gZi0+Zl9idWZlbmQgLSBmLT5mX2J1ZnB0cjsKKyAgICBpZiAobGVuID09IDApCisgICAgICAgIHJldHVybiAoUHlTdHJpbmdPYmplY3QgKikKKyAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNraXApOworICAgIGJ1ZnB0ciA9IChjaGFyICopbWVtY2hyKGYtPmZfYnVmcHRyLCAnXG4nLCBsZW4pOworICAgIGlmIChidWZwdHIgIT0gTlVMTCkgeworICAgICAgICBidWZwdHIrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgdGhlICdcbicgKi8KKyAgICAgICAgbGVuID0gYnVmcHRyIC0gZi0+Zl9idWZwdHI7CisgICAgICAgIHMgPSAoUHlTdHJpbmdPYmplY3QgKikKKyAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNraXArbGVuKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBtZW1jcHkoUHlTdHJpbmdfQVNfU1RSSU5HKHMpK3NraXAsIGYtPmZfYnVmcHRyLCBsZW4pOworICAgICAgICBmLT5mX2J1ZnB0ciA9IGJ1ZnB0cjsKKyAgICAgICAgaWYgKGJ1ZnB0ciA9PSBmLT5mX2J1ZmVuZCkKKyAgICAgICAgICAgIGRyb3BfcmVhZGFoZWFkKGYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZnB0ciA9IGYtPmZfYnVmcHRyOworICAgICAgICBidWYgPSBmLT5mX2J1ZjsKKyAgICAgICAgZi0+Zl9idWYgPSBOVUxMOyAgICAgICAgICAgICAgICAvKiBGb3JjZSBuZXcgcmVhZGFoZWFkIGJ1ZmZlciAqLworICAgICAgICBhc3NlcnQoc2tpcCtsZW4gPCBJTlRfTUFYKTsKKyAgICAgICAgcyA9IHJlYWRhaGVhZF9nZXRfbGluZV9za2lwKAorICAgICAgICAgICAgZiwgKGludCkoc2tpcCtsZW4pLCBidWZzaXplICsgKGJ1ZnNpemU+PjIpICk7CisgICAgICAgIGlmIChzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG1lbWNweShQeVN0cmluZ19BU19TVFJJTkcocykrc2tpcCwgYnVmcHRyLCBsZW4pOworICAgICAgICBQeU1lbV9GcmVlKGJ1Zik7CisgICAgfQorICAgIHJldHVybiBzOwogfQogCiAvKiBBIGxhcmdlciBidWZmZXIgc2l6ZSBtYXkgYWN0dWFsbHkgZGVjcmVhc2UgcGVyZm9ybWFuY2UuICovCkBAIC0yMTMxLDEyMiArMjEzMSwxMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWxlX2l0ZXJuZXh0KFB5RmlsZU9iamVjdCAqZikKIHsKLQlQeVN0cmluZ09iamVjdCogbDsKKyAgICBQeVN0cmluZ09iamVjdCogbDsKIAotCWlmIChmLT5mX2ZwID09IE5VTEwpCi0JCXJldHVybiBlcnJfY2xvc2VkKCk7Ci0JaWYgKCFmLT5yZWFkYWJsZSkKLQkJcmV0dXJuIGVycl9tb2RlKCJyZWFkaW5nIik7CisgICAgaWYgKGYtPmZfZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycl9jbG9zZWQoKTsKKyAgICBpZiAoIWYtPnJlYWRhYmxlKQorICAgICAgICByZXR1cm4gZXJyX21vZGUoInJlYWRpbmciKTsKIAotCWwgPSByZWFkYWhlYWRfZ2V0X2xpbmVfc2tpcChmLCAwLCBSRUFEQUhFQURfQlVGU0laRSk7Ci0JaWYgKGwgPT0gTlVMTCB8fCBQeVN0cmluZ19HRVRfU0laRShsKSA9PSAwKSB7Ci0JCVB5X1hERUNSRUYobCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbDsKKyAgICBsID0gcmVhZGFoZWFkX2dldF9saW5lX3NraXAoZiwgMCwgUkVBREFIRUFEX0JVRlNJWkUpOworICAgIGlmIChsID09IE5VTEwgfHwgUHlTdHJpbmdfR0VUX1NJWkUobCkgPT0gMCkgeworICAgICAgICBQeV9YREVDUkVGKGwpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWw7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGZpbGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCXN0YXRpYyBQeU9iamVjdCAqbm90X3lldF9zdHJpbmc7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgc3RhdGljIFB5T2JqZWN0ICpub3RfeWV0X3N0cmluZzsKIAotCWFzc2VydCh0eXBlICE9IE5VTEwgJiYgdHlwZS0+dHBfYWxsb2MgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHR5cGUgIT0gTlVMTCAmJiB0eXBlLT50cF9hbGxvYyAhPSBOVUxMKTsKIAotCWlmIChub3RfeWV0X3N0cmluZyA9PSBOVUxMKSB7Ci0JCW5vdF95ZXRfc3RyaW5nID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiPHVuaW5pdGlhbGl6ZWQgZmlsZT4iKTsKLQkJaWYgKG5vdF95ZXRfc3RyaW5nID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKG5vdF95ZXRfc3RyaW5nID09IE5VTEwpIHsKKyAgICAgICAgbm90X3lldF9zdHJpbmcgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCI8dW5pbml0aWFsaXplZCBmaWxlPiIpOworICAgICAgICBpZiAobm90X3lldF9zdHJpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAoc2VsZiAhPSBOVUxMKSB7Ci0JCS8qIEFsd2F5cyBmaWxsIGluIHRoZSBuYW1lIGFuZCBtb2RlLCBzbyB0aGF0IG5vYm9keSBlbHNlCi0JCSAgIG5lZWRzIHRvIHNwZWNpYWwtY2FzZSBOVUxMcyB0aGVyZS4gKi8KLQkJUHlfSU5DUkVGKG5vdF95ZXRfc3RyaW5nKTsKLQkJKChQeUZpbGVPYmplY3QgKilzZWxmKS0+Zl9uYW1lID0gbm90X3lldF9zdHJpbmc7Ci0JCVB5X0lOQ1JFRihub3RfeWV0X3N0cmluZyk7Ci0JCSgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfbW9kZSA9IG5vdF95ZXRfc3RyaW5nOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCSgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfZW5jb2RpbmcgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCSgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfZXJyb3JzID0gUHlfTm9uZTsKLQkJKChQeUZpbGVPYmplY3QgKilzZWxmKS0+d2Vha3JlZmxpc3QgPSBOVUxMOwotCQkoKFB5RmlsZU9iamVjdCAqKXNlbGYpLT51bmxvY2tlZF9jb3VudCA9IDA7Ci0JfQotCXJldHVybiBzZWxmOworICAgIHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAoc2VsZiAhPSBOVUxMKSB7CisgICAgICAgIC8qIEFsd2F5cyBmaWxsIGluIHRoZSBuYW1lIGFuZCBtb2RlLCBzbyB0aGF0IG5vYm9keSBlbHNlCisgICAgICAgICAgIG5lZWRzIHRvIHNwZWNpYWwtY2FzZSBOVUxMcyB0aGVyZS4gKi8KKyAgICAgICAgUHlfSU5DUkVGKG5vdF95ZXRfc3RyaW5nKTsKKyAgICAgICAgKChQeUZpbGVPYmplY3QgKilzZWxmKS0+Zl9uYW1lID0gbm90X3lldF9zdHJpbmc7CisgICAgICAgIFB5X0lOQ1JFRihub3RfeWV0X3N0cmluZyk7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfbW9kZSA9IG5vdF95ZXRfc3RyaW5nOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfZW5jb2RpbmcgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopc2VsZiktPmZfZXJyb3JzID0gUHlfTm9uZTsKKyAgICAgICAgKChQeUZpbGVPYmplY3QgKilzZWxmKS0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgICAgICAoKFB5RmlsZU9iamVjdCAqKXNlbGYpLT51bmxvY2tlZF9jb3VudCA9IDA7CisgICAgfQorICAgIHJldHVybiBzZWxmOwogfQogCiBzdGF0aWMgaW50CiBmaWxlX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeUZpbGVPYmplY3QgKmZvc2VsZiA9IChQeUZpbGVPYmplY3QgKilzZWxmOwotCWludCByZXQgPSAwOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJtb2RlIiwgImJ1ZmZlcmluZyIsIDB9OwotCWNoYXIgKm5hbWUgPSBOVUxMOwotCWNoYXIgKm1vZGUgPSAiciI7Ci0JaW50IGJ1ZnNpemUgPSAtMTsKLQlpbnQgd2lkZWFyZ3VtZW50ID0gMDsKKyAgICBQeUZpbGVPYmplY3QgKmZvc2VsZiA9IChQeUZpbGVPYmplY3QgKilzZWxmOworICAgIGludCByZXQgPSAwOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJtb2RlIiwgImJ1ZmZlcmluZyIsIDB9OworICAgIGNoYXIgKm5hbWUgPSBOVUxMOworICAgIGNoYXIgKm1vZGUgPSAiciI7CisgICAgaW50IGJ1ZnNpemUgPSAtMTsKKyAgICBpbnQgd2lkZWFyZ3VtZW50ID0gMDsKIAotCWFzc2VydChQeUZpbGVfQ2hlY2soc2VsZikpOwotCWlmIChmb3NlbGYtPmZfZnAgIT0gTlVMTCkgewotCQkvKiBIYXZlIHRvIGNsb3NlIHRoZSBleGlzdGluZyBmaWxlIGZpcnN0LiAqLwotCQlQeU9iamVjdCAqY2xvc2VyZXN1bHQgPSBmaWxlX2Nsb3NlKGZvc2VsZik7Ci0JCWlmIChjbG9zZXJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYoY2xvc2VyZXN1bHQpOwotCX0KKyAgICBhc3NlcnQoUHlGaWxlX0NoZWNrKHNlbGYpKTsKKyAgICBpZiAoZm9zZWxmLT5mX2ZwICE9IE5VTEwpIHsKKyAgICAgICAgLyogSGF2ZSB0byBjbG9zZSB0aGUgZXhpc3RpbmcgZmlsZSBmaXJzdC4gKi8KKyAgICAgICAgUHlPYmplY3QgKmNsb3NlcmVzdWx0ID0gZmlsZV9jbG9zZShmb3NlbGYpOworICAgICAgICBpZiAoY2xvc2VyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKGNsb3NlcmVzdWx0KTsKKyAgICB9CiAKICNpZmRlZiBQeV9XSU5fV0lERV9GSUxFTkFNRVMKLQlpZiAoR2V0VmVyc2lvbigpIDwgMHg4MDAwMDAwMCkgeyAgICAvKiBPbiBOVCwgc28gd2lkZSBBUEkgYXZhaWxhYmxlICovCi0JCVB5T2JqZWN0ICpwbzsKLQkJaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiVXxzaTpmaWxlIiwKLQkJCQkJCWt3bGlzdCwgJnBvLCAmbW9kZSwgJmJ1ZnNpemUpKSB7Ci0JCQl3aWRlYXJndW1lbnQgPSAxOwotCQkJaWYgKGZpbGxfZmlsZV9maWVsZHMoZm9zZWxmLCBOVUxMLCBwbywgbW9kZSwKLQkJCQkJICAgICBmY2xvc2UpID09IE5VTEwpCi0JCQkJZ290byBFcnJvcjsKLQkJfSBlbHNlIHsKLQkJCS8qIERyb3AgdGhlIGFyZ3VtZW50IHBhcnNpbmcgZXJyb3IgYXMgbmFycm93Ci0JCQkgICBzdHJpbmdzIGFyZSBhbHNvIHZhbGlkLiAqLwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCX0KKyAgICBpZiAoR2V0VmVyc2lvbigpIDwgMHg4MDAwMDAwMCkgeyAgICAvKiBPbiBOVCwgc28gd2lkZSBBUEkgYXZhaWxhYmxlICovCisgICAgICAgIFB5T2JqZWN0ICpwbzsKKyAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiVXxzaTpmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZwbywgJm1vZGUsICZidWZzaXplKSkgeworICAgICAgICAgICAgd2lkZWFyZ3VtZW50ID0gMTsKKyAgICAgICAgICAgIGlmIChmaWxsX2ZpbGVfZmllbGRzKGZvc2VsZiwgTlVMTCwgcG8sIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UpID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIERyb3AgdGhlIGFyZ3VtZW50IHBhcnNpbmcgZXJyb3IgYXMgbmFycm93CisgICAgICAgICAgICAgICBzdHJpbmdzIGFyZSBhbHNvIHZhbGlkLiAqLworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgogCi0JaWYgKCF3aWRlYXJndW1lbnQpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqb19uYW1lOworICAgIGlmICghd2lkZWFyZ3VtZW50KSB7CisgICAgICAgIFB5T2JqZWN0ICpvX25hbWU7CiAKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgImV0fHNpOmZpbGUiLCBrd2xpc3QsCi0JCQkJCQkgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywKLQkJCQkJCSAmbmFtZSwKLQkJCQkJCSAmbW9kZSwgJmJ1ZnNpemUpKQotCQkJcmV0dXJuIC0xOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiZXR8c2k6ZmlsZSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLCAmYnVmc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgICAgICAgICAvKiBXZSBwYXJzZSBhZ2FpbiB0byBnZXQgdGhlIG5hbWUgYXMgYSBQeU9iamVjdCAqLwotICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfHNpOmZpbGUiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZvX25hbWUsICZtb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmc2l6ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICAvKiBXZSBwYXJzZSBhZ2FpbiB0byBnZXQgdGhlIG5hbWUgYXMgYSBQeU9iamVjdCAqLworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xzaTpmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmb19uYW1lLCAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZnNpemUpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKIAotCQlpZiAoZmlsbF9maWxlX2ZpZWxkcyhmb3NlbGYsIE5VTEwsIG9fbmFtZSwgbW9kZSwKLQkJCQkgICAgIGZjbG9zZSkgPT0gTlVMTCkKLQkJCWdvdG8gRXJyb3I7Ci0JfQotCWlmIChvcGVuX3RoZV9maWxlKGZvc2VsZiwgbmFtZSwgbW9kZSkgPT0gTlVMTCkKLQkJZ290byBFcnJvcjsKLQlmb3NlbGYtPmZfc2V0YnVmID0gTlVMTDsKLQlQeUZpbGVfU2V0QnVmU2l6ZShzZWxmLCBidWZzaXplKTsKLQlnb3RvIERvbmU7CisgICAgICAgIGlmIChmaWxsX2ZpbGVfZmllbGRzKGZvc2VsZiwgTlVMTCwgb19uYW1lLCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UpID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBpZiAob3Blbl90aGVfZmlsZShmb3NlbGYsIG5hbWUsIG1vZGUpID09IE5VTEwpCisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgZm9zZWxmLT5mX3NldGJ1ZiA9IE5VTEw7CisgICAgUHlGaWxlX1NldEJ1ZlNpemUoc2VsZiwgYnVmc2l6ZSk7CisgICAgZ290byBEb25lOwogCiBFcnJvcjoKLQlyZXQgPSAtMTsKLQkvKiBmYWxsIHRocm91Z2ggKi8KKyAgICByZXQgPSAtMTsKKyAgICAvKiBmYWxsIHRocm91Z2ggKi8KIERvbmU6Ci0JUHlNZW1fRnJlZShuYW1lKTsgLyogZnJlZSB0aGUgZW5jb2RlZCBzdHJpbmcgKi8KLQlyZXR1cm4gcmV0OworICAgIFB5TWVtX0ZyZWUobmFtZSk7IC8qIGZyZWUgdGhlIGVuY29kZWQgc3RyaW5nICovCisgICAgcmV0dXJuIHJldDsKIH0KIAogUHlEb2NfVkFSKGZpbGVfZG9jKSA9CkBAIC0yMjczLDQ2ICsyMjczLDQ2IEBACiApOwogCiBQeVR5cGVPYmplY3QgUHlGaWxlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZmlsZSIsCi0Jc2l6ZW9mKFB5RmlsZU9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilmaWxlX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkgCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkgCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZmlsZV9yZXByLCAJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JLyogc29mdHNwYWNlIGlzIHdyaXRhYmxlOiAgd2UgbXVzdCBzdXBwbHkgdHBfc2V0YXR0cm8gKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMsIC8qIHRwX2ZsYWdzICovCi0JZmlsZV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKFB5RmlsZU9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylmaWxlX3NlbGYsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZmlsZV9pdGVybmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZmlsZV9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JZmlsZV9tZW1iZXJsaXN0LAkJCS8qIHRwX21lbWJlcnMgKi8KLQlmaWxlX2dldHNldGxpc3QsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQlmaWxlX2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JZmlsZV9uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZmlsZSIsCisgICAgc2l6ZW9mKFB5RmlsZU9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilmaWxlX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWZpbGVfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgLyogc29mdHNwYWNlIGlzIHdyaXRhYmxlOiAgd2UgbXVzdCBzdXBwbHkgdHBfc2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAvKiB0cF9mbGFncyAqLworICAgIGZpbGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlGaWxlT2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylmaWxlX3NlbGYsICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZmlsZV9pdGVybmV4dCwgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBmaWxlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBmaWxlX21lbWJlcmxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBmaWxlX2dldHNldGxpc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICBmaWxlX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgZmlsZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogSW50ZXJmYWNlIGZvciB0aGUgJ3NvZnQgc3BhY2UnIGJldHdlZW4gcHJpbnQgaXRlbXMuICovCkBAIC0yMzIwLDM1ICsyMzIwLDM1IEBACiBpbnQKIFB5RmlsZV9Tb2Z0U3BhY2UoUHlPYmplY3QgKmYsIGludCBuZXdmbGFnKQogewotCWxvbmcgb2xkZmxhZyA9IDA7Ci0JaWYgKGYgPT0gTlVMTCkgewotCQkvKiBEbyBub3RoaW5nICovCi0JfQotCWVsc2UgaWYgKFB5RmlsZV9DaGVjayhmKSkgewotCQlvbGRmbGFnID0gKChQeUZpbGVPYmplY3QgKilmKS0+Zl9zb2Z0c3BhY2U7Ci0JCSgoUHlGaWxlT2JqZWN0ICopZiktPmZfc29mdHNwYWNlID0gbmV3ZmxhZzsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICp2OwotCQl2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhmLCAic29mdHNwYWNlIik7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlIHsKLQkJCWlmIChQeUludF9DaGVjayh2KSkKLQkJCQlvbGRmbGFnID0gUHlJbnRfQXNMb25nKHYpOwotCQkJYXNzZXJ0KG9sZGZsYWcgPCBJTlRfTUFYKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJfQotCQl2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbmV3ZmxhZyk7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlQeUVycl9DbGVhcigpOwotCQllbHNlIHsKLQkJCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGYsICJzb2Z0c3BhY2UiLCB2KSAhPSAwKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCX0KLQl9Ci0JcmV0dXJuIChpbnQpb2xkZmxhZzsKKyAgICBsb25nIG9sZGZsYWcgPSAwOworICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgLyogRG8gbm90aGluZyAqLworICAgIH0KKyAgICBlbHNlIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKKyAgICAgICAgb2xkZmxhZyA9ICgoUHlGaWxlT2JqZWN0ICopZiktPmZfc29mdHNwYWNlOworICAgICAgICAoKFB5RmlsZU9iamVjdCAqKWYpLT5mX3NvZnRzcGFjZSA9IG5ld2ZsYWc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgdiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZiwgInNvZnRzcGFjZSIpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikpCisgICAgICAgICAgICAgICAgb2xkZmxhZyA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgICAgIGFzc2VydChvbGRmbGFnIDwgSU5UX01BWCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIH0KKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKW5ld2ZsYWcpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhmLCAic29mdHNwYWNlIiwgdikgIT0gMCkKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoaW50KW9sZGZsYWc7CiB9CiAKIC8qIEludGVyZmFjZXMgdG8gd3JpdGUgb2JqZWN0cy9zdHJpbmdzIHRvIGZpbGUtbGlrZSBvYmplY3RzICovCkBAIC0yMzU2LDEwNyArMjM1NiwxMDcgQEAKIGludAogUHlGaWxlX1dyaXRlT2JqZWN0KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqZiwgaW50IGZsYWdzKQogewotCVB5T2JqZWN0ICp3cml0ZXIsICp2YWx1ZSwgKmFyZ3MsICpyZXN1bHQ7Ci0JaWYgKGYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAid3JpdGVvYmplY3Qgd2l0aCBOVUxMIGZpbGUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKLQkJUHlGaWxlT2JqZWN0ICpmb2JqID0gKFB5RmlsZU9iamVjdCAqKSBmOworICAgIFB5T2JqZWN0ICp3cml0ZXIsICp2YWx1ZSwgKmFyZ3MsICpyZXN1bHQ7CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAid3JpdGVvYmplY3Qgd2l0aCBOVUxMIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKKyAgICAgICAgUHlGaWxlT2JqZWN0ICpmb2JqID0gKFB5RmlsZU9iamVjdCAqKSBmOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJUHlPYmplY3QgKmVuYyA9IGZvYmotPmZfZW5jb2Rpbmc7Ci0JCWludCByZXN1bHQ7CisgICAgICAgIFB5T2JqZWN0ICplbmMgPSBmb2JqLT5mX2VuY29kaW5nOworICAgICAgICBpbnQgcmVzdWx0OwogI2VuZGlmCi0JCWlmIChmb2JqLT5mX2ZwID09IE5VTEwpIHsKLQkJCWVycl9jbG9zZWQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQorICAgICAgICBpZiAoZm9iai0+Zl9mcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcnJfY2xvc2VkKCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0gICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIFB5X1BSSU5UX1JBVykgJiYKLQkJICAgIFB5VW5pY29kZV9DaGVjayh2KSAmJiBlbmMgIT0gUHlfTm9uZSkgewotCQkJY2hhciAqY2VuYyA9IFB5U3RyaW5nX0FTX1NUUklORyhlbmMpOwotCQkJY2hhciAqZXJyb3JzID0gZm9iai0+Zl9lcnJvcnMgPT0gUHlfTm9uZSA/IAotCQkJICAic3RyaWN0IiA6IFB5U3RyaW5nX0FTX1NUUklORyhmb2JqLT5mX2Vycm9ycyk7Ci0JCQl2YWx1ZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodiwgY2VuYywgZXJyb3JzKTsKLQkJCWlmICh2YWx1ZSA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJfSBlbHNlIHsKLQkJCXZhbHVlID0gdjsKLQkJCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JCX0KLQkJcmVzdWx0ID0gZmlsZV9QeU9iamVjdF9QcmludCh2YWx1ZSwgZm9iaiwgZmxhZ3MpOwotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlyZXR1cm4gcmVzdWx0OworICAgICAgICBpZiAoKGZsYWdzICYgUHlfUFJJTlRfUkFXKSAmJgorICAgICAgICAgICAgUHlVbmljb2RlX0NoZWNrKHYpICYmIGVuYyAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBjaGFyICpjZW5jID0gUHlTdHJpbmdfQVNfU1RSSU5HKGVuYyk7CisgICAgICAgICAgICBjaGFyICplcnJvcnMgPSBmb2JqLT5mX2Vycm9ycyA9PSBQeV9Ob25lID8KKyAgICAgICAgICAgICAgInN0cmljdCIgOiBQeVN0cmluZ19BU19TVFJJTkcoZm9iai0+Zl9lcnJvcnMpOworICAgICAgICAgICAgdmFsdWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHYsIGNlbmMsIGVycm9ycyk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZSA9IHY7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IGZpbGVfUHlPYmplY3RfUHJpbnQodmFsdWUsIGZvYmosIGZsYWdzKTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICNlbHNlCi0JCXJldHVybiBmaWxlX1B5T2JqZWN0X1ByaW50KHYsIGZvYmosIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIGZpbGVfUHlPYmplY3RfUHJpbnQodiwgZm9iaiwgZmxhZ3MpOwogI2VuZGlmCi0JfQotCXdyaXRlciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZiwgIndyaXRlIik7Ci0JaWYgKHdyaXRlciA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGZsYWdzICYgUHlfUFJJTlRfUkFXKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2OwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gUHlPYmplY3RfU3RyKHYpOwotCX0KLSAgICAgICAgZWxzZQotCQl2YWx1ZSA9IFB5T2JqZWN0X1JlcHIodik7Ci0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHdyaXRlcik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodmFsdWUpOwotCQlQeV9ERUNSRUYod3JpdGVyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdCh3cml0ZXIsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYodmFsdWUpOwotCVB5X0RFQ1JFRih3cml0ZXIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJldHVybiAwOworICAgIH0KKyAgICB3cml0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGYsICJ3cml0ZSIpOworICAgIGlmICh3cml0ZXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChmbGFncyAmIFB5X1BSSU5UX1JBVykgeworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHY7CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHZhbHVlID0gUHlPYmplY3RfU3RyKHYpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHZhbHVlID0gUHlPYmplY3RfUmVwcih2KTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYod3JpdGVyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHZhbHVlKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIFB5X0RFQ1JFRih3cml0ZXIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KHdyaXRlciwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgUHlfREVDUkVGKHdyaXRlcik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlGaWxlX1dyaXRlU3RyaW5nKGNvbnN0IGNoYXIgKnMsIFB5T2JqZWN0ICpmKQogewogCi0JaWYgKGYgPT0gTlVMTCkgewotCQkvKiBTaG91bGQgYmUgY2F1c2VkIGJ5IGEgcHJlLWV4aXN0aW5nIGVycm9yICovCi0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJIm51bGwgZmlsZSBmb3IgUHlGaWxlX1dyaXRlU3RyaW5nIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZWxzZSBpZiAoUHlGaWxlX0NoZWNrKGYpKSB7Ci0JCVB5RmlsZU9iamVjdCAqZm9iaiA9IChQeUZpbGVPYmplY3QgKikgZjsKLQkJRklMRSAqZnAgPSBQeUZpbGVfQXNGaWxlKGYpOwotCQlpZiAoZnAgPT0gTlVMTCkgewotCQkJZXJyX2Nsb3NlZCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUZJTEVfQkVHSU5fQUxMT1dfVEhSRUFEUyhmb2JqKQotCQlmcHV0cyhzLCBmcCk7Ci0JCUZJTEVfRU5EX0FMTE9XX1RIUkVBRFMoZm9iaikKLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKLQkJaW50IGVycjsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHYsIGYsIFB5X1BSSU5UX1JBVyk7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gLTE7CisgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICAvKiBTaG91bGQgYmUgY2F1c2VkIGJ5IGEgcHJlLWV4aXN0aW5nIGVycm9yICovCisgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBmaWxlIGZvciBQeUZpbGVfV3JpdGVTdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIGlmIChQeUZpbGVfQ2hlY2soZikpIHsKKyAgICAgICAgUHlGaWxlT2JqZWN0ICpmb2JqID0gKFB5RmlsZU9iamVjdCAqKSBmOworICAgICAgICBGSUxFICpmcCA9IFB5RmlsZV9Bc0ZpbGUoZik7CisgICAgICAgIGlmIChmcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBlcnJfY2xvc2VkKCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgRklMRV9CRUdJTl9BTExPV19USFJFQURTKGZvYmopCisgICAgICAgIGZwdXRzKHMsIGZwKTsKKyAgICAgICAgRklMRV9FTkRfQUxMT1dfVEhSRUFEUyhmb2JqKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgICAgICBpbnQgZXJyOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QodiwgZiwgUHlfUFJJTlRfUkFXKTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKIH0KIAogLyogVHJ5IHRvIGdldCBhIGZpbGUtZGVzY3JpcHRvciBmcm9tIGEgUHl0aG9uIG9iamVjdC4gIElmIHRoZSBvYmplY3QKQEAgLTI0NjgsNTAgKzI0NjgsNTAgQEAKIAogaW50IFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IoUHlPYmplY3QgKm8pCiB7Ci0JaW50IGZkOwotCVB5T2JqZWN0ICptZXRoOworICAgIGludCBmZDsKKyAgICBQeU9iamVjdCAqbWV0aDsKIAotCWlmIChQeUludF9DaGVjayhvKSkgewotCQlmZCA9IFB5SW50X0FzTG9uZyhvKTsKLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKG8pKSB7Ci0JCWZkID0gUHlMb25nX0FzTG9uZyhvKTsKLQl9Ci0JZWxzZSBpZiAoKG1ldGggPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sICJmaWxlbm8iKSkgIT0gTlVMTCkKLQl7Ci0JCVB5T2JqZWN0ICpmbm8gPSBQeUV2YWxfQ2FsbE9iamVjdChtZXRoLCBOVUxMKTsKLQkJUHlfREVDUkVGKG1ldGgpOwotCQlpZiAoZm5vID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7CisgICAgaWYgKFB5SW50X0NoZWNrKG8pKSB7CisgICAgICAgIGZkID0gUHlJbnRfQXNMb25nKG8pOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2sobykpIHsKKyAgICAgICAgZmQgPSBQeUxvbmdfQXNMb25nKG8pOworICAgIH0KKyAgICBlbHNlIGlmICgobWV0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgImZpbGVubyIpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKmZubyA9IFB5RXZhbF9DYWxsT2JqZWN0KG1ldGgsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgICAgIGlmIChmbm8gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQlpZiAoUHlJbnRfQ2hlY2soZm5vKSkgewotCQkJZmQgPSBQeUludF9Bc0xvbmcoZm5vKTsKLQkJCVB5X0RFQ1JFRihmbm8pOwotCQl9Ci0JCWVsc2UgaWYgKFB5TG9uZ19DaGVjayhmbm8pKSB7Ci0JCQlmZCA9IFB5TG9uZ19Bc0xvbmcoZm5vKTsKLQkJCVB5X0RFQ1JFRihmbm8pOwotCQl9Ci0JCWVsc2UgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImZpbGVubygpIHJldHVybmVkIGEgbm9uLWludGVnZXIiKTsKLQkJCVB5X0RFQ1JFRihmbm8pOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhcmd1bWVudCBtdXN0IGJlIGFuIGludCwgb3IgaGF2ZSBhIGZpbGVubygpIG1ldGhvZC4iKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKGZubykpIHsKKyAgICAgICAgICAgIGZkID0gUHlJbnRfQXNMb25nKGZubyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZm5vKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soZm5vKSkgeworICAgICAgICAgICAgZmQgPSBQeUxvbmdfQXNMb25nKGZubyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZm5vKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGVubygpIHJldHVybmVkIGEgbm9uLWludGVnZXIiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmbm8pOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IG11c3QgYmUgYW4gaW50LCBvciBoYXZlIGEgZmlsZW5vKCkgbWV0aG9kLiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKGZkIDwgMCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImZpbGUgZGVzY3JpcHRvciBjYW5ub3QgYmUgYSBuZWdhdGl2ZSBpbnRlZ2VyICglaSkiLAotCQkJICAgICBmZCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIGZkOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZmlsZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSBhIG5lZ2F0aXZlIGludGVnZXIgKCVpKSIsCisgICAgICAgICAgICAgICAgICAgICBmZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGZkOwogfQogCiAvKiBGcm9tIGhlcmUgb24gd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIHJlYWwgZmdldHMgYW5kIGZyZWFkICovCkBAIC0yNTM1LDc5ICsyNTM1LDc5IEBACiBjaGFyICoKIFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhjaGFyICpidWYsIGludCBuLCBGSUxFICpzdHJlYW0sIFB5T2JqZWN0ICpmb2JqKQogewotCWNoYXIgKnAgPSBidWY7Ci0JaW50IGM7Ci0JaW50IG5ld2xpbmV0eXBlcyA9IDA7Ci0JaW50IHNraXBuZXh0bGYgPSAwOwotCWludCB1bml2X25ld2xpbmUgPSAxOworICAgIGNoYXIgKnAgPSBidWY7CisgICAgaW50IGM7CisgICAgaW50IG5ld2xpbmV0eXBlcyA9IDA7CisgICAgaW50IHNraXBuZXh0bGYgPSAwOworICAgIGludCB1bml2X25ld2xpbmUgPSAxOwogCi0JaWYgKGZvYmopIHsKLQkJaWYgKCFQeUZpbGVfQ2hlY2soZm9iaikpIHsKLQkJCWVycm5vID0gRU5YSU87CS8qIFdoYXQgY2FuIHlvdSBkby4uLiAqLwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJdW5pdl9uZXdsaW5lID0gKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl91bml2X25ld2xpbmU7Ci0JCWlmICggIXVuaXZfbmV3bGluZSApCi0JCQlyZXR1cm4gZmdldHMoYnVmLCBuLCBzdHJlYW0pOwotCQluZXdsaW5ldHlwZXMgPSAoKFB5RmlsZU9iamVjdCAqKWZvYmopLT5mX25ld2xpbmV0eXBlczsKLQkJc2tpcG5leHRsZiA9ICgoUHlGaWxlT2JqZWN0ICopZm9iaiktPmZfc2tpcG5leHRsZjsKLQl9Ci0JRkxPQ0tGSUxFKHN0cmVhbSk7Ci0JYyA9ICd4JzsgLyogU2h1dCB1cCBnY2Mgd2FybmluZyAqLwotCXdoaWxlICgtLW4gPiAwICYmIChjID0gR0VUQyhzdHJlYW0pKSAhPSBFT0YgKSB7Ci0JCWlmIChza2lwbmV4dGxmICkgewotCQkJc2tpcG5leHRsZiA9IDA7Ci0JCQlpZiAoYyA9PSAnXG4nKSB7Ci0JCQkJLyogU2VlaW5nIGEgXG4gaGVyZSB3aXRoIHNraXBuZXh0bGYgdHJ1ZQotCQkJCSoqIG1lYW5zIHdlIHNhdyBhIFxyIGJlZm9yZS4KLQkJCQkqLwotCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7Ci0JCQkJYyA9IEdFVEMoc3RyZWFtKTsKLQkJCQlpZiAoYyA9PSBFT0YpIGJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSoqIE5vdGUgdGhhdCBjID09IEVPRiBhbHNvIGJyaW5ncyB1cyBoZXJlLAotCQkJCSoqIHNvIHdlJ3JlIG9rYXkgaWYgdGhlIGxhc3QgY2hhciBpbiB0aGUgZmlsZQotCQkJCSoqIGlzIGEgQ1IuCi0JCQkJKi8KLQkJCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKLQkJCX0KLQkJfQotCQlpZiAoYyA9PSAnXHInKSB7Ci0JCQkvKiBBIFxyIGlzIHRyYW5zbGF0ZWQgaW50byBhIFxuLCBhbmQgd2Ugc2tpcAotCQkJKiogYW4gYWRqYWNlbnQgXG4sIGlmIGFueS4gV2UgZG9uJ3Qgc2V0IHRoZQotCQkJKiogbmV3bGluZXR5cGVzIGZsYWcgdW50aWwgd2UndmUgc2VlbiB0aGUgbmV4dCBjaGFyLgotCQkJKi8KLQkJCXNraXBuZXh0bGYgPSAxOwotCQkJYyA9ICdcbic7Ci0JCX0gZWxzZSBpZiAoIGMgPT0gJ1xuJykgewotCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7Ci0JCX0KLQkJKnArKyA9IGM7Ci0JCWlmIChjID09ICdcbicpIGJyZWFrOwotCX0KLQlpZiAoIGMgPT0gRU9GICYmIHNraXBuZXh0bGYgKQotCQluZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKLQlGVU5MT0NLRklMRShzdHJlYW0pOwotCSpwID0gJ1wwJzsKLQlpZiAoZm9iaikgewotCQkoKFB5RmlsZU9iamVjdCAqKWZvYmopLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKLQkJKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl9za2lwbmV4dGxmID0gc2tpcG5leHRsZjsKLQl9IGVsc2UgaWYgKCBza2lwbmV4dGxmICkgewotCQkvKiBJZiB3ZSBoYXZlIG5vIGZpbGUgb2JqZWN0IHdlIGNhbm5vdCBzYXZlIHRoZQotCQkqKiBza2lwbmV4dGxmIGZsYWcuIFdlIGhhdmUgdG8gcmVhZGFoZWFkLCB3aGljaAotCQkqKiB3aWxsIGNhdXNlIGEgcGF1c2UgaWYgd2UncmUgcmVhZGluZyBmcm9tIGFuCi0JCSoqIGludGVyYWN0aXZlIHN0cmVhbSwgYnV0IHRoYXQgaXMgdmVyeSB1bmxpa2VseQotCQkqKiB1bmxlc3Mgd2UncmUgZG9pbmcgc29tZXRoaW5nIHNpbGx5IGxpa2UKLQkJKiogZXhlY2ZpbGUoIi9kZXYvdHR5IikuCi0JCSovCi0JCWMgPSBHRVRDKHN0cmVhbSk7Ci0JCWlmICggYyAhPSAnXG4nICkKLQkJCXVuZ2V0YyhjLCBzdHJlYW0pOwotCX0KLQlpZiAocCA9PSBidWYpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBidWY7CisgICAgaWYgKGZvYmopIHsKKyAgICAgICAgaWYgKCFQeUZpbGVfQ2hlY2soZm9iaikpIHsKKyAgICAgICAgICAgIGVycm5vID0gRU5YSU87ICAgICAgICAgICAgICAvKiBXaGF0IGNhbiB5b3UgZG8uLi4gKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHVuaXZfbmV3bGluZSA9ICgoUHlGaWxlT2JqZWN0ICopZm9iaiktPmZfdW5pdl9uZXdsaW5lOworICAgICAgICBpZiAoICF1bml2X25ld2xpbmUgKQorICAgICAgICAgICAgcmV0dXJuIGZnZXRzKGJ1Ziwgbiwgc3RyZWFtKTsKKyAgICAgICAgbmV3bGluZXR5cGVzID0gKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl9uZXdsaW5ldHlwZXM7CisgICAgICAgIHNraXBuZXh0bGYgPSAoKFB5RmlsZU9iamVjdCAqKWZvYmopLT5mX3NraXBuZXh0bGY7CisgICAgfQorICAgIEZMT0NLRklMRShzdHJlYW0pOworICAgIGMgPSAneCc7IC8qIFNodXQgdXAgZ2NjIHdhcm5pbmcgKi8KKyAgICB3aGlsZSAoLS1uID4gMCAmJiAoYyA9IEdFVEMoc3RyZWFtKSkgIT0gRU9GICkgeworICAgICAgICBpZiAoc2tpcG5leHRsZiApIHsKKyAgICAgICAgICAgIHNraXBuZXh0bGYgPSAwOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIC8qIFNlZWluZyBhIFxuIGhlcmUgd2l0aCBza2lwbmV4dGxmIHRydWUKKyAgICAgICAgICAgICAgICAqKiBtZWFucyB3ZSBzYXcgYSBcciBiZWZvcmUuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUkxGOworICAgICAgICAgICAgICAgIGMgPSBHRVRDKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gRU9GKSBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqKiBOb3RlIHRoYXQgYyA9PSBFT0YgYWxzbyBicmluZ3MgdXMgaGVyZSwKKyAgICAgICAgICAgICAgICAqKiBzbyB3ZSdyZSBva2F5IGlmIHRoZSBsYXN0IGNoYXIgaW4gdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAqKiBpcyBhIENSLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJ1xyJykgeworICAgICAgICAgICAgLyogQSBcciBpcyB0cmFuc2xhdGVkIGludG8gYSBcbiwgYW5kIHdlIHNraXAKKyAgICAgICAgICAgICoqIGFuIGFkamFjZW50IFxuLCBpZiBhbnkuIFdlIGRvbid0IHNldCB0aGUKKyAgICAgICAgICAgICoqIG5ld2xpbmV0eXBlcyBmbGFnIHVudGlsIHdlJ3ZlIHNlZW4gdGhlIG5leHQgY2hhci4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBza2lwbmV4dGxmID0gMTsKKyAgICAgICAgICAgIGMgPSAnXG4nOworICAgICAgICB9IGVsc2UgaWYgKCBjID09ICdcbicpIHsKKyAgICAgICAgICAgIG5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0xGOworICAgICAgICB9CisgICAgICAgICpwKysgPSBjOworICAgICAgICBpZiAoYyA9PSAnXG4nKSBicmVhazsKKyAgICB9CisgICAgaWYgKCBjID09IEVPRiAmJiBza2lwbmV4dGxmICkKKyAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7CisgICAgRlVOTE9DS0ZJTEUoc3RyZWFtKTsKKyAgICAqcCA9ICdcMCc7CisgICAgaWYgKGZvYmopIHsKKyAgICAgICAgKChQeUZpbGVPYmplY3QgKilmb2JqKS0+Zl9uZXdsaW5ldHlwZXMgPSBuZXdsaW5ldHlwZXM7CisgICAgICAgICgoUHlGaWxlT2JqZWN0ICopZm9iaiktPmZfc2tpcG5leHRsZiA9IHNraXBuZXh0bGY7CisgICAgfSBlbHNlIGlmICggc2tpcG5leHRsZiApIHsKKyAgICAgICAgLyogSWYgd2UgaGF2ZSBubyBmaWxlIG9iamVjdCB3ZSBjYW5ub3Qgc2F2ZSB0aGUKKyAgICAgICAgKiogc2tpcG5leHRsZiBmbGFnLiBXZSBoYXZlIHRvIHJlYWRhaGVhZCwgd2hpY2gKKyAgICAgICAgKiogd2lsbCBjYXVzZSBhIHBhdXNlIGlmIHdlJ3JlIHJlYWRpbmcgZnJvbSBhbgorICAgICAgICAqKiBpbnRlcmFjdGl2ZSBzdHJlYW0sIGJ1dCB0aGF0IGlzIHZlcnkgdW5saWtlbHkKKyAgICAgICAgKiogdW5sZXNzIHdlJ3JlIGRvaW5nIHNvbWV0aGluZyBzaWxseSBsaWtlCisgICAgICAgICoqIGV4ZWNmaWxlKCIvZGV2L3R0eSIpLgorICAgICAgICAqLworICAgICAgICBjID0gR0VUQyhzdHJlYW0pOworICAgICAgICBpZiAoIGMgIT0gJ1xuJyApCisgICAgICAgICAgICB1bmdldGMoYywgc3RyZWFtKTsKKyAgICB9CisgICAgaWYgKHAgPT0gYnVmKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gYnVmOwogfQogCiAvKgpAQCAtMjYyMiw3NCArMjYyMiw3NCBAQAogKi8KIHNpemVfdAogUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKGNoYXIgKmJ1Ziwgc2l6ZV90IG4sCi0JCQkgRklMRSAqc3RyZWFtLCBQeU9iamVjdCAqZm9iaikKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpzdHJlYW0sIFB5T2JqZWN0ICpmb2JqKQogewotCWNoYXIgKmRzdCA9IGJ1ZjsKLQlQeUZpbGVPYmplY3QgKmYgPSAoUHlGaWxlT2JqZWN0ICopZm9iajsKLQlpbnQgbmV3bGluZXR5cGVzLCBza2lwbmV4dGxmOworICAgIGNoYXIgKmRzdCA9IGJ1ZjsKKyAgICBQeUZpbGVPYmplY3QgKmYgPSAoUHlGaWxlT2JqZWN0ICopZm9iajsKKyAgICBpbnQgbmV3bGluZXR5cGVzLCBza2lwbmV4dGxmOwogCi0JYXNzZXJ0KGJ1ZiAhPSBOVUxMKTsKLQlhc3NlcnQoc3RyZWFtICE9IE5VTEwpOworICAgIGFzc2VydChidWYgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0cmVhbSAhPSBOVUxMKTsKIAotCWlmICghZm9iaiB8fCAhUHlGaWxlX0NoZWNrKGZvYmopKSB7Ci0JCWVycm5vID0gRU5YSU87CS8qIFdoYXQgY2FuIHlvdSBkby4uLiAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFmLT5mX3VuaXZfbmV3bGluZSkKLQkJcmV0dXJuIGZyZWFkKGJ1ZiwgMSwgbiwgc3RyZWFtKTsKLQluZXdsaW5ldHlwZXMgPSBmLT5mX25ld2xpbmV0eXBlczsKLQlza2lwbmV4dGxmID0gZi0+Zl9za2lwbmV4dGxmOwotCS8qIEludmFyaWFudDogIG4gaXMgdGhlIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgZmlsbGVkCi0JICogaW4gdGhlIGJ1ZmZlci4KLQkgKi8KLQl3aGlsZSAobikgewotCQlzaXplX3QgbnJlYWQ7Ci0JCWludCBzaG9ydHJlYWQ7Ci0JCWNoYXIgKnNyYyA9IGRzdDsKKyAgICBpZiAoIWZvYmogfHwgIVB5RmlsZV9DaGVjayhmb2JqKSkgeworICAgICAgICBlcnJubyA9IEVOWElPOyAgICAgICAgICAvKiBXaGF0IGNhbiB5b3UgZG8uLi4gKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghZi0+Zl91bml2X25ld2xpbmUpCisgICAgICAgIHJldHVybiBmcmVhZChidWYsIDEsIG4sIHN0cmVhbSk7CisgICAgbmV3bGluZXR5cGVzID0gZi0+Zl9uZXdsaW5ldHlwZXM7CisgICAgc2tpcG5leHRsZiA9IGYtPmZfc2tpcG5leHRsZjsKKyAgICAvKiBJbnZhcmlhbnQ6ICBuIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIGZpbGxlZAorICAgICAqIGluIHRoZSBidWZmZXIuCisgICAgICovCisgICAgd2hpbGUgKG4pIHsKKyAgICAgICAgc2l6ZV90IG5yZWFkOworICAgICAgICBpbnQgc2hvcnRyZWFkOworICAgICAgICBjaGFyICpzcmMgPSBkc3Q7CiAKLQkJbnJlYWQgPSBmcmVhZChkc3QsIDEsIG4sIHN0cmVhbSk7Ci0JCWFzc2VydChucmVhZCA8PSBuKTsKLQkJaWYgKG5yZWFkID09IDApCi0JCQlicmVhazsKKyAgICAgICAgbnJlYWQgPSBmcmVhZChkc3QsIDEsIG4sIHN0cmVhbSk7CisgICAgICAgIGFzc2VydChucmVhZCA8PSBuKTsKKyAgICAgICAgaWYgKG5yZWFkID09IDApCisgICAgICAgICAgICBicmVhazsKIAotCQluIC09IG5yZWFkOyAvKiBhc3N1bWluZyAxIGJ5dGUgb3V0IGZvciBlYWNoIGluOyB3aWxsIGFkanVzdCAqLwotCQlzaG9ydHJlYWQgPSBuICE9IDA7CS8qIHRydWUgaWZmIEVPRiBvciBlcnJvciAqLwotCQl3aGlsZSAobnJlYWQtLSkgewotCQkJY2hhciBjID0gKnNyYysrOwotCQkJaWYgKGMgPT0gJ1xyJykgewotCQkJCS8qIFNhdmUgYXMgTEYgYW5kIHNldCBmbGFnIHRvIHNraXAgbmV4dCBMRi4gKi8KLQkJCQkqZHN0KysgPSAnXG4nOwotCQkJCXNraXBuZXh0bGYgPSAxOwotCQkJfQotCQkJZWxzZSBpZiAoc2tpcG5leHRsZiAmJiBjID09ICdcbicpIHsKLQkJCQkvKiBTa2lwIExGLCBhbmQgcmVtZW1iZXIgd2Ugc2F3IENSIExGLiAqLwotCQkJCXNraXBuZXh0bGYgPSAwOwotCQkJCW5ld2xpbmV0eXBlcyB8PSBORVdMSU5FX0NSTEY7Ci0JCQkJKytuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogTm9ybWFsIGNoYXIgdG8gYmUgc3RvcmVkIGluIGJ1ZmZlci4gIEFsc28KLQkJCQkgKiB1cGRhdGUgdGhlIG5ld2xpbmV0eXBlcyBmbGFnIGlmIGVpdGhlciB0aGlzCi0JCQkJICogaXMgYW4gTEYgb3IgdGhlIHByZXZpb3VzIGNoYXIgd2FzIGEgQ1IuCi0JCQkJICovCi0JCQkJaWYgKGMgPT0gJ1xuJykKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfTEY7Ci0JCQkJZWxzZSBpZiAoc2tpcG5leHRsZikKLQkJCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQkJKmRzdCsrID0gYzsKLQkJCQlza2lwbmV4dGxmID0gMDsKLQkJCX0KLQkJfQotCQlpZiAoc2hvcnRyZWFkKSB7Ci0JCQkvKiBJZiB0aGlzIGlzIEVPRiwgdXBkYXRlIHR5cGUgZmxhZ3MuICovCi0JCQlpZiAoc2tpcG5leHRsZiAmJiBmZW9mKHN0cmVhbSkpCi0JCQkJbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1I7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlmLT5mX25ld2xpbmV0eXBlcyA9IG5ld2xpbmV0eXBlczsKLQlmLT5mX3NraXBuZXh0bGYgPSBza2lwbmV4dGxmOwotCXJldHVybiBkc3QgLSBidWY7CisgICAgICAgIG4gLT0gbnJlYWQ7IC8qIGFzc3VtaW5nIDEgYnl0ZSBvdXQgZm9yIGVhY2ggaW47IHdpbGwgYWRqdXN0ICovCisgICAgICAgIHNob3J0cmVhZCA9IG4gIT0gMDsgICAgICAgICAgICAgLyogdHJ1ZSBpZmYgRU9GIG9yIGVycm9yICovCisgICAgICAgIHdoaWxlIChucmVhZC0tKSB7CisgICAgICAgICAgICBjaGFyIGMgPSAqc3JjKys7CisgICAgICAgICAgICBpZiAoYyA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgLyogU2F2ZSBhcyBMRiBhbmQgc2V0IGZsYWcgdG8gc2tpcCBuZXh0IExGLiAqLworICAgICAgICAgICAgICAgICpkc3QrKyA9ICdcbic7CisgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChza2lwbmV4dGxmICYmIGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIC8qIFNraXAgTEYsIGFuZCByZW1lbWJlciB3ZSBzYXcgQ1IgTEYuICovCisgICAgICAgICAgICAgICAgc2tpcG5leHRsZiA9IDA7CisgICAgICAgICAgICAgICAgbmV3bGluZXR5cGVzIHw9IE5FV0xJTkVfQ1JMRjsKKyAgICAgICAgICAgICAgICArK247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBOb3JtYWwgY2hhciB0byBiZSBzdG9yZWQgaW4gYnVmZmVyLiAgQWxzbworICAgICAgICAgICAgICAgICAqIHVwZGF0ZSB0aGUgbmV3bGluZXR5cGVzIGZsYWcgaWYgZWl0aGVyIHRoaXMKKyAgICAgICAgICAgICAgICAgKiBpcyBhbiBMRiBvciB0aGUgcHJldmlvdXMgY2hhciB3YXMgYSBDUi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9MRjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChza2lwbmV4dGxmKQorICAgICAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBjOworICAgICAgICAgICAgICAgIHNraXBuZXh0bGYgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzaG9ydHJlYWQpIHsKKyAgICAgICAgICAgIC8qIElmIHRoaXMgaXMgRU9GLCB1cGRhdGUgdHlwZSBmbGFncy4gKi8KKyAgICAgICAgICAgIGlmIChza2lwbmV4dGxmICYmIGZlb2Yoc3RyZWFtKSkKKyAgICAgICAgICAgICAgICBuZXdsaW5ldHlwZXMgfD0gTkVXTElORV9DUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGYtPmZfbmV3bGluZXR5cGVzID0gbmV3bGluZXR5cGVzOworICAgIGYtPmZfc2tpcG5leHRsZiA9IHNraXBuZXh0bGY7CisgICAgcmV0dXJuIGRzdCAtIGJ1ZjsKIH0KIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMgYi9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKaW5kZXggMmQwMGMxNi4uYzU1NmRlOGYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZmxvYXRvYmplY3QuYworKysgYi9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKQEAgLTI1LDEzICsyNSwxMyBAQAogI2VuZGlmCiAKIC8qIFNwZWNpYWwgZnJlZSBsaXN0IC0tIHNlZSBjb21tZW50cyBmb3Igc2FtZSBjb2RlIGluIGludG9iamVjdC5jLiAqLwotI2RlZmluZSBCTE9DS19TSVpFCTEwMDAJLyogMUsgbGVzcyB0eXBpY2FsIG1hbGxvYyBvdmVyaGVhZCAqLwotI2RlZmluZSBCSEVBRF9TSVpFCTgJLyogRW5vdWdoIGZvciBhIDY0LWJpdCBwb2ludGVyICovCi0jZGVmaW5lIE5fRkxPQVRPQkpFQ1RTCSgoQkxPQ0tfU0laRSAtIEJIRUFEX1NJWkUpIC8gc2l6ZW9mKFB5RmxvYXRPYmplY3QpKQorI2RlZmluZSBCTE9DS19TSVpFICAgICAgMTAwMCAgICAvKiAxSyBsZXNzIHR5cGljYWwgbWFsbG9jIG92ZXJoZWFkICovCisjZGVmaW5lIEJIRUFEX1NJWkUgICAgICA4ICAgICAgIC8qIEVub3VnaCBmb3IgYSA2NC1iaXQgcG9pbnRlciAqLworI2RlZmluZSBOX0ZMT0FUT0JKRUNUUyAgKChCTE9DS19TSVpFIC0gQkhFQURfU0laRSkgLyBzaXplb2YoUHlGbG9hdE9iamVjdCkpCiAKIHN0cnVjdCBfZmxvYXRibG9jayB7Ci0Jc3RydWN0IF9mbG9hdGJsb2NrICpuZXh0OwotCVB5RmxvYXRPYmplY3Qgb2JqZWN0c1tOX0ZMT0FUT0JKRUNUU107CisgICAgc3RydWN0IF9mbG9hdGJsb2NrICpuZXh0OworICAgIFB5RmxvYXRPYmplY3Qgb2JqZWN0c1tOX0ZMT0FUT0JKRUNUU107CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBfZmxvYXRibG9jayBQeUZsb2F0QmxvY2s7CkBAIC00MiwzMSArNDIsMzEgQEAKIHN0YXRpYyBQeUZsb2F0T2JqZWN0ICoKIGZpbGxfZnJlZV9saXN0KHZvaWQpCiB7Ci0JUHlGbG9hdE9iamVjdCAqcCwgKnE7Ci0JLyogWFhYIEZsb2F0IGJsb2NrcyBlc2NhcGUgdGhlIG9iamVjdCBoZWFwLiBVc2UgUHlPYmplY3RfTUFMTE9DID8/PyAqLwotCXAgPSAoUHlGbG9hdE9iamVjdCAqKSBQeU1lbV9NQUxMT0Moc2l6ZW9mKFB5RmxvYXRCbG9jaykpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiAoUHlGbG9hdE9iamVjdCAqKSBQeUVycl9Ob01lbW9yeSgpOwotCSgoUHlGbG9hdEJsb2NrICopcCktPm5leHQgPSBibG9ja19saXN0OwotCWJsb2NrX2xpc3QgPSAoUHlGbG9hdEJsb2NrICopcDsKLQlwID0gJigoUHlGbG9hdEJsb2NrICopcCktPm9iamVjdHNbMF07Ci0JcSA9IHAgKyBOX0ZMT0FUT0JKRUNUUzsKLQl3aGlsZSAoLS1xID4gcCkKLQkJUHlfVFlQRShxKSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKikocS0xKTsKLQlQeV9UWVBFKHEpID0gTlVMTDsKLQlyZXR1cm4gcCArIE5fRkxPQVRPQkpFQ1RTIC0gMTsKKyAgICBQeUZsb2F0T2JqZWN0ICpwLCAqcTsKKyAgICAvKiBYWFggRmxvYXQgYmxvY2tzIGVzY2FwZSB0aGUgb2JqZWN0IGhlYXAuIFVzZSBQeU9iamVjdF9NQUxMT0MgPz8/ICovCisgICAgcCA9IChQeUZsb2F0T2JqZWN0ICopIFB5TWVtX01BTExPQyhzaXplb2YoUHlGbG9hdEJsb2NrKSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChQeUZsb2F0T2JqZWN0ICopIFB5RXJyX05vTWVtb3J5KCk7CisgICAgKChQeUZsb2F0QmxvY2sgKilwKS0+bmV4dCA9IGJsb2NrX2xpc3Q7CisgICAgYmxvY2tfbGlzdCA9IChQeUZsb2F0QmxvY2sgKilwOworICAgIHAgPSAmKChQeUZsb2F0QmxvY2sgKilwKS0+b2JqZWN0c1swXTsKKyAgICBxID0gcCArIE5fRkxPQVRPQkpFQ1RTOworICAgIHdoaWxlICgtLXEgPiBwKQorICAgICAgICBQeV9UWVBFKHEpID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKShxLTEpOworICAgIFB5X1RZUEUocSkgPSBOVUxMOworICAgIHJldHVybiBwICsgTl9GTE9BVE9CSkVDVFMgLSAxOwogfQogCiBkb3VibGUKIFB5RmxvYXRfR2V0TWF4KHZvaWQpCiB7Ci0JcmV0dXJuIERCTF9NQVg7CisgICAgcmV0dXJuIERCTF9NQVg7CiB9CiAKIGRvdWJsZQogUHlGbG9hdF9HZXRNaW4odm9pZCkKIHsKLQlyZXR1cm4gREJMX01JTjsKKyAgICByZXR1cm4gREJMX01JTjsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBGbG9hdEluZm9UeXBlID0gezAsIDAsIDAsIDAsIDAsIDB9OwpAQCAtNzksODMgKzc5LDgzIEBACiB5b3VyIHN5c3RlbSdzIDpmaWxlOmBmbG9hdC5oYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRmllbGQgZmxvYXRpbmZvX2ZpZWxkc1tdID0gewotCXsibWF4IiwJCSJEQkxfTUFYIC0tIG1heGltdW0gcmVwcmVzZW50YWJsZSBmaW5pdGUgZmxvYXQifSwKLQl7Im1heF9leHAiLAkiREJMX01BWF9FWFAgLS0gbWF4aW11bSBpbnQgZSBzdWNoIHRoYXQgcmFkaXgqKihlLTEpICIKLQkJCSJpcyByZXByZXNlbnRhYmxlIn0sCi0JeyJtYXhfMTBfZXhwIiwJIkRCTF9NQVhfMTBfRVhQIC0tIG1heGltdW0gaW50IGUgc3VjaCB0aGF0IDEwKiplICIKLQkJCSJpcyByZXByZXNlbnRhYmxlIn0sCi0JeyJtaW4iLAkJIkRCTF9NSU4gLS0gTWluaW11bSBwb3NpdGl2ZSBub3JtYWxpemVyIGZsb2F0In0sCi0JeyJtaW5fZXhwIiwJIkRCTF9NSU5fRVhQIC0tIG1pbmltdW0gaW50IGUgc3VjaCB0aGF0IHJhZGl4KiooZS0xKSAiCi0JCQkiaXMgYSBub3JtYWxpemVkIGZsb2F0In0sCi0JeyJtaW5fMTBfZXhwIiwJIkRCTF9NSU5fMTBfRVhQIC0tIG1pbmltdW0gaW50IGUgc3VjaCB0aGF0IDEwKiplIGlzICIKLQkJCSJhIG5vcm1hbGl6ZWQifSwKLQl7ImRpZyIsCQkiREJMX0RJRyAtLSBkaWdpdHMifSwKLQl7Im1hbnRfZGlnIiwJIkRCTF9NQU5UX0RJRyAtLSBtYW50aXNzYSBkaWdpdHMifSwKLQl7ImVwc2lsb24iLAkiREJMX0VQU0lMT04gLS0gRGlmZmVyZW5jZSBiZXR3ZWVuIDEgYW5kIHRoZSBuZXh0ICIKLQkJCSJyZXByZXNlbnRhYmxlIGZsb2F0In0sCi0JeyJyYWRpeCIsCSJGTFRfUkFESVggLS0gcmFkaXggb2YgZXhwb25lbnQifSwKLQl7InJvdW5kcyIsCSJGTFRfUk9VTkRTIC0tIGFkZGl0aW9uIHJvdW5kcyJ9LAotCXswfQorICAgIHsibWF4IiwgICAgICAgICAgICAgIkRCTF9NQVggLS0gbWF4aW11bSByZXByZXNlbnRhYmxlIGZpbml0ZSBmbG9hdCJ9LAorICAgIHsibWF4X2V4cCIsICAgICAgICAgIkRCTF9NQVhfRVhQIC0tIG1heGltdW0gaW50IGUgc3VjaCB0aGF0IHJhZGl4KiooZS0xKSAiCisgICAgICAgICAgICAgICAgICAgICJpcyByZXByZXNlbnRhYmxlIn0sCisgICAgeyJtYXhfMTBfZXhwIiwgICAgICAiREJMX01BWF8xMF9FWFAgLS0gbWF4aW11bSBpbnQgZSBzdWNoIHRoYXQgMTAqKmUgIgorICAgICAgICAgICAgICAgICAgICAiaXMgcmVwcmVzZW50YWJsZSJ9LAorICAgIHsibWluIiwgICAgICAgICAgICAgIkRCTF9NSU4gLS0gTWluaW11bSBwb3NpdGl2ZSBub3JtYWxpemVyIGZsb2F0In0sCisgICAgeyJtaW5fZXhwIiwgICAgICAgICAiREJMX01JTl9FWFAgLS0gbWluaW11bSBpbnQgZSBzdWNoIHRoYXQgcmFkaXgqKihlLTEpICIKKyAgICAgICAgICAgICAgICAgICAgImlzIGEgbm9ybWFsaXplZCBmbG9hdCJ9LAorICAgIHsibWluXzEwX2V4cCIsICAgICAgIkRCTF9NSU5fMTBfRVhQIC0tIG1pbmltdW0gaW50IGUgc3VjaCB0aGF0IDEwKiplIGlzICIKKyAgICAgICAgICAgICAgICAgICAgImEgbm9ybWFsaXplZCJ9LAorICAgIHsiZGlnIiwgICAgICAgICAgICAgIkRCTF9ESUcgLS0gZGlnaXRzIn0sCisgICAgeyJtYW50X2RpZyIsICAgICAgICAiREJMX01BTlRfRElHIC0tIG1hbnRpc3NhIGRpZ2l0cyJ9LAorICAgIHsiZXBzaWxvbiIsICAgICAgICAgIkRCTF9FUFNJTE9OIC0tIERpZmZlcmVuY2UgYmV0d2VlbiAxIGFuZCB0aGUgbmV4dCAiCisgICAgICAgICAgICAgICAgICAgICJyZXByZXNlbnRhYmxlIGZsb2F0In0sCisgICAgeyJyYWRpeCIsICAgICAgICAgICAiRkxUX1JBRElYIC0tIHJhZGl4IG9mIGV4cG9uZW50In0sCisgICAgeyJyb3VuZHMiLCAgICAgICAgICAiRkxUX1JPVU5EUyAtLSBhZGRpdGlvbiByb3VuZHMifSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0Rlc2MgZmxvYXRpbmZvX2Rlc2MgPSB7Ci0JInN5cy5mbG9hdGluZm8iLAkvKiBuYW1lICovCi0JZmxvYXRpbmZvX19kb2NfXywJLyogZG9jICovCi0JZmxvYXRpbmZvX2ZpZWxkcywJLyogZmllbGRzICovCi0JMTEKKyAgICAic3lzLmZsb2F0aW5mbyIsICAgICAgICAgICAgLyogbmFtZSAqLworICAgIGZsb2F0aW5mb19fZG9jX18sICAgICAgICAgICAvKiBkb2MgKi8KKyAgICBmbG9hdGluZm9fZmllbGRzLCAgICAgICAgICAgLyogZmllbGRzICovCisgICAgMTEKIH07CiAKIFB5T2JqZWN0ICoKIFB5RmxvYXRfR2V0SW5mbyh2b2lkKQogewotCVB5T2JqZWN0KiBmbG9hdGluZm87Ci0JaW50IHBvcyA9IDA7CisgICAgUHlPYmplY3QqIGZsb2F0aW5mbzsKKyAgICBpbnQgcG9zID0gMDsKIAotCWZsb2F0aW5mbyA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZGbG9hdEluZm9UeXBlKTsKLQlpZiAoZmxvYXRpbmZvID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGZsb2F0aW5mbyA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZGbG9hdEluZm9UeXBlKTsKKyAgICBpZiAoZmxvYXRpbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAjZGVmaW5lIFNldEludEZsYWcoZmxhZykgXAotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0oZmxvYXRpbmZvLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcoZmxhZykpCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShmbG9hdGluZm8sIHBvcysrLCBQeUludF9Gcm9tTG9uZyhmbGFnKSkKICNkZWZpbmUgU2V0RGJsRmxhZyhmbGFnKSBcCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShmbG9hdGluZm8sIHBvcysrLCBQeUZsb2F0X0Zyb21Eb3VibGUoZmxhZykpCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTShmbG9hdGluZm8sIHBvcysrLCBQeUZsb2F0X0Zyb21Eb3VibGUoZmxhZykpCiAKLQlTZXREYmxGbGFnKERCTF9NQVgpOwotCVNldEludEZsYWcoREJMX01BWF9FWFApOwotCVNldEludEZsYWcoREJMX01BWF8xMF9FWFApOwotCVNldERibEZsYWcoREJMX01JTik7Ci0JU2V0SW50RmxhZyhEQkxfTUlOX0VYUCk7Ci0JU2V0SW50RmxhZyhEQkxfTUlOXzEwX0VYUCk7Ci0JU2V0SW50RmxhZyhEQkxfRElHKTsKLQlTZXRJbnRGbGFnKERCTF9NQU5UX0RJRyk7Ci0JU2V0RGJsRmxhZyhEQkxfRVBTSUxPTik7Ci0JU2V0SW50RmxhZyhGTFRfUkFESVgpOwotCVNldEludEZsYWcoRkxUX1JPVU5EUyk7CisgICAgU2V0RGJsRmxhZyhEQkxfTUFYKTsKKyAgICBTZXRJbnRGbGFnKERCTF9NQVhfRVhQKTsKKyAgICBTZXRJbnRGbGFnKERCTF9NQVhfMTBfRVhQKTsKKyAgICBTZXREYmxGbGFnKERCTF9NSU4pOworICAgIFNldEludEZsYWcoREJMX01JTl9FWFApOworICAgIFNldEludEZsYWcoREJMX01JTl8xMF9FWFApOworICAgIFNldEludEZsYWcoREJMX0RJRyk7CisgICAgU2V0SW50RmxhZyhEQkxfTUFOVF9ESUcpOworICAgIFNldERibEZsYWcoREJMX0VQU0lMT04pOworICAgIFNldEludEZsYWcoRkxUX1JBRElYKTsKKyAgICBTZXRJbnRGbGFnKEZMVF9ST1VORFMpOwogI3VuZGVmIFNldEludEZsYWcKICN1bmRlZiBTZXREYmxGbGFnCi0JCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfQ0xFQVIoZmxvYXRpbmZvKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBmbG9hdGluZm87CisKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9DTEVBUihmbG9hdGluZm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGZsb2F0aW5mbzsKIH0KIAogUHlPYmplY3QgKgogUHlGbG9hdF9Gcm9tRG91YmxlKGRvdWJsZSBmdmFsKQogewotCXJlZ2lzdGVyIFB5RmxvYXRPYmplY3QgKm9wOwotCWlmIChmcmVlX2xpc3QgPT0gTlVMTCkgewotCQlpZiAoKGZyZWVfbGlzdCA9IGZpbGxfZnJlZV9saXN0KCkpID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLwotCW9wID0gZnJlZV9saXN0OwotCWZyZWVfbGlzdCA9IChQeUZsb2F0T2JqZWN0ICopUHlfVFlQRShvcCk7Ci0JUHlPYmplY3RfSU5JVChvcCwgJlB5RmxvYXRfVHlwZSk7Ci0Jb3AtPm9iX2Z2YWwgPSBmdmFsOwotCXJldHVybiAoUHlPYmplY3QgKikgb3A7CisgICAgcmVnaXN0ZXIgUHlGbG9hdE9iamVjdCAqb3A7CisgICAgaWYgKGZyZWVfbGlzdCA9PSBOVUxMKSB7CisgICAgICAgIGlmICgoZnJlZV9saXN0ID0gZmlsbF9mcmVlX2xpc3QoKSkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCisgICAgb3AgPSBmcmVlX2xpc3Q7CisgICAgZnJlZV9saXN0ID0gKFB5RmxvYXRPYmplY3QgKilQeV9UWVBFKG9wKTsKKyAgICBQeU9iamVjdF9JTklUKG9wLCAmUHlGbG9hdF9UeXBlKTsKKyAgICBvcC0+b2JfZnZhbCA9IGZ2YWw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNzcsMTYzICsxNzcsMTYzIEBACiBQeU9iamVjdCAqCiBQeUZsb2F0X0Zyb21TdHJpbmcoUHlPYmplY3QgKnYsIGNoYXIgKipwZW5kKQogewotCWNvbnN0IGNoYXIgKnMsICpsYXN0LCAqZW5kLCAqc3A7Ci0JZG91YmxlIHg7Ci0JY2hhciBidWZmZXJbMjU2XTsgLyogZm9yIGVycm9ycyAqLworICAgIGNvbnN0IGNoYXIgKnMsICpsYXN0LCAqZW5kLCAqc3A7CisgICAgZG91YmxlIHg7CisgICAgY2hhciBidWZmZXJbMjU2XTsgLyogZm9yIGVycm9ycyAqLwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQljaGFyIHNfYnVmZmVyWzI1Nl07IC8qIGZvciBvYmplY3RzIGNvbnZlcnRpYmxlIHRvIGEgY2hhciBidWZmZXIgKi8KKyAgICBjaGFyIHNfYnVmZmVyWzI1Nl07IC8qIGZvciBvYmplY3RzIGNvbnZlcnRpYmxlIHRvIGEgY2hhciBidWZmZXIgKi8KICNlbmRpZgotCVB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKHBlbmQpCi0JCSpwZW5kID0gTlVMTDsKLQlpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkJcyA9IFB5U3RyaW5nX0FTX1NUUklORyh2KTsKLQkJbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7Ci0JfQorICAgIGlmIChwZW5kKQorICAgICAgICAqcGVuZCA9IE5VTEw7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcodik7CisgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JCWlmIChQeVVuaWNvZGVfR0VUX1NJWkUodikgPj0gKFB5X3NzaXplX3Qpc2l6ZW9mKHNfYnVmZmVyKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIlVuaWNvZGUgZmxvYXQoKSBsaXRlcmFsIHRvbyBsb25nIHRvIGNvbnZlcnQiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbChQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSwKLQkJCQkJICAgIFB5VW5pY29kZV9HRVRfU0laRSh2KSwKLQkJCQkJICAgIHNfYnVmZmVyLAotCQkJCQkgICAgTlVMTCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcyA9IHNfYnVmZmVyOwotCQlsZW4gPSBzdHJsZW4ocyk7Ci0JfQorICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlVbmljb2RlX0dFVF9TSVpFKHYpID49IChQeV9zc2l6ZV90KXNpemVvZihzX2J1ZmZlcikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJVbmljb2RlIGZsb2F0KCkgbGl0ZXJhbCB0b28gbG9uZyB0byBjb252ZXJ0Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlVbmljb2RlX0VuY29kZURlY2ltYWwoUHlVbmljb2RlX0FTX1VOSUNPREUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHMgPSBzX2J1ZmZlcjsKKyAgICAgICAgbGVuID0gc3RybGVuKHMpOworICAgIH0KICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih2LCAmcywgJmxlbikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZmxvYXQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodiwgJnMsICZsZW4pKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQoKSBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWxhc3QgPSBzICsgbGVuOwotCXdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCi0JCXMrKzsKLQlpZiAoKnMgPT0gJ1wwJykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHN0cmluZyBmb3IgZmxvYXQoKSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3AgPSBzOwotCS8qIFdlIGRvbid0IGNhcmUgYWJvdXQgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LiAgSWYgdGhlIHBsYXRmb3JtIHN1cHBvcnRzCi0JICogdGhlbSwgaW5maW5pdGllcyBhbmQgc2lnbmVkIHplcm9lcyAob24gdW5kZXJmbG93KSBhcmUgZmluZS4KLQkgKiBIb3dldmVyLCBzdHJ0b2QgY2FuIHJldHVybiAwIGZvciBkZW5vcm1hbGl6ZWQgbnVtYmVycywgd2hlcmUgYXRvZgotCSAqIGRvZXMgbm90LiAgU28gKGFsYXMhKSB3ZSBzcGVjaWFsLWNhc2UgYSB6ZXJvIHJlc3VsdC4gIE5vdGUgdGhhdAotCSAqIHdoZXRoZXIgc3RydG9kIHNldHMgZXJybm8gb24gdW5kZXJmbG93IGlzIG5vdCBkZWZpbmVkLCBzbyB3ZSBjYW4ndAotCSAqIGtleSBvZmYgZXJybm8uCi0gICAgICAgICAqLwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoInN0cnRvZCIsIHJldHVybiBOVUxMKQotCXggPSBQeU9TX2FzY2lpX3N0cnRvZChzLCAoY2hhciAqKikmZW5kKTsKLQlQeUZQRV9FTkRfUFJPVEVDVCh4KQotCWVycm5vID0gMDsKLQkvKiBCZWxpZXZlIGl0IG9yIG5vdCwgU29sYXJpcyAyLjYgY2FuIG1vdmUgZW5kICpiZXlvbmQqIHRoZSBudWxsCi0JICAgYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsIHdoZW4gdGhlIGlucHV0IGlzIGluZihpbml0eSkuICovCi0JaWYgKGVuZCA+IGxhc3QpCi0JCWVuZCA9IGxhc3Q7Ci0JLyogQ2hlY2sgZm9yIGluZiBhbmQgbmFuLiBUaGlzIGlzIGRvbmUgbGF0ZSBiZWNhdXNlIGl0IHJhcmVseSBoYXBwZW5zLiAqLwotCWlmIChlbmQgPT0gcykgewotCQljaGFyICpwID0gKGNoYXIqKXNwOwotCQlpbnQgc2lnbiA9IDE7CisgICAgbGFzdCA9IHMgKyBsZW47CisgICAgd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKKyAgICAgICAgcysrOworICAgIGlmICgqcyA9PSAnXDAnKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc3RyaW5nIGZvciBmbG9hdCgpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzcCA9IHM7CisgICAgLyogV2UgZG9uJ3QgY2FyZSBhYm91dCBvdmVyZmxvdyBvciB1bmRlcmZsb3cuICBJZiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMKKyAgICAgKiB0aGVtLCBpbmZpbml0aWVzIGFuZCBzaWduZWQgemVyb2VzIChvbiB1bmRlcmZsb3cpIGFyZSBmaW5lLgorICAgICAqIEhvd2V2ZXIsIHN0cnRvZCBjYW4gcmV0dXJuIDAgZm9yIGRlbm9ybWFsaXplZCBudW1iZXJzLCB3aGVyZSBhdG9mCisgICAgICogZG9lcyBub3QuICBTbyAoYWxhcyEpIHdlIHNwZWNpYWwtY2FzZSBhIHplcm8gcmVzdWx0LiAgTm90ZSB0aGF0CisgICAgICogd2hldGhlciBzdHJ0b2Qgc2V0cyBlcnJubyBvbiB1bmRlcmZsb3cgaXMgbm90IGRlZmluZWQsIHNvIHdlIGNhbid0CisgICAgICoga2V5IG9mZiBlcnJuby4KKyAgICAgKi8KKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJzdHJ0b2QiLCByZXR1cm4gTlVMTCkKKyAgICB4ID0gUHlPU19hc2NpaV9zdHJ0b2QocywgKGNoYXIgKiopJmVuZCk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoeCkKKyAgICBlcnJubyA9IDA7CisgICAgLyogQmVsaWV2ZSBpdCBvciBub3QsIFNvbGFyaXMgMi42IGNhbiBtb3ZlIGVuZCAqYmV5b25kKiB0aGUgbnVsbAorICAgICAgIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCB3aGVuIHRoZSBpbnB1dCBpcyBpbmYoaW5pdHkpLiAqLworICAgIGlmIChlbmQgPiBsYXN0KQorICAgICAgICBlbmQgPSBsYXN0OworICAgIC8qIENoZWNrIGZvciBpbmYgYW5kIG5hbi4gVGhpcyBpcyBkb25lIGxhdGUgYmVjYXVzZSBpdCByYXJlbHkgaGFwcGVucy4gKi8KKyAgICBpZiAoZW5kID09IHMpIHsKKyAgICAgICAgY2hhciAqcCA9IChjaGFyKilzcDsKKyAgICAgICAgaW50IHNpZ24gPSAxOwogCi0JCWlmICgqcCA9PSAnLScpIHsKLQkJCXNpZ24gPSAtMTsKLQkJCXArKzsKLQkJfQotCQlpZiAoKnAgPT0gJysnKSB7Ci0JCQlwKys7Ci0JCX0KLQkJaWYgKFB5T1Nfc3RybmljbXAocCwgImluZiIsIDQpID09IDApIHsKLQkJCVB5X1JFVFVSTl9JTkYoc2lnbik7Ci0JCX0KLQkJaWYgKFB5T1Nfc3RybmljbXAocCwgImluZmluaXR5IiwgOSkgPT0gMCkgewotCQkJUHlfUkVUVVJOX0lORihzaWduKTsKLQkJfQorICAgICAgICBpZiAoKnAgPT0gJy0nKSB7CisgICAgICAgICAgICBzaWduID0gLTE7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpwID09ICcrJykgeworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgICAgIGlmIChQeU9TX3N0cm5pY21wKHAsICJpbmYiLCA0KSA9PSAwKSB7CisgICAgICAgICAgICBQeV9SRVRVUk5fSU5GKHNpZ24pOworICAgICAgICB9CisgICAgICAgIGlmIChQeU9TX3N0cm5pY21wKHAsICJpbmZpbml0eSIsIDkpID09IDApIHsKKyAgICAgICAgICAgIFB5X1JFVFVSTl9JTkYoc2lnbik7CisgICAgICAgIH0KICNpZmRlZiBQeV9OQU4KLQkJaWYoUHlPU19zdHJuaWNtcChwLCAibmFuIiwgNCkgPT0gMCkgewotCQkJUHlfUkVUVVJOX05BTjsKLQkJfQorICAgICAgICBpZihQeU9TX3N0cm5pY21wKHAsICJuYW4iLCA0KSA9PSAwKSB7CisgICAgICAgICAgICBQeV9SRVRVUk5fTkFOOworICAgICAgICB9CiAjZW5kaWYKLQkJUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkJICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgZmxvYXQoKTogJS4yMDBzIiwgcyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogU2luY2UgZW5kICE9IHMsIHRoZSBwbGF0Zm9ybSBtYWRlICpzb21lKiBraW5kIG9mIHNlbnNlIG91dAotCSAgIG9mIHRoZSBpbnB1dC4gIFRydXN0IGl0LiAqLwotCXdoaWxlICgqZW5kICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmVuZCkpKQotCQllbmQrKzsKLQlpZiAoKmVuZCAhPSAnXDAnKSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCSAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGZsb2F0KCk6ICUuMjAwcyIsIHMpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgYnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgaWYgKGVuZCAhPSBsYXN0KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJudWxsIGJ5dGUgaW4gYXJndW1lbnQgZm9yIGZsb2F0KCkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh4ID09IDAuMCkgewotCQkvKiBTZWUgYWJvdmUgLS0gbWF5IGhhdmUgYmVlbiBzdHJ0b2QgYmVpbmcgYW5hbAotCQkgICBhYm91dCBkZW5vcm1zLiAqLwotCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJhdG9mIiwgcmV0dXJuIE5VTEwpCi0JCXggPSBQeU9TX2FzY2lpX2F0b2Yocyk7Ci0JCVB5RlBFX0VORF9QUk9URUNUKHgpCi0JCWVycm5vID0gMDsgICAgLyogd2hldGhlciBhdG9mIGV2ZXIgc2V0IGVycm5vIGlzIHVuZGVmaW5lZCAqLwotCX0KLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOworICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgZmxvYXQoKTogJS4yMDBzIiwgcyk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCBidWZmZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogU2luY2UgZW5kICE9IHMsIHRoZSBwbGF0Zm9ybSBtYWRlICpzb21lKiBraW5kIG9mIHNlbnNlIG91dAorICAgICAgIG9mIHRoZSBpbnB1dC4gIFRydXN0IGl0LiAqLworICAgIHdoaWxlICgqZW5kICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKmVuZCkpKQorICAgICAgICBlbmQrKzsKKyAgICBpZiAoKmVuZCAhPSAnXDAnKSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBmbG9hdCgpOiAlLjIwMHMiLCBzKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChlbmQgIT0gbGFzdCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJudWxsIGJ5dGUgaW4gYXJndW1lbnQgZm9yIGZsb2F0KCkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICh4ID09IDAuMCkgeworICAgICAgICAvKiBTZWUgYWJvdmUgLS0gbWF5IGhhdmUgYmVlbiBzdHJ0b2QgYmVpbmcgYW5hbAorICAgICAgICAgICBhYm91dCBkZW5vcm1zLiAqLworICAgICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJhdG9mIiwgcmV0dXJuIE5VTEwpCisgICAgICAgIHggPSBQeU9TX2FzY2lpX2F0b2Yocyk7CisgICAgICAgIFB5RlBFX0VORF9QUk9URUNUKHgpCisgICAgICAgIGVycm5vID0gMDsgICAgLyogd2hldGhlciBhdG9mIGV2ZXIgc2V0IGVycm5vIGlzIHVuZGVmaW5lZCAqLworICAgIH0KKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwogfQogCiBzdGF0aWMgdm9pZAogZmxvYXRfZGVhbGxvYyhQeUZsb2F0T2JqZWN0ICpvcCkKIHsKLQlpZiAoUHlGbG9hdF9DaGVja0V4YWN0KG9wKSkgewotCQlQeV9UWVBFKG9wKSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKilmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IG9wOwotCX0KLQllbHNlCi0JCVB5X1RZUEUob3ApLT50cF9mcmVlKChQeU9iamVjdCAqKW9wKTsKKyAgICBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KG9wKSkgeworICAgICAgICBQeV9UWVBFKG9wKSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKilmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IG9wOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X1RZUEUob3ApLT50cF9mcmVlKChQeU9iamVjdCAqKW9wKTsKIH0KIAogZG91YmxlCiBQeUZsb2F0X0FzRG91YmxlKFB5T2JqZWN0ICpvcCkKIHsKLQlQeU51bWJlck1ldGhvZHMgKm5iOwotCVB5RmxvYXRPYmplY3QgKmZvOwotCWRvdWJsZSB2YWw7CisgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKKyAgICBQeUZsb2F0T2JqZWN0ICpmbzsKKyAgICBkb3VibGUgdmFsOwogCi0JaWYgKG9wICYmIFB5RmxvYXRfQ2hlY2sob3ApKQotCQlyZXR1cm4gUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QqKSBvcCk7CisgICAgaWYgKG9wICYmIFB5RmxvYXRfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gUHlGbG9hdF9BU19ET1VCTEUoKFB5RmxvYXRPYmplY3QqKSBvcCk7CiAKLQlpZiAob3AgPT0gTlVMTCkgewotCQlQeUVycl9CYWRBcmd1bWVudCgpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChvcCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fCBuYi0+bmJfZmxvYXQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYSBmbG9hdCBpcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICgobmIgPSBQeV9UWVBFKG9wKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8IG5iLT5uYl9mbG9hdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhIGZsb2F0IGlzIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlmbyA9IChQeUZsb2F0T2JqZWN0KikgKCpuYi0+bmJfZmxvYXQpIChvcCk7Ci0JaWYgKGZvID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoIVB5RmxvYXRfQ2hlY2soZm8pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm5iX2Zsb2F0IHNob3VsZCByZXR1cm4gZmxvYXQgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgZm8gPSAoUHlGbG9hdE9iamVjdCopICgqbmItPm5iX2Zsb2F0KSAob3ApOworICAgIGlmIChmbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFQeUZsb2F0X0NoZWNrKGZvKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5iX2Zsb2F0IHNob3VsZCByZXR1cm4gZmxvYXQgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQl2YWwgPSBQeUZsb2F0X0FTX0RPVUJMRShmbyk7Ci0JUHlfREVDUkVGKGZvKTsKKyAgICB2YWwgPSBQeUZsb2F0X0FTX0RPVUJMRShmbyk7CisgICAgUHlfREVDUkVGKGZvKTsKIAotCXJldHVybiB2YWw7CisgICAgcmV0dXJuIHZhbDsKIH0KIAogLyogTWV0aG9kcyAqLwpAQCAtMzQxLDU4ICszNDEsNTggQEAKIHN0YXRpYyB2b2lkCiBmb3JtYXRfZmxvYXQoY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuLCBQeUZsb2F0T2JqZWN0ICp2LCBpbnQgcHJlY2lzaW9uKQogewotCXJlZ2lzdGVyIGNoYXIgKmNwOwotCWNoYXIgZm9ybWF0WzMyXTsKLQlpbnQgaTsKKyAgICByZWdpc3RlciBjaGFyICpjcDsKKyAgICBjaGFyIGZvcm1hdFszMl07CisgICAgaW50IGk7CiAKLQkvKiBTdWJyb3V0aW5lIGZvciBmbG9hdF9yZXByIGFuZCBmbG9hdF9wcmludC4KLQkgICBXZSB3YW50IGZsb2F0IG51bWJlcnMgdG8gYmUgcmVjb2duaXphYmxlIGFzIHN1Y2gsCi0JICAgaS5lLiwgdGhleSBzaG91bGQgY29udGFpbiBhIGRlY2ltYWwgcG9pbnQgb3IgYW4gZXhwb25lbnQuCi0JICAgSG93ZXZlciwgJWcgbWF5IHByaW50IHRoZSBudW1iZXIgYXMgYW4gaW50ZWdlcjsKLQkgICBpbiBzdWNoIGNhc2VzLCB3ZSBhcHBlbmQgIi4wIiB0byB0aGUgc3RyaW5nLiAqLworICAgIC8qIFN1YnJvdXRpbmUgZm9yIGZsb2F0X3JlcHIgYW5kIGZsb2F0X3ByaW50LgorICAgICAgIFdlIHdhbnQgZmxvYXQgbnVtYmVycyB0byBiZSByZWNvZ25pemFibGUgYXMgc3VjaCwKKyAgICAgICBpLmUuLCB0aGV5IHNob3VsZCBjb250YWluIGEgZGVjaW1hbCBwb2ludCBvciBhbiBleHBvbmVudC4KKyAgICAgICBIb3dldmVyLCAlZyBtYXkgcHJpbnQgdGhlIG51bWJlciBhcyBhbiBpbnRlZ2VyOworICAgICAgIGluIHN1Y2ggY2FzZXMsIHdlIGFwcGVuZCAiLjAiIHRvIHRoZSBzdHJpbmcuICovCiAKLQlhc3NlcnQoUHlGbG9hdF9DaGVjayh2KSk7Ci0JUHlPU19zbnByaW50Zihmb3JtYXQsIDMyLCAiJSUuJWlnIiwgcHJlY2lzaW9uKTsKLQlQeU9TX2FzY2lpX2Zvcm1hdGQoYnVmLCBidWZsZW4sIGZvcm1hdCwgdi0+b2JfZnZhbCk7Ci0JY3AgPSBidWY7Ci0JaWYgKCpjcCA9PSAnLScpCi0JCWNwKys7Ci0JZm9yICg7ICpjcCAhPSAnXDAnOyBjcCsrKSB7Ci0JCS8qIEFueSBub24tZGlnaXQgbWVhbnMgaXQncyBub3QgYW4gaW50ZWdlcjsKLQkJICAgdGhpcyB0YWtlcyBjYXJlIG9mIE5BTiBhbmQgSU5GIGFzIHdlbGwuICovCi0JCWlmICghaXNkaWdpdChQeV9DSEFSTUFTSygqY3ApKSkKLQkJCWJyZWFrOwotCX0KLQlpZiAoKmNwID09ICdcMCcpIHsKLQkJKmNwKysgPSAnLic7Ci0JCSpjcCsrID0gJzAnOwotCQkqY3ArKyA9ICdcMCc7Ci0JCXJldHVybjsKLQl9Ci0JLyogQ2hlY2tpbmcgdGhlIG5leHQgdGhyZWUgY2hhcnMgc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2ggdG8KLQkgKiBkZXRlY3QgaW5mIG9yIG5hbiwgZXZlbiBvbiBXaW5kb3dzLiBXZSBjaGVjayBmb3IgaW5mIG9yIG5hbgotCSAqIGF0IGxhc3QgYmVjYXVzZSB0aGV5IGFyZSByYXJlIGNhc2VzLgotCSAqLwotCWZvciAoaT0wOyAqY3AgIT0gJ1wwJyAmJiBpPDM7IGNwKyssIGkrKykgewotCQlpZiAoaXNkaWdpdChQeV9DSEFSTUFTSygqY3ApKSB8fCAqY3AgPT0gJy4nKQotCQkJY29udGludWU7Ci0JCS8qIGZvdW5kIHNvbWV0aGluZyB0aGF0IGlzIG5laXRoZXIgYSBkaWdpdCBub3IgcG9pbnQKLQkJICogaXQgbWlnaHQgYmUgYSBOYU4gb3IgSU5GCi0JCSAqLworICAgIGFzc2VydChQeUZsb2F0X0NoZWNrKHYpKTsKKyAgICBQeU9TX3NucHJpbnRmKGZvcm1hdCwgMzIsICIlJS4laWciLCBwcmVjaXNpb24pOworICAgIFB5T1NfYXNjaWlfZm9ybWF0ZChidWYsIGJ1ZmxlbiwgZm9ybWF0LCB2LT5vYl9mdmFsKTsKKyAgICBjcCA9IGJ1ZjsKKyAgICBpZiAoKmNwID09ICctJykKKyAgICAgICAgY3ArKzsKKyAgICBmb3IgKDsgKmNwICE9ICdcMCc7IGNwKyspIHsKKyAgICAgICAgLyogQW55IG5vbi1kaWdpdCBtZWFucyBpdCdzIG5vdCBhbiBpbnRlZ2VyOworICAgICAgICAgICB0aGlzIHRha2VzIGNhcmUgb2YgTkFOIGFuZCBJTkYgYXMgd2VsbC4gKi8KKyAgICAgICAgaWYgKCFpc2RpZ2l0KFB5X0NIQVJNQVNLKCpjcCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgqY3AgPT0gJ1wwJykgeworICAgICAgICAqY3ArKyA9ICcuJzsKKyAgICAgICAgKmNwKysgPSAnMCc7CisgICAgICAgICpjcCsrID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBDaGVja2luZyB0aGUgbmV4dCB0aHJlZSBjaGFycyBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaCB0bworICAgICAqIGRldGVjdCBpbmYgb3IgbmFuLCBldmVuIG9uIFdpbmRvd3MuIFdlIGNoZWNrIGZvciBpbmYgb3IgbmFuCisgICAgICogYXQgbGFzdCBiZWNhdXNlIHRoZXkgYXJlIHJhcmUgY2FzZXMuCisgICAgICovCisgICAgZm9yIChpPTA7ICpjcCAhPSAnXDAnICYmIGk8MzsgY3ArKywgaSsrKSB7CisgICAgICAgIGlmIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCpjcCkpIHx8ICpjcCA9PSAnLicpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLyogZm91bmQgc29tZXRoaW5nIHRoYXQgaXMgbmVpdGhlciBhIGRpZ2l0IG5vciBwb2ludAorICAgICAgICAgKiBpdCBtaWdodCBiZSBhIE5hTiBvciBJTkYKKyAgICAgICAgICovCiAjaWZkZWYgUHlfTkFOCi0JCWlmIChQeV9JU19OQU4odi0+b2JfZnZhbCkpIHsKLQkJCXN0cmNweShidWYsICJuYW4iKTsKLQkJfQotICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgaWYgKFB5X0lTX05BTih2LT5vYl9mdmFsKSkgeworICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgIm5hbiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQlpZiAoUHlfSVNfSU5GSU5JVFkodi0+b2JfZnZhbCkpIHsKLQkJCWNwID0gYnVmOwotCQkJaWYgKCpjcCA9PSAnLScpCi0JCQkJY3ArKzsKLQkJCXN0cmNweShjcCwgImluZiIpOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKHYtPm9iX2Z2YWwpKSB7CisgICAgICAgICAgICBjcCA9IGJ1ZjsKKyAgICAgICAgICAgIGlmICgqY3AgPT0gJy0nKQorICAgICAgICAgICAgICAgIGNwKys7CisgICAgICAgICAgICBzdHJjcHkoY3AsICJpbmYiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CiAKIH0KIApAQCAtNDAzLDcgKzQwMyw3IEBACiB2b2lkCiBQeUZsb2F0X0FzU3RyaW5nRXgoY2hhciAqYnVmLCBQeUZsb2F0T2JqZWN0ICp2LCBpbnQgcHJlY2lzaW9uKQogewotCWZvcm1hdF9mbG9hdChidWYsIDEwMCwgdiwgcHJlY2lzaW9uKTsKKyAgICBmb3JtYXRfZmxvYXQoYnVmLCAxMDAsIHYsIHByZWNpc2lvbik7CiB9CiAKIC8qIE1hY3JvIGFuZCBoZWxwZXIgdGhhdCBjb252ZXJ0IFB5T2JqZWN0IG9iaiB0byBhIEMgZG91YmxlIGFuZCBzdG9yZQpAQCAtNDEzLDMzICs0MTMsMzMgQEAKICAgIG9iaiBpcyBub3Qgb2YgZmxvYXQsIGludCBvciBsb25nIHR5cGUsIFB5X05vdEltcGxlbWVudGVkIGlzIGluY3JlZidlZCwKICAgIHN0b3JlZCBpbiBvYmosIGFuZCByZXR1cm5lZCBmcm9tIHRoZSBmdW5jdGlvbiBpbnZva2luZyB0aGlzIG1hY3JvLgogKi8KLSNkZWZpbmUgQ09OVkVSVF9UT19ET1VCTEUob2JqLCBkYmwpCQkJXAotCWlmIChQeUZsb2F0X0NoZWNrKG9iaikpCQkJCVwKLQkJZGJsID0gUHlGbG9hdF9BU19ET1VCTEUob2JqKTsJCVwKLQllbHNlIGlmIChjb252ZXJ0X3RvX2RvdWJsZSgmKG9iaiksICYoZGJsKSkgPCAwKQlcCi0JCXJldHVybiBvYmo7CisjZGVmaW5lIENPTlZFUlRfVE9fRE9VQkxFKG9iaiwgZGJsKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkYmwgPSBQeUZsb2F0X0FTX0RPVUJMRShvYmopOyAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoY29udmVydF90b19kb3VibGUoJihvYmopLCAmKGRibCkpIDwgMCkgICAgIFwKKyAgICAgICAgcmV0dXJuIG9iajsKIAogc3RhdGljIGludAogY29udmVydF90b19kb3VibGUoUHlPYmplY3QgKip2LCBkb3VibGUgKmRibCkKIHsKLQlyZWdpc3RlciBQeU9iamVjdCAqb2JqID0gKnY7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiA9ICp2OwogCi0JaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKLQkJKmRibCA9IChkb3VibGUpUHlJbnRfQVNfTE9ORyhvYmopOwotCX0KLQllbHNlIGlmIChQeUxvbmdfQ2hlY2sob2JqKSkgewotCQkqZGJsID0gUHlMb25nX0FzRG91YmxlKG9iaik7Ci0JCWlmICgqZGJsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJKnYgPSBOVUxMOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQkqdiA9IFB5X05vdEltcGxlbWVudGVkOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmIChQeUludF9DaGVjayhvYmopKSB7CisgICAgICAgICpkYmwgPSAoZG91YmxlKVB5SW50X0FTX0xPTkcob2JqKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICAgICAgKmRibCA9IFB5TG9uZ19Bc0RvdWJsZShvYmopOworICAgICAgICBpZiAoKmRibCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICp2ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgKnYgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogUHJlY2lzaW9ucyB1c2VkIGJ5IHJlcHIoKSBhbmQgc3RyKCksIHJlc3BlY3RpdmVseS4KQEAgLTQ1Niw4ICs0NTYsOCBAQAogCiAqLwogCi0jZGVmaW5lIFBSRUNfUkVQUgkxNwotI2RlZmluZSBQUkVDX1NUUgkxMgorI2RlZmluZSBQUkVDX1JFUFIgICAgICAgMTcKKyNkZWZpbmUgUFJFQ19TVFIgICAgICAgIDEyCiAKIC8qIFhYWCBQeUZsb2F0X0FzU3RyaW5nIGFuZCBQeUZsb2F0X0FzUmVwclN0cmluZyBzaG91bGQgYmUgZGVwcmVjYXRlZDoKICAgIFhYWCB0aGV5IHBhc3MgYSBjaGFyIGJ1ZmZlciB3aXRob3V0IHBhc3NpbmcgYSBsZW5ndGguCkBAIC00NjUsNDMgKzQ2NSw0MyBAQAogdm9pZAogUHlGbG9hdF9Bc1N0cmluZyhjaGFyICpidWYsIFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JZm9ybWF0X2Zsb2F0KGJ1ZiwgMTAwLCB2LCBQUkVDX1NUUik7CisgICAgZm9ybWF0X2Zsb2F0KGJ1ZiwgMTAwLCB2LCBQUkVDX1NUUik7CiB9CiAKIHZvaWQKIFB5RmxvYXRfQXNSZXByU3RyaW5nKGNoYXIgKmJ1ZiwgUHlGbG9hdE9iamVjdCAqdikKIHsKLQlmb3JtYXRfZmxvYXQoYnVmLCAxMDAsIHYsIFBSRUNfUkVQUik7CisgICAgZm9ybWF0X2Zsb2F0KGJ1ZiwgMTAwLCB2LCBQUkVDX1JFUFIpOwogfQogCiAvKiBBUkdTVVNFRCAqLwogc3RhdGljIGludAogZmxvYXRfcHJpbnQoUHlGbG9hdE9iamVjdCAqdiwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCWZvcm1hdF9mbG9hdChidWYsIHNpemVvZihidWYpLCB2LAotCQkgICAgIChmbGFncyAmIFB5X1BSSU5UX1JBVykgPyBQUkVDX1NUUiA6IFBSRUNfUkVQUik7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwdXRzKGJ1ZiwgZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JcmV0dXJuIDA7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBmb3JtYXRfZmxvYXQoYnVmLCBzaXplb2YoYnVmKSwgdiwKKyAgICAgICAgICAgICAgICAgKGZsYWdzICYgUHlfUFJJTlRfUkFXKSA/IFBSRUNfU1RSIDogUFJFQ19SRVBSKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnB1dHMoYnVmLCBmcCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X3JlcHIoUHlGbG9hdE9iamVjdCAqdikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCWZvcm1hdF9mbG9hdChidWYsIHNpemVvZihidWYpLCB2LCBQUkVDX1JFUFIpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgZm9ybWF0X2Zsb2F0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIHYsIFBSRUNfUkVQUik7CiAKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9zdHIoUHlGbG9hdE9iamVjdCAqdikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCWZvcm1hdF9mbG9hdChidWYsIHNpemVvZihidWYpLCB2LCBQUkVDX1NUUik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIGZvcm1hdF9mbG9hdChidWYsIHNpemVvZihidWYpLCB2LCBQUkVDX1NUUik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogLyogQ29tcGFyaXNvbiBpcyBwcmV0dHkgbXVjaCBhIG5pZ2h0bWFyZS4gIFdoZW4gY29tcGFyaW5nIGZsb2F0IHRvIGZsb2F0LApAQCAtNTIyLDYwMyArNTIyLDYwMyBAQAogc3RhdGljIFB5T2JqZWN0KgogZmxvYXRfcmljaGNvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JZG91YmxlIGksIGo7Ci0JaW50IHIgPSAwOworICAgIGRvdWJsZSBpLCBqOworICAgIGludCByID0gMDsKIAotCWFzc2VydChQeUZsb2F0X0NoZWNrKHYpKTsKLQlpID0gUHlGbG9hdF9BU19ET1VCTEUodik7CisgICAgYXNzZXJ0KFB5RmxvYXRfQ2hlY2sodikpOworICAgIGkgPSBQeUZsb2F0X0FTX0RPVUJMRSh2KTsKIAotCS8qIFN3aXRjaCBvbiB0aGUgdHlwZSBvZiB3LiAgU2V0IGkgYW5kIGogdG8gZG91YmxlcyB0byBiZSBjb21wYXJlZCwKLQkgKiBhbmQgb3AgdG8gdGhlIHJpY2hjb21wIHRvIHVzZS4KLQkgKi8KLQlpZiAoUHlGbG9hdF9DaGVjayh3KSkKLQkJaiA9IFB5RmxvYXRfQVNfRE9VQkxFKHcpOworICAgIC8qIFN3aXRjaCBvbiB0aGUgdHlwZSBvZiB3LiAgU2V0IGkgYW5kIGogdG8gZG91YmxlcyB0byBiZSBjb21wYXJlZCwKKyAgICAgKiBhbmQgb3AgdG8gdGhlIHJpY2hjb21wIHRvIHVzZS4KKyAgICAgKi8KKyAgICBpZiAoUHlGbG9hdF9DaGVjayh3KSkKKyAgICAgICAgaiA9IFB5RmxvYXRfQVNfRE9VQkxFKHcpOwogCi0JZWxzZSBpZiAoIVB5X0lTX0ZJTklURShpKSkgewotCQlpZiAoUHlJbnRfQ2hlY2sodykgfHwgUHlMb25nX0NoZWNrKHcpKQotCQkJLyogSWYgaSBpcyBhbiBpbmZpbml0eSwgaXRzIG1hZ25pdHVkZSBleGNlZWRzIGFueQotCQkJICogZmluaXRlIGludGVnZXIsIHNvIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGludCB3ZQotCQkJICogY29tcGFyZSBpIHdpdGguICBJZiBpIGlzIGEgTmFOLCBzaW1pbGFybHkuCi0JCQkgKi8KLQkJCWogPSAwLjA7Ci0JCWVsc2UKLQkJCWdvdG8gVW5pbXBsZW1lbnRlZDsKLQl9CisgICAgZWxzZSBpZiAoIVB5X0lTX0ZJTklURShpKSkgeworICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodykgfHwgUHlMb25nX0NoZWNrKHcpKQorICAgICAgICAgICAgLyogSWYgaSBpcyBhbiBpbmZpbml0eSwgaXRzIG1hZ25pdHVkZSBleGNlZWRzIGFueQorICAgICAgICAgICAgICogZmluaXRlIGludGVnZXIsIHNvIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGludCB3ZQorICAgICAgICAgICAgICogY29tcGFyZSBpIHdpdGguICBJZiBpIGlzIGEgTmFOLCBzaW1pbGFybHkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGogPSAwLjA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdG8gVW5pbXBsZW1lbnRlZDsKKyAgICB9CiAKLQllbHNlIGlmIChQeUludF9DaGVjayh3KSkgewotCQlsb25nIGpqID0gUHlJbnRfQVNfTE9ORyh3KTsKLQkJLyogSW4gdGhlIHdvcnN0IHJlYWxpc3RpYyBjYXNlIEkgY2FuIGltYWdpbmUsIEMgZG91YmxlIGlzIGEKLQkJICogQ3JheSBzaW5nbGUgd2l0aCA0OCBiaXRzIG9mIHByZWNpc2lvbiwgYW5kIGxvbmcgaGFzIDY0Ci0JCSAqIGJpdHMuCi0JCSAqLworICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKHcpKSB7CisgICAgICAgIGxvbmcgamogPSBQeUludF9BU19MT05HKHcpOworICAgICAgICAvKiBJbiB0aGUgd29yc3QgcmVhbGlzdGljIGNhc2UgSSBjYW4gaW1hZ2luZSwgQyBkb3VibGUgaXMgYQorICAgICAgICAgKiBDcmF5IHNpbmdsZSB3aXRoIDQ4IGJpdHMgb2YgcHJlY2lzaW9uLCBhbmQgbG9uZyBoYXMgNjQKKyAgICAgICAgICogYml0cy4KKyAgICAgICAgICovCiAjaWYgU0laRU9GX0xPTkcgPiA2Ci0JCXVuc2lnbmVkIGxvbmcgYWJzID0gKHVuc2lnbmVkIGxvbmcpKGpqIDwgMCA/IC1qaiA6IGpqKTsKLQkJaWYgKGFicyA+PiA0OCkgewotCQkJLyogTmVlZHMgbW9yZSB0aGFuIDQ4IGJpdHMuICBNYWtlIGl0IHRha2UgdGhlCi0JCQkgKiBQeUxvbmcgcGF0aC4KLQkJCSAqLwotCQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJCVB5T2JqZWN0ICp3dyA9IFB5TG9uZ19Gcm9tTG9uZyhqaik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgYWJzID0gKHVuc2lnbmVkIGxvbmcpKGpqIDwgMCA/IC1qaiA6IGpqKTsKKyAgICAgICAgaWYgKGFicyA+PiA0OCkgeworICAgICAgICAgICAgLyogTmVlZHMgbW9yZSB0aGFuIDQ4IGJpdHMuICBNYWtlIGl0IHRha2UgdGhlCisgICAgICAgICAgICAgKiBQeUxvbmcgcGF0aC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp3dyA9IFB5TG9uZ19Gcm9tTG9uZyhqaik7CiAKLQkJCWlmICh3dyA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJcmVzdWx0ID0gZmxvYXRfcmljaGNvbXBhcmUodiwgd3csIG9wKTsKLQkJCVB5X0RFQ1JFRih3dyk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9CisgICAgICAgICAgICBpZiAod3cgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZsb2F0X3JpY2hjb21wYXJlKHYsIHd3LCBvcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYod3cpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQogI2VuZGlmCi0JCWogPSAoZG91YmxlKWpqOwotCQlhc3NlcnQoKGxvbmcpaiA9PSBqaik7Ci0JfQorICAgICAgICBqID0gKGRvdWJsZSlqajsKKyAgICAgICAgYXNzZXJ0KChsb25nKWogPT0gamopOworICAgIH0KIAotCWVsc2UgaWYgKFB5TG9uZ19DaGVjayh3KSkgewotCQlpbnQgdnNpZ24gPSBpID09IDAuMCA/IDAgOiBpIDwgMC4wID8gLTEgOiAxOwotCQlpbnQgd3NpZ24gPSBfUHlMb25nX1NpZ24odyk7Ci0JCXNpemVfdCBuYml0czsKLQkJaW50IGV4cG9uZW50OworICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh3KSkgeworICAgICAgICBpbnQgdnNpZ24gPSBpID09IDAuMCA/IDAgOiBpIDwgMC4wID8gLTEgOiAxOworICAgICAgICBpbnQgd3NpZ24gPSBfUHlMb25nX1NpZ24odyk7CisgICAgICAgIHNpemVfdCBuYml0czsKKyAgICAgICAgaW50IGV4cG9uZW50OwogCi0JCWlmICh2c2lnbiAhPSB3c2lnbikgewotCQkJLyogTWFnbml0dWRlcyBhcmUgaXJyZWxldmFudCAtLSB0aGUgc2lnbnMgYWxvbmUKLQkJCSAqIGRldGVybWluZSB0aGUgb3V0Y29tZS4KLQkJCSAqLwotCQkJaSA9IChkb3VibGUpdnNpZ247Ci0JCQlqID0gKGRvdWJsZSl3c2lnbjsKLQkJCWdvdG8gQ29tcGFyZTsKLQkJfQotCQkvKiBUaGUgc2lnbnMgYXJlIHRoZSBzYW1lLiAqLwotCQkvKiBDb252ZXJ0IHcgdG8gYSBkb3VibGUgaWYgaXQgZml0cy4gIEluIHBhcnRpY3VsYXIsIDAgZml0cy4gKi8KLQkJbmJpdHMgPSBfUHlMb25nX051bUJpdHModyk7Ci0JCWlmIChuYml0cyA9PSAoc2l6ZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCS8qIFRoaXMgbG9uZyBpcyBzbyBsYXJnZSB0aGF0IHNpemVfdCBpc24ndCBiaWcgZW5vdWdoCi0JCQkgKiB0byBob2xkIHRoZSAjIG9mIGJpdHMuICBSZXBsYWNlIHdpdGggbGl0dGxlIGRvdWJsZXMKLQkJCSAqIHRoYXQgZ2l2ZSB0aGUgc2FtZSBvdXRjb21lIC0tIHcgaXMgc28gbGFyZ2UgdGhhdAotCQkJICogaXRzIG1hZ25pdHVkZSBtdXN0IGV4Y2VlZCB0aGUgbWFnbml0dWRlIG9mIGFueQotCQkJICogZmluaXRlIGZsb2F0LgotCQkJICovCi0JCQlQeUVycl9DbGVhcigpOwotCQkJaSA9IChkb3VibGUpdnNpZ247Ci0JCQlhc3NlcnQod3NpZ24gIT0gMCk7Ci0JCQlqID0gd3NpZ24gKiAyLjA7Ci0JCQlnb3RvIENvbXBhcmU7Ci0JCX0KLQkJaWYgKG5iaXRzIDw9IDQ4KSB7Ci0JCQlqID0gUHlMb25nX0FzRG91YmxlKHcpOwotCQkJLyogSXQncyBpbXBvc3NpYmxlIHRoYXQgPD0gNDggYml0cyBvdmVyZmxvd2VkLiAqLwotCQkJYXNzZXJ0KGogIT0gLTEuMCB8fCAhIFB5RXJyX09jY3VycmVkKCkpOwotCQkJZ290byBDb21wYXJlOwotCQl9Ci0JCWFzc2VydCh3c2lnbiAhPSAwKTsgLyogZWxzZSBuYml0cyB3YXMgMCAqLwotCQlhc3NlcnQodnNpZ24gIT0gMCk7IC8qIGlmIHZzaWduIHdlcmUgMCwgdGhlbiBzaW5jZSB3c2lnbiBpcwotCQkgICAgICAgICAgICAgICAgICAgICAqIG5vdCAwLCB3ZSB3b3VsZCBoYXZlIHRha2VuIHRoZQotCQkgICAgICAgICAgICAgICAgICAgICAqIHZzaWduICE9IHdzaWduIGJyYW5jaCBhdCB0aGUgc3RhcnQgKi8KLQkJLyogV2Ugd2FudCB0byB3b3JrIHdpdGggbm9uLW5lZ2F0aXZlIG51bWJlcnMuICovCi0JCWlmICh2c2lnbiA8IDApIHsKLQkJCS8qICJNdWx0aXBseSBib3RoIHNpZGVzIiBieSAtMTsgdGhpcyBhbHNvIHN3YXBzIHRoZQotCQkJICogY29tcGFyYXRvci4KLQkJCSAqLwotCQkJaSA9IC1pOwotCQkJb3AgPSBfUHlfU3dhcHBlZE9wW29wXTsKLQkJfQotCQlhc3NlcnQoaSA+IDAuMCk7Ci0JCSh2b2lkKSBmcmV4cChpLCAmZXhwb25lbnQpOwotCQkvKiBleHBvbmVudCBpcyB0aGUgIyBvZiBiaXRzIGluIHYgYmVmb3JlIHRoZSByYWRpeCBwb2ludDsKLQkJICogd2Uga25vdyB0aGF0IG5iaXRzICh0aGUgIyBvZiBiaXRzIGluIHcpID4gNDggYXQgdGhpcyBwb2ludAotCQkgKi8KLQkJaWYgKGV4cG9uZW50IDwgMCB8fCAoc2l6ZV90KWV4cG9uZW50IDwgbmJpdHMpIHsKLQkJCWkgPSAxLjA7Ci0JCQlqID0gMi4wOwotCQkJZ290byBDb21wYXJlOwotCQl9Ci0JCWlmICgoc2l6ZV90KWV4cG9uZW50ID4gbmJpdHMpIHsKLQkJCWkgPSAyLjA7Ci0JCQlqID0gMS4wOwotCQkJZ290byBDb21wYXJlOwotCQl9Ci0JCS8qIHYgYW5kIHcgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYml0cyBiZWZvcmUgdGhlIHJhZGl4Ci0JCSAqIHBvaW50LiAgQ29uc3RydWN0IHR3byBsb25ncyB0aGF0IGhhdmUgdGhlIHNhbWUgY29tcGFyaXNvbgotCQkgKiBvdXRjb21lLgotCQkgKi8KLQkJewotCQkJZG91YmxlIGZyYWNwYXJ0OwotCQkJZG91YmxlIGludHBhcnQ7Ci0JCQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQkJCVB5T2JqZWN0ICpvbmUgPSBOVUxMOwotCQkJUHlPYmplY3QgKnZ2ID0gTlVMTDsKLQkJCVB5T2JqZWN0ICp3dyA9IHc7CisgICAgICAgIGlmICh2c2lnbiAhPSB3c2lnbikgeworICAgICAgICAgICAgLyogTWFnbml0dWRlcyBhcmUgaXJyZWxldmFudCAtLSB0aGUgc2lnbnMgYWxvbmUKKyAgICAgICAgICAgICAqIGRldGVybWluZSB0aGUgb3V0Y29tZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaSA9IChkb3VibGUpdnNpZ247CisgICAgICAgICAgICBqID0gKGRvdWJsZSl3c2lnbjsKKyAgICAgICAgICAgIGdvdG8gQ29tcGFyZTsKKyAgICAgICAgfQorICAgICAgICAvKiBUaGUgc2lnbnMgYXJlIHRoZSBzYW1lLiAqLworICAgICAgICAvKiBDb252ZXJ0IHcgdG8gYSBkb3VibGUgaWYgaXQgZml0cy4gIEluIHBhcnRpY3VsYXIsIDAgZml0cy4gKi8KKyAgICAgICAgbmJpdHMgPSBfUHlMb25nX051bUJpdHModyk7CisgICAgICAgIGlmIChuYml0cyA9PSAoc2l6ZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgbG9uZyBpcyBzbyBsYXJnZSB0aGF0IHNpemVfdCBpc24ndCBiaWcgZW5vdWdoCisgICAgICAgICAgICAgKiB0byBob2xkIHRoZSAjIG9mIGJpdHMuICBSZXBsYWNlIHdpdGggbGl0dGxlIGRvdWJsZXMKKyAgICAgICAgICAgICAqIHRoYXQgZ2l2ZSB0aGUgc2FtZSBvdXRjb21lIC0tIHcgaXMgc28gbGFyZ2UgdGhhdAorICAgICAgICAgICAgICogaXRzIG1hZ25pdHVkZSBtdXN0IGV4Y2VlZCB0aGUgbWFnbml0dWRlIG9mIGFueQorICAgICAgICAgICAgICogZmluaXRlIGZsb2F0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaSA9IChkb3VibGUpdnNpZ247CisgICAgICAgICAgICBhc3NlcnQod3NpZ24gIT0gMCk7CisgICAgICAgICAgICBqID0gd3NpZ24gKiAyLjA7CisgICAgICAgICAgICBnb3RvIENvbXBhcmU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5iaXRzIDw9IDQ4KSB7CisgICAgICAgICAgICBqID0gUHlMb25nX0FzRG91YmxlKHcpOworICAgICAgICAgICAgLyogSXQncyBpbXBvc3NpYmxlIHRoYXQgPD0gNDggYml0cyBvdmVyZmxvd2VkLiAqLworICAgICAgICAgICAgYXNzZXJ0KGogIT0gLTEuMCB8fCAhIFB5RXJyX09jY3VycmVkKCkpOworICAgICAgICAgICAgZ290byBDb21wYXJlOworICAgICAgICB9CisgICAgICAgIGFzc2VydCh3c2lnbiAhPSAwKTsgLyogZWxzZSBuYml0cyB3YXMgMCAqLworICAgICAgICBhc3NlcnQodnNpZ24gIT0gMCk7IC8qIGlmIHZzaWduIHdlcmUgMCwgdGhlbiBzaW5jZSB3c2lnbiBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vdCAwLCB3ZSB3b3VsZCBoYXZlIHRha2VuIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHZzaWduICE9IHdzaWduIGJyYW5jaCBhdCB0aGUgc3RhcnQgKi8KKyAgICAgICAgLyogV2Ugd2FudCB0byB3b3JrIHdpdGggbm9uLW5lZ2F0aXZlIG51bWJlcnMuICovCisgICAgICAgIGlmICh2c2lnbiA8IDApIHsKKyAgICAgICAgICAgIC8qICJNdWx0aXBseSBib3RoIHNpZGVzIiBieSAtMTsgdGhpcyBhbHNvIHN3YXBzIHRoZQorICAgICAgICAgICAgICogY29tcGFyYXRvci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaSA9IC1pOworICAgICAgICAgICAgb3AgPSBfUHlfU3dhcHBlZE9wW29wXTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoaSA+IDAuMCk7CisgICAgICAgICh2b2lkKSBmcmV4cChpLCAmZXhwb25lbnQpOworICAgICAgICAvKiBleHBvbmVudCBpcyB0aGUgIyBvZiBiaXRzIGluIHYgYmVmb3JlIHRoZSByYWRpeCBwb2ludDsKKyAgICAgICAgICogd2Uga25vdyB0aGF0IG5iaXRzICh0aGUgIyBvZiBiaXRzIGluIHcpID4gNDggYXQgdGhpcyBwb2ludAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGV4cG9uZW50IDwgMCB8fCAoc2l6ZV90KWV4cG9uZW50IDwgbmJpdHMpIHsKKyAgICAgICAgICAgIGkgPSAxLjA7CisgICAgICAgICAgICBqID0gMi4wOworICAgICAgICAgICAgZ290byBDb21wYXJlOworICAgICAgICB9CisgICAgICAgIGlmICgoc2l6ZV90KWV4cG9uZW50ID4gbmJpdHMpIHsKKyAgICAgICAgICAgIGkgPSAyLjA7CisgICAgICAgICAgICBqID0gMS4wOworICAgICAgICAgICAgZ290byBDb21wYXJlOworICAgICAgICB9CisgICAgICAgIC8qIHYgYW5kIHcgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYml0cyBiZWZvcmUgdGhlIHJhZGl4CisgICAgICAgICAqIHBvaW50LiAgQ29uc3RydWN0IHR3byBsb25ncyB0aGF0IGhhdmUgdGhlIHNhbWUgY29tcGFyaXNvbgorICAgICAgICAgKiBvdXRjb21lLgorICAgICAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGZyYWNwYXJ0OworICAgICAgICAgICAgZG91YmxlIGludHBhcnQ7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvbmUgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKnZ2ID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp3dyA9IHc7CiAKLQkJCWlmICh3c2lnbiA8IDApIHsKLQkJCQl3dyA9IFB5TnVtYmVyX05lZ2F0aXZlKHcpOwotCQkJCWlmICh3dyA9PSBOVUxMKQotCQkJCQlnb3RvIEVycm9yOwotCQkJfQotCQkJZWxzZQotCQkJCVB5X0lOQ1JFRih3dyk7CisgICAgICAgICAgICBpZiAod3NpZ24gPCAwKSB7CisgICAgICAgICAgICAgICAgd3cgPSBQeU51bWJlcl9OZWdhdGl2ZSh3KTsKKyAgICAgICAgICAgICAgICBpZiAod3cgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYod3cpOwogCi0JCQlmcmFjcGFydCA9IG1vZGYoaSwgJmludHBhcnQpOwotCQkJdnYgPSBQeUxvbmdfRnJvbURvdWJsZShpbnRwYXJ0KTsKLQkJCWlmICh2diA9PSBOVUxMKQotCQkJCWdvdG8gRXJyb3I7CisgICAgICAgICAgICBmcmFjcGFydCA9IG1vZGYoaSwgJmludHBhcnQpOworICAgICAgICAgICAgdnYgPSBQeUxvbmdfRnJvbURvdWJsZShpbnRwYXJ0KTsKKyAgICAgICAgICAgIGlmICh2diA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CiAKLQkJCWlmIChmcmFjcGFydCAhPSAwLjApIHsKLQkJCQkvKiBTaGlmdCBsZWZ0LCBhbmQgb3IgYSAxIGJpdCBpbnRvIHZ2Ci0JCQkJICogdG8gcmVwcmVzZW50IHRoZSBsb3N0IGZyYWN0aW9uLgotCQkJCSAqLwotCQkJCVB5T2JqZWN0ICp0ZW1wOworICAgICAgICAgICAgaWYgKGZyYWNwYXJ0ICE9IDAuMCkgeworICAgICAgICAgICAgICAgIC8qIFNoaWZ0IGxlZnQsIGFuZCBvciBhIDEgYml0IGludG8gdnYKKyAgICAgICAgICAgICAgICAgKiB0byByZXByZXNlbnQgdGhlIGxvc3QgZnJhY3Rpb24uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnRlbXA7CiAKLQkJCQlvbmUgPSBQeUludF9Gcm9tTG9uZygxKTsKLQkJCQlpZiAob25lID09IE5VTEwpCi0JCQkJCWdvdG8gRXJyb3I7CisgICAgICAgICAgICAgICAgb25lID0gUHlJbnRfRnJvbUxvbmcoMSk7CisgICAgICAgICAgICAgICAgaWYgKG9uZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwogCi0JCQkJdGVtcCA9IFB5TnVtYmVyX0xzaGlmdCh3dywgb25lKTsKLQkJCQlpZiAodGVtcCA9PSBOVUxMKQotCQkJCQlnb3RvIEVycm9yOwotCQkJCVB5X0RFQ1JFRih3dyk7Ci0JCQkJd3cgPSB0ZW1wOworICAgICAgICAgICAgICAgIHRlbXAgPSBQeU51bWJlcl9Mc2hpZnQod3csIG9uZSk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYod3cpOworICAgICAgICAgICAgICAgIHd3ID0gdGVtcDsKIAotCQkJCXRlbXAgPSBQeU51bWJlcl9Mc2hpZnQodnYsIG9uZSk7Ci0JCQkJaWYgKHRlbXAgPT0gTlVMTCkKLQkJCQkJZ290byBFcnJvcjsKLQkJCQlQeV9ERUNSRUYodnYpOwotCQkJCXZ2ID0gdGVtcDsKKyAgICAgICAgICAgICAgICB0ZW1wID0gUHlOdW1iZXJfTHNoaWZ0KHZ2LCBvbmUpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZ2KTsKKyAgICAgICAgICAgICAgICB2diA9IHRlbXA7CiAKLQkJCQl0ZW1wID0gUHlOdW1iZXJfT3IodnYsIG9uZSk7Ci0JCQkJaWYgKHRlbXAgPT0gTlVMTCkKLQkJCQkJZ290byBFcnJvcjsKLQkJCQlQeV9ERUNSRUYodnYpOwotCQkJCXZ2ID0gdGVtcDsKLQkJCX0KKyAgICAgICAgICAgICAgICB0ZW1wID0gUHlOdW1iZXJfT3IodnYsIG9uZSk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodnYpOworICAgICAgICAgICAgICAgIHZ2ID0gdGVtcDsKKyAgICAgICAgICAgIH0KIAotCQkJciA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2diwgd3csIG9wKTsKLQkJCWlmIChyIDwgMCkKLQkJCQlnb3RvIEVycm9yOwotCQkJcmVzdWx0ID0gUHlCb29sX0Zyb21Mb25nKHIpOwotIAkJIEVycm9yOgotIAkJIAlQeV9YREVDUkVGKHZ2KTsKLSAJCSAJUHlfWERFQ1JFRih3dyk7Ci0gCQkgCVB5X1hERUNSRUYob25lKTsKLSAJCSAJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0gLyogZWxzZSBpZiAoUHlMb25nX0NoZWNrKHcpKSAqLworICAgICAgICAgICAgciA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2diwgd3csIG9wKTsKKyAgICAgICAgICAgIGlmIChyIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICAgICAgcmVzdWx0ID0gUHlCb29sX0Zyb21Mb25nKHIpOworICAgICAgICAgRXJyb3I6CisgICAgICAgICAgICBQeV9YREVDUkVGKHZ2KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYod3cpOworICAgICAgICAgICAgUHlfWERFQ1JFRihvbmUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0gLyogZWxzZSBpZiAoUHlMb25nX0NoZWNrKHcpKSAqLwogCi0JZWxzZQkvKiB3IGlzbid0IGZsb2F0LCBpbnQsIG9yIGxvbmcgKi8KLQkJZ290byBVbmltcGxlbWVudGVkOworICAgIGVsc2UgICAgICAgIC8qIHcgaXNuJ3QgZmxvYXQsIGludCwgb3IgbG9uZyAqLworICAgICAgICBnb3RvIFVuaW1wbGVtZW50ZWQ7CiAKICBDb21wYXJlOgotCVB5RlBFX1NUQVJUX1BST1RFQ1QoInJpY2hjb21wYXJlIiwgcmV0dXJuIE5VTEwpCi0Jc3dpdGNoIChvcCkgewotCWNhc2UgUHlfRVE6Ci0JCXIgPSBpID09IGo7Ci0JCWJyZWFrOwotCWNhc2UgUHlfTkU6Ci0JCXIgPSBpICE9IGo7Ci0JCWJyZWFrOwotCWNhc2UgUHlfTEU6Ci0JCXIgPSBpIDw9IGo7Ci0JCWJyZWFrOwotCWNhc2UgUHlfR0U6Ci0JCXIgPSBpID49IGo7Ci0JCWJyZWFrOwotCWNhc2UgUHlfTFQ6Ci0JCXIgPSBpIDwgajsKLQkJYnJlYWs7Ci0JY2FzZSBQeV9HVDoKLQkJciA9IGkgPiBqOwotCQlicmVhazsKLQl9Ci0JUHlGUEVfRU5EX1BST1RFQ1QocikKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHIpOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoInJpY2hjb21wYXJlIiwgcmV0dXJuIE5VTEwpCisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlfRVE6CisgICAgICAgIHIgPSBpID09IGo7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlfTkU6CisgICAgICAgIHIgPSBpICE9IGo7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlfTEU6CisgICAgICAgIHIgPSBpIDw9IGo7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlfR0U6CisgICAgICAgIHIgPSBpID49IGo7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlfTFQ6CisgICAgICAgIHIgPSBpIDwgajsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQeV9HVDoKKyAgICAgICAgciA9IGkgPiBqOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgUHlGUEVfRU5EX1BST1RFQ1QocikKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHIpOwogCiAgVW5pbXBsZW1lbnRlZDoKLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKIH0KIAogc3RhdGljIGxvbmcKIGZsb2F0X2hhc2goUHlGbG9hdE9iamVjdCAqdikKIHsKLQlyZXR1cm4gX1B5X0hhc2hEb3VibGUodi0+b2JfZnZhbCk7CisgICAgcmV0dXJuIF9QeV9IYXNoRG91YmxlKHYtPm9iX2Z2YWwpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfYWRkKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlkb3VibGUgYSxiOwotCUNPTlZFUlRfVE9fRE9VQkxFKHYsIGEpOwotCUNPTlZFUlRfVE9fRE9VQkxFKHcsIGIpOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImFkZCIsIHJldHVybiAwKQotCWEgPSBhICsgYjsKLQlQeUZQRV9FTkRfUFJPVEVDVChhKQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYSk7CisgICAgZG91YmxlIGEsYjsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJhZGQiLCByZXR1cm4gMCkKKyAgICBhID0gYSArIGI7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoYSkKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfc3ViKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlkb3VibGUgYSxiOwotCUNPTlZFUlRfVE9fRE9VQkxFKHYsIGEpOwotCUNPTlZFUlRfVE9fRE9VQkxFKHcsIGIpOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoInN1YnRyYWN0IiwgcmV0dXJuIDApCi0JYSA9IGEgLSBiOwotCVB5RlBFX0VORF9QUk9URUNUKGEpCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhKTsKKyAgICBkb3VibGUgYSxiOworICAgIENPTlZFUlRfVE9fRE9VQkxFKHYsIGEpOworICAgIENPTlZFUlRfVE9fRE9VQkxFKHcsIGIpOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoInN1YnRyYWN0IiwgcmV0dXJuIDApCisgICAgYSA9IGEgLSBiOworICAgIFB5RlBFX0VORF9QUk9URUNUKGEpCisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X211bChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JZG91YmxlIGEsYjsKLQlDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKLQlDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJtdWx0aXBseSIsIHJldHVybiAwKQotCWEgPSBhICogYjsKLQlQeUZQRV9FTkRfUFJPVEVDVChhKQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYSk7CisgICAgZG91YmxlIGEsYjsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJtdWx0aXBseSIsIHJldHVybiAwKQorICAgIGEgPSBhICogYjsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChhKQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9kaXYoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCWRvdWJsZSBhLGI7Ci0JQ09OVkVSVF9UT19ET1VCTEUodiwgYSk7Ci0JQ09OVkVSVF9UT19ET1VCTEUodywgYik7CisgICAgZG91YmxlIGEsYjsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKICNpZmRlZiBQeV9OQU4KLQlpZiAoYiA9PSAwLjApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAotCQkJCSJmbG9hdCBkaXZpc2lvbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGIgPT0gMC4wKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCBkaXZpc2lvbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJkaXZpZGUiLCByZXR1cm4gMCkKLQlhID0gYSAvIGI7Ci0JUHlGUEVfRU5EX1BST1RFQ1QoYSkKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImRpdmlkZSIsIHJldHVybiAwKQorICAgIGEgPSBhIC8gYjsKKyAgICBQeUZQRV9FTkRfUFJPVEVDVChhKQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoYSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9jbGFzc2ljX2RpdihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JZG91YmxlIGEsYjsKLQlDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKLQlDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKLQlpZiAoUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA+PSAyICYmCi0JICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAiY2xhc3NpYyBmbG9hdCBkaXZpc2lvbiIpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgZG91YmxlIGEsYjsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh3LCBiKTsKKyAgICBpZiAoUHlfRGl2aXNpb25XYXJuaW5nRmxhZyA+PSAyICYmCisgICAgICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAiY2xhc3NpYyBmbG9hdCBkaXZpc2lvbiIpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgUHlfTkFOCi0JaWYgKGIgPT0gMC4wKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiZmxvYXQgZGl2aXNpb24iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChiID09IDAuMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQgZGl2aXNpb24iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgiZGl2aWRlIiwgcmV0dXJuIDApCi0JYSA9IGEgLyBiOwotCVB5RlBFX0VORF9QUk9URUNUKGEpCi0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJkaXZpZGUiLCByZXR1cm4gMCkKKyAgICBhID0gYSAvIGI7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoYSkKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfcmVtKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlkb3VibGUgdngsIHd4OwotCWRvdWJsZSBtb2Q7Ci0JQ09OVkVSVF9UT19ET1VCTEUodiwgdngpOwotCUNPTlZFUlRfVE9fRE9VQkxFKHcsIHd4KTsKKyAgICBkb3VibGUgdngsIHd4OworICAgIGRvdWJsZSBtb2Q7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgdngpOworICAgIENPTlZFUlRfVE9fRE9VQkxFKHcsIHd4KTsKICNpZmRlZiBQeV9OQU4KLQlpZiAod3ggPT0gMC4wKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCQkiZmxvYXQgbW9kdWxvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAod3ggPT0gMC4wKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmbG9hdCBtb2R1bG8iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JUHlGUEVfU1RBUlRfUFJPVEVDVCgibW9kdWxvIiwgcmV0dXJuIDApCi0JbW9kID0gZm1vZCh2eCwgd3gpOwotCS8qIG5vdGU6IGNoZWNraW5nIG1vZCp3eCA8IDAgaXMgaW5jb3JyZWN0IC0tIHVuZGVyZmxvd3MgdG8KLQkgICAwIGlmIHd4IDwgc3FydChzbWFsbGVzdCBub256ZXJvIGRvdWJsZSkgKi8KLQlpZiAobW9kICYmICgod3ggPCAwKSAhPSAobW9kIDwgMCkpKSB7Ci0JCW1vZCArPSB3eDsKLQl9Ci0JUHlGUEVfRU5EX1BST1RFQ1QobW9kKQotCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUobW9kKTsKKyAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJtb2R1bG8iLCByZXR1cm4gMCkKKyAgICBtb2QgPSBmbW9kKHZ4LCB3eCk7CisgICAgLyogbm90ZTogY2hlY2tpbmcgbW9kKnd4IDwgMCBpcyBpbmNvcnJlY3QgLS0gdW5kZXJmbG93cyB0bworICAgICAgIDAgaWYgd3ggPCBzcXJ0KHNtYWxsZXN0IG5vbnplcm8gZG91YmxlKSAqLworICAgIGlmIChtb2QgJiYgKCh3eCA8IDApICE9IChtb2QgPCAwKSkpIHsKKyAgICAgICAgbW9kICs9IHd4OworICAgIH0KKyAgICBQeUZQRV9FTkRfUFJPVEVDVChtb2QpCisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShtb2QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZGl2bW9kKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlkb3VibGUgdngsIHd4OwotCWRvdWJsZSBkaXYsIG1vZCwgZmxvb3JkaXY7Ci0gCUNPTlZFUlRfVE9fRE9VQkxFKHYsIHZ4KTsKLSAJQ09OVkVSVF9UT19ET1VCTEUodywgd3gpOwotCWlmICh3eCA9PSAwLjApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLCAiZmxvYXQgZGl2bW9kKCkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImRpdm1vZCIsIHJldHVybiAwKQotCW1vZCA9IGZtb2QodngsIHd4KTsKLQkvKiBmbW9kIGlzIHR5cGljYWxseSBleGFjdCwgc28gdngtbW9kIGlzICptYXRoZW1hdGljYWxseSogYW4KLQkgICBleGFjdCBtdWx0aXBsZSBvZiB3eC4gIEJ1dCB0aGlzIGlzIGZwIGFyaXRobWV0aWMsIGFuZCBmcAotCSAgIHZ4IC0gbW9kIGlzIGFuIGFwcHJveGltYXRpb247IHRoZSByZXN1bHQgaXMgdGhhdCBkaXYgbWF5Ci0JICAgbm90IGJlIGFuIGV4YWN0IGludGVncmFsIHZhbHVlIGFmdGVyIHRoZSBkaXZpc2lvbiwgYWx0aG91Z2gKLQkgICBpdCB3aWxsIGFsd2F5cyBiZSB2ZXJ5IGNsb3NlIHRvIG9uZS4KLQkqLwotCWRpdiA9ICh2eCAtIG1vZCkgLyB3eDsKLQlpZiAobW9kKSB7Ci0JCS8qIGVuc3VyZSB0aGUgcmVtYWluZGVyIGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvciAqLwotCQlpZiAoKHd4IDwgMCkgIT0gKG1vZCA8IDApKSB7Ci0JCQltb2QgKz0gd3g7Ci0JCQlkaXYgLT0gMS4wOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiB0aGUgcmVtYWluZGVyIGlzIHplcm8sIGFuZCBpbiB0aGUgcHJlc2VuY2Ugb2Ygc2lnbmVkIHplcm9lcwotCQkgICBmbW9kIHJldHVybnMgZGlmZmVyZW50IHJlc3VsdHMgYWNyb3NzIHBsYXRmb3JtczsgZW5zdXJlCi0JCSAgIGl0IGhhcyB0aGUgc2FtZSBzaWduIGFzIHRoZSBkZW5vbWluYXRvcjsgd2UnZCBsaWtlIHRvIGRvCi0JCSAgICJtb2QgPSB3eCAqIDAuMCIsIGJ1dCB0aGF0IG1heSBnZXQgb3B0aW1pemVkIGF3YXkgKi8KLQkJbW9kICo9IG1vZDsgIC8qIGhpZGUgIm1vZCA9ICswIiBmcm9tIG9wdGltaXplciAqLwotCQlpZiAod3ggPCAwLjApCi0JCQltb2QgPSAtbW9kOwotCX0KLQkvKiBzbmFwIHF1b3RpZW50IHRvIG5lYXJlc3QgaW50ZWdyYWwgdmFsdWUgKi8KLQlpZiAoZGl2KSB7Ci0JCWZsb29yZGl2ID0gZmxvb3IoZGl2KTsKLQkJaWYgKGRpdiAtIGZsb29yZGl2ID4gMC41KQotCQkJZmxvb3JkaXYgKz0gMS4wOwotCX0KLQllbHNlIHsKLQkJLyogZGl2IGlzIHplcm8gLSBnZXQgdGhlIHNhbWUgc2lnbiBhcyB0aGUgdHJ1ZSBxdW90aWVudCAqLwotCQlkaXYgKj0gZGl2OwkvKiBoaWRlICJkaXYgPSArMCIgZnJvbSBvcHRpbWl6ZXJzICovCi0JCWZsb29yZGl2ID0gZGl2ICogdnggLyB3eDsgLyogemVybyB3LyBzaWduIG9mIHZ4L3d4ICovCi0JfQotCVB5RlBFX0VORF9QUk9URUNUKGZsb29yZGl2KQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZGQpIiwgZmxvb3JkaXYsIG1vZCk7CisgICAgZG91YmxlIHZ4LCB3eDsKKyAgICBkb3VibGUgZGl2LCBtb2QsIGZsb29yZGl2OworICAgIENPTlZFUlRfVE9fRE9VQkxFKHYsIHZ4KTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh3LCB3eCk7CisgICAgaWYgKHd4ID09IDAuMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsICJmbG9hdCBkaXZtb2QoKSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiZGl2bW9kIiwgcmV0dXJuIDApCisgICAgbW9kID0gZm1vZCh2eCwgd3gpOworICAgIC8qIGZtb2QgaXMgdHlwaWNhbGx5IGV4YWN0LCBzbyB2eC1tb2QgaXMgKm1hdGhlbWF0aWNhbGx5KiBhbgorICAgICAgIGV4YWN0IG11bHRpcGxlIG9mIHd4LiAgQnV0IHRoaXMgaXMgZnAgYXJpdGhtZXRpYywgYW5kIGZwCisgICAgICAgdnggLSBtb2QgaXMgYW4gYXBwcm94aW1hdGlvbjsgdGhlIHJlc3VsdCBpcyB0aGF0IGRpdiBtYXkKKyAgICAgICBub3QgYmUgYW4gZXhhY3QgaW50ZWdyYWwgdmFsdWUgYWZ0ZXIgdGhlIGRpdmlzaW9uLCBhbHRob3VnaAorICAgICAgIGl0IHdpbGwgYWx3YXlzIGJlIHZlcnkgY2xvc2UgdG8gb25lLgorICAgICovCisgICAgZGl2ID0gKHZ4IC0gbW9kKSAvIHd4OworICAgIGlmIChtb2QpIHsKKyAgICAgICAgLyogZW5zdXJlIHRoZSByZW1haW5kZXIgaGFzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRlbm9taW5hdG9yICovCisgICAgICAgIGlmICgod3ggPCAwKSAhPSAobW9kIDwgMCkpIHsKKyAgICAgICAgICAgIG1vZCArPSB3eDsKKyAgICAgICAgICAgIGRpdiAtPSAxLjA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIHRoZSByZW1haW5kZXIgaXMgemVybywgYW5kIGluIHRoZSBwcmVzZW5jZSBvZiBzaWduZWQgemVyb2VzCisgICAgICAgICAgIGZtb2QgcmV0dXJucyBkaWZmZXJlbnQgcmVzdWx0cyBhY3Jvc3MgcGxhdGZvcm1zOyBlbnN1cmUKKyAgICAgICAgICAgaXQgaGFzIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGRlbm9taW5hdG9yOyB3ZSdkIGxpa2UgdG8gZG8KKyAgICAgICAgICAgIm1vZCA9IHd4ICogMC4wIiwgYnV0IHRoYXQgbWF5IGdldCBvcHRpbWl6ZWQgYXdheSAqLworICAgICAgICBtb2QgKj0gbW9kOyAgLyogaGlkZSAibW9kID0gKzAiIGZyb20gb3B0aW1pemVyICovCisgICAgICAgIGlmICh3eCA8IDAuMCkKKyAgICAgICAgICAgIG1vZCA9IC1tb2Q7CisgICAgfQorICAgIC8qIHNuYXAgcXVvdGllbnQgdG8gbmVhcmVzdCBpbnRlZ3JhbCB2YWx1ZSAqLworICAgIGlmIChkaXYpIHsKKyAgICAgICAgZmxvb3JkaXYgPSBmbG9vcihkaXYpOworICAgICAgICBpZiAoZGl2IC0gZmxvb3JkaXYgPiAwLjUpCisgICAgICAgICAgICBmbG9vcmRpdiArPSAxLjA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBkaXYgaXMgemVybyAtIGdldCB0aGUgc2FtZSBzaWduIGFzIHRoZSB0cnVlIHF1b3RpZW50ICovCisgICAgICAgIGRpdiAqPSBkaXY7ICAgICAgICAgICAgIC8qIGhpZGUgImRpdiA9ICswIiBmcm9tIG9wdGltaXplcnMgKi8KKyAgICAgICAgZmxvb3JkaXYgPSBkaXYgKiB2eCAvIHd4OyAvKiB6ZXJvIHcvIHNpZ24gb2Ygdngvd3ggKi8KKyAgICB9CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoZmxvb3JkaXYpCisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkZCkiLCBmbG9vcmRpdiwgbW9kKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2Zsb29yX2RpdihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlPYmplY3QgKnQsICpyOworICAgIFB5T2JqZWN0ICp0LCAqcjsKIAotCXQgPSBmbG9hdF9kaXZtb2Qodiwgdyk7Ci0JaWYgKHQgPT0gTlVMTCB8fCB0ID09IFB5X05vdEltcGxlbWVudGVkKQotCQlyZXR1cm4gdDsKLQlhc3NlcnQoUHlUdXBsZV9DaGVja0V4YWN0KHQpKTsKLQlyID0gUHlUdXBsZV9HRVRfSVRFTSh0LCAwKTsKLQlQeV9JTkNSRUYocik7Ci0JUHlfREVDUkVGKHQpOwotCXJldHVybiByOworICAgIHQgPSBmbG9hdF9kaXZtb2Qodiwgdyk7CisgICAgaWYgKHQgPT0gTlVMTCB8fCB0ID09IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICByZXR1cm4gdDsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVja0V4YWN0KHQpKTsKKyAgICByID0gUHlUdXBsZV9HRVRfSVRFTSh0LCAwKTsKKyAgICBQeV9JTkNSRUYocik7CisgICAgUHlfREVDUkVGKHQpOworICAgIHJldHVybiByOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfcG93KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgUHlPYmplY3QgKnopCiB7Ci0JZG91YmxlIGl2LCBpdywgaXg7CisgICAgZG91YmxlIGl2LCBpdywgaXg7CiAKLQlpZiAoKFB5T2JqZWN0ICopeiAhPSBQeV9Ob25lKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJwb3coKSAzcmQgYXJndW1lbnQgbm90ICIKLQkJCSJhbGxvd2VkIHVubGVzcyBhbGwgYXJndW1lbnRzIGFyZSBpbnRlZ2VycyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKChQeU9iamVjdCAqKXogIT0gUHlfTm9uZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicG93KCkgM3JkIGFyZ3VtZW50IG5vdCAiCisgICAgICAgICAgICAiYWxsb3dlZCB1bmxlc3MgYWxsIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JQ09OVkVSVF9UT19ET1VCTEUodiwgaXYpOwotCUNPTlZFUlRfVE9fRE9VQkxFKHcsIGl3KTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCBpdik7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodywgaXcpOwogCi0JLyogU29ydCBvdXQgc3BlY2lhbCBjYXNlcyBoZXJlIGluc3RlYWQgb2YgcmVseWluZyBvbiBwb3coKSAqLwotCWlmIChpdyA9PSAwKSB7IAkJLyogdioqMCBpcyAxLCBldmVuIDAqKjAgKi8KLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgxLjApOwotCX0KLQlpZiAoaXYgPT0gMC4wKSB7ICAvKiAwKip3IGlzIGVycm9yIGlmIHc8MCwgZWxzZSAxICovCi0JCWlmIChpdyA8IDAuMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAotCQkJCQkiMC4wIGNhbm5vdCBiZSByYWlzZWQgdG8gYSBuZWdhdGl2ZSBwb3dlciIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgwLjApOwotCX0KLQlpZiAoaXYgPT0gMS4wKSB7IC8qIDEqKncgaXMgMSwgZXZlbiAxKippbmYgYW5kIDEqKm5hbiAqLwotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKDEuMCk7Ci0JfQotCWlmIChpdiA8IDAuMCkgewotCQkvKiBXaGV0aGVyIHRoaXMgaXMgYW4gZXJyb3IgaXMgYSBtZXNzLCBhbmQgYnVtcHMgaW50byBsaWJtCi0JCSAqIGJ1Z3Mgc28gd2UgaGF2ZSB0byBmaWd1cmUgaXQgb3V0IG91cnNlbHZlcy4KLQkJICovCi0JCWlmIChpdyAhPSBmbG9vcihpdykpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgbnVtYmVyICIKLQkJCQkiY2Fubm90IGJlIHJhaXNlZCB0byBhIGZyYWN0aW9uYWwgcG93ZXIiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIGl3IGlzIGFuIGV4YWN0IGludGVnZXIsIGFsYmVpdCBwZXJoYXBzIGEgdmVyeSBsYXJnZSBvbmUuCi0JCSAqIC0xIHJhaXNlZCB0byBhbiBleGFjdCBpbnRlZ2VyIHNob3VsZCBuZXZlciBiZSBleGNlcHRpb25hbC4KLQkJICogQWxhcywgc29tZSBsaWJtcyAoY2hpZWZseSBnbGliYyBhcyBvZiBlYXJseSAyMDAzKSByZXR1cm4KLQkJICogTmFOIGFuZCBzZXQgRURPTSBvbiBwb3coLTEsIGxhcmdlX2ludCkgaWYgdGhlIGludCBkb2Vzbid0Ci0JCSAqIGhhcHBlbiB0byBiZSByZXByZXNlbnRhYmxlIGluIGEgKkMqIGludGVnZXIuICBUaGF0J3MgYQotCQkgKiBidWc7IHdlIGxldCB0aGF0IHNsaWRlIGluIG1hdGgucG93KCkgKHdoaWNoIGN1cnJlbnRseQotCQkgKiByZWZsZWN0cyBhbGwgcGxhdGZvcm0gYWNjaWRlbnRzKSwgYnV0IG5vdCBmb3IgUHl0aG9uJ3MgKiouCi0JCSAqLwotCQkgaWYgKGl2ID09IC0xLjAgJiYgUHlfSVNfRklOSVRFKGl3KSkgewotCQkgCS8qIFJldHVybiAxIGlmIGl3IGlzIGV2ZW4sIC0xIGlmIGl3IGlzIG9kZDsgdGhlcmUncwotCQkgCSAqIG5vIGd1YXJhbnRlZSB0aGF0IGFueSBDIGludGVncmFsIHR5cGUgaXMgYmlnCi0JCSAJICogZW5vdWdoIHRvIGhvbGQgaXcsIHNvIHdlIGhhdmUgdG8gY2hlY2sgdGhpcwotCQkgCSAqIGluZGlyZWN0bHkuCi0JCSAJICovCi0JCSAJaXggPSBmbG9vcihpdyAqIDAuNSkgKiAyLjA7Ci0JCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGl4ID09IGl3ID8gMS4wIDogLTEuMCk7Ci0JCX0KLQkJLyogRWxzZSBpdiAhPSAtMS4wLCBhbmQgb3ZlcmZsb3cgb3IgdW5kZXJmbG93IGFyZSBwb3NzaWJsZS4KLQkJICogVW5sZXNzIHdlJ3JlIHRvIHdyaXRlIHBvdygpIG91cnNlbHZlcywgd2UgaGF2ZSB0byB0cnVzdAotCQkgKiB0aGUgcGxhdGZvcm0gdG8gZG8gdGhpcyBjb3JyZWN0bHkuCi0JCSAqLwotCX0KLQllcnJubyA9IDA7Ci0JUHlGUEVfU1RBUlRfUFJPVEVDVCgicG93IiwgcmV0dXJuIE5VTEwpCi0JaXggPSBwb3coaXYsIGl3KTsKLQlQeUZQRV9FTkRfUFJPVEVDVChpeCkKLQlQeV9BREpVU1RfRVJBTkdFMShpeCk7Ci0JaWYgKGVycm5vICE9IDApIHsKLQkJLyogV2UgZG9uJ3QgZXhwZWN0IGFueSBlcnJubyB2YWx1ZSBvdGhlciB0aGFuIEVSQU5HRSwgYnV0Ci0JCSAqIHRoZSByYW5nZSBvZiBsaWJtIGJ1Z3MgYXBwZWFycyB1bmJvdW5kZWQuCi0JCSAqLwotCQlQeUVycl9TZXRGcm9tRXJybm8oZXJybm8gPT0gRVJBTkdFID8gUHlFeGNfT3ZlcmZsb3dFcnJvciA6Ci0JCQkJCQkgICAgIFB5RXhjX1ZhbHVlRXJyb3IpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShpeCk7CisgICAgLyogU29ydCBvdXQgc3BlY2lhbCBjYXNlcyBoZXJlIGluc3RlYWQgb2YgcmVseWluZyBvbiBwb3coKSAqLworICAgIGlmIChpdyA9PSAwKSB7ICAgICAgICAgICAgICAvKiB2KiowIGlzIDEsIGV2ZW4gMCoqMCAqLworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKDEuMCk7CisgICAgfQorICAgIGlmIChpdiA9PSAwLjApIHsgIC8qIDAqKncgaXMgZXJyb3IgaWYgdzwwLCBlbHNlIDEgKi8KKyAgICAgICAgaWYgKGl3IDwgMC4wKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAuMCBjYW5ub3QgYmUgcmFpc2VkIHRvIGEgbmVnYXRpdmUgcG93ZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMC4wKTsKKyAgICB9CisgICAgaWYgKGl2ID09IDEuMCkgeyAvKiAxKip3IGlzIDEsIGV2ZW4gMSoqaW5mIGFuZCAxKipuYW4gKi8KKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgxLjApOworICAgIH0KKyAgICBpZiAoaXYgPCAwLjApIHsKKyAgICAgICAgLyogV2hldGhlciB0aGlzIGlzIGFuIGVycm9yIGlzIGEgbWVzcywgYW5kIGJ1bXBzIGludG8gbGlibQorICAgICAgICAgKiBidWdzIHNvIHdlIGhhdmUgdG8gZmlndXJlIGl0IG91dCBvdXJzZWx2ZXMuCisgICAgICAgICAqLworICAgICAgICBpZiAoaXcgIT0gZmxvb3IoaXcpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIG51bWJlciAiCisgICAgICAgICAgICAgICAgImNhbm5vdCBiZSByYWlzZWQgdG8gYSBmcmFjdGlvbmFsIHBvd2VyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvKiBpdyBpcyBhbiBleGFjdCBpbnRlZ2VyLCBhbGJlaXQgcGVyaGFwcyBhIHZlcnkgbGFyZ2Ugb25lLgorICAgICAgICAgKiAtMSByYWlzZWQgdG8gYW4gZXhhY3QgaW50ZWdlciBzaG91bGQgbmV2ZXIgYmUgZXhjZXB0aW9uYWwuCisgICAgICAgICAqIEFsYXMsIHNvbWUgbGlibXMgKGNoaWVmbHkgZ2xpYmMgYXMgb2YgZWFybHkgMjAwMykgcmV0dXJuCisgICAgICAgICAqIE5hTiBhbmQgc2V0IEVET00gb24gcG93KC0xLCBsYXJnZV9pbnQpIGlmIHRoZSBpbnQgZG9lc24ndAorICAgICAgICAgKiBoYXBwZW4gdG8gYmUgcmVwcmVzZW50YWJsZSBpbiBhICpDKiBpbnRlZ2VyLiAgVGhhdCdzIGEKKyAgICAgICAgICogYnVnOyB3ZSBsZXQgdGhhdCBzbGlkZSBpbiBtYXRoLnBvdygpICh3aGljaCBjdXJyZW50bHkKKyAgICAgICAgICogcmVmbGVjdHMgYWxsIHBsYXRmb3JtIGFjY2lkZW50cyksIGJ1dCBub3QgZm9yIFB5dGhvbidzICoqLgorICAgICAgICAgKi8KKyAgICAgICAgIGlmIChpdiA9PSAtMS4wICYmIFB5X0lTX0ZJTklURShpdykpIHsKKyAgICAgICAgICAgIC8qIFJldHVybiAxIGlmIGl3IGlzIGV2ZW4sIC0xIGlmIGl3IGlzIG9kZDsgdGhlcmUncworICAgICAgICAgICAgICogbm8gZ3VhcmFudGVlIHRoYXQgYW55IEMgaW50ZWdyYWwgdHlwZSBpcyBiaWcKKyAgICAgICAgICAgICAqIGVub3VnaCB0byBob2xkIGl3LCBzbyB3ZSBoYXZlIHRvIGNoZWNrIHRoaXMKKyAgICAgICAgICAgICAqIGluZGlyZWN0bHkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGl4ID0gZmxvb3IoaXcgKiAwLjUpICogMi4wOworICAgICAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShpeCA9PSBpdyA/IDEuMCA6IC0xLjApOworICAgICAgICB9CisgICAgICAgIC8qIEVsc2UgaXYgIT0gLTEuMCwgYW5kIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBhcmUgcG9zc2libGUuCisgICAgICAgICAqIFVubGVzcyB3ZSdyZSB0byB3cml0ZSBwb3coKSBvdXJzZWx2ZXMsIHdlIGhhdmUgdG8gdHJ1c3QKKyAgICAgICAgICogdGhlIHBsYXRmb3JtIHRvIGRvIHRoaXMgY29ycmVjdGx5LgorICAgICAgICAgKi8KKyAgICB9CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoInBvdyIsIHJldHVybiBOVUxMKQorICAgIGl4ID0gcG93KGl2LCBpdyk7CisgICAgUHlGUEVfRU5EX1BST1RFQ1QoaXgpCisgICAgUHlfQURKVVNUX0VSQU5HRTEoaXgpOworICAgIGlmIChlcnJubyAhPSAwKSB7CisgICAgICAgIC8qIFdlIGRvbid0IGV4cGVjdCBhbnkgZXJybm8gdmFsdWUgb3RoZXIgdGhhbiBFUkFOR0UsIGJ1dAorICAgICAgICAgKiB0aGUgcmFuZ2Ugb2YgbGlibSBidWdzIGFwcGVhcnMgdW5ib3VuZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKGVycm5vID09IEVSQU5HRSA/IFB5RXhjX092ZXJmbG93RXJyb3IgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoaXgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfbmVnKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgtdi0+b2JfZnZhbCk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgtdi0+b2JfZnZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9hYnMoUHlGbG9hdE9iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGZhYnModi0+b2JfZnZhbCkpOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZmFicyh2LT5vYl9mdmFsKSk7CiB9CiAKIHN0YXRpYyBpbnQKIGZsb2F0X25vbnplcm8oUHlGbG9hdE9iamVjdCAqdikKIHsKLQlyZXR1cm4gdi0+b2JfZnZhbCAhPSAwLjA7CisgICAgcmV0dXJuIHYtPm9iX2Z2YWwgIT0gMC4wOwogfQogCiBzdGF0aWMgaW50CiBmbG9hdF9jb2VyY2UoUHlPYmplY3QgKipwdiwgUHlPYmplY3QgKipwdykKIHsKLQlpZiAoUHlJbnRfQ2hlY2soKnB3KSkgewotCQlsb25nIHggPSBQeUludF9Bc0xvbmcoKnB3KTsKLQkJKnB3ID0gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpeCk7Ci0JCVB5X0lOQ1JFRigqcHYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKCpwdykpIHsKLQkJZG91YmxlIHggPSBQeUxvbmdfQXNEb3VibGUoKnB3KTsKLQkJaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqcHcgPSBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7Ci0JCVB5X0lOQ1JFRigqcHYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoUHlGbG9hdF9DaGVjaygqcHcpKSB7Ci0JCVB5X0lOQ1JFRigqcHYpOwotCQlQeV9JTkNSRUYoKnB3KTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOyAvKiBDYW4ndCBkbyBpdCAqLworICAgIGlmIChQeUludF9DaGVjaygqcHcpKSB7CisgICAgICAgIGxvbmcgeCA9IFB5SW50X0FzTG9uZygqcHcpOworICAgICAgICAqcHcgPSBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSl4KTsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soKnB3KSkgeworICAgICAgICBkb3VibGUgeCA9IFB5TG9uZ19Bc0RvdWJsZSgqcHcpOworICAgICAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICpwdyA9IFB5RmxvYXRfRnJvbURvdWJsZSh4KTsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeUZsb2F0X0NoZWNrKCpwdykpIHsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIFB5X0lOQ1JFRigqcHcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7IC8qIENhbid0IGRvIGl0ICovCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9pc19pbnRlZ2VyKFB5T2JqZWN0ICp2KQogewotCWRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQlQeU9iamVjdCAqbzsKLQkKLQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlfSVNfRklOSVRFKHgpKQotCQlQeV9SRVRVUk5fRkFMU0U7Ci0JZXJybm8gPSAwOwotCVB5RlBFX1NUQVJUX1BST1RFQ1QoImlzX2ludGVnZXIiLCByZXR1cm4gTlVMTCkKLQlvID0gKGZsb29yKHgpID09IHgpID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwotCVB5RlBFX0VORF9QUk9URUNUKHgpCi0JaWYgKGVycm5vICE9IDApIHsKLQkJUHlFcnJfU2V0RnJvbUVycm5vKGVycm5vID09IEVSQU5HRSA/IFB5RXhjX092ZXJmbG93RXJyb3IgOgotCQkJCQkJICAgICBQeUV4Y19WYWx1ZUVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihvKTsKLQlyZXR1cm4gbzsKKyAgICBkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgUHlPYmplY3QgKm87CisKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlfSVNfRklOSVRFKHgpKQorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgZXJybm8gPSAwOworICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImlzX2ludGVnZXIiLCByZXR1cm4gTlVMTCkKKyAgICBvID0gKGZsb29yKHgpID09IHgpID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgIFB5RlBFX0VORF9QUk9URUNUKHgpCisgICAgaWYgKGVycm5vICE9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKGVycm5vID09IEVSQU5HRSA/IFB5RXhjX092ZXJmbG93RXJyb3IgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihvKTsKKyAgICByZXR1cm4gbzsKIH0KIAogI2lmIDAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9pc19pbmYoUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19JTkZJTklUWSh4KSk7CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19JTkZJTklUWSh4KSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9pc19uYW4oUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19OQU4oeCkpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICBpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpUHlfSVNfTkFOKHgpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2lzX2Zpbml0ZShQeU9iamVjdCAqdikKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKVB5X0lTX0ZJTklURSh4KSk7CisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeV9JU19GSU5JVEUoeCkpOwogfQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF90cnVuYyhQeU9iamVjdCAqdikKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JZG91YmxlIHdob2xlcGFydDsJLyogaW50ZWdyYWwgcG9ydGlvbiBvZiB4LCByb3VuZGVkIHRvd2FyZCAwICovCisgICAgZG91YmxlIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgIGRvdWJsZSB3aG9sZXBhcnQ7ICAgICAgICAgICAvKiBpbnRlZ3JhbCBwb3J0aW9uIG9mIHgsIHJvdW5kZWQgdG93YXJkIDAgKi8KIAotCSh2b2lkKW1vZGYoeCwgJndob2xlcGFydCk7Ci0JLyogVHJ5IHRvIGdldCBvdXQgY2hlYXAgaWYgdGhpcyBmaXRzIGluIGEgUHl0aG9uIGludC4gIFRoZSBhdHRlbXB0Ci0JICogdG8gY2FzdCB0byBsb25nIG11c3QgYmUgcHJvdGVjdGVkLCBhcyBDIGRvZXNuJ3QgZGVmaW5lIHdoYXQKLQkgKiBoYXBwZW5zIGlmIHRoZSBkb3VibGUgaXMgdG9vIGJpZyB0byBmaXQgaW4gYSBsb25nLiAgU29tZSByYXJlCi0JICogc3lzdGVtcyByYWlzZSBhbiBleGNlcHRpb24gdGhlbiAoUklTQ09TIHdhcyBtZW50aW9uZWQgYXMgb25lLAotCSAqIGFuZCBzb21lb25lIHVzaW5nIGEgbm9uLWRlZmF1bHQgb3B0aW9uIG9uIFN1biBhbHNvIGJ1bXBlZCBpbnRvCi0JICogdGhhdCkuICBOb3RlIHRoYXQgY2hlY2tpbmcgZm9yID49IGFuZCA8PSBMT05HX3tNSU4sTUFYfSB3b3VsZAotCSAqIHN0aWxsIGJlIHZ1bG5lcmFibGU6ICBpZiBhIGxvbmcgaGFzIG1vcmUgYml0cyBvZiBwcmVjaXNpb24gdGhhbgotCSAqIGEgZG91YmxlLCBjYXN0aW5nIE1JTi9NQVggdG8gZG91YmxlIG1heSB5aWVsZCBhbiBhcHByb3hpbWF0aW9uLAotCSAqIGFuZCBpZiB0aGF0J3Mgcm91bmRlZCB1cCwgdGhlbiwgZS5nLiwgd2hvbGVwYXJ0PUxPTkdfTUFYKzEgd291bGQKLQkgKiB5aWVsZCB0cnVlIGZyb20gdGhlIEMgZXhwcmVzc2lvbiB3aG9sZXBhcnQ8PUxPTkdfTUFYLCBkZXNwaXRlCi0JICogdGhhdCB3aG9sZXBhcnQgaXMgYWN0dWFsbHkgZ3JlYXRlciB0aGFuIExPTkdfTUFYLgotCSAqLwotCWlmIChMT05HX01JTiA8IHdob2xlcGFydCAmJiB3aG9sZXBhcnQgPCBMT05HX01BWCkgewotCQljb25zdCBsb25nIGFzbG9uZyA9IChsb25nKXdob2xlcGFydDsKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKGFzbG9uZyk7Ci0JfQotCXJldHVybiBQeUxvbmdfRnJvbURvdWJsZSh3aG9sZXBhcnQpOworICAgICh2b2lkKW1vZGYoeCwgJndob2xlcGFydCk7CisgICAgLyogVHJ5IHRvIGdldCBvdXQgY2hlYXAgaWYgdGhpcyBmaXRzIGluIGEgUHl0aG9uIGludC4gIFRoZSBhdHRlbXB0CisgICAgICogdG8gY2FzdCB0byBsb25nIG11c3QgYmUgcHJvdGVjdGVkLCBhcyBDIGRvZXNuJ3QgZGVmaW5lIHdoYXQKKyAgICAgKiBoYXBwZW5zIGlmIHRoZSBkb3VibGUgaXMgdG9vIGJpZyB0byBmaXQgaW4gYSBsb25nLiAgU29tZSByYXJlCisgICAgICogc3lzdGVtcyByYWlzZSBhbiBleGNlcHRpb24gdGhlbiAoUklTQ09TIHdhcyBtZW50aW9uZWQgYXMgb25lLAorICAgICAqIGFuZCBzb21lb25lIHVzaW5nIGEgbm9uLWRlZmF1bHQgb3B0aW9uIG9uIFN1biBhbHNvIGJ1bXBlZCBpbnRvCisgICAgICogdGhhdCkuICBOb3RlIHRoYXQgY2hlY2tpbmcgZm9yID49IGFuZCA8PSBMT05HX3tNSU4sTUFYfSB3b3VsZAorICAgICAqIHN0aWxsIGJlIHZ1bG5lcmFibGU6ICBpZiBhIGxvbmcgaGFzIG1vcmUgYml0cyBvZiBwcmVjaXNpb24gdGhhbgorICAgICAqIGEgZG91YmxlLCBjYXN0aW5nIE1JTi9NQVggdG8gZG91YmxlIG1heSB5aWVsZCBhbiBhcHByb3hpbWF0aW9uLAorICAgICAqIGFuZCBpZiB0aGF0J3Mgcm91bmRlZCB1cCwgdGhlbiwgZS5nLiwgd2hvbGVwYXJ0PUxPTkdfTUFYKzEgd291bGQKKyAgICAgKiB5aWVsZCB0cnVlIGZyb20gdGhlIEMgZXhwcmVzc2lvbiB3aG9sZXBhcnQ8PUxPTkdfTUFYLCBkZXNwaXRlCisgICAgICogdGhhdCB3aG9sZXBhcnQgaXMgYWN0dWFsbHkgZ3JlYXRlciB0aGFuIExPTkdfTUFYLgorICAgICAqLworICAgIGlmIChMT05HX01JTiA8IHdob2xlcGFydCAmJiB3aG9sZXBhcnQgPCBMT05HX01BWCkgeworICAgICAgICBjb25zdCBsb25nIGFzbG9uZyA9IChsb25nKXdob2xlcGFydDsKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGFzbG9uZyk7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbURvdWJsZSh3aG9sZXBhcnQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfbG9uZyhQeU9iamVjdCAqdikKIHsKLQlkb3VibGUgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tRG91YmxlKHgpOworICAgIGRvdWJsZSB4ID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Eb3VibGUoeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9mbG9hdChQeU9iamVjdCAqdikKIHsKLQlpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHYpKQotCQlQeV9JTkNSRUYodik7Ci0JZWxzZQotCQl2ID0gUHlGbG9hdF9Gcm9tRG91YmxlKCgoUHlGbG9hdE9iamVjdCAqKXYpLT5vYl9mdmFsKTsKLQlyZXR1cm4gdjsKKyAgICBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHYpKQorICAgICAgICBQeV9JTkNSRUYodik7CisgICAgZWxzZQorICAgICAgICB2ID0gUHlGbG9hdF9Gcm9tRG91YmxlKCgoUHlGbG9hdE9iamVjdCAqKXYpLT5vYl9mdmFsKTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogdHVybiBBU0NJSSBoZXggY2hhcmFjdGVycyBpbnRvIGludGVnZXIgdmFsdWVzIGFuZCB2aWNlIHZlcnNhICovCkBAIC0xMTI2LDczICsxMTI2LDczIEBACiBzdGF0aWMgY2hhcgogY2hhcl9mcm9tX2hleChpbnQgeCkKIHsKLQlhc3NlcnQoMCA8PSB4ICYmIHggPCAxNik7Ci0JcmV0dXJuICIwMTIzNDU2Nzg5YWJjZGVmIlt4XTsKKyAgICBhc3NlcnQoMCA8PSB4ICYmIHggPCAxNik7CisgICAgcmV0dXJuICIwMTIzNDU2Nzg5YWJjZGVmIlt4XTsKIH0KIAogc3RhdGljIGludAogaGV4X2Zyb21fY2hhcihjaGFyIGMpIHsKLQlpbnQgeDsKLQlzd2l0Y2goYykgewotCWNhc2UgJzAnOgotCQl4ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAnMSc6Ci0JCXggPSAxOwotCQlicmVhazsKLQljYXNlICcyJzoKLQkJeCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgJzMnOgotCQl4ID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSAnNCc6Ci0JCXggPSA0OwotCQlicmVhazsKLQljYXNlICc1JzoKLQkJeCA9IDU7Ci0JCWJyZWFrOwotCWNhc2UgJzYnOgotCQl4ID0gNjsKLQkJYnJlYWs7Ci0JY2FzZSAnNyc6Ci0JCXggPSA3OwotCQlicmVhazsKLQljYXNlICc4JzoKLQkJeCA9IDg7Ci0JCWJyZWFrOwotCWNhc2UgJzknOgotCQl4ID0gOTsKLQkJYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JY2FzZSAnQSc6Ci0JCXggPSAxMDsKLQkJYnJlYWs7Ci0JY2FzZSAnYic6Ci0JY2FzZSAnQic6Ci0JCXggPSAxMTsKLQkJYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JY2FzZSAnQyc6Ci0JCXggPSAxMjsKLQkJYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JY2FzZSAnRCc6Ci0JCXggPSAxMzsKLQkJYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JY2FzZSAnRSc6Ci0JCXggPSAxNDsKLQkJYnJlYWs7Ci0JY2FzZSAnZic6Ci0JY2FzZSAnRic6Ci0JCXggPSAxNTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJeCA9IC0xOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHg7CisgICAgaW50IHg7CisgICAgc3dpdGNoKGMpIHsKKyAgICBjYXNlICcwJzoKKyAgICAgICAgeCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJzEnOgorICAgICAgICB4ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnMic6CisgICAgICAgIHggPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlICczJzoKKyAgICAgICAgeCA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJzQnOgorICAgICAgICB4ID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnNSc6CisgICAgICAgIHggPSA1OworICAgICAgICBicmVhazsKKyAgICBjYXNlICc2JzoKKyAgICAgICAgeCA9IDY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJzcnOgorICAgICAgICB4ID0gNzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnOCc6CisgICAgICAgIHggPSA4OworICAgICAgICBicmVhazsKKyAgICBjYXNlICc5JzoKKyAgICAgICAgeCA9IDk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2EnOgorICAgIGNhc2UgJ0EnOgorICAgICAgICB4ID0gMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgIGNhc2UgJ0InOgorICAgICAgICB4ID0gMTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2MnOgorICAgIGNhc2UgJ0MnOgorICAgICAgICB4ID0gMTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2QnOgorICAgIGNhc2UgJ0QnOgorICAgICAgICB4ID0gMTM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2UnOgorICAgIGNhc2UgJ0UnOgorICAgICAgICB4ID0gMTQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2YnOgorICAgIGNhc2UgJ0YnOgorICAgICAgICB4ID0gMTU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHggPSAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB4OwogfQogCiAvKiBjb252ZXJ0IGEgZmxvYXQgdG8gYSBoZXhhZGVjaW1hbCBzdHJpbmcgKi8KQEAgLTEyMDQsNTQgKzEyMDQsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9oZXgoUHlPYmplY3QgKnYpCiB7Ci0JZG91YmxlIHgsIG07Ci0JaW50IGUsIHNoaWZ0LCBpLCBzaSwgZXNpZ247Ci0JLyogU3BhY2UgZm9yIDErKFRPSEVYX05CSVRTLTEpLzQgZGlnaXRzLCBhIGRlY2ltYWwgcG9pbnQsIGFuZCB0aGUKLQkgICB0cmFpbGluZyBOVUwgYnl0ZS4gKi8KLQljaGFyIHNbKFRPSEVYX05CSVRTLTEpLzQrM107CisgICAgZG91YmxlIHgsIG07CisgICAgaW50IGUsIHNoaWZ0LCBpLCBzaSwgZXNpZ247CisgICAgLyogU3BhY2UgZm9yIDErKFRPSEVYX05CSVRTLTEpLzQgZGlnaXRzLCBhIGRlY2ltYWwgcG9pbnQsIGFuZCB0aGUKKyAgICAgICB0cmFpbGluZyBOVUwgYnl0ZS4gKi8KKyAgICBjaGFyIHNbKFRPSEVYX05CSVRTLTEpLzQrM107CiAKLQlDT05WRVJUX1RPX0RPVUJMRSh2LCB4KTsKKyAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCB4KTsKIAotCWlmIChQeV9JU19OQU4oeCkgfHwgUHlfSVNfSU5GSU5JVFkoeCkpCi0JCXJldHVybiBmbG9hdF9zdHIoKFB5RmxvYXRPYmplY3QgKil2KTsKKyAgICBpZiAoUHlfSVNfTkFOKHgpIHx8IFB5X0lTX0lORklOSVRZKHgpKQorICAgICAgICByZXR1cm4gZmxvYXRfc3RyKChQeUZsb2F0T2JqZWN0ICopdik7CiAKLQlpZiAoeCA9PSAwLjApIHsKLQkJaWYoY29weXNpZ24oMS4wLCB4KSA9PSAtMS4wKQotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIi0weDAuMHArMCIpOwotCQllbHNlCi0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiMHgwLjBwKzAiKTsKLQl9CisgICAgaWYgKHggPT0gMC4wKSB7CisgICAgICAgIGlmKGNvcHlzaWduKDEuMCwgeCkgPT0gLTEuMCkKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCItMHgwLjBwKzAiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjB4MC4wcCswIik7CisgICAgfQogCi0JbSA9IGZyZXhwKGZhYnMoeCksICZlKTsKLQlzaGlmdCA9IDEgLSBNQVgoREJMX01JTl9FWFAgLSBlLCAwKTsKLQltID0gbGRleHAobSwgc2hpZnQpOwotCWUgLT0gc2hpZnQ7CisgICAgbSA9IGZyZXhwKGZhYnMoeCksICZlKTsKKyAgICBzaGlmdCA9IDEgLSBNQVgoREJMX01JTl9FWFAgLSBlLCAwKTsKKyAgICBtID0gbGRleHAobSwgc2hpZnQpOworICAgIGUgLT0gc2hpZnQ7CiAKLQlzaSA9IDA7Ci0Jc1tzaV0gPSBjaGFyX2Zyb21faGV4KChpbnQpbSk7Ci0Jc2krKzsKLQltIC09IChpbnQpbTsKLQlzW3NpXSA9ICcuJzsKLQlzaSsrOwotCWZvciAoaT0wOyBpIDwgKFRPSEVYX05CSVRTLTEpLzQ7IGkrKykgewotCQltICo9IDE2LjA7Ci0JCXNbc2ldID0gY2hhcl9mcm9tX2hleCgoaW50KW0pOwotCQlzaSsrOwotCQltIC09IChpbnQpbTsKLQl9Ci0Jc1tzaV0gPSAnXDAnOworICAgIHNpID0gMDsKKyAgICBzW3NpXSA9IGNoYXJfZnJvbV9oZXgoKGludCltKTsKKyAgICBzaSsrOworICAgIG0gLT0gKGludCltOworICAgIHNbc2ldID0gJy4nOworICAgIHNpKys7CisgICAgZm9yIChpPTA7IGkgPCAoVE9IRVhfTkJJVFMtMSkvNDsgaSsrKSB7CisgICAgICAgIG0gKj0gMTYuMDsKKyAgICAgICAgc1tzaV0gPSBjaGFyX2Zyb21faGV4KChpbnQpbSk7CisgICAgICAgIHNpKys7CisgICAgICAgIG0gLT0gKGludCltOworICAgIH0KKyAgICBzW3NpXSA9ICdcMCc7CiAKLQlpZiAoZSA8IDApIHsKLQkJZXNpZ24gPSAoaW50KSctJzsKLQkJZSA9IC1lOwotCX0KLQllbHNlCi0JCWVzaWduID0gKGludCknKyc7CisgICAgaWYgKGUgPCAwKSB7CisgICAgICAgIGVzaWduID0gKGludCknLSc7CisgICAgICAgIGUgPSAtZTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBlc2lnbiA9IChpbnQpJysnOwogCi0JaWYgKHggPCAwLjApCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCItMHglc3AlYyVkIiwgcywgZXNpZ24sIGUpOwotCWVsc2UKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjB4JXNwJWMlZCIsIHMsIGVzaWduLCBlKTsKKyAgICBpZiAoeCA8IDAuMCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIi0weCVzcCVjJWQiLCBzLCBlc2lnbiwgZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiMHglc3AlYyVkIiwgcywgZXNpZ24sIGUpOwogfQogCiBQeURvY19TVFJWQVIoZmxvYXRfaGV4X2RvYywKQEAgLTEyNzAsMTEgKzEyNzAsMTEgQEAKIHN0YXRpYyBpbnQKIGNhc2VfaW5zZW5zaXRpdmVfbWF0Y2goY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqdCkKIHsKLQl3aGlsZSgqdCAmJiB0b2xvd2VyKCpzKSA9PSAqdCkgewotCQlzKys7Ci0JCXQrKzsKLQl9Ci0JcmV0dXJuICp0ID8gMCA6IDE7CisgICAgd2hpbGUoKnQgJiYgdG9sb3dlcigqcykgPT0gKnQpIHsKKyAgICAgICAgcysrOworICAgICAgICB0Kys7CisgICAgfQorICAgIHJldHVybiAqdCA/IDAgOiAxOwogfQogCiAvKiBDb252ZXJ0IGEgaGV4YWRlY2ltYWwgc3RyaW5nIHRvIGEgZmxvYXQuICovCkBAIC0xMjgyLDI1MCArMTI4MiwyNTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9mcm9taGV4KFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdF9hc19mbG9hdCwgKnJlc3VsdDsKLQlkb3VibGUgeDsKLQlsb25nIGV4cCwgdG9wX2V4cCwgbHNiLCBrZXlfZGlnaXQ7Ci0JY2hhciAqcywgKmNvZWZmX3N0YXJ0LCAqc19zdG9yZSwgKmNvZWZmX2VuZCwgKmV4cF9zdGFydCwgKnNfZW5kOwotCWludCBoYWxmX2VwcywgZGlnaXQsIHJvdW5kX3VwLCBzaWduPTE7Ci0JUHlfc3NpemVfdCBsZW5ndGgsIG5kaWdpdHMsIGZkaWdpdHMsIGk7CisgICAgUHlPYmplY3QgKnJlc3VsdF9hc19mbG9hdCwgKnJlc3VsdDsKKyAgICBkb3VibGUgeDsKKyAgICBsb25nIGV4cCwgdG9wX2V4cCwgbHNiLCBrZXlfZGlnaXQ7CisgICAgY2hhciAqcywgKmNvZWZmX3N0YXJ0LCAqc19zdG9yZSwgKmNvZWZmX2VuZCwgKmV4cF9zdGFydCwgKnNfZW5kOworICAgIGludCBoYWxmX2VwcywgZGlnaXQsIHJvdW5kX3VwLCBzaWduPTE7CisgICAgUHlfc3NpemVfdCBsZW5ndGgsIG5kaWdpdHMsIGZkaWdpdHMsIGk7CiAKLQkvKgotCSAqIEZvciB0aGUgc2FrZSBvZiBzaW1wbGljaXR5IGFuZCBjb3JyZWN0bmVzcywgd2UgaW1wb3NlIGFuIGFydGlmaWNpYWwKLQkgKiBsaW1pdCBvbiBuZGlnaXRzLCB0aGUgdG90YWwgbnVtYmVyIG9mIGhleCBkaWdpdHMgaW4gdGhlIGNvZWZmaWNpZW50Ci0JICogVGhlIGxpbWl0IGlzIGNob3NlbiB0byBlbnN1cmUgdGhhdCwgd3JpdGluZyBleHAgZm9yIHRoZSBleHBvbmVudCwKLQkgKgotCSAqICAgKDEpIGlmIGV4cCA+IExPTkdfTUFYLzIgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcgaXMKLQkgKiAgIGd1YXJhbnRlZWQgdG8gb3ZlcmZsb3cgKHByb3ZpZGVkIGl0J3Mgbm9uemVybykKLQkgKgotCSAqICAgKDIpIGlmIGV4cCA8IExPTkdfTUlOLzIgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcgaXMKLQkgKiAgIGd1YXJhbnRlZWQgdG8gdW5kZXJmbG93IHRvIDAuCi0JICoKLQkgKiAgICgzKSBpZiBMT05HX01JTi8yIDw9IGV4cCA8PSBMT05HX01BWC8yIHRoZW4gdGhlcmUncyBubyBkYW5nZXIgb2YKLQkgKiAgIG92ZXJmbG93IGluIHRoZSBjYWxjdWxhdGlvbiBvZiBleHAgYW5kIHRvcF9leHAgYmVsb3cuCi0JICoKLQkgKiBNb3JlIHNwZWNpZmljYWxseSwgbmRpZ2l0cyBpcyBhc3N1bWVkIHRvIHNhdGlzZnkgdGhlIGZvbGxvd2luZwotCSAqIGluZXF1YWxpdGllczoKLQkgKgotCSAqICAgNCpuZGlnaXRzIDw9IERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gTE9OR19NSU4vMgotCSAqICAgNCpuZGlnaXRzIDw9IExPTkdfTUFYLzIgKyAxIC0gREJMX01BWF9FWFAKLQkgKgotCSAqIElmIGVpdGhlciBvZiB0aGVzZSBpbmVxdWFsaXRpZXMgaXMgbm90IHNhdGlzZmllZCwgYSBWYWx1ZUVycm9yIGlzCi0JICogcmFpc2VkLiAgT3RoZXJ3aXNlLCB3cml0ZSB4IGZvciB0aGUgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcsIGFuZAotCSAqIGFzc3VtZSB4IGlzIG5vbnplcm8uICBUaGVuCi0JICoKLQkgKiAgIDIqKihleHAtNCpuZGlnaXRzKSA8PSB8eHwgPCAyKiooZXhwKzQqbmRpZ2l0cykuCi0JICoKLQkgKiBOb3cgaWYgZXhwID4gTE9OR19NQVgvMiB0aGVuOgotCSAqCi0JICogICBleHAgLSA0Km5kaWdpdHMgPj0gTE9OR19NQVgvMiArIDEgLSAoTE9OR19NQVgvMiArIDEgLSBEQkxfTUFYX0VYUCkKLQkgKiAgICAgICAgICAgICAgICAgICAgPSBEQkxfTUFYX0VYUAotCSAqCi0JICogc28gfHh8ID49IDIqKkRCTF9NQVhfRVhQLCB3aGljaCBpcyB0b28gbGFyZ2UgdG8gYmUgc3RvcmVkIGluIEMKLQkgKiBkb3VibGUsIHNvIG92ZXJmbG93cy4gIElmIGV4cCA8IExPTkdfTUlOLzIsIHRoZW4KLQkgKgotCSAqICAgZXhwICsgNCpuZGlnaXRzIDw9IExPTkdfTUlOLzIgLSAxICsgKAotCSAqICAgICAgICAgICAgICAgICAgICAgIERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gTE9OR19NSU4vMikKLQkgKiAgICAgICAgICAgICAgICAgICAgPSBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRyAtIDEKLQkgKgotCSAqIGFuZCBzbyB8eHwgPCAyKiooREJMX01JTl9FWFAtREJMX01BTlRfRElHLTEpLCBoZW5jZSB1bmRlcmZsb3dzIHRvIDAKLQkgKiB3aGVuIGNvbnZlcnRlZCB0byBhIEMgZG91YmxlLgotCSAqCi0JICogSXQncyBlYXN5IHRvIHNob3cgdGhhdCBpZiBMT05HX01JTi8yIDw9IGV4cCA8PSBMT05HX01BWC8yIHRoZW4gYm90aAotCSAqIGV4cCs0Km5kaWdpdHMgYW5kIGV4cC00Km5kaWdpdHMgYXJlIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYSBsb25nLgotCSAqLworICAgIC8qCisgICAgICogRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHkgYW5kIGNvcnJlY3RuZXNzLCB3ZSBpbXBvc2UgYW4gYXJ0aWZpY2lhbAorICAgICAqIGxpbWl0IG9uIG5kaWdpdHMsIHRoZSB0b3RhbCBudW1iZXIgb2YgaGV4IGRpZ2l0cyBpbiB0aGUgY29lZmZpY2llbnQKKyAgICAgKiBUaGUgbGltaXQgaXMgY2hvc2VuIHRvIGVuc3VyZSB0aGF0LCB3cml0aW5nIGV4cCBmb3IgdGhlIGV4cG9uZW50LAorICAgICAqCisgICAgICogICAoMSkgaWYgZXhwID4gTE9OR19NQVgvMiB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgaGV4IHN0cmluZyBpcworICAgICAqICAgZ3VhcmFudGVlZCB0byBvdmVyZmxvdyAocHJvdmlkZWQgaXQncyBub256ZXJvKQorICAgICAqCisgICAgICogICAoMikgaWYgZXhwIDwgTE9OR19NSU4vMiB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgaGV4IHN0cmluZyBpcworICAgICAqICAgZ3VhcmFudGVlZCB0byB1bmRlcmZsb3cgdG8gMC4KKyAgICAgKgorICAgICAqICAgKDMpIGlmIExPTkdfTUlOLzIgPD0gZXhwIDw9IExPTkdfTUFYLzIgdGhlbiB0aGVyZSdzIG5vIGRhbmdlciBvZgorICAgICAqICAgb3ZlcmZsb3cgaW4gdGhlIGNhbGN1bGF0aW9uIG9mIGV4cCBhbmQgdG9wX2V4cCBiZWxvdy4KKyAgICAgKgorICAgICAqIE1vcmUgc3BlY2lmaWNhbGx5LCBuZGlnaXRzIGlzIGFzc3VtZWQgdG8gc2F0aXNmeSB0aGUgZm9sbG93aW5nCisgICAgICogaW5lcXVhbGl0aWVzOgorICAgICAqCisgICAgICogICA0Km5kaWdpdHMgPD0gREJMX01JTl9FWFAgLSBEQkxfTUFOVF9ESUcgLSBMT05HX01JTi8yCisgICAgICogICA0Km5kaWdpdHMgPD0gTE9OR19NQVgvMiArIDEgLSBEQkxfTUFYX0VYUAorICAgICAqCisgICAgICogSWYgZWl0aGVyIG9mIHRoZXNlIGluZXF1YWxpdGllcyBpcyBub3Qgc2F0aXNmaWVkLCBhIFZhbHVlRXJyb3IgaXMKKyAgICAgKiByYWlzZWQuICBPdGhlcndpc2UsIHdyaXRlIHggZm9yIHRoZSB2YWx1ZSBvZiB0aGUgaGV4IHN0cmluZywgYW5kCisgICAgICogYXNzdW1lIHggaXMgbm9uemVyby4gIFRoZW4KKyAgICAgKgorICAgICAqICAgMioqKGV4cC00Km5kaWdpdHMpIDw9IHx4fCA8IDIqKihleHArNCpuZGlnaXRzKS4KKyAgICAgKgorICAgICAqIE5vdyBpZiBleHAgPiBMT05HX01BWC8yIHRoZW46CisgICAgICoKKyAgICAgKiAgIGV4cCAtIDQqbmRpZ2l0cyA+PSBMT05HX01BWC8yICsgMSAtIChMT05HX01BWC8yICsgMSAtIERCTF9NQVhfRVhQKQorICAgICAqICAgICAgICAgICAgICAgICAgICA9IERCTF9NQVhfRVhQCisgICAgICoKKyAgICAgKiBzbyB8eHwgPj0gMioqREJMX01BWF9FWFAsIHdoaWNoIGlzIHRvbyBsYXJnZSB0byBiZSBzdG9yZWQgaW4gQworICAgICAqIGRvdWJsZSwgc28gb3ZlcmZsb3dzLiAgSWYgZXhwIDwgTE9OR19NSU4vMiwgdGhlbgorICAgICAqCisgICAgICogICBleHAgKyA0Km5kaWdpdHMgPD0gTE9OR19NSU4vMiAtIDEgKyAoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgREJMX01JTl9FWFAgLSBEQkxfTUFOVF9ESUcgLSBMT05HX01JTi8yKQorICAgICAqICAgICAgICAgICAgICAgICAgICA9IERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gMQorICAgICAqCisgICAgICogYW5kIHNvIHx4fCA8IDIqKihEQkxfTUlOX0VYUC1EQkxfTUFOVF9ESUctMSksIGhlbmNlIHVuZGVyZmxvd3MgdG8gMAorICAgICAqIHdoZW4gY29udmVydGVkIHRvIGEgQyBkb3VibGUuCisgICAgICoKKyAgICAgKiBJdCdzIGVhc3kgdG8gc2hvdyB0aGF0IGlmIExPTkdfTUlOLzIgPD0gZXhwIDw9IExPTkdfTUFYLzIgdGhlbiBib3RoCisgICAgICogZXhwKzQqbmRpZ2l0cyBhbmQgZXhwLTQqbmRpZ2l0cyBhcmUgd2l0aGluIHRoZSByYW5nZSBvZiBhIGxvbmcuCisgICAgICovCiAKLQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJnMsICZsZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKLQlzX2VuZCA9IHMgKyBsZW5ndGg7CisgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZzLCAmbGVuZ3RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc19lbmQgPSBzICsgbGVuZ3RoOwogCi0JLyoqKioqKioqKioqKioqKioqKioqCi0JICogUGFyc2UgdGhlIHN0cmluZyAqCi0JICoqKioqKioqKioqKioqKioqKioqLworICAgIC8qKioqKioqKioqKioqKioqKioqKgorICAgICAqIFBhcnNlIHRoZSBzdHJpbmcgKgorICAgICAqKioqKioqKioqKioqKioqKioqKi8KIAotCS8qIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgb3B0aW9uYWwgc2lnbiAqLwotCXdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCi0JCXMrKzsKLQlpZiAoKnMgPT0gJy0nKSB7Ci0JCXMrKzsKLQkJc2lnbiA9IC0xOwotCX0KLQllbHNlIGlmICgqcyA9PSAnKycpCi0JCXMrKzsKKyAgICAvKiBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIG9wdGlvbmFsIHNpZ24gKi8KKyAgICB3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQorICAgICAgICBzKys7CisgICAgaWYgKCpzID09ICctJykgeworICAgICAgICBzKys7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoKnMgPT0gJysnKQorICAgICAgICBzKys7CiAKLQkvKiBpbmZpbml0aWVzIGFuZCBuYW5zICovCi0JaWYgKCpzID09ICdpJyB8fCAqcyA9PSAnSScpIHsKLQkJaWYgKCFjYXNlX2luc2Vuc2l0aXZlX21hdGNoKHMrMSwgIm5mIikpCi0JCQlnb3RvIHBhcnNlX2Vycm9yOwotCQlzICs9IDM7Ci0JCXggPSBQeV9IVUdFX1ZBTDsKLQkJaWYgKGNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocywgImluaXR5IikpCi0JCQlzICs9IDU7Ci0JCWdvdG8gZmluaXNoZWQ7Ci0JfQotCWlmICgqcyA9PSAnbicgfHwgKnMgPT0gJ04nKSB7Ci0JCWlmICghY2FzZV9pbnNlbnNpdGl2ZV9tYXRjaChzKzEsICJhbiIpKQotCQkJZ290byBwYXJzZV9lcnJvcjsKLQkJcyArPSAzOwotCQl4ID0gUHlfTkFOOwotCQlnb3RvIGZpbmlzaGVkOwotCX0KKyAgICAvKiBpbmZpbml0aWVzIGFuZCBuYW5zICovCisgICAgaWYgKCpzID09ICdpJyB8fCAqcyA9PSAnSScpIHsKKyAgICAgICAgaWYgKCFjYXNlX2luc2Vuc2l0aXZlX21hdGNoKHMrMSwgIm5mIikpCisgICAgICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgICAgICBzICs9IDM7CisgICAgICAgIHggPSBQeV9IVUdFX1ZBTDsKKyAgICAgICAgaWYgKGNhc2VfaW5zZW5zaXRpdmVfbWF0Y2gocywgImluaXR5IikpCisgICAgICAgICAgICBzICs9IDU7CisgICAgICAgIGdvdG8gZmluaXNoZWQ7CisgICAgfQorICAgIGlmICgqcyA9PSAnbicgfHwgKnMgPT0gJ04nKSB7CisgICAgICAgIGlmICghY2FzZV9pbnNlbnNpdGl2ZV9tYXRjaChzKzEsICJhbiIpKQorICAgICAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICAgICAgcyArPSAzOworICAgICAgICB4ID0gUHlfTkFOOworICAgICAgICBnb3RvIGZpbmlzaGVkOworICAgIH0KIAotCS8qIFsweF0gKi8KLQlzX3N0b3JlID0gczsKLQlpZiAoKnMgPT0gJzAnKSB7Ci0JCXMrKzsKLQkJaWYgKHRvbG93ZXIoKnMpID09IChpbnQpJ3gnKQotCQkJcysrOwotCQllbHNlCi0JCQlzID0gc19zdG9yZTsKLQl9CisgICAgLyogWzB4XSAqLworICAgIHNfc3RvcmUgPSBzOworICAgIGlmICgqcyA9PSAnMCcpIHsKKyAgICAgICAgcysrOworICAgICAgICBpZiAodG9sb3dlcigqcykgPT0gKGludCkneCcpCisgICAgICAgICAgICBzKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMgPSBzX3N0b3JlOworICAgIH0KIAotCS8qIGNvZWZmaWNpZW50OiA8aW50ZWdlcj4gWy4gPGZyYWN0aW9uPl0gKi8KLQljb2VmZl9zdGFydCA9IHM7Ci0Jd2hpbGUgKGhleF9mcm9tX2NoYXIoKnMpID49IDApCi0JCXMrKzsKLQlzX3N0b3JlID0gczsKLQlpZiAoKnMgPT0gJy4nKSB7Ci0JCXMrKzsKLQkJd2hpbGUgKGhleF9mcm9tX2NoYXIoKnMpID49IDApCi0JCQlzKys7Ci0JCWNvZWZmX2VuZCA9IHMtMTsKLQl9Ci0JZWxzZQotCQljb2VmZl9lbmQgPSBzOworICAgIC8qIGNvZWZmaWNpZW50OiA8aW50ZWdlcj4gWy4gPGZyYWN0aW9uPl0gKi8KKyAgICBjb2VmZl9zdGFydCA9IHM7CisgICAgd2hpbGUgKGhleF9mcm9tX2NoYXIoKnMpID49IDApCisgICAgICAgIHMrKzsKKyAgICBzX3N0b3JlID0gczsKKyAgICBpZiAoKnMgPT0gJy4nKSB7CisgICAgICAgIHMrKzsKKyAgICAgICAgd2hpbGUgKGhleF9mcm9tX2NoYXIoKnMpID49IDApCisgICAgICAgICAgICBzKys7CisgICAgICAgIGNvZWZmX2VuZCA9IHMtMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBjb2VmZl9lbmQgPSBzOwogCi0JLyogbmRpZ2l0cyA9IHRvdGFsICMgb2YgaGV4IGRpZ2l0czsgZmRpZ2l0cyA9ICMgYWZ0ZXIgcG9pbnQgKi8KLQluZGlnaXRzID0gY29lZmZfZW5kIC0gY29lZmZfc3RhcnQ7Ci0JZmRpZ2l0cyA9IGNvZWZmX2VuZCAtIHNfc3RvcmU7Ci0JaWYgKG5kaWdpdHMgPT0gMCkKLQkJZ290byBwYXJzZV9lcnJvcjsKLQlpZiAobmRpZ2l0cyA+IE1JTihEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRyAtIExPTkdfTUlOLzIsCi0JCQkgIExPTkdfTUFYLzIgKyAxIC0gREJMX01BWF9FWFApLzQpCi0JCWdvdG8gaW5zYW5lX2xlbmd0aF9lcnJvcjsKKyAgICAvKiBuZGlnaXRzID0gdG90YWwgIyBvZiBoZXggZGlnaXRzOyBmZGlnaXRzID0gIyBhZnRlciBwb2ludCAqLworICAgIG5kaWdpdHMgPSBjb2VmZl9lbmQgLSBjb2VmZl9zdGFydDsKKyAgICBmZGlnaXRzID0gY29lZmZfZW5kIC0gc19zdG9yZTsKKyAgICBpZiAobmRpZ2l0cyA9PSAwKQorICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgIGlmIChuZGlnaXRzID4gTUlOKERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHIC0gTE9OR19NSU4vMiwKKyAgICAgICAgICAgICAgICAgICAgICBMT05HX01BWC8yICsgMSAtIERCTF9NQVhfRVhQKS80KQorICAgICAgICBnb3RvIGluc2FuZV9sZW5ndGhfZXJyb3I7CiAKLQkvKiBbcCA8ZXhwb25lbnQ+XSAqLwotCWlmICh0b2xvd2VyKCpzKSA9PSAoaW50KSdwJykgewotCQlzKys7Ci0JCWV4cF9zdGFydCA9IHM7Ci0JCWlmICgqcyA9PSAnLScgfHwgKnMgPT0gJysnKQotCQkJcysrOwotCQlpZiAoISgnMCcgPD0gKnMgJiYgKnMgPD0gJzknKSkKLQkJCWdvdG8gcGFyc2VfZXJyb3I7Ci0JCXMrKzsKLQkJd2hpbGUgKCcwJyA8PSAqcyAmJiAqcyA8PSAnOScpCi0JCQlzKys7Ci0JCWV4cCA9IHN0cnRvbChleHBfc3RhcnQsIE5VTEwsIDEwKTsKLQl9Ci0JZWxzZQotCQlleHAgPSAwOworICAgIC8qIFtwIDxleHBvbmVudD5dICovCisgICAgaWYgKHRvbG93ZXIoKnMpID09IChpbnQpJ3AnKSB7CisgICAgICAgIHMrKzsKKyAgICAgICAgZXhwX3N0YXJ0ID0gczsKKyAgICAgICAgaWYgKCpzID09ICctJyB8fCAqcyA9PSAnKycpCisgICAgICAgICAgICBzKys7CisgICAgICAgIGlmICghKCcwJyA8PSAqcyAmJiAqcyA8PSAnOScpKQorICAgICAgICAgICAgZ290byBwYXJzZV9lcnJvcjsKKyAgICAgICAgcysrOworICAgICAgICB3aGlsZSAoJzAnIDw9ICpzICYmICpzIDw9ICc5JykKKyAgICAgICAgICAgIHMrKzsKKyAgICAgICAgZXhwID0gc3RydG9sKGV4cF9zdGFydCwgTlVMTCwgMTApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGV4cCA9IDA7CiAKIC8qIGZvciAwIDw9IGogPCBuZGlnaXRzLCBIRVhfRElHSVQoaikgZ2l2ZXMgdGhlIGp0aCBtb3N0IHNpZ25pZmljYW50IGRpZ2l0ICovCi0jZGVmaW5lIEhFWF9ESUdJVChqKSBoZXhfZnJvbV9jaGFyKCooKGopIDwgZmRpZ2l0cyA/CQlcCi0JCQkJICAgICBjb2VmZl9lbmQtKGopIDoJCQlcCi0JCQkJICAgICBjb2VmZl9lbmQtMS0oaikpKQorI2RlZmluZSBIRVhfRElHSVQoaikgaGV4X2Zyb21fY2hhcigqKChqKSA8IGZkaWdpdHMgPyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvZWZmX2VuZC0oaikgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvZWZmX2VuZC0xLShqKSkpCiAKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIENvbXB1dGUgcm91bmRlZCB2YWx1ZSBvZiB0aGUgaGV4IHN0cmluZyAqCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBDb21wdXRlIHJvdW5kZWQgdmFsdWUgb2YgdGhlIGhleCBzdHJpbmcgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JLyogRGlzY2FyZCBsZWFkaW5nIHplcm9zLCBhbmQgY2F0Y2ggZXh0cmVtZSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93ICovCi0Jd2hpbGUgKG5kaWdpdHMgPiAwICYmIEhFWF9ESUdJVChuZGlnaXRzLTEpID09IDApCi0JCW5kaWdpdHMtLTsKLQlpZiAobmRpZ2l0cyA9PSAwIHx8IGV4cCA8IExPTkdfTUlOLzIpIHsKLQkJeCA9IDAuMDsKLQkJZ290byBmaW5pc2hlZDsKLQl9Ci0JaWYgKGV4cCA+IExPTkdfTUFYLzIpCi0JCWdvdG8gb3ZlcmZsb3dfZXJyb3I7CisgICAgLyogRGlzY2FyZCBsZWFkaW5nIHplcm9zLCBhbmQgY2F0Y2ggZXh0cmVtZSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93ICovCisgICAgd2hpbGUgKG5kaWdpdHMgPiAwICYmIEhFWF9ESUdJVChuZGlnaXRzLTEpID09IDApCisgICAgICAgIG5kaWdpdHMtLTsKKyAgICBpZiAobmRpZ2l0cyA9PSAwIHx8IGV4cCA8IExPTkdfTUlOLzIpIHsKKyAgICAgICAgeCA9IDAuMDsKKyAgICAgICAgZ290byBmaW5pc2hlZDsKKyAgICB9CisgICAgaWYgKGV4cCA+IExPTkdfTUFYLzIpCisgICAgICAgIGdvdG8gb3ZlcmZsb3dfZXJyb3I7CiAKLQkvKiBBZGp1c3QgZXhwb25lbnQgZm9yIGZyYWN0aW9uYWwgcGFydC4gKi8KLQlleHAgPSBleHAgLSA0KigobG9uZylmZGlnaXRzKTsKKyAgICAvKiBBZGp1c3QgZXhwb25lbnQgZm9yIGZyYWN0aW9uYWwgcGFydC4gKi8KKyAgICBleHAgPSBleHAgLSA0KigobG9uZylmZGlnaXRzKTsKIAotCS8qIHRvcF9leHAgPSAxIG1vcmUgdGhhbiBleHBvbmVudCBvZiBtb3N0IHNpZy4gYml0IG9mIGNvZWZmaWNpZW50ICovCi0JdG9wX2V4cCA9IGV4cCArIDQqKChsb25nKW5kaWdpdHMgLSAxKTsKLQlmb3IgKGRpZ2l0ID0gSEVYX0RJR0lUKG5kaWdpdHMtMSk7IGRpZ2l0ICE9IDA7IGRpZ2l0IC89IDIpCi0JCXRvcF9leHArKzsKKyAgICAvKiB0b3BfZXhwID0gMSBtb3JlIHRoYW4gZXhwb25lbnQgb2YgbW9zdCBzaWcuIGJpdCBvZiBjb2VmZmljaWVudCAqLworICAgIHRvcF9leHAgPSBleHAgKyA0KigobG9uZyluZGlnaXRzIC0gMSk7CisgICAgZm9yIChkaWdpdCA9IEhFWF9ESUdJVChuZGlnaXRzLTEpOyBkaWdpdCAhPSAwOyBkaWdpdCAvPSAyKQorICAgICAgICB0b3BfZXhwKys7CiAKLQkvKiBjYXRjaCBhbG1vc3QgYWxsIG5vbmV4dHJlbWUgY2FzZXMgb2Ygb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyBoZXJlICovCi0JaWYgKHRvcF9leHAgPCBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRykgewotCQl4ID0gMC4wOwotCQlnb3RvIGZpbmlzaGVkOwotCX0KLQlpZiAodG9wX2V4cCA+IERCTF9NQVhfRVhQKQotCQlnb3RvIG92ZXJmbG93X2Vycm9yOworICAgIC8qIGNhdGNoIGFsbW9zdCBhbGwgbm9uZXh0cmVtZSBjYXNlcyBvZiBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IGhlcmUgKi8KKyAgICBpZiAodG9wX2V4cCA8IERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHKSB7CisgICAgICAgIHggPSAwLjA7CisgICAgICAgIGdvdG8gZmluaXNoZWQ7CisgICAgfQorICAgIGlmICh0b3BfZXhwID4gREJMX01BWF9FWFApCisgICAgICAgIGdvdG8gb3ZlcmZsb3dfZXJyb3I7CiAKLQkvKiBsc2IgPSBleHBvbmVudCBvZiBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlICpyb3VuZGVkKiB2YWx1ZS4KLQkgICBUaGlzIGlzIHRvcF9leHAgLSBEQkxfTUFOVF9ESUcgdW5sZXNzIHJlc3VsdCBpcyBzdWJub3JtYWwuICovCi0JbHNiID0gTUFYKHRvcF9leHAsIChsb25nKURCTF9NSU5fRVhQKSAtIERCTF9NQU5UX0RJRzsKKyAgICAvKiBsc2IgPSBleHBvbmVudCBvZiBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlICpyb3VuZGVkKiB2YWx1ZS4KKyAgICAgICBUaGlzIGlzIHRvcF9leHAgLSBEQkxfTUFOVF9ESUcgdW5sZXNzIHJlc3VsdCBpcyBzdWJub3JtYWwuICovCisgICAgbHNiID0gTUFYKHRvcF9leHAsIChsb25nKURCTF9NSU5fRVhQKSAtIERCTF9NQU5UX0RJRzsKIAotCXggPSAwLjA7Ci0JaWYgKGV4cCA+PSBsc2IpIHsKLQkJLyogbm8gcm91bmRpbmcgcmVxdWlyZWQgKi8KLQkJZm9yIChpID0gbmRpZ2l0cy0xOyBpID49IDA7IGktLSkKLQkJCXggPSAxNi4wKnggKyBIRVhfRElHSVQoaSk7Ci0JCXggPSBsZGV4cCh4LCAoaW50KShleHApKTsKLQkJZ290byBmaW5pc2hlZDsKLQl9Ci0JLyogcm91bmRpbmcgcmVxdWlyZWQuICBrZXlfZGlnaXQgaXMgdGhlIGluZGV4IG9mIHRoZSBoZXggZGlnaXQKLQkgICBjb250YWluaW5nIHRoZSBmaXJzdCBiaXQgdG8gYmUgcm91bmRlZCBhd2F5LiAqLwotCWhhbGZfZXBzID0gMSA8PCAoaW50KSgobHNiIC0gZXhwIC0gMSkgJSA0KTsKLQlrZXlfZGlnaXQgPSAobHNiIC0gZXhwIC0gMSkgLyA0OwotCWZvciAoaSA9IG5kaWdpdHMtMTsgaSA+IGtleV9kaWdpdDsgaS0tKQotCQl4ID0gMTYuMCp4ICsgSEVYX0RJR0lUKGkpOwotCWRpZ2l0ID0gSEVYX0RJR0lUKGtleV9kaWdpdCk7Ci0JeCA9IDE2LjAqeCArIChkb3VibGUpKGRpZ2l0ICYgKDE2LTIqaGFsZl9lcHMpKTsKKyAgICB4ID0gMC4wOworICAgIGlmIChleHAgPj0gbHNiKSB7CisgICAgICAgIC8qIG5vIHJvdW5kaW5nIHJlcXVpcmVkICovCisgICAgICAgIGZvciAoaSA9IG5kaWdpdHMtMTsgaSA+PSAwOyBpLS0pCisgICAgICAgICAgICB4ID0gMTYuMCp4ICsgSEVYX0RJR0lUKGkpOworICAgICAgICB4ID0gbGRleHAoeCwgKGludCkoZXhwKSk7CisgICAgICAgIGdvdG8gZmluaXNoZWQ7CisgICAgfQorICAgIC8qIHJvdW5kaW5nIHJlcXVpcmVkLiAga2V5X2RpZ2l0IGlzIHRoZSBpbmRleCBvZiB0aGUgaGV4IGRpZ2l0CisgICAgICAgY29udGFpbmluZyB0aGUgZmlyc3QgYml0IHRvIGJlIHJvdW5kZWQgYXdheS4gKi8KKyAgICBoYWxmX2VwcyA9IDEgPDwgKGludCkoKGxzYiAtIGV4cCAtIDEpICUgNCk7CisgICAga2V5X2RpZ2l0ID0gKGxzYiAtIGV4cCAtIDEpIC8gNDsKKyAgICBmb3IgKGkgPSBuZGlnaXRzLTE7IGkgPiBrZXlfZGlnaXQ7IGktLSkKKyAgICAgICAgeCA9IDE2LjAqeCArIEhFWF9ESUdJVChpKTsKKyAgICBkaWdpdCA9IEhFWF9ESUdJVChrZXlfZGlnaXQpOworICAgIHggPSAxNi4wKnggKyAoZG91YmxlKShkaWdpdCAmICgxNi0yKmhhbGZfZXBzKSk7CiAKLQkvKiByb3VuZC1oYWxmLWV2ZW46IHJvdW5kIHVwIGlmIGJpdCBsc2ItMSBpcyAxIGFuZCBhdCBsZWFzdCBvbmUgb2YKLQkgICBiaXRzIGxzYiwgbHNiLTIsIGxzYi0zLCBsc2ItNCwgLi4uIGlzIDEuICovCi0JaWYgKChkaWdpdCAmIGhhbGZfZXBzKSAhPSAwKSB7Ci0JCXJvdW5kX3VwID0gMDsKLQkJaWYgKChkaWdpdCAmICgzKmhhbGZfZXBzLTEpKSAhPSAwIHx8Ci0JCSAgICAoaGFsZl9lcHMgPT0gOCAmJiAoSEVYX0RJR0lUKGtleV9kaWdpdCsxKSAmIDEpICE9IDApKQotCQkJcm91bmRfdXAgPSAxOwotCQllbHNlCi0JCQlmb3IgKGkgPSBrZXlfZGlnaXQtMTsgaSA+PSAwOyBpLS0pCi0JCQkJaWYgKEhFWF9ESUdJVChpKSAhPSAwKSB7Ci0JCQkJCXJvdW5kX3VwID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQlpZiAocm91bmRfdXAgPT0gMSkgewotCQkJeCArPSAyKmhhbGZfZXBzOwotCQkJaWYgKHRvcF9leHAgPT0gREJMX01BWF9FWFAgJiYKLQkJCSAgICB4ID09IGxkZXhwKChkb3VibGUpKDIqaGFsZl9lcHMpLCBEQkxfTUFOVF9ESUcpKQotCQkJCS8qIG92ZXJmbG93IGNvcm5lciBjYXNlOiBwcmUtcm91bmRlZCB2YWx1ZSA8Ci0JCQkJICAgMioqREJMX01BWF9FWFA7IHJvdW5kZWQ9MioqREJMX01BWF9FWFAuICovCi0JCQkJZ290byBvdmVyZmxvd19lcnJvcjsKLQkJfQotCX0KLQl4ID0gbGRleHAoeCwgKGludCkoZXhwKzQqa2V5X2RpZ2l0KSk7CisgICAgLyogcm91bmQtaGFsZi1ldmVuOiByb3VuZCB1cCBpZiBiaXQgbHNiLTEgaXMgMSBhbmQgYXQgbGVhc3Qgb25lIG9mCisgICAgICAgYml0cyBsc2IsIGxzYi0yLCBsc2ItMywgbHNiLTQsIC4uLiBpcyAxLiAqLworICAgIGlmICgoZGlnaXQgJiBoYWxmX2VwcykgIT0gMCkgeworICAgICAgICByb3VuZF91cCA9IDA7CisgICAgICAgIGlmICgoZGlnaXQgJiAoMypoYWxmX2Vwcy0xKSkgIT0gMCB8fAorICAgICAgICAgICAgKGhhbGZfZXBzID09IDggJiYgKEhFWF9ESUdJVChrZXlfZGlnaXQrMSkgJiAxKSAhPSAwKSkKKyAgICAgICAgICAgIHJvdW5kX3VwID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yIChpID0ga2V5X2RpZ2l0LTE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgICAgIGlmIChIRVhfRElHSVQoaSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByb3VuZF91cCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHJvdW5kX3VwID09IDEpIHsKKyAgICAgICAgICAgIHggKz0gMipoYWxmX2VwczsKKyAgICAgICAgICAgIGlmICh0b3BfZXhwID09IERCTF9NQVhfRVhQICYmCisgICAgICAgICAgICAgICAgeCA9PSBsZGV4cCgoZG91YmxlKSgyKmhhbGZfZXBzKSwgREJMX01BTlRfRElHKSkKKyAgICAgICAgICAgICAgICAvKiBvdmVyZmxvdyBjb3JuZXIgY2FzZTogcHJlLXJvdW5kZWQgdmFsdWUgPAorICAgICAgICAgICAgICAgICAgIDIqKkRCTF9NQVhfRVhQOyByb3VuZGVkPTIqKkRCTF9NQVhfRVhQLiAqLworICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3dfZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgeCA9IGxkZXhwKHgsIChpbnQpKGV4cCs0KmtleV9kaWdpdCkpOwogCiAgIGZpbmlzaGVkOgotCS8qIG9wdGlvbmFsIHRyYWlsaW5nIHdoaXRlc3BhY2UgbGVhZGluZyB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KLQl3aGlsZSAoKnMgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqcykpKQotCQlzKys7Ci0JaWYgKHMgIT0gc19lbmQpCi0JCWdvdG8gcGFyc2VfZXJyb3I7Ci0JcmVzdWx0X2FzX2Zsb2F0ID0gUHlfQnVpbGRWYWx1ZSgiKGQpIiwgc2lnbiAqIHgpOwotCWlmIChyZXN1bHRfYXNfZmxvYXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChjbHMsIHJlc3VsdF9hc19mbG9hdCk7Ci0JUHlfREVDUkVGKHJlc3VsdF9hc19mbG9hdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBvcHRpb25hbCB0cmFpbGluZyB3aGl0ZXNwYWNlIGxlYWRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nICovCisgICAgd2hpbGUgKCpzICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnMpKSkKKyAgICAgICAgcysrOworICAgIGlmIChzICE9IHNfZW5kKQorICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOworICAgIHJlc3VsdF9hc19mbG9hdCA9IFB5X0J1aWxkVmFsdWUoIihkKSIsIHNpZ24gKiB4KTsKKyAgICBpZiAocmVzdWx0X2FzX2Zsb2F0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3QoY2xzLCByZXN1bHRfYXNfZmxvYXQpOworICAgIFB5X0RFQ1JFRihyZXN1bHRfYXNfZmxvYXQpOworICAgIHJldHVybiByZXN1bHQ7CiAKICAgb3ZlcmZsb3dfZXJyb3I6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkiaGV4YWRlY2ltYWwgdmFsdWUgdG9vIGxhcmdlIHRvIHJlcHJlc2VudCBhcyBhIGZsb2F0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJoZXhhZGVjaW1hbCB2YWx1ZSB0b28gbGFyZ2UgdG8gcmVwcmVzZW50IGFzIGEgZmxvYXQiKTsKKyAgICByZXR1cm4gTlVMTDsKIAogICBwYXJzZV9lcnJvcjoKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJpbnZhbGlkIGhleGFkZWNpbWFsIGZsb2F0aW5nLXBvaW50IHN0cmluZyIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBoZXhhZGVjaW1hbCBmbG9hdGluZy1wb2ludCBzdHJpbmciKTsKKyAgICByZXR1cm4gTlVMTDsKIAogICBpbnNhbmVfbGVuZ3RoX2Vycm9yOgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJImhleGFkZWNpbWFsIHN0cmluZyB0b28gbG9uZyB0byBjb252ZXJ0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJoZXhhZGVjaW1hbCBzdHJpbmcgdG9vIGxvbmcgdG8gY29udmVydCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoZmxvYXRfZnJvbWhleF9kb2MsCkBAIC0xNTQxLDg1ICsxNTQxLDg1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfYXNfaW50ZWdlcl9yYXRpbyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlkb3VibGUgc2VsZjsKLQlkb3VibGUgZmxvYXRfcGFydDsKLQlpbnQgZXhwb25lbnQ7Ci0JaW50IGk7CisgICAgZG91YmxlIHNlbGY7CisgICAgZG91YmxlIGZsb2F0X3BhcnQ7CisgICAgaW50IGV4cG9uZW50OworICAgIGludCBpOwogCi0JUHlPYmplY3QgKnByZXY7Ci0JUHlPYmplY3QgKnB5X2V4cG9uZW50ID0gTlVMTDsKLQlQeU9iamVjdCAqbnVtZXJhdG9yID0gTlVMTDsKLQlQeU9iamVjdCAqZGVub21pbmF0b3IgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHRfcGFpciA9IE5VTEw7Ci0JUHlOdW1iZXJNZXRob2RzICpsb25nX21ldGhvZHMgPSBQeUxvbmdfVHlwZS50cF9hc19udW1iZXI7CisgICAgUHlPYmplY3QgKnByZXY7CisgICAgUHlPYmplY3QgKnB5X2V4cG9uZW50ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbnVtZXJhdG9yID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGVub21pbmF0b3IgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHRfcGFpciA9IE5VTEw7CisgICAgUHlOdW1iZXJNZXRob2RzICpsb25nX21ldGhvZHMgPSBQeUxvbmdfVHlwZS50cF9hc19udW1iZXI7CiAKICNkZWZpbmUgSU5QTEFDRV9VUERBVEUob2JqLCBjYWxsKSBcCi0JcHJldiA9IG9iajsgXAotCW9iaiA9IGNhbGw7IFwKLQlQeV9ERUNSRUYocHJldik7IFwKKyAgICBwcmV2ID0gb2JqOyBcCisgICAgb2JqID0gY2FsbDsgXAorICAgIFB5X0RFQ1JFRihwcmV2KTsgXAogCi0JQ09OVkVSVF9UT19ET1VCTEUodiwgc2VsZik7CisgICAgQ09OVkVSVF9UT19ET1VCTEUodiwgc2VsZik7CiAKLQlpZiAoUHlfSVNfSU5GSU5JVFkoc2VsZikpIHsKLQkgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJICAiQ2Fubm90IHBhc3MgaW5maW5pdHkgdG8gZmxvYXQuYXNfaW50ZWdlcl9yYXRpby4iKTsKLQkgIHJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlfSVNfSU5GSU5JVFkoc2VsZikpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcGFzcyBpbmZpbml0eSB0byBmbG9hdC5hc19pbnRlZ2VyX3JhdGlvLiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2lmZGVmIFB5X05BTgotCWlmIChQeV9JU19OQU4oc2VsZikpIHsKLQkgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAiQ2Fubm90IHBhc3MgTmFOIHRvIGZsb2F0LmFzX2ludGVnZXJfcmF0aW8uIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5X0lTX05BTihzZWxmKSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBwYXNzIE5hTiB0byBmbG9hdC5hc19pbnRlZ2VyX3JhdGlvLiIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlQeUZQRV9TVEFSVF9QUk9URUNUKCJhc19pbnRlZ2VyX3JhdGlvIiwgZ290byBlcnJvcik7Ci0JZmxvYXRfcGFydCA9IGZyZXhwKHNlbGYsICZleHBvbmVudCk7ICAJLyogc2VsZiA9PSBmbG9hdF9wYXJ0ICogMioqZXhwb25lbnQgZXhhY3RseSAqLwotCVB5RlBFX0VORF9QUk9URUNUKGZsb2F0X3BhcnQpOwotCQotCWZvciAoaT0wOyBpPDMwMCAmJiBmbG9hdF9wYXJ0ICE9IGZsb29yKGZsb2F0X3BhcnQpIDsgaSsrKSB7Ci0JCWZsb2F0X3BhcnQgKj0gMi4wOwotCQlleHBvbmVudC0tOwotCX0JCi0JLyogc2VsZiA9PSBmbG9hdF9wYXJ0ICogMioqZXhwb25lbnQgZXhhY3RseSBhbmQgZmxvYXRfcGFydCBpcyBpbnRlZ3JhbC4KLSAgICAgICAgICAgSWYgRkxUX1JBRElYICE9IDIsIHRoZSAzMDAgc3RlcHMgbWF5IGxlYXZlIGEgdGlueSBmcmFjdGlvbmFsIHBhcnQKLSAgICAgICAgICAgdG8gYmUgdHJ1bmNhdGVkIGJ5IFB5TG9uZ19Gcm9tRG91YmxlKCkuICovCisgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXNfaW50ZWdlcl9yYXRpbyIsIGdvdG8gZXJyb3IpOworICAgIGZsb2F0X3BhcnQgPSBmcmV4cChzZWxmLCAmZXhwb25lbnQpOyAgICAgICAgLyogc2VsZiA9PSBmbG9hdF9wYXJ0ICogMioqZXhwb25lbnQgZXhhY3RseSAqLworICAgIFB5RlBFX0VORF9QUk9URUNUKGZsb2F0X3BhcnQpOwogCi0JbnVtZXJhdG9yID0gUHlMb25nX0Zyb21Eb3VibGUoZmxvYXRfcGFydCk7Ci0JaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIGZvciAoaT0wOyBpPDMwMCAmJiBmbG9hdF9wYXJ0ICE9IGZsb29yKGZsb2F0X3BhcnQpIDsgaSsrKSB7CisgICAgICAgIGZsb2F0X3BhcnQgKj0gMi4wOworICAgICAgICBleHBvbmVudC0tOworICAgIH0KKyAgICAvKiBzZWxmID09IGZsb2F0X3BhcnQgKiAyKipleHBvbmVudCBleGFjdGx5IGFuZCBmbG9hdF9wYXJ0IGlzIGludGVncmFsLgorICAgICAgIElmIEZMVF9SQURJWCAhPSAyLCB0aGUgMzAwIHN0ZXBzIG1heSBsZWF2ZSBhIHRpbnkgZnJhY3Rpb25hbCBwYXJ0CisgICAgICAgdG8gYmUgdHJ1bmNhdGVkIGJ5IFB5TG9uZ19Gcm9tRG91YmxlKCkuICovCiAKLQkvKiBmb2xkIGluIDIqKmV4cG9uZW50ICovCi0JZGVub21pbmF0b3IgPSBQeUxvbmdfRnJvbUxvbmcoMSk7Ci0JcHlfZXhwb25lbnQgPSBQeUxvbmdfRnJvbUxvbmcobGFicygobG9uZylleHBvbmVudCkpOwotCWlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOwotCUlOUExBQ0VfVVBEQVRFKHB5X2V4cG9uZW50LAotCQkgICAgICAgbG9uZ19tZXRob2RzLT5uYl9sc2hpZnQoZGVub21pbmF0b3IsIHB5X2V4cG9uZW50KSk7Ci0JaWYgKHB5X2V4cG9uZW50ID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0JaWYgKGV4cG9uZW50ID4gMCkgewotCQlJTlBMQUNFX1VQREFURShudW1lcmF0b3IsCi0JCQkgICAgICAgbG9uZ19tZXRob2RzLT5uYl9tdWx0aXBseShudW1lcmF0b3IsIHB5X2V4cG9uZW50KSk7Ci0JCWlmIChudW1lcmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKLQl9Ci0JZWxzZSB7Ci0JCVB5X0RFQ1JFRihkZW5vbWluYXRvcik7Ci0JCWRlbm9taW5hdG9yID0gcHlfZXhwb25lbnQ7Ci0JCXB5X2V4cG9uZW50ID0gTlVMTDsKLQl9CisgICAgbnVtZXJhdG9yID0gUHlMb25nX0Zyb21Eb3VibGUoZmxvYXRfcGFydCk7CisgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOwogCi0JLyogUmV0dXJucyBpbnRzIGluc3RlYWQgb2YgbG9uZ3Mgd2hlcmUgcG9zc2libGUgKi8KLQlJTlBMQUNFX1VQREFURShudW1lcmF0b3IsIFB5TnVtYmVyX0ludChudW1lcmF0b3IpKTsKLQlpZiAobnVtZXJhdG9yID09IE5VTEwpIGdvdG8gZXJyb3I7Ci0JSU5QTEFDRV9VUERBVEUoZGVub21pbmF0b3IsIFB5TnVtYmVyX0ludChkZW5vbWluYXRvcikpOwotCWlmIChkZW5vbWluYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIC8qIGZvbGQgaW4gMioqZXhwb25lbnQgKi8KKyAgICBkZW5vbWluYXRvciA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKKyAgICBweV9leHBvbmVudCA9IFB5TG9uZ19Gcm9tTG9uZyhsYWJzKChsb25nKWV4cG9uZW50KSk7CisgICAgaWYgKHB5X2V4cG9uZW50ID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgSU5QTEFDRV9VUERBVEUocHlfZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgbG9uZ19tZXRob2RzLT5uYl9sc2hpZnQoZGVub21pbmF0b3IsIHB5X2V4cG9uZW50KSk7CisgICAgaWYgKHB5X2V4cG9uZW50ID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgaWYgKGV4cG9uZW50ID4gMCkgeworICAgICAgICBJTlBMQUNFX1VQREFURShudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbXVsdGlwbHkobnVtZXJhdG9yLCBweV9leHBvbmVudCkpOworICAgICAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9ERUNSRUYoZGVub21pbmF0b3IpOworICAgICAgICBkZW5vbWluYXRvciA9IHB5X2V4cG9uZW50OworICAgICAgICBweV9leHBvbmVudCA9IE5VTEw7CisgICAgfQogCi0JcmVzdWx0X3BhaXIgPSBQeVR1cGxlX1BhY2soMiwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CisgICAgLyogUmV0dXJucyBpbnRzIGluc3RlYWQgb2YgbG9uZ3Mgd2hlcmUgcG9zc2libGUgKi8KKyAgICBJTlBMQUNFX1VQREFURShudW1lcmF0b3IsIFB5TnVtYmVyX0ludChudW1lcmF0b3IpKTsKKyAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgSU5QTEFDRV9VUERBVEUoZGVub21pbmF0b3IsIFB5TnVtYmVyX0ludChkZW5vbWluYXRvcikpOworICAgIGlmIChkZW5vbWluYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworCisgICAgcmVzdWx0X3BhaXIgPSBQeVR1cGxlX1BhY2soMiwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CiAKICN1bmRlZiBJTlBMQUNFX1VQREFURQogZXJyb3I6Ci0JUHlfWERFQ1JFRihweV9leHBvbmVudCk7Ci0JUHlfWERFQ1JFRihkZW5vbWluYXRvcik7Ci0JUHlfWERFQ1JFRihudW1lcmF0b3IpOwotCXJldHVybiByZXN1bHRfcGFpcjsKKyAgICBQeV9YREVDUkVGKHB5X2V4cG9uZW50KTsKKyAgICBQeV9YREVDUkVGKGRlbm9taW5hdG9yKTsKKyAgICBQeV9YREVDUkVGKG51bWVyYXRvcik7CisgICAgcmV0dXJuIHJlc3VsdF9wYWlyOwogfQogCiBQeURvY19TVFJWQVIoZmxvYXRfYXNfaW50ZWdlcl9yYXRpb19kb2MsCkBAIC0xNjQzLDE4ICsxNjQzLDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp4ID0gUHlfRmFsc2U7IC8qIEludGVnZXIgemVybyAqLwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsieCIsIDB9OworICAgIFB5T2JqZWN0ICp4ID0gUHlfRmFsc2U7IC8qIEludGVnZXIgemVybyAqLworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsieCIsIDB9OwogCi0JaWYgKHR5cGUgIT0gJlB5RmxvYXRfVHlwZSkKLQkJcmV0dXJuIGZsb2F0X3N1YnR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOyAvKiBXaW1wIG91dCAqLwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8TzpmbG9hdCIsIGt3bGlzdCwgJngpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBJZiBpdCdzIGEgc3RyaW5nLCBidXQgbm90IGEgc3RyaW5nIHN1YmNsYXNzLCB1c2UKLQkgICBQeUZsb2F0X0Zyb21TdHJpbmcuICovCi0JaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QoeCkpCi0JCXJldHVybiBQeUZsb2F0X0Zyb21TdHJpbmcoeCwgTlVMTCk7Ci0JcmV0dXJuIFB5TnVtYmVyX0Zsb2F0KHgpOworICAgIGlmICh0eXBlICE9ICZQeUZsb2F0X1R5cGUpCisgICAgICAgIHJldHVybiBmbG9hdF9zdWJ0eXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsgLyogV2ltcCBvdXQgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE86ZmxvYXQiLCBrd2xpc3QsICZ4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogSWYgaXQncyBhIHN0cmluZywgYnV0IG5vdCBhIHN0cmluZyBzdWJjbGFzcywgdXNlCisgICAgICAgUHlGbG9hdF9Gcm9tU3RyaW5nLiAqLworICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHgpKQorICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tU3RyaW5nKHgsIE5VTEwpOworICAgIHJldHVybiBQeU51bWJlcl9GbG9hdCh4KTsKIH0KIAogLyogV2ltcHksIHNsb3cgYXBwcm9hY2ggdG8gdHBfbmV3IGNhbGxzIGZvciBzdWJ0eXBlcyBvZiBmbG9hdDoKQEAgLTE2NjUsMzMgKzE2NjUsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqdG1wLCAqbmV3b2JqOworICAgIFB5T2JqZWN0ICp0bXAsICpuZXdvYmo7CiAKLQlhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlGbG9hdF9UeXBlKSk7Ci0JdG1wID0gZmxvYXRfbmV3KCZQeUZsb2F0X1R5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5RmxvYXRfQ2hlY2tFeGFjdCh0bXApKTsKLQluZXdvYmogPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobmV3b2JqID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkoKFB5RmxvYXRPYmplY3QgKiluZXdvYmopLT5vYl9mdmFsID0gKChQeUZsb2F0T2JqZWN0ICopdG1wKS0+b2JfZnZhbDsKLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gbmV3b2JqOworICAgIGFzc2VydChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeUZsb2F0X1R5cGUpKTsKKyAgICB0bXAgPSBmbG9hdF9uZXcoJlB5RmxvYXRfVHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlGbG9hdF9DaGVja0V4YWN0KHRtcCkpOworICAgIG5ld29iaiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgIGlmIChuZXdvYmogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgICgoUHlGbG9hdE9iamVjdCAqKW5ld29iaiktPm9iX2Z2YWwgPSAoKFB5RmxvYXRPYmplY3QgKil0bXApLT5vYl9mdmFsOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiBuZXdvYmo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9nZXRuZXdhcmdzKFB5RmxvYXRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihkKSIsIHYtPm9iX2Z2YWwpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZCkiLCB2LT5vYl9mdmFsKTsKIH0KIAogLyogdGhpcyBpcyBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIHBhY2svdW5wYWNrIHJvdXRpbmVzIGJlbG93ICovCiAKIHR5cGVkZWYgZW51bSB7Ci0JdW5rbm93bl9mb3JtYXQsIGllZWVfYmlnX2VuZGlhbl9mb3JtYXQsIGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQKKyAgICB1bmtub3duX2Zvcm1hdCwgaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdCwgaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdAogfSBmbG9hdF9mb3JtYXRfdHlwZTsKIAogc3RhdGljIGZsb2F0X2Zvcm1hdF90eXBlIGRvdWJsZV9mb3JtYXQsIGZsb2F0X2Zvcm1hdDsKQEAgLTE3MDAsNDAgKzE3MDAsNDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmbG9hdF9nZXRmb3JtYXQoUHlUeXBlT2JqZWN0ICp2LCBQeU9iamVjdCogYXJnKQogewotCWNoYXIqIHM7Ci0JZmxvYXRfZm9ybWF0X3R5cGUgcjsKKyAgICBjaGFyKiBzOworICAgIGZsb2F0X2Zvcm1hdF90eXBlIHI7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKGFyZykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkgICAgICJfX2dldGZvcm1hdF9fKCkgYXJndW1lbnQgbXVzdCBiZSBzdHJpbmcsIG5vdCAlLjUwMHMiLAotCQkJICAgICBQeV9UWVBFKGFyZyktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcyA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpOwotCWlmIChzdHJjbXAocywgImRvdWJsZSIpID09IDApIHsKLQkJciA9IGRvdWJsZV9mb3JtYXQ7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChzLCAiZmxvYXQiKSA9PSAwKSB7Ci0JCXIgPSBmbG9hdF9mb3JtYXQ7Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiX19nZXRmb3JtYXRfXygpIGFyZ3VtZW50IDEgbXVzdCBiZSAiCi0JCQkJIidkb3VibGUnIG9yICdmbG9hdCciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCXN3aXRjaCAocikgewotCWNhc2UgdW5rbm93bl9mb3JtYXQ6Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJ1bmtub3duIik7Ci0JY2FzZSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0OgotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiSUVFRSwgbGl0dGxlLWVuZGlhbiIpOwotCWNhc2UgaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdDoKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIklFRUUsIGJpZy1lbmRpYW4iKTsKLQlkZWZhdWx0OgotCQlQeV9GYXRhbEVycm9yKCJpbnNhbmUgZmxvYXRfZm9ybWF0IG9yIGRvdWJsZV9mb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgIl9fZ2V0Zm9ybWF0X18oKSBhcmd1bWVudCBtdXN0IGJlIHN0cmluZywgbm90ICUuNTAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKKyAgICBpZiAoc3RyY21wKHMsICJkb3VibGUiKSA9PSAwKSB7CisgICAgICAgIHIgPSBkb3VibGVfZm9ybWF0OworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAocywgImZsb2F0IikgPT0gMCkgeworICAgICAgICByID0gZmxvYXRfZm9ybWF0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19nZXRmb3JtYXRfXygpIGFyZ3VtZW50IDEgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJ2RvdWJsZScgb3IgJ2Zsb2F0JyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHIpIHsKKyAgICBjYXNlIHVua25vd25fZm9ybWF0OgorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygidW5rbm93biIpOworICAgIGNhc2UgaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdDoKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIklFRUUsIGxpdHRsZS1lbmRpYW4iKTsKKyAgICBjYXNlIGllZWVfYmlnX2VuZGlhbl9mb3JtYXQ6CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJJRUVFLCBiaWctZW5kaWFuIik7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiaW5zYW5lIGZsb2F0X2Zvcm1hdCBvciBkb3VibGVfZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKGZsb2F0X2dldGZvcm1hdF9kb2MsCkBAIC0xNzQ5LDU3ICsxNzQ5LDU3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfc2V0Zm9ybWF0KFB5VHlwZU9iamVjdCAqdiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JY2hhciogdHlwZXN0cjsKLQljaGFyKiBmb3JtYXQ7Ci0JZmxvYXRfZm9ybWF0X3R5cGUgZjsKLQlmbG9hdF9mb3JtYXRfdHlwZSBkZXRlY3RlZDsKLQlmbG9hdF9mb3JtYXRfdHlwZSAqcDsKKyAgICBjaGFyKiB0eXBlc3RyOworICAgIGNoYXIqIGZvcm1hdDsKKyAgICBmbG9hdF9mb3JtYXRfdHlwZSBmOworICAgIGZsb2F0X2Zvcm1hdF90eXBlIGRldGVjdGVkOworICAgIGZsb2F0X2Zvcm1hdF90eXBlICpwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpfX3NldGZvcm1hdF9fIiwgJnR5cGVzdHIsICZmb3JtYXQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOl9fc2V0Zm9ybWF0X18iLCAmdHlwZXN0ciwgJmZvcm1hdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN0cmNtcCh0eXBlc3RyLCAiZG91YmxlIikgPT0gMCkgewotCQlwID0gJmRvdWJsZV9mb3JtYXQ7Ci0JCWRldGVjdGVkID0gZGV0ZWN0ZWRfZG91YmxlX2Zvcm1hdDsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKHR5cGVzdHIsICJmbG9hdCIpID09IDApIHsKLQkJcCA9ICZmbG9hdF9mb3JtYXQ7Ci0JCWRldGVjdGVkID0gZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0OwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIl9fc2V0Zm9ybWF0X18oKSBhcmd1bWVudCAxIG11c3QgIgotCQkJCSJiZSAnZG91YmxlJyBvciAnZmxvYXQnIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlpZiAoc3RyY21wKGZvcm1hdCwgInVua25vd24iKSA9PSAwKSB7Ci0JCWYgPSB1bmtub3duX2Zvcm1hdDsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGZvcm1hdCwgIklFRUUsIGxpdHRsZS1lbmRpYW4iKSA9PSAwKSB7Ci0JCWYgPSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0OwotCX0KLQllbHNlIGlmIChzdHJjbXAoZm9ybWF0LCAiSUVFRSwgYmlnLWVuZGlhbiIpID09IDApIHsKLQkJZiA9IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQ7Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiX19zZXRmb3JtYXRfXygpIGFyZ3VtZW50IDIgbXVzdCBiZSAiCi0JCQkJIid1bmtub3duJywgJ0lFRUUsIGxpdHRsZS1lbmRpYW4nIG9yICIKLQkJCQkiJ0lFRUUsIGJpZy1lbmRpYW4nIik7Ci0JCXJldHVybiBOVUxMOworICAgIGlmIChzdHJjbXAodHlwZXN0ciwgImRvdWJsZSIpID09IDApIHsKKyAgICAgICAgcCA9ICZkb3VibGVfZm9ybWF0OworICAgICAgICBkZXRlY3RlZCA9IGRldGVjdGVkX2RvdWJsZV9mb3JtYXQ7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcCh0eXBlc3RyLCAiZmxvYXQiKSA9PSAwKSB7CisgICAgICAgIHAgPSAmZmxvYXRfZm9ybWF0OworICAgICAgICBkZXRlY3RlZCA9IGRldGVjdGVkX2Zsb2F0X2Zvcm1hdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fc2V0Zm9ybWF0X18oKSBhcmd1bWVudCAxIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgImJlICdkb3VibGUnIG9yICdmbG9hdCciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JfQorICAgIGlmIChzdHJjbXAoZm9ybWF0LCAidW5rbm93biIpID09IDApIHsKKyAgICAgICAgZiA9IHVua25vd25fZm9ybWF0OworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoZm9ybWF0LCAiSUVFRSwgbGl0dGxlLWVuZGlhbiIpID09IDApIHsKKyAgICAgICAgZiA9IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQ7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChmb3JtYXQsICJJRUVFLCBiaWctZW5kaWFuIikgPT0gMCkgeworICAgICAgICBmID0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fc2V0Zm9ybWF0X18oKSBhcmd1bWVudCAyIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIid1bmtub3duJywgJ0lFRUUsIGxpdHRsZS1lbmRpYW4nIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICInSUVFRSwgYmlnLWVuZGlhbiciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoZiAhPSB1bmtub3duX2Zvcm1hdCAmJiBmICE9IGRldGVjdGVkKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiY2FuIG9ubHkgc2V0ICVzIGZvcm1hdCB0byAndW5rbm93bicgb3IgdGhlICIKLQkJCSAgICAgImRldGVjdGVkIHBsYXRmb3JtIHZhbHVlIiwgdHlwZXN0cik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB9CiAKLQkqcCA9IGY7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaWYgKGYgIT0gdW5rbm93bl9mb3JtYXQgJiYgZiAhPSBkZXRlY3RlZCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW4gb25seSBzZXQgJXMgZm9ybWF0IHRvICd1bmtub3duJyBvciB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgImRldGVjdGVkIHBsYXRmb3JtIHZhbHVlIiwgdHlwZXN0cik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgICpwID0gZjsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGZsb2F0X3NldGZvcm1hdF9kb2MsCkBAIC0xODE4LDM3ICsxODE4LDM3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfZ2V0emVybyhQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKDAuMCk7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgwLjApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZmxvYXRfX2Zvcm1hdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZm9ybWF0X3NwZWM7CisgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlCeXRlc19DaGVjayhmb3JtYXRfc3BlYykpCi0JCXJldHVybiBfUHlGbG9hdF9Gb3JtYXRBZHZhbmNlZChzZWxmLAotCQkJCQkgICAgICAgUHlCeXRlc19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAotCQkJCQkgICAgICAgUHlCeXRlc19HRVRfU0laRShmb3JtYXRfc3BlYykpOwotCWlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7Ci0JCS8qIENvbnZlcnQgZm9ybWF0X3NwZWMgdG8gYSBzdHIgKi8KLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJUHlPYmplY3QgKnN0cl9zcGVjID0gUHlPYmplY3RfU3RyKGZvcm1hdF9zcGVjKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19mb3JtYXRfXyIsICZmb3JtYXRfc3BlYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeUJ5dGVzX0NoZWNrKGZvcm1hdF9zcGVjKSkKKyAgICAgICAgcmV0dXJuIF9QeUZsb2F0X0Zvcm1hdEFkdmFuY2VkKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhmb3JtYXRfc3BlYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKGZvcm1hdF9zcGVjKSk7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhmb3JtYXRfc3BlYykpIHsKKyAgICAgICAgLyogQ29udmVydCBmb3JtYXRfc3BlYyB0byBhIHN0ciAqLworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICBQeU9iamVjdCAqc3RyX3NwZWMgPSBQeU9iamVjdF9TdHIoZm9ybWF0X3NwZWMpOwogCi0JCWlmIChzdHJfc3BlYyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzdHJfc3BlYyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJcmVzdWx0ID0gX1B5RmxvYXRfRm9ybWF0QWR2YW5jZWQoc2VsZiwKLQkJCQkJCSBQeUJ5dGVzX0FTX1NUUklORyhzdHJfc3BlYyksCi0JCQkJCQkgUHlCeXRlc19HRVRfU0laRShzdHJfc3BlYykpOworICAgICAgICByZXN1bHQgPSBfUHlGbG9hdF9Gb3JtYXRBZHZhbmNlZChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzdHJfc3BlYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoc3RyX3NwZWMpKTsKIAotCQlQeV9ERUNSRUYoc3RyX3NwZWMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyByZXF1aXJlcyBzdHIgb3IgdW5pY29kZSIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYoc3RyX3NwZWMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyByZXF1aXJlcyBzdHIgb3IgdW5pY29kZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoZmxvYXRfX2Zvcm1hdF9fZG9jLApAQCAtMTg1OCw0MiArMTg1OCw0MiBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBmbG9hdF9tZXRob2RzW10gPSB7Ci0JeyJjb25qdWdhdGUiLAkoUHlDRnVuY3Rpb24pZmxvYXRfZmxvYXQsCU1FVEhfTk9BUkdTLAotCSAiUmV0dXJucyBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGZsb2F0LiJ9LAotCXsiX190cnVuY19fIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X3RydW5jLCBNRVRIX05PQVJHUywKLSAgICAgICAgICJSZXR1cm5zIHRoZSBJbnRlZ3JhbCBjbG9zZXN0IHRvIHggYmV0d2VlbiAwIGFuZCB4LiJ9LAotCXsiYXNfaW50ZWdlcl9yYXRpbyIsIChQeUNGdW5jdGlvbilmbG9hdF9hc19pbnRlZ2VyX3JhdGlvLCBNRVRIX05PQVJHUywKLQkgZmxvYXRfYXNfaW50ZWdlcl9yYXRpb19kb2N9LAotCXsiZnJvbWhleCIsIChQeUNGdW5jdGlvbilmbG9hdF9mcm9taGV4LAotCSBNRVRIX098TUVUSF9DTEFTUywgZmxvYXRfZnJvbWhleF9kb2N9LAotCXsiaGV4IiwgKFB5Q0Z1bmN0aW9uKWZsb2F0X2hleCwKLQkgTUVUSF9OT0FSR1MsIGZsb2F0X2hleF9kb2N9LAotCXsiaXNfaW50ZWdlciIsCShQeUNGdW5jdGlvbilmbG9hdF9pc19pbnRlZ2VyLAlNRVRIX05PQVJHUywKLQkgIlJldHVybnMgVHJ1ZSBpZiB0aGUgZmxvYXQgaXMgYW4gaW50ZWdlci4ifSwKKyAgICB7ImNvbmp1Z2F0ZSIsICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9mbG9hdCwgICAgICAgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgZmxvYXQuIn0sCisgICAgeyJfX3RydW5jX18iLCAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfdHJ1bmMsIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyB0aGUgSW50ZWdyYWwgY2xvc2VzdCB0byB4IGJldHdlZW4gMCBhbmQgeC4ifSwKKyAgICB7ImFzX2ludGVnZXJfcmF0aW8iLCAoUHlDRnVuY3Rpb24pZmxvYXRfYXNfaW50ZWdlcl9yYXRpbywgTUVUSF9OT0FSR1MsCisgICAgIGZsb2F0X2FzX2ludGVnZXJfcmF0aW9fZG9jfSwKKyAgICB7ImZyb21oZXgiLCAoUHlDRnVuY3Rpb24pZmxvYXRfZnJvbWhleCwKKyAgICAgTUVUSF9PfE1FVEhfQ0xBU1MsIGZsb2F0X2Zyb21oZXhfZG9jfSwKKyAgICB7ImhleCIsIChQeUNGdW5jdGlvbilmbG9hdF9oZXgsCisgICAgIE1FVEhfTk9BUkdTLCBmbG9hdF9oZXhfZG9jfSwKKyAgICB7ImlzX2ludGVnZXIiLCAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9pc19pbnRlZ2VyLCAgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm5zIFRydWUgaWYgdGhlIGZsb2F0IGlzIGFuIGludGVnZXIuIn0sCiAjaWYgMAotCXsiaXNfaW5mIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X2lzX2luZiwJTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIFRydWUgaWYgdGhlIGZsb2F0IGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGluZmluaXRlLiJ9LAotCXsiaXNfZmluaXRlIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X2lzX2Zpbml0ZSwJTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIFRydWUgaWYgdGhlIGZsb2F0IGlzIGZpbml0ZSwgbmVpdGhlciBpbmZpbml0ZSBub3IgTmFOLiJ9LAotCXsiaXNfbmFuIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X2lzX25hbiwJTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIFRydWUgaWYgdGhlIGZsb2F0IGlzIG5vdCBhIG51bWJlciAoTmFOKS4ifSwKKyAgICB7ImlzX2luZiIsICAgICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9pc19pbmYsICAgICAgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm5zIFRydWUgaWYgdGhlIGZsb2F0IGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGluZmluaXRlLiJ9LAorICAgIHsiaXNfZmluaXRlIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X2lzX2Zpbml0ZSwgICBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgVHJ1ZSBpZiB0aGUgZmxvYXQgaXMgZmluaXRlLCBuZWl0aGVyIGluZmluaXRlIG5vciBOYU4uIn0sCisgICAgeyJpc19uYW4iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfaXNfbmFuLCAgICAgIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBUcnVlIGlmIHRoZSBmbG9hdCBpcyBub3QgYSBudW1iZXIgKE5hTikuIn0sCiAjZW5kaWYKLQl7Il9fZ2V0bmV3YXJnc19fIiwJKFB5Q0Z1bmN0aW9uKWZsb2F0X2dldG5ld2FyZ3MsCU1FVEhfTk9BUkdTfSwKLQl7Il9fZ2V0Zm9ybWF0X18iLAkoUHlDRnVuY3Rpb24pZmxvYXRfZ2V0Zm9ybWF0LAkKLQkgTUVUSF9PfE1FVEhfQ0xBU1MsCQlmbG9hdF9nZXRmb3JtYXRfZG9jfSwKLQl7Il9fc2V0Zm9ybWF0X18iLAkoUHlDRnVuY3Rpb24pZmxvYXRfc2V0Zm9ybWF0LAkKLQkgTUVUSF9WQVJBUkdTfE1FVEhfQ0xBU1MsCWZsb2F0X3NldGZvcm1hdF9kb2N9LAotICAgICAgICB7Il9fZm9ybWF0X18iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pZmxvYXRfX2Zvcm1hdF9fLAotICAgICAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgICAgICAgIGZsb2F0X19mb3JtYXRfX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fZ2V0bmV3YXJnc19fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X2dldG5ld2FyZ3MsICBNRVRIX05PQVJHU30sCisgICAgeyJfX2dldGZvcm1hdF9fIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9nZXRmb3JtYXQsCisgICAgIE1FVEhfT3xNRVRIX0NMQVNTLCAgICAgICAgICAgICAgICAgZmxvYXRfZ2V0Zm9ybWF0X2RvY30sCisgICAgeyJfX3NldGZvcm1hdF9fIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilmbG9hdF9zZXRmb3JtYXQsCisgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0NMQVNTLCAgICAgICAgICAgZmxvYXRfc2V0Zm9ybWF0X2RvY30sCisgICAgeyJfX2Zvcm1hdF9fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWZsb2F0X19mb3JtYXRfXywKKyAgICAgTUVUSF9WQVJBUkdTLCAgICAgICAgICAgICAgICAgIGZsb2F0X19mb3JtYXRfX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeUdldFNldERlZiBmbG9hdF9nZXRzZXRbXSA9IHsKLSAgICB7InJlYWwiLCAKKyAgICB7InJlYWwiLAogICAgICAoZ2V0dGVyKWZsb2F0X2Zsb2F0LCAoc2V0dGVyKU5VTEwsCiAgICAgICJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIiLAogICAgICBOVUxMfSwKLSAgICB7ImltYWciLCAKKyAgICB7ImltYWciLAogICAgICAoZ2V0dGVyKWZsb2F0X2dldHplcm8sIChzZXR0ZXIpTlVMTCwKICAgICAgInRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIiwKICAgICAgTlVMTH0sCkBAIC0xOTA3LDIyOSArMTkwNywyMjkgQEAKIAogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGZsb2F0X2FzX251bWJlciA9IHsKLQlmbG9hdF9hZGQsIAkvKm5iX2FkZCovCi0JZmxvYXRfc3ViLCAJLypuYl9zdWJ0cmFjdCovCi0JZmxvYXRfbXVsLCAJLypuYl9tdWx0aXBseSovCi0JZmxvYXRfY2xhc3NpY19kaXYsIC8qbmJfZGl2aWRlKi8KLQlmbG9hdF9yZW0sIAkvKm5iX3JlbWFpbmRlciovCi0JZmxvYXRfZGl2bW9kLCAJLypuYl9kaXZtb2QqLwotCWZsb2F0X3BvdywgCS8qbmJfcG93ZXIqLwotCSh1bmFyeWZ1bmMpZmxvYXRfbmVnLCAvKm5iX25lZ2F0aXZlKi8KLQkodW5hcnlmdW5jKWZsb2F0X2Zsb2F0LCAvKm5iX3Bvc2l0aXZlKi8KLQkodW5hcnlmdW5jKWZsb2F0X2FicywgLypuYl9hYnNvbHV0ZSovCi0JKGlucXVpcnkpZmxvYXRfbm9uemVybywgLypuYl9ub256ZXJvKi8KLQkwLAkJLypuYl9pbnZlcnQqLwotCTAsCQkvKm5iX2xzaGlmdCovCi0JMCwJCS8qbmJfcnNoaWZ0Ki8KLQkwLAkJLypuYl9hbmQqLwotCTAsCQkvKm5iX3hvciovCi0JMCwJCS8qbmJfb3IqLwotCWZsb2F0X2NvZXJjZSwgCS8qbmJfY29lcmNlKi8KLQlmbG9hdF90cnVuYywgCS8qbmJfaW50Ki8KLQlmbG9hdF9sb25nLCAJLypuYl9sb25nKi8KLQlmbG9hdF9mbG9hdCwJLypuYl9mbG9hdCovCi0JMCwJCS8qIG5iX29jdCAqLwotCTAsCQkvKiBuYl9oZXggKi8KLQkwLAkJLyogbmJfaW5wbGFjZV9hZGQgKi8KLQkwLAkJLyogbmJfaW5wbGFjZV9zdWJ0cmFjdCAqLwotCTAsCQkvKiBuYl9pbnBsYWNlX211bHRpcGx5ICovCi0JMCwJCS8qIG5iX2lucGxhY2VfZGl2aWRlICovCi0JMCwJCS8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCi0JMCwgCQkvKiBuYl9pbnBsYWNlX3Bvd2VyICovCi0JMCwJCS8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCi0JMCwJCS8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCi0JMCwJCS8qIG5iX2lucGxhY2VfYW5kICovCi0JMCwJCS8qIG5iX2lucGxhY2VfeG9yICovCi0JMCwJCS8qIG5iX2lucGxhY2Vfb3IgKi8KLQlmbG9hdF9mbG9vcl9kaXYsIC8qIG5iX2Zsb29yX2RpdmlkZSAqLwotCWZsb2F0X2RpdiwJLyogbmJfdHJ1ZV9kaXZpZGUgKi8KLQkwLAkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KLQkwLAkJLyogbmJfaW5wbGFjZV90cnVlX2RpdmlkZSAqLworICAgIGZsb2F0X2FkZCwgICAgICAgICAgLypuYl9hZGQqLworICAgIGZsb2F0X3N1YiwgICAgICAgICAgLypuYl9zdWJ0cmFjdCovCisgICAgZmxvYXRfbXVsLCAgICAgICAgICAvKm5iX211bHRpcGx5Ki8KKyAgICBmbG9hdF9jbGFzc2ljX2RpdiwgLypuYl9kaXZpZGUqLworICAgIGZsb2F0X3JlbSwgICAgICAgICAgLypuYl9yZW1haW5kZXIqLworICAgIGZsb2F0X2Rpdm1vZCwgICAgICAgLypuYl9kaXZtb2QqLworICAgIGZsb2F0X3BvdywgICAgICAgICAgLypuYl9wb3dlciovCisgICAgKHVuYXJ5ZnVuYylmbG9hdF9uZWcsIC8qbmJfbmVnYXRpdmUqLworICAgICh1bmFyeWZ1bmMpZmxvYXRfZmxvYXQsIC8qbmJfcG9zaXRpdmUqLworICAgICh1bmFyeWZ1bmMpZmxvYXRfYWJzLCAvKm5iX2Fic29sdXRlKi8KKyAgICAoaW5xdWlyeSlmbG9hdF9ub256ZXJvLCAvKm5iX25vbnplcm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgLypuYl9pbnZlcnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLypuYl9sc2hpZnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLypuYl9yc2hpZnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLypuYl9hbmQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLypuYl94b3IqLworICAgIDAsICAgICAgICAgICAgICAgICAgLypuYl9vciovCisgICAgZmxvYXRfY29lcmNlLCAgICAgICAvKm5iX2NvZXJjZSovCisgICAgZmxvYXRfdHJ1bmMsICAgICAgICAvKm5iX2ludCovCisgICAgZmxvYXRfbG9uZywgICAgICAgICAvKm5iX2xvbmcqLworICAgIGZsb2F0X2Zsb2F0LCAgICAgICAgLypuYl9mbG9hdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9vY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2hleCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9hZGQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfc3VidHJhY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3JlbWFpbmRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9wb3dlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcnNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2FuZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV94b3IgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2Vfb3IgKi8KKyAgICBmbG9hdF9mbG9vcl9kaXYsIC8qIG5iX2Zsb29yX2RpdmlkZSAqLworICAgIGZsb2F0X2RpdiwgICAgICAgICAgLyogbmJfdHJ1ZV9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlGbG9hdF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImZsb2F0IiwKLQlzaXplb2YoUHlGbG9hdE9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilmbG9hdF9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCShwcmludGZ1bmMpZmxvYXRfcHJpbnQsIAkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkgCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWZsb2F0X3JlcHIsCQkJLyogdHBfcmVwciAqLwotCSZmbG9hdF9hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpZmxvYXRfaGFzaCwJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkocmVwcmZ1bmMpZmxvYXRfc3RyLAkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJCS8qIHRwX2ZsYWdzICovCi0JZmxvYXRfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLSAJMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JZmxvYXRfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWZsb2F0X21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCWZsb2F0X2dldHNldCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWZsb2F0X25ldywJCQkJLyogdHBfbmV3ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZmxvYXQiLAorICAgIHNpemVvZihQeUZsb2F0T2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWZsb2F0X2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpZmxvYXRfcHJpbnQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpZmxvYXRfcmVwciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmZmxvYXRfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpZmxvYXRfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpZmxvYXRfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBmbG9hdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgZmxvYXRfcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZmxvYXRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgZmxvYXRfZ2V0c2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGZsb2F0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiB2b2lkCiBfUHlGbG9hdF9Jbml0KHZvaWQpCiB7Ci0JLyogV2UgYXR0ZW1wdCB0byBkZXRlcm1pbmUgaWYgdGhpcyBtYWNoaW5lIGlzIHVzaW5nIElFRUUKLQkgICBmbG9hdGluZyBwb2ludCBmb3JtYXRzIGJ5IHBlZXJpbmcgYXQgdGhlIGJpdHMgb2Ygc29tZQotCSAgIGNhcmVmdWxseSBjaG9zZW4gdmFsdWVzLiAgSWYgaXQgbG9va3MgbGlrZSB3ZSBhcmUgb24gYW4KLQkgICBJRUVFIHBsYXRmb3JtLCB0aGUgZmxvYXQgcGFja2luZy91bnBhY2tpbmcgcm91dGluZXMgY2FuCi0JICAganVzdCBjb3B5IGJpdHMsIGlmIG5vdCB0aGV5IHJlc29ydCB0byBhcml0aG1ldGljICYgc2hpZnRzCi0JICAgYW5kIG1hc2tzLiAgVGhlIHNoaWZ0cyAmIG1hc2tzIGFwcHJvYWNoIHdvcmtzIG9uIGFsbCBmaW5pdGUKLQkgICB2YWx1ZXMsIGJ1dCB3aGF0IGhhcHBlbnMgdG8gaW5maW5pdGllcywgTmFOcyBhbmQgc2lnbmVkCi0JICAgemVyb2VzIG9uIHBhY2tpbmcgaXMgYW4gYWNjaWRlbnQsIGFuZCBhdHRlbXB0aW5nIHRvIHVucGFjawotCSAgIGEgTmFOIG9yIGFuIGluZmluaXR5IHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgIC8qIFdlIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgbWFjaGluZSBpcyB1c2luZyBJRUVFCisgICAgICAgZmxvYXRpbmcgcG9pbnQgZm9ybWF0cyBieSBwZWVyaW5nIGF0IHRoZSBiaXRzIG9mIHNvbWUKKyAgICAgICBjYXJlZnVsbHkgY2hvc2VuIHZhbHVlcy4gIElmIGl0IGxvb2tzIGxpa2Ugd2UgYXJlIG9uIGFuCisgICAgICAgSUVFRSBwbGF0Zm9ybSwgdGhlIGZsb2F0IHBhY2tpbmcvdW5wYWNraW5nIHJvdXRpbmVzIGNhbgorICAgICAgIGp1c3QgY29weSBiaXRzLCBpZiBub3QgdGhleSByZXNvcnQgdG8gYXJpdGhtZXRpYyAmIHNoaWZ0cworICAgICAgIGFuZCBtYXNrcy4gIFRoZSBzaGlmdHMgJiBtYXNrcyBhcHByb2FjaCB3b3JrcyBvbiBhbGwgZmluaXRlCisgICAgICAgdmFsdWVzLCBidXQgd2hhdCBoYXBwZW5zIHRvIGluZmluaXRpZXMsIE5hTnMgYW5kIHNpZ25lZAorICAgICAgIHplcm9lcyBvbiBwYWNraW5nIGlzIGFuIGFjY2lkZW50LCBhbmQgYXR0ZW1wdGluZyB0byB1bnBhY2sKKyAgICAgICBhIE5hTiBvciBhbiBpbmZpbml0eSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi4KIAotCSAgIE5vdGUgdGhhdCBpZiB3ZSdyZSBvbiBzb21lIHdoYWNrZWQtb3V0IHBsYXRmb3JtIHdoaWNoIHVzZXMKLQkgICBJRUVFIGZvcm1hdHMgYnV0IGlzbid0IHN0cmljdGx5IGxpdHRsZS1lbmRpYW4gb3IgYmlnLQotCSAgIGVuZGlhbiwgd2Ugd2lsbCBmYWxsIGJhY2sgdG8gdGhlIHBvcnRhYmxlIHNoaWZ0cyAmIG1hc2tzCi0JICAgbWV0aG9kLiAqLworICAgICAgIE5vdGUgdGhhdCBpZiB3ZSdyZSBvbiBzb21lIHdoYWNrZWQtb3V0IHBsYXRmb3JtIHdoaWNoIHVzZXMKKyAgICAgICBJRUVFIGZvcm1hdHMgYnV0IGlzbid0IHN0cmljdGx5IGxpdHRsZS1lbmRpYW4gb3IgYmlnLQorICAgICAgIGVuZGlhbiwgd2Ugd2lsbCBmYWxsIGJhY2sgdG8gdGhlIHBvcnRhYmxlIHNoaWZ0cyAmIG1hc2tzCisgICAgICAgbWV0aG9kLiAqLwogCiAjaWYgU0laRU9GX0RPVUJMRSA9PSA4Ci0JewotCQlkb3VibGUgeCA9IDkwMDYxMDQwNzE4MzI1ODEuMDsKLQkJaWYgKG1lbWNtcCgmeCwgIlx4NDNceDNmXHhmZlx4MDFceDAyXHgwM1x4MDRceDA1IiwgOCkgPT0gMCkKLQkJCWRldGVjdGVkX2RvdWJsZV9mb3JtYXQgPSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0OwotCQllbHNlIGlmIChtZW1jbXAoJngsICJceDA1XHgwNFx4MDNceDAyXHgwMVx4ZmZceDNmXHg0MyIsIDgpID09IDApCi0JCQlkZXRlY3RlZF9kb3VibGVfZm9ybWF0ID0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdDsKLQkJZWxzZSAKLQkJCWRldGVjdGVkX2RvdWJsZV9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKLQl9CisgICAgeworICAgICAgICBkb3VibGUgeCA9IDkwMDYxMDQwNzE4MzI1ODEuMDsKKyAgICAgICAgaWYgKG1lbWNtcCgmeCwgIlx4NDNceDNmXHhmZlx4MDFceDAyXHgwM1x4MDRceDA1IiwgOCkgPT0gMCkKKyAgICAgICAgICAgIGRldGVjdGVkX2RvdWJsZV9mb3JtYXQgPSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0OworICAgICAgICBlbHNlIGlmIChtZW1jbXAoJngsICJceDA1XHgwNFx4MDNceDAyXHgwMVx4ZmZceDNmXHg0MyIsIDgpID09IDApCisgICAgICAgICAgICBkZXRlY3RlZF9kb3VibGVfZm9ybWF0ID0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGV0ZWN0ZWRfZG91YmxlX2Zvcm1hdCA9IHVua25vd25fZm9ybWF0OworICAgIH0KICNlbHNlCi0JZGV0ZWN0ZWRfZG91YmxlX2Zvcm1hdCA9IHVua25vd25fZm9ybWF0OworICAgIGRldGVjdGVkX2RvdWJsZV9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKICNlbmRpZgogCiAjaWYgU0laRU9GX0ZMT0FUID09IDQKLQl7Ci0JCWZsb2F0IHkgPSAxNjcxMTkzOC4wOwotCQlpZiAobWVtY21wKCZ5LCAiXHg0Ylx4N2ZceDAxXHgwMiIsIDQpID09IDApCi0JCQlkZXRlY3RlZF9mbG9hdF9mb3JtYXQgPSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0OwotCQllbHNlIGlmIChtZW1jbXAoJnksICJceDAyXHgwMVx4N2ZceDRiIiwgNCkgPT0gMCkKLQkJCWRldGVjdGVkX2Zsb2F0X2Zvcm1hdCA9IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQ7Ci0JCWVsc2UgCi0JCQlkZXRlY3RlZF9mbG9hdF9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKLQl9CisgICAgeworICAgICAgICBmbG9hdCB5ID0gMTY3MTE5MzguMDsKKyAgICAgICAgaWYgKG1lbWNtcCgmeSwgIlx4NGJceDdmXHgwMVx4MDIiLCA0KSA9PSAwKQorICAgICAgICAgICAgZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0ID0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdDsKKyAgICAgICAgZWxzZSBpZiAobWVtY21wKCZ5LCAiXHgwMlx4MDFceDdmXHg0YiIsIDQpID09IDApCisgICAgICAgICAgICBkZXRlY3RlZF9mbG9hdF9mb3JtYXQgPSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZXRlY3RlZF9mbG9hdF9mb3JtYXQgPSB1bmtub3duX2Zvcm1hdDsKKyAgICB9CiAjZWxzZQotCWRldGVjdGVkX2Zsb2F0X2Zvcm1hdCA9IHVua25vd25fZm9ybWF0OworICAgIGRldGVjdGVkX2Zsb2F0X2Zvcm1hdCA9IHVua25vd25fZm9ybWF0OwogI2VuZGlmCiAKLQlkb3VibGVfZm9ybWF0ID0gZGV0ZWN0ZWRfZG91YmxlX2Zvcm1hdDsKLQlmbG9hdF9mb3JtYXQgPSBkZXRlY3RlZF9mbG9hdF9mb3JtYXQ7CisgICAgZG91YmxlX2Zvcm1hdCA9IGRldGVjdGVkX2RvdWJsZV9mb3JtYXQ7CisgICAgZmxvYXRfZm9ybWF0ID0gZGV0ZWN0ZWRfZmxvYXRfZm9ybWF0OwogCi0JLyogSW5pdCBmbG9hdCBpbmZvICovCi0JaWYgKEZsb2F0SW5mb1R5cGUudHBfbmFtZSA9PSAwKQotCQlQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZGbG9hdEluZm9UeXBlLCAmZmxvYXRpbmZvX2Rlc2MpOworICAgIC8qIEluaXQgZmxvYXQgaW5mbyAqLworICAgIGlmIChGbG9hdEluZm9UeXBlLnRwX25hbWUgPT0gMCkKKyAgICAgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmRmxvYXRJbmZvVHlwZSwgJmZsb2F0aW5mb19kZXNjKTsKIH0KIAogaW50CiBQeUZsb2F0X0NsZWFyRnJlZUxpc3Qodm9pZCkKIHsKLQlQeUZsb2F0T2JqZWN0ICpwOwotCVB5RmxvYXRCbG9jayAqbGlzdCwgKm5leHQ7Ci0JaW50IGk7Ci0JaW50IHU7CQkJLyogcmVtYWluaW5nIHVuZnJlZWQgaW50cyBwZXIgYmxvY2sgKi8KLQlpbnQgZnJlZWxpc3Rfc2l6ZSA9IDA7CisgICAgUHlGbG9hdE9iamVjdCAqcDsKKyAgICBQeUZsb2F0QmxvY2sgKmxpc3QsICpuZXh0OworICAgIGludCBpOworICAgIGludCB1OyAgICAgICAgICAgICAgICAgICAgICAvKiByZW1haW5pbmcgdW5mcmVlZCBpbnRzIHBlciBibG9jayAqLworICAgIGludCBmcmVlbGlzdF9zaXplID0gMDsKIAotCWxpc3QgPSBibG9ja19saXN0OwotCWJsb2NrX2xpc3QgPSBOVUxMOwotCWZyZWVfbGlzdCA9IE5VTEw7Ci0Jd2hpbGUgKGxpc3QgIT0gTlVMTCkgewotCQl1ID0gMDsKLQkJZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOwotCQkgICAgIGkgPCBOX0ZMT0FUT0JKRUNUUzsKLQkJICAgICBpKyssIHArKykgewotCQkJaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChwKSAmJiBQeV9SRUZDTlQocCkgIT0gMCkKLQkJCQl1Kys7Ci0JCX0KLQkJbmV4dCA9IGxpc3QtPm5leHQ7Ci0JCWlmICh1KSB7Ci0JCQlsaXN0LT5uZXh0ID0gYmxvY2tfbGlzdDsKLQkJCWJsb2NrX2xpc3QgPSBsaXN0OwotCQkJZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOwotCQkJICAgICBpIDwgTl9GTE9BVE9CSkVDVFM7Ci0JCQkgICAgIGkrKywgcCsrKSB7Ci0JCQkJaWYgKCFQeUZsb2F0X0NoZWNrRXhhY3QocCkgfHwKLQkJCQkgICAgUHlfUkVGQ05UKHApID09IDApIHsKLQkJCQkJUHlfVFlQRShwKSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKikKLQkJCQkJCWZyZWVfbGlzdDsKLQkJCQkJZnJlZV9saXN0ID0gcDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeU1lbV9GUkVFKGxpc3QpOwotCQl9Ci0JCWZyZWVsaXN0X3NpemUgKz0gdTsKLQkJbGlzdCA9IG5leHQ7Ci0JfQotCXJldHVybiBmcmVlbGlzdF9zaXplOworICAgIGxpc3QgPSBibG9ja19saXN0OworICAgIGJsb2NrX2xpc3QgPSBOVUxMOworICAgIGZyZWVfbGlzdCA9IE5VTEw7CisgICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgeworICAgICAgICB1ID0gMDsKKyAgICAgICAgZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOworICAgICAgICAgICAgIGkgPCBOX0ZMT0FUT0JKRUNUUzsKKyAgICAgICAgICAgICBpKyssIHArKykgeworICAgICAgICAgICAgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChwKSAmJiBQeV9SRUZDTlQocCkgIT0gMCkKKyAgICAgICAgICAgICAgICB1Kys7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9IGxpc3QtPm5leHQ7CisgICAgICAgIGlmICh1KSB7CisgICAgICAgICAgICBsaXN0LT5uZXh0ID0gYmxvY2tfbGlzdDsKKyAgICAgICAgICAgIGJsb2NrX2xpc3QgPSBsaXN0OworICAgICAgICAgICAgZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOworICAgICAgICAgICAgICAgICBpIDwgTl9GTE9BVE9CSkVDVFM7CisgICAgICAgICAgICAgICAgIGkrKywgcCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFQeUZsb2F0X0NoZWNrRXhhY3QocCkgfHwKKyAgICAgICAgICAgICAgICAgICAgUHlfUkVGQ05UKHApID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShwKSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfbGlzdDsKKyAgICAgICAgICAgICAgICAgICAgZnJlZV9saXN0ID0gcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU1lbV9GUkVFKGxpc3QpOworICAgICAgICB9CisgICAgICAgIGZyZWVsaXN0X3NpemUgKz0gdTsKKyAgICAgICAgbGlzdCA9IG5leHQ7CisgICAgfQorICAgIHJldHVybiBmcmVlbGlzdF9zaXplOwogfQogCiB2b2lkCiBQeUZsb2F0X0Zpbmkodm9pZCkKIHsKLQlQeUZsb2F0T2JqZWN0ICpwOwotCVB5RmxvYXRCbG9jayAqbGlzdDsKLQlpbnQgaTsKLQlpbnQgdTsJCQkvKiB0b3RhbCB1bmZyZWVkIGZsb2F0cyBwZXIgYmxvY2sgKi8KKyAgICBQeUZsb2F0T2JqZWN0ICpwOworICAgIFB5RmxvYXRCbG9jayAqbGlzdDsKKyAgICBpbnQgaTsKKyAgICBpbnQgdTsgICAgICAgICAgICAgICAgICAgICAgLyogdG90YWwgdW5mcmVlZCBmbG9hdHMgcGVyIGJsb2NrICovCiAKLQl1ID0gUHlGbG9hdF9DbGVhckZyZWVMaXN0KCk7CisgICAgdSA9IFB5RmxvYXRfQ2xlYXJGcmVlTGlzdCgpOwogCi0JaWYgKCFQeV9WZXJib3NlRmxhZykKLQkJcmV0dXJuOwotCWZwcmludGYoc3RkZXJyLCAiIyBjbGVhbnVwIGZsb2F0cyIpOwotCWlmICghdSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JfQotCWVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSI6ICVkIHVuZnJlZWQgZmxvYXQlc1xuIiwKLQkJCXUsIHUgPT0gMSA/ICIiIDogInMiKTsKLQl9Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkgewotCQlsaXN0ID0gYmxvY2tfbGlzdDsKLQkJd2hpbGUgKGxpc3QgIT0gTlVMTCkgewotCQkJZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOwotCQkJICAgICBpIDwgTl9GTE9BVE9CSkVDVFM7Ci0JCQkgICAgIGkrKywgcCsrKSB7Ci0JCQkJaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChwKSAmJgotCQkJCSAgICBQeV9SRUZDTlQocCkgIT0gMCkgewotCQkJCQljaGFyIGJ1ZlsxMDBdOwotCQkJCQlQeUZsb2F0X0FzU3RyaW5nKGJ1ZiwgcCk7Ci0JCQkJCS8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0bwotCQkJCQkgICBsb25nIHVudGlsICV6ZCBpcyB1bml2ZXJzYWxseQotCQkJCQkgICBhdmFpbGFibGUKLQkJCQkJICovCi0JCQkJCWZwcmludGYoc3RkZXJyLAotCQkJICAgICAiIyAgIDxmbG9hdCBhdCAlcCwgcmVmY250PSVsZCwgdmFsPSVzPlxuIiwKLQkJCQkJCXAsIChsb25nKVB5X1JFRkNOVChwKSwgYnVmKTsKLQkJCQl9Ci0JCQl9Ci0JCQlsaXN0ID0gbGlzdC0+bmV4dDsKLQkJfQotCX0KKyAgICBpZiAoIVB5X1ZlcmJvc2VGbGFnKQorICAgICAgICByZXR1cm47CisgICAgZnByaW50ZihzdGRlcnIsICIjIGNsZWFudXAgZmxvYXRzIik7CisgICAgaWYgKCF1KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIjogJWQgdW5mcmVlZCBmbG9hdCVzXG4iLAorICAgICAgICAgICAgdSwgdSA9PSAxID8gIiIgOiAicyIpOworICAgIH0KKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcgPiAxKSB7CisgICAgICAgIGxpc3QgPSBibG9ja19saXN0OworICAgICAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07CisgICAgICAgICAgICAgICAgIGkgPCBOX0ZMT0FUT0JKRUNUUzsKKyAgICAgICAgICAgICAgICAgaSsrLCBwKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHApICYmCisgICAgICAgICAgICAgICAgICAgIFB5X1JFRkNOVChwKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmWzEwMF07CisgICAgICAgICAgICAgICAgICAgIFB5RmxvYXRfQXNTdHJpbmcoYnVmLCBwKTsKKyAgICAgICAgICAgICAgICAgICAgLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvCisgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdW50aWwgJXpkIGlzIHVuaXZlcnNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICIjICAgPGZsb2F0IGF0ICVwLCByZWZjbnQ9JWxkLCB2YWw9JXM+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgKGxvbmcpUHlfUkVGQ05UKHApLCBidWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICB9CisgICAgfQogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIxMzgsNDA2ICsyMTM4LDQwNiBAQAogaW50CiBfUHlGbG9hdF9QYWNrNChkb3VibGUgeCwgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKQogewotCWlmIChmbG9hdF9mb3JtYXQgPT0gdW5rbm93bl9mb3JtYXQpIHsKLQkJdW5zaWduZWQgY2hhciBzaWduOwotCQlpbnQgZTsKLQkJZG91YmxlIGY7Ci0JCXVuc2lnbmVkIGludCBmYml0czsKLQkJaW50IGluY3IgPSAxOworICAgIGlmIChmbG9hdF9mb3JtYXQgPT0gdW5rbm93bl9mb3JtYXQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzaWduOworICAgICAgICBpbnQgZTsKKyAgICAgICAgZG91YmxlIGY7CisgICAgICAgIHVuc2lnbmVkIGludCBmYml0czsKKyAgICAgICAgaW50IGluY3IgPSAxOwogCi0JCWlmIChsZSkgewotCQkJcCArPSAzOwotCQkJaW5jciA9IC0xOwotCQl9CisgICAgICAgIGlmIChsZSkgeworICAgICAgICAgICAgcCArPSAzOworICAgICAgICAgICAgaW5jciA9IC0xOworICAgICAgICB9CiAKLQkJaWYgKHggPCAwKSB7Ci0JCQlzaWduID0gMTsKLQkJCXggPSAteDsKLQkJfQotCQllbHNlCi0JCQlzaWduID0gMDsKKyAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICBzaWduID0gMTsKKyAgICAgICAgICAgIHggPSAteDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzaWduID0gMDsKIAotCQlmID0gZnJleHAoeCwgJmUpOworICAgICAgICBmID0gZnJleHAoeCwgJmUpOwogCi0JCS8qIE5vcm1hbGl6ZSBmIHRvIGJlIGluIHRoZSByYW5nZSBbMS4wLCAyLjApICovCi0JCWlmICgwLjUgPD0gZiAmJiBmIDwgMS4wKSB7Ci0JCQlmICo9IDIuMDsKLQkJCWUtLTsKLQkJfQotCQllbHNlIGlmIChmID09IDAuMCkKLQkJCWUgPSAwOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJImZyZXhwKCkgcmVzdWx0IG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIC8qIE5vcm1hbGl6ZSBmIHRvIGJlIGluIHRoZSByYW5nZSBbMS4wLCAyLjApICovCisgICAgICAgIGlmICgwLjUgPD0gZiAmJiBmIDwgMS4wKSB7CisgICAgICAgICAgICBmICo9IDIuMDsKKyAgICAgICAgICAgIGUtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmID09IDAuMCkKKyAgICAgICAgICAgIGUgPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJleHAoKSByZXN1bHQgb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQlpZiAoZSA+PSAxMjgpCi0JCQlnb3RvIE92ZXJmbG93OwotCQllbHNlIGlmIChlIDwgLTEyNikgewotCQkJLyogR3JhZHVhbCB1bmRlcmZsb3cgKi8KLQkJCWYgPSBsZGV4cChmLCAxMjYgKyBlKTsKLQkJCWUgPSAwOwotCQl9Ci0JCWVsc2UgaWYgKCEoZSA9PSAwICYmIGYgPT0gMC4wKSkgewotCQkJZSArPSAxMjc7Ci0JCQlmIC09IDEuMDsgLyogR2V0IHJpZCBvZiBsZWFkaW5nIDEgKi8KLQkJfQorICAgICAgICBpZiAoZSA+PSAxMjgpCisgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICBlbHNlIGlmIChlIDwgLTEyNikgeworICAgICAgICAgICAgLyogR3JhZHVhbCB1bmRlcmZsb3cgKi8KKyAgICAgICAgICAgIGYgPSBsZGV4cChmLCAxMjYgKyBlKTsKKyAgICAgICAgICAgIGUgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCEoZSA9PSAwICYmIGYgPT0gMC4wKSkgeworICAgICAgICAgICAgZSArPSAxMjc7CisgICAgICAgICAgICBmIC09IDEuMDsgLyogR2V0IHJpZCBvZiBsZWFkaW5nIDEgKi8KKyAgICAgICAgfQogCi0JCWYgKj0gODM4ODYwOC4wOyAvKiAyKioyMyAqLwotCQlmYml0cyA9ICh1bnNpZ25lZCBpbnQpKGYgKyAwLjUpOyAvKiBSb3VuZCAqLwotCQlhc3NlcnQoZmJpdHMgPD0gODM4ODYwOCk7Ci0JCWlmIChmYml0cyA+PiAyMykgewotCQkJLyogVGhlIGNhcnJ5IHByb3BhZ2F0ZWQgb3V0IG9mIGEgc3RyaW5nIG9mIDIzIDEgYml0cy4gKi8KLQkJCWZiaXRzID0gMDsKLQkJCSsrZTsKLQkJCWlmIChlID49IDI1NSkKLQkJCQlnb3RvIE92ZXJmbG93OwotCQl9CisgICAgICAgIGYgKj0gODM4ODYwOC4wOyAvKiAyKioyMyAqLworICAgICAgICBmYml0cyA9ICh1bnNpZ25lZCBpbnQpKGYgKyAwLjUpOyAvKiBSb3VuZCAqLworICAgICAgICBhc3NlcnQoZmJpdHMgPD0gODM4ODYwOCk7CisgICAgICAgIGlmIChmYml0cyA+PiAyMykgeworICAgICAgICAgICAgLyogVGhlIGNhcnJ5IHByb3BhZ2F0ZWQgb3V0IG9mIGEgc3RyaW5nIG9mIDIzIDEgYml0cy4gKi8KKyAgICAgICAgICAgIGZiaXRzID0gMDsKKyAgICAgICAgICAgICsrZTsKKyAgICAgICAgICAgIGlmIChlID49IDI1NSkKKyAgICAgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICB9CiAKLQkJLyogRmlyc3QgYnl0ZSAqLwotCQkqcCA9IChzaWduIDw8IDcpIHwgKGUgPj4gMSk7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogRmlyc3QgYnl0ZSAqLworICAgICAgICAqcCA9IChzaWduIDw8IDcpIHwgKGUgPj4gMSk7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBTZWNvbmQgYnl0ZSAqLwotCQkqcCA9IChjaGFyKSAoKChlICYgMSkgPDwgNykgfCAoZmJpdHMgPj4gMTYpKTsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBTZWNvbmQgYnl0ZSAqLworICAgICAgICAqcCA9IChjaGFyKSAoKChlICYgMSkgPDwgNykgfCAoZmJpdHMgPj4gMTYpKTsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIFRoaXJkIGJ5dGUgKi8KLQkJKnAgPSAoZmJpdHMgPj4gOCkgJiAweEZGOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFRoaXJkIGJ5dGUgKi8KKyAgICAgICAgKnAgPSAoZmJpdHMgPj4gOCkgJiAweEZGOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogRm91cnRoIGJ5dGUgKi8KLQkJKnAgPSBmYml0cyAmIDB4RkY7CisgICAgICAgIC8qIEZvdXJ0aCBieXRlICovCisgICAgICAgICpwID0gZmJpdHMgJiAweEZGOwogCi0JCS8qIERvbmUgKi8KLQkJcmV0dXJuIDA7CisgICAgICAgIC8qIERvbmUgKi8KKyAgICAgICAgcmV0dXJuIDA7CiAKLQl9Ci0JZWxzZSB7Ci0JCWZsb2F0IHkgPSAoZmxvYXQpeDsKLQkJY29uc3QgY2hhciAqcyA9IChjaGFyKikmeTsKLQkJaW50IGksIGluY3IgPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZmxvYXQgeSA9IChmbG9hdCl4OworICAgICAgICBjb25zdCBjaGFyICpzID0gKGNoYXIqKSZ5OworICAgICAgICBpbnQgaSwgaW5jciA9IDE7CiAKLQkJaWYgKFB5X0lTX0lORklOSVRZKHkpICYmICFQeV9JU19JTkZJTklUWSh4KSkKLQkJCWdvdG8gT3ZlcmZsb3c7CisgICAgICAgIGlmIChQeV9JU19JTkZJTklUWSh5KSAmJiAhUHlfSVNfSU5GSU5JVFkoeCkpCisgICAgICAgICAgICBnb3RvIE92ZXJmbG93OwogCi0JCWlmICgoZmxvYXRfZm9ybWF0ID09IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQgJiYgIWxlKQotCQkgICAgfHwgKGZsb2F0X2Zvcm1hdCA9PSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0ICYmIGxlKSkgewotCQkJcCArPSAzOwotCQkJaW5jciA9IC0xOwotCQl9CisgICAgICAgIGlmICgoZmxvYXRfZm9ybWF0ID09IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQgJiYgIWxlKQorICAgICAgICAgICAgfHwgKGZsb2F0X2Zvcm1hdCA9PSBpZWVlX2JpZ19lbmRpYW5fZm9ybWF0ICYmIGxlKSkgeworICAgICAgICAgICAgcCArPSAzOworICAgICAgICAgICAgaW5jciA9IC0xOworICAgICAgICB9CiAKLQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQkJKnAgPSAqcysrOwotCQkJcCArPSBpbmNyOwotCQl9Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgKnAgPSAqcysrOworICAgICAgICAgICAgcCArPSBpbmNyOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgT3ZlcmZsb3c6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkiZmxvYXQgdG9vIGxhcmdlIHRvIHBhY2sgd2l0aCBmIGZvcm1hdCIpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImZsb2F0IHRvbyBsYXJnZSB0byBwYWNrIHdpdGggZiBmb3JtYXQiKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIGludAogX1B5RmxvYXRfUGFjazgoZG91YmxlIHgsIHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSkKIHsKLQlpZiAoZG91YmxlX2Zvcm1hdCA9PSB1bmtub3duX2Zvcm1hdCkgewotCQl1bnNpZ25lZCBjaGFyIHNpZ247Ci0JCWludCBlOwotCQlkb3VibGUgZjsKLQkJdW5zaWduZWQgaW50IGZoaSwgZmxvOwotCQlpbnQgaW5jciA9IDE7CisgICAgaWYgKGRvdWJsZV9mb3JtYXQgPT0gdW5rbm93bl9mb3JtYXQpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzaWduOworICAgICAgICBpbnQgZTsKKyAgICAgICAgZG91YmxlIGY7CisgICAgICAgIHVuc2lnbmVkIGludCBmaGksIGZsbzsKKyAgICAgICAgaW50IGluY3IgPSAxOwogCi0JCWlmIChsZSkgewotCQkJcCArPSA3OwotCQkJaW5jciA9IC0xOwotCQl9CisgICAgICAgIGlmIChsZSkgeworICAgICAgICAgICAgcCArPSA3OworICAgICAgICAgICAgaW5jciA9IC0xOworICAgICAgICB9CiAKLQkJaWYgKHggPCAwKSB7Ci0JCQlzaWduID0gMTsKLQkJCXggPSAteDsKLQkJfQotCQllbHNlCi0JCQlzaWduID0gMDsKKyAgICAgICAgaWYgKHggPCAwKSB7CisgICAgICAgICAgICBzaWduID0gMTsKKyAgICAgICAgICAgIHggPSAteDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzaWduID0gMDsKIAotCQlmID0gZnJleHAoeCwgJmUpOworICAgICAgICBmID0gZnJleHAoeCwgJmUpOwogCi0JCS8qIE5vcm1hbGl6ZSBmIHRvIGJlIGluIHRoZSByYW5nZSBbMS4wLCAyLjApICovCi0JCWlmICgwLjUgPD0gZiAmJiBmIDwgMS4wKSB7Ci0JCQlmICo9IDIuMDsKLQkJCWUtLTsKLQkJfQotCQllbHNlIGlmIChmID09IDAuMCkKLQkJCWUgPSAwOwotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJImZyZXhwKCkgcmVzdWx0IG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIC8qIE5vcm1hbGl6ZSBmIHRvIGJlIGluIHRoZSByYW5nZSBbMS4wLCAyLjApICovCisgICAgICAgIGlmICgwLjUgPD0gZiAmJiBmIDwgMS4wKSB7CisgICAgICAgICAgICBmICo9IDIuMDsKKyAgICAgICAgICAgIGUtLTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChmID09IDAuMCkKKyAgICAgICAgICAgIGUgPSAwOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJleHAoKSByZXN1bHQgb3V0IG9mIHJhbmdlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQlpZiAoZSA+PSAxMDI0KQotCQkJZ290byBPdmVyZmxvdzsKLQkJZWxzZSBpZiAoZSA8IC0xMDIyKSB7Ci0JCQkvKiBHcmFkdWFsIHVuZGVyZmxvdyAqLwotCQkJZiA9IGxkZXhwKGYsIDEwMjIgKyBlKTsKLQkJCWUgPSAwOwotCQl9Ci0JCWVsc2UgaWYgKCEoZSA9PSAwICYmIGYgPT0gMC4wKSkgewotCQkJZSArPSAxMDIzOwotCQkJZiAtPSAxLjA7IC8qIEdldCByaWQgb2YgbGVhZGluZyAxICovCi0JCX0KKyAgICAgICAgaWYgKGUgPj0gMTAyNCkKKyAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7CisgICAgICAgIGVsc2UgaWYgKGUgPCAtMTAyMikgeworICAgICAgICAgICAgLyogR3JhZHVhbCB1bmRlcmZsb3cgKi8KKyAgICAgICAgICAgIGYgPSBsZGV4cChmLCAxMDIyICsgZSk7CisgICAgICAgICAgICBlID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghKGUgPT0gMCAmJiBmID09IDAuMCkpIHsKKyAgICAgICAgICAgIGUgKz0gMTAyMzsKKyAgICAgICAgICAgIGYgLT0gMS4wOyAvKiBHZXQgcmlkIG9mIGxlYWRpbmcgMSAqLworICAgICAgICB9CiAKLQkJLyogZmhpIHJlY2VpdmVzIHRoZSBoaWdoIDI4IGJpdHM7IGZsbyB0aGUgbG93IDI0IGJpdHMgKD09IDUyIGJpdHMpICovCi0JCWYgKj0gMjY4NDM1NDU2LjA7IC8qIDIqKjI4ICovCi0JCWZoaSA9ICh1bnNpZ25lZCBpbnQpZjsgLyogVHJ1bmNhdGUgKi8KLQkJYXNzZXJ0KGZoaSA8IDI2ODQzNTQ1Nik7CisgICAgICAgIC8qIGZoaSByZWNlaXZlcyB0aGUgaGlnaCAyOCBiaXRzOyBmbG8gdGhlIGxvdyAyNCBiaXRzICg9PSA1MiBiaXRzKSAqLworICAgICAgICBmICo9IDI2ODQzNTQ1Ni4wOyAvKiAyKioyOCAqLworICAgICAgICBmaGkgPSAodW5zaWduZWQgaW50KWY7IC8qIFRydW5jYXRlICovCisgICAgICAgIGFzc2VydChmaGkgPCAyNjg0MzU0NTYpOwogCi0JCWYgLT0gKGRvdWJsZSlmaGk7Ci0JCWYgKj0gMTY3NzcyMTYuMDsgLyogMioqMjQgKi8KLQkJZmxvID0gKHVuc2lnbmVkIGludCkoZiArIDAuNSk7IC8qIFJvdW5kICovCi0JCWFzc2VydChmbG8gPD0gMTY3NzcyMTYpOwotCQlpZiAoZmxvID4+IDI0KSB7Ci0JCQkvKiBUaGUgY2FycnkgcHJvcGFnYXRlZCBvdXQgb2YgYSBzdHJpbmcgb2YgMjQgMSBiaXRzLiAqLwotCQkJZmxvID0gMDsKLQkJCSsrZmhpOwotCQkJaWYgKGZoaSA+PiAyOCkgewotCQkJCS8qIEFuZCBpdCBhbHNvIHByb2dhZ2F0ZWQgb3V0IG9mIHRoZSBuZXh0IDI4IGJpdHMuICovCi0JCQkJZmhpID0gMDsKLQkJCQkrK2U7Ci0JCQkJaWYgKGUgPj0gMjA0NykKLQkJCQkJZ290byBPdmVyZmxvdzsKLQkJCX0KLQkJfQorICAgICAgICBmIC09IChkb3VibGUpZmhpOworICAgICAgICBmICo9IDE2Nzc3MjE2LjA7IC8qIDIqKjI0ICovCisgICAgICAgIGZsbyA9ICh1bnNpZ25lZCBpbnQpKGYgKyAwLjUpOyAvKiBSb3VuZCAqLworICAgICAgICBhc3NlcnQoZmxvIDw9IDE2Nzc3MjE2KTsKKyAgICAgICAgaWYgKGZsbyA+PiAyNCkgeworICAgICAgICAgICAgLyogVGhlIGNhcnJ5IHByb3BhZ2F0ZWQgb3V0IG9mIGEgc3RyaW5nIG9mIDI0IDEgYml0cy4gKi8KKyAgICAgICAgICAgIGZsbyA9IDA7CisgICAgICAgICAgICArK2ZoaTsKKyAgICAgICAgICAgIGlmIChmaGkgPj4gMjgpIHsKKyAgICAgICAgICAgICAgICAvKiBBbmQgaXQgYWxzbyBwcm9nYWdhdGVkIG91dCBvZiB0aGUgbmV4dCAyOCBiaXRzLiAqLworICAgICAgICAgICAgICAgIGZoaSA9IDA7CisgICAgICAgICAgICAgICAgKytlOworICAgICAgICAgICAgICAgIGlmIChlID49IDIwNDcpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBGaXJzdCBieXRlICovCi0JCSpwID0gKHNpZ24gPDwgNykgfCAoZSA+PiA0KTsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBGaXJzdCBieXRlICovCisgICAgICAgICpwID0gKHNpZ24gPDwgNykgfCAoZSA+PiA0KTsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIFNlY29uZCBieXRlICovCi0JCSpwID0gKHVuc2lnbmVkIGNoYXIpICgoKGUgJiAweEYpIDw8IDQpIHwgKGZoaSA+PiAyNCkpOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFNlY29uZCBieXRlICovCisgICAgICAgICpwID0gKHVuc2lnbmVkIGNoYXIpICgoKGUgJiAweEYpIDw8IDQpIHwgKGZoaSA+PiAyNCkpOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogVGhpcmQgYnl0ZSAqLwotCQkqcCA9IChmaGkgPj4gMTYpICYgMHhGRjsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBUaGlyZCBieXRlICovCisgICAgICAgICpwID0gKGZoaSA+PiAxNikgJiAweEZGOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogRm91cnRoIGJ5dGUgKi8KLQkJKnAgPSAoZmhpID4+IDgpICYgMHhGRjsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBGb3VydGggYnl0ZSAqLworICAgICAgICAqcCA9IChmaGkgPj4gOCkgJiAweEZGOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogRmlmdGggYnl0ZSAqLwotCQkqcCA9IGZoaSAmIDB4RkY7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogRmlmdGggYnl0ZSAqLworICAgICAgICAqcCA9IGZoaSAmIDB4RkY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBTaXh0aCBieXRlICovCi0JCSpwID0gKGZsbyA+PiAxNikgJiAweEZGOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIFNpeHRoIGJ5dGUgKi8KKyAgICAgICAgKnAgPSAoZmxvID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBTZXZlbnRoIGJ5dGUgKi8KLQkJKnAgPSAoZmxvID4+IDgpICYgMHhGRjsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBTZXZlbnRoIGJ5dGUgKi8KKyAgICAgICAgKnAgPSAoZmxvID4+IDgpICYgMHhGRjsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIEVpZ2h0aCBieXRlICovCi0JCSpwID0gZmxvICYgMHhGRjsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBFaWdodGggYnl0ZSAqLworICAgICAgICAqcCA9IGZsbyAmIDB4RkY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBEb25lICovCi0JCXJldHVybiAwOworICAgICAgICAvKiBEb25lICovCisgICAgICAgIHJldHVybiAwOwogCi0JICBPdmVyZmxvdzoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImZsb2F0IHRvbyBsYXJnZSB0byBwYWNrIHdpdGggZCBmb3JtYXQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQllbHNlIHsKLQkJY29uc3QgY2hhciAqcyA9IChjaGFyKikmeDsKLQkJaW50IGksIGluY3IgPSAxOworICAgICAgT3ZlcmZsb3c6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IHRvbyBsYXJnZSB0byBwYWNrIHdpdGggZCBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY29uc3QgY2hhciAqcyA9IChjaGFyKikmeDsKKyAgICAgICAgaW50IGksIGluY3IgPSAxOwogCi0JCWlmICgoZG91YmxlX2Zvcm1hdCA9PSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0ICYmICFsZSkKLQkJICAgIHx8IChkb3VibGVfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7Ci0JCQlwICs9IDc7Ci0JCQlpbmNyID0gLTE7Ci0JCX0KLQkJCi0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCSpwID0gKnMrKzsKLQkJCXAgKz0gaW5jcjsKLQkJfQotCQlyZXR1cm4gMDsKLQl9CisgICAgICAgIGlmICgoZG91YmxlX2Zvcm1hdCA9PSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0ICYmICFsZSkKKyAgICAgICAgICAgIHx8IChkb3VibGVfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7CisgICAgICAgICAgICBwICs9IDc7CisgICAgICAgICAgICBpbmNyID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICAqcCA9ICpzKys7CisgICAgICAgICAgICBwICs9IGluY3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiBkb3VibGUKIF9QeUZsb2F0X1VucGFjazQoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKQogewotCWlmIChmbG9hdF9mb3JtYXQgPT0gdW5rbm93bl9mb3JtYXQpIHsKLQkJdW5zaWduZWQgY2hhciBzaWduOwotCQlpbnQgZTsKLQkJdW5zaWduZWQgaW50IGY7Ci0JCWRvdWJsZSB4OwotCQlpbnQgaW5jciA9IDE7CisgICAgaWYgKGZsb2F0X2Zvcm1hdCA9PSB1bmtub3duX2Zvcm1hdCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHNpZ247CisgICAgICAgIGludCBlOworICAgICAgICB1bnNpZ25lZCBpbnQgZjsKKyAgICAgICAgZG91YmxlIHg7CisgICAgICAgIGludCBpbmNyID0gMTsKIAotCQlpZiAobGUpIHsKLQkJCXAgKz0gMzsKLQkJCWluY3IgPSAtMTsKLQkJfQorICAgICAgICBpZiAobGUpIHsKKyAgICAgICAgICAgIHAgKz0gMzsKKyAgICAgICAgICAgIGluY3IgPSAtMTsKKyAgICAgICAgfQogCi0JCS8qIEZpcnN0IGJ5dGUgKi8KLQkJc2lnbiA9ICgqcCA+PiA3KSAmIDE7Ci0JCWUgPSAoKnAgJiAweDdGKSA8PCAxOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIEZpcnN0IGJ5dGUgKi8KKyAgICAgICAgc2lnbiA9ICgqcCA+PiA3KSAmIDE7CisgICAgICAgIGUgPSAoKnAgJiAweDdGKSA8PCAxOworICAgICAgICBwICs9IGluY3I7CiAKLQkJLyogU2Vjb25kIGJ5dGUgKi8KLQkJZSB8PSAoKnAgPj4gNykgJiAxOwotCQlmID0gKCpwICYgMHg3RikgPDwgMTY7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogU2Vjb25kIGJ5dGUgKi8KKyAgICAgICAgZSB8PSAoKnAgPj4gNykgJiAxOworICAgICAgICBmID0gKCpwICYgMHg3RikgPDwgMTY7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQlpZiAoZSA9PSAyNTUpIHsKLQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQlQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjYW4ndCB1bnBhY2sgSUVFRSA3NTQgc3BlY2lhbCB2YWx1ZSAiCi0JCQkJIm9uIG5vbi1JRUVFIHBsYXRmb3JtIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgaWYgKGUgPT0gMjU1KSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgdW5wYWNrIElFRUUgNzU0IHNwZWNpYWwgdmFsdWUgIgorICAgICAgICAgICAgICAgICJvbiBub24tSUVFRSBwbGF0Zm9ybSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJLyogVGhpcmQgYnl0ZSAqLwotCQlmIHw9ICpwIDw8IDg7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogVGhpcmQgYnl0ZSAqLworICAgICAgICBmIHw9ICpwIDw8IDg7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBGb3VydGggYnl0ZSAqLwotCQlmIHw9ICpwOworICAgICAgICAvKiBGb3VydGggYnl0ZSAqLworICAgICAgICBmIHw9ICpwOwogCi0JCXggPSAoZG91YmxlKWYgLyA4Mzg4NjA4LjA7CisgICAgICAgIHggPSAoZG91YmxlKWYgLyA4Mzg4NjA4LjA7CiAKLQkJLyogWFhYIFRoaXMgc2FkbHkgaWdub3JlcyBJbmYvTmFOIGlzc3VlcyAqLwotCQlpZiAoZSA9PSAwKQotCQkJZSA9IC0xMjY7Ci0JCWVsc2UgewotCQkJeCArPSAxLjA7Ci0JCQllIC09IDEyNzsKLQkJfQotCQl4ID0gbGRleHAoeCwgZSk7CisgICAgICAgIC8qIFhYWCBUaGlzIHNhZGx5IGlnbm9yZXMgSW5mL05hTiBpc3N1ZXMgKi8KKyAgICAgICAgaWYgKGUgPT0gMCkKKyAgICAgICAgICAgIGUgPSAtMTI2OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHggKz0gMS4wOworICAgICAgICAgICAgZSAtPSAxMjc7CisgICAgICAgIH0KKyAgICAgICAgeCA9IGxkZXhwKHgsIGUpOwogCi0JCWlmIChzaWduKQotCQkJeCA9IC14OworICAgICAgICBpZiAoc2lnbikKKyAgICAgICAgICAgIHggPSAteDsKIAotCQlyZXR1cm4geDsKLQl9Ci0JZWxzZSB7Ci0JCWZsb2F0IHg7CisgICAgICAgIHJldHVybiB4OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZmxvYXQgeDsKIAotCQlpZiAoKGZsb2F0X2Zvcm1hdCA9PSBpZWVlX2xpdHRsZV9lbmRpYW5fZm9ybWF0ICYmICFsZSkKLQkJICAgIHx8IChmbG9hdF9mb3JtYXQgPT0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdCAmJiBsZSkpIHsKLQkJCWNoYXIgYnVmWzRdOwotCQkJY2hhciAqZCA9ICZidWZbM107Ci0JCQlpbnQgaTsKKyAgICAgICAgaWYgKChmbG9hdF9mb3JtYXQgPT0gaWVlZV9saXR0bGVfZW5kaWFuX2Zvcm1hdCAmJiAhbGUpCisgICAgICAgICAgICB8fCAoZmxvYXRfZm9ybWF0ID09IGllZWVfYmlnX2VuZGlhbl9mb3JtYXQgJiYgbGUpKSB7CisgICAgICAgICAgICBjaGFyIGJ1Zls0XTsKKyAgICAgICAgICAgIGNoYXIgKmQgPSAmYnVmWzNdOworICAgICAgICAgICAgaW50IGk7CiAKLQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCQkqZC0tID0gKnArKzsKLQkJCX0KLQkJCW1lbWNweSgmeCwgYnVmLCA0KTsKLQkJfQotCQllbHNlIHsKLQkJCW1lbWNweSgmeCwgcCwgNCk7Ci0JCX0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAqZC0tID0gKnArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweSgmeCwgYnVmLCA0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweSgmeCwgcCwgNCk7CisgICAgICAgIH0KIAotCQlyZXR1cm4geDsKLQl9CQkKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQogfQogCiBkb3VibGUKIF9QeUZsb2F0X1VucGFjazgoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKQogewotCWlmIChkb3VibGVfZm9ybWF0ID09IHVua25vd25fZm9ybWF0KSB7Ci0JCXVuc2lnbmVkIGNoYXIgc2lnbjsKLQkJaW50IGU7Ci0JCXVuc2lnbmVkIGludCBmaGksIGZsbzsKLQkJZG91YmxlIHg7Ci0JCWludCBpbmNyID0gMTsKKyAgICBpZiAoZG91YmxlX2Zvcm1hdCA9PSB1bmtub3duX2Zvcm1hdCkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHNpZ247CisgICAgICAgIGludCBlOworICAgICAgICB1bnNpZ25lZCBpbnQgZmhpLCBmbG87CisgICAgICAgIGRvdWJsZSB4OworICAgICAgICBpbnQgaW5jciA9IDE7CiAKLQkJaWYgKGxlKSB7Ci0JCQlwICs9IDc7Ci0JCQlpbmNyID0gLTE7Ci0JCX0KKyAgICAgICAgaWYgKGxlKSB7CisgICAgICAgICAgICBwICs9IDc7CisgICAgICAgICAgICBpbmNyID0gLTE7CisgICAgICAgIH0KIAotCQkvKiBGaXJzdCBieXRlICovCi0JCXNpZ24gPSAoKnAgPj4gNykgJiAxOwotCQllID0gKCpwICYgMHg3RikgPDwgNDsKLQkJCi0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogRmlyc3QgYnl0ZSAqLworICAgICAgICBzaWduID0gKCpwID4+IDcpICYgMTsKKyAgICAgICAgZSA9ICgqcCAmIDB4N0YpIDw8IDQ7CiAKLQkJLyogU2Vjb25kIGJ5dGUgKi8KLQkJZSB8PSAoKnAgPj4gNCkgJiAweEY7Ci0JCWZoaSA9ICgqcCAmIDB4RikgPDwgMjQ7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCWlmIChlID09IDIwNDcpIHsKLQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQlQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjYW4ndCB1bnBhY2sgSUVFRSA3NTQgc3BlY2lhbCB2YWx1ZSAiCi0JCQkJIm9uIG5vbi1JRUVFIHBsYXRmb3JtIik7Ci0JCQlyZXR1cm4gLTEuMDsKLQkJfQorICAgICAgICAvKiBTZWNvbmQgYnl0ZSAqLworICAgICAgICBlIHw9ICgqcCA+PiA0KSAmIDB4RjsKKyAgICAgICAgZmhpID0gKCpwICYgMHhGKSA8PCAyNDsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIFRoaXJkIGJ5dGUgKi8KLQkJZmhpIHw9ICpwIDw8IDE2OwotCQlwICs9IGluY3I7CisgICAgICAgIGlmIChlID09IDIwNDcpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICJjYW4ndCB1bnBhY2sgSUVFRSA3NTQgc3BlY2lhbCB2YWx1ZSAiCisgICAgICAgICAgICAgICAgIm9uIG5vbi1JRUVFIHBsYXRmb3JtIik7CisgICAgICAgICAgICByZXR1cm4gLTEuMDsKKyAgICAgICAgfQogCi0JCS8qIEZvdXJ0aCBieXRlICovCi0JCWZoaSB8PSAqcCAgPDwgODsKLQkJcCArPSBpbmNyOworICAgICAgICAvKiBUaGlyZCBieXRlICovCisgICAgICAgIGZoaSB8PSAqcCA8PCAxNjsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIEZpZnRoIGJ5dGUgKi8KLQkJZmhpIHw9ICpwOwotCQlwICs9IGluY3I7CisgICAgICAgIC8qIEZvdXJ0aCBieXRlICovCisgICAgICAgIGZoaSB8PSAqcCAgPDwgODsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIFNpeHRoIGJ5dGUgKi8KLQkJZmxvID0gKnAgPDwgMTY7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogRmlmdGggYnl0ZSAqLworICAgICAgICBmaGkgfD0gKnA7CisgICAgICAgIHAgKz0gaW5jcjsKIAotCQkvKiBTZXZlbnRoIGJ5dGUgKi8KLQkJZmxvIHw9ICpwIDw8IDg7Ci0JCXAgKz0gaW5jcjsKKyAgICAgICAgLyogU2l4dGggYnl0ZSAqLworICAgICAgICBmbG8gPSAqcCA8PCAxNjsKKyAgICAgICAgcCArPSBpbmNyOwogCi0JCS8qIEVpZ2h0aCBieXRlICovCi0JCWZsbyB8PSAqcDsKKyAgICAgICAgLyogU2V2ZW50aCBieXRlICovCisgICAgICAgIGZsbyB8PSAqcCA8PCA4OworICAgICAgICBwICs9IGluY3I7CiAKLQkJeCA9IChkb3VibGUpZmhpICsgKGRvdWJsZSlmbG8gLyAxNjc3NzIxNi4wOyAvKiAyKioyNCAqLwotCQl4IC89IDI2ODQzNTQ1Ni4wOyAvKiAyKioyOCAqLworICAgICAgICAvKiBFaWdodGggYnl0ZSAqLworICAgICAgICBmbG8gfD0gKnA7CiAKLQkJaWYgKGUgPT0gMCkKLQkJCWUgPSAtMTAyMjsKLQkJZWxzZSB7Ci0JCQl4ICs9IDEuMDsKLQkJCWUgLT0gMTAyMzsKLQkJfQotCQl4ID0gbGRleHAoeCwgZSk7CisgICAgICAgIHggPSAoZG91YmxlKWZoaSArIChkb3VibGUpZmxvIC8gMTY3NzcyMTYuMDsgLyogMioqMjQgKi8KKyAgICAgICAgeCAvPSAyNjg0MzU0NTYuMDsgLyogMioqMjggKi8KIAotCQlpZiAoc2lnbikKLQkJCXggPSAteDsKKyAgICAgICAgaWYgKGUgPT0gMCkKKyAgICAgICAgICAgIGUgPSAtMTAyMjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB4ICs9IDEuMDsKKyAgICAgICAgICAgIGUgLT0gMTAyMzsKKyAgICAgICAgfQorICAgICAgICB4ID0gbGRleHAoeCwgZSk7CiAKLQkJcmV0dXJuIHg7Ci0JfQotCWVsc2UgewotCQlkb3VibGUgeDsKKyAgICAgICAgaWYgKHNpZ24pCisgICAgICAgICAgICB4ID0gLXg7CiAKLQkJaWYgKChkb3VibGVfZm9ybWF0ID09IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQgJiYgIWxlKQotCQkgICAgfHwgKGRvdWJsZV9mb3JtYXQgPT0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdCAmJiBsZSkpIHsKLQkJCWNoYXIgYnVmWzhdOwotCQkJY2hhciAqZCA9ICZidWZbN107Ci0JCQlpbnQgaTsKLQkJCQotCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkJCSpkLS0gPSAqcCsrOwotCQkJfQotCQkJbWVtY3B5KCZ4LCBidWYsIDgpOwotCQl9Ci0JCWVsc2UgewotCQkJbWVtY3B5KCZ4LCBwLCA4KTsKLQkJfQorICAgICAgICByZXR1cm4geDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRvdWJsZSB4OwogCi0JCXJldHVybiB4OwotCX0KKyAgICAgICAgaWYgKChkb3VibGVfZm9ybWF0ID09IGllZWVfbGl0dGxlX2VuZGlhbl9mb3JtYXQgJiYgIWxlKQorICAgICAgICAgICAgfHwgKGRvdWJsZV9mb3JtYXQgPT0gaWVlZV9iaWdfZW5kaWFuX2Zvcm1hdCAmJiBsZSkpIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzhdOworICAgICAgICAgICAgY2hhciAqZCA9ICZidWZbN107CisgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgICAgICpkLS0gPSAqcCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KCZ4LCBidWYsIDgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KCZ4LCBwLCA4KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB4OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvZnJhbWVvYmplY3QuYyBiL09iamVjdHMvZnJhbWVvYmplY3QuYwppbmRleCBmYTdhNmZkLi4xMTIxMTBjIDEwMDY0NAotLS0gYS9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mcmFtZW9iamVjdC5jCkBAIC0xNSw0MCArMTUsNDAgQEAKICNkZWZpbmUgT0ZGKHgpIG9mZnNldG9mKFB5RnJhbWVPYmplY3QsIHgpCiAKIHN0YXRpYyBQeU1lbWJlckRlZiBmcmFtZV9tZW1iZXJsaXN0W10gPSB7Ci0JeyJmX2JhY2siLAlUX09CSkVDVCwJT0ZGKGZfYmFjayksCVJPfSwKLQl7ImZfY29kZSIsCVRfT0JKRUNULAlPRkYoZl9jb2RlKSwJUk99LAotCXsiZl9idWlsdGlucyIsCVRfT0JKRUNULAlPRkYoZl9idWlsdGlucyksUk99LAotCXsiZl9nbG9iYWxzIiwJVF9PQkpFQ1QsCU9GRihmX2dsb2JhbHMpLAlST30sCi0JeyJmX2xhc3RpIiwJVF9JTlQsCQlPRkYoZl9sYXN0aSksCVJPfSwKLQl7ImZfZXhjX3R5cGUiLAlUX09CSkVDVCwJT0ZGKGZfZXhjX3R5cGUpfSwKLQl7ImZfZXhjX3ZhbHVlIiwJVF9PQkpFQ1QsCU9GRihmX2V4Y192YWx1ZSl9LAotCXsiZl9leGNfdHJhY2ViYWNrIiwgVF9PQkpFQ1QsCU9GRihmX2V4Y190cmFjZWJhY2spfSwKLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7ImZfYmFjayIsICAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoZl9iYWNrKSwgICAgUk99LAorICAgIHsiZl9jb2RlIiwgICAgICAgICAgVF9PQkpFQ1QsICAgICAgIE9GRihmX2NvZGUpLCAgICBST30sCisgICAgeyJmX2J1aWx0aW5zIiwgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfYnVpbHRpbnMpLFJPfSwKKyAgICB7ImZfZ2xvYmFscyIsICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYoZl9nbG9iYWxzKSwgUk99LAorICAgIHsiZl9sYXN0aSIsICAgICAgICAgVF9JTlQsICAgICAgICAgIE9GRihmX2xhc3RpKSwgICBST30sCisgICAgeyJmX2V4Y190eXBlIiwgICAgICBUX09CSkVDVCwgICAgICAgT0ZGKGZfZXhjX3R5cGUpfSwKKyAgICB7ImZfZXhjX3ZhbHVlIiwgICAgIFRfT0JKRUNULCAgICAgICBPRkYoZl9leGNfdmFsdWUpfSwKKyAgICB7ImZfZXhjX3RyYWNlYmFjayIsIFRfT0JKRUNULCAgICAgICBPRkYoZl9leGNfdHJhY2ViYWNrKX0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmcmFtZV9nZXRsb2NhbHMoUHlGcmFtZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeUZyYW1lX0Zhc3RUb0xvY2FscyhmKTsKLQlQeV9JTkNSRUYoZi0+Zl9sb2NhbHMpOwotCXJldHVybiBmLT5mX2xvY2FsczsKKyAgICBQeUZyYW1lX0Zhc3RUb0xvY2FscyhmKTsKKyAgICBQeV9JTkNSRUYoZi0+Zl9sb2NhbHMpOworICAgIHJldHVybiBmLT5mX2xvY2FsczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZyYW1lX2dldGxpbmVubyhQeUZyYW1lT2JqZWN0ICpmLCB2b2lkICpjbG9zdXJlKQogewotCWludCBsaW5lbm87CisgICAgaW50IGxpbmVubzsKIAotCWlmIChmLT5mX3RyYWNlKQotCQlsaW5lbm8gPSBmLT5mX2xpbmVubzsKLQllbHNlCi0JCWxpbmVubyA9IFB5Q29kZV9BZGRyMkxpbmUoZi0+Zl9jb2RlLCBmLT5mX2xhc3RpKTsKKyAgICBpZiAoZi0+Zl90cmFjZSkKKyAgICAgICAgbGluZW5vID0gZi0+Zl9saW5lbm87CisgICAgZWxzZQorICAgICAgICBsaW5lbm8gPSBQeUNvZGVfQWRkcjJMaW5lKGYtPmZfY29kZSwgZi0+Zl9sYXN0aSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobGluZW5vKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcobGluZW5vKTsKIH0KIAogLyogU2V0dGVyIGZvciBmX2xpbmVubyAtIHlvdSBjYW4gc2V0IGZfbGluZW5vIGZyb20gd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24gaW4KLSAqIG9yZGVyIHRvIGp1bXAgdG8gYSBnaXZlbiBsaW5lIG9mIGNvZGUsIHN1YmplY3QgdG8gc29tZSByZXN0cmljdGlvbnMuCSBNb3N0CisgKiBvcmRlciB0byBqdW1wIHRvIGEgZ2l2ZW4gbGluZSBvZiBjb2RlLCBzdWJqZWN0IHRvIHNvbWUgcmVzdHJpY3Rpb25zLiAgTW9zdAogICogbGluZXMgYXJlIE9LIHRvIGp1bXAgdG8gYmVjYXVzZSB0aGV5IGRvbid0IG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZQogICogc3RhdGUgb2YgdGhlIHN0YWNrIChvYnZpb3VzIGJlY2F1c2UgeW91IGNvdWxkIHJlbW92ZSB0aGUgbGluZSBhbmQgdGhlIGNvZGUKICAqIHdvdWxkIHN0aWxsIHdvcmsgd2l0aG91dCBhbnkgc3RhY2sgZXJyb3JzKSwgYnV0IHRoZXJlIGFyZSBzb21lIGNvbnN0cnVjdHMKQEAgLTY1LDI5NyArNjUsMjk3IEBACiBzdGF0aWMgaW50CiBmcmFtZV9zZXRsaW5lbm8oUHlGcmFtZU9iamVjdCAqZiwgUHlPYmplY3QqIHBfbmV3X2xpbmVubykKIHsKLQlpbnQgbmV3X2xpbmVubyA9IDA7CQkvKiBUaGUgbmV3IHZhbHVlIG9mIGZfbGluZW5vICovCi0JaW50IG5ld19sYXN0aSA9IDA7CQkvKiBUaGUgbmV3IHZhbHVlIG9mIGZfbGFzdGkgKi8KLQlpbnQgbmV3X2libG9jayA9IDA7CQkvKiBUaGUgbmV3IHZhbHVlIG9mIGZfaWJsb2NrICovCi0JdW5zaWduZWQgY2hhciAqY29kZSA9IE5VTEw7CS8qIFRoZSBieXRlY29kZSBmb3IgdGhlIGZyYW1lLi4uICovCi0JUHlfc3NpemVfdCBjb2RlX2xlbiA9IDA7CS8qIC4uLmFuZCBpdHMgbGVuZ3RoICovCi0JdW5zaWduZWQgY2hhciAqbG5vdGFiID0gTlVMTDsJLyogSXRlcmF0aW5nIG92ZXIgY29fbG5vdGFiICovCi0JUHlfc3NpemVfdCBsbm90YWJfbGVuID0gMDsJLyogKGRpdHRvKSAqLwotCWludCBvZmZzZXQgPSAwOwkJCS8qIChkaXR0bykgKi8KLQlpbnQgbGluZSA9IDA7CQkJLyogKGRpdHRvKSAqLwotCWludCBhZGRyID0gMDsJCQkvKiAoZGl0dG8pICovCi0JaW50IG1pbl9hZGRyID0gMDsJCS8qIFNjYW5uaW5nIHRoZSBTRVRVUHMgYW5kIFBPUHMgKi8KLQlpbnQgbWF4X2FkZHIgPSAwOwkJLyogKGRpdHRvKSAqLwotCWludCBkZWx0YV9pYmxvY2sgPSAwOwkJLyogKGRpdHRvKSAqLwotCWludCBtaW5fZGVsdGFfaWJsb2NrID0gMDsJLyogKGRpdHRvKSAqLwotCWludCBtaW5faWJsb2NrID0gMDsJCS8qIChkaXR0bykgKi8KLQlpbnQgZl9sYXN0aV9zZXR1cF9hZGRyID0gMDsJLyogUG9saWNpbmcgbm8tanVtcC1pbnRvLWZpbmFsbHkgKi8KLQlpbnQgbmV3X2xhc3RpX3NldHVwX2FkZHIgPSAwOwkvKiAoZGl0dG8pICovCi0JaW50IGJsb2Nrc3RhY2tbQ09fTUFYQkxPQ0tTXTsJLyogV2Fsa2luZyB0aGUgJ2ZpbmFsbHknIGJsb2NrcyAqLwotCWludCBpbl9maW5hbGx5W0NPX01BWEJMT0NLU107CS8qIChkaXR0bykgKi8KLQlpbnQgYmxvY2tzdGFja190b3AgPSAwOwkJLyogKGRpdHRvKSAqLwotCXVuc2lnbmVkIGNoYXIgc2V0dXBfb3AgPSAwOwkvKiAoZGl0dG8pICovCi0JY2hhciAqdG1wOworICAgIGludCBuZXdfbGluZW5vID0gMDsgICAgICAgICAgICAgICAgIC8qIFRoZSBuZXcgdmFsdWUgb2YgZl9saW5lbm8gKi8KKyAgICBpbnQgbmV3X2xhc3RpID0gMDsgICAgICAgICAgICAgICAgICAvKiBUaGUgbmV3IHZhbHVlIG9mIGZfbGFzdGkgKi8KKyAgICBpbnQgbmV3X2libG9jayA9IDA7ICAgICAgICAgICAgICAgICAvKiBUaGUgbmV3IHZhbHVlIG9mIGZfaWJsb2NrICovCisgICAgdW5zaWduZWQgY2hhciAqY29kZSA9IE5VTEw7ICAgICAgICAgLyogVGhlIGJ5dGVjb2RlIGZvciB0aGUgZnJhbWUuLi4gKi8KKyAgICBQeV9zc2l6ZV90IGNvZGVfbGVuID0gMDsgICAgICAgICAgICAvKiAuLi5hbmQgaXRzIGxlbmd0aCAqLworICAgIHVuc2lnbmVkIGNoYXIgKmxub3RhYiA9IE5VTEw7ICAgICAgIC8qIEl0ZXJhdGluZyBvdmVyIGNvX2xub3RhYiAqLworICAgIFB5X3NzaXplX3QgbG5vdGFiX2xlbiA9IDA7ICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgb2Zmc2V0ID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiAoZGl0dG8pICovCisgICAgaW50IGxpbmUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogKGRpdHRvKSAqLworICAgIGludCBhZGRyID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgbWluX2FkZHIgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBTY2FubmluZyB0aGUgU0VUVVBzIGFuZCBQT1BzICovCisgICAgaW50IG1heF9hZGRyID0gMDsgICAgICAgICAgICAgICAgICAgLyogKGRpdHRvKSAqLworICAgIGludCBkZWx0YV9pYmxvY2sgPSAwOyAgICAgICAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBpbnQgbWluX2RlbHRhX2libG9jayA9IDA7ICAgICAgICAgICAvKiAoZGl0dG8pICovCisgICAgaW50IG1pbl9pYmxvY2sgPSAwOyAgICAgICAgICAgICAgICAgLyogKGRpdHRvKSAqLworICAgIGludCBmX2xhc3RpX3NldHVwX2FkZHIgPSAwOyAgICAgICAgIC8qIFBvbGljaW5nIG5vLWp1bXAtaW50by1maW5hbGx5ICovCisgICAgaW50IG5ld19sYXN0aV9zZXR1cF9hZGRyID0gMDsgICAgICAgLyogKGRpdHRvKSAqLworICAgIGludCBibG9ja3N0YWNrW0NPX01BWEJMT0NLU107ICAgICAgIC8qIFdhbGtpbmcgdGhlICdmaW5hbGx5JyBibG9ja3MgKi8KKyAgICBpbnQgaW5fZmluYWxseVtDT19NQVhCTE9DS1NdOyAgICAgICAvKiAoZGl0dG8pICovCisgICAgaW50IGJsb2Nrc3RhY2tfdG9wID0gMDsgICAgICAgICAgICAgLyogKGRpdHRvKSAqLworICAgIHVuc2lnbmVkIGNoYXIgc2V0dXBfb3AgPSAwOyAgICAgICAgIC8qIChkaXR0bykgKi8KKyAgICBjaGFyICp0bXA7CiAKLQkvKiBmX2xpbmVubyBtdXN0IGJlIGFuIGludGVnZXIuICovCi0JaWYgKCFQeUludF9DaGVjayhwX25ld19saW5lbm8pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJsaW5lbm8gbXVzdCBiZSBhbiBpbnRlZ2VyIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogZl9saW5lbm8gbXVzdCBiZSBhbiBpbnRlZ2VyLiAqLworICAgIGlmICghUHlJbnRfQ2hlY2socF9uZXdfbGluZW5vKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lbm8gbXVzdCBiZSBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBZb3UgY2FuIG9ubHkgZG8gdGhpcyBmcm9tIHdpdGhpbiBhIHRyYWNlIGZ1bmN0aW9uLCBub3QgdmlhCi0JICogX2dldGZyYW1lIG9yIHNpbWlsYXIgaGFja2VyeS4gKi8KLQlpZiAoIWYtPmZfdHJhY2UpCi0JewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImZfbGluZW5vIGNhbiBvbmx5IGJlIHNldCBieSBhIHRyYWNlIGZ1bmN0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogWW91IGNhbiBvbmx5IGRvIHRoaXMgZnJvbSB3aXRoaW4gYSB0cmFjZSBmdW5jdGlvbiwgbm90IHZpYQorICAgICAqIF9nZXRmcmFtZSBvciBzaW1pbGFyIGhhY2tlcnkuICovCisgICAgaWYgKCFmLT5mX3RyYWNlKQorICAgIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZl9saW5lbm8gY2FuIG9ubHkgYmUgc2V0IGJ5IGEgdHJhY2UgZnVuY3Rpb24iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIEZhaWwgaWYgdGhlIGxpbmUgY29tZXMgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgY29kZSBibG9jay4gKi8KLQluZXdfbGluZW5vID0gKGludCkgUHlJbnRfQXNMb25nKHBfbmV3X2xpbmVubyk7Ci0JaWYgKG5ld19saW5lbm8gPCBmLT5mX2NvZGUtPmNvX2ZpcnN0bGluZW5vKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAibGluZSAlZCBjb21lcyBiZWZvcmUgdGhlIGN1cnJlbnQgY29kZSBibG9jayIsCi0JCQkgICAgIG5ld19saW5lbm8pOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIEZhaWwgaWYgdGhlIGxpbmUgY29tZXMgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgY29kZSBibG9jay4gKi8KKyAgICBuZXdfbGluZW5vID0gKGludCkgUHlJbnRfQXNMb25nKHBfbmV3X2xpbmVubyk7CisgICAgaWYgKG5ld19saW5lbm8gPCBmLT5mX2NvZGUtPmNvX2ZpcnN0bGluZW5vKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImxpbmUgJWQgY29tZXMgYmVmb3JlIHRoZSBjdXJyZW50IGNvZGUgYmxvY2siLAorICAgICAgICAgICAgICAgICAgICAgbmV3X2xpbmVubyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBGaW5kIHRoZSBieXRlY29kZSBvZmZzZXQgZm9yIHRoZSBzdGFydCBvZiB0aGUgZ2l2ZW4gbGluZSwgb3IgdGhlCi0JICogZmlyc3QgY29kZS1vd25pbmcgbGluZSBhZnRlciBpdC4gKi8KLQlQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoZi0+Zl9jb2RlLT5jb19sbm90YWIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXAsICZsbm90YWJfbGVuKTsKLQlsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKSB0bXA7Ci0JYWRkciA9IDA7Ci0JbGluZSA9IGYtPmZfY29kZS0+Y29fZmlyc3RsaW5lbm87Ci0JbmV3X2xhc3RpID0gLTE7Ci0JZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBsbm90YWJfbGVuOyBvZmZzZXQgKz0gMikgewotCQlhZGRyICs9IGxub3RhYltvZmZzZXRdOwotCQlsaW5lICs9IGxub3RhYltvZmZzZXQrMV07Ci0JCWlmIChsaW5lID49IG5ld19saW5lbm8pIHsKLQkJCW5ld19sYXN0aSA9IGFkZHI7Ci0JCQluZXdfbGluZW5vID0gbGluZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgIC8qIEZpbmQgdGhlIGJ5dGVjb2RlIG9mZnNldCBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBnaXZlbiBsaW5lLCBvciB0aGUKKyAgICAgKiBmaXJzdCBjb2RlLW93bmluZyBsaW5lIGFmdGVyIGl0LiAqLworICAgIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShmLT5mX2NvZGUtPmNvX2xub3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcCwgJmxub3RhYl9sZW4pOworICAgIGxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopIHRtcDsKKyAgICBhZGRyID0gMDsKKyAgICBsaW5lID0gZi0+Zl9jb2RlLT5jb19maXJzdGxpbmVubzsKKyAgICBuZXdfbGFzdGkgPSAtMTsKKyAgICBmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGxub3RhYl9sZW47IG9mZnNldCArPSAyKSB7CisgICAgICAgIGFkZHIgKz0gbG5vdGFiW29mZnNldF07CisgICAgICAgIGxpbmUgKz0gbG5vdGFiW29mZnNldCsxXTsKKyAgICAgICAgaWYgKGxpbmUgPj0gbmV3X2xpbmVubykgeworICAgICAgICAgICAgbmV3X2xhc3RpID0gYWRkcjsKKyAgICAgICAgICAgIG5ld19saW5lbm8gPSBsaW5lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBJZiB3ZSBkaWRuJ3QgcmVhY2ggdGhlIHJlcXVlc3RlZCBsaW5lLCByZXR1cm4gYW4gZXJyb3IuICovCi0JaWYgKG5ld19sYXN0aSA9PSAtMSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgImxpbmUgJWQgY29tZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgY29kZSBibG9jayIsCi0JCQkgICAgIG5ld19saW5lbm8pOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIElmIHdlIGRpZG4ndCByZWFjaCB0aGUgcmVxdWVzdGVkIGxpbmUsIHJldHVybiBhbiBlcnJvci4gKi8KKyAgICBpZiAobmV3X2xhc3RpID09IC0xKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImxpbmUgJWQgY29tZXMgYWZ0ZXIgdGhlIGN1cnJlbnQgY29kZSBibG9jayIsCisgICAgICAgICAgICAgICAgICAgICBuZXdfbGluZW5vKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIFdlJ3JlIG5vdyByZWFkeSB0byBsb29rIGF0IHRoZSBieXRlY29kZS4gKi8KLQlQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoZi0+Zl9jb2RlLT5jb19jb2RlLCAoY2hhciAqKikmY29kZSwgJmNvZGVfbGVuKTsKLQltaW5fYWRkciA9IE1JTihuZXdfbGFzdGksIGYtPmZfbGFzdGkpOwotCW1heF9hZGRyID0gTUFYKG5ld19sYXN0aSwgZi0+Zl9sYXN0aSk7CisgICAgLyogV2UncmUgbm93IHJlYWR5IHRvIGxvb2sgYXQgdGhlIGJ5dGVjb2RlLiAqLworICAgIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShmLT5mX2NvZGUtPmNvX2NvZGUsIChjaGFyICoqKSZjb2RlLCAmY29kZV9sZW4pOworICAgIG1pbl9hZGRyID0gTUlOKG5ld19sYXN0aSwgZi0+Zl9sYXN0aSk7CisgICAgbWF4X2FkZHIgPSBNQVgobmV3X2xhc3RpLCBmLT5mX2xhc3RpKTsKIAotCS8qIFlvdSBjYW4ndCBqdW1wIG9udG8gYSBsaW5lIHdpdGggYW4gJ2V4Y2VwdCcgc3RhdGVtZW50IG9uIGl0IC0KLQkgKiB0aGV5IGV4cGVjdCB0byBoYXZlIGFuIGV4Y2VwdGlvbiBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjaywgd2hpY2gKLQkgKiB3b24ndCBiZSB0cnVlIGlmIHlvdSBqdW1wIHRvIHRoZW0uICBUaGV5IGFsd2F5cyBzdGFydCB3aXRoIGNvZGUKLQkgKiB0aGF0IGVpdGhlciBwb3BzIHRoZSBleGNlcHRpb24gdXNpbmcgUE9QX1RPUCAocGxhaW4gJ2V4Y2VwdDonCi0JICogbGluZXMgZG8gdGhpcykgb3IgZHVwbGljYXRlcyB0aGUgZXhjZXB0aW9uIG9uIHRoZSBzdGFjayB1c2luZwotCSAqIERVUF9UT1AgKGlmIHRoZXJlJ3MgYW4gZXhjZXB0aW9uIHR5cGUgc3BlY2lmaWVkKS4gIFNlZSBjb21waWxlLmMsCi0JICogJ2NvbV90cnlfZXhjZXB0JyBmb3IgdGhlIGZ1bGwgZGV0YWlscy4gIFRoZXJlIGFyZW4ndCBhbnkgb3RoZXIKLQkgKiBjYXNlcyAoQUZBSUspIHdoZXJlIGEgbGluZSdzIGNvZGUgY2FuIHN0YXJ0IHdpdGggRFVQX1RPUCBvcgotCSAqIFBPUF9UT1AsIGJ1dCBpZiBhbnkgZXZlciBhcHBlYXIsIHRoZXknbGwgYmUgc3ViamVjdCB0byB0aGUgc2FtZQotCSAqIHJlc3RyaWN0aW9uIChidXQgd2l0aCBhIGRpZmZlcmVudCBlcnJvciBtZXNzYWdlKS4gKi8KLQlpZiAoY29kZVtuZXdfbGFzdGldID09IERVUF9UT1AgfHwgY29kZVtuZXdfbGFzdGldID09IFBPUF9UT1ApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSAgICAiY2FuJ3QganVtcCB0byAnZXhjZXB0JyBsaW5lIGFzIHRoZXJlJ3Mgbm8gZXhjZXB0aW9uIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogWW91IGNhbid0IGp1bXAgb250byBhIGxpbmUgd2l0aCBhbiAnZXhjZXB0JyBzdGF0ZW1lbnQgb24gaXQgLQorICAgICAqIHRoZXkgZXhwZWN0IHRvIGhhdmUgYW4gZXhjZXB0aW9uIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCB3aGljaAorICAgICAqIHdvbid0IGJlIHRydWUgaWYgeW91IGp1bXAgdG8gdGhlbS4gIFRoZXkgYWx3YXlzIHN0YXJ0IHdpdGggY29kZQorICAgICAqIHRoYXQgZWl0aGVyIHBvcHMgdGhlIGV4Y2VwdGlvbiB1c2luZyBQT1BfVE9QIChwbGFpbiAnZXhjZXB0OicKKyAgICAgKiBsaW5lcyBkbyB0aGlzKSBvciBkdXBsaWNhdGVzIHRoZSBleGNlcHRpb24gb24gdGhlIHN0YWNrIHVzaW5nCisgICAgICogRFVQX1RPUCAoaWYgdGhlcmUncyBhbiBleGNlcHRpb24gdHlwZSBzcGVjaWZpZWQpLiAgU2VlIGNvbXBpbGUuYywKKyAgICAgKiAnY29tX3RyeV9leGNlcHQnIGZvciB0aGUgZnVsbCBkZXRhaWxzLiAgVGhlcmUgYXJlbid0IGFueSBvdGhlcgorICAgICAqIGNhc2VzIChBRkFJSykgd2hlcmUgYSBsaW5lJ3MgY29kZSBjYW4gc3RhcnQgd2l0aCBEVVBfVE9QIG9yCisgICAgICogUE9QX1RPUCwgYnV0IGlmIGFueSBldmVyIGFwcGVhciwgdGhleSdsbCBiZSBzdWJqZWN0IHRvIHRoZSBzYW1lCisgICAgICogcmVzdHJpY3Rpb24gKGJ1dCB3aXRoIGEgZGlmZmVyZW50IGVycm9yIG1lc3NhZ2UpLiAqLworICAgIGlmIChjb2RlW25ld19sYXN0aV0gPT0gRFVQX1RPUCB8fCBjb2RlW25ld19sYXN0aV0gPT0gUE9QX1RPUCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJjYW4ndCBqdW1wIHRvICdleGNlcHQnIGxpbmUgYXMgdGhlcmUncyBubyBleGNlcHRpb24iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCS8qIFlvdSBjYW4ndCBqdW1wIGludG8gb3Igb3V0IG9mIGEgJ2ZpbmFsbHknIGJsb2NrIGJlY2F1c2UgdGhlICd0cnknCi0JICogYmxvY2sgbGVhdmVzIHNvbWV0aGluZyBvbiB0aGUgc3RhY2sgZm9yIHRoZSBFTkRfRklOQUxMWSB0byBjbGVhbgotCSAqIHVwLglTbyB3ZSB3YWxrIHRoZSBieXRlY29kZSwgbWFpbnRhaW5pbmcgYSBzaW11bGF0ZWQgYmxvY2tzdGFjay4KLQkgKiBXaGVuIHdlIHJlYWNoIHRoZSBvbGQgb3IgbmV3IGFkZHJlc3MgYW5kIGl0J3MgaW4gYSAnZmluYWxseScgYmxvY2sKLQkgKiB3ZSBub3RlIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIFNFVFVQX0ZJTkFMTFkuICBUaGUganVtcAotCSAqIGlzIG9ubHkgbGVnYWwgaWYgbmVpdGhlciBhZGRyZXNzIGlzIGluIGEgJ2ZpbmFsbHknIGJsb2NrIG9yCi0JICogdGhleSdyZSBib3RoIGluIHRoZSBzYW1lIG9uZS4gICdibG9ja3N0YWNrJyBpcyBhIHN0YWNrIG9mIHRoZQotCSAqIGJ5dGVjb2RlIGFkZHJlc3NlcyBvZiB0aGUgU0VUVVBfWCBvcGNvZGVzLCBhbmQgJ2luX2ZpbmFsbHknIHRyYWNrcwotCSAqIHdoZXRoZXIgd2UncmUgaW4gYSAnZmluYWxseScgYmxvY2sgYXQgZWFjaCBibG9ja3N0YWNrIGxldmVsLiAqLwotCWZfbGFzdGlfc2V0dXBfYWRkciA9IC0xOwotCW5ld19sYXN0aV9zZXR1cF9hZGRyID0gLTE7Ci0JbWVtc2V0KGJsb2Nrc3RhY2ssICdcMCcsIHNpemVvZihibG9ja3N0YWNrKSk7Ci0JbWVtc2V0KGluX2ZpbmFsbHksICdcMCcsIHNpemVvZihpbl9maW5hbGx5KSk7Ci0JYmxvY2tzdGFja190b3AgPSAwOwotCWZvciAoYWRkciA9IDA7IGFkZHIgPCBjb2RlX2xlbjsgYWRkcisrKSB7Ci0JCXVuc2lnbmVkIGNoYXIgb3AgPSBjb2RlW2FkZHJdOwotCQlzd2l0Y2ggKG9wKSB7Ci0JCWNhc2UgU0VUVVBfTE9PUDoKLQkJY2FzZSBTRVRVUF9FWENFUFQ6Ci0JCWNhc2UgU0VUVVBfRklOQUxMWToKLQkJCWJsb2Nrc3RhY2tbYmxvY2tzdGFja190b3ArK10gPSBhZGRyOwotCQkJaW5fZmluYWxseVtibG9ja3N0YWNrX3RvcC0xXSA9IDA7Ci0JCQlicmVhazsKKyAgICAvKiBZb3UgY2FuJ3QganVtcCBpbnRvIG9yIG91dCBvZiBhICdmaW5hbGx5JyBibG9jayBiZWNhdXNlIHRoZSAndHJ5JworICAgICAqIGJsb2NrIGxlYXZlcyBzb21ldGhpbmcgb24gdGhlIHN0YWNrIGZvciB0aGUgRU5EX0ZJTkFMTFkgdG8gY2xlYW4KKyAgICAgKiB1cC4gICAgICBTbyB3ZSB3YWxrIHRoZSBieXRlY29kZSwgbWFpbnRhaW5pbmcgYSBzaW11bGF0ZWQgYmxvY2tzdGFjay4KKyAgICAgKiBXaGVuIHdlIHJlYWNoIHRoZSBvbGQgb3IgbmV3IGFkZHJlc3MgYW5kIGl0J3MgaW4gYSAnZmluYWxseScgYmxvY2sKKyAgICAgKiB3ZSBub3RlIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIFNFVFVQX0ZJTkFMTFkuICBUaGUganVtcAorICAgICAqIGlzIG9ubHkgbGVnYWwgaWYgbmVpdGhlciBhZGRyZXNzIGlzIGluIGEgJ2ZpbmFsbHknIGJsb2NrIG9yCisgICAgICogdGhleSdyZSBib3RoIGluIHRoZSBzYW1lIG9uZS4gICdibG9ja3N0YWNrJyBpcyBhIHN0YWNrIG9mIHRoZQorICAgICAqIGJ5dGVjb2RlIGFkZHJlc3NlcyBvZiB0aGUgU0VUVVBfWCBvcGNvZGVzLCBhbmQgJ2luX2ZpbmFsbHknIHRyYWNrcworICAgICAqIHdoZXRoZXIgd2UncmUgaW4gYSAnZmluYWxseScgYmxvY2sgYXQgZWFjaCBibG9ja3N0YWNrIGxldmVsLiAqLworICAgIGZfbGFzdGlfc2V0dXBfYWRkciA9IC0xOworICAgIG5ld19sYXN0aV9zZXR1cF9hZGRyID0gLTE7CisgICAgbWVtc2V0KGJsb2Nrc3RhY2ssICdcMCcsIHNpemVvZihibG9ja3N0YWNrKSk7CisgICAgbWVtc2V0KGluX2ZpbmFsbHksICdcMCcsIHNpemVvZihpbl9maW5hbGx5KSk7CisgICAgYmxvY2tzdGFja190b3AgPSAwOworICAgIGZvciAoYWRkciA9IDA7IGFkZHIgPCBjb2RlX2xlbjsgYWRkcisrKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgb3AgPSBjb2RlW2FkZHJdOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKKyAgICAgICAgY2FzZSBTRVRVUF9FWENFUFQ6CisgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgICAgIGJsb2Nrc3RhY2tbYmxvY2tzdGFja190b3ArK10gPSBhZGRyOworICAgICAgICAgICAgaW5fZmluYWxseVtibG9ja3N0YWNrX3RvcC0xXSA9IDA7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBPUF9CTE9DSzoKLQkJCWFzc2VydChibG9ja3N0YWNrX3RvcCA+IDApOwotCQkJc2V0dXBfb3AgPSBjb2RlW2Jsb2Nrc3RhY2tbYmxvY2tzdGFja190b3AtMV1dOwotCQkJaWYgKHNldHVwX29wID09IFNFVFVQX0ZJTkFMTFkpIHsKLQkJCQlpbl9maW5hbGx5W2Jsb2Nrc3RhY2tfdG9wLTFdID0gMTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJsb2Nrc3RhY2tfdG9wLS07Ci0JCQl9Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBQT1BfQkxPQ0s6CisgICAgICAgICAgICBhc3NlcnQoYmxvY2tzdGFja190b3AgPiAwKTsKKyAgICAgICAgICAgIHNldHVwX29wID0gY29kZVtibG9ja3N0YWNrW2Jsb2Nrc3RhY2tfdG9wLTFdXTsKKyAgICAgICAgICAgIGlmIChzZXR1cF9vcCA9PSBTRVRVUF9GSU5BTExZKSB7CisgICAgICAgICAgICAgICAgaW5fZmluYWxseVtibG9ja3N0YWNrX3RvcC0xXSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBibG9ja3N0YWNrX3RvcC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBFTkRfRklOQUxMWToKLQkJCS8qIElnbm9yZSBFTkRfRklOQUxMWXMgZm9yIFNFVFVQX0VYQ0VQVHMgLSB0aGV5IGV4aXN0Ci0JCQkgKiBpbiB0aGUgYnl0ZWNvZGUgYnV0IGRvbid0IGNvcnJlc3BvbmQgdG8gYW4gYWN0dWFsCi0JCQkgKiAnZmluYWxseScgYmxvY2suICAoSWYgYmxvY2tzdGFja190b3AgaXMgMCwgd2UgbXVzdAotCQkJICogYmUgc2VlaW5nIHN1Y2ggYW4gRU5EX0ZJTkFMTFkuKSAqLwotCQkJaWYgKGJsb2Nrc3RhY2tfdG9wID4gMCkgewotCQkJCXNldHVwX29wID0gY29kZVtibG9ja3N0YWNrW2Jsb2Nrc3RhY2tfdG9wLTFdXTsKLQkJCQlpZiAoc2V0dXBfb3AgPT0gU0VUVVBfRklOQUxMWSkgewotCQkJCQlibG9ja3N0YWNrX3RvcC0tOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGNhc2UgRU5EX0ZJTkFMTFk6CisgICAgICAgICAgICAvKiBJZ25vcmUgRU5EX0ZJTkFMTFlzIGZvciBTRVRVUF9FWENFUFRzIC0gdGhleSBleGlzdAorICAgICAgICAgICAgICogaW4gdGhlIGJ5dGVjb2RlIGJ1dCBkb24ndCBjb3JyZXNwb25kIHRvIGFuIGFjdHVhbAorICAgICAgICAgICAgICogJ2ZpbmFsbHknIGJsb2NrLiAgKElmIGJsb2Nrc3RhY2tfdG9wIGlzIDAsIHdlIG11c3QKKyAgICAgICAgICAgICAqIGJlIHNlZWluZyBzdWNoIGFuIEVORF9GSU5BTExZLikgKi8KKyAgICAgICAgICAgIGlmIChibG9ja3N0YWNrX3RvcCA+IDApIHsKKyAgICAgICAgICAgICAgICBzZXR1cF9vcCA9IGNvZGVbYmxvY2tzdGFja1tibG9ja3N0YWNrX3RvcC0xXV07CisgICAgICAgICAgICAgICAgaWYgKHNldHVwX29wID09IFNFVFVQX0ZJTkFMTFkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tzdGFja190b3AtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCS8qIEZvciB0aGUgYWRkcmVzc2VzIHdlJ3JlIGludGVyZXN0ZWQgaW4sIHNlZSB3aGV0aGVyIHRoZXkncmUKLQkJICogd2l0aGluIGEgJ2ZpbmFsbHknIGJsb2NrIGFuZCBpZiBzbywgcmVtZW1iZXIgdGhlIGFkZHJlc3MKLQkJICogb2YgdGhlIFNFVFVQX0ZJTkFMTFkuICovCi0JCWlmIChhZGRyID09IG5ld19sYXN0aSB8fCBhZGRyID09IGYtPmZfbGFzdGkpIHsKLQkJCWludCBpID0gMDsKLQkJCWludCBzZXR1cF9hZGRyID0gLTE7Ci0JCQlmb3IgKGkgPSBibG9ja3N0YWNrX3RvcC0xOyBpID49IDA7IGktLSkgewotCQkJCWlmIChpbl9maW5hbGx5W2ldKSB7Ci0JCQkJCXNldHVwX2FkZHIgPSBibG9ja3N0YWNrW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9CisgICAgICAgIC8qIEZvciB0aGUgYWRkcmVzc2VzIHdlJ3JlIGludGVyZXN0ZWQgaW4sIHNlZSB3aGV0aGVyIHRoZXkncmUKKyAgICAgICAgICogd2l0aGluIGEgJ2ZpbmFsbHknIGJsb2NrIGFuZCBpZiBzbywgcmVtZW1iZXIgdGhlIGFkZHJlc3MKKyAgICAgICAgICogb2YgdGhlIFNFVFVQX0ZJTkFMTFkuICovCisgICAgICAgIGlmIChhZGRyID09IG5ld19sYXN0aSB8fCBhZGRyID09IGYtPmZfbGFzdGkpIHsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGludCBzZXR1cF9hZGRyID0gLTE7CisgICAgICAgICAgICBmb3IgKGkgPSBibG9ja3N0YWNrX3RvcC0xOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGlmIChpbl9maW5hbGx5W2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHNldHVwX2FkZHIgPSBibG9ja3N0YWNrW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCWlmIChzZXR1cF9hZGRyICE9IC0xKSB7Ci0JCQkJaWYgKGFkZHIgPT0gbmV3X2xhc3RpKSB7Ci0JCQkJCW5ld19sYXN0aV9zZXR1cF9hZGRyID0gc2V0dXBfYWRkcjsKLQkJCQl9CisgICAgICAgICAgICBpZiAoc2V0dXBfYWRkciAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlmIChhZGRyID09IG5ld19sYXN0aSkgeworICAgICAgICAgICAgICAgICAgICBuZXdfbGFzdGlfc2V0dXBfYWRkciA9IHNldHVwX2FkZHI7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJaWYgKGFkZHIgPT0gZi0+Zl9sYXN0aSkgewotCQkJCQlmX2xhc3RpX3NldHVwX2FkZHIgPSBzZXR1cF9hZGRyOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIGlmIChhZGRyID09IGYtPmZfbGFzdGkpIHsKKyAgICAgICAgICAgICAgICAgICAgZl9sYXN0aV9zZXR1cF9hZGRyID0gc2V0dXBfYWRkcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAob3AgPj0gSEFWRV9BUkdVTUVOVCkgewotCQkJYWRkciArPSAyOwotCQl9Ci0JfQorICAgICAgICBpZiAob3AgPj0gSEFWRV9BUkdVTUVOVCkgeworICAgICAgICAgICAgYWRkciArPSAyOworICAgICAgICB9CisgICAgfQogCi0JLyogVmVyaWZ5IHRoYXQgdGhlIGJsb2Nrc3RhY2sgdHJhY2tpbmcgY29kZSBkaWRuJ3QgZ2V0IGxvc3QuICovCi0JYXNzZXJ0KGJsb2Nrc3RhY2tfdG9wID09IDApOworICAgIC8qIFZlcmlmeSB0aGF0IHRoZSBibG9ja3N0YWNrIHRyYWNraW5nIGNvZGUgZGlkbid0IGdldCBsb3N0LiAqLworICAgIGFzc2VydChibG9ja3N0YWNrX3RvcCA9PSAwKTsKIAotCS8qIEFmdGVyIGFsbCB0aGF0LCBhcmUgd2UganVtcGluZyBpbnRvIC8gb3V0IG9mIGEgJ2ZpbmFsbHknIGJsb2NrPyAqLwotCWlmIChuZXdfbGFzdGlfc2V0dXBfYWRkciAhPSBmX2xhc3RpX3NldHVwX2FkZHIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgImNhbid0IGp1bXAgaW50byBvciBvdXQgb2YgYSAnZmluYWxseScgYmxvY2siKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICAvKiBBZnRlciBhbGwgdGhhdCwgYXJlIHdlIGp1bXBpbmcgaW50byAvIG91dCBvZiBhICdmaW5hbGx5JyBibG9jaz8gKi8KKyAgICBpZiAobmV3X2xhc3RpX3NldHVwX2FkZHIgIT0gZl9sYXN0aV9zZXR1cF9hZGRyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiY2FuJ3QganVtcCBpbnRvIG9yIG91dCBvZiBhICdmaW5hbGx5JyBibG9jayIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCiAKLQkvKiBQb2xpY2UgYmxvY2stanVtcGluZyAoeW91IGNhbid0IGp1bXAgaW50byB0aGUgbWlkZGxlIG9mIGEgYmxvY2spCi0JICogYW5kIGVuc3VyZSB0aGF0IHRoZSBibG9ja3N0YWNrIGZpbmlzaGVzIHVwIGluIGEgc2Vuc2libGUgc3RhdGUgKGJ5Ci0JICogcG9wcGluZyBhbnkgYmxvY2tzIHdlJ3JlIGp1bXBpbmcgb3V0IG9mKS4gIFdlIGxvb2sgYXQgYWxsIHRoZQotCSAqIGJsb2Nrc3RhY2sgb3BlcmF0aW9ucyBiZXR3ZWVuIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFuZCB0aGUgbmV3Ci0JICogb25lLCBhbmQga2VlcCB0cmFjayBvZiBob3cgbWFueSBibG9ja3Mgd2UgZHJvcCBvdXQgb2Ygb24gdGhlIHdheS4KLQkgKiBCeSBhbHNvIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGxvd2VzdCBibG9ja3N0YWNrIHBvc2l0aW9uIHdlIHNlZSwgd2UKLQkgKiBjYW4gdGVsbCB3aGV0aGVyIHRoZSBqdW1wIGdvZXMgaW50byBhbnkgYmxvY2tzIHdpdGhvdXQgY29taW5nIG91dAotCSAqIGFnYWluIC0gaW4gdGhhdCBjYXNlIHdlIHJhaXNlIGFuIGV4Y2VwdGlvbiBiZWxvdy4gKi8KLQlkZWx0YV9pYmxvY2sgPSAwOwotCWZvciAoYWRkciA9IG1pbl9hZGRyOyBhZGRyIDwgbWF4X2FkZHI7IGFkZHIrKykgewotCQl1bnNpZ25lZCBjaGFyIG9wID0gY29kZVthZGRyXTsKLQkJc3dpdGNoIChvcCkgewotCQljYXNlIFNFVFVQX0xPT1A6Ci0JCWNhc2UgU0VUVVBfRVhDRVBUOgotCQljYXNlIFNFVFVQX0ZJTkFMTFk6Ci0JCQlkZWx0YV9pYmxvY2srKzsKLQkJCWJyZWFrOworICAgIC8qIFBvbGljZSBibG9jay1qdW1waW5nICh5b3UgY2FuJ3QganVtcCBpbnRvIHRoZSBtaWRkbGUgb2YgYSBibG9jaykKKyAgICAgKiBhbmQgZW5zdXJlIHRoYXQgdGhlIGJsb2Nrc3RhY2sgZmluaXNoZXMgdXAgaW4gYSBzZW5zaWJsZSBzdGF0ZSAoYnkKKyAgICAgKiBwb3BwaW5nIGFueSBibG9ja3Mgd2UncmUganVtcGluZyBvdXQgb2YpLiAgV2UgbG9vayBhdCBhbGwgdGhlCisgICAgICogYmxvY2tzdGFjayBvcGVyYXRpb25zIGJldHdlZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBuZXcKKyAgICAgKiBvbmUsIGFuZCBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGJsb2NrcyB3ZSBkcm9wIG91dCBvZiBvbiB0aGUgd2F5LgorICAgICAqIEJ5IGFsc28ga2VlcGluZyB0cmFjayBvZiB0aGUgbG93ZXN0IGJsb2Nrc3RhY2sgcG9zaXRpb24gd2Ugc2VlLCB3ZQorICAgICAqIGNhbiB0ZWxsIHdoZXRoZXIgdGhlIGp1bXAgZ29lcyBpbnRvIGFueSBibG9ja3Mgd2l0aG91dCBjb21pbmcgb3V0CisgICAgICogYWdhaW4gLSBpbiB0aGF0IGNhc2Ugd2UgcmFpc2UgYW4gZXhjZXB0aW9uIGJlbG93LiAqLworICAgIGRlbHRhX2libG9jayA9IDA7CisgICAgZm9yIChhZGRyID0gbWluX2FkZHI7IGFkZHIgPCBtYXhfYWRkcjsgYWRkcisrKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgb3AgPSBjb2RlW2FkZHJdOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKKyAgICAgICAgY2FzZSBTRVRVUF9FWENFUFQ6CisgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgICAgIGRlbHRhX2libG9jaysrOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQT1BfQkxPQ0s6Ci0JCQlkZWx0YV9pYmxvY2stLTsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGNhc2UgUE9QX0JMT0NLOgorICAgICAgICAgICAgZGVsdGFfaWJsb2NrLS07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCW1pbl9kZWx0YV9pYmxvY2sgPSBNSU4obWluX2RlbHRhX2libG9jaywgZGVsdGFfaWJsb2NrKTsKKyAgICAgICAgbWluX2RlbHRhX2libG9jayA9IE1JTihtaW5fZGVsdGFfaWJsb2NrLCBkZWx0YV9pYmxvY2spOwogCi0JCWlmIChvcCA+PSBIQVZFX0FSR1VNRU5UKSB7Ci0JCQlhZGRyICs9IDI7Ci0JCX0KLQl9CisgICAgICAgIGlmIChvcCA+PSBIQVZFX0FSR1VNRU5UKSB7CisgICAgICAgICAgICBhZGRyICs9IDI7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBEZXJpdmUgdGhlIGFic29sdXRlIGlibG9jayB2YWx1ZXMgZnJvbSB0aGUgZGVsdGFzLiAqLwotCW1pbl9pYmxvY2sgPSBmLT5mX2libG9jayArIG1pbl9kZWx0YV9pYmxvY2s7Ci0JaWYgKG5ld19sYXN0aSA+IGYtPmZfbGFzdGkpIHsKLQkJLyogRm9yd2FyZHMganVtcC4gKi8KLQkJbmV3X2libG9jayA9IGYtPmZfaWJsb2NrICsgZGVsdGFfaWJsb2NrOwotCX0KLQllbHNlIHsKLQkJLyogQmFja3dhcmRzIGp1bXAuICovCi0JCW5ld19pYmxvY2sgPSBmLT5mX2libG9jayAtIGRlbHRhX2libG9jazsKLQl9CisgICAgLyogRGVyaXZlIHRoZSBhYnNvbHV0ZSBpYmxvY2sgdmFsdWVzIGZyb20gdGhlIGRlbHRhcy4gKi8KKyAgICBtaW5faWJsb2NrID0gZi0+Zl9pYmxvY2sgKyBtaW5fZGVsdGFfaWJsb2NrOworICAgIGlmIChuZXdfbGFzdGkgPiBmLT5mX2xhc3RpKSB7CisgICAgICAgIC8qIEZvcndhcmRzIGp1bXAuICovCisgICAgICAgIG5ld19pYmxvY2sgPSBmLT5mX2libG9jayArIGRlbHRhX2libG9jazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIEJhY2t3YXJkcyBqdW1wLiAqLworICAgICAgICBuZXdfaWJsb2NrID0gZi0+Zl9pYmxvY2sgLSBkZWx0YV9pYmxvY2s7CisgICAgfQogCi0JLyogQXJlIHdlIGp1bXBpbmcgaW50byBhIGJsb2NrPyAqLwotCWlmIChuZXdfaWJsb2NrID4gbWluX2libG9jaykgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY2FuJ3QganVtcCBpbnRvIHRoZSBtaWRkbGUgb2YgYSBibG9jayIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIEFyZSB3ZSBqdW1waW5nIGludG8gYSBibG9jaz8gKi8KKyAgICBpZiAobmV3X2libG9jayA+IG1pbl9pYmxvY2spIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QganVtcCBpbnRvIHRoZSBtaWRkbGUgb2YgYSBibG9jayIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogUG9wIGFueSBibG9ja3MgdGhhdCB3ZSdyZSBqdW1waW5nIG91dCBvZi4gKi8KLQl3aGlsZSAoZi0+Zl9pYmxvY2sgPiBuZXdfaWJsb2NrKSB7Ci0JCVB5VHJ5QmxvY2sgKmIgPSAmZi0+Zl9ibG9ja3N0YWNrWy0tZi0+Zl9pYmxvY2tdOwotCQl3aGlsZSAoKGYtPmZfc3RhY2t0b3AgLSBmLT5mX3ZhbHVlc3RhY2spID4gYi0+Yl9sZXZlbCkgewotCQkJUHlPYmplY3QgKnYgPSAoKi0tZi0+Zl9zdGFja3RvcCk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCX0KLQl9CisgICAgLyogUG9wIGFueSBibG9ja3MgdGhhdCB3ZSdyZSBqdW1waW5nIG91dCBvZi4gKi8KKyAgICB3aGlsZSAoZi0+Zl9pYmxvY2sgPiBuZXdfaWJsb2NrKSB7CisgICAgICAgIFB5VHJ5QmxvY2sgKmIgPSAmZi0+Zl9ibG9ja3N0YWNrWy0tZi0+Zl9pYmxvY2tdOworICAgICAgICB3aGlsZSAoKGYtPmZfc3RhY2t0b3AgLSBmLT5mX3ZhbHVlc3RhY2spID4gYi0+Yl9sZXZlbCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSAoKi0tZi0+Zl9zdGFja3RvcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBGaW5hbGx5IHNldCB0aGUgbmV3IGZfbGluZW5vIGFuZCBmX2xhc3RpIGFuZCByZXR1cm4gT0suICovCi0JZi0+Zl9saW5lbm8gPSBuZXdfbGluZW5vOwotCWYtPmZfbGFzdGkgPSBuZXdfbGFzdGk7Ci0JcmV0dXJuIDA7CisgICAgLyogRmluYWxseSBzZXQgdGhlIG5ldyBmX2xpbmVubyBhbmQgZl9sYXN0aSBhbmQgcmV0dXJuIE9LLiAqLworICAgIGYtPmZfbGluZW5vID0gbmV3X2xpbmVubzsKKyAgICBmLT5mX2xhc3RpID0gbmV3X2xhc3RpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZnJhbWVfZ2V0dHJhY2UoUHlGcmFtZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeU9iamVjdCogdHJhY2UgPSBmLT5mX3RyYWNlOworICAgIFB5T2JqZWN0KiB0cmFjZSA9IGYtPmZfdHJhY2U7CiAKLQlpZiAodHJhY2UgPT0gTlVMTCkKLQkJdHJhY2UgPSBQeV9Ob25lOworICAgIGlmICh0cmFjZSA9PSBOVUxMKQorICAgICAgICB0cmFjZSA9IFB5X05vbmU7CiAKLQlQeV9JTkNSRUYodHJhY2UpOworICAgIFB5X0lOQ1JFRih0cmFjZSk7CiAKLQlyZXR1cm4gdHJhY2U7CisgICAgcmV0dXJuIHRyYWNlOwogfQogCiBzdGF0aWMgaW50CiBmcmFtZV9zZXR0cmFjZShQeUZyYW1lT2JqZWN0ICpmLCBQeU9iamVjdCogdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQkvKiBXZSByZWx5IG9uIGZfbGluZW5vIGJlaW5nIGFjY3VyYXRlIHdoZW4gZl90cmFjZSBpcyBzZXQuICovCisgICAgLyogV2UgcmVseSBvbiBmX2xpbmVubyBiZWluZyBhY2N1cmF0ZSB3aGVuIGZfdHJhY2UgaXMgc2V0LiAqLwogCi0JUHlPYmplY3QqIG9sZF92YWx1ZSA9IGYtPmZfdHJhY2U7CisgICAgUHlPYmplY3QqIG9sZF92YWx1ZSA9IGYtPmZfdHJhY2U7CiAKLQlQeV9YSU5DUkVGKHYpOwotCWYtPmZfdHJhY2UgPSB2OworICAgIFB5X1hJTkNSRUYodik7CisgICAgZi0+Zl90cmFjZSA9IHY7CiAKLQlpZiAodiAhPSBOVUxMKQotCQlmLT5mX2xpbmVubyA9IFB5Q29kZV9BZGRyMkxpbmUoZi0+Zl9jb2RlLCBmLT5mX2xhc3RpKTsKKyAgICBpZiAodiAhPSBOVUxMKQorICAgICAgICBmLT5mX2xpbmVubyA9IFB5Q29kZV9BZGRyMkxpbmUoZi0+Zl9jb2RlLCBmLT5mX2xhc3RpKTsKIAotCVB5X1hERUNSRUYob2xkX3ZhbHVlKTsKKyAgICBQeV9YREVDUkVGKG9sZF92YWx1ZSk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZyYW1lX2dldHJlc3RyaWN0ZWQoUHlGcmFtZU9iamVjdCAqZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5RnJhbWVfSXNSZXN0cmljdGVkKGYpKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKFB5RnJhbWVfSXNSZXN0cmljdGVkKGYpKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGZyYW1lX2dldHNldGxpc3RbXSA9IHsKLQl7ImZfbG9jYWxzIiwJKGdldHRlcilmcmFtZV9nZXRsb2NhbHMsIE5VTEwsIE5VTEx9LAotCXsiZl9saW5lbm8iLAkoZ2V0dGVyKWZyYW1lX2dldGxpbmVubywKLQkJCShzZXR0ZXIpZnJhbWVfc2V0bGluZW5vLCBOVUxMfSwKLQl7ImZfdHJhY2UiLAkoZ2V0dGVyKWZyYW1lX2dldHRyYWNlLCAoc2V0dGVyKWZyYW1lX3NldHRyYWNlLCBOVUxMfSwKLQl7ImZfcmVzdHJpY3RlZCIsKGdldHRlcilmcmFtZV9nZXRyZXN0cmljdGVkLE5VTEwsIE5VTEx9LAotCXswfQorICAgIHsiZl9sb2NhbHMiLCAgICAgICAgKGdldHRlcilmcmFtZV9nZXRsb2NhbHMsIE5VTEwsIE5VTEx9LAorICAgIHsiZl9saW5lbm8iLCAgICAgICAgKGdldHRlcilmcmFtZV9nZXRsaW5lbm8sCisgICAgICAgICAgICAgICAgICAgIChzZXR0ZXIpZnJhbWVfc2V0bGluZW5vLCBOVUxMfSwKKyAgICB7ImZfdHJhY2UiLCAgICAgICAgIChnZXR0ZXIpZnJhbWVfZ2V0dHJhY2UsIChzZXR0ZXIpZnJhbWVfc2V0dHJhY2UsIE5VTEx9LAorICAgIHsiZl9yZXN0cmljdGVkIiwoZ2V0dGVyKWZyYW1lX2dldHJlc3RyaWN0ZWQsTlVMTCwgTlVMTH0sCisgICAgezB9CiB9OwogCiAvKiBTdGFjayBmcmFtZXMgYXJlIGFsbG9jYXRlZCBhbmQgZGVhbGxvY2F0ZWQgYXQgYSBjb25zaWRlcmFibGUgcmF0ZS4KQEAgLTM3Miw3ICszNzIsNyBAQAogICAgdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHN0aWxsIHZhbGlkOgogCiAgICAgICogb2JfdHlwZSwgb2Jfc2l6ZSwgZl9jb2RlLCBmX3ZhbHVlc3RhY2s7Ci0gICAgICAgCisKICAgICAgKiBmX2xvY2FscywgZl90cmFjZSwKICAgICAgICBmX2V4Y190eXBlLCBmX2V4Y192YWx1ZSwgZl9leGNfdHJhY2ViYWNrIGFyZSBOVUxMOwogCkBAIC0zODMsMTAgKzM4MywxMCBAQAogICAgaW50ZWdlcnMgYXJlIGFsbG9jYXRlZCBpbiBhIHNwZWNpYWwgd2F5IC0tIHNlZSBpbnRvYmplY3QuYykuICBXaGVuCiAgICBhIHN0YWNrIGZyYW1lIGlzIG9uIHRoZSBmcmVlIGxpc3QsIG9ubHkgdGhlIGZvbGxvd2luZyBtZW1iZXJzIGhhdmUKICAgIGEgbWVhbmluZzoKLQlvYl90eXBlCQk9PSAmRnJhbWV0eXBlCi0JZl9iYWNrCQluZXh0IGl0ZW0gb24gZnJlZSBsaXN0LCBvciBOVUxMCi0JZl9zdGFja3NpemUJc2l6ZSBvZiB2YWx1ZSBzdGFjawotCW9iX3NpemUJCXNpemUgb2YgbG9jYWxzcGx1cworICAgIG9iX3R5cGUgICAgICAgICAgICAgPT0gJkZyYW1ldHlwZQorICAgIGZfYmFjayAgICAgICAgICAgICAgbmV4dCBpdGVtIG9uIGZyZWUgbGlzdCwgb3IgTlVMTAorICAgIGZfc3RhY2tzaXplICAgICAgICAgc2l6ZSBvZiB2YWx1ZSBzdGFjaworICAgIG9iX3NpemUgICAgICAgICAgICAgc2l6ZSBvZiBsb2NhbHNwbHVzCiAgICBOb3RlIHRoYXQgdGhlIHZhbHVlIGFuZCBibG9jayBzdGFja3MgYXJlIHByZXNlcnZlZCAtLSB0aGlzIGNhbiBzYXZlCiAgICBhbm90aGVyIG1hbGxvYygpIGNhbGwgb3IgdHdvIChhbmQgdHdvIGZyZWUoKSBjYWxscyBhcyB3ZWxsISkuCiAgICBBbHNvIG5vdGUgdGhhdCwgdW5saWtlIGZvciBpbnRlZ2VycywgZWFjaCBmcmFtZSBvYmplY3QgaXMgYQpAQCAtNDAyLDMwNyArNDAyLDMwNyBAQAogKi8KIAogc3RhdGljIFB5RnJhbWVPYmplY3QgKmZyZWVfbGlzdCA9IE5VTEw7Ci1zdGF0aWMgaW50IG51bWZyZWUgPSAwOwkJLyogbnVtYmVyIG9mIGZyYW1lcyBjdXJyZW50bHkgaW4gZnJlZV9saXN0ICovCitzdGF0aWMgaW50IG51bWZyZWUgPSAwOyAgICAgICAgIC8qIG51bWJlciBvZiBmcmFtZXMgY3VycmVudGx5IGluIGZyZWVfbGlzdCAqLwogLyogbWF4IHZhbHVlIGZvciBudW1mcmVlICovCi0jZGVmaW5lIFB5RnJhbWVfTUFYRlJFRUxJU1QgMjAwCQorI2RlZmluZSBQeUZyYW1lX01BWEZSRUVMSVNUIDIwMAogCiBzdGF0aWMgdm9pZAogZnJhbWVfZGVhbGxvYyhQeUZyYW1lT2JqZWN0ICpmKQogewotCVB5T2JqZWN0ICoqcCwgKip2YWx1ZXN0YWNrOwotCVB5Q29kZU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKipwLCAqKnZhbHVlc3RhY2s7CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKIAotCVB5T2JqZWN0X0dDX1VuVHJhY2soZik7Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihmKQotCS8qIEtpbGwgYWxsIGxvY2FsIHZhcmlhYmxlcyAqLwotCXZhbHVlc3RhY2sgPSBmLT5mX3ZhbHVlc3RhY2s7Ci0JZm9yIChwID0gZi0+Zl9sb2NhbHNwbHVzOyBwIDwgdmFsdWVzdGFjazsgcCsrKQotCQlQeV9DTEVBUigqcCk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhmKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKGYpCisgICAgLyogS2lsbCBhbGwgbG9jYWwgdmFyaWFibGVzICovCisgICAgdmFsdWVzdGFjayA9IGYtPmZfdmFsdWVzdGFjazsKKyAgICBmb3IgKHAgPSBmLT5mX2xvY2Fsc3BsdXM7IHAgPCB2YWx1ZXN0YWNrOyBwKyspCisgICAgICAgIFB5X0NMRUFSKCpwKTsKIAotCS8qIEZyZWUgc3RhY2sgKi8KLQlpZiAoZi0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7Ci0JCWZvciAocCA9IHZhbHVlc3RhY2s7IHAgPCBmLT5mX3N0YWNrdG9wOyBwKyspCi0JCQlQeV9YREVDUkVGKCpwKTsKLQl9CisgICAgLyogRnJlZSBzdGFjayAqLworICAgIGlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChwID0gdmFsdWVzdGFjazsgcCA8IGYtPmZfc3RhY2t0b3A7IHArKykKKyAgICAgICAgICAgIFB5X1hERUNSRUYoKnApOworICAgIH0KIAotCVB5X1hERUNSRUYoZi0+Zl9iYWNrKTsKLQlQeV9ERUNSRUYoZi0+Zl9idWlsdGlucyk7Ci0JUHlfREVDUkVGKGYtPmZfZ2xvYmFscyk7Ci0JUHlfQ0xFQVIoZi0+Zl9sb2NhbHMpOwotCVB5X0NMRUFSKGYtPmZfdHJhY2UpOwotCVB5X0NMRUFSKGYtPmZfZXhjX3R5cGUpOwotCVB5X0NMRUFSKGYtPmZfZXhjX3ZhbHVlKTsKLQlQeV9DTEVBUihmLT5mX2V4Y190cmFjZWJhY2spOworICAgIFB5X1hERUNSRUYoZi0+Zl9iYWNrKTsKKyAgICBQeV9ERUNSRUYoZi0+Zl9idWlsdGlucyk7CisgICAgUHlfREVDUkVGKGYtPmZfZ2xvYmFscyk7CisgICAgUHlfQ0xFQVIoZi0+Zl9sb2NhbHMpOworICAgIFB5X0NMRUFSKGYtPmZfdHJhY2UpOworICAgIFB5X0NMRUFSKGYtPmZfZXhjX3R5cGUpOworICAgIFB5X0NMRUFSKGYtPmZfZXhjX3ZhbHVlKTsKKyAgICBQeV9DTEVBUihmLT5mX2V4Y190cmFjZWJhY2spOwogCi0JY28gPSBmLT5mX2NvZGU7Ci0JaWYgKGNvLT5jb196b21iaWVmcmFtZSA9PSBOVUxMKQotCQljby0+Y29fem9tYmllZnJhbWUgPSBmOwotCWVsc2UgaWYgKG51bWZyZWUgPCBQeUZyYW1lX01BWEZSRUVMSVNUKSB7Ci0JCSsrbnVtZnJlZTsKLQkJZi0+Zl9iYWNrID0gZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSBmOwotCX0KLQllbHNlIAotCQlQeU9iamVjdF9HQ19EZWwoZik7CisgICAgY28gPSBmLT5mX2NvZGU7CisgICAgaWYgKGNvLT5jb196b21iaWVmcmFtZSA9PSBOVUxMKQorICAgICAgICBjby0+Y29fem9tYmllZnJhbWUgPSBmOworICAgIGVsc2UgaWYgKG51bWZyZWUgPCBQeUZyYW1lX01BWEZSRUVMSVNUKSB7CisgICAgICAgICsrbnVtZnJlZTsKKyAgICAgICAgZi0+Zl9iYWNrID0gZnJlZV9saXN0OworICAgICAgICBmcmVlX2xpc3QgPSBmOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChmKTsKIAotCVB5X0RFQ1JFRihjbyk7Ci0JUHlfVFJBU0hDQU5fU0FGRV9FTkQoZikKKyAgICBQeV9ERUNSRUYoY28pOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKGYpCiB9CiAKIHN0YXRpYyBpbnQKIGZyYW1lX3RyYXZlcnNlKFB5RnJhbWVPYmplY3QgKmYsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipwOwotCWludCBpLCBzbG90czsKKyAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqcDsKKyAgICBpbnQgaSwgc2xvdHM7CiAKLQlQeV9WSVNJVChmLT5mX2JhY2spOwotCVB5X1ZJU0lUKGYtPmZfY29kZSk7Ci0JUHlfVklTSVQoZi0+Zl9idWlsdGlucyk7Ci0JUHlfVklTSVQoZi0+Zl9nbG9iYWxzKTsKLQlQeV9WSVNJVChmLT5mX2xvY2Fscyk7Ci0JUHlfVklTSVQoZi0+Zl90cmFjZSk7Ci0JUHlfVklTSVQoZi0+Zl9leGNfdHlwZSk7Ci0JUHlfVklTSVQoZi0+Zl9leGNfdmFsdWUpOwotCVB5X1ZJU0lUKGYtPmZfZXhjX3RyYWNlYmFjayk7CisgICAgUHlfVklTSVQoZi0+Zl9iYWNrKTsKKyAgICBQeV9WSVNJVChmLT5mX2NvZGUpOworICAgIFB5X1ZJU0lUKGYtPmZfYnVpbHRpbnMpOworICAgIFB5X1ZJU0lUKGYtPmZfZ2xvYmFscyk7CisgICAgUHlfVklTSVQoZi0+Zl9sb2NhbHMpOworICAgIFB5X1ZJU0lUKGYtPmZfdHJhY2UpOworICAgIFB5X1ZJU0lUKGYtPmZfZXhjX3R5cGUpOworICAgIFB5X1ZJU0lUKGYtPmZfZXhjX3ZhbHVlKTsKKyAgICBQeV9WSVNJVChmLT5mX2V4Y190cmFjZWJhY2spOwogCi0JLyogbG9jYWxzICovCi0Jc2xvdHMgPSBmLT5mX2NvZGUtPmNvX25sb2NhbHMgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMpICsgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKTsKLQlmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwotCWZvciAoaSA9IHNsb3RzOyAtLWkgPj0gMDsgKytmYXN0bG9jYWxzKQotCQlQeV9WSVNJVCgqZmFzdGxvY2Fscyk7CisgICAgLyogbG9jYWxzICovCisgICAgc2xvdHMgPSBmLT5mX2NvZGUtPmNvX25sb2NhbHMgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fY2VsbHZhcnMpICsgUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKTsKKyAgICBmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOworICAgIGZvciAoaSA9IHNsb3RzOyAtLWkgPj0gMDsgKytmYXN0bG9jYWxzKQorICAgICAgICBQeV9WSVNJVCgqZmFzdGxvY2Fscyk7CiAKLQkvKiBzdGFjayAqLwotCWlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKLQkJZm9yIChwID0gZi0+Zl92YWx1ZXN0YWNrOyBwIDwgZi0+Zl9zdGFja3RvcDsgcCsrKQotCQkJUHlfVklTSVQoKnApOwotCX0KLQlyZXR1cm4gMDsKKyAgICAvKiBzdGFjayAqLworICAgIGlmIChmLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChwID0gZi0+Zl92YWx1ZXN0YWNrOyBwIDwgZi0+Zl9zdGFja3RvcDsgcCsrKQorICAgICAgICAgICAgUHlfVklTSVQoKnApOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIGZyYW1lX2NsZWFyKFB5RnJhbWVPYmplY3QgKmYpCiB7Ci0JUHlPYmplY3QgKipmYXN0bG9jYWxzLCAqKnAsICoqb2xkdG9wOwotCWludCBpLCBzbG90czsKKyAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMsICoqcCwgKipvbGR0b3A7CisgICAgaW50IGksIHNsb3RzOwogCi0JLyogQmVmb3JlIGFueXRoaW5nIGVsc2UsIG1ha2Ugc3VyZSB0aGF0IHRoaXMgZnJhbWUgaXMgY2xlYXJseSBtYXJrZWQKLQkgKiBhcyBiZWluZyBkZWZ1bmN0ISAgRWxzZSwgZS5nLiwgYSBnZW5lcmF0b3IgcmVhY2hhYmxlIGZyb20gdGhpcwotCSAqIGZyYW1lIG1heSBhbHNvIHBvaW50IHRvIHRoaXMgZnJhbWUsIGJlbGlldmUgaXRzZWxmIHRvIHN0aWxsIGJlCi0JICogYWN0aXZlLCBhbmQgdHJ5IGNsZWFuaW5nIHVwIHRoaXMgZnJhbWUgYWdhaW4uCi0JICovCi0Jb2xkdG9wID0gZi0+Zl9zdGFja3RvcDsKLQlmLT5mX3N0YWNrdG9wID0gTlVMTDsKKyAgICAvKiBCZWZvcmUgYW55dGhpbmcgZWxzZSwgbWFrZSBzdXJlIHRoYXQgdGhpcyBmcmFtZSBpcyBjbGVhcmx5IG1hcmtlZAorICAgICAqIGFzIGJlaW5nIGRlZnVuY3QhICBFbHNlLCBlLmcuLCBhIGdlbmVyYXRvciByZWFjaGFibGUgZnJvbSB0aGlzCisgICAgICogZnJhbWUgbWF5IGFsc28gcG9pbnQgdG8gdGhpcyBmcmFtZSwgYmVsaWV2ZSBpdHNlbGYgdG8gc3RpbGwgYmUKKyAgICAgKiBhY3RpdmUsIGFuZCB0cnkgY2xlYW5pbmcgdXAgdGhpcyBmcmFtZSBhZ2Fpbi4KKyAgICAgKi8KKyAgICBvbGR0b3AgPSBmLT5mX3N0YWNrdG9wOworICAgIGYtPmZfc3RhY2t0b3AgPSBOVUxMOwogCi0JUHlfQ0xFQVIoZi0+Zl9leGNfdHlwZSk7Ci0JUHlfQ0xFQVIoZi0+Zl9leGNfdmFsdWUpOwotCVB5X0NMRUFSKGYtPmZfZXhjX3RyYWNlYmFjayk7Ci0JUHlfQ0xFQVIoZi0+Zl90cmFjZSk7CisgICAgUHlfQ0xFQVIoZi0+Zl9leGNfdHlwZSk7CisgICAgUHlfQ0xFQVIoZi0+Zl9leGNfdmFsdWUpOworICAgIFB5X0NMRUFSKGYtPmZfZXhjX3RyYWNlYmFjayk7CisgICAgUHlfQ0xFQVIoZi0+Zl90cmFjZSk7CiAKLQkvKiBsb2NhbHMgKi8KLQlzbG90cyA9IGYtPmZfY29kZS0+Y29fbmxvY2FscyArIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19jZWxsdmFycykgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMpOwotCWZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JZm9yIChpID0gc2xvdHM7IC0taSA+PSAwOyArK2Zhc3Rsb2NhbHMpCi0JCVB5X0NMRUFSKCpmYXN0bG9jYWxzKTsKKyAgICAvKiBsb2NhbHMgKi8KKyAgICBzbG90cyA9IGYtPmZfY29kZS0+Y29fbmxvY2FscyArIFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19jZWxsdmFycykgKyBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMpOworICAgIGZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CisgICAgZm9yIChpID0gc2xvdHM7IC0taSA+PSAwOyArK2Zhc3Rsb2NhbHMpCisgICAgICAgIFB5X0NMRUFSKCpmYXN0bG9jYWxzKTsKIAotCS8qIHN0YWNrICovCi0JaWYgKG9sZHRvcCAhPSBOVUxMKSB7Ci0JCWZvciAocCA9IGYtPmZfdmFsdWVzdGFjazsgcCA8IG9sZHRvcDsgcCsrKQotCQkJUHlfQ0xFQVIoKnApOwotCX0KKyAgICAvKiBzdGFjayAqLworICAgIGlmIChvbGR0b3AgIT0gTlVMTCkgeworICAgICAgICBmb3IgKHAgPSBmLT5mX3ZhbHVlc3RhY2s7IHAgPCBvbGR0b3A7IHArKykKKyAgICAgICAgICAgIFB5X0NMRUFSKCpwKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBmcmFtZV9zaXplb2YoUHlGcmFtZU9iamVjdCAqZikKIHsKLQlQeV9zc2l6ZV90IHJlcywgZXh0cmFzLCBuY2VsbHMsIG5mcmVlczsKKyAgICBQeV9zc2l6ZV90IHJlcywgZXh0cmFzLCBuY2VsbHMsIG5mcmVlczsKIAotCW5jZWxscyA9IFB5VHVwbGVfR0VUX1NJWkUoZi0+Zl9jb2RlLT5jb19jZWxsdmFycyk7Ci0JbmZyZWVzID0gUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2ZyZWV2YXJzKTsKLQlleHRyYXMgPSBmLT5mX2NvZGUtPmNvX3N0YWNrc2l6ZSArIGYtPmZfY29kZS0+Y29fbmxvY2FscyArCi0JCSBuY2VsbHMgKyBuZnJlZXM7Ci0JLyogc3VidHJhY3Qgb25lIGFzIGl0IGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gUHlGcmFtZU9iamVjdCAqLwotCXJlcyA9IHNpemVvZihQeUZyYW1lT2JqZWN0KSArIChleHRyYXMtMSkgKiBzaXplb2YoUHlPYmplY3QgKik7CisgICAgbmNlbGxzID0gUHlUdXBsZV9HRVRfU0laRShmLT5mX2NvZGUtPmNvX2NlbGx2YXJzKTsKKyAgICBuZnJlZXMgPSBQeVR1cGxlX0dFVF9TSVpFKGYtPmZfY29kZS0+Y29fZnJlZXZhcnMpOworICAgIGV4dHJhcyA9IGYtPmZfY29kZS0+Y29fc3RhY2tzaXplICsgZi0+Zl9jb2RlLT5jb19ubG9jYWxzICsKKyAgICAgICAgICAgICBuY2VsbHMgKyBuZnJlZXM7CisgICAgLyogc3VidHJhY3Qgb25lIGFzIGl0IGlzIGFscmVhZHkgaW5jbHVkZWQgaW4gUHlGcmFtZU9iamVjdCAqLworICAgIHJlcyA9IHNpemVvZihQeUZyYW1lT2JqZWN0KSArIChleHRyYXMtMSkgKiBzaXplb2YoUHlPYmplY3QgKik7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNpemVvZl9fZG9jX18sCiAiRi5fX3NpemVvZl9fKCkgLT4gc2l6ZSBvZiBGIGluIG1lbW9yeSwgaW4gYnl0ZXMiKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGZyYW1lX21ldGhvZHNbXSA9IHsKLQl7Il9fc2l6ZW9mX18iLAkoUHlDRnVuY3Rpb24pZnJhbWVfc2l6ZW9mLAlNRVRIX05PQVJHUywKLQkgc2l6ZW9mX19kb2NfX30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWZyYW1lX3NpemVvZiwgICAgICBNRVRIX05PQVJHUywKKyAgICAgc2l6ZW9mX19kb2NfX30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlGcmFtZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImZyYW1lIiwKLQlzaXplb2YoUHlGcmFtZU9iamVjdCksCi0Jc2l6ZW9mKFB5T2JqZWN0ICopLAotCShkZXN0cnVjdG9yKWZyYW1lX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKWZyYW1lX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlmcmFtZV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JZnJhbWVfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCWZyYW1lX21lbWJlcmxpc3QsCQkJLyogdHBfbWVtYmVycyAqLwotCWZyYW1lX2dldHNldGxpc3QsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImZyYW1lIiwKKyAgICBzaXplb2YoUHlGcmFtZU9iamVjdCksCisgICAgc2l6ZW9mKFB5T2JqZWN0ICopLAorICAgIChkZXN0cnVjdG9yKWZyYW1lX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpZnJhbWVfdHJhdmVyc2UsICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlmcmFtZV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZnJhbWVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZnJhbWVfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgZnJhbWVfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqYnVpbHRpbl9vYmplY3Q7CiAKIGludCBfUHlGcmFtZV9Jbml0KCkKIHsKLQlidWlsdGluX29iamVjdCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fYnVpbHRpbnNfXyIpOwotCWlmIChidWlsdGluX29iamVjdCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICBidWlsdGluX29iamVjdCA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fYnVpbHRpbnNfXyIpOworICAgIGlmIChidWlsdGluX29iamVjdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogUHlGcmFtZU9iamVjdCAqCiBQeUZyYW1lX05ldyhQeVRocmVhZFN0YXRlICp0c3RhdGUsIFB5Q29kZU9iamVjdCAqY29kZSwgUHlPYmplY3QgKmdsb2JhbHMsCi0JICAgIFB5T2JqZWN0ICpsb2NhbHMpCisgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzKQogewotCVB5RnJhbWVPYmplY3QgKmJhY2sgPSB0c3RhdGUtPmZyYW1lOwotCVB5RnJhbWVPYmplY3QgKmY7Ci0JUHlPYmplY3QgKmJ1aWx0aW5zOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeUZyYW1lT2JqZWN0ICpiYWNrID0gdHN0YXRlLT5mcmFtZTsKKyAgICBQeUZyYW1lT2JqZWN0ICpmOworICAgIFB5T2JqZWN0ICpidWlsdGluczsKKyAgICBQeV9zc2l6ZV90IGk7CiAKICNpZmRlZiBQeV9ERUJVRwotCWlmIChjb2RlID09IE5VTEwgfHwgZ2xvYmFscyA9PSBOVUxMIHx8ICFQeURpY3RfQ2hlY2soZ2xvYmFscykgfHwKLQkgICAgKGxvY2FscyAhPSBOVUxMICYmICFQeU1hcHBpbmdfQ2hlY2sobG9jYWxzKSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoY29kZSA9PSBOVUxMIHx8IGdsb2JhbHMgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGdsb2JhbHMpIHx8CisgICAgICAgIChsb2NhbHMgIT0gTlVMTCAmJiAhUHlNYXBwaW5nX0NoZWNrKGxvY2FscykpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlpZiAoYmFjayA9PSBOVUxMIHx8IGJhY2stPmZfZ2xvYmFscyAhPSBnbG9iYWxzKSB7Ci0JCWJ1aWx0aW5zID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgYnVpbHRpbl9vYmplY3QpOwotCQlpZiAoYnVpbHRpbnMpIHsKLQkJCWlmIChQeU1vZHVsZV9DaGVjayhidWlsdGlucykpIHsKLQkJCQlidWlsdGlucyA9IFB5TW9kdWxlX0dldERpY3QoYnVpbHRpbnMpOwotCQkJCWFzc2VydCghYnVpbHRpbnMgfHwgUHlEaWN0X0NoZWNrKGJ1aWx0aW5zKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICghUHlEaWN0X0NoZWNrKGJ1aWx0aW5zKSkKLQkJCQlidWlsdGlucyA9IE5VTEw7Ci0JCX0KLQkJaWYgKGJ1aWx0aW5zID09IE5VTEwpIHsKLQkJCS8qIE5vIGJ1aWx0aW5zIQkgTWFrZSB1cCBhIG1pbmltYWwgb25lCi0JCQkgICBHaXZlIHRoZW0gJ05vbmUnLCBhdCBsZWFzdC4gKi8KLQkJCWJ1aWx0aW5zID0gUHlEaWN0X05ldygpOwotCQkJaWYgKGJ1aWx0aW5zID09IE5VTEwgfHwKLQkJCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZygKLQkJCQkgICAgYnVpbHRpbnMsICJOb25lIiwgUHlfTm9uZSkgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVsc2UKLQkJCVB5X0lOQ1JFRihidWlsdGlucyk7CisgICAgaWYgKGJhY2sgPT0gTlVMTCB8fCBiYWNrLT5mX2dsb2JhbHMgIT0gZ2xvYmFscykgeworICAgICAgICBidWlsdGlucyA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIGJ1aWx0aW5fb2JqZWN0KTsKKyAgICAgICAgaWYgKGJ1aWx0aW5zKSB7CisgICAgICAgICAgICBpZiAoUHlNb2R1bGVfQ2hlY2soYnVpbHRpbnMpKSB7CisgICAgICAgICAgICAgICAgYnVpbHRpbnMgPSBQeU1vZHVsZV9HZXREaWN0KGJ1aWx0aW5zKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIWJ1aWx0aW5zIHx8IFB5RGljdF9DaGVjayhidWlsdGlucykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIVB5RGljdF9DaGVjayhidWlsdGlucykpCisgICAgICAgICAgICAgICAgYnVpbHRpbnMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChidWlsdGlucyA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBObyBidWlsdGlucyEgICAgICAgICAgICAgIE1ha2UgdXAgYSBtaW5pbWFsIG9uZQorICAgICAgICAgICAgICAgR2l2ZSB0aGVtICdOb25lJywgYXQgbGVhc3QuICovCisgICAgICAgICAgICBidWlsdGlucyA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgICAgIGlmIChidWlsdGlucyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5zLCAiTm9uZSIsIFB5X05vbmUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9JTkNSRUYoYnVpbHRpbnMpOwogCi0JfQotCWVsc2UgewotCQkvKiBJZiB3ZSBzaGFyZSB0aGUgZ2xvYmFscywgd2Ugc2hhcmUgdGhlIGJ1aWx0aW5zLgotCQkgICBTYXZlIGEgbG9va3VwIGFuZCBhIGNhbGwuICovCi0JCWJ1aWx0aW5zID0gYmFjay0+Zl9idWlsdGluczsKLQkJYXNzZXJ0KGJ1aWx0aW5zICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGJ1aWx0aW5zKSk7Ci0JCVB5X0lOQ1JFRihidWlsdGlucyk7Ci0JfQotCWlmIChjb2RlLT5jb196b21iaWVmcmFtZSAhPSBOVUxMKSB7Ci0JCWYgPSBjb2RlLT5jb196b21iaWVmcmFtZTsKLQkJY29kZS0+Y29fem9tYmllZnJhbWUgPSBOVUxMOwotCQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKWYpOwotCQlhc3NlcnQoZi0+Zl9jb2RlID09IGNvZGUpOwotCX0KLQllbHNlIHsKLQkJUHlfc3NpemVfdCBleHRyYXMsIG5jZWxscywgbmZyZWVzOwotCQluY2VsbHMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvZGUtPmNvX2NlbGx2YXJzKTsKLQkJbmZyZWVzID0gUHlUdXBsZV9HRVRfU0laRShjb2RlLT5jb19mcmVldmFycyk7Ci0JCWV4dHJhcyA9IGNvZGUtPmNvX3N0YWNrc2l6ZSArIGNvZGUtPmNvX25sb2NhbHMgKyBuY2VsbHMgKwotCQkgICAgbmZyZWVzOwotCQlpZiAoZnJlZV9saXN0ID09IE5VTEwpIHsKLQkJICAgIGYgPSBQeU9iamVjdF9HQ19OZXdWYXIoUHlGcmFtZU9iamVjdCwgJlB5RnJhbWVfVHlwZSwKLQkJCWV4dHJhcyk7Ci0JCSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0JCQkgICAgUHlfREVDUkVGKGJ1aWx0aW5zKTsKLQkJCSAgICByZXR1cm4gTlVMTDsKLQkJICAgIH0KLQkJfQotCQllbHNlIHsKLQkJICAgIGFzc2VydChudW1mcmVlID4gMCk7Ci0JCSAgICAtLW51bWZyZWU7Ci0JCSAgICBmID0gZnJlZV9saXN0OwotCQkgICAgZnJlZV9saXN0ID0gZnJlZV9saXN0LT5mX2JhY2s7Ci0JCSAgICBpZiAoUHlfU0laRShmKSA8IGV4dHJhcykgewotCQkJICAgIGYgPSBQeU9iamVjdF9HQ19SZXNpemUoUHlGcmFtZU9iamVjdCwgZiwgZXh0cmFzKTsKLQkJCSAgICBpZiAoZiA9PSBOVUxMKSB7Ci0JCQkJICAgIFB5X0RFQ1JFRihidWlsdGlucyk7Ci0JCQkJICAgIHJldHVybiBOVUxMOwotCQkJICAgIH0KLQkJICAgIH0KLQkJICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopZik7Ci0JCX0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIElmIHdlIHNoYXJlIHRoZSBnbG9iYWxzLCB3ZSBzaGFyZSB0aGUgYnVpbHRpbnMuCisgICAgICAgICAgIFNhdmUgYSBsb29rdXAgYW5kIGEgY2FsbC4gKi8KKyAgICAgICAgYnVpbHRpbnMgPSBiYWNrLT5mX2J1aWx0aW5zOworICAgICAgICBhc3NlcnQoYnVpbHRpbnMgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soYnVpbHRpbnMpKTsKKyAgICAgICAgUHlfSU5DUkVGKGJ1aWx0aW5zKTsKKyAgICB9CisgICAgaWYgKGNvZGUtPmNvX3pvbWJpZWZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgZiA9IGNvZGUtPmNvX3pvbWJpZWZyYW1lOworICAgICAgICBjb2RlLT5jb196b21iaWVmcmFtZSA9IE5VTEw7CisgICAgICAgIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopZik7CisgICAgICAgIGFzc2VydChmLT5mX2NvZGUgPT0gY29kZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9zc2l6ZV90IGV4dHJhcywgbmNlbGxzLCBuZnJlZXM7CisgICAgICAgIG5jZWxscyA9IFB5VHVwbGVfR0VUX1NJWkUoY29kZS0+Y29fY2VsbHZhcnMpOworICAgICAgICBuZnJlZXMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvZGUtPmNvX2ZyZWV2YXJzKTsKKyAgICAgICAgZXh0cmFzID0gY29kZS0+Y29fc3RhY2tzaXplICsgY29kZS0+Y29fbmxvY2FscyArIG5jZWxscyArCisgICAgICAgICAgICBuZnJlZXM7CisgICAgICAgIGlmIChmcmVlX2xpc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgZiA9IFB5T2JqZWN0X0dDX05ld1ZhcihQeUZyYW1lT2JqZWN0LCAmUHlGcmFtZV9UeXBlLAorICAgICAgICAgICAgZXh0cmFzKTsKKyAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYnVpbHRpbnMpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KG51bWZyZWUgPiAwKTsKKyAgICAgICAgICAgIC0tbnVtZnJlZTsKKyAgICAgICAgICAgIGYgPSBmcmVlX2xpc3Q7CisgICAgICAgICAgICBmcmVlX2xpc3QgPSBmcmVlX2xpc3QtPmZfYmFjazsKKyAgICAgICAgICAgIGlmIChQeV9TSVpFKGYpIDwgZXh0cmFzKSB7CisgICAgICAgICAgICAgICAgZiA9IFB5T2JqZWN0X0dDX1Jlc2l6ZShQeUZyYW1lT2JqZWN0LCBmLCBleHRyYXMpOworICAgICAgICAgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGJ1aWx0aW5zKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilmKTsKKyAgICAgICAgfQogCi0JCWYtPmZfY29kZSA9IGNvZGU7Ci0JCWV4dHJhcyA9IGNvZGUtPmNvX25sb2NhbHMgKyBuY2VsbHMgKyBuZnJlZXM7Ci0JCWYtPmZfdmFsdWVzdGFjayA9IGYtPmZfbG9jYWxzcGx1cyArIGV4dHJhczsKLQkJZm9yIChpPTA7IGk8ZXh0cmFzOyBpKyspCi0JCQlmLT5mX2xvY2Fsc3BsdXNbaV0gPSBOVUxMOwotCQlmLT5mX2xvY2FscyA9IE5VTEw7Ci0JCWYtPmZfdHJhY2UgPSBOVUxMOwotCQlmLT5mX2V4Y190eXBlID0gZi0+Zl9leGNfdmFsdWUgPSBmLT5mX2V4Y190cmFjZWJhY2sgPSBOVUxMOwotCX0KLQlmLT5mX3N0YWNrdG9wID0gZi0+Zl92YWx1ZXN0YWNrOwotCWYtPmZfYnVpbHRpbnMgPSBidWlsdGluczsKLQlQeV9YSU5DUkVGKGJhY2spOwotCWYtPmZfYmFjayA9IGJhY2s7Ci0JUHlfSU5DUkVGKGNvZGUpOwotCVB5X0lOQ1JFRihnbG9iYWxzKTsKLQlmLT5mX2dsb2JhbHMgPSBnbG9iYWxzOwotCS8qIE1vc3QgZnVuY3Rpb25zIGhhdmUgQ09fTkVXTE9DQUxTIGFuZCBDT19PUFRJTUlaRUQgc2V0LiAqLwotCWlmICgoY29kZS0+Y29fZmxhZ3MgJiAoQ09fTkVXTE9DQUxTIHwgQ09fT1BUSU1JWkVEKSkgPT0KLQkJKENPX05FV0xPQ0FMUyB8IENPX09QVElNSVpFRCkpCi0JCTsgLyogZl9sb2NhbHMgPSBOVUxMOyB3aWxsIGJlIHNldCBieSBQeUZyYW1lX0Zhc3RUb0xvY2FscygpICovCi0JZWxzZSBpZiAoY29kZS0+Y29fZmxhZ3MgJiBDT19ORVdMT0NBTFMpIHsKLQkJbG9jYWxzID0gUHlEaWN0X05ldygpOwotCQlpZiAobG9jYWxzID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihmKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWYtPmZfbG9jYWxzID0gbG9jYWxzOwotCX0KLQllbHNlIHsKLQkJaWYgKGxvY2FscyA9PSBOVUxMKQotCQkJbG9jYWxzID0gZ2xvYmFsczsKLQkJUHlfSU5DUkVGKGxvY2Fscyk7Ci0JCWYtPmZfbG9jYWxzID0gbG9jYWxzOwotCX0KLQlmLT5mX3RzdGF0ZSA9IHRzdGF0ZTsKKyAgICAgICAgZi0+Zl9jb2RlID0gY29kZTsKKyAgICAgICAgZXh0cmFzID0gY29kZS0+Y29fbmxvY2FscyArIG5jZWxscyArIG5mcmVlczsKKyAgICAgICAgZi0+Zl92YWx1ZXN0YWNrID0gZi0+Zl9sb2NhbHNwbHVzICsgZXh0cmFzOworICAgICAgICBmb3IgKGk9MDsgaTxleHRyYXM7IGkrKykKKyAgICAgICAgICAgIGYtPmZfbG9jYWxzcGx1c1tpXSA9IE5VTEw7CisgICAgICAgIGYtPmZfbG9jYWxzID0gTlVMTDsKKyAgICAgICAgZi0+Zl90cmFjZSA9IE5VTEw7CisgICAgICAgIGYtPmZfZXhjX3R5cGUgPSBmLT5mX2V4Y192YWx1ZSA9IGYtPmZfZXhjX3RyYWNlYmFjayA9IE5VTEw7CisgICAgfQorICAgIGYtPmZfc3RhY2t0b3AgPSBmLT5mX3ZhbHVlc3RhY2s7CisgICAgZi0+Zl9idWlsdGlucyA9IGJ1aWx0aW5zOworICAgIFB5X1hJTkNSRUYoYmFjayk7CisgICAgZi0+Zl9iYWNrID0gYmFjazsKKyAgICBQeV9JTkNSRUYoY29kZSk7CisgICAgUHlfSU5DUkVGKGdsb2JhbHMpOworICAgIGYtPmZfZ2xvYmFscyA9IGdsb2JhbHM7CisgICAgLyogTW9zdCBmdW5jdGlvbnMgaGF2ZSBDT19ORVdMT0NBTFMgYW5kIENPX09QVElNSVpFRCBzZXQuICovCisgICAgaWYgKChjb2RlLT5jb19mbGFncyAmIChDT19ORVdMT0NBTFMgfCBDT19PUFRJTUlaRUQpKSA9PQorICAgICAgICAoQ09fTkVXTE9DQUxTIHwgQ09fT1BUSU1JWkVEKSkKKyAgICAgICAgOyAvKiBmX2xvY2FscyA9IE5VTEw7IHdpbGwgYmUgc2V0IGJ5IFB5RnJhbWVfRmFzdFRvTG9jYWxzKCkgKi8KKyAgICBlbHNlIGlmIChjb2RlLT5jb19mbGFncyAmIENPX05FV0xPQ0FMUykgeworICAgICAgICBsb2NhbHMgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChsb2NhbHMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZi0+Zl9sb2NhbHMgPSBsb2NhbHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobG9jYWxzID09IE5VTEwpCisgICAgICAgICAgICBsb2NhbHMgPSBnbG9iYWxzOworICAgICAgICBQeV9JTkNSRUYobG9jYWxzKTsKKyAgICAgICAgZi0+Zl9sb2NhbHMgPSBsb2NhbHM7CisgICAgfQorICAgIGYtPmZfdHN0YXRlID0gdHN0YXRlOwogCi0JZi0+Zl9sYXN0aSA9IC0xOwotCWYtPmZfbGluZW5vID0gY29kZS0+Y29fZmlyc3RsaW5lbm87Ci0JZi0+Zl9pYmxvY2sgPSAwOworICAgIGYtPmZfbGFzdGkgPSAtMTsKKyAgICBmLT5mX2xpbmVubyA9IGNvZGUtPmNvX2ZpcnN0bGluZW5vOworICAgIGYtPmZfaWJsb2NrID0gMDsKIAotCV9QeU9iamVjdF9HQ19UUkFDSyhmKTsKLQlyZXR1cm4gZjsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soZik7CisgICAgcmV0dXJuIGY7CiB9CiAKIC8qIEJsb2NrIG1hbmFnZW1lbnQgKi8KQEAgLTcxMCwyOCArNzEwLDI4IEBACiB2b2lkCiBQeUZyYW1lX0Jsb2NrU2V0dXAoUHlGcmFtZU9iamVjdCAqZiwgaW50IHR5cGUsIGludCBoYW5kbGVyLCBpbnQgbGV2ZWwpCiB7Ci0JUHlUcnlCbG9jayAqYjsKLQlpZiAoZi0+Zl9pYmxvY2sgPj0gQ09fTUFYQkxPQ0tTKQotCQlQeV9GYXRhbEVycm9yKCJYWFggYmxvY2sgc3RhY2sgb3ZlcmZsb3ciKTsKLQliID0gJmYtPmZfYmxvY2tzdGFja1tmLT5mX2libG9jaysrXTsKLQliLT5iX3R5cGUgPSB0eXBlOwotCWItPmJfbGV2ZWwgPSBsZXZlbDsKLQliLT5iX2hhbmRsZXIgPSBoYW5kbGVyOworICAgIFB5VHJ5QmxvY2sgKmI7CisgICAgaWYgKGYtPmZfaWJsb2NrID49IENPX01BWEJMT0NLUykKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiWFhYIGJsb2NrIHN0YWNrIG92ZXJmbG93Iik7CisgICAgYiA9ICZmLT5mX2Jsb2Nrc3RhY2tbZi0+Zl9pYmxvY2srK107CisgICAgYi0+Yl90eXBlID0gdHlwZTsKKyAgICBiLT5iX2xldmVsID0gbGV2ZWw7CisgICAgYi0+Yl9oYW5kbGVyID0gaGFuZGxlcjsKIH0KIAogUHlUcnlCbG9jayAqCiBQeUZyYW1lX0Jsb2NrUG9wKFB5RnJhbWVPYmplY3QgKmYpCiB7Ci0JUHlUcnlCbG9jayAqYjsKLQlpZiAoZi0+Zl9pYmxvY2sgPD0gMCkKLQkJUHlfRmF0YWxFcnJvcigiWFhYIGJsb2NrIHN0YWNrIHVuZGVyZmxvdyIpOwotCWIgPSAmZi0+Zl9ibG9ja3N0YWNrWy0tZi0+Zl9pYmxvY2tdOwotCXJldHVybiBiOworICAgIFB5VHJ5QmxvY2sgKmI7CisgICAgaWYgKGYtPmZfaWJsb2NrIDw9IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlhYWCBibG9jayBzdGFjayB1bmRlcmZsb3ciKTsKKyAgICBiID0gJmYtPmZfYmxvY2tzdGFja1stLWYtPmZfaWJsb2NrXTsKKyAgICByZXR1cm4gYjsKIH0KIAogLyogQ29udmVydCBiZXR3ZWVuICJmYXN0IiB2ZXJzaW9uIG9mIGxvY2FscyBhbmQgZGljdGlvbmFyeSB2ZXJzaW9uLgotICAgCi0gICBtYXAgYW5kIHZhbHVlcyBhcmUgaW5wdXQgYXJndW1lbnRzLgltYXAgaXMgYSB0dXBsZSBvZiBzdHJpbmdzLgorCisgICBtYXAgYW5kIHZhbHVlcyBhcmUgaW5wdXQgYXJndW1lbnRzLiAgbWFwIGlzIGEgdHVwbGUgb2Ygc3RyaW5ncy4KICAgIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBQeU9iamVjdCouICBBdCBpbmRleCBpLCBtYXBbaV0gaXMgdGhlIG5hbWUgb2YKICAgIHRoZSB2YXJpYWJsZSB3aXRoIHZhbHVlIHZhbHVlc1tpXS4gIFRoZSBmdW5jdGlvbiBjb3BpZXMgdGhlIGZpcnN0CiAgICBubWFwIHZhcmlhYmxlIGZyb20gbWFwL3ZhbHVlcyBpbnRvIGRpY3QuICBJZiB2YWx1ZXNbaV0gaXMgTlVMTCwKQEAgLTc0NywyOSArNzQ3LDI5IEBACiAKIHN0YXRpYyB2b2lkCiBtYXBfdG9fZGljdChQeU9iamVjdCAqbWFwLCBQeV9zc2l6ZV90IG5tYXAsIFB5T2JqZWN0ICpkaWN0LCBQeU9iamVjdCAqKnZhbHVlcywKLQkgICAgaW50IGRlcmVmKQorICAgICAgICAgICAgaW50IGRlcmVmKQogewotCVB5X3NzaXplX3QgajsKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhtYXApKTsKLQlhc3NlcnQoUHlEaWN0X0NoZWNrKGRpY3QpKTsKLQlhc3NlcnQoUHlUdXBsZV9TaXplKG1hcCkgPj0gbm1hcCk7Ci0JZm9yIChqID0gbm1hcDsgLS1qID49IDA7ICkgewotCQlQeU9iamVjdCAqa2V5ID0gUHlUdXBsZV9HRVRfSVRFTShtYXAsIGopOwotCQlQeU9iamVjdCAqdmFsdWUgPSB2YWx1ZXNbal07Ci0JCWFzc2VydChQeVN0cmluZ19DaGVjayhrZXkpKTsKLQkJaWYgKGRlcmVmKSB7Ci0JCQlhc3NlcnQoUHlDZWxsX0NoZWNrKHZhbHVlKSk7Ci0JCQl2YWx1ZSA9IFB5Q2VsbF9HRVQodmFsdWUpOwotCQl9Ci0JCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlPYmplY3RfRGVsSXRlbShkaWN0LCBrZXkpICE9IDApCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChQeU9iamVjdF9TZXRJdGVtKGRpY3QsIGtleSwgdmFsdWUpICE9IDApCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCX0KKyAgICBQeV9zc2l6ZV90IGo7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobWFwKSk7CisgICAgYXNzZXJ0KFB5RGljdF9DaGVjayhkaWN0KSk7CisgICAgYXNzZXJ0KFB5VHVwbGVfU2l6ZShtYXApID49IG5tYXApOworICAgIGZvciAoaiA9IG5tYXA7IC0taiA+PSAwOyApIHsKKyAgICAgICAgUHlPYmplY3QgKmtleSA9IFB5VHVwbGVfR0VUX0lURU0obWFwLCBqKTsKKyAgICAgICAgUHlPYmplY3QgKnZhbHVlID0gdmFsdWVzW2pdOworICAgICAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2soa2V5KSk7CisgICAgICAgIGlmIChkZXJlZikgeworICAgICAgICAgICAgYXNzZXJ0KFB5Q2VsbF9DaGVjayh2YWx1ZSkpOworICAgICAgICAgICAgdmFsdWUgPSBQeUNlbGxfR0VUKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X0RlbEl0ZW0oZGljdCwga2V5KSAhPSAwKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0SXRlbShkaWN0LCBrZXksIHZhbHVlKSAhPSAwKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8qIENvcHkgdmFsdWVzIGZyb20gdGhlICJsb2NhbHMiIGRpY3QgaW50byB0aGUgZmFzdCBsb2NhbHMuCkBAIC03NzcsNyArNzc3LDcgQEAKICAgIGRpY3QgaXMgYW4gaW5wdXQgYXJndW1lbnQgY29udGFpbmluZyBzdHJpbmcga2V5cyByZXByZXNlbnRpbmcKICAgIHZhcmlhYmxlcyBuYW1lcyBhbmQgYXJiaXRyYXJ5IFB5T2JqZWN0KiBhcyB2YWx1ZXMuCiAKLSAgIG1hcCBhbmQgdmFsdWVzIGFyZSBpbnB1dCBhcmd1bWVudHMuCW1hcCBpcyBhIHR1cGxlIG9mIHN0cmluZ3MuCisgICBtYXAgYW5kIHZhbHVlcyBhcmUgaW5wdXQgYXJndW1lbnRzLiAgbWFwIGlzIGEgdHVwbGUgb2Ygc3RyaW5ncy4KICAgIHZhbHVlcyBpcyBhbiBhcnJheSBvZiBQeU9iamVjdCouICBBdCBpbmRleCBpLCBtYXBbaV0gaXMgdGhlIG5hbWUgb2YKICAgIHRoZSB2YXJpYWJsZSB3aXRoIHZhbHVlIHZhbHVlc1tpXS4gIFRoZSBmdW5jdGlvbiBjb3BpZXMgdGhlIGZpcnN0CiAgICBubWFwIHZhcmlhYmxlIGZyb20gbWFwL3ZhbHVlcyBpbnRvIGRpY3QuICBJZiB2YWx1ZXNbaV0gaXMgTlVMTCwKQEAgLTc5NSwxNTAgKzc5NSwxNTAgQEAKIAogc3RhdGljIHZvaWQKIGRpY3RfdG9fbWFwKFB5T2JqZWN0ICptYXAsIFB5X3NzaXplX3Qgbm1hcCwgUHlPYmplY3QgKmRpY3QsIFB5T2JqZWN0ICoqdmFsdWVzLAotCSAgICBpbnQgZGVyZWYsIGludCBjbGVhcikKKyAgICAgICAgICAgIGludCBkZXJlZiwgaW50IGNsZWFyKQogewotCVB5X3NzaXplX3QgajsKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhtYXApKTsKLQlhc3NlcnQoUHlEaWN0X0NoZWNrKGRpY3QpKTsKLQlhc3NlcnQoUHlUdXBsZV9TaXplKG1hcCkgPj0gbm1hcCk7Ci0JZm9yIChqID0gbm1hcDsgLS1qID49IDA7ICkgewotCQlQeU9iamVjdCAqa2V5ID0gUHlUdXBsZV9HRVRfSVRFTShtYXAsIGopOwotCQlQeU9iamVjdCAqdmFsdWUgPSBQeU9iamVjdF9HZXRJdGVtKGRpY3QsIGtleSk7Ci0JCWFzc2VydChQeVN0cmluZ19DaGVjayhrZXkpKTsKLQkJLyogV2Ugb25seSBjYXJlIGFib3V0IE5VTExzIGlmIGNsZWFyIGlzIHRydWUuICovCi0JCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJaWYgKCFjbGVhcikKLQkJCQljb250aW51ZTsKLQkJfQotCQlpZiAoZGVyZWYpIHsKLQkJCWFzc2VydChQeUNlbGxfQ2hlY2sodmFsdWVzW2pdKSk7Ci0JCQlpZiAoUHlDZWxsX0dFVCh2YWx1ZXNbal0pICE9IHZhbHVlKSB7Ci0JCQkJaWYgKFB5Q2VsbF9TZXQodmFsdWVzW2pdLCB2YWx1ZSkgPCAwKQotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJfQotCQl9IGVsc2UgaWYgKHZhbHVlc1tqXSAhPSB2YWx1ZSkgewotCQkJUHlfWElOQ1JFRih2YWx1ZSk7Ci0JCQlQeV9YREVDUkVGKHZhbHVlc1tqXSk7Ci0JCQl2YWx1ZXNbal0gPSB2YWx1ZTsKLQkJfQotCQlQeV9YREVDUkVGKHZhbHVlKTsKLQl9CisgICAgUHlfc3NpemVfdCBqOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKG1hcCkpOworICAgIGFzc2VydChQeURpY3RfQ2hlY2soZGljdCkpOworICAgIGFzc2VydChQeVR1cGxlX1NpemUobWFwKSA+PSBubWFwKTsKKyAgICBmb3IgKGogPSBubWFwOyAtLWogPj0gMDsgKSB7CisgICAgICAgIFB5T2JqZWN0ICprZXkgPSBQeVR1cGxlX0dFVF9JVEVNKG1hcCwgaik7CisgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IFB5T2JqZWN0X0dldEl0ZW0oZGljdCwga2V5KTsKKyAgICAgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKGtleSkpOworICAgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgTlVMTHMgaWYgY2xlYXIgaXMgdHJ1ZS4gKi8KKyAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBpZiAoIWNsZWFyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChkZXJlZikgeworICAgICAgICAgICAgYXNzZXJ0KFB5Q2VsbF9DaGVjayh2YWx1ZXNbal0pKTsKKyAgICAgICAgICAgIGlmIChQeUNlbGxfR0VUKHZhbHVlc1tqXSkgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlDZWxsX1NldCh2YWx1ZXNbal0sIHZhbHVlKSA8IDApCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWVzW2pdICE9IHZhbHVlKSB7CisgICAgICAgICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodmFsdWVzW2pdKTsKKyAgICAgICAgICAgIHZhbHVlc1tqXSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOworICAgIH0KIH0KIAogdm9pZAogUHlGcmFtZV9GYXN0VG9Mb2NhbHMoUHlGcmFtZU9iamVjdCAqZikKIHsKLQkvKiBNZXJnZSBmYXN0IGxvY2FscyBpbnRvIGYtPmZfbG9jYWxzICovCi0JUHlPYmplY3QgKmxvY2FscywgKm1hcDsKLQlQeU9iamVjdCAqKmZhc3Q7Ci0JUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5X3NzaXplX3QgajsKLQlpbnQgbmNlbGxzLCBuZnJlZXZhcnM7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWxvY2FscyA9IGYtPmZfbG9jYWxzOwotCWlmIChsb2NhbHMgPT0gTlVMTCkgewotCQlsb2NhbHMgPSBmLT5mX2xvY2FscyA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKGxvY2FscyA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOyAvKiBDYW4ndCByZXBvcnQgaXQgOi0oICovCi0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JY28gPSBmLT5mX2NvZGU7Ci0JbWFwID0gY28tPmNvX3Zhcm5hbWVzOwotCWlmICghUHlUdXBsZV9DaGVjayhtYXApKQotCQlyZXR1cm47Ci0JUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7Ci0JZmFzdCA9IGYtPmZfbG9jYWxzcGx1czsKLQlqID0gUHlUdXBsZV9HRVRfU0laRShtYXApOwotCWlmIChqID4gY28tPmNvX25sb2NhbHMpCi0JCWogPSBjby0+Y29fbmxvY2FsczsKLQlpZiAoY28tPmNvX25sb2NhbHMpCi0JCW1hcF90b19kaWN0KG1hcCwgaiwgbG9jYWxzLCBmYXN0LCAwKTsKLQluY2VsbHMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycyk7Ci0JbmZyZWV2YXJzID0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOwotCWlmIChuY2VsbHMgfHwgbmZyZWV2YXJzKSB7Ci0JCW1hcF90b19kaWN0KGNvLT5jb19jZWxsdmFycywgbmNlbGxzLAotCQkJICAgIGxvY2FscywgZmFzdCArIGNvLT5jb19ubG9jYWxzLCAxKTsKLQkJLyogSWYgdGhlIG5hbWVzcGFjZSBpcyB1bm9wdGltaXplZCwgdGhlbiBvbmUgb2YgdGhlIAotCQkgICBmb2xsb3dpbmcgY2FzZXMgYXBwbGllczoKLQkJICAgMS4gSXQgZG9lcyBub3QgY29udGFpbiBmcmVlIHZhcmlhYmxlcywgYmVjYXVzZSBpdAotCQkgICAgICB1c2VzIGltcG9ydCAqIG9yIGlzIGEgdG9wLWxldmVsIG5hbWVzcGFjZS4KLQkJICAgMi4gSXQgaXMgYSBjbGFzcyBuYW1lc3BhY2UuCi0JCSAgIFdlIGRvbid0IHdhbnQgdG8gYWNjaWRlbnRhbGx5IGNvcHkgZnJlZSB2YXJpYWJsZXMKLQkJICAgaW50byB0aGUgbG9jYWxzIGRpY3QgdXNlZCBieSB0aGUgY2xhc3MuCi0JCSovCi0JCWlmIChjby0+Y29fZmxhZ3MgJiBDT19PUFRJTUlaRUQpIHsKLQkJCW1hcF90b19kaWN0KGNvLT5jb19mcmVldmFycywgbmZyZWV2YXJzLAotCQkJCSAgICBsb2NhbHMsIGZhc3QgKyBjby0+Y29fbmxvY2FscyArIG5jZWxscywgMSk7Ci0JCX0KLQl9Ci0JUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKKyAgICAvKiBNZXJnZSBmYXN0IGxvY2FscyBpbnRvIGYtPmZfbG9jYWxzICovCisgICAgUHlPYmplY3QgKmxvY2FscywgKm1hcDsKKyAgICBQeU9iamVjdCAqKmZhc3Q7CisgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKKyAgICBQeUNvZGVPYmplY3QgKmNvOworICAgIFB5X3NzaXplX3QgajsKKyAgICBpbnQgbmNlbGxzLCBuZnJlZXZhcnM7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGxvY2FscyA9IGYtPmZfbG9jYWxzOworICAgIGlmIChsb2NhbHMgPT0gTlVMTCkgeworICAgICAgICBsb2NhbHMgPSBmLT5mX2xvY2FscyA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGxvY2FscyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBDYW4ndCByZXBvcnQgaXQgOi0oICovCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgY28gPSBmLT5mX2NvZGU7CisgICAgbWFwID0gY28tPmNvX3Zhcm5hbWVzOworICAgIGlmICghUHlUdXBsZV9DaGVjayhtYXApKQorICAgICAgICByZXR1cm47CisgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisgICAgZmFzdCA9IGYtPmZfbG9jYWxzcGx1czsKKyAgICBqID0gUHlUdXBsZV9HRVRfU0laRShtYXApOworICAgIGlmIChqID4gY28tPmNvX25sb2NhbHMpCisgICAgICAgIGogPSBjby0+Y29fbmxvY2FsczsKKyAgICBpZiAoY28tPmNvX25sb2NhbHMpCisgICAgICAgIG1hcF90b19kaWN0KG1hcCwgaiwgbG9jYWxzLCBmYXN0LCAwKTsKKyAgICBuY2VsbHMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycyk7CisgICAgbmZyZWV2YXJzID0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOworICAgIGlmIChuY2VsbHMgfHwgbmZyZWV2YXJzKSB7CisgICAgICAgIG1hcF90b19kaWN0KGNvLT5jb19jZWxsdmFycywgbmNlbGxzLAorICAgICAgICAgICAgICAgICAgICBsb2NhbHMsIGZhc3QgKyBjby0+Y29fbmxvY2FscywgMSk7CisgICAgICAgIC8qIElmIHRoZSBuYW1lc3BhY2UgaXMgdW5vcHRpbWl6ZWQsIHRoZW4gb25lIG9mIHRoZQorICAgICAgICAgICBmb2xsb3dpbmcgY2FzZXMgYXBwbGllczoKKyAgICAgICAgICAgMS4gSXQgZG9lcyBub3QgY29udGFpbiBmcmVlIHZhcmlhYmxlcywgYmVjYXVzZSBpdAorICAgICAgICAgICAgICB1c2VzIGltcG9ydCAqIG9yIGlzIGEgdG9wLWxldmVsIG5hbWVzcGFjZS4KKyAgICAgICAgICAgMi4gSXQgaXMgYSBjbGFzcyBuYW1lc3BhY2UuCisgICAgICAgICAgIFdlIGRvbid0IHdhbnQgdG8gYWNjaWRlbnRhbGx5IGNvcHkgZnJlZSB2YXJpYWJsZXMKKyAgICAgICAgICAgaW50byB0aGUgbG9jYWxzIGRpY3QgdXNlZCBieSB0aGUgY2xhc3MuCisgICAgICAgICovCisgICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19PUFRJTUlaRUQpIHsKKyAgICAgICAgICAgIG1hcF90b19kaWN0KGNvLT5jb19mcmVldmFycywgbmZyZWV2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxzLCBmYXN0ICsgY28tPmNvX25sb2NhbHMgKyBuY2VsbHMsIDEpOworICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7CiB9CiAKIHZvaWQKIFB5RnJhbWVfTG9jYWxzVG9GYXN0KFB5RnJhbWVPYmplY3QgKmYsIGludCBjbGVhcikKIHsKLQkvKiBNZXJnZSBmLT5mX2xvY2FscyBpbnRvIGZhc3QgbG9jYWxzICovCi0JUHlPYmplY3QgKmxvY2FscywgKm1hcDsKLQlQeU9iamVjdCAqKmZhc3Q7Ci0JUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5X3NzaXplX3QgajsKLQlpbnQgbmNlbGxzLCBuZnJlZXZhcnM7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWxvY2FscyA9IGYtPmZfbG9jYWxzOwotCWNvID0gZi0+Zl9jb2RlOwotCW1hcCA9IGNvLT5jb192YXJuYW1lczsKLQlpZiAobG9jYWxzID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAoIVB5VHVwbGVfQ2hlY2sobWFwKSkKLQkJcmV0dXJuOwotCVB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwotCWZhc3QgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JaiA9IFB5VHVwbGVfR0VUX1NJWkUobWFwKTsKLQlpZiAoaiA+IGNvLT5jb19ubG9jYWxzKQotCQlqID0gY28tPmNvX25sb2NhbHM7Ci0JaWYgKGNvLT5jb19ubG9jYWxzKQotCSAgICBkaWN0X3RvX21hcChjby0+Y29fdmFybmFtZXMsIGosIGxvY2FscywgZmFzdCwgMCwgY2xlYXIpOwotCW5jZWxscyA9IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKTsKLQluZnJlZXZhcnMgPSBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19mcmVldmFycyk7Ci0JaWYgKG5jZWxscyB8fCBuZnJlZXZhcnMpIHsKLQkJZGljdF90b19tYXAoY28tPmNvX2NlbGx2YXJzLCBuY2VsbHMsCi0JCQkgICAgbG9jYWxzLCBmYXN0ICsgY28tPmNvX25sb2NhbHMsIDEsIGNsZWFyKTsKLQkJLyogU2FtZSB0ZXN0IGFzIGluIFB5RnJhbWVfRmFzdFRvTG9jYWxzKCkgYWJvdmUuICovCi0JCWlmIChjby0+Y29fZmxhZ3MgJiBDT19PUFRJTUlaRUQpIHsKLQkJCWRpY3RfdG9fbWFwKGNvLT5jb19mcmVldmFycywgbmZyZWV2YXJzLAotCQkJICAgICAgICBsb2NhbHMsIGZhc3QgKyBjby0+Y29fbmxvY2FscyArIG5jZWxscywgMSwgCi0JCQkgICAgICAgIGNsZWFyKTsKLQkJfQotCX0KLQlQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworICAgIC8qIE1lcmdlIGYtPmZfbG9jYWxzIGludG8gZmFzdCBsb2NhbHMgKi8KKyAgICBQeU9iamVjdCAqbG9jYWxzLCAqbWFwOworICAgIFB5T2JqZWN0ICoqZmFzdDsKKyAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgUHlfc3NpemVfdCBqOworICAgIGludCBuY2VsbHMsIG5mcmVldmFyczsKKyAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgbG9jYWxzID0gZi0+Zl9sb2NhbHM7CisgICAgY28gPSBmLT5mX2NvZGU7CisgICAgbWFwID0gY28tPmNvX3Zhcm5hbWVzOworICAgIGlmIChsb2NhbHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghUHlUdXBsZV9DaGVjayhtYXApKQorICAgICAgICByZXR1cm47CisgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisgICAgZmFzdCA9IGYtPmZfbG9jYWxzcGx1czsKKyAgICBqID0gUHlUdXBsZV9HRVRfU0laRShtYXApOworICAgIGlmIChqID4gY28tPmNvX25sb2NhbHMpCisgICAgICAgIGogPSBjby0+Y29fbmxvY2FsczsKKyAgICBpZiAoY28tPmNvX25sb2NhbHMpCisgICAgICAgIGRpY3RfdG9fbWFwKGNvLT5jb192YXJuYW1lcywgaiwgbG9jYWxzLCBmYXN0LCAwLCBjbGVhcik7CisgICAgbmNlbGxzID0gUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpOworICAgIG5mcmVldmFycyA9IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2ZyZWV2YXJzKTsKKyAgICBpZiAobmNlbGxzIHx8IG5mcmVldmFycykgeworICAgICAgICBkaWN0X3RvX21hcChjby0+Y29fY2VsbHZhcnMsIG5jZWxscywKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzLCBmYXN0ICsgY28tPmNvX25sb2NhbHMsIDEsIGNsZWFyKTsKKyAgICAgICAgLyogU2FtZSB0ZXN0IGFzIGluIFB5RnJhbWVfRmFzdFRvTG9jYWxzKCkgYWJvdmUuICovCisgICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19PUFRJTUlaRUQpIHsKKyAgICAgICAgICAgIGRpY3RfdG9fbWFwKGNvLT5jb19mcmVldmFycywgbmZyZWV2YXJzLAorICAgICAgICAgICAgICAgIGxvY2FscywgZmFzdCArIGNvLT5jb19ubG9jYWxzICsgbmNlbGxzLCAxLAorICAgICAgICAgICAgICAgIGNsZWFyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOwogfQogCiAvKiBDbGVhciBvdXQgdGhlIGZyZWUgbGlzdCAqLwogaW50CiBQeUZyYW1lX0NsZWFyRnJlZUxpc3Qodm9pZCkKIHsKLQlpbnQgZnJlZWxpc3Rfc2l6ZSA9IG51bWZyZWU7Ci0JCi0Jd2hpbGUgKGZyZWVfbGlzdCAhPSBOVUxMKSB7Ci0JCVB5RnJhbWVPYmplY3QgKmYgPSBmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IGZyZWVfbGlzdC0+Zl9iYWNrOwotCQlQeU9iamVjdF9HQ19EZWwoZik7Ci0JCS0tbnVtZnJlZTsKLQl9Ci0JYXNzZXJ0KG51bWZyZWUgPT0gMCk7Ci0JcmV0dXJuIGZyZWVsaXN0X3NpemU7CisgICAgaW50IGZyZWVsaXN0X3NpemUgPSBudW1mcmVlOworCisgICAgd2hpbGUgKGZyZWVfbGlzdCAhPSBOVUxMKSB7CisgICAgICAgIFB5RnJhbWVPYmplY3QgKmYgPSBmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IGZyZWVfbGlzdC0+Zl9iYWNrOworICAgICAgICBQeU9iamVjdF9HQ19EZWwoZik7CisgICAgICAgIC0tbnVtZnJlZTsKKyAgICB9CisgICAgYXNzZXJ0KG51bWZyZWUgPT0gMCk7CisgICAgcmV0dXJuIGZyZWVsaXN0X3NpemU7CiB9CiAKIHZvaWQKIFB5RnJhbWVfRmluaSh2b2lkKQogewotCSh2b2lkKVB5RnJhbWVfQ2xlYXJGcmVlTGlzdCgpOwotCVB5X1hERUNSRUYoYnVpbHRpbl9vYmplY3QpOwotCWJ1aWx0aW5fb2JqZWN0ID0gTlVMTDsKKyAgICAodm9pZClQeUZyYW1lX0NsZWFyRnJlZUxpc3QoKTsKKyAgICBQeV9YREVDUkVGKGJ1aWx0aW5fb2JqZWN0KTsKKyAgICBidWlsdGluX29iamVjdCA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2Z1bmNvYmplY3QuYyBiL09iamVjdHMvZnVuY29iamVjdC5jCmluZGV4IGEyZTg3YjcuLjdmNmIxMjMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZnVuY29iamVjdC5jCisrKyBiL09iamVjdHMvZnVuY29iamVjdC5jCkBAIC05LDE0OSArOSwxNDkgQEAKIFB5T2JqZWN0ICoKIFB5RnVuY3Rpb25fTmV3KFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCAqZ2xvYmFscykKIHsKLQlQeUZ1bmN0aW9uT2JqZWN0ICpvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUZ1bmN0aW9uT2JqZWN0LAotCQkJCQkgICAgJlB5RnVuY3Rpb25fVHlwZSk7Ci0Jc3RhdGljIFB5T2JqZWN0ICpfX25hbWVfXyA9IDA7Ci0JaWYgKG9wICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmRvYzsKLQkJUHlPYmplY3QgKmNvbnN0czsKLQkJUHlPYmplY3QgKm1vZHVsZTsKLQkJb3AtPmZ1bmNfd2Vha3JlZmxpc3QgPSBOVUxMOwotCQlQeV9JTkNSRUYoY29kZSk7Ci0JCW9wLT5mdW5jX2NvZGUgPSBjb2RlOwotCQlQeV9JTkNSRUYoZ2xvYmFscyk7Ci0JCW9wLT5mdW5jX2dsb2JhbHMgPSBnbG9iYWxzOwotCQlvcC0+ZnVuY19uYW1lID0gKChQeUNvZGVPYmplY3QgKiljb2RlKS0+Y29fbmFtZTsKLQkJUHlfSU5DUkVGKG9wLT5mdW5jX25hbWUpOwotCQlvcC0+ZnVuY19kZWZhdWx0cyA9IE5VTEw7IC8qIE5vIGRlZmF1bHQgYXJndW1lbnRzICovCi0JCW9wLT5mdW5jX2Nsb3N1cmUgPSBOVUxMOwotCQljb25zdHMgPSAoKFB5Q29kZU9iamVjdCAqKWNvZGUpLT5jb19jb25zdHM7Ci0JCWlmIChQeVR1cGxlX1NpemUoY29uc3RzKSA+PSAxKSB7Ci0JCQlkb2MgPSBQeVR1cGxlX0dldEl0ZW0oY29uc3RzLCAwKTsKLQkJCWlmICghUHlTdHJpbmdfQ2hlY2soZG9jKSAmJiAhUHlVbmljb2RlX0NoZWNrKGRvYykpCi0JCQkJZG9jID0gUHlfTm9uZTsKLQkJfQotCQllbHNlCi0JCQlkb2MgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoZG9jKTsKLQkJb3AtPmZ1bmNfZG9jID0gZG9jOwotCQlvcC0+ZnVuY19kaWN0ID0gTlVMTDsKLQkJb3AtPmZ1bmNfbW9kdWxlID0gTlVMTDsKKyAgICBQeUZ1bmN0aW9uT2JqZWN0ICpvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUZ1bmN0aW9uT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUZ1bmN0aW9uX1R5cGUpOworICAgIHN0YXRpYyBQeU9iamVjdCAqX19uYW1lX18gPSAwOworICAgIGlmIChvcCAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpkb2M7CisgICAgICAgIFB5T2JqZWN0ICpjb25zdHM7CisgICAgICAgIFB5T2JqZWN0ICptb2R1bGU7CisgICAgICAgIG9wLT5mdW5jX3dlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKGNvZGUpOworICAgICAgICBvcC0+ZnVuY19jb2RlID0gY29kZTsKKyAgICAgICAgUHlfSU5DUkVGKGdsb2JhbHMpOworICAgICAgICBvcC0+ZnVuY19nbG9iYWxzID0gZ2xvYmFsczsKKyAgICAgICAgb3AtPmZ1bmNfbmFtZSA9ICgoUHlDb2RlT2JqZWN0ICopY29kZSktPmNvX25hbWU7CisgICAgICAgIFB5X0lOQ1JFRihvcC0+ZnVuY19uYW1lKTsKKyAgICAgICAgb3AtPmZ1bmNfZGVmYXVsdHMgPSBOVUxMOyAvKiBObyBkZWZhdWx0IGFyZ3VtZW50cyAqLworICAgICAgICBvcC0+ZnVuY19jbG9zdXJlID0gTlVMTDsKKyAgICAgICAgY29uc3RzID0gKChQeUNvZGVPYmplY3QgKiljb2RlKS0+Y29fY29uc3RzOworICAgICAgICBpZiAoUHlUdXBsZV9TaXplKGNvbnN0cykgPj0gMSkgeworICAgICAgICAgICAgZG9jID0gUHlUdXBsZV9HZXRJdGVtKGNvbnN0cywgMCk7CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKGRvYykgJiYgIVB5VW5pY29kZV9DaGVjayhkb2MpKQorICAgICAgICAgICAgICAgIGRvYyA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZG9jID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGRvYyk7CisgICAgICAgIG9wLT5mdW5jX2RvYyA9IGRvYzsKKyAgICAgICAgb3AtPmZ1bmNfZGljdCA9IE5VTEw7CisgICAgICAgIG9wLT5mdW5jX21vZHVsZSA9IE5VTEw7CiAKLQkJLyogX19tb2R1bGVfXzogSWYgbW9kdWxlIG5hbWUgaXMgaW4gZ2xvYmFscywgdXNlIGl0LgotCQkgICBPdGhlcndpc2UsIHVzZSBOb25lLgotCQkqLwotCQlpZiAoIV9fbmFtZV9fKSB7Ci0JCQlfX25hbWVfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbmFtZV9fIik7Ci0JCQlpZiAoIV9fbmFtZV9fKSB7Ci0JCQkJUHlfREVDUkVGKG9wKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQltb2R1bGUgPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBfX25hbWVfXyk7Ci0JCWlmIChtb2R1bGUpIHsKLQkJICAgIFB5X0lOQ1JFRihtb2R1bGUpOwotCQkgICAgb3AtPmZ1bmNfbW9kdWxlID0gbW9kdWxlOwotCQl9Ci0JfQotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKG9wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopb3A7CisgICAgICAgIC8qIF9fbW9kdWxlX186IElmIG1vZHVsZSBuYW1lIGlzIGluIGdsb2JhbHMsIHVzZSBpdC4KKyAgICAgICAgICAgT3RoZXJ3aXNlLCB1c2UgTm9uZS4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCFfX25hbWVfXykgeworICAgICAgICAgICAgX19uYW1lX18gPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25hbWVfXyIpOworICAgICAgICAgICAgaWYgKCFfX25hbWVfXykgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbW9kdWxlID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgX19uYW1lX18pOworICAgICAgICBpZiAobW9kdWxlKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYobW9kdWxlKTsKKyAgICAgICAgICAgIG9wLT5mdW5jX21vZHVsZSA9IG1vZHVsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9wOwogfQogCiBQeU9iamVjdCAqCiBQeUZ1bmN0aW9uX0dldENvZGUoUHlPYmplY3QgKm9wKQogewotCWlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2NvZGU7CisgICAgaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfY29kZTsKIH0KIAogUHlPYmplY3QgKgogUHlGdW5jdGlvbl9HZXRHbG9iYWxzKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19nbG9iYWxzOworICAgIGlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2dsb2JhbHM7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RnVuY3Rpb25fR2V0TW9kdWxlKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19tb2R1bGU7CisgICAgaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfbW9kdWxlOwogfQogCiBQeU9iamVjdCAqCiBQeUZ1bmN0aW9uX0dldERlZmF1bHRzKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19kZWZhdWx0czsKKyAgICBpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19kZWZhdWx0czsKIH0KIAogaW50CiBQeUZ1bmN0aW9uX1NldERlZmF1bHRzKFB5T2JqZWN0ICpvcCwgUHlPYmplY3QgKmRlZmF1bHRzKQogewotCWlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGRlZmF1bHRzID09IFB5X05vbmUpCi0JCWRlZmF1bHRzID0gTlVMTDsKLQllbHNlIGlmIChkZWZhdWx0cyAmJiBQeVR1cGxlX0NoZWNrKGRlZmF1bHRzKSkgewotCQlQeV9JTkNSRUYoZGVmYXVsdHMpOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAibm9uLXR1cGxlIGRlZmF1bHQgYXJncyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X1hERUNSRUYoKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2RlZmF1bHRzKTsKLQkoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfZGVmYXVsdHMgPSBkZWZhdWx0czsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChkZWZhdWx0cyA9PSBQeV9Ob25lKQorICAgICAgICBkZWZhdWx0cyA9IE5VTEw7CisgICAgZWxzZSBpZiAoZGVmYXVsdHMgJiYgUHlUdXBsZV9DaGVjayhkZWZhdWx0cykpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlZmF1bHRzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIm5vbi10dXBsZSBkZWZhdWx0IGFyZ3MiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9YREVDUkVGKCgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19kZWZhdWx0cyk7CisgICAgKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2RlZmF1bHRzID0gZGVmYXVsdHM7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RnVuY3Rpb25fR2V0Q2xvc3VyZShQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeUZ1bmN0aW9uX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfY2xvc3VyZTsKKyAgICBpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19jbG9zdXJlOwogfQogCiBpbnQKIFB5RnVuY3Rpb25fU2V0Q2xvc3VyZShQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICpjbG9zdXJlKQogewotCWlmICghUHlGdW5jdGlvbl9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGNsb3N1cmUgPT0gUHlfTm9uZSkKLQkJY2xvc3VyZSA9IE5VTEw7Ci0JZWxzZSBpZiAoUHlUdXBsZV9DaGVjayhjbG9zdXJlKSkgewotCQlQeV9JTkNSRUYoY2xvc3VyZSk7Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsIAotCQkJICAgICAiZXhwZWN0ZWQgdHVwbGUgZm9yIGNsb3N1cmUsIGdvdCAnJS4xMDBzJyIsCi0JCQkgICAgIGNsb3N1cmUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X1hERUNSRUYoKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2Nsb3N1cmUpOwotCSgoUHlGdW5jdGlvbk9iamVjdCAqKSBvcCkgLT4gZnVuY19jbG9zdXJlID0gY2xvc3VyZTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIVB5RnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChjbG9zdXJlID09IFB5X05vbmUpCisgICAgICAgIGNsb3N1cmUgPSBOVUxMOworICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soY2xvc3VyZSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKGNsb3N1cmUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHR1cGxlIGZvciBjbG9zdXJlLCBnb3QgJyUuMTAwcyciLAorICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfWERFQ1JFRigoKFB5RnVuY3Rpb25PYmplY3QgKikgb3ApIC0+IGZ1bmNfY2xvc3VyZSk7CisgICAgKChQeUZ1bmN0aW9uT2JqZWN0ICopIG9wKSAtPiBmdW5jX2Nsb3N1cmUgPSBjbG9zdXJlOworICAgIHJldHVybiAwOwogfQogCiAvKiBNZXRob2RzICovCkBAIC0xNTksMTg4ICsxNTksMTg4IEBACiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeUZ1bmN0aW9uT2JqZWN0LCB4KQogCiBzdGF0aWMgUHlNZW1iZXJEZWYgZnVuY19tZW1iZXJsaXN0W10gPSB7Ci0gICAgICAgIHsiZnVuY19jbG9zdXJlIiwgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfY2xvc3VyZSksCi0JIFJFU1RSSUNURUR8UkVBRE9OTFl9LAotICAgICAgICB7Il9fY2xvc3VyZV9fIiwgIFRfT0JKRUNULCAgICAgIE9GRihmdW5jX2Nsb3N1cmUpLAotCSBSRVNUUklDVEVEfFJFQURPTkxZfSwKLSAgICAgICAgeyJmdW5jX2RvYyIsICAgICAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19kb2MpLCBQWV9XUklURV9SRVNUUklDVEVEfSwKLSAgICAgICAgeyJfX2RvY19fIiwgICAgICAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19kb2MpLCBQWV9XUklURV9SRVNUUklDVEVEfSwKLSAgICAgICAgeyJmdW5jX2dsb2JhbHMiLCAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19nbG9iYWxzKSwKLQkgUkVTVFJJQ1RFRHxSRUFET05MWX0sCi0gICAgICAgIHsiX19nbG9iYWxzX18iLCAgVF9PQkpFQ1QsICAgICAgT0ZGKGZ1bmNfZ2xvYmFscyksCi0JIFJFU1RSSUNURUR8UkVBRE9OTFl9LAotICAgICAgICB7Il9fbW9kdWxlX18iLCAgICBUX09CSkVDVCwgICAgIE9GRihmdW5jX21vZHVsZSksIFBZX1dSSVRFX1JFU1RSSUNURUR9LAotICAgICAgICB7TlVMTH0gIC8qIFNlbnRpbmVsICovCisgICAgeyJmdW5jX2Nsb3N1cmUiLCAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19jbG9zdXJlKSwKKyAgICAgUkVTVFJJQ1RFRHxSRUFET05MWX0sCisgICAgeyJfX2Nsb3N1cmVfXyIsICBUX09CSkVDVCwgICAgICBPRkYoZnVuY19jbG9zdXJlKSwKKyAgICAgUkVTVFJJQ1RFRHxSRUFET05MWX0sCisgICAgeyJmdW5jX2RvYyIsICAgICAgVF9PQkpFQ1QsICAgICBPRkYoZnVuY19kb2MpLCBQWV9XUklURV9SRVNUUklDVEVEfSwKKyAgICB7Il9fZG9jX18iLCAgICAgICBUX09CSkVDVCwgICAgIE9GRihmdW5jX2RvYyksIFBZX1dSSVRFX1JFU1RSSUNURUR9LAorICAgIHsiZnVuY19nbG9iYWxzIiwgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfZ2xvYmFscyksCisgICAgIFJFU1RSSUNURUR8UkVBRE9OTFl9LAorICAgIHsiX19nbG9iYWxzX18iLCAgVF9PQkpFQ1QsICAgICAgT0ZGKGZ1bmNfZ2xvYmFscyksCisgICAgIFJFU1RSSUNURUR8UkVBRE9OTFl9LAorICAgIHsiX19tb2R1bGVfXyIsICAgIFRfT0JKRUNULCAgICAgT0ZGKGZ1bmNfbW9kdWxlKSwgUFlfV1JJVEVfUkVTVFJJQ1RFRH0sCisgICAge05VTEx9ICAvKiBTZW50aW5lbCAqLwogfTsKIAogc3RhdGljIGludAogcmVzdHJpY3RlZCh2b2lkKQogewotCWlmICghUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkKLQkJcmV0dXJuIDA7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJImZ1bmN0aW9uIGF0dHJpYnV0ZXMgbm90IGFjY2Vzc2libGUgaW4gcmVzdHJpY3RlZCBtb2RlIik7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAiZnVuY3Rpb24gYXR0cmlidXRlcyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmNfZ2V0X2RpY3QoUHlGdW5jdGlvbk9iamVjdCAqb3ApCiB7Ci0JaWYgKHJlc3RyaWN0ZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG9wLT5mdW5jX2RpY3QgPT0gTlVMTCkgewotCQlvcC0+ZnVuY19kaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAob3AtPmZ1bmNfZGljdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihvcC0+ZnVuY19kaWN0KTsKLQlyZXR1cm4gb3AtPmZ1bmNfZGljdDsKKyAgICBpZiAocmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAob3AtPmZ1bmNfZGljdCA9PSBOVUxMKSB7CisgICAgICAgIG9wLT5mdW5jX2RpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChvcC0+ZnVuY19kaWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKG9wLT5mdW5jX2RpY3QpOworICAgIHJldHVybiBvcC0+ZnVuY19kaWN0OwogfQogCiBzdGF0aWMgaW50CiBmdW5jX3NldF9kaWN0KFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKnRtcDsKKyAgICBQeU9iamVjdCAqdG1wOwogCi0JaWYgKHJlc3RyaWN0ZWQoKSkKLQkJcmV0dXJuIC0xOwotCS8qIEl0IGlzIGlsbGVnYWwgdG8gZGVsIGYuZnVuY19kaWN0ICovCi0JaWYgKHZhbHVlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZnVuY3Rpb24ncyBkaWN0aW9uYXJ5IG1heSBub3QgYmUgZGVsZXRlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIENhbiBvbmx5IHNldCBmdW5jX2RpY3QgdG8gYSBkaWN0aW9uYXJ5ICovCi0JaWYgKCFQeURpY3RfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInNldHRpbmcgZnVuY3Rpb24ncyBkaWN0aW9uYXJ5IHRvIGEgbm9uLWRpY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl0bXAgPSBvcC0+ZnVuY19kaWN0OwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0Jb3AtPmZ1bmNfZGljdCA9IHZhbHVlOwotCVB5X1hERUNSRUYodG1wKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAocmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogSXQgaXMgaWxsZWdhbCB0byBkZWwgZi5mdW5jX2RpY3QgKi8KKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uJ3MgZGljdGlvbmFyeSBtYXkgbm90IGJlIGRlbGV0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBDYW4gb25seSBzZXQgZnVuY19kaWN0IHRvIGEgZGljdGlvbmFyeSAqLworICAgIGlmICghUHlEaWN0X0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInNldHRpbmcgZnVuY3Rpb24ncyBkaWN0aW9uYXJ5IHRvIGEgbm9uLWRpY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB0bXAgPSBvcC0+ZnVuY19kaWN0OworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgb3AtPmZ1bmNfZGljdCA9IHZhbHVlOworICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmNfZ2V0X2NvZGUoUHlGdW5jdGlvbk9iamVjdCAqb3ApCiB7Ci0JaWYgKHJlc3RyaWN0ZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKG9wLT5mdW5jX2NvZGUpOwotCXJldHVybiBvcC0+ZnVuY19jb2RlOworICAgIGlmIChyZXN0cmljdGVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihvcC0+ZnVuY19jb2RlKTsKKyAgICByZXR1cm4gb3AtPmZ1bmNfY29kZTsKIH0KIAogc3RhdGljIGludAogZnVuY19zZXRfY29kZShQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICp0bXA7Ci0JUHlfc3NpemVfdCBuZnJlZSwgbmNsb3N1cmU7CisgICAgUHlPYmplY3QgKnRtcDsKKyAgICBQeV9zc2l6ZV90IG5mcmVlLCBuY2xvc3VyZTsKIAotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiAtMTsKLQkvKiBOb3QgbGVnYWwgdG8gZGVsIGYuZnVuY19jb2RlIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZwotCSAqIG90aGVyIHRoYW4gYSBjb2RlIG9iamVjdC4gKi8KLQlpZiAodmFsdWUgPT0gTlVMTCB8fCAhUHlDb2RlX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2NvZGVfXyBtdXN0IGJlIHNldCB0byBhIGNvZGUgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbmZyZWUgPSBQeUNvZGVfR2V0TnVtRnJlZSgoUHlDb2RlT2JqZWN0ICopdmFsdWUpOwotCW5jbG9zdXJlID0gKG9wLT5mdW5jX2Nsb3N1cmUgPT0gTlVMTCA/IDAgOgotCQkgICAgUHlUdXBsZV9HRVRfU0laRShvcC0+ZnVuY19jbG9zdXJlKSk7Ci0JaWYgKG5jbG9zdXJlICE9IG5mcmVlKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiJXMoKSByZXF1aXJlcyBhIGNvZGUgb2JqZWN0IHdpdGggJXpkIGZyZWUgdmFycywiCi0JCQkgICAgICIgbm90ICV6ZCIsCi0JCQkgICAgIFB5U3RyaW5nX0FzU3RyaW5nKG9wLT5mdW5jX25hbWUpLAotCQkJICAgICBuY2xvc3VyZSwgbmZyZWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXRtcCA9IG9wLT5mdW5jX2NvZGU7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKLQlvcC0+ZnVuY19jb2RlID0gdmFsdWU7Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHJlc3RyaWN0ZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIE5vdCBsZWdhbCB0byBkZWwgZi5mdW5jX2NvZGUgb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCisgICAgICogb3RoZXIgdGhhbiBhIGNvZGUgb2JqZWN0LiAqLworICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8ICFQeUNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19jb2RlX18gbXVzdCBiZSBzZXQgdG8gYSBjb2RlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG5mcmVlID0gUHlDb2RlX0dldE51bUZyZWUoKFB5Q29kZU9iamVjdCAqKXZhbHVlKTsKKyAgICBuY2xvc3VyZSA9IChvcC0+ZnVuY19jbG9zdXJlID09IE5VTEwgPyAwIDoKKyAgICAgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUob3AtPmZ1bmNfY2xvc3VyZSkpOworICAgIGlmIChuY2xvc3VyZSAhPSBuZnJlZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlcygpIHJlcXVpcmVzIGEgY29kZSBvYmplY3Qgd2l0aCAlemQgZnJlZSB2YXJzLCIKKyAgICAgICAgICAgICAgICAgICAgICIgbm90ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhvcC0+ZnVuY19uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgIG5jbG9zdXJlLCBuZnJlZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdG1wID0gb3AtPmZ1bmNfY29kZTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIG9wLT5mdW5jX2NvZGUgPSB2YWx1ZTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmNfZ2V0X25hbWUoUHlGdW5jdGlvbk9iamVjdCAqb3ApCiB7Ci0JUHlfSU5DUkVGKG9wLT5mdW5jX25hbWUpOwotCXJldHVybiBvcC0+ZnVuY19uYW1lOworICAgIFB5X0lOQ1JFRihvcC0+ZnVuY19uYW1lKTsKKyAgICByZXR1cm4gb3AtPmZ1bmNfbmFtZTsKIH0KIAogc3RhdGljIGludAogZnVuY19zZXRfbmFtZShQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiAtMTsKLQkvKiBOb3QgbGVnYWwgdG8gZGVsIGYuZnVuY19uYW1lIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZwotCSAqIG90aGVyIHRoYW4gYSBzdHJpbmcgb2JqZWN0LiAqLwotCWlmICh2YWx1ZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdG1wID0gb3AtPmZ1bmNfbmFtZTsKLQlQeV9JTkNSRUYodmFsdWUpOwotCW9wLT5mdW5jX25hbWUgPSB2YWx1ZTsKLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAocmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogTm90IGxlZ2FsIHRvIGRlbCBmLmZ1bmNfbmFtZSBvciB0byBzZXQgaXQgdG8gYW55dGhpbmcKKyAgICAgKiBvdGhlciB0aGFuIGEgc3RyaW5nIG9iamVjdC4gKi8KKyAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdG1wID0gb3AtPmZ1bmNfbmFtZTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIG9wLT5mdW5jX25hbWUgPSB2YWx1ZTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmNfZ2V0X2RlZmF1bHRzKFB5RnVuY3Rpb25PYmplY3QgKm9wKQogewotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChvcC0+ZnVuY19kZWZhdWx0cyA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCVB5X0lOQ1JFRihvcC0+ZnVuY19kZWZhdWx0cyk7Ci0JcmV0dXJuIG9wLT5mdW5jX2RlZmF1bHRzOworICAgIGlmIChyZXN0cmljdGVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvcC0+ZnVuY19kZWZhdWx0cyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIFB5X0lOQ1JFRihvcC0+ZnVuY19kZWZhdWx0cyk7CisgICAgcmV0dXJuIG9wLT5mdW5jX2RlZmF1bHRzOwogfQogCiBzdGF0aWMgaW50CiBmdW5jX3NldF9kZWZhdWx0cyhQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCWlmIChyZXN0cmljdGVkKCkpCi0JCXJldHVybiAtMTsKLQkvKiBMZWdhbCB0byBkZWwgZi5mdW5jX2RlZmF1bHRzLgotCSAqIENhbiBvbmx5IHNldCBmdW5jX2RlZmF1bHRzIHRvIE5VTEwgb3IgYSB0dXBsZS4gKi8KLQlpZiAodmFsdWUgPT0gUHlfTm9uZSkKLQkJdmFsdWUgPSBOVUxMOwotCWlmICh2YWx1ZSAhPSBOVUxMICYmICFQeVR1cGxlX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2RlZmF1bHRzX18gbXVzdCBiZSBzZXQgdG8gYSB0dXBsZSBvYmplY3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl0bXAgPSBvcC0+ZnVuY19kZWZhdWx0czsKLQlQeV9YSU5DUkVGKHZhbHVlKTsKLQlvcC0+ZnVuY19kZWZhdWx0cyA9IHZhbHVlOwotCVB5X1hERUNSRUYodG1wKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAocmVzdHJpY3RlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogTGVnYWwgdG8gZGVsIGYuZnVuY19kZWZhdWx0cy4KKyAgICAgKiBDYW4gb25seSBzZXQgZnVuY19kZWZhdWx0cyB0byBOVUxMIG9yIGEgdHVwbGUuICovCisgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCisgICAgICAgIHZhbHVlID0gTlVMTDsKKyAgICBpZiAodmFsdWUgIT0gTlVMTCAmJiAhUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2RlZmF1bHRzX18gbXVzdCBiZSBzZXQgdG8gYSB0dXBsZSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB0bXAgPSBvcC0+ZnVuY19kZWZhdWx0czsKKyAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICBvcC0+ZnVuY19kZWZhdWx0cyA9IHZhbHVlOworICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIGZ1bmNfZ2V0c2V0bGlzdFtdID0gewotICAgICAgICB7ImZ1bmNfY29kZSIsIChnZXR0ZXIpZnVuY19nZXRfY29kZSwgKHNldHRlcilmdW5jX3NldF9jb2RlfSwKLSAgICAgICAgeyJfX2NvZGVfXyIsIChnZXR0ZXIpZnVuY19nZXRfY29kZSwgKHNldHRlcilmdW5jX3NldF9jb2RlfSwKLSAgICAgICAgeyJmdW5jX2RlZmF1bHRzIiwgKGdldHRlcilmdW5jX2dldF9kZWZhdWx0cywKLQkgKHNldHRlcilmdW5jX3NldF9kZWZhdWx0c30sCi0gICAgICAgIHsiX19kZWZhdWx0c19fIiwgKGdldHRlcilmdW5jX2dldF9kZWZhdWx0cywKLQkgKHNldHRlcilmdW5jX3NldF9kZWZhdWx0c30sCi0JeyJmdW5jX2RpY3QiLCAoZ2V0dGVyKWZ1bmNfZ2V0X2RpY3QsIChzZXR0ZXIpZnVuY19zZXRfZGljdH0sCi0JeyJfX2RpY3RfXyIsIChnZXR0ZXIpZnVuY19nZXRfZGljdCwgKHNldHRlcilmdW5jX3NldF9kaWN0fSwKLQl7ImZ1bmNfbmFtZSIsIChnZXR0ZXIpZnVuY19nZXRfbmFtZSwgKHNldHRlcilmdW5jX3NldF9uYW1lfSwKLQl7Il9fbmFtZV9fIiwgKGdldHRlcilmdW5jX2dldF9uYW1lLCAoc2V0dGVyKWZ1bmNfc2V0X25hbWV9LAotCXtOVUxMfSAvKiBTZW50aW5lbCAqLworICAgIHsiZnVuY19jb2RlIiwgKGdldHRlcilmdW5jX2dldF9jb2RlLCAoc2V0dGVyKWZ1bmNfc2V0X2NvZGV9LAorICAgIHsiX19jb2RlX18iLCAoZ2V0dGVyKWZ1bmNfZ2V0X2NvZGUsIChzZXR0ZXIpZnVuY19zZXRfY29kZX0sCisgICAgeyJmdW5jX2RlZmF1bHRzIiwgKGdldHRlcilmdW5jX2dldF9kZWZhdWx0cywKKyAgICAgKHNldHRlcilmdW5jX3NldF9kZWZhdWx0c30sCisgICAgeyJfX2RlZmF1bHRzX18iLCAoZ2V0dGVyKWZ1bmNfZ2V0X2RlZmF1bHRzLAorICAgICAoc2V0dGVyKWZ1bmNfc2V0X2RlZmF1bHRzfSwKKyAgICB7ImZ1bmNfZGljdCIsIChnZXR0ZXIpZnVuY19nZXRfZGljdCwgKHNldHRlcilmdW5jX3NldF9kaWN0fSwKKyAgICB7Il9fZGljdF9fIiwgKGdldHRlcilmdW5jX2dldF9kaWN0LCAoc2V0dGVyKWZ1bmNfc2V0X2RpY3R9LAorICAgIHsiZnVuY19uYW1lIiwgKGdldHRlcilmdW5jX2dldF9uYW1lLCAoc2V0dGVyKWZ1bmNfc2V0X25hbWV9LAorICAgIHsiX19uYW1lX18iLCAoZ2V0dGVyKWZ1bmNfZ2V0X25hbWUsIChzZXR0ZXIpZnVuY19zZXRfbmFtZX0sCisgICAge05VTEx9IC8qIFNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIoZnVuY19kb2MsCkBAIC0zNTMsMjM1ICszNTMsMjM1IEBACiAKIC8qIGZ1bmNfbmV3KCkgbWFpbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW52YXJpYW50cyBmb3IgY2xvc3VyZXMuICBUaGUKICAgIGNsb3N1cmUgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBmcmVlIHZhcmlhYmxlcyBvZiB0aGUgY29kZSBvYmplY3QuCi0gICAKLSAgIGlmIGxlbihjb2RlLmNvX2ZyZWV2YXJzKSA9PSAwOiAKLSAgICAgICAgICAgY2xvc3VyZSA9IE5VTEwKKworICAgaWYgbGVuKGNvZGUuY29fZnJlZXZhcnMpID09IDA6CisgICAgICAgY2xvc3VyZSA9IE5VTEwKICAgIGVsc2U6Ci0gICAgICAgICAgIGxlbihjbG9zdXJlKSA9PSBsZW4oY29kZS5jb19mcmVldmFycykKKyAgICAgICBsZW4oY2xvc3VyZSkgPT0gbGVuKGNvZGUuY29fZnJlZXZhcnMpCiAgICBmb3IgZXZlcnkgZWx0IGluIGNsb3N1cmUsIHR5cGUoZWx0KSA9PSBjZWxsCiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogZnVuY19uZXcoUHlUeXBlT2JqZWN0KiB0eXBlLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3KQogewotCVB5Q29kZU9iamVjdCAqY29kZTsKLQlQeU9iamVjdCAqZ2xvYmFsczsKLQlQeU9iamVjdCAqbmFtZSA9IFB5X05vbmU7Ci0JUHlPYmplY3QgKmRlZmF1bHRzID0gUHlfTm9uZTsKLQlQeU9iamVjdCAqY2xvc3VyZSA9IFB5X05vbmU7Ci0JUHlGdW5jdGlvbk9iamVjdCAqbmV3ZnVuYzsKLQlQeV9zc2l6ZV90IG5mcmVlLCBuY2xvc3VyZTsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImNvZGUiLCAiZ2xvYmFscyIsICJuYW1lIiwKLQkJCQkgImFyZ2RlZnMiLCAiY2xvc3VyZSIsIDB9OworICAgIFB5Q29kZU9iamVjdCAqY29kZTsKKyAgICBQeU9iamVjdCAqZ2xvYmFsczsKKyAgICBQeU9iamVjdCAqbmFtZSA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKmRlZmF1bHRzID0gUHlfTm9uZTsKKyAgICBQeU9iamVjdCAqY2xvc3VyZSA9IFB5X05vbmU7CisgICAgUHlGdW5jdGlvbk9iamVjdCAqbmV3ZnVuYzsKKyAgICBQeV9zc2l6ZV90IG5mcmVlLCBuY2xvc3VyZTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImNvZGUiLCAiZ2xvYmFscyIsICJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ2RlZnMiLCAiY2xvc3VyZSIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPIU8hfE9PTzpmdW5jdGlvbiIsCi0JCQkgICAgICBrd2xpc3QsCi0JCQkgICAgICAmUHlDb2RlX1R5cGUsICZjb2RlLAotCQkJICAgICAgJlB5RGljdF9UeXBlLCAmZ2xvYmFscywKLQkJCSAgICAgICZuYW1lLCAmZGVmYXVsdHMsICZjbG9zdXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG5hbWUgIT0gUHlfTm9uZSAmJiAhUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJnIDMgKG5hbWUpIG11c3QgYmUgTm9uZSBvciBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChkZWZhdWx0cyAhPSBQeV9Ob25lICYmICFQeVR1cGxlX0NoZWNrKGRlZmF1bHRzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJhcmcgNCAoZGVmYXVsdHMpIG11c3QgYmUgTm9uZSBvciB0dXBsZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbmZyZWUgPSBQeVR1cGxlX0dFVF9TSVpFKGNvZGUtPmNvX2ZyZWV2YXJzKTsKLQlpZiAoIVB5VHVwbGVfQ2hlY2soY2xvc3VyZSkpIHsKLQkJaWYgKG5mcmVlICYmIGNsb3N1cmUgPT0gUHlfTm9uZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImFyZyA1IChjbG9zdXJlKSBtdXN0IGJlIHR1cGxlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlIGlmIChjbG9zdXJlICE9IFB5X05vbmUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImFyZyA1IChjbG9zdXJlKSBtdXN0IGJlIE5vbmUgb3IgdHVwbGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiTyFPIXxPT086ZnVuY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUNvZGVfVHlwZSwgJmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeURpY3RfVHlwZSwgJmdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCAmZGVmYXVsdHMsICZjbG9zdXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG5hbWUgIT0gUHlfTm9uZSAmJiAhUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmcgMyAobmFtZSkgbXVzdCBiZSBOb25lIG9yIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGRlZmF1bHRzICE9IFB5X05vbmUgJiYgIVB5VHVwbGVfQ2hlY2soZGVmYXVsdHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiYXJnIDQgKGRlZmF1bHRzKSBtdXN0IGJlIE5vbmUgb3IgdHVwbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5mcmVlID0gUHlUdXBsZV9HRVRfU0laRShjb2RlLT5jb19mcmVldmFycyk7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKGNsb3N1cmUpKSB7CisgICAgICAgIGlmIChuZnJlZSAmJiBjbG9zdXJlID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZyA1IChjbG9zdXJlKSBtdXN0IGJlIHR1cGxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjbG9zdXJlICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgImFyZyA1IChjbG9zdXJlKSBtdXN0IGJlIE5vbmUgb3IgdHVwbGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JLyogY2hlY2sgdGhhdCB0aGUgY2xvc3VyZSBpcyB3ZWxsLWZvcm1lZCAqLwotCW5jbG9zdXJlID0gY2xvc3VyZSA9PSBQeV9Ob25lID8gMCA6IFB5VHVwbGVfR0VUX1NJWkUoY2xvc3VyZSk7Ci0JaWYgKG5mcmVlICE9IG5jbG9zdXJlKQotCQlyZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJICAgICIlcyByZXF1aXJlcyBjbG9zdXJlIG9mIGxlbmd0aCAlemQsIG5vdCAlemQiLAotCQkJCSAgICBQeVN0cmluZ19BU19TVFJJTkcoY29kZS0+Y29fbmFtZSksCi0JCQkJICAgIG5mcmVlLCBuY2xvc3VyZSk7Ci0JaWYgKG5jbG9zdXJlKSB7Ci0JCVB5X3NzaXplX3QgaTsKLQkJZm9yIChpID0gMDsgaSA8IG5jbG9zdXJlOyBpKyspIHsKLQkJCVB5T2JqZWN0ICpvID0gUHlUdXBsZV9HRVRfSVRFTShjbG9zdXJlLCBpKTsKLQkJCWlmICghUHlDZWxsX0NoZWNrKG8pKSB7Ci0JCQkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICJhcmcgNSAoY2xvc3VyZSkgZXhwZWN0ZWQgY2VsbCwgZm91bmQgJXMiLAotCQkJCQkJICAgIG8tPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJfQotCQl9Ci0JfQotCQotCW5ld2Z1bmMgPSAoUHlGdW5jdGlvbk9iamVjdCAqKVB5RnVuY3Rpb25fTmV3KChQeU9iamVjdCAqKWNvZGUsIAotCQkJCQkJICAgICBnbG9iYWxzKTsKLQlpZiAobmV3ZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiAobmFtZSAhPSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihuYW1lKTsKLQkJUHlfREVDUkVGKG5ld2Z1bmMtPmZ1bmNfbmFtZSk7Ci0JCW5ld2Z1bmMtPmZ1bmNfbmFtZSA9IG5hbWU7Ci0JfQotCWlmIChkZWZhdWx0cyAhPSBQeV9Ob25lKSB7Ci0JCVB5X0lOQ1JFRihkZWZhdWx0cyk7Ci0JCW5ld2Z1bmMtPmZ1bmNfZGVmYXVsdHMgID0gZGVmYXVsdHM7Ci0JfQotCWlmIChjbG9zdXJlICE9IFB5X05vbmUpIHsKLQkJUHlfSU5DUkVGKGNsb3N1cmUpOwotCQluZXdmdW5jLT5mdW5jX2Nsb3N1cmUgPSBjbG9zdXJlOwotCX0KKyAgICAvKiBjaGVjayB0aGF0IHRoZSBjbG9zdXJlIGlzIHdlbGwtZm9ybWVkICovCisgICAgbmNsb3N1cmUgPSBjbG9zdXJlID09IFB5X05vbmUgPyAwIDogUHlUdXBsZV9HRVRfU0laRShjbG9zdXJlKTsKKyAgICBpZiAobmZyZWUgIT0gbmNsb3N1cmUpCisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgcmVxdWlyZXMgY2xvc3VyZSBvZiBsZW5ndGggJXpkLCBub3QgJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoY29kZS0+Y29fbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmZyZWUsIG5jbG9zdXJlKTsKKyAgICBpZiAobmNsb3N1cmUpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmNsb3N1cmU7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dFVF9JVEVNKGNsb3N1cmUsIGkpOworICAgICAgICAgICAgaWYgKCFQeUNlbGxfQ2hlY2sobykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImFyZyA1IChjbG9zdXJlKSBleHBlY3RlZCBjZWxsLCBmb3VuZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiAoUHlPYmplY3QgKiluZXdmdW5jOworICAgIG5ld2Z1bmMgPSAoUHlGdW5jdGlvbk9iamVjdCAqKVB5RnVuY3Rpb25fTmV3KChQeU9iamVjdCAqKWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFscyk7CisgICAgaWYgKG5ld2Z1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAobmFtZSAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKG5ld2Z1bmMtPmZ1bmNfbmFtZSk7CisgICAgICAgIG5ld2Z1bmMtPmZ1bmNfbmFtZSA9IG5hbWU7CisgICAgfQorICAgIGlmIChkZWZhdWx0cyAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihkZWZhdWx0cyk7CisgICAgICAgIG5ld2Z1bmMtPmZ1bmNfZGVmYXVsdHMgID0gZGVmYXVsdHM7CisgICAgfQorICAgIGlmIChjbG9zdXJlICE9IFB5X05vbmUpIHsKKyAgICAgICAgUHlfSU5DUkVGKGNsb3N1cmUpOworICAgICAgICBuZXdmdW5jLT5mdW5jX2Nsb3N1cmUgPSBjbG9zdXJlOworICAgIH0KKworICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdmdW5jOwogfQogCiBzdGF0aWMgdm9pZAogZnVuY19kZWFsbG9jKFB5RnVuY3Rpb25PYmplY3QgKm9wKQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKG9wKTsKLQlpZiAob3AtPmZ1bmNfd2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgb3ApOwotCVB5X0RFQ1JFRihvcC0+ZnVuY19jb2RlKTsKLQlQeV9ERUNSRUYob3AtPmZ1bmNfZ2xvYmFscyk7Ci0JUHlfWERFQ1JFRihvcC0+ZnVuY19tb2R1bGUpOwotCVB5X0RFQ1JFRihvcC0+ZnVuY19uYW1lKTsKLQlQeV9YREVDUkVGKG9wLT5mdW5jX2RlZmF1bHRzKTsKLQlQeV9YREVDUkVGKG9wLT5mdW5jX2RvYyk7Ci0JUHlfWERFQ1JFRihvcC0+ZnVuY19kaWN0KTsKLQlQeV9YREVDUkVGKG9wLT5mdW5jX2Nsb3N1cmUpOwotCVB5T2JqZWN0X0dDX0RlbChvcCk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0sob3ApOworICAgIGlmIChvcC0+ZnVuY193ZWFrcmVmbGlzdCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKSBvcCk7CisgICAgUHlfREVDUkVGKG9wLT5mdW5jX2NvZGUpOworICAgIFB5X0RFQ1JFRihvcC0+ZnVuY19nbG9iYWxzKTsKKyAgICBQeV9YREVDUkVGKG9wLT5mdW5jX21vZHVsZSk7CisgICAgUHlfREVDUkVGKG9wLT5mdW5jX25hbWUpOworICAgIFB5X1hERUNSRUYob3AtPmZ1bmNfZGVmYXVsdHMpOworICAgIFB5X1hERUNSRUYob3AtPmZ1bmNfZG9jKTsKKyAgICBQeV9YREVDUkVGKG9wLT5mdW5jX2RpY3QpOworICAgIFB5X1hERUNSRUYob3AtPmZ1bmNfY2xvc3VyZSk7CisgICAgUHlPYmplY3RfR0NfRGVsKG9wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KgogZnVuY19yZXByKFB5RnVuY3Rpb25PYmplY3QgKm9wKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8ZnVuY3Rpb24gJXMgYXQgJXA+IiwKLQkJCQkgICBQeVN0cmluZ19Bc1N0cmluZyhvcC0+ZnVuY19uYW1lKSwKLQkJCQkgICBvcCk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxmdW5jdGlvbiAlcyBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKG9wLT5mdW5jX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wKTsKIH0KIAogc3RhdGljIGludAogZnVuY190cmF2ZXJzZShQeUZ1bmN0aW9uT2JqZWN0ICpmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChmLT5mdW5jX2NvZGUpOwotCVB5X1ZJU0lUKGYtPmZ1bmNfZ2xvYmFscyk7Ci0JUHlfVklTSVQoZi0+ZnVuY19tb2R1bGUpOwotCVB5X1ZJU0lUKGYtPmZ1bmNfZGVmYXVsdHMpOwotCVB5X1ZJU0lUKGYtPmZ1bmNfZG9jKTsKLQlQeV9WSVNJVChmLT5mdW5jX25hbWUpOwotCVB5X1ZJU0lUKGYtPmZ1bmNfZGljdCk7Ci0JUHlfVklTSVQoZi0+ZnVuY19jbG9zdXJlKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChmLT5mdW5jX2NvZGUpOworICAgIFB5X1ZJU0lUKGYtPmZ1bmNfZ2xvYmFscyk7CisgICAgUHlfVklTSVQoZi0+ZnVuY19tb2R1bGUpOworICAgIFB5X1ZJU0lUKGYtPmZ1bmNfZGVmYXVsdHMpOworICAgIFB5X1ZJU0lUKGYtPmZ1bmNfZG9jKTsKKyAgICBQeV9WSVNJVChmLT5mdW5jX25hbWUpOworICAgIFB5X1ZJU0lUKGYtPmZ1bmNfZGljdCk7CisgICAgUHlfVklTSVQoZi0+ZnVuY19jbG9zdXJlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGZ1bmN0aW9uX2NhbGwoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICphcmcsIFB5T2JqZWN0ICprdykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICphcmdkZWZzOwotCVB5T2JqZWN0ICoqZCwgKiprOwotCVB5X3NzaXplX3QgbmssIG5kOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmFyZ2RlZnM7CisgICAgUHlPYmplY3QgKipkLCAqKms7CisgICAgUHlfc3NpemVfdCBuaywgbmQ7CiAKLQlhcmdkZWZzID0gUHlGdW5jdGlvbl9HRVRfREVGQVVMVFMoZnVuYyk7Ci0JaWYgKGFyZ2RlZnMgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ2RlZnMpKSB7Ci0JCWQgPSAmUHlUdXBsZV9HRVRfSVRFTSgoUHlUdXBsZU9iamVjdCAqKWFyZ2RlZnMsIDApOwotCQluZCA9IFB5VHVwbGVfU2l6ZShhcmdkZWZzKTsKLQl9Ci0JZWxzZSB7Ci0JCWQgPSBOVUxMOwotCQluZCA9IDA7Ci0JfQorICAgIGFyZ2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9ERUZBVUxUUyhmdW5jKTsKKyAgICBpZiAoYXJnZGVmcyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJnZGVmcykpIHsKKyAgICAgICAgZCA9ICZQeVR1cGxlX0dFVF9JVEVNKChQeVR1cGxlT2JqZWN0ICopYXJnZGVmcywgMCk7CisgICAgICAgIG5kID0gUHlUdXBsZV9TaXplKGFyZ2RlZnMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZCA9IE5VTEw7CisgICAgICAgIG5kID0gMDsKKyAgICB9CiAKLQlpZiAoa3cgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soa3cpKSB7Ci0JCVB5X3NzaXplX3QgcG9zLCBpOwotCQluayA9IFB5RGljdF9TaXplKGt3KTsKLQkJayA9IFB5TWVtX05FVyhQeU9iamVjdCAqLCAyKm5rKTsKLQkJaWYgKGsgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXBvcyA9IGkgPSAwOwotCQl3aGlsZSAoUHlEaWN0X05leHQoa3csICZwb3MsICZrW2ldLCAma1tpKzFdKSkKLQkJCWkgKz0gMjsKLQkJbmsgPSBpLzI7Ci0JCS8qIFhYWCBUaGlzIGlzIGJyb2tlbiBpZiB0aGUgY2FsbGVyIGRlbGV0ZXMgZGljdCBpdGVtcyEgKi8KLQl9Ci0JZWxzZSB7Ci0JCWsgPSBOVUxMOwotCQluayA9IDA7Ci0JfQorICAgIGlmIChrdyAhPSBOVUxMICYmIFB5RGljdF9DaGVjayhrdykpIHsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MsIGk7CisgICAgICAgIG5rID0gUHlEaWN0X1NpemUoa3cpOworICAgICAgICBrID0gUHlNZW1fTkVXKFB5T2JqZWN0ICosIDIqbmspOworICAgICAgICBpZiAoayA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gaSA9IDA7CisgICAgICAgIHdoaWxlIChQeURpY3RfTmV4dChrdywgJnBvcywgJmtbaV0sICZrW2krMV0pKQorICAgICAgICAgICAgaSArPSAyOworICAgICAgICBuayA9IGkvMjsKKyAgICAgICAgLyogWFhYIFRoaXMgaXMgYnJva2VuIGlmIHRoZSBjYWxsZXIgZGVsZXRlcyBkaWN0IGl0ZW1zISAqLworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgayA9IE5VTEw7CisgICAgICAgIG5rID0gMDsKKyAgICB9CiAKLQlyZXN1bHQgPSBQeUV2YWxfRXZhbENvZGVFeCgKLQkJKFB5Q29kZU9iamVjdCAqKVB5RnVuY3Rpb25fR0VUX0NPREUoZnVuYyksCi0JCVB5RnVuY3Rpb25fR0VUX0dMT0JBTFMoZnVuYyksIChQeU9iamVjdCAqKU5VTEwsCi0JCSZQeVR1cGxlX0dFVF9JVEVNKGFyZywgMCksIFB5VHVwbGVfU2l6ZShhcmcpLAotCQlrLCBuaywgZCwgbmQsCi0JCVB5RnVuY3Rpb25fR0VUX0NMT1NVUkUoZnVuYykpOworICAgIHJlc3VsdCA9IFB5RXZhbF9FdmFsQ29kZUV4KAorICAgICAgICAoUHlDb2RlT2JqZWN0ICopUHlGdW5jdGlvbl9HRVRfQ09ERShmdW5jKSwKKyAgICAgICAgUHlGdW5jdGlvbl9HRVRfR0xPQkFMUyhmdW5jKSwgKFB5T2JqZWN0ICopTlVMTCwKKyAgICAgICAgJlB5VHVwbGVfR0VUX0lURU0oYXJnLCAwKSwgUHlUdXBsZV9TaXplKGFyZyksCisgICAgICAgIGssIG5rLCBkLCBuZCwKKyAgICAgICAgUHlGdW5jdGlvbl9HRVRfQ0xPU1VSRShmdW5jKSk7CiAKLQlpZiAoayAhPSBOVUxMKQotCQlQeU1lbV9ERUwoayk7CisgICAgaWYgKGsgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fREVMKGspOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBCaW5kIGEgZnVuY3Rpb24gdG8gYW4gb2JqZWN0ICovCiBzdGF0aWMgUHlPYmplY3QgKgogZnVuY19kZXNjcl9nZXQoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewotCWlmIChvYmogPT0gUHlfTm9uZSkKLQkJb2JqID0gTlVMTDsKLQlyZXR1cm4gUHlNZXRob2RfTmV3KGZ1bmMsIG9iaiwgdHlwZSk7CisgICAgaWYgKG9iaiA9PSBQeV9Ob25lKQorICAgICAgICBvYmogPSBOVUxMOworICAgIHJldHVybiBQeU1ldGhvZF9OZXcoZnVuYywgb2JqLCB0eXBlKTsKIH0KIAogUHlUeXBlT2JqZWN0IFB5RnVuY3Rpb25fVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJmdW5jdGlvbiIsCi0Jc2l6ZW9mKFB5RnVuY3Rpb25PYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpZnVuY19kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylmdW5jX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JZnVuY3Rpb25fY2FsbCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQlmdW5jX2RvYywJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylmdW5jX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihQeUZ1bmN0aW9uT2JqZWN0LCBmdW5jX3dlYWtyZWZsaXN0KSwgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JZnVuY19tZW1iZXJsaXN0LAkJCS8qIHRwX21lbWJlcnMgKi8KLQlmdW5jX2dldHNldGxpc3QsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCWZ1bmNfZGVzY3JfZ2V0LAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0Jb2Zmc2V0b2YoUHlGdW5jdGlvbk9iamVjdCwgZnVuY19kaWN0KSwJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JZnVuY19uZXcsCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImZ1bmN0aW9uIiwKKyAgICBzaXplb2YoUHlGdW5jdGlvbk9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilmdW5jX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWZ1bmNfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgZnVuY3Rpb25fY2FsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgZnVuY19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWZ1bmNfdHJhdmVyc2UsICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeUZ1bmN0aW9uT2JqZWN0LCBmdW5jX3dlYWtyZWZsaXN0KSwgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgZnVuY19tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgZnVuY19nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICBmdW5jX2Rlc2NyX2dldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgb2Zmc2V0b2YoUHlGdW5jdGlvbk9iamVjdCwgZnVuY19kaWN0KSwgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIGZ1bmNfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiAKQEAgLTU5Miw5ICs1OTIsOSBAQAogICAgVG8gZGVjbGFyZSBhIGNsYXNzIG1ldGhvZCwgdXNlIHRoaXMgaWRpb206CiAKICAgICAgY2xhc3MgQzoKLSAgICAgICAgIGRlZiBmKGNscywgYXJnMSwgYXJnMiwgLi4uKTogLi4uCi0JIGYgPSBjbGFzc21ldGhvZChmKQotICAgCisgICAgIGRlZiBmKGNscywgYXJnMSwgYXJnMiwgLi4uKTogLi4uCisgICAgIGYgPSBjbGFzc21ldGhvZChmKQorCiAgICBJdCBjYW4gYmUgY2FsbGVkIGVpdGhlciBvbiB0aGUgY2xhc3MgKGUuZy4gQy5mKCkpIG9yIG9uIGFuIGluc3RhbmNlCiAgICAoZS5nLiBDKCkuZigpKTsgdGhlIGluc3RhbmNlIGlzIGlnbm9yZWQgZXhjZXB0IGZvciBpdHMgY2xhc3MuCiAgICBJZiBhIGNsYXNzIG1ldGhvZCBpcyBjYWxsZWQgZm9yIGEgZGVyaXZlZCBjbGFzcywgdGhlIGRlcml2ZWQgY2xhc3MKQEAgLTYwNSw2OCArNjA1LDY4IEBACiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICpjbV9jYWxsYWJsZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmNtX2NhbGxhYmxlOwogfSBjbGFzc21ldGhvZDsKIAogc3RhdGljIHZvaWQKIGNtX2RlYWxsb2MoY2xhc3NtZXRob2QgKmNtKQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKChQeU9iamVjdCAqKWNtKTsKLQlQeV9YREVDUkVGKGNtLT5jbV9jYWxsYWJsZSk7Ci0JUHlfVFlQRShjbSktPnRwX2ZyZWUoKFB5T2JqZWN0ICopY20pOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKChQeU9iamVjdCAqKWNtKTsKKyAgICBQeV9YREVDUkVGKGNtLT5jbV9jYWxsYWJsZSk7CisgICAgUHlfVFlQRShjbSktPnRwX2ZyZWUoKFB5T2JqZWN0ICopY20pOwogfQogCiBzdGF0aWMgaW50CiBjbV90cmF2ZXJzZShjbGFzc21ldGhvZCAqY20sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGNtLT5jbV9jYWxsYWJsZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQoY20tPmNtX2NhbGxhYmxlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogY21fY2xlYXIoY2xhc3NtZXRob2QgKmNtKQogewotCVB5X0NMRUFSKGNtLT5jbV9jYWxsYWJsZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfQ0xFQVIoY20tPmNtX2NhbGxhYmxlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogY21fZGVzY3JfZ2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQljbGFzc21ldGhvZCAqY20gPSAoY2xhc3NtZXRob2QgKilzZWxmOworICAgIGNsYXNzbWV0aG9kICpjbSA9IChjbGFzc21ldGhvZCAqKXNlbGY7CiAKLQlpZiAoY20tPmNtX2NhbGxhYmxlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkidW5pbml0aWFsaXplZCBjbGFzc21ldGhvZCBvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh0eXBlID09IE5VTEwpCi0JCXR5cGUgPSAoUHlPYmplY3QgKikoUHlfVFlQRShvYmopKTsKLSAJcmV0dXJuIFB5TWV0aG9kX05ldyhjbS0+Y21fY2FsbGFibGUsCi0JCQkgICAgdHlwZSwgKFB5T2JqZWN0ICopKFB5X1RZUEUodHlwZSkpKTsKKyAgICBpZiAoY20tPmNtX2NhbGxhYmxlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bmluaXRpYWxpemVkIGNsYXNzbWV0aG9kIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICAgICAgdHlwZSA9IChQeU9iamVjdCAqKShQeV9UWVBFKG9iaikpOworICAgIHJldHVybiBQeU1ldGhvZF9OZXcoY20tPmNtX2NhbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgKFB5T2JqZWN0ICopKFB5X1RZUEUodHlwZSkpKTsKIH0KIAogc3RhdGljIGludAogY21faW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWNsYXNzbWV0aG9kICpjbSA9IChjbGFzc21ldGhvZCAqKXNlbGY7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOworICAgIGNsYXNzbWV0aG9kICpjbSA9IChjbGFzc21ldGhvZCAqKXNlbGY7CisgICAgUHlPYmplY3QgKmNhbGxhYmxlOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY2xhc3NtZXRob2QiLCAxLCAxLCAmY2FsbGFibGUpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiY2xhc3NtZXRob2QiLCBrd2RzKSkKLQkJcmV0dXJuIC0xOwotCWlmICghUHlDYWxsYWJsZV9DaGVjayhjYWxsYWJsZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiclcycgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZSIsCi0JCSAgICAgY2FsbGFibGUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCQotCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0JY20tPmNtX2NhbGxhYmxlID0gY2FsbGFibGU7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY2xhc3NtZXRob2QiLCAxLCAxLCAmY2FsbGFibGUpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3JkcygiY2xhc3NtZXRob2QiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhjYWxsYWJsZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiclcycgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZSIsCisgICAgICAgICAgICAgY2FsbGFibGUtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICBjbS0+Y21fY2FsbGFibGUgPSBjYWxsYWJsZTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKGNsYXNzbWV0aG9kX2RvYywKQEAgLTY5MSw1NyArNjkxLDU3IEBACiBJZiB5b3Ugd2FudCB0aG9zZSwgc2VlIHRoZSBzdGF0aWNtZXRob2QgYnVpbHRpbi4iKTsKIAogUHlUeXBlT2JqZWN0IFB5Q2xhc3NNZXRob2RfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJjbGFzc21ldGhvZCIsCi0Jc2l6ZW9mKGNsYXNzbWV0aG9kKSwKLQkwLAotCShkZXN0cnVjdG9yKWNtX2RlYWxsb2MsCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCi0JY2xhc3NtZXRob2RfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY21fdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KWNtX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQkwLAkJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQljbV9kZXNjcl9nZXQsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCWNtX2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImNsYXNzbWV0aG9kIiwKKyAgICBzaXplb2YoY2xhc3NtZXRob2QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpY21fZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCisgICAgY2xhc3NtZXRob2RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNtX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKGlucXVpcnkpY21fY2xlYXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgY21fZGVzY3JfZ2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIGNtX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogUHlPYmplY3QgKgogUHlDbGFzc01ldGhvZF9OZXcoUHlPYmplY3QgKmNhbGxhYmxlKQogewotCWNsYXNzbWV0aG9kICpjbSA9IChjbGFzc21ldGhvZCAqKQotCQlQeVR5cGVfR2VuZXJpY0FsbG9jKCZQeUNsYXNzTWV0aG9kX1R5cGUsIDApOwotCWlmIChjbSAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0JCWNtLT5jbV9jYWxsYWJsZSA9IGNhbGxhYmxlOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopY207CisgICAgY2xhc3NtZXRob2QgKmNtID0gKGNsYXNzbWV0aG9kICopCisgICAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MoJlB5Q2xhc3NNZXRob2RfVHlwZSwgMCk7CisgICAgaWYgKGNtICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICAgICAgY20tPmNtX2NhbGxhYmxlID0gY2FsbGFibGU7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiljbTsKIH0KIAogCkBAIC03NTEsOCArNzUxLDggQEAKICAgIFRvIGRlY2xhcmUgYSBzdGF0aWMgbWV0aG9kLCB1c2UgdGhpcyBpZGlvbToKIAogICAgICBjbGFzcyBDOgotICAgICAgICAgZGVmIGYoYXJnMSwgYXJnMiwgLi4uKTogLi4uCi0JIGYgPSBzdGF0aWNtZXRob2QoZikKKyAgICAgZGVmIGYoYXJnMSwgYXJnMiwgLi4uKTogLi4uCisgICAgIGYgPSBzdGF0aWNtZXRob2QoZikKIAogICAgSXQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgb24gdGhlIGNsYXNzIChlLmcuIEMuZigpKSBvciBvbiBhbiBpbnN0YW5jZQogICAgKGUuZy4gQygpLmYoKSk7IHRoZSBpbnN0YW5jZSBpcyBpZ25vcmVkIGV4Y2VwdCBmb3IgaXRzIGNsYXNzLgpAQCAtNzYyLDYxICs3NjIsNjEgQEAKICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKnNtX2NhbGxhYmxlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqc21fY2FsbGFibGU7CiB9IHN0YXRpY21ldGhvZDsKIAogc3RhdGljIHZvaWQKIHNtX2RlYWxsb2Moc3RhdGljbWV0aG9kICpzbSkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSygoUHlPYmplY3QgKilzbSk7Ci0JUHlfWERFQ1JFRihzbS0+c21fY2FsbGFibGUpOwotCVB5X1RZUEUoc20pLT50cF9mcmVlKChQeU9iamVjdCAqKXNtKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSygoUHlPYmplY3QgKilzbSk7CisgICAgUHlfWERFQ1JFRihzbS0+c21fY2FsbGFibGUpOworICAgIFB5X1RZUEUoc20pLT50cF9mcmVlKChQeU9iamVjdCAqKXNtKTsKIH0KIAogc3RhdGljIGludAogc21fdHJhdmVyc2Uoc3RhdGljbWV0aG9kICpzbSwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQoc20tPnNtX2NhbGxhYmxlKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChzbS0+c21fY2FsbGFibGUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBzbV9jbGVhcihzdGF0aWNtZXRob2QgKnNtKQogewotCVB5X1hERUNSRUYoc20tPnNtX2NhbGxhYmxlKTsKLQlzbS0+c21fY2FsbGFibGUgPSBOVUxMOworICAgIFB5X1hERUNSRUYoc20tPnNtX2NhbGxhYmxlKTsKKyAgICBzbS0+c21fY2FsbGFibGUgPSBOVUxMOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbV9kZXNjcl9nZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewotCXN0YXRpY21ldGhvZCAqc20gPSAoc3RhdGljbWV0aG9kICopc2VsZjsKKyAgICBzdGF0aWNtZXRob2QgKnNtID0gKHN0YXRpY21ldGhvZCAqKXNlbGY7CiAKLQlpZiAoc20tPnNtX2NhbGxhYmxlID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkidW5pbml0aWFsaXplZCBzdGF0aWNtZXRob2Qgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoc20tPnNtX2NhbGxhYmxlKTsKLQlyZXR1cm4gc20tPnNtX2NhbGxhYmxlOworICAgIGlmIChzbS0+c21fY2FsbGFibGUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInVuaW5pdGlhbGl6ZWQgc3RhdGljbWV0aG9kIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKHNtLT5zbV9jYWxsYWJsZSk7CisgICAgcmV0dXJuIHNtLT5zbV9jYWxsYWJsZTsKIH0KIAogc3RhdGljIGludAogc21faW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpY21ldGhvZCAqc20gPSAoc3RhdGljbWV0aG9kICopc2VsZjsKLQlQeU9iamVjdCAqY2FsbGFibGU7CisgICAgc3RhdGljbWV0aG9kICpzbSA9IChzdGF0aWNtZXRob2QgKilzZWxmOworICAgIFB5T2JqZWN0ICpjYWxsYWJsZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN0YXRpY21ldGhvZCIsIDEsIDEsICZjYWxsYWJsZSkpCi0JCXJldHVybiAtMTsKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJzdGF0aWNtZXRob2QiLCBrd2RzKSkKLQkJcmV0dXJuIC0xOwotCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0Jc20tPnNtX2NhbGxhYmxlID0gY2FsbGFibGU7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3RhdGljbWV0aG9kIiwgMSwgMSwgJmNhbGxhYmxlKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoInN0YXRpY21ldGhvZCIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICBzbS0+c21fY2FsbGFibGUgPSBjYWxsYWJsZTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKHN0YXRpY21ldGhvZF9kb2MsCkBAIC04MjgsOCArODI4LDggQEAKIFRvIGRlY2xhcmUgYSBzdGF0aWMgbWV0aG9kLCB1c2UgdGhpcyBpZGlvbTpcblwKIFxuXAogICAgICBjbGFzcyBDOlxuXAotICAgICAgICAgZGVmIGYoYXJnMSwgYXJnMiwgLi4uKTogLi4uXG5cCi0JIGYgPSBzdGF0aWNtZXRob2QoZilcblwKKyAgICAgZGVmIGYoYXJnMSwgYXJnMiwgLi4uKTogLi4uXG5cCisgICAgIGYgPSBzdGF0aWNtZXRob2QoZilcblwKIFxuXAogSXQgY2FuIGJlIGNhbGxlZCBlaXRoZXIgb24gdGhlIGNsYXNzIChlLmcuIEMuZigpKSBvciBvbiBhbiBpbnN0YW5jZVxuXAogKGUuZy4gQygpLmYoKSkuICBUaGUgaW5zdGFuY2UgaXMgaWdub3JlZCBleGNlcHQgZm9yIGl0cyBjbGFzcy5cblwKQEAgLTgzOCw1NSArODM4LDU1IEBACiBGb3IgYSBtb3JlIGFkdmFuY2VkIGNvbmNlcHQsIHNlZSB0aGUgY2xhc3NtZXRob2QgYnVpbHRpbi4iKTsKIAogUHlUeXBlT2JqZWN0IFB5U3RhdGljTWV0aG9kX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkic3RhdGljbWV0aG9kIiwKLQlzaXplb2Yoc3RhdGljbWV0aG9kKSwKLQkwLAotCShkZXN0cnVjdG9yKXNtX2RlYWxsb2MsCQkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCi0Jc3RhdGljbWV0aG9kX2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXNtX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlzbV9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0Jc21fZGVzY3JfZ2V0LAkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQlzbV9pbml0LAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCQkvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgIAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInN0YXRpY21ldGhvZCIsCisgICAgc2l6ZW9mKHN0YXRpY21ldGhvZCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilzbV9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywKKyAgICBzdGF0aWNtZXRob2RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2Mpc21fdHJhdmVyc2UsICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlzbV9jbGVhciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICBzbV9kZXNjcl9nZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgc21faW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiBQeU9iamVjdCAqCiBQeVN0YXRpY01ldGhvZF9OZXcoUHlPYmplY3QgKmNhbGxhYmxlKQogewotCXN0YXRpY21ldGhvZCAqc20gPSAoc3RhdGljbWV0aG9kICopCi0JCVB5VHlwZV9HZW5lcmljQWxsb2MoJlB5U3RhdGljTWV0aG9kX1R5cGUsIDApOwotCWlmIChzbSAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0JCXNtLT5zbV9jYWxsYWJsZSA9IGNhbGxhYmxlOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopc207CisgICAgc3RhdGljbWV0aG9kICpzbSA9IChzdGF0aWNtZXRob2QgKikKKyAgICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygmUHlTdGF0aWNNZXRob2RfVHlwZSwgMCk7CisgICAgaWYgKHNtICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGNhbGxhYmxlKTsKKyAgICAgICAgc20tPnNtX2NhbGxhYmxlID0gY2FsbGFibGU7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzbTsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvZ2Vub2JqZWN0LmMgYi9PYmplY3RzL2dlbm9iamVjdC5jCmluZGV4IGMzZmE2NGIuLmFmODEyYzAgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZ2Vub2JqZWN0LmMKKysrIGIvT2JqZWN0cy9nZW5vYmplY3QuYwpAQCAtMTAsMTAzICsxMCwxMDMgQEAKIHN0YXRpYyBpbnQKIGdlbl90cmF2ZXJzZShQeUdlbk9iamVjdCAqZ2VuLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVCgoUHlPYmplY3QgKilnZW4tPmdpX2ZyYW1lKTsKLQlQeV9WSVNJVChnZW4tPmdpX2NvZGUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKChQeU9iamVjdCAqKWdlbi0+Z2lfZnJhbWUpOworICAgIFB5X1ZJU0lUKGdlbi0+Z2lfY29kZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBnZW5fZGVhbGxvYyhQeUdlbk9iamVjdCAqZ2VuKQogewotCVB5T2JqZWN0ICpzZWxmID0gKFB5T2JqZWN0ICopIGdlbjsKKyAgICBQeU9iamVjdCAqc2VsZiA9IChQeU9iamVjdCAqKSBnZW47CiAKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhnZW4pOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKGdlbik7CiAKLQlpZiAoZ2VuLT5naV93ZWFrcmVmbGlzdCAhPSBOVUxMKQotCQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKHNlbGYpOworICAgIGlmIChnZW4tPmdpX3dlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoc2VsZik7CiAKLQlfUHlPYmplY3RfR0NfVFJBQ0soc2VsZik7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKHNlbGYpOwogCi0JaWYgKGdlbi0+Z2lfZnJhbWUgIT0gTlVMTCAmJiBnZW4tPmdpX2ZyYW1lLT5mX3N0YWNrdG9wICE9IE5VTEwpIHsKLQkJLyogR2VuZXJhdG9yIGlzIHBhdXNlZCwgc28gd2UgbmVlZCB0byBjbG9zZSAqLwotCQlQeV9UWVBFKGdlbiktPnRwX2RlbChzZWxmKTsKLQkJaWYgKHNlbGYtPm9iX3JlZmNudCA+IDApCi0JCQlyZXR1cm47CQkvKiByZXN1cnJlY3RlZC4gIDooICovCi0JfQorICAgIGlmIChnZW4tPmdpX2ZyYW1lICE9IE5VTEwgJiYgZ2VuLT5naV9mcmFtZS0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7CisgICAgICAgIC8qIEdlbmVyYXRvciBpcyBwYXVzZWQsIHNvIHdlIG5lZWQgdG8gY2xvc2UgKi8KKyAgICAgICAgUHlfVFlQRShnZW4pLT50cF9kZWwoc2VsZik7CisgICAgICAgIGlmIChzZWxmLT5vYl9yZWZjbnQgPiAwKQorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgIC8qIHJlc3VycmVjdGVkLiAgOiggKi8KKyAgICB9CiAKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKLQlQeV9DTEVBUihnZW4tPmdpX2ZyYW1lKTsKLQlQeV9DTEVBUihnZW4tPmdpX2NvZGUpOwotCVB5T2JqZWN0X0dDX0RlbChnZW4pOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKHNlbGYpOworICAgIFB5X0NMRUFSKGdlbi0+Z2lfZnJhbWUpOworICAgIFB5X0NMRUFSKGdlbi0+Z2lfY29kZSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGdlbik7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9zZW5kX2V4KFB5R2VuT2JqZWN0ICpnZW4sIFB5T2JqZWN0ICphcmcsIGludCBleGMpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeUZyYW1lT2JqZWN0ICpmID0gZ2VuLT5naV9mcmFtZTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlGcmFtZU9iamVjdCAqZiA9IGdlbi0+Z2lfZnJhbWU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChnZW4tPmdpX3J1bm5pbmcpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImdlbmVyYXRvciBhbHJlYWR5IGV4ZWN1dGluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGY9PU5VTEwgfHwgZi0+Zl9zdGFja3RvcCA9PSBOVUxMKSB7Ci0JCS8qIE9ubHkgc2V0IGV4Y2VwdGlvbiBpZiBjYWxsZWQgZnJvbSBzZW5kKCkgKi8KLQkJaWYgKGFyZyAmJiAhZXhjKQotCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChnZW4tPmdpX3J1bm5pbmcpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdG9yIGFscmVhZHkgZXhlY3V0aW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZj09TlVMTCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKKyAgICAgICAgLyogT25seSBzZXQgZXhjZXB0aW9uIGlmIGNhbGxlZCBmcm9tIHNlbmQoKSAqLworICAgICAgICBpZiAoYXJnICYmICFleGMpCisgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZi0+Zl9sYXN0aSA9PSAtMSkgewotCQlpZiAoYXJnICYmIGFyZyAhPSBQeV9Ob25lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiY2FuJ3Qgc2VuZCBub24tTm9uZSB2YWx1ZSB0byBhICIKLQkJCQkJImp1c3Qtc3RhcnRlZCBnZW5lcmF0b3IiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogUHVzaCBhcmcgb250byB0aGUgZnJhbWUncyB2YWx1ZSBzdGFjayAqLwotCQlyZXN1bHQgPSBhcmcgPyBhcmcgOiBQeV9Ob25lOwotCSAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7Ci0JICAgICAgICAqKGYtPmZfc3RhY2t0b3ArKykgPSByZXN1bHQ7Ci0JfQorICAgIGlmIChmLT5mX2xhc3RpID09IC0xKSB7CisgICAgICAgIGlmIChhcmcgJiYgYXJnICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHNlbmQgbm9uLU5vbmUgdmFsdWUgdG8gYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImp1c3Qtc3RhcnRlZCBnZW5lcmF0b3IiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUHVzaCBhcmcgb250byB0aGUgZnJhbWUncyB2YWx1ZSBzdGFjayAqLworICAgICAgICByZXN1bHQgPSBhcmcgPyBhcmcgOiBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICAgICAgKihmLT5mX3N0YWNrdG9wKyspID0gcmVzdWx0OworICAgIH0KIAotCS8qIEdlbmVyYXRvcnMgYWx3YXlzIHJldHVybiB0byB0aGVpciBtb3N0IHJlY2VudCBjYWxsZXIsIG5vdAotCSAqIG5lY2Vzc2FyaWx5IHRoZWlyIGNyZWF0b3IuICovCi0JUHlfWElOQ1JFRih0c3RhdGUtPmZyYW1lKTsKLQlhc3NlcnQoZi0+Zl9iYWNrID09IE5VTEwpOwotCWYtPmZfYmFjayA9IHRzdGF0ZS0+ZnJhbWU7CisgICAgLyogR2VuZXJhdG9ycyBhbHdheXMgcmV0dXJuIHRvIHRoZWlyIG1vc3QgcmVjZW50IGNhbGxlciwgbm90CisgICAgICogbmVjZXNzYXJpbHkgdGhlaXIgY3JlYXRvci4gKi8KKyAgICBQeV9YSU5DUkVGKHRzdGF0ZS0+ZnJhbWUpOworICAgIGFzc2VydChmLT5mX2JhY2sgPT0gTlVMTCk7CisgICAgZi0+Zl9iYWNrID0gdHN0YXRlLT5mcmFtZTsKIAotCWdlbi0+Z2lfcnVubmluZyA9IDE7Ci0JcmVzdWx0ID0gUHlFdmFsX0V2YWxGcmFtZUV4KGYsIGV4Yyk7Ci0JZ2VuLT5naV9ydW5uaW5nID0gMDsKKyAgICBnZW4tPmdpX3J1bm5pbmcgPSAxOworICAgIHJlc3VsdCA9IFB5RXZhbF9FdmFsRnJhbWVFeChmLCBleGMpOworICAgIGdlbi0+Z2lfcnVubmluZyA9IDA7CiAKLQkvKiBEb24ndCBrZWVwIHRoZSByZWZlcmVuY2UgdG8gZl9iYWNrIGFueSBsb25nZXIgdGhhbiBuZWNlc3NhcnkuICBJdAotCSAqIG1heSBrZWVwIGEgY2hhaW4gb2YgZnJhbWVzIGFsaXZlIG9yIGl0IGNvdWxkIGNyZWF0ZSBhIHJlZmVyZW5jZQotCSAqIGN5Y2xlLiAqLwotCWFzc2VydChmLT5mX2JhY2sgPT0gdHN0YXRlLT5mcmFtZSk7Ci0JUHlfQ0xFQVIoZi0+Zl9iYWNrKTsKKyAgICAvKiBEb24ndCBrZWVwIHRoZSByZWZlcmVuY2UgdG8gZl9iYWNrIGFueSBsb25nZXIgdGhhbiBuZWNlc3NhcnkuICBJdAorICAgICAqIG1heSBrZWVwIGEgY2hhaW4gb2YgZnJhbWVzIGFsaXZlIG9yIGl0IGNvdWxkIGNyZWF0ZSBhIHJlZmVyZW5jZQorICAgICAqIGN5Y2xlLiAqLworICAgIGFzc2VydChmLT5mX2JhY2sgPT0gdHN0YXRlLT5mcmFtZSk7CisgICAgUHlfQ0xFQVIoZi0+Zl9iYWNrKTsKIAotCS8qIElmIHRoZSBnZW5lcmF0b3IganVzdCByZXR1cm5lZCAoYXMgb3Bwb3NlZCB0byB5aWVsZGluZyksIHNpZ25hbAotCSAqIHRoYXQgdGhlIGdlbmVyYXRvciBpcyBleGhhdXN0ZWQuICovCi0JaWYgKHJlc3VsdCA9PSBQeV9Ob25lICYmIGYtPmZfc3RhY2t0b3AgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmVzdWx0ID0gTlVMTDsKLQkJLyogU2V0IGV4Y2VwdGlvbiBpZiBub3QgY2FsbGVkIGJ5IGdlbl9pdGVybmV4dCgpICovCi0JCWlmIChhcmcpCi0JCQlQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOwotCX0KKyAgICAvKiBJZiB0aGUgZ2VuZXJhdG9yIGp1c3QgcmV0dXJuZWQgKGFzIG9wcG9zZWQgdG8geWllbGRpbmcpLCBzaWduYWwKKyAgICAgKiB0aGF0IHRoZSBnZW5lcmF0b3IgaXMgZXhoYXVzdGVkLiAqLworICAgIGlmIChyZXN1bHQgPT0gUHlfTm9uZSAmJiBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIC8qIFNldCBleGNlcHRpb24gaWYgbm90IGNhbGxlZCBieSBnZW5faXRlcm5leHQoKSAqLworICAgICAgICBpZiAoYXJnKQorICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKyAgICB9CiAKLQlpZiAoIXJlc3VsdCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKLQkJLyogZ2VuZXJhdG9yIGNhbid0IGJlIHJlcnVuLCBzbyByZWxlYXNlIHRoZSBmcmFtZSAqLwotCQlQeV9ERUNSRUYoZik7Ci0JCWdlbi0+Z2lfZnJhbWUgPSBOVUxMOwotCX0KKyAgICBpZiAoIXJlc3VsdCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwpIHsKKyAgICAgICAgLyogZ2VuZXJhdG9yIGNhbid0IGJlIHJlcnVuLCBzbyByZWxlYXNlIHRoZSBmcmFtZSAqLworICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgICAgIGdlbi0+Z2lfZnJhbWUgPSBOVUxMOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKHNlbmRfZG9jLApAQCAtMTE2LDcgKzExNiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuX3NlbmQoUHlHZW5PYmplY3QgKmdlbiwgUHlPYmplY3QgKmFyZykKIHsKLQlyZXR1cm4gZ2VuX3NlbmRfZXgoZ2VuLCBhcmcsIDApOworICAgIHJldHVybiBnZW5fc2VuZF9leChnZW4sIGFyZywgMCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjbG9zZV9kb2MsCkBAIC0xMjUsODMgKzEyNSw4MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9jbG9zZShQeUdlbk9iamVjdCAqZ2VuLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmV0dmFsOwotCVB5RXJyX1NldE5vbmUoUHlFeGNfR2VuZXJhdG9yRXhpdCk7Ci0JcmV0dmFsID0gZ2VuX3NlbmRfZXgoZ2VuLCBQeV9Ob25lLCAxKTsKLQlpZiAocmV0dmFsKSB7Ci0JCVB5X0RFQ1JFRihyZXR2YWwpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJnZW5lcmF0b3IgaWdub3JlZCBHZW5lcmF0b3JFeGl0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKQotCSAgICB8fCBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0dlbmVyYXRvckV4aXQpKQotCXsKLQkJUHlFcnJfQ2xlYXIoKTsJLyogaWdub3JlIHRoZXNlIGVycm9ycyAqLwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0dmFsOworICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfR2VuZXJhdG9yRXhpdCk7CisgICAgcmV0dmFsID0gZ2VuX3NlbmRfZXgoZ2VuLCBQeV9Ob25lLCAxKTsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXR2YWwpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRvciBpZ25vcmVkIEdlbmVyYXRvckV4aXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pCisgICAgICAgIHx8IFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfR2VuZXJhdG9yRXhpdCkpCisgICAgeworICAgICAgICBQeUVycl9DbGVhcigpOyAgICAgICAgICAvKiBpZ25vcmUgdGhlc2UgZXJyb3JzICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZAogZ2VuX2RlbChQeU9iamVjdCAqc2VsZikKIHsKLSAgICAgICAgUHlPYmplY3QgKnJlczsKLSAgICAgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKLQlQeUdlbk9iamVjdCAqZ2VuID0gKFB5R2VuT2JqZWN0ICopc2VsZjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisgICAgUHlHZW5PYmplY3QgKmdlbiA9IChQeUdlbk9iamVjdCAqKXNlbGY7CiAKLQlpZiAoZ2VuLT5naV9mcmFtZSA9PSBOVUxMIHx8IGdlbi0+Z2lfZnJhbWUtPmZfc3RhY2t0b3AgPT0gTlVMTCkKLQkJLyogR2VuZXJhdG9yIGlzbid0IHBhdXNlZCwgc28gbm8gbmVlZCB0byBjbG9zZSAqLwotCQlyZXR1cm47CisgICAgaWYgKGdlbi0+Z2lfZnJhbWUgPT0gTlVMTCB8fCBnZW4tPmdpX2ZyYW1lLT5mX3N0YWNrdG9wID09IE5VTEwpCisgICAgICAgIC8qIEdlbmVyYXRvciBpc24ndCBwYXVzZWQsIHNvIG5vIG5lZWQgdG8gY2xvc2UgKi8KKyAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIC8qIFRlbXBvcmFyaWx5IHJlc3VycmVjdCB0aGUgb2JqZWN0LiAqLwotICAgICAgICBhc3NlcnQoc2VsZi0+b2JfcmVmY250ID09IDApOwotICAgICAgICBzZWxmLT5vYl9yZWZjbnQgPSAxOworICAgIC8qIFRlbXBvcmFyaWx5IHJlc3VycmVjdCB0aGUgb2JqZWN0LiAqLworICAgIGFzc2VydChzZWxmLT5vYl9yZWZjbnQgPT0gMCk7CisgICAgc2VsZi0+b2JfcmVmY250ID0gMTsKIAotICAgICAgICAvKiBTYXZlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgaWYgYW55LiAqLwotICAgICAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKKyAgICAvKiBTYXZlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgaWYgYW55LiAqLworICAgIFB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwogCi0JcmVzID0gZ2VuX2Nsb3NlKGdlbiwgTlVMTCk7CisgICAgcmVzID0gZ2VuX2Nsb3NlKGdlbiwgTlVMTCk7CiAKLQlpZiAocmVzID09IE5VTEwpCi0JCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShzZWxmKTsKLQllbHNlCi0JCVB5X0RFQ1JFRihyZXMpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAKLSAgICAgICAgLyogUmVzdG9yZSB0aGUgc2F2ZWQgZXhjZXB0aW9uLiAqLwotICAgICAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworICAgIC8qIFJlc3RvcmUgdGhlIHNhdmVkIGV4Y2VwdGlvbi4gKi8KKyAgICBQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOwogCi0gICAgICAgIC8qIFVuZG8gdGhlIHRlbXBvcmFyeSByZXN1cnJlY3Rpb247IGNhbid0IHVzZSBERUNSRUYgaGVyZSwgaXQgd291bGQKLSAgICAgICAgICogY2F1c2UgYSByZWN1cnNpdmUgY2FsbC4KLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydChzZWxmLT5vYl9yZWZjbnQgPiAwKTsKLSAgICAgICAgaWYgKC0tc2VsZi0+b2JfcmVmY250ID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAvKiB0aGlzIGlzIHRoZSBub3JtYWwgcGF0aCBvdXQgKi8KKyAgICAvKiBVbmRvIHRoZSB0ZW1wb3JhcnkgcmVzdXJyZWN0aW9uOyBjYW4ndCB1c2UgREVDUkVGIGhlcmUsIGl0IHdvdWxkCisgICAgICogY2F1c2UgYSByZWN1cnNpdmUgY2FsbC4KKyAgICAgKi8KKyAgICBhc3NlcnQoc2VsZi0+b2JfcmVmY250ID4gMCk7CisgICAgaWYgKC0tc2VsZi0+b2JfcmVmY250ID09IDApCisgICAgICAgIHJldHVybjsgLyogdGhpcyBpcyB0aGUgbm9ybWFsIHBhdGggb3V0ICovCiAKLSAgICAgICAgLyogY2xvc2UoKSByZXN1cnJlY3RlZCBpdCEgIE1ha2UgaXQgbG9vayBsaWtlIHRoZSBvcmlnaW5hbCBQeV9ERUNSRUYKLSAgICAgICAgICogbmV2ZXIgaGFwcGVuZWQuCi0gICAgICAgICAqLwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUHlfc3NpemVfdCByZWZjbnQgPSBzZWxmLT5vYl9yZWZjbnQ7Ci0gICAgICAgICAgICAgICAgX1B5X05ld1JlZmVyZW5jZShzZWxmKTsKLSAgICAgICAgICAgICAgICBzZWxmLT5vYl9yZWZjbnQgPSByZWZjbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KFB5VHlwZV9JU19HQyhzZWxmLT5vYl90eXBlKSAmJgotICAgICAgICAgICAgICAgX1B5X0FTX0dDKHNlbGYpLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsKKyAgICAvKiBjbG9zZSgpIHJlc3VycmVjdGVkIGl0ISAgTWFrZSBpdCBsb29rIGxpa2UgdGhlIG9yaWdpbmFsIFB5X0RFQ1JFRgorICAgICAqIG5ldmVyIGhhcHBlbmVkLgorICAgICAqLworICAgIHsKKyAgICAgICAgUHlfc3NpemVfdCByZWZjbnQgPSBzZWxmLT5vYl9yZWZjbnQ7CisgICAgICAgIF9QeV9OZXdSZWZlcmVuY2Uoc2VsZik7CisgICAgICAgIHNlbGYtPm9iX3JlZmNudCA9IHJlZmNudDsKKyAgICB9CisgICAgYXNzZXJ0KFB5VHlwZV9JU19HQyhzZWxmLT5vYl90eXBlKSAmJgorICAgICAgICAgICBfUHlfQVNfR0Moc2VsZiktPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpOwogCi0gICAgICAgIC8qIElmIFB5X1JFRl9ERUJVRywgX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgX1B5X1JlZlRvdGFsLCBzbwotICAgICAgICAgKiB3ZSBuZWVkIHRvIHVuZG8gdGhhdC4gKi8KLSAgICAgICAgX1B5X0RFQ19SRUZUT1RBTDsKLSAgICAgICAgLyogSWYgUHlfVFJBQ0VfUkVGUywgX1B5X05ld1JlZmVyZW5jZSByZS1hZGRlZCBzZWxmIHRvIHRoZSBvYmplY3QKLSAgICAgICAgICogY2hhaW4sIHNvIG5vIG1vcmUgdG8gZG8gdGhlcmUuCi0gICAgICAgICAqIElmIENPVU5UX0FMTE9DUywgdGhlIG9yaWdpbmFsIGRlY3JlZiBidW1wZWQgdHBfZnJlZXMsIGFuZAotICAgICAgICAgKiBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCB0cF9hbGxvY3M6ICBib3RoIG9mIHRob3NlIG5lZWQgdG8gYmUKLSAgICAgICAgICogdW5kb25lLgotICAgICAgICAgKi8KKyAgICAvKiBJZiBQeV9SRUZfREVCVUcsIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIF9QeV9SZWZUb3RhbCwgc28KKyAgICAgKiB3ZSBuZWVkIHRvIHVuZG8gdGhhdC4gKi8KKyAgICBfUHlfREVDX1JFRlRPVEFMOworICAgIC8qIElmIFB5X1RSQUNFX1JFRlMsIF9QeV9OZXdSZWZlcmVuY2UgcmUtYWRkZWQgc2VsZiB0byB0aGUgb2JqZWN0CisgICAgICogY2hhaW4sIHNvIG5vIG1vcmUgdG8gZG8gdGhlcmUuCisgICAgICogSWYgQ09VTlRfQUxMT0NTLCB0aGUgb3JpZ2luYWwgZGVjcmVmIGJ1bXBlZCB0cF9mcmVlcywgYW5kCisgICAgICogX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgdHBfYWxsb2NzOiAgYm90aCBvZiB0aG9zZSBuZWVkIHRvIGJlCisgICAgICogdW5kb25lLgorICAgICAqLwogI2lmZGVmIENPVU5UX0FMTE9DUwotICAgICAgICAtLXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWVzOwotICAgICAgICAtLXNlbGYtPm9iX3R5cGUtPnRwX2FsbG9jczsKKyAgICAtLXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWVzOworICAgIC0tc2VsZi0+b2JfdHlwZS0+dHBfYWxsb2NzOwogI2VuZGlmCiB9CiAKQEAgLTIxNCw5MSArMjE0LDkxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuX3Rocm93KFB5R2VuT2JqZWN0ICpnZW4sIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0eXA7Ci0JUHlPYmplY3QgKnRiID0gTlVMTDsKLQlQeU9iamVjdCAqdmFsID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdHlwOworICAgIFB5T2JqZWN0ICp0YiA9IE5VTEw7CisgICAgUHlPYmplY3QgKnZhbCA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0aHJvdyIsIDEsIDMsICZ0eXAsICZ2YWwsICZ0YikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRocm93IiwgMSwgMywgJnR5cCwgJnZhbCwgJnRiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBGaXJzdCwgY2hlY2sgdGhlIHRyYWNlYmFjayBhcmd1bWVudCwgcmVwbGFjaW5nIE5vbmUgd2l0aAotCSAgIE5VTEwuICovCi0JaWYgKHRiID09IFB5X05vbmUpCi0JCXRiID0gTlVMTDsKLQllbHNlIGlmICh0YiAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayh0YikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJ0aHJvdygpIHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSB0cmFjZWJhY2sgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBGaXJzdCwgY2hlY2sgdGhlIHRyYWNlYmFjayBhcmd1bWVudCwgcmVwbGFjaW5nIE5vbmUgd2l0aAorICAgICAgIE5VTEwuICovCisgICAgaWYgKHRiID09IFB5X05vbmUpCisgICAgICAgIHRiID0gTlVMTDsKKyAgICBlbHNlIGlmICh0YiAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayh0YikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJ0aHJvdygpIHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSB0cmFjZWJhY2sgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0lOQ1JFRih0eXApOwotCVB5X1hJTkNSRUYodmFsKTsKLQlQeV9YSU5DUkVGKHRiKTsKKyAgICBQeV9JTkNSRUYodHlwKTsKKyAgICBQeV9YSU5DUkVGKHZhbCk7CisgICAgUHlfWElOQ1JFRih0Yik7CiAKLQlpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0eXApKSB7Ci0JCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmdHlwLCAmdmFsLCAmdGIpOwotCX0KKyAgICBpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0eXApKSB7CisgICAgICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmdHlwLCAmdmFsLCAmdGIpOworICAgIH0KIAotCWVsc2UgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodHlwKSkgewotCQkvKiBSYWlzaW5nIGFuIGluc3RhbmNlLiAgVGhlIHZhbHVlIHNob3VsZCBiZSBhIGR1bW15LiAqLwotCQlpZiAodmFsICYmIHZhbCAhPSBQeV9Ob25lKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAiaW5zdGFuY2UgZXhjZXB0aW9uIG1heSBub3QgaGF2ZSBhIHNlcGFyYXRlIHZhbHVlIik7Ci0JCQlnb3RvIGZhaWxlZF90aHJvdzsKLQkJfQotCQllbHNlIHsKLQkJCS8qIE5vcm1hbGl6ZSB0byByYWlzZSA8Y2xhc3M+LCA8aW5zdGFuY2U+ICovCi0JCQlQeV9YREVDUkVGKHZhbCk7Ci0JCQl2YWwgPSB0eXA7Ci0JCQl0eXAgPSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHR5cCk7Ci0JCQlQeV9JTkNSRUYodHlwKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogTm90IHNvbWV0aGluZyB5b3UgY2FuIHJhaXNlLiAgdGhyb3coKSBmYWlscy4gKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImV4Y2VwdGlvbnMgbXVzdCBiZSBjbGFzc2VzLCBvciBpbnN0YW5jZXMsIG5vdCAlcyIsCi0JCQkgICAgIHR5cC0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlnb3RvIGZhaWxlZF90aHJvdzsKLQl9CisgICAgZWxzZSBpZiAoUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh0eXApKSB7CisgICAgICAgIC8qIFJhaXNpbmcgYW4gaW5zdGFuY2UuICBUaGUgdmFsdWUgc2hvdWxkIGJlIGEgZHVtbXkuICovCisgICAgICAgIGlmICh2YWwgJiYgdmFsICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICJpbnN0YW5jZSBleGNlcHRpb24gbWF5IG5vdCBoYXZlIGEgc2VwYXJhdGUgdmFsdWUiKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkX3Rocm93OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogTm9ybWFsaXplIHRvIHJhaXNlIDxjbGFzcz4sIDxpbnN0YW5jZT4gKi8KKyAgICAgICAgICAgIFB5X1hERUNSRUYodmFsKTsKKyAgICAgICAgICAgIHZhbCA9IHR5cDsKKyAgICAgICAgICAgIHR5cCA9IFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3ModHlwKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0eXApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBOb3Qgc29tZXRoaW5nIHlvdSBjYW4gcmFpc2UuICB0aHJvdygpIGZhaWxzLiAqLworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnMgbXVzdCBiZSBjbGFzc2VzLCBvciBpbnN0YW5jZXMsIG5vdCAlcyIsCisgICAgICAgICAgICAgICAgICAgICB0eXAtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgZ290byBmYWlsZWRfdGhyb3c7CisgICAgfQogCi0JUHlFcnJfUmVzdG9yZSh0eXAsIHZhbCwgdGIpOwotCXJldHVybiBnZW5fc2VuZF9leChnZW4sIFB5X05vbmUsIDEpOworICAgIFB5RXJyX1Jlc3RvcmUodHlwLCB2YWwsIHRiKTsKKyAgICByZXR1cm4gZ2VuX3NlbmRfZXgoZ2VuLCBQeV9Ob25lLCAxKTsKIAogZmFpbGVkX3Rocm93OgotCS8qIERpZG4ndCB1c2Ugb3VyIGFyZ3VtZW50cywgc28gcmVzdG9yZSB0aGVpciBvcmlnaW5hbCByZWZjb3VudHMgKi8KLQlQeV9ERUNSRUYodHlwKTsKLQlQeV9YREVDUkVGKHZhbCk7Ci0JUHlfWERFQ1JFRih0Yik7Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogRGlkbid0IHVzZSBvdXIgYXJndW1lbnRzLCBzbyByZXN0b3JlIHRoZWlyIG9yaWdpbmFsIHJlZmNvdW50cyAqLworICAgIFB5X0RFQ1JFRih0eXApOworICAgIFB5X1hERUNSRUYodmFsKTsKKyAgICBQeV9YREVDUkVGKHRiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuX2l0ZXJuZXh0KFB5R2VuT2JqZWN0ICpnZW4pCiB7Ci0JcmV0dXJuIGdlbl9zZW5kX2V4KGdlbiwgTlVMTCwgMCk7CisgICAgcmV0dXJuIGdlbl9zZW5kX2V4KGdlbiwgTlVMTCwgMCk7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGdlbl9yZXByKFB5R2VuT2JqZWN0ICpnZW4pCiB7Ci0JY2hhciAqY29kZV9uYW1lOwotCWNvZGVfbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKCgoUHlDb2RlT2JqZWN0ICopZ2VuLT5naV9jb2RlKS0+Y29fbmFtZSk7Ci0JaWYgKGNvZGVfbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGdlbmVyYXRvciBvYmplY3QgJS4yMDBzIGF0ICVwPiIsCi0JCQkJICAgY29kZV9uYW1lLCBnZW4pOworICAgIGNoYXIgKmNvZGVfbmFtZTsKKyAgICBjb2RlX25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZygoKFB5Q29kZU9iamVjdCAqKWdlbi0+Z2lfY29kZSktPmNvX25hbWUpOworICAgIGlmIChjb2RlX25hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxnZW5lcmF0b3Igb2JqZWN0ICUuMjAwcyBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbmFtZSwgZ2VuKTsKIH0KIAogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2VuX2dldF9uYW1lKFB5R2VuT2JqZWN0ICpnZW4pCiB7Ci0JUHlPYmplY3QgKm5hbWUgPSAoKFB5Q29kZU9iamVjdCAqKWdlbi0+Z2lfY29kZSktPmNvX25hbWU7Ci0JUHlfSU5DUkVGKG5hbWUpOwotCXJldHVybiBuYW1lOworICAgIFB5T2JqZWN0ICpuYW1lID0gKChQeUNvZGVPYmplY3QgKilnZW4tPmdpX2NvZGUpLT5jb19uYW1lOworICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gbmFtZTsKIH0KIAogCkBAIC0zMDYsMTA5ICszMDYsMTA5IEBACiAiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0b3IncyBhc3NvY2lhdGVkIGNvZGUgb2JqZWN0LiIpOwogCiBzdGF0aWMgUHlHZXRTZXREZWYgZ2VuX2dldHNldGxpc3RbXSA9IHsKLQl7Il9fbmFtZV9fIiwgKGdldHRlcilnZW5fZ2V0X25hbWUsIE5VTEwsIGdlbl9fbmFtZV9fZG9jX199LAotCXtOVUxMfQorICAgIHsiX19uYW1lX18iLCAoZ2V0dGVyKWdlbl9nZXRfbmFtZSwgTlVMTCwgZ2VuX19uYW1lX19kb2NfX30sCisgICAge05VTEx9CiB9OwogCiAKIHN0YXRpYyBQeU1lbWJlckRlZiBnZW5fbWVtYmVybGlzdFtdID0gewotCXsiZ2lfZnJhbWUiLAlUX09CSkVDVCwgb2Zmc2V0b2YoUHlHZW5PYmplY3QsIGdpX2ZyYW1lKSwJUk99LAotCXsiZ2lfcnVubmluZyIsCVRfSU5ULCAgICBvZmZzZXRvZihQeUdlbk9iamVjdCwgZ2lfcnVubmluZyksCVJPfSwKLSAgICAgICAgeyJnaV9jb2RlIiwgICAgIFRfT0JKRUNULCBvZmZzZXRvZihQeUdlbk9iamVjdCwgZ2lfY29kZSksICBST30sCi0Je05VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJnaV9mcmFtZSIsICAgICAgICBUX09CSkVDVCwgb2Zmc2V0b2YoUHlHZW5PYmplY3QsIGdpX2ZyYW1lKSwgICAgICBST30sCisgICAgeyJnaV9ydW5uaW5nIiwgICAgICBUX0lOVCwgICAgb2Zmc2V0b2YoUHlHZW5PYmplY3QsIGdpX3J1bm5pbmcpLCAgICBST30sCisgICAgeyJnaV9jb2RlIiwgICAgIFRfT0JKRUNULCBvZmZzZXRvZihQeUdlbk9iamVjdCwgZ2lfY29kZSksICBST30sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBnZW5fbWV0aG9kc1tdID0gewotCXsic2VuZCIsKFB5Q0Z1bmN0aW9uKWdlbl9zZW5kLCBNRVRIX08sIHNlbmRfZG9jfSwKLQl7InRocm93IiwoUHlDRnVuY3Rpb24pZ2VuX3Rocm93LCBNRVRIX1ZBUkFSR1MsIHRocm93X2RvY30sCi0JeyJjbG9zZSIsKFB5Q0Z1bmN0aW9uKWdlbl9jbG9zZSwgTUVUSF9OT0FSR1MsIGNsb3NlX2RvY30sCi0Je05VTEwsIE5VTEx9CS8qIFNlbnRpbmVsICovCisgICAgeyJzZW5kIiwoUHlDRnVuY3Rpb24pZ2VuX3NlbmQsIE1FVEhfTywgc2VuZF9kb2N9LAorICAgIHsidGhyb3ciLChQeUNGdW5jdGlvbilnZW5fdGhyb3csIE1FVEhfVkFSQVJHUywgdGhyb3dfZG9jfSwKKyAgICB7ImNsb3NlIiwoUHlDRnVuY3Rpb24pZ2VuX2Nsb3NlLCBNRVRIX05PQVJHUywgY2xvc2VfZG9jfSwKKyAgICB7TlVMTCwgTlVMTH0gICAgICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlHZW5fVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJnZW5lcmF0b3IiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5R2VuT2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpZ2VuX2RlYWxsb2MsIAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsIAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpZ2VuX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKWdlbl90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0gCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCTAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKFB5R2VuT2JqZWN0LCBnaV93ZWFrcmVmbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpZ2VuX2l0ZXJuZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KLQlnZW5fbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCWdlbl9tZW1iZXJsaXN0LAkJCQkvKiB0cF9tZW1iZXJzICovCi0JZ2VuX2dldHNldGxpc3QsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJnZW5lcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeUdlbk9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilnZW5fZGVhbGxvYywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKWdlbl9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWdlbl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeUdlbk9iamVjdCwgZ2lfd2Vha3JlZmxpc3QpLCAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylnZW5faXRlcm5leHQsICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGdlbl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGdlbl9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGdlbl9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCiAKLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfbmV3ICovCi0JMCwJCQkJCS8qIHRwX2ZyZWUgKi8KLQkwLAkJCQkJLyogdHBfaXNfZ2MgKi8KLQkwLAkJCQkJLyogdHBfYmFzZXMgKi8KLQkwLAkJCQkJLyogdHBfbXJvICovCi0JMCwJCQkJCS8qIHRwX2NhY2hlICovCi0JMCwJCQkJCS8qIHRwX3N1YmNsYXNzZXMgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3QgKi8KLQlnZW5fZGVsLAkJCQkvKiB0cF9kZWwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pc19nYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FjaGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N1YmNsYXNzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0ICovCisgICAgZ2VuX2RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWwgKi8KIH07CiAKIFB5T2JqZWN0ICoKIFB5R2VuX05ldyhQeUZyYW1lT2JqZWN0ICpmKQogewotCVB5R2VuT2JqZWN0ICpnZW4gPSBQeU9iamVjdF9HQ19OZXcoUHlHZW5PYmplY3QsICZQeUdlbl9UeXBlKTsKLQlpZiAoZ2VuID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZ2VuLT5naV9mcmFtZSA9IGY7Ci0JUHlfSU5DUkVGKGYtPmZfY29kZSk7Ci0JZ2VuLT5naV9jb2RlID0gKFB5T2JqZWN0ICopKGYtPmZfY29kZSk7Ci0JZ2VuLT5naV9ydW5uaW5nID0gMDsKLQlnZW4tPmdpX3dlYWtyZWZsaXN0ID0gTlVMTDsKLQlfUHlPYmplY3RfR0NfVFJBQ0soZ2VuKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZ2VuOworICAgIFB5R2VuT2JqZWN0ICpnZW4gPSBQeU9iamVjdF9HQ19OZXcoUHlHZW5PYmplY3QsICZQeUdlbl9UeXBlKTsKKyAgICBpZiAoZ2VuID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZ2VuLT5naV9mcmFtZSA9IGY7CisgICAgUHlfSU5DUkVGKGYtPmZfY29kZSk7CisgICAgZ2VuLT5naV9jb2RlID0gKFB5T2JqZWN0ICopKGYtPmZfY29kZSk7CisgICAgZ2VuLT5naV9ydW5uaW5nID0gMDsKKyAgICBnZW4tPmdpX3dlYWtyZWZsaXN0ID0gTlVMTDsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soZ2VuKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZ2VuOwogfQogCiBpbnQKIFB5R2VuX05lZWRzRmluYWxpemluZyhQeUdlbk9iamVjdCAqZ2VuKQogewotCWludCBpOwotCVB5RnJhbWVPYmplY3QgKmYgPSBnZW4tPmdpX2ZyYW1lOworICAgIGludCBpOworICAgIFB5RnJhbWVPYmplY3QgKmYgPSBnZW4tPmdpX2ZyYW1lOwogCi0JaWYgKGYgPT0gTlVMTCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwgfHwgZi0+Zl9pYmxvY2sgPD0gMCkKLQkJcmV0dXJuIDA7IC8qIG5vIGZyYW1lIG9yIGVtcHR5IGJsb2Nrc3RhY2sgPT0gbm8gZmluYWxpemF0aW9uICovCisgICAgaWYgKGYgPT0gTlVMTCB8fCBmLT5mX3N0YWNrdG9wID09IE5VTEwgfHwgZi0+Zl9pYmxvY2sgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7IC8qIG5vIGZyYW1lIG9yIGVtcHR5IGJsb2Nrc3RhY2sgPT0gbm8gZmluYWxpemF0aW9uICovCiAKLQkvKiBBbnkgYmxvY2sgdHlwZSBiZXNpZGVzIGEgbG9vcCByZXF1aXJlcyBjbGVhbnVwLiAqLwotCWkgPSBmLT5mX2libG9jazsKLQl3aGlsZSAoLS1pID49IDApIHsKLQkJaWYgKGYtPmZfYmxvY2tzdGFja1tpXS5iX3R5cGUgIT0gU0VUVVBfTE9PUCkKLQkJCXJldHVybiAxOwotCX0KKyAgICAvKiBBbnkgYmxvY2sgdHlwZSBiZXNpZGVzIGEgbG9vcCByZXF1aXJlcyBjbGVhbnVwLiAqLworICAgIGkgPSBmLT5mX2libG9jazsKKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgaWYgKGYtPmZfYmxvY2tzdGFja1tpXS5iX3R5cGUgIT0gU0VUVVBfTE9PUCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KIAotCS8qIE5vIGJsb2NrcyBleGNlcHQgbG9vcHMsIGl0J3Mgc2FmZSB0byBza2lwIGZpbmFsaXphdGlvbi4gKi8KLQlyZXR1cm4gMDsKKyAgICAvKiBObyBibG9ja3MgZXhjZXB0IGxvb3BzLCBpdCdzIHNhZmUgdG8gc2tpcCBmaW5hbGl6YXRpb24uICovCisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2ludG9iamVjdC5jIGIvT2JqZWN0cy9pbnRvYmplY3QuYwppbmRleCA0MDZhNDVhLi4wMjk4NTRmIDEwMDY0NAotLS0gYS9PYmplY3RzL2ludG9iamVjdC5jCisrKyBiL09iamVjdHMvaW50b2JqZWN0LmMKQEAgLTksNyArOSw3IEBACiBsb25nCiBQeUludF9HZXRNYXgodm9pZCkKIHsKLQlyZXR1cm4gTE9OR19NQVg7CS8qIFRvIGluaXRpYWxpemUgc3lzLm1heGludCAqLworICAgIHJldHVybiBMT05HX01BWDsgICAgICAgICAgICAvKiBUbyBpbml0aWFsaXplIHN5cy5tYXhpbnQgKi8KIH0KIAogLyogSW50ZWdlcnMgYXJlIHF1aXRlIG5vcm1hbCBvYmplY3RzLCB0byBtYWtlIG9iamVjdCBoYW5kbGluZyB1bmlmb3JtLgpAQCAtMjksMTMgKzI5LDEzIEBACiAgICB2aWEgYWJ1c2Ugb2YgdGhlaXIgb2JfdHlwZSBtZW1iZXJzLgogKi8KIAotI2RlZmluZSBCTE9DS19TSVpFCTEwMDAJLyogMUsgbGVzcyB0eXBpY2FsIG1hbGxvYyBvdmVyaGVhZCAqLwotI2RlZmluZSBCSEVBRF9TSVpFCTgJLyogRW5vdWdoIGZvciBhIDY0LWJpdCBwb2ludGVyICovCi0jZGVmaW5lIE5fSU5UT0JKRUNUUwkoKEJMT0NLX1NJWkUgLSBCSEVBRF9TSVpFKSAvIHNpemVvZihQeUludE9iamVjdCkpCisjZGVmaW5lIEJMT0NLX1NJWkUgICAgICAxMDAwICAgIC8qIDFLIGxlc3MgdHlwaWNhbCBtYWxsb2Mgb3ZlcmhlYWQgKi8KKyNkZWZpbmUgQkhFQURfU0laRSAgICAgIDggICAgICAgLyogRW5vdWdoIGZvciBhIDY0LWJpdCBwb2ludGVyICovCisjZGVmaW5lIE5fSU5UT0JKRUNUUyAgICAoKEJMT0NLX1NJWkUgLSBCSEVBRF9TSVpFKSAvIHNpemVvZihQeUludE9iamVjdCkpCiAKIHN0cnVjdCBfaW50YmxvY2sgewotCXN0cnVjdCBfaW50YmxvY2sgKm5leHQ7Ci0JUHlJbnRPYmplY3Qgb2JqZWN0c1tOX0lOVE9CSkVDVFNdOworICAgIHN0cnVjdCBfaW50YmxvY2sgKm5leHQ7CisgICAgUHlJbnRPYmplY3Qgb2JqZWN0c1tOX0lOVE9CSkVDVFNdOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX2ludGJsb2NrIFB5SW50QmxvY2s7CkBAIC00NiwyOCArNDYsMjggQEAKIHN0YXRpYyBQeUludE9iamVjdCAqCiBmaWxsX2ZyZWVfbGlzdCh2b2lkKQogewotCVB5SW50T2JqZWN0ICpwLCAqcTsKLQkvKiBQeXRob24ncyBvYmplY3QgYWxsb2NhdG9yIGlzbid0IGFwcHJvcHJpYXRlIGZvciBsYXJnZSBibG9ja3MuICovCi0JcCA9IChQeUludE9iamVjdCAqKSBQeU1lbV9NQUxMT0Moc2l6ZW9mKFB5SW50QmxvY2spKTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gKFB5SW50T2JqZWN0ICopIFB5RXJyX05vTWVtb3J5KCk7Ci0JKChQeUludEJsb2NrICopcCktPm5leHQgPSBibG9ja19saXN0OwotCWJsb2NrX2xpc3QgPSAoUHlJbnRCbG9jayAqKXA7Ci0JLyogTGluayB0aGUgaW50IG9iamVjdHMgdG9nZXRoZXIsIGZyb20gcmVhciB0byBmcm9udCwgdGhlbiByZXR1cm4KLQkgICB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBpbnQgb2JqZWN0IGluIHRoZSBibG9jay4gKi8KLQlwID0gJigoUHlJbnRCbG9jayAqKXApLT5vYmplY3RzWzBdOwotCXEgPSBwICsgTl9JTlRPQkpFQ1RTOwotCXdoaWxlICgtLXEgPiBwKQotCQlQeV9UWVBFKHEpID0gKHN0cnVjdCBfdHlwZW9iamVjdCAqKShxLTEpOwotCVB5X1RZUEUocSkgPSBOVUxMOwotCXJldHVybiBwICsgTl9JTlRPQkpFQ1RTIC0gMTsKKyAgICBQeUludE9iamVjdCAqcCwgKnE7CisgICAgLyogUHl0aG9uJ3Mgb2JqZWN0IGFsbG9jYXRvciBpc24ndCBhcHByb3ByaWF0ZSBmb3IgbGFyZ2UgYmxvY2tzLiAqLworICAgIHAgPSAoUHlJbnRPYmplY3QgKikgUHlNZW1fTUFMTE9DKHNpemVvZihQeUludEJsb2NrKSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChQeUludE9iamVjdCAqKSBQeUVycl9Ob01lbW9yeSgpOworICAgICgoUHlJbnRCbG9jayAqKXApLT5uZXh0ID0gYmxvY2tfbGlzdDsKKyAgICBibG9ja19saXN0ID0gKFB5SW50QmxvY2sgKilwOworICAgIC8qIExpbmsgdGhlIGludCBvYmplY3RzIHRvZ2V0aGVyLCBmcm9tIHJlYXIgdG8gZnJvbnQsIHRoZW4gcmV0dXJuCisgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhc3QgaW50IG9iamVjdCBpbiB0aGUgYmxvY2suICovCisgICAgcCA9ICYoKFB5SW50QmxvY2sgKilwKS0+b2JqZWN0c1swXTsKKyAgICBxID0gcCArIE5fSU5UT0JKRUNUUzsKKyAgICB3aGlsZSAoLS1xID4gcCkKKyAgICAgICAgUHlfVFlQRShxKSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKikocS0xKTsKKyAgICBQeV9UWVBFKHEpID0gTlVMTDsKKyAgICByZXR1cm4gcCArIE5fSU5UT0JKRUNUUyAtIDE7CiB9CiAKICNpZm5kZWYgTlNNQUxMUE9TSU5UUwotI2RlZmluZSBOU01BTExQT1NJTlRTCQkyNTcKKyNkZWZpbmUgTlNNQUxMUE9TSU5UUyAgICAgICAgICAgMjU3CiAjZW5kaWYKICNpZm5kZWYgTlNNQUxMTkVHSU5UUwotI2RlZmluZSBOU01BTExORUdJTlRTCQk1CisjZGVmaW5lIE5TTUFMTE5FR0lOVFMgICAgICAgICAgIDUKICNlbmRpZgogI2lmIE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTID4gMAogLyogUmVmZXJlbmNlcyB0byBzbWFsbCBpbnRlZ2VycyBhcmUgc2F2ZWQgaW4gdGhpcyBhcnJheSBzbyB0aGF0IHRoZXkKQEAgLTg0LDMyNiArODQsMzI2IEBACiBQeU9iamVjdCAqCiBQeUludF9Gcm9tTG9uZyhsb25nIGl2YWwpCiB7Ci0JcmVnaXN0ZXIgUHlJbnRPYmplY3QgKnY7CisgICAgcmVnaXN0ZXIgUHlJbnRPYmplY3QgKnY7CiAjaWYgTlNNQUxMTkVHSU5UUyArIE5TTUFMTFBPU0lOVFMgPiAwCi0JaWYgKC1OU01BTExORUdJTlRTIDw9IGl2YWwgJiYgaXZhbCA8IE5TTUFMTFBPU0lOVFMpIHsKLQkJdiA9IHNtYWxsX2ludHNbaXZhbCArIE5TTUFMTE5FR0lOVFNdOwotCQlQeV9JTkNSRUYodik7CisgICAgaWYgKC1OU01BTExORUdJTlRTIDw9IGl2YWwgJiYgaXZhbCA8IE5TTUFMTFBPU0lOVFMpIHsKKyAgICAgICAgdiA9IHNtYWxsX2ludHNbaXZhbCArIE5TTUFMTE5FR0lOVFNdOworICAgICAgICBQeV9JTkNSRUYodik7CiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JCWlmIChpdmFsID49IDApCi0JCQlxdWlja19pbnRfYWxsb2NzKys7Ci0JCWVsc2UKLQkJCXF1aWNrX25lZ19pbnRfYWxsb2NzKys7CisgICAgICAgIGlmIChpdmFsID49IDApCisgICAgICAgICAgICBxdWlja19pbnRfYWxsb2NzKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHF1aWNrX25lZ19pbnRfYWxsb2NzKys7CiAjZW5kaWYKLQkJcmV0dXJuIChQeU9iamVjdCAqKSB2OwotCX0KKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKSB2OworICAgIH0KICNlbmRpZgotCWlmIChmcmVlX2xpc3QgPT0gTlVMTCkgewotCQlpZiAoKGZyZWVfbGlzdCA9IGZpbGxfZnJlZV9saXN0KCkpID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogSW5saW5lIFB5T2JqZWN0X05ldyAqLwotCXYgPSBmcmVlX2xpc3Q7Ci0JZnJlZV9saXN0ID0gKFB5SW50T2JqZWN0ICopUHlfVFlQRSh2KTsKLQlQeU9iamVjdF9JTklUKHYsICZQeUludF9UeXBlKTsKLQl2LT5vYl9pdmFsID0gaXZhbDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHY7CisgICAgaWYgKGZyZWVfbGlzdCA9PSBOVUxMKSB7CisgICAgICAgIGlmICgoZnJlZV9saXN0ID0gZmlsbF9mcmVlX2xpc3QoKSkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCisgICAgdiA9IGZyZWVfbGlzdDsKKyAgICBmcmVlX2xpc3QgPSAoUHlJbnRPYmplY3QgKilQeV9UWVBFKHYpOworICAgIFB5T2JqZWN0X0lOSVQodiwgJlB5SW50X1R5cGUpOworICAgIHYtPm9iX2l2YWwgPSBpdmFsOworICAgIHJldHVybiAoUHlPYmplY3QgKikgdjsKIH0KIAogUHlPYmplY3QgKgogUHlJbnRfRnJvbVNpemVfdChzaXplX3QgaXZhbCkKIHsKLQlpZiAoaXZhbCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWl2YWwpOwotCXJldHVybiBfUHlMb25nX0Zyb21TaXplX3QoaXZhbCk7CisgICAgaWYgKGl2YWwgPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylpdmFsKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tU2l6ZV90KGl2YWwpOwogfQogCiBQeU9iamVjdCAqCiBQeUludF9Gcm9tU3NpemVfdChQeV9zc2l6ZV90IGl2YWwpCiB7Ci0JaWYgKGl2YWwgPj0gTE9OR19NSU4gJiYgaXZhbCA8PSBMT05HX01BWCkKLQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKWl2YWwpOwotCXJldHVybiBfUHlMb25nX0Zyb21Tc2l6ZV90KGl2YWwpOworICAgIGlmIChpdmFsID49IExPTkdfTUlOICYmIGl2YWwgPD0gTE9OR19NQVgpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylpdmFsKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tU3NpemVfdChpdmFsKTsKIH0KIAogc3RhdGljIHZvaWQKIGludF9kZWFsbG9jKFB5SW50T2JqZWN0ICp2KQogewotCWlmIChQeUludF9DaGVja0V4YWN0KHYpKSB7Ci0JCVB5X1RZUEUodikgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopZnJlZV9saXN0OwotCQlmcmVlX2xpc3QgPSB2OwotCX0KLQllbHNlCi0JCVB5X1RZUEUodiktPnRwX2ZyZWUoKFB5T2JqZWN0ICopdik7CisgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgUHlfVFlQRSh2KSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKilmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IHY7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUHlfVFlQRSh2KS0+dHBfZnJlZSgoUHlPYmplY3QgKil2KTsKIH0KIAogc3RhdGljIHZvaWQKIGludF9mcmVlKFB5SW50T2JqZWN0ICp2KQogewotCVB5X1RZUEUodikgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopZnJlZV9saXN0OwotCWZyZWVfbGlzdCA9IHY7CisgICAgUHlfVFlQRSh2KSA9IChzdHJ1Y3QgX3R5cGVvYmplY3QgKilmcmVlX2xpc3Q7CisgICAgZnJlZV9saXN0ID0gdjsKIH0KIAogbG9uZwogUHlJbnRfQXNMb25nKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCkKIHsKLQlQeU51bWJlck1ldGhvZHMgKm5iOwotCVB5SW50T2JqZWN0ICppbzsKLQlsb25nIHZhbDsKKyAgICBQeU51bWJlck1ldGhvZHMgKm5iOworICAgIFB5SW50T2JqZWN0ICppbzsKKyAgICBsb25nIHZhbDsKIAotCWlmIChvcCAmJiBQeUludF9DaGVjayhvcCkpCi0JCXJldHVybiBQeUludF9BU19MT05HKChQeUludE9iamVjdCopIG9wKTsKKyAgICBpZiAob3AgJiYgUHlJbnRfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKSBvcCk7CiAKLQlpZiAob3AgPT0gTlVMTCB8fCAobmIgPSBQeV9UWVBFKG9wKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8Ci0JICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChvcCA9PSBOVUxMIHx8IChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKKyAgICAgICAgbmItPm5iX2ludCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKLQlpZiAoaW8gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmICghUHlJbnRfQ2hlY2soaW8pKSB7Ci0JCWlmIChQeUxvbmdfQ2hlY2soaW8pKSB7Ci0JCQkvKiBnb3QgYSBsb25nPyA9PiByZXRyeSBpbnQgY29udmVyc2lvbiAqLwotCQkJdmFsID0gUHlMb25nX0FzTG9uZygoUHlPYmplY3QgKilpbyk7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJaWYgKCh2YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIHZhbDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVB5X0RFQ1JFRihpbyk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkibmJfaW50IHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIGlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfaW50KSAob3ApOworICAgIGlmIChpbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFQeUludF9DaGVjayhpbykpIHsKKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKKyAgICAgICAgICAgIC8qIGdvdCBhIGxvbmc/ID0+IHJldHJ5IGludCBjb252ZXJzaW9uICovCisgICAgICAgICAgICB2YWwgPSBQeUxvbmdfQXNMb25nKChQeU9iamVjdCAqKWlvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICBpZiAoKHZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUHlfREVDUkVGKGlvKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5iX2ludCBzaG91bGQgcmV0dXJuIGludCBvYmplY3QiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCXZhbCA9IFB5SW50X0FTX0xPTkcoaW8pOwotCVB5X0RFQ1JFRihpbyk7CisgICAgdmFsID0gUHlJbnRfQVNfTE9ORyhpbyk7CisgICAgUHlfREVDUkVGKGlvKTsKIAotCXJldHVybiB2YWw7CisgICAgcmV0dXJuIHZhbDsKIH0KIAogUHlfc3NpemVfdAogUHlJbnRfQXNTc2l6ZV90KHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCkKIHsKICNpZiBTSVpFT0ZfU0laRV9UICE9IFNJWkVPRl9MT05HCi0JUHlOdW1iZXJNZXRob2RzICpuYjsKLQlQeUludE9iamVjdCAqaW87Ci0JUHlfc3NpemVfdCB2YWw7CisgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKKyAgICBQeUludE9iamVjdCAqaW87CisgICAgUHlfc3NpemVfdCB2YWw7CiAjZW5kaWYKIAotCWlmIChvcCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKG9wID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWlmIChQeUludF9DaGVjayhvcCkpCi0JCXJldHVybiBQeUludF9BU19MT05HKChQeUludE9iamVjdCopIG9wKTsKLQlpZiAoUHlMb25nX0NoZWNrKG9wKSkKLQkJcmV0dXJuIF9QeUxvbmdfQXNTc2l6ZV90KG9wKTsKKyAgICBpZiAoUHlJbnRfQ2hlY2sob3ApKQorICAgICAgICByZXR1cm4gUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QqKSBvcCk7CisgICAgaWYgKFB5TG9uZ19DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBfUHlMb25nX0FzU3NpemVfdChvcCk7CiAjaWYgU0laRU9GX1NJWkVfVCA9PSBTSVpFT0ZfTE9ORwotCXJldHVybiBQeUludF9Bc0xvbmcob3ApOworICAgIHJldHVybiBQeUludF9Bc0xvbmcob3ApOwogI2Vsc2UKIAotCWlmICgobmIgPSBQeV9UWVBFKG9wKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8Ci0JICAgIChuYi0+bmJfaW50ID09IE5VTEwgJiYgbmItPm5iX2xvbmcgPT0gMCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAorICAgICAgICAobmItPm5iX2ludCA9PSBOVUxMICYmIG5iLT5uYl9sb25nID09IDApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAobmItPm5iX2xvbmcgIT0gMCkKLQkJaW8gPSAoUHlJbnRPYmplY3QqKSAoKm5iLT5uYl9sb25nKSAob3ApOwotCWVsc2UKLQkJaW8gPSAoUHlJbnRPYmplY3QqKSAoKm5iLT5uYl9pbnQpIChvcCk7Ci0JaWYgKGlvID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoIVB5SW50X0NoZWNrKGlvKSkgewotCQlpZiAoUHlMb25nX0NoZWNrKGlvKSkgewotCQkJLyogZ290IGEgbG9uZz8gPT4gcmV0cnkgaW50IGNvbnZlcnNpb24gKi8KLQkJCXZhbCA9IF9QeUxvbmdfQXNTc2l6ZV90KChQeU9iamVjdCAqKWlvKTsKLQkJCVB5X0RFQ1JFRihpbyk7Ci0JCQlpZiAoKHZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gdmFsOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJUHlfREVDUkVGKGlvKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJuYl9pbnQgc2hvdWxkIHJldHVybiBpbnQgb2JqZWN0Iik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgaWYgKG5iLT5uYl9sb25nICE9IDApCisgICAgICAgIGlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfbG9uZykgKG9wKTsKKyAgICBlbHNlCisgICAgICAgIGlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfaW50KSAob3ApOworICAgIGlmIChpbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFQeUludF9DaGVjayhpbykpIHsKKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKKyAgICAgICAgICAgIC8qIGdvdCBhIGxvbmc/ID0+IHJldHJ5IGludCBjb252ZXJzaW9uICovCisgICAgICAgICAgICB2YWwgPSBfUHlMb25nX0FzU3NpemVfdCgoUHlPYmplY3QgKilpbyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICAgICAgaWYgKCh2YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYl9pbnQgc2hvdWxkIHJldHVybiBpbnQgb2JqZWN0Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQl2YWwgPSBQeUludF9BU19MT05HKGlvKTsKLQlQeV9ERUNSRUYoaW8pOworICAgIHZhbCA9IFB5SW50X0FTX0xPTkcoaW8pOworICAgIFB5X0RFQ1JFRihpbyk7CiAKLQlyZXR1cm4gdmFsOworICAgIHJldHVybiB2YWw7CiAjZW5kaWYKIH0KIAogdW5zaWduZWQgbG9uZwogUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCkKIHsKLQlQeU51bWJlck1ldGhvZHMgKm5iOwotCVB5SW50T2JqZWN0ICppbzsKLQl1bnNpZ25lZCBsb25nIHZhbDsKKyAgICBQeU51bWJlck1ldGhvZHMgKm5iOworICAgIFB5SW50T2JqZWN0ICppbzsKKyAgICB1bnNpZ25lZCBsb25nIHZhbDsKIAotCWlmIChvcCAmJiBQeUludF9DaGVjayhvcCkpCi0JCXJldHVybiBQeUludF9BU19MT05HKChQeUludE9iamVjdCopIG9wKTsKLQlpZiAob3AgJiYgUHlMb25nX0NoZWNrKG9wKSkKLQkJcmV0dXJuIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2sob3ApOworICAgIGlmIChvcCAmJiBQeUludF9DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBQeUludF9BU19MT05HKChQeUludE9iamVjdCopIG9wKTsKKyAgICBpZiAob3AgJiYgUHlMb25nX0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2sob3ApOwogCi0JaWYgKG9wID09IE5VTEwgfHwgKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAotCSAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKLQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOwotCX0KKyAgICBpZiAob3AgPT0gTlVMTCB8fCAobmIgPSBQeV9UWVBFKG9wKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8CisgICAgICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CisgICAgfQogCi0JaW8gPSAoUHlJbnRPYmplY3QqKSAoKm5iLT5uYl9pbnQpIChvcCk7Ci0JaWYgKGlvID09IE5VTEwpCi0JCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKLQlpZiAoIVB5SW50X0NoZWNrKGlvKSkgewotCQlpZiAoUHlMb25nX0NoZWNrKGlvKSkgewotCQkJdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaygoUHlPYmplY3QgKilpbyk7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOwotCQkJcmV0dXJuIHZhbDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCVB5X0RFQ1JFRihpbyk7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkibmJfaW50IHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOwotCQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOwotCQl9Ci0JfQorICAgIGlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfaW50KSAob3ApOworICAgIGlmIChpbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CisgICAgaWYgKCFQeUludF9DaGVjayhpbykpIHsKKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKKyAgICAgICAgICAgIHZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKFB5T2JqZWN0ICopaW8pOworICAgICAgICAgICAgUHlfREVDUkVGKGlvKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZyktMTsKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmJfaW50IHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOworICAgICAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKS0xOworICAgICAgICB9CisgICAgfQogCi0JdmFsID0gUHlJbnRfQVNfTE9ORyhpbyk7Ci0JUHlfREVDUkVGKGlvKTsKKyAgICB2YWwgPSBQeUludF9BU19MT05HKGlvKTsKKyAgICBQeV9ERUNSRUYoaW8pOwogCi0JcmV0dXJuIHZhbDsKKyAgICByZXR1cm4gdmFsOwogfQogCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKIHVuc2lnbmVkIFBZX0xPTkdfTE9ORwogUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayhyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7Ci0JUHlOdW1iZXJNZXRob2RzICpuYjsKLQlQeUludE9iamVjdCAqaW87Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHZhbDsKKyAgICBQeU51bWJlck1ldGhvZHMgKm5iOworICAgIFB5SW50T2JqZWN0ICppbzsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdmFsOwogCi0JaWYgKG9wICYmIFB5SW50X0NoZWNrKG9wKSkKLQkJcmV0dXJuIFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0Kikgb3ApOwotCWlmIChvcCAmJiBQeUxvbmdfQ2hlY2sob3ApKQotCQlyZXR1cm4gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2sob3ApOworICAgIGlmIChvcCAmJiBQeUludF9DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBQeUludF9BU19MT05HKChQeUludE9iamVjdCopIG9wKTsKKyAgICBpZiAob3AgJiYgUHlMb25nX0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKG9wKTsKIAotCWlmIChvcCA9PSBOVUxMIHx8IChuYiA9IFB5X1RZUEUob3ApLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKLQkgICAgbmItPm5iX2ludCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7Ci0JCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOwotCX0KKyAgICBpZiAob3AgPT0gTlVMTCB8fCAobmIgPSBQeV9UWVBFKG9wKS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8CisgICAgICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICB9CiAKLQlpbyA9IChQeUludE9iamVjdCopICgqbmItPm5iX2ludCkgKG9wKTsKLQlpZiAoaW8gPT0gTlVMTCkKLQkJcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7Ci0JaWYgKCFQeUludF9DaGVjayhpbykpIHsKLQkJaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKLQkJCXZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKChQeU9iamVjdCAqKWlvKTsKLQkJCVB5X0RFQ1JFRihpbyk7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKLQkJCXJldHVybiB2YWw7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIm5iX2ludCBzaG91bGQgcmV0dXJuIGludCBvYmplY3QiKTsKLQkJCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOwotCQl9Ci0JfQorICAgIGlvID0gKFB5SW50T2JqZWN0KikgKCpuYi0+bmJfaW50KSAob3ApOworICAgIGlmIChpbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICBpZiAoIVB5SW50X0NoZWNrKGlvKSkgeworICAgICAgICBpZiAoUHlMb25nX0NoZWNrKGlvKSkgeworICAgICAgICAgICAgdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soKFB5T2JqZWN0ICopaW8pOworICAgICAgICAgICAgUHlfREVDUkVGKGlvKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKS0xOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYl9pbnQgc2hvdWxkIHJldHVybiBpbnQgb2JqZWN0Iik7CisgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICAgICAgfQorICAgIH0KIAotCXZhbCA9IFB5SW50X0FTX0xPTkcoaW8pOwotCVB5X0RFQ1JFRihpbyk7CisgICAgdmFsID0gUHlJbnRfQVNfTE9ORyhpbyk7CisgICAgUHlfREVDUkVGKGlvKTsKIAotCXJldHVybiB2YWw7CisgICAgcmV0dXJuIHZhbDsKIH0KICNlbmRpZgogCiBQeU9iamVjdCAqCiBQeUludF9Gcm9tU3RyaW5nKGNoYXIgKnMsIGNoYXIgKipwZW5kLCBpbnQgYmFzZSkKIHsKLQljaGFyICplbmQ7Ci0JbG9uZyB4OwotCVB5X3NzaXplX3Qgc2xlbjsKLQlQeU9iamVjdCAqc29iaiwgKnNyZXByOworICAgIGNoYXIgKmVuZDsKKyAgICBsb25nIHg7CisgICAgUHlfc3NpemVfdCBzbGVuOworICAgIFB5T2JqZWN0ICpzb2JqLCAqc3JlcHI7CiAKLQlpZiAoKGJhc2UgIT0gMCAmJiBiYXNlIDwgMikgfHwgYmFzZSA+IDM2KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJpbnQoKSBiYXNlIG11c3QgYmUgPj0gMiBhbmQgPD0gMzYiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgoYmFzZSAhPSAwICYmIGJhc2UgPCAyKSB8fCBiYXNlID4gMzYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW50KCkgYmFzZSBtdXN0IGJlID49IDIgYW5kIDw9IDM2Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCi0JCXMrKzsKLQllcnJubyA9IDA7Ci0JaWYgKGJhc2UgPT0gMCAmJiBzWzBdID09ICcwJykgewotCQl4ID0gKGxvbmcpIFB5T1Nfc3RydG91bChzLCAmZW5kLCBiYXNlKTsKLQkJaWYgKHggPCAwKQotCQkJcmV0dXJuIFB5TG9uZ19Gcm9tU3RyaW5nKHMsIHBlbmQsIGJhc2UpOwotCX0KLQllbHNlCi0JCXggPSBQeU9TX3N0cnRvbChzLCAmZW5kLCBiYXNlKTsKLQlpZiAoZW5kID09IHMgfHwgIWlzYWxudW0oUHlfQ0hBUk1BU0soZW5kWy0xXSkpKQotCQlnb3RvIGJhZDsKLQl3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKLQkJZW5kKys7Ci0JaWYgKCplbmQgIT0gJ1wwJykgeworICAgIHdoaWxlICgqcyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzKSkpCisgICAgICAgIHMrKzsKKyAgICBlcnJubyA9IDA7CisgICAgaWYgKGJhc2UgPT0gMCAmJiBzWzBdID09ICcwJykgeworICAgICAgICB4ID0gKGxvbmcpIFB5T1Nfc3RydG91bChzLCAmZW5kLCBiYXNlKTsKKyAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3RyaW5nKHMsIHBlbmQsIGJhc2UpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHggPSBQeU9TX3N0cnRvbChzLCAmZW5kLCBiYXNlKTsKKyAgICBpZiAoZW5kID09IHMgfHwgIWlzYWxudW0oUHlfQ0hBUk1BU0soZW5kWy0xXSkpKQorICAgICAgICBnb3RvIGJhZDsKKyAgICB3aGlsZSAoKmVuZCAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCplbmQpKSkKKyAgICAgICAgZW5kKys7CisgICAgaWYgKCplbmQgIT0gJ1wwJykgewogICBiYWQ6Ci0JCXNsZW4gPSBzdHJsZW4ocykgPCAyMDAgPyBzdHJsZW4ocykgOiAyMDA7Ci0JCXNvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBzbGVuKTsKLQkJaWYgKHNvYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlzcmVwciA9IFB5T2JqZWN0X1JlcHIoc29iaik7Ci0JCVB5X0RFQ1JFRihzb2JqKTsKLQkJaWYgKHNyZXByID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSAlZDogJXMiLAotCQkJICAgICBiYXNlLCBQeVN0cmluZ19BU19TVFJJTkcoc3JlcHIpKTsKLQkJUHlfREVDUkVGKHNyZXByKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgaWYgKGVycm5vICE9IDApCi0JCXJldHVybiBQeUxvbmdfRnJvbVN0cmluZyhzLCBwZW5kLCBiYXNlKTsKLQlpZiAocGVuZCkKLQkJKnBlbmQgPSBlbmQ7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgICAgICBzbGVuID0gc3RybGVuKHMpIDwgMjAwID8gc3RybGVuKHMpIDogMjAwOworICAgICAgICBzb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgc2xlbik7CisgICAgICAgIGlmIChzb2JqID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc3JlcHIgPSBQeU9iamVjdF9SZXByKHNvYmopOworICAgICAgICBQeV9ERUNSRUYoc29iaik7CisgICAgICAgIGlmIChzcmVwciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlICVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBiYXNlLCBQeVN0cmluZ19BU19TVFJJTkcoc3JlcHIpKTsKKyAgICAgICAgUHlfREVDUkVGKHNyZXByKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKGVycm5vICE9IDApCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVN0cmluZyhzLCBwZW5kLCBiYXNlKTsKKyAgICBpZiAocGVuZCkKKyAgICAgICAgKnBlbmQgPSBlbmQ7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogUHlPYmplY3QgKgogUHlJbnRfRnJvbVVuaWNvZGUoUHlfVU5JQ09ERSAqcywgUHlfc3NpemVfdCBsZW5ndGgsIGludCBiYXNlKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JY2hhciAqYnVmZmVyID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobGVuZ3RoKzEpOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqYnVmZmVyID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobGVuZ3RoKzEpOwogCi0JaWYgKGJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JaWYgKFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsKHMsIGxlbmd0aCwgYnVmZmVyLCBOVUxMKSkgewotCQlQeU1lbV9GUkVFKGJ1ZmZlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXN1bHQgPSBQeUludF9Gcm9tU3RyaW5nKGJ1ZmZlciwgTlVMTCwgYmFzZSk7Ci0JUHlNZW1fRlJFRShidWZmZXIpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsKHMsIGxlbmd0aCwgYnVmZmVyLCBOVUxMKSkgeworICAgICAgICBQeU1lbV9GUkVFKGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeUludF9Gcm9tU3RyaW5nKGJ1ZmZlciwgTlVMTCwgYmFzZSk7CisgICAgUHlNZW1fRlJFRShidWZmZXIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAjZW5kaWYKIApAQCAtNDEzLDc3ICs0MTMsNzcgQEAKICAgIGRvbid0IGhhdmUgYW55IGtub3dsZWRnZSBhYm91dCBjb252ZXJzaW9uIG9mIG90aGVyIHR5cGVzIHRvCiAgICBpbnRlZ2Vycy4gKi8KIAotI2RlZmluZSBDT05WRVJUX1RPX0xPTkcob2JqLCBsbmcpCQlcCi0JaWYgKFB5SW50X0NoZWNrKG9iaikpIHsJCQlcCi0JCWxuZyA9IFB5SW50X0FTX0xPTkcob2JqKTsJXAotCX0JCQkJCVwKLQllbHNlIHsJCQkJCVwKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsJXAotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CVwKLQl9CisjZGVmaW5lIENPTlZFUlRfVE9fTE9ORyhvYmosIGxuZykgICAgICAgICAgICAgICBcCisgICAgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxuZyA9IFB5SW50X0FTX0xPTkcob2JqKTsgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7ICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsgICAgICAgICAgICAgICBcCisgICAgfQogCiAvKiBBUkdTVVNFRCAqLwogc3RhdGljIGludAogaW50X3ByaW50KFB5SW50T2JqZWN0ICp2LCBGSUxFICpmcCwgaW50IGZsYWdzKQogICAgICAvKiBmbGFncyAtLSBub3QgdXNlZCBidXQgcmVxdWlyZWQgYnkgaW50ZXJmYWNlICovCiB7Ci0JbG9uZyBpbnRfdmFsID0gdi0+b2JfaXZhbDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnByaW50ZihmcCwgIiVsZCIsIGludF92YWwpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JcmV0dXJuIDA7CisgICAgbG9uZyBpbnRfdmFsID0gdi0+b2JfaXZhbDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnByaW50ZihmcCwgIiVsZCIsIGludF92YWwpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfcmVwcihQeUludE9iamVjdCAqdikKIHsKLQlyZXR1cm4gX1B5SW50X0Zvcm1hdCh2LCAxMCwgMCk7CisgICAgcmV0dXJuIF9QeUludF9Gb3JtYXQodiwgMTAsIDApOwogfQogCiBzdGF0aWMgaW50CiBpbnRfY29tcGFyZShQeUludE9iamVjdCAqdiwgUHlJbnRPYmplY3QgKncpCiB7Ci0JcmVnaXN0ZXIgbG9uZyBpID0gdi0+b2JfaXZhbDsKLQlyZWdpc3RlciBsb25nIGogPSB3LT5vYl9pdmFsOwotCXJldHVybiAoaSA8IGopID8gLTEgOiAoaSA+IGopID8gMSA6IDA7CisgICAgcmVnaXN0ZXIgbG9uZyBpID0gdi0+b2JfaXZhbDsKKyAgICByZWdpc3RlciBsb25nIGogPSB3LT5vYl9pdmFsOworICAgIHJldHVybiAoaSA8IGopID8gLTEgOiAoaSA+IGopID8gMSA6IDA7CiB9CiAKIHN0YXRpYyBsb25nCiBpbnRfaGFzaChQeUludE9iamVjdCAqdikKIHsKLQkvKiBYWFggSWYgdGhpcyBpcyBjaGFuZ2VkLCB5b3UgYWxzbyBuZWVkIHRvIGNoYW5nZSB0aGUgd2F5Ci0JICAgUHl0aG9uJ3MgbG9uZywgZmxvYXQgYW5kIGNvbXBsZXggdHlwZXMgYXJlIGhhc2hlZC4gKi8KLQlsb25nIHggPSB2IC0+IG9iX2l2YWw7Ci0JaWYgKHggPT0gLTEpCi0JCXggPSAtMjsKLQlyZXR1cm4geDsKKyAgICAvKiBYWFggSWYgdGhpcyBpcyBjaGFuZ2VkLCB5b3UgYWxzbyBuZWVkIHRvIGNoYW5nZSB0aGUgd2F5CisgICAgICAgUHl0aG9uJ3MgbG9uZywgZmxvYXQgYW5kIGNvbXBsZXggdHlwZXMgYXJlIGhhc2hlZC4gKi8KKyAgICBsb25nIHggPSB2IC0+IG9iX2l2YWw7CisgICAgaWYgKHggPT0gLTEpCisgICAgICAgIHggPSAtMjsKKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9hZGQoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIGxvbmcgYSwgYiwgeDsKLQlDT05WRVJUX1RPX0xPTkcodiwgYSk7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGIpOwotCS8qIGNhc3RzIGluIHRoZSBsaW5lIGJlbG93IGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgb24gb3ZlcmZsb3cgKi8KLQl4ID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgKyBiKTsKLQlpZiAoKHheYSkgPj0gMCB8fCAoeF5iKSA+PSAwKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7Ci0JcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfYWRkKChQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcpOworICAgIHJlZ2lzdGVyIGxvbmcgYSwgYiwgeDsKKyAgICBDT05WRVJUX1RPX0xPTkcodiwgYSk7CisgICAgQ09OVkVSVF9UT19MT05HKHcsIGIpOworICAgIC8qIGNhc3RzIGluIHRoZSBsaW5lIGJlbG93IGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgb24gb3ZlcmZsb3cgKi8KKyAgICB4ID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgKyBiKTsKKyAgICBpZiAoKHheYSkgPj0gMCB8fCAoeF5iKSA+PSAwKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfYWRkKChQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X3N1YihQeUludE9iamVjdCAqdiwgUHlJbnRPYmplY3QgKncpCiB7Ci0JcmVnaXN0ZXIgbG9uZyBhLCBiLCB4OwotCUNPTlZFUlRfVE9fTE9ORyh2LCBhKTsKLQlDT05WRVJUX1RPX0xPTkcodywgYik7Ci0JLyogY2FzdHMgaW4gdGhlIGxpbmUgYmVsb3cgYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ciBvbiBvdmVyZmxvdyAqLwotCXggPSAobG9uZykoKHVuc2lnbmVkIGxvbmcpYSAtIGIpOwotCWlmICgoeF5hKSA+PSAwIHx8ICh4Xn5iKSA+PSAwKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7Ci0JcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfc3VidHJhY3QoKFB5T2JqZWN0ICopdiwKLQkJCQkJCSAgICAgKFB5T2JqZWN0ICopdyk7CisgICAgcmVnaXN0ZXIgbG9uZyBhLCBiLCB4OworICAgIENPTlZFUlRfVE9fTE9ORyh2LCBhKTsKKyAgICBDT05WRVJUX1RPX0xPTkcodywgYik7CisgICAgLyogY2FzdHMgaW4gdGhlIGxpbmUgYmVsb3cgYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ciBvbiBvdmVyZmxvdyAqLworICAgIHggPSAobG9uZykoKHVuc2lnbmVkIGxvbmcpYSAtIGIpOworICAgIGlmICgoeF5hKSA+PSAwIHx8ICh4Xn5iKSA+PSAwKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfc3VidHJhY3QoKFB5T2JqZWN0ICopdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil3KTsKIH0KIAogLyoKQEAgLTUxNSw0MCArNTE1LDQwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW50X211bChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JbG9uZyBhLCBiOwotCWxvbmcgbG9uZ3Byb2Q7CQkJLyogYSpiIGluIG5hdGl2ZSBsb25nIGFyaXRobWV0aWMgKi8KLQlkb3VibGUgZG91YmxlZF9sb25ncHJvZDsJLyogKGRvdWJsZSlsb25ncHJvZCAqLwotCWRvdWJsZSBkb3VibGVwcm9kOwkJLyogKGRvdWJsZSlhICogKGRvdWJsZSliICovCisgICAgbG9uZyBhLCBiOworICAgIGxvbmcgbG9uZ3Byb2Q7ICAgICAgICAgICAgICAgICAgICAgIC8qIGEqYiBpbiBuYXRpdmUgbG9uZyBhcml0aG1ldGljICovCisgICAgZG91YmxlIGRvdWJsZWRfbG9uZ3Byb2Q7ICAgICAgICAgICAgLyogKGRvdWJsZSlsb25ncHJvZCAqLworICAgIGRvdWJsZSBkb3VibGVwcm9kOyAgICAgICAgICAgICAgICAgIC8qIChkb3VibGUpYSAqIChkb3VibGUpYiAqLwogCi0JQ09OVkVSVF9UT19MT05HKHYsIGEpOwotCUNPTlZFUlRfVE9fTE9ORyh3LCBiKTsKLQkvKiBjYXN0cyBpbiB0aGUgbmV4dCBsaW5lIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgb24gb3ZlcmZsb3cgKi8KLQlsb25ncHJvZCA9IChsb25nKSgodW5zaWduZWQgbG9uZylhICogYik7Ci0JZG91YmxlcHJvZCA9IChkb3VibGUpYSAqIChkb3VibGUpYjsKLQlkb3VibGVkX2xvbmdwcm9kID0gKGRvdWJsZSlsb25ncHJvZDsKKyAgICBDT05WRVJUX1RPX0xPTkcodiwgYSk7CisgICAgQ09OVkVSVF9UT19MT05HKHcsIGIpOworICAgIC8qIGNhc3RzIGluIHRoZSBuZXh0IGxpbmUgYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ciBvbiBvdmVyZmxvdyAqLworICAgIGxvbmdwcm9kID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgKiBiKTsKKyAgICBkb3VibGVwcm9kID0gKGRvdWJsZSlhICogKGRvdWJsZSliOworICAgIGRvdWJsZWRfbG9uZ3Byb2QgPSAoZG91YmxlKWxvbmdwcm9kOwogCi0JLyogRmFzdCBwYXRoIGZvciBub3JtYWwgY2FzZTogIHNtYWxsIG11bHRpcGxpY2FuZHMsIGFuZCBubyBpbmZvCi0JICAgaXMgbG9zdCBpbiBlaXRoZXIgbWV0aG9kLiAqLwotCWlmIChkb3VibGVkX2xvbmdwcm9kID09IGRvdWJsZXByb2QpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhsb25ncHJvZCk7CisgICAgLyogRmFzdCBwYXRoIGZvciBub3JtYWwgY2FzZTogIHNtYWxsIG11bHRpcGxpY2FuZHMsIGFuZCBubyBpbmZvCisgICAgICAgaXMgbG9zdCBpbiBlaXRoZXIgbWV0aG9kLiAqLworICAgIGlmIChkb3VibGVkX2xvbmdwcm9kID09IGRvdWJsZXByb2QpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhsb25ncHJvZCk7CiAKLQkvKiBTb21lYm9keSBzb21ld2hlcmUgbG9zdCBpbmZvLiAgQ2xvc2UgZW5vdWdoLCBvciB3YXkgb2ZmPyAgTm90ZQotCSAgIHRoYXQgYSAhPSAwIGFuZCBiICE9IDAgKGVsc2UgZG91YmxlZF9sb25ncHJvZCA9PSBkb3VibGVwcm9kID09IDApLgotCSAgIFRoZSBkaWZmZXJlbmNlIGVpdGhlciBpcyBvciBpc24ndCBzaWduaWZpY2FudCBjb21wYXJlZCB0byB0aGUKLQkgICB0cnVlIHZhbHVlIChvZiB3aGljaCBkb3VibGVwcm9kIGlzIGEgZ29vZCBhcHByb3hpbWF0aW9uKS4KLQkqLwotCXsKLQkJY29uc3QgZG91YmxlIGRpZmYgPSBkb3VibGVkX2xvbmdwcm9kIC0gZG91YmxlcHJvZDsKLQkJY29uc3QgZG91YmxlIGFic2RpZmYgPSBkaWZmID49IDAuMCA/IGRpZmYgOiAtZGlmZjsKLQkJY29uc3QgZG91YmxlIGFic3Byb2QgPSBkb3VibGVwcm9kID49IDAuMCA/IGRvdWJsZXByb2QgOgotCQkJCQkJCSAgLWRvdWJsZXByb2Q7Ci0JCS8qIGFic2RpZmYvYWJzcHJvZCA8PSAxLzMyIGlmZgotCQkgICAzMiAqIGFic2RpZmYgPD0gYWJzcHJvZCAtLSA1IGdvb2QgYml0cyBpcyAiY2xvc2UgZW5vdWdoIiAqLwotCQlpZiAoMzIuMCAqIGFic2RpZmYgPD0gYWJzcHJvZCkKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZyhsb25ncHJvZCk7Ci0JCWVsc2UKLQkJCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX211bHRpcGx5KHYsIHcpOwotCX0KKyAgICAvKiBTb21lYm9keSBzb21ld2hlcmUgbG9zdCBpbmZvLiAgQ2xvc2UgZW5vdWdoLCBvciB3YXkgb2ZmPyAgTm90ZQorICAgICAgIHRoYXQgYSAhPSAwIGFuZCBiICE9IDAgKGVsc2UgZG91YmxlZF9sb25ncHJvZCA9PSBkb3VibGVwcm9kID09IDApLgorICAgICAgIFRoZSBkaWZmZXJlbmNlIGVpdGhlciBpcyBvciBpc24ndCBzaWduaWZpY2FudCBjb21wYXJlZCB0byB0aGUKKyAgICAgICB0cnVlIHZhbHVlIChvZiB3aGljaCBkb3VibGVwcm9kIGlzIGEgZ29vZCBhcHByb3hpbWF0aW9uKS4KKyAgICAqLworICAgIHsKKyAgICAgICAgY29uc3QgZG91YmxlIGRpZmYgPSBkb3VibGVkX2xvbmdwcm9kIC0gZG91YmxlcHJvZDsKKyAgICAgICAgY29uc3QgZG91YmxlIGFic2RpZmYgPSBkaWZmID49IDAuMCA/IGRpZmYgOiAtZGlmZjsKKyAgICAgICAgY29uc3QgZG91YmxlIGFic3Byb2QgPSBkb3VibGVwcm9kID49IDAuMCA/IGRvdWJsZXByb2QgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWRvdWJsZXByb2Q7CisgICAgICAgIC8qIGFic2RpZmYvYWJzcHJvZCA8PSAxLzMyIGlmZgorICAgICAgICAgICAzMiAqIGFic2RpZmYgPD0gYWJzcHJvZCAtLSA1IGdvb2QgYml0cyBpcyAiY2xvc2UgZW5vdWdoIiAqLworICAgICAgICBpZiAoMzIuMCAqIGFic2RpZmYgPD0gYWJzcHJvZCkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhsb25ncHJvZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX211bHRpcGx5KHYsIHcpOworICAgIH0KIH0KIAogLyogSW50ZWdlciBvdmVyZmxvdyBjaGVja2luZyBmb3IgdW5hcnkgbmVnYXRpb246IG9uIGEgMidzLWNvbXBsZW1lbnQKQEAgLTU1OSw0MDIgKzU1OSw0MDIgQEAKICAqIHdhcm4gYWJvdXQgYXBwbHlpbmcgdW5hcnkgbWludXMgdG8gYW4gdW5zaWduZWQgb3BlcmFuZC4gIEhlbmNlIHRoZQogICogd2VpcmQgIjAtIi4KICAqLwotI2RlZmluZSBVTkFSWV9ORUdfV09VTERfT1ZFUkZMT1coeCkJXAotCSgoeCkgPCAwICYmICh1bnNpZ25lZCBsb25nKSh4KSA9PSAwLSh1bnNpZ25lZCBsb25nKSh4KSkKKyNkZWZpbmUgVU5BUllfTkVHX1dPVUxEX09WRVJGTE9XKHgpICAgICBcCisgICAgKCh4KSA8IDAgJiYgKHVuc2lnbmVkIGxvbmcpKHgpID09IDAtKHVuc2lnbmVkIGxvbmcpKHgpKQogCiAvKiBSZXR1cm4gdHlwZSBvZiBpX2Rpdm1vZCAqLwogZW51bSBkaXZtb2RfcmVzdWx0IHsKLQlESVZNT0RfT0ssCQkvKiBDb3JyZWN0IHJlc3VsdCAqLwotCURJVk1PRF9PVkVSRkxPVywJLyogT3ZlcmZsb3csIHRyeSBhZ2FpbiB1c2luZyBsb25ncyAqLwotCURJVk1PRF9FUlJPUgkJLyogRXhjZXB0aW9uIHJhaXNlZCAqLworICAgIERJVk1PRF9PSywgICAgICAgICAgICAgICAgICAvKiBDb3JyZWN0IHJlc3VsdCAqLworICAgIERJVk1PRF9PVkVSRkxPVywgICAgICAgICAgICAvKiBPdmVyZmxvdywgdHJ5IGFnYWluIHVzaW5nIGxvbmdzICovCisgICAgRElWTU9EX0VSUk9SICAgICAgICAgICAgICAgIC8qIEV4Y2VwdGlvbiByYWlzZWQgKi8KIH07CiAKIHN0YXRpYyBlbnVtIGRpdm1vZF9yZXN1bHQKIGlfZGl2bW9kKHJlZ2lzdGVyIGxvbmcgeCwgcmVnaXN0ZXIgbG9uZyB5LAogICAgICAgICAgbG9uZyAqcF94ZGl2eSwgbG9uZyAqcF94bW9keSkKIHsKLQlsb25nIHhkaXZ5LCB4bW9keTsKKyAgICBsb25nIHhkaXZ5LCB4bW9keTsKIAotCWlmICh5ID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAotCQkJCSJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvIik7Ci0JCXJldHVybiBESVZNT0RfRVJST1I7Ci0JfQotCS8qICgtc3lzLm1heGludC0xKS8tMSBpcyB0aGUgb25seSBvdmVyZmxvdyBjYXNlLiAqLwotCWlmICh5ID09IC0xICYmIFVOQVJZX05FR19XT1VMRF9PVkVSRkxPVyh4KSkKLQkJcmV0dXJuIERJVk1PRF9PVkVSRkxPVzsKLQl4ZGl2eSA9IHggLyB5OwotCS8qIHhkaXYqeSBjYW4gb3ZlcmZsb3cgb24gcGxhdGZvcm1zIHdoZXJlIHgveSBnaXZlcyBmbG9vcih4L3kpCi0JICogZm9yIHggYW5kIHkgd2l0aCBkaWZmZXJpbmcgc2lnbnMuIChUaGlzIGlzIHVudXN1YWwKLQkgKiBiZWhhdmlvdXIsIGFuZCBDOTkgcHJvaGliaXRzIGl0LCBidXQgaXQncyBhbGxvd2VkIGJ5IEM4OTsKLQkgKiBmb3IgYW4gZXhhbXBsZSBvZiBvdmVyZmxvdywgdGFrZSB4ID0gTE9OR19NSU4sIHkgPSA1IG9yIHggPQotCSAqIExPTkdfTUFYLCB5ID0gLTUuKSAgSG93ZXZlciwgeCAtIHhkaXZ5KnkgaXMgYWx3YXlzCi0JICogcmVwcmVzZW50YWJsZSBhcyBhIGxvbmcsIHNpbmNlIGl0IGxpZXMgc3RyaWN0bHkgYmV0d2VlbgotCSAqIC1hYnMoeSkgYW5kIGFicyh5KS4gIFdlIGFkZCBjYXN0cyB0byBhdm9pZCBpbnRlcm1lZGlhdGUKLQkgKiBvdmVyZmxvdy4KLQkgKi8KLQl4bW9keSA9IChsb25nKSh4IC0gKHVuc2lnbmVkIGxvbmcpeGRpdnkgKiB5KTsKLQkvKiBJZiB0aGUgc2lnbnMgb2YgeCBhbmQgeSBkaWZmZXIsIGFuZCB0aGUgcmVtYWluZGVyIGlzIG5vbi0wLAotCSAqIEM4OSBkb2Vzbid0IGRlZmluZSB3aGV0aGVyIHhkaXZ5IGlzIG5vdyB0aGUgZmxvb3Igb3IgdGhlCi0JICogY2VpbGluZyBvZiB0aGUgaW5maW5pdGVseSBwcmVjaXNlIHF1b3RpZW50LiAgV2Ugd2FudCB0aGUgZmxvb3IsCi0JICogYW5kIHdlIGhhdmUgaXQgaWZmIHRoZSByZW1haW5kZXIncyBzaWduIG1hdGNoZXMgeSdzLgotCSAqLwotCWlmICh4bW9keSAmJiAoKHkgXiB4bW9keSkgPCAwKSAvKiBpLmUuIGFuZCBzaWducyBkaWZmZXIgKi8pIHsKLQkJeG1vZHkgKz0geTsKLQkJLS14ZGl2eTsKLQkJYXNzZXJ0KHhtb2R5ICYmICgoeSBeIHhtb2R5KSA+PSAwKSk7Ci0JfQotCSpwX3hkaXZ5ID0geGRpdnk7Ci0JKnBfeG1vZHkgPSB4bW9keTsKLQlyZXR1cm4gRElWTU9EX09LOworICAgIGlmICh5ID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8iKTsKKyAgICAgICAgcmV0dXJuIERJVk1PRF9FUlJPUjsKKyAgICB9CisgICAgLyogKC1zeXMubWF4aW50LTEpLy0xIGlzIHRoZSBvbmx5IG92ZXJmbG93IGNhc2UuICovCisgICAgaWYgKHkgPT0gLTEgJiYgVU5BUllfTkVHX1dPVUxEX09WRVJGTE9XKHgpKQorICAgICAgICByZXR1cm4gRElWTU9EX09WRVJGTE9XOworICAgIHhkaXZ5ID0geCAvIHk7CisgICAgLyogeGRpdip5IGNhbiBvdmVyZmxvdyBvbiBwbGF0Zm9ybXMgd2hlcmUgeC95IGdpdmVzIGZsb29yKHgveSkKKyAgICAgKiBmb3IgeCBhbmQgeSB3aXRoIGRpZmZlcmluZyBzaWducy4gKFRoaXMgaXMgdW51c3VhbAorICAgICAqIGJlaGF2aW91ciwgYW5kIEM5OSBwcm9oaWJpdHMgaXQsIGJ1dCBpdCdzIGFsbG93ZWQgYnkgQzg5OworICAgICAqIGZvciBhbiBleGFtcGxlIG9mIG92ZXJmbG93LCB0YWtlIHggPSBMT05HX01JTiwgeSA9IDUgb3IgeCA9CisgICAgICogTE9OR19NQVgsIHkgPSAtNS4pICBIb3dldmVyLCB4IC0geGRpdnkqeSBpcyBhbHdheXMKKyAgICAgKiByZXByZXNlbnRhYmxlIGFzIGEgbG9uZywgc2luY2UgaXQgbGllcyBzdHJpY3RseSBiZXR3ZWVuCisgICAgICogLWFicyh5KSBhbmQgYWJzKHkpLiAgV2UgYWRkIGNhc3RzIHRvIGF2b2lkIGludGVybWVkaWF0ZQorICAgICAqIG92ZXJmbG93LgorICAgICAqLworICAgIHhtb2R5ID0gKGxvbmcpKHggLSAodW5zaWduZWQgbG9uZyl4ZGl2eSAqIHkpOworICAgIC8qIElmIHRoZSBzaWducyBvZiB4IGFuZCB5IGRpZmZlciwgYW5kIHRoZSByZW1haW5kZXIgaXMgbm9uLTAsCisgICAgICogQzg5IGRvZXNuJ3QgZGVmaW5lIHdoZXRoZXIgeGRpdnkgaXMgbm93IHRoZSBmbG9vciBvciB0aGUKKyAgICAgKiBjZWlsaW5nIG9mIHRoZSBpbmZpbml0ZWx5IHByZWNpc2UgcXVvdGllbnQuICBXZSB3YW50IHRoZSBmbG9vciwKKyAgICAgKiBhbmQgd2UgaGF2ZSBpdCBpZmYgdGhlIHJlbWFpbmRlcidzIHNpZ24gbWF0Y2hlcyB5J3MuCisgICAgICovCisgICAgaWYgKHhtb2R5ICYmICgoeSBeIHhtb2R5KSA8IDApIC8qIGkuZS4gYW5kIHNpZ25zIGRpZmZlciAqLykgeworICAgICAgICB4bW9keSArPSB5OworICAgICAgICAtLXhkaXZ5OworICAgICAgICBhc3NlcnQoeG1vZHkgJiYgKCh5IF4geG1vZHkpID49IDApKTsKKyAgICB9CisgICAgKnBfeGRpdnkgPSB4ZGl2eTsKKyAgICAqcF94bW9keSA9IHhtb2R5OworICAgIHJldHVybiBESVZNT0RfT0s7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfZGl2KFB5SW50T2JqZWN0ICp4LCBQeUludE9iamVjdCAqeSkKIHsKLQlsb25nIHhpLCB5aTsKLQlsb25nIGQsIG07Ci0JQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKLQlDT05WRVJUX1RPX0xPTkcoeSwgeWkpOwotCXN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7Ci0JY2FzZSBESVZNT0RfT0s6Ci0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhkKTsKLQljYXNlIERJVk1PRF9PVkVSRkxPVzoKLQkJcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfZGl2aWRlKChQeU9iamVjdCAqKXgsCi0JCQkJCQkJICAgKFB5T2JqZWN0ICopeSk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGxvbmcgeGksIHlpOworICAgIGxvbmcgZCwgbTsKKyAgICBDT05WRVJUX1RPX0xPTkcoeCwgeGkpOworICAgIENPTlZFUlRfVE9fTE9ORyh5LCB5aSk7CisgICAgc3dpdGNoIChpX2Rpdm1vZCh4aSwgeWksICZkLCAmbSkpIHsKKyAgICBjYXNlIERJVk1PRF9PSzoKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGQpOworICAgIGNhc2UgRElWTU9EX09WRVJGTE9XOgorICAgICAgICByZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl9kaXZpZGUoKFB5T2JqZWN0ICopeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXkpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9jbGFzc2ljX2RpdihQeUludE9iamVjdCAqeCwgUHlJbnRPYmplY3QgKnkpCiB7Ci0JbG9uZyB4aSwgeWk7Ci0JbG9uZyBkLCBtOwotCUNPTlZFUlRfVE9fTE9ORyh4LCB4aSk7Ci0JQ09OVkVSVF9UT19MT05HKHksIHlpKTsKLQlpZiAoUHlfRGl2aXNpb25XYXJuaW5nRmxhZyAmJgotCSAgICBQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgImNsYXNzaWMgaW50IGRpdmlzaW9uIikgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlzd2l0Y2ggKGlfZGl2bW9kKHhpLCB5aSwgJmQsICZtKSkgewotCWNhc2UgRElWTU9EX09LOgotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZCk7Ci0JY2FzZSBESVZNT0RfT1ZFUkZMT1c6Ci0JCXJldHVybiBQeUxvbmdfVHlwZS50cF9hc19udW1iZXItPm5iX2RpdmlkZSgoUHlPYmplY3QgKil4LAotCQkJCQkJCSAgIChQeU9iamVjdCAqKXkpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsb25nIHhpLCB5aTsKKyAgICBsb25nIGQsIG07CisgICAgQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKKyAgICBDT05WRVJUX1RPX0xPTkcoeSwgeWkpOworICAgIGlmIChQeV9EaXZpc2lvbldhcm5pbmdGbGFnICYmCisgICAgICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAiY2xhc3NpYyBpbnQgZGl2aXNpb24iKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7CisgICAgY2FzZSBESVZNT0RfT0s6CisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhkKTsKKyAgICBjYXNlIERJVk1PRF9PVkVSRkxPVzoKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfZGl2aWRlKChQeU9iamVjdCAqKXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil5KTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfdHJ1ZV9kaXZpZGUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCS8qIElmIHRoZXkgYXJlbid0IGJvdGggaW50cywgZ2l2ZSBzb21lb25lIGVsc2UgYSBjaGFuY2UuICBJbgotCSAgIHBhcnRpY3VsYXIsIHRoaXMgbGV0cyBpbnQvbG9uZyBnZXQgaGFuZGxlZCBieSBsb25ncywgd2hpY2gKLQkgICB1bmRlcmZsb3dzIHRvIDAgZ3JhY2VmdWxseSBpZiB0aGUgbG9uZyBpcyB0b28gYmlnIHRvIGNvbnZlcnQKLQkgICB0byBmbG9hdC4gKi8KLQlpZiAoUHlJbnRfQ2hlY2sodikgJiYgUHlJbnRfQ2hlY2sodykpCi0JCXJldHVybiBQeUZsb2F0X1R5cGUudHBfYXNfbnVtYmVyLT5uYl90cnVlX2RpdmlkZSh2LCB3KTsKLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICAvKiBJZiB0aGV5IGFyZW4ndCBib3RoIGludHMsIGdpdmUgc29tZW9uZSBlbHNlIGEgY2hhbmNlLiAgSW4KKyAgICAgICBwYXJ0aWN1bGFyLCB0aGlzIGxldHMgaW50L2xvbmcgZ2V0IGhhbmRsZWQgYnkgbG9uZ3MsIHdoaWNoCisgICAgICAgdW5kZXJmbG93cyB0byAwIGdyYWNlZnVsbHkgaWYgdGhlIGxvbmcgaXMgdG9vIGJpZyB0byBjb252ZXJ0CisgICAgICAgdG8gZmxvYXQuICovCisgICAgaWYgKFB5SW50X0NoZWNrKHYpICYmIFB5SW50X0NoZWNrKHcpKQorICAgICAgICByZXR1cm4gUHlGbG9hdF9UeXBlLnRwX2FzX251bWJlci0+bmJfdHJ1ZV9kaXZpZGUodiwgdyk7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfbW9kKFB5SW50T2JqZWN0ICp4LCBQeUludE9iamVjdCAqeSkKIHsKLQlsb25nIHhpLCB5aTsKLQlsb25nIGQsIG07Ci0JQ09OVkVSVF9UT19MT05HKHgsIHhpKTsKLQlDT05WRVJUX1RPX0xPTkcoeSwgeWkpOwotCXN3aXRjaCAoaV9kaXZtb2QoeGksIHlpLCAmZCwgJm0pKSB7Ci0JY2FzZSBESVZNT0RfT0s6Ci0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhtKTsKLQljYXNlIERJVk1PRF9PVkVSRkxPVzoKLQkJcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcmVtYWluZGVyKChQeU9iamVjdCAqKXgsCi0JCQkJCQkJICAgICAgKFB5T2JqZWN0ICopeSk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGxvbmcgeGksIHlpOworICAgIGxvbmcgZCwgbTsKKyAgICBDT05WRVJUX1RPX0xPTkcoeCwgeGkpOworICAgIENPTlZFUlRfVE9fTE9ORyh5LCB5aSk7CisgICAgc3dpdGNoIChpX2Rpdm1vZCh4aSwgeWksICZkLCAmbSkpIHsKKyAgICBjYXNlIERJVk1PRF9PSzoKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG0pOworICAgIGNhc2UgRElWTU9EX09WRVJGTE9XOgorICAgICAgICByZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl9yZW1haW5kZXIoKFB5T2JqZWN0ICopeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXkpOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9kaXZtb2QoUHlJbnRPYmplY3QgKngsIFB5SW50T2JqZWN0ICp5KQogewotCWxvbmcgeGksIHlpOwotCWxvbmcgZCwgbTsKLQlDT05WRVJUX1RPX0xPTkcoeCwgeGkpOwotCUNPTlZFUlRfVE9fTE9ORyh5LCB5aSk7Ci0Jc3dpdGNoIChpX2Rpdm1vZCh4aSwgeWksICZkLCAmbSkpIHsKLQljYXNlIERJVk1PRF9PSzoKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsbCkiLCBkLCBtKTsKLQljYXNlIERJVk1PRF9PVkVSRkxPVzoKLQkJcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfZGl2bW9kKChQeU9iamVjdCAqKXgsCi0JCQkJCQkJICAgKFB5T2JqZWN0ICopeSk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGxvbmcgeGksIHlpOworICAgIGxvbmcgZCwgbTsKKyAgICBDT05WRVJUX1RPX0xPTkcoeCwgeGkpOworICAgIENPTlZFUlRfVE9fTE9ORyh5LCB5aSk7CisgICAgc3dpdGNoIChpX2Rpdm1vZCh4aSwgeWksICZkLCAmbSkpIHsKKyAgICBjYXNlIERJVk1PRF9PSzoKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsbCkiLCBkLCBtKTsKKyAgICBjYXNlIERJVk1PRF9PVkVSRkxPVzoKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfZGl2bW9kKChQeU9iamVjdCAqKXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil5KTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfcG93KFB5SW50T2JqZWN0ICp2LCBQeUludE9iamVjdCAqdywgUHlJbnRPYmplY3QgKnopCiB7Ci0JcmVnaXN0ZXIgbG9uZyBpdiwgaXcsIGl6PTAsIGl4LCB0ZW1wLCBwcmV2OwotCUNPTlZFUlRfVE9fTE9ORyh2LCBpdik7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGl3KTsKLQlpZiAoaXcgPCAwKSB7Ci0JCWlmICgoUHlPYmplY3QgKil6ICE9IFB5X05vbmUpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJwb3coKSAybmQgYXJndW1lbnQgIgotCQkJICAgICAiY2Fubm90IGJlIG5lZ2F0aXZlIHdoZW4gM3JkIGFyZ3VtZW50IHNwZWNpZmllZCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJLyogUmV0dXJuIGEgZmxvYXQuICBUaGlzIHdvcmtzIGJlY2F1c2Ugd2Uga25vdyB0aGF0Ci0JCSAgIHRoaXMgY2FsbHMgZmxvYXRfcG93KCkgd2hpY2ggY29udmVydHMgaXRzCi0JCSAgIGFyZ3VtZW50cyB0byBkb3VibGUuICovCi0JCXJldHVybiBQeUZsb2F0X1R5cGUudHBfYXNfbnVtYmVyLT5uYl9wb3dlcigKLQkJCShQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsIChQeU9iamVjdCAqKXopOwotCX0KLSAJaWYgKChQeU9iamVjdCAqKXogIT0gUHlfTm9uZSkgewotCQlDT05WRVJUX1RPX0xPTkcoeiwgaXopOwotCQlpZiAoaXogPT0gMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJwb3coKSAzcmQgYXJndW1lbnQgY2Fubm90IGJlIDAiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCS8qCi0JICogWFhYOiBUaGUgb3JpZ2luYWwgZXhwb25lbnRpYXRpb24gY29kZSBzdG9wcGVkIGxvb3BpbmcKLQkgKiB3aGVuIHRlbXAgaGl0IHplcm87IHRoaXMgY29kZSB3aWxsIGNvbnRpbnVlIG9ud2FyZHMKLQkgKiB1bm5lY2Vzc2FyaWx5LCBidXQgYXQgbGVhc3QgaXQgd29uJ3QgY2F1c2UgYW55IGVycm9ycy4KLQkgKiBIb3BlZnVsbHkgdGhlIHNwZWVkIGltcHJvdmVtZW50IGZyb20gdGhlIGZhc3QgZXhwb25lbnRpYXRpb24KLQkgKiB3aWxsIGNvbXBlbnNhdGUgZm9yIHRoZSBzbGlnaHQgaW5lZmZpY2llbmN5LgotCSAqIFhYWDogQmV0dGVyIGhhbmRsaW5nIG9mIG92ZXJmbG93cyBpcyBkZXNwZXJhdGVseSBuZWVkZWQuCi0JICovCi0gCXRlbXAgPSBpdjsKLQlpeCA9IDE7Ci0Jd2hpbGUgKGl3ID4gMCkgewotCSAJcHJldiA9IGl4OwkvKiBTYXZlIHZhbHVlIGZvciBvdmVyZmxvdyBjaGVjayAqLwotCSAJaWYgKGl3ICYgMSkgewotCQkgCWl4ID0gaXgqdGVtcDsKLQkJCWlmICh0ZW1wID09IDApCi0JCQkJYnJlYWs7IC8qIEF2b2lkIGl4IC8gMCAqLwotCQkJaWYgKGl4IC8gdGVtcCAhPSBwcmV2KSB7Ci0JCQkJcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCi0JCQkJCShQeU9iamVjdCAqKXYsCi0JCQkJCShQeU9iamVjdCAqKXcsCi0JCQkJCShQeU9iamVjdCAqKXopOwotCQkJfQotCQl9Ci0JIAlpdyA+Pj0gMTsJLyogU2hpZnQgZXhwb25lbnQgZG93biBieSAxIGJpdCAqLwotCSAgICAgICAgaWYgKGl3PT0wKSBicmVhazsKLQkgCXByZXYgPSB0ZW1wOwotCSAJdGVtcCAqPSB0ZW1wOwkvKiBTcXVhcmUgdGhlIHZhbHVlIG9mIHRlbXAgKi8KLQkgCWlmIChwcmV2ICE9IDAgJiYgdGVtcCAvIHByZXYgIT0gcHJldikgewotCQkJcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCi0JCQkJKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgKFB5T2JqZWN0ICopeik7Ci0JCX0KLQkgCWlmIChpeikgewotCQkJLyogSWYgd2UgZGlkIGEgbXVsdGlwbGljYXRpb24sIHBlcmZvcm0gYSBtb2R1bG8gKi8KLQkJIAlpeCA9IGl4ICUgaXo7Ci0JCSAJdGVtcCA9IHRlbXAgJSBpejsKLQkJfQotCX0KLQlpZiAoaXopIHsKLQkgCWxvbmcgZGl2LCBtb2Q7Ci0JCXN3aXRjaCAoaV9kaXZtb2QoaXgsIGl6LCAmZGl2LCAmbW9kKSkgewotCQljYXNlIERJVk1PRF9PSzoKLQkJCWl4ID0gbW9kOwotCQkJYnJlYWs7Ci0JCWNhc2UgRElWTU9EX09WRVJGTE9XOgotCQkJcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCi0JCQkJKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgKFB5T2JqZWN0ICopeik7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaXgpOworICAgIHJlZ2lzdGVyIGxvbmcgaXYsIGl3LCBpej0wLCBpeCwgdGVtcCwgcHJldjsKKyAgICBDT05WRVJUX1RPX0xPTkcodiwgaXYpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBpdyk7CisgICAgaWYgKGl3IDwgMCkgeworICAgICAgICBpZiAoKFB5T2JqZWN0ICopeiAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicG93KCkgMm5kIGFyZ3VtZW50ICIKKyAgICAgICAgICAgICAgICAgImNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIFJldHVybiBhIGZsb2F0LiAgVGhpcyB3b3JrcyBiZWNhdXNlIHdlIGtub3cgdGhhdAorICAgICAgICAgICB0aGlzIGNhbGxzIGZsb2F0X3BvdygpIHdoaWNoIGNvbnZlcnRzIGl0cworICAgICAgICAgICBhcmd1bWVudHMgdG8gZG91YmxlLiAqLworICAgICAgICByZXR1cm4gUHlGbG9hdF9UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCisgICAgICAgICAgICAoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAoUHlPYmplY3QgKil6KTsKKyAgICB9CisgICAgaWYgKChQeU9iamVjdCAqKXogIT0gUHlfTm9uZSkgeworICAgICAgICBDT05WRVJUX1RPX0xPTkcoeiwgaXopOworICAgICAgICBpZiAoaXogPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvdygpIDNyZCBhcmd1bWVudCBjYW5ub3QgYmUgMCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBYWFg6IFRoZSBvcmlnaW5hbCBleHBvbmVudGlhdGlvbiBjb2RlIHN0b3BwZWQgbG9vcGluZworICAgICAqIHdoZW4gdGVtcCBoaXQgemVybzsgdGhpcyBjb2RlIHdpbGwgY29udGludWUgb253YXJkcworICAgICAqIHVubmVjZXNzYXJpbHksIGJ1dCBhdCBsZWFzdCBpdCB3b24ndCBjYXVzZSBhbnkgZXJyb3JzLgorICAgICAqIEhvcGVmdWxseSB0aGUgc3BlZWQgaW1wcm92ZW1lbnQgZnJvbSB0aGUgZmFzdCBleHBvbmVudGlhdGlvbgorICAgICAqIHdpbGwgY29tcGVuc2F0ZSBmb3IgdGhlIHNsaWdodCBpbmVmZmljaWVuY3kuCisgICAgICogWFhYOiBCZXR0ZXIgaGFuZGxpbmcgb2Ygb3ZlcmZsb3dzIGlzIGRlc3BlcmF0ZWx5IG5lZWRlZC4KKyAgICAgKi8KKyAgICB0ZW1wID0gaXY7CisgICAgaXggPSAxOworICAgIHdoaWxlIChpdyA+IDApIHsKKyAgICAgICAgcHJldiA9IGl4OyAgICAgICAgICAgICAgLyogU2F2ZSB2YWx1ZSBmb3Igb3ZlcmZsb3cgY2hlY2sgKi8KKyAgICAgICAgaWYgKGl3ICYgMSkgeworICAgICAgICAgICAgaXggPSBpeCp0ZW1wOworICAgICAgICAgICAgaWYgKHRlbXAgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsgLyogQXZvaWQgaXggLyAwICovCisgICAgICAgICAgICBpZiAoaXggLyB0ZW1wICE9IHByZXYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl9wb3dlcigKKyAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopdiwKKyAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopdywKKyAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopeik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaXcgPj49IDE7ICAgICAgICAgICAgICAgLyogU2hpZnQgZXhwb25lbnQgZG93biBieSAxIGJpdCAqLworICAgICAgICBpZiAoaXc9PTApIGJyZWFrOworICAgICAgICBwcmV2ID0gdGVtcDsKKyAgICAgICAgdGVtcCAqPSB0ZW1wOyAgICAgICAgICAgLyogU3F1YXJlIHRoZSB2YWx1ZSBvZiB0ZW1wICovCisgICAgICAgIGlmIChwcmV2ICE9IDAgJiYgdGVtcCAvIHByZXYgIT0gcHJldikgeworICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIoCisgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgKFB5T2JqZWN0ICopeik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl6KSB7CisgICAgICAgICAgICAvKiBJZiB3ZSBkaWQgYSBtdWx0aXBsaWNhdGlvbiwgcGVyZm9ybSBhIG1vZHVsbyAqLworICAgICAgICAgICAgaXggPSBpeCAlIGl6OworICAgICAgICAgICAgdGVtcCA9IHRlbXAgJSBpejsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXopIHsKKyAgICAgICAgbG9uZyBkaXYsIG1vZDsKKyAgICAgICAgc3dpdGNoIChpX2Rpdm1vZChpeCwgaXosICZkaXYsICZtb2QpKSB7CisgICAgICAgIGNhc2UgRElWTU9EX09LOgorICAgICAgICAgICAgaXggPSBtb2Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBESVZNT0RfT1ZFUkZMT1c6CisgICAgICAgICAgICByZXR1cm4gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyLT5uYl9wb3dlcigKKyAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAoUHlPYmplY3QgKil6KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfbmVnKFB5SW50T2JqZWN0ICp2KQogewotCXJlZ2lzdGVyIGxvbmcgYTsKLQlhID0gdi0+b2JfaXZhbDsKLSAgICAgICAgLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCi0JaWYgKFVOQVJZX05FR19XT1VMRF9PVkVSRkxPVyhhKSkgewotCQlQeU9iamVjdCAqbyA9IFB5TG9uZ19Gcm9tTG9uZyhhKTsKLQkJaWYgKG8gIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKnJlc3VsdCA9IFB5TnVtYmVyX05lZ2F0aXZlKG8pOwotCQkJUHlfREVDUkVGKG8pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKC1hKTsKKyAgICByZWdpc3RlciBsb25nIGE7CisgICAgYSA9IHYtPm9iX2l2YWw7CisgICAgLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgaWYgKFVOQVJZX05FR19XT1VMRF9PVkVSRkxPVyhhKSkgeworICAgICAgICBQeU9iamVjdCAqbyA9IFB5TG9uZ19Gcm9tTG9uZyhhKTsKKyAgICAgICAgaWYgKG8gIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5TnVtYmVyX05lZ2F0aXZlKG8pOworICAgICAgICAgICAgUHlfREVDUkVGKG8pOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKC1hKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9hYnMoUHlJbnRPYmplY3QgKnYpCiB7Ci0JaWYgKHYtPm9iX2l2YWwgPj0gMCkKLQkJcmV0dXJuIGludF9pbnQodik7Ci0JZWxzZQotCQlyZXR1cm4gaW50X25lZyh2KTsKKyAgICBpZiAodi0+b2JfaXZhbCA+PSAwKQorICAgICAgICByZXR1cm4gaW50X2ludCh2KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBpbnRfbmVnKHYpOwogfQogCiBzdGF0aWMgaW50CiBpbnRfbm9uemVybyhQeUludE9iamVjdCAqdikKIHsKLQlyZXR1cm4gdi0+b2JfaXZhbCAhPSAwOworICAgIHJldHVybiB2LT5vYl9pdmFsICE9IDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfaW52ZXJ0KFB5SW50T2JqZWN0ICp2KQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyh+di0+b2JfaXZhbCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKH52LT5vYl9pdmFsKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9sc2hpZnQoUHlJbnRPYmplY3QgKnYsIFB5SW50T2JqZWN0ICp3KQogewotCWxvbmcgYSwgYiwgYzsKLQlQeU9iamVjdCAqdnYsICp3dywgKnJlc3VsdDsKKyAgICBsb25nIGEsIGIsIGM7CisgICAgUHlPYmplY3QgKnZ2LCAqd3csICpyZXN1bHQ7CiAKLQlDT05WRVJUX1RPX0xPTkcodiwgYSk7Ci0JQ09OVkVSVF9UT19MT05HKHcsIGIpOwotCWlmIChiIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIHNoaWZ0IGNvdW50Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoYSA9PSAwIHx8IGIgPT0gMCkKLQkJcmV0dXJuIGludF9pbnQodik7Ci0JaWYgKGIgPj0gTE9OR19CSVQpIHsKLQkJdnYgPSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh2KSk7Ci0JCWlmICh2diA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXd3ID0gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodykpOwotCQlpZiAod3cgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHZ2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJlc3VsdCA9IFB5TnVtYmVyX0xzaGlmdCh2diwgd3cpOwotCQlQeV9ERUNSRUYodnYpOwotCQlQeV9ERUNSRUYod3cpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQljID0gYSA8PCBiOwotCWlmIChhICE9IFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQobG9uZywgYywgYikpIHsKLQkJdnYgPSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh2KSk7Ci0JCWlmICh2diA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXd3ID0gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodykpOwotCQlpZiAod3cgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHZ2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJlc3VsdCA9IFB5TnVtYmVyX0xzaGlmdCh2diwgd3cpOwotCQlQeV9ERUNSRUYodnYpOwotCQlQeV9ERUNSRUYod3cpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoYyk7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGEpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBiKTsKKyAgICBpZiAoYiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBzaGlmdCBjb3VudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGEgPT0gMCB8fCBiID09IDApCisgICAgICAgIHJldHVybiBpbnRfaW50KHYpOworICAgIGlmIChiID49IExPTkdfQklUKSB7CisgICAgICAgIHZ2ID0gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodikpOworICAgICAgICBpZiAodnYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB3dyA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHcpKTsKKyAgICAgICAgaWYgKHd3ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2dik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBQeU51bWJlcl9Mc2hpZnQodnYsIHd3KTsKKyAgICAgICAgUHlfREVDUkVGKHZ2KTsKKyAgICAgICAgUHlfREVDUkVGKHd3KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgYyA9IGEgPDwgYjsKKyAgICBpZiAoYSAhPSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKGxvbmcsIGMsIGIpKSB7CisgICAgICAgIHZ2ID0gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodikpOworICAgICAgICBpZiAodnYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB3dyA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHcpKTsKKyAgICAgICAgaWYgKHd3ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2dik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBQeU51bWJlcl9Mc2hpZnQodnYsIHd3KTsKKyAgICAgICAgUHlfREVDUkVGKHZ2KTsKKyAgICAgICAgUHlfREVDUkVGKHd3KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X3JzaGlmdChQeUludE9iamVjdCAqdiwgUHlJbnRPYmplY3QgKncpCiB7Ci0JcmVnaXN0ZXIgbG9uZyBhLCBiOwotCUNPTlZFUlRfVE9fTE9ORyh2LCBhKTsKLQlDT05WRVJUX1RPX0xPTkcodywgYik7Ci0JaWYgKGIgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibmVnYXRpdmUgc2hpZnQgY291bnQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChhID09IDAgfHwgYiA9PSAwKQotCQlyZXR1cm4gaW50X2ludCh2KTsKLQlpZiAoYiA+PSBMT05HX0JJVCkgewotCQlpZiAoYSA8IDApCi0JCQlhID0gLTE7Ci0JCWVsc2UKLQkJCWEgPSAwOwotCX0KLQllbHNlIHsKLQkJYSA9IFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQobG9uZywgYSwgYik7Ci0JfQotCXJldHVybiBQeUludF9Gcm9tTG9uZyhhKTsKKyAgICByZWdpc3RlciBsb25nIGEsIGI7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGEpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBiKTsKKyAgICBpZiAoYiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBzaGlmdCBjb3VudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGEgPT0gMCB8fCBiID09IDApCisgICAgICAgIHJldHVybiBpbnRfaW50KHYpOworICAgIGlmIChiID49IExPTkdfQklUKSB7CisgICAgICAgIGlmIChhIDwgMCkKKyAgICAgICAgICAgIGEgPSAtMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYSA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhID0gUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVChsb25nLCBhLCBiKTsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2FuZChQeUludE9iamVjdCAqdiwgUHlJbnRPYmplY3QgKncpCiB7Ci0JcmVnaXN0ZXIgbG9uZyBhLCBiOwotCUNPTlZFUlRfVE9fTE9ORyh2LCBhKTsKLQlDT05WRVJUX1RPX0xPTkcodywgYik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGEgJiBiKTsKKyAgICByZWdpc3RlciBsb25nIGEsIGI7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGEpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBiKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoYSAmIGIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X3hvcihQeUludE9iamVjdCAqdiwgUHlJbnRPYmplY3QgKncpCiB7Ci0JcmVnaXN0ZXIgbG9uZyBhLCBiOwotCUNPTlZFUlRfVE9fTE9ORyh2LCBhKTsKLQlDT05WRVJUX1RPX0xPTkcodywgYik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGEgXiBiKTsKKyAgICByZWdpc3RlciBsb25nIGEsIGI7CisgICAgQ09OVkVSVF9UT19MT05HKHYsIGEpOworICAgIENPTlZFUlRfVE9fTE9ORyh3LCBiKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoYSBeIGIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X29yKFB5SW50T2JqZWN0ICp2LCBQeUludE9iamVjdCAqdykKIHsKLQlyZWdpc3RlciBsb25nIGEsIGI7Ci0JQ09OVkVSVF9UT19MT05HKHYsIGEpOwotCUNPTlZFUlRfVE9fTE9ORyh3LCBiKTsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoYSB8IGIpOworICAgIHJlZ2lzdGVyIGxvbmcgYSwgYjsKKyAgICBDT05WRVJUX1RPX0xPTkcodiwgYSk7CisgICAgQ09OVkVSVF9UT19MT05HKHcsIGIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhhIHwgYik7CiB9CiAKIHN0YXRpYyBpbnQKIGludF9jb2VyY2UoUHlPYmplY3QgKipwdiwgUHlPYmplY3QgKipwdykKIHsKLQlpZiAoUHlJbnRfQ2hlY2soKnB3KSkgewotCQlQeV9JTkNSRUYoKnB2KTsKLQkJUHlfSU5DUkVGKCpwdyk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsgLyogQ2FuJ3QgZG8gaXQgKi8KKyAgICBpZiAoUHlJbnRfQ2hlY2soKnB3KSkgeworICAgICAgICBQeV9JTkNSRUYoKnB2KTsKKyAgICAgICAgUHlfSU5DUkVGKCpwdyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsgLyogQ2FuJ3QgZG8gaXQgKi8KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9pbnQoUHlJbnRPYmplY3QgKnYpCiB7Ci0JaWYgKFB5SW50X0NoZWNrRXhhY3QodikpCi0JCVB5X0lOQ1JFRih2KTsKLQllbHNlCi0JCXYgPSAoUHlJbnRPYmplY3QgKilQeUludF9Gcm9tTG9uZyh2LT5vYl9pdmFsKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopdjsKKyAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSkKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgIGVsc2UKKyAgICAgICAgdiA9IChQeUludE9iamVjdCAqKVB5SW50X0Zyb21Mb25nKHYtPm9iX2l2YWwpOworICAgIHJldHVybiAoUHlPYmplY3QgKil2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2xvbmcoUHlJbnRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygodiAtPiBvYl9pdmFsKSk7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygodiAtPiBvYl9pdmFsKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfZmxvYXQoUHlJbnRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKSh2IC0+IG9iX2l2YWwpKTsKKyAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKChkb3VibGUpKHYgLT4gb2JfaXZhbCkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X29jdChQeUludE9iamVjdCAqdikKIHsKLQlyZXR1cm4gX1B5SW50X0Zvcm1hdCh2LCA4LCAwKTsKKyAgICByZXR1cm4gX1B5SW50X0Zvcm1hdCh2LCA4LCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9oZXgoUHlJbnRPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIF9QeUludF9Gb3JtYXQodiwgMTYsIDApOworICAgIHJldHVybiBfUHlJbnRfRm9ybWF0KHYsIDE2LCAwKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTk2Myw0NyArOTYzLDQ3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW50X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqeCA9IE5VTEw7Ci0JaW50IGJhc2UgPSAtOTA5OwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsieCIsICJiYXNlIiwgMH07CisgICAgUHlPYmplY3QgKnggPSBOVUxMOworICAgIGludCBiYXNlID0gLTkwOTsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7IngiLCAiYmFzZSIsIDB9OwogCi0JaWYgKHR5cGUgIT0gJlB5SW50X1R5cGUpCi0JCXJldHVybiBpbnRfc3VidHlwZV9uZXcodHlwZSwgYXJncywga3dkcyk7IC8qIFdpbXAgb3V0ICovCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPaTppbnQiLCBrd2xpc3QsCi0JCQkJCSAmeCwgJmJhc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoeCA9PSBOVUxMKQotCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoMEwpOwotCWlmIChiYXNlID09IC05MDkpCi0JCXJldHVybiBQeU51bWJlcl9JbnQoeCk7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHgpKSB7Ci0JCS8qIFNpbmNlIFB5SW50X0Zyb21TdHJpbmcgZG9lc24ndCBoYXZlIGEgbGVuZ3RoIHBhcmFtZXRlciwKLQkJICogY2hlY2sgaGVyZSBmb3IgcG9zc2libGUgTlVMcyBpbiB0aGUgc3RyaW5nLiAqLwotCQljaGFyICpzdHJpbmcgPSBQeVN0cmluZ19BU19TVFJJTkcoeCk7Ci0JCWlmIChzdHJsZW4oc3RyaW5nKSAhPSBQeVN0cmluZ19TaXplKHgpKSB7Ci0JCQkvKiBjcmVhdGUgYSByZXByKCkgb2YgdGhlIGlucHV0IHN0cmluZywKLQkJCSAqIGp1c3QgbGlrZSBQeUludF9Gcm9tU3RyaW5nIGRvZXMgKi8KLQkJCVB5T2JqZWN0ICpzcmVwcjsKLQkJCXNyZXByID0gUHlPYmplY3RfUmVwcih4KTsKLQkJCWlmIChzcmVwciA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSAlZDogJXMiLAotCQkJICAgICBiYXNlLCBQeVN0cmluZ19BU19TVFJJTkcoc3JlcHIpKTsKLQkJCVB5X0RFQ1JFRihzcmVwcik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlyZXR1cm4gUHlJbnRfRnJvbVN0cmluZyhzdHJpbmcsIE5VTEwsIGJhc2UpOwotCX0KKyAgICBpZiAodHlwZSAhPSAmUHlJbnRfVHlwZSkKKyAgICAgICAgcmV0dXJuIGludF9zdWJ0eXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsgLyogV2ltcCBvdXQgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9pOmludCIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwgJmJhc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoMEwpOworICAgIGlmIChiYXNlID09IC05MDkpCisgICAgICAgIHJldHVybiBQeU51bWJlcl9JbnQoeCk7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHgpKSB7CisgICAgICAgIC8qIFNpbmNlIFB5SW50X0Zyb21TdHJpbmcgZG9lc24ndCBoYXZlIGEgbGVuZ3RoIHBhcmFtZXRlciwKKyAgICAgICAgICogY2hlY2sgaGVyZSBmb3IgcG9zc2libGUgTlVMcyBpbiB0aGUgc3RyaW5nLiAqLworICAgICAgICBjaGFyICpzdHJpbmcgPSBQeVN0cmluZ19BU19TVFJJTkcoeCk7CisgICAgICAgIGlmIChzdHJsZW4oc3RyaW5nKSAhPSBQeVN0cmluZ19TaXplKHgpKSB7CisgICAgICAgICAgICAvKiBjcmVhdGUgYSByZXByKCkgb2YgdGhlIGlucHV0IHN0cmluZywKKyAgICAgICAgICAgICAqIGp1c3QgbGlrZSBQeUludF9Gcm9tU3RyaW5nIGRvZXMgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpzcmVwcjsKKyAgICAgICAgICAgIHNyZXByID0gUHlPYmplY3RfUmVwcih4KTsKKyAgICAgICAgICAgIGlmIChzcmVwciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSAlZDogJXMiLAorICAgICAgICAgICAgICAgICBiYXNlLCBQeVN0cmluZ19BU19TVFJJTkcoc3JlcHIpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzcmVwcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlJbnRfRnJvbVN0cmluZyhzdHJpbmcsIE5VTEwsIGJhc2UpOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVjayh4KSkKLQkJcmV0dXJuIFB5SW50X0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKHgpLAotCQkJCQkgUHlVbmljb2RlX0dFVF9TSVpFKHgpLAotCQkJCQkgYmFzZSk7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayh4KSkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSk7CiAjZW5kaWYKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImludCgpIGNhbid0IGNvbnZlcnQgbm9uLXN0cmluZyB3aXRoIGV4cGxpY2l0IGJhc2UiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiaW50KCkgY2FuJ3QgY29udmVydCBub24tc3RyaW5nIHdpdGggZXhwbGljaXQgYmFzZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBXaW1weSwgc2xvdyBhcHByb2FjaCB0byB0cF9uZXcgY2FsbHMgZm9yIHN1YnR5cGVzIG9mIGludDoKQEAgLTEwMTQsNDIgKzEwMTQsNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfc3VidHlwZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnRtcCwgKm5ld29iajsKLQlsb25nIGl2YWw7CisgICAgUHlPYmplY3QgKnRtcCwgKm5ld29iajsKKyAgICBsb25nIGl2YWw7CiAKLQlhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlJbnRfVHlwZSkpOwotCXRtcCA9IGludF9uZXcoJlB5SW50X1R5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUludF9DaGVjayh0bXApKSB7Ci0JCWl2YWwgPSBQeUxvbmdfQXNMb25nKHRtcCk7Ci0JCWlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCVB5X0RFQ1JFRih0bXApOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQlpdmFsID0gKChQeUludE9iamVjdCAqKXRtcCktPm9iX2l2YWw7Ci0JfQorICAgIGFzc2VydChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeUludF9UeXBlKSk7CisgICAgdG1wID0gaW50X25ldygmUHlJbnRfVHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SW50X0NoZWNrKHRtcCkpIHsKKyAgICAgICAgaXZhbCA9IFB5TG9uZ19Bc0xvbmcodG1wKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGl2YWwgPSAoKFB5SW50T2JqZWN0ICopdG1wKS0+b2JfaXZhbDsKKyAgICB9CiAKLQluZXdvYmogPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKLQlpZiAobmV3b2JqID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkoKFB5SW50T2JqZWN0ICopbmV3b2JqKS0+b2JfaXZhbCA9IGl2YWw7Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIG5ld29iajsKKyAgICBuZXdvYmogPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICBpZiAobmV3b2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKFB5SW50T2JqZWN0ICopbmV3b2JqKS0+b2JfaXZhbCA9IGl2YWw7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIG5ld29iajsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGludF9nZXRuZXdhcmdzKFB5SW50T2JqZWN0ICp2KQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIobCkiLCB2LT5vYl9pdmFsKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGwpIiwgdi0+b2JfaXZhbCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfZ2V0TihQeUludE9iamVjdCAqdiwgdm9pZCAqY29udGV4dCkgewotCXJldHVybiBQeUludF9Gcm9tTG9uZygoUHlfaW50cHRyX3QpY29udGV4dCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChQeV9pbnRwdHJfdCljb250ZXh0KTsKIH0KIAogLyogQ29udmVydCBhbiBpbnRlZ2VyIHRvIHRoZSBnaXZlbiBiYXNlLiAgUmV0dXJucyBhIHN0cmluZy4KQEAgLTEwNTksMTM3ICsxMDU5LDEzNyBAQAogUHlBUElfRlVOQyhQeU9iamVjdCopCiBfUHlJbnRfRm9ybWF0KFB5SW50T2JqZWN0ICp2LCBpbnQgYmFzZSwgaW50IG5ld3N0eWxlKQogewotCS8qIFRoZXJlIGFyZSBubyBkb3VidCBtYW55LCBtYW55IHdheXMgdG8gb3B0aW1pemUgdGhpcywgdXNpbmcgY29kZQotCSAgIHNpbWlsYXIgdG8gX1B5TG9uZ19Gb3JtYXQgKi8KLQlsb25nIG4gPSB2LT5vYl9pdmFsOwotCWludCAgbmVnYXRpdmUgPSBuIDwgMDsKLQlpbnQgaXNfemVybyA9IG4gPT0gMDsKKyAgICAvKiBUaGVyZSBhcmUgbm8gZG91YnQgbWFueSwgbWFueSB3YXlzIHRvIG9wdGltaXplIHRoaXMsIHVzaW5nIGNvZGUKKyAgICAgICBzaW1pbGFyIHRvIF9QeUxvbmdfRm9ybWF0ICovCisgICAgbG9uZyBuID0gdi0+b2JfaXZhbDsKKyAgICBpbnQgIG5lZ2F0aXZlID0gbiA8IDA7CisgICAgaW50IGlzX3plcm8gPSBuID09IDA7CiAKLQkvKiBGb3IgdGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcyBzaXplLCBzZWUKLQkgICBodHRwOi8vYy1mYXEuY29tL21pc2MvaGV4aW8uaHRtbC4gVGhlbiwgYWRkIGEgZmV3IGJ5dGVzIGZvcgotCSAgIHRoZSBwb3NzaWJsZSBzaWduIGFuZCBwcmVmaXggIjBbYm94XSIgKi8KLQljaGFyIGJ1ZltzaXplb2YobikqQ0hBUl9CSVQrNl07CisgICAgLyogRm9yIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgc2l6ZSwgc2VlCisgICAgICAgaHR0cDovL2MtZmFxLmNvbS9taXNjL2hleGlvLmh0bWwuIFRoZW4sIGFkZCBhIGZldyBieXRlcyBmb3IKKyAgICAgICB0aGUgcG9zc2libGUgc2lnbiBhbmQgcHJlZml4ICIwW2JveF0iICovCisgICAgY2hhciBidWZbc2l6ZW9mKG4pKkNIQVJfQklUKzZdOwogCi0JLyogU3RhcnQgYnkgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgV2UgZmlsbCBpbiBmcm9tCi0JICAgdGhlIGJhY2sgZm9yd2FyZC4gKi8KLQljaGFyKiBwID0gJmJ1ZltzaXplb2YoYnVmKV07CisgICAgLyogU3RhcnQgYnkgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgV2UgZmlsbCBpbiBmcm9tCisgICAgICAgdGhlIGJhY2sgZm9yd2FyZC4gKi8KKyAgICBjaGFyKiBwID0gJmJ1ZltzaXplb2YoYnVmKV07CiAKLQlhc3NlcnQoYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpOworICAgIGFzc2VydChiYXNlID49IDIgJiYgYmFzZSA8PSAzNik7CiAKLQlkbyB7Ci0JCS8qIEknZCB1c2UgaV9kaXZtb2QsIGV4Y2VwdCBpdCBkb2Vzbid0IHByb2R1Y2UgdGhlIHJlc3VsdHMKLQkJICAgSSB3YW50IHdoZW4gbiBpcyBuZWdhdGl2ZS4gIFNvIGp1c3QgZHVwbGljYXRlIHRoZSBzYWxpZW50Ci0JCSAgIHBhcnQgaGVyZS4gKi8KLQkJbG9uZyBkaXYgPSBuIC8gYmFzZTsKLQkJbG9uZyBtb2QgPSBuIC0gZGl2ICogYmFzZTsKKyAgICBkbyB7CisgICAgICAgIC8qIEknZCB1c2UgaV9kaXZtb2QsIGV4Y2VwdCBpdCBkb2Vzbid0IHByb2R1Y2UgdGhlIHJlc3VsdHMKKyAgICAgICAgICAgSSB3YW50IHdoZW4gbiBpcyBuZWdhdGl2ZS4gIFNvIGp1c3QgZHVwbGljYXRlIHRoZSBzYWxpZW50CisgICAgICAgICAgIHBhcnQgaGVyZS4gKi8KKyAgICAgICAgbG9uZyBkaXYgPSBuIC8gYmFzZTsKKyAgICAgICAgbG9uZyBtb2QgPSBuIC0gZGl2ICogYmFzZTsKIAotCQkvKiBjb252ZXJ0IGFicyhtb2QpIHRvIHRoZSByaWdodCBjaGFyYWN0ZXIgaW4gWzAtOSwgYS16XSAqLwotCQljaGFyIGNkaWdpdCA9IChjaGFyKShtb2QgPCAwID8gLW1vZCA6IG1vZCk7Ci0JCWNkaWdpdCArPSAoY2RpZ2l0IDwgMTApID8gJzAnIDogJ2EnLTEwOwotCQkqLS1wID0gY2RpZ2l0OworICAgICAgICAvKiBjb252ZXJ0IGFicyhtb2QpIHRvIHRoZSByaWdodCBjaGFyYWN0ZXIgaW4gWzAtOSwgYS16XSAqLworICAgICAgICBjaGFyIGNkaWdpdCA9IChjaGFyKShtb2QgPCAwID8gLW1vZCA6IG1vZCk7CisgICAgICAgIGNkaWdpdCArPSAoY2RpZ2l0IDwgMTApID8gJzAnIDogJ2EnLTEwOworICAgICAgICAqLS1wID0gY2RpZ2l0OwogCi0JCW4gPSBkaXY7Ci0JfSB3aGlsZShuKTsKKyAgICAgICAgbiA9IGRpdjsKKyAgICB9IHdoaWxlKG4pOwogCi0JaWYgKGJhc2UgPT0gMikgewotCQkqLS1wID0gJ2InOwotCQkqLS1wID0gJzAnOwotCX0KLQllbHNlIGlmIChiYXNlID09IDgpIHsKLQkJaWYgKG5ld3N0eWxlKSB7Ci0JCQkqLS1wID0gJ28nOwotCQkJKi0tcCA9ICcwJzsKLQkJfQotCQllbHNlCi0JCQlpZiAoIWlzX3plcm8pCi0JCQkJKi0tcCA9ICcwJzsKLQl9Ci0JZWxzZSBpZiAoYmFzZSA9PSAxNikgewotCQkqLS1wID0gJ3gnOwotCQkqLS1wID0gJzAnOwotCX0KLQllbHNlIGlmIChiYXNlICE9IDEwKSB7Ci0JCSotLXAgPSAnIyc7Ci0JCSotLXAgPSAnMCcgKyBiYXNlJTEwOwotCQlpZiAoYmFzZSA+IDEwKQotCQkJKi0tcCA9ICcwJyArIGJhc2UvMTA7Ci0JfQotCWlmIChuZWdhdGl2ZSkKLQkJKi0tcCA9ICctJzsKKyAgICBpZiAoYmFzZSA9PSAyKSB7CisgICAgICAgICotLXAgPSAnYic7CisgICAgICAgICotLXAgPSAnMCc7CisgICAgfQorICAgIGVsc2UgaWYgKGJhc2UgPT0gOCkgeworICAgICAgICBpZiAobmV3c3R5bGUpIHsKKyAgICAgICAgICAgICotLXAgPSAnbyc7CisgICAgICAgICAgICAqLS1wID0gJzAnOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmICghaXNfemVybykKKyAgICAgICAgICAgICAgICAqLS1wID0gJzAnOworICAgIH0KKyAgICBlbHNlIGlmIChiYXNlID09IDE2KSB7CisgICAgICAgICotLXAgPSAneCc7CisgICAgICAgICotLXAgPSAnMCc7CisgICAgfQorICAgIGVsc2UgaWYgKGJhc2UgIT0gMTApIHsKKyAgICAgICAgKi0tcCA9ICcjJzsKKyAgICAgICAgKi0tcCA9ICcwJyArIGJhc2UlMTA7CisgICAgICAgIGlmIChiYXNlID4gMTApCisgICAgICAgICAgICAqLS1wID0gJzAnICsgYmFzZS8xMDsKKyAgICB9CisgICAgaWYgKG5lZ2F0aXZlKQorICAgICAgICAqLS1wID0gJy0nOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHAsICZidWZbc2l6ZW9mKGJ1ZildIC0gcCk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHAsICZidWZbc2l6ZW9mKGJ1ZildIC0gcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRfX2Zvcm1hdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZm9ybWF0X3NwZWM7CisgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlCeXRlc19DaGVjayhmb3JtYXRfc3BlYykpCi0JCXJldHVybiBfUHlJbnRfRm9ybWF0QWR2YW5jZWQoc2VsZiwKLQkJCQkJICAgICBQeUJ5dGVzX0FTX1NUUklORyhmb3JtYXRfc3BlYyksCi0JCQkJCSAgICAgUHlCeXRlc19HRVRfU0laRShmb3JtYXRfc3BlYykpOwotCWlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7Ci0JCS8qIENvbnZlcnQgZm9ybWF0X3NwZWMgdG8gYSBzdHIgKi8KLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJUHlPYmplY3QgKnN0cl9zcGVjID0gUHlPYmplY3RfU3RyKGZvcm1hdF9zcGVjKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19mb3JtYXRfXyIsICZmb3JtYXRfc3BlYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeUJ5dGVzX0NoZWNrKGZvcm1hdF9zcGVjKSkKKyAgICAgICAgcmV0dXJuIF9QeUludF9Gb3JtYXRBZHZhbmNlZChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGZvcm1hdF9zcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKGZvcm1hdF9zcGVjKSk7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhmb3JtYXRfc3BlYykpIHsKKyAgICAgICAgLyogQ29udmVydCBmb3JtYXRfc3BlYyB0byBhIHN0ciAqLworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICBQeU9iamVjdCAqc3RyX3NwZWMgPSBQeU9iamVjdF9TdHIoZm9ybWF0X3NwZWMpOwogCi0JCWlmIChzdHJfc3BlYyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzdHJfc3BlYyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJcmVzdWx0ID0gX1B5SW50X0Zvcm1hdEFkdmFuY2VkKHNlbGYsCi0JCQkJCSAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzdHJfc3BlYyksCi0JCQkJCSAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKHN0cl9zcGVjKSk7CisgICAgICAgIHJlc3VsdCA9IF9QeUludF9Gb3JtYXRBZHZhbmNlZChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc3RyX3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShzdHJfc3BlYykpOwogCi0JCVB5X0RFQ1JFRihzdHJfc3BlYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJfX2Zvcm1hdF9fIHJlcXVpcmVzIHN0ciBvciB1bmljb2RlIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRihzdHJfc3BlYyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJfX2Zvcm1hdF9fIHJlcXVpcmVzIHN0ciBvciB1bmljb2RlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKICNpZiAwCiBzdGF0aWMgUHlPYmplY3QgKgogaW50X2lzX2Zpbml0ZShQeU9iamVjdCAqdikKIHsKLQlQeV9SRVRVUk5fVFJVRTsKKyAgICBQeV9SRVRVUk5fVFJVRTsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlNZXRob2REZWYgaW50X21ldGhvZHNbXSA9IHsKLQl7ImNvbmp1Z2F0ZSIsCShQeUNGdW5jdGlvbilpbnRfaW50LAlNRVRIX05PQVJHUywKLQkgIlJldHVybnMgc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBpbnQuIn0sCisgICAgeyJjb25qdWdhdGUiLCAgICAgICAoUHlDRnVuY3Rpb24paW50X2ludCwgICBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgc2VsZiwgdGhlIGNvbXBsZXggY29uanVnYXRlIG9mIGFueSBpbnQuIn0sCiAjaWYgMAotCXsiaXNfZmluaXRlIiwJKFB5Q0Z1bmN0aW9uKWludF9pc19maW5pdGUsCU1FVEhfTk9BUkdTLAotCSAiUmV0dXJucyBhbHdheXMgVHJ1ZS4ifSwKKyAgICB7ImlzX2Zpbml0ZSIsICAgICAgIChQeUNGdW5jdGlvbilpbnRfaXNfZmluaXRlLCAgICAgTUVUSF9OT0FSR1MsCisgICAgICJSZXR1cm5zIGFsd2F5cyBUcnVlLiJ9LAogI2VuZGlmCi0JeyJfX3RydW5jX18iLAkoUHlDRnVuY3Rpb24paW50X2ludCwJTUVUSF9OT0FSR1MsCi0gICAgICAgICAiVHJ1bmNhdGluZyBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi4ifSwKLQl7Il9fZ2V0bmV3YXJnc19fIiwJKFB5Q0Z1bmN0aW9uKWludF9nZXRuZXdhcmdzLAlNRVRIX05PQVJHU30sCi0gICAgICAgIHsiX19mb3JtYXRfXyIsIChQeUNGdW5jdGlvbilpbnRfX2Zvcm1hdF9fLCBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX3RydW5jX18iLCAgICAgICAoUHlDRnVuY3Rpb24paW50X2ludCwgICBNRVRIX05PQVJHUywKKyAgICAgIlRydW5jYXRpbmcgYW4gSW50ZWdyYWwgcmV0dXJucyBpdHNlbGYuIn0sCisgICAgeyJfX2dldG5ld2FyZ3NfXyIsICAgICAgICAgIChQeUNGdW5jdGlvbilpbnRfZ2V0bmV3YXJncywgICAgTUVUSF9OT0FSR1N9LAorICAgIHsiX19mb3JtYXRfXyIsIChQeUNGdW5jdGlvbilpbnRfX2Zvcm1hdF9fLCBNRVRIX1ZBUkFSR1N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlHZXRTZXREZWYgaW50X2dldHNldFtdID0gewotCXsicmVhbCIsIAotCSAoZ2V0dGVyKWludF9pbnQsIChzZXR0ZXIpTlVMTCwKLQkgInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciIsCi0JIE5VTEx9LAotCXsiaW1hZyIsIAotCSAoZ2V0dGVyKWludF9nZXROLCAoc2V0dGVyKU5VTEwsCi0JICJ0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciIsCi0JICh2b2lkKikwfSwKLQl7Im51bWVyYXRvciIsIAotCSAoZ2V0dGVyKWludF9pbnQsIChzZXR0ZXIpTlVMTCwKLQkgInRoZSBudW1lcmF0b3Igb2YgYSByYXRpb25hbCBudW1iZXIgaW4gbG93ZXN0IHRlcm1zIiwKLQkgTlVMTH0sCi0JeyJkZW5vbWluYXRvciIsIAotCSAoZ2V0dGVyKWludF9nZXROLCAoc2V0dGVyKU5VTEwsCi0JICJ0aGUgZGVub21pbmF0b3Igb2YgYSByYXRpb25hbCBudW1iZXIgaW4gbG93ZXN0IHRlcm1zIiwKLQkgKHZvaWQqKTF9LAotCXtOVUxMfSAgLyogU2VudGluZWwgKi8KKyAgICB7InJlYWwiLAorICAgICAoZ2V0dGVyKWludF9pbnQsIChzZXR0ZXIpTlVMTCwKKyAgICAgInRoZSByZWFsIHBhcnQgb2YgYSBjb21wbGV4IG51bWJlciIsCisgICAgIE5VTEx9LAorICAgIHsiaW1hZyIsCisgICAgIChnZXR0ZXIpaW50X2dldE4sIChzZXR0ZXIpTlVMTCwKKyAgICAgInRoZSBpbWFnaW5hcnkgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyIiwKKyAgICAgKHZvaWQqKTB9LAorICAgIHsibnVtZXJhdG9yIiwKKyAgICAgKGdldHRlcilpbnRfaW50LCAoc2V0dGVyKU5VTEwsCisgICAgICJ0aGUgbnVtZXJhdG9yIG9mIGEgcmF0aW9uYWwgbnVtYmVyIGluIGxvd2VzdCB0ZXJtcyIsCisgICAgIE5VTEx9LAorICAgIHsiZGVub21pbmF0b3IiLAorICAgICAoZ2V0dGVyKWludF9nZXROLCAoc2V0dGVyKU5VTEwsCisgICAgICJ0aGUgZGVub21pbmF0b3Igb2YgYSByYXRpb25hbCBudW1iZXIgaW4gbG93ZXN0IHRlcm1zIiwKKyAgICAgKHZvaWQqKTF9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihpbnRfZG9jLApAQCAtMTIwNCwyMTIgKzEyMDQsMjEyIEBACiBsb25nIG9iamVjdCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgaW50X2FzX251bWJlciA9IHsKLQkoYmluYXJ5ZnVuYylpbnRfYWRkLAkvKm5iX2FkZCovCi0JKGJpbmFyeWZ1bmMpaW50X3N1YiwJLypuYl9zdWJ0cmFjdCovCi0JKGJpbmFyeWZ1bmMpaW50X211bCwJLypuYl9tdWx0aXBseSovCi0JKGJpbmFyeWZ1bmMpaW50X2NsYXNzaWNfZGl2LCAvKm5iX2RpdmlkZSovCi0JKGJpbmFyeWZ1bmMpaW50X21vZCwJLypuYl9yZW1haW5kZXIqLwotCShiaW5hcnlmdW5jKWludF9kaXZtb2QsCS8qbmJfZGl2bW9kKi8KLQkodGVybmFyeWZ1bmMpaW50X3BvdywJLypuYl9wb3dlciovCi0JKHVuYXJ5ZnVuYylpbnRfbmVnLAkvKm5iX25lZ2F0aXZlKi8KLQkodW5hcnlmdW5jKWludF9pbnQsCS8qbmJfcG9zaXRpdmUqLwotCSh1bmFyeWZ1bmMpaW50X2FicywJLypuYl9hYnNvbHV0ZSovCi0JKGlucXVpcnkpaW50X25vbnplcm8sCS8qbmJfbm9uemVybyovCi0JKHVuYXJ5ZnVuYylpbnRfaW52ZXJ0LAkvKm5iX2ludmVydCovCi0JKGJpbmFyeWZ1bmMpaW50X2xzaGlmdCwJLypuYl9sc2hpZnQqLwotCShiaW5hcnlmdW5jKWludF9yc2hpZnQsCS8qbmJfcnNoaWZ0Ki8KLQkoYmluYXJ5ZnVuYylpbnRfYW5kLAkvKm5iX2FuZCovCi0JKGJpbmFyeWZ1bmMpaW50X3hvciwJLypuYl94b3IqLwotCShiaW5hcnlmdW5jKWludF9vciwJLypuYl9vciovCi0JaW50X2NvZXJjZSwJCS8qbmJfY29lcmNlKi8KLQkodW5hcnlmdW5jKWludF9pbnQsCS8qbmJfaW50Ki8KLQkodW5hcnlmdW5jKWludF9sb25nLAkvKm5iX2xvbmcqLwotCSh1bmFyeWZ1bmMpaW50X2Zsb2F0LAkvKm5iX2Zsb2F0Ki8KLQkodW5hcnlmdW5jKWludF9vY3QsCS8qbmJfb2N0Ki8KLQkodW5hcnlmdW5jKWludF9oZXgsIAkvKm5iX2hleCovCi0JMCwJCQkvKm5iX2lucGxhY2VfYWRkKi8KLQkwLAkJCS8qbmJfaW5wbGFjZV9zdWJ0cmFjdCovCi0JMCwJCQkvKm5iX2lucGxhY2VfbXVsdGlwbHkqLwotCTAsCQkJLypuYl9pbnBsYWNlX2RpdmlkZSovCi0JMCwJCQkvKm5iX2lucGxhY2VfcmVtYWluZGVyKi8KLQkwLAkJCS8qbmJfaW5wbGFjZV9wb3dlciovCi0JMCwJCQkvKm5iX2lucGxhY2VfbHNoaWZ0Ki8KLQkwLAkJCS8qbmJfaW5wbGFjZV9yc2hpZnQqLwotCTAsCQkJLypuYl9pbnBsYWNlX2FuZCovCi0JMCwJCQkvKm5iX2lucGxhY2VfeG9yKi8KLQkwLAkJCS8qbmJfaW5wbGFjZV9vciovCi0JKGJpbmFyeWZ1bmMpaW50X2RpdiwJLyogbmJfZmxvb3JfZGl2aWRlICovCi0JaW50X3RydWVfZGl2aWRlLAkvKiBuYl90cnVlX2RpdmlkZSAqLwotCTAsCQkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KLQkwLAkJCS8qIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUgKi8KLQkodW5hcnlmdW5jKWludF9pbnQsCS8qIG5iX2luZGV4ICovCisgICAgKGJpbmFyeWZ1bmMpaW50X2FkZCwgICAgICAgIC8qbmJfYWRkKi8KKyAgICAoYmluYXJ5ZnVuYylpbnRfc3ViLCAgICAgICAgLypuYl9zdWJ0cmFjdCovCisgICAgKGJpbmFyeWZ1bmMpaW50X211bCwgICAgICAgIC8qbmJfbXVsdGlwbHkqLworICAgIChiaW5hcnlmdW5jKWludF9jbGFzc2ljX2RpdiwgLypuYl9kaXZpZGUqLworICAgIChiaW5hcnlmdW5jKWludF9tb2QsICAgICAgICAvKm5iX3JlbWFpbmRlciovCisgICAgKGJpbmFyeWZ1bmMpaW50X2Rpdm1vZCwgICAgIC8qbmJfZGl2bW9kKi8KKyAgICAodGVybmFyeWZ1bmMpaW50X3BvdywgICAgICAgLypuYl9wb3dlciovCisgICAgKHVuYXJ5ZnVuYylpbnRfbmVnLCAgICAgICAgIC8qbmJfbmVnYXRpdmUqLworICAgICh1bmFyeWZ1bmMpaW50X2ludCwgICAgICAgICAvKm5iX3Bvc2l0aXZlKi8KKyAgICAodW5hcnlmdW5jKWludF9hYnMsICAgICAgICAgLypuYl9hYnNvbHV0ZSovCisgICAgKGlucXVpcnkpaW50X25vbnplcm8sICAgICAgIC8qbmJfbm9uemVybyovCisgICAgKHVuYXJ5ZnVuYylpbnRfaW52ZXJ0LCAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAoYmluYXJ5ZnVuYylpbnRfbHNoaWZ0LCAgICAgLypuYl9sc2hpZnQqLworICAgIChiaW5hcnlmdW5jKWludF9yc2hpZnQsICAgICAvKm5iX3JzaGlmdCovCisgICAgKGJpbmFyeWZ1bmMpaW50X2FuZCwgICAgICAgIC8qbmJfYW5kKi8KKyAgICAoYmluYXJ5ZnVuYylpbnRfeG9yLCAgICAgICAgLypuYl94b3IqLworICAgIChiaW5hcnlmdW5jKWludF9vciwgICAgICAgICAvKm5iX29yKi8KKyAgICBpbnRfY29lcmNlLCAgICAgICAgICAgICAgICAgLypuYl9jb2VyY2UqLworICAgICh1bmFyeWZ1bmMpaW50X2ludCwgICAgICAgICAvKm5iX2ludCovCisgICAgKHVuYXJ5ZnVuYylpbnRfbG9uZywgICAgICAgIC8qbmJfbG9uZyovCisgICAgKHVuYXJ5ZnVuYylpbnRfZmxvYXQsICAgICAgIC8qbmJfZmxvYXQqLworICAgICh1bmFyeWZ1bmMpaW50X29jdCwgICAgICAgICAvKm5iX29jdCovCisgICAgKHVuYXJ5ZnVuYylpbnRfaGV4LCAgICAgICAgIC8qbmJfaGV4Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2FkZCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9zdWJ0cmFjdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9tdWx0aXBseSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9kaXZpZGUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcmVtYWluZGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3Bvd2VyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2xzaGlmdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9yc2hpZnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfYW5kKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3hvciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9vciovCisgICAgKGJpbmFyeWZ1bmMpaW50X2RpdiwgICAgICAgIC8qIG5iX2Zsb29yX2RpdmlkZSAqLworICAgIGludF90cnVlX2RpdmlkZSwgICAgICAgICAgICAvKiBuYl90cnVlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisgICAgKHVuYXJ5ZnVuYylpbnRfaW50LCAgICAgICAgIC8qIG5iX2luZGV4ICovCiB9OwogCiBQeVR5cGVPYmplY3QgUHlJbnRfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJpbnQiLAotCXNpemVvZihQeUludE9iamVjdCksCi0JMCwKLQkoZGVzdHJ1Y3RvcilpbnRfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKWludF9wcmludCwJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYylpbnRfY29tcGFyZSwJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKWludF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkmaW50X2FzX251bWJlciwJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpaW50X2hhc2gsCQkJLyogdHBfaGFzaCAqLwotICAgICAgICAwLAkJCQkJLyogdHBfY2FsbCAqLwotICAgICAgICAocmVwcmZ1bmMpaW50X3JlcHIsCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19JTlRfU1VCQ0xBU1MsCS8qIHRwX2ZsYWdzICovCi0JaW50X2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlpbnRfbWV0aG9kcywJCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCi0JaW50X2dldHNldCwJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWludF9uZXcsCQkJCS8qIHRwX25ldyAqLwotCShmcmVlZnVuYylpbnRfZnJlZSwgICAgICAgICAgIAkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImludCIsCisgICAgc2l6ZW9mKFB5SW50T2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKWludF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpaW50X3ByaW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYylpbnRfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpaW50X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmaW50X2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpaW50X2hhc2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAocmVwcmZ1bmMpaW50X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19JTlRfU1VCQ0xBU1MsICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgaW50X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIGludF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIGludF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBpbnRfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIChmcmVlZnVuYylpbnRfZnJlZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogaW50CiBfUHlJbnRfSW5pdCh2b2lkKQogewotCVB5SW50T2JqZWN0ICp2OwotCWludCBpdmFsOworICAgIFB5SW50T2JqZWN0ICp2OworICAgIGludCBpdmFsOwogI2lmIE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTID4gMAotCWZvciAoaXZhbCA9IC1OU01BTExORUdJTlRTOyBpdmFsIDwgTlNNQUxMUE9TSU5UUzsgaXZhbCsrKSB7Ci0gICAgICAgICAgICAgIGlmICghZnJlZV9saXN0ICYmIChmcmVlX2xpc3QgPSBmaWxsX2ZyZWVfbGlzdCgpKSA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JCS8qIFB5T2JqZWN0X05ldyBpcyBpbmxpbmVkICovCi0JCXYgPSBmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IChQeUludE9iamVjdCAqKVB5X1RZUEUodik7Ci0JCVB5T2JqZWN0X0lOSVQodiwgJlB5SW50X1R5cGUpOwotCQl2LT5vYl9pdmFsID0gaXZhbDsKLQkJc21hbGxfaW50c1tpdmFsICsgTlNNQUxMTkVHSU5UU10gPSB2OwotCX0KKyAgICBmb3IgKGl2YWwgPSAtTlNNQUxMTkVHSU5UUzsgaXZhbCA8IE5TTUFMTFBPU0lOVFM7IGl2YWwrKykgeworICAgICAgICAgIGlmICghZnJlZV9saXN0ICYmIChmcmVlX2xpc3QgPSBmaWxsX2ZyZWVfbGlzdCgpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgLyogUHlPYmplY3RfTmV3IGlzIGlubGluZWQgKi8KKyAgICAgICAgdiA9IGZyZWVfbGlzdDsKKyAgICAgICAgZnJlZV9saXN0ID0gKFB5SW50T2JqZWN0ICopUHlfVFlQRSh2KTsKKyAgICAgICAgUHlPYmplY3RfSU5JVCh2LCAmUHlJbnRfVHlwZSk7CisgICAgICAgIHYtPm9iX2l2YWwgPSBpdmFsOworICAgICAgICBzbWFsbF9pbnRzW2l2YWwgKyBOU01BTExORUdJTlRTXSA9IHY7CisgICAgfQogI2VuZGlmCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludAogUHlJbnRfQ2xlYXJGcmVlTGlzdCh2b2lkKQogewotCVB5SW50T2JqZWN0ICpwOwotCVB5SW50QmxvY2sgKmxpc3QsICpuZXh0OwotCWludCBpOwotCWludCB1OwkJCS8qIHJlbWFpbmluZyB1bmZyZWVkIGludHMgcGVyIGJsb2NrICovCi0JaW50IGZyZWVsaXN0X3NpemUgPSAwOworICAgIFB5SW50T2JqZWN0ICpwOworICAgIFB5SW50QmxvY2sgKmxpc3QsICpuZXh0OworICAgIGludCBpOworICAgIGludCB1OyAgICAgICAgICAgICAgICAgICAgICAvKiByZW1haW5pbmcgdW5mcmVlZCBpbnRzIHBlciBibG9jayAqLworICAgIGludCBmcmVlbGlzdF9zaXplID0gMDsKIAotCWxpc3QgPSBibG9ja19saXN0OwotCWJsb2NrX2xpc3QgPSBOVUxMOwotCWZyZWVfbGlzdCA9IE5VTEw7Ci0Jd2hpbGUgKGxpc3QgIT0gTlVMTCkgewotCQl1ID0gMDsKLQkJZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOwotCQkgICAgIGkgPCBOX0lOVE9CSkVDVFM7Ci0JCSAgICAgaSsrLCBwKyspIHsKLQkJCWlmIChQeUludF9DaGVja0V4YWN0KHApICYmIHAtPm9iX3JlZmNudCAhPSAwKQotCQkJCXUrKzsKLQkJfQotCQluZXh0ID0gbGlzdC0+bmV4dDsKLQkJaWYgKHUpIHsKLQkJCWxpc3QtPm5leHQgPSBibG9ja19saXN0OwotCQkJYmxvY2tfbGlzdCA9IGxpc3Q7Ci0JCQlmb3IgKGkgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07Ci0JCQkgICAgIGkgPCBOX0lOVE9CSkVDVFM7Ci0JCQkgICAgIGkrKywgcCsrKSB7Ci0JCQkJaWYgKCFQeUludF9DaGVja0V4YWN0KHApIHx8Ci0JCQkJICAgIHAtPm9iX3JlZmNudCA9PSAwKSB7Ci0JCQkJCVB5X1RZUEUocCkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopCi0JCQkJCQlmcmVlX2xpc3Q7Ci0JCQkJCWZyZWVfbGlzdCA9IHA7Ci0JCQkJfQorICAgIGxpc3QgPSBibG9ja19saXN0OworICAgIGJsb2NrX2xpc3QgPSBOVUxMOworICAgIGZyZWVfbGlzdCA9IE5VTEw7CisgICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgeworICAgICAgICB1ID0gMDsKKyAgICAgICAgZm9yIChpID0gMCwgcCA9ICZsaXN0LT5vYmplY3RzWzBdOworICAgICAgICAgICAgIGkgPCBOX0lOVE9CSkVDVFM7CisgICAgICAgICAgICAgaSsrLCBwKyspIHsKKyAgICAgICAgICAgIGlmIChQeUludF9DaGVja0V4YWN0KHApICYmIHAtPm9iX3JlZmNudCAhPSAwKQorICAgICAgICAgICAgICAgIHUrKzsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gbGlzdC0+bmV4dDsKKyAgICAgICAgaWYgKHUpIHsKKyAgICAgICAgICAgIGxpc3QtPm5leHQgPSBibG9ja19saXN0OworICAgICAgICAgICAgYmxvY2tfbGlzdCA9IGxpc3Q7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBwID0gJmxpc3QtPm9iamVjdHNbMF07CisgICAgICAgICAgICAgICAgIGkgPCBOX0lOVE9CSkVDVFM7CisgICAgICAgICAgICAgICAgIGkrKywgcCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFQeUludF9DaGVja0V4YWN0KHApIHx8CisgICAgICAgICAgICAgICAgICAgIHAtPm9iX3JlZmNudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocCkgPSAoc3RydWN0IF90eXBlb2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2xpc3Q7CisgICAgICAgICAgICAgICAgICAgIGZyZWVfbGlzdCA9IHA7CisgICAgICAgICAgICAgICAgfQogI2lmIE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTID4gMAotCQkJCWVsc2UgaWYgKC1OU01BTExORUdJTlRTIDw9IHAtPm9iX2l2YWwgJiYKLQkJCQkJIHAtPm9iX2l2YWwgPCBOU01BTExQT1NJTlRTICYmCi0JCQkJCSBzbWFsbF9pbnRzW3AtPm9iX2l2YWwgKwotCQkJCQkJICAgIE5TTUFMTE5FR0lOVFNdID09IE5VTEwpIHsKLQkJCQkJUHlfSU5DUkVGKHApOwotCQkJCQlzbWFsbF9pbnRzW3AtPm9iX2l2YWwgKwotCQkJCQkJICAgTlNNQUxMTkVHSU5UU10gPSBwOwotCQkJCX0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICgtTlNNQUxMTkVHSU5UUyA8PSBwLT5vYl9pdmFsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgcC0+b2JfaXZhbCA8IE5TTUFMTFBPU0lOVFMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbF9pbnRzW3AtPm9iX2l2YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNNQUxMTkVHSU5UU10gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYocCk7CisgICAgICAgICAgICAgICAgICAgIHNtYWxsX2ludHNbcC0+b2JfaXZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNNQUxMTkVHSU5UU10gPSBwOworICAgICAgICAgICAgICAgIH0KICNlbmRpZgotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJUHlNZW1fRlJFRShsaXN0KTsKLQkJfQotCQlmcmVlbGlzdF9zaXplICs9IHU7Ci0JCWxpc3QgPSBuZXh0OwotCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5TWVtX0ZSRUUobGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZWxpc3Rfc2l6ZSArPSB1OworICAgICAgICBsaXN0ID0gbmV4dDsKKyAgICB9CiAKLQlyZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKKyAgICByZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKIH0KIAogdm9pZAogUHlJbnRfRmluaSh2b2lkKQogewotCVB5SW50T2JqZWN0ICpwOwotCVB5SW50QmxvY2sgKmxpc3Q7Ci0JaW50IGk7Ci0JaW50IHU7CQkJLyogdG90YWwgdW5mcmVlZCBpbnRzIHBlciBibG9jayAqLworICAgIFB5SW50T2JqZWN0ICpwOworICAgIFB5SW50QmxvY2sgKmxpc3Q7CisgICAgaW50IGk7CisgICAgaW50IHU7ICAgICAgICAgICAgICAgICAgICAgIC8qIHRvdGFsIHVuZnJlZWQgaW50cyBwZXIgYmxvY2sgKi8KIAogI2lmIE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTID4gMAotCVB5SW50T2JqZWN0ICoqcTsKKyAgICBQeUludE9iamVjdCAqKnE7CiAKLQlpID0gTlNNQUxMTkVHSU5UUyArIE5TTUFMTFBPU0lOVFM7Ci0JcSA9IHNtYWxsX2ludHM7Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCVB5X1hERUNSRUYoKnEpOwotCQkqcSsrID0gTlVMTDsKLQl9CisgICAgaSA9IE5TTUFMTE5FR0lOVFMgKyBOU01BTExQT1NJTlRTOworICAgIHEgPSBzbWFsbF9pbnRzOworICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICBQeV9YREVDUkVGKCpxKTsKKyAgICAgICAgKnErKyA9IE5VTEw7CisgICAgfQogI2VuZGlmCi0JdSA9IFB5SW50X0NsZWFyRnJlZUxpc3QoKTsKLQlpZiAoIVB5X1ZlcmJvc2VGbGFnKQotCQlyZXR1cm47Ci0JZnByaW50ZihzdGRlcnIsICIjIGNsZWFudXAgaW50cyIpOwotCWlmICghdSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Ci0JfQotCWVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSI6ICVkIHVuZnJlZWQgaW50JXNcbiIsCi0JCQl1LCB1ID09IDEgPyAiIiA6ICJzIik7Ci0JfQotCWlmIChQeV9WZXJib3NlRmxhZyA+IDEpIHsKLQkJbGlzdCA9IGJsb2NrX2xpc3Q7Ci0JCXdoaWxlIChsaXN0ICE9IE5VTEwpIHsKLQkJCWZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKLQkJCSAgICAgaSA8IE5fSU5UT0JKRUNUUzsKLQkJCSAgICAgaSsrLCBwKyspIHsKLQkJCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdChwKSAmJiBwLT5vYl9yZWZjbnQgIT0gMCkKLQkJCQkJLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvCi0JCQkJCSAgIGxvbmcgdW50aWwgJXpkIGlzIHVuaXZlcnNhbGx5Ci0JCQkJCSAgIGF2YWlsYWJsZQotCQkJCQkgKi8KLQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIiMgICA8aW50IGF0ICVwLCByZWZjbnQ9JWxkLCB2YWw9JWxkPlxuIiwKLQkJCQkJCXAsIChsb25nKXAtPm9iX3JlZmNudCwKLQkJCQkJCXAtPm9iX2l2YWwpOwotCQkJfQotCQkJbGlzdCA9IGxpc3QtPm5leHQ7Ci0JCX0KLQl9CisgICAgdSA9IFB5SW50X0NsZWFyRnJlZUxpc3QoKTsKKyAgICBpZiAoIVB5X1ZlcmJvc2VGbGFnKQorICAgICAgICByZXR1cm47CisgICAgZnByaW50ZihzdGRlcnIsICIjIGNsZWFudXAgaW50cyIpOworICAgIGlmICghdSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICI6ICVkIHVuZnJlZWQgaW50JXNcbiIsCisgICAgICAgICAgICB1LCB1ID09IDEgPyAiIiA6ICJzIik7CisgICAgfQorICAgIGlmIChQeV9WZXJib3NlRmxhZyA+IDEpIHsKKyAgICAgICAgbGlzdCA9IGJsb2NrX2xpc3Q7CisgICAgICAgIHdoaWxlIChsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDAsIHAgPSAmbGlzdC0+b2JqZWN0c1swXTsKKyAgICAgICAgICAgICAgICAgaSA8IE5fSU5UT0JKRUNUUzsKKyAgICAgICAgICAgICAgICAgaSsrLCBwKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChwKSAmJiBwLT5vYl9yZWZjbnQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvCisgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdW50aWwgJXpkIGlzIHVuaXZlcnNhbGx5CisgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIiMgICA8aW50IGF0ICVwLCByZWZjbnQ9JWxkLCB2YWw9JWxkPlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgKGxvbmcpcC0+b2JfcmVmY250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5vYl9pdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9pdGVyb2JqZWN0LmMgYi9PYmplY3RzL2l0ZXJvYmplY3QuYwppbmRleCA5Y2ViYWM5Li41YTlhMmRkIDEwMDY0NAotLS0gYS9PYmplY3RzL2l0ZXJvYmplY3QuYworKysgYi9PYmplY3RzL2l0ZXJvYmplY3QuYwpAQCAtMywyMjggKzMsMjI4IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JbG9uZyAgICAgIGl0X2luZGV4OwotCVB5T2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgICAgICBpdF9pbmRleDsKKyAgICBQeU9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBzZXFpdGVyb2JqZWN0OwogCiBQeU9iamVjdCAqCiBQeVNlcUl0ZXJfTmV3KFB5T2JqZWN0ICpzZXEpCiB7Ci0Jc2VxaXRlcm9iamVjdCAqaXQ7CisgICAgc2VxaXRlcm9iamVjdCAqaXQ7CiAKLQlpZiAoIVB5U2VxdWVuY2VfQ2hlY2soc2VxKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQkKLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhzZXFpdGVyb2JqZWN0LCAmUHlTZXFJdGVyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpdC0+aXRfaW5kZXggPSAwOwotCVB5X0lOQ1JFRihzZXEpOwotCWl0LT5pdF9zZXEgPSBzZXE7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaWYgKCFQeVNlcXVlbmNlX0NoZWNrKHNlcSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X0dDX05ldyhzZXFpdGVyb2JqZWN0LCAmUHlTZXFJdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdC0+aXRfaW5kZXggPSAwOworICAgIFB5X0lOQ1JFRihzZXEpOworICAgIGl0LT5pdF9zZXEgPSBzZXE7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyB2b2lkCiBpdGVyX2RlYWxsb2Moc2VxaXRlcm9iamVjdCAqaXQpCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOwotCVB5X1hERUNSRUYoaXQtPml0X3NlcSk7Ci0JUHlPYmplY3RfR0NfRGVsKGl0KTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhpdCk7CisgICAgUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoaXQpOwogfQogCiBzdGF0aWMgaW50CiBpdGVyX3RyYXZlcnNlKHNlcWl0ZXJvYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9WSVNJVChpdC0+aXRfc2VxKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpdC0+aXRfc2VxKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGl0ZXJfaXRlcm5leHQoUHlPYmplY3QgKml0ZXJhdG9yKQogewotCXNlcWl0ZXJvYmplY3QgKml0OwotCVB5T2JqZWN0ICpzZXE7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBzZXFpdGVyb2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqc2VxOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlhc3NlcnQoUHlTZXFJdGVyX0NoZWNrKGl0ZXJhdG9yKSk7Ci0JaXQgPSAoc2VxaXRlcm9iamVjdCAqKWl0ZXJhdG9yOwotCXNlcSA9IGl0LT5pdF9zZXE7Ci0JaWYgKHNlcSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlTZXFJdGVyX0NoZWNrKGl0ZXJhdG9yKSk7CisgICAgaXQgPSAoc2VxaXRlcm9iamVjdCAqKWl0ZXJhdG9yOworICAgIHNlcSA9IGl0LT5pdF9zZXE7CisgICAgaWYgKHNlcSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IFB5U2VxdWVuY2VfR2V0SXRlbShzZXEsIGl0LT5pdF9pbmRleCk7Ci0JaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JCWl0LT5pdF9pbmRleCsrOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbmRleEVycm9yKSB8fAotCSAgICBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCXsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfREVDUkVGKHNlcSk7Ci0JCWl0LT5pdF9zZXEgPSBOVUxMOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeVNlcXVlbmNlX0dldEl0ZW0oc2VxLCBpdC0+aXRfaW5kZXgpOworICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgICAgICBpdC0+aXRfaW5kZXgrKzsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW5kZXhFcnJvcikgfHwKKyAgICAgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICBpdC0+aXRfc2VxID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpdGVyX2xlbihzZXFpdGVyb2JqZWN0ICppdCkKIHsKLQlQeV9zc2l6ZV90IHNlcXNpemUsIGxlbjsKKyAgICBQeV9zc2l6ZV90IHNlcXNpemUsIGxlbjsKIAotCWlmIChpdC0+aXRfc2VxKSB7Ci0JCXNlcXNpemUgPSBQeVNlcXVlbmNlX1NpemUoaXQtPml0X3NlcSk7Ci0JCWlmIChzZXFzaXplID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWxlbiA9IHNlcXNpemUgLSBpdC0+aXRfaW5kZXg7Ci0JCWlmIChsZW4gPj0gMCkKLQkJCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChsZW4pOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgaWYgKGl0LT5pdF9zZXEpIHsKKyAgICAgICAgc2Vxc2l6ZSA9IFB5U2VxdWVuY2VfU2l6ZShpdC0+aXRfc2VxKTsKKyAgICAgICAgaWYgKHNlcXNpemUgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbGVuID0gc2Vxc2l6ZSAtIGl0LT5pdF9pbmRleDsKKyAgICAgICAgaWYgKGxlbiA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKIH0KIAogUHlEb2NfU1RSVkFSKGxlbmd0aF9oaW50X2RvYywgIlByaXZhdGUgbWV0aG9kIHJldHVybmluZyBhbiBlc3RpbWF0ZSBvZiBsZW4obGlzdChpdCkpLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgc2VxaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24paXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWl0ZXJfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5U2VxSXRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JIml0ZXJhdG9yIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihzZXFpdGVyb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaXRlcl9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKWl0ZXJfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotIAkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JaXRlcl9pdGVybmV4dCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzZXFpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCQkvKiB0cF9tZW1iZXJzICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2Yoc2VxaXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIGl0ZXJfaXRlcm5leHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzZXFpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKml0X2NhbGxhYmxlOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwotCVB5T2JqZWN0ICppdF9zZW50aW5lbDsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKml0X2NhbGxhYmxlOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0ICppdF9zZW50aW5lbDsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gY2FsbGl0ZXJvYmplY3Q7CiAKIFB5T2JqZWN0ICoKIFB5Q2FsbEl0ZXJfTmV3KFB5T2JqZWN0ICpjYWxsYWJsZSwgUHlPYmplY3QgKnNlbnRpbmVsKQogewotCWNhbGxpdGVyb2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X0dDX05ldyhjYWxsaXRlcm9iamVjdCwgJlB5Q2FsbEl0ZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihjYWxsYWJsZSk7Ci0JaXQtPml0X2NhbGxhYmxlID0gY2FsbGFibGU7Ci0JUHlfSU5DUkVGKHNlbnRpbmVsKTsKLQlpdC0+aXRfc2VudGluZWwgPSBzZW50aW5lbDsKLQlfUHlPYmplY3RfR0NfVFJBQ0soaXQpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBjYWxsaXRlcm9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9HQ19OZXcoY2FsbGl0ZXJvYmplY3QsICZQeUNhbGxJdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoY2FsbGFibGUpOworICAgIGl0LT5pdF9jYWxsYWJsZSA9IGNhbGxhYmxlOworICAgIFB5X0lOQ1JFRihzZW50aW5lbCk7CisgICAgaXQtPml0X3NlbnRpbmVsID0gc2VudGluZWw7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiBzdGF0aWMgdm9pZAogY2FsbGl0ZXJfZGVhbGxvYyhjYWxsaXRlcm9iamVjdCAqaXQpCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOwotCVB5X1hERUNSRUYoaXQtPml0X2NhbGxhYmxlKTsKLQlQeV9YREVDUkVGKGl0LT5pdF9zZW50aW5lbCk7Ci0JUHlPYmplY3RfR0NfRGVsKGl0KTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhpdCk7CisgICAgUHlfWERFQ1JFRihpdC0+aXRfY2FsbGFibGUpOworICAgIFB5X1hERUNSRUYoaXQtPml0X3NlbnRpbmVsKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoaXQpOwogfQogCiBzdGF0aWMgaW50CiBjYWxsaXRlcl90cmF2ZXJzZShjYWxsaXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGl0LT5pdF9jYWxsYWJsZSk7Ci0JUHlfVklTSVQoaXQtPml0X3NlbnRpbmVsKTsKLQlyZXR1cm4gMDsKKyAgICBQeV9WSVNJVChpdC0+aXRfY2FsbGFibGUpOworICAgIFB5X1ZJU0lUKGl0LT5pdF9zZW50aW5lbCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsaXRlcl9pdGVybmV4dChjYWxsaXRlcm9iamVjdCAqaXQpCiB7Ci0JaWYgKGl0LT5pdF9jYWxsYWJsZSAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMCk7Ci0JCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JCWlmIChhcmdzID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChpdC0+aXRfY2FsbGFibGUsIGFyZ3MsIE5VTEwpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCWlmIChyZXN1bHQgIT0gTlVMTCkgewotCQkJaW50IG9rOwotCQkJb2sgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wocmVzdWx0LAotCQkJCQkJICAgICAgaXQtPml0X3NlbnRpbmVsLAotCQkJCQkJICAgICAgUHlfRVEpOwotCQkJaWYgKG9rID09IDApCi0JCQkJcmV0dXJuIHJlc3VsdDsgLyogQ29tbW9uIGNhc2UsIGZhc3QgcGF0aCAqLwotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlpZiAob2sgPiAwKSB7Ci0JCQkJUHlfQ0xFQVIoaXQtPml0X2NhbGxhYmxlKTsKLQkJCQlQeV9DTEVBUihpdC0+aXRfc2VudGluZWwpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfU3RvcEl0ZXJhdGlvbikpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeV9DTEVBUihpdC0+aXRfY2FsbGFibGUpOwotCQkJUHlfQ0xFQVIoaXQtPml0X3NlbnRpbmVsKTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoaXQtPml0X2NhbGxhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGl0LT5pdF9jYWxsYWJsZSwgYXJncywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgb2s7CisgICAgICAgICAgICBvayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+aXRfc2VudGluZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9FUSk7CisgICAgICAgICAgICBpZiAob2sgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAvKiBDb21tb24gY2FzZSwgZmFzdCBwYXRoICovCisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIGlmIChvayA+IDApIHsKKyAgICAgICAgICAgICAgICBQeV9DTEVBUihpdC0+aXRfY2FsbGFibGUpOworICAgICAgICAgICAgICAgIFB5X0NMRUFSKGl0LT5pdF9zZW50aW5lbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIFB5X0NMRUFSKGl0LT5pdF9jYWxsYWJsZSk7CisgICAgICAgICAgICBQeV9DTEVBUihpdC0+aXRfc2VudGluZWwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiBQeVR5cGVPYmplY3QgUHlDYWxsSXRlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImNhbGxhYmxlLWl0ZXJhdG9yIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGNhbGxpdGVyb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY2FsbGl0ZXJfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpY2FsbGl0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpY2FsbGl0ZXJfaXRlcm5leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJjYWxsYWJsZS1pdGVyYXRvciIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihjYWxsaXRlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciljYWxsaXRlcl9kZWFsbG9jLCAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWNhbGxpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYyljYWxsaXRlcl9pdGVybmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvbGlzdG9iamVjdC5jIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKaW5kZXggNjE4OGJlYy4uYTViYWNmMyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9saXN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKQEAgLTUsNyArNSw3IEBACiAjaWZkZWYgU1REQ19IRUFERVJTCiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAjZWxzZQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJLyogRm9yIHNpemVfdCAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAgICAgICAvKiBGb3Igc2l6ZV90ICovCiAjZW5kaWYKIAogLyogRW5zdXJlIG9iX2l0ZW0gaGFzIHJvb20gZm9yIGF0IGxlYXN0IG5ld3NpemUgZWxlbWVudHMsIGFuZCBzZXQKQEAgLTI0LDUyICsyNCw1MiBAQAogc3RhdGljIGludAogbGlzdF9yZXNpemUoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IG5ld3NpemUpCiB7Ci0JUHlPYmplY3QgKippdGVtczsKLQlzaXplX3QgbmV3X2FsbG9jYXRlZDsKLQlQeV9zc2l6ZV90IGFsbG9jYXRlZCA9IHNlbGYtPmFsbG9jYXRlZDsKKyAgICBQeU9iamVjdCAqKml0ZW1zOworICAgIHNpemVfdCBuZXdfYWxsb2NhdGVkOworICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkID0gc2VsZi0+YWxsb2NhdGVkOwogCi0JLyogQnlwYXNzIHJlYWxsb2MoKSB3aGVuIGEgcHJldmlvdXMgb3ZlcmFsbG9jYXRpb24gaXMgbGFyZ2UgZW5vdWdoCi0JICAgdG8gYWNjb21tb2RhdGUgdGhlIG5ld3NpemUuICBJZiB0aGUgbmV3c2l6ZSBmYWxscyBsb3dlciB0aGFuIGhhbGYKLQkgICB0aGUgYWxsb2NhdGVkIHNpemUsIHRoZW4gcHJvY2VlZCB3aXRoIHRoZSByZWFsbG9jKCkgdG8gc2hyaW5rIHRoZSBsaXN0LgotCSovCi0JaWYgKGFsbG9jYXRlZCA+PSBuZXdzaXplICYmIG5ld3NpemUgPj0gKGFsbG9jYXRlZCA+PiAxKSkgewotCQlhc3NlcnQoc2VsZi0+b2JfaXRlbSAhPSBOVUxMIHx8IG5ld3NpemUgPT0gMCk7Ci0JCVB5X1NJWkUoc2VsZikgPSBuZXdzaXplOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogQnlwYXNzIHJlYWxsb2MoKSB3aGVuIGEgcHJldmlvdXMgb3ZlcmFsbG9jYXRpb24gaXMgbGFyZ2UgZW5vdWdoCisgICAgICAgdG8gYWNjb21tb2RhdGUgdGhlIG5ld3NpemUuICBJZiB0aGUgbmV3c2l6ZSBmYWxscyBsb3dlciB0aGFuIGhhbGYKKyAgICAgICB0aGUgYWxsb2NhdGVkIHNpemUsIHRoZW4gcHJvY2VlZCB3aXRoIHRoZSByZWFsbG9jKCkgdG8gc2hyaW5rIHRoZSBsaXN0LgorICAgICovCisgICAgaWYgKGFsbG9jYXRlZCA+PSBuZXdzaXplICYmIG5ld3NpemUgPj0gKGFsbG9jYXRlZCA+PiAxKSkgeworICAgICAgICBhc3NlcnQoc2VsZi0+b2JfaXRlbSAhPSBOVUxMIHx8IG5ld3NpemUgPT0gMCk7CisgICAgICAgIFB5X1NJWkUoc2VsZikgPSBuZXdzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBUaGlzIG92ZXItYWxsb2NhdGVzIHByb3BvcnRpb25hbCB0byB0aGUgbGlzdCBzaXplLCBtYWtpbmcgcm9vbQotCSAqIGZvciBhZGRpdGlvbmFsIGdyb3d0aC4gIFRoZSBvdmVyLWFsbG9jYXRpb24gaXMgbWlsZCwgYnV0IGlzCi0JICogZW5vdWdoIHRvIGdpdmUgbGluZWFyLXRpbWUgYW1vcnRpemVkIGJlaGF2aW9yIG92ZXIgYSBsb25nCi0JICogc2VxdWVuY2Ugb2YgYXBwZW5kcygpIGluIHRoZSBwcmVzZW5jZSBvZiBhIHBvb3JseS1wZXJmb3JtaW5nCi0JICogc3lzdGVtIHJlYWxsb2MoKS4KLQkgKiBUaGUgZ3Jvd3RoIHBhdHRlcm4gaXM6ICAwLCA0LCA4LCAxNiwgMjUsIDM1LCA0NiwgNTgsIDcyLCA4OCwgLi4uCi0JICovCi0JbmV3X2FsbG9jYXRlZCA9IChuZXdzaXplID4+IDMpICsgKG5ld3NpemUgPCA5ID8gMyA6IDYpOworICAgIC8qIFRoaXMgb3Zlci1hbGxvY2F0ZXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBsaXN0IHNpemUsIG1ha2luZyByb29tCisgICAgICogZm9yIGFkZGl0aW9uYWwgZ3Jvd3RoLiAgVGhlIG92ZXItYWxsb2NhdGlvbiBpcyBtaWxkLCBidXQgaXMKKyAgICAgKiBlbm91Z2ggdG8gZ2l2ZSBsaW5lYXItdGltZSBhbW9ydGl6ZWQgYmVoYXZpb3Igb3ZlciBhIGxvbmcKKyAgICAgKiBzZXF1ZW5jZSBvZiBhcHBlbmRzKCkgaW4gdGhlIHByZXNlbmNlIG9mIGEgcG9vcmx5LXBlcmZvcm1pbmcKKyAgICAgKiBzeXN0ZW0gcmVhbGxvYygpLgorICAgICAqIFRoZSBncm93dGggcGF0dGVybiBpczogIDAsIDQsIDgsIDE2LCAyNSwgMzUsIDQ2LCA1OCwgNzIsIDg4LCAuLi4KKyAgICAgKi8KKyAgICBuZXdfYWxsb2NhdGVkID0gKG5ld3NpemUgPj4gMykgKyAobmV3c2l6ZSA8IDkgPyAzIDogNik7CiAKLQkvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLwotCWlmIChuZXdfYWxsb2NhdGVkID4gUFlfU0laRV9NQVggLSBuZXdzaXplKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9IGVsc2UgewotCQluZXdfYWxsb2NhdGVkICs9IG5ld3NpemU7Ci0JfQorICAgIC8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisgICAgaWYgKG5ld19hbGxvY2F0ZWQgPiBQWV9TSVpFX01BWCAtIG5ld3NpemUpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIG5ld19hbGxvY2F0ZWQgKz0gbmV3c2l6ZTsKKyAgICB9CiAKLQlpZiAobmV3c2l6ZSA9PSAwKQotCQluZXdfYWxsb2NhdGVkID0gMDsKLQlpdGVtcyA9IHNlbGYtPm9iX2l0ZW07Ci0JaWYgKG5ld19hbGxvY2F0ZWQgPD0gKCh+KHNpemVfdCkwKSAvIHNpemVvZihQeU9iamVjdCAqKSkpCi0JCVB5TWVtX1JFU0laRShpdGVtcywgUHlPYmplY3QgKiwgbmV3X2FsbG9jYXRlZCk7Ci0JZWxzZQotCQlpdGVtcyA9IE5VTEw7Ci0JaWYgKGl0ZW1zID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzZWxmLT5vYl9pdGVtID0gaXRlbXM7Ci0JUHlfU0laRShzZWxmKSA9IG5ld3NpemU7Ci0Jc2VsZi0+YWxsb2NhdGVkID0gbmV3X2FsbG9jYXRlZDsKLQlyZXR1cm4gMDsKKyAgICBpZiAobmV3c2l6ZSA9PSAwKQorICAgICAgICBuZXdfYWxsb2NhdGVkID0gMDsKKyAgICBpdGVtcyA9IHNlbGYtPm9iX2l0ZW07CisgICAgaWYgKG5ld19hbGxvY2F0ZWQgPD0gKCh+KHNpemVfdCkwKSAvIHNpemVvZihQeU9iamVjdCAqKSkpCisgICAgICAgIFB5TWVtX1JFU0laRShpdGVtcywgUHlPYmplY3QgKiwgbmV3X2FsbG9jYXRlZCk7CisgICAgZWxzZQorICAgICAgICBpdGVtcyA9IE5VTEw7CisgICAgaWYgKGl0ZW1zID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzZWxmLT5vYl9pdGVtID0gaXRlbXM7CisgICAgUHlfU0laRShzZWxmKSA9IG5ld3NpemU7CisgICAgc2VsZi0+YWxsb2NhdGVkID0gbmV3X2FsbG9jYXRlZDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogRGVidWcgc3RhdGlzdGljIHRvIGNvbXBhcmUgYWxsb2NhdGlvbnMgd2l0aCByZXVzZSB0aHJvdWdoIHRoZSBmcmVlIGxpc3QgKi8KQEAgLTgxLDEyICs4MSwxMiBAQAogc3RhdGljIHZvaWQKIHNob3dfYWxsb2Modm9pZCkKIHsKLQlmcHJpbnRmKHN0ZGVyciwgIkxpc3QgYWxsb2NhdGlvbnM6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCi0JCWNvdW50X2FsbG9jKTsKLQlmcHJpbnRmKHN0ZGVyciwgIkxpc3QgcmV1c2UgdGhyb3VnaCBmcmVlbGlzdDogJSIgUFlfRk9STUFUX1NJWkVfVAotCQkiZFxuIiwgY291bnRfcmV1c2UpOwotCWZwcmludGYoc3RkZXJyLCAiJS4yZiUlIHJldXNlIHJhdGVcblxuIiwKLQkJKDEwMC4wKmNvdW50X3JldXNlLyhjb3VudF9hbGxvYytjb3VudF9yZXVzZSkpKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3QgYWxsb2NhdGlvbnM6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCisgICAgICAgIGNvdW50X2FsbG9jKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3QgcmV1c2UgdGhyb3VnaCBmcmVlbGlzdDogJSIgUFlfRk9STUFUX1NJWkVfVAorICAgICAgICAiZFxuIiwgY291bnRfcmV1c2UpOworICAgIGZwcmludGYoc3RkZXJyLCAiJS4yZiUlIHJldXNlIHJhdGVcblxuIiwKKyAgICAgICAgKDEwMC4wKmNvdW50X3JldXNlLyhjb3VudF9hbGxvYytjb3VudF9yZXVzZSkpKTsKIH0KICNlbmRpZgogCkBAIC0xMDAsNzcgKzEwMCw3NyBAQAogdm9pZAogUHlMaXN0X0Zpbmkodm9pZCkKIHsKLQlQeUxpc3RPYmplY3QgKm9wOworICAgIFB5TGlzdE9iamVjdCAqb3A7CiAKLQl3aGlsZSAobnVtZnJlZSkgewotCQlvcCA9IGZyZWVfbGlzdFstLW51bWZyZWVdOwotCQlhc3NlcnQoUHlMaXN0X0NoZWNrRXhhY3Qob3ApKTsKLQkJUHlPYmplY3RfR0NfRGVsKG9wKTsKLQl9CisgICAgd2hpbGUgKG51bWZyZWUpIHsKKyAgICAgICAgb3AgPSBmcmVlX2xpc3RbLS1udW1mcmVlXTsKKyAgICAgICAgYXNzZXJ0KFB5TGlzdF9DaGVja0V4YWN0KG9wKSk7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChvcCk7CisgICAgfQogfQogCiBQeU9iamVjdCAqCiBQeUxpc3RfTmV3KFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQeUxpc3RPYmplY3QgKm9wOwotCXNpemVfdCBuYnl0ZXM7CisgICAgUHlMaXN0T2JqZWN0ICpvcDsKKyAgICBzaXplX3QgbmJ5dGVzOwogI2lmZGVmIFNIT1dfQUxMT0NfQ09VTlQKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLQlpZiAoIWluaXRpYWxpemVkKSB7Ci0JCVB5X0F0RXhpdChzaG93X2FsbG9jKTsKLQkJaW5pdGlhbGl6ZWQgPSAxOwotCX0KKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIFB5X0F0RXhpdChzaG93X2FsbG9jKTsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIH0KICNlbmRpZgogCi0JaWYgKHNpemUgPCAwKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogQ2hlY2sgZm9yIG92ZXJmbG93IHdpdGhvdXQgYW4gYWN0dWFsIG92ZXJmbG93LAotCSAqICB3aGljaCBjYW4gY2F1c2UgY29tcGlsZXIgdG8gb3B0aW1pc2Ugb3V0ICovCi0JaWYgKChzaXplX3Qpc2l6ZSA+IFBZX1NJWkVfTUFYIC8gc2l6ZW9mKFB5T2JqZWN0ICopKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQluYnl0ZXMgPSBzaXplICogc2l6ZW9mKFB5T2JqZWN0ICopOwotCWlmIChudW1mcmVlKSB7Ci0JCW51bWZyZWUtLTsKLQkJb3AgPSBmcmVlX2xpc3RbbnVtZnJlZV07Ci0JCV9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopb3ApOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyB3aXRob3V0IGFuIGFjdHVhbCBvdmVyZmxvdywKKyAgICAgKiAgd2hpY2ggY2FuIGNhdXNlIGNvbXBpbGVyIHRvIG9wdGltaXNlIG91dCAqLworICAgIGlmICgoc2l6ZV90KXNpemUgPiBQWV9TSVpFX01BWCAvIHNpemVvZihQeU9iamVjdCAqKSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgbmJ5dGVzID0gc2l6ZSAqIHNpemVvZihQeU9iamVjdCAqKTsKKyAgICBpZiAobnVtZnJlZSkgeworICAgICAgICBudW1mcmVlLS07CisgICAgICAgIG9wID0gZnJlZV9saXN0W251bWZyZWVdOworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKW9wKTsKICNpZmRlZiBTSE9XX0FMTE9DX0NPVU5UCi0JCWNvdW50X3JldXNlKys7CisgICAgICAgIGNvdW50X3JldXNlKys7CiAjZW5kaWYKLQl9IGVsc2UgewotCQlvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUxpc3RPYmplY3QsICZQeUxpc3RfVHlwZSk7Ci0JCWlmIChvcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3AgPSBQeU9iamVjdF9HQ19OZXcoUHlMaXN0T2JqZWN0LCAmUHlMaXN0X1R5cGUpOworICAgICAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFNIT1dfQUxMT0NfQ09VTlQKLQkJY291bnRfYWxsb2MrKzsKKyAgICAgICAgY291bnRfYWxsb2MrKzsKICNlbmRpZgotCX0KLQlpZiAoc2l6ZSA8PSAwKQotCQlvcC0+b2JfaXRlbSA9IE5VTEw7Ci0JZWxzZSB7Ci0JCW9wLT5vYl9pdGVtID0gKFB5T2JqZWN0ICoqKSBQeU1lbV9NQUxMT0MobmJ5dGVzKTsKLQkJaWYgKG9wLT5vYl9pdGVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihvcCk7Ci0JCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQkJfQotCQltZW1zZXQob3AtPm9iX2l0ZW0sIDAsIG5ieXRlcyk7Ci0JfQotCVB5X1NJWkUob3ApID0gc2l6ZTsKLQlvcC0+YWxsb2NhdGVkID0gc2l6ZTsKLQlfUHlPYmplY3RfR0NfVFJBQ0sob3ApOwotCXJldHVybiAoUHlPYmplY3QgKikgb3A7CisgICAgfQorICAgIGlmIChzaXplIDw9IDApCisgICAgICAgIG9wLT5vYl9pdGVtID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgb3AtPm9iX2l0ZW0gPSAoUHlPYmplY3QgKiopIFB5TWVtX01BTExPQyhuYnl0ZXMpOworICAgICAgICBpZiAob3AtPm9iX2l0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG9wKTsKKyAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICB9CisgICAgICAgIG1lbXNldChvcC0+b2JfaXRlbSwgMCwgbmJ5dGVzKTsKKyAgICB9CisgICAgUHlfU0laRShvcCkgPSBzaXplOworICAgIG9wLT5hbGxvY2F0ZWQgPSBzaXplOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogUHlfc3NpemVfdAogUHlMaXN0X1NpemUoUHlPYmplY3QgKm9wKQogewotCWlmICghUHlMaXN0X0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQllbHNlCi0JCXJldHVybiBQeV9TSVpFKG9wKTsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlfU0laRShvcCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqaW5kZXhlcnIgPSBOVUxMOwpAQCAtMTc4LDExNCArMTc4LDExNCBAQAogUHlPYmplY3QgKgogUHlMaXN0X0dldEl0ZW0oUHlPYmplY3QgKm9wLCBQeV9zc2l6ZV90IGkpCiB7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShvcCkpIHsKLQkJaWYgKGluZGV4ZXJyID09IE5VTEwpCi0JCQlpbmRleGVyciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoCi0JCQkJImxpc3QgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCVB5RXJyX1NldE9iamVjdChQeUV4Y19JbmRleEVycm9yLCBpbmRleGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKChQeUxpc3RPYmplY3QgKilvcCkgLT4gb2JfaXRlbVtpXTsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKG9wKSkgeworICAgICAgICBpZiAoaW5kZXhlcnIgPT0gTlVMTCkKKyAgICAgICAgICAgIGluZGV4ZXJyID0gUHlTdHJpbmdfRnJvbVN0cmluZygKKyAgICAgICAgICAgICAgICAibGlzdCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0luZGV4RXJyb3IsIGluZGV4ZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5TGlzdE9iamVjdCAqKW9wKSAtPiBvYl9pdGVtW2ldOwogfQogCiBpbnQKIFB5TGlzdF9TZXRJdGVtKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLAogICAgICAgICAgICAgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm5ld2l0ZW0pCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKm9sZGl0ZW07Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKipwOwotCWlmICghUHlMaXN0X0NoZWNrKG9wKSkgewotCQlQeV9YREVDUkVGKG5ld2l0ZW0pOwotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKG9wKSkgewotCQlQeV9YREVDUkVGKG5ld2l0ZW0pOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkibGlzdCBhc3NpZ25tZW50IGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXAgPSAoKFB5TGlzdE9iamVjdCAqKW9wKSAtPiBvYl9pdGVtICsgaTsKLQlvbGRpdGVtID0gKnA7Ci0JKnAgPSBuZXdpdGVtOwotCVB5X1hERUNSRUYob2xkaXRlbSk7Ci0JcmV0dXJuIDA7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9sZGl0ZW07CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKipwOworICAgIGlmICghUHlMaXN0X0NoZWNrKG9wKSkgeworICAgICAgICBQeV9YREVDUkVGKG5ld2l0ZW0pOworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKG9wKSkgeworICAgICAgICBQeV9YREVDUkVGKG5ld2l0ZW0pOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcCA9ICgoUHlMaXN0T2JqZWN0ICopb3ApIC0+IG9iX2l0ZW0gKyBpOworICAgIG9sZGl0ZW0gPSAqcDsKKyAgICAqcCA9IG5ld2l0ZW07CisgICAgUHlfWERFQ1JFRihvbGRpdGVtKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogaW5zMShQeUxpc3RPYmplY3QgKnNlbGYsIFB5X3NzaXplX3Qgd2hlcmUsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgaSwgbiA9IFB5X1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKippdGVtczsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChuID09IFBZX1NTSVpFX1RfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJImNhbm5vdCBhZGQgbW9yZSBvYmplY3RzIHRvIGxpc3QiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBQeV9zc2l6ZV90IGksIG4gPSBQeV9TSVpFKHNlbGYpOworICAgIFB5T2JqZWN0ICoqaXRlbXM7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobiA9PSBQWV9TU0laRV9UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJjYW5ub3QgYWRkIG1vcmUgb2JqZWN0cyB0byBsaXN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAobGlzdF9yZXNpemUoc2VsZiwgbisxKSA9PSAtMSkKLQkJcmV0dXJuIC0xOworICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBuKzEpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAod2hlcmUgPCAwKSB7Ci0JCXdoZXJlICs9IG47Ci0JCWlmICh3aGVyZSA8IDApCi0JCQl3aGVyZSA9IDA7Ci0JfQotCWlmICh3aGVyZSA+IG4pCi0JCXdoZXJlID0gbjsKLQlpdGVtcyA9IHNlbGYtPm9iX2l0ZW07Ci0JZm9yIChpID0gbjsgLS1pID49IHdoZXJlOyApCi0JCWl0ZW1zW2krMV0gPSBpdGVtc1tpXTsKLQlQeV9JTkNSRUYodik7Ci0JaXRlbXNbd2hlcmVdID0gdjsKLQlyZXR1cm4gMDsKKyAgICBpZiAod2hlcmUgPCAwKSB7CisgICAgICAgIHdoZXJlICs9IG47CisgICAgICAgIGlmICh3aGVyZSA8IDApCisgICAgICAgICAgICB3aGVyZSA9IDA7CisgICAgfQorICAgIGlmICh3aGVyZSA+IG4pCisgICAgICAgIHdoZXJlID0gbjsKKyAgICBpdGVtcyA9IHNlbGYtPm9iX2l0ZW07CisgICAgZm9yIChpID0gbjsgLS1pID49IHdoZXJlOyApCisgICAgICAgIGl0ZW1zW2krMV0gPSBpdGVtc1tpXTsKKyAgICBQeV9JTkNSRUYodik7CisgICAgaXRlbXNbd2hlcmVdID0gdjsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeUxpc3RfSW5zZXJ0KFB5T2JqZWN0ICpvcCwgUHlfc3NpemVfdCB3aGVyZSwgUHlPYmplY3QgKm5ld2l0ZW0pCiB7Ci0JaWYgKCFQeUxpc3RfQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBpbnMxKChQeUxpc3RPYmplY3QgKilvcCwgd2hlcmUsIG5ld2l0ZW0pOworICAgIGlmICghUHlMaXN0X0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gaW5zMSgoUHlMaXN0T2JqZWN0ICopb3AsIHdoZXJlLCBuZXdpdGVtKTsKIH0KIAogc3RhdGljIGludAogYXBwMShQeUxpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgbiA9IFB5TGlzdF9HRVRfU0laRShzZWxmKTsKKyAgICBQeV9zc2l6ZV90IG4gPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7CiAKLQlhc3NlcnQgKHYgIT0gTlVMTCk7Ci0JaWYgKG4gPT0gUFlfU1NJWkVfVF9NQVgpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkiY2Fubm90IGFkZCBtb3JlIG9iamVjdHMgdG8gbGlzdCIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGFzc2VydCAodiAhPSBOVUxMKTsKKyAgICBpZiAobiA9PSBQWV9TU0laRV9UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJjYW5ub3QgYWRkIG1vcmUgb2JqZWN0cyB0byBsaXN0Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAobGlzdF9yZXNpemUoc2VsZiwgbisxKSA9PSAtMSkKLQkJcmV0dXJuIC0xOworICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBuKzEpID09IC0xKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlQeV9JTkNSRUYodik7Ci0JUHlMaXN0X1NFVF9JVEVNKHNlbGYsIG4sIHYpOwotCXJldHVybiAwOworICAgIFB5X0lOQ1JFRih2KTsKKyAgICBQeUxpc3RfU0VUX0lURU0oc2VsZiwgbiwgdik7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlMaXN0X0FwcGVuZChQeU9iamVjdCAqb3AsIFB5T2JqZWN0ICpuZXdpdGVtKQogewotCWlmIChQeUxpc3RfQ2hlY2sob3ApICYmIChuZXdpdGVtICE9IE5VTEwpKQotCQlyZXR1cm4gYXBwMSgoUHlMaXN0T2JqZWN0ICopb3AsIG5ld2l0ZW0pOwotCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCXJldHVybiAtMTsKKyAgICBpZiAoUHlMaXN0X0NoZWNrKG9wKSAmJiAobmV3aXRlbSAhPSBOVUxMKSkKKyAgICAgICAgcmV0dXJuIGFwcDEoKFB5TGlzdE9iamVjdCAqKW9wLCBuZXdpdGVtKTsKKyAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIE1ldGhvZHMgKi8KQEAgLTI5MywzMDkgKzI5MywzMDkgQEAKIHN0YXRpYyB2b2lkCiBsaXN0X2RlYWxsb2MoUHlMaXN0T2JqZWN0ICpvcCkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhvcCk7Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihvcCkKLQlpZiAob3AtPm9iX2l0ZW0gIT0gTlVMTCkgewotCQkvKiBEbyBpdCBiYWNrd2FyZHMsIGZvciBDaHJpc3RpYW4gVGlzbWVyLgotCQkgICBUaGVyZSdzIGEgc2ltcGxlIHRlc3QgY2FzZSB3aGVyZSBzb21laG93IHRoaXMgcmVkdWNlcwotCQkgICB0aHJhc2hpbmcgd2hlbiBhICp2ZXJ5KiBsYXJnZSBsaXN0IGlzIGNyZWF0ZWQgYW5kCi0JCSAgIGltbWVkaWF0ZWx5IGRlbGV0ZWQuICovCi0JCWkgPSBQeV9TSVpFKG9wKTsKLQkJd2hpbGUgKC0taSA+PSAwKSB7Ci0JCQlQeV9YREVDUkVGKG9wLT5vYl9pdGVtW2ldKTsKLQkJfQotCQlQeU1lbV9GUkVFKG9wLT5vYl9pdGVtKTsKLQl9Ci0JaWYgKG51bWZyZWUgPCBQeUxpc3RfTUFYRlJFRUxJU1QgJiYgUHlMaXN0X0NoZWNrRXhhY3Qob3ApKQotCQlmcmVlX2xpc3RbbnVtZnJlZSsrXSA9IG9wOwotCWVsc2UKLQkJUHlfVFlQRShvcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopb3ApOwotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKG9wKQorICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKG9wKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG9wKQorICAgIGlmIChvcC0+b2JfaXRlbSAhPSBOVUxMKSB7CisgICAgICAgIC8qIERvIGl0IGJhY2t3YXJkcywgZm9yIENocmlzdGlhbiBUaXNtZXIuCisgICAgICAgICAgIFRoZXJlJ3MgYSBzaW1wbGUgdGVzdCBjYXNlIHdoZXJlIHNvbWVob3cgdGhpcyByZWR1Y2VzCisgICAgICAgICAgIHRocmFzaGluZyB3aGVuIGEgKnZlcnkqIGxhcmdlIGxpc3QgaXMgY3JlYXRlZCBhbmQKKyAgICAgICAgICAgaW1tZWRpYXRlbHkgZGVsZXRlZC4gKi8KKyAgICAgICAgaSA9IFB5X1NJWkUob3ApOworICAgICAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYob3AtPm9iX2l0ZW1baV0pOworICAgICAgICB9CisgICAgICAgIFB5TWVtX0ZSRUUob3AtPm9iX2l0ZW0pOworICAgIH0KKyAgICBpZiAobnVtZnJlZSA8IFB5TGlzdF9NQVhGUkVFTElTVCAmJiBQeUxpc3RfQ2hlY2tFeGFjdChvcCkpCisgICAgICAgIGZyZWVfbGlzdFtudW1mcmVlKytdID0gb3A7CisgICAgZWxzZQorICAgICAgICBQeV9UWVBFKG9wKS0+dHBfZnJlZSgoUHlPYmplY3QgKilvcCk7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQob3ApCiB9CiAKIHN0YXRpYyBpbnQKIGxpc3RfcHJpbnQoUHlMaXN0T2JqZWN0ICpvcCwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlpbnQgcmM7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICppdGVtOworICAgIGludCByYzsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKml0ZW07CiAKLQlyYyA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKW9wKTsKLQlpZiAocmMgIT0gMCkgewotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWZwcmludGYoZnAsICJbLi4uXSIpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICJbIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShvcCk7IGkrKykgewotCQlpdGVtID0gb3AtPm9iX2l0ZW1baV07Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQlmcHJpbnRmKGZwLCAiLCAiKTsKLQkJCVB5X0VORF9BTExPV19USFJFQURTCi0JCX0KLQkJaWYgKFB5T2JqZWN0X1ByaW50KGl0ZW0sIGZwLCAwKSAhPSAwKSB7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopb3ApOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICJdIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopb3ApOwotCXJldHVybiAwOworICAgIHJjID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopb3ApOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZnByaW50ZihmcCwgIlsuLi5dIik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnByaW50ZihmcCwgIlsiKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKG9wKTsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBvcC0+b2JfaXRlbVtpXTsKKyAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGZwcmludGYoZnAsICIsICIpOworICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlPYmplY3RfUHJpbnQoaXRlbSwgZnAsIDApICE9IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QgKilvcCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnByaW50ZihmcCwgIl0iKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QgKilvcCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X3JlcHIoUHlMaXN0T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqcywgKnRlbXA7Ci0JUHlPYmplY3QgKnBpZWNlcyA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcywgKnRlbXA7CisgICAgUHlPYmplY3QgKnBpZWNlcyA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOwogCi0JaSA9IFB5X1JlcHJFbnRlcigoUHlPYmplY3QqKXYpOwotCWlmIChpICE9IDApIHsKLQkJcmV0dXJuIGkgPiAwID8gUHlTdHJpbmdfRnJvbVN0cmluZygiWy4uLl0iKSA6IE5VTEw7Ci0JfQorICAgIGkgPSBQeV9SZXByRW50ZXIoKFB5T2JqZWN0Kil2KTsKKyAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIHJldHVybiBpID4gMCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlsuLi5dIikgOiBOVUxMOworICAgIH0KIAotCWlmIChQeV9TSVpFKHYpID09IDApIHsKLQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiW10iKTsKLQkJZ290byBEb25lOwotCX0KKyAgICBpZiAoUHlfU0laRSh2KSA9PSAwKSB7CisgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIltdIik7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CiAKLQlwaWVjZXMgPSBQeUxpc3RfTmV3KDApOwotCWlmIChwaWVjZXMgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIHBpZWNlcyA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHBpZWNlcyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CiAKLQkvKiBEbyByZXByKCkgb24gZWFjaCBlbGVtZW50LiAgTm90ZSB0aGF0IHRoaXMgbWF5IG11dGF0ZSB0aGUgbGlzdCwKLQkgICBzbyBtdXN0IHJlZmV0Y2ggdGhlIGxpc3Qgc2l6ZSBvbiBlYWNoIGl0ZXJhdGlvbi4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh2KTsgKytpKSB7Ci0JCWludCBzdGF0dXM7Ci0JCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBnZXR0aW5nIHRoZSByZXByIG9mIGEgbGlzdCIpKQotCQkJZ290byBEb25lOwotCQlzID0gUHlPYmplY3RfUmVwcih2LT5vYl9pdGVtW2ldKTsKLQkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlnb3RvIERvbmU7Ci0JCXN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocGllY2VzLCBzKTsKLQkJUHlfREVDUkVGKHMpOyAgLyogYXBwZW5kIGNyZWF0ZWQgYSBuZXcgcmVmICovCi0JCWlmIChzdGF0dXMgPCAwKQotCQkJZ290byBEb25lOwotCX0KKyAgICAvKiBEbyByZXByKCkgb24gZWFjaCBlbGVtZW50LiAgTm90ZSB0aGF0IHRoaXMgbWF5IG11dGF0ZSB0aGUgbGlzdCwKKyAgICAgICBzbyBtdXN0IHJlZmV0Y2ggdGhlIGxpc3Qgc2l6ZSBvbiBlYWNoIGl0ZXJhdGlvbi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh2KTsgKytpKSB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIGlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBnZXR0aW5nIHRoZSByZXByIG9mIGEgbGlzdCIpKQorICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICBzID0gUHlPYmplY3RfUmVwcih2LT5vYl9pdGVtW2ldKTsKKyAgICAgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIHN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocGllY2VzLCBzKTsKKyAgICAgICAgUHlfREVDUkVGKHMpOyAgLyogYXBwZW5kIGNyZWF0ZWQgYSBuZXcgcmVmICovCisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgZ290byBEb25lOworICAgIH0KIAotCS8qIEFkZCAiW10iIGRlY29yYXRpb25zIHRvIHRoZSBmaXJzdCBhbmQgbGFzdCBpdGVtcy4gKi8KLQlhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgPiAwKTsKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiWyIpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQl0ZW1wID0gUHlMaXN0X0dFVF9JVEVNKHBpZWNlcywgMCk7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0ZW1wKTsKLQlQeUxpc3RfU0VUX0lURU0ocGllY2VzLCAwLCBzKTsKLQlpZiAocyA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgLyogQWRkICJbXSIgZGVjb3JhdGlvbnMgdG8gdGhlIGZpcnN0IGFuZCBsYXN0IGl0ZW1zLiAqLworICAgIGFzc2VydChQeUxpc3RfR0VUX1NJWkUocGllY2VzKSA+IDApOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJbIik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHRlbXAgPSBQeUxpc3RfR0VUX0lURU0ocGllY2VzLCAwKTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIHRlbXApOworICAgIFB5TGlzdF9TRVRfSVRFTShwaWVjZXMsIDAsIHMpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKIAotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJdIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXRlbXAgPSBQeUxpc3RfR0VUX0lURU0ocGllY2VzLCBQeUxpc3RfR0VUX1NJWkUocGllY2VzKSAtIDEpOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmdGVtcCwgcyk7Ci0JUHlMaXN0X1NFVF9JVEVNKHBpZWNlcywgUHlMaXN0X0dFVF9TSVpFKHBpZWNlcykgLSAxLCB0ZW1wKTsKLQlpZiAodGVtcCA9PSBOVUxMKQotCQlnb3RvIERvbmU7CisgICAgcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl0iKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgdGVtcCA9IFB5TGlzdF9HRVRfSVRFTShwaWVjZXMsIFB5TGlzdF9HRVRfU0laRShwaWVjZXMpIC0gMSk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZ0ZW1wLCBzKTsKKyAgICBQeUxpc3RfU0VUX0lURU0ocGllY2VzLCBQeUxpc3RfR0VUX1NJWkUocGllY2VzKSAtIDEsIHRlbXApOworICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIGdvdG8gRG9uZTsKIAotCS8qIFBhc3RlIHRoZW0gYWxsIHRvZ2V0aGVyIHdpdGggIiwgIiBiZXR3ZWVuLiAqLwotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIsICIpOwotCWlmIChzID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKLQlyZXN1bHQgPSBfUHlTdHJpbmdfSm9pbihzLCBwaWVjZXMpOwotCVB5X0RFQ1JFRihzKTsKKyAgICAvKiBQYXN0ZSB0aGVtIGFsbCB0b2dldGhlciB3aXRoICIsICIgYmV0d2Vlbi4gKi8KKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgcmVzdWx0ID0gX1B5U3RyaW5nX0pvaW4ocywgcGllY2VzKTsKKyAgICBQeV9ERUNSRUYocyk7CiAKIERvbmU6Ci0JUHlfWERFQ1JFRihwaWVjZXMpOwotCVB5X1JlcHJMZWF2ZSgoUHlPYmplY3QgKil2KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYocGllY2VzKTsKKyAgICBQeV9SZXByTGVhdmUoKFB5T2JqZWN0ICopdik7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGxpc3RfbGVuZ3RoKFB5TGlzdE9iamVjdCAqYSkKIHsKLQlyZXR1cm4gUHlfU0laRShhKTsKKyAgICByZXR1cm4gUHlfU0laRShhKTsKIH0KIAogc3RhdGljIGludAogbGlzdF9jb250YWlucyhQeUxpc3RPYmplY3QgKmEsIFB5T2JqZWN0ICplbCkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IGNtcDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGNtcDsKIAotCWZvciAoaSA9IDAsIGNtcCA9IDAgOyBjbXAgPT0gMCAmJiBpIDwgUHlfU0laRShhKTsgKytpKQotCQljbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWwsIFB5TGlzdF9HRVRfSVRFTShhLCBpKSwKLQkJCQkJCSAgIFB5X0VRKTsKLQlyZXR1cm4gY21wOworICAgIGZvciAoaSA9IDAsIGNtcCA9IDAgOyBjbXAgPT0gMCAmJiBpIDwgUHlfU0laRShhKTsgKytpKQorICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWwsIFB5TGlzdF9HRVRfSVRFTShhLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9FUSk7CisgICAgcmV0dXJuIGNtcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfaXRlbShQeUxpc3RPYmplY3QgKmEsIFB5X3NzaXplX3QgaSkKIHsKLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7Ci0JCWlmIChpbmRleGVyciA9PSBOVUxMKQotCQkJaW5kZXhlcnIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAotCQkJCSJsaXN0IGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfSW5kZXhFcnJvciwgaW5kZXhlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGEtPm9iX2l0ZW1baV0pOwotCXJldHVybiBhLT5vYl9pdGVtW2ldOworICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKKyAgICAgICAgaWYgKGluZGV4ZXJyID09IE5VTEwpCisgICAgICAgICAgICBpbmRleGVyciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoCisgICAgICAgICAgICAgICAgImxpc3QgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19JbmRleEVycm9yLCBpbmRleGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoYS0+b2JfaXRlbVtpXSk7CisgICAgcmV0dXJuIGEtPm9iX2l0ZW1baV07CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X3NsaWNlKFB5TGlzdE9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoKQogewotCVB5TGlzdE9iamVjdCAqbnA7Ci0JUHlPYmplY3QgKipzcmMsICoqZGVzdDsKLQlQeV9zc2l6ZV90IGksIGxlbjsKLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQotCQlpbG93ID0gUHlfU0laRShhKTsKLQlpZiAoaWhpZ2ggPCBpbG93KQotCQlpaGlnaCA9IGlsb3c7Ci0JZWxzZSBpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQotCQlpaGlnaCA9IFB5X1NJWkUoYSk7Ci0JbGVuID0gaWhpZ2ggLSBpbG93OwotCW5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KGxlbik7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIFB5TGlzdE9iamVjdCAqbnA7CisgICAgUHlPYmplY3QgKipzcmMsICoqZGVzdDsKKyAgICBQeV9zc2l6ZV90IGksIGxlbjsKKyAgICBpZiAoaWxvdyA8IDApCisgICAgICAgIGlsb3cgPSAwOworICAgIGVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQorICAgICAgICBpbG93ID0gUHlfU0laRShhKTsKKyAgICBpZiAoaWhpZ2ggPCBpbG93KQorICAgICAgICBpaGlnaCA9IGlsb3c7CisgICAgZWxzZSBpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQorICAgICAgICBpaGlnaCA9IFB5X1NJWkUoYSk7CisgICAgbGVuID0gaWhpZ2ggLSBpbG93OworICAgIG5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KGxlbik7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc3JjID0gYS0+b2JfaXRlbSArIGlsb3c7Ci0JZGVzdCA9IG5wLT5vYl9pdGVtOwotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQlQeU9iamVjdCAqdiA9IHNyY1tpXTsKLQkJUHlfSU5DUkVGKHYpOwotCQlkZXN0W2ldID0gdjsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5wOworICAgIHNyYyA9IGEtPm9iX2l0ZW0gKyBpbG93OworICAgIGRlc3QgPSBucC0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBzcmNbaV07CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgZGVzdFtpXSA9IHY7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilucDsKIH0KIAogUHlPYmplY3QgKgogUHlMaXN0X0dldFNsaWNlKFB5T2JqZWN0ICphLCBQeV9zc2l6ZV90IGlsb3csIFB5X3NzaXplX3QgaWhpZ2gpCiB7Ci0JaWYgKCFQeUxpc3RfQ2hlY2soYSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gbGlzdF9zbGljZSgoUHlMaXN0T2JqZWN0ICopYSwgaWxvdywgaWhpZ2gpOworICAgIGlmICghUHlMaXN0X0NoZWNrKGEpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGxpc3Rfc2xpY2UoKFB5TGlzdE9iamVjdCAqKWEsIGlsb3csIGloaWdoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfY29uY2F0KFB5TGlzdE9iamVjdCAqYSwgUHlPYmplY3QgKmJiKQogewotCVB5X3NzaXplX3Qgc2l6ZTsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKipzcmMsICoqZGVzdDsKLQlQeUxpc3RPYmplY3QgKm5wOwotCWlmICghUHlMaXN0X0NoZWNrKGJiKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAiY2FuIG9ubHkgY29uY2F0ZW5hdGUgbGlzdCAobm90IFwiJS4yMDBzXCIpIHRvIGxpc3QiLAotCQkJICBiYi0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7CisgICAgUHlMaXN0T2JqZWN0ICpucDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhiYikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICJjYW4gb25seSBjb25jYXRlbmF0ZSBsaXN0IChub3QgXCIlLjIwMHNcIikgdG8gbGlzdCIsCisgICAgICAgICAgICAgICAgICBiYi0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNkZWZpbmUgYiAoKFB5TGlzdE9iamVjdCAqKWJiKQotCXNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKLQlpZiAoc2l6ZSA8IDApCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCW5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KHNpemUpOwotCWlmIChucCA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzcmMgPSBhLT5vYl9pdGVtOwotCWRlc3QgPSBucC0+b2JfaXRlbTsKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShhKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gc3JjW2ldOwotCQlQeV9JTkNSRUYodik7Ci0JCWRlc3RbaV0gPSB2OwotCX0KLQlzcmMgPSBiLT5vYl9pdGVtOwotCWRlc3QgPSBucC0+b2JfaXRlbSArIFB5X1NJWkUoYSk7Ci0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYik7IGkrKykgewotCQlQeU9iamVjdCAqdiA9IHNyY1tpXTsKLQkJUHlfSU5DUkVGKHYpOwotCQlkZXN0W2ldID0gdjsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5wOworICAgIHNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKKyAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIG5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KHNpemUpOworICAgIGlmIChucCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzcmMgPSBhLT5vYl9pdGVtOworICAgIGRlc3QgPSBucC0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShhKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gc3JjW2ldOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIGRlc3RbaV0gPSB2OworICAgIH0KKyAgICBzcmMgPSBiLT5vYl9pdGVtOworICAgIGRlc3QgPSBucC0+b2JfaXRlbSArIFB5X1NJWkUoYSk7CisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYik7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdiA9IHNyY1tpXTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBkZXN0W2ldID0gdjsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5wOwogI3VuZGVmIGIKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfcmVwZWF0KFB5TGlzdE9iamVjdCAqYSwgUHlfc3NpemVfdCBuKQogewotCVB5X3NzaXplX3QgaSwgajsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JUHlMaXN0T2JqZWN0ICpucDsKLQlQeU9iamVjdCAqKnAsICoqaXRlbXM7Ci0JUHlPYmplY3QgKmVsZW07Ci0JaWYgKG4gPCAwKQotCQluID0gMDsKLQlzaXplID0gUHlfU0laRShhKSAqIG47Ci0JaWYgKG4gJiYgc2l6ZS9uICE9IFB5X1NJWkUoYSkpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmIChzaXplID09IDApCi0JCXJldHVybiBQeUxpc3RfTmV3KDApOwotCW5wID0gKFB5TGlzdE9iamVjdCAqKSBQeUxpc3RfTmV3KHNpemUpOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5TGlzdE9iamVjdCAqbnA7CisgICAgUHlPYmplY3QgKipwLCAqKml0ZW1zOworICAgIFB5T2JqZWN0ICplbGVtOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgbiA9IDA7CisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKiBuOworICAgIGlmIChuICYmIHNpemUvbiAhPSBQeV9TSVpFKGEpKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gUHlMaXN0X05ldygwKTsKKyAgICBucCA9IChQeUxpc3RPYmplY3QgKikgUHlMaXN0X05ldyhzaXplKTsKKyAgICBpZiAobnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpdGVtcyA9IG5wLT5vYl9pdGVtOwotCWlmIChQeV9TSVpFKGEpID09IDEpIHsKLQkJZWxlbSA9IGEtPm9iX2l0ZW1bMF07Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWl0ZW1zW2ldID0gZWxlbTsKLQkJCVB5X0lOQ1JFRihlbGVtKTsKLQkJfQotCQlyZXR1cm4gKFB5T2JqZWN0ICopIG5wOwotCX0KLQlwID0gbnAtPm9iX2l0ZW07Ci0JaXRlbXMgPSBhLT5vYl9pdGVtOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IFB5X1NJWkUoYSk7IGorKykgewotCQkJKnAgPSBpdGVtc1tqXTsKLQkJCVB5X0lOQ1JFRigqcCk7Ci0JCQlwKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBucDsKKyAgICBpdGVtcyA9IG5wLT5vYl9pdGVtOworICAgIGlmIChQeV9TSVpFKGEpID09IDEpIHsKKyAgICAgICAgZWxlbSA9IGEtPm9iX2l0ZW1bMF07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGl0ZW1zW2ldID0gZWxlbTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIG5wOworICAgIH0KKyAgICBwID0gbnAtPm9iX2l0ZW07CisgICAgaXRlbXMgPSBhLT5vYl9pdGVtOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFB5X1NJWkUoYSk7IGorKykgeworICAgICAgICAgICAgKnAgPSBpdGVtc1tqXTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRigqcCk7CisgICAgICAgICAgICBwKys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBucDsKIH0KIAogc3RhdGljIGludAogbGlzdF9jbGVhcihQeUxpc3RPYmplY3QgKmEpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICoqaXRlbSA9IGEtPm9iX2l0ZW07Ci0JaWYgKGl0ZW0gIT0gTlVMTCkgewotCQkvKiBCZWNhdXNlIFhERUNSRUYgY2FuIHJlY3Vyc2l2ZWx5IGludm9rZSBvcGVyYXRpb25zIG9uCi0JCSAgIHRoaXMgbGlzdCwgd2UgbWFrZSBpdCBlbXB0eSBmaXJzdC4gKi8KLQkJaSA9IFB5X1NJWkUoYSk7Ci0JCVB5X1NJWkUoYSkgPSAwOwotCQlhLT5vYl9pdGVtID0gTlVMTDsKLQkJYS0+YWxsb2NhdGVkID0gMDsKLQkJd2hpbGUgKC0taSA+PSAwKSB7Ci0JCQlQeV9YREVDUkVGKGl0ZW1baV0pOwotCQl9Ci0JCVB5TWVtX0ZSRUUoaXRlbSk7Ci0JfQotCS8qIE5ldmVyIGZhaWxzOyB0aGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBpZ25vcmVkLgotCSAgIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgbGlzdCBpcyBhY3R1YWxseSBlbXB0eQotCSAgIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2UgWERFQ1JFRiBtYXkgaGF2ZSBwb3B1bGF0ZWQgaXQgYWdhaW4hICovCi0JcmV0dXJuIDA7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICoqaXRlbSA9IGEtPm9iX2l0ZW07CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgeworICAgICAgICAvKiBCZWNhdXNlIFhERUNSRUYgY2FuIHJlY3Vyc2l2ZWx5IGludm9rZSBvcGVyYXRpb25zIG9uCisgICAgICAgICAgIHRoaXMgbGlzdCwgd2UgbWFrZSBpdCBlbXB0eSBmaXJzdC4gKi8KKyAgICAgICAgaSA9IFB5X1NJWkUoYSk7CisgICAgICAgIFB5X1NJWkUoYSkgPSAwOworICAgICAgICBhLT5vYl9pdGVtID0gTlVMTDsKKyAgICAgICAgYS0+YWxsb2NhdGVkID0gMDsKKyAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGl0ZW1baV0pOworICAgICAgICB9CisgICAgICAgIFB5TWVtX0ZSRUUoaXRlbSk7CisgICAgfQorICAgIC8qIE5ldmVyIGZhaWxzOyB0aGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBpZ25vcmVkLgorICAgICAgIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgbGlzdCBpcyBhY3R1YWxseSBlbXB0eQorICAgICAgIGF0IHRoaXMgcG9pbnQsIGJlY2F1c2UgWERFQ1JFRiBtYXkgaGF2ZSBwb3B1bGF0ZWQgaXQgYWdhaW4hICovCisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIGFbaWxvdzppaGlnaF0gPSB2IGlmIHYgIT0gTlVMTC4KQEAgLTYwNywzNjggKzYwNywzNjggQEAKIHN0YXRpYyBpbnQKIGxpc3RfYXNzX3NsaWNlKFB5TGlzdE9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoLCBQeU9iamVjdCAqdikKIHsKLQkvKiBCZWNhdXNlIFtYXURFQ1JFRiBjYW4gcmVjdXJzaXZlbHkgaW52b2tlIGxpc3Qgb3BlcmF0aW9ucyBvbgotCSAgIHRoaXMgbGlzdCwgd2UgbXVzdCBwb3N0cG9uZSBhbGwgW1hdREVDUkVGIGFjdGl2aXR5IHVudGlsCi0JICAgYWZ0ZXIgdGhlIGxpc3QgaXMgYmFjayBpbiBpdHMgY2Fub25pY2FsIHNoYXBlLiAgVGhlcmVmb3JlCi0JICAgd2UgbXVzdCBhbGxvY2F0ZSBhbiBhZGRpdGlvbmFsIGFycmF5LCAncmVjeWNsZScsIGludG8gd2hpY2gKLQkgICB3ZSB0ZW1wb3JhcmlseSBjb3B5IHRoZSBpdGVtcyB0aGF0IGFyZSBkZWxldGVkIGZyb20gdGhlCi0JICAgbGlzdC4gOi0oICovCi0JUHlPYmplY3QgKnJlY3ljbGVfb25fc3RhY2tbOF07Ci0JUHlPYmplY3QgKipyZWN5Y2xlID0gcmVjeWNsZV9vbl9zdGFjazsgLyogd2lsbCBhbGxvY2F0ZSBtb3JlIGlmIG5lZWRlZCAqLwotCVB5T2JqZWN0ICoqaXRlbTsKLQlQeU9iamVjdCAqKnZpdGVtID0gTlVMTDsKLQlQeU9iamVjdCAqdl9hc19TRiA9IE5VTEw7IC8qIFB5U2VxdWVuY2VfRmFzdCh2KSAqLwotCVB5X3NzaXplX3QgbjsgLyogIyBvZiBlbGVtZW50cyBpbiByZXBsYWNlbWVudCBsaXN0ICovCi0JUHlfc3NpemVfdCBub3JpZzsgLyogIyBvZiBlbGVtZW50cyBpbiBsaXN0IGdldHRpbmcgcmVwbGFjZWQgKi8KLQlQeV9zc2l6ZV90IGQ7IC8qIENoYW5nZSBpbiBzaXplICovCi0JUHlfc3NpemVfdCBrOwotCXNpemVfdCBzOwotCWludCByZXN1bHQgPSAtMTsJLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLworICAgIC8qIEJlY2F1c2UgW1hdREVDUkVGIGNhbiByZWN1cnNpdmVseSBpbnZva2UgbGlzdCBvcGVyYXRpb25zIG9uCisgICAgICAgdGhpcyBsaXN0LCB3ZSBtdXN0IHBvc3Rwb25lIGFsbCBbWF1ERUNSRUYgYWN0aXZpdHkgdW50aWwKKyAgICAgICBhZnRlciB0aGUgbGlzdCBpcyBiYWNrIGluIGl0cyBjYW5vbmljYWwgc2hhcGUuICBUaGVyZWZvcmUKKyAgICAgICB3ZSBtdXN0IGFsbG9jYXRlIGFuIGFkZGl0aW9uYWwgYXJyYXksICdyZWN5Y2xlJywgaW50byB3aGljaAorICAgICAgIHdlIHRlbXBvcmFyaWx5IGNvcHkgdGhlIGl0ZW1zIHRoYXQgYXJlIGRlbGV0ZWQgZnJvbSB0aGUKKyAgICAgICBsaXN0LiA6LSggKi8KKyAgICBQeU9iamVjdCAqcmVjeWNsZV9vbl9zdGFja1s4XTsKKyAgICBQeU9iamVjdCAqKnJlY3ljbGUgPSByZWN5Y2xlX29uX3N0YWNrOyAvKiB3aWxsIGFsbG9jYXRlIG1vcmUgaWYgbmVlZGVkICovCisgICAgUHlPYmplY3QgKippdGVtOworICAgIFB5T2JqZWN0ICoqdml0ZW0gPSBOVUxMOworICAgIFB5T2JqZWN0ICp2X2FzX1NGID0gTlVMTDsgLyogUHlTZXF1ZW5jZV9GYXN0KHYpICovCisgICAgUHlfc3NpemVfdCBuOyAvKiAjIG9mIGVsZW1lbnRzIGluIHJlcGxhY2VtZW50IGxpc3QgKi8KKyAgICBQeV9zc2l6ZV90IG5vcmlnOyAvKiAjIG9mIGVsZW1lbnRzIGluIGxpc3QgZ2V0dGluZyByZXBsYWNlZCAqLworICAgIFB5X3NzaXplX3QgZDsgLyogQ2hhbmdlIGluIHNpemUgKi8KKyAgICBQeV9zc2l6ZV90IGs7CisgICAgc2l6ZV90IHM7CisgICAgaW50IHJlc3VsdCA9IC0xOyAgICAgICAgICAgIC8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KICNkZWZpbmUgYiAoKFB5TGlzdE9iamVjdCAqKXYpCi0JaWYgKHYgPT0gTlVMTCkKLQkJbiA9IDA7Ci0JZWxzZSB7Ci0JCWlmIChhID09IGIpIHsKLQkJCS8qIFNwZWNpYWwgY2FzZSAiYVtpOmpdID0gYSIgLS0gY29weSBiIGZpcnN0ICovCi0JCQl2ID0gbGlzdF9zbGljZShiLCAwLCBQeV9TSVpFKGIpKTsKLQkJCWlmICh2ID09IE5VTEwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCXJlc3VsdCA9IGxpc3RfYXNzX3NsaWNlKGEsIGlsb3csIGloaWdoLCB2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJdl9hc19TRiA9IFB5U2VxdWVuY2VfRmFzdCh2LCAiY2FuIG9ubHkgYXNzaWduIGFuIGl0ZXJhYmxlIik7Ci0JCWlmKHZfYXNfU0YgPT0gTlVMTCkKLQkJCWdvdG8gRXJyb3I7Ci0JCW4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUodl9hc19TRik7Ci0JCXZpdGVtID0gUHlTZXF1ZW5jZV9GYXN0X0lURU1TKHZfYXNfU0YpOwotCX0KLQlpZiAoaWxvdyA8IDApCi0JCWlsb3cgPSAwOwotCWVsc2UgaWYgKGlsb3cgPiBQeV9TSVpFKGEpKQotCQlpbG93ID0gUHlfU0laRShhKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBuID0gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGEgPT0gYikgeworICAgICAgICAgICAgLyogU3BlY2lhbCBjYXNlICJhW2k6al0gPSBhIiAtLSBjb3B5IGIgZmlyc3QgKi8KKyAgICAgICAgICAgIHYgPSBsaXN0X3NsaWNlKGIsIDAsIFB5X1NJWkUoYikpOworICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gbGlzdF9hc3Nfc2xpY2UoYSwgaWxvdywgaWhpZ2gsIHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICB2X2FzX1NGID0gUHlTZXF1ZW5jZV9GYXN0KHYsICJjYW4gb25seSBhc3NpZ24gYW4gaXRlcmFibGUiKTsKKyAgICAgICAgaWYodl9hc19TRiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRSh2X2FzX1NGKTsKKyAgICAgICAgdml0ZW0gPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVModl9hc19TRik7CisgICAgfQorICAgIGlmIChpbG93IDwgMCkKKyAgICAgICAgaWxvdyA9IDA7CisgICAgZWxzZSBpZiAoaWxvdyA+IFB5X1NJWkUoYSkpCisgICAgICAgIGlsb3cgPSBQeV9TSVpFKGEpOwogCi0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWVsc2UgaWYgKGloaWdoID4gUHlfU0laRShhKSkKLQkJaWhpZ2ggPSBQeV9TSVpFKGEpOworICAgIGlmIChpaGlnaCA8IGlsb3cpCisgICAgICAgIGloaWdoID0gaWxvdzsKKyAgICBlbHNlIGlmIChpaGlnaCA+IFB5X1NJWkUoYSkpCisgICAgICAgIGloaWdoID0gUHlfU0laRShhKTsKIAotCW5vcmlnID0gaWhpZ2ggLSBpbG93OwotCWFzc2VydChub3JpZyA+PSAwKTsKLQlkID0gbiAtIG5vcmlnOwotCWlmIChQeV9TSVpFKGEpICsgZCA9PSAwKSB7Ci0JCVB5X1hERUNSRUYodl9hc19TRik7Ci0JCXJldHVybiBsaXN0X2NsZWFyKGEpOwotCX0KLQlpdGVtID0gYS0+b2JfaXRlbTsKLQkvKiByZWN5Y2xlIHRoZSBpdGVtcyB0aGF0IHdlIGFyZSBhYm91dCB0byByZW1vdmUgKi8KLQlzID0gbm9yaWcgKiBzaXplb2YoUHlPYmplY3QgKik7Ci0JaWYgKHMgPiBzaXplb2YocmVjeWNsZV9vbl9zdGFjaykpIHsKLQkJcmVjeWNsZSA9IChQeU9iamVjdCAqKilQeU1lbV9NQUxMT0Mocyk7Ci0JCWlmIChyZWN5Y2xlID09IE5VTEwpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlnb3RvIEVycm9yOwotCQl9Ci0JfQotCW1lbWNweShyZWN5Y2xlLCAmaXRlbVtpbG93XSwgcyk7CisgICAgbm9yaWcgPSBpaGlnaCAtIGlsb3c7CisgICAgYXNzZXJ0KG5vcmlnID49IDApOworICAgIGQgPSBuIC0gbm9yaWc7CisgICAgaWYgKFB5X1NJWkUoYSkgKyBkID09IDApIHsKKyAgICAgICAgUHlfWERFQ1JFRih2X2FzX1NGKTsKKyAgICAgICAgcmV0dXJuIGxpc3RfY2xlYXIoYSk7CisgICAgfQorICAgIGl0ZW0gPSBhLT5vYl9pdGVtOworICAgIC8qIHJlY3ljbGUgdGhlIGl0ZW1zIHRoYXQgd2UgYXJlIGFib3V0IHRvIHJlbW92ZSAqLworICAgIHMgPSBub3JpZyAqIHNpemVvZihQeU9iamVjdCAqKTsKKyAgICBpZiAocyA+IHNpemVvZihyZWN5Y2xlX29uX3N0YWNrKSkgeworICAgICAgICByZWN5Y2xlID0gKFB5T2JqZWN0ICoqKVB5TWVtX01BTExPQyhzKTsKKyAgICAgICAgaWYgKHJlY3ljbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVtY3B5KHJlY3ljbGUsICZpdGVtW2lsb3ddLCBzKTsKIAotCWlmIChkIDwgMCkgeyAvKiBEZWxldGUgLWQgaXRlbXMgKi8KLQkJbWVtbW92ZSgmaXRlbVtpaGlnaCtkXSwgJml0ZW1baWhpZ2hdLAotCQkJKFB5X1NJWkUoYSkgLSBpaGlnaCkqc2l6ZW9mKFB5T2JqZWN0ICopKTsKLQkJbGlzdF9yZXNpemUoYSwgUHlfU0laRShhKSArIGQpOwotCQlpdGVtID0gYS0+b2JfaXRlbTsKLQl9Ci0JZWxzZSBpZiAoZCA+IDApIHsgLyogSW5zZXJ0IGQgaXRlbXMgKi8KLQkJayA9IFB5X1NJWkUoYSk7Ci0JCWlmIChsaXN0X3Jlc2l6ZShhLCBrK2QpIDwgMCkKLQkJCWdvdG8gRXJyb3I7Ci0JCWl0ZW0gPSBhLT5vYl9pdGVtOwotCQltZW1tb3ZlKCZpdGVtW2loaWdoK2RdLCAmaXRlbVtpaGlnaF0sCi0JCQkoayAtIGloaWdoKSpzaXplb2YoUHlPYmplY3QgKikpOwotCX0KLQlmb3IgKGsgPSAwOyBrIDwgbjsgaysrLCBpbG93KyspIHsKLQkJUHlPYmplY3QgKncgPSB2aXRlbVtrXTsKLQkJUHlfWElOQ1JFRih3KTsKLQkJaXRlbVtpbG93XSA9IHc7Ci0JfQotCWZvciAoayA9IG5vcmlnIC0gMTsgayA+PSAwOyAtLWspCi0JCVB5X1hERUNSRUYocmVjeWNsZVtrXSk7Ci0JcmVzdWx0ID0gMDsKKyAgICBpZiAoZCA8IDApIHsgLyogRGVsZXRlIC1kIGl0ZW1zICovCisgICAgICAgIG1lbW1vdmUoJml0ZW1baWhpZ2grZF0sICZpdGVtW2loaWdoXSwKKyAgICAgICAgICAgIChQeV9TSVpFKGEpIC0gaWhpZ2gpKnNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgIGxpc3RfcmVzaXplKGEsIFB5X1NJWkUoYSkgKyBkKTsKKyAgICAgICAgaXRlbSA9IGEtPm9iX2l0ZW07CisgICAgfQorICAgIGVsc2UgaWYgKGQgPiAwKSB7IC8qIEluc2VydCBkIGl0ZW1zICovCisgICAgICAgIGsgPSBQeV9TSVpFKGEpOworICAgICAgICBpZiAobGlzdF9yZXNpemUoYSwgaytkKSA8IDApCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICBpdGVtID0gYS0+b2JfaXRlbTsKKyAgICAgICAgbWVtbW92ZSgmaXRlbVtpaGlnaCtkXSwgJml0ZW1baWhpZ2hdLAorICAgICAgICAgICAgKGsgLSBpaGlnaCkqc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICB9CisgICAgZm9yIChrID0gMDsgayA8IG47IGsrKywgaWxvdysrKSB7CisgICAgICAgIFB5T2JqZWN0ICp3ID0gdml0ZW1ba107CisgICAgICAgIFB5X1hJTkNSRUYodyk7CisgICAgICAgIGl0ZW1baWxvd10gPSB3OworICAgIH0KKyAgICBmb3IgKGsgPSBub3JpZyAtIDE7IGsgPj0gMDsgLS1rKQorICAgICAgICBQeV9YREVDUkVGKHJlY3ljbGVba10pOworICAgIHJlc3VsdCA9IDA7CiAgRXJyb3I6Ci0JaWYgKHJlY3ljbGUgIT0gcmVjeWNsZV9vbl9zdGFjaykKLQkJUHlNZW1fRlJFRShyZWN5Y2xlKTsKLQlQeV9YREVDUkVGKHZfYXNfU0YpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKHJlY3ljbGUgIT0gcmVjeWNsZV9vbl9zdGFjaykKKyAgICAgICAgUHlNZW1fRlJFRShyZWN5Y2xlKTsKKyAgICBQeV9YREVDUkVGKHZfYXNfU0YpOworICAgIHJldHVybiByZXN1bHQ7CiAjdW5kZWYgYgogfQogCiBpbnQKIFB5TGlzdF9TZXRTbGljZShQeU9iamVjdCAqYSwgUHlfc3NpemVfdCBpbG93LCBQeV9zc2l6ZV90IGloaWdoLCBQeU9iamVjdCAqdikKIHsKLQlpZiAoIVB5TGlzdF9DaGVjayhhKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gbGlzdF9hc3Nfc2xpY2UoKFB5TGlzdE9iamVjdCAqKWEsIGlsb3csIGloaWdoLCB2KTsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhhKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGlzdF9hc3Nfc2xpY2UoKFB5TGlzdE9iamVjdCAqKWEsIGlsb3csIGloaWdoLCB2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfaW5wbGFjZV9yZXBlYXQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IG4pCiB7Ci0JUHlPYmplY3QgKippdGVtczsKLQlQeV9zc2l6ZV90IHNpemUsIGksIGosIHA7CisgICAgUHlPYmplY3QgKippdGVtczsKKyAgICBQeV9zc2l6ZV90IHNpemUsIGksIGosIHA7CiAKIAotCXNpemUgPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7Ci0JaWYgKHNpemUgPT0gMCB8fCBuID09IDEpIHsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKLQl9CisgICAgc2l6ZSA9IFB5TGlzdF9HRVRfU0laRShzZWxmKTsKKyAgICBpZiAoc2l6ZSA9PSAwIHx8IG4gPT0gMSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgIH0KIAotCWlmIChuIDwgMSkgewotCQkodm9pZClsaXN0X2NsZWFyKHNlbGYpOwotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiAoUHlPYmplY3QgKilzZWxmOwotCX0KKyAgICBpZiAobiA8IDEpIHsKKyAgICAgICAgKHZvaWQpbGlzdF9jbGVhcihzZWxmKTsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICB9CiAKLQlpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gbikgewotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQl9CisgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAvIG4pIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQogCi0JaWYgKGxpc3RfcmVzaXplKHNlbGYsIHNpemUqbikgPT0gLTEpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBzaXplKm4pID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXAgPSBzaXplOwotCWl0ZW1zID0gc2VsZi0+b2JfaXRlbTsKLQlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7IC8qIFN0YXJ0IGNvdW50aW5nIGF0IDEsIG5vdCAwICovCi0JCWZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCVB5T2JqZWN0ICpvID0gaXRlbXNbal07Ci0JCQlQeV9JTkNSRUYobyk7Ci0JCQlpdGVtc1twKytdID0gbzsKLQkJfQotCX0KLQlQeV9JTkNSRUYoc2VsZik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgcCA9IHNpemU7CisgICAgaXRlbXMgPSBzZWxmLT5vYl9pdGVtOworICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsgLyogU3RhcnQgY291bnRpbmcgYXQgMSwgbm90IDAgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBpdGVtc1tqXTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgICAgIGl0ZW1zW3ArK10gPSBvOworICAgICAgICB9CisgICAgfQorICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KIAogc3RhdGljIGludAogbGlzdF9hc3NfaXRlbShQeUxpc3RPYmplY3QgKmEsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKm9sZF92YWx1ZTsKLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAotCQkJCSJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIGxpc3RfYXNzX3NsaWNlKGEsIGksIGkrMSwgdik7Ci0JUHlfSU5DUkVGKHYpOwotCW9sZF92YWx1ZSA9IGEtPm9iX2l0ZW1baV07Ci0JYS0+b2JfaXRlbVtpXSA9IHY7Ci0JUHlfREVDUkVGKG9sZF92YWx1ZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKm9sZF92YWx1ZTsKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gbGlzdF9hc3Nfc2xpY2UoYSwgaSwgaSsxLCB2KTsKKyAgICBQeV9JTkNSRUYodik7CisgICAgb2xkX3ZhbHVlID0gYS0+b2JfaXRlbVtpXTsKKyAgICBhLT5vYl9pdGVtW2ldID0gdjsKKyAgICBQeV9ERUNSRUYob2xkX3ZhbHVlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RpbnNlcnQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzppbnNlcnQiLCAmaSwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoaW5zMShzZWxmLCBpLCB2KSA9PSAwKQotCQlQeV9SRVRVUk5fTk9ORTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzppbnNlcnQiLCAmaSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoaW5zMShzZWxmLCBpLCB2KSA9PSAwKQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RhcHBlbmQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlpZiAoYXBwMShzZWxmLCB2KSA9PSAwKQotCQlQeV9SRVRVUk5fTk9ORTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYXBwMShzZWxmLCB2KSA9PSAwKQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RleHRlbmQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYikKIHsKLQlQeU9iamVjdCAqaXQ7ICAgICAgLyogaXRlcih2KSAqLwotCVB5X3NzaXplX3QgbTsJCSAgIC8qIHNpemUgb2Ygc2VsZiAqLwotCVB5X3NzaXplX3QgbjsJCSAgIC8qIGd1ZXNzIGZvciBzaXplIG9mIGIgKi8KLQlQeV9zc2l6ZV90IG1uOwkJICAgLyogbSArIG4gKi8KLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIFB5T2JqZWN0ICppdDsgICAgICAvKiBpdGVyKHYpICovCisgICAgUHlfc3NpemVfdCBtOyAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc2VsZiAqLworICAgIFB5X3NzaXplX3QgbjsgICAgICAgICAgICAgICAgICAvKiBndWVzcyBmb3Igc2l6ZSBvZiBiICovCisgICAgUHlfc3NpemVfdCBtbjsgICAgICAgICAgICAgICAgIC8qIG0gKyBuICovCisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKIAotCS8qIFNwZWNpYWwgY2FzZXM6Ci0JICAgMSkgbGlzdHMgYW5kIHR1cGxlcyB3aGljaCBjYW4gdXNlIFB5U2VxdWVuY2VfRmFzdCBvcHMKLQkgICAyKSBleHRlbmRpbmcgc2VsZiB0byBzZWxmIHJlcXVpcmVzIG1ha2luZyBhIGNvcHkgZmlyc3QKLQkqLwotCWlmIChQeUxpc3RfQ2hlY2tFeGFjdChiKSB8fCBQeVR1cGxlX0NoZWNrRXhhY3QoYikgfHwgKFB5T2JqZWN0ICopc2VsZiA9PSBiKSB7Ci0JCVB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7Ci0JCWIgPSBQeVNlcXVlbmNlX0Zhc3QoYiwgImFyZ3VtZW50IG11c3QgYmUgaXRlcmFibGUiKTsKLQkJaWYgKCFiKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW4gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoYik7Ci0JCWlmIChuID09IDApIHsKLQkJCS8qIHNob3J0IGNpcmN1aXQgd2hlbiBiIGlzIGVtcHR5ICovCi0JCQlQeV9ERUNSRUYoYik7Ci0JCQlQeV9SRVRVUk5fTk9ORTsKLQkJfQotCQltID0gUHlfU0laRShzZWxmKTsKLQkJaWYgKGxpc3RfcmVzaXplKHNlbGYsIG0gKyBuKSA9PSAtMSkgewotCQkJUHlfREVDUkVGKGIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJLyogbm90ZSB0aGF0IHdlIG1heSBzdGlsbCBoYXZlIHNlbGYgPT0gYiBoZXJlIGZvciB0aGUKLQkJICogc2l0dWF0aW9uIGEuZXh0ZW5kKGEpLCBidXQgdGhlIGZvbGxvd2luZyBjb2RlIHdvcmtzCi0JCSAqIGluIHRoYXQgY2FzZSB0b28uICBKdXN0IG1ha2Ugc3VyZSB0byByZXNpemUgc2VsZgotCQkgKiBiZWZvcmUgY2FsbGluZyBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMuCi0JCSAqLwotCQkvKiBwb3B1bGF0ZSB0aGUgZW5kIG9mIHNlbGYgd2l0aCBiJ3MgaXRlbXMgKi8KLQkJc3JjID0gUHlTZXF1ZW5jZV9GYXN0X0lURU1TKGIpOwotCQlkZXN0ID0gc2VsZi0+b2JfaXRlbSArIG07Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCVB5T2JqZWN0ICpvID0gc3JjW2ldOwotCQkJUHlfSU5DUkVGKG8pOwotCQkJZGVzdFtpXSA9IG87Ci0JCX0KLQkJUHlfREVDUkVGKGIpOwotCQlQeV9SRVRVUk5fTk9ORTsKLQl9CisgICAgLyogU3BlY2lhbCBjYXNlczoKKyAgICAgICAxKSBsaXN0cyBhbmQgdHVwbGVzIHdoaWNoIGNhbiB1c2UgUHlTZXF1ZW5jZV9GYXN0IG9wcworICAgICAgIDIpIGV4dGVuZGluZyBzZWxmIHRvIHNlbGYgcmVxdWlyZXMgbWFraW5nIGEgY29weSBmaXJzdAorICAgICovCisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KGIpIHx8IFB5VHVwbGVfQ2hlY2tFeGFjdChiKSB8fCAoUHlPYmplY3QgKilzZWxmID09IGIpIHsKKyAgICAgICAgUHlPYmplY3QgKipzcmMsICoqZGVzdDsKKyAgICAgICAgYiA9IFB5U2VxdWVuY2VfRmFzdChiLCAiYXJndW1lbnQgbXVzdCBiZSBpdGVyYWJsZSIpOworICAgICAgICBpZiAoIWIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShiKTsKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgLyogc2hvcnQgY2lyY3VpdCB3aGVuIGIgaXMgZW1wdHkgKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRihiKTsKKyAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgICAgICB9CisgICAgICAgIG0gPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbSArIG4pID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAvKiBub3RlIHRoYXQgd2UgbWF5IHN0aWxsIGhhdmUgc2VsZiA9PSBiIGhlcmUgZm9yIHRoZQorICAgICAgICAgKiBzaXR1YXRpb24gYS5leHRlbmQoYSksIGJ1dCB0aGUgZm9sbG93aW5nIGNvZGUgd29ya3MKKyAgICAgICAgICogaW4gdGhhdCBjYXNlIHRvby4gIEp1c3QgbWFrZSBzdXJlIHRvIHJlc2l6ZSBzZWxmCisgICAgICAgICAqIGJlZm9yZSBjYWxsaW5nIFB5U2VxdWVuY2VfRmFzdF9JVEVNUy4KKyAgICAgICAgICovCisgICAgICAgIC8qIHBvcHVsYXRlIHRoZSBlbmQgb2Ygc2VsZiB3aXRoIGIncyBpdGVtcyAqLworICAgICAgICBzcmMgPSBQeVNlcXVlbmNlX0Zhc3RfSVRFTVMoYik7CisgICAgICAgIGRlc3QgPSBzZWxmLT5vYl9pdGVtICsgbTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBzcmNbaV07CisgICAgICAgICAgICBQeV9JTkNSRUYobyk7CisgICAgICAgICAgICBkZXN0W2ldID0gbzsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoYik7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihiKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXRlcm5leHQgPSAqaXQtPm9iX3R5cGUtPnRwX2l0ZXJuZXh0OworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihiKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXRlcm5leHQgPSAqaXQtPm9iX3R5cGUtPnRwX2l0ZXJuZXh0OwogCi0JLyogR3Vlc3MgYSByZXN1bHQgbGlzdCBzaXplLiAqLwotCW4gPSBfUHlPYmplY3RfTGVuZ3RoSGludChiLCA4KTsKLQlpZiAobiA9PSAtMSkgewotCQlQeV9ERUNSRUYoaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbSA9IFB5X1NJWkUoc2VsZik7Ci0JbW4gPSBtICsgbjsKLQlpZiAobW4gPj0gbSkgewotCQkvKiBNYWtlIHJvb20uICovCi0JCWlmIChsaXN0X3Jlc2l6ZShzZWxmLCBtbikgPT0gLTEpCi0JCQlnb3RvIGVycm9yOwotCQkvKiBNYWtlIHRoZSBsaXN0IHNhbmUgYWdhaW4uICovCi0JCVB5X1NJWkUoc2VsZikgPSBtOwotCX0KLQkvKiBFbHNlIG0gKyBuIG92ZXJmbG93ZWQ7IG9uIHRoZSBjaGFuY2UgdGhhdCBuIGxpZWQsIGFuZCB0aGVyZSByZWFsbHkKLQkgKiBpcyBlbm91Z2ggcm9vbSwgaWdub3JlIGl0LiAgSWYgbiB3YXMgdGVsbGluZyB0aGUgdHJ1dGgsIHdlJ2xsCi0JICogZXZlbnR1YWxseSBydW4gb3V0IG9mIG1lbW9yeSBkdXJpbmcgdGhlIGxvb3AuCi0JICovCisgICAgLyogR3Vlc3MgYSByZXN1bHQgbGlzdCBzaXplLiAqLworICAgIG4gPSBfUHlPYmplY3RfTGVuZ3RoSGludChiLCA4KTsKKyAgICBpZiAobiA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbSA9IFB5X1NJWkUoc2VsZik7CisgICAgbW4gPSBtICsgbjsKKyAgICBpZiAobW4gPj0gbSkgeworICAgICAgICAvKiBNYWtlIHJvb20uICovCisgICAgICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBtbikgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAvKiBNYWtlIHRoZSBsaXN0IHNhbmUgYWdhaW4uICovCisgICAgICAgIFB5X1NJWkUoc2VsZikgPSBtOworICAgIH0KKyAgICAvKiBFbHNlIG0gKyBuIG92ZXJmbG93ZWQ7IG9uIHRoZSBjaGFuY2UgdGhhdCBuIGxpZWQsIGFuZCB0aGVyZSByZWFsbHkKKyAgICAgKiBpcyBlbm91Z2ggcm9vbSwgaWdub3JlIGl0LiAgSWYgbiB3YXMgdGVsbGluZyB0aGUgdHJ1dGgsIHdlJ2xsCisgICAgICogZXZlbnR1YWxseSBydW4gb3V0IG9mIG1lbW9yeSBkdXJpbmcgdGhlIGxvb3AuCisgICAgICovCiAKLQkvKiBSdW4gaXRlcmF0b3IgdG8gZXhoYXVzdGlvbi4gKi8KLQlmb3IgKDs7KSB7Ci0JCVB5T2JqZWN0ICppdGVtID0gaXRlcm5leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJCWVsc2UKLQkJCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChQeV9TSVpFKHNlbGYpIDwgc2VsZi0+YWxsb2NhdGVkKSB7Ci0JCQkvKiBzdGVhbHMgcmVmICovCi0JCQlQeUxpc3RfU0VUX0lURU0oc2VsZiwgUHlfU0laRShzZWxmKSwgaXRlbSk7Ci0JCQkrK1B5X1NJWkUoc2VsZik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgc3RhdHVzID0gYXBwMShzZWxmLCBpdGVtKTsKLQkJCVB5X0RFQ1JFRihpdGVtKTsgIC8qIGFwcGVuZCBjcmVhdGVzIGEgbmV3IHJlZiAqLwotCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCX0KKyAgICAvKiBSdW4gaXRlcmF0b3IgdG8gZXhoYXVzdGlvbi4gKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gaXRlcm5leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChQeV9TSVpFKHNlbGYpIDwgc2VsZi0+YWxsb2NhdGVkKSB7CisgICAgICAgICAgICAvKiBzdGVhbHMgcmVmICovCisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0oc2VsZiwgUHlfU0laRShzZWxmKSwgaXRlbSk7CisgICAgICAgICAgICArK1B5X1NJWkUoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gYXBwMShzZWxmLCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsgIC8qIGFwcGVuZCBjcmVhdGVzIGEgbmV3IHJlZiAqLworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIEN1dCBiYWNrIHJlc3VsdCBsaXN0IGlmIGluaXRpYWwgZ3Vlc3Mgd2FzIHRvbyBsYXJnZS4gKi8KLQlpZiAoUHlfU0laRShzZWxmKSA8IHNlbGYtPmFsbG9jYXRlZCkKLQkJbGlzdF9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSk7ICAvKiBzaHJpbmtpbmcgY2FuJ3QgZmFpbCAqLworICAgIC8qIEN1dCBiYWNrIHJlc3VsdCBsaXN0IGlmIGluaXRpYWwgZ3Vlc3Mgd2FzIHRvbyBsYXJnZS4gKi8KKyAgICBpZiAoUHlfU0laRShzZWxmKSA8IHNlbGYtPmFsbG9jYXRlZCkKKyAgICAgICAgbGlzdF9yZXNpemUoc2VsZiwgUHlfU0laRShzZWxmKSk7ICAvKiBzaHJpbmtpbmcgY2FuJ3QgZmFpbCAqLwogCi0JUHlfREVDUkVGKGl0KTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeV9ERUNSRUYoaXQpOworICAgIFB5X1JFVFVSTl9OT05FOwogCiAgIGVycm9yOgotCVB5X0RFQ1JFRihpdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlPYmplY3QgKgogX1B5TGlzdF9FeHRlbmQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYikKIHsKLQlyZXR1cm4gbGlzdGV4dGVuZChzZWxmLCBiKTsKKyAgICByZXR1cm4gbGlzdGV4dGVuZChzZWxmLCBiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RfaW5wbGFjZV9jb25jYXQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JcmVzdWx0ID0gbGlzdGV4dGVuZChzZWxmLCBvdGhlcik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gcmVzdWx0OwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5X0lOQ1JFRihzZWxmKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICByZXN1bHQgPSBsaXN0ZXh0ZW5kKHNlbGYsIG90aGVyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdHBvcChQeUxpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgaSA9IC0xOwotCVB5T2JqZWN0ICp2OwotCWludCBzdGF0dXM7CisgICAgUHlfc3NpemVfdCBpID0gLTE7CisgICAgUHlPYmplY3QgKnY7CisgICAgaW50IHN0YXR1czsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cG9wIiwgJmkpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnBvcCIsICZpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlfU0laRShzZWxmKSA9PSAwKSB7Ci0JCS8qIFNwZWNpYWwtY2FzZSBtb3N0IGNvbW1vbiBmYWlsdXJlIGNhdXNlICovCi0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAicG9wIGZyb20gZW1wdHkgbGlzdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGkgPCAwKQotCQlpICs9IFB5X1NJWkUoc2VsZik7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShzZWxmKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInBvcCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXYgPSBzZWxmLT5vYl9pdGVtW2ldOwotCWlmIChpID09IFB5X1NJWkUoc2VsZikgLSAxKSB7Ci0JCXN0YXR1cyA9IGxpc3RfcmVzaXplKHNlbGYsIFB5X1NJWkUoc2VsZikgLSAxKTsKLQkJYXNzZXJ0KHN0YXR1cyA+PSAwKTsKLQkJcmV0dXJuIHY7IC8qIGFuZCB2IG5vdyBvd25zIHRoZSByZWZlcmVuY2UgdGhlIGxpc3QgaGFkICovCi0JfQotCVB5X0lOQ1JFRih2KTsKLQlzdGF0dXMgPSBsaXN0X2Fzc19zbGljZShzZWxmLCBpLCBpKzEsIChQeU9iamVjdCAqKU5VTEwpOwotCWFzc2VydChzdGF0dXMgPj0gMCk7Ci0JLyogVXNlIHN0YXR1cywgc28gdGhhdCBpbiBhIHJlbGVhc2UgYnVpbGQgY29tcGlsZXJzIGRvbid0Ci0JICogY29tcGxhaW4gYWJvdXQgdGhlIHVudXNlZCBuYW1lLgotCSAqLwotCSh2b2lkKSBzdGF0dXM7CisgICAgaWYgKFB5X1NJWkUoc2VsZikgPT0gMCkgeworICAgICAgICAvKiBTcGVjaWFsLWNhc2UgbW9zdCBjb21tb24gZmFpbHVyZSBjYXVzZSAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInBvcCBmcm9tIGVtcHR5IGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSArPSBQeV9TSVpFKHNlbGYpOworICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoc2VsZikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJwb3AgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2ID0gc2VsZi0+b2JfaXRlbVtpXTsKKyAgICBpZiAoaSA9PSBQeV9TSVpFKHNlbGYpIC0gMSkgeworICAgICAgICBzdGF0dXMgPSBsaXN0X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpIC0gMSk7CisgICAgICAgIGFzc2VydChzdGF0dXMgPj0gMCk7CisgICAgICAgIHJldHVybiB2OyAvKiBhbmQgdiBub3cgb3ducyB0aGUgcmVmZXJlbmNlIHRoZSBsaXN0IGhhZCAqLworICAgIH0KKyAgICBQeV9JTkNSRUYodik7CisgICAgc3RhdHVzID0gbGlzdF9hc3Nfc2xpY2Uoc2VsZiwgaSwgaSsxLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBhc3NlcnQoc3RhdHVzID49IDApOworICAgIC8qIFVzZSBzdGF0dXMsIHNvIHRoYXQgaW4gYSByZWxlYXNlIGJ1aWxkIGNvbXBpbGVycyBkb24ndAorICAgICAqIGNvbXBsYWluIGFib3V0IHRoZSB1bnVzZWQgbmFtZS4KKyAgICAgKi8KKyAgICAodm9pZCkgc3RhdHVzOwogCi0JcmV0dXJuIHY7CisgICAgcmV0dXJuIHY7CiB9CiAKIC8qIFJldmVyc2UgYSBzbGljZSBvZiBhIGxpc3QgaW4gcGxhY2UsIGZyb20gbG8gdXAgdG8gKGV4Y2x1c2l2ZSkgaGkuICovCiBzdGF0aWMgdm9pZAogcmV2ZXJzZV9zbGljZShQeU9iamVjdCAqKmxvLCBQeU9iamVjdCAqKmhpKQogewotCWFzc2VydChsbyAmJiBoaSk7CisgICAgYXNzZXJ0KGxvICYmIGhpKTsKIAotCS0taGk7Ci0Jd2hpbGUgKGxvIDwgaGkpIHsKLQkJUHlPYmplY3QgKnQgPSAqbG87Ci0JCSpsbyA9ICpoaTsKLQkJKmhpID0gdDsKLQkJKytsbzsKLQkJLS1oaTsKLQl9CisgICAgLS1oaTsKKyAgICB3aGlsZSAobG8gPCBoaSkgeworICAgICAgICBQeU9iamVjdCAqdCA9ICpsbzsKKyAgICAgICAgKmxvID0gKmhpOworICAgICAgICAqaGkgPSB0OworICAgICAgICArK2xvOworICAgICAgICAtLWhpOworICAgIH0KIH0KIAogLyogTG90cyBvZiBjb2RlIGZvciBhbiBhZGFwdGl2ZSwgc3RhYmxlLCBuYXR1cmFsIG1lcmdlc29ydC4gIFRoZXJlIGFyZSBtYW55CkBAIC05ODQsMzUgKzk4NCwzNSBAQAogc3RhdGljIGludAogaXNsdChQeU9iamVjdCAqeCwgUHlPYmplY3QgKnksIFB5T2JqZWN0ICpjb21wYXJlKQogewotCVB5T2JqZWN0ICpyZXM7Ci0JUHlPYmplY3QgKmFyZ3M7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlfc3NpemVfdCBpOwogCi0JYXNzZXJ0KGNvbXBhcmUgIT0gTlVMTCk7Ci0JLyogQ2FsbCB0aGUgdXNlcidzIGNvbXBhcmlzb24gZnVuY3Rpb24gYW5kIHRyYW5zbGF0ZSB0aGUgMy13YXkKLQkgKiByZXN1bHQgaW50byB0cnVlIG9yIGZhbHNlIChvciBlcnJvcikuCi0JICovCi0JYXJncyA9IFB5VHVwbGVfTmV3KDIpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9JTkNSRUYoeCk7Ci0JUHlfSU5DUkVGKHkpOwotCVB5VHVwbGVfU0VUX0lURU0oYXJncywgMCwgeCk7Ci0JUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB5KTsKLQlyZXMgPSBQeU9iamVjdF9DYWxsKGNvbXBhcmUsIGFyZ3MsIE5VTEwpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoIVB5SW50X0NoZWNrKHJlcykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNvbXBhcmlzb24gZnVuY3Rpb24gbXVzdCByZXR1cm4gaW50LCBub3QgJS4yMDBzIiwKLQkJCSAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaSA9IFB5SW50X0FzTG9uZyhyZXMpOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBpIDwgMDsKKyAgICBhc3NlcnQoY29tcGFyZSAhPSBOVUxMKTsKKyAgICAvKiBDYWxsIHRoZSB1c2VyJ3MgY29tcGFyaXNvbiBmdW5jdGlvbiBhbmQgdHJhbnNsYXRlIHRoZSAzLXdheQorICAgICAqIHJlc3VsdCBpbnRvIHRydWUgb3IgZmFsc2UgKG9yIGVycm9yKS4KKyAgICAgKi8KKyAgICBhcmdzID0gUHlUdXBsZV9OZXcoMik7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0lOQ1JFRih4KTsKKyAgICBQeV9JTkNSRUYoeSk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCB4KTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDEsIHkpOworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoY29tcGFyZSwgYXJncywgTlVMTCk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlJbnRfQ2hlY2socmVzKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNvbXBhcmlzb24gZnVuY3Rpb24gbXVzdCByZXR1cm4gaW50LCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGkgPSBQeUludF9Bc0xvbmcocmVzKTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gaSA8IDA7CiB9CiAKIC8qIElmIENPTVBBUkUgaXMgTlVMTCwgY2FsbHMgUHlPYmplY3RfUmljaENvbXBhcmVCb29sIHdpdGggUHlfTFQsIGVsc2UgY2FsbHMKQEAgLTEwMjAsMTYgKzEwMjAsMTYgQEAKICAqIHNvcnRpbmcgZG9lcyBtYW55IGNvbXBhcmlzb25zLgogICogUmV0dXJucyAtMSBvbiBlcnJvciwgMSBpZiB4IDwgeSwgMCBpZiB4ID49IHkuCiAgKi8KLSNkZWZpbmUgSVNMVChYLCBZLCBDT01QQVJFKSAoKENPTVBBUkUpID09IE5VTEwgPwkJCVwKLQkJCSAgICAgUHlPYmplY3RfUmljaENvbXBhcmVCb29sKFgsIFksIFB5X0xUKSA6CVwKLQkJCSAgICAgaXNsdChYLCBZLCBDT01QQVJFKSkKKyNkZWZpbmUgSVNMVChYLCBZLCBDT01QQVJFKSAoKENPTVBBUkUpID09IE5VTEwgPyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgUHlPYmplY3RfUmljaENvbXBhcmVCb29sKFgsIFksIFB5X0xUKSA6ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgaXNsdChYLCBZLCBDT01QQVJFKSkKIAogLyogQ29tcGFyZSBYIHRvIFkgdmlhICI8Ii4gIEdvdG8gImZhaWwiIGlmIHRoZSBjb21wYXJpc29uIHJhaXNlcyBhbgogICAgZXJyb3IuICBFbHNlICJrIiBpcyBzZXQgdG8gdHJ1ZSBpZmYgWDxZLCBhbmQgYW4gImlmIChrKSIgYmxvY2sgaXMKICAgIHN0YXJ0ZWQuICBJdCBtYWtlcyBtb3JlIHNlbnNlIGluIGNvbnRleHQgPHdpbms+LiAgWCBhbmQgWSBhcmUgUHlPYmplY3Qqcy4KICovCiAjZGVmaW5lIElGTFQoWCwgWSkgaWYgKChrID0gSVNMVChYLCBZLCBjb21wYXJlKSkgPCAwKSBnb3RvIGZhaWw7ICBcCi0JCSAgIGlmIChrKQorICAgICAgICAgICBpZiAoaykKIAogLyogYmluYXJ5c29ydCBpcyB0aGUgYmVzdCBtZXRob2QgZm9yIHNvcnRpbmcgc21hbGwgYXJyYXlzOiBpdCBkb2VzCiAgICBmZXcgY29tcGFyZXMsIGJ1dCBjYW4gZG8gZGF0YSBtb3ZlbWVudCBxdWFkcmF0aWMgaW4gdGhlIG51bWJlciBvZgpAQCAtMTA0Niw0OCArMTA0Niw0OCBAQAogYmluYXJ5c29ydChQeU9iamVjdCAqKmxvLCBQeU9iamVjdCAqKmhpLCBQeU9iamVjdCAqKnN0YXJ0LCBQeU9iamVjdCAqY29tcGFyZSkKICAgICAgLyogY29tcGFyZSAtLSBjb21wYXJpc29uIGZ1bmN0aW9uIG9iamVjdCwgb3IgTlVMTCBmb3IgZGVmYXVsdCAqLwogewotCXJlZ2lzdGVyIFB5X3NzaXplX3QgazsKLQlyZWdpc3RlciBQeU9iamVjdCAqKmwsICoqcCwgKipyOwotCXJlZ2lzdGVyIFB5T2JqZWN0ICpwaXZvdDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGs7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKipsLCAqKnAsICoqcjsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqcGl2b3Q7CiAKLQlhc3NlcnQobG8gPD0gc3RhcnQgJiYgc3RhcnQgPD0gaGkpOwotCS8qIGFzc2VydCBbbG8sIHN0YXJ0KSBpcyBzb3J0ZWQgKi8KLQlpZiAobG8gPT0gc3RhcnQpCi0JCSsrc3RhcnQ7Ci0JZm9yICg7IHN0YXJ0IDwgaGk7ICsrc3RhcnQpIHsKLQkJLyogc2V0IGwgdG8gd2hlcmUgKnN0YXJ0IGJlbG9uZ3MgKi8KLQkJbCA9IGxvOwotCQlyID0gc3RhcnQ7Ci0JCXBpdm90ID0gKnI7Ci0JCS8qIEludmFyaWFudHM6Ci0JCSAqIHBpdm90ID49IGFsbCBpbiBbbG8sIGwpLgotCQkgKiBwaXZvdCAgPCBhbGwgaW4gW3IsIHN0YXJ0KS4KLQkJICogVGhlIHNlY29uZCBpcyB2YWN1b3VzbHkgdHJ1ZSBhdCB0aGUgc3RhcnQuCi0JCSAqLwotCQlhc3NlcnQobCA8IHIpOwotCQlkbyB7Ci0JCQlwID0gbCArICgociAtIGwpID4+IDEpOwotCQkJSUZMVChwaXZvdCwgKnApCi0JCQkJciA9IHA7Ci0JCQllbHNlCi0JCQkJbCA9IHArMTsKLQkJfSB3aGlsZSAobCA8IHIpOwotCQlhc3NlcnQobCA9PSByKTsKLQkJLyogVGhlIGludmFyaWFudHMgc3RpbGwgaG9sZCwgc28gcGl2b3QgPj0gYWxsIGluIFtsbywgbCkgYW5kCi0JCSAgIHBpdm90IDwgYWxsIGluIFtsLCBzdGFydCksIHNvIHBpdm90IGJlbG9uZ3MgYXQgbC4gIE5vdGUKLQkJICAgdGhhdCBpZiB0aGVyZSBhcmUgZWxlbWVudHMgZXF1YWwgdG8gcGl2b3QsIGwgcG9pbnRzIHRvIHRoZQotCQkgICBmaXJzdCBzbG90IGFmdGVyIHRoZW0gLS0gdGhhdCdzIHdoeSB0aGlzIHNvcnQgaXMgc3RhYmxlLgotCQkgICBTbGlkZSBvdmVyIHRvIG1ha2Ugcm9vbS4KLQkJICAgQ2F1dGlvbjogdXNpbmcgbWVtbW92ZSBpcyBtdWNoIHNsb3dlciB1bmRlciBNU1ZDIDU7Ci0JCSAgIHdlJ3JlIG5vdCB1c3VhbGx5IG1vdmluZyBtYW55IHNsb3RzLiAqLwotCQlmb3IgKHAgPSBzdGFydDsgcCA+IGw7IC0tcCkKLQkJCSpwID0gKihwLTEpOwotCQkqbCA9IHBpdm90OwotCX0KLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQobG8gPD0gc3RhcnQgJiYgc3RhcnQgPD0gaGkpOworICAgIC8qIGFzc2VydCBbbG8sIHN0YXJ0KSBpcyBzb3J0ZWQgKi8KKyAgICBpZiAobG8gPT0gc3RhcnQpCisgICAgICAgICsrc3RhcnQ7CisgICAgZm9yICg7IHN0YXJ0IDwgaGk7ICsrc3RhcnQpIHsKKyAgICAgICAgLyogc2V0IGwgdG8gd2hlcmUgKnN0YXJ0IGJlbG9uZ3MgKi8KKyAgICAgICAgbCA9IGxvOworICAgICAgICByID0gc3RhcnQ7CisgICAgICAgIHBpdm90ID0gKnI7CisgICAgICAgIC8qIEludmFyaWFudHM6CisgICAgICAgICAqIHBpdm90ID49IGFsbCBpbiBbbG8sIGwpLgorICAgICAgICAgKiBwaXZvdCAgPCBhbGwgaW4gW3IsIHN0YXJ0KS4KKyAgICAgICAgICogVGhlIHNlY29uZCBpcyB2YWN1b3VzbHkgdHJ1ZSBhdCB0aGUgc3RhcnQuCisgICAgICAgICAqLworICAgICAgICBhc3NlcnQobCA8IHIpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBwID0gbCArICgociAtIGwpID4+IDEpOworICAgICAgICAgICAgSUZMVChwaXZvdCwgKnApCisgICAgICAgICAgICAgICAgciA9IHA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbCA9IHArMTsKKyAgICAgICAgfSB3aGlsZSAobCA8IHIpOworICAgICAgICBhc3NlcnQobCA9PSByKTsKKyAgICAgICAgLyogVGhlIGludmFyaWFudHMgc3RpbGwgaG9sZCwgc28gcGl2b3QgPj0gYWxsIGluIFtsbywgbCkgYW5kCisgICAgICAgICAgIHBpdm90IDwgYWxsIGluIFtsLCBzdGFydCksIHNvIHBpdm90IGJlbG9uZ3MgYXQgbC4gIE5vdGUKKyAgICAgICAgICAgdGhhdCBpZiB0aGVyZSBhcmUgZWxlbWVudHMgZXF1YWwgdG8gcGl2b3QsIGwgcG9pbnRzIHRvIHRoZQorICAgICAgICAgICBmaXJzdCBzbG90IGFmdGVyIHRoZW0gLS0gdGhhdCdzIHdoeSB0aGlzIHNvcnQgaXMgc3RhYmxlLgorICAgICAgICAgICBTbGlkZSBvdmVyIHRvIG1ha2Ugcm9vbS4KKyAgICAgICAgICAgQ2F1dGlvbjogdXNpbmcgbWVtbW92ZSBpcyBtdWNoIHNsb3dlciB1bmRlciBNU1ZDIDU7CisgICAgICAgICAgIHdlJ3JlIG5vdCB1c3VhbGx5IG1vdmluZyBtYW55IHNsb3RzLiAqLworICAgICAgICBmb3IgKHAgPSBzdGFydDsgcCA+IGw7IC0tcCkKKyAgICAgICAgICAgICpwID0gKihwLTEpOworICAgICAgICAqbCA9IHBpdm90OworICAgIH0KKyAgICByZXR1cm4gMDsKIAogIGZhaWw6Ci0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAogLyoKQEAgLTExMTEsMzUgKzExMTEsMzUgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBjb3VudF9ydW4oUHlPYmplY3QgKipsbywgUHlPYmplY3QgKipoaSwgUHlPYmplY3QgKmNvbXBhcmUsIGludCAqZGVzY2VuZGluZykKIHsKLQlQeV9zc2l6ZV90IGs7Ci0JUHlfc3NpemVfdCBuOworICAgIFB5X3NzaXplX3QgazsKKyAgICBQeV9zc2l6ZV90IG47CiAKLQlhc3NlcnQobG8gPCBoaSk7Ci0JKmRlc2NlbmRpbmcgPSAwOwotCSsrbG87Ci0JaWYgKGxvID09IGhpKQotCQlyZXR1cm4gMTsKKyAgICBhc3NlcnQobG8gPCBoaSk7CisgICAgKmRlc2NlbmRpbmcgPSAwOworICAgICsrbG87CisgICAgaWYgKGxvID09IGhpKQorICAgICAgICByZXR1cm4gMTsKIAotCW4gPSAyOwotCUlGTFQoKmxvLCAqKGxvLTEpKSB7Ci0JCSpkZXNjZW5kaW5nID0gMTsKLQkJZm9yIChsbyA9IGxvKzE7IGxvIDwgaGk7ICsrbG8sICsrbikgewotCQkJSUZMVCgqbG8sICoobG8tMSkpCi0JCQkJOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCWVsc2UgewotCQlmb3IgKGxvID0gbG8rMTsgbG8gPCBoaTsgKytsbywgKytuKSB7Ci0JCQlJRkxUKCpsbywgKihsby0xKSkKLQkJCQlicmVhazsKLQkJfQotCX0KKyAgICBuID0gMjsKKyAgICBJRkxUKCpsbywgKihsby0xKSkgeworICAgICAgICAqZGVzY2VuZGluZyA9IDE7CisgICAgICAgIGZvciAobG8gPSBsbysxOyBsbyA8IGhpOyArK2xvLCArK24pIHsKKyAgICAgICAgICAgIElGTFQoKmxvLCAqKGxvLTEpKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChsbyA9IGxvKzE7IGxvIDwgaGk7ICsrbG8sICsrbikgeworICAgICAgICAgICAgSUZMVCgqbG8sICoobG8tMSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIGZhaWw6Ci0JcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIH0KIAogLyoKQEAgLTExNjYsNzggKzExNjYsNzggQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBnYWxsb3BfbGVmdChQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqKmEsIFB5X3NzaXplX3QgbiwgUHlfc3NpemVfdCBoaW50LCBQeU9iamVjdCAqY29tcGFyZSkKIHsKLQlQeV9zc2l6ZV90IG9mczsKLQlQeV9zc2l6ZV90IGxhc3RvZnM7Ci0JUHlfc3NpemVfdCBrOworICAgIFB5X3NzaXplX3Qgb2ZzOworICAgIFB5X3NzaXplX3QgbGFzdG9mczsKKyAgICBQeV9zc2l6ZV90IGs7CiAKLQlhc3NlcnQoa2V5ICYmIGEgJiYgbiA+IDAgJiYgaGludCA+PSAwICYmIGhpbnQgPCBuKTsKKyAgICBhc3NlcnQoa2V5ICYmIGEgJiYgbiA+IDAgJiYgaGludCA+PSAwICYmIGhpbnQgPCBuKTsKIAotCWEgKz0gaGludDsKLQlsYXN0b2ZzID0gMDsKLQlvZnMgPSAxOwotCUlGTFQoKmEsIGtleSkgewotCQkvKiBhW2hpbnRdIDwga2V5IC0tIGdhbGxvcCByaWdodCwgdW50aWwKLQkJICogYVtoaW50ICsgbGFzdG9mc10gPCBrZXkgPD0gYVtoaW50ICsgb2ZzXQotCQkgKi8KLQkJY29uc3QgUHlfc3NpemVfdCBtYXhvZnMgPSBuIC0gaGludDsJLyogJmFbbi0xXSBpcyBoaWdoZXN0ICovCi0JCXdoaWxlIChvZnMgPCBtYXhvZnMpIHsKLQkJCUlGTFQoYVtvZnNdLCBrZXkpIHsKLQkJCQlsYXN0b2ZzID0gb2ZzOwotCQkJCW9mcyA9IChvZnMgPDwgMSkgKyAxOwotCQkJCWlmIChvZnMgPD0gMCkJLyogaW50IG92ZXJmbG93ICovCi0JCQkJCW9mcyA9IG1heG9mczsKLQkJCX0KLSAJCQllbHNlCS8qIGtleSA8PSBhW2hpbnQgKyBvZnNdICovCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKG9mcyA+IG1heG9mcykKLQkJCW9mcyA9IG1heG9mczsKLQkJLyogVHJhbnNsYXRlIGJhY2sgdG8gb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KLQkJbGFzdG9mcyArPSBoaW50OwotCQlvZnMgKz0gaGludDsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGtleSA8PSBhW2hpbnRdIC0tIGdhbGxvcCBsZWZ0LCB1bnRpbAotCQkgKiBhW2hpbnQgLSBvZnNdIDwga2V5IDw9IGFbaGludCAtIGxhc3RvZnNdCi0JCSAqLwotCQljb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IGhpbnQgKyAxOwkvKiAmYVswXSBpcyBsb3dlc3QgKi8KLQkJd2hpbGUgKG9mcyA8IG1heG9mcykgewotCQkJSUZMVCgqKGEtb2ZzKSwga2V5KQotCQkJCWJyZWFrOwotCQkJLyoga2V5IDw9IGFbaGludCAtIG9mc10gKi8KLQkJCWxhc3RvZnMgPSBvZnM7Ci0JCQlvZnMgPSAob2ZzIDw8IDEpICsgMTsKLQkJCWlmIChvZnMgPD0gMCkJLyogaW50IG92ZXJmbG93ICovCi0JCQkJb2ZzID0gbWF4b2ZzOwotCQl9Ci0JCWlmIChvZnMgPiBtYXhvZnMpCi0JCQlvZnMgPSBtYXhvZnM7Ci0JCS8qIFRyYW5zbGF0ZSBiYWNrIHRvIHBvc2l0aXZlIG9mZnNldHMgcmVsYXRpdmUgdG8gJmFbMF0uICovCi0JCWsgPSBsYXN0b2ZzOwotCQlsYXN0b2ZzID0gaGludCAtIG9mczsKLQkJb2ZzID0gaGludCAtIGs7Ci0JfQotCWEgLT0gaGludDsKKyAgICBhICs9IGhpbnQ7CisgICAgbGFzdG9mcyA9IDA7CisgICAgb2ZzID0gMTsKKyAgICBJRkxUKCphLCBrZXkpIHsKKyAgICAgICAgLyogYVtoaW50XSA8IGtleSAtLSBnYWxsb3AgcmlnaHQsIHVudGlsCisgICAgICAgICAqIGFbaGludCArIGxhc3RvZnNdIDwga2V5IDw9IGFbaGludCArIG9mc10KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4b2ZzID0gbiAtIGhpbnQ7ICAgICAgICAgICAgIC8qICZhW24tMV0gaXMgaGlnaGVzdCAqLworICAgICAgICB3aGlsZSAob2ZzIDwgbWF4b2ZzKSB7CisgICAgICAgICAgICBJRkxUKGFbb2ZzXSwga2V5KSB7CisgICAgICAgICAgICAgICAgbGFzdG9mcyA9IG9mczsKKyAgICAgICAgICAgICAgICBvZnMgPSAob2ZzIDw8IDEpICsgMTsKKyAgICAgICAgICAgICAgICBpZiAob2ZzIDw9IDApICAgICAgICAgICAgICAgICAgIC8qIGludCBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgICAgICBvZnMgPSBtYXhvZnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8qIGtleSA8PSBhW2hpbnQgKyBvZnNdICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mcyA+IG1heG9mcykKKyAgICAgICAgICAgIG9mcyA9IG1heG9mczsKKyAgICAgICAgLyogVHJhbnNsYXRlIGJhY2sgdG8gb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KKyAgICAgICAgbGFzdG9mcyArPSBoaW50OworICAgICAgICBvZnMgKz0gaGludDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGtleSA8PSBhW2hpbnRdIC0tIGdhbGxvcCBsZWZ0LCB1bnRpbAorICAgICAgICAgKiBhW2hpbnQgLSBvZnNdIDwga2V5IDw9IGFbaGludCAtIGxhc3RvZnNdCisgICAgICAgICAqLworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IGhpbnQgKyAxOyAgICAgICAgICAgICAvKiAmYVswXSBpcyBsb3dlc3QgKi8KKyAgICAgICAgd2hpbGUgKG9mcyA8IG1heG9mcykgeworICAgICAgICAgICAgSUZMVCgqKGEtb2ZzKSwga2V5KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyoga2V5IDw9IGFbaGludCAtIG9mc10gKi8KKyAgICAgICAgICAgIGxhc3RvZnMgPSBvZnM7CisgICAgICAgICAgICBvZnMgPSAob2ZzIDw8IDEpICsgMTsKKyAgICAgICAgICAgIGlmIChvZnMgPD0gMCkgICAgICAgICAgICAgICAvKiBpbnQgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBvZnMgPSBtYXhvZnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mcyA+IG1heG9mcykKKyAgICAgICAgICAgIG9mcyA9IG1heG9mczsKKyAgICAgICAgLyogVHJhbnNsYXRlIGJhY2sgdG8gcG9zaXRpdmUgb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KKyAgICAgICAgayA9IGxhc3RvZnM7CisgICAgICAgIGxhc3RvZnMgPSBoaW50IC0gb2ZzOworICAgICAgICBvZnMgPSBoaW50IC0gazsKKyAgICB9CisgICAgYSAtPSBoaW50OwogCi0JYXNzZXJ0KC0xIDw9IGxhc3RvZnMgJiYgbGFzdG9mcyA8IG9mcyAmJiBvZnMgPD0gbik7Ci0JLyogTm93IGFbbGFzdG9mc10gPCBrZXkgPD0gYVtvZnNdLCBzbyBrZXkgYmVsb25ncyBzb21ld2hlcmUgdG8gdGhlCi0JICogcmlnaHQgb2YgbGFzdG9mcyBidXQgbm8gZmFydGhlciByaWdodCB0aGFuIG9mcy4gIERvIGEgYmluYXJ5Ci0JICogc2VhcmNoLCB3aXRoIGludmFyaWFudCBhW2xhc3RvZnMtMV0gPCBrZXkgPD0gYVtvZnNdLgotCSAqLwotCSsrbGFzdG9mczsKLQl3aGlsZSAobGFzdG9mcyA8IG9mcykgewotCQlQeV9zc2l6ZV90IG0gPSBsYXN0b2ZzICsgKChvZnMgLSBsYXN0b2ZzKSA+PiAxKTsKKyAgICBhc3NlcnQoLTEgPD0gbGFzdG9mcyAmJiBsYXN0b2ZzIDwgb2ZzICYmIG9mcyA8PSBuKTsKKyAgICAvKiBOb3cgYVtsYXN0b2ZzXSA8IGtleSA8PSBhW29mc10sIHNvIGtleSBiZWxvbmdzIHNvbWV3aGVyZSB0byB0aGUKKyAgICAgKiByaWdodCBvZiBsYXN0b2ZzIGJ1dCBubyBmYXJ0aGVyIHJpZ2h0IHRoYW4gb2ZzLiAgRG8gYSBiaW5hcnkKKyAgICAgKiBzZWFyY2gsIHdpdGggaW52YXJpYW50IGFbbGFzdG9mcy0xXSA8IGtleSA8PSBhW29mc10uCisgICAgICovCisgICAgKytsYXN0b2ZzOworICAgIHdoaWxlIChsYXN0b2ZzIDwgb2ZzKSB7CisgICAgICAgIFB5X3NzaXplX3QgbSA9IGxhc3RvZnMgKyAoKG9mcyAtIGxhc3RvZnMpID4+IDEpOwogCi0JCUlGTFQoYVttXSwga2V5KQotCQkJbGFzdG9mcyA9IG0rMTsJLyogYVttXSA8IGtleSAqLwotCQllbHNlCi0JCQlvZnMgPSBtOwkvKiBrZXkgPD0gYVttXSAqLwotCX0KLQlhc3NlcnQobGFzdG9mcyA9PSBvZnMpOwkJLyogc28gYVtvZnMtMV0gPCBrZXkgPD0gYVtvZnNdICovCi0JcmV0dXJuIG9mczsKKyAgICAgICAgSUZMVChhW21dLCBrZXkpCisgICAgICAgICAgICBsYXN0b2ZzID0gbSsxOyAgICAgICAgICAgICAgLyogYVttXSA8IGtleSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBvZnMgPSBtOyAgICAgICAgICAgICAgICAgICAgLyoga2V5IDw9IGFbbV0gKi8KKyAgICB9CisgICAgYXNzZXJ0KGxhc3RvZnMgPT0gb2ZzKTsgICAgICAgICAgICAgLyogc28gYVtvZnMtMV0gPCBrZXkgPD0gYVtvZnNdICovCisgICAgcmV0dXJuIG9mczsKIAogZmFpbDoKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKgpAQCAtMTI1Nyw3OCArMTI1Nyw3OCBAQAogc3RhdGljIFB5X3NzaXplX3QKIGdhbGxvcF9yaWdodChQeU9iamVjdCAqa2V5LCBQeU9iamVjdCAqKmEsIFB5X3NzaXplX3QgbiwgUHlfc3NpemVfdCBoaW50LCBQeU9iamVjdCAqY29tcGFyZSkKIHsKLQlQeV9zc2l6ZV90IG9mczsKLQlQeV9zc2l6ZV90IGxhc3RvZnM7Ci0JUHlfc3NpemVfdCBrOworICAgIFB5X3NzaXplX3Qgb2ZzOworICAgIFB5X3NzaXplX3QgbGFzdG9mczsKKyAgICBQeV9zc2l6ZV90IGs7CiAKLQlhc3NlcnQoa2V5ICYmIGEgJiYgbiA+IDAgJiYgaGludCA+PSAwICYmIGhpbnQgPCBuKTsKKyAgICBhc3NlcnQoa2V5ICYmIGEgJiYgbiA+IDAgJiYgaGludCA+PSAwICYmIGhpbnQgPCBuKTsKIAotCWEgKz0gaGludDsKLQlsYXN0b2ZzID0gMDsKLQlvZnMgPSAxOwotCUlGTFQoa2V5LCAqYSkgewotCQkvKiBrZXkgPCBhW2hpbnRdIC0tIGdhbGxvcCBsZWZ0LCB1bnRpbAotCQkgKiBhW2hpbnQgLSBvZnNdIDw9IGtleSA8IGFbaGludCAtIGxhc3RvZnNdCi0JCSAqLwotCQljb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IGhpbnQgKyAxOwkvKiAmYVswXSBpcyBsb3dlc3QgKi8KLQkJd2hpbGUgKG9mcyA8IG1heG9mcykgewotCQkJSUZMVChrZXksICooYS1vZnMpKSB7Ci0JCQkJbGFzdG9mcyA9IG9mczsKLQkJCQlvZnMgPSAob2ZzIDw8IDEpICsgMTsKLQkJCQlpZiAob2ZzIDw9IDApCS8qIGludCBvdmVyZmxvdyAqLwotCQkJCQlvZnMgPSBtYXhvZnM7Ci0JCQl9Ci0JCQllbHNlCS8qIGFbaGludCAtIG9mc10gPD0ga2V5ICovCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKG9mcyA+IG1heG9mcykKLQkJCW9mcyA9IG1heG9mczsKLQkJLyogVHJhbnNsYXRlIGJhY2sgdG8gcG9zaXRpdmUgb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KLQkJayA9IGxhc3RvZnM7Ci0JCWxhc3RvZnMgPSBoaW50IC0gb2ZzOwotCQlvZnMgPSBoaW50IC0gazsKLQl9Ci0JZWxzZSB7Ci0JCS8qIGFbaGludF0gPD0ga2V5IC0tIGdhbGxvcCByaWdodCwgdW50aWwKLQkJICogYVtoaW50ICsgbGFzdG9mc10gPD0ga2V5IDwgYVtoaW50ICsgb2ZzXQotCQkqLwotCQljb25zdCBQeV9zc2l6ZV90IG1heG9mcyA9IG4gLSBoaW50OwkvKiAmYVtuLTFdIGlzIGhpZ2hlc3QgKi8KLQkJd2hpbGUgKG9mcyA8IG1heG9mcykgewotCQkJSUZMVChrZXksIGFbb2ZzXSkKLQkJCQlicmVhazsKLQkJCS8qIGFbaGludCArIG9mc10gPD0ga2V5ICovCi0JCQlsYXN0b2ZzID0gb2ZzOwotCQkJb2ZzID0gKG9mcyA8PCAxKSArIDE7Ci0JCQlpZiAob2ZzIDw9IDApCS8qIGludCBvdmVyZmxvdyAqLwotCQkJCW9mcyA9IG1heG9mczsKLQkJfQotCQlpZiAob2ZzID4gbWF4b2ZzKQotCQkJb2ZzID0gbWF4b2ZzOwotCQkvKiBUcmFuc2xhdGUgYmFjayB0byBvZmZzZXRzIHJlbGF0aXZlIHRvICZhWzBdLiAqLwotCQlsYXN0b2ZzICs9IGhpbnQ7Ci0JCW9mcyArPSBoaW50OwotCX0KLQlhIC09IGhpbnQ7CisgICAgYSArPSBoaW50OworICAgIGxhc3RvZnMgPSAwOworICAgIG9mcyA9IDE7CisgICAgSUZMVChrZXksICphKSB7CisgICAgICAgIC8qIGtleSA8IGFbaGludF0gLS0gZ2FsbG9wIGxlZnQsIHVudGlsCisgICAgICAgICAqIGFbaGludCAtIG9mc10gPD0ga2V5IDwgYVtoaW50IC0gbGFzdG9mc10KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4b2ZzID0gaGludCArIDE7ICAgICAgICAgICAgIC8qICZhWzBdIGlzIGxvd2VzdCAqLworICAgICAgICB3aGlsZSAob2ZzIDwgbWF4b2ZzKSB7CisgICAgICAgICAgICBJRkxUKGtleSwgKihhLW9mcykpIHsKKyAgICAgICAgICAgICAgICBsYXN0b2ZzID0gb2ZzOworICAgICAgICAgICAgICAgIG9mcyA9IChvZnMgPDwgMSkgKyAxOworICAgICAgICAgICAgICAgIGlmIChvZnMgPD0gMCkgICAgICAgICAgICAgICAgICAgLyogaW50IG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgICAgIG9mcyA9IG1heG9mczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgLyogYVtoaW50IC0gb2ZzXSA8PSBrZXkgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAob2ZzID4gbWF4b2ZzKQorICAgICAgICAgICAgb2ZzID0gbWF4b2ZzOworICAgICAgICAvKiBUcmFuc2xhdGUgYmFjayB0byBwb3NpdGl2ZSBvZmZzZXRzIHJlbGF0aXZlIHRvICZhWzBdLiAqLworICAgICAgICBrID0gbGFzdG9mczsKKyAgICAgICAgbGFzdG9mcyA9IGhpbnQgLSBvZnM7CisgICAgICAgIG9mcyA9IGhpbnQgLSBrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogYVtoaW50XSA8PSBrZXkgLS0gZ2FsbG9wIHJpZ2h0LCB1bnRpbAorICAgICAgICAgKiBhW2hpbnQgKyBsYXN0b2ZzXSA8PSBrZXkgPCBhW2hpbnQgKyBvZnNdCisgICAgICAgICovCisgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4b2ZzID0gbiAtIGhpbnQ7ICAgICAgICAgICAgIC8qICZhW24tMV0gaXMgaGlnaGVzdCAqLworICAgICAgICB3aGlsZSAob2ZzIDwgbWF4b2ZzKSB7CisgICAgICAgICAgICBJRkxUKGtleSwgYVtvZnNdKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogYVtoaW50ICsgb2ZzXSA8PSBrZXkgKi8KKyAgICAgICAgICAgIGxhc3RvZnMgPSBvZnM7CisgICAgICAgICAgICBvZnMgPSAob2ZzIDw8IDEpICsgMTsKKyAgICAgICAgICAgIGlmIChvZnMgPD0gMCkgICAgICAgICAgICAgICAvKiBpbnQgb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBvZnMgPSBtYXhvZnM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mcyA+IG1heG9mcykKKyAgICAgICAgICAgIG9mcyA9IG1heG9mczsKKyAgICAgICAgLyogVHJhbnNsYXRlIGJhY2sgdG8gb2Zmc2V0cyByZWxhdGl2ZSB0byAmYVswXS4gKi8KKyAgICAgICAgbGFzdG9mcyArPSBoaW50OworICAgICAgICBvZnMgKz0gaGludDsKKyAgICB9CisgICAgYSAtPSBoaW50OwogCi0JYXNzZXJ0KC0xIDw9IGxhc3RvZnMgJiYgbGFzdG9mcyA8IG9mcyAmJiBvZnMgPD0gbik7Ci0JLyogTm93IGFbbGFzdG9mc10gPD0ga2V5IDwgYVtvZnNdLCBzbyBrZXkgYmVsb25ncyBzb21ld2hlcmUgdG8gdGhlCi0JICogcmlnaHQgb2YgbGFzdG9mcyBidXQgbm8gZmFydGhlciByaWdodCB0aGFuIG9mcy4gIERvIGEgYmluYXJ5Ci0JICogc2VhcmNoLCB3aXRoIGludmFyaWFudCBhW2xhc3RvZnMtMV0gPD0ga2V5IDwgYVtvZnNdLgotCSAqLwotCSsrbGFzdG9mczsKLQl3aGlsZSAobGFzdG9mcyA8IG9mcykgewotCQlQeV9zc2l6ZV90IG0gPSBsYXN0b2ZzICsgKChvZnMgLSBsYXN0b2ZzKSA+PiAxKTsKKyAgICBhc3NlcnQoLTEgPD0gbGFzdG9mcyAmJiBsYXN0b2ZzIDwgb2ZzICYmIG9mcyA8PSBuKTsKKyAgICAvKiBOb3cgYVtsYXN0b2ZzXSA8PSBrZXkgPCBhW29mc10sIHNvIGtleSBiZWxvbmdzIHNvbWV3aGVyZSB0byB0aGUKKyAgICAgKiByaWdodCBvZiBsYXN0b2ZzIGJ1dCBubyBmYXJ0aGVyIHJpZ2h0IHRoYW4gb2ZzLiAgRG8gYSBiaW5hcnkKKyAgICAgKiBzZWFyY2gsIHdpdGggaW52YXJpYW50IGFbbGFzdG9mcy0xXSA8PSBrZXkgPCBhW29mc10uCisgICAgICovCisgICAgKytsYXN0b2ZzOworICAgIHdoaWxlIChsYXN0b2ZzIDwgb2ZzKSB7CisgICAgICAgIFB5X3NzaXplX3QgbSA9IGxhc3RvZnMgKyAoKG9mcyAtIGxhc3RvZnMpID4+IDEpOwogCi0JCUlGTFQoa2V5LCBhW21dKQotCQkJb2ZzID0gbTsJLyoga2V5IDwgYVttXSAqLwotCQllbHNlCi0JCQlsYXN0b2ZzID0gbSsxOwkvKiBhW21dIDw9IGtleSAqLwotCX0KLQlhc3NlcnQobGFzdG9mcyA9PSBvZnMpOwkJLyogc28gYVtvZnMtMV0gPD0ga2V5IDwgYVtvZnNdICovCi0JcmV0dXJuIG9mczsKKyAgICAgICAgSUZMVChrZXksIGFbbV0pCisgICAgICAgICAgICBvZnMgPSBtOyAgICAgICAgICAgICAgICAgICAgLyoga2V5IDwgYVttXSAqLworICAgICAgICBlbHNlCisgICAgICAgICAgICBsYXN0b2ZzID0gbSsxOyAgICAgICAgICAgICAgLyogYVttXSA8PSBrZXkgKi8KKyAgICB9CisgICAgYXNzZXJ0KGxhc3RvZnMgPT0gb2ZzKTsgICAgICAgICAgICAgLyogc28gYVtvZnMtMV0gPD0ga2V5IDwgYVtvZnNdICovCisgICAgcmV0dXJuIG9mczsKIAogZmFpbDoKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyBpbiBhIE1lcmdlU3RhdGUncyBwZW5kaW5nLXJ1bnMgc3RhY2suCkBAIC0xMzUxLDUyICsxMzUxLDUyIEBACiAgKiBhIGNvbnZlbmllbnQgd2F5IHRvIHBhc3Mgc3RhdGUgYXJvdW5kIGFtb25nIHRoZSBoZWxwZXIgZnVuY3Rpb25zLgogICovCiBzdHJ1Y3Qgc19zbGljZSB7Ci0JUHlPYmplY3QgKipiYXNlOwotCVB5X3NzaXplX3QgbGVuOworICAgIFB5T2JqZWN0ICoqYmFzZTsKKyAgICBQeV9zc2l6ZV90IGxlbjsKIH07CiAKIHR5cGVkZWYgc3RydWN0IHNfTWVyZ2VTdGF0ZSB7Ci0JLyogVGhlIHVzZXItc3VwcGxpZWQgY29tcGFyaXNvbiBmdW5jdGlvbi4gb3IgTlVMTCBpZiBub25lIGdpdmVuLiAqLwotCVB5T2JqZWN0ICpjb21wYXJlOworICAgIC8qIFRoZSB1c2VyLXN1cHBsaWVkIGNvbXBhcmlzb24gZnVuY3Rpb24uIG9yIE5VTEwgaWYgbm9uZSBnaXZlbi4gKi8KKyAgICBQeU9iamVjdCAqY29tcGFyZTsKIAotCS8qIFRoaXMgY29udHJvbHMgd2hlbiB3ZSBnZXQgKmludG8qIGdhbGxvcGluZyBtb2RlLiAgSXQncyBpbml0aWFsaXplZAotCSAqIHRvIE1JTl9HQUxMT1AuICBtZXJnZV9sbyBhbmQgbWVyZ2VfaGkgdGVuZCB0byBudWRnZSBpdCBoaWdoZXIgZm9yCi0JICogcmFuZG9tIGRhdGEsIGFuZCBsb3dlciBmb3IgaGlnaGx5IHN0cnVjdHVyZWQgZGF0YS4KLQkgKi8KLQlQeV9zc2l6ZV90IG1pbl9nYWxsb3A7CisgICAgLyogVGhpcyBjb250cm9scyB3aGVuIHdlIGdldCAqaW50byogZ2FsbG9waW5nIG1vZGUuICBJdCdzIGluaXRpYWxpemVkCisgICAgICogdG8gTUlOX0dBTExPUC4gIG1lcmdlX2xvIGFuZCBtZXJnZV9oaSB0ZW5kIHRvIG51ZGdlIGl0IGhpZ2hlciBmb3IKKyAgICAgKiByYW5kb20gZGF0YSwgYW5kIGxvd2VyIGZvciBoaWdobHkgc3RydWN0dXJlZCBkYXRhLgorICAgICAqLworICAgIFB5X3NzaXplX3QgbWluX2dhbGxvcDsKIAotCS8qICdhJyBpcyB0ZW1wIHN0b3JhZ2UgdG8gaGVscCB3aXRoIG1lcmdlcy4gIEl0IGNvbnRhaW5zIHJvb20gZm9yCi0JICogYWxsb2NlZCBlbnRyaWVzLgotCSAqLwotCVB5T2JqZWN0ICoqYTsJLyogbWF5IHBvaW50IHRvIHRlbXBhcnJheSBiZWxvdyAqLwotCVB5X3NzaXplX3QgYWxsb2NlZDsKKyAgICAvKiAnYScgaXMgdGVtcCBzdG9yYWdlIHRvIGhlbHAgd2l0aCBtZXJnZXMuICBJdCBjb250YWlucyByb29tIGZvcgorICAgICAqIGFsbG9jZWQgZW50cmllcy4KKyAgICAgKi8KKyAgICBQeU9iamVjdCAqKmE7ICAgICAgIC8qIG1heSBwb2ludCB0byB0ZW1wYXJyYXkgYmVsb3cgKi8KKyAgICBQeV9zc2l6ZV90IGFsbG9jZWQ7CiAKLQkvKiBBIHN0YWNrIG9mIG4gcGVuZGluZyBydW5zIHlldCB0byBiZSBtZXJnZWQuICBSdW4gI2kgc3RhcnRzIGF0Ci0JICogYWRkcmVzcyBiYXNlW2ldIGFuZCBleHRlbmRzIGZvciBsZW5baV0gZWxlbWVudHMuICBJdCdzIGFsd2F5cwotCSAqIHRydWUgKHNvIGxvbmcgYXMgdGhlIGluZGljZXMgYXJlIGluIGJvdW5kcykgdGhhdAotCSAqCi0JICogICAgIHBlbmRpbmdbaV0uYmFzZSArIHBlbmRpbmdbaV0ubGVuID09IHBlbmRpbmdbaSsxXS5iYXNlCi0JICoKLQkgKiBzbyB3ZSBjb3VsZCBjdXQgdGhlIHN0b3JhZ2UgZm9yIHRoaXMsIGJ1dCBpdCdzIGEgbWlub3IgYW1vdW50LAotCSAqIGFuZCBrZWVwaW5nIGFsbCB0aGUgaW5mbyBleHBsaWNpdCBzaW1wbGlmaWVzIHRoZSBjb2RlLgotCSAqLwotCWludCBuOwotCXN0cnVjdCBzX3NsaWNlIHBlbmRpbmdbTUFYX01FUkdFX1BFTkRJTkddOworICAgIC8qIEEgc3RhY2sgb2YgbiBwZW5kaW5nIHJ1bnMgeWV0IHRvIGJlIG1lcmdlZC4gIFJ1biAjaSBzdGFydHMgYXQKKyAgICAgKiBhZGRyZXNzIGJhc2VbaV0gYW5kIGV4dGVuZHMgZm9yIGxlbltpXSBlbGVtZW50cy4gIEl0J3MgYWx3YXlzCisgICAgICogdHJ1ZSAoc28gbG9uZyBhcyB0aGUgaW5kaWNlcyBhcmUgaW4gYm91bmRzKSB0aGF0CisgICAgICoKKyAgICAgKiAgICAgcGVuZGluZ1tpXS5iYXNlICsgcGVuZGluZ1tpXS5sZW4gPT0gcGVuZGluZ1tpKzFdLmJhc2UKKyAgICAgKgorICAgICAqIHNvIHdlIGNvdWxkIGN1dCB0aGUgc3RvcmFnZSBmb3IgdGhpcywgYnV0IGl0J3MgYSBtaW5vciBhbW91bnQsCisgICAgICogYW5kIGtlZXBpbmcgYWxsIHRoZSBpbmZvIGV4cGxpY2l0IHNpbXBsaWZpZXMgdGhlIGNvZGUuCisgICAgICovCisgICAgaW50IG47CisgICAgc3RydWN0IHNfc2xpY2UgcGVuZGluZ1tNQVhfTUVSR0VfUEVORElOR107CiAKLQkvKiAnYScgcG9pbnRzIHRvIHRoaXMgd2hlbiBwb3NzaWJsZSwgcmF0aGVyIHRoYW4gbXVjayB3aXRoIG1hbGxvYy4gKi8KLQlQeU9iamVjdCAqdGVtcGFycmF5W01FUkdFU1RBVEVfVEVNUF9TSVpFXTsKKyAgICAvKiAnYScgcG9pbnRzIHRvIHRoaXMgd2hlbiBwb3NzaWJsZSwgcmF0aGVyIHRoYW4gbXVjayB3aXRoIG1hbGxvYy4gKi8KKyAgICBQeU9iamVjdCAqdGVtcGFycmF5W01FUkdFU1RBVEVfVEVNUF9TSVpFXTsKIH0gTWVyZ2VTdGF0ZTsKIAogLyogQ29uY2VwdHVhbGx5IGEgTWVyZ2VTdGF0ZSdzIGNvbnN0cnVjdG9yLiAqLwogc3RhdGljIHZvaWQKIG1lcmdlX2luaXQoTWVyZ2VTdGF0ZSAqbXMsIFB5T2JqZWN0ICpjb21wYXJlKQogewotCWFzc2VydChtcyAhPSBOVUxMKTsKLQltcy0+Y29tcGFyZSA9IGNvbXBhcmU7Ci0JbXMtPmEgPSBtcy0+dGVtcGFycmF5OwotCW1zLT5hbGxvY2VkID0gTUVSR0VTVEFURV9URU1QX1NJWkU7Ci0JbXMtPm4gPSAwOwotCW1zLT5taW5fZ2FsbG9wID0gTUlOX0dBTExPUDsKKyAgICBhc3NlcnQobXMgIT0gTlVMTCk7CisgICAgbXMtPmNvbXBhcmUgPSBjb21wYXJlOworICAgIG1zLT5hID0gbXMtPnRlbXBhcnJheTsKKyAgICBtcy0+YWxsb2NlZCA9IE1FUkdFU1RBVEVfVEVNUF9TSVpFOworICAgIG1zLT5uID0gMDsKKyAgICBtcy0+bWluX2dhbGxvcCA9IE1JTl9HQUxMT1A7CiB9CiAKIC8qIEZyZWUgYWxsIHRoZSB0ZW1wIG1lbW9yeSBvd25lZCBieSB0aGUgTWVyZ2VTdGF0ZS4gIFRoaXMgbXVzdCBiZSBjYWxsZWQKQEAgLTE0MDYsMTEgKzE0MDYsMTEgQEAKIHN0YXRpYyB2b2lkCiBtZXJnZV9mcmVlbWVtKE1lcmdlU3RhdGUgKm1zKQogewotCWFzc2VydChtcyAhPSBOVUxMKTsKLQlpZiAobXMtPmEgIT0gbXMtPnRlbXBhcnJheSkKLQkJUHlNZW1fRnJlZShtcy0+YSk7Ci0JbXMtPmEgPSBtcy0+dGVtcGFycmF5OwotCW1zLT5hbGxvY2VkID0gTUVSR0VTVEFURV9URU1QX1NJWkU7CisgICAgYXNzZXJ0KG1zICE9IE5VTEwpOworICAgIGlmIChtcy0+YSAhPSBtcy0+dGVtcGFycmF5KQorICAgICAgICBQeU1lbV9GcmVlKG1zLT5hKTsKKyAgICBtcy0+YSA9IG1zLT50ZW1wYXJyYXk7CisgICAgbXMtPmFsbG9jZWQgPSBNRVJHRVNUQVRFX1RFTVBfU0laRTsKIH0KIAogLyogRW5zdXJlIGVub3VnaCB0ZW1wIG1lbW9yeSBmb3IgJ25lZWQnIGFycmF5IHNsb3RzIGlzIGF2YWlsYWJsZS4KQEAgLTE0MTksMjggKzE0MTksMjggQEAKIHN0YXRpYyBpbnQKIG1lcmdlX2dldG1lbShNZXJnZVN0YXRlICptcywgUHlfc3NpemVfdCBuZWVkKQogewotCWFzc2VydChtcyAhPSBOVUxMKTsKLQlpZiAobmVlZCA8PSBtcy0+YWxsb2NlZCkKLQkJcmV0dXJuIDA7Ci0JLyogRG9uJ3QgcmVhbGxvYyEgIFRoYXQgY2FuIGNvc3QgY3ljbGVzIHRvIGNvcHkgdGhlIG9sZCBkYXRhLCBidXQKLQkgKiB3ZSBkb24ndCBjYXJlIHdoYXQncyBpbiB0aGUgYmxvY2suCi0JICovCi0JbWVyZ2VfZnJlZW1lbShtcyk7Ci0JaWYgKChzaXplX3QpbmVlZCA+IFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKFB5T2JqZWN0KikpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQltcy0+YSA9IChQeU9iamVjdCAqKilQeU1lbV9NYWxsb2MobmVlZCAqIHNpemVvZihQeU9iamVjdCopKTsKLQlpZiAobXMtPmEpIHsKLQkJbXMtPmFsbG9jZWQgPSBuZWVkOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlFcnJfTm9NZW1vcnkoKTsKLQltZXJnZV9mcmVlbWVtKG1zKTsJLyogcmVzZXQgdG8gc2FuZSBzdGF0ZSAqLwotCXJldHVybiAtMTsKKyAgICBhc3NlcnQobXMgIT0gTlVMTCk7CisgICAgaWYgKG5lZWQgPD0gbXMtPmFsbG9jZWQpCisgICAgICAgIHJldHVybiAwOworICAgIC8qIERvbid0IHJlYWxsb2MhICBUaGF0IGNhbiBjb3N0IGN5Y2xlcyB0byBjb3B5IHRoZSBvbGQgZGF0YSwgYnV0CisgICAgICogd2UgZG9uJ3QgY2FyZSB3aGF0J3MgaW4gdGhlIGJsb2NrLgorICAgICAqLworICAgIG1lcmdlX2ZyZWVtZW0obXMpOworICAgIGlmICgoc2l6ZV90KW5lZWQgPiBQWV9TU0laRV9UX01BWCAvIHNpemVvZihQeU9iamVjdCopKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbXMtPmEgPSAoUHlPYmplY3QgKiopUHlNZW1fTWFsbG9jKG5lZWQgKiBzaXplb2YoUHlPYmplY3QqKSk7CisgICAgaWYgKG1zLT5hKSB7CisgICAgICAgIG1zLT5hbGxvY2VkID0gbmVlZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgbWVyZ2VfZnJlZW1lbShtcyk7ICAgICAgICAgIC8qIHJlc2V0IHRvIHNhbmUgc3RhdGUgKi8KKyAgICByZXR1cm4gLTE7CiB9Ci0jZGVmaW5lIE1FUkdFX0dFVE1FTShNUywgTkVFRCkgKChORUVEKSA8PSAoTVMpLT5hbGxvY2VkID8gMCA6CVwKLQkJCQltZXJnZV9nZXRtZW0oTVMsIE5FRUQpKQorI2RlZmluZSBNRVJHRV9HRVRNRU0oTVMsIE5FRUQpICgoTkVFRCkgPD0gKE1TKS0+YWxsb2NlZCA/IDAgOiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VfZ2V0bWVtKE1TLCBORUVEKSkKIAogLyogTWVyZ2UgdGhlIG5hIGVsZW1lbnRzIHN0YXJ0aW5nIGF0IHBhIHdpdGggdGhlIG5iIGVsZW1lbnRzIHN0YXJ0aW5nIGF0IHBiCiAgKiBpbiBhIHN0YWJsZSB3YXksIGluLXBsYWNlLiAgbmEgYW5kIG5iIG11c3QgYmUgPiAwLCBhbmQgcGEgKyBuYSA9PSBwYi4KQEAgLTE0NTIsMTI3ICsxNDUyLDEyNyBAQAogbWVyZ2VfbG8oTWVyZ2VTdGF0ZSAqbXMsIFB5T2JqZWN0ICoqcGEsIFB5X3NzaXplX3QgbmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipwYiwgUHlfc3NpemVfdCBuYikKIHsKLQlQeV9zc2l6ZV90IGs7Ci0JUHlPYmplY3QgKmNvbXBhcmU7Ci0JUHlPYmplY3QgKipkZXN0OwotCWludCByZXN1bHQgPSAtMTsJLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLwotCVB5X3NzaXplX3QgbWluX2dhbGxvcDsKKyAgICBQeV9zc2l6ZV90IGs7CisgICAgUHlPYmplY3QgKmNvbXBhcmU7CisgICAgUHlPYmplY3QgKipkZXN0OworICAgIGludCByZXN1bHQgPSAtMTsgICAgICAgICAgICAvKiBndWlsdHkgdW50aWwgcHJvdmVkIGlubm9jZW50ICovCisgICAgUHlfc3NpemVfdCBtaW5fZ2FsbG9wOwogCi0JYXNzZXJ0KG1zICYmIHBhICYmIHBiICYmIG5hID4gMCAmJiBuYiA+IDAgJiYgcGEgKyBuYSA9PSBwYik7Ci0JaWYgKE1FUkdFX0dFVE1FTShtcywgbmEpIDwgMCkKLQkJcmV0dXJuIC0xOwotCW1lbWNweShtcy0+YSwgcGEsIG5hICogc2l6ZW9mKFB5T2JqZWN0KikpOwotCWRlc3QgPSBwYTsKLQlwYSA9IG1zLT5hOworICAgIGFzc2VydChtcyAmJiBwYSAmJiBwYiAmJiBuYSA+IDAgJiYgbmIgPiAwICYmIHBhICsgbmEgPT0gcGIpOworICAgIGlmIChNRVJHRV9HRVRNRU0obXMsIG5hKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBtZW1jcHkobXMtPmEsIHBhLCBuYSAqIHNpemVvZihQeU9iamVjdCopKTsKKyAgICBkZXN0ID0gcGE7CisgICAgcGEgPSBtcy0+YTsKIAotCSpkZXN0KysgPSAqcGIrKzsKLQktLW5iOwotCWlmIChuYiA9PSAwKQotCQlnb3RvIFN1Y2NlZWQ7Ci0JaWYgKG5hID09IDEpCi0JCWdvdG8gQ29weUI7CisgICAgKmRlc3QrKyA9ICpwYisrOworICAgIC0tbmI7CisgICAgaWYgKG5iID09IDApCisgICAgICAgIGdvdG8gU3VjY2VlZDsKKyAgICBpZiAobmEgPT0gMSkKKyAgICAgICAgZ290byBDb3B5QjsKIAotCW1pbl9nYWxsb3AgPSBtcy0+bWluX2dhbGxvcDsKLQljb21wYXJlID0gbXMtPmNvbXBhcmU7Ci0JZm9yICg7OykgewotCQlQeV9zc2l6ZV90IGFjb3VudCA9IDA7CS8qICMgb2YgdGltZXMgQSB3b24gaW4gYSByb3cgKi8KLQkJUHlfc3NpemVfdCBiY291bnQgPSAwOwkvKiAjIG9mIHRpbWVzIEIgd29uIGluIGEgcm93ICovCisgICAgbWluX2dhbGxvcCA9IG1zLT5taW5fZ2FsbG9wOworICAgIGNvbXBhcmUgPSBtcy0+Y29tcGFyZTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIFB5X3NzaXplX3QgYWNvdW50ID0gMDsgICAgICAgICAgLyogIyBvZiB0aW1lcyBBIHdvbiBpbiBhIHJvdyAqLworICAgICAgICBQeV9zc2l6ZV90IGJjb3VudCA9IDA7ICAgICAgICAgIC8qICMgb2YgdGltZXMgQiB3b24gaW4gYSByb3cgKi8KIAotCQkvKiBEbyB0aGUgc3RyYWlnaHRmb3J3YXJkIHRoaW5nIHVudGlsIChpZiBldmVyKSBvbmUgcnVuCi0JCSAqIGFwcGVhcnMgdG8gd2luIGNvbnNpc3RlbnRseS4KLQkJICovCi0gCQlmb3IgKDs7KSB7Ci0gCQkJYXNzZXJ0KG5hID4gMSAmJiBuYiA+IDApOwotCSAJCWsgPSBJU0xUKCpwYiwgKnBhLCBjb21wYXJlKTsKLQkJCWlmIChrKSB7Ci0JCQkJaWYgKGsgPCAwKQotCQkJCQlnb3RvIEZhaWw7Ci0JCQkJKmRlc3QrKyA9ICpwYisrOwotCQkJCSsrYmNvdW50OwotCQkJCWFjb3VudCA9IDA7Ci0JCQkJLS1uYjsKLQkJCQlpZiAobmIgPT0gMCkKLQkJCQkJZ290byBTdWNjZWVkOwotCQkJCWlmIChiY291bnQgPj0gbWluX2dhbGxvcCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkqZGVzdCsrID0gKnBhKys7Ci0JCQkJKythY291bnQ7Ci0JCQkJYmNvdW50ID0gMDsKLQkJCQktLW5hOwotCQkJCWlmIChuYSA9PSAxKQotCQkJCQlnb3RvIENvcHlCOwotCQkJCWlmIChhY291bnQgPj0gbWluX2dhbGxvcCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0gCQl9CisgICAgICAgIC8qIERvIHRoZSBzdHJhaWdodGZvcndhcmQgdGhpbmcgdW50aWwgKGlmIGV2ZXIpIG9uZSBydW4KKyAgICAgICAgICogYXBwZWFycyB0byB3aW4gY29uc2lzdGVudGx5LgorICAgICAgICAgKi8KKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgYXNzZXJ0KG5hID4gMSAmJiBuYiA+IDApOworICAgICAgICAgICAgayA9IElTTFQoKnBiLCAqcGEsIGNvbXBhcmUpOworICAgICAgICAgICAgaWYgKGspIHsKKyAgICAgICAgICAgICAgICBpZiAoayA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgICAgICAqZGVzdCsrID0gKnBiKys7CisgICAgICAgICAgICAgICAgKytiY291bnQ7CisgICAgICAgICAgICAgICAgYWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAtLW5iOworICAgICAgICAgICAgICAgIGlmIChuYiA9PSAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIFN1Y2NlZWQ7CisgICAgICAgICAgICAgICAgaWYgKGJjb3VudCA+PSBtaW5fZ2FsbG9wKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICpkZXN0KysgPSAqcGErKzsKKyAgICAgICAgICAgICAgICArK2Fjb3VudDsKKyAgICAgICAgICAgICAgICBiY291bnQgPSAwOworICAgICAgICAgICAgICAgIC0tbmE7CisgICAgICAgICAgICAgICAgaWYgKG5hID09IDEpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gQ29weUI7CisgICAgICAgICAgICAgICAgaWYgKGFjb3VudCA+PSBtaW5fZ2FsbG9wKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8qIE9uZSBydW4gaXMgd2lubmluZyBzbyBjb25zaXN0ZW50bHkgdGhhdCBnYWxsb3BpbmcgbWF5Ci0JCSAqIGJlIGEgaHVnZSB3aW4uICBTbyB0cnkgdGhhdCwgYW5kIGNvbnRpbnVlIGdhbGxvcGluZyB1bnRpbAotCQkgKiAoaWYgZXZlcikgbmVpdGhlciBydW4gYXBwZWFycyB0byBiZSB3aW5uaW5nIGNvbnNpc3RlbnRseQotCQkgKiBhbnltb3JlLgotCQkgKi8KLQkJKyttaW5fZ2FsbG9wOwotCQlkbyB7Ci0gCQkJYXNzZXJ0KG5hID4gMSAmJiBuYiA+IDApOwotCQkJbWluX2dhbGxvcCAtPSBtaW5fZ2FsbG9wID4gMTsKLQkgCQltcy0+bWluX2dhbGxvcCA9IG1pbl9nYWxsb3A7Ci0JCQlrID0gZ2FsbG9wX3JpZ2h0KCpwYiwgcGEsIG5hLCAwLCBjb21wYXJlKTsKLQkJCWFjb3VudCA9IGs7Ci0JCQlpZiAoaykgewotCQkJCWlmIChrIDwgMCkKLQkJCQkJZ290byBGYWlsOwotCQkJCW1lbWNweShkZXN0LCBwYSwgayAqIHNpemVvZihQeU9iamVjdCAqKSk7Ci0JCQkJZGVzdCArPSBrOwotCQkJCXBhICs9IGs7Ci0JCQkJbmEgLT0gazsKLQkJCQlpZiAobmEgPT0gMSkKLQkJCQkJZ290byBDb3B5QjsKLQkJCQkvKiBuYT09MCBpcyBpbXBvc3NpYmxlIG5vdyBpZiB0aGUgY29tcGFyaXNvbgotCQkJCSAqIGZ1bmN0aW9uIGlzIGNvbnNpc3RlbnQsIGJ1dCB3ZSBjYW4ndCBhc3N1bWUKLQkJCQkgKiB0aGF0IGl0IGlzLgotCQkJCSAqLwotCQkJCWlmIChuYSA9PSAwKQotCQkJCQlnb3RvIFN1Y2NlZWQ7Ci0JCQl9Ci0JCQkqZGVzdCsrID0gKnBiKys7Ci0JCQktLW5iOwotCQkJaWYgKG5iID09IDApCi0JCQkJZ290byBTdWNjZWVkOworICAgICAgICAvKiBPbmUgcnVuIGlzIHdpbm5pbmcgc28gY29uc2lzdGVudGx5IHRoYXQgZ2FsbG9waW5nIG1heQorICAgICAgICAgKiBiZSBhIGh1Z2Ugd2luLiAgU28gdHJ5IHRoYXQsIGFuZCBjb250aW51ZSBnYWxsb3BpbmcgdW50aWwKKyAgICAgICAgICogKGlmIGV2ZXIpIG5laXRoZXIgcnVuIGFwcGVhcnMgdG8gYmUgd2lubmluZyBjb25zaXN0ZW50bHkKKyAgICAgICAgICogYW55bW9yZS4KKyAgICAgICAgICovCisgICAgICAgICsrbWluX2dhbGxvcDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYXNzZXJ0KG5hID4gMSAmJiBuYiA+IDApOworICAgICAgICAgICAgbWluX2dhbGxvcCAtPSBtaW5fZ2FsbG9wID4gMTsKKyAgICAgICAgICAgIG1zLT5taW5fZ2FsbG9wID0gbWluX2dhbGxvcDsKKyAgICAgICAgICAgIGsgPSBnYWxsb3BfcmlnaHQoKnBiLCBwYSwgbmEsIDAsIGNvbXBhcmUpOworICAgICAgICAgICAgYWNvdW50ID0gazsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRlc3QsIHBhLCBrICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICAgICAgICAgICAgICBkZXN0ICs9IGs7CisgICAgICAgICAgICAgICAgcGEgKz0gazsKKyAgICAgICAgICAgICAgICBuYSAtPSBrOworICAgICAgICAgICAgICAgIGlmIChuYSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIENvcHlCOworICAgICAgICAgICAgICAgIC8qIG5hPT0wIGlzIGltcG9zc2libGUgbm93IGlmIHRoZSBjb21wYXJpc29uCisgICAgICAgICAgICAgICAgICogZnVuY3Rpb24gaXMgY29uc2lzdGVudCwgYnV0IHdlIGNhbid0IGFzc3VtZQorICAgICAgICAgICAgICAgICAqIHRoYXQgaXQgaXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKG5hID09IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VjY2VlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0KysgPSAqcGIrKzsKKyAgICAgICAgICAgIC0tbmI7CisgICAgICAgICAgICBpZiAobmIgPT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIFN1Y2NlZWQ7CiAKLSAJCQlrID0gZ2FsbG9wX2xlZnQoKnBhLCBwYiwgbmIsIDAsIGNvbXBhcmUpOwotIAkJCWJjb3VudCA9IGs7Ci0JCQlpZiAoaykgewotCQkJCWlmIChrIDwgMCkKLQkJCQkJZ290byBGYWlsOwotCQkJCW1lbW1vdmUoZGVzdCwgcGIsIGsgKiBzaXplb2YoUHlPYmplY3QgKikpOwotCQkJCWRlc3QgKz0gazsKLQkJCQlwYiArPSBrOwotCQkJCW5iIC09IGs7Ci0JCQkJaWYgKG5iID09IDApCi0JCQkJCWdvdG8gU3VjY2VlZDsKLQkJCX0KLQkJCSpkZXN0KysgPSAqcGErKzsKLQkJCS0tbmE7Ci0JCQlpZiAobmEgPT0gMSkKLQkJCQlnb3RvIENvcHlCOwotIAkJfSB3aGlsZSAoYWNvdW50ID49IE1JTl9HQUxMT1AgfHwgYmNvdW50ID49IE1JTl9HQUxMT1ApOwotIAkJKyttaW5fZ2FsbG9wOwkvKiBwZW5hbGl6ZSBpdCBmb3IgbGVhdmluZyBnYWxsb3BpbmcgbW9kZSAqLwotIAkJbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOwotIAl9CisgICAgICAgICAgICBrID0gZ2FsbG9wX2xlZnQoKnBhLCBwYiwgbmIsIDAsIGNvbXBhcmUpOworICAgICAgICAgICAgYmNvdW50ID0gazsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICAgICAgbWVtbW92ZShkZXN0LCBwYiwgayAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgICAgICAgICAgZGVzdCArPSBrOworICAgICAgICAgICAgICAgIHBiICs9IGs7CisgICAgICAgICAgICAgICAgbmIgLT0gazsKKyAgICAgICAgICAgICAgICBpZiAobmIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBTdWNjZWVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRlc3QrKyA9ICpwYSsrOworICAgICAgICAgICAgLS1uYTsKKyAgICAgICAgICAgIGlmIChuYSA9PSAxKQorICAgICAgICAgICAgICAgIGdvdG8gQ29weUI7CisgICAgICAgIH0gd2hpbGUgKGFjb3VudCA+PSBNSU5fR0FMTE9QIHx8IGJjb3VudCA+PSBNSU5fR0FMTE9QKTsKKyAgICAgICAgKyttaW5fZ2FsbG9wOyAgICAgICAgICAgLyogcGVuYWxpemUgaXQgZm9yIGxlYXZpbmcgZ2FsbG9waW5nIG1vZGUgKi8KKyAgICAgICAgbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOworICAgIH0KIFN1Y2NlZWQ6Ci0JcmVzdWx0ID0gMDsKKyAgICByZXN1bHQgPSAwOwogRmFpbDoKLQlpZiAobmEpCi0JCW1lbWNweShkZXN0LCBwYSwgbmEgKiBzaXplb2YoUHlPYmplY3QqKSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAobmEpCisgICAgICAgIG1lbWNweShkZXN0LCBwYSwgbmEgKiBzaXplb2YoUHlPYmplY3QqKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIENvcHlCOgotCWFzc2VydChuYSA9PSAxICYmIG5iID4gMCk7Ci0JLyogVGhlIGxhc3QgZWxlbWVudCBvZiBwYSBiZWxvbmdzIGF0IHRoZSBlbmQgb2YgdGhlIG1lcmdlLiAqLwotCW1lbW1vdmUoZGVzdCwgcGIsIG5iICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKLQlkZXN0W25iXSA9ICpwYTsKLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQobmEgPT0gMSAmJiBuYiA+IDApOworICAgIC8qIFRoZSBsYXN0IGVsZW1lbnQgb2YgcGEgYmVsb25ncyBhdCB0aGUgZW5kIG9mIHRoZSBtZXJnZS4gKi8KKyAgICBtZW1tb3ZlKGRlc3QsIHBiLCBuYiAqIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgZGVzdFtuYl0gPSAqcGE7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIE1lcmdlIHRoZSBuYSBlbGVtZW50cyBzdGFydGluZyBhdCBwYSB3aXRoIHRoZSBuYiBlbGVtZW50cyBzdGFydGluZyBhdCBwYgpAQCAtMTU4NCwxMzYgKzE1ODQsMTM2IEBACiBzdGF0aWMgUHlfc3NpemVfdAogbWVyZ2VfaGkoTWVyZ2VTdGF0ZSAqbXMsIFB5T2JqZWN0ICoqcGEsIFB5X3NzaXplX3QgbmEsIFB5T2JqZWN0ICoqcGIsIFB5X3NzaXplX3QgbmIpCiB7Ci0JUHlfc3NpemVfdCBrOwotCVB5T2JqZWN0ICpjb21wYXJlOwotCVB5T2JqZWN0ICoqZGVzdDsKLQlpbnQgcmVzdWx0ID0gLTE7CS8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KLQlQeU9iamVjdCAqKmJhc2VhOwotCVB5T2JqZWN0ICoqYmFzZWI7Ci0JUHlfc3NpemVfdCBtaW5fZ2FsbG9wOworICAgIFB5X3NzaXplX3QgazsKKyAgICBQeU9iamVjdCAqY29tcGFyZTsKKyAgICBQeU9iamVjdCAqKmRlc3Q7CisgICAgaW50IHJlc3VsdCA9IC0xOyAgICAgICAgICAgIC8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KKyAgICBQeU9iamVjdCAqKmJhc2VhOworICAgIFB5T2JqZWN0ICoqYmFzZWI7CisgICAgUHlfc3NpemVfdCBtaW5fZ2FsbG9wOwogCi0JYXNzZXJ0KG1zICYmIHBhICYmIHBiICYmIG5hID4gMCAmJiBuYiA+IDAgJiYgcGEgKyBuYSA9PSBwYik7Ci0JaWYgKE1FUkdFX0dFVE1FTShtcywgbmIpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWRlc3QgPSBwYiArIG5iIC0gMTsKLQltZW1jcHkobXMtPmEsIHBiLCBuYiAqIHNpemVvZihQeU9iamVjdCopKTsKLQliYXNlYSA9IHBhOwotCWJhc2ViID0gbXMtPmE7Ci0JcGIgPSBtcy0+YSArIG5iIC0gMTsKLQlwYSArPSBuYSAtIDE7CisgICAgYXNzZXJ0KG1zICYmIHBhICYmIHBiICYmIG5hID4gMCAmJiBuYiA+IDAgJiYgcGEgKyBuYSA9PSBwYik7CisgICAgaWYgKE1FUkdFX0dFVE1FTShtcywgbmIpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGRlc3QgPSBwYiArIG5iIC0gMTsKKyAgICBtZW1jcHkobXMtPmEsIHBiLCBuYiAqIHNpemVvZihQeU9iamVjdCopKTsKKyAgICBiYXNlYSA9IHBhOworICAgIGJhc2ViID0gbXMtPmE7CisgICAgcGIgPSBtcy0+YSArIG5iIC0gMTsKKyAgICBwYSArPSBuYSAtIDE7CiAKLQkqZGVzdC0tID0gKnBhLS07Ci0JLS1uYTsKLQlpZiAobmEgPT0gMCkKLQkJZ290byBTdWNjZWVkOwotCWlmIChuYiA9PSAxKQotCQlnb3RvIENvcHlBOworICAgICpkZXN0LS0gPSAqcGEtLTsKKyAgICAtLW5hOworICAgIGlmIChuYSA9PSAwKQorICAgICAgICBnb3RvIFN1Y2NlZWQ7CisgICAgaWYgKG5iID09IDEpCisgICAgICAgIGdvdG8gQ29weUE7CiAKLQltaW5fZ2FsbG9wID0gbXMtPm1pbl9nYWxsb3A7Ci0JY29tcGFyZSA9IG1zLT5jb21wYXJlOwotCWZvciAoOzspIHsKLQkJUHlfc3NpemVfdCBhY291bnQgPSAwOwkvKiAjIG9mIHRpbWVzIEEgd29uIGluIGEgcm93ICovCi0JCVB5X3NzaXplX3QgYmNvdW50ID0gMDsJLyogIyBvZiB0aW1lcyBCIHdvbiBpbiBhIHJvdyAqLworICAgIG1pbl9nYWxsb3AgPSBtcy0+bWluX2dhbGxvcDsKKyAgICBjb21wYXJlID0gbXMtPmNvbXBhcmU7CisgICAgZm9yICg7OykgeworICAgICAgICBQeV9zc2l6ZV90IGFjb3VudCA9IDA7ICAgICAgICAgIC8qICMgb2YgdGltZXMgQSB3b24gaW4gYSByb3cgKi8KKyAgICAgICAgUHlfc3NpemVfdCBiY291bnQgPSAwOyAgICAgICAgICAvKiAjIG9mIHRpbWVzIEIgd29uIGluIGEgcm93ICovCiAKLQkJLyogRG8gdGhlIHN0cmFpZ2h0Zm9yd2FyZCB0aGluZyB1bnRpbCAoaWYgZXZlcikgb25lIHJ1bgotCQkgKiBhcHBlYXJzIHRvIHdpbiBjb25zaXN0ZW50bHkuCi0JCSAqLwotIAkJZm9yICg7OykgewotIAkJCWFzc2VydChuYSA+IDAgJiYgbmIgPiAxKTsKLQkgCQlrID0gSVNMVCgqcGIsICpwYSwgY29tcGFyZSk7Ci0JCQlpZiAoaykgewotCQkJCWlmIChrIDwgMCkKLQkJCQkJZ290byBGYWlsOwotCQkJCSpkZXN0LS0gPSAqcGEtLTsKLQkJCQkrK2Fjb3VudDsKLQkJCQliY291bnQgPSAwOwotCQkJCS0tbmE7Ci0JCQkJaWYgKG5hID09IDApCi0JCQkJCWdvdG8gU3VjY2VlZDsKLQkJCQlpZiAoYWNvdW50ID49IG1pbl9nYWxsb3ApCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJKmRlc3QtLSA9ICpwYi0tOwotCQkJCSsrYmNvdW50OwotCQkJCWFjb3VudCA9IDA7Ci0JCQkJLS1uYjsKLQkJCQlpZiAobmIgPT0gMSkKLQkJCQkJZ290byBDb3B5QTsKLQkJCQlpZiAoYmNvdW50ID49IG1pbl9nYWxsb3ApCi0JCQkJCWJyZWFrOwotCQkJfQotIAkJfQorICAgICAgICAvKiBEbyB0aGUgc3RyYWlnaHRmb3J3YXJkIHRoaW5nIHVudGlsIChpZiBldmVyKSBvbmUgcnVuCisgICAgICAgICAqIGFwcGVhcnMgdG8gd2luIGNvbnNpc3RlbnRseS4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGFzc2VydChuYSA+IDAgJiYgbmIgPiAxKTsKKyAgICAgICAgICAgIGsgPSBJU0xUKCpwYiwgKnBhLCBjb21wYXJlKTsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICAgICAgKmRlc3QtLSA9ICpwYS0tOworICAgICAgICAgICAgICAgICsrYWNvdW50OworICAgICAgICAgICAgICAgIGJjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgLS1uYTsKKyAgICAgICAgICAgICAgICBpZiAobmEgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBTdWNjZWVkOworICAgICAgICAgICAgICAgIGlmIChhY291bnQgPj0gbWluX2dhbGxvcCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAqZGVzdC0tID0gKnBiLS07CisgICAgICAgICAgICAgICAgKytiY291bnQ7CisgICAgICAgICAgICAgICAgYWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAtLW5iOworICAgICAgICAgICAgICAgIGlmIChuYiA9PSAxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIENvcHlBOworICAgICAgICAgICAgICAgIGlmIChiY291bnQgPj0gbWluX2dhbGxvcCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBPbmUgcnVuIGlzIHdpbm5pbmcgc28gY29uc2lzdGVudGx5IHRoYXQgZ2FsbG9waW5nIG1heQotCQkgKiBiZSBhIGh1Z2Ugd2luLiAgU28gdHJ5IHRoYXQsIGFuZCBjb250aW51ZSBnYWxsb3BpbmcgdW50aWwKLQkJICogKGlmIGV2ZXIpIG5laXRoZXIgcnVuIGFwcGVhcnMgdG8gYmUgd2lubmluZyBjb25zaXN0ZW50bHkKLQkJICogYW55bW9yZS4KLQkJICovCi0JCSsrbWluX2dhbGxvcDsKLQkJZG8gewotIAkJCWFzc2VydChuYSA+IDAgJiYgbmIgPiAxKTsKLQkJCW1pbl9nYWxsb3AgLT0gbWluX2dhbGxvcCA+IDE7Ci0JIAkJbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOwotCQkJayA9IGdhbGxvcF9yaWdodCgqcGIsIGJhc2VhLCBuYSwgbmEtMSwgY29tcGFyZSk7Ci0JCQlpZiAoayA8IDApCi0JCQkJZ290byBGYWlsOwotCQkJayA9IG5hIC0gazsKLQkJCWFjb3VudCA9IGs7Ci0JCQlpZiAoaykgewotCQkJCWRlc3QgLT0gazsKLQkJCQlwYSAtPSBrOwotCQkJCW1lbW1vdmUoZGVzdCsxLCBwYSsxLCBrICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKLQkJCQluYSAtPSBrOwotCQkJCWlmIChuYSA9PSAwKQotCQkJCQlnb3RvIFN1Y2NlZWQ7Ci0JCQl9Ci0JCQkqZGVzdC0tID0gKnBiLS07Ci0JCQktLW5iOwotCQkJaWYgKG5iID09IDEpCi0JCQkJZ290byBDb3B5QTsKKyAgICAgICAgLyogT25lIHJ1biBpcyB3aW5uaW5nIHNvIGNvbnNpc3RlbnRseSB0aGF0IGdhbGxvcGluZyBtYXkKKyAgICAgICAgICogYmUgYSBodWdlIHdpbi4gIFNvIHRyeSB0aGF0LCBhbmQgY29udGludWUgZ2FsbG9waW5nIHVudGlsCisgICAgICAgICAqIChpZiBldmVyKSBuZWl0aGVyIHJ1biBhcHBlYXJzIHRvIGJlIHdpbm5pbmcgY29uc2lzdGVudGx5CisgICAgICAgICAqIGFueW1vcmUuCisgICAgICAgICAqLworICAgICAgICArK21pbl9nYWxsb3A7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGFzc2VydChuYSA+IDAgJiYgbmIgPiAxKTsKKyAgICAgICAgICAgIG1pbl9nYWxsb3AgLT0gbWluX2dhbGxvcCA+IDE7CisgICAgICAgICAgICBtcy0+bWluX2dhbGxvcCA9IG1pbl9nYWxsb3A7CisgICAgICAgICAgICBrID0gZ2FsbG9wX3JpZ2h0KCpwYiwgYmFzZWEsIG5hLCBuYS0xLCBjb21wYXJlKTsKKyAgICAgICAgICAgIGlmIChrIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgICAgICBrID0gbmEgLSBrOworICAgICAgICAgICAgYWNvdW50ID0gazsKKyAgICAgICAgICAgIGlmIChrKSB7CisgICAgICAgICAgICAgICAgZGVzdCAtPSBrOworICAgICAgICAgICAgICAgIHBhIC09IGs7CisgICAgICAgICAgICAgICAgbWVtbW92ZShkZXN0KzEsIHBhKzEsIGsgKiBzaXplb2YoUHlPYmplY3QgKikpOworICAgICAgICAgICAgICAgIG5hIC09IGs7CisgICAgICAgICAgICAgICAgaWYgKG5hID09IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VjY2VlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0LS0gPSAqcGItLTsKKyAgICAgICAgICAgIC0tbmI7CisgICAgICAgICAgICBpZiAobmIgPT0gMSkKKyAgICAgICAgICAgICAgICBnb3RvIENvcHlBOwogCi0gCQkJayA9IGdhbGxvcF9sZWZ0KCpwYSwgYmFzZWIsIG5iLCBuYi0xLCBjb21wYXJlKTsKLQkJCWlmIChrIDwgMCkKLQkJCQlnb3RvIEZhaWw7Ci0JCQlrID0gbmIgLSBrOwotCQkJYmNvdW50ID0gazsKLQkJCWlmIChrKSB7Ci0JCQkJZGVzdCAtPSBrOwotCQkJCXBiIC09IGs7Ci0JCQkJbWVtY3B5KGRlc3QrMSwgcGIrMSwgayAqIHNpemVvZihQeU9iamVjdCAqKSk7Ci0JCQkJbmIgLT0gazsKLQkJCQlpZiAobmIgPT0gMSkKLQkJCQkJZ290byBDb3B5QTsKLQkJCQkvKiBuYj09MCBpcyBpbXBvc3NpYmxlIG5vdyBpZiB0aGUgY29tcGFyaXNvbgotCQkJCSAqIGZ1bmN0aW9uIGlzIGNvbnNpc3RlbnQsIGJ1dCB3ZSBjYW4ndCBhc3N1bWUKLQkJCQkgKiB0aGF0IGl0IGlzLgotCQkJCSAqLwotCQkJCWlmIChuYiA9PSAwKQotCQkJCQlnb3RvIFN1Y2NlZWQ7Ci0JCQl9Ci0JCQkqZGVzdC0tID0gKnBhLS07Ci0JCQktLW5hOwotCQkJaWYgKG5hID09IDApCi0JCQkJZ290byBTdWNjZWVkOwotIAkJfSB3aGlsZSAoYWNvdW50ID49IE1JTl9HQUxMT1AgfHwgYmNvdW50ID49IE1JTl9HQUxMT1ApOwotIAkJKyttaW5fZ2FsbG9wOwkvKiBwZW5hbGl6ZSBpdCBmb3IgbGVhdmluZyBnYWxsb3BpbmcgbW9kZSAqLwotIAkJbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOwotIAl9CisgICAgICAgICAgICBrID0gZ2FsbG9wX2xlZnQoKnBhLCBiYXNlYiwgbmIsIG5iLTEsIGNvbXBhcmUpOworICAgICAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIGsgPSBuYiAtIGs7CisgICAgICAgICAgICBiY291bnQgPSBrOworICAgICAgICAgICAgaWYgKGspIHsKKyAgICAgICAgICAgICAgICBkZXN0IC09IGs7CisgICAgICAgICAgICAgICAgcGIgLT0gazsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZGVzdCsxLCBwYisxLCBrICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICAgICAgICAgICAgICBuYiAtPSBrOworICAgICAgICAgICAgICAgIGlmIChuYiA9PSAxKQorICAgICAgICAgICAgICAgICAgICBnb3RvIENvcHlBOworICAgICAgICAgICAgICAgIC8qIG5iPT0wIGlzIGltcG9zc2libGUgbm93IGlmIHRoZSBjb21wYXJpc29uCisgICAgICAgICAgICAgICAgICogZnVuY3Rpb24gaXMgY29uc2lzdGVudCwgYnV0IHdlIGNhbid0IGFzc3VtZQorICAgICAgICAgICAgICAgICAqIHRoYXQgaXQgaXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKG5iID09IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gU3VjY2VlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZXN0LS0gPSAqcGEtLTsKKyAgICAgICAgICAgIC0tbmE7CisgICAgICAgICAgICBpZiAobmEgPT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIFN1Y2NlZWQ7CisgICAgICAgIH0gd2hpbGUgKGFjb3VudCA+PSBNSU5fR0FMTE9QIHx8IGJjb3VudCA+PSBNSU5fR0FMTE9QKTsKKyAgICAgICAgKyttaW5fZ2FsbG9wOyAgICAgICAgICAgLyogcGVuYWxpemUgaXQgZm9yIGxlYXZpbmcgZ2FsbG9waW5nIG1vZGUgKi8KKyAgICAgICAgbXMtPm1pbl9nYWxsb3AgPSBtaW5fZ2FsbG9wOworICAgIH0KIFN1Y2NlZWQ6Ci0JcmVzdWx0ID0gMDsKKyAgICByZXN1bHQgPSAwOwogRmFpbDoKLQlpZiAobmIpCi0JCW1lbWNweShkZXN0LShuYi0xKSwgYmFzZWIsIG5iICogc2l6ZW9mKFB5T2JqZWN0KikpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKG5iKQorICAgICAgICBtZW1jcHkoZGVzdC0obmItMSksIGJhc2ViLCBuYiAqIHNpemVvZihQeU9iamVjdCopKTsKKyAgICByZXR1cm4gcmVzdWx0OwogQ29weUE6Ci0JYXNzZXJ0KG5iID09IDEgJiYgbmEgPiAwKTsKLQkvKiBUaGUgZmlyc3QgZWxlbWVudCBvZiBwYiBiZWxvbmdzIGF0IHRoZSBmcm9udCBvZiB0aGUgbWVyZ2UuICovCi0JZGVzdCAtPSBuYTsKLQlwYSAtPSBuYTsKLQltZW1tb3ZlKGRlc3QrMSwgcGErMSwgbmEgKiBzaXplb2YoUHlPYmplY3QgKikpOwotCSpkZXN0ID0gKnBiOwotCXJldHVybiAwOworICAgIGFzc2VydChuYiA9PSAxICYmIG5hID4gMCk7CisgICAgLyogVGhlIGZpcnN0IGVsZW1lbnQgb2YgcGIgYmVsb25ncyBhdCB0aGUgZnJvbnQgb2YgdGhlIG1lcmdlLiAqLworICAgIGRlc3QgLT0gbmE7CisgICAgcGEgLT0gbmE7CisgICAgbWVtbW92ZShkZXN0KzEsIHBhKzEsIG5hICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICAqZGVzdCA9ICpwYjsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogTWVyZ2UgdGhlIHR3byBydW5zIGF0IHN0YWNrIGluZGljZXMgaSBhbmQgaSsxLgpAQCAtMTcyMiw1OCArMTcyMiw1OCBAQAogc3RhdGljIFB5X3NzaXplX3QKIG1lcmdlX2F0KE1lcmdlU3RhdGUgKm1zLCBQeV9zc2l6ZV90IGkpCiB7Ci0JUHlPYmplY3QgKipwYSwgKipwYjsKLQlQeV9zc2l6ZV90IG5hLCBuYjsKLQlQeV9zc2l6ZV90IGs7Ci0JUHlPYmplY3QgKmNvbXBhcmU7CisgICAgUHlPYmplY3QgKipwYSwgKipwYjsKKyAgICBQeV9zc2l6ZV90IG5hLCBuYjsKKyAgICBQeV9zc2l6ZV90IGs7CisgICAgUHlPYmplY3QgKmNvbXBhcmU7CiAKLQlhc3NlcnQobXMgIT0gTlVMTCk7Ci0JYXNzZXJ0KG1zLT5uID49IDIpOwotCWFzc2VydChpID49IDApOwotCWFzc2VydChpID09IG1zLT5uIC0gMiB8fCBpID09IG1zLT5uIC0gMyk7CisgICAgYXNzZXJ0KG1zICE9IE5VTEwpOworICAgIGFzc2VydChtcy0+biA+PSAyKTsKKyAgICBhc3NlcnQoaSA+PSAwKTsKKyAgICBhc3NlcnQoaSA9PSBtcy0+biAtIDIgfHwgaSA9PSBtcy0+biAtIDMpOwogCi0JcGEgPSBtcy0+cGVuZGluZ1tpXS5iYXNlOwotCW5hID0gbXMtPnBlbmRpbmdbaV0ubGVuOwotCXBiID0gbXMtPnBlbmRpbmdbaSsxXS5iYXNlOwotCW5iID0gbXMtPnBlbmRpbmdbaSsxXS5sZW47Ci0JYXNzZXJ0KG5hID4gMCAmJiBuYiA+IDApOwotCWFzc2VydChwYSArIG5hID09IHBiKTsKKyAgICBwYSA9IG1zLT5wZW5kaW5nW2ldLmJhc2U7CisgICAgbmEgPSBtcy0+cGVuZGluZ1tpXS5sZW47CisgICAgcGIgPSBtcy0+cGVuZGluZ1tpKzFdLmJhc2U7CisgICAgbmIgPSBtcy0+cGVuZGluZ1tpKzFdLmxlbjsKKyAgICBhc3NlcnQobmEgPiAwICYmIG5iID4gMCk7CisgICAgYXNzZXJ0KHBhICsgbmEgPT0gcGIpOwogCi0JLyogUmVjb3JkIHRoZSBsZW5ndGggb2YgdGhlIGNvbWJpbmVkIHJ1bnM7IGlmIGkgaXMgdGhlIDNyZC1sYXN0Ci0JICogcnVuIG5vdywgYWxzbyBzbGlkZSBvdmVyIHRoZSBsYXN0IHJ1biAod2hpY2ggaXNuJ3QgaW52b2x2ZWQKLQkgKiBpbiB0aGlzIG1lcmdlKS4gIFRoZSBjdXJyZW50IHJ1biBpKzEgZ29lcyBhd2F5IGluIGFueSBjYXNlLgotCSAqLwotCW1zLT5wZW5kaW5nW2ldLmxlbiA9IG5hICsgbmI7Ci0JaWYgKGkgPT0gbXMtPm4gLSAzKQotCQltcy0+cGVuZGluZ1tpKzFdID0gbXMtPnBlbmRpbmdbaSsyXTsKLQktLW1zLT5uOworICAgIC8qIFJlY29yZCB0aGUgbGVuZ3RoIG9mIHRoZSBjb21iaW5lZCBydW5zOyBpZiBpIGlzIHRoZSAzcmQtbGFzdAorICAgICAqIHJ1biBub3csIGFsc28gc2xpZGUgb3ZlciB0aGUgbGFzdCBydW4gKHdoaWNoIGlzbid0IGludm9sdmVkCisgICAgICogaW4gdGhpcyBtZXJnZSkuICBUaGUgY3VycmVudCBydW4gaSsxIGdvZXMgYXdheSBpbiBhbnkgY2FzZS4KKyAgICAgKi8KKyAgICBtcy0+cGVuZGluZ1tpXS5sZW4gPSBuYSArIG5iOworICAgIGlmIChpID09IG1zLT5uIC0gMykKKyAgICAgICAgbXMtPnBlbmRpbmdbaSsxXSA9IG1zLT5wZW5kaW5nW2krMl07CisgICAgLS1tcy0+bjsKIAotCS8qIFdoZXJlIGRvZXMgYiBzdGFydCBpbiBhPyAgRWxlbWVudHMgaW4gYSBiZWZvcmUgdGhhdCBjYW4gYmUKLQkgKiBpZ25vcmVkIChhbHJlYWR5IGluIHBsYWNlKS4KLQkgKi8KLQljb21wYXJlID0gbXMtPmNvbXBhcmU7Ci0JayA9IGdhbGxvcF9yaWdodCgqcGIsIHBhLCBuYSwgMCwgY29tcGFyZSk7Ci0JaWYgKGsgPCAwKQotCQlyZXR1cm4gLTE7Ci0JcGEgKz0gazsKLQluYSAtPSBrOwotCWlmIChuYSA9PSAwKQotCQlyZXR1cm4gMDsKKyAgICAvKiBXaGVyZSBkb2VzIGIgc3RhcnQgaW4gYT8gIEVsZW1lbnRzIGluIGEgYmVmb3JlIHRoYXQgY2FuIGJlCisgICAgICogaWdub3JlZCAoYWxyZWFkeSBpbiBwbGFjZSkuCisgICAgICovCisgICAgY29tcGFyZSA9IG1zLT5jb21wYXJlOworICAgIGsgPSBnYWxsb3BfcmlnaHQoKnBiLCBwYSwgbmEsIDAsIGNvbXBhcmUpOworICAgIGlmIChrIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHBhICs9IGs7CisgICAgbmEgLT0gazsKKyAgICBpZiAobmEgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQkvKiBXaGVyZSBkb2VzIGEgZW5kIGluIGI/ICBFbGVtZW50cyBpbiBiIGFmdGVyIHRoYXQgY2FuIGJlCi0JICogaWdub3JlZCAoYWxyZWFkeSBpbiBwbGFjZSkuCi0JICovCi0JbmIgPSBnYWxsb3BfbGVmdChwYVtuYS0xXSwgcGIsIG5iLCBuYi0xLCBjb21wYXJlKTsKLQlpZiAobmIgPD0gMCkKLQkJcmV0dXJuIG5iOworICAgIC8qIFdoZXJlIGRvZXMgYSBlbmQgaW4gYj8gIEVsZW1lbnRzIGluIGIgYWZ0ZXIgdGhhdCBjYW4gYmUKKyAgICAgKiBpZ25vcmVkIChhbHJlYWR5IGluIHBsYWNlKS4KKyAgICAgKi8KKyAgICBuYiA9IGdhbGxvcF9sZWZ0KHBhW25hLTFdLCBwYiwgbmIsIG5iLTEsIGNvbXBhcmUpOworICAgIGlmIChuYiA8PSAwKQorICAgICAgICByZXR1cm4gbmI7CiAKLQkvKiBNZXJnZSB3aGF0IHJlbWFpbnMgb2YgdGhlIHJ1bnMsIHVzaW5nIGEgdGVtcCBhcnJheSB3aXRoCi0JICogbWluKG5hLCBuYikgZWxlbWVudHMuCi0JICovCi0JaWYgKG5hIDw9IG5iKQotCQlyZXR1cm4gbWVyZ2VfbG8obXMsIHBhLCBuYSwgcGIsIG5iKTsKLQllbHNlCi0JCXJldHVybiBtZXJnZV9oaShtcywgcGEsIG5hLCBwYiwgbmIpOworICAgIC8qIE1lcmdlIHdoYXQgcmVtYWlucyBvZiB0aGUgcnVucywgdXNpbmcgYSB0ZW1wIGFycmF5IHdpdGgKKyAgICAgKiBtaW4obmEsIG5iKSBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBpZiAobmEgPD0gbmIpCisgICAgICAgIHJldHVybiBtZXJnZV9sbyhtcywgcGEsIG5hLCBwYiwgbmIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1lcmdlX2hpKG1zLCBwYSwgbmEsIHBiLCBuYik7CiB9CiAKIC8qIEV4YW1pbmUgdGhlIHN0YWNrIG9mIHJ1bnMgd2FpdGluZyB0byBiZSBtZXJnZWQsIG1lcmdpbmcgYWRqYWNlbnQgcnVucwpAQCAtMTc4OSwyNSArMTc4OSwyNSBAQAogc3RhdGljIGludAogbWVyZ2VfY29sbGFwc2UoTWVyZ2VTdGF0ZSAqbXMpCiB7Ci0Jc3RydWN0IHNfc2xpY2UgKnAgPSBtcy0+cGVuZGluZzsKKyAgICBzdHJ1Y3Qgc19zbGljZSAqcCA9IG1zLT5wZW5kaW5nOwogCi0JYXNzZXJ0KG1zKTsKLQl3aGlsZSAobXMtPm4gPiAxKSB7Ci0JCVB5X3NzaXplX3QgbiA9IG1zLT5uIC0gMjsKLQkJaWYgKG4gPiAwICYmIHBbbi0xXS5sZW4gPD0gcFtuXS5sZW4gKyBwW24rMV0ubGVuKSB7Ci0JCSAgICAJaWYgKHBbbi0xXS5sZW4gPCBwW24rMV0ubGVuKQotCQkgICAgCQktLW47Ci0JCQlpZiAobWVyZ2VfYXQobXMsIG4pIDwgMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZSBpZiAocFtuXS5sZW4gPD0gcFtuKzFdLmxlbikgewotCQkJIGlmIChtZXJnZV9hdChtcywgbikgPCAwKQotCQkJIAlyZXR1cm4gLTE7Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChtcyk7CisgICAgd2hpbGUgKG1zLT5uID4gMSkgeworICAgICAgICBQeV9zc2l6ZV90IG4gPSBtcy0+biAtIDI7CisgICAgICAgIGlmIChuID4gMCAmJiBwW24tMV0ubGVuIDw9IHBbbl0ubGVuICsgcFtuKzFdLmxlbikgeworICAgICAgICAgICAgaWYgKHBbbi0xXS5sZW4gPCBwW24rMV0ubGVuKQorICAgICAgICAgICAgICAgIC0tbjsKKyAgICAgICAgICAgIGlmIChtZXJnZV9hdChtcywgbikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwW25dLmxlbiA8PSBwW24rMV0ubGVuKSB7CisgICAgICAgICAgICAgICAgIGlmIChtZXJnZV9hdChtcywgbikgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogUmVnYXJkbGVzcyBvZiBpbnZhcmlhbnRzLCBtZXJnZSBhbGwgcnVucyBvbiB0aGUgc3RhY2sgdW50aWwgb25seSBvbmUKQEAgLTE4MTgsMTcgKzE4MTgsMTcgQEAKIHN0YXRpYyBpbnQKIG1lcmdlX2ZvcmNlX2NvbGxhcHNlKE1lcmdlU3RhdGUgKm1zKQogewotCXN0cnVjdCBzX3NsaWNlICpwID0gbXMtPnBlbmRpbmc7CisgICAgc3RydWN0IHNfc2xpY2UgKnAgPSBtcy0+cGVuZGluZzsKIAotCWFzc2VydChtcyk7Ci0Jd2hpbGUgKG1zLT5uID4gMSkgewotCQlQeV9zc2l6ZV90IG4gPSBtcy0+biAtIDI7Ci0JCWlmIChuID4gMCAmJiBwW24tMV0ubGVuIDwgcFtuKzFdLmxlbikKLQkJCS0tbjsKLQkJaWYgKG1lcmdlX2F0KG1zLCBuKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChtcyk7CisgICAgd2hpbGUgKG1zLT5uID4gMSkgeworICAgICAgICBQeV9zc2l6ZV90IG4gPSBtcy0+biAtIDI7CisgICAgICAgIGlmIChuID4gMCAmJiBwW24tMV0ubGVuIDwgcFtuKzFdLmxlbikKKyAgICAgICAgICAgIC0tbjsKKyAgICAgICAgaWYgKG1lcmdlX2F0KG1zLCBuKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBDb21wdXRlIGEgZ29vZCB2YWx1ZSBmb3IgdGhlIG1pbmltdW0gcnVuIGxlbmd0aDsgbmF0dXJhbCBydW5zIHNob3J0ZXIKQEAgLTE4NDQsMTQgKzE4NDQsMTQgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtZXJnZV9jb21wdXRlX21pbnJ1bihQeV9zc2l6ZV90IG4pCiB7Ci0JUHlfc3NpemVfdCByID0gMDsJLyogYmVjb21lcyAxIGlmIGFueSAxIGJpdHMgYXJlIHNoaWZ0ZWQgb2ZmICovCisgICAgUHlfc3NpemVfdCByID0gMDsgICAgICAgICAgIC8qIGJlY29tZXMgMSBpZiBhbnkgMSBiaXRzIGFyZSBzaGlmdGVkIG9mZiAqLwogCi0JYXNzZXJ0KG4gPj0gMCk7Ci0Jd2hpbGUgKG4gPj0gNjQpIHsKLQkJciB8PSBuICYgMTsKLQkJbiA+Pj0gMTsKLQl9Ci0JcmV0dXJuIG4gKyByOworICAgIGFzc2VydChuID49IDApOworICAgIHdoaWxlIChuID49IDY0KSB7CisgICAgICAgIHIgfD0gbiAmIDE7CisgICAgICAgIG4gPj49IDE7CisgICAgfQorICAgIHJldHVybiBuICsgcjsKIH0KIAogLyogU3BlY2lhbCB3cmFwcGVyIHRvIHN1cHBvcnQgc3RhYmxlIHNvcnRpbmcgdXNpbmcgdGhlIGRlY29yYXRlLXNvcnQtdW5kZWNvcmF0ZQpAQCAtMTg2Miw5ICsxODYyLDkgQEAKICAgIHRoZSBrZXkgaW5zdGVhZCBvZiBhIGZ1bGwgcmVjb3JkLiAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICprZXk7Ci0JUHlPYmplY3QgKnZhbHVlOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqa2V5OworICAgIFB5T2JqZWN0ICp2YWx1ZTsKIH0gc29ydHdyYXBwZXJvYmplY3Q7CiAKIFB5RG9jX1NUUlZBUihzb3J0d3JhcHBlcl9kb2MsICJPYmplY3Qgd3JhcHBlciB3aXRoIGEgY3VzdG9tIHNvcnQga2V5LiIpOwpAQCAtMTg3NCw1MiArMTg3NCw1MiBAQAogc29ydHdyYXBwZXJfZGVhbGxvYyhzb3J0d3JhcHBlcm9iamVjdCAqKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBzb3J0d3JhcHBlcl90eXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInNvcnR3cmFwcGVyIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihzb3J0d3JhcHBlcm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3Ipc29ydHdyYXBwZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8Ci0JUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFLCAJCS8qIHRwX2ZsYWdzICovCi0Jc29ydHdyYXBwZXJfZG9jLAkJCS8qIHRwX2RvYyAqLwotCTAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCShyaWNoY21wZnVuYylzb3J0d3JhcHBlcl9yaWNoY29tcGFyZSwJLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzb3J0d3JhcHBlciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihzb3J0d3JhcHBlcm9iamVjdCksICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3Rvcilzb3J0d3JhcHBlcl9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwKKyAgICBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUsICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgc29ydHdyYXBwZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYylzb3J0d3JhcHBlcl9yaWNoY29tcGFyZSwgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KIH07CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNvcnR3cmFwcGVyX3JpY2hjb21wYXJlKHNvcnR3cmFwcGVyb2JqZWN0ICphLCBzb3J0d3JhcHBlcm9iamVjdCAqYiwgaW50IG9wKQogewotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKGIsICZzb3J0d3JhcHBlcl90eXBlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZShhLT5rZXksIGItPmtleSwgb3ApOworICAgIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGIsICZzb3J0d3JhcHBlcl90eXBlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZShhLT5rZXksIGItPmtleSwgb3ApOwogfQogCiBzdGF0aWMgdm9pZAogc29ydHdyYXBwZXJfZGVhbGxvYyhzb3J0d3JhcHBlcm9iamVjdCAqc28pCiB7Ci0JUHlfWERFQ1JFRihzby0+a2V5KTsKLQlQeV9YREVDUkVGKHNvLT52YWx1ZSk7Ci0JUHlPYmplY3RfRGVsKHNvKTsKKyAgICBQeV9YREVDUkVGKHNvLT5rZXkpOworICAgIFB5X1hERUNSRUYoc28tPnZhbHVlKTsKKyAgICBQeU9iamVjdF9EZWwoc28pOwogfQogCiAvKiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB0byBhIHNvcnR3cmFwcGVyLgpAQCAtMTkyOCwzMCArMTkyOCwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWxkX3NvcnR3cmFwcGVyKFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlzb3J0d3JhcHBlcm9iamVjdCAqc287CisgICAgc29ydHdyYXBwZXJvYmplY3QgKnNvOwogCi0Jc28gPSBQeU9iamVjdF9OZXcoc29ydHdyYXBwZXJvYmplY3QsICZzb3J0d3JhcHBlcl90eXBlKTsKLQlpZiAoc28gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc28tPmtleSA9IGtleTsKLQlzby0+dmFsdWUgPSB2YWx1ZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc287CisgICAgc28gPSBQeU9iamVjdF9OZXcoc29ydHdyYXBwZXJvYmplY3QsICZzb3J0d3JhcHBlcl90eXBlKTsKKyAgICBpZiAoc28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc28tPmtleSA9IGtleTsKKyAgICBzby0+dmFsdWUgPSB2YWx1ZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc287CiB9CiAKIC8qIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSB1bmRlcmx5aW5nIHRoZSB3cmFwcGVyLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHNvcnR3cmFwcGVyX2dldHZhbHVlKFB5T2JqZWN0ICpzbykKIHsKLQlQeU9iamVjdCAqdmFsdWU7CisgICAgUHlPYmplY3QgKnZhbHVlOwogCi0JaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soc28sICZzb3J0d3JhcHBlcl90eXBlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXZhbHVlID0gKChzb3J0d3JhcHBlcm9iamVjdCAqKXNvKS0+dmFsdWU7Ci0JUHlfSU5DUkVGKHZhbHVlKTsKLQlyZXR1cm4gdmFsdWU7CisgICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soc28sICZzb3J0d3JhcHBlcl90eXBlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHZhbHVlID0gKChzb3J0d3JhcHBlcm9iamVjdCAqKXNvKS0+dmFsdWU7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICByZXR1cm4gdmFsdWU7CiB9CiAKIC8qIFdyYXBwZXIgZm9yIHVzZXIgc3BlY2lmaWVkIGNtcCBmdW5jdGlvbnMgaW4gY29tYmluYXRpb24gd2l0aCBhCkBAIC0xOTU5LDczICsxOTU5LDczIEBACiAgICB3aXRoIHRoZSBhY3R1YWwga2V5IGluc3RlYWQgb2YgdGhlIHNvcnR3cmFwcGVyICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpmdW5jOwogfSBjbXB3cmFwcGVyb2JqZWN0OwogCiBzdGF0aWMgdm9pZAogY21wd3JhcHBlcl9kZWFsbG9jKGNtcHdyYXBwZXJvYmplY3QgKmNvKQogewotCVB5X1hERUNSRUYoY28tPmZ1bmMpOwotCVB5T2JqZWN0X0RlbChjbyk7CisgICAgUHlfWERFQ1JFRihjby0+ZnVuYyk7CisgICAgUHlPYmplY3RfRGVsKGNvKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNtcHdyYXBwZXJfY2FsbChjbXB3cmFwcGVyb2JqZWN0ICpjbywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp4LCAqeSwgKnh4LCAqeXk7CisgICAgUHlPYmplY3QgKngsICp5LCAqeHgsICp5eTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDIsIDIsICZ4LCAmeSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlPYmplY3RfVHlwZUNoZWNrKHgsICZzb3J0d3JhcHBlcl90eXBlKSB8fAotCSAgICAhUHlPYmplY3RfVHlwZUNoZWNrKHksICZzb3J0d3JhcHBlcl90eXBlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImV4cGVjdGVkIGEgc29ydHdyYXBwZXJvYmplY3QiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXh4ID0gKChzb3J0d3JhcHBlcm9iamVjdCAqKXgpLT5rZXk7Ci0JeXkgPSAoKHNvcnR3cmFwcGVyb2JqZWN0ICopeSktPmtleTsKLQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjby0+ZnVuYywgeHgsIHl5LCBOVUxMKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAyLCAyLCAmeCwgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayh4LCAmc29ydHdyYXBwZXJfdHlwZSkgfHwKKyAgICAgICAgIVB5T2JqZWN0X1R5cGVDaGVjayh5LCAmc29ydHdyYXBwZXJfdHlwZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJleHBlY3RlZCBhIHNvcnR3cmFwcGVyb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB4eCA9ICgoc29ydHdyYXBwZXJvYmplY3QgKil4KS0+a2V5OworICAgIHl5ID0gKChzb3J0d3JhcHBlcm9iamVjdCAqKXkpLT5rZXk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY28tPmZ1bmMsIHh4LCB5eSwgTlVMTCk7CiB9CiAKIFB5RG9jX1NUUlZBUihjbXB3cmFwcGVyX2RvYywgImNtcCgpIHdyYXBwZXIgZm9yIHNvcnQgd2l0aCBjdXN0b20ga2V5cy4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjbXB3cmFwcGVyX3R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiY21wd3JhcHBlciIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoY21wd3JhcHBlcm9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpY21wd3JhcHBlcl9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkodGVybmFyeWZ1bmMpY21wd3JhcHBlcl9jYWxsLAkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotCWNtcHdyYXBwZXJfZG9jLAkJCQkvKiB0cF9kb2MgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJjbXB3cmFwcGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihjbXB3cmFwcGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvciljbXB3cmFwcGVyX2RlYWxsb2MsICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgKHRlcm5hcnlmdW5jKWNtcHdyYXBwZXJfY2FsbCwgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGNtcHdyYXBwZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbGRfY21wd3JhcHBlcihQeU9iamVjdCAqY21wZnVuYykKIHsKLQljbXB3cmFwcGVyb2JqZWN0ICpjbzsKKyAgICBjbXB3cmFwcGVyb2JqZWN0ICpjbzsKIAotCWNvID0gUHlPYmplY3RfTmV3KGNtcHdyYXBwZXJvYmplY3QsICZjbXB3cmFwcGVyX3R5cGUpOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoY21wZnVuYyk7Ci0JY28tPmZ1bmMgPSBjbXBmdW5jOwotCXJldHVybiAoUHlPYmplY3QgKiljbzsKKyAgICBjbyA9IFB5T2JqZWN0X05ldyhjbXB3cmFwcGVyb2JqZWN0LCAmY21wd3JhcHBlcl90eXBlKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKGNtcGZ1bmMpOworICAgIGNvLT5mdW5jID0gY21wZnVuYzsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopY287CiB9CiAKIC8qIEFuIGFkYXB0aXZlLCBzdGFibGUsIG5hdHVyYWwgbWVyZ2Vzb3J0LiAgU2VlIGxpc3Rzb3J0LnR4dC4KQEAgLTIwMzYsMTcxICsyMDM2LDE3MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3Rzb3J0KFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCU1lcmdlU3RhdGUgbXM7Ci0JUHlPYmplY3QgKipsbywgKipoaTsKLQlQeV9zc2l6ZV90IG5yZW1haW5pbmc7Ci0JUHlfc3NpemVfdCBtaW5ydW47Ci0JUHlfc3NpemVfdCBzYXZlZF9vYl9zaXplLCBzYXZlZF9hbGxvY2F0ZWQ7Ci0JUHlPYmplY3QgKipzYXZlZF9vYl9pdGVtOwotCVB5T2JqZWN0ICoqZmluYWxfb2JfaXRlbTsKLQlQeU9iamVjdCAqY29tcGFyZSA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CS8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KLQlpbnQgcmV2ZXJzZSA9IDA7Ci0JUHlPYmplY3QgKmtleWZ1bmMgPSBOVUxMOwotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWUsICprdnBhaXI7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJjbXAiLCAia2V5IiwgInJldmVyc2UiLCAwfTsKKyAgICBNZXJnZVN0YXRlIG1zOworICAgIFB5T2JqZWN0ICoqbG8sICoqaGk7CisgICAgUHlfc3NpemVfdCBucmVtYWluaW5nOworICAgIFB5X3NzaXplX3QgbWlucnVuOworICAgIFB5X3NzaXplX3Qgc2F2ZWRfb2Jfc2l6ZSwgc2F2ZWRfYWxsb2NhdGVkOworICAgIFB5T2JqZWN0ICoqc2F2ZWRfb2JfaXRlbTsKKyAgICBQeU9iamVjdCAqKmZpbmFsX29iX2l0ZW07CisgICAgUHlPYmplY3QgKmNvbXBhcmUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOyAgICAgICAgICAgIC8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KKyAgICBpbnQgcmV2ZXJzZSA9IDA7CisgICAgUHlPYmplY3QgKmtleWZ1bmMgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWUsICprdnBhaXI7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJjbXAiLCAia2V5IiwgInJldmVyc2UiLCAwfTsKIAotCWFzc2VydChzZWxmICE9IE5VTEwpOwotCWFzc2VydCAoUHlMaXN0X0NoZWNrKHNlbGYpKTsKLQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T09pOnNvcnQiLAotCQkJa3dsaXN0LCAmY29tcGFyZSwgJmtleWZ1bmMsICZyZXZlcnNlKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoY29tcGFyZSA9PSBQeV9Ob25lKQotCQljb21wYXJlID0gTlVMTDsKLQlpZiAoY29tcGFyZSAhPSBOVUxMICYmIAotCSAgICBQeUVycl9XYXJuUHkzaygidGhlIGNtcCBhcmd1bWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGtleWZ1bmMgPT0gUHlfTm9uZSkKLQkJa2V5ZnVuYyA9IE5VTEw7Ci0JaWYgKGNvbXBhcmUgIT0gTlVMTCAmJiBrZXlmdW5jICE9IE5VTEwpIHsKLQkJY29tcGFyZSA9IGJ1aWxkX2NtcHdyYXBwZXIoY29tcGFyZSk7Ci0JCWlmIChjb21wYXJlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UKLQkJUHlfWElOQ1JFRihjb21wYXJlKTsKKyAgICBhc3NlcnQoc2VsZiAhPSBOVUxMKTsKKyAgICBhc3NlcnQgKFB5TGlzdF9DaGVjayhzZWxmKSk7CisgICAgaWYgKGFyZ3MgIT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9PaTpzb3J0IiwKKyAgICAgICAgICAgIGt3bGlzdCwgJmNvbXBhcmUsICZrZXlmdW5jLCAmcmV2ZXJzZSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGNvbXBhcmUgPT0gUHlfTm9uZSkKKyAgICAgICAgY29tcGFyZSA9IE5VTEw7CisgICAgaWYgKGNvbXBhcmUgIT0gTlVMTCAmJgorICAgICAgICBQeUVycl9XYXJuUHkzaygidGhlIGNtcCBhcmd1bWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIDMueCIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGtleWZ1bmMgPT0gUHlfTm9uZSkKKyAgICAgICAga2V5ZnVuYyA9IE5VTEw7CisgICAgaWYgKGNvbXBhcmUgIT0gTlVMTCAmJiBrZXlmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgY29tcGFyZSA9IGJ1aWxkX2NtcHdyYXBwZXIoY29tcGFyZSk7CisgICAgICAgIGlmIChjb21wYXJlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UKKyAgICAgICAgUHlfWElOQ1JFRihjb21wYXJlKTsKIAotCS8qIFRoZSBsaXN0IGlzIHRlbXBvcmFyaWx5IG1hZGUgZW1wdHksIHNvIHRoYXQgbXV0YXRpb25zIHBlcmZvcm1lZAotCSAqIGJ5IGNvbXBhcmlzb24gZnVuY3Rpb25zIGNhbid0IGFmZmVjdCB0aGUgc2xpY2Ugb2YgbWVtb3J5IHdlJ3JlCi0JICogc29ydGluZyAoYWxsb3dpbmcgbXV0YXRpb25zIGR1cmluZyBzb3J0aW5nIGlzIGEgY29yZS1kdW1wCi0JICogZmFjdG9yeSwgc2luY2Ugb2JfaXRlbSBtYXkgY2hhbmdlKS4KLQkgKi8KLQlzYXZlZF9vYl9zaXplID0gUHlfU0laRShzZWxmKTsKLQlzYXZlZF9vYl9pdGVtID0gc2VsZi0+b2JfaXRlbTsKLQlzYXZlZF9hbGxvY2F0ZWQgPSBzZWxmLT5hbGxvY2F0ZWQ7Ci0JUHlfU0laRShzZWxmKSA9IDA7Ci0Jc2VsZi0+b2JfaXRlbSA9IE5VTEw7Ci0Jc2VsZi0+YWxsb2NhdGVkID0gLTE7IC8qIGFueSBvcGVyYXRpb24gd2lsbCByZXNldCBpdCB0byA+PSAwICovCisgICAgLyogVGhlIGxpc3QgaXMgdGVtcG9yYXJpbHkgbWFkZSBlbXB0eSwgc28gdGhhdCBtdXRhdGlvbnMgcGVyZm9ybWVkCisgICAgICogYnkgY29tcGFyaXNvbiBmdW5jdGlvbnMgY2FuJ3QgYWZmZWN0IHRoZSBzbGljZSBvZiBtZW1vcnkgd2UncmUKKyAgICAgKiBzb3J0aW5nIChhbGxvd2luZyBtdXRhdGlvbnMgZHVyaW5nIHNvcnRpbmcgaXMgYSBjb3JlLWR1bXAKKyAgICAgKiBmYWN0b3J5LCBzaW5jZSBvYl9pdGVtIG1heSBjaGFuZ2UpLgorICAgICAqLworICAgIHNhdmVkX29iX3NpemUgPSBQeV9TSVpFKHNlbGYpOworICAgIHNhdmVkX29iX2l0ZW0gPSBzZWxmLT5vYl9pdGVtOworICAgIHNhdmVkX2FsbG9jYXRlZCA9IHNlbGYtPmFsbG9jYXRlZDsKKyAgICBQeV9TSVpFKHNlbGYpID0gMDsKKyAgICBzZWxmLT5vYl9pdGVtID0gTlVMTDsKKyAgICBzZWxmLT5hbGxvY2F0ZWQgPSAtMTsgLyogYW55IG9wZXJhdGlvbiB3aWxsIHJlc2V0IGl0IHRvID49IDAgKi8KIAotCWlmIChrZXlmdW5jICE9IE5VTEwpIHsKLQkJZm9yIChpPTAgOyBpIDwgc2F2ZWRfb2Jfc2l6ZSA7IGkrKykgewotCQkJdmFsdWUgPSBzYXZlZF9vYl9pdGVtW2ldOwotCQkJa2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhrZXlmdW5jLCB2YWx1ZSwKLQkJCQkJCQkgICBOVUxMKTsKLQkJCWlmIChrZXkgPT0gTlVMTCkgewotCQkJCWZvciAoaT1pLTEgOyBpPj0wIDsgaS0tKSB7Ci0JCQkJCWt2cGFpciA9IHNhdmVkX29iX2l0ZW1baV07Ci0JCQkJCXZhbHVlID0gc29ydHdyYXBwZXJfZ2V0dmFsdWUoa3ZwYWlyKTsKLQkJCQkJc2F2ZWRfb2JfaXRlbVtpXSA9IHZhbHVlOwotCQkJCQlQeV9ERUNSRUYoa3ZwYWlyKTsKLQkJCQl9Ci0JCQkJZ290byBkc3VfZmFpbDsKLQkJCX0KLQkJCWt2cGFpciA9IGJ1aWxkX3NvcnR3cmFwcGVyKGtleSwgdmFsdWUpOwotCQkJaWYgKGt2cGFpciA9PSBOVUxMKQotCQkJCWdvdG8gZHN1X2ZhaWw7Ci0JCQlzYXZlZF9vYl9pdGVtW2ldID0ga3ZwYWlyOwotCQl9Ci0JfQorICAgIGlmIChrZXlmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpPTAgOyBpIDwgc2F2ZWRfb2Jfc2l6ZSA7IGkrKykgeworICAgICAgICAgICAgdmFsdWUgPSBzYXZlZF9vYl9pdGVtW2ldOworICAgICAgICAgICAga2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhrZXlmdW5jLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBpZiAoa2V5ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGk9aS0xIDsgaT49MCA7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBrdnBhaXIgPSBzYXZlZF9vYl9pdGVtW2ldOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNvcnR3cmFwcGVyX2dldHZhbHVlKGt2cGFpcik7CisgICAgICAgICAgICAgICAgICAgIHNhdmVkX29iX2l0ZW1baV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGt2cGFpcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gZHN1X2ZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrdnBhaXIgPSBidWlsZF9zb3J0d3JhcHBlcihrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChrdnBhaXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGRzdV9mYWlsOworICAgICAgICAgICAgc2F2ZWRfb2JfaXRlbVtpXSA9IGt2cGFpcjsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIFJldmVyc2Ugc29ydCBzdGFiaWxpdHkgYWNoaWV2ZWQgYnkgaW5pdGlhbGx5IHJldmVyc2luZyB0aGUgbGlzdCwKLQlhcHBseWluZyBhIHN0YWJsZSBmb3J3YXJkIHNvcnQsIHRoZW4gcmV2ZXJzaW5nIHRoZSBmaW5hbCByZXN1bHQuICovCi0JaWYgKHJldmVyc2UgJiYgc2F2ZWRfb2Jfc2l6ZSA+IDEpCi0JCXJldmVyc2Vfc2xpY2Uoc2F2ZWRfb2JfaXRlbSwgc2F2ZWRfb2JfaXRlbSArIHNhdmVkX29iX3NpemUpOworICAgIC8qIFJldmVyc2Ugc29ydCBzdGFiaWxpdHkgYWNoaWV2ZWQgYnkgaW5pdGlhbGx5IHJldmVyc2luZyB0aGUgbGlzdCwKKyAgICBhcHBseWluZyBhIHN0YWJsZSBmb3J3YXJkIHNvcnQsIHRoZW4gcmV2ZXJzaW5nIHRoZSBmaW5hbCByZXN1bHQuICovCisgICAgaWYgKHJldmVyc2UgJiYgc2F2ZWRfb2Jfc2l6ZSA+IDEpCisgICAgICAgIHJldmVyc2Vfc2xpY2Uoc2F2ZWRfb2JfaXRlbSwgc2F2ZWRfb2JfaXRlbSArIHNhdmVkX29iX3NpemUpOwogCi0JbWVyZ2VfaW5pdCgmbXMsIGNvbXBhcmUpOworICAgIG1lcmdlX2luaXQoJm1zLCBjb21wYXJlKTsKIAotCW5yZW1haW5pbmcgPSBzYXZlZF9vYl9zaXplOwotCWlmIChucmVtYWluaW5nIDwgMikKLQkJZ290byBzdWNjZWVkOworICAgIG5yZW1haW5pbmcgPSBzYXZlZF9vYl9zaXplOworICAgIGlmIChucmVtYWluaW5nIDwgMikKKyAgICAgICAgZ290byBzdWNjZWVkOwogCi0JLyogTWFyY2ggb3ZlciB0aGUgYXJyYXkgb25jZSwgbGVmdCB0byByaWdodCwgZmluZGluZyBuYXR1cmFsIHJ1bnMsCi0JICogYW5kIGV4dGVuZGluZyBzaG9ydCBuYXR1cmFsIHJ1bnMgdG8gbWlucnVuIGVsZW1lbnRzLgotCSAqLwotCWxvID0gc2F2ZWRfb2JfaXRlbTsKLQloaSA9IGxvICsgbnJlbWFpbmluZzsKLQltaW5ydW4gPSBtZXJnZV9jb21wdXRlX21pbnJ1bihucmVtYWluaW5nKTsKLQlkbyB7Ci0JCWludCBkZXNjZW5kaW5nOwotCQlQeV9zc2l6ZV90IG47CisgICAgLyogTWFyY2ggb3ZlciB0aGUgYXJyYXkgb25jZSwgbGVmdCB0byByaWdodCwgZmluZGluZyBuYXR1cmFsIHJ1bnMsCisgICAgICogYW5kIGV4dGVuZGluZyBzaG9ydCBuYXR1cmFsIHJ1bnMgdG8gbWlucnVuIGVsZW1lbnRzLgorICAgICAqLworICAgIGxvID0gc2F2ZWRfb2JfaXRlbTsKKyAgICBoaSA9IGxvICsgbnJlbWFpbmluZzsKKyAgICBtaW5ydW4gPSBtZXJnZV9jb21wdXRlX21pbnJ1bihucmVtYWluaW5nKTsKKyAgICBkbyB7CisgICAgICAgIGludCBkZXNjZW5kaW5nOworICAgICAgICBQeV9zc2l6ZV90IG47CiAKLQkJLyogSWRlbnRpZnkgbmV4dCBydW4uICovCi0JCW4gPSBjb3VudF9ydW4obG8sIGhpLCBjb21wYXJlLCAmZGVzY2VuZGluZyk7Ci0JCWlmIChuIDwgMCkKLQkJCWdvdG8gZmFpbDsKLQkJaWYgKGRlc2NlbmRpbmcpCi0JCQlyZXZlcnNlX3NsaWNlKGxvLCBsbyArIG4pOwotCQkvKiBJZiBzaG9ydCwgZXh0ZW5kIHRvIG1pbihtaW5ydW4sIG5yZW1haW5pbmcpLiAqLwotCQlpZiAobiA8IG1pbnJ1bikgewotCQkJY29uc3QgUHlfc3NpemVfdCBmb3JjZSA9IG5yZW1haW5pbmcgPD0gbWlucnVuID8KLQkgCQkJICAJICBucmVtYWluaW5nIDogbWlucnVuOwotCQkJaWYgKGJpbmFyeXNvcnQobG8sIGxvICsgZm9yY2UsIGxvICsgbiwgY29tcGFyZSkgPCAwKQotCQkJCWdvdG8gZmFpbDsKLQkJCW4gPSBmb3JjZTsKLQkJfQotCQkvKiBQdXNoIHJ1biBvbnRvIHBlbmRpbmctcnVucyBzdGFjaywgYW5kIG1heWJlIG1lcmdlLiAqLwotCQlhc3NlcnQobXMubiA8IE1BWF9NRVJHRV9QRU5ESU5HKTsKLQkJbXMucGVuZGluZ1ttcy5uXS5iYXNlID0gbG87Ci0JCW1zLnBlbmRpbmdbbXMubl0ubGVuID0gbjsKLQkJKyttcy5uOwotCQlpZiAobWVyZ2VfY29sbGFwc2UoJm1zKSA8IDApCi0JCQlnb3RvIGZhaWw7Ci0JCS8qIEFkdmFuY2UgdG8gZmluZCBuZXh0IHJ1bi4gKi8KLQkJbG8gKz0gbjsKLQkJbnJlbWFpbmluZyAtPSBuOwotCX0gd2hpbGUgKG5yZW1haW5pbmcpOwotCWFzc2VydChsbyA9PSBoaSk7CisgICAgICAgIC8qIElkZW50aWZ5IG5leHQgcnVuLiAqLworICAgICAgICBuID0gY291bnRfcnVuKGxvLCBoaSwgY29tcGFyZSwgJmRlc2NlbmRpbmcpOworICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGlmIChkZXNjZW5kaW5nKQorICAgICAgICAgICAgcmV2ZXJzZV9zbGljZShsbywgbG8gKyBuKTsKKyAgICAgICAgLyogSWYgc2hvcnQsIGV4dGVuZCB0byBtaW4obWlucnVuLCBucmVtYWluaW5nKS4gKi8KKyAgICAgICAgaWYgKG4gPCBtaW5ydW4pIHsKKyAgICAgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgZm9yY2UgPSBucmVtYWluaW5nIDw9IG1pbnJ1biA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucmVtYWluaW5nIDogbWlucnVuOworICAgICAgICAgICAgaWYgKGJpbmFyeXNvcnQobG8sIGxvICsgZm9yY2UsIGxvICsgbiwgY29tcGFyZSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIG4gPSBmb3JjZTsKKyAgICAgICAgfQorICAgICAgICAvKiBQdXNoIHJ1biBvbnRvIHBlbmRpbmctcnVucyBzdGFjaywgYW5kIG1heWJlIG1lcmdlLiAqLworICAgICAgICBhc3NlcnQobXMubiA8IE1BWF9NRVJHRV9QRU5ESU5HKTsKKyAgICAgICAgbXMucGVuZGluZ1ttcy5uXS5iYXNlID0gbG87CisgICAgICAgIG1zLnBlbmRpbmdbbXMubl0ubGVuID0gbjsKKyAgICAgICAgKyttcy5uOworICAgICAgICBpZiAobWVyZ2VfY29sbGFwc2UoJm1zKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIC8qIEFkdmFuY2UgdG8gZmluZCBuZXh0IHJ1bi4gKi8KKyAgICAgICAgbG8gKz0gbjsKKyAgICAgICAgbnJlbWFpbmluZyAtPSBuOworICAgIH0gd2hpbGUgKG5yZW1haW5pbmcpOworICAgIGFzc2VydChsbyA9PSBoaSk7CiAKLQlpZiAobWVyZ2VfZm9yY2VfY29sbGFwc2UoJm1zKSA8IDApCi0JCWdvdG8gZmFpbDsKLQlhc3NlcnQobXMubiA9PSAxKTsKLQlhc3NlcnQobXMucGVuZGluZ1swXS5iYXNlID09IHNhdmVkX29iX2l0ZW0pOwotCWFzc2VydChtcy5wZW5kaW5nWzBdLmxlbiA9PSBzYXZlZF9vYl9zaXplKTsKKyAgICBpZiAobWVyZ2VfZm9yY2VfY29sbGFwc2UoJm1zKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBhc3NlcnQobXMubiA9PSAxKTsKKyAgICBhc3NlcnQobXMucGVuZGluZ1swXS5iYXNlID09IHNhdmVkX29iX2l0ZW0pOworICAgIGFzc2VydChtcy5wZW5kaW5nWzBdLmxlbiA9PSBzYXZlZF9vYl9zaXplKTsKIAogc3VjY2VlZDoKLQlyZXN1bHQgPSBQeV9Ob25lOworICAgIHJlc3VsdCA9IFB5X05vbmU7CiBmYWlsOgotCWlmIChrZXlmdW5jICE9IE5VTEwpIHsKLQkJZm9yIChpPTAgOyBpIDwgc2F2ZWRfb2Jfc2l6ZSA7IGkrKykgewotCQkJa3ZwYWlyID0gc2F2ZWRfb2JfaXRlbVtpXTsKLQkJCXZhbHVlID0gc29ydHdyYXBwZXJfZ2V0dmFsdWUoa3ZwYWlyKTsKLQkJCXNhdmVkX29iX2l0ZW1baV0gPSB2YWx1ZTsKLQkJCVB5X0RFQ1JFRihrdnBhaXIpOwotCQl9Ci0JfQorICAgIGlmIChrZXlmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpPTAgOyBpIDwgc2F2ZWRfb2Jfc2l6ZSA7IGkrKykgeworICAgICAgICAgICAga3ZwYWlyID0gc2F2ZWRfb2JfaXRlbVtpXTsKKyAgICAgICAgICAgIHZhbHVlID0gc29ydHdyYXBwZXJfZ2V0dmFsdWUoa3ZwYWlyKTsKKyAgICAgICAgICAgIHNhdmVkX29iX2l0ZW1baV0gPSB2YWx1ZTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrdnBhaXIpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHNlbGYtPmFsbG9jYXRlZCAhPSAtMSAmJiByZXN1bHQgIT0gTlVMTCkgewotCQkvKiBUaGUgdXNlciBtdWNrZWQgd2l0aCB0aGUgbGlzdCBkdXJpbmcgdGhlIHNvcnQsCi0JCSAqIGFuZCB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYW5vdGhlciBlcnJvciB0byByZXBvcnQuCi0JCSAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxpc3QgbW9kaWZpZWQgZHVyaW5nIHNvcnQiKTsKLQkJcmVzdWx0ID0gTlVMTDsKLQl9CisgICAgaWYgKHNlbGYtPmFsbG9jYXRlZCAhPSAtMSAmJiByZXN1bHQgIT0gTlVMTCkgeworICAgICAgICAvKiBUaGUgdXNlciBtdWNrZWQgd2l0aCB0aGUgbGlzdCBkdXJpbmcgdGhlIHNvcnQsCisgICAgICAgICAqIGFuZCB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYW5vdGhlciBlcnJvciB0byByZXBvcnQuCisgICAgICAgICAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxpc3QgbW9kaWZpZWQgZHVyaW5nIHNvcnQiKTsKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICB9CiAKLQlpZiAocmV2ZXJzZSAmJiBzYXZlZF9vYl9zaXplID4gMSkKLQkJcmV2ZXJzZV9zbGljZShzYXZlZF9vYl9pdGVtLCBzYXZlZF9vYl9pdGVtICsgc2F2ZWRfb2Jfc2l6ZSk7CisgICAgaWYgKHJldmVyc2UgJiYgc2F2ZWRfb2Jfc2l6ZSA+IDEpCisgICAgICAgIHJldmVyc2Vfc2xpY2Uoc2F2ZWRfb2JfaXRlbSwgc2F2ZWRfb2JfaXRlbSArIHNhdmVkX29iX3NpemUpOwogCi0JbWVyZ2VfZnJlZW1lbSgmbXMpOworICAgIG1lcmdlX2ZyZWVtZW0oJm1zKTsKIAogZHN1X2ZhaWw6Ci0JZmluYWxfb2JfaXRlbSA9IHNlbGYtPm9iX2l0ZW07Ci0JaSA9IFB5X1NJWkUoc2VsZik7Ci0JUHlfU0laRShzZWxmKSA9IHNhdmVkX29iX3NpemU7Ci0Jc2VsZi0+b2JfaXRlbSA9IHNhdmVkX29iX2l0ZW07Ci0Jc2VsZi0+YWxsb2NhdGVkID0gc2F2ZWRfYWxsb2NhdGVkOwotCWlmIChmaW5hbF9vYl9pdGVtICE9IE5VTEwpIHsKLQkJLyogd2UgY2Fubm90IHVzZSBsaXN0X2NsZWFyKCkgZm9yIHRoaXMgYmVjYXVzZSBpdCBkb2VzIG5vdAotCQkgICBndWFyYW50ZWUgdGhhdCB0aGUgbGlzdCBpcyByZWFsbHkgZW1wdHkgd2hlbiBpdCByZXR1cm5zICovCi0JCXdoaWxlICgtLWkgPj0gMCkgewotCQkJUHlfWERFQ1JFRihmaW5hbF9vYl9pdGVtW2ldKTsKLQkJfQotCQlQeU1lbV9GUkVFKGZpbmFsX29iX2l0ZW0pOwotCX0KLQlQeV9YREVDUkVGKGNvbXBhcmUpOwotCVB5X1hJTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGZpbmFsX29iX2l0ZW0gPSBzZWxmLT5vYl9pdGVtOworICAgIGkgPSBQeV9TSVpFKHNlbGYpOworICAgIFB5X1NJWkUoc2VsZikgPSBzYXZlZF9vYl9zaXplOworICAgIHNlbGYtPm9iX2l0ZW0gPSBzYXZlZF9vYl9pdGVtOworICAgIHNlbGYtPmFsbG9jYXRlZCA9IHNhdmVkX2FsbG9jYXRlZDsKKyAgICBpZiAoZmluYWxfb2JfaXRlbSAhPSBOVUxMKSB7CisgICAgICAgIC8qIHdlIGNhbm5vdCB1c2UgbGlzdF9jbGVhcigpIGZvciB0aGlzIGJlY2F1c2UgaXQgZG9lcyBub3QKKyAgICAgICAgICAgZ3VhcmFudGVlIHRoYXQgdGhlIGxpc3QgaXMgcmVhbGx5IGVtcHR5IHdoZW4gaXQgcmV0dXJucyAqLworICAgICAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoZmluYWxfb2JfaXRlbVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgUHlNZW1fRlJFRShmaW5hbF9vYl9pdGVtKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihjb21wYXJlKTsKKyAgICBQeV9YSU5DUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KICN1bmRlZiBJRkxUCiAjdW5kZWYgSVNMVApAQCAtMjIwOCwyNDggKzIyMDgsMjQ4IEBACiBpbnQKIFB5TGlzdF9Tb3J0KFB5T2JqZWN0ICp2KQogewotCWlmICh2ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl2ID0gbGlzdHNvcnQoKFB5TGlzdE9iamVjdCAqKXYsIChQeU9iamVjdCAqKU5VTEwsIChQeU9iamVjdCAqKU5VTEwpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHYgPSBsaXN0c29ydCgoUHlMaXN0T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopTlVMTCwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RyZXZlcnNlKFB5TGlzdE9iamVjdCAqc2VsZikKIHsKLQlpZiAoUHlfU0laRShzZWxmKSA+IDEpCi0JCXJldmVyc2Vfc2xpY2Uoc2VsZi0+b2JfaXRlbSwgc2VsZi0+b2JfaXRlbSArIFB5X1NJWkUoc2VsZikpOwotCVB5X1JFVFVSTl9OT05FOworICAgIGlmIChQeV9TSVpFKHNlbGYpID4gMSkKKyAgICAgICAgcmV2ZXJzZV9zbGljZShzZWxmLT5vYl9pdGVtLCBzZWxmLT5vYl9pdGVtICsgUHlfU0laRShzZWxmKSk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIGludAogUHlMaXN0X1JldmVyc2UoUHlPYmplY3QgKnYpCiB7Ci0JUHlMaXN0T2JqZWN0ICpzZWxmID0gKFB5TGlzdE9iamVjdCAqKXY7CisgICAgUHlMaXN0T2JqZWN0ICpzZWxmID0gKFB5TGlzdE9iamVjdCAqKXY7CiAKLQlpZiAodiA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodikpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKFB5X1NJWkUoc2VsZikgPiAxKQotCQlyZXZlcnNlX3NsaWNlKHNlbGYtPm9iX2l0ZW0sIHNlbGYtPm9iX2l0ZW0gKyBQeV9TSVpFKHNlbGYpKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodiA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sodikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKFB5X1NJWkUoc2VsZikgPiAxKQorICAgICAgICByZXZlcnNlX3NsaWNlKHNlbGYtPm9iX2l0ZW0sIHNlbGYtPm9iX2l0ZW0gKyBQeV9TSVpFKHNlbGYpKTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogUHlMaXN0X0FzVHVwbGUoUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKnc7Ci0JUHlPYmplY3QgKipwLCAqKnE7Ci0JUHlfc3NpemVfdCBuOwotCWlmICh2ID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayh2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW4gPSBQeV9TSVpFKHYpOwotCXcgPSBQeVR1cGxlX05ldyhuKTsKLQlpZiAodyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gKChQeVR1cGxlT2JqZWN0ICopdyktPm9iX2l0ZW07Ci0JcSA9ICgoUHlMaXN0T2JqZWN0ICopdiktPm9iX2l0ZW07Ci0Jd2hpbGUgKC0tbiA+PSAwKSB7Ci0JCVB5X0lOQ1JFRigqcSk7Ci0JCSpwID0gKnE7Ci0JCXArKzsKLQkJcSsrOwotCX0KLQlyZXR1cm4gdzsKKyAgICBQeU9iamVjdCAqdzsKKyAgICBQeU9iamVjdCAqKnAsICoqcTsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgaWYgKHYgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbiA9IFB5X1NJWkUodik7CisgICAgdyA9IFB5VHVwbGVfTmV3KG4pOworICAgIGlmICh3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSAoKFB5VHVwbGVPYmplY3QgKil3KS0+b2JfaXRlbTsKKyAgICBxID0gKChQeUxpc3RPYmplY3QgKil2KS0+b2JfaXRlbTsKKyAgICB3aGlsZSAoLS1uID49IDApIHsKKyAgICAgICAgUHlfSU5DUkVGKCpxKTsKKyAgICAgICAgKnAgPSAqcTsKKyAgICAgICAgcCsrOworICAgICAgICBxKys7CisgICAgfQorICAgIHJldHVybiB3OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdGluZGV4KFB5TGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoc2VsZik7Ci0JUHlPYmplY3QgKnY7CisgICAgUHlfc3NpemVfdCBpLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoc2VsZik7CisgICAgUHlPYmplY3QgKnY7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjppbmRleCIsICZ2LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RvcCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChzdGFydCA8IDApIHsKLQkJc3RhcnQgKz0gUHlfU0laRShzZWxmKTsKLQkJaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0ID0gMDsKLQl9Ci0JaWYgKHN0b3AgPCAwKSB7Ci0JCXN0b3AgKz0gUHlfU0laRShzZWxmKTsKLQkJaWYgKHN0b3AgPCAwKQotCQkJc3RvcCA9IDA7Ci0JfQotCWZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcCAmJiBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOwotCQlpZiAoY21wID4gMCkKLQkJCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChpKTsKLQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxpc3QuaW5kZXgoeCk6IHggbm90IGluIGxpc3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjppbmRleCIsICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RvcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzdGFydCA8IDApIHsKKyAgICAgICAgc3RhcnQgKz0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICB9CisgICAgaWYgKHN0b3AgPCAwKSB7CisgICAgICAgIHN0b3AgKz0gUHlfU0laRShzZWxmKTsKKyAgICAgICAgaWYgKHN0b3AgPCAwKQorICAgICAgICAgICAgc3RvcCA9IDA7CisgICAgfQorICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcCAmJiBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOworICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChpKTsKKyAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxpc3QuaW5kZXgoeCk6IHggbm90IGluIGxpc3QiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3Rjb3VudChQeUxpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgY291bnQgPSAwOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7Ci0JCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOwotCQlpZiAoY21wID4gMCkKLQkJCWNvdW50Kys7Ci0JCWVsc2UgaWYgKGNtcCA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOworICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RyZW1vdmUoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgewotCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGYtPm9iX2l0ZW1baV0sIHYsIFB5X0VRKTsKLQkJaWYgKGNtcCA+IDApIHsKLQkJCWlmIChsaXN0X2Fzc19zbGljZShzZWxmLCBpLCBpKzEsCi0JCQkJCSAgIChQeU9iamVjdCAqKU5VTEwpID09IDApCi0JCQkJUHlfUkVUVVJOX05PTkU7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQllbHNlIGlmIChjbXAgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibGlzdC5yZW1vdmUoeCk6IHggbm90IGluIGxpc3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShzZWxmKTsgaSsrKSB7CisgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woc2VsZi0+b2JfaXRlbVtpXSwgdiwgUHlfRVEpOworICAgICAgICBpZiAoY21wID4gMCkgeworICAgICAgICAgICAgaWYgKGxpc3RfYXNzX3NsaWNlKHNlbGYsIGksIGkrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilOVUxMKSA9PSAwKQorICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxpc3QucmVtb3ZlKHgpOiB4IG5vdCBpbiBsaXN0Iik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKIGxpc3RfdHJhdmVyc2UoUHlMaXN0T2JqZWN0ICpvLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpID0gUHlfU0laRShvKTsgLS1pID49IDA7ICkKLQkJUHlfVklTSVQoby0+b2JfaXRlbVtpXSk7Ci0JcmV0dXJuIDA7CisgICAgZm9yIChpID0gUHlfU0laRShvKTsgLS1pID49IDA7ICkKKyAgICAgICAgUHlfVklTSVQoby0+b2JfaXRlbVtpXSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X3JpY2hjb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5TGlzdE9iamVjdCAqdmwsICp3bDsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlMaXN0T2JqZWN0ICp2bCwgKndsOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmICghUHlMaXN0X0NoZWNrKHYpIHx8ICFQeUxpc3RfQ2hlY2sodykpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KKyAgICBpZiAoIVB5TGlzdF9DaGVjayh2KSB8fCAhUHlMaXN0X0NoZWNrKHcpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CiAKLQl2bCA9IChQeUxpc3RPYmplY3QgKil2OwotCXdsID0gKFB5TGlzdE9iamVjdCAqKXc7CisgICAgdmwgPSAoUHlMaXN0T2JqZWN0ICopdjsKKyAgICB3bCA9IChQeUxpc3RPYmplY3QgKil3OwogCi0JaWYgKFB5X1NJWkUodmwpICE9IFB5X1NJWkUod2wpICYmIChvcCA9PSBQeV9FUSB8fCBvcCA9PSBQeV9ORSkpIHsKLQkJLyogU2hvcnRjdXQ6IGlmIHRoZSBsZW5ndGhzIGRpZmZlciwgdGhlIGxpc3RzIGRpZmZlciAqLwotCQlQeU9iamVjdCAqcmVzOwotCQlpZiAob3AgPT0gUHlfRVEpCi0JCQlyZXMgPSBQeV9GYWxzZTsKLQkJZWxzZQotCQkJcmVzID0gUHlfVHJ1ZTsKLQkJUHlfSU5DUkVGKHJlcyk7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIGlmIChQeV9TSVpFKHZsKSAhPSBQeV9TSVpFKHdsKSAmJiAob3AgPT0gUHlfRVEgfHwgb3AgPT0gUHlfTkUpKSB7CisgICAgICAgIC8qIFNob3J0Y3V0OiBpZiB0aGUgbGVuZ3RocyBkaWZmZXIsIHRoZSBsaXN0cyBkaWZmZXIgKi8KKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgaWYgKG9wID09IFB5X0VRKQorICAgICAgICAgICAgcmVzID0gUHlfRmFsc2U7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFB5X1RydWU7CisgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCS8qIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGluZGV4IHdoZXJlIGl0ZW1zIGFyZSBkaWZmZXJlbnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh2bCkgJiYgaSA8IFB5X1NJWkUod2wpOyBpKyspIHsKLQkJaW50IGsgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodmwtPm9iX2l0ZW1baV0sCi0JCQkJCQkgd2wtPm9iX2l0ZW1baV0sIFB5X0VRKTsKLQkJaWYgKGsgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICghaykKLQkJCWJyZWFrOwotCX0KKyAgICAvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBpdGVtcyBhcmUgZGlmZmVyZW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUodmwpICYmIGkgPCBQeV9TSVpFKHdsKTsgaSsrKSB7CisgICAgICAgIGludCBrID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHZsLT5vYl9pdGVtW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bC0+b2JfaXRlbVtpXSwgUHlfRVEpOworICAgICAgICBpZiAoayA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFrKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogCi0JaWYgKGkgPj0gUHlfU0laRSh2bCkgfHwgaSA+PSBQeV9TSVpFKHdsKSkgewotCQkvKiBObyBtb3JlIGl0ZW1zIHRvIGNvbXBhcmUgLS0gY29tcGFyZSBzaXplcyAqLwotCQlQeV9zc2l6ZV90IHZzID0gUHlfU0laRSh2bCk7Ci0JCVB5X3NzaXplX3Qgd3MgPSBQeV9TSVpFKHdsKTsKLQkJaW50IGNtcDsKLQkJUHlPYmplY3QgKnJlczsKLQkJc3dpdGNoIChvcCkgewotCQljYXNlIFB5X0xUOiBjbXAgPSB2cyA8ICB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfTEU6IGNtcCA9IHZzIDw9IHdzOyBicmVhazsKLQkJY2FzZSBQeV9FUTogY21wID0gdnMgPT0gd3M7IGJyZWFrOwotCQljYXNlIFB5X05FOiBjbXAgPSB2cyAhPSB3czsgYnJlYWs7Ci0JCWNhc2UgUHlfR1Q6IGNtcCA9IHZzID4gIHdzOyBicmVhazsKLQkJY2FzZSBQeV9HRTogY21wID0gdnMgPj0gd3M7IGJyZWFrOwotCQlkZWZhdWx0OiByZXR1cm4gTlVMTDsgLyogY2Fubm90IGhhcHBlbiAqLwotCQl9Ci0JCWlmIChjbXApCi0JCQlyZXMgPSBQeV9UcnVlOwotCQllbHNlCi0JCQlyZXMgPSBQeV9GYWxzZTsKLQkJUHlfSU5DUkVGKHJlcyk7Ci0JCXJldHVybiByZXM7Ci0JfQorICAgIGlmIChpID49IFB5X1NJWkUodmwpIHx8IGkgPj0gUHlfU0laRSh3bCkpIHsKKyAgICAgICAgLyogTm8gbW9yZSBpdGVtcyB0byBjb21wYXJlIC0tIGNvbXBhcmUgc2l6ZXMgKi8KKyAgICAgICAgUHlfc3NpemVfdCB2cyA9IFB5X1NJWkUodmwpOworICAgICAgICBQeV9zc2l6ZV90IHdzID0gUHlfU0laRSh3bCk7CisgICAgICAgIGludCBjbXA7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIHN3aXRjaCAob3ApIHsKKyAgICAgICAgY2FzZSBQeV9MVDogY21wID0gdnMgPCAgd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0xFOiBjbXAgPSB2cyA8PSB3czsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfRVE6IGNtcCA9IHZzID09IHdzOyBicmVhazsKKyAgICAgICAgY2FzZSBQeV9ORTogY21wID0gdnMgIT0gd3M7IGJyZWFrOworICAgICAgICBjYXNlIFB5X0dUOiBjbXAgPSB2cyA+ICB3czsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfR0U6IGNtcCA9IHZzID49IHdzOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7IC8qIGNhbm5vdCBoYXBwZW4gKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoY21wKQorICAgICAgICAgICAgcmVzID0gUHlfVHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gUHlfRmFsc2U7CisgICAgICAgIFB5X0lOQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCS8qIFdlIGhhdmUgYW4gaXRlbSB0aGF0IGRpZmZlcnMgLS0gc2hvcnRjdXRzIGZvciBFUS9ORSAqLwotCWlmIChvcCA9PSBQeV9FUSkgewotCQlQeV9JTkNSRUYoUHlfRmFsc2UpOwotCQlyZXR1cm4gUHlfRmFsc2U7Ci0JfQotCWlmIChvcCA9PSBQeV9ORSkgewotCQlQeV9JTkNSRUYoUHlfVHJ1ZSk7Ci0JCXJldHVybiBQeV9UcnVlOwotCX0KKyAgICAvKiBXZSBoYXZlIGFuIGl0ZW0gdGhhdCBkaWZmZXJzIC0tIHNob3J0Y3V0cyBmb3IgRVEvTkUgKi8KKyAgICBpZiAob3AgPT0gUHlfRVEpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X0ZhbHNlKTsKKyAgICAgICAgcmV0dXJuIFB5X0ZhbHNlOworICAgIH0KKyAgICBpZiAob3AgPT0gUHlfTkUpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X1RydWUpOworICAgICAgICByZXR1cm4gUHlfVHJ1ZTsKKyAgICB9CiAKLQkvKiBDb21wYXJlIHRoZSBmaW5hbCBpdGVtIGFnYWluIHVzaW5nIHRoZSBwcm9wZXIgb3BlcmF0b3IgKi8KLQlyZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUodmwtPm9iX2l0ZW1baV0sIHdsLT5vYl9pdGVtW2ldLCBvcCk7CisgICAgLyogQ29tcGFyZSB0aGUgZmluYWwgaXRlbSBhZ2FpbiB1c2luZyB0aGUgcHJvcGVyIG9wZXJhdG9yICovCisgICAgcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKHZsLT5vYl9pdGVtW2ldLCB3bC0+b2JfaXRlbVtpXSwgb3ApOwogfQogCiBzdGF0aWMgaW50CiBsaXN0X2luaXQoUHlMaXN0T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICphcmcgPSBOVUxMOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2VxdWVuY2UiLCAwfTsKKyAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcXVlbmNlIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxPOmxpc3QiLCBrd2xpc3QsICZhcmcpKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8TzpsaXN0Iiwga3dsaXN0LCAmYXJnKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JLyogVmVyaWZ5IGxpc3QgaW52YXJpYW50cyBlc3RhYmxpc2hlZCBieSBQeVR5cGVfR2VuZXJpY0FsbG9jKCkgKi8KLQlhc3NlcnQoMCA8PSBQeV9TSVpFKHNlbGYpKTsKLQlhc3NlcnQoUHlfU0laRShzZWxmKSA8PSBzZWxmLT5hbGxvY2F0ZWQgfHwgc2VsZi0+YWxsb2NhdGVkID09IC0xKTsKLQlhc3NlcnQoc2VsZi0+b2JfaXRlbSAhPSBOVUxMIHx8Ci0JICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9PSAwIHx8IHNlbGYtPmFsbG9jYXRlZCA9PSAtMSk7CisgICAgLyogVmVyaWZ5IGxpc3QgaW52YXJpYW50cyBlc3RhYmxpc2hlZCBieSBQeVR5cGVfR2VuZXJpY0FsbG9jKCkgKi8KKyAgICBhc3NlcnQoMCA8PSBQeV9TSVpFKHNlbGYpKTsKKyAgICBhc3NlcnQoUHlfU0laRShzZWxmKSA8PSBzZWxmLT5hbGxvY2F0ZWQgfHwgc2VsZi0+YWxsb2NhdGVkID09IC0xKTsKKyAgICBhc3NlcnQoc2VsZi0+b2JfaXRlbSAhPSBOVUxMIHx8CisgICAgICAgICAgIHNlbGYtPmFsbG9jYXRlZCA9PSAwIHx8IHNlbGYtPmFsbG9jYXRlZCA9PSAtMSk7CiAKLQkvKiBFbXB0eSBwcmV2aW91cyBjb250ZW50cyAqLwotCWlmIChzZWxmLT5vYl9pdGVtICE9IE5VTEwpIHsKLQkJKHZvaWQpbGlzdF9jbGVhcihzZWxmKTsKLQl9Ci0JaWYgKGFyZyAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpydiA9IGxpc3RleHRlbmQoc2VsZiwgYXJnKTsKLQkJaWYgKHJ2ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfQotCXJldHVybiAwOworICAgIC8qIEVtcHR5IHByZXZpb3VzIGNvbnRlbnRzICovCisgICAgaWYgKHNlbGYtPm9iX2l0ZW0gIT0gTlVMTCkgeworICAgICAgICAodm9pZClsaXN0X2NsZWFyKHNlbGYpOworICAgIH0KKyAgICBpZiAoYXJnICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKnJ2ID0gbGlzdGV4dGVuZChzZWxmLCBhcmcpOworICAgICAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X3NpemVvZihQeUxpc3RPYmplY3QgKnNlbGYpCiB7Ci0JUHlfc3NpemVfdCByZXM7CisgICAgUHlfc3NpemVfdCByZXM7CiAKLQlyZXMgPSBzaXplb2YoUHlMaXN0T2JqZWN0KSArIHNlbGYtPmFsbG9jYXRlZCAqIHNpemVvZih2b2lkKik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CisgICAgcmVzID0gc2l6ZW9mKFB5TGlzdE9iamVjdCkgKyBzZWxmLT5hbGxvY2F0ZWQgKiBzaXplb2Yodm9pZCopOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKmxpc3RfaXRlcihQeU9iamVjdCAqc2VxKTsKQEAgLTI0ODcsMzIgKzI0ODcsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqbGlzdF9zdWJzY3JpcHQoUHlMaXN0T2JqZWN0KiwgUHlPYmplY3QqKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIGxpc3RfbWV0aG9kc1tdID0gewotCXsiX19nZXRpdGVtX18iLCAoUHlDRnVuY3Rpb24pbGlzdF9zdWJzY3JpcHQsIE1FVEhfT3xNRVRIX0NPRVhJU1QsIGdldGl0ZW1fZG9jfSwKLQl7Il9fcmV2ZXJzZWRfXyIsKFB5Q0Z1bmN0aW9uKWxpc3RfcmV2ZXJzZWQsIE1FVEhfTk9BUkdTLCByZXZlcnNlZF9kb2N9LAotCXsiX19zaXplb2ZfXyIsICAoUHlDRnVuY3Rpb24pbGlzdF9zaXplb2YsIE1FVEhfTk9BUkdTLCBzaXplb2ZfZG9jfSwKLQl7ImFwcGVuZCIsCShQeUNGdW5jdGlvbilsaXN0YXBwZW5kLCAgTUVUSF9PLCBhcHBlbmRfZG9jfSwKLQl7Imluc2VydCIsCShQeUNGdW5jdGlvbilsaXN0aW5zZXJ0LCAgTUVUSF9WQVJBUkdTLCBpbnNlcnRfZG9jfSwKLQl7ImV4dGVuZCIsICAgICAgKFB5Q0Z1bmN0aW9uKWxpc3RleHRlbmQsICBNRVRIX08sIGV4dGVuZF9kb2N9LAotCXsicG9wIiwJCShQeUNGdW5jdGlvbilsaXN0cG9wLCAJICBNRVRIX1ZBUkFSR1MsIHBvcF9kb2N9LAotCXsicmVtb3ZlIiwJKFB5Q0Z1bmN0aW9uKWxpc3RyZW1vdmUsICBNRVRIX08sIHJlbW92ZV9kb2N9LAotCXsiaW5kZXgiLAkoUHlDRnVuY3Rpb24pbGlzdGluZGV4LCAgIE1FVEhfVkFSQVJHUywgaW5kZXhfZG9jfSwKLQl7ImNvdW50IiwJKFB5Q0Z1bmN0aW9uKWxpc3Rjb3VudCwgICBNRVRIX08sIGNvdW50X2RvY30sCi0JeyJyZXZlcnNlIiwJKFB5Q0Z1bmN0aW9uKWxpc3RyZXZlcnNlLCBNRVRIX05PQVJHUywgcmV2ZXJzZV9kb2N9LAotCXsic29ydCIsCShQeUNGdW5jdGlvbilsaXN0c29ydCwgCSAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgc29ydF9kb2N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19nZXRpdGVtX18iLCAoUHlDRnVuY3Rpb24pbGlzdF9zdWJzY3JpcHQsIE1FVEhfT3xNRVRIX0NPRVhJU1QsIGdldGl0ZW1fZG9jfSwKKyAgICB7Il9fcmV2ZXJzZWRfXyIsKFB5Q0Z1bmN0aW9uKWxpc3RfcmV2ZXJzZWQsIE1FVEhfTk9BUkdTLCByZXZlcnNlZF9kb2N9LAorICAgIHsiX19zaXplb2ZfXyIsICAoUHlDRnVuY3Rpb24pbGlzdF9zaXplb2YsIE1FVEhfTk9BUkdTLCBzaXplb2ZfZG9jfSwKKyAgICB7ImFwcGVuZCIsICAgICAgICAgIChQeUNGdW5jdGlvbilsaXN0YXBwZW5kLCAgTUVUSF9PLCBhcHBlbmRfZG9jfSwKKyAgICB7Imluc2VydCIsICAgICAgICAgIChQeUNGdW5jdGlvbilsaXN0aW5zZXJ0LCAgTUVUSF9WQVJBUkdTLCBpbnNlcnRfZG9jfSwKKyAgICB7ImV4dGVuZCIsICAgICAgKFB5Q0Z1bmN0aW9uKWxpc3RleHRlbmQsICBNRVRIX08sIGV4dGVuZF9kb2N9LAorICAgIHsicG9wIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxpc3Rwb3AsICAgICBNRVRIX1ZBUkFSR1MsIHBvcF9kb2N9LAorICAgIHsicmVtb3ZlIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxpc3RyZW1vdmUsICBNRVRIX08sIHJlbW92ZV9kb2N9LAorICAgIHsiaW5kZXgiLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxpc3RpbmRleCwgICBNRVRIX1ZBUkFSR1MsIGluZGV4X2RvY30sCisgICAgeyJjb3VudCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pbGlzdGNvdW50LCAgIE1FVEhfTywgY291bnRfZG9jfSwKKyAgICB7InJldmVyc2UiLCAgICAgICAgIChQeUNGdW5jdGlvbilsaXN0cmV2ZXJzZSwgTUVUSF9OT0FSR1MsIHJldmVyc2VfZG9jfSwKKyAgICB7InNvcnQiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilsaXN0c29ydCwgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgc29ydF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgbGlzdF9hc19zZXF1ZW5jZSA9IHsKLQkobGVuZnVuYylsaXN0X2xlbmd0aCwJCQkvKiBzcV9sZW5ndGggKi8KLQkoYmluYXJ5ZnVuYylsaXN0X2NvbmNhdCwJCS8qIHNxX2NvbmNhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpbGlzdF9yZXBlYXQsCQkvKiBzcV9yZXBlYXQgKi8KLQkoc3NpemVhcmdmdW5jKWxpc3RfaXRlbSwJCS8qIHNxX2l0ZW0gKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpbGlzdF9zbGljZSwJCS8qIHNxX3NsaWNlICovCi0JKHNzaXplb2JqYXJncHJvYylsaXN0X2Fzc19pdGVtLAkJLyogc3FfYXNzX2l0ZW0gKi8KLQkoc3NpemVzc2l6ZW9iamFyZ3Byb2MpbGlzdF9hc3Nfc2xpY2UsCS8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKWxpc3RfY29udGFpbnMsCQkvKiBzcV9jb250YWlucyAqLwotCShiaW5hcnlmdW5jKWxpc3RfaW5wbGFjZV9jb25jYXQsCS8qIHNxX2lucGxhY2VfY29uY2F0ICovCi0JKHNzaXplYXJnZnVuYylsaXN0X2lucGxhY2VfcmVwZWF0LAkvKiBzcV9pbnBsYWNlX3JlcGVhdCAqLworICAgIChsZW5mdW5jKWxpc3RfbGVuZ3RoLCAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfbGVuZ3RoICovCisgICAgKGJpbmFyeWZ1bmMpbGlzdF9jb25jYXQsICAgICAgICAgICAgICAgICAgICAvKiBzcV9jb25jYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKWxpc3RfcmVwZWF0LCAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdCAqLworICAgIChzc2l6ZWFyZ2Z1bmMpbGlzdF9pdGVtLCAgICAgICAgICAgICAgICAgICAgLyogc3FfaXRlbSAqLworICAgIChzc2l6ZXNzaXplYXJnZnVuYylsaXN0X3NsaWNlLCAgICAgICAgICAgICAgLyogc3Ffc2xpY2UgKi8KKyAgICAoc3NpemVvYmphcmdwcm9jKWxpc3RfYXNzX2l0ZW0sICAgICAgICAgICAgIC8qIHNxX2Fzc19pdGVtICovCisgICAgKHNzaXplc3NpemVvYmphcmdwcm9jKWxpc3RfYXNzX3NsaWNlLCAgICAgICAvKiBzcV9hc3Nfc2xpY2UgKi8KKyAgICAob2Jqb2JqcHJvYylsaXN0X2NvbnRhaW5zLCAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbnRhaW5zICovCisgICAgKGJpbmFyeWZ1bmMpbGlzdF9pbnBsYWNlX2NvbmNhdCwgICAgICAgICAgICAvKiBzcV9pbnBsYWNlX2NvbmNhdCAqLworICAgIChzc2l6ZWFyZ2Z1bmMpbGlzdF9pbnBsYWNlX3JlcGVhdCwgICAgICAgICAgLyogc3FfaW5wbGFjZV9yZXBlYXQgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihsaXN0X2RvYywKQEAgLTI1MjMsMjc1ICsyNTIzLDI3NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3Rfc3Vic2NyaXB0KFB5TGlzdE9iamVjdCogc2VsZiwgUHlPYmplY3QqIGl0ZW0pCiB7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpOwotCQlpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gUHlMaXN0X0dFVF9TSVpFKHNlbGYpOwotCQlyZXR1cm4gbGlzdF9pdGVtKHNlbGYsIGkpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoLCBjdXIsIGk7Ci0JCVB5T2JqZWN0KiByZXN1bHQ7Ci0JCVB5T2JqZWN0KiBpdDsKLQkJUHlPYmplY3QgKipzcmMsICoqZGVzdDsKKyAgICBpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgIGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgaSArPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7CisgICAgICAgIHJldHVybiBsaXN0X2l0ZW0oc2VsZiwgaSk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGgsIGN1ciwgaTsKKyAgICAgICAgUHlPYmplY3QqIHJlc3VsdDsKKyAgICAgICAgUHlPYmplY3QqIGl0OworICAgICAgICBQeU9iamVjdCAqKnNyYywgKipkZXN0OwogCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwgUHlfU0laRShzZWxmKSwKLQkJCQkgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIFB5X1NJWkUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmc3RvcCwgJnN0ZXAsICZzbGljZWxlbmd0aCkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWlmIChzbGljZWxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gUHlMaXN0X05ldygwKTsKLQkJfQotCQllbHNlIGlmIChzdGVwID09IDEpIHsKLQkJCXJldHVybiBsaXN0X3NsaWNlKHNlbGYsIHN0YXJ0LCBzdG9wKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IFB5TGlzdF9OZXcoc2xpY2VsZW5ndGgpOwotCQkJaWYgKCFyZXN1bHQpIHJldHVybiBOVUxMOworICAgICAgICBpZiAoc2xpY2VsZW5ndGggPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFB5TGlzdF9OZXcoMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RlcCA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gbGlzdF9zbGljZShzZWxmLCBzdGFydCwgc3RvcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBQeUxpc3RfTmV3KHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gTlVMTDsKIAotCQkJc3JjID0gc2VsZi0+b2JfaXRlbTsKLQkJCWRlc3QgPSAoKFB5TGlzdE9iamVjdCAqKXJlc3VsdCktPm9iX2l0ZW07Ci0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOwotCQkJICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7Ci0JCQkJaXQgPSBzcmNbY3VyXTsKLQkJCQlQeV9JTkNSRUYoaXQpOwotCQkJCWRlc3RbaV0gPSBpdDsKLQkJCX0KKyAgICAgICAgICAgIHNyYyA9IHNlbGYtPm9iX2l0ZW07CisgICAgICAgICAgICBkZXN0ID0gKChQeUxpc3RPYmplY3QgKilyZXN1bHQpLT5vYl9pdGVtOworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIGl0ID0gc3JjW2N1cl07CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gaXQ7CisgICAgICAgICAgICB9CiAKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCi0JCQkgICAgIGl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGxpc3RfYXNzX3N1YnNjcmlwdChQeUxpc3RPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBpdGVtLCBQeU9iamVjdCogdmFsdWUpCiB7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoaSA8IDApCi0JCQlpICs9IFB5TGlzdF9HRVRfU0laRShzZWxmKTsKLQkJcmV0dXJuIGxpc3RfYXNzX2l0ZW0oc2VsZiwgaSwgdmFsdWUpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoOworICAgIGlmIChQeUluZGV4X0NoZWNrKGl0ZW0pKSB7CisgICAgICAgIFB5X3NzaXplX3QgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBQeUV4Y19JbmRleEVycm9yKTsKKyAgICAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgaSArPSBQeUxpc3RfR0VUX1NJWkUoc2VsZik7CisgICAgICAgIHJldHVybiBsaXN0X2Fzc19pdGVtKHNlbGYsIGksIHZhbHVlKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aDsKIAotCQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QqKWl0ZW0sIFB5X1NJWkUoc2VsZiksCi0JCQkJICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgewotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwgUHlfU0laRShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogCi0JCWlmIChzdGVwID09IDEpCi0JCQlyZXR1cm4gbGlzdF9hc3Nfc2xpY2Uoc2VsZiwgc3RhcnQsIHN0b3AsIHZhbHVlKTsKKyAgICAgICAgaWYgKHN0ZXAgPT0gMSkKKyAgICAgICAgICAgIHJldHVybiBsaXN0X2Fzc19zbGljZShzZWxmLCBzdGFydCwgc3RvcCwgdmFsdWUpOwogCi0JCS8qIE1ha2Ugc3VyZSBzWzU6Ml0gPSBbLi5dIGluc2VydHMgYXQgdGhlIHJpZ2h0IHBsYWNlOgotCQkgICBiZWZvcmUgNSwgbm90IGJlZm9yZSAyLiAqLwotCQlpZiAoKHN0ZXAgPCAwICYmIHN0YXJ0IDwgc3RvcCkgfHwKLQkJICAgIChzdGVwID4gMCAmJiBzdGFydCA+IHN0b3ApKQotCQkJc3RvcCA9IHN0YXJ0OworICAgICAgICAvKiBNYWtlIHN1cmUgc1s1OjJdID0gWy4uXSBpbnNlcnRzIGF0IHRoZSByaWdodCBwbGFjZToKKyAgICAgICAgICAgYmVmb3JlIDUsIG5vdCBiZWZvcmUgMi4gKi8KKyAgICAgICAgaWYgKChzdGVwIDwgMCAmJiBzdGFydCA8IHN0b3ApIHx8CisgICAgICAgICAgICAoc3RlcCA+IDAgJiYgc3RhcnQgPiBzdG9wKSkKKyAgICAgICAgICAgIHN0b3AgPSBzdGFydDsKIAotCQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQkJLyogZGVsZXRlIHNsaWNlICovCi0JCQlQeU9iamVjdCAqKmdhcmJhZ2U7Ci0JCQlzaXplX3QgY3VyOwotCQkJUHlfc3NpemVfdCBpOworICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogZGVsZXRlIHNsaWNlICovCisgICAgICAgICAgICBQeU9iamVjdCAqKmdhcmJhZ2U7CisgICAgICAgICAgICBzaXplX3QgY3VyOworICAgICAgICAgICAgUHlfc3NpemVfdCBpOwogCi0JCQlpZiAoc2xpY2VsZW5ndGggPD0gMCkKLQkJCQlyZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChzbGljZWxlbmd0aCA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogCi0JCQlpZiAoc3RlcCA8IDApIHsKLQkJCQlzdG9wID0gc3RhcnQgKyAxOwotCQkJCXN0YXJ0ID0gc3RvcCArIHN0ZXAqKHNsaWNlbGVuZ3RoIC0gMSkgLSAxOwotCQkJCXN0ZXAgPSAtc3RlcDsKLQkJCX0KKyAgICAgICAgICAgIGlmIChzdGVwIDwgMCkgeworICAgICAgICAgICAgICAgIHN0b3AgPSBzdGFydCArIDE7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBzdG9wICsgc3RlcCooc2xpY2VsZW5ndGggLSAxKSAtIDE7CisgICAgICAgICAgICAgICAgc3RlcCA9IC1zdGVwOworICAgICAgICAgICAgfQogCi0JCQlhc3NlcnQoKHNpemVfdClzbGljZWxlbmd0aCA8PQotCQkJICAgICAgIFBZX1NJWkVfTUFYIC8gc2l6ZW9mKFB5T2JqZWN0KikpOworICAgICAgICAgICAgYXNzZXJ0KChzaXplX3Qpc2xpY2VsZW5ndGggPD0KKyAgICAgICAgICAgICAgICAgICBQWV9TSVpFX01BWCAvIHNpemVvZihQeU9iamVjdCopKTsKIAotCQkJZ2FyYmFnZSA9IChQeU9iamVjdCoqKQotCQkJCVB5TWVtX01BTExPQyhzbGljZWxlbmd0aCpzaXplb2YoUHlPYmplY3QqKSk7Ci0JCQlpZiAoIWdhcmJhZ2UpIHsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KKyAgICAgICAgICAgIGdhcmJhZ2UgPSAoUHlPYmplY3QqKikKKyAgICAgICAgICAgICAgICBQeU1lbV9NQUxMT0Moc2xpY2VsZW5ndGgqc2l6ZW9mKFB5T2JqZWN0KikpOworICAgICAgICAgICAgaWYgKCFnYXJiYWdlKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CiAKLQkJCS8qIGRyYXdpbmcgcGljdHVyZXMgbWlnaHQgaGVscCB1bmRlcnN0YW5kIHRoZXNlIGZvcgotCQkJICAgbG9vcHMuIEJhc2ljYWxseSwgd2UgbWVtbW92ZSB0aGUgcGFydHMgb2YgdGhlCi0JCQkgICBsaXN0IHRoYXQgYXJlICpub3QqIHBhcnQgb2YgdGhlIHNsaWNlOiBzdGVwLTEKLQkJCSAgIGl0ZW1zIGZvciBlYWNoIGl0ZW0gdGhhdCBpcyBwYXJ0IG9mIHRoZSBzbGljZSwKLQkJCSAgIGFuZCB0aGVuIHRhaWwgZW5kIG9mIHRoZSBsaXN0IHRoYXQgd2FzIG5vdAotCQkJICAgY292ZXJlZCBieSB0aGUgc2xpY2UgKi8KLQkJCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOwotCQkJICAgICBjdXIgPCAoc2l6ZV90KXN0b3A7Ci0JCQkgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKLQkJCQlQeV9zc2l6ZV90IGxpbSA9IHN0ZXAgLSAxOworICAgICAgICAgICAgLyogZHJhd2luZyBwaWN0dXJlcyBtaWdodCBoZWxwIHVuZGVyc3RhbmQgdGhlc2UgZm9yCisgICAgICAgICAgICAgICBsb29wcy4gQmFzaWNhbGx5LCB3ZSBtZW1tb3ZlIHRoZSBwYXJ0cyBvZiB0aGUKKyAgICAgICAgICAgICAgIGxpc3QgdGhhdCBhcmUgKm5vdCogcGFydCBvZiB0aGUgc2xpY2U6IHN0ZXAtMQorICAgICAgICAgICAgICAgaXRlbXMgZm9yIGVhY2ggaXRlbSB0aGF0IGlzIHBhcnQgb2YgdGhlIHNsaWNlLAorICAgICAgICAgICAgICAgYW5kIHRoZW4gdGFpbCBlbmQgb2YgdGhlIGxpc3QgdGhhdCB3YXMgbm90CisgICAgICAgICAgICAgICBjb3ZlcmVkIGJ5IHRoZSBzbGljZSAqLworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7CisgICAgICAgICAgICAgICAgIGN1ciA8IChzaXplX3Qpc3RvcDsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGltID0gc3RlcCAtIDE7CiAKLQkJCQlnYXJiYWdlW2ldID0gUHlMaXN0X0dFVF9JVEVNKHNlbGYsIGN1cik7CisgICAgICAgICAgICAgICAgZ2FyYmFnZVtpXSA9IFB5TGlzdF9HRVRfSVRFTShzZWxmLCBjdXIpOwogCi0JCQkJaWYgKGN1ciArIHN0ZXAgPj0gKHNpemVfdClQeV9TSVpFKHNlbGYpKSB7Ci0JCQkJCWxpbSA9IFB5X1NJWkUoc2VsZikgLSBjdXIgLSAxOwotCQkJCX0KKyAgICAgICAgICAgICAgICBpZiAoY3VyICsgc3RlcCA+PSAoc2l6ZV90KVB5X1NJWkUoc2VsZikpIHsKKyAgICAgICAgICAgICAgICAgICAgbGltID0gUHlfU0laRShzZWxmKSAtIGN1ciAtIDE7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgY3VyIC0gaSwKLQkJCQkJc2VsZi0+b2JfaXRlbSArIGN1ciArIDEsCi0JCQkJCWxpbSAqIHNpemVvZihQeU9iamVjdCAqKSk7Ci0JCQl9Ci0JCQljdXIgPSBzdGFydCArIHNsaWNlbGVuZ3RoKnN0ZXA7Ci0JCQlpZiAoY3VyIDwgKHNpemVfdClQeV9TSVpFKHNlbGYpKSB7Ci0JCQkJbWVtbW92ZShzZWxmLT5vYl9pdGVtICsgY3VyIC0gc2xpY2VsZW5ndGgsCi0JCQkJCXNlbGYtPm9iX2l0ZW0gKyBjdXIsCi0JCQkJCShQeV9TSVpFKHNlbGYpIC0gY3VyKSAqIAotCQkJCQkgc2l6ZW9mKFB5T2JqZWN0ICopKTsKLQkJCX0KKyAgICAgICAgICAgICAgICBtZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyBjdXIgLSBpLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5vYl9pdGVtICsgY3VyICsgMSwKKyAgICAgICAgICAgICAgICAgICAgbGltICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1ciA9IHN0YXJ0ICsgc2xpY2VsZW5ndGgqc3RlcDsKKyAgICAgICAgICAgIGlmIChjdXIgPCAoc2l6ZV90KVB5X1NJWkUoc2VsZikpIHsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKHNlbGYtPm9iX2l0ZW0gKyBjdXIgLSBzbGljZWxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi0+b2JfaXRlbSArIGN1ciwKKyAgICAgICAgICAgICAgICAgICAgKFB5X1NJWkUoc2VsZikgLSBjdXIpICoKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQeU9iamVjdCAqKSk7CisgICAgICAgICAgICB9CiAKLQkJCVB5X1NJWkUoc2VsZikgLT0gc2xpY2VsZW5ndGg7Ci0JCQlsaXN0X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpKTsKKyAgICAgICAgICAgIFB5X1NJWkUoc2VsZikgLT0gc2xpY2VsZW5ndGg7CisgICAgICAgICAgICBsaXN0X3Jlc2l6ZShzZWxmLCBQeV9TSVpFKHNlbGYpKTsKIAotCQkJZm9yIChpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOyBpKyspIHsKLQkJCQlQeV9ERUNSRUYoZ2FyYmFnZVtpXSk7Ci0JCQl9Ci0JCQlQeU1lbV9GUkVFKGdhcmJhZ2UpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZ2FyYmFnZVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeU1lbV9GUkVFKGdhcmJhZ2UpOwogCi0JCQlyZXR1cm4gMDsKLQkJfQotCQllbHNlIHsKLQkJCS8qIGFzc2lnbiBzbGljZSAqLwotCQkJUHlPYmplY3QgKmlucywgKnNlcTsKLQkJCVB5T2JqZWN0ICoqZ2FyYmFnZSwgKipzZXFpdGVtcywgKipzZWxmaXRlbXM7Ci0JCQlQeV9zc2l6ZV90IGN1ciwgaTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogYXNzaWduIHNsaWNlICovCisgICAgICAgICAgICBQeU9iamVjdCAqaW5zLCAqc2VxOworICAgICAgICAgICAgUHlPYmplY3QgKipnYXJiYWdlLCAqKnNlcWl0ZW1zLCAqKnNlbGZpdGVtczsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY3VyLCBpOwogCi0JCQkvKiBwcm90ZWN0IGFnYWluc3QgYVs6Oi0xXSA9IGEgKi8KLQkJCWlmIChzZWxmID09IChQeUxpc3RPYmplY3QqKXZhbHVlKSB7Ci0JCQkJc2VxID0gbGlzdF9zbGljZSgoUHlMaXN0T2JqZWN0Kil2YWx1ZSwgMCwKLQkJCQkJCSAgIFB5TGlzdF9HRVRfU0laRSh2YWx1ZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2VxID0gUHlTZXF1ZW5jZV9GYXN0KHZhbHVlLAotCQkJCQkJICAgICAgIm11c3QgYXNzaWduIGl0ZXJhYmxlICIKLQkJCQkJCSAgICAgICJ0byBleHRlbmRlZCBzbGljZSIpOwotCQkJfQotCQkJaWYgKCFzZXEpCi0JCQkJcmV0dXJuIC0xOworICAgICAgICAgICAgLyogcHJvdGVjdCBhZ2FpbnN0IGFbOjotMV0gPSBhICovCisgICAgICAgICAgICBpZiAoc2VsZiA9PSAoUHlMaXN0T2JqZWN0Kil2YWx1ZSkgeworICAgICAgICAgICAgICAgIHNlcSA9IGxpc3Rfc2xpY2UoKFB5TGlzdE9iamVjdCopdmFsdWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfU0laRSh2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc2VxID0gUHlTZXF1ZW5jZV9GYXN0KHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBhc3NpZ24gaXRlcmFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gZXh0ZW5kZWQgc2xpY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2VxKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotCQkJaWYgKFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShzZXEpICE9IHNsaWNlbGVuZ3RoKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJhdHRlbXB0IHRvIGFzc2lnbiBzZXF1ZW5jZSBvZiAiCi0JCQkJCSJzaXplICV6ZCB0byBleHRlbmRlZCBzbGljZSBvZiAiCi0JCQkJCSJzaXplICV6ZCIsCi0JCQkJCSAgICAgUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKHNlcSksCi0JCQkJCSAgICAgc2xpY2VsZW5ndGgpOwotCQkJCVB5X0RFQ1JFRihzZXEpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoc2VxKSAhPSBzbGljZWxlbmd0aCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdCB0byBhc3NpZ24gc2VxdWVuY2Ugb2YgIgorICAgICAgICAgICAgICAgICAgICAic2l6ZSAlemQgdG8gZXh0ZW5kZWQgc2xpY2Ugb2YgIgorICAgICAgICAgICAgICAgICAgICAic2l6ZSAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShzZXEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CiAKLQkJCWlmICghc2xpY2VsZW5ndGgpIHsKLQkJCQlQeV9ERUNSRUYoc2VxKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KKyAgICAgICAgICAgIGlmICghc2xpY2VsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KIAotCQkJZ2FyYmFnZSA9IChQeU9iamVjdCoqKQotCQkJCVB5TWVtX01BTExPQyhzbGljZWxlbmd0aCpzaXplb2YoUHlPYmplY3QqKSk7Ci0JCQlpZiAoIWdhcmJhZ2UpIHsKLQkJCQlQeV9ERUNSRUYoc2VxKTsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KKyAgICAgICAgICAgIGdhcmJhZ2UgPSAoUHlPYmplY3QqKikKKyAgICAgICAgICAgICAgICBQeU1lbV9NQUxMT0Moc2xpY2VsZW5ndGgqc2l6ZW9mKFB5T2JqZWN0KikpOworICAgICAgICAgICAgaWYgKCFnYXJiYWdlKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CiAKLQkJCXNlbGZpdGVtcyA9IHNlbGYtPm9iX2l0ZW07Ci0JCQlzZXFpdGVtcyA9IFB5U2VxdWVuY2VfRmFzdF9JVEVNUyhzZXEpOwotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCWdhcmJhZ2VbaV0gPSBzZWxmaXRlbXNbY3VyXTsKLQkJCQlpbnMgPSBzZXFpdGVtc1tpXTsKLQkJCQlQeV9JTkNSRUYoaW5zKTsKLQkJCQlzZWxmaXRlbXNbY3VyXSA9IGluczsKLQkJCX0KKyAgICAgICAgICAgIHNlbGZpdGVtcyA9IHNlbGYtPm9iX2l0ZW07CisgICAgICAgICAgICBzZXFpdGVtcyA9IFB5U2VxdWVuY2VfRmFzdF9JVEVNUyhzZXEpOworICAgICAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKKyAgICAgICAgICAgICAgICAgY3VyICs9IHN0ZXAsIGkrKykgeworICAgICAgICAgICAgICAgIGdhcmJhZ2VbaV0gPSBzZWxmaXRlbXNbY3VyXTsKKyAgICAgICAgICAgICAgICBpbnMgPSBzZXFpdGVtc1tpXTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaW5zKTsKKyAgICAgICAgICAgICAgICBzZWxmaXRlbXNbY3VyXSA9IGluczsKKyAgICAgICAgICAgIH0KIAotCQkJZm9yIChpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOyBpKyspIHsKLQkJCQlQeV9ERUNSRUYoZ2FyYmFnZVtpXSk7Ci0JCQl9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihnYXJiYWdlW2ldKTsKKyAgICAgICAgICAgIH0KIAotCQkJUHlNZW1fRlJFRShnYXJiYWdlKTsKLQkJCVB5X0RFQ1JFRihzZXEpOworICAgICAgICAgICAgUHlNZW1fRlJFRShnYXJiYWdlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzZXEpOwogCi0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgJS4yMDBzIiwKLQkJCSAgICAgaXRlbS0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBpdGVtLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgbGlzdF9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKWxpc3RfbGVuZ3RoLAotCShiaW5hcnlmdW5jKWxpc3Rfc3Vic2NyaXB0LAotCShvYmpvYmphcmdwcm9jKWxpc3RfYXNzX3N1YnNjcmlwdAorICAgIChsZW5mdW5jKWxpc3RfbGVuZ3RoLAorICAgIChiaW5hcnlmdW5jKWxpc3Rfc3Vic2NyaXB0LAorICAgIChvYmpvYmphcmdwcm9jKWxpc3RfYXNzX3N1YnNjcmlwdAogfTsKIAogUHlUeXBlT2JqZWN0IFB5TGlzdF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImxpc3QiLAotCXNpemVvZihQeUxpc3RPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpbGlzdF9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCShwcmludGZ1bmMpbGlzdF9wcmludCwJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylsaXN0X3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmbGlzdF9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZsaXN0X2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQsCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0xJU1RfU1VCQ0xBU1MsCS8qIHRwX2ZsYWdzICovCi0gCWxpc3RfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYylsaXN0X3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLSAJKGlucXVpcnkpbGlzdF9jbGVhciwJCQkvKiB0cF9jbGVhciAqLwotCWxpc3RfcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlsaXN0X2l0ZXIsCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlsaXN0X21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylsaXN0X2luaXQsCQkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkJLyogdHBfYWxsb2MgKi8KLQlQeVR5cGVfR2VuZXJpY05ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkJLyogdHBfZnJlZSAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImxpc3QiLAorICAgIHNpemVvZihQeUxpc3RPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpbGlzdF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKHByaW50ZnVuYylsaXN0X3ByaW50LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylsaXN0X3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJmxpc3RfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZsaXN0X2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQsICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0xJU1RfU1VCQ0xBU1MsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBsaXN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbGlzdF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlsaXN0X2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgbGlzdF9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBsaXN0X2l0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgbGlzdF9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgKGluaXRwcm9jKWxpc3RfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiBMaXN0IEl0ZXJhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCWxvbmcgaXRfaW5kZXg7Ci0JUHlMaXN0T2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgaXRfaW5kZXg7CisgICAgUHlMaXN0T2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCiB9IGxpc3RpdGVyb2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKmxpc3RfaXRlcihQeU9iamVjdCAqKTsKQEAgLTI4MDMsMTE5ICsyODAzLDExOSBAQAogUHlEb2NfU1RSVkFSKGxlbmd0aF9oaW50X2RvYywgIlByaXZhdGUgbWV0aG9kIHJldHVybmluZyBhbiBlc3RpbWF0ZSBvZiBsZW4obGlzdChpdCkpLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgbGlzdGl0ZXJfbWV0aG9kc1tdID0gewotCXsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWxpc3RpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pbGlzdGl0ZXJfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5TGlzdEl0ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJsaXN0aXRlcmF0b3IiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGxpc3RpdGVyb2JqZWN0KSwJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbGlzdGl0ZXJfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLQkwLAkJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYylsaXN0aXRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylsaXN0aXRlcl9uZXh0LAkJLyogdHBfaXRlcm5leHQgKi8KLQlsaXN0aXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImxpc3RpdGVyYXRvciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGxpc3RpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWxpc3RpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbGlzdGl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWxpc3RpdGVyX25leHQsICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgbGlzdGl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiB9OwogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X2l0ZXIoUHlPYmplY3QgKnNlcSkKIHsKLQlsaXN0aXRlcm9iamVjdCAqaXQ7CisgICAgbGlzdGl0ZXJvYmplY3QgKml0OwogCi0JaWYgKCFQeUxpc3RfQ2hlY2soc2VxKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfR0NfTmV3KGxpc3RpdGVyb2JqZWN0LCAmUHlMaXN0SXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXQtPml0X2luZGV4ID0gMDsKLQlQeV9JTkNSRUYoc2VxKTsKLQlpdC0+aXRfc2VxID0gKFB5TGlzdE9iamVjdCAqKXNlcTsKLQlfUHlPYmplY3RfR0NfVFJBQ0soaXQpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBpZiAoIVB5TGlzdF9DaGVjayhzZXEpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9HQ19OZXcobGlzdGl0ZXJvYmplY3QsICZQeUxpc3RJdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdC0+aXRfaW5kZXggPSAwOworICAgIFB5X0lOQ1JFRihzZXEpOworICAgIGl0LT5pdF9zZXEgPSAoUHlMaXN0T2JqZWN0ICopc2VxOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhpdCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgdm9pZAogbGlzdGl0ZXJfZGVhbGxvYyhsaXN0aXRlcm9iamVjdCAqaXQpCiB7Ci0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOwotCVB5X1hERUNSRUYoaXQtPml0X3NlcSk7Ci0JUHlPYmplY3RfR0NfRGVsKGl0KTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhpdCk7CisgICAgUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoaXQpOwogfQogCiBzdGF0aWMgaW50CiBsaXN0aXRlcl90cmF2ZXJzZShsaXN0aXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGl0LT5pdF9zZXEpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGl0LT5pdF9zZXEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdGl0ZXJfbmV4dChsaXN0aXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlMaXN0T2JqZWN0ICpzZXE7Ci0JUHlPYmplY3QgKml0ZW07CisgICAgUHlMaXN0T2JqZWN0ICpzZXE7CisgICAgUHlPYmplY3QgKml0ZW07CiAKLQlhc3NlcnQoaXQgIT0gTlVMTCk7Ci0Jc2VxID0gaXQtPml0X3NlcTsKLQlpZiAoc2VxID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeUxpc3RfQ2hlY2soc2VxKSk7CisgICAgYXNzZXJ0KGl0ICE9IE5VTEwpOworICAgIHNlcSA9IGl0LT5pdF9zZXE7CisgICAgaWYgKHNlcSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKHNlcSkpOwogCi0JaWYgKGl0LT5pdF9pbmRleCA8IFB5TGlzdF9HRVRfU0laRShzZXEpKSB7Ci0JCWl0ZW0gPSBQeUxpc3RfR0VUX0lURU0oc2VxLCBpdC0+aXRfaW5kZXgpOwotCQkrK2l0LT5pdF9pbmRleDsKLQkJUHlfSU5DUkVGKGl0ZW0pOwotCQlyZXR1cm4gaXRlbTsKLQl9CisgICAgaWYgKGl0LT5pdF9pbmRleCA8IFB5TGlzdF9HRVRfU0laRShzZXEpKSB7CisgICAgICAgIGl0ZW0gPSBQeUxpc3RfR0VUX0lURU0oc2VxLCBpdC0+aXRfaW5kZXgpOworICAgICAgICArK2l0LT5pdF9pbmRleDsKKyAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CiAKLQlQeV9ERUNSRUYoc2VxKTsKLQlpdC0+aXRfc2VxID0gTlVMTDsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICBpdC0+aXRfc2VxID0gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxpc3RpdGVyX2xlbihsaXN0aXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlfc3NpemVfdCBsZW47Ci0JaWYgKGl0LT5pdF9zZXEpIHsKLQkJbGVuID0gUHlMaXN0X0dFVF9TSVpFKGl0LT5pdF9zZXEpIC0gaXQtPml0X2luZGV4OwotCQlpZiAobGVuID49IDApCi0JCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobGVuKTsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGlmIChpdC0+aXRfc2VxKSB7CisgICAgICAgIGxlbiA9IFB5TGlzdF9HRVRfU0laRShpdC0+aXRfc2VxKSAtIGl0LT5pdF9pbmRleDsKKyAgICAgICAgaWYgKGxlbiA+PSAwKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGxlbik7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKiBMaXN0IFJldmVyc2UgSXRlcmF0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlfc3NpemVfdCBpdF9pbmRleDsKLQlQeUxpc3RPYmplY3QgKml0X3NlcTsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCBpdF9pbmRleDsKKyAgICBQeUxpc3RPYmplY3QgKml0X3NlcTsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gbGlzdHJldml0ZXJvYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqbGlzdF9yZXZlcnNlZChQeUxpc3RPYmplY3QgKiwgUHlPYmplY3QgKik7CkBAIC0yOTI1LDEwMCArMjkyNSwxMDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqbGlzdHJldml0ZXJfbGVuKGxpc3RyZXZpdGVyb2JqZWN0ICopOwogCiBzdGF0aWMgUHlNZXRob2REZWYgbGlzdHJldml0ZXJfbWV0aG9kc1tdID0gewotCXsiX19sZW5ndGhfaGludF9fIiwgKFB5Q0Z1bmN0aW9uKWxpc3RyZXZpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pbGlzdHJldml0ZXJfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5TGlzdFJldkl0ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJsaXN0cmV2ZXJzZWl0ZXJhdG9yIiwJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKGxpc3RyZXZpdGVyb2JqZWN0KSwJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilsaXN0cmV2aXRlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0JMCwJCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpbGlzdHJldml0ZXJfdHJhdmVyc2UsCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpbGlzdHJldml0ZXJfbmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JbGlzdHJldml0ZXJfbWV0aG9kcywJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImxpc3RyZXZlcnNlaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGxpc3RyZXZpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWxpc3RyZXZpdGVyX2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbGlzdHJldml0ZXJfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKWxpc3RyZXZpdGVyX25leHQsICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgbGlzdHJldml0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdF9yZXZlcnNlZChQeUxpc3RPYmplY3QgKnNlcSwgUHlPYmplY3QgKnVudXNlZCkKIHsKLQlsaXN0cmV2aXRlcm9iamVjdCAqaXQ7CisgICAgbGlzdHJldml0ZXJvYmplY3QgKml0OwogCi0JaXQgPSBQeU9iamVjdF9HQ19OZXcobGlzdHJldml0ZXJvYmplY3QsICZQeUxpc3RSZXZJdGVyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKHNlcSkpOwotCWl0LT5pdF9pbmRleCA9IFB5TGlzdF9HRVRfU0laRShzZXEpIC0gMTsKLQlQeV9JTkNSRUYoc2VxKTsKLQlpdC0+aXRfc2VxID0gc2VxOwotCVB5T2JqZWN0X0dDX1RyYWNrKGl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaXQgPSBQeU9iamVjdF9HQ19OZXcobGlzdHJldml0ZXJvYmplY3QsICZQeUxpc3RSZXZJdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKHNlcSkpOworICAgIGl0LT5pdF9pbmRleCA9IFB5TGlzdF9HRVRfU0laRShzZXEpIC0gMTsKKyAgICBQeV9JTkNSRUYoc2VxKTsKKyAgICBpdC0+aXRfc2VxID0gc2VxOworICAgIFB5T2JqZWN0X0dDX1RyYWNrKGl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyB2b2lkCiBsaXN0cmV2aXRlcl9kZWFsbG9jKGxpc3RyZXZpdGVyb2JqZWN0ICppdCkKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKGl0KTsKLQlQeV9YREVDUkVGKGl0LT5pdF9zZXEpOwotCVB5T2JqZWN0X0dDX0RlbChpdCk7CisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhpdCk7CisgICAgUHlfWERFQ1JFRihpdC0+aXRfc2VxKTsKKyAgICBQeU9iamVjdF9HQ19EZWwoaXQpOwogfQogCiBzdGF0aWMgaW50CiBsaXN0cmV2aXRlcl90cmF2ZXJzZShsaXN0cmV2aXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGl0LT5pdF9zZXEpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGl0LT5pdF9zZXEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdHJldml0ZXJfbmV4dChsaXN0cmV2aXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlPYmplY3QgKml0ZW07Ci0JUHlfc3NpemVfdCBpbmRleCA9IGl0LT5pdF9pbmRleDsKLQlQeUxpc3RPYmplY3QgKnNlcSA9IGl0LT5pdF9zZXE7CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgUHlfc3NpemVfdCBpbmRleCA9IGl0LT5pdF9pbmRleDsKKyAgICBQeUxpc3RPYmplY3QgKnNlcSA9IGl0LT5pdF9zZXE7CiAKLQlpZiAoaW5kZXg+PTAgJiYgaW5kZXggPCBQeUxpc3RfR0VUX1NJWkUoc2VxKSkgewotCQlpdGVtID0gUHlMaXN0X0dFVF9JVEVNKHNlcSwgaW5kZXgpOwotCQlpdC0+aXRfaW5kZXgtLTsKLQkJUHlfSU5DUkVGKGl0ZW0pOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0JaXQtPml0X2luZGV4ID0gLTE7Ci0JaWYgKHNlcSAhPSBOVUxMKSB7Ci0JCWl0LT5pdF9zZXEgPSBOVUxMOwotCQlQeV9ERUNSRUYoc2VxKTsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGluZGV4Pj0wICYmIGluZGV4IDwgUHlMaXN0X0dFVF9TSVpFKHNlcSkpIHsKKyAgICAgICAgaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShzZXEsIGluZGV4KTsKKyAgICAgICAgaXQtPml0X2luZGV4LS07CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQorICAgIGl0LT5pdF9pbmRleCA9IC0xOworICAgIGlmIChzZXEgIT0gTlVMTCkgeworICAgICAgICBpdC0+aXRfc2VxID0gTlVMTDsKKyAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdHJldml0ZXJfbGVuKGxpc3RyZXZpdGVyb2JqZWN0ICppdCkKIHsKLQlQeV9zc2l6ZV90IGxlbiA9IGl0LT5pdF9pbmRleCArIDE7Ci0JaWYgKGl0LT5pdF9zZXEgPT0gTlVMTCB8fCBQeUxpc3RfR0VUX1NJWkUoaXQtPml0X3NlcSkgPCBsZW4pCi0JCWxlbiA9IDA7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChsZW4pOworICAgIFB5X3NzaXplX3QgbGVuID0gaXQtPml0X2luZGV4ICsgMTsKKyAgICBpZiAoaXQtPml0X3NlcSA9PSBOVUxMIHx8IFB5TGlzdF9HRVRfU0laRShpdC0+aXRfc2VxKSA8IGxlbikKKyAgICAgICAgbGVuID0gMDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KGxlbik7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2xvbmdvYmplY3QuYyBiL09iamVjdHMvbG9uZ29iamVjdC5jCmluZGV4IDkxZWRmNjIuLmU2ZWRiNGYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbG9uZ29iamVjdC5jCisrKyBiL09iamVjdHMvbG9uZ29iamVjdC5jCkBAIC0zNywxMCArMzcsMTAgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKmRpdnJlbTEoUHlMb25nT2JqZWN0ICosIGRpZ2l0LCBkaWdpdCAqKTsKIAogI2RlZmluZSBTSUdDSEVDSyhQeVRyeUJsb2NrKSBcCi0JaWYgKC0tX1B5X1RpY2tlciA8IDApIHsgXAotCQlfUHlfVGlja2VyID0gX1B5X0NoZWNrSW50ZXJ2YWw7IFwKLQkJaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSBQeVRyeUJsb2NrIFwKLQl9CisgICAgaWYgKC0tX1B5X1RpY2tlciA8IDApIHsgXAorICAgICAgICBfUHlfVGlja2VyID0gX1B5X0NoZWNrSW50ZXJ2YWw7IFwKKyAgICAgICAgaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKSBQeVRyeUJsb2NrIFwKKyAgICB9CiAKIC8qIE5vcm1hbGl6ZSAocmVtb3ZlIGxlYWRpbmcgemVyb3MgZnJvbSkgYSBsb25nIGludCBvYmplY3QuCiAgICBEb2Vzbid0IGF0dGVtcHQgdG8gZnJlZSB0aGUgc3RvcmFnZS0taW4gbW9zdCBjYXNlcywgZHVlIHRvIHRoZSBuYXR1cmUKQEAgLTQ5LDE0ICs0OSwxNCBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiBsb25nX25vcm1hbGl6ZShyZWdpc3RlciBQeUxvbmdPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBqID0gQUJTKFB5X1NJWkUodikpOwotCVB5X3NzaXplX3QgaSA9IGo7CisgICAgUHlfc3NpemVfdCBqID0gQUJTKFB5X1NJWkUodikpOworICAgIFB5X3NzaXplX3QgaSA9IGo7CiAKLQl3aGlsZSAoaSA+IDAgJiYgdi0+b2JfZGlnaXRbaS0xXSA9PSAwKQotCQktLWk7Ci0JaWYgKGkgIT0gaikKLQkJUHlfU0laRSh2KSA9IChQeV9TSVpFKHYpIDwgMCkgPyAtKGkpIDogaTsKLQlyZXR1cm4gdjsKKyAgICB3aGlsZSAoaSA+IDAgJiYgdi0+b2JfZGlnaXRbaS0xXSA9PSAwKQorICAgICAgICAtLWk7CisgICAgaWYgKGkgIT0gaikKKyAgICAgICAgUHlfU0laRSh2KSA9IChQeV9TSVpFKHYpIDwgMCkgPyAtKGkpIDogaTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogQWxsb2NhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IHdpdGggc2l6ZSBkaWdpdHMuCkBAIC02NSwzMyArNjUsMzMgQEAKIFB5TG9uZ09iamVjdCAqCiBfUHlMb25nX05ldyhQeV9zc2l6ZV90IHNpemUpCiB7Ci0JaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogY292ZXJpdHlbYW1wZXJzYW5kX2luX3NpemVdICovCi0JLyogWFhYKG5ub3J3aXR6KTogVGhpcyBjYW4gb3ZlcmZsb3cgLS0KLSAgICAgICAgICAgUHlPYmplY3RfTkVXX1ZBUiAvIF9QeU9iamVjdF9WQVJfU0laRSBuZWVkIHRvIGRldGVjdCBvdmVyZmxvdyAqLwotCXJldHVybiBQeU9iamVjdF9ORVdfVkFSKFB5TG9uZ09iamVjdCwgJlB5TG9uZ19UeXBlLCBzaXplKTsKKyAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBjb3Zlcml0eVthbXBlcnNhbmRfaW5fc2l6ZV0gKi8KKyAgICAvKiBYWFgobm5vcndpdHopOiBUaGlzIGNhbiBvdmVyZmxvdyAtLQorICAgICAgIFB5T2JqZWN0X05FV19WQVIgLyBfUHlPYmplY3RfVkFSX1NJWkUgbmVlZCB0byBkZXRlY3Qgb3ZlcmZsb3cgKi8KKyAgICByZXR1cm4gUHlPYmplY3RfTkVXX1ZBUihQeUxvbmdPYmplY3QsICZQeUxvbmdfVHlwZSwgc2l6ZSk7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeUxvbmdfQ29weShQeUxvbmdPYmplY3QgKnNyYykKIHsKLQlQeUxvbmdPYmplY3QgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlMb25nT2JqZWN0ICpyZXN1bHQ7CisgICAgUHlfc3NpemVfdCBpOwogCi0JYXNzZXJ0KHNyYyAhPSBOVUxMKTsKLQlpID0gc3JjLT5vYl9zaXplOwotCWlmIChpIDwgMCkKLQkJaSA9IC0oaSk7Ci0JcmVzdWx0ID0gX1B5TG9uZ19OZXcoaSk7Ci0JaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JCXJlc3VsdC0+b2Jfc2l6ZSA9IHNyYy0+b2Jfc2l6ZTsKLQkJd2hpbGUgKC0taSA+PSAwKQotCQkJcmVzdWx0LT5vYl9kaWdpdFtpXSA9IHNyYy0+b2JfZGlnaXRbaV07Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgYXNzZXJ0KHNyYyAhPSBOVUxMKTsKKyAgICBpID0gc3JjLT5vYl9zaXplOworICAgIGlmIChpIDwgMCkKKyAgICAgICAgaSA9IC0oaSk7CisgICAgcmVzdWx0ID0gX1B5TG9uZ19OZXcoaSk7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIHJlc3VsdC0+b2Jfc2l6ZSA9IHNyYy0+b2Jfc2l6ZTsKKyAgICAgICAgd2hpbGUgKC0taSA+PSAwKQorICAgICAgICAgICAgcmVzdWx0LT5vYl9kaWdpdFtpXSA9IHNyYy0+b2JfZGlnaXRbaV07CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBsb25nIGludCBvYmplY3QgZnJvbSBhIEMgbG9uZyBpbnQgKi8KQEAgLTk5LDQzICs5OSw0MyBAQAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21Mb25nKGxvbmcgaXZhbCkKIHsKLQlQeUxvbmdPYmplY3QgKnY7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYWJzX2l2YWw7Ci0JdW5zaWduZWQgbG9uZyB0OyAgLyogdW5zaWduZWQgc28gPj4gZG9lc24ndCBwcm9wYWdhdGUgc2lnbiBiaXQgKi8KLQlpbnQgbmRpZ2l0cyA9IDA7Ci0JaW50IG5lZ2F0aXZlID0gMDsKKyAgICBQeUxvbmdPYmplY3QgKnY7CisgICAgdW5zaWduZWQgbG9uZyBhYnNfaXZhbDsKKyAgICB1bnNpZ25lZCBsb25nIHQ7ICAvKiB1bnNpZ25lZCBzbyA+PiBkb2Vzbid0IHByb3BhZ2F0ZSBzaWduIGJpdCAqLworICAgIGludCBuZGlnaXRzID0gMDsKKyAgICBpbnQgbmVnYXRpdmUgPSAwOwogCi0JaWYgKGl2YWwgPCAwKSB7Ci0JCS8qIGlmIExPTkdfTUlOID09IC1MT05HX01BWC0xICh0cnVlIG9uIG1vc3QgcGxhdGZvcm1zKSB0aGVuCi0JCSAgIEFOU0kgQyBzYXlzIHRoYXQgdGhlIHJlc3VsdCBvZiAtaXZhbCBpcyB1bmRlZmluZWQgd2hlbiBpdmFsCi0JCSAgID09IExPTkdfTUlOLiAgSGVuY2UgdGhlIGZvbGxvd2luZyB3b3JrYXJvdW5kLiAqLwotCQlhYnNfaXZhbCA9ICh1bnNpZ25lZCBsb25nKSgtMS1pdmFsKSArIDE7Ci0JCW5lZ2F0aXZlID0gMTsKLQl9Ci0JZWxzZSB7Ci0JCWFic19pdmFsID0gKHVuc2lnbmVkIGxvbmcpaXZhbDsKLQl9CisgICAgaWYgKGl2YWwgPCAwKSB7CisgICAgICAgIC8qIGlmIExPTkdfTUlOID09IC1MT05HX01BWC0xICh0cnVlIG9uIG1vc3QgcGxhdGZvcm1zKSB0aGVuCisgICAgICAgICAgIEFOU0kgQyBzYXlzIHRoYXQgdGhlIHJlc3VsdCBvZiAtaXZhbCBpcyB1bmRlZmluZWQgd2hlbiBpdmFsCisgICAgICAgICAgID09IExPTkdfTUlOLiAgSGVuY2UgdGhlIGZvbGxvd2luZyB3b3JrYXJvdW5kLiAqLworICAgICAgICBhYnNfaXZhbCA9ICh1bnNpZ25lZCBsb25nKSgtMS1pdmFsKSArIDE7CisgICAgICAgIG5lZ2F0aXZlID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFic19pdmFsID0gKHVuc2lnbmVkIGxvbmcpaXZhbDsKKyAgICB9CiAKLQkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIFB5dGhvbiBkaWdpdHMuCi0JICAgV2UgdXNlZCB0byBwaWNrIDUgKCJiaWcgZW5vdWdoIGZvciBhbnl0aGluZyIpLCBidXQgdGhhdCdzIGEKLQkgICB3YXN0ZSBvZiB0aW1lIGFuZCBzcGFjZSBnaXZlbiB0aGF0IDUqMTUgPSA3NSBiaXRzIGFyZSByYXJlbHkKLQkgICBuZWVkZWQuICovCi0JdCA9IGFic19pdmFsOwotCXdoaWxlICh0KSB7Ci0JCSsrbmRpZ2l0czsKLQkJdCA+Pj0gUHlMb25nX1NISUZUOwotCX0KLQl2ID0gX1B5TG9uZ19OZXcobmRpZ2l0cyk7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlkaWdpdCAqcCA9IHYtPm9iX2RpZ2l0OwotCQl2LT5vYl9zaXplID0gbmVnYXRpdmUgPyAtbmRpZ2l0cyA6IG5kaWdpdHM7Ci0JCXQgPSBhYnNfaXZhbDsKLQkJd2hpbGUgKHQpIHsKLQkJCSpwKysgPSAoZGlnaXQpKHQgJiBQeUxvbmdfTUFTSyk7Ci0JCQl0ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXY7CisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLgorICAgICAgIFdlIHVzZWQgdG8gcGljayA1ICgiYmlnIGVub3VnaCBmb3IgYW55dGhpbmciKSwgYnV0IHRoYXQncyBhCisgICAgICAgd2FzdGUgb2YgdGltZSBhbmQgc3BhY2UgZ2l2ZW4gdGhhdCA1KjE1ID0gNzUgYml0cyBhcmUgcmFyZWx5CisgICAgICAgbmVlZGVkLiAqLworICAgIHQgPSBhYnNfaXZhbDsKKyAgICB3aGlsZSAodCkgeworICAgICAgICArK25kaWdpdHM7CisgICAgICAgIHQgPj49IFB5TG9uZ19TSElGVDsKKyAgICB9CisgICAgdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgZGlnaXQgKnAgPSB2LT5vYl9kaWdpdDsKKyAgICAgICAgdi0+b2Jfc2l6ZSA9IG5lZ2F0aXZlID8gLW5kaWdpdHMgOiBuZGlnaXRzOworICAgICAgICB0ID0gYWJzX2l2YWw7CisgICAgICAgIHdoaWxlICh0KSB7CisgICAgICAgICAgICAqcCsrID0gKGRpZ2l0KSh0ICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgdCA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKil2OwogfQogCiAvKiBDcmVhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IGZyb20gYSBDIHVuc2lnbmVkIGxvbmcgaW50ICovCkBAIC0xNDMsMjYgKzE0MywyNiBAQAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21VbnNpZ25lZExvbmcodW5zaWduZWQgbG9uZyBpdmFsKQogewotCVB5TG9uZ09iamVjdCAqdjsKLQl1bnNpZ25lZCBsb25nIHQ7Ci0JaW50IG5kaWdpdHMgPSAwOworICAgIFB5TG9uZ09iamVjdCAqdjsKKyAgICB1bnNpZ25lZCBsb25nIHQ7CisgICAgaW50IG5kaWdpdHMgPSAwOwogCi0JLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLiAqLwotCXQgPSAodW5zaWduZWQgbG9uZylpdmFsOwotCXdoaWxlICh0KSB7Ci0JCSsrbmRpZ2l0czsKLQkJdCA+Pj0gUHlMb25nX1NISUZUOwotCX0KLQl2ID0gX1B5TG9uZ19OZXcobmRpZ2l0cyk7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlkaWdpdCAqcCA9IHYtPm9iX2RpZ2l0OwotCQlQeV9TSVpFKHYpID0gbmRpZ2l0czsKLQkJd2hpbGUgKGl2YWwpIHsKLQkJCSpwKysgPSAoZGlnaXQpKGl2YWwgJiBQeUxvbmdfTUFTSyk7Ci0JCQlpdmFsID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKXY7CisgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLiAqLworICAgIHQgPSAodW5zaWduZWQgbG9uZylpdmFsOworICAgIHdoaWxlICh0KSB7CisgICAgICAgICsrbmRpZ2l0czsKKyAgICAgICAgdCA+Pj0gUHlMb25nX1NISUZUOworICAgIH0KKyAgICB2ID0gX1B5TG9uZ19OZXcobmRpZ2l0cyk7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBkaWdpdCAqcCA9IHYtPm9iX2RpZ2l0OworICAgICAgICBQeV9TSVpFKHYpID0gbmRpZ2l0czsKKyAgICAgICAgd2hpbGUgKGl2YWwpIHsKKyAgICAgICAgICAgICpwKysgPSAoZGlnaXQpKGl2YWwgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICBpdmFsID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXY7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBsb25nIGludCBvYmplY3QgZnJvbSBhIEMgZG91YmxlICovCkBAIC0xNzAsNDEgKzE3MCw0MSBAQAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21Eb3VibGUoZG91YmxlIGR2YWwpCiB7Ci0JUHlMb25nT2JqZWN0ICp2OwotCWRvdWJsZSBmcmFjOwotCWludCBpLCBuZGlnLCBleHBvLCBuZWc7Ci0JbmVnID0gMDsKLQlpZiAoUHlfSVNfSU5GSU5JVFkoZHZhbCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkiY2Fubm90IGNvbnZlcnQgZmxvYXQgaW5maW5pdHkgdG8gaW50ZWdlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKFB5X0lTX05BTihkdmFsKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSJjYW5ub3QgY29udmVydCBmbG9hdCBOYU4gdG8gaW50ZWdlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGR2YWwgPCAwLjApIHsKLQkJbmVnID0gMTsKLQkJZHZhbCA9IC1kdmFsOwotCX0KLQlmcmFjID0gZnJleHAoZHZhbCwgJmV4cG8pOyAvKiBkdmFsID0gZnJhYyoyKipleHBvOyAwLjAgPD0gZnJhYyA8IDEuMCAqLwotCWlmIChleHBvIDw9IDApCi0JCXJldHVybiBQeUxvbmdfRnJvbUxvbmcoMEwpOwotCW5kaWcgPSAoZXhwby0xKSAvIFB5TG9uZ19TSElGVCArIDE7IC8qIE51bWJlciBvZiAnZGlnaXRzJyBpbiByZXN1bHQgKi8KLQl2ID0gX1B5TG9uZ19OZXcobmRpZyk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZnJhYyA9IGxkZXhwKGZyYWMsIChleHBvLTEpICUgUHlMb25nX1NISUZUICsgMSk7Ci0JZm9yIChpID0gbmRpZzsgLS1pID49IDA7ICkgewotCQlsb25nIGJpdHMgPSAobG9uZylmcmFjOwotCQl2LT5vYl9kaWdpdFtpXSA9IChkaWdpdCkgYml0czsKLQkJZnJhYyA9IGZyYWMgLSAoZG91YmxlKWJpdHM7Ci0JCWZyYWMgPSBsZGV4cChmcmFjLCBQeUxvbmdfU0hJRlQpOwotCX0KLQlpZiAobmVnKQotCQlQeV9TSVpFKHYpID0gLShQeV9TSVpFKHYpKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopdjsKKyAgICBQeUxvbmdPYmplY3QgKnY7CisgICAgZG91YmxlIGZyYWM7CisgICAgaW50IGksIG5kaWcsIGV4cG8sIG5lZzsKKyAgICBuZWcgPSAwOworICAgIGlmIChQeV9JU19JTkZJTklUWShkdmFsKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBmbG9hdCBpbmZpbml0eSB0byBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlfSVNfTkFOKGR2YWwpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IGZsb2F0IE5hTiB0byBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZHZhbCA8IDAuMCkgeworICAgICAgICBuZWcgPSAxOworICAgICAgICBkdmFsID0gLWR2YWw7CisgICAgfQorICAgIGZyYWMgPSBmcmV4cChkdmFsLCAmZXhwbyk7IC8qIGR2YWwgPSBmcmFjKjIqKmV4cG87IDAuMCA8PSBmcmFjIDwgMS4wICovCisgICAgaWYgKGV4cG8gPD0gMCkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwTCk7CisgICAgbmRpZyA9IChleHBvLTEpIC8gUHlMb25nX1NISUZUICsgMTsgLyogTnVtYmVyIG9mICdkaWdpdHMnIGluIHJlc3VsdCAqLworICAgIHYgPSBfUHlMb25nX05ldyhuZGlnKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcmFjID0gbGRleHAoZnJhYywgKGV4cG8tMSkgJSBQeUxvbmdfU0hJRlQgKyAxKTsKKyAgICBmb3IgKGkgPSBuZGlnOyAtLWkgPj0gMDsgKSB7CisgICAgICAgIGxvbmcgYml0cyA9IChsb25nKWZyYWM7CisgICAgICAgIHYtPm9iX2RpZ2l0W2ldID0gKGRpZ2l0KSBiaXRzOworICAgICAgICBmcmFjID0gZnJhYyAtIChkb3VibGUpYml0czsKKyAgICAgICAgZnJhYyA9IGxkZXhwKGZyYWMsIFB5TG9uZ19TSElGVCk7CisgICAgfQorICAgIGlmIChuZWcpCisgICAgICAgIFB5X1NJWkUodikgPSAtKFB5X1NJWkUodikpOworICAgIHJldHVybiAoUHlPYmplY3QgKil2OwogfQogCiAvKiBDaGVja2luZyBmb3Igb3ZlcmZsb3cgaW4gUHlMb25nX0FzTG9uZyBpcyBhIFBJVEEgc2luY2UgQyBkb2Vzbid0IGRlZmluZQpAQCAtMjE2LDggKzIxNiw4IEBACiAgKiBIb3dldmVyLCBzb21lIG90aGVyIGNvbXBpbGVycyB3YXJuIGFib3V0IGFwcGx5aW5nIHVuYXJ5IG1pbnVzIHRvIGFuCiAgKiB1bnNpZ25lZCBvcGVyYW5kLiAgSGVuY2UgdGhlIHdlaXJkICIwLSIuCiAgKi8KLSNkZWZpbmUgUFlfQUJTX0xPTkdfTUlOCQkoMC0odW5zaWduZWQgbG9uZylMT05HX01JTikKLSNkZWZpbmUgUFlfQUJTX1NTSVpFX1RfTUlOCSgwLShzaXplX3QpUFlfU1NJWkVfVF9NSU4pCisjZGVmaW5lIFBZX0FCU19MT05HX01JTiAgICAgICAgICgwLSh1bnNpZ25lZCBsb25nKUxPTkdfTUlOKQorI2RlZmluZSBQWV9BQlNfU1NJWkVfVF9NSU4gICAgICAoMC0oc2l6ZV90KVBZX1NTSVpFX1RfTUlOKQogCiAvKiBHZXQgYSBDIGxvbmcgaW50IGZyb20gYSBsb25nIGludCBvYmplY3QuCiAgICBSZXR1cm5zIC0xIGFuZCBzZXRzIGFuIGVycm9yIGNvbmRpdGlvbiBpZiBvdmVyZmxvdyBvY2N1cnMuICovCkBAIC0yMjUsNDcgKzIyNSw0NyBAQAogbG9uZwogUHlMb25nX0FzTG9uZyhQeU9iamVjdCAqdnYpCiB7Ci0JLyogVGhpcyB2ZXJzaW9uIGJ5IFRpbSBQZXRlcnMgKi8KLQlyZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7Ci0JdW5zaWduZWQgbG9uZyB4LCBwcmV2OwotCVB5X3NzaXplX3QgaTsKLQlpbnQgc2lnbjsKKyAgICAvKiBUaGlzIHZlcnNpb24gYnkgVGltIFBldGVycyAqLworICAgIHJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqdjsKKyAgICB1bnNpZ25lZCBsb25nIHgsIHByZXY7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBzaWduOwogCi0JaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKLQkJaWYgKHZ2ICE9IE5VTEwgJiYgUHlJbnRfQ2hlY2sodnYpKQotCQkJcmV0dXJuIFB5SW50X0FzTG9uZyh2dik7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXYgPSAoUHlMb25nT2JqZWN0ICopdnY7Ci0JaSA9IHYtPm9iX3NpemU7Ci0Jc2lnbiA9IDE7Ci0JeCA9IDA7Ci0JaWYgKGkgPCAwKSB7Ci0JCXNpZ24gPSAtMTsKLQkJaSA9IC0oaSk7Ci0JfQotCXdoaWxlICgtLWkgPj0gMCkgewotCQlwcmV2ID0geDsKLQkJeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgKyB2LT5vYl9kaWdpdFtpXTsKLQkJaWYgKCh4ID4+IFB5TG9uZ19TSElGVCkgIT0gcHJldikKLQkJCWdvdG8gb3ZlcmZsb3c7Ci0JfQotCS8qIEhhdmVuJ3QgbG9zdCBhbnkgYml0cywgYnV0IGNhc3RpbmcgdG8gbG9uZyByZXF1aXJlcyBleHRyYSBjYXJlCi0JICogKHNlZSBjb21tZW50IGFib3ZlKS4KLSAgICAgICAgICovCi0JaWYgKHggPD0gKHVuc2lnbmVkIGxvbmcpTE9OR19NQVgpIHsKLQkJcmV0dXJuIChsb25nKXggKiBzaWduOwotCX0KLQllbHNlIGlmIChzaWduIDwgMCAmJiB4ID09IFBZX0FCU19MT05HX01JTikgewotCQlyZXR1cm4gTE9OR19NSU47Ci0JfQotCS8qIGVsc2Ugb3ZlcmZsb3cgKi8KKyAgICBpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgeworICAgICAgICBpZiAodnYgIT0gTlVMTCAmJiBQeUludF9DaGVjayh2dikpCisgICAgICAgICAgICByZXR1cm4gUHlJbnRfQXNMb25nKHZ2KTsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdiA9IChQeUxvbmdPYmplY3QgKil2djsKKyAgICBpID0gdi0+b2Jfc2l6ZTsKKyAgICBzaWduID0gMTsKKyAgICB4ID0gMDsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgc2lnbiA9IC0xOworICAgICAgICBpID0gLShpKTsKKyAgICB9CisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIHByZXYgPSB4OworICAgICAgICB4ID0gKHggPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2ldOworICAgICAgICBpZiAoKHggPj4gUHlMb25nX1NISUZUKSAhPSBwcmV2KQorICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKKyAgICB9CisgICAgLyogSGF2ZW4ndCBsb3N0IGFueSBiaXRzLCBidXQgY2FzdGluZyB0byBsb25nIHJlcXVpcmVzIGV4dHJhIGNhcmUKKyAgICAgKiAoc2VlIGNvbW1lbnQgYWJvdmUpLgorICAgICAqLworICAgIGlmICh4IDw9ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYKSB7CisgICAgICAgIHJldHVybiAobG9uZyl4ICogc2lnbjsKKyAgICB9CisgICAgZWxzZSBpZiAoc2lnbiA8IDAgJiYgeCA9PSBQWV9BQlNfTE9OR19NSU4pIHsKKyAgICAgICAgcmV0dXJuIExPTkdfTUlOOworICAgIH0KKyAgICAvKiBlbHNlIG92ZXJmbG93ICovCiAKICBvdmVyZmxvdzoKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJsb25nIGludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBpbnQiKTsKLQlyZXR1cm4gLTE7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJsb25nIGludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBpbnQiKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKIC8qIEdldCBhIFB5X3NzaXplX3QgZnJvbSBhIGxvbmcgaW50IG9iamVjdC4KQEAgLTI3Myw0NCArMjczLDQ0IEBACiAKIFB5X3NzaXplX3QKIFB5TG9uZ19Bc1NzaXplX3QoUHlPYmplY3QgKnZ2KSB7Ci0JcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICp2OwotCXNpemVfdCB4LCBwcmV2OwotCVB5X3NzaXplX3QgaTsKLQlpbnQgc2lnbjsKKyAgICByZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7CisgICAgc2l6ZV90IHgsIHByZXY7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBzaWduOwogCi0JaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JdiA9IChQeUxvbmdPYmplY3QgKil2djsKLQlpID0gdi0+b2Jfc2l6ZTsKLQlzaWduID0gMTsKLQl4ID0gMDsKLQlpZiAoaSA8IDApIHsKLQkJc2lnbiA9IC0xOwotCQlpID0gLShpKTsKLQl9Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCXByZXYgPSB4OwotCQl4ID0gKHggPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2ldOwotCQlpZiAoKHggPj4gUHlMb25nX1NISUZUKSAhPSBwcmV2KQotCQkJZ290byBvdmVyZmxvdzsKLQl9Ci0JLyogSGF2ZW4ndCBsb3N0IGFueSBiaXRzLCBidXQgY2FzdGluZyB0byBhIHNpZ25lZCB0eXBlIHJlcXVpcmVzCi0JICogZXh0cmEgY2FyZSAoc2VlIGNvbW1lbnQgYWJvdmUpLgotCSAqLwotCWlmICh4IDw9IChzaXplX3QpUFlfU1NJWkVfVF9NQVgpIHsKLQkJcmV0dXJuIChQeV9zc2l6ZV90KXggKiBzaWduOwotCX0KLQllbHNlIGlmIChzaWduIDwgMCAmJiB4ID09IFBZX0FCU19TU0laRV9UX01JTikgewotCQlyZXR1cm4gUFlfU1NJWkVfVF9NSU47Ci0JfQotCS8qIGVsc2Ugb3ZlcmZsb3cgKi8KKyAgICBpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OworICAgIGkgPSB2LT5vYl9zaXplOworICAgIHNpZ24gPSAxOworICAgIHggPSAwOworICAgIGlmIChpIDwgMCkgeworICAgICAgICBzaWduID0gLTE7CisgICAgICAgIGkgPSAtKGkpOworICAgIH0KKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgcHJldiA9IHg7CisgICAgICAgIHggPSAoeCA8PCBQeUxvbmdfU0hJRlQpICsgdi0+b2JfZGlnaXRbaV07CisgICAgICAgIGlmICgoeCA+PiBQeUxvbmdfU0hJRlQpICE9IHByZXYpCisgICAgICAgICAgICBnb3RvIG92ZXJmbG93OworICAgIH0KKyAgICAvKiBIYXZlbid0IGxvc3QgYW55IGJpdHMsIGJ1dCBjYXN0aW5nIHRvIGEgc2lnbmVkIHR5cGUgcmVxdWlyZXMKKyAgICAgKiBleHRyYSBjYXJlIChzZWUgY29tbWVudCBhYm92ZSkuCisgICAgICovCisgICAgaWYgKHggPD0gKHNpemVfdClQWV9TU0laRV9UX01BWCkgeworICAgICAgICByZXR1cm4gKFB5X3NzaXplX3QpeCAqIHNpZ247CisgICAgfQorICAgIGVsc2UgaWYgKHNpZ24gPCAwICYmIHggPT0gUFlfQUJTX1NTSVpFX1RfTUlOKSB7CisgICAgICAgIHJldHVybiBQWV9TU0laRV9UX01JTjsKKyAgICB9CisgICAgLyogZWxzZSBvdmVyZmxvdyAqLwogCiAgb3ZlcmZsb3c6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkibG9uZyBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gaW50Iik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAibG9uZyBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gaW50Iik7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBHZXQgYSBDIHVuc2lnbmVkIGxvbmcgaW50IGZyb20gYSBsb25nIGludCBvYmplY3QuCkBAIC0zMTksNDEgKzMxOSw0MSBAQAogdW5zaWduZWQgbG9uZwogUHlMb25nX0FzVW5zaWduZWRMb25nKFB5T2JqZWN0ICp2dikKIHsKLQlyZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7Ci0JdW5zaWduZWQgbG9uZyB4LCBwcmV2OwotCVB5X3NzaXplX3QgaTsKKyAgICByZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7CisgICAgdW5zaWduZWQgbG9uZyB4LCBwcmV2OworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7Ci0JCWlmICh2diAhPSBOVUxMICYmIFB5SW50X0NoZWNrKHZ2KSkgewotCQkJbG9uZyB2YWwgPSBQeUludF9Bc0xvbmcodnYpOwotCQkJaWYgKHZhbCA8IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSB2YWx1ZSB0byB1bnNpZ25lZCBsb25nIik7Ci0JCQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKLQkJCX0KLQkJCXJldHVybiB2YWw7Ci0JCX0KLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAodW5zaWduZWQgbG9uZykgLTE7Ci0JfQotCXYgPSAoUHlMb25nT2JqZWN0ICopdnY7Ci0JaSA9IFB5X1NJWkUodik7Ci0JeCA9IDA7Ci0JaWYgKGkgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJICAgImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgdmFsdWUgdG8gdW5zaWduZWQgbG9uZyIpOwotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOwotCX0KLQl3aGlsZSAoLS1pID49IDApIHsKLQkJcHJldiA9IHg7Ci0JCXggPSAoeCA8PCBQeUxvbmdfU0hJRlQpICsgdi0+b2JfZGlnaXRbaV07Ci0JCWlmICgoeCA+PiBQeUxvbmdfU0hJRlQpICE9IHByZXYpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJsb25nIGludCB0b28gbGFyZ2UgdG8gY29udmVydCIpOwotCQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKLQkJfQotCX0KLQlyZXR1cm4geDsKKyAgICBpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgeworICAgICAgICBpZiAodnYgIT0gTlVMTCAmJiBQeUludF9DaGVjayh2dikpIHsKKyAgICAgICAgICAgIGxvbmcgdmFsID0gUHlJbnRfQXNMb25nKHZ2KTsKKyAgICAgICAgICAgIGlmICh2YWwgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImNhbid0IGNvbnZlcnQgbmVnYXRpdmUgdmFsdWUgdG8gdW5zaWduZWQgbG9uZyIpOworICAgICAgICAgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZykgLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOworICAgIH0KKyAgICB2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OworICAgIGkgPSBQeV9TSVpFKHYpOworICAgIHggPSAwOworICAgIGlmIChpIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSB2YWx1ZSB0byB1bnNpZ25lZCBsb25nIik7CisgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZykgLTE7CisgICAgfQorICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICBwcmV2ID0geDsKKyAgICAgICAgeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgKyB2LT5vYl9kaWdpdFtpXTsKKyAgICAgICAgaWYgKCh4ID4+IFB5TG9uZ19TSElGVCkgIT0gcHJldikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImxvbmcgaW50IHRvbyBsYXJnZSB0byBjb252ZXJ0Iik7CisgICAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB4OwogfQogCiAvKiBHZXQgYSBDIHVuc2lnbmVkIGxvbmcgaW50IGZyb20gYSBsb25nIGludCBvYmplY3QsIGlnbm9yaW5nIHRoZSBoaWdoIGJpdHMuCkBAIC0zNjIsMzEyICszNjIsMzEyIEBACiB1bnNpZ25lZCBsb25nCiBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKFB5T2JqZWN0ICp2dikKIHsKLQlyZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7Ci0JdW5zaWduZWQgbG9uZyB4OwotCVB5X3NzaXplX3QgaTsKLQlpbnQgc2lnbjsKKyAgICByZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgc2lnbjsKIAotCWlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7Ci0JCWlmICh2diAhPSBOVUxMICYmIFB5SW50X0NoZWNrKHZ2KSkKLQkJCXJldHVybiBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2sodnYpOwotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKLQl9Ci0JdiA9IChQeUxvbmdPYmplY3QgKil2djsKLQlpID0gdi0+b2Jfc2l6ZTsKLQlzaWduID0gMTsKLQl4ID0gMDsKLQlpZiAoaSA8IDApIHsKLQkJc2lnbiA9IC0xOwotCQlpID0gLWk7Ci0JfQotCXdoaWxlICgtLWkgPj0gMCkgewotCQl4ID0gKHggPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2ldOwotCX0KLQlyZXR1cm4geCAqIHNpZ247CisgICAgaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgaWYgKHZ2ICE9IE5VTEwgJiYgUHlJbnRfQ2hlY2sodnYpKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0FzVW5zaWduZWRMb25nTWFzayh2dik7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC0xOworICAgIH0KKyAgICB2ID0gKFB5TG9uZ09iamVjdCAqKXZ2OworICAgIGkgPSB2LT5vYl9zaXplOworICAgIHNpZ24gPSAxOworICAgIHggPSAwOworICAgIGlmIChpIDwgMCkgeworICAgICAgICBzaWduID0gLTE7CisgICAgICAgIGkgPSAtaTsKKyAgICB9CisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIHggPSAoeCA8PCBQeUxvbmdfU0hJRlQpICsgdi0+b2JfZGlnaXRbaV07CisgICAgfQorICAgIHJldHVybiB4ICogc2lnbjsKIH0KIAogaW50CiBfUHlMb25nX1NpZ24oUHlPYmplY3QgKnZ2KQogewotCVB5TG9uZ09iamVjdCAqdiA9IChQeUxvbmdPYmplY3QgKil2djsKKyAgICBQeUxvbmdPYmplY3QgKnYgPSAoUHlMb25nT2JqZWN0ICopdnY7CiAKLQlhc3NlcnQodiAhPSBOVUxMKTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKKyAgICBhc3NlcnQodiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKIAotCXJldHVybiBQeV9TSVpFKHYpID09IDAgPyAwIDogKFB5X1NJWkUodikgPCAwID8gLTEgOiAxKTsKKyAgICByZXR1cm4gUHlfU0laRSh2KSA9PSAwID8gMCA6IChQeV9TSVpFKHYpIDwgMCA/IC0xIDogMSk7CiB9CiAKIHNpemVfdAogX1B5TG9uZ19OdW1CaXRzKFB5T2JqZWN0ICp2dikKIHsKLQlQeUxvbmdPYmplY3QgKnYgPSAoUHlMb25nT2JqZWN0ICopdnY7Ci0Jc2l6ZV90IHJlc3VsdCA9IDA7Ci0JUHlfc3NpemVfdCBuZGlnaXRzOworICAgIFB5TG9uZ09iamVjdCAqdiA9IChQeUxvbmdPYmplY3QgKil2djsKKyAgICBzaXplX3QgcmVzdWx0ID0gMDsKKyAgICBQeV9zc2l6ZV90IG5kaWdpdHM7CiAKLQlhc3NlcnQodiAhPSBOVUxMKTsKLQlhc3NlcnQoUHlMb25nX0NoZWNrKHYpKTsKLQluZGlnaXRzID0gQUJTKFB5X1NJWkUodikpOwotCWFzc2VydChuZGlnaXRzID09IDAgfHwgdi0+b2JfZGlnaXRbbmRpZ2l0cyAtIDFdICE9IDApOwotCWlmIChuZGlnaXRzID4gMCkgewotCQlkaWdpdCBtc2QgPSB2LT5vYl9kaWdpdFtuZGlnaXRzIC0gMV07CisgICAgYXNzZXJ0KHYgIT0gTlVMTCk7CisgICAgYXNzZXJ0KFB5TG9uZ19DaGVjayh2KSk7CisgICAgbmRpZ2l0cyA9IEFCUyhQeV9TSVpFKHYpKTsKKyAgICBhc3NlcnQobmRpZ2l0cyA9PSAwIHx8IHYtPm9iX2RpZ2l0W25kaWdpdHMgLSAxXSAhPSAwKTsKKyAgICBpZiAobmRpZ2l0cyA+IDApIHsKKyAgICAgICAgZGlnaXQgbXNkID0gdi0+b2JfZGlnaXRbbmRpZ2l0cyAtIDFdOwogCi0JCXJlc3VsdCA9IChuZGlnaXRzIC0gMSkgKiBQeUxvbmdfU0hJRlQ7Ci0JCWlmIChyZXN1bHQgLyBQeUxvbmdfU0hJRlQgIT0gKHNpemVfdCkobmRpZ2l0cyAtIDEpKQotCQkJZ290byBPdmVyZmxvdzsKLQkJZG8gewotCQkJKytyZXN1bHQ7Ci0JCQlpZiAocmVzdWx0ID09IDApCi0JCQkJZ290byBPdmVyZmxvdzsKLQkJCW1zZCA+Pj0gMTsKLQkJfSB3aGlsZSAobXNkKTsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmVzdWx0ID0gKG5kaWdpdHMgLSAxKSAqIFB5TG9uZ19TSElGVDsKKyAgICAgICAgaWYgKHJlc3VsdCAvIFB5TG9uZ19TSElGVCAhPSAoc2l6ZV90KShuZGlnaXRzIC0gMSkpCisgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICBkbyB7CisgICAgICAgICAgICArK3Jlc3VsdDsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICAgICAgbXNkID4+PSAxOworICAgICAgICB9IHdoaWxlIChtc2QpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogCiBPdmVyZmxvdzoKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImxvbmcgaGFzIHRvbyBtYW55IGJpdHMgIgotCQkJInRvIGV4cHJlc3MgaW4gYSBwbGF0Zm9ybSBzaXplX3QiKTsKLQlyZXR1cm4gKHNpemVfdCktMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImxvbmcgaGFzIHRvbyBtYW55IGJpdHMgIgorICAgICAgICAgICAgICAgICAgICAidG8gZXhwcmVzcyBpbiBhIHBsYXRmb3JtIHNpemVfdCIpOworICAgIHJldHVybiAoc2l6ZV90KS0xOwogfQogCiBQeU9iamVjdCAqCiBfUHlMb25nX0Zyb21CeXRlQXJyYXkoY29uc3QgdW5zaWduZWQgY2hhciogYnl0ZXMsIHNpemVfdCBuLAotCQkgICAgICBpbnQgbGl0dGxlX2VuZGlhbiwgaW50IGlzX3NpZ25lZCkKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGl0dGxlX2VuZGlhbiwgaW50IGlzX3NpZ25lZCkKIHsKLQljb25zdCB1bnNpZ25lZCBjaGFyKiBwc3RhcnRieXRlOy8qIExTQiBvZiBieXRlcyAqLwotCWludCBpbmNyOwkJCS8qIGRpcmVjdGlvbiB0byBtb3ZlIHBzdGFydGJ5dGUgKi8KLQljb25zdCB1bnNpZ25lZCBjaGFyKiBwZW5kYnl0ZTsJLyogTVNCIG9mIGJ5dGVzICovCi0Jc2l6ZV90IG51bXNpZ25pZmljYW50Ynl0ZXM7CS8qIG51bWJlciBvZiBieXRlcyB0aGF0IG1hdHRlciAqLwotCXNpemVfdCBuZGlnaXRzOwkJCS8qIG51bWJlciBvZiBQeXRob24gbG9uZyBkaWdpdHMgKi8KLQlQeUxvbmdPYmplY3QqIHY7CQkvKiByZXN1bHQgKi8KLQlpbnQgaWRpZ2l0ID0gMDsgIAkJLyogbmV4dCBmcmVlIGluZGV4IGluIHYtPm9iX2RpZ2l0ICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogcHN0YXJ0Ynl0ZTsvKiBMU0Igb2YgYnl0ZXMgKi8KKyAgICBpbnQgaW5jcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXJlY3Rpb24gdG8gbW92ZSBwc3RhcnRieXRlICovCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogcGVuZGJ5dGU7ICAgICAgLyogTVNCIG9mIGJ5dGVzICovCisgICAgc2l6ZV90IG51bXNpZ25pZmljYW50Ynl0ZXM7ICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF0dGVyICovCisgICAgc2l6ZV90IG5kaWdpdHM7ICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIFB5dGhvbiBsb25nIGRpZ2l0cyAqLworICAgIFB5TG9uZ09iamVjdCogdjsgICAgICAgICAgICAgICAgICAgIC8qIHJlc3VsdCAqLworICAgIGludCBpZGlnaXQgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgZnJlZSBpbmRleCBpbiB2LT5vYl9kaWdpdCAqLwogCi0JaWYgKG4gPT0gMCkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwTCk7CisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwTCk7CiAKLQlpZiAobGl0dGxlX2VuZGlhbikgewotCQlwc3RhcnRieXRlID0gYnl0ZXM7Ci0JCXBlbmRieXRlID0gYnl0ZXMgKyBuIC0gMTsKLQkJaW5jciA9IDE7Ci0JfQotCWVsc2UgewotCQlwc3RhcnRieXRlID0gYnl0ZXMgKyBuIC0gMTsKLQkJcGVuZGJ5dGUgPSBieXRlczsKLQkJaW5jciA9IC0xOwotCX0KKyAgICBpZiAobGl0dGxlX2VuZGlhbikgeworICAgICAgICBwc3RhcnRieXRlID0gYnl0ZXM7CisgICAgICAgIHBlbmRieXRlID0gYnl0ZXMgKyBuIC0gMTsKKyAgICAgICAgaW5jciA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwc3RhcnRieXRlID0gYnl0ZXMgKyBuIC0gMTsKKyAgICAgICAgcGVuZGJ5dGUgPSBieXRlczsKKyAgICAgICAgaW5jciA9IC0xOworICAgIH0KIAotCWlmIChpc19zaWduZWQpCi0JCWlzX3NpZ25lZCA9ICpwZW5kYnl0ZSA+PSAweDgwOworICAgIGlmIChpc19zaWduZWQpCisgICAgICAgIGlzX3NpZ25lZCA9ICpwZW5kYnl0ZSA+PSAweDgwOwogCi0JLyogQ29tcHV0ZSBudW1zaWduaWZpY2FudGJ5dGVzLiAgVGhpcyBjb25zaXN0cyBvZiBmaW5kaW5nIHRoZSBtb3N0Ci0JICAgc2lnbmlmaWNhbnQgYnl0ZS4gIExlYWRpbmcgMCBieXRlcyBhcmUgaW5zaWduZmljYW50IGlmIHRoZSBudW1iZXIKLQkgICBpcyBwb3NpdGl2ZSwgYW5kIGxlYWRpbmcgMHhmZiBieXRlcyBpZiBuZWdhdGl2ZS4gKi8KLQl7Ci0JCXNpemVfdCBpOwotCQljb25zdCB1bnNpZ25lZCBjaGFyKiBwID0gcGVuZGJ5dGU7Ci0JCWNvbnN0IGludCBwaW5jciA9IC1pbmNyOyAgLyogc2VhcmNoIE1TQiB0byBMU0IgKi8KLQkJY29uc3QgdW5zaWduZWQgY2hhciBpbnNpZ25maWNhbnQgPSBpc19zaWduZWQgPyAweGZmIDogMHgwMDsKKyAgICAvKiBDb21wdXRlIG51bXNpZ25pZmljYW50Ynl0ZXMuICBUaGlzIGNvbnNpc3RzIG9mIGZpbmRpbmcgdGhlIG1vc3QKKyAgICAgICBzaWduaWZpY2FudCBieXRlLiAgTGVhZGluZyAwIGJ5dGVzIGFyZSBpbnNpZ25maWNhbnQgaWYgdGhlIG51bWJlcgorICAgICAgIGlzIHBvc2l0aXZlLCBhbmQgbGVhZGluZyAweGZmIGJ5dGVzIGlmIG5lZ2F0aXZlLiAqLworICAgIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHAgPSBwZW5kYnl0ZTsKKyAgICAgICAgY29uc3QgaW50IHBpbmNyID0gLWluY3I7ICAvKiBzZWFyY2ggTVNCIHRvIExTQiAqLworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGluc2lnbmZpY2FudCA9IGlzX3NpZ25lZCA/IDB4ZmYgOiAweDAwOwogCi0JCWZvciAoaSA9IDA7IGkgPCBuOyArK2ksIHAgKz0gcGluY3IpIHsKLQkJCWlmICgqcCAhPSBpbnNpZ25maWNhbnQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJbnVtc2lnbmlmaWNhbnRieXRlcyA9IG4gLSBpOwotCQkvKiAyJ3MtY29tcCBpcyBhIGJpdCB0cmlja3kgaGVyZSwgZS5nLiAweGZmMDAgPT0gLTB4MDEwMCwgc28KLQkJICAgYWN0dWFsbHkgaGFzIDIgc2lnbmlmaWNhbnQgYnl0ZXMuICBPVE9ILCAweGZmMDAwMSA9PQotCQkgICAtMHgwMGZmZmYsIHNvIHdlIHdvdWxkbid0ICpuZWVkKiB0byBidW1wIGl0IHRoZXJlOyBidXQgd2UKLQkJICAgZG8gZm9yIDB4ZmZmZiA9IC0weDAwMDEuICBUbyBiZSBzYWZlIHdpdGhvdXQgYm90aGVyaW5nIHRvCi0JCSAgIGNoZWNrIGV2ZXJ5IGNhc2UsIGJ1bXAgaXQgcmVnYXJkbGVzcy4gKi8KLQkJaWYgKGlzX3NpZ25lZCAmJiBudW1zaWduaWZpY2FudGJ5dGVzIDwgbikKLQkJCSsrbnVtc2lnbmlmaWNhbnRieXRlczsKLQl9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2ksIHAgKz0gcGluY3IpIHsKKyAgICAgICAgICAgIGlmICgqcCAhPSBpbnNpZ25maWNhbnQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbnVtc2lnbmlmaWNhbnRieXRlcyA9IG4gLSBpOworICAgICAgICAvKiAyJ3MtY29tcCBpcyBhIGJpdCB0cmlja3kgaGVyZSwgZS5nLiAweGZmMDAgPT0gLTB4MDEwMCwgc28KKyAgICAgICAgICAgYWN0dWFsbHkgaGFzIDIgc2lnbmlmaWNhbnQgYnl0ZXMuICBPVE9ILCAweGZmMDAwMSA9PQorICAgICAgICAgICAtMHgwMGZmZmYsIHNvIHdlIHdvdWxkbid0ICpuZWVkKiB0byBidW1wIGl0IHRoZXJlOyBidXQgd2UKKyAgICAgICAgICAgZG8gZm9yIDB4ZmZmZiA9IC0weDAwMDEuICBUbyBiZSBzYWZlIHdpdGhvdXQgYm90aGVyaW5nIHRvCisgICAgICAgICAgIGNoZWNrIGV2ZXJ5IGNhc2UsIGJ1bXAgaXQgcmVnYXJkbGVzcy4gKi8KKyAgICAgICAgaWYgKGlzX3NpZ25lZCAmJiBudW1zaWduaWZpY2FudGJ5dGVzIDwgbikKKyAgICAgICAgICAgICsrbnVtc2lnbmlmaWNhbnRieXRlczsKKyAgICB9CiAKLQkvKiBIb3cgbWFueSBQeXRob24gbG9uZyBkaWdpdHMgZG8gd2UgbmVlZD8gIFdlIGhhdmUKLQkgICA4Km51bXNpZ25pZmljYW50Ynl0ZXMgYml0cywgYW5kIGVhY2ggUHl0aG9uIGxvbmcgZGlnaXQgaGFzIFB5TG9uZ19TSElGVAotCSAgIGJpdHMsIHNvIGl0J3MgdGhlIGNlaWxpbmcgb2YgdGhlIHF1b3RpZW50LiAqLwotCW5kaWdpdHMgPSAobnVtc2lnbmlmaWNhbnRieXRlcyAqIDggKyBQeUxvbmdfU0hJRlQgLSAxKSAvIFB5TG9uZ19TSElGVDsKLQlpZiAobmRpZ2l0cyA+IChzaXplX3QpSU5UX01BWCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JdiA9IF9QeUxvbmdfTmV3KChpbnQpbmRpZ2l0cyk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogSG93IG1hbnkgUHl0aG9uIGxvbmcgZGlnaXRzIGRvIHdlIG5lZWQ/ICBXZSBoYXZlCisgICAgICAgOCpudW1zaWduaWZpY2FudGJ5dGVzIGJpdHMsIGFuZCBlYWNoIFB5dGhvbiBsb25nIGRpZ2l0IGhhcyBQeUxvbmdfU0hJRlQKKyAgICAgICBiaXRzLCBzbyBpdCdzIHRoZSBjZWlsaW5nIG9mIHRoZSBxdW90aWVudC4gKi8KKyAgICBuZGlnaXRzID0gKG51bXNpZ25pZmljYW50Ynl0ZXMgKiA4ICsgUHlMb25nX1NISUZUIC0gMSkgLyBQeUxvbmdfU0hJRlQ7CisgICAgaWYgKG5kaWdpdHMgPiAoc2l6ZV90KUlOVF9NQVgpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHYgPSBfUHlMb25nX05ldygoaW50KW5kaWdpdHMpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogQ29weSB0aGUgYml0cyBvdmVyLiAgVGhlIHRyaWNreSBwYXJ0cyBhcmUgY29tcHV0aW5nIDIncy1jb21wIG9uCi0JICAgdGhlIGZseSBmb3Igc2lnbmVkIG51bWJlcnMsIGFuZCBkZWFsaW5nIHdpdGggdGhlIG1pc21hdGNoIGJldHdlZW4KLQkgICA4LWJpdCBieXRlcyBhbmQgKHByb2JhYmx5KSAxNS1iaXQgUHl0aG9uIGRpZ2l0cy4qLwotCXsKLQkJc2l6ZV90IGk7Ci0JCXR3b2RpZ2l0cyBjYXJyeSA9IDE7CQkvKiBmb3IgMidzLWNvbXAgY2FsY3VsYXRpb24gKi8KLQkJdHdvZGlnaXRzIGFjY3VtID0gMDsJCS8qIHNsaWRpbmcgcmVnaXN0ZXIgKi8KLQkJdW5zaWduZWQgaW50IGFjY3VtYml0cyA9IDA7IAkvKiBudW1iZXIgb2YgYml0cyBpbiBhY2N1bSAqLwotCQljb25zdCB1bnNpZ25lZCBjaGFyKiBwID0gcHN0YXJ0Ynl0ZTsKKyAgICAvKiBDb3B5IHRoZSBiaXRzIG92ZXIuICBUaGUgdHJpY2t5IHBhcnRzIGFyZSBjb21wdXRpbmcgMidzLWNvbXAgb24KKyAgICAgICB0aGUgZmx5IGZvciBzaWduZWQgbnVtYmVycywgYW5kIGRlYWxpbmcgd2l0aCB0aGUgbWlzbWF0Y2ggYmV0d2VlbgorICAgICAgIDgtYml0IGJ5dGVzIGFuZCAocHJvYmFibHkpIDE1LWJpdCBQeXRob24gZGlnaXRzLiovCisgICAgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgdHdvZGlnaXRzIGNhcnJ5ID0gMTsgICAgICAgICAgICAgICAgICAgIC8qIGZvciAyJ3MtY29tcCBjYWxjdWxhdGlvbiAqLworICAgICAgICB0d29kaWdpdHMgYWNjdW0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogc2xpZGluZyByZWdpc3RlciAqLworICAgICAgICB1bnNpZ25lZCBpbnQgYWNjdW1iaXRzID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gYWNjdW0gKi8KKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogcCA9IHBzdGFydGJ5dGU7CiAKLQkJZm9yIChpID0gMDsgaSA8IG51bXNpZ25pZmljYW50Ynl0ZXM7ICsraSwgcCArPSBpbmNyKSB7Ci0JCQl0d29kaWdpdHMgdGhpc2J5dGUgPSAqcDsKLQkJCS8qIENvbXB1dGUgY29ycmVjdGlvbiBmb3IgMidzIGNvbXAsIGlmIG5lZWRlZC4gKi8KLQkJCWlmIChpc19zaWduZWQpIHsKLQkJCQl0aGlzYnl0ZSA9ICgweGZmIF4gdGhpc2J5dGUpICsgY2Fycnk7Ci0JCQkJY2FycnkgPSB0aGlzYnl0ZSA+PiA4OwotCQkJCXRoaXNieXRlICY9IDB4ZmY7Ci0JCQl9Ci0JCQkvKiBCZWNhdXNlIHdlJ3JlIGdvaW5nIExTQiB0byBNU0IsIHRoaXNieXRlIGlzCi0JCQkgICBtb3JlIHNpZ25pZmljYW50IHRoYW4gd2hhdCdzIGFscmVhZHkgaW4gYWNjdW0sCi0JCQkgICBzbyBuZWVkcyB0byBiZSBwcmVwZW5kZWQgdG8gYWNjdW0uICovCi0JCQlhY2N1bSB8PSAodHdvZGlnaXRzKXRoaXNieXRlIDw8IGFjY3VtYml0czsKLQkJCWFjY3VtYml0cyArPSA4OwotCQkJaWYgKGFjY3VtYml0cyA+PSBQeUxvbmdfU0hJRlQpIHsKLQkJCQkvKiBUaGVyZSdzIGVub3VnaCB0byBmaWxsIGEgUHl0aG9uIGRpZ2l0LiAqLwotCQkJCWFzc2VydChpZGlnaXQgPCAoaW50KW5kaWdpdHMpOwotCQkJCXYtPm9iX2RpZ2l0W2lkaWdpdF0gPSAoZGlnaXQpKGFjY3VtICYgUHlMb25nX01BU0spOwotCQkJCSsraWRpZ2l0OwotCQkJCWFjY3VtID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCQkJYWNjdW1iaXRzIC09IFB5TG9uZ19TSElGVDsKLQkJCQlhc3NlcnQoYWNjdW1iaXRzIDwgUHlMb25nX1NISUZUKTsKLQkJCX0KLQkJfQotCQlhc3NlcnQoYWNjdW1iaXRzIDwgUHlMb25nX1NISUZUKTsKLQkJaWYgKGFjY3VtYml0cykgewotCQkJYXNzZXJ0KGlkaWdpdCA8IChpbnQpbmRpZ2l0cyk7Ci0JCQl2LT5vYl9kaWdpdFtpZGlnaXRdID0gKGRpZ2l0KWFjY3VtOwotCQkJKytpZGlnaXQ7Ci0JCX0KLQl9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1zaWduaWZpY2FudGJ5dGVzOyArK2ksIHAgKz0gaW5jcikgeworICAgICAgICAgICAgdHdvZGlnaXRzIHRoaXNieXRlID0gKnA7CisgICAgICAgICAgICAvKiBDb21wdXRlIGNvcnJlY3Rpb24gZm9yIDIncyBjb21wLCBpZiBuZWVkZWQuICovCisgICAgICAgICAgICBpZiAoaXNfc2lnbmVkKSB7CisgICAgICAgICAgICAgICAgdGhpc2J5dGUgPSAoMHhmZiBeIHRoaXNieXRlKSArIGNhcnJ5OworICAgICAgICAgICAgICAgIGNhcnJ5ID0gdGhpc2J5dGUgPj4gODsKKyAgICAgICAgICAgICAgICB0aGlzYnl0ZSAmPSAweGZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogQmVjYXVzZSB3ZSdyZSBnb2luZyBMU0IgdG8gTVNCLCB0aGlzYnl0ZSBpcworICAgICAgICAgICAgICAgbW9yZSBzaWduaWZpY2FudCB0aGFuIHdoYXQncyBhbHJlYWR5IGluIGFjY3VtLAorICAgICAgICAgICAgICAgc28gbmVlZHMgdG8gYmUgcHJlcGVuZGVkIHRvIGFjY3VtLiAqLworICAgICAgICAgICAgYWNjdW0gfD0gKHR3b2RpZ2l0cyl0aGlzYnl0ZSA8PCBhY2N1bWJpdHM7CisgICAgICAgICAgICBhY2N1bWJpdHMgKz0gODsKKyAgICAgICAgICAgIGlmIChhY2N1bWJpdHMgPj0gUHlMb25nX1NISUZUKSB7CisgICAgICAgICAgICAgICAgLyogVGhlcmUncyBlbm91Z2ggdG8gZmlsbCBhIFB5dGhvbiBkaWdpdC4gKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQoaWRpZ2l0IDwgKGludCluZGlnaXRzKTsKKyAgICAgICAgICAgICAgICB2LT5vYl9kaWdpdFtpZGlnaXRdID0gKGRpZ2l0KShhY2N1bSAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgICAgICArK2lkaWdpdDsKKyAgICAgICAgICAgICAgICBhY2N1bSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgICAgIGFjY3VtYml0cyAtPSBQeUxvbmdfU0hJRlQ7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGFjY3VtYml0cyA8IFB5TG9uZ19TSElGVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGFjY3VtYml0cyA8IFB5TG9uZ19TSElGVCk7CisgICAgICAgIGlmIChhY2N1bWJpdHMpIHsKKyAgICAgICAgICAgIGFzc2VydChpZGlnaXQgPCAoaW50KW5kaWdpdHMpOworICAgICAgICAgICAgdi0+b2JfZGlnaXRbaWRpZ2l0XSA9IChkaWdpdClhY2N1bTsKKyAgICAgICAgICAgICsraWRpZ2l0OworICAgICAgICB9CisgICAgfQogCi0JUHlfU0laRSh2KSA9IGlzX3NpZ25lZCA/IC1pZGlnaXQgOiBpZGlnaXQ7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWxvbmdfbm9ybWFsaXplKHYpOworICAgIFB5X1NJWkUodikgPSBpc19zaWduZWQgPyAtaWRpZ2l0IDogaWRpZ2l0OworICAgIHJldHVybiAoUHlPYmplY3QgKilsb25nX25vcm1hbGl6ZSh2KTsKIH0KIAogaW50CiBfUHlMb25nX0FzQnl0ZUFycmF5KFB5TG9uZ09iamVjdCogdiwKLQkJICAgIHVuc2lnbmVkIGNoYXIqIGJ5dGVzLCBzaXplX3QgbiwKLQkJICAgIGludCBsaXR0bGVfZW5kaWFuLCBpbnQgaXNfc2lnbmVkKQorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBieXRlcywgc2l6ZV90IG4sCisgICAgICAgICAgICAgICAgICAgIGludCBsaXR0bGVfZW5kaWFuLCBpbnQgaXNfc2lnbmVkKQogewotCVB5X3NzaXplX3QgaTsJCS8qIGluZGV4IGludG8gdi0+b2JfZGlnaXQgKi8KLQlQeV9zc2l6ZV90IG5kaWdpdHM7CQkvKiB8di0+b2Jfc2l6ZXwgKi8KLQl0d29kaWdpdHMgYWNjdW07CS8qIHNsaWRpbmcgcmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBpbnQgYWNjdW1iaXRzOyAvKiAjIGJpdHMgaW4gYWNjdW0gKi8KLQlpbnQgZG9fdHdvc19jb21wOwkvKiBzdG9yZSAyJ3MtY29tcD8gIGlzX3NpZ25lZCBhbmQgdiA8IDAgKi8KLQlkaWdpdCBjYXJyeTsJCS8qIGZvciBjb21wdXRpbmcgMidzLWNvbXAgKi8KLQlzaXplX3QgajsJCS8qICMgYnl0ZXMgZmlsbGVkICovCi0JdW5zaWduZWQgY2hhciogcDsJLyogcG9pbnRlciB0byBuZXh0IGJ5dGUgaW4gYnl0ZXMgKi8KLQlpbnQgcGluY3I7CQkvKiBkaXJlY3Rpb24gdG8gbW92ZSBwICovCisgICAgUHlfc3NpemVfdCBpOyAgICAgICAgICAgICAgIC8qIGluZGV4IGludG8gdi0+b2JfZGlnaXQgKi8KKyAgICBQeV9zc2l6ZV90IG5kaWdpdHM7ICAgICAgICAgICAgICAgICAvKiB8di0+b2Jfc2l6ZXwgKi8KKyAgICB0d29kaWdpdHMgYWNjdW07ICAgICAgICAgICAgLyogc2xpZGluZyByZWdpc3RlciAqLworICAgIHVuc2lnbmVkIGludCBhY2N1bWJpdHM7IC8qICMgYml0cyBpbiBhY2N1bSAqLworICAgIGludCBkb190d29zX2NvbXA7ICAgICAgICAgICAvKiBzdG9yZSAyJ3MtY29tcD8gIGlzX3NpZ25lZCBhbmQgdiA8IDAgKi8KKyAgICBkaWdpdCBjYXJyeTsgICAgICAgICAgICAgICAgLyogZm9yIGNvbXB1dGluZyAyJ3MtY29tcCAqLworICAgIHNpemVfdCBqOyAgICAgICAgICAgICAgICAgICAvKiAjIGJ5dGVzIGZpbGxlZCAqLworICAgIHVuc2lnbmVkIGNoYXIqIHA7ICAgICAgICAgICAvKiBwb2ludGVyIHRvIG5leHQgYnl0ZSBpbiBieXRlcyAqLworICAgIGludCBwaW5jcjsgICAgICAgICAgICAgICAgICAvKiBkaXJlY3Rpb24gdG8gbW92ZSBwICovCiAKLQlhc3NlcnQodiAhPSBOVUxMICYmIFB5TG9uZ19DaGVjayh2KSk7CisgICAgYXNzZXJ0KHYgIT0gTlVMTCAmJiBQeUxvbmdfQ2hlY2sodikpOwogCi0JaWYgKFB5X1NJWkUodikgPCAwKSB7Ci0JCW5kaWdpdHMgPSAtKFB5X1NJWkUodikpOwotCQlpZiAoIWlzX3NpZ25lZCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3QgY29udmVydCBuZWdhdGl2ZSBsb25nIHRvIHVuc2lnbmVkIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJZG9fdHdvc19jb21wID0gMTsKLQl9Ci0JZWxzZSB7Ci0JCW5kaWdpdHMgPSBQeV9TSVpFKHYpOwotCQlkb190d29zX2NvbXAgPSAwOwotCX0KKyAgICBpZiAoUHlfU0laRSh2KSA8IDApIHsKKyAgICAgICAgbmRpZ2l0cyA9IC0oUHlfU0laRSh2KSk7CisgICAgICAgIGlmICghaXNfc2lnbmVkKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJjYW4ndCBjb252ZXJ0IG5lZ2F0aXZlIGxvbmcgdG8gdW5zaWduZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBkb190d29zX2NvbXAgPSAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbmRpZ2l0cyA9IFB5X1NJWkUodik7CisgICAgICAgIGRvX3R3b3NfY29tcCA9IDA7CisgICAgfQogCi0JaWYgKGxpdHRsZV9lbmRpYW4pIHsKLQkJcCA9IGJ5dGVzOwotCQlwaW5jciA9IDE7Ci0JfQotCWVsc2UgewotCQlwID0gYnl0ZXMgKyBuIC0gMTsKLQkJcGluY3IgPSAtMTsKLQl9CisgICAgaWYgKGxpdHRsZV9lbmRpYW4pIHsKKyAgICAgICAgcCA9IGJ5dGVzOworICAgICAgICBwaW5jciA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwID0gYnl0ZXMgKyBuIC0gMTsKKyAgICAgICAgcGluY3IgPSAtMTsKKyAgICB9CiAKLQkvKiBDb3B5IG92ZXIgYWxsIHRoZSBQeXRob24gZGlnaXRzLgotCSAgIEl0J3MgY3J1Y2lhbCB0aGF0IGV2ZXJ5IFB5dGhvbiBkaWdpdCBleGNlcHQgZm9yIHRoZSBNU0QgY29udHJpYnV0ZQotCSAgIGV4YWN0bHkgUHlMb25nX1NISUZUIGJpdHMgdG8gdGhlIHRvdGFsLCBzbyBmaXJzdCBhc3NlcnQgdGhhdCB0aGUgbG9uZyBpcwotCSAgIG5vcm1hbGl6ZWQuICovCi0JYXNzZXJ0KG5kaWdpdHMgPT0gMCB8fCB2LT5vYl9kaWdpdFtuZGlnaXRzIC0gMV0gIT0gMCk7Ci0JaiA9IDA7Ci0JYWNjdW0gPSAwOwotCWFjY3VtYml0cyA9IDA7Ci0JY2FycnkgPSBkb190d29zX2NvbXAgPyAxIDogMDsKLQlmb3IgKGkgPSAwOyBpIDwgbmRpZ2l0czsgKytpKSB7Ci0JCWRpZ2l0IHRoaXNkaWdpdCA9IHYtPm9iX2RpZ2l0W2ldOwotCQlpZiAoZG9fdHdvc19jb21wKSB7Ci0JCQl0aGlzZGlnaXQgPSAodGhpc2RpZ2l0IF4gUHlMb25nX01BU0spICsgY2Fycnk7Ci0JCQljYXJyeSA9IHRoaXNkaWdpdCA+PiBQeUxvbmdfU0hJRlQ7Ci0JCQl0aGlzZGlnaXQgJj0gUHlMb25nX01BU0s7Ci0JCX0KLQkJLyogQmVjYXVzZSB3ZSdyZSBnb2luZyBMU0IgdG8gTVNCLCB0aGlzZGlnaXQgaXMgbW9yZQotCQkgICBzaWduaWZpY2FudCB0aGFuIHdoYXQncyBhbHJlYWR5IGluIGFjY3VtLCBzbyBuZWVkcyB0byBiZQotCQkgICBwcmVwZW5kZWQgdG8gYWNjdW0uICovCi0JCWFjY3VtIHw9ICh0d29kaWdpdHMpdGhpc2RpZ2l0IDw8IGFjY3VtYml0czsKKyAgICAvKiBDb3B5IG92ZXIgYWxsIHRoZSBQeXRob24gZGlnaXRzLgorICAgICAgIEl0J3MgY3J1Y2lhbCB0aGF0IGV2ZXJ5IFB5dGhvbiBkaWdpdCBleGNlcHQgZm9yIHRoZSBNU0QgY29udHJpYnV0ZQorICAgICAgIGV4YWN0bHkgUHlMb25nX1NISUZUIGJpdHMgdG8gdGhlIHRvdGFsLCBzbyBmaXJzdCBhc3NlcnQgdGhhdCB0aGUgbG9uZyBpcworICAgICAgIG5vcm1hbGl6ZWQuICovCisgICAgYXNzZXJ0KG5kaWdpdHMgPT0gMCB8fCB2LT5vYl9kaWdpdFtuZGlnaXRzIC0gMV0gIT0gMCk7CisgICAgaiA9IDA7CisgICAgYWNjdW0gPSAwOworICAgIGFjY3VtYml0cyA9IDA7CisgICAgY2FycnkgPSBkb190d29zX2NvbXAgPyAxIDogMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmRpZ2l0czsgKytpKSB7CisgICAgICAgIGRpZ2l0IHRoaXNkaWdpdCA9IHYtPm9iX2RpZ2l0W2ldOworICAgICAgICBpZiAoZG9fdHdvc19jb21wKSB7CisgICAgICAgICAgICB0aGlzZGlnaXQgPSAodGhpc2RpZ2l0IF4gUHlMb25nX01BU0spICsgY2Fycnk7CisgICAgICAgICAgICBjYXJyeSA9IHRoaXNkaWdpdCA+PiBQeUxvbmdfU0hJRlQ7CisgICAgICAgICAgICB0aGlzZGlnaXQgJj0gUHlMb25nX01BU0s7CisgICAgICAgIH0KKyAgICAgICAgLyogQmVjYXVzZSB3ZSdyZSBnb2luZyBMU0IgdG8gTVNCLCB0aGlzZGlnaXQgaXMgbW9yZQorICAgICAgICAgICBzaWduaWZpY2FudCB0aGFuIHdoYXQncyBhbHJlYWR5IGluIGFjY3VtLCBzbyBuZWVkcyB0byBiZQorICAgICAgICAgICBwcmVwZW5kZWQgdG8gYWNjdW0uICovCisgICAgICAgIGFjY3VtIHw9ICh0d29kaWdpdHMpdGhpc2RpZ2l0IDw8IGFjY3VtYml0czsKIAotCQkvKiBUaGUgbW9zdC1zaWduaWZpY2FudCBkaWdpdCBtYXkgYmUgKHByb2JhYmx5IGlzKSBhdCBsZWFzdAotCQkgICBwYXJ0bHkgZW1wdHkuICovCi0JCWlmIChpID09IG5kaWdpdHMgLSAxKSB7Ci0JCQkvKiBDb3VudCAjIG9mIHNpZ24gYml0cyAtLSB0aGV5IG5lZWRuJ3QgYmUgc3RvcmVkLAotCQkJICogYWx0aG91Z2ggZm9yIHNpZ25lZCBjb252ZXJzaW9uIHdlIG5lZWQgbGF0ZXIgdG8KLQkJCSAqIG1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgc2lnbiBiaXQgZ2V0cyBzdG9yZWQuICovCi0JCQlkaWdpdCBzID0gZG9fdHdvc19jb21wID8gdGhpc2RpZ2l0IF4gUHlMb25nX01BU0sgOgotCQkJCSAgICAgICAgICAgICAgICB0aGlzZGlnaXQ7Ci0JCQl3aGlsZSAocyAhPSAwKSB7Ci0JCQkJcyA+Pj0gMTsKLQkJCQlhY2N1bWJpdHMrKzsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQlhY2N1bWJpdHMgKz0gUHlMb25nX1NISUZUOworICAgICAgICAvKiBUaGUgbW9zdC1zaWduaWZpY2FudCBkaWdpdCBtYXkgYmUgKHByb2JhYmx5IGlzKSBhdCBsZWFzdAorICAgICAgICAgICBwYXJ0bHkgZW1wdHkuICovCisgICAgICAgIGlmIChpID09IG5kaWdpdHMgLSAxKSB7CisgICAgICAgICAgICAvKiBDb3VudCAjIG9mIHNpZ24gYml0cyAtLSB0aGV5IG5lZWRuJ3QgYmUgc3RvcmVkLAorICAgICAgICAgICAgICogYWx0aG91Z2ggZm9yIHNpZ25lZCBjb252ZXJzaW9uIHdlIG5lZWQgbGF0ZXIgdG8KKyAgICAgICAgICAgICAqIG1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgc2lnbiBiaXQgZ2V0cyBzdG9yZWQuICovCisgICAgICAgICAgICBkaWdpdCBzID0gZG9fdHdvc19jb21wID8gdGhpc2RpZ2l0IF4gUHlMb25nX01BU0sgOgorICAgICAgICAgICAgICAgICAgICAgICAgdGhpc2RpZ2l0OworICAgICAgICAgICAgd2hpbGUgKHMgIT0gMCkgeworICAgICAgICAgICAgICAgIHMgPj49IDE7CisgICAgICAgICAgICAgICAgYWNjdW1iaXRzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYWNjdW1iaXRzICs9IFB5TG9uZ19TSElGVDsKIAotCQkvKiBTdG9yZSBhcyBtYW55IGJ5dGVzIGFzIHBvc3NpYmxlLiAqLwotCQl3aGlsZSAoYWNjdW1iaXRzID49IDgpIHsKLQkJCWlmIChqID49IG4pCi0JCQkJZ290byBPdmVyZmxvdzsKLQkJCSsrajsKLQkJCSpwID0gKHVuc2lnbmVkIGNoYXIpKGFjY3VtICYgMHhmZik7Ci0JCQlwICs9IHBpbmNyOwotCQkJYWNjdW1iaXRzIC09IDg7Ci0JCQlhY2N1bSA+Pj0gODsKLQkJfQotCX0KKyAgICAgICAgLyogU3RvcmUgYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZS4gKi8KKyAgICAgICAgd2hpbGUgKGFjY3VtYml0cyA+PSA4KSB7CisgICAgICAgICAgICBpZiAoaiA+PSBuKQorICAgICAgICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7CisgICAgICAgICAgICArK2o7CisgICAgICAgICAgICAqcCA9ICh1bnNpZ25lZCBjaGFyKShhY2N1bSAmIDB4ZmYpOworICAgICAgICAgICAgcCArPSBwaW5jcjsKKyAgICAgICAgICAgIGFjY3VtYml0cyAtPSA4OworICAgICAgICAgICAgYWNjdW0gPj49IDg7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBTdG9yZSB0aGUgc3RyYWdnbGVyIChpZiBhbnkpLiAqLwotCWFzc2VydChhY2N1bWJpdHMgPCA4KTsKLQlhc3NlcnQoY2FycnkgPT0gMCk7ICAvKiBlbHNlIGRvX3R3b3NfY29tcCBhbmQgKmV2ZXJ5KiBkaWdpdCB3YXMgMCAqLwotCWlmIChhY2N1bWJpdHMgPiAwKSB7Ci0JCWlmIChqID49IG4pCi0JCQlnb3RvIE92ZXJmbG93OwotCQkrK2o7Ci0JCWlmIChkb190d29zX2NvbXApIHsKLQkJCS8qIEZpbGwgbGVhZGluZyBiaXRzIG9mIHRoZSBieXRlIHdpdGggc2lnbiBiaXRzCi0JCQkgICAoYXBwcm9wcmlhdGVseSBwcmV0ZW5kaW5nIHRoYXQgdGhlIGxvbmcgaGFkIGFuCi0JCQkgICBpbmZpbml0ZSBzdXBwbHkgb2Ygc2lnbiBiaXRzKS4gKi8KLQkJCWFjY3VtIHw9ICh+KHR3b2RpZ2l0cykwKSA8PCBhY2N1bWJpdHM7Ci0JCX0KLQkJKnAgPSAodW5zaWduZWQgY2hhcikoYWNjdW0gJiAweGZmKTsKLQkJcCArPSBwaW5jcjsKLQl9Ci0JZWxzZSBpZiAoaiA9PSBuICYmIG4gPiAwICYmIGlzX3NpZ25lZCkgewotCQkvKiBUaGUgbWFpbiBsb29wIGZpbGxlZCB0aGUgYnl0ZSBhcnJheSBleGFjdGx5LCBzbyB0aGUgY29kZQotCQkgICBqdXN0IGFib3ZlIGRpZG4ndCBnZXQgdG8gZW5zdXJlIHRoZXJlJ3MgYSBzaWduIGJpdCwgYW5kIHRoZQotCQkgICBsb29wIGJlbG93IHdvdWxkbid0IGFkZCBvbmUgZWl0aGVyLiAgTWFrZSBzdXJlIGEgc2lnbiBiaXQKLQkJICAgZXhpc3RzLiAqLwotCQl1bnNpZ25lZCBjaGFyIG1zYiA9ICoocCAtIHBpbmNyKTsKLQkJaW50IHNpZ25fYml0X3NldCA9IG1zYiA+PSAweDgwOwotCQlhc3NlcnQoYWNjdW1iaXRzID09IDApOwotCQlpZiAoc2lnbl9iaXRfc2V0ID09IGRvX3R3b3NfY29tcCkKLQkJCXJldHVybiAwOwotCQllbHNlCi0JCQlnb3RvIE92ZXJmbG93OwotCX0KKyAgICAvKiBTdG9yZSB0aGUgc3RyYWdnbGVyIChpZiBhbnkpLiAqLworICAgIGFzc2VydChhY2N1bWJpdHMgPCA4KTsKKyAgICBhc3NlcnQoY2FycnkgPT0gMCk7ICAvKiBlbHNlIGRvX3R3b3NfY29tcCBhbmQgKmV2ZXJ5KiBkaWdpdCB3YXMgMCAqLworICAgIGlmIChhY2N1bWJpdHMgPiAwKSB7CisgICAgICAgIGlmIChqID49IG4pCisgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgICAgICArK2o7CisgICAgICAgIGlmIChkb190d29zX2NvbXApIHsKKyAgICAgICAgICAgIC8qIEZpbGwgbGVhZGluZyBiaXRzIG9mIHRoZSBieXRlIHdpdGggc2lnbiBiaXRzCisgICAgICAgICAgICAgICAoYXBwcm9wcmlhdGVseSBwcmV0ZW5kaW5nIHRoYXQgdGhlIGxvbmcgaGFkIGFuCisgICAgICAgICAgICAgICBpbmZpbml0ZSBzdXBwbHkgb2Ygc2lnbiBiaXRzKS4gKi8KKyAgICAgICAgICAgIGFjY3VtIHw9ICh+KHR3b2RpZ2l0cykwKSA8PCBhY2N1bWJpdHM7CisgICAgICAgIH0KKyAgICAgICAgKnAgPSAodW5zaWduZWQgY2hhcikoYWNjdW0gJiAweGZmKTsKKyAgICAgICAgcCArPSBwaW5jcjsKKyAgICB9CisgICAgZWxzZSBpZiAoaiA9PSBuICYmIG4gPiAwICYmIGlzX3NpZ25lZCkgeworICAgICAgICAvKiBUaGUgbWFpbiBsb29wIGZpbGxlZCB0aGUgYnl0ZSBhcnJheSBleGFjdGx5LCBzbyB0aGUgY29kZQorICAgICAgICAgICBqdXN0IGFib3ZlIGRpZG4ndCBnZXQgdG8gZW5zdXJlIHRoZXJlJ3MgYSBzaWduIGJpdCwgYW5kIHRoZQorICAgICAgICAgICBsb29wIGJlbG93IHdvdWxkbid0IGFkZCBvbmUgZWl0aGVyLiAgTWFrZSBzdXJlIGEgc2lnbiBiaXQKKyAgICAgICAgICAgZXhpc3RzLiAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIG1zYiA9ICoocCAtIHBpbmNyKTsKKyAgICAgICAgaW50IHNpZ25fYml0X3NldCA9IG1zYiA+PSAweDgwOworICAgICAgICBhc3NlcnQoYWNjdW1iaXRzID09IDApOworICAgICAgICBpZiAoc2lnbl9iaXRfc2V0ID09IGRvX3R3b3NfY29tcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIE92ZXJmbG93OworICAgIH0KIAotCS8qIEZpbGwgcmVtYWluaW5nIGJ5dGVzIHdpdGggY29waWVzIG9mIHRoZSBzaWduIGJpdC4gKi8KLQl7Ci0JCXVuc2lnbmVkIGNoYXIgc2lnbmJ5dGUgPSBkb190d29zX2NvbXAgPyAweGZmVSA6IDBVOwotCQlmb3IgKCA7IGogPCBuOyArK2osIHAgKz0gcGluY3IpCi0JCQkqcCA9IHNpZ25ieXRlOwotCX0KKyAgICAvKiBGaWxsIHJlbWFpbmluZyBieXRlcyB3aXRoIGNvcGllcyBvZiB0aGUgc2lnbiBiaXQuICovCisgICAgeworICAgICAgICB1bnNpZ25lZCBjaGFyIHNpZ25ieXRlID0gZG9fdHdvc19jb21wID8gMHhmZlUgOiAwVTsKKyAgICAgICAgZm9yICggOyBqIDwgbjsgKytqLCBwICs9IHBpbmNyKQorICAgICAgICAgICAgKnAgPSBzaWduYnl0ZTsKKyAgICB9CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAogT3ZlcmZsb3c6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJsb25nIHRvbyBiaWcgdG8gY29udmVydCIpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImxvbmcgdG9vIGJpZyB0byBjb252ZXJ0Iik7CisgICAgcmV0dXJuIC0xOwogCiB9CiAKQEAgLTY4NSw0MiArNjg1LDQyIEBACiAgICBsZWFzdCBvbmUgcm91bmQgYml0IHRvIHN0YW5kIGluIGZvciB0aGUgaWdub3JlZCBsZWFzdC1zaWduaWZpY2FudCBiaXRzLgogKi8KICNkZWZpbmUgTkJJVFNfV0FOVEVEIDU3Ci0JUHlMb25nT2JqZWN0ICp2OwotCWRvdWJsZSB4OwotCWNvbnN0IGRvdWJsZSBtdWx0aXBsaWVyID0gKGRvdWJsZSkoMUwgPDwgUHlMb25nX1NISUZUKTsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHNpZ247Ci0JaW50IG5iaXRzbmVlZGVkOworICAgIFB5TG9uZ09iamVjdCAqdjsKKyAgICBkb3VibGUgeDsKKyAgICBjb25zdCBkb3VibGUgbXVsdGlwbGllciA9IChkb3VibGUpKDFMIDw8IFB5TG9uZ19TSElGVCk7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBzaWduOworICAgIGludCBuYml0c25lZWRlZDsKIAotCWlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXYgPSAoUHlMb25nT2JqZWN0ICopdnY7Ci0JaSA9IFB5X1NJWkUodik7Ci0Jc2lnbiA9IDE7Ci0JaWYgKGkgPCAwKSB7Ci0JCXNpZ24gPSAtMTsKLQkJaSA9IC0oaSk7Ci0JfQotCWVsc2UgaWYgKGkgPT0gMCkgewotCQkqZXhwb25lbnQgPSAwOwotCQlyZXR1cm4gMC4wOwotCX0KLQktLWk7Ci0JeCA9IChkb3VibGUpdi0+b2JfZGlnaXRbaV07Ci0JbmJpdHNuZWVkZWQgPSBOQklUU19XQU5URUQgLSAxOwotCS8qIEludmFyaWFudDogIGkgUHl0aG9uIGRpZ2l0cyByZW1haW4gdW5hY2NvdW50ZWQgZm9yLiAqLwotCXdoaWxlIChpID4gMCAmJiBuYml0c25lZWRlZCA+IDApIHsKLQkJLS1pOwotCQl4ID0geCAqIG11bHRpcGxpZXIgKyAoZG91YmxlKXYtPm9iX2RpZ2l0W2ldOwotCQluYml0c25lZWRlZCAtPSBQeUxvbmdfU0hJRlQ7Ci0JfQotCS8qIFRoZXJlIGFyZSBpIGRpZ2l0cyB3ZSBkaWRuJ3Qgc2hpZnQgaW4uICBQcmV0ZW5kaW5nIHRoZXkncmUgYWxsCi0JICAgemVyb2VzLCB0aGUgdHJ1ZSB2YWx1ZSBpcyB4ICogMioqKGkqUHlMb25nX1NISUZUKS4gKi8KLQkqZXhwb25lbnQgPSBpOwotCWFzc2VydCh4ID4gMC4wKTsKLQlyZXR1cm4geCAqIHNpZ247CisgICAgaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdiA9IChQeUxvbmdPYmplY3QgKil2djsKKyAgICBpID0gUHlfU0laRSh2KTsKKyAgICBzaWduID0gMTsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgc2lnbiA9IC0xOworICAgICAgICBpID0gLShpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoaSA9PSAwKSB7CisgICAgICAgICpleHBvbmVudCA9IDA7CisgICAgICAgIHJldHVybiAwLjA7CisgICAgfQorICAgIC0taTsKKyAgICB4ID0gKGRvdWJsZSl2LT5vYl9kaWdpdFtpXTsKKyAgICBuYml0c25lZWRlZCA9IE5CSVRTX1dBTlRFRCAtIDE7CisgICAgLyogSW52YXJpYW50OiAgaSBQeXRob24gZGlnaXRzIHJlbWFpbiB1bmFjY291bnRlZCBmb3IuICovCisgICAgd2hpbGUgKGkgPiAwICYmIG5iaXRzbmVlZGVkID4gMCkgeworICAgICAgICAtLWk7CisgICAgICAgIHggPSB4ICogbXVsdGlwbGllciArIChkb3VibGUpdi0+b2JfZGlnaXRbaV07CisgICAgICAgIG5iaXRzbmVlZGVkIC09IFB5TG9uZ19TSElGVDsKKyAgICB9CisgICAgLyogVGhlcmUgYXJlIGkgZGlnaXRzIHdlIGRpZG4ndCBzaGlmdCBpbi4gIFByZXRlbmRpbmcgdGhleSdyZSBhbGwKKyAgICAgICB6ZXJvZXMsIHRoZSB0cnVlIHZhbHVlIGlzIHggKiAyKiooaSpQeUxvbmdfU0hJRlQpLiAqLworICAgICpleHBvbmVudCA9IGk7CisgICAgYXNzZXJ0KHggPiAwLjApOworICAgIHJldHVybiB4ICogc2lnbjsKICN1bmRlZiBOQklUU19XQU5URUQKIH0KIApAQCAtNzI5LDMxICs3MjksMzEgQEAKIGRvdWJsZQogUHlMb25nX0FzRG91YmxlKFB5T2JqZWN0ICp2dikKIHsKLQlpbnQgZSA9IC0xOwotCWRvdWJsZSB4OworICAgIGludCBlID0gLTE7CisgICAgZG91YmxlIHg7CiAKLQlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl4ID0gX1B5TG9uZ19Bc1NjYWxlZERvdWJsZSh2diwgJmUpOwotCWlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xLjA7Ci0JLyogJ2UnIGluaXRpYWxpemVkIHRvIC0xIHRvIHNpbGVuY2UgZ2NjLTQuMC54LCBidXQgaXQgc2hvdWxkIGJlCi0JICAgc2V0IGNvcnJlY3RseSBhZnRlciBhIHN1Y2Nlc3NmdWwgX1B5TG9uZ19Bc1NjYWxlZERvdWJsZSgpIGNhbGwgKi8KLQlhc3NlcnQoZSA+PSAwKTsKLQlpZiAoZSA+IElOVF9NQVggLyBQeUxvbmdfU0hJRlQpCi0JCWdvdG8gb3ZlcmZsb3c7Ci0JZXJybm8gPSAwOwotCXggPSBsZGV4cCh4LCBlICogUHlMb25nX1NISUZUKTsKLQlpZiAoUHlfT1ZFUkZMT1dFRCh4KSkKLQkJZ290byBvdmVyZmxvdzsKLQlyZXR1cm4geDsKKyAgICBpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ID0gX1B5TG9uZ19Bc1NjYWxlZERvdWJsZSh2diwgJmUpOworICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIC0xLjA7CisgICAgLyogJ2UnIGluaXRpYWxpemVkIHRvIC0xIHRvIHNpbGVuY2UgZ2NjLTQuMC54LCBidXQgaXQgc2hvdWxkIGJlCisgICAgICAgc2V0IGNvcnJlY3RseSBhZnRlciBhIHN1Y2Nlc3NmdWwgX1B5TG9uZ19Bc1NjYWxlZERvdWJsZSgpIGNhbGwgKi8KKyAgICBhc3NlcnQoZSA+PSAwKTsKKyAgICBpZiAoZSA+IElOVF9NQVggLyBQeUxvbmdfU0hJRlQpCisgICAgICAgIGdvdG8gb3ZlcmZsb3c7CisgICAgZXJybm8gPSAwOworICAgIHggPSBsZGV4cCh4LCBlICogUHlMb25nX1NISUZUKTsKKyAgICBpZiAoUHlfT1ZFUkZMT1dFRCh4KSkKKyAgICAgICAgZ290byBvdmVyZmxvdzsKKyAgICByZXR1cm4geDsKIAogb3ZlcmZsb3c6Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCSJsb25nIGludCB0b28gbGFyZ2UgdG8gY29udmVydCB0byBmbG9hdCIpOwotCXJldHVybiAtMS4wOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAibG9uZyBpbnQgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gZmxvYXQiKTsKKyAgICByZXR1cm4gLTEuMDsKIH0KIAogLyogQ3JlYXRlIGEgbmV3IGxvbmcgKG9yIGludCkgb2JqZWN0IGZyb20gYSBDIHBvaW50ZXIgKi8KQEAgLTc2Miw5ICs3NjIsOSBAQAogUHlMb25nX0Zyb21Wb2lkUHRyKHZvaWQgKnApCiB7CiAjaWYgU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9ORwotCWlmICgobG9uZylwIDwgMCkKLQkJcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKXApOwotCXJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylwKTsKKyAgICBpZiAoKGxvbmcpcCA8IDApCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZylwKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpcCk7CiAjZWxzZQogCiAjaWZuZGVmIEhBVkVfTE9OR19MT05HCkBAIC03NzMsMTAgKzc3MywxMCBAQAogI2lmIFNJWkVPRl9MT05HX0xPTkcgPCBTSVpFT0ZfVk9JRF9QCiAjICAgZXJyb3IgIlB5TG9uZ19Gcm9tVm9pZFB0cjogc2l6ZW9mKFBZX0xPTkdfTE9ORykgPCBzaXplb2Yodm9pZCopIgogI2VuZGlmCi0JLyogb3B0aW1pemUgbnVsbCBwb2ludGVycyAqLwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKLQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpcCk7CisgICAgLyogb3B0aW1pemUgbnVsbCBwb2ludGVycyAqLworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygwKTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKCh1bnNpZ25lZCBQWV9MT05HX0xPTkcpcCk7CiAKICNlbmRpZiAvKiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HICovCiB9CkBAIC03ODYsMTkgKzc4NiwxOSBAQAogdm9pZCAqCiBQeUxvbmdfQXNWb2lkUHRyKFB5T2JqZWN0ICp2dikKIHsKLQkvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb3cgaW50IG9yIGxvbmcgb2JqZWN0cy4gSWYgdnYgaXMgbmVpdGhlciwKLQkgICB0aGVuIHRoZSBQeUxvbmdfQXNMb25nKigpIGZ1bmN0aW9ucyB3aWxsIHJhaXNlIHRoZSBleGNlcHRpb246Ci0JICAgUHlFeGNfU3lzdGVtRXJyb3IsICJiYWQgYXJndW1lbnQgdG8gaW50ZXJuYWwgZnVuY3Rpb24iCi0JKi8KKyAgICAvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxsb3cgaW50IG9yIGxvbmcgb2JqZWN0cy4gSWYgdnYgaXMgbmVpdGhlciwKKyAgICAgICB0aGVuIHRoZSBQeUxvbmdfQXNMb25nKigpIGZ1bmN0aW9ucyB3aWxsIHJhaXNlIHRoZSBleGNlcHRpb246CisgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsICJiYWQgYXJndW1lbnQgdG8gaW50ZXJuYWwgZnVuY3Rpb24iCisgICAgKi8KICNpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HCi0JbG9uZyB4OworICAgIGxvbmcgeDsKIAotCWlmIChQeUludF9DaGVjayh2dikpCi0JCXggPSBQeUludF9BU19MT05HKHZ2KTsKLQllbHNlIGlmIChQeUxvbmdfQ2hlY2sodnYpICYmIF9QeUxvbmdfU2lnbih2dikgPCAwKQotCQl4ID0gUHlMb25nX0FzTG9uZyh2dik7Ci0JZWxzZQotCQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKHZ2KTsKKyAgICBpZiAoUHlJbnRfQ2hlY2sodnYpKQorICAgICAgICB4ID0gUHlJbnRfQVNfTE9ORyh2dik7CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKHZ2KSAmJiBfUHlMb25nX1NpZ24odnYpIDwgMCkKKyAgICAgICAgeCA9IFB5TG9uZ19Bc0xvbmcodnYpOworICAgIGVsc2UKKyAgICAgICAgeCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2dik7CiAjZWxzZQogCiAjaWZuZGVmIEhBVkVfTE9OR19MT05HCkBAIC04MDcsMjAgKzgwNywyMCBAQAogI2lmIFNJWkVPRl9MT05HX0xPTkcgPCBTSVpFT0ZfVk9JRF9QCiAjICAgZXJyb3IgIlB5TG9uZ19Bc1ZvaWRQdHI6IHNpemVvZihQWV9MT05HX0xPTkcpIDwgc2l6ZW9mKHZvaWQqKSIKICNlbmRpZgotCVBZX0xPTkdfTE9ORyB4OworICAgIFBZX0xPTkdfTE9ORyB4OwogCi0JaWYgKFB5SW50X0NoZWNrKHZ2KSkKLQkJeCA9IFB5SW50X0FTX0xPTkcodnYpOwotCWVsc2UgaWYgKFB5TG9uZ19DaGVjayh2dikgJiYgX1B5TG9uZ19TaWduKHZ2KSA8IDApCi0JCXggPSBQeUxvbmdfQXNMb25nTG9uZyh2dik7Ci0JZWxzZQotCQl4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2dik7CisgICAgaWYgKFB5SW50X0NoZWNrKHZ2KSkKKyAgICAgICAgeCA9IFB5SW50X0FTX0xPTkcodnYpOworICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayh2dikgJiYgX1B5TG9uZ19TaWduKHZ2KSA8IDApCisgICAgICAgIHggPSBQeUxvbmdfQXNMb25nTG9uZyh2dik7CisgICAgZWxzZQorICAgICAgICB4ID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyh2dik7CiAKICNlbmRpZiAvKiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HICovCiAKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKHZvaWQgKil4OworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAodm9pZCAqKXg7CiB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwpAQCAtODM2LDQyICs4MzYsNDIgQEAKIFB5T2JqZWN0ICoKIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoUFlfTE9OR19MT05HIGl2YWwpCiB7Ci0JUHlMb25nT2JqZWN0ICp2OwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyBhYnNfaXZhbDsKLQl1bnNpZ25lZCBQWV9MT05HX0xPTkcgdDsgIC8qIHVuc2lnbmVkIHNvID4+IGRvZXNuJ3QgcHJvcGFnYXRlIHNpZ24gYml0ICovCi0JaW50IG5kaWdpdHMgPSAwOwotCWludCBuZWdhdGl2ZSA9IDA7CisgICAgUHlMb25nT2JqZWN0ICp2OworICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyBhYnNfaXZhbDsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgdDsgIC8qIHVuc2lnbmVkIHNvID4+IGRvZXNuJ3QgcHJvcGFnYXRlIHNpZ24gYml0ICovCisgICAgaW50IG5kaWdpdHMgPSAwOworICAgIGludCBuZWdhdGl2ZSA9IDA7CiAKLQlpZiAoaXZhbCA8IDApIHsKLQkJLyogYXZvaWQgc2lnbmVkIG92ZXJmbG93IG9uIG5lZ2F0aW9uOyAgc2VlIGNvbW1lbnRzCi0JCSAgIGluIFB5TG9uZ19Gcm9tTG9uZyBhYm92ZS4gKi8KLQkJYWJzX2l2YWwgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKSgtMS1pdmFsKSArIDE7Ci0JCW5lZ2F0aXZlID0gMTsKLQl9Ci0JZWxzZSB7Ci0JCWFic19pdmFsID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylpdmFsOwotCX0KKyAgICBpZiAoaXZhbCA8IDApIHsKKyAgICAgICAgLyogYXZvaWQgc2lnbmVkIG92ZXJmbG93IG9uIG5lZ2F0aW9uOyAgc2VlIGNvbW1lbnRzCisgICAgICAgICAgIGluIFB5TG9uZ19Gcm9tTG9uZyBhYm92ZS4gKi8KKyAgICAgICAgYWJzX2l2YWwgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKSgtMS1pdmFsKSArIDE7CisgICAgICAgIG5lZ2F0aXZlID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFic19pdmFsID0gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORylpdmFsOworICAgIH0KIAotCS8qIENvdW50IHRoZSBudW1iZXIgb2YgUHl0aG9uIGRpZ2l0cy4KLQkgICBXZSB1c2VkIHRvIHBpY2sgNSAoImJpZyBlbm91Z2ggZm9yIGFueXRoaW5nIiksIGJ1dCB0aGF0J3MgYQotCSAgIHdhc3RlIG9mIHRpbWUgYW5kIHNwYWNlIGdpdmVuIHRoYXQgNSoxNSA9IDc1IGJpdHMgYXJlIHJhcmVseQotCSAgIG5lZWRlZC4gKi8KLQl0ID0gYWJzX2l2YWw7Ci0Jd2hpbGUgKHQpIHsKLQkJKytuZGlnaXRzOwotCQl0ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JfQotCXYgPSBfUHlMb25nX05ldyhuZGlnaXRzKTsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCWRpZ2l0ICpwID0gdi0+b2JfZGlnaXQ7Ci0JCVB5X1NJWkUodikgPSBuZWdhdGl2ZSA/IC1uZGlnaXRzIDogbmRpZ2l0czsKLQkJdCA9IGFic19pdmFsOwotCQl3aGlsZSAodCkgewotCQkJKnArKyA9IChkaWdpdCkodCAmIFB5TG9uZ19NQVNLKTsKLQkJCXQgPj49IFB5TG9uZ19TSElGVDsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopdjsKKyAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIFB5dGhvbiBkaWdpdHMuCisgICAgICAgV2UgdXNlZCB0byBwaWNrIDUgKCJiaWcgZW5vdWdoIGZvciBhbnl0aGluZyIpLCBidXQgdGhhdCdzIGEKKyAgICAgICB3YXN0ZSBvZiB0aW1lIGFuZCBzcGFjZSBnaXZlbiB0aGF0IDUqMTUgPSA3NSBiaXRzIGFyZSByYXJlbHkKKyAgICAgICBuZWVkZWQuICovCisgICAgdCA9IGFic19pdmFsOworICAgIHdoaWxlICh0KSB7CisgICAgICAgICsrbmRpZ2l0czsKKyAgICAgICAgdCA+Pj0gUHlMb25nX1NISUZUOworICAgIH0KKyAgICB2ID0gX1B5TG9uZ19OZXcobmRpZ2l0cyk7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBkaWdpdCAqcCA9IHYtPm9iX2RpZ2l0OworICAgICAgICBQeV9TSVpFKHYpID0gbmVnYXRpdmUgPyAtbmRpZ2l0cyA6IG5kaWdpdHM7CisgICAgICAgIHQgPSBhYnNfaXZhbDsKKyAgICAgICAgd2hpbGUgKHQpIHsKKyAgICAgICAgICAgICpwKysgPSAoZGlnaXQpKHQgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICB0ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXY7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBsb25nIGludCBvYmplY3QgZnJvbSBhIEMgdW5zaWduZWQgUFlfTE9OR19MT05HIGludC4gKi8KQEAgLTg3OSwyNiArODc5LDI2IEBACiBQeU9iamVjdCAqCiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodW5zaWduZWQgUFlfTE9OR19MT05HIGl2YWwpCiB7Ci0JUHlMb25nT2JqZWN0ICp2OwotCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB0OwotCWludCBuZGlnaXRzID0gMDsKKyAgICBQeUxvbmdPYmplY3QgKnY7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIHQ7CisgICAgaW50IG5kaWdpdHMgPSAwOwogCi0JLyogQ291bnQgdGhlIG51bWJlciBvZiBQeXRob24gZGlnaXRzLiAqLwotCXQgPSAodW5zaWduZWQgUFlfTE9OR19MT05HKWl2YWw7Ci0Jd2hpbGUgKHQpIHsKLQkJKytuZGlnaXRzOwotCQl0ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JfQotCXYgPSBfUHlMb25nX05ldyhuZGlnaXRzKTsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCWRpZ2l0ICpwID0gdi0+b2JfZGlnaXQ7Ci0JCVB5X1NJWkUodikgPSBuZGlnaXRzOwotCQl3aGlsZSAoaXZhbCkgewotCQkJKnArKyA9IChkaWdpdCkoaXZhbCAmIFB5TG9uZ19NQVNLKTsKLQkJCWl2YWwgPj49IFB5TG9uZ19TSElGVDsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopdjsKKyAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIFB5dGhvbiBkaWdpdHMuICovCisgICAgdCA9ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpaXZhbDsKKyAgICB3aGlsZSAodCkgeworICAgICAgICArK25kaWdpdHM7CisgICAgICAgIHQgPj49IFB5TG9uZ19TSElGVDsKKyAgICB9CisgICAgdiA9IF9QeUxvbmdfTmV3KG5kaWdpdHMpOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgZGlnaXQgKnAgPSB2LT5vYl9kaWdpdDsKKyAgICAgICAgUHlfU0laRSh2KSA9IG5kaWdpdHM7CisgICAgICAgIHdoaWxlIChpdmFsKSB7CisgICAgICAgICAgICAqcCsrID0gKGRpZ2l0KShpdmFsICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgaXZhbCA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKil2OwogfQogCiAvKiBDcmVhdGUgYSBuZXcgbG9uZyBpbnQgb2JqZWN0IGZyb20gYSBDIFB5X3NzaXplX3QuICovCkBAIC05MDYsMTEgKzkwNiwxMSBAQAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21Tc2l6ZV90KFB5X3NzaXplX3QgaXZhbCkKIHsKLQlQeV9zc2l6ZV90IGJ5dGVzID0gaXZhbDsKLQlpbnQgb25lID0gMTsKLQlyZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KAotCQkJKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCi0JCQlTSVpFT0ZfU0laRV9ULCBJU19MSVRUTEVfRU5ESUFOLCAxKTsKKyAgICBQeV9zc2l6ZV90IGJ5dGVzID0gaXZhbDsKKyAgICBpbnQgb25lID0gMTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSZieXRlcywKKyAgICAgICAgICAgICAgICAgICAgU0laRU9GX1NJWkVfVCwgSVNfTElUVExFX0VORElBTiwgMSk7CiB9CiAKIC8qIENyZWF0ZSBhIG5ldyBsb25nIGludCBvYmplY3QgZnJvbSBhIEMgc2l6ZV90LiAqLwpAQCAtOTE4LDExICs5MTgsMTEgQEAKIFB5T2JqZWN0ICoKIFB5TG9uZ19Gcm9tU2l6ZV90KHNpemVfdCBpdmFsKQogewotCXNpemVfdCBieXRlcyA9IGl2YWw7Ci0JaW50IG9uZSA9IDE7Ci0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgKLQkJCSh1bnNpZ25lZCBjaGFyICopJmJ5dGVzLAotCQkJU0laRU9GX1NJWkVfVCwgSVNfTElUVExFX0VORElBTiwgMCk7CisgICAgc2l6ZV90IGJ5dGVzID0gaXZhbDsKKyAgICBpbnQgb25lID0gMTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSZieXRlcywKKyAgICAgICAgICAgICAgICAgICAgU0laRU9GX1NJWkVfVCwgSVNfTElUVExFX0VORElBTiwgMCk7CiB9CiAKIC8qIEdldCBhIEMgUFlfTE9OR19MT05HIGludCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LgpAQCAtOTMxLDUxICs5MzEsNTEgQEAKIFBZX0xPTkdfTE9ORwogUHlMb25nX0FzTG9uZ0xvbmcoUHlPYmplY3QgKnZ2KQogewotCVBZX0xPTkdfTE9ORyBieXRlczsKLQlpbnQgb25lID0gMTsKLQlpbnQgcmVzOworICAgIFBZX0xPTkdfTE9ORyBieXRlczsKKyAgICBpbnQgb25lID0gMTsKKyAgICBpbnQgcmVzOwogCi0JaWYgKHZ2ID09IE5VTEwpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeUxvbmdfQ2hlY2sodnYpKSB7Ci0JCVB5TnVtYmVyTWV0aG9kcyAqbmI7Ci0JCVB5T2JqZWN0ICppbzsKLQkJaWYgKFB5SW50X0NoZWNrKHZ2KSkKLQkJCXJldHVybiAoUFlfTE9OR19MT05HKVB5SW50X0FzTG9uZyh2dik7Ci0JCWlmICgobmIgPSB2di0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8Ci0JCSAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaW8gPSAoKm5iLT5uYl9pbnQpICh2dik7Ci0JCWlmIChpbyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlJbnRfQ2hlY2soaW8pKSB7Ci0JCQlieXRlcyA9IFB5SW50X0FzTG9uZyhpbyk7Ci0JCQlQeV9ERUNSRUYoaW8pOwotCQkJcmV0dXJuIGJ5dGVzOwotCQl9Ci0JCWlmIChQeUxvbmdfQ2hlY2soaW8pKSB7Ci0JCQlieXRlcyA9IFB5TG9uZ19Bc0xvbmdMb25nKGlvKTsKLQkJCVB5X0RFQ1JFRihpbyk7Ci0JCQlyZXR1cm4gYnl0ZXM7Ci0JCX0KLQkJUHlfREVDUkVGKGlvKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImludGVnZXIgY29udmVyc2lvbiBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAodnYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKKyAgICAgICAgUHlPYmplY3QgKmlvOworICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodnYpKQorICAgICAgICAgICAgcmV0dXJuIChQWV9MT05HX0xPTkcpUHlJbnRfQXNMb25nKHZ2KTsKKyAgICAgICAgaWYgKChuYiA9IHZ2LT5vYl90eXBlLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKKyAgICAgICAgICAgIG5iLT5uYl9pbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpbyA9ICgqbmItPm5iX2ludCkgKHZ2KTsKKyAgICAgICAgaWYgKGlvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeUludF9DaGVjayhpbykpIHsKKyAgICAgICAgICAgIGJ5dGVzID0gUHlJbnRfQXNMb25nKGlvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbyk7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayhpbykpIHsKKyAgICAgICAgICAgIGJ5dGVzID0gUHlMb25nX0FzTG9uZ0xvbmcoaW8pOworICAgICAgICAgICAgUHlfREVDUkVGKGlvKTsKKyAgICAgICAgICAgIHJldHVybiBieXRlczsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoaW8pOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaW50ZWdlciBjb252ZXJzaW9uIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmVzID0gX1B5TG9uZ19Bc0J5dGVBcnJheSgKLQkJCShQeUxvbmdPYmplY3QgKil2diwgKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCi0JCQlTSVpFT0ZfTE9OR19MT05HLCBJU19MSVRUTEVfRU5ESUFOLCAxKTsKKyAgICByZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAoUHlMb25nT2JqZWN0ICopdnYsICh1bnNpZ25lZCBjaGFyICopJmJ5dGVzLAorICAgICAgICAgICAgICAgICAgICBTSVpFT0ZfTE9OR19MT05HLCBJU19MSVRUTEVfRU5ESUFOLCAxKTsKIAotCS8qIFBsYW4gOSBjYW4ndCBoYW5kbGUgUFlfTE9OR19MT05HIGluID8gOiBleHByZXNzaW9ucyAqLwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gKFBZX0xPTkdfTE9ORyktMTsKLQllbHNlCi0JCXJldHVybiBieXRlczsKKyAgICAvKiBQbGFuIDkgY2FuJ3QgaGFuZGxlIFBZX0xPTkdfTE9ORyBpbiA/IDogZXhwcmVzc2lvbnMgKi8KKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIChQWV9MT05HX0xPTkcpLTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYnl0ZXM7CiB9CiAKIC8qIEdldCBhIEMgdW5zaWduZWQgUFlfTE9OR19MT05HIGludCBmcm9tIGEgbG9uZyBpbnQgb2JqZWN0LgpAQCAtOTg0LDI0ICs5ODQsMjQgQEAKIHVuc2lnbmVkIFBZX0xPTkdfTE9ORwogUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyhQeU9iamVjdCAqdnYpCiB7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIGJ5dGVzOwotCWludCBvbmUgPSAxOwotCWludCByZXM7CisgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIGJ5dGVzOworICAgIGludCBvbmUgPSAxOworICAgIGludCByZXM7CiAKLQlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTE7Ci0JfQorICAgIGlmICh2diA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2sodnYpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyktMTsKKyAgICB9CiAKLQlyZXMgPSBfUHlMb25nX0FzQnl0ZUFycmF5KAotCQkJKFB5TG9uZ09iamVjdCAqKXZ2LCAodW5zaWduZWQgY2hhciAqKSZieXRlcywKLQkJCVNJWkVPRl9MT05HX0xPTkcsIElTX0xJVFRMRV9FTkRJQU4sIDApOworICAgIHJlcyA9IF9QeUxvbmdfQXNCeXRlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgIChQeUxvbmdPYmplY3QgKil2diwgKHVuc2lnbmVkIGNoYXIgKikmYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIFNJWkVPRl9MT05HX0xPTkcsIElTX0xJVFRMRV9FTkRJQU4sIDApOwogCi0JLyogUGxhbiA5IGNhbid0IGhhbmRsZSBQWV9MT05HX0xPTkcgaW4gPyA6IGV4cHJlc3Npb25zICovCi0JaWYgKHJlcyA8IDApCi0JCXJldHVybiAodW5zaWduZWQgUFlfTE9OR19MT05HKXJlczsKLQllbHNlCi0JCXJldHVybiBieXRlczsKKyAgICAvKiBQbGFuIDkgY2FuJ3QgaGFuZGxlIFBZX0xPTkdfTE9ORyBpbiA/IDogZXhwcmVzc2lvbnMgKi8KKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpcmVzOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGJ5dGVzOwogfQogCiAvKiBHZXQgYSBDIHVuc2lnbmVkIGxvbmcgaW50IGZyb20gYSBsb25nIGludCBvYmplY3QsIGlnbm9yaW5nIHRoZSBoaWdoIGJpdHMuCkBAIC0xMDEwLDI3ICsxMDEwLDI3IEBACiB1bnNpZ25lZCBQWV9MT05HX0xPTkcKIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKFB5T2JqZWN0ICp2dikKIHsKLQlyZWdpc3RlciBQeUxvbmdPYmplY3QgKnY7Ci0JdW5zaWduZWQgUFlfTE9OR19MT05HIHg7Ci0JUHlfc3NpemVfdCBpOwotCWludCBzaWduOworICAgIHJlZ2lzdGVyIFB5TG9uZ09iamVjdCAqdjsKKyAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgeDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHNpZ247CiAKLQlpZiAodnYgPT0gTlVMTCB8fCAhUHlMb25nX0NoZWNrKHZ2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtMTsKLQl9Ci0JdiA9IChQeUxvbmdPYmplY3QgKil2djsKLQlpID0gdi0+b2Jfc2l6ZTsKLQlzaWduID0gMTsKLQl4ID0gMDsKLQlpZiAoaSA8IDApIHsKLQkJc2lnbiA9IC0xOwotCQlpID0gLWk7Ci0JfQotCXdoaWxlICgtLWkgPj0gMCkgewotCQl4ID0gKHggPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2ldOwotCX0KLQlyZXR1cm4geCAqIHNpZ247CisgICAgaWYgKHZ2ID09IE5VTEwgfHwgIVB5TG9uZ19DaGVjayh2dikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAodW5zaWduZWQgbG9uZykgLTE7CisgICAgfQorICAgIHYgPSAoUHlMb25nT2JqZWN0ICopdnY7CisgICAgaSA9IHYtPm9iX3NpemU7CisgICAgc2lnbiA9IDE7CisgICAgeCA9IDA7CisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgaSA9IC1pOworICAgIH0KKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgeCA9ICh4IDw8IFB5TG9uZ19TSElGVCkgKyB2LT5vYl9kaWdpdFtpXTsKKyAgICB9CisgICAgcmV0dXJuIHggKiBzaWduOwogfQogI3VuZGVmIElTX0xJVFRMRV9FTkRJQU4KIApAQCAtMTAzOSwzNSArMTAzOSwzNSBAQAogCiBzdGF0aWMgaW50CiBjb252ZXJ0X2Jpbm9wKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgUHlMb25nT2JqZWN0ICoqYSwgUHlMb25nT2JqZWN0ICoqYikgewotCWlmIChQeUxvbmdfQ2hlY2sodikpIHsKLQkJKmEgPSAoUHlMb25nT2JqZWN0ICopIHY7Ci0JCVB5X0lOQ1JFRih2KTsKLQl9Ci0JZWxzZSBpZiAoUHlJbnRfQ2hlY2sodikpIHsKLQkJKmEgPSAoUHlMb25nT2JqZWN0ICopIFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHYpKTsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoUHlMb25nX0NoZWNrKHcpKSB7Ci0JCSpiID0gKFB5TG9uZ09iamVjdCAqKSB3OwotCQlQeV9JTkNSRUYodyk7Ci0JfQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKHcpKSB7Ci0JCSpiID0gKFB5TG9uZ09iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh3KSk7Ci0JfQotCWVsc2UgewotCQlQeV9ERUNSRUYoKmEpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKFB5TG9uZ19DaGVjayh2KSkgeworICAgICAgICAqYSA9IChQeUxvbmdPYmplY3QgKikgdjsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgIH0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayh2KSkgeworICAgICAgICAqYSA9IChQeUxvbmdPYmplY3QgKikgUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcodikpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChQeUxvbmdfQ2hlY2sodykpIHsKKyAgICAgICAgKmIgPSAoUHlMb25nT2JqZWN0ICopIHc7CisgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2sodykpIHsKKyAgICAgICAgKmIgPSAoUHlMb25nT2JqZWN0ICopIFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHcpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRigqYSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogI2RlZmluZSBDT05WRVJUX0JJTk9QKHYsIHcsIGEsIGIpIFwKLQlpZiAoIWNvbnZlcnRfYmlub3AodiwgdywgYSwgYikpIHsgXAotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOyBcCi0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsgXAotCX0KKyAgICBpZiAoIWNvbnZlcnRfYmlub3AodiwgdywgYSwgYikpIHsgXAorICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOyBcCisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsgXAorICAgIH0KIAogLyogeFswOm1dIGFuZCB5WzA6bl0gYXJlIGRpZ2l0IHZlY3RvcnMsIExTRCBmaXJzdCwgbSA+PSBuIHJlcXVpcmVkLiAgeFswOm5dCiAgKiBpcyBtb2RpZmllZCBpbiBwbGFjZSwgYnkgYWRkaW5nIHkgdG8gaXQuICBDYXJyaWVzIGFyZSBwcm9wYWdhdGVkIGFzIGZhciBhcwpAQCAtMTA3NiwyMyArMTA3NiwyMyBAQAogc3RhdGljIGRpZ2l0CiB2X2lhZGQoZGlnaXQgKngsIFB5X3NzaXplX3QgbSwgZGlnaXQgKnksIFB5X3NzaXplX3QgbikKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JZGlnaXQgY2FycnkgPSAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBkaWdpdCBjYXJyeSA9IDA7CiAKLQlhc3NlcnQobSA+PSBuKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCWNhcnJ5ICs9IHhbaV0gKyB5W2ldOwotCQl4W2ldID0gY2FycnkgJiBQeUxvbmdfTUFTSzsKLQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQkJYXNzZXJ0KChjYXJyeSAmIDEpID09IGNhcnJ5KTsKLQl9Ci0JZm9yICg7IGNhcnJ5ICYmIGkgPCBtOyArK2kpIHsKLQkJY2FycnkgKz0geFtpXTsKLQkJeFtpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7Ci0JCWNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCWFzc2VydCgoY2FycnkgJiAxKSA9PSBjYXJyeSk7Ci0JfQotCXJldHVybiBjYXJyeTsKKyAgICBhc3NlcnQobSA+PSBuKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGNhcnJ5ICs9IHhbaV0gKyB5W2ldOworICAgICAgICB4W2ldID0gY2FycnkgJiBQeUxvbmdfTUFTSzsKKyAgICAgICAgY2FycnkgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgYXNzZXJ0KChjYXJyeSAmIDEpID09IGNhcnJ5KTsKKyAgICB9CisgICAgZm9yICg7IGNhcnJ5ICYmIGkgPCBtOyArK2kpIHsKKyAgICAgICAgY2FycnkgKz0geFtpXTsKKyAgICAgICAgeFtpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7CisgICAgICAgIGNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIGFzc2VydCgoY2FycnkgJiAxKSA9PSBjYXJyeSk7CisgICAgfQorICAgIHJldHVybiBjYXJyeTsKIH0KIAogLyogeFswOm1dIGFuZCB5WzA6bl0gYXJlIGRpZ2l0IHZlY3RvcnMsIExTRCBmaXJzdCwgbSA+PSBuIHJlcXVpcmVkLiAgeFswOm5dCkBAIC0xMTAyLDIzICsxMTAyLDIzIEBACiBzdGF0aWMgZGlnaXQKIHZfaXN1YihkaWdpdCAqeCwgUHlfc3NpemVfdCBtLCBkaWdpdCAqeSwgUHlfc3NpemVfdCBuKQogewotCVB5X3NzaXplX3QgaTsKLQlkaWdpdCBib3Jyb3cgPSAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBkaWdpdCBib3Jyb3cgPSAwOwogCi0JYXNzZXJ0KG0gPj0gbik7Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlib3Jyb3cgPSB4W2ldIC0geVtpXSAtIGJvcnJvdzsKLQkJeFtpXSA9IGJvcnJvdyAmIFB5TG9uZ19NQVNLOwotCQlib3Jyb3cgPj49IFB5TG9uZ19TSElGVDsKLQkJYm9ycm93ICY9IDE7CS8qIGtlZXAgb25seSAxIHNpZ24gYml0ICovCi0JfQotCWZvciAoOyBib3Jyb3cgJiYgaSA8IG07ICsraSkgewotCQlib3Jyb3cgPSB4W2ldIC0gYm9ycm93OwotCQl4W2ldID0gYm9ycm93ICYgUHlMb25nX01BU0s7Ci0JCWJvcnJvdyA+Pj0gUHlMb25nX1NISUZUOwotCQlib3Jyb3cgJj0gMTsKLQl9Ci0JcmV0dXJuIGJvcnJvdzsKKyAgICBhc3NlcnQobSA+PSBuKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGJvcnJvdyA9IHhbaV0gLSB5W2ldIC0gYm9ycm93OworICAgICAgICB4W2ldID0gYm9ycm93ICYgUHlMb25nX01BU0s7CisgICAgICAgIGJvcnJvdyA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICBib3Jyb3cgJj0gMTsgICAgICAgICAgICAvKiBrZWVwIG9ubHkgMSBzaWduIGJpdCAqLworICAgIH0KKyAgICBmb3IgKDsgYm9ycm93ICYmIGkgPCBtOyArK2kpIHsKKyAgICAgICAgYm9ycm93ID0geFtpXSAtIGJvcnJvdzsKKyAgICAgICAgeFtpXSA9IGJvcnJvdyAmIFB5TG9uZ19NQVNLOworICAgICAgICBib3Jyb3cgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgYm9ycm93ICY9IDE7CisgICAgfQorICAgIHJldHVybiBib3Jyb3c7CiB9CiAKIC8qIE11bHRpcGx5IGJ5IGEgc2luZ2xlIGRpZ2l0LCBpZ25vcmluZyB0aGUgc2lnbi4gKi8KQEAgLTExMjYsNyArMTEyNiw3IEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICoKIG11bDEoUHlMb25nT2JqZWN0ICphLCB3ZGlnaXQgbikKIHsKLQlyZXR1cm4gbXVsYWRkMShhLCBuLCAoZGlnaXQpMCk7CisgICAgcmV0dXJuIG11bGFkZDEoYSwgbiwgKGRpZ2l0KTApOwogfQogCiAvKiBNdWx0aXBseSBieSBhIHNpbmdsZSBkaWdpdCBhbmQgYWRkIGEgc2luZ2xlIGRpZ2l0LCBpZ25vcmluZyB0aGUgc2lnbi4gKi8KQEAgLTExMzQsMjAgKzExMzQsMjAgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKgogbXVsYWRkMShQeUxvbmdPYmplY3QgKmEsIHdkaWdpdCBuLCB3ZGlnaXQgZXh0cmEpCiB7Ci0JUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSk7Ci0JUHlMb25nT2JqZWN0ICp6ID0gX1B5TG9uZ19OZXcoc2l6ZV9hKzEpOwotCXR3b2RpZ2l0cyBjYXJyeSA9IGV4dHJhOwotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IHNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBQeUxvbmdPYmplY3QgKnogPSBfUHlMb25nX05ldyhzaXplX2ErMSk7CisgICAgdHdvZGlnaXRzIGNhcnJ5ID0gZXh0cmE7CisgICAgUHlfc3NpemVfdCBpOwogCi0JaWYgKHogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IHNpemVfYTsgKytpKSB7Ci0JCWNhcnJ5ICs9ICh0d29kaWdpdHMpYS0+b2JfZGlnaXRbaV0gKiBuOwotCQl6LT5vYl9kaWdpdFtpXSA9IChkaWdpdCkgKGNhcnJ5ICYgUHlMb25nX01BU0spOwotCQljYXJyeSA+Pj0gUHlMb25nX1NISUZUOwotCX0KLQl6LT5vYl9kaWdpdFtpXSA9IChkaWdpdCkgY2Fycnk7Ci0JcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOworICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgeworICAgICAgICBjYXJyeSArPSAodHdvZGlnaXRzKWEtPm9iX2RpZ2l0W2ldICogbjsKKyAgICAgICAgei0+b2JfZGlnaXRbaV0gPSAoZGlnaXQpIChjYXJyeSAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgY2FycnkgPj49IFB5TG9uZ19TSElGVDsKKyAgICB9CisgICAgei0+b2JfZGlnaXRbaV0gPSAoZGlnaXQpIGNhcnJ5OworICAgIHJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKIH0KIAogLyogRGl2aWRlIGxvbmcgcGluLCB3LyBzaXplIGRpZ2l0cywgYnkgbm9uLXplcm8gZGlnaXQgbiwgc3RvcmluZyBxdW90aWVudApAQCAtMTE1OSwxOCArMTE1OSwxOCBAQAogc3RhdGljIGRpZ2l0CiBpbnBsYWNlX2RpdnJlbTEoZGlnaXQgKnBvdXQsIGRpZ2l0ICpwaW4sIFB5X3NzaXplX3Qgc2l6ZSwgZGlnaXQgbikKIHsKLQl0d29kaWdpdHMgcmVtID0gMDsKKyAgICB0d29kaWdpdHMgcmVtID0gMDsKIAotCWFzc2VydChuID4gMCAmJiBuIDw9IFB5TG9uZ19NQVNLKTsKLQlwaW4gKz0gc2l6ZTsKLQlwb3V0ICs9IHNpemU7Ci0Jd2hpbGUgKC0tc2l6ZSA+PSAwKSB7Ci0JCWRpZ2l0IGhpOwotCQlyZW0gPSAocmVtIDw8IFB5TG9uZ19TSElGVCkgKyAqLS1waW47Ci0JCSotLXBvdXQgPSBoaSA9IChkaWdpdCkocmVtIC8gbik7Ci0JCXJlbSAtPSAodHdvZGlnaXRzKWhpICogbjsKLQl9Ci0JcmV0dXJuIChkaWdpdClyZW07CisgICAgYXNzZXJ0KG4gPiAwICYmIG4gPD0gUHlMb25nX01BU0spOworICAgIHBpbiArPSBzaXplOworICAgIHBvdXQgKz0gc2l6ZTsKKyAgICB3aGlsZSAoLS1zaXplID49IDApIHsKKyAgICAgICAgZGlnaXQgaGk7CisgICAgICAgIHJlbSA9IChyZW0gPDwgUHlMb25nX1NISUZUKSArICotLXBpbjsKKyAgICAgICAgKi0tcG91dCA9IGhpID0gKGRpZ2l0KShyZW0gLyBuKTsKKyAgICAgICAgcmVtIC09ICh0d29kaWdpdHMpaGkgKiBuOworICAgIH0KKyAgICByZXR1cm4gKGRpZ2l0KXJlbTsKIH0KIAogLyogRGl2aWRlIGEgbG9uZyBpbnRlZ2VyIGJ5IGEgZGlnaXQsIHJldHVybmluZyBib3RoIHRoZSBxdW90aWVudApAQCAtMTE4MCwxNSArMTE4MCwxNSBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiBkaXZyZW0xKFB5TG9uZ09iamVjdCAqYSwgZGlnaXQgbiwgZGlnaXQgKnByZW0pCiB7Ci0JY29uc3QgUHlfc3NpemVfdCBzaXplID0gQUJTKFB5X1NJWkUoYSkpOwotCVB5TG9uZ09iamVjdCAqejsKKyAgICBjb25zdCBQeV9zc2l6ZV90IHNpemUgPSBBQlMoUHlfU0laRShhKSk7CisgICAgUHlMb25nT2JqZWN0ICp6OwogCi0JYXNzZXJ0KG4gPiAwICYmIG4gPD0gUHlMb25nX01BU0spOwotCXogPSBfUHlMb25nX05ldyhzaXplKTsKLQlpZiAoeiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkqcHJlbSA9IGlucGxhY2VfZGl2cmVtMSh6LT5vYl9kaWdpdCwgYS0+b2JfZGlnaXQsIHNpemUsIG4pOwotCXJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICBhc3NlcnQobiA+IDAgJiYgbiA8PSBQeUxvbmdfTUFTSyk7CisgICAgeiA9IF9QeUxvbmdfTmV3KHNpemUpOworICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgICpwcmVtID0gaW5wbGFjZV9kaXZyZW0xKHotPm9iX2RpZ2l0LCBhLT5vYl9kaWdpdCwgc2l6ZSwgbik7CisgICAgcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOwogfQogCiAvKiBDb252ZXJ0IHRoZSBsb25nIHRvIGEgc3RyaW5nIG9iamVjdCB3aXRoIGdpdmVuIGJhc2UsCkBAIC0xMTk5LDE2NyArMTE5OSwxNjcgQEAKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikKIF9QeUxvbmdfRm9ybWF0KFB5T2JqZWN0ICphYSwgaW50IGJhc2UsIGludCBhZGRMLCBpbnQgbmV3c3R5bGUpCiB7Ci0JcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICphID0gKFB5TG9uZ09iamVjdCAqKWFhOwotCVB5U3RyaW5nT2JqZWN0ICpzdHI7Ci0JUHlfc3NpemVfdCBpLCBzejsKLQlQeV9zc2l6ZV90IHNpemVfYTsKLQljaGFyICpwOwotCWludCBiaXRzOwotCWNoYXIgc2lnbiA9ICdcMCc7CisgICAgcmVnaXN0ZXIgUHlMb25nT2JqZWN0ICphID0gKFB5TG9uZ09iamVjdCAqKWFhOworICAgIFB5U3RyaW5nT2JqZWN0ICpzdHI7CisgICAgUHlfc3NpemVfdCBpLCBzejsKKyAgICBQeV9zc2l6ZV90IHNpemVfYTsKKyAgICBjaGFyICpwOworICAgIGludCBiaXRzOworICAgIGNoYXIgc2lnbiA9ICdcMCc7CiAKLQlpZiAoYSA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2soYSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhc3NlcnQoYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpOwotCXNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBpZiAoYSA9PSBOVUxMIHx8ICFQeUxvbmdfQ2hlY2soYSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhc3NlcnQoYmFzZSA+PSAyICYmIGJhc2UgPD0gMzYpOworICAgIHNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKTsKIAotCS8qIENvbXB1dGUgYSByb3VnaCB1cHBlciBib3VuZCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICovCi0JaSA9IGJhc2U7Ci0JYml0cyA9IDA7Ci0Jd2hpbGUgKGkgPiAxKSB7Ci0JCSsrYml0czsKLQkJaSA+Pj0gMTsKLQl9Ci0JaSA9IDUgKyAoYWRkTCA/IDEgOiAwKTsKLQkvKiBlbnN1cmUgd2UgZG9uJ3QgZ2V0IHNpZ25lZCBvdmVyZmxvdyBpbiBzeiBjYWxjdWxhdGlvbiAqLwotCWlmIChzaXplX2EgPiAoUFlfU1NJWkVfVF9NQVggLSBpKSAvIFB5TG9uZ19TSElGVCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkibG9uZyBpcyB0b28gbGFyZ2UgdG8gZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzeiA9IGkgKyAxICsgKHNpemVfYSAqIFB5TG9uZ19TSElGVCAtIDEpIC8gYml0czsKLQlhc3NlcnQoc3ogPj0gMCk7Ci0Jc3RyID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopMCwgc3opOwotCWlmIChzdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpICsgc3o7Ci0JKnAgPSAnXDAnOwotCWlmIChhZGRMKQotCQkqLS1wID0gJ0wnOwotCWlmIChhLT5vYl9zaXplIDwgMCkKLQkJc2lnbiA9ICctJzsKKyAgICAvKiBDb21wdXRlIGEgcm91Z2ggdXBwZXIgYm91bmQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAqLworICAgIGkgPSBiYXNlOworICAgIGJpdHMgPSAwOworICAgIHdoaWxlIChpID4gMSkgeworICAgICAgICArK2JpdHM7CisgICAgICAgIGkgPj49IDE7CisgICAgfQorICAgIGkgPSA1ICsgKGFkZEwgPyAxIDogMCk7CisgICAgLyogZW5zdXJlIHdlIGRvbid0IGdldCBzaWduZWQgb3ZlcmZsb3cgaW4gc3ogY2FsY3VsYXRpb24gKi8KKyAgICBpZiAoc2l6ZV9hID4gKFBZX1NTSVpFX1RfTUFYIC0gaSkgLyBQeUxvbmdfU0hJRlQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibG9uZyBpcyB0b28gbGFyZ2UgdG8gZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzeiA9IGkgKyAxICsgKHNpemVfYSAqIFB5TG9uZ19TSElGVCAtIDEpIC8gYml0czsKKyAgICBhc3NlcnQoc3ogPj0gMCk7CisgICAgc3RyID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopMCwgc3opOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpICsgc3o7CisgICAgKnAgPSAnXDAnOworICAgIGlmIChhZGRMKQorICAgICAgICAqLS1wID0gJ0wnOworICAgIGlmIChhLT5vYl9zaXplIDwgMCkKKyAgICAgICAgc2lnbiA9ICctJzsKIAotCWlmIChhLT5vYl9zaXplID09IDApIHsKLQkJKi0tcCA9ICcwJzsKLQl9Ci0JZWxzZSBpZiAoKGJhc2UgJiAoYmFzZSAtIDEpKSA9PSAwKSB7Ci0JCS8qIEpSSDogc3BlY2lhbCBjYXNlIGZvciBwb3dlci1vZi0yIGJhc2VzICovCi0JCXR3b2RpZ2l0cyBhY2N1bSA9IDA7Ci0JCWludCBhY2N1bWJpdHMgPSAwOwkvKiAjIG9mIGJpdHMgaW4gYWNjdW0gKi8KLQkJaW50IGJhc2ViaXRzID0gMTsJLyogIyBvZiBiaXRzIGluIGJhc2UtMSAqLwotCQlpID0gYmFzZTsKLQkJd2hpbGUgKChpID4+PSAxKSA+IDEpCi0JCQkrK2Jhc2ViaXRzOworICAgIGlmIChhLT5vYl9zaXplID09IDApIHsKKyAgICAgICAgKi0tcCA9ICcwJzsKKyAgICB9CisgICAgZWxzZSBpZiAoKGJhc2UgJiAoYmFzZSAtIDEpKSA9PSAwKSB7CisgICAgICAgIC8qIEpSSDogc3BlY2lhbCBjYXNlIGZvciBwb3dlci1vZi0yIGJhc2VzICovCisgICAgICAgIHR3b2RpZ2l0cyBhY2N1bSA9IDA7CisgICAgICAgIGludCBhY2N1bWJpdHMgPSAwOyAgICAgICAgICAgICAgLyogIyBvZiBiaXRzIGluIGFjY3VtICovCisgICAgICAgIGludCBiYXNlYml0cyA9IDE7ICAgICAgICAgICAgICAgLyogIyBvZiBiaXRzIGluIGJhc2UtMSAqLworICAgICAgICBpID0gYmFzZTsKKyAgICAgICAgd2hpbGUgKChpID4+PSAxKSA+IDEpCisgICAgICAgICAgICArK2Jhc2ViaXRzOwogCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgewotCQkJYWNjdW0gfD0gKHR3b2RpZ2l0cylhLT5vYl9kaWdpdFtpXSA8PCBhY2N1bWJpdHM7Ci0JCQlhY2N1bWJpdHMgKz0gUHlMb25nX1NISUZUOwotCQkJYXNzZXJ0KGFjY3VtYml0cyA+PSBiYXNlYml0cyk7Ci0JCQlkbyB7Ci0JCQkJY2hhciBjZGlnaXQgPSAoY2hhcikoYWNjdW0gJiAoYmFzZSAtIDEpKTsKLQkJCQljZGlnaXQgKz0gKGNkaWdpdCA8IDEwKSA/ICcwJyA6ICdhJy0xMDsKLQkJCQlhc3NlcnQocCA+IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpKTsKLQkJCQkqLS1wID0gY2RpZ2l0OwotCQkJCWFjY3VtYml0cyAtPSBiYXNlYml0czsKLQkJCQlhY2N1bSA+Pj0gYmFzZWJpdHM7Ci0JCQl9IHdoaWxlIChpIDwgc2l6ZV9hLTEgPyBhY2N1bWJpdHMgPj0gYmFzZWJpdHMgOgotCQkJCQkJYWNjdW0gPiAwKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogTm90IDAsIGFuZCBiYXNlIG5vdCBhIHBvd2VyIG9mIDIuICBEaXZpZGUgcmVwZWF0ZWRseSBieQotCQkgICBiYXNlLCBidXQgZm9yIHNwZWVkIHVzZSB0aGUgaGlnaGVzdCBwb3dlciBvZiBiYXNlIHRoYXQKLQkJICAgZml0cyBpbiBhIGRpZ2l0LiAqLwotCQlQeV9zc2l6ZV90IHNpemUgPSBzaXplX2E7Ci0JCWRpZ2l0ICpwaW4gPSBhLT5vYl9kaWdpdDsKLQkJUHlMb25nT2JqZWN0ICpzY3JhdGNoOwotCQkvKiBwb3diYXN3IDwtIGxhcmdlc3QgcG93ZXIgb2YgYmFzZSB0aGF0IGZpdHMgaW4gYSBkaWdpdC4gKi8KLQkJZGlnaXQgcG93YmFzZSA9IGJhc2U7ICAvKiBwb3diYXNlID09IGJhc2UgKiogcG93ZXIgKi8KLQkJaW50IHBvd2VyID0gMTsKLQkJZm9yICg7OykgewotCQkJdW5zaWduZWQgbG9uZyBuZXdwb3cgPSBwb3diYXNlICogKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQkJCWlmIChuZXdwb3cgPj4gUHlMb25nX1NISUZUKQotCQkJCS8qIGRvZXNuJ3QgZml0IGluIGEgZGlnaXQgKi8KLQkJCQlicmVhazsKLQkJCXBvd2Jhc2UgPSAoZGlnaXQpbmV3cG93OwotCQkJKytwb3dlcjsKLQkJfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9hOyArK2kpIHsKKyAgICAgICAgICAgIGFjY3VtIHw9ICh0d29kaWdpdHMpYS0+b2JfZGlnaXRbaV0gPDwgYWNjdW1iaXRzOworICAgICAgICAgICAgYWNjdW1iaXRzICs9IFB5TG9uZ19TSElGVDsKKyAgICAgICAgICAgIGFzc2VydChhY2N1bWJpdHMgPj0gYmFzZWJpdHMpOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGNoYXIgY2RpZ2l0ID0gKGNoYXIpKGFjY3VtICYgKGJhc2UgLSAxKSk7CisgICAgICAgICAgICAgICAgY2RpZ2l0ICs9IChjZGlnaXQgPCAxMCkgPyAnMCcgOiAnYSctMTA7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHAgPiBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSk7CisgICAgICAgICAgICAgICAgKi0tcCA9IGNkaWdpdDsKKyAgICAgICAgICAgICAgICBhY2N1bWJpdHMgLT0gYmFzZWJpdHM7CisgICAgICAgICAgICAgICAgYWNjdW0gPj49IGJhc2ViaXRzOworICAgICAgICAgICAgfSB3aGlsZSAoaSA8IHNpemVfYS0xID8gYWNjdW1iaXRzID49IGJhc2ViaXRzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtID4gMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIE5vdCAwLCBhbmQgYmFzZSBub3QgYSBwb3dlciBvZiAyLiAgRGl2aWRlIHJlcGVhdGVkbHkgYnkKKyAgICAgICAgICAgYmFzZSwgYnV0IGZvciBzcGVlZCB1c2UgdGhlIGhpZ2hlc3QgcG93ZXIgb2YgYmFzZSB0aGF0CisgICAgICAgICAgIGZpdHMgaW4gYSBkaWdpdC4gKi8KKyAgICAgICAgUHlfc3NpemVfdCBzaXplID0gc2l6ZV9hOworICAgICAgICBkaWdpdCAqcGluID0gYS0+b2JfZGlnaXQ7CisgICAgICAgIFB5TG9uZ09iamVjdCAqc2NyYXRjaDsKKyAgICAgICAgLyogcG93YmFzdyA8LSBsYXJnZXN0IHBvd2VyIG9mIGJhc2UgdGhhdCBmaXRzIGluIGEgZGlnaXQuICovCisgICAgICAgIGRpZ2l0IHBvd2Jhc2UgPSBiYXNlOyAgLyogcG93YmFzZSA9PSBiYXNlICoqIHBvd2VyICovCisgICAgICAgIGludCBwb3dlciA9IDE7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbmV3cG93ID0gcG93YmFzZSAqICh1bnNpZ25lZCBsb25nKWJhc2U7CisgICAgICAgICAgICBpZiAobmV3cG93ID4+IFB5TG9uZ19TSElGVCkKKyAgICAgICAgICAgICAgICAvKiBkb2Vzbid0IGZpdCBpbiBhIGRpZ2l0ICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwb3diYXNlID0gKGRpZ2l0KW5ld3BvdzsKKyAgICAgICAgICAgICsrcG93ZXI7CisgICAgICAgIH0KIAotCQkvKiBHZXQgYSBzY3JhdGNoIGFyZWEgZm9yIHJlcGVhdGVkIGRpdmlzaW9uLiAqLwotCQlzY3JhdGNoID0gX1B5TG9uZ19OZXcoc2l6ZSk7Ci0JCWlmIChzY3JhdGNoID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihzdHIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgLyogR2V0IGEgc2NyYXRjaCBhcmVhIGZvciByZXBlYXRlZCBkaXZpc2lvbi4gKi8KKyAgICAgICAgc2NyYXRjaCA9IF9QeUxvbmdfTmV3KHNpemUpOworICAgICAgICBpZiAoc2NyYXRjaCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLQkJLyogUmVwZWF0ZWRseSBkaXZpZGUgYnkgcG93YmFzZS4gKi8KLQkJZG8gewotCQkJaW50IG50b3N0b3JlID0gcG93ZXI7Ci0JCQlkaWdpdCByZW0gPSBpbnBsYWNlX2RpdnJlbTEoc2NyYXRjaC0+b2JfZGlnaXQsCi0JCQkJCQkgICAgIHBpbiwgc2l6ZSwgcG93YmFzZSk7Ci0JCQlwaW4gPSBzY3JhdGNoLT5vYl9kaWdpdDsgLyogbm8gbmVlZCB0byB1c2UgYSBhZ2FpbiAqLwotCQkJaWYgKHBpbltzaXplIC0gMV0gPT0gMCkKLQkJCQktLXNpemU7Ci0JCQlTSUdDSEVDSyh7Ci0JCQkJUHlfREVDUkVGKHNjcmF0Y2gpOwotCQkJCVB5X0RFQ1JFRihzdHIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfSkKKyAgICAgICAgLyogUmVwZWF0ZWRseSBkaXZpZGUgYnkgcG93YmFzZS4gKi8KKyAgICAgICAgZG8geworICAgICAgICAgICAgaW50IG50b3N0b3JlID0gcG93ZXI7CisgICAgICAgICAgICBkaWdpdCByZW0gPSBpbnBsYWNlX2RpdnJlbTEoc2NyYXRjaC0+b2JfZGlnaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpbiwgc2l6ZSwgcG93YmFzZSk7CisgICAgICAgICAgICBwaW4gPSBzY3JhdGNoLT5vYl9kaWdpdDsgLyogbm8gbmVlZCB0byB1c2UgYSBhZ2FpbiAqLworICAgICAgICAgICAgaWYgKHBpbltzaXplIC0gMV0gPT0gMCkKKyAgICAgICAgICAgICAgICAtLXNpemU7CisgICAgICAgICAgICBTSUdDSEVDSyh7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHNjcmF0Y2gpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfSkKIAotCQkJLyogQnJlYWsgcmVtIGludG8gZGlnaXRzLiAqLwotCQkJYXNzZXJ0KG50b3N0b3JlID4gMCk7Ci0JCQlkbyB7Ci0JCQkJZGlnaXQgbmV4dHJlbSA9IChkaWdpdCkocmVtIC8gYmFzZSk7Ci0JCQkJY2hhciBjID0gKGNoYXIpKHJlbSAtIG5leHRyZW0gKiBiYXNlKTsKLQkJCQlhc3NlcnQocCA+IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpKTsKLQkJCQljICs9IChjIDwgMTApID8gJzAnIDogJ2EnLTEwOwotCQkJCSotLXAgPSBjOwotCQkJCXJlbSA9IG5leHRyZW07Ci0JCQkJLS1udG9zdG9yZTsKLQkJCQkvKiBUZXJtaW5hdGlvbiBpcyBhIGJpdCBkZWxpY2F0ZTogIG11c3Qgbm90Ci0JCQkJICAgc3RvcmUgbGVhZGluZyB6ZXJvZXMsIHNvIG11c3QgZ2V0IG91dCBpZgotCQkJCSAgIHJlbWFpbmluZyBxdW90aWVudCBhbmQgcmVtIGFyZSBib3RoIDAuICovCi0JCQl9IHdoaWxlIChudG9zdG9yZSAmJiAoc2l6ZSB8fCByZW0pKTsKLQkJfSB3aGlsZSAoc2l6ZSAhPSAwKTsKLQkJUHlfREVDUkVGKHNjcmF0Y2gpOwotCX0KKyAgICAgICAgICAgIC8qIEJyZWFrIHJlbSBpbnRvIGRpZ2l0cy4gKi8KKyAgICAgICAgICAgIGFzc2VydChudG9zdG9yZSA+IDApOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGRpZ2l0IG5leHRyZW0gPSAoZGlnaXQpKHJlbSAvIGJhc2UpOworICAgICAgICAgICAgICAgIGNoYXIgYyA9IChjaGFyKShyZW0gLSBuZXh0cmVtICogYmFzZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHAgPiBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSk7CisgICAgICAgICAgICAgICAgYyArPSAoYyA8IDEwKSA/ICcwJyA6ICdhJy0xMDsKKyAgICAgICAgICAgICAgICAqLS1wID0gYzsKKyAgICAgICAgICAgICAgICByZW0gPSBuZXh0cmVtOworICAgICAgICAgICAgICAgIC0tbnRvc3RvcmU7CisgICAgICAgICAgICAgICAgLyogVGVybWluYXRpb24gaXMgYSBiaXQgZGVsaWNhdGU6ICBtdXN0IG5vdAorICAgICAgICAgICAgICAgICAgIHN0b3JlIGxlYWRpbmcgemVyb2VzLCBzbyBtdXN0IGdldCBvdXQgaWYKKyAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgcXVvdGllbnQgYW5kIHJlbSBhcmUgYm90aCAwLiAqLworICAgICAgICAgICAgfSB3aGlsZSAobnRvc3RvcmUgJiYgKHNpemUgfHwgcmVtKSk7CisgICAgICAgIH0gd2hpbGUgKHNpemUgIT0gMCk7CisgICAgICAgIFB5X0RFQ1JFRihzY3JhdGNoKTsKKyAgICB9CiAKLQlpZiAoYmFzZSA9PSAyKSB7Ci0JCSotLXAgPSAnYic7Ci0JCSotLXAgPSAnMCc7Ci0JfQotCWVsc2UgaWYgKGJhc2UgPT0gOCkgewotCQlpZiAobmV3c3R5bGUpIHsKLQkJCSotLXAgPSAnbyc7Ci0JCQkqLS1wID0gJzAnOwotCQl9Ci0JCWVsc2UKLQkJCWlmIChzaXplX2EgIT0gMCkKLQkJCQkqLS1wID0gJzAnOwotCX0KLQllbHNlIGlmIChiYXNlID09IDE2KSB7Ci0JCSotLXAgPSAneCc7Ci0JCSotLXAgPSAnMCc7Ci0JfQotCWVsc2UgaWYgKGJhc2UgIT0gMTApIHsKLQkJKi0tcCA9ICcjJzsKLQkJKi0tcCA9ICcwJyArIGJhc2UlMTA7Ci0JCWlmIChiYXNlID4gMTApCi0JCQkqLS1wID0gJzAnICsgYmFzZS8xMDsKLQl9Ci0JaWYgKHNpZ24pCi0JCSotLXAgPSBzaWduOwotCWlmIChwICE9IFB5U3RyaW5nX0FTX1NUUklORyhzdHIpKSB7Ci0JCWNoYXIgKnEgPSBQeVN0cmluZ19BU19TVFJJTkcoc3RyKTsKLQkJYXNzZXJ0KHAgPiBxKTsKLQkJZG8gewotCQl9IHdoaWxlICgoKnErKyA9ICpwKyspICE9ICdcMCcpOwotCQlxLS07Ci0JCV9QeVN0cmluZ19SZXNpemUoKFB5T2JqZWN0ICoqKSZzdHIsCi0JCQkJIChQeV9zc2l6ZV90KSAocSAtIFB5U3RyaW5nX0FTX1NUUklORyhzdHIpKSk7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilzdHI7CisgICAgaWYgKGJhc2UgPT0gMikgeworICAgICAgICAqLS1wID0gJ2InOworICAgICAgICAqLS1wID0gJzAnOworICAgIH0KKyAgICBlbHNlIGlmIChiYXNlID09IDgpIHsKKyAgICAgICAgaWYgKG5ld3N0eWxlKSB7CisgICAgICAgICAgICAqLS1wID0gJ28nOworICAgICAgICAgICAgKi0tcCA9ICcwJzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoc2l6ZV9hICE9IDApCisgICAgICAgICAgICAgICAgKi0tcCA9ICcwJzsKKyAgICB9CisgICAgZWxzZSBpZiAoYmFzZSA9PSAxNikgeworICAgICAgICAqLS1wID0gJ3gnOworICAgICAgICAqLS1wID0gJzAnOworICAgIH0KKyAgICBlbHNlIGlmIChiYXNlICE9IDEwKSB7CisgICAgICAgICotLXAgPSAnIyc7CisgICAgICAgICotLXAgPSAnMCcgKyBiYXNlJTEwOworICAgICAgICBpZiAoYmFzZSA+IDEwKQorICAgICAgICAgICAgKi0tcCA9ICcwJyArIGJhc2UvMTA7CisgICAgfQorICAgIGlmIChzaWduKQorICAgICAgICAqLS1wID0gc2lnbjsKKyAgICBpZiAocCAhPSBQeVN0cmluZ19BU19TVFJJTkcoc3RyKSkgeworICAgICAgICBjaGFyICpxID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cik7CisgICAgICAgIGFzc2VydChwID4gcSk7CisgICAgICAgIGRvIHsKKyAgICAgICAgfSB3aGlsZSAoKCpxKysgPSAqcCsrKSAhPSAnXDAnKTsKKyAgICAgICAgcS0tOworICAgICAgICBfUHlTdHJpbmdfUmVzaXplKChQeU9iamVjdCAqKikmc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KSAocSAtIFB5U3RyaW5nX0FTX1NUUklORyhzdHIpKSk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilzdHI7CiB9CiAKIC8qIFRhYmxlIG9mIGRpZ2l0IHZhbHVlcyBmb3IgOC1iaXQgc3RyaW5nIC0+IGludGVnZXIgY29udmVyc2lvbi4KQEAgLTEzNzAsMjIgKzEzNzAsMjIgQEAKICAqIGJhc2UgQiBkaWdpdCBpZmYgX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKGMpXSA8IEIuCiAgKi8KIGludCBfUHlMb25nX0RpZ2l0VmFsdWVbMjU2XSA9IHsKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKLQkyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKLQkyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKLQkzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKKyAgICAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKKyAgICAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKKyAgICAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywgMzcsIDM3LCAzNywKIH07CiAKIC8qICpzdHIgcG9pbnRzIHRvIHRoZSBmaXJzdCBkaWdpdCBpbiBhIHN0cmluZyBvZiBiYXNlIGBiYXNlYCBkaWdpdHMuICBiYXNlCkBAIC0xMzk3LDExNSArMTM5NywxMTUgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKgogbG9uZ19mcm9tX2JpbmFyeV9iYXNlKGNoYXIgKipzdHIsIGludCBiYXNlKQogewotCWNoYXIgKnAgPSAqc3RyOwotCWNoYXIgKnN0YXJ0ID0gcDsKLQlpbnQgYml0c19wZXJfY2hhcjsKLQlQeV9zc2l6ZV90IG47Ci0JUHlMb25nT2JqZWN0ICp6OwotCXR3b2RpZ2l0cyBhY2N1bTsKLQlpbnQgYml0c19pbl9hY2N1bTsKLQlkaWdpdCAqcGRpZ2l0OworICAgIGNoYXIgKnAgPSAqc3RyOworICAgIGNoYXIgKnN0YXJ0ID0gcDsKKyAgICBpbnQgYml0c19wZXJfY2hhcjsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlMb25nT2JqZWN0ICp6OworICAgIHR3b2RpZ2l0cyBhY2N1bTsKKyAgICBpbnQgYml0c19pbl9hY2N1bTsKKyAgICBkaWdpdCAqcGRpZ2l0OwogCi0JYXNzZXJ0KGJhc2UgPj0gMiAmJiBiYXNlIDw9IDMyICYmIChiYXNlICYgKGJhc2UgLSAxKSkgPT0gMCk7Ci0JbiA9IGJhc2U7Ci0JZm9yIChiaXRzX3Blcl9jaGFyID0gLTE7IG47ICsrYml0c19wZXJfY2hhcikKLQkJbiA+Pj0gMTsKLQkvKiBuIDwtIHRvdGFsICMgb2YgYml0cyBuZWVkZWQsIHdoaWxlIHNldHRpbmcgcCB0byBlbmQtb2Ytc3RyaW5nICovCi0Jd2hpbGUgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqcCldIDwgYmFzZSkKLQkJKytwOwotCSpzdHIgPSBwOwotCS8qIG4gPC0gIyBvZiBQeXRob24gZGlnaXRzIG5lZWRlZCwgPSBjZWlsaW5nKG4vUHlMb25nX1NISUZUKS4gKi8KLQluID0gKHAgLSBzdGFydCkgKiBiaXRzX3Blcl9jaGFyICsgUHlMb25nX1NISUZUIC0gMTsKLQlpZiAobiAvIGJpdHNfcGVyX2NoYXIgPCBwIC0gc3RhcnQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImxvbmcgc3RyaW5nIHRvbyBsYXJnZSB0byBjb252ZXJ0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQluID0gbiAvIFB5TG9uZ19TSElGVDsKLQl6ID0gX1B5TG9uZ19OZXcobik7Ci0JaWYgKHogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogUmVhZCBzdHJpbmcgZnJvbSByaWdodCwgYW5kIGZpbGwgaW4gbG9uZyBmcm9tIGxlZnQ7IGkuZS4sCi0JICogZnJvbSBsZWFzdCB0byBtb3N0IHNpZ25pZmljYW50IGluIGJvdGguCi0JICovCi0JYWNjdW0gPSAwOwotCWJpdHNfaW5fYWNjdW0gPSAwOwotCXBkaWdpdCA9IHotPm9iX2RpZ2l0OwotCXdoaWxlICgtLXAgPj0gc3RhcnQpIHsKLQkJaW50IGsgPSBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnApXTsKLQkJYXNzZXJ0KGsgPj0gMCAmJiBrIDwgYmFzZSk7Ci0JCWFjY3VtIHw9ICh0d29kaWdpdHMpayA8PCBiaXRzX2luX2FjY3VtOwotCQliaXRzX2luX2FjY3VtICs9IGJpdHNfcGVyX2NoYXI7Ci0JCWlmIChiaXRzX2luX2FjY3VtID49IFB5TG9uZ19TSElGVCkgewotCQkJKnBkaWdpdCsrID0gKGRpZ2l0KShhY2N1bSAmIFB5TG9uZ19NQVNLKTsKLQkJCWFzc2VydChwZGlnaXQgLSB6LT5vYl9kaWdpdCA8PSBuKTsKLQkJCWFjY3VtID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCQliaXRzX2luX2FjY3VtIC09IFB5TG9uZ19TSElGVDsKLQkJCWFzc2VydChiaXRzX2luX2FjY3VtIDwgUHlMb25nX1NISUZUKTsKLQkJfQotCX0KLQlpZiAoYml0c19pbl9hY2N1bSkgewotCQlhc3NlcnQoYml0c19pbl9hY2N1bSA8PSBQeUxvbmdfU0hJRlQpOwotCQkqcGRpZ2l0KysgPSAoZGlnaXQpYWNjdW07Ci0JCWFzc2VydChwZGlnaXQgLSB6LT5vYl9kaWdpdCA8PSBuKTsKLQl9Ci0Jd2hpbGUgKHBkaWdpdCAtIHotPm9iX2RpZ2l0IDwgbikKLQkJKnBkaWdpdCsrID0gMDsKLQlyZXR1cm4gbG9uZ19ub3JtYWxpemUoeik7CisgICAgYXNzZXJ0KGJhc2UgPj0gMiAmJiBiYXNlIDw9IDMyICYmIChiYXNlICYgKGJhc2UgLSAxKSkgPT0gMCk7CisgICAgbiA9IGJhc2U7CisgICAgZm9yIChiaXRzX3Blcl9jaGFyID0gLTE7IG47ICsrYml0c19wZXJfY2hhcikKKyAgICAgICAgbiA+Pj0gMTsKKyAgICAvKiBuIDwtIHRvdGFsICMgb2YgYml0cyBuZWVkZWQsIHdoaWxlIHNldHRpbmcgcCB0byBlbmQtb2Ytc3RyaW5nICovCisgICAgd2hpbGUgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqcCldIDwgYmFzZSkKKyAgICAgICAgKytwOworICAgICpzdHIgPSBwOworICAgIC8qIG4gPC0gIyBvZiBQeXRob24gZGlnaXRzIG5lZWRlZCwgPSBjZWlsaW5nKG4vUHlMb25nX1NISUZUKS4gKi8KKyAgICBuID0gKHAgLSBzdGFydCkgKiBiaXRzX3Blcl9jaGFyICsgUHlMb25nX1NISUZUIC0gMTsKKyAgICBpZiAobiAvIGJpdHNfcGVyX2NoYXIgPCBwIC0gc3RhcnQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibG9uZyBzdHJpbmcgdG9vIGxhcmdlIHRvIGNvbnZlcnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG4gPSBuIC8gUHlMb25nX1NISUZUOworICAgIHogPSBfUHlMb25nX05ldyhuKTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBSZWFkIHN0cmluZyBmcm9tIHJpZ2h0LCBhbmQgZmlsbCBpbiBsb25nIGZyb20gbGVmdDsgaS5lLiwKKyAgICAgKiBmcm9tIGxlYXN0IHRvIG1vc3Qgc2lnbmlmaWNhbnQgaW4gYm90aC4KKyAgICAgKi8KKyAgICBhY2N1bSA9IDA7CisgICAgYml0c19pbl9hY2N1bSA9IDA7CisgICAgcGRpZ2l0ID0gei0+b2JfZGlnaXQ7CisgICAgd2hpbGUgKC0tcCA+PSBzdGFydCkgeworICAgICAgICBpbnQgayA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqcCldOworICAgICAgICBhc3NlcnQoayA+PSAwICYmIGsgPCBiYXNlKTsKKyAgICAgICAgYWNjdW0gfD0gKHR3b2RpZ2l0cylrIDw8IGJpdHNfaW5fYWNjdW07CisgICAgICAgIGJpdHNfaW5fYWNjdW0gKz0gYml0c19wZXJfY2hhcjsKKyAgICAgICAgaWYgKGJpdHNfaW5fYWNjdW0gPj0gUHlMb25nX1NISUZUKSB7CisgICAgICAgICAgICAqcGRpZ2l0KysgPSAoZGlnaXQpKGFjY3VtICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgYXNzZXJ0KHBkaWdpdCAtIHotPm9iX2RpZ2l0IDw9IG4pOworICAgICAgICAgICAgYWNjdW0gPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgICAgIGJpdHNfaW5fYWNjdW0gLT0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgYXNzZXJ0KGJpdHNfaW5fYWNjdW0gPCBQeUxvbmdfU0hJRlQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChiaXRzX2luX2FjY3VtKSB7CisgICAgICAgIGFzc2VydChiaXRzX2luX2FjY3VtIDw9IFB5TG9uZ19TSElGVCk7CisgICAgICAgICpwZGlnaXQrKyA9IChkaWdpdClhY2N1bTsKKyAgICAgICAgYXNzZXJ0KHBkaWdpdCAtIHotPm9iX2RpZ2l0IDw9IG4pOworICAgIH0KKyAgICB3aGlsZSAocGRpZ2l0IC0gei0+b2JfZGlnaXQgPCBuKQorICAgICAgICAqcGRpZ2l0KysgPSAwOworICAgIHJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKIH0KIAogUHlPYmplY3QgKgogUHlMb25nX0Zyb21TdHJpbmcoY2hhciAqc3RyLCBjaGFyICoqcGVuZCwgaW50IGJhc2UpCiB7Ci0JaW50IHNpZ24gPSAxOwotCWNoYXIgKnN0YXJ0LCAqb3JpZ19zdHIgPSBzdHI7Ci0JUHlMb25nT2JqZWN0ICp6OwotCVB5T2JqZWN0ICpzdHJvYmosICpzdHJyZXByOwotCVB5X3NzaXplX3Qgc2xlbjsKKyAgICBpbnQgc2lnbiA9IDE7CisgICAgY2hhciAqc3RhcnQsICpvcmlnX3N0ciA9IHN0cjsKKyAgICBQeUxvbmdPYmplY3QgKno7CisgICAgUHlPYmplY3QgKnN0cm9iaiwgKnN0cnJlcHI7CisgICAgUHlfc3NpemVfdCBzbGVuOwogCi0JaWYgKChiYXNlICE9IDAgJiYgYmFzZSA8IDIpIHx8IGJhc2UgPiAzNikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkibG9uZygpIGFyZyAyIG11c3QgYmUgPj0gMiBhbmQgPD0gMzYiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXdoaWxlICgqc3RyICE9ICdcMCcgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCi0JCXN0cisrOwotCWlmICgqc3RyID09ICcrJykKLQkJKytzdHI7Ci0JZWxzZSBpZiAoKnN0ciA9PSAnLScpIHsKLQkJKytzdHI7Ci0JCXNpZ24gPSAtMTsKLQl9Ci0Jd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKLQkJc3RyKys7Ci0JaWYgKGJhc2UgPT0gMCkgewotCQkvKiBObyBiYXNlIGdpdmVuLiAgRGVkdWNlIHRoZSBiYXNlIGZyb20gdGhlIGNvbnRlbnRzCi0JCSAgIG9mIHRoZSBzdHJpbmcgKi8KLQkJaWYgKHN0clswXSAhPSAnMCcpCi0JCQliYXNlID0gMTA7Ci0JCWVsc2UgaWYgKHN0clsxXSA9PSAneCcgfHwgc3RyWzFdID09ICdYJykKLQkJCWJhc2UgPSAxNjsKLQkJZWxzZSBpZiAoc3RyWzFdID09ICdvJyB8fCBzdHJbMV0gPT0gJ08nKQotCQkJYmFzZSA9IDg7Ci0JCWVsc2UgaWYgKHN0clsxXSA9PSAnYicgfHwgc3RyWzFdID09ICdCJykKLQkJCWJhc2UgPSAyOwotCQllbHNlCi0JCQkvKiAib2xkIiAoQy1zdHlsZSkgb2N0YWwgbGl0ZXJhbCwgc3RpbGwgdmFsaWQgaW4KLQkJCSAgIDIueCwgYWx0aG91Z2ggaWxsZWdhbCBpbiAzLnggKi8KLQkJCWJhc2UgPSA4OwotCX0KLQkvKiBXaGV0aGVyIG9yIG5vdCB3ZSB3ZXJlIGRlZHVjaW5nIHRoZSBiYXNlLCBza2lwIGxlYWRpbmcgY2hhcnMKLQkgICBhcyBuZWVkZWQgKi8KLQlpZiAoc3RyWzBdID09ICcwJyAmJgotCSAgICAoKGJhc2UgPT0gMTYgJiYgKHN0clsxXSA9PSAneCcgfHwgc3RyWzFdID09ICdYJykpIHx8Ci0JICAgICAoYmFzZSA9PSA4ICAmJiAoc3RyWzFdID09ICdvJyB8fCBzdHJbMV0gPT0gJ08nKSkgfHwKLQkgICAgIChiYXNlID09IDIgICYmIChzdHJbMV0gPT0gJ2InIHx8IHN0clsxXSA9PSAnQicpKSkpCi0JCXN0ciArPSAyOworICAgIGlmICgoYmFzZSAhPSAwICYmIGJhc2UgPCAyKSB8fCBiYXNlID4gMzYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibG9uZygpIGFyZyAyIG11c3QgYmUgPj0gMiBhbmQgPD0gMzYiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdoaWxlICgqc3RyICE9ICdcMCcgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCisgICAgICAgIHN0cisrOworICAgIGlmICgqc3RyID09ICcrJykKKyAgICAgICAgKytzdHI7CisgICAgZWxzZSBpZiAoKnN0ciA9PSAnLScpIHsKKyAgICAgICAgKytzdHI7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICB9CisgICAgd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKKyAgICAgICAgc3RyKys7CisgICAgaWYgKGJhc2UgPT0gMCkgeworICAgICAgICAvKiBObyBiYXNlIGdpdmVuLiAgRGVkdWNlIHRoZSBiYXNlIGZyb20gdGhlIGNvbnRlbnRzCisgICAgICAgICAgIG9mIHRoZSBzdHJpbmcgKi8KKyAgICAgICAgaWYgKHN0clswXSAhPSAnMCcpCisgICAgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgIGVsc2UgaWYgKHN0clsxXSA9PSAneCcgfHwgc3RyWzFdID09ICdYJykKKyAgICAgICAgICAgIGJhc2UgPSAxNjsKKyAgICAgICAgZWxzZSBpZiAoc3RyWzFdID09ICdvJyB8fCBzdHJbMV0gPT0gJ08nKQorICAgICAgICAgICAgYmFzZSA9IDg7CisgICAgICAgIGVsc2UgaWYgKHN0clsxXSA9PSAnYicgfHwgc3RyWzFdID09ICdCJykKKyAgICAgICAgICAgIGJhc2UgPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgICAvKiAib2xkIiAoQy1zdHlsZSkgb2N0YWwgbGl0ZXJhbCwgc3RpbGwgdmFsaWQgaW4KKyAgICAgICAgICAgICAgIDIueCwgYWx0aG91Z2ggaWxsZWdhbCBpbiAzLnggKi8KKyAgICAgICAgICAgIGJhc2UgPSA4OworICAgIH0KKyAgICAvKiBXaGV0aGVyIG9yIG5vdCB3ZSB3ZXJlIGRlZHVjaW5nIHRoZSBiYXNlLCBza2lwIGxlYWRpbmcgY2hhcnMKKyAgICAgICBhcyBuZWVkZWQgKi8KKyAgICBpZiAoc3RyWzBdID09ICcwJyAmJgorICAgICAgICAoKGJhc2UgPT0gMTYgJiYgKHN0clsxXSA9PSAneCcgfHwgc3RyWzFdID09ICdYJykpIHx8CisgICAgICAgICAoYmFzZSA9PSA4ICAmJiAoc3RyWzFdID09ICdvJyB8fCBzdHJbMV0gPT0gJ08nKSkgfHwKKyAgICAgICAgIChiYXNlID09IDIgICYmIChzdHJbMV0gPT0gJ2InIHx8IHN0clsxXSA9PSAnQicpKSkpCisgICAgICAgIHN0ciArPSAyOwogCi0Jc3RhcnQgPSBzdHI7Ci0JaWYgKChiYXNlICYgKGJhc2UgLSAxKSkgPT0gMCkKLQkJeiA9IGxvbmdfZnJvbV9iaW5hcnlfYmFzZSgmc3RyLCBiYXNlKTsKLQllbHNlIHsKKyAgICBzdGFydCA9IHN0cjsKKyAgICBpZiAoKGJhc2UgJiAoYmFzZSAtIDEpKSA9PSAwKQorICAgICAgICB6ID0gbG9uZ19mcm9tX2JpbmFyeV9iYXNlKCZzdHIsIGJhc2UpOworICAgIGVsc2UgewogLyoqKgogQmluYXJ5IGJhc2VzIGNhbiBiZSBjb252ZXJ0ZWQgaW4gdGltZSBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBkaWdpdHMsIGJlY2F1c2UKIFB5dGhvbidzIHJlcHJlc2VudGF0aW9uIGJhc2UgaXMgYmluYXJ5LiAgT3RoZXIgYmFzZXMgKGluY2x1ZGluZyBkZWNpbWFsISkgdXNlCkBAIC0xNTkxLDIyNyArMTU5MSwyMjcgQEAKIGp1c3QgMSBkaWdpdCBhdCB0aGUgc3RhcnQsIHNvIHRoYXQgdGhlIGNvcHlpbmcgY29kZSB3YXMgZXhlcmNpc2VkIGZvciBldmVyeQogZGlnaXQgYmV5b25kIHRoZSBmaXJzdC4KICoqKi8KLQkJcmVnaXN0ZXIgdHdvZGlnaXRzIGM7CS8qIGN1cnJlbnQgaW5wdXQgY2hhcmFjdGVyICovCi0JCVB5X3NzaXplX3Qgc2l6ZV96OwotCQlpbnQgaTsKLQkJaW50IGNvbnZ3aWR0aDsKLQkJdHdvZGlnaXRzIGNvbnZtdWx0bWF4LCBjb252bXVsdDsKLQkJZGlnaXQgKnB6LCAqcHpzdG9wOwotCQljaGFyKiBzY2FuOworICAgICAgICByZWdpc3RlciB0d29kaWdpdHMgYzsgICAgICAgICAgIC8qIGN1cnJlbnQgaW5wdXQgY2hhcmFjdGVyICovCisgICAgICAgIFB5X3NzaXplX3Qgc2l6ZV96OworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGNvbnZ3aWR0aDsKKyAgICAgICAgdHdvZGlnaXRzIGNvbnZtdWx0bWF4LCBjb252bXVsdDsKKyAgICAgICAgZGlnaXQgKnB6LCAqcHpzdG9wOworICAgICAgICBjaGFyKiBzY2FuOwogCi0JCXN0YXRpYyBkb3VibGUgbG9nX2Jhc2VfUHlMb25nX0JBU0VbMzddID0gezAuMGUwLH07Ci0JCXN0YXRpYyBpbnQgY29udndpZHRoX2Jhc2VbMzddID0gezAsfTsKLQkJc3RhdGljIHR3b2RpZ2l0cyBjb252bXVsdG1heF9iYXNlWzM3XSA9IHswLH07CisgICAgICAgIHN0YXRpYyBkb3VibGUgbG9nX2Jhc2VfUHlMb25nX0JBU0VbMzddID0gezAuMGUwLH07CisgICAgICAgIHN0YXRpYyBpbnQgY29udndpZHRoX2Jhc2VbMzddID0gezAsfTsKKyAgICAgICAgc3RhdGljIHR3b2RpZ2l0cyBjb252bXVsdG1heF9iYXNlWzM3XSA9IHswLH07CiAKLQkJaWYgKGxvZ19iYXNlX1B5TG9uZ19CQVNFW2Jhc2VdID09IDAuMCkgewotCQkJdHdvZGlnaXRzIGNvbnZtYXggPSBiYXNlOwotCQkJaW50IGkgPSAxOworICAgICAgICBpZiAobG9nX2Jhc2VfUHlMb25nX0JBU0VbYmFzZV0gPT0gMC4wKSB7CisgICAgICAgICAgICB0d29kaWdpdHMgY29udm1heCA9IGJhc2U7CisgICAgICAgICAgICBpbnQgaSA9IDE7CiAKLQkJCWxvZ19iYXNlX1B5TG9uZ19CQVNFW2Jhc2VdID0gbG9nKChkb3VibGUpYmFzZSkgLwotCQkJCQkJbG9nKChkb3VibGUpUHlMb25nX0JBU0UpOwotCQkJZm9yICg7OykgewotCQkJCXR3b2RpZ2l0cyBuZXh0ID0gY29udm1heCAqIGJhc2U7Ci0JCQkJaWYgKG5leHQgPiBQeUxvbmdfQkFTRSkKLQkJCQkJYnJlYWs7Ci0JCQkJY29udm1heCA9IG5leHQ7Ci0JCQkJKytpOwotCQkJfQotCQkJY29udm11bHRtYXhfYmFzZVtiYXNlXSA9IGNvbnZtYXg7Ci0JCQlhc3NlcnQoaSA+IDApOwotCQkJY29udndpZHRoX2Jhc2VbYmFzZV0gPSBpOwotCQl9CisgICAgICAgICAgICBsb2dfYmFzZV9QeUxvbmdfQkFTRVtiYXNlXSA9IGxvZygoZG91YmxlKWJhc2UpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygoZG91YmxlKVB5TG9uZ19CQVNFKTsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB0d29kaWdpdHMgbmV4dCA9IGNvbnZtYXggKiBiYXNlOworICAgICAgICAgICAgICAgIGlmIChuZXh0ID4gUHlMb25nX0JBU0UpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNvbnZtYXggPSBuZXh0OworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnZtdWx0bWF4X2Jhc2VbYmFzZV0gPSBjb252bWF4OworICAgICAgICAgICAgYXNzZXJ0KGkgPiAwKTsKKyAgICAgICAgICAgIGNvbnZ3aWR0aF9iYXNlW2Jhc2VdID0gaTsKKyAgICAgICAgfQogCi0JCS8qIEZpbmQgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgb2YgbnVtZXJpYyBjaGFyYWN0ZXJzLiAqLwotCQlzY2FuID0gc3RyOwotCQl3aGlsZSAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKCpzY2FuKV0gPCBiYXNlKQotCQkJKytzY2FuOworICAgICAgICAvKiBGaW5kIGxlbmd0aCBvZiB0aGUgc3RyaW5nIG9mIG51bWVyaWMgY2hhcmFjdGVycy4gKi8KKyAgICAgICAgc2NhbiA9IHN0cjsKKyAgICAgICAgd2hpbGUgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc2NhbildIDwgYmFzZSkKKyAgICAgICAgICAgICsrc2NhbjsKIAotCQkvKiBDcmVhdGUgYSBsb25nIG9iamVjdCB0aGF0IGNhbiBjb250YWluIHRoZSBsYXJnZXN0IHBvc3NpYmxlCi0JCSAqIGludGVnZXIgd2l0aCB0aGlzIGJhc2UgYW5kIGxlbmd0aC4gIE5vdGUgdGhhdCB0aGVyZSdzIG5vCi0JCSAqIG5lZWQgdG8gaW5pdGlhbGl6ZSB6LT5vYl9kaWdpdCAtLSBubyBzbG90IGlzIHJlYWQgdXAgYmVmb3JlCi0JCSAqIGJlaW5nIHN0b3JlZCBpbnRvLgotCQkgKi8KLQkJc2l6ZV96ID0gKFB5X3NzaXplX3QpKChzY2FuIC0gc3RyKSAqIGxvZ19iYXNlX1B5TG9uZ19CQVNFW2Jhc2VdKSArIDE7Ci0JCS8qIFVuY29tbWVudCBuZXh0IGxpbmUgdG8gdGVzdCBleGNlZWRpbmdseSByYXJlIGNvcHkgY29kZSAqLwotCQkvKiBzaXplX3ogPSAxOyAqLwotCQlhc3NlcnQoc2l6ZV96ID4gMCk7Ci0JCXogPSBfUHlMb25nX05ldyhzaXplX3opOwotCQlpZiAoeiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5X1NJWkUoeikgPSAwOworICAgICAgICAvKiBDcmVhdGUgYSBsb25nIG9iamVjdCB0aGF0IGNhbiBjb250YWluIHRoZSBsYXJnZXN0IHBvc3NpYmxlCisgICAgICAgICAqIGludGVnZXIgd2l0aCB0aGlzIGJhc2UgYW5kIGxlbmd0aC4gIE5vdGUgdGhhdCB0aGVyZSdzIG5vCisgICAgICAgICAqIG5lZWQgdG8gaW5pdGlhbGl6ZSB6LT5vYl9kaWdpdCAtLSBubyBzbG90IGlzIHJlYWQgdXAgYmVmb3JlCisgICAgICAgICAqIGJlaW5nIHN0b3JlZCBpbnRvLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV96ID0gKFB5X3NzaXplX3QpKChzY2FuIC0gc3RyKSAqIGxvZ19iYXNlX1B5TG9uZ19CQVNFW2Jhc2VdKSArIDE7CisgICAgICAgIC8qIFVuY29tbWVudCBuZXh0IGxpbmUgdG8gdGVzdCBleGNlZWRpbmdseSByYXJlIGNvcHkgY29kZSAqLworICAgICAgICAvKiBzaXplX3ogPSAxOyAqLworICAgICAgICBhc3NlcnQoc2l6ZV96ID4gMCk7CisgICAgICAgIHogPSBfUHlMb25nX05ldyhzaXplX3opOworICAgICAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5X1NJWkUoeikgPSAwOwogCi0JCS8qIGBjb252d2lkdGhgIGNvbnNlY3V0aXZlIGlucHV0IGRpZ2l0cyBhcmUgdHJlYXRlZCBhcyBhIHNpbmdsZQotCQkgKiBkaWdpdCBpbiBiYXNlIGBjb252bXVsdG1heGAuCi0JCSAqLwotCQljb252d2lkdGggPSBjb252d2lkdGhfYmFzZVtiYXNlXTsKLQkJY29udm11bHRtYXggPSBjb252bXVsdG1heF9iYXNlW2Jhc2VdOworICAgICAgICAvKiBgY29udndpZHRoYCBjb25zZWN1dGl2ZSBpbnB1dCBkaWdpdHMgYXJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUKKyAgICAgICAgICogZGlnaXQgaW4gYmFzZSBgY29udm11bHRtYXhgLgorICAgICAgICAgKi8KKyAgICAgICAgY29udndpZHRoID0gY29udndpZHRoX2Jhc2VbYmFzZV07CisgICAgICAgIGNvbnZtdWx0bWF4ID0gY29udm11bHRtYXhfYmFzZVtiYXNlXTsKIAotCQkvKiBXb3JrIDstKSAqLwotCQl3aGlsZSAoc3RyIDwgc2NhbikgewotCQkJLyogZ3JhYiB1cCB0byBjb252d2lkdGggZGlnaXRzIGZyb20gdGhlIGlucHV0IHN0cmluZyAqLwotCQkJYyA9IChkaWdpdClfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cisrKV07Ci0JCQlmb3IgKGkgPSAxOyBpIDwgY29udndpZHRoICYmIHN0ciAhPSBzY2FuOyArK2ksICsrc3RyKSB7Ci0JCQkJYyA9ICh0d29kaWdpdHMpKGMgKiAgYmFzZSArCi0JCQkJCV9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc3RyKV0pOwotCQkJCWFzc2VydChjIDwgUHlMb25nX0JBU0UpOwotCQkJfQorICAgICAgICAvKiBXb3JrIDstKSAqLworICAgICAgICB3aGlsZSAoc3RyIDwgc2NhbikgeworICAgICAgICAgICAgLyogZ3JhYiB1cCB0byBjb252d2lkdGggZGlnaXRzIGZyb20gdGhlIGlucHV0IHN0cmluZyAqLworICAgICAgICAgICAgYyA9IChkaWdpdClfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cisrKV07CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgY29udndpZHRoICYmIHN0ciAhPSBzY2FuOyArK2ksICsrc3RyKSB7CisgICAgICAgICAgICAgICAgYyA9ICh0d29kaWdpdHMpKGMgKiAgYmFzZSArCisgICAgICAgICAgICAgICAgICAgIF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc3RyKV0pOworICAgICAgICAgICAgICAgIGFzc2VydChjIDwgUHlMb25nX0JBU0UpOworICAgICAgICAgICAgfQogCi0JCQljb252bXVsdCA9IGNvbnZtdWx0bWF4OwotCQkJLyogQ2FsY3VsYXRlIHRoZSBzaGlmdCBvbmx5IGlmIHdlIGNvdWxkbid0IGdldAotCQkJICogY29udndpZHRoIGRpZ2l0cy4KLQkJCSAqLwotCQkJaWYgKGkgIT0gY29udndpZHRoKSB7Ci0JCQkJY29udm11bHQgPSBiYXNlOwotCQkJCWZvciAoIDsgaSA+IDE7IC0taSkKLQkJCQkJY29udm11bHQgKj0gYmFzZTsKLQkJCX0KKyAgICAgICAgICAgIGNvbnZtdWx0ID0gY29udm11bHRtYXg7CisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIHNoaWZ0IG9ubHkgaWYgd2UgY291bGRuJ3QgZ2V0CisgICAgICAgICAgICAgKiBjb252d2lkdGggZGlnaXRzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoaSAhPSBjb252d2lkdGgpIHsKKyAgICAgICAgICAgICAgICBjb252bXVsdCA9IGJhc2U7CisgICAgICAgICAgICAgICAgZm9yICggOyBpID4gMTsgLS1pKQorICAgICAgICAgICAgICAgICAgICBjb252bXVsdCAqPSBiYXNlOworICAgICAgICAgICAgfQogCi0JCQkvKiBNdWx0aXBseSB6IGJ5IGNvbnZtdWx0LCBhbmQgYWRkIGMuICovCi0JCQlweiA9IHotPm9iX2RpZ2l0OwotCQkJcHpzdG9wID0gcHogKyBQeV9TSVpFKHopOwotCQkJZm9yICg7IHB6IDwgcHpzdG9wOyArK3B6KSB7Ci0JCQkJYyArPSAodHdvZGlnaXRzKSpweiAqIGNvbnZtdWx0OwotCQkJCSpweiA9IChkaWdpdCkoYyAmIFB5TG9uZ19NQVNLKTsKLQkJCQljID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCQl9Ci0JCQkvKiBjYXJyeSBvZmYgdGhlIGN1cnJlbnQgZW5kPyAqLwotCQkJaWYgKGMpIHsKLQkJCQlhc3NlcnQoYyA8IFB5TG9uZ19CQVNFKTsKLQkJCQlpZiAoUHlfU0laRSh6KSA8IHNpemVfeikgewotCQkJCQkqcHogPSAoZGlnaXQpYzsKLQkJCQkJKytQeV9TSVpFKHopOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJUHlMb25nT2JqZWN0ICp0bXA7Ci0JCQkJCS8qIEV4dHJlbWVseSByYXJlLiAgR2V0IG1vcmUgc3BhY2UuICovCi0JCQkJCWFzc2VydChQeV9TSVpFKHopID09IHNpemVfeik7Ci0JCQkJCXRtcCA9IF9QeUxvbmdfTmV3KHNpemVfeiArIDEpOwotCQkJCQlpZiAodG1wID09IE5VTEwpIHsKLQkJCQkJCVB5X0RFQ1JFRih6KTsKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCQl9Ci0JCQkJCW1lbWNweSh0bXAtPm9iX2RpZ2l0LAotCQkJCQkgICAgICAgei0+b2JfZGlnaXQsCi0JCQkJCSAgICAgICBzaXplb2YoZGlnaXQpICogc2l6ZV96KTsKLQkJCQkJUHlfREVDUkVGKHopOwotCQkJCQl6ID0gdG1wOwotCQkJCQl6LT5vYl9kaWdpdFtzaXplX3pdID0gKGRpZ2l0KWM7Ci0JCQkJCSsrc2l6ZV96OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlpZiAoeiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc3RyID09IHN0YXJ0KQotCQlnb3RvIG9uRXJyb3I7Ci0JaWYgKHNpZ24gPCAwKQotCQlQeV9TSVpFKHopID0gLShQeV9TSVpFKHopKTsKLQlpZiAoKnN0ciA9PSAnTCcgfHwgKnN0ciA9PSAnbCcpCi0JCXN0cisrOwotCXdoaWxlICgqc3RyICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQotCQlzdHIrKzsKLQlpZiAoKnN0ciAhPSAnXDAnKQotCQlnb3RvIG9uRXJyb3I7Ci0JaWYgKHBlbmQpCi0JCSpwZW5kID0gc3RyOwotCXJldHVybiAoUHlPYmplY3QgKikgejsKKyAgICAgICAgICAgIC8qIE11bHRpcGx5IHogYnkgY29udm11bHQsIGFuZCBhZGQgYy4gKi8KKyAgICAgICAgICAgIHB6ID0gei0+b2JfZGlnaXQ7CisgICAgICAgICAgICBwenN0b3AgPSBweiArIFB5X1NJWkUoeik7CisgICAgICAgICAgICBmb3IgKDsgcHogPCBwenN0b3A7ICsrcHopIHsKKyAgICAgICAgICAgICAgICBjICs9ICh0d29kaWdpdHMpKnB6ICogY29udm11bHQ7CisgICAgICAgICAgICAgICAgKnB6ID0gKGRpZ2l0KShjICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgICAgIGMgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNhcnJ5IG9mZiB0aGUgY3VycmVudCBlbmQ/ICovCisgICAgICAgICAgICBpZiAoYykgeworICAgICAgICAgICAgICAgIGFzc2VydChjIDwgUHlMb25nX0JBU0UpOworICAgICAgICAgICAgICAgIGlmIChQeV9TSVpFKHopIDwgc2l6ZV96KSB7CisgICAgICAgICAgICAgICAgICAgICpweiA9IChkaWdpdCljOworICAgICAgICAgICAgICAgICAgICArK1B5X1NJWkUoeik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQeUxvbmdPYmplY3QgKnRtcDsKKyAgICAgICAgICAgICAgICAgICAgLyogRXh0cmVtZWx5IHJhcmUuICBHZXQgbW9yZSBzcGFjZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5X1NJWkUoeikgPT0gc2l6ZV96KTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gX1B5TG9uZ19OZXcoc2l6ZV96ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHopOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRtcC0+b2JfZGlnaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB6LT5vYl9kaWdpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkaWdpdCkgKiBzaXplX3opOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeik7CisgICAgICAgICAgICAgICAgICAgIHogPSB0bXA7CisgICAgICAgICAgICAgICAgICAgIHotPm9iX2RpZ2l0W3NpemVfel0gPSAoZGlnaXQpYzsKKyAgICAgICAgICAgICAgICAgICAgKytzaXplX3o7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChzdHIgPT0gc3RhcnQpCisgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBpZiAoc2lnbiA8IDApCisgICAgICAgIFB5X1NJWkUoeikgPSAtKFB5X1NJWkUoeikpOworICAgIGlmICgqc3RyID09ICdMJyB8fCAqc3RyID09ICdsJykKKyAgICAgICAgc3RyKys7CisgICAgd2hpbGUgKCpzdHIgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCisgICAgICAgIHN0cisrOworICAgIGlmICgqc3RyICE9ICdcMCcpCisgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBpZiAocGVuZCkKKyAgICAgICAgKnBlbmQgPSBzdHI7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSB6OwogCiAgb25FcnJvcjoKLQlQeV9YREVDUkVGKHopOwotCXNsZW4gPSBzdHJsZW4ob3JpZ19zdHIpIDwgMjAwID8gc3RybGVuKG9yaWdfc3RyKSA6IDIwMDsKLQlzdHJvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvcmlnX3N0ciwgc2xlbik7Ci0JaWYgKHN0cm9iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzdHJyZXByID0gUHlPYmplY3RfUmVwcihzdHJvYmopOwotCVB5X0RFQ1JFRihzdHJvYmopOwotCWlmIChzdHJyZXByID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkgICAgICJpbnZhbGlkIGxpdGVyYWwgZm9yIGxvbmcoKSB3aXRoIGJhc2UgJWQ6ICVzIiwKLQkJICAgICBiYXNlLCBQeVN0cmluZ19BU19TVFJJTkcoc3RycmVwcikpOwotCVB5X0RFQ1JFRihzdHJyZXByKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKHopOworICAgIHNsZW4gPSBzdHJsZW4ob3JpZ19zdHIpIDwgMjAwID8gc3RybGVuKG9yaWdfc3RyKSA6IDIwMDsKKyAgICBzdHJvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShvcmlnX3N0ciwgc2xlbik7CisgICAgaWYgKHN0cm9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdHJyZXByID0gUHlPYmplY3RfUmVwcihzdHJvYmopOworICAgIFB5X0RFQ1JFRihzdHJvYmopOworICAgIGlmIChzdHJyZXByID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBsb25nKCkgd2l0aCBiYXNlICVkOiAlcyIsCisgICAgICAgICAgICAgICAgIGJhc2UsIFB5U3RyaW5nX0FTX1NUUklORyhzdHJyZXByKSk7CisgICAgUHlfREVDUkVGKHN0cnJlcHIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogUHlPYmplY3QgKgogUHlMb25nX0Zyb21Vbmljb2RlKFB5X1VOSUNPREUgKnUsIFB5X3NzaXplX3QgbGVuZ3RoLCBpbnQgYmFzZSkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCWNoYXIgKmJ1ZmZlciA9IChjaGFyICopUHlNZW1fTUFMTE9DKGxlbmd0aCsxKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKmJ1ZmZlciA9IChjaGFyICopUHlNZW1fTUFMTE9DKGxlbmd0aCsxKTsKIAotCWlmIChidWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeVVuaWNvZGVfRW5jb2RlRGVjaW1hbCh1LCBsZW5ndGgsIGJ1ZmZlciwgTlVMTCkpIHsKLQkJUHlNZW1fRlJFRShidWZmZXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0ID0gUHlMb25nX0Zyb21TdHJpbmcoYnVmZmVyLCBOVUxMLCBiYXNlKTsKLQlQeU1lbV9GUkVFKGJ1ZmZlcik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoUHlVbmljb2RlX0VuY29kZURlY2ltYWwodSwgbGVuZ3RoLCBidWZmZXIsIE5VTEwpKSB7CisgICAgICAgIFB5TWVtX0ZSRUUoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tU3RyaW5nKGJ1ZmZlciwgTlVMTCwgYmFzZSk7CisgICAgUHlNZW1fRlJFRShidWZmZXIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAjZW5kaWYKIAogLyogZm9yd2FyZCAqLwogc3RhdGljIFB5TG9uZ09iamVjdCAqeF9kaXZyZW0KLQkoUHlMb25nT2JqZWN0ICosIFB5TG9uZ09iamVjdCAqLCBQeUxvbmdPYmplY3QgKiopOworICAgIChQeUxvbmdPYmplY3QgKiwgUHlMb25nT2JqZWN0ICosIFB5TG9uZ09iamVjdCAqKik7CiBzdGF0aWMgUHlPYmplY3QgKmxvbmdfbG9uZyhQeU9iamVjdCAqdik7CiBzdGF0aWMgaW50IGxvbmdfZGl2cmVtKFB5TG9uZ09iamVjdCAqLCBQeUxvbmdPYmplY3QgKiwKLQlQeUxvbmdPYmplY3QgKiosIFB5TG9uZ09iamVjdCAqKik7CisgICAgUHlMb25nT2JqZWN0ICoqLCBQeUxvbmdPYmplY3QgKiopOwogCiAvKiBMb25nIGRpdmlzaW9uIHdpdGggcmVtYWluZGVyLCB0b3AtbGV2ZWwgcm91dGluZSAqLwogCiBzdGF0aWMgaW50CiBsb25nX2RpdnJlbShQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYiwKLQkgICAgUHlMb25nT2JqZWN0ICoqcGRpdiwgUHlMb25nT2JqZWN0ICoqcHJlbSkKKyAgICAgICAgICAgIFB5TG9uZ09iamVjdCAqKnBkaXYsIFB5TG9uZ09iamVjdCAqKnByZW0pCiB7Ci0JUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSksIHNpemVfYiA9IEFCUyhQeV9TSVpFKGIpKTsKLQlQeUxvbmdPYmplY3QgKno7CisgICAgUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSksIHNpemVfYiA9IEFCUyhQeV9TSVpFKGIpKTsKKyAgICBQeUxvbmdPYmplY3QgKno7CiAKLQlpZiAoc2l6ZV9iID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1plcm9EaXZpc2lvbkVycm9yLAotCQkJCSJsb25nIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHNpemVfYSA8IHNpemVfYiB8fAotCSAgICAoc2l6ZV9hID09IHNpemVfYiAmJgotCSAgICAgYS0+b2JfZGlnaXRbc2l6ZV9hLTFdIDwgYi0+b2JfZGlnaXRbc2l6ZV9iLTFdKSkgewotCQkvKiB8YXwgPCB8YnwuICovCi0JCSpwZGl2ID0gX1B5TG9uZ19OZXcoMCk7Ci0JCWlmICgqcGRpdiA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlQeV9JTkNSRUYoYSk7Ci0JCSpwcmVtID0gKFB5TG9uZ09iamVjdCAqKSBhOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHNpemVfYiA9PSAxKSB7Ci0JCWRpZ2l0IHJlbSA9IDA7Ci0JCXogPSBkaXZyZW0xKGEsIGItPm9iX2RpZ2l0WzBdLCAmcmVtKTsKLQkJaWYgKHogPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJKnByZW0gPSAoUHlMb25nT2JqZWN0ICopIFB5TG9uZ19Gcm9tTG9uZygobG9uZylyZW0pOwotCQlpZiAoKnByZW0gPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHopOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UgewotCQl6ID0geF9kaXZyZW0oYSwgYiwgcHJlbSk7Ci0JCWlmICh6ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCS8qIFNldCB0aGUgc2lnbnMuCi0JICAgVGhlIHF1b3RpZW50IHogaGFzIHRoZSBzaWduIG9mIGEqYjsKLQkgICB0aGUgcmVtYWluZGVyIHIgaGFzIHRoZSBzaWduIG9mIGEsCi0JICAgc28gYSA9IGIqeiArIHIuICovCi0JaWYgKChhLT5vYl9zaXplIDwgMCkgIT0gKGItPm9iX3NpemUgPCAwKSkKLQkJei0+b2Jfc2l6ZSA9IC0oei0+b2Jfc2l6ZSk7Ci0JaWYgKGEtPm9iX3NpemUgPCAwICYmICgqcHJlbSktPm9iX3NpemUgIT0gMCkKLQkJKCpwcmVtKS0+b2Jfc2l6ZSA9IC0oKCpwcmVtKS0+b2Jfc2l6ZSk7Ci0JKnBkaXYgPSB6OwotCXJldHVybiAwOworICAgIGlmIChzaXplX2IgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibG9uZyBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChzaXplX2EgPCBzaXplX2IgfHwKKyAgICAgICAgKHNpemVfYSA9PSBzaXplX2IgJiYKKyAgICAgICAgIGEtPm9iX2RpZ2l0W3NpemVfYS0xXSA8IGItPm9iX2RpZ2l0W3NpemVfYi0xXSkpIHsKKyAgICAgICAgLyogfGF8IDwgfGJ8LiAqLworICAgICAgICAqcGRpdiA9IF9QeUxvbmdfTmV3KDApOworICAgICAgICBpZiAoKnBkaXYgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfSU5DUkVGKGEpOworICAgICAgICAqcHJlbSA9IChQeUxvbmdPYmplY3QgKikgYTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChzaXplX2IgPT0gMSkgeworICAgICAgICBkaWdpdCByZW0gPSAwOworICAgICAgICB6ID0gZGl2cmVtMShhLCBiLT5vYl9kaWdpdFswXSwgJnJlbSk7CisgICAgICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICpwcmVtID0gKFB5TG9uZ09iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpcmVtKTsKKyAgICAgICAgaWYgKCpwcmVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih6KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgeiA9IHhfZGl2cmVtKGEsIGIsIHByZW0pOworICAgICAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBTZXQgdGhlIHNpZ25zLgorICAgICAgIFRoZSBxdW90aWVudCB6IGhhcyB0aGUgc2lnbiBvZiBhKmI7CisgICAgICAgdGhlIHJlbWFpbmRlciByIGhhcyB0aGUgc2lnbiBvZiBhLAorICAgICAgIHNvIGEgPSBiKnogKyByLiAqLworICAgIGlmICgoYS0+b2Jfc2l6ZSA8IDApICE9IChiLT5vYl9zaXplIDwgMCkpCisgICAgICAgIHotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOworICAgIGlmIChhLT5vYl9zaXplIDwgMCAmJiAoKnByZW0pLT5vYl9zaXplICE9IDApCisgICAgICAgICgqcHJlbSktPm9iX3NpemUgPSAtKCgqcHJlbSktPm9iX3NpemUpOworICAgICpwZGl2ID0gejsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogVW5zaWduZWQgbG9uZyBkaXZpc2lvbiB3aXRoIHJlbWFpbmRlciAtLSB0aGUgYWxnb3JpdGhtICovCkBAIC0xODE5LDk5ICsxODE5LDk5IEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICoKIHhfZGl2cmVtKFB5TG9uZ09iamVjdCAqdjEsIFB5TG9uZ09iamVjdCAqdzEsIFB5TG9uZ09iamVjdCAqKnByZW0pCiB7Ci0JUHlfc3NpemVfdCBzaXplX3YgPSBBQlMoUHlfU0laRSh2MSkpLCBzaXplX3cgPSBBQlMoUHlfU0laRSh3MSkpOwotCWRpZ2l0IGQgPSAoZGlnaXQpICgodHdvZGlnaXRzKVB5TG9uZ19CQVNFIC8gKHcxLT5vYl9kaWdpdFtzaXplX3ctMV0gKyAxKSk7Ci0JUHlMb25nT2JqZWN0ICp2ID0gbXVsMSh2MSwgZCk7Ci0JUHlMb25nT2JqZWN0ICp3ID0gbXVsMSh3MSwgZCk7Ci0JUHlMb25nT2JqZWN0ICphOwotCVB5X3NzaXplX3QgaiwgazsKKyAgICBQeV9zc2l6ZV90IHNpemVfdiA9IEFCUyhQeV9TSVpFKHYxKSksIHNpemVfdyA9IEFCUyhQeV9TSVpFKHcxKSk7CisgICAgZGlnaXQgZCA9IChkaWdpdCkgKCh0d29kaWdpdHMpUHlMb25nX0JBU0UgLyAodzEtPm9iX2RpZ2l0W3NpemVfdy0xXSArIDEpKTsKKyAgICBQeUxvbmdPYmplY3QgKnYgPSBtdWwxKHYxLCBkKTsKKyAgICBQeUxvbmdPYmplY3QgKncgPSBtdWwxKHcxLCBkKTsKKyAgICBQeUxvbmdPYmplY3QgKmE7CisgICAgUHlfc3NpemVfdCBqLCBrOwogCi0JaWYgKHYgPT0gTlVMTCB8fCB3ID09IE5VTEwpIHsKLQkJUHlfWERFQ1JFRih2KTsKLQkJUHlfWERFQ1JFRih3KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICh2ID09IE5VTEwgfHwgdyA9PSBOVUxMKSB7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgIFB5X1hERUNSRUYodyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWFzc2VydChzaXplX3YgPj0gc2l6ZV93ICYmIHNpemVfdyA+IDEpOyAvKiBBc3NlcnQgY2hlY2tzIGJ5IGRpdigpICovCi0JYXNzZXJ0KFB5X1JFRkNOVCh2KSA9PSAxKTsgLyogU2luY2UgdiB3aWxsIGJlIHVzZWQgYXMgYWNjdW11bGF0b3IhICovCi0JYXNzZXJ0KHNpemVfdyA9PSBBQlMoUHlfU0laRSh3KSkpOyAvKiBUaGF0J3MgaG93IGQgd2FzIGNhbGN1bGF0ZWQgKi8KKyAgICBhc3NlcnQoc2l6ZV92ID49IHNpemVfdyAmJiBzaXplX3cgPiAxKTsgLyogQXNzZXJ0IGNoZWNrcyBieSBkaXYoKSAqLworICAgIGFzc2VydChQeV9SRUZDTlQodikgPT0gMSk7IC8qIFNpbmNlIHYgd2lsbCBiZSB1c2VkIGFzIGFjY3VtdWxhdG9yISAqLworICAgIGFzc2VydChzaXplX3cgPT0gQUJTKFB5X1NJWkUodykpKTsgLyogVGhhdCdzIGhvdyBkIHdhcyBjYWxjdWxhdGVkICovCiAKLQlzaXplX3YgPSBBQlMoUHlfU0laRSh2KSk7Ci0JayA9IHNpemVfdiAtIHNpemVfdzsKLQlhID0gX1B5TG9uZ19OZXcoayArIDEpOworICAgIHNpemVfdiA9IEFCUyhQeV9TSVpFKHYpKTsKKyAgICBrID0gc2l6ZV92IC0gc2l6ZV93OworICAgIGEgPSBfUHlMb25nX05ldyhrICsgMSk7CiAKLQlmb3IgKGogPSBzaXplX3Y7IGEgIT0gTlVMTCAmJiBrID49IDA7IC0taiwgLS1rKSB7Ci0JCWRpZ2l0IHZqID0gKGogPj0gc2l6ZV92KSA/IDAgOiB2LT5vYl9kaWdpdFtqXTsKLQkJdHdvZGlnaXRzIHE7Ci0JCXN0d29kaWdpdHMgY2FycnkgPSAwOwotCQlQeV9zc2l6ZV90IGk7CisgICAgZm9yIChqID0gc2l6ZV92OyBhICE9IE5VTEwgJiYgayA+PSAwOyAtLWosIC0taykgeworICAgICAgICBkaWdpdCB2aiA9IChqID49IHNpemVfdikgPyAwIDogdi0+b2JfZGlnaXRbal07CisgICAgICAgIHR3b2RpZ2l0cyBxOworICAgICAgICBzdHdvZGlnaXRzIGNhcnJ5ID0gMDsKKyAgICAgICAgUHlfc3NpemVfdCBpOwogCi0JCVNJR0NIRUNLKHsKLQkJCVB5X0RFQ1JFRihhKTsKLQkJCWEgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0pCi0JCWlmICh2aiA9PSB3LT5vYl9kaWdpdFtzaXplX3ctMV0pCi0JCQlxID0gUHlMb25nX01BU0s7Ci0JCWVsc2UKLQkJCXEgPSAoKCh0d29kaWdpdHMpdmogPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2otMV0pIC8KLQkJCQl3LT5vYl9kaWdpdFtzaXplX3ctMV07CisgICAgICAgIFNJR0NIRUNLKHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgIGEgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0pCisgICAgICAgIGlmICh2aiA9PSB3LT5vYl9kaWdpdFtzaXplX3ctMV0pCisgICAgICAgICAgICBxID0gUHlMb25nX01BU0s7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHEgPSAoKCh0d29kaWdpdHMpdmogPDwgUHlMb25nX1NISUZUKSArIHYtPm9iX2RpZ2l0W2otMV0pIC8KKyAgICAgICAgICAgICAgICB3LT5vYl9kaWdpdFtzaXplX3ctMV07CiAKLQkJd2hpbGUgKHctPm9iX2RpZ2l0W3NpemVfdy0yXSpxID4KLQkJCQkoKAotCQkJCQkoKHR3b2RpZ2l0cyl2aiA8PCBQeUxvbmdfU0hJRlQpCi0JCQkJCSsgdi0+b2JfZGlnaXRbai0xXQotCQkJCQktIHEqdy0+b2JfZGlnaXRbc2l6ZV93LTFdCi0JCQkJCQkJCSkgPDwgUHlMb25nX1NISUZUKQotCQkJCSsgdi0+b2JfZGlnaXRbai0yXSkKLQkJCS0tcTsKKyAgICAgICAgd2hpbGUgKHctPm9iX2RpZ2l0W3NpemVfdy0yXSpxID4KKyAgICAgICAgICAgICAgICAgICAgICAgICgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodHdvZGlnaXRzKXZqIDw8IFB5TG9uZ19TSElGVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2LT5vYl9kaWdpdFtqLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcSp3LT5vYl9kaWdpdFtzaXplX3ctMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA8PCBQeUxvbmdfU0hJRlQpCisgICAgICAgICAgICAgICAgICAgICAgICArIHYtPm9iX2RpZ2l0W2otMl0pCisgICAgICAgICAgICAtLXE7CiAKLQkJZm9yIChpID0gMDsgaSA8IHNpemVfdyAmJiBpK2sgPCBzaXplX3Y7ICsraSkgewotCQkJdHdvZGlnaXRzIHogPSB3LT5vYl9kaWdpdFtpXSAqIHE7Ci0JCQlkaWdpdCB6eiA9IChkaWdpdCkgKHogPj4gUHlMb25nX1NISUZUKTsKLQkJCWNhcnJ5ICs9IHYtPm9iX2RpZ2l0W2kra10gLSB6Ci0JCQkJKyAoKHR3b2RpZ2l0cyl6eiA8PCBQeUxvbmdfU0hJRlQpOwotCQkJdi0+b2JfZGlnaXRbaStrXSA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7Ci0JCQljYXJyeSA9IFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQoQkFTRV9UV09ESUdJVFNfVFlQRSwKLQkJCQkJCQkgIGNhcnJ5LCBQeUxvbmdfU0hJRlQpOwotCQkJY2FycnkgLT0geno7Ci0JCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVfdyAmJiBpK2sgPCBzaXplX3Y7ICsraSkgeworICAgICAgICAgICAgdHdvZGlnaXRzIHogPSB3LT5vYl9kaWdpdFtpXSAqIHE7CisgICAgICAgICAgICBkaWdpdCB6eiA9IChkaWdpdCkgKHogPj4gUHlMb25nX1NISUZUKTsKKyAgICAgICAgICAgIGNhcnJ5ICs9IHYtPm9iX2RpZ2l0W2kra10gLSB6CisgICAgICAgICAgICAgICAgKyAoKHR3b2RpZ2l0cyl6eiA8PCBQeUxvbmdfU0hJRlQpOworICAgICAgICAgICAgdi0+b2JfZGlnaXRbaStrXSA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICBjYXJyeSA9IFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQoQkFTRV9UV09ESUdJVFNfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJyeSwgUHlMb25nX1NISUZUKTsKKyAgICAgICAgICAgIGNhcnJ5IC09IHp6OworICAgICAgICB9CiAKLQkJaWYgKGkrayA8IHNpemVfdikgewotCQkJY2FycnkgKz0gdi0+b2JfZGlnaXRbaStrXTsKLQkJCXYtPm9iX2RpZ2l0W2kra10gPSAwOwotCQl9CisgICAgICAgIGlmIChpK2sgPCBzaXplX3YpIHsKKyAgICAgICAgICAgIGNhcnJ5ICs9IHYtPm9iX2RpZ2l0W2kra107CisgICAgICAgICAgICB2LT5vYl9kaWdpdFtpK2tdID0gMDsKKyAgICAgICAgfQogCi0JCWlmIChjYXJyeSA9PSAwKQotCQkJYS0+b2JfZGlnaXRba10gPSAoZGlnaXQpIHE7Ci0JCWVsc2UgewotCQkJYXNzZXJ0KGNhcnJ5ID09IC0xKTsKLQkJCWEtPm9iX2RpZ2l0W2tdID0gKGRpZ2l0KSBxLTE7Ci0JCQljYXJyeSA9IDA7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZV93ICYmIGkrayA8IHNpemVfdjsgKytpKSB7Ci0JCQkJY2FycnkgKz0gdi0+b2JfZGlnaXRbaStrXSArIHctPm9iX2RpZ2l0W2ldOwotCQkJCXYtPm9iX2RpZ2l0W2kra10gPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOwotCQkJCWNhcnJ5ID0gUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVCgKLQkJCQkJCUJBU0VfVFdPRElHSVRTX1RZUEUsCi0JCQkJCQljYXJyeSwgUHlMb25nX1NISUZUKTsKLQkJCX0KLQkJfQotCX0gLyogZm9yIGosIGsgKi8KKyAgICAgICAgaWYgKGNhcnJ5ID09IDApCisgICAgICAgICAgICBhLT5vYl9kaWdpdFtrXSA9IChkaWdpdCkgcTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoY2FycnkgPT0gLTEpOworICAgICAgICAgICAgYS0+b2JfZGlnaXRba10gPSAoZGlnaXQpIHEtMTsKKyAgICAgICAgICAgIGNhcnJ5ID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX3cgJiYgaStrIDwgc2l6ZV92OyArK2kpIHsKKyAgICAgICAgICAgICAgICBjYXJyeSArPSB2LT5vYl9kaWdpdFtpK2tdICsgdy0+b2JfZGlnaXRbaV07CisgICAgICAgICAgICAgICAgdi0+b2JfZGlnaXRbaStrXSA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICAgICAgY2FycnkgPSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQVNFX1RXT0RJR0lUU19UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJyeSwgUHlMb25nX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gLyogZm9yIGosIGsgKi8KIAotCWlmIChhID09IE5VTEwpCi0JCSpwcmVtID0gTlVMTDsKLQllbHNlIHsKLQkJYSA9IGxvbmdfbm9ybWFsaXplKGEpOwotCQkqcHJlbSA9IGRpdnJlbTEodiwgZCwgJmQpOwotCQkvKiBkIHJlY2VpdmVzIHRoZSAodW51c2VkKSByZW1haW5kZXIgKi8KLQkJaWYgKCpwcmVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihhKTsKLQkJCWEgPSBOVUxMOwotCQl9Ci0JfQotCVB5X0RFQ1JFRih2KTsKLQlQeV9ERUNSRUYodyk7Ci0JcmV0dXJuIGE7CisgICAgaWYgKGEgPT0gTlVMTCkKKyAgICAgICAgKnByZW0gPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBhID0gbG9uZ19ub3JtYWxpemUoYSk7CisgICAgICAgICpwcmVtID0gZGl2cmVtMSh2LCBkLCAmZCk7CisgICAgICAgIC8qIGQgcmVjZWl2ZXMgdGhlICh1bnVzZWQpIHJlbWFpbmRlciAqLworICAgICAgICBpZiAoKnByZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICAgICAgYSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIFB5X0RFQ1JFRih3KTsKKyAgICByZXR1cm4gYTsKIH0KIAogLyogTWV0aG9kcyAqLwpAQCAtMTkxOSw4NCArMTkxOSw4NCBAQAogc3RhdGljIHZvaWQKIGxvbmdfZGVhbGxvYyhQeU9iamVjdCAqdikKIHsKLQlQeV9UWVBFKHYpLT50cF9mcmVlKHYpOworICAgIFB5X1RZUEUodiktPnRwX2ZyZWUodik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX3JlcHIoUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIF9QeUxvbmdfRm9ybWF0KHYsIDEwLCAxLCAwKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gb3JtYXQodiwgMTAsIDEsIDApOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19zdHIoUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIF9QeUxvbmdfRm9ybWF0KHYsIDEwLCAwLCAwKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gb3JtYXQodiwgMTAsIDAsIDApOwogfQogCiBzdGF0aWMgaW50CiBsb25nX2NvbXBhcmUoUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIpCiB7Ci0JUHlfc3NpemVfdCBzaWduOworICAgIFB5X3NzaXplX3Qgc2lnbjsKIAotCWlmIChQeV9TSVpFKGEpICE9IFB5X1NJWkUoYikpIHsKLQkJaWYgKEFCUyhQeV9TSVpFKGEpKSA9PSAwICYmIEFCUyhQeV9TSVpFKGIpKSA9PSAwKQotCQkJc2lnbiA9IDA7Ci0JCWVsc2UKLQkJCXNpZ24gPSBQeV9TSVpFKGEpIC0gUHlfU0laRShiKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5X3NzaXplX3QgaSA9IEFCUyhQeV9TSVpFKGEpKTsKLQkJd2hpbGUgKC0taSA+PSAwICYmIGEtPm9iX2RpZ2l0W2ldID09IGItPm9iX2RpZ2l0W2ldKQotCQkJOwotCQlpZiAoaSA8IDApCi0JCQlzaWduID0gMDsKLQkJZWxzZSB7Ci0JCQlzaWduID0gKGludClhLT5vYl9kaWdpdFtpXSAtIChpbnQpYi0+b2JfZGlnaXRbaV07Ci0JCQlpZiAoUHlfU0laRShhKSA8IDApCi0JCQkJc2lnbiA9IC1zaWduOwotCQl9Ci0JfQotCXJldHVybiBzaWduIDwgMCA/IC0xIDogc2lnbiA+IDAgPyAxIDogMDsKKyAgICBpZiAoUHlfU0laRShhKSAhPSBQeV9TSVpFKGIpKSB7CisgICAgICAgIGlmIChBQlMoUHlfU0laRShhKSkgPT0gMCAmJiBBQlMoUHlfU0laRShiKSkgPT0gMCkKKyAgICAgICAgICAgIHNpZ24gPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzaWduID0gUHlfU0laRShhKSAtIFB5X1NJWkUoYik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9zc2l6ZV90IGkgPSBBQlMoUHlfU0laRShhKSk7CisgICAgICAgIHdoaWxlICgtLWkgPj0gMCAmJiBhLT5vYl9kaWdpdFtpXSA9PSBiLT5vYl9kaWdpdFtpXSkKKyAgICAgICAgICAgIDsKKyAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgc2lnbiA9IDA7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc2lnbiA9IChpbnQpYS0+b2JfZGlnaXRbaV0gLSAoaW50KWItPm9iX2RpZ2l0W2ldOworICAgICAgICAgICAgaWYgKFB5X1NJWkUoYSkgPCAwKQorICAgICAgICAgICAgICAgIHNpZ24gPSAtc2lnbjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2lnbiA8IDAgPyAtMSA6IHNpZ24gPiAwID8gMSA6IDA7CiB9CiAKIHN0YXRpYyBsb25nCiBsb25nX2hhc2goUHlMb25nT2JqZWN0ICp2KQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHNpZ247CisgICAgdW5zaWduZWQgbG9uZyB4OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgc2lnbjsKIAotCS8qIFRoaXMgaXMgZGVzaWduZWQgc28gdGhhdCBQeXRob24gaW50cyBhbmQgbG9uZ3Mgd2l0aCB0aGUKLQkgICBzYW1lIHZhbHVlIGhhc2ggdG8gdGhlIHNhbWUgdmFsdWUsIG90aGVyd2lzZSBjb21wYXJpc29ucwotCSAgIG9mIG1hcHBpbmcga2V5cyB3aWxsIHR1cm4gb3V0IHdlaXJkICovCi0JaSA9IHYtPm9iX3NpemU7Ci0Jc2lnbiA9IDE7Ci0JeCA9IDA7Ci0JaWYgKGkgPCAwKSB7Ci0JCXNpZ24gPSAtMTsKLQkJaSA9IC0oaSk7Ci0JfQotI2RlZmluZSBMT05HX0JJVF9QeUxvbmdfU0hJRlQJKDgqc2l6ZW9mKGxvbmcpIC0gUHlMb25nX1NISUZUKQotCS8qIFRoZSBmb2xsb3dpbmcgbG9vcCBwcm9kdWNlcyBhIEMgdW5zaWduZWQgbG9uZyB4IHN1Y2ggdGhhdCB4IGlzCi0JICAgY29uZ3J1ZW50IHRvIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB2IG1vZHVsbyBVTE9OR19NQVguICBUaGUKLQkgICByZXN1bHRpbmcgeCBpcyBub256ZXJvIGlmIGFuZCBvbmx5IGlmIHYgaXMuICovCi0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCS8qIEZvcmNlIGEgbmF0aXZlIGxvbmcgIy1iaXRzICgzMiBvciA2NCkgY2lyY3VsYXIgc2hpZnQgKi8KLQkJeCA9ICgoeCA8PCBQeUxvbmdfU0hJRlQpICYgflB5TG9uZ19NQVNLKSB8Ci0JCQkoKHggPj4gTE9OR19CSVRfUHlMb25nX1NISUZUKSAmIFB5TG9uZ19NQVNLKTsKLQkJeCArPSB2LT5vYl9kaWdpdFtpXTsKLQkJLyogSWYgdGhlIGFkZGl0aW9uIGFib3ZlIG92ZXJmbG93ZWQgd2UgY29tcGVuc2F0ZSBieQotCQkgICBpbmNyZW1lbnRpbmcuICBUaGlzIHByZXNlcnZlcyB0aGUgdmFsdWUgbW9kdWxvCi0JCSAgIFVMT05HX01BWC4gKi8KLQkJaWYgKHggPCB2LT5vYl9kaWdpdFtpXSkKLQkJCXgrKzsKLQl9CisgICAgLyogVGhpcyBpcyBkZXNpZ25lZCBzbyB0aGF0IFB5dGhvbiBpbnRzIGFuZCBsb25ncyB3aXRoIHRoZQorICAgICAgIHNhbWUgdmFsdWUgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZSwgb3RoZXJ3aXNlIGNvbXBhcmlzb25zCisgICAgICAgb2YgbWFwcGluZyBrZXlzIHdpbGwgdHVybiBvdXQgd2VpcmQgKi8KKyAgICBpID0gdi0+b2Jfc2l6ZTsKKyAgICBzaWduID0gMTsKKyAgICB4ID0gMDsKKyAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgc2lnbiA9IC0xOworICAgICAgICBpID0gLShpKTsKKyAgICB9CisjZGVmaW5lIExPTkdfQklUX1B5TG9uZ19TSElGVCAgICg4KnNpemVvZihsb25nKSAtIFB5TG9uZ19TSElGVCkKKyAgICAvKiBUaGUgZm9sbG93aW5nIGxvb3AgcHJvZHVjZXMgYSBDIHVuc2lnbmVkIGxvbmcgeCBzdWNoIHRoYXQgeCBpcworICAgICAgIGNvbmdydWVudCB0byB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdiBtb2R1bG8gVUxPTkdfTUFYLiAgVGhlCisgICAgICAgcmVzdWx0aW5nIHggaXMgbm9uemVybyBpZiBhbmQgb25seSBpZiB2IGlzLiAqLworICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICAvKiBGb3JjZSBhIG5hdGl2ZSBsb25nICMtYml0cyAoMzIgb3IgNjQpIGNpcmN1bGFyIHNoaWZ0ICovCisgICAgICAgIHggPSAoKHggPDwgUHlMb25nX1NISUZUKSAmIH5QeUxvbmdfTUFTSykgfAorICAgICAgICAgICAgKCh4ID4+IExPTkdfQklUX1B5TG9uZ19TSElGVCkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgIHggKz0gdi0+b2JfZGlnaXRbaV07CisgICAgICAgIC8qIElmIHRoZSBhZGRpdGlvbiBhYm92ZSBvdmVyZmxvd2VkIHdlIGNvbXBlbnNhdGUgYnkKKyAgICAgICAgICAgaW5jcmVtZW50aW5nLiAgVGhpcyBwcmVzZXJ2ZXMgdGhlIHZhbHVlIG1vZHVsbworICAgICAgICAgICBVTE9OR19NQVguICovCisgICAgICAgIGlmICh4IDwgdi0+b2JfZGlnaXRbaV0pCisgICAgICAgICAgICB4Kys7CisgICAgfQogI3VuZGVmIExPTkdfQklUX1B5TG9uZ19TSElGVAotCXggPSB4ICogc2lnbjsKLQlpZiAoeCA9PSAtMSkKLQkJeCA9IC0yOwotCXJldHVybiB4OworICAgIHggPSB4ICogc2lnbjsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgeCA9IC0yOworICAgIHJldHVybiB4OwogfQogCiAKQEAgLTIwMDUsMzMgKzIwMDUsMzMgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKgogeF9hZGQoUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIpCiB7Ci0JUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSksIHNpemVfYiA9IEFCUyhQeV9TSVpFKGIpKTsKLQlQeUxvbmdPYmplY3QgKno7Ci0JUHlfc3NpemVfdCBpOwotCWRpZ2l0IGNhcnJ5ID0gMDsKKyAgICBQeV9zc2l6ZV90IHNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKSwgc2l6ZV9iID0gQUJTKFB5X1NJWkUoYikpOworICAgIFB5TG9uZ09iamVjdCAqejsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgZGlnaXQgY2FycnkgPSAwOwogCi0JLyogRW5zdXJlIGEgaXMgdGhlIGxhcmdlciBvZiB0aGUgdHdvOiAqLwotCWlmIChzaXplX2EgPCBzaXplX2IpIHsKLQkJeyBQeUxvbmdPYmplY3QgKnRlbXAgPSBhOyBhID0gYjsgYiA9IHRlbXA7IH0KLQkJeyBQeV9zc2l6ZV90IHNpemVfdGVtcCA9IHNpemVfYTsKLQkJICBzaXplX2EgPSBzaXplX2I7Ci0JCSAgc2l6ZV9iID0gc2l6ZV90ZW1wOyB9Ci0JfQotCXogPSBfUHlMb25nX05ldyhzaXplX2ErMSk7Ci0JaWYgKHogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IHNpemVfYjsgKytpKSB7Ci0JCWNhcnJ5ICs9IGEtPm9iX2RpZ2l0W2ldICsgYi0+b2JfZGlnaXRbaV07Ci0JCXotPm9iX2RpZ2l0W2ldID0gY2FycnkgJiBQeUxvbmdfTUFTSzsKLQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQl9Ci0JZm9yICg7IGkgPCBzaXplX2E7ICsraSkgewotCQljYXJyeSArPSBhLT5vYl9kaWdpdFtpXTsKLQkJei0+b2JfZGlnaXRbaV0gPSBjYXJyeSAmIFB5TG9uZ19NQVNLOwotCQljYXJyeSA+Pj0gUHlMb25nX1NISUZUOwotCX0KLQl6LT5vYl9kaWdpdFtpXSA9IGNhcnJ5OwotCXJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICAvKiBFbnN1cmUgYSBpcyB0aGUgbGFyZ2VyIG9mIHRoZSB0d286ICovCisgICAgaWYgKHNpemVfYSA8IHNpemVfYikgeworICAgICAgICB7IFB5TG9uZ09iamVjdCAqdGVtcCA9IGE7IGEgPSBiOyBiID0gdGVtcDsgfQorICAgICAgICB7IFB5X3NzaXplX3Qgc2l6ZV90ZW1wID0gc2l6ZV9hOworICAgICAgICAgIHNpemVfYSA9IHNpemVfYjsKKyAgICAgICAgICBzaXplX2IgPSBzaXplX3RlbXA7IH0KKyAgICB9CisgICAgeiA9IF9QeUxvbmdfTmV3KHNpemVfYSsxKTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9iOyArK2kpIHsKKyAgICAgICAgY2FycnkgKz0gYS0+b2JfZGlnaXRbaV0gKyBiLT5vYl9kaWdpdFtpXTsKKyAgICAgICAgei0+b2JfZGlnaXRbaV0gPSBjYXJyeSAmIFB5TG9uZ19NQVNLOworICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHNpemVfYTsgKytpKSB7CisgICAgICAgIGNhcnJ5ICs9IGEtPm9iX2RpZ2l0W2ldOworICAgICAgICB6LT5vYl9kaWdpdFtpXSA9IGNhcnJ5ICYgUHlMb25nX01BU0s7CisgICAgICAgIGNhcnJ5ID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgfQorICAgIHotPm9iX2RpZ2l0W2ldID0gY2Fycnk7CisgICAgcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOwogfQogCiAvKiBTdWJ0cmFjdCB0aGUgYWJzb2x1dGUgdmFsdWVzIG9mIHR3byBpbnRlZ2Vycy4gKi8KQEAgLTIwMzksMTA3ICsyMDM5LDEwNyBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiB4X3N1YihQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYikKIHsKLQlQeV9zc2l6ZV90IHNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKSwgc2l6ZV9iID0gQUJTKFB5X1NJWkUoYikpOwotCVB5TG9uZ09iamVjdCAqejsKLQlQeV9zc2l6ZV90IGk7Ci0JaW50IHNpZ24gPSAxOwotCWRpZ2l0IGJvcnJvdyA9IDA7CisgICAgUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSksIHNpemVfYiA9IEFCUyhQeV9TSVpFKGIpKTsKKyAgICBQeUxvbmdPYmplY3QgKno7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBzaWduID0gMTsKKyAgICBkaWdpdCBib3Jyb3cgPSAwOwogCi0JLyogRW5zdXJlIGEgaXMgdGhlIGxhcmdlciBvZiB0aGUgdHdvOiAqLwotCWlmIChzaXplX2EgPCBzaXplX2IpIHsKLQkJc2lnbiA9IC0xOwotCQl7IFB5TG9uZ09iamVjdCAqdGVtcCA9IGE7IGEgPSBiOyBiID0gdGVtcDsgfQotCQl7IFB5X3NzaXplX3Qgc2l6ZV90ZW1wID0gc2l6ZV9hOwotCQkgIHNpemVfYSA9IHNpemVfYjsKLQkJICBzaXplX2IgPSBzaXplX3RlbXA7IH0KLQl9Ci0JZWxzZSBpZiAoc2l6ZV9hID09IHNpemVfYikgewotCQkvKiBGaW5kIGhpZ2hlc3QgZGlnaXQgd2hlcmUgYSBhbmQgYiBkaWZmZXI6ICovCi0JCWkgPSBzaXplX2E7Ci0JCXdoaWxlICgtLWkgPj0gMCAmJiBhLT5vYl9kaWdpdFtpXSA9PSBiLT5vYl9kaWdpdFtpXSkKLQkJCTsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuIF9QeUxvbmdfTmV3KDApOwotCQlpZiAoYS0+b2JfZGlnaXRbaV0gPCBiLT5vYl9kaWdpdFtpXSkgewotCQkJc2lnbiA9IC0xOwotCQkJeyBQeUxvbmdPYmplY3QgKnRlbXAgPSBhOyBhID0gYjsgYiA9IHRlbXA7IH0KLQkJfQotCQlzaXplX2EgPSBzaXplX2IgPSBpKzE7Ci0JfQotCXogPSBfUHlMb25nX05ldyhzaXplX2EpOwotCWlmICh6ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBzaXplX2I7ICsraSkgewotCQkvKiBUaGUgZm9sbG93aW5nIGFzc3VtZXMgdW5zaWduZWQgYXJpdGhtZXRpYwotCQkgICB3b3JrcyBtb2R1bGUgMioqTiBmb3Igc29tZSBOPlB5TG9uZ19TSElGVC4gKi8KLQkJYm9ycm93ID0gYS0+b2JfZGlnaXRbaV0gLSBiLT5vYl9kaWdpdFtpXSAtIGJvcnJvdzsKLQkJei0+b2JfZGlnaXRbaV0gPSBib3Jyb3cgJiBQeUxvbmdfTUFTSzsKLQkJYm9ycm93ID4+PSBQeUxvbmdfU0hJRlQ7Ci0JCWJvcnJvdyAmPSAxOyAvKiBLZWVwIG9ubHkgb25lIHNpZ24gYml0ICovCi0JfQotCWZvciAoOyBpIDwgc2l6ZV9hOyArK2kpIHsKLQkJYm9ycm93ID0gYS0+b2JfZGlnaXRbaV0gLSBib3Jyb3c7Ci0JCXotPm9iX2RpZ2l0W2ldID0gYm9ycm93ICYgUHlMb25nX01BU0s7Ci0JCWJvcnJvdyA+Pj0gUHlMb25nX1NISUZUOwotCQlib3Jyb3cgJj0gMTsgLyogS2VlcCBvbmx5IG9uZSBzaWduIGJpdCAqLwotCX0KLQlhc3NlcnQoYm9ycm93ID09IDApOwotCWlmIChzaWduIDwgMCkKLQkJei0+b2Jfc2l6ZSA9IC0oei0+b2Jfc2l6ZSk7Ci0JcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOworICAgIC8qIEVuc3VyZSBhIGlzIHRoZSBsYXJnZXIgb2YgdGhlIHR3bzogKi8KKyAgICBpZiAoc2l6ZV9hIDwgc2l6ZV9iKSB7CisgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgeyBQeUxvbmdPYmplY3QgKnRlbXAgPSBhOyBhID0gYjsgYiA9IHRlbXA7IH0KKyAgICAgICAgeyBQeV9zc2l6ZV90IHNpemVfdGVtcCA9IHNpemVfYTsKKyAgICAgICAgICBzaXplX2EgPSBzaXplX2I7CisgICAgICAgICAgc2l6ZV9iID0gc2l6ZV90ZW1wOyB9CisgICAgfQorICAgIGVsc2UgaWYgKHNpemVfYSA9PSBzaXplX2IpIHsKKyAgICAgICAgLyogRmluZCBoaWdoZXN0IGRpZ2l0IHdoZXJlIGEgYW5kIGIgZGlmZmVyOiAqLworICAgICAgICBpID0gc2l6ZV9hOworICAgICAgICB3aGlsZSAoLS1pID49IDAgJiYgYS0+b2JfZGlnaXRbaV0gPT0gYi0+b2JfZGlnaXRbaV0pCisgICAgICAgICAgICA7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBfUHlMb25nX05ldygwKTsKKyAgICAgICAgaWYgKGEtPm9iX2RpZ2l0W2ldIDwgYi0+b2JfZGlnaXRbaV0pIHsKKyAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICAgIHsgUHlMb25nT2JqZWN0ICp0ZW1wID0gYTsgYSA9IGI7IGIgPSB0ZW1wOyB9CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV9hID0gc2l6ZV9iID0gaSsxOworICAgIH0KKyAgICB6ID0gX1B5TG9uZ19OZXcoc2l6ZV9hKTsKKyAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9iOyArK2kpIHsKKyAgICAgICAgLyogVGhlIGZvbGxvd2luZyBhc3N1bWVzIHVuc2lnbmVkIGFyaXRobWV0aWMKKyAgICAgICAgICAgd29ya3MgbW9kdWxlIDIqKk4gZm9yIHNvbWUgTj5QeUxvbmdfU0hJRlQuICovCisgICAgICAgIGJvcnJvdyA9IGEtPm9iX2RpZ2l0W2ldIC0gYi0+b2JfZGlnaXRbaV0gLSBib3Jyb3c7CisgICAgICAgIHotPm9iX2RpZ2l0W2ldID0gYm9ycm93ICYgUHlMb25nX01BU0s7CisgICAgICAgIGJvcnJvdyA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICBib3Jyb3cgJj0gMTsgLyogS2VlcCBvbmx5IG9uZSBzaWduIGJpdCAqLworICAgIH0KKyAgICBmb3IgKDsgaSA8IHNpemVfYTsgKytpKSB7CisgICAgICAgIGJvcnJvdyA9IGEtPm9iX2RpZ2l0W2ldIC0gYm9ycm93OworICAgICAgICB6LT5vYl9kaWdpdFtpXSA9IGJvcnJvdyAmIFB5TG9uZ19NQVNLOworICAgICAgICBib3Jyb3cgPj49IFB5TG9uZ19TSElGVDsKKyAgICAgICAgYm9ycm93ICY9IDE7IC8qIEtlZXAgb25seSBvbmUgc2lnbiBiaXQgKi8KKyAgICB9CisgICAgYXNzZXJ0KGJvcnJvdyA9PSAwKTsKKyAgICBpZiAoc2lnbiA8IDApCisgICAgICAgIHotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOworICAgIHJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfYWRkKFB5TG9uZ09iamVjdCAqdiwgUHlMb25nT2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmIsICp6OworICAgIFB5TG9uZ09iamVjdCAqYSwgKmIsICp6OwogCi0JQ09OVkVSVF9CSU5PUCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAmYSwgJmIpOworICAgIENPTlZFUlRfQklOT1AoKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgJmEsICZiKTsKIAotCWlmIChhLT5vYl9zaXplIDwgMCkgewotCQlpZiAoYi0+b2Jfc2l6ZSA8IDApIHsKLQkJCXogPSB4X2FkZChhLCBiKTsKLQkJCWlmICh6ICE9IE5VTEwgJiYgei0+b2Jfc2l6ZSAhPSAwKQotCQkJCXotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOwotCQl9Ci0JCWVsc2UKLQkJCXogPSB4X3N1YihiLCBhKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChiLT5vYl9zaXplIDwgMCkKLQkJCXogPSB4X3N1YihhLCBiKTsKLQkJZWxzZQotCQkJeiA9IHhfYWRkKGEsIGIpOwotCX0KLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiAoUHlPYmplY3QgKil6OworICAgIGlmIChhLT5vYl9zaXplIDwgMCkgeworICAgICAgICBpZiAoYi0+b2Jfc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIHogPSB4X2FkZChhLCBiKTsKKyAgICAgICAgICAgIGlmICh6ICE9IE5VTEwgJiYgei0+b2Jfc2l6ZSAhPSAwKQorICAgICAgICAgICAgICAgIHotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHogPSB4X3N1YihiLCBhKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChiLT5vYl9zaXplIDwgMCkKKyAgICAgICAgICAgIHogPSB4X3N1YihhLCBiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeiA9IHhfYWRkKGEsIGIpOworICAgIH0KKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiAoUHlPYmplY3QgKil6OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19zdWIoUHlMb25nT2JqZWN0ICp2LCBQeUxvbmdPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYiwgKno7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYiwgKno7CiAKLQlDT05WRVJUX0JJTk9QKChQeU9iamVjdCAqKXYsIChQeU9iamVjdCAqKXcsICZhLCAmYik7CisgICAgQ09OVkVSVF9CSU5PUCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAmYSwgJmIpOwogCi0JaWYgKGEtPm9iX3NpemUgPCAwKSB7Ci0JCWlmIChiLT5vYl9zaXplIDwgMCkKLQkJCXogPSB4X3N1YihhLCBiKTsKLQkJZWxzZQotCQkJeiA9IHhfYWRkKGEsIGIpOwotCQlpZiAoeiAhPSBOVUxMICYmIHotPm9iX3NpemUgIT0gMCkKLQkJCXotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOwotCX0KLQllbHNlIHsKLQkJaWYgKGItPm9iX3NpemUgPCAwKQotCQkJeiA9IHhfYWRkKGEsIGIpOwotCQllbHNlCi0JCQl6ID0geF9zdWIoYSwgYik7Ci0JfQotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXo7CisgICAgaWYgKGEtPm9iX3NpemUgPCAwKSB7CisgICAgICAgIGlmIChiLT5vYl9zaXplIDwgMCkKKyAgICAgICAgICAgIHogPSB4X3N1YihhLCBiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeiA9IHhfYWRkKGEsIGIpOworICAgICAgICBpZiAoeiAhPSBOVUxMICYmIHotPm9iX3NpemUgIT0gMCkKKyAgICAgICAgICAgIHotPm9iX3NpemUgPSAtKHotPm9iX3NpemUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGItPm9iX3NpemUgPCAwKQorICAgICAgICAgICAgeiA9IHhfYWRkKGEsIGIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6ID0geF9zdWIoYSwgYik7CisgICAgfQorICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXo7CiB9CiAKIC8qIEdyYWRlIHNjaG9vbCBtdWx0aXBsaWNhdGlvbiwgaWdub3JpbmcgdGhlIHNpZ25zLgpAQCAtMjE0OCw4NSArMjE0OCw4NSBAQAogc3RhdGljIFB5TG9uZ09iamVjdCAqCiB4X211bChQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYikKIHsKLQlQeUxvbmdPYmplY3QgKno7Ci0JUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoUHlfU0laRShhKSk7Ci0JUHlfc3NpemVfdCBzaXplX2IgPSBBQlMoUHlfU0laRShiKSk7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5TG9uZ09iamVjdCAqejsKKyAgICBQeV9zc2l6ZV90IHNpemVfYSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBQeV9zc2l6ZV90IHNpemVfYiA9IEFCUyhQeV9TSVpFKGIpKTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLSAgICAgCXogPSBfUHlMb25nX05ldyhzaXplX2EgKyBzaXplX2IpOwotCWlmICh6ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHogPSBfUHlMb25nX05ldyhzaXplX2EgKyBzaXplX2IpOworICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbWVtc2V0KHotPm9iX2RpZ2l0LCAwLCBQeV9TSVpFKHopICogc2l6ZW9mKGRpZ2l0KSk7Ci0JaWYgKGEgPT0gYikgewotCQkvKiBFZmZpY2llbnQgc3F1YXJpbmcgcGVyIEhBQywgQWxnb3JpdGhtIDE0LjE2OgotCQkgKiBodHRwOi8vd3d3LmNhY3IubWF0aC51d2F0ZXJsb28uY2EvaGFjL2Fib3V0L2NoYXAxNC5wZGYKLQkJICogR2l2ZXMgc2xpZ2h0bHkgbGVzcyB0aGFuIGEgMnggc3BlZWR1cCB3aGVuIGEgPT0gYiwKLQkJICogdmlhIGV4cGxvaXRpbmcgdGhhdCBlYWNoIGVudHJ5IGluIHRoZSBtdWx0aXBsaWNhdGlvbgotCQkgKiBweXJhbWlkIGFwcGVhcnMgdHdpY2UgKGV4Y2VwdCBmb3IgdGhlIHNpemVfYSBzcXVhcmVzKS4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgewotCQkJdHdvZGlnaXRzIGNhcnJ5OwotCQkJdHdvZGlnaXRzIGYgPSBhLT5vYl9kaWdpdFtpXTsKLQkJCWRpZ2l0ICpweiA9IHotPm9iX2RpZ2l0ICsgKGkgPDwgMSk7Ci0JCQlkaWdpdCAqcGEgPSBhLT5vYl9kaWdpdCArIGkgKyAxOwotCQkJZGlnaXQgKnBhZW5kID0gYS0+b2JfZGlnaXQgKyBzaXplX2E7CisgICAgbWVtc2V0KHotPm9iX2RpZ2l0LCAwLCBQeV9TSVpFKHopICogc2l6ZW9mKGRpZ2l0KSk7CisgICAgaWYgKGEgPT0gYikgeworICAgICAgICAvKiBFZmZpY2llbnQgc3F1YXJpbmcgcGVyIEhBQywgQWxnb3JpdGhtIDE0LjE2OgorICAgICAgICAgKiBodHRwOi8vd3d3LmNhY3IubWF0aC51d2F0ZXJsb28uY2EvaGFjL2Fib3V0L2NoYXAxNC5wZGYKKyAgICAgICAgICogR2l2ZXMgc2xpZ2h0bHkgbGVzcyB0aGFuIGEgMnggc3BlZWR1cCB3aGVuIGEgPT0gYiwKKyAgICAgICAgICogdmlhIGV4cGxvaXRpbmcgdGhhdCBlYWNoIGVudHJ5IGluIHRoZSBtdWx0aXBsaWNhdGlvbgorICAgICAgICAgKiBweXJhbWlkIGFwcGVhcnMgdHdpY2UgKGV4Y2VwdCBmb3IgdGhlIHNpemVfYSBzcXVhcmVzKS4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgeworICAgICAgICAgICAgdHdvZGlnaXRzIGNhcnJ5OworICAgICAgICAgICAgdHdvZGlnaXRzIGYgPSBhLT5vYl9kaWdpdFtpXTsKKyAgICAgICAgICAgIGRpZ2l0ICpweiA9IHotPm9iX2RpZ2l0ICsgKGkgPDwgMSk7CisgICAgICAgICAgICBkaWdpdCAqcGEgPSBhLT5vYl9kaWdpdCArIGkgKyAxOworICAgICAgICAgICAgZGlnaXQgKnBhZW5kID0gYS0+b2JfZGlnaXQgKyBzaXplX2E7CiAKLQkJCVNJR0NIRUNLKHsKLQkJCQlQeV9ERUNSRUYoeik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9KQorICAgICAgICAgICAgU0lHQ0hFQ0soeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih6KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0pCiAKLQkJCWNhcnJ5ID0gKnB6ICsgZiAqIGY7Ci0JCQkqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7Ci0JCQljYXJyeSA+Pj0gUHlMb25nX1NISUZUOwotCQkJYXNzZXJ0KGNhcnJ5IDw9IFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgIGNhcnJ5ID0gKnB6ICsgZiAqIGY7CisgICAgICAgICAgICAqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgYXNzZXJ0KGNhcnJ5IDw9IFB5TG9uZ19NQVNLKTsKIAotCQkJLyogTm93IGYgaXMgYWRkZWQgaW4gdHdpY2UgaW4gZWFjaCBjb2x1bW4gb2YgdGhlCi0JCQkgKiBweXJhbWlkIGl0IGFwcGVhcnMuICBTYW1lIGFzIGFkZGluZyBmPDwxIG9uY2UuCi0JCQkgKi8KLQkJCWYgPDw9IDE7Ci0JCQl3aGlsZSAocGEgPCBwYWVuZCkgewotCQkJCWNhcnJ5ICs9ICpweiArICpwYSsrICogZjsKLQkJCQkqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7Ci0JCQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQkJCQlhc3NlcnQoY2FycnkgPD0gKFB5TG9uZ19NQVNLIDw8IDEpKTsKLQkJCX0KLQkJCWlmIChjYXJyeSkgewotCQkJCWNhcnJ5ICs9ICpwejsKLQkJCQkqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7Ci0JCQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQkJCX0KLQkJCWlmIChjYXJyeSkKLQkJCQkqcHogKz0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKLQkJCWFzc2VydCgoY2FycnkgPj4gUHlMb25nX1NISUZUKSA9PSAwKTsKLQkJfQotCX0KLQllbHNlIHsJLyogYSBpcyBub3QgdGhlIHNhbWUgYXMgYiAtLSBncmFkZXNjaG9vbCBsb25nIG11bHQgKi8KLQkJZm9yIChpID0gMDsgaSA8IHNpemVfYTsgKytpKSB7Ci0JCQl0d29kaWdpdHMgY2FycnkgPSAwOwotCQkJdHdvZGlnaXRzIGYgPSBhLT5vYl9kaWdpdFtpXTsKLQkJCWRpZ2l0ICpweiA9IHotPm9iX2RpZ2l0ICsgaTsKLQkJCWRpZ2l0ICpwYiA9IGItPm9iX2RpZ2l0OwotCQkJZGlnaXQgKnBiZW5kID0gYi0+b2JfZGlnaXQgKyBzaXplX2I7CisgICAgICAgICAgICAvKiBOb3cgZiBpcyBhZGRlZCBpbiB0d2ljZSBpbiBlYWNoIGNvbHVtbiBvZiB0aGUKKyAgICAgICAgICAgICAqIHB5cmFtaWQgaXQgYXBwZWFycy4gIFNhbWUgYXMgYWRkaW5nIGY8PDEgb25jZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZiA8PD0gMTsKKyAgICAgICAgICAgIHdoaWxlIChwYSA8IHBhZW5kKSB7CisgICAgICAgICAgICAgICAgY2FycnkgKz0gKnB6ICsgKnBhKysgKiBmOworICAgICAgICAgICAgICAgICpweisrID0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgICAgIGFzc2VydChjYXJyeSA8PSAoUHlMb25nX01BU0sgPDwgMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhcnJ5KSB7CisgICAgICAgICAgICAgICAgY2FycnkgKz0gKnB6OworICAgICAgICAgICAgICAgICpweisrID0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhcnJ5KQorICAgICAgICAgICAgICAgICpweiArPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOworICAgICAgICAgICAgYXNzZXJ0KChjYXJyeSA+PiBQeUxvbmdfU0hJRlQpID09IDApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeyAgICAgIC8qIGEgaXMgbm90IHRoZSBzYW1lIGFzIGIgLS0gZ3JhZGVzY2hvb2wgbG9uZyBtdWx0ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplX2E7ICsraSkgeworICAgICAgICAgICAgdHdvZGlnaXRzIGNhcnJ5ID0gMDsKKyAgICAgICAgICAgIHR3b2RpZ2l0cyBmID0gYS0+b2JfZGlnaXRbaV07CisgICAgICAgICAgICBkaWdpdCAqcHogPSB6LT5vYl9kaWdpdCArIGk7CisgICAgICAgICAgICBkaWdpdCAqcGIgPSBiLT5vYl9kaWdpdDsKKyAgICAgICAgICAgIGRpZ2l0ICpwYmVuZCA9IGItPm9iX2RpZ2l0ICsgc2l6ZV9iOwogCi0JCQlTSUdDSEVDSyh7Ci0JCQkJUHlfREVDUkVGKHopOwotCQkJCXJldHVybiBOVUxMOwotCQkJfSkKKyAgICAgICAgICAgIFNJR0NIRUNLKHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9KQogCi0JCQl3aGlsZSAocGIgPCBwYmVuZCkgewotCQkJCWNhcnJ5ICs9ICpweiArICpwYisrICogZjsKLQkJCQkqcHorKyA9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7Ci0JCQkJY2FycnkgPj49IFB5TG9uZ19TSElGVDsKLQkJCQlhc3NlcnQoY2FycnkgPD0gUHlMb25nX01BU0spOwotCQkJfQotCQkJaWYgKGNhcnJ5KQotCQkJCSpweiArPSAoZGlnaXQpKGNhcnJ5ICYgUHlMb25nX01BU0spOwotCQkJYXNzZXJ0KChjYXJyeSA+PiBQeUxvbmdfU0hJRlQpID09IDApOwotCQl9Ci0JfQotCXJldHVybiBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICAgICAgICAgIHdoaWxlIChwYiA8IHBiZW5kKSB7CisgICAgICAgICAgICAgICAgY2FycnkgKz0gKnB6ICsgKnBiKysgKiBmOworICAgICAgICAgICAgICAgICpweisrID0gKGRpZ2l0KShjYXJyeSAmIFB5TG9uZ19NQVNLKTsKKyAgICAgICAgICAgICAgICBjYXJyeSA+Pj0gUHlMb25nX1NISUZUOworICAgICAgICAgICAgICAgIGFzc2VydChjYXJyeSA8PSBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FycnkpCisgICAgICAgICAgICAgICAgKnB6ICs9IChkaWdpdCkoY2FycnkgJiBQeUxvbmdfTUFTSyk7CisgICAgICAgICAgICBhc3NlcnQoKGNhcnJ5ID4+IFB5TG9uZ19TSElGVCkgPT0gMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxvbmdfbm9ybWFsaXplKHopOwogfQogCiAvKiBBIGhlbHBlciBmb3IgS2FyYXRzdWJhIG11bHRpcGxpY2F0aW9uIChrX211bCkuCkBAIC0yMjM5LDI2ICsyMjM5LDI2IEBACiBzdGF0aWMgaW50CiBrbXVsX3NwbGl0KFB5TG9uZ09iamVjdCAqbiwgUHlfc3NpemVfdCBzaXplLCBQeUxvbmdPYmplY3QgKipoaWdoLCBQeUxvbmdPYmplY3QgKipsb3cpCiB7Ci0JUHlMb25nT2JqZWN0ICpoaSwgKmxvOwotCVB5X3NzaXplX3Qgc2l6ZV9sbywgc2l6ZV9oaTsKLQljb25zdCBQeV9zc2l6ZV90IHNpemVfbiA9IEFCUyhQeV9TSVpFKG4pKTsKKyAgICBQeUxvbmdPYmplY3QgKmhpLCAqbG87CisgICAgUHlfc3NpemVfdCBzaXplX2xvLCBzaXplX2hpOworICAgIGNvbnN0IFB5X3NzaXplX3Qgc2l6ZV9uID0gQUJTKFB5X1NJWkUobikpOwogCi0Jc2l6ZV9sbyA9IE1JTihzaXplX24sIHNpemUpOwotCXNpemVfaGkgPSBzaXplX24gLSBzaXplX2xvOworICAgIHNpemVfbG8gPSBNSU4oc2l6ZV9uLCBzaXplKTsKKyAgICBzaXplX2hpID0gc2l6ZV9uIC0gc2l6ZV9sbzsKIAotCWlmICgoaGkgPSBfUHlMb25nX05ldyhzaXplX2hpKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmICgobG8gPSBfUHlMb25nX05ldyhzaXplX2xvKSkgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoaGkpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICgoaGkgPSBfUHlMb25nX05ldyhzaXplX2hpKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICgobG8gPSBfUHlMb25nX05ldyhzaXplX2xvKSkgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoaGkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JbWVtY3B5KGxvLT5vYl9kaWdpdCwgbi0+b2JfZGlnaXQsIHNpemVfbG8gKiBzaXplb2YoZGlnaXQpKTsKLQltZW1jcHkoaGktPm9iX2RpZ2l0LCBuLT5vYl9kaWdpdCArIHNpemVfbG8sIHNpemVfaGkgKiBzaXplb2YoZGlnaXQpKTsKKyAgICBtZW1jcHkobG8tPm9iX2RpZ2l0LCBuLT5vYl9kaWdpdCwgc2l6ZV9sbyAqIHNpemVvZihkaWdpdCkpOworICAgIG1lbWNweShoaS0+b2JfZGlnaXQsIG4tPm9iX2RpZ2l0ICsgc2l6ZV9sbywgc2l6ZV9oaSAqIHNpemVvZihkaWdpdCkpOwogCi0JKmhpZ2ggPSBsb25nX25vcm1hbGl6ZShoaSk7Ci0JKmxvdyA9IGxvbmdfbm9ybWFsaXplKGxvKTsKLQlyZXR1cm4gMDsKKyAgICAqaGlnaCA9IGxvbmdfbm9ybWFsaXplKGhpKTsKKyAgICAqbG93ID0gbG9uZ19ub3JtYWxpemUobG8pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlMb25nT2JqZWN0ICprX2xvcHNpZGVkX211bChQeUxvbmdPYmplY3QgKmEsIFB5TG9uZ09iamVjdCAqYik7CkBAIC0yMjcwLDE2OSArMjI3MCwxNjkgQEAKIHN0YXRpYyBQeUxvbmdPYmplY3QgKgoga19tdWwoUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIpCiB7Ci0JUHlfc3NpemVfdCBhc2l6ZSA9IEFCUyhQeV9TSVpFKGEpKTsKLQlQeV9zc2l6ZV90IGJzaXplID0gQUJTKFB5X1NJWkUoYikpOwotCVB5TG9uZ09iamVjdCAqYWggPSBOVUxMOwotCVB5TG9uZ09iamVjdCAqYWwgPSBOVUxMOwotCVB5TG9uZ09iamVjdCAqYmggPSBOVUxMOwotCVB5TG9uZ09iamVjdCAqYmwgPSBOVUxMOwotCVB5TG9uZ09iamVjdCAqcmV0ID0gTlVMTDsKLQlQeUxvbmdPYmplY3QgKnQxLCAqdDIsICp0MzsKLQlQeV9zc2l6ZV90IHNoaWZ0OwkvKiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB3ZSBzcGxpdCBvZmYgKi8KLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBhc2l6ZSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBQeV9zc2l6ZV90IGJzaXplID0gQUJTKFB5X1NJWkUoYikpOworICAgIFB5TG9uZ09iamVjdCAqYWggPSBOVUxMOworICAgIFB5TG9uZ09iamVjdCAqYWwgPSBOVUxMOworICAgIFB5TG9uZ09iamVjdCAqYmggPSBOVUxMOworICAgIFB5TG9uZ09iamVjdCAqYmwgPSBOVUxMOworICAgIFB5TG9uZ09iamVjdCAqcmV0ID0gTlVMTDsKKyAgICBQeUxvbmdPYmplY3QgKnQxLCAqdDIsICp0MzsKKyAgICBQeV9zc2l6ZV90IHNoaWZ0OyAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBkaWdpdHMgd2Ugc3BsaXQgb2ZmICovCisgICAgUHlfc3NpemVfdCBpOwogCi0JLyogKGFoKlgrYWwpKGJoKlgrYmwpID0gYWgqYmgqWCpYICsgKGFoKmJsICsgYWwqYmgpKlggKyBhbCpibAotCSAqIExldCBrID0gKGFoK2FsKSooYmgrYmwpID0gYWgqYmwgKyBhbCpiaCAgKyBhaCpiaCArIGFsKmJsCi0JICogVGhlbiB0aGUgb3JpZ2luYWwgcHJvZHVjdCBpcwotCSAqICAgICBhaCpiaCpYKlggKyAoayAtIGFoKmJoIC0gYWwqYmwpKlggKyBhbCpibAotCSAqIEJ5IHBpY2tpbmcgWCB0byBiZSBhIHBvd2VyIG9mIDIsICIqWCIgaXMganVzdCBzaGlmdGluZywgYW5kIGl0J3MKLQkgKiBiZWVuIHJlZHVjZWQgdG8gMyBtdWx0aXBsaWVzIG9uIG51bWJlcnMgaGFsZiB0aGUgc2l6ZS4KLQkgKi8KKyAgICAvKiAoYWgqWCthbCkoYmgqWCtibCkgPSBhaCpiaCpYKlggKyAoYWgqYmwgKyBhbCpiaCkqWCArIGFsKmJsCisgICAgICogTGV0IGsgPSAoYWgrYWwpKihiaCtibCkgPSBhaCpibCArIGFsKmJoICArIGFoKmJoICsgYWwqYmwKKyAgICAgKiBUaGVuIHRoZSBvcmlnaW5hbCBwcm9kdWN0IGlzCisgICAgICogICAgIGFoKmJoKlgqWCArIChrIC0gYWgqYmggLSBhbCpibCkqWCArIGFsKmJsCisgICAgICogQnkgcGlja2luZyBYIHRvIGJlIGEgcG93ZXIgb2YgMiwgIipYIiBpcyBqdXN0IHNoaWZ0aW5nLCBhbmQgaXQncworICAgICAqIGJlZW4gcmVkdWNlZCB0byAzIG11bHRpcGxpZXMgb24gbnVtYmVycyBoYWxmIHRoZSBzaXplLgorICAgICAqLwogCi0JLyogV2Ugd2FudCB0byBzcGxpdCBiYXNlZCBvbiB0aGUgbGFyZ2VyIG51bWJlcjsgZmlkZGxlIHNvIHRoYXQgYgotCSAqIGlzIGxhcmdlc3QuCi0JICovCi0JaWYgKGFzaXplID4gYnNpemUpIHsKLQkJdDEgPSBhOwotCQlhID0gYjsKLQkJYiA9IHQxOworICAgIC8qIFdlIHdhbnQgdG8gc3BsaXQgYmFzZWQgb24gdGhlIGxhcmdlciBudW1iZXI7IGZpZGRsZSBzbyB0aGF0IGIKKyAgICAgKiBpcyBsYXJnZXN0LgorICAgICAqLworICAgIGlmIChhc2l6ZSA+IGJzaXplKSB7CisgICAgICAgIHQxID0gYTsKKyAgICAgICAgYSA9IGI7CisgICAgICAgIGIgPSB0MTsKIAotCQlpID0gYXNpemU7Ci0JCWFzaXplID0gYnNpemU7Ci0JCWJzaXplID0gaTsKLQl9CisgICAgICAgIGkgPSBhc2l6ZTsKKyAgICAgICAgYXNpemUgPSBic2l6ZTsKKyAgICAgICAgYnNpemUgPSBpOworICAgIH0KIAotCS8qIFVzZSBncmFkZXNjaG9vbCBtYXRoIHdoZW4gZWl0aGVyIG51bWJlciBpcyB0b28gc21hbGwuICovCi0JaSA9IGEgPT0gYiA/IEtBUkFUU1VCQV9TUVVBUkVfQ1VUT0ZGIDogS0FSQVRTVUJBX0NVVE9GRjsKLQlpZiAoYXNpemUgPD0gaSkgewotCQlpZiAoYXNpemUgPT0gMCkKLQkJCXJldHVybiBfUHlMb25nX05ldygwKTsKLQkJZWxzZQotCQkJcmV0dXJuIHhfbXVsKGEsIGIpOwotCX0KKyAgICAvKiBVc2UgZ3JhZGVzY2hvb2wgbWF0aCB3aGVuIGVpdGhlciBudW1iZXIgaXMgdG9vIHNtYWxsLiAqLworICAgIGkgPSBhID09IGIgPyBLQVJBVFNVQkFfU1FVQVJFX0NVVE9GRiA6IEtBUkFUU1VCQV9DVVRPRkY7CisgICAgaWYgKGFzaXplIDw9IGkpIHsKKyAgICAgICAgaWYgKGFzaXplID09IDApCisgICAgICAgICAgICByZXR1cm4gX1B5TG9uZ19OZXcoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB4X211bChhLCBiKTsKKyAgICB9CiAKLQkvKiBJZiBhIGlzIHNtYWxsIGNvbXBhcmVkIHRvIGIsIHNwbGl0dGluZyBvbiBiIGdpdmVzIGEgZGVnZW5lcmF0ZQotCSAqIGNhc2Ugd2l0aCBhaD09MCwgYW5kIEthcmF0c3ViYSBtYXkgYmUgKGV2ZW4gbXVjaCkgbGVzcyBlZmZpY2llbnQKLQkgKiB0aGFuICJncmFkZSBzY2hvb2wiIHRoZW4uICBIb3dldmVyLCB3ZSBjYW4gc3RpbGwgd2luLCBieSB2aWV3aW5nCi0JICogYiBhcyBhIHN0cmluZyBvZiAiYmlnIGRpZ2l0cyIsIGVhY2ggb2Ygd2lkdGggYS0+b2Jfc2l6ZS4gIFRoYXQKLQkgKiBsZWFkcyB0byBhIHNlcXVlbmNlIG9mIGJhbGFuY2VkIGNhbGxzIHRvIGtfbXVsLgotCSAqLwotCWlmICgyICogYXNpemUgPD0gYnNpemUpCi0JCXJldHVybiBrX2xvcHNpZGVkX211bChhLCBiKTsKKyAgICAvKiBJZiBhIGlzIHNtYWxsIGNvbXBhcmVkIHRvIGIsIHNwbGl0dGluZyBvbiBiIGdpdmVzIGEgZGVnZW5lcmF0ZQorICAgICAqIGNhc2Ugd2l0aCBhaD09MCwgYW5kIEthcmF0c3ViYSBtYXkgYmUgKGV2ZW4gbXVjaCkgbGVzcyBlZmZpY2llbnQKKyAgICAgKiB0aGFuICJncmFkZSBzY2hvb2wiIHRoZW4uICBIb3dldmVyLCB3ZSBjYW4gc3RpbGwgd2luLCBieSB2aWV3aW5nCisgICAgICogYiBhcyBhIHN0cmluZyBvZiAiYmlnIGRpZ2l0cyIsIGVhY2ggb2Ygd2lkdGggYS0+b2Jfc2l6ZS4gIFRoYXQKKyAgICAgKiBsZWFkcyB0byBhIHNlcXVlbmNlIG9mIGJhbGFuY2VkIGNhbGxzIHRvIGtfbXVsLgorICAgICAqLworICAgIGlmICgyICogYXNpemUgPD0gYnNpemUpCisgICAgICAgIHJldHVybiBrX2xvcHNpZGVkX211bChhLCBiKTsKIAotCS8qIFNwbGl0IGEgJiBiIGludG8gaGkgJiBsbyBwaWVjZXMuICovCi0Jc2hpZnQgPSBic2l6ZSA+PiAxOwotCWlmIChrbXVsX3NwbGl0KGEsIHNoaWZ0LCAmYWgsICZhbCkgPCAwKSBnb3RvIGZhaWw7Ci0JYXNzZXJ0KFB5X1NJWkUoYWgpID4gMCk7CS8qIHRoZSBzcGxpdCBpc24ndCBkZWdlbmVyYXRlICovCisgICAgLyogU3BsaXQgYSAmIGIgaW50byBoaSAmIGxvIHBpZWNlcy4gKi8KKyAgICBzaGlmdCA9IGJzaXplID4+IDE7CisgICAgaWYgKGttdWxfc3BsaXQoYSwgc2hpZnQsICZhaCwgJmFsKSA8IDApIGdvdG8gZmFpbDsKKyAgICBhc3NlcnQoUHlfU0laRShhaCkgPiAwKTsgICAgICAgICAgICAvKiB0aGUgc3BsaXQgaXNuJ3QgZGVnZW5lcmF0ZSAqLwogCi0JaWYgKGEgPT0gYikgewotCQliaCA9IGFoOwotCQlibCA9IGFsOwotCQlQeV9JTkNSRUYoYmgpOwotCQlQeV9JTkNSRUYoYmwpOwotCX0KLQllbHNlIGlmIChrbXVsX3NwbGl0KGIsIHNoaWZ0LCAmYmgsICZibCkgPCAwKSBnb3RvIGZhaWw7CisgICAgaWYgKGEgPT0gYikgeworICAgICAgICBiaCA9IGFoOworICAgICAgICBibCA9IGFsOworICAgICAgICBQeV9JTkNSRUYoYmgpOworICAgICAgICBQeV9JTkNSRUYoYmwpOworICAgIH0KKyAgICBlbHNlIGlmIChrbXVsX3NwbGl0KGIsIHNoaWZ0LCAmYmgsICZibCkgPCAwKSBnb3RvIGZhaWw7CiAKLQkvKiBUaGUgcGxhbjoKLQkgKiAxLiBBbGxvY2F0ZSByZXN1bHQgc3BhY2UgKGFzaXplICsgYnNpemUgZGlnaXRzOiAgdGhhdCdzIGFsd2F5cwotCSAqICAgIGVub3VnaCkuCi0JICogMi4gQ29tcHV0ZSBhaCpiaCwgYW5kIGNvcHkgaW50byByZXN1bHQgYXQgMipzaGlmdC4KLQkgKiAzLiBDb21wdXRlIGFsKmJsLCBhbmQgY29weSBpbnRvIHJlc3VsdCBhdCAwLiAgTm90ZSB0aGF0IHRoaXMKLQkgKiAgICBjYW4ndCBvdmVybGFwIHdpdGggIzIuCi0JICogNC4gU3VidHJhY3QgYWwqYmwgZnJvbSB0aGUgcmVzdWx0LCBzdGFydGluZyBhdCBzaGlmdC4gIFRoaXMgbWF5Ci0JICogICAgdW5kZXJmbG93IChib3Jyb3cgb3V0IG9mIHRoZSBoaWdoIGRpZ2l0KSwgYnV0IHdlIGRvbid0IGNhcmU6Ci0JICogICAgd2UncmUgZWZmZWN0aXZlbHkgZG9pbmcgdW5zaWduZWQgYXJpdGhtZXRpYyBtb2QKLQkgKiAgICBQeUxvbmdfQkFTRSoqKHNpemVhICsgc2l6ZWIpLCBhbmQgc28gbG9uZyBhcyB0aGUgKmZpbmFsKiByZXN1bHQgZml0cywKLQkgKiAgICBib3Jyb3dzIGFuZCBjYXJyaWVzIG91dCBvZiB0aGUgaGlnaCBkaWdpdCBjYW4gYmUgaWdub3JlZC4KLQkgKiA1LiBTdWJ0cmFjdCBhaCpiaCBmcm9tIHRoZSByZXN1bHQsIHN0YXJ0aW5nIGF0IHNoaWZ0LgotCSAqIDYuIENvbXB1dGUgKGFoK2FsKSooYmgrYmwpLCBhbmQgYWRkIGl0IGludG8gdGhlIHJlc3VsdCBzdGFydGluZwotCSAqICAgIGF0IHNoaWZ0LgotCSAqLworICAgIC8qIFRoZSBwbGFuOgorICAgICAqIDEuIEFsbG9jYXRlIHJlc3VsdCBzcGFjZSAoYXNpemUgKyBic2l6ZSBkaWdpdHM6ICB0aGF0J3MgYWx3YXlzCisgICAgICogICAgZW5vdWdoKS4KKyAgICAgKiAyLiBDb21wdXRlIGFoKmJoLCBhbmQgY29weSBpbnRvIHJlc3VsdCBhdCAyKnNoaWZ0LgorICAgICAqIDMuIENvbXB1dGUgYWwqYmwsIGFuZCBjb3B5IGludG8gcmVzdWx0IGF0IDAuICBOb3RlIHRoYXQgdGhpcworICAgICAqICAgIGNhbid0IG92ZXJsYXAgd2l0aCAjMi4KKyAgICAgKiA0LiBTdWJ0cmFjdCBhbCpibCBmcm9tIHRoZSByZXN1bHQsIHN0YXJ0aW5nIGF0IHNoaWZ0LiAgVGhpcyBtYXkKKyAgICAgKiAgICB1bmRlcmZsb3cgKGJvcnJvdyBvdXQgb2YgdGhlIGhpZ2ggZGlnaXQpLCBidXQgd2UgZG9uJ3QgY2FyZToKKyAgICAgKiAgICB3ZSdyZSBlZmZlY3RpdmVseSBkb2luZyB1bnNpZ25lZCBhcml0aG1ldGljIG1vZAorICAgICAqICAgIFB5TG9uZ19CQVNFKiooc2l6ZWEgKyBzaXplYiksIGFuZCBzbyBsb25nIGFzIHRoZSAqZmluYWwqIHJlc3VsdCBmaXRzLAorICAgICAqICAgIGJvcnJvd3MgYW5kIGNhcnJpZXMgb3V0IG9mIHRoZSBoaWdoIGRpZ2l0IGNhbiBiZSBpZ25vcmVkLgorICAgICAqIDUuIFN1YnRyYWN0IGFoKmJoIGZyb20gdGhlIHJlc3VsdCwgc3RhcnRpbmcgYXQgc2hpZnQuCisgICAgICogNi4gQ29tcHV0ZSAoYWgrYWwpKihiaCtibCksIGFuZCBhZGQgaXQgaW50byB0aGUgcmVzdWx0IHN0YXJ0aW5nCisgICAgICogICAgYXQgc2hpZnQuCisgICAgICovCiAKLQkvKiAxLiBBbGxvY2F0ZSByZXN1bHQgc3BhY2UuICovCi0JcmV0ID0gX1B5TG9uZ19OZXcoYXNpemUgKyBic2l6ZSk7Ci0JaWYgKHJldCA9PSBOVUxMKSBnb3RvIGZhaWw7CisgICAgLyogMS4gQWxsb2NhdGUgcmVzdWx0IHNwYWNlLiAqLworICAgIHJldCA9IF9QeUxvbmdfTmV3KGFzaXplICsgYnNpemUpOworICAgIGlmIChyZXQgPT0gTlVMTCkgZ290byBmYWlsOwogI2lmZGVmIFB5X0RFQlVHCi0JLyogRmlsbCB3aXRoIHRyYXNoLCB0byBjYXRjaCByZWZlcmVuY2UgdG8gdW5pbml0aWFsaXplZCBkaWdpdHMuICovCi0JbWVtc2V0KHJldC0+b2JfZGlnaXQsIDB4REYsIFB5X1NJWkUocmV0KSAqIHNpemVvZihkaWdpdCkpOworICAgIC8qIEZpbGwgd2l0aCB0cmFzaCwgdG8gY2F0Y2ggcmVmZXJlbmNlIHRvIHVuaW5pdGlhbGl6ZWQgZGlnaXRzLiAqLworICAgIG1lbXNldChyZXQtPm9iX2RpZ2l0LCAweERGLCBQeV9TSVpFKHJldCkgKiBzaXplb2YoZGlnaXQpKTsKICNlbmRpZgogCi0JLyogMi4gdDEgPC0gYWgqYmgsIGFuZCBjb3B5IGludG8gaGlnaCBkaWdpdHMgb2YgcmVzdWx0LiAqLwotCWlmICgodDEgPSBrX211bChhaCwgYmgpKSA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JYXNzZXJ0KFB5X1NJWkUodDEpID49IDApOwotCWFzc2VydCgyKnNoaWZ0ICsgUHlfU0laRSh0MSkgPD0gUHlfU0laRShyZXQpKTsKLQltZW1jcHkocmV0LT5vYl9kaWdpdCArIDIqc2hpZnQsIHQxLT5vYl9kaWdpdCwKLQkgICAgICAgUHlfU0laRSh0MSkgKiBzaXplb2YoZGlnaXQpKTsKKyAgICAvKiAyLiB0MSA8LSBhaCpiaCwgYW5kIGNvcHkgaW50byBoaWdoIGRpZ2l0cyBvZiByZXN1bHQuICovCisgICAgaWYgKCh0MSA9IGtfbXVsKGFoLCBiaCkpID09IE5VTEwpIGdvdG8gZmFpbDsKKyAgICBhc3NlcnQoUHlfU0laRSh0MSkgPj0gMCk7CisgICAgYXNzZXJ0KDIqc2hpZnQgKyBQeV9TSVpFKHQxKSA8PSBQeV9TSVpFKHJldCkpOworICAgIG1lbWNweShyZXQtPm9iX2RpZ2l0ICsgMipzaGlmdCwgdDEtPm9iX2RpZ2l0LAorICAgICAgICAgICBQeV9TSVpFKHQxKSAqIHNpemVvZihkaWdpdCkpOwogCi0JLyogWmVyby1vdXQgdGhlIGRpZ2l0cyBoaWdoZXIgdGhhbiB0aGUgYWgqYmggY29weS4gKi8KLQlpID0gUHlfU0laRShyZXQpIC0gMipzaGlmdCAtIFB5X1NJWkUodDEpOwotCWlmIChpKQotCQltZW1zZXQocmV0LT5vYl9kaWdpdCArIDIqc2hpZnQgKyBQeV9TSVpFKHQxKSwgMCwKLQkJICAgICAgIGkgKiBzaXplb2YoZGlnaXQpKTsKKyAgICAvKiBaZXJvLW91dCB0aGUgZGlnaXRzIGhpZ2hlciB0aGFuIHRoZSBhaCpiaCBjb3B5LiAqLworICAgIGkgPSBQeV9TSVpFKHJldCkgLSAyKnNoaWZ0IC0gUHlfU0laRSh0MSk7CisgICAgaWYgKGkpCisgICAgICAgIG1lbXNldChyZXQtPm9iX2RpZ2l0ICsgMipzaGlmdCArIFB5X1NJWkUodDEpLCAwLAorICAgICAgICAgICAgICAgaSAqIHNpemVvZihkaWdpdCkpOwogCi0JLyogMy4gdDIgPC0gYWwqYmwsIGFuZCBjb3B5IGludG8gdGhlIGxvdyBkaWdpdHMuICovCi0JaWYgKCh0MiA9IGtfbXVsKGFsLCBibCkpID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHQxKTsKLQkJZ290byBmYWlsOwotCX0KLQlhc3NlcnQoUHlfU0laRSh0MikgPj0gMCk7Ci0JYXNzZXJ0KFB5X1NJWkUodDIpIDw9IDIqc2hpZnQpOyAvKiBubyBvdmVybGFwIHdpdGggaGlnaCBkaWdpdHMgKi8KLQltZW1jcHkocmV0LT5vYl9kaWdpdCwgdDItPm9iX2RpZ2l0LCBQeV9TSVpFKHQyKSAqIHNpemVvZihkaWdpdCkpOworICAgIC8qIDMuIHQyIDwtIGFsKmJsLCBhbmQgY29weSBpbnRvIHRoZSBsb3cgZGlnaXRzLiAqLworICAgIGlmICgodDIgPSBrX211bChhbCwgYmwpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRih0MSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgYXNzZXJ0KFB5X1NJWkUodDIpID49IDApOworICAgIGFzc2VydChQeV9TSVpFKHQyKSA8PSAyKnNoaWZ0KTsgLyogbm8gb3ZlcmxhcCB3aXRoIGhpZ2ggZGlnaXRzICovCisgICAgbWVtY3B5KHJldC0+b2JfZGlnaXQsIHQyLT5vYl9kaWdpdCwgUHlfU0laRSh0MikgKiBzaXplb2YoZGlnaXQpKTsKIAotCS8qIFplcm8gb3V0IHJlbWFpbmluZyBkaWdpdHMuICovCi0JaSA9IDIqc2hpZnQgLSBQeV9TSVpFKHQyKTsJLyogbnVtYmVyIG9mIHVuaW5pdGlhbGl6ZWQgZGlnaXRzICovCi0JaWYgKGkpCi0JCW1lbXNldChyZXQtPm9iX2RpZ2l0ICsgUHlfU0laRSh0MiksIDAsIGkgKiBzaXplb2YoZGlnaXQpKTsKKyAgICAvKiBaZXJvIG91dCByZW1haW5pbmcgZGlnaXRzLiAqLworICAgIGkgPSAyKnNoaWZ0IC0gUHlfU0laRSh0Mik7ICAgICAgICAgIC8qIG51bWJlciBvZiB1bmluaXRpYWxpemVkIGRpZ2l0cyAqLworICAgIGlmIChpKQorICAgICAgICBtZW1zZXQocmV0LT5vYl9kaWdpdCArIFB5X1NJWkUodDIpLCAwLCBpICogc2l6ZW9mKGRpZ2l0KSk7CiAKLQkvKiA0ICYgNS4gU3VidHJhY3QgYWgqYmggKHQxKSBhbmQgYWwqYmwgKHQyKS4gIFdlIGRvIGFsKmJsIGZpcnN0Ci0JICogYmVjYXVzZSBpdCdzIGZyZXNoZXIgaW4gY2FjaGUuCi0JICovCi0JaSA9IFB5X1NJWkUocmV0KSAtIHNoaWZ0OyAgLyogIyBkaWdpdHMgYWZ0ZXIgc2hpZnQgKi8KLQkodm9pZCl2X2lzdWIocmV0LT5vYl9kaWdpdCArIHNoaWZ0LCBpLCB0Mi0+b2JfZGlnaXQsIFB5X1NJWkUodDIpKTsKLQlQeV9ERUNSRUYodDIpOworICAgIC8qIDQgJiA1LiBTdWJ0cmFjdCBhaCpiaCAodDEpIGFuZCBhbCpibCAodDIpLiAgV2UgZG8gYWwqYmwgZmlyc3QKKyAgICAgKiBiZWNhdXNlIGl0J3MgZnJlc2hlciBpbiBjYWNoZS4KKyAgICAgKi8KKyAgICBpID0gUHlfU0laRShyZXQpIC0gc2hpZnQ7ICAvKiAjIGRpZ2l0cyBhZnRlciBzaGlmdCAqLworICAgICh2b2lkKXZfaXN1YihyZXQtPm9iX2RpZ2l0ICsgc2hpZnQsIGksIHQyLT5vYl9kaWdpdCwgUHlfU0laRSh0MikpOworICAgIFB5X0RFQ1JFRih0Mik7CiAKLQkodm9pZCl2X2lzdWIocmV0LT5vYl9kaWdpdCArIHNoaWZ0LCBpLCB0MS0+b2JfZGlnaXQsIFB5X1NJWkUodDEpKTsKLQlQeV9ERUNSRUYodDEpOworICAgICh2b2lkKXZfaXN1YihyZXQtPm9iX2RpZ2l0ICsgc2hpZnQsIGksIHQxLT5vYl9kaWdpdCwgUHlfU0laRSh0MSkpOworICAgIFB5X0RFQ1JFRih0MSk7CiAKLQkvKiA2LiB0MyA8LSAoYWgrYWwpKGJoK2JsKSwgYW5kIGFkZCBpbnRvIHJlc3VsdC4gKi8KLQlpZiAoKHQxID0geF9hZGQoYWgsIGFsKSkgPT0gTlVMTCkgZ290byBmYWlsOwotCVB5X0RFQ1JFRihhaCk7Ci0JUHlfREVDUkVGKGFsKTsKLQlhaCA9IGFsID0gTlVMTDsKKyAgICAvKiA2LiB0MyA8LSAoYWgrYWwpKGJoK2JsKSwgYW5kIGFkZCBpbnRvIHJlc3VsdC4gKi8KKyAgICBpZiAoKHQxID0geF9hZGQoYWgsIGFsKSkgPT0gTlVMTCkgZ290byBmYWlsOworICAgIFB5X0RFQ1JFRihhaCk7CisgICAgUHlfREVDUkVGKGFsKTsKKyAgICBhaCA9IGFsID0gTlVMTDsKIAotCWlmIChhID09IGIpIHsKLQkJdDIgPSB0MTsKLQkJUHlfSU5DUkVGKHQyKTsKLQl9Ci0JZWxzZSBpZiAoKHQyID0geF9hZGQoYmgsIGJsKSkgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodDEpOwotCQlnb3RvIGZhaWw7Ci0JfQotCVB5X0RFQ1JFRihiaCk7Ci0JUHlfREVDUkVGKGJsKTsKLQliaCA9IGJsID0gTlVMTDsKKyAgICBpZiAoYSA9PSBiKSB7CisgICAgICAgIHQyID0gdDE7CisgICAgICAgIFB5X0lOQ1JFRih0Mik7CisgICAgfQorICAgIGVsc2UgaWYgKCh0MiA9IHhfYWRkKGJoLCBibCkpID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHQxKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBQeV9ERUNSRUYoYmgpOworICAgIFB5X0RFQ1JFRihibCk7CisgICAgYmggPSBibCA9IE5VTEw7CiAKLQl0MyA9IGtfbXVsKHQxLCB0Mik7Ci0JUHlfREVDUkVGKHQxKTsKLQlQeV9ERUNSRUYodDIpOwotCWlmICh0MyA9PSBOVUxMKSBnb3RvIGZhaWw7Ci0JYXNzZXJ0KFB5X1NJWkUodDMpID49IDApOworICAgIHQzID0ga19tdWwodDEsIHQyKTsKKyAgICBQeV9ERUNSRUYodDEpOworICAgIFB5X0RFQ1JFRih0Mik7CisgICAgaWYgKHQzID09IE5VTEwpIGdvdG8gZmFpbDsKKyAgICBhc3NlcnQoUHlfU0laRSh0MykgPj0gMCk7CiAKLQkvKiBBZGQgdDMuICBJdCdzIG5vdCBvYnZpb3VzIHdoeSB3ZSBjYW4ndCBydW4gb3V0IG9mIHJvb20gaGVyZS4KLQkgKiBTZWUgdGhlICgqKSBjb21tZW50IGFmdGVyIHRoaXMgZnVuY3Rpb24uCi0JICovCi0JKHZvaWQpdl9pYWRkKHJldC0+b2JfZGlnaXQgKyBzaGlmdCwgaSwgdDMtPm9iX2RpZ2l0LCBQeV9TSVpFKHQzKSk7Ci0JUHlfREVDUkVGKHQzKTsKKyAgICAvKiBBZGQgdDMuICBJdCdzIG5vdCBvYnZpb3VzIHdoeSB3ZSBjYW4ndCBydW4gb3V0IG9mIHJvb20gaGVyZS4KKyAgICAgKiBTZWUgdGhlICgqKSBjb21tZW50IGFmdGVyIHRoaXMgZnVuY3Rpb24uCisgICAgICovCisgICAgKHZvaWQpdl9pYWRkKHJldC0+b2JfZGlnaXQgKyBzaGlmdCwgaSwgdDMtPm9iX2RpZ2l0LCBQeV9TSVpFKHQzKSk7CisgICAgUHlfREVDUkVGKHQzKTsKIAotCXJldHVybiBsb25nX25vcm1hbGl6ZShyZXQpOworICAgIHJldHVybiBsb25nX25vcm1hbGl6ZShyZXQpOwogCiAgZmFpbDoKLSAJUHlfWERFQ1JFRihyZXQpOwotCVB5X1hERUNSRUYoYWgpOwotCVB5X1hERUNSRUYoYWwpOwotCVB5X1hERUNSRUYoYmgpOwotCVB5X1hERUNSRUYoYmwpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYocmV0KTsKKyAgICBQeV9YREVDUkVGKGFoKTsKKyAgICBQeV9YREVDUkVGKGFsKTsKKyAgICBQeV9YREVDUkVGKGJoKTsKKyAgICBQeV9YREVDUkVGKGJsKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogKCopIFdoeSBhZGRpbmcgdDMgY2FuJ3QgInJ1biBvdXQgb2Ygcm9vbSIgYWJvdmUuCkBAIC0yNDkxLDc0ICsyNDkxLDc0IEBACiBzdGF0aWMgUHlMb25nT2JqZWN0ICoKIGtfbG9wc2lkZWRfbXVsKFB5TG9uZ09iamVjdCAqYSwgUHlMb25nT2JqZWN0ICpiKQogewotCWNvbnN0IFB5X3NzaXplX3QgYXNpemUgPSBBQlMoUHlfU0laRShhKSk7Ci0JUHlfc3NpemVfdCBic2l6ZSA9IEFCUyhQeV9TSVpFKGIpKTsKLQlQeV9zc2l6ZV90IG5iZG9uZTsJLyogIyBvZiBiIGRpZ2l0cyBhbHJlYWR5IG11bHRpcGxpZWQgKi8KLQlQeUxvbmdPYmplY3QgKnJldDsKLQlQeUxvbmdPYmplY3QgKmJzbGljZSA9IE5VTEw7CisgICAgY29uc3QgUHlfc3NpemVfdCBhc2l6ZSA9IEFCUyhQeV9TSVpFKGEpKTsKKyAgICBQeV9zc2l6ZV90IGJzaXplID0gQUJTKFB5X1NJWkUoYikpOworICAgIFB5X3NzaXplX3QgbmJkb25lOyAgICAgICAgICAvKiAjIG9mIGIgZGlnaXRzIGFscmVhZHkgbXVsdGlwbGllZCAqLworICAgIFB5TG9uZ09iamVjdCAqcmV0OworICAgIFB5TG9uZ09iamVjdCAqYnNsaWNlID0gTlVMTDsKIAotCWFzc2VydChhc2l6ZSA+IEtBUkFUU1VCQV9DVVRPRkYpOwotCWFzc2VydCgyICogYXNpemUgPD0gYnNpemUpOworICAgIGFzc2VydChhc2l6ZSA+IEtBUkFUU1VCQV9DVVRPRkYpOworICAgIGFzc2VydCgyICogYXNpemUgPD0gYnNpemUpOwogCi0JLyogQWxsb2NhdGUgcmVzdWx0IHNwYWNlLCBhbmQgemVybyBpdCBvdXQuICovCi0JcmV0ID0gX1B5TG9uZ19OZXcoYXNpemUgKyBic2l6ZSk7Ci0JaWYgKHJldCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQocmV0LT5vYl9kaWdpdCwgMCwgUHlfU0laRShyZXQpICogc2l6ZW9mKGRpZ2l0KSk7CisgICAgLyogQWxsb2NhdGUgcmVzdWx0IHNwYWNlLCBhbmQgemVybyBpdCBvdXQuICovCisgICAgcmV0ID0gX1B5TG9uZ19OZXcoYXNpemUgKyBic2l6ZSk7CisgICAgaWYgKHJldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQocmV0LT5vYl9kaWdpdCwgMCwgUHlfU0laRShyZXQpICogc2l6ZW9mKGRpZ2l0KSk7CiAKLQkvKiBTdWNjZXNzaXZlIHNsaWNlcyBvZiBiIGFyZSBjb3BpZWQgaW50byBic2xpY2UuICovCi0JYnNsaWNlID0gX1B5TG9uZ19OZXcoYXNpemUpOwotCWlmIChic2xpY2UgPT0gTlVMTCkKLQkJZ290byBmYWlsOworICAgIC8qIFN1Y2Nlc3NpdmUgc2xpY2VzIG9mIGIgYXJlIGNvcGllZCBpbnRvIGJzbGljZS4gKi8KKyAgICBic2xpY2UgPSBfUHlMb25nX05ldyhhc2l6ZSk7CisgICAgaWYgKGJzbGljZSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CiAKLQluYmRvbmUgPSAwOwotCXdoaWxlIChic2l6ZSA+IDApIHsKLQkJUHlMb25nT2JqZWN0ICpwcm9kdWN0OwotCQljb25zdCBQeV9zc2l6ZV90IG5idG91c2UgPSBNSU4oYnNpemUsIGFzaXplKTsKKyAgICBuYmRvbmUgPSAwOworICAgIHdoaWxlIChic2l6ZSA+IDApIHsKKyAgICAgICAgUHlMb25nT2JqZWN0ICpwcm9kdWN0OworICAgICAgICBjb25zdCBQeV9zc2l6ZV90IG5idG91c2UgPSBNSU4oYnNpemUsIGFzaXplKTsKIAotCQkvKiBNdWx0aXBseSB0aGUgbmV4dCBzbGljZSBvZiBiIGJ5IGEuICovCi0JCW1lbWNweShic2xpY2UtPm9iX2RpZ2l0LCBiLT5vYl9kaWdpdCArIG5iZG9uZSwKLQkJICAgICAgIG5idG91c2UgKiBzaXplb2YoZGlnaXQpKTsKLQkJUHlfU0laRShic2xpY2UpID0gbmJ0b3VzZTsKLQkJcHJvZHVjdCA9IGtfbXVsKGEsIGJzbGljZSk7Ci0JCWlmIChwcm9kdWN0ID09IE5VTEwpCi0JCQlnb3RvIGZhaWw7CisgICAgICAgIC8qIE11bHRpcGx5IHRoZSBuZXh0IHNsaWNlIG9mIGIgYnkgYS4gKi8KKyAgICAgICAgbWVtY3B5KGJzbGljZS0+b2JfZGlnaXQsIGItPm9iX2RpZ2l0ICsgbmJkb25lLAorICAgICAgICAgICAgICAgbmJ0b3VzZSAqIHNpemVvZihkaWdpdCkpOworICAgICAgICBQeV9TSVpFKGJzbGljZSkgPSBuYnRvdXNlOworICAgICAgICBwcm9kdWN0ID0ga19tdWwoYSwgYnNsaWNlKTsKKyAgICAgICAgaWYgKHByb2R1Y3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKIAotCQkvKiBBZGQgaW50byByZXN1bHQuICovCi0JCSh2b2lkKXZfaWFkZChyZXQtPm9iX2RpZ2l0ICsgbmJkb25lLCBQeV9TSVpFKHJldCkgLSBuYmRvbmUsCi0JCQkgICAgIHByb2R1Y3QtPm9iX2RpZ2l0LCBQeV9TSVpFKHByb2R1Y3QpKTsKLQkJUHlfREVDUkVGKHByb2R1Y3QpOworICAgICAgICAvKiBBZGQgaW50byByZXN1bHQuICovCisgICAgICAgICh2b2lkKXZfaWFkZChyZXQtPm9iX2RpZ2l0ICsgbmJkb25lLCBQeV9TSVpFKHJldCkgLSBuYmRvbmUsCisgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LT5vYl9kaWdpdCwgUHlfU0laRShwcm9kdWN0KSk7CisgICAgICAgIFB5X0RFQ1JFRihwcm9kdWN0KTsKIAotCQlic2l6ZSAtPSBuYnRvdXNlOwotCQluYmRvbmUgKz0gbmJ0b3VzZTsKLQl9CisgICAgICAgIGJzaXplIC09IG5idG91c2U7CisgICAgICAgIG5iZG9uZSArPSBuYnRvdXNlOworICAgIH0KIAotCVB5X0RFQ1JFRihic2xpY2UpOwotCXJldHVybiBsb25nX25vcm1hbGl6ZShyZXQpOworICAgIFB5X0RFQ1JFRihic2xpY2UpOworICAgIHJldHVybiBsb25nX25vcm1hbGl6ZShyZXQpOwogCiAgZmFpbDoKLQlQeV9ERUNSRUYocmV0KTsKLQlQeV9YREVDUkVGKGJzbGljZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJldCk7CisgICAgUHlfWERFQ1JFRihic2xpY2UpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19tdWwoUHlMb25nT2JqZWN0ICp2LCBQeUxvbmdPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYiwgKno7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYiwgKno7CiAKLQlpZiAoIWNvbnZlcnRfYmlub3AoKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgJmEsICZiKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGlmICghY29udmVydF9iaW5vcCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAmYSwgJmIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CiAKLQl6ID0ga19tdWwoYSwgYik7Ci0JLyogTmVnYXRlIGlmIGV4YWN0bHkgb25lIG9mIHRoZSBpbnB1dHMgaXMgbmVnYXRpdmUuICovCi0JaWYgKCgoYS0+b2Jfc2l6ZSBeIGItPm9iX3NpemUpIDwgMCkgJiYgeikKLQkJei0+b2Jfc2l6ZSA9IC0oei0+b2Jfc2l6ZSk7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopejsKKyAgICB6ID0ga19tdWwoYSwgYik7CisgICAgLyogTmVnYXRlIGlmIGV4YWN0bHkgb25lIG9mIHRoZSBpbnB1dHMgaXMgbmVnYXRpdmUuICovCisgICAgaWYgKCgoYS0+b2Jfc2l6ZSBeIGItPm9iX3NpemUpIDwgMCkgJiYgeikKKyAgICAgICAgei0+b2Jfc2l6ZSA9IC0oei0+b2Jfc2l6ZSk7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopejsKIH0KIAogLyogVGhlIC8gYW5kICUgb3BlcmF0b3JzIGFyZSBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBkaXZtb2QoKS4KQEAgLTI1NjcsMTEgKzI1NjcsMTEgQEAKICAgIHxhfCBieSB8YnwsIHdpdGggdGhlIHNpZ24gb2YgYS4gIFRoaXMgaXMgYWxzbyBleHByZXNzZWQKICAgIGFzIGEgLSBiKnRydW5jKGEvYiksIGlmIHRydW5jIHRydW5jYXRlcyB0b3dhcmRzIHplcm8uCiAgICBTb21lIGV4YW1wbGVzOgotICAgCSBhCSBiCWEgcmVtIGIJCWEgbW9kIGIKLSAgIAkgMTMJIDEwCSAzCQkgMwotICAgCS0xMwkgMTAJLTMJCSA3Ci0gICAJIDEzCS0xMAkgMwkJLTcKLSAgIAktMTMJLTEwCS0zCQktMworICAgICBhICAgICAgICAgICBiICAgICAgYSByZW0gYiAgICAgICAgIGEgbW9kIGIKKyAgICAgMTMgICAgICAgICAgMTAgICAgICAzICAgICAgICAgICAgICAgMworICAgIC0xMyAgICAgICAgICAxMCAgICAgLTMgICAgICAgICAgICAgICA3CisgICAgIDEzICAgICAgICAgLTEwICAgICAgMyAgICAgICAgICAgICAgLTcKKyAgICAtMTMgICAgICAgICAtMTAgICAgIC0zICAgICAgICAgICAgICAtMwogICAgU28sIHRvIGdldCBmcm9tIHJlbSB0byBtb2QsIHdlIGhhdmUgdG8gYWRkIGIgaWYgYSBhbmQgYgogICAgaGF2ZSBkaWZmZXJlbnQgc2lnbnMuICBXZSB0aGVuIHN1YnRyYWN0IG9uZSBmcm9tIHRoZSAnZGl2JwogICAgcGFydCBvZiB0aGUgb3V0Y29tZSB0byBrZWVwIHRoZSBpbnZhcmlhbnQgaW50YWN0LiAqLwpAQCAtMjU4NCw1MTkgKzI1ODQsNTE5IEBACiAgKi8KIHN0YXRpYyBpbnQKIGxfZGl2bW9kKFB5TG9uZ09iamVjdCAqdiwgUHlMb25nT2JqZWN0ICp3LAotCSBQeUxvbmdPYmplY3QgKipwZGl2LCBQeUxvbmdPYmplY3QgKipwbW9kKQorICAgICAgICAgUHlMb25nT2JqZWN0ICoqcGRpdiwgUHlMb25nT2JqZWN0ICoqcG1vZCkKIHsKLQlQeUxvbmdPYmplY3QgKmRpdiwgKm1vZDsKKyAgICBQeUxvbmdPYmplY3QgKmRpdiwgKm1vZDsKIAotCWlmIChsb25nX2RpdnJlbSh2LCB3LCAmZGl2LCAmbW9kKSA8IDApCi0JCXJldHVybiAtMTsKLQlpZiAoKFB5X1NJWkUobW9kKSA8IDAgJiYgUHlfU0laRSh3KSA+IDApIHx8Ci0JICAgIChQeV9TSVpFKG1vZCkgPiAwICYmIFB5X1NJWkUodykgPCAwKSkgewotCQlQeUxvbmdPYmplY3QgKnRlbXA7Ci0JCVB5TG9uZ09iamVjdCAqb25lOwotCQl0ZW1wID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX2FkZChtb2QsIHcpOwotCQlQeV9ERUNSRUYobW9kKTsKLQkJbW9kID0gdGVtcDsKLQkJaWYgKG1vZCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZGl2KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlvbmUgPSAoUHlMb25nT2JqZWN0ICopIFB5TG9uZ19Gcm9tTG9uZygxTCk7Ci0JCWlmIChvbmUgPT0gTlVMTCB8fAotCQkgICAgKHRlbXAgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfc3ViKGRpdiwgb25lKSkgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKG1vZCk7Ci0JCQlQeV9ERUNSRUYoZGl2KTsKLQkJCVB5X1hERUNSRUYob25lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlQeV9ERUNSRUYob25lKTsKLQkJUHlfREVDUkVGKGRpdik7Ci0JCWRpdiA9IHRlbXA7Ci0JfQotCWlmIChwZGl2ICE9IE5VTEwpCi0JCSpwZGl2ID0gZGl2OwotCWVsc2UKLQkJUHlfREVDUkVGKGRpdik7CisgICAgaWYgKGxvbmdfZGl2cmVtKHYsIHcsICZkaXYsICZtb2QpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICgoUHlfU0laRShtb2QpIDwgMCAmJiBQeV9TSVpFKHcpID4gMCkgfHwKKyAgICAgICAgKFB5X1NJWkUobW9kKSA+IDAgJiYgUHlfU0laRSh3KSA8IDApKSB7CisgICAgICAgIFB5TG9uZ09iamVjdCAqdGVtcDsKKyAgICAgICAgUHlMb25nT2JqZWN0ICpvbmU7CisgICAgICAgIHRlbXAgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfYWRkKG1vZCwgdyk7CisgICAgICAgIFB5X0RFQ1JFRihtb2QpOworICAgICAgICBtb2QgPSB0ZW1wOworICAgICAgICBpZiAobW9kID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkaXYpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG9uZSA9IChQeUxvbmdPYmplY3QgKikgUHlMb25nX0Zyb21Mb25nKDFMKTsKKyAgICAgICAgaWYgKG9uZSA9PSBOVUxMIHx8CisgICAgICAgICAgICAodGVtcCA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19zdWIoZGl2LCBvbmUpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobW9kKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkaXYpOworICAgICAgICAgICAgUHlfWERFQ1JFRihvbmUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihvbmUpOworICAgICAgICBQeV9ERUNSRUYoZGl2KTsKKyAgICAgICAgZGl2ID0gdGVtcDsKKyAgICB9CisgICAgaWYgKHBkaXYgIT0gTlVMTCkKKyAgICAgICAgKnBkaXYgPSBkaXY7CisgICAgZWxzZQorICAgICAgICBQeV9ERUNSRUYoZGl2KTsKIAotCWlmIChwbW9kICE9IE5VTEwpCi0JCSpwbW9kID0gbW9kOwotCWVsc2UKLQkJUHlfREVDUkVGKG1vZCk7CisgICAgaWYgKHBtb2QgIT0gTlVMTCkKKyAgICAgICAgKnBtb2QgPSBtb2Q7CisgICAgZWxzZQorICAgICAgICBQeV9ERUNSRUYobW9kKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19kaXYoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmIsICpkaXY7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYiwgKmRpdjsKIAotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKLQlpZiAobF9kaXZtb2QoYSwgYiwgJmRpdiwgTlVMTCkgPCAwKQotCQlkaXYgPSBOVUxMOwotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWRpdjsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CisgICAgaWYgKGxfZGl2bW9kKGEsIGIsICZkaXYsIE5VTEwpIDwgMCkKKyAgICAgICAgZGl2ID0gTlVMTDsKKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiAoUHlPYmplY3QgKilkaXY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2NsYXNzaWNfZGl2KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiLCAqZGl2OworICAgIFB5TG9uZ09iamVjdCAqYSwgKmIsICpkaXY7CiAKLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7Ci0JaWYgKFB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgJiYKLQkgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsICJjbGFzc2ljIGxvbmcgZGl2aXNpb24iKSA8IDApCi0JCWRpdiA9IE5VTEw7Ci0JZWxzZSBpZiAobF9kaXZtb2QoYSwgYiwgJmRpdiwgTlVMTCkgPCAwKQotCQlkaXYgPSBOVUxMOwotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWRpdjsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CisgICAgaWYgKFB5X0RpdmlzaW9uV2FybmluZ0ZsYWcgJiYKKyAgICAgICAgUHlFcnJfV2FybihQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsICJjbGFzc2ljIGxvbmcgZGl2aXNpb24iKSA8IDApCisgICAgICAgIGRpdiA9IE5VTEw7CisgICAgZWxzZSBpZiAobF9kaXZtb2QoYSwgYiwgJmRpdiwgTlVMTCkgPCAwKQorICAgICAgICBkaXYgPSBOVUxMOworICAgIFB5X0RFQ1JFRihhKTsKKyAgICBQeV9ERUNSRUYoYik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWRpdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfdHJ1ZV9kaXZpZGUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmI7Ci0JZG91YmxlIGFkLCBiZDsKLQlpbnQgZmFpbGVkLCBhZXhwID0gLTEsIGJleHAgPSAtMTsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiOworICAgIGRvdWJsZSBhZCwgYmQ7CisgICAgaW50IGZhaWxlZCwgYWV4cCA9IC0xLCBiZXhwID0gLTE7CiAKLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7Ci0JYWQgPSBfUHlMb25nX0FzU2NhbGVkRG91YmxlKChQeU9iamVjdCAqKWEsICZhZXhwKTsKLQliZCA9IF9QeUxvbmdfQXNTY2FsZWREb3VibGUoKFB5T2JqZWN0ICopYiwgJmJleHApOwotCWZhaWxlZCA9IChhZCA9PSAtMS4wIHx8IGJkID09IC0xLjApICYmIFB5RXJyX09jY3VycmVkKCk7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlpZiAoZmFpbGVkKQotCQlyZXR1cm4gTlVMTDsKLQkvKiAnYWV4cCcgYW5kICdiZXhwJyB3ZXJlIGluaXRpYWxpemVkIHRvIC0xIHRvIHNpbGVuY2UgZ2NjLTQuMC54LAotCSAgIGJ1dCBzaG91bGQgcmVhbGx5IGJlIHNldCBjb3JyZWN0bHkgYWZ0ZXIgc3VjZXNzZnVsIGNhbGxzIHRvCi0JICAgX1B5TG9uZ19Bc1NjYWxlZERvdWJsZSgpICovCi0JYXNzZXJ0KGFleHAgPj0gMCAmJiBiZXhwID49IDApOworICAgIENPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBhZCA9IF9QeUxvbmdfQXNTY2FsZWREb3VibGUoKFB5T2JqZWN0ICopYSwgJmFleHApOworICAgIGJkID0gX1B5TG9uZ19Bc1NjYWxlZERvdWJsZSgoUHlPYmplY3QgKiliLCAmYmV4cCk7CisgICAgZmFpbGVkID0gKGFkID09IC0xLjAgfHwgYmQgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKTsKKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIGlmIChmYWlsZWQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qICdhZXhwJyBhbmQgJ2JleHAnIHdlcmUgaW5pdGlhbGl6ZWQgdG8gLTEgdG8gc2lsZW5jZSBnY2MtNC4wLngsCisgICAgICAgYnV0IHNob3VsZCByZWFsbHkgYmUgc2V0IGNvcnJlY3RseSBhZnRlciBzdWNlc3NmdWwgY2FsbHMgdG8KKyAgICAgICBfUHlMb25nX0FzU2NhbGVkRG91YmxlKCkgKi8KKyAgICBhc3NlcnQoYWV4cCA+PSAwICYmIGJleHAgPj0gMCk7CiAKLQlpZiAoYmQgPT0gMC4wKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKLQkJCSJsb25nIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoYmQgPT0gMC4wKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19aZXJvRGl2aXNpb25FcnJvciwKKyAgICAgICAgICAgICJsb25nIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFRydWUgdmFsdWUgaXMgdmVyeSBjbG9zZSB0byBhZC9iZCAqIDIqKihQeUxvbmdfU0hJRlQqKGFleHAtYmV4cCkpICovCi0JYWQgLz0gYmQ7CS8qIG92ZXJmbG93L3VuZGVyZmxvdyBpbXBvc3NpYmxlIGhlcmUgKi8KLQlhZXhwIC09IGJleHA7Ci0JaWYgKGFleHAgPiBJTlRfTUFYIC8gUHlMb25nX1NISUZUKQotCQlnb3RvIG92ZXJmbG93OwotCWVsc2UgaWYgKGFleHAgPCAtKElOVF9NQVggLyBQeUxvbmdfU0hJRlQpKQotCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKDAuMCk7CS8qIHVuZGVyZmxvdyB0byAwICovCi0JZXJybm8gPSAwOwotCWFkID0gbGRleHAoYWQsIGFleHAgKiBQeUxvbmdfU0hJRlQpOwotCWlmIChQeV9PVkVSRkxPV0VEKGFkKSkgLyogaWdub3JlIHVuZGVyZmxvdyB0byAwLjAgKi8KLQkJZ290byBvdmVyZmxvdzsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKGFkKTsKKyAgICAvKiBUcnVlIHZhbHVlIGlzIHZlcnkgY2xvc2UgdG8gYWQvYmQgKiAyKiooUHlMb25nX1NISUZUKihhZXhwLWJleHApKSAqLworICAgIGFkIC89IGJkOyAgICAgICAgICAgLyogb3ZlcmZsb3cvdW5kZXJmbG93IGltcG9zc2libGUgaGVyZSAqLworICAgIGFleHAgLT0gYmV4cDsKKyAgICBpZiAoYWV4cCA+IElOVF9NQVggLyBQeUxvbmdfU0hJRlQpCisgICAgICAgIGdvdG8gb3ZlcmZsb3c7CisgICAgZWxzZSBpZiAoYWV4cCA8IC0oSU5UX01BWCAvIFB5TG9uZ19TSElGVCkpCisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoMC4wKTsgICAgICAgICAvKiB1bmRlcmZsb3cgdG8gMCAqLworICAgIGVycm5vID0gMDsKKyAgICBhZCA9IGxkZXhwKGFkLCBhZXhwICogUHlMb25nX1NISUZUKTsKKyAgICBpZiAoUHlfT1ZFUkZMT1dFRChhZCkpIC8qIGlnbm9yZSB1bmRlcmZsb3cgdG8gMC4wICovCisgICAgICAgIGdvdG8gb3ZlcmZsb3c7CisgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShhZCk7CiAKIG92ZXJmbG93OgotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkibG9uZy9sb25nIHRvbyBsYXJnZSBmb3IgYSBmbG9hdCIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAibG9uZy9sb25nIHRvbyBsYXJnZSBmb3IgYSBmbG9hdCIpOworICAgIHJldHVybiBOVUxMOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX21vZChQeU9iamVjdCAqdiwgUHlPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYiwgKm1vZDsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiLCAqbW9kOwogCi0JQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOworICAgIENPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKIAotCWlmIChsX2Rpdm1vZChhLCBiLCBOVUxMLCAmbW9kKSA8IDApCi0JCW1vZCA9IE5VTEw7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopbW9kOworICAgIGlmIChsX2Rpdm1vZChhLCBiLCBOVUxMLCAmbW9kKSA8IDApCisgICAgICAgIG1vZCA9IE5VTEw7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbW9kOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19kaXZtb2QoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmIsICpkaXYsICptb2Q7Ci0JUHlPYmplY3QgKno7CisgICAgUHlMb25nT2JqZWN0ICphLCAqYiwgKmRpdiwgKm1vZDsKKyAgICBQeU9iamVjdCAqejsKIAotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7CiAKLQlpZiAobF9kaXZtb2QoYSwgYiwgJmRpdiwgJm1vZCkgPCAwKSB7Ci0JCVB5X0RFQ1JFRihhKTsKLQkJUHlfREVDUkVGKGIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JeiA9IFB5VHVwbGVfTmV3KDIpOwotCWlmICh6ICE9IE5VTEwpIHsKLQkJUHlUdXBsZV9TZXRJdGVtKHosIDAsIChQeU9iamVjdCAqKSBkaXYpOwotCQlQeVR1cGxlX1NldEl0ZW0oeiwgMSwgKFB5T2JqZWN0ICopIG1vZCk7Ci0JfQotCWVsc2UgewotCQlQeV9ERUNSRUYoZGl2KTsKLQkJUHlfREVDUkVGKG1vZCk7Ci0JfQotCVB5X0RFQ1JFRihhKTsKLQlQeV9ERUNSRUYoYik7Ci0JcmV0dXJuIHo7CisgICAgaWYgKGxfZGl2bW9kKGEsIGIsICZkaXYsICZtb2QpIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgIFB5X0RFQ1JFRihiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHogPSBQeVR1cGxlX05ldygyKTsKKyAgICBpZiAoeiAhPSBOVUxMKSB7CisgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh6LCAwLCAoUHlPYmplY3QgKikgZGl2KTsKKyAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHosIDEsIChQeU9iamVjdCAqKSBtb2QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKGRpdik7CisgICAgICAgIFB5X0RFQ1JFRihtb2QpOworICAgIH0KKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiB6OwogfQogCiAvKiBwb3codiwgdywgeCkgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX3BvdyhQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIFB5T2JqZWN0ICp4KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmIsICpjOyAvKiBhLGIsYyA9IHYsdyx4ICovCi0JaW50IG5lZ2F0aXZlT3V0cHV0ID0gMDsgIC8qIGlmIHg8MCByZXR1cm4gbmVnYXRpdmUgb3V0cHV0ICovCisgICAgUHlMb25nT2JqZWN0ICphLCAqYiwgKmM7IC8qIGEsYixjID0gdix3LHggKi8KKyAgICBpbnQgbmVnYXRpdmVPdXRwdXQgPSAwOyAgLyogaWYgeDwwIHJldHVybiBuZWdhdGl2ZSBvdXRwdXQgKi8KIAotCVB5TG9uZ09iamVjdCAqeiA9IE5VTEw7ICAvKiBhY2N1bXVsYXRlZCByZXN1bHQgKi8KLQlQeV9zc2l6ZV90IGksIGosIGs7ICAgICAgICAgICAgIC8qIGNvdW50ZXJzICovCi0JUHlMb25nT2JqZWN0ICp0ZW1wID0gTlVMTDsKKyAgICBQeUxvbmdPYmplY3QgKnogPSBOVUxMOyAgLyogYWNjdW11bGF0ZWQgcmVzdWx0ICovCisgICAgUHlfc3NpemVfdCBpLCBqLCBrOyAgICAgICAgICAgICAvKiBjb3VudGVycyAqLworICAgIFB5TG9uZ09iamVjdCAqdGVtcCA9IE5VTEw7CiAKLQkvKiA1LWFyeSB2YWx1ZXMuICBJZiB0aGUgZXhwb25lbnQgaXMgbGFyZ2UgZW5vdWdoLCB0YWJsZSBpcwotCSAqIHByZWNvbXB1dGVkIHNvIHRoYXQgdGFibGVbaV0gPT0gYSoqaSAlIGMgZm9yIGkgaW4gcmFuZ2UoMzIpLgotCSAqLwotCVB5TG9uZ09iamVjdCAqdGFibGVbMzJdID0gezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0JCQkJICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CisgICAgLyogNS1hcnkgdmFsdWVzLiAgSWYgdGhlIGV4cG9uZW50IGlzIGxhcmdlIGVub3VnaCwgdGFibGUgaXMKKyAgICAgKiBwcmVjb21wdXRlZCBzbyB0aGF0IHRhYmxlW2ldID09IGEqKmkgJSBjIGZvciBpIGluIHJhbmdlKDMyKS4KKyAgICAgKi8KKyAgICBQeUxvbmdPYmplY3QgKnRhYmxlWzMyXSA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9OwogCi0JLyogYSwgYiwgYyA9IHYsIHcsIHggKi8KLQlDT05WRVJUX0JJTk9QKHYsIHcsICZhLCAmYik7Ci0JaWYgKFB5TG9uZ19DaGVjayh4KSkgewotCQljID0gKFB5TG9uZ09iamVjdCAqKXg7Ci0JCVB5X0lOQ1JFRih4KTsKLQl9Ci0JZWxzZSBpZiAoUHlJbnRfQ2hlY2soeCkpIHsKLQkJYyA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoUHlJbnRfQVNfTE9ORyh4KSk7Ci0JCWlmIChjID09IE5VTEwpCi0JCQlnb3RvIEVycm9yOwotCX0KLQllbHNlIGlmICh4ID09IFB5X05vbmUpCi0JCWMgPSBOVUxMOwotCWVsc2UgewotCQlQeV9ERUNSRUYoYSk7Ci0JCVB5X0RFQ1JFRihiKTsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KKyAgICAvKiBhLCBiLCBjID0gdiwgdywgeCAqLworICAgIENPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBpZiAoUHlMb25nX0NoZWNrKHgpKSB7CisgICAgICAgIGMgPSAoUHlMb25nT2JqZWN0ICopeDsKKyAgICAgICAgUHlfSU5DUkVGKHgpOworICAgIH0KKyAgICBlbHNlIGlmIChQeUludF9DaGVjayh4KSkgeworICAgICAgICBjID0gKFB5TG9uZ09iamVjdCAqKVB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKHgpKTsKKyAgICAgICAgaWYgKGMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGVsc2UgaWYgKHggPT0gUHlfTm9uZSkKKyAgICAgICAgYyA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgUHlfREVDUkVGKGIpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JaWYgKFB5X1NJWkUoYikgPCAwKSB7ICAvKiBpZiBleHBvbmVudCBpcyBuZWdhdGl2ZSAqLwotCQlpZiAoYykgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBvdygpIDJuZCBhcmd1bWVudCAiCi0JCQkgICAgImNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWQiKTsKLQkJCWdvdG8gRXJyb3I7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBlbHNlIHJldHVybiBhIGZsb2F0LiAgVGhpcyB3b3JrcyBiZWNhdXNlIHdlIGtub3cKLQkJCSAgIHRoYXQgdGhpcyBjYWxscyBmbG9hdF9wb3coKSB3aGljaCBjb252ZXJ0cyBpdHMKLQkJCSAgIGFyZ3VtZW50cyB0byBkb3VibGUuICovCi0JCQlQeV9ERUNSRUYoYSk7Ci0JCQlQeV9ERUNSRUYoYik7Ci0JCQlyZXR1cm4gUHlGbG9hdF9UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIodiwgdywgeCk7Ci0JCX0KLQl9CisgICAgaWYgKFB5X1NJWkUoYikgPCAwKSB7ICAvKiBpZiBleHBvbmVudCBpcyBuZWdhdGl2ZSAqLworICAgICAgICBpZiAoYykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBvdygpIDJuZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgImNhbm5vdCBiZSBuZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWQiKTsKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBlbHNlIHJldHVybiBhIGZsb2F0LiAgVGhpcyB3b3JrcyBiZWNhdXNlIHdlIGtub3cKKyAgICAgICAgICAgICAgIHRoYXQgdGhpcyBjYWxscyBmbG9hdF9wb3coKSB3aGljaCBjb252ZXJ0cyBpdHMKKyAgICAgICAgICAgICAgIGFyZ3VtZW50cyB0byBkb3VibGUuICovCisgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYik7CisgICAgICAgICAgICByZXR1cm4gUHlGbG9hdF9UeXBlLnRwX2FzX251bWJlci0+bmJfcG93ZXIodiwgdywgeCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoYykgewotCQkvKiBpZiBtb2R1bHVzID09IDA6Ci0JCSAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkgKi8KLQkJaWYgKFB5X1NJWkUoYykgPT0gMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJwb3coKSAzcmQgYXJndW1lbnQgY2Fubm90IGJlIDAiKTsKLQkJCWdvdG8gRXJyb3I7Ci0JCX0KKyAgICBpZiAoYykgeworICAgICAgICAvKiBpZiBtb2R1bHVzID09IDA6CisgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkgKi8KKyAgICAgICAgaWYgKFB5X1NJWkUoYykgPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvdygpIDNyZCBhcmd1bWVudCBjYW5ub3QgYmUgMCIpOworICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgfQogCi0JCS8qIGlmIG1vZHVsdXMgPCAwOgotCQkgICAgICAgbmVnYXRpdmVPdXRwdXQgPSBUcnVlCi0JCSAgICAgICBtb2R1bHVzID0gLW1vZHVsdXMgKi8KLQkJaWYgKFB5X1NJWkUoYykgPCAwKSB7Ci0JCQluZWdhdGl2ZU91dHB1dCA9IDE7Ci0JCQl0ZW1wID0gKFB5TG9uZ09iamVjdCAqKV9QeUxvbmdfQ29weShjKTsKLQkJCWlmICh0ZW1wID09IE5VTEwpCi0JCQkJZ290byBFcnJvcjsKLQkJCVB5X0RFQ1JFRihjKTsKLQkJCWMgPSB0ZW1wOwotCQkJdGVtcCA9IE5VTEw7Ci0JCQljLT5vYl9zaXplID0gLSBjLT5vYl9zaXplOwotCQl9CisgICAgICAgIC8qIGlmIG1vZHVsdXMgPCAwOgorICAgICAgICAgICAgICAgbmVnYXRpdmVPdXRwdXQgPSBUcnVlCisgICAgICAgICAgICAgICBtb2R1bHVzID0gLW1vZHVsdXMgKi8KKyAgICAgICAgaWYgKFB5X1NJWkUoYykgPCAwKSB7CisgICAgICAgICAgICBuZWdhdGl2ZU91dHB1dCA9IDE7CisgICAgICAgICAgICB0ZW1wID0gKFB5TG9uZ09iamVjdCAqKV9QeUxvbmdfQ29weShjKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjKTsKKyAgICAgICAgICAgIGMgPSB0ZW1wOworICAgICAgICAgICAgdGVtcCA9IE5VTEw7CisgICAgICAgICAgICBjLT5vYl9zaXplID0gLSBjLT5vYl9zaXplOworICAgICAgICB9CiAKLQkJLyogaWYgbW9kdWx1cyA9PSAxOgotCQkgICAgICAgcmV0dXJuIDAgKi8KLQkJaWYgKChQeV9TSVpFKGMpID09IDEpICYmIChjLT5vYl9kaWdpdFswXSA9PSAxKSkgewotCQkJeiA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoMEwpOwotCQkJZ290byBEb25lOwotCQl9CisgICAgICAgIC8qIGlmIG1vZHVsdXMgPT0gMToKKyAgICAgICAgICAgICAgIHJldHVybiAwICovCisgICAgICAgIGlmICgoUHlfU0laRShjKSA9PSAxKSAmJiAoYy0+b2JfZGlnaXRbMF0gPT0gMSkpIHsKKyAgICAgICAgICAgIHogPSAoUHlMb25nT2JqZWN0ICopUHlMb25nX0Zyb21Mb25nKDBMKTsKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgfQogCi0JCS8qIGlmIGJhc2UgPCAwOgotCQkgICAgICAgYmFzZSA9IGJhc2UgJSBtb2R1bHVzCi0JCSAgIEhhdmluZyB0aGUgYmFzZSBwb3NpdGl2ZSBqdXN0IG1ha2VzIHRoaW5ncyBlYXNpZXIuICovCi0JCWlmIChQeV9TSVpFKGEpIDwgMCkgewotCQkJaWYgKGxfZGl2bW9kKGEsIGMsIE5VTEwsICZ0ZW1wKSA8IDApCi0JCQkJZ290byBFcnJvcjsKLQkJCVB5X0RFQ1JFRihhKTsKLQkJCWEgPSB0ZW1wOwotCQkJdGVtcCA9IE5VTEw7Ci0JCX0KLQl9CisgICAgICAgIC8qIGlmIGJhc2UgPCAwOgorICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UgJSBtb2R1bHVzCisgICAgICAgICAgIEhhdmluZyB0aGUgYmFzZSBwb3NpdGl2ZSBqdXN0IG1ha2VzIHRoaW5ncyBlYXNpZXIuICovCisgICAgICAgIGlmIChQeV9TSVpFKGEpIDwgMCkgeworICAgICAgICAgICAgaWYgKGxfZGl2bW9kKGEsIGMsIE5VTEwsICZ0ZW1wKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhKTsKKyAgICAgICAgICAgIGEgPSB0ZW1wOworICAgICAgICAgICAgdGVtcCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBBdCB0aGlzIHBvaW50IGEsIGIsIGFuZCBjIGFyZSBndWFyYW50ZWVkIG5vbi1uZWdhdGl2ZSBVTkxFU1MKLQkgICBjIGlzIE5VTEwsIGluIHdoaWNoIGNhc2UgYSBtYXkgYmUgbmVnYXRpdmUuICovCisgICAgLyogQXQgdGhpcyBwb2ludCBhLCBiLCBhbmQgYyBhcmUgZ3VhcmFudGVlZCBub24tbmVnYXRpdmUgVU5MRVNTCisgICAgICAgYyBpcyBOVUxMLCBpbiB3aGljaCBjYXNlIGEgbWF5IGJlIG5lZ2F0aXZlLiAqLwogCi0JeiA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoMUwpOwotCWlmICh6ID09IE5VTEwpCi0JCWdvdG8gRXJyb3I7CisgICAgeiA9IChQeUxvbmdPYmplY3QgKilQeUxvbmdfRnJvbUxvbmcoMUwpOworICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgIGdvdG8gRXJyb3I7CiAKLQkvKiBQZXJmb3JtIGEgbW9kdWxhciByZWR1Y3Rpb24sIFggPSBYICUgYywgYnV0IGxlYXZlIFggYWxvbmUgaWYgYwotCSAqIGlzIE5VTEwuCi0JICovCi0jZGVmaW5lIFJFRFVDRShYKQkJCQkJXAotCWlmIChjICE9IE5VTEwpIHsJCQkJXAotCQlpZiAobF9kaXZtb2QoWCwgYywgTlVMTCwgJnRlbXApIDwgMCkJXAotCQkJZ290byBFcnJvcjsJCQlcCi0JCVB5X1hERUNSRUYoWCk7CQkJCVwKLQkJWCA9IHRlbXA7CQkJCVwKLQkJdGVtcCA9IE5VTEw7CQkJCVwKLQl9CisgICAgLyogUGVyZm9ybSBhIG1vZHVsYXIgcmVkdWN0aW9uLCBYID0gWCAlIGMsIGJ1dCBsZWF2ZSBYIGFsb25lIGlmIGMKKyAgICAgKiBpcyBOVUxMLgorICAgICAqLworI2RlZmluZSBSRURVQ0UoWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGMgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGxfZGl2bW9kKFgsIGMsIE5VTEwsICZ0ZW1wKSA8IDApICAgICAgICAgICAgXAorICAgICAgICAgICAgZ290byBFcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X1hERUNSRUYoWCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgWCA9IHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQogCi0JLyogTXVsdGlwbHkgdHdvIHZhbHVlcywgdGhlbiByZWR1Y2UgdGhlIHJlc3VsdDoKLQkgICByZXN1bHQgPSBYKlkgJSBjLiAgSWYgYyBpcyBOVUxMLCBza2lwIHRoZSBtb2QuICovCi0jZGVmaW5lIE1VTFQoWCwgWSwgcmVzdWx0KQkJCQlcCi17CQkJCQkJCVwKLQl0ZW1wID0gKFB5TG9uZ09iamVjdCAqKWxvbmdfbXVsKFgsIFkpOwkJXAotCWlmICh0ZW1wID09IE5VTEwpCQkJCVwKLQkJZ290byBFcnJvcjsJCQkJXAotCVB5X1hERUNSRUYocmVzdWx0KTsJCQkJXAotCXJlc3VsdCA9IHRlbXA7CQkJCQlcCi0JdGVtcCA9IE5VTEw7CQkJCQlcCi0JUkVEVUNFKHJlc3VsdCkJCQkJCVwKKyAgICAvKiBNdWx0aXBseSB0d28gdmFsdWVzLCB0aGVuIHJlZHVjZSB0aGUgcmVzdWx0OgorICAgICAgIHJlc3VsdCA9IFgqWSAlIGMuICBJZiBjIGlzIE5VTEwsIHNraXAgdGhlIG1vZC4gKi8KKyNkZWZpbmUgTVVMVChYLCBZLCByZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcCA9IChQeUxvbmdPYmplY3QgKilsb25nX211bChYLCBZKTsgICAgICAgICAgICAgIFwKKyAgICBpZiAodGVtcCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIEVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUHlfWERFQ1JFRihyZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXN1bHQgPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUkVEVUNFKHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAotCWlmIChQeV9TSVpFKGIpIDw9IEZJVkVBUllfQ1VUT0ZGKSB7Ci0JCS8qIExlZnQtdG8tcmlnaHQgYmluYXJ5IGV4cG9uZW50aWF0aW9uIChIQUMgQWxnb3JpdGhtIDE0Ljc5KSAqLwotCQkvKiBodHRwOi8vd3d3LmNhY3IubWF0aC51d2F0ZXJsb28uY2EvaGFjL2Fib3V0L2NoYXAxNC5wZGYgICAgKi8KLQkJZm9yIChpID0gUHlfU0laRShiKSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0JCQlkaWdpdCBiaSA9IGItPm9iX2RpZ2l0W2ldOworICAgIGlmIChQeV9TSVpFKGIpIDw9IEZJVkVBUllfQ1VUT0ZGKSB7CisgICAgICAgIC8qIExlZnQtdG8tcmlnaHQgYmluYXJ5IGV4cG9uZW50aWF0aW9uIChIQUMgQWxnb3JpdGhtIDE0Ljc5KSAqLworICAgICAgICAvKiBodHRwOi8vd3d3LmNhY3IubWF0aC51d2F0ZXJsb28uY2EvaGFjL2Fib3V0L2NoYXAxNC5wZGYgICAgKi8KKyAgICAgICAgZm9yIChpID0gUHlfU0laRShiKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBkaWdpdCBiaSA9IGItPm9iX2RpZ2l0W2ldOwogCi0JCQlmb3IgKGogPSAxIDw8IChQeUxvbmdfU0hJRlQtMSk7IGogIT0gMDsgaiA+Pj0gMSkgewotCQkJCU1VTFQoeiwgeiwgeikKLQkJCQlpZiAoYmkgJiBqKQotCQkJCQlNVUxUKHosIGEsIHopCi0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qIExlZnQtdG8tcmlnaHQgNS1hcnkgZXhwb25lbnRpYXRpb24gKEhBQyBBbGdvcml0aG0gMTQuODIpICovCi0JCVB5X0lOQ1JFRih6KTsJLyogc3RpbGwgaG9sZHMgMUwgKi8KLQkJdGFibGVbMF0gPSB6OwotCQlmb3IgKGkgPSAxOyBpIDwgMzI7ICsraSkKLQkJCU1VTFQodGFibGVbaS0xXSwgYSwgdGFibGVbaV0pCisgICAgICAgICAgICBmb3IgKGogPSAxIDw8IChQeUxvbmdfU0hJRlQtMSk7IGogIT0gMDsgaiA+Pj0gMSkgeworICAgICAgICAgICAgICAgIE1VTFQoeiwgeiwgeikKKyAgICAgICAgICAgICAgICBpZiAoYmkgJiBqKQorICAgICAgICAgICAgICAgICAgICBNVUxUKHosIGEsIHopCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIExlZnQtdG8tcmlnaHQgNS1hcnkgZXhwb25lbnRpYXRpb24gKEhBQyBBbGdvcml0aG0gMTQuODIpICovCisgICAgICAgIFB5X0lOQ1JFRih6KTsgICAgICAgICAgIC8qIHN0aWxsIGhvbGRzIDFMICovCisgICAgICAgIHRhYmxlWzBdID0gejsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDMyOyArK2kpCisgICAgICAgICAgICBNVUxUKHRhYmxlW2ktMV0sIGEsIHRhYmxlW2ldKQogCi0JCWZvciAoaSA9IFB5X1NJWkUoYikgLSAxOyBpID49IDA7IC0taSkgewotCQkJY29uc3QgZGlnaXQgYmkgPSBiLT5vYl9kaWdpdFtpXTsKKyAgICAgICAgZm9yIChpID0gUHlfU0laRShiKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgICAgICBjb25zdCBkaWdpdCBiaSA9IGItPm9iX2RpZ2l0W2ldOwogCi0JCQlmb3IgKGogPSBQeUxvbmdfU0hJRlQgLSA1OyBqID49IDA7IGogLT0gNSkgewotCQkJCWNvbnN0IGludCBpbmRleCA9IChiaSA+PiBqKSAmIDB4MWY7Ci0JCQkJZm9yIChrID0gMDsgayA8IDU7ICsraykKLQkJCQkJTVVMVCh6LCB6LCB6KQotCQkJCWlmIChpbmRleCkKLQkJCQkJTVVMVCh6LCB0YWJsZVtpbmRleF0sIHopCi0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICBmb3IgKGogPSBQeUxvbmdfU0hJRlQgLSA1OyBqID49IDA7IGogLT0gNSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IChiaSA+PiBqKSAmIDB4MWY7CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDU7ICsraykKKyAgICAgICAgICAgICAgICAgICAgTVVMVCh6LCB6LCB6KQorICAgICAgICAgICAgICAgIGlmIChpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgTVVMVCh6LCB0YWJsZVtpbmRleF0sIHopCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAobmVnYXRpdmVPdXRwdXQgJiYgKFB5X1NJWkUoeikgIT0gMCkpIHsKLQkJdGVtcCA9IChQeUxvbmdPYmplY3QgKilsb25nX3N1Yih6LCBjKTsKLQkJaWYgKHRlbXAgPT0gTlVMTCkKLQkJCWdvdG8gRXJyb3I7Ci0JCVB5X0RFQ1JFRih6KTsKLQkJeiA9IHRlbXA7Ci0JCXRlbXAgPSBOVUxMOwotCX0KLQlnb3RvIERvbmU7CisgICAgaWYgKG5lZ2F0aXZlT3V0cHV0ICYmIChQeV9TSVpFKHopICE9IDApKSB7CisgICAgICAgIHRlbXAgPSAoUHlMb25nT2JqZWN0ICopbG9uZ19zdWIoeiwgYyk7CisgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICBQeV9ERUNSRUYoeik7CisgICAgICAgIHogPSB0ZW1wOworICAgICAgICB0ZW1wID0gTlVMTDsKKyAgICB9CisgICAgZ290byBEb25lOwogCiAgRXJyb3I6Ci0gCWlmICh6ICE9IE5VTEwpIHsKLSAJCVB5X0RFQ1JFRih6KTsKLSAJCXogPSBOVUxMOwotIAl9Ci0JLyogZmFsbCB0aHJvdWdoICovCisgICAgaWYgKHogIT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoeik7CisgICAgICAgIHogPSBOVUxMOworICAgIH0KKyAgICAvKiBmYWxsIHRocm91Z2ggKi8KICBEb25lOgotCWlmIChQeV9TSVpFKGIpID4gRklWRUFSWV9DVVRPRkYpIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyOyArK2kpCi0JCQlQeV9YREVDUkVGKHRhYmxlW2ldKTsKLQl9Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlQeV9YREVDUkVGKGMpOwotCVB5X1hERUNSRUYodGVtcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXo7CisgICAgaWYgKFB5X1NJWkUoYikgPiBGSVZFQVJZX0NVVE9GRikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKKyAgICAgICAgICAgIFB5X1hERUNSRUYodGFibGVbaV0pOworICAgIH0KKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIFB5X1hERUNSRUYoYyk7CisgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopejsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfaW52ZXJ0KFB5TG9uZ09iamVjdCAqdikKIHsKLQkvKiBJbXBsZW1lbnQgfnggYXMgLSh4KzEpICovCi0JUHlMb25nT2JqZWN0ICp4OwotCVB5TG9uZ09iamVjdCAqdzsKLQl3ID0gKFB5TG9uZ09iamVjdCAqKVB5TG9uZ19Gcm9tTG9uZygxTCk7Ci0JaWYgKHcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JeCA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19hZGQodiwgdyk7Ci0JUHlfREVDUkVGKHcpOwotCWlmICh4ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X1NJWkUoeCkgPSAtKFB5X1NJWkUoeCkpOwotCXJldHVybiAoUHlPYmplY3QgKil4OworICAgIC8qIEltcGxlbWVudCB+eCBhcyAtKHgrMSkgKi8KKyAgICBQeUxvbmdPYmplY3QgKng7CisgICAgUHlMb25nT2JqZWN0ICp3OworICAgIHcgPSAoUHlMb25nT2JqZWN0ICopUHlMb25nX0Zyb21Mb25nKDFMKTsKKyAgICBpZiAodyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB4ID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX2FkZCh2LCB3KTsKKyAgICBQeV9ERUNSRUYodyk7CisgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfU0laRSh4KSA9IC0oUHlfU0laRSh4KSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXg7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX25lZyhQeUxvbmdPYmplY3QgKnYpCiB7Ci0JUHlMb25nT2JqZWN0ICp6OwotCWlmICh2LT5vYl9zaXplID09IDAgJiYgUHlMb25nX0NoZWNrRXhhY3QodikpIHsKLQkJLyogLTAgPT0gMCAqLwotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiAoUHlPYmplY3QgKikgdjsKLQl9Ci0JeiA9IChQeUxvbmdPYmplY3QgKilfUHlMb25nX0NvcHkodik7Ci0JaWYgKHogIT0gTlVMTCkKLQkJei0+b2Jfc2l6ZSA9IC0odi0+b2Jfc2l6ZSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXo7CisgICAgUHlMb25nT2JqZWN0ICp6OworICAgIGlmICh2LT5vYl9zaXplID09IDAgJiYgUHlMb25nX0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgLyogLTAgPT0gMCAqLworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKikgdjsKKyAgICB9CisgICAgeiA9IChQeUxvbmdPYmplY3QgKilfUHlMb25nX0NvcHkodik7CisgICAgaWYgKHogIT0gTlVMTCkKKyAgICAgICAgei0+b2Jfc2l6ZSA9IC0odi0+b2Jfc2l6ZSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXo7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2FicyhQeUxvbmdPYmplY3QgKnYpCiB7Ci0JaWYgKHYtPm9iX3NpemUgPCAwKQotCQlyZXR1cm4gbG9uZ19uZWcodik7Ci0JZWxzZQotCQlyZXR1cm4gbG9uZ19sb25nKChQeU9iamVjdCAqKXYpOworICAgIGlmICh2LT5vYl9zaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIGxvbmdfbmVnKHYpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGxvbmdfbG9uZygoUHlPYmplY3QgKil2KTsKIH0KIAogc3RhdGljIGludAogbG9uZ19ub256ZXJvKFB5TG9uZ09iamVjdCAqdikKIHsKLQlyZXR1cm4gQUJTKFB5X1NJWkUodikpICE9IDA7CisgICAgcmV0dXJuIEFCUyhQeV9TSVpFKHYpKSAhPSAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19yc2hpZnQoUHlMb25nT2JqZWN0ICp2LCBQeUxvbmdPYmplY3QgKncpCiB7Ci0JUHlMb25nT2JqZWN0ICphLCAqYjsKLQlQeUxvbmdPYmplY3QgKnogPSBOVUxMOwotCWxvbmcgc2hpZnRieTsKLQlQeV9zc2l6ZV90IG5ld3NpemUsIHdvcmRzaGlmdCwgbG9zaGlmdCwgaGlzaGlmdCwgaSwgajsKLQlkaWdpdCBsb21hc2ssIGhpbWFzazsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiOworICAgIFB5TG9uZ09iamVjdCAqeiA9IE5VTEw7CisgICAgbG9uZyBzaGlmdGJ5OworICAgIFB5X3NzaXplX3QgbmV3c2l6ZSwgd29yZHNoaWZ0LCBsb3NoaWZ0LCBoaXNoaWZ0LCBpLCBqOworICAgIGRpZ2l0IGxvbWFzaywgaGltYXNrOwogCi0JQ09OVkVSVF9CSU5PUCgoUHlPYmplY3QgKil2LCAoUHlPYmplY3QgKil3LCAmYSwgJmIpOworICAgIENPTlZFUlRfQklOT1AoKFB5T2JqZWN0ICopdiwgKFB5T2JqZWN0ICopdywgJmEsICZiKTsKIAotCWlmIChQeV9TSVpFKGEpIDwgMCkgewotCQkvKiBSaWdodCBzaGlmdGluZyBuZWdhdGl2ZSBudW1iZXJzIGlzIGhhcmRlciAqLwotCQlQeUxvbmdPYmplY3QgKmExLCAqYTI7Ci0JCWExID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX2ludmVydChhKTsKLQkJaWYgKGExID09IE5VTEwpCi0JCQlnb3RvIHJzaGlmdF9lcnJvcjsKLQkJYTIgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfcnNoaWZ0KGExLCBiKTsKLQkJUHlfREVDUkVGKGExKTsKLQkJaWYgKGEyID09IE5VTEwpCi0JCQlnb3RvIHJzaGlmdF9lcnJvcjsKLQkJeiA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19pbnZlcnQoYTIpOwotCQlQeV9ERUNSRUYoYTIpOwotCX0KLQllbHNlIHsKKyAgICBpZiAoUHlfU0laRShhKSA8IDApIHsKKyAgICAgICAgLyogUmlnaHQgc2hpZnRpbmcgbmVnYXRpdmUgbnVtYmVycyBpcyBoYXJkZXIgKi8KKyAgICAgICAgUHlMb25nT2JqZWN0ICphMSwgKmEyOworICAgICAgICBhMSA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19pbnZlcnQoYSk7CisgICAgICAgIGlmIChhMSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byByc2hpZnRfZXJyb3I7CisgICAgICAgIGEyID0gKFB5TG9uZ09iamVjdCAqKSBsb25nX3JzaGlmdChhMSwgYik7CisgICAgICAgIFB5X0RFQ1JFRihhMSk7CisgICAgICAgIGlmIChhMiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byByc2hpZnRfZXJyb3I7CisgICAgICAgIHogPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfaW52ZXJ0KGEyKTsKKyAgICAgICAgUHlfREVDUkVGKGEyKTsKKyAgICB9CisgICAgZWxzZSB7CiAKLQkJc2hpZnRieSA9IFB5TG9uZ19Bc0xvbmcoKFB5T2JqZWN0ICopYik7Ci0JCWlmIChzaGlmdGJ5ID09IC0xTCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJZ290byByc2hpZnRfZXJyb3I7Ci0JCWlmIChzaGlmdGJ5IDwgMCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJuZWdhdGl2ZSBzaGlmdCBjb3VudCIpOwotCQkJZ290byByc2hpZnRfZXJyb3I7Ci0JCX0KLQkJd29yZHNoaWZ0ID0gc2hpZnRieSAvIFB5TG9uZ19TSElGVDsKLQkJbmV3c2l6ZSA9IEFCUyhQeV9TSVpFKGEpKSAtIHdvcmRzaGlmdDsKLQkJaWYgKG5ld3NpemUgPD0gMCkgewotCQkJeiA9IF9QeUxvbmdfTmV3KDApOwotCQkJUHlfREVDUkVGKGEpOwotCQkJUHlfREVDUkVGKGIpOwotCQkJcmV0dXJuIChQeU9iamVjdCAqKXo7Ci0JCX0KLQkJbG9zaGlmdCA9IHNoaWZ0YnkgJSBQeUxvbmdfU0hJRlQ7Ci0JCWhpc2hpZnQgPSBQeUxvbmdfU0hJRlQgLSBsb3NoaWZ0OwotCQlsb21hc2sgPSAoKGRpZ2l0KTEgPDwgaGlzaGlmdCkgLSAxOwotCQloaW1hc2sgPSBQeUxvbmdfTUFTSyBeIGxvbWFzazsKLQkJeiA9IF9QeUxvbmdfTmV3KG5ld3NpemUpOwotCQlpZiAoeiA9PSBOVUxMKQotCQkJZ290byByc2hpZnRfZXJyb3I7Ci0JCWlmIChQeV9TSVpFKGEpIDwgMCkKLQkJCVB5X1NJWkUoeikgPSAtKFB5X1NJWkUoeikpOwotCQlmb3IgKGkgPSAwLCBqID0gd29yZHNoaWZ0OyBpIDwgbmV3c2l6ZTsgaSsrLCBqKyspIHsKLQkJCXotPm9iX2RpZ2l0W2ldID0gKGEtPm9iX2RpZ2l0W2pdID4+IGxvc2hpZnQpICYgbG9tYXNrOwotCQkJaWYgKGkrMSA8IG5ld3NpemUpCi0JCQkJei0+b2JfZGlnaXRbaV0gfD0KLQkJCQkgIChhLT5vYl9kaWdpdFtqKzFdIDw8IGhpc2hpZnQpICYgaGltYXNrOwotCQl9Ci0JCXogPSBsb25nX25vcm1hbGl6ZSh6KTsKLQl9CisgICAgICAgIHNoaWZ0YnkgPSBQeUxvbmdfQXNMb25nKChQeU9iamVjdCAqKWIpOworICAgICAgICBpZiAoc2hpZnRieSA9PSAtMUwgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIGdvdG8gcnNoaWZ0X2Vycm9yOworICAgICAgICBpZiAoc2hpZnRieSA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBzaGlmdCBjb3VudCIpOworICAgICAgICAgICAgZ290byByc2hpZnRfZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgd29yZHNoaWZ0ID0gc2hpZnRieSAvIFB5TG9uZ19TSElGVDsKKyAgICAgICAgbmV3c2l6ZSA9IEFCUyhQeV9TSVpFKGEpKSAtIHdvcmRzaGlmdDsKKyAgICAgICAgaWYgKG5ld3NpemUgPD0gMCkgeworICAgICAgICAgICAgeiA9IF9QeUxvbmdfTmV3KDApOworICAgICAgICAgICAgUHlfREVDUkVGKGEpOworICAgICAgICAgICAgUHlfREVDUkVGKGIpOworICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXo7CisgICAgICAgIH0KKyAgICAgICAgbG9zaGlmdCA9IHNoaWZ0YnkgJSBQeUxvbmdfU0hJRlQ7CisgICAgICAgIGhpc2hpZnQgPSBQeUxvbmdfU0hJRlQgLSBsb3NoaWZ0OworICAgICAgICBsb21hc2sgPSAoKGRpZ2l0KTEgPDwgaGlzaGlmdCkgLSAxOworICAgICAgICBoaW1hc2sgPSBQeUxvbmdfTUFTSyBeIGxvbWFzazsKKyAgICAgICAgeiA9IF9QeUxvbmdfTmV3KG5ld3NpemUpOworICAgICAgICBpZiAoeiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byByc2hpZnRfZXJyb3I7CisgICAgICAgIGlmIChQeV9TSVpFKGEpIDwgMCkKKyAgICAgICAgICAgIFB5X1NJWkUoeikgPSAtKFB5X1NJWkUoeikpOworICAgICAgICBmb3IgKGkgPSAwLCBqID0gd29yZHNoaWZ0OyBpIDwgbmV3c2l6ZTsgaSsrLCBqKyspIHsKKyAgICAgICAgICAgIHotPm9iX2RpZ2l0W2ldID0gKGEtPm9iX2RpZ2l0W2pdID4+IGxvc2hpZnQpICYgbG9tYXNrOworICAgICAgICAgICAgaWYgKGkrMSA8IG5ld3NpemUpCisgICAgICAgICAgICAgICAgei0+b2JfZGlnaXRbaV0gfD0KKyAgICAgICAgICAgICAgICAgIChhLT5vYl9kaWdpdFtqKzFdIDw8IGhpc2hpZnQpICYgaGltYXNrOworICAgICAgICB9CisgICAgICAgIHogPSBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICB9CiByc2hpZnRfZXJyb3I6Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIHo7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIHo7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfbHNoaWZ0KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQkvKiBUaGlzIHZlcnNpb24gZHVlIHRvIFRpbSBQZXRlcnMgKi8KLQlQeUxvbmdPYmplY3QgKmEsICpiOwotCVB5TG9uZ09iamVjdCAqeiA9IE5VTEw7Ci0JbG9uZyBzaGlmdGJ5OwotCVB5X3NzaXplX3Qgb2xkc2l6ZSwgbmV3c2l6ZSwgd29yZHNoaWZ0LCByZW1zaGlmdCwgaSwgajsKLQl0d29kaWdpdHMgYWNjdW07CisgICAgLyogVGhpcyB2ZXJzaW9uIGR1ZSB0byBUaW0gUGV0ZXJzICovCisgICAgUHlMb25nT2JqZWN0ICphLCAqYjsKKyAgICBQeUxvbmdPYmplY3QgKnogPSBOVUxMOworICAgIGxvbmcgc2hpZnRieTsKKyAgICBQeV9zc2l6ZV90IG9sZHNpemUsIG5ld3NpemUsIHdvcmRzaGlmdCwgcmVtc2hpZnQsIGksIGo7CisgICAgdHdvZGlnaXRzIGFjY3VtOwogCi0JQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOworICAgIENPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKIAotCXNoaWZ0YnkgPSBQeUxvbmdfQXNMb25nKChQeU9iamVjdCAqKWIpOwotCWlmIChzaGlmdGJ5ID09IC0xTCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlnb3RvIGxzaGlmdF9lcnJvcjsKLQlpZiAoc2hpZnRieSA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJuZWdhdGl2ZSBzaGlmdCBjb3VudCIpOwotCQlnb3RvIGxzaGlmdF9lcnJvcjsKLQl9Ci0JaWYgKChsb25nKShpbnQpc2hpZnRieSAhPSBzaGlmdGJ5KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJvdXRyYWdlb3VzIGxlZnQgc2hpZnQgY291bnQiKTsKLQkJZ290byBsc2hpZnRfZXJyb3I7Ci0JfQotCS8qIHdvcmRzaGlmdCwgcmVtc2hpZnQgPSBkaXZtb2Qoc2hpZnRieSwgUHlMb25nX1NISUZUKSAqLwotCXdvcmRzaGlmdCA9IChpbnQpc2hpZnRieSAvIFB5TG9uZ19TSElGVDsKLQlyZW1zaGlmdCAgPSAoaW50KXNoaWZ0YnkgLSB3b3Jkc2hpZnQgKiBQeUxvbmdfU0hJRlQ7CisgICAgc2hpZnRieSA9IFB5TG9uZ19Bc0xvbmcoKFB5T2JqZWN0ICopYik7CisgICAgaWYgKHNoaWZ0YnkgPT0gLTFMICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGdvdG8gbHNoaWZ0X2Vycm9yOworICAgIGlmIChzaGlmdGJ5IDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5lZ2F0aXZlIHNoaWZ0IGNvdW50Iik7CisgICAgICAgIGdvdG8gbHNoaWZ0X2Vycm9yOworICAgIH0KKyAgICBpZiAoKGxvbmcpKGludClzaGlmdGJ5ICE9IHNoaWZ0YnkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib3V0cmFnZW91cyBsZWZ0IHNoaWZ0IGNvdW50Iik7CisgICAgICAgIGdvdG8gbHNoaWZ0X2Vycm9yOworICAgIH0KKyAgICAvKiB3b3Jkc2hpZnQsIHJlbXNoaWZ0ID0gZGl2bW9kKHNoaWZ0YnksIFB5TG9uZ19TSElGVCkgKi8KKyAgICB3b3Jkc2hpZnQgPSAoaW50KXNoaWZ0YnkgLyBQeUxvbmdfU0hJRlQ7CisgICAgcmVtc2hpZnQgID0gKGludClzaGlmdGJ5IC0gd29yZHNoaWZ0ICogUHlMb25nX1NISUZUOwogCi0Jb2xkc2l6ZSA9IEFCUyhhLT5vYl9zaXplKTsKLQluZXdzaXplID0gb2xkc2l6ZSArIHdvcmRzaGlmdDsKLQlpZiAocmVtc2hpZnQpCi0JCSsrbmV3c2l6ZTsKLQl6ID0gX1B5TG9uZ19OZXcobmV3c2l6ZSk7Ci0JaWYgKHogPT0gTlVMTCkKLQkJZ290byBsc2hpZnRfZXJyb3I7Ci0JaWYgKGEtPm9iX3NpemUgPCAwKQotCQl6LT5vYl9zaXplID0gLSh6LT5vYl9zaXplKTsKLQlmb3IgKGkgPSAwOyBpIDwgd29yZHNoaWZ0OyBpKyspCi0JCXotPm9iX2RpZ2l0W2ldID0gMDsKLQlhY2N1bSA9IDA7Ci0JZm9yIChpID0gd29yZHNoaWZ0LCBqID0gMDsgaiA8IG9sZHNpemU7IGkrKywgaisrKSB7Ci0JCWFjY3VtIHw9ICh0d29kaWdpdHMpYS0+b2JfZGlnaXRbal0gPDwgcmVtc2hpZnQ7Ci0JCXotPm9iX2RpZ2l0W2ldID0gKGRpZ2l0KShhY2N1bSAmIFB5TG9uZ19NQVNLKTsKLQkJYWNjdW0gPj49IFB5TG9uZ19TSElGVDsKLQl9Ci0JaWYgKHJlbXNoaWZ0KQotCQl6LT5vYl9kaWdpdFtuZXdzaXplLTFdID0gKGRpZ2l0KWFjY3VtOwotCWVsc2UKLQkJYXNzZXJ0KCFhY2N1bSk7Ci0JeiA9IGxvbmdfbm9ybWFsaXplKHopOworICAgIG9sZHNpemUgPSBBQlMoYS0+b2Jfc2l6ZSk7CisgICAgbmV3c2l6ZSA9IG9sZHNpemUgKyB3b3Jkc2hpZnQ7CisgICAgaWYgKHJlbXNoaWZ0KQorICAgICAgICArK25ld3NpemU7CisgICAgeiA9IF9QeUxvbmdfTmV3KG5ld3NpemUpOworICAgIGlmICh6ID09IE5VTEwpCisgICAgICAgIGdvdG8gbHNoaWZ0X2Vycm9yOworICAgIGlmIChhLT5vYl9zaXplIDwgMCkKKyAgICAgICAgei0+b2Jfc2l6ZSA9IC0oei0+b2Jfc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHdvcmRzaGlmdDsgaSsrKQorICAgICAgICB6LT5vYl9kaWdpdFtpXSA9IDA7CisgICAgYWNjdW0gPSAwOworICAgIGZvciAoaSA9IHdvcmRzaGlmdCwgaiA9IDA7IGogPCBvbGRzaXplOyBpKyssIGorKykgeworICAgICAgICBhY2N1bSB8PSAodHdvZGlnaXRzKWEtPm9iX2RpZ2l0W2pdIDw8IHJlbXNoaWZ0OworICAgICAgICB6LT5vYl9kaWdpdFtpXSA9IChkaWdpdCkoYWNjdW0gJiBQeUxvbmdfTUFTSyk7CisgICAgICAgIGFjY3VtID4+PSBQeUxvbmdfU0hJRlQ7CisgICAgfQorICAgIGlmIChyZW1zaGlmdCkKKyAgICAgICAgei0+b2JfZGlnaXRbbmV3c2l6ZS0xXSA9IChkaWdpdClhY2N1bTsKKyAgICBlbHNlCisgICAgICAgIGFzc2VydCghYWNjdW0pOworICAgIHogPSBsb25nX25vcm1hbGl6ZSh6KTsKIGxzaGlmdF9lcnJvcjoKLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiAoUHlPYmplY3QgKikgejsKKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiAoUHlPYmplY3QgKikgejsKIH0KIAogCkBAIC0zMTA0LDIxNSArMzEwNCwyMTUgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfYml0d2lzZShQeUxvbmdPYmplY3QgKmEsCi0JICAgICBpbnQgb3AsICAvKiAnJicsICd8JywgJ14nICovCi0JICAgICBQeUxvbmdPYmplY3QgKmIpCisgICAgICAgICAgICAgaW50IG9wLCAgLyogJyYnLCAnfCcsICdeJyAqLworICAgICAgICAgUHlMb25nT2JqZWN0ICpiKQogewotCWRpZ2l0IG1hc2thLCBtYXNrYjsgLyogMCBvciBQeUxvbmdfTUFTSyAqLwotCWludCBuZWd6OwotCVB5X3NzaXplX3Qgc2l6ZV9hLCBzaXplX2IsIHNpemVfejsKLQlQeUxvbmdPYmplY3QgKno7Ci0JaW50IGk7Ci0JZGlnaXQgZGlnYSwgZGlnYjsKLQlQeU9iamVjdCAqdjsKKyAgICBkaWdpdCBtYXNrYSwgbWFza2I7IC8qIDAgb3IgUHlMb25nX01BU0sgKi8KKyAgICBpbnQgbmVnejsKKyAgICBQeV9zc2l6ZV90IHNpemVfYSwgc2l6ZV9iLCBzaXplX3o7CisgICAgUHlMb25nT2JqZWN0ICp6OworICAgIGludCBpOworICAgIGRpZ2l0IGRpZ2EsIGRpZ2I7CisgICAgUHlPYmplY3QgKnY7CiAKLQlpZiAoUHlfU0laRShhKSA8IDApIHsKLQkJYSA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19pbnZlcnQoYSk7Ci0JCWlmIChhID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJbWFza2EgPSBQeUxvbmdfTUFTSzsKLQl9Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRihhKTsKLQkJbWFza2EgPSAwOwotCX0KLQlpZiAoUHlfU0laRShiKSA8IDApIHsKLQkJYiA9IChQeUxvbmdPYmplY3QgKikgbG9uZ19pbnZlcnQoYik7Ci0JCWlmIChiID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihhKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCW1hc2tiID0gUHlMb25nX01BU0s7Ci0JfQotCWVsc2UgewotCQlQeV9JTkNSRUYoYik7Ci0JCW1hc2tiID0gMDsKLQl9CisgICAgaWYgKFB5X1NJWkUoYSkgPCAwKSB7CisgICAgICAgIGEgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfaW52ZXJ0KGEpOworICAgICAgICBpZiAoYSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG1hc2thID0gUHlMb25nX01BU0s7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYoYSk7CisgICAgICAgIG1hc2thID0gMDsKKyAgICB9CisgICAgaWYgKFB5X1NJWkUoYikgPCAwKSB7CisgICAgICAgIGIgPSAoUHlMb25nT2JqZWN0ICopIGxvbmdfaW52ZXJ0KGIpOworICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBtYXNrYiA9IFB5TG9uZ19NQVNLOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKGIpOworICAgICAgICBtYXNrYiA9IDA7CisgICAgfQogCi0JbmVneiA9IDA7Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgJ14nOgotCQlpZiAobWFza2EgIT0gbWFza2IpIHsKLQkJCW1hc2thIF49IFB5TG9uZ19NQVNLOwotCQkJbmVneiA9IC0xOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJyYnOgotCQlpZiAobWFza2EgJiYgbWFza2IpIHsKLQkJCW9wID0gJ3wnOwotCQkJbWFza2EgXj0gUHlMb25nX01BU0s7Ci0JCQltYXNrYiBePSBQeUxvbmdfTUFTSzsKLQkJCW5lZ3ogPSAtMTsKLQkJfQotCQlicmVhazsKLQljYXNlICd8JzoKLQkJaWYgKG1hc2thIHx8IG1hc2tiKSB7Ci0JCQlvcCA9ICcmJzsKLQkJCW1hc2thIF49IFB5TG9uZ19NQVNLOwotCQkJbWFza2IgXj0gUHlMb25nX01BU0s7Ci0JCQluZWd6ID0gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorICAgIG5lZ3ogPSAwOworICAgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlICdeJzoKKyAgICAgICAgaWYgKG1hc2thICE9IG1hc2tiKSB7CisgICAgICAgICAgICBtYXNrYSBePSBQeUxvbmdfTUFTSzsKKyAgICAgICAgICAgIG5lZ3ogPSAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgICAgaWYgKG1hc2thICYmIG1hc2tiKSB7CisgICAgICAgICAgICBvcCA9ICd8JzsKKyAgICAgICAgICAgIG1hc2thIF49IFB5TG9uZ19NQVNLOworICAgICAgICAgICAgbWFza2IgXj0gUHlMb25nX01BU0s7CisgICAgICAgICAgICBuZWd6ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnfCc6CisgICAgICAgIGlmIChtYXNrYSB8fCBtYXNrYikgeworICAgICAgICAgICAgb3AgPSAnJic7CisgICAgICAgICAgICBtYXNrYSBePSBQeUxvbmdfTUFTSzsKKyAgICAgICAgICAgIG1hc2tiIF49IFB5TG9uZ19NQVNLOworICAgICAgICAgICAgbmVneiA9IC0xOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCS8qIEpSSDogVGhlIG9yaWdpbmFsIGxvZ2ljIGhlcmUgd2FzIHRvIGFsbG9jYXRlIHRoZSByZXN1bHQgdmFsdWUgKHopCi0JICAgYXMgdGhlIGxvbmdlciBvZiB0aGUgdHdvIG9wZXJhbmRzLiAgSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUgY2FzZXMKLQkgICB3aGVyZSB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgc2hvcnRlciB0aGFuIHRoYXQ6IEFORCBvZiB0d28KLQkgICBwb3NpdGl2ZXMsIE9SIG9mIHR3byBuZWdhdGl2ZXM6IHVzZSB0aGUgc2hvcnRlciBudW1iZXIuICBBTkQgd2l0aAotCSAgIG1peGVkIHNpZ25zOiB1c2UgdGhlIHBvc2l0aXZlIG51bWJlci4gIE9SIHdpdGggbWl4ZWQgc2lnbnM6IHVzZSB0aGUKLQkgICBuZWdhdGl2ZSBudW1iZXIuICBBZnRlciB0aGUgdHJhbnNmb3JtYXRpb25zIGFib3ZlLCBvcCB3aWxsIGJlICcmJwotCSAgIGlmZiBvbmUgb2YgdGhlc2UgY2FzZXMgYXBwbGllcywgYW5kIG1hc2sgd2lsbCBiZSBub24tMCBmb3Igb3BlcmFuZHMKLQkgICB3aG9zZSBsZW5ndGggc2hvdWxkIGJlIGlnbm9yZWQuCi0JKi8KKyAgICAvKiBKUkg6IFRoZSBvcmlnaW5hbCBsb2dpYyBoZXJlIHdhcyB0byBhbGxvY2F0ZSB0aGUgcmVzdWx0IHZhbHVlICh6KQorICAgICAgIGFzIHRoZSBsb25nZXIgb2YgdGhlIHR3byBvcGVyYW5kcy4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIGNhc2VzCisgICAgICAgd2hlcmUgdGhlIHJlc3VsdCBpcyBndWFyYW50ZWVkIHRvIGJlIHNob3J0ZXIgdGhhbiB0aGF0OiBBTkQgb2YgdHdvCisgICAgICAgcG9zaXRpdmVzLCBPUiBvZiB0d28gbmVnYXRpdmVzOiB1c2UgdGhlIHNob3J0ZXIgbnVtYmVyLiAgQU5EIHdpdGgKKyAgICAgICBtaXhlZCBzaWduczogdXNlIHRoZSBwb3NpdGl2ZSBudW1iZXIuICBPUiB3aXRoIG1peGVkIHNpZ25zOiB1c2UgdGhlCisgICAgICAgbmVnYXRpdmUgbnVtYmVyLiAgQWZ0ZXIgdGhlIHRyYW5zZm9ybWF0aW9ucyBhYm92ZSwgb3Agd2lsbCBiZSAnJicKKyAgICAgICBpZmYgb25lIG9mIHRoZXNlIGNhc2VzIGFwcGxpZXMsIGFuZCBtYXNrIHdpbGwgYmUgbm9uLTAgZm9yIG9wZXJhbmRzCisgICAgICAgd2hvc2UgbGVuZ3RoIHNob3VsZCBiZSBpZ25vcmVkLgorICAgICovCiAKLQlzaXplX2EgPSBQeV9TSVpFKGEpOwotCXNpemVfYiA9IFB5X1NJWkUoYik7Ci0Jc2l6ZV96ID0gb3AgPT0gJyYnCi0JCT8gKG1hc2thCi0JCSAgID8gc2l6ZV9iCi0JCSAgIDogKG1hc2tiID8gc2l6ZV9hIDogTUlOKHNpemVfYSwgc2l6ZV9iKSkpCi0JCTogTUFYKHNpemVfYSwgc2l6ZV9iKTsKLQl6ID0gX1B5TG9uZ19OZXcoc2l6ZV96KTsKLQlpZiAoeiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihhKTsKLQkJUHlfREVDUkVGKGIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc2l6ZV9hID0gUHlfU0laRShhKTsKKyAgICBzaXplX2IgPSBQeV9TSVpFKGIpOworICAgIHNpemVfeiA9IG9wID09ICcmJworICAgICAgICA/IChtYXNrYQorICAgICAgICAgICA/IHNpemVfYgorICAgICAgICAgICA6IChtYXNrYiA/IHNpemVfYSA6IE1JTihzaXplX2EsIHNpemVfYikpKQorICAgICAgICA6IE1BWChzaXplX2EsIHNpemVfYik7CisgICAgeiA9IF9QeUxvbmdfTmV3KHNpemVfeik7CisgICAgaWYgKHogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoYSk7CisgICAgICAgIFB5X0RFQ1JFRihiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IHNpemVfejsgKytpKSB7Ci0JCWRpZ2EgPSAoaSA8IHNpemVfYSA/IGEtPm9iX2RpZ2l0W2ldIDogMCkgXiBtYXNrYTsKLQkJZGlnYiA9IChpIDwgc2l6ZV9iID8gYi0+b2JfZGlnaXRbaV0gOiAwKSBeIG1hc2tiOwotCQlzd2l0Y2ggKG9wKSB7Ci0JCWNhc2UgJyYnOiB6LT5vYl9kaWdpdFtpXSA9IGRpZ2EgJiBkaWdiOyBicmVhazsKLQkJY2FzZSAnfCc6IHotPm9iX2RpZ2l0W2ldID0gZGlnYSB8IGRpZ2I7IGJyZWFrOwotCQljYXNlICdeJzogei0+b2JfZGlnaXRbaV0gPSBkaWdhIF4gZGlnYjsgYnJlYWs7Ci0JCX0KLQl9CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVfejsgKytpKSB7CisgICAgICAgIGRpZ2EgPSAoaSA8IHNpemVfYSA/IGEtPm9iX2RpZ2l0W2ldIDogMCkgXiBtYXNrYTsKKyAgICAgICAgZGlnYiA9IChpIDwgc2l6ZV9iID8gYi0+b2JfZGlnaXRbaV0gOiAwKSBeIG1hc2tiOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgJyYnOiB6LT5vYl9kaWdpdFtpXSA9IGRpZ2EgJiBkaWdiOyBicmVhazsKKyAgICAgICAgY2FzZSAnfCc6IHotPm9iX2RpZ2l0W2ldID0gZGlnYSB8IGRpZ2I7IGJyZWFrOworICAgICAgICBjYXNlICdeJzogei0+b2JfZGlnaXRbaV0gPSBkaWdhIF4gZGlnYjsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXogPSBsb25nX25vcm1hbGl6ZSh6KTsKLQlpZiAobmVneiA9PSAwKQotCQlyZXR1cm4gKFB5T2JqZWN0ICopIHo7Ci0JdiA9IGxvbmdfaW52ZXJ0KHopOwotCVB5X0RFQ1JFRih6KTsKLQlyZXR1cm4gdjsKKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHogPSBsb25nX25vcm1hbGl6ZSh6KTsKKyAgICBpZiAobmVneiA9PSAwKQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIHo7CisgICAgdiA9IGxvbmdfaW52ZXJ0KHopOworICAgIFB5X0RFQ1JFRih6KTsKKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfYW5kKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiOwotCVB5T2JqZWN0ICpjOwotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKLQljID0gbG9uZ19iaXR3aXNlKGEsICcmJywgYik7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gYzsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiOworICAgIFB5T2JqZWN0ICpjOworICAgIENPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBjID0gbG9uZ19iaXR3aXNlKGEsICcmJywgYik7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gYzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfeG9yKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlQeUxvbmdPYmplY3QgKmEsICpiOwotCVB5T2JqZWN0ICpjOwotCUNPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKLQljID0gbG9uZ19iaXR3aXNlKGEsICdeJywgYik7Ci0JUHlfREVDUkVGKGEpOwotCVB5X0RFQ1JFRihiKTsKLQlyZXR1cm4gYzsKKyAgICBQeUxvbmdPYmplY3QgKmEsICpiOworICAgIFB5T2JqZWN0ICpjOworICAgIENPTlZFUlRfQklOT1AodiwgdywgJmEsICZiKTsKKyAgICBjID0gbG9uZ19iaXR3aXNlKGEsICdeJywgYik7CisgICAgUHlfREVDUkVGKGEpOworICAgIFB5X0RFQ1JFRihiKTsKKyAgICByZXR1cm4gYzsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfb3IoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCVB5TG9uZ09iamVjdCAqYSwgKmI7Ci0JUHlPYmplY3QgKmM7Ci0JQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOwotCWMgPSBsb25nX2JpdHdpc2UoYSwgJ3wnLCBiKTsKLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCXJldHVybiBjOworICAgIFB5TG9uZ09iamVjdCAqYSwgKmI7CisgICAgUHlPYmplY3QgKmM7CisgICAgQ09OVkVSVF9CSU5PUCh2LCB3LCAmYSwgJmIpOworICAgIGMgPSBsb25nX2JpdHdpc2UoYSwgJ3wnLCBiKTsKKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIHJldHVybiBjOwogfQogCiBzdGF0aWMgaW50CiBsb25nX2NvZXJjZShQeU9iamVjdCAqKnB2LCBQeU9iamVjdCAqKnB3KQogewotCWlmIChQeUludF9DaGVjaygqcHcpKSB7Ci0JCSpwdyA9IFB5TG9uZ19Gcm9tTG9uZyhQeUludF9BU19MT05HKCpwdykpOwotCQlpZiAoKnB3ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCVB5X0lOQ1JFRigqcHYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKCpwdykpIHsKLQkJUHlfSU5DUkVGKCpwdik7Ci0JCVB5X0lOQ1JFRigqcHcpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7IC8qIENhbid0IGRvIGl0ICovCisgICAgaWYgKFB5SW50X0NoZWNrKCpwdykpIHsKKyAgICAgICAgKnB3ID0gUHlMb25nX0Zyb21Mb25nKFB5SW50X0FTX0xPTkcoKnB3KSk7CisgICAgICAgIGlmICgqcHcgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfSU5DUkVGKCpwdik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soKnB3KSkgeworICAgICAgICBQeV9JTkNSRUYoKnB2KTsKKyAgICAgICAgUHlfSU5DUkVGKCpwdyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsgLyogQ2FuJ3QgZG8gaXQgKi8KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfbG9uZyhQeU9iamVjdCAqdikKIHsKLQlpZiAoUHlMb25nX0NoZWNrRXhhY3QodikpCi0JCVB5X0lOQ1JFRih2KTsKLQllbHNlCi0JCXYgPSBfUHlMb25nX0NvcHkoKFB5TG9uZ09iamVjdCAqKXYpOwotCXJldHVybiB2OworICAgIGlmIChQeUxvbmdfQ2hlY2tFeGFjdCh2KSkKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgIGVsc2UKKyAgICAgICAgdiA9IF9QeUxvbmdfQ29weSgoUHlMb25nT2JqZWN0ICopdik7CisgICAgcmV0dXJuIHY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2ludChQeU9iamVjdCAqdikKIHsKLQlsb25nIHg7Ci0JeCA9IFB5TG9uZ19Bc0xvbmcodik7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCWlmIChQeUxvbmdfQ2hlY2tFeGFjdCh2KSkgewotCQkJCQlQeV9JTkNSRUYodik7Ci0JCQkJCXJldHVybiB2OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXJldHVybiBfUHlMb25nX0NvcHkoKFB5TG9uZ09iamVjdCAqKXYpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CisgICAgbG9uZyB4OworICAgIHggPSBQeUxvbmdfQXNMb25nKHYpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfUHlMb25nX0NvcHkoKFB5TG9uZ09iamVjdCAqKXYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2Zsb2F0KFB5T2JqZWN0ICp2KQogewotCWRvdWJsZSByZXN1bHQ7Ci0JcmVzdWx0ID0gUHlMb25nX0FzRG91YmxlKHYpOwotCWlmIChyZXN1bHQgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHJlc3VsdCk7CisgICAgZG91YmxlIHJlc3VsdDsKKyAgICByZXN1bHQgPSBQeUxvbmdfQXNEb3VibGUodik7CisgICAgaWYgKHJlc3VsdCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUocmVzdWx0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfb2N0KFB5T2JqZWN0ICp2KQogewotCXJldHVybiBfUHlMb25nX0Zvcm1hdCh2LCA4LCAxLCAwKTsKKyAgICByZXR1cm4gX1B5TG9uZ19Gb3JtYXQodiwgOCwgMSwgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb25nX2hleChQeU9iamVjdCAqdikKIHsKLQlyZXR1cm4gX1B5TG9uZ19Gb3JtYXQodiwgMTYsIDEsIDApOworICAgIHJldHVybiBfUHlMb25nX0Zvcm1hdCh2LCAxNiwgMSwgMCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0zMzIxLDQ5ICszMzIxLDQ5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKnggPSBOVUxMOwotCWludCBiYXNlID0gLTkwOTsJCSAgICAgLyogdW5saWtlbHkhICovCi0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJ4IiwgImJhc2UiLCAwfTsKKyAgICBQeU9iamVjdCAqeCA9IE5VTEw7CisgICAgaW50IGJhc2UgPSAtOTA5OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmxpa2VseSEgKi8KKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7IngiLCAiYmFzZSIsIDB9OwogCi0JaWYgKHR5cGUgIT0gJlB5TG9uZ19UeXBlKQotCQlyZXR1cm4gbG9uZ19zdWJ0eXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsgLyogV2ltcCBvdXQgKi8KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE9pOmxvbmciLCBrd2xpc3QsCi0JCQkJCSAmeCwgJmJhc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoeCA9PSBOVUxMKQotCQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKDBMKTsKLQlpZiAoYmFzZSA9PSAtOTA5KQotCQlyZXR1cm4gUHlOdW1iZXJfTG9uZyh4KTsKLQllbHNlIGlmIChQeVN0cmluZ19DaGVjayh4KSkgewotCQkvKiBTaW5jZSBQeUxvbmdfRnJvbVN0cmluZyBkb2Vzbid0IGhhdmUgYSBsZW5ndGggcGFyYW1ldGVyLAotCQkgKiBjaGVjayBoZXJlIGZvciBwb3NzaWJsZSBOVUxzIGluIHRoZSBzdHJpbmcuICovCi0JCWNoYXIgKnN0cmluZyA9IFB5U3RyaW5nX0FTX1NUUklORyh4KTsKLQkJaWYgKHN0cmxlbihzdHJpbmcpICE9IFB5U3RyaW5nX1NpemUoeCkpIHsKLQkJCS8qIGNyZWF0ZSBhIHJlcHIoKSBvZiB0aGUgaW5wdXQgc3RyaW5nLAotCQkJICoganVzdCBsaWtlIFB5TG9uZ19Gcm9tU3RyaW5nIGRvZXMuICovCi0JCQlQeU9iamVjdCAqc3JlcHI7Ci0JCQlzcmVwciA9IFB5T2JqZWN0X1JlcHIoeCk7Ci0JCQlpZiAoc3JlcHIgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBsb25nKCkgd2l0aCBiYXNlICVkOiAlcyIsCi0JCQkgICAgIGJhc2UsIFB5U3RyaW5nX0FTX1NUUklORyhzcmVwcikpOwotCQkJUHlfREVDUkVGKHNyZXByKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBQeUxvbmdfRnJvbVN0cmluZyhQeVN0cmluZ19BU19TVFJJTkcoeCksIE5VTEwsIGJhc2UpOwotCX0KKyAgICBpZiAodHlwZSAhPSAmUHlMb25nX1R5cGUpCisgICAgICAgIHJldHVybiBsb25nX3N1YnR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOyAvKiBXaW1wIG91dCAqLworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8T2k6bG9uZyIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwgJmJhc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKDBMKTsKKyAgICBpZiAoYmFzZSA9PSAtOTA5KQorICAgICAgICByZXR1cm4gUHlOdW1iZXJfTG9uZyh4KTsKKyAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayh4KSkgeworICAgICAgICAvKiBTaW5jZSBQeUxvbmdfRnJvbVN0cmluZyBkb2Vzbid0IGhhdmUgYSBsZW5ndGggcGFyYW1ldGVyLAorICAgICAgICAgKiBjaGVjayBoZXJlIGZvciBwb3NzaWJsZSBOVUxzIGluIHRoZSBzdHJpbmcuICovCisgICAgICAgIGNoYXIgKnN0cmluZyA9IFB5U3RyaW5nX0FTX1NUUklORyh4KTsKKyAgICAgICAgaWYgKHN0cmxlbihzdHJpbmcpICE9IFB5U3RyaW5nX1NpemUoeCkpIHsKKyAgICAgICAgICAgIC8qIGNyZWF0ZSBhIHJlcHIoKSBvZiB0aGUgaW5wdXQgc3RyaW5nLAorICAgICAgICAgICAgICoganVzdCBsaWtlIFB5TG9uZ19Gcm9tU3RyaW5nIGRvZXMuICovCisgICAgICAgICAgICBQeU9iamVjdCAqc3JlcHI7CisgICAgICAgICAgICBzcmVwciA9IFB5T2JqZWN0X1JlcHIoeCk7CisgICAgICAgICAgICBpZiAoc3JlcHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAiaW52YWxpZCBsaXRlcmFsIGZvciBsb25nKCkgd2l0aCBiYXNlICVkOiAlcyIsCisgICAgICAgICAgICAgICAgIGJhc2UsIFB5U3RyaW5nX0FTX1NUUklORyhzcmVwcikpOworICAgICAgICAgICAgUHlfREVDUkVGKHNyZXByKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVN0cmluZyhQeVN0cmluZ19BU19TVFJJTkcoeCksIE5VTEwsIGJhc2UpOworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHgpKQotCQlyZXR1cm4gUHlMb25nX0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKHgpLAotCQkJCQkgIFB5VW5pY29kZV9HRVRfU0laRSh4KSwKLQkJCQkJICBiYXNlKTsKKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soeCkpCisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUoeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9TSVpFKHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UpOwogI2VuZGlmCi0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkibG9uZygpIGNhbid0IGNvbnZlcnQgbm9uLXN0cmluZyB3aXRoIGV4cGxpY2l0IGJhc2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgImxvbmcoKSBjYW4ndCBjb252ZXJ0IG5vbi1zdHJpbmcgd2l0aCBleHBsaWNpdCBiYXNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogLyogV2ltcHksIHNsb3cgYXBwcm9hY2ggdG8gdHBfbmV3IGNhbGxzIGZvciBzdWJ0eXBlcyBvZiBsb25nOgpAQCAtMzM3NCwxMjAgKzMzNzQsMTIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19zdWJ0eXBlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeUxvbmdPYmplY3QgKnRtcCwgKm5ld29iajsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlMb25nT2JqZWN0ICp0bXAsICpuZXdvYmo7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JYXNzZXJ0KFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgJlB5TG9uZ19UeXBlKSk7Ci0JdG1wID0gKFB5TG9uZ09iamVjdCAqKWxvbmdfbmV3KCZQeUxvbmdfVHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKHRtcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoUHlMb25nX0NoZWNrRXhhY3QodG1wKSk7Ci0JbiA9IFB5X1NJWkUodG1wKTsKLQlpZiAobiA8IDApCi0JCW4gPSAtbjsKLQluZXdvYmogPSAoUHlMb25nT2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgbik7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih0bXApOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXNzZXJ0KFB5TG9uZ19DaGVjayhuZXdvYmopKTsKLQlQeV9TSVpFKG5ld29iaikgPSBQeV9TSVpFKHRtcCk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJbmV3b2JqLT5vYl9kaWdpdFtpXSA9IHRtcC0+b2JfZGlnaXRbaV07Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld29iajsKKyAgICBhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlMb25nX1R5cGUpKTsKKyAgICB0bXAgPSAoUHlMb25nT2JqZWN0ICopbG9uZ19uZXcoJlB5TG9uZ19UeXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChQeUxvbmdfQ2hlY2tFeGFjdCh0bXApKTsKKyAgICBuID0gUHlfU0laRSh0bXApOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgbiA9IC1uOworICAgIG5ld29iaiA9IChQeUxvbmdPYmplY3QgKil0eXBlLT50cF9hbGxvYyh0eXBlLCBuKTsKKyAgICBpZiAobmV3b2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhc3NlcnQoUHlMb25nX0NoZWNrKG5ld29iaikpOworICAgIFB5X1NJWkUobmV3b2JqKSA9IFB5X1NJWkUodG1wKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICBuZXdvYmotPm9iX2RpZ2l0W2ldID0gdG1wLT5vYl9kaWdpdFtpXTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3b2JqOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19nZXRuZXdhcmdzKFB5TG9uZ09iamVjdCAqdikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE4pIiwgX1B5TG9uZ19Db3B5KHYpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE4pIiwgX1B5TG9uZ19Db3B5KHYpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfZ2V0TihQeUxvbmdPYmplY3QgKnYsIHZvaWQgKmNvbnRleHQpIHsKLQlyZXR1cm4gUHlMb25nX0Zyb21Mb25nKChQeV9pbnRwdHJfdCljb250ZXh0KTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKChQeV9pbnRwdHJfdCljb250ZXh0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvbmdfX2Zvcm1hdF9fKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZm9ybWF0X3NwZWM7CisgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlCeXRlc19DaGVjayhmb3JtYXRfc3BlYykpCi0JCXJldHVybiBfUHlMb25nX0Zvcm1hdEFkdmFuY2VkKHNlbGYsCi0JCQkJCSAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGZvcm1hdF9zcGVjKSwKLQkJCQkJICAgICAgUHlCeXRlc19HRVRfU0laRShmb3JtYXRfc3BlYykpOwotCWlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7Ci0JCS8qIENvbnZlcnQgZm9ybWF0X3NwZWMgdG8gYSBzdHIgKi8KLQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJUHlPYmplY3QgKnN0cl9zcGVjID0gUHlPYmplY3RfU3RyKGZvcm1hdF9zcGVjKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86X19mb3JtYXRfXyIsICZmb3JtYXRfc3BlYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeUJ5dGVzX0NoZWNrKGZvcm1hdF9zcGVjKSkKKyAgICAgICAgcmV0dXJuIF9QeUxvbmdfRm9ybWF0QWR2YW5jZWQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKGZvcm1hdF9zcGVjKSk7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhmb3JtYXRfc3BlYykpIHsKKyAgICAgICAgLyogQ29udmVydCBmb3JtYXRfc3BlYyB0byBhIHN0ciAqLworICAgICAgICBQeU9iamVjdCAqcmVzdWx0OworICAgICAgICBQeU9iamVjdCAqc3RyX3NwZWMgPSBQeU9iamVjdF9TdHIoZm9ybWF0X3NwZWMpOwogCi0JCWlmIChzdHJfc3BlYyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzdHJfc3BlYyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJcmVzdWx0ID0gX1B5TG9uZ19Gb3JtYXRBZHZhbmNlZChzZWxmLAotCQkJCQkJUHlCeXRlc19BU19TVFJJTkcoc3RyX3NwZWMpLAotCQkJCQkJUHlCeXRlc19HRVRfU0laRShzdHJfc3BlYykpOworICAgICAgICByZXN1bHQgPSBfUHlMb25nX0Zvcm1hdEFkdmFuY2VkKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc3RyX3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUoc3RyX3NwZWMpKTsKIAotCQlQeV9ERUNSRUYoc3RyX3NwZWMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyByZXF1aXJlcyBzdHIgb3IgdW5pY29kZSIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYoc3RyX3NwZWMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyByZXF1aXJlcyBzdHIgb3IgdW5pY29kZSIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19zaXplb2YoUHlMb25nT2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgcmVzOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0JcmVzID0gdi0+b2JfdHlwZS0+dHBfYmFzaWNzaXplOwotICAgICAgICBpZiAodi0+b2Jfc2l6ZSAhPSAwKQotCQlyZXMgKz0gYWJzKHYtPm9iX3NpemUpICogc2l6ZW9mKGRpZ2l0KTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKKyAgICByZXMgPSB2LT5vYl90eXBlLT50cF9iYXNpY3NpemU7CisgICAgaWYgKHYtPm9iX3NpemUgIT0gMCkKKyAgICAgICAgcmVzICs9IGFicyh2LT5vYl9zaXplKSAqIHNpemVvZihkaWdpdCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CiB9CiAKICNpZiAwCiBzdGF0aWMgUHlPYmplY3QgKgogbG9uZ19pc19maW5pdGUoUHlPYmplY3QgKnYpCiB7Ci0JUHlfUkVUVVJOX1RSVUU7CisgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5TWV0aG9kRGVmIGxvbmdfbWV0aG9kc1tdID0gewotCXsiY29uanVnYXRlIiwJKFB5Q0Z1bmN0aW9uKWxvbmdfbG9uZywJTUVUSF9OT0FSR1MsCi0JICJSZXR1cm5zIHNlbGYsIHRoZSBjb21wbGV4IGNvbmp1Z2F0ZSBvZiBhbnkgbG9uZy4ifSwKKyAgICB7ImNvbmp1Z2F0ZSIsICAgICAgIChQeUNGdW5jdGlvbilsb25nX2xvbmcsIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBzZWxmLCB0aGUgY29tcGxleCBjb25qdWdhdGUgb2YgYW55IGxvbmcuIn0sCiAjaWYgMAotCXsiaXNfZmluaXRlIiwJKFB5Q0Z1bmN0aW9uKWxvbmdfaXNfZmluaXRlLAlNRVRIX05PQVJHUywKLQkgIlJldHVybnMgYWx3YXlzIFRydWUuIn0sCisgICAgeyJpc19maW5pdGUiLCAgICAgICAoUHlDRnVuY3Rpb24pbG9uZ19pc19maW5pdGUsICAgIE1FVEhfTk9BUkdTLAorICAgICAiUmV0dXJucyBhbHdheXMgVHJ1ZS4ifSwKICNlbmRpZgotCXsiX190cnVuY19fIiwJKFB5Q0Z1bmN0aW9uKWxvbmdfbG9uZywJTUVUSF9OT0FSR1MsCi0gICAgICAgICAiVHJ1bmNhdGluZyBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi4ifSwKLQl7Il9fZ2V0bmV3YXJnc19fIiwJKFB5Q0Z1bmN0aW9uKWxvbmdfZ2V0bmV3YXJncywJTUVUSF9OT0FSR1N9LAotICAgICAgICB7Il9fZm9ybWF0X18iLCAoUHlDRnVuY3Rpb24pbG9uZ19fZm9ybWF0X18sIE1FVEhfVkFSQVJHU30sCi0JeyJfX3NpemVvZl9fIiwJKFB5Q0Z1bmN0aW9uKWxvbmdfc2l6ZW9mLCBNRVRIX05PQVJHUywKLQkgIlJldHVybnMgc2l6ZSBpbiBtZW1vcnksIGluIGJ5dGVzIn0sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fdHJ1bmNfXyIsICAgICAgIChQeUNGdW5jdGlvbilsb25nX2xvbmcsIE1FVEhfTk9BUkdTLAorICAgICAiVHJ1bmNhdGluZyBhbiBJbnRlZ3JhbCByZXR1cm5zIGl0c2VsZi4ifSwKKyAgICB7Il9fZ2V0bmV3YXJnc19fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWxvbmdfZ2V0bmV3YXJncywgICBNRVRIX05PQVJHU30sCisgICAgeyJfX2Zvcm1hdF9fIiwgKFB5Q0Z1bmN0aW9uKWxvbmdfX2Zvcm1hdF9fLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWxvbmdfc2l6ZW9mLCBNRVRIX05PQVJHUywKKyAgICAgIlJldHVybnMgc2l6ZSBpbiBtZW1vcnksIGluIGJ5dGVzIn0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeUdldFNldERlZiBsb25nX2dldHNldFtdID0gewotICAgIHsicmVhbCIsIAorICAgIHsicmVhbCIsCiAgICAgIChnZXR0ZXIpbG9uZ19sb25nLCAoc2V0dGVyKU5VTEwsCiAgICAgICJ0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIiLAogICAgICBOVUxMfSwKLSAgICB7ImltYWciLCAKKyAgICB7ImltYWciLAogICAgICAoZ2V0dGVyKWxvbmdfZ2V0TiwgKHNldHRlcilOVUxMLAogICAgICAidGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIiLAogICAgICAodm9pZCopMH0sCi0gICAgeyJudW1lcmF0b3IiLCAKKyAgICB7Im51bWVyYXRvciIsCiAgICAgIChnZXR0ZXIpbG9uZ19sb25nLCAoc2V0dGVyKU5VTEwsCiAgICAgICJ0aGUgbnVtZXJhdG9yIG9mIGEgcmF0aW9uYWwgbnVtYmVyIGluIGxvd2VzdCB0ZXJtcyIsCiAgICAgIE5VTEx9LAotICAgIHsiZGVub21pbmF0b3IiLCAKKyAgICB7ImRlbm9taW5hdG9yIiwKICAgICAgKGdldHRlcilsb25nX2dldE4sIChzZXR0ZXIpTlVMTCwKICAgICAgInRoZSBkZW5vbWluYXRvciBvZiBhIHJhdGlvbmFsIG51bWJlciBpbiBsb3dlc3QgdGVybXMiLAogICAgICAodm9pZCopMX0sCkBAIC0zNTA0LDg3ICszNTA0LDg3IEBACiBjb252ZXJ0aW5nIGEgbm9uLXN0cmluZy4iKTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBsb25nX2FzX251bWJlciA9IHsKLQkoYmluYXJ5ZnVuYykJbG9uZ19hZGQsCS8qbmJfYWRkKi8KLQkoYmluYXJ5ZnVuYykJbG9uZ19zdWIsCS8qbmJfc3VidHJhY3QqLwotCShiaW5hcnlmdW5jKQlsb25nX211bCwJLypuYl9tdWx0aXBseSovCi0JCQlsb25nX2NsYXNzaWNfZGl2LCAvKm5iX2RpdmlkZSovCi0JCQlsb25nX21vZCwJLypuYl9yZW1haW5kZXIqLwotCQkJbG9uZ19kaXZtb2QsCS8qbmJfZGl2bW9kKi8KLQkJCWxvbmdfcG93LAkvKm5iX3Bvd2VyKi8KLQkodW5hcnlmdW5jKSAJbG9uZ19uZWcsCS8qbmJfbmVnYXRpdmUqLwotCSh1bmFyeWZ1bmMpIAlsb25nX2xvbmcsCS8qdHBfcG9zaXRpdmUqLwotCSh1bmFyeWZ1bmMpIAlsb25nX2FicywJLyp0cF9hYnNvbHV0ZSovCi0JKGlucXVpcnkpCWxvbmdfbm9uemVybywJLyp0cF9ub256ZXJvKi8KLQkodW5hcnlmdW5jKQlsb25nX2ludmVydCwJLypuYl9pbnZlcnQqLwotCQkJbG9uZ19sc2hpZnQsCS8qbmJfbHNoaWZ0Ki8KLQkoYmluYXJ5ZnVuYykJbG9uZ19yc2hpZnQsCS8qbmJfcnNoaWZ0Ki8KLQkJCWxvbmdfYW5kLAkvKm5iX2FuZCovCi0JCQlsb25nX3hvciwJLypuYl94b3IqLwotCQkJbG9uZ19vciwJLypuYl9vciovCi0JCQlsb25nX2NvZXJjZSwJLypuYl9jb2VyY2UqLwotCQkJbG9uZ19pbnQsCS8qbmJfaW50Ki8KLQkJCWxvbmdfbG9uZywJLypuYl9sb25nKi8KLQkJCWxvbmdfZmxvYXQsCS8qbmJfZmxvYXQqLwotCQkJbG9uZ19vY3QsCS8qbmJfb2N0Ki8KLQkJCWxvbmdfaGV4LAkvKm5iX2hleCovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9hZGQgKi8KLQkwLAkJCQkvKiBuYl9pbnBsYWNlX3N1YnRyYWN0ICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9tdWx0aXBseSAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfZGl2aWRlICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9yZW1haW5kZXIgKi8KLQkwLAkJCQkvKiBuYl9pbnBsYWNlX3Bvd2VyICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9sc2hpZnQgKi8KLQkwLAkJCQkvKiBuYl9pbnBsYWNlX3JzaGlmdCAqLwotCTAsCQkJCS8qIG5iX2lucGxhY2VfYW5kICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV94b3IgKi8KLQkwLAkJCQkvKiBuYl9pbnBsYWNlX29yICovCi0JbG9uZ19kaXYsCQkJLyogbmJfZmxvb3JfZGl2aWRlICovCi0JbG9uZ190cnVlX2RpdmlkZSwJCS8qIG5iX3RydWVfZGl2aWRlICovCi0JMCwJCQkJLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KLQkwLAkJCQkvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCi0JbG9uZ19sb25nLAkJCS8qIG5iX2luZGV4ICovCisgICAgKGJpbmFyeWZ1bmMpICAgICAgICBsb25nX2FkZCwgICAgICAgLypuYl9hZGQqLworICAgIChiaW5hcnlmdW5jKSAgICAgICAgbG9uZ19zdWIsICAgICAgIC8qbmJfc3VidHJhY3QqLworICAgIChiaW5hcnlmdW5jKSAgICAgICAgbG9uZ19tdWwsICAgICAgIC8qbmJfbXVsdGlwbHkqLworICAgICAgICAgICAgbG9uZ19jbGFzc2ljX2RpdiwgLypuYl9kaXZpZGUqLworICAgICAgICAgICAgbG9uZ19tb2QsICAgICAgICAgICAgICAgICAgIC8qbmJfcmVtYWluZGVyKi8KKyAgICAgICAgICAgIGxvbmdfZGl2bW9kLCAgICAgICAgICAgICAgICAvKm5iX2Rpdm1vZCovCisgICAgICAgICAgICBsb25nX3BvdywgICAgICAgICAgICAgICAgICAgLypuYl9wb3dlciovCisgICAgKHVuYXJ5ZnVuYykgICAgICAgICBsb25nX25lZywgICAgICAgLypuYl9uZWdhdGl2ZSovCisgICAgKHVuYXJ5ZnVuYykgICAgICAgICBsb25nX2xvbmcsICAgICAgLyp0cF9wb3NpdGl2ZSovCisgICAgKHVuYXJ5ZnVuYykgICAgICAgICBsb25nX2FicywgICAgICAgLyp0cF9hYnNvbHV0ZSovCisgICAgKGlucXVpcnkpICAgICAgICAgICBsb25nX25vbnplcm8sICAgLyp0cF9ub256ZXJvKi8KKyAgICAodW5hcnlmdW5jKSAgICAgICAgIGxvbmdfaW52ZXJ0LCAgICAvKm5iX2ludmVydCovCisgICAgICAgICAgICBsb25nX2xzaGlmdCwgICAgICAgICAgICAgICAgLypuYl9sc2hpZnQqLworICAgIChiaW5hcnlmdW5jKSAgICAgICAgbG9uZ19yc2hpZnQsICAgIC8qbmJfcnNoaWZ0Ki8KKyAgICAgICAgICAgIGxvbmdfYW5kLCAgICAgICAgICAgICAgICAgICAvKm5iX2FuZCovCisgICAgICAgICAgICBsb25nX3hvciwgICAgICAgICAgICAgICAgICAgLypuYl94b3IqLworICAgICAgICAgICAgbG9uZ19vciwgICAgICAgICAgICAgICAgICAgIC8qbmJfb3IqLworICAgICAgICAgICAgbG9uZ19jb2VyY2UsICAgICAgICAgICAgICAgIC8qbmJfY29lcmNlKi8KKyAgICAgICAgICAgIGxvbmdfaW50LCAgICAgICAgICAgICAgICAgICAvKm5iX2ludCovCisgICAgICAgICAgICBsb25nX2xvbmcsICAgICAgICAgICAgICAgICAgLypuYl9sb25nKi8KKyAgICAgICAgICAgIGxvbmdfZmxvYXQsICAgICAgICAgICAgICAgICAvKm5iX2Zsb2F0Ki8KKyAgICAgICAgICAgIGxvbmdfb2N0LCAgICAgICAgICAgICAgICAgICAvKm5iX29jdCovCisgICAgICAgICAgICBsb25nX2hleCwgICAgICAgICAgICAgICAgICAgLypuYl9oZXgqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfYWRkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9zdWJ0cmFjdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfbXVsdGlwbHkgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2RpdmlkZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfcmVtYWluZGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9wb3dlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfbHNoaWZ0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9yc2hpZnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX2FuZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2lucGxhY2VfeG9yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9vciAqLworICAgIGxvbmdfZGl2LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iX2Zsb29yX2RpdmlkZSAqLworICAgIGxvbmdfdHJ1ZV9kaXZpZGUsICAgICAgICAgICAgICAgICAgIC8qIG5iX3RydWVfZGl2aWRlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisgICAgbG9uZ19sb25nLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmJfaW5kZXggKi8KIH07CiAKIFB5VHlwZU9iamVjdCBQeUxvbmdfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJCQkvKiBvYl9zaXplICovCi0JImxvbmciLAkJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeUxvbmdPYmplY3QpIC0gc2l6ZW9mKGRpZ2l0KSwJLyogdHBfYmFzaWNzaXplICovCi0Jc2l6ZW9mKGRpZ2l0KSwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQlsb25nX2RlYWxsb2MsCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpbG9uZ19jb21wYXJlLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQlsb25nX3JlcHIsCQkJCS8qIHRwX3JlcHIgKi8KLQkmbG9uZ19hc19udW1iZXIsCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpbG9uZ19oYXNoLAkJCS8qIHRwX2hhc2ggKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgIAkJCS8qIHRwX2NhbGwgKi8KLSAgICAgICAgbG9uZ19zdHIsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfTE9OR19TVUJDTEFTUywJLyogdHBfZmxhZ3MgKi8KLQlsb25nX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlsb25nX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCWxvbmdfZ2V0c2V0LAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JbG9uZ19uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyAgICAibG9uZyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlMb25nT2JqZWN0KSAtIHNpemVvZihkaWdpdCksICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIHNpemVvZihkaWdpdCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICBsb25nX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgKGNtcGZ1bmMpbG9uZ19jb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgbG9uZ19yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJmxvbmdfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKWxvbmdfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgbG9uZ19zdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfTE9OR19TVUJDTEFTUywgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGxvbmdfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBsb25nX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBsb25nX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgbG9uZ19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvbWV0aG9kb2JqZWN0LmMgYi9PYmplY3RzL21ldGhvZG9iamVjdC5jCmluZGV4IDY5ZDc3OTEuLjBiNjBjYTMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbWV0aG9kb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9tZXRob2RvYmplY3QuYwpAQCAtMTYsMTEzICsxNiwxMTMgQEAKIFB5T2JqZWN0ICoKIFB5Q0Z1bmN0aW9uX05ld0V4KFB5TWV0aG9kRGVmICptbCwgUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICptb2R1bGUpCiB7Ci0JUHlDRnVuY3Rpb25PYmplY3QgKm9wOwotCW9wID0gZnJlZV9saXN0OwotCWlmIChvcCAhPSBOVUxMKSB7Ci0JCWZyZWVfbGlzdCA9IChQeUNGdW5jdGlvbk9iamVjdCAqKShvcC0+bV9zZWxmKTsKLQkJUHlPYmplY3RfSU5JVChvcCwgJlB5Q0Z1bmN0aW9uX1R5cGUpOwotCQludW1mcmVlLS07Ci0JfQotCWVsc2UgewotCQlvcCA9IFB5T2JqZWN0X0dDX05ldyhQeUNGdW5jdGlvbk9iamVjdCwgJlB5Q0Z1bmN0aW9uX1R5cGUpOwotCQlpZiAob3AgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlvcC0+bV9tbCA9IG1sOwotCVB5X1hJTkNSRUYoc2VsZik7Ci0Jb3AtPm1fc2VsZiA9IHNlbGY7Ci0JUHlfWElOQ1JFRihtb2R1bGUpOwotCW9wLT5tX21vZHVsZSA9IG1vZHVsZTsKLQlfUHlPYmplY3RfR0NfVFJBQ0sob3ApOwotCXJldHVybiAoUHlPYmplY3QgKilvcDsKKyAgICBQeUNGdW5jdGlvbk9iamVjdCAqb3A7CisgICAgb3AgPSBmcmVlX2xpc3Q7CisgICAgaWYgKG9wICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZV9saXN0ID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopKG9wLT5tX3NlbGYpOworICAgICAgICBQeU9iamVjdF9JTklUKG9wLCAmUHlDRnVuY3Rpb25fVHlwZSk7CisgICAgICAgIG51bWZyZWUtLTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG9wID0gUHlPYmplY3RfR0NfTmV3KFB5Q0Z1bmN0aW9uT2JqZWN0LCAmUHlDRnVuY3Rpb25fVHlwZSk7CisgICAgICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG9wLT5tX21sID0gbWw7CisgICAgUHlfWElOQ1JFRihzZWxmKTsKKyAgICBvcC0+bV9zZWxmID0gc2VsZjsKKyAgICBQeV9YSU5DUkVGKG1vZHVsZSk7CisgICAgb3AtPm1fbW9kdWxlID0gbW9kdWxlOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW9wOwogfQogCiBQeUNGdW5jdGlvbgogUHlDRnVuY3Rpb25fR2V0RnVuY3Rpb24oUHlPYmplY3QgKm9wKQogewotCWlmICghUHlDRnVuY3Rpb25fQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgoUHlDRnVuY3Rpb25PYmplY3QgKilvcCkgLT4gbV9tbCAtPiBtbF9tZXRoOworICAgIGlmICghUHlDRnVuY3Rpb25fQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlDRnVuY3Rpb25PYmplY3QgKilvcCkgLT4gbV9tbCAtPiBtbF9tZXRoOwogfQogCiBQeU9iamVjdCAqCiBQeUNGdW5jdGlvbl9HZXRTZWxmKFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKG9wKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3ApIC0+IG1fc2VsZjsKKyAgICBpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3ApIC0+IG1fc2VsZjsKIH0KIAogaW50CiBQeUNGdW5jdGlvbl9HZXRGbGFncyhQeU9iamVjdCAqb3ApCiB7Ci0JaWYgKCFQeUNGdW5jdGlvbl9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuICgoUHlDRnVuY3Rpb25PYmplY3QgKilvcCkgLT4gbV9tbCAtPiBtbF9mbGFnczsKKyAgICBpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKG9wKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gKChQeUNGdW5jdGlvbk9iamVjdCAqKW9wKSAtPiBtX21sIC0+IG1sX2ZsYWdzOwogfQogCiBQeU9iamVjdCAqCiBQeUNGdW5jdGlvbl9DYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlDRnVuY3Rpb25PYmplY3QqIGYgPSAoUHlDRnVuY3Rpb25PYmplY3QqKWZ1bmM7Ci0JUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKTsKLQlQeU9iamVjdCAqc2VsZiA9IFB5Q0Z1bmN0aW9uX0dFVF9TRUxGKGZ1bmMpOwotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeUNGdW5jdGlvbk9iamVjdCogZiA9IChQeUNGdW5jdGlvbk9iamVjdCopZnVuYzsKKyAgICBQeUNGdW5jdGlvbiBtZXRoID0gUHlDRnVuY3Rpb25fR0VUX0ZVTkNUSU9OKGZ1bmMpOworICAgIFB5T2JqZWN0ICpzZWxmID0gUHlDRnVuY3Rpb25fR0VUX1NFTEYoZnVuYyk7CisgICAgUHlfc3NpemVfdCBzaXplOwogCi0Jc3dpdGNoIChQeUNGdW5jdGlvbl9HRVRfRkxBR1MoZnVuYykgJiB+KE1FVEhfQ0xBU1MgfCBNRVRIX1NUQVRJQyB8IE1FVEhfQ09FWElTVCkpIHsKLQljYXNlIE1FVEhfVkFSQVJHUzoKLQkJaWYgKGt3ID09IE5VTEwgfHwgUHlEaWN0X1NpemUoa3cpID09IDApCi0JCQlyZXR1cm4gKCptZXRoKShzZWxmLCBhcmcpOwotCQlicmVhazsKLQljYXNlIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFM6Ci0JY2FzZSBNRVRIX09MREFSR1MgfCBNRVRIX0tFWVdPUkRTOgotCQlyZXR1cm4gKCooUHlDRnVuY3Rpb25XaXRoS2V5d29yZHMpbWV0aCkoc2VsZiwgYXJnLCBrdyk7Ci0JY2FzZSBNRVRIX05PQVJHUzoKLQkJaWYgKGt3ID09IE5VTEwgfHwgUHlEaWN0X1NpemUoa3cpID09IDApIHsKLQkJCXNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZyk7Ci0JCQlpZiAoc2l6ZSA9PSAwKQotCQkJCXJldHVybiAoKm1ldGgpKHNlbGYsIE5VTEwpOwotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAiJS4yMDBzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglemQgZ2l2ZW4pIiwKLQkJCSAgICBmLT5tX21sLT5tbF9uYW1lLCBzaXplKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgTUVUSF9POgotCQlpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkgewotCQkJc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoYXJnKTsKLQkJCWlmIChzaXplID09IDEpCi0JCQkJcmV0dXJuICgqbWV0aCkoc2VsZiwgUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApKTsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgIiUuMjAwcygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICglemQgZ2l2ZW4pIiwKLQkJCSAgICBmLT5tX21sLT5tbF9uYW1lLCBzaXplKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgTUVUSF9PTERBUkdTOgotCQkvKiB0aGUgcmVhbGx5IG9sZCBzdHlsZSAqLwotCQlpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkgewotCQkJc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoYXJnKTsKLQkJCWlmIChzaXplID09IDEpCi0JCQkJYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmcsIDApOwotCQkJZWxzZSBpZiAoc2l6ZSA9PSAwKQotCQkJCWFyZyA9IE5VTEw7Ci0JCQlyZXR1cm4gKCptZXRoKShzZWxmLCBhcmcpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiUuMjAwcygpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIiwKLQkJICAgICBmLT5tX21sLT5tbF9uYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBzd2l0Y2ggKFB5Q0Z1bmN0aW9uX0dFVF9GTEFHUyhmdW5jKSAmIH4oTUVUSF9DTEFTUyB8IE1FVEhfU1RBVElDIHwgTUVUSF9DT0VYSVNUKSkgeworICAgIGNhc2UgTUVUSF9WQVJBUkdTOgorICAgICAgICBpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAoKm1ldGgpKHNlbGYsIGFyZyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUzoKKyAgICBjYXNlIE1FVEhfT0xEQVJHUyB8IE1FVEhfS0VZV09SRFM6CisgICAgICAgIHJldHVybiAoKihQeUNGdW5jdGlvbldpdGhLZXl3b3JkcyltZXRoKShzZWxmLCBhcmcsIGt3KTsKKyAgICBjYXNlIE1FVEhfTk9BUkdTOgorICAgICAgICBpZiAoa3cgPT0gTlVMTCB8fCBQeURpY3RfU2l6ZShrdykgPT0gMCkgeworICAgICAgICAgICAgc2l6ZSA9IFB5VHVwbGVfR0VUX1NJWkUoYXJnKTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuICgqbWV0aCkoc2VsZiwgTlVMTCk7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBubyBhcmd1bWVudHMgKCV6ZCBnaXZlbikiLAorICAgICAgICAgICAgICAgIGYtPm1fbWwtPm1sX25hbWUsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRVRIX086CisgICAgICAgIGlmIChrdyA9PSBOVUxMIHx8IFB5RGljdF9TaXplKGt3KSA9PSAwKSB7CisgICAgICAgICAgICBzaXplID0gUHlUdXBsZV9HRVRfU0laRShhcmcpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKCptZXRoKShzZWxmLCBQeVR1cGxlX0dFVF9JVEVNKGFyZywgMCkpOworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiJS4yMDBzKCkgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQgKCV6ZCBnaXZlbikiLAorICAgICAgICAgICAgICAgIGYtPm1fbWwtPm1sX25hbWUsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRVRIX09MREFSR1M6CisgICAgICAgIC8qIHRoZSByZWFsbHkgb2xkIHN0eWxlICovCisgICAgICAgIGlmIChrdyA9PSBOVUxMIHx8IFB5RGljdF9TaXplKGt3KSA9PSAwKSB7CisgICAgICAgICAgICBzaXplID0gUHlUdXBsZV9HRVRfU0laRShhcmcpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKKyAgICAgICAgICAgICAgICBhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZywgMCk7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplID09IDApCisgICAgICAgICAgICAgICAgYXJnID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAoKm1ldGgpKHNlbGYsIGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJS4yMDBzKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHMiLAorICAgICAgICAgICAgICAgICBmLT5tX21sLT5tbF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogTWV0aG9kcyAodGhlIHN0YW5kYXJkIGJ1aWx0LWluIG1ldGhvZHMsIHRoYXQgaXMpICovCkBAIC0xMzAsMTg3ICsxMzAsMTg3IEBACiBzdGF0aWMgdm9pZAogbWV0aF9kZWFsbG9jKFB5Q0Z1bmN0aW9uT2JqZWN0ICptKQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKG0pOwotCVB5X1hERUNSRUYobS0+bV9zZWxmKTsKLQlQeV9YREVDUkVGKG0tPm1fbW9kdWxlKTsKLQlpZiAobnVtZnJlZSA8IFB5Q0Z1bmN0aW9uX01BWEZSRUVMSVNUKSB7Ci0JCW0tPm1fc2VsZiA9IChQeU9iamVjdCAqKWZyZWVfbGlzdDsKLQkJZnJlZV9saXN0ID0gbTsKLQkJbnVtZnJlZSsrOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3RfR0NfRGVsKG0pOwotCX0KKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhtKTsKKyAgICBQeV9YREVDUkVGKG0tPm1fc2VsZik7CisgICAgUHlfWERFQ1JFRihtLT5tX21vZHVsZSk7CisgICAgaWYgKG51bWZyZWUgPCBQeUNGdW5jdGlvbl9NQVhGUkVFTElTVCkgeworICAgICAgICBtLT5tX3NlbGYgPSAoUHlPYmplY3QgKilmcmVlX2xpc3Q7CisgICAgICAgIGZyZWVfbGlzdCA9IG07CisgICAgICAgIG51bWZyZWUrKzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChtKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRoX2dldF9fZG9jX18oUHlDRnVuY3Rpb25PYmplY3QgKm0sIHZvaWQgKmNsb3N1cmUpCiB7Ci0JY29uc3QgY2hhciAqZG9jID0gbS0+bV9tbC0+bWxfZG9jOworICAgIGNvbnN0IGNoYXIgKmRvYyA9IG0tPm1fbWwtPm1sX2RvYzsKIAotCWlmIChkb2MgIT0gTlVMTCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoZG9jKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGRvYyAhPSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ldGhfZ2V0X19uYW1lX18oUHlDRnVuY3Rpb25PYmplY3QgKm0sIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobS0+bV9tbC0+bWxfbmFtZSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcobS0+bV9tbC0+bWxfbmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQKIG1ldGhfdHJhdmVyc2UoUHlDRnVuY3Rpb25PYmplY3QgKm0sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKG0tPm1fc2VsZik7Ci0JUHlfVklTSVQobS0+bV9tb2R1bGUpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKG0tPm1fc2VsZik7CisgICAgUHlfVklTSVQobS0+bV9tb2R1bGUpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWV0aF9nZXRfX3NlbGZfXyhQeUNGdW5jdGlvbk9iamVjdCAqbSwgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJIm1ldGhvZC5fX3NlbGZfXyBub3QgYWNjZXNzaWJsZSBpbiByZXN0cmljdGVkIG1vZGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNlbGYgPSBtLT5tX3NlbGY7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJc2VsZiA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKHNlbGYpOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmIChQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAibWV0aG9kLl9fc2VsZl9fIG5vdCBhY2Nlc3NpYmxlIGluIHJlc3RyaWN0ZWQgbW9kZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc2VsZiA9IG0tPm1fc2VsZjsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICBzZWxmID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBtZXRoX2dldHNldHMgW10gPSB7Ci0JeyJfX2RvY19fIiwgIChnZXR0ZXIpbWV0aF9nZXRfX2RvY19fLCAgTlVMTCwgTlVMTH0sCi0JeyJfX25hbWVfXyIsIChnZXR0ZXIpbWV0aF9nZXRfX25hbWVfXywgTlVMTCwgTlVMTH0sCi0JeyJfX3NlbGZfXyIsIChnZXR0ZXIpbWV0aF9nZXRfX3NlbGZfXywgTlVMTCwgTlVMTH0sCi0JezB9CisgICAgeyJfX2RvY19fIiwgIChnZXR0ZXIpbWV0aF9nZXRfX2RvY19fLCAgTlVMTCwgTlVMTH0sCisgICAgeyJfX25hbWVfXyIsIChnZXR0ZXIpbWV0aF9nZXRfX25hbWVfXywgTlVMTCwgTlVMTH0sCisgICAgeyJfX3NlbGZfXyIsIChnZXR0ZXIpbWV0aF9nZXRfX3NlbGZfXywgTlVMTCwgTlVMTH0sCisgICAgezB9CiB9OwogCiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeUNGdW5jdGlvbk9iamVjdCwgeCkKIAogc3RhdGljIFB5TWVtYmVyRGVmIG1ldGhfbWVtYmVyc1tdID0gewotCXsiX19tb2R1bGVfXyIsICAgIFRfT0JKRUNULCAgICAgT0ZGKG1fbW9kdWxlKSwgUFlfV1JJVEVfUkVTVFJJQ1RFRH0sCi0Je05VTEx9CisgICAgeyJfX21vZHVsZV9fIiwgICAgVF9PQkpFQ1QsICAgICBPRkYobV9tb2R1bGUpLCBQWV9XUklURV9SRVNUUklDVEVEfSwKKyAgICB7TlVMTH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRoX3JlcHIoUHlDRnVuY3Rpb25PYmplY3QgKm0pCiB7Ci0JaWYgKG0tPm1fc2VsZiA9PSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGJ1aWx0LWluIGZ1bmN0aW9uICVzPiIsCi0JCQkJCSAgIG0tPm1fbWwtPm1sX25hbWUpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8YnVpbHQtaW4gbWV0aG9kICVzIG9mICVzIG9iamVjdCBhdCAlcD4iLAotCQkJCSAgIG0tPm1fbWwtPm1sX25hbWUsCi0JCQkJICAgbS0+bV9zZWxmLT5vYl90eXBlLT50cF9uYW1lLAotCQkJCSAgIG0tPm1fc2VsZik7CisgICAgaWYgKG0tPm1fc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPGJ1aWx0LWluIGZ1bmN0aW9uICVzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1fbWwtPm1sX25hbWUpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8YnVpbHQtaW4gbWV0aG9kICVzIG9mICVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1fbWwtPm1sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+bV9zZWxmLT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPm1fc2VsZik7CiB9CiAKIHN0YXRpYyBpbnQKIG1ldGhfY29tcGFyZShQeUNGdW5jdGlvbk9iamVjdCAqYSwgUHlDRnVuY3Rpb25PYmplY3QgKmIpCiB7Ci0JaWYgKGEtPm1fc2VsZiAhPSBiLT5tX3NlbGYpCi0JCXJldHVybiAoYS0+bV9zZWxmIDwgYi0+bV9zZWxmKSA/IC0xIDogMTsKLQlpZiAoYS0+bV9tbC0+bWxfbWV0aCA9PSBiLT5tX21sLT5tbF9tZXRoKQotCQlyZXR1cm4gMDsKLQlpZiAoc3RyY21wKGEtPm1fbWwtPm1sX25hbWUsIGItPm1fbWwtPm1sX25hbWUpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWVsc2UKLQkJcmV0dXJuIDE7CisgICAgaWYgKGEtPm1fc2VsZiAhPSBiLT5tX3NlbGYpCisgICAgICAgIHJldHVybiAoYS0+bV9zZWxmIDwgYi0+bV9zZWxmKSA/IC0xIDogMTsKKyAgICBpZiAoYS0+bV9tbC0+bWxfbWV0aCA9PSBiLT5tX21sLT5tbF9tZXRoKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc3RyY21wKGEtPm1fbWwtPm1sX25hbWUsIGItPm1fbWwtPm1sX25hbWUpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtZXRoX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKIHsKLQlQeUNGdW5jdGlvbk9iamVjdCAqYSwgKmI7Ci0JUHlPYmplY3QgKnJlczsKLQlpbnQgZXE7CisgICAgUHlDRnVuY3Rpb25PYmplY3QgKmEsICpiOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgaW50IGVxOwogCi0JaWYgKG9wICE9IFB5X0VRICYmIG9wICE9IFB5X05FKSB7Ci0JCS8qIFB5M0sgd2FybmluZyBpZiBjb21wYXJpc29uIGlzbid0ID09IG9yICE9LiAgKi8KLQkJaWYgKFB5RXJyX1dhcm5QeTNrKCJidWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZCBvcmRlciAiCi0JCQkJICAgImNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIGlmIChvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSkgeworICAgICAgICAvKiBQeTNLIHdhcm5pbmcgaWYgY29tcGFyaXNvbiBpc24ndCA9PSBvciAhPS4gICovCisgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygiYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2Qgb3JkZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JZWxzZSBpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKHNlbGYpIHx8ICFQeUNGdW5jdGlvbl9DaGVjayhvdGhlcikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlhID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopc2VsZjsKLQliID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3RoZXI7Ci0JZXEgPSBhLT5tX3NlbGYgPT0gYi0+bV9zZWxmOwotCWlmIChlcSkKLQkJZXEgPSBhLT5tX21sLT5tbF9tZXRoID09IGItPm1fbWwtPm1sX21ldGg7Ci0JaWYgKG9wID09IFB5X0VRKQotCQlyZXMgPSBlcSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQllbHNlCi0JCXJlcyA9IGVxID8gUHlfRmFsc2UgOiBQeV9UcnVlOwotCVB5X0lOQ1JFRihyZXMpOwotCXJldHVybiByZXM7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoIVB5Q0Z1bmN0aW9uX0NoZWNrKHNlbGYpIHx8ICFQeUNGdW5jdGlvbl9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICBhID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopc2VsZjsKKyAgICBiID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopb3RoZXI7CisgICAgZXEgPSBhLT5tX3NlbGYgPT0gYi0+bV9zZWxmOworICAgIGlmIChlcSkKKyAgICAgICAgZXEgPSBhLT5tX21sLT5tbF9tZXRoID09IGItPm1fbWwtPm1sX21ldGg7CisgICAgaWYgKG9wID09IFB5X0VRKQorICAgICAgICByZXMgPSBlcSA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGVxID8gUHlfRmFsc2UgOiBQeV9UcnVlOworICAgIFB5X0lOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBsb25nCiBtZXRoX2hhc2goUHlDRnVuY3Rpb25PYmplY3QgKmEpCiB7Ci0JbG9uZyB4LHk7Ci0JaWYgKGEtPm1fc2VsZiA9PSBOVUxMKQotCQl4ID0gMDsKLQllbHNlIHsKLQkJeCA9IFB5T2JqZWN0X0hhc2goYS0+bV9zZWxmKTsKLQkJaWYgKHggPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXkgPSBfUHlfSGFzaFBvaW50ZXIoKHZvaWQqKShhLT5tX21sLT5tbF9tZXRoKSk7Ci0JaWYgKHkgPT0gLTEpCi0JCXJldHVybiAtMTsKLQl4IF49IHk7Ci0JaWYgKHggPT0gLTEpCi0JCXggPSAtMjsKLQlyZXR1cm4geDsKKyAgICBsb25nIHgseTsKKyAgICBpZiAoYS0+bV9zZWxmID09IE5VTEwpCisgICAgICAgIHggPSAwOworICAgIGVsc2UgeworICAgICAgICB4ID0gUHlPYmplY3RfSGFzaChhLT5tX3NlbGYpOworICAgICAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeSA9IF9QeV9IYXNoUG9pbnRlcigodm9pZCopKGEtPm1fbWwtPm1sX21ldGgpKTsKKyAgICBpZiAoeSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHggXj0geTsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgeCA9IC0yOworICAgIHJldHVybiB4OwogfQogCiAKIFB5VHlwZU9iamVjdCBQeUNGdW5jdGlvbl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImJ1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kIiwKLQlzaXplb2YoUHlDRnVuY3Rpb25PYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3IpbWV0aF9kZWFsbG9jLCAJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JKGNtcGZ1bmMpbWV0aF9jb21wYXJlLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpbWV0aF9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpbWV0aF9oYXNoLAkJCS8qIHRwX2hhc2ggKi8KLQlQeUNGdW5jdGlvbl9DYWxsLAkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KLSAJMCwJCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKW1ldGhfdHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCW1ldGhfcmljaGNvbXBhcmUsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pdGVyICovCi0JMCwJCQkJCS8qIHRwX2l0ZXJuZXh0ICovCi0JMCwJCQkJCS8qIHRwX21ldGhvZHMgKi8KLQltZXRoX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQltZXRoX2dldHNldHMsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJidWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZCIsCisgICAgc2l6ZW9mKFB5Q0Z1bmN0aW9uT2JqZWN0KSwKKyAgICAwLAorICAgIChkZXN0cnVjdG9yKW1ldGhfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAoY21wZnVuYyltZXRoX2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpbWV0aF9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpbWV0aF9oYXNoLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICBQeUNGdW5jdGlvbl9DYWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpbWV0aF90cmF2ZXJzZSwgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgbWV0aF9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIG1ldGhfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIG1ldGhfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCiB9OwogCiAvKiBMaXN0IGFsbCBtZXRob2RzIGluIGEgY2hhaW4gLS0gaGVscGVyIGZvciBmaW5kbWV0aG9kaW5jaGFpbiAqLwpAQCAtMzE4LDMyICszMTgsMzIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0bWV0aG9kY2hhaW4oUHlNZXRob2RDaGFpbiAqY2hhaW4pCiB7Ci0JUHlNZXRob2RDaGFpbiAqYzsKLQlQeU1ldGhvZERlZiAqbWw7Ci0JaW50IGksIG47Ci0JUHlPYmplY3QgKnY7CisgICAgUHlNZXRob2RDaGFpbiAqYzsKKyAgICBQeU1ldGhvZERlZiAqbWw7CisgICAgaW50IGksIG47CisgICAgUHlPYmplY3QgKnY7CiAKLQluID0gMDsKLQlmb3IgKGMgPSBjaGFpbjsgYyAhPSBOVUxMOyBjID0gYy0+bGluaykgewotCQlmb3IgKG1sID0gYy0+bWV0aG9kczsgbWwtPm1sX25hbWUgIT0gTlVMTDsgbWwrKykKLQkJCW4rKzsKLQl9Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaSA9IDA7Ci0JZm9yIChjID0gY2hhaW47IGMgIT0gTlVMTDsgYyA9IGMtPmxpbmspIHsKLQkJZm9yIChtbCA9IGMtPm1ldGhvZHM7IG1sLT5tbF9uYW1lICE9IE5VTEw7IG1sKyspIHsKLQkJCVB5TGlzdF9TZXRJdGVtKHYsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcobWwtPm1sX25hbWUpKTsKLQkJCWkrKzsKLQkJfQotCX0KLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeUxpc3RfU29ydCh2KTsKLQlyZXR1cm4gdjsKKyAgICBuID0gMDsKKyAgICBmb3IgKGMgPSBjaGFpbjsgYyAhPSBOVUxMOyBjID0gYy0+bGluaykgeworICAgICAgICBmb3IgKG1sID0gYy0+bWV0aG9kczsgbWwtPm1sX25hbWUgIT0gTlVMTDsgbWwrKykKKyAgICAgICAgICAgIG4rKzsKKyAgICB9CisgICAgdiA9IFB5TGlzdF9OZXcobik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaSA9IDA7CisgICAgZm9yIChjID0gY2hhaW47IGMgIT0gTlVMTDsgYyA9IGMtPmxpbmspIHsKKyAgICAgICAgZm9yIChtbCA9IGMtPm1ldGhvZHM7IG1sLT5tbF9uYW1lICE9IE5VTEw7IG1sKyspIHsKKyAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKHYsIGksIFB5U3RyaW5nX0Zyb21TdHJpbmcobWwtPm1sX25hbWUpKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeUxpc3RfU29ydCh2KTsKKyAgICByZXR1cm4gdjsKIH0KIAogLyogRmluZCBhIG1ldGhvZCBpbiBhIG1ldGhvZCBjaGFpbiAqLwpAQCAtMzUxLDMxICszNTEsMzEgQEAKIFB5T2JqZWN0ICoKIFB5X0ZpbmRNZXRob2RJbkNoYWluKFB5TWV0aG9kQ2hhaW4gKmNoYWluLCBQeU9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnXycpIHsKLQkJaWYgKHN0cmNtcChuYW1lLCAiX19tZXRob2RzX18iKSA9PSAwKSB7Ci0JCQlpZiAoUHlFcnJfV2FyblB5M2soIl9fbWV0aG9kc19fIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwKLQkJCQkJICAgMSkgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQkJcmV0dXJuIGxpc3RtZXRob2RjaGFpbihjaGFpbik7Ci0JCX0KLQkJaWYgKHN0cmNtcChuYW1lLCAiX19kb2NfXyIpID09IDApIHsKLQkJCWNvbnN0IGNoYXIgKmRvYyA9IHNlbGYtPm9iX3R5cGUtPnRwX2RvYzsKLQkJCWlmIChkb2MgIT0gTlVMTCkKLQkJCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2MpOwotCQl9Ci0JfQotCXdoaWxlIChjaGFpbiAhPSBOVUxMKSB7Ci0JCVB5TWV0aG9kRGVmICptbCA9IGNoYWluLT5tZXRob2RzOwotCQlmb3IgKDsgbWwtPm1sX25hbWUgIT0gTlVMTDsgbWwrKykgewotCQkJaWYgKG5hbWVbMF0gPT0gbWwtPm1sX25hbWVbMF0gJiYKLQkJCSAgICBzdHJjbXAobmFtZSsxLCBtbC0+bWxfbmFtZSsxKSA9PSAwKQotCQkJCS8qIFhYWCAqLwotCQkJCXJldHVybiBQeUNGdW5jdGlvbl9OZXcobWwsIHNlbGYpOwotCQl9Ci0JCWNoYWluID0gY2hhaW4tPmxpbms7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gPT0gJ18nKSB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgIl9fbWV0aG9kc19fIikgPT0gMCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJfX21ldGhvZHNfXyBub3Qgc3VwcG9ydGVkIGluIDMueCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIGxpc3RtZXRob2RjaGFpbihjaGFpbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAiX19kb2NfXyIpID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRvYyA9IHNlbGYtPm9iX3R5cGUtPnRwX2RvYzsKKyAgICAgICAgICAgIGlmIChkb2MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2MpOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlIChjaGFpbiAhPSBOVUxMKSB7CisgICAgICAgIFB5TWV0aG9kRGVmICptbCA9IGNoYWluLT5tZXRob2RzOworICAgICAgICBmb3IgKDsgbWwtPm1sX25hbWUgIT0gTlVMTDsgbWwrKykgeworICAgICAgICAgICAgaWYgKG5hbWVbMF0gPT0gbWwtPm1sX25hbWVbMF0gJiYKKyAgICAgICAgICAgICAgICBzdHJjbXAobmFtZSsxLCBtbC0+bWxfbmFtZSsxKSA9PSAwKQorICAgICAgICAgICAgICAgIC8qIFhYWCAqLworICAgICAgICAgICAgICAgIHJldHVybiBQeUNGdW5jdGlvbl9OZXcobWwsIHNlbGYpOworICAgICAgICB9CisgICAgICAgIGNoYWluID0gY2hhaW4tPmxpbms7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIEZpbmQgYSBtZXRob2QgaW4gYSBzaW5nbGUgbWV0aG9kIGxpc3QgKi8KQEAgLTM4MywxMCArMzgzLDEwIEBACiBQeU9iamVjdCAqCiBQeV9GaW5kTWV0aG9kKFB5TWV0aG9kRGVmICptZXRob2RzLCBQeU9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeU1ldGhvZENoYWluIGNoYWluOwotCWNoYWluLm1ldGhvZHMgPSBtZXRob2RzOwotCWNoYWluLmxpbmsgPSBOVUxMOwotCXJldHVybiBQeV9GaW5kTWV0aG9kSW5DaGFpbigmY2hhaW4sIHNlbGYsIG5hbWUpOworICAgIFB5TWV0aG9kQ2hhaW4gY2hhaW47CisgICAgY2hhaW4ubWV0aG9kcyA9IG1ldGhvZHM7CisgICAgY2hhaW4ubGluayA9IE5VTEw7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2RJbkNoYWluKCZjaGFpbiwgc2VsZiwgbmFtZSk7CiB9CiAKIC8qIENsZWFyIG91dCB0aGUgZnJlZSBsaXN0ICovCkBAIC0zOTQsMjIgKzM5NCwyMiBAQAogaW50CiBQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0KHZvaWQpCiB7Ci0JaW50IGZyZWVsaXN0X3NpemUgPSBudW1mcmVlOwotCQotCXdoaWxlIChmcmVlX2xpc3QpIHsKLQkJUHlDRnVuY3Rpb25PYmplY3QgKnYgPSBmcmVlX2xpc3Q7Ci0JCWZyZWVfbGlzdCA9IChQeUNGdW5jdGlvbk9iamVjdCAqKSh2LT5tX3NlbGYpOwotCQlQeU9iamVjdF9HQ19EZWwodik7Ci0JCW51bWZyZWUtLTsKLQl9Ci0JYXNzZXJ0KG51bWZyZWUgPT0gMCk7Ci0JcmV0dXJuIGZyZWVsaXN0X3NpemU7CisgICAgaW50IGZyZWVsaXN0X3NpemUgPSBudW1mcmVlOworCisgICAgd2hpbGUgKGZyZWVfbGlzdCkgeworICAgICAgICBQeUNGdW5jdGlvbk9iamVjdCAqdiA9IGZyZWVfbGlzdDsKKyAgICAgICAgZnJlZV9saXN0ID0gKFB5Q0Z1bmN0aW9uT2JqZWN0ICopKHYtPm1fc2VsZik7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbCh2KTsKKyAgICAgICAgbnVtZnJlZS0tOworICAgIH0KKyAgICBhc3NlcnQobnVtZnJlZSA9PSAwKTsKKyAgICByZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKIH0KIAogdm9pZAogUHlDRnVuY3Rpb25fRmluaSh2b2lkKQogewotCSh2b2lkKVB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3QoKTsKKyAgICAodm9pZClQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0KCk7CiB9CiAKIC8qIFB5Q0Z1bmN0aW9uX05ldygpIGlzIG5vdyBqdXN0IGEgbWFjcm8gdGhhdCBjYWxscyBQeUNGdW5jdGlvbl9OZXdFeCgpLApAQCAtNDIzLDUgKzQyMyw1IEBACiBQeU9iamVjdCAqCiBQeUNGdW5jdGlvbl9OZXcoUHlNZXRob2REZWYgKm1sLCBQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlDRnVuY3Rpb25fTmV3RXgobWwsIHNlbGYsIE5VTEwpOworICAgIHJldHVybiBQeUNGdW5jdGlvbl9OZXdFeChtbCwgc2VsZiwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL21vZHVsZW9iamVjdC5jIGIvT2JqZWN0cy9tb2R1bGVvYmplY3QuYwppbmRleCBkMWFhNzcxLi4wOGU5NzQwIDEwMDY0NAotLS0gYS9PYmplY3RzL21vZHVsZW9iamVjdC5jCisrKyBiL09iamVjdHMvbW9kdWxlb2JqZWN0LmMKQEAgLTUsMTQ0ICs1LDE0NCBAQAogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVB5T2JqZWN0ICptZF9kaWN0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqbWRfZGljdDsKIH0gUHlNb2R1bGVPYmplY3Q7CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBtb2R1bGVfbWVtYmVyc1tdID0gewotCXsiX19kaWN0X18iLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlNb2R1bGVPYmplY3QsIG1kX2RpY3QpLCBSRUFET05MWX0sCi0JezB9CisgICAgeyJfX2RpY3RfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeU1vZHVsZU9iamVjdCwgbWRfZGljdCksIFJFQURPTkxZfSwKKyAgICB7MH0KIH07CiAKIFB5T2JqZWN0ICoKIFB5TW9kdWxlX05ldyhjb25zdCBjaGFyICpuYW1lKQogewotCVB5TW9kdWxlT2JqZWN0ICptOwotCVB5T2JqZWN0ICpuYW1lb2JqOwotCW0gPSBQeU9iamVjdF9HQ19OZXcoUHlNb2R1bGVPYmplY3QsICZQeU1vZHVsZV9UeXBlKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQluYW1lb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKLQltLT5tZF9kaWN0ID0gUHlEaWN0X05ldygpOwotCWlmIChtLT5tZF9kaWN0ID09IE5VTEwgfHwgbmFtZW9iaiA9PSBOVUxMKQotCQlnb3RvIGZhaWw7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG0tPm1kX2RpY3QsICJfX25hbWVfXyIsIG5hbWVvYmopICE9IDApCi0JCWdvdG8gZmFpbDsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobS0+bWRfZGljdCwgIl9fZG9jX18iLCBQeV9Ob25lKSAhPSAwKQotCQlnb3RvIGZhaWw7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG0tPm1kX2RpY3QsICJfX3BhY2thZ2VfXyIsIFB5X05vbmUpICE9IDApCi0JCWdvdG8gZmFpbDsKLQlQeV9ERUNSRUYobmFtZW9iaik7Ci0JUHlPYmplY3RfR0NfVHJhY2sobSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW07CisgICAgUHlNb2R1bGVPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm5hbWVvYmo7CisgICAgbSA9IFB5T2JqZWN0X0dDX05ldyhQeU1vZHVsZU9iamVjdCwgJlB5TW9kdWxlX1R5cGUpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5hbWVvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgIG0tPm1kX2RpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKG0tPm1kX2RpY3QgPT0gTlVMTCB8fCBuYW1lb2JqID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobS0+bWRfZGljdCwgIl9fbmFtZV9fIiwgbmFtZW9iaikgIT0gMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtLT5tZF9kaWN0LCAiX19kb2NfXyIsIFB5X05vbmUpICE9IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobS0+bWRfZGljdCwgIl9fcGFja2FnZV9fIiwgUHlfTm9uZSkgIT0gMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIFB5X0RFQ1JFRihuYW1lb2JqKTsKKyAgICBQeU9iamVjdF9HQ19UcmFjayhtKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbTsKIAogIGZhaWw6Ci0JUHlfWERFQ1JFRihuYW1lb2JqKTsKLQlQeV9ERUNSRUYobSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihuYW1lb2JqKTsKKyAgICBQeV9ERUNSRUYobSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5TW9kdWxlX0dldERpY3QoUHlPYmplY3QgKm0pCiB7Ci0JUHlPYmplY3QgKmQ7Ci0JaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWQgPSAoKFB5TW9kdWxlT2JqZWN0ICopbSkgLT4gbWRfZGljdDsKLQlpZiAoZCA9PSBOVUxMKQotCQkoKFB5TW9kdWxlT2JqZWN0ICopbSkgLT4gbWRfZGljdCA9IGQgPSBQeURpY3RfTmV3KCk7Ci0JcmV0dXJuIGQ7CisgICAgUHlPYmplY3QgKmQ7CisgICAgaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGQgPSAoKFB5TW9kdWxlT2JqZWN0ICopbSkgLT4gbWRfZGljdDsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICAoKFB5TW9kdWxlT2JqZWN0ICopbSkgLT4gbWRfZGljdCA9IGQgPSBQeURpY3RfTmV3KCk7CisgICAgcmV0dXJuIGQ7CiB9CiAKIGNoYXIgKgogUHlNb2R1bGVfR2V0TmFtZShQeU9iamVjdCAqbSkKIHsKLQlQeU9iamVjdCAqZDsKLQlQeU9iamVjdCAqbmFtZW9iajsKLQlpZiAoIVB5TW9kdWxlX0NoZWNrKG0pKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pLT5tZF9kaWN0OwotCWlmIChkID09IE5VTEwgfHwKLQkgICAgKG5hbWVvYmogPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19uYW1lX18iKSkgPT0gTlVMTCB8fAotCSAgICAhUHlTdHJpbmdfQ2hlY2sobmFtZW9iaikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJuYW1lbGVzcyBtb2R1bGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZyhuYW1lb2JqKTsKKyAgICBQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbmFtZW9iajsKKyAgICBpZiAoIVB5TW9kdWxlX0NoZWNrKG0pKSB7CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pLT5tZF9kaWN0OworICAgIGlmIChkID09IE5VTEwgfHwKKyAgICAgICAgKG5hbWVvYmogPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19uYW1lX18iKSkgPT0gTlVMTCB8fAorICAgICAgICAhUHlTdHJpbmdfQ2hlY2sobmFtZW9iaikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJuYW1lbGVzcyBtb2R1bGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Bc1N0cmluZyhuYW1lb2JqKTsKIH0KIAogY2hhciAqCiBQeU1vZHVsZV9HZXRGaWxlbmFtZShQeU9iamVjdCAqbSkKIHsKLQlQeU9iamVjdCAqZDsKLQlQeU9iamVjdCAqZmlsZW9iajsKLQlpZiAoIVB5TW9kdWxlX0NoZWNrKG0pKSB7Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkID0gKChQeU1vZHVsZU9iamVjdCAqKW0pLT5tZF9kaWN0OwotCWlmIChkID09IE5VTEwgfHwKLQkgICAgKGZpbGVvYmogPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19maWxlX18iKSkgPT0gTlVMTCB8fAotCSAgICAhUHlTdHJpbmdfQ2hlY2soZmlsZW9iaikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJtb2R1bGUgZmlsZW5hbWUgbWlzc2luZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKGZpbGVvYmopOworICAgIFB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpmaWxlb2JqOworICAgIGlmICghUHlNb2R1bGVfQ2hlY2sobSkpIHsKKyAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGQgPSAoKFB5TW9kdWxlT2JqZWN0ICopbSktPm1kX2RpY3Q7CisgICAgaWYgKGQgPT0gTlVMTCB8fAorICAgICAgICAoZmlsZW9iaiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIpKSA9PSBOVUxMIHx8CisgICAgICAgICFQeVN0cmluZ19DaGVjayhmaWxlb2JqKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIm1vZHVsZSBmaWxlbmFtZSBtaXNzaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoZmlsZW9iaik7CiB9CiAKIHZvaWQKIF9QeU1vZHVsZV9DbGVhcihQeU9iamVjdCAqbSkKIHsKLQkvKiBUbyBtYWtlIHRoZSBleGVjdXRpb24gb3JkZXIgb2YgZGVzdHJ1Y3RvcnMgZm9yIGdsb2JhbAotCSAgIG9iamVjdHMgYSBiaXQgbW9yZSBwcmVkaWN0YWJsZSwgd2UgZmlyc3QgemFwIGFsbCBvYmplY3RzCi0JICAgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBhIHNpbmdsZSB1bmRlcnNjb3JlLCBiZWZvcmUgd2UgY2xlYXIKLQkgICB0aGUgZW50aXJlIGRpY3Rpb25hcnkuICBXZSB6YXAgdGhlbSBieSByZXBsYWNpbmcgdGhlbSB3aXRoCi0JICAgTm9uZSwgcmF0aGVyIHRoYW4gZGVsZXRpbmcgdGhlbSBmcm9tIHRoZSBkaWN0aW9uYXJ5LCB0bwotCSAgIGF2b2lkIHJlaGFzaGluZyB0aGUgZGljdGlvbmFyeSAodG8gc29tZSBleHRlbnQpLiAqLworICAgIC8qIFRvIG1ha2UgdGhlIGV4ZWN1dGlvbiBvcmRlciBvZiBkZXN0cnVjdG9ycyBmb3IgZ2xvYmFsCisgICAgICAgb2JqZWN0cyBhIGJpdCBtb3JlIHByZWRpY3RhYmxlLCB3ZSBmaXJzdCB6YXAgYWxsIG9iamVjdHMKKyAgICAgICB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgc2luZ2xlIHVuZGVyc2NvcmUsIGJlZm9yZSB3ZSBjbGVhcgorICAgICAgIHRoZSBlbnRpcmUgZGljdGlvbmFyeS4gIFdlIHphcCB0aGVtIGJ5IHJlcGxhY2luZyB0aGVtIHdpdGgKKyAgICAgICBOb25lLCByYXRoZXIgdGhhbiBkZWxldGluZyB0aGVtIGZyb20gdGhlIGRpY3Rpb25hcnksIHRvCisgICAgICAgYXZvaWQgcmVoYXNoaW5nIHRoZSBkaWN0aW9uYXJ5ICh0byBzb21lIGV4dGVudCkuICovCiAKLQlQeV9zc2l6ZV90IHBvczsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWU7Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlfc3NpemVfdCBwb3M7CisgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgIFB5T2JqZWN0ICpkOwogCi0JZCA9ICgoUHlNb2R1bGVPYmplY3QgKiltKS0+bWRfZGljdDsKLQlpZiAoZCA9PSBOVUxMKQotCQlyZXR1cm47CisgICAgZCA9ICgoUHlNb2R1bGVPYmplY3QgKiltKS0+bWRfZGljdDsKKyAgICBpZiAoZCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQkvKiBGaXJzdCwgY2xlYXIgb25seSBuYW1lcyBzdGFydGluZyB3aXRoIGEgc2luZ2xlIHVuZGVyc2NvcmUgKi8KLQlwb3MgPSAwOwotCXdoaWxlIChQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCWlmICh2YWx1ZSAhPSBQeV9Ob25lICYmIFB5U3RyaW5nX0NoZWNrKGtleSkpIHsKLQkJCWNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOwotCQkJaWYgKHNbMF0gPT0gJ18nICYmIHNbMV0gIT0gJ18nKSB7Ci0JCQkJaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKLQkJCQkgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgICBjbGVhclsxXSAlc1xuIiwgcyk7Ci0JCQkJUHlEaWN0X1NldEl0ZW0oZCwga2V5LCBQeV9Ob25lKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBGaXJzdCwgY2xlYXIgb25seSBuYW1lcyBzdGFydGluZyB3aXRoIGEgc2luZ2xlIHVuZGVyc2NvcmUgKi8KKyAgICBwb3MgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBQeV9Ob25lICYmIFB5U3RyaW5nX0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIGNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOworICAgICAgICAgICAgaWYgKHNbMF0gPT0gJ18nICYmIHNbMV0gIT0gJ18nKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKKyAgICAgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgICBjbGVhclsxXSAlc1xuIiwgcyk7CisgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW0oZCwga2V5LCBQeV9Ob25lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qIE5leHQsIGNsZWFyIGFsbCBuYW1lcyBleGNlcHQgZm9yIF9fYnVpbHRpbnNfXyAqLwotCXBvcyA9IDA7Ci0Jd2hpbGUgKFB5RGljdF9OZXh0KGQsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKLQkJaWYgKHZhbHVlICE9IFB5X05vbmUgJiYgUHlTdHJpbmdfQ2hlY2soa2V5KSkgewotCQkJY2hhciAqcyA9IFB5U3RyaW5nX0FzU3RyaW5nKGtleSk7Ci0JCQlpZiAoc1swXSAhPSAnXycgfHwgc3RyY21wKHMsICJfX2J1aWx0aW5zX18iKSAhPSAwKSB7Ci0JCQkJaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKLQkJCQkgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgICBjbGVhclsyXSAlc1xuIiwgcyk7Ci0JCQkJUHlEaWN0X1NldEl0ZW0oZCwga2V5LCBQeV9Ob25lKTsKLQkJCX0KLQkJfQotCX0KKyAgICAvKiBOZXh0LCBjbGVhciBhbGwgbmFtZXMgZXhjZXB0IGZvciBfX2J1aWx0aW5zX18gKi8KKyAgICBwb3MgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgIGlmICh2YWx1ZSAhPSBQeV9Ob25lICYmIFB5U3RyaW5nX0NoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIGNoYXIgKnMgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOworICAgICAgICAgICAgaWYgKHNbMF0gIT0gJ18nIHx8IHN0cmNtcChzLCAiX19idWlsdGluc19fIikgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZyA+IDEpCisgICAgICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICAgY2xlYXJbMl0gJXNcbiIsIHMpOworICAgICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtKGQsIGtleSwgUHlfTm9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBOb3RlOiB3ZSBsZWF2ZSBfX2J1aWx0aW5zX18gaW4gcGxhY2UsIHNvIHRoYXQgZGVzdHJ1Y3RvcnMKLQkgICBvZiBub24tZ2xvYmFsIG9iamVjdHMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSBjYW4gc3RpbGwgdXNlCi0JICAgYnVpbHRpbnMsIGluIHBhcnRpY3VsYXJseSAnTm9uZScuICovCisgICAgLyogTm90ZTogd2UgbGVhdmUgX19idWlsdGluc19fIGluIHBsYWNlLCBzbyB0aGF0IGRlc3RydWN0b3JzCisgICAgICAgb2Ygbm9uLWdsb2JhbCBvYmplY3RzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgY2FuIHN0aWxsIHVzZQorICAgICAgIGJ1aWx0aW5zLCBpbiBwYXJ0aWN1bGFybHkgJ05vbmUnLiAqLwogCiB9CiAKQEAgLTE1MSw1MyArMTUxLDUzIEBACiBzdGF0aWMgaW50CiBtb2R1bGVfaW5pdChQeU1vZHVsZU9iamVjdCAqbSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJkb2MiLCBOVUxMfTsKLQlQeU9iamVjdCAqZGljdCwgKm5hbWUgPSBQeV9Ob25lLCAqZG9jID0gUHlfTm9uZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiU3xPOm1vZHVsZS5fX2luaXRfXyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJm5hbWUsICZkb2MpKQotCQlyZXR1cm4gLTE7Ci0JZGljdCA9IG0tPm1kX2RpY3Q7Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlkaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAoZGljdCA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQltLT5tZF9kaWN0ID0gZGljdDsKLQl9Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX25hbWVfXyIsIG5hbWUpIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19kb2NfXyIsIGRvYykgPCAwKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgImRvYyIsIE5VTEx9OworICAgIFB5T2JqZWN0ICpkaWN0LCAqbmFtZSA9IFB5X05vbmUsICpkb2MgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJTfE86bW9kdWxlLl9faW5pdF9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZuYW1lLCAmZG9jKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGRpY3QgPSBtLT5tZF9kaWN0OworICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgbS0+bWRfZGljdCA9IGRpY3Q7CisgICAgfQorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19uYW1lX18iLCBuYW1lKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iLCBkb2MpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogbW9kdWxlX2RlYWxsb2MoUHlNb2R1bGVPYmplY3QgKm0pCiB7Ci0JUHlPYmplY3RfR0NfVW5UcmFjayhtKTsKLQlpZiAobS0+bWRfZGljdCAhPSBOVUxMKSB7Ci0JCV9QeU1vZHVsZV9DbGVhcigoUHlPYmplY3QgKiltKTsKLQkJUHlfREVDUkVGKG0tPm1kX2RpY3QpOwotCX0KLQlQeV9UWVBFKG0pLT50cF9mcmVlKChQeU9iamVjdCAqKW0pOworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sobSk7CisgICAgaWYgKG0tPm1kX2RpY3QgIT0gTlVMTCkgeworICAgICAgICBfUHlNb2R1bGVfQ2xlYXIoKFB5T2JqZWN0ICopbSk7CisgICAgICAgIFB5X0RFQ1JFRihtLT5tZF9kaWN0KTsKKyAgICB9CisgICAgUHlfVFlQRShtKS0+dHBfZnJlZSgoUHlPYmplY3QgKiltKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1vZHVsZV9yZXByKFB5TW9kdWxlT2JqZWN0ICptKQogewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqZmlsZW5hbWU7CisgICAgY2hhciAqbmFtZTsKKyAgICBjaGFyICpmaWxlbmFtZTsKIAotCW5hbWUgPSBQeU1vZHVsZV9HZXROYW1lKChQeU9iamVjdCAqKW0pOwotCWlmIChuYW1lID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJbmFtZSA9ICI/IjsKLQl9Ci0JZmlsZW5hbWUgPSBQeU1vZHVsZV9HZXRGaWxlbmFtZSgoUHlPYmplY3QgKiltKTsKLQlpZiAoZmlsZW5hbWUgPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPG1vZHVsZSAnJXMnIChidWlsdC1pbik+IiwgbmFtZSk7Ci0JfQotCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8bW9kdWxlICclcycgZnJvbSAnJXMnPiIsIG5hbWUsIGZpbGVuYW1lKTsKKyAgICBuYW1lID0gUHlNb2R1bGVfR2V0TmFtZSgoUHlPYmplY3QgKiltKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIG5hbWUgPSAiPyI7CisgICAgfQorICAgIGZpbGVuYW1lID0gUHlNb2R1bGVfR2V0RmlsZW5hbWUoKFB5T2JqZWN0ICopbSk7CisgICAgaWYgKGZpbGVuYW1lID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjxtb2R1bGUgJyVzJyAoYnVpbHQtaW4pPiIsIG5hbWUpOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPG1vZHVsZSAnJXMnIGZyb20gJyVzJz4iLCBuYW1lLCBmaWxlbmFtZSk7CiB9CiAKIC8qIFdlIG9ubHkgbmVlZCBhIHRyYXZlcnNlIGZ1bmN0aW9uLCBubyBjbGVhciBmdW5jdGlvbjogSWYgdGhlIG1vZHVsZQpAQCAtMjA2LDggKzIwNiw4IEBACiBzdGF0aWMgaW50CiBtb2R1bGVfdHJhdmVyc2UoUHlNb2R1bGVPYmplY3QgKm0sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKG0tPm1kX2RpY3QpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKG0tPm1kX2RpY3QpOworICAgIHJldHVybiAwOwogfQogCiBQeURvY19TVFJWQVIobW9kdWxlX2RvYywKQEAgLTIxNyw0NCArMjE3LDQ0IEBACiBUaGUgbmFtZSBtdXN0IGJlIGEgc3RyaW5nOyB0aGUgb3B0aW9uYWwgZG9jIGFyZ3VtZW50IGNhbiBoYXZlIGFueSB0eXBlLiIpOwogCiBQeVR5cGVPYmplY3QgUHlNb2R1bGVfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJtb2R1bGUiLAkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5TW9kdWxlT2JqZWN0KSwJCQkvKiB0cF9zaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3IpbW9kdWxlX2RlYWxsb2MsCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKW1vZHVsZV9yZXByLAkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCQkvKiB0cF9mbGFncyAqLwotCW1vZHVsZV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2MpbW9kdWxlX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JbW9kdWxlX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0Jb2Zmc2V0b2YoUHlNb2R1bGVPYmplY3QsIG1kX2RpY3QpLAkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JKGluaXRwcm9jKW1vZHVsZV9pbml0LAkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJICAgICAgICAvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAibW9kdWxlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlNb2R1bGVPYmplY3QpLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgKGRlc3RydWN0b3IpbW9kdWxlX2RlYWxsb2MsICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyltb2R1bGVfcmVwciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIG1vZHVsZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyltb2R1bGVfdHJhdmVyc2UsICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBtb2R1bGVfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICBvZmZzZXRvZihQeU1vZHVsZU9iamVjdCwgbWRfZGljdCksICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAoaW5pdHByb2MpbW9kdWxlX2luaXQsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgUHlUeXBlX0dlbmVyaWNOZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CmRpZmYgLS1naXQgYS9PYmplY3RzL29iamVjdC5jIGIvT2JqZWN0cy9vYmplY3QuYwppbmRleCAwZTk3ZThjLi40MjRmMzUzIDEwMDY0NAotLS0gYS9PYmplY3RzL29iamVjdC5jCisrKyBiL09iamVjdHMvb2JqZWN0LmMKQEAgLTE0LDE4ICsxNCwxOCBAQAogUHlfc3NpemVfdAogX1B5X0dldFJlZlRvdGFsKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm87Ci0JUHlfc3NpemVfdCB0b3RhbCA9IF9QeV9SZWZUb3RhbDsKLSAgICAgICAgLyogaWdub3JlIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBkdW1teSBvYmplY3Qgb2YgdGhlIGRpY3RzIGFuZCBzZXRzCi0gICAgICAgICAgIGJlY2F1c2UgdGhleSBhcmUgbm90IHJlbGlhYmxlIGFuZCBub3QgdXNlZnVsIChub3cgdGhhdCB0aGUKLSAgICAgICAgICAgaGFzaCB0YWJsZSBjb2RlIGlzIHdlbGwtdGVzdGVkKSAqLwotCW8gPSBfUHlEaWN0X0R1bW15KCk7Ci0JaWYgKG8gIT0gTlVMTCkKLQkJdG90YWwgLT0gby0+b2JfcmVmY250OwotCW8gPSBfUHlTZXRfRHVtbXkoKTsKLQlpZiAobyAhPSBOVUxMKQotCQl0b3RhbCAtPSBvLT5vYl9yZWZjbnQ7Ci0JcmV0dXJuIHRvdGFsOworICAgIFB5T2JqZWN0ICpvOworICAgIFB5X3NzaXplX3QgdG90YWwgPSBfUHlfUmVmVG90YWw7CisgICAgLyogaWdub3JlIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBkdW1teSBvYmplY3Qgb2YgdGhlIGRpY3RzIGFuZCBzZXRzCisgICAgICAgYmVjYXVzZSB0aGV5IGFyZSBub3QgcmVsaWFibGUgYW5kIG5vdCB1c2VmdWwgKG5vdyB0aGF0IHRoZQorICAgICAgIGhhc2ggdGFibGUgY29kZSBpcyB3ZWxsLXRlc3RlZCkgKi8KKyAgICBvID0gX1B5RGljdF9EdW1teSgpOworICAgIGlmIChvICE9IE5VTEwpCisgICAgICAgIHRvdGFsIC09IG8tPm9iX3JlZmNudDsKKyAgICBvID0gX1B5U2V0X0R1bW15KCk7CisgICAgaWYgKG8gIT0gTlVMTCkKKyAgICAgICAgdG90YWwgLT0gby0+b2JfcmVmY250OworICAgIHJldHVybiB0b3RhbDsKIH0KICNlbmRpZiAvKiBQeV9SRUZfREVCVUcgKi8KIApAQCAtNTgsMjEgKzU4LDIxIEBACiBfUHlfQWRkVG9BbGxPYmplY3RzKFB5T2JqZWN0ICpvcCwgaW50IGZvcmNlKQogewogI2lmZGVmICBQeV9ERUJVRwotCWlmICghZm9yY2UpIHsKLQkJLyogSWYgaXQncyBpbml0aWFsaXplZCBtZW1vcnksIG9wIG11c3QgYmUgaW4gb3Igb3V0IG9mCi0JCSAqIHRoZSBsaXN0IHVuYW1iaWd1b3VzbHkuCi0JCSAqLwotCQlhc3NlcnQoKG9wLT5fb2JfcHJldiA9PSBOVUxMKSA9PSAob3AtPl9vYl9uZXh0ID09IE5VTEwpKTsKLQl9CisgICAgaWYgKCFmb3JjZSkgeworICAgICAgICAvKiBJZiBpdCdzIGluaXRpYWxpemVkIG1lbW9yeSwgb3AgbXVzdCBiZSBpbiBvciBvdXQgb2YKKyAgICAgICAgICogdGhlIGxpc3QgdW5hbWJpZ3VvdXNseS4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydCgob3AtPl9vYl9wcmV2ID09IE5VTEwpID09IChvcC0+X29iX25leHQgPT0gTlVMTCkpOworICAgIH0KICNlbmRpZgotCWlmIChmb3JjZSB8fCBvcC0+X29iX3ByZXYgPT0gTlVMTCkgewotCQlvcC0+X29iX25leHQgPSByZWZjaGFpbi5fb2JfbmV4dDsKLQkJb3AtPl9vYl9wcmV2ID0gJnJlZmNoYWluOwotCQlyZWZjaGFpbi5fb2JfbmV4dC0+X29iX3ByZXYgPSBvcDsKLQkJcmVmY2hhaW4uX29iX25leHQgPSBvcDsKLQl9CisgICAgaWYgKGZvcmNlIHx8IG9wLT5fb2JfcHJldiA9PSBOVUxMKSB7CisgICAgICAgIG9wLT5fb2JfbmV4dCA9IHJlZmNoYWluLl9vYl9uZXh0OworICAgICAgICBvcC0+X29iX3ByZXYgPSAmcmVmY2hhaW47CisgICAgICAgIHJlZmNoYWluLl9vYl9uZXh0LT5fb2JfcHJldiA9IG9wOworICAgICAgICByZWZjaGFpbi5fb2JfbmV4dCA9IG9wOworICAgIH0KIH0KLSNlbmRpZgkvKiBQeV9UUkFDRV9SRUZTICovCisjZW5kaWYgIC8qIFB5X1RSQUNFX1JFRlMgKi8KIAogI2lmZGVmIENPVU5UX0FMTE9DUwogc3RhdGljIFB5VHlwZU9iamVjdCAqdHlwZV9saXN0OwpAQCAtODksOTQgKzg5LDk0IEBACiB2b2lkCiBkdW1wX2NvdW50cyhGSUxFKiBmKQogewotCVB5VHlwZU9iamVjdCAqdHA7CisgICAgUHlUeXBlT2JqZWN0ICp0cDsKIAotCWZvciAodHAgPSB0eXBlX2xpc3Q7IHRwOyB0cCA9IHRwLT50cF9uZXh0KQotCQlmcHJpbnRmKGYsICIlcyBhbGxvYydkOiAlZCwgZnJlZWQ6ICVkLCBtYXggaW4gdXNlOiAlZFxuIiwKLQkJCXRwLT50cF9uYW1lLCB0cC0+dHBfYWxsb2NzLCB0cC0+dHBfZnJlZXMsCi0JCQl0cC0+dHBfbWF4YWxsb2MpOwotCWZwcmludGYoZiwgImZhc3QgdHVwbGUgYWxsb2NzOiAlZCwgZW1wdHk6ICVkXG4iLAotCQlmYXN0X3R1cGxlX2FsbG9jcywgdHVwbGVfemVyb19hbGxvY3MpOwotCWZwcmludGYoZiwgImZhc3QgaW50IGFsbG9jczogcG9zOiAlZCwgbmVnOiAlZFxuIiwKLQkJcXVpY2tfaW50X2FsbG9jcywgcXVpY2tfbmVnX2ludF9hbGxvY3MpOwotCWZwcmludGYoZiwgIm51bGwgc3RyaW5nczogJWQsIDEtc3RyaW5nczogJWRcbiIsCi0JCW51bGxfc3RyaW5ncywgb25lX3N0cmluZ3MpOworICAgIGZvciAodHAgPSB0eXBlX2xpc3Q7IHRwOyB0cCA9IHRwLT50cF9uZXh0KQorICAgICAgICBmcHJpbnRmKGYsICIlcyBhbGxvYydkOiAlZCwgZnJlZWQ6ICVkLCBtYXggaW4gdXNlOiAlZFxuIiwKKyAgICAgICAgICAgIHRwLT50cF9uYW1lLCB0cC0+dHBfYWxsb2NzLCB0cC0+dHBfZnJlZXMsCisgICAgICAgICAgICB0cC0+dHBfbWF4YWxsb2MpOworICAgIGZwcmludGYoZiwgImZhc3QgdHVwbGUgYWxsb2NzOiAlZCwgZW1wdHk6ICVkXG4iLAorICAgICAgICBmYXN0X3R1cGxlX2FsbG9jcywgdHVwbGVfemVyb19hbGxvY3MpOworICAgIGZwcmludGYoZiwgImZhc3QgaW50IGFsbG9jczogcG9zOiAlZCwgbmVnOiAlZFxuIiwKKyAgICAgICAgcXVpY2tfaW50X2FsbG9jcywgcXVpY2tfbmVnX2ludF9hbGxvY3MpOworICAgIGZwcmludGYoZiwgIm51bGwgc3RyaW5nczogJWQsIDEtc3RyaW5nczogJWRcbiIsCisgICAgICAgIG51bGxfc3RyaW5ncywgb25lX3N0cmluZ3MpOwogfQogCiBQeU9iamVjdCAqCiBnZXRfY291bnRzKHZvaWQpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cDsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICp2OworICAgIFB5VHlwZU9iamVjdCAqdHA7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqdjsKIAotCXJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKHRwID0gdHlwZV9saXN0OyB0cDsgdHAgPSB0cC0+dHBfbmV4dCkgewotCQl2ID0gUHlfQnVpbGRWYWx1ZSgiKHNubm4pIiwgdHAtPnRwX25hbWUsIHRwLT50cF9hbGxvY3MsCi0JCQkJICB0cC0+dHBfZnJlZXMsIHRwLT50cF9tYXhhbGxvYyk7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKFB5TGlzdF9BcHBlbmQocmVzdWx0LCB2KSA8IDApIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfREVDUkVGKHYpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKHRwID0gdHlwZV9saXN0OyB0cDsgdHAgPSB0cC0+dHBfbmV4dCkgeworICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKHNubm4pIiwgdHAtPnRwX25hbWUsIHRwLT50cF9hbGxvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT50cF9mcmVlcywgdHAtPnRwX21heGFsbG9jKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChyZXN1bHQsIHYpIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHZvaWQKIGluY19jb3VudChQeVR5cGVPYmplY3QgKnRwKQogewotCWlmICh0cC0+dHBfbmV4dCA9PSBOVUxMICYmIHRwLT50cF9wcmV2ID09IE5VTEwpIHsKLQkJLyogZmlyc3QgdGltZTsgaW5zZXJ0IGluIGxpbmtlZCBsaXN0ICovCi0JCWlmICh0cC0+dHBfbmV4dCAhPSBOVUxMKSAvKiBzYW5pdHkgY2hlY2sgKi8KLQkJCVB5X0ZhdGFsRXJyb3IoIlhYWCBpbmNfY291bnQgc2FuaXR5IGNoZWNrIik7Ci0JCWlmICh0eXBlX2xpc3QpCi0JCQl0eXBlX2xpc3QtPnRwX3ByZXYgPSB0cDsKLQkJdHAtPnRwX25leHQgPSB0eXBlX2xpc3Q7Ci0JCS8qIE5vdGUgdGhhdCBhcyBvZiBQeXRob24gMi4yLCBoZWFwLWFsbG9jYXRlZCB0eXBlIG9iamVjdHMKLQkJICogY2FuIGdvIGF3YXksIGJ1dCB0aGlzIGNvZGUgcmVxdWlyZXMgdGhhdCB0aGV5IHN0YXkgYWxpdmUKLQkJICogdW50aWwgcHJvZ3JhbSBleGl0LiAgVGhhdCdzIHdoeSB3ZSdyZSBjYXJlZnVsIHdpdGgKLQkJICogcmVmY291bnRzIGhlcmUuICB0eXBlX2xpc3QgZ2V0cyBhIG5ldyByZWZlcmVuY2UgdG8gdHAsCi0JCSAqIHdoaWxlIG93bmVyc2hpcCBvZiB0aGUgcmVmZXJlbmNlIHR5cGVfbGlzdCB1c2VkIHRvIGhvbGQKLQkJICogKGlmIGFueSkgd2FzIHRyYW5zZmVycmVkIHRvIHRwLT50cF9uZXh0IGluIHRoZSBsaW5lIGFib3ZlLgotCQkgKiB0cCBpcyB0aHVzIGVmZmVjdGl2ZWx5IGltbW9ydGFsIGFmdGVyIHRoaXMuCi0JCSAqLwotCQlQeV9JTkNSRUYodHApOwotCQl0eXBlX2xpc3QgPSB0cDsKKyAgICBpZiAodHAtPnRwX25leHQgPT0gTlVMTCAmJiB0cC0+dHBfcHJldiA9PSBOVUxMKSB7CisgICAgICAgIC8qIGZpcnN0IHRpbWU7IGluc2VydCBpbiBsaW5rZWQgbGlzdCAqLworICAgICAgICBpZiAodHAtPnRwX25leHQgIT0gTlVMTCkgLyogc2FuaXR5IGNoZWNrICovCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJYWFggaW5jX2NvdW50IHNhbml0eSBjaGVjayIpOworICAgICAgICBpZiAodHlwZV9saXN0KQorICAgICAgICAgICAgdHlwZV9saXN0LT50cF9wcmV2ID0gdHA7CisgICAgICAgIHRwLT50cF9uZXh0ID0gdHlwZV9saXN0OworICAgICAgICAvKiBOb3RlIHRoYXQgYXMgb2YgUHl0aG9uIDIuMiwgaGVhcC1hbGxvY2F0ZWQgdHlwZSBvYmplY3RzCisgICAgICAgICAqIGNhbiBnbyBhd2F5LCBidXQgdGhpcyBjb2RlIHJlcXVpcmVzIHRoYXQgdGhleSBzdGF5IGFsaXZlCisgICAgICAgICAqIHVudGlsIHByb2dyYW0gZXhpdC4gIFRoYXQncyB3aHkgd2UncmUgY2FyZWZ1bCB3aXRoCisgICAgICAgICAqIHJlZmNvdW50cyBoZXJlLiAgdHlwZV9saXN0IGdldHMgYSBuZXcgcmVmZXJlbmNlIHRvIHRwLAorICAgICAgICAgKiB3aGlsZSBvd25lcnNoaXAgb2YgdGhlIHJlZmVyZW5jZSB0eXBlX2xpc3QgdXNlZCB0byBob2xkCisgICAgICAgICAqIChpZiBhbnkpIHdhcyB0cmFuc2ZlcnJlZCB0byB0cC0+dHBfbmV4dCBpbiB0aGUgbGluZSBhYm92ZS4KKyAgICAgICAgICogdHAgaXMgdGh1cyBlZmZlY3RpdmVseSBpbW1vcnRhbCBhZnRlciB0aGlzLgorICAgICAgICAgKi8KKyAgICAgICAgUHlfSU5DUkVGKHRwKTsKKyAgICAgICAgdHlwZV9saXN0ID0gdHA7CiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwotCQkvKiBBbHNvIGluc2VydCBpbiB0aGUgZG91Ymx5LWxpbmtlZCBsaXN0IG9mIGFsbCBvYmplY3RzLAotCQkgKiBpZiBub3QgYWxyZWFkeSB0aGVyZS4KLQkJICovCi0JCV9QeV9BZGRUb0FsbE9iamVjdHMoKFB5T2JqZWN0ICopdHAsIDApOworICAgICAgICAvKiBBbHNvIGluc2VydCBpbiB0aGUgZG91Ymx5LWxpbmtlZCBsaXN0IG9mIGFsbCBvYmplY3RzLAorICAgICAgICAgKiBpZiBub3QgYWxyZWFkeSB0aGVyZS4KKyAgICAgICAgICovCisgICAgICAgIF9QeV9BZGRUb0FsbE9iamVjdHMoKFB5T2JqZWN0ICopdHAsIDApOwogI2VuZGlmCi0JfQotCXRwLT50cF9hbGxvY3MrKzsKLQlpZiAodHAtPnRwX2FsbG9jcyAtIHRwLT50cF9mcmVlcyA+IHRwLT50cF9tYXhhbGxvYykKLQkJdHAtPnRwX21heGFsbG9jID0gdHAtPnRwX2FsbG9jcyAtIHRwLT50cF9mcmVlczsKKyAgICB9CisgICAgdHAtPnRwX2FsbG9jcysrOworICAgIGlmICh0cC0+dHBfYWxsb2NzIC0gdHAtPnRwX2ZyZWVzID4gdHAtPnRwX21heGFsbG9jKQorICAgICAgICB0cC0+dHBfbWF4YWxsb2MgPSB0cC0+dHBfYWxsb2NzIC0gdHAtPnRwX2ZyZWVzOwogfQogCiB2b2lkIGRlY19jb3VudChQeVR5cGVPYmplY3QgKnRwKQogewotCXRwLT50cF9mcmVlcysrOwotCWlmICh1bmxpc3RfdHlwZXNfd2l0aG91dF9vYmplY3RzICYmCi0JICAgIHRwLT50cF9hbGxvY3MgPT0gdHAtPnRwX2ZyZWVzKSB7Ci0JCS8qIHVubGluayB0aGUgdHlwZSBmcm9tIHR5cGVfbGlzdCAqLwotCQlpZiAodHAtPnRwX3ByZXYpCi0JCQl0cC0+dHBfcHJldi0+dHBfbmV4dCA9IHRwLT50cF9uZXh0OwotCQllbHNlCi0JCQl0eXBlX2xpc3QgPSB0cC0+dHBfbmV4dDsKLQkJaWYgKHRwLT50cF9uZXh0KQotCQkJdHAtPnRwX25leHQtPnRwX3ByZXYgPSB0cC0+dHBfcHJldjsKLQkJdHAtPnRwX25leHQgPSB0cC0+dHBfcHJldiA9IE5VTEw7Ci0JCVB5X0RFQ1JFRih0cCk7Ci0JfQorICAgIHRwLT50cF9mcmVlcysrOworICAgIGlmICh1bmxpc3RfdHlwZXNfd2l0aG91dF9vYmplY3RzICYmCisgICAgICAgIHRwLT50cF9hbGxvY3MgPT0gdHAtPnRwX2ZyZWVzKSB7CisgICAgICAgIC8qIHVubGluayB0aGUgdHlwZSBmcm9tIHR5cGVfbGlzdCAqLworICAgICAgICBpZiAodHAtPnRwX3ByZXYpCisgICAgICAgICAgICB0cC0+dHBfcHJldi0+dHBfbmV4dCA9IHRwLT50cF9uZXh0OworICAgICAgICBlbHNlCisgICAgICAgICAgICB0eXBlX2xpc3QgPSB0cC0+dHBfbmV4dDsKKyAgICAgICAgaWYgKHRwLT50cF9uZXh0KQorICAgICAgICAgICAgdHAtPnRwX25leHQtPnRwX3ByZXYgPSB0cC0+dHBfcHJldjsKKyAgICAgICAgdHAtPnRwX25leHQgPSB0cC0+dHBfcHJldiA9IE5VTEw7CisgICAgICAgIFB5X0RFQ1JFRih0cCk7CisgICAgfQogfQogCiAjZW5kaWYKQEAgLTE4NiwxMyArMTg2LDEzIEBACiB2b2lkCiBfUHlfTmVnYXRpdmVSZWZjb3VudChjb25zdCBjaGFyICpmbmFtZSwgaW50IGxpbmVubywgUHlPYmplY3QgKm9wKQogewotCWNoYXIgYnVmWzMwMF07CisgICAgY2hhciBidWZbMzAwXTsKIAotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJICAgICAgIiVzOiVpIG9iamVjdCBhdCAlcCBoYXMgbmVnYXRpdmUgcmVmIGNvdW50ICIKLQkJICAgICAgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQiLAotCQkgICAgICBmbmFtZSwgbGluZW5vLCBvcCwgb3AtPm9iX3JlZmNudCk7Ci0JUHlfRmF0YWxFcnJvcihidWYpOworICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICIlczolaSBvYmplY3QgYXQgJXAgaGFzIG5lZ2F0aXZlIHJlZiBjb3VudCAiCisgICAgICAgICAgICAgICAgICAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCisgICAgICAgICAgICAgICAgICBmbmFtZSwgbGluZW5vLCBvcCwgb3AtPm9iX3JlZmNudCk7CisgICAgUHlfRmF0YWxFcnJvcihidWYpOwogfQogCiAjZW5kaWYgLyogUHlfUkVGX0RFQlVHICovCkBAIC0yMTIsNDUgKzIxMiw0NSBAQAogUHlPYmplY3QgKgogUHlPYmplY3RfSW5pdChQeU9iamVjdCAqb3AsIFB5VHlwZU9iamVjdCAqdHApCiB7Ci0JaWYgKG9wID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCS8qIEFueSBjaGFuZ2VzIHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gUHlPYmplY3RfSU5JVCAob2JqaW1wbC5oKSAqLwotCVB5X1RZUEUob3ApID0gdHA7Ci0JX1B5X05ld1JlZmVyZW5jZShvcCk7Ci0JcmV0dXJuIG9wOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAvKiBBbnkgY2hhbmdlcyBzaG91bGQgYmUgcmVmbGVjdGVkIGluIFB5T2JqZWN0X0lOSVQgKG9iamltcGwuaCkgKi8KKyAgICBQeV9UWVBFKG9wKSA9IHRwOworICAgIF9QeV9OZXdSZWZlcmVuY2Uob3ApOworICAgIHJldHVybiBvcDsKIH0KIAogUHlWYXJPYmplY3QgKgogUHlPYmplY3RfSW5pdFZhcihQeVZhck9iamVjdCAqb3AsIFB5VHlwZU9iamVjdCAqdHAsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlpZiAob3AgPT0gTlVMTCkKLQkJcmV0dXJuIChQeVZhck9iamVjdCAqKSBQeUVycl9Ob01lbW9yeSgpOwotCS8qIEFueSBjaGFuZ2VzIHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gUHlPYmplY3RfSU5JVF9WQVIgKi8KLQlvcC0+b2Jfc2l6ZSA9IHNpemU7Ci0JUHlfVFlQRShvcCkgPSB0cDsKLQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKW9wKTsKLQlyZXR1cm4gb3A7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiAoUHlWYXJPYmplY3QgKikgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAvKiBBbnkgY2hhbmdlcyBzaG91bGQgYmUgcmVmbGVjdGVkIGluIFB5T2JqZWN0X0lOSVRfVkFSICovCisgICAgb3AtPm9iX3NpemUgPSBzaXplOworICAgIFB5X1RZUEUob3ApID0gdHA7CisgICAgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilvcCk7CisgICAgcmV0dXJuIG9wOwogfQogCiBQeU9iamVjdCAqCiBfUHlPYmplY3RfTmV3KFB5VHlwZU9iamVjdCAqdHApCiB7Ci0JUHlPYmplY3QgKm9wOwotCW9wID0gKFB5T2JqZWN0ICopIFB5T2JqZWN0X01BTExPQyhfUHlPYmplY3RfU0laRSh0cCkpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXR1cm4gUHlPYmplY3RfSU5JVChvcCwgdHApOworICAgIFB5T2JqZWN0ICpvcDsKKyAgICBvcCA9IChQeU9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0MoX1B5T2JqZWN0X1NJWkUodHApKTsKKyAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcmV0dXJuIFB5T2JqZWN0X0lOSVQob3AsIHRwKTsKIH0KIAogUHlWYXJPYmplY3QgKgogX1B5T2JqZWN0X05ld1ZhcihQeVR5cGVPYmplY3QgKnRwLCBQeV9zc2l6ZV90IG5pdGVtcykKIHsKLQlQeVZhck9iamVjdCAqb3A7Ci0JY29uc3Qgc2l6ZV90IHNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHAsIG5pdGVtcyk7Ci0Jb3AgPSAoUHlWYXJPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKHNpemUpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gKFB5VmFyT2JqZWN0ICopUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXR1cm4gUHlPYmplY3RfSU5JVF9WQVIob3AsIHRwLCBuaXRlbXMpOworICAgIFB5VmFyT2JqZWN0ICpvcDsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0cCwgbml0ZW1zKTsKKyAgICBvcCA9IChQeVZhck9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0Moc2l6ZSk7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiAoUHlWYXJPYmplY3QgKilQeUVycl9Ob01lbW9yeSgpOworICAgIHJldHVybiBQeU9iamVjdF9JTklUX1ZBUihvcCwgdHAsIG5pdGVtcyk7CiB9CiAKIC8qIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLwpAQCAtMjU4LDI5MSArMjU4LDI5MSBAQAogdm9pZAogX1B5T2JqZWN0X0RlbChQeU9iamVjdCAqb3ApCiB7Ci0JUHlPYmplY3RfRlJFRShvcCk7CisgICAgUHlPYmplY3RfRlJFRShvcCk7CiB9CiAKIC8qIEltcGxlbWVudGF0aW9uIG9mIFB5T2JqZWN0X1ByaW50IHdpdGggcmVjdXJzaW9uIGNoZWNraW5nICovCiBzdGF0aWMgaW50CiBpbnRlcm5hbF9wcmludChQeU9iamVjdCAqb3AsIEZJTEUgKmZwLCBpbnQgZmxhZ3MsIGludCBuZXN0aW5nKQogewotCWludCByZXQgPSAwOwotCWlmIChuZXN0aW5nID4gMTApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInByaW50IHJlY3Vyc2lvbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKLQkJcmV0dXJuIC0xOworICAgIGludCByZXQgPSAwOworICAgIGlmIChuZXN0aW5nID4gMTApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInByaW50IHJlY3Vyc2lvbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkKKyAgICAgICAgcmV0dXJuIC0xOwogI2lmZGVmIFVTRV9TVEFDS0NIRUNLCi0JaWYgKFB5T1NfQ2hlY2tTdGFjaygpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInN0YWNrIG92ZXJmbG93Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKFB5T1NfQ2hlY2tTdGFjaygpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInN0YWNrIG92ZXJmbG93Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAjZW5kaWYKLQljbGVhcmVycihmcCk7IC8qIENsZWFyIGFueSBwcmV2aW91cyBlcnJvciBjb25kaXRpb24gKi8KLQlpZiAob3AgPT0gTlVMTCkgewotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWZwcmludGYoZnAsICI8bmlsPiIpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCX0KLQllbHNlIHsKLQkJaWYgKG9wLT5vYl9yZWZjbnQgPD0gMCkKLQkJCS8qIFhYWCh0d291dGVycykgY2FzdCByZWZjb3VudCB0byBsb25nIHVudGlsICV6ZCBpcwotCQkJICAgdW5pdmVyc2FsbHkgYXZhaWxhYmxlICovCi0JCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCQlmcHJpbnRmKGZwLCAiPHJlZmNudCAlbGQgYXQgJXA+IiwKLQkJCQkobG9uZylvcC0+b2JfcmVmY250LCBvcCk7Ci0JCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQllbHNlIGlmIChQeV9UWVBFKG9wKS0+dHBfcHJpbnQgPT0gTlVMTCkgewotCQkJUHlPYmplY3QgKnM7Ci0JCQlpZiAoZmxhZ3MgJiBQeV9QUklOVF9SQVcpCi0JCQkJcyA9IFB5T2JqZWN0X1N0cihvcCk7Ci0JCQllbHNlCi0JCQkJcyA9IFB5T2JqZWN0X1JlcHIob3ApOwotCQkJaWYgKHMgPT0gTlVMTCkKLQkJCQlyZXQgPSAtMTsKLQkJCWVsc2UgewotCQkJCXJldCA9IGludGVybmFsX3ByaW50KHMsIGZwLCBQeV9QUklOVF9SQVcsCi0JCQkJCQkgICAgIG5lc3RpbmcrMSk7Ci0JCQl9Ci0JCQlQeV9YREVDUkVGKHMpOwotCQl9Ci0JCWVsc2UKLQkJCXJldCA9ICgqUHlfVFlQRShvcCktPnRwX3ByaW50KShvcCwgZnAsIGZsYWdzKTsKLQl9Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCWlmIChmZXJyb3IoZnApKSB7Ci0JCQlQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JCQljbGVhcmVycihmcCk7Ci0JCQlyZXQgPSAtMTsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OworICAgIGNsZWFyZXJyKGZwKTsgLyogQ2xlYXIgYW55IHByZXZpb3VzIGVycm9yIGNvbmRpdGlvbiAqLworICAgIGlmIChvcCA9PSBOVUxMKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZnByaW50ZihmcCwgIjxuaWw+Iik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAob3AtPm9iX3JlZmNudCA8PSAwKQorICAgICAgICAgICAgLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvIGxvbmcgdW50aWwgJXpkIGlzCisgICAgICAgICAgICAgICB1bml2ZXJzYWxseSBhdmFpbGFibGUgKi8KKyAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgICAgIGZwcmludGYoZnAsICI8cmVmY250ICVsZCBhdCAlcD4iLAorICAgICAgICAgICAgICAgIChsb25nKW9wLT5vYl9yZWZjbnQsIG9wKTsKKyAgICAgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGVsc2UgaWYgKFB5X1RZUEUob3ApLT50cF9wcmludCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqczsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFB5X1BSSU5UX1JBVykKKyAgICAgICAgICAgICAgICBzID0gUHlPYmplY3RfU3RyKG9wKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzID0gUHlPYmplY3RfUmVwcihvcCk7CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gaW50ZXJuYWxfcHJpbnQocywgZnAsIFB5X1BSSU5UX1JBVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0aW5nKzEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfWERFQ1JFRihzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQgPSAoKlB5X1RZUEUob3ApLT50cF9wcmludCkob3AsIGZwLCBmbGFncyk7CisgICAgfQorICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBpZiAoZmVycm9yKGZwKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICAgICAgY2xlYXJlcnIoZnApOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKIH0KIAogaW50CiBQeU9iamVjdF9QcmludChQeU9iamVjdCAqb3AsIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7Ci0JcmV0dXJuIGludGVybmFsX3ByaW50KG9wLCBmcCwgZmxhZ3MsIDApOworICAgIHJldHVybiBpbnRlcm5hbF9wcmludChvcCwgZnAsIGZsYWdzLCAwKTsKIH0KIAogCiAvKiBGb3IgZGVidWdnaW5nIGNvbnZlbmllbmNlLiAgU2VlIE1pc2MvZ2RiaW5pdCBmb3Igc29tZSB1c2VmdWwgZ2RiIGhvb2tzICovCiB2b2lkIF9QeU9iamVjdF9EdW1wKFB5T2JqZWN0KiBvcCkKIHsKLQlpZiAob3AgPT0gTlVMTCkKLQkJZnByaW50ZihzdGRlcnIsICJOVUxMXG4iKTsKLQllbHNlIHsKKyAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJOVUxMXG4iKTsKKyAgICBlbHNlIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlQeUdJTFN0YXRlX1NUQVRFIGdpbDsKKyAgICAgICAgUHlHSUxTdGF0ZV9TVEFURSBnaWw7CiAjZW5kaWYKLQkJZnByaW50ZihzdGRlcnIsICJvYmplY3QgIDogIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAib2JqZWN0ICA6ICIpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCWdpbCA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgICAgIGdpbCA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CiAjZW5kaWYKLQkJKHZvaWQpUHlPYmplY3RfUHJpbnQob3AsIHN0ZGVyciwgMCk7CisgICAgICAgICh2b2lkKVB5T2JqZWN0X1ByaW50KG9wLCBzdGRlcnIsIDApOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCVB5R0lMU3RhdGVfUmVsZWFzZShnaWwpOworICAgICAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsKTsKICNlbmRpZgotCQkvKiBYWFgodHdvdXRlcnMpIGNhc3QgcmVmY291bnQgdG8gbG9uZyB1bnRpbCAlemQgaXMKLQkJICAgdW5pdmVyc2FsbHkgYXZhaWxhYmxlICovCi0JCWZwcmludGYoc3RkZXJyLCAiXG4iCi0JCQkidHlwZSAgICA6ICVzXG4iCi0JCQkicmVmY291bnQ6ICVsZFxuIgotCQkJImFkZHJlc3MgOiAlcFxuIiwKLQkJCVB5X1RZUEUob3ApPT1OVUxMID8gIk5VTEwiIDogUHlfVFlQRShvcCktPnRwX25hbWUsCi0JCQkobG9uZylvcC0+b2JfcmVmY250LAotCQkJb3ApOwotCX0KKyAgICAgICAgLyogWFhYKHR3b3V0ZXJzKSBjYXN0IHJlZmNvdW50IHRvIGxvbmcgdW50aWwgJXpkIGlzCisgICAgICAgICAgIHVuaXZlcnNhbGx5IGF2YWlsYWJsZSAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIgorICAgICAgICAgICAgInR5cGUgICAgOiAlc1xuIgorICAgICAgICAgICAgInJlZmNvdW50OiAlbGRcbiIKKyAgICAgICAgICAgICJhZGRyZXNzIDogJXBcbiIsCisgICAgICAgICAgICBQeV9UWVBFKG9wKT09TlVMTCA/ICJOVUxMIiA6IFB5X1RZUEUob3ApLT50cF9uYW1lLAorICAgICAgICAgICAgKGxvbmcpb3AtPm9iX3JlZmNudCwKKyAgICAgICAgICAgIG9wKTsKKyAgICB9CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X1JlcHIoUHlPYmplY3QgKnYpCiB7Ci0JaWYgKFB5RXJyX0NoZWNrU2lnbmFscygpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfQ2hlY2tTaWduYWxzKCkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFVTRV9TVEFDS0NIRUNLCi0JaWYgKFB5T1NfQ2hlY2tTdGFjaygpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInN0YWNrIG92ZXJmbG93Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlPU19DaGVja1N0YWNrKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAic3RhY2sgb3ZlcmZsb3ciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCi0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxOVUxMPiIpOwotCWVsc2UgaWYgKFB5X1RZUEUodiktPnRwX3JlcHIgPT0gTlVMTCkKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBvYmplY3QgYXQgJXA+IiwKLQkJCQkJICAgUHlfVFlQRSh2KS0+dHBfbmFtZSwgdik7Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCXJlcyA9ICgqUHlfVFlQRSh2KS0+dHBfcmVwcikodik7Ci0JCWlmIChyZXMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8TlVMTD4iKTsKKyAgICBlbHNlIGlmIChQeV9UWVBFKHYpLT50cF9yZXByID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgb2JqZWN0IGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUsIHYpOworICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICByZXMgPSAoKlB5X1RZUEUodiktPnRwX3JlcHIpKHYpOworICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2socmVzKSkgewotCQkJUHlPYmplY3QqIHN0cjsKLQkJCXN0ciA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcocmVzLCBOVUxMLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJaWYgKHN0cikKLQkJCQlyZXMgPSBzdHI7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhyZXMpKSB7CisgICAgICAgICAgICBQeU9iamVjdCogc3RyOworICAgICAgICAgICAgc3RyID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhyZXMsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICBpZiAoc3RyKQorICAgICAgICAgICAgICAgIHJlcyA9IHN0cjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JCWlmICghUHlTdHJpbmdfQ2hlY2socmVzKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJfX3JlcHJfXyByZXR1cm5lZCBub24tc3RyaW5nICh0eXBlICUuMjAwcykiLAotCQkJCSAgICAgUHlfVFlQRShyZXMpLT50cF9uYW1lKTsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2socmVzKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiX19yZXByX18gcmV0dXJuZWQgbm9uLXN0cmluZyAodHlwZSAlLjIwMHMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHJlcyktPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIH0KIAogUHlPYmplY3QgKgogX1B5T2JqZWN0X1N0cihQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqcmVzOwotCWludCB0eXBlX29rOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8TlVMTD4iKTsKLQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSkgewotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiB2OwotCX0KKyAgICBQeU9iamVjdCAqcmVzOworICAgIGludCB0eXBlX29rOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8TlVMTD4iKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHYpKSB7Ci0JCVB5X0lOQ1JFRih2KTsKLQkJcmV0dXJuIHY7Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KICNlbmRpZgotCWlmIChQeV9UWVBFKHYpLT50cF9zdHIgPT0gTlVMTCkKLQkJcmV0dXJuIFB5T2JqZWN0X1JlcHIodik7CisgICAgaWYgKFB5X1RZUEUodiktPnRwX3N0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfUmVwcih2KTsKIAotCS8qIEl0IGlzIHBvc3NpYmxlIGZvciBhIHR5cGUgdG8gaGF2ZSBhIHRwX3N0ciByZXByZXNlbnRhdGlvbiB0aGF0IGxvb3BzCi0JICAgaW5maW5pdGVseS4gKi8KLQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgZ2V0dGluZyB0aGUgc3RyIG9mIGFuIG9iamVjdCIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKlB5X1RZUEUodiktPnRwX3N0cikodik7Ci0JUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl0eXBlX29rID0gUHlTdHJpbmdfQ2hlY2socmVzKTsKKyAgICAvKiBJdCBpcyBwb3NzaWJsZSBmb3IgYSB0eXBlIHRvIGhhdmUgYSB0cF9zdHIgcmVwcmVzZW50YXRpb24gdGhhdCBsb29wcworICAgICAgIGluZmluaXRlbHkuICovCisgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIHdoaWxlIGdldHRpbmcgdGhlIHN0ciBvZiBhbiBvYmplY3QiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpQeV9UWVBFKHYpLT50cF9zdHIpKHYpOworICAgIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdHlwZV9vayA9IFB5U3RyaW5nX0NoZWNrKHJlcyk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCXR5cGVfb2sgPSB0eXBlX29rIHx8IFB5VW5pY29kZV9DaGVjayhyZXMpOworICAgIHR5cGVfb2sgPSB0eXBlX29rIHx8IFB5VW5pY29kZV9DaGVjayhyZXMpOwogI2VuZGlmCi0JaWYgKCF0eXBlX29rKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJfX3N0cl9fIHJldHVybmVkIG5vbi1zdHJpbmcgKHR5cGUgJS4yMDBzKSIsCi0JCQkgICAgIFB5X1RZUEUocmVzKS0+dHBfbmFtZSk7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoIXR5cGVfb2spIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJfX3N0cl9fIHJldHVybmVkIG5vbi1zdHJpbmcgKHR5cGUgJS4yMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHJlcyktPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X1N0cihQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqcmVzID0gX1B5T2JqZWN0X1N0cih2KTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpyZXMgPSBfUHlPYmplY3RfU3RyKHYpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2socmVzKSkgewotCQlQeU9iamVjdCogc3RyOwotCQlzdHIgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHJlcywgTlVMTCwgTlVMTCk7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlpZiAoc3RyKQotCQkJcmVzID0gc3RyOwotCQllbHNlCi0JCSAgICAJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2socmVzKSkgeworICAgICAgICBQeU9iamVjdCogc3RyOworICAgICAgICBzdHIgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHJlcywgTlVMTCwgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICBpZiAoc3RyKQorICAgICAgICAgICAgcmVzID0gc3RyOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2socmVzKSk7Ci0JcmV0dXJuIHJlczsKKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2socmVzKSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X1VuaWNvZGUoUHlPYmplY3QgKnYpCiB7Ci0JUHlPYmplY3QgKnJlczsKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqc3RyOwotCWludCB1bmljb2RlX21ldGhvZF9mb3VuZCA9IDA7Ci0Jc3RhdGljIFB5T2JqZWN0ICp1bmljb2Rlc3RyOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKmZ1bmM7CisgICAgUHlPYmplY3QgKnN0cjsKKyAgICBpbnQgdW5pY29kZV9tZXRob2RfZm91bmQgPSAwOworICAgIHN0YXRpYyBQeU9iamVjdCAqdW5pY29kZXN0cjsKIAotCWlmICh2ID09IE5VTEwpIHsKLQkJcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPE5VTEw+Iik7Ci0JCWlmIChyZXMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlzdHIgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QocmVzLCBOVUxMLCAic3RyaWN0Iik7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlyZXR1cm4gc3RyOwotCX0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QodikpIHsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR1cm4gdjsKLQl9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8TlVMTD4iKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdChyZXMsIE5VTEwsICJzdHJpY3QiKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIHJldHVybiB2OworICAgIH0KIAotCS8qIFRyeSB0aGUgX191bmljb2RlX18gbWV0aG9kICovCi0JaWYgKHVuaWNvZGVzdHIgPT0gTlVMTCkgewotCQl1bmljb2Rlc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3VuaWNvZGVfXyIpOwotCQlpZiAodW5pY29kZXN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChQeUluc3RhbmNlX0NoZWNrKHYpKSB7Ci0JCS8qIFdlJ3JlIGFuIGluc3RhbmNlIG9mIGEgY2xhc3NpYyBjbGFzcyAqLwotCQkvKiBUcnkgX191bmljb2RlX18gZnJvbSB0aGUgaW5zdGFuY2UgLS0gYWxhcyB3ZSBoYXZlIG5vIHR5cGUgKi8KLQkJZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIodiwgdW5pY29kZXN0cik7Ci0JCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJCXVuaWNvZGVfbWV0aG9kX2ZvdW5kID0gMTsKLQkJCXJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZnVuYywgTlVMTCk7Ci0JCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUVycl9DbGVhcigpOyAKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogTm90IGEgY2xhc3NpYyBjbGFzcyBpbnN0YW5jZSwgdHJ5IF9fdW5pY29kZV9fIGZyb20gdHlwZSAqLwotCQkvKiBfUHlUeXBlX0xvb2t1cCBkb2Vzbid0IGNyZWF0ZSBhIHJlZmVyZW5jZSAqLwotCQlmdW5jID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRSh2KSwgdW5pY29kZXN0cik7Ci0JCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJCXVuaWNvZGVfbWV0aG9kX2ZvdW5kID0gMTsKLQkJCXJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZnVuYywgdiwgTlVMTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQl9Ci0JfQorICAgIC8qIFRyeSB0aGUgX191bmljb2RlX18gbWV0aG9kICovCisgICAgaWYgKHVuaWNvZGVzdHIgPT0gTlVMTCkgeworICAgICAgICB1bmljb2Rlc3RyPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX3VuaWNvZGVfXyIpOworICAgICAgICBpZiAodW5pY29kZXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHYpKSB7CisgICAgICAgIC8qIFdlJ3JlIGFuIGluc3RhbmNlIG9mIGEgY2xhc3NpYyBjbGFzcyAqLworICAgICAgICAvKiBUcnkgX191bmljb2RlX18gZnJvbSB0aGUgaW5zdGFuY2UgLS0gYWxhcyB3ZSBoYXZlIG5vIHR5cGUgKi8KKyAgICAgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIodiwgdW5pY29kZXN0cik7CisgICAgICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHVuaWNvZGVfbWV0aG9kX2ZvdW5kID0gMTsKKyAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZnVuYywgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBOb3QgYSBjbGFzc2ljIGNsYXNzIGluc3RhbmNlLCB0cnkgX191bmljb2RlX18gZnJvbSB0eXBlICovCisgICAgICAgIC8qIF9QeVR5cGVfTG9va3VwIGRvZXNuJ3QgY3JlYXRlIGEgcmVmZXJlbmNlICovCisgICAgICAgIGZ1bmMgPSBfUHlUeXBlX0xvb2t1cChQeV9UWVBFKHYpLCB1bmljb2Rlc3RyKTsKKyAgICAgICAgaWYgKGZ1bmMgIT0gTlVMTCkgeworICAgICAgICAgICAgdW5pY29kZV9tZXRob2RfZm91bmQgPSAxOworICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLCB2LCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBEaWRuJ3QgZmluZCBfX3VuaWNvZGVfXyAqLwotCWlmICghdW5pY29kZV9tZXRob2RfZm91bmQpIHsKLQkJaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQkJLyogRm9yIGEgVW5pY29kZSBzdWJ0eXBlIHRoYXQncyBkaWRuJ3Qgb3ZlcndyaXRlIF9fdW5pY29kZV9fLAotCQkJICAgcmV0dXJuIGEgdHJ1ZSBVbmljb2RlIG9iamVjdCB3aXRoIHRoZSBzYW1lIGRhdGEuICovCi0JCQlyZXR1cm4gUHlVbmljb2RlX0Zyb21Vbmljb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKHYpLAotCQkJCQkJICAgICBQeVVuaWNvZGVfR0VUX1NJWkUodikpOwotCQl9Ci0JCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHYpKSB7Ci0JCQlQeV9JTkNSRUYodik7Ci0JCQlyZXMgPSB2OwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKFB5X1RZUEUodiktPnRwX3N0ciAhPSBOVUxMKQotCQkJCXJlcyA9ICgqUHlfVFlQRSh2KS0+dHBfc3RyKSh2KTsKLQkJCWVsc2UKLQkJCQlyZXMgPSBQeU9iamVjdF9SZXByKHYpOwotCQl9Ci0JfQorICAgIC8qIERpZG4ndCBmaW5kIF9fdW5pY29kZV9fICovCisgICAgaWYgKCF1bmljb2RlX21ldGhvZF9mb3VuZCkgeworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAvKiBGb3IgYSBVbmljb2RlIHN1YnR5cGUgdGhhdCdzIGRpZG4ndCBvdmVyd3JpdGUgX191bmljb2RlX18sCisgICAgICAgICAgICAgICByZXR1cm4gYSB0cnVlIFVuaWNvZGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgZGF0YS4gKi8KKyAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoUHlVbmljb2RlX0FTX1VOSUNPREUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfU0laRSh2KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIHJlcyA9IHY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlfVFlQRSh2KS0+dHBfc3RyICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcmVzID0gKCpQeV9UWVBFKHYpLT50cF9zdHIpKHYpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X1JlcHIodik7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlVbmljb2RlX0NoZWNrKHJlcykpIHsKLQkJc3RyID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KHJlcywgTlVMTCwgInN0cmljdCIpOwotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmVzID0gc3RyOwotCX0KLQlyZXR1cm4gcmVzOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2socmVzKSkgeworICAgICAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QocmVzLCBOVUxMLCAic3RyaWN0Iik7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXMgPSBzdHI7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAjZW5kaWYKIApAQCAtNTU3LDM5ICs1NTcsMzkgQEAKIHN0YXRpYyBpbnQKIGFkanVzdF90cF9jb21wYXJlKGludCBjKQogewotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWlmIChjICE9IC0xICYmIGMgIT0gLTIpIHsKLQkJCVB5T2JqZWN0ICp0LCAqdiwgKnRiOwotCQkJUHlFcnJfRmV0Y2goJnQsICZ2LCAmdGIpOwotCQkJaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsCi0JCQkJICAgICAgICJ0cF9jb21wYXJlIGRpZG4ndCByZXR1cm4gLTEgb3IgLTIgIgotCQkJCSAgICAgICAiZm9yIGV4Y2VwdGlvbiIpIDwgMCkgewotCQkJCVB5X1hERUNSRUYodCk7Ci0JCQkJUHlfWERFQ1JFRih2KTsKLQkJCQlQeV9YREVDUkVGKHRiKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlQeUVycl9SZXN0b3JlKHQsIHYsIHRiKTsKLQkJfQotCQlyZXR1cm4gLTI7Ci0JfQotCWVsc2UgaWYgKGMgPCAtMSB8fCBjID4gMSkgewotCQlpZiAoUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywKLQkJCSAgICAgICAidHBfY29tcGFyZSBkaWRuJ3QgcmV0dXJuIC0xLCAwIG9yIDEiKSA8IDApCi0JCQlyZXR1cm4gLTI7Ci0JCWVsc2UKLQkJCXJldHVybiBjIDwgLTEgPyAtMSA6IDE7Ci0JfQotCWVsc2UgewotCQlhc3NlcnQoYyA+PSAtMSAmJiBjIDw9IDEpOwotCQlyZXR1cm4gYzsKLQl9CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgaWYgKGMgIT0gLTEgJiYgYyAhPSAtMikgeworICAgICAgICAgICAgUHlPYmplY3QgKnQsICp2LCAqdGI7CisgICAgICAgICAgICBQeUVycl9GZXRjaCgmdCwgJnYsICZ0Yik7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cF9jb21wYXJlIGRpZG4ndCByZXR1cm4gLTEgb3IgLTIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBleGNlcHRpb24iKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHQpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0Yik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfUmVzdG9yZSh0LCB2LCB0Yik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKyAgICBlbHNlIGlmIChjIDwgLTEgfHwgYyA+IDEpIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICJ0cF9jb21wYXJlIGRpZG4ndCByZXR1cm4gLTEsIDAgb3IgMSIpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGMgPCAtMSA/IC0xIDogMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFzc2VydChjID49IC0xICYmIGMgPD0gMSk7CisgICAgICAgIHJldHVybiBjOworICAgIH0KIH0KIAogCiAvKiBNYWNybyB0byBnZXQgdGhlIHRwX3JpY2hjb21wYXJlIGZpZWxkIG9mIGEgdHlwZSBpZiBkZWZpbmVkICovCiAjZGVmaW5lIFJJQ0hDT01QQVJFKHQpIChQeVR5cGVfSGFzRmVhdHVyZSgodCksIFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgID8gKHQpLT50cF9yaWNoY29tcGFyZSA6IE5VTEwpCisgICAgICAgICAgICAgPyAodCktPnRwX3JpY2hjb21wYXJlIDogTlVMTCkKIAogLyogTWFwIHJpY2ggY29tcGFyaXNvbiBvcGVyYXRvcnMgdG8gdGhlaXIgc3dhcHBlZCB2ZXJzaW9uLCBlLmcuIExUIC0tPiBHVCAqLwogaW50IF9QeV9Td2FwcGVkT3BbXSA9IHtQeV9HVCwgUHlfR0UsIFB5X0VRLCBQeV9ORSwgUHlfTFQsIFB5X0xFfTsKQEAgLTYwNCwyOSArNjA0LDI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHJ5X3JpY2hfY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlyaWNoY21wZnVuYyBmOwotCVB5T2JqZWN0ICpyZXM7CisgICAgcmljaGNtcGZ1bmMgZjsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKHYtPm9iX3R5cGUgIT0gdy0+b2JfdHlwZSAmJgotCSAgICBQeVR5cGVfSXNTdWJ0eXBlKHctPm9iX3R5cGUsIHYtPm9iX3R5cGUpICYmCi0JICAgIChmID0gUklDSENPTVBBUkUody0+b2JfdHlwZSkpICE9IE5VTEwpIHsKLQkJcmVzID0gKCpmKSh3LCB2LCBfUHlfU3dhcHBlZE9wW29wXSk7Ci0JCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzOwotCQlQeV9ERUNSRUYocmVzKTsKLQl9Ci0JaWYgKChmID0gUklDSENPTVBBUkUodi0+b2JfdHlwZSkpICE9IE5VTEwpIHsKLQkJcmVzID0gKCpmKSh2LCB3LCBvcCk7Ci0JCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCQlyZXR1cm4gcmVzOwotCQlQeV9ERUNSRUYocmVzKTsKLQl9Ci0JaWYgKChmID0gUklDSENPTVBBUkUody0+b2JfdHlwZSkpICE9IE5VTEwpIHsKLQkJcmV0dXJuICgqZikodywgdiwgX1B5X1N3YXBwZWRPcFtvcF0pOwotCX0KLQlyZXMgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKLQlQeV9JTkNSRUYocmVzKTsKLQlyZXR1cm4gcmVzOworICAgIGlmICh2LT5vYl90eXBlICE9IHctPm9iX3R5cGUgJiYKKyAgICAgICAgUHlUeXBlX0lzU3VidHlwZSh3LT5vYl90eXBlLCB2LT5vYl90eXBlKSAmJgorICAgICAgICAoZiA9IFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpKSAhPSBOVUxMKSB7CisgICAgICAgIHJlcyA9ICgqZikodywgdiwgX1B5X1N3YXBwZWRPcFtvcF0pOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorICAgIGlmICgoZiA9IFJJQ0hDT01QQVJFKHYtPm9iX3R5cGUpKSAhPSBOVUxMKSB7CisgICAgICAgIHJlcyA9ICgqZikodiwgdywgb3ApOworICAgICAgICBpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgfQorICAgIGlmICgoZiA9IFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpKSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiAoKmYpKHcsIHYsIF9QeV9Td2FwcGVkT3Bbb3BdKTsKKyAgICB9CisgICAgcmVzID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogVHJ5IGEgZ2VudWluZSByaWNoIGNvbXBhcmlzb24sIHJldHVybmluZyBhbiBpbnQuICBSZXR1cm46CkBAIC02MzksMjEgKzYzOSwyMSBAQAogc3RhdGljIGludAogdHJ5X3JpY2hfY29tcGFyZV9ib29sKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXM7Ci0JaW50IG9rOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgaW50IG9rOwogCi0JaWYgKFJJQ0hDT01QQVJFKHYtPm9iX3R5cGUpID09IE5VTEwgJiYgUklDSENPTVBBUkUody0+b2JfdHlwZSkgPT0gTlVMTCkKLQkJcmV0dXJuIDI7IC8qIFNob3J0Y3V0LCBhdm9pZCBJTkNSRUYrREVDUkVGICovCi0JcmVzID0gdHJ5X3JpY2hfY29tcGFyZSh2LCB3LCBvcCk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKHJlcyA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIDI7Ci0JfQotCW9rID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIG9rOworICAgIGlmIChSSUNIQ09NUEFSRSh2LT5vYl90eXBlKSA9PSBOVUxMICYmIFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpID09IE5VTEwpCisgICAgICAgIHJldHVybiAyOyAvKiBTaG9ydGN1dCwgYXZvaWQgSU5DUkVGK0RFQ1JFRiAqLworICAgIHJlcyA9IHRyeV9yaWNoX2NvbXBhcmUodiwgdywgb3ApOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChyZXMgPT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiBvazsKIH0KIAogLyogVHJ5IHJpY2ggY29tcGFyaXNvbnMgdG8gZGV0ZXJtaW5lIGEgMy13YXkgY29tcGFyaXNvbi4gIFJldHVybjoKQEAgLTY2NiwyNyArNjY2LDI3IEBACiBzdGF0aWMgaW50CiB0cnlfcmljaF90b18zd2F5X2NvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCXN0YXRpYyBzdHJ1Y3QgeyBpbnQgb3A7IGludCBvdXRjb21lOyB9IHRyaWVzWzNdID0gewotCQkvKiBUcnkgdGhpcyBvcGVyYXRvciwgYW5kIGlmIGl0IGlzIHRydWUsIHVzZSB0aGlzIG91dGNvbWU6ICovCi0JCXtQeV9FUSwgMH0sCi0JCXtQeV9MVCwgLTF9LAotCQl7UHlfR1QsIDF9LAotCX07Ci0JaW50IGk7CisgICAgc3RhdGljIHN0cnVjdCB7IGludCBvcDsgaW50IG91dGNvbWU7IH0gdHJpZXNbM10gPSB7CisgICAgICAgIC8qIFRyeSB0aGlzIG9wZXJhdG9yLCBhbmQgaWYgaXQgaXMgdHJ1ZSwgdXNlIHRoaXMgb3V0Y29tZTogKi8KKyAgICAgICAge1B5X0VRLCAwfSwKKyAgICAgICAge1B5X0xULCAtMX0sCisgICAgICAgIHtQeV9HVCwgMX0sCisgICAgfTsKKyAgICBpbnQgaTsKIAotCWlmIChSSUNIQ09NUEFSRSh2LT5vYl90eXBlKSA9PSBOVUxMICYmIFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpID09IE5VTEwpCi0JCXJldHVybiAyOyAvKiBTaG9ydGN1dCAqLworICAgIGlmIChSSUNIQ09NUEFSRSh2LT5vYl90eXBlKSA9PSBOVUxMICYmIFJJQ0hDT01QQVJFKHctPm9iX3R5cGUpID09IE5VTEwpCisgICAgICAgIHJldHVybiAyOyAvKiBTaG9ydGN1dCAqLwogCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlzd2l0Y2ggKHRyeV9yaWNoX2NvbXBhcmVfYm9vbCh2LCB3LCB0cmllc1tpXS5vcCkpIHsKLQkJY2FzZSAtMToKLQkJCXJldHVybiAtMjsKLQkJY2FzZSAxOgotCQkJcmV0dXJuIHRyaWVzW2ldLm91dGNvbWU7Ci0JCX0KLQl9CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBzd2l0Y2ggKHRyeV9yaWNoX2NvbXBhcmVfYm9vbCh2LCB3LCB0cmllc1tpXS5vcCkpIHsKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIHRyaWVzW2ldLm91dGNvbWU7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gMjsKKyAgICByZXR1cm4gMjsKIH0KIAogLyogVHJ5IGEgMy13YXkgY29tcGFyaXNvbiwgcmV0dXJuaW5nIGFuIGludC4gIFJldHVybjoKQEAgLTY5OSw1NSArNjk5LDU1IEBACiBzdGF0aWMgaW50CiB0cnlfM3dheV9jb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpbnQgYzsKLQljbXBmdW5jIGY7CisgICAgaW50IGM7CisgICAgY21wZnVuYyBmOwogCi0JLyogQ29tcGFyaXNvbnMgaW52b2x2aW5nIGluc3RhbmNlcyBhcmUgZ2l2ZW4gdG8gaW5zdGFuY2VfY29tcGFyZSwKLQkgICB3aGljaCBoYXMgdGhlIHNhbWUgcmV0dXJuIGNvbnZlbnRpb25zIGFzIHRoaXMgZnVuY3Rpb24uICovCisgICAgLyogQ29tcGFyaXNvbnMgaW52b2x2aW5nIGluc3RhbmNlcyBhcmUgZ2l2ZW4gdG8gaW5zdGFuY2VfY29tcGFyZSwKKyAgICAgICB3aGljaCBoYXMgdGhlIHNhbWUgcmV0dXJuIGNvbnZlbnRpb25zIGFzIHRoaXMgZnVuY3Rpb24uICovCiAKLQlmID0gdi0+b2JfdHlwZS0+dHBfY29tcGFyZTsKLQlpZiAoUHlJbnN0YW5jZV9DaGVjayh2KSkKLQkJcmV0dXJuICgqZikodiwgdyk7Ci0JaWYgKFB5SW5zdGFuY2VfQ2hlY2sodykpCi0JCXJldHVybiAoKnctPm9iX3R5cGUtPnRwX2NvbXBhcmUpKHYsIHcpOworICAgIGYgPSB2LT5vYl90eXBlLT50cF9jb21wYXJlOworICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHYpKQorICAgICAgICByZXR1cm4gKCpmKSh2LCB3KTsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh3KSkKKyAgICAgICAgcmV0dXJuICgqdy0+b2JfdHlwZS0+dHBfY29tcGFyZSkodiwgdyk7CiAKLQkvKiBJZiBib3RoIGhhdmUgdGhlIHNhbWUgKG5vbi1OVUxMKSB0cF9jb21wYXJlLCB1c2UgaXQuICovCi0JaWYgKGYgIT0gTlVMTCAmJiBmID09IHctPm9iX3R5cGUtPnRwX2NvbXBhcmUpIHsKLQkJYyA9ICgqZikodiwgdyk7Ci0JCXJldHVybiBhZGp1c3RfdHBfY29tcGFyZShjKTsKLQl9CisgICAgLyogSWYgYm90aCBoYXZlIHRoZSBzYW1lIChub24tTlVMTCkgdHBfY29tcGFyZSwgdXNlIGl0LiAqLworICAgIGlmIChmICE9IE5VTEwgJiYgZiA9PSB3LT5vYl90eXBlLT50cF9jb21wYXJlKSB7CisgICAgICAgIGMgPSAoKmYpKHYsIHcpOworICAgICAgICByZXR1cm4gYWRqdXN0X3RwX2NvbXBhcmUoYyk7CisgICAgfQogCi0JLyogSWYgZWl0aGVyIHRwX2NvbXBhcmUgaXMgX1B5T2JqZWN0X1Nsb3RDb21wYXJlLCB0aGF0J3Mgc2FmZS4gKi8KLQlpZiAoZiA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUgfHwKLQkgICAgdy0+b2JfdHlwZS0+dHBfY29tcGFyZSA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUpCi0JCXJldHVybiBfUHlPYmplY3RfU2xvdENvbXBhcmUodiwgdyk7CisgICAgLyogSWYgZWl0aGVyIHRwX2NvbXBhcmUgaXMgX1B5T2JqZWN0X1Nsb3RDb21wYXJlLCB0aGF0J3Mgc2FmZS4gKi8KKyAgICBpZiAoZiA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUgfHwKKyAgICAgICAgdy0+b2JfdHlwZS0+dHBfY29tcGFyZSA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUpCisgICAgICAgIHJldHVybiBfUHlPYmplY3RfU2xvdENvbXBhcmUodiwgdyk7CiAKLQkvKiBJZiB3ZSdyZSBoZXJlLCB2IGFuZCB3LAotCSAgICBhKSBhcmUgbm90IGluc3RhbmNlczsKLQkgICAgYikgaGF2ZSBkaWZmZXJlbnQgdHlwZXMgb3IgYSB0eXBlIHdpdGhvdXQgdHBfY29tcGFyZTsgYW5kCi0JICAgIGMpIGRvbid0IGhhdmUgYSB1c2VyLWRlZmluZWQgdHBfY29tcGFyZS4KLQkgICB0cF9jb21wYXJlIGltcGxlbWVudGF0aW9ucyBpbiBDIGFzc3VtZSB0aGF0IGJvdGggYXJndW1lbnRzCi0JICAgaGF2ZSB0aGVpciB0eXBlLCBzbyB3ZSBnaXZlIHVwIGlmIHRoZSBjb2VyY2lvbiBmYWlscyBvciBpZgotCSAgIGl0IHlpZWxkcyB0eXBlcyB3aGljaCBhcmUgc3RpbGwgaW5jb21wYXRpYmxlICh3aGljaCBjYW4KLQkgICBoYXBwZW4gd2l0aCBhIHVzZXItZGVmaW5lZCBuYl9jb2VyY2UpLgotCSovCi0JYyA9IFB5TnVtYmVyX0NvZXJjZUV4KCZ2LCAmdyk7Ci0JaWYgKGMgPCAwKQotCQlyZXR1cm4gLTI7Ci0JaWYgKGMgPiAwKQotCQlyZXR1cm4gMjsKLQlmID0gdi0+b2JfdHlwZS0+dHBfY29tcGFyZTsKLQlpZiAoZiAhPSBOVUxMICYmIGYgPT0gdy0+b2JfdHlwZS0+dHBfY29tcGFyZSkgewotCQljID0gKCpmKSh2LCB3KTsKLQkJUHlfREVDUkVGKHYpOwotCQlQeV9ERUNSRUYodyk7Ci0JCXJldHVybiBhZGp1c3RfdHBfY29tcGFyZShjKTsKLQl9CisgICAgLyogSWYgd2UncmUgaGVyZSwgdiBhbmQgdywKKyAgICAgICAgYSkgYXJlIG5vdCBpbnN0YW5jZXM7CisgICAgICAgIGIpIGhhdmUgZGlmZmVyZW50IHR5cGVzIG9yIGEgdHlwZSB3aXRob3V0IHRwX2NvbXBhcmU7IGFuZAorICAgICAgICBjKSBkb24ndCBoYXZlIGEgdXNlci1kZWZpbmVkIHRwX2NvbXBhcmUuCisgICAgICAgdHBfY29tcGFyZSBpbXBsZW1lbnRhdGlvbnMgaW4gQyBhc3N1bWUgdGhhdCBib3RoIGFyZ3VtZW50cworICAgICAgIGhhdmUgdGhlaXIgdHlwZSwgc28gd2UgZ2l2ZSB1cCBpZiB0aGUgY29lcmNpb24gZmFpbHMgb3IgaWYKKyAgICAgICBpdCB5aWVsZHMgdHlwZXMgd2hpY2ggYXJlIHN0aWxsIGluY29tcGF0aWJsZSAod2hpY2ggY2FuCisgICAgICAgaGFwcGVuIHdpdGggYSB1c2VyLWRlZmluZWQgbmJfY29lcmNlKS4KKyAgICAqLworICAgIGMgPSBQeU51bWJlcl9Db2VyY2VFeCgmdiwgJncpOworICAgIGlmIChjIDwgMCkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmIChjID4gMCkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgZiA9IHYtPm9iX3R5cGUtPnRwX2NvbXBhcmU7CisgICAgaWYgKGYgIT0gTlVMTCAmJiBmID09IHctPm9iX3R5cGUtPnRwX2NvbXBhcmUpIHsKKyAgICAgICAgYyA9ICgqZikodiwgdyk7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICByZXR1cm4gYWRqdXN0X3RwX2NvbXBhcmUoYyk7CisgICAgfQogCi0JLyogTm8gY29tcGFyaXNvbiBkZWZpbmVkICovCi0JUHlfREVDUkVGKHYpOwotCVB5X0RFQ1JFRih3KTsKLQlyZXR1cm4gMjsKKyAgICAvKiBObyBjb21wYXJpc29uIGRlZmluZWQgKi8KKyAgICBQeV9ERUNSRUYodik7CisgICAgUHlfREVDUkVGKHcpOworICAgIHJldHVybiAyOwogfQogCiAvKiBGaW5hbCBmYWxsYmFjayAzLXdheSBjb21wYXJpc29uLCByZXR1cm5pbmcgYW4gaW50LiAgUmV0dXJuOgpAQCAtNzU5LDQzICs3NTksNDMgQEAKIHN0YXRpYyBpbnQKIGRlZmF1bHRfM3dheV9jb21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpbnQgYzsKLQljb25zdCBjaGFyICp2bmFtZSwgKnduYW1lOworICAgIGludCBjOworICAgIGNvbnN0IGNoYXIgKnZuYW1lLCAqd25hbWU7CiAKLQlpZiAodi0+b2JfdHlwZSA9PSB3LT5vYl90eXBlKSB7Ci0JCS8qIFdoZW4gY29tcGFyaW5nIHRoZXNlIHBvaW50ZXJzLCB0aGV5IG11c3QgYmUgY2FzdCB0bwotCQkgKiBpbnRlZ2VyIHR5cGVzIChpLmUuIFB5X3VpbnRwdHJfdCwgb3VyIHNwZWxsaW5nIG9mIEM5WCdzCi0JCSAqIHVpbnRwdHJfdCkuICBBTlNJIHNwZWNpZmllcyB0aGF0IHBvaW50ZXIgY29tcGFyZXMgb3RoZXIKLQkJICogdGhhbiA9PSBhbmQgIT0gdG8gbm9uLXJlbGF0ZWQgc3RydWN0dXJlcyBhcmUgdW5kZWZpbmVkLgotCQkgKi8KLQkJUHlfdWludHB0cl90IHZ2ID0gKFB5X3VpbnRwdHJfdCl2OwotCQlQeV91aW50cHRyX3Qgd3cgPSAoUHlfdWludHB0cl90KXc7Ci0JCXJldHVybiAodnYgPCB3dykgPyAtMSA6ICh2diA+IHd3KSA/IDEgOiAwOwotCX0KKyAgICBpZiAodi0+b2JfdHlwZSA9PSB3LT5vYl90eXBlKSB7CisgICAgICAgIC8qIFdoZW4gY29tcGFyaW5nIHRoZXNlIHBvaW50ZXJzLCB0aGV5IG11c3QgYmUgY2FzdCB0bworICAgICAgICAgKiBpbnRlZ2VyIHR5cGVzIChpLmUuIFB5X3VpbnRwdHJfdCwgb3VyIHNwZWxsaW5nIG9mIEM5WCdzCisgICAgICAgICAqIHVpbnRwdHJfdCkuICBBTlNJIHNwZWNpZmllcyB0aGF0IHBvaW50ZXIgY29tcGFyZXMgb3RoZXIKKyAgICAgICAgICogdGhhbiA9PSBhbmQgIT0gdG8gbm9uLXJlbGF0ZWQgc3RydWN0dXJlcyBhcmUgdW5kZWZpbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgUHlfdWludHB0cl90IHZ2ID0gKFB5X3VpbnRwdHJfdCl2OworICAgICAgICBQeV91aW50cHRyX3Qgd3cgPSAoUHlfdWludHB0cl90KXc7CisgICAgICAgIHJldHVybiAodnYgPCB3dykgPyAtMSA6ICh2diA+IHd3KSA/IDEgOiAwOworICAgIH0KIAotCS8qIE5vbmUgaXMgc21hbGxlciB0aGFuIGFueXRoaW5nICovCi0JaWYgKHYgPT0gUHlfTm9uZSkKLQkJcmV0dXJuIC0xOwotCWlmICh3ID09IFB5X05vbmUpCi0JCXJldHVybiAxOworICAgIC8qIE5vbmUgaXMgc21hbGxlciB0aGFuIGFueXRoaW5nICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICh3ID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiAxOwogCi0JLyogZGlmZmVyZW50IHR5cGU6IGNvbXBhcmUgdHlwZSBuYW1lczsgbnVtYmVycyBhcmUgc21hbGxlciAqLwotCWlmIChQeU51bWJlcl9DaGVjayh2KSkKLQkJdm5hbWUgPSAiIjsKLQllbHNlCi0JCXZuYW1lID0gdi0+b2JfdHlwZS0+dHBfbmFtZTsKLQlpZiAoUHlOdW1iZXJfQ2hlY2sodykpCi0JCXduYW1lID0gIiI7Ci0JZWxzZQotCQl3bmFtZSA9IHctPm9iX3R5cGUtPnRwX25hbWU7Ci0JYyA9IHN0cmNtcCh2bmFtZSwgd25hbWUpOwotCWlmIChjIDwgMCkKLQkJcmV0dXJuIC0xOwotCWlmIChjID4gMCkKLQkJcmV0dXJuIDE7Ci0JLyogU2FtZSB0eXBlIG5hbWUsIG9yIChtb3JlIGxpa2VseSkgaW5jb21wYXJhYmxlIG51bWVyaWMgdHlwZXMgKi8KLQlyZXR1cm4gKChQeV91aW50cHRyX3QpKHYtPm9iX3R5cGUpIDwgKAotCQlQeV91aW50cHRyX3QpKHctPm9iX3R5cGUpKSA/IC0xIDogMTsKKyAgICAvKiBkaWZmZXJlbnQgdHlwZTogY29tcGFyZSB0eXBlIG5hbWVzOyBudW1iZXJzIGFyZSBzbWFsbGVyICovCisgICAgaWYgKFB5TnVtYmVyX0NoZWNrKHYpKQorICAgICAgICB2bmFtZSA9ICIiOworICAgIGVsc2UKKyAgICAgICAgdm5hbWUgPSB2LT5vYl90eXBlLT50cF9uYW1lOworICAgIGlmIChQeU51bWJlcl9DaGVjayh3KSkKKyAgICAgICAgd25hbWUgPSAiIjsKKyAgICBlbHNlCisgICAgICAgIHduYW1lID0gdy0+b2JfdHlwZS0+dHBfbmFtZTsKKyAgICBjID0gc3RyY21wKHZuYW1lLCB3bmFtZSk7CisgICAgaWYgKGMgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGMgPiAwKQorICAgICAgICByZXR1cm4gMTsKKyAgICAvKiBTYW1lIHR5cGUgbmFtZSwgb3IgKG1vcmUgbGlrZWx5KSBpbmNvbXBhcmFibGUgbnVtZXJpYyB0eXBlcyAqLworICAgIHJldHVybiAoKFB5X3VpbnRwdHJfdCkodi0+b2JfdHlwZSkgPCAoCisgICAgICAgIFB5X3VpbnRwdHJfdCkody0+b2JfdHlwZSkpID8gLTEgOiAxOwogfQogCiAvKiBEbyBhIDMtd2F5IGNvbXBhcmlzb24sIGJ5IGhvb2sgb3IgYnkgY3Jvb2suICBSZXR1cm46CkBAIC04MDksMzUgKzgwOSwzNSBAQAogc3RhdGljIGludAogZG9fY21wKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpbnQgYzsKLQljbXBmdW5jIGY7CisgICAgaW50IGM7CisgICAgY21wZnVuYyBmOwogCi0JaWYgKHYtPm9iX3R5cGUgPT0gdy0+b2JfdHlwZQotCSAgICAmJiAoZiA9IHYtPm9iX3R5cGUtPnRwX2NvbXBhcmUpICE9IE5VTEwpIHsKLQkJYyA9ICgqZikodiwgdyk7Ci0JCWlmIChQeUluc3RhbmNlX0NoZWNrKHYpKSB7Ci0JCQkvKiBJbnN0YW5jZSB0cF9jb21wYXJlIGhhcyBhIGRpZmZlcmVudCBzaWduYXR1cmUuCi0JCQkgICBCdXQgaWYgaXQgcmV0dXJucyB1bmRlZmluZWQgd2UgZmFsbCB0aHJvdWdoLiAqLwotCQkJaWYgKGMgIT0gMikKLQkJCQlyZXR1cm4gYzsKLQkJCS8qIEVsc2UgZmFsbCB0aHJvdWdoIHRvIHRyeV9yaWNoX3RvXzN3YXlfY29tcGFyZSgpICovCi0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGFkanVzdF90cF9jb21wYXJlKGMpOwotCX0KLQkvKiBXZSBvbmx5IGdldCBoZXJlIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6Ci0JICAgYSkgdiBhbmQgdyBoYXZlIGRpZmZlcmVudCB0eXBlcwotCSAgIGIpIHYgYW5kIHcgaGF2ZSB0aGUgc2FtZSB0eXBlLCB3aGljaCBkb2Vzbid0IGhhdmUgdHBfY29tcGFyZQotCSAgIGMpIHYgYW5kIHcgYXJlIGluc3RhbmNlcywgYW5kIGVpdGhlciBfX2NtcF9fIGlzIG5vdCBkZWZpbmVkIG9yCi0JICAgICAgX19jbXBfXyByZXR1cm5zIE5vdEltcGxlbWVudGVkCi0JKi8KLQljID0gdHJ5X3JpY2hfdG9fM3dheV9jb21wYXJlKHYsIHcpOwotCWlmIChjIDwgMikKLQkJcmV0dXJuIGM7Ci0JYyA9IHRyeV8zd2F5X2NvbXBhcmUodiwgdyk7Ci0JaWYgKGMgPCAyKQotCQlyZXR1cm4gYzsKLQlyZXR1cm4gZGVmYXVsdF8zd2F5X2NvbXBhcmUodiwgdyk7CisgICAgaWYgKHYtPm9iX3R5cGUgPT0gdy0+b2JfdHlwZQorICAgICAgICAmJiAoZiA9IHYtPm9iX3R5cGUtPnRwX2NvbXBhcmUpICE9IE5VTEwpIHsKKyAgICAgICAgYyA9ICgqZikodiwgdyk7CisgICAgICAgIGlmIChQeUluc3RhbmNlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAvKiBJbnN0YW5jZSB0cF9jb21wYXJlIGhhcyBhIGRpZmZlcmVudCBzaWduYXR1cmUuCisgICAgICAgICAgICAgICBCdXQgaWYgaXQgcmV0dXJucyB1bmRlZmluZWQgd2UgZmFsbCB0aHJvdWdoLiAqLworICAgICAgICAgICAgaWYgKGMgIT0gMikKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIC8qIEVsc2UgZmFsbCB0aHJvdWdoIHRvIHRyeV9yaWNoX3RvXzN3YXlfY29tcGFyZSgpICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGFkanVzdF90cF9jb21wYXJlKGMpOworICAgIH0KKyAgICAvKiBXZSBvbmx5IGdldCBoZXJlIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6CisgICAgICAgYSkgdiBhbmQgdyBoYXZlIGRpZmZlcmVudCB0eXBlcworICAgICAgIGIpIHYgYW5kIHcgaGF2ZSB0aGUgc2FtZSB0eXBlLCB3aGljaCBkb2Vzbid0IGhhdmUgdHBfY29tcGFyZQorICAgICAgIGMpIHYgYW5kIHcgYXJlIGluc3RhbmNlcywgYW5kIGVpdGhlciBfX2NtcF9fIGlzIG5vdCBkZWZpbmVkIG9yCisgICAgICAgICAgX19jbXBfXyByZXR1cm5zIE5vdEltcGxlbWVudGVkCisgICAgKi8KKyAgICBjID0gdHJ5X3JpY2hfdG9fM3dheV9jb21wYXJlKHYsIHcpOworICAgIGlmIChjIDwgMikKKyAgICAgICAgcmV0dXJuIGM7CisgICAgYyA9IHRyeV8zd2F5X2NvbXBhcmUodiwgdyk7CisgICAgaWYgKGMgPCAyKQorICAgICAgICByZXR1cm4gYzsKKyAgICByZXR1cm4gZGVmYXVsdF8zd2F5X2NvbXBhcmUodiwgdyk7CiB9CiAKIC8qIENvbXBhcmUgdiB0byB3LiAgUmV0dXJuCkBAIC04NTAsMzcgKzg1MCwzNyBAQAogaW50CiBQeU9iamVjdF9Db21wYXJlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKIHsKLQlpbnQgcmVzdWx0OworICAgIGludCByZXN1bHQ7CiAKLQlpZiAodiA9PSBOVUxMIHx8IHcgPT0gTlVMTCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAodiA9PSB3KQotCQlyZXR1cm4gMDsKLQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gY21wIikpCi0JCXJldHVybiAtMTsKLQlyZXN1bHQgPSBkb19jbXAodiwgdyk7Ci0JUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JcmV0dXJuIHJlc3VsdCA8IDAgPyAtMSA6IHJlc3VsdDsKKyAgICBpZiAodiA9PSBOVUxMIHx8IHcgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodiA9PSB3KQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gY21wIikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXN1bHQgPSBkb19jbXAodiwgdyk7CisgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgcmV0dXJuIHJlc3VsdCA8IDAgPyAtMSA6IHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIChuZXcgcmVmZXJlbmNlIHRvKSBQeV9UcnVlIG9yIFB5X0ZhbHNlLiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGNvbnZlcnRfM3dheV90b19vYmplY3QoaW50IG9wLCBpbnQgYykKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5X0xUOiBjID0gYyA8ICAwOyBicmVhazsKLQljYXNlIFB5X0xFOiBjID0gYyA8PSAwOyBicmVhazsKLQljYXNlIFB5X0VROiBjID0gYyA9PSAwOyBicmVhazsKLQljYXNlIFB5X05FOiBjID0gYyAhPSAwOyBicmVhazsKLQljYXNlIFB5X0dUOiBjID0gYyA+ICAwOyBicmVhazsKLQljYXNlIFB5X0dFOiBjID0gYyA+PSAwOyBicmVhazsKLQl9Ci0JcmVzdWx0ID0gYyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlfTFQ6IGMgPSBjIDwgIDA7IGJyZWFrOworICAgIGNhc2UgUHlfTEU6IGMgPSBjIDw9IDA7IGJyZWFrOworICAgIGNhc2UgUHlfRVE6IGMgPSBjID09IDA7IGJyZWFrOworICAgIGNhc2UgUHlfTkU6IGMgPSBjICE9IDA7IGJyZWFrOworICAgIGNhc2UgUHlfR1Q6IGMgPSBjID4gIDA7IGJyZWFrOworICAgIGNhc2UgUHlfR0U6IGMgPSBjID49IDA7IGJyZWFrOworICAgIH0KKyAgICByZXN1bHQgPSBjID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFdlIHdhbnQgYSByaWNoIGNvbXBhcmlzb24gYnV0IGRvbid0IGhhdmUgb25lLiAgVHJ5IGEgMy13YXkgY21wIGluc3RlYWQuCkBAIC04OTIsMjUgKzg5MiwyNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRyeV8zd2F5X3RvX3JpY2hfY29tcGFyZShQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlpbnQgYzsKKyAgICBpbnQgYzsKIAotCWMgPSB0cnlfM3dheV9jb21wYXJlKHYsIHcpOwotCWlmIChjID49IDIpIHsKKyAgICBjID0gdHJ5XzN3YXlfY29tcGFyZSh2LCB3KTsKKyAgICBpZiAoYyA+PSAyKSB7CiAKLQkJLyogUHkzSyB3YXJuaW5nIGlmIHR5cGVzIGFyZSBub3QgZXF1YWwgYW5kIGNvbXBhcmlzb24gaXNuJ3QgPT0gb3IgIT0gICovCi0JCWlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYKLQkJICAgIHYtPm9iX3R5cGUgIT0gdy0+b2JfdHlwZSAmJiBvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSAmJgotCQkgICAgUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCSAgICAgICAiY29tcGFyaW5nIHVuZXF1YWwgdHlwZXMgbm90IHN1cHBvcnRlZCAiCi0JCQkgICAgICAgImluIDMueCIsIDEpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgLyogUHkzSyB3YXJuaW5nIGlmIHR5cGVzIGFyZSBub3QgZXF1YWwgYW5kIGNvbXBhcmlzb24gaXNuJ3QgPT0gb3IgIT0gICovCisgICAgICAgIGlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYKKyAgICAgICAgICAgIHYtPm9iX3R5cGUgIT0gdy0+b2JfdHlwZSAmJiBvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSAmJgorICAgICAgICAgICAgUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhcmluZyB1bmVxdWFsIHR5cGVzIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAiaW4gMy54IiwgMSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWMgPSBkZWZhdWx0XzN3YXlfY29tcGFyZSh2LCB3KTsKLQl9Ci0JaWYgKGMgPD0gLTIpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBjb252ZXJ0XzN3YXlfdG9fb2JqZWN0KG9wLCBjKTsKKyAgICAgICAgYyA9IGRlZmF1bHRfM3dheV9jb21wYXJlKHYsIHcpOworICAgIH0KKyAgICBpZiAoYyA8PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNvbnZlcnRfM3dheV90b19vYmplY3Qob3AsIGMpOwogfQogCiAvKiBEbyByaWNoIGNvbXBhcmlzb24gb24gdiBhbmQgdy4gIFJldHVybgpAQCAtOTIyLDE0ICs5MjIsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb19yaWNoY21wKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCXJlcyA9IHRyeV9yaWNoX2NvbXBhcmUodiwgdywgb3ApOwotCWlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCi0JCXJldHVybiByZXM7Ci0JUHlfREVDUkVGKHJlcyk7CisgICAgcmVzID0gdHJ5X3JpY2hfY29tcGFyZSh2LCB3LCBvcCk7CisgICAgaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBQeV9ERUNSRUYocmVzKTsKIAotCXJldHVybiB0cnlfM3dheV90b19yaWNoX2NvbXBhcmUodiwgdywgb3ApOworICAgIHJldHVybiB0cnlfM3dheV90b19yaWNoX2NvbXBhcmUodiwgdywgb3ApOwogfQogCiAvKiBSZXR1cm46CkBAIC05NDAsNzcgKzk0MCw3NyBAQAogUHlPYmplY3QgKgogUHlPYmplY3RfUmljaENvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JYXNzZXJ0KFB5X0xUIDw9IG9wICYmIG9wIDw9IFB5X0dFKTsKLQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgaW4gY21wIikpCi0JCXJldHVybiBOVUxMOworICAgIGFzc2VydChQeV9MVCA8PSBvcCAmJiBvcCA8PSBQeV9HRSk7CisgICAgaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIGluIGNtcCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIElmIHRoZSB0eXBlcyBhcmUgZXF1YWwsIGFuZCBub3Qgb2xkLXN0eWxlIGluc3RhbmNlcywgdHJ5IHRvCi0JICAgZ2V0IG91dCBjaGVhcCAoZG9uJ3QgYm90aGVyIHdpdGggY29lcmNpb25zIGV0Yy4pLiAqLwotCWlmICh2LT5vYl90eXBlID09IHctPm9iX3R5cGUgJiYgIVB5SW5zdGFuY2VfQ2hlY2sodikpIHsKLQkJY21wZnVuYyBmY21wOwotCQlyaWNoY21wZnVuYyBmcmljaCA9IFJJQ0hDT01QQVJFKHYtPm9iX3R5cGUpOwotCQkvKiBJZiB0aGUgdHlwZSBoYXMgcmljaGNtcCwgdHJ5IGl0IGZpcnN0LiAgdHJ5X3JpY2hfY29tcGFyZQotCQkgICB0cmllcyBpdCB0d28tc2lkZWQsIHdoaWNoIGlzIG5vdCBuZWVkZWQgc2luY2Ugd2UndmUgYQotCQkgICBzaW5nbGUgdHlwZSBvbmx5LiAqLwotCQlpZiAoZnJpY2ggIT0gTlVMTCkgewotCQkJcmVzID0gKCpmcmljaCkodiwgdywgb3ApOwotCQkJaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCQlnb3RvIERvbmU7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJfQotCQkvKiBObyByaWNoY21wLCBvciB0aGlzIHBhcnRpY3VsYXIgcmljaG1wIG5vdCBpbXBsZW1lbnRlZC4KLQkJICAgVHJ5IDMtd2F5IGNtcC4gKi8KLQkJZmNtcCA9IHYtPm9iX3R5cGUtPnRwX2NvbXBhcmU7Ci0JCWlmIChmY21wICE9IE5VTEwpIHsKLQkJCWludCBjID0gKCpmY21wKSh2LCB3KTsKLQkJCWMgPSBhZGp1c3RfdHBfY29tcGFyZShjKTsKLQkJCWlmIChjID09IC0yKSB7Ci0JCQkJcmVzID0gTlVMTDsKLQkJCQlnb3RvIERvbmU7Ci0JCQl9Ci0JCQlyZXMgPSBjb252ZXJ0XzN3YXlfdG9fb2JqZWN0KG9wLCBjKTsKLQkJCWdvdG8gRG9uZTsKLQkJfQotCX0KKyAgICAvKiBJZiB0aGUgdHlwZXMgYXJlIGVxdWFsLCBhbmQgbm90IG9sZC1zdHlsZSBpbnN0YW5jZXMsIHRyeSB0bworICAgICAgIGdldCBvdXQgY2hlYXAgKGRvbid0IGJvdGhlciB3aXRoIGNvZXJjaW9ucyBldGMuKS4gKi8KKyAgICBpZiAodi0+b2JfdHlwZSA9PSB3LT5vYl90eXBlICYmICFQeUluc3RhbmNlX0NoZWNrKHYpKSB7CisgICAgICAgIGNtcGZ1bmMgZmNtcDsKKyAgICAgICAgcmljaGNtcGZ1bmMgZnJpY2ggPSBSSUNIQ09NUEFSRSh2LT5vYl90eXBlKTsKKyAgICAgICAgLyogSWYgdGhlIHR5cGUgaGFzIHJpY2hjbXAsIHRyeSBpdCBmaXJzdC4gIHRyeV9yaWNoX2NvbXBhcmUKKyAgICAgICAgICAgdHJpZXMgaXQgdHdvLXNpZGVkLCB3aGljaCBpcyBub3QgbmVlZGVkIHNpbmNlIHdlJ3ZlIGEKKyAgICAgICAgICAgc2luZ2xlIHR5cGUgb25seS4gKi8KKyAgICAgICAgaWYgKGZyaWNoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlcyA9ICgqZnJpY2gpKHYsIHcsIG9wKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgLyogTm8gcmljaGNtcCwgb3IgdGhpcyBwYXJ0aWN1bGFyIHJpY2htcCBub3QgaW1wbGVtZW50ZWQuCisgICAgICAgICAgIFRyeSAzLXdheSBjbXAuICovCisgICAgICAgIGZjbXAgPSB2LT5vYl90eXBlLT50cF9jb21wYXJlOworICAgICAgICBpZiAoZmNtcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgYyA9ICgqZmNtcCkodiwgdyk7CisgICAgICAgICAgICBjID0gYWRqdXN0X3RwX2NvbXBhcmUoYyk7CisgICAgICAgICAgICBpZiAoYyA9PSAtMikgeworICAgICAgICAgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgZ290byBEb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gY29udmVydF8zd2F5X3RvX29iamVjdChvcCwgYyk7CisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBGYXN0IHBhdGggbm90IHRha2VuLCBvciBjb3VsZG4ndCBkZWxpdmVyIGEgdXNlZnVsIHJlc3VsdC4gKi8KLQlyZXMgPSBkb19yaWNoY21wKHYsIHcsIG9wKTsKKyAgICAvKiBGYXN0IHBhdGggbm90IHRha2VuLCBvciBjb3VsZG4ndCBkZWxpdmVyIGEgdXNlZnVsIHJlc3VsdC4gKi8KKyAgICByZXMgPSBkb19yaWNoY21wKHYsIHcsIG9wKTsKIERvbmU6Ci0JUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiBSZXR1cm4gLTEgaWYgZXJyb3I7IDEgaWYgdiBvcCB3OyAwIGlmIG5vdCAodiBvcCB3KS4gKi8KIGludAogUHlPYmplY3RfUmljaENvbXBhcmVCb29sKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXM7Ci0JaW50IG9rOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgaW50IG9rOwogCi0JLyogUXVpY2sgcmVzdWx0IHdoZW4gb2JqZWN0cyBhcmUgdGhlIHNhbWUuCi0JICAgR3VhcmFudGVlcyB0aGF0IGlkZW50aXR5IGltcGxpZXMgZXF1YWxpdHkuICovCi0JaWYgKHYgPT0gdykgewotCQlpZiAob3AgPT0gUHlfRVEpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZSBpZiAob3AgPT0gUHlfTkUpCi0JCQlyZXR1cm4gMDsKLQl9CisgICAgLyogUXVpY2sgcmVzdWx0IHdoZW4gb2JqZWN0cyBhcmUgdGhlIHNhbWUuCisgICAgICAgR3VhcmFudGVlcyB0aGF0IGlkZW50aXR5IGltcGxpZXMgZXF1YWxpdHkuICovCisgICAgaWYgKHYgPT0gdykgeworICAgICAgICBpZiAob3AgPT0gUHlfRVEpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgZWxzZSBpZiAob3AgPT0gUHlfTkUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlyZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZSh2LCB3LCBvcCk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5Qm9vbF9DaGVjayhyZXMpKQotCQlvayA9IChyZXMgPT0gUHlfVHJ1ZSk7Ci0JZWxzZQotCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBvazsKKyAgICByZXMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZSh2LCB3LCBvcCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5Qm9vbF9DaGVjayhyZXMpKQorICAgICAgICBvayA9IChyZXMgPT0gUHlfVHJ1ZSk7CisgICAgZWxzZQorICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiBvazsKIH0KIAogLyogU2V0IG9mIGhhc2ggdXRpbGl0eSBmdW5jdGlvbnMgdG8gaGVscCBtYWludGFpbmluZyB0aGUgaW52YXJpYW50IHRoYXQKLQlpZiBhPT1iIHRoZW4gaGFzaChhKT09aGFzaChiKQorICAgIGlmIGE9PWIgdGhlbiBoYXNoKGEpPT1oYXNoKGIpCiAKICAgIEFsbCB0aGUgdXRpbGl0eSBmdW5jdGlvbnMgKF9QeV9IYXNoKigpKSByZXR1cm4gIi0xIiB0byBzaWduaWZ5IGFuIGVycm9yLgogKi8KQEAgLTEwMTgsMjU3ICsxMDE4LDI1NyBAQAogbG9uZwogX1B5X0hhc2hEb3VibGUoZG91YmxlIHYpCiB7Ci0JZG91YmxlIGludHBhcnQsIGZyYWN0cGFydDsKLQlpbnQgZXhwbzsKLQlsb25nIGhpcGFydDsKLQlsb25nIHg7CQkvKiB0aGUgZmluYWwgaGFzaCB2YWx1ZSAqLwotCS8qIFRoaXMgaXMgZGVzaWduZWQgc28gdGhhdCBQeXRob24gbnVtYmVycyBvZiBkaWZmZXJlbnQgdHlwZXMKLQkgKiB0aGF0IGNvbXBhcmUgZXF1YWwgaGFzaCB0byB0aGUgc2FtZSB2YWx1ZTsgb3RoZXJ3aXNlIGNvbXBhcmlzb25zCi0JICogb2YgbWFwcGluZyBrZXlzIHdpbGwgdHVybiBvdXQgd2VpcmQuCi0JICovCisgICAgZG91YmxlIGludHBhcnQsIGZyYWN0cGFydDsKKyAgICBpbnQgZXhwbzsKKyAgICBsb25nIGhpcGFydDsKKyAgICBsb25nIHg7ICAgICAgICAgICAgIC8qIHRoZSBmaW5hbCBoYXNoIHZhbHVlICovCisgICAgLyogVGhpcyBpcyBkZXNpZ25lZCBzbyB0aGF0IFB5dGhvbiBudW1iZXJzIG9mIGRpZmZlcmVudCB0eXBlcworICAgICAqIHRoYXQgY29tcGFyZSBlcXVhbCBoYXNoIHRvIHRoZSBzYW1lIHZhbHVlOyBvdGhlcndpc2UgY29tcGFyaXNvbnMKKyAgICAgKiBvZiBtYXBwaW5nIGtleXMgd2lsbCB0dXJuIG91dCB3ZWlyZC4KKyAgICAgKi8KIAotCWZyYWN0cGFydCA9IG1vZGYodiwgJmludHBhcnQpOwotCWlmIChmcmFjdHBhcnQgPT0gMC4wKSB7Ci0JCS8qIFRoaXMgbXVzdCByZXR1cm4gdGhlIHNhbWUgaGFzaCBhcyBhbiBlcXVhbCBpbnQgb3IgbG9uZy4gKi8KLQkJaWYgKGludHBhcnQgPiBMT05HX01BWC8yIHx8IC1pbnRwYXJ0ID4gTE9OR19NQVgvMikgewotCQkJLyogQ29udmVydCB0byBsb25nIGFuZCB1c2UgaXRzIGhhc2guICovCi0JCQlQeU9iamVjdCAqcGxvbmc7CS8qIGNvbnZlcnRlZCB0byBQeXRob24gbG9uZyAqLwotCQkJaWYgKFB5X0lTX0lORklOSVRZKGludHBhcnQpKQotCQkJCS8qIGNhbid0IGNvbnZlcnQgdG8gbG9uZyBpbnQgLS0gYXJiaXRyYXJ5ICovCi0JCQkJdiA9IHYgPCAwID8gLTI3MTgyOC4wIDogMzE0MTU5LjA7Ci0JCQlwbG9uZyA9IFB5TG9uZ19Gcm9tRG91YmxlKHYpOwotCQkJaWYgKHBsb25nID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQkJeCA9IFB5T2JqZWN0X0hhc2gocGxvbmcpOwotCQkJUHlfREVDUkVGKHBsb25nKTsKLQkJCXJldHVybiB4OwotCQl9Ci0JCS8qIEZpdHMgaW4gYSBDIGxvbmcgPT0gYSBQeXRob24gaW50LCBzbyBpcyBpdHMgb3duIGhhc2guICovCi0JCXggPSAobG9uZylpbnRwYXJ0OwotCQlpZiAoeCA9PSAtMSkKLQkJCXggPSAtMjsKLQkJcmV0dXJuIHg7Ci0JfQotCS8qIFRoZSBmcmFjdGlvbmFsIHBhcnQgaXMgbm9uLXplcm8sIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQKLQkgKiBtYWtpbmcgdGhpcyBtYXRjaCB0aGUgaGFzaCBvZiBzb21lIG90aGVyIHR5cGUuCi0JICogVXNlIGZyZXhwIHRvIGdldCBhdCB0aGUgYml0cyBpbiB0aGUgZG91YmxlLgotCSAqIFNpbmNlIHRoZSBWQVggRCBkb3VibGUgZm9ybWF0IGhhcyA1NiBtYW50aXNzYSBiaXRzLCB3aGljaCBpcyB0aGUKLQkgKiBtb3N0IG9mIGFueSBkb3VibGUgZm9ybWF0IGluIHVzZSwgZWFjaCBvZiB0aGVzZSBwYXJ0cyBtYXkgaGF2ZSBhcwotCSAqIG1hbnkgYXMgKGJ1dCBubyBtb3JlIHRoYW4pIDU2IHNpZ25pZmljYW50IGJpdHMuCi0JICogU28sIGFzc3VtaW5nIHNpemVvZihsb25nKSA+PSA0LCBlYWNoIHBhcnQgY2FuIGJlIGJyb2tlbiBpbnRvIHR3bwotCSAqIGxvbmdzOyBmcmV4cCBhbmQgbXVsdGlwbGljYXRpb24gYXJlIHVzZWQgdG8gZG8gdGhhdC4KLQkgKiBBbHNvLCBzaW5jZSB0aGUgQ3JheSBkb3VibGUgZm9ybWF0IGhhcyAxNSBleHBvbmVudCBiaXRzLCB3aGljaCBpcwotCSAqIHRoZSBtb3N0IG9mIGFueSBkb3VibGUgZm9ybWF0IGluIHVzZSwgc2hpZnRpbmcgdGhlIGV4cG9uZW50IGZpZWxkCi0JICogbGVmdCBieSAxNSB3b24ndCBvdmVyZmxvdyBhIGxvbmcgKGFnYWluIGFzc3VtaW5nIHNpemVvZihsb25nKSA+PSA0KS4KLQkgKi8KLQl2ID0gZnJleHAodiwgJmV4cG8pOwotCXYgKj0gMjE0NzQ4MzY0OC4wOwkvKiAyKiozMSAqLwotCWhpcGFydCA9IChsb25nKXY7CS8qIHRha2UgdGhlIHRvcCAzMiBiaXRzICovCi0JdiA9ICh2IC0gKGRvdWJsZSloaXBhcnQpICogMjE0NzQ4MzY0OC4wOyAvKiBnZXQgdGhlIG5leHQgMzIgYml0cyAqLwotCXggPSBoaXBhcnQgKyAobG9uZyl2ICsgKGV4cG8gPDwgMTUpOwotCWlmICh4ID09IC0xKQotCQl4ID0gLTI7Ci0JcmV0dXJuIHg7CisgICAgZnJhY3RwYXJ0ID0gbW9kZih2LCAmaW50cGFydCk7CisgICAgaWYgKGZyYWN0cGFydCA9PSAwLjApIHsKKyAgICAgICAgLyogVGhpcyBtdXN0IHJldHVybiB0aGUgc2FtZSBoYXNoIGFzIGFuIGVxdWFsIGludCBvciBsb25nLiAqLworICAgICAgICBpZiAoaW50cGFydCA+IExPTkdfTUFYLzIgfHwgLWludHBhcnQgPiBMT05HX01BWC8yKSB7CisgICAgICAgICAgICAvKiBDb252ZXJ0IHRvIGxvbmcgYW5kIHVzZSBpdHMgaGFzaC4gKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpwbG9uZzsgICAgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnRlZCB0byBQeXRob24gbG9uZyAqLworICAgICAgICAgICAgaWYgKFB5X0lTX0lORklOSVRZKGludHBhcnQpKQorICAgICAgICAgICAgICAgIC8qIGNhbid0IGNvbnZlcnQgdG8gbG9uZyBpbnQgLS0gYXJiaXRyYXJ5ICovCisgICAgICAgICAgICAgICAgdiA9IHYgPCAwID8gLTI3MTgyOC4wIDogMzE0MTU5LjA7CisgICAgICAgICAgICBwbG9uZyA9IFB5TG9uZ19Gcm9tRG91YmxlKHYpOworICAgICAgICAgICAgaWYgKHBsb25nID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgeCA9IFB5T2JqZWN0X0hhc2gocGxvbmcpOworICAgICAgICAgICAgUHlfREVDUkVGKHBsb25nKTsKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICB9CisgICAgICAgIC8qIEZpdHMgaW4gYSBDIGxvbmcgPT0gYSBQeXRob24gaW50LCBzbyBpcyBpdHMgb3duIGhhc2guICovCisgICAgICAgIHggPSAobG9uZylpbnRwYXJ0OworICAgICAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgICAgIHggPSAtMjsKKyAgICAgICAgcmV0dXJuIHg7CisgICAgfQorICAgIC8qIFRoZSBmcmFjdGlvbmFsIHBhcnQgaXMgbm9uLXplcm8sIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQKKyAgICAgKiBtYWtpbmcgdGhpcyBtYXRjaCB0aGUgaGFzaCBvZiBzb21lIG90aGVyIHR5cGUuCisgICAgICogVXNlIGZyZXhwIHRvIGdldCBhdCB0aGUgYml0cyBpbiB0aGUgZG91YmxlLgorICAgICAqIFNpbmNlIHRoZSBWQVggRCBkb3VibGUgZm9ybWF0IGhhcyA1NiBtYW50aXNzYSBiaXRzLCB3aGljaCBpcyB0aGUKKyAgICAgKiBtb3N0IG9mIGFueSBkb3VibGUgZm9ybWF0IGluIHVzZSwgZWFjaCBvZiB0aGVzZSBwYXJ0cyBtYXkgaGF2ZSBhcworICAgICAqIG1hbnkgYXMgKGJ1dCBubyBtb3JlIHRoYW4pIDU2IHNpZ25pZmljYW50IGJpdHMuCisgICAgICogU28sIGFzc3VtaW5nIHNpemVvZihsb25nKSA+PSA0LCBlYWNoIHBhcnQgY2FuIGJlIGJyb2tlbiBpbnRvIHR3bworICAgICAqIGxvbmdzOyBmcmV4cCBhbmQgbXVsdGlwbGljYXRpb24gYXJlIHVzZWQgdG8gZG8gdGhhdC4KKyAgICAgKiBBbHNvLCBzaW5jZSB0aGUgQ3JheSBkb3VibGUgZm9ybWF0IGhhcyAxNSBleHBvbmVudCBiaXRzLCB3aGljaCBpcworICAgICAqIHRoZSBtb3N0IG9mIGFueSBkb3VibGUgZm9ybWF0IGluIHVzZSwgc2hpZnRpbmcgdGhlIGV4cG9uZW50IGZpZWxkCisgICAgICogbGVmdCBieSAxNSB3b24ndCBvdmVyZmxvdyBhIGxvbmcgKGFnYWluIGFzc3VtaW5nIHNpemVvZihsb25nKSA+PSA0KS4KKyAgICAgKi8KKyAgICB2ID0gZnJleHAodiwgJmV4cG8pOworICAgIHYgKj0gMjE0NzQ4MzY0OC4wOyAgICAgICAgICAvKiAyKiozMSAqLworICAgIGhpcGFydCA9IChsb25nKXY7ICAgICAgICAgICAvKiB0YWtlIHRoZSB0b3AgMzIgYml0cyAqLworICAgIHYgPSAodiAtIChkb3VibGUpaGlwYXJ0KSAqIDIxNDc0ODM2NDguMDsgLyogZ2V0IHRoZSBuZXh0IDMyIGJpdHMgKi8KKyAgICB4ID0gaGlwYXJ0ICsgKGxvbmcpdiArIChleHBvIDw8IDE1KTsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgeCA9IC0yOworICAgIHJldHVybiB4OwogfQogCiBsb25nCiBfUHlfSGFzaFBvaW50ZXIodm9pZCAqcCkKIHsKICNpZiBTSVpFT0ZfTE9ORyA+PSBTSVpFT0ZfVk9JRF9QCi0JcmV0dXJuIChsb25nKXA7CisgICAgcmV0dXJuIChsb25nKXA7CiAjZWxzZQotCS8qIGNvbnZlcnQgdG8gYSBQeXRob24gbG9uZyBhbmQgaGFzaCB0aGF0ICovCi0JUHlPYmplY3QqIGxvbmdvYmo7Ci0JbG9uZyB4OworICAgIC8qIGNvbnZlcnQgdG8gYSBQeXRob24gbG9uZyBhbmQgaGFzaCB0aGF0ICovCisgICAgUHlPYmplY3QqIGxvbmdvYmo7CisgICAgbG9uZyB4OwogCi0JaWYgKChsb25nb2JqID0gUHlMb25nX0Zyb21Wb2lkUHRyKHApKSA9PSBOVUxMKSB7Ci0JCXggPSAtMTsKLQkJZ290byBmaW5hbGx5OwotCX0KLQl4ID0gUHlPYmplY3RfSGFzaChsb25nb2JqKTsKKyAgICBpZiAoKGxvbmdvYmogPSBQeUxvbmdfRnJvbVZvaWRQdHIocCkpID09IE5VTEwpIHsKKyAgICAgICAgeCA9IC0xOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIHggPSBQeU9iamVjdF9IYXNoKGxvbmdvYmopOwogCiBmaW5hbGx5OgotCVB5X1hERUNSRUYobG9uZ29iaik7Ci0JcmV0dXJuIHg7CisgICAgUHlfWERFQ1JFRihsb25nb2JqKTsKKyAgICByZXR1cm4geDsKICNlbmRpZgogfQogCiBsb25nCiBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZTogJyUuMjAwcyciLAotCQkgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUpOwotCXJldHVybiAtMTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAidW5oYXNoYWJsZSB0eXBlOiAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUpOworICAgIHJldHVybiAtMTsKIH0KIAogbG9uZwogUHlPYmplY3RfSGFzaChQeU9iamVjdCAqdikKIHsKLQlQeVR5cGVPYmplY3QgKnRwID0gdi0+b2JfdHlwZTsKLQlpZiAodHAtPnRwX2hhc2ggIT0gTlVMTCkKLQkJcmV0dXJuICgqdHAtPnRwX2hhc2gpKHYpOwotCS8qIFRvIGtlZXAgdG8gdGhlIGdlbmVyYWwgcHJhY3RpY2UgdGhhdCBpbmhlcml0aW5nCi0JICogc29sZWx5IGZyb20gb2JqZWN0IGluIEMgY29kZSBzaG91bGQgd29yayB3aXRob3V0Ci0JICogYW4gZXhwbGljaXQgY2FsbCB0byBQeVR5cGVfUmVhZHksIHdlIGltcGxpY2l0bHkgY2FsbAotCSAqIFB5VHlwZV9SZWFkeSBoZXJlIGFuZCB0aGVuIGNoZWNrIHRoZSB0cF9oYXNoIHNsb3QgYWdhaW4KLQkgKi8KLQlpZiAodHAtPnRwX2RpY3QgPT0gTlVMTCkgewotCQlpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICh0cC0+dHBfaGFzaCAhPSBOVUxMKQotCQkJcmV0dXJuICgqdHAtPnRwX2hhc2gpKHYpOwotCX0KLQlpZiAodHAtPnRwX2NvbXBhcmUgPT0gTlVMTCAmJiBSSUNIQ09NUEFSRSh0cCkgPT0gTlVMTCkgewotCQlyZXR1cm4gX1B5X0hhc2hQb2ludGVyKHYpOyAvKiBVc2UgYWRkcmVzcyBhcyBoYXNoIHZhbHVlICovCi0JfQotCS8qIElmIHRoZXJlJ3MgYSBjbXAgYnV0IG5vIGhhc2ggZGVmaW5lZCwgdGhlIG9iamVjdCBjYW4ndCBiZSBoYXNoZWQgKi8KLQlyZXR1cm4gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKHYpOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSB2LT5vYl90eXBlOworICAgIGlmICh0cC0+dHBfaGFzaCAhPSBOVUxMKQorICAgICAgICByZXR1cm4gKCp0cC0+dHBfaGFzaCkodik7CisgICAgLyogVG8ga2VlcCB0byB0aGUgZ2VuZXJhbCBwcmFjdGljZSB0aGF0IGluaGVyaXRpbmcKKyAgICAgKiBzb2xlbHkgZnJvbSBvYmplY3QgaW4gQyBjb2RlIHNob3VsZCB3b3JrIHdpdGhvdXQKKyAgICAgKiBhbiBleHBsaWNpdCBjYWxsIHRvIFB5VHlwZV9SZWFkeSwgd2UgaW1wbGljaXRseSBjYWxsCisgICAgICogUHlUeXBlX1JlYWR5IGhlcmUgYW5kIHRoZW4gY2hlY2sgdGhlIHRwX2hhc2ggc2xvdCBhZ2FpbgorICAgICAqLworICAgIGlmICh0cC0+dHBfZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeVR5cGVfUmVhZHkodHApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHRwLT50cF9oYXNoICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gKCp0cC0+dHBfaGFzaCkodik7CisgICAgfQorICAgIGlmICh0cC0+dHBfY29tcGFyZSA9PSBOVUxMICYmIFJJQ0hDT01QQVJFKHRwKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBfUHlfSGFzaFBvaW50ZXIodik7IC8qIFVzZSBhZGRyZXNzIGFzIGhhc2ggdmFsdWUgKi8KKyAgICB9CisgICAgLyogSWYgdGhlcmUncyBhIGNtcCBidXQgbm8gaGFzaCBkZWZpbmVkLCB0aGUgb2JqZWN0IGNhbid0IGJlIGhhc2hlZCAqLworICAgIHJldHVybiBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQodik7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKncsICpyZXM7CisgICAgUHlPYmplY3QgKncsICpyZXM7CiAKLQlpZiAoUHlfVFlQRSh2KS0+dHBfZ2V0YXR0ciAhPSBOVUxMKQotCQlyZXR1cm4gKCpQeV9UWVBFKHYpLT50cF9nZXRhdHRyKSh2LCAoY2hhciopbmFtZSk7Ci0JdyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobmFtZSk7Ci0JaWYgKHcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gUHlPYmplY3RfR2V0QXR0cih2LCB3KTsKLQlQeV9YREVDUkVGKHcpOwotCXJldHVybiByZXM7CisgICAgaWYgKFB5X1RZUEUodiktPnRwX2dldGF0dHIgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICgqUHlfVFlQRSh2KS0+dHBfZ2V0YXR0cikodiwgKGNoYXIqKW5hbWUpOworICAgIHcgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKG5hbWUpOworICAgIGlmICh3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IFB5T2JqZWN0X0dldEF0dHIodiwgdyk7CisgICAgUHlfWERFQ1JFRih3KTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBpbnQKIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodiwgbmFtZSk7Ci0JaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlyZXR1cm4gMTsKLQl9Ci0JUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gMDsKKyAgICBQeU9iamVjdCAqcmVzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCBuYW1lKTsKKyAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp3KQogewotCVB5T2JqZWN0ICpzOwotCWludCByZXM7CisgICAgUHlPYmplY3QgKnM7CisgICAgaW50IHJlczsKIAotCWlmIChQeV9UWVBFKHYpLT50cF9zZXRhdHRyICE9IE5VTEwpCi0JCXJldHVybiAoKlB5X1RZUEUodiktPnRwX3NldGF0dHIpKHYsIChjaGFyKiluYW1lLCB3KTsKLQlzID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhuYW1lKTsKLQlpZiAocyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JcmVzID0gUHlPYmplY3RfU2V0QXR0cih2LCBzLCB3KTsKLQlQeV9YREVDUkVGKHMpOwotCXJldHVybiByZXM7CisgICAgaWYgKFB5X1RZUEUodiktPnRwX3NldGF0dHIgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICgqUHlfVFlQRSh2KS0+dHBfc2V0YXR0cikodiwgKGNoYXIqKW5hbWUsIHcpOworICAgIHMgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKG5hbWUpOworICAgIGlmIChzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXMgPSBQeU9iamVjdF9TZXRBdHRyKHYsIHMsIHcpOworICAgIFB5X1hERUNSRUYocyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlPYmplY3QgKgogUHlPYmplY3RfR2V0QXR0cihQeU9iamVjdCAqdiwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUodik7CisgICAgUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUodik7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJLyogVGhlIFVuaWNvZGUgdG8gc3RyaW5nIGNvbnZlcnNpb24gaXMgZG9uZSBoZXJlIGJlY2F1c2UgdGhlCi0JCSAgIGV4aXN0aW5nIHRwX2dldGF0dHJvIHNsb3RzIGV4cGVjdCBhIHN0cmluZyBvYmplY3QgYXMgbmFtZQotCQkgICBhbmQgd2Ugd291bGRuJ3Qgd2FudCB0byBicmVhayB0aG9zZS4gKi8KLQkJaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgewotCQkJbmFtZSA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMKTsKLQkJCWlmIChuYW1lID09IE5VTEwpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZWxzZQorICAgICAgICAvKiBUaGUgVW5pY29kZSB0byBzdHJpbmcgY29udmVyc2lvbiBpcyBkb25lIGhlcmUgYmVjYXVzZSB0aGUKKyAgICAgICAgICAgZXhpc3RpbmcgdHBfZ2V0YXR0cm8gc2xvdHMgZXhwZWN0IGEgc3RyaW5nIG9iamVjdCBhcyBuYW1lCisgICAgICAgICAgIGFuZCB3ZSB3b3VsZG4ndCB3YW50IHRvIGJyZWFrIHRob3NlLiAqLworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7CisgICAgICAgICAgICBuYW1lID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCiAjZW5kaWYKLQkJewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwKLQkJCQkgICAgIFB5X1RZUEUobmFtZSktPnRwX25hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKHRwLT50cF9nZXRhdHRybyAhPSBOVUxMKQotCQlyZXR1cm4gKCp0cC0+dHBfZ2V0YXR0cm8pKHYsIG5hbWUpOwotCWlmICh0cC0+dHBfZ2V0YXR0ciAhPSBOVUxMKQotCQlyZXR1cm4gKCp0cC0+dHBfZ2V0YXR0cikodiwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCSAgICAgIiclLjUwcycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAotCQkgICAgIHRwLT50cF9uYW1lLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwotCXJldHVybiBOVUxMOworICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG5hbWUpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0cC0+dHBfZ2V0YXR0cm8gIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICgqdHAtPnRwX2dldGF0dHJvKSh2LCBuYW1lKTsKKyAgICBpZiAodHAtPnRwX2dldGF0dHIgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICgqdHAtPnRwX2dldGF0dHIpKHYsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAiJyUuNTBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCisgICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgIHJldHVybiBOVUxMOwogfQogCiBpbnQKIFB5T2JqZWN0X0hhc0F0dHIoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5T2JqZWN0ICpyZXMgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOwotCWlmIChyZXMgIT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIDE7Ci0JfQotCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZSk7CisgICAgaWYgKHJlcyAhPSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeU9iamVjdF9TZXRBdHRyKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5VHlwZU9iamVjdCAqdHAgPSBQeV9UWVBFKHYpOwotCWludCBlcnI7CisgICAgUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUodik7CisgICAgaW50IGVycjsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpeworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJLyogVGhlIFVuaWNvZGUgdG8gc3RyaW5nIGNvbnZlcnNpb24gaXMgZG9uZSBoZXJlIGJlY2F1c2UgdGhlCi0JCSAgIGV4aXN0aW5nIHRwX3NldGF0dHJvIHNsb3RzIGV4cGVjdCBhIHN0cmluZyBvYmplY3QgYXMgbmFtZQotCQkgICBhbmQgd2Ugd291bGRuJ3Qgd2FudCB0byBicmVhayB0aG9zZS4gKi8KLQkJaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgewotCQkJbmFtZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcobmFtZSwgTlVMTCwgTlVMTCk7Ci0JCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlCisgICAgICAgIC8qIFRoZSBVbmljb2RlIHRvIHN0cmluZyBjb252ZXJzaW9uIGlzIGRvbmUgaGVyZSBiZWNhdXNlIHRoZQorICAgICAgICAgICBleGlzdGluZyB0cF9zZXRhdHRybyBzbG90cyBleHBlY3QgYSBzdHJpbmcgb2JqZWN0IGFzIG5hbWUKKyAgICAgICAgICAgYW5kIHdlIHdvdWxkbid0IHdhbnQgdG8gYnJlYWsgdGhvc2UuICovCisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogI2VuZGlmCi0JCXsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCi0JCQkJICAgICBQeV9UWVBFKG5hbWUpLT50cF9uYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRihuYW1lKTsKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShuYW1lKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9JTkNSRUYobmFtZSk7CiAKLQlQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZuYW1lKTsKLQlpZiAodHAtPnRwX3NldGF0dHJvICE9IE5VTEwpIHsKLQkJZXJyID0gKCp0cC0+dHBfc2V0YXR0cm8pKHYsIG5hbWUsIHZhbHVlKTsKLQkJUHlfREVDUkVGKG5hbWUpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlpZiAodHAtPnRwX3NldGF0dHIgIT0gTlVMTCkgewotCQllcnIgPSAoKnRwLT50cF9zZXRhdHRyKSh2LCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSksIHZhbHVlKTsKLQkJUHlfREVDUkVGKG5hbWUpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlQeV9ERUNSRUYobmFtZSk7Ci0JaWYgKHRwLT50cF9nZXRhdHRyID09IE5VTEwgJiYgdHAtPnRwX2dldGF0dHJvID09IE5VTEwpCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZXMgIgotCQkJICAgICAiKCVzIC4lLjEwMHMpIiwKLQkJCSAgICAgdHAtPnRwX25hbWUsCi0JCQkgICAgIHZhbHVlPT1OVUxMID8gImRlbCIgOiAiYXNzaWduIHRvIiwKLQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKLQllbHNlCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG9ubHkgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgIgotCQkJICAgICAiKCVzIC4lLjEwMHMpIiwKLQkJCSAgICAgdHAtPnRwX25hbWUsCi0JCQkgICAgIHZhbHVlPT1OVUxMID8gImRlbCIgOiAiYXNzaWduIHRvIiwKLQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKLQlyZXR1cm4gLTE7CisgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmbmFtZSk7CisgICAgaWYgKHRwLT50cF9zZXRhdHRybyAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9ICgqdHAtPnRwX3NldGF0dHJvKSh2LCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKHRwLT50cF9zZXRhdHRyICE9IE5VTEwpIHsKKyAgICAgICAgZXJyID0gKCp0cC0+dHBfc2V0YXR0cikodiwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLCB2YWx1ZSk7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgUHlfREVDUkVGKG5hbWUpOworICAgIGlmICh0cC0+dHBfZ2V0YXR0ciA9PSBOVUxMICYmIHRwLT50cF9nZXRhdHRybyA9PSBOVUxMKQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAiKCVzIC4lLjEwMHMpIiwKKyAgICAgICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgdmFsdWU9PU5VTEwgPyAiZGVsIiA6ICJhc3NpZ24gdG8iLAorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICBlbHNlCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJyUuMTAwcycgb2JqZWN0IGhhcyBvbmx5IHJlYWQtb25seSBhdHRyaWJ1dGVzICIKKyAgICAgICAgICAgICAgICAgICAgICIoJXMgLiUuMTAwcykiLAorICAgICAgICAgICAgICAgICAgICAgdHAtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICB2YWx1ZT09TlVMTCA/ICJkZWwiIDogImFzc2lnbiB0byIsCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgIHJldHVybiAtMTsKIH0KIAogLyogSGVscGVyIHRvIGdldCBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0J3MgX19kaWN0X18gc2xvdCwgaWYgYW55ICovCkBAIC0xMjc2LDM1ICsxMjc2LDM1IEBACiBQeU9iamVjdCAqKgogX1B5T2JqZWN0X0dldERpY3RQdHIoUHlPYmplY3QgKm9iaikKIHsKLQlQeV9zc2l6ZV90IGRpY3RvZmZzZXQ7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUob2JqKTsKKyAgICBQeV9zc2l6ZV90IGRpY3RvZmZzZXQ7CisgICAgUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUob2JqKTsKIAotCWlmICghKHRwLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpCi0JCXJldHVybiBOVUxMOwotCWRpY3RvZmZzZXQgPSB0cC0+dHBfZGljdG9mZnNldDsKLQlpZiAoZGljdG9mZnNldCA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZGljdG9mZnNldCA8IDApIHsKLQkJUHlfc3NpemVfdCB0c2l6ZTsKLQkJc2l6ZV90IHNpemU7CisgICAgaWYgKCEodHAtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGljdG9mZnNldCA9IHRwLT50cF9kaWN0b2Zmc2V0OworICAgIGlmIChkaWN0b2Zmc2V0ID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChkaWN0b2Zmc2V0IDwgMCkgeworICAgICAgICBQeV9zc2l6ZV90IHRzaXplOworICAgICAgICBzaXplX3Qgc2l6ZTsKIAotCQl0c2l6ZSA9ICgoUHlWYXJPYmplY3QgKilvYmopLT5vYl9zaXplOwotCQlpZiAodHNpemUgPCAwKQotCQkJdHNpemUgPSAtdHNpemU7Ci0JCXNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHAsIHRzaXplKTsKKyAgICAgICAgdHNpemUgPSAoKFB5VmFyT2JqZWN0ICopb2JqKS0+b2Jfc2l6ZTsKKyAgICAgICAgaWYgKHRzaXplIDwgMCkKKyAgICAgICAgICAgIHRzaXplID0gLXRzaXplOworICAgICAgICBzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHRwLCB0c2l6ZSk7CiAKLQkJZGljdG9mZnNldCArPSAobG9uZylzaXplOwotCQlhc3NlcnQoZGljdG9mZnNldCA+IDApOwotCQlhc3NlcnQoZGljdG9mZnNldCAlIFNJWkVPRl9WT0lEX1AgPT0gMCk7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKiopICgoY2hhciAqKW9iaiArIGRpY3RvZmZzZXQpOworICAgICAgICBkaWN0b2Zmc2V0ICs9IChsb25nKXNpemU7CisgICAgICAgIGFzc2VydChkaWN0b2Zmc2V0ID4gMCk7CisgICAgICAgIGFzc2VydChkaWN0b2Zmc2V0ICUgU0laRU9GX1ZPSURfUCA9PSAwKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKikgKChjaGFyICopb2JqICsgZGljdG9mZnNldCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X1NlbGZJdGVyKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlfSU5DUkVGKG9iaik7Ci0JcmV0dXJuIG9iajsKKyAgICBQeV9JTkNSRUYob2JqKTsKKyAgICByZXR1cm4gb2JqOwogfQogCiAvKiBHZW5lcmljIEdldEF0dHIgZnVuY3Rpb25zIC0gcHV0IHRoZXNlIGluIHlvdXIgdHBfW2dzXWV0YXR0cm8gc2xvdCAqLwpAQCAtMTMxMiwyMjEgKzEzMTIsMjIxIEBACiBQeU9iamVjdCAqCiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cihQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeVR5cGVPYmplY3QgKnRwID0gUHlfVFlQRShvYmopOwotCVB5T2JqZWN0ICpkZXNjciA9IE5VTEw7Ci0JUHlPYmplY3QgKnJlcyA9IE5VTEw7Ci0JZGVzY3JnZXRmdW5jIGY7Ci0JUHlfc3NpemVfdCBkaWN0b2Zmc2V0OwotCVB5T2JqZWN0ICoqZGljdHB0cjsKKyAgICBQeVR5cGVPYmplY3QgKnRwID0gUHlfVFlQRShvYmopOworICAgIFB5T2JqZWN0ICpkZXNjciA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgICAgZGVzY3JnZXRmdW5jIGY7CisgICAgUHlfc3NpemVfdCBkaWN0b2Zmc2V0OworICAgIFB5T2JqZWN0ICoqZGljdHB0cjsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpeworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJLyogVGhlIFVuaWNvZGUgdG8gc3RyaW5nIGNvbnZlcnNpb24gaXMgZG9uZSBoZXJlIGJlY2F1c2UgdGhlCi0JCSAgIGV4aXN0aW5nIHRwX3NldGF0dHJvIHNsb3RzIGV4cGVjdCBhIHN0cmluZyBvYmplY3QgYXMgbmFtZQotCQkgICBhbmQgd2Ugd291bGRuJ3Qgd2FudCB0byBicmVhayB0aG9zZS4gKi8KLQkJaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgewotCQkJbmFtZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcobmFtZSwgTlVMTCwgTlVMTCk7Ci0JCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVsc2UKKyAgICAgICAgLyogVGhlIFVuaWNvZGUgdG8gc3RyaW5nIGNvbnZlcnNpb24gaXMgZG9uZSBoZXJlIGJlY2F1c2UgdGhlCisgICAgICAgICAgIGV4aXN0aW5nIHRwX3NldGF0dHJvIHNsb3RzIGV4cGVjdCBhIHN0cmluZyBvYmplY3QgYXMgbmFtZQorICAgICAgICAgICBhbmQgd2Ugd291bGRuJ3Qgd2FudCB0byBicmVhayB0aG9zZS4gKi8KKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgeworICAgICAgICAgICAgbmFtZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcobmFtZSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQl7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAotCQkJCSAgICAgUHlfVFlQRShuYW1lKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRihuYW1lKTsKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShuYW1lKS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRihuYW1lKTsKIAotCWlmICh0cC0+dHBfZGljdCA9PSBOVUxMKSB7Ci0JCWlmIChQeVR5cGVfUmVhZHkodHApIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQl9CisgICAgaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQorICAgICAgICAgICAgZ290byBkb25lOworICAgIH0KIAogI2lmIDAgLyogWFhYIHRoaXMgaXMgbm90IHF1aXRlIF9QeVR5cGVfTG9va3VwIGFueW1vcmUgKi8KLQkvKiBJbmxpbmUgX1B5VHlwZV9Mb29rdXAgKi8KLQl7Ci0JCVB5X3NzaXplX3QgaSwgbjsKLQkJUHlPYmplY3QgKm1ybywgKmJhc2UsICpkaWN0OworICAgIC8qIElubGluZSBfUHlUeXBlX0xvb2t1cCAqLworICAgIHsKKyAgICAgICAgUHlfc3NpemVfdCBpLCBuOworICAgICAgICBQeU9iamVjdCAqbXJvLCAqYmFzZSwgKmRpY3Q7CiAKLQkJLyogTG9vayBpbiB0cF9kaWN0IG9mIHR5cGVzIGluIE1STyAqLwotCQltcm8gPSB0cC0+dHBfbXJvOwotCQlhc3NlcnQobXJvICE9IE5VTEwpOwotCQlhc3NlcnQoUHlUdXBsZV9DaGVjayhtcm8pKTsKLQkJbiA9IFB5VHVwbGVfR0VUX1NJWkUobXJvKTsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0obXJvLCBpKTsKLQkJCWlmIChQeUNsYXNzX0NoZWNrKGJhc2UpKQotCQkJCWRpY3QgPSAoKFB5Q2xhc3NPYmplY3QgKiliYXNlKS0+Y2xfZGljdDsKLQkJCWVsc2UgewotCQkJCWFzc2VydChQeVR5cGVfQ2hlY2soYmFzZSkpOwotCQkJCWRpY3QgPSAoKFB5VHlwZU9iamVjdCAqKWJhc2UpLT50cF9kaWN0OwotCQkJfQotCQkJYXNzZXJ0KGRpY3QgJiYgUHlEaWN0X0NoZWNrKGRpY3QpKTsKLQkJCWRlc2NyID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgbmFtZSk7Ci0JCQlpZiAoZGVzY3IgIT0gTlVMTCkKLQkJCQlicmVhazsKLQkJfQotCX0KKyAgICAgICAgLyogTG9vayBpbiB0cF9kaWN0IG9mIHR5cGVzIGluIE1STyAqLworICAgICAgICBtcm8gPSB0cC0+dHBfbXJvOworICAgICAgICBhc3NlcnQobXJvICE9IE5VTEwpOworICAgICAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhtcm8pKTsKKyAgICAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUobXJvKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0obXJvLCBpKTsKKyAgICAgICAgICAgIGlmIChQeUNsYXNzX0NoZWNrKGJhc2UpKQorICAgICAgICAgICAgICAgIGRpY3QgPSAoKFB5Q2xhc3NPYmplY3QgKiliYXNlKS0+Y2xfZGljdDsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydChQeVR5cGVfQ2hlY2soYmFzZSkpOworICAgICAgICAgICAgICAgIGRpY3QgPSAoKFB5VHlwZU9iamVjdCAqKWJhc2UpLT50cF9kaWN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0KGRpY3QgJiYgUHlEaWN0X0NoZWNrKGRpY3QpKTsKKyAgICAgICAgICAgIGRlc2NyID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgbmFtZSk7CisgICAgICAgICAgICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KICNlbHNlCi0JZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0cCwgbmFtZSk7CisgICAgZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0cCwgbmFtZSk7CiAjZW5kaWYKIAotCVB5X1hJTkNSRUYoZGVzY3IpOworICAgIFB5X1hJTkNSRUYoZGVzY3IpOwogCi0JZiA9IE5VTEw7Ci0JaWYgKGRlc2NyICE9IE5VTEwgJiYKLQkgICAgUHlUeXBlX0hhc0ZlYXR1cmUoZGVzY3ItPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpIHsKLQkJZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9nZXQ7Ci0JCWlmIChmICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKSB7Ci0JCQlyZXMgPSBmKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKW9iai0+b2JfdHlwZSk7Ci0JCQlQeV9ERUNSRUYoZGVzY3IpOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQorICAgIGYgPSBOVUxMOworICAgIGlmIChkZXNjciAhPSBOVUxMICYmCisgICAgICAgIFB5VHlwZV9IYXNGZWF0dXJlKGRlc2NyLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKSB7CisgICAgICAgIGYgPSBkZXNjci0+b2JfdHlwZS0+dHBfZGVzY3JfZ2V0OworICAgICAgICBpZiAoZiAhPSBOVUxMICYmIFB5RGVzY3JfSXNEYXRhKGRlc2NyKSkgeworICAgICAgICAgICAgcmVzID0gZihkZXNjciwgb2JqLCAoUHlPYmplY3QgKilvYmotPm9iX3R5cGUpOworICAgICAgICAgICAgUHlfREVDUkVGKGRlc2NyKTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIElubGluZSBfUHlPYmplY3RfR2V0RGljdFB0ciAqLwotCWRpY3RvZmZzZXQgPSB0cC0+dHBfZGljdG9mZnNldDsKLQlpZiAoZGljdG9mZnNldCAhPSAwKSB7Ci0JCVB5T2JqZWN0ICpkaWN0OwotCQlpZiAoZGljdG9mZnNldCA8IDApIHsKLQkJCVB5X3NzaXplX3QgdHNpemU7Ci0JCQlzaXplX3Qgc2l6ZTsKKyAgICAvKiBJbmxpbmUgX1B5T2JqZWN0X0dldERpY3RQdHIgKi8KKyAgICBkaWN0b2Zmc2V0ID0gdHAtPnRwX2RpY3RvZmZzZXQ7CisgICAgaWYgKGRpY3RvZmZzZXQgIT0gMCkgeworICAgICAgICBQeU9iamVjdCAqZGljdDsKKyAgICAgICAgaWYgKGRpY3RvZmZzZXQgPCAwKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IHRzaXplOworICAgICAgICAgICAgc2l6ZV90IHNpemU7CiAKLQkJCXRzaXplID0gKChQeVZhck9iamVjdCAqKW9iaiktPm9iX3NpemU7Ci0JCQlpZiAodHNpemUgPCAwKQotCQkJCXRzaXplID0gLXRzaXplOwotCQkJc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0cCwgdHNpemUpOworICAgICAgICAgICAgdHNpemUgPSAoKFB5VmFyT2JqZWN0ICopb2JqKS0+b2Jfc2l6ZTsKKyAgICAgICAgICAgIGlmICh0c2l6ZSA8IDApCisgICAgICAgICAgICAgICAgdHNpemUgPSAtdHNpemU7CisgICAgICAgICAgICBzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHRwLCB0c2l6ZSk7CiAKLQkJCWRpY3RvZmZzZXQgKz0gKGxvbmcpc2l6ZTsKLQkJCWFzc2VydChkaWN0b2Zmc2V0ID4gMCk7Ci0JCQlhc3NlcnQoZGljdG9mZnNldCAlIFNJWkVPRl9WT0lEX1AgPT0gMCk7Ci0JCX0KLQkJZGljdHB0ciA9IChQeU9iamVjdCAqKikgKChjaGFyICopb2JqICsgZGljdG9mZnNldCk7Ci0JCWRpY3QgPSAqZGljdHB0cjsKLQkJaWYgKGRpY3QgIT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKGRpY3QpOwotCQkJcmVzID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgbmFtZSk7Ci0JCQlpZiAocmVzICE9IE5VTEwpIHsKLQkJCQlQeV9JTkNSRUYocmVzKTsKLQkJCQlQeV9YREVDUkVGKGRlc2NyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRpY3QpOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKLQkJfQotCX0KKyAgICAgICAgICAgIGRpY3RvZmZzZXQgKz0gKGxvbmcpc2l6ZTsKKyAgICAgICAgICAgIGFzc2VydChkaWN0b2Zmc2V0ID4gMCk7CisgICAgICAgICAgICBhc3NlcnQoZGljdG9mZnNldCAlIFNJWkVPRl9WT0lEX1AgPT0gMCk7CisgICAgICAgIH0KKyAgICAgICAgZGljdHB0ciA9IChQeU9iamVjdCAqKikgKChjaGFyICopb2JqICsgZGljdG9mZnNldCk7CisgICAgICAgIGRpY3QgPSAqZGljdHB0cjsKKyAgICAgICAgaWYgKGRpY3QgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGRpY3QpOworICAgICAgICAgICAgcmVzID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgbmFtZSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGRlc2NyKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKGYgIT0gTlVMTCkgewotCQlyZXMgPSBmKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKVB5X1RZUEUob2JqKSk7Ci0JCVB5X0RFQ1JFRihkZXNjcik7Ci0JCWdvdG8gZG9uZTsKLQl9CisgICAgaWYgKGYgIT0gTlVMTCkgeworICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKVB5X1RZUEUob2JqKSk7CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQlpZiAoZGVzY3IgIT0gTlVMTCkgewotCQlyZXMgPSBkZXNjcjsKLQkJLyogZGVzY3Igd2FzIGFscmVhZHkgaW5jcmVmZWQgYWJvdmUgKi8KLQkJZ290byBkb25lOwotCX0KKyAgICBpZiAoZGVzY3IgIT0gTlVMTCkgeworICAgICAgICByZXMgPSBkZXNjcjsKKyAgICAgICAgLyogZGVzY3Igd2FzIGFscmVhZHkgaW5jcmVmZWQgYWJvdmUgKi8KKyAgICAgICAgZ290byBkb25lOworICAgIH0KIAotCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJICAgICAiJyUuNTBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCi0JCSAgICAgdHAtPnRwX25hbWUsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAiJyUuNTBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCisgICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwogICBkb25lOgotCVB5X0RFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBpbnQKIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUob2JqKTsKLQlQeU9iamVjdCAqZGVzY3I7Ci0JZGVzY3JzZXRmdW5jIGY7Ci0JUHlPYmplY3QgKipkaWN0cHRyOwotCWludCByZXMgPSAtMTsKKyAgICBQeVR5cGVPYmplY3QgKnRwID0gUHlfVFlQRShvYmopOworICAgIFB5T2JqZWN0ICpkZXNjcjsKKyAgICBkZXNjcnNldGZ1bmMgZjsKKyAgICBQeU9iamVjdCAqKmRpY3RwdHI7CisgICAgaW50IHJlcyA9IC0xOwogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSl7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSl7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkvKiBUaGUgVW5pY29kZSB0byBzdHJpbmcgY29udmVyc2lvbiBpcyBkb25lIGhlcmUgYmVjYXVzZSB0aGUKLQkJICAgZXhpc3RpbmcgdHBfc2V0YXR0cm8gc2xvdHMgZXhwZWN0IGEgc3RyaW5nIG9iamVjdCBhcyBuYW1lCi0JCSAgIGFuZCB3ZSB3b3VsZG4ndCB3YW50IHRvIGJyZWFrIHRob3NlLiAqLwotCQlpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7Ci0JCQluYW1lID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMLCBOVUxMKTsKLQkJCWlmIChuYW1lID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UKKyAgICAgICAgLyogVGhlIFVuaWNvZGUgdG8gc3RyaW5nIGNvbnZlcnNpb24gaXMgZG9uZSBoZXJlIGJlY2F1c2UgdGhlCisgICAgICAgICAgIGV4aXN0aW5nIHRwX3NldGF0dHJvIHNsb3RzIGV4cGVjdCBhIHN0cmluZyBvYmplY3QgYXMgbmFtZQorICAgICAgICAgICBhbmQgd2Ugd291bGRuJ3Qgd2FudCB0byBicmVhayB0aG9zZS4gKi8KKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgeworICAgICAgICAgICAgbmFtZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcobmFtZSwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCiAjZW5kaWYKLQkJewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwKLQkJCQkgICAgIFB5X1RZUEUobmFtZSktPnRwX25hbWUpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQotCWVsc2UKLQkJUHlfSU5DUkVGKG5hbWUpOworICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG5hbWUpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRihuYW1lKTsKIAotCWlmICh0cC0+dHBfZGljdCA9PSBOVUxMKSB7Ci0JCWlmIChQeVR5cGVfUmVhZHkodHApIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQl9CisgICAgaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQorICAgICAgICAgICAgZ290byBkb25lOworICAgIH0KIAotCWRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOwotCWYgPSBOVUxMOwotCWlmIChkZXNjciAhPSBOVUxMICYmCi0JICAgIFB5VHlwZV9IYXNGZWF0dXJlKGRlc2NyLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKSB7Ci0JCWYgPSBkZXNjci0+b2JfdHlwZS0+dHBfZGVzY3Jfc2V0OwotCQlpZiAoZiAhPSBOVUxMICYmIFB5RGVzY3JfSXNEYXRhKGRlc2NyKSkgewotCQkJcmVzID0gZihkZXNjciwgb2JqLCB2YWx1ZSk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9CisgICAgZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0cCwgbmFtZSk7CisgICAgZiA9IE5VTEw7CisgICAgaWYgKGRlc2NyICE9IE5VTEwgJiYKKyAgICAgICAgUHlUeXBlX0hhc0ZlYXR1cmUoZGVzY3ItPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykpIHsKKyAgICAgICAgZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9zZXQ7CisgICAgICAgIGlmIChmICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKSB7CisgICAgICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIHZhbHVlKTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgIH0KIAotCWRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihvYmopOwotCWlmIChkaWN0cHRyICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKmRpY3QgPSAqZGljdHB0cjsKLQkJaWYgKGRpY3QgPT0gTlVMTCAmJiB2YWx1ZSAhPSBOVUxMKSB7Ci0JCQlkaWN0ID0gUHlEaWN0X05ldygpOwotCQkJaWYgKGRpY3QgPT0gTlVMTCkKLQkJCQlnb3RvIGRvbmU7Ci0JCQkqZGljdHB0ciA9IGRpY3Q7Ci0JCX0KLQkJaWYgKGRpY3QgIT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKGRpY3QpOwotCQkJaWYgKHZhbHVlID09IE5VTEwpCi0JCQkJcmVzID0gUHlEaWN0X0RlbEl0ZW0oZGljdCwgbmFtZSk7Ci0JCQllbHNlCi0JCQkJcmVzID0gUHlEaWN0X1NldEl0ZW0oZGljdCwgbmFtZSwgdmFsdWUpOwotCQkJaWYgKHJlcyA8IDAgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCi0JCQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKLQkJCVB5X0RFQ1JFRihkaWN0KTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KKyAgICBkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIob2JqKTsKKyAgICBpZiAoZGljdHB0ciAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpkaWN0ID0gKmRpY3RwdHI7CisgICAgICAgIGlmIChkaWN0ID09IE5VTEwgJiYgdmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgKmRpY3RwdHIgPSBkaWN0OworICAgICAgICB9CisgICAgICAgIGlmIChkaWN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJlcyA9IFB5RGljdF9EZWxJdGVtKGRpY3QsIG5hbWUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlcyA9IFB5RGljdF9TZXRJdGVtKGRpY3QsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIGlmIChyZXMgPCAwICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoZiAhPSBOVUxMKSB7Ci0JCXJlcyA9IGYoZGVzY3IsIG9iaiwgdmFsdWUpOwotCQlnb3RvIGRvbmU7Ci0JfQorICAgIGlmIChmICE9IE5VTEwpIHsKKyAgICAgICAgcmVzID0gZihkZXNjciwgb2JqLCB2YWx1ZSk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CiAKLQlpZiAoZGVzY3IgPT0gTlVMTCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJS4yMDBzJyIsCi0JCQkgICAgIHRwLT50cF9uYW1lLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwotCQlnb3RvIGRvbmU7Ci0JfQorICAgIGlmIChkZXNjciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KIAotCVB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJICAgICAiJyUuNTBzJyBvYmplY3QgYXR0cmlidXRlICclLjQwMHMnIGlzIHJlYWQtb25seSIsCi0JCSAgICAgdHAtPnRwX25hbWUsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAiJyUuNTBzJyBvYmplY3QgYXR0cmlidXRlICclLjQwMHMnIGlzIHJlYWQtb25seSIsCisgICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwogICBkb25lOgotCVB5X0RFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X0RFQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiBUZXN0IGEgdmFsdWUgdXNlZCBhcyBjb25kaXRpb24sIGUuZy4sIGluIGEgZm9yIG9yIGlmIHN0YXRlbWVudC4KQEAgLTE1MzUsMjYgKzE1MzUsMjYgQEAKIGludAogUHlPYmplY3RfSXNUcnVlKFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgcmVzOwotCWlmICh2ID09IFB5X1RydWUpCi0JCXJldHVybiAxOwotCWlmICh2ID09IFB5X0ZhbHNlKQotCQlyZXR1cm4gMDsKLQlpZiAodiA9PSBQeV9Ob25lKQotCQlyZXR1cm4gMDsKLQllbHNlIGlmICh2LT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgotCQkgdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9ub256ZXJvICE9IE5VTEwpCi0JCXJlcyA9ICgqdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9ub256ZXJvKSh2KTsKLQllbHNlIGlmICh2LT5vYl90eXBlLT50cF9hc19tYXBwaW5nICE9IE5VTEwgJiYKLQkJIHYtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmctPm1wX2xlbmd0aCAhPSBOVUxMKQotCQlyZXMgPSAoKnYtPm9iX3R5cGUtPnRwX2FzX21hcHBpbmctPm1wX2xlbmd0aCkodik7Ci0JZWxzZSBpZiAodi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UgIT0gTlVMTCAmJgotCQkgdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2xlbmd0aCAhPSBOVUxMKQotCQlyZXMgPSAoKnYtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9sZW5ndGgpKHYpOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci0JLyogaWYgaXQgaXMgbmVnYXRpdmUsIGl0IHNob3VsZCBiZSBlaXRoZXIgLTEgb3IgLTIgKi8KLQlyZXR1cm4gKHJlcyA+IDApID8gMSA6IFB5X1NBRkVfRE9XTkNBU1QocmVzLCBQeV9zc2l6ZV90LCBpbnQpOworICAgIFB5X3NzaXplX3QgcmVzOworICAgIGlmICh2ID09IFB5X1RydWUpCisgICAgICAgIHJldHVybiAxOworICAgIGlmICh2ID09IFB5X0ZhbHNlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlIGlmICh2LT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgorICAgICAgICAgICAgIHYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfbm9uemVybyAhPSBOVUxMKQorICAgICAgICByZXMgPSAoKnYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfbm9uemVybykodik7CisgICAgZWxzZSBpZiAodi0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZyAhPSBOVUxMICYmCisgICAgICAgICAgICAgdi0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZy0+bXBfbGVuZ3RoICE9IE5VTEwpCisgICAgICAgIHJlcyA9ICgqdi0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZy0+bXBfbGVuZ3RoKSh2KTsKKyAgICBlbHNlIGlmICh2LT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAhPSBOVUxMICYmCisgICAgICAgICAgICAgdi0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2xlbmd0aCAhPSBOVUxMKQorICAgICAgICByZXMgPSAoKnYtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9sZW5ndGgpKHYpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDE7CisgICAgLyogaWYgaXQgaXMgbmVnYXRpdmUsIGl0IHNob3VsZCBiZSBlaXRoZXIgLTEgb3IgLTIgKi8KKyAgICByZXR1cm4gKHJlcyA+IDApID8gMSA6IFB5X1NBRkVfRE9XTkNBU1QocmVzLCBQeV9zc2l6ZV90LCBpbnQpOwogfQogCiAvKiBlcXVpdmFsZW50IG9mICdub3QgdicKQEAgLTE1NjMsMTEgKzE1NjMsMTEgQEAKIGludAogUHlPYmplY3RfTm90KFB5T2JqZWN0ICp2KQogewotCWludCByZXM7Ci0JcmVzID0gUHlPYmplY3RfSXNUcnVlKHYpOwotCWlmIChyZXMgPCAwKQotCQlyZXR1cm4gcmVzOwotCXJldHVybiByZXMgPT0gMDsKKyAgICBpbnQgcmVzOworICAgIHJlcyA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzID09IDA7CiB9CiAKIC8qIENvZXJjZSB0d28gbnVtZXJpYyB0eXBlcyB0byB0aGUgImxhcmdlciIgb25lLgpAQCAtMTU4MCwyOSArMTU4MCwyOSBAQAogaW50CiBQeU51bWJlcl9Db2VyY2VFeChQeU9iamVjdCAqKnB2LCBQeU9iamVjdCAqKnB3KQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2ID0gKnB2OwotCXJlZ2lzdGVyIFB5T2JqZWN0ICp3ID0gKnB3OwotCWludCByZXM7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnYgPSAqcHY7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKncgPSAqcHc7CisgICAgaW50IHJlczsKIAotCS8qIFNob3J0Y3V0IG9ubHkgZm9yIG9sZC1zdHlsZSB0eXBlcyAqLwotCWlmICh2LT5vYl90eXBlID09IHctPm9iX3R5cGUgJiYKLQkgICAgIVB5VHlwZV9IYXNGZWF0dXJlKHYtPm9iX3R5cGUsIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykpCi0JewotCQlQeV9JTkNSRUYodik7Ci0JCVB5X0lOQ1JFRih3KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICh2LT5vYl90eXBlLT50cF9hc19udW1iZXIgJiYgdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UpIHsKLQkJcmVzID0gKCp2LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSkocHYsIHB3KTsKLQkJaWYgKHJlcyA8PSAwKQotCQkJcmV0dXJuIHJlczsKLQl9Ci0JaWYgKHctPm9iX3R5cGUtPnRwX2FzX251bWJlciAmJiB3LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSkgewotCQlyZXMgPSAoKnctPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfY29lcmNlKShwdywgcHYpOwotCQlpZiAocmVzIDw9IDApCi0JCQlyZXR1cm4gcmVzOwotCX0KLQlyZXR1cm4gMTsKKyAgICAvKiBTaG9ydGN1dCBvbmx5IGZvciBvbGQtc3R5bGUgdHlwZXMgKi8KKyAgICBpZiAodi0+b2JfdHlwZSA9PSB3LT5vYl90eXBlICYmCisgICAgICAgICFQeVR5cGVfSGFzRmVhdHVyZSh2LT5vYl90eXBlLCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpKQorICAgIHsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBQeV9JTkNSRUYodyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAodi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICYmIHYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfY29lcmNlKSB7CisgICAgICAgIHJlcyA9ICgqdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UpKHB2LCBwdyk7CisgICAgICAgIGlmIChyZXMgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmICh3LT5vYl90eXBlLT50cF9hc19udW1iZXIgJiYgdy0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9jb2VyY2UpIHsKKyAgICAgICAgcmVzID0gKCp3LT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSkocHcsIHB2KTsKKyAgICAgICAgaWYgKHJlcyA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIENvZXJjZSB0d28gbnVtZXJpYyB0eXBlcyB0byB0aGUgImxhcmdlciIgb25lLgpAQCAtMTYxMywxMSArMTYxMywxMSBAQAogaW50CiBQeU51bWJlcl9Db2VyY2UoUHlPYmplY3QgKipwdiwgUHlPYmplY3QgKipwdykKIHsKLQlpbnQgZXJyID0gUHlOdW1iZXJfQ29lcmNlRXgocHYsIHB3KTsKLQlpZiAoZXJyIDw9IDApCi0JCXJldHVybiBlcnI7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm51bWJlciBjb2VyY2lvbiBmYWlsZWQiKTsKLQlyZXR1cm4gLTE7CisgICAgaW50IGVyciA9IFB5TnVtYmVyX0NvZXJjZUV4KHB2LCBwdyk7CisgICAgaWYgKGVyciA8PSAwKQorICAgICAgICByZXR1cm4gZXJyOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJudW1iZXIgY29lcmNpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIC0xOwogfQogCiAKQEAgLTE2MjYsMjIgKzE2MjYsMjIgQEAKIGludAogUHlDYWxsYWJsZV9DaGVjayhQeU9iamVjdCAqeCkKIHsKLQlpZiAoeCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAoUHlJbnN0YW5jZV9DaGVjayh4KSkgewotCQlQeU9iamVjdCAqY2FsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoeCwgIl9fY2FsbF9fIik7Ci0JCWlmIChjYWxsID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkvKiBDb3VsZCB0ZXN0IHJlY3Vyc2l2ZWx5IGJ1dCBkb24ndCwgZm9yIGZlYXIgb2YgZW5kbGVzcwotCQkgICByZWN1cnNpb24gaWYgc29tZSBqb2tlciBzZXRzIHNlbGYuX19jYWxsX18gPSBzZWxmICovCi0JCVB5X0RFQ1JFRihjYWxsKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQlyZXR1cm4geC0+b2JfdHlwZS0+dHBfY2FsbCAhPSBOVUxMOwotCX0KKyAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlJbnN0YW5jZV9DaGVjayh4KSkgeworICAgICAgICBQeU9iamVjdCAqY2FsbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoeCwgIl9fY2FsbF9fIik7CisgICAgICAgIGlmIChjYWxsID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAvKiBDb3VsZCB0ZXN0IHJlY3Vyc2l2ZWx5IGJ1dCBkb24ndCwgZm9yIGZlYXIgb2YgZW5kbGVzcworICAgICAgICAgICByZWN1cnNpb24gaWYgc29tZSBqb2tlciBzZXRzIHNlbGYuX19jYWxsX18gPSBzZWxmICovCisgICAgICAgIFB5X0RFQ1JFRihjYWxsKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4geC0+b2JfdHlwZS0+dHBfY2FsbCAhPSBOVUxMOworICAgIH0KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQeU9iamVjdF9EaXIoKSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE2NTcsNTIgKzE2NTcsNTIgQEAKIHN0YXRpYyBpbnQKIG1lcmdlX2NsYXNzX2RpY3QoUHlPYmplY3QqIGRpY3QsIFB5T2JqZWN0KiBhY2xhc3MpCiB7Ci0JUHlPYmplY3QgKmNsYXNzZGljdDsKLQlQeU9iamVjdCAqYmFzZXM7CisgICAgUHlPYmplY3QgKmNsYXNzZGljdDsKKyAgICBQeU9iamVjdCAqYmFzZXM7CiAKLQlhc3NlcnQoUHlEaWN0X0NoZWNrKGRpY3QpKTsKLQlhc3NlcnQoYWNsYXNzKTsKKyAgICBhc3NlcnQoUHlEaWN0X0NoZWNrKGRpY3QpKTsKKyAgICBhc3NlcnQoYWNsYXNzKTsKIAotCS8qIE1lcmdlIGluIHRoZSB0eXBlJ3MgZGljdCAoaWYgYW55KS4gKi8KLQljbGFzc2RpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGFjbGFzcywgIl9fZGljdF9fIik7Ci0JaWYgKGNsYXNzZGljdCA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOwotCWVsc2UgewotCQlpbnQgc3RhdHVzID0gUHlEaWN0X1VwZGF0ZShkaWN0LCBjbGFzc2RpY3QpOwotCQlQeV9ERUNSRUYoY2xhc3NkaWN0KTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQorICAgIC8qIE1lcmdlIGluIHRoZSB0eXBlJ3MgZGljdCAoaWYgYW55KS4gKi8KKyAgICBjbGFzc2RpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGFjbGFzcywgIl9fZGljdF9fIik7CisgICAgaWYgKGNsYXNzZGljdCA9PSBOVUxMKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIGVsc2UgeworICAgICAgICBpbnQgc3RhdHVzID0gUHlEaWN0X1VwZGF0ZShkaWN0LCBjbGFzc2RpY3QpOworICAgICAgICBQeV9ERUNSRUYoY2xhc3NkaWN0KTsKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JLyogUmVjdXJzaXZlbHkgbWVyZ2UgaW4gdGhlIGJhc2UgdHlwZXMnIChpZiBhbnkpIGRpY3RzLiAqLwotCWJhc2VzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhhY2xhc3MsICJfX2Jhc2VzX18iKTsKLQlpZiAoYmFzZXMgPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlIHsKLQkJLyogV2UgaGF2ZSBubyBndWFyYW50ZWUgdGhhdCBiYXNlcyBpcyBhIHJlYWwgdHVwbGUgKi8KLQkJUHlfc3NpemVfdCBpLCBuOwotCQluID0gUHlTZXF1ZW5jZV9TaXplKGJhc2VzKTsgLyogVGhpcyBiZXR0ZXIgYmUgcmlnaHQgKi8KLQkJaWYgKG4gPCAwKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJaW50IHN0YXR1czsKLQkJCQlQeU9iamVjdCAqYmFzZSA9IFB5U2VxdWVuY2VfR2V0SXRlbShiYXNlcywgaSk7Ci0JCQkJaWYgKGJhc2UgPT0gTlVMTCkgewotCQkJCQlQeV9ERUNSRUYoYmFzZXMpOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXN0YXR1cyA9IG1lcmdlX2NsYXNzX2RpY3QoZGljdCwgYmFzZSk7Ci0JCQkJUHlfREVDUkVGKGJhc2UpOwotCQkJCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQkJCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJUHlfREVDUkVGKGJhc2VzKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgLyogUmVjdXJzaXZlbHkgbWVyZ2UgaW4gdGhlIGJhc2UgdHlwZXMnIChpZiBhbnkpIGRpY3RzLiAqLworICAgIGJhc2VzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhhY2xhc3MsICJfX2Jhc2VzX18iKTsKKyAgICBpZiAoYmFzZXMgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogV2UgaGF2ZSBubyBndWFyYW50ZWUgdGhhdCBiYXNlcyBpcyBhIHJlYWwgdHVwbGUgKi8KKyAgICAgICAgUHlfc3NpemVfdCBpLCBuOworICAgICAgICBuID0gUHlTZXF1ZW5jZV9TaXplKGJhc2VzKTsgLyogVGhpcyBiZXR0ZXIgYmUgcmlnaHQgKi8KKyAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqYmFzZSA9IFB5U2VxdWVuY2VfR2V0SXRlbShiYXNlcywgaSk7CisgICAgICAgICAgICAgICAgaWYgKGJhc2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1lcmdlX2NsYXNzX2RpY3QoZGljdCwgYmFzZSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGJhc2UpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEhlbHBlciBmb3IgUHlPYmplY3RfRGlyLgpAQCAtMTcxNSwxMDcgKzE3MTUsMTA3IEBACiBzdGF0aWMgaW50CiBtZXJnZV9saXN0X2F0dHIoUHlPYmplY3QqIGRpY3QsIFB5T2JqZWN0KiBvYmosIGNvbnN0IGNoYXIgKmF0dHJuYW1lKQogewotCVB5T2JqZWN0ICpsaXN0OwotCWludCByZXN1bHQgPSAwOworICAgIFB5T2JqZWN0ICpsaXN0OworICAgIGludCByZXN1bHQgPSAwOwogCi0JYXNzZXJ0KFB5RGljdF9DaGVjayhkaWN0KSk7Ci0JYXNzZXJ0KG9iaik7Ci0JYXNzZXJ0KGF0dHJuYW1lKTsKKyAgICBhc3NlcnQoUHlEaWN0X0NoZWNrKGRpY3QpKTsKKyAgICBhc3NlcnQob2JqKTsKKyAgICBhc3NlcnQoYXR0cm5hbWUpOwogCi0JbGlzdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCBhdHRybmFtZSk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKKyAgICBsaXN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosIGF0dHJuYW1lKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICBQeUVycl9DbGVhcigpOwogCi0JZWxzZSBpZiAoUHlMaXN0X0NoZWNrKGxpc3QpKSB7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X0dFVF9TSVpFKGxpc3QpOyArK2kpIHsKLQkJCVB5T2JqZWN0ICppdGVtID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwotCQkJaWYgKFB5U3RyaW5nX0NoZWNrKGl0ZW0pKSB7Ci0JCQkJcmVzdWx0ID0gUHlEaWN0X1NldEl0ZW0oZGljdCwgaXRlbSwgUHlfTm9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA8IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYKLQkJICAgIChzdHJjbXAoYXR0cm5hbWUsICJfX21lbWJlcnNfXyIpID09IDAgfHwKLQkJICAgICBzdHJjbXAoYXR0cm5hbWUsICJfX21ldGhvZHNfXyIpID09IDApKSB7Ci0JCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgCi0JCQkJICAgICAgICJfX21lbWJlcnNfXyBhbmQgX19tZXRob2RzX18gbm90ICIKLQkJCQkgICAgICAgInN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApIHsKLQkJCQlQeV9YREVDUkVGKGxpc3QpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCX0KKyAgICBlbHNlIGlmIChQeUxpc3RfQ2hlY2sobGlzdCkpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeUxpc3RfR0VUX1NJWkUobGlzdCk7ICsraSkgeworICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBQeURpY3RfU2V0SXRlbShkaWN0LCBpdGVtLCBQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAmJgorICAgICAgICAgICAgKHN0cmNtcChhdHRybmFtZSwgIl9fbWVtYmVyc19fIikgPT0gMCB8fAorICAgICAgICAgICAgIHN0cmNtcChhdHRybmFtZSwgIl9fbWV0aG9kc19fIikgPT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fbWVtYmVyc19fIGFuZCBfX21ldGhvZHNfXyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCBpbiAzLngiLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGxpc3QpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCVB5X1hERUNSRUYobGlzdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGxpc3QpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIEhlbHBlciBmb3IgUHlPYmplY3RfRGlyIHdpdGhvdXQgYXJndW1lbnRzOiByZXR1cm5zIHRoZSBsb2NhbCBzY29wZS4gKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBfZGlyX2xvY2Fscyh2b2lkKQogewotCVB5T2JqZWN0ICpuYW1lczsKLQlQeU9iamVjdCAqbG9jYWxzID0gUHlFdmFsX0dldExvY2FscygpOworICAgIFB5T2JqZWN0ICpuYW1lczsKKyAgICBQeU9iamVjdCAqbG9jYWxzID0gUHlFdmFsX0dldExvY2FscygpOwogCi0JaWYgKGxvY2FscyA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgImZyYW1lIGRvZXMgbm90IGV4aXN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobG9jYWxzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiZnJhbWUgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbmFtZXMgPSBQeU1hcHBpbmdfS2V5cyhsb2NhbHMpOwotCWlmICghbmFtZXMpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlMaXN0X0NoZWNrKG5hbWVzKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJImRpcigpOiBleHBlY3RlZCBrZXlzKCkgb2YgbG9jYWxzIHRvIGJlIGEgbGlzdCwgIgotCQkJIm5vdCAnJS4yMDBzJyIsIFB5X1RZUEUobmFtZXMpLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKG5hbWVzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIHRoZSBsb2NhbHMgZG9uJ3QgbmVlZCB0byBiZSBERUNSRUYnZCAqLwotCXJldHVybiBuYW1lczsKKyAgICBuYW1lcyA9IFB5TWFwcGluZ19LZXlzKGxvY2Fscyk7CisgICAgaWYgKCFuYW1lcykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sobmFtZXMpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZGlyKCk6IGV4cGVjdGVkIGtleXMoKSBvZiBsb2NhbHMgdG8gYmUgYSBsaXN0LCAiCisgICAgICAgICAgICAibm90ICclLjIwMHMnIiwgUHlfVFlQRShuYW1lcyktPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYobmFtZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogdGhlIGxvY2FscyBkb24ndCBuZWVkIHRvIGJlIERFQ1JFRidkICovCisgICAgcmV0dXJuIG5hbWVzOwogfQogCiAvKiBIZWxwZXIgZm9yIFB5T2JqZWN0X0RpciBvZiB0eXBlIG9iamVjdHM6IHJldHVybnMgX19kaWN0X18gYW5kIF9fYmFzZXNfXy4KLSAgIFdlIGRlbGliZXJhdGVseSBkb24ndCBzdWNrIHVwIGl0cyBfX2NsYXNzX18sIGFzIG1ldGhvZHMgYmVsb25naW5nIHRvIHRoZSAKLSAgIG1ldGFjbGFzcyB3b3VsZCBwcm9iYWJseSBiZSBtb3JlIGNvbmZ1c2luZyB0aGFuIGhlbHBmdWwuIAorICAgV2UgZGVsaWJlcmF0ZWx5IGRvbid0IHN1Y2sgdXAgaXRzIF9fY2xhc3NfXywgYXMgbWV0aG9kcyBiZWxvbmdpbmcgdG8gdGhlCisgICBtZXRhY2xhc3Mgd291bGQgcHJvYmFibHkgYmUgbW9yZSBjb25mdXNpbmcgdGhhbiBoZWxwZnVsLgogKi8KLXN0YXRpYyBQeU9iamVjdCAqIAorc3RhdGljIFB5T2JqZWN0ICoKIF9zcGVjaWFsaXplZF9kaXJfdHlwZShQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCVB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOwogCi0JaWYgKGRpY3QgIT0gTlVMTCAmJiBtZXJnZV9jbGFzc19kaWN0KGRpY3QsIG9iaikgPT0gMCkKLQkJcmVzdWx0ID0gUHlEaWN0X0tleXMoZGljdCk7CisgICAgaWYgKGRpY3QgIT0gTlVMTCAmJiBtZXJnZV9jbGFzc19kaWN0KGRpY3QsIG9iaikgPT0gMCkKKyAgICAgICAgcmVzdWx0ID0gUHlEaWN0X0tleXMoZGljdCk7CiAKLQlQeV9YREVDUkVGKGRpY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBIZWxwZXIgZm9yIFB5T2JqZWN0X0RpciBvZiBtb2R1bGUgb2JqZWN0czogcmV0dXJucyB0aGUgbW9kdWxlJ3MgX19kaWN0X18uICovCiBzdGF0aWMgUHlPYmplY3QgKgogX3NwZWNpYWxpemVkX2Rpcl9tb2R1bGUoUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlQeU9iamVjdCAqZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19kaWN0X18iKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19kaWN0X18iKTsKIAotCWlmIChkaWN0ICE9IE5VTEwpIHsKLQkJaWYgKFB5RGljdF9DaGVjayhkaWN0KSkKLQkJCXJlc3VsdCA9IFB5RGljdF9LZXlzKGRpY3QpOwotCQllbHNlIHsKLQkJCWNoYXIgKm5hbWUgPSBQeU1vZHVsZV9HZXROYW1lKG9iaik7Ci0JCQlpZiAobmFtZSkKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgICAgICIlLjIwMHMuX19kaWN0X18gaXMgbm90IGEgZGljdGlvbmFyeSIsCi0JCQkJCSAgICAgbmFtZSk7Ci0JCX0KLQl9CisgICAgaWYgKGRpY3QgIT0gTlVMTCkgeworICAgICAgICBpZiAoUHlEaWN0X0NoZWNrKGRpY3QpKQorICAgICAgICAgICAgcmVzdWx0ID0gUHlEaWN0X0tleXMoZGljdCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciAqbmFtZSA9IFB5TW9kdWxlX0dldE5hbWUob2JqKTsKKyAgICAgICAgICAgIGlmIChuYW1lKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMuX19kaWN0X18gaXMgbm90IGEgZGljdGlvbmFyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICB9CisgICAgfQogCi0JUHlfWERFQ1JFRihkaWN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogSGVscGVyIGZvciBQeU9iamVjdF9EaXIgb2YgZ2VuZXJpYyBvYmplY3RzOiByZXR1cm5zIF9fZGljdF9fLCBfX2NsYXNzX18sCkBAIC0xODI0LDU0ICsxODI0LDU0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2dlbmVyaWNfZGlyKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JUHlPYmplY3QgKmRpY3QgPSBOVUxMOwotCVB5T2JqZWN0ICppdHNjbGFzcyA9IE5VTEw7Ci0JCi0JLyogR2V0IF9fZGljdF9fICh3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBhIHJlYWwgZGljdC4uLikgKi8KLQlkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2RpY3RfXyIpOwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJZGljdCA9IFB5RGljdF9OZXcoKTsKLQl9Ci0JZWxzZSBpZiAoIVB5RGljdF9DaGVjayhkaWN0KSkgewotCQlQeV9ERUNSRUYoZGljdCk7Ci0JCWRpY3QgPSBQeURpY3RfTmV3KCk7Ci0JfQotCWVsc2UgewotCQkvKiBDb3B5IF9fZGljdF9fIHRvIGF2b2lkIG11dGF0aW5nIGl0LiAqLwotCQlQeU9iamVjdCAqdGVtcCA9IFB5RGljdF9Db3B5KGRpY3QpOwotCQlQeV9ERUNSRUYoZGljdCk7Ci0JCWRpY3QgPSB0ZW1wOwotCX0KKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGljdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKml0c2NsYXNzID0gTlVMTDsKIAotCWlmIChkaWN0ID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7CisgICAgLyogR2V0IF9fZGljdF9fICh3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBhIHJlYWwgZGljdC4uLikgKi8KKyAgICBkaWN0ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2RpY3RfXyIpOworICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIVB5RGljdF9DaGVjayhkaWN0KSkgeworICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBDb3B5IF9fZGljdF9fIHRvIGF2b2lkIG11dGF0aW5nIGl0LiAqLworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5RGljdF9Db3B5KGRpY3QpOworICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgIGRpY3QgPSB0ZW1wOworICAgIH0KIAotCS8qIE1lcmdlIGluIF9fbWVtYmVyc19fIGFuZCBfX21ldGhvZHNfXyAoaWYgYW55KS4KLQkgKiBUaGlzIGlzIHJlbW92ZWQgaW4gUHl0aG9uIDMwMDAuICovCi0JaWYgKG1lcmdlX2xpc3RfYXR0cihkaWN0LCBvYmosICJfX21lbWJlcnNfXyIpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlpZiAobWVyZ2VfbGlzdF9hdHRyKGRpY3QsIG9iaiwgIl9fbWV0aG9kc19fIikgPCAwKQotCQlnb3RvIGVycm9yOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQkvKiBNZXJnZSBpbiBhdHRycyByZWFjaGFibGUgZnJvbSBpdHMgY2xhc3MuICovCi0JaXRzY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fY2xhc3NfXyIpOwotCWlmIChpdHNjbGFzcyA9PSBOVUxMKQotCQkvKiBYWFgodG9tZXIpOiBQZXJoYXBzIGZhbGwgYmFjayB0byBvYmotPm9iX3R5cGUgaWYgbm8KLQkJICAgICAgICAgICAgICAgX19jbGFzc19fIGV4aXN0cz8gKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlIHsKLQkJaWYgKG1lcmdlX2NsYXNzX2RpY3QoZGljdCwgaXRzY2xhc3MpICE9IDApCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICAvKiBNZXJnZSBpbiBfX21lbWJlcnNfXyBhbmQgX19tZXRob2RzX18gKGlmIGFueSkuCisgICAgICogVGhpcyBpcyByZW1vdmVkIGluIFB5dGhvbiAzMDAwLiAqLworICAgIGlmIChtZXJnZV9saXN0X2F0dHIoZGljdCwgb2JqLCAiX19tZW1iZXJzX18iKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKG1lcmdlX2xpc3RfYXR0cihkaWN0LCBvYmosICJfX21ldGhvZHNfXyIpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCXJlc3VsdCA9IFB5RGljdF9LZXlzKGRpY3QpOwotCS8qIGZhbGwgdGhyb3VnaCAqLworICAgIC8qIE1lcmdlIGluIGF0dHJzIHJlYWNoYWJsZSBmcm9tIGl0cyBjbGFzcy4gKi8KKyAgICBpdHNjbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19jbGFzc19fIik7CisgICAgaWYgKGl0c2NsYXNzID09IE5VTEwpCisgICAgICAgIC8qIFhYWCh0b21lcik6IFBlcmhhcHMgZmFsbCBiYWNrIHRvIG9iai0+b2JfdHlwZSBpZiBubworICAgICAgICAgICAgICAgICAgICAgICBfX2NsYXNzX18gZXhpc3RzPyAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIGVsc2UgeworICAgICAgICBpZiAobWVyZ2VfY2xhc3NfZGljdChkaWN0LCBpdHNjbGFzcykgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlEaWN0X0tleXMoZGljdCk7CisgICAgLyogZmFsbCB0aHJvdWdoICovCiBlcnJvcjoKLQlQeV9YREVDUkVGKGl0c2NsYXNzKTsKLQlQeV9YREVDUkVGKGRpY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfWERFQ1JFRihpdHNjbGFzcyk7CisgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBIZWxwZXIgZm9yIFB5T2JqZWN0X0Rpcjogb2JqZWN0IGludHJvc3BlY3Rpb24uCkBAIC0xODgwLDQwICsxODgwLDQwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2Rpcl9vYmplY3QoUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKLQlQeU9iamVjdCAqZGlyZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopb2JqLT5vYl90eXBlLAotCQkJCQkJICAgIl9fZGlyX18iKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGlyZnVuYyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopb2JqLT5vYl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19kaXJfXyIpOwogCi0JYXNzZXJ0KG9iaik7Ci0JaWYgKGRpcmZ1bmMgPT0gTlVMTCkgewotCQkvKiB1c2UgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAqLwotCQlQeUVycl9DbGVhcigpOwotCQlpZiAoUHlNb2R1bGVfQ2hlY2sob2JqKSkKLQkJCXJlc3VsdCA9IF9zcGVjaWFsaXplZF9kaXJfbW9kdWxlKG9iaik7Ci0JCWVsc2UgaWYgKFB5VHlwZV9DaGVjayhvYmopIHx8IFB5Q2xhc3NfQ2hlY2sob2JqKSkKLQkJCXJlc3VsdCA9IF9zcGVjaWFsaXplZF9kaXJfdHlwZShvYmopOwotCQllbHNlCi0JCQlyZXN1bHQgPSBfZ2VuZXJpY19kaXIob2JqKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIHVzZSBfX2Rpcl9fICovCi0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZGlyZnVuYywgb2JqLCBOVUxMKTsKLQkJUHlfREVDUkVGKGRpcmZ1bmMpOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQob2JqKTsKKyAgICBpZiAoZGlyZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIC8qIHVzZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChQeU1vZHVsZV9DaGVjayhvYmopKQorICAgICAgICAgICAgcmVzdWx0ID0gX3NwZWNpYWxpemVkX2Rpcl9tb2R1bGUob2JqKTsKKyAgICAgICAgZWxzZSBpZiAoUHlUeXBlX0NoZWNrKG9iaikgfHwgUHlDbGFzc19DaGVjayhvYmopKQorICAgICAgICAgICAgcmVzdWx0ID0gX3NwZWNpYWxpemVkX2Rpcl90eXBlKG9iaik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IF9nZW5lcmljX2RpcihvYmopOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogdXNlIF9fZGlyX18gKi8KKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhkaXJmdW5jLCBvYmosIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZGlyZnVuYyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JCS8qIHJlc3VsdCBtdXN0IGJlIGEgbGlzdCAqLwotCQkvKiBYWFgoZ2JyYW5kbCk6IGNvdWxkIGFsc28gY2hlY2sgaWYgYWxsIGl0ZW1zIGFyZSBzdHJpbmdzICovCi0JCWlmICghUHlMaXN0X0NoZWNrKHJlc3VsdCkpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiX19kaXJfXygpIG11c3QgcmV0dXJuIGEgbGlzdCwgbm90ICUuMjAwcyIsCi0JCQkJICAgICBQeV9UWVBFKHJlc3VsdCktPnRwX25hbWUpOwotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXN1bHQgPSBOVUxMOwotCQl9Ci0JfQorICAgICAgICAvKiByZXN1bHQgbXVzdCBiZSBhIGxpc3QgKi8KKyAgICAgICAgLyogWFhYKGdicmFuZGwpOiBjb3VsZCBhbHNvIGNoZWNrIGlmIGFsbCBpdGVtcyBhcmUgc3RyaW5ncyAqLworICAgICAgICBpZiAoIVB5TGlzdF9DaGVjayhyZXN1bHQpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJfX2Rpcl9fKCkgbXVzdCByZXR1cm4gYSBsaXN0LCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHJlc3VsdCktPnRwX25hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBJbXBsZW1lbnRhdGlvbiBvZiBkaXIoKSAtLSBpZiBvYmogaXMgTlVMTCwgcmV0dXJucyB0aGUgbmFtZXMgaW4gdGhlIGN1cnJlbnQKQEAgLTE5MjMsMjQgKzE5MjMsMjQgQEAKIFB5T2JqZWN0ICoKIFB5T2JqZWN0X0RpcihQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICogcmVzdWx0OworICAgIFB5T2JqZWN0ICogcmVzdWx0OwogCi0JaWYgKG9iaiA9PSBOVUxMKQotCQkvKiBubyBvYmplY3QgLS0gaW50cm9zcGVjdCB0aGUgbG9jYWxzICovCi0JCXJlc3VsdCA9IF9kaXJfbG9jYWxzKCk7Ci0JZWxzZQotCQkvKiBvYmplY3QgLS0gaW50cm9zcGVjdCB0aGUgb2JqZWN0ICovCi0JCXJlc3VsdCA9IF9kaXJfb2JqZWN0KG9iaik7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICAvKiBubyBvYmplY3QgLS0gaW50cm9zcGVjdCB0aGUgbG9jYWxzICovCisgICAgICAgIHJlc3VsdCA9IF9kaXJfbG9jYWxzKCk7CisgICAgZWxzZQorICAgICAgICAvKiBvYmplY3QgLS0gaW50cm9zcGVjdCB0aGUgb2JqZWN0ICovCisgICAgICAgIHJlc3VsdCA9IF9kaXJfb2JqZWN0KG9iaik7CiAKLQlhc3NlcnQocmVzdWx0ID09IE5VTEwgfHwgUHlMaXN0X0NoZWNrKHJlc3VsdCkpOworICAgIGFzc2VydChyZXN1bHQgPT0gTlVMTCB8fCBQeUxpc3RfQ2hlY2socmVzdWx0KSk7CiAKLQlpZiAocmVzdWx0ICE9IE5VTEwgJiYgUHlMaXN0X1NvcnQocmVzdWx0KSAhPSAwKSB7Ci0JCS8qIHNvcnRpbmcgdGhlIGxpc3QgZmFpbGVkICovCi0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBOVUxMOwotCX0KLQkKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiBQeUxpc3RfU29ydChyZXN1bHQpICE9IDApIHsKKyAgICAgICAgLyogc29ydGluZyB0aGUgbGlzdCBmYWlsZWQgKi8KKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyoKQEAgLTE5NTQsMzUgKzE5NTQsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBub25lX3JlcHIoUHlPYmplY3QgKm9wKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJOb25lIik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIk5vbmUiKTsKIH0KIAogLyogQVJHVVNFRCAqLwogc3RhdGljIHZvaWQKIG5vbmVfZGVhbGxvYyhQeU9iamVjdCogaWdub3JlKQogewotCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGdldCBjYWxsZWQsIGJ1dCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gU0VHViBpZgotCSAqIHdlIGFjY2lkZW50YWxseSBkZWNyZWYgTm9uZSBvdXQgb2YgZXhpc3RlbmNlLgotCSAqLwotCVB5X0ZhdGFsRXJyb3IoImRlYWxsb2NhdGluZyBOb25lIik7CisgICAgLyogVGhpcyBzaG91bGQgbmV2ZXIgZ2V0IGNhbGxlZCwgYnV0IHdlIGFsc28gZG9uJ3Qgd2FudCB0byBTRUdWIGlmCisgICAgICogd2UgYWNjaWRlbnRhbGx5IGRlY3JlZiBOb25lIG91dCBvZiBleGlzdGVuY2UuCisgICAgICovCisgICAgUHlfRmF0YWxFcnJvcigiZGVhbGxvY2F0aW5nIE5vbmUiKTsKIH0KIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5Tm9uZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JIk5vbmVUeXBlIiwKLQkwLAotCTAsCi0Jbm9uZV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLyAvKm5ldmVyIGNhbGxlZCovCi0JMCwJCS8qdHBfcHJpbnQqLwotCTAsCQkvKnRwX2dldGF0dHIqLwotCTAsCQkvKnRwX3NldGF0dHIqLwotCTAsCQkvKnRwX2NvbXBhcmUqLwotCW5vbmVfcmVwciwJLyp0cF9yZXByKi8KLQkwLAkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJLyp0cF9hc19tYXBwaW5nKi8KLQkoaGFzaGZ1bmMpX1B5X0hhc2hQb2ludGVyLCAvKnRwX2hhc2ggKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJOb25lVHlwZSIsCisgICAgMCwKKyAgICAwLAorICAgIG5vbmVfZGVhbGxvYywgICAgICAgLyp0cF9kZWFsbG9jKi8gLypuZXZlciBjYWxsZWQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgbm9uZV9yZXByLCAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYylfUHlfSGFzaFBvaW50ZXIsIC8qdHBfaGFzaCAqLwogfTsKIAogUHlPYmplY3QgX1B5X05vbmVTdHJ1Y3QgPSB7CkBAIC0xOTk2LDE2MSArMTk5NiwxNjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBOb3RJbXBsZW1lbnRlZF9yZXByKFB5T2JqZWN0ICpvcCkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiTm90SW1wbGVtZW50ZWQiKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiTm90SW1wbGVtZW50ZWQiKTsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeU5vdEltcGxlbWVudGVkX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiTm90SW1wbGVtZW50ZWRUeXBlIiwKLQkwLAotCTAsCi0Jbm9uZV9kZWFsbG9jLAkvKnRwX2RlYWxsb2MqLyAvKm5ldmVyIGNhbGxlZCovCi0JMCwJCS8qdHBfcHJpbnQqLwotCTAsCQkvKnRwX2dldGF0dHIqLwotCTAsCQkvKnRwX3NldGF0dHIqLwotCTAsCQkvKnRwX2NvbXBhcmUqLwotCU5vdEltcGxlbWVudGVkX3JlcHIsIC8qdHBfcmVwciovCi0JMCwJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCS8qdHBfaGFzaCAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgIk5vdEltcGxlbWVudGVkVHlwZSIsCisgICAgMCwKKyAgICAwLAorICAgIG5vbmVfZGVhbGxvYywgICAgICAgLyp0cF9kZWFsbG9jKi8gLypuZXZlciBjYWxsZWQqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgTm90SW1wbGVtZW50ZWRfcmVwciwgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLwogfTsKIAogUHlPYmplY3QgX1B5X05vdEltcGxlbWVudGVkU3RydWN0ID0gewotCV9QeU9iamVjdF9FWFRSQV9JTklUCi0JMSwgJlB5Tm90SW1wbGVtZW50ZWRfVHlwZQorICAgIF9QeU9iamVjdF9FWFRSQV9JTklUCisgICAgMSwgJlB5Tm90SW1wbGVtZW50ZWRfVHlwZQogfTsKIAogdm9pZAogX1B5X1JlYWR5VHlwZXModm9pZCkKIHsKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVR5cGVfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHR5cGUgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHlwZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdHlwZSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZfUHlXZWFrcmVmX1JlZlR5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB3ZWFrcmVmIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZfUHlXZWFrcmVmX1JlZlR5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB3ZWFrcmVmIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJl9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBjYWxsYWJsZSB3ZWFrcmVmIHByb3h5IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZfUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgY2FsbGFibGUgd2Vha3JlZiBwcm94eSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZfUHlXZWFrcmVmX1Byb3h5VHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHdlYWtyZWYgcHJveHkgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJl9QeVdlYWtyZWZfUHJveHlUeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgd2Vha3JlZiBwcm94eSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUJvb2xfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGJvb2wgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Qm9vbF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgYm9vbCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVN0cmluZ19UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc3RyIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVN0cmluZ19UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc3RyIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5Qnl0ZUFycmF5X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBieXRlYXJyYXkgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Qnl0ZUFycmF5X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBieXRlYXJyYXkgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlMaXN0X1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBsaXN0IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUxpc3RfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGxpc3QgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlOb25lX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBOb25lIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeU5vbmVfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIE5vbmUgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlOb3RJbXBsZW1lbnRlZF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgTm90SW1wbGVtZW50ZWQgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Tm90SW1wbGVtZW50ZWRfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIE5vdEltcGxlbWVudGVkIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5VHJhY2VCYWNrX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB0cmFjZWJhY2sgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5VHJhY2VCYWNrX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB0cmFjZWJhY2sgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlTdXBlcl9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc3VwZXIgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5U3VwZXJfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHN1cGVyIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5QmFzZU9iamVjdF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgb2JqZWN0IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUJhc2VPYmplY3RfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIG9iamVjdCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVJhbmdlX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB4cmFuZ2UgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5UmFuZ2VfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHhyYW5nZSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeURpY3RfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGRpY3QgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RGljdF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZGljdCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVNldF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc2V0IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVNldF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc2V0IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5VW5pY29kZV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdW5pY29kZSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlVbmljb2RlX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB1bmljb2RlIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5U2xpY2VfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHNsaWNlIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVNsaWNlX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBzbGljZSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVN0YXRpY01ldGhvZF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgc3RhdGljIG1ldGhvZCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlTdGF0aWNNZXRob2RfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHN0YXRpYyBtZXRob2QgdHlwZSIpOwogCiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCWlmIChQeVR5cGVfUmVhZHkoJlB5Q29tcGxleF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgY29tcGxleCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlDb21wbGV4X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBjb21wbGV4IHR5cGUiKTsKICNlbmRpZgogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlGbG9hdF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZmxvYXQgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RmxvYXRfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGZsb2F0IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5QnVmZmVyX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBidWZmZXIgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5QnVmZmVyX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBidWZmZXIgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlMb25nX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBsb25nIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUxvbmdfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGxvbmcgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlJbnRfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGludCB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlJbnRfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGludCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUZyb3plblNldF9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZnJvemVuc2V0IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUZyb3plblNldF9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZnJvemVuc2V0IHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5UHJvcGVydHlfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHByb3BlcnR5IHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVByb3BlcnR5X1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBwcm9wZXJ0eSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVR1cGxlX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSB0dXBsZSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlUdXBsZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdHVwbGUgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlFbnVtX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBlbnVtZXJhdGUgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RW51bV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZW51bWVyYXRlIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5UmV2ZXJzZWRfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHJldmVyc2VkIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeVJldmVyc2VkX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSByZXZlcnNlZCB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUNvZGVfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGNvZGUgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q29kZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgY29kZSB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUZyYW1lX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBmcmFtZSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlGcmFtZV9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZnJhbWUgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlDRnVuY3Rpb25fVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGJ1aWx0aW4gZnVuY3Rpb24gdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5Q0Z1bmN0aW9uX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBidWlsdGluIGZ1bmN0aW9uIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5TWV0aG9kX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBtZXRob2QgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5TWV0aG9kX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBtZXRob2QgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlGdW5jdGlvbl9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZnVuY3Rpb24gdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5RnVuY3Rpb25fVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGZ1bmN0aW9uIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5Q2xhc3NfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGNsYXNzIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUNsYXNzX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBjbGFzcyB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeURpY3RQcm94eV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgZGljdCBwcm94eSB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlEaWN0UHJveHlfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGRpY3QgcHJveHkgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlHZW5fVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGdlbmVyYXRvciB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlHZW5fVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGdlbmVyYXRvciB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeUdldFNldERlc2NyX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBnZXQtc2V0IGRlc2NyaXB0b3IgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5R2V0U2V0RGVzY3JfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGdldC1zZXQgZGVzY3JpcHRvciB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeVdyYXBwZXJEZXNjcl9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgd3JhcHBlciB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlXcmFwcGVyRGVzY3JfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHdyYXBwZXIgdHlwZSIpOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlJbnN0YW5jZV9UeXBlKSA8IDApCi0JCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgaW5zdGFuY2UgdHlwZSIpOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5SW5zdGFuY2VfVHlwZSkgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGluc3RhbmNlIHR5cGUiKTsKIAotCWlmIChQeVR5cGVfUmVhZHkoJlB5RWxsaXBzaXNfVHlwZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIGVsbGlwc2lzIHR5cGUiKTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZQeUVsbGlwc2lzX1R5cGUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBlbGxpcHNpcyB0eXBlIik7CiAKLQlpZiAoUHlUeXBlX1JlYWR5KCZQeU1lbWJlckRlc2NyX1R5cGUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBtZW1iZXIgZGVzY3JpcHRvciB0eXBlIik7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlNZW1iZXJEZXNjcl9UeXBlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgbWVtYmVyIGRlc2NyaXB0b3IgdHlwZSIpOwogfQogCiAKQEAgLTIxNTksNDMgKzIxNTksNDMgQEAKIHZvaWQKIF9QeV9OZXdSZWZlcmVuY2UoUHlPYmplY3QgKm9wKQogewotCV9QeV9JTkNfUkVGVE9UQUw7Ci0Jb3AtPm9iX3JlZmNudCA9IDE7Ci0JX1B5X0FkZFRvQWxsT2JqZWN0cyhvcCwgMSk7Ci0JX1B5X0lOQ19UUEFMTE9DUyhvcCk7CisgICAgX1B5X0lOQ19SRUZUT1RBTDsKKyAgICBvcC0+b2JfcmVmY250ID0gMTsKKyAgICBfUHlfQWRkVG9BbGxPYmplY3RzKG9wLCAxKTsKKyAgICBfUHlfSU5DX1RQQUxMT0NTKG9wKTsKIH0KIAogdm9pZAogX1B5X0ZvcmdldFJlZmVyZW5jZShyZWdpc3RlciBQeU9iamVjdCAqb3ApCiB7CiAjaWZkZWYgU0xPV19VTlJFRl9DSEVDSwotICAgICAgICByZWdpc3RlciBQeU9iamVjdCAqcDsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqcDsKICNlbmRpZgotCWlmIChvcC0+b2JfcmVmY250IDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiVU5SRUYgbmVnYXRpdmUgcmVmY250Iik7Ci0JaWYgKG9wID09ICZyZWZjaGFpbiB8fAotCSAgICBvcC0+X29iX3ByZXYtPl9vYl9uZXh0ICE9IG9wIHx8IG9wLT5fb2JfbmV4dC0+X29iX3ByZXYgIT0gb3ApCi0JCVB5X0ZhdGFsRXJyb3IoIlVOUkVGIGludmFsaWQgb2JqZWN0Iik7CisgICAgaWYgKG9wLT5vYl9yZWZjbnQgPCAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJVTlJFRiBuZWdhdGl2ZSByZWZjbnQiKTsKKyAgICBpZiAob3AgPT0gJnJlZmNoYWluIHx8CisgICAgICAgIG9wLT5fb2JfcHJldi0+X29iX25leHQgIT0gb3AgfHwgb3AtPl9vYl9uZXh0LT5fb2JfcHJldiAhPSBvcCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiVU5SRUYgaW52YWxpZCBvYmplY3QiKTsKICNpZmRlZiBTTE9XX1VOUkVGX0NIRUNLCi0JZm9yIChwID0gcmVmY2hhaW4uX29iX25leHQ7IHAgIT0gJnJlZmNoYWluOyBwID0gcC0+X29iX25leHQpIHsKLQkJaWYgKHAgPT0gb3ApCi0JCQlicmVhazsKLQl9Ci0JaWYgKHAgPT0gJnJlZmNoYWluKSAvKiBOb3QgZm91bmQgKi8KLQkJUHlfRmF0YWxFcnJvcigiVU5SRUYgdW5rbm93biBvYmplY3QiKTsKKyAgICBmb3IgKHAgPSByZWZjaGFpbi5fb2JfbmV4dDsgcCAhPSAmcmVmY2hhaW47IHAgPSBwLT5fb2JfbmV4dCkgeworICAgICAgICBpZiAocCA9PSBvcCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocCA9PSAmcmVmY2hhaW4pIC8qIE5vdCBmb3VuZCAqLworICAgICAgICBQeV9GYXRhbEVycm9yKCJVTlJFRiB1bmtub3duIG9iamVjdCIpOwogI2VuZGlmCi0Jb3AtPl9vYl9uZXh0LT5fb2JfcHJldiA9IG9wLT5fb2JfcHJldjsKLQlvcC0+X29iX3ByZXYtPl9vYl9uZXh0ID0gb3AtPl9vYl9uZXh0OwotCW9wLT5fb2JfbmV4dCA9IG9wLT5fb2JfcHJldiA9IE5VTEw7Ci0JX1B5X0lOQ19UUEZSRUVTKG9wKTsKKyAgICBvcC0+X29iX25leHQtPl9vYl9wcmV2ID0gb3AtPl9vYl9wcmV2OworICAgIG9wLT5fb2JfcHJldi0+X29iX25leHQgPSBvcC0+X29iX25leHQ7CisgICAgb3AtPl9vYl9uZXh0ID0gb3AtPl9vYl9wcmV2ID0gTlVMTDsKKyAgICBfUHlfSU5DX1RQRlJFRVMob3ApOwogfQogCiB2b2lkCiBfUHlfRGVhbGxvYyhQeU9iamVjdCAqb3ApCiB7Ci0JZGVzdHJ1Y3RvciBkZWFsbG9jID0gUHlfVFlQRShvcCktPnRwX2RlYWxsb2M7Ci0JX1B5X0ZvcmdldFJlZmVyZW5jZShvcCk7Ci0JKCpkZWFsbG9jKShvcCk7CisgICAgZGVzdHJ1Y3RvciBkZWFsbG9jID0gUHlfVFlQRShvcCktPnRwX2RlYWxsb2M7CisgICAgX1B5X0ZvcmdldFJlZmVyZW5jZShvcCk7CisgICAgKCpkZWFsbG9jKShvcCk7CiB9CiAKIC8qIFByaW50IGFsbCBsaXZlIG9iamVjdHMuICBCZWNhdXNlIFB5T2JqZWN0X1ByaW50IGlzIGNhbGxlZCwgdGhlCkBAIC0yMjA0LDE0ICsyMjA0LDE0IEBACiB2b2lkCiBfUHlfUHJpbnRSZWZlcmVuY2VzKEZJTEUgKmZwKQogewotCVB5T2JqZWN0ICpvcDsKLQlmcHJpbnRmKGZwLCAiUmVtYWluaW5nIG9iamVjdHM6XG4iKTsKLQlmb3IgKG9wID0gcmVmY2hhaW4uX29iX25leHQ7IG9wICE9ICZyZWZjaGFpbjsgb3AgPSBvcC0+X29iX25leHQpIHsKLQkJZnByaW50ZihmcCwgIiVwIFslIiBQWV9GT1JNQVRfU0laRV9UICJkXSAiLCBvcCwgb3AtPm9iX3JlZmNudCk7Ci0JCWlmIChQeU9iamVjdF9QcmludChvcCwgZnAsIDApICE9IDApCi0JCQlQeUVycl9DbGVhcigpOwotCQlwdXRjKCdcbicsIGZwKTsKLQl9CisgICAgUHlPYmplY3QgKm9wOworICAgIGZwcmludGYoZnAsICJSZW1haW5pbmcgb2JqZWN0czpcbiIpOworICAgIGZvciAob3AgPSByZWZjaGFpbi5fb2JfbmV4dDsgb3AgIT0gJnJlZmNoYWluOyBvcCA9IG9wLT5fb2JfbmV4dCkgeworICAgICAgICBmcHJpbnRmKGZwLCAiJXAgWyUiIFBZX0ZPUk1BVF9TSVpFX1QgImRdICIsIG9wLCBvcC0+b2JfcmVmY250KTsKKyAgICAgICAgaWYgKFB5T2JqZWN0X1ByaW50KG9wLCBmcCwgMCkgIT0gMCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHB1dGMoJ1xuJywgZnApOworICAgIH0KIH0KIAogLyogUHJpbnQgdGhlIGFkZHJlc3NlcyBvZiBhbGwgbGl2ZSBvYmplY3RzLiAgVW5saWtlIF9QeV9QcmludFJlZmVyZW5jZXMsIHRoaXMKQEAgLTIyMjAsNDAgKzIyMjAsNDAgQEAKIHZvaWQKIF9QeV9QcmludFJlZmVyZW5jZUFkZHJlc3NlcyhGSUxFICpmcCkKIHsKLQlQeU9iamVjdCAqb3A7Ci0JZnByaW50ZihmcCwgIlJlbWFpbmluZyBvYmplY3QgYWRkcmVzc2VzOlxuIik7Ci0JZm9yIChvcCA9IHJlZmNoYWluLl9vYl9uZXh0OyBvcCAhPSAmcmVmY2hhaW47IG9wID0gb3AtPl9vYl9uZXh0KQotCQlmcHJpbnRmKGZwLCAiJXAgWyUiIFBZX0ZPUk1BVF9TSVpFX1QgImRdICVzXG4iLCBvcCwKLQkJCW9wLT5vYl9yZWZjbnQsIFB5X1RZUEUob3ApLT50cF9uYW1lKTsKKyAgICBQeU9iamVjdCAqb3A7CisgICAgZnByaW50ZihmcCwgIlJlbWFpbmluZyBvYmplY3QgYWRkcmVzc2VzOlxuIik7CisgICAgZm9yIChvcCA9IHJlZmNoYWluLl9vYl9uZXh0OyBvcCAhPSAmcmVmY2hhaW47IG9wID0gb3AtPl9vYl9uZXh0KQorICAgICAgICBmcHJpbnRmKGZwLCAiJXAgWyUiIFBZX0ZPUk1BVF9TSVpFX1QgImRdICVzXG4iLCBvcCwKKyAgICAgICAgICAgIG9wLT5vYl9yZWZjbnQsIFB5X1RZUEUob3ApLT50cF9uYW1lKTsKIH0KIAogUHlPYmplY3QgKgogX1B5X0dldE9iamVjdHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBpLCBuOwotCVB5T2JqZWN0ICp0ID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzLCAqb3A7CisgICAgaW50IGksIG47CisgICAgUHlPYmplY3QgKnQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXMsICpvcDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxPIiwgJm4sICZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3AgPSByZWZjaGFpbi5fb2JfbmV4dDsKLQlyZXMgPSBQeUxpc3RfTmV3KDApOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgKG4gPT0gMCB8fCBpIDwgbikgJiYgb3AgIT0gJnJlZmNoYWluOyBpKyspIHsKLQkJd2hpbGUgKG9wID09IHNlbGYgfHwgb3AgPT0gYXJncyB8fCBvcCA9PSByZXMgfHwgb3AgPT0gdCB8fAotCQkgICAgICAgKHQgIT0gTlVMTCAmJiBQeV9UWVBFKG9wKSAhPSAoUHlUeXBlT2JqZWN0ICopIHQpKSB7Ci0JCQlvcCA9IG9wLT5fb2JfbmV4dDsKLQkJCWlmIChvcCA9PSAmcmVmY2hhaW4pCi0JCQkJcmV0dXJuIHJlczsKLQkJfQotCQlpZiAoUHlMaXN0X0FwcGVuZChyZXMsIG9wKSA8IDApIHsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJb3AgPSBvcC0+X29iX25leHQ7Ci0JfQotCXJldHVybiByZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpfE8iLCAmbiwgJnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvcCA9IHJlZmNoYWluLl9vYl9uZXh0OworICAgIHJlcyA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyAobiA9PSAwIHx8IGkgPCBuKSAmJiBvcCAhPSAmcmVmY2hhaW47IGkrKykgeworICAgICAgICB3aGlsZSAob3AgPT0gc2VsZiB8fCBvcCA9PSBhcmdzIHx8IG9wID09IHJlcyB8fCBvcCA9PSB0IHx8CisgICAgICAgICAgICAgICAodCAhPSBOVUxMICYmIFB5X1RZUEUob3ApICE9IChQeVR5cGVPYmplY3QgKikgdCkpIHsKKyAgICAgICAgICAgIG9wID0gb3AtPl9vYl9uZXh0OworICAgICAgICAgICAgaWYgKG9wID09ICZyZWZjaGFpbikKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHJlcywgb3ApIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBvcCA9IG9wLT5fb2JfbmV4dDsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogI2VuZGlmCkBAIC0yMjcyLDE5ICsyMjcyLDE5IEBACiB2b2lkICoKIFB5TWVtX01hbGxvYyhzaXplX3QgbmJ5dGVzKQogewotCXJldHVybiBQeU1lbV9NQUxMT0MobmJ5dGVzKTsKKyAgICByZXR1cm4gUHlNZW1fTUFMTE9DKG5ieXRlcyk7CiB9CiAKIHZvaWQgKgogUHlNZW1fUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbmJ5dGVzKQogewotCXJldHVybiBQeU1lbV9SRUFMTE9DKHAsIG5ieXRlcyk7CisgICAgcmV0dXJuIFB5TWVtX1JFQUxMT0MocCwgbmJ5dGVzKTsKIH0KIAogdm9pZAogUHlNZW1fRnJlZSh2b2lkICpwKQogewotCVB5TWVtX0ZSRUUocCk7CisgICAgUHlNZW1fRlJFRShwKTsKIH0KIAogCkBAIC0yMzA1LDUyICsyMzA1LDUyIEBACiBpbnQKIFB5X1JlcHJFbnRlcihQeU9iamVjdCAqb2JqKQogewotCVB5T2JqZWN0ICpkaWN0OwotCVB5T2JqZWN0ICpsaXN0OwotCVB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlkaWN0ID0gUHlUaHJlYWRTdGF0ZV9HZXREaWN0KCk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JbGlzdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIEtFWSk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkgewotCQlsaXN0ID0gUHlMaXN0X05ldygwKTsKLQkJaWYgKGxpc3QgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIEtFWSwgbGlzdCkgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYobGlzdCk7Ci0JfQotCWkgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCWlmIChQeUxpc3RfR0VUX0lURU0obGlzdCwgaSkgPT0gb2JqKQotCQkJcmV0dXJuIDE7Ci0JfQotCVB5TGlzdF9BcHBlbmQobGlzdCwgb2JqKTsKLQlyZXR1cm4gMDsKKyAgICBkaWN0ID0gUHlUaHJlYWRTdGF0ZV9HZXREaWN0KCk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbGlzdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIEtFWSk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICAgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIEtFWSwgbGlzdCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgfQorICAgIGkgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIGlmIChQeUxpc3RfR0VUX0lURU0obGlzdCwgaSkgPT0gb2JqKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5TGlzdF9BcHBlbmQobGlzdCwgb2JqKTsKKyAgICByZXR1cm4gMDsKIH0KIAogdm9pZAogUHlfUmVwckxlYXZlKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JUHlPYmplY3QgKmxpc3Q7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICpsaXN0OworICAgIFB5X3NzaXplX3QgaTsKIAotCWRpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JbGlzdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIEtFWSk7Ci0JaWYgKGxpc3QgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKGxpc3QpKQotCQlyZXR1cm47Ci0JaSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKLQkvKiBDb3VudCBiYWNrd2FyZHMgYmVjYXVzZSB3ZSBhbHdheXMgZXhwZWN0IG9iaiB0byBiZSBsaXN0Wy0xXSAqLwotCXdoaWxlICgtLWkgPj0gMCkgewotCQlpZiAoUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpID09IG9iaikgewotCQkJUHlMaXN0X1NldFNsaWNlKGxpc3QsIGksIGkgKyAxLCBOVUxMKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgIGRpY3QgPSBQeVRocmVhZFN0YXRlX0dldERpY3QoKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgbGlzdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIEtFWSk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKGxpc3QpKQorICAgICAgICByZXR1cm47CisgICAgaSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKKyAgICAvKiBDb3VudCBiYWNrd2FyZHMgYmVjYXVzZSB3ZSBhbHdheXMgZXhwZWN0IG9iaiB0byBiZSBsaXN0Wy0xXSAqLworICAgIHdoaWxlICgtLWkgPj0gMCkgeworICAgICAgICBpZiAoUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpID09IG9iaikgeworICAgICAgICAgICAgUHlMaXN0X1NldFNsaWNlKGxpc3QsIGksIGkgKyAxLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogfQogCiAvKiBUcmFzaGNhbiBzdXBwb3J0LiAqLwpAQCAtMjM3MCwxMSArMjM3MCwxMSBAQAogdm9pZAogX1B5VHJhc2hfZGVwb3NpdF9vYmplY3QoUHlPYmplY3QgKm9wKQogewotCWFzc2VydChQeU9iamVjdF9JU19HQyhvcCkpOwotCWFzc2VydChfUHlfQVNfR0Mob3ApLT5nYy5nY19yZWZzID09IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsKLQlhc3NlcnQob3AtPm9iX3JlZmNudCA9PSAwKTsKLQlfUHlfQVNfR0Mob3ApLT5nYy5nY19wcmV2ID0gKFB5R0NfSGVhZCAqKV9QeVRyYXNoX2RlbGV0ZV9sYXRlcjsKLQlfUHlUcmFzaF9kZWxldGVfbGF0ZXIgPSBvcDsKKyAgICBhc3NlcnQoUHlPYmplY3RfSVNfR0Mob3ApKTsKKyAgICBhc3NlcnQoX1B5X0FTX0dDKG9wKS0+Z2MuZ2NfcmVmcyA9PSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCk7CisgICAgYXNzZXJ0KG9wLT5vYl9yZWZjbnQgPT0gMCk7CisgICAgX1B5X0FTX0dDKG9wKS0+Z2MuZ2NfcHJldiA9IChQeUdDX0hlYWQgKilfUHlUcmFzaF9kZWxldGVfbGF0ZXI7CisgICAgX1B5VHJhc2hfZGVsZXRlX2xhdGVyID0gb3A7CiB9CiAKIC8qIERlYWxsb2NjYXRlIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgX1B5VHJhc2hfZGVsZXRlX2xhdGVyIGxpc3QuICBDYWxsZWQgd2hlbgpAQCAtMjM4MywyNCArMjM4MywyNCBAQAogdm9pZAogX1B5VHJhc2hfZGVzdHJveV9jaGFpbih2b2lkKQogewotCXdoaWxlIChfUHlUcmFzaF9kZWxldGVfbGF0ZXIpIHsKLQkJUHlPYmplY3QgKm9wID0gX1B5VHJhc2hfZGVsZXRlX2xhdGVyOwotCQlkZXN0cnVjdG9yIGRlYWxsb2MgPSBQeV9UWVBFKG9wKS0+dHBfZGVhbGxvYzsKKyAgICB3aGlsZSAoX1B5VHJhc2hfZGVsZXRlX2xhdGVyKSB7CisgICAgICAgIFB5T2JqZWN0ICpvcCA9IF9QeVRyYXNoX2RlbGV0ZV9sYXRlcjsKKyAgICAgICAgZGVzdHJ1Y3RvciBkZWFsbG9jID0gUHlfVFlQRShvcCktPnRwX2RlYWxsb2M7CiAKLQkJX1B5VHJhc2hfZGVsZXRlX2xhdGVyID0KLQkJCShQeU9iamVjdCopIF9QeV9BU19HQyhvcCktPmdjLmdjX3ByZXY7CisgICAgICAgIF9QeVRyYXNoX2RlbGV0ZV9sYXRlciA9CisgICAgICAgICAgICAoUHlPYmplY3QqKSBfUHlfQVNfR0Mob3ApLT5nYy5nY19wcmV2OwogCi0JCS8qIENhbGwgdGhlIGRlYWxsb2NhdG9yIGRpcmVjdGx5LiAgVGhpcyB1c2VkIHRvIHRyeSB0bwotCQkgKiBmb29sIFB5X0RFQ1JFRiBpbnRvIGNhbGxpbmcgaXQgaW5kaXJlY3RseSwgYnV0Ci0JCSAqIFB5X0RFQ1JFRiB3YXMgYWxyZWFkeSBjYWxsZWQgb24gdGhpcyBvYmplY3QsIGFuZCBpbgotCQkgKiBhc3NvcnRlZCBub24tcmVsZWFzZSBidWlsZHMgY2FsbGluZyBQeV9ERUNSRUYgYWdhaW4gZW5kcwotCQkgKiB1cCBkaXN0b3J0aW5nIGFsbG9jYXRpb24gc3RhdGlzdGljcy4KLQkJICovCi0JCWFzc2VydChvcC0+b2JfcmVmY250ID09IDApOwotCQkrK19QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOwotCQkoKmRlYWxsb2MpKG9wKTsKLQkJLS1fUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKLQl9CisgICAgICAgIC8qIENhbGwgdGhlIGRlYWxsb2NhdG9yIGRpcmVjdGx5LiAgVGhpcyB1c2VkIHRvIHRyeSB0bworICAgICAgICAgKiBmb29sIFB5X0RFQ1JFRiBpbnRvIGNhbGxpbmcgaXQgaW5kaXJlY3RseSwgYnV0CisgICAgICAgICAqIFB5X0RFQ1JFRiB3YXMgYWxyZWFkeSBjYWxsZWQgb24gdGhpcyBvYmplY3QsIGFuZCBpbgorICAgICAgICAgKiBhc3NvcnRlZCBub24tcmVsZWFzZSBidWlsZHMgY2FsbGluZyBQeV9ERUNSRUYgYWdhaW4gZW5kcworICAgICAgICAgKiB1cCBkaXN0b3J0aW5nIGFsbG9jYXRpb24gc3RhdGlzdGljcy4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydChvcC0+b2JfcmVmY250ID09IDApOworICAgICAgICArK19QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgICAgICAoKmRlYWxsb2MpKG9wKTsKKyAgICAgICAgLS1fUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKKyAgICB9CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9vYm1hbGxvYy5jIGIvT2JqZWN0cy9vYm1hbGxvYy5jCmluZGV4IGQxNTg2YzIuLmYzMjk3ZjIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvb2JtYWxsb2MuYworKysgYi9PYmplY3RzL29ibWFsbG9jLmMKQEAgLTEyLDcgKzEyLDcgQEAKICAgIHRoZSBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3Igb3BlcmF0ZXMgc2VsZWN0aXZlbHkgb24gY29udGFpbmVyIG9iamVjdHMuCiAKIAotICAgICAgICBPYmplY3Qtc3BlY2lmaWMgYWxsb2NhdG9ycworICAgIE9iamVjdC1zcGVjaWZpYyBhbGxvY2F0b3JzCiAgICAgX19fX18gICBfX19fX18gICBfX19fX18gICAgICAgX19fX19fX18KICAgIFsgaW50IF0gWyBkaWN0IF0gWyBsaXN0IF0gLi4uIFsgc3RyaW5nIF0gICAgICAgUHl0aG9uIGNvcmUgICAgICAgICB8CiArMyB8IDwtLS0tLSBPYmplY3Qtc3BlY2lmaWMgbWVtb3J5IC0tLS0tPiB8IDwtLSBOb24tb2JqZWN0IG1lbW9yeSAtLT4gfApAQCAtNTIsNyArNTIsNyBAQAogICogICAgaW4gUHJvYy4gMTk5NSBJbnQnbC4gV29ya3Nob3Agb24gTWVtb3J5IE1hbmFnZW1lbnQsIFNlcHRlbWJlciAxOTk1LgogICovCiAKLS8qICN1bmRlZiBXSVRIX01FTU9SWV9MSU1JVFMgKi8JCS8qIGRpc2FibGUgbWVtIGxpbWl0IGNoZWNrcyAgKi8KKy8qICN1bmRlZiBXSVRIX01FTU9SWV9MSU1JVFMgKi8gICAgICAgICAvKiBkaXNhYmxlIG1lbSBsaW1pdCBjaGVja3MgICovCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCkBAIC04MCwyMiArODAsMjIgQEAKICAqCiAgKiBGb3Igc21hbGwgcmVxdWVzdHMgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHRhYmxlOgogICoKLSAqIFJlcXVlc3QgaW4gYnl0ZXMJU2l6ZSBvZiBhbGxvY2F0ZWQgYmxvY2sgICAgICBTaXplIGNsYXNzIGlkeAorICogUmVxdWVzdCBpbiBieXRlcyAgICAgU2l6ZSBvZiBhbGxvY2F0ZWQgYmxvY2sgICAgICBTaXplIGNsYXNzIGlkeAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogICAgICAgIDEtOCAgICAgICAgICAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgIDAKLSAqCSAgOS0xNiAgICAgICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgMQotICoJIDE3LTI0ICAgICAgICAgICAgICAgICAgIDI0ICAgICAgICAgICAgICAgICAgICAgICAyCi0gKgkgMjUtMzIgICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgIDMKLSAqCSAzMy00MCAgICAgICAgICAgICAgICAgICA0MCAgICAgICAgICAgICAgICAgICAgICAgNAotICoJIDQxLTQ4ICAgICAgICAgICAgICAgICAgIDQ4ICAgICAgICAgICAgICAgICAgICAgICA1Ci0gKgkgNDktNTYgICAgICAgICAgICAgICAgICAgNTYgICAgICAgICAgICAgICAgICAgICAgIDYKLSAqCSA1Ny02NCAgICAgICAgICAgICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgICAgNwotICoJIDY1LTcyICAgICAgICAgICAgICAgICAgIDcyICAgICAgICAgICAgICAgICAgICAgICA4Ci0gKgkgIC4uLiAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAuLi4KLSAqCTI0MS0yNDggICAgICAgICAgICAgICAgIDI0OCAgICAgICAgICAgICAgICAgICAgICAzMAotICoJMjQ5LTI1NiAgICAgICAgICAgICAgICAgMjU2ICAgICAgICAgICAgICAgICAgICAgIDMxCisgKiAgICAgICAgOS0xNiAgICAgICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgMQorICogICAgICAgMTctMjQgICAgICAgICAgICAgICAgICAgMjQgICAgICAgICAgICAgICAgICAgICAgIDIKKyAqICAgICAgIDI1LTMyICAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAzCisgKiAgICAgICAzMy00MCAgICAgICAgICAgICAgICAgICA0MCAgICAgICAgICAgICAgICAgICAgICAgNAorICogICAgICAgNDEtNDggICAgICAgICAgICAgICAgICAgNDggICAgICAgICAgICAgICAgICAgICAgIDUKKyAqICAgICAgIDQ5LTU2ICAgICAgICAgICAgICAgICAgIDU2ICAgICAgICAgICAgICAgICAgICAgICA2CisgKiAgICAgICA1Ny02NCAgICAgICAgICAgICAgICAgICA2NCAgICAgICAgICAgICAgICAgICAgICAgNworICogICAgICAgNjUtNzIgICAgICAgICAgICAgICAgICAgNzIgICAgICAgICAgICAgICAgICAgICAgIDgKKyAqICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgLi4uCisgKiAgICAgIDI0MS0yNDggICAgICAgICAgICAgICAgIDI0OCAgICAgICAgICAgICAgICAgICAgICAzMAorICogICAgICAyNDktMjU2ICAgICAgICAgICAgICAgICAyNTYgICAgICAgICAgICAgICAgICAgICAgMzEKICAqCi0gKgkwLCAyNTcgYW5kIHVwOiByb3V0ZWQgdG8gdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yLgorICogICAgICAwLCAyNTcgYW5kIHVwOiByb3V0ZWQgdG8gdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yLgogICovCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtMTEyLDkgKzExMiw5IEBACiAgKgogICogWW91IHNob3VsZG4ndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgogICovCi0jZGVmaW5lIEFMSUdOTUVOVAkJOAkJLyogbXVzdCBiZSAyXk4gKi8KLSNkZWZpbmUgQUxJR05NRU5UX1NISUZUCQkzCi0jZGVmaW5lIEFMSUdOTUVOVF9NQVNLCQkoQUxJR05NRU5UIC0gMSkKKyNkZWZpbmUgQUxJR05NRU5UICAgICAgICAgICAgICAgOCAgICAgICAgICAgICAgIC8qIG11c3QgYmUgMl5OICovCisjZGVmaW5lIEFMSUdOTUVOVF9TSElGVCAgICAgICAgIDMKKyNkZWZpbmUgQUxJR05NRU5UX01BU0sgICAgICAgICAgKEFMSUdOTUVOVCAtIDEpCiAKIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHNpemUgY2xhc3MgSSwgYXMgYSB1aW50LiAqLwogI2RlZmluZSBJTkRFWDJTSVpFKEkpICgoKHVpbnQpKEkpICsgMSkgPDwgQUxJR05NRU5UX1NISUZUKQpAQCAtMTI1LDE0ICsxMjUsMTQgQEAKICAqIHRoaXMgdmFsdWUgYWNjb3JkaW5nIHRvIHlvdXIgYXBwbGljYXRpb24gYmVoYXZpb3VyIGFuZCBtZW1vcnkgbmVlZHMuCiAgKgogICogVGhlIGZvbGxvd2luZyBpbnZhcmlhbnRzIG11c3QgaG9sZDoKLSAqCTEpIEFMSUdOTUVOVCA8PSBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCA8PSAyNTYKLSAqCTIpIFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEIGlzIGV2ZW5seSBkaXZpc2libGUgYnkgQUxJR05NRU5UCisgKiAgICAgIDEpIEFMSUdOTUVOVCA8PSBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCA8PSAyNTYKKyAqICAgICAgMikgU01BTExfUkVRVUVTVF9USFJFU0hPTEQgaXMgZXZlbmx5IGRpdmlzaWJsZSBieSBBTElHTk1FTlQKICAqCiAgKiBBbHRob3VnaCBub3QgcmVxdWlyZWQsIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIHNwYWNlIGVmZmljaWVuY3ksCiAgKiBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEIGlzIHNldCB0byBhIHBvd2VyIG9mIDIuCiAgKi8KLSNkZWZpbmUgU01BTExfUkVRVUVTVF9USFJFU0hPTEQJMjU2Ci0jZGVmaW5lIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUwkoU01BTExfUkVRVUVTVF9USFJFU0hPTEQgLyBBTElHTk1FTlQpCisjZGVmaW5lIFNNQUxMX1JFUVVFU1RfVEhSRVNIT0xEIDI1NgorI2RlZmluZSBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgICAoU01BTExfUkVRVUVTVF9USFJFU0hPTEQgLyBBTElHTk1FTlQpCiAKIC8qCiAgKiBUaGUgc3lzdGVtJ3MgVk1NIHBhZ2Ugc2l6ZSBjYW4gYmUgb2J0YWluZWQgb24gbW9zdCB1bmljZXMgd2l0aCBhCkBAIC0xNDQsMTUgKzE0NCwxNSBAQAogICogdmlvbGF0aW9uIGZhdWx0LiAgNEsgaXMgYXBwYXJlbnRseSBPSyBmb3IgYWxsIHRoZSBwbGF0Zm9ybXMgdGhhdCBweXRob24KICAqIGN1cnJlbnRseSB0YXJnZXRzLgogICovCi0jZGVmaW5lIFNZU1RFTV9QQUdFX1NJWkUJKDQgKiAxMDI0KQotI2RlZmluZSBTWVNURU1fUEFHRV9TSVpFX01BU0sJKFNZU1RFTV9QQUdFX1NJWkUgLSAxKQorI2RlZmluZSBTWVNURU1fUEFHRV9TSVpFICAgICAgICAoNCAqIDEwMjQpCisjZGVmaW5lIFNZU1RFTV9QQUdFX1NJWkVfTUFTSyAgIChTWVNURU1fUEFHRV9TSVpFIC0gMSkKIAogLyoKICAqIE1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBtYW5hZ2VkIGJ5IHRoZSBhbGxvY2F0b3IgZm9yIHNtYWxsIHJlcXVlc3RzLgogICovCiAjaWZkZWYgV0lUSF9NRU1PUllfTElNSVRTCiAjaWZuZGVmIFNNQUxMX01FTU9SWV9MSU1JVAotI2RlZmluZSBTTUFMTF9NRU1PUllfTElNSVQJKDY0ICogMTAyNCAqIDEwMjQpCS8qIDY0IE1CIC0tIG1vcmU/ICovCisjZGVmaW5lIFNNQUxMX01FTU9SWV9MSU1JVCAgICAgICg2NCAqIDEwMjQgKiAxMDI0KSAgICAgIC8qIDY0IE1CIC0tIG1vcmU/ICovCiAjZW5kaWYKICNlbmRpZgogCkBAIC0xNjksMTggKzE2OSwxOCBAQAogICogc29tZSBhZGRyZXNzIHNwYWNlIHdhc3RhZ2UsIGJ1dCB0aGlzIGlzIHRoZSBtb3N0IHBvcnRhYmxlIHdheSB0byByZXF1ZXN0CiAgKiBtZW1vcnkgZnJvbSB0aGUgc3lzdGVtIGFjcm9zcyB2YXJpb3VzIHBsYXRmb3Jtcy4KICAqLwotI2RlZmluZSBBUkVOQV9TSVpFCQkoMjU2IDw8IDEwKQkvKiAyNTZLQiAqLworI2RlZmluZSBBUkVOQV9TSVpFICAgICAgICAgICAgICAoMjU2IDw8IDEwKSAgICAgLyogMjU2S0IgKi8KIAogI2lmZGVmIFdJVEhfTUVNT1JZX0xJTUlUUwotI2RlZmluZSBNQVhfQVJFTkFTCQkoU01BTExfTUVNT1JZX0xJTUlUIC8gQVJFTkFfU0laRSkKKyNkZWZpbmUgTUFYX0FSRU5BUyAgICAgICAgICAgICAgKFNNQUxMX01FTU9SWV9MSU1JVCAvIEFSRU5BX1NJWkUpCiAjZW5kaWYKIAogLyoKICAqIFNpemUgb2YgdGhlIHBvb2xzIHVzZWQgZm9yIHNtYWxsIGJsb2Nrcy4gU2hvdWxkIGJlIGEgcG93ZXIgb2YgMiwKICAqIGJldHdlZW4gMUsgYW5kIFNZU1RFTV9QQUdFX1NJWkUsIHRoYXQgaXM6IDFrLCAyaywgNGsuCiAgKi8KLSNkZWZpbmUgUE9PTF9TSVpFCQlTWVNURU1fUEFHRV9TSVpFCS8qIG11c3QgYmUgMl5OICovCi0jZGVmaW5lIFBPT0xfU0laRV9NQVNLCQlTWVNURU1fUEFHRV9TSVpFX01BU0sKKyNkZWZpbmUgUE9PTF9TSVpFICAgICAgICAgICAgICAgU1lTVEVNX1BBR0VfU0laRSAgICAgICAgLyogbXVzdCBiZSAyXk4gKi8KKyNkZWZpbmUgUE9PTF9TSVpFX01BU0sgICAgICAgICAgU1lTVEVNX1BBR0VfU0laRV9NQVNLCiAKIC8qCiAgKiAtLSBFbmQgb2YgdHVuYWJsZSBzZXR0aW5ncyBzZWN0aW9uIC0tCkBAIC0yMDYsOTIgKzIwNiw5MiBAQAogLyoKICAqIFB5dGhvbidzIHRocmVhZHMgYXJlIHNlcmlhbGl6ZWQsIHNvIG9iamVjdCBtYWxsb2MgbG9ja2luZyBpcyBkaXNhYmxlZC4KICAqLwotI2RlZmluZSBTSU1QTEVMT0NLX0RFQ0wobG9jaykJLyogc2ltcGxlIGxvY2sgZGVjbGFyYXRpb24JCSovCi0jZGVmaW5lIFNJTVBMRUxPQ0tfSU5JVChsb2NrKQkvKiBhbGxvY2F0ZSAoaWYgbmVlZGVkKSBhbmQgaW5pdGlhbGl6ZQkqLwotI2RlZmluZSBTSU1QTEVMT0NLX0ZJTkkobG9jaykJLyogZnJlZS9kZXN0cm95IGFuIGV4aXN0aW5nIGxvY2sgCSovCi0jZGVmaW5lIFNJTVBMRUxPQ0tfTE9DSyhsb2NrKQkvKiBhY3F1aXJlIHJlbGVhc2VkIGxvY2sgKi8KLSNkZWZpbmUgU0lNUExFTE9DS19VTkxPQ0sobG9jaykJLyogcmVsZWFzZSBhY3F1aXJlZCBsb2NrICovCisjZGVmaW5lIFNJTVBMRUxPQ0tfREVDTChsb2NrKSAgIC8qIHNpbXBsZSBsb2NrIGRlY2xhcmF0aW9uICAgICAgICAgICAgICAqLworI2RlZmluZSBTSU1QTEVMT0NLX0lOSVQobG9jaykgICAvKiBhbGxvY2F0ZSAoaWYgbmVlZGVkKSBhbmQgaW5pdGlhbGl6ZSAgKi8KKyNkZWZpbmUgU0lNUExFTE9DS19GSU5JKGxvY2spICAgLyogZnJlZS9kZXN0cm95IGFuIGV4aXN0aW5nIGxvY2sgICAgICAgICovCisjZGVmaW5lIFNJTVBMRUxPQ0tfTE9DSyhsb2NrKSAgIC8qIGFjcXVpcmUgcmVsZWFzZWQgbG9jayAqLworI2RlZmluZSBTSU1QTEVMT0NLX1VOTE9DSyhsb2NrKSAvKiByZWxlYXNlIGFjcXVpcmVkIGxvY2sgKi8KIAogLyoKICAqIEJhc2ljIHR5cGVzCiAgKiBJIGRvbid0IGNhcmUgaWYgdGhlc2UgYXJlIGRlZmluZWQgaW4gPHN5cy90eXBlcy5oPiBvciBlbHNld2hlcmUuIEF4aW9tLgogICovCiAjdW5kZWYgIHVjaGFyCi0jZGVmaW5lIHVjaGFyCXVuc2lnbmVkIGNoYXIJLyogYXNzdW1pbmcgPT0gOCBiaXRzICAqLworI2RlZmluZSB1Y2hhciAgIHVuc2lnbmVkIGNoYXIgICAvKiBhc3N1bWluZyA9PSA4IGJpdHMgICovCiAKICN1bmRlZiAgdWludAotI2RlZmluZSB1aW50CXVuc2lnbmVkIGludAkvKiBhc3N1bWluZyA+PSAxNiBiaXRzICovCisjZGVmaW5lIHVpbnQgICAgdW5zaWduZWQgaW50ICAgIC8qIGFzc3VtaW5nID49IDE2IGJpdHMgKi8KIAogI3VuZGVmICB1bG9uZwotI2RlZmluZSB1bG9uZwl1bnNpZ25lZCBsb25nCS8qIGFzc3VtaW5nID49IDMyIGJpdHMgKi8KKyNkZWZpbmUgdWxvbmcgICB1bnNpZ25lZCBsb25nICAgLyogYXNzdW1pbmcgPj0gMzIgYml0cyAqLwogCiAjdW5kZWYgdXB0cgotI2RlZmluZSB1cHRyCVB5X3VpbnRwdHJfdAorI2RlZmluZSB1cHRyICAgIFB5X3VpbnRwdHJfdAogCiAvKiBXaGVuIHlvdSBzYXkgbWVtb3J5LCBteSBtaW5kIHJlYXNvbnMgaW4gdGVybXMgb2YgKHBvaW50ZXJzIHRvKSBibG9ja3MgKi8KIHR5cGVkZWYgdWNoYXIgYmxvY2s7CiAKIC8qIFBvb2wgZm9yIHNtYWxsIGJsb2Nrcy4gKi8KIHN0cnVjdCBwb29sX2hlYWRlciB7Ci0JdW5pb24geyBibG9jayAqX3BhZGRpbmc7Ci0JCXVpbnQgY291bnQ7IH0gcmVmOwkvKiBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2NrcyAgICAqLwotCWJsb2NrICpmcmVlYmxvY2s7CQkvKiBwb29sJ3MgZnJlZSBsaXN0IGhlYWQgICAgICAgICAqLwotCXN0cnVjdCBwb29sX2hlYWRlciAqbmV4dHBvb2w7CS8qIG5leHQgcG9vbCBvZiB0aGlzIHNpemUgY2xhc3MgICovCi0Jc3RydWN0IHBvb2xfaGVhZGVyICpwcmV2cG9vbDsJLyogcHJldmlvdXMgcG9vbCAgICAgICAiIiAgICAgICAgKi8KLQl1aW50IGFyZW5haW5kZXg7CQkvKiBpbmRleCBpbnRvIGFyZW5hcyBvZiBiYXNlIGFkciAqLwotCXVpbnQgc3ppZHg7CQkJLyogYmxvY2sgc2l6ZSBjbGFzcyBpbmRleAkgKi8KLQl1aW50IG5leHRvZmZzZXQ7CQkvKiBieXRlcyB0byB2aXJnaW4gYmxvY2sJICovCi0JdWludCBtYXhuZXh0b2Zmc2V0OwkJLyogbGFyZ2VzdCB2YWxpZCBuZXh0b2Zmc2V0CSAqLworICAgIHVuaW9uIHsgYmxvY2sgKl9wYWRkaW5nOworICAgICAgICB1aW50IGNvdW50OyB9IHJlZjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBhbGxvY2F0ZWQgYmxvY2tzICAgICovCisgICAgYmxvY2sgKmZyZWVibG9jazsgICAgICAgICAgICAgICAgICAgLyogcG9vbCdzIGZyZWUgbGlzdCBoZWFkICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgcG9vbF9oZWFkZXIgKm5leHRwb29sOyAgICAgICAvKiBuZXh0IHBvb2wgb2YgdGhpcyBzaXplIGNsYXNzICAqLworICAgIHN0cnVjdCBwb29sX2hlYWRlciAqcHJldnBvb2w7ICAgICAgIC8qIHByZXZpb3VzIHBvb2wgICAgICAgIiIgICAgICAgICovCisgICAgdWludCBhcmVuYWluZGV4OyAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW50byBhcmVuYXMgb2YgYmFzZSBhZHIgKi8KKyAgICB1aW50IHN6aWR4OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBibG9jayBzaXplIGNsYXNzIGluZGV4ICAgICAgICAqLworICAgIHVpbnQgbmV4dG9mZnNldDsgICAgICAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIHZpcmdpbiBibG9jayAgICAgICAgICovCisgICAgdWludCBtYXhuZXh0b2Zmc2V0OyAgICAgICAgICAgICAgICAgLyogbGFyZ2VzdCB2YWxpZCBuZXh0b2Zmc2V0ICAgICAgKi8KIH07CiAKIHR5cGVkZWYgc3RydWN0IHBvb2xfaGVhZGVyICpwb29scDsKIAogLyogUmVjb3JkIGtlZXBpbmcgZm9yIGFyZW5hcy4gKi8KIHN0cnVjdCBhcmVuYV9vYmplY3QgewotCS8qIFRoZSBhZGRyZXNzIG9mIHRoZSBhcmVuYSwgYXMgcmV0dXJuZWQgYnkgbWFsbG9jLiAgTm90ZSB0aGF0IDAKLQkgKiB3aWxsIG5ldmVyIGJlIHJldHVybmVkIGJ5IGEgc3VjY2Vzc2Z1bCBtYWxsb2MsIGFuZCBpcyB1c2VkCi0JICogaGVyZSB0byBtYXJrIGFuIGFyZW5hX29iamVjdCB0aGF0IGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhbgotCSAqIGFsbG9jYXRlZCBhcmVuYS4KLQkgKi8KLQl1cHRyIGFkZHJlc3M7CisgICAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGFyZW5hLCBhcyByZXR1cm5lZCBieSBtYWxsb2MuICBOb3RlIHRoYXQgMAorICAgICAqIHdpbGwgbmV2ZXIgYmUgcmV0dXJuZWQgYnkgYSBzdWNjZXNzZnVsIG1hbGxvYywgYW5kIGlzIHVzZWQKKyAgICAgKiBoZXJlIHRvIG1hcmsgYW4gYXJlbmFfb2JqZWN0IHRoYXQgZG9lc24ndCBjb3JyZXNwb25kIHRvIGFuCisgICAgICogYWxsb2NhdGVkIGFyZW5hLgorICAgICAqLworICAgIHVwdHIgYWRkcmVzczsKIAotCS8qIFBvb2wtYWxpZ25lZCBwb2ludGVyIHRvIHRoZSBuZXh0IHBvb2wgdG8gYmUgY2FydmVkIG9mZi4gKi8KLQlibG9jayogcG9vbF9hZGRyZXNzOworICAgIC8qIFBvb2wtYWxpZ25lZCBwb2ludGVyIHRvIHRoZSBuZXh0IHBvb2wgdG8gYmUgY2FydmVkIG9mZi4gKi8KKyAgICBibG9jayogcG9vbF9hZGRyZXNzOwogCi0JLyogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgcG9vbHMgaW4gdGhlIGFyZW5hOiAgZnJlZSBwb29scyArIG5ldmVyLQotCSAqIGFsbG9jYXRlZCBwb29scy4KLQkgKi8KLQl1aW50IG5mcmVlcG9vbHM7CisgICAgLyogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgcG9vbHMgaW4gdGhlIGFyZW5hOiAgZnJlZSBwb29scyArIG5ldmVyLQorICAgICAqIGFsbG9jYXRlZCBwb29scy4KKyAgICAgKi8KKyAgICB1aW50IG5mcmVlcG9vbHM7CiAKLQkvKiBUaGUgdG90YWwgbnVtYmVyIG9mIHBvb2xzIGluIHRoZSBhcmVuYSwgd2hldGhlciBvciBub3QgYXZhaWxhYmxlLiAqLwotCXVpbnQgbnRvdGFscG9vbHM7CisgICAgLyogVGhlIHRvdGFsIG51bWJlciBvZiBwb29scyBpbiB0aGUgYXJlbmEsIHdoZXRoZXIgb3Igbm90IGF2YWlsYWJsZS4gKi8KKyAgICB1aW50IG50b3RhbHBvb2xzOwogCi0JLyogU2luZ2x5LWxpbmtlZCBsaXN0IG9mIGF2YWlsYWJsZSBwb29scy4gKi8KLQlzdHJ1Y3QgcG9vbF9oZWFkZXIqIGZyZWVwb29sczsKKyAgICAvKiBTaW5nbHktbGlua2VkIGxpc3Qgb2YgYXZhaWxhYmxlIHBvb2xzLiAqLworICAgIHN0cnVjdCBwb29sX2hlYWRlciogZnJlZXBvb2xzOwogCi0JLyogV2hlbmV2ZXIgdGhpcyBhcmVuYV9vYmplY3QgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0ZWQKLQkgKiBhcmVuYSwgdGhlIG5leHRhcmVuYSBtZW1iZXIgaXMgdXNlZCB0byBsaW5rIGFsbCB1bmFzc29jaWF0ZWQKLQkgKiBhcmVuYV9vYmplY3RzIGluIHRoZSBzaW5nbHktbGlua2VkIGB1bnVzZWRfYXJlbmFfb2JqZWN0c2AgbGlzdC4KLQkgKiBUaGUgcHJldmFyZW5hIG1lbWJlciBpcyB1bnVzZWQgaW4gdGhpcyBjYXNlLgotCSAqCi0JICogV2hlbiB0aGlzIGFyZW5hX29iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYWxsb2NhdGVkIGFyZW5hCi0JICogd2l0aCBhdCBsZWFzdCBvbmUgYXZhaWxhYmxlIHBvb2wsIGJvdGggbWVtYmVycyBhcmUgdXNlZCBpbiB0aGUKLQkgKiBkb3VibHktbGlua2VkIGB1c2FibGVfYXJlbmFzYCBsaXN0LCB3aGljaCBpcyBtYWludGFpbmVkIGluCi0JICogaW5jcmVhc2luZyBvcmRlciBvZiBgbmZyZWVwb29sc2AgdmFsdWVzLgotCSAqCi0JICogRWxzZSB0aGlzIGFyZW5hX29iamVjdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gYWxsb2NhdGVkIGFyZW5hCi0JICogYWxsIG9mIHdob3NlIHBvb2xzIGFyZSBpbiB1c2UuICBgbmV4dGFyZW5hYCBhbmQgYHByZXZhcmVuYWAKLQkgKiBhcmUgYm90aCBtZWFuaW5nbGVzcyBpbiB0aGlzIGNhc2UuCi0JICovCi0Jc3RydWN0IGFyZW5hX29iamVjdCogbmV4dGFyZW5hOwotCXN0cnVjdCBhcmVuYV9vYmplY3QqIHByZXZhcmVuYTsKKyAgICAvKiBXaGVuZXZlciB0aGlzIGFyZW5hX29iamVjdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIGFsbG9jYXRlZAorICAgICAqIGFyZW5hLCB0aGUgbmV4dGFyZW5hIG1lbWJlciBpcyB1c2VkIHRvIGxpbmsgYWxsIHVuYXNzb2NpYXRlZAorICAgICAqIGFyZW5hX29iamVjdHMgaW4gdGhlIHNpbmdseS1saW5rZWQgYHVudXNlZF9hcmVuYV9vYmplY3RzYCBsaXN0LgorICAgICAqIFRoZSBwcmV2YXJlbmEgbWVtYmVyIGlzIHVudXNlZCBpbiB0aGlzIGNhc2UuCisgICAgICoKKyAgICAgKiBXaGVuIHRoaXMgYXJlbmFfb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0ZWQgYXJlbmEKKyAgICAgKiB3aXRoIGF0IGxlYXN0IG9uZSBhdmFpbGFibGUgcG9vbCwgYm90aCBtZW1iZXJzIGFyZSB1c2VkIGluIHRoZQorICAgICAqIGRvdWJseS1saW5rZWQgYHVzYWJsZV9hcmVuYXNgIGxpc3QsIHdoaWNoIGlzIG1haW50YWluZWQgaW4KKyAgICAgKiBpbmNyZWFzaW5nIG9yZGVyIG9mIGBuZnJlZXBvb2xzYCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBFbHNlIHRoaXMgYXJlbmFfb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbGxvY2F0ZWQgYXJlbmEKKyAgICAgKiBhbGwgb2Ygd2hvc2UgcG9vbHMgYXJlIGluIHVzZS4gIGBuZXh0YXJlbmFgIGFuZCBgcHJldmFyZW5hYAorICAgICAqIGFyZSBib3RoIG1lYW5pbmdsZXNzIGluIHRoaXMgY2FzZS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBuZXh0YXJlbmE7CisgICAgc3RydWN0IGFyZW5hX29iamVjdCogcHJldmFyZW5hOwogfTsKIAogI3VuZGVmICBST1VORFVQCi0jZGVmaW5lIFJPVU5EVVAoeCkJCSgoKHgpICsgQUxJR05NRU5UX01BU0spICYgfkFMSUdOTUVOVF9NQVNLKQotI2RlZmluZSBQT09MX09WRVJIRUFECQlST1VORFVQKHNpemVvZihzdHJ1Y3QgcG9vbF9oZWFkZXIpKQorI2RlZmluZSBST1VORFVQKHgpICAgICAgICAgICAgICAoKCh4KSArIEFMSUdOTUVOVF9NQVNLKSAmIH5BTElHTk1FTlRfTUFTSykKKyNkZWZpbmUgUE9PTF9PVkVSSEVBRCAgICAgICAgICAgUk9VTkRVUChzaXplb2Yoc3RydWN0IHBvb2xfaGVhZGVyKSkKIAotI2RlZmluZSBEVU1NWV9TSVpFX0lEWAkJMHhmZmZmCS8qIHNpemUgY2xhc3Mgb2YgbmV3bHkgY2FjaGVkIHBvb2xzICovCisjZGVmaW5lIERVTU1ZX1NJWkVfSURYICAgICAgICAgIDB4ZmZmZiAgLyogc2l6ZSBjbGFzcyBvZiBuZXdseSBjYWNoZWQgcG9vbHMgKi8KIAogLyogUm91bmQgcG9pbnRlciBQIGRvd24gdG8gdGhlIGNsb3Nlc3QgcG9vbC1hbGlnbmVkIGFkZHJlc3MgPD0gUCwgYXMgYSBwb29scCAqLwogI2RlZmluZSBQT09MX0FERFIoUCkgKChwb29scCkoKHVwdHIpKFApICYgfih1cHRyKVBPT0xfU0laRV9NQVNLKSkKQEAgLTMwNSwxMCArMzA1LDEwIEBACiAgKiBUaGlzIG1hbGxvYyBsb2NrCiAgKi8KIFNJTVBMRUxPQ0tfREVDTChfbWFsbG9jX2xvY2spCi0jZGVmaW5lIExPQ0soKQkJU0lNUExFTE9DS19MT0NLKF9tYWxsb2NfbG9jaykKLSNkZWZpbmUgVU5MT0NLKCkJU0lNUExFTE9DS19VTkxPQ0soX21hbGxvY19sb2NrKQotI2RlZmluZSBMT0NLX0lOSVQoKQlTSU1QTEVMT0NLX0lOSVQoX21hbGxvY19sb2NrKQotI2RlZmluZSBMT0NLX0ZJTkkoKQlTSU1QTEVMT0NLX0ZJTkkoX21hbGxvY19sb2NrKQorI2RlZmluZSBMT0NLKCkgICAgICAgICAgU0lNUExFTE9DS19MT0NLKF9tYWxsb2NfbG9jaykKKyNkZWZpbmUgVU5MT0NLKCkgICAgICAgIFNJTVBMRUxPQ0tfVU5MT0NLKF9tYWxsb2NfbG9jaykKKyNkZWZpbmUgTE9DS19JTklUKCkgICAgIFNJTVBMRUxPQ0tfSU5JVChfbWFsbG9jX2xvY2spCisjZGVmaW5lIExPQ0tfRklOSSgpICAgICBTSU1QTEVMT0NLX0ZJTkkoX21hbGxvY19sb2NrKQogCiAvKgogICogUG9vbCB0YWJsZSAtLSBoZWFkZWQsIGNpcmN1bGFyLCBkb3VibHktbGlua2VkIGxpc3RzIG9mIHBhcnRpYWxseSB1c2VkIHBvb2xzLgpAQCAtMzg4LDkgKzM4OCw5IEBACiBjb21wZW5zYXRpbmcgZm9yIHRoYXQgYSBwb29sX2hlYWRlcidzIG5leHRwb29sIGFuZCBwcmV2cG9vbCBtZW1iZXJzCiBpbW1lZGlhdGVseSBmb2xsb3cgYSBwb29sX2hlYWRlcidzIGZpcnN0IHR3byBtZW1iZXJzOgogCi0JdW5pb24geyBibG9jayAqX3BhZGRpbmc7Ci0JCXVpbnQgY291bnQ7IH0gcmVmOwotCWJsb2NrICpmcmVlYmxvY2s7CisgICAgdW5pb24geyBibG9jayAqX3BhZGRpbmc7CisgICAgICAgIHVpbnQgY291bnQ7IH0gcmVmOworICAgIGJsb2NrICpmcmVlYmxvY2s7CiAKIGVhY2ggb2Ygd2hpY2ggY29uc3VtZSBzaXplb2YoYmxvY2sgKikgYnl0ZXMuICBTbyB3aGF0IHVzZWRwb29sc1tpK2ldIHJlYWxseQogY29udGFpbnMgaXMgYSBmdWRnZWQtdXAgcG9pbnRlciBwIHN1Y2ggdGhhdCAqaWYqIEMgYmVsaWV2ZXMgaXQncyBhIHBvb2xwCkBAIC00MDYsMjUgKzQwNiwyNSBAQAogdGhlIHByZXZwb29sIG1lbWJlci4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAotI2RlZmluZSBQVEEoeCkJKChwb29scCApKCh1Y2hhciAqKSYodXNlZHBvb2xzWzIqKHgpXSkgLSAyKnNpemVvZihibG9jayAqKSkpCi0jZGVmaW5lIFBUKHgpCVBUQSh4KSwgUFRBKHgpCisjZGVmaW5lIFBUQSh4KSAgKChwb29scCApKCh1Y2hhciAqKSYodXNlZHBvb2xzWzIqKHgpXSkgLSAyKnNpemVvZihibG9jayAqKSkpCisjZGVmaW5lIFBUKHgpICAgUFRBKHgpLCBQVEEoeCkKIAogc3RhdGljIHBvb2xwIHVzZWRwb29sc1syICogKChOQl9TTUFMTF9TSVpFX0NMQVNTRVMgKyA3KSAvIDgpICogOF0gPSB7Ci0JUFQoMCksIFBUKDEpLCBQVCgyKSwgUFQoMyksIFBUKDQpLCBQVCg1KSwgUFQoNiksIFBUKDcpCisgICAgUFQoMCksIFBUKDEpLCBQVCgyKSwgUFQoMyksIFBUKDQpLCBQVCg1KSwgUFQoNiksIFBUKDcpCiAjaWYgTkJfU01BTExfU0laRV9DTEFTU0VTID4gOAotCSwgUFQoOCksIFBUKDkpLCBQVCgxMCksIFBUKDExKSwgUFQoMTIpLCBQVCgxMyksIFBUKDE0KSwgUFQoMTUpCisgICAgLCBQVCg4KSwgUFQoOSksIFBUKDEwKSwgUFQoMTEpLCBQVCgxMiksIFBUKDEzKSwgUFQoMTQpLCBQVCgxNSkKICNpZiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiAxNgotCSwgUFQoMTYpLCBQVCgxNyksIFBUKDE4KSwgUFQoMTkpLCBQVCgyMCksIFBUKDIxKSwgUFQoMjIpLCBQVCgyMykKKyAgICAsIFBUKDE2KSwgUFQoMTcpLCBQVCgxOCksIFBUKDE5KSwgUFQoMjApLCBQVCgyMSksIFBUKDIyKSwgUFQoMjMpCiAjaWYgTkJfU01BTExfU0laRV9DTEFTU0VTID4gMjQKLQksIFBUKDI0KSwgUFQoMjUpLCBQVCgyNiksIFBUKDI3KSwgUFQoMjgpLCBQVCgyOSksIFBUKDMwKSwgUFQoMzEpCisgICAgLCBQVCgyNCksIFBUKDI1KSwgUFQoMjYpLCBQVCgyNyksIFBUKDI4KSwgUFQoMjkpLCBQVCgzMCksIFBUKDMxKQogI2lmIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDMyCi0JLCBQVCgzMiksIFBUKDMzKSwgUFQoMzQpLCBQVCgzNSksIFBUKDM2KSwgUFQoMzcpLCBQVCgzOCksIFBUKDM5KQorICAgICwgUFQoMzIpLCBQVCgzMyksIFBUKDM0KSwgUFQoMzUpLCBQVCgzNiksIFBUKDM3KSwgUFQoMzgpLCBQVCgzOSkKICNpZiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiA0MAotCSwgUFQoNDApLCBQVCg0MSksIFBUKDQyKSwgUFQoNDMpLCBQVCg0NCksIFBUKDQ1KSwgUFQoNDYpLCBQVCg0NykKKyAgICAsIFBUKDQwKSwgUFQoNDEpLCBQVCg0MiksIFBUKDQzKSwgUFQoNDQpLCBQVCg0NSksIFBUKDQ2KSwgUFQoNDcpCiAjaWYgTkJfU01BTExfU0laRV9DTEFTU0VTID4gNDgKLQksIFBUKDQ4KSwgUFQoNDkpLCBQVCg1MCksIFBUKDUxKSwgUFQoNTIpLCBQVCg1MyksIFBUKDU0KSwgUFQoNTUpCisgICAgLCBQVCg0OCksIFBUKDQ5KSwgUFQoNTApLCBQVCg1MSksIFBUKDUyKSwgUFQoNTMpLCBQVCg1NCksIFBUKDU1KQogI2lmIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDU2Ci0JLCBQVCg1NiksIFBUKDU3KSwgUFQoNTgpLCBQVCg1OSksIFBUKDYwKSwgUFQoNjEpLCBQVCg2MiksIFBUKDYzKQorICAgICwgUFQoNTYpLCBQVCg1NyksIFBUKDU4KSwgUFQoNTkpLCBQVCg2MCksIFBUKDYxKSwgUFQoNjIpLCBQVCg2MykKICNlbmRpZiAvKiBOQl9TTUFMTF9TSVpFX0NMQVNTRVMgPiA1NiAqLwogI2VuZGlmIC8qIE5CX1NNQUxMX1NJWkVfQ0xBU1NFUyA+IDQ4ICovCiAjZW5kaWYgLyogTkJfU01BTExfU0laRV9DTEFTU0VTID4gNDAgKi8KQEAgLTUwOCw5MCArNTA4LDkwIEBACiBzdGF0aWMgc3RydWN0IGFyZW5hX29iamVjdCoKIG5ld19hcmVuYSh2b2lkKQogewotCXN0cnVjdCBhcmVuYV9vYmplY3QqIGFyZW5hb2JqOwotCXVpbnQgZXhjZXNzOwkvKiBudW1iZXIgb2YgYnl0ZXMgYWJvdmUgcG9vbCBhbGlnbm1lbnQgKi8KKyAgICBzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBhcmVuYW9iajsKKyAgICB1aW50IGV4Y2VzczsgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBhYm92ZSBwb29sIGFsaWdubWVudCAqLwogCiAjaWZkZWYgUFlNQUxMT0NfREVCVUcKLQlpZiAoUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpKQotCQlfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cygpOworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIikpCisgICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKCk7CiAjZW5kaWYKLQlpZiAodW51c2VkX2FyZW5hX29iamVjdHMgPT0gTlVMTCkgewotCQl1aW50IGk7Ci0JCXVpbnQgbnVtYXJlbmFzOwotCQlzaXplX3QgbmJ5dGVzOworICAgIGlmICh1bnVzZWRfYXJlbmFfb2JqZWN0cyA9PSBOVUxMKSB7CisgICAgICAgIHVpbnQgaTsKKyAgICAgICAgdWludCBudW1hcmVuYXM7CisgICAgICAgIHNpemVfdCBuYnl0ZXM7CiAKLQkJLyogRG91YmxlIHRoZSBudW1iZXIgb2YgYXJlbmEgb2JqZWN0cyBvbiBlYWNoIGFsbG9jYXRpb24uCi0JCSAqIE5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvciBgbnVtYXJlbmFzYCB0byBvdmVyZmxvdy4KLQkJICovCi0JCW51bWFyZW5hcyA9IG1heGFyZW5hcyA/IG1heGFyZW5hcyA8PCAxIDogSU5JVElBTF9BUkVOQV9PQkpFQ1RTOwotCQlpZiAobnVtYXJlbmFzIDw9IG1heGFyZW5hcykKLQkJCXJldHVybiBOVUxMOwkvKiBvdmVyZmxvdyAqLworICAgICAgICAvKiBEb3VibGUgdGhlIG51bWJlciBvZiBhcmVuYSBvYmplY3RzIG9uIGVhY2ggYWxsb2NhdGlvbi4KKyAgICAgICAgICogTm90ZSB0aGF0IGl0J3MgcG9zc2libGUgZm9yIGBudW1hcmVuYXNgIHRvIG92ZXJmbG93LgorICAgICAgICAgKi8KKyAgICAgICAgbnVtYXJlbmFzID0gbWF4YXJlbmFzID8gbWF4YXJlbmFzIDw8IDEgOiBJTklUSUFMX0FSRU5BX09CSkVDVFM7CisgICAgICAgIGlmIChudW1hcmVuYXMgPD0gbWF4YXJlbmFzKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIG92ZXJmbG93ICovCiAjaWYgU0laRU9GX1NJWkVfVCA8PSBTSVpFT0ZfSU5UCi0JCWlmIChudW1hcmVuYXMgPiBQWV9TSVpFX01BWCAvIHNpemVvZigqYXJlbmFzKSkKLQkJCXJldHVybiBOVUxMOwkvKiBvdmVyZmxvdyAqLworICAgICAgICBpZiAobnVtYXJlbmFzID4gUFlfU0laRV9NQVggLyBzaXplb2YoKmFyZW5hcykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogb3ZlcmZsb3cgKi8KICNlbmRpZgotCQluYnl0ZXMgPSBudW1hcmVuYXMgKiBzaXplb2YoKmFyZW5hcyk7Ci0JCWFyZW5hb2JqID0gKHN0cnVjdCBhcmVuYV9vYmplY3QgKilyZWFsbG9jKGFyZW5hcywgbmJ5dGVzKTsKLQkJaWYgKGFyZW5hb2JqID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYXJlbmFzID0gYXJlbmFvYmo7CisgICAgICAgIG5ieXRlcyA9IG51bWFyZW5hcyAqIHNpemVvZigqYXJlbmFzKTsKKyAgICAgICAgYXJlbmFvYmogPSAoc3RydWN0IGFyZW5hX29iamVjdCAqKXJlYWxsb2MoYXJlbmFzLCBuYnl0ZXMpOworICAgICAgICBpZiAoYXJlbmFvYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBhcmVuYXMgPSBhcmVuYW9iajsKIAotCQkvKiBXZSBtaWdodCBuZWVkIHRvIGZpeCBwb2ludGVycyB0aGF0IHdlcmUgY29waWVkLiAgSG93ZXZlciwKLQkJICogbmV3X2FyZW5hIG9ubHkgZ2V0cyBjYWxsZWQgd2hlbiBhbGwgdGhlIHBhZ2VzIGluIHRoZQotCQkgKiBwcmV2aW91cyBhcmVuYXMgYXJlIGZ1bGwuICBUaHVzLCB0aGVyZSBhcmUgKm5vKiBwb2ludGVycwotCQkgKiBpbnRvIHRoZSBvbGQgYXJyYXkuIFRodXMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQKLQkJICogaW52YWxpZCBwb2ludGVycy4gIEp1c3QgdG8gYmUgc3VyZSwgc29tZSBhc3NlcnRzOgotCQkgKi8KLQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMgPT0gTlVMTCk7Ci0JCWFzc2VydCh1bnVzZWRfYXJlbmFfb2JqZWN0cyA9PSBOVUxMKTsKKyAgICAgICAgLyogV2UgbWlnaHQgbmVlZCB0byBmaXggcG9pbnRlcnMgdGhhdCB3ZXJlIGNvcGllZC4gIEhvd2V2ZXIsCisgICAgICAgICAqIG5ld19hcmVuYSBvbmx5IGdldHMgY2FsbGVkIHdoZW4gYWxsIHRoZSBwYWdlcyBpbiB0aGUKKyAgICAgICAgICogcHJldmlvdXMgYXJlbmFzIGFyZSBmdWxsLiAgVGh1cywgdGhlcmUgYXJlICpubyogcG9pbnRlcnMKKyAgICAgICAgICogaW50byB0aGUgb2xkIGFycmF5LiBUaHVzLCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0CisgICAgICAgICAqIGludmFsaWQgcG9pbnRlcnMuICBKdXN0IHRvIGJlIHN1cmUsIHNvbWUgYXNzZXJ0czoKKyAgICAgICAgICovCisgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzID09IE5VTEwpOworICAgICAgICBhc3NlcnQodW51c2VkX2FyZW5hX29iamVjdHMgPT0gTlVMTCk7CiAKLQkJLyogUHV0IHRoZSBuZXcgYXJlbmFzIG9uIHRoZSB1bnVzZWRfYXJlbmFfb2JqZWN0cyBsaXN0LiAqLwotCQlmb3IgKGkgPSBtYXhhcmVuYXM7IGkgPCBudW1hcmVuYXM7ICsraSkgewotCQkJYXJlbmFzW2ldLmFkZHJlc3MgPSAwOwkvKiBtYXJrIGFzIHVuYXNzb2NpYXRlZCAqLwotCQkJYXJlbmFzW2ldLm5leHRhcmVuYSA9IGkgPCBudW1hcmVuYXMgLSAxID8KLQkJCQkJICAgICAgICZhcmVuYXNbaSsxXSA6IE5VTEw7Ci0JCX0KKyAgICAgICAgLyogUHV0IHRoZSBuZXcgYXJlbmFzIG9uIHRoZSB1bnVzZWRfYXJlbmFfb2JqZWN0cyBsaXN0LiAqLworICAgICAgICBmb3IgKGkgPSBtYXhhcmVuYXM7IGkgPCBudW1hcmVuYXM7ICsraSkgeworICAgICAgICAgICAgYXJlbmFzW2ldLmFkZHJlc3MgPSAwOyAgICAgICAgICAgICAgLyogbWFyayBhcyB1bmFzc29jaWF0ZWQgKi8KKyAgICAgICAgICAgIGFyZW5hc1tpXS5uZXh0YXJlbmEgPSBpIDwgbnVtYXJlbmFzIC0gMSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmVuYXNbaSsxXSA6IE5VTEw7CisgICAgICAgIH0KIAotCQkvKiBVcGRhdGUgZ2xvYmFscy4gKi8KLQkJdW51c2VkX2FyZW5hX29iamVjdHMgPSAmYXJlbmFzW21heGFyZW5hc107Ci0JCW1heGFyZW5hcyA9IG51bWFyZW5hczsKLQl9CisgICAgICAgIC8qIFVwZGF0ZSBnbG9iYWxzLiAqLworICAgICAgICB1bnVzZWRfYXJlbmFfb2JqZWN0cyA9ICZhcmVuYXNbbWF4YXJlbmFzXTsKKyAgICAgICAgbWF4YXJlbmFzID0gbnVtYXJlbmFzOworICAgIH0KIAotCS8qIFRha2UgdGhlIG5leHQgYXZhaWxhYmxlIGFyZW5hIG9iamVjdCBvZmYgdGhlIGhlYWQgb2YgdGhlIGxpc3QuICovCi0JYXNzZXJ0KHVudXNlZF9hcmVuYV9vYmplY3RzICE9IE5VTEwpOwotCWFyZW5hb2JqID0gdW51c2VkX2FyZW5hX29iamVjdHM7Ci0JdW51c2VkX2FyZW5hX29iamVjdHMgPSBhcmVuYW9iai0+bmV4dGFyZW5hOwotCWFzc2VydChhcmVuYW9iai0+YWRkcmVzcyA9PSAwKTsKLQlhcmVuYW9iai0+YWRkcmVzcyA9ICh1cHRyKW1hbGxvYyhBUkVOQV9TSVpFKTsKLQlpZiAoYXJlbmFvYmotPmFkZHJlc3MgPT0gMCkgewotCQkvKiBUaGUgYWxsb2NhdGlvbiBmYWlsZWQ6IHJldHVybiBOVUxMIGFmdGVyIHB1dHRpbmcgdGhlCi0JCSAqIGFyZW5hb2JqIGJhY2suCi0JCSAqLwotCQlhcmVuYW9iai0+bmV4dGFyZW5hID0gdW51c2VkX2FyZW5hX29iamVjdHM7Ci0JCXVudXNlZF9hcmVuYV9vYmplY3RzID0gYXJlbmFvYmo7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBUYWtlIHRoZSBuZXh0IGF2YWlsYWJsZSBhcmVuYSBvYmplY3Qgb2ZmIHRoZSBoZWFkIG9mIHRoZSBsaXN0LiAqLworICAgIGFzc2VydCh1bnVzZWRfYXJlbmFfb2JqZWN0cyAhPSBOVUxMKTsKKyAgICBhcmVuYW9iaiA9IHVudXNlZF9hcmVuYV9vYmplY3RzOworICAgIHVudXNlZF9hcmVuYV9vYmplY3RzID0gYXJlbmFvYmotPm5leHRhcmVuYTsKKyAgICBhc3NlcnQoYXJlbmFvYmotPmFkZHJlc3MgPT0gMCk7CisgICAgYXJlbmFvYmotPmFkZHJlc3MgPSAodXB0ciltYWxsb2MoQVJFTkFfU0laRSk7CisgICAgaWYgKGFyZW5hb2JqLT5hZGRyZXNzID09IDApIHsKKyAgICAgICAgLyogVGhlIGFsbG9jYXRpb24gZmFpbGVkOiByZXR1cm4gTlVMTCBhZnRlciBwdXR0aW5nIHRoZQorICAgICAgICAgKiBhcmVuYW9iaiBiYWNrLgorICAgICAgICAgKi8KKyAgICAgICAgYXJlbmFvYmotPm5leHRhcmVuYSA9IHVudXNlZF9hcmVuYV9vYmplY3RzOworICAgICAgICB1bnVzZWRfYXJlbmFfb2JqZWN0cyA9IGFyZW5hb2JqOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkrK25hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZDsKKyAgICArK25hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZDsKICNpZmRlZiBQWU1BTExPQ19ERUJVRwotCSsrbnRpbWVzX2FyZW5hX2FsbG9jYXRlZDsKLQlpZiAobmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkID4gbmFyZW5hc19oaWdod2F0ZXIpCi0JCW5hcmVuYXNfaGlnaHdhdGVyID0gbmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkOworICAgICsrbnRpbWVzX2FyZW5hX2FsbG9jYXRlZDsKKyAgICBpZiAobmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkID4gbmFyZW5hc19oaWdod2F0ZXIpCisgICAgICAgIG5hcmVuYXNfaGlnaHdhdGVyID0gbmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkOwogI2VuZGlmCi0JYXJlbmFvYmotPmZyZWVwb29scyA9IE5VTEw7Ci0JLyogcG9vbF9hZGRyZXNzIDwtIGZpcnN0IHBvb2wtYWxpZ25lZCBhZGRyZXNzIGluIHRoZSBhcmVuYQotCSAgIG5mcmVlcG9vbHMgPC0gbnVtYmVyIG9mIHdob2xlIHBvb2xzIHRoYXQgZml0IGFmdGVyIGFsaWdubWVudCAqLwotCWFyZW5hb2JqLT5wb29sX2FkZHJlc3MgPSAoYmxvY2sqKWFyZW5hb2JqLT5hZGRyZXNzOwotCWFyZW5hb2JqLT5uZnJlZXBvb2xzID0gQVJFTkFfU0laRSAvIFBPT0xfU0laRTsKLQlhc3NlcnQoUE9PTF9TSVpFICogYXJlbmFvYmotPm5mcmVlcG9vbHMgPT0gQVJFTkFfU0laRSk7Ci0JZXhjZXNzID0gKHVpbnQpKGFyZW5hb2JqLT5hZGRyZXNzICYgUE9PTF9TSVpFX01BU0spOwotCWlmIChleGNlc3MgIT0gMCkgewotCQktLWFyZW5hb2JqLT5uZnJlZXBvb2xzOwotCQlhcmVuYW9iai0+cG9vbF9hZGRyZXNzICs9IFBPT0xfU0laRSAtIGV4Y2VzczsKLQl9Ci0JYXJlbmFvYmotPm50b3RhbHBvb2xzID0gYXJlbmFvYmotPm5mcmVlcG9vbHM7CisgICAgYXJlbmFvYmotPmZyZWVwb29scyA9IE5VTEw7CisgICAgLyogcG9vbF9hZGRyZXNzIDwtIGZpcnN0IHBvb2wtYWxpZ25lZCBhZGRyZXNzIGluIHRoZSBhcmVuYQorICAgICAgIG5mcmVlcG9vbHMgPC0gbnVtYmVyIG9mIHdob2xlIHBvb2xzIHRoYXQgZml0IGFmdGVyIGFsaWdubWVudCAqLworICAgIGFyZW5hb2JqLT5wb29sX2FkZHJlc3MgPSAoYmxvY2sqKWFyZW5hb2JqLT5hZGRyZXNzOworICAgIGFyZW5hb2JqLT5uZnJlZXBvb2xzID0gQVJFTkFfU0laRSAvIFBPT0xfU0laRTsKKyAgICBhc3NlcnQoUE9PTF9TSVpFICogYXJlbmFvYmotPm5mcmVlcG9vbHMgPT0gQVJFTkFfU0laRSk7CisgICAgZXhjZXNzID0gKHVpbnQpKGFyZW5hb2JqLT5hZGRyZXNzICYgUE9PTF9TSVpFX01BU0spOworICAgIGlmIChleGNlc3MgIT0gMCkgeworICAgICAgICAtLWFyZW5hb2JqLT5uZnJlZXBvb2xzOworICAgICAgICBhcmVuYW9iai0+cG9vbF9hZGRyZXNzICs9IFBPT0xfU0laRSAtIGV4Y2VzczsKKyAgICB9CisgICAgYXJlbmFvYmotPm50b3RhbHBvb2xzID0gYXJlbmFvYmotPm5mcmVlcG9vbHM7CiAKLQlyZXR1cm4gYXJlbmFvYmo7CisgICAgcmV0dXJuIGFyZW5hb2JqOwogfQogCiAvKgpAQCAtNjA3LDExICs2MDcsMTEgQEAKIFRyaWNreTogIExldCBCIGJlIHRoZSBhcmVuYSBiYXNlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb29sLCBCID0KIGFyZW5hc1soUE9PTCktPmFyZW5haW5kZXhdLmFkZHJlc3MuICBUaGVuIFAgYmVsb25ncyB0byB0aGUgYXJlbmEgaWYgYW5kIG9ubHkgaWYKIAotCUIgPD0gUCA8IEIgKyBBUkVOQV9TSVpFCisgICAgQiA8PSBQIDwgQiArIEFSRU5BX1NJWkUKIAogU3VidHJhY3RpbmcgQiB0aHJvdWdob3V0LCB0aGlzIGlzIHRydWUgaWZmCiAKLQkwIDw9IFAtQiA8IEFSRU5BX1NJWkUKKyAgICAwIDw9IFAtQiA8IEFSRU5BX1NJWkUKIAogQnkgdXNpbmcgdW5zaWduZWQgYXJpdGhtZXRpYywgdGhlICIwIDw9IiBoYWxmIG9mIHRoZSB0ZXN0IGNhbiBiZSBza2lwcGVkLgogCkBAIC02NDUsNyArNjQ1LDcgQEAKIGFyZW5hX29iamVjdCAob25lIG5vdCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIGFuIGFsbG9jYXRlZCBhcmVuYSksCiBBTy5hZGRyZXNzIGlzIDAsIGFuZCB0aGUgc2Vjb25kIHRlc3QgaW4gdGhlIG1hY3JvIHJlZHVjZXMgdG86CiAKLQlQIDwgQVJFTkFfU0laRQorICAgIFAgPCBBUkVOQV9TSVpFCiAKIElmIFAgPj0gQVJFTkFfU0laRSAoZXh0cmVtZWx5IGxpa2VseSksIHRoZSBtYWNybyBhZ2FpbiBjb3JyZWN0bHkgY29uY2x1ZGVzCiB0aGF0IFAgaXMgbm90IGNvbnRyb2xsZWQgYnkgb2JtYWxsb2MuICBIb3dldmVyLCBpZiBQIDwgQVJFTkFfU0laRSwgdGhpcyBwYXJ0CkBAIC02NjgsMTAgKzY2OCwxMCBAQAogb2JtYWxsb2MgY29udHJvbHMuICBTaW5jZSB0aGlzIHRlc3QgaXMgbmVlZGVkIGF0IGV2ZXJ5IGVudHJ5IHBvaW50LCBpdCdzCiBleHRyZW1lbHkgZGVzaXJhYmxlIHRoYXQgaXQgYmUgdGhpcyBmYXN0LgogKi8KLSNkZWZpbmUgUHlfQUREUkVTU19JTl9SQU5HRShQLCBQT09MKQkJCVwKLQkoKFBPT0wpLT5hcmVuYWluZGV4IDwgbWF4YXJlbmFzICYmCQlcCi0JICh1cHRyKShQKSAtIGFyZW5hc1soUE9PTCktPmFyZW5haW5kZXhdLmFkZHJlc3MgPCAodXB0cilBUkVOQV9TSVpFICYmIFwKLQkgYXJlbmFzWyhQT09MKS0+YXJlbmFpbmRleF0uYWRkcmVzcyAhPSAwKQorI2RlZmluZSBQeV9BRERSRVNTX0lOX1JBTkdFKFAsIFBPT0wpICAgICAgICAgICAgICAgICAgICBcCisgICAgKChQT09MKS0+YXJlbmFpbmRleCA8IG1heGFyZW5hcyAmJiAgICAgICAgICAgICAgICAgIFwKKyAgICAgKHVwdHIpKFApIC0gYXJlbmFzWyhQT09MKS0+YXJlbmFpbmRleF0uYWRkcmVzcyA8ICh1cHRyKUFSRU5BX1NJWkUgJiYgXAorICAgICBhcmVuYXNbKFBPT0wpLT5hcmVuYWluZGV4XS5hZGRyZXNzICE9IDApCiAKIAogLyogVGhpcyBpcyBvbmx5IHVzZWZ1bCB3aGVuIHJ1bm5pbmcgbWVtb3J5IGRlYnVnZ2VycyBzdWNoIGFzCkBAIC02OTQsNyArNjk0LDcgQEAKICN1bmRlZiBQeV9BRERSRVNTX0lOX1JBTkdFCiAKICNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoKF9fR05VQ19fID09IDMpICYmIChfX0dOVUNfTUlOT1JfXyA+PSAxKSB8fCBcCi0JCQkgIChfX0dOVUNfXyA+PSA0KSkKKyAgICAgICAgICAgICAgKF9fR05VQ19fID49IDQpKQogI2RlZmluZSBQeV9OT19JTkxJTkUgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKICNlbHNlCiAjZGVmaW5lIFB5X05PX0lOTElORQpAQCAtNzIzLDE5NCArNzIzLDE5NCBAQAogdm9pZCAqCiBQeU9iamVjdF9NYWxsb2Moc2l6ZV90IG5ieXRlcykKIHsKLQlibG9jayAqYnA7Ci0JcG9vbHAgcG9vbDsKLQlwb29scCBuZXh0OwotCXVpbnQgc2l6ZTsKKyAgICBibG9jayAqYnA7CisgICAgcG9vbHAgcG9vbDsKKyAgICBwb29scCBuZXh0OworICAgIHVpbnQgc2l6ZTsKIAotCS8qCi0JICogTGltaXQgb3Vyc2VsdmVzIHRvIFBZX1NTSVpFX1RfTUFYIGJ5dGVzIHRvIHByZXZlbnQgc2VjdXJpdHkgaG9sZXMuCi0JICogTW9zdCBweXRob24gaW50ZXJuYWxzIGJsaW5kbHkgdXNlIGEgc2lnbmVkIFB5X3NzaXplX3QgdG8gdHJhY2sKLQkgKiB0aGluZ3Mgd2l0aG91dCBjaGVja2luZyBmb3Igb3ZlcmZsb3dzIG9yIG5lZ2F0aXZlcy4KLQkgKiBBcyBzaXplX3QgaXMgdW5zaWduZWQsIGNoZWNraW5nIGZvciBuYnl0ZXMgPCAwIGlzIG5vdCByZXF1aXJlZC4KLQkgKi8KLQlpZiAobmJ5dGVzID4gUFlfU1NJWkVfVF9NQVgpCi0JCXJldHVybiBOVUxMOworICAgIC8qCisgICAgICogTGltaXQgb3Vyc2VsdmVzIHRvIFBZX1NTSVpFX1RfTUFYIGJ5dGVzIHRvIHByZXZlbnQgc2VjdXJpdHkgaG9sZXMuCisgICAgICogTW9zdCBweXRob24gaW50ZXJuYWxzIGJsaW5kbHkgdXNlIGEgc2lnbmVkIFB5X3NzaXplX3QgdG8gdHJhY2sKKyAgICAgKiB0aGluZ3Mgd2l0aG91dCBjaGVja2luZyBmb3Igb3ZlcmZsb3dzIG9yIG5lZ2F0aXZlcy4KKyAgICAgKiBBcyBzaXplX3QgaXMgdW5zaWduZWQsIGNoZWNraW5nIGZvciBuYnl0ZXMgPCAwIGlzIG5vdCByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBpZiAobmJ5dGVzID4gUFlfU1NJWkVfVF9NQVgpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyoKLQkgKiBUaGlzIGltcGxpY2l0bHkgcmVkaXJlY3RzIG1hbGxvYygwKS4KLQkgKi8KLQlpZiAoKG5ieXRlcyAtIDEpIDwgU01BTExfUkVRVUVTVF9USFJFU0hPTEQpIHsKLQkJTE9DSygpOwotCQkvKgotCQkgKiBNb3N0IGZyZXF1ZW50IHBhdGhzIGZpcnN0Ci0JCSAqLwotCQlzaXplID0gKHVpbnQpKG5ieXRlcyAtIDEpID4+IEFMSUdOTUVOVF9TSElGVDsKLQkJcG9vbCA9IHVzZWRwb29sc1tzaXplICsgc2l6ZV07Ci0JCWlmIChwb29sICE9IHBvb2wtPm5leHRwb29sKSB7Ci0JCQkvKgotCQkJICogVGhlcmUgaXMgYSB1c2VkIHBvb2wgZm9yIHRoaXMgc2l6ZSBjbGFzcy4KLQkJCSAqIFBpY2sgdXAgdGhlIGhlYWQgYmxvY2sgb2YgaXRzIGZyZWUgbGlzdC4KLQkJCSAqLwotCQkJKytwb29sLT5yZWYuY291bnQ7Ci0JCQlicCA9IHBvb2wtPmZyZWVibG9jazsKLQkJCWFzc2VydChicCAhPSBOVUxMKTsKLQkJCWlmICgocG9vbC0+ZnJlZWJsb2NrID0gKihibG9jayAqKilicCkgIT0gTlVMTCkgewotCQkJCVVOTE9DSygpOwotCQkJCXJldHVybiAodm9pZCAqKWJwOwotCQkJfQotCQkJLyoKLQkJCSAqIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZnJlZSBsaXN0LCB0cnkgdG8gZXh0ZW5kIGl0LgotCQkJICovCi0JCQlpZiAocG9vbC0+bmV4dG9mZnNldCA8PSBwb29sLT5tYXhuZXh0b2Zmc2V0KSB7Ci0JCQkJLyogVGhlcmUgaXMgcm9vbSBmb3IgYW5vdGhlciBibG9jay4gKi8KLQkJCQlwb29sLT5mcmVlYmxvY2sgPSAoYmxvY2sqKXBvb2wgKwotCQkJCQkJICBwb29sLT5uZXh0b2Zmc2V0OwotCQkJCXBvb2wtPm5leHRvZmZzZXQgKz0gSU5ERVgyU0laRShzaXplKTsKLQkJCQkqKGJsb2NrICoqKShwb29sLT5mcmVlYmxvY2spID0gTlVMTDsKLQkJCQlVTkxPQ0soKTsKLQkJCQlyZXR1cm4gKHZvaWQgKilicDsKLQkJCX0KLQkJCS8qIFBvb2wgaXMgZnVsbCwgdW5saW5rIGZyb20gdXNlZCBwb29scy4gKi8KLQkJCW5leHQgPSBwb29sLT5uZXh0cG9vbDsKLQkJCXBvb2wgPSBwb29sLT5wcmV2cG9vbDsKLQkJCW5leHQtPnByZXZwb29sID0gcG9vbDsKLQkJCXBvb2wtPm5leHRwb29sID0gbmV4dDsKLQkJCVVOTE9DSygpOwotCQkJcmV0dXJuICh2b2lkICopYnA7Ci0JCX0KKyAgICAvKgorICAgICAqIFRoaXMgaW1wbGljaXRseSByZWRpcmVjdHMgbWFsbG9jKDApLgorICAgICAqLworICAgIGlmICgobmJ5dGVzIC0gMSkgPCBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCkgeworICAgICAgICBMT0NLKCk7CisgICAgICAgIC8qCisgICAgICAgICAqIE1vc3QgZnJlcXVlbnQgcGF0aHMgZmlyc3QKKyAgICAgICAgICovCisgICAgICAgIHNpemUgPSAodWludCkobmJ5dGVzIC0gMSkgPj4gQUxJR05NRU5UX1NISUZUOworICAgICAgICBwb29sID0gdXNlZHBvb2xzW3NpemUgKyBzaXplXTsKKyAgICAgICAgaWYgKHBvb2wgIT0gcG9vbC0+bmV4dHBvb2wpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGVyZSBpcyBhIHVzZWQgcG9vbCBmb3IgdGhpcyBzaXplIGNsYXNzLgorICAgICAgICAgICAgICogUGljayB1cCB0aGUgaGVhZCBibG9jayBvZiBpdHMgZnJlZSBsaXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICArK3Bvb2wtPnJlZi5jb3VudDsKKyAgICAgICAgICAgIGJwID0gcG9vbC0+ZnJlZWJsb2NrOworICAgICAgICAgICAgYXNzZXJ0KGJwICE9IE5VTEwpOworICAgICAgICAgICAgaWYgKChwb29sLT5mcmVlYmxvY2sgPSAqKGJsb2NrICoqKWJwKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopYnA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmcmVlIGxpc3QsIHRyeSB0byBleHRlbmQgaXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwb29sLT5uZXh0b2Zmc2V0IDw9IHBvb2wtPm1heG5leHRvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAvKiBUaGVyZSBpcyByb29tIGZvciBhbm90aGVyIGJsb2NrLiAqLworICAgICAgICAgICAgICAgIHBvb2wtPmZyZWVibG9jayA9IChibG9jayopcG9vbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbC0+bmV4dG9mZnNldDsKKyAgICAgICAgICAgICAgICBwb29sLT5uZXh0b2Zmc2V0ICs9IElOREVYMlNJWkUoc2l6ZSk7CisgICAgICAgICAgICAgICAgKihibG9jayAqKikocG9vbC0+ZnJlZWJsb2NrKSA9IE5VTEw7CisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopYnA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBQb29sIGlzIGZ1bGwsIHVubGluayBmcm9tIHVzZWQgcG9vbHMuICovCisgICAgICAgICAgICBuZXh0ID0gcG9vbC0+bmV4dHBvb2w7CisgICAgICAgICAgICBwb29sID0gcG9vbC0+cHJldnBvb2w7CisgICAgICAgICAgICBuZXh0LT5wcmV2cG9vbCA9IHBvb2w7CisgICAgICAgICAgICBwb29sLT5uZXh0cG9vbCA9IG5leHQ7CisgICAgICAgICAgICBVTkxPQ0soKTsKKyAgICAgICAgICAgIHJldHVybiAodm9pZCAqKWJwOworICAgICAgICB9CiAKLQkJLyogVGhlcmUgaXNuJ3QgYSBwb29sIG9mIHRoZSByaWdodCBzaXplIGNsYXNzIGltbWVkaWF0ZWx5Ci0JCSAqIGF2YWlsYWJsZTogIHVzZSBhIGZyZWUgcG9vbC4KLQkJICovCi0JCWlmICh1c2FibGVfYXJlbmFzID09IE5VTEwpIHsKLQkJCS8qIE5vIGFyZW5hIGhhcyBhIGZyZWUgcG9vbDogIGFsbG9jYXRlIGEgbmV3IGFyZW5hLiAqLworICAgICAgICAvKiBUaGVyZSBpc24ndCBhIHBvb2wgb2YgdGhlIHJpZ2h0IHNpemUgY2xhc3MgaW1tZWRpYXRlbHkKKyAgICAgICAgICogYXZhaWxhYmxlOiAgdXNlIGEgZnJlZSBwb29sLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHVzYWJsZV9hcmVuYXMgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogTm8gYXJlbmEgaGFzIGEgZnJlZSBwb29sOiAgYWxsb2NhdGUgYSBuZXcgYXJlbmEuICovCiAjaWZkZWYgV0lUSF9NRU1PUllfTElNSVRTCi0JCQlpZiAobmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkID49IE1BWF9BUkVOQVMpIHsKLQkJCQlVTkxPQ0soKTsKLQkJCQlnb3RvIHJlZGlyZWN0OwotCQkJfQorICAgICAgICAgICAgaWYgKG5hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZCA+PSBNQVhfQVJFTkFTKSB7CisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgZ290byByZWRpcmVjdDsKKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJdXNhYmxlX2FyZW5hcyA9IG5ld19hcmVuYSgpOwotCQkJaWYgKHVzYWJsZV9hcmVuYXMgPT0gTlVMTCkgewotCQkJCVVOTE9DSygpOwotCQkJCWdvdG8gcmVkaXJlY3Q7Ci0JCQl9Ci0JCQl1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEgPQotCQkJCXVzYWJsZV9hcmVuYXMtPnByZXZhcmVuYSA9IE5VTEw7Ci0JCX0KLQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7CisgICAgICAgICAgICB1c2FibGVfYXJlbmFzID0gbmV3X2FyZW5hKCk7CisgICAgICAgICAgICBpZiAodXNhYmxlX2FyZW5hcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgZ290byByZWRpcmVjdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYSA9CisgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcy0+cHJldmFyZW5hID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+YWRkcmVzcyAhPSAwKTsKIAotCQkvKiBUcnkgdG8gZ2V0IGEgY2FjaGVkIGZyZWUgcG9vbC4gKi8KLQkJcG9vbCA9IHVzYWJsZV9hcmVuYXMtPmZyZWVwb29sczsKLQkJaWYgKHBvb2wgIT0gTlVMTCkgewotCQkJLyogVW5saW5rIGZyb20gY2FjaGVkIHBvb2xzLiAqLwotCQkJdXNhYmxlX2FyZW5hcy0+ZnJlZXBvb2xzID0gcG9vbC0+bmV4dHBvb2w7CisgICAgICAgIC8qIFRyeSB0byBnZXQgYSBjYWNoZWQgZnJlZSBwb29sLiAqLworICAgICAgICBwb29sID0gdXNhYmxlX2FyZW5hcy0+ZnJlZXBvb2xzOworICAgICAgICBpZiAocG9vbCAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiBVbmxpbmsgZnJvbSBjYWNoZWQgcG9vbHMuICovCisgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5mcmVlcG9vbHMgPSBwb29sLT5uZXh0cG9vbDsKIAotCQkJLyogVGhpcyBhcmVuYSBhbHJlYWR5IGhhZCB0aGUgc21hbGxlc3QgbmZyZWVwb29scwotCQkJICogdmFsdWUsIHNvIGRlY3JlYXNpbmcgbmZyZWVwb29scyBkb2Vzbid0IGNoYW5nZQotCQkJICogdGhhdCwgYW5kIHdlIGRvbid0IG5lZWQgdG8gcmVhcnJhbmdlIHRoZQotCQkJICogdXNhYmxlX2FyZW5hcyBsaXN0LiAgSG93ZXZlciwgaWYgdGhlIGFyZW5hIGhhcwotCQkJICogYmVjb21lIHdob2xseSBhbGxvY2F0ZWQsIHdlIG5lZWQgdG8gcmVtb3ZlIGl0cwotCQkJICogYXJlbmFfb2JqZWN0IGZyb20gdXNhYmxlX2FyZW5hcy4KLQkJCSAqLwotCQkJLS11c2FibGVfYXJlbmFzLT5uZnJlZXBvb2xzOwotCQkJaWYgKHVzYWJsZV9hcmVuYXMtPm5mcmVlcG9vbHMgPT0gMCkgewotCQkJCS8qIFdob2xseSBhbGxvY2F0ZWQ6ICByZW1vdmUuICovCi0JCQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmZyZWVwb29scyA9PSBOVUxMKTsKLQkJCQlhc3NlcnQodXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hID09IE5VTEwgfHwKLQkJCQkgICAgICAgdXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPT0KLQkJCQkJICAgdXNhYmxlX2FyZW5hcyk7CisgICAgICAgICAgICAvKiBUaGlzIGFyZW5hIGFscmVhZHkgaGFkIHRoZSBzbWFsbGVzdCBuZnJlZXBvb2xzCisgICAgICAgICAgICAgKiB2YWx1ZSwgc28gZGVjcmVhc2luZyBuZnJlZXBvb2xzIGRvZXNuJ3QgY2hhbmdlCisgICAgICAgICAgICAgKiB0aGF0LCBhbmQgd2UgZG9uJ3QgbmVlZCB0byByZWFycmFuZ2UgdGhlCisgICAgICAgICAgICAgKiB1c2FibGVfYXJlbmFzIGxpc3QuICBIb3dldmVyLCBpZiB0aGUgYXJlbmEgaGFzCisgICAgICAgICAgICAgKiBiZWNvbWUgd2hvbGx5IGFsbG9jYXRlZCwgd2UgbmVlZCB0byByZW1vdmUgaXRzCisgICAgICAgICAgICAgKiBhcmVuYV9vYmplY3QgZnJvbSB1c2FibGVfYXJlbmFzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAtLXVzYWJsZV9hcmVuYXMtPm5mcmVlcG9vbHM7CisgICAgICAgICAgICBpZiAodXNhYmxlX2FyZW5hcy0+bmZyZWVwb29scyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogV2hvbGx5IGFsbG9jYXRlZDogIHJlbW92ZS4gKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+ZnJlZXBvb2xzID09IE5VTEwpOworICAgICAgICAgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9PQorICAgICAgICAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzKTsKIAotCQkJCXVzYWJsZV9hcmVuYXMgPSB1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmE7Ci0JCQkJaWYgKHVzYWJsZV9hcmVuYXMgIT0gTlVMTCkgewotCQkJCQl1c2FibGVfYXJlbmFzLT5wcmV2YXJlbmEgPSBOVUxMOwotCQkJCQlhc3NlcnQodXNhYmxlX2FyZW5hcy0+YWRkcmVzcyAhPSAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBuZnJlZXBvb2xzID4gMDogIGl0IG11c3QgYmUgdGhhdCBmcmVlcG9vbHMKLQkJCQkgKiBpc24ndCBOVUxMLCBvciB0aGF0IHdlIGhhdmVuJ3QgeWV0IGNhcnZlZAotCQkJCSAqIG9mZiBhbGwgdGhlIGFyZW5hJ3MgcG9vbHMgZm9yIHRoZSBmaXJzdAotCQkJCSAqIHRpbWUuCi0JCQkJICovCi0JCQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmZyZWVwb29scyAhPSBOVUxMIHx8Ci0JCQkJICAgICAgIHVzYWJsZV9hcmVuYXMtPnBvb2xfYWRkcmVzcyA8PQotCQkJCSAgICAgICAgICAgKGJsb2NrKil1c2FibGVfYXJlbmFzLT5hZGRyZXNzICsKLQkJCQkgICAgICAgICAgICAgICBBUkVOQV9TSVpFIC0gUE9PTF9TSVpFKTsKLQkJCX0KLQkJaW5pdF9wb29sOgotCQkJLyogRnJvbnRsaW5rIHRvIHVzZWQgcG9vbHMuICovCi0JCQluZXh0ID0gdXNlZHBvb2xzW3NpemUgKyBzaXplXTsgLyogPT0gcHJldiAqLwotCQkJcG9vbC0+bmV4dHBvb2wgPSBuZXh0OwotCQkJcG9vbC0+cHJldnBvb2wgPSBuZXh0OwotCQkJbmV4dC0+bmV4dHBvb2wgPSBwb29sOwotCQkJbmV4dC0+cHJldnBvb2wgPSBwb29sOwotCQkJcG9vbC0+cmVmLmNvdW50ID0gMTsKLQkJCWlmIChwb29sLT5zemlkeCA9PSBzaXplKSB7Ci0JCQkJLyogTHVja2lseSwgdGhpcyBwb29sIGxhc3QgY29udGFpbmVkIGJsb2NrcwotCQkJCSAqIG9mIHRoZSBzYW1lIHNpemUgY2xhc3MsIHNvIGl0cyBoZWFkZXIKLQkJCQkgKiBhbmQgZnJlZSBsaXN0IGFyZSBhbHJlYWR5IGluaXRpYWxpemVkLgotCQkJCSAqLwotCQkJCWJwID0gcG9vbC0+ZnJlZWJsb2NrOwotCQkJCXBvb2wtPmZyZWVibG9jayA9ICooYmxvY2sgKiopYnA7Ci0JCQkJVU5MT0NLKCk7Ci0JCQkJcmV0dXJuICh2b2lkICopYnA7Ci0JCQl9Ci0JCQkvKgotCQkJICogSW5pdGlhbGl6ZSB0aGUgcG9vbCBoZWFkZXIsIHNldCB1cCB0aGUgZnJlZSBsaXN0IHRvCi0JCQkgKiBjb250YWluIGp1c3QgdGhlIHNlY29uZCBibG9jaywgYW5kIHJldHVybiB0aGUgZmlyc3QKLQkJCSAqIGJsb2NrLgotCQkJICovCi0JCQlwb29sLT5zemlkeCA9IHNpemU7Ci0JCQlzaXplID0gSU5ERVgyU0laRShzaXplKTsKLQkJCWJwID0gKGJsb2NrICopcG9vbCArIFBPT0xfT1ZFUkhFQUQ7Ci0JCQlwb29sLT5uZXh0b2Zmc2V0ID0gUE9PTF9PVkVSSEVBRCArIChzaXplIDw8IDEpOwotCQkJcG9vbC0+bWF4bmV4dG9mZnNldCA9IFBPT0xfU0laRSAtIHNpemU7Ci0JCQlwb29sLT5mcmVlYmxvY2sgPSBicCArIHNpemU7Ci0JCQkqKGJsb2NrICoqKShwb29sLT5mcmVlYmxvY2spID0gTlVMTDsKLQkJCVVOTE9DSygpOwotCQkJcmV0dXJuICh2b2lkICopYnA7Ci0JCX0KKyAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzID0gdXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hOworICAgICAgICAgICAgICAgIGlmICh1c2FibGVfYXJlbmFzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcy0+cHJldmFyZW5hID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogbmZyZWVwb29scyA+IDA6ICBpdCBtdXN0IGJlIHRoYXQgZnJlZXBvb2xzCisgICAgICAgICAgICAgICAgICogaXNuJ3QgTlVMTCwgb3IgdGhhdCB3ZSBoYXZlbid0IHlldCBjYXJ2ZWQKKyAgICAgICAgICAgICAgICAgKiBvZmYgYWxsIHRoZSBhcmVuYSdzIHBvb2xzIGZvciB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAgKiB0aW1lLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzLT5mcmVlcG9vbHMgIT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICB1c2FibGVfYXJlbmFzLT5wb29sX2FkZHJlc3MgPD0KKyAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrKil1c2FibGVfYXJlbmFzLT5hZGRyZXNzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRU5BX1NJWkUgLSBQT09MX1NJWkUpOworICAgICAgICAgICAgfQorICAgICAgICBpbml0X3Bvb2w6CisgICAgICAgICAgICAvKiBGcm9udGxpbmsgdG8gdXNlZCBwb29scy4gKi8KKyAgICAgICAgICAgIG5leHQgPSB1c2VkcG9vbHNbc2l6ZSArIHNpemVdOyAvKiA9PSBwcmV2ICovCisgICAgICAgICAgICBwb29sLT5uZXh0cG9vbCA9IG5leHQ7CisgICAgICAgICAgICBwb29sLT5wcmV2cG9vbCA9IG5leHQ7CisgICAgICAgICAgICBuZXh0LT5uZXh0cG9vbCA9IHBvb2w7CisgICAgICAgICAgICBuZXh0LT5wcmV2cG9vbCA9IHBvb2w7CisgICAgICAgICAgICBwb29sLT5yZWYuY291bnQgPSAxOworICAgICAgICAgICAgaWYgKHBvb2wtPnN6aWR4ID09IHNpemUpIHsKKyAgICAgICAgICAgICAgICAvKiBMdWNraWx5LCB0aGlzIHBvb2wgbGFzdCBjb250YWluZWQgYmxvY2tzCisgICAgICAgICAgICAgICAgICogb2YgdGhlIHNhbWUgc2l6ZSBjbGFzcywgc28gaXRzIGhlYWRlcgorICAgICAgICAgICAgICAgICAqIGFuZCBmcmVlIGxpc3QgYXJlIGFscmVhZHkgaW5pdGlhbGl6ZWQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYnAgPSBwb29sLT5mcmVlYmxvY2s7CisgICAgICAgICAgICAgICAgcG9vbC0+ZnJlZWJsb2NrID0gKihibG9jayAqKilicDsKKyAgICAgICAgICAgICAgICBVTkxPQ0soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKilicDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJbml0aWFsaXplIHRoZSBwb29sIGhlYWRlciwgc2V0IHVwIHRoZSBmcmVlIGxpc3QgdG8KKyAgICAgICAgICAgICAqIGNvbnRhaW4ganVzdCB0aGUgc2Vjb25kIGJsb2NrLCBhbmQgcmV0dXJuIHRoZSBmaXJzdAorICAgICAgICAgICAgICogYmxvY2suCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBvb2wtPnN6aWR4ID0gc2l6ZTsKKyAgICAgICAgICAgIHNpemUgPSBJTkRFWDJTSVpFKHNpemUpOworICAgICAgICAgICAgYnAgPSAoYmxvY2sgKilwb29sICsgUE9PTF9PVkVSSEVBRDsKKyAgICAgICAgICAgIHBvb2wtPm5leHRvZmZzZXQgPSBQT09MX09WRVJIRUFEICsgKHNpemUgPDwgMSk7CisgICAgICAgICAgICBwb29sLT5tYXhuZXh0b2Zmc2V0ID0gUE9PTF9TSVpFIC0gc2l6ZTsKKyAgICAgICAgICAgIHBvb2wtPmZyZWVibG9jayA9IGJwICsgc2l6ZTsKKyAgICAgICAgICAgICooYmxvY2sgKiopKHBvb2wtPmZyZWVibG9jaykgPSBOVUxMOworICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICByZXR1cm4gKHZvaWQgKilicDsKKyAgICAgICAgfQogCi0JCS8qIENhcnZlIG9mZiBhIG5ldyBwb29sLiAqLwotCQlhc3NlcnQodXNhYmxlX2FyZW5hcy0+bmZyZWVwb29scyA+IDApOwotCQlhc3NlcnQodXNhYmxlX2FyZW5hcy0+ZnJlZXBvb2xzID09IE5VTEwpOwotCQlwb29sID0gKHBvb2xwKXVzYWJsZV9hcmVuYXMtPnBvb2xfYWRkcmVzczsKLQkJYXNzZXJ0KChibG9jayopcG9vbCA8PSAoYmxvY2sqKXVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgKwotCQkgICAgICAgICAgICAgICAgICAgICAgIEFSRU5BX1NJWkUgLSBQT09MX1NJWkUpOwotCQlwb29sLT5hcmVuYWluZGV4ID0gdXNhYmxlX2FyZW5hcyAtIGFyZW5hczsKLQkJYXNzZXJ0KCZhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF0gPT0gdXNhYmxlX2FyZW5hcyk7Ci0JCXBvb2wtPnN6aWR4ID0gRFVNTVlfU0laRV9JRFg7Ci0JCXVzYWJsZV9hcmVuYXMtPnBvb2xfYWRkcmVzcyArPSBQT09MX1NJWkU7Ci0JCS0tdXNhYmxlX2FyZW5hcy0+bmZyZWVwb29sczsKKyAgICAgICAgLyogQ2FydmUgb2ZmIGEgbmV3IHBvb2wuICovCisgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzLT5uZnJlZXBvb2xzID4gMCk7CisgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzLT5mcmVlcG9vbHMgPT0gTlVMTCk7CisgICAgICAgIHBvb2wgPSAocG9vbHApdXNhYmxlX2FyZW5hcy0+cG9vbF9hZGRyZXNzOworICAgICAgICBhc3NlcnQoKGJsb2NrKilwb29sIDw9IChibG9jayopdXNhYmxlX2FyZW5hcy0+YWRkcmVzcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJFTkFfU0laRSAtIFBPT0xfU0laRSk7CisgICAgICAgIHBvb2wtPmFyZW5haW5kZXggPSB1c2FibGVfYXJlbmFzIC0gYXJlbmFzOworICAgICAgICBhc3NlcnQoJmFyZW5hc1twb29sLT5hcmVuYWluZGV4XSA9PSB1c2FibGVfYXJlbmFzKTsKKyAgICAgICAgcG9vbC0+c3ppZHggPSBEVU1NWV9TSVpFX0lEWDsKKyAgICAgICAgdXNhYmxlX2FyZW5hcy0+cG9vbF9hZGRyZXNzICs9IFBPT0xfU0laRTsKKyAgICAgICAgLS11c2FibGVfYXJlbmFzLT5uZnJlZXBvb2xzOwogCi0JCWlmICh1c2FibGVfYXJlbmFzLT5uZnJlZXBvb2xzID09IDApIHsKLQkJCWFzc2VydCh1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAotCQkJICAgICAgIHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYS0+cHJldmFyZW5hID09Ci0JCQkgICAgICAgCSAgIHVzYWJsZV9hcmVuYXMpOwotCQkJLyogVW5saW5rIHRoZSBhcmVuYTogIGl0IGlzIGNvbXBsZXRlbHkgYWxsb2NhdGVkLiAqLwotCQkJdXNhYmxlX2FyZW5hcyA9IHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYTsKLQkJCWlmICh1c2FibGVfYXJlbmFzICE9IE5VTEwpIHsKLQkJCQl1c2FibGVfYXJlbmFzLT5wcmV2YXJlbmEgPSBOVUxMOwotCQkJCWFzc2VydCh1c2FibGVfYXJlbmFzLT5hZGRyZXNzICE9IDApOwotCQkJfQotCQl9CisgICAgICAgIGlmICh1c2FibGVfYXJlbmFzLT5uZnJlZXBvb2xzID09IDApIHsKKyAgICAgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMtPm5leHRhcmVuYS0+cHJldmFyZW5hID09CisgICAgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyk7CisgICAgICAgICAgICAvKiBVbmxpbmsgdGhlIGFyZW5hOiAgaXQgaXMgY29tcGxldGVseSBhbGxvY2F0ZWQuICovCisgICAgICAgICAgICB1c2FibGVfYXJlbmFzID0gdXNhYmxlX2FyZW5hcy0+bmV4dGFyZW5hOworICAgICAgICAgICAgaWYgKHVzYWJsZV9hcmVuYXMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMtPnByZXZhcmVuYSA9IE5VTEw7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlnb3RvIGluaXRfcG9vbDsKLQl9CisgICAgICAgIGdvdG8gaW5pdF9wb29sOworICAgIH0KIAotICAgICAgICAvKiBUaGUgc21hbGwgYmxvY2sgYWxsb2NhdG9yIGVuZHMgaGVyZS4gKi8KKyAgICAvKiBUaGUgc21hbGwgYmxvY2sgYWxsb2NhdG9yIGVuZHMgaGVyZS4gKi8KIAogcmVkaXJlY3Q6Ci0JLyogUmVkaXJlY3QgdGhlIG9yaWdpbmFsIHJlcXVlc3QgdG8gdGhlIHVuZGVybHlpbmcgKGxpYmMpIGFsbG9jYXRvci4KLQkgKiBXZSBqdW1wIGhlcmUgb24gYmlnZ2VyIHJlcXVlc3RzLCBvbiBlcnJvciBpbiB0aGUgY29kZSBhYm92ZSAoYXMgYQotCSAqIGxhc3QgY2hhbmNlIHRvIHNlcnZlIHRoZSByZXF1ZXN0KSBvciB3aGVuIHRoZSBtYXggbWVtb3J5IGxpbWl0Ci0JICogaGFzIGJlZW4gcmVhY2hlZC4KLQkgKi8KLQlpZiAobmJ5dGVzID09IDApCi0JCW5ieXRlcyA9IDE7Ci0JcmV0dXJuICh2b2lkICopbWFsbG9jKG5ieXRlcyk7CisgICAgLyogUmVkaXJlY3QgdGhlIG9yaWdpbmFsIHJlcXVlc3QgdG8gdGhlIHVuZGVybHlpbmcgKGxpYmMpIGFsbG9jYXRvci4KKyAgICAgKiBXZSBqdW1wIGhlcmUgb24gYmlnZ2VyIHJlcXVlc3RzLCBvbiBlcnJvciBpbiB0aGUgY29kZSBhYm92ZSAoYXMgYQorICAgICAqIGxhc3QgY2hhbmNlIHRvIHNlcnZlIHRoZSByZXF1ZXN0KSBvciB3aGVuIHRoZSBtYXggbWVtb3J5IGxpbWl0CisgICAgICogaGFzIGJlZW4gcmVhY2hlZC4KKyAgICAgKi8KKyAgICBpZiAobmJ5dGVzID09IDApCisgICAgICAgIG5ieXRlcyA9IDE7CisgICAgcmV0dXJuICh2b2lkICopbWFsbG9jKG5ieXRlcyk7CiB9CiAKIC8qIGZyZWUgKi8KQEAgLTkxOSwyMTAgKzkxOSwyMTAgQEAKIHZvaWQKIFB5T2JqZWN0X0ZyZWUodm9pZCAqcCkKIHsKLQlwb29scCBwb29sOwotCWJsb2NrICpsYXN0ZnJlZTsKLQlwb29scCBuZXh0LCBwcmV2OwotCXVpbnQgc2l6ZTsKKyAgICBwb29scCBwb29sOworICAgIGJsb2NrICpsYXN0ZnJlZTsKKyAgICBwb29scCBuZXh0LCBwcmV2OworICAgIHVpbnQgc2l6ZTsKIAotCWlmIChwID09IE5VTEwpCS8qIGZyZWUoTlVMTCkgaGFzIG5vIGVmZmVjdCAqLwotCQlyZXR1cm47CisgICAgaWYgKHAgPT0gTlVMTCkgICAgICAvKiBmcmVlKE5VTEwpIGhhcyBubyBlZmZlY3QgKi8KKyAgICAgICAgcmV0dXJuOwogCi0JcG9vbCA9IFBPT0xfQUREUihwKTsKLQlpZiAoUHlfQUREUkVTU19JTl9SQU5HRShwLCBwb29sKSkgewotCQkvKiBXZSBhbGxvY2F0ZWQgdGhpcyBhZGRyZXNzLiAqLwotCQlMT0NLKCk7Ci0JCS8qIExpbmsgcCB0byB0aGUgc3RhcnQgb2YgdGhlIHBvb2wncyBmcmVlYmxvY2sgbGlzdC4gIFNpbmNlCi0JCSAqIHRoZSBwb29sIGhhZCBhdCBsZWFzdCB0aGUgcCBibG9jayBvdXRzdGFuZGluZywgdGhlIHBvb2wKLQkJICogd2Fzbid0IGVtcHR5IChzbyBpdCdzIGFscmVhZHkgaW4gYSB1c2VkcG9vbHNbXSBsaXN0LCBvcgotCQkgKiB3YXMgZnVsbCBhbmQgaXMgaW4gbm8gbGlzdCAtLSBpdCdzIG5vdCBpbiB0aGUgZnJlZWJsb2NrcwotCQkgKiBsaXN0IGluIGFueSBjYXNlKS4KLQkJICovCi0JCWFzc2VydChwb29sLT5yZWYuY291bnQgPiAwKTsJLyogZWxzZSBpdCB3YXMgZW1wdHkgKi8KLQkJKihibG9jayAqKilwID0gbGFzdGZyZWUgPSBwb29sLT5mcmVlYmxvY2s7Ci0JCXBvb2wtPmZyZWVibG9jayA9IChibG9jayAqKXA7Ci0JCWlmIChsYXN0ZnJlZSkgewotCQkJc3RydWN0IGFyZW5hX29iamVjdCogYW87Ci0JCQl1aW50IG5mOyAgLyogYW8tPm5mcmVlcG9vbHMgKi8KKyAgICBwb29sID0gUE9PTF9BRERSKHApOworICAgIGlmIChQeV9BRERSRVNTX0lOX1JBTkdFKHAsIHBvb2wpKSB7CisgICAgICAgIC8qIFdlIGFsbG9jYXRlZCB0aGlzIGFkZHJlc3MuICovCisgICAgICAgIExPQ0soKTsKKyAgICAgICAgLyogTGluayBwIHRvIHRoZSBzdGFydCBvZiB0aGUgcG9vbCdzIGZyZWVibG9jayBsaXN0LiAgU2luY2UKKyAgICAgICAgICogdGhlIHBvb2wgaGFkIGF0IGxlYXN0IHRoZSBwIGJsb2NrIG91dHN0YW5kaW5nLCB0aGUgcG9vbAorICAgICAgICAgKiB3YXNuJ3QgZW1wdHkgKHNvIGl0J3MgYWxyZWFkeSBpbiBhIHVzZWRwb29sc1tdIGxpc3QsIG9yCisgICAgICAgICAqIHdhcyBmdWxsIGFuZCBpcyBpbiBubyBsaXN0IC0tIGl0J3Mgbm90IGluIHRoZSBmcmVlYmxvY2tzCisgICAgICAgICAqIGxpc3QgaW4gYW55IGNhc2UpLgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0KHBvb2wtPnJlZi5jb3VudCA+IDApOyAgICAgICAgICAgIC8qIGVsc2UgaXQgd2FzIGVtcHR5ICovCisgICAgICAgICooYmxvY2sgKiopcCA9IGxhc3RmcmVlID0gcG9vbC0+ZnJlZWJsb2NrOworICAgICAgICBwb29sLT5mcmVlYmxvY2sgPSAoYmxvY2sgKilwOworICAgICAgICBpZiAobGFzdGZyZWUpIHsKKyAgICAgICAgICAgIHN0cnVjdCBhcmVuYV9vYmplY3QqIGFvOworICAgICAgICAgICAgdWludCBuZjsgIC8qIGFvLT5uZnJlZXBvb2xzICovCiAKLQkJCS8qIGZyZWVibG9jayB3YXNuJ3QgTlVMTCwgc28gdGhlIHBvb2wgd2Fzbid0IGZ1bGwsCi0JCQkgKiBhbmQgdGhlIHBvb2wgaXMgaW4gYSB1c2VkcG9vbHNbXSBsaXN0LgotCQkJICovCi0JCQlpZiAoLS1wb29sLT5yZWYuY291bnQgIT0gMCkgewotCQkJCS8qIHBvb2wgaXNuJ3QgZW1wdHk6ICBsZWF2ZSBpdCBpbiB1c2VkcG9vbHMgKi8KLQkJCQlVTkxPQ0soKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvKiBQb29sIGlzIG5vdyBlbXB0eTogIHVubGluayBmcm9tIHVzZWRwb29scywgYW5kCi0JCQkgKiBsaW5rIHRvIHRoZSBmcm9udCBvZiBmcmVlcG9vbHMuICBUaGlzIGVuc3VyZXMgdGhhdAotCQkJICogcHJldmlvdXNseSBmcmVlZCBwb29scyB3aWxsIGJlIGFsbG9jYXRlZCBsYXRlcgotCQkJICogKGJlaW5nIG5vdCByZWZlcmVuY2VkLCB0aGV5IGFyZSBwZXJoYXBzIHBhZ2VkIG91dCkuCi0JCQkgKi8KLQkJCW5leHQgPSBwb29sLT5uZXh0cG9vbDsKLQkJCXByZXYgPSBwb29sLT5wcmV2cG9vbDsKLQkJCW5leHQtPnByZXZwb29sID0gcHJldjsKLQkJCXByZXYtPm5leHRwb29sID0gbmV4dDsKKyAgICAgICAgICAgIC8qIGZyZWVibG9jayB3YXNuJ3QgTlVMTCwgc28gdGhlIHBvb2wgd2Fzbid0IGZ1bGwsCisgICAgICAgICAgICAgKiBhbmQgdGhlIHBvb2wgaXMgaW4gYSB1c2VkcG9vbHNbXSBsaXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoLS1wb29sLT5yZWYuY291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgIC8qIHBvb2wgaXNuJ3QgZW1wdHk6ICBsZWF2ZSBpdCBpbiB1c2VkcG9vbHMgKi8KKyAgICAgICAgICAgICAgICBVTkxPQ0soKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBQb29sIGlzIG5vdyBlbXB0eTogIHVubGluayBmcm9tIHVzZWRwb29scywgYW5kCisgICAgICAgICAgICAgKiBsaW5rIHRvIHRoZSBmcm9udCBvZiBmcmVlcG9vbHMuICBUaGlzIGVuc3VyZXMgdGhhdAorICAgICAgICAgICAgICogcHJldmlvdXNseSBmcmVlZCBwb29scyB3aWxsIGJlIGFsbG9jYXRlZCBsYXRlcgorICAgICAgICAgICAgICogKGJlaW5nIG5vdCByZWZlcmVuY2VkLCB0aGV5IGFyZSBwZXJoYXBzIHBhZ2VkIG91dCkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG5leHQgPSBwb29sLT5uZXh0cG9vbDsKKyAgICAgICAgICAgIHByZXYgPSBwb29sLT5wcmV2cG9vbDsKKyAgICAgICAgICAgIG5leHQtPnByZXZwb29sID0gcHJldjsKKyAgICAgICAgICAgIHByZXYtPm5leHRwb29sID0gbmV4dDsKIAotCQkJLyogTGluayB0aGUgcG9vbCB0byBmcmVlcG9vbHMuICBUaGlzIGlzIGEgc2luZ2x5LWxpbmtlZAotCQkJICogbGlzdCwgYW5kIHBvb2wtPnByZXZwb29sIGlzbid0IHVzZWQgdGhlcmUuCi0JCQkgKi8KLQkJCWFvID0gJmFyZW5hc1twb29sLT5hcmVuYWluZGV4XTsKLQkJCXBvb2wtPm5leHRwb29sID0gYW8tPmZyZWVwb29sczsKLQkJCWFvLT5mcmVlcG9vbHMgPSBwb29sOwotCQkJbmYgPSArK2FvLT5uZnJlZXBvb2xzOworICAgICAgICAgICAgLyogTGluayB0aGUgcG9vbCB0byBmcmVlcG9vbHMuICBUaGlzIGlzIGEgc2luZ2x5LWxpbmtlZAorICAgICAgICAgICAgICogbGlzdCwgYW5kIHBvb2wtPnByZXZwb29sIGlzbid0IHVzZWQgdGhlcmUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGFvID0gJmFyZW5hc1twb29sLT5hcmVuYWluZGV4XTsKKyAgICAgICAgICAgIHBvb2wtPm5leHRwb29sID0gYW8tPmZyZWVwb29sczsKKyAgICAgICAgICAgIGFvLT5mcmVlcG9vbHMgPSBwb29sOworICAgICAgICAgICAgbmYgPSArK2FvLT5uZnJlZXBvb2xzOwogCi0JCQkvKiBBbGwgdGhlIHJlc3QgaXMgYXJlbmEgbWFuYWdlbWVudC4gIFdlIGp1c3QgZnJlZWQKLQkJCSAqIGEgcG9vbCwgYW5kIHRoZXJlIGFyZSA0IGNhc2VzIGZvciBhcmVuYSBtZ210OgotCQkJICogMS4gSWYgYWxsIHRoZSBwb29scyBhcmUgZnJlZSwgcmV0dXJuIHRoZSBhcmVuYSB0bwotCQkJICogICAgdGhlIHN5c3RlbSBmcmVlKCkuCi0JCQkgKiAyLiBJZiB0aGlzIGlzIHRoZSBvbmx5IGZyZWUgcG9vbCBpbiB0aGUgYXJlbmEsCi0JCQkgKiAgICBhZGQgdGhlIGFyZW5hIGJhY2sgdG8gdGhlIGB1c2FibGVfYXJlbmFzYCBsaXN0LgotCQkJICogMy4gSWYgdGhlICJuZXh0IiBhcmVuYSBoYXMgYSBzbWFsbGVyIGNvdW50IG9mIGZyZWUKLQkJCSAqICAgIHBvb2xzLCB3ZSBoYXZlIHRvICJzbGlkZSB0aGlzIGFyZW5hIHJpZ2h0IiB0bwotCQkJICogICAgcmVzdG9yZSB0aGF0IHVzYWJsZV9hcmVuYXMgaXMgc29ydGVkIGluIG9yZGVyIG9mCi0JCQkgKiAgICBuZnJlZXBvb2xzLgotCQkJICogNC4gRWxzZSB0aGVyZSdzIG5vdGhpbmcgbW9yZSB0byBkby4KLQkJCSAqLwotCQkJaWYgKG5mID09IGFvLT5udG90YWxwb29scykgewotCQkJCS8qIENhc2UgMS4gIEZpcnN0IHVubGluayBhbyBmcm9tIHVzYWJsZV9hcmVuYXMuCi0JCQkJICovCi0JCQkJYXNzZXJ0KGFvLT5wcmV2YXJlbmEgPT0gTlVMTCB8fAotCQkJCSAgICAgICBhby0+cHJldmFyZW5hLT5hZGRyZXNzICE9IDApOwotCQkJCWFzc2VydChhbyAtPm5leHRhcmVuYSA9PSBOVUxMIHx8Ci0JCQkJICAgICAgIGFvLT5uZXh0YXJlbmEtPmFkZHJlc3MgIT0gMCk7CisgICAgICAgICAgICAvKiBBbGwgdGhlIHJlc3QgaXMgYXJlbmEgbWFuYWdlbWVudC4gIFdlIGp1c3QgZnJlZWQKKyAgICAgICAgICAgICAqIGEgcG9vbCwgYW5kIHRoZXJlIGFyZSA0IGNhc2VzIGZvciBhcmVuYSBtZ210OgorICAgICAgICAgICAgICogMS4gSWYgYWxsIHRoZSBwb29scyBhcmUgZnJlZSwgcmV0dXJuIHRoZSBhcmVuYSB0bworICAgICAgICAgICAgICogICAgdGhlIHN5c3RlbSBmcmVlKCkuCisgICAgICAgICAgICAgKiAyLiBJZiB0aGlzIGlzIHRoZSBvbmx5IGZyZWUgcG9vbCBpbiB0aGUgYXJlbmEsCisgICAgICAgICAgICAgKiAgICBhZGQgdGhlIGFyZW5hIGJhY2sgdG8gdGhlIGB1c2FibGVfYXJlbmFzYCBsaXN0LgorICAgICAgICAgICAgICogMy4gSWYgdGhlICJuZXh0IiBhcmVuYSBoYXMgYSBzbWFsbGVyIGNvdW50IG9mIGZyZWUKKyAgICAgICAgICAgICAqICAgIHBvb2xzLCB3ZSBoYXZlIHRvICJzbGlkZSB0aGlzIGFyZW5hIHJpZ2h0IiB0bworICAgICAgICAgICAgICogICAgcmVzdG9yZSB0aGF0IHVzYWJsZV9hcmVuYXMgaXMgc29ydGVkIGluIG9yZGVyIG9mCisgICAgICAgICAgICAgKiAgICBuZnJlZXBvb2xzLgorICAgICAgICAgICAgICogNC4gRWxzZSB0aGVyZSdzIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG5mID09IGFvLT5udG90YWxwb29scykgeworICAgICAgICAgICAgICAgIC8qIENhc2UgMS4gIEZpcnN0IHVubGluayBhbyBmcm9tIHVzYWJsZV9hcmVuYXMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KGFvLT5wcmV2YXJlbmEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICBhby0+cHJldmFyZW5hLT5hZGRyZXNzICE9IDApOworICAgICAgICAgICAgICAgIGFzc2VydChhbyAtPm5leHRhcmVuYSA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGFvLT5uZXh0YXJlbmEtPmFkZHJlc3MgIT0gMCk7CiAKLQkJCQkvKiBGaXggdGhlIHBvaW50ZXIgaW4gdGhlIHByZXZhcmVuYSwgb3IgdGhlCi0JCQkJICogdXNhYmxlX2FyZW5hcyBwb2ludGVyLgotCQkJCSAqLwotCQkJCWlmIChhby0+cHJldmFyZW5hID09IE5VTEwpIHsKLQkJCQkJdXNhYmxlX2FyZW5hcyA9IGFvLT5uZXh0YXJlbmE7Ci0JCQkJCWFzc2VydCh1c2FibGVfYXJlbmFzID09IE5VTEwgfHwKLQkJCQkJICAgICAgIHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhc3NlcnQoYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID09IGFvKTsKLQkJCQkJYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID0KLQkJCQkJCWFvLT5uZXh0YXJlbmE7Ci0JCQkJfQotCQkJCS8qIEZpeCB0aGUgcG9pbnRlciBpbiB0aGUgbmV4dGFyZW5hLiAqLwotCQkJCWlmIChhby0+bmV4dGFyZW5hICE9IE5VTEwpIHsKLQkJCQkJYXNzZXJ0KGFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9PSBhbyk7Ci0JCQkJCWFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9Ci0JCQkJCQlhby0+cHJldmFyZW5hOwotCQkJCX0KLQkJCQkvKiBSZWNvcmQgdGhhdCB0aGlzIGFyZW5hX29iamVjdCBzbG90IGlzCi0JCQkJICogYXZhaWxhYmxlIHRvIGJlIHJldXNlZC4KLQkJCQkgKi8KLQkJCQlhby0+bmV4dGFyZW5hID0gdW51c2VkX2FyZW5hX29iamVjdHM7Ci0JCQkJdW51c2VkX2FyZW5hX29iamVjdHMgPSBhbzsKKyAgICAgICAgICAgICAgICAvKiBGaXggdGhlIHBvaW50ZXIgaW4gdGhlIHByZXZhcmVuYSwgb3IgdGhlCisgICAgICAgICAgICAgICAgICogdXNhYmxlX2FyZW5hcyBwb2ludGVyLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChhby0+cHJldmFyZW5hID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyA9IGFvLT5uZXh0YXJlbmE7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCh1c2FibGVfYXJlbmFzID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID09IGFvKTsKKyAgICAgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFvLT5uZXh0YXJlbmE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEZpeCB0aGUgcG9pbnRlciBpbiB0aGUgbmV4dGFyZW5hLiAqLworICAgICAgICAgICAgICAgIGlmIChhby0+bmV4dGFyZW5hICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9PSBhbyk7CisgICAgICAgICAgICAgICAgICAgIGFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9CisgICAgICAgICAgICAgICAgICAgICAgICBhby0+cHJldmFyZW5hOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBSZWNvcmQgdGhhdCB0aGlzIGFyZW5hX29iamVjdCBzbG90IGlzCisgICAgICAgICAgICAgICAgICogYXZhaWxhYmxlIHRvIGJlIHJldXNlZC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBhby0+bmV4dGFyZW5hID0gdW51c2VkX2FyZW5hX29iamVjdHM7CisgICAgICAgICAgICAgICAgdW51c2VkX2FyZW5hX29iamVjdHMgPSBhbzsKIAotCQkJCS8qIEZyZWUgdGhlIGVudGlyZSBhcmVuYS4gKi8KLQkJCQlmcmVlKCh2b2lkICopYW8tPmFkZHJlc3MpOwotCQkJCWFvLT5hZGRyZXNzID0gMDsJLyogbWFyayB1bmFzc29jaWF0ZWQgKi8KLQkJCQktLW5hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZDsKKyAgICAgICAgICAgICAgICAvKiBGcmVlIHRoZSBlbnRpcmUgYXJlbmEuICovCisgICAgICAgICAgICAgICAgZnJlZSgodm9pZCAqKWFvLT5hZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBhby0+YWRkcmVzcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWFyayB1bmFzc29jaWF0ZWQgKi8KKyAgICAgICAgICAgICAgICAtLW5hcmVuYXNfY3VycmVudGx5X2FsbG9jYXRlZDsKIAotCQkJCVVOTE9DSygpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChuZiA9PSAxKSB7Ci0JCQkJLyogQ2FzZSAyLiAgUHV0IGFvIGF0IHRoZSBoZWFkIG9mCi0JCQkJICogdXNhYmxlX2FyZW5hcy4gIE5vdGUgdGhhdCBiZWNhdXNlCi0JCQkJICogYW8tPm5mcmVlcG9vbHMgd2FzIDAgYmVmb3JlLCBhbyBpc24ndAotCQkJCSAqIGN1cnJlbnRseSBvbiB0aGUgdXNhYmxlX2FyZW5hcyBsaXN0LgotCQkJCSAqLwotCQkJCWFvLT5uZXh0YXJlbmEgPSB1c2FibGVfYXJlbmFzOwotCQkJCWFvLT5wcmV2YXJlbmEgPSBOVUxMOwotCQkJCWlmICh1c2FibGVfYXJlbmFzKQotCQkJCQl1c2FibGVfYXJlbmFzLT5wcmV2YXJlbmEgPSBhbzsKLQkJCQl1c2FibGVfYXJlbmFzID0gYW87Ci0JCQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMtPmFkZHJlc3MgIT0gMCk7CisgICAgICAgICAgICAgICAgVU5MT0NLKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5mID09IDEpIHsKKyAgICAgICAgICAgICAgICAvKiBDYXNlIDIuICBQdXQgYW8gYXQgdGhlIGhlYWQgb2YKKyAgICAgICAgICAgICAgICAgKiB1c2FibGVfYXJlbmFzLiAgTm90ZSB0aGF0IGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgKiBhby0+bmZyZWVwb29scyB3YXMgMCBiZWZvcmUsIGFvIGlzbid0CisgICAgICAgICAgICAgICAgICogY3VycmVudGx5IG9uIHRoZSB1c2FibGVfYXJlbmFzIGxpc3QuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYW8tPm5leHRhcmVuYSA9IHVzYWJsZV9hcmVuYXM7CisgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYSA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKHVzYWJsZV9hcmVuYXMpCisgICAgICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMtPnByZXZhcmVuYSA9IGFvOworICAgICAgICAgICAgICAgIHVzYWJsZV9hcmVuYXMgPSBhbzsKKyAgICAgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcy0+YWRkcmVzcyAhPSAwKTsKIAotCQkJCVVOTE9DSygpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8qIElmIHRoaXMgYXJlbmEgaXMgbm93IG91dCBvZiBvcmRlciwgd2UgbmVlZCB0byBrZWVwCi0JCQkgKiB0aGUgbGlzdCBzb3J0ZWQuICBUaGUgbGlzdCBpcyBrZXB0IHNvcnRlZCBzbyB0aGF0Ci0JCQkgKiB0aGUgIm1vc3QgZnVsbCIgYXJlbmFzIGFyZSB1c2VkIGZpcnN0LCB3aGljaCBhbGxvd3MKLQkJCSAqIHRoZSBuZWFybHkgZW1wdHkgYXJlbmFzIHRvIGJlIGNvbXBsZXRlbHkgZnJlZWQuICBJbgotCQkJICogYSBmZXcgdW4tc2NpZW50aWZpYyB0ZXN0cywgaXQgc2VlbXMgbGlrZSB0aGlzCi0JCQkgKiBhcHByb2FjaCBhbGxvd2VkIGEgbG90IG1vcmUgbWVtb3J5IHRvIGJlIGZyZWVkLgotCQkJICovCi0JCQlpZiAoYW8tPm5leHRhcmVuYSA9PSBOVUxMIHx8Ci0JCQkJICAgICBuZiA8PSBhby0+bmV4dGFyZW5hLT5uZnJlZXBvb2xzKSB7Ci0JCQkJLyogQ2FzZSA0LiAgTm90aGluZyB0byBkby4gKi8KLQkJCQlVTkxPQ0soKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvKiBDYXNlIDM6ICBXZSBoYXZlIHRvIG1vdmUgdGhlIGFyZW5hIHRvd2FyZHMgdGhlIGVuZAotCQkJICogb2YgdGhlIGxpc3QsIGJlY2F1c2UgaXQgaGFzIG1vcmUgZnJlZSBwb29scyB0aGFuCi0JCQkgKiB0aGUgYXJlbmEgdG8gaXRzIHJpZ2h0LgotCQkJICogRmlyc3QgdW5saW5rIGFvIGZyb20gdXNhYmxlX2FyZW5hcy4KLQkJCSAqLwotCQkJaWYgKGFvLT5wcmV2YXJlbmEgIT0gTlVMTCkgewotCQkJCS8qIGFvIGlzbid0IGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCi0JCQkJYXNzZXJ0KGFvLT5wcmV2YXJlbmEtPm5leHRhcmVuYSA9PSBhbyk7Ci0JCQkJYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID0gYW8tPm5leHRhcmVuYTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qIGFvIGlzIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCi0JCQkJYXNzZXJ0KHVzYWJsZV9hcmVuYXMgPT0gYW8pOwotCQkJCXVzYWJsZV9hcmVuYXMgPSBhby0+bmV4dGFyZW5hOwotCQkJfQotCQkJYW8tPm5leHRhcmVuYS0+cHJldmFyZW5hID0gYW8tPnByZXZhcmVuYTsKKyAgICAgICAgICAgICAgICBVTkxPQ0soKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBJZiB0aGlzIGFyZW5hIGlzIG5vdyBvdXQgb2Ygb3JkZXIsIHdlIG5lZWQgdG8ga2VlcAorICAgICAgICAgICAgICogdGhlIGxpc3Qgc29ydGVkLiAgVGhlIGxpc3QgaXMga2VwdCBzb3J0ZWQgc28gdGhhdAorICAgICAgICAgICAgICogdGhlICJtb3N0IGZ1bGwiIGFyZW5hcyBhcmUgdXNlZCBmaXJzdCwgd2hpY2ggYWxsb3dzCisgICAgICAgICAgICAgKiB0aGUgbmVhcmx5IGVtcHR5IGFyZW5hcyB0byBiZSBjb21wbGV0ZWx5IGZyZWVkLiAgSW4KKyAgICAgICAgICAgICAqIGEgZmV3IHVuLXNjaWVudGlmaWMgdGVzdHMsIGl0IHNlZW1zIGxpa2UgdGhpcworICAgICAgICAgICAgICogYXBwcm9hY2ggYWxsb3dlZCBhIGxvdCBtb3JlIG1lbW9yeSB0byBiZSBmcmVlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKGFvLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG5mIDw9IGFvLT5uZXh0YXJlbmEtPm5mcmVlcG9vbHMpIHsKKyAgICAgICAgICAgICAgICAvKiBDYXNlIDQuICBOb3RoaW5nIHRvIGRvLiAqLworICAgICAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIENhc2UgMzogIFdlIGhhdmUgdG8gbW92ZSB0aGUgYXJlbmEgdG93YXJkcyB0aGUgZW5kCisgICAgICAgICAgICAgKiBvZiB0aGUgbGlzdCwgYmVjYXVzZSBpdCBoYXMgbW9yZSBmcmVlIHBvb2xzIHRoYW4KKyAgICAgICAgICAgICAqIHRoZSBhcmVuYSB0byBpdHMgcmlnaHQuCisgICAgICAgICAgICAgKiBGaXJzdCB1bmxpbmsgYW8gZnJvbSB1c2FibGVfYXJlbmFzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoYW8tPnByZXZhcmVuYSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogYW8gaXNuJ3QgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQoYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID09IGFvKTsKKyAgICAgICAgICAgICAgICBhby0+cHJldmFyZW5hLT5uZXh0YXJlbmEgPSBhby0+bmV4dGFyZW5hOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogYW8gaXMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQodXNhYmxlX2FyZW5hcyA9PSBhbyk7CisgICAgICAgICAgICAgICAgdXNhYmxlX2FyZW5hcyA9IGFvLT5uZXh0YXJlbmE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhby0+bmV4dGFyZW5hLT5wcmV2YXJlbmEgPSBhby0+cHJldmFyZW5hOwogCi0JCQkvKiBMb2NhdGUgdGhlIG5ldyBpbnNlcnRpb24gcG9pbnQgYnkgaXRlcmF0aW5nIG92ZXIKLQkJCSAqIHRoZSBsaXN0LCB1c2luZyBvdXIgbmV4dGFyZW5hIHBvaW50ZXIuCi0JCQkgKi8KLQkJCXdoaWxlIChhby0+bmV4dGFyZW5hICE9IE5VTEwgJiYKLQkJCQkJbmYgPiBhby0+bmV4dGFyZW5hLT5uZnJlZXBvb2xzKSB7Ci0JCQkJYW8tPnByZXZhcmVuYSA9IGFvLT5uZXh0YXJlbmE7Ci0JCQkJYW8tPm5leHRhcmVuYSA9IGFvLT5uZXh0YXJlbmEtPm5leHRhcmVuYTsKLQkJCX0KKyAgICAgICAgICAgIC8qIExvY2F0ZSB0aGUgbmV3IGluc2VydGlvbiBwb2ludCBieSBpdGVyYXRpbmcgb3ZlcgorICAgICAgICAgICAgICogdGhlIGxpc3QsIHVzaW5nIG91ciBuZXh0YXJlbmEgcG9pbnRlci4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgd2hpbGUgKGFvLT5uZXh0YXJlbmEgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mID4gYW8tPm5leHRhcmVuYS0+bmZyZWVwb29scykgeworICAgICAgICAgICAgICAgIGFvLT5wcmV2YXJlbmEgPSBhby0+bmV4dGFyZW5hOworICAgICAgICAgICAgICAgIGFvLT5uZXh0YXJlbmEgPSBhby0+bmV4dGFyZW5hLT5uZXh0YXJlbmE7CisgICAgICAgICAgICB9CiAKLQkJCS8qIEluc2VydCBhbyBhdCB0aGlzIHBvaW50LiAqLwotCQkJYXNzZXJ0KGFvLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAotCQkJCWFvLT5wcmV2YXJlbmEgPT0gYW8tPm5leHRhcmVuYS0+cHJldmFyZW5hKTsKLQkJCWFzc2VydChhby0+cHJldmFyZW5hLT5uZXh0YXJlbmEgPT0gYW8tPm5leHRhcmVuYSk7CisgICAgICAgICAgICAvKiBJbnNlcnQgYW8gYXQgdGhpcyBwb2ludC4gKi8KKyAgICAgICAgICAgIGFzc2VydChhby0+bmV4dGFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBhby0+cHJldmFyZW5hID09IGFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSk7CisgICAgICAgICAgICBhc3NlcnQoYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID09IGFvLT5uZXh0YXJlbmEpOwogCi0JCQlhby0+cHJldmFyZW5hLT5uZXh0YXJlbmEgPSBhbzsKLQkJCWlmIChhby0+bmV4dGFyZW5hICE9IE5VTEwpCi0JCQkJYW8tPm5leHRhcmVuYS0+cHJldmFyZW5hID0gYW87CisgICAgICAgICAgICBhby0+cHJldmFyZW5hLT5uZXh0YXJlbmEgPSBhbzsKKyAgICAgICAgICAgIGlmIChhby0+bmV4dGFyZW5hICE9IE5VTEwpCisgICAgICAgICAgICAgICAgYW8tPm5leHRhcmVuYS0+cHJldmFyZW5hID0gYW87CiAKLQkJCS8qIFZlcmlmeSB0aGF0IHRoZSBzd2FwcyB3b3JrZWQuICovCi0JCQlhc3NlcnQoYW8tPm5leHRhcmVuYSA9PSBOVUxMIHx8Ci0JCQkJICBuZiA8PSBhby0+bmV4dGFyZW5hLT5uZnJlZXBvb2xzKTsKLQkJCWFzc2VydChhby0+cHJldmFyZW5hID09IE5VTEwgfHwKLQkJCQkgIG5mID4gYW8tPnByZXZhcmVuYS0+bmZyZWVwb29scyk7Ci0JCQlhc3NlcnQoYW8tPm5leHRhcmVuYSA9PSBOVUxMIHx8Ci0JCQkJYW8tPm5leHRhcmVuYS0+cHJldmFyZW5hID09IGFvKTsKLQkJCWFzc2VydCgodXNhYmxlX2FyZW5hcyA9PSBhbyAmJgotCQkJCWFvLT5wcmV2YXJlbmEgPT0gTlVMTCkgfHwKLQkJCQlhby0+cHJldmFyZW5hLT5uZXh0YXJlbmEgPT0gYW8pOworICAgICAgICAgICAgLyogVmVyaWZ5IHRoYXQgdGhlIHN3YXBzIHdvcmtlZC4gKi8KKyAgICAgICAgICAgIGFzc2VydChhby0+bmV4dGFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICBuZiA8PSBhby0+bmV4dGFyZW5hLT5uZnJlZXBvb2xzKTsKKyAgICAgICAgICAgIGFzc2VydChhby0+cHJldmFyZW5hID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgICBuZiA+IGFvLT5wcmV2YXJlbmEtPm5mcmVlcG9vbHMpOworICAgICAgICAgICAgYXNzZXJ0KGFvLT5uZXh0YXJlbmEgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIGFvLT5uZXh0YXJlbmEtPnByZXZhcmVuYSA9PSBhbyk7CisgICAgICAgICAgICBhc3NlcnQoKHVzYWJsZV9hcmVuYXMgPT0gYW8gJiYKKyAgICAgICAgICAgICAgICBhby0+cHJldmFyZW5hID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgYW8tPnByZXZhcmVuYS0+bmV4dGFyZW5hID09IGFvKTsKIAotCQkJVU5MT0NLKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyogUG9vbCB3YXMgZnVsbCwgc28gZG9lc24ndCBjdXJyZW50bHkgbGl2ZSBpbiBhbnkgbGlzdDoKLQkJICogbGluayBpdCB0byB0aGUgZnJvbnQgb2YgdGhlIGFwcHJvcHJpYXRlIHVzZWRwb29sc1tdIGxpc3QuCi0JCSAqIFRoaXMgbWltaWNzIExSVSBwb29sIHVzYWdlIGZvciBuZXcgYWxsb2NhdGlvbnMgYW5kCi0JCSAqIHRhcmdldHMgb3B0aW1hbCBmaWxsaW5nIHdoZW4gc2V2ZXJhbCBwb29scyBjb250YWluCi0JCSAqIGJsb2NrcyBvZiB0aGUgc2FtZSBzaXplIGNsYXNzLgotCQkgKi8KLQkJLS1wb29sLT5yZWYuY291bnQ7Ci0JCWFzc2VydChwb29sLT5yZWYuY291bnQgPiAwKTsJLyogZWxzZSB0aGUgcG9vbCBpcyBlbXB0eSAqLwotCQlzaXplID0gcG9vbC0+c3ppZHg7Ci0JCW5leHQgPSB1c2VkcG9vbHNbc2l6ZSArIHNpemVdOwotCQlwcmV2ID0gbmV4dC0+cHJldnBvb2w7Ci0JCS8qIGluc2VydCBwb29sIGJlZm9yZSBuZXh0OiAgIHByZXYgPC0+IHBvb2wgPC0+IG5leHQgKi8KLQkJcG9vbC0+bmV4dHBvb2wgPSBuZXh0OwotCQlwb29sLT5wcmV2cG9vbCA9IHByZXY7Ci0JCW5leHQtPnByZXZwb29sID0gcG9vbDsKLQkJcHJldi0+bmV4dHBvb2wgPSBwb29sOwotCQlVTkxPQ0soKTsKLQkJcmV0dXJuOwotCX0KKyAgICAgICAgICAgIFVOTE9DSygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qIFBvb2wgd2FzIGZ1bGwsIHNvIGRvZXNuJ3QgY3VycmVudGx5IGxpdmUgaW4gYW55IGxpc3Q6CisgICAgICAgICAqIGxpbmsgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBhcHByb3ByaWF0ZSB1c2VkcG9vbHNbXSBsaXN0LgorICAgICAgICAgKiBUaGlzIG1pbWljcyBMUlUgcG9vbCB1c2FnZSBmb3IgbmV3IGFsbG9jYXRpb25zIGFuZAorICAgICAgICAgKiB0YXJnZXRzIG9wdGltYWwgZmlsbGluZyB3aGVuIHNldmVyYWwgcG9vbHMgY29udGFpbgorICAgICAgICAgKiBibG9ja3Mgb2YgdGhlIHNhbWUgc2l6ZSBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIC0tcG9vbC0+cmVmLmNvdW50OworICAgICAgICBhc3NlcnQocG9vbC0+cmVmLmNvdW50ID4gMCk7ICAgICAgICAgICAgLyogZWxzZSB0aGUgcG9vbCBpcyBlbXB0eSAqLworICAgICAgICBzaXplID0gcG9vbC0+c3ppZHg7CisgICAgICAgIG5leHQgPSB1c2VkcG9vbHNbc2l6ZSArIHNpemVdOworICAgICAgICBwcmV2ID0gbmV4dC0+cHJldnBvb2w7CisgICAgICAgIC8qIGluc2VydCBwb29sIGJlZm9yZSBuZXh0OiAgIHByZXYgPC0+IHBvb2wgPC0+IG5leHQgKi8KKyAgICAgICAgcG9vbC0+bmV4dHBvb2wgPSBuZXh0OworICAgICAgICBwb29sLT5wcmV2cG9vbCA9IHByZXY7CisgICAgICAgIG5leHQtPnByZXZwb29sID0gcG9vbDsKKyAgICAgICAgcHJldi0+bmV4dHBvb2wgPSBwb29sOworICAgICAgICBVTkxPQ0soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCS8qIFdlIGRpZG4ndCBhbGxvY2F0ZSB0aGlzIGFkZHJlc3MuICovCi0JZnJlZShwKTsKKyAgICAvKiBXZSBkaWRuJ3QgYWxsb2NhdGUgdGhpcyBhZGRyZXNzLiAqLworICAgIGZyZWUocCk7CiB9CiAKIC8qIHJlYWxsb2MuICBJZiBwIGlzIE5VTEwsIHRoaXMgYWN0cyBsaWtlIG1hbGxvYyhuYnl0ZXMpLiAgRWxzZSBpZiBuYnl0ZXM9PTAsCkBAIC0xMTM0LDcyICsxMTM0LDcyIEBACiB2b2lkICoKIFB5T2JqZWN0X1JlYWxsb2Modm9pZCAqcCwgc2l6ZV90IG5ieXRlcykKIHsKLQl2b2lkICpicDsKLQlwb29scCBwb29sOwotCXNpemVfdCBzaXplOworICAgIHZvaWQgKmJwOworICAgIHBvb2xwIHBvb2w7CisgICAgc2l6ZV90IHNpemU7CiAKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gUHlPYmplY3RfTWFsbG9jKG5ieXRlcyk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X01hbGxvYyhuYnl0ZXMpOwogCi0JLyoKLQkgKiBMaW1pdCBvdXJzZWx2ZXMgdG8gUFlfU1NJWkVfVF9NQVggYnl0ZXMgdG8gcHJldmVudCBzZWN1cml0eSBob2xlcy4KLQkgKiBNb3N0IHB5dGhvbiBpbnRlcm5hbHMgYmxpbmRseSB1c2UgYSBzaWduZWQgUHlfc3NpemVfdCB0byB0cmFjawotCSAqIHRoaW5ncyB3aXRob3V0IGNoZWNraW5nIGZvciBvdmVyZmxvd3Mgb3IgbmVnYXRpdmVzLgotCSAqIEFzIHNpemVfdCBpcyB1bnNpZ25lZCwgY2hlY2tpbmcgZm9yIG5ieXRlcyA8IDAgaXMgbm90IHJlcXVpcmVkLgotCSAqLwotCWlmIChuYnl0ZXMgPiBQWV9TU0laRV9UX01BWCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyoKKyAgICAgKiBMaW1pdCBvdXJzZWx2ZXMgdG8gUFlfU1NJWkVfVF9NQVggYnl0ZXMgdG8gcHJldmVudCBzZWN1cml0eSBob2xlcy4KKyAgICAgKiBNb3N0IHB5dGhvbiBpbnRlcm5hbHMgYmxpbmRseSB1c2UgYSBzaWduZWQgUHlfc3NpemVfdCB0byB0cmFjaworICAgICAqIHRoaW5ncyB3aXRob3V0IGNoZWNraW5nIGZvciBvdmVyZmxvd3Mgb3IgbmVnYXRpdmVzLgorICAgICAqIEFzIHNpemVfdCBpcyB1bnNpZ25lZCwgY2hlY2tpbmcgZm9yIG5ieXRlcyA8IDAgaXMgbm90IHJlcXVpcmVkLgorICAgICAqLworICAgIGlmIChuYnl0ZXMgPiBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlwb29sID0gUE9PTF9BRERSKHApOwotCWlmIChQeV9BRERSRVNTX0lOX1JBTkdFKHAsIHBvb2wpKSB7Ci0JCS8qIFdlJ3JlIGluIGNoYXJnZSBvZiB0aGlzIGJsb2NrICovCi0JCXNpemUgPSBJTkRFWDJTSVpFKHBvb2wtPnN6aWR4KTsKLQkJaWYgKG5ieXRlcyA8PSBzaXplKSB7Ci0JCQkvKiBUaGUgYmxvY2sgaXMgc3RheWluZyB0aGUgc2FtZSBvciBzaHJpbmtpbmcuICBJZgotCQkJICogaXQncyBzaHJpbmtpbmcsIHRoZXJlJ3MgYSB0cmFkZW9mZjogIGl0IGNvc3RzCi0JCQkgKiBjeWNsZXMgdG8gY29weSB0aGUgYmxvY2sgdG8gYSBzbWFsbGVyIHNpemUgY2xhc3MsCi0JCQkgKiBidXQgaXQgd2FzdGVzIG1lbW9yeSBub3QgdG8gY29weSBpdC4gIFRoZQotCQkJICogY29tcHJvbWlzZSBoZXJlIGlzIHRvIGNvcHkgb24gc2hyaW5rIG9ubHkgaWYgYXQKLQkJCSAqIGxlYXN0IDI1JSBvZiBzaXplIGNhbiBiZSBzaGF2ZWQgb2ZmLgotCQkJICovCi0JCQlpZiAoNCAqIG5ieXRlcyA+IDMgKiBzaXplKSB7Ci0JCQkJLyogSXQncyB0aGUgc2FtZSwKLQkJCQkgKiBvciBzaHJpbmtpbmcgYW5kIG5ldy9vbGQgPiAzLzQuCi0JCQkJICovCi0JCQkJcmV0dXJuIHA7Ci0JCQl9Ci0JCQlzaXplID0gbmJ5dGVzOwotCQl9Ci0JCWJwID0gUHlPYmplY3RfTWFsbG9jKG5ieXRlcyk7Ci0JCWlmIChicCAhPSBOVUxMKSB7Ci0JCQltZW1jcHkoYnAsIHAsIHNpemUpOwotCQkJUHlPYmplY3RfRnJlZShwKTsKLQkJfQotCQlyZXR1cm4gYnA7Ci0JfQotCS8qIFdlJ3JlIG5vdCBtYW5hZ2luZyB0aGlzIGJsb2NrLiAgSWYgbmJ5dGVzIDw9Ci0JICogU01BTExfUkVRVUVTVF9USFJFU0hPTEQsIGl0J3MgdGVtcHRpbmcgdG8gdHJ5IHRvIHRha2Ugb3ZlciB0aGlzCi0JICogYmxvY2suICBIb3dldmVyLCBpZiB3ZSBkbywgd2UgbmVlZCB0byBjb3B5IHRoZSB2YWxpZCBkYXRhIGZyb20KLQkgKiB0aGUgQy1tYW5hZ2VkIGJsb2NrIHRvIG9uZSBvZiBvdXIgYmxvY2tzLCBhbmQgdGhlcmUncyBubyBwb3J0YWJsZQotCSAqIHdheSB0byBrbm93IGhvdyBtdWNoIG9mIHRoZSBtZW1vcnkgc3BhY2Ugc3RhcnRpbmcgYXQgcCBpcyB2YWxpZC4KLQkgKiBBcyBidWcgMTE4NTg4MyBwb2ludGVkIG91dCB0aGUgaGFyZCB3YXksIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKLQkgKiBDLW1hbmFnZWQgYmxvY2sgaXMgImF0IHRoZSBlbmQiIG9mIGFsbG9jYXRlZCBWTSBzcGFjZSwgc28gdGhhdAotCSAqIGEgbWVtb3J5IGZhdWx0IGNhbiBvY2N1ciBpZiB3ZSB0cnkgdG8gY29weSBuYnl0ZXMgYnl0ZXMgc3RhcnRpbmcKLQkgKiBhdCBwLiAgSW5zdGVhZCB3ZSBwdW50OiAgbGV0IEMgY29udGludWUgdG8gbWFuYWdlIHRoaXMgYmxvY2suCi0gICAgICAgICAqLwotCWlmIChuYnl0ZXMpCi0JCXJldHVybiByZWFsbG9jKHAsIG5ieXRlcyk7Ci0JLyogQyBkb2Vzbid0IGRlZmluZSB0aGUgcmVzdWx0IG9mIHJlYWxsb2MocCwgMCkgKGl0IG1heSBvciBtYXkgbm90Ci0JICogcmV0dXJuIE5VTEwgdGhlbiksIGJ1dCBQeXRob24ncyBkb2NzIHByb21pc2UgdGhhdCBuYnl0ZXM9PTAgbmV2ZXIKLQkgKiByZXR1cm5zIE5VTEwuICBXZSBkb24ndCBwYXNzIDAgdG8gcmVhbGxvYygpLCB0byBhdm9pZCB0aGF0IGVuZGNhc2UKLQkgKiB0byBiZWdpbiB3aXRoLiAgRXZlbiB0aGVuLCB3ZSBjYW4ndCBiZSBzdXJlIHRoYXQgcmVhbGxvYygpIHdvbid0Ci0JICogcmV0dXJuIE5VTEwuCi0JICovCi0JYnAgPSByZWFsbG9jKHAsIDEpOwotICAgCXJldHVybiBicCA/IGJwIDogcDsKKyAgICBwb29sID0gUE9PTF9BRERSKHApOworICAgIGlmIChQeV9BRERSRVNTX0lOX1JBTkdFKHAsIHBvb2wpKSB7CisgICAgICAgIC8qIFdlJ3JlIGluIGNoYXJnZSBvZiB0aGlzIGJsb2NrICovCisgICAgICAgIHNpemUgPSBJTkRFWDJTSVpFKHBvb2wtPnN6aWR4KTsKKyAgICAgICAgaWYgKG5ieXRlcyA8PSBzaXplKSB7CisgICAgICAgICAgICAvKiBUaGUgYmxvY2sgaXMgc3RheWluZyB0aGUgc2FtZSBvciBzaHJpbmtpbmcuICBJZgorICAgICAgICAgICAgICogaXQncyBzaHJpbmtpbmcsIHRoZXJlJ3MgYSB0cmFkZW9mZjogIGl0IGNvc3RzCisgICAgICAgICAgICAgKiBjeWNsZXMgdG8gY29weSB0aGUgYmxvY2sgdG8gYSBzbWFsbGVyIHNpemUgY2xhc3MsCisgICAgICAgICAgICAgKiBidXQgaXQgd2FzdGVzIG1lbW9yeSBub3QgdG8gY29weSBpdC4gIFRoZQorICAgICAgICAgICAgICogY29tcHJvbWlzZSBoZXJlIGlzIHRvIGNvcHkgb24gc2hyaW5rIG9ubHkgaWYgYXQKKyAgICAgICAgICAgICAqIGxlYXN0IDI1JSBvZiBzaXplIGNhbiBiZSBzaGF2ZWQgb2ZmLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoNCAqIG5ieXRlcyA+IDMgKiBzaXplKSB7CisgICAgICAgICAgICAgICAgLyogSXQncyB0aGUgc2FtZSwKKyAgICAgICAgICAgICAgICAgKiBvciBzaHJpbmtpbmcgYW5kIG5ldy9vbGQgPiAzLzQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplID0gbmJ5dGVzOworICAgICAgICB9CisgICAgICAgIGJwID0gUHlPYmplY3RfTWFsbG9jKG5ieXRlcyk7CisgICAgICAgIGlmIChicCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtZW1jcHkoYnAsIHAsIHNpemUpOworICAgICAgICAgICAgUHlPYmplY3RfRnJlZShwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnA7CisgICAgfQorICAgIC8qIFdlJ3JlIG5vdCBtYW5hZ2luZyB0aGlzIGJsb2NrLiAgSWYgbmJ5dGVzIDw9CisgICAgICogU01BTExfUkVRVUVTVF9USFJFU0hPTEQsIGl0J3MgdGVtcHRpbmcgdG8gdHJ5IHRvIHRha2Ugb3ZlciB0aGlzCisgICAgICogYmxvY2suICBIb3dldmVyLCBpZiB3ZSBkbywgd2UgbmVlZCB0byBjb3B5IHRoZSB2YWxpZCBkYXRhIGZyb20KKyAgICAgKiB0aGUgQy1tYW5hZ2VkIGJsb2NrIHRvIG9uZSBvZiBvdXIgYmxvY2tzLCBhbmQgdGhlcmUncyBubyBwb3J0YWJsZQorICAgICAqIHdheSB0byBrbm93IGhvdyBtdWNoIG9mIHRoZSBtZW1vcnkgc3BhY2Ugc3RhcnRpbmcgYXQgcCBpcyB2YWxpZC4KKyAgICAgKiBBcyBidWcgMTE4NTg4MyBwb2ludGVkIG91dCB0aGUgaGFyZCB3YXksIGl0J3MgcG9zc2libGUgdGhhdCB0aGUKKyAgICAgKiBDLW1hbmFnZWQgYmxvY2sgaXMgImF0IHRoZSBlbmQiIG9mIGFsbG9jYXRlZCBWTSBzcGFjZSwgc28gdGhhdAorICAgICAqIGEgbWVtb3J5IGZhdWx0IGNhbiBvY2N1ciBpZiB3ZSB0cnkgdG8gY29weSBuYnl0ZXMgYnl0ZXMgc3RhcnRpbmcKKyAgICAgKiBhdCBwLiAgSW5zdGVhZCB3ZSBwdW50OiAgbGV0IEMgY29udGludWUgdG8gbWFuYWdlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgaWYgKG5ieXRlcykKKyAgICAgICAgcmV0dXJuIHJlYWxsb2MocCwgbmJ5dGVzKTsKKyAgICAvKiBDIGRvZXNuJ3QgZGVmaW5lIHRoZSByZXN1bHQgb2YgcmVhbGxvYyhwLCAwKSAoaXQgbWF5IG9yIG1heSBub3QKKyAgICAgKiByZXR1cm4gTlVMTCB0aGVuKSwgYnV0IFB5dGhvbidzIGRvY3MgcHJvbWlzZSB0aGF0IG5ieXRlcz09MCBuZXZlcgorICAgICAqIHJldHVybnMgTlVMTC4gIFdlIGRvbid0IHBhc3MgMCB0byByZWFsbG9jKCksIHRvIGF2b2lkIHRoYXQgZW5kY2FzZQorICAgICAqIHRvIGJlZ2luIHdpdGguICBFdmVuIHRoZW4sIHdlIGNhbid0IGJlIHN1cmUgdGhhdCByZWFsbG9jKCkgd29uJ3QKKyAgICAgKiByZXR1cm4gTlVMTC4KKyAgICAgKi8KKyAgICBicCA9IHJlYWxsb2MocCwgMSk7CisgICAgcmV0dXJuIGJwID8gYnAgOiBwOwogfQogCi0jZWxzZQkvKiAhIFdJVEhfUFlNQUxMT0MgKi8KKyNlbHNlICAgLyogISBXSVRIX1BZTUFMTE9DICovCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogLyogcHltYWxsb2Mgbm90IGVuYWJsZWQ6ICBSZWRpcmVjdCB0aGUgZW50cnkgcG9pbnRzIHRvIG1hbGxvYy4gIFRoZXNlIHdpbGwKQEAgLTEyMDgsMTkgKzEyMDgsMTkgQEAKIHZvaWQgKgogUHlPYmplY3RfTWFsbG9jKHNpemVfdCBuKQogewotCXJldHVybiBQeU1lbV9NQUxMT0Mobik7CisgICAgcmV0dXJuIFB5TWVtX01BTExPQyhuKTsKIH0KIAogdm9pZCAqCiBQeU9iamVjdF9SZWFsbG9jKHZvaWQgKnAsIHNpemVfdCBuKQogewotCXJldHVybiBQeU1lbV9SRUFMTE9DKHAsIG4pOworICAgIHJldHVybiBQeU1lbV9SRUFMTE9DKHAsIG4pOwogfQogCiB2b2lkCiBQeU9iamVjdF9GcmVlKHZvaWQgKnApCiB7Ci0JUHlNZW1fRlJFRShwKTsKKyAgICBQeU1lbV9GUkVFKHApOwogfQogI2VuZGlmIC8qIFdJVEhfUFlNQUxMT0MgKi8KIApAQCAtMTI0MSw3ICsxMjQxLDcgQEAKICNkZWZpbmUgREVBREJZVEUgICAgICAgMHhEQiAgICAvKiBkZWFkIChuZXdseSBmcmVlZCkgbWVtb3J5ICovCiAjZGVmaW5lIEZPUkJJRERFTkJZVEUgIDB4RkIgICAgLyogdW50b3VjaGFibGUgYnl0ZXMgYXQgZWFjaCBlbmQgb2YgYSBibG9jayAqLwogCi1zdGF0aWMgc2l6ZV90IHNlcmlhbG5vID0gMDsJLyogaW5jcmVtZW50ZWQgb24gZWFjaCBkZWJ1ZyB7bSxyZX1hbGxvYyAqLworc3RhdGljIHNpemVfdCBzZXJpYWxubyA9IDA7ICAgICAvKiBpbmNyZW1lbnRlZCBvbiBlYWNoIGRlYnVnIHttLHJlfWFsbG9jICovCiAKIC8qIHNlcmlhbG5vIGlzIGFsd2F5cyBpbmNyZW1lbnRlZCB2aWEgY2FsbGluZyB0aGlzIHJvdXRpbmUuICBUaGUgcG9pbnQgaXMKICAqIHRvIHN1cHBseSBhIHNpbmdsZSBwbGFjZSB0byBzZXQgYSBicmVha3BvaW50LgpAQCAtMTI0OSw3ICsxMjQ5LDcgQEAKIHN0YXRpYyB2b2lkCiBidW1wc2VyaWFsbm8odm9pZCkKIHsKLQkrK3NlcmlhbG5vOworICAgICsrc2VyaWFsbm87CiB9CiAKICNkZWZpbmUgU1NUIFNJWkVPRl9TSVpFX1QKQEAgLTEyNTgsMTMgKzEyNTgsMTMgQEAKIHN0YXRpYyBzaXplX3QKIHJlYWRfc2l6ZV90KGNvbnN0IHZvaWQgKnApCiB7Ci0JY29uc3QgdWNoYXIgKnEgPSAoY29uc3QgdWNoYXIgKilwOwotCXNpemVfdCByZXN1bHQgPSAqcSsrOwotCWludCBpOworICAgIGNvbnN0IHVjaGFyICpxID0gKGNvbnN0IHVjaGFyICopcDsKKyAgICBzaXplX3QgcmVzdWx0ID0gKnErKzsKKyAgICBpbnQgaTsKIAotCWZvciAoaSA9IFNTVDsgLS1pID4gMDsgKytxKQotCQlyZXN1bHQgPSAocmVzdWx0IDw8IDgpIHwgKnE7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKGkgPSBTU1Q7IC0taSA+IDA7ICsrcSkKKyAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8ICpxOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFdyaXRlIG4gYXMgYSBiaWctZW5kaWFuIHNpemVfdCwgTVNCIGF0IGFkZHJlc3MgcCwgTFNCIGF0CkBAIC0xMjczLDEzICsxMjczLDEzIEBACiBzdGF0aWMgdm9pZAogd3JpdGVfc2l6ZV90KHZvaWQgKnAsIHNpemVfdCBuKQogewotCXVjaGFyICpxID0gKHVjaGFyICopcCArIFNTVCAtIDE7Ci0JaW50IGk7CisgICAgdWNoYXIgKnEgPSAodWNoYXIgKilwICsgU1NUIC0gMTsKKyAgICBpbnQgaTsKIAotCWZvciAoaSA9IFNTVDsgLS1pID49IDA7IC0tcSkgewotCQkqcSA9ICh1Y2hhcikobiAmIDB4ZmYpOwotCQluID4+PSA4OwotCX0KKyAgICBmb3IgKGkgPSBTU1Q7IC0taSA+PSAwOyAtLXEpIHsKKyAgICAgICAgKnEgPSAodWNoYXIpKG4gJiAweGZmKTsKKyAgICAgICAgbiA+Pj0gODsKKyAgICB9CiB9CiAKICNpZmRlZiBQeV9ERUJVRwpAQCAtMTI5MCwyMiArMTI5MCwyMiBAQAogc3RhdGljIGludAogcG9vbF9pc19pbl9saXN0KGNvbnN0IHBvb2xwIHRhcmdldCwgcG9vbHAgbGlzdCkKIHsKLQlwb29scCBvcmlnbGlzdCA9IGxpc3Q7Ci0JYXNzZXJ0KHRhcmdldCAhPSBOVUxMKTsKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlkbyB7Ci0JCWlmICh0YXJnZXQgPT0gbGlzdCkKLQkJCXJldHVybiAxOwotCQlsaXN0ID0gbGlzdC0+bmV4dHBvb2w7Ci0JfSB3aGlsZSAobGlzdCAhPSBOVUxMICYmIGxpc3QgIT0gb3JpZ2xpc3QpOwotCXJldHVybiAwOworICAgIHBvb2xwIG9yaWdsaXN0ID0gbGlzdDsKKyAgICBhc3NlcnQodGFyZ2V0ICE9IE5VTEwpOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGRvIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBsaXN0KQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0cG9vbDsKKyAgICB9IHdoaWxlIChsaXN0ICE9IE5VTEwgJiYgbGlzdCAhPSBvcmlnbGlzdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKICNlbHNlCiAjZGVmaW5lIHBvb2xfaXNfaW5fbGlzdChYLCBZKSAxCiAKLSNlbmRpZgkvKiBQeV9ERUJVRyAqLworI2VuZGlmICAvKiBQeV9ERUJVRyAqLwogCiAvKiBMZXQgUyA9IHNpemVvZihzaXplX3QpLiAgVGhlIGRlYnVnIG1hbGxvYyBhc2tzIGZvciA0KlMgZXh0cmEgYnl0ZXMgYW5kCiAgICBmaWxscyB0aGVtIHdpdGggdXNlZnVsIHN0dWZmLCBoZXJlIGNhbGxpbmcgdGhlIHVuZGVybHlpbmcgbWFsbG9jJ3MgcmVzdWx0IHA6CkBAIC0xMzM0LDMxICsxMzM0LDMxIEBACiB2b2lkICoKIF9QeU9iamVjdF9EZWJ1Z01hbGxvYyhzaXplX3QgbmJ5dGVzKQogewotCXVjaGFyICpwOwkvKiBiYXNlIGFkZHJlc3Mgb2YgbWFsbG9jJ2VkIGJsb2NrICovCi0JdWNoYXIgKnRhaWw7CS8qIHAgKyAyKlNTVCArIG5ieXRlcyA9PSBwb2ludGVyIHRvIHRhaWwgcGFkIGJ5dGVzICovCi0Jc2l6ZV90IHRvdGFsOwkvKiBuYnl0ZXMgKyA0KlNTVCAqLworICAgIHVjaGFyICpwOyAgICAgICAgICAgLyogYmFzZSBhZGRyZXNzIG9mIG1hbGxvYydlZCBibG9jayAqLworICAgIHVjaGFyICp0YWlsOyAgICAgICAgLyogcCArIDIqU1NUICsgbmJ5dGVzID09IHBvaW50ZXIgdG8gdGFpbCBwYWQgYnl0ZXMgKi8KKyAgICBzaXplX3QgdG90YWw7ICAgICAgIC8qIG5ieXRlcyArIDQqU1NUICovCiAKLQlidW1wc2VyaWFsbm8oKTsKLQl0b3RhbCA9IG5ieXRlcyArIDQqU1NUOwotCWlmICh0b3RhbCA8IG5ieXRlcykKLQkJLyogb3ZlcmZsb3c6ICBjYW4ndCByZXByZXNlbnQgdG90YWwgYXMgYSBzaXplX3QgKi8KLQkJcmV0dXJuIE5VTEw7CisgICAgYnVtcHNlcmlhbG5vKCk7CisgICAgdG90YWwgPSBuYnl0ZXMgKyA0KlNTVDsKKyAgICBpZiAodG90YWwgPCBuYnl0ZXMpCisgICAgICAgIC8qIG92ZXJmbG93OiAgY2FuJ3QgcmVwcmVzZW50IHRvdGFsIGFzIGEgc2l6ZV90ICovCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcCA9ICh1Y2hhciAqKVB5T2JqZWN0X01hbGxvYyh0b3RhbCk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcCA9ICh1Y2hhciAqKVB5T2JqZWN0X01hbGxvYyh0b3RhbCk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl3cml0ZV9zaXplX3QocCwgbmJ5dGVzKTsKLQltZW1zZXQocCArIFNTVCwgRk9SQklEREVOQllURSwgU1NUKTsKKyAgICB3cml0ZV9zaXplX3QocCwgbmJ5dGVzKTsKKyAgICBtZW1zZXQocCArIFNTVCwgRk9SQklEREVOQllURSwgU1NUKTsKIAotCWlmIChuYnl0ZXMgPiAwKQotCQltZW1zZXQocCArIDIqU1NULCBDTEVBTkJZVEUsIG5ieXRlcyk7CisgICAgaWYgKG5ieXRlcyA+IDApCisgICAgICAgIG1lbXNldChwICsgMipTU1QsIENMRUFOQllURSwgbmJ5dGVzKTsKIAotCXRhaWwgPSBwICsgMipTU1QgKyBuYnl0ZXM7Ci0JbWVtc2V0KHRhaWwsIEZPUkJJRERFTkJZVEUsIFNTVCk7Ci0Jd3JpdGVfc2l6ZV90KHRhaWwgKyBTU1QsIHNlcmlhbG5vKTsKKyAgICB0YWlsID0gcCArIDIqU1NUICsgbmJ5dGVzOworICAgIG1lbXNldCh0YWlsLCBGT1JCSURERU5CWVRFLCBTU1QpOworICAgIHdyaXRlX3NpemVfdCh0YWlsICsgU1NULCBzZXJpYWxubyk7CiAKLQlyZXR1cm4gcCArIDIqU1NUOworICAgIHJldHVybiBwICsgMipTU1Q7CiB9CiAKIC8qIFRoZSBkZWJ1ZyBmcmVlIGZpcnN0IGNoZWNrcyB0aGUgMipTU1QgYnl0ZXMgb24gZWFjaCBlbmQgZm9yIHNhbml0eSAoaW4KQEAgLTEzNjksNjMgKzEzNjksNjMgQEAKIHZvaWQKIF9QeU9iamVjdF9EZWJ1Z0ZyZWUodm9pZCAqcCkKIHsKLQl1Y2hhciAqcSA9ICh1Y2hhciAqKXAgLSAyKlNTVDsgIC8qIGFkZHJlc3MgcmV0dXJuZWQgZnJvbSBtYWxsb2MgKi8KLQlzaXplX3QgbmJ5dGVzOworICAgIHVjaGFyICpxID0gKHVjaGFyICopcCAtIDIqU1NUOyAgLyogYWRkcmVzcyByZXR1cm5lZCBmcm9tIG1hbGxvYyAqLworICAgIHNpemVfdCBuYnl0ZXM7CiAKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JX1B5T2JqZWN0X0RlYnVnQ2hlY2tBZGRyZXNzKHApOwotCW5ieXRlcyA9IHJlYWRfc2l6ZV90KHEpOwotCWlmIChuYnl0ZXMgPiAwKQotCQltZW1zZXQocSwgREVBREJZVEUsIG5ieXRlcyk7Ci0JUHlPYmplY3RfRnJlZShxKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgX1B5T2JqZWN0X0RlYnVnQ2hlY2tBZGRyZXNzKHApOworICAgIG5ieXRlcyA9IHJlYWRfc2l6ZV90KHEpOworICAgIGlmIChuYnl0ZXMgPiAwKQorICAgICAgICBtZW1zZXQocSwgREVBREJZVEUsIG5ieXRlcyk7CisgICAgUHlPYmplY3RfRnJlZShxKTsKIH0KIAogdm9pZCAqCiBfUHlPYmplY3RfRGVidWdSZWFsbG9jKHZvaWQgKnAsIHNpemVfdCBuYnl0ZXMpCiB7Ci0JdWNoYXIgKnEgPSAodWNoYXIgKilwOwotCXVjaGFyICp0YWlsOwotCXNpemVfdCB0b3RhbDsJLyogbmJ5dGVzICsgNCpTU1QgKi8KLQlzaXplX3Qgb3JpZ2luYWxfbmJ5dGVzOwotCWludCBpOworICAgIHVjaGFyICpxID0gKHVjaGFyICopcDsKKyAgICB1Y2hhciAqdGFpbDsKKyAgICBzaXplX3QgdG90YWw7ICAgICAgIC8qIG5ieXRlcyArIDQqU1NUICovCisgICAgc2l6ZV90IG9yaWdpbmFsX25ieXRlczsKKyAgICBpbnQgaTsKIAotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiBfUHlPYmplY3RfRGVidWdNYWxsb2MobmJ5dGVzKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX1B5T2JqZWN0X0RlYnVnTWFsbG9jKG5ieXRlcyk7CiAKLQlfUHlPYmplY3RfRGVidWdDaGVja0FkZHJlc3MocCk7Ci0JYnVtcHNlcmlhbG5vKCk7Ci0Jb3JpZ2luYWxfbmJ5dGVzID0gcmVhZF9zaXplX3QocSAtIDIqU1NUKTsKLQl0b3RhbCA9IG5ieXRlcyArIDQqU1NUOwotCWlmICh0b3RhbCA8IG5ieXRlcykKLQkJLyogb3ZlcmZsb3c6ICBjYW4ndCByZXByZXNlbnQgdG90YWwgYXMgYSBzaXplX3QgKi8KLQkJcmV0dXJuIE5VTEw7CisgICAgX1B5T2JqZWN0X0RlYnVnQ2hlY2tBZGRyZXNzKHApOworICAgIGJ1bXBzZXJpYWxubygpOworICAgIG9yaWdpbmFsX25ieXRlcyA9IHJlYWRfc2l6ZV90KHEgLSAyKlNTVCk7CisgICAgdG90YWwgPSBuYnl0ZXMgKyA0KlNTVDsKKyAgICBpZiAodG90YWwgPCBuYnl0ZXMpCisgICAgICAgIC8qIG92ZXJmbG93OiAgY2FuJ3QgcmVwcmVzZW50IHRvdGFsIGFzIGEgc2l6ZV90ICovCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKG5ieXRlcyA8IG9yaWdpbmFsX25ieXRlcykgewotCQkvKiBzaHJpbmtpbmc6ICBtYXJrIG9sZCBleHRyYSBtZW1vcnkgZGVhZCAqLwotCQltZW1zZXQocSArIG5ieXRlcywgREVBREJZVEUsIG9yaWdpbmFsX25ieXRlcyAtIG5ieXRlcyk7Ci0JfQorICAgIGlmIChuYnl0ZXMgPCBvcmlnaW5hbF9uYnl0ZXMpIHsKKyAgICAgICAgLyogc2hyaW5raW5nOiAgbWFyayBvbGQgZXh0cmEgbWVtb3J5IGRlYWQgKi8KKyAgICAgICAgbWVtc2V0KHEgKyBuYnl0ZXMsIERFQURCWVRFLCBvcmlnaW5hbF9uYnl0ZXMgLSBuYnl0ZXMpOworICAgIH0KIAotCS8qIFJlc2l6ZSBhbmQgYWRkIGRlY29yYXRpb25zLiAqLwotCXEgPSAodWNoYXIgKilQeU9iamVjdF9SZWFsbG9jKHEgLSAyKlNTVCwgdG90YWwpOwotCWlmIChxID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIC8qIFJlc2l6ZSBhbmQgYWRkIGRlY29yYXRpb25zLiAqLworICAgIHEgPSAodWNoYXIgKilQeU9iamVjdF9SZWFsbG9jKHEgLSAyKlNTVCwgdG90YWwpOworICAgIGlmIChxID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jd3JpdGVfc2l6ZV90KHEsIG5ieXRlcyk7Ci0JZm9yIChpID0gMDsgaSA8IFNTVDsgKytpKQotCQlhc3NlcnQocVtTU1QgKyBpXSA9PSBGT1JCSURERU5CWVRFKTsKLQlxICs9IDIqU1NUOwotCXRhaWwgPSBxICsgbmJ5dGVzOwotCW1lbXNldCh0YWlsLCBGT1JCSURERU5CWVRFLCBTU1QpOwotCXdyaXRlX3NpemVfdCh0YWlsICsgU1NULCBzZXJpYWxubyk7CisgICAgd3JpdGVfc2l6ZV90KHEsIG5ieXRlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IFNTVDsgKytpKQorICAgICAgICBhc3NlcnQocVtTU1QgKyBpXSA9PSBGT1JCSURERU5CWVRFKTsKKyAgICBxICs9IDIqU1NUOworICAgIHRhaWwgPSBxICsgbmJ5dGVzOworICAgIG1lbXNldCh0YWlsLCBGT1JCSURERU5CWVRFLCBTU1QpOworICAgIHdyaXRlX3NpemVfdCh0YWlsICsgU1NULCBzZXJpYWxubyk7CiAKLQlpZiAobmJ5dGVzID4gb3JpZ2luYWxfbmJ5dGVzKSB7Ci0JCS8qIGdyb3dpbmc6ICBtYXJrIG5ldyBleHRyYSBtZW1vcnkgY2xlYW4gKi8KLQkJbWVtc2V0KHEgKyBvcmlnaW5hbF9uYnl0ZXMsIENMRUFOQllURSwKLQkJCW5ieXRlcyAtIG9yaWdpbmFsX25ieXRlcyk7Ci0JfQorICAgIGlmIChuYnl0ZXMgPiBvcmlnaW5hbF9uYnl0ZXMpIHsKKyAgICAgICAgLyogZ3Jvd2luZzogIG1hcmsgbmV3IGV4dHJhIG1lbW9yeSBjbGVhbiAqLworICAgICAgICBtZW1zZXQocSArIG9yaWdpbmFsX25ieXRlcywgQ0xFQU5CWVRFLAorICAgICAgICAgICAgbmJ5dGVzIC0gb3JpZ2luYWxfbmJ5dGVzKTsKKyAgICB9CiAKLQlyZXR1cm4gcTsKKyAgICByZXR1cm4gcTsKIH0KIAogLyogQ2hlY2sgdGhlIGZvcmJpZGRlbiBieXRlcyBvbiBib3RoIGVuZHMgb2YgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHAuCkBAIC0xNDM1LDE3NiArMTQzNSwxNzYgQEAKICB2b2lkCiBfUHlPYmplY3RfRGVidWdDaGVja0FkZHJlc3MoY29uc3Qgdm9pZCAqcCkKIHsKLQljb25zdCB1Y2hhciAqcSA9IChjb25zdCB1Y2hhciAqKXA7Ci0JY2hhciAqbXNnOwotCXNpemVfdCBuYnl0ZXM7Ci0JY29uc3QgdWNoYXIgKnRhaWw7Ci0JaW50IGk7CisgICAgY29uc3QgdWNoYXIgKnEgPSAoY29uc3QgdWNoYXIgKilwOworICAgIGNoYXIgKm1zZzsKKyAgICBzaXplX3QgbmJ5dGVzOworICAgIGNvbnN0IHVjaGFyICp0YWlsOworICAgIGludCBpOwogCi0JaWYgKHAgPT0gTlVMTCkgewotCQltc2cgPSAiZGlkbid0IGV4cGVjdCBhIE5VTEwgcG9pbnRlciI7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgbXNnID0gImRpZG4ndCBleHBlY3QgYSBOVUxMIHBvaW50ZXIiOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIENoZWNrIHRoZSBzdHVmZiBhdCB0aGUgc3RhcnQgb2YgcCBmaXJzdDogIGlmIHRoZXJlJ3MgdW5kZXJ3cml0ZQotCSAqIGNvcnJ1cHRpb24sIHRoZSBudW1iZXItb2YtYnl0ZXMgZmllbGQgbWF5IGJlIG51dHMsIGFuZCBjaGVja2luZwotCSAqIHRoZSB0YWlsIGNvdWxkIGxlYWQgdG8gYSBzZWdmYXVsdCB0aGVuLgotCSAqLwotCWZvciAoaSA9IFNTVDsgaSA+PSAxOyAtLWkpIHsKLQkJaWYgKCoocS1pKSAhPSBGT1JCSURERU5CWVRFKSB7Ci0JCQltc2cgPSAiYmFkIGxlYWRpbmcgcGFkIGJ5dGUiOwotCQkJZ290byBlcnJvcjsKLQkJfQotCX0KKyAgICAvKiBDaGVjayB0aGUgc3R1ZmYgYXQgdGhlIHN0YXJ0IG9mIHAgZmlyc3Q6ICBpZiB0aGVyZSdzIHVuZGVyd3JpdGUKKyAgICAgKiBjb3JydXB0aW9uLCB0aGUgbnVtYmVyLW9mLWJ5dGVzIGZpZWxkIG1heSBiZSBudXRzLCBhbmQgY2hlY2tpbmcKKyAgICAgKiB0aGUgdGFpbCBjb3VsZCBsZWFkIHRvIGEgc2VnZmF1bHQgdGhlbi4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSBTU1Q7IGkgPj0gMTsgLS1pKSB7CisgICAgICAgIGlmICgqKHEtaSkgIT0gRk9SQklEREVOQllURSkgeworICAgICAgICAgICAgbXNnID0gImJhZCBsZWFkaW5nIHBhZCBieXRlIjsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CiAKLQluYnl0ZXMgPSByZWFkX3NpemVfdChxIC0gMipTU1QpOwotCXRhaWwgPSBxICsgbmJ5dGVzOwotCWZvciAoaSA9IDA7IGkgPCBTU1Q7ICsraSkgewotCQlpZiAodGFpbFtpXSAhPSBGT1JCSURERU5CWVRFKSB7Ci0JCQltc2cgPSAiYmFkIHRyYWlsaW5nIHBhZCBieXRlIjsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9CisgICAgbmJ5dGVzID0gcmVhZF9zaXplX3QocSAtIDIqU1NUKTsKKyAgICB0YWlsID0gcSArIG5ieXRlczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgU1NUOyArK2kpIHsKKyAgICAgICAgaWYgKHRhaWxbaV0gIT0gRk9SQklEREVOQllURSkgeworICAgICAgICAgICAgbXNnID0gImJhZCB0cmFpbGluZyBwYWQgYnl0ZSI7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuOworICAgIHJldHVybjsKIAogZXJyb3I6Ci0JX1B5T2JqZWN0X0RlYnVnRHVtcEFkZHJlc3MocCk7Ci0JUHlfRmF0YWxFcnJvcihtc2cpOworICAgIF9QeU9iamVjdF9EZWJ1Z0R1bXBBZGRyZXNzKHApOworICAgIFB5X0ZhdGFsRXJyb3IobXNnKTsKIH0KIAogLyogRGlzcGxheSBpbmZvIHRvIHN0ZGVyciBhYm91dCB0aGUgbWVtb3J5IGJsb2NrIGF0IHAuICovCiB2b2lkCiBfUHlPYmplY3RfRGVidWdEdW1wQWRkcmVzcyhjb25zdCB2b2lkICpwKQogewotCWNvbnN0IHVjaGFyICpxID0gKGNvbnN0IHVjaGFyICopcDsKLQljb25zdCB1Y2hhciAqdGFpbDsKLQlzaXplX3QgbmJ5dGVzLCBzZXJpYWw7Ci0JaW50IGk7Ci0JaW50IG9rOworICAgIGNvbnN0IHVjaGFyICpxID0gKGNvbnN0IHVjaGFyICopcDsKKyAgICBjb25zdCB1Y2hhciAqdGFpbDsKKyAgICBzaXplX3QgbmJ5dGVzLCBzZXJpYWw7CisgICAgaW50IGk7CisgICAgaW50IG9rOwogCi0JZnByaW50ZihzdGRlcnIsICJEZWJ1ZyBtZW1vcnkgYmxvY2sgYXQgYWRkcmVzcyBwPSVwOlxuIiwgcCk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuOworICAgIGZwcmludGYoc3RkZXJyLCAiRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD0lcDpcbiIsIHApOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybjsKIAotCW5ieXRlcyA9IHJlYWRfc2l6ZV90KHEgLSAyKlNTVCk7Ci0JZnByaW50ZihzdGRlcnIsICIgICAgJSIgUFlfRk9STUFUX1NJWkVfVCAidSBieXRlcyBvcmlnaW5hbGx5ICIKLQkgICAgICAgICAgICAgICAgInJlcXVlc3RlZFxuIiwgbmJ5dGVzKTsKKyAgICBuYnl0ZXMgPSByZWFkX3NpemVfdChxIC0gMipTU1QpOworICAgIGZwcmludGYoc3RkZXJyLCAiICAgICUiIFBZX0ZPUk1BVF9TSVpFX1QgInUgYnl0ZXMgb3JpZ2luYWxseSAiCisgICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0ZWRcbiIsIG5ieXRlcyk7CiAKLQkvKiBJbiBjYXNlIHRoaXMgaXMgbnV0cywgY2hlY2sgdGhlIGxlYWRpbmcgcGFkIGJ5dGVzIGZpcnN0LiAqLwotCWZwcmludGYoc3RkZXJyLCAiICAgIFRoZSAlZCBwYWQgYnl0ZXMgYXQgcC0lZCBhcmUgIiwgU1NULCBTU1QpOwotCW9rID0gMTsKLQlmb3IgKGkgPSAxOyBpIDw9IFNTVDsgKytpKSB7Ci0JCWlmICgqKHEtaSkgIT0gRk9SQklEREVOQllURSkgewotCQkJb2sgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKG9rKQotCQlmcHV0cygiRk9SQklEREVOQllURSwgYXMgZXhwZWN0ZWQuXG4iLCBzdGRlcnIpOwotCWVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgIm5vdCBhbGwgRk9SQklEREVOQllURSAoMHglMDJ4KTpcbiIsCi0JCQlGT1JCSURERU5CWVRFKTsKLQkJZm9yIChpID0gU1NUOyBpID49IDE7IC0taSkgewotCQkJY29uc3QgdWNoYXIgYnl0ZSA9ICoocS1pKTsKLQkJCWZwcmludGYoc3RkZXJyLCAiICAgICAgICBhdCBwLSVkOiAweCUwMngiLCBpLCBieXRlKTsKLQkJCWlmIChieXRlICE9IEZPUkJJRERFTkJZVEUpCi0JCQkJZnB1dHMoIiAqKiogT1VDSCIsIHN0ZGVycik7Ci0JCQlmcHV0YygnXG4nLCBzdGRlcnIpOwotCQl9CisgICAgLyogSW4gY2FzZSB0aGlzIGlzIG51dHMsIGNoZWNrIHRoZSBsZWFkaW5nIHBhZCBieXRlcyBmaXJzdC4gKi8KKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICBUaGUgJWQgcGFkIGJ5dGVzIGF0IHAtJWQgYXJlICIsIFNTVCwgU1NUKTsKKyAgICBvayA9IDE7CisgICAgZm9yIChpID0gMTsgaSA8PSBTU1Q7ICsraSkgeworICAgICAgICBpZiAoKihxLWkpICE9IEZPUkJJRERFTkJZVEUpIHsKKyAgICAgICAgICAgIG9rID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvaykKKyAgICAgICAgZnB1dHMoIkZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIiwgc3RkZXJyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJub3QgYWxsIEZPUkJJRERFTkJZVEUgKDB4JTAyeCk6XG4iLAorICAgICAgICAgICAgRk9SQklEREVOQllURSk7CisgICAgICAgIGZvciAoaSA9IFNTVDsgaSA+PSAxOyAtLWkpIHsKKyAgICAgICAgICAgIGNvbnN0IHVjaGFyIGJ5dGUgPSAqKHEtaSk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgYXQgcC0lZDogMHglMDJ4IiwgaSwgYnl0ZSk7CisgICAgICAgICAgICBpZiAoYnl0ZSAhPSBGT1JCSURERU5CWVRFKQorICAgICAgICAgICAgICAgIGZwdXRzKCIgKioqIE9VQ0giLCBzdGRlcnIpOworICAgICAgICAgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICAgICAgfQogCi0JCWZwdXRzKCIgICAgQmVjYXVzZSBtZW1vcnkgaXMgY29ycnVwdGVkIGF0IHRoZSBzdGFydCwgdGhlICIKLQkJICAgICAgImNvdW50IG9mIGJ5dGVzIHJlcXVlc3RlZFxuIgotCQkgICAgICAiICAgICAgIG1heSBiZSBib2d1cywgYW5kIGNoZWNraW5nIHRoZSB0cmFpbGluZyBwYWQgIgotCQkgICAgICAiYnl0ZXMgbWF5IHNlZ2ZhdWx0LlxuIiwgc3RkZXJyKTsKLQl9CisgICAgICAgIGZwdXRzKCIgICAgQmVjYXVzZSBtZW1vcnkgaXMgY29ycnVwdGVkIGF0IHRoZSBzdGFydCwgdGhlICIKKyAgICAgICAgICAgICAgImNvdW50IG9mIGJ5dGVzIHJlcXVlc3RlZFxuIgorICAgICAgICAgICAgICAiICAgICAgIG1heSBiZSBib2d1cywgYW5kIGNoZWNraW5nIHRoZSB0cmFpbGluZyBwYWQgIgorICAgICAgICAgICAgICAiYnl0ZXMgbWF5IHNlZ2ZhdWx0LlxuIiwgc3RkZXJyKTsKKyAgICB9CiAKLQl0YWlsID0gcSArIG5ieXRlczsKLQlmcHJpbnRmKHN0ZGVyciwgIiAgICBUaGUgJWQgcGFkIGJ5dGVzIGF0IHRhaWw9JXAgYXJlICIsIFNTVCwgdGFpbCk7Ci0Jb2sgPSAxOwotCWZvciAoaSA9IDA7IGkgPCBTU1Q7ICsraSkgewotCQlpZiAodGFpbFtpXSAhPSBGT1JCSURERU5CWVRFKSB7Ci0JCQlvayA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAob2spCi0JCWZwdXRzKCJGT1JCSURERU5CWVRFLCBhcyBleHBlY3RlZC5cbiIsIHN0ZGVycik7Ci0JZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibm90IGFsbCBGT1JCSURERU5CWVRFICgweCUwMngpOlxuIiwKLQkJCUZPUkJJRERFTkJZVEUpOwotCQlmb3IgKGkgPSAwOyBpIDwgU1NUOyArK2kpIHsKLQkJCWNvbnN0IHVjaGFyIGJ5dGUgPSB0YWlsW2ldOwotCQkJZnByaW50ZihzdGRlcnIsICIgICAgICAgIGF0IHRhaWwrJWQ6IDB4JTAyeCIsCi0JCQkJaSwgYnl0ZSk7Ci0JCQlpZiAoYnl0ZSAhPSBGT1JCSURERU5CWVRFKQotCQkJCWZwdXRzKCIgKioqIE9VQ0giLCBzdGRlcnIpOwotCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQkJfQotCX0KKyAgICB0YWlsID0gcSArIG5ieXRlczsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICBUaGUgJWQgcGFkIGJ5dGVzIGF0IHRhaWw9JXAgYXJlICIsIFNTVCwgdGFpbCk7CisgICAgb2sgPSAxOworICAgIGZvciAoaSA9IDA7IGkgPCBTU1Q7ICsraSkgeworICAgICAgICBpZiAodGFpbFtpXSAhPSBGT1JCSURERU5CWVRFKSB7CisgICAgICAgICAgICBvayA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob2spCisgICAgICAgIGZwdXRzKCJGT1JCSURERU5CWVRFLCBhcyBleHBlY3RlZC5cbiIsIHN0ZGVycik7CisgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm90IGFsbCBGT1JCSURERU5CWVRFICgweCUwMngpOlxuIiwKKyAgICAgICAgICAgIEZPUkJJRERFTkJZVEUpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU1NUOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IHVjaGFyIGJ5dGUgPSB0YWlsW2ldOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgIGF0IHRhaWwrJWQ6IDB4JTAyeCIsCisgICAgICAgICAgICAgICAgaSwgYnl0ZSk7CisgICAgICAgICAgICBpZiAoYnl0ZSAhPSBGT1JCSURERU5CWVRFKQorICAgICAgICAgICAgICAgIGZwdXRzKCIgKioqIE9VQ0giLCBzdGRlcnIpOworICAgICAgICAgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKKyAgICAgICAgfQorICAgIH0KIAotCXNlcmlhbCA9IHJlYWRfc2l6ZV90KHRhaWwgKyBTU1QpOwotCWZwcmludGYoc3RkZXJyLCAiICAgIFRoZSBibG9jayB3YXMgbWFkZSBieSBjYWxsICMlIiBQWV9GT1JNQVRfU0laRV9UCi0JCQkidSB0byBkZWJ1ZyBtYWxsb2MvcmVhbGxvYy5cbiIsIHNlcmlhbCk7CisgICAgc2VyaWFsID0gcmVhZF9zaXplX3QodGFpbCArIFNTVCk7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgVGhlIGJsb2NrIHdhcyBtYWRlIGJ5IGNhbGwgIyUiIFBZX0ZPUk1BVF9TSVpFX1QKKyAgICAgICAgICAgICAgICAgICAgInUgdG8gZGVidWcgbWFsbG9jL3JlYWxsb2MuXG4iLCBzZXJpYWwpOwogCi0JaWYgKG5ieXRlcyA+IDApIHsKLQkJaSA9IDA7Ci0JCWZwdXRzKCIgICAgRGF0YSBhdCBwOiIsIHN0ZGVycik7Ci0JCS8qIHByaW50IHVwIHRvIDggYnl0ZXMgYXQgdGhlIHN0YXJ0ICovCi0JCXdoaWxlIChxIDwgdGFpbCAmJiBpIDwgOCkgewotCQkJZnByaW50ZihzdGRlcnIsICIgJTAyeCIsICpxKTsKLQkJCSsraTsKLQkJCSsrcTsKLQkJfQotCQkvKiBhbmQgdXAgdG8gOCBhdCB0aGUgZW5kICovCi0JCWlmIChxIDwgdGFpbCkgewotCQkJaWYgKHRhaWwgLSBxID4gOCkgewotCQkJCWZwdXRzKCIgLi4uIiwgc3RkZXJyKTsKLQkJCQlxID0gdGFpbCAtIDg7Ci0JCQl9Ci0JCQl3aGlsZSAocSA8IHRhaWwpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwgIiAlMDJ4IiwgKnEpOwotCQkJCSsrcTsKLQkJCX0KLQkJfQotCQlmcHV0YygnXG4nLCBzdGRlcnIpOwotCX0KKyAgICBpZiAobmJ5dGVzID4gMCkgeworICAgICAgICBpID0gMDsKKyAgICAgICAgZnB1dHMoIiAgICBEYXRhIGF0IHA6Iiwgc3RkZXJyKTsKKyAgICAgICAgLyogcHJpbnQgdXAgdG8gOCBieXRlcyBhdCB0aGUgc3RhcnQgKi8KKyAgICAgICAgd2hpbGUgKHEgPCB0YWlsICYmIGkgPCA4KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlMDJ4IiwgKnEpOworICAgICAgICAgICAgKytpOworICAgICAgICAgICAgKytxOworICAgICAgICB9CisgICAgICAgIC8qIGFuZCB1cCB0byA4IGF0IHRoZSBlbmQgKi8KKyAgICAgICAgaWYgKHEgPCB0YWlsKSB7CisgICAgICAgICAgICBpZiAodGFpbCAtIHEgPiA4KSB7CisgICAgICAgICAgICAgICAgZnB1dHMoIiAuLi4iLCBzdGRlcnIpOworICAgICAgICAgICAgICAgIHEgPSB0YWlsIC0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChxIDwgdGFpbCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICUwMngiLCAqcSk7CisgICAgICAgICAgICAgICAgKytxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CisgICAgfQogfQogCiBzdGF0aWMgc2l6ZV90CiBwcmludG9uZShjb25zdCBjaGFyKiBtc2csIHNpemVfdCB2YWx1ZSkKIHsKLQlpbnQgaSwgazsKLQljaGFyIGJ1ZlsxMDBdOwotCXNpemVfdCBvcmlndmFsdWUgPSB2YWx1ZTsKKyAgICBpbnQgaSwgazsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNpemVfdCBvcmlndmFsdWUgPSB2YWx1ZTsKIAotCWZwdXRzKG1zZywgc3RkZXJyKTsKLQlmb3IgKGkgPSAoaW50KXN0cmxlbihtc2cpOyBpIDwgMzU7ICsraSkKLQkJZnB1dGMoJyAnLCBzdGRlcnIpOwotCWZwdXRjKCc9Jywgc3RkZXJyKTsKKyAgICBmcHV0cyhtc2csIHN0ZGVycik7CisgICAgZm9yIChpID0gKGludClzdHJsZW4obXNnKTsgaSA8IDM1OyArK2kpCisgICAgICAgIGZwdXRjKCcgJywgc3RkZXJyKTsKKyAgICBmcHV0YygnPScsIHN0ZGVycik7CiAKLQkvKiBXcml0ZSB0aGUgdmFsdWUgd2l0aCBjb21tYXMuICovCi0JaSA9IDIyOwotCWJ1ZltpLS1dID0gJ1wwJzsKLQlidWZbaS0tXSA9ICdcbic7Ci0JayA9IDM7Ci0JZG8gewotCQlzaXplX3QgbmV4dHZhbHVlID0gdmFsdWUgLyAxMDsKLQkJdWludCBkaWdpdCA9ICh1aW50KSh2YWx1ZSAtIG5leHR2YWx1ZSAqIDEwKTsKLQkJdmFsdWUgPSBuZXh0dmFsdWU7Ci0JCWJ1ZltpLS1dID0gKGNoYXIpKGRpZ2l0ICsgJzAnKTsKLQkJLS1rOwotCQlpZiAoayA9PSAwICYmIHZhbHVlICYmIGkgPj0gMCkgewotCQkJayA9IDM7Ci0JCQlidWZbaS0tXSA9ICcsJzsKLQkJfQotCX0gd2hpbGUgKHZhbHVlICYmIGkgPj0gMCk7CisgICAgLyogV3JpdGUgdGhlIHZhbHVlIHdpdGggY29tbWFzLiAqLworICAgIGkgPSAyMjsKKyAgICBidWZbaS0tXSA9ICdcMCc7CisgICAgYnVmW2ktLV0gPSAnXG4nOworICAgIGsgPSAzOworICAgIGRvIHsKKyAgICAgICAgc2l6ZV90IG5leHR2YWx1ZSA9IHZhbHVlIC8gMTA7CisgICAgICAgIHVpbnQgZGlnaXQgPSAodWludCkodmFsdWUgLSBuZXh0dmFsdWUgKiAxMCk7CisgICAgICAgIHZhbHVlID0gbmV4dHZhbHVlOworICAgICAgICBidWZbaS0tXSA9IChjaGFyKShkaWdpdCArICcwJyk7CisgICAgICAgIC0tazsKKyAgICAgICAgaWYgKGsgPT0gMCAmJiB2YWx1ZSAmJiBpID49IDApIHsKKyAgICAgICAgICAgIGsgPSAzOworICAgICAgICAgICAgYnVmW2ktLV0gPSAnLCc7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICh2YWx1ZSAmJiBpID49IDApOwogCi0Jd2hpbGUgKGkgPj0gMCkKLQkJYnVmW2ktLV0gPSAnICc7Ci0JZnB1dHMoYnVmLCBzdGRlcnIpOworICAgIHdoaWxlIChpID49IDApCisgICAgICAgIGJ1ZltpLS1dID0gJyAnOworICAgIGZwdXRzKGJ1Ziwgc3RkZXJyKTsKIAotCXJldHVybiBvcmlndmFsdWU7CisgICAgcmV0dXJuIG9yaWd2YWx1ZTsKIH0KIAogLyogUHJpbnQgc3VtbWFyeSBpbmZvIHRvIHN0ZGVyciBhYm91dCB0aGUgc3RhdGUgb2YgcHltYWxsb2MncyBzdHJ1Y3R1cmVzLgpAQCAtMTYxNCwxNDIgKzE2MTQsMTQyIEBACiB2b2lkCiBfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cyh2b2lkKQogewotCXVpbnQgaTsKLQljb25zdCB1aW50IG51bWNsYXNzZXMgPSBTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCA+PiBBTElHTk1FTlRfU0hJRlQ7Ci0JLyogIyBvZiBwb29scywgYWxsb2NhdGVkIGJsb2NrcywgYW5kIGZyZWUgYmxvY2tzIHBlciBjbGFzcyBpbmRleCAqLwotCXNpemVfdCBudW1wb29sc1tTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCA+PiBBTElHTk1FTlRfU0hJRlRdOwotCXNpemVfdCBudW1ibG9ja3NbU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUXTsKLQlzaXplX3QgbnVtZnJlZWJsb2Nrc1tTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCA+PiBBTElHTk1FTlRfU0hJRlRdOwotCS8qIHRvdGFsICMgb2YgYWxsb2NhdGVkIGJ5dGVzIGluIHVzZWQgYW5kIGZ1bGwgcG9vbHMgKi8KLQlzaXplX3QgYWxsb2NhdGVkX2J5dGVzID0gMDsKLQkvKiB0b3RhbCAjIG9mIGF2YWlsYWJsZSBieXRlcyBpbiB1c2VkIHBvb2xzICovCi0Jc2l6ZV90IGF2YWlsYWJsZV9ieXRlcyA9IDA7Ci0JLyogIyBvZiBmcmVlIHBvb2xzICsgcG9vbHMgbm90IHlldCBjYXJ2ZWQgb3V0IG9mIGN1cnJlbnQgYXJlbmEgKi8KLQl1aW50IG51bWZyZWVwb29scyA9IDA7Ci0JLyogIyBvZiBieXRlcyBmb3IgYXJlbmEgYWxpZ25tZW50IHBhZGRpbmcgKi8KLQlzaXplX3QgYXJlbmFfYWxpZ25tZW50ID0gMDsKLQkvKiAjIG9mIGJ5dGVzIGluIHVzZWQgYW5kIGZ1bGwgcG9vbHMgdXNlZCBmb3IgcG9vbF9oZWFkZXJzICovCi0Jc2l6ZV90IHBvb2xfaGVhZGVyX2J5dGVzID0gMDsKLQkvKiAjIG9mIGJ5dGVzIGluIHVzZWQgYW5kIGZ1bGwgcG9vbHMgd2FzdGVkIGR1ZSB0byBxdWFudGl6YXRpb24sCi0JICogaS5lLiB0aGUgbmVjZXNzYXJpbHkgbGVmdG92ZXIgc3BhY2UgYXQgdGhlIGVuZHMgb2YgdXNlZCBhbmQKLQkgKiBmdWxsIHBvb2xzLgotCSAqLwotCXNpemVfdCBxdWFudGl6YXRpb24gPSAwOwotCS8qICMgb2YgYXJlbmFzIGFjdHVhbGx5IGFsbG9jYXRlZC4gKi8KLQlzaXplX3QgbmFyZW5hcyA9IDA7Ci0JLyogcnVubmluZyB0b3RhbCAtLSBzaG91bGQgZXF1YWwgbmFyZW5hcyAqIEFSRU5BX1NJWkUgKi8KLQlzaXplX3QgdG90YWw7Ci0JY2hhciBidWZbMTI4XTsKKyAgICB1aW50IGk7CisgICAgY29uc3QgdWludCBudW1jbGFzc2VzID0gU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUOworICAgIC8qICMgb2YgcG9vbHMsIGFsbG9jYXRlZCBibG9ja3MsIGFuZCBmcmVlIGJsb2NrcyBwZXIgY2xhc3MgaW5kZXggKi8KKyAgICBzaXplX3QgbnVtcG9vbHNbU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUXTsKKyAgICBzaXplX3QgbnVtYmxvY2tzW1NNQUxMX1JFUVVFU1RfVEhSRVNIT0xEID4+IEFMSUdOTUVOVF9TSElGVF07CisgICAgc2l6ZV90IG51bWZyZWVibG9ja3NbU01BTExfUkVRVUVTVF9USFJFU0hPTEQgPj4gQUxJR05NRU5UX1NISUZUXTsKKyAgICAvKiB0b3RhbCAjIG9mIGFsbG9jYXRlZCBieXRlcyBpbiB1c2VkIGFuZCBmdWxsIHBvb2xzICovCisgICAgc2l6ZV90IGFsbG9jYXRlZF9ieXRlcyA9IDA7CisgICAgLyogdG90YWwgIyBvZiBhdmFpbGFibGUgYnl0ZXMgaW4gdXNlZCBwb29scyAqLworICAgIHNpemVfdCBhdmFpbGFibGVfYnl0ZXMgPSAwOworICAgIC8qICMgb2YgZnJlZSBwb29scyArIHBvb2xzIG5vdCB5ZXQgY2FydmVkIG91dCBvZiBjdXJyZW50IGFyZW5hICovCisgICAgdWludCBudW1mcmVlcG9vbHMgPSAwOworICAgIC8qICMgb2YgYnl0ZXMgZm9yIGFyZW5hIGFsaWdubWVudCBwYWRkaW5nICovCisgICAgc2l6ZV90IGFyZW5hX2FsaWdubWVudCA9IDA7CisgICAgLyogIyBvZiBieXRlcyBpbiB1c2VkIGFuZCBmdWxsIHBvb2xzIHVzZWQgZm9yIHBvb2xfaGVhZGVycyAqLworICAgIHNpemVfdCBwb29sX2hlYWRlcl9ieXRlcyA9IDA7CisgICAgLyogIyBvZiBieXRlcyBpbiB1c2VkIGFuZCBmdWxsIHBvb2xzIHdhc3RlZCBkdWUgdG8gcXVhbnRpemF0aW9uLAorICAgICAqIGkuZS4gdGhlIG5lY2Vzc2FyaWx5IGxlZnRvdmVyIHNwYWNlIGF0IHRoZSBlbmRzIG9mIHVzZWQgYW5kCisgICAgICogZnVsbCBwb29scy4KKyAgICAgKi8KKyAgICBzaXplX3QgcXVhbnRpemF0aW9uID0gMDsKKyAgICAvKiAjIG9mIGFyZW5hcyBhY3R1YWxseSBhbGxvY2F0ZWQuICovCisgICAgc2l6ZV90IG5hcmVuYXMgPSAwOworICAgIC8qIHJ1bm5pbmcgdG90YWwgLS0gc2hvdWxkIGVxdWFsIG5hcmVuYXMgKiBBUkVOQV9TSVpFICovCisgICAgc2l6ZV90IHRvdGFsOworICAgIGNoYXIgYnVmWzEyOF07CiAKLQlmcHJpbnRmKHN0ZGVyciwgIlNtYWxsIGJsb2NrIHRocmVzaG9sZCA9ICVkLCBpbiAldSBzaXplIGNsYXNzZXMuXG4iLAotCQlTTUFMTF9SRVFVRVNUX1RIUkVTSE9MRCwgbnVtY2xhc3Nlcyk7CisgICAgZnByaW50ZihzdGRlcnIsICJTbWFsbCBibG9jayB0aHJlc2hvbGQgPSAlZCwgaW4gJXUgc2l6ZSBjbGFzc2VzLlxuIiwKKyAgICAgICAgU01BTExfUkVRVUVTVF9USFJFU0hPTEQsIG51bWNsYXNzZXMpOwogCi0JZm9yIChpID0gMDsgaSA8IG51bWNsYXNzZXM7ICsraSkKLQkJbnVtcG9vbHNbaV0gPSBudW1ibG9ja3NbaV0gPSBudW1mcmVlYmxvY2tzW2ldID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtY2xhc3NlczsgKytpKQorICAgICAgICBudW1wb29sc1tpXSA9IG51bWJsb2Nrc1tpXSA9IG51bWZyZWVibG9ja3NbaV0gPSAwOwogCi0JLyogQmVjYXVzZSBmdWxsIHBvb2xzIGFyZW4ndCBsaW5rZWQgdG8gZnJvbSBhbnl0aGluZywgaXQncyBlYXNpZXN0Ci0JICogdG8gbWFyY2ggb3ZlciBhbGwgdGhlIGFyZW5hcy4gIElmIHdlJ3JlIGx1Y2t5LCBtb3N0IG9mIHRoZSBtZW1vcnkKLQkgKiB3aWxsIGJlIGxpdmluZyBpbiBmdWxsIHBvb2xzIC0tIHdvdWxkIGJlIGEgc2hhbWUgdG8gbWlzcyB0aGVtLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBtYXhhcmVuYXM7ICsraSkgewotCQl1aW50IHBvb2xzaW5hcmVuYTsKLQkJdWludCBqOwotCQl1cHRyIGJhc2UgPSBhcmVuYXNbaV0uYWRkcmVzczsKKyAgICAvKiBCZWNhdXNlIGZ1bGwgcG9vbHMgYXJlbid0IGxpbmtlZCB0byBmcm9tIGFueXRoaW5nLCBpdCdzIGVhc2llc3QKKyAgICAgKiB0byBtYXJjaCBvdmVyIGFsbCB0aGUgYXJlbmFzLiAgSWYgd2UncmUgbHVja3ksIG1vc3Qgb2YgdGhlIG1lbW9yeQorICAgICAqIHdpbGwgYmUgbGl2aW5nIGluIGZ1bGwgcG9vbHMgLS0gd291bGQgYmUgYSBzaGFtZSB0byBtaXNzIHRoZW0uCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IG1heGFyZW5hczsgKytpKSB7CisgICAgICAgIHVpbnQgcG9vbHNpbmFyZW5hOworICAgICAgICB1aW50IGo7CisgICAgICAgIHVwdHIgYmFzZSA9IGFyZW5hc1tpXS5hZGRyZXNzOwogCi0JCS8qIFNraXAgYXJlbmFzIHdoaWNoIGFyZSBub3QgYWxsb2NhdGVkLiAqLwotCQlpZiAoYXJlbmFzW2ldLmFkZHJlc3MgPT0gKHVwdHIpTlVMTCkKLQkJCWNvbnRpbnVlOwotCQluYXJlbmFzICs9IDE7CisgICAgICAgIC8qIFNraXAgYXJlbmFzIHdoaWNoIGFyZSBub3QgYWxsb2NhdGVkLiAqLworICAgICAgICBpZiAoYXJlbmFzW2ldLmFkZHJlc3MgPT0gKHVwdHIpTlVMTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBuYXJlbmFzICs9IDE7CiAKLQkJcG9vbHNpbmFyZW5hID0gYXJlbmFzW2ldLm50b3RhbHBvb2xzOwotCQludW1mcmVlcG9vbHMgKz0gYXJlbmFzW2ldLm5mcmVlcG9vbHM7CisgICAgICAgIHBvb2xzaW5hcmVuYSA9IGFyZW5hc1tpXS5udG90YWxwb29sczsKKyAgICAgICAgbnVtZnJlZXBvb2xzICs9IGFyZW5hc1tpXS5uZnJlZXBvb2xzOwogCi0JCS8qIHJvdW5kIHVwIHRvIHBvb2wgYWxpZ25tZW50ICovCi0JCWlmIChiYXNlICYgKHVwdHIpUE9PTF9TSVpFX01BU0spIHsKLQkJCWFyZW5hX2FsaWdubWVudCArPSBQT09MX1NJWkU7Ci0JCQliYXNlICY9IH4odXB0cilQT09MX1NJWkVfTUFTSzsKLQkJCWJhc2UgKz0gUE9PTF9TSVpFOwotCQl9CisgICAgICAgIC8qIHJvdW5kIHVwIHRvIHBvb2wgYWxpZ25tZW50ICovCisgICAgICAgIGlmIChiYXNlICYgKHVwdHIpUE9PTF9TSVpFX01BU0spIHsKKyAgICAgICAgICAgIGFyZW5hX2FsaWdubWVudCArPSBQT09MX1NJWkU7CisgICAgICAgICAgICBiYXNlICY9IH4odXB0cilQT09MX1NJWkVfTUFTSzsKKyAgICAgICAgICAgIGJhc2UgKz0gUE9PTF9TSVpFOworICAgICAgICB9CiAKLQkJLyogdmlzaXQgZXZlcnkgcG9vbCBpbiB0aGUgYXJlbmEgKi8KLQkJYXNzZXJ0KGJhc2UgPD0gKHVwdHIpIGFyZW5hc1tpXS5wb29sX2FkZHJlc3MpOwotCQlmb3IgKGogPSAwOwotCQkJICAgIGJhc2UgPCAodXB0cikgYXJlbmFzW2ldLnBvb2xfYWRkcmVzczsKLQkJCSAgICArK2osIGJhc2UgKz0gUE9PTF9TSVpFKSB7Ci0JCQlwb29scCBwID0gKHBvb2xwKWJhc2U7Ci0JCQljb25zdCB1aW50IHN6ID0gcC0+c3ppZHg7Ci0JCQl1aW50IGZyZWVibG9ja3M7CisgICAgICAgIC8qIHZpc2l0IGV2ZXJ5IHBvb2wgaW4gdGhlIGFyZW5hICovCisgICAgICAgIGFzc2VydChiYXNlIDw9ICh1cHRyKSBhcmVuYXNbaV0ucG9vbF9hZGRyZXNzKTsKKyAgICAgICAgZm9yIChqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYmFzZSA8ICh1cHRyKSBhcmVuYXNbaV0ucG9vbF9hZGRyZXNzOworICAgICAgICAgICAgICAgICAgICArK2osIGJhc2UgKz0gUE9PTF9TSVpFKSB7CisgICAgICAgICAgICBwb29scCBwID0gKHBvb2xwKWJhc2U7CisgICAgICAgICAgICBjb25zdCB1aW50IHN6ID0gcC0+c3ppZHg7CisgICAgICAgICAgICB1aW50IGZyZWVibG9ja3M7CiAKLQkJCWlmIChwLT5yZWYuY291bnQgPT0gMCkgewotCQkJCS8qIGN1cnJlbnRseSB1bnVzZWQgKi8KLQkJCQlhc3NlcnQocG9vbF9pc19pbl9saXN0KHAsIGFyZW5hc1tpXS5mcmVlcG9vbHMpKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCSsrbnVtcG9vbHNbc3pdOwotCQkJbnVtYmxvY2tzW3N6XSArPSBwLT5yZWYuY291bnQ7Ci0JCQlmcmVlYmxvY2tzID0gTlVNQkxPQ0tTKHN6KSAtIHAtPnJlZi5jb3VudDsKLQkJCW51bWZyZWVibG9ja3Nbc3pdICs9IGZyZWVibG9ja3M7CisgICAgICAgICAgICBpZiAocC0+cmVmLmNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBjdXJyZW50bHkgdW51c2VkICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KHBvb2xfaXNfaW5fbGlzdChwLCBhcmVuYXNbaV0uZnJlZXBvb2xzKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK251bXBvb2xzW3N6XTsKKyAgICAgICAgICAgIG51bWJsb2Nrc1tzel0gKz0gcC0+cmVmLmNvdW50OworICAgICAgICAgICAgZnJlZWJsb2NrcyA9IE5VTUJMT0NLUyhzeikgLSBwLT5yZWYuY291bnQ7CisgICAgICAgICAgICBudW1mcmVlYmxvY2tzW3N6XSArPSBmcmVlYmxvY2tzOwogI2lmZGVmIFB5X0RFQlVHCi0JCQlpZiAoZnJlZWJsb2NrcyA+IDApCi0JCQkJYXNzZXJ0KHBvb2xfaXNfaW5fbGlzdChwLCB1c2VkcG9vbHNbc3ogKyBzel0pKTsKKyAgICAgICAgICAgIGlmIChmcmVlYmxvY2tzID4gMCkKKyAgICAgICAgICAgICAgICBhc3NlcnQocG9vbF9pc19pbl9saXN0KHAsIHVzZWRwb29sc1tzeiArIHN6XSkpOwogI2VuZGlmCi0JCX0KLQl9Ci0JYXNzZXJ0KG5hcmVuYXMgPT0gbmFyZW5hc19jdXJyZW50bHlfYWxsb2NhdGVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQobmFyZW5hcyA9PSBuYXJlbmFzX2N1cnJlbnRseV9hbGxvY2F0ZWQpOwogCi0JZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQlmcHV0cygiY2xhc3MgICBzaXplICAgbnVtIHBvb2xzICAgYmxvY2tzIGluIHVzZSAgYXZhaWwgYmxvY2tzXG4iCi0JICAgICAgIi0tLS0tICAgLS0tLSAgIC0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLVxuIiwKLQkJc3RkZXJyKTsKKyAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgIGZwdXRzKCJjbGFzcyAgIHNpemUgICBudW0gcG9vbHMgICBibG9ja3MgaW4gdXNlICBhdmFpbCBibG9ja3NcbiIKKyAgICAgICAgICAiLS0tLS0gICAtLS0tICAgLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tXG4iLAorICAgICAgICBzdGRlcnIpOwogCi0JZm9yIChpID0gMDsgaSA8IG51bWNsYXNzZXM7ICsraSkgewotCQlzaXplX3QgcCA9IG51bXBvb2xzW2ldOwotCQlzaXplX3QgYiA9IG51bWJsb2Nrc1tpXTsKLQkJc2l6ZV90IGYgPSBudW1mcmVlYmxvY2tzW2ldOwotCQl1aW50IHNpemUgPSBJTkRFWDJTSVpFKGkpOwotCQlpZiAocCA9PSAwKSB7Ci0JCQlhc3NlcnQoYiA9PSAwICYmIGYgPT0gMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmcHJpbnRmKHN0ZGVyciwgIiU1dSAlNnUgIgotCQkJCSIlMTEiIFBZX0ZPUk1BVF9TSVpFX1QgInUgIgotCQkJCSIlMTUiIFBZX0ZPUk1BVF9TSVpFX1QgInUgIgotCQkJCSIlMTMiIFBZX0ZPUk1BVF9TSVpFX1QgInVcbiIsCi0JCQlpLCBzaXplLCBwLCBiLCBmKTsKLQkJYWxsb2NhdGVkX2J5dGVzICs9IGIgKiBzaXplOwotCQlhdmFpbGFibGVfYnl0ZXMgKz0gZiAqIHNpemU7Ci0JCXBvb2xfaGVhZGVyX2J5dGVzICs9IHAgKiBQT09MX09WRVJIRUFEOwotCQlxdWFudGl6YXRpb24gKz0gcCAqICgoUE9PTF9TSVpFIC0gUE9PTF9PVkVSSEVBRCkgJSBzaXplKTsKLQl9Ci0JZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQkodm9pZClwcmludG9uZSgiIyB0aW1lcyBvYmplY3QgbWFsbG9jIGNhbGxlZCIsIHNlcmlhbG5vKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtY2xhc3NlczsgKytpKSB7CisgICAgICAgIHNpemVfdCBwID0gbnVtcG9vbHNbaV07CisgICAgICAgIHNpemVfdCBiID0gbnVtYmxvY2tzW2ldOworICAgICAgICBzaXplX3QgZiA9IG51bWZyZWVibG9ja3NbaV07CisgICAgICAgIHVpbnQgc2l6ZSA9IElOREVYMlNJWkUoaSk7CisgICAgICAgIGlmIChwID09IDApIHsKKyAgICAgICAgICAgIGFzc2VydChiID09IDAgJiYgZiA9PSAwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJTV1ICU2dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTExIiBQWV9GT1JNQVRfU0laRV9UICJ1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMTUiIFBZX0ZPUk1BVF9TSVpFX1QgInUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiUxMyIgUFlfRk9STUFUX1NJWkVfVCAidVxuIiwKKyAgICAgICAgICAgIGksIHNpemUsIHAsIGIsIGYpOworICAgICAgICBhbGxvY2F0ZWRfYnl0ZXMgKz0gYiAqIHNpemU7CisgICAgICAgIGF2YWlsYWJsZV9ieXRlcyArPSBmICogc2l6ZTsKKyAgICAgICAgcG9vbF9oZWFkZXJfYnl0ZXMgKz0gcCAqIFBPT0xfT1ZFUkhFQUQ7CisgICAgICAgIHF1YW50aXphdGlvbiArPSBwICogKChQT09MX1NJWkUgLSBQT09MX09WRVJIRUFEKSAlIHNpemUpOworICAgIH0KKyAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgICh2b2lkKXByaW50b25lKCIjIHRpbWVzIG9iamVjdCBtYWxsb2MgY2FsbGVkIiwgc2VyaWFsbm8pOwogCi0JKHZvaWQpcHJpbnRvbmUoIiMgYXJlbmFzIGFsbG9jYXRlZCB0b3RhbCIsIG50aW1lc19hcmVuYV9hbGxvY2F0ZWQpOwotCSh2b2lkKXByaW50b25lKCIjIGFyZW5hcyByZWNsYWltZWQiLCBudGltZXNfYXJlbmFfYWxsb2NhdGVkIC0gbmFyZW5hcyk7Ci0JKHZvaWQpcHJpbnRvbmUoIiMgYXJlbmFzIGhpZ2h3YXRlciBtYXJrIiwgbmFyZW5hc19oaWdod2F0ZXIpOwotCSh2b2lkKXByaW50b25lKCIjIGFyZW5hcyBhbGxvY2F0ZWQgY3VycmVudCIsIG5hcmVuYXMpOworICAgICh2b2lkKXByaW50b25lKCIjIGFyZW5hcyBhbGxvY2F0ZWQgdG90YWwiLCBudGltZXNfYXJlbmFfYWxsb2NhdGVkKTsKKyAgICAodm9pZClwcmludG9uZSgiIyBhcmVuYXMgcmVjbGFpbWVkIiwgbnRpbWVzX2FyZW5hX2FsbG9jYXRlZCAtIG5hcmVuYXMpOworICAgICh2b2lkKXByaW50b25lKCIjIGFyZW5hcyBoaWdod2F0ZXIgbWFyayIsIG5hcmVuYXNfaGlnaHdhdGVyKTsKKyAgICAodm9pZClwcmludG9uZSgiIyBhcmVuYXMgYWxsb2NhdGVkIGN1cnJlbnQiLCBuYXJlbmFzKTsKIAotCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJIiUiIFBZX0ZPUk1BVF9TSVpFX1QgInUgYXJlbmFzICogJWQgYnl0ZXMvYXJlbmEiLAotCQluYXJlbmFzLCBBUkVOQV9TSVpFKTsKLQkodm9pZClwcmludG9uZShidWYsIG5hcmVuYXMgKiBBUkVOQV9TSVpFKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJ1IGFyZW5hcyAqICVkIGJ5dGVzL2FyZW5hIiwKKyAgICAgICAgbmFyZW5hcywgQVJFTkFfU0laRSk7CisgICAgKHZvaWQpcHJpbnRvbmUoYnVmLCBuYXJlbmFzICogQVJFTkFfU0laRSk7CiAKLQlmcHV0YygnXG4nLCBzdGRlcnIpOworICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CiAKLQl0b3RhbCA9IHByaW50b25lKCIjIGJ5dGVzIGluIGFsbG9jYXRlZCBibG9ja3MiLCBhbGxvY2F0ZWRfYnl0ZXMpOwotCXRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGluIGF2YWlsYWJsZSBibG9ja3MiLCBhdmFpbGFibGVfYnl0ZXMpOworICAgIHRvdGFsID0gcHJpbnRvbmUoIiMgYnl0ZXMgaW4gYWxsb2NhdGVkIGJsb2NrcyIsIGFsbG9jYXRlZF9ieXRlcyk7CisgICAgdG90YWwgKz0gcHJpbnRvbmUoIiMgYnl0ZXMgaW4gYXZhaWxhYmxlIGJsb2NrcyIsIGF2YWlsYWJsZV9ieXRlcyk7CiAKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCSIldSB1bnVzZWQgcG9vbHMgKiAlZCBieXRlcyIsIG51bWZyZWVwb29scywgUE9PTF9TSVpFKTsKLQl0b3RhbCArPSBwcmludG9uZShidWYsIChzaXplX3QpbnVtZnJlZXBvb2xzICogUE9PTF9TSVpFKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICIldSB1bnVzZWQgcG9vbHMgKiAlZCBieXRlcyIsIG51bWZyZWVwb29scywgUE9PTF9TSVpFKTsKKyAgICB0b3RhbCArPSBwcmludG9uZShidWYsIChzaXplX3QpbnVtZnJlZXBvb2xzICogUE9PTF9TSVpFKTsKIAotCXRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGxvc3QgdG8gcG9vbCBoZWFkZXJzIiwgcG9vbF9oZWFkZXJfYnl0ZXMpOwotCXRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGxvc3QgdG8gcXVhbnRpemF0aW9uIiwgcXVhbnRpemF0aW9uKTsKLQl0b3RhbCArPSBwcmludG9uZSgiIyBieXRlcyBsb3N0IHRvIGFyZW5hIGFsaWdubWVudCIsIGFyZW5hX2FsaWdubWVudCk7Ci0JKHZvaWQpcHJpbnRvbmUoIlRvdGFsIiwgdG90YWwpOworICAgIHRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGxvc3QgdG8gcG9vbCBoZWFkZXJzIiwgcG9vbF9oZWFkZXJfYnl0ZXMpOworICAgIHRvdGFsICs9IHByaW50b25lKCIjIGJ5dGVzIGxvc3QgdG8gcXVhbnRpemF0aW9uIiwgcXVhbnRpemF0aW9uKTsKKyAgICB0b3RhbCArPSBwcmludG9uZSgiIyBieXRlcyBsb3N0IHRvIGFyZW5hIGFsaWdubWVudCIsIGFyZW5hX2FsaWdubWVudCk7CisgICAgKHZvaWQpcHJpbnRvbmUoIlRvdGFsIiwgdG90YWwpOwogfQogCi0jZW5kaWYJLyogUFlNQUxMT0NfREVCVUcgKi8KKyNlbmRpZiAgLyogUFlNQUxMT0NfREVCVUcgKi8KIAogI2lmZGVmIFB5X1VTSU5HX01FTU9SWV9ERUJVR0dFUgogLyogTWFrZSB0aGlzIGZ1bmN0aW9uIGxhc3Qgc28gZ2NjIHdvbid0IGlubGluZSBpdCBzaW5jZSB0aGUgZGVmaW5pdGlvbiBpcwpAQCAtMTc1OCw4ICsxNzU4LDggQEAKIGludAogUHlfQUREUkVTU19JTl9SQU5HRSh2b2lkICpQLCBwb29scCBwb29sKQogewotCXJldHVybiBwb29sLT5hcmVuYWluZGV4IDwgbWF4YXJlbmFzICYmCi0JICAgICAgICh1cHRyKVAgLSBhcmVuYXNbcG9vbC0+YXJlbmFpbmRleF0uYWRkcmVzcyA8ICh1cHRyKUFSRU5BX1NJWkUgJiYKLQkgICAgICAgYXJlbmFzW3Bvb2wtPmFyZW5haW5kZXhdLmFkZHJlc3MgIT0gMDsKKyAgICByZXR1cm4gcG9vbC0+YXJlbmFpbmRleCA8IG1heGFyZW5hcyAmJgorICAgICAgICAgICAodXB0cilQIC0gYXJlbmFzW3Bvb2wtPmFyZW5haW5kZXhdLmFkZHJlc3MgPCAodXB0cilBUkVOQV9TSVpFICYmCisgICAgICAgICAgIGFyZW5hc1twb29sLT5hcmVuYWluZGV4XS5hZGRyZXNzICE9IDA7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL09iamVjdHMvcmFuZ2VvYmplY3QuYyBiL09iamVjdHMvcmFuZ2VvYmplY3QuYwppbmRleCBmNDViNzcxLi40ZTY0ZGJhIDEwMDY0NAotLS0gYS9PYmplY3RzL3Jhbmdlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9yYW5nZW9iamVjdC5jCkBAIC0zLDEwICszLDEwIEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JbG9uZwlzdGFydDsKLQlsb25nCXN0ZXA7Ci0JbG9uZwlsZW47CisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgICAgICAgIHN0YXJ0OworICAgIGxvbmcgICAgICAgIHN0ZXA7CisgICAgbG9uZyAgICAgICAgbGVuOwogfSByYW5nZW9iamVjdDsKIAogLyogUmV0dXJuIG51bWJlciBvZiBpdGVtcyBpbiByYW5nZSAobG8sIGhpLCBzdGVwKS4gIHN0ZXAgIT0gMApAQCAtMzAsNTMgKzMwLDUzIEBACiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgICBhc3NlcnQoc3RlcCAhPSAwKTsKICAgICBpZiAoc3RlcCA+IDAgJiYgbG8gPCBoaSkKLSAgICAgICAgcmV0dXJuIDFVTCArIChoaSAtIDFVTCAtIGxvKSAvIHN0ZXA7CisgICAgcmV0dXJuIDFVTCArIChoaSAtIDFVTCAtIGxvKSAvIHN0ZXA7CiAgICAgZWxzZSBpZiAoc3RlcCA8IDAgJiYgbG8gPiBoaSkKLSAgICAgICAgcmV0dXJuIDFVTCArIChsbyAtIDFVTCAtIGhpKSAvICgwVUwgLSBzdGVwKTsKKyAgICByZXR1cm4gMVVMICsgKGxvIC0gMVVMIC0gaGkpIC8gKDBVTCAtIHN0ZXApOwogICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDBVTDsKKyAgICByZXR1cm4gMFVMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZ2VfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLQlyYW5nZW9iamVjdCAqb2JqOwotCWxvbmcgaWxvdyA9IDAsIGloaWdoID0gMCwgaXN0ZXAgPSAxOwotCXVuc2lnbmVkIGxvbmcgbjsKKyAgICByYW5nZW9iamVjdCAqb2JqOworICAgIGxvbmcgaWxvdyA9IDAsIGloaWdoID0gMCwgaXN0ZXAgPSAxOworICAgIHVuc2lnbmVkIGxvbmcgbjsKIAotCWlmICghX1B5QXJnX05vS2V5d29yZHMoInhyYW5nZSgpIiwga3cpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJ4cmFuZ2UoKSIsIGt3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpIDw9IDEpIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkJImw7eHJhbmdlKCkgcmVxdWlyZXMgMS0zIGludCBhcmd1bWVudHMiLAotCQkJCSZpaGlnaCkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAotCQkJCSJsbHxsO3hyYW5nZSgpIHJlcXVpcmVzIDEtMyBpbnQgYXJndW1lbnRzIiwKLQkJCQkmaWxvdywgJmloaWdoLCAmaXN0ZXApKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChpc3RlcCA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAieHJhbmdlKCkgYXJnIDMgbXVzdCBub3QgYmUgemVybyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbiA9IGdldF9sZW5fb2ZfcmFuZ2UoaWxvdywgaWhpZ2gsIGlzdGVwKTsKLQlpZiAobiA+ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYIHx8IChsb25nKW4gPiBQWV9TU0laRV9UX01BWCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkieHJhbmdlKCkgcmVzdWx0IGhhcyB0b28gbWFueSBpdGVtcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA8PSAxKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgImw7eHJhbmdlKCkgcmVxdWlyZXMgMS0zIGludCBhcmd1bWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgJmloaWdoKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAibGx8bDt4cmFuZ2UoKSByZXF1aXJlcyAxLTMgaW50IGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWxvdywgJmloaWdoLCAmaXN0ZXApKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpc3RlcCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAieHJhbmdlKCkgYXJnIDMgbXVzdCBub3QgYmUgemVybyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbiA9IGdldF9sZW5fb2ZfcmFuZ2UoaWxvdywgaWhpZ2gsIGlzdGVwKTsKKyAgICBpZiAobiA+ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYIHx8IChsb25nKW4gPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ4cmFuZ2UoKSByZXN1bHQgaGFzIHRvbyBtYW55IGl0ZW1zIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCW9iaiA9IFB5T2JqZWN0X05ldyhyYW5nZW9iamVjdCwgJlB5UmFuZ2VfVHlwZSk7Ci0JaWYgKG9iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlvYmotPnN0YXJ0ID0gaWxvdzsKLQlvYmotPmxlbiAgID0gKGxvbmcpbjsKLQlvYmotPnN0ZXAgID0gaXN0ZXA7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvYmo7CisgICAgb2JqID0gUHlPYmplY3RfTmV3KHJhbmdlb2JqZWN0LCAmUHlSYW5nZV9UeXBlKTsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9iai0+c3RhcnQgPSBpbG93OworICAgIG9iai0+bGVuICAgPSAobG9uZyluOworICAgIG9iai0+c3RlcCAgPSBpc3RlcDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9iajsKIH0KIAogUHlEb2NfU1RSVkFSKHJhbmdlX2RvYywKQEAgLTg5LDYwICs4OSw2MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmdlX2l0ZW0ocmFuZ2VvYmplY3QgKnIsIFB5X3NzaXplX3QgaSkKIHsKLQlpZiAoaSA8IDAgfHwgaSA+PSByLT5sZW4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJInhyYW5nZSBvYmplY3QgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBkbyBjYWxjdWxhdGlvbiBlbnRpcmVseSB1c2luZyB1bnNpZ25lZCBsb25ncywgdG8gYXZvaWQKLQkgICB1bmRlZmluZWQgYmVoYXZpb3VyIGR1ZSB0byBzaWduZWQgb3ZlcmZsb3cuICovCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKShyLT5zdGFydCArICh1bnNpZ25lZCBsb25nKWkgKiByLT5zdGVwKSk7CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gci0+bGVuKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInhyYW5nZSBvYmplY3QgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBkbyBjYWxjdWxhdGlvbiBlbnRpcmVseSB1c2luZyB1bnNpZ25lZCBsb25ncywgdG8gYXZvaWQKKyAgICAgICB1bmRlZmluZWQgYmVoYXZpb3VyIGR1ZSB0byBzaWduZWQgb3ZlcmZsb3cuICovCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKShyLT5zdGFydCArICh1bnNpZ25lZCBsb25nKWkgKiByLT5zdGVwKSk7CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiByYW5nZV9sZW5ndGgocmFuZ2VvYmplY3QgKnIpCiB7Ci0JcmV0dXJuIChQeV9zc2l6ZV90KShyLT5sZW4pOworICAgIHJldHVybiAoUHlfc3NpemVfdCkoci0+bGVuKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmdlX3JlcHIocmFuZ2VvYmplY3QgKnIpCiB7Ci0JUHlPYmplY3QgKnJ0bjsKKyAgICBQeU9iamVjdCAqcnRuOwogCi0JaWYgKHItPnN0YXJ0ID09IDAgJiYgci0+c3RlcCA9PSAxKQotCQlydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJ4cmFuZ2UoJWxkKSIsCi0JCQkJCSAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwKTsKKyAgICBpZiAoci0+c3RhcnQgPT0gMCAmJiByLT5zdGVwID09IDEpCisgICAgICAgIHJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInhyYW5nZSglbGQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zdGFydCArIHItPmxlbiAqIHItPnN0ZXApOwogCi0JZWxzZSBpZiAoci0+c3RlcCA9PSAxKQotCQlydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJ4cmFuZ2UoJWxkLCAlbGQpIiwKLQkJCQkJICByLT5zdGFydCwKLQkJCQkJICByLT5zdGFydCArIHItPmxlbiAqIHItPnN0ZXApOworICAgIGVsc2UgaWYgKHItPnN0ZXAgPT0gMSkKKyAgICAgICAgcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgieHJhbmdlKCVsZCwgJWxkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwKTsKIAotCWVsc2UKLQkJcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgieHJhbmdlKCVsZCwgJWxkLCAlbGQpIiwKLQkJCQkJICByLT5zdGFydCwKLQkJCQkJICByLT5zdGFydCArIHItPmxlbiAqIHItPnN0ZXAsCi0JCQkJCSAgci0+c3RlcCk7Ci0JcmV0dXJuIHJ0bjsKKyAgICBlbHNlCisgICAgICAgIHJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoInhyYW5nZSglbGQsICVsZCwgJWxkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0ZXApOworICAgIHJldHVybiBydG47CiB9CiAKIC8qIFBpY2tsaW5nIHN1cHBvcnQgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZV9yZWR1Y2UocmFuZ2VvYmplY3QgKnIsIFB5T2JqZWN0ICphcmdzKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoTyhpaWkpKSIsIFB5X1RZUEUociksCi0JCQkgICAgIHItPnN0YXJ0LAotCQkJICAgICByLT5zdGFydCArIHItPmxlbiAqIHItPnN0ZXAsCi0JCQkgICAgIHItPnN0ZXApOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoTyhpaWkpKSIsIFB5X1RZUEUociksCisgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgci0+c3RhcnQgKyByLT5sZW4gKiByLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHItPnN0ZXApOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgcmFuZ2VfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpcmFuZ2VfbGVuZ3RoLAkvKiBzcV9sZW5ndGggKi8KLQkwLAkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJLyogc3FfcmVwZWF0ICovCi0JKHNzaXplYXJnZnVuYylyYW5nZV9pdGVtLCAvKiBzcV9pdGVtICovCi0JMCwJCQkvKiBzcV9zbGljZSAqLworICAgIChsZW5mdW5jKXJhbmdlX2xlbmd0aCwgICAgICAvKiBzcV9sZW5ndGggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdCAqLworICAgIChzc2l6ZWFyZ2Z1bmMpcmFuZ2VfaXRlbSwgLyogc3FfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9zbGljZSAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICogcmFuZ2VfaXRlcihQeU9iamVjdCAqc2VxKTsKQEAgLTE1MiwxNzEgKzE1MiwxNzEgQEAKICJSZXR1cm5zIGEgcmV2ZXJzZSBpdGVyYXRvci4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHJhbmdlX21ldGhvZHNbXSA9IHsKLQl7Il9fcmV2ZXJzZWRfXyIsCShQeUNGdW5jdGlvbilyYW5nZV9yZXZlcnNlLCBNRVRIX05PQVJHUywgcmV2ZXJzZV9kb2N9LAotCXsiX19yZWR1Y2VfXyIsCQkoUHlDRnVuY3Rpb24pcmFuZ2VfcmVkdWNlLCBNRVRIX1ZBUkFSR1N9LAotIAl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiX19yZXZlcnNlZF9fIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pcmFuZ2VfcmV2ZXJzZSwgTUVUSF9OT0FSR1MsIHJldmVyc2VfZG9jfSwKKyAgICB7Il9fcmVkdWNlX18iLCAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXJhbmdlX3JlZHVjZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5UmFuZ2VfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsCQkJLyogTnVtYmVyIG9mIGl0ZW1zIGZvciB2YXJvYmplY3QgKi8KLQkieHJhbmdlIiwJCS8qIE5hbWUgb2YgdGhpcyB0eXBlICovCi0Jc2l6ZW9mKHJhbmdlb2JqZWN0KSwJLyogQmFzaWMgb2JqZWN0IHNpemUgKi8KLQkwLAkJCS8qIEl0ZW0gc2l6ZSBmb3IgdmFyb2JqZWN0ICovCi0JKGRlc3RydWN0b3IpUHlPYmplY3RfRGVsLCAvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylyYW5nZV9yZXByLAkvKiB0cF9yZXByICovCi0JMCwJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmcmFuZ2VfYXNfc2VxdWVuY2UsCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgIC8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkvKiB0cF9mbGFncyAqLwotCXJhbmdlX2RvYywJCS8qIHRwX2RvYyAqLwotCTAsCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotCTAsCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlyYW5nZV9pdGVyLAkJLyogdHBfaXRlciAqLwotCTAsCQkJLyogdHBfaXRlcm5leHQgKi8KLQlyYW5nZV9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJLyogdHBfYWxsb2MgKi8KLQlyYW5nZV9uZXcsCQkvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaXRlbXMgZm9yIHZhcm9iamVjdCAqLworICAgICJ4cmFuZ2UiLCAgICAgICAgICAgICAgICAgICAvKiBOYW1lIG9mIHRoaXMgdHlwZSAqLworICAgIHNpemVvZihyYW5nZW9iamVjdCksICAgICAgICAvKiBCYXNpYyBvYmplY3Qgc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJdGVtIHNpemUgZm9yIHZhcm9iamVjdCAqLworICAgIChkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylyYW5nZV9yZXByLCAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZyYW5nZV9hc19zZXF1ZW5jZSwgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIHJhbmdlX2RvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICByYW5nZV9pdGVyLCAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHJhbmdlX21ldGhvZHMsICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHJhbmdlX25ldywgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiBYcmFuZ2UgSXRlcmF0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JbG9uZwlpbmRleDsKLQlsb25nCXN0YXJ0OwotCWxvbmcJc3RlcDsKLQlsb25nCWxlbjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgbG9uZyAgICAgICAgaW5kZXg7CisgICAgbG9uZyAgICAgICAgc3RhcnQ7CisgICAgbG9uZyAgICAgICAgc3RlcDsKKyAgICBsb25nICAgICAgICBsZW47CiB9IHJhbmdlaXRlcm9iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmdlaXRlcl9uZXh0KHJhbmdlaXRlcm9iamVjdCAqcikKIHsKLQlpZiAoci0+aW5kZXggPCByLT5sZW4pCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyhyLT5zdGFydCArIChyLT5pbmRleCsrKSAqIHItPnN0ZXApOwotCXJldHVybiBOVUxMOworICAgIGlmIChyLT5pbmRleCA8IHItPmxlbikKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHItPnN0YXJ0ICsgKHItPmluZGV4KyspICogci0+c3RlcCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZWl0ZXJfbGVuKHJhbmdlaXRlcm9iamVjdCAqcikKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoci0+bGVuIC0gci0+aW5kZXgpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyLT5sZW4gLSByLT5pbmRleCk7CiB9CiAKIFB5RG9jX1NUUlZBUihsZW5ndGhfaGludF9kb2MsICJQcml2YXRlIG1ldGhvZCByZXR1cm5pbmcgYW4gZXN0aW1hdGUgb2YgbGVuKGxpc3QoaXQpKS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHJhbmdlaXRlcl9tZXRob2RzW10gPSB7Ci0JeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pcmFuZ2VpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pcmFuZ2VpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlyYW5nZWl0ZXJfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCi0JInJhbmdlaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KLQlzaXplb2YocmFuZ2VpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKVB5T2JqZWN0X0RlbCwJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYylyYW5nZWl0ZXJfbmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JcmFuZ2VpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworICAgICJyYW5nZWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHJhbmdlaXRlcm9iamVjdCksICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXJhbmdlaXRlcl9uZXh0LCAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgcmFuZ2VpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZV9pdGVyKFB5T2JqZWN0ICpzZXEpCiB7Ci0JcmFuZ2VpdGVyb2JqZWN0ICppdDsKKyAgICByYW5nZWl0ZXJvYmplY3QgKml0OwogCi0JaWYgKCFQeVJhbmdlX0NoZWNrKHNlcSkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05ldyhyYW5nZWl0ZXJvYmplY3QsICZQeXJhbmdlaXRlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXQtPmluZGV4ID0gMDsKLQlpdC0+c3RhcnQgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RhcnQ7Ci0JaXQtPnN0ZXAgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RlcDsKLQlpdC0+bGVuID0gKChyYW5nZW9iamVjdCAqKXNlcSktPmxlbjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaWYgKCFQeVJhbmdlX0NoZWNrKHNlcSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05ldyhyYW5nZWl0ZXJvYmplY3QsICZQeXJhbmdlaXRlcl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXQtPmluZGV4ID0gMDsKKyAgICBpdC0+c3RhcnQgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RhcnQ7CisgICAgaXQtPnN0ZXAgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RlcDsKKyAgICBpdC0+bGVuID0gKChyYW5nZW9iamVjdCAqKXNlcSktPmxlbjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByYW5nZV9yZXZlcnNlKFB5T2JqZWN0ICpzZXEpCiB7Ci0JcmFuZ2VpdGVyb2JqZWN0ICppdDsKLQlsb25nIHN0YXJ0LCBzdGVwLCBsZW47CisgICAgcmFuZ2VpdGVyb2JqZWN0ICppdDsKKyAgICBsb25nIHN0YXJ0LCBzdGVwLCBsZW47CiAKLQlpZiAoIVB5UmFuZ2VfQ2hlY2soc2VxKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTmV3KHJhbmdlaXRlcm9iamVjdCwgJlB5cmFuZ2VpdGVyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5UmFuZ2VfQ2hlY2soc2VxKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTmV3KHJhbmdlaXRlcm9iamVjdCwgJlB5cmFuZ2VpdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0YXJ0ID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0YXJ0OwotCXN0ZXAgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RlcDsKLQlsZW4gPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+bGVuOworICAgIHN0YXJ0ID0gKChyYW5nZW9iamVjdCAqKXNlcSktPnN0YXJ0OworICAgIHN0ZXAgPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+c3RlcDsKKyAgICBsZW4gPSAoKHJhbmdlb2JqZWN0ICopc2VxKS0+bGVuOwogCi0JaXQtPmluZGV4ID0gMDsKLQlpdC0+bGVuID0gbGVuOwotCS8qIHRoZSBjYXN0cyBiZWxvdyBndWFyZCBhZ2FpbnN0IHNpZ25lZCBvdmVyZmxvdyBieSB0dXJuaW5nIGl0Ci0JICAgaW50byB1bnNpZ25lZCBvdmVyZmxvdyBpbnN0ZWFkLiAgVGhlIGNvcnJlY3RuZXNzIG9mIHRoaXMKLQkgICBjb2RlIHN0aWxsIGRlcGVuZHMgb24gY29udmVyc2lvbiBmcm9tIHVuc2lnbmVkIGxvbmcgdG8gbG9uZwotCSAgIHdyYXBwaW5nIG1vZHVsbyBVTE9OR19NQVgrMSwgd2hpY2ggaXNuJ3QgZ3VhcmFudGVlZCAoc2VlCi0JICAgQzk5IDYuMy4xLjNwMykgYnV0IHNlZW1zIHRvIGhvbGQgaW4gcHJhY3RpY2UgZm9yIGFsbAotCSAgIHBsYXRmb3JtcyB3ZSdyZSBsaWtlbHkgdG8gbWVldC4KKyAgICBpdC0+aW5kZXggPSAwOworICAgIGl0LT5sZW4gPSBsZW47CisgICAgLyogdGhlIGNhc3RzIGJlbG93IGd1YXJkIGFnYWluc3Qgc2lnbmVkIG92ZXJmbG93IGJ5IHR1cm5pbmcgaXQKKyAgICAgICBpbnRvIHVuc2lnbmVkIG92ZXJmbG93IGluc3RlYWQuICBUaGUgY29ycmVjdG5lc3Mgb2YgdGhpcworICAgICAgIGNvZGUgc3RpbGwgZGVwZW5kcyBvbiBjb252ZXJzaW9uIGZyb20gdW5zaWduZWQgbG9uZyB0byBsb25nCisgICAgICAgd3JhcHBpbmcgbW9kdWxvIFVMT05HX01BWCsxLCB3aGljaCBpc24ndCBndWFyYW50ZWVkIChzZWUKKyAgICAgICBDOTkgNi4zLjEuM3AzKSBidXQgc2VlbXMgdG8gaG9sZCBpbiBwcmFjdGljZSBmb3IgYWxsCisgICAgICAgcGxhdGZvcm1zIHdlJ3JlIGxpa2VseSB0byBtZWV0LgogCi0JICAgSWYgc3RlcCA9PSBMT05HX01JTiB0aGVuIHdlIHN0aWxsIGVuZCB1cCB3aXRoIExPTkdfTUlOCi0JICAgYWZ0ZXIgbmVnYXRpb247IGJ1dCB0aGlzIHdvcmtzIG91dCwgc2luY2Ugd2UndmUgc3RpbGwgZ290Ci0JICAgdGhlIGNvcnJlY3QgdmFsdWUgbW9kdWxvIFVMT05HX01BWCsxLCBhbmQgdGhlIHJhbmdlX2l0ZW0KLQkgICBjYWxjdWxhdGlvbiBpcyBhbHNvIGRvbmUgbW9kdWxvIFVMT05HX01BWCsxLgotCSovCi0JaXQtPnN0YXJ0ID0gKGxvbmcpKHN0YXJ0ICsgKHVuc2lnbmVkIGxvbmcpKGxlbi0xKSAqIHN0ZXApOwotCWl0LT5zdGVwID0gKGxvbmcpKDBVTC1zdGVwKTsKKyAgICAgICBJZiBzdGVwID09IExPTkdfTUlOIHRoZW4gd2Ugc3RpbGwgZW5kIHVwIHdpdGggTE9OR19NSU4KKyAgICAgICBhZnRlciBuZWdhdGlvbjsgYnV0IHRoaXMgd29ya3Mgb3V0LCBzaW5jZSB3ZSd2ZSBzdGlsbCBnb3QKKyAgICAgICB0aGUgY29ycmVjdCB2YWx1ZSBtb2R1bG8gVUxPTkdfTUFYKzEsIGFuZCB0aGUgcmFuZ2VfaXRlbQorICAgICAgIGNhbGN1bGF0aW9uIGlzIGFsc28gZG9uZSBtb2R1bG8gVUxPTkdfTUFYKzEuCisgICAgKi8KKyAgICBpdC0+c3RhcnQgPSAobG9uZykoc3RhcnQgKyAodW5zaWduZWQgbG9uZykobGVuLTEpICogc3RlcCk7CisgICAgaXQtPnN0ZXAgPSAobG9uZykoMFVMLXN0ZXApOwogCi0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvc2V0b2JqZWN0LmMgYi9PYmplY3RzL3NldG9iamVjdC5jCmluZGV4IDQ3MzYyZWIuLjZhNmViM2EgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc2V0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zZXRvYmplY3QuYwpAQCAtMSw1ICsxLDUgQEAKIAotLyogc2V0IG9iamVjdCBpbXBsZW1lbnRhdGlvbiAKKy8qIHNldCBvYmplY3QgaW1wbGVtZW50YXRpb24KICAgIFdyaXR0ZW4gYW5kIG1haW50YWluZWQgYnkgUmF5bW9uZCBELiBIZXR0aW5nZXIgPHB5dGhvbkByY24uY29tPgogICAgRGVyaXZlZCBmcm9tIExpYi9zZXRzLnB5IGFuZCBPYmplY3RzL2RpY3RvYmplY3QuYy4KIApAQCAtMTYsMTIgKzE2LDEyIEBACiBzdGF0aWMgdm9pZAogc2V0X2tleV9lcnJvcihQeU9iamVjdCAqYXJnKQogewotCVB5T2JqZWN0ICp0dXA7Ci0JdHVwID0gUHlUdXBsZV9QYWNrKDEsIGFyZyk7Ci0JaWYgKCF0dXApCi0JCXJldHVybjsgLyogY2FsbGVyIHdpbGwgZXhwZWN0IGVycm9yIHRvIGJlIHNldCBhbnl3YXkgKi8KLQlQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIHR1cCk7Ci0JUHlfREVDUkVGKHR1cCk7CisgICAgUHlPYmplY3QgKnR1cDsKKyAgICB0dXAgPSBQeVR1cGxlX1BhY2soMSwgYXJnKTsKKyAgICBpZiAoIXR1cCkKKyAgICAgICAgcmV0dXJuOyAvKiBjYWxsZXIgd2lsbCBleHBlY3QgZXJyb3IgdG8gYmUgc2V0IGFueXdheSAqLworICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwgdHVwKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKIH0KIAogLyogVGhpcyBtdXN0IGJlID49IDEuICovCkBAIC0zNCwyMCArMzQsMjAgQEAKIFB5T2JqZWN0ICoKIF9QeVNldF9EdW1teSh2b2lkKQogewotCXJldHVybiBkdW1teTsKKyAgICByZXR1cm4gZHVtbXk7CiB9CiAjZW5kaWYKIAotI2RlZmluZSBJTklUX05PTlpFUk9fU0VUX1NMT1RTKHNvKSBkbyB7CQkJCVwKLQkoc28pLT50YWJsZSA9IChzbyktPnNtYWxsdGFibGU7CQkJCVwKLQkoc28pLT5tYXNrID0gUHlTZXRfTUlOU0laRSAtIDE7CQkJCVwKLQkoc28pLT5oYXNoID0gLTE7CQkJCQlcCisjZGVmaW5lIElOSVRfTk9OWkVST19TRVRfU0xPVFMoc28pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChzbyktPnRhYmxlID0gKHNvKS0+c21hbGx0YWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc28pLT5tYXNrID0gUHlTZXRfTUlOU0laRSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHNvKS0+aGFzaCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUoMCkKIAotI2RlZmluZSBFTVBUWV9UT19NSU5TSVpFKHNvKSBkbyB7CQkJCVwKLQltZW1zZXQoKHNvKS0+c21hbGx0YWJsZSwgMCwgc2l6ZW9mKChzbyktPnNtYWxsdGFibGUpKTsJXAotCShzbyktPnVzZWQgPSAoc28pLT5maWxsID0gMDsJCQkJXAotCUlOSVRfTk9OWkVST19TRVRfU0xPVFMoc28pOwkJCQlcCisjZGVmaW5lIEVNUFRZX1RPX01JTlNJWkUoc28pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbXNldCgoc28pLT5zbWFsbHRhYmxlLCAwLCBzaXplb2YoKHNvKS0+c21hbGx0YWJsZSkpOyAgICAgIFwKKyAgICAoc28pLT51c2VkID0gKHNvKS0+ZmlsbCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSU5JVF9OT05aRVJPX1NFVF9TTE9UUyhzbyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUoMCkKIAogLyogUmV1c2Ugc2NoZW1lIHRvIHNhdmUgY2FsbHMgdG8gbWFsbG9jLCBmcmVlLCBhbmQgbWVtc2V0ICovCkBAIC03NSw3OCArNzUsNzggQEAKIHN0YXRpYyBzZXRlbnRyeSAqCiBzZXRfbG9va2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIHJlZ2lzdGVyIGxvbmcgaGFzaCkKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGk7Ci0JcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7Ci0JcmVnaXN0ZXIgc2V0ZW50cnkgKmZyZWVzbG90OwotCXJlZ2lzdGVyIHNpemVfdCBtYXNrID0gc28tPm1hc2s7Ci0Jc2V0ZW50cnkgKnRhYmxlID0gc28tPnRhYmxlOwotCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKLQlyZWdpc3RlciBpbnQgY21wOwotCVB5T2JqZWN0ICpzdGFydGtleTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7CisgICAgcmVnaXN0ZXIgc2V0ZW50cnkgKmZyZWVzbG90OworICAgIHJlZ2lzdGVyIHNpemVfdCBtYXNrID0gc28tPm1hc2s7CisgICAgc2V0ZW50cnkgKnRhYmxlID0gc28tPnRhYmxlOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICByZWdpc3RlciBpbnQgY21wOworICAgIFB5T2JqZWN0ICpzdGFydGtleTsKIAotCWkgPSBoYXNoICYgbWFzazsKLQllbnRyeSA9ICZ0YWJsZVtpXTsKLQlpZiAoZW50cnktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgPT0ga2V5KQotCQlyZXR1cm4gZW50cnk7CisgICAgaSA9IGhhc2ggJiBtYXNrOworICAgIGVudHJ5ID0gJnRhYmxlW2ldOworICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBrZXkpCisgICAgICAgIHJldHVybiBlbnRyeTsKIAotCWlmIChlbnRyeS0+a2V5ID09IGR1bW15KQotCQlmcmVlc2xvdCA9IGVudHJ5OwotCWVsc2UgewotCQlpZiAoZW50cnktPmhhc2ggPT0gaGFzaCkgewotCQkJc3RhcnRrZXkgPSBlbnRyeS0+a2V5OwotCQkJUHlfSU5DUkVGKHN0YXJ0a2V5KTsKLQkJCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7Ci0JCQlQeV9ERUNSRUYoc3RhcnRrZXkpOwotCQkJaWYgKGNtcCA8IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpZiAodGFibGUgPT0gc28tPnRhYmxlICYmIGVudHJ5LT5rZXkgPT0gc3RhcnRrZXkpIHsKLQkJCQlpZiAoY21wID4gMCkKLQkJCQkJcmV0dXJuIGVudHJ5OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogVGhlIGNvbXBhcmUgZGlkIG1ham9yIG5hc3R5IHN0dWZmIHRvIHRoZQotCQkJCSAqIHNldDogIHN0YXJ0IG92ZXIuCi0gCQkJCSAqLwotIAkJCQlyZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7Ci0gCQkJfQotCQl9Ci0JCWZyZWVzbG90ID0gTlVMTDsKLQl9CisgICAgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkpCisgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CisgICAgICAgICAgICBzdGFydGtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgICAgICBQeV9JTkNSRUYoc3RhcnRrZXkpOworICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHN0YXJ0a2V5LCBrZXksIFB5X0VRKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFydGtleSk7CisgICAgICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmICh0YWJsZSA9PSBzby0+dGFibGUgJiYgZW50cnktPmtleSA9PSBzdGFydGtleSkgeworICAgICAgICAgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCisgICAgICAgICAgICAgICAgICogc2V0OiAgc3RhcnQgb3Zlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZXNsb3QgPSBOVUxMOworICAgIH0KIAotCS8qIEluIHRoZSBsb29wLCBrZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCi0JICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KLQlmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKLQkJaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOwotCQllbnRyeSA9ICZ0YWJsZVtpICYgbWFza107Ci0JCWlmIChlbnRyeS0+a2V5ID09IE5VTEwpIHsKLQkJCWlmIChmcmVlc2xvdCAhPSBOVUxMKQotCQkJCWVudHJ5ID0gZnJlZXNsb3Q7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoZW50cnktPmtleSA9PSBrZXkpCi0JCQlicmVhazsKLQkJaWYgKGVudHJ5LT5oYXNoID09IGhhc2ggJiYgZW50cnktPmtleSAhPSBkdW1teSkgewotCQkJc3RhcnRrZXkgPSBlbnRyeS0+a2V5OwotCQkJUHlfSU5DUkVGKHN0YXJ0a2V5KTsKLQkJCWNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7Ci0JCQlQeV9ERUNSRUYoc3RhcnRrZXkpOwotCQkJaWYgKGNtcCA8IDApCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpZiAodGFibGUgPT0gc28tPnRhYmxlICYmIGVudHJ5LT5rZXkgPT0gc3RhcnRrZXkpIHsKLQkJCQlpZiAoY21wID4gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCi0JCQkJICogc2V0OiAgc3RhcnQgb3Zlci4KLSAJCQkJICovCi0gCQkJCXJldHVybiBzZXRfbG9va2tleShzbywga2V5LCBoYXNoKTsKLSAJCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQotCQkJZnJlZXNsb3QgPSBlbnRyeTsKLQl9Ci0JcmV0dXJuIGVudHJ5OworICAgIC8qIEluIHRoZSBsb29wLCBrZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCisgICAgICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KKyAgICBmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKKyAgICAgICAgaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOworICAgICAgICBlbnRyeSA9ICZ0YWJsZVtpICYgbWFza107CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChmcmVlc2xvdCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGVudHJ5ID0gZnJlZXNsb3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW50cnktPmtleSA9PSBrZXkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IGhhc2ggJiYgZW50cnktPmtleSAhPSBkdW1teSkgeworICAgICAgICAgICAgc3RhcnRrZXkgPSBlbnRyeS0+a2V5OworICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcnRrZXkpOworICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAodGFibGUgPT0gc28tPnRhYmxlICYmIGVudHJ5LT5rZXkgPT0gc3RhcnRrZXkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgY29tcGFyZSBkaWQgbWFqb3IgbmFzdHkgc3R1ZmYgdG8gdGhlCisgICAgICAgICAgICAgICAgICogc2V0OiAgc3RhcnQgb3Zlci4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgZnJlZXNsb3QgPSBlbnRyeTsKKyAgICB9CisgICAgcmV0dXJuIGVudHJ5OwogfQogCiAvKgpAQCAtMTU3LDUwICsxNTcsNTAgQEAKIHN0YXRpYyBzZXRlbnRyeSAqCiBzZXRfbG9va2tleV9zdHJpbmcoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCByZWdpc3RlciBsb25nIGhhc2gpCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOwotCXJlZ2lzdGVyIHNldGVudHJ5ICpmcmVlc2xvdDsKLQlyZWdpc3RlciBzaXplX3QgbWFzayA9IHNvLT5tYXNrOwotCXNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICpmcmVlc2xvdDsKKyAgICByZWdpc3RlciBzaXplX3QgbWFzayA9IHNvLT5tYXNrOworICAgIHNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CiAKLQkvKiBNYWtlIHN1cmUgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgdG8gaGFuZGxlIG5vbi1zdHJpbmcga2V5cywKLQkgICBpbmNsdWRpbmcgc3ViY2xhc3NlcyBvZiBzdHI7IGUuZy4sIG9uZSByZWFzb24gdG8gc3ViY2xhc3MKLQkgICBzdHJpbmdzIGlzIHRvIG92ZXJyaWRlIF9fZXFfXywgYW5kIGZvciBzcGVlZCB3ZSBkb24ndCBjYXRlciB0bwotCSAgIHRoYXQgaGVyZS4gKi8KLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSkgewotCQlzby0+bG9va3VwID0gc2V0X2xvb2trZXk7Ci0JCXJldHVybiBzZXRfbG9va2tleShzbywga2V5LCBoYXNoKTsKLQl9Ci0JaSA9IGhhc2ggJiBtYXNrOwotCWVudHJ5ID0gJnRhYmxlW2ldOwotCWlmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBrZXkpCi0JCXJldHVybiBlbnRyeTsKLQlpZiAoZW50cnktPmtleSA9PSBkdW1teSkKLQkJZnJlZXNsb3QgPSBlbnRyeTsKLQllbHNlIHsKLQkJaWYgKGVudHJ5LT5oYXNoID09IGhhc2ggJiYgX1B5U3RyaW5nX0VxKGVudHJ5LT5rZXksIGtleSkpCi0JCQlyZXR1cm4gZW50cnk7Ci0JCWZyZWVzbG90ID0gTlVMTDsKLQl9CisgICAgLyogTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBoYXZlIHRvIGhhbmRsZSBub24tc3RyaW5nIGtleXMsCisgICAgICAgaW5jbHVkaW5nIHN1YmNsYXNzZXMgb2Ygc3RyOyBlLmcuLCBvbmUgcmVhc29uIHRvIHN1YmNsYXNzCisgICAgICAgc3RyaW5ncyBpcyB0byBvdmVycmlkZSBfX2VxX18sIGFuZCBmb3Igc3BlZWQgd2UgZG9uJ3QgY2F0ZXIgdG8KKyAgICAgICB0aGF0IGhlcmUuICovCisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKKyAgICAgICAgc28tPmxvb2t1cCA9IHNldF9sb29ra2V5OworICAgICAgICByZXR1cm4gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7CisgICAgfQorICAgIGkgPSBoYXNoICYgbWFzazsKKyAgICBlbnRyeSA9ICZ0YWJsZVtpXTsKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgPT0ga2V5KQorICAgICAgICByZXR1cm4gZW50cnk7CisgICAgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkpCisgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoICYmIF9QeVN0cmluZ19FcShlbnRyeS0+a2V5LCBrZXkpKQorICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICBmcmVlc2xvdCA9IE5VTEw7CisgICAgfQogCi0JLyogSW4gdGhlIGxvb3AsIGtleSA9PSBkdW1teSBpcyBieSBmYXIgKGZhY3RvciBvZiAxMDBzKSB0aGUKLQkgICBsZWFzdCBsaWtlbHkgb3V0Y29tZSwgc28gdGVzdCBmb3IgdGhhdCBsYXN0LiAqLwotCWZvciAocGVydHVyYiA9IGhhc2g7IDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgewotCQlpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7Ci0JCWVudHJ5ID0gJnRhYmxlW2kgJiBtYXNrXTsKLQkJaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkKLQkJCXJldHVybiBmcmVlc2xvdCA9PSBOVUxMID8gZW50cnkgOiBmcmVlc2xvdDsKLQkJaWYgKGVudHJ5LT5rZXkgPT0ga2V5Ci0JCSAgICB8fCAoZW50cnktPmhhc2ggPT0gaGFzaAotCQkJJiYgZW50cnktPmtleSAhPSBkdW1teQotCQkJJiYgX1B5U3RyaW5nX0VxKGVudHJ5LT5rZXksIGtleSkpKQotCQkJcmV0dXJuIGVudHJ5OwotCQlpZiAoZW50cnktPmtleSA9PSBkdW1teSAmJiBmcmVlc2xvdCA9PSBOVUxMKQotCQkJZnJlZXNsb3QgPSBlbnRyeTsKLQl9Ci0JYXNzZXJ0KDApOwkvKiBOT1QgUkVBQ0hFRCAqLwotCXJldHVybiAwOworICAgIC8qIEluIHRoZSBsb29wLCBrZXkgPT0gZHVtbXkgaXMgYnkgZmFyIChmYWN0b3Igb2YgMTAwcykgdGhlCisgICAgICAgbGVhc3QgbGlrZWx5IG91dGNvbWUsIHNvIHRlc3QgZm9yIHRoYXQgbGFzdC4gKi8KKyAgICBmb3IgKHBlcnR1cmIgPSBoYXNoOyA7IHBlcnR1cmIgPj49IFBFUlRVUkJfU0hJRlQpIHsKKyAgICAgICAgaSA9IChpIDw8IDIpICsgaSArIHBlcnR1cmIgKyAxOworICAgICAgICBlbnRyeSA9ICZ0YWJsZVtpICYgbWFza107CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZnJlZXNsb3QgPT0gTlVMTCA/IGVudHJ5IDogZnJlZXNsb3Q7CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IGtleQorICAgICAgICAgICAgfHwgKGVudHJ5LT5oYXNoID09IGhhc2gKKyAgICAgICAgICAgICYmIGVudHJ5LT5rZXkgIT0gZHVtbXkKKyAgICAgICAgICAgICYmIF9QeVN0cmluZ19FcShlbnRyeS0+a2V5LCBrZXkpKSkKKyAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkgJiYgZnJlZXNsb3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CisgICAgfQorICAgIGFzc2VydCgwKTsgICAgICAgICAgLyogTk9UIFJFQUNIRUQgKi8KKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTIxMSwzMCArMjExLDMwIEBACiBzdGF0aWMgaW50CiBzZXRfaW5zZXJ0X2tleShyZWdpc3RlciBQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCkKIHsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0JdHlwZWRlZiBzZXRlbnRyeSAqKCpsb29rdXBmdW5jKShQeVNldE9iamVjdCAqLCBQeU9iamVjdCAqLCBsb25nKTsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgdHlwZWRlZiBzZXRlbnRyeSAqKCpsb29rdXBmdW5jKShQeVNldE9iamVjdCAqLCBQeU9iamVjdCAqLCBsb25nKTsKIAotCWFzc2VydChzby0+bG9va3VwICE9IE5VTEwpOwotCWVudHJ5ID0gc28tPmxvb2t1cChzbywga2V5LCBoYXNoKTsKLQlpZiAoZW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChlbnRyeS0+a2V5ID09IE5VTEwpIHsKLQkJLyogVU5VU0VEICovCi0JCXNvLT5maWxsKys7IAotCQllbnRyeS0+a2V5ID0ga2V5OwotCQllbnRyeS0+aGFzaCA9IGhhc2g7Ci0JCXNvLT51c2VkKys7Ci0JfSBlbHNlIGlmIChlbnRyeS0+a2V5ID09IGR1bW15KSB7Ci0JCS8qIERVTU1ZICovCi0JCWVudHJ5LT5rZXkgPSBrZXk7Ci0JCWVudHJ5LT5oYXNoID0gaGFzaDsKLQkJc28tPnVzZWQrKzsKLQkJUHlfREVDUkVGKGR1bW15KTsKLQl9IGVsc2UgewotCQkvKiBBQ1RJVkUgKi8KLQkJUHlfREVDUkVGKGtleSk7Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChzby0+bG9va3VwICE9IE5VTEwpOworICAgIGVudHJ5ID0gc28tPmxvb2t1cChzbywga2V5LCBoYXNoKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpIHsKKyAgICAgICAgLyogVU5VU0VEICovCisgICAgICAgIHNvLT5maWxsKys7CisgICAgICAgIGVudHJ5LT5rZXkgPSBrZXk7CisgICAgICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKKyAgICAgICAgc28tPnVzZWQrKzsKKyAgICB9IGVsc2UgaWYgKGVudHJ5LT5rZXkgPT0gZHVtbXkpIHsKKyAgICAgICAgLyogRFVNTVkgKi8KKyAgICAgICAgZW50cnktPmtleSA9IGtleTsKKyAgICAgICAgZW50cnktPmhhc2ggPSBoYXNoOworICAgICAgICBzby0+dXNlZCsrOworICAgICAgICBQeV9ERUNSRUYoZHVtbXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEFDVElWRSAqLworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yNDgsMjIgKzI0OCwyMiBAQAogc3RhdGljIHZvaWQKIHNldF9pbnNlcnRfY2xlYW4ocmVnaXN0ZXIgUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpCiB7Ci0JcmVnaXN0ZXIgc2l6ZV90IGk7Ci0JcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7Ci0JcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSAoc2l6ZV90KXNvLT5tYXNrOwotCXNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgc2l6ZV90IHBlcnR1cmI7CisgICAgcmVnaXN0ZXIgc2l6ZV90IG1hc2sgPSAoc2l6ZV90KXNvLT5tYXNrOworICAgIHNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CiAKLQlpID0gaGFzaCAmIG1hc2s7Ci0JZW50cnkgPSAmdGFibGVbaV07Ci0JZm9yIChwZXJ0dXJiID0gaGFzaDsgZW50cnktPmtleSAhPSBOVUxMOyBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUKSB7Ci0JCWkgPSAoaSA8PCAyKSArIGkgKyBwZXJ0dXJiICsgMTsKLQkJZW50cnkgPSAmdGFibGVbaSAmIG1hc2tdOwotCX0KLQlzby0+ZmlsbCsrOwotCWVudHJ5LT5rZXkgPSBrZXk7Ci0JZW50cnktPmhhc2ggPSBoYXNoOwotCXNvLT51c2VkKys7CisgICAgaSA9IGhhc2ggJiBtYXNrOworICAgIGVudHJ5ID0gJnRhYmxlW2ldOworICAgIGZvciAocGVydHVyYiA9IGhhc2g7IGVudHJ5LT5rZXkgIT0gTlVMTDsgcGVydHVyYiA+Pj0gUEVSVFVSQl9TSElGVCkgeworICAgICAgICBpID0gKGkgPDwgMikgKyBpICsgcGVydHVyYiArIDE7CisgICAgICAgIGVudHJ5ID0gJnRhYmxlW2kgJiBtYXNrXTsKKyAgICB9CisgICAgc28tPmZpbGwrKzsKKyAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKKyAgICBzby0+dXNlZCsrOwogfQogCiAvKgpAQCAtMjc0LDg2ICsyNzQsODYgQEAKIHN0YXRpYyBpbnQKIHNldF90YWJsZV9yZXNpemUoUHlTZXRPYmplY3QgKnNvLCBQeV9zc2l6ZV90IG1pbnVzZWQpCiB7Ci0JUHlfc3NpemVfdCBuZXdzaXplOwotCXNldGVudHJ5ICpvbGR0YWJsZSwgKm5ld3RhYmxlLCAqZW50cnk7Ci0JUHlfc3NpemVfdCBpOwotCWludCBpc19vbGR0YWJsZV9tYWxsb2NlZDsKLQlzZXRlbnRyeSBzbWFsbF9jb3B5W1B5U2V0X01JTlNJWkVdOworICAgIFB5X3NzaXplX3QgbmV3c2l6ZTsKKyAgICBzZXRlbnRyeSAqb2xkdGFibGUsICpuZXd0YWJsZSwgKmVudHJ5OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgaXNfb2xkdGFibGVfbWFsbG9jZWQ7CisgICAgc2V0ZW50cnkgc21hbGxfY29weVtQeVNldF9NSU5TSVpFXTsKIAotCWFzc2VydChtaW51c2VkID49IDApOworICAgIGFzc2VydChtaW51c2VkID49IDApOwogCi0JLyogRmluZCB0aGUgc21hbGxlc3QgdGFibGUgc2l6ZSA+IG1pbnVzZWQuICovCi0JZm9yIChuZXdzaXplID0gUHlTZXRfTUlOU0laRTsKLQkgICAgIG5ld3NpemUgPD0gbWludXNlZCAmJiBuZXdzaXplID4gMDsKLQkgICAgIG5ld3NpemUgPDw9IDEpCi0JCTsKLQlpZiAobmV3c2l6ZSA8PSAwKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogRmluZCB0aGUgc21hbGxlc3QgdGFibGUgc2l6ZSA+IG1pbnVzZWQuICovCisgICAgZm9yIChuZXdzaXplID0gUHlTZXRfTUlOU0laRTsKKyAgICAgICAgIG5ld3NpemUgPD0gbWludXNlZCAmJiBuZXdzaXplID4gMDsKKyAgICAgICAgIG5ld3NpemUgPDw9IDEpCisgICAgICAgIDsKKyAgICBpZiAobmV3c2l6ZSA8PSAwKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBHZXQgc3BhY2UgZm9yIGEgbmV3IHRhYmxlLiAqLwotCW9sZHRhYmxlID0gc28tPnRhYmxlOwotCWFzc2VydChvbGR0YWJsZSAhPSBOVUxMKTsKLQlpc19vbGR0YWJsZV9tYWxsb2NlZCA9IG9sZHRhYmxlICE9IHNvLT5zbWFsbHRhYmxlOworICAgIC8qIEdldCBzcGFjZSBmb3IgYSBuZXcgdGFibGUuICovCisgICAgb2xkdGFibGUgPSBzby0+dGFibGU7CisgICAgYXNzZXJ0KG9sZHRhYmxlICE9IE5VTEwpOworICAgIGlzX29sZHRhYmxlX21hbGxvY2VkID0gb2xkdGFibGUgIT0gc28tPnNtYWxsdGFibGU7CiAKLQlpZiAobmV3c2l6ZSA9PSBQeVNldF9NSU5TSVpFKSB7Ci0JCS8qIEEgbGFyZ2UgdGFibGUgaXMgc2hyaW5raW5nLCBvciB3ZSBjYW4ndCBnZXQgYW55IHNtYWxsZXIuICovCi0JCW5ld3RhYmxlID0gc28tPnNtYWxsdGFibGU7Ci0JCWlmIChuZXd0YWJsZSA9PSBvbGR0YWJsZSkgewotCQkJaWYgKHNvLT5maWxsID09IHNvLT51c2VkKSB7Ci0JCQkJLyogTm8gZHVtbWllcywgc28gbm8gcG9pbnQgZG9pbmcgYW55dGhpbmcuICovCi0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkvKiBXZSdyZSBub3QgZ29pbmcgdG8gcmVzaXplIGl0LCBidXQgcmVidWlsZCB0aGUKLQkJCSAgIHRhYmxlIGFueXdheSB0byBwdXJnZSBvbGQgZHVtbXkgZW50cmllcy4KLQkJCSAgIFN1YnRsZTogIFRoaXMgaXMgKm5lY2Vzc2FyeSogaWYgZmlsbD09c2l6ZSwKLQkJCSAgIGFzIHNldF9sb29ra2V5IG5lZWRzIGF0IGxlYXN0IG9uZSB2aXJnaW4gc2xvdCB0bwotCQkJICAgdGVybWluYXRlIGZhaWxpbmcgc2VhcmNoZXMuICBJZiBmaWxsIDwgc2l6ZSwgaXQncwotCQkJICAgbWVyZWx5IGRlc2lyYWJsZSwgYXMgZHVtbWllcyBzbG93IHNlYXJjaGVzLiAqLwotCQkJYXNzZXJ0KHNvLT5maWxsID4gc28tPnVzZWQpOwotCQkJbWVtY3B5KHNtYWxsX2NvcHksIG9sZHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOwotCQkJb2xkdGFibGUgPSBzbWFsbF9jb3B5OwotCQl9Ci0JfQotCWVsc2UgewotCQluZXd0YWJsZSA9IFB5TWVtX05FVyhzZXRlbnRyeSwgbmV3c2l6ZSk7Ci0JCWlmIChuZXd0YWJsZSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfQorICAgIGlmIChuZXdzaXplID09IFB5U2V0X01JTlNJWkUpIHsKKyAgICAgICAgLyogQSBsYXJnZSB0YWJsZSBpcyBzaHJpbmtpbmcsIG9yIHdlIGNhbid0IGdldCBhbnkgc21hbGxlci4gKi8KKyAgICAgICAgbmV3dGFibGUgPSBzby0+c21hbGx0YWJsZTsKKyAgICAgICAgaWYgKG5ld3RhYmxlID09IG9sZHRhYmxlKSB7CisgICAgICAgICAgICBpZiAoc28tPmZpbGwgPT0gc28tPnVzZWQpIHsKKyAgICAgICAgICAgICAgICAvKiBObyBkdW1taWVzLCBzbyBubyBwb2ludCBkb2luZyBhbnl0aGluZy4gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdlJ3JlIG5vdCBnb2luZyB0byByZXNpemUgaXQsIGJ1dCByZWJ1aWxkIHRoZQorICAgICAgICAgICAgICAgdGFibGUgYW55d2F5IHRvIHB1cmdlIG9sZCBkdW1teSBlbnRyaWVzLgorICAgICAgICAgICAgICAgU3VidGxlOiAgVGhpcyBpcyAqbmVjZXNzYXJ5KiBpZiBmaWxsPT1zaXplLAorICAgICAgICAgICAgICAgYXMgc2V0X2xvb2trZXkgbmVlZHMgYXQgbGVhc3Qgb25lIHZpcmdpbiBzbG90IHRvCisgICAgICAgICAgICAgICB0ZXJtaW5hdGUgZmFpbGluZyBzZWFyY2hlcy4gIElmIGZpbGwgPCBzaXplLCBpdCdzCisgICAgICAgICAgICAgICBtZXJlbHkgZGVzaXJhYmxlLCBhcyBkdW1taWVzIHNsb3cgc2VhcmNoZXMuICovCisgICAgICAgICAgICBhc3NlcnQoc28tPmZpbGwgPiBzby0+dXNlZCk7CisgICAgICAgICAgICBtZW1jcHkoc21hbGxfY29weSwgb2xkdGFibGUsIHNpemVvZihzbWFsbF9jb3B5KSk7CisgICAgICAgICAgICBvbGR0YWJsZSA9IHNtYWxsX2NvcHk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5ld3RhYmxlID0gUHlNZW1fTkVXKHNldGVudHJ5LCBuZXdzaXplKTsKKyAgICAgICAgaWYgKG5ld3RhYmxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBNYWtlIHRoZSBzZXQgZW1wdHksIHVzaW5nIHRoZSBuZXcgdGFibGUuICovCi0JYXNzZXJ0KG5ld3RhYmxlICE9IG9sZHRhYmxlKTsKLQlzby0+dGFibGUgPSBuZXd0YWJsZTsKLQlzby0+bWFzayA9IG5ld3NpemUgLSAxOwotCW1lbXNldChuZXd0YWJsZSwgMCwgc2l6ZW9mKHNldGVudHJ5KSAqIG5ld3NpemUpOwotCXNvLT51c2VkID0gMDsKLQlpID0gc28tPmZpbGw7Ci0Jc28tPmZpbGwgPSAwOworICAgIC8qIE1ha2UgdGhlIHNldCBlbXB0eSwgdXNpbmcgdGhlIG5ldyB0YWJsZS4gKi8KKyAgICBhc3NlcnQobmV3dGFibGUgIT0gb2xkdGFibGUpOworICAgIHNvLT50YWJsZSA9IG5ld3RhYmxlOworICAgIHNvLT5tYXNrID0gbmV3c2l6ZSAtIDE7CisgICAgbWVtc2V0KG5ld3RhYmxlLCAwLCBzaXplb2Yoc2V0ZW50cnkpICogbmV3c2l6ZSk7CisgICAgc28tPnVzZWQgPSAwOworICAgIGkgPSBzby0+ZmlsbDsKKyAgICBzby0+ZmlsbCA9IDA7CiAKLQkvKiBDb3B5IHRoZSBkYXRhIG92ZXI7IHRoaXMgaXMgcmVmY291bnQtbmV1dHJhbCBmb3IgYWN0aXZlIGVudHJpZXM7Ci0JICAgZHVtbXkgZW50cmllcyBhcmVuJ3QgY29waWVkIG92ZXIsIG9mIGNvdXJzZSAqLwotCWZvciAoZW50cnkgPSBvbGR0YWJsZTsgaSA+IDA7IGVudHJ5KyspIHsKLQkJaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkgewotCQkJLyogVU5VU0VEICovCi0JCQk7Ci0JCX0gZWxzZSBpZiAoZW50cnktPmtleSA9PSBkdW1teSkgewotCQkJLyogRFVNTVkgKi8KLQkJCS0taTsKLQkJCWFzc2VydChlbnRyeS0+a2V5ID09IGR1bW15KTsKLQkJCVB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKLQkJfSBlbHNlIHsKLQkJCS8qIEFDVElWRSAqLwotCQkJLS1pOwotCQkJc2V0X2luc2VydF9jbGVhbihzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOwotCQl9Ci0JfQorICAgIC8qIENvcHkgdGhlIGRhdGEgb3ZlcjsgdGhpcyBpcyByZWZjb3VudC1uZXV0cmFsIGZvciBhY3RpdmUgZW50cmllczsKKyAgICAgICBkdW1teSBlbnRyaWVzIGFyZW4ndCBjb3BpZWQgb3Zlciwgb2YgY291cnNlICovCisgICAgZm9yIChlbnRyeSA9IG9sZHRhYmxlOyBpID4gMDsgZW50cnkrKykgeworICAgICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBVTlVTRUQgKi8KKyAgICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIGlmIChlbnRyeS0+a2V5ID09IGR1bW15KSB7CisgICAgICAgICAgICAvKiBEVU1NWSAqLworICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgYXNzZXJ0KGVudHJ5LT5rZXkgPT0gZHVtbXkpOworICAgICAgICAgICAgUHlfREVDUkVGKGVudHJ5LT5rZXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQUNUSVZFICovCisgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoaXNfb2xkdGFibGVfbWFsbG9jZWQpCi0JCVB5TWVtX0RFTChvbGR0YWJsZSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGlzX29sZHRhYmxlX21hbGxvY2VkKQorICAgICAgICBQeU1lbV9ERUwob2xkdGFibGUpOworICAgIHJldHVybiAwOwogfQogCiAvKiBDQVVUSU9OOiBzZXRfYWRkX2tleS9lbnRyeSgpIG11c3QgZ3VhcmFudGVlIGl0IHdvbid0IHJlc2l6ZSB0aGUgdGFibGUgKi8KQEAgLTM2MSw0MiArMzYxLDQyIEBACiBzdGF0aWMgaW50CiBzZXRfYWRkX2VudHJ5KHJlZ2lzdGVyIFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKmVudHJ5KQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3Qgbl91c2VkOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3Qgbl91c2VkOwogCi0JYXNzZXJ0KHNvLT5maWxsIDw9IHNvLT5tYXNrKTsgIC8qIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90ICovCi0Jbl91c2VkID0gc28tPnVzZWQ7Ci0JUHlfSU5DUkVGKGVudHJ5LT5rZXkpOwotCWlmIChzZXRfaW5zZXJ0X2tleShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpID09IC0xKSB7Ci0JCVB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIShzby0+dXNlZCA+IG5fdXNlZCAmJiBzby0+ZmlsbCozID49IChzby0+bWFzaysxKSoyKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkPjUwMDAwID8gc28tPnVzZWQqMiA6IHNvLT51c2VkKjQpOworICAgIGFzc2VydChzby0+ZmlsbCA8PSBzby0+bWFzayk7ICAvKiBhdCBsZWFzdCBvbmUgZW1wdHkgc2xvdCAqLworICAgIG5fdXNlZCA9IHNvLT51c2VkOworICAgIFB5X0lOQ1JFRihlbnRyeS0+a2V5KTsKKyAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKSA9PSAtMSkgeworICAgICAgICBQeV9ERUNSRUYoZW50cnktPmtleSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEoc28tPnVzZWQgPiBuX3VzZWQgJiYgc28tPmZpbGwqMyA+PSAoc28tPm1hc2srMSkqMikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKIH0KIAogc3RhdGljIGludAogc2V0X2FkZF9rZXkocmVnaXN0ZXIgUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCXJlZ2lzdGVyIGxvbmcgaGFzaDsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IG5fdXNlZDsKKyAgICByZWdpc3RlciBsb25nIGhhc2g7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBuX3VzZWQ7CiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQlhc3NlcnQoc28tPmZpbGwgPD0gc28tPm1hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KLQluX3VzZWQgPSBzby0+dXNlZDsKLQlQeV9JTkNSRUYoa2V5KTsKLQlpZiAoc2V0X2luc2VydF9rZXkoc28sIGtleSwgaGFzaCkgPT0gLTEpIHsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCEoc28tPnVzZWQgPiBuX3VzZWQgJiYgc28tPmZpbGwqMyA+PSAoc28tPm1hc2srMSkqMikpCi0JCXJldHVybiAwOwotCXJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBhc3NlcnQoc28tPmZpbGwgPD0gc28tPm1hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KKyAgICBuX3VzZWQgPSBzby0+dXNlZDsKKyAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGtleSwgaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEoc28tPnVzZWQgPiBuX3VzZWQgJiYgc28tPmZpbGwqMyA+PSAoc28tPm1hc2srMSkqMikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKIH0KIAogI2RlZmluZSBESVNDQVJEX05PVEZPVU5EIDAKQEAgLTQwNCwxMTEgKzQwNCwxMTEgQEAKIAogc3RhdGljIGludAogc2V0X2Rpc2NhcmRfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBzZXRlbnRyeSAqb2xkZW50cnkpCi17CXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKLQlQeU9iamVjdCAqb2xkX2tleTsKK3sgICAgICAgcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OworICAgIFB5T2JqZWN0ICpvbGRfa2V5OwogCi0JZW50cnkgPSAoc28tPmxvb2t1cCkoc28sIG9sZGVudHJ5LT5rZXksIG9sZGVudHJ5LT5oYXNoKTsKLQlpZiAoZW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChlbnRyeS0+a2V5ID09IE5VTEwgIHx8ICBlbnRyeS0+a2V5ID09IGR1bW15KQotCQlyZXR1cm4gRElTQ0FSRF9OT1RGT1VORDsKLQlvbGRfa2V5ID0gZW50cnktPmtleTsKLQlQeV9JTkNSRUYoZHVtbXkpOwotCWVudHJ5LT5rZXkgPSBkdW1teTsKLQlzby0+dXNlZC0tOwotCVB5X0RFQ1JFRihvbGRfa2V5KTsKLQlyZXR1cm4gRElTQ0FSRF9GT1VORDsKKyAgICBlbnRyeSA9IChzby0+bG9va3VwKShzbywgb2xkZW50cnktPmtleSwgb2xkZW50cnktPmhhc2gpOworICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCAgfHwgIGVudHJ5LT5rZXkgPT0gZHVtbXkpCisgICAgICAgIHJldHVybiBESVNDQVJEX05PVEZPVU5EOworICAgIG9sZF9rZXkgPSBlbnRyeS0+a2V5OworICAgIFB5X0lOQ1JFRihkdW1teSk7CisgICAgZW50cnktPmtleSA9IGR1bW15OworICAgIHNvLT51c2VkLS07CisgICAgUHlfREVDUkVGKG9sZF9rZXkpOworICAgIHJldHVybiBESVNDQVJEX0ZPVU5EOwogfQogCiBzdGF0aWMgaW50CiBzZXRfZGlzY2FyZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCXJlZ2lzdGVyIGxvbmcgaGFzaDsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0JUHlPYmplY3QgKm9sZF9rZXk7CisgICAgcmVnaXN0ZXIgbG9uZyBoYXNoOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeU9iamVjdCAqb2xkX2tleTsKIAotCWFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAotCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7Ci0JCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0JCWlmIChoYXNoID09IC0xKQotCQkJcmV0dXJuIC0xOwotCX0KLQllbnRyeSA9IChzby0+bG9va3VwKShzbywga2V5LCBoYXNoKTsKLQlpZiAoZW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChlbnRyeS0+a2V5ID09IE5VTEwgIHx8ICBlbnRyeS0+a2V5ID09IGR1bW15KQotCQlyZXR1cm4gRElTQ0FSRF9OT1RGT1VORDsKLQlvbGRfa2V5ID0gZW50cnktPmtleTsKLQlQeV9JTkNSRUYoZHVtbXkpOwotCWVudHJ5LT5rZXkgPSBkdW1teTsKLQlzby0+dXNlZC0tOwotCVB5X0RFQ1JFRihvbGRfa2V5KTsKLQlyZXR1cm4gRElTQ0FSRF9GT1VORDsKKyAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKKyAgICAgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgeworICAgICAgICBoYXNoID0gUHlPYmplY3RfSGFzaChrZXkpOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZW50cnkgPSAoc28tPmxvb2t1cCkoc28sIGtleSwgaGFzaCk7CisgICAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMICB8fCAgZW50cnktPmtleSA9PSBkdW1teSkKKyAgICAgICAgcmV0dXJuIERJU0NBUkRfTk9URk9VTkQ7CisgICAgb2xkX2tleSA9IGVudHJ5LT5rZXk7CisgICAgUHlfSU5DUkVGKGR1bW15KTsKKyAgICBlbnRyeS0+a2V5ID0gZHVtbXk7CisgICAgc28tPnVzZWQtLTsKKyAgICBQeV9ERUNSRUYob2xkX2tleSk7CisgICAgcmV0dXJuIERJU0NBUkRfRk9VTkQ7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF9jbGVhcl9pbnRlcm5hbChQeVNldE9iamVjdCAqc28pCiB7Ci0Jc2V0ZW50cnkgKmVudHJ5LCAqdGFibGU7Ci0JaW50IHRhYmxlX2lzX21hbGxvY2VkOwotCVB5X3NzaXplX3QgZmlsbDsKLQlzZXRlbnRyeSBzbWFsbF9jb3B5W1B5U2V0X01JTlNJWkVdOworICAgIHNldGVudHJ5ICplbnRyeSwgKnRhYmxlOworICAgIGludCB0YWJsZV9pc19tYWxsb2NlZDsKKyAgICBQeV9zc2l6ZV90IGZpbGw7CisgICAgc2V0ZW50cnkgc21hbGxfY29weVtQeVNldF9NSU5TSVpFXTsKICNpZmRlZiBQeV9ERUJVRwotCVB5X3NzaXplX3QgaSwgbjsKLQlhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIGFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKIAotCW4gPSBzby0+bWFzayArIDE7Ci0JaSA9IDA7CisgICAgbiA9IHNvLT5tYXNrICsgMTsKKyAgICBpID0gMDsKICNlbmRpZgogCi0JdGFibGUgPSBzby0+dGFibGU7Ci0JYXNzZXJ0KHRhYmxlICE9IE5VTEwpOwotCXRhYmxlX2lzX21hbGxvY2VkID0gdGFibGUgIT0gc28tPnNtYWxsdGFibGU7CisgICAgdGFibGUgPSBzby0+dGFibGU7CisgICAgYXNzZXJ0KHRhYmxlICE9IE5VTEwpOworICAgIHRhYmxlX2lzX21hbGxvY2VkID0gdGFibGUgIT0gc28tPnNtYWxsdGFibGU7CiAKLQkvKiBUaGlzIGlzIGRlbGljYXRlLiAgRHVyaW5nIHRoZSBwcm9jZXNzIG9mIGNsZWFyaW5nIHRoZSBzZXQsCi0JICogZGVjcmVmcyBjYW4gY2F1c2UgdGhlIHNldCB0byBtdXRhdGUuICBUbyBhdm9pZCBmYXRhbCBjb25mdXNpb24KLQkgKiAodm9pY2Ugb2YgZXhwZXJpZW5jZSksIHdlIGhhdmUgdG8gbWFrZSB0aGUgc2V0IGVtcHR5IGJlZm9yZQotCSAqIGNsZWFyaW5nIHRoZSBzbG90cywgYW5kIG5ldmVyIHJlZmVyIHRvIGFueXRoaW5nIHZpYSBzby0+cmVmIHdoaWxlCi0JICogY2xlYXJpbmcuCi0JICovCi0JZmlsbCA9IHNvLT5maWxsOwotCWlmICh0YWJsZV9pc19tYWxsb2NlZCkKLQkJRU1QVFlfVE9fTUlOU0laRShzbyk7CisgICAgLyogVGhpcyBpcyBkZWxpY2F0ZS4gIER1cmluZyB0aGUgcHJvY2VzcyBvZiBjbGVhcmluZyB0aGUgc2V0LAorICAgICAqIGRlY3JlZnMgY2FuIGNhdXNlIHRoZSBzZXQgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uCisgICAgICogKHZvaWNlIG9mIGV4cGVyaWVuY2UpLCB3ZSBoYXZlIHRvIG1ha2UgdGhlIHNldCBlbXB0eSBiZWZvcmUKKyAgICAgKiBjbGVhcmluZyB0aGUgc2xvdHMsIGFuZCBuZXZlciByZWZlciB0byBhbnl0aGluZyB2aWEgc28tPnJlZiB3aGlsZQorICAgICAqIGNsZWFyaW5nLgorICAgICAqLworICAgIGZpbGwgPSBzby0+ZmlsbDsKKyAgICBpZiAodGFibGVfaXNfbWFsbG9jZWQpCisgICAgICAgIEVNUFRZX1RPX01JTlNJWkUoc28pOwogCi0JZWxzZSBpZiAoZmlsbCA+IDApIHsKLQkJLyogSXQncyBhIHNtYWxsIHRhYmxlIHdpdGggc29tZXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY2xlYXJlZC4KLQkJICogQWZyYWlkIHRoZSBvbmx5IHNhZmUgd2F5IGlzIHRvIGNvcHkgdGhlIHNldCBlbnRyaWVzIGludG8KLQkJICogYW5vdGhlciBzbWFsbCB0YWJsZSBmaXJzdC4KLQkJICovCi0JCW1lbWNweShzbWFsbF9jb3B5LCB0YWJsZSwgc2l6ZW9mKHNtYWxsX2NvcHkpKTsKLQkJdGFibGUgPSBzbWFsbF9jb3B5OwotCQlFTVBUWV9UT19NSU5TSVpFKHNvKTsKLQl9Ci0JLyogZWxzZSBpdCdzIGEgc21hbGwgdGFibGUgdGhhdCdzIGFscmVhZHkgZW1wdHkgKi8KKyAgICBlbHNlIGlmIChmaWxsID4gMCkgeworICAgICAgICAvKiBJdCdzIGEgc21hbGwgdGFibGUgd2l0aCBzb21ldGhpbmcgdGhhdCBuZWVkcyB0byBiZSBjbGVhcmVkLgorICAgICAgICAgKiBBZnJhaWQgdGhlIG9ubHkgc2FmZSB3YXkgaXMgdG8gY29weSB0aGUgc2V0IGVudHJpZXMgaW50bworICAgICAgICAgKiBhbm90aGVyIHNtYWxsIHRhYmxlIGZpcnN0LgorICAgICAgICAgKi8KKyAgICAgICAgbWVtY3B5KHNtYWxsX2NvcHksIHRhYmxlLCBzaXplb2Yoc21hbGxfY29weSkpOworICAgICAgICB0YWJsZSA9IHNtYWxsX2NvcHk7CisgICAgICAgIEVNUFRZX1RPX01JTlNJWkUoc28pOworICAgIH0KKyAgICAvKiBlbHNlIGl0J3MgYSBzbWFsbCB0YWJsZSB0aGF0J3MgYWxyZWFkeSBlbXB0eSAqLwogCi0JLyogTm93IHdlIGNhbiBmaW5hbGx5IGNsZWFyIHRoaW5ncy4gIElmIEMgaGFkIHJlZmNvdW50cywgd2UgY291bGQKLQkgKiBhc3NlcnQgdGhhdCB0aGUgcmVmY291bnQgb24gdGFibGUgaXMgMSBub3csIGkuZS4gdGhhdCB0aGlzIGZ1bmN0aW9uCi0JICogaGFzIHVuaXF1ZSBhY2Nlc3MgdG8gaXQsIHNvIGRlY3JlZiBzaWRlLWVmZmVjdHMgY2FuJ3QgYWx0ZXIgaXQuCi0JICovCi0JZm9yIChlbnRyeSA9IHRhYmxlOyBmaWxsID4gMDsgKytlbnRyeSkgeworICAgIC8qIE5vdyB3ZSBjYW4gZmluYWxseSBjbGVhciB0aGluZ3MuICBJZiBDIGhhZCByZWZjb3VudHMsIHdlIGNvdWxkCisgICAgICogYXNzZXJ0IHRoYXQgdGhlIHJlZmNvdW50IG9uIHRhYmxlIGlzIDEgbm93LCBpLmUuIHRoYXQgdGhpcyBmdW5jdGlvbgorICAgICAqIGhhcyB1bmlxdWUgYWNjZXNzIHRvIGl0LCBzbyBkZWNyZWYgc2lkZS1lZmZlY3RzIGNhbid0IGFsdGVyIGl0LgorICAgICAqLworICAgIGZvciAoZW50cnkgPSB0YWJsZTsgZmlsbCA+IDA7ICsrZW50cnkpIHsKICNpZmRlZiBQeV9ERUJVRwotCQlhc3NlcnQoaSA8IG4pOwotCQkrK2k7CisgICAgICAgIGFzc2VydChpIDwgbik7CisgICAgICAgICsraTsKICNlbmRpZgotCQlpZiAoZW50cnktPmtleSkgewotCQkJLS1maWxsOwotCQkJUHlfREVDUkVGKGVudHJ5LT5rZXkpOwotCQl9CisgICAgICAgIGlmIChlbnRyeS0+a2V5KSB7CisgICAgICAgICAgICAtLWZpbGw7CisgICAgICAgICAgICBQeV9ERUNSRUYoZW50cnktPmtleSk7CisgICAgICAgIH0KICNpZmRlZiBQeV9ERUJVRwotCQllbHNlCi0JCQlhc3NlcnQoZW50cnktPmtleSA9PSBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNzZXJ0KGVudHJ5LT5rZXkgPT0gTlVMTCk7CiAjZW5kaWYKLQl9CisgICAgfQogCi0JaWYgKHRhYmxlX2lzX21hbGxvY2VkKQotCQlQeU1lbV9ERUwodGFibGUpOwotCXJldHVybiAwOworICAgIGlmICh0YWJsZV9pc19tYWxsb2NlZCkKKyAgICAgICAgUHlNZW1fREVMKHRhYmxlKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoKQEAgLTUyMiwyMzYgKzUyMiwyMzYgQEAKICAqICAgICB9CiAgKgogICogQ0FVVElPTjogIEluIGdlbmVyYWwsIGl0IGlzbid0IHNhZmUgdG8gdXNlIHNldF9uZXh0IGluIGEgbG9vcCB0aGF0Ci0gKiBtdXRhdGVzIHRoZSB0YWJsZS4gIAorICogbXV0YXRlcyB0aGUgdGFibGUuCiAgKi8KIHN0YXRpYyBpbnQKIHNldF9uZXh0KFB5U2V0T2JqZWN0ICpzbywgUHlfc3NpemVfdCAqcG9zX3B0ciwgc2V0ZW50cnkgKiplbnRyeV9wdHIpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3QgbWFzazsKLQlyZWdpc3RlciBzZXRlbnRyeSAqdGFibGU7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgbWFzazsKKyAgICByZWdpc3RlciBzZXRlbnRyeSAqdGFibGU7CiAKLQlhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7Ci0JaSA9ICpwb3NfcHRyOwotCWFzc2VydChpID49IDApOwotCXRhYmxlID0gc28tPnRhYmxlOwotCW1hc2sgPSBzby0+bWFzazsKLQl3aGlsZSAoaSA8PSBtYXNrICYmICh0YWJsZVtpXS5rZXkgPT0gTlVMTCB8fCB0YWJsZVtpXS5rZXkgPT0gZHVtbXkpKQotCQlpKys7Ci0JKnBvc19wdHIgPSBpKzE7Ci0JaWYgKGkgPiBtYXNrKQotCQlyZXR1cm4gMDsKLQlhc3NlcnQodGFibGVbaV0ua2V5ICE9IE5VTEwpOwotCSplbnRyeV9wdHIgPSAmdGFibGVbaV07Ci0JcmV0dXJuIDE7CisgICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOworICAgIGkgPSAqcG9zX3B0cjsKKyAgICBhc3NlcnQoaSA+PSAwKTsKKyAgICB0YWJsZSA9IHNvLT50YWJsZTsKKyAgICBtYXNrID0gc28tPm1hc2s7CisgICAgd2hpbGUgKGkgPD0gbWFzayAmJiAodGFibGVbaV0ua2V5ID09IE5VTEwgfHwgdGFibGVbaV0ua2V5ID09IGR1bW15KSkKKyAgICAgICAgaSsrOworICAgICpwb3NfcHRyID0gaSsxOworICAgIGlmIChpID4gbWFzaykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYXNzZXJ0KHRhYmxlW2ldLmtleSAhPSBOVUxMKTsKKyAgICAqZW50cnlfcHRyID0gJnRhYmxlW2ldOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogc2V0X2RlYWxsb2MoUHlTZXRPYmplY3QgKnNvKQogewotCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKLQlQeV9zc2l6ZV90IGZpbGwgPSBzby0+ZmlsbDsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHNvKTsKLQlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHNvKQotCWlmIChzby0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKLQkJUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgc28pOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeV9zc2l6ZV90IGZpbGwgPSBzby0+ZmlsbDsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHNvKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHNvKQorICAgIGlmIChzby0+d2Vha3JlZmxpc3QgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QgKikgc28pOwogCi0JZm9yIChlbnRyeSA9IHNvLT50YWJsZTsgZmlsbCA+IDA7IGVudHJ5KyspIHsKLQkJaWYgKGVudHJ5LT5rZXkpIHsKLQkJCS0tZmlsbDsKLQkJCVB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKLQkJfQotCX0KLQlpZiAoc28tPnRhYmxlICE9IHNvLT5zbWFsbHRhYmxlKQotCQlQeU1lbV9ERUwoc28tPnRhYmxlKTsKLQlpZiAobnVtZnJlZSA8IFB5U2V0X01BWEZSRUVMSVNUICYmIFB5QW55U2V0X0NoZWNrRXhhY3Qoc28pKQotCQlmcmVlX2xpc3RbbnVtZnJlZSsrXSA9IHNvOwotCWVsc2UgCi0JCVB5X1RZUEUoc28pLT50cF9mcmVlKHNvKTsKLQlQeV9UUkFTSENBTl9TQUZFX0VORChzbykKKyAgICBmb3IgKGVudHJ5ID0gc28tPnRhYmxlOyBmaWxsID4gMDsgZW50cnkrKykgeworICAgICAgICBpZiAoZW50cnktPmtleSkgeworICAgICAgICAgICAgLS1maWxsOworICAgICAgICAgICAgUHlfREVDUkVGKGVudHJ5LT5rZXkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzby0+dGFibGUgIT0gc28tPnNtYWxsdGFibGUpCisgICAgICAgIFB5TWVtX0RFTChzby0+dGFibGUpOworICAgIGlmIChudW1mcmVlIDwgUHlTZXRfTUFYRlJFRUxJU1QgJiYgUHlBbnlTZXRfQ2hlY2tFeGFjdChzbykpCisgICAgICAgIGZyZWVfbGlzdFtudW1mcmVlKytdID0gc287CisgICAgZWxzZQorICAgICAgICBQeV9UWVBFKHNvKS0+dHBfZnJlZShzbyk7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQoc28pCiB9CiAKIHN0YXRpYyBpbnQKIHNldF90cF9wcmludChQeVNldE9iamVjdCAqc28sIEZJTEUgKmZwLCBpbnQgZmxhZ3MpCiB7Ci0Jc2V0ZW50cnkgKmVudHJ5OwotCVB5X3NzaXplX3QgcG9zPTA7Ci0JY2hhciAqZW1pdCA9ICIiOwkvKiBObyBzZXBhcmF0b3IgZW1pdHRlZCBvbiBmaXJzdCBwYXNzICovCi0JY2hhciAqc2VwYXJhdG9yID0gIiwgIjsKLQlpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopc28pOworICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeV9zc2l6ZV90IHBvcz0wOworICAgIGNoYXIgKmVtaXQgPSAiIjsgICAgICAgICAgICAvKiBObyBzZXBhcmF0b3IgZW1pdHRlZCBvbiBmaXJzdCBwYXNzICovCisgICAgY2hhciAqc2VwYXJhdG9yID0gIiwgIjsKKyAgICBpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopc28pOwogCi0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmcHJpbnRmKGZwLCAiJXMoLi4uKSIsIHNvLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJcmV0dXJuIDA7Ci0JfSAgICAgICAgCisgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgIGlmIChzdGF0dXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICBmcHJpbnRmKGZwLCAiJXMoLi4uKSIsIHNvLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICIlcyhbIiwgc28tPm9iX3R5cGUtPnRwX25hbWUpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0Jd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZnB1dHMoZW1pdCwgZnApOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCQllbWl0ID0gc2VwYXJhdG9yOwotCQlpZiAoUHlPYmplY3RfUHJpbnQoZW50cnktPmtleSwgZnAsIDApICE9IDApIHsKLQkJCVB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKXNvKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JZnB1dHMoIl0pIiwgZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JUHlfUmVwckxlYXZlKChQeU9iamVjdCopc28pOyAgICAgICAgCi0JcmV0dXJuIDA7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGZwcmludGYoZnAsICIlcyhbIiwgc28tPm9iX3R5cGUtPnRwX25hbWUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZnB1dHMoZW1pdCwgZnApOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBlbWl0ID0gc2VwYXJhdG9yOworICAgICAgICBpZiAoUHlPYmplY3RfUHJpbnQoZW50cnktPmtleSwgZnAsIDApICE9IDApIHsKKyAgICAgICAgICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKXNvKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnB1dHMoIl0pIiwgZnApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCopc28pOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3JlcHIoUHlTZXRPYmplY3QgKnNvKQogewotCVB5T2JqZWN0ICprZXlzLCAqcmVzdWx0PU5VTEwsICpsaXN0cmVwcjsKLQlpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopc28pOworICAgIFB5T2JqZWN0ICprZXlzLCAqcmVzdWx0PU5VTEwsICpsaXN0cmVwcjsKKyAgICBpbnQgc3RhdHVzID0gUHlfUmVwckVudGVyKChQeU9iamVjdCopc28pOwogCi0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCIlcyguLi4pIiwgc28tPm9iX3R5cGUtPnRwX25hbWUpOwotCX0KKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgaWYgKHN0YXR1cyA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoIiVzKC4uLikiLCBzby0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgfQogCi0Ja2V5cyA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilzbyk7Ci0JaWYgKGtleXMgPT0gTlVMTCkKLQkJZ290byBkb25lOwotCWxpc3RyZXByID0gUHlPYmplY3RfUmVwcihrZXlzKTsKLQlQeV9ERUNSRUYoa2V5cyk7Ci0JaWYgKGxpc3RyZXByID09IE5VTEwpCi0JCWdvdG8gZG9uZTsKKyAgICBrZXlzID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKXNvKTsKKyAgICBpZiAoa2V5cyA9PSBOVUxMKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgbGlzdHJlcHIgPSBQeU9iamVjdF9SZXByKGtleXMpOworICAgIFB5X0RFQ1JFRihrZXlzKTsKKyAgICBpZiAobGlzdHJlcHIgPT0gTlVMTCkKKyAgICAgICAgZ290byBkb25lOwogCi0JcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJXMpIiwgc28tPm9iX3R5cGUtPnRwX25hbWUsCi0JCVB5U3RyaW5nX0FTX1NUUklORyhsaXN0cmVwcikpOwotCVB5X0RFQ1JFRihsaXN0cmVwcik7CisgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiJXMoJXMpIiwgc28tPm9iX3R5cGUtPnRwX25hbWUsCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhsaXN0cmVwcikpOworICAgIFB5X0RFQ1JFRihsaXN0cmVwcik7CiBkb25lOgotCVB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKXNvKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1JlcHJMZWF2ZSgoUHlPYmplY3QqKXNvKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogc2V0X2xlbihQeU9iamVjdCAqc28pCiB7Ci0JcmV0dXJuICgoUHlTZXRPYmplY3QgKilzbyktPnVzZWQ7CisgICAgcmV0dXJuICgoUHlTZXRPYmplY3QgKilzbyktPnVzZWQ7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF9tZXJnZShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcnNldCkKIHsKLQlQeVNldE9iamVjdCAqb3RoZXI7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeVNldE9iamVjdCAqb3RoZXI7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKIAotCWFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKLQlhc3NlcnQgKFB5QW55U2V0X0NoZWNrKG90aGVyc2V0KSk7CisgICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOworICAgIGFzc2VydCAoUHlBbnlTZXRfQ2hlY2sob3RoZXJzZXQpKTsKIAotCW90aGVyID0gKFB5U2V0T2JqZWN0KilvdGhlcnNldDsKLQlpZiAob3RoZXIgPT0gc28gfHwgb3RoZXItPnVzZWQgPT0gMCkKLQkJLyogYS51cGRhdGUoYSkgb3IgYS51cGRhdGUoe30pOyBub3RoaW5nIHRvIGRvICovCi0JCXJldHVybiAwOwotCS8qIERvIG9uZSBiaWcgcmVzaXplIGF0IHRoZSBzdGFydCwgcmF0aGVyIHRoYW4KLQkgKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAotCSAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgotCSAqLwotCWlmICgoc28tPmZpbGwgKyBvdGhlci0+dXNlZCkqMyA+PSAoc28tPm1hc2srMSkqMikgewotCSAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBvdGhlci0+dXNlZCkqMikgIT0gMCkKLQkJICAgcmV0dXJuIC0xOwotCX0KLQlmb3IgKGkgPSAwOyBpIDw9IG90aGVyLT5tYXNrOyBpKyspIHsKLQkJZW50cnkgPSAmb3RoZXItPnRhYmxlW2ldOwotCQlpZiAoZW50cnktPmtleSAhPSBOVUxMICYmIAotCQkgICAgZW50cnktPmtleSAhPSBkdW1teSkgewotCQkJUHlfSU5DUkVGKGVudHJ5LT5rZXkpOwotCQkJaWYgKHNldF9pbnNlcnRfa2V5KHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCkgPT0gLTEpIHsKLQkJCQlQeV9ERUNSRUYoZW50cnktPmtleSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOworICAgIG90aGVyID0gKFB5U2V0T2JqZWN0KilvdGhlcnNldDsKKyAgICBpZiAob3RoZXIgPT0gc28gfHwgb3RoZXItPnVzZWQgPT0gMCkKKyAgICAgICAgLyogYS51cGRhdGUoYSkgb3IgYS51cGRhdGUoe30pOyBub3RoaW5nIHRvIGRvICovCisgICAgICAgIHJldHVybiAwOworICAgIC8qIERvIG9uZSBiaWcgcmVzaXplIGF0IHRoZSBzdGFydCwgcmF0aGVyIHRoYW4KKyAgICAgKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAorICAgICAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgorICAgICAqLworICAgIGlmICgoc28tPmZpbGwgKyBvdGhlci0+dXNlZCkqMyA+PSAoc28tPm1hc2srMSkqMikgeworICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBvdGhlci0+dXNlZCkqMikgIT0gMCkKKyAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDw9IG90aGVyLT5tYXNrOyBpKyspIHsKKyAgICAgICAgZW50cnkgPSAmb3RoZXItPnRhYmxlW2ldOworICAgICAgICBpZiAoZW50cnktPmtleSAhPSBOVUxMICYmCisgICAgICAgICAgICBlbnRyeS0+a2V5ICE9IGR1bW15KSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoZW50cnktPmtleSk7CisgICAgICAgICAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbnRyeS0+a2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF9jb250YWluc19rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCWxvbmcgaGFzaDsKLQlzZXRlbnRyeSAqZW50cnk7CisgICAgbG9uZyBoYXNoOworICAgIHNldGVudHJ5ICplbnRyeTsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8Ci0JICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKLQkJaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQkJaWYgKGhhc2ggPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWVudHJ5ID0gKHNvLT5sb29rdXApKHNvLCBrZXksIGhhc2gpOwotCWlmIChlbnRyeSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0Ja2V5ID0gZW50cnktPmtleTsKLQlyZXR1cm4ga2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15OworICAgIGlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKSBrZXkpLT5vYl9zaGFzaCkgPT0gLTEpIHsKKyAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICAgICAgaWYgKGhhc2ggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVudHJ5ID0gKHNvLT5sb29rdXApKHNvLCBrZXksIGhhc2gpOworICAgIGlmIChlbnRyeSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAga2V5ID0gZW50cnktPmtleTsKKyAgICByZXR1cm4ga2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15OwogfQogCiBzdGF0aWMgaW50CiBzZXRfY29udGFpbnNfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBzZXRlbnRyeSAqZW50cnkpCiB7Ci0JUHlPYmplY3QgKmtleTsKLQlzZXRlbnRyeSAqbHVfZW50cnk7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICBzZXRlbnRyeSAqbHVfZW50cnk7CiAKLQlsdV9lbnRyeSA9IChzby0+bG9va3VwKShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOwotCWlmIChsdV9lbnRyeSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0Ja2V5ID0gbHVfZW50cnktPmtleTsgCi0JcmV0dXJuIGtleSAhPSBOVUxMICYmIGtleSAhPSBkdW1teTsKKyAgICBsdV9lbnRyeSA9IChzby0+bG9va3VwKShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgIGlmIChsdV9lbnRyeSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAga2V5ID0gbHVfZW50cnktPmtleTsKKyAgICByZXR1cm4ga2V5ICE9IE5VTEwgJiYga2V5ICE9IGR1bW15OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3BvcChQeVNldE9iamVjdCAqc28pCiB7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpID0gMDsKLQlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7Ci0JUHlPYmplY3QgKmtleTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGkgPSAwOworICAgIHJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKKyAgICBQeU9iamVjdCAqa2V5OwogCi0JYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOwotCWlmIChzby0+dXNlZCA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgInBvcCBmcm9tIGFuIGVtcHR5IHNldCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOworICAgIGlmIChzby0+dXNlZCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwgInBvcCBmcm9tIGFuIGVtcHR5IHNldCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBTZXQgZW50cnkgdG8gInRoZSBmaXJzdCIgdW51c2VkIG9yIGR1bW15IHNldCBlbnRyeS4gIFdlIGFidXNlCi0JICogdGhlIGhhc2ggZmllbGQgb2Ygc2xvdCAwIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyOgotCSAqIElmIHNsb3QgMCBoYXMgYSB2YWx1ZSwgdXNlIHNsb3QgMC4KLQkgKiBFbHNlIHNsb3QgMCBpcyBiZWluZyB1c2VkIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyLAotCSAqIGFuZCB3ZSB1c2UgaXRzIGhhc2ggdmFsdWUgYXMgdGhlIGZpcnN0IGluZGV4IHRvIGxvb2suCi0JICovCi0JZW50cnkgPSAmc28tPnRhYmxlWzBdOwotCWlmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBkdW1teSkgewotCQlpID0gZW50cnktPmhhc2g7Ci0JCS8qIFRoZSBoYXNoIGZpZWxkIG1heSBiZSBhIHJlYWwgaGFzaCB2YWx1ZSwgb3IgaXQgbWF5IGJlIGEKLQkJICogbGVnaXQgc2VhcmNoIGZpbmdlciwgb3IgaXQgbWF5IGJlIGEgb25jZS1sZWdpdCBzZWFyY2gKLQkJICogZmluZ2VyIHRoYXQncyBvdXQgb2YgYm91bmRzIG5vdyBiZWNhdXNlIGl0IHdyYXBwZWQgYXJvdW5kCi0JCSAqIG9yIHRoZSB0YWJsZSBzaHJ1bmsgLS0gc2ltcGx5IG1ha2Ugc3VyZSBpdCdzIGluIGJvdW5kcyBub3cuCi0JCSAqLwotCQlpZiAoaSA+IHNvLT5tYXNrIHx8IGkgPCAxKQotCQkJaSA9IDE7CS8qIHNraXAgc2xvdCAwICovCi0JCXdoaWxlICgoZW50cnkgPSAmc28tPnRhYmxlW2ldKS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleT09ZHVtbXkpIHsKLQkJCWkrKzsKLQkJCWlmIChpID4gc28tPm1hc2spCi0JCQkJaSA9IDE7Ci0JCX0KLQl9Ci0Ja2V5ID0gZW50cnktPmtleTsKLQlQeV9JTkNSRUYoZHVtbXkpOwotCWVudHJ5LT5rZXkgPSBkdW1teTsKLQlzby0+dXNlZC0tOwotCXNvLT50YWJsZVswXS5oYXNoID0gaSArIDE7ICAvKiBuZXh0IHBsYWNlIHRvIHN0YXJ0ICovCi0JcmV0dXJuIGtleTsKKyAgICAvKiBTZXQgZW50cnkgdG8gInRoZSBmaXJzdCIgdW51c2VkIG9yIGR1bW15IHNldCBlbnRyeS4gIFdlIGFidXNlCisgICAgICogdGhlIGhhc2ggZmllbGQgb2Ygc2xvdCAwIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyOgorICAgICAqIElmIHNsb3QgMCBoYXMgYSB2YWx1ZSwgdXNlIHNsb3QgMC4KKyAgICAgKiBFbHNlIHNsb3QgMCBpcyBiZWluZyB1c2VkIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyLAorICAgICAqIGFuZCB3ZSB1c2UgaXRzIGhhc2ggdmFsdWUgYXMgdGhlIGZpcnN0IGluZGV4IHRvIGxvb2suCisgICAgICovCisgICAgZW50cnkgPSAmc28tPnRhYmxlWzBdOworICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBkdW1teSkgeworICAgICAgICBpID0gZW50cnktPmhhc2g7CisgICAgICAgIC8qIFRoZSBoYXNoIGZpZWxkIG1heSBiZSBhIHJlYWwgaGFzaCB2YWx1ZSwgb3IgaXQgbWF5IGJlIGEKKyAgICAgICAgICogbGVnaXQgc2VhcmNoIGZpbmdlciwgb3IgaXQgbWF5IGJlIGEgb25jZS1sZWdpdCBzZWFyY2gKKyAgICAgICAgICogZmluZ2VyIHRoYXQncyBvdXQgb2YgYm91bmRzIG5vdyBiZWNhdXNlIGl0IHdyYXBwZWQgYXJvdW5kCisgICAgICAgICAqIG9yIHRoZSB0YWJsZSBzaHJ1bmsgLS0gc2ltcGx5IG1ha2Ugc3VyZSBpdCdzIGluIGJvdW5kcyBub3cuCisgICAgICAgICAqLworICAgICAgICBpZiAoaSA+IHNvLT5tYXNrIHx8IGkgPCAxKQorICAgICAgICAgICAgaSA9IDE7ICAgICAgICAgICAgICAvKiBza2lwIHNsb3QgMCAqLworICAgICAgICB3aGlsZSAoKGVudHJ5ID0gJnNvLT50YWJsZVtpXSktPmtleSA9PSBOVUxMIHx8IGVudHJ5LT5rZXk9PWR1bW15KSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZiAoaSA+IHNvLT5tYXNrKQorICAgICAgICAgICAgICAgIGkgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGtleSA9IGVudHJ5LT5rZXk7CisgICAgUHlfSU5DUkVGKGR1bW15KTsKKyAgICBlbnRyeS0+a2V5ID0gZHVtbXk7CisgICAgc28tPnVzZWQtLTsKKyAgICBzby0+dGFibGVbMF0uaGFzaCA9IGkgKyAxOyAgLyogbmV4dCBwbGFjZSB0byBzdGFydCAqLworICAgIHJldHVybiBrZXk7CiB9CiAKIFB5RG9jX1NUUlZBUihwb3BfZG9jLCAiUmVtb3ZlIGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5IHNldCBlbGVtZW50LlxuXApAQCAtNzYwLDI3NyArNzYwLDI3NyBAQAogc3RhdGljIGludAogc2V0X3RyYXZlcnNlKFB5U2V0T2JqZWN0ICpzbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOwotCXNldGVudHJ5ICplbnRyeTsKKyAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgc2V0ZW50cnkgKmVudHJ5OwogCi0Jd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKQotCQlQeV9WSVNJVChlbnRyeS0+a2V5KTsKLQlyZXR1cm4gMDsKKyAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpCisgICAgICAgIFB5X1ZJU0lUKGVudHJ5LT5rZXkpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgbG9uZwogZnJvemVuc2V0X2hhc2goUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlTZXRPYmplY3QgKnNvID0gKFB5U2V0T2JqZWN0ICopc2VsZjsKLQlsb25nIGgsIGhhc2ggPSAxOTI3ODY4MjM3TDsKLQlzZXRlbnRyeSAqZW50cnk7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5U2V0T2JqZWN0ICpzbyA9IChQeVNldE9iamVjdCAqKXNlbGY7CisgICAgbG9uZyBoLCBoYXNoID0gMTkyNzg2ODIzN0w7CisgICAgc2V0ZW50cnkgKmVudHJ5OworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAotCWlmIChzby0+aGFzaCAhPSAtMSkKLQkJcmV0dXJuIHNvLT5oYXNoOworICAgIGlmIChzby0+aGFzaCAhPSAtMSkKKyAgICAgICAgcmV0dXJuIHNvLT5oYXNoOwogCi0JaGFzaCAqPSBQeVNldF9HRVRfU0laRShzZWxmKSArIDE7Ci0Jd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0JCS8qIFdvcmsgdG8gaW5jcmVhc2UgdGhlIGJpdCBkaXNwZXJzaW9uIGZvciBjbG9zZWx5IHNwYWNlZCBoYXNoCi0JCSAgIHZhbHVlcy4gIFRoZSBpcyBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHVzZSBjYXNlcyBoYXZlIG1hbnkgCi0JCSAgIGNvbWJpbmF0aW9ucyBvZiBhIHNtYWxsIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIG5lYXJieSAKLQkJICAgaGFzaGVzIHNvIHRoYXQgbWFueSBkaXN0aW5jdCBjb21iaW5hdGlvbnMgY29sbGFwc2UgdG8gb25seSAKLQkJICAgYSBoYW5kZnVsIG9mIGRpc3RpbmN0IGhhc2ggdmFsdWVzLiAqLwotCQloID0gZW50cnktPmhhc2g7Ci0JCWhhc2ggXj0gKGggXiAoaCA8PCAxNikgXiA4OTg2OTc0N0wpICAqIDM2NDQ3OTgxNjd1OwotCX0KLQloYXNoID0gaGFzaCAqIDY5MDY5TCArIDkwNzEzMzkyM0w7Ci0JaWYgKGhhc2ggPT0gLTEpCi0JCWhhc2ggPSA1OTA5MjM3MTNMOwotCXNvLT5oYXNoID0gaGFzaDsKLQlyZXR1cm4gaGFzaDsKKyAgICBoYXNoICo9IFB5U2V0X0dFVF9TSVpFKHNlbGYpICsgMTsKKyAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKKyAgICAgICAgLyogV29yayB0byBpbmNyZWFzZSB0aGUgYml0IGRpc3BlcnNpb24gZm9yIGNsb3NlbHkgc3BhY2VkIGhhc2gKKyAgICAgICAgICAgdmFsdWVzLiAgVGhlIGlzIGltcG9ydGFudCBiZWNhdXNlIHNvbWUgdXNlIGNhc2VzIGhhdmUgbWFueQorICAgICAgICAgICBjb21iaW5hdGlvbnMgb2YgYSBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBuZWFyYnkKKyAgICAgICAgICAgaGFzaGVzIHNvIHRoYXQgbWFueSBkaXN0aW5jdCBjb21iaW5hdGlvbnMgY29sbGFwc2UgdG8gb25seQorICAgICAgICAgICBhIGhhbmRmdWwgb2YgZGlzdGluY3QgaGFzaCB2YWx1ZXMuICovCisgICAgICAgIGggPSBlbnRyeS0+aGFzaDsKKyAgICAgICAgaGFzaCBePSAoaCBeIChoIDw8IDE2KSBeIDg5ODY5NzQ3TCkgICogMzY0NDc5ODE2N3U7CisgICAgfQorICAgIGhhc2ggPSBoYXNoICogNjkwNjlMICsgOTA3MTMzOTIzTDsKKyAgICBpZiAoaGFzaCA9PSAtMSkKKyAgICAgICAgaGFzaCA9IDU5MDkyMzcxM0w7CisgICAgc28tPmhhc2ggPSBoYXNoOworICAgIHJldHVybiBoYXNoOwogfQogCiAvKioqKiogU2V0IGl0ZXJhdG9yIHR5cGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlTZXRPYmplY3QgKnNpX3NldDsgLyogU2V0IHRvIE5VTEwgd2hlbiBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KLQlQeV9zc2l6ZV90IHNpX3VzZWQ7Ci0JUHlfc3NpemVfdCBzaV9wb3M7Ci0JUHlfc3NpemVfdCBsZW47CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5U2V0T2JqZWN0ICpzaV9zZXQ7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlfc3NpemVfdCBzaV91c2VkOworICAgIFB5X3NzaXplX3Qgc2lfcG9zOworICAgIFB5X3NzaXplX3QgbGVuOwogfSBzZXRpdGVyb2JqZWN0OwogCiBzdGF0aWMgdm9pZAogc2V0aXRlcl9kZWFsbG9jKHNldGl0ZXJvYmplY3QgKnNpKQogewotCVB5X1hERUNSRUYoc2ktPnNpX3NldCk7Ci0JUHlPYmplY3RfR0NfRGVsKHNpKTsKKyAgICBQeV9YREVDUkVGKHNpLT5zaV9zZXQpOworICAgIFB5T2JqZWN0X0dDX0RlbChzaSk7CiB9CiAKIHN0YXRpYyBpbnQKIHNldGl0ZXJfdHJhdmVyc2Uoc2V0aXRlcm9iamVjdCAqc2ksIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKHNpLT5zaV9zZXQpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKHNpLT5zaV9zZXQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0aXRlcl9sZW4oc2V0aXRlcm9iamVjdCAqc2kpCiB7Ci0JUHlfc3NpemVfdCBsZW4gPSAwOwotCWlmIChzaS0+c2lfc2V0ICE9IE5VTEwgJiYgc2ktPnNpX3VzZWQgPT0gc2ktPnNpX3NldC0+dXNlZCkKLQkJbGVuID0gc2ktPmxlbjsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobGVuKTsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IDA7CisgICAgaWYgKHNpLT5zaV9zZXQgIT0gTlVMTCAmJiBzaS0+c2lfdXNlZCA9PSBzaS0+c2lfc2V0LT51c2VkKQorICAgICAgICBsZW4gPSBzaS0+bGVuOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhsZW4pOwogfQogCiBQeURvY19TVFJWQVIobGVuZ3RoX2hpbnRfZG9jLCAiUHJpdmF0ZSBtZXRob2QgcmV0dXJuaW5nIGFuIGVzdGltYXRlIG9mIGxlbihsaXN0KGl0KSkuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzZXRpdGVyX21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbilzZXRpdGVyX2xlbiwgTUVUSF9OT0FSR1MsIGxlbmd0aF9oaW50X2RvY30sCi0gCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJfX2xlbmd0aF9oaW50X18iLCAoUHlDRnVuY3Rpb24pc2V0aXRlcl9sZW4sIE1FVEhfTk9BUkdTLCBsZW5ndGhfaGludF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKnNldGl0ZXJfaXRlcm5leHQoc2V0aXRlcm9iamVjdCAqc2kpCiB7Ci0JUHlPYmplY3QgKmtleTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGksIG1hc2s7Ci0JcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OwotCVB5U2V0T2JqZWN0ICpzbyA9IHNpLT5zaV9zZXQ7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIG1hc2s7CisgICAgcmVnaXN0ZXIgc2V0ZW50cnkgKmVudHJ5OworICAgIFB5U2V0T2JqZWN0ICpzbyA9IHNpLT5zaV9zZXQ7CiAKLQlpZiAoc28gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOworICAgIGlmIChzbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CiAKLQlpZiAoc2ktPnNpX3VzZWQgIT0gc28tPnVzZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiU2V0IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7Ci0JCXNpLT5zaV91c2VkID0gLTE7IC8qIE1ha2UgdGhpcyBzdGF0ZSBzdGlja3kgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzaS0+c2lfdXNlZCAhPSBzby0+dXNlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNldCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICBzaS0+c2lfdXNlZCA9IC0xOyAvKiBNYWtlIHRoaXMgc3RhdGUgc3RpY2t5ICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWkgPSBzaS0+c2lfcG9zOwotCWFzc2VydChpPj0wKTsKLQllbnRyeSA9IHNvLT50YWJsZTsKLQltYXNrID0gc28tPm1hc2s7Ci0Jd2hpbGUgKGkgPD0gbWFzayAmJiAoZW50cnlbaV0ua2V5ID09IE5VTEwgfHwgZW50cnlbaV0ua2V5ID09IGR1bW15KSkKLQkJaSsrOwotCXNpLT5zaV9wb3MgPSBpKzE7Ci0JaWYgKGkgPiBtYXNrKQotCQlnb3RvIGZhaWw7Ci0Jc2ktPmxlbi0tOwotCWtleSA9IGVudHJ5W2ldLmtleTsKLQlQeV9JTkNSRUYoa2V5KTsKLQlyZXR1cm4ga2V5OworICAgIGkgPSBzaS0+c2lfcG9zOworICAgIGFzc2VydChpPj0wKTsKKyAgICBlbnRyeSA9IHNvLT50YWJsZTsKKyAgICBtYXNrID0gc28tPm1hc2s7CisgICAgd2hpbGUgKGkgPD0gbWFzayAmJiAoZW50cnlbaV0ua2V5ID09IE5VTEwgfHwgZW50cnlbaV0ua2V5ID09IGR1bW15KSkKKyAgICAgICAgaSsrOworICAgIHNpLT5zaV9wb3MgPSBpKzE7CisgICAgaWYgKGkgPiBtYXNrKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc2ktPmxlbi0tOworICAgIGtleSA9IGVudHJ5W2ldLmtleTsKKyAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICByZXR1cm4ga2V5OwogCiBmYWlsOgotCVB5X0RFQ1JFRihzbyk7Ci0Jc2ktPnNpX3NldCA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHNvKTsKKyAgICBzaS0+c2lfc2V0ID0gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeVNldEl0ZXJfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotCSJzZXRpdGVyYXRvciIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2Yoc2V0aXRlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXNldGl0ZXJfZGVhbGxvYywgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkwLAkJCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYylzZXRpdGVyX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLSAJMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JMCwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JUHlPYmplY3RfU2VsZkl0ZXIsCQkJLyogdHBfaXRlciAqLwotCShpdGVybmV4dGZ1bmMpc2V0aXRlcl9pdGVybmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0Jc2V0aXRlcl9tZXRob2RzLAkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAorICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInNldGl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKHNldGl0ZXJvYmplY3QpLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKXNldGl0ZXJfZGVhbGxvYywgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MsLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2Mpc2V0aXRlcl90cmF2ZXJzZSwgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAoaXRlcm5leHRmdW5jKXNldGl0ZXJfaXRlcm5leHQsICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc2V0aXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwKIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaXRlcihQeVNldE9iamVjdCAqc28pCiB7Ci0Jc2V0aXRlcm9iamVjdCAqc2kgPSBQeU9iamVjdF9HQ19OZXcoc2V0aXRlcm9iamVjdCwgJlB5U2V0SXRlcl9UeXBlKTsKLQlpZiAoc2kgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKHNvKTsKLQlzaS0+c2lfc2V0ID0gc287Ci0Jc2ktPnNpX3VzZWQgPSBzby0+dXNlZDsKLQlzaS0+c2lfcG9zID0gMDsKLQlzaS0+bGVuID0gc28tPnVzZWQ7Ci0JX1B5T2JqZWN0X0dDX1RSQUNLKHNpKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopc2k7CisgICAgc2V0aXRlcm9iamVjdCAqc2kgPSBQeU9iamVjdF9HQ19OZXcoc2V0aXRlcm9iamVjdCwgJlB5U2V0SXRlcl9UeXBlKTsKKyAgICBpZiAoc2kgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKHNvKTsKKyAgICBzaS0+c2lfc2V0ID0gc287CisgICAgc2ktPnNpX3VzZWQgPSBzby0+dXNlZDsKKyAgICBzaS0+c2lfcG9zID0gMDsKKyAgICBzaS0+bGVuID0gc28tPnVzZWQ7CisgICAgX1B5T2JqZWN0X0dDX1RSQUNLKHNpKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc2k7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF91cGRhdGVfaW50ZXJuYWwoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKmtleSwgKml0OworICAgIFB5T2JqZWN0ICprZXksICppdDsKIAotCWlmIChQeUFueVNldF9DaGVjayhvdGhlcikpCi0JCXJldHVybiBzZXRfbWVyZ2Uoc28sIG90aGVyKTsKKyAgICBpZiAoUHlBbnlTZXRfQ2hlY2sob3RoZXIpKQorICAgICAgICByZXR1cm4gc2V0X21lcmdlKHNvLCBvdGhlcik7CiAKLQlpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7Ci0JCVB5T2JqZWN0ICp2YWx1ZTsKLQkJUHlfc3NpemVfdCBwb3MgPSAwOwotCQlsb25nIGhhc2g7Ci0JCVB5X3NzaXplX3QgZGljdHNpemUgPSBQeURpY3RfU2l6ZShvdGhlcik7CisgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgeworICAgICAgICBQeU9iamVjdCAqdmFsdWU7CisgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICAgICAgbG9uZyBoYXNoOworICAgICAgICBQeV9zc2l6ZV90IGRpY3RzaXplID0gUHlEaWN0X1NpemUob3RoZXIpOwogCi0JCS8qIERvIG9uZSBiaWcgcmVzaXplIGF0IHRoZSBzdGFydCwgcmF0aGVyIHRoYW4KLQkJKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAotCQkqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgotCQkqLwotCQlpZiAoZGljdHNpemUgPT0gLTEpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmICgoc28tPmZpbGwgKyBkaWN0c2l6ZSkqMyA+PSAoc28tPm1hc2srMSkqMikgewotCQkJaWYgKHNldF90YWJsZV9yZXNpemUoc28sIChzby0+dXNlZCArIGRpY3RzaXplKSoyKSAhPSAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQl3aGlsZSAoX1B5RGljdF9OZXh0KG90aGVyLCAmcG9zLCAma2V5LCAmdmFsdWUsICZoYXNoKSkgewotCQkJc2V0ZW50cnkgYW5fZW50cnk7CisgICAgICAgIC8qIERvIG9uZSBiaWcgcmVzaXplIGF0IHRoZSBzdGFydCwgcmF0aGVyIHRoYW4KKyAgICAgICAgKiBpbmNyZW1lbnRhbGx5IHJlc2l6aW5nIGFzIHdlIGluc2VydCBuZXcga2V5cy4gIEV4cGVjdAorICAgICAgICAqIHRoYXQgdGhlcmUgd2lsbCBiZSBubyAob3IgZmV3KSBvdmVybGFwcGluZyBrZXlzLgorICAgICAgICAqLworICAgICAgICBpZiAoZGljdHNpemUgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmICgoc28tPmZpbGwgKyBkaWN0c2l6ZSkqMyA+PSAoc28tPm1hc2srMSkqMikgeworICAgICAgICAgICAgaWYgKHNldF90YWJsZV9yZXNpemUoc28sIChzby0+dXNlZCArIGRpY3RzaXplKSoyKSAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoX1B5RGljdF9OZXh0KG90aGVyLCAmcG9zLCAma2V5LCAmdmFsdWUsICZoYXNoKSkgeworICAgICAgICAgICAgc2V0ZW50cnkgYW5fZW50cnk7CiAKLQkJCWFuX2VudHJ5Lmhhc2ggPSBoYXNoOwotCQkJYW5fZW50cnkua2V5ID0ga2V5OwotCQkJaWYgKHNldF9hZGRfZW50cnkoc28sICZhbl9lbnRyeSkgPT0gLTEpCi0JCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiAwOwotCX0KKyAgICAgICAgICAgIGFuX2VudHJ5Lmhhc2ggPSBoYXNoOworICAgICAgICAgICAgYW5fZW50cnkua2V5ID0ga2V5OworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sICZhbl9lbnRyeSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcihvdGhlcik7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIob3RoZXIpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQl3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2tleShzbywga2V5KSA9PSAtMSkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIH0gCi0JCVB5X0RFQ1JFRihrZXkpOwotCX0KLQlQeV9ERUNSRUYoaXQpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHNldF9hZGRfa2V5KHNvLCBrZXkpID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF91cGRhdGUoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBpOwogCi0JZm9yIChpPTAgOyBpPFB5VHVwbGVfR0VUX1NJWkUoYXJncykgOyBpKyspIHsKLQkJUHlPYmplY3QgKm90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQkJaWYgKHNldF91cGRhdGVfaW50ZXJuYWwoc28sIG90aGVyKSA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChzbywgb3RoZXIpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCi1QeURvY19TVFJWQVIodXBkYXRlX2RvYywgCitQeURvY19TVFJWQVIodXBkYXRlX2RvYywKICJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgdW5pb24gb2YgaXRzZWxmIGFuZCBvdGhlcnMuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtYWtlX25ld19zZXQoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqaXRlcmFibGUpCiB7Ci0JcmVnaXN0ZXIgUHlTZXRPYmplY3QgKnNvID0gTlVMTDsKKyAgICByZWdpc3RlciBQeVNldE9iamVjdCAqc28gPSBOVUxMOwogCi0JaWYgKGR1bW15ID09IE5VTEwpIHsgLyogQXV0by1pbml0aWFsaXplIGR1bW15ICovCi0JCWR1bW15ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPGR1bW15IGtleT4iKTsKLQkJaWYgKGR1bW15ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGR1bW15ID09IE5VTEwpIHsgLyogQXV0by1pbml0aWFsaXplIGR1bW15ICovCisgICAgICAgIGR1bW15ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPGR1bW15IGtleT4iKTsKKyAgICAgICAgaWYgKGR1bW15ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgUHlTZXRPYmplY3Qgc3RydWN0dXJlICovCi0JaWYgKG51bWZyZWUgJiYKLQkgICAgKHR5cGUgPT0gJlB5U2V0X1R5cGUgIHx8ICB0eXBlID09ICZQeUZyb3plblNldF9UeXBlKSkgewotCQlzbyA9IGZyZWVfbGlzdFstLW51bWZyZWVdOwotCQlhc3NlcnQgKHNvICE9IE5VTEwgJiYgUHlBbnlTZXRfQ2hlY2tFeGFjdChzbykpOwotCQlQeV9UWVBFKHNvKSA9IHR5cGU7Ci0JCV9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopc28pOwotCQlFTVBUWV9UT19NSU5TSVpFKHNvKTsKLQkJUHlPYmplY3RfR0NfVHJhY2soc28pOwotCX0gZWxzZSB7Ci0JCXNvID0gKFB5U2V0T2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7Ci0JCWlmIChzbyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCS8qIHRwX2FsbG9jIGhhcyBhbHJlYWR5IHplcm9lZCB0aGUgc3RydWN0dXJlICovCi0JCWFzc2VydChzby0+dGFibGUgPT0gTlVMTCAmJiBzby0+ZmlsbCA9PSAwICYmIHNvLT51c2VkID09IDApOwotCQlJTklUX05PTlpFUk9fU0VUX1NMT1RTKHNvKTsKLQl9CisgICAgLyogY3JlYXRlIFB5U2V0T2JqZWN0IHN0cnVjdHVyZSAqLworICAgIGlmIChudW1mcmVlICYmCisgICAgICAgICh0eXBlID09ICZQeVNldF9UeXBlICB8fCAgdHlwZSA9PSAmUHlGcm96ZW5TZXRfVHlwZSkpIHsKKyAgICAgICAgc28gPSBmcmVlX2xpc3RbLS1udW1mcmVlXTsKKyAgICAgICAgYXNzZXJ0IChzbyAhPSBOVUxMICYmIFB5QW55U2V0X0NoZWNrRXhhY3Qoc28pKTsKKyAgICAgICAgUHlfVFlQRShzbykgPSB0eXBlOworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKXNvKTsKKyAgICAgICAgRU1QVFlfVE9fTUlOU0laRShzbyk7CisgICAgICAgIFB5T2JqZWN0X0dDX1RyYWNrKHNvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbyA9IChQeVNldE9iamVjdCAqKXR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgICAgICBpZiAoc28gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAvKiB0cF9hbGxvYyBoYXMgYWxyZWFkeSB6ZXJvZWQgdGhlIHN0cnVjdHVyZSAqLworICAgICAgICBhc3NlcnQoc28tPnRhYmxlID09IE5VTEwgJiYgc28tPmZpbGwgPT0gMCAmJiBzby0+dXNlZCA9PSAwKTsKKyAgICAgICAgSU5JVF9OT05aRVJPX1NFVF9TTE9UUyhzbyk7CisgICAgfQogCi0Jc28tPmxvb2t1cCA9IHNldF9sb29ra2V5X3N0cmluZzsKLQlzby0+d2Vha3JlZmxpc3QgPSBOVUxMOworICAgIHNvLT5sb29rdXAgPSBzZXRfbG9va2tleV9zdHJpbmc7CisgICAgc28tPndlYWtyZWZsaXN0ID0gTlVMTDsKIAotCWlmIChpdGVyYWJsZSAhPSBOVUxMKSB7Ci0JCWlmIChzZXRfdXBkYXRlX2ludGVybmFsKHNvLCBpdGVyYWJsZSkgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihzbyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoaXRlcmFibGUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChzbywgaXRlcmFibGUpID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoc28pOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopc287CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNvOwogfQogCiAvKiBUaGUgZW1wdHkgZnJvemVuc2V0IGlzIGEgc2luZ2xldG9uICovCkBAIC0xMDM5LDU2ICsxMDM5LDU2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZnJvemVuc2V0X25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IE5VTEwsICpyZXN1bHQ7CiAKLQlpZiAodHlwZSA9PSAmUHlGcm96ZW5TZXRfVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImZyb3plbnNldCgpIiwga3dkcykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh0eXBlID09ICZQeUZyb3plblNldF9UeXBlICYmICFfUHlBcmdfTm9LZXl3b3JkcygiZnJvemVuc2V0KCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIHR5cGUtPnRwX25hbWUsIDAsIDEsICZpdGVyYWJsZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgdHlwZS0+dHBfbmFtZSwgMCwgMSwgJml0ZXJhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodHlwZSAhPSAmUHlGcm96ZW5TZXRfVHlwZSkKLQkJcmV0dXJuIG1ha2VfbmV3X3NldCh0eXBlLCBpdGVyYWJsZSk7CisgICAgaWYgKHR5cGUgIT0gJlB5RnJvemVuU2V0X1R5cGUpCisgICAgICAgIHJldHVybiBtYWtlX25ld19zZXQodHlwZSwgaXRlcmFibGUpOwogCi0JaWYgKGl0ZXJhYmxlICE9IE5VTEwpIHsKLQkJLyogZnJvemVuc2V0KGYpIGlzIGlkZW1wb3RlbnQgKi8KLQkJaWYgKFB5RnJvemVuU2V0X0NoZWNrRXhhY3QoaXRlcmFibGUpKSB7Ci0JCQlQeV9JTkNSRUYoaXRlcmFibGUpOwotCQkJcmV0dXJuIGl0ZXJhYmxlOwotCQl9Ci0JCXJlc3VsdCA9IG1ha2VfbmV3X3NldCh0eXBlLCBpdGVyYWJsZSk7Ci0JCWlmIChyZXN1bHQgPT0gTlVMTCB8fCBQeVNldF9HRVRfU0laRShyZXN1bHQpKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JfQotCS8qIFRoZSBlbXB0eSBmcm96ZW5zZXQgaXMgYSBzaW5nbGV0b24gKi8KLQlpZiAoZW1wdHlmcm96ZW5zZXQgPT0gTlVMTCkKLQkJZW1wdHlmcm96ZW5zZXQgPSBtYWtlX25ld19zZXQodHlwZSwgTlVMTCk7Ci0JUHlfWElOQ1JFRihlbXB0eWZyb3plbnNldCk7Ci0JcmV0dXJuIGVtcHR5ZnJvemVuc2V0OworICAgIGlmIChpdGVyYWJsZSAhPSBOVUxMKSB7CisgICAgICAgIC8qIGZyb3plbnNldChmKSBpcyBpZGVtcG90ZW50ICovCisgICAgICAgIGlmIChQeUZyb3plblNldF9DaGVja0V4YWN0KGl0ZXJhYmxlKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZXJhYmxlKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyYWJsZTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBtYWtlX25ld19zZXQodHlwZSwgaXRlcmFibGUpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwgfHwgUHlTZXRfR0VUX1NJWkUocmVzdWx0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICAvKiBUaGUgZW1wdHkgZnJvemVuc2V0IGlzIGEgc2luZ2xldG9uICovCisgICAgaWYgKGVtcHR5ZnJvemVuc2V0ID09IE5VTEwpCisgICAgICAgIGVtcHR5ZnJvemVuc2V0ID0gbWFrZV9uZXdfc2V0KHR5cGUsIE5VTEwpOworICAgIFB5X1hJTkNSRUYoZW1wdHlmcm96ZW5zZXQpOworICAgIHJldHVybiBlbXB0eWZyb3plbnNldDsKIH0KIAogdm9pZAogUHlTZXRfRmluaSh2b2lkKQogewotCVB5U2V0T2JqZWN0ICpzbzsKKyAgICBQeVNldE9iamVjdCAqc287CiAKLQl3aGlsZSAobnVtZnJlZSkgewotCQludW1mcmVlLS07Ci0JCXNvID0gZnJlZV9saXN0W251bWZyZWVdOwotCQlQeU9iamVjdF9HQ19EZWwoc28pOwotCX0KLQlQeV9DTEVBUihkdW1teSk7Ci0JUHlfQ0xFQVIoZW1wdHlmcm96ZW5zZXQpOworICAgIHdoaWxlIChudW1mcmVlKSB7CisgICAgICAgIG51bWZyZWUtLTsKKyAgICAgICAgc28gPSBmcmVlX2xpc3RbbnVtZnJlZV07CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbChzbyk7CisgICAgfQorICAgIFB5X0NMRUFSKGR1bW15KTsKKyAgICBQeV9DTEVBUihlbXB0eWZyb3plbnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWlmICh0eXBlID09ICZQeVNldF9UeXBlICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JcmV0dXJuIG1ha2VfbmV3X3NldCh0eXBlLCBOVUxMKTsKKyAgICBpZiAodHlwZSA9PSAmUHlTZXRfVHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoInNldCgpIiwga3dkcykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIG1ha2VfbmV3X3NldCh0eXBlLCBOVUxMKTsKIH0KIAogLyogc2V0X3N3YXBfYm9kaWVzKCkgc3dpdGNoZXMgdGhlIGNvbnRlbnRzIG9mIGFueSB0d28gc2V0cyBieSBtb3ZpbmcgdGhlaXIKQEAgLTEwOTgsNjQgKzEwOTgsNjQgQEAKICAgICAgdD1zZXQoYSk7IGEuY2xlYXIoKTsgYS51cGRhdGUoYik7IGIuY2xlYXIoKTsgYi51cGRhdGUodCk7IGRlbCB0CiAKICAgIFRoZSBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMgYW5kIGl0IGxlYXZlcyBib3RoIG9iamVjdHMgaW4gYSBzdGFibGUgc3RhdGUuCi0gICBVc2VmdWwgZm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmcm96ZW5zZXRzIGZyb20gc2V0cyBmb3IgbWVtYmVyc2hpcCB0ZXN0aW5nIAorICAgVXNlZnVsIGZvciBjcmVhdGluZyB0ZW1wb3JhcnkgZnJvemVuc2V0cyBmcm9tIHNldHMgZm9yIG1lbWJlcnNoaXAgdGVzdGluZwogICAgaW4gX19jb250YWluc19fKCksIGRpc2NhcmQoKSwgYW5kIHJlbW92ZSgpLiAgQWxzbyB1c2VmdWwgZm9yIG9wZXJhdGlvbnMKLSAgIHRoYXQgdXBkYXRlIGluLXBsYWNlIChieSBhbGxvd2luZyBhbiBpbnRlcm1lZGlhdGUgcmVzdWx0IHRvIGJlIHN3YXBwZWQgCisgICB0aGF0IHVwZGF0ZSBpbi1wbGFjZSAoYnkgYWxsb3dpbmcgYW4gaW50ZXJtZWRpYXRlIHJlc3VsdCB0byBiZSBzd2FwcGVkCiAgICBpbnRvIG9uZSBvZiB0aGUgb3JpZ2luYWwgaW5wdXRzKS4KICovCiAKIHN0YXRpYyB2b2lkCiBzZXRfc3dhcF9ib2RpZXMoUHlTZXRPYmplY3QgKmEsIFB5U2V0T2JqZWN0ICpiKQogewotCVB5X3NzaXplX3QgdDsKLQlzZXRlbnRyeSAqdTsKLQlzZXRlbnRyeSAqKCpmKShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCk7Ci0Jc2V0ZW50cnkgdGFiW1B5U2V0X01JTlNJWkVdOwotCWxvbmcgaDsKKyAgICBQeV9zc2l6ZV90IHQ7CisgICAgc2V0ZW50cnkgKnU7CisgICAgc2V0ZW50cnkgKigqZikoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOworICAgIHNldGVudHJ5IHRhYltQeVNldF9NSU5TSVpFXTsKKyAgICBsb25nIGg7CiAKLQl0ID0gYS0+ZmlsbDsgICAgIGEtPmZpbGwgICA9IGItPmZpbGw7ICAgICAgICBiLT5maWxsICA9IHQ7Ci0JdCA9IGEtPnVzZWQ7ICAgICBhLT51c2VkICAgPSBiLT51c2VkOyAgICAgICAgYi0+dXNlZCAgPSB0OwotCXQgPSBhLT5tYXNrOyAgICAgYS0+bWFzayAgID0gYi0+bWFzazsgICAgICAgIGItPm1hc2sgID0gdDsKKyAgICB0ID0gYS0+ZmlsbDsgICAgIGEtPmZpbGwgICA9IGItPmZpbGw7ICAgICAgICBiLT5maWxsICA9IHQ7CisgICAgdCA9IGEtPnVzZWQ7ICAgICBhLT51c2VkICAgPSBiLT51c2VkOyAgICAgICAgYi0+dXNlZCAgPSB0OworICAgIHQgPSBhLT5tYXNrOyAgICAgYS0+bWFzayAgID0gYi0+bWFzazsgICAgICAgIGItPm1hc2sgID0gdDsKIAotCXUgPSBhLT50YWJsZTsKLQlpZiAoYS0+dGFibGUgPT0gYS0+c21hbGx0YWJsZSkKLQkJdSA9IGItPnNtYWxsdGFibGU7Ci0JYS0+dGFibGUgID0gYi0+dGFibGU7Ci0JaWYgKGItPnRhYmxlID09IGItPnNtYWxsdGFibGUpCi0JCWEtPnRhYmxlID0gYS0+c21hbGx0YWJsZTsKLQliLT50YWJsZSA9IHU7CisgICAgdSA9IGEtPnRhYmxlOworICAgIGlmIChhLT50YWJsZSA9PSBhLT5zbWFsbHRhYmxlKQorICAgICAgICB1ID0gYi0+c21hbGx0YWJsZTsKKyAgICBhLT50YWJsZSAgPSBiLT50YWJsZTsKKyAgICBpZiAoYi0+dGFibGUgPT0gYi0+c21hbGx0YWJsZSkKKyAgICAgICAgYS0+dGFibGUgPSBhLT5zbWFsbHRhYmxlOworICAgIGItPnRhYmxlID0gdTsKIAotCWYgPSBhLT5sb29rdXA7ICAgYS0+bG9va3VwID0gYi0+bG9va3VwOyAgICAgIGItPmxvb2t1cCA9IGY7CisgICAgZiA9IGEtPmxvb2t1cDsgICBhLT5sb29rdXAgPSBiLT5sb29rdXA7ICAgICAgYi0+bG9va3VwID0gZjsKIAotCWlmIChhLT50YWJsZSA9PSBhLT5zbWFsbHRhYmxlIHx8IGItPnRhYmxlID09IGItPnNtYWxsdGFibGUpIHsKLQkJbWVtY3B5KHRhYiwgYS0+c21hbGx0YWJsZSwgc2l6ZW9mKHRhYikpOwotCQltZW1jcHkoYS0+c21hbGx0YWJsZSwgYi0+c21hbGx0YWJsZSwgc2l6ZW9mKHRhYikpOwotCQltZW1jcHkoYi0+c21hbGx0YWJsZSwgdGFiLCBzaXplb2YodGFiKSk7Ci0JfQorICAgIGlmIChhLT50YWJsZSA9PSBhLT5zbWFsbHRhYmxlIHx8IGItPnRhYmxlID09IGItPnNtYWxsdGFibGUpIHsKKyAgICAgICAgbWVtY3B5KHRhYiwgYS0+c21hbGx0YWJsZSwgc2l6ZW9mKHRhYikpOworICAgICAgICBtZW1jcHkoYS0+c21hbGx0YWJsZSwgYi0+c21hbGx0YWJsZSwgc2l6ZW9mKHRhYikpOworICAgICAgICBtZW1jcHkoYi0+c21hbGx0YWJsZSwgdGFiLCBzaXplb2YodGFiKSk7CisgICAgfQogCi0JaWYgKFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShhKSwgJlB5RnJvemVuU2V0X1R5cGUpICAmJgotCSAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUoYiksICZQeUZyb3plblNldF9UeXBlKSkgewotCQloID0gYS0+aGFzaDsgICAgIGEtPmhhc2ggPSBiLT5oYXNoOyAgYi0+aGFzaCA9IGg7Ci0JfSBlbHNlIHsKLQkJYS0+aGFzaCA9IC0xOwotCQliLT5oYXNoID0gLTE7Ci0JfQorICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUoYSksICZQeUZyb3plblNldF9UeXBlKSAgJiYKKyAgICAgICAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKGIpLCAmUHlGcm96ZW5TZXRfVHlwZSkpIHsKKyAgICAgICAgaCA9IGEtPmhhc2g7ICAgICBhLT5oYXNoID0gYi0+aGFzaDsgIGItPmhhc2ggPSBoOworICAgIH0gZWxzZSB7CisgICAgICAgIGEtPmhhc2ggPSAtMTsKKyAgICAgICAgYi0+aGFzaCA9IC0xOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9jb3B5KFB5U2V0T2JqZWN0ICpzbykKIHsKLQlyZXR1cm4gbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCAoUHlPYmplY3QgKilzbyk7CisgICAgcmV0dXJuIG1ha2VfbmV3X3NldChQeV9UWVBFKHNvKSwgKFB5T2JqZWN0ICopc28pOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZnJvemVuc2V0X2NvcHkoUHlTZXRPYmplY3QgKnNvKQogewotCWlmIChQeUZyb3plblNldF9DaGVja0V4YWN0KHNvKSkgewotCQlQeV9JTkNSRUYoc28pOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopc287Ci0JfQotCXJldHVybiBzZXRfY29weShzbyk7CisgICAgaWYgKFB5RnJvemVuU2V0X0NoZWNrRXhhY3Qoc28pKSB7CisgICAgICAgIFB5X0lOQ1JFRihzbyk7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilzbzsKKyAgICB9CisgICAgcmV0dXJuIHNldF9jb3B5KHNvKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvcHlfZG9jLCAiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgc2V0LiIpOwpAQCAtMTE2Myw4ICsxMTYzLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfY2xlYXIoUHlTZXRPYmplY3QgKnNvKQogewotCXNldF9jbGVhcl9pbnRlcm5hbChzbyk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgc2V0X2NsZWFyX2ludGVybmFsKHNvKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGNsZWFyX2RvYywgIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHNldC4iKTsKQEAgLTExNzIsMjQgKzExNzIsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfdW5pb24oUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeVNldE9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICpvdGhlcjsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlTZXRPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CisgICAgUHlfc3NpemVfdCBpOwogCi0JcmVzdWx0ID0gKFB5U2V0T2JqZWN0ICopc2V0X2NvcHkoc28pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gKFB5U2V0T2JqZWN0ICopc2V0X2NvcHkoc28pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgewotCQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCWlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKLQkJCWNvbnRpbnVlOwotCQlpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChyZXN1bHQsIG90aGVyKSA9PSAtMSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIGZvciAoaT0wIDsgaTxQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDsgaSsrKSB7CisgICAgICAgIG90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChzZXRfdXBkYXRlX2ludGVybmFsKHJlc3VsdCwgb3RoZXIpID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUih1bmlvbl9kb2MsCkBAIC0xMjAwLDE0MiArMTIwMCwxNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfb3IoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlTZXRPYmplY3QgKnJlc3VsdDsKKyAgICBQeVNldE9iamVjdCAqcmVzdWx0OwogCi0JaWYgKCFQeUFueVNldF9DaGVjayhzbykgfHwgIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGlmICghUHlBbnlTZXRfQ2hlY2soc28pIHx8ICFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KIAotCXJlc3VsdCA9IChQeVNldE9iamVjdCAqKXNldF9jb3B5KHNvKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKLQkJcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKLQlpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChyZXN1bHQsIG90aGVyKSA9PSAtMSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgcmVzdWx0ID0gKFB5U2V0T2JqZWN0ICopc2V0X2NvcHkoc28pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQorICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgIGlmIChzZXRfdXBkYXRlX2ludGVybmFsKHJlc3VsdCwgb3RoZXIpID09IC0xKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pb3IoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlpZiAoc2V0X3VwZGF0ZV9pbnRlcm5hbChzbywgb3RoZXIpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoc28pOwotCXJldHVybiAoUHlPYmplY3QgKilzbzsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGlmIChzZXRfdXBkYXRlX2ludGVybmFsKHNvLCBvdGhlcikgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihzbyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2ludGVyc2VjdGlvbihQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeVNldE9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICprZXksICppdCwgKnRtcDsKKyAgICBQeVNldE9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICprZXksICppdCwgKnRtcDsKIAotCWlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKLQkJcmV0dXJuIHNldF9jb3B5KHNvKTsKKyAgICBpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCisgICAgICAgIHJldHVybiBzZXRfY29weShzbyk7CiAKLQlyZXN1bHQgPSAoUHlTZXRPYmplY3QgKiltYWtlX25ld19zZXQoUHlfVFlQRShzbyksIE5VTEwpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gKFB5U2V0T2JqZWN0ICopbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5QW55U2V0X0NoZWNrKG90aGVyKSkgewkJCi0JCVB5X3NzaXplX3QgcG9zID0gMDsKLQkJc2V0ZW50cnkgKmVudHJ5OworICAgIGlmIChQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICBzZXRlbnRyeSAqZW50cnk7CiAKLQkJaWYgKFB5U2V0X0dFVF9TSVpFKG90aGVyKSA+IFB5U2V0X0dFVF9TSVpFKHNvKSkgewotCQkJdG1wID0gKFB5T2JqZWN0ICopc287Ci0JCQlzbyA9IChQeVNldE9iamVjdCAqKW90aGVyOwotCQkJb3RoZXIgPSB0bXA7Ci0JCX0KKyAgICAgICAgaWYgKFB5U2V0X0dFVF9TSVpFKG90aGVyKSA+IFB5U2V0X0dFVF9TSVpFKHNvKSkgeworICAgICAgICAgICAgdG1wID0gKFB5T2JqZWN0ICopc287CisgICAgICAgICAgICBzbyA9IChQeVNldE9iamVjdCAqKW90aGVyOworICAgICAgICAgICAgb3RoZXIgPSB0bXA7CisgICAgICAgIH0KIAotCQl3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpIHsKLQkJCWludCBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgZW50cnkpOwotCQkJaWYgKHJ2ID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlpZiAocnYpIHsKLQkJCQlpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGVudHJ5KSA9PSAtMSkgewotCQkJCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7Ci0JfQorICAgICAgICB3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpIHsKKyAgICAgICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgZW50cnkpOworICAgICAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocnYpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGVudHJ5KSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgICAgfQogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKG90aGVyKTsKLQlpZiAoaXQgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihvdGhlcik7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCWludCBydjsKLQkJc2V0ZW50cnkgZW50cnk7Ci0JCWxvbmcgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBpbnQgcnY7CisgICAgICAgIHNldGVudHJ5IGVudHJ5OworICAgICAgICBsb25nIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CiAKLQkJaWYgKGhhc2ggPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZW50cnkuaGFzaCA9IGhhc2g7Ci0JCWVudHJ5LmtleSA9IGtleTsKLQkJcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sICZlbnRyeSk7Ci0JCWlmIChydiA9PSAtMSkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJUHlfREVDUkVGKGtleSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAocnYpIHsKLQkJCWlmIChzZXRfYWRkX2VudHJ5KHJlc3VsdCwgJmVudHJ5KSA9PSAtMSkgewotCQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJUHlfREVDUkVGKGtleSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJUHlfREVDUkVGKGtleSk7Ci0JfQotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OworICAgICAgICBpZiAoaGFzaCA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlbnRyeS5oYXNoID0gaGFzaDsKKyAgICAgICAgZW50cnkua2V5ID0ga2V5OworICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgJmVudHJ5KTsKKyAgICAgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChydikgeworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkocmVzdWx0LCAmZW50cnkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaW50ZXJzZWN0aW9uX211bHRpKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICpyZXN1bHQgPSAoUHlPYmplY3QgKilzbzsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IChQeU9iamVjdCAqKXNvOwogCi0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKLQkJcmV0dXJuIHNldF9jb3B5KHNvKTsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQorICAgICAgICByZXR1cm4gc2V0X2NvcHkoc28pOwogCi0JUHlfSU5DUkVGKHNvKTsKLQlmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgewotCQlQeU9iamVjdCAqb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlQeU9iamVjdCAqbmV3cmVzdWx0ID0gc2V0X2ludGVyc2VjdGlvbigoUHlTZXRPYmplY3QgKilyZXN1bHQsIG90aGVyKTsKLQkJaWYgKG5ld3Jlc3VsdCA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBuZXdyZXN1bHQ7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgUHlfSU5DUkVGKHNvKTsKKyAgICBmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBQeU9iamVjdCAqbmV3cmVzdWx0ID0gc2V0X2ludGVyc2VjdGlvbigoUHlTZXRPYmplY3QgKilyZXN1bHQsIG90aGVyKTsKKyAgICAgICAgaWYgKG5ld3Jlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSBuZXdyZXN1bHQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihpbnRlcnNlY3Rpb25fZG9jLApAQCAtMTM0NiwyNyArMTM0NiwyNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pbnRlcnNlY3Rpb25fdXBkYXRlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCXRtcCA9IHNldF9pbnRlcnNlY3Rpb24oc28sIG90aGVyKTsKLQlpZiAodG1wID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNldF9zd2FwX2JvZGllcyhzbywgKFB5U2V0T2JqZWN0ICopdG1wKTsKLQlQeV9ERUNSRUYodG1wKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICB0bXAgPSBzZXRfaW50ZXJzZWN0aW9uKHNvLCBvdGhlcik7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZXRfc3dhcF9ib2RpZXMoc28sIChQeVNldE9iamVjdCAqKXRtcCk7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaW50ZXJzZWN0aW9uX3VwZGF0ZV9tdWx0aShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotCXRtcCA9IHNldF9pbnRlcnNlY3Rpb25fbXVsdGkoc28sIGFyZ3MpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc2V0X3N3YXBfYm9kaWVzKHNvLCAoUHlTZXRPYmplY3QgKil0bXApOwotCVB5X0RFQ1JFRih0bXApOwotCVB5X1JFVFVSTl9OT05FOworICAgIHRtcCA9IHNldF9pbnRlcnNlY3Rpb25fbXVsdGkoc28sIGFyZ3MpOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2V0X3N3YXBfYm9kaWVzKHNvLCAoUHlTZXRPYmplY3QgKil0bXApOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoaW50ZXJzZWN0aW9uX3VwZGF0ZV9kb2MsCkBAIC0xMzc1LDkyICsxMzc1LDkyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2FuZChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlpZiAoIVB5QW55U2V0X0NoZWNrKHNvKSB8fCAhUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JcmV0dXJuIHNldF9pbnRlcnNlY3Rpb24oc28sIG90aGVyKTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNvKSB8fCAhUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmV0dXJuIHNldF9pbnRlcnNlY3Rpb24oc28sIG90aGVyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pYW5kKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JcmVzdWx0ID0gc2V0X2ludGVyc2VjdGlvbl91cGRhdGUoc28sIG90aGVyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5X0lOQ1JFRihzbyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNvOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmVzdWx0ID0gc2V0X2ludGVyc2VjdGlvbl91cGRhdGUoc28sIG90aGVyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0lOQ1JFRihzbyk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2lzZGlzam9pbnQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKmtleSwgKml0LCAqdG1wOworICAgIFB5T2JqZWN0ICprZXksICppdCwgKnRtcDsKIAotCWlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikgewotCQlpZiAoUHlTZXRfR0VUX1NJWkUoc28pID09IDApCi0JCQlQeV9SRVRVUk5fVFJVRTsKLQkJZWxzZQotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCX0KKyAgICBpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpIHsKKyAgICAgICAgaWYgKFB5U2V0X0dFVF9TSVpFKHNvKSA9PSAwKQorICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CiAKLQlpZiAoUHlBbnlTZXRfQ2hlY2tFeGFjdChvdGhlcikpIHsJCQotCQlQeV9zc2l6ZV90IHBvcyA9IDA7Ci0JCXNldGVudHJ5ICplbnRyeTsKKyAgICBpZiAoUHlBbnlTZXRfQ2hlY2tFeGFjdChvdGhlcikpIHsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICBzZXRlbnRyeSAqZW50cnk7CiAKLQkJaWYgKFB5U2V0X0dFVF9TSVpFKG90aGVyKSA+IFB5U2V0X0dFVF9TSVpFKHNvKSkgewotCQkJdG1wID0gKFB5T2JqZWN0ICopc287Ci0JCQlzbyA9IChQeVNldE9iamVjdCAqKW90aGVyOwotCQkJb3RoZXIgPSB0bXA7Ci0JCX0KLQkJd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7Ci0JCQlpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKLQkJCWlmIChydiA9PSAtMSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWlmIChydikKLQkJCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCX0KLQkJUHlfUkVUVVJOX1RSVUU7Ci0JfQorICAgICAgICBpZiAoUHlTZXRfR0VUX1NJWkUob3RoZXIpID4gUHlTZXRfR0VUX1NJWkUoc28pKSB7CisgICAgICAgICAgICB0bXAgPSAoUHlPYmplY3QgKilzbzsKKyAgICAgICAgICAgIHNvID0gKFB5U2V0T2JqZWN0ICopb3RoZXI7CisgICAgICAgICAgICBvdGhlciA9IHRtcDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpIHsKKyAgICAgICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgZW50cnkpOworICAgICAgICAgICAgaWYgKHJ2ID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgaWYgKHJ2KQorICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIob3RoZXIpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIob3RoZXIpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCWludCBydjsKLQkJc2V0ZW50cnkgZW50cnk7Ci0JCWxvbmcgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKKyAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBpbnQgcnY7CisgICAgICAgIHNldGVudHJ5IGVudHJ5OworICAgICAgICBsb25nIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CiAKLQkJaWYgKGhhc2ggPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJUHlfREVDUkVGKGl0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVudHJ5Lmhhc2ggPSBoYXNoOwotCQllbnRyeS5rZXkgPSBrZXk7Ci0JCXJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCAmZW50cnkpOwotCQlQeV9ERUNSRUYoa2V5KTsKLQkJaWYgKHJ2ID09IC0xKSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKHJ2KSB7Ci0JCQlQeV9ERUNSRUYoaXQpOwotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQl9Ci0JfQotCVB5X0RFQ1JFRihpdCk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X1JFVFVSTl9UUlVFOworICAgICAgICBpZiAoaGFzaCA9PSAtMSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZW50cnkuaGFzaCA9IGhhc2g7CisgICAgICAgIGVudHJ5LmtleSA9IGtleTsKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sICZlbnRyeSk7CisgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocnYpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAKIFB5RG9jX1NUUlZBUihpc2Rpc2pvaW50X2RvYywKQEAgLTE0NjksNTEgKzE0NjksNTEgQEAKIHN0YXRpYyBpbnQKIHNldF9kaWZmZXJlbmNlX3VwZGF0ZV9pbnRlcm5hbChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCi0JCXJldHVybiBzZXRfY2xlYXJfaW50ZXJuYWwoc28pOwotCQotCWlmIChQeUFueVNldF9DaGVjayhvdGhlcikpIHsKLQkJc2V0ZW50cnkgKmVudHJ5OwotCQlQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQorICAgICAgICByZXR1cm4gc2V0X2NsZWFyX2ludGVybmFsKHNvKTsKIAotCQl3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpCi0JCQlpZiAoc2V0X2Rpc2NhcmRfZW50cnkoc28sIGVudHJ5KSA9PSAtMSkKLQkJCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJUHlPYmplY3QgKmtleSwgKml0OwotCQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIob3RoZXIpOwotCQlpZiAoaXQgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKKyAgICBpZiAoUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCi0JCXdoaWxlICgoa2V5ID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0JCQlpZiAoc2V0X2Rpc2NhcmRfa2V5KHNvLCBrZXkpID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKGl0KTsKLQkJCQlQeV9ERUNSRUYoa2V5KTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoa2V5KTsKLQkJfQotCQlQeV9ERUNSRUYoaXQpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JLyogSWYgbW9yZSB0aGFuIDEvNSBhcmUgZHVtbWllcywgdGhlbiByZXNpemUgdGhlbSBhd2F5LiAqLwotCWlmICgoc28tPmZpbGwgLSBzby0+dXNlZCkgKiA1IDwgc28tPm1hc2spCi0JCXJldHVybiAwOwotCXJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZD41MDAwMCA/IHNvLT51c2VkKjIgOiBzby0+dXNlZCo0KTsKKyAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKQorICAgICAgICAgICAgaWYgKHNldF9kaXNjYXJkX2VudHJ5KHNvLCBlbnRyeSkgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICprZXksICppdDsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKG90aGVyKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChzZXRfZGlzY2FyZF9rZXkoc28sIGtleSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBJZiBtb3JlIHRoYW4gMS81IGFyZSBkdW1taWVzLCB0aGVuIHJlc2l6ZSB0aGVtIGF3YXkuICovCisgICAgaWYgKChzby0+ZmlsbCAtIHNvLT51c2VkKSAqIDUgPCBzby0+bWFzaykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkPjUwMDAwID8gc28tPnVzZWQqMiA6IHNvLT51c2VkKjQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpZmZlcmVuY2VfdXBkYXRlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaT0wIDsgaTxQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCWlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoc28sIG90aGVyKSA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBmb3IgKGk9MCA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKHNvLCBvdGhlcikgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihkaWZmZXJlbmNlX3VwZGF0ZV9kb2MsCkBAIC0xNTIyLDc3ICsxNTIyLDc3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpZmZlcmVuY2UoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlzZXRlbnRyeSAqZW50cnk7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgc2V0ZW50cnkgKmVudHJ5OworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAotCWlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpICAmJiAhUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7Ci0JCXJlc3VsdCA9IHNldF9jb3B5KHNvKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBvdGhlcikgIT0gLTEpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCXJlc3VsdCA9IG1ha2VfbmV3X3NldChQeV9UWVBFKHNvKSwgTlVMTCk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSAgJiYgIVB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgeworICAgICAgICByZXN1bHQgPSBzZXRfY29weShzbyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoc2V0X2RpZmZlcmVuY2VfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKXJlc3VsdCwgb3RoZXIpICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKLQkJd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0JCQlzZXRlbnRyeSBlbnRyeWNvcHk7Ci0JCQllbnRyeWNvcHkuaGFzaCA9IGVudHJ5LT5oYXNoOwotCQkJZW50cnljb3B5LmtleSA9IGVudHJ5LT5rZXk7Ci0JCQlpZiAoIV9QeURpY3RfQ29udGFpbnMob3RoZXIsIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKSkgewotCQkJCWlmIChzZXRfYWRkX2VudHJ5KChQeVNldE9iamVjdCAqKXJlc3VsdCwgJmVudHJ5Y29weSkgPT0gLTEpIHsKLQkJCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KKyAgICByZXN1bHQgPSBtYWtlX25ld19zZXQoUHlfVFlQRShzbyksIE5VTEwpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKLQkJaW50IHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KChQeVNldE9iamVjdCAqKW90aGVyLCBlbnRyeSk7Ci0JCWlmIChydiA9PSAtMSkgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIXJ2KSB7Ci0JCQlpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsIGVudHJ5KSA9PSAtMSkgewotCQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgeworICAgICAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKKyAgICAgICAgICAgIHNldGVudHJ5IGVudHJ5Y29weTsKKyAgICAgICAgICAgIGVudHJ5Y29weS5oYXNoID0gZW50cnktPmhhc2g7CisgICAgICAgICAgICBlbnRyeWNvcHkua2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgICAgIGlmICghX1B5RGljdF9Db250YWlucyhvdGhlciwgZW50cnktPmtleSwgZW50cnktPmhhc2gpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCAmZW50cnljb3B5KSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7CisgICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOworICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFydikgeworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBlbnRyeSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2RpZmZlcmVuY2VfbXVsdGkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKnJlc3VsdCwgKm90aGVyOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqcmVzdWx0LCAqb3RoZXI7CiAKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQotCQlyZXR1cm4gc2V0X2NvcHkoc28pOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCisgICAgICAgIHJldHVybiBzZXRfY29weShzbyk7CiAKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JcmVzdWx0ID0gc2V0X2RpZmZlcmVuY2Uoc28sIG90aGVyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIG90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICByZXN1bHQgPSBzZXRfZGlmZmVyZW5jZShzbywgb3RoZXIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGk9MSA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgewotCQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCWlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBvdGhlcikgPT0gLTEpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBmb3IgKGk9MSA7IGk8UHlUdXBsZV9HRVRfU0laRShhcmdzKSA7IGkrKykgeworICAgICAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIGlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBvdGhlcikgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGRpZmZlcmVuY2VfZG9jLApAQCAtMTYwMiw4MSArMTYwMiw4MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9zdWIoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKCFQeUFueVNldF9DaGVjayhzbykgfHwgIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJldHVybiBzZXRfZGlmZmVyZW5jZShzbywgb3RoZXIpOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2soc28pIHx8ICFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICByZXR1cm4gc2V0X2RpZmZlcmVuY2Uoc28sIG90aGVyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9pc3ViKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCWlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JaWYgKHNldF9kaWZmZXJlbmNlX3VwZGF0ZV9pbnRlcm5hbChzbywgb3RoZXIpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoc28pOwotCXJldHVybiAoUHlPYmplY3QgKilzbzsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIGlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoc28sIG90aGVyKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKHNvKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc287CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5U2V0T2JqZWN0ICpvdGhlcnNldDsKLQlQeU9iamVjdCAqa2V5OwotCVB5X3NzaXplX3QgcG9zID0gMDsKLQlzZXRlbnRyeSAqZW50cnk7CisgICAgUHlTZXRPYmplY3QgKm90aGVyc2V0OworICAgIFB5T2JqZWN0ICprZXk7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIHNldGVudHJ5ICplbnRyeTsKIAotCWlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikKLQkJcmV0dXJuIHNldF9jbGVhcihzbyk7CisgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQorICAgICAgICByZXR1cm4gc2V0X2NsZWFyKHNvKTsKIAotCWlmIChQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKLQkJUHlPYmplY3QgKnZhbHVlOwotCQlpbnQgcnY7Ci0JCWxvbmcgaGFzaDsKLQkJd2hpbGUgKF9QeURpY3RfTmV4dChvdGhlciwgJnBvcywgJmtleSwgJnZhbHVlLCAmaGFzaCkpIHsKLQkJCXNldGVudHJ5IGFuX2VudHJ5OworICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChvdGhlcikpIHsKKyAgICAgICAgUHlPYmplY3QgKnZhbHVlOworICAgICAgICBpbnQgcnY7CisgICAgICAgIGxvbmcgaGFzaDsKKyAgICAgICAgd2hpbGUgKF9QeURpY3RfTmV4dChvdGhlciwgJnBvcywgJmtleSwgJnZhbHVlLCAmaGFzaCkpIHsKKyAgICAgICAgICAgIHNldGVudHJ5IGFuX2VudHJ5OwogCi0JCQlhbl9lbnRyeS5oYXNoID0gaGFzaDsKLQkJCWFuX2VudHJ5LmtleSA9IGtleTsKLQkJCXJ2ID0gc2V0X2Rpc2NhcmRfZW50cnkoc28sICZhbl9lbnRyeSk7Ci0JCQlpZiAocnYgPT0gLTEpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCQlpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgewotCQkJCWlmIChzZXRfYWRkX2VudHJ5KHNvLCAmYW5fZW50cnkpID09IC0xKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlQeV9SRVRVUk5fTk9ORTsKLQl9CisgICAgICAgICAgICBhbl9lbnRyeS5oYXNoID0gaGFzaDsKKyAgICAgICAgICAgIGFuX2VudHJ5LmtleSA9IGtleTsKKyAgICAgICAgICAgIHJ2ID0gc2V0X2Rpc2NhcmRfZW50cnkoc28sICZhbl9lbnRyeSk7CisgICAgICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgeworICAgICAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCAmYW5fZW50cnkpID09IC0xKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiAKLQlpZiAoUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihvdGhlcik7Ci0JCW90aGVyc2V0ID0gKFB5U2V0T2JqZWN0ICopb3RoZXI7Ci0JfSBlbHNlIHsKLQkJb3RoZXJzZXQgPSAoUHlTZXRPYmplY3QgKiltYWtlX25ld19zZXQoUHlfVFlQRShzbyksIG90aGVyKTsKLQkJaWYgKG90aGVyc2V0ID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5QW55U2V0X0NoZWNrKG90aGVyKSkgeworICAgICAgICBQeV9JTkNSRUYob3RoZXIpOworICAgICAgICBvdGhlcnNldCA9IChQeVNldE9iamVjdCAqKW90aGVyOworICAgIH0gZWxzZSB7CisgICAgICAgIG90aGVyc2V0ID0gKFB5U2V0T2JqZWN0ICopbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCBvdGhlcik7CisgICAgICAgIGlmIChvdGhlcnNldCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jd2hpbGUgKHNldF9uZXh0KG90aGVyc2V0LCAmcG9zLCAmZW50cnkpKSB7Ci0JCWludCBydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCBlbnRyeSk7Ci0JCWlmIChydiA9PSAtMSkgewotCQkJUHlfREVDUkVGKG90aGVyc2V0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7Ci0JCQlpZiAoc2V0X2FkZF9lbnRyeShzbywgZW50cnkpID09IC0xKSB7Ci0JCQkJUHlfREVDUkVGKG90aGVyc2V0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQlQeV9ERUNSRUYob3RoZXJzZXQpOwotCVB5X1JFVFVSTl9OT05FOworICAgIHdoaWxlIChzZXRfbmV4dChvdGhlcnNldCwgJnBvcywgJmVudHJ5KSkgeworICAgICAgICBpbnQgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnkpOworICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvdGhlcnNldCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocnYgPT0gRElTQ0FSRF9OT1RGT1VORCkgeworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sIGVudHJ5KSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvdGhlcnNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKG90aGVyc2V0KTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZV9kb2MsCkBAIC0xNjg1LDE3ICsxNjg1LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewotCVB5T2JqZWN0ICpydjsKLQlQeVNldE9iamVjdCAqb3RoZXJzZXQ7CisgICAgUHlPYmplY3QgKnJ2OworICAgIFB5U2V0T2JqZWN0ICpvdGhlcnNldDsKIAotCW90aGVyc2V0ID0gKFB5U2V0T2JqZWN0ICopbWFrZV9uZXdfc2V0KFB5X1RZUEUoc28pLCBvdGhlcik7Ci0JaWYgKG90aGVyc2V0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJ2ID0gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShvdGhlcnNldCwgKFB5T2JqZWN0ICopc28pOwotCWlmIChydiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9ERUNSRUYocnYpOwotCXJldHVybiAoUHlPYmplY3QgKilvdGhlcnNldDsKKyAgICBvdGhlcnNldCA9IChQeVNldE9iamVjdCAqKW1ha2VfbmV3X3NldChQeV9UWVBFKHNvKSwgb3RoZXIpOworICAgIGlmIChvdGhlcnNldCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUob3RoZXJzZXQsIChQeU9iamVjdCAqKXNvKTsKKyAgICBpZiAocnYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopb3RoZXJzZXQ7CiB9CiAKIFB5RG9jX1NUUlZBUihzeW1tZXRyaWNfZGlmZmVyZW5jZV9kb2MsCkBAIC0xNzA2LDU2ICsxNzA2LDU2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3hvcihQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlpZiAoIVB5QW55U2V0X0NoZWNrKHNvKSB8fCAhUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JcmV0dXJuIHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZShzbywgb3RoZXIpOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2soc28pIHx8ICFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICByZXR1cm4gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlKHNvLCBvdGhlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaXhvcihQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJlc3VsdCA9IHNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc28sIG90aGVyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5X0lOQ1JFRihzbyk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKXNvOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmVzdWx0ID0gc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzbywgb3RoZXIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfSU5DUkVGKHNvKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopc287CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaXNzdWJzZXQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0Jc2V0ZW50cnkgKmVudHJ5OwotCVB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBzZXRlbnRyeSAqZW50cnk7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCi0JaWYgKCFQeUFueVNldF9DaGVjayhvdGhlcikpIHsKLQkJUHlPYmplY3QgKnRtcCwgKnJlc3VsdDsKLQkJdG1wID0gbWFrZV9uZXdfc2V0KCZQeVNldF9UeXBlLCBvdGhlcik7Ci0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlyZXN1bHQgPSBzZXRfaXNzdWJzZXQoc28sIHRtcCk7Ci0JCVB5X0RFQ1JFRih0bXApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlpZiAoUHlTZXRfR0VUX1NJWkUoc28pID4gUHlTZXRfR0VUX1NJWkUob3RoZXIpKSAKLQkJUHlfUkVUVVJOX0ZBTFNFOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIFB5T2JqZWN0ICp0bXAsICpyZXN1bHQ7CisgICAgICAgIHRtcCA9IG1ha2VfbmV3X3NldCgmUHlTZXRfVHlwZSwgb3RoZXIpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzdWx0ID0gc2V0X2lzc3Vic2V0KHNvLCB0bXApOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgaWYgKFB5U2V0X0dFVF9TSVpFKHNvKSA+IFB5U2V0X0dFVF9TSVpFKG90aGVyKSkKKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogCi0Jd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0JCWludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOwotCQlpZiAocnYgPT0gLTEpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCFydikKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQl9Ci0JUHlfUkVUVVJOX1RSVUU7CisgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7CisgICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOworICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFydikKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CisgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAKIFB5RG9jX1NUUlZBUihpc3N1YnNldF9kb2MsICJSZXBvcnQgd2hldGhlciBhbm90aGVyIHNldCBjb250YWlucyB0aGlzIHNldC4iKTsKQEAgLTE3NjMsMTcgKzE3NjMsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfaXNzdXBlcnNldChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqdG1wLCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICp0bXAsICpyZXN1bHQ7CiAKLQlpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewotCQl0bXAgPSBtYWtlX25ld19zZXQoJlB5U2V0X1R5cGUsIG90aGVyKTsKLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlc3VsdCA9IHNldF9pc3N1cGVyc2V0KHNvLCB0bXApOwotCQlQeV9ERUNSRUYodG1wKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcmV0dXJuIHNldF9pc3N1YnNldCgoUHlTZXRPYmplY3QgKilvdGhlciwgKFB5T2JqZWN0ICopc28pOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpKSB7CisgICAgICAgIHRtcCA9IG1ha2VfbmV3X3NldCgmUHlTZXRfVHlwZSwgb3RoZXIpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzdWx0ID0gc2V0X2lzc3VwZXJzZXQoc28sIHRtcCk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gc2V0X2lzc3Vic2V0KChQeVNldE9iamVjdCAqKW90aGVyLCAoUHlPYmplY3QgKilzbyk7CiB9CiAKIFB5RG9jX1NUUlZBUihpc3N1cGVyc2V0X2RvYywgIlJlcG9ydCB3aGV0aGVyIHRoaXMgc2V0IGNvbnRhaW5zIGFub3RoZXIgc2V0LiIpOwpAQCAtMTc4MSw2NSArMTc4MSw2NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9yaWNoY29tcGFyZShQeVNldE9iamVjdCAqdiwgUHlPYmplY3QgKncsIGludCBvcCkKIHsKLQlQeU9iamVjdCAqcjEsICpyMjsKKyAgICBQeU9iamVjdCAqcjEsICpyMjsKIAotCWlmKCFQeUFueVNldF9DaGVjayh3KSkgewotCQlpZiAob3AgPT0gUHlfRVEpCi0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCWlmIChvcCA9PSBQeV9ORSkKLQkJCVB5X1JFVFVSTl9UUlVFOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2FuIG9ubHkgY29tcGFyZSB0byBhIHNldCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgUHlfRVE6Ci0JCWlmIChQeVNldF9HRVRfU0laRSh2KSAhPSBQeVNldF9HRVRfU0laRSh3KSkKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQkJaWYgKHYtPmhhc2ggIT0gLTEgICYmCi0JCSAgICAoKFB5U2V0T2JqZWN0ICopdyktPmhhc2ggIT0gLTEgJiYKLQkJICAgIHYtPmhhc2ggIT0gKChQeVNldE9iamVjdCAqKXcpLT5oYXNoKQotCQkJUHlfUkVUVVJOX0ZBTFNFOwotCQlyZXR1cm4gc2V0X2lzc3Vic2V0KHYsIHcpOwotCWNhc2UgUHlfTkU6Ci0JCXIxID0gc2V0X3JpY2hjb21wYXJlKHYsIHcsIFB5X0VRKTsKLQkJaWYgKHIxID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJcjIgPSBQeUJvb2xfRnJvbUxvbmcoUHlPYmplY3RfTm90KHIxKSk7Ci0JCVB5X0RFQ1JFRihyMSk7Ci0JCXJldHVybiByMjsKLQljYXNlIFB5X0xFOgotCQlyZXR1cm4gc2V0X2lzc3Vic2V0KHYsIHcpOwotCWNhc2UgUHlfR0U6Ci0JCXJldHVybiBzZXRfaXNzdXBlcnNldCh2LCB3KTsKLQljYXNlIFB5X0xUOgotCQlpZiAoUHlTZXRfR0VUX1NJWkUodikgPj0gUHlTZXRfR0VUX1NJWkUodykpCi0JCQlQeV9SRVRVUk5fRkFMU0U7CQkKLQkJcmV0dXJuIHNldF9pc3N1YnNldCh2LCB3KTsKLQljYXNlIFB5X0dUOgotCQlpZiAoUHlTZXRfR0VUX1NJWkUodikgPD0gUHlTZXRfR0VUX1NJWkUodykpCi0JCQlQeV9SRVRVUk5fRkFMU0U7Ci0JCXJldHVybiBzZXRfaXNzdXBlcnNldCh2LCB3KTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgaWYoIVB5QW55U2V0X0NoZWNrKHcpKSB7CisgICAgICAgIGlmIChvcCA9PSBQeV9FUSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgaWYgKG9wID09IFB5X05FKQorICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYW4gb25seSBjb21wYXJlIHRvIGEgc2V0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBQeV9FUToKKyAgICAgICAgaWYgKFB5U2V0X0dFVF9TSVpFKHYpICE9IFB5U2V0X0dFVF9TSVpFKHcpKQorICAgICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgICAgICBpZiAodi0+aGFzaCAhPSAtMSAgJiYKKyAgICAgICAgICAgICgoUHlTZXRPYmplY3QgKil3KS0+aGFzaCAhPSAtMSAmJgorICAgICAgICAgICAgdi0+aGFzaCAhPSAoKFB5U2V0T2JqZWN0ICopdyktPmhhc2gpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIHJldHVybiBzZXRfaXNzdWJzZXQodiwgdyk7CisgICAgY2FzZSBQeV9ORToKKyAgICAgICAgcjEgPSBzZXRfcmljaGNvbXBhcmUodiwgdywgUHlfRVEpOworICAgICAgICBpZiAocjEgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByMiA9IFB5Qm9vbF9Gcm9tTG9uZyhQeU9iamVjdF9Ob3QocjEpKTsKKyAgICAgICAgUHlfREVDUkVGKHIxKTsKKyAgICAgICAgcmV0dXJuIHIyOworICAgIGNhc2UgUHlfTEU6CisgICAgICAgIHJldHVybiBzZXRfaXNzdWJzZXQodiwgdyk7CisgICAgY2FzZSBQeV9HRToKKyAgICAgICAgcmV0dXJuIHNldF9pc3N1cGVyc2V0KHYsIHcpOworICAgIGNhc2UgUHlfTFQ6CisgICAgICAgIGlmIChQeVNldF9HRVRfU0laRSh2KSA+PSBQeVNldF9HRVRfU0laRSh3KSkKKyAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICAgICAgcmV0dXJuIHNldF9pc3N1YnNldCh2LCB3KTsKKyAgICBjYXNlIFB5X0dUOgorICAgICAgICBpZiAoUHlTZXRfR0VUX1NJWkUodikgPD0gUHlTZXRfR0VUX1NJWkUodykpCisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIHJldHVybiBzZXRfaXNzdXBlcnNldCh2LCB3KTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIHN0YXRpYyBpbnQKIHNldF9ub2NtcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYW5ub3QgY29tcGFyZSBzZXRzIHVzaW5nIGNtcCgpIik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYW5ub3QgY29tcGFyZSBzZXRzIHVzaW5nIGNtcCgpIik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X2FkZChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCiB7Ci0JaWYgKHNldF9hZGRfa2V5KHNvLCBrZXkpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAoc2V0X2FkZF9rZXkoc28sIGtleSkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCi1QeURvY19TVFJWQVIoYWRkX2RvYywgCitQeURvY19TVFJWQVIoYWRkX2RvYywKICJBZGQgYW4gZWxlbWVudCB0byBhIHNldC5cblwKIFxuXAogVGhpcyBoYXMgbm8gZWZmZWN0IGlmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgcHJlc2VudC4iKTsKQEAgLTE4NDcsMzQgKzE4NDcsMzQgQEAKIHN0YXRpYyBpbnQKIHNldF9jb250YWlucyhQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlPYmplY3QgKnRtcGtleTsKLQlpbnQgcnY7CisgICAgUHlPYmplY3QgKnRtcGtleTsKKyAgICBpbnQgcnY7CiAKLQlydiA9IHNldF9jb250YWluc19rZXkoc28sIGtleSk7Ci0JaWYgKHJ2ID09IC0xKSB7Ci0JCWlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotCQkJcmV0dXJuIC0xOwotCQlQeUVycl9DbGVhcigpOwotCQl0bXBrZXkgPSBtYWtlX25ld19zZXQoJlB5RnJvemVuU2V0X1R5cGUsIE5VTEwpOwotCQlpZiAodG1wa2V5ID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCXNldF9zd2FwX2JvZGllcygoUHlTZXRPYmplY3QgKil0bXBrZXksIChQeVNldE9iamVjdCAqKWtleSk7Ci0JCXJ2ID0gc2V0X2NvbnRhaW5zKHNvLCB0bXBrZXkpOwotCQlzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOwotCQlQeV9ERUNSRUYodG1wa2V5KTsKLQl9Ci0JcmV0dXJuIHJ2OworICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2tleShzbywga2V5KTsKKyAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAgaWYgKCFQeVNldF9DaGVjayhrZXkpIHx8ICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHRtcGtleSA9IG1ha2VfbmV3X3NldCgmUHlGcm96ZW5TZXRfVHlwZSwgTlVMTCk7CisgICAgICAgIGlmICh0bXBrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnMoc28sIHRtcGtleSk7CisgICAgICAgIHNldF9zd2FwX2JvZGllcygoUHlTZXRPYmplY3QgKil0bXBrZXksIChQeVNldE9iamVjdCAqKWtleSk7CisgICAgICAgIFB5X0RFQ1JFRih0bXBrZXkpOworICAgIH0KKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZGlyZWN0X2NvbnRhaW5zKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSkKIHsKLQlsb25nIHJlc3VsdDsKKyAgICBsb25nIHJlc3VsdDsKIAotCXJlc3VsdCA9IHNldF9jb250YWlucyhzbywga2V5KTsKLQlpZiAocmVzdWx0ID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gc2V0X2NvbnRhaW5zKHNvLCBrZXkpOworICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KIAogUHlEb2NfU1RSVkFSKGNvbnRhaW5zX2RvYywgInguX19jb250YWluc19fKHkpIDw9PT4geSBpbiB4LiIpOwpAQCAtMTg4MiwzMCArMTg4MiwzMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9yZW1vdmUoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewotCVB5T2JqZWN0ICp0bXBrZXk7Ci0JaW50IHJ2OworICAgIFB5T2JqZWN0ICp0bXBrZXk7CisgICAgaW50IHJ2OwogCi0JcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7Ci0JaWYgKHJ2ID09IC0xKSB7Ci0JCWlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXRtcGtleSA9IG1ha2VfbmV3X3NldCgmUHlGcm96ZW5TZXRfVHlwZSwgTlVMTCk7Ci0JCWlmICh0bXBrZXkgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOwotCQlydiA9IHNldF9kaXNjYXJkX2tleShzbywgdG1wa2V5KTsKLQkJc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKLQkJUHlfREVDUkVGKHRtcGtleSk7Ci0JCWlmIChydiA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCX0gCisgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7CisgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgIGlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHRtcGtleSA9IG1ha2VfbmV3X3NldCgmUHlGcm96ZW5TZXRfVHlwZSwgTlVMTCk7CisgICAgICAgIGlmICh0bXBrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOworICAgICAgICBydiA9IHNldF9kaXNjYXJkX2tleShzbywgdG1wa2V5KTsKKyAgICAgICAgc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKKyAgICAgICAgUHlfREVDUkVGKHRtcGtleSk7CisgICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7Ci0JCXNldF9rZXlfZXJyb3Ioa2V5KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X1JFVFVSTl9OT05FOworICAgIGlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7CisgICAgICAgIHNldF9rZXlfZXJyb3Ioa2V5KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIocmVtb3ZlX2RvYywKQEAgLTE5MTYsNTQgKzE5MTYsNTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfZGlzY2FyZChQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCiB7Ci0JUHlPYmplY3QgKnRtcGtleSwgKnJlc3VsdDsKLQlpbnQgcnY7CisgICAgUHlPYmplY3QgKnRtcGtleSwgKnJlc3VsdDsKKyAgICBpbnQgcnY7CiAKLQlydiA9IHNldF9kaXNjYXJkX2tleShzbywga2V5KTsKLQlpZiAocnYgPT0gLTEpIHsKLQkJaWYgKCFQeVNldF9DaGVjayhrZXkpIHx8ICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJdG1wa2V5ID0gbWFrZV9uZXdfc2V0KCZQeUZyb3plblNldF9UeXBlLCBOVUxMKTsKLQkJaWYgKHRtcGtleSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXNldF9zd2FwX2JvZGllcygoUHlTZXRPYmplY3QgKil0bXBrZXksIChQeVNldE9iamVjdCAqKWtleSk7Ci0JCXJlc3VsdCA9IHNldF9kaXNjYXJkKHNvLCB0bXBrZXkpOwotCQlzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOwotCQlQeV9ERUNSRUYodG1wa2V5KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7CisgICAgaWYgKHJ2ID09IC0xKSB7CisgICAgICAgIGlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHRtcGtleSA9IG1ha2VfbmV3X3NldCgmUHlGcm96ZW5TZXRfVHlwZSwgTlVMTCk7CisgICAgICAgIGlmICh0bXBrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzZXRfc3dhcF9ib2RpZXMoKFB5U2V0T2JqZWN0ICopdG1wa2V5LCAoUHlTZXRPYmplY3QgKilrZXkpOworICAgICAgICByZXN1bHQgPSBzZXRfZGlzY2FyZChzbywgdG1wa2V5KTsKKyAgICAgICAgc2V0X3N3YXBfYm9kaWVzKChQeVNldE9iamVjdCAqKXRtcGtleSwgKFB5U2V0T2JqZWN0ICopa2V5KTsKKyAgICAgICAgUHlfREVDUkVGKHRtcGtleSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZGlzY2FyZF9kb2MsCiAiUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHNldCBpZiBpdCBpcyBhIG1lbWJlci5cblwKIFxuXAotSWYgdGhlIGVsZW1lbnQgaXMgbm90IGEgbWVtYmVyLCBkbyBub3RoaW5nLiIpOyAKK0lmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgZG8gbm90aGluZy4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9yZWR1Y2UoUHlTZXRPYmplY3QgKnNvKQogewotCVB5T2JqZWN0ICprZXlzPU5VTEwsICphcmdzPU5VTEwsICpyZXN1bHQ9TlVMTCwgKmRpY3Q9TlVMTDsKKyAgICBQeU9iamVjdCAqa2V5cz1OVUxMLCAqYXJncz1OVUxMLCAqcmVzdWx0PU5VTEwsICpkaWN0PU5VTEw7CiAKLQlrZXlzID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKXNvKTsKLQlpZiAoa2V5cyA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0JYXJncyA9IFB5VHVwbGVfUGFjaygxLCBrZXlzKTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlnb3RvIGRvbmU7Ci0JZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopc28sICJfX2RpY3RfXyIpOwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJZGljdCA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihkaWN0KTsKLQl9Ci0JcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDMsIFB5X1RZUEUoc28pLCBhcmdzLCBkaWN0KTsKKyAgICBrZXlzID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKXNvKTsKKyAgICBpZiAoa2V5cyA9PSBOVUxMKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBrZXlzKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgZGljdCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoKFB5T2JqZWN0ICopc28sICJfX2RpY3RfXyIpOworICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZGljdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihkaWN0KTsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDMsIFB5X1RZUEUoc28pLCBhcmdzLCBkaWN0KTsKIGRvbmU6Ci0JUHlfWERFQ1JFRihhcmdzKTsKLQlQeV9YREVDUkVGKGtleXMpOwotCVB5X1hERUNSRUYoZGljdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGFyZ3MpOworICAgIFB5X1hERUNSRUYoa2V5cyk7CisgICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIocmVkdWNlX2RvYywgIlJldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcuIik7CkBAIC0xOTcxLDQyICsxOTcxLDQyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc2V0X3NpemVvZihQeVNldE9iamVjdCAqc28pCiB7Ci0JUHlfc3NpemVfdCByZXM7CisgICAgUHlfc3NpemVfdCByZXM7CiAKLQlyZXMgPSBzaXplb2YoUHlTZXRPYmplY3QpOwotCWlmIChzby0+dGFibGUgIT0gc28tPnNtYWxsdGFibGUpCi0JCXJlcyA9IHJlcyArIChzby0+bWFzayArIDEpICogc2l6ZW9mKHNldGVudHJ5KTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKKyAgICByZXMgPSBzaXplb2YoUHlTZXRPYmplY3QpOworICAgIGlmIChzby0+dGFibGUgIT0gc28tPnNtYWxsdGFibGUpCisgICAgICAgIHJlcyA9IHJlcyArIChzby0+bWFzayArIDEpICogc2l6ZW9mKHNldGVudHJ5KTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNpemVvZl9kb2MsICJTLl9fc2l6ZW9mX18oKSAtPiBzaXplIG9mIFMgaW4gbWVtb3J5LCBpbiBieXRlcyIpOwogc3RhdGljIGludAogc2V0X2luaXQoUHlTZXRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IE5VTEw7CiAKLQlpZiAoIVB5QW55U2V0X0NoZWNrKHNlbGYpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5U2V0X0NoZWNrKHNlbGYpICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKLQkJcmV0dXJuIC0xOwotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwgMCwgMSwgJml0ZXJhYmxlKSkKLQkJcmV0dXJuIC0xOwotCXNldF9jbGVhcl9pbnRlcm5hbChzZWxmKTsKLQlzZWxmLT5oYXNoID0gLTE7Ci0JaWYgKGl0ZXJhYmxlID09IE5VTEwpCi0JCXJldHVybiAwOwotCXJldHVybiBzZXRfdXBkYXRlX2ludGVybmFsKHNlbGYsIGl0ZXJhYmxlKTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNlbGYpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKFB5U2V0X0NoZWNrKHNlbGYpICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwgMCwgMSwgJml0ZXJhYmxlKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHNldF9jbGVhcl9pbnRlcm5hbChzZWxmKTsKKyAgICBzZWxmLT5oYXNoID0gLTE7CisgICAgaWYgKGl0ZXJhYmxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzZXRfdXBkYXRlX2ludGVybmFsKHNlbGYsIGl0ZXJhYmxlKTsKIH0KIAogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIHNldF9hc19zZXF1ZW5jZSA9IHsKLQlzZXRfbGVuLAkJCS8qIHNxX2xlbmd0aCAqLwotCTAsCQkJCS8qIHNxX2NvbmNhdCAqLwotCTAsCQkJCS8qIHNxX3JlcGVhdCAqLwotCTAsCQkJCS8qIHNxX2l0ZW0gKi8KLQkwLAkJCQkvKiBzcV9zbGljZSAqLwotCTAsCQkJCS8qIHNxX2Fzc19pdGVtICovCi0JMCwJCQkJLyogc3FfYXNzX3NsaWNlICovCi0JKG9iam9ianByb2Mpc2V0X2NvbnRhaW5zLAkvKiBzcV9jb250YWlucyAqLworICAgIHNldF9sZW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX3JlcGVhdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9zbGljZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2Fzc19pdGVtICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2Mpc2V0X2NvbnRhaW5zLCAgICAgICAgICAgLyogc3FfY29udGFpbnMgKi8KIH07CiAKIC8qIHNldCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMDE5LDg4ICsyMDE5LDg4IEBACiAjZW5kaWYKIAogc3RhdGljIFB5TWV0aG9kRGVmIHNldF9tZXRob2RzW10gPSB7Ci0JeyJhZGQiLAkJKFB5Q0Z1bmN0aW9uKXNldF9hZGQsCQlNRVRIX08sCi0JIGFkZF9kb2N9LAotCXsiY2xlYXIiLAkoUHlDRnVuY3Rpb24pc2V0X2NsZWFyLAkJTUVUSF9OT0FSR1MsCi0JIGNsZWFyX2RvY30sCi0JeyJfX2NvbnRhaW5zX18iLChQeUNGdW5jdGlvbilzZXRfZGlyZWN0X2NvbnRhaW5zLAlNRVRIX08gfCBNRVRIX0NPRVhJU1QsCi0JIGNvbnRhaW5zX2RvY30sCi0JeyJjb3B5IiwJKFB5Q0Z1bmN0aW9uKXNldF9jb3B5LAkJTUVUSF9OT0FSR1MsCi0JIGNvcHlfZG9jfSwKLQl7ImRpc2NhcmQiLAkoUHlDRnVuY3Rpb24pc2V0X2Rpc2NhcmQsCU1FVEhfTywKLQkgZGlzY2FyZF9kb2N9LAotCXsiZGlmZmVyZW5jZSIsCShQeUNGdW5jdGlvbilzZXRfZGlmZmVyZW5jZV9tdWx0aSwJTUVUSF9WQVJBUkdTLAotCSBkaWZmZXJlbmNlX2RvY30sCi0JeyJkaWZmZXJlbmNlX3VwZGF0ZSIsCShQeUNGdW5jdGlvbilzZXRfZGlmZmVyZW5jZV91cGRhdGUsCU1FVEhfVkFSQVJHUywKLQkgZGlmZmVyZW5jZV91cGRhdGVfZG9jfSwKLQl7ImludGVyc2VjdGlvbiIsKFB5Q0Z1bmN0aW9uKXNldF9pbnRlcnNlY3Rpb25fbXVsdGksCU1FVEhfVkFSQVJHUywKLQkgaW50ZXJzZWN0aW9uX2RvY30sCi0JeyJpbnRlcnNlY3Rpb25fdXBkYXRlIiwoUHlDRnVuY3Rpb24pc2V0X2ludGVyc2VjdGlvbl91cGRhdGVfbXVsdGksCU1FVEhfVkFSQVJHUywKLQkgaW50ZXJzZWN0aW9uX3VwZGF0ZV9kb2N9LAotCXsiaXNkaXNqb2ludCIsCShQeUNGdW5jdGlvbilzZXRfaXNkaXNqb2ludCwJTUVUSF9PLAotCSBpc2Rpc2pvaW50X2RvY30sCi0JeyJpc3N1YnNldCIsCShQeUNGdW5jdGlvbilzZXRfaXNzdWJzZXQsCU1FVEhfTywKLQkgaXNzdWJzZXRfZG9jfSwKLQl7Imlzc3VwZXJzZXQiLAkoUHlDRnVuY3Rpb24pc2V0X2lzc3VwZXJzZXQsCU1FVEhfTywKLQkgaXNzdXBlcnNldF9kb2N9LAotCXsicG9wIiwJCShQeUNGdW5jdGlvbilzZXRfcG9wLAkJTUVUSF9OT0FSR1MsCi0JIHBvcF9kb2N9LAotCXsiX19yZWR1Y2VfXyIsCShQeUNGdW5jdGlvbilzZXRfcmVkdWNlLAlNRVRIX05PQVJHUywKLQkgcmVkdWNlX2RvY30sCi0JeyJyZW1vdmUiLAkoUHlDRnVuY3Rpb24pc2V0X3JlbW92ZSwJTUVUSF9PLAotCSByZW1vdmVfZG9jfSwKLQl7Il9fc2l6ZW9mX18iLAkoUHlDRnVuY3Rpb24pc2V0X3NpemVvZiwJTUVUSF9OT0FSR1MsCi0JIHNpemVvZl9kb2N9LAotCXsic3ltbWV0cmljX2RpZmZlcmVuY2UiLChQeUNGdW5jdGlvbilzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UsCU1FVEhfTywKLQkgc3ltbWV0cmljX2RpZmZlcmVuY2VfZG9jfSwKLQl7InN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSIsKFB5Q0Z1bmN0aW9uKXNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUsCU1FVEhfTywKLQkgc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlX2RvY30sCisgICAgeyJhZGQiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2FkZCwgICAgICAgICAgIE1FVEhfTywKKyAgICAgYWRkX2RvY30sCisgICAgeyJjbGVhciIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X2NsZWFyLCAgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICBjbGVhcl9kb2N9LAorICAgIHsiX19jb250YWluc19fIiwoUHlDRnVuY3Rpb24pc2V0X2RpcmVjdF9jb250YWlucywgICAgICAgICAgIE1FVEhfTyB8IE1FVEhfQ09FWElTVCwKKyAgICAgY29udGFpbnNfZG9jfSwKKyAgICB7ImNvcHkiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfY29weSwgICAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIGNvcHlfZG9jfSwKKyAgICB7ImRpc2NhcmQiLCAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfZGlzY2FyZCwgICAgICAgTUVUSF9PLAorICAgICBkaXNjYXJkX2RvY30sCisgICAgeyJkaWZmZXJlbmNlIiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2RpZmZlcmVuY2VfbXVsdGksICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBkaWZmZXJlbmNlX2RvY30sCisgICAgeyJkaWZmZXJlbmNlX3VwZGF0ZSIsICAgICAgIChQeUNGdW5jdGlvbilzZXRfZGlmZmVyZW5jZV91cGRhdGUsICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIGRpZmZlcmVuY2VfdXBkYXRlX2RvY30sCisgICAgeyJpbnRlcnNlY3Rpb24iLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLCAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBpbnRlcnNlY3Rpb25fZG9jfSwKKyAgICB7ImludGVyc2VjdGlvbl91cGRhdGUiLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX3VwZGF0ZV9tdWx0aSwgICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICBpbnRlcnNlY3Rpb25fdXBkYXRlX2RvY30sCisgICAgeyJpc2Rpc2pvaW50IiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lzZGlzam9pbnQsICAgIE1FVEhfTywKKyAgICAgaXNkaXNqb2ludF9kb2N9LAorICAgIHsiaXNzdWJzZXQiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pc3N1YnNldCwgICAgICBNRVRIX08sCisgICAgIGlzc3Vic2V0X2RvY30sCisgICAgeyJpc3N1cGVyc2V0IiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lzc3VwZXJzZXQsICAgIE1FVEhfTywKKyAgICAgaXNzdXBlcnNldF9kb2N9LAorICAgIHsicG9wIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9wb3AsICAgICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgcG9wX2RvY30sCisgICAgeyJfX3JlZHVjZV9fIiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X3JlZHVjZSwgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICByZWR1Y2VfZG9jfSwKKyAgICB7InJlbW92ZSIsICAgICAgICAgIChQeUNGdW5jdGlvbilzZXRfcmVtb3ZlLCAgICAgICAgTUVUSF9PLAorICAgICByZW1vdmVfZG9jfSwKKyAgICB7Il9fc2l6ZW9mX18iLCAgICAgIChQeUNGdW5jdGlvbilzZXRfc2l6ZW9mLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHNpemVvZl9kb2N9LAorICAgIHsic3ltbWV0cmljX2RpZmZlcmVuY2UiLChQeUNGdW5jdGlvbilzZXRfc3ltbWV0cmljX2RpZmZlcmVuY2UsICAgICAgTUVUSF9PLAorICAgICBzeW1tZXRyaWNfZGlmZmVyZW5jZV9kb2N9LAorICAgIHsic3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlIiwoUHlDRnVuY3Rpb24pc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwgICAgICAgIE1FVEhfTywKKyAgICAgc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlX2RvY30sCiAjaWZkZWYgUHlfREVCVUcKLQl7InRlc3RfY19hcGkiLAkoUHlDRnVuY3Rpb24pdGVzdF9jX2FwaSwJTUVUSF9OT0FSR1MsCi0JIHRlc3RfY19hcGlfZG9jfSwKKyAgICB7InRlc3RfY19hcGkiLCAgICAgIChQeUNGdW5jdGlvbil0ZXN0X2NfYXBpLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHRlc3RfY19hcGlfZG9jfSwKICNlbmRpZgotCXsidW5pb24iLAkoUHlDRnVuY3Rpb24pc2V0X3VuaW9uLAkJTUVUSF9WQVJBUkdTLAotCSB1bmlvbl9kb2N9LAotCXsidXBkYXRlIiwJKFB5Q0Z1bmN0aW9uKXNldF91cGRhdGUsCU1FVEhfVkFSQVJHUywKLQkgdXBkYXRlX2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsidW5pb24iLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXNldF91bmlvbiwgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIHVuaW9uX2RvY30sCisgICAgeyJ1cGRhdGUiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3VwZGF0ZSwgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgdXBkYXRlX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIHNldF9hc19udW1iZXIgPSB7Ci0JMCwJCQkJLypuYl9hZGQqLwotCShiaW5hcnlmdW5jKXNldF9zdWIsCQkvKm5iX3N1YnRyYWN0Ki8KLQkwLAkJCQkvKm5iX211bHRpcGx5Ki8KLQkwLAkJCQkvKm5iX2RpdmlkZSovCi0JMCwJCQkJLypuYl9yZW1haW5kZXIqLwotCTAsCQkJCS8qbmJfZGl2bW9kKi8KLQkwLAkJCQkvKm5iX3Bvd2VyKi8KLQkwLAkJCQkvKm5iX25lZ2F0aXZlKi8KLQkwLAkJCQkvKm5iX3Bvc2l0aXZlKi8KLQkwLAkJCQkvKm5iX2Fic29sdXRlKi8KLQkwLAkJCQkvKm5iX25vbnplcm8qLwotCTAsCQkJCS8qbmJfaW52ZXJ0Ki8KLQkwLAkJCQkvKm5iX2xzaGlmdCovCi0JMCwJCQkJLypuYl9yc2hpZnQqLwotCShiaW5hcnlmdW5jKXNldF9hbmQsCQkvKm5iX2FuZCovCi0JKGJpbmFyeWZ1bmMpc2V0X3hvciwJCS8qbmJfeG9yKi8KLQkoYmluYXJ5ZnVuYylzZXRfb3IsCQkvKm5iX29yKi8KLQkwLAkJCQkvKm5iX2NvZXJjZSovCi0JMCwJCQkJLypuYl9pbnQqLwotCTAsCQkJCS8qbmJfbG9uZyovCi0JMCwJCQkJLypuYl9mbG9hdCovCi0JMCwJCQkJLypuYl9vY3QqLwotCTAsIAkJCQkvKm5iX2hleCovCi0JMCwJCQkJLypuYl9pbnBsYWNlX2FkZCovCi0JKGJpbmFyeWZ1bmMpc2V0X2lzdWIsCQkvKm5iX2lucGxhY2Vfc3VidHJhY3QqLwotCTAsCQkJCS8qbmJfaW5wbGFjZV9tdWx0aXBseSovCi0JMCwJCQkJLypuYl9pbnBsYWNlX2RpdmlkZSovCi0JMCwJCQkJLypuYl9pbnBsYWNlX3JlbWFpbmRlciovCi0JMCwJCQkJLypuYl9pbnBsYWNlX3Bvd2VyKi8KLQkwLAkJCQkvKm5iX2lucGxhY2VfbHNoaWZ0Ki8KLQkwLAkJCQkvKm5iX2lucGxhY2VfcnNoaWZ0Ki8KLQkoYmluYXJ5ZnVuYylzZXRfaWFuZCwJCS8qbmJfaW5wbGFjZV9hbmQqLwotCShiaW5hcnlmdW5jKXNldF9peG9yLAkJLypuYl9pbnBsYWNlX3hvciovCi0JKGJpbmFyeWZ1bmMpc2V0X2lvciwJCS8qbmJfaW5wbGFjZV9vciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9hZGQqLworICAgIChiaW5hcnlmdW5jKXNldF9zdWIsICAgICAgICAgICAgICAgIC8qbmJfc3VidHJhY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbXVsdGlwbHkqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfZGl2aWRlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3JlbWFpbmRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9kaXZtb2QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfcG93ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbmVnYXRpdmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfcG9zaXRpdmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfYWJzb2x1dGUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbm9uemVybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnZlcnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbHNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3JzaGlmdCovCisgICAgKGJpbmFyeWZ1bmMpc2V0X2FuZCwgICAgICAgICAgICAgICAgLypuYl9hbmQqLworICAgIChiaW5hcnlmdW5jKXNldF94b3IsICAgICAgICAgICAgICAgIC8qbmJfeG9yKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfb3IsICAgICAgICAgICAgICAgICAvKm5iX29yKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2NvZXJjZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbG9uZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9mbG9hdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9vY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaGV4Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfYWRkKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfaXN1YiwgICAgICAgICAgICAgICAvKm5iX2lucGxhY2Vfc3VidHJhY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW5wbGFjZV9tdWx0aXBseSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX2RpdmlkZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3JlbWFpbmRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9pbnBsYWNlX3Bvd2VyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfbHNoaWZ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfcnNoaWZ0Ki8KKyAgICAoYmluYXJ5ZnVuYylzZXRfaWFuZCwgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfYW5kKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfaXhvciwgICAgICAgICAgICAgICAvKm5iX2lucGxhY2VfeG9yKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfaW9yLCAgICAgICAgICAgICAgICAvKm5iX2lucGxhY2Vfb3IqLwogfTsKIAogUHlEb2NfU1RSVkFSKHNldF9kb2MsCkBAIC0yMTEwLDk2ICsyMTEwLDk2IEBACiBCdWlsZCBhbiB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiB1bmlxdWUgZWxlbWVudHMuIik7CiAKIFB5VHlwZU9iamVjdCBQeVNldF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInNldCIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHlTZXRPYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJLyogdHBfaXRlbXNpemUgKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3Ipc2V0X2RlYWxsb2MsCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKXNldF90cF9wcmludCwJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJLyogdHBfc2V0YXR0ciAqLwotCXNldF9ub2NtcCwJCQkvKiB0cF9jb21wYXJlICovCi0JKHJlcHJmdW5jKXNldF9yZXByLAkJLyogdHBfcmVwciAqLwotCSZzZXRfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCSZzZXRfYXNfc2VxdWVuY2UsCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLAkvKiB0cF9oYXNoICovCi0JMCwJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJLyogdHBfZmxhZ3MgKi8KLQlzZXRfZG9jLAkJCS8qIHRwX2RvYyAqLwotCSh0cmF2ZXJzZXByb2Mpc2V0X3RyYXZlcnNlLAkvKiB0cF90cmF2ZXJzZSAqLwotCShpbnF1aXJ5KXNldF9jbGVhcl9pbnRlcm5hbCwJLyogdHBfY2xlYXIgKi8KLQkocmljaGNtcGZ1bmMpc2V0X3JpY2hjb21wYXJlLAkvKiB0cF9yaWNoY29tcGFyZSAqLwotCW9mZnNldG9mKFB5U2V0T2JqZWN0LCB3ZWFrcmVmbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JKGdldGl0ZXJmdW5jKXNldF9pdGVyLAkvKiB0cF9pdGVyICovCi0JMCwJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzZXRfbWV0aG9kcywJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCShpbml0cHJvYylzZXRfaW5pdCwJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJLyogdHBfYWxsb2MgKi8KLQlzZXRfbmV3LAkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0dDX0RlbCwJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzZXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlTZXRPYmplY3QpLCAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilzZXRfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKHByaW50ZnVuYylzZXRfdHBfcHJpbnQsICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIHNldF9ub2NtcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpc2V0X3JlcHIsICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJnNldF9hc19udW1iZXIsICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJnNldF9hc19zZXF1ZW5jZSwgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKVB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfCBQeV9UUEZMQUdTX0NIRUNLVFlQRVMgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgc2V0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylzZXRfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSlzZXRfY2xlYXJfaW50ZXJuYWwsICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYylzZXRfcmljaGNvbXBhcmUsICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgb2Zmc2V0b2YoUHlTZXRPYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIChnZXRpdGVyZnVuYylzZXRfaXRlciwgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBzZXRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylzZXRfaW5pdCwgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHNldF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIGZyb3plbnNldCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIGZyb3plbnNldF9tZXRob2RzW10gPSB7Ci0JeyJfX2NvbnRhaW5zX18iLChQeUNGdW5jdGlvbilzZXRfZGlyZWN0X2NvbnRhaW5zLAlNRVRIX08gfCBNRVRIX0NPRVhJU1QsCi0JIGNvbnRhaW5zX2RvY30sCi0JeyJjb3B5IiwJKFB5Q0Z1bmN0aW9uKWZyb3plbnNldF9jb3B5LAlNRVRIX05PQVJHUywKLQkgY29weV9kb2N9LAotCXsiZGlmZmVyZW5jZSIsCShQeUNGdW5jdGlvbilzZXRfZGlmZmVyZW5jZV9tdWx0aSwJTUVUSF9WQVJBUkdTLAotCSBkaWZmZXJlbmNlX2RvY30sCi0JeyJpbnRlcnNlY3Rpb24iLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLAlNRVRIX1ZBUkFSR1MsCi0JIGludGVyc2VjdGlvbl9kb2N9LAotCXsiaXNkaXNqb2ludCIsCShQeUNGdW5jdGlvbilzZXRfaXNkaXNqb2ludCwJTUVUSF9PLAotCSBpc2Rpc2pvaW50X2RvY30sCi0JeyJpc3N1YnNldCIsCShQeUNGdW5jdGlvbilzZXRfaXNzdWJzZXQsCU1FVEhfTywKLQkgaXNzdWJzZXRfZG9jfSwKLQl7Imlzc3VwZXJzZXQiLAkoUHlDRnVuY3Rpb24pc2V0X2lzc3VwZXJzZXQsCU1FVEhfTywKLQkgaXNzdXBlcnNldF9kb2N9LAotCXsiX19yZWR1Y2VfXyIsCShQeUNGdW5jdGlvbilzZXRfcmVkdWNlLAlNRVRIX05PQVJHUywKLQkgcmVkdWNlX2RvY30sCi0JeyJfX3NpemVvZl9fIiwJKFB5Q0Z1bmN0aW9uKXNldF9zaXplb2YsCU1FVEhfTk9BUkdTLAotCSBzaXplb2ZfZG9jfSwKLQl7InN5bW1ldHJpY19kaWZmZXJlbmNlIiwoUHlDRnVuY3Rpb24pc2V0X3N5bW1ldHJpY19kaWZmZXJlbmNlLAlNRVRIX08sCi0JIHN5bW1ldHJpY19kaWZmZXJlbmNlX2RvY30sCi0JeyJ1bmlvbiIsCShQeUNGdW5jdGlvbilzZXRfdW5pb24sCQlNRVRIX1ZBUkFSR1MsCi0JIHVuaW9uX2RvY30sCi0Je05VTEwsCQlOVUxMfQkvKiBzZW50aW5lbCAqLworICAgIHsiX19jb250YWluc19fIiwoUHlDRnVuY3Rpb24pc2V0X2RpcmVjdF9jb250YWlucywgICAgICAgICAgIE1FVEhfTyB8IE1FVEhfQ09FWElTVCwKKyAgICAgY29udGFpbnNfZG9jfSwKKyAgICB7ImNvcHkiLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilmcm96ZW5zZXRfY29weSwgICAgTUVUSF9OT0FSR1MsCisgICAgIGNvcHlfZG9jfSwKKyAgICB7ImRpZmZlcmVuY2UiLCAgICAgIChQeUNGdW5jdGlvbilzZXRfZGlmZmVyZW5jZV9tdWx0aSwgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIGRpZmZlcmVuY2VfZG9jfSwKKyAgICB7ImludGVyc2VjdGlvbiIsKFB5Q0Z1bmN0aW9uKXNldF9pbnRlcnNlY3Rpb25fbXVsdGksICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgIGludGVyc2VjdGlvbl9kb2N9LAorICAgIHsiaXNkaXNqb2ludCIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pc2Rpc2pvaW50LCAgICBNRVRIX08sCisgICAgIGlzZGlzam9pbnRfZG9jfSwKKyAgICB7Imlzc3Vic2V0IiwgICAgICAgIChQeUNGdW5jdGlvbilzZXRfaXNzdWJzZXQsICAgICAgTUVUSF9PLAorICAgICBpc3N1YnNldF9kb2N9LAorICAgIHsiaXNzdXBlcnNldCIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9pc3N1cGVyc2V0LCAgICBNRVRIX08sCisgICAgIGlzc3VwZXJzZXRfZG9jfSwKKyAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbilzZXRfcmVkdWNlLCAgICAgICAgTUVUSF9OT0FSR1MsCisgICAgIHJlZHVjZV9kb2N9LAorICAgIHsiX19zaXplb2ZfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKXNldF9zaXplb2YsICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgc2l6ZW9mX2RvY30sCisgICAgeyJzeW1tZXRyaWNfZGlmZmVyZW5jZSIsKFB5Q0Z1bmN0aW9uKXNldF9zeW1tZXRyaWNfZGlmZmVyZW5jZSwgICAgICBNRVRIX08sCisgICAgIHN5bW1ldHJpY19kaWZmZXJlbmNlX2RvY30sCisgICAgeyJ1bmlvbiIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pc2V0X3VuaW9uLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgdW5pb25fZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgZnJvemVuc2V0X2FzX251bWJlciA9IHsKLQkwLAkJCQkvKm5iX2FkZCovCi0JKGJpbmFyeWZ1bmMpc2V0X3N1YiwJCS8qbmJfc3VidHJhY3QqLwotCTAsCQkJCS8qbmJfbXVsdGlwbHkqLwotCTAsCQkJCS8qbmJfZGl2aWRlKi8KLQkwLAkJCQkvKm5iX3JlbWFpbmRlciovCi0JMCwJCQkJLypuYl9kaXZtb2QqLwotCTAsCQkJCS8qbmJfcG93ZXIqLwotCTAsCQkJCS8qbmJfbmVnYXRpdmUqLwotCTAsCQkJCS8qbmJfcG9zaXRpdmUqLwotCTAsCQkJCS8qbmJfYWJzb2x1dGUqLwotCTAsCQkJCS8qbmJfbm9uemVybyovCi0JMCwJCQkJLypuYl9pbnZlcnQqLwotCTAsCQkJCS8qbmJfbHNoaWZ0Ki8KLQkwLAkJCQkvKm5iX3JzaGlmdCovCi0JKGJpbmFyeWZ1bmMpc2V0X2FuZCwJCS8qbmJfYW5kKi8KLQkoYmluYXJ5ZnVuYylzZXRfeG9yLAkJLypuYl94b3IqLwotCShiaW5hcnlmdW5jKXNldF9vciwJCS8qbmJfb3IqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfYWRkKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfc3ViLCAgICAgICAgICAgICAgICAvKm5iX3N1YnRyYWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX211bHRpcGx5Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2RpdmlkZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9yZW1haW5kZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfZGl2bW9kKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3Bvd2VyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX25lZ2F0aXZlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX3Bvc2l0aXZlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2Fic29sdXRlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX25vbnplcm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2xzaGlmdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9yc2hpZnQqLworICAgIChiaW5hcnlmdW5jKXNldF9hbmQsICAgICAgICAgICAgICAgIC8qbmJfYW5kKi8KKyAgICAoYmluYXJ5ZnVuYylzZXRfeG9yLCAgICAgICAgICAgICAgICAvKm5iX3hvciovCisgICAgKGJpbmFyeWZ1bmMpc2V0X29yLCAgICAgICAgICAgICAgICAgLypuYl9vciovCiB9OwogCiBQeURvY19TVFJWQVIoZnJvemVuc2V0X2RvYywKQEAgLTIyMDksNDcgKzIyMDksNDcgQEAKIEJ1aWxkIGFuIGltbXV0YWJsZSB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiB1bmlxdWUgZWxlbWVudHMuIik7CiAKIFB5VHlwZU9iamVjdCBQeUZyb3plblNldF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImZyb3plbnNldCIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihQeVNldE9iamVjdCksCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcilzZXRfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotCShwcmludGZ1bmMpc2V0X3RwX3ByaW50LAkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0Jc2V0X25vY21wLAkJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpc2V0X3JlcHIsCQkvKiB0cF9yZXByICovCi0JJmZyb3plbnNldF9hc19udW1iZXIsCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmc2V0X2FzX3NlcXVlbmNlLAkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JZnJvemVuc2V0X2hhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUsCS8qIHRwX2ZsYWdzICovCi0JZnJvemVuc2V0X2RvYywJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXNldF90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSlzZXRfY2xlYXJfaW50ZXJuYWwsCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKXNldF9yaWNoY29tcGFyZSwJLyogdHBfcmljaGNvbXBhcmUgKi8KLQlvZmZzZXRvZihQeVNldE9iamVjdCwgd2Vha3JlZmxpc3QpLAkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotCShnZXRpdGVyZnVuYylzZXRfaXRlciwJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkvKiB0cF9pdGVybmV4dCAqLwotCWZyb3plbnNldF9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLwotCTAsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkvKiB0cF9pbml0ICovCi0JUHlUeXBlX0dlbmVyaWNBbGxvYywJCS8qIHRwX2FsbG9jICovCi0JZnJvemVuc2V0X25ldywJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsCQkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiZnJvemVuc2V0IiwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKFB5U2V0T2JqZWN0KSwgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3Ipc2V0X2RlYWxsb2MsICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIChwcmludGZ1bmMpc2V0X3RwX3ByaW50LCAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICBzZXRfbm9jbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXNldF9yZXByLCAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICZmcm96ZW5zZXRfYXNfbnVtYmVyLCAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZzZXRfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIGZyb3plbnNldF9oYXNoLCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBmcm96ZW5zZXRfZG9jLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXNldF90cmF2ZXJzZSwgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KXNldF9jbGVhcl9pbnRlcm5hbCwgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgKHJpY2hjbXBmdW5jKXNldF9yaWNoY29tcGFyZSwgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeVNldE9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgKGdldGl0ZXJmdW5jKXNldF9pdGVyLCAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZnJvemVuc2V0X21ldGhvZHMsICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBmcm96ZW5zZXRfbmV3LCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCiAKQEAgLTIyNTgsMjM4ICsyMjU4LDIzOCBAQAogUHlPYmplY3QgKgogUHlTZXRfTmV3KFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKLQlyZXR1cm4gbWFrZV9uZXdfc2V0KCZQeVNldF9UeXBlLCBpdGVyYWJsZSk7CisgICAgcmV0dXJuIG1ha2VfbmV3X3NldCgmUHlTZXRfVHlwZSwgaXRlcmFibGUpOwogfQogCiBQeU9iamVjdCAqCiBQeUZyb3plblNldF9OZXcoUHlPYmplY3QgKml0ZXJhYmxlKQogewotCXJldHVybiBtYWtlX25ld19zZXQoJlB5RnJvemVuU2V0X1R5cGUsIGl0ZXJhYmxlKTsKKyAgICByZXR1cm4gbWFrZV9uZXdfc2V0KCZQeUZyb3plblNldF9UeXBlLCBpdGVyYWJsZSk7CiB9CiAKIFB5X3NzaXplX3QKIFB5U2V0X1NpemUoUHlPYmplY3QgKmFueXNldCkKIHsKLQlpZiAoIVB5QW55U2V0X0NoZWNrKGFueXNldCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIFB5U2V0X0dFVF9TSVpFKGFueXNldCk7CisgICAgaWYgKCFQeUFueVNldF9DaGVjayhhbnlzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBQeVNldF9HRVRfU0laRShhbnlzZXQpOwogfQogCiBpbnQKIFB5U2V0X0NsZWFyKFB5T2JqZWN0ICpzZXQpCiB7Ci0JaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBzZXRfY2xlYXJfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopc2V0KTsKKyAgICBpZiAoIVB5U2V0X0NoZWNrKHNldCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9jbGVhcl9pbnRlcm5hbCgoUHlTZXRPYmplY3QgKilzZXQpOwogfQogCiBpbnQKIFB5U2V0X0NvbnRhaW5zKFB5T2JqZWN0ICphbnlzZXQsIFB5T2JqZWN0ICprZXkpCiB7Ci0JaWYgKCFQeUFueVNldF9DaGVjayhhbnlzZXQpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBzZXRfY29udGFpbnNfa2V5KChQeVNldE9iamVjdCAqKWFueXNldCwga2V5KTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKGFueXNldCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHNldF9jb250YWluc19rZXkoKFB5U2V0T2JqZWN0ICopYW55c2V0LCBrZXkpOwogfQogCiBpbnQKIFB5U2V0X0Rpc2NhcmQoUHlPYmplY3QgKnNldCwgUHlPYmplY3QgKmtleSkKIHsKLQlpZiAoIVB5U2V0X0NoZWNrKHNldCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIHNldF9kaXNjYXJkX2tleSgoUHlTZXRPYmplY3QgKilzZXQsIGtleSk7CisgICAgaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBzZXRfZGlzY2FyZF9rZXkoKFB5U2V0T2JqZWN0ICopc2V0LCBrZXkpOwogfQogCiBpbnQKIFB5U2V0X0FkZChQeU9iamVjdCAqYW55c2V0LCBQeU9iamVjdCAqa2V5KQogewotCWlmICghUHlTZXRfQ2hlY2soYW55c2V0KSAmJiAKLQkgICAgKCFQeUZyb3plblNldF9DaGVjayhhbnlzZXQpIHx8IFB5X1JFRkNOVChhbnlzZXQpICE9IDEpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiBzZXRfYWRkX2tleSgoUHlTZXRPYmplY3QgKilhbnlzZXQsIGtleSk7CisgICAgaWYgKCFQeVNldF9DaGVjayhhbnlzZXQpICYmCisgICAgICAgICghUHlGcm96ZW5TZXRfQ2hlY2soYW55c2V0KSB8fCBQeV9SRUZDTlQoYW55c2V0KSAhPSAxKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc2V0X2FkZF9rZXkoKFB5U2V0T2JqZWN0ICopYW55c2V0LCBrZXkpOwogfQogCiBpbnQKIF9QeVNldF9OZXh0KFB5T2JqZWN0ICpzZXQsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXkpCiB7Ci0Jc2V0ZW50cnkgKmVudHJ5X3B0cjsKKyAgICBzZXRlbnRyeSAqZW50cnlfcHRyOwogCi0JaWYgKCFQeUFueVNldF9DaGVjayhzZXQpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzZXRfbmV4dCgoUHlTZXRPYmplY3QgKilzZXQsIHBvcywgJmVudHJ5X3B0cikgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JKmtleSA9IGVudHJ5X3B0ci0+a2V5OwotCXJldHVybiAxOworICAgIGlmICghUHlBbnlTZXRfQ2hlY2soc2V0KSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopc2V0LCBwb3MsICZlbnRyeV9wdHIpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgICprZXkgPSBlbnRyeV9wdHItPmtleTsKKyAgICByZXR1cm4gMTsKIH0KIAogaW50CiBfUHlTZXRfTmV4dEVudHJ5KFB5T2JqZWN0ICpzZXQsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXksIGxvbmcgKmhhc2gpCiB7Ci0Jc2V0ZW50cnkgKmVudHJ5OworICAgIHNldGVudHJ5ICplbnRyeTsKIAotCWlmICghUHlBbnlTZXRfQ2hlY2soc2V0KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopc2V0LCBwb3MsICZlbnRyeSkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JKmtleSA9IGVudHJ5LT5rZXk7Ci0JKmhhc2ggPSBlbnRyeS0+aGFzaDsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNldCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKXNldCwgcG9zLCAmZW50cnkpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgICprZXkgPSBlbnRyeS0+a2V5OworICAgICpoYXNoID0gZW50cnktPmhhc2g7CisgICAgcmV0dXJuIDE7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U2V0X1BvcChQeU9iamVjdCAqc2V0KQogewotCWlmICghUHlTZXRfQ2hlY2soc2V0KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzZXRfcG9wKChQeVNldE9iamVjdCAqKXNldCk7CisgICAgaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHNldF9wb3AoKFB5U2V0T2JqZWN0ICopc2V0KTsKIH0KIAogaW50CiBfUHlTZXRfVXBkYXRlKFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKLQlpZiAoIVB5U2V0X0NoZWNrKHNldCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIHNldF91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopc2V0LCBpdGVyYWJsZSk7CisgICAgaWYgKCFQeVNldF9DaGVjayhzZXQpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBzZXRfdXBkYXRlX2ludGVybmFsKChQeVNldE9iamVjdCAqKXNldCwgaXRlcmFibGUpOwogfQogCiAjaWZkZWYgUHlfREVCVUcKIAotLyogVGVzdCBjb2RlIHRvIGJlIGNhbGxlZCB3aXRoIGFueSB0aHJlZSBlbGVtZW50IHNldC4gCisvKiBUZXN0IGNvZGUgdG8gYmUgY2FsbGVkIHdpdGggYW55IHRocmVlIGVsZW1lbnQgc2V0LgogICAgUmV0dXJucyBUcnVlIGFuZCBvcmlnaW5hbCBzZXQgaXMgcmVzdG9yZWQuICovCiAKLSNkZWZpbmUgYXNzZXJ0UmFpc2VzKGNhbGxfcmV0dXJuX3ZhbHVlLCBleGNlcHRpb24pCQlcCi0JZG8gewkJCQkJCQlcCi0JCWFzc2VydChjYWxsX3JldHVybl92YWx1ZSk7CQkJXAotCQlhc3NlcnQoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhleGNlcHRpb24pKTsJXAotCQlQeUVycl9DbGVhcigpOwkJCQkJXAotCX0gd2hpbGUoMCkKKyNkZWZpbmUgYXNzZXJ0UmFpc2VzKGNhbGxfcmV0dXJuX3ZhbHVlLCBleGNlcHRpb24pICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NlcnQoY2FsbF9yZXR1cm5fdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXNzZXJ0KFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoZXhjZXB0aW9uKSk7ICAgICAgICAgICAgICBcCisgICAgICAgIFB5RXJyX0NsZWFyKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKIAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfY19hcGkoUHlTZXRPYmplY3QgKnNvKQogewotCVB5X3NzaXplX3QgY291bnQ7Ci0JY2hhciAqczsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKmVsZW09TlVMTCwgKmR1cD1OVUxMLCAqdCwgKmYsICpkdXAyLCAqeDsKLQlQeU9iamVjdCAqb2IgPSAoUHlPYmplY3QgKilzbzsKKyAgICBQeV9zc2l6ZV90IGNvdW50OworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICplbGVtPU5VTEwsICpkdXA9TlVMTCwgKnQsICpmLCAqZHVwMiwgKng7CisgICAgUHlPYmplY3QgKm9iID0gKFB5T2JqZWN0ICopc287CiAKLQkvKiBWZXJpZnkgcHJlY29uZGl0aW9ucyBhbmQgZXhlcmNpc2UgdHlwZS9zaXplIGNoZWNrcyAqLwotCWFzc2VydChQeUFueVNldF9DaGVjayhvYikpOwotCWFzc2VydChQeUFueVNldF9DaGVja0V4YWN0KG9iKSk7Ci0JYXNzZXJ0KCFQeUZyb3plblNldF9DaGVja0V4YWN0KG9iKSk7Ci0JYXNzZXJ0KFB5U2V0X1NpemUob2IpID09IDMpOwotCWFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMyk7CisgICAgLyogVmVyaWZ5IHByZWNvbmRpdGlvbnMgYW5kIGV4ZXJjaXNlIHR5cGUvc2l6ZSBjaGVja3MgKi8KKyAgICBhc3NlcnQoUHlBbnlTZXRfQ2hlY2sob2IpKTsKKyAgICBhc3NlcnQoUHlBbnlTZXRfQ2hlY2tFeGFjdChvYikpOworICAgIGFzc2VydCghUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdChvYikpOworICAgIGFzc2VydChQeVNldF9TaXplKG9iKSA9PSAzKTsKKyAgICBhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDMpOwogCi0JLyogUmFpc2UgVHlwZUVycm9yIGZvciBub24taXRlcmFibGUgY29uc3RydWN0b3IgYXJndW1lbnRzICovCi0JYXNzZXJ0UmFpc2VzKFB5U2V0X05ldyhQeV9Ob25lKSA9PSBOVUxMLCBQeUV4Y19UeXBlRXJyb3IpOwotCWFzc2VydFJhaXNlcyhQeUZyb3plblNldF9OZXcoUHlfTm9uZSkgPT0gTlVMTCwgUHlFeGNfVHlwZUVycm9yKTsKKyAgICAvKiBSYWlzZSBUeXBlRXJyb3IgZm9yIG5vbi1pdGVyYWJsZSBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKi8KKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfTmV3KFB5X05vbmUpID09IE5VTEwsIFB5RXhjX1R5cGVFcnJvcik7CisgICAgYXNzZXJ0UmFpc2VzKFB5RnJvemVuU2V0X05ldyhQeV9Ob25lKSA9PSBOVUxMLCBQeUV4Y19UeXBlRXJyb3IpOwogCi0JLyogUmFpc2UgVHlwZUVycm9yIGZvciB1bmhhc2hhYmxlIGtleSAqLwotCWR1cCA9IFB5U2V0X05ldyhvYik7Ci0JYXNzZXJ0UmFpc2VzKFB5U2V0X0Rpc2NhcmQob2IsIGR1cCkgPT0gLTEsIFB5RXhjX1R5cGVFcnJvcik7Ci0JYXNzZXJ0UmFpc2VzKFB5U2V0X0NvbnRhaW5zKG9iLCBkdXApID09IC0xLCBQeUV4Y19UeXBlRXJyb3IpOwotCWFzc2VydFJhaXNlcyhQeVNldF9BZGQob2IsIGR1cCkgPT0gLTEsIFB5RXhjX1R5cGVFcnJvcik7CisgICAgLyogUmFpc2UgVHlwZUVycm9yIGZvciB1bmhhc2hhYmxlIGtleSAqLworICAgIGR1cCA9IFB5U2V0X05ldyhvYik7CisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X0Rpc2NhcmQob2IsIGR1cCkgPT0gLTEsIFB5RXhjX1R5cGVFcnJvcik7CisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X0NvbnRhaW5zKG9iLCBkdXApID09IC0xLCBQeUV4Y19UeXBlRXJyb3IpOworICAgIGFzc2VydFJhaXNlcyhQeVNldF9BZGQob2IsIGR1cCkgPT0gLTEsIFB5RXhjX1R5cGVFcnJvcik7CiAKLQkvKiBFeGVyY2lzZSBzdWNjZXNzZnVsIHBvcCwgY29udGFpbnMsIGFkZCwgYW5kIGRpc2NhcmQgKi8KLQllbGVtID0gUHlTZXRfUG9wKG9iKTsKLQlhc3NlcnQoUHlTZXRfQ29udGFpbnMob2IsIGVsZW0pID09IDApOwotCWFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMik7Ci0JYXNzZXJ0KFB5U2V0X0FkZChvYiwgZWxlbSkgPT0gMCk7Ci0JYXNzZXJ0KFB5U2V0X0NvbnRhaW5zKG9iLCBlbGVtKSA9PSAxKTsKLQlhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDMpOwotCWFzc2VydChQeVNldF9EaXNjYXJkKG9iLCBlbGVtKSA9PSAxKTsKLQlhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDIpOwotCWFzc2VydChQeVNldF9EaXNjYXJkKG9iLCBlbGVtKSA9PSAwKTsKLQlhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDIpOworICAgIC8qIEV4ZXJjaXNlIHN1Y2Nlc3NmdWwgcG9wLCBjb250YWlucywgYWRkLCBhbmQgZGlzY2FyZCAqLworICAgIGVsZW0gPSBQeVNldF9Qb3Aob2IpOworICAgIGFzc2VydChQeVNldF9Db250YWlucyhvYiwgZWxlbSkgPT0gMCk7CisgICAgYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAyKTsKKyAgICBhc3NlcnQoUHlTZXRfQWRkKG9iLCBlbGVtKSA9PSAwKTsKKyAgICBhc3NlcnQoUHlTZXRfQ29udGFpbnMob2IsIGVsZW0pID09IDEpOworICAgIGFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMyk7CisgICAgYXNzZXJ0KFB5U2V0X0Rpc2NhcmQob2IsIGVsZW0pID09IDEpOworICAgIGFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMik7CisgICAgYXNzZXJ0KFB5U2V0X0Rpc2NhcmQob2IsIGVsZW0pID09IDApOworICAgIGFzc2VydChQeVNldF9HRVRfU0laRShvYikgPT0gMik7CiAKLQkvKiBFeGVyY2lzZSBjbGVhciAqLwotCWR1cDIgPSBQeVNldF9OZXcoZHVwKTsKLQlhc3NlcnQoUHlTZXRfQ2xlYXIoZHVwMikgPT0gMCk7Ci0JYXNzZXJ0KFB5U2V0X1NpemUoZHVwMikgPT0gMCk7Ci0JUHlfREVDUkVGKGR1cDIpOworICAgIC8qIEV4ZXJjaXNlIGNsZWFyICovCisgICAgZHVwMiA9IFB5U2V0X05ldyhkdXApOworICAgIGFzc2VydChQeVNldF9DbGVhcihkdXAyKSA9PSAwKTsKKyAgICBhc3NlcnQoUHlTZXRfU2l6ZShkdXAyKSA9PSAwKTsKKyAgICBQeV9ERUNSRUYoZHVwMik7CiAKLQkvKiBSYWlzZSBTeXN0ZW1FcnJvciBvbiBjbGVhciBvciB1cGRhdGUgb2YgZnJvemVuIHNldCAqLwotCWYgPSBQeUZyb3plblNldF9OZXcoZHVwKTsKLQlhc3NlcnRSYWlzZXMoUHlTZXRfQ2xlYXIoZikgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKLQlhc3NlcnRSYWlzZXMoX1B5U2V0X1VwZGF0ZShmLCBkdXApID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7Ci0JYXNzZXJ0KFB5U2V0X0FkZChmLCBlbGVtKSA9PSAwKTsKLQlQeV9JTkNSRUYoZik7Ci0JYXNzZXJ0UmFpc2VzKFB5U2V0X0FkZChmLCBlbGVtKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOwotCVB5X0RFQ1JFRihmKTsKLQlQeV9ERUNSRUYoZik7CisgICAgLyogUmFpc2UgU3lzdGVtRXJyb3Igb24gY2xlYXIgb3IgdXBkYXRlIG9mIGZyb3plbiBzZXQgKi8KKyAgICBmID0gUHlGcm96ZW5TZXRfTmV3KGR1cCk7CisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X0NsZWFyKGYpID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7CisgICAgYXNzZXJ0UmFpc2VzKF9QeVNldF9VcGRhdGUoZiwgZHVwKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOworICAgIGFzc2VydChQeVNldF9BZGQoZiwgZWxlbSkgPT0gMCk7CisgICAgUHlfSU5DUkVGKGYpOworICAgIGFzc2VydFJhaXNlcyhQeVNldF9BZGQoZiwgZWxlbSkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKKyAgICBQeV9ERUNSRUYoZik7CisgICAgUHlfREVDUkVGKGYpOwogCi0JLyogRXhlcmNpc2UgZGlyZWN0IGl0ZXJhdGlvbiAqLwotCWkgPSAwLCBjb3VudCA9IDA7Ci0Jd2hpbGUgKF9QeVNldF9OZXh0KChQeU9iamVjdCAqKWR1cCwgJmksICZ4KSkgewotCQlzID0gUHlTdHJpbmdfQXNTdHJpbmcoeCk7Ci0JCWFzc2VydChzICYmIChzWzBdID09ICdhJyB8fCBzWzBdID09ICdiJyB8fCBzWzBdID09ICdjJykpOwotCQljb3VudCsrOwotCX0KLQlhc3NlcnQoY291bnQgPT0gMyk7CisgICAgLyogRXhlcmNpc2UgZGlyZWN0IGl0ZXJhdGlvbiAqLworICAgIGkgPSAwLCBjb3VudCA9IDA7CisgICAgd2hpbGUgKF9QeVNldF9OZXh0KChQeU9iamVjdCAqKWR1cCwgJmksICZ4KSkgeworICAgICAgICBzID0gUHlTdHJpbmdfQXNTdHJpbmcoeCk7CisgICAgICAgIGFzc2VydChzICYmIChzWzBdID09ICdhJyB8fCBzWzBdID09ICdiJyB8fCBzWzBdID09ICdjJykpOworICAgICAgICBjb3VudCsrOworICAgIH0KKyAgICBhc3NlcnQoY291bnQgPT0gMyk7CiAKLQkvKiBFeGVyY2lzZSB1cGRhdGVzICovCi0JZHVwMiA9IFB5U2V0X05ldyhOVUxMKTsKLQlhc3NlcnQoX1B5U2V0X1VwZGF0ZShkdXAyLCBkdXApID09IDApOwotCWFzc2VydChQeVNldF9TaXplKGR1cDIpID09IDMpOwotCWFzc2VydChfUHlTZXRfVXBkYXRlKGR1cDIsIGR1cCkgPT0gMCk7Ci0JYXNzZXJ0KFB5U2V0X1NpemUoZHVwMikgPT0gMyk7Ci0JUHlfREVDUkVGKGR1cDIpOworICAgIC8qIEV4ZXJjaXNlIHVwZGF0ZXMgKi8KKyAgICBkdXAyID0gUHlTZXRfTmV3KE5VTEwpOworICAgIGFzc2VydChfUHlTZXRfVXBkYXRlKGR1cDIsIGR1cCkgPT0gMCk7CisgICAgYXNzZXJ0KFB5U2V0X1NpemUoZHVwMikgPT0gMyk7CisgICAgYXNzZXJ0KF9QeVNldF9VcGRhdGUoZHVwMiwgZHVwKSA9PSAwKTsKKyAgICBhc3NlcnQoUHlTZXRfU2l6ZShkdXAyKSA9PSAzKTsKKyAgICBQeV9ERUNSRUYoZHVwMik7CiAKLQkvKiBSYWlzZSBTeXN0ZW1FcnJvciB3aGVuIHNlbGYgYXJndW1lbnQgaXMgbm90IGEgc2V0IG9yIGZyb3plbnNldC4gKi8KLQl0ID0gUHlUdXBsZV9OZXcoMCk7Ci0JYXNzZXJ0UmFpc2VzKFB5U2V0X1NpemUodCkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKLQlhc3NlcnRSYWlzZXMoUHlTZXRfQ29udGFpbnModCwgZWxlbSkgPT0gLTEsIFB5RXhjX1N5c3RlbUVycm9yKTsKLQlQeV9ERUNSRUYodCk7CisgICAgLyogUmFpc2UgU3lzdGVtRXJyb3Igd2hlbiBzZWxmIGFyZ3VtZW50IGlzIG5vdCBhIHNldCBvciBmcm96ZW5zZXQuICovCisgICAgdCA9IFB5VHVwbGVfTmV3KDApOworICAgIGFzc2VydFJhaXNlcyhQeVNldF9TaXplKHQpID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7CisgICAgYXNzZXJ0UmFpc2VzKFB5U2V0X0NvbnRhaW5zKHQsIGVsZW0pID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7CisgICAgUHlfREVDUkVGKHQpOwogCi0JLyogUmFpc2UgU3lzdGVtRXJyb3Igd2hlbiBzZWxmIGFyZ3VtZW50IGlzIG5vdCBhIHNldC4gKi8KLQlmID0gUHlGcm96ZW5TZXRfTmV3KGR1cCk7Ci0JYXNzZXJ0KFB5U2V0X1NpemUoZikgPT0gMyk7Ci0JYXNzZXJ0KFB5RnJvemVuU2V0X0NoZWNrRXhhY3QoZikpOwotCWFzc2VydFJhaXNlcyhQeVNldF9EaXNjYXJkKGYsIGVsZW0pID09IC0xLCBQeUV4Y19TeXN0ZW1FcnJvcik7Ci0JYXNzZXJ0UmFpc2VzKFB5U2V0X1BvcChmKSA9PSBOVUxMLCBQeUV4Y19TeXN0ZW1FcnJvcik7Ci0JUHlfREVDUkVGKGYpOworICAgIC8qIFJhaXNlIFN5c3RlbUVycm9yIHdoZW4gc2VsZiBhcmd1bWVudCBpcyBub3QgYSBzZXQuICovCisgICAgZiA9IFB5RnJvemVuU2V0X05ldyhkdXApOworICAgIGFzc2VydChQeVNldF9TaXplKGYpID09IDMpOworICAgIGFzc2VydChQeUZyb3plblNldF9DaGVja0V4YWN0KGYpKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfRGlzY2FyZChmLCBlbGVtKSA9PSAtMSwgUHlFeGNfU3lzdGVtRXJyb3IpOworICAgIGFzc2VydFJhaXNlcyhQeVNldF9Qb3AoZikgPT0gTlVMTCwgUHlFeGNfU3lzdGVtRXJyb3IpOworICAgIFB5X0RFQ1JFRihmKTsKIAotCS8qIFJhaXNlIEtleUVycm9yIHdoZW4gcG9wcGluZyBmcm9tIGFuIGVtcHR5IHNldCAqLwotCWFzc2VydChQeU51bWJlcl9JblBsYWNlU3VidHJhY3Qob2IsIG9iKSA9PSBvYik7Ci0JUHlfREVDUkVGKG9iKTsKLQlhc3NlcnQoUHlTZXRfR0VUX1NJWkUob2IpID09IDApOwotCWFzc2VydFJhaXNlcyhQeVNldF9Qb3Aob2IpID09IE5VTEwsIFB5RXhjX0tleUVycm9yKTsKKyAgICAvKiBSYWlzZSBLZXlFcnJvciB3aGVuIHBvcHBpbmcgZnJvbSBhbiBlbXB0eSBzZXQgKi8KKyAgICBhc3NlcnQoUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0KG9iLCBvYikgPT0gb2IpOworICAgIFB5X0RFQ1JFRihvYik7CisgICAgYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKG9iKSA9PSAwKTsKKyAgICBhc3NlcnRSYWlzZXMoUHlTZXRfUG9wKG9iKSA9PSBOVUxMLCBQeUV4Y19LZXlFcnJvcik7CiAKLQkvKiBSZXN0b3JlIHRoZSBzZXQgZnJvbSB0aGUgY29weSB1c2luZyB0aGUgUHlOdW1iZXIgQVBJICovCi0JYXNzZXJ0KFB5TnVtYmVyX0luUGxhY2VPcihvYiwgZHVwKSA9PSBvYik7Ci0JUHlfREVDUkVGKG9iKTsKKyAgICAvKiBSZXN0b3JlIHRoZSBzZXQgZnJvbSB0aGUgY29weSB1c2luZyB0aGUgUHlOdW1iZXIgQVBJICovCisgICAgYXNzZXJ0KFB5TnVtYmVyX0luUGxhY2VPcihvYiwgZHVwKSA9PSBvYik7CisgICAgUHlfREVDUkVGKG9iKTsKIAotCS8qIFZlcmlmeSBjb25zdHJ1Y3RvcnMgYWNjZXB0IE5VTEwgYXJndW1lbnRzICovCi0JZiA9IFB5U2V0X05ldyhOVUxMKTsKLQlhc3NlcnQoZiAhPSBOVUxMKTsKLQlhc3NlcnQoUHlTZXRfR0VUX1NJWkUoZikgPT0gMCk7Ci0JUHlfREVDUkVGKGYpOwotCWYgPSBQeUZyb3plblNldF9OZXcoTlVMTCk7Ci0JYXNzZXJ0KGYgIT0gTlVMTCk7Ci0JYXNzZXJ0KFB5RnJvemVuU2V0X0NoZWNrRXhhY3QoZikpOwotCWFzc2VydChQeVNldF9HRVRfU0laRShmKSA9PSAwKTsKLQlQeV9ERUNSRUYoZik7CisgICAgLyogVmVyaWZ5IGNvbnN0cnVjdG9ycyBhY2NlcHQgTlVMTCBhcmd1bWVudHMgKi8KKyAgICBmID0gUHlTZXRfTmV3KE5VTEwpOworICAgIGFzc2VydChmICE9IE5VTEwpOworICAgIGFzc2VydChQeVNldF9HRVRfU0laRShmKSA9PSAwKTsKKyAgICBQeV9ERUNSRUYoZik7CisgICAgZiA9IFB5RnJvemVuU2V0X05ldyhOVUxMKTsKKyAgICBhc3NlcnQoZiAhPSBOVUxMKTsKKyAgICBhc3NlcnQoUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdChmKSk7CisgICAgYXNzZXJ0KFB5U2V0X0dFVF9TSVpFKGYpID09IDApOworICAgIFB5X0RFQ1JFRihmKTsKIAotCVB5X0RFQ1JFRihlbGVtKTsKLQlQeV9ERUNSRUYoZHVwKTsKLQlQeV9SRVRVUk5fVFJVRTsKKyAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgUHlfREVDUkVGKGR1cCk7CisgICAgUHlfUkVUVVJOX1RSVUU7CiB9CiAKICN1bmRlZiBhc3NlcnRSYWlzZXMKZGlmZiAtLWdpdCBhL09iamVjdHMvc2xpY2VvYmplY3QuYyBiL09iamVjdHMvc2xpY2VvYmplY3QuYwppbmRleCAyZWIzOTQxLi5kMWZlMDUyIDEwMDY0NAotLS0gYS9PYmplY3RzL3NsaWNlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9zbGljZW9iamVjdC5jCkBAIC03LDcgKzcsNyBAQAogZm9yIHRoaXMgZmlsZS4KICovCiAKLS8qIAorLyoKIFB5X0VsbGlwc2lzIGVuY29kZXMgdGhlICcuLi4nIHJ1YmJlciBpbmRleCB0b2tlbi4gSXQgaXMgc2ltaWxhciB0bwogdGhlIFB5X05vbmVTdHJ1Y3QgaW4gdGhhdCB0aGVyZSBpcyBubyB3YXkgdG8gY3JlYXRlIG90aGVyIG9iamVjdHMgb2YKIHRoaXMgdHlwZSBhbmQgdGhlcmUgaXMgZXhhY3RseSBvbmUgaW4gZXhpc3RlbmNlLgpAQCAtMTksMzUgKzE5LDM1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZWxsaXBzaXNfcmVwcihQeU9iamVjdCAqb3ApCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIkVsbGlwc2lzIik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIkVsbGlwc2lzIik7CiB9CiAKIFB5VHlwZU9iamVjdCBQeUVsbGlwc2lzX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkiZWxsaXBzaXMiLAkJCS8qIHRwX25hbWUgKi8KLQkwLAkJCQkvKiB0cF9iYXNpY3NpemUgKi8KLQkwLAkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCTAsIC8qbmV2ZXIgY2FsbGVkKi8JCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCWVsbGlwc2lzX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsCQkvKiB0cF9mbGFncyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgImVsbGlwc2lzIiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgLypuZXZlciBjYWxsZWQqLyAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgZWxsaXBzaXNfcmVwciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiB9OwogCiBQeU9iamVjdCBfUHlfRWxsaXBzaXNPYmplY3QgPSB7Ci0JX1B5T2JqZWN0X0VYVFJBX0lOSVQKLQkxLCAmUHlFbGxpcHNpc19UeXBlCisgICAgX1B5T2JqZWN0X0VYVFJBX0lOSVQKKyAgICAxLCAmUHlFbGxpcHNpc19UeXBlCiB9OwogCiAKQEAgLTYwLDE1NCArNjAsMTU0IEBACiBQeU9iamVjdCAqCiBQeVNsaWNlX05ldyhQeU9iamVjdCAqc3RhcnQsIFB5T2JqZWN0ICpzdG9wLCBQeU9iamVjdCAqc3RlcCkKIHsKLQlQeVNsaWNlT2JqZWN0ICpvYmogPSBQeU9iamVjdF9OZXcoUHlTbGljZU9iamVjdCwgJlB5U2xpY2VfVHlwZSk7CisgICAgUHlTbGljZU9iamVjdCAqb2JqID0gUHlPYmplY3RfTmV3KFB5U2xpY2VPYmplY3QsICZQeVNsaWNlX1R5cGUpOwogCi0JaWYgKG9iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHN0ZXAgPT0gTlVMTCkgc3RlcCA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKHN0ZXApOwotCWlmIChzdGFydCA9PSBOVUxMKSBzdGFydCA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKHN0YXJ0KTsKLQlpZiAoc3RvcCA9PSBOVUxMKSBzdG9wID0gUHlfTm9uZTsKLQlQeV9JTkNSRUYoc3RvcCk7CisgICAgaWYgKHN0ZXAgPT0gTlVMTCkgc3RlcCA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKHN0ZXApOworICAgIGlmIChzdGFydCA9PSBOVUxMKSBzdGFydCA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKHN0YXJ0KTsKKyAgICBpZiAoc3RvcCA9PSBOVUxMKSBzdG9wID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoc3RvcCk7CiAKLQlvYmotPnN0ZXAgPSBzdGVwOwotCW9iai0+c3RhcnQgPSBzdGFydDsKLQlvYmotPnN0b3AgPSBzdG9wOworICAgIG9iai0+c3RlcCA9IHN0ZXA7CisgICAgb2JqLT5zdGFydCA9IHN0YXJ0OworICAgIG9iai0+c3RvcCA9IHN0b3A7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9iajsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9iajsKIH0KIAogUHlPYmplY3QgKgogX1B5U2xpY2VfRnJvbUluZGljZXMoUHlfc3NpemVfdCBpc3RhcnQsIFB5X3NzaXplX3QgaXN0b3ApCiB7Ci0JUHlPYmplY3QgKnN0YXJ0LCAqZW5kLCAqc2xpY2U7Ci0Jc3RhcnQgPSBQeUludF9Gcm9tU3NpemVfdChpc3RhcnQpOwotCWlmICghc3RhcnQpCi0JCXJldHVybiBOVUxMOwotCWVuZCA9IFB5SW50X0Zyb21Tc2l6ZV90KGlzdG9wKTsKLQlpZiAoIWVuZCkgewotCQlQeV9ERUNSRUYoc3RhcnQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlPYmplY3QgKnN0YXJ0LCAqZW5kLCAqc2xpY2U7CisgICAgc3RhcnQgPSBQeUludF9Gcm9tU3NpemVfdChpc3RhcnQpOworICAgIGlmICghc3RhcnQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVuZCA9IFB5SW50X0Zyb21Tc2l6ZV90KGlzdG9wKTsKKyAgICBpZiAoIWVuZCkgeworICAgICAgICBQeV9ERUNSRUYoc3RhcnQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzbGljZSA9IFB5U2xpY2VfTmV3KHN0YXJ0LCBlbmQsIE5VTEwpOwotCVB5X0RFQ1JFRihzdGFydCk7Ci0JUHlfREVDUkVGKGVuZCk7Ci0JcmV0dXJuIHNsaWNlOworICAgIHNsaWNlID0gUHlTbGljZV9OZXcoc3RhcnQsIGVuZCwgTlVMTCk7CisgICAgUHlfREVDUkVGKHN0YXJ0KTsKKyAgICBQeV9ERUNSRUYoZW5kKTsKKyAgICByZXR1cm4gc2xpY2U7CiB9CiAKIGludAogUHlTbGljZV9HZXRJbmRpY2VzKFB5U2xpY2VPYmplY3QgKnIsIFB5X3NzaXplX3QgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICpzdG9wLCBQeV9zc2l6ZV90ICpzdGVwKQogewotCS8qIFhYWCBzdXBwb3J0IGxvbmcgaW50cyAqLwotCWlmIChyLT5zdGVwID09IFB5X05vbmUpIHsKLQkJKnN0ZXAgPSAxOwotCX0gZWxzZSB7Ci0JCWlmICghUHlJbnRfQ2hlY2soci0+c3RlcCkgJiYgIVB5TG9uZ19DaGVjayhyLT5zdGVwKSkgcmV0dXJuIC0xOwotCQkqc3RlcCA9IFB5SW50X0FzU3NpemVfdChyLT5zdGVwKTsKLQl9Ci0JaWYgKHItPnN0YXJ0ID09IFB5X05vbmUpIHsKLQkJKnN0YXJ0ID0gKnN0ZXAgPCAwID8gbGVuZ3RoLTEgOiAwOwotCX0gZWxzZSB7Ci0JCWlmICghUHlJbnRfQ2hlY2soci0+c3RhcnQpICYmICFQeUxvbmdfQ2hlY2soci0+c3RlcCkpIHJldHVybiAtMTsKLQkJKnN0YXJ0ID0gUHlJbnRfQXNTc2l6ZV90KHItPnN0YXJ0KTsKLQkJaWYgKCpzdGFydCA8IDApICpzdGFydCArPSBsZW5ndGg7Ci0JfQotCWlmIChyLT5zdG9wID09IFB5X05vbmUpIHsKLQkJKnN0b3AgPSAqc3RlcCA8IDAgPyAtMSA6IGxlbmd0aDsKLQl9IGVsc2UgewotCQlpZiAoIVB5SW50X0NoZWNrKHItPnN0b3ApICYmICFQeUxvbmdfQ2hlY2soci0+c3RlcCkpIHJldHVybiAtMTsKLQkJKnN0b3AgPSBQeUludF9Bc1NzaXplX3Qoci0+c3RvcCk7Ci0JCWlmICgqc3RvcCA8IDApICpzdG9wICs9IGxlbmd0aDsKLQl9Ci0JaWYgKCpzdG9wID4gbGVuZ3RoKSByZXR1cm4gLTE7Ci0JaWYgKCpzdGFydCA+PSBsZW5ndGgpIHJldHVybiAtMTsKLQlpZiAoKnN0ZXAgPT0gMCkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWCBzdXBwb3J0IGxvbmcgaW50cyAqLworICAgIGlmIChyLT5zdGVwID09IFB5X05vbmUpIHsKKyAgICAgICAgKnN0ZXAgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghUHlJbnRfQ2hlY2soci0+c3RlcCkgJiYgIVB5TG9uZ19DaGVjayhyLT5zdGVwKSkgcmV0dXJuIC0xOworICAgICAgICAqc3RlcCA9IFB5SW50X0FzU3NpemVfdChyLT5zdGVwKTsKKyAgICB9CisgICAgaWYgKHItPnN0YXJ0ID09IFB5X05vbmUpIHsKKyAgICAgICAgKnN0YXJ0ID0gKnN0ZXAgPCAwID8gbGVuZ3RoLTEgOiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghUHlJbnRfQ2hlY2soci0+c3RhcnQpICYmICFQeUxvbmdfQ2hlY2soci0+c3RlcCkpIHJldHVybiAtMTsKKyAgICAgICAgKnN0YXJ0ID0gUHlJbnRfQXNTc2l6ZV90KHItPnN0YXJ0KTsKKyAgICAgICAgaWYgKCpzdGFydCA8IDApICpzdGFydCArPSBsZW5ndGg7CisgICAgfQorICAgIGlmIChyLT5zdG9wID09IFB5X05vbmUpIHsKKyAgICAgICAgKnN0b3AgPSAqc3RlcCA8IDAgPyAtMSA6IGxlbmd0aDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIVB5SW50X0NoZWNrKHItPnN0b3ApICYmICFQeUxvbmdfQ2hlY2soci0+c3RlcCkpIHJldHVybiAtMTsKKyAgICAgICAgKnN0b3AgPSBQeUludF9Bc1NzaXplX3Qoci0+c3RvcCk7CisgICAgICAgIGlmICgqc3RvcCA8IDApICpzdG9wICs9IGxlbmd0aDsKKyAgICB9CisgICAgaWYgKCpzdG9wID4gbGVuZ3RoKSByZXR1cm4gLTE7CisgICAgaWYgKCpzdGFydCA+PSBsZW5ndGgpIHJldHVybiAtMTsKKyAgICBpZiAoKnN0ZXAgPT0gMCkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5U2xpY2VfR2V0SW5kaWNlc0V4KFB5U2xpY2VPYmplY3QgKnIsIFB5X3NzaXplX3QgbGVuZ3RoLAotCQkgICAgIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICpzdG9wLCBQeV9zc2l6ZV90ICpzdGVwLCBQeV9zc2l6ZV90ICpzbGljZWxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICpzdG9wLCBQeV9zc2l6ZV90ICpzdGVwLCBQeV9zc2l6ZV90ICpzbGljZWxlbmd0aCkKIHsKLQkvKiB0aGlzIGlzIGhhcmRlciB0byBnZXQgcmlnaHQgdGhhbiB5b3UgbWlnaHQgdGhpbmsgKi8KKyAgICAvKiB0aGlzIGlzIGhhcmRlciB0byBnZXQgcmlnaHQgdGhhbiB5b3UgbWlnaHQgdGhpbmsgKi8KIAotCVB5X3NzaXplX3QgZGVmc3RhcnQsIGRlZnN0b3A7CisgICAgUHlfc3NpemVfdCBkZWZzdGFydCwgZGVmc3RvcDsKIAotCWlmIChyLT5zdGVwID09IFB5X05vbmUpIHsKLQkJKnN0ZXAgPSAxOwotCX0gCi0JZWxzZSB7Ci0JCWlmICghX1B5RXZhbF9TbGljZUluZGV4KHItPnN0ZXAsIHN0ZXApKSByZXR1cm4gLTE7Ci0JCWlmICgqc3RlcCA9PSAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInNsaWNlIHN0ZXAgY2Fubm90IGJlIHplcm8iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICBpZiAoci0+c3RlcCA9PSBQeV9Ob25lKSB7CisgICAgICAgICpzdGVwID0gMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KHItPnN0ZXAsIHN0ZXApKSByZXR1cm4gLTE7CisgICAgICAgIGlmICgqc3RlcCA9PSAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2xpY2Ugc3RlcCBjYW5ub3QgYmUgemVybyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JZGVmc3RhcnQgPSAqc3RlcCA8IDAgPyBsZW5ndGgtMSA6IDA7Ci0JZGVmc3RvcCA9ICpzdGVwIDwgMCA/IC0xIDogbGVuZ3RoOworICAgIGRlZnN0YXJ0ID0gKnN0ZXAgPCAwID8gbGVuZ3RoLTEgOiAwOworICAgIGRlZnN0b3AgPSAqc3RlcCA8IDAgPyAtMSA6IGxlbmd0aDsKIAotCWlmIChyLT5zdGFydCA9PSBQeV9Ob25lKSB7Ci0JCSpzdGFydCA9IGRlZnN0YXJ0OwotCX0KLQllbHNlIHsKLQkJaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgoci0+c3RhcnQsIHN0YXJ0KSkgcmV0dXJuIC0xOwotCQlpZiAoKnN0YXJ0IDwgMCkgKnN0YXJ0ICs9IGxlbmd0aDsKLQkJaWYgKCpzdGFydCA8IDApICpzdGFydCA9ICgqc3RlcCA8IDApID8gLTEgOiAwOwotCQlpZiAoKnN0YXJ0ID49IGxlbmd0aCkgCi0JCQkqc3RhcnQgPSAoKnN0ZXAgPCAwKSA/IGxlbmd0aCAtIDEgOiBsZW5ndGg7Ci0JfQorICAgIGlmIChyLT5zdGFydCA9PSBQeV9Ob25lKSB7CisgICAgICAgICpzdGFydCA9IGRlZnN0YXJ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgoci0+c3RhcnQsIHN0YXJ0KSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoKnN0YXJ0IDwgMCkgKnN0YXJ0ICs9IGxlbmd0aDsKKyAgICAgICAgaWYgKCpzdGFydCA8IDApICpzdGFydCA9ICgqc3RlcCA8IDApID8gLTEgOiAwOworICAgICAgICBpZiAoKnN0YXJ0ID49IGxlbmd0aCkKKyAgICAgICAgICAgICpzdGFydCA9ICgqc3RlcCA8IDApID8gbGVuZ3RoIC0gMSA6IGxlbmd0aDsKKyAgICB9CiAKLQlpZiAoci0+c3RvcCA9PSBQeV9Ob25lKSB7Ci0JCSpzdG9wID0gZGVmc3RvcDsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghX1B5RXZhbF9TbGljZUluZGV4KHItPnN0b3AsIHN0b3ApKSByZXR1cm4gLTE7Ci0JCWlmICgqc3RvcCA8IDApICpzdG9wICs9IGxlbmd0aDsKLQkJaWYgKCpzdG9wIDwgMCkgKnN0b3AgPSAoKnN0ZXAgPCAwKSA/IC0xIDogMDsKLQkJaWYgKCpzdG9wID49IGxlbmd0aCkKLQkJCSpzdG9wID0gKCpzdGVwIDwgMCkgPyBsZW5ndGggLSAxIDogbGVuZ3RoOwotCX0KKyAgICBpZiAoci0+c3RvcCA9PSBQeV9Ob25lKSB7CisgICAgICAgICpzdG9wID0gZGVmc3RvcDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KHItPnN0b3AsIHN0b3ApKSByZXR1cm4gLTE7CisgICAgICAgIGlmICgqc3RvcCA8IDApICpzdG9wICs9IGxlbmd0aDsKKyAgICAgICAgaWYgKCpzdG9wIDwgMCkgKnN0b3AgPSAoKnN0ZXAgPCAwKSA/IC0xIDogMDsKKyAgICAgICAgaWYgKCpzdG9wID49IGxlbmd0aCkKKyAgICAgICAgICAgICpzdG9wID0gKCpzdGVwIDwgMCkgPyBsZW5ndGggLSAxIDogbGVuZ3RoOworICAgIH0KIAotCWlmICgoKnN0ZXAgPCAwICYmICpzdG9wID49ICpzdGFydCkgCi0JICAgIHx8ICgqc3RlcCA+IDAgJiYgKnN0YXJ0ID49ICpzdG9wKSkgewotCQkqc2xpY2VsZW5ndGggPSAwOwotCX0KLQllbHNlIGlmICgqc3RlcCA8IDApIHsKLQkJKnNsaWNlbGVuZ3RoID0gKCpzdG9wLSpzdGFydCsxKS8oKnN0ZXApKzE7Ci0JfQotCWVsc2UgewotCQkqc2xpY2VsZW5ndGggPSAoKnN0b3AtKnN0YXJ0LTEpLygqc3RlcCkrMTsKLQl9CisgICAgaWYgKCgqc3RlcCA8IDAgJiYgKnN0b3AgPj0gKnN0YXJ0KQorICAgICAgICB8fCAoKnN0ZXAgPiAwICYmICpzdGFydCA+PSAqc3RvcCkpIHsKKyAgICAgICAgKnNsaWNlbGVuZ3RoID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoKnN0ZXAgPCAwKSB7CisgICAgICAgICpzbGljZWxlbmd0aCA9ICgqc3RvcC0qc3RhcnQrMSkvKCpzdGVwKSsxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKnNsaWNlbGVuZ3RoID0gKCpzdG9wLSpzdGFydC0xKS8oKnN0ZXApKzE7CisgICAgfQogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbGljZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpzdGFydCwgKnN0b3AsICpzdGVwOworICAgIFB5T2JqZWN0ICpzdGFydCwgKnN0b3AsICpzdGVwOwogCi0Jc3RhcnQgPSBzdG9wID0gc3RlcCA9IE5VTEw7CisgICAgc3RhcnQgPSBzdG9wID0gc3RlcCA9IE5VTEw7CiAKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJzbGljZSgpIiwga3cpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJzbGljZSgpIiwga3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNsaWNlIiwgMSwgMywgJnN0YXJ0LCAmc3RvcCwgJnN0ZXApKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzbGljZSIsIDEsIDMsICZzdGFydCwgJnN0b3AsICZzdGVwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBUaGlzIHN3YXBwaW5nIG9mIHN0b3AgYW5kIHN0YXJ0IGlzIHRvIG1haW50YWluIHNpbWlsYXJpdHkgd2l0aAotCSAgIHJhbmdlKCkuICovCi0JaWYgKHN0b3AgPT0gTlVMTCkgewotCQlzdG9wID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U2xpY2VfTmV3KHN0YXJ0LCBzdG9wLCBzdGVwKTsKKyAgICAvKiBUaGlzIHN3YXBwaW5nIG9mIHN0b3AgYW5kIHN0YXJ0IGlzIHRvIG1haW50YWluIHNpbWlsYXJpdHkgd2l0aAorICAgICAgIHJhbmdlKCkuICovCisgICAgaWYgKHN0b3AgPT0gTlVMTCkgeworICAgICAgICBzdG9wID0gc3RhcnQ7CisgICAgICAgIHN0YXJ0ID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5U2xpY2VfTmV3KHN0YXJ0LCBzdG9wLCBzdGVwKTsKIH0KIAogUHlEb2NfU1RSVkFSKHNsaWNlX2RvYywKQEAgLTIxOCw1MyArMjE4LDUzIEBACiBzdGF0aWMgdm9pZAogc2xpY2VfZGVhbGxvYyhQeVNsaWNlT2JqZWN0ICpyKQogewotCVB5X0RFQ1JFRihyLT5zdGVwKTsKLQlQeV9ERUNSRUYoci0+c3RhcnQpOwotCVB5X0RFQ1JFRihyLT5zdG9wKTsKLQlQeU9iamVjdF9EZWwocik7CisgICAgUHlfREVDUkVGKHItPnN0ZXApOworICAgIFB5X0RFQ1JFRihyLT5zdGFydCk7CisgICAgUHlfREVDUkVGKHItPnN0b3ApOworICAgIFB5T2JqZWN0X0RlbChyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsaWNlX3JlcHIoUHlTbGljZU9iamVjdCAqcikKIHsKLQlQeU9iamVjdCAqcywgKmNvbW1hOworICAgIFB5T2JqZWN0ICpzLCAqY29tbWE7CiAKLQlzID0gUHlTdHJpbmdfRnJvbVN0cmluZygic2xpY2UoIik7Ci0JY29tbWEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIsICIpOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlPYmplY3RfUmVwcihyLT5zdGFydCkpOwotCVB5U3RyaW5nX0NvbmNhdCgmcywgY29tbWEpOwotCVB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlPYmplY3RfUmVwcihyLT5zdG9wKSk7Ci0JUHlTdHJpbmdfQ29uY2F0KCZzLCBjb21tYSk7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeU9iamVjdF9SZXByKHItPnN0ZXApKTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIikiKSk7Ci0JUHlfREVDUkVGKGNvbW1hKTsKLQlyZXR1cm4gczsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZygic2xpY2UoIik7CisgICAgY29tbWEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIsICIpOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlPYmplY3RfUmVwcihyLT5zdGFydCkpOworICAgIFB5U3RyaW5nX0NvbmNhdCgmcywgY29tbWEpOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmcywgUHlPYmplY3RfUmVwcihyLT5zdG9wKSk7CisgICAgUHlTdHJpbmdfQ29uY2F0KCZzLCBjb21tYSk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCBQeU9iamVjdF9SZXByKHItPnN0ZXApKTsKKyAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnMsIFB5U3RyaW5nX0Zyb21TdHJpbmcoIikiKSk7CisgICAgUHlfREVDUkVGKGNvbW1hKTsKKyAgICByZXR1cm4gczsKIH0KIAogc3RhdGljIFB5TWVtYmVyRGVmIHNsaWNlX21lbWJlcnNbXSA9IHsKLQl7InN0YXJ0IiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5U2xpY2VPYmplY3QsIHN0YXJ0KSwgUkVBRE9OTFl9LAotCXsic3RvcCIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVNsaWNlT2JqZWN0LCBzdG9wKSwgUkVBRE9OTFl9LAotCXsic3RlcCIsIFRfT0JKRUNULCBvZmZzZXRvZihQeVNsaWNlT2JqZWN0LCBzdGVwKSwgUkVBRE9OTFl9LAotCXswfQorICAgIHsic3RhcnQiLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlTbGljZU9iamVjdCwgc3RhcnQpLCBSRUFET05MWX0sCisgICAgeyJzdG9wIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5U2xpY2VPYmplY3QsIHN0b3ApLCBSRUFET05MWX0sCisgICAgeyJzdGVwIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5U2xpY2VPYmplY3QsIHN0ZXApLCBSRUFET05MWX0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QqCiBzbGljZV9pbmRpY2VzKFB5U2xpY2VPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBsZW4pCiB7Ci0JUHlfc3NpemVfdCBpbGVuLCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGg7CisgICAgUHlfc3NpemVfdCBpbGVuLCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW5ndGg7CiAKLQlpbGVuID0gUHlOdW1iZXJfQXNTc2l6ZV90KGxlbiwgUHlFeGNfT3ZlcmZsb3dFcnJvcik7CisgICAgaWxlbiA9IFB5TnVtYmVyX0FzU3NpemVfdChsZW4sIFB5RXhjX092ZXJmbG93RXJyb3IpOwogCi0JaWYgKGlsZW4gPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGlsZW4gPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoc2VsZiwgaWxlbiwgJnN0YXJ0LCAmc3RvcCwgCi0JCQkJICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KHNlbGYsIGlsZW4sICZzdGFydCwgJnN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKG5ubikiLCBzdGFydCwgc3RvcCwgc3RlcCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihubm4pIiwgc3RhcnQsIHN0b3AsIHN0ZXApOwogfQogCiBQeURvY19TVFJWQVIoc2xpY2VfaW5kaWNlc19kb2MsCkBAIC0yNzgsODQgKzI3OCw4NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNsaWNlX3JlZHVjZShQeVNsaWNlT2JqZWN0KiBzZWxmKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PTykiLCBQeV9UWVBFKHNlbGYpLCBzZWxmLT5zdGFydCwgc2VsZi0+c3RvcCwgc2VsZi0+c3RlcCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT09PKSIsIFB5X1RZUEUoc2VsZiksIHNlbGYtPnN0YXJ0LCBzZWxmLT5zdG9wLCBzZWxmLT5zdGVwKTsKIH0KIAogUHlEb2NfU1RSVkFSKHJlZHVjZV9kb2MsICJSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgc2xpY2VfbWV0aG9kc1tdID0gewotCXsiaW5kaWNlcyIsCShQeUNGdW5jdGlvbilzbGljZV9pbmRpY2VzLAotCSBNRVRIX08sCXNsaWNlX2luZGljZXNfZG9jfSwKLQl7Il9fcmVkdWNlX18iLAkoUHlDRnVuY3Rpb24pc2xpY2VfcmVkdWNlLAotCSBNRVRIX05PQVJHUywJcmVkdWNlX2RvY30sCi0Je05VTEwsIE5VTEx9CisgICAgeyJpbmRpY2VzIiwgICAgICAgICAoUHlDRnVuY3Rpb24pc2xpY2VfaW5kaWNlcywKKyAgICAgTUVUSF9PLCAgICAgICAgICAgIHNsaWNlX2luZGljZXNfZG9jfSwKKyAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbilzbGljZV9yZWR1Y2UsCisgICAgIE1FVEhfTk9BUkdTLCAgICAgICByZWR1Y2VfZG9jfSwKKyAgICB7TlVMTCwgTlVMTH0KIH07CiAKIHN0YXRpYyBpbnQKIHNsaWNlX2NvbXBhcmUoUHlTbGljZU9iamVjdCAqdiwgUHlTbGljZU9iamVjdCAqdykKIHsKLQlpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKIAotICAgICAgICBpZiAodiA9PSB3KQotCQlyZXR1cm4gMDsKKyAgICBpZiAodiA9PSB3KQorICAgICAgICByZXR1cm4gMDsKIAotCWlmIChQeU9iamVjdF9DbXAodi0+c3RhcnQsIHctPnN0YXJ0LCAmcmVzdWx0KSA8IDApCi0JICAgIHJldHVybiAtMjsKLQlpZiAocmVzdWx0ICE9IDApCi0JCXJldHVybiByZXN1bHQ7Ci0JaWYgKFB5T2JqZWN0X0NtcCh2LT5zdG9wLCB3LT5zdG9wLCAmcmVzdWx0KSA8IDApCi0JICAgIHJldHVybiAtMjsKLQlpZiAocmVzdWx0ICE9IDApCi0JCXJldHVybiByZXN1bHQ7Ci0JaWYgKFB5T2JqZWN0X0NtcCh2LT5zdGVwLCB3LT5zdGVwLCAmcmVzdWx0KSA8IDApCi0JICAgIHJldHVybiAtMjsKLQlyZXR1cm4gcmVzdWx0OworICAgIGlmIChQeU9iamVjdF9DbXAodi0+c3RhcnQsIHctPnN0YXJ0LCAmcmVzdWx0KSA8IDApCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAocmVzdWx0ICE9IDApCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgaWYgKFB5T2JqZWN0X0NtcCh2LT5zdG9wLCB3LT5zdG9wLCAmcmVzdWx0KSA8IDApCisgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAocmVzdWx0ICE9IDApCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgaWYgKFB5T2JqZWN0X0NtcCh2LT5zdGVwLCB3LT5zdGVwLCAmcmVzdWx0KSA8IDApCisgICAgICAgIHJldHVybiAtMjsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgbG9uZwogc2xpY2VfaGFzaChQeVNsaWNlT2JqZWN0ICp2KQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIHR5cGUiKTsKLQlyZXR1cm4gLTFMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIHR5cGUiKTsKKyAgICByZXR1cm4gLTFMOwogfQogCiBQeVR5cGVPYmplY3QgUHlTbGljZV9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInNsaWNlIiwJCS8qIE5hbWUgb2YgdGhpcyB0eXBlICovCi0Jc2l6ZW9mKFB5U2xpY2VPYmplY3QpLAkvKiBCYXNpYyBvYmplY3Qgc2l6ZSAqLwotCTAsCQkJLyogSXRlbSBzaXplIGZvciB2YXJvYmplY3QgKi8KLQkoZGVzdHJ1Y3RvcilzbGljZV9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkoY21wZnVuYylzbGljZV9jb21wYXJlLCAJCS8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpc2xpY2VfcmVwciwgICAJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJICAgIAkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKXNsaWNlX2hhc2gsCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxULAkJCS8qIHRwX2ZsYWdzICovCi0Jc2xpY2VfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXNsaWNlX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQlzbGljZV9tZW1iZXJzLAkJCQkvKiB0cF9tZW1iZXJzICovCi0JMCwJCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCTAsCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlzbGljZV9uZXcsCQkJCS8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCisgICAgInNsaWNlIiwgICAgICAgICAgICAgICAgICAgIC8qIE5hbWUgb2YgdGhpcyB0eXBlICovCisgICAgc2l6ZW9mKFB5U2xpY2VPYmplY3QpLCAgICAgIC8qIEJhc2ljIG9iamVjdCBzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0ZW0gc2l6ZSBmb3IgdmFyb2JqZWN0ICovCisgICAgKGRlc3RydWN0b3Ipc2xpY2VfZGVhbGxvYywgICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIChjbXBmdW5jKXNsaWNlX2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYylzbGljZV9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylzbGljZV9oYXNoLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBzbGljZV9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc2xpY2VfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgc2xpY2VfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHNsaWNlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvZm9ybWF0dGVyLmggYi9PYmplY3RzL3N0cmluZ2xpYi9mb3JtYXR0ZXIuaAppbmRleCBkOGU2NmE2Li5lOTQ5NWM5IDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9mb3JtYXR0ZXIuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9mb3JtYXR0ZXIuaApAQCAtMTMyLDcgKzEzMiw3IEBACiAqLwogc3RhdGljIGludAogcGFyc2VfaW50ZXJuYWxfcmVuZGVyX2Zvcm1hdF9zcGVjKFNUUklOR0xJQl9DSEFSICpmb3JtYXRfc3BlYywKLQkJCQkgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsRm9ybWF0U3BlYyAqZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGVmYXVsdF90eXBlKQogewpAQCAtMTc4LDggKzE3OCw4IEBACiAgICAgLyogSWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzICMsIHdlJ3JlIGluIGFsdGVybmF0ZSBtb2RlLiAgVGhpcyBvbmx5CiAgICAgICAgYXBwbGllcyB0byBpbnRlZ2Vycy4gKi8KICAgICBpZiAoZW5kLXB0ciA+PSAxICYmIHB0clswXSA9PSAnIycpIHsKLQlmb3JtYXQtPmFsdGVybmF0ZSA9IDE7Ci0JKytwdHI7CisgICAgICAgIGZvcm1hdC0+YWx0ZXJuYXRlID0gMTsKKyAgICAgICAgKytwdHI7CiAgICAgfQogCiAgICAgLyogVGhlIHNwZWNpYWwgY2FzZSBmb3IgMC1wYWRkaW5nIChiYWNrd2FyZHMgY29tcGF0KSAqLwpAQCAtMjU5LDggKzI1OSw4IEBACiAgICBhbmQgbW9yZSBlZmZpY2llbnQgZW5vdWdoIHRvIGp1c3RpZnkgYSBsaXR0bGUgb2JmdXNjYXRpb24/ICovCiBzdGF0aWMgdm9pZAogY2FsY19udW1iZXJfd2lkdGhzKE51bWJlckZpZWxkV2lkdGhzICpzcGVjLCBTVFJJTkdMSUJfQ0hBUiBhY3R1YWxfc2lnbiwKLQkJICAgUHlfc3NpemVfdCBuX3ByZWZpeCwgUHlfc3NpemVfdCBuX2RpZ2l0cywKLQkJICAgY29uc3QgSW50ZXJuYWxGb3JtYXRTcGVjICpmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuX3ByZWZpeCwgUHlfc3NpemVfdCBuX2RpZ2l0cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRlcm5hbEZvcm1hdFNwZWMgKmZvcm1hdCkKIHsKICAgICBzcGVjLT5uX2xwYWRkaW5nID0gMDsKICAgICBzcGVjLT5uX3ByZWZpeCA9IDA7CkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICBlbHNlIHsKICAgICAgICAgLyogc2VlIGlmIGFueSBwYWRkaW5nIGlzIG5lZWRlZCAqLwogICAgICAgICBpZiAoc3BlYy0+bl9sc2lnbiArIG5fZGlnaXRzICsgc3BlYy0+bl9yc2lnbiArCi0JICAgICAgICBzcGVjLT5uX3ByZWZpeCA+PSBmb3JtYXQtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgc3BlYy0+bl9wcmVmaXggPj0gZm9ybWF0LT53aWR0aCkgewogICAgICAgICAgICAgLyogbm8gcGFkZGluZyBuZWVkZWQsIHdlJ3JlIGFscmVhZHkgYmlnZ2VyIHRoYW4gdGhlCiAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgd2lkdGggKi8KICAgICAgICAgfQpAQCAtMzM1LDggKzMzNSw4IEBACiAgICAgICAgICAgICAvKiBkZXRlcm1pbmUgd2hpY2ggb2YgbGVmdCwgc3BhY2UsIG9yIHJpZ2h0IHBhZGRpbmcgaXMKICAgICAgICAgICAgICAgIG5lZWRlZCAqLwogICAgICAgICAgICAgUHlfc3NpemVfdCBwYWRkaW5nID0gZm9ybWF0LT53aWR0aCAtCi0JCSAgICAgICAgICAgICAgICAgICAgKHNwZWMtPm5fbHNpZ24gKyBzcGVjLT5uX3ByZWZpeCArCi0JCQkJICAgICBuX2RpZ2l0cyArIHNwZWMtPm5fcnNpZ24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwZWMtPm5fbHNpZ24gKyBzcGVjLT5uX3ByZWZpeCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9kaWdpdHMgKyBzcGVjLT5uX3JzaWduKTsKICAgICAgICAgICAgIGlmIChmb3JtYXQtPmFsaWduID09ICc8JykKICAgICAgICAgICAgICAgICBzcGVjLT5uX3JwYWRkaW5nID0gcGFkZGluZzsKICAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1hdC0+YWxpZ24gPT0gJz4nKQpAQCAtMzUyLDcgKzM1Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgc3BlYy0+bl90b3RhbCA9IHNwZWMtPm5fbHBhZGRpbmcgKyBzcGVjLT5uX2xzaWduICsgc3BlYy0+bl9wcmVmaXggKwotCSAgICBzcGVjLT5uX3NwYWRkaW5nICsgbl9kaWdpdHMgKyBzcGVjLT5uX3JzaWduICsgc3BlYy0+bl9ycGFkZGluZzsKKyAgICAgICAgICAgIHNwZWMtPm5fc3BhZGRpbmcgKyBuX2RpZ2l0cyArIHNwZWMtPm5fcnNpZ24gKyBzcGVjLT5uX3JwYWRkaW5nOwogfQogCiAvKiBmaWxsIGluIHRoZSBub24tZGlnaXQgcGFydHMgb2YgYSBudW1iZXJzJ3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uLApAQCAtMzYwLDggKzM2MCw4IEBACiAgICB3aGVyZSB0aGUgZGlnaXRzIGdvLiAqLwogc3RhdGljIFNUUklOR0xJQl9DSEFSICoKIGZpbGxfbm9uX2RpZ2l0cyhTVFJJTkdMSUJfQ0hBUiAqcF9idWYsIGNvbnN0IE51bWJlckZpZWxkV2lkdGhzICpzcGVjLAotCQlTVFJJTkdMSUJfQ0hBUiAqcHJlZml4LCBQeV9zc2l6ZV90IG5fZGlnaXRzLAotCQlTVFJJTkdMSUJfQ0hBUiBmaWxsX2NoYXIpCisgICAgICAgICAgICAgICAgU1RSSU5HTElCX0NIQVIgKnByZWZpeCwgUHlfc3NpemVfdCBuX2RpZ2l0cywKKyAgICAgICAgICAgICAgICBTVFJJTkdMSUJfQ0hBUiBmaWxsX2NoYXIpCiB7CiAgICAgU1RSSU5HTElCX0NIQVIgKnBfZGlnaXRzOwogCkBAIC0zNzMsMTAgKzM3MywxMCBAQAogICAgICAgICAqcF9idWYrKyA9IHNwZWMtPmxzaWduOwogICAgIH0KICAgICBpZiAoc3BlYy0+bl9wcmVmaXgpIHsKLQltZW1tb3ZlKHBfYnVmLAotCQlwcmVmaXgsCi0JCXNwZWMtPm5fcHJlZml4ICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7Ci0JcF9idWYgKz0gc3BlYy0+bl9wcmVmaXg7CisgICAgICAgIG1lbW1vdmUocF9idWYsCisgICAgICAgICAgICAgICAgcHJlZml4LAorICAgICAgICAgICAgICAgIHNwZWMtPm5fcHJlZml4ICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7CisgICAgICAgIHBfYnVmICs9IHNwZWMtPm5fcHJlZml4OwogICAgIH0KICAgICBpZiAoc3BlYy0+bl9zcGFkZGluZykgewogICAgICAgICBTVFJJTkdMSUJfRklMTChwX2J1ZiwgZmlsbF9jaGFyLCBzcGVjLT5uX3NwYWRkaW5nKTsKQEAgLTQyMCw3ICs0MjAsNyBAQAogICAgIGlmIChmb3JtYXQtPmFsdGVybmF0ZSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJBbHRlcm5hdGUgZm9ybSAoIykgbm90IGFsbG93ZWQgaW4gc3RyaW5nIGZvcm1hdCAiCi0JCQkic3BlY2lmaWVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAic3BlY2lmaWVyIik7CiAgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAKQEAgLTUwNCw3ICs1MDQsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybWF0X2ludF9vcl9sb25nX2ludGVybmFsKFB5T2JqZWN0ICp2YWx1ZSwgY29uc3QgSW50ZXJuYWxGb3JtYXRTcGVjICpmb3JtYXQsCi0JCQkgICAgSW50T3JMb25nVG9TdHJpbmcgdG9zdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50T3JMb25nVG9TdHJpbmcgdG9zdHJpbmcpCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnRtcCA9IE5VTEw7CkBAIC01MTYsOCArNTE2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKi8KICAgICBQeV9zc2l6ZV90IG5fbGVhZGluZ19jaGFyczsKICAgICBQeV9zc2l6ZV90IG5fZ3JvdXBpbmdfY2hhcnMgPSAwOyAvKiBDb3VudCBvZiBhZGRpdGlvbmFsIGNoYXJzIHRvCi0JCQkJCWFsbG9jYXRlLCB1c2VkIGZvciAnbicKLQkJCQkJZm9ybWF0dGluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZSwgdXNlZCBmb3IgJ24nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZy4gKi8KICAgICBQeV9zc2l6ZV90IG5fcHJlZml4ID0gMDsgICAvKiBDb3VudCBvZiBwcmVmaXggY2hhcnMsIChlLmcuLCAnMHgnKSAqLwogICAgIFNUUklOR0xJQl9DSEFSICpwcmVmaXggPSBOVUxMOwogICAgIE51bWJlckZpZWxkV2lkdGhzIHNwZWM7CkBAIC01NjIsMzEgKzU2MiwzMSBAQAogICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICB9CiAjZW5kaWYKLQludW1lcmljX2NoYXIgPSAoU1RSSU5HTElCX0NIQVIpeDsKLQlwbnVtZXJpY19jaGFycyA9ICZudW1lcmljX2NoYXI7CisgICAgICAgIG51bWVyaWNfY2hhciA9IChTVFJJTkdMSUJfQ0hBUil4OworICAgICAgICBwbnVtZXJpY19jaGFycyA9ICZudW1lcmljX2NoYXI7CiAgICAgICAgIG5fZGlnaXRzID0gMTsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIGludCBiYXNlOwotCWludCBsZWFkaW5nX2NoYXJzX3RvX3NraXAgPSAwOyAgLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgYWRkZWQgYnkKLQkJCQkgICAgICAgICAgIFB5TnVtYmVyX1RvQmFzZSB0aGF0IHdlIHdhbnQgdG8KLQkJCQkgICAgICAgICAgIHNraXAgb3Zlci4gKi8KKyAgICAgICAgaW50IGxlYWRpbmdfY2hhcnNfdG9fc2tpcCA9IDA7ICAvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyBhZGRlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TnVtYmVyX1RvQmFzZSB0aGF0IHdlIHdhbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIG92ZXIuICovCiAKICAgICAgICAgLyogQ29tcHV0ZSB0aGUgYmFzZSBhbmQgaG93IG1hbnkgY2hhcmFjdGVycyB3aWxsIGJlIGFkZGVkIGJ5CiAgICAgICAgICAgIFB5TnVtYmVyX1RvQmFzZSAqLwogICAgICAgICBzd2l0Y2ggKGZvcm1hdC0+dHlwZSkgewogICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgIGJhc2UgPSAyOwotCSAgICBsZWFkaW5nX2NoYXJzX3RvX3NraXAgPSAyOyAvKiAwYiAqLworICAgICAgICAgICAgbGVhZGluZ19jaGFyc190b19za2lwID0gMjsgLyogMGIgKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgIGJhc2UgPSA4OwotCSAgICBsZWFkaW5nX2NoYXJzX3RvX3NraXAgPSAyOyAvKiAwbyAqLworICAgICAgICAgICAgbGVhZGluZ19jaGFyc190b19za2lwID0gMjsgLyogMG8gKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICd4JzoKICAgICAgICAgY2FzZSAnWCc6CiAgICAgICAgICAgICBiYXNlID0gMTY7Ci0JICAgIGxlYWRpbmdfY2hhcnNfdG9fc2tpcCA9IDI7IC8qIDB4ICovCisgICAgICAgICAgICBsZWFkaW5nX2NoYXJzX3RvX3NraXAgPSAyOyAvKiAweCAqLwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6ICAvKiBzaG91bGRuJ3QgYmUgbmVlZGVkLCBidXQgc3RvcHMgYSBjb21waWxlciB3YXJuaW5nICovCiAgICAgICAgIGNhc2UgJ2QnOgpAQCAtNTk1LDUyICs1OTUsNTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLQkvKiBUaGUgbnVtYmVyIG9mIHByZWZpeCBjaGFycyBpcyB0aGUgc2FtZSBhcyB0aGUgbGVhZGluZwotCSAgIGNoYXJzIHRvIHNraXAgKi8KLQlpZiAoZm9ybWF0LT5hbHRlcm5hdGUpCi0JICAgIG5fcHJlZml4ID0gbGVhZGluZ19jaGFyc190b19za2lwOworICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHByZWZpeCBjaGFycyBpcyB0aGUgc2FtZSBhcyB0aGUgbGVhZGluZworICAgICAgICAgICBjaGFycyB0byBza2lwICovCisgICAgICAgIGlmIChmb3JtYXQtPmFsdGVybmF0ZSkKKyAgICAgICAgICAgIG5fcHJlZml4ID0gbGVhZGluZ19jaGFyc190b19za2lwOwogCiAgICAgICAgIC8qIERvIHRoZSBoYXJkIHBhcnQsIGNvbnZlcnRpbmcgdG8gYSBzdHJpbmcgaW4gYSBnaXZlbiBiYXNlICovCi0JdG1wID0gdG9zdHJpbmcodmFsdWUsIGJhc2UpOworICAgICAgICB0bXAgPSB0b3N0cmluZyh2YWx1ZSwgYmFzZSk7CiAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gZG9uZTsKIAotCXBudW1lcmljX2NoYXJzID0gU1RSSU5HTElCX1NUUih0bXApOworICAgICAgICBwbnVtZXJpY19jaGFycyA9IFNUUklOR0xJQl9TVFIodG1wKTsKICAgICAgICAgbl9kaWdpdHMgPSBTVFJJTkdMSUJfTEVOKHRtcCk7CiAKLQlwcmVmaXggPSBwbnVtZXJpY19jaGFyczsKKyAgICAgICAgcHJlZml4ID0gcG51bWVyaWNfY2hhcnM7CiAKLQkvKiBSZW1lbWJlciBub3QgdG8gbW9kaWZ5IHdoYXQgcG51bWVyaWNfY2hhcnMgcG9pbnRzIHRvLiAgaXQKLQkgICBtaWdodCBiZSBpbnRlcm5lZC4gIE9ubHkgbW9kaWZ5IGl0IGFmdGVyIHdlIGNvcHkgaXQgaW50byBhCi0JICAgbmV3bHkgYWxsb2NhdGVkIG91dHB1dCBidWZmZXIuICovCisgICAgICAgIC8qIFJlbWVtYmVyIG5vdCB0byBtb2RpZnkgd2hhdCBwbnVtZXJpY19jaGFycyBwb2ludHMgdG8uICBpdAorICAgICAgICAgICBtaWdodCBiZSBpbnRlcm5lZC4gIE9ubHkgbW9kaWZ5IGl0IGFmdGVyIHdlIGNvcHkgaXQgaW50byBhCisgICAgICAgICAgIG5ld2x5IGFsbG9jYXRlZCBvdXRwdXQgYnVmZmVyLiAqLwogCiAgICAgICAgIC8qIElzIGEgc2lnbiBjaGFyYWN0ZXIgcHJlc2VudCBpbiB0aGUgb3V0cHV0PyAgSWYgc28sIHJlbWVtYmVyIGl0CiAgICAgICAgICAgIGFuZCBza2lwIGl0ICovCiAgICAgICAgIHNpZ24gPSBwbnVtZXJpY19jaGFyc1swXTsKICAgICAgICAgaWYgKHNpZ24gPT0gJy0nKSB7Ci0JICAgICsrcHJlZml4OwotCSAgICArK2xlYWRpbmdfY2hhcnNfdG9fc2tpcDsKKyAgICAgICAgICAgICsrcHJlZml4OworICAgICAgICAgICAgKytsZWFkaW5nX2NoYXJzX3RvX3NraXA7CiAgICAgICAgIH0KIAotCS8qIFNraXAgb3ZlciB0aGUgbGVhZGluZyBjaGFycyAoMHgsIDBiLCBldGMuKSAqLwotCW5fZGlnaXRzIC09IGxlYWRpbmdfY2hhcnNfdG9fc2tpcDsKLQlwbnVtZXJpY19jaGFycyArPSBsZWFkaW5nX2NoYXJzX3RvX3NraXA7CisgICAgICAgIC8qIFNraXAgb3ZlciB0aGUgbGVhZGluZyBjaGFycyAoMHgsIDBiLCBldGMuKSAqLworICAgICAgICBuX2RpZ2l0cyAtPSBsZWFkaW5nX2NoYXJzX3RvX3NraXA7CisgICAgICAgIHBudW1lcmljX2NoYXJzICs9IGxlYWRpbmdfY2hhcnNfdG9fc2tpcDsKICAgICB9CiAKICAgICBpZiAoZm9ybWF0LT50eXBlID09ICduJykKLQkgICAgLyogQ29tcHV0ZSBob3cgbWFueSBhZGRpdGlvbmFsIGNoYXJzIHdlIG5lZWQgdG8gYWxsb2NhdGUKLQkgICAgICAgdG8gaG9sZCB0aGUgdGhvdXNhbmRzIGdyb3VwaW5nLiAqLwotCSAgICBTVFJJTkdMSUJfR1JPVVBJTkcoTlVMTCwgbl9kaWdpdHMsIG5fZGlnaXRzLAotCQkJICAgICAgIDAsICZuX2dyb3VwaW5nX2NoYXJzLCAwKTsKKyAgICAgICAgICAgIC8qIENvbXB1dGUgaG93IG1hbnkgYWRkaXRpb25hbCBjaGFycyB3ZSBuZWVkIHRvIGFsbG9jYXRlCisgICAgICAgICAgICAgICB0byBob2xkIHRoZSB0aG91c2FuZHMgZ3JvdXBpbmcuICovCisgICAgICAgICAgICBTVFJJTkdMSUJfR1JPVVBJTkcoTlVMTCwgbl9kaWdpdHMsIG5fZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZuX2dyb3VwaW5nX2NoYXJzLCAwKTsKIAogICAgIC8qIENhbGN1bGF0ZSB0aGUgd2lkdGhzIG9mIHRoZSB2YXJpb3VzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHBhcnRzICovCiAgICAgY2FsY19udW1iZXJfd2lkdGhzKCZzcGVjLCBzaWduLCBuX3ByZWZpeCwgbl9kaWdpdHMgKyBuX2dyb3VwaW5nX2NoYXJzLAotCQkgICAgICAgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKIAogICAgIC8qIEFsbG9jYXRlIGEgbmV3IHN0cmluZyB0byBob2xkIHRoZSByZXN1bHQgKi8KICAgICByZXN1bHQgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIHNwZWMubl90b3RhbCk7CiAgICAgaWYgKCFyZXN1bHQpCi0JZ290byBkb25lOworICAgICAgICBnb3RvIGRvbmU7CiAgICAgcCA9IFNUUklOR0xJQl9TVFIocmVzdWx0KTsKIAogICAgIC8qIFhYWCBUaGVyZSBpcyB0b28gbXVjaCBtYWdpYyBoZXJlIHJlZ2FyZGluZyB0aGUgaW50ZXJuYWxzIG9mCkBAIC02NTEsNDQgKzY1MSw0NCBAQAogCiAgICAgLyogRmlsbCBpbiB0aGUgZGlnaXQgcGFydHMgKi8KICAgICBuX2xlYWRpbmdfY2hhcnMgPSBzcGVjLm5fbHBhZGRpbmcgKyBzcGVjLm5fbHNpZ24gKwotCSAgICBzcGVjLm5fcHJlZml4ICsgc3BlYy5uX3NwYWRkaW5nOworICAgICAgICAgICAgc3BlYy5uX3ByZWZpeCArIHNwZWMubl9zcGFkZGluZzsKICAgICBtZW1tb3ZlKHAgKyBuX2xlYWRpbmdfY2hhcnMsCi0JICAgIHBudW1lcmljX2NoYXJzLAotCSAgICBuX2RpZ2l0cyAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOworICAgICAgICAgICAgcG51bWVyaWNfY2hhcnMsCisgICAgICAgICAgICBuX2RpZ2l0cyAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOwogCiAgICAgLyogSWYgdHlwZSBpcyAnWCcsIGNvbnZlcnQgdGhlIGZpbGxlZCBpbiBkaWdpdHMgdG8gdXBwZXJjYXNlICovCiAgICAgaWYgKGZvcm1hdC0+dHlwZSA9PSAnWCcpIHsKLQlQeV9zc2l6ZV90IHQ7Ci0JZm9yICh0ID0gMDsgdCA8IG5fZGlnaXRzOyArK3QpCi0JICAgIHBbdCArIG5fbGVhZGluZ19jaGFyc10gPSBTVFJJTkdMSUJfVE9VUFBFUihwW3QgKyBuX2xlYWRpbmdfY2hhcnNdKTsKKyAgICAgICAgUHlfc3NpemVfdCB0OworICAgICAgICBmb3IgKHQgPSAwOyB0IDwgbl9kaWdpdHM7ICsrdCkKKyAgICAgICAgICAgIHBbdCArIG5fbGVhZGluZ19jaGFyc10gPSBTVFJJTkdMSUJfVE9VUFBFUihwW3QgKyBuX2xlYWRpbmdfY2hhcnNdKTsKICAgICB9CiAKICAgICAvKiBJbnNlcnQgdGhlIGdyb3VwaW5nLCBpZiBhbnksIGFmdGVyIHRoZSB1cHBlcmNhc2luZyBvZiB0aGUgZGlnaXRzLCBzbwogICAgICAgIHdlIGNhbiBlbnN1cmUgdGhhdCBncm91cGluZyBjaGFycyB3b24ndCBiZSBhZmZlY3RlZC4gKi8KICAgICBpZiAobl9ncm91cGluZ19jaGFycykgewotCSAgICAvKiBXZSBrbm93IHRoaXMgY2FuJ3QgZmFpbCwgc2luY2Ugd2UndmUgYWxyZWFkeQotCSAgICAgICByZXNlcnZlZCBlbm91Z2ggc3BhY2UuICovCi0JICAgIFNUUklOR0xJQl9DSEFSICpwc3RhcnQgPSBwICsgbl9sZWFkaW5nX2NoYXJzOworICAgICAgICAgICAgLyogV2Uga25vdyB0aGlzIGNhbid0IGZhaWwsIHNpbmNlIHdlJ3ZlIGFscmVhZHkKKyAgICAgICAgICAgICAgIHJlc2VydmVkIGVub3VnaCBzcGFjZS4gKi8KKyAgICAgICAgICAgIFNUUklOR0xJQl9DSEFSICpwc3RhcnQgPSBwICsgbl9sZWFkaW5nX2NoYXJzOwogI2lmbmRlZiBOREVCVUcKLQkgICAgaW50IHIgPQorICAgICAgICAgICAgaW50IHIgPQogI2VuZGlmCi0JCVNUUklOR0xJQl9HUk9VUElORyhwc3RhcnQsIG5fZGlnaXRzLCBuX2RpZ2l0cywKLQkJCSAgIHNwZWMubl90b3RhbCtuX2dyb3VwaW5nX2NoYXJzLW5fbGVhZGluZ19jaGFycywKLQkJCSAgIE5VTEwsIDApOwotCSAgICBhc3NlcnQocik7CisgICAgICAgICAgICAgICAgU1RSSU5HTElCX0dST1VQSU5HKHBzdGFydCwgbl9kaWdpdHMsIG5fZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy5uX3RvdGFsK25fZ3JvdXBpbmdfY2hhcnMtbl9sZWFkaW5nX2NoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7CisgICAgICAgICAgICBhc3NlcnQocik7CiAgICAgfQogCiAgICAgLyogRmlsbCBpbiB0aGUgbm9uLWRpZ2l0IHBhcnRzIChwYWRkaW5nLCBzaWduLCBldGMuKSAqLwogICAgIGZpbGxfbm9uX2RpZ2l0cyhwLCAmc3BlYywgcHJlZml4LCBuX2RpZ2l0cyArIG5fZ3JvdXBpbmdfY2hhcnMsCi0JCSAgICBmb3JtYXQtPmZpbGxfY2hhciA9PSAnXDAnID8gJyAnIDogZm9ybWF0LT5maWxsX2NoYXIpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPmZpbGxfY2hhciA9PSAnXDAnID8gJyAnIDogZm9ybWF0LT5maWxsX2NoYXIpOwogCiAgICAgLyogSWYgdHlwZSBpcyAnWCcsIHVwcGVyY2FzZSB0aGUgcHJlZml4LiAgVGhpcyBoYXMgdG8gYmUgZG9uZSBhZnRlciB0aGUKICAgICAgICBwcmVmaXggaXMgZmlsbGVkIGluIGJ5IGZpbGxfbm9uX2RpZ2l0cyAqLwogICAgIGlmIChmb3JtYXQtPnR5cGUgPT0gJ1gnKSB7Ci0JUHlfc3NpemVfdCB0OwotCWZvciAodCA9IDA7IHQgPCBuX3ByZWZpeDsgKyt0KQotCSAgICBwW3QgKyBzcGVjLm5fbHBhZGRpbmcgKyBzcGVjLm5fbHNpZ25dID0KLQkJICAgIFNUUklOR0xJQl9UT1VQUEVSKHBbdCArIHNwZWMubl9scGFkZGluZyArIHNwZWMubl9sc2lnbl0pOworICAgICAgICBQeV9zc2l6ZV90IHQ7CisgICAgICAgIGZvciAodCA9IDA7IHQgPCBuX3ByZWZpeDsgKyt0KQorICAgICAgICAgICAgcFt0ICsgc3BlYy5uX2xwYWRkaW5nICsgc3BlYy5uX2xzaWduXSA9CisgICAgICAgICAgICAgICAgICAgIFNUUklOR0xJQl9UT1VQUEVSKHBbdCArIHNwZWMubl9scGFkZGluZyArIHNwZWMubl9sc2lnbl0pOwogICAgIH0KIAogCkBAIC03MjMsNyArNzIzLDcgQEAKIC8qIG11Y2ggb2YgdGhpcyBpcyB0YWtlbiBmcm9tIHVuaWNvZGVvYmplY3QuYyAqLwogc3RhdGljIFB5T2JqZWN0ICoKIGZvcm1hdF9mbG9hdF9pbnRlcm5hbChQeU9iamVjdCAqdmFsdWUsCi0JCSAgICAgIGNvbnN0IEludGVybmFsRm9ybWF0U3BlYyAqZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVybmFsRm9ybWF0U3BlYyAqZm9ybWF0KQogewogICAgIC8qIGZtdCA9ICclLicgKyBgcHJlY2AgKyBgdHlwZWAgKyAnJSUnCiAgICAgICAgd29yc3QgY2FzZSBsZW5ndGggPSAyICsgMTAgKGxlbiBvZiBJTlRfTUFYKSArIDEgKyAyID0gMTUgKHVzZSAyMCkqLwpAQCAtNzY1LDcgKzc2NSw3IEBACiAgICAgaWYgKGZvcm1hdC0+YWx0ZXJuYXRlKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIkFsdGVybmF0ZSBmb3JtICgjKSBub3QgYWxsb3dlZCBpbiBmbG9hdCBmb3JtYXQgIgotCQkJInNwZWNpZmllciIpOworICAgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZmllciIpOwogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogCkBAIC03OTYsNyArNzk2LDcgQEAKICAgICAgICA4LWJpdCBjaGFyLiAgdGhpcyBpcyBzYWZlLCBiZWNhdXNlIHdlJ3ZlIHJlc3RyaWN0ZWQgd2hhdCAidHlwZSIKICAgICAgICBjYW4gYmUgKi8KICAgICBQeU9TX3NucHJpbnRmKGZtdCwgc2l6ZW9mKGZtdCksICIlJS4lIiBQWV9GT1JNQVRfU0laRV9UICJkJWMiLCBwcmVjaXNpb24sCi0JCSAgKGNoYXIpdHlwZSk7CisgICAgICAgICAgICAgICAgICAoY2hhcil0eXBlKTsKIAogICAgIC8qIGRvIHRoZSBhY3R1YWwgZm9ybWF0dGluZyAqLwogICAgIFB5T1NfYXNjaWlfZm9ybWF0ZChjaGFyYnVmLCBzaXplb2YoY2hhcmJ1ZiksIGZtdCwgeCk7CkBAIC04MzgsMTEgKzgzOCwxMSBAQAogCiAgICAgLyogRmlsbCBpbiB0aGUgbm9uLWRpZ2l0IHBhcnRzIChwYWRkaW5nLCBzaWduLCBldGMuKSAqLwogICAgIGZpbGxfbm9uX2RpZ2l0cyhTVFJJTkdMSUJfU1RSKHJlc3VsdCksICZzcGVjLCBOVUxMLCBuX2RpZ2l0cywKLQkJICAgIGZvcm1hdC0+ZmlsbF9jaGFyID09ICdcMCcgPyAnICcgOiBmb3JtYXQtPmZpbGxfY2hhcik7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdC0+ZmlsbF9jaGFyID09ICdcMCcgPyAnICcgOiBmb3JtYXQtPmZpbGxfY2hhcik7CiAKICAgICAvKiBmaWxsIGluIHRoZSBkaWdpdCBwYXJ0cyAqLwogICAgIG1lbW1vdmUoU1RSSU5HTElCX1NUUihyZXN1bHQpICsKLQkgICAgICAgKHNwZWMubl9scGFkZGluZyArIHNwZWMubl9sc2lnbiArIHNwZWMubl9zcGFkZGluZyksCisgICAgICAgICAgICAgICAoc3BlYy5uX2xwYWRkaW5nICsgc3BlYy5uX2xzaWduICsgc3BlYy5uX3NwYWRkaW5nKSwKICAgICAgICAgICAgIHAsCiAgICAgICAgICAgICBuX2RpZ2l0cyAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOwogCkBAIC04NTYsOCArODU2LDggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBQeU9iamVjdCAqCiBGT1JNQVRfU1RSSU5HKFB5T2JqZWN0ICpvYmosCi0JICAgICAgU1RSSU5HTElCX0NIQVIgKmZvcm1hdF9zcGVjLAotCSAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKQorICAgICAgICAgICAgICBTVFJJTkdMSUJfQ0hBUiAqZm9ybWF0X3NwZWMsCisgICAgICAgICAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKQogewogICAgIEludGVybmFsRm9ybWF0U3BlYyBmb3JtYXQ7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CkBAIC04NzEsNyArODcxLDcgQEAKIAogICAgIC8qIHBhcnNlIHRoZSBmb3JtYXRfc3BlYyAqLwogICAgIGlmICghcGFyc2VfaW50ZXJuYWxfcmVuZGVyX2Zvcm1hdF9zcGVjKGZvcm1hdF9zcGVjLCBmb3JtYXRfc3BlY19sZW4sCi0JCQkJCSAgICZmb3JtYXQsICdzJykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgJ3MnKSkKICAgICAgICAgZ290byBkb25lOwogCiAgICAgLyogdHlwZSBjb252ZXJzaW9uPyAqLwpAQCAtODkzLDkgKzg5Myw5IEBACiAjaWYgZGVmaW5lZCBGT1JNQVRfTE9ORyB8fCBkZWZpbmVkIEZPUk1BVF9JTlQKIHN0YXRpYyBQeU9iamVjdCoKIGZvcm1hdF9pbnRfb3JfbG9uZyhQeU9iamVjdCogb2JqLAotCQkgICBTVFJJTkdMSUJfQ0hBUiAqZm9ybWF0X3NwZWMsCi0JCSAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuLAotCQkgICBJbnRPckxvbmdUb1N0cmluZyB0b3N0cmluZykKKyAgICAgICAgICAgICAgICAgICBTVFJJTkdMSUJfQ0hBUiAqZm9ybWF0X3NwZWMsCisgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4sCisgICAgICAgICAgICAgICAgICAgSW50T3JMb25nVG9TdHJpbmcgdG9zdHJpbmcpCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnRtcCA9IE5VTEw7CkBAIC05MTAsOCArOTEwLDggQEAKIAogICAgIC8qIHBhcnNlIHRoZSBmb3JtYXRfc3BlYyAqLwogICAgIGlmICghcGFyc2VfaW50ZXJuYWxfcmVuZGVyX2Zvcm1hdF9zcGVjKGZvcm1hdF9zcGVjLAotCQkJCQkgICBmb3JtYXRfc3BlY19sZW4sCi0JCQkJCSAgICZmb3JtYXQsICdkJykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3NwZWNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsICdkJykpCiAgICAgICAgIGdvdG8gZG9uZTsKIAogICAgIC8qIHR5cGUgY29udmVyc2lvbj8gKi8KQEAgLTkyNCw4ICs5MjQsOCBAQAogICAgIGNhc2UgJ1gnOgogICAgIGNhc2UgJ24nOgogICAgICAgICAvKiBubyB0eXBlIGNvbnZlcnNpb24gbmVlZGVkLCBhbHJlYWR5IGFuIGludCAob3IgbG9uZykuICBkbwotCSAgIHRoZSBmb3JtYXR0aW5nICovCi0JICAgIHJlc3VsdCA9IGZvcm1hdF9pbnRfb3JfbG9uZ19pbnRlcm5hbChvYmosICZmb3JtYXQsIHRvc3RyaW5nKTsKKyAgICAgICAgICAgdGhlIGZvcm1hdHRpbmcgKi8KKyAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdF9pbnRfb3JfbG9uZ19pbnRlcm5hbChvYmosICZmb3JtYXQsIHRvc3RyaW5nKTsKICAgICAgICAgYnJlYWs7CiAKICAgICBjYXNlICdlJzoKQEAgLTk3NCwxMSArOTc0LDExIEBACiAKIFB5T2JqZWN0ICoKIEZPUk1BVF9MT05HKFB5T2JqZWN0ICpvYmosCi0JICAgIFNUUklOR0xJQl9DSEFSICpmb3JtYXRfc3BlYywKLQkgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pCisgICAgICAgICAgICBTVFJJTkdMSUJfQ0hBUiAqZm9ybWF0X3NwZWMsCisgICAgICAgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbikKIHsKICAgICByZXR1cm4gZm9ybWF0X2ludF9vcl9sb25nKG9iaiwgZm9ybWF0X3NwZWMsIGZvcm1hdF9zcGVjX2xlbiwKLQkJCSAgICAgIGxvbmdfZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfZm9ybWF0KTsKIH0KICNlbmRpZiAvKiBGT1JNQVRfTE9ORyAqLwogCkBAIC05OTUsMTkgKzk5NSwxOSBAQAogCiBQeU9iamVjdCAqCiBGT1JNQVRfSU5UKFB5T2JqZWN0ICpvYmosCi0JICAgU1RSSU5HTElCX0NIQVIgKmZvcm1hdF9zcGVjLAotCSAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKQorICAgICAgICAgICBTVFJJTkdMSUJfQ0hBUiAqZm9ybWF0X3NwZWMsCisgICAgICAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKQogewogICAgIHJldHVybiBmb3JtYXRfaW50X29yX2xvbmcob2JqLCBmb3JtYXRfc3BlYywgZm9ybWF0X3NwZWNfbGVuLAotCQkJICAgICAgaW50X2Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRfZm9ybWF0KTsKIH0KICNlbmRpZiAvKiBGT1JNQVRfSU5UICovCiAKICNpZmRlZiBGT1JNQVRfRkxPQVQKIFB5T2JqZWN0ICoKIEZPUk1BVF9GTE9BVChQeU9iamVjdCAqb2JqLAotCSAgICAgU1RSSU5HTElCX0NIQVIgKmZvcm1hdF9zcGVjLAotCSAgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pCisgICAgICAgICAgICAgU1RSSU5HTElCX0NIQVIgKmZvcm1hdF9zcGVjLAorICAgICAgICAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKQogewogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogICAgIEludGVybmFsRm9ybWF0U3BlYyBmb3JtYXQ7CkBAIC0xMDIxLDE3ICsxMDIxLDE3IEBACiAKICAgICAvKiBwYXJzZSB0aGUgZm9ybWF0X3NwZWMgKi8KICAgICBpZiAoIXBhcnNlX2ludGVybmFsX3JlbmRlcl9mb3JtYXRfc3BlYyhmb3JtYXRfc3BlYywKLQkJCQkJICAgZm9ybWF0X3NwZWNfbGVuLAotCQkJCQkgICAmZm9ybWF0LCAnXDAnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3BlY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgJ1wwJykpCiAgICAgICAgIGdvdG8gZG9uZTsKIAogICAgIC8qIHR5cGUgY29udmVyc2lvbj8gKi8KICAgICBzd2l0Y2ggKGZvcm1hdC50eXBlKSB7CiAgICAgY2FzZSAnXDAnOgotCS8qICdaJyBtZWFucyBsaWtlICdnJywgYnV0IHdpdGggYXQgbGVhc3Qgb25lIGRlY2ltYWwuICBTZWUKLQkgICBQeU9TX2FzY2lpX2Zvcm1hdGQgKi8KLQlmb3JtYXQudHlwZSA9ICdaJzsKLQkvKiBEZWxpYmVyYXRlIGZhbGwgdGhyb3VnaCB0byB0aGUgbmV4dCBjYXNlIHN0YXRlbWVudCAqLworICAgICAgICAvKiAnWicgbWVhbnMgbGlrZSAnZycsIGJ1dCB3aXRoIGF0IGxlYXN0IG9uZSBkZWNpbWFsLiAgU2VlCisgICAgICAgICAgIFB5T1NfYXNjaWlfZm9ybWF0ZCAqLworICAgICAgICBmb3JtYXQudHlwZSA9ICdaJzsKKyAgICAgICAgLyogRGVsaWJlcmF0ZSBmYWxsIHRocm91Z2ggdG8gdGhlIG5leHQgY2FzZSBzdGF0ZW1lbnQgKi8KICAgICBjYXNlICdlJzoKICAgICBjYXNlICdFJzoKICAgICBjYXNlICdmJzoKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2xvY2FsZXV0aWwuaCBiL09iamVjdHMvc3RyaW5nbGliL2xvY2FsZXV0aWwuaAppbmRleCAxMTA1NjA5Li45NzMwYzY3IDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9sb2NhbGV1dGlsLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvbG9jYWxldXRpbC5oCkBAIC0zNCw5NyArMzQsOTcgQEAKICAqKi8KIGludAogX1B5X0luc2VydFRob3VzYW5kc0dyb3VwaW5nKFNUUklOR0xJQl9DSEFSICpidWZmZXIsCi0JCQkgICAgUHlfc3NpemVfdCBuX2J1ZmZlciwKLQkJCSAgICBQeV9zc2l6ZV90IG5fZGlnaXRzLAotCQkJICAgIFB5X3NzaXplX3QgYnVmX3NpemUsCi0JCQkgICAgUHlfc3NpemVfdCAqY291bnQsCi0JCQkgICAgaW50IGFwcGVuZF96ZXJvX2NoYXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5fZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwcGVuZF96ZXJvX2NoYXIpCiB7Ci0Jc3RydWN0IGxjb252ICpsb2NhbGVfZGF0YSA9IGxvY2FsZWNvbnYoKTsKLQljb25zdCBjaGFyICpncm91cGluZyA9IGxvY2FsZV9kYXRhLT5ncm91cGluZzsKLQljb25zdCBjaGFyICp0aG91c2FuZHNfc2VwID0gbG9jYWxlX2RhdGEtPnRob3VzYW5kc19zZXA7Ci0JUHlfc3NpemVfdCB0aG91c2FuZHNfc2VwX2xlbiA9IHN0cmxlbih0aG91c2FuZHNfc2VwKTsKLQlTVFJJTkdMSUJfQ0hBUiAqcGVuZCA9IE5VTEw7IC8qIGN1cnJlbnQgZW5kIG9mIGJ1ZmZlciAqLwotCVNUUklOR0xJQl9DSEFSICpwbWF4ID0gTlVMTDsgLyogbWF4IG9mIGJ1ZmZlciAqLwotCWNoYXIgY3VycmVudF9ncm91cGluZzsKLQlQeV9zc2l6ZV90IHJlbWFpbmluZyA9IG5fZGlnaXRzOyAvKiBOdW1iZXIgb2YgY2hhcnMgcmVtYWluaW5nIHRvCi0JCQkJCSAgICBiZSBsb29rZWQgYXQgKi8KKyAgICBzdHJ1Y3QgbGNvbnYgKmxvY2FsZV9kYXRhID0gbG9jYWxlY29udigpOworICAgIGNvbnN0IGNoYXIgKmdyb3VwaW5nID0gbG9jYWxlX2RhdGEtPmdyb3VwaW5nOworICAgIGNvbnN0IGNoYXIgKnRob3VzYW5kc19zZXAgPSBsb2NhbGVfZGF0YS0+dGhvdXNhbmRzX3NlcDsKKyAgICBQeV9zc2l6ZV90IHRob3VzYW5kc19zZXBfbGVuID0gc3RybGVuKHRob3VzYW5kc19zZXApOworICAgIFNUUklOR0xJQl9DSEFSICpwZW5kID0gTlVMTDsgLyogY3VycmVudCBlbmQgb2YgYnVmZmVyICovCisgICAgU1RSSU5HTElCX0NIQVIgKnBtYXggPSBOVUxMOyAvKiBtYXggb2YgYnVmZmVyICovCisgICAgY2hhciBjdXJyZW50X2dyb3VwaW5nOworICAgIFB5X3NzaXplX3QgcmVtYWluaW5nID0gbl9kaWdpdHM7IC8qIE51bWJlciBvZiBjaGFycyByZW1haW5pbmcgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBsb29rZWQgYXQgKi8KIAotCS8qIEluaXRpYWxpemUgdGhlIGNoYXJhY3RlciBjb3VudCwgaWYgd2UncmUganVzdCBjb3VudGluZy4gKi8KLQlpZiAoY291bnQpCi0JCSpjb3VudCA9IDA7Ci0JZWxzZSB7Ci0JCS8qIFdlJ3JlIG5vdCBqdXN0IGNvdW50aW5nLCB3ZSdyZSBtb2RpZnlpbmcgYnVmZmVyICovCi0JCXBlbmQgPSBidWZmZXIgKyBuX2J1ZmZlcjsKLQkJcG1heCA9IGJ1ZmZlciArIGJ1Zl9zaXplOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHRoZSBjaGFyYWN0ZXIgY291bnQsIGlmIHdlJ3JlIGp1c3QgY291bnRpbmcuICovCisgICAgaWYgKGNvdW50KQorICAgICAgICAqY291bnQgPSAwOworICAgIGVsc2UgeworICAgICAgICAvKiBXZSdyZSBub3QganVzdCBjb3VudGluZywgd2UncmUgbW9kaWZ5aW5nIGJ1ZmZlciAqLworICAgICAgICBwZW5kID0gYnVmZmVyICsgbl9idWZmZXI7CisgICAgICAgIHBtYXggPSBidWZmZXIgKyBidWZfc2l6ZTsKKyAgICB9CiAKLQkvKiBTdGFydGluZyBhdCB0aGUgZW5kIGFuZCB3b3JraW5nIHJpZ2h0LXRvLWxlZnQsIGtlZXAgdHJhY2sgb2YKLQkgICB3aGF0IGdyb3VwaW5nIG5lZWRzIHRvIGJlIGFkZGVkIGFuZCBpbnNlcnQgdGhhdC4gKi8KLQljdXJyZW50X2dyb3VwaW5nID0gKmdyb3VwaW5nKys7CisgICAgLyogU3RhcnRpbmcgYXQgdGhlIGVuZCBhbmQgd29ya2luZyByaWdodC10by1sZWZ0LCBrZWVwIHRyYWNrIG9mCisgICAgICAgd2hhdCBncm91cGluZyBuZWVkcyB0byBiZSBhZGRlZCBhbmQgaW5zZXJ0IHRoYXQuICovCisgICAgY3VycmVudF9ncm91cGluZyA9ICpncm91cGluZysrOwogCi0JLyogSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAwLCBwZXJmb3JtIG5vIGdyb3VwaW5nIGF0IGFsbC4gKi8KLQlpZiAoY3VycmVudF9ncm91cGluZyA9PSAwKQotCQlyZXR1cm4gMTsKKyAgICAvKiBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIDAsIHBlcmZvcm0gbm8gZ3JvdXBpbmcgYXQgYWxsLiAqLworICAgIGlmIChjdXJyZW50X2dyb3VwaW5nID09IDApCisgICAgICAgIHJldHVybiAxOwogCi0Jd2hpbGUgKHJlbWFpbmluZyA+IGN1cnJlbnRfZ3JvdXBpbmcpIHsKLQkJLyogQWx3YXlzIGxlYXZlIGJ1ZmZlciBhbmQgcGVuZCB2YWxpZCBhdCB0aGUgZW5kIG9mIHRoaXMKLQkJICAgbG9vcCwgc2luY2Ugd2UgbWlnaHQgbGVhdmUgd2l0aCBhIHJldHVybiBzdGF0ZW1lbnQuICovCisgICAgd2hpbGUgKHJlbWFpbmluZyA+IGN1cnJlbnRfZ3JvdXBpbmcpIHsKKyAgICAgICAgLyogQWx3YXlzIGxlYXZlIGJ1ZmZlciBhbmQgcGVuZCB2YWxpZCBhdCB0aGUgZW5kIG9mIHRoaXMKKyAgICAgICAgICAgbG9vcCwgc2luY2Ugd2UgbWlnaHQgbGVhdmUgd2l0aCBhIHJldHVybiBzdGF0ZW1lbnQuICovCiAKLQkJcmVtYWluaW5nIC09IGN1cnJlbnRfZ3JvdXBpbmc7Ci0JCWlmIChjb3VudCkgewotCQkJLyogV2UncmUgb25seSBjb3VudGluZywgbm90IHRvdWNoaW5nIHRoZSBtZW1vcnkuICovCi0JCQkqY291bnQgKz0gdGhvdXNhbmRzX3NlcF9sZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBEbyB0aGUgZm9ybWF0dGluZy4gKi8KKyAgICAgICAgcmVtYWluaW5nIC09IGN1cnJlbnRfZ3JvdXBpbmc7CisgICAgICAgIGlmIChjb3VudCkgeworICAgICAgICAgICAgLyogV2UncmUgb25seSBjb3VudGluZywgbm90IHRvdWNoaW5nIHRoZSBtZW1vcnkuICovCisgICAgICAgICAgICAqY291bnQgKz0gdGhvdXNhbmRzX3NlcF9sZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBEbyB0aGUgZm9ybWF0dGluZy4gKi8KIAotCQkJU1RSSU5HTElCX0NIQVIgKnBsYXN0ID0gYnVmZmVyICsgcmVtYWluaW5nOworICAgICAgICAgICAgU1RSSU5HTElCX0NIQVIgKnBsYXN0ID0gYnVmZmVyICsgcmVtYWluaW5nOwogCi0JCQkvKiBJcyB0aGVyZSByb29tIHRvIGluc2VydCB0aG91c2FuZHNfc2VwX2xlbiBjaGFycz8gKi8KLQkJCWlmIChwbWF4IC0gcGVuZCA8IHRob3VzYW5kc19zZXBfbGVuKQotCQkJCS8qIE5vIHJvb20uICovCi0JCQkJcmV0dXJuIDA7CisgICAgICAgICAgICAvKiBJcyB0aGVyZSByb29tIHRvIGluc2VydCB0aG91c2FuZHNfc2VwX2xlbiBjaGFycz8gKi8KKyAgICAgICAgICAgIGlmIChwbWF4IC0gcGVuZCA8IHRob3VzYW5kc19zZXBfbGVuKQorICAgICAgICAgICAgICAgIC8qIE5vIHJvb20uICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJCS8qIE1vdmUgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyBkb3duLiAqLwotCQkJbWVtbW92ZShwbGFzdCArIHRob3VzYW5kc19zZXBfbGVuLAotCQkJCXBsYXN0LAotCQkJCShwZW5kIC0gcGxhc3QpICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7Ci0JCQkvKiBDb3B5IHRoZSB0aG91c2FuZHNfc2VwIGNoYXJzIGludG8gdGhlIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIC8qIE1vdmUgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyBkb3duLiAqLworICAgICAgICAgICAgbWVtbW92ZShwbGFzdCArIHRob3VzYW5kc19zZXBfbGVuLAorICAgICAgICAgICAgICAgIHBsYXN0LAorICAgICAgICAgICAgICAgIChwZW5kIC0gcGxhc3QpICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7CisgICAgICAgICAgICAvKiBDb3B5IHRoZSB0aG91c2FuZHNfc2VwIGNoYXJzIGludG8gdGhlIGJ1ZmZlci4gKi8KICNpZiBTVFJJTkdMSUJfSVNfVU5JQ09ERQotCQkJLyogQ29udmVydCBmcm9tIHRoZSBjaGFyJ3Mgb2YgdGhlIHRob3VzYW5kc19zZXAgZnJvbQotCQkJICAgdGhlIGxvY2FsZSBpbnRvIHVuaWNvZGUuICovCi0JCQl7Ci0JCQkJUHlfc3NpemVfdCBpOwotCQkJCWZvciAoaSA9IDA7IGkgPCB0aG91c2FuZHNfc2VwX2xlbjsgKytpKQotCQkJCQlwbGFzdFtpXSA9IHRob3VzYW5kc19zZXBbaV07Ci0JCQl9CisgICAgICAgICAgICAvKiBDb252ZXJ0IGZyb20gdGhlIGNoYXIncyBvZiB0aGUgdGhvdXNhbmRzX3NlcCBmcm9tCisgICAgICAgICAgICAgICB0aGUgbG9jYWxlIGludG8gdW5pY29kZS4gKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRob3VzYW5kc19zZXBfbGVuOyArK2kpCisgICAgICAgICAgICAgICAgICAgIHBsYXN0W2ldID0gdGhvdXNhbmRzX3NlcFtpXTsKKyAgICAgICAgICAgIH0KICNlbHNlCi0JCQkvKiBObyBjb252ZXJzaW9uLCBqdXN0IG1lbWNweSB0aGUgdGhvdXNhbmRzX3NlcC4gKi8KLQkJCW1lbWNweShwbGFzdCwgdGhvdXNhbmRzX3NlcCwgdGhvdXNhbmRzX3NlcF9sZW4pOworICAgICAgICAgICAgLyogTm8gY29udmVyc2lvbiwganVzdCBtZW1jcHkgdGhlIHRob3VzYW5kc19zZXAuICovCisgICAgICAgICAgICBtZW1jcHkocGxhc3QsIHRob3VzYW5kc19zZXAsIHRob3VzYW5kc19zZXBfbGVuKTsKICNlbmRpZgotCQl9CisgICAgICAgIH0KIAotCQkvKiBBZGp1c3QgZW5kIHBvaW50ZXIuICovCi0JCXBlbmQgKz0gdGhvdXNhbmRzX3NlcF9sZW47CisgICAgICAgIC8qIEFkanVzdCBlbmQgcG9pbnRlci4gKi8KKyAgICAgICAgcGVuZCArPSB0aG91c2FuZHNfc2VwX2xlbjsKIAotCQkvKiBNb3ZlIHRvIHRoZSBuZXh0IGdyb3VwaW5nIGNoYXJhY3RlciwgdW5sZXNzIHdlJ3JlCi0JCSAgIHJlcGVhdGluZyAod2hpY2ggaXMgZGVzaWduYXRlZCBieSBhIGdyb3VwaW5nIG9mIDApLiAqLwotCQlpZiAoKmdyb3VwaW5nICE9IDApIHsKLQkJCWN1cnJlbnRfZ3JvdXBpbmcgPSAqZ3JvdXBpbmcrKzsKLQkJCWlmIChjdXJyZW50X2dyb3VwaW5nID09IENIQVJfTUFYKQotCQkJCS8qIFdlJ3JlIGRvbmUuICovCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGFwcGVuZF96ZXJvX2NoYXIpIHsKLQkJLyogQXBwZW5kIGEgemVybyBjaGFyYWN0ZXIgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsCi0JCSAgIGlmIHRoZXJlJ3Mgcm9vbS4gKi8KLQkJaWYgKHBlbmQgLSAoYnVmZmVyICsgcmVtYWluaW5nKSA8IDEpCi0JCQkvKiBObyByb29tLCBlcnJvci4gKi8KLQkJCXJldHVybiAwOwotCQkqcGVuZCA9IDA7Ci0JfQotCXJldHVybiAxOworICAgICAgICAvKiBNb3ZlIHRvIHRoZSBuZXh0IGdyb3VwaW5nIGNoYXJhY3RlciwgdW5sZXNzIHdlJ3JlCisgICAgICAgICAgIHJlcGVhdGluZyAod2hpY2ggaXMgZGVzaWduYXRlZCBieSBhIGdyb3VwaW5nIG9mIDApLiAqLworICAgICAgICBpZiAoKmdyb3VwaW5nICE9IDApIHsKKyAgICAgICAgICAgIGN1cnJlbnRfZ3JvdXBpbmcgPSAqZ3JvdXBpbmcrKzsKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2dyb3VwaW5nID09IENIQVJfTUFYKQorICAgICAgICAgICAgICAgIC8qIFdlJ3JlIGRvbmUuICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFwcGVuZF96ZXJvX2NoYXIpIHsKKyAgICAgICAgLyogQXBwZW5kIGEgemVybyBjaGFyYWN0ZXIgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBzdHJpbmcsCisgICAgICAgICAgIGlmIHRoZXJlJ3Mgcm9vbS4gKi8KKyAgICAgICAgaWYgKHBlbmQgLSAoYnVmZmVyICsgcmVtYWluaW5nKSA8IDEpCisgICAgICAgICAgICAvKiBObyByb29tLCBlcnJvci4gKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAqcGVuZCA9IDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogI2VuZGlmIC8qIFNUUklOR0xJQl9MT0NBTEVVVElMX0ggKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL3BhcnRpdGlvbi5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvcGFydGl0aW9uLmgKaW5kZXggMTA1YmEzMS4uMjBjNzUwNyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvcGFydGl0aW9uLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvcGFydGl0aW9uLmgKQEAgLTE4LDIzICsxOCwyMyBAQAogCiAgICAgaWYgKHNlcF9sZW4gPT0gMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHNlcGFyYXRvciIpOwotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBvdXQgPSBQeVR1cGxlX05ldygzKTsKICAgICBpZiAoIW91dCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBwb3MgPSBmYXN0c2VhcmNoKHN0ciwgc3RyX2xlbiwgc2VwLCBzZXBfbGVuLCBGQVNUX1NFQVJDSCk7CiAKICAgICBpZiAocG9zIDwgMCkgewotCVB5X0lOQ1JFRihzdHJfb2JqKTsKLQlQeVR1cGxlX1NFVF9JVEVNKG91dCwgMCwgKFB5T2JqZWN0Kikgc3RyX29iaik7Ci0JUHlfSU5DUkVGKFNUUklOR0xJQl9FTVBUWSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShvdXQsIDEsIChQeU9iamVjdCopIFNUUklOR0xJQl9FTVBUWSk7Ci0JUHlfSU5DUkVGKFNUUklOR0xJQl9FTVBUWSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShvdXQsIDIsIChQeU9iamVjdCopIFNUUklOR0xJQl9FTVBUWSk7Ci0JcmV0dXJuIG91dDsKKyAgICAgICAgUHlfSU5DUkVGKHN0cl9vYmopOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG91dCwgMCwgKFB5T2JqZWN0Kikgc3RyX29iaik7CisgICAgICAgIFB5X0lOQ1JFRihTVFJJTkdMSUJfRU1QVFkpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG91dCwgMSwgKFB5T2JqZWN0KikgU1RSSU5HTElCX0VNUFRZKTsKKyAgICAgICAgUHlfSU5DUkVGKFNUUklOR0xJQl9FTVBUWSk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAyLCAoUHlPYmplY3QqKSBTVFJJTkdMSUJfRU1QVFkpOworICAgICAgICByZXR1cm4gb3V0OwogICAgIH0KIAogICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAwLCBTVFJJTkdMSUJfTkVXKHN0ciwgcG9zKSk7CkBAIC00NCw4ICs0NCw4IEBACiAgICAgUHlUdXBsZV9TRVRfSVRFTShvdXQsIDIsIFNUUklOR0xJQl9ORVcoc3RyICsgcG9zLCBzdHJfbGVuIC0gcG9zKSk7CiAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCVB5X0RFQ1JFRihvdXQpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYob3V0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIG91dDsKQEAgLTYyLDI5ICs2MiwyOSBAQAogCiAgICAgaWYgKHNlcF9sZW4gPT0gMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtcHR5IHNlcGFyYXRvciIpOwotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBvdXQgPSBQeVR1cGxlX05ldygzKTsKICAgICBpZiAoIW91dCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAvKiBYWFggLSBjcmVhdGUgcmV2ZXJzZWZhc3RzZWFyY2ggaGVscGVyISAqLwogICAgICAgICBwb3MgPSAtMTsKLQlmb3IgKGogPSBzdHJfbGVuIC0gc2VwX2xlbjsgaiA+PSAwOyAtLWopCisgICAgICAgIGZvciAoaiA9IHN0cl9sZW4gLSBzZXBfbGVuOyBqID49IDA7IC0taikKICAgICAgICAgICAgIGlmIChTVFJJTkdMSUJfQ01QKHN0citqLCBzZXAsIHNlcF9sZW4pID09IDApIHsKICAgICAgICAgICAgICAgICBwb3MgPSBqOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgaWYgKHBvcyA8IDApIHsKLQlQeV9JTkNSRUYoU1RSSU5HTElCX0VNUFRZKTsKLQlQeVR1cGxlX1NFVF9JVEVNKG91dCwgMCwgKFB5T2JqZWN0KikgU1RSSU5HTElCX0VNUFRZKTsKLQlQeV9JTkNSRUYoU1RSSU5HTElCX0VNUFRZKTsKLQlQeVR1cGxlX1NFVF9JVEVNKG91dCwgMSwgKFB5T2JqZWN0KikgU1RSSU5HTElCX0VNUFRZKTsKLQlQeV9JTkNSRUYoc3RyX29iaik7ICAgICAgICAKLQlQeVR1cGxlX1NFVF9JVEVNKG91dCwgMiwgKFB5T2JqZWN0Kikgc3RyX29iaik7Ci0JcmV0dXJuIG91dDsKKyAgICAgICAgUHlfSU5DUkVGKFNUUklOR0xJQl9FTVBUWSk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAwLCAoUHlPYmplY3QqKSBTVFJJTkdMSUJfRU1QVFkpOworICAgICAgICBQeV9JTkNSRUYoU1RSSU5HTElCX0VNUFRZKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShvdXQsIDEsIChQeU9iamVjdCopIFNUUklOR0xJQl9FTVBUWSk7CisgICAgICAgIFB5X0lOQ1JFRihzdHJfb2JqKTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShvdXQsIDIsIChQeU9iamVjdCopIHN0cl9vYmopOworICAgICAgICByZXR1cm4gb3V0OwogICAgIH0KIAogICAgIFB5VHVwbGVfU0VUX0lURU0ob3V0LCAwLCBTVFJJTkdMSUJfTkVXKHN0ciwgcG9zKSk7CkBAIC05NCw4ICs5NCw4IEBACiAgICAgUHlUdXBsZV9TRVRfSVRFTShvdXQsIDIsIFNUUklOR0xJQl9ORVcoc3RyICsgcG9zLCBzdHJfbGVuIC0gcG9zKSk7CiAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCVB5X0RFQ1JFRihvdXQpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeV9ERUNSRUYob3V0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIG91dDsKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL3N0cmluZ19mb3JtYXQuaCBiL09iamVjdHMvc3RyaW5nbGliL3N0cmluZ19mb3JtYXQuaAppbmRleCA2YzUzMWU4Li40MmVhZDg5IDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9zdHJpbmdfZm9ybWF0LmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvc3RyaW5nX2Zvcm1hdC5oCkBAIC00ODcsMTUgKzQ4NywxNSBAQAogICAgIFB5T2JqZWN0ICpmb3JtYXRfc3BlY19vYmplY3QgPSBOVUxMOwogICAgIFB5T2JqZWN0ICooKmZvcm1hdHRlcikoUHlPYmplY3QgKiwgU1RSSU5HTElCX0NIQVIgKiwgUHlfc3NpemVfdCkgPSBOVUxMOwogICAgIFNUUklOR0xJQl9DSEFSKiBmb3JtYXRfc3BlY19zdGFydCA9IGZvcm1hdF9zcGVjLT5wdHIgPwotCSAgICBmb3JtYXRfc3BlYy0+cHRyIDogTlVMTDsKKyAgICAgICAgICAgIGZvcm1hdF9zcGVjLT5wdHIgOiBOVUxMOwogICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuID0gZm9ybWF0X3NwZWMtPnB0ciA/Ci0JICAgIGZvcm1hdF9zcGVjLT5lbmQgLSBmb3JtYXRfc3BlYy0+cHRyIDogMDsKKyAgICAgICAgICAgIGZvcm1hdF9zcGVjLT5lbmQgLSBmb3JtYXRfc3BlYy0+cHRyIDogMDsKIAogICAgIC8qIElmIHdlIGtub3cgdGhlIHR5cGUgZXhhY3RseSwgc2tpcCB0aGUgbG9va3VwIG9mIF9fZm9ybWF0X18gYW5kIGp1c3QKICAgICAgICBjYWxsIHRoZSBmb3JtYXR0ZXIgZGlyZWN0bHkuICovCiAjaWYgU1RSSU5HTElCX0lTX1VOSUNPREUKICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QoZmllbGRvYmopKQotCWZvcm1hdHRlciA9IF9QeVVuaWNvZGVfRm9ybWF0QWR2YW5jZWQ7CisgICAgICAgIGZvcm1hdHRlciA9IF9QeVVuaWNvZGVfRm9ybWF0QWR2YW5jZWQ7CiAgICAgLyogVW5mb3J0dW5hdGVseSwgdGhlcmUncyBhIHByb2JsZW0gd2l0aCBjaGVja2luZyBmb3IgaW50LCBsb25nLAogICAgICAgIGFuZCBmbG9hdCBoZXJlLiAgSWYgd2UncmUgYmVpbmcgaW5jbHVkZWQgYXMgdW5pY29kZSwgdGhlaXIKICAgICAgICBmb3JtYXR0ZXJzIGV4cGVjdCBzdHJpbmcgZm9ybWF0X3NwZWMgYXJncy4gIEZvciBub3csIGp1c3Qgc2tpcApAQCAtNTAzLDI5ICs1MDMsMjkgQEAKICAgICAgICBoYXNzbGUuICovCiAjZWxzZQogICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KGZpZWxkb2JqKSkKLQlmb3JtYXR0ZXIgPSBfUHlCeXRlc19Gb3JtYXRBZHZhbmNlZDsKKyAgICAgICAgZm9ybWF0dGVyID0gX1B5Qnl0ZXNfRm9ybWF0QWR2YW5jZWQ7CiAgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2tFeGFjdChmaWVsZG9iaikpCi0JZm9ybWF0dGVyID1fUHlJbnRfRm9ybWF0QWR2YW5jZWQ7CisgICAgICAgIGZvcm1hdHRlciA9X1B5SW50X0Zvcm1hdEFkdmFuY2VkOwogICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVja0V4YWN0KGZpZWxkb2JqKSkKLQlmb3JtYXR0ZXIgPV9QeUxvbmdfRm9ybWF0QWR2YW5jZWQ7CisgICAgICAgIGZvcm1hdHRlciA9X1B5TG9uZ19Gb3JtYXRBZHZhbmNlZDsKICAgICBlbHNlIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QoZmllbGRvYmopKQotCWZvcm1hdHRlciA9IF9QeUZsb2F0X0Zvcm1hdEFkdmFuY2VkOworICAgICAgICBmb3JtYXR0ZXIgPSBfUHlGbG9hdF9Gb3JtYXRBZHZhbmNlZDsKICNlbmRpZgogCiAgICAgaWYgKGZvcm1hdHRlcikgewotCS8qIHdlIGtub3cgZXhhY3RseSB3aGljaCBmb3JtYXR0ZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiBfX2Zvcm1hdF9fIGlzCi0JICAgbG9va2VkIHVwLCBzbyBjYWxsIGl0IGRpcmVjdGx5LCBpbnN0ZWFkLiAqLwotCXJlc3VsdCA9IGZvcm1hdHRlcihmaWVsZG9iaiwgZm9ybWF0X3NwZWNfc3RhcnQsIGZvcm1hdF9zcGVjX2xlbik7CisgICAgICAgIC8qIHdlIGtub3cgZXhhY3RseSB3aGljaCBmb3JtYXR0ZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiBfX2Zvcm1hdF9fIGlzCisgICAgICAgICAgIGxvb2tlZCB1cCwgc28gY2FsbCBpdCBkaXJlY3RseSwgaW5zdGVhZC4gKi8KKyAgICAgICAgcmVzdWx0ID0gZm9ybWF0dGVyKGZpZWxkb2JqLCBmb3JtYXRfc3BlY19zdGFydCwgZm9ybWF0X3NwZWNfbGVuKTsKICAgICB9CiAgICAgZWxzZSB7Ci0JLyogV2UgbmVlZCB0byBjcmVhdGUgYW4gb2JqZWN0IG91dCBvZiB0aGUgcG9pbnRlcnMgd2UgaGF2ZSwgYmVjYXVzZQotCSAgIF9fZm9ybWF0X18gdGFrZXMgYSBzdHJpbmcvdW5pY29kZSBvYmplY3QgZm9yIGZvcm1hdF9zcGVjLiAqLwotCWZvcm1hdF9zcGVjX29iamVjdCA9IFNUUklOR0xJQl9ORVcoZm9ybWF0X3NwZWNfc3RhcnQsCi0JCQkJCSAgIGZvcm1hdF9zcGVjX2xlbik7Ci0JaWYgKGZvcm1hdF9zcGVjX29iamVjdCA9PSBOVUxMKQotCSAgICBnb3RvIGRvbmU7CisgICAgICAgIC8qIFdlIG5lZWQgdG8gY3JlYXRlIGFuIG9iamVjdCBvdXQgb2YgdGhlIHBvaW50ZXJzIHdlIGhhdmUsIGJlY2F1c2UKKyAgICAgICAgICAgX19mb3JtYXRfXyB0YWtlcyBhIHN0cmluZy91bmljb2RlIG9iamVjdCBmb3IgZm9ybWF0X3NwZWMuICovCisgICAgICAgIGZvcm1hdF9zcGVjX29iamVjdCA9IFNUUklOR0xJQl9ORVcoZm9ybWF0X3NwZWNfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3NwZWNfbGVuKTsKKyAgICAgICAgaWYgKGZvcm1hdF9zcGVjX29iamVjdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBkb25lOwogCi0JcmVzdWx0ID0gUHlPYmplY3RfRm9ybWF0KGZpZWxkb2JqLCBmb3JtYXRfc3BlY19vYmplY3QpOworICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9Gb3JtYXQoZmllbGRvYmosIGZvcm1hdF9zcGVjX29iamVjdCk7CiAgICAgfQogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKICAgICAgICAgZ290byBkb25lOwpAQCAtNTM4LDExICs1MzgsMTEgQEAKICAgICAvKiBDb252ZXJ0IHJlc3VsdCB0byBvdXIgdHlwZS4gIFdlIGNvdWxkIGJlIHN0ciwgYW5kIHJlc3VsdCBjb3VsZAogICAgICAgIGJlIHVuaWNvZGUgKi8KICAgICB7Ci0JUHlPYmplY3QgKnRtcCA9IFNUUklOR0xJQl9UT1NUUihyZXN1bHQpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkgICAgZ290byBkb25lOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJlc3VsdCA9IHRtcDsKKyAgICAgICAgUHlPYmplY3QgKnRtcCA9IFNUUklOR0xJQl9UT1NUUihyZXN1bHQpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXN1bHQgPSB0bXA7CiAgICAgfQogI2VuZGlmCiAKQEAgLTc3NywxNyArNzc3LDE3IEBACiAgICAgY2FzZSAncyc6CiAgICAgICAgIHJldHVybiBTVFJJTkdMSUJfVE9TVFIob2JqKTsKICAgICBkZWZhdWx0OgotCWlmIChjb252ZXJzaW9uID4gMzIgJiYgY29udmVyc2lvbiA8IDEyNykgewotCQkvKiBJdCdzIHRoZSBBU0NJSSBzdWJyYW5nZTsgY2FzdGluZyB0byBjaGFyIGlzIHNhZmUKLQkJICAgKGFzc3VtaW5nIHRoZSBleGVjdXRpb24gY2hhcmFjdGVyIHNldCBpcyBhbiBBU0NJSQotCQkgICBzdXBlcnNldCkuICovCi0gICAgICAgIAlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgaWYgKGNvbnZlcnNpb24gPiAzMiAmJiBjb252ZXJzaW9uIDwgMTI3KSB7CisgICAgICAgICAgICAgICAgLyogSXQncyB0aGUgQVNDSUkgc3VicmFuZ2U7IGNhc3RpbmcgdG8gY2hhciBpcyBzYWZlCisgICAgICAgICAgICAgICAgICAgKGFzc3VtaW5nIHRoZSBleGVjdXRpb24gY2hhcmFjdGVyIHNldCBpcyBhbiBBU0NJSQorICAgICAgICAgICAgICAgICAgIHN1cGVyc2V0KS4gKi8KKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGNvbnZlcnNpb24gc3BlY2lmaWVyICVjIiwKICAgICAgICAgICAgICAgICAgICAgIChjaGFyKWNvbnZlcnNpb24pOwotCX0gZWxzZQotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJICAgICAiVW5rbm93biBjb252ZXJzaW9uIHNwZWNpZmllciBcXHgleCIsCi0JCSAgICAgKHVuc2lnbmVkIGludCljb252ZXJzaW9uKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBjb252ZXJzaW9uIHNwZWNpZmllciBcXHgleCIsCisgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWNvbnZlcnNpb24pOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiB9CkBAIC0xMDQxLDcgKzEwNDEsNyBAQAogICAgICAgICAgICAgUHlfSU5DUkVGKGNvbnZlcnNpb25fc3RyKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCi0JICAgIGNvbnZlcnNpb25fc3RyID0gU1RSSU5HTElCX05FVygmY29udmVyc2lvbiwgMSk7CisgICAgICAgICAgICBjb252ZXJzaW9uX3N0ciA9IFNUUklOR0xJQl9ORVcoJmNvbnZlcnNpb24sIDEpOwogICAgICAgICBpZiAoY29udmVyc2lvbl9zdHIgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gZG9uZTsKIApAQCAtMTA1NywzOSArMTA1NywzOSBAQAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZm9ybWF0dGVyaXRlcl9tZXRob2RzW10gPSB7Ci0gICAge05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeUZvcm1hdHRlckl0ZXJfVHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotICAgICJmb3JtYXR0ZXJpdGVyYXRvciIsCQkvKiB0cF9uYW1lICovCi0gICAgc2l6ZW9mKGZvcm1hdHRlcml0ZXJvYmplY3QpLAkvKiB0cF9iYXNpY3NpemUgKi8KLSAgICAwLAkJCQkJLyogdHBfaXRlbXNpemUgKi8KKyAgICAiZm9ybWF0dGVyaXRlcmF0b3IiLCAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKGZvcm1hdHRlcml0ZXJvYmplY3QpLCAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgKGRlc3RydWN0b3IpZm9ybWF0dGVyaXRlcl9kZWFsbG9jLAkvKiB0cF9kZWFsbG9jICovCi0gICAgMCwJCQkJCS8qIHRwX3ByaW50ICovCi0gICAgMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotICAgIDAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0gICAgMCwJCQkJCS8qIHRwX3JlcHIgKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLSAgICAwLAkJCQkJLyogdHBfaGFzaCAqLwotICAgIDAsCQkJCQkvKiB0cF9jYWxsICovCi0gICAgMCwJCQkJCS8qIHRwX3N0ciAqLwotICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLAkJLyogdHBfZ2V0YXR0cm8gKi8KLSAgICAwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxULAkJCS8qIHRwX2ZsYWdzICovCi0gICAgMCwJCQkJCS8qIHRwX2RvYyAqLwotICAgIDAsCQkJCQkvKiB0cF90cmF2ZXJzZSAqLwotICAgIDAsCQkJCQkvKiB0cF9jbGVhciAqLwotICAgIDAsCQkJCQkvKiB0cF9yaWNoY29tcGFyZSAqLwotICAgIDAsCQkJCQkvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwotICAgIFB5T2JqZWN0X1NlbGZJdGVyLAkJCS8qIHRwX2l0ZXIgKi8KLSAgICAoaXRlcm5leHRmdW5jKWZvcm1hdHRlcml0ZXJfbmV4dCwJLyogdHBfaXRlcm5leHQgKi8KLSAgICBmb3JtYXR0ZXJpdGVyX21ldGhvZHMsCQkvKiB0cF9tZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpZm9ybWF0dGVyaXRlcl9kZWFsbG9jLCAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgKGl0ZXJuZXh0ZnVuYylmb3JtYXR0ZXJpdGVyX25leHQsICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBmb3JtYXR0ZXJpdGVyX21ldGhvZHMsICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgMCwKIH07CiAKQEAgLTExOTAsMzkgKzExOTAsMzkgQEAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGZpZWxkbmFtZWl0ZXJfbWV0aG9kc1tdID0gewotICAgIHtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlGaWVsZE5hbWVJdGVyX1R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLSAgICAiZmllbGRuYW1laXRlcmF0b3IiLAkJLyogdHBfbmFtZSAqLwotICAgIHNpemVvZihmaWVsZG5hbWVpdGVyb2JqZWN0KSwJLyogdHBfYmFzaWNzaXplICovCi0gICAgMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCisgICAgImZpZWxkbmFtZWl0ZXJhdG9yIiwgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihmaWVsZG5hbWVpdGVyb2JqZWN0KSwgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCiAgICAgLyogbWV0aG9kcyAqLwotICAgIChkZXN0cnVjdG9yKWZpZWxkbmFtZWl0ZXJfZGVhbGxvYywJLyogdHBfZGVhbGxvYyAqLwotICAgIDAsCQkJCQkvKiB0cF9wcmludCAqLwotICAgIDAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLSAgICAwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotICAgIDAsCQkJCQkvKiB0cF9yZXByICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgIDAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwJCQkJCS8qIHRwX2hhc2ggKi8KLSAgICAwLAkJCQkJLyogdHBfY2FsbCAqLwotICAgIDAsCQkJCQkvKiB0cF9zdHIgKi8KLSAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0gICAgMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0gICAgMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCwJCQkvKiB0cF9mbGFncyAqLwotICAgIDAsCQkJCQkvKiB0cF9kb2MgKi8KLSAgICAwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLSAgICAwLAkJCQkJLyogdHBfY2xlYXIgKi8KLSAgICAwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICAwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLSAgICBQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0gICAgKGl0ZXJuZXh0ZnVuYylmaWVsZG5hbWVpdGVyX25leHQsCS8qIHRwX2l0ZXJuZXh0ICovCi0gICAgZmllbGRuYW1laXRlcl9tZXRob2RzLAkJLyogdHBfbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWZpZWxkbmFtZWl0ZXJfZGVhbGxvYywgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpZmllbGRuYW1laXRlcl9uZXh0LCAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgZmllbGRuYW1laXRlcl9tZXRob2RzLCAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgIDB9OwogCiAvKiB1bmljb2RlX2Zvcm1hdHRlcl9maWVsZF9uYW1lX3NwbGl0IGlzIHVzZWQgdG8gaW1wbGVtZW50CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi90cmFuc21vZ3JpZnkuaCBiL09iamVjdHMvc3RyaW5nbGliL3RyYW5zbW9ncmlmeS5oCmluZGV4IDdkYzgxNzcuLjQzOTBlMjIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL3RyYW5zbW9ncmlmeS5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL3RyYW5zbW9ncmlmeS5oCkBAIC0yNSwxMCArMjUsMTAgQEAKICAgICBzaXplX3QgaSwgajsKICAgICBQeU9iamVjdCAqdTsKICAgICBpbnQgdGFic2l6ZSA9IDg7Ci0gICAgCisKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOmV4cGFuZHRhYnMiLCAmdGFic2l6ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIAorCiAgICAgLyogRmlyc3QgcGFzczogZGV0ZXJtaW5lIHNpemUgb2Ygb3V0cHV0IHN0cmluZyAqLwogICAgIGkgPSBqID0gMDsKICAgICBlID0gU1RSSU5HTElCX1NUUihzZWxmKSArIFNUUklOR0xJQl9MRU4oc2VsZik7CkBAIC01NSwyMCArNTUsMjAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKKwogICAgIGlmICgoaSArIGopID4gUFlfU1NJWkVfVF9NQVgpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXN1bHQgaXMgdG9vIGxvbmciKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIAorCiAgICAgLyogU2Vjb25kIHBhc3M6IGNyZWF0ZSBvdXRwdXQgc3RyaW5nIGFuZCBmaWxsIGl0ICovCiAgICAgdSA9IFNUUklOR0xJQl9ORVcoTlVMTCwgaSArIGopOwogICAgIGlmICghdSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgCisKICAgICBqID0gMDsKICAgICBxID0gU1RSSU5HTElCX1NUUih1KTsKLSAgICAKKwogICAgIGZvciAocCA9IFNUUklOR0xJQl9TVFIoc2VsZik7IHAgPCBlOyBwKyspCiAgICAgICAgIGlmICgqcCA9PSAnXHQnKSB7CiAgICAgICAgICAgICBpZiAodGFic2l6ZSA+IDApIHsKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpCiAgICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgIH0KLSAgICAKKwogICAgIHJldHVybiB1OwogfQogCkBAIC0xMTAsMTYgKzExMCwxNiBAQAogICAgIH0KIAogICAgIHUgPSBTVFJJTkdMSUJfTkVXKE5VTEwsCi0JCQkJICAgbGVmdCArIFNUUklOR0xJQl9MRU4oc2VsZikgKyByaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyBTVFJJTkdMSUJfTEVOKHNlbGYpICsgcmlnaHQpOwogICAgIGlmICh1KSB7CiAgICAgICAgIGlmIChsZWZ0KQogICAgICAgICAgICAgbWVtc2V0KFNUUklOR0xJQl9TVFIodSksIGZpbGwsIGxlZnQpOwogICAgICAgICBQeV9NRU1DUFkoU1RSSU5HTElCX1NUUih1KSArIGxlZnQsCi0JICAgICAgIFNUUklOR0xJQl9TVFIoc2VsZiksCi0JICAgICAgIFNUUklOR0xJQl9MRU4oc2VsZikpOworICAgICAgICAgICAgICAgU1RSSU5HTElCX1NUUihzZWxmKSwKKyAgICAgICAgICAgICAgIFNUUklOR0xJQl9MRU4oc2VsZikpOwogICAgICAgICBpZiAocmlnaHQpCiAgICAgICAgICAgICBtZW1zZXQoU1RSSU5HTElCX1NUUih1KSArIGxlZnQgKyBTVFJJTkdMSUJfTEVOKHNlbGYpLAotCQkgICBmaWxsLCByaWdodCk7CisgICAgICAgICAgICAgICAgICAgZmlsbCwgcmlnaHQpOwogICAgIH0KIAogICAgIHJldHVybiB1OwpAQCAtMjcxLDE3ICsyNzEsMTcgQEAKIH0KIAogCi0jZGVmaW5lIF9TVFJJTkdMSUJfU1BMSVRfQVBQRU5EKGRhdGEsIGxlZnQsIHJpZ2h0KQkJXAotCXN0ciA9IFNUUklOR0xJQl9ORVcoKGRhdGEpICsgKGxlZnQpLAkgICAgICAgICAgICAgICAgXAotCQkJCQkgKHJpZ2h0KSAtIChsZWZ0KSk7CVwKLQlpZiAoc3RyID09IE5VTEwpCQkJCQlcCi0JCWdvdG8gb25FcnJvcjsJCQkJCVwKLQlpZiAoUHlMaXN0X0FwcGVuZChsaXN0LCBzdHIpKSB7CQkJCVwKLQkJUHlfREVDUkVGKHN0cik7CQkJCQlcCi0JCWdvdG8gb25FcnJvcjsJCQkJCVwKLQl9CQkJCQkJCVwKLQllbHNlCQkJCQkJCVwKLQkJUHlfREVDUkVGKHN0cik7CisjZGVmaW5lIF9TVFJJTkdMSUJfU1BMSVRfQVBQRU5EKGRhdGEsIGxlZnQsIHJpZ2h0KSAgICAgICAgICAgICAgXAorICAgICAgICBzdHIgPSBTVFJJTkdMSUJfTkVXKChkYXRhKSArIChsZWZ0KSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJpZ2h0KSAtIChsZWZ0KSk7ICAgICBcCisgICAgICAgIGlmIChzdHIgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgc3RyKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOwogCiBQeURvY19TVFJWQVIoc3BsaXRsaW5lc19fZG9jX18sCiAiQi5zcGxpdGxpbmVzKFtrZWVwZW5kc10pIC0+IGxpc3Qgb2YgbGluZXNcblwKQEAgLTMyMCwyOCArMzIwLDI4IEBACiAgICAgICAgIGdvdG8gb25FcnJvcjsKIAogICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbGVuOyApIHsKLQlQeV9zc2l6ZV90IGVvbDsKKyAgICAgICAgUHlfc3NpemVfdCBlb2w7CiAKLQkvKiBGaW5kIGEgbGluZSBhbmQgYXBwZW5kIGl0ICovCi0Jd2hpbGUgKGkgPCBsZW4gJiYgZGF0YVtpXSAhPSAnXG4nICYmIGRhdGFbaV0gIT0gJ1xyJykKLQkgICAgaSsrOworICAgICAgICAvKiBGaW5kIGEgbGluZSBhbmQgYXBwZW5kIGl0ICovCisgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIGRhdGFbaV0gIT0gJ1xuJyAmJiBkYXRhW2ldICE9ICdccicpCisgICAgICAgICAgICBpKys7CiAKLQkvKiBTa2lwIHRoZSBsaW5lIGJyZWFrIHJlYWRpbmcgQ1JMRiBhcyBvbmUgbGluZSBicmVhayAqLwotCWVvbCA9IGk7Ci0JaWYgKGkgPCBsZW4pIHsKLQkgICAgaWYgKGRhdGFbaV0gPT0gJ1xyJyAmJiBpICsgMSA8IGxlbiAmJgotCQlkYXRhW2krMV0gPT0gJ1xuJykKLQkJaSArPSAyOwotCSAgICBlbHNlCi0JCWkrKzsKLQkgICAgaWYgKGtlZXBlbmRzKQotCQllb2wgPSBpOwotCX0KLQlfU1RSSU5HTElCX1NQTElUX0FQUEVORChkYXRhLCBqLCBlb2wpOwotCWogPSBpOworICAgICAgICAvKiBTa2lwIHRoZSBsaW5lIGJyZWFrIHJlYWRpbmcgQ1JMRiBhcyBvbmUgbGluZSBicmVhayAqLworICAgICAgICBlb2wgPSBpOworICAgICAgICBpZiAoaSA8IGxlbikgeworICAgICAgICAgICAgaWYgKGRhdGFbaV0gPT0gJ1xyJyAmJiBpICsgMSA8IGxlbiAmJgorICAgICAgICAgICAgICAgIGRhdGFbaSsxXSA9PSAnXG4nKQorICAgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpZiAoa2VlcGVuZHMpCisgICAgICAgICAgICAgICAgZW9sID0gaTsKKyAgICAgICAgfQorICAgICAgICBfU1RSSU5HTElCX1NQTElUX0FQUEVORChkYXRhLCBqLCBlb2wpOworICAgICAgICBqID0gaTsKICAgICB9CiAgICAgaWYgKGogPCBsZW4pIHsKLQlfU1RSSU5HTElCX1NQTElUX0FQUEVORChkYXRhLCBqLCBsZW4pOworICAgICAgICBfU1RSSU5HTElCX1NQTElUX0FQUEVORChkYXRhLCBqLCBsZW4pOwogICAgIH0KIAogICAgIHJldHVybiBsaXN0OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdvYmplY3QuYyBiL09iamVjdHMvc3RyaW5nb2JqZWN0LmMKaW5kZXggOTk2YzI2MC4uOTY3MjJjNSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdvYmplY3QuYworKysgYi9PYmplY3RzL3N0cmluZ29iamVjdC5jCkBAIC01MSwzNTQgKzUxLDM1NCBAQAogUHlPYmplY3QgKgogUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKm9wOwotCWlmIChzaXplIDwgMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCSAgICAiTmVnYXRpdmUgc2l6ZSBwYXNzZWQgdG8gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChzaXplID09IDAgJiYgKG9wID0gbnVsbHN0cmluZykgIT0gTlVMTCkgeworICAgIHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpvcDsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgIk5lZ2F0aXZlIHNpemUgcGFzc2VkIHRvIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAwICYmIChvcCA9IG51bGxzdHJpbmcpICE9IE5VTEwpIHsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkJbnVsbF9zdHJpbmdzKys7CisgICAgICAgIG51bGxfc3RyaW5ncysrOwogI2VuZGlmCi0JCVB5X0lOQ1JFRihvcCk7Ci0JCXJldHVybiAoUHlPYmplY3QgKilvcDsKLQl9Ci0JaWYgKHNpemUgPT0gMSAmJiBzdHIgIT0gTlVMTCAmJgotCSAgICAob3AgPSBjaGFyYWN0ZXJzWypzdHIgJiBVQ0hBUl9NQVhdKSAhPSBOVUxMKQotCXsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW9wOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAxICYmIHN0ciAhPSBOVUxMICYmCisgICAgICAgIChvcCA9IGNoYXJhY3RlcnNbKnN0ciAmIFVDSEFSX01BWF0pICE9IE5VTEwpCisgICAgewogI2lmZGVmIENPVU5UX0FMTE9DUwotCQlvbmVfc3RyaW5ncysrOworICAgICAgICBvbmVfc3RyaW5ncysrOwogI2VuZGlmCi0JCVB5X0lOQ1JFRihvcCk7Ci0JCXJldHVybiAoUHlPYmplY3QgKilvcDsKLQl9CisgICAgICAgIFB5X0lOQ1JFRihvcCk7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilvcDsKKyAgICB9CiAKLQlpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInN0cmluZyBpcyB0b28gbGFyZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBzaXplb2YoUHlTdHJpbmdPYmplY3QpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic3RyaW5nIGlzIHRvbyBsYXJnZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBJbmxpbmUgUHlPYmplY3RfTmV3VmFyICovCi0Jb3AgPSAoUHlTdHJpbmdPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSArIHNpemUpOwotCWlmIChvcCA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlQeU9iamVjdF9JTklUX1ZBUihvcCwgJlB5U3RyaW5nX1R5cGUsIHNpemUpOwotCW9wLT5vYl9zaGFzaCA9IC0xOwotCW9wLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOwotCWlmIChzdHIgIT0gTlVMTCkKLQkJUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBzdHIsIHNpemUpOwotCW9wLT5vYl9zdmFsW3NpemVdID0gJ1wwJzsKLQkvKiBzaGFyZSBzaG9ydCBzdHJpbmdzICovCi0JaWYgKHNpemUgPT0gMCkgewotCQlQeU9iamVjdCAqdCA9IChQeU9iamVjdCAqKW9wOwotCQlQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZ0KTsKLQkJb3AgPSAoUHlTdHJpbmdPYmplY3QgKil0OwotCQludWxsc3RyaW5nID0gb3A7Ci0JCVB5X0lOQ1JFRihvcCk7Ci0JfSBlbHNlIGlmIChzaXplID09IDEgJiYgc3RyICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnQgPSAoUHlPYmplY3QgKilvcDsKLQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdCk7Ci0JCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopdDsKLQkJY2hhcmFjdGVyc1sqc3RyICYgVUNIQVJfTUFYXSA9IG9wOwotCQlQeV9JTkNSRUYob3ApOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIC8qIElubGluZSBQeU9iamVjdF9OZXdWYXIgKi8KKyAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlTdHJpbmdPYmplY3QpICsgc2l6ZSk7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFB5T2JqZWN0X0lOSVRfVkFSKG9wLCAmUHlTdHJpbmdfVHlwZSwgc2l6ZSk7CisgICAgb3AtPm9iX3NoYXNoID0gLTE7CisgICAgb3AtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7CisgICAgaWYgKHN0ciAhPSBOVUxMKQorICAgICAgICBQeV9NRU1DUFkob3AtPm9iX3N2YWwsIHN0ciwgc2l6ZSk7CisgICAgb3AtPm9iX3N2YWxbc2l6ZV0gPSAnXDAnOworICAgIC8qIHNoYXJlIHNob3J0IHN0cmluZ3MgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIFB5T2JqZWN0ICp0ID0gKFB5T2JqZWN0ICopb3A7CisgICAgICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJnQpOworICAgICAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKXQ7CisgICAgICAgIG51bGxzdHJpbmcgPSBvcDsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKKyAgICB9IGVsc2UgaWYgKHNpemUgPT0gMSAmJiBzdHIgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdCA9IChQeU9iamVjdCAqKW9wOworICAgICAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZ0KTsKKyAgICAgICAgb3AgPSAoUHlTdHJpbmdPYmplY3QgKil0OworICAgICAgICBjaGFyYWN0ZXJzWypzdHIgJiBVQ0hBUl9NQVhdID0gb3A7CisgICAgICAgIFB5X0lOQ1JFRihvcCk7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U3RyaW5nX0Zyb21TdHJpbmcoY29uc3QgY2hhciAqc3RyKQogewotCXJlZ2lzdGVyIHNpemVfdCBzaXplOwotCXJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpvcDsKKyAgICByZWdpc3RlciBzaXplX3Qgc2l6ZTsKKyAgICByZWdpc3RlciBQeVN0cmluZ09iamVjdCAqb3A7CiAKLQlhc3NlcnQoc3RyICE9IE5VTEwpOwotCXNpemUgPSBzdHJsZW4oc3RyKTsKLQlpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCSJzdHJpbmcgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHNpemUgPT0gMCAmJiAob3AgPSBudWxsc3RyaW5nKSAhPSBOVUxMKSB7CisgICAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKyAgICBzaXplID0gc3RybGVuKHN0cik7CisgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIHNpemVvZihQeVN0cmluZ09iamVjdCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAic3RyaW5nIGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzaXplID09IDAgJiYgKG9wID0gbnVsbHN0cmluZykgIT0gTlVMTCkgewogI2lmZGVmIENPVU5UX0FMTE9DUwotCQludWxsX3N0cmluZ3MrKzsKKyAgICAgICAgbnVsbF9zdHJpbmdzKys7CiAjZW5kaWYKLQkJUHlfSU5DUkVGKG9wKTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKW9wOwotCX0KLQlpZiAoc2l6ZSA9PSAxICYmIChvcCA9IGNoYXJhY3RlcnNbKnN0ciAmIFVDSEFSX01BWF0pICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW9wOworICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAxICYmIChvcCA9IGNoYXJhY3RlcnNbKnN0ciAmIFVDSEFSX01BWF0pICE9IE5VTEwpIHsKICNpZmRlZiBDT1VOVF9BTExPQ1MKLQkJb25lX3N0cmluZ3MrKzsKKyAgICAgICAgb25lX3N0cmluZ3MrKzsKICNlbmRpZgotCQlQeV9JTkNSRUYob3ApOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopb3A7Ci0JfQorICAgICAgICBQeV9JTkNSRUYob3ApOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopb3A7CisgICAgfQogCi0JLyogSW5saW5lIFB5T2JqZWN0X05ld1ZhciAqLwotCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeVN0cmluZ09iamVjdCkgKyBzaXplKTsKLQlpZiAob3AgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JUHlPYmplY3RfSU5JVF9WQVIob3AsICZQeVN0cmluZ19UeXBlLCBzaXplKTsKLQlvcC0+b2Jfc2hhc2ggPSAtMTsKLQlvcC0+b2Jfc3N0YXRlID0gU1NUQVRFX05PVF9JTlRFUk5FRDsKLQlQeV9NRU1DUFkob3AtPm9iX3N2YWwsIHN0ciwgc2l6ZSsxKTsKLQkvKiBzaGFyZSBzaG9ydCBzdHJpbmdzICovCi0JaWYgKHNpemUgPT0gMCkgewotCQlQeU9iamVjdCAqdCA9IChQeU9iamVjdCAqKW9wOwotCQlQeVN0cmluZ19JbnRlcm5JblBsYWNlKCZ0KTsKLQkJb3AgPSAoUHlTdHJpbmdPYmplY3QgKil0OwotCQludWxsc3RyaW5nID0gb3A7Ci0JCVB5X0lOQ1JFRihvcCk7Ci0JfSBlbHNlIGlmIChzaXplID09IDEpIHsKLQkJUHlPYmplY3QgKnQgPSAoUHlPYmplY3QgKilvcDsKLQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdCk7Ci0JCW9wID0gKFB5U3RyaW5nT2JqZWN0ICopdDsKLQkJY2hhcmFjdGVyc1sqc3RyICYgVUNIQVJfTUFYXSA9IG9wOwotCQlQeV9JTkNSRUYob3ApOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIC8qIElubGluZSBQeU9iamVjdF9OZXdWYXIgKi8KKyAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlTdHJpbmdPYmplY3QpICsgc2l6ZSk7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFB5T2JqZWN0X0lOSVRfVkFSKG9wLCAmUHlTdHJpbmdfVHlwZSwgc2l6ZSk7CisgICAgb3AtPm9iX3NoYXNoID0gLTE7CisgICAgb3AtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7CisgICAgUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBzdHIsIHNpemUrMSk7CisgICAgLyogc2hhcmUgc2hvcnQgc3RyaW5ncyAqLworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgUHlPYmplY3QgKnQgPSAoUHlPYmplY3QgKilvcDsKKyAgICAgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdCk7CisgICAgICAgIG9wID0gKFB5U3RyaW5nT2JqZWN0ICopdDsKKyAgICAgICAgbnVsbHN0cmluZyA9IG9wOworICAgICAgICBQeV9JTkNSRUYob3ApOworICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgIFB5T2JqZWN0ICp0ID0gKFB5T2JqZWN0ICopb3A7CisgICAgICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJnQpOworICAgICAgICBvcCA9IChQeVN0cmluZ09iamVjdCAqKXQ7CisgICAgICAgIGNoYXJhY3RlcnNbKnN0ciAmIFVDSEFSX01BWF0gPSBvcDsKKyAgICAgICAgUHlfSU5DUkVGKG9wKTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogUHlPYmplY3QgKgogUHlTdHJpbmdfRnJvbUZvcm1hdFYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhcmdzKQogewotCXZhX2xpc3QgY291bnQ7Ci0JUHlfc3NpemVfdCBuID0gMDsKLQljb25zdCBjaGFyKiBmOwotCWNoYXIgKnM7Ci0JUHlPYmplY3QqIHN0cmluZzsKKyAgICB2YV9saXN0IGNvdW50OworICAgIFB5X3NzaXplX3QgbiA9IDA7CisgICAgY29uc3QgY2hhciogZjsKKyAgICBjaGFyICpzOworICAgIFB5T2JqZWN0KiBzdHJpbmc7CiAKICNpZmRlZiBWQV9MSVNUX0lTX0FSUkFZCi0JUHlfTUVNQ1BZKGNvdW50LCB2YXJncywgc2l6ZW9mKHZhX2xpc3QpKTsKKyAgICBQeV9NRU1DUFkoY291bnQsIHZhcmdzLCBzaXplb2YodmFfbGlzdCkpOwogI2Vsc2UKICNpZmRlZiAgX192YV9jb3B5Ci0JX192YV9jb3B5KGNvdW50LCB2YXJncyk7CisgICAgX192YV9jb3B5KGNvdW50LCB2YXJncyk7CiAjZWxzZQotCWNvdW50ID0gdmFyZ3M7CisgICAgY291bnQgPSB2YXJnczsKICNlbmRpZgogI2VuZGlmCi0JLyogc3RlcCAxOiBmaWd1cmUgb3V0IGhvdyBsYXJnZSBhIGJ1ZmZlciB3ZSBuZWVkICovCi0JZm9yIChmID0gZm9ybWF0OyAqZjsgZisrKSB7Ci0JCWlmICgqZiA9PSAnJScpIHsKLQkJCWNvbnN0IGNoYXIqIHAgPSBmOwotCQkJd2hpbGUgKCorK2YgJiYgKmYgIT0gJyUnICYmICFpc2FscGhhKFB5X0NIQVJNQVNLKCpmKSkpCi0JCQkJOworICAgIC8qIHN0ZXAgMTogZmlndXJlIG91dCBob3cgbGFyZ2UgYSBidWZmZXIgd2UgbmVlZCAqLworICAgIGZvciAoZiA9IGZvcm1hdDsgKmY7IGYrKykgeworICAgICAgICBpZiAoKmYgPT0gJyUnKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBwID0gZjsKKyAgICAgICAgICAgIHdoaWxlICgqKytmICYmICpmICE9ICclJyAmJiAhaXNhbHBoYShQeV9DSEFSTUFTSygqZikpKQorICAgICAgICAgICAgICAgIDsKIAotCQkJLyogc2tpcCB0aGUgJ2wnIG9yICd6JyBpbiB7JWxkLCAlemQsICVsdSwgJXp1fSBzaW5jZQotCQkJICogdGhleSBkb24ndCBhZmZlY3QgdGhlIGFtb3VudCBvZiBzcGFjZSB3ZSByZXNlcnZlLgotCQkJICovCi0JCQlpZiAoKCpmID09ICdsJyB8fCAqZiA9PSAneicpICYmCi0JCQkJCShmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpCi0JCQkJKytmOworICAgICAgICAgICAgLyogc2tpcCB0aGUgJ2wnIG9yICd6JyBpbiB7JWxkLCAlemQsICVsdSwgJXp1fSBzaW5jZQorICAgICAgICAgICAgICogdGhleSBkb24ndCBhZmZlY3QgdGhlIGFtb3VudCBvZiBzcGFjZSB3ZSByZXNlcnZlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoKCpmID09ICdsJyB8fCAqZiA9PSAneicpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkKKyAgICAgICAgICAgICAgICArK2Y7CiAKLQkJCXN3aXRjaCAoKmYpIHsKLQkJCWNhc2UgJ2MnOgotCQkJCSh2b2lkKXZhX2FyZyhjb3VudCwgaW50KTsKLQkJCQkvKiBmYWxsIHRocm91Z2guLi4gKi8KLQkJCWNhc2UgJyUnOgotCQkJCW4rKzsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ2QnOiBjYXNlICd1JzogY2FzZSAnaSc6IGNhc2UgJ3gnOgotCQkJCSh2b2lkKSB2YV9hcmcoY291bnQsIGludCk7Ci0JCQkJLyogMjAgYnl0ZXMgaXMgZW5vdWdoIHRvIGhvbGQgYSA2NC1iaXQKLQkJCQkgICBpbnRlZ2VyLiAgRGVjaW1hbCB0YWtlcyB0aGUgbW9zdCBzcGFjZS4KLQkJCQkgICBUaGlzIGlzbid0IGVub3VnaCBmb3Igb2N0YWwuICovCi0JCQkJbiArPSAyMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3MnOgotCQkJCXMgPSB2YV9hcmcoY291bnQsIGNoYXIqKTsKLQkJCQluICs9IHN0cmxlbihzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3AnOgotCQkJCSh2b2lkKSB2YV9hcmcoY291bnQsIGludCk7Ci0JCQkJLyogbWF4aW11bSA2NC1iaXQgcG9pbnRlciByZXByZXNlbnRhdGlvbjoKLQkJCQkgKiAweGZmZmZmZmZmZmZmZmZmZmYKLQkJCQkgKiBzbyAxOSBjaGFyYWN0ZXJzIGlzIGVub3VnaC4KLQkJCQkgKiBYWFggSSBjb3VudCAxOCAtLSB3aGF0J3MgdGhlIGV4dHJhIGZvcj8KLQkJCQkgKi8KLQkJCQluICs9IDE5OwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvKiBpZiB3ZSBzdHVtYmxlIHVwb24gYW4gdW5rbm93bgotCQkJCSAgIGZvcm1hdHRpbmcgY29kZSwgY29weSB0aGUgcmVzdCBvZgotCQkJCSAgIHRoZSBmb3JtYXQgc3RyaW5nIHRvIHRoZSBvdXRwdXQKLQkJCQkgICBzdHJpbmcuICh3ZSBjYW5ub3QganVzdCBza2lwIHRoZQotCQkJCSAgIGNvZGUsIHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cKLQkJCQkgICB3aGF0J3MgaW4gdGhlIGFyZ3VtZW50IGxpc3QpICovCi0JCQkJbiArPSBzdHJsZW4ocCk7Ci0JCQkJZ290byBleHBhbmQ7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJbisrOwotCX0KKyAgICAgICAgICAgIHN3aXRjaCAoKmYpIHsKKyAgICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgICAgICh2b2lkKXZhX2FyZyhjb3VudCwgaW50KTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2guLi4gKi8KKyAgICAgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2QnOiBjYXNlICd1JzogY2FzZSAnaSc6IGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoY291bnQsIGludCk7CisgICAgICAgICAgICAgICAgLyogMjAgYnl0ZXMgaXMgZW5vdWdoIHRvIGhvbGQgYSA2NC1iaXQKKyAgICAgICAgICAgICAgICAgICBpbnRlZ2VyLiAgRGVjaW1hbCB0YWtlcyB0aGUgbW9zdCBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICBUaGlzIGlzbid0IGVub3VnaCBmb3Igb2N0YWwuICovCisgICAgICAgICAgICAgICAgbiArPSAyMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgIHMgPSB2YV9hcmcoY291bnQsIGNoYXIqKTsKKyAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoY291bnQsIGludCk7CisgICAgICAgICAgICAgICAgLyogbWF4aW11bSA2NC1iaXQgcG9pbnRlciByZXByZXNlbnRhdGlvbjoKKyAgICAgICAgICAgICAgICAgKiAweGZmZmZmZmZmZmZmZmZmZmYKKyAgICAgICAgICAgICAgICAgKiBzbyAxOSBjaGFyYWN0ZXJzIGlzIGVub3VnaC4KKyAgICAgICAgICAgICAgICAgKiBYWFggSSBjb3VudCAxOCAtLSB3aGF0J3MgdGhlIGV4dHJhIGZvcj8KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBuICs9IDE5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvKiBpZiB3ZSBzdHVtYmxlIHVwb24gYW4gdW5rbm93bgorICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmcgY29kZSwgY29weSB0aGUgcmVzdCBvZgorICAgICAgICAgICAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICBzdHJpbmcuICh3ZSBjYW5ub3QganVzdCBza2lwIHRoZQorICAgICAgICAgICAgICAgICAgIGNvZGUsIHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cKKyAgICAgICAgICAgICAgICAgICB3aGF0J3MgaW4gdGhlIGFyZ3VtZW50IGxpc3QpICovCisgICAgICAgICAgICAgICAgbiArPSBzdHJsZW4ocCk7CisgICAgICAgICAgICAgICAgZ290byBleHBhbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbisrOworICAgIH0KICBleHBhbmQ6Ci0JLyogc3RlcCAyOiBmaWxsIHRoZSBidWZmZXIgKi8KLQkvKiBTaW5jZSB3ZSd2ZSBhbmFseXplZCBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkIGZvciB0aGUgd29yc3QgY2FzZSwKLQkgICB1c2Ugc3ByaW50ZiBkaXJlY3RseSBpbnN0ZWFkIG9mIHRoZSBzbG93ZXIgUHlPU19zbnByaW50Zi4gKi8KLQlzdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAoIXN0cmluZykKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogc3RlcCAyOiBmaWxsIHRoZSBidWZmZXIgKi8KKyAgICAvKiBTaW5jZSB3ZSd2ZSBhbmFseXplZCBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkIGZvciB0aGUgd29yc3QgY2FzZSwKKyAgICAgICB1c2Ugc3ByaW50ZiBkaXJlY3RseSBpbnN0ZWFkIG9mIHRoZSBzbG93ZXIgUHlPU19zbnByaW50Zi4gKi8KKyAgICBzdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAoIXN0cmluZykKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyaW5nKTsKKyAgICBzID0gUHlTdHJpbmdfQXNTdHJpbmcoc3RyaW5nKTsKIAotCWZvciAoZiA9IGZvcm1hdDsgKmY7IGYrKykgewotCQlpZiAoKmYgPT0gJyUnKSB7Ci0JCQljb25zdCBjaGFyKiBwID0gZisrOwotCQkJUHlfc3NpemVfdCBpOwotCQkJaW50IGxvbmdmbGFnID0gMDsKLQkJCWludCBzaXplX3RmbGFnID0gMDsKLQkJCS8qIHBhcnNlIHRoZSB3aWR0aC5wcmVjaXNpb24gcGFydCAod2UncmUgb25seQotCQkJICAgaW50ZXJlc3RlZCBpbiB0aGUgcHJlY2lzaW9uIHZhbHVlLCBpZiBhbnkpICovCi0JCQluID0gMDsKLQkJCXdoaWxlIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCpmKSkpCi0JCQkJbiA9IChuKjEwKSArICpmKysgLSAnMCc7Ci0JCQlpZiAoKmYgPT0gJy4nKSB7Ci0JCQkJZisrOwotCQkJCW4gPSAwOwotCQkJCXdoaWxlIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCpmKSkpCi0JCQkJCW4gPSAobioxMCkgKyAqZisrIC0gJzAnOwotCQkJfQotCQkJd2hpbGUgKCpmICYmICpmICE9ICclJyAmJiAhaXNhbHBoYShQeV9DSEFSTUFTSygqZikpKQotCQkJCWYrKzsKLQkJCS8qIGhhbmRsZSB0aGUgbG9uZyBmbGFnLCBidXQgb25seSBmb3IgJWxkIGFuZCAlbHUuCi0JCQkgICBvdGhlcnMgY2FuIGJlIGFkZGVkIHdoZW4gbmVjZXNzYXJ5LiAqLwotCQkJaWYgKCpmID09ICdsJyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7Ci0JCQkJbG9uZ2ZsYWcgPSAxOwotCQkJCSsrZjsKLQkJCX0KLQkJCS8qIGhhbmRsZSB0aGUgc2l6ZV90IGZsYWcuICovCi0JCQlpZiAoKmYgPT0gJ3onICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKLQkJCQlzaXplX3RmbGFnID0gMTsKLQkJCQkrK2Y7Ci0JCQl9CisgICAgZm9yIChmID0gZm9ybWF0OyAqZjsgZisrKSB7CisgICAgICAgIGlmICgqZiA9PSAnJScpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBmKys7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICBpbnQgbG9uZ2ZsYWcgPSAwOworICAgICAgICAgICAgaW50IHNpemVfdGZsYWcgPSAwOworICAgICAgICAgICAgLyogcGFyc2UgdGhlIHdpZHRoLnByZWNpc2lvbiBwYXJ0ICh3ZSdyZSBvbmx5CisgICAgICAgICAgICAgICBpbnRlcmVzdGVkIGluIHRoZSBwcmVjaXNpb24gdmFsdWUsIGlmIGFueSkgKi8KKyAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgd2hpbGUgKGlzZGlnaXQoUHlfQ0hBUk1BU0soKmYpKSkKKyAgICAgICAgICAgICAgICBuID0gKG4qMTApICsgKmYrKyAtICcwJzsKKyAgICAgICAgICAgIGlmICgqZiA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBmKys7CisgICAgICAgICAgICAgICAgbiA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKGlzZGlnaXQoUHlfQ0hBUk1BU0soKmYpKSkKKyAgICAgICAgICAgICAgICAgICAgbiA9IChuKjEwKSArICpmKysgLSAnMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoKmYgJiYgKmYgIT0gJyUnICYmICFpc2FscGhhKFB5X0NIQVJNQVNLKCpmKSkpCisgICAgICAgICAgICAgICAgZisrOworICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBsb25nIGZsYWcsIGJ1dCBvbmx5IGZvciAlbGQgYW5kICVsdS4KKyAgICAgICAgICAgICAgIG90aGVycyBjYW4gYmUgYWRkZWQgd2hlbiBuZWNlc3NhcnkuICovCisgICAgICAgICAgICBpZiAoKmYgPT0gJ2wnICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKKyAgICAgICAgICAgICAgICBsb25nZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgKytmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZy4gKi8KKyAgICAgICAgICAgIGlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgeworICAgICAgICAgICAgICAgIHNpemVfdGZsYWcgPSAxOworICAgICAgICAgICAgICAgICsrZjsKKyAgICAgICAgICAgIH0KIAotCQkJc3dpdGNoICgqZikgewotCQkJY2FzZSAnYyc6Ci0JCQkJKnMrKyA9IHZhX2FyZyh2YXJncywgaW50KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ2QnOgotCQkJCWlmIChsb25nZmxhZykKLQkJCQkJc3ByaW50ZihzLCAiJWxkIiwgdmFfYXJnKHZhcmdzLCBsb25nKSk7Ci0JCQkJZWxzZSBpZiAoc2l6ZV90ZmxhZykKLQkJCQkJc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCi0JCQkJCSAgICAgICAgdmFfYXJnKHZhcmdzLCBQeV9zc2l6ZV90KSk7Ci0JCQkJZWxzZQotCQkJCQlzcHJpbnRmKHMsICIlZCIsIHZhX2FyZyh2YXJncywgaW50KSk7Ci0JCQkJcyArPSBzdHJsZW4ocyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICd1JzoKLQkJCQlpZiAobG9uZ2ZsYWcpCi0JCQkJCXNwcmludGYocywgIiVsdSIsCi0JCQkJCQl2YV9hcmcodmFyZ3MsIHVuc2lnbmVkIGxvbmcpKTsKLQkJCQllbHNlIGlmIChzaXplX3RmbGFnKQotCQkJCQlzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfU0laRV9UICJ1IiwKLQkJCQkJICAgICAgICB2YV9hcmcodmFyZ3MsIHNpemVfdCkpOwotCQkJCWVsc2UKLQkJCQkJc3ByaW50ZihzLCAiJXUiLAotCQkJCQkJdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBpbnQpKTsKLQkJCQlzICs9IHN0cmxlbihzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ2knOgotCQkJCXNwcmludGYocywgIiVpIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLQkJCQlzICs9IHN0cmxlbihzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3gnOgotCQkJCXNwcmludGYocywgIiV4IiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLQkJCQlzICs9IHN0cmxlbihzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3MnOgotCQkJCXAgPSB2YV9hcmcodmFyZ3MsIGNoYXIqKTsKLQkJCQlpID0gc3RybGVuKHApOwotCQkJCWlmIChuID4gMCAmJiBpID4gbikKLQkJCQkJaSA9IG47Ci0JCQkJUHlfTUVNQ1BZKHMsIHAsIGkpOwotCQkJCXMgKz0gaTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3AnOgotCQkJCXNwcmludGYocywgIiVwIiwgdmFfYXJnKHZhcmdzLCB2b2lkKikpOwotCQkJCS8qICVwIGlzIGlsbC1kZWZpbmVkOiAgZW5zdXJlIGxlYWRpbmcgMHguICovCi0JCQkJaWYgKHNbMV0gPT0gJ1gnKQotCQkJCQlzWzFdID0gJ3gnOwotCQkJCWVsc2UgaWYgKHNbMV0gIT0gJ3gnKSB7Ci0JCQkJCW1lbW1vdmUocysyLCBzLCBzdHJsZW4ocykrMSk7Ci0JCQkJCXNbMF0gPSAnMCc7Ci0JCQkJCXNbMV0gPSAneCc7Ci0JCQkJfQotCQkJCXMgKz0gc3RybGVuKHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJSc6Ci0JCQkJKnMrKyA9ICclJzsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RyY3B5KHMsIHApOwotCQkJCXMgKz0gc3RybGVuKHMpOwotCQkJCWdvdG8gZW5kOwotCQkJfQotCQl9IGVsc2UKLQkJCSpzKysgPSAqZjsKLQl9CisgICAgICAgICAgICBzd2l0Y2ggKCpmKSB7CisgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICAqcysrID0gdmFfYXJnKHZhcmdzLCBpbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgUHlfc3NpemVfdCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJWQiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQorICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlbHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBsb25nKSk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZV90ZmxhZykKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHNpemVfdCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBpbnQpKTsKKyAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVpIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKKyAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgIHNwcmludGYocywgIiV4IiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKKyAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgIHAgPSB2YV9hcmcodmFyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgICAgICBpID0gc3RybGVuKHApOworICAgICAgICAgICAgICAgIGlmIChuID4gMCAmJiBpID4gbikKKyAgICAgICAgICAgICAgICAgICAgaSA9IG47CisgICAgICAgICAgICAgICAgUHlfTUVNQ1BZKHMsIHAsIGkpOworICAgICAgICAgICAgICAgIHMgKz0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVwIiwgdmFfYXJnKHZhcmdzLCB2b2lkKikpOworICAgICAgICAgICAgICAgIC8qICVwIGlzIGlsbC1kZWZpbmVkOiAgZW5zdXJlIGxlYWRpbmcgMHguICovCisgICAgICAgICAgICAgICAgaWYgKHNbMV0gPT0gJ1gnKQorICAgICAgICAgICAgICAgICAgICBzWzFdID0gJ3gnOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNbMV0gIT0gJ3gnKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUocysyLCBzLCBzdHJsZW4ocykrMSk7CisgICAgICAgICAgICAgICAgICAgIHNbMF0gPSAnMCc7CisgICAgICAgICAgICAgICAgICAgIHNbMV0gPSAneCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnJSc6CisgICAgICAgICAgICAgICAgKnMrKyA9ICclJzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc3RyY3B5KHMsIHApOworICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICpzKysgPSAqZjsKKyAgICB9CiAKICBlbmQ6Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmc3RyaW5nLCBzIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cmluZykpOwotCXJldHVybiBzdHJpbmc7CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmc3RyaW5nLCBzIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHN0cmluZykpOworICAgIHJldHVybiBzdHJpbmc7CiB9CiAKIFB5T2JqZWN0ICoKIFB5U3RyaW5nX0Zyb21Gb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JUHlPYmplY3QqIHJldDsKLQl2YV9saXN0IHZhcmdzOworICAgIFB5T2JqZWN0KiByZXQ7CisgICAgdmFfbGlzdCB2YXJnczsKIAogI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKLQl2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKKyAgICB2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKICNlbHNlCi0JdmFfc3RhcnQodmFyZ3MpOworICAgIHZhX3N0YXJ0KHZhcmdzKTsKICNlbmRpZgotCXJldCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXRWKGZvcm1hdCwgdmFyZ3MpOwotCXZhX2VuZCh2YXJncyk7Ci0JcmV0dXJuIHJldDsKKyAgICByZXQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0Vihmb3JtYXQsIHZhcmdzKTsKKyAgICB2YV9lbmQodmFyZ3MpOworICAgIHJldHVybiByZXQ7CiB9CiAKIAogUHlPYmplY3QgKlB5U3RyaW5nX0RlY29kZShjb25zdCBjaGFyICpzLAotCQkJICBQeV9zc2l6ZV90IHNpemUsCi0JCQkgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqdiwgKnN0cjsKIAogICAgIHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIHNpemUpOwogICAgIGlmIChzdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gUHlTdHJpbmdfQXNEZWNvZGVkU3RyaW5nKHN0ciwgZW5jb2RpbmcsIGVycm9ycyk7CiAgICAgUHlfREVDUkVGKHN0cik7CiAgICAgcmV0dXJuIHY7CiB9CiAKIFB5T2JqZWN0ICpQeVN0cmluZ19Bc0RlY29kZWRPYmplY3QoUHlPYmplY3QgKnN0ciwKLQkJCQkgICBjb25zdCBjaGFyICplbmNvZGluZywKLQkJCQkgICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgUHlPYmplY3QgKnY7CiAKICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHN0cikpIHsKLSAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgZ290byBvbkVycm9yOwogICAgIH0KIAogICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVuY29kaW5nID0gUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZygpOworICAgIGVuY29kaW5nID0gUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZygpOwogI2Vsc2UKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIGVuY29kaW5nIHNwZWNpZmllZCIpOwotCWdvdG8gb25FcnJvcjsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm5vIGVuY29kaW5nIHNwZWNpZmllZCIpOworICAgIGdvdG8gb25FcnJvcjsKICNlbmRpZgogICAgIH0KIAogICAgIC8qIERlY29kZSB2aWEgdGhlIGNvZGVjIHJlZ2lzdHJ5ICovCiAgICAgdiA9IFB5Q29kZWNfRGVjb2RlKHN0ciwgZW5jb2RpbmcsIGVycm9ycyk7CiAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGdvdG8gb25FcnJvcjsKIAogICAgIHJldHVybiB2OwogCkBAIC00MDcsMzEgKzQwNywzMSBAQAogfQogCiBQeU9iamVjdCAqUHlTdHJpbmdfQXNEZWNvZGVkU3RyaW5nKFB5T2JqZWN0ICpzdHIsCi0JCQkJICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkJICAgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICp2OwogCiAgICAgdiA9IFB5U3RyaW5nX0FzRGVjb2RlZE9iamVjdChzdHIsIGVuY29kaW5nLCBlcnJvcnMpOwogICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBnb3RvIG9uRXJyb3I7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAgICAgLyogQ29udmVydCBVbmljb2RlIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nICovCiAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCVB5T2JqZWN0ICp0ZW1wID0gdjsKLQl2ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh2LCBOVUxMLCBOVUxMKTsKLQlQeV9ERUNSRUYodGVtcCk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkgICAgZ290byBvbkVycm9yOworICAgIFB5T2JqZWN0ICp0ZW1wID0gdjsKKyAgICB2ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh2LCBOVUxMLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIH0KICNlbmRpZgogICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJkZWNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nIG9iamVjdCAodHlwZT0lLjQwMHMpIiwKLSAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOwotICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAiZGVjb2RlciBkaWQgbm90IHJldHVybiBhIHN0cmluZyBvYmplY3QgKHR5cGU9JS40MDBzKSIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCiAgICAgcmV0dXJuIHY7CkBAIC00NDEsNDQgKzQ0MSw0NCBAQAogfQogCiBQeU9iamVjdCAqUHlTdHJpbmdfRW5jb2RlKGNvbnN0IGNoYXIgKnMsCi0JCQkgIFB5X3NzaXplX3Qgc2l6ZSwKLQkJCSAgY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICp2LCAqc3RyOwogCiAgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgc2l6ZSk7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIHYgPSBQeVN0cmluZ19Bc0VuY29kZWRTdHJpbmcoc3RyLCBlbmNvZGluZywgZXJyb3JzKTsKICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICByZXR1cm4gdjsKIH0KIAogUHlPYmplY3QgKlB5U3RyaW5nX0FzRW5jb2RlZE9iamVjdChQeU9iamVjdCAqc3RyLAotCQkJCSAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJCSAgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICBQeU9iamVjdCAqdjsKIAogICAgIGlmICghUHlTdHJpbmdfQ2hlY2soc3RyKSkgewotICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOwotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKKyAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCiAgICAgaWYgKGVuY29kaW5nID09IE5VTEwpIHsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CisgICAgZW5jb2RpbmcgPSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCk7CiAjZWxzZQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm8gZW5jb2Rpbmcgc3BlY2lmaWVkIik7Ci0JZ290byBvbkVycm9yOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibm8gZW5jb2Rpbmcgc3BlY2lmaWVkIik7CisgICAgZ290byBvbkVycm9yOwogI2VuZGlmCiAgICAgfQogCiAgICAgLyogRW5jb2RlIHZpYSB0aGUgY29kZWMgcmVnaXN0cnkgKi8KICAgICB2ID0gUHlDb2RlY19FbmNvZGUoc3RyLCBlbmNvZGluZywgZXJyb3JzKTsKICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgZ290byBvbkVycm9yOwogCiAgICAgcmV0dXJuIHY7CiAKQEAgLTQ4NywzMSArNDg3LDMxIEBACiB9CiAKIFB5T2JqZWN0ICpQeVN0cmluZ19Bc0VuY29kZWRTdHJpbmcoUHlPYmplY3QgKnN0ciwKLQkJCQkgICBjb25zdCBjaGFyICplbmNvZGluZywKLQkJCQkgICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgUHlPYmplY3QgKnY7CiAKICAgICB2ID0gUHlTdHJpbmdfQXNFbmNvZGVkT2JqZWN0KHN0ciwgZW5jb2RpbmcsIGVycm9ycyk7CiAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGdvdG8gb25FcnJvcjsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKICAgICAvKiBDb252ZXJ0IFVuaWNvZGUgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcgKi8KICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JUHlPYmplY3QgKnRlbXAgPSB2OwotCXYgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHYsIE5VTEwsIE5VTEwpOwotCVB5X0RFQ1JFRih0ZW1wKTsKLQlpZiAodiA9PSBOVUxMKQotCSAgICBnb3RvIG9uRXJyb3I7CisgICAgUHlPYmplY3QgKnRlbXAgPSB2OworICAgIHYgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHYsIE5VTEwsIE5VTEwpOworICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogI2VuZGlmCiAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgImVuY29kZXIgZGlkIG5vdCByZXR1cm4gYSBzdHJpbmcgb2JqZWN0ICh0eXBlPSUuNDAwcykiLAotICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJlbmNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nIG9iamVjdCAodHlwZT0lLjQwMHMpIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7CisgICAgUHlfREVDUkVGKHYpOworICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAKICAgICByZXR1cm4gdjsKQEAgLTUyMywyNSArNTIzLDI1IEBACiBzdGF0aWMgdm9pZAogc3RyaW5nX2RlYWxsb2MoUHlPYmplY3QgKm9wKQogewotCXN3aXRjaCAoUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQob3ApKSB7Ci0JCWNhc2UgU1NUQVRFX05PVF9JTlRFUk5FRDoKLQkJCWJyZWFrOworICAgIHN3aXRjaCAoUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQob3ApKSB7CisgICAgICAgIGNhc2UgU1NUQVRFX05PVF9JTlRFUk5FRDoKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1NUQVRFX0lOVEVSTkVEX01PUlRBTDoKLQkJCS8qIHJldml2ZSBkZWFkIG9iamVjdCB0ZW1wb3JhcmlseSBmb3IgRGVsSXRlbSAqLwotCQkJUHlfUkVGQ05UKG9wKSA9IDM7Ci0JCQlpZiAoUHlEaWN0X0RlbEl0ZW0oaW50ZXJuZWQsIG9wKSAhPSAwKQotCQkJCVB5X0ZhdGFsRXJyb3IoCi0JCQkJCSJkZWxldGlvbiBvZiBpbnRlcm5lZCBzdHJpbmcgZmFpbGVkIik7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBTU1RBVEVfSU5URVJORURfTU9SVEFMOgorICAgICAgICAgICAgLyogcmV2aXZlIGRlYWQgb2JqZWN0IHRlbXBvcmFyaWx5IGZvciBEZWxJdGVtICovCisgICAgICAgICAgICBQeV9SRUZDTlQob3ApID0gMzsKKyAgICAgICAgICAgIGlmIChQeURpY3RfRGVsSXRlbShpbnRlcm5lZCwgb3ApICE9IDApCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImRlbGV0aW9uIG9mIGludGVybmVkIHN0cmluZyBmYWlsZWQiKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1NUQVRFX0lOVEVSTkVEX0lNTU9SVEFMOgotCQkJUHlfRmF0YWxFcnJvcigiSW1tb3J0YWwgaW50ZXJuZWQgc3RyaW5nIGRpZWQuIik7CisgICAgICAgIGNhc2UgU1NUQVRFX0lOVEVSTkVEX0lNTU9SVEFMOgorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiSW1tb3J0YWwgaW50ZXJuZWQgc3RyaW5nIGRpZWQuIik7CiAKLQkJZGVmYXVsdDoKLQkJCVB5X0ZhdGFsRXJyb3IoIkluY29uc2lzdGVudCBpbnRlcm5lZCBzdHJpbmcgc3RhdGUuIik7Ci0JfQotCVB5X1RZUEUob3ApLT50cF9mcmVlKG9wKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkluY29uc2lzdGVudCBpbnRlcm5lZCBzdHJpbmcgc3RhdGUuIik7CisgICAgfQorICAgIFB5X1RZUEUob3ApLT50cF9mcmVlKG9wKTsKIH0KIAogLyogVW5lc2NhcGUgYSBiYWNrc2xhc2gtZXNjYXBlZCBzdHJpbmcuIElmIHVuaWNvZGUgaXMgbm9uLXplcm8sCkBAIC01NTAsMTUzICs1NTAsMTUzIEBACiAgICBzcGVjaWZpZWQgZW5jb2RpbmcuICAqLwogCiBQeU9iamVjdCAqUHlTdHJpbmdfRGVjb2RlRXNjYXBlKGNvbnN0IGNoYXIgKnMsCi0JCQkJUHlfc3NpemVfdCBsZW4sCi0JCQkJY29uc3QgY2hhciAqZXJyb3JzLAotCQkJCVB5X3NzaXplX3QgdW5pY29kZSwKLQkJCQljb25zdCBjaGFyICpyZWNvZGVfZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVjb2RlX2VuY29kaW5nKQogewotCWludCBjOwotCWNoYXIgKnAsICpidWY7Ci0JY29uc3QgY2hhciAqZW5kOwotCVB5T2JqZWN0ICp2OwotCVB5X3NzaXplX3QgbmV3bGVuID0gcmVjb2RlX2VuY29kaW5nID8gNCpsZW46bGVuOwotCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG5ld2xlbik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcCA9IGJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCWVuZCA9IHMgKyBsZW47Ci0Jd2hpbGUgKHMgPCBlbmQpIHsKLQkJaWYgKCpzICE9ICdcXCcpIHsKLQkJICBub25fZXNjOgorICAgIGludCBjOworICAgIGNoYXIgKnAsICpidWY7CisgICAgY29uc3QgY2hhciAqZW5kOworICAgIFB5T2JqZWN0ICp2OworICAgIFB5X3NzaXplX3QgbmV3bGVuID0gcmVjb2RlX2VuY29kaW5nID8gNCpsZW46bGVuOworICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG5ld2xlbik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IGJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgIGVuZCA9IHMgKyBsZW47CisgICAgd2hpbGUgKHMgPCBlbmQpIHsKKyAgICAgICAgaWYgKCpzICE9ICdcXCcpIHsKKyAgICAgICAgICBub25fZXNjOgogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCWlmIChyZWNvZGVfZW5jb2RpbmcgJiYgKCpzICYgMHg4MCkpIHsKLQkJCQlQeU9iamVjdCAqdSwgKnc7Ci0JCQkJY2hhciAqcjsKLQkJCQljb25zdCBjaGFyKiB0OwotCQkJCVB5X3NzaXplX3Qgcm47Ci0JCQkJdCA9IHM7Ci0JCQkJLyogRGVjb2RlIG5vbi1BU0NJSSBieXRlcyBhcyBVVEYtOC4gKi8KLQkJCQl3aGlsZSAodCA8IGVuZCAmJiAoKnQgJiAweDgwKSkgdCsrOwotCQkJCXUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCB0IC0gcywgZXJyb3JzKTsKLQkJCQlpZighdSkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBpZiAocmVjb2RlX2VuY29kaW5nICYmICgqcyAmIDB4ODApKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnUsICp3OworICAgICAgICAgICAgICAgIGNoYXIgKnI7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdDsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHJuOworICAgICAgICAgICAgICAgIHQgPSBzOworICAgICAgICAgICAgICAgIC8qIERlY29kZSBub24tQVNDSUkgYnl0ZXMgYXMgVVRGLTguICovCisgICAgICAgICAgICAgICAgd2hpbGUgKHQgPCBlbmQgJiYgKCp0ICYgMHg4MCkpIHQrKzsKKyAgICAgICAgICAgICAgICB1ID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgdCAtIHMsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgaWYoIXUpIGdvdG8gZmFpbGVkOwogCi0JCQkJLyogUmVjb2RlIHRoZW0gaW4gdGFyZ2V0IGVuY29kaW5nLiAqLwotCQkJCXcgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAotCQkJCQl1LCByZWNvZGVfZW5jb2RpbmcsIGVycm9ycyk7Ci0JCQkJUHlfREVDUkVGKHUpOwotCQkJCWlmICghdykJZ290byBmYWlsZWQ7CisgICAgICAgICAgICAgICAgLyogUmVjb2RlIHRoZW0gaW4gdGFyZ2V0IGVuY29kaW5nLiAqLworICAgICAgICAgICAgICAgIHcgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICB1LCByZWNvZGVfZW5jb2RpbmcsIGVycm9ycyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgICAgIGlmICghdykgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwogCi0JCQkJLyogQXBwZW5kIGJ5dGVzIHRvIG91dHB1dCBidWZmZXIuICovCi0JCQkJYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHcpKTsKLQkJCQlyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHcpOwotCQkJCXJuID0gUHlTdHJpbmdfR0VUX1NJWkUodyk7Ci0JCQkJUHlfTUVNQ1BZKHAsIHIsIHJuKTsKLQkJCQlwICs9IHJuOwotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCQlzID0gdDsKLQkJCX0gZWxzZSB7Ci0JCQkJKnArKyA9ICpzKys7Ci0JCQl9CisgICAgICAgICAgICAgICAgLyogQXBwZW5kIGJ5dGVzIHRvIG91dHB1dCBidWZmZXIuICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHcpKTsKKyAgICAgICAgICAgICAgICByID0gUHlTdHJpbmdfQVNfU1RSSU5HKHcpOworICAgICAgICAgICAgICAgIHJuID0gUHlTdHJpbmdfR0VUX1NJWkUodyk7CisgICAgICAgICAgICAgICAgUHlfTUVNQ1BZKHAsIHIsIHJuKTsKKyAgICAgICAgICAgICAgICBwICs9IHJuOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICBzID0gdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKnArKyA9ICpzKys7CisgICAgICAgICAgICB9CiAjZWxzZQotCQkJKnArKyA9ICpzKys7CisgICAgICAgICAgICAqcCsrID0gKnMrKzsKICNlbmRpZgotCQkJY29udGludWU7Ci0JCX0KLQkJcysrOwotICAgICAgICAgICAgICAgIGlmIChzPT1lbmQpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiVHJhaWxpbmcgXFwgaW4gc3RyaW5nIik7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQotCQlzd2l0Y2ggKCpzKyspIHsKLQkJLyogWFhYIFRoaXMgYXNzdW1lcyBBU0NJSSEgKi8KLQkJY2FzZSAnXG4nOiBicmVhazsKLQkJY2FzZSAnXFwnOiAqcCsrID0gJ1xcJzsgYnJlYWs7Ci0JCWNhc2UgJ1wnJzogKnArKyA9ICdcJyc7IGJyZWFrOwotCQljYXNlICdcIic6ICpwKysgPSAnXCInOyBicmVhazsKLQkJY2FzZSAnYic6ICpwKysgPSAnXGInOyBicmVhazsKLQkJY2FzZSAnZic6ICpwKysgPSAnXDAxNCc7IGJyZWFrOyAvKiBGRiAqLwotCQljYXNlICd0JzogKnArKyA9ICdcdCc7IGJyZWFrOwotCQljYXNlICduJzogKnArKyA9ICdcbic7IGJyZWFrOwotCQljYXNlICdyJzogKnArKyA9ICdccic7IGJyZWFrOwotCQljYXNlICd2JzogKnArKyA9ICdcMDEzJzsgYnJlYWs7IC8qIFZUICovCi0JCWNhc2UgJ2EnOiAqcCsrID0gJ1wwMDcnOyBicmVhazsgLyogQkVMLCBub3QgY2xhc3NpYyBDICovCi0JCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOgotCQljYXNlICc0JzogY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzoKLQkJCWMgPSBzWy0xXSAtICcwJzsKLQkJCWlmIChzIDwgZW5kICYmICcwJyA8PSAqcyAmJiAqcyA8PSAnNycpIHsKLQkJCQljID0gKGM8PDMpICsgKnMrKyAtICcwJzsKLQkJCQlpZiAocyA8IGVuZCAmJiAnMCcgPD0gKnMgJiYgKnMgPD0gJzcnKQotCQkJCQljID0gKGM8PDMpICsgKnMrKyAtICcwJzsKLQkJCX0KLQkJCSpwKysgPSBjOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3gnOgotCQkJaWYgKHMrMSA8IGVuZCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzeGRpZ2l0KFB5X0NIQVJNQVNLKHNbMF0pKSAmJgotCQkJICAgIGlzeGRpZ2l0KFB5X0NIQVJNQVNLKHNbMV0pKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLQkJCQl1bnNpZ25lZCBpbnQgeCA9IDA7Ci0JCQkJYyA9IFB5X0NIQVJNQVNLKCpzKTsKLQkJCQlzKys7Ci0JCQkJaWYgKGlzZGlnaXQoYykpCi0JCQkJCXggPSBjIC0gJzAnOwotCQkJCWVsc2UgaWYgKGlzbG93ZXIoYykpCi0JCQkJCXggPSAxMCArIGMgLSAnYSc7Ci0JCQkJZWxzZQotCQkJCQl4ID0gMTAgKyBjIC0gJ0EnOwotCQkJCXggPSB4IDw8IDQ7Ci0JCQkJYyA9IFB5X0NIQVJNQVNLKCpzKTsKLQkJCQlzKys7Ci0JCQkJaWYgKGlzZGlnaXQoYykpCi0JCQkJCXggKz0gYyAtICcwJzsKLQkJCQllbHNlIGlmIChpc2xvd2VyKGMpKQotCQkJCQl4ICs9IDEwICsgYyAtICdhJzsKLQkJCQllbHNlCi0JCQkJCXggKz0gMTAgKyBjIC0gJ0EnOwotCQkJCSpwKysgPSB4OwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCFlcnJvcnMgfHwgc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJpbnZhbGlkIFxceCBlc2NhcGUiKTsKLQkJCQlnb3RvIGZhaWxlZDsKLQkJCX0KLQkJCWlmIChzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpID09IDApIHsKLQkJCQkqcCsrID0gJz8nOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikgPT0gMCkKLQkJCQkvKiBkbyBub3RoaW5nICovOwotCQkJZWxzZSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSAgICAgImRlY29kaW5nIGVycm9yOyAiCi0JCQkJCSAgICAgInVua25vd24gZXJyb3IgaGFuZGxpbmcgY29kZTogJS40MDBzIiwKLQkJCQkJICAgICBlcnJvcnMpOwotCQkJCWdvdG8gZmFpbGVkOwotCQkJfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcysrOworICAgICAgICBpZiAocz09ZW5kKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhaWxpbmcgXFwgaW4gc3RyaW5nIik7CisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKCpzKyspIHsKKyAgICAgICAgLyogWFhYIFRoaXMgYXNzdW1lcyBBU0NJSSEgKi8KKyAgICAgICAgY2FzZSAnXG4nOiBicmVhazsKKyAgICAgICAgY2FzZSAnXFwnOiAqcCsrID0gJ1xcJzsgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wnJzogKnArKyA9ICdcJyc7IGJyZWFrOworICAgICAgICBjYXNlICdcIic6ICpwKysgPSAnXCInOyBicmVhazsKKyAgICAgICAgY2FzZSAnYic6ICpwKysgPSAnXGInOyBicmVhazsKKyAgICAgICAgY2FzZSAnZic6ICpwKysgPSAnXDAxNCc7IGJyZWFrOyAvKiBGRiAqLworICAgICAgICBjYXNlICd0JzogKnArKyA9ICdcdCc7IGJyZWFrOworICAgICAgICBjYXNlICduJzogKnArKyA9ICdcbic7IGJyZWFrOworICAgICAgICBjYXNlICdyJzogKnArKyA9ICdccic7IGJyZWFrOworICAgICAgICBjYXNlICd2JzogKnArKyA9ICdcMDEzJzsgYnJlYWs7IC8qIFZUICovCisgICAgICAgIGNhc2UgJ2EnOiAqcCsrID0gJ1wwMDcnOyBicmVhazsgLyogQkVMLCBub3QgY2xhc3NpYyBDICovCisgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOgorICAgICAgICBjYXNlICc0JzogY2FzZSAnNSc6IGNhc2UgJzYnOiBjYXNlICc3JzoKKyAgICAgICAgICAgIGMgPSBzWy0xXSAtICcwJzsKKyAgICAgICAgICAgIGlmIChzIDwgZW5kICYmICcwJyA8PSAqcyAmJiAqcyA8PSAnNycpIHsKKyAgICAgICAgICAgICAgICBjID0gKGM8PDMpICsgKnMrKyAtICcwJzsKKyAgICAgICAgICAgICAgICBpZiAocyA8IGVuZCAmJiAnMCcgPD0gKnMgJiYgKnMgPD0gJzcnKQorICAgICAgICAgICAgICAgICAgICBjID0gKGM8PDMpICsgKnMrKyAtICcwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwKysgPSBjOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgaWYgKHMrMSA8IGVuZCAmJgorICAgICAgICAgICAgICAgIGlzeGRpZ2l0KFB5X0NIQVJNQVNLKHNbMF0pKSAmJgorICAgICAgICAgICAgICAgIGlzeGRpZ2l0KFB5X0NIQVJNQVNLKHNbMV0pKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgeCA9IDA7CisgICAgICAgICAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCpzKTsKKyAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICAgICAgaWYgKGlzZGlnaXQoYykpCisgICAgICAgICAgICAgICAgICAgIHggPSBjIC0gJzAnOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzbG93ZXIoYykpCisgICAgICAgICAgICAgICAgICAgIHggPSAxMCArIGMgLSAnYSc7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB4ID0gMTAgKyBjIC0gJ0EnOworICAgICAgICAgICAgICAgIHggPSB4IDw8IDQ7CisgICAgICAgICAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCpzKTsKKyAgICAgICAgICAgICAgICBzKys7CisgICAgICAgICAgICAgICAgaWYgKGlzZGlnaXQoYykpCisgICAgICAgICAgICAgICAgICAgIHggKz0gYyAtICcwJzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpc2xvd2VyKGMpKQorICAgICAgICAgICAgICAgICAgICB4ICs9IDEwICsgYyAtICdhJzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHggKz0gMTAgKyBjIC0gJ0EnOworICAgICAgICAgICAgICAgICpwKysgPSB4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFlcnJvcnMgfHwgc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgXFx4IGVzY2FwZSIpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmNtcChlcnJvcnMsICJyZXBsYWNlIikgPT0gMCkgeworICAgICAgICAgICAgICAgICpwKysgPSAnPyc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSA9PSAwKQorICAgICAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi87CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlY29kaW5nIGVycm9yOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGVycm9yIGhhbmRsaW5nIGNvZGU6ICUuNDAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CiAjaWZuZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJY2FzZSAndSc6Ci0JCWNhc2UgJ1UnOgotCQljYXNlICdOJzoKLQkJCWlmICh1bmljb2RlKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSAgIlVuaWNvZGUgZXNjYXBlcyBub3QgbGVnYWwgIgotCQkJCQkgICJ3aGVuIFVuaWNvZGUgZGlzYWJsZWQiKTsKLQkJCQlnb3RvIGZhaWxlZDsKLQkJCX0KKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgIGNhc2UgJ1UnOgorICAgICAgICBjYXNlICdOJzoKKyAgICAgICAgICAgIGlmICh1bmljb2RlKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmljb2RlIGVzY2FwZXMgbm90IGxlZ2FsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndoZW4gVW5pY29kZSBkaXNhYmxlZCIpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQogI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQkqcCsrID0gJ1xcJzsKLQkJCXMtLTsKLQkJCWdvdG8gbm9uX2VzYzsgLyogYW4gYXJiaXRyeSBudW1iZXIgb2YgdW5lc2NhcGVkCi0JCQkJCSBVVEYtOCBieXRlcyBtYXkgZm9sbG93LiAqLwotCQl9Ci0JfQotCWlmIChwLWJ1ZiA8IG5ld2xlbikKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgcCAtIGJ1Zik7Ci0JcmV0dXJuIHY7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAqcCsrID0gJ1xcJzsKKyAgICAgICAgICAgIHMtLTsKKyAgICAgICAgICAgIGdvdG8gbm9uX2VzYzsgLyogYW4gYXJiaXRyeSBudW1iZXIgb2YgdW5lc2NhcGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURi04IGJ5dGVzIG1heSBmb2xsb3cuICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHAtYnVmIDwgbmV3bGVuKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZ2LCBwIC0gYnVmKTsKKyAgICByZXR1cm4gdjsKICAgZmFpbGVkOgotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03MDUsNzUgKzcwNSw3NSBAQAogc3RhdGljIFB5X3NzaXplX3QKIHN0cmluZ19nZXRzaXplKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCkKIHsKLSAgICAJY2hhciAqczsKLSAgICAJUHlfc3NpemVfdCBsZW47Ci0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShvcCwgJnMsICZsZW4pKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIGxlbjsKKyAgICBjaGFyICpzOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUob3AsICZzLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBsZW47CiB9CiAKIHN0YXRpYyAvKmNvbnN0Ki8gY2hhciAqCiBzdHJpbmdfZ2V0YnVmZmVyKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCkKIHsKLSAgICAJY2hhciAqczsKLSAgICAJUHlfc3NpemVfdCBsZW47Ci0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShvcCwgJnMsICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gczsKKyAgICBjaGFyICpzOworICAgIFB5X3NzaXplX3QgbGVuOworICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUob3AsICZzLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHM7CiB9CiAKIFB5X3NzaXplX3QKIFB5U3RyaW5nX1NpemUocmVnaXN0ZXIgUHlPYmplY3QgKm9wKQogewotCWlmICghUHlTdHJpbmdfQ2hlY2sob3ApKQotCQlyZXR1cm4gc3RyaW5nX2dldHNpemUob3ApOwotCXJldHVybiBQeV9TSVpFKG9wKTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKG9wKSkKKyAgICAgICAgcmV0dXJuIHN0cmluZ19nZXRzaXplKG9wKTsKKyAgICByZXR1cm4gUHlfU0laRShvcCk7CiB9CiAKIC8qY29uc3QqLyBjaGFyICoKIFB5U3RyaW5nX0FzU3RyaW5nKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG9wKSkKLQkJcmV0dXJuIHN0cmluZ19nZXRidWZmZXIob3ApOwotCXJldHVybiAoKFB5U3RyaW5nT2JqZWN0ICopb3ApIC0+IG9iX3N2YWw7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhvcCkpCisgICAgICAgIHJldHVybiBzdHJpbmdfZ2V0YnVmZmVyKG9wKTsKKyAgICByZXR1cm4gKChQeVN0cmluZ09iamVjdCAqKW9wKSAtPiBvYl9zdmFsOwogfQogCiBpbnQKIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShyZWdpc3RlciBQeU9iamVjdCAqb2JqLAotCQkJIHJlZ2lzdGVyIGNoYXIgKipzLAotCQkJIHJlZ2lzdGVyIFB5X3NzaXplX3QgKmxlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjaGFyICoqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBQeV9zc2l6ZV90ICpsZW4pCiB7Ci0JaWYgKHMgPT0gTlVMTCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhvYmopKSB7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhvYmopKSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQlpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKLQkJCW9iaiA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhvYmosIE5VTEwpOwotCQkJaWYgKG9iaiA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlCisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkgeworICAgICAgICAgICAgb2JqID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKG9iaiwgTlVMTCk7CisgICAgICAgICAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQl7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgIgotCQkJCSAgICAgIiUuMjAwcyBmb3VuZCIsIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMgZm91bmQiLCBQeV9UWVBFKG9iaiktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQogCi0JKnMgPSBQeVN0cmluZ19BU19TVFJJTkcob2JqKTsKLQlpZiAobGVuICE9IE5VTEwpCi0JCSpsZW4gPSBQeVN0cmluZ19HRVRfU0laRShvYmopOwotCWVsc2UgaWYgKHN0cmxlbigqcykgIT0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRShvYmopKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImV4cGVjdGVkIHN0cmluZyB3aXRob3V0IG51bGwgYnl0ZXMiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhvYmopOworICAgIGlmIChsZW4gIT0gTlVMTCkKKyAgICAgICAgKmxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKG9iaik7CisgICAgZWxzZSBpZiAoc3RybGVuKCpzKSAhPSAoc2l6ZV90KVB5U3RyaW5nX0dFVF9TSVpFKG9iaikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBzdHJpbmcgd2l0aG91dCBudWxsIGJ5dGVzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03OTQsNTY5ICs3OTQsNTY5IEBACiBzdGF0aWMgaW50CiBzdHJpbmdfcHJpbnQoUHlTdHJpbmdPYmplY3QgKm9wLCBGSUxFICpmcCwgaW50IGZsYWdzKQogewotCVB5X3NzaXplX3QgaSwgc3RyX2xlbjsKLQljaGFyIGM7Ci0JaW50IHF1b3RlOworICAgIFB5X3NzaXplX3QgaSwgc3RyX2xlbjsKKyAgICBjaGFyIGM7CisgICAgaW50IHF1b3RlOwogCi0JLyogWFhYIE91Z2h0IHRvIGNoZWNrIGZvciBpbnRlcnJ1cHRzIHdoZW4gd3JpdGluZyBsb25nIHN0cmluZ3MgKi8KLQlpZiAoISBQeVN0cmluZ19DaGVja0V4YWN0KG9wKSkgewotCQlpbnQgcmV0OwotCQkvKiBBIHN0ciBzdWJjbGFzcyBtYXkgaGF2ZSBpdHMgb3duIF9fc3RyX18gbWV0aG9kLiAqLwotCQlvcCA9IChQeVN0cmluZ09iamVjdCAqKSBQeU9iamVjdF9TdHIoKFB5T2JqZWN0ICopb3ApOwotCQlpZiAob3AgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcmV0ID0gc3RyaW5nX3ByaW50KG9wLCBmcCwgZmxhZ3MpOwotCQlQeV9ERUNSRUYob3ApOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpZiAoZmxhZ3MgJiBQeV9QUklOVF9SQVcpIHsKLQkJY2hhciAqZGF0YSA9IG9wLT5vYl9zdmFsOwotCQlQeV9zc2l6ZV90IHNpemUgPSBQeV9TSVpFKG9wKTsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQl3aGlsZSAoc2l6ZSA+IElOVF9NQVgpIHsKLQkJCS8qIFZlcnkgbG9uZyBzdHJpbmdzIGNhbm5vdCBiZSB3cml0dGVuIGF0b21pY2FsbHkuCi0JCQkgKiBCdXQgZG9uJ3Qgd3JpdGUgZXhhY3RseSBJTlRfTUFYIGJ5dGVzIGF0IGEgdGltZQotCQkJICogdG8gYXZvaWQgbWVtb3J5IGFsaWdtZW50IGlzc3Vlcy4KLQkJCSAqLwotCQkJY29uc3QgaW50IGNodW5rX3NpemUgPSBJTlRfTUFYICYgfjB4M0ZGRjsKLQkJCWZ3cml0ZShkYXRhLCAxLCBjaHVua19zaXplLCBmcCk7Ci0JCQlkYXRhICs9IGNodW5rX3NpemU7Ci0JCQlzaXplIC09IGNodW5rX3NpemU7Ci0JCX0KKyAgICAvKiBYWFggT3VnaHQgdG8gY2hlY2sgZm9yIGludGVycnVwdHMgd2hlbiB3cml0aW5nIGxvbmcgc3RyaW5ncyAqLworICAgIGlmICghIFB5U3RyaW5nX0NoZWNrRXhhY3Qob3ApKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIC8qIEEgc3RyIHN1YmNsYXNzIG1heSBoYXZlIGl0cyBvd24gX19zdHJfXyBtZXRob2QuICovCisgICAgICAgIG9wID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5T2JqZWN0X1N0cigoUHlPYmplY3QgKilvcCk7CisgICAgICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXQgPSBzdHJpbmdfcHJpbnQob3AsIGZwLCBmbGFncyk7CisgICAgICAgIFB5X0RFQ1JFRihvcCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChmbGFncyAmIFB5X1BSSU5UX1JBVykgeworICAgICAgICBjaGFyICpkYXRhID0gb3AtPm9iX3N2YWw7CisgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSA9IFB5X1NJWkUob3ApOworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIHdoaWxlIChzaXplID4gSU5UX01BWCkgeworICAgICAgICAgICAgLyogVmVyeSBsb25nIHN0cmluZ3MgY2Fubm90IGJlIHdyaXR0ZW4gYXRvbWljYWxseS4KKyAgICAgICAgICAgICAqIEJ1dCBkb24ndCB3cml0ZSBleGFjdGx5IElOVF9NQVggYnl0ZXMgYXQgYSB0aW1lCisgICAgICAgICAgICAgKiB0byBhdm9pZCBtZW1vcnkgYWxpZ21lbnQgaXNzdWVzLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjb25zdCBpbnQgY2h1bmtfc2l6ZSA9IElOVF9NQVggJiB+MHgzRkZGOworICAgICAgICAgICAgZndyaXRlKGRhdGEsIDEsIGNodW5rX3NpemUsIGZwKTsKKyAgICAgICAgICAgIGRhdGEgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIHNpemUgLT0gY2h1bmtfc2l6ZTsKKyAgICAgICAgfQogI2lmZGVmIF9fVk1TCi0gICAgICAgICAgICAgICAgaWYgKHNpemUpIGZ3cml0ZShkYXRhLCAoaW50KXNpemUsIDEsIGZwKTsKKyAgICAgICAgaWYgKHNpemUpIGZ3cml0ZShkYXRhLCAoaW50KXNpemUsIDEsIGZwKTsKICNlbHNlCi0gICAgICAgICAgICAgICAgZndyaXRlKGRhdGEsIDEsIChpbnQpc2l6ZSwgZnApOworICAgICAgICBmd3JpdGUoZGF0YSwgMSwgKGludClzaXplLCBmcCk7CiAjZW5kaWYKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBmaWd1cmUgb3V0IHdoaWNoIHF1b3RlIHRvIHVzZTsgc2luZ2xlIGlzIHByZWZlcnJlZCAqLwotCXF1b3RlID0gJ1wnJzsKLQlpZiAobWVtY2hyKG9wLT5vYl9zdmFsLCAnXCcnLCBQeV9TSVpFKG9wKSkgJiYKLQkgICAgIW1lbWNocihvcC0+b2Jfc3ZhbCwgJyInLCBQeV9TSVpFKG9wKSkpCi0JCXF1b3RlID0gJyInOworICAgIC8qIGZpZ3VyZSBvdXQgd2hpY2ggcXVvdGUgdG8gdXNlOyBzaW5nbGUgaXMgcHJlZmVycmVkICovCisgICAgcXVvdGUgPSAnXCcnOworICAgIGlmIChtZW1jaHIob3AtPm9iX3N2YWwsICdcJycsIFB5X1NJWkUob3ApKSAmJgorICAgICAgICAhbWVtY2hyKG9wLT5vYl9zdmFsLCAnIicsIFB5X1NJWkUob3ApKSkKKyAgICAgICAgcXVvdGUgPSAnIic7CiAKLQlzdHJfbGVuID0gUHlfU0laRShvcCk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwdXRjKHF1b3RlLCBmcCk7Ci0JZm9yIChpID0gMDsgaSA8IHN0cl9sZW47IGkrKykgewotCQkvKiBTaW5jZSBzdHJpbmdzIGFyZSBpbW11dGFibGUgYW5kIHRoZSBjYWxsZXIgc2hvdWxkIGhhdmUgYQotCQlyZWZlcmVuY2UsIGFjY2Vzc2luZyB0aGUgaW50ZXJhbCBidWZmZXIgc2hvdWxkIG5vdCBiZSBhbiBpc3N1ZQotCQl3aXRoIHRoZSBHSUwgcmVsZWFzZWQuICovCi0JCWMgPSBvcC0+b2Jfc3ZhbFtpXTsKLQkJaWYgKGMgPT0gcXVvdGUgfHwgYyA9PSAnXFwnKQotCQkJZnByaW50ZihmcCwgIlxcJWMiLCBjKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdcdCcpCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXFx0Iik7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlxcbiIpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1xyJykKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcXHIiKTsKLQkJZWxzZSBpZiAoYyA8ICcgJyB8fCBjID49IDB4N2YpCi0JCQlmcHJpbnRmKGZwLCAiXFx4JTAyeCIsIGMgJiAweGZmKTsKLQkJZWxzZQotCQkJZnB1dGMoYywgZnApOwotCX0KLQlmcHV0YyhxdW90ZSwgZnApOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JcmV0dXJuIDA7CisgICAgc3RyX2xlbiA9IFB5X1NJWkUob3ApOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBmcHV0YyhxdW90ZSwgZnApOworICAgIGZvciAoaSA9IDA7IGkgPCBzdHJfbGVuOyBpKyspIHsKKyAgICAgICAgLyogU2luY2Ugc3RyaW5ncyBhcmUgaW1tdXRhYmxlIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBoYXZlIGEKKyAgICAgICAgcmVmZXJlbmNlLCBhY2Nlc3NpbmcgdGhlIGludGVyYWwgYnVmZmVyIHNob3VsZCBub3QgYmUgYW4gaXNzdWUKKyAgICAgICAgd2l0aCB0aGUgR0lMIHJlbGVhc2VkLiAqLworICAgICAgICBjID0gb3AtPm9iX3N2YWxbaV07CisgICAgICAgIGlmIChjID09IHF1b3RlIHx8IGMgPT0gJ1xcJykKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcXCVjIiwgYyk7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1x0JykKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcXHQiKTsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgZnByaW50ZihmcCwgIlxcbiIpOworICAgICAgICBlbHNlIGlmIChjID09ICdccicpCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXFxyIik7CisgICAgICAgIGVsc2UgaWYgKGMgPCAnICcgfHwgYyA+PSAweDdmKQorICAgICAgICAgICAgZnByaW50ZihmcCwgIlxceCUwMngiLCBjICYgMHhmZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZwdXRjKGMsIGZwKTsKKyAgICB9CisgICAgZnB1dGMocXVvdGUsIGZwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHJldHVybiAwOwogfQogCiBQeU9iamVjdCAqCiBQeVN0cmluZ19SZXByKFB5T2JqZWN0ICpvYmosIGludCBzbWFydHF1b3RlcykKIHsKLQlyZWdpc3RlciBQeVN0cmluZ09iamVjdCogb3AgPSAoUHlTdHJpbmdPYmplY3QqKSBvYmo7Ci0Jc2l6ZV90IG5ld3NpemUgPSAyICsgNCAqIFB5X1NJWkUob3ApOwotCVB5T2JqZWN0ICp2OwotCWlmIChuZXdzaXplID4gUFlfU1NJWkVfVF9NQVggfHwgbmV3c2l6ZSAvIDQgIT0gUHlfU0laRShvcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkic3RyaW5nIGlzIHRvbyBsYXJnZSB0byBtYWtlIHJlcHIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbmV3c2l6ZSk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQkJcmVnaXN0ZXIgY2hhciBjOwotCQlyZWdpc3RlciBjaGFyICpwOwotCQlpbnQgcXVvdGU7CisgICAgcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QqIG9wID0gKFB5U3RyaW5nT2JqZWN0Kikgb2JqOworICAgIHNpemVfdCBuZXdzaXplID0gMiArIDQgKiBQeV9TSVpFKG9wKTsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAobmV3c2l6ZSA+IFBZX1NTSVpFX1RfTUFYIHx8IG5ld3NpemUgLyA0ICE9IFB5X1NJWkUob3ApKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInN0cmluZyBpcyB0b28gbGFyZ2UgdG8gbWFrZSByZXByIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuZXdzaXplKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBpOworICAgICAgICByZWdpc3RlciBjaGFyIGM7CisgICAgICAgIHJlZ2lzdGVyIGNoYXIgKnA7CisgICAgICAgIGludCBxdW90ZTsKIAotCQkvKiBmaWd1cmUgb3V0IHdoaWNoIHF1b3RlIHRvIHVzZTsgc2luZ2xlIGlzIHByZWZlcnJlZCAqLwotCQlxdW90ZSA9ICdcJyc7Ci0JCWlmIChzbWFydHF1b3RlcyAmJgotCQkgICAgbWVtY2hyKG9wLT5vYl9zdmFsLCAnXCcnLCBQeV9TSVpFKG9wKSkgJiYKLQkJICAgICFtZW1jaHIob3AtPm9iX3N2YWwsICciJywgUHlfU0laRShvcCkpKQotCQkJcXVvdGUgPSAnIic7CisgICAgICAgIC8qIGZpZ3VyZSBvdXQgd2hpY2ggcXVvdGUgdG8gdXNlOyBzaW5nbGUgaXMgcHJlZmVycmVkICovCisgICAgICAgIHF1b3RlID0gJ1wnJzsKKyAgICAgICAgaWYgKHNtYXJ0cXVvdGVzICYmCisgICAgICAgICAgICBtZW1jaHIob3AtPm9iX3N2YWwsICdcJycsIFB5X1NJWkUob3ApKSAmJgorICAgICAgICAgICAgIW1lbWNocihvcC0+b2Jfc3ZhbCwgJyInLCBQeV9TSVpFKG9wKSkpCisgICAgICAgICAgICBxdW90ZSA9ICciJzsKIAotCQlwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpOwotCQkqcCsrID0gcXVvdGU7Ci0JCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKG9wKTsgaSsrKSB7Ci0JCQkvKiBUaGVyZSdzIGF0IGxlYXN0IGVub3VnaCByb29tIGZvciBhIGhleCBlc2NhcGUKLQkJCSAgIGFuZCBhIGNsb3NpbmcgcXVvdGUuICovCi0JCQlhc3NlcnQobmV3c2l6ZSAtIChwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpKSA+PSA1KTsKLQkJCWMgPSBvcC0+b2Jfc3ZhbFtpXTsKLQkJCWlmIChjID09IHF1b3RlIHx8IGMgPT0gJ1xcJykKLQkJCQkqcCsrID0gJ1xcJywgKnArKyA9IGM7Ci0JCQllbHNlIGlmIChjID09ICdcdCcpCi0JCQkJKnArKyA9ICdcXCcsICpwKysgPSAndCc7Ci0JCQllbHNlIGlmIChjID09ICdcbicpCi0JCQkJKnArKyA9ICdcXCcsICpwKysgPSAnbic7Ci0JCQllbHNlIGlmIChjID09ICdccicpCi0JCQkJKnArKyA9ICdcXCcsICpwKysgPSAncic7Ci0JCQllbHNlIGlmIChjIDwgJyAnIHx8IGMgPj0gMHg3ZikgewotCQkJCS8qIEZvciBwZXJmb3JtYW5jZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsCi0JCQkJICAgUHlPU19zbnByaW50ZiBoZXJlIChleHRyYSBsYXllcnMgb2YKLQkJCQkgICBmdW5jdGlvbiBjYWxsKS4gKi8KLQkJCQlzcHJpbnRmKHAsICJcXHglMDJ4IiwgYyAmIDB4ZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IDQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJKnArKyA9IGM7Ci0JCX0KLQkJYXNzZXJ0KG5ld3NpemUgLSAocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSkgPj0gMSk7Ci0JCSpwKysgPSBxdW90ZTsKLQkJKnAgPSAnXDAnOwotCQlfUHlTdHJpbmdfUmVzaXplKAotCQkJJnYsIChwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpKSk7Ci0JCXJldHVybiB2OwotCX0KKyAgICAgICAgcCA9IFB5U3RyaW5nX0FTX1NUUklORyh2KTsKKyAgICAgICAgKnArKyA9IHF1b3RlOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShvcCk7IGkrKykgeworICAgICAgICAgICAgLyogVGhlcmUncyBhdCBsZWFzdCBlbm91Z2ggcm9vbSBmb3IgYSBoZXggZXNjYXBlCisgICAgICAgICAgICAgICBhbmQgYSBjbG9zaW5nIHF1b3RlLiAqLworICAgICAgICAgICAgYXNzZXJ0KG5ld3NpemUgLSAocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSkgPj0gNSk7CisgICAgICAgICAgICBjID0gb3AtPm9iX3N2YWxbaV07CisgICAgICAgICAgICBpZiAoYyA9PSBxdW90ZSB8fCBjID09ICdcXCcpCisgICAgICAgICAgICAgICAgKnArKyA9ICdcXCcsICpwKysgPSBjOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHQnKQorICAgICAgICAgICAgICAgICpwKysgPSAnXFwnLCAqcCsrID0gJ3QnOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXG4nKQorICAgICAgICAgICAgICAgICpwKysgPSAnXFwnLCAqcCsrID0gJ24nOworICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXHInKQorICAgICAgICAgICAgICAgICpwKysgPSAnXFwnLCAqcCsrID0gJ3InOworICAgICAgICAgICAgZWxzZSBpZiAoYyA8ICcgJyB8fCBjID49IDB4N2YpIHsKKyAgICAgICAgICAgICAgICAvKiBGb3IgcGVyZm9ybWFuY2UsIHdlIGRvbid0IHdhbnQgdG8gY2FsbAorICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYgaGVyZSAoZXh0cmEgbGF5ZXJzIG9mCisgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2FsbCkuICovCisgICAgICAgICAgICAgICAgc3ByaW50ZihwLCAiXFx4JTAyeCIsIGMgJiAweGZmKTsKKyAgICAgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKnArKyA9IGM7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KG5ld3NpemUgLSAocCAtIFB5U3RyaW5nX0FTX1NUUklORyh2KSkgPj0gMSk7CisgICAgICAgICpwKysgPSBxdW90ZTsKKyAgICAgICAgKnAgPSAnXDAnOworICAgICAgICBfUHlTdHJpbmdfUmVzaXplKAorICAgICAgICAgICAgJnYsIChwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpKSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19yZXByKFB5T2JqZWN0ICpvcCkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfUmVwcihvcCwgMSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX1JlcHIob3AsIDEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3N0cihQeU9iamVjdCAqcykKIHsKLQlhc3NlcnQoUHlTdHJpbmdfQ2hlY2socykpOwotCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHMpKSB7Ci0JCVB5X0lOQ1JFRihzKTsKLQkJcmV0dXJuIHM7Ci0JfQotCWVsc2UgewotCQkvKiBTdWJ0eXBlIC0tIHJldHVybiBnZW51aW5lIHN0cmluZyB3aXRoIHRoZSBzYW1lIHZhbHVlLiAqLwotCQlQeVN0cmluZ09iamVjdCAqdCA9IChQeVN0cmluZ09iamVjdCAqKSBzOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodC0+b2Jfc3ZhbCwgUHlfU0laRSh0KSk7Ci0JfQorICAgIGFzc2VydChQeVN0cmluZ19DaGVjayhzKSk7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QocykpIHsKKyAgICAgICAgUHlfSU5DUkVGKHMpOworICAgICAgICByZXR1cm4gczsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFN1YnR5cGUgLS0gcmV0dXJuIGdlbnVpbmUgc3RyaW5nIHdpdGggdGhlIHNhbWUgdmFsdWUuICovCisgICAgICAgIFB5U3RyaW5nT2JqZWN0ICp0ID0gKFB5U3RyaW5nT2JqZWN0ICopIHM7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh0LT5vYl9zdmFsLCBQeV9TSVpFKHQpKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBzdHJpbmdfbGVuZ3RoKFB5U3RyaW5nT2JqZWN0ICphKQogewotCXJldHVybiBQeV9TSVpFKGEpOworICAgIHJldHVybiBQeV9TSVpFKGEpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2NvbmNhdChyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqYSwgcmVnaXN0ZXIgUHlPYmplY3QgKmJiKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3Qgc2l6ZTsKLQlyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqb3A7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayhiYikpIHsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IHNpemU7CisgICAgcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKm9wOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2soYmIpKSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQlpZiAoUHlVbmljb2RlX0NoZWNrKGJiKSkKLQkJICAgIHJldHVybiBQeVVuaWNvZGVfQ29uY2F0KChQeU9iamVjdCAqKWEsIGJiKTsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhiYikpCisgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0NvbmNhdCgoUHlPYmplY3QgKilhLCBiYik7CiAjZW5kaWYKLQkJaWYgKFB5Qnl0ZUFycmF5X0NoZWNrKGJiKSkKLQkJICAgIHJldHVybiBQeUJ5dGVBcnJheV9Db25jYXQoKFB5T2JqZWN0ICopYSwgYmIpOwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY2Fubm90IGNvbmNhdGVuYXRlICdzdHInIGFuZCAnJS4yMDBzJyBvYmplY3RzIiwKLQkJCSAgICAgUHlfVFlQRShiYiktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIGlmIChQeUJ5dGVBcnJheV9DaGVjayhiYikpCisgICAgICAgICAgICByZXR1cm4gUHlCeXRlQXJyYXlfQ29uY2F0KChQeU9iamVjdCAqKWEsIGJiKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY29uY2F0ZW5hdGUgJ3N0cicgYW5kICclLjIwMHMnIG9iamVjdHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShiYiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZGVmaW5lIGIgKChQeVN0cmluZ09iamVjdCAqKWJiKQotCS8qIE9wdGltaXplIGNhc2VzIHdpdGggZW1wdHkgbGVmdCBvciByaWdodCBvcGVyYW5kICovCi0JaWYgKChQeV9TSVpFKGEpID09IDAgfHwgUHlfU0laRShiKSA9PSAwKSAmJgotCSAgICBQeVN0cmluZ19DaGVja0V4YWN0KGEpICYmIFB5U3RyaW5nX0NoZWNrRXhhY3QoYikpIHsKLQkJaWYgKFB5X1NJWkUoYSkgPT0gMCkgewotCQkJUHlfSU5DUkVGKGJiKTsKLQkJCXJldHVybiBiYjsKLQkJfQotCQlQeV9JTkNSRUYoYSk7Ci0JCXJldHVybiAoUHlPYmplY3QgKilhOwotCX0KLQlzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7Ci0JLyogQ2hlY2sgdGhhdCBzdHJpbmcgc2l6ZXMgYXJlIG5vdCBuZWdhdGl2ZSwgdG8gcHJldmVudCBhbgotCSAgIG92ZXJmbG93IGluIGNhc2VzIHdoZXJlIHdlIGFyZSBwYXNzZWQgaW5jb3JyZWN0bHktY3JlYXRlZAotCSAgIHN0cmluZ3Mgd2l0aCBuZWdhdGl2ZSBsZW5ndGhzIChkdWUgdG8gYSBidWcgaW4gb3RoZXIgY29kZSkuCi0gICAgICAgICovCi0JaWYgKFB5X1NJWkUoYSkgPCAwIHx8IFB5X1NJWkUoYikgPCAwIHx8Ci0JICAgIFB5X1NJWkUoYSkgPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoYikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInN0cmluZ3MgYXJlIHRvbyBsYXJnZSB0byBjb25jYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSAgCi0JLyogSW5saW5lIFB5T2JqZWN0X05ld1ZhciAqLwotCWlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBzaXplb2YoUHlTdHJpbmdPYmplY3QpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJzdHJpbmdzIGFyZSB0b28gbGFyZ2UgdG8gY29uY2F0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvcCA9IChQeVN0cmluZ09iamVjdCAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlTdHJpbmdPYmplY3QpICsgc2l6ZSk7Ci0JaWYgKG9wID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCVB5T2JqZWN0X0lOSVRfVkFSKG9wLCAmUHlTdHJpbmdfVHlwZSwgc2l6ZSk7Ci0Jb3AtPm9iX3NoYXNoID0gLTE7Ci0Jb3AtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7Ci0JUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBhLT5vYl9zdmFsLCBQeV9TSVpFKGEpKTsKLQlQeV9NRU1DUFkob3AtPm9iX3N2YWwgKyBQeV9TSVpFKGEpLCBiLT5vYl9zdmFsLCBQeV9TSVpFKGIpKTsKLQlvcC0+b2Jfc3ZhbFtzaXplXSA9ICdcMCc7Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICAvKiBPcHRpbWl6ZSBjYXNlcyB3aXRoIGVtcHR5IGxlZnQgb3IgcmlnaHQgb3BlcmFuZCAqLworICAgIGlmICgoUHlfU0laRShhKSA9PSAwIHx8IFB5X1NJWkUoYikgPT0gMCkgJiYKKyAgICAgICAgUHlTdHJpbmdfQ2hlY2tFeGFjdChhKSAmJiBQeVN0cmluZ19DaGVja0V4YWN0KGIpKSB7CisgICAgICAgIGlmIChQeV9TSVpFKGEpID09IDApIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihiYik7CisgICAgICAgICAgICByZXR1cm4gYmI7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKGEpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopYTsKKyAgICB9CisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKyBQeV9TSVpFKGIpOworICAgIC8qIENoZWNrIHRoYXQgc3RyaW5nIHNpemVzIGFyZSBub3QgbmVnYXRpdmUsIHRvIHByZXZlbnQgYW4KKyAgICAgICBvdmVyZmxvdyBpbiBjYXNlcyB3aGVyZSB3ZSBhcmUgcGFzc2VkIGluY29ycmVjdGx5LWNyZWF0ZWQKKyAgICAgICBzdHJpbmdzIHdpdGggbmVnYXRpdmUgbGVuZ3RocyAoZHVlIHRvIGEgYnVnIGluIG90aGVyIGNvZGUpLgorICAgICovCisgICAgaWYgKFB5X1NJWkUoYSkgPCAwIHx8IFB5X1NJWkUoYikgPCAwIHx8CisgICAgICAgIFB5X1NJWkUoYSkgPiBQWV9TU0laRV9UX01BWCAtIFB5X1NJWkUoYikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5ncyBhcmUgdG9vIGxhcmdlIHRvIGNvbmNhdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvKiBJbmxpbmUgUHlPYmplY3RfTmV3VmFyICovCisgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIHNpemVvZihQeVN0cmluZ09iamVjdCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5ncyBhcmUgdG9vIGxhcmdlIHRvIGNvbmNhdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb3AgPSAoUHlTdHJpbmdPYmplY3QgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSArIHNpemUpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeU9iamVjdF9JTklUX1ZBUihvcCwgJlB5U3RyaW5nX1R5cGUsIHNpemUpOworICAgIG9wLT5vYl9zaGFzaCA9IC0xOworICAgIG9wLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOworICAgIFB5X01FTUNQWShvcC0+b2Jfc3ZhbCwgYS0+b2Jfc3ZhbCwgUHlfU0laRShhKSk7CisgICAgUHlfTUVNQ1BZKG9wLT5vYl9zdmFsICsgUHlfU0laRShhKSwgYi0+b2Jfc3ZhbCwgUHlfU0laRShiKSk7CisgICAgb3AtPm9iX3N2YWxbc2l6ZV0gPSAnXDAnOworICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiAjdW5kZWYgYgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JlcGVhdChyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqYSwgcmVnaXN0ZXIgUHlfc3NpemVfdCBuKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGo7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBzaXplOwotCXJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpvcDsKLQlzaXplX3QgbmJ5dGVzOwotCWlmIChuIDwgMCkKLQkJbiA9IDA7Ci0JLyogd2F0Y2ggb3V0IGZvciBvdmVyZmxvd3M6ICB0aGUgc2l6ZSBjYW4gb3ZlcmZsb3cgaW50LAotCSAqIGFuZCB0aGUgIyBvZiBieXRlcyBuZWVkZWQgY2FuIG92ZXJmbG93IHNpemVfdAotCSAqLwotCXNpemUgPSBQeV9TSVpFKGEpICogbjsKLQlpZiAobiAmJiBzaXplIC8gbiAhPSBQeV9TSVpFKGEpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInJlcGVhdGVkIHN0cmluZyBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHNpemUgPT0gUHlfU0laRShhKSAmJiBQeVN0cmluZ19DaGVja0V4YWN0KGEpKSB7Ci0JCVB5X0lOQ1JFRihhKTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKWE7Ci0JfQotCW5ieXRlcyA9IChzaXplX3Qpc2l6ZTsKLQlpZiAobmJ5dGVzICsgc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSA8PSBuYnl0ZXMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkicmVwZWF0ZWQgc3RyaW5nIGlzIHRvbyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvcCA9IChQeVN0cmluZ09iamVjdCAqKQotCQlQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSArIG5ieXRlcyk7Ci0JaWYgKG9wID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCVB5T2JqZWN0X0lOSVRfVkFSKG9wLCAmUHlTdHJpbmdfVHlwZSwgc2l6ZSk7Ci0Jb3AtPm9iX3NoYXNoID0gLTE7Ci0Jb3AtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7Ci0Jb3AtPm9iX3N2YWxbc2l6ZV0gPSAnXDAnOwotCWlmIChQeV9TSVpFKGEpID09IDEgJiYgbiA+IDApIHsKLQkJbWVtc2V0KG9wLT5vYl9zdmFsLCBhLT5vYl9zdmFsWzBdICwgbik7Ci0JCXJldHVybiAoUHlPYmplY3QgKikgb3A7Ci0JfQotCWkgPSAwOwotCWlmIChpIDwgc2l6ZSkgewotCQlQeV9NRU1DUFkob3AtPm9iX3N2YWwsIGEtPm9iX3N2YWwsIFB5X1NJWkUoYSkpOwotCQlpID0gUHlfU0laRShhKTsKLQl9Ci0Jd2hpbGUgKGkgPCBzaXplKSB7Ci0JCWogPSAoaSA8PSBzaXplLWkpICA/ICBpICA6ICBzaXplLWk7Ci0JCVB5X01FTUNQWShvcC0+b2Jfc3ZhbCtpLCBvcC0+b2Jfc3ZhbCwgaik7Ci0JCWkgKz0gajsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGk7CisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBqOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICByZWdpc3RlciBQeVN0cmluZ09iamVjdCAqb3A7CisgICAgc2l6ZV90IG5ieXRlczsKKyAgICBpZiAobiA8IDApCisgICAgICAgIG4gPSAwOworICAgIC8qIHdhdGNoIG91dCBmb3Igb3ZlcmZsb3dzOiAgdGhlIHNpemUgY2FuIG92ZXJmbG93IGludCwKKyAgICAgKiBhbmQgdGhlICMgb2YgYnl0ZXMgbmVlZGVkIGNhbiBvdmVyZmxvdyBzaXplX3QKKyAgICAgKi8KKyAgICBzaXplID0gUHlfU0laRShhKSAqIG47CisgICAgaWYgKG4gJiYgc2l6ZSAvIG4gIT0gUHlfU0laRShhKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJyZXBlYXRlZCBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzaXplID09IFB5X1NJWkUoYSkgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChhKSkgeworICAgICAgICBQeV9JTkNSRUYoYSk7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilhOworICAgIH0KKyAgICBuYnl0ZXMgPSAoc2l6ZV90KXNpemU7CisgICAgaWYgKG5ieXRlcyArIHNpemVvZihQeVN0cmluZ09iamVjdCkgPD0gbmJ5dGVzKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgInJlcGVhdGVkIHN0cmluZyBpcyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgb3AgPSAoUHlTdHJpbmdPYmplY3QgKikKKyAgICAgICAgUHlPYmplY3RfTUFMTE9DKHNpemVvZihQeVN0cmluZ09iamVjdCkgKyBuYnl0ZXMpOworICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBQeU9iamVjdF9JTklUX1ZBUihvcCwgJlB5U3RyaW5nX1R5cGUsIHNpemUpOworICAgIG9wLT5vYl9zaGFzaCA9IC0xOworICAgIG9wLT5vYl9zc3RhdGUgPSBTU1RBVEVfTk9UX0lOVEVSTkVEOworICAgIG9wLT5vYl9zdmFsW3NpemVdID0gJ1wwJzsKKyAgICBpZiAoUHlfU0laRShhKSA9PSAxICYmIG4gPiAwKSB7CisgICAgICAgIG1lbXNldChvcC0+b2Jfc3ZhbCwgYS0+b2Jfc3ZhbFswXSAsIG4pOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIH0KKyAgICBpID0gMDsKKyAgICBpZiAoaSA8IHNpemUpIHsKKyAgICAgICAgUHlfTUVNQ1BZKG9wLT5vYl9zdmFsLCBhLT5vYl9zdmFsLCBQeV9TSVpFKGEpKTsKKyAgICAgICAgaSA9IFB5X1NJWkUoYSk7CisgICAgfQorICAgIHdoaWxlIChpIDwgc2l6ZSkgeworICAgICAgICBqID0gKGkgPD0gc2l6ZS1pKSAgPyAgaSAgOiAgc2l6ZS1pOworICAgICAgICBQeV9NRU1DUFkob3AtPm9iX3N2YWwraSwgb3AtPm9iX3N2YWwsIGopOworICAgICAgICBpICs9IGo7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgb3A7CiB9CiAKIC8qIFN0cmluZyBzbGljZSBhW2k6al0gY29uc2lzdHMgb2YgY2hhcmFjdGVycyBhW2ldIC4uLiBhW2otMV0gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19zbGljZShyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqYSwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpLAotCSAgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBqKQorICAgICAgICAgICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaikKICAgICAgLyogaiAtLSBtYXkgYmUgbmVnYXRpdmUhICovCiB7Ci0JaWYgKGkgPCAwKQotCQlpID0gMDsKLQlpZiAoaiA8IDApCi0JCWogPSAwOyAvKiBBdm9pZCBzaWduZWQvdW5zaWduZWQgYnVnIGluIG5leHQgbGluZSAqLwotCWlmIChqID4gUHlfU0laRShhKSkKLQkJaiA9IFB5X1NJWkUoYSk7Ci0JaWYgKGkgPT0gMCAmJiBqID09IFB5X1NJWkUoYSkgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChhKSkgewotCQkvKiBJdCdzIHRoZSBzYW1lIGFzIGEgKi8KLQkJUHlfSU5DUkVGKGEpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopYTsKLQl9Ci0JaWYgKGogPCBpKQotCQlqID0gaTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYS0+b2Jfc3ZhbCArIGksIGotaSk7CisgICAgaWYgKGkgPCAwKQorICAgICAgICBpID0gMDsKKyAgICBpZiAoaiA8IDApCisgICAgICAgIGogPSAwOyAvKiBBdm9pZCBzaWduZWQvdW5zaWduZWQgYnVnIGluIG5leHQgbGluZSAqLworICAgIGlmIChqID4gUHlfU0laRShhKSkKKyAgICAgICAgaiA9IFB5X1NJWkUoYSk7CisgICAgaWYgKGkgPT0gMCAmJiBqID09IFB5X1NJWkUoYSkgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChhKSkgeworICAgICAgICAvKiBJdCdzIHRoZSBzYW1lIGFzIGEgKi8KKyAgICAgICAgUHlfSU5DUkVGKGEpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopYTsKKyAgICB9CisgICAgaWYgKGogPCBpKQorICAgICAgICBqID0gaTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYS0+b2Jfc3ZhbCArIGksIGotaSk7CiB9CiAKIHN0YXRpYyBpbnQKIHN0cmluZ19jb250YWlucyhQeU9iamVjdCAqc3RyX29iaiwgUHlPYmplY3QgKnN1Yl9vYmopCiB7Ci0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KHN1Yl9vYmopKSB7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KHN1Yl9vYmopKSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQlpZiAoUHlVbmljb2RlX0NoZWNrKHN1Yl9vYmopKQotCQkJcmV0dXJuIFB5VW5pY29kZV9Db250YWlucyhzdHJfb2JqLCBzdWJfb2JqKTsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJfb2JqKSkKKyAgICAgICAgICAgIHJldHVybiBQeVVuaWNvZGVfQ29udGFpbnMoc3RyX29iaiwgc3ViX29iaik7CiAjZW5kaWYKLQkJaWYgKCFQeVN0cmluZ19DaGVjayhzdWJfb2JqKSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kLCAiCi0JCQkgICAgIm5vdCAlLjIwMHMiLCBQeV9UWVBFKHN1Yl9vYmopLT50cF9uYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhzdWJfb2JqKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kLCAiCisgICAgICAgICAgICAgICAgIm5vdCAlLjIwMHMiLCBQeV9UWVBFKHN1Yl9vYmopLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBzdHJpbmdsaWJfY29udGFpbnNfb2JqKHN0cl9vYmosIHN1Yl9vYmopOworICAgIHJldHVybiBzdHJpbmdsaWJfY29udGFpbnNfb2JqKHN0cl9vYmosIHN1Yl9vYmopOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2l0ZW0oUHlTdHJpbmdPYmplY3QgKmEsIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSkKIHsKLQljaGFyIHBjaGFyOwotCVB5T2JqZWN0ICp2OwotCWlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJzdHJpbmcgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlwY2hhciA9IGEtPm9iX3N2YWxbaV07Ci0JdiA9IChQeU9iamVjdCAqKWNoYXJhY3RlcnNbcGNoYXIgJiBVQ0hBUl9NQVhdOwotCWlmICh2ID09IE5VTEwpCi0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgmcGNoYXIsIDEpOwotCWVsc2UgeworICAgIGNoYXIgcGNoYXI7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInN0cmluZyBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHBjaGFyID0gYS0+b2Jfc3ZhbFtpXTsKKyAgICB2ID0gKFB5T2JqZWN0ICopY2hhcmFjdGVyc1twY2hhciAmIFVDSEFSX01BWF07CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCZwY2hhciwgMSk7CisgICAgZWxzZSB7CiAjaWZkZWYgQ09VTlRfQUxMT0NTCi0JCW9uZV9zdHJpbmdzKys7CisgICAgICAgIG9uZV9zdHJpbmdzKys7CiAjZW5kaWYKLQkJUHlfSU5DUkVGKHYpOwotCX0KLQlyZXR1cm4gdjsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgogc3RyaW5nX3JpY2hjb21wYXJlKFB5U3RyaW5nT2JqZWN0ICphLCBQeVN0cmluZ09iamVjdCAqYiwgaW50IG9wKQogewotCWludCBjOwotCVB5X3NzaXplX3QgbGVuX2EsIGxlbl9iOwotCVB5X3NzaXplX3QgbWluX2xlbjsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIGludCBjOworICAgIFB5X3NzaXplX3QgbGVuX2EsIGxlbl9iOworICAgIFB5X3NzaXplX3QgbWluX2xlbjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JLyogTWFrZSBzdXJlIGJvdGggYXJndW1lbnRzIGFyZSBzdHJpbmdzLiAqLwotCWlmICghKFB5U3RyaW5nX0NoZWNrKGEpICYmIFB5U3RyaW5nX0NoZWNrKGIpKSkgewotCQlyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChhID09IGIpIHsKLQkJc3dpdGNoIChvcCkgewotCQljYXNlIFB5X0VROmNhc2UgUHlfTEU6Y2FzZSBQeV9HRToKLQkJCXJlc3VsdCA9IFB5X1RydWU7Ci0JCQlnb3RvIG91dDsKLQkJY2FzZSBQeV9ORTpjYXNlIFB5X0xUOmNhc2UgUHlfR1Q6Ci0JCQlyZXN1bHQgPSBQeV9GYWxzZTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCWlmIChvcCA9PSBQeV9FUSkgewotCQkvKiBTdXBwb3J0aW5nIFB5X05FIGhlcmUgYXMgd2VsbCBkb2VzIG5vdCBzYXZlCi0JCSAgIG11Y2ggdGltZSwgc2luY2UgUHlfTkUgaXMgcmFyZWx5IHVzZWQuICAqLwotCQlpZiAoUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpCi0JCSAgICAmJiAoYS0+b2Jfc3ZhbFswXSA9PSBiLT5vYl9zdmFsWzBdCi0JCQkmJiBtZW1jbXAoYS0+b2Jfc3ZhbCwgYi0+b2Jfc3ZhbCwgUHlfU0laRShhKSkgPT0gMCkpIHsKLQkJCXJlc3VsdCA9IFB5X1RydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBQeV9GYWxzZTsKLQkJfQotCQlnb3RvIG91dDsKLQl9Ci0JbGVuX2EgPSBQeV9TSVpFKGEpOyBsZW5fYiA9IFB5X1NJWkUoYik7Ci0JbWluX2xlbiA9IChsZW5fYSA8IGxlbl9iKSA/IGxlbl9hIDogbGVuX2I7Ci0JaWYgKG1pbl9sZW4gPiAwKSB7Ci0JCWMgPSBQeV9DSEFSTUFTSygqYS0+b2Jfc3ZhbCkgLSBQeV9DSEFSTUFTSygqYi0+b2Jfc3ZhbCk7Ci0JCWlmIChjPT0wKQotCQkJYyA9IG1lbWNtcChhLT5vYl9zdmFsLCBiLT5vYl9zdmFsLCBtaW5fbGVuKTsKLQl9IGVsc2UKLQkJYyA9IDA7Ci0JaWYgKGMgPT0gMCkKLQkJYyA9IChsZW5fYSA8IGxlbl9iKSA/IC0xIDogKGxlbl9hID4gbGVuX2IpID8gMSA6IDA7Ci0Jc3dpdGNoIChvcCkgewotCWNhc2UgUHlfTFQ6IGMgPSBjIDwgIDA7IGJyZWFrOwotCWNhc2UgUHlfTEU6IGMgPSBjIDw9IDA7IGJyZWFrOwotCWNhc2UgUHlfRVE6IGFzc2VydCgwKTsgIGJyZWFrOyAvKiB1bnJlYWNoYWJsZSAqLwotCWNhc2UgUHlfTkU6IGMgPSBjICE9IDA7IGJyZWFrOwotCWNhc2UgUHlfR1Q6IGMgPSBjID4gIDA7IGJyZWFrOwotCWNhc2UgUHlfR0U6IGMgPSBjID49IDA7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOwotCQlnb3RvIG91dDsKLQl9Ci0JcmVzdWx0ID0gYyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgICAvKiBNYWtlIHN1cmUgYm90aCBhcmd1bWVudHMgYXJlIHN0cmluZ3MuICovCisgICAgaWYgKCEoUHlTdHJpbmdfQ2hlY2soYSkgJiYgUHlTdHJpbmdfQ2hlY2soYikpKSB7CisgICAgICAgIHJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgaWYgKGEgPT0gYikgeworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgUHlfRVE6Y2FzZSBQeV9MRTpjYXNlIFB5X0dFOgorICAgICAgICAgICAgcmVzdWx0ID0gUHlfVHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBjYXNlIFB5X05FOmNhc2UgUHlfTFQ6Y2FzZSBQeV9HVDoKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5X0ZhbHNlOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG9wID09IFB5X0VRKSB7CisgICAgICAgIC8qIFN1cHBvcnRpbmcgUHlfTkUgaGVyZSBhcyB3ZWxsIGRvZXMgbm90IHNhdmUKKyAgICAgICAgICAgbXVjaCB0aW1lLCBzaW5jZSBQeV9ORSBpcyByYXJlbHkgdXNlZC4gICovCisgICAgICAgIGlmIChQeV9TSVpFKGEpID09IFB5X1NJWkUoYikKKyAgICAgICAgICAgICYmIChhLT5vYl9zdmFsWzBdID09IGItPm9iX3N2YWxbMF0KKyAgICAgICAgICAgICYmIG1lbWNtcChhLT5vYl9zdmFsLCBiLT5vYl9zdmFsLCBQeV9TSVpFKGEpKSA9PSAwKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlfVHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5X0ZhbHNlOworICAgICAgICB9CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBsZW5fYSA9IFB5X1NJWkUoYSk7IGxlbl9iID0gUHlfU0laRShiKTsKKyAgICBtaW5fbGVuID0gKGxlbl9hIDwgbGVuX2IpID8gbGVuX2EgOiBsZW5fYjsKKyAgICBpZiAobWluX2xlbiA+IDApIHsKKyAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCphLT5vYl9zdmFsKSAtIFB5X0NIQVJNQVNLKCpiLT5vYl9zdmFsKTsKKyAgICAgICAgaWYgKGM9PTApCisgICAgICAgICAgICBjID0gbWVtY21wKGEtPm9iX3N2YWwsIGItPm9iX3N2YWwsIG1pbl9sZW4pOworICAgIH0gZWxzZQorICAgICAgICBjID0gMDsKKyAgICBpZiAoYyA9PSAwKQorICAgICAgICBjID0gKGxlbl9hIDwgbGVuX2IpID8gLTEgOiAobGVuX2EgPiBsZW5fYikgPyAxIDogMDsKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBQeV9MVDogYyA9IGMgPCAgMDsgYnJlYWs7CisgICAgY2FzZSBQeV9MRTogYyA9IGMgPD0gMDsgYnJlYWs7CisgICAgY2FzZSBQeV9FUTogYXNzZXJ0KDApOyAgYnJlYWs7IC8qIHVucmVhY2hhYmxlICovCisgICAgY2FzZSBQeV9ORTogYyA9IGMgIT0gMDsgYnJlYWs7CisgICAgY2FzZSBQeV9HVDogYyA9IGMgPiAgMDsgYnJlYWs7CisgICAgY2FzZSBQeV9HRTogYyA9IGMgPj0gMDsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICByZXN1bHQgPSBjID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwogICBvdXQ6Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBpbnQKIF9QeVN0cmluZ19FcShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMikKIHsKLQlQeVN0cmluZ09iamVjdCAqYSA9IChQeVN0cmluZ09iamVjdCopIG8xOwotCVB5U3RyaW5nT2JqZWN0ICpiID0gKFB5U3RyaW5nT2JqZWN0KikgbzI7Ci0gICAgICAgIHJldHVybiBQeV9TSVpFKGEpID09IFB5X1NJWkUoYikKLSAgICAgICAgICAmJiAqYS0+b2Jfc3ZhbCA9PSAqYi0+b2Jfc3ZhbAotICAgICAgICAgICYmIG1lbWNtcChhLT5vYl9zdmFsLCBiLT5vYl9zdmFsLCBQeV9TSVpFKGEpKSA9PSAwOworICAgIFB5U3RyaW5nT2JqZWN0ICphID0gKFB5U3RyaW5nT2JqZWN0KikgbzE7CisgICAgUHlTdHJpbmdPYmplY3QgKmIgPSAoUHlTdHJpbmdPYmplY3QqKSBvMjsKKyAgICByZXR1cm4gUHlfU0laRShhKSA9PSBQeV9TSVpFKGIpCisgICAgICAmJiAqYS0+b2Jfc3ZhbCA9PSAqYi0+b2Jfc3ZhbAorICAgICAgJiYgbWVtY21wKGEtPm9iX3N2YWwsIGItPm9iX3N2YWwsIFB5X1NJWkUoYSkpID09IDA7CiB9CiAKIHN0YXRpYyBsb25nCiBzdHJpbmdfaGFzaChQeVN0cmluZ09iamVjdCAqYSkKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGxlbjsKLQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOwotCXJlZ2lzdGVyIGxvbmcgeDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGxlbjsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOworICAgIHJlZ2lzdGVyIGxvbmcgeDsKIAotCWlmIChhLT5vYl9zaGFzaCAhPSAtMSkKLQkJcmV0dXJuIGEtPm9iX3NoYXNoOwotCWxlbiA9IFB5X1NJWkUoYSk7Ci0JcCA9ICh1bnNpZ25lZCBjaGFyICopIGEtPm9iX3N2YWw7Ci0JeCA9ICpwIDw8IDc7Ci0Jd2hpbGUgKC0tbGVuID49IDApCi0JCXggPSAoMTAwMDAwMyp4KSBeICpwKys7Ci0JeCBePSBQeV9TSVpFKGEpOwotCWlmICh4ID09IC0xKQotCQl4ID0gLTI7Ci0JYS0+b2Jfc2hhc2ggPSB4OwotCXJldHVybiB4OworICAgIGlmIChhLT5vYl9zaGFzaCAhPSAtMSkKKyAgICAgICAgcmV0dXJuIGEtPm9iX3NoYXNoOworICAgIGxlbiA9IFB5X1NJWkUoYSk7CisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIGEtPm9iX3N2YWw7CisgICAgeCA9ICpwIDw8IDc7CisgICAgd2hpbGUgKC0tbGVuID49IDApCisgICAgICAgIHggPSAoMTAwMDAwMyp4KSBeICpwKys7CisgICAgeCBePSBQeV9TSVpFKGEpOworICAgIGlmICh4ID09IC0xKQorICAgICAgICB4ID0gLTI7CisgICAgYS0+b2Jfc2hhc2ggPSB4OworICAgIHJldHVybiB4OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBzdHJpbmdfc3Vic2NyaXB0KFB5U3RyaW5nT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogaXRlbSkKIHsKLQlpZiAoUHlJbmRleF9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfSW5kZXhFcnJvcik7Ci0JCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQkJcmV0dXJuIHN0cmluZ19pdGVtKHNlbGYsIGkpOwotCX0KLQllbHNlIGlmIChQeVNsaWNlX0NoZWNrKGl0ZW0pKSB7Ci0JCVB5X3NzaXplX3Qgc3RhcnQsIHN0b3AsIHN0ZXAsIHNsaWNlbGVuZ3RoLCBjdXIsIGk7Ci0JCWNoYXIqIHNvdXJjZV9idWY7Ci0JCWNoYXIqIHJlc3VsdF9idWY7Ci0JCVB5T2JqZWN0KiByZXN1bHQ7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgICAgIHJldHVybiBzdHJpbmdfaXRlbShzZWxmLCBpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOworICAgICAgICBjaGFyKiBzb3VyY2VfYnVmOworICAgICAgICBjaGFyKiByZXN1bHRfYnVmOworICAgICAgICBQeU9iamVjdCogcmVzdWx0OwogCi0JCWlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwKLQkJCQkgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCi0JCQkJICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0KilpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlpZiAoc2xpY2VsZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCIiLCAwKTsKLQkJfQotCQllbHNlIGlmIChzdGFydCA9PSAwICYmIHN0ZXAgPT0gMSAmJgotCQkJIHNsaWNlbGVuZ3RoID09IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpICYmCi0JCQkgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotCQkJUHlfSU5DUkVGKHNlbGYpOwotCQkJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci0JCX0KLQkJZWxzZSBpZiAoc3RlcCA9PSAxKSB7Ci0JCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsCi0JCQkJc2xpY2VsZW5ndGgpOwotCQl9Ci0JCWVsc2UgewotCQkJc291cmNlX2J1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKChQeU9iamVjdCopc2VsZik7Ci0JCQlyZXN1bHRfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2Moc2xpY2VsZW5ndGgpOwotCQkJaWYgKHJlc3VsdF9idWYgPT0gTlVMTCkKLQkJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgaWYgKHNsaWNlbGVuZ3RoIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RhcnQgPT0gMCAmJiBzdGVwID09IDEgJiYKKyAgICAgICAgICAgICAgICAgc2xpY2VsZW5ndGggPT0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgJiYKKyAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RlcCA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsCisgICAgICAgICAgICAgICAgc2xpY2VsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc291cmNlX2J1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKChQeU9iamVjdCopc2VsZik7CisgICAgICAgICAgICByZXN1bHRfYnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2Moc2xpY2VsZW5ndGgpOworICAgICAgICAgICAgaWYgKHJlc3VsdF9idWYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCQkJZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbmd0aDsKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCXJlc3VsdF9idWZbaV0gPSBzb3VyY2VfYnVmW2N1cl07Ci0JCQl9CisgICAgICAgICAgICBmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOworICAgICAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0X2J1ZltpXSA9IHNvdXJjZV9idWZbY3VyXTsKKyAgICAgICAgICAgIH0KIAotCQkJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzdWx0X2J1ZiwKLQkJCQkJCQkgICAgc2xpY2VsZW5ndGgpOwotCQkJUHlNZW1fRnJlZShyZXN1bHRfYnVmKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJzdHJpbmcgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgJS4yMDBzIiwKLQkJCSAgICAgUHlfVFlQRShpdGVtKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHJlc3VsdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWxlbmd0aCk7CisgICAgICAgICAgICBQeU1lbV9GcmVlKHJlc3VsdF9idWYpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoaXRlbSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90CiBzdHJpbmdfYnVmZmVyX2dldHJlYWRidWYoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGNvbnN0IHZvaWQgKipwdHIpCiB7Ci0JaWYgKCBpbmRleCAhPSAwICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJImFjY2Vzc2luZyBub24tZXhpc3RlbnQgc3RyaW5nIHNlZ21lbnQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQkqcHRyID0gKHZvaWQgKilzZWxmLT5vYl9zdmFsOwotCXJldHVybiBQeV9TSVpFKHNlbGYpOworICAgIGlmICggaW5kZXggIT0gMCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzc2luZyBub24tZXhpc3RlbnQgc3RyaW5nIHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHRyID0gKHZvaWQgKilzZWxmLT5vYl9zdmFsOworICAgIHJldHVybiBQeV9TSVpFKHNlbGYpOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogc3RyaW5nX2J1ZmZlcl9nZXR3cml0ZWJ1ZihQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgY29uc3Qgdm9pZCAqKnB0cikKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJIkNhbm5vdCB1c2Ugc3RyaW5nIGFzIG1vZGlmaWFibGUgYnVmZmVyIik7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgdXNlIHN0cmluZyBhcyBtb2RpZmlhYmxlIGJ1ZmZlciIpOworICAgIHJldHVybiAtMTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIHN0cmluZ19idWZmZXJfZ2V0c2VnY291bnQoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgKmxlbnApCiB7Ci0JaWYgKCBsZW5wICkKLQkJKmxlbnAgPSBQeV9TSVpFKHNlbGYpOwotCXJldHVybiAxOworICAgIGlmICggbGVucCApCisgICAgICAgICpsZW5wID0gUHlfU0laRShzZWxmKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIHN0cmluZ19idWZmZXJfZ2V0Y2hhcmJ1ZihQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgY29uc3QgY2hhciAqKnB0cikKIHsKLQlpZiAoIGluZGV4ICE9IDAgKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBzdHJpbmcgc2VnbWVudCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCSpwdHIgPSBzZWxmLT5vYl9zdmFsOwotCXJldHVybiBQeV9TSVpFKHNlbGYpOworICAgIGlmICggaW5kZXggIT0gMCApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFjY2Vzc2luZyBub24tZXhpc3RlbnQgc3RyaW5nIHNlZ21lbnQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcHRyID0gc2VsZi0+b2Jfc3ZhbDsKKyAgICByZXR1cm4gUHlfU0laRShzZWxmKTsKIH0KIAogc3RhdGljIGludAogc3RyaW5nX2J1ZmZlcl9nZXRidWZmZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X2J1ZmZlciAqdmlldywgaW50IGZsYWdzKQogewotCXJldHVybiBQeUJ1ZmZlcl9GaWxsSW5mbyh2aWV3LCAoUHlPYmplY3QqKXNlbGYsCi0JCQkJICh2b2lkICopc2VsZi0+b2Jfc3ZhbCwgUHlfU0laRShzZWxmKSwKLQkJCQkgMSwgZmxhZ3MpOworICAgIHJldHVybiBQeUJ1ZmZlcl9GaWxsSW5mbyh2aWV3LCAoUHlPYmplY3QqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopc2VsZi0+b2Jfc3ZhbCwgUHlfU0laRShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgc3RyaW5nX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKXN0cmluZ19sZW5ndGgsIC8qc3FfbGVuZ3RoKi8KLQkoYmluYXJ5ZnVuYylzdHJpbmdfY29uY2F0LCAvKnNxX2NvbmNhdCovCi0JKHNzaXplYXJnZnVuYylzdHJpbmdfcmVwZWF0LCAvKnNxX3JlcGVhdCovCi0JKHNzaXplYXJnZnVuYylzdHJpbmdfaXRlbSwgLypzcV9pdGVtKi8KLQkoc3NpemVzc2l6ZWFyZ2Z1bmMpc3RyaW5nX3NsaWNlLCAvKnNxX3NsaWNlKi8KLQkwLAkJLypzcV9hc3NfaXRlbSovCi0JMCwJCS8qc3FfYXNzX3NsaWNlKi8KLQkob2Jqb2JqcHJvYylzdHJpbmdfY29udGFpbnMgLypzcV9jb250YWlucyovCisgICAgKGxlbmZ1bmMpc3RyaW5nX2xlbmd0aCwgLypzcV9sZW5ndGgqLworICAgIChiaW5hcnlmdW5jKXN0cmluZ19jb25jYXQsIC8qc3FfY29uY2F0Ki8KKyAgICAoc3NpemVhcmdmdW5jKXN0cmluZ19yZXBlYXQsIC8qc3FfcmVwZWF0Ki8KKyAgICAoc3NpemVhcmdmdW5jKXN0cmluZ19pdGVtLCAvKnNxX2l0ZW0qLworICAgIChzc2l6ZXNzaXplYXJnZnVuYylzdHJpbmdfc2xpY2UsIC8qc3Ffc2xpY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgLypzcV9hc3NfaXRlbSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnNxX2Fzc19zbGljZSovCisgICAgKG9iam9ianByb2Mpc3RyaW5nX2NvbnRhaW5zIC8qc3FfY29udGFpbnMqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgc3RyaW5nX2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpc3RyaW5nX2xlbmd0aCwKLQkoYmluYXJ5ZnVuYylzdHJpbmdfc3Vic2NyaXB0LAotCTAsCisgICAgKGxlbmZ1bmMpc3RyaW5nX2xlbmd0aCwKKyAgICAoYmluYXJ5ZnVuYylzdHJpbmdfc3Vic2NyaXB0LAorICAgIDAsCiB9OwogCiBzdGF0aWMgUHlCdWZmZXJQcm9jcyBzdHJpbmdfYXNfYnVmZmVyID0gewotCShyZWFkYnVmZmVycHJvYylzdHJpbmdfYnVmZmVyX2dldHJlYWRidWYsCi0JKHdyaXRlYnVmZmVycHJvYylzdHJpbmdfYnVmZmVyX2dldHdyaXRlYnVmLAotCShzZWdjb3VudHByb2Mpc3RyaW5nX2J1ZmZlcl9nZXRzZWdjb3VudCwKLQkoY2hhcmJ1ZmZlcnByb2Mpc3RyaW5nX2J1ZmZlcl9nZXRjaGFyYnVmLAotCShnZXRidWZmZXJwcm9jKXN0cmluZ19idWZmZXJfZ2V0YnVmZmVyLAotCTAsIC8qIFhYWCAqLworICAgIChyZWFkYnVmZmVycHJvYylzdHJpbmdfYnVmZmVyX2dldHJlYWRidWYsCisgICAgKHdyaXRlYnVmZmVycHJvYylzdHJpbmdfYnVmZmVyX2dldHdyaXRlYnVmLAorICAgIChzZWdjb3VudHByb2Mpc3RyaW5nX2J1ZmZlcl9nZXRzZWdjb3VudCwKKyAgICAoY2hhcmJ1ZmZlcnByb2Mpc3RyaW5nX2J1ZmZlcl9nZXRjaGFyYnVmLAorICAgIChnZXRidWZmZXJwcm9jKXN0cmluZ19idWZmZXJfZ2V0YnVmZmVyLAorICAgIDAsIC8qIFhYWCAqLwogfTsKIAogCkBAIC0xMzcyLDkgKzEzNzIsOSBAQAogCiAKIC8qIERvbid0IGNhbGwgaWYgbGVuZ3RoIDwgMiAqLwotI2RlZmluZSBQeV9TVFJJTkdfTUFUQ0godGFyZ2V0LCBvZmZzZXQsIHBhdHRlcm4sIGxlbmd0aCkJXAotICAodGFyZ2V0W29mZnNldF0gPT0gcGF0dGVyblswXSAmJgkJCQlcCi0gICB0YXJnZXRbb2Zmc2V0K2xlbmd0aC0xXSA9PSBwYXR0ZXJuW2xlbmd0aC0xXSAmJgkJXAorI2RlZmluZSBQeV9TVFJJTkdfTUFUQ0godGFyZ2V0LCBvZmZzZXQsIHBhdHRlcm4sIGxlbmd0aCkgICAgICAgIFwKKyAgKHRhcmdldFtvZmZzZXRdID09IHBhdHRlcm5bMF0gJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB0YXJnZXRbb2Zmc2V0K2xlbmd0aC0xXSA9PSBwYXR0ZXJuW2xlbmd0aC0xXSAmJiAgICAgICAgICAgICAgXAogICAgIW1lbWNtcCh0YXJnZXQrb2Zmc2V0KzEsIHBhdHRlcm4rMSwgbGVuZ3RoLTIpICkKIAogCkBAIC0xMzg5LDM2ICsxMzg5LDM2IEBACiAKIC8qIDUgc3BsaXRzIGdpdmVzIDYgZWxlbWVudHMgKi8KICNkZWZpbmUgUFJFQUxMT0NfU0laRShtYXhzcGxpdCkgXAotCShtYXhzcGxpdCA+PSBNQVhfUFJFQUxMT0MgPyBNQVhfUFJFQUxMT0MgOiBtYXhzcGxpdCsxKQorICAgIChtYXhzcGxpdCA+PSBNQVhfUFJFQUxMT0MgPyBNQVhfUFJFQUxMT0MgOiBtYXhzcGxpdCsxKQogCi0jZGVmaW5lIFNQTElUX0FQUEVORChkYXRhLCBsZWZ0LCByaWdodCkJCQkJXAotCXN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChkYXRhKSArIChsZWZ0KSwJXAotCQkJCQkgKHJpZ2h0KSAtIChsZWZ0KSk7CVwKLQlpZiAoc3RyID09IE5VTEwpCQkJCQlcCi0JCWdvdG8gb25FcnJvcjsJCQkJCVwKLQlpZiAoUHlMaXN0X0FwcGVuZChsaXN0LCBzdHIpKSB7CQkJCVwKLQkJUHlfREVDUkVGKHN0cik7CQkJCQlcCi0JCWdvdG8gb25FcnJvcjsJCQkJCVwKLQl9CQkJCQkJCVwKLQllbHNlCQkJCQkJCVwKLQkJUHlfREVDUkVGKHN0cik7CisjZGVmaW5lIFNQTElUX0FQUEVORChkYXRhLCBsZWZ0LCByaWdodCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChkYXRhKSArIChsZWZ0KSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmlnaHQpIC0gKGxlZnQpKTsgICAgICAgICBcCisgICAgaWYgKHN0ciA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIG9uRXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoUHlMaXN0X0FwcGVuZChsaXN0LCBzdHIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X0RFQ1JFRihzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIG9uRXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9ERUNSRUYoc3RyKTsKIAotI2RlZmluZSBTUExJVF9BREQoZGF0YSwgbGVmdCwgcmlnaHQpIHsJCQkJXAotCXN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChkYXRhKSArIChsZWZ0KSwJXAotCQkJCQkgKHJpZ2h0KSAtIChsZWZ0KSk7CVwKLQlpZiAoc3RyID09IE5VTEwpCQkJCQlcCi0JCWdvdG8gb25FcnJvcjsJCQkJCVwKLQlpZiAoY291bnQgPCBNQVhfUFJFQUxMT0MpIHsJCQkJXAotCQlQeUxpc3RfU0VUX0lURU0obGlzdCwgY291bnQsIHN0cik7CQlcCi0JfSBlbHNlIHsJCQkJCQlcCi0JCWlmIChQeUxpc3RfQXBwZW5kKGxpc3QsIHN0cikpIHsJCQlcCi0JCQlQeV9ERUNSRUYoc3RyKTsJCQkJXAotCQkJZ290byBvbkVycm9yOwkJCQlcCi0JCX0JCQkJCQlcCi0JCWVsc2UJCQkJCQlcCi0JCQlQeV9ERUNSRUYoc3RyKTsJCQkJXAotCX0JCQkJCQkJXAotCWNvdW50Kys7IH0KKyNkZWZpbmUgU1BMSVRfQUREKGRhdGEsIGxlZnQsIHJpZ2h0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGRhdGEpICsgKGxlZnQpLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyaWdodCkgLSAobGVmdCkpOyAgICAgICAgIFwKKyAgICBpZiAoc3RyID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gb25FcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjb3VudCA8IE1BWF9QUkVBTExPQykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QsIGNvdW50LCBzdHIpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChsaXN0LCBzdHIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnb3RvIG9uRXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeV9ERUNSRUYoc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb3VudCsrOyB9CiAKIC8qIEFsd2F5cyBmb3JjZSB0aGUgbGlzdCB0byB0aGUgZXhwZWN0ZWQgc2l6ZS4gKi8KICNkZWZpbmUgRklYX1BSRUFMTE9DX1NJWkUobGlzdCkgUHlfU0laRShsaXN0KSA9IGNvdW50CkBAIC0xNDMxLDgyICsxNDMxLDgyIEBACiBQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIHNwbGl0X3doaXRlc3BhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgbGVuLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogewotCWNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JUHlfc3NpemVfdCBpLCBqLCBjb3VudD0wOwotCVB5T2JqZWN0ICpzdHI7Ci0JUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KFBSRUFMTE9DX1NJWkUobWF4c3BsaXQpKTsKKyAgICBjb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIFB5X3NzaXplX3QgaSwgaiwgY291bnQ9MDsKKyAgICBQeU9iamVjdCAqc3RyOworICAgIFB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heHNwbGl0KSk7CiAKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWkgPSBqID0gMDsKKyAgICBpID0gaiA9IDA7CiAKLQl3aGlsZSAobWF4c3BsaXQtLSA+IDApIHsKLQkJU0tJUF9TUEFDRShzLCBpLCBsZW4pOwotCQlpZiAoaT09bGVuKSBicmVhazsKLQkJaiA9IGk7IGkrKzsKLQkJU0tJUF9OT05TUEFDRShzLCBpLCBsZW4pOwotCQlpZiAoaiA9PSAwICYmIGkgPT0gbGVuICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLQkJCS8qIE5vIHdoaXRlc3BhY2UgaW4gc2VsZiwgc28ganVzdCB1c2UgaXQgYXMgbGlzdFswXSAqLwotCQkJUHlfSU5DUkVGKHNlbGYpOwotCQkJUHlMaXN0X1NFVF9JVEVNKGxpc3QsIDAsIChQeU9iamVjdCAqKXNlbGYpOwotCQkJY291bnQrKzsKLQkJCWJyZWFrOwotCQl9Ci0JCVNQTElUX0FERChzLCBqLCBpKTsKLQl9CisgICAgd2hpbGUgKG1heHNwbGl0LS0gPiAwKSB7CisgICAgICAgIFNLSVBfU1BBQ0UocywgaSwgbGVuKTsKKyAgICAgICAgaWYgKGk9PWxlbikgYnJlYWs7CisgICAgICAgIGogPSBpOyBpKys7CisgICAgICAgIFNLSVBfTk9OU1BBQ0UocywgaSwgbGVuKTsKKyAgICAgICAgaWYgKGogPT0gMCAmJiBpID09IGxlbiAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CisgICAgICAgICAgICAvKiBObyB3aGl0ZXNwYWNlIGluIHNlbGYsIHNvIGp1c3QgdXNlIGl0IGFzIGxpc3RbMF0gKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCAwLCAoUHlPYmplY3QgKilzZWxmKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTUExJVF9BREQocywgaiwgaSk7CisgICAgfQogCi0JaWYgKGkgPCBsZW4pIHsKLQkJLyogT25seSBvY2N1cnMgd2hlbiBtYXhzcGxpdCB3YXMgcmVhY2hlZCAqLwotCQkvKiBTa2lwIGFueSByZW1haW5pbmcgd2hpdGVzcGFjZSBhbmQgY29weSB0byBlbmQgb2Ygc3RyaW5nICovCi0JCVNLSVBfU1BBQ0UocywgaSwgbGVuKTsKLQkJaWYgKGkgIT0gbGVuKQotCQkJU1BMSVRfQUREKHMsIGksIGxlbik7Ci0JfQotCUZJWF9QUkVBTExPQ19TSVpFKGxpc3QpOwotCXJldHVybiBsaXN0OworICAgIGlmIChpIDwgbGVuKSB7CisgICAgICAgIC8qIE9ubHkgb2NjdXJzIHdoZW4gbWF4c3BsaXQgd2FzIHJlYWNoZWQgKi8KKyAgICAgICAgLyogU2tpcCBhbnkgcmVtYWluaW5nIHdoaXRlc3BhY2UgYW5kIGNvcHkgdG8gZW5kIG9mIHN0cmluZyAqLworICAgICAgICBTS0lQX1NQQUNFKHMsIGksIGxlbik7CisgICAgICAgIGlmIChpICE9IGxlbikKKyAgICAgICAgICAgIFNQTElUX0FERChzLCBpLCBsZW4pOworICAgIH0KKyAgICBGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKKyAgICByZXR1cm4gbGlzdDsKICAgb25FcnJvcjoKLQlQeV9ERUNSRUYobGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGxpc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIHNwbGl0X2NoYXIoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgbGVuLCBjaGFyIGNoLCBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCWNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqLCBjb3VudD0wOwotCVB5T2JqZWN0ICpzdHI7Ci0JUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KFBSRUFMTE9DX1NJWkUobWF4Y291bnQpKTsKKyAgICBjb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgaiwgY291bnQ9MDsKKyAgICBQeU9iamVjdCAqc3RyOworICAgIFB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heGNvdW50KSk7CiAKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWkgPSBqID0gMDsKLQl3aGlsZSAoKGogPCBsZW4pICYmIChtYXhjb3VudC0tID4gMCkpIHsKLQkJZm9yKDsgajxsZW47IGorKykgewotCQkJLyogSSBmb3VuZCB0aGF0IHVzaW5nIG1lbWNociBtYWtlcyBubyBkaWZmZXJlbmNlICovCi0JCQlpZiAoc1tqXSA9PSBjaCkgewotCQkJCVNQTElUX0FERChzLCBpLCBqKTsKLQkJCQlpID0gaiA9IGogKyAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmIChpID09IDAgJiYgY291bnQgPT0gMCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0JCS8qIGNoIG5vdCBpbiBzZWxmLCBzbyBqdXN0IHVzZSBzZWxmIGFzIGxpc3RbMF0gKi8KLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlQeUxpc3RfU0VUX0lURU0obGlzdCwgMCwgKFB5T2JqZWN0ICopc2VsZik7Ci0JCWNvdW50Kys7Ci0JfQotCWVsc2UgaWYgKGkgPD0gbGVuKSB7Ci0JCVNQTElUX0FERChzLCBpLCBsZW4pOwotCX0KLQlGSVhfUFJFQUxMT0NfU0laRShsaXN0KTsKLQlyZXR1cm4gbGlzdDsKKyAgICBpID0gaiA9IDA7CisgICAgd2hpbGUgKChqIDwgbGVuKSAmJiAobWF4Y291bnQtLSA+IDApKSB7CisgICAgICAgIGZvcig7IGo8bGVuOyBqKyspIHsKKyAgICAgICAgICAgIC8qIEkgZm91bmQgdGhhdCB1c2luZyBtZW1jaHIgbWFrZXMgbm8gZGlmZmVyZW5jZSAqLworICAgICAgICAgICAgaWYgKHNbal0gPT0gY2gpIHsKKyAgICAgICAgICAgICAgICBTUExJVF9BREQocywgaSwgaik7CisgICAgICAgICAgICAgICAgaSA9IGogPSBqICsgMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSAwICYmIGNvdW50ID09IDAgJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgeworICAgICAgICAvKiBjaCBub3QgaW4gc2VsZiwgc28ganVzdCB1c2Ugc2VsZiBhcyBsaXN0WzBdICovCisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QsIDAsIChQeU9iamVjdCAqKXNlbGYpOworICAgICAgICBjb3VudCsrOworICAgIH0KKyAgICBlbHNlIGlmIChpIDw9IGxlbikgeworICAgICAgICBTUExJVF9BREQocywgaSwgbGVuKTsKKyAgICB9CisgICAgRklYX1BSRUFMTE9DX1NJWkUobGlzdCk7CisgICAgcmV0dXJuIGxpc3Q7CiAKICAgb25FcnJvcjoKLQlQeV9ERUNSRUYobGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGxpc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIoc3BsaXRfX2RvY19fLApAQCAtMTUyMSw3MSArMTUyMSw3MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19zcGxpdChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgbiwgaSwgajsKLQlQeV9zc2l6ZV90IG1heHNwbGl0ID0gLTEsIGNvdW50PTA7Ci0JY29uc3QgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnN1YjsKLQlQeU9iamVjdCAqbGlzdCwgKnN0ciwgKnN1Ym9iaiA9IFB5X05vbmU7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgbiwgaSwgajsKKyAgICBQeV9zc2l6ZV90IG1heHNwbGl0ID0gLTEsIGNvdW50PTA7CisgICAgY29uc3QgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnN1YjsKKyAgICBQeU9iamVjdCAqbGlzdCwgKnN0ciwgKnN1Ym9iaiA9IFB5X05vbmU7CiAjaWZkZWYgVVNFX0ZBU1QKLQlQeV9zc2l6ZV90IHBvczsKKyAgICBQeV9zc2l6ZV90IHBvczsKICNlbmRpZgogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8T246c3BsaXQiLCAmc3Vib2JqLCAmbWF4c3BsaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobWF4c3BsaXQgPCAwKQotCQltYXhzcGxpdCA9IFBZX1NTSVpFX1RfTUFYOwotCWlmIChzdWJvYmogPT0gUHlfTm9uZSkKLQkJcmV0dXJuIHNwbGl0X3doaXRlc3BhY2Uoc2VsZiwgbGVuLCBtYXhzcGxpdCk7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHN1Ym9iaikpIHsKLQkJc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1Ym9iaik7Ci0JCW4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJvYmopOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPbjpzcGxpdCIsICZzdWJvYmosICZtYXhzcGxpdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtYXhzcGxpdCA8IDApCisgICAgICAgIG1heHNwbGl0ID0gUFlfU1NJWkVfVF9NQVg7CisgICAgaWYgKHN1Ym9iaiA9PSBQeV9Ob25lKQorICAgICAgICByZXR1cm4gc3BsaXRfd2hpdGVzcGFjZShzZWxmLCBsZW4sIG1heHNwbGl0KTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vib2JqKTsKKyAgICAgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Ym9iaik7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkKLQkJcmV0dXJuIFB5VW5pY29kZV9TcGxpdCgoUHlPYmplY3QgKilzZWxmLCBzdWJvYmosIG1heHNwbGl0KTsKKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9TcGxpdCgoUHlPYmplY3QgKilzZWxmLCBzdWJvYmosIG1heHNwbGl0KTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJvYmosICZzdWIsICZuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1Ym9iaiwgJnN1YiwgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzZXBhcmF0b3IiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgaWYgKG4gPT0gMSkKLQkJcmV0dXJuIHNwbGl0X2NoYXIoc2VsZiwgbGVuLCBzdWJbMF0sIG1heHNwbGl0KTsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc2VwYXJhdG9yIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChuID09IDEpCisgICAgICAgIHJldHVybiBzcGxpdF9jaGFyKHNlbGYsIGxlbiwgc3ViWzBdLCBtYXhzcGxpdCk7CiAKLQlsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heHNwbGl0KSk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoUFJFQUxMT0NfU0laRShtYXhzcGxpdCkpOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgVVNFX0ZBU1QKLQlpID0gaiA9IDA7Ci0Jd2hpbGUgKG1heHNwbGl0LS0gPiAwKSB7Ci0JCXBvcyA9IGZhc3RzZWFyY2gocytpLCBsZW4taSwgc3ViLCBuLCBGQVNUX1NFQVJDSCk7Ci0JCWlmIChwb3MgPCAwKQotCQkJYnJlYWs7Ci0JCWogPSBpK3BvczsKLQkJU1BMSVRfQUREKHMsIGksIGopOwotCQlpID0gaiArIG47Ci0JfQorICAgIGkgPSBqID0gMDsKKyAgICB3aGlsZSAobWF4c3BsaXQtLSA+IDApIHsKKyAgICAgICAgcG9zID0gZmFzdHNlYXJjaChzK2ksIGxlbi1pLCBzdWIsIG4sIEZBU1RfU0VBUkNIKTsKKyAgICAgICAgaWYgKHBvcyA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaiA9IGkrcG9zOworICAgICAgICBTUExJVF9BREQocywgaSwgaik7CisgICAgICAgIGkgPSBqICsgbjsKKyAgICB9CiAjZWxzZQotCWkgPSBqID0gMDsKLQl3aGlsZSAoKGorbiA8PSBsZW4pICYmIChtYXhzcGxpdC0tID4gMCkpIHsKLQkJZm9yICg7IGorbiA8PSBsZW47IGorKykgewotCQkJaWYgKFB5X1NUUklOR19NQVRDSChzLCBqLCBzdWIsIG4pKSB7Ci0JCQkJU1BMSVRfQUREKHMsIGksIGopOwotCQkJCWkgPSBqID0gaiArIG47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaSA9IGogPSAwOworICAgIHdoaWxlICgoaituIDw9IGxlbikgJiYgKG1heHNwbGl0LS0gPiAwKSkgeworICAgICAgICBmb3IgKDsgaituIDw9IGxlbjsgaisrKSB7CisgICAgICAgICAgICBpZiAoUHlfU1RSSU5HX01BVENIKHMsIGosIHN1YiwgbikpIHsKKyAgICAgICAgICAgICAgICBTUExJVF9BREQocywgaSwgaik7CisgICAgICAgICAgICAgICAgaSA9IGogPSBqICsgbjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KICNlbmRpZgotCVNQTElUX0FERChzLCBpLCBsZW4pOwotCUZJWF9QUkVBTExPQ19TSVpFKGxpc3QpOwotCXJldHVybiBsaXN0OworICAgIFNQTElUX0FERChzLCBpLCBsZW4pOworICAgIEZJWF9QUkVBTExPQ19TSVpFKGxpc3QpOworICAgIHJldHVybiBsaXN0OwogCiAgb25FcnJvcjoKLQlQeV9ERUNSRUYobGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGxpc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIocGFydGl0aW9uX19kb2NfXywKQEAgLTE1OTgsMjUgKzE1OTgsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcGFydGl0aW9uKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VwX29iaikKIHsKLQljb25zdCBjaGFyICpzZXA7Ci0JUHlfc3NpemVfdCBzZXBfbGVuOworICAgIGNvbnN0IGNoYXIgKnNlcDsKKyAgICBQeV9zc2l6ZV90IHNlcF9sZW47CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc2VwX29iaikpIHsKLQkJc2VwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlcF9vYmopOwotCQlzZXBfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VwX29iaik7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayhzZXBfb2JqKSkgeworICAgICAgICBzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VwX29iaik7CisgICAgICAgIHNlcF9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZXBfb2JqKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzZXBfb2JqKSkKLQkJcmV0dXJuIFB5VW5pY29kZV9QYXJ0aXRpb24oKFB5T2JqZWN0ICopIHNlbGYsIHNlcF9vYmopOworICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzZXBfb2JqKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9QYXJ0aXRpb24oKFB5T2JqZWN0ICopIHNlbGYsIHNlcF9vYmopOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHNlcF9vYmosICZzZXAsICZzZXBfbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHNlcF9vYmosICZzZXAsICZzZXBfbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gc3RyaW5nbGliX3BhcnRpdGlvbigKLQkJKFB5T2JqZWN0Kikgc2VsZiwKLQkJUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwKLQkJc2VwX29iaiwgc2VwLCBzZXBfbGVuCi0JCSk7CisgICAgcmV0dXJuIHN0cmluZ2xpYl9wYXJ0aXRpb24oCisgICAgICAgIChQeU9iamVjdCopIHNlbGYsCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisgICAgICAgIHNlcF9vYmosIHNlcCwgc2VwX2xlbgorICAgICAgICApOwogfQogCiBQeURvY19TVFJWQVIocnBhcnRpdGlvbl9fZG9jX18sCkBAIC0xNjI5LDEwOSArMTYyOSwxMDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcnBhcnRpdGlvbihQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcF9vYmopCiB7Ci0JY29uc3QgY2hhciAqc2VwOwotCVB5X3NzaXplX3Qgc2VwX2xlbjsKKyAgICBjb25zdCBjaGFyICpzZXA7CisgICAgUHlfc3NpemVfdCBzZXBfbGVuOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHNlcF9vYmopKSB7Ci0JCXNlcCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZXBfb2JqKTsKLQkJc2VwX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlcF9vYmopOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc2VwX29iaikpIHsKKyAgICAgICAgc2VwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlcF9vYmopOworICAgICAgICBzZXBfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VwX29iaik7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc2VwX29iaikpCi0JCXJldHVybiBQeVVuaWNvZGVfUlBhcnRpdGlvbigoUHlPYmplY3QgKikgc2VsZiwgc2VwX29iaik7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHNlcF9vYmopKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX1JQYXJ0aXRpb24oKFB5T2JqZWN0ICopIHNlbGYsIHNlcF9vYmopOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHNlcF9vYmosICZzZXAsICZzZXBfbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHNlcF9vYmosICZzZXAsICZzZXBfbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gc3RyaW5nbGliX3JwYXJ0aXRpb24oCi0JCShQeU9iamVjdCopIHNlbGYsCi0JCVB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCi0JCXNlcF9vYmosIHNlcCwgc2VwX2xlbgotCQkpOworICAgIHJldHVybiBzdHJpbmdsaWJfcnBhcnRpdGlvbigKKyAgICAgICAgKFB5T2JqZWN0Kikgc2VsZiwKKyAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwKKyAgICAgICAgc2VwX29iaiwgc2VwLCBzZXBfbGVuCisgICAgICAgICk7CiB9CiAKIFB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogcnNwbGl0X3doaXRlc3BhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgbGVuLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogewotCWNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JUHlfc3NpemVfdCBpLCBqLCBjb3VudD0wOwotCVB5T2JqZWN0ICpzdHI7Ci0JUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KFBSRUFMTE9DX1NJWkUobWF4c3BsaXQpKTsKKyAgICBjb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIFB5X3NzaXplX3QgaSwgaiwgY291bnQ9MDsKKyAgICBQeU9iamVjdCAqc3RyOworICAgIFB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heHNwbGl0KSk7CiAKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWkgPSBqID0gbGVuLTE7CisgICAgaSA9IGogPSBsZW4tMTsKIAotCXdoaWxlIChtYXhzcGxpdC0tID4gMCkgewotCQlSU0tJUF9TUEFDRShzLCBpKTsKLQkJaWYgKGk8MCkgYnJlYWs7Ci0JCWogPSBpOyBpLS07Ci0JCVJTS0lQX05PTlNQQUNFKHMsIGkpOwotCQlpZiAoaiA9PSBsZW4tMSAmJiBpIDwgMCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0JCQkvKiBObyB3aGl0ZXNwYWNlIGluIHNlbGYsIHNvIGp1c3QgdXNlIGl0IGFzIGxpc3RbMF0gKi8KLQkJCVB5X0lOQ1JFRihzZWxmKTsKLQkJCVB5TGlzdF9TRVRfSVRFTShsaXN0LCAwLCAoUHlPYmplY3QgKilzZWxmKTsKLQkJCWNvdW50Kys7Ci0JCQlicmVhazsKLQkJfQotCQlTUExJVF9BREQocywgaSArIDEsIGogKyAxKTsKLQl9Ci0JaWYgKGkgPj0gMCkgewotCQkvKiBPbmx5IG9jY3VycyB3aGVuIG1heHNwbGl0IHdhcyByZWFjaGVkICovCi0JCS8qIFNraXAgYW55IHJlbWFpbmluZyB3aGl0ZXNwYWNlIGFuZCBjb3B5IHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgKi8KLQkJUlNLSVBfU1BBQ0UocywgaSk7Ci0JCWlmIChpID49IDApCi0JCQlTUExJVF9BREQocywgMCwgaSArIDEpOworICAgIHdoaWxlIChtYXhzcGxpdC0tID4gMCkgeworICAgICAgICBSU0tJUF9TUEFDRShzLCBpKTsKKyAgICAgICAgaWYgKGk8MCkgYnJlYWs7CisgICAgICAgIGogPSBpOyBpLS07CisgICAgICAgIFJTS0lQX05PTlNQQUNFKHMsIGkpOworICAgICAgICBpZiAoaiA9PSBsZW4tMSAmJiBpIDwgMCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CisgICAgICAgICAgICAvKiBObyB3aGl0ZXNwYWNlIGluIHNlbGYsIHNvIGp1c3QgdXNlIGl0IGFzIGxpc3RbMF0gKi8KKyAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCAwLCAoUHlPYmplY3QgKilzZWxmKTsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTUExJVF9BREQocywgaSArIDEsIGogKyAxKTsKKyAgICB9CisgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAvKiBPbmx5IG9jY3VycyB3aGVuIG1heHNwbGl0IHdhcyByZWFjaGVkICovCisgICAgICAgIC8qIFNraXAgYW55IHJlbWFpbmluZyB3aGl0ZXNwYWNlIGFuZCBjb3B5IHRvIGJlZ2lubmluZyBvZiBzdHJpbmcgKi8KKyAgICAgICAgUlNLSVBfU1BBQ0UocywgaSk7CisgICAgICAgIGlmIChpID49IDApCisgICAgICAgICAgICBTUExJVF9BREQocywgMCwgaSArIDEpOwogCi0JfQotCUZJWF9QUkVBTExPQ19TSVpFKGxpc3QpOwotCWlmIChQeUxpc3RfUmV2ZXJzZShsaXN0KSA8IDApCi0JCWdvdG8gb25FcnJvcjsKLQlyZXR1cm4gbGlzdDsKKyAgICB9CisgICAgRklYX1BSRUFMTE9DX1NJWkUobGlzdCk7CisgICAgaWYgKFB5TGlzdF9SZXZlcnNlKGxpc3QpIDwgMCkKKyAgICAgICAgZ290byBvbkVycm9yOworICAgIHJldHVybiBsaXN0OwogICBvbkVycm9yOgotCVB5X0RFQ1JFRihsaXN0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogcnNwbGl0X2NoYXIoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgbGVuLCBjaGFyIGNoLCBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCWNvbnN0IGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBqLCBjb3VudD0wOwotCVB5T2JqZWN0ICpzdHI7Ci0JUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KFBSRUFMTE9DX1NJWkUobWF4Y291bnQpKTsKKyAgICBjb25zdCBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgaiwgY291bnQ9MDsKKyAgICBQeU9iamVjdCAqc3RyOworICAgIFB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heGNvdW50KSk7CiAKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWkgPSBqID0gbGVuIC0gMTsKLQl3aGlsZSAoKGkgPj0gMCkgJiYgKG1heGNvdW50LS0gPiAwKSkgewotCQlmb3IgKDsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChzW2ldID09IGNoKSB7Ci0JCQkJU1BMSVRfQUREKHMsIGkgKyAxLCBqICsgMSk7Ci0JCQkJaiA9IGkgPSBpIC0gMTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAoaSA8IDAgJiYgY291bnQgPT0gMCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0JCS8qIGNoIG5vdCBpbiBzZWxmLCBzbyBqdXN0IHVzZSBzZWxmIGFzIGxpc3RbMF0gKi8KLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlQeUxpc3RfU0VUX0lURU0obGlzdCwgMCwgKFB5T2JqZWN0ICopc2VsZik7Ci0JCWNvdW50Kys7Ci0JfQotCWVsc2UgaWYgKGogPj0gLTEpIHsKLQkJU1BMSVRfQUREKHMsIDAsIGogKyAxKTsKLQl9Ci0JRklYX1BSRUFMTE9DX1NJWkUobGlzdCk7Ci0JaWYgKFB5TGlzdF9SZXZlcnNlKGxpc3QpIDwgMCkKLQkJZ290byBvbkVycm9yOwotCXJldHVybiBsaXN0OworICAgIGkgPSBqID0gbGVuIC0gMTsKKyAgICB3aGlsZSAoKGkgPj0gMCkgJiYgKG1heGNvdW50LS0gPiAwKSkgeworICAgICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIGlmIChzW2ldID09IGNoKSB7CisgICAgICAgICAgICAgICAgU1BMSVRfQUREKHMsIGkgKyAxLCBqICsgMSk7CisgICAgICAgICAgICAgICAgaiA9IGkgPSBpIC0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA8IDAgJiYgY291bnQgPT0gMCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CisgICAgICAgIC8qIGNoIG5vdCBpbiBzZWxmLCBzbyBqdXN0IHVzZSBzZWxmIGFzIGxpc3RbMF0gKi8KKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICBQeUxpc3RfU0VUX0lURU0obGlzdCwgMCwgKFB5T2JqZWN0ICopc2VsZik7CisgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgIGVsc2UgaWYgKGogPj0gLTEpIHsKKyAgICAgICAgU1BMSVRfQUREKHMsIDAsIGogKyAxKTsKKyAgICB9CisgICAgRklYX1BSRUFMTE9DX1NJWkUobGlzdCk7CisgICAgaWYgKFB5TGlzdF9SZXZlcnNlKGxpc3QpIDwgMCkKKyAgICAgICAgZ290byBvbkVycm9yOworICAgIHJldHVybiBsaXN0OwogCiAgb25FcnJvcjoKLQlQeV9ERUNSRUYobGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGxpc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIocnNwbGl0X19kb2NfXywKQEAgLTE3NDYsNjIgKzE3NDYsNjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcnNwbGl0KFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBuLCBpLCBqOwotCVB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMSwgY291bnQ9MDsKLQljb25zdCBjaGFyICpzLCAqc3ViOwotCVB5T2JqZWN0ICpsaXN0LCAqc3RyLCAqc3Vib2JqID0gUHlfTm9uZTsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBuLCBpLCBqOworICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgPSAtMSwgY291bnQ9MDsKKyAgICBjb25zdCBjaGFyICpzLCAqc3ViOworICAgIFB5T2JqZWN0ICpsaXN0LCAqc3RyLCAqc3Vib2JqID0gUHlfTm9uZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE9uOnJzcGxpdCIsICZzdWJvYmosICZtYXhzcGxpdCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChtYXhzcGxpdCA8IDApCi0JCW1heHNwbGl0ID0gUFlfU1NJWkVfVF9NQVg7Ci0JaWYgKHN1Ym9iaiA9PSBQeV9Ob25lKQotCQlyZXR1cm4gcnNwbGl0X3doaXRlc3BhY2Uoc2VsZiwgbGVuLCBtYXhzcGxpdCk7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHN1Ym9iaikpIHsKLQkJc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1Ym9iaik7Ci0JCW4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJvYmopOwotCX0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPbjpyc3BsaXQiLCAmc3Vib2JqLCAmbWF4c3BsaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobWF4c3BsaXQgPCAwKQorICAgICAgICBtYXhzcGxpdCA9IFBZX1NTSVpFX1RfTUFYOworICAgIGlmIChzdWJvYmogPT0gUHlfTm9uZSkKKyAgICAgICAgcmV0dXJuIHJzcGxpdF93aGl0ZXNwYWNlKHNlbGYsIGxlbiwgbWF4c3BsaXQpOworICAgIGlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7CisgICAgICAgIHN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJvYmopOworICAgICAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vib2JqKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJvYmopKQotCQlyZXR1cm4gUHlVbmljb2RlX1JTcGxpdCgoUHlPYmplY3QgKilzZWxmLCBzdWJvYmosIG1heHNwbGl0KTsKKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9SU3BsaXQoKFB5T2JqZWN0ICopc2VsZiwgc3Vib2JqLCBtYXhzcGxpdCk7CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3ViLCAmbikpCi0JCXJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJvYmosICZzdWIsICZuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAobiA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1wdHkgc2VwYXJhdG9yIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQllbHNlIGlmIChuID09IDEpCi0JCXJldHVybiByc3BsaXRfY2hhcihzZWxmLCBsZW4sIHN1YlswXSwgbWF4c3BsaXQpOworICAgIGlmIChuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJlbXB0eSBzZXBhcmF0b3IiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKG4gPT0gMSkKKyAgICAgICAgcmV0dXJuIHJzcGxpdF9jaGFyKHNlbGYsIGxlbiwgc3ViWzBdLCBtYXhzcGxpdCk7CiAKLQlsaXN0ID0gUHlMaXN0X05ldyhQUkVBTExPQ19TSVpFKG1heHNwbGl0KSk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoUFJFQUxMT0NfU0laRShtYXhzcGxpdCkpOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaiA9IGxlbjsKLQlpID0gaiAtIG47CisgICAgaiA9IGxlbjsKKyAgICBpID0gaiAtIG47CiAKLQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCXdoaWxlICggKGkgPj0gMCkgJiYgKG1heHNwbGl0LS0gPiAwKSApIHsKLQkJZm9yICg7IGk+PTA7IGktLSkgewotCQkJaWYgKFB5X1NUUklOR19NQVRDSChzLCBpLCBzdWIsIG4pKSB7Ci0JCQkJU1BMSVRfQUREKHMsIGkgKyBuLCBqKTsKLQkJCQlqID0gaTsKLQkJCQlpIC09IG47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JU1BMSVRfQUREKHMsIDAsIGopOwotCUZJWF9QUkVBTExPQ19TSVpFKGxpc3QpOwotCWlmIChQeUxpc3RfUmV2ZXJzZShsaXN0KSA8IDApCi0JCWdvdG8gb25FcnJvcjsKLQlyZXR1cm4gbGlzdDsKKyAgICBzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHdoaWxlICggKGkgPj0gMCkgJiYgKG1heHNwbGl0LS0gPiAwKSApIHsKKyAgICAgICAgZm9yICg7IGk+PTA7IGktLSkgeworICAgICAgICAgICAgaWYgKFB5X1NUUklOR19NQVRDSChzLCBpLCBzdWIsIG4pKSB7CisgICAgICAgICAgICAgICAgU1BMSVRfQUREKHMsIGkgKyBuLCBqKTsKKyAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICBpIC09IG47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgU1BMSVRfQUREKHMsIDAsIGopOworICAgIEZJWF9QUkVBTExPQ19TSVpFKGxpc3QpOworICAgIGlmIChQeUxpc3RfUmV2ZXJzZShsaXN0KSA8IDApCisgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICByZXR1cm4gbGlzdDsKIAogb25FcnJvcjoKLQlQeV9ERUNSRUYobGlzdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKGxpc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTE4MTQsMTY3ICsxODE0LDE2NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19qb2luKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3JpZykKIHsKLQljaGFyICpzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JY29uc3QgUHlfc3NpemVfdCBzZXBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQljaGFyICpwOwotCVB5X3NzaXplX3Qgc2VxbGVuID0gMDsKLQlzaXplX3Qgc3ogPSAwOwotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqc2VxLCAqaXRlbTsKKyAgICBjaGFyICpzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgY29uc3QgUHlfc3NpemVfdCBzZXBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKKyAgICBjaGFyICpwOworICAgIFB5X3NzaXplX3Qgc2VxbGVuID0gMDsKKyAgICBzaXplX3Qgc3ogPSAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeU9iamVjdCAqc2VxLCAqaXRlbTsKIAotCXNlcSA9IFB5U2VxdWVuY2VfRmFzdChvcmlnLCAiIik7Ci0JaWYgKHNlcSA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBzZXEgPSBQeVNlcXVlbmNlX0Zhc3Qob3JpZywgIiIpOworICAgIGlmIChzZXEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzZXFsZW4gPSBQeVNlcXVlbmNlX1NpemUoc2VxKTsKLQlpZiAoc2VxbGVuID09IDApIHsKLQkJUHlfREVDUkVGKHNlcSk7Ci0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKLQl9Ci0JaWYgKHNlcWxlbiA9PSAxKSB7Ci0JCWl0ZW0gPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oc2VxLCAwKTsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QoaXRlbSkgfHwgUHlVbmljb2RlX0NoZWNrRXhhY3QoaXRlbSkpIHsKLQkJCVB5X0lOQ1JFRihpdGVtKTsKLQkJCVB5X0RFQ1JFRihzZXEpOwotCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQl9CisgICAgc2VxbGVuID0gUHlTZXF1ZW5jZV9TaXplKHNlcSk7CisgICAgaWYgKHNlcWxlbiA9PSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihzZXEpOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7CisgICAgfQorICAgIGlmIChzZXFsZW4gPT0gMSkgeworICAgICAgICBpdGVtID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKHNlcSwgMCk7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KGl0ZW0pIHx8IFB5VW5pY29kZV9DaGVja0V4YWN0KGl0ZW0pKSB7CisgICAgICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAgICB9CisgICAgfQogCi0JLyogVGhlcmUgYXJlIGF0IGxlYXN0IHR3byB0aGluZ3MgdG8gam9pbiwgb3IgZWxzZSB3ZSBoYXZlIGEgc3ViY2xhc3MKLQkgKiBvZiB0aGUgYnVpbHRpbiB0eXBlcyBpbiB0aGUgc2VxdWVuY2UuCi0JICogRG8gYSBwcmUtcGFzcyB0byBmaWd1cmUgb3V0IHRoZSB0b3RhbCBhbW91bnQgb2Ygc3BhY2Ugd2UnbGwKLQkgKiBuZWVkIChzeiksIHNlZSB3aGV0aGVyIGFueSBhcmd1bWVudCBpcyBhYnN1cmQsIGFuZCBkZWZlciB0bwotCSAqIHRoZSBVbmljb2RlIGpvaW4gaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHNlcWxlbjsgaSsrKSB7Ci0JCWNvbnN0IHNpemVfdCBvbGRfc3ogPSBzejsKLQkJaXRlbSA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShzZXEsIGkpOwotCQlpZiAoIVB5U3RyaW5nX0NoZWNrKGl0ZW0pKXsKKyAgICAvKiBUaGVyZSBhcmUgYXQgbGVhc3QgdHdvIHRoaW5ncyB0byBqb2luLCBvciBlbHNlIHdlIGhhdmUgYSBzdWJjbGFzcworICAgICAqIG9mIHRoZSBidWlsdGluIHR5cGVzIGluIHRoZSBzZXF1ZW5jZS4KKyAgICAgKiBEbyBhIHByZS1wYXNzIHRvIGZpZ3VyZSBvdXQgdGhlIHRvdGFsIGFtb3VudCBvZiBzcGFjZSB3ZSdsbAorICAgICAqIG5lZWQgKHN6KSwgc2VlIHdoZXRoZXIgYW55IGFyZ3VtZW50IGlzIGFic3VyZCwgYW5kIGRlZmVyIHRvCisgICAgICogdGhlIFVuaWNvZGUgam9pbiBpZiBhcHByb3ByaWF0ZS4KKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2VxbGVuOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG9sZF9zeiA9IHN6OworICAgICAgICBpdGVtID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKHNlcSwgaSk7CisgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpewogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCWlmIChQeVVuaWNvZGVfQ2hlY2soaXRlbSkpIHsKLQkJCQkvKiBEZWZlciB0byBVbmljb2RlIGpvaW4uCi0JCQkJICogQ0FVVElPTjogIFRoZXJlJ3Mgbm8gZ3VyYW50ZWUgdGhhdCB0aGUKLQkJCQkgKiBvcmlnaW5hbCBzZXF1ZW5jZSBjYW4gYmUgaXRlcmF0ZWQgb3ZlcgotCQkJCSAqIGFnYWluLCBzbyB3ZSBtdXN0IHBhc3Mgc2VxIGhlcmUuCi0JCQkJICovCi0JCQkJUHlPYmplY3QgKnJlc3VsdDsKLQkJCQlyZXN1bHQgPSBQeVVuaWNvZGVfSm9pbigoUHlPYmplY3QgKilzZWxmLCBzZXEpOwotCQkJCVB5X0RFQ1JFRihzZXEpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9CisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgLyogRGVmZXIgdG8gVW5pY29kZSBqb2luLgorICAgICAgICAgICAgICAgICAqIENBVVRJT046ICBUaGVyZSdzIG5vIGd1cmFudGVlIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICogb3JpZ2luYWwgc2VxdWVuY2UgY2FuIGJlIGl0ZXJhdGVkIG92ZXIKKyAgICAgICAgICAgICAgICAgKiBhZ2Fpbiwgc28gd2UgbXVzdCBwYXNzIHNlcSBoZXJlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0pvaW4oKFB5T2JqZWN0ICopc2VsZiwgc2VxKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgInNlcXVlbmNlIGl0ZW0gJXpkOiBleHBlY3RlZCBzdHJpbmcsIgotCQkJCSAgICAgIiAlLjgwcyBmb3VuZCIsCi0JCQkJICAgICBpLCBQeV9UWVBFKGl0ZW0pLT50cF9uYW1lKTsKLQkJCVB5X0RFQ1JFRihzZXEpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3ogKz0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7Ci0JCWlmIChpICE9IDApCi0JCQlzeiArPSBzZXBsZW47Ci0JCWlmIChzeiA8IG9sZF9zeiB8fCBzeiA+IFBZX1NTSVpFX1RfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkiam9pbigpIHJlc3VsdCBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7Ci0JCQlQeV9ERUNSRUYoc2VxKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UgaXRlbSAlemQ6IGV4cGVjdGVkIHN0cmluZywiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAlLjgwcyBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaSwgUHlfVFlQRShpdGVtKS0+dHBfbmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN6ICs9IFB5U3RyaW5nX0dFVF9TSVpFKGl0ZW0pOworICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgc3ogKz0gc2VwbGVuOworICAgICAgICBpZiAoc3ogPCBvbGRfc3ogfHwgc3ogPiBQWV9TU0laRV9UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgImpvaW4oKSByZXN1bHQgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOworICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIEFsbG9jYXRlIHJlc3VsdCBzcGFjZS4gKi8KLQlyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopTlVMTCwgc3opOwotCWlmIChyZXMgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoc2VxKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIEFsbG9jYXRlIHJlc3VsdCBzcGFjZS4gKi8KKyAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopTlVMTCwgc3opOworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VxKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2F0ZW5hdGUgZXZlcnl0aGluZy4gKi8KLQlwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlcyk7Ci0JZm9yIChpID0gMDsgaSA8IHNlcWxlbjsgKytpKSB7Ci0JCXNpemVfdCBuOwotCQlpdGVtID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKHNlcSwgaSk7Ci0JCW4gPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKLQkJUHlfTUVNQ1BZKHAsIFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKSwgbik7Ci0JCXAgKz0gbjsKLQkJaWYgKGkgPCBzZXFsZW4gLSAxKSB7Ci0JCQlQeV9NRU1DUFkocCwgc2VwLCBzZXBsZW4pOwotCQkJcCArPSBzZXBsZW47Ci0JCX0KLQl9CisgICAgLyogQ2F0ZW5hdGUgZXZlcnl0aGluZy4gKi8KKyAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IHNlcWxlbjsgKytpKSB7CisgICAgICAgIHNpemVfdCBuOworICAgICAgICBpdGVtID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKHNlcSwgaSk7CisgICAgICAgIG4gPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKKyAgICAgICAgUHlfTUVNQ1BZKHAsIFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKSwgbik7CisgICAgICAgIHAgKz0gbjsKKyAgICAgICAgaWYgKGkgPCBzZXFsZW4gLSAxKSB7CisgICAgICAgICAgICBQeV9NRU1DUFkocCwgc2VwLCBzZXBsZW4pOworICAgICAgICAgICAgcCArPSBzZXBsZW47CisgICAgICAgIH0KKyAgICB9CiAKLQlQeV9ERUNSRUYoc2VxKTsKLQlyZXR1cm4gcmVzOworICAgIFB5X0RFQ1JFRihzZXEpOworICAgIHJldHVybiByZXM7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeVN0cmluZ19Kb2luKFB5T2JqZWN0ICpzZXAsIFB5T2JqZWN0ICp4KQogewotCWFzc2VydChzZXAgIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhzZXApKTsKLQlhc3NlcnQoeCAhPSBOVUxMKTsKLQlyZXR1cm4gc3RyaW5nX2pvaW4oKFB5U3RyaW5nT2JqZWN0ICopc2VwLCB4KTsKKyAgICBhc3NlcnQoc2VwICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2soc2VwKSk7CisgICAgYXNzZXJ0KHggIT0gTlVMTCk7CisgICAgcmV0dXJuIHN0cmluZ19qb2luKChQeVN0cmluZ09iamVjdCAqKXNlcCwgeCk7CiB9CiAKIFB5X0xPQ0FMX0lOTElORSh2b2lkKQogc3RyaW5nX2FkanVzdF9pbmRpY2VzKFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICplbmQsIFB5X3NzaXplX3QgbGVuKQogewotCWlmICgqZW5kID4gbGVuKQotCQkqZW5kID0gbGVuOwotCWVsc2UgaWYgKCplbmQgPCAwKQotCQkqZW5kICs9IGxlbjsKLQlpZiAoKmVuZCA8IDApCi0JCSplbmQgPSAwOwotCWlmICgqc3RhcnQgPCAwKQotCQkqc3RhcnQgKz0gbGVuOwotCWlmICgqc3RhcnQgPCAwKQotCQkqc3RhcnQgPSAwOworICAgIGlmICgqZW5kID4gbGVuKQorICAgICAgICAqZW5kID0gbGVuOworICAgIGVsc2UgaWYgKCplbmQgPCAwKQorICAgICAgICAqZW5kICs9IGxlbjsKKyAgICBpZiAoKmVuZCA8IDApCisgICAgICAgICplbmQgPSAwOworICAgIGlmICgqc3RhcnQgPCAwKQorICAgICAgICAqc3RhcnQgKz0gbGVuOworICAgIGlmICgqc3RhcnQgPCAwKQorICAgICAgICAqc3RhcnQgPSAwOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKIHN0cmluZ19maW5kX2ludGVybmFsKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRpcikKIHsKLQlQeU9iamVjdCAqc3Vib2JqOwotCWNvbnN0IGNoYXIgKnN1YjsKLQlQeV9zc2l6ZV90IHN1Yl9sZW47Ci0JUHlfc3NpemVfdCBzdGFydD0wLCBlbmQ9UFlfU1NJWkVfVF9NQVg7Ci0JUHlPYmplY3QgKm9ial9zdGFydD1QeV9Ob25lLCAqb2JqX2VuZD1QeV9Ob25lOworICAgIFB5T2JqZWN0ICpzdWJvYmo7CisgICAgY29uc3QgY2hhciAqc3ViOworICAgIFB5X3NzaXplX3Qgc3ViX2xlbjsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0PTAsIGVuZD1QWV9TU0laRV9UX01BWDsKKyAgICBQeU9iamVjdCAqb2JqX3N0YXJ0PVB5X05vbmUsICpvYmpfZW5kPVB5X05vbmU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98T086ZmluZC9yZmluZC9pbmRleC9yaW5kZXgiLCAmc3Vib2JqLAotCQkmb2JqX3N0YXJ0LCAmb2JqX2VuZCkpCi0JCXJldHVybiAtMjsKLQkvKiBUbyBzdXBwb3J0IE5vbmUgaW4gInN0YXJ0IiBhbmQgImVuZCIgYXJndW1lbnRzLCBtZWFuaW5nCi0JICAgdGhlIHNhbWUgYXMgaWYgdGhleSB3ZXJlIG5vdCBwYXNzZWQuCi0JKi8KLQlpZiAob2JqX3N0YXJ0ICE9IFB5X05vbmUpCi0JCWlmICghX1B5RXZhbF9TbGljZUluZGV4KG9ial9zdGFydCwgJnN0YXJ0KSkKLQkgICAgICAgIHJldHVybiAtMjsKLQlpZiAob2JqX2VuZCAhPSBQeV9Ob25lKQotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleChvYmpfZW5kLCAmZW5kKSkKLQkgICAgICAgIHJldHVybiAtMjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98T086ZmluZC9yZmluZC9pbmRleC9yaW5kZXgiLCAmc3Vib2JqLAorICAgICAgICAmb2JqX3N0YXJ0LCAmb2JqX2VuZCkpCisgICAgICAgIHJldHVybiAtMjsKKyAgICAvKiBUbyBzdXBwb3J0IE5vbmUgaW4gInN0YXJ0IiBhbmQgImVuZCIgYXJndW1lbnRzLCBtZWFuaW5nCisgICAgICAgdGhlIHNhbWUgYXMgaWYgdGhleSB3ZXJlIG5vdCBwYXNzZWQuCisgICAgKi8KKyAgICBpZiAob2JqX3N0YXJ0ICE9IFB5X05vbmUpCisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KG9ial9zdGFydCwgJnN0YXJ0KSkKKyAgICAgICAgcmV0dXJuIC0yOworICAgIGlmIChvYmpfZW5kICE9IFB5X05vbmUpCisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KG9ial9lbmQsICZlbmQpKQorICAgICAgICByZXR1cm4gLTI7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3Vib2JqKSkgewotCQlzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vib2JqKTsKLQkJc3ViX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Ym9iaik7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7CisgICAgICAgIHN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJvYmopOworICAgICAgICBzdWJfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vib2JqKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJvYmopKQotCQlyZXR1cm4gUHlVbmljb2RlX0ZpbmQoCi0JCQkoUHlPYmplY3QgKilzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsIGRpcik7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRmluZCgKKyAgICAgICAgICAgIChQeU9iamVjdCAqKXNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgZGlyKTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJvYmosICZzdWIsICZzdWJfbGVuKSkKLQkJLyogWFhYIC0gdGhlICJleHBlY3RlZCBhIGNoYXJhY3RlciBidWZmZXIgb2JqZWN0IiBpcyBwcmV0dHkKLQkJICAgY29uZnVzaW5nIGZvciBhIG5vbi1leHBlcnQuICByZW1hcCB0byBzb21ldGhpbmcgZWxzZSA/ICovCi0JCXJldHVybiAtMjsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3ViLCAmc3ViX2xlbikpCisgICAgICAgIC8qIFhYWCAtIHRoZSAiZXhwZWN0ZWQgYSBjaGFyYWN0ZXIgYnVmZmVyIG9iamVjdCIgaXMgcHJldHR5CisgICAgICAgICAgIGNvbmZ1c2luZyBmb3IgYSBub24tZXhwZXJ0LiAgcmVtYXAgdG8gc29tZXRoaW5nIGVsc2UgPyAqLworICAgICAgICByZXR1cm4gLTI7CiAKLQlpZiAoZGlyID4gMCkKLQkJcmV0dXJuIHN0cmluZ2xpYl9maW5kX3NsaWNlKAotCQkJUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwKLQkJCXN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7Ci0JZWxzZQotCQlyZXR1cm4gc3RyaW5nbGliX3JmaW5kX3NsaWNlKAotCQkJUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwKLQkJCXN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7CisgICAgaWYgKGRpciA+IDApCisgICAgICAgIHJldHVybiBzdHJpbmdsaWJfZmluZF9zbGljZSgKKyAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZmluZF9zbGljZSgKKyAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwogfQogCiAKQEAgLTE5OTAsMTAgKzE5OTAsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfZmluZChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7Ci0JaWYgKHJlc3VsdCA9PSAtMikKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CiB9CiAKIApAQCAtMjAwNSwxNSArMjAwNSwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19pbmRleChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7Ci0JaWYgKHJlc3VsdCA9PSAtMikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHJlc3VsdCA9PSAtMSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkic3Vic3RyaW5nIG5vdCBmb3VuZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBzdHJpbmdfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzdHJpbmcgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzdWx0KTsKIH0KIAogCkBAIC0yMDI5LDEwICsyMDI5LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JmaW5kKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IHJlc3VsdCA9IHN0cmluZ19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKLQlpZiAocmVzdWx0ID09IC0yKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IHN0cmluZ19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzdWx0KTsKIH0KIAogCkBAIC0yMDQ0LDExNSArMjA0NCwxMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcmluZGV4KFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IHJlc3VsdCA9IHN0cmluZ19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKLQlpZiAocmVzdWx0ID09IC0yKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocmVzdWx0ID09IC0xKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJzdWJzdHJpbmcgbm90IGZvdW5kIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IHN0cmluZ19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN1YnN0cmluZyBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXN1bHQpOwogfQogCiAKIFB5X0xPQ0FMX0lOTElORShQeU9iamVjdCAqKQogZG9feHN0cmlwKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBpbnQgc3RyaXB0eXBlLCBQeU9iamVjdCAqc2Vwb2JqKQogewotCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQljaGFyICpzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2Vwb2JqKTsKLQlQeV9zc2l6ZV90IHNlcGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlcG9iaik7Ci0JUHlfc3NpemVfdCBpLCBqOworICAgIGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBjaGFyICpzZXAgPSBQeVN0cmluZ19BU19TVFJJTkcoc2Vwb2JqKTsKKyAgICBQeV9zc2l6ZV90IHNlcGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlcG9iaik7CisgICAgUHlfc3NpemVfdCBpLCBqOwogCi0JaSA9IDA7Ci0JaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7Ci0JCXdoaWxlIChpIDwgbGVuICYmIG1lbWNocihzZXAsIFB5X0NIQVJNQVNLKHNbaV0pLCBzZXBsZW4pKSB7Ci0JCQlpKys7Ci0JCX0KLQl9CisgICAgaSA9IDA7CisgICAgaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7CisgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIG1lbWNocihzZXAsIFB5X0NIQVJNQVNLKHNbaV0pLCBzZXBsZW4pKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CiAKLQlqID0gbGVuOwotCWlmIChzdHJpcHR5cGUgIT0gTEVGVFNUUklQKSB7Ci0JCWRvIHsKLQkJCWotLTsKLQkJfSB3aGlsZSAoaiA+PSBpICYmIG1lbWNocihzZXAsIFB5X0NIQVJNQVNLKHNbal0pLCBzZXBsZW4pKTsKLQkJaisrOwotCX0KKyAgICBqID0gbGVuOworICAgIGlmIChzdHJpcHR5cGUgIT0gTEVGVFNUUklQKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGotLTsKKyAgICAgICAgfSB3aGlsZSAoaiA+PSBpICYmIG1lbWNocihzZXAsIFB5X0NIQVJNQVNLKHNbal0pLCBzZXBsZW4pKTsKKyAgICAgICAgaisrOworICAgIH0KIAotCWlmIChpID09IDAgJiYgaiA9PSBsZW4gJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiAoUHlPYmplY3QqKXNlbGY7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraSwgai1pKTsKKyAgICBpZiAoaSA9PSAwICYmIGogPT0gbGVuICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2ksIGotaSk7CiB9CiAKIAogUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCiBkb19zdHJpcChQeVN0cmluZ09iamVjdCAqc2VsZiwgaW50IHN0cmlwdHlwZSkKIHsKLQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwotCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksIGksIGo7CisgICAgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBpLCBqOwogCi0JaSA9IDA7Ci0JaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7Ci0JCXdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7Ci0JCQlpKys7Ci0JCX0KLQl9CisgICAgaSA9IDA7CisgICAgaWYgKHN0cmlwdHlwZSAhPSBSSUdIVFNUUklQKSB7CisgICAgICAgIHdoaWxlIChpIDwgbGVuICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tpXSkpKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CiAKLQlqID0gbGVuOwotCWlmIChzdHJpcHR5cGUgIT0gTEVGVFNUUklQKSB7Ci0JCWRvIHsKLQkJCWotLTsKLQkJfSB3aGlsZSAoaiA+PSBpICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tqXSkpKTsKLQkJaisrOwotCX0KKyAgICBqID0gbGVuOworICAgIGlmIChzdHJpcHR5cGUgIT0gTEVGVFNUUklQKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGotLTsKKyAgICAgICAgfSB3aGlsZSAoaiA+PSBpICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soc1tqXSkpKTsKKyAgICAgICAgaisrOworICAgIH0KIAotCWlmIChpID09IDAgJiYgaiA9PSBsZW4gJiYgUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgewotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiAoUHlPYmplY3QqKXNlbGY7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMraSwgai1pKTsKKyAgICBpZiAoaSA9PSAwICYmIGogPT0gbGVuICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0KilzZWxmOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzK2ksIGotaSk7CiB9CiAKIAogUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCiBkb19hcmdzdHJpcChQeVN0cmluZ09iamVjdCAqc2VsZiwgaW50IHN0cmlwdHlwZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnNlcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnNlcCA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgKGNoYXIgKilzdHJpcGZvcm1hdFtzdHJpcHR5cGVdLCAmc2VwKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIChjaGFyICopc3RyaXBmb3JtYXRbc3RyaXB0eXBlXSwgJnNlcCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHNlcCAhPSBOVUxMICYmIHNlcCAhPSBQeV9Ob25lKSB7Ci0JCWlmIChQeVN0cmluZ19DaGVjayhzZXApKQotCQkJcmV0dXJuIGRvX3hzdHJpcChzZWxmLCBzdHJpcHR5cGUsIHNlcCk7CisgICAgaWYgKHNlcCAhPSBOVUxMICYmIHNlcCAhPSBQeV9Ob25lKSB7CisgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhzZXApKQorICAgICAgICAgICAgcmV0dXJuIGRvX3hzdHJpcChzZWxmLCBzdHJpcHR5cGUsIHNlcCk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc2VwKSkgewotCQkJUHlPYmplY3QgKnVuaXNlbGYgPSBQeVVuaWNvZGVfRnJvbU9iamVjdCgoUHlPYmplY3QgKilzZWxmKTsKLQkJCVB5T2JqZWN0ICpyZXM7Ci0JCQlpZiAodW5pc2VsZj09TlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCXJlcyA9IF9QeVVuaWNvZGVfWFN0cmlwKChQeVVuaWNvZGVPYmplY3QgKil1bmlzZWxmLAotCQkJCXN0cmlwdHlwZSwgc2VwKTsKLQkJCVB5X0RFQ1JFRih1bmlzZWxmKTsKLQkJCXJldHVybiByZXM7Ci0JCX0KKyAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHNlcCkpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp1bmlzZWxmID0gUHlVbmljb2RlX0Zyb21PYmplY3QoKFB5T2JqZWN0ICopc2VsZik7CisgICAgICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICAgICAgaWYgKHVuaXNlbGY9PU5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXMgPSBfUHlVbmljb2RlX1hTdHJpcCgoUHlVbmljb2RlT2JqZWN0ICopdW5pc2VsZiwKKyAgICAgICAgICAgICAgICBzdHJpcHR5cGUsIHNlcCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodW5pc2VsZik7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CiAjZW5kaWYKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQkgICAgICIlcyBhcmcgbXVzdCBiZSBOb25lLCBzdHIgb3IgdW5pY29kZSIsCisgICAgICAgICAgICAgICAgICAgICAiJXMgYXJnIG11c3QgYmUgTm9uZSwgc3RyIG9yIHVuaWNvZGUiLAogI2Vsc2UKLQkJCSAgICAgIiVzIGFyZyBtdXN0IGJlIE5vbmUgb3Igc3RyIiwKKyAgICAgICAgICAgICAgICAgICAgICIlcyBhcmcgbXVzdCBiZSBOb25lIG9yIHN0ciIsCiAjZW5kaWYKLQkJCSAgICAgU1RSSVBOQU1FKHN0cmlwdHlwZSkpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgICAgICAgICAgICAgICBTVFJJUE5BTUUoc3RyaXB0eXBlKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBkb19zdHJpcChzZWxmLCBzdHJpcHR5cGUpOworICAgIHJldHVybiBkb19zdHJpcChzZWxmLCBzdHJpcHR5cGUpOwogfQogCiAKQEAgLTIxNjcsMTAgKzIxNjcsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfc3RyaXAoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDApCi0JCXJldHVybiBkb19zdHJpcChzZWxmLCBCT1RIU1RSSVApOyAvKiBDb21tb24gY2FzZSAqLwotCWVsc2UKLQkJcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIEJPVEhTVFJJUCwgYXJncyk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKKyAgICAgICAgcmV0dXJuIGRvX3N0cmlwKHNlbGYsIEJPVEhTVFJJUCk7IC8qIENvbW1vbiBjYXNlICovCisgICAgZWxzZQorICAgICAgICByZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgQk9USFNUUklQLCBhcmdzKTsKIH0KIAogCkBAIC0yMTg0LDEwICsyMTg0LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2xzdHJpcChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKLQkJcmV0dXJuIGRvX3N0cmlwKHNlbGYsIExFRlRTVFJJUCk7IC8qIENvbW1vbiBjYXNlICovCi0JZWxzZQotCQlyZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgTEVGVFNUUklQLCBhcmdzKTsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQorICAgICAgICByZXR1cm4gZG9fc3RyaXAoc2VsZiwgTEVGVFNUUklQKTsgLyogQ29tbW9uIGNhc2UgKi8KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBkb19hcmdzdHJpcChzZWxmLCBMRUZUU1RSSVAsIGFyZ3MpOwogfQogCiAKQEAgLTIyMDEsMTAgKzIyMDEsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfcnN0cmlwKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAwKQotCQlyZXR1cm4gZG9fc3RyaXAoc2VsZiwgUklHSFRTVFJJUCk7IC8qIENvbW1vbiBjYXNlICovCi0JZWxzZQotCQlyZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgUklHSFRTVFJJUCwgYXJncyk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMCkKKyAgICAgICAgcmV0dXJuIGRvX3N0cmlwKHNlbGYsIFJJR0hUU1RSSVApOyAvKiBDb21tb24gY2FzZSAqLworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIFJJR0hUU1RSSVAsIGFyZ3MpOwogfQogCiAKQEAgLTIyMjEsMjUgKzIyMjEsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfbG93ZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqczsKLQlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3b2JqOworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgUHlPYmplY3QgKm5ld29iajsKIAotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmICghbmV3b2JqKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAoIW5ld29iaikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld29iaik7CisgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOwogCi0JUHlfTUVNQ1BZKHMsIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgbik7CisgICAgUHlfTUVNQ1BZKHMsIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgbik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soc1tpXSk7Ci0JCWlmIChpc3VwcGVyKGMpKQotCQkJc1tpXSA9IF90b2xvd2VyKGMpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soc1tpXSk7CisgICAgICAgIGlmIChpc3VwcGVyKGMpKQorICAgICAgICAgICAgc1tpXSA9IF90b2xvd2VyKGMpOworICAgIH0KIAotCXJldHVybiBuZXdvYmo7CisgICAgcmV0dXJuIG5ld29iajsKIH0KIAogUHlEb2NfU1RSVkFSKHVwcGVyX19kb2NfXywKQEAgLTIyNTQsMjUgKzIyNTQsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfdXBwZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqczsKLQlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3b2JqOworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgUHlPYmplY3QgKm5ld29iajsKIAotCW5ld29iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotCWlmICghbmV3b2JqKQotCQlyZXR1cm4gTlVMTDsKKyAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAoIW5ld29iaikKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5ld29iaik7CisgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORyhuZXdvYmopOwogCi0JUHlfTUVNQ1BZKHMsIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgbik7CisgICAgUHlfTUVNQ1BZKHMsIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgbik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soc1tpXSk7Ci0JCWlmIChpc2xvd2VyKGMpKQotCQkJc1tpXSA9IF90b3VwcGVyKGMpOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soc1tpXSk7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKQorICAgICAgICAgICAgc1tpXSA9IF90b3VwcGVyKGMpOworICAgIH0KIAotCXJldHVybiBuZXdvYmo7CisgICAgcmV0dXJuIG5ld29iajsKIH0KIAogUHlEb2NfU1RSVkFSKHRpdGxlX19kb2NfXywKQEAgLTIyODQsMzAgKzIyODQsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHN0cmluZ190aXRsZShQeVN0cmluZ09iamVjdCAqc2VsZikKIHsKLQljaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc19uZXc7Ci0JUHlfc3NpemVfdCBpLCBuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JaW50IHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKLQlQeU9iamVjdCAqbmV3b2JqOworICAgIGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKKyAgICBQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBpbnQgcHJldmlvdXNfaXNfY2FzZWQgPSAwOworICAgIFB5T2JqZWN0ICpuZXdvYmo7CiAKLQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3b2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc2xvd2VyKGMpKSB7Ci0JCQlpZiAoIXByZXZpb3VzX2lzX2Nhc2VkKQotCQkJICAgIGMgPSB0b3VwcGVyKGMpOwotCQkJcHJldmlvdXNfaXNfY2FzZWQgPSAxOwotCQl9IGVsc2UgaWYgKGlzdXBwZXIoYykpIHsKLQkJCWlmIChwcmV2aW91c19pc19jYXNlZCkKLQkJCSAgICBjID0gdG9sb3dlcihjKTsKLQkJCXByZXZpb3VzX2lzX2Nhc2VkID0gMTsKLQkJfSBlbHNlCi0JCQlwcmV2aW91c19pc19jYXNlZCA9IDA7Ci0JCSpzX25ldysrID0gYzsKLQl9Ci0JcmV0dXJuIG5ld29iajsKKyAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAobmV3b2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKSB7CisgICAgICAgICAgICBpZiAoIXByZXZpb3VzX2lzX2Nhc2VkKQorICAgICAgICAgICAgICAgIGMgPSB0b3VwcGVyKGMpOworICAgICAgICAgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOworICAgICAgICB9IGVsc2UgaWYgKGlzdXBwZXIoYykpIHsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c19pc19jYXNlZCkKKyAgICAgICAgICAgICAgICBjID0gdG9sb3dlcihjKTsKKyAgICAgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDA7CisgICAgICAgICpzX25ldysrID0gYzsKKyAgICB9CisgICAgcmV0dXJuIG5ld29iajsKIH0KIAogUHlEb2NfU1RSVkFSKGNhcGl0YWxpemVfX2RvY19fLApAQCAtMjMxOSwzMSArMjMxOSwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19jYXBpdGFsaXplKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewotCWNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKLQlQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlQeU9iamVjdCAqbmV3b2JqOworICAgIGNoYXIgKnMgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksICpzX25ldzsKKyAgICBQeV9zc2l6ZV90IGksIG4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBQeU9iamVjdCAqbmV3b2JqOwogCi0JbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7Ci0JaWYgKDAgPCBuKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc2xvd2VyKGMpKQotCQkJKnNfbmV3ID0gdG91cHBlcihjKTsKLQkJZWxzZQotCQkJKnNfbmV3ID0gYzsKLQkJc19uZXcrKzsKLQl9Ci0JZm9yIChpID0gMTsgaSA8IG47IGkrKykgewotCQlpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOwotCQlpZiAoaXN1cHBlcihjKSkKLQkJCSpzX25ldyA9IHRvbG93ZXIoYyk7Ci0JCWVsc2UKLQkJCSpzX25ldyA9IGM7Ci0JCXNfbmV3Kys7Ci0JfQotCXJldHVybiBuZXdvYmo7CisgICAgbmV3b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7CisgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzX25ldyA9IFB5U3RyaW5nX0FzU3RyaW5nKG5ld29iaik7CisgICAgaWYgKDAgPCBuKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKQorICAgICAgICAgICAgKnNfbmV3ID0gdG91cHBlcihjKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnNfbmV3ID0gYzsKKyAgICAgICAgc19uZXcrKzsKKyAgICB9CisgICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgeworICAgICAgICBpbnQgYyA9IFB5X0NIQVJNQVNLKCpzKyspOworICAgICAgICBpZiAoaXN1cHBlcihjKSkKKyAgICAgICAgICAgICpzX25ldyA9IHRvbG93ZXIoYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpzX25ldyA9IGM7CisgICAgICAgIHNfbmV3Kys7CisgICAgfQorICAgIHJldHVybiBuZXdvYmo7CiB9CiAKIApAQCAtMjM1NywzNyArMjM1NywzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19jb3VudChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnN1Yl9vYmo7Ci0JY29uc3QgY2hhciAqc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwotCVB5X3NzaXplX3Qgc3ViX2xlbjsKLQlQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisgICAgUHlPYmplY3QgKnN1Yl9vYmo7CisgICAgY29uc3QgY2hhciAqc3RyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOworICAgIFB5X3NzaXplX3Qgc3ViX2xlbjsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpjb3VudCIsICZzdWJfb2JqLAotCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6Y291bnQiLCAmc3ViX29iaiwKKyAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHN1Yl9vYmopKSB7Ci0JCXN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJfb2JqKTsKLQkJc3ViX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1Yl9vYmopOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3ViX29iaikpIHsKKyAgICAgICAgc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1Yl9vYmopOworICAgICAgICBzdWJfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3ViX29iaik7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3ViX29iaikpIHsKLQkJUHlfc3NpemVfdCBjb3VudDsKLQkJY291bnQgPSBQeVVuaWNvZGVfQ291bnQoKFB5T2JqZWN0ICopc2VsZiwgc3ViX29iaiwgc3RhcnQsIGVuZCk7Ci0JCWlmIChjb3VudCA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCQllbHNlCi0JCSAgICAJcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKLQl9CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1Yl9vYmopKSB7CisgICAgICAgIFB5X3NzaXplX3QgY291bnQ7CisgICAgICAgIGNvdW50ID0gUHlVbmljb2RlX0NvdW50KChQeU9iamVjdCAqKXNlbGYsIHN1Yl9vYmosIHN0YXJ0LCBlbmQpOworICAgICAgICBpZiAoY291bnQgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGNvdW50KTsKKyAgICB9CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3ViX29iaiwgJnN1YiwgJnN1Yl9sZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3ViX29iaiwgJnN1YiwgJnN1Yl9sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXN0cmluZ19hZGp1c3RfaW5kaWNlcygmc3RhcnQsICZlbmQsIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpKTsKKyAgICBzdHJpbmdfYWRqdXN0X2luZGljZXMoJnN0YXJ0LCAmZW5kLCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSk7CiAKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoCi0JCXN0cmluZ2xpYl9jb3VudChzdHIgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHN1Yiwgc3ViX2xlbikKLQkJKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoCisgICAgICAgIHN0cmluZ2xpYl9jb3VudChzdHIgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHN1Yiwgc3ViX2xlbikKKyAgICAgICAgKTsKIH0KIAogUHlEb2NfU1RSVkFSKHN3YXBjYXNlX19kb2NfXywKQEAgLTIzOTksMjcgKzIzOTksMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfc3dhcGNhc2UoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnNfbmV3OwotCVB5X3NzaXplX3QgaSwgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCVB5T2JqZWN0ICpuZXdvYmo7CisgICAgY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwgKnNfbmV3OworICAgIFB5X3NzaXplX3QgaSwgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgIFB5T2JqZWN0ICpuZXdvYmo7CiAKLQluZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKLQlpZiAobmV3b2JqID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7Ci0JCWlmIChpc2xvd2VyKGMpKSB7Ci0JCQkqc19uZXcgPSB0b3VwcGVyKGMpOwotCQl9Ci0JCWVsc2UgaWYgKGlzdXBwZXIoYykpIHsKLQkJCSpzX25ldyA9IHRvbG93ZXIoYyk7Ci0JCX0KLQkJZWxzZQotCQkJKnNfbmV3ID0gYzsKLQkJc19uZXcrKzsKLQl9Ci0JcmV0dXJuIG5ld29iajsKKyAgICBuZXdvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBuKTsKKyAgICBpZiAobmV3b2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNfbmV3ID0gUHlTdHJpbmdfQXNTdHJpbmcobmV3b2JqKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBjID0gUHlfQ0hBUk1BU0soKnMrKyk7CisgICAgICAgIGlmIChpc2xvd2VyKGMpKSB7CisgICAgICAgICAgICAqc19uZXcgPSB0b3VwcGVyKGMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlzdXBwZXIoYykpIHsKKyAgICAgICAgICAgICpzX25ldyA9IHRvbG93ZXIoYyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnNfbmV3ID0gYzsKKyAgICAgICAgc19uZXcrKzsKKyAgICB9CisgICAgcmV0dXJuIG5ld29iajsKIH0KIAogCkBAIC0yNDM0LDExOCArMjQzNCwxMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfdHJhbnNsYXRlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlyZWdpc3RlciBjaGFyICppbnB1dCwgKm91dHB1dDsKLQljb25zdCBjaGFyICp0YWJsZTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGksIGMsIGNoYW5nZWQgPSAwOwotCVB5T2JqZWN0ICppbnB1dF9vYmogPSAoUHlPYmplY3QqKXNlbGY7Ci0JY29uc3QgY2hhciAqb3V0cHV0X3N0YXJ0LCAqZGVsX3RhYmxlPU5VTEw7Ci0JUHlfc3NpemVfdCBpbmxlbiwgdGFibGVuLCBkZWxsZW4gPSAwOwotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JaW50IHRyYW5zX3RhYmxlWzI1Nl07Ci0JUHlPYmplY3QgKnRhYmxlb2JqLCAqZGVsb2JqID0gTlVMTDsKKyAgICByZWdpc3RlciBjaGFyICppbnB1dCwgKm91dHB1dDsKKyAgICBjb25zdCBjaGFyICp0YWJsZTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIGMsIGNoYW5nZWQgPSAwOworICAgIFB5T2JqZWN0ICppbnB1dF9vYmogPSAoUHlPYmplY3QqKXNlbGY7CisgICAgY29uc3QgY2hhciAqb3V0cHV0X3N0YXJ0LCAqZGVsX3RhYmxlPU5VTEw7CisgICAgUHlfc3NpemVfdCBpbmxlbiwgdGFibGVuLCBkZWxsZW4gPSAwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaW50IHRyYW5zX3RhYmxlWzI1Nl07CisgICAgUHlPYmplY3QgKnRhYmxlb2JqLCAqZGVsb2JqID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRyYW5zbGF0ZSIsIDEsIDIsCi0JCQkgICAgICAmdGFibGVvYmosICZkZWxvYmopKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0cmFuc2xhdGUiLCAxLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFibGVvYmosICZkZWxvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChQeVN0cmluZ19DaGVjayh0YWJsZW9iaikpIHsKLQkJdGFibGUgPSBQeVN0cmluZ19BU19TVFJJTkcodGFibGVvYmopOwotCQl0YWJsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh0YWJsZW9iaik7Ci0JfQotCWVsc2UgaWYgKHRhYmxlb2JqID09IFB5X05vbmUpIHsKLQkJdGFibGUgPSBOVUxMOwotCQl0YWJsZW4gPSAyNTY7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayh0YWJsZW9iaikpIHsKKyAgICAgICAgdGFibGUgPSBQeVN0cmluZ19BU19TVFJJTkcodGFibGVvYmopOworICAgICAgICB0YWJsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh0YWJsZW9iaik7CisgICAgfQorICAgIGVsc2UgaWYgKHRhYmxlb2JqID09IFB5X05vbmUpIHsKKyAgICAgICAgdGFibGUgPSBOVUxMOworICAgICAgICB0YWJsZW4gPSAyNTY7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodGFibGVvYmopKSB7Ci0JCS8qIFVuaWNvZGUgLnRyYW5zbGF0ZSgpIGRvZXMgbm90IHN1cHBvcnQgdGhlIGRlbGV0ZWNoYXJzCi0JCSAgIHBhcmFtZXRlcjsgaW5zdGVhZCBhIG1hcHBpbmcgdG8gTm9uZSB3aWxsIGNhdXNlIGNoYXJhY3RlcnMKLQkJICAgdG8gYmUgZGVsZXRlZC4gKi8KLQkJaWYgKGRlbG9iaiAhPSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImRlbGV0aW9ucyBhcmUgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgZm9yIHVuaWNvZGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBQeVVuaWNvZGVfVHJhbnNsYXRlKChQeU9iamVjdCAqKXNlbGYsIHRhYmxlb2JqLCBOVUxMKTsKLQl9CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHRhYmxlb2JqKSkgeworICAgICAgICAvKiBVbmljb2RlIC50cmFuc2xhdGUoKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBkZWxldGVjaGFycworICAgICAgICAgICBwYXJhbWV0ZXI7IGluc3RlYWQgYSBtYXBwaW5nIHRvIE5vbmUgd2lsbCBjYXVzZSBjaGFyYWN0ZXJzCisgICAgICAgICAgIHRvIGJlIGRlbGV0ZWQuICovCisgICAgICAgIGlmIChkZWxvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJkZWxldGlvbnMgYXJlIGltcGxlbWVudGVkIGRpZmZlcmVudGx5IGZvciB1bmljb2RlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX1RyYW5zbGF0ZSgoUHlPYmplY3QgKilzZWxmLCB0YWJsZW9iaiwgTlVMTCk7CisgICAgfQogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHRhYmxlb2JqLCAmdGFibGUsICZ0YWJsZW4pKQotCQlyZXR1cm4gTlVMTDsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodGFibGVvYmosICZ0YWJsZSwgJnRhYmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHRhYmxlbiAhPSAyNTYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCSAgInRyYW5zbGF0aW9uIHRhYmxlIG11c3QgYmUgMjU2IGNoYXJhY3RlcnMgbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHRhYmxlbiAhPSAyNTYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgInRyYW5zbGF0aW9uIHRhYmxlIG11c3QgYmUgMjU2IGNoYXJhY3RlcnMgbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZGVsb2JqICE9IE5VTEwpIHsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGRlbG9iaikpIHsKLQkJCWRlbF90YWJsZSA9IFB5U3RyaW5nX0FTX1NUUklORyhkZWxvYmopOwotCQkJZGVsbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZGVsb2JqKTsKLQkJfQorICAgIGlmIChkZWxvYmogIT0gTlVMTCkgeworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZGVsb2JqKSkgeworICAgICAgICAgICAgZGVsX3RhYmxlID0gUHlTdHJpbmdfQVNfU1RSSU5HKGRlbG9iaik7CisgICAgICAgICAgICBkZWxsZW4gPSBQeVN0cmluZ19HRVRfU0laRShkZWxvYmopOworICAgICAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soZGVsb2JqKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJkZWxldGlvbnMgYXJlIGltcGxlbWVudGVkIGRpZmZlcmVudGx5IGZvciB1bmljb2RlIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soZGVsb2JqKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJkZWxldGlvbnMgYXJlIGltcGxlbWVudGVkIGRpZmZlcmVudGx5IGZvciB1bmljb2RlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogI2VuZGlmCi0JCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihkZWxvYmosICZkZWxfdGFibGUsICZkZWxsZW4pKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgewotCQlkZWxfdGFibGUgPSBOVUxMOwotCQlkZWxsZW4gPSAwOwotCX0KKyAgICAgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKGRlbG9iaiwgJmRlbF90YWJsZSwgJmRlbGxlbikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRlbF90YWJsZSA9IE5VTEw7CisgICAgICAgIGRlbGxlbiA9IDA7CisgICAgfQogCi0JaW5sZW4gPSBQeVN0cmluZ19HRVRfU0laRShpbnB1dF9vYmopOwotCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgaW5sZW4pOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3V0cHV0X3N0YXJ0ID0gb3V0cHV0ID0gUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KTsKLQlpbnB1dCA9IFB5U3RyaW5nX0FTX1NUUklORyhpbnB1dF9vYmopOworICAgIGlubGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRfb2JqKTsKKyAgICByZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGlubGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCk7CisgICAgaW5wdXQgPSBQeVN0cmluZ19BU19TVFJJTkcoaW5wdXRfb2JqKTsKIAotCWlmIChkZWxsZW4gPT0gMCAmJiB0YWJsZSAhPSBOVUxMKSB7Ci0JCS8qIElmIG5vIGRlbGV0aW9ucyBhcmUgcmVxdWlyZWQsIHVzZSBmYXN0ZXIgY29kZSAqLwotCQlmb3IgKGkgPSBpbmxlbjsgLS1pID49IDA7ICkgewotCQkJYyA9IFB5X0NIQVJNQVNLKCppbnB1dCsrKTsKLQkJCWlmIChQeV9DSEFSTUFTSygoKm91dHB1dCsrID0gdGFibGVbY10pKSAhPSBjKQotCQkJCWNoYW5nZWQgPSAxOwotCQl9Ci0JCWlmIChjaGFuZ2VkIHx8ICFQeVN0cmluZ19DaGVja0V4YWN0KGlucHV0X29iaikpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfSU5DUkVGKGlucHV0X29iaik7Ci0JCXJldHVybiBpbnB1dF9vYmo7Ci0JfQorICAgIGlmIChkZWxsZW4gPT0gMCAmJiB0YWJsZSAhPSBOVUxMKSB7CisgICAgICAgIC8qIElmIG5vIGRlbGV0aW9ucyBhcmUgcmVxdWlyZWQsIHVzZSBmYXN0ZXIgY29kZSAqLworICAgICAgICBmb3IgKGkgPSBpbmxlbjsgLS1pID49IDA7ICkgeworICAgICAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCppbnB1dCsrKTsKKyAgICAgICAgICAgIGlmIChQeV9DSEFSTUFTSygoKm91dHB1dCsrID0gdGFibGVbY10pKSAhPSBjKQorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChjaGFuZ2VkIHx8ICFQeVN0cmluZ19DaGVja0V4YWN0KGlucHV0X29iaikpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfSU5DUkVGKGlucHV0X29iaik7CisgICAgICAgIHJldHVybiBpbnB1dF9vYmo7CisgICAgfQogCi0JaWYgKHRhYmxlID09IE5VTEwpIHsKLQkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotCQkJdHJhbnNfdGFibGVbaV0gPSBQeV9DSEFSTUFTSyhpKTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0JCQl0cmFuc190YWJsZVtpXSA9IFB5X0NIQVJNQVNLKHRhYmxlW2ldKTsKLQl9CisgICAgaWYgKHRhYmxlID09IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICAgICAgdHJhbnNfdGFibGVbaV0gPSBQeV9DSEFSTUFTSyhpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICB0cmFuc190YWJsZVtpXSA9IFB5X0NIQVJNQVNLKHRhYmxlW2ldKTsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgZGVsbGVuOyBpKyspCi0JCXRyYW5zX3RhYmxlWyhpbnQpIFB5X0NIQVJNQVNLKGRlbF90YWJsZVtpXSldID0gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IGRlbGxlbjsgaSsrKQorICAgICAgICB0cmFuc190YWJsZVsoaW50KSBQeV9DSEFSTUFTSyhkZWxfdGFibGVbaV0pXSA9IC0xOwogCi0JZm9yIChpID0gaW5sZW47IC0taSA+PSAwOyApIHsKLQkJYyA9IFB5X0NIQVJNQVNLKCppbnB1dCsrKTsKLQkJaWYgKHRyYW5zX3RhYmxlW2NdICE9IC0xKQotCQkJaWYgKFB5X0NIQVJNQVNLKCpvdXRwdXQrKyA9IChjaGFyKXRyYW5zX3RhYmxlW2NdKSA9PSBjKQotCQkJCWNvbnRpbnVlOwotCQljaGFuZ2VkID0gMTsKLQl9Ci0JaWYgKCFjaGFuZ2VkICYmIFB5U3RyaW5nX0NoZWNrRXhhY3QoaW5wdXRfb2JqKSkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfSU5DUkVGKGlucHV0X29iaik7Ci0JCXJldHVybiBpbnB1dF9vYmo7Ci0JfQotCS8qIEZpeCB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyAqLwotCWlmIChpbmxlbiA+IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgb3V0cHV0IC0gb3V0cHV0X3N0YXJ0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGZvciAoaSA9IGlubGVuOyAtLWkgPj0gMDsgKSB7CisgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqaW5wdXQrKyk7CisgICAgICAgIGlmICh0cmFuc190YWJsZVtjXSAhPSAtMSkKKyAgICAgICAgICAgIGlmIChQeV9DSEFSTUFTSygqb3V0cHV0KysgPSAoY2hhcil0cmFuc190YWJsZVtjXSkgPT0gYykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2hhbmdlZCA9IDE7CisgICAgfQorICAgIGlmICghY2hhbmdlZCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KGlucHV0X29iaikpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0lOQ1JFRihpbnB1dF9vYmopOworICAgICAgICByZXR1cm4gaW5wdXRfb2JqOworICAgIH0KKyAgICAvKiBGaXggdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgKi8KKyAgICBpZiAoaW5sZW4gPiAwKQorICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIG91dHB1dCAtIG91dHB1dF9zdGFydCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC0yNTU0LDcgKzI1NTQsNyBAQAogCiAvKiBmaW5kIGFuZCBjb3VudCBjaGFyYWN0ZXJzIGFuZCBzdWJzdHJpbmdzICovCiAKLSNkZWZpbmUgZmluZGNoYXIodGFyZ2V0LCB0YXJnZXRfbGVuLCBjKQkJCQlcCisjZGVmaW5lIGZpbmRjaGFyKHRhcmdldCwgdGFyZ2V0X2xlbiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAoKGNoYXIgKiltZW1jaHIoKGNvbnN0IHZvaWQgKikodGFyZ2V0KSwgYywgdGFyZ2V0X2xlbikpCiAKIC8qIFN0cmluZyBvcHMgbXVzdCByZXR1cm4gYSBzdHJpbmcuICAqLwpAQCAtMjU2MiwxMTYgKzI1NjIsMTE2IEBACiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmV0dXJuX3NlbGYoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gc2VsZjsKLQl9Ci0JcmV0dXJuIChQeVN0cmluZ09iamVjdCAqKVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQlQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksCi0JCVB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChzZWxmKSkgeworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKyAgICByZXR1cm4gKFB5U3RyaW5nT2JqZWN0ICopUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwKKyAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikpOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKIGNvdW50Y2hhcihjb25zdCBjaGFyICp0YXJnZXQsIGludCB0YXJnZXRfbGVuLCBjaGFyIGMsIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JUHlfc3NpemVfdCBjb3VudD0wOwotCWNvbnN0IGNoYXIgKnN0YXJ0PXRhcmdldDsKLQljb25zdCBjaGFyICplbmQ9dGFyZ2V0K3RhcmdldF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudD0wOworICAgIGNvbnN0IGNoYXIgKnN0YXJ0PXRhcmdldDsKKyAgICBjb25zdCBjaGFyICplbmQ9dGFyZ2V0K3RhcmdldF9sZW47CiAKLQl3aGlsZSAoIChzdGFydD1maW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBjKSkgIT0gTlVMTCApIHsKLQkJY291bnQrKzsKLQkJaWYgKGNvdW50ID49IG1heGNvdW50KQotCQkJYnJlYWs7Ci0JCXN0YXJ0ICs9IDE7Ci0JfQotCXJldHVybiBjb3VudDsKKyAgICB3aGlsZSAoIChzdGFydD1maW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBjKSkgIT0gTlVMTCApIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgaWYgKGNvdW50ID49IG1heGNvdW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKIH0KIAogUHlfTE9DQUwoUHlfc3NpemVfdCkKIGZpbmRzdHJpbmcoY29uc3QgY2hhciAqdGFyZ2V0LCBQeV9zc2l6ZV90IHRhcmdldF9sZW4sCi0JICAgY29uc3QgY2hhciAqcGF0dGVybiwgUHlfc3NpemVfdCBwYXR0ZXJuX2xlbiwKLQkgICBQeV9zc2l6ZV90IHN0YXJ0LAotCSAgIFB5X3NzaXplX3QgZW5kLAotCSAgIGludCBkaXJlY3Rpb24pCisgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdHRlcm4sIFB5X3NzaXplX3QgcGF0dGVybl9sZW4sCisgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsCisgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLAorICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQogewotCWlmIChzdGFydCA8IDApIHsKLQkJc3RhcnQgKz0gdGFyZ2V0X2xlbjsKLQkJaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0ID0gMDsKLQl9Ci0JaWYgKGVuZCA+IHRhcmdldF9sZW4pIHsKLQkJZW5kID0gdGFyZ2V0X2xlbjsKLQl9IGVsc2UgaWYgKGVuZCA8IDApIHsKLQkJZW5kICs9IHRhcmdldF9sZW47Ci0JCWlmIChlbmQgPCAwKQotCQkJZW5kID0gMDsKLQl9CisgICAgaWYgKHN0YXJ0IDwgMCkgeworICAgICAgICBzdGFydCArPSB0YXJnZXRfbGVuOworICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgc3RhcnQgPSAwOworICAgIH0KKyAgICBpZiAoZW5kID4gdGFyZ2V0X2xlbikgeworICAgICAgICBlbmQgPSB0YXJnZXRfbGVuOworICAgIH0gZWxzZSBpZiAoZW5kIDwgMCkgeworICAgICAgICBlbmQgKz0gdGFyZ2V0X2xlbjsKKyAgICAgICAgaWYgKGVuZCA8IDApCisgICAgICAgICAgICBlbmQgPSAwOworICAgIH0KIAotCS8qIHplcm8tbGVuZ3RoIHN1YnN0cmluZ3MgYWx3YXlzIG1hdGNoIGF0IHRoZSBmaXJzdCBhdHRlbXB0ICovCi0JaWYgKHBhdHRlcm5fbGVuID09IDApCi0JCXJldHVybiAoZGlyZWN0aW9uID4gMCkgPyBzdGFydCA6IGVuZDsKKyAgICAvKiB6ZXJvLWxlbmd0aCBzdWJzdHJpbmdzIGFsd2F5cyBtYXRjaCBhdCB0aGUgZmlyc3QgYXR0ZW1wdCAqLworICAgIGlmIChwYXR0ZXJuX2xlbiA9PSAwKQorICAgICAgICByZXR1cm4gKGRpcmVjdGlvbiA+IDApID8gc3RhcnQgOiBlbmQ7CiAKLQllbmQgLT0gcGF0dGVybl9sZW47CisgICAgZW5kIC09IHBhdHRlcm5fbGVuOwogCi0JaWYgKGRpcmVjdGlvbiA8IDApIHsKLQkJZm9yICg7IGVuZCA+PSBzdGFydDsgZW5kLS0pCi0JCQlpZiAoUHlfU1RSSU5HX01BVENIKHRhcmdldCwgZW5kLCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpCi0JCQkJcmV0dXJuIGVuZDsKLQl9IGVsc2UgewotCQlmb3IgKDsgc3RhcnQgPD0gZW5kOyBzdGFydCsrKQotCQkJaWYgKFB5X1NUUklOR19NQVRDSCh0YXJnZXQsIHN0YXJ0LCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpCi0JCQkJcmV0dXJuIHN0YXJ0OwotCX0KLQlyZXR1cm4gLTE7CisgICAgaWYgKGRpcmVjdGlvbiA8IDApIHsKKyAgICAgICAgZm9yICg7IGVuZCA+PSBzdGFydDsgZW5kLS0pCisgICAgICAgICAgICBpZiAoUHlfU1RSSU5HX01BVENIKHRhcmdldCwgZW5kLCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVuZDsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKDsgc3RhcnQgPD0gZW5kOyBzdGFydCsrKQorICAgICAgICAgICAgaWYgKFB5X1NUUklOR19NQVRDSCh0YXJnZXQsIHN0YXJ0LCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0OworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKIFB5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQogY291bnRzdHJpbmcoY29uc3QgY2hhciAqdGFyZ2V0LCBQeV9zc2l6ZV90IHRhcmdldF9sZW4sCi0JICAgIGNvbnN0IGNoYXIgKnBhdHRlcm4sIFB5X3NzaXplX3QgcGF0dGVybl9sZW4sCi0JICAgIFB5X3NzaXplX3Qgc3RhcnQsCi0JICAgIFB5X3NzaXplX3QgZW5kLAotCSAgICBpbnQgZGlyZWN0aW9uLCBQeV9zc2l6ZV90IG1heGNvdW50KQorICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0dGVybiwgUHlfc3NpemVfdCBwYXR0ZXJuX2xlbiwKKyAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsCisgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCwKKyAgICAgICAgICAgIGludCBkaXJlY3Rpb24sIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JUHlfc3NpemVfdCBjb3VudD0wOworICAgIFB5X3NzaXplX3QgY291bnQ9MDsKIAotCWlmIChzdGFydCA8IDApIHsKLQkJc3RhcnQgKz0gdGFyZ2V0X2xlbjsKLQkJaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0ID0gMDsKLQl9Ci0JaWYgKGVuZCA+IHRhcmdldF9sZW4pIHsKLQkJZW5kID0gdGFyZ2V0X2xlbjsKLQl9IGVsc2UgaWYgKGVuZCA8IDApIHsKLQkJZW5kICs9IHRhcmdldF9sZW47Ci0JCWlmIChlbmQgPCAwKQotCQkJZW5kID0gMDsKLQl9CisgICAgaWYgKHN0YXJ0IDwgMCkgeworICAgICAgICBzdGFydCArPSB0YXJnZXRfbGVuOworICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgc3RhcnQgPSAwOworICAgIH0KKyAgICBpZiAoZW5kID4gdGFyZ2V0X2xlbikgeworICAgICAgICBlbmQgPSB0YXJnZXRfbGVuOworICAgIH0gZWxzZSBpZiAoZW5kIDwgMCkgeworICAgICAgICBlbmQgKz0gdGFyZ2V0X2xlbjsKKyAgICAgICAgaWYgKGVuZCA8IDApCisgICAgICAgICAgICBlbmQgPSAwOworICAgIH0KIAotCS8qIHplcm8tbGVuZ3RoIHN1YnN0cmluZ3MgbWF0Y2ggZXZlcnl3aGVyZSAqLwotCWlmIChwYXR0ZXJuX2xlbiA9PSAwIHx8IG1heGNvdW50ID09IDApIHsKLQkJaWYgKHRhcmdldF9sZW4rMSA8IG1heGNvdW50KQotCQkJcmV0dXJuIHRhcmdldF9sZW4rMTsKLQkJcmV0dXJuIG1heGNvdW50OwotCX0KKyAgICAvKiB6ZXJvLWxlbmd0aCBzdWJzdHJpbmdzIG1hdGNoIGV2ZXJ5d2hlcmUgKi8KKyAgICBpZiAocGF0dGVybl9sZW4gPT0gMCB8fCBtYXhjb3VudCA9PSAwKSB7CisgICAgICAgIGlmICh0YXJnZXRfbGVuKzEgPCBtYXhjb3VudCkKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXRfbGVuKzE7CisgICAgICAgIHJldHVybiBtYXhjb3VudDsKKyAgICB9CiAKLQllbmQgLT0gcGF0dGVybl9sZW47Ci0JaWYgKGRpcmVjdGlvbiA8IDApIHsKLQkJZm9yICg7IChlbmQgPj0gc3RhcnQpOyBlbmQtLSkKLQkJCWlmIChQeV9TVFJJTkdfTUFUQ0godGFyZ2V0LCBlbmQsIHBhdHRlcm4sIHBhdHRlcm5fbGVuKSkgewotCQkJCWNvdW50Kys7Ci0JCQkJaWYgKC0tbWF4Y291bnQgPD0gMCkgYnJlYWs7Ci0JCQkJZW5kIC09IHBhdHRlcm5fbGVuLTE7Ci0JCQl9Ci0JfSBlbHNlIHsKLQkJZm9yICg7IChzdGFydCA8PSBlbmQpOyBzdGFydCsrKQotCQkJaWYgKFB5X1NUUklOR19NQVRDSCh0YXJnZXQsIHN0YXJ0LCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpIHsKLQkJCQljb3VudCsrOwotCQkJCWlmICgtLW1heGNvdW50IDw9IDApCi0JCQkJCWJyZWFrOwotCQkJCXN0YXJ0ICs9IHBhdHRlcm5fbGVuLTE7Ci0JCQl9Ci0JfQotCXJldHVybiBjb3VudDsKKyAgICBlbmQgLT0gcGF0dGVybl9sZW47CisgICAgaWYgKGRpcmVjdGlvbiA8IDApIHsKKyAgICAgICAgZm9yICg7IChlbmQgPj0gc3RhcnQpOyBlbmQtLSkKKyAgICAgICAgICAgIGlmIChQeV9TVFJJTkdfTUFUQ0godGFyZ2V0LCBlbmQsIHBhdHRlcm4sIHBhdHRlcm5fbGVuKSkgeworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgaWYgKC0tbWF4Y291bnQgPD0gMCkgYnJlYWs7CisgICAgICAgICAgICAgICAgZW5kIC09IHBhdHRlcm5fbGVuLTE7CisgICAgICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICg7IChzdGFydCA8PSBlbmQpOyBzdGFydCsrKQorICAgICAgICAgICAgaWYgKFB5X1NUUklOR19NQVRDSCh0YXJnZXQsIHN0YXJ0LCBwYXR0ZXJuLCBwYXR0ZXJuX2xlbikpIHsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgIGlmICgtLW1heGNvdW50IDw9IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHBhdHRlcm5fbGVuLTE7CisgICAgICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb3VudDsKIH0KIAogCkBAIC0yNjgwLDQ2MCArMjY4MCw0NjAgQEAKIC8qIGxlbihzZWxmKT49MSwgZnJvbT0iIiwgbGVuKHRvKT49MSwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX2ludGVybGVhdmUoUHlTdHJpbmdPYmplY3QgKnNlbGYsCi0JCSAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotCQkgICBQeV9zc2l6ZV90IG1heGNvdW50KQorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLQlQeV9zc2l6ZV90IGNvdW50LCBpLCBwcm9kdWN0OwotCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50LCBpLCBwcm9kdWN0OworICAgIFB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CiAKLQlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgIHNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAKLQkvKiAxIGF0IHRoZSBlbmQgcGx1cyAxIGFmdGVyIGV2ZXJ5IGNoYXJhY3RlciAqLwotCWNvdW50ID0gc2VsZl9sZW4rMTsKLQlpZiAobWF4Y291bnQgPCBjb3VudCkgCi0JCWNvdW50ID0gbWF4Y291bnQ7CisgICAgLyogMSBhdCB0aGUgZW5kIHBsdXMgMSBhZnRlciBldmVyeSBjaGFyYWN0ZXIgKi8KKyAgICBjb3VudCA9IHNlbGZfbGVuKzE7CisgICAgaWYgKG1heGNvdW50IDwgY291bnQpCisgICAgICAgIGNvdW50ID0gbWF4Y291bnQ7CiAKLQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQkvKiAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOyAqLwotCXByb2R1Y3QgPSBjb3VudCAqIHRvX2xlbjsKLQlpZiAocHJvZHVjdCAvIHRvX2xlbiAhPSBjb3VudCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJlc3VsdF9sZW4gPSBwcm9kdWN0ICsgc2VsZl9sZW47Ci0JaWYgKHJlc3VsdF9sZW4gPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0gIAotCWlmICghIChyZXN1bHQgPSAoUHlTdHJpbmdPYmplY3QgKikKLQkgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSApCi0JCXJldHVybiBOVUxMOworICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgIC8qICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47ICovCisgICAgcHJvZHVjdCA9IGNvdW50ICogdG9fbGVuOworICAgIGlmIChwcm9kdWN0IC8gdG9fbGVuICE9IGNvdW50KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfbGVuID0gcHJvZHVjdCArIHNlbGZfbGVuOworICAgIGlmIChyZXN1bHRfbGVuIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICBpZiAoISAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIFRPRE86IHNwZWNpYWwgY2FzZSBzaW5nbGUgY2hhcmFjdGVyLCB3aGljaCBkb2Vzbid0IG5lZWQgbWVtY3B5ICovCisgICAgc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgIHJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CiAKLQkvKiBMYXkgdGhlIGZpcnN0IG9uZSBkb3duIChndWFyYW50ZWVkIHRoaXMgd2lsbCBvY2N1cikgKi8KLQlQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0JcmVzdWx0X3MgKz0gdG9fbGVuOwotCWNvdW50IC09IDE7Ci0gIAotCWZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJKnJlc3VsdF9zKysgPSAqc2VsZl9zKys7Ci0JCVB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLQkJcmVzdWx0X3MgKz0gdG9fbGVuOwotCX0KKyAgICAvKiBUT0RPOiBzcGVjaWFsIGNhc2Ugc2luZ2xlIGNoYXJhY3Rlciwgd2hpY2ggZG9lc24ndCBuZWVkIG1lbWNweSAqLwogCi0JLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0JUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuLWkpOworICAgIC8qIExheSB0aGUgZmlyc3Qgb25lIGRvd24gKGd1YXJhbnRlZWQgdGhpcyB3aWxsIG9jY3VyKSAqLworICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgY291bnQgLT0gMTsKIAotCXJldHVybiByZXN1bHQ7CisgICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgeworICAgICAgICAqcmVzdWx0X3MrKyA9ICpzZWxmX3MrKzsKKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgfQorCisgICAgLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuLWkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogU3BlY2lhbCBjYXNlIGZvciBkZWxldGluZyBhIHNpbmdsZSBjaGFyYWN0ZXIgKi8KIC8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCB0bz0iIiwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkJCWNoYXIgZnJvbV9jLCBQeV9zc2l6ZV90IG1heGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKLQljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLQljaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLQlQeV9zc2l6ZV90IGNvdW50OwotCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7CisgICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudDsKKyAgICBQeVN0cmluZ09iamVjdCAqcmVzdWx0OwogCi0Jc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAKLQljb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLQlpZiAoY291bnQgPT0gMCkgewotCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0JfQotICAKLQlyZXN1bHRfbGVuID0gc2VsZl9sZW4gLSBjb3VudDsgIC8qIGZyb21fbGVuID09IDEgKi8KLQlhc3NlcnQocmVzdWx0X2xlbj49MCk7CisgICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KIAotCWlmICggKHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKQotCSAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gLSBjb3VudDsgIC8qIGZyb21fbGVuID09IDEgKi8KKyAgICBhc3NlcnQocmVzdWx0X2xlbj49MCk7CiAKLQlzdGFydCA9IHNlbGZfczsKLQllbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLQl3aGlsZSAoY291bnQtLSA+IDApIHsKLQkJbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0JCWlmIChuZXh0ID09IE5VTEwpCi0JCQlicmVhazsKLQkJUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0JCXJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLQkJc3RhcnQgPSBuZXh0KzE7Ci0JfQotCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7CisgICAgaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICBzdGFydCA9IHNlbGZfczsKKyAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKKyAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7CisgICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKKyAgICAgICAgc3RhcnQgPSBuZXh0KzE7CisgICAgfQorICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgdG89IiIsIG1heGNvdW50Pj0xICovCiAKIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoUHlTdHJpbmdPYmplY3QgKnNlbGYsCi0JCQkgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotCQkJIFB5X3NzaXplX3QgbWF4Y291bnQpIHsKLQljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLQljaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLQlQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7Ci0JUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkgeworICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOworICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKKyAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOworICAgIFB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKKyAgICBQeVN0cmluZ09iamVjdCAqcmVzdWx0OwogCi0Jc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAKLQljb3VudCA9IGNvdW50c3RyaW5nKHNlbGZfcywgc2VsZl9sZW4sCi0JCQkgICAgZnJvbV9zLCBmcm9tX2xlbiwKLQkJCSAgICAwLCBzZWxmX2xlbiwgMSwKLQkJCSAgICBtYXhjb3VudCk7CisgICAgY291bnQgPSBjb3VudHN0cmluZyhzZWxmX3MsIHNlbGZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNlbGZfbGVuLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOwogCi0JaWYgKGNvdW50ID09IDApIHsKLQkJLyogbm8gbWF0Y2hlcyAqLwotCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0JfQorICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIC8qIG5vIG1hdGNoZXMgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KIAotCXJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIChjb3VudCAqIGZyb21fbGVuKTsKLQlhc3NlcnQgKHJlc3VsdF9sZW4+PTApOworICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIChjb3VudCAqIGZyb21fbGVuKTsKKyAgICBhc3NlcnQgKHJlc3VsdF9sZW4+PTApOwogCi0JaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCi0JICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIChyZXN1bHQgPSAoUHlTdHJpbmdPYmplY3QgKikKKyAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICByZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwogCi0Jc3RhcnQgPSBzZWxmX3M7Ci0JZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0Jd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0JCW9mZnNldCA9IGZpbmRzdHJpbmcoc3RhcnQsIGVuZC1zdGFydCwKLQkJCQkgICAgZnJvbV9zLCBmcm9tX2xlbiwKLQkJCQkgICAgMCwgZW5kLXN0YXJ0LCBGT1JXQVJEKTsKLQkJaWYgKG9mZnNldCA9PSAtMSkKLQkJCWJyZWFrOwotCQluZXh0ID0gc3RhcnQgKyBvZmZzZXQ7CisgICAgc3RhcnQgPSBzZWxmX3M7CisgICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CisgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgIG9mZnNldCA9IGZpbmRzdHJpbmcoc3RhcnQsIGVuZC1zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGVuZC1zdGFydCwgRk9SV0FSRCk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmV4dCA9IHN0YXJ0ICsgb2Zmc2V0OwogCi0JCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOworICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKIAotCQlyZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0JCXN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKLQl9Ci0JUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7CisgICAgICAgIHN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKKyAgICB9CisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT09MSwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYsCi0JCQkJICBjaGFyIGZyb21fYywgY2hhciB0b19jLAotCQkJCSAgUHlfc3NpemVfdCBtYXhjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywgY2hhciB0b19jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JY2hhciAqc2VsZl9zLCAqcmVzdWx0X3MsICpzdGFydCwgKmVuZCwgKm5leHQ7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbjsKLQlQeVN0cmluZ09iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQsICpuZXh0OworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW47CisgICAgUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKIAotCS8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLwotCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKLQlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgIC8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLworICAgIHNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICBzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogCi0JbmV4dCA9IGZpbmRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYyk7CisgICAgbmV4dCA9IGZpbmRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYyk7CiAKLQlpZiAobmV4dCA9PSBOVUxMKSB7Ci0JCS8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0JCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLQl9CisgICAgaWYgKG5leHQgPT0gTlVMTCkgeworICAgICAgICAvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQogCi0JLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLwotCXJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOwotCVB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7CisgICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IHN0cmluZyAqLworICAgIHJlc3VsdCA9IChQeVN0cmluZ09iamVjdCAqKSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHRfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpOworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7CiAKLQkvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLwotCXN0YXJ0ID0gIHJlc3VsdF9zICsgKG5leHQtc2VsZl9zKTsKLQkqc3RhcnQgPSB0b19jOwotCXN0YXJ0Kys7Ci0JZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKKyAgICAvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLworICAgIHN0YXJ0ID0gIHJlc3VsdF9zICsgKG5leHQtc2VsZl9zKTsKKyAgICAqc3RhcnQgPSB0b19jOworICAgIHN0YXJ0Kys7CisgICAgZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKIAotCXdoaWxlICgtLW1heGNvdW50ID4gMCkgewotCQluZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKLQkJaWYgKG5leHQgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQkqbmV4dCA9IHRvX2M7Ci0JCXN0YXJ0ID0gbmV4dCsxOwotCX0KKyAgICB3aGlsZSAoLS1tYXhjb3VudCA+IDApIHsKKyAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgKm5leHQgPSB0b19jOworICAgICAgICBzdGFydCA9IG5leHQrMTsKKyAgICB9CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT1sZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwogUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKIHJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkJICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotCQkJICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0JCQkgICBQeV9zc2l6ZV90IG1heGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCWNoYXIgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQ7Ci0JY2hhciAqc2VsZl9zOwotCVB5X3NzaXplX3Qgc2VsZl9sZW4sIG9mZnNldDsKLQlQeVN0cmluZ09iamVjdCAqcmVzdWx0OworICAgIGNoYXIgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQ7CisgICAgY2hhciAqc2VsZl9zOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIG9mZnNldDsKKyAgICBQeVN0cmluZ09iamVjdCAqcmVzdWx0OwogCi0JLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCisgICAgLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCiAKLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0Jc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKIAotCW9mZnNldCA9IGZpbmRzdHJpbmcoc2VsZl9zLCBzZWxmX2xlbiwKLQkJCSAgICBmcm9tX3MsIGZyb21fbGVuLAotCQkJICAgIDAsIHNlbGZfbGVuLCBGT1JXQVJEKTsKLQlpZiAob2Zmc2V0ID09IC0xKSB7Ci0JCS8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0JCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLQl9CisgICAgb2Zmc2V0ID0gZmluZHN0cmluZyhzZWxmX3MsIHNlbGZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNlbGZfbGVuLCBGT1JXQVJEKTsKKyAgICBpZiAob2Zmc2V0ID09IC0xKSB7CisgICAgICAgIC8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CiAKLQkvKiBOZWVkIHRvIG1ha2UgYSBuZXcgc3RyaW5nICovCi0JcmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7Ci0JUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKKyAgICAvKiBOZWVkIHRvIG1ha2UgYSBuZXcgc3RyaW5nICovCisgICAgcmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKIAotCS8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCi0Jc3RhcnQgPSAgcmVzdWx0X3MgKyBvZmZzZXQ7Ci0JUHlfTUVNQ1BZKHN0YXJ0LCB0b19zLCBmcm9tX2xlbik7Ci0Jc3RhcnQgKz0gZnJvbV9sZW47Ci0JZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKKyAgICAvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLworICAgIHN0YXJ0ID0gIHJlc3VsdF9zICsgb2Zmc2V0OworICAgIFB5X01FTUNQWShzdGFydCwgdG9fcywgZnJvbV9sZW4pOworICAgIHN0YXJ0ICs9IGZyb21fbGVuOworICAgIGVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47CiAKLQl3aGlsZSAoIC0tbWF4Y291bnQgPiAwKSB7Ci0JCW9mZnNldCA9IGZpbmRzdHJpbmcoc3RhcnQsIGVuZC1zdGFydCwKLQkJCQkgICAgZnJvbV9zLCBmcm9tX2xlbiwKLQkJCQkgICAgMCwgZW5kLXN0YXJ0LCBGT1JXQVJEKTsKLQkJaWYgKG9mZnNldD09LTEpCi0JCQlicmVhazsKLQkJUHlfTUVNQ1BZKHN0YXJ0K29mZnNldCwgdG9fcywgZnJvbV9sZW4pOwotCQlzdGFydCArPSBvZmZzZXQrZnJvbV9sZW47Ci0JfQorICAgIHdoaWxlICggLS1tYXhjb3VudCA+IDApIHsKKyAgICAgICAgb2Zmc2V0ID0gZmluZHN0cmluZyhzdGFydCwgZW5kLXN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZW5kLXN0YXJ0LCBGT1JXQVJEKTsKKyAgICAgICAgaWYgKG9mZnNldD09LTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgUHlfTUVNQ1BZKHN0YXJ0K29mZnNldCwgdG9fcywgZnJvbV9sZW4pOworICAgICAgICBzdGFydCArPSBvZmZzZXQrZnJvbV9sZW47CisgICAgfQogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09MSwgbGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYsCi0JCQkgY2hhciBmcm9tX2MsCi0JCQkgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0JCQkgUHlfc3NpemVfdCBtYXhjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCWNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotCWNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLQlQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotCVB5X3NzaXplX3QgY291bnQsIHByb2R1Y3Q7Ci0JUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKKyAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKKyAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50LCBwcm9kdWN0OworICAgIFB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CiAKLQlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0Jc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKKyAgICBzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKIAotCWNvdW50ID0gY291bnRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYywgbWF4Y291bnQpOwotCWlmIChjb3VudCA9PSAwKSB7Ci0JCS8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KLQkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotCX0KKyAgICBjb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CiAKLQkvKiB1c2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBuZXcsIGhlbmNlIHRoZSAiLTEiICovCi0JLyogICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tMSkgICovCi0JcHJvZHVjdCA9IGNvdW50ICogKHRvX2xlbi0xKTsKLQlpZiAocHJvZHVjdCAvICh0b19sZW4tMSkgIT0gY291bnQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgcHJvZHVjdDsKLQlpZiAocmVzdWx0X2xlbiA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgbmV3LCBoZW5jZSB0aGUgIi0xIiAqLworICAgIC8qICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLTEpICAqLworICAgIHByb2R1Y3QgPSBjb3VudCAqICh0b19sZW4tMSk7CisgICAgaWYgKHByb2R1Y3QgLyAodG9fbGVuLTEpICE9IGNvdW50KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIHByb2R1Y3Q7CisgICAgaWYgKHJlc3VsdF9sZW4gPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCi0JICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CisgICAgaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCisgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CiAKLQlzdGFydCA9IHNlbGZfczsKLQllbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLQl3aGlsZSAoY291bnQtLSA+IDApIHsKLQkJbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0JCWlmIChuZXh0ID09IE5VTEwpIAotCQkJYnJlYWs7CisgICAgc3RhcnQgPSBzZWxmX3M7CisgICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CisgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOworICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJaWYgKG5leHQgPT0gc3RhcnQpIHsKLQkJCS8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLwotCQkJUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotCQkJcmVzdWx0X3MgKz0gdG9fbGVuOwotCQkJc3RhcnQgKz0gMTsKLQkJfSBlbHNlIHsKLQkJCS8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLwotCQkJUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0JCQlyZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0JCQlQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0JCQlyZXN1bHRfcyArPSB0b19sZW47Ci0JCQlzdGFydCA9IG5leHQrMTsKLQkJfQotCX0KLQkvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KLQlQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOworICAgICAgICBpZiAobmV4dCA9PSBzdGFydCkgeworICAgICAgICAgICAgLyogcmVwbGFjZSB3aXRoIHRoZSAndG8nICovCisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisgICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgICAgICBzdGFydCArPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgICAgIHN0YXJ0ID0gbmV4dCsxOworICAgICAgICB9CisgICAgfQorICAgIC8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIHN0cmluZyAqLworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwogUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKIHJlcGxhY2Vfc3Vic3RyaW5nKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLQkJICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLQkJICBQeV9zc2l6ZV90IG1heGNvdW50KSB7Ci0JY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0JY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotCVB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0JUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0LCBwcm9kdWN0OwotCVB5U3RyaW5nT2JqZWN0ICpyZXN1bHQ7CisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKKyAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpIHsKKyAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKKyAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQsIHByb2R1Y3Q7CisgICAgUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKIAotCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKLQlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworICAgIHNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICBzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogCi0JY291bnQgPSBjb3VudHN0cmluZyhzZWxmX3MsIHNlbGZfbGVuLAotCQkJICAgIGZyb21fcywgZnJvbV9sZW4sCi0JCQkgICAgMCwgc2VsZl9sZW4sIEZPUldBUkQsIG1heGNvdW50KTsKLQlpZiAoY291bnQgPT0gMCkgewotCQkvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCi0JCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLQl9CisgICAgY291bnQgPSBjb3VudHN0cmluZyhzZWxmX3MsIHNlbGZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNlbGZfbGVuLCBGT1JXQVJELCBtYXhjb3VudCk7CisgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQogCi0JLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0JLyogICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLWZyb21fbGVuKSAqLwotCXByb2R1Y3QgPSBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pOwotCWlmIChwcm9kdWN0IC8gKHRvX2xlbi1mcm9tX2xlbikgIT0gY291bnQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgcHJvZHVjdDsKLQlpZiAocmVzdWx0X2xlbiA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgLyogICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLWZyb21fbGVuKSAqLworICAgIHByb2R1Y3QgPSBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pOworICAgIGlmIChwcm9kdWN0IC8gKHRvX2xlbi1mcm9tX2xlbikgIT0gY291bnQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgcHJvZHVjdDsKKyAgICBpZiAocmVzdWx0X2xlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIHN0cmluZyBpcyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoIChyZXN1bHQgPSAoUHlTdHJpbmdPYmplY3QgKikKLQkgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICBpZiAoIChyZXN1bHQgPSAoUHlTdHJpbmdPYmplY3QgKikKKyAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKIAotCXN0YXJ0ID0gc2VsZl9zOwotCWVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotCXdoaWxlIChjb3VudC0tID4gMCkgewotCQlvZmZzZXQgPSBmaW5kc3RyaW5nKHN0YXJ0LCBlbmQtc3RhcnQsCi0JCQkJICAgIGZyb21fcywgZnJvbV9sZW4sCi0JCQkJICAgIDAsIGVuZC1zdGFydCwgRk9SV0FSRCk7Ci0JCWlmIChvZmZzZXQgPT0gLTEpCi0JCQlicmVhazsKLQkJbmV4dCA9IHN0YXJ0K29mZnNldDsKLQkJaWYgKG5leHQgPT0gc3RhcnQpIHsKLQkJCS8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLwotCQkJUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotCQkJcmVzdWx0X3MgKz0gdG9fbGVuOwotCQkJc3RhcnQgKz0gZnJvbV9sZW47Ci0JCX0gZWxzZSB7Ci0JCQkvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KLQkJCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotCQkJcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotCQkJUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotCQkJcmVzdWx0X3MgKz0gdG9fbGVuOwotCQkJc3RhcnQgPSBuZXh0K2Zyb21fbGVuOwotCQl9Ci0JfQotCS8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIHN0cmluZyAqLwotCVB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7CisgICAgc3RhcnQgPSBzZWxmX3M7CisgICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CisgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgIG9mZnNldCA9IGZpbmRzdHJpbmcoc3RhcnQsIGVuZC1zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGVuZC1zdGFydCwgRk9SV0FSRCk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmV4dCA9IHN0YXJ0K29mZnNldDsKKyAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKKyAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICAgICAgc3RhcnQgKz0gZnJvbV9sZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICAgICAgc3RhcnQgPSBuZXh0K2Zyb21fbGVuOworICAgICAgICB9CisgICAgfQorICAgIC8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIHN0cmluZyAqLworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIAogUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKIHJlcGxhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYsCi0JY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotCWNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotCVB5X3NzaXplX3QgbWF4Y291bnQpCisgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAorICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JaWYgKG1heGNvdW50IDwgMCkgewotCQltYXhjb3VudCA9IFBZX1NTSVpFX1RfTUFYOwotCX0gZWxzZSBpZiAobWF4Y291bnQgPT0gMCB8fCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAwKSB7Ci0JCS8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0JCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLQl9CisgICAgaWYgKG1heGNvdW50IDwgMCkgeworICAgICAgICBtYXhjb3VudCA9IFBZX1NTSVpFX1RfTUFYOworICAgIH0gZWxzZSBpZiAobWF4Y291bnQgPT0gMCB8fCBQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAwKSB7CisgICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CiAKLQlpZiAobWF4Y291bnQgPT0gMCB8fAotCSAgICAoZnJvbV9sZW4gPT0gMCAmJiB0b19sZW4gPT0gMCkpIHsKLQkJLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLQkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotCX0KKyAgICBpZiAobWF4Y291bnQgPT0gMCB8fAorICAgICAgICAoZnJvbV9sZW4gPT0gMCAmJiB0b19sZW4gPT0gMCkpIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KIAotCS8qIEhhbmRsZSB6ZXJvLWxlbmd0aCBzcGVjaWFsIGNhc2VzICovCisgICAgLyogSGFuZGxlIHplcm8tbGVuZ3RoIHNwZWNpYWwgY2FzZXMgKi8KIAotCWlmIChmcm9tX2xlbiA9PSAwKSB7Ci0JCS8qIGluc2VydCB0aGUgJ3RvJyBzdHJpbmcgZXZlcnl3aGVyZS4gICAqLwotCQkvKiAgICA+Pj4gIlB5dGhvbiIucmVwbGFjZSgiIiwgIi4iKSAgICAgKi8KLQkJLyogICAgJy5QLnkudC5oLm8ubi4nICAgICAgICAgICAgICAgICAgICovCi0JCXJldHVybiByZXBsYWNlX2ludGVybGVhdmUoc2VsZiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0JfQorICAgIGlmIChmcm9tX2xlbiA9PSAwKSB7CisgICAgICAgIC8qIGluc2VydCB0aGUgJ3RvJyBzdHJpbmcgZXZlcnl3aGVyZS4gICAqLworICAgICAgICAvKiAgICA+Pj4gIlB5dGhvbiIucmVwbGFjZSgiIiwgIi4iKSAgICAgKi8KKyAgICAgICAgLyogICAgJy5QLnkudC5oLm8ubi4nICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIHJldHVybiByZXBsYWNlX2ludGVybGVhdmUoc2VsZiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CisgICAgfQogCi0JLyogRXhjZXB0IGZvciAiIi5yZXBsYWNlKCIiLCAiQSIpID09ICJBIiB0aGVyZSBpcyBubyB3YXkgYmV5b25kIHRoaXMgKi8KLQkvKiBwb2ludCBmb3IgYW4gZW1wdHkgc2VsZiBzdHJpbmcgdG8gZ2VuZXJhdGUgYSBub24tZW1wdHkgc3RyaW5nICovCi0JLyogU3BlY2lhbCBjYXNlIHNvIHRoZSByZW1haW5pbmcgY29kZSBhbHdheXMgZ2V0cyBhIG5vbi1lbXB0eSBzdHJpbmcgKi8KLQlpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkgewotCQlyZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0JfQorICAgIC8qIEV4Y2VwdCBmb3IgIiIucmVwbGFjZSgiIiwgIkEiKSA9PSAiQSIgdGhlcmUgaXMgbm8gd2F5IGJleW9uZCB0aGlzICovCisgICAgLyogcG9pbnQgZm9yIGFuIGVtcHR5IHNlbGYgc3RyaW5nIHRvIGdlbmVyYXRlIGEgbm9uLWVtcHR5IHN0cmluZyAqLworICAgIC8qIFNwZWNpYWwgY2FzZSBzbyB0aGUgcmVtYWluaW5nIGNvZGUgYWx3YXlzIGdldHMgYSBub24tZW1wdHkgc3RyaW5nICovCisgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KIAotCWlmICh0b19sZW4gPT0gMCkgewotCQkvKiBkZWxldGUgYWxsIG9jY3VyYW5jZXMgb2YgJ2Zyb20nIHN0cmluZyAqLwotCQlpZiAoZnJvbV9sZW4gPT0gMSkgewotCQkJcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoCi0JCQkJc2VsZiwgZnJvbV9zWzBdLCBtYXhjb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIG1heGNvdW50KTsKLQkJfQotCX0KKyAgICBpZiAodG9fbGVuID09IDApIHsKKyAgICAgICAgLyogZGVsZXRlIGFsbCBvY2N1cmFuY2VzIG9mICdmcm9tJyBzdHJpbmcgKi8KKyAgICAgICAgaWYgKGZyb21fbGVuID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKAorICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fc1swXSwgbWF4Y291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCBtYXhjb3VudCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZXJlIGJvdGggc3RyaW5ncyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAqLworICAgIC8qIEhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlcmUgYm90aCBzdHJpbmdzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoICovCiAKLQlpZiAoZnJvbV9sZW4gPT0gdG9fbGVuKSB7Ci0JCWlmIChmcm9tX2xlbiA9PSAxKSB7Ci0JCQlyZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKAotCQkJCXNlbGYsCi0JCQkJZnJvbV9zWzBdLAotCQkJCXRvX3NbMF0sCi0JCQkJbWF4Y291bnQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKAotCQkJCXNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotCQl9Ci0JfQorICAgIGlmIChmcm9tX2xlbiA9PSB0b19sZW4pIHsKKyAgICAgICAgaWYgKGZyb21fbGVuID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoCisgICAgICAgICAgICAgICAgc2VsZiwKKyAgICAgICAgICAgICAgICBmcm9tX3NbMF0sCisgICAgICAgICAgICAgICAgdG9fc1swXSwKKyAgICAgICAgICAgICAgICBtYXhjb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoCisgICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBPdGhlcndpc2UgdXNlIHRoZSBtb3JlIGdlbmVyaWMgYWxnb3JpdGhtcyAqLwotCWlmIChmcm9tX2xlbiA9PSAxKSB7Ci0JCXJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoc2VsZiwgZnJvbV9zWzBdLAotCQkJCQkJdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0JfSBlbHNlIHsKLQkJLyogbGVuKCdmcm9tJyk+PTIsIGxlbigndG8nKT49MSAqLwotCQlyZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmcoc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0JfQorICAgIC8qIE90aGVyd2lzZSB1c2UgdGhlIG1vcmUgZ2VuZXJpYyBhbGdvcml0aG1zICovCisgICAgaWYgKGZyb21fbGVuID09IDEpIHsKKyAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihzZWxmLCBmcm9tX3NbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogbGVuKCdmcm9tJyk+PTIsIGxlbigndG8nKT49MSAqLworICAgICAgICByZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmcoc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIocmVwbGFjZV9fZG9jX18sCkBAIC0zMTQ2LDQxICszMTQ2LDQxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3JlcGxhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgY291bnQgPSAtMTsKLQlQeU9iamVjdCAqZnJvbSwgKnRvOwotCWNvbnN0IGNoYXIgKmZyb21fcywgKnRvX3M7Ci0JUHlfc3NpemVfdCBmcm9tX2xlbiwgdG9fbGVuOworICAgIFB5X3NzaXplX3QgY291bnQgPSAtMTsKKyAgICBQeU9iamVjdCAqZnJvbSwgKnRvOworICAgIGNvbnN0IGNoYXIgKmZyb21fcywgKnRvX3M7CisgICAgUHlfc3NpemVfdCBmcm9tX2xlbiwgdG9fbGVuOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xuOnJlcGxhY2UiLCAmZnJvbSwgJnRvLCAmY291bnQpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PfG46cmVwbGFjZSIsICZmcm9tLCAmdG8sICZjb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKGZyb20pKSB7Ci0JCWZyb21fcyA9IFB5U3RyaW5nX0FTX1NUUklORyhmcm9tKTsKLQkJZnJvbV9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShmcm9tKTsKLQl9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGZyb20pKSB7CisgICAgICAgIGZyb21fcyA9IFB5U3RyaW5nX0FTX1NUUklORyhmcm9tKTsKKyAgICAgICAgZnJvbV9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShmcm9tKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2soZnJvbSkpCi0JCXJldHVybiBQeVVuaWNvZGVfUmVwbGFjZSgoUHlPYmplY3QgKilzZWxmLAotCQkJCQkgZnJvbSwgdG8sIGNvdW50KTsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGZyb20pKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX1JlcGxhY2UoKFB5T2JqZWN0ICopc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20sIHRvLCBjb3VudCk7CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoZnJvbSwgJmZyb21fcywgJmZyb21fbGVuKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKGZyb20sICZmcm9tX3MsICZmcm9tX2xlbikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHRvKSkgewotCQl0b19zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRvKTsKLQkJdG9fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodG8pOwotCX0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodG8pKSB7CisgICAgICAgIHRvX3MgPSBQeVN0cmluZ19BU19TVFJJTkcodG8pOworICAgICAgICB0b19sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh0byk7CisgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodG8pKQotCQlyZXR1cm4gUHlVbmljb2RlX1JlcGxhY2UoKFB5T2JqZWN0ICopc2VsZiwKLQkJCQkJIGZyb20sIHRvLCBjb3VudCk7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHRvKSkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9SZXBsYWNlKChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tLCB0bywgY291bnQpOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHRvLCAmdG9fcywgJnRvX2xlbikpCi0JCXJldHVybiBOVUxMOworICAgIGVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcih0bywgJnRvX3MsICZ0b19sZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiAoUHlPYmplY3QgKilyZXBsYWNlKChQeVN0cmluZ09iamVjdCAqKSBzZWxmLAotCQkJCSAgIGZyb21fcywgZnJvbV9sZW4sCi0JCQkJICAgdG9fcywgdG9fbGVuLCBjb3VudCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlcGxhY2UoKFB5U3RyaW5nT2JqZWN0ICopIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zLCB0b19sZW4sIGNvdW50KTsKIH0KIAogLyoqIEVuZCBEQUxLRSAqKi8KQEAgLTMxOTEsNDMgKzMxOTEsNDMgQEAKICAqLwogUHlfTE9DQUwoaW50KQogX3N0cmluZ190YWlsbWF0Y2goUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzdWJzdHIsIFB5X3NzaXplX3Qgc3RhcnQsCi0JCSAgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCisgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCwgaW50IGRpcmVjdGlvbikKIHsKLQlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCVB5X3NzaXplX3Qgc2xlbjsKLQljb25zdCBjaGFyKiBzdWI7Ci0JY29uc3QgY2hhciogc3RyOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CisgICAgUHlfc3NpemVfdCBzbGVuOworICAgIGNvbnN0IGNoYXIqIHN1YjsKKyAgICBjb25zdCBjaGFyKiBzdHI7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3Vic3RyKSkgewotCQlzdWIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3Vic3RyKTsKLQkJc2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHN1YnN0cik7Ci0JfQorICAgIGlmIChQeVN0cmluZ19DaGVjayhzdWJzdHIpKSB7CisgICAgICAgIHN1YiA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJzdHIpOworICAgICAgICBzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vic3RyKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJzdHIpKQotCQlyZXR1cm4gUHlVbmljb2RlX1RhaWxtYXRjaCgoUHlPYmplY3QgKilzZWxmLAotCQkJCQkgICBzdWJzdHIsIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1YnN0cikpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfVGFpbG1hdGNoKChQeU9iamVjdCAqKXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciwgc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKICNlbmRpZgotCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJzdHIsICZzdWIsICZzbGVuKSkKLQkJcmV0dXJuIC0xOwotCXN0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vic3RyLCAmc3ViLCAmc2xlbikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBzdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAKLQlzdHJpbmdfYWRqdXN0X2luZGljZXMoJnN0YXJ0LCAmZW5kLCBsZW4pOworICAgIHN0cmluZ19hZGp1c3RfaW5kaWNlcygmc3RhcnQsICZlbmQsIGxlbik7CiAKLQlpZiAoZGlyZWN0aW9uIDwgMCkgewotCQkvKiBzdGFydHN3aXRoICovCi0JCWlmIChzdGFydCtzbGVuID4gbGVuKQotCQkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJLyogZW5kc3dpdGggKi8KLQkJaWYgKGVuZC1zdGFydCA8IHNsZW4gfHwgc3RhcnQgPiBsZW4pCi0JCQlyZXR1cm4gMDsKKyAgICBpZiAoZGlyZWN0aW9uIDwgMCkgeworICAgICAgICAvKiBzdGFydHN3aXRoICovCisgICAgICAgIGlmIChzdGFydCtzbGVuID4gbGVuKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZW5kc3dpdGggKi8KKyAgICAgICAgaWYgKGVuZC1zdGFydCA8IHNsZW4gfHwgc3RhcnQgPiBsZW4pCisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQlpZiAoZW5kLXNsZW4gPiBzdGFydCkKLQkJCXN0YXJ0ID0gZW5kIC0gc2xlbjsKLQl9Ci0JaWYgKGVuZC1zdGFydCA+PSBzbGVuKQotCQlyZXR1cm4gISBtZW1jbXAoc3RyK3N0YXJ0LCBzdWIsIHNsZW4pOwotCXJldHVybiAwOworICAgICAgICBpZiAoZW5kLXNsZW4gPiBzdGFydCkKKyAgICAgICAgICAgIHN0YXJ0ID0gZW5kIC0gc2xlbjsKKyAgICB9CisgICAgaWYgKGVuZC1zdGFydCA+PSBzbGVuKQorICAgICAgICByZXR1cm4gISBtZW1jbXAoc3RyK3N0YXJ0LCBzdWIsIHNsZW4pOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTMyNDIsMzMgKzMyNDIsMzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfc3RhcnRzd2l0aChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0JUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLQlQeU9iamVjdCAqc3Vib2JqOwotCWludCByZXN1bHQ7CisgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKKyAgICBQeU9iamVjdCAqc3Vib2JqOworICAgIGludCByZXN1bHQ7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpzdGFydHN3aXRoIiwgJnN1Ym9iaiwKLQkJX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKLQkJUHlfc3NpemVfdCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLQkJCXJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsCi0JCQkJCVB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLQkJCQkJc3RhcnQsIGVuZCwgLTEpOwotCQkJaWYgKHJlc3VsdCA9PSAtMSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWVsc2UgaWYgKHJlc3VsdCkgewotCQkJCVB5X1JFVFVSTl9UUlVFOwotCQkJfQotCQl9Ci0JCVB5X1JFVFVSTl9GQUxTRTsKLQl9Ci0JcmVzdWx0ID0gX3N0cmluZ190YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCAtMSk7Ci0JaWYgKHJlc3VsdCA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6c3RhcnRzd2l0aCIsICZzdWJvYmosCisgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LCBfUHlFdmFsX1NsaWNlSW5kZXgsICZlbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCAtMSk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgICByZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsIC0xKTsKKyAgICBpZiAocmVzdWx0ID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KIAogCkBAIC0zMjgzLDMzICszMjgzLDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2VuZHN3aXRoKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLQlQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotCVB5T2JqZWN0ICpzdWJvYmo7Ci0JaW50IHJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKKyAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOworICAgIFB5T2JqZWN0ICpzdWJvYmo7CisgICAgaW50IHJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmVuZHN3aXRoIiwgJnN1Ym9iaiwKLQkJX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKLQkJUHlfc3NpemVfdCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLQkJCXJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsCi0JCQkJCVB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLQkJCQkJc3RhcnQsIGVuZCwgKzEpOwotCQkJaWYgKHJlc3VsdCA9PSAtMSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWVsc2UgaWYgKHJlc3VsdCkgewotCQkJCVB5X1JFVFVSTl9UUlVFOwotCQkJfQotCQl9Ci0JCVB5X1JFVFVSTl9GQUxTRTsKLQl9Ci0JcmVzdWx0ID0gX3N0cmluZ190YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCArMSk7Ci0JaWYgKHJlc3VsdCA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6ZW5kc3dpdGgiLCAmc3Vib2JqLAorICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0ID0gX3N0cmluZ190YWlsbWF0Y2goc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgKzEpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CisgICAgcmVzdWx0ID0gX3N0cmluZ190YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCArMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CiB9CiAKIApAQCAtMzMzMSwxNyArMzMzMSwxNyBAQAogICAgIFB5T2JqZWN0ICp2OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8c3M6ZW5jb2RlIiwgJmVuY29kaW5nLCAmZXJyb3JzKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgdiA9IFB5U3RyaW5nX0FzRW5jb2RlZE9iamVjdCgoUHlPYmplY3QgKilzZWxmLCBlbmNvZGluZywgZXJyb3JzKTsKICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgZ290byBvbkVycm9yOwogICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikgJiYgIVB5VW5pY29kZV9DaGVjayh2KSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgImVuY29kZXIgZGlkIG5vdCByZXR1cm4gYSBzdHJpbmcvdW5pY29kZSBvYmplY3QgIgotICAgICAgICAgICAgICAgICAgICAgIih0eXBlPSUuNDAwcykiLAotICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRSh2KS0+dHBfbmFtZSk7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImVuY29kZXIgZGlkIG5vdCByZXR1cm4gYSBzdHJpbmcvdW5pY29kZSBvYmplY3QgIgorICAgICAgICAgICAgICAgICAiKHR5cGU9JS40MDBzKSIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIHY7CiAKQEAgLTMzNjgsMTcgKzMzNjgsMTcgQEAKICAgICBQeU9iamVjdCAqdjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHNzOmRlY29kZSIsICZlbmNvZGluZywgJmVycm9ycykpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIHYgPSBQeVN0cmluZ19Bc0RlY29kZWRPYmplY3QoKFB5T2JqZWN0ICopc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk7CiAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOworICAgIGdvdG8gb25FcnJvcjsKICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHYpICYmICFQeVVuaWNvZGVfQ2hlY2sodikpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJkZWNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nL3VuaWNvZGUgb2JqZWN0ICIKLSAgICAgICAgICAgICAgICAgICAgICIodHlwZT0lLjQwMHMpIiwKLSAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUodiktPnRwX25hbWUpOwotICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJkZWNvZGVyIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nL3VuaWNvZGUgb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgIih0eXBlPSUuNDAwcykiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiB2OwogCkBAIC0zNDAzLDY1ICszNDAzLDY1IEBACiAgICAgaW50IHRhYnNpemUgPSA4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpleHBhbmR0YWJzIiwgJnRhYnNpemUpKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogRmlyc3QgcGFzczogZGV0ZXJtaW5lIHNpemUgb2Ygb3V0cHV0IHN0cmluZyAqLwogICAgIGkgPSAwOyAvKiBjaGFycyB1cCB0byBhbmQgaW5jbHVkaW5nIG1vc3QgcmVjZW50IFxuIG9yIFxyICovCiAgICAgaiA9IDA7IC8qIGNoYXJzIHNpbmNlIG1vc3QgcmVjZW50IFxuIG9yIFxyICh1c2UgaW4gdGFiIGNhbGN1bGF0aW9ucykgKi8KICAgICBlID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7IC8qIGVuZCBvZiBpbnB1dCAqLwogICAgIGZvciAocCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsgcCA8IGU7IHArKykKLSAgICAgICAgaWYgKCpwID09ICdcdCcpIHsKLQkgICAgaWYgKHRhYnNpemUgPiAwKSB7Ci0JCWluY3IgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKLQkJaWYgKGogPiBQWV9TU0laRV9UX01BWCAtIGluY3IpCi0JCSAgICBnb3RvIG92ZXJmbG93MTsKLQkJaiArPSBpbmNyOwotICAgICAgICAgICAgfQotCX0KLSAgICAgICAgZWxzZSB7Ci0JICAgIGlmIChqID4gUFlfU1NJWkVfVF9NQVggLSAxKQotCQlnb3RvIG92ZXJmbG93MTsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpIHsKLQkJaWYgKGkgPiBQWV9TU0laRV9UX01BWCAtIGopCi0JCSAgICBnb3RvIG92ZXJmbG93MTsKLSAgICAgICAgICAgICAgICBpICs9IGo7Ci0gICAgICAgICAgICAgICAgaiA9IDA7Ci0gICAgICAgICAgICB9CisgICAgaWYgKCpwID09ICdcdCcpIHsKKyAgICAgICAgaWYgKHRhYnNpemUgPiAwKSB7CisgICAgICAgIGluY3IgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKKyAgICAgICAgaWYgKGogPiBQWV9TU0laRV9UX01BWCAtIGluY3IpCisgICAgICAgICAgICBnb3RvIG92ZXJmbG93MTsKKyAgICAgICAgaiArPSBpbmNyOwogICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoaiA+IFBZX1NTSVpFX1RfTUFYIC0gMSkKKyAgICAgICAgZ290byBvdmVyZmxvdzE7CisgICAgICAgIGorKzsKKyAgICAgICAgaWYgKCpwID09ICdcbicgfHwgKnAgPT0gJ1xyJykgeworICAgICAgICBpZiAoaSA+IFBZX1NTSVpFX1RfTUFYIC0gaikKKyAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3cxOworICAgICAgICBpICs9IGo7CisgICAgICAgIGogPSAwOworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKGkgPiBQWV9TU0laRV9UX01BWCAtIGopCi0JZ290byBvdmVyZmxvdzE7CisgICAgZ290byBvdmVyZmxvdzE7CiAKICAgICAvKiBTZWNvbmQgcGFzczogY3JlYXRlIG91dHB1dCBzdHJpbmcgYW5kIGZpbGwgaXQgKi8KICAgICB1ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgaSArIGopOwogICAgIGlmICghdSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBqID0gMDsgLyogc2FtZSBhcyBpbiBmaXJzdCBwYXNzICovCiAgICAgcSA9IFB5U3RyaW5nX0FTX1NUUklORyh1KTsgLyogbmV4dCBvdXRwdXQgY2hhciAqLwogICAgIHFlID0gUHlTdHJpbmdfQVNfU1RSSU5HKHUpICsgUHlTdHJpbmdfR0VUX1NJWkUodSk7IC8qIGVuZCBvZiBvdXRwdXQgKi8KIAogICAgIGZvciAocCA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsgcCA8IGU7IHArKykKLSAgICAgICAgaWYgKCpwID09ICdcdCcpIHsKLQkgICAgaWYgKHRhYnNpemUgPiAwKSB7Ci0JCWkgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKLQkJaiArPSBpOwotCQl3aGlsZSAoaS0tKSB7Ci0JCSAgICBpZiAocSA+PSBxZSkKLQkJCWdvdG8gb3ZlcmZsb3cyOwotCQkgICAgKnErKyA9ICcgJzsKLQkJfQotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICBpZiAocSA+PSBxZSkKLQkJZ290byBvdmVyZmxvdzI7Ci0JICAgICpxKysgPSAqcDsKLSAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIGlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdccicpCi0gICAgICAgICAgICAgICAgaiA9IDA7CisgICAgaWYgKCpwID09ICdcdCcpIHsKKyAgICAgICAgaWYgKHRhYnNpemUgPiAwKSB7CisgICAgICAgIGkgPSB0YWJzaXplIC0gKGogJSB0YWJzaXplKTsKKyAgICAgICAgaiArPSBpOworICAgICAgICB3aGlsZSAoaS0tKSB7CisgICAgICAgICAgICBpZiAocSA+PSBxZSkKKyAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3cyOworICAgICAgICAgICAgKnErKyA9ICcgJzsKICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAocSA+PSBxZSkKKyAgICAgICAgZ290byBvdmVyZmxvdzI7CisgICAgICAgICpxKysgPSAqcDsKKyAgICAgICAgaisrOworICAgICAgICBpZiAoKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInKQorICAgICAgICBqID0gMDsKKyAgICB9CiAKICAgICByZXR1cm4gdTsKIApAQCAtMzQ3OCwyNiArMzQ3OCwyNiBAQAogICAgIFB5T2JqZWN0ICp1OwogCiAgICAgaWYgKGxlZnQgPCAwKQotICAgICAgICBsZWZ0ID0gMDsKKyAgICBsZWZ0ID0gMDsKICAgICBpZiAocmlnaHQgPCAwKQotICAgICAgICByaWdodCA9IDA7CisgICAgcmlnaHQgPSAwOwogCiAgICAgaWYgKGxlZnQgPT0gMCAmJiByaWdodCA9PSAwICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7CiAgICAgfQogCiAgICAgdSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsCi0JCQkJICAgbGVmdCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpICsgcmlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgKyByaWdodCk7CiAgICAgaWYgKHUpIHsKLSAgICAgICAgaWYgKGxlZnQpCi0gICAgICAgICAgICBtZW1zZXQoUHlTdHJpbmdfQVNfU1RSSU5HKHUpLCBmaWxsLCBsZWZ0KTsKLSAgICAgICAgUHlfTUVNQ1BZKFB5U3RyaW5nX0FTX1NUUklORyh1KSArIGxlZnQsCi0JICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKSwKLQkgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikpOwotICAgICAgICBpZiAocmlnaHQpCi0gICAgICAgICAgICBtZW1zZXQoUHlTdHJpbmdfQVNfU1RSSU5HKHUpICsgbGVmdCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLAotCQkgICBmaWxsLCByaWdodCk7CisgICAgaWYgKGxlZnQpCisgICAgICAgIG1lbXNldChQeVN0cmluZ19BU19TVFJJTkcodSksIGZpbGwsIGxlZnQpOworICAgIFB5X01FTUNQWShQeVN0cmluZ19BU19TVFJJTkcodSkgKyBsZWZ0LAorICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksCisgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpKTsKKyAgICBpZiAocmlnaHQpCisgICAgICAgIG1lbXNldChQeVN0cmluZ19BU19TVFJJTkcodSkgKyBsZWZ0ICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZiksCisgICAgICAgICAgIGZpbGwsIHJpZ2h0KTsKICAgICB9CiAKICAgICByZXR1cm4gdTsKQEAgLTM1MTYsMTEgKzM1MTYsMTEgQEAKICAgICBjaGFyIGZpbGxjaGFyID0gJyAnOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGM6bGp1c3QiLCAmd2lkdGgsICZmaWxsY2hhcikpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID49IHdpZHRoICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CiAgICAgfQogCiAgICAgcmV0dXJuIHBhZChzZWxmLCAwLCB3aWR0aCAtIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpLCBmaWxsY2hhcik7CkBAIC0zNTQwLDExICszNTQwLDExIEBACiAgICAgY2hhciBmaWxsY2hhciA9ICcgJzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxjOnJqdXN0IiwgJndpZHRoLCAmZmlsbGNoYXIpKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA+PSB3aWR0aCAmJiBQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwogICAgIH0KIAogICAgIHJldHVybiBwYWQoc2VsZiwgd2lkdGggLSBQeVN0cmluZ19HRVRfU0laRShzZWxmKSwgMCwgZmlsbGNoYXIpOwpAQCAtMzU2NSwxMSArMzU2NSwxMSBAQAogICAgIGNoYXIgZmlsbGNoYXIgPSAnICc7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58YzpjZW50ZXIiLCAmd2lkdGgsICZmaWxsY2hhcikpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID49IHdpZHRoICYmIFB5U3RyaW5nX0NoZWNrRXhhY3Qoc2VsZikpIHsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKKyAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CiAgICAgfQogCiAgICAgbWFyZyA9IHdpZHRoIC0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CkBAIC0zNTkzLDE4ICszNTkzLDE4IEBACiAgICAgUHlfc3NpemVfdCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibjp6ZmlsbCIsICZ3aWR0aCkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID49IHdpZHRoKSB7Ci0gICAgICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7Ci0gICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0gICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpLAotICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpCi0gICAgICAgICAgICApOworICAgIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHNlbGYpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCopIHNlbGY7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZiksCisgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpCisgICAgICAgICk7CiAgICAgfQogCiAgICAgZmlsbCA9IHdpZHRoIC0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CkBAIC0zNjEyLDEzICszNjEyLDEzIEBACiAgICAgcyA9IHBhZChzZWxmLCBmaWxsLCAwLCAnMCcpOwogCiAgICAgaWYgKHMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHMpOwogICAgIGlmIChwW2ZpbGxdID09ICcrJyB8fCBwW2ZpbGxdID09ICctJykgewotICAgICAgICAvKiBtb3ZlIHNpZ24gdG8gYmVnaW5uaW5nIG9mIHN0cmluZyAqLwotICAgICAgICBwWzBdID0gcFtmaWxsXTsKLSAgICAgICAgcFtmaWxsXSA9ICcwJzsKKyAgICAvKiBtb3ZlIHNpZ24gdG8gYmVnaW5uaW5nIG9mIHN0cmluZyAqLworICAgIHBbMF0gPSBwW2ZpbGxdOworICAgIHBbZmlsbF0gPSAnMCc7CiAgICAgfQogCiAgICAgcmV0dXJuIChQeU9iamVjdCopIHM7CkBAIC0zNjM0LDIyICszNjM0LDIyIEBACiBzdHJpbmdfaXNzcGFjZShQeVN0cmluZ09iamVjdCAqc2VsZikKIHsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwCi0gICAgICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmU7CiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDEgJiYKLQlpc3NwYWNlKCpwKSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOworICAgIGlzc3BhY2UoKnApKQorICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAKICAgICBlID0gcCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKCFpc3NwYWNlKCpwKSkKLQkgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICBpZiAoIWlzc3BhY2UoKnApKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOwogfQpAQCAtMzY2NSwyMiArMzY2NSwyMiBAQAogc3RyaW5nX2lzYWxwaGEoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcAotICAgICAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplOwogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAxICYmCi0JaXNhbHBoYSgqcCkpCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKKyAgICBpc2FscGhhKCpwKSkKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOwogCiAgICAgLyogU3BlY2lhbCBjYXNlIGZvciBlbXB0eSBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApCi0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogCiAgICAgZSA9IHAgKyBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmICghaXNhbHBoYSgqcCkpCi0JICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgaWYgKCFpc2FscGhhKCpwKSkKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKICAgICB9CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKIH0KQEAgLTM2OTYsMjIgKzM2OTYsMjIgQEAKIHN0cmluZ19pc2FsbnVtKFB5U3RyaW5nT2JqZWN0ICpzZWxmKQogewogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAKLSAgICAgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZTsKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMSAmJgotCWlzYWxudW0oKnApKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CisgICAgaXNhbG51bSgqcCkpCisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAwKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKIAogICAgIGUgPSBwICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAgICAgZm9yICg7IHAgPCBlOyBwKyspIHsKLQlpZiAoIWlzYWxudW0oKnApKQotCSAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIGlmICghaXNhbG51bSgqcCkpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CiB9CkBAIC0zNzI3LDIyICszNzI3LDIyIEBACiBzdHJpbmdfaXNkaWdpdChQeVN0cmluZ09iamVjdCAqc2VsZikKIHsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwCi0gICAgICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOworICAgID0gKHVuc2lnbmVkIGNoYXIgKikgUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmU7CiAKICAgICAvKiBTaG9ydGN1dCBmb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzICovCiAgICAgaWYgKFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDEgJiYKLQlpc2RpZ2l0KCpwKSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOworICAgIGlzZGlnaXQoKnApKQorICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAKICAgICBlID0gcCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogICAgIGZvciAoOyBwIDwgZTsgcCsrKSB7Ci0JaWYgKCFpc2RpZ2l0KCpwKSkKLQkgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKKyAgICBpZiAoIWlzZGlnaXQoKnApKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwogICAgIH0KICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDEpOwogfQpAQCAtMzc1OCwyNSArMzc1OCwyNSBAQAogc3RyaW5nX2lzbG93ZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcAotICAgICAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplOwogICAgIGludCBjYXNlZDsKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKGlzbG93ZXIoKnApICE9IDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoaXNsb3dlcigqcCkgIT0gMCk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAKICAgICBlID0gcCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogICAgIGNhc2VkID0gMDsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmIChpc3VwcGVyKCpwKSkKLQkgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKLQllbHNlIGlmICghY2FzZWQgJiYgaXNsb3dlcigqcCkpCi0JICAgIGNhc2VkID0gMTsKKyAgICBpZiAoaXN1cHBlcigqcCkpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgZWxzZSBpZiAoIWNhc2VkICYmIGlzbG93ZXIoKnApKQorICAgICAgICBjYXNlZCA9IDE7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoY2FzZWQpOwogfQpAQCAtMzc5MiwyNSArMzc5MiwyNSBAQAogc3RyaW5nX2lzdXBwZXIoUHlTdHJpbmdPYmplY3QgKnNlbGYpCiB7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcAotICAgICAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKyAgICA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKICAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplOwogICAgIGludCBjYXNlZDsKIAogICAgIC8qIFNob3J0Y3V0IGZvciBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMSkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKGlzdXBwZXIoKnApICE9IDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoaXN1cHBlcigqcCkgIT0gMCk7CiAKICAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHN0cmluZ3MgKi8KICAgICBpZiAoUHlTdHJpbmdfR0VUX1NJWkUoc2VsZikgPT0gMCkKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CiAKICAgICBlID0gcCArIFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwogICAgIGNhc2VkID0gMDsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCWlmIChpc2xvd2VyKCpwKSkKLQkgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKLQllbHNlIGlmICghY2FzZWQgJiYgaXN1cHBlcigqcCkpCi0JICAgIGNhc2VkID0gMTsKKyAgICBpZiAoaXNsb3dlcigqcCkpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgZWxzZSBpZiAoIWNhc2VkICYmIGlzdXBwZXIoKnApKQorICAgICAgICBjYXNlZCA9IDE7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoY2FzZWQpOwogfQpAQCAtMzgyOCwzOCArMzgyOCwzOCBAQAogc3RyaW5nX2lzdGl0bGUoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp1bmNhc2VkKQogewogICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAKLSAgICAgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CisgICAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAgICAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZTsKICAgICBpbnQgY2FzZWQsIHByZXZpb3VzX2lzX2Nhc2VkOwogCiAgICAgLyogU2hvcnRjdXQgZm9yIHNpbmdsZSBjaGFyYWN0ZXIgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAxKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoaXN1cHBlcigqcCkgIT0gMCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhpc3VwcGVyKCpwKSAhPSAwKTsKIAogICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgc3RyaW5ncyAqLwogICAgIGlmIChQeVN0cmluZ19HRVRfU0laRShzZWxmKSA9PSAwKQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKIAogICAgIGUgPSBwICsgUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7CiAgICAgY2FzZWQgPSAwOwogICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKICAgICBmb3IgKDsgcCA8IGU7IHArKykgewotCXJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2ggPSAqcDsKKyAgICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyIGNoID0gKnA7CiAKLQlpZiAoaXN1cHBlcihjaCkpIHsKLQkgICAgaWYgKHByZXZpb3VzX2lzX2Nhc2VkKQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwotCSAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7Ci0JICAgIGNhc2VkID0gMTsKLQl9Ci0JZWxzZSBpZiAoaXNsb3dlcihjaCkpIHsKLQkgICAgaWYgKCFwcmV2aW91c19pc19jYXNlZCkKLQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKLQkgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAxOwotCSAgICBjYXNlZCA9IDE7Ci0JfQotCWVsc2UKLQkgICAgcHJldmlvdXNfaXNfY2FzZWQgPSAwOworICAgIGlmIChpc3VwcGVyKGNoKSkgeworICAgICAgICBpZiAocHJldmlvdXNfaXNfY2FzZWQpCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgICAgIHByZXZpb3VzX2lzX2Nhc2VkID0gMTsKKyAgICAgICAgY2FzZWQgPSAxOworICAgIH0KKyAgICBlbHNlIGlmIChpc2xvd2VyKGNoKSkgeworICAgICAgICBpZiAoIXByZXZpb3VzX2lzX2Nhc2VkKQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDE7CisgICAgICAgIGNhc2VkID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcmV2aW91c19pc19jYXNlZCA9IDA7CiAgICAgfQogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoY2FzZWQpOwogfQpAQCAtMzg4NCw3ICszODg0LDcgQEAKICAgICBjaGFyICpkYXRhOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpzcGxpdGxpbmVzIiwgJmtlZXBlbmRzKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBkYXRhID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwpAQCAtMzg5OSwzMSArMzg5OSwzMSBAQAogCiAgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CiAgICAgaWYgKCFsaXN0KQotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgZ290byBvbkVycm9yOwogCiAgICAgZm9yIChpID0gaiA9IDA7IGkgPCBsZW47ICkgewotCVB5X3NzaXplX3QgZW9sOworICAgIFB5X3NzaXplX3QgZW9sOwogCi0JLyogRmluZCBhIGxpbmUgYW5kIGFwcGVuZCBpdCAqLwotCXdoaWxlIChpIDwgbGVuICYmIGRhdGFbaV0gIT0gJ1xuJyAmJiBkYXRhW2ldICE9ICdccicpCi0JICAgIGkrKzsKKyAgICAvKiBGaW5kIGEgbGluZSBhbmQgYXBwZW5kIGl0ICovCisgICAgd2hpbGUgKGkgPCBsZW4gJiYgZGF0YVtpXSAhPSAnXG4nICYmIGRhdGFbaV0gIT0gJ1xyJykKKyAgICAgICAgaSsrOwogCi0JLyogU2tpcCB0aGUgbGluZSBicmVhayByZWFkaW5nIENSTEYgYXMgb25lIGxpbmUgYnJlYWsgKi8KLQllb2wgPSBpOwotCWlmIChpIDwgbGVuKSB7Ci0JICAgIGlmIChkYXRhW2ldID09ICdccicgJiYgaSArIDEgPCBsZW4gJiYKLQkJZGF0YVtpKzFdID09ICdcbicpCi0JCWkgKz0gMjsKLQkgICAgZWxzZQotCQlpKys7Ci0JICAgIGlmIChrZWVwZW5kcykKLQkJZW9sID0gaTsKLQl9Ci0JU1BMSVRfQVBQRU5EKGRhdGEsIGosIGVvbCk7Ci0JaiA9IGk7CisgICAgLyogU2tpcCB0aGUgbGluZSBicmVhayByZWFkaW5nIENSTEYgYXMgb25lIGxpbmUgYnJlYWsgKi8KKyAgICBlb2wgPSBpOworICAgIGlmIChpIDwgbGVuKSB7CisgICAgICAgIGlmIChkYXRhW2ldID09ICdccicgJiYgaSArIDEgPCBsZW4gJiYKKyAgICAgICAgZGF0YVtpKzFdID09ICdcbicpCisgICAgICAgIGkgKz0gMjsKKyAgICAgICAgZWxzZQorICAgICAgICBpKys7CisgICAgICAgIGlmIChrZWVwZW5kcykKKyAgICAgICAgZW9sID0gaTsKKyAgICB9CisgICAgU1BMSVRfQVBQRU5EKGRhdGEsIGosIGVvbCk7CisgICAgaiA9IGk7CiAgICAgfQogICAgIGlmIChqIDwgbGVuKSB7Ci0JU1BMSVRfQVBQRU5EKGRhdGEsIGosIGxlbik7CisgICAgU1BMSVRfQVBQRU5EKGRhdGEsIGosIGxlbik7CiAgICAgfQogCiAgICAgcmV0dXJuIGxpc3Q7CkBAIC0zOTM5LDkgKzM5MzksOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19zaXplb2YoUHlTdHJpbmdPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCByZXM7Ci0JcmVzID0gc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSArIHYtPm9iX3NpemUgKiB2LT5vYl90eXBlLT50cF9pdGVtc2l6ZTsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKKyAgICBQeV9zc2l6ZV90IHJlczsKKyAgICByZXMgPSBzaXplb2YoUHlTdHJpbmdPYmplY3QpICsgdi0+b2Jfc2l6ZSAqIHYtPm9iX3R5cGUtPnRwX2l0ZW1zaXplOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOwogfQogCiAjdW5kZWYgU1BMSVRfQVBQRU5ECkBAIC0zOTUyLDcgKzM5NTIsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19nZXRuZXdhcmdzKFB5U3RyaW5nT2JqZWN0ICp2KQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIocyMpIiwgdi0+b2Jfc3ZhbCwgUHlfU0laRSh2KSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihzIykiLCB2LT5vYl9zdmFsLCBQeV9TSVpFKHYpKTsKIH0KIAogCkBAIC0zOTczLDIwICszOTczLDIwIEBACiAgICAgLyogSWYgMi54LCBjb252ZXJ0IGZvcm1hdF9zcGVjIHRvIHRoZSBzYW1lIHR5cGUgYXMgdmFsdWUgKi8KICAgICAvKiBUaGlzIGlzIHRvIGFsbG93IHRoaW5ncyBsaWtlIHUnJy5mb3JtYXQoJycpICovCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQotICAgICAgICBnb3RvIGRvbmU7CisgICAgZ290byBkb25lOwogICAgIGlmICghKFB5U3RyaW5nX0NoZWNrKGZvcm1hdF9zcGVjKSB8fCBQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiX19mb3JtYXRfXyBhcmcgbXVzdCBiZSBzdHIgIgotCQkgICAgICJvciB1bmljb2RlLCBub3QgJXMiLCBQeV9UWVBFKGZvcm1hdF9zcGVjKS0+dHBfbmFtZSk7Ci0JZ290byBkb25lOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJfX2Zvcm1hdF9fIGFyZyBtdXN0IGJlIHN0ciAiCisgICAgICAgICAgICAgICAgICJvciB1bmljb2RlLCBub3QgJXMiLCBQeV9UWVBFKGZvcm1hdF9zcGVjKS0+dHBfbmFtZSk7CisgICAgZ290byBkb25lOwogICAgIH0KICAgICB0bXAgPSBQeU9iamVjdF9TdHIoZm9ybWF0X3NwZWMpOwogICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgICAgZ290byBkb25lOworICAgIGdvdG8gZG9uZTsKICAgICBmb3JtYXRfc3BlYyA9IHRtcDsKIAogICAgIHJlc3VsdCA9IF9QeUJ5dGVzX0Zvcm1hdEFkdmFuY2VkKHNlbGYsCi0JCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAotCQkJCSAgICAgUHlTdHJpbmdfR0VUX1NJWkUoZm9ybWF0X3NwZWMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoZm9ybWF0X3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0dFVF9TSVpFKGZvcm1hdF9zcGVjKSk7CiBkb25lOgogICAgIFB5X1hERUNSRUYodG1wKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDAwMCw2MSArNDAwMCw2MSBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYKIHN0cmluZ19tZXRob2RzW10gPSB7Ci0JLyogQ291bnRlcnBhcnRzIG9mIHRoZSBvYnNvbGV0ZSBzdHJvcG1vZHVsZSBmdW5jdGlvbnM7IGV4Y2VwdAotCSAgIHN0cmluZy5tYWtldHJhbnMoKS4gKi8KLQl7ImpvaW4iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2pvaW4sIE1FVEhfTywgam9pbl9fZG9jX199LAotCXsic3BsaXQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3NwbGl0LCBNRVRIX1ZBUkFSR1MsIHNwbGl0X19kb2NfX30sCi0JeyJyc3BsaXQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JzcGxpdCwgTUVUSF9WQVJBUkdTLCByc3BsaXRfX2RvY19ffSwKLQl7Imxvd2VyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19sb3dlciwgTUVUSF9OT0FSR1MsIGxvd2VyX19kb2NfX30sCi0JeyJ1cHBlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfdXBwZXIsIE1FVEhfTk9BUkdTLCB1cHBlcl9fZG9jX199LAotCXsiaXNsb3dlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNsb3dlciwgTUVUSF9OT0FSR1MsIGlzbG93ZXJfX2RvY19ffSwKLQl7ImlzdXBwZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzdXBwZXIsIE1FVEhfTk9BUkdTLCBpc3VwcGVyX19kb2NfX30sCi0JeyJpc3NwYWNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc3NwYWNlLCBNRVRIX05PQVJHUywgaXNzcGFjZV9fZG9jX199LAotCXsiaXNkaWdpdCIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNkaWdpdCwgTUVUSF9OT0FSR1MsIGlzZGlnaXRfX2RvY19ffSwKLQl7ImlzdGl0bGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzdGl0bGUsIE1FVEhfTk9BUkdTLCBpc3RpdGxlX19kb2NfX30sCi0JeyJpc2FscGhhIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc2FscGhhLCBNRVRIX05PQVJHUywgaXNhbHBoYV9fZG9jX199LAotCXsiaXNhbG51bSIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNhbG51bSwgTUVUSF9OT0FSR1MsIGlzYWxudW1fX2RvY19ffSwKLQl7ImNhcGl0YWxpemUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2NhcGl0YWxpemUsIE1FVEhfTk9BUkdTLAotCSBjYXBpdGFsaXplX19kb2NfX30sCi0JeyJjb3VudCIsIChQeUNGdW5jdGlvbilzdHJpbmdfY291bnQsIE1FVEhfVkFSQVJHUywgY291bnRfX2RvY19ffSwKLQl7ImVuZHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19lbmRzd2l0aCwgTUVUSF9WQVJBUkdTLAotCSBlbmRzd2l0aF9fZG9jX199LAotCXsicGFydGl0aW9uIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19wYXJ0aXRpb24sIE1FVEhfTywgcGFydGl0aW9uX19kb2NfX30sCi0JeyJmaW5kIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19maW5kLCBNRVRIX1ZBUkFSR1MsIGZpbmRfX2RvY19ffSwKLQl7ImluZGV4IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pbmRleCwgTUVUSF9WQVJBUkdTLCBpbmRleF9fZG9jX199LAotCXsibHN0cmlwIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19sc3RyaXAsIE1FVEhfVkFSQVJHUywgbHN0cmlwX19kb2NfX30sCi0JeyJyZXBsYWNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yZXBsYWNlLCBNRVRIX1ZBUkFSR1MsIHJlcGxhY2VfX2RvY19ffSwKLQl7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yZmluZCwgTUVUSF9WQVJBUkdTLCByZmluZF9fZG9jX199LAotCXsicmluZGV4IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yaW5kZXgsIE1FVEhfVkFSQVJHUywgcmluZGV4X19kb2NfX30sCi0JeyJyc3RyaXAiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JzdHJpcCwgTUVUSF9WQVJBUkdTLCByc3RyaXBfX2RvY19ffSwKLQl7InJwYXJ0aXRpb24iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3JwYXJ0aXRpb24sIE1FVEhfTywKLQkgcnBhcnRpdGlvbl9fZG9jX199LAotCXsic3RhcnRzd2l0aCIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3RhcnRzd2l0aCwgTUVUSF9WQVJBUkdTLAotCSBzdGFydHN3aXRoX19kb2NfX30sCi0JeyJzdHJpcCIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3RyaXAsIE1FVEhfVkFSQVJHUywgc3RyaXBfX2RvY19ffSwKLQl7InN3YXBjYXNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zd2FwY2FzZSwgTUVUSF9OT0FSR1MsCi0JIHN3YXBjYXNlX19kb2NfX30sCi0JeyJ0cmFuc2xhdGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3RyYW5zbGF0ZSwgTUVUSF9WQVJBUkdTLAotCSB0cmFuc2xhdGVfX2RvY19ffSwKLQl7InRpdGxlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ190aXRsZSwgTUVUSF9OT0FSR1MsIHRpdGxlX19kb2NfX30sCi0JeyJsanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdfbGp1c3QsIE1FVEhfVkFSQVJHUywgbGp1c3RfX2RvY19ffSwKLQl7InJqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yanVzdCwgTUVUSF9WQVJBUkdTLCByanVzdF9fZG9jX199LAotCXsiY2VudGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19jZW50ZXIsIE1FVEhfVkFSQVJHUywgY2VudGVyX19kb2NfX30sCi0JeyJ6ZmlsbCIsIChQeUNGdW5jdGlvbilzdHJpbmdfemZpbGwsIE1FVEhfVkFSQVJHUywgemZpbGxfX2RvY19ffSwKLQl7ImZvcm1hdCIsIChQeUNGdW5jdGlvbikgZG9fc3RyaW5nX2Zvcm1hdCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgZm9ybWF0X19kb2NfX30sCi0JeyJfX2Zvcm1hdF9fIiwgKFB5Q0Z1bmN0aW9uKSBzdHJpbmdfX2Zvcm1hdF9fLCBNRVRIX1ZBUkFSR1MsIHBfZm9ybWF0X19kb2NfX30sCi0JeyJfZm9ybWF0dGVyX2ZpZWxkX25hbWVfc3BsaXQiLCAoUHlDRnVuY3Rpb24pIGZvcm1hdHRlcl9maWVsZF9uYW1lX3NwbGl0LCBNRVRIX05PQVJHU30sCi0JeyJfZm9ybWF0dGVyX3BhcnNlciIsIChQeUNGdW5jdGlvbikgZm9ybWF0dGVyX3BhcnNlciwgTUVUSF9OT0FSR1N9LAotCXsiZW5jb2RlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19lbmNvZGUsIE1FVEhfVkFSQVJHUywgZW5jb2RlX19kb2NfX30sCi0JeyJkZWNvZGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2RlY29kZSwgTUVUSF9WQVJBUkdTLCBkZWNvZGVfX2RvY19ffSwKLQl7ImV4cGFuZHRhYnMiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2V4cGFuZHRhYnMsIE1FVEhfVkFSQVJHUywKLQkgZXhwYW5kdGFic19fZG9jX199LAotCXsic3BsaXRsaW5lcyIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3BsaXRsaW5lcywgTUVUSF9WQVJBUkdTLAotCSBzcGxpdGxpbmVzX19kb2NfX30sCi0JeyJfX3NpemVvZl9fIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zaXplb2YsIE1FVEhfTk9BUkdTLAotCSBzaXplb2ZfX2RvY19ffSwKLQl7Il9fZ2V0bmV3YXJnc19fIiwJKFB5Q0Z1bmN0aW9uKXN0cmluZ19nZXRuZXdhcmdzLAlNRVRIX05PQVJHU30sCi0Je05VTEwsICAgICBOVUxMfQkJICAgICAvKiBzZW50aW5lbCAqLworICAgIC8qIENvdW50ZXJwYXJ0cyBvZiB0aGUgb2Jzb2xldGUgc3Ryb3Btb2R1bGUgZnVuY3Rpb25zOyBleGNlcHQKKyAgICAgICBzdHJpbmcubWFrZXRyYW5zKCkuICovCisgICAgeyJqb2luIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19qb2luLCBNRVRIX08sIGpvaW5fX2RvY19ffSwKKyAgICB7InNwbGl0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19zcGxpdCwgTUVUSF9WQVJBUkdTLCBzcGxpdF9fZG9jX199LAorICAgIHsicnNwbGl0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yc3BsaXQsIE1FVEhfVkFSQVJHUywgcnNwbGl0X19kb2NfX30sCisgICAgeyJsb3dlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfbG93ZXIsIE1FVEhfTk9BUkdTLCBsb3dlcl9fZG9jX199LAorICAgIHsidXBwZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3VwcGVyLCBNRVRIX05PQVJHUywgdXBwZXJfX2RvY19ffSwKKyAgICB7ImlzbG93ZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzbG93ZXIsIE1FVEhfTk9BUkdTLCBpc2xvd2VyX19kb2NfX30sCisgICAgeyJpc3VwcGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc3VwcGVyLCBNRVRIX05PQVJHUywgaXN1cHBlcl9fZG9jX199LAorICAgIHsiaXNzcGFjZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNzcGFjZSwgTUVUSF9OT0FSR1MsIGlzc3BhY2VfX2RvY19ffSwKKyAgICB7ImlzZGlnaXQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzZGlnaXQsIE1FVEhfTk9BUkdTLCBpc2RpZ2l0X19kb2NfX30sCisgICAgeyJpc3RpdGxlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19pc3RpdGxlLCBNRVRIX05PQVJHUywgaXN0aXRsZV9fZG9jX199LAorICAgIHsiaXNhbHBoYSIsIChQeUNGdW5jdGlvbilzdHJpbmdfaXNhbHBoYSwgTUVUSF9OT0FSR1MsIGlzYWxwaGFfX2RvY19ffSwKKyAgICB7ImlzYWxudW0iLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2lzYWxudW0sIE1FVEhfTk9BUkdTLCBpc2FsbnVtX19kb2NfX30sCisgICAgeyJjYXBpdGFsaXplIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19jYXBpdGFsaXplLCBNRVRIX05PQVJHUywKKyAgICAgY2FwaXRhbGl6ZV9fZG9jX199LAorICAgIHsiY291bnQiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2NvdW50LCBNRVRIX1ZBUkFSR1MsIGNvdW50X19kb2NfX30sCisgICAgeyJlbmRzd2l0aCIsIChQeUNGdW5jdGlvbilzdHJpbmdfZW5kc3dpdGgsIE1FVEhfVkFSQVJHUywKKyAgICAgZW5kc3dpdGhfX2RvY19ffSwKKyAgICB7InBhcnRpdGlvbiIsIChQeUNGdW5jdGlvbilzdHJpbmdfcGFydGl0aW9uLCBNRVRIX08sIHBhcnRpdGlvbl9fZG9jX199LAorICAgIHsiZmluZCIsIChQeUNGdW5jdGlvbilzdHJpbmdfZmluZCwgTUVUSF9WQVJBUkdTLCBmaW5kX19kb2NfX30sCisgICAgeyJpbmRleCIsIChQeUNGdW5jdGlvbilzdHJpbmdfaW5kZXgsIE1FVEhfVkFSQVJHUywgaW5kZXhfX2RvY19ffSwKKyAgICB7ImxzdHJpcCIsIChQeUNGdW5jdGlvbilzdHJpbmdfbHN0cmlwLCBNRVRIX1ZBUkFSR1MsIGxzdHJpcF9fZG9jX199LAorICAgIHsicmVwbGFjZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfcmVwbGFjZSwgTUVUSF9WQVJBUkdTLCByZXBsYWNlX19kb2NfX30sCisgICAgeyJyZmluZCIsIChQeUNGdW5jdGlvbilzdHJpbmdfcmZpbmQsIE1FVEhfVkFSQVJHUywgcmZpbmRfX2RvY19ffSwKKyAgICB7InJpbmRleCIsIChQeUNGdW5jdGlvbilzdHJpbmdfcmluZGV4LCBNRVRIX1ZBUkFSR1MsIHJpbmRleF9fZG9jX199LAorICAgIHsicnN0cmlwIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19yc3RyaXAsIE1FVEhfVkFSQVJHUywgcnN0cmlwX19kb2NfX30sCisgICAgeyJycGFydGl0aW9uIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19ycGFydGl0aW9uLCBNRVRIX08sCisgICAgIHJwYXJ0aXRpb25fX2RvY19ffSwKKyAgICB7InN0YXJ0c3dpdGgiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3N0YXJ0c3dpdGgsIE1FVEhfVkFSQVJHUywKKyAgICAgc3RhcnRzd2l0aF9fZG9jX199LAorICAgIHsic3RyaXAiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3N0cmlwLCBNRVRIX1ZBUkFSR1MsIHN0cmlwX19kb2NfX30sCisgICAgeyJzd2FwY2FzZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfc3dhcGNhc2UsIE1FVEhfTk9BUkdTLAorICAgICBzd2FwY2FzZV9fZG9jX199LAorICAgIHsidHJhbnNsYXRlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ190cmFuc2xhdGUsIE1FVEhfVkFSQVJHUywKKyAgICAgdHJhbnNsYXRlX19kb2NfX30sCisgICAgeyJ0aXRsZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfdGl0bGUsIE1FVEhfTk9BUkdTLCB0aXRsZV9fZG9jX199LAorICAgIHsibGp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX2xqdXN0LCBNRVRIX1ZBUkFSR1MsIGxqdXN0X19kb2NfX30sCisgICAgeyJyanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdfcmp1c3QsIE1FVEhfVkFSQVJHUywgcmp1c3RfX2RvY19ffSwKKyAgICB7ImNlbnRlciIsIChQeUNGdW5jdGlvbilzdHJpbmdfY2VudGVyLCBNRVRIX1ZBUkFSR1MsIGNlbnRlcl9fZG9jX199LAorICAgIHsiemZpbGwiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3pmaWxsLCBNRVRIX1ZBUkFSR1MsIHpmaWxsX19kb2NfX30sCisgICAgeyJmb3JtYXQiLCAoUHlDRnVuY3Rpb24pIGRvX3N0cmluZ19mb3JtYXQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGZvcm1hdF9fZG9jX199LAorICAgIHsiX19mb3JtYXRfXyIsIChQeUNGdW5jdGlvbikgc3RyaW5nX19mb3JtYXRfXywgTUVUSF9WQVJBUkdTLCBwX2Zvcm1hdF9fZG9jX199LAorICAgIHsiX2Zvcm1hdHRlcl9maWVsZF9uYW1lX3NwbGl0IiwgKFB5Q0Z1bmN0aW9uKSBmb3JtYXR0ZXJfZmllbGRfbmFtZV9zcGxpdCwgTUVUSF9OT0FSR1N9LAorICAgIHsiX2Zvcm1hdHRlcl9wYXJzZXIiLCAoUHlDRnVuY3Rpb24pIGZvcm1hdHRlcl9wYXJzZXIsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImVuY29kZSIsIChQeUNGdW5jdGlvbilzdHJpbmdfZW5jb2RlLCBNRVRIX1ZBUkFSR1MsIGVuY29kZV9fZG9jX199LAorICAgIHsiZGVjb2RlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19kZWNvZGUsIE1FVEhfVkFSQVJHUywgZGVjb2RlX19kb2NfX30sCisgICAgeyJleHBhbmR0YWJzIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ19leHBhbmR0YWJzLCBNRVRIX1ZBUkFSR1MsCisgICAgIGV4cGFuZHRhYnNfX2RvY19ffSwKKyAgICB7InNwbGl0bGluZXMiLCAoUHlDRnVuY3Rpb24pc3RyaW5nX3NwbGl0bGluZXMsIE1FVEhfVkFSQVJHUywKKyAgICAgc3BsaXRsaW5lc19fZG9jX199LAorICAgIHsiX19zaXplb2ZfXyIsIChQeUNGdW5jdGlvbilzdHJpbmdfc2l6ZW9mLCBNRVRIX05PQVJHUywKKyAgICAgc2l6ZW9mX19kb2NfX30sCisgICAgeyJfX2dldG5ld2FyZ3NfXyIsICAgICAgICAgIChQeUNGdW5jdGlvbilzdHJpbmdfZ2V0bmV3YXJncywgTUVUSF9OT0FSR1N9LAorICAgIHtOVUxMLCAgICAgTlVMTH0gICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00MDYzLDExMSArNDA2MywxMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp4ID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im9iamVjdCIsIDB9OworICAgIFB5T2JqZWN0ICp4ID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7Im9iamVjdCIsIDB9OwogCi0JaWYgKHR5cGUgIT0gJlB5U3RyaW5nX1R5cGUpCi0JCXJldHVybiBzdHJfc3VidHlwZV9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPOnN0ciIsIGt3bGlzdCwgJngpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoeCA9PSBOVUxMKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0JcmV0dXJuIFB5T2JqZWN0X1N0cih4KTsKKyAgICBpZiAodHlwZSAhPSAmUHlTdHJpbmdfVHlwZSkKKyAgICAgICAgcmV0dXJuIHN0cl9zdWJ0eXBlX25ldyh0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAifE86c3RyIiwga3dsaXN0LCAmeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh4ID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKKyAgICByZXR1cm4gUHlPYmplY3RfU3RyKHgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyX3N1YnR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp0bXAsICpwbmV3OwotCVB5X3NzaXplX3QgbjsKKyAgICBQeU9iamVjdCAqdG1wLCAqcG5ldzsKKyAgICBQeV9zc2l6ZV90IG47CiAKLQlhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlTdHJpbmdfVHlwZSkpOwotCXRtcCA9IHN0cmluZ19uZXcoJlB5U3RyaW5nX1R5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrRXhhY3QodG1wKSk7Ci0JbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRtcCk7Ci0JcG5ldyA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIG4pOwotCWlmIChwbmV3ICE9IE5VTEwpIHsKLQkJUHlfTUVNQ1BZKFB5U3RyaW5nX0FTX1NUUklORyhwbmV3KSwgUHlTdHJpbmdfQVNfU1RSSU5HKHRtcCksIG4rMSk7Ci0JCSgoUHlTdHJpbmdPYmplY3QgKilwbmV3KS0+b2Jfc2hhc2ggPQotCQkJKChQeVN0cmluZ09iamVjdCAqKXRtcCktPm9iX3NoYXNoOwotCQkoKFB5U3RyaW5nT2JqZWN0ICopcG5ldyktPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7Ci0JfQotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiBwbmV3OworICAgIGFzc2VydChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeVN0cmluZ19UeXBlKSk7CisgICAgdG1wID0gc3RyaW5nX25ldygmUHlTdHJpbmdfVHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2tFeGFjdCh0bXApKTsKKyAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUodG1wKTsKKyAgICBwbmV3ID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgbik7CisgICAgaWYgKHBuZXcgIT0gTlVMTCkgeworICAgICAgICBQeV9NRU1DUFkoUHlTdHJpbmdfQVNfU1RSSU5HKHBuZXcpLCBQeVN0cmluZ19BU19TVFJJTkcodG1wKSwgbisxKTsKKyAgICAgICAgKChQeVN0cmluZ09iamVjdCAqKXBuZXcpLT5vYl9zaGFzaCA9CisgICAgICAgICAgICAoKFB5U3RyaW5nT2JqZWN0ICopdG1wKS0+b2Jfc2hhc2g7CisgICAgICAgICgoUHlTdHJpbmdPYmplY3QgKilwbmV3KS0+b2Jfc3N0YXRlID0gU1NUQVRFX05PVF9JTlRFUk5FRDsKKyAgICB9CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIHBuZXc7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBiYXNlc3RyaW5nX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJIlRoZSBiYXNlc3RyaW5nIHR5cGUgY2Fubm90IGJlIGluc3RhbnRpYXRlZCIpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJUaGUgYmFzZXN0cmluZyB0eXBlIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ19tb2QoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQogewotCWlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotCX0KLQlyZXR1cm4gUHlTdHJpbmdfRm9ybWF0KHYsIHcpOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIH0KKyAgICByZXR1cm4gUHlTdHJpbmdfRm9ybWF0KHYsIHcpOwogfQogCiBQeURvY19TVFJWQVIoYmFzZXN0cmluZ19kb2MsCiAiVHlwZSBiYXNlc3RyaW5nIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQ7IGl0IGlzIHRoZSBiYXNlIGZvciBzdHIgYW5kIHVuaWNvZGUuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgc3RyaW5nX2FzX251bWJlciA9IHsKLQkwLAkJCS8qbmJfYWRkKi8KLQkwLAkJCS8qbmJfc3VidHJhY3QqLwotCTAsCQkJLypuYl9tdWx0aXBseSovCi0JMCwgCQkJLypuYl9kaXZpZGUqLwotCXN0cmluZ19tb2QsCQkvKm5iX3JlbWFpbmRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfYWRkKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLypuYl9zdWJ0cmFjdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbmJfbXVsdGlwbHkqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKm5iX2RpdmlkZSovCisgICAgc3RyaW5nX21vZCwgICAgICAgICAgICAgICAgIC8qbmJfcmVtYWluZGVyKi8KIH07CiAKIAogUHlUeXBlT2JqZWN0IFB5QmFzZVN0cmluZ19UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JImJhc2VzdHJpbmciLAotCTAsCi0JMCwKLSAJMCwJCQkgCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkgCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkgCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCTAsCQkgCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCWJhc2VzdHJpbmdfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JJlB5QmFzZU9iamVjdF9UeXBlLAkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCWJhc2VzdHJpbmdfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQkwLAkJICAgICAgICAgICAgICAgIAkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAiYmFzZXN0cmluZyIsCisgICAgMCwKKyAgICAwLAorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIGJhc2VzdHJpbmdfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICZQeUJhc2VPYmplY3RfVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgYmFzZXN0cmluZ19uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihzdHJpbmdfZG9jLApAQCAtNDE3Nyw3MCArNDE3Nyw3MCBAQAogSWYgdGhlIGFyZ3VtZW50IGlzIGEgc3RyaW5nLCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzYW1lIG9iamVjdC4iKTsKIAogUHlUeXBlT2JqZWN0IFB5U3RyaW5nX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkic3RyIiwKLQlzaXplb2YoUHlTdHJpbmdPYmplY3QpLAotCXNpemVvZihjaGFyKSwKLSAJc3RyaW5nX2RlYWxsb2MsIAkJCS8qIHRwX2RlYWxsb2MgKi8KLQkocHJpbnRmdW5jKXN0cmluZ19wcmludCwgCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCXN0cmluZ19yZXByLCAJCQkJLyogdHBfcmVwciAqLwotCSZzdHJpbmdfYXNfbnVtYmVyLAkJCS8qIHRwX2FzX251bWJlciAqLwotCSZzdHJpbmdfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkmc3RyaW5nX2FzX21hcHBpbmcsCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylzdHJpbmdfaGFzaCwgCQkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0Jc3RyaW5nX3N0ciwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCSZzdHJpbmdfYXNfYnVmZmVyLAkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyB8Ci0JCVB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUyB8Ci0JCVB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIsCS8qIHRwX2ZsYWdzICovCi0Jc3RyaW5nX2RvYywJCQkJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0JKHJpY2hjbXBmdW5jKXN0cmluZ19yaWNoY29tcGFyZSwJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXN0cmluZ19tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JJlB5QmFzZVN0cmluZ19UeXBlLAkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCXN0cmluZ19uZXcsCQkJCS8qIHRwX25ldyAqLwotCVB5T2JqZWN0X0RlbCwJICAgICAgICAgICAgICAgIAkvKiB0cF9mcmVlICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAic3RyIiwKKyAgICBzaXplb2YoUHlTdHJpbmdPYmplY3QpLAorICAgIHNpemVvZihjaGFyKSwKKyAgICBzdHJpbmdfZGVhbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKXN0cmluZ19wcmludCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgc3RyaW5nX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJnN0cmluZ19hc19udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmc3RyaW5nX2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJnN0cmluZ19hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKXN0cmluZ19oYXNoLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgc3RyaW5nX3N0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICZzdHJpbmdfYXNfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfU1RSSU5HX1NVQkNMQVNTIHwKKyAgICAgICAgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiwgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgc3RyaW5nX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIChyaWNoY21wZnVuYylzdHJpbmdfcmljaGNvbXBhcmUsICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHN0cmluZ19tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgJlB5QmFzZVN0cmluZ19UeXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBzdHJpbmdfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogdm9pZAogUHlTdHJpbmdfQ29uY2F0KHJlZ2lzdGVyIFB5T2JqZWN0ICoqcHYsIHJlZ2lzdGVyIFB5T2JqZWN0ICp3KQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICp2OwotCWlmICgqcHYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmICh3ID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKCpwdikpIHsKLQkJUHlfREVDUkVGKCpwdik7Ci0JCSpwdiA9IE5VTEw7Ci0JCXJldHVybjsKLQl9Ci0JdiA9IHN0cmluZ19jb25jYXQoKFB5U3RyaW5nT2JqZWN0ICopICpwdiwgdyk7Ci0JUHlfREVDUkVGKCpwdik7Ci0JKnB2ID0gdjsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqdjsKKyAgICBpZiAoKnB2ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAodyA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjaygqcHYpKSB7CisgICAgICAgIFB5X0RFQ1JFRigqcHYpOworICAgICAgICAqcHYgPSBOVUxMOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHYgPSBzdHJpbmdfY29uY2F0KChQeVN0cmluZ09iamVjdCAqKSAqcHYsIHcpOworICAgIFB5X0RFQ1JFRigqcHYpOworICAgICpwdiA9IHY7CiB9CiAKIHZvaWQKIFB5U3RyaW5nX0NvbmNhdEFuZERlbChyZWdpc3RlciBQeU9iamVjdCAqKnB2LCByZWdpc3RlciBQeU9iamVjdCAqdykKIHsKLQlQeVN0cmluZ19Db25jYXQocHYsIHcpOwotCVB5X1hERUNSRUYodyk7CisgICAgUHlTdHJpbmdfQ29uY2F0KHB2LCB3KTsKKyAgICBQeV9YREVDUkVGKHcpOwogfQogCiAKQEAgLTQyNjEsMzIgKzQyNjEsMzIgQEAKIGludAogX1B5U3RyaW5nX1Jlc2l6ZShQeU9iamVjdCAqKnB2LCBQeV9zc2l6ZV90IG5ld3NpemUpCiB7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKnY7Ci0JcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKnN2OwotCXYgPSAqcHY7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeV9SRUZDTlQodikgIT0gMSB8fCBuZXdzaXplIDwgMCB8fAotCSAgICBQeVN0cmluZ19DSEVDS19JTlRFUk5FRCh2KSkgewotCQkqcHYgPSAwOwotCQlQeV9ERUNSRUYodik7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qIFhYWCBVTlJFRi9ORVdSRUYgaW50ZXJmYWNlIHNob3VsZCBiZSBtb3JlIHN5bW1ldHJpY2FsICovCi0JX1B5X0RFQ19SRUZUT1RBTDsKLQlfUHlfRm9yZ2V0UmVmZXJlbmNlKHYpOwotCSpwdiA9IChQeU9iamVjdCAqKQotCQlQeU9iamVjdF9SRUFMTE9DKChjaGFyICopdiwgc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSArIG5ld3NpemUpOwotCWlmICgqcHYgPT0gTlVMTCkgewotCQlQeU9iamVjdF9EZWwodik7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JX1B5X05ld1JlZmVyZW5jZSgqcHYpOwotCXN2ID0gKFB5U3RyaW5nT2JqZWN0ICopICpwdjsKLQlQeV9TSVpFKHN2KSA9IG5ld3NpemU7Ci0Jc3YtPm9iX3N2YWxbbmV3c2l6ZV0gPSAnXDAnOwotCXN2LT5vYl9zaGFzaCA9IC0xOwkvKiBpbnZhbGlkYXRlIGNhY2hlZCBoYXNoIHZhbHVlICovCi0JcmV0dXJuIDA7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnY7CisgICAgcmVnaXN0ZXIgUHlTdHJpbmdPYmplY3QgKnN2OworICAgIHYgPSAqcHY7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeV9SRUZDTlQodikgIT0gMSB8fCBuZXdzaXplIDwgMCB8fAorICAgICAgICBQeVN0cmluZ19DSEVDS19JTlRFUk5FRCh2KSkgeworICAgICAgICAqcHYgPSAwOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIFhYWCBVTlJFRi9ORVdSRUYgaW50ZXJmYWNlIHNob3VsZCBiZSBtb3JlIHN5bW1ldHJpY2FsICovCisgICAgX1B5X0RFQ19SRUZUT1RBTDsKKyAgICBfUHlfRm9yZ2V0UmVmZXJlbmNlKHYpOworICAgICpwdiA9IChQeU9iamVjdCAqKQorICAgICAgICBQeU9iamVjdF9SRUFMTE9DKChjaGFyICopdiwgc2l6ZW9mKFB5U3RyaW5nT2JqZWN0KSArIG5ld3NpemUpOworICAgIGlmICgqcHYgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdF9EZWwodik7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgX1B5X05ld1JlZmVyZW5jZSgqcHYpOworICAgIHN2ID0gKFB5U3RyaW5nT2JqZWN0ICopICpwdjsKKyAgICBQeV9TSVpFKHN2KSA9IG5ld3NpemU7CisgICAgc3YtPm9iX3N2YWxbbmV3c2l6ZV0gPSAnXDAnOworICAgIHN2LT5vYl9zaGFzaCA9IC0xOyAgICAgICAgICAvKiBpbnZhbGlkYXRlIGNhY2hlZCBoYXNoIHZhbHVlICovCisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEhlbHBlcnMgZm9yIGZvcm1hdHN0cmluZyAqLwpAQCAtNDI5NCw4OSArNDI5NCw4OSBAQAogUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCiBnZXRuZXh0YXJnKFB5T2JqZWN0ICphcmdzLCBQeV9zc2l6ZV90IGFyZ2xlbiwgUHlfc3NpemVfdCAqcF9hcmdpZHgpCiB7Ci0JUHlfc3NpemVfdCBhcmdpZHggPSAqcF9hcmdpZHg7Ci0JaWYgKGFyZ2lkeCA8IGFyZ2xlbikgewotCQkoKnBfYXJnaWR4KSsrOwotCQlpZiAoYXJnbGVuIDwgMCkKLQkJCXJldHVybiBhcmdzOwotCQllbHNlCi0JCQlyZXR1cm4gUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIGFyZ2lkeCk7Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkibm90IGVub3VnaCBhcmd1bWVudHMgZm9yIGZvcm1hdCBzdHJpbmciKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGFyZ2lkeCA9ICpwX2FyZ2lkeDsKKyAgICBpZiAoYXJnaWR4IDwgYXJnbGVuKSB7CisgICAgICAgICgqcF9hcmdpZHgpKys7CisgICAgICAgIGlmIChhcmdsZW4gPCAwKQorICAgICAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeVR1cGxlX0dldEl0ZW0oYXJncywgYXJnaWR4KTsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBmb3JtYXQgc3RyaW5nIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIEZvcm1hdCBjb2RlcwotICogRl9MSlVTVAknLScKLSAqIEZfU0lHTgknKycKLSAqIEZfQkxBTksJJyAnCi0gKiBGX0FMVAknIycKLSAqIEZfWkVSTwknMCcKKyAqIEZfTEpVU1QgICAgICAnLScKKyAqIEZfU0lHTiAgICAgICAnKycKKyAqIEZfQkxBTksgICAgICAnICcKKyAqIEZfQUxUICAgICAgICAnIycKKyAqIEZfWkVSTyAgICAgICAnMCcKICAqLwogI2RlZmluZSBGX0xKVVNUICgxPDwwKQotI2RlZmluZSBGX1NJR04JKDE8PDEpCisjZGVmaW5lIEZfU0lHTiAgKDE8PDEpCiAjZGVmaW5lIEZfQkxBTksgKDE8PDIpCi0jZGVmaW5lIEZfQUxUCSgxPDwzKQotI2RlZmluZSBGX1pFUk8JKDE8PDQpCisjZGVmaW5lIEZfQUxUICAgKDE8PDMpCisjZGVmaW5lIEZfWkVSTyAgKDE8PDQpCiAKIFB5X0xPQ0FMX0lOTElORShpbnQpCiBmb3JtYXRmbG9hdChjaGFyICpidWYsIHNpemVfdCBidWZsZW4sIGludCBmbGFncywKICAgICAgICAgICAgIGludCBwcmVjLCBpbnQgdHlwZSwgUHlPYmplY3QgKnYpCiB7Ci0JLyogZm10ID0gJyUjLicgKyBgcHJlY2AgKyBgdHlwZWAKLQkgICB3b3JzdCBjYXNlIGxlbmd0aCA9IDMgKyAxMCAobGVuIG9mIElOVF9NQVgpICsgMSA9IDE0ICh1c2UgMjApKi8KLQljaGFyIGZtdFsyMF07Ci0JZG91YmxlIHg7Ci0JeCA9IFB5RmxvYXRfQXNEb3VibGUodik7Ci0JaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJmbG9hdCBhcmd1bWVudCByZXF1aXJlZCwgIgotCQkJICAgICAibm90ICUuMjAwcyIsIFB5X1RZUEUodiktPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChwcmVjIDwgMCkKLQkJcHJlYyA9IDY7CisgICAgLyogZm10ID0gJyUjLicgKyBgcHJlY2AgKyBgdHlwZWAKKyAgICAgICB3b3JzdCBjYXNlIGxlbmd0aCA9IDMgKyAxMCAobGVuIG9mIElOVF9NQVgpICsgMSA9IDE0ICh1c2UgMjApKi8KKyAgICBjaGFyIGZtdFsyMF07CisgICAgZG91YmxlIHg7CisgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CisgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJmbG9hdCBhcmd1bWVudCByZXF1aXJlZCwgIgorICAgICAgICAgICAgICAgICAgICAgIm5vdCAlLjIwMHMiLCBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocHJlYyA8IDApCisgICAgICAgIHByZWMgPSA2OwogI2lmIFNJWkVPRl9JTlQgPiA0Ci0JLyogbWFrZSBzdXJlIHRoYXQgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgcHJlY2lzaW9uIHJlYWxseSBkb2VzCi0JICAgbmVlZCBhdCBtb3N0IDEwIGRpZ2l0czogcGxhdGZvcm1zIHdpdGggc2l6ZW9mKGludCkgPT0gOCBleGlzdCEgKi8KLQlpZiAocHJlYyA+IDB4N2ZmZmZmZmYpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJIm91dHJhZ2VvdXNseSBsYXJnZSBwcmVjaXNpb24gIgotCQkJCSJmb3IgZm9ybWF0dGVkIGZsb2F0Iik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgLyogbWFrZSBzdXJlIHRoYXQgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgcHJlY2lzaW9uIHJlYWxseSBkb2VzCisgICAgICAgbmVlZCBhdCBtb3N0IDEwIGRpZ2l0czogcGxhdGZvcm1zIHdpdGggc2l6ZW9mKGludCkgPT0gOCBleGlzdCEgKi8KKyAgICBpZiAocHJlYyA+IDB4N2ZmZmZmZmYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAib3V0cmFnZW91c2x5IGxhcmdlIHByZWNpc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGZvcm1hdHRlZCBmbG9hdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogI2VuZGlmCiAKLQlpZiAodHlwZSA9PSAnZicgJiYgZmFicyh4KSA+PSAxZTUwKQotCQl0eXBlID0gJ2cnOwotCS8qIFdvcnN0IGNhc2UgbGVuZ3RoIGNhbGMgdG8gZW5zdXJlIG5vIGJ1ZmZlciBvdmVycnVuOgorICAgIGlmICh0eXBlID09ICdmJyAmJiBmYWJzKHgpID49IDFlNTApCisgICAgICAgIHR5cGUgPSAnZyc7CisgICAgLyogV29yc3QgY2FzZSBsZW5ndGggY2FsYyB0byBlbnN1cmUgbm8gYnVmZmVyIG92ZXJydW46CiAKLQkgICAnZycgZm9ybWF0czoKLQkgICAgIGZtdCA9ICUjLjxwcmVjPmcKLQkgICAgIGJ1ZiA9ICctJyArIFswLTldKnByZWMgKyAnLicgKyAnZSsnICsgKGxvbmdlc3QgZXhwCi0JICAgICAgICBmb3IgYW55IGRvdWJsZSByZXAuKQotCSAgICAgbGVuID0gMSArIHByZWMgKyAxICsgMiArIDUgPSA5ICsgcHJlYworICAgICAgICdnJyBmb3JtYXRzOgorICAgICAgICAgZm10ID0gJSMuPHByZWM+ZworICAgICAgICAgYnVmID0gJy0nICsgWzAtOV0qcHJlYyArICcuJyArICdlKycgKyAobG9uZ2VzdCBleHAKKyAgICAgICAgZm9yIGFueSBkb3VibGUgcmVwLikKKyAgICAgICAgIGxlbiA9IDEgKyBwcmVjICsgMSArIDIgKyA1ID0gOSArIHByZWMKIAotCSAgICdmJyBmb3JtYXRzOgotCSAgICAgYnVmID0gJy0nICsgWzAtOV0qeCArICcuJyArIFswLTldKnByZWMgKHdpdGggeCA8IDUwKQotCSAgICAgbGVuID0gMSArIDUwICsgMSArIHByZWMgPSA1MiArIHByZWMKKyAgICAgICAnZicgZm9ybWF0czoKKyAgICAgICAgIGJ1ZiA9ICctJyArIFswLTldKnggKyAnLicgKyBbMC05XSpwcmVjICh3aXRoIHggPCA1MCkKKyAgICAgICAgIGxlbiA9IDEgKyA1MCArIDEgKyBwcmVjID0gNTIgKyBwcmVjCiAKLQkgICBJZiBwcmVjPTAgdGhlIGVmZmVjdGl2ZSBwcmVjaXNpb24gaXMgMSAodGhlIGxlYWRpbmcgZGlnaXQgaXMKLQkgICBhbHdheXMgZ2l2ZW4pLCB0aGVyZWZvcmUgaW5jcmVhc2UgdGhlIGxlbmd0aCBieSBvbmUuCisgICAgICAgSWYgcHJlYz0wIHRoZSBlZmZlY3RpdmUgcHJlY2lzaW9uIGlzIDEgKHRoZSBsZWFkaW5nIGRpZ2l0IGlzCisgICAgICAgYWx3YXlzIGdpdmVuKSwgdGhlcmVmb3JlIGluY3JlYXNlIHRoZSBsZW5ndGggYnkgb25lLgogCi0JKi8KLQlpZiAoKCh0eXBlID09ICdnJyB8fCB0eXBlID09ICdHJykgJiYKLSAgICAgICAgICAgICAgYnVmbGVuIDw9IChzaXplX3QpMTAgKyAoc2l6ZV90KXByZWMpIHx8Ci0JICAgICh0eXBlID09ICdmJyAmJiBidWZsZW4gPD0gKHNpemVfdCk1MyArIChzaXplX3QpcHJlYykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkiZm9ybWF0dGVkIGZsb2F0IGlzIHRvbyBsb25nIChwcmVjaXNpb24gdG9vIGxhcmdlPykiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeU9TX3NucHJpbnRmKGZtdCwgc2l6ZW9mKGZtdCksICIlJSVzLiVkJWMiLAotCQkgICAgICAoZmxhZ3MmRl9BTFQpID8gIiMiIDogIiIsCi0JCSAgICAgIHByZWMsIHR5cGUpOwotCVB5T1NfYXNjaWlfZm9ybWF0ZChidWYsIGJ1ZmxlbiwgZm10LCB4KTsKLQlyZXR1cm4gKGludClzdHJsZW4oYnVmKTsKKyAgICAqLworICAgIGlmICgoKHR5cGUgPT0gJ2cnIHx8IHR5cGUgPT0gJ0cnKSAmJgorICAgICAgICAgIGJ1ZmxlbiA8PSAoc2l6ZV90KTEwICsgKHNpemVfdClwcmVjKSB8fAorICAgICAgICAodHlwZSA9PSAnZicgJiYgYnVmbGVuIDw9IChzaXplX3QpNTMgKyAoc2l6ZV90KXByZWMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgImZvcm1hdHRlZCBmbG9hdCBpcyB0b28gbG9uZyAocHJlY2lzaW9uIHRvbyBsYXJnZT8pIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlPU19zbnByaW50ZihmbXQsIHNpemVvZihmbXQpLCAiJSUlcy4lZCVjIiwKKyAgICAgICAgICAgICAgICAgIChmbGFncyZGX0FMVCkgPyAiIyIgOiAiIiwKKyAgICAgICAgICAgICAgICAgIHByZWMsIHR5cGUpOworICAgIFB5T1NfYXNjaWlfZm9ybWF0ZChidWYsIGJ1ZmxlbiwgZm10LCB4KTsKKyAgICByZXR1cm4gKGludClzdHJsZW4oYnVmKTsKIH0KIAogLyogX1B5U3RyaW5nX0Zvcm1hdExvbmcgZW11bGF0ZXMgdGhlIGZvcm1hdCBjb2RlcyBkLCB1LCBvLCB4IGFuZCBYLCBhbmQKQEAgLTQzOTIsMjI2ICs0MzkyLDIyNiBAQAogICogICAgICAgICBzZXQgaW4gZmxhZ3MuICBUaGUgY2FzZSBvZiBoZXggZGlnaXRzIHdpbGwgYmUgY29ycmVjdCwKICAqICAgICBUaGVyZSB3aWxsIGJlIGF0IGxlYXN0IHByZWMgZGlnaXRzLCB6ZXJvLWZpbGxlZCBvbiB0aGUgbGVmdCBpZgogICogICAgICAgICBuZWNlc3NhcnkgdG8gZ2V0IHRoYXQgbWFueS4KLSAqIHZhbAkJb2JqZWN0IHRvIGJlIGNvbnZlcnRlZAotICogZmxhZ3MJYml0bWFzayBvZiBmb3JtYXQgZmxhZ3M7IG9ubHkgRl9BTFQgaXMgbG9va2VkIGF0Ci0gKiBwcmVjCQltaW5pbXVtIG51bWJlciBvZiBkaWdpdHM7IDAtZmlsbCBvbiBsZWZ0IGlmIG5lZWRlZAotICogdHlwZQkJYSBjaGFyYWN0ZXIgaW4gW2R1b3hYXTsgdSBhY3RzIHRoZSBzYW1lIGFzIGQKKyAqIHZhbCAgICAgICAgICBvYmplY3QgdG8gYmUgY29udmVydGVkCisgKiBmbGFncyAgICAgICAgYml0bWFzayBvZiBmb3JtYXQgZmxhZ3M7IG9ubHkgRl9BTFQgaXMgbG9va2VkIGF0CisgKiBwcmVjICAgICAgICAgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzOyAwLWZpbGwgb24gbGVmdCBpZiBuZWVkZWQKKyAqIHR5cGUgICAgICAgICBhIGNoYXJhY3RlciBpbiBbZHVveFhdOyB1IGFjdHMgdGhlIHNhbWUgYXMgZAogICoKICAqIENBVVRJT046ICBvLCB4IGFuZCBYIGNvbnZlcnNpb25zIG9uIHJlZ3VsYXIgaW50cyBjYW4gbmV2ZXIKICAqIHByb2R1Y2UgYSAnLScgc2lnbiwgYnV0IGNhbiBmb3IgUHl0aG9uJ3MgdW5ib3VuZGVkIGludHMuCiAgKi8KIFB5T2JqZWN0KgogX1B5U3RyaW5nX0Zvcm1hdExvbmcoUHlPYmplY3QgKnZhbCwgaW50IGZsYWdzLCBpbnQgcHJlYywgaW50IHR5cGUsCi0JCSAgICAgY2hhciAqKnBidWYsIGludCAqcGxlbikKKyAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipwYnVmLCBpbnQgKnBsZW4pCiB7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JY2hhciAqYnVmOwotCVB5X3NzaXplX3QgaTsKLQlpbnQgc2lnbjsJLyogMSBpZiAnLScsIGVsc2UgMCAqLwotCWludCBsZW47CS8qIG51bWJlciBvZiBjaGFyYWN0ZXJzICovCi0JUHlfc3NpemVfdCBsbGVuOwotCWludCBudW1kaWdpdHM7CS8qIGxlbiA9PSBudW1ub25kaWdpdHMgKyBudW1kaWdpdHMgKi8KLQlpbnQgbnVtbm9uZGlnaXRzID0gMDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBjaGFyICpidWY7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBzaWduOyAgICAgICAgICAgLyogMSBpZiAnLScsIGVsc2UgMCAqLworICAgIGludCBsZW47ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgKi8KKyAgICBQeV9zc2l6ZV90IGxsZW47CisgICAgaW50IG51bWRpZ2l0czsgICAgICAvKiBsZW4gPT0gbnVtbm9uZGlnaXRzICsgbnVtZGlnaXRzICovCisgICAgaW50IG51bW5vbmRpZ2l0cyA9IDA7CiAKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlICdkJzoKLQljYXNlICd1JzoKLQkJcmVzdWx0ID0gUHlfVFlQRSh2YWwpLT50cF9zdHIodmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JCXJlc3VsdCA9IFB5X1RZUEUodmFsKS0+dHBfYXNfbnVtYmVyLT5uYl9vY3QodmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSAneCc6Ci0JY2FzZSAnWCc6Ci0JCW51bW5vbmRpZ2l0cyA9IDI7Ci0JCXJlc3VsdCA9IFB5X1RZUEUodmFsKS0+dHBfYXNfbnVtYmVyLT5uYl9oZXgodmFsKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYXNzZXJ0KCEiJ3R5cGUnIG5vdCBpbiBbZHVveFhdIik7Ci0JfQotCWlmICghcmVzdWx0KQotCQlyZXR1cm4gTlVMTDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlICdkJzoKKyAgICBjYXNlICd1JzoKKyAgICAgICAgcmVzdWx0ID0gUHlfVFlQRSh2YWwpLT50cF9zdHIodmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbyc6CisgICAgICAgIHJlc3VsdCA9IFB5X1RZUEUodmFsKS0+dHBfYXNfbnVtYmVyLT5uYl9vY3QodmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAneCc6CisgICAgY2FzZSAnWCc6CisgICAgICAgIG51bW5vbmRpZ2l0cyA9IDI7CisgICAgICAgIHJlc3VsdCA9IFB5X1RZUEUodmFsKS0+dHBfYXNfbnVtYmVyLT5uYl9oZXgodmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KCEiJ3R5cGUnIG5vdCBpbiBbZHVveFhdIik7CisgICAgfQorICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWJ1ZiA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCk7Ci0JaWYgKCFidWYpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBidWYgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOworICAgIGlmICghYnVmKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBUbyBtb2RpZnkgdGhlIHN0cmluZyBpbi1wbGFjZSwgdGhlcmUgY2FuIG9ubHkgYmUgb25lIHJlZmVyZW5jZS4gKi8KLQlpZiAoUHlfUkVGQ05UKHJlc3VsdCkgIT0gMSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWxsZW4gPSBQeVN0cmluZ19TaXplKHJlc3VsdCk7Ci0JaWYgKGxsZW4gPiBJTlRfTUFYKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic3RyaW5nIHRvbyBsYXJnZSBpbiBfUHlTdHJpbmdfRm9ybWF0TG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbGVuID0gKGludClsbGVuOwotCWlmIChidWZbbGVuLTFdID09ICdMJykgewotCQktLWxlbjsKLQkJYnVmW2xlbl0gPSAnXDAnOwotCX0KLQlzaWduID0gYnVmWzBdID09ICctJzsKLQludW1ub25kaWdpdHMgKz0gc2lnbjsKLQludW1kaWdpdHMgPSBsZW4gLSBudW1ub25kaWdpdHM7Ci0JYXNzZXJ0KG51bWRpZ2l0cyA+IDApOworICAgIC8qIFRvIG1vZGlmeSB0aGUgc3RyaW5nIGluLXBsYWNlLCB0aGVyZSBjYW4gb25seSBiZSBvbmUgcmVmZXJlbmNlLiAqLworICAgIGlmIChQeV9SRUZDTlQocmVzdWx0KSAhPSAxKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbGxlbiA9IFB5U3RyaW5nX1NpemUocmVzdWx0KTsKKyAgICBpZiAobGxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJzdHJpbmcgdG9vIGxhcmdlIGluIF9QeVN0cmluZ19Gb3JtYXRMb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBsZW4gPSAoaW50KWxsZW47CisgICAgaWYgKGJ1ZltsZW4tMV0gPT0gJ0wnKSB7CisgICAgICAgIC0tbGVuOworICAgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgfQorICAgIHNpZ24gPSBidWZbMF0gPT0gJy0nOworICAgIG51bW5vbmRpZ2l0cyArPSBzaWduOworICAgIG51bWRpZ2l0cyA9IGxlbiAtIG51bW5vbmRpZ2l0czsKKyAgICBhc3NlcnQobnVtZGlnaXRzID4gMCk7CiAKLQkvKiBHZXQgcmlkIG9mIGJhc2UgbWFya2VyIHVubGVzcyBGX0FMVCAqLwotCWlmICgoZmxhZ3MgJiBGX0FMVCkgPT0gMCkgewotCQkvKiBOZWVkIHRvIHNraXAgMHgsIDBYIG9yIDAuICovCi0JCWludCBza2lwcGVkID0gMDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgJ28nOgotCQkJYXNzZXJ0KGJ1ZltzaWduXSA9PSAnMCcpOwotCQkJLyogSWYgMCBpcyBvbmx5IGRpZ2l0LCBsZWF2ZSBpdCBhbG9uZS4gKi8KLQkJCWlmIChudW1kaWdpdHMgPiAxKSB7Ci0JCQkJc2tpcHBlZCA9IDE7Ci0JCQkJLS1udW1kaWdpdHM7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAneCc6Ci0JCWNhc2UgJ1gnOgotCQkJYXNzZXJ0KGJ1ZltzaWduXSA9PSAnMCcpOwotCQkJYXNzZXJ0KGJ1ZltzaWduICsgMV0gPT0gJ3gnKTsKLQkJCXNraXBwZWQgPSAyOwotCQkJbnVtbm9uZGlnaXRzIC09IDI7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc2tpcHBlZCkgewotCQkJYnVmICs9IHNraXBwZWQ7Ci0JCQlsZW4gLT0gc2tpcHBlZDsKLQkJCWlmIChzaWduKQotCQkJCWJ1ZlswXSA9ICctJzsKLQkJfQotCQlhc3NlcnQobGVuID09IG51bW5vbmRpZ2l0cyArIG51bWRpZ2l0cyk7Ci0JCWFzc2VydChudW1kaWdpdHMgPiAwKTsKLQl9CisgICAgLyogR2V0IHJpZCBvZiBiYXNlIG1hcmtlciB1bmxlc3MgRl9BTFQgKi8KKyAgICBpZiAoKGZsYWdzICYgRl9BTFQpID09IDApIHsKKyAgICAgICAgLyogTmVlZCB0byBza2lwIDB4LCAwWCBvciAwLiAqLworICAgICAgICBpbnQgc2tpcHBlZCA9IDA7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIGFzc2VydChidWZbc2lnbl0gPT0gJzAnKTsKKyAgICAgICAgICAgIC8qIElmIDAgaXMgb25seSBkaWdpdCwgbGVhdmUgaXQgYWxvbmUuICovCisgICAgICAgICAgICBpZiAobnVtZGlnaXRzID4gMSkgeworICAgICAgICAgICAgICAgIHNraXBwZWQgPSAxOworICAgICAgICAgICAgICAgIC0tbnVtZGlnaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgIGFzc2VydChidWZbc2lnbl0gPT0gJzAnKTsKKyAgICAgICAgICAgIGFzc2VydChidWZbc2lnbiArIDFdID09ICd4Jyk7CisgICAgICAgICAgICBza2lwcGVkID0gMjsKKyAgICAgICAgICAgIG51bW5vbmRpZ2l0cyAtPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNraXBwZWQpIHsKKyAgICAgICAgICAgIGJ1ZiArPSBza2lwcGVkOworICAgICAgICAgICAgbGVuIC09IHNraXBwZWQ7CisgICAgICAgICAgICBpZiAoc2lnbikKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAnLSc7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGxlbiA9PSBudW1ub25kaWdpdHMgKyBudW1kaWdpdHMpOworICAgICAgICBhc3NlcnQobnVtZGlnaXRzID4gMCk7CisgICAgfQogCi0JLyogRmlsbCB3aXRoIGxlYWRpbmcgemVyb2VzIHRvIG1lZXQgbWluaW11bSB3aWR0aC4gKi8KLQlpZiAocHJlYyA+IG51bWRpZ2l0cykgewotCQlQeU9iamVjdCAqcjEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLAotCQkJCQludW1ub25kaWdpdHMgKyBwcmVjKTsKLQkJY2hhciAqYjE7Ci0JCWlmICghcjEpIHsKLQkJCVB5X0RFQ1JFRihyZXN1bHQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJYjEgPSBQeVN0cmluZ19BU19TVFJJTkcocjEpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtbm9uZGlnaXRzOyArK2kpCi0JCQkqYjErKyA9ICpidWYrKzsKLQkJZm9yIChpID0gMDsgaSA8IHByZWMgLSBudW1kaWdpdHM7IGkrKykKLQkJCSpiMSsrID0gJzAnOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtZGlnaXRzOyBpKyspCi0JCQkqYjErKyA9ICpidWYrKzsKLQkJKmIxID0gJ1wwJzsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCXJlc3VsdCA9IHIxOwotCQlidWYgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKLQkJbGVuID0gbnVtbm9uZGlnaXRzICsgcHJlYzsKLQl9CisgICAgLyogRmlsbCB3aXRoIGxlYWRpbmcgemVyb2VzIHRvIG1lZXQgbWluaW11bSB3aWR0aC4gKi8KKyAgICBpZiAocHJlYyA+IG51bWRpZ2l0cykgeworICAgICAgICBQeU9iamVjdCAqcjEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1ub25kaWdpdHMgKyBwcmVjKTsKKyAgICAgICAgY2hhciAqYjE7CisgICAgICAgIGlmICghcjEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYjEgPSBQeVN0cmluZ19BU19TVFJJTkcocjEpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtbm9uZGlnaXRzOyArK2kpCisgICAgICAgICAgICAqYjErKyA9ICpidWYrKzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHByZWMgLSBudW1kaWdpdHM7IGkrKykKKyAgICAgICAgICAgICpiMSsrID0gJzAnOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtZGlnaXRzOyBpKyspCisgICAgICAgICAgICAqYjErKyA9ICpidWYrKzsKKyAgICAgICAgKmIxID0gJ1wwJzsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgIHJlc3VsdCA9IHIxOworICAgICAgICBidWYgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICAgICAgbGVuID0gbnVtbm9uZGlnaXRzICsgcHJlYzsKKyAgICB9CiAKLQkvKiBGaXggdXAgY2FzZSBmb3IgaGV4IGNvbnZlcnNpb25zLiAqLwotCWlmICh0eXBlID09ICdYJykgewotCQkvKiBOZWVkIHRvIGNvbnZlcnQgYWxsIGxvd2VyIGNhc2UgbGV0dGVycyB0byB1cHBlciBjYXNlLgotCQkgICBhbmQgbmVlZCB0byBjb252ZXJ0IDB4IHRvIDBYIChhbmQgLTB4IHRvIC0wWCkuICovCi0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCWlmIChidWZbaV0gPj0gJ2EnICYmIGJ1ZltpXSA8PSAneCcpCi0JCQkJYnVmW2ldIC09ICdhJy0nQSc7Ci0JfQotCSpwYnVmID0gYnVmOwotCSpwbGVuID0gbGVuOwotCXJldHVybiByZXN1bHQ7CisgICAgLyogRml4IHVwIGNhc2UgZm9yIGhleCBjb252ZXJzaW9ucy4gKi8KKyAgICBpZiAodHlwZSA9PSAnWCcpIHsKKyAgICAgICAgLyogTmVlZCB0byBjb252ZXJ0IGFsbCBsb3dlciBjYXNlIGxldHRlcnMgdG8gdXBwZXIgY2FzZS4KKyAgICAgICAgICAgYW5kIG5lZWQgdG8gY29udmVydCAweCB0byAwWCAoYW5kIC0weCB0byAtMFgpLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICBpZiAoYnVmW2ldID49ICdhJyAmJiBidWZbaV0gPD0gJ3gnKQorICAgICAgICAgICAgICAgIGJ1ZltpXSAtPSAnYSctJ0EnOworICAgIH0KKyAgICAqcGJ1ZiA9IGJ1ZjsKKyAgICAqcGxlbiA9IGxlbjsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeV9MT0NBTF9JTkxJTkUoaW50KQogZm9ybWF0aW50KGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbiwgaW50IGZsYWdzLAogICAgICAgICAgIGludCBwcmVjLCBpbnQgdHlwZSwgUHlPYmplY3QgKnYpCiB7Ci0JLyogZm10ID0gJyUjLicgKyBgcHJlY2AgKyAnbCcgKyBgdHlwZWAKLQkgICB3b3JzdCBjYXNlIGxlbmd0aCA9IDMgKyAxOSAod29yc3QgbGVuIG9mIElOVF9NQVggb24gNjQtYml0IG1hY2hpbmUpCi0JICAgKyAxICsgMSA9IDI0ICovCi0JY2hhciBmbXRbNjRdOwkvKiBwbGVudHkgYmlnIGVub3VnaCEgKi8KLQljaGFyICpzaWduOwotCWxvbmcgeDsKKyAgICAvKiBmbXQgPSAnJSMuJyArIGBwcmVjYCArICdsJyArIGB0eXBlYAorICAgICAgIHdvcnN0IGNhc2UgbGVuZ3RoID0gMyArIDE5ICh3b3JzdCBsZW4gb2YgSU5UX01BWCBvbiA2NC1iaXQgbWFjaGluZSkKKyAgICAgICArIDEgKyAxID0gMjQgKi8KKyAgICBjaGFyIGZtdFs2NF07ICAgICAgIC8qIHBsZW50eSBiaWcgZW5vdWdoISAqLworICAgIGNoYXIgKnNpZ247CisgICAgbG9uZyB4OwogCi0JeCA9IFB5SW50X0FzTG9uZyh2KTsKLQlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJpbnQgYXJndW1lbnQgcmVxdWlyZWQsIG5vdCAlLjIwMHMiLAotCQkJICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoeCA8IDAgJiYgdHlwZSA9PSAndScpIHsKLQkJdHlwZSA9ICdkJzsKLQl9Ci0JaWYgKHggPCAwICYmICh0eXBlID09ICd4JyB8fCB0eXBlID09ICdYJyB8fCB0eXBlID09ICdvJykpCi0JCXNpZ24gPSAiLSI7Ci0JZWxzZQotCQlzaWduID0gIiI7Ci0JaWYgKHByZWMgPCAwKQotCQlwcmVjID0gMTsKKyAgICB4ID0gUHlJbnRfQXNMb25nKHYpOworICAgIGlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImludCBhcmd1bWVudCByZXF1aXJlZCwgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHYpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoeCA8IDAgJiYgdHlwZSA9PSAndScpIHsKKyAgICAgICAgdHlwZSA9ICdkJzsKKyAgICB9CisgICAgaWYgKHggPCAwICYmICh0eXBlID09ICd4JyB8fCB0eXBlID09ICdYJyB8fCB0eXBlID09ICdvJykpCisgICAgICAgIHNpZ24gPSAiLSI7CisgICAgZWxzZQorICAgICAgICBzaWduID0gIiI7CisgICAgaWYgKHByZWMgPCAwKQorICAgICAgICBwcmVjID0gMTsKIAotCWlmICgoZmxhZ3MgJiBGX0FMVCkgJiYKLQkgICAgKHR5cGUgPT0gJ3gnIHx8IHR5cGUgPT0gJ1gnKSkgewotCQkvKiBXaGVuIGNvbnZlcnRpbmcgdW5kZXIgJSN4IG9yICUjWCwgdGhlcmUgYXJlIGEgbnVtYmVyCi0JCSAqIG9mIGlzc3VlcyB0aGF0IGNhdXNlIHBhaW46Ci0JCSAqIC0gd2hlbiAwIGlzIGJlaW5nIGNvbnZlcnRlZCwgdGhlIEMgc3RhbmRhcmQgbGVhdmVzIG9mZgotCQkgKiAgIHRoZSAnMHgnIG9yICcwWCcsIHdoaWNoIGlzIGluY29uc2lzdGVudCB3aXRoIG90aGVyCi0JCSAqICAgJSN4LyUjWCBjb252ZXJzaW9ucyBhbmQgaW5jb25zaXN0ZW50IHdpdGggUHl0aG9uJ3MKLQkJICogICBoZXgoKSBmdW5jdGlvbgotCQkgKiAtIHRoZXJlIGFyZSBwbGF0Zm9ybXMgdGhhdCB2aW9sYXRlIHRoZSBzdGFuZGFyZCBhbmQKLQkJICogICBjb252ZXJ0IDAgd2l0aCB0aGUgJzB4JyBvciAnMFgnCi0JCSAqICAgKE1ldHJvd2Vya3MsIENvbXBhcSBUcnU2NCkKLQkJICogLSB0aGVyZSBhcmUgcGxhdGZvcm1zIHRoYXQgZ2l2ZSAnMHgnIHdoZW4gY29udmVydGluZwotCQkgKiAgIHVuZGVyICUjWCwgYnV0IGNvbnZlcnQgMCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0JCSAqICAgc3RhbmRhcmQgKE9TLzIgRU1YKQotCQkgKgotCQkgKiBXZSBjYW4gYWNoaWV2ZSB0aGUgZGVzaXJlZCBjb25zaXN0ZW5jeSBieSBpbnNlcnRpbmcgb3VyCi0JCSAqIG93biAnMHgnIG9yICcwWCcgcHJlZml4LCBhbmQgc3Vic3RpdHV0aW5nICV4LyVYIGluIHBsYWNlCi0JCSAqIG9mICUjeC8lI1guCi0JCSAqCi0JCSAqIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGFwcHJvYWNoIGFzIHVzZWQgaW4KLQkJICogZm9ybWF0aW50KCkgaW4gdW5pY29kZW9iamVjdC5jCi0JCSAqLwotCQlQeU9TX3NucHJpbnRmKGZtdCwgc2l6ZW9mKGZtdCksICIlczAlYyUlLiVkbCVjIiwKLQkJCSAgICAgIHNpZ24sIHR5cGUsIHByZWMsIHR5cGUpOwotCX0KLQllbHNlIHsKLQkJUHlPU19zbnByaW50ZihmbXQsIHNpemVvZihmbXQpLCAiJXMlJSVzLiVkbCVjIiwKLQkJCSAgICAgIHNpZ24sIChmbGFncyZGX0FMVCkgPyAiIyIgOiAiIiwKLQkJCSAgICAgIHByZWMsIHR5cGUpOwotCX0KKyAgICBpZiAoKGZsYWdzICYgRl9BTFQpICYmCisgICAgICAgICh0eXBlID09ICd4JyB8fCB0eXBlID09ICdYJykpIHsKKyAgICAgICAgLyogV2hlbiBjb252ZXJ0aW5nIHVuZGVyICUjeCBvciAlI1gsIHRoZXJlIGFyZSBhIG51bWJlcgorICAgICAgICAgKiBvZiBpc3N1ZXMgdGhhdCBjYXVzZSBwYWluOgorICAgICAgICAgKiAtIHdoZW4gMCBpcyBiZWluZyBjb252ZXJ0ZWQsIHRoZSBDIHN0YW5kYXJkIGxlYXZlcyBvZmYKKyAgICAgICAgICogICB0aGUgJzB4JyBvciAnMFgnLCB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBvdGhlcgorICAgICAgICAgKiAgICUjeC8lI1ggY29udmVyc2lvbnMgYW5kIGluY29uc2lzdGVudCB3aXRoIFB5dGhvbidzCisgICAgICAgICAqICAgaGV4KCkgZnVuY3Rpb24KKyAgICAgICAgICogLSB0aGVyZSBhcmUgcGxhdGZvcm1zIHRoYXQgdmlvbGF0ZSB0aGUgc3RhbmRhcmQgYW5kCisgICAgICAgICAqICAgY29udmVydCAwIHdpdGggdGhlICcweCcgb3IgJzBYJworICAgICAgICAgKiAgIChNZXRyb3dlcmtzLCBDb21wYXEgVHJ1NjQpCisgICAgICAgICAqIC0gdGhlcmUgYXJlIHBsYXRmb3JtcyB0aGF0IGdpdmUgJzB4JyB3aGVuIGNvbnZlcnRpbmcKKyAgICAgICAgICogICB1bmRlciAlI1gsIGJ1dCBjb252ZXJ0IDAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorICAgICAgICAgKiAgIHN0YW5kYXJkIChPUy8yIEVNWCkKKyAgICAgICAgICoKKyAgICAgICAgICogV2UgY2FuIGFjaGlldmUgdGhlIGRlc2lyZWQgY29uc2lzdGVuY3kgYnkgaW5zZXJ0aW5nIG91cgorICAgICAgICAgKiBvd24gJzB4JyBvciAnMFgnIHByZWZpeCwgYW5kIHN1YnN0aXR1dGluZyAleC8lWCBpbiBwbGFjZQorICAgICAgICAgKiBvZiAlI3gvJSNYLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBhcHByb2FjaCBhcyB1c2VkIGluCisgICAgICAgICAqIGZvcm1hdGludCgpIGluIHVuaWNvZGVvYmplY3QuYworICAgICAgICAgKi8KKyAgICAgICAgUHlPU19zbnByaW50ZihmbXQsIHNpemVvZihmbXQpLCAiJXMwJWMlJS4lZGwlYyIsCisgICAgICAgICAgICAgICAgICAgICAgc2lnbiwgdHlwZSwgcHJlYywgdHlwZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeU9TX3NucHJpbnRmKGZtdCwgc2l6ZW9mKGZtdCksICIlcyUlJXMuJWRsJWMiLAorICAgICAgICAgICAgICAgICAgICAgIHNpZ24sIChmbGFncyZGX0FMVCkgPyAiIyIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVjLCB0eXBlKTsKKyAgICB9CiAKLQkvKiBidWYgPSAnKycvJy0nLycnICsgJzAnLycweCcvJycgKyAnWzAtOV0nKm1heChwcmVjLCBsZW4oeCBpbiBvY3RhbCkpCi0JICogd29yc3QgY2FzZSBidWYgPSAnLTB4JyArIFswLTldKnByZWMsIHdoZXJlIHByZWMgPj0gMTEKLQkgKi8KLQlpZiAoYnVmbGVuIDw9IDE0IHx8IGJ1ZmxlbiA8PSAoc2l6ZV90KTMgKyAoc2l6ZV90KXByZWMpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCSAgICAiZm9ybWF0dGVkIGludGVnZXIgaXMgdG9vIGxvbmcgKHByZWNpc2lvbiB0b28gbGFyZ2U/KSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChzaWduWzBdKQotCQlQeU9TX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCBmbXQsIC14KTsKLQllbHNlCi0JCVB5T1Nfc25wcmludGYoYnVmLCBidWZsZW4sIGZtdCwgeCk7Ci0JcmV0dXJuIChpbnQpc3RybGVuKGJ1Zik7CisgICAgLyogYnVmID0gJysnLyctJy8nJyArICcwJy8nMHgnLycnICsgJ1swLTldJyptYXgocHJlYywgbGVuKHggaW4gb2N0YWwpKQorICAgICAqIHdvcnN0IGNhc2UgYnVmID0gJy0weCcgKyBbMC05XSpwcmVjLCB3aGVyZSBwcmVjID49IDExCisgICAgICovCisgICAgaWYgKGJ1ZmxlbiA8PSAxNCB8fCBidWZsZW4gPD0gKHNpemVfdCkzICsgKHNpemVfdClwcmVjKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgImZvcm1hdHRlZCBpbnRlZ2VyIGlzIHRvbyBsb25nIChwcmVjaXNpb24gdG9vIGxhcmdlPykiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc2lnblswXSkKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIGJ1ZmxlbiwgZm10LCAteCk7CisgICAgZWxzZQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCBmbXQsIHgpOworICAgIHJldHVybiAoaW50KXN0cmxlbihidWYpOwogfQogCiBQeV9MT0NBTF9JTkxJTkUoaW50KQogZm9ybWF0Y2hhcihjaGFyICpidWYsIHNpemVfdCBidWZsZW4sIFB5T2JqZWN0ICp2KQogewotCS8qIHByZXN1bWUgdGhhdCB0aGUgYnVmZmVyIGlzIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBsb25nICovCi0JaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCWlmICghUHlBcmdfUGFyc2UodiwgImM7JWMgcmVxdWlyZXMgaW50IG9yIGNoYXIiLCAmYnVmWzBdKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2UodiwgImI7JWMgcmVxdWlyZXMgaW50IG9yIGNoYXIiLCAmYnVmWzBdKSkKLQkJCXJldHVybiAtMTsKLQl9Ci0JYnVmWzFdID0gJ1wwJzsKLQlyZXR1cm4gMTsKKyAgICAvKiBwcmVzdW1lIHRoYXQgdGhlIGJ1ZmZlciBpcyBhdCBsZWFzdCAyIGNoYXJhY3RlcnMgbG9uZyAqLworICAgIGlmIChQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJjOyVjIHJlcXVpcmVzIGludCBvciBjaGFyIiwgJmJ1ZlswXSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJiOyVjIHJlcXVpcmVzIGludCBvciBjaGFyIiwgJmJ1ZlswXSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGJ1ZlsxXSA9ICdcMCc7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIGZtdCUodjEsdjIsLi4uKSBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gc3ByaW50ZihmbXQsIHYxLCB2MiwgLi4uKQpAQCAtNDYyNyw2MTYgKzQ2MjcsNjE2IEBACiBQeU9iamVjdCAqCiBQeVN0cmluZ19Gb3JtYXQoUHlPYmplY3QgKmZvcm1hdCwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZm10LCAqcmVzOwotCVB5X3NzaXplX3QgYXJnbGVuLCBhcmdpZHg7Ci0JUHlfc3NpemVfdCByZXNsZW4sIHJlc2NudCwgZm10Y250OwotCWludCBhcmdzX293bmVkID0gMDsKLQlQeU9iamVjdCAqcmVzdWx0LCAqb3JpZ19hcmdzOworICAgIGNoYXIgKmZtdCwgKnJlczsKKyAgICBQeV9zc2l6ZV90IGFyZ2xlbiwgYXJnaWR4OworICAgIFB5X3NzaXplX3QgcmVzbGVuLCByZXNjbnQsIGZtdGNudDsKKyAgICBpbnQgYXJnc19vd25lZCA9IDA7CisgICAgUHlPYmplY3QgKnJlc3VsdCwgKm9yaWdfYXJnczsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JUHlPYmplY3QgKnYsICp3OworICAgIFB5T2JqZWN0ICp2LCAqdzsKICNlbmRpZgotCVB5T2JqZWN0ICpkaWN0ID0gTlVMTDsKLQlpZiAoZm9ybWF0ID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKGZvcm1hdCkgfHwgYXJncyA9PSBOVUxMKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb3JpZ19hcmdzID0gYXJnczsKLQlmbXQgPSBQeVN0cmluZ19BU19TVFJJTkcoZm9ybWF0KTsKLQlmbXRjbnQgPSBQeVN0cmluZ19HRVRfU0laRShmb3JtYXQpOwotCXJlc2xlbiA9IHJlc2NudCA9IGZtdGNudCArIDEwMDsKLQlyZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIHJlc2xlbik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpOwotCWlmIChQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCWFyZ2xlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JCWFyZ2lkeCA9IDA7Ci0JfQotCWVsc2UgewotCQlhcmdsZW4gPSAtMTsKLQkJYXJnaWR4ID0gLTI7Ci0JfQotCWlmIChQeV9UWVBFKGFyZ3MpLT50cF9hc19tYXBwaW5nICYmICFQeVR1cGxlX0NoZWNrKGFyZ3MpICYmCi0JICAgICFQeU9iamVjdF9UeXBlQ2hlY2soYXJncywgJlB5QmFzZVN0cmluZ19UeXBlKSkKLQkJZGljdCA9IGFyZ3M7Ci0Jd2hpbGUgKC0tZm10Y250ID49IDApIHsKLQkJaWYgKCpmbXQgIT0gJyUnKSB7Ci0JCQlpZiAoLS1yZXNjbnQgPCAwKSB7Ci0JCQkJcmVzY250ID0gZm10Y250ICsgMTAwOwotCQkJCXJlc2xlbiArPSByZXNjbnQ7Ci0JCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSA8IDApCi0JCQkJCXJldHVybiBOVUxMOwotCQkJCXJlcyA9IFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpCi0JCQkJCSsgcmVzbGVuIC0gcmVzY250OwotCQkJCS0tcmVzY250OwotCQkJfQotCQkJKnJlcysrID0gKmZtdCsrOwotCQl9Ci0JCWVsc2UgewotCQkJLyogR290IGEgZm9ybWF0IHNwZWNpZmllciAqLwotCQkJaW50IGZsYWdzID0gMDsKLQkJCVB5X3NzaXplX3Qgd2lkdGggPSAtMTsKLQkJCWludCBwcmVjID0gLTE7Ci0JCQlpbnQgYyA9ICdcMCc7Ci0JCQlpbnQgZmlsbDsKLQkJCWludCBpc251bW9rOwotCQkJUHlPYmplY3QgKnYgPSBOVUxMOwotCQkJUHlPYmplY3QgKnRlbXAgPSBOVUxMOwotCQkJY2hhciAqcGJ1ZjsKLQkJCWludCBzaWduOwotCQkJUHlfc3NpemVfdCBsZW47Ci0JCQljaGFyIGZvcm1hdGJ1ZltGT1JNQVRCVUZMRU5dOwotCQkJICAgICAvKiBGb3IgZm9ybWF0e2Zsb2F0LGludCxjaGFyfSgpICovCisgICAgUHlPYmplY3QgKmRpY3QgPSBOVUxMOworICAgIGlmIChmb3JtYXQgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2soZm9ybWF0KSB8fCBhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvcmlnX2FyZ3MgPSBhcmdzOworICAgIGZtdCA9IFB5U3RyaW5nX0FTX1NUUklORyhmb3JtYXQpOworICAgIGZtdGNudCA9IFB5U3RyaW5nX0dFVF9TSVpFKGZvcm1hdCk7CisgICAgcmVzbGVuID0gcmVzY250ID0gZm10Y250ICsgMTAwOworICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgcmVzbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlc3VsdCk7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgYXJnbGVuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKKyAgICAgICAgYXJnaWR4ID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFyZ2xlbiA9IC0xOworICAgICAgICBhcmdpZHggPSAtMjsKKyAgICB9CisgICAgaWYgKFB5X1RZUEUoYXJncyktPnRwX2FzX21hcHBpbmcgJiYgIVB5VHVwbGVfQ2hlY2soYXJncykgJiYKKyAgICAgICAgIVB5T2JqZWN0X1R5cGVDaGVjayhhcmdzLCAmUHlCYXNlU3RyaW5nX1R5cGUpKQorICAgICAgICBkaWN0ID0gYXJnczsKKyAgICB3aGlsZSAoLS1mbXRjbnQgPj0gMCkgeworICAgICAgICBpZiAoKmZtdCAhPSAnJScpIHsKKyAgICAgICAgICAgIGlmICgtLXJlc2NudCA8IDApIHsKKyAgICAgICAgICAgICAgICByZXNjbnQgPSBmbXRjbnQgKyAxMDA7CisgICAgICAgICAgICAgICAgcmVzbGVuICs9IHJlc2NudDsKKyAgICAgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4pIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgcmVzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgKyByZXNsZW4gLSByZXNjbnQ7CisgICAgICAgICAgICAgICAgLS1yZXNjbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcmVzKysgPSAqZm10Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBHb3QgYSBmb3JtYXQgc3BlY2lmaWVyICovCisgICAgICAgICAgICBpbnQgZmxhZ3MgPSAwOworICAgICAgICAgICAgUHlfc3NpemVfdCB3aWR0aCA9IC0xOworICAgICAgICAgICAgaW50IHByZWMgPSAtMTsKKyAgICAgICAgICAgIGludCBjID0gJ1wwJzsKKyAgICAgICAgICAgIGludCBmaWxsOworICAgICAgICAgICAgaW50IGlzbnVtb2s7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqdGVtcCA9IE5VTEw7CisgICAgICAgICAgICBjaGFyICpwYnVmOworICAgICAgICAgICAgaW50IHNpZ247CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICAgICAgICAgIGNoYXIgZm9ybWF0YnVmW0ZPUk1BVEJVRkxFTl07CisgICAgICAgICAgICAgICAgIC8qIEZvciBmb3JtYXR7ZmxvYXQsaW50LGNoYXJ9KCkgKi8KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQljaGFyICpmbXRfc3RhcnQgPSBmbXQ7Ci0JCQlQeV9zc2l6ZV90IGFyZ2lkeF9zdGFydCA9IGFyZ2lkeDsKKyAgICAgICAgICAgIGNoYXIgKmZtdF9zdGFydCA9IGZtdDsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgYXJnaWR4X3N0YXJ0ID0gYXJnaWR4OwogI2VuZGlmCiAKLQkJCWZtdCsrOwotCQkJaWYgKCpmbXQgPT0gJygnKSB7Ci0JCQkJY2hhciAqa2V5c3RhcnQ7Ci0JCQkJUHlfc3NpemVfdCBrZXlsZW47Ci0JCQkJUHlPYmplY3QgKmtleTsKLQkJCQlpbnQgcGNvdW50ID0gMTsKKyAgICAgICAgICAgIGZtdCsrOworICAgICAgICAgICAgaWYgKCpmbXQgPT0gJygnKSB7CisgICAgICAgICAgICAgICAgY2hhciAqa2V5c3RhcnQ7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBrZXlsZW47CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleTsKKyAgICAgICAgICAgICAgICBpbnQgcGNvdW50ID0gMTsKIAotCQkJCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSAiZm9ybWF0IHJlcXVpcmVzIGEgbWFwcGluZyIpOwotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJCQkrK2ZtdDsKLQkJCQktLWZtdGNudDsKLQkJCQlrZXlzdGFydCA9IGZtdDsKLQkJCQkvKiBTa2lwIG92ZXIgYmFsYW5jZWQgcGFyZW50aGVzZXMgKi8KLQkJCQl3aGlsZSAocGNvdW50ID4gMCAmJiAtLWZtdGNudCA+PSAwKSB7Ci0JCQkJCWlmICgqZm10ID09ICcpJykKLQkJCQkJCS0tcGNvdW50OwotCQkJCQllbHNlIGlmICgqZm10ID09ICcoJykKLQkJCQkJCSsrcGNvdW50OwotCQkJCQlmbXQrKzsKLQkJCQl9Ci0JCQkJa2V5bGVuID0gZm10IC0ga2V5c3RhcnQgLSAxOwotCQkJCWlmIChmbXRjbnQgPCAwIHx8IHBjb3VudCA+IDApIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkgICAiaW5jb21wbGV0ZSBmb3JtYXQga2V5Iik7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCWtleSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGtleXN0YXJ0LAotCQkJCQkJCQkga2V5bGVuKTsKLQkJCQlpZiAoa2V5ID09IE5VTEwpCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJaWYgKGFyZ3Nfb3duZWQpIHsKLQkJCQkJUHlfREVDUkVGKGFyZ3MpOwotCQkJCQlhcmdzX293bmVkID0gMDsKLQkJCQl9Ci0JCQkJYXJncyA9IFB5T2JqZWN0X0dldEl0ZW0oZGljdCwga2V5KTsKLQkJCQlQeV9ERUNSRUYoa2V5KTsKLQkJCQlpZiAoYXJncyA9PSBOVUxMKSB7Ci0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJfQotCQkJCWFyZ3Nfb3duZWQgPSAxOwotCQkJCWFyZ2xlbiA9IC0xOwotCQkJCWFyZ2lkeCA9IC0yOwotCQkJfQotCQkJd2hpbGUgKC0tZm10Y250ID49IDApIHsKLQkJCQlzd2l0Y2ggKGMgPSAqZm10KyspIHsKLQkJCQljYXNlICctJzogZmxhZ3MgfD0gRl9MSlVTVDsgY29udGludWU7Ci0JCQkJY2FzZSAnKyc6IGZsYWdzIHw9IEZfU0lHTjsgY29udGludWU7Ci0JCQkJY2FzZSAnICc6IGZsYWdzIHw9IEZfQkxBTks7IGNvbnRpbnVlOwotCQkJCWNhc2UgJyMnOiBmbGFncyB8PSBGX0FMVDsgY29udGludWU7Ci0JCQkJY2FzZSAnMCc6IGZsYWdzIHw9IEZfWkVSTzsgY29udGludWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGMgPT0gJyonKSB7Ci0JCQkJdiA9IGdldG5leHRhcmcoYXJncywgYXJnbGVuLCAmYXJnaWR4KTsKLQkJCQlpZiAodiA9PSBOVUxMKQotCQkJCQlnb3RvIGVycm9yOwotCQkJCWlmICghUHlJbnRfQ2hlY2sodikpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCQkiKiB3YW50cyBpbnQiKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJd2lkdGggPSBQeUludF9Bc0xvbmcodik7Ci0JCQkJaWYgKHdpZHRoIDwgMCkgewotCQkJCQlmbGFncyB8PSBGX0xKVVNUOwotCQkJCQl3aWR0aCA9IC13aWR0aDsKLQkJCQl9Ci0JCQkJaWYgKC0tZm10Y250ID49IDApCi0JCQkJCWMgPSAqZm10Kys7Ci0JCQl9Ci0JCQllbHNlIGlmIChjID49IDAgJiYgaXNkaWdpdChjKSkgewotCQkJCXdpZHRoID0gYyAtICcwJzsKLQkJCQl3aGlsZSAoLS1mbXRjbnQgPj0gMCkgewotCQkJCQljID0gUHlfQ0hBUk1BU0soKmZtdCsrKTsKLQkJCQkJaWYgKCFpc2RpZ2l0KGMpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmICgod2lkdGgqMTApIC8gMTAgIT0gd2lkdGgpIHsKLQkJCQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQkJCQlQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJCSJ3aWR0aCB0b28gYmlnIik7Ci0JCQkJCQlnb3RvIGVycm9yOwotCQkJCQl9Ci0JCQkJCXdpZHRoID0gd2lkdGgqMTAgKyAoYyAtICcwJyk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGMgPT0gJy4nKSB7Ci0JCQkJcHJlYyA9IDA7Ci0JCQkJaWYgKC0tZm10Y250ID49IDApCi0JCQkJCWMgPSAqZm10Kys7Ci0JCQkJaWYgKGMgPT0gJyonKSB7Ci0JCQkJCXYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7Ci0JCQkJCWlmICh2ID09IE5VTEwpCi0JCQkJCQlnb3RvIGVycm9yOwotCQkJCQlpZiAoIVB5SW50X0NoZWNrKHYpKSB7Ci0JCQkJCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCQkJCSIqIHdhbnRzIGludCIpOwotCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJfQotCQkJCQlwcmVjID0gUHlJbnRfQXNMb25nKHYpOwotCQkJCQlpZiAocHJlYyA8IDApCi0JCQkJCQlwcmVjID0gMDsKLQkJCQkJaWYgKC0tZm10Y250ID49IDApCi0JCQkJCQljID0gKmZtdCsrOwotCQkJCX0KLQkJCQllbHNlIGlmIChjID49IDAgJiYgaXNkaWdpdChjKSkgewotCQkJCQlwcmVjID0gYyAtICcwJzsKLQkJCQkJd2hpbGUgKC0tZm10Y250ID49IDApIHsKLQkJCQkJCWMgPSBQeV9DSEFSTUFTSygqZm10KyspOwotCQkJCQkJaWYgKCFpc2RpZ2l0KGMpKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJaWYgKChwcmVjKjEwKSAvIDEwICE9IHByZWMpIHsKLQkJCQkJCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJCQkJICAgIFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkJICAgICJwcmVjIHRvbyBiaWciKTsKLQkJCQkJCQlnb3RvIGVycm9yOwotCQkJCQkJfQotCQkJCQkJcHJlYyA9IHByZWMqMTAgKyAoYyAtICcwJyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IC8qIHByZWMgKi8KLQkJCWlmIChmbXRjbnQgPj0gMCkgewotCQkJCWlmIChjID09ICdoJyB8fCBjID09ICdsJyB8fCBjID09ICdMJykgewotCQkJCQlpZiAoLS1mbXRjbnQgPj0gMCkKLQkJCQkJCWMgPSAqZm10Kys7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZtdGNudCA8IDApIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJpbmNvbXBsZXRlIGZvcm1hdCIpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAoYyAhPSAnJScpIHsKLQkJCQl2ID0gZ2V0bmV4dGFyZyhhcmdzLCBhcmdsZW4sICZhcmdpZHgpOwotCQkJCWlmICh2ID09IE5VTEwpCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlzaWduID0gMDsKLQkJCWZpbGwgPSAnICc7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJyUnOgotCQkJCXBidWYgPSAiJSI7Ci0JCQkJbGVuID0gMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3MnOgotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCQlpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JCQkJCWZtdCA9IGZtdF9zdGFydDsKLQkJCQkJYXJnaWR4ID0gYXJnaWR4X3N0YXJ0OwotCQkJCQlnb3RvIHVuaWNvZGU7Ci0JCQkJfQotI2VuZGlmCi0JCQkJdGVtcCA9IF9QeU9iamVjdF9TdHIodik7Ci0jaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQkJCWlmICh0ZW1wICE9IE5VTEwgJiYgUHlVbmljb2RlX0NoZWNrKHRlbXApKSB7Ci0JCQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJCQkJZm10ID0gZm10X3N0YXJ0OwotCQkJCQlhcmdpZHggPSBhcmdpZHhfc3RhcnQ7Ci0JCQkJCWdvdG8gdW5pY29kZTsKLQkJCQl9Ci0jZW5kaWYKLQkJCQkvKiBGYWxsIHRocm91Z2ggKi8KLQkJCWNhc2UgJ3InOgotCQkJCWlmIChjID09ICdyJykKLQkJCQkJdGVtcCA9IFB5T2JqZWN0X1JlcHIodik7Ci0JCQkJaWYgKHRlbXAgPT0gTlVMTCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHRlbXApKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSAgIiVzIGFyZ3VtZW50IGhhcyBub24tc3RyaW5nIHN0cigpIik7Ci0JCQkJCVB5X0RFQ1JFRih0ZW1wKTsKLQkJCQkJZ290byBlcnJvcjsKLQkJCQl9Ci0JCQkJcGJ1ZiA9IFB5U3RyaW5nX0FTX1NUUklORyh0ZW1wKTsKLQkJCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh0ZW1wKTsKLQkJCQlpZiAocHJlYyA+PSAwICYmIGxlbiA+IHByZWMpCi0JCQkJCWxlbiA9IHByZWM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdpJzoKLQkJCWNhc2UgJ2QnOgotCQkJY2FzZSAndSc6Ci0JCQljYXNlICdvJzoKLQkJCWNhc2UgJ3gnOgotCQkJY2FzZSAnWCc6Ci0JCQkJaWYgKGMgPT0gJ2knKQotCQkJCQljID0gJ2QnOwotCQkJCWlzbnVtb2sgPSAwOwotCQkJCWlmIChQeU51bWJlcl9DaGVjayh2KSkgewotCQkJCQlQeU9iamVjdCAqaW9iaj1OVUxMOwotCi0JCQkJCWlmIChQeUludF9DaGVjayh2KSB8fCAoUHlMb25nX0NoZWNrKHYpKSkgewotCQkJCQkJaW9iaiA9IHY7Ci0JCQkJCQlQeV9JTkNSRUYoaW9iaik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpb2JqID0gUHlOdW1iZXJfSW50KHYpOwotCQkJCQkJaWYgKGlvYmo9PU5VTEwpIGlvYmogPSBQeU51bWJlcl9Mb25nKHYpOwotCQkJCQl9Ci0JCQkJCWlmIChpb2JqIT1OVUxMKSB7Ci0JCQkJCQlpZiAoUHlJbnRfQ2hlY2soaW9iaikpIHsKLQkJCQkJCQlpc251bW9rID0gMTsKLQkJCQkJCQlwYnVmID0gZm9ybWF0YnVmOwotCQkJCQkJCWxlbiA9IGZvcm1hdGludChwYnVmLAotCQkJCQkJCQkJc2l6ZW9mKGZvcm1hdGJ1ZiksCi0JCQkJCQkJCQlmbGFncywgcHJlYywgYywgaW9iaik7Ci0JCQkJCQkJUHlfREVDUkVGKGlvYmopOwotCQkJCQkJCWlmIChsZW4gPCAwKQotCQkJCQkJCQlnb3RvIGVycm9yOwotCQkJCQkJCXNpZ24gPSAxOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoUHlMb25nX0NoZWNrKGlvYmopKSB7Ci0JCQkJCQkJaW50IGlsZW47Ci0JCQkJCQkJCi0JCQkJCQkJaXNudW1vayA9IDE7Ci0JCQkJCQkJdGVtcCA9IF9QeVN0cmluZ19Gb3JtYXRMb25nKGlvYmosIGZsYWdzLAotCQkJCQkJCQlwcmVjLCBjLCAmcGJ1ZiwgJmlsZW4pOwotCQkJCQkJCVB5X0RFQ1JFRihpb2JqKTsKLQkJCQkJCQlsZW4gPSBpbGVuOwotCQkJCQkJCWlmICghdGVtcCkKLQkJCQkJCQkJZ290byBlcnJvcjsKLQkJCQkJCQlzaWduID0gMTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCVB5X0RFQ1JFRihpb2JqKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWlzbnVtb2spIHsKLQkJCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJCSAgICAiJSUlYyBmb3JtYXQ6IGEgbnVtYmVyIGlzIHJlcXVpcmVkLCAiCi0JCQkJCSAgICAibm90ICUuMjAwcyIsIGMsIFB5X1RZUEUodiktPnRwX25hbWUpOwotCQkJCQlnb3RvIGVycm9yOwotCQkJCX0KLQkJCQlpZiAoZmxhZ3MgJiBGX1pFUk8pCi0JCQkJCWZpbGwgPSAnMCc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdlJzoKLQkJCWNhc2UgJ0UnOgotCQkJY2FzZSAnZic6Ci0JCQljYXNlICdGJzoKLQkJCWNhc2UgJ2cnOgotCQkJY2FzZSAnRyc6Ci0JCQkJaWYgKGMgPT0gJ0YnKQotCQkJCQljID0gJ2YnOwotCQkJCXBidWYgPSBmb3JtYXRidWY7Ci0JCQkJbGVuID0gZm9ybWF0ZmxvYXQocGJ1Ziwgc2l6ZW9mKGZvcm1hdGJ1ZiksCi0JCQkJCQkgIGZsYWdzLCBwcmVjLCBjLCB2KTsKLQkJCQlpZiAobGVuIDwgMCkKLQkJCQkJZ290byBlcnJvcjsKLQkJCQlzaWduID0gMTsKLQkJCQlpZiAoZmxhZ3MgJiBGX1pFUk8pCi0JCQkJCWZpbGwgPSAnMCc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdjJzoKLSNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQkJaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQkJCQlmbXQgPSBmbXRfc3RhcnQ7Ci0JCQkJCWFyZ2lkeCA9IGFyZ2lkeF9zdGFydDsKLQkJCQkJZ290byB1bmljb2RlOwotCQkJCX0KLSNlbmRpZgotCQkJCXBidWYgPSBmb3JtYXRidWY7Ci0JCQkJbGVuID0gZm9ybWF0Y2hhcihwYnVmLCBzaXplb2YoZm9ybWF0YnVmKSwgdik7Ci0JCQkJaWYgKGxlbiA8IDApCi0JCQkJCWdvdG8gZXJyb3I7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJyVjJyAoMHgleCkgIgotCQkJCSAgImF0IGluZGV4ICV6ZCIsCi0JCQkJICBjLCBjLAotCQkJCSAgKFB5X3NzaXplX3QpKGZtdCAtIDEgLQotCQkJCQkgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoZm9ybWF0KSkpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAoc2lnbikgewotCQkJCWlmICgqcGJ1ZiA9PSAnLScgfHwgKnBidWYgPT0gJysnKSB7Ci0JCQkJCXNpZ24gPSAqcGJ1ZisrOwotCQkJCQlsZW4tLTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZmxhZ3MgJiBGX1NJR04pCi0JCQkJCXNpZ24gPSAnKyc7Ci0JCQkJZWxzZSBpZiAoZmxhZ3MgJiBGX0JMQU5LKQotCQkJCQlzaWduID0gJyAnOwotCQkJCWVsc2UKLQkJCQkJc2lnbiA9IDA7Ci0JCQl9Ci0JCQlpZiAod2lkdGggPCBsZW4pCi0JCQkJd2lkdGggPSBsZW47Ci0JCQlpZiAocmVzY250IC0gKHNpZ24gIT0gMCkgPCB3aWR0aCkgewotCQkJCXJlc2xlbiAtPSByZXNjbnQ7Ci0JCQkJcmVzY250ID0gd2lkdGggKyBmbXRjbnQgKyAxMDA7Ci0JCQkJcmVzbGVuICs9IHJlc2NudDsKLQkJCQlpZiAocmVzbGVuIDwgMCkgewotCQkJCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCQkJUHlfWERFQ1JFRih0ZW1wKTsKLQkJCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJfQotCQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIHJlc2xlbikgPCAwKSB7Ci0JCQkJCVB5X1hERUNSRUYodGVtcCk7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCQlyZXMgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KQotCQkJCQkrIHJlc2xlbiAtIHJlc2NudDsKLQkJCX0KLQkJCWlmIChzaWduKSB7Ci0JCQkJaWYgKGZpbGwgIT0gJyAnKQotCQkJCQkqcmVzKysgPSBzaWduOwotCQkJCXJlc2NudC0tOwotCQkJCWlmICh3aWR0aCA+IGxlbikKLQkJCQkJd2lkdGgtLTsKLQkJCX0KLQkJCWlmICgoZmxhZ3MgJiBGX0FMVCkgJiYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKSkgewotCQkJCWFzc2VydChwYnVmWzBdID09ICcwJyk7Ci0JCQkJYXNzZXJ0KHBidWZbMV0gPT0gYyk7Ci0JCQkJaWYgKGZpbGwgIT0gJyAnKSB7Ci0JCQkJCSpyZXMrKyA9ICpwYnVmKys7Ci0JCQkJCSpyZXMrKyA9ICpwYnVmKys7Ci0JCQkJfQotCQkJCXJlc2NudCAtPSAyOwotCQkJCXdpZHRoIC09IDI7Ci0JCQkJaWYgKHdpZHRoIDwgMCkKLQkJCQkJd2lkdGggPSAwOwotCQkJCWxlbiAtPSAyOwotCQkJfQotCQkJaWYgKHdpZHRoID4gbGVuICYmICEoZmxhZ3MgJiBGX0xKVVNUKSkgewotCQkJCWRvIHsKLQkJCQkJLS1yZXNjbnQ7Ci0JCQkJCSpyZXMrKyA9IGZpbGw7Ci0JCQkJfSB3aGlsZSAoLS13aWR0aCA+IGxlbik7Ci0JCQl9Ci0JCQlpZiAoZmlsbCA9PSAnICcpIHsKLQkJCQlpZiAoc2lnbikKLQkJCQkJKnJlcysrID0gc2lnbjsKLQkJCQlpZiAoKGZsYWdzICYgRl9BTFQpICYmCi0JCQkJICAgIChjID09ICd4JyB8fCBjID09ICdYJykpIHsKLQkJCQkJYXNzZXJ0KHBidWZbMF0gPT0gJzAnKTsKLQkJCQkJYXNzZXJ0KHBidWZbMV0gPT0gYyk7Ci0JCQkJCSpyZXMrKyA9ICpwYnVmKys7Ci0JCQkJCSpyZXMrKyA9ICpwYnVmKys7Ci0JCQkJfQotCQkJfQotCQkJUHlfTUVNQ1BZKHJlcywgcGJ1ZiwgbGVuKTsKLQkJCXJlcyArPSBsZW47Ci0JCQlyZXNjbnQgLT0gbGVuOwotCQkJd2hpbGUgKC0td2lkdGggPj0gbGVuKSB7Ci0JCQkJLS1yZXNjbnQ7Ci0JCQkJKnJlcysrID0gJyAnOwotCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpY3QgJiYgKGFyZ2lkeCA8IGFyZ2xlbikgJiYgYyAhPSAnJScpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBzdHJpbmcgZm9ybWF0dGluZyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCByZXF1aXJlcyBhIG1hcHBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytmbXQ7CisgICAgICAgICAgICAgICAgLS1mbXRjbnQ7CisgICAgICAgICAgICAgICAga2V5c3RhcnQgPSBmbXQ7CisgICAgICAgICAgICAgICAgLyogU2tpcCBvdmVyIGJhbGFuY2VkIHBhcmVudGhlc2VzICovCisgICAgICAgICAgICAgICAgd2hpbGUgKHBjb3VudCA+IDAgJiYgLS1mbXRjbnQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKmZtdCA9PSAnKScpCisgICAgICAgICAgICAgICAgICAgICAgICAtLXBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKmZtdCA9PSAnKCcpCisgICAgICAgICAgICAgICAgICAgICAgICArK3Bjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgZm10Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGtleWxlbiA9IGZtdCAtIGtleXN0YXJ0IC0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZm10Y250IDwgMCB8fCBwY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvbXBsZXRlIGZvcm1hdCBrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga2V5ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoa2V5c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3Nfb3duZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgICAgICAgICBhcmdzX293bmVkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXJncyA9IFB5T2JqZWN0X0dldEl0ZW0oZGljdCwga2V5KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFyZ3Nfb3duZWQgPSAxOworICAgICAgICAgICAgICAgIGFyZ2xlbiA9IC0xOworICAgICAgICAgICAgICAgIGFyZ2lkeCA9IC0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPSAqZm10KyspIHsKKyAgICAgICAgICAgICAgICBjYXNlICctJzogZmxhZ3MgfD0gRl9MSlVTVDsgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnKyc6IGZsYWdzIHw9IEZfU0lHTjsgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnICc6IGZsYWdzIHw9IEZfQkxBTks7IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNhc2UgJyMnOiBmbGFncyB8PSBGX0FMVDsgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnMCc6IGZsYWdzIHw9IEZfWkVSTzsgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgPT0gJyonKSB7CisgICAgICAgICAgICAgICAgdiA9IGdldG5leHRhcmcoYXJncywgYXJnbGVuLCAmYXJnaWR4KTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIHdhbnRzIGludCIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aWR0aCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZfTEpVU1Q7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLXdpZHRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoLS1mbXRjbnQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgYyA9ICpmbXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMCAmJiBpc2RpZ2l0KGMpKSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBjIC0gJzAnOworICAgICAgICAgICAgICAgIHdoaWxlICgtLWZtdGNudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBQeV9DSEFSTUFTSygqZm10KyspOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzZGlnaXQoYykpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh3aWR0aCoxMCkgLyAxMCAhPSB3aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoIHRvbyBiaWciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSB3aWR0aCoxMCArIChjIC0gJzAnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYyA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBwcmVjID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoLS1mbXRjbnQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgYyA9ICpmbXQrKzsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGdldG5leHRhcmcoYXJncywgYXJnbGVuLCAmYXJnaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIGlmICghUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiogd2FudHMgaW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByZWMgPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVjIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWMgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoLS1mbXRjbnQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAqZm10Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gMCAmJiBpc2RpZ2l0KGMpKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWMgPSBjIC0gJzAnOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1mbXRjbnQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCpmbXQrKyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzZGlnaXQoYykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByZWMqMTApIC8gMTAgIT0gcHJlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWMgdG9vIGJpZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCQlQeV9YREVDUkVGKHRlbXApOwotCQl9IC8qICclJyAqLwotCX0gLyogdW50aWwgZW5kICovCi0JaWYgKGFyZ2lkeCA8IGFyZ2xlbiAmJiAhZGljdCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWlmIChhcmdzX293bmVkKSB7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQl9Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4gLSByZXNjbnQpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVjID0gcHJlYyoxMCArIChjIC0gJzAnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogcHJlYyAqLworICAgICAgICAgICAgaWYgKGZtdGNudCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ2gnIHx8IGMgPT0gJ2wnIHx8IGMgPT0gJ0wnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgtLWZtdGNudCA+PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICpmbXQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm10Y250IDwgMCkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb21wbGV0ZSBmb3JtYXQiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMgIT0gJyUnKSB7CisgICAgICAgICAgICAgICAgdiA9IGdldG5leHRhcmcoYXJncywgYXJnbGVuLCAmYXJnaWR4KTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2lnbiA9IDA7CisgICAgICAgICAgICBmaWxsID0gJyAnOworICAgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgICAgICBwYnVmID0gIiUiOworICAgICAgICAgICAgICAgIGxlbiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgeworICAgICAgICAgICAgICAgICAgICBmbXQgPSBmbXRfc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGFyZ2lkeCA9IGFyZ2lkeF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgZ290byB1bmljb2RlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHRlbXAgPSBfUHlPYmplY3RfU3RyKHYpOworI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKKyAgICAgICAgICAgICAgICBpZiAodGVtcCAhPSBOVUxMICYmIFB5VW5pY29kZV9DaGVjayh0ZW1wKSkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGZtdCA9IGZtdF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgYXJnaWR4ID0gYXJnaWR4X3N0YXJ0OworICAgICAgICAgICAgICAgICAgICBnb3RvIHVuaWNvZGU7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoICovCisgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAncicpCisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBQeU9iamVjdF9SZXByKHYpOworICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh0ZW1wKSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICIlcyBhcmd1bWVudCBoYXMgbm9uLXN0cmluZyBzdHIoKSIpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBidWYgPSBQeVN0cmluZ19BU19TVFJJTkcodGVtcCk7CisgICAgICAgICAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodGVtcCk7CisgICAgICAgICAgICAgICAgaWYgKHByZWMgPj0gMCAmJiBsZW4gPiBwcmVjKQorICAgICAgICAgICAgICAgICAgICBsZW4gPSBwcmVjOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICAgICAgICAgIGlmIChjID09ICdpJykKKyAgICAgICAgICAgICAgICAgICAgYyA9ICdkJzsKKyAgICAgICAgICAgICAgICBpc251bW9rID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoUHlOdW1iZXJfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmlvYmo9TlVMTDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikgfHwgKFB5TG9uZ19DaGVjayh2KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlvYmogPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGlvYmopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW9iaiA9IFB5TnVtYmVyX0ludCh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpb2JqPT1OVUxMKSBpb2JqID0gUHlOdW1iZXJfTG9uZyh2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaW9iaiE9TlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKGlvYmopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNudW1vayA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGJ1ZiA9IGZvcm1hdGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBmb3JtYXRpbnQocGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZvcm1hdGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBwcmVjLCBjLCBpb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soaW9iaikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWxlbjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzbnVtb2sgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBfUHlTdHJpbmdfRm9ybWF0TG9uZyhpb2JqLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYywgYywgJnBidWYsICZpbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gaWxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRlbXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFpc251bW9rKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiJSUlYyBmb3JtYXQ6IGEgbnVtYmVyIGlzIHJlcXVpcmVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAibm90ICUuMjAwcyIsIGMsIFB5X1RZUEUodiktPnRwX25hbWUpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGX1pFUk8pCisgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAnMCc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgIGNhc2UgJ0UnOgorICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICAgICAgY2FzZSAnRyc6CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ0YnKQorICAgICAgICAgICAgICAgICAgICBjID0gJ2YnOworICAgICAgICAgICAgICAgIHBidWYgPSBmb3JtYXRidWY7CisgICAgICAgICAgICAgICAgbGVuID0gZm9ybWF0ZmxvYXQocGJ1Ziwgc2l6ZW9mKGZvcm1hdGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHByZWMsIGMsIHYpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIHNpZ24gPSAxOworICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZfWkVSTykKKyAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICcwJzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2MnOgorI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKKyAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgICAgIGZtdCA9IGZtdF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgYXJnaWR4ID0gYXJnaWR4X3N0YXJ0OworICAgICAgICAgICAgICAgICAgICBnb3RvIHVuaWNvZGU7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgcGJ1ZiA9IGZvcm1hdGJ1ZjsKKyAgICAgICAgICAgICAgICBsZW4gPSBmb3JtYXRjaGFyKHBidWYsIHNpemVvZihmb3JtYXRidWYpLCB2KTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgZm9ybWF0IGNoYXJhY3RlciAnJWMnICgweCV4KSAiCisgICAgICAgICAgICAgICAgICAiYXQgaW5kZXggJXpkIiwKKyAgICAgICAgICAgICAgICAgIGMsIGMsCisgICAgICAgICAgICAgICAgICAoUHlfc3NpemVfdCkoZm10IC0gMSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoZm9ybWF0KSkpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2lnbikgeworICAgICAgICAgICAgICAgIGlmICgqcGJ1ZiA9PSAnLScgfHwgKnBidWYgPT0gJysnKSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAqcGJ1ZisrOworICAgICAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBGX1NJR04pCisgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAnKyc7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBGX0JMQU5LKQorICAgICAgICAgICAgICAgICAgICBzaWduID0gJyAnOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAod2lkdGggPCBsZW4pCisgICAgICAgICAgICAgICAgd2lkdGggPSBsZW47CisgICAgICAgICAgICBpZiAocmVzY250IC0gKHNpZ24gIT0gMCkgPCB3aWR0aCkgeworICAgICAgICAgICAgICAgIHJlc2xlbiAtPSByZXNjbnQ7CisgICAgICAgICAgICAgICAgcmVzY250ID0gd2lkdGggKyBmbXRjbnQgKyAxMDA7CisgICAgICAgICAgICAgICAgcmVzbGVuICs9IHJlc2NudDsKKyAgICAgICAgICAgICAgICBpZiAocmVzbGVuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIHJlc2xlbikgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXMgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICArIHJlc2xlbiAtIHJlc2NudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaWduKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGwgIT0gJyAnKQorICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSBzaWduOworICAgICAgICAgICAgICAgIHJlc2NudC0tOworICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IGxlbikKKyAgICAgICAgICAgICAgICAgICAgd2lkdGgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBGX0FMVCkgJiYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKSkgeworICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzBdID09ICcwJyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KHBidWZbMV0gPT0gYyk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGwgIT0gJyAnKSB7CisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9ICpwYnVmKys7CisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9ICpwYnVmKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc2NudCAtPSAyOworICAgICAgICAgICAgICAgIHdpZHRoIC09IDI7CisgICAgICAgICAgICAgICAgaWYgKHdpZHRoIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAwOworICAgICAgICAgICAgICAgIGxlbiAtPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdpZHRoID4gbGVuICYmICEoZmxhZ3MgJiBGX0xKVVNUKSkgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgLS1yZXNjbnQ7CisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IGZpbGw7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS13aWR0aCA+IGxlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsbCA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbikKKyAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gc2lnbjsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgRl9BTFQpICYmCisgICAgICAgICAgICAgICAgICAgIChjID09ICd4JyB8fCBjID09ICdYJykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHBidWZbMF0gPT0gJzAnKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHBidWZbMV0gPT0gYyk7CisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9ICpwYnVmKys7CisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9ICpwYnVmKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfTUVNQ1BZKHJlcywgcGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIHJlcyArPSBsZW47CisgICAgICAgICAgICByZXNjbnQgLT0gbGVuOworICAgICAgICAgICAgd2hpbGUgKC0td2lkdGggPj0gbGVuKSB7CisgICAgICAgICAgICAgICAgLS1yZXNjbnQ7CisgICAgICAgICAgICAgICAgKnJlcysrID0gJyAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRpY3QgJiYgKGFyZ2lkeCA8IGFyZ2xlbikgJiYgYyAhPSAnJScpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgc3RyaW5nIGZvcm1hdHRpbmciKTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOworICAgICAgICB9IC8qICclJyAqLworICAgIH0gLyogdW50aWwgZW5kICovCisgICAgaWYgKGFyZ2lkeCA8IGFyZ2xlbiAmJiAhZGljdCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgc3RyaW5nIGZvcm1hdHRpbmciKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKGFyZ3Nfb3duZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIHJlc2xlbiAtIHJlc2NudCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKICB1bmljb2RlOgotCWlmIChhcmdzX293bmVkKSB7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQkJYXJnc19vd25lZCA9IDA7Ci0JfQotCS8qIEZpZGRsZSBhcmdzIHJpZ2h0IChyZW1vdmUgdGhlIGZpcnN0IGFyZ2lkeCBhcmd1bWVudHMpICovCi0JaWYgKFB5VHVwbGVfQ2hlY2sob3JpZ19hcmdzKSAmJiBhcmdpZHggPiAwKSB7Ci0JCVB5T2JqZWN0ICp2OwotCQlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKG9yaWdfYXJncykgLSBhcmdpZHg7Ci0JCXYgPSBQeVR1cGxlX05ldyhuKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3I7Ci0JCXdoaWxlICgtLW4gPj0gMCkgewotCQkJUHlPYmplY3QgKncgPSBQeVR1cGxlX0dFVF9JVEVNKG9yaWdfYXJncywgbiArIGFyZ2lkeCk7Ci0JCQlQeV9JTkNSRUYodyk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHYsIG4sIHcpOwotCQl9Ci0JCWFyZ3MgPSB2OwotCX0gZWxzZSB7Ci0JCVB5X0lOQ1JFRihvcmlnX2FyZ3MpOwotCQlhcmdzID0gb3JpZ19hcmdzOwotCX0KLQlhcmdzX293bmVkID0gMTsKLQkvKiBUYWtlIHdoYXQgd2UgaGF2ZSBvZiB0aGUgcmVzdWx0IGFuZCBsZXQgdGhlIFVuaWNvZGUgZm9ybWF0dGluZwotCSAgIGZ1bmN0aW9uIGZvcm1hdCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQuICovCi0JcmVzY250ID0gcmVzIC0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7Ci0JaWYgKF9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgcmVzY250KSkKLQkJZ290byBlcnJvcjsKLQlmbXRjbnQgPSBQeVN0cmluZ19HRVRfU0laRShmb3JtYXQpIC0gXAotCQkgKGZtdCAtIFB5U3RyaW5nX0FTX1NUUklORyhmb3JtYXQpKTsKLQlmb3JtYXQgPSBQeVVuaWNvZGVfRGVjb2RlKGZtdCwgZm10Y250LCBOVUxMLCBOVUxMKTsKLQlpZiAoZm9ybWF0ID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0JdiA9IFB5VW5pY29kZV9Gb3JtYXQoZm9ybWF0LCBhcmdzKTsKLQlQeV9ERUNSRUYoZm9ybWF0KTsKLQlpZiAodiA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCS8qIFBhc3RlIHdoYXQgd2UgaGF2ZSAocmVzdWx0KSB0byB3aGF0IHRoZSBVbmljb2RlIGZvcm1hdHRpbmcKLQkgICBmdW5jdGlvbiByZXR1cm5lZCAodikgYW5kIHJldHVybiB0aGUgcmVzdWx0IChvciBlcnJvcikgKi8KLQl3ID0gUHlVbmljb2RlX0NvbmNhdChyZXN1bHQsIHYpOwotCVB5X0RFQ1JFRihyZXN1bHQpOwotCVB5X0RFQ1JFRih2KTsKLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHc7CisgICAgaWYgKGFyZ3Nfb3duZWQpIHsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBhcmdzX293bmVkID0gMDsKKyAgICB9CisgICAgLyogRmlkZGxlIGFyZ3MgcmlnaHQgKHJlbW92ZSB0aGUgZmlyc3QgYXJnaWR4IGFyZ3VtZW50cykgKi8KKyAgICBpZiAoUHlUdXBsZV9DaGVjayhvcmlnX2FyZ3MpICYmIGFyZ2lkeCA+IDApIHsKKyAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgIFB5X3NzaXplX3QgbiA9IFB5VHVwbGVfR0VUX1NJWkUob3JpZ19hcmdzKSAtIGFyZ2lkeDsKKyAgICAgICAgdiA9IFB5VHVwbGVfTmV3KG4pOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgd2hpbGUgKC0tbiA+PSAwKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdyA9IFB5VHVwbGVfR0VUX0lURU0ob3JpZ19hcmdzLCBuICsgYXJnaWR4KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgbiwgdyk7CisgICAgICAgIH0KKyAgICAgICAgYXJncyA9IHY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlfSU5DUkVGKG9yaWdfYXJncyk7CisgICAgICAgIGFyZ3MgPSBvcmlnX2FyZ3M7CisgICAgfQorICAgIGFyZ3Nfb3duZWQgPSAxOworICAgIC8qIFRha2Ugd2hhdCB3ZSBoYXZlIG9mIHRoZSByZXN1bHQgYW5kIGxldCB0aGUgVW5pY29kZSBmb3JtYXR0aW5nCisgICAgICAgZnVuY3Rpb24gZm9ybWF0IHRoZSByZXN0IG9mIHRoZSBpbnB1dC4gKi8KKyAgICByZXNjbnQgPSByZXMgLSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKKyAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCByZXNjbnQpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGZtdGNudCA9IFB5U3RyaW5nX0dFVF9TSVpFKGZvcm1hdCkgLSBcCisgICAgICAgICAgICAgKGZtdCAtIFB5U3RyaW5nX0FTX1NUUklORyhmb3JtYXQpKTsKKyAgICBmb3JtYXQgPSBQeVVuaWNvZGVfRGVjb2RlKGZtdCwgZm10Y250LCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgdiA9IFB5VW5pY29kZV9Gb3JtYXQoZm9ybWF0LCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoZm9ybWF0KTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIC8qIFBhc3RlIHdoYXQgd2UgaGF2ZSAocmVzdWx0KSB0byB3aGF0IHRoZSBVbmljb2RlIGZvcm1hdHRpbmcKKyAgICAgICBmdW5jdGlvbiByZXR1cm5lZCAodikgYW5kIHJldHVybiB0aGUgcmVzdWx0IChvciBlcnJvcikgKi8KKyAgICB3ID0gUHlVbmljb2RlX0NvbmNhdChyZXN1bHQsIHYpOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgcmV0dXJuIHc7CiAjZW5kaWYgLyogUHlfVVNJTkdfVU5JQ09ERSAqLwogCiAgZXJyb3I6Ci0JUHlfREVDUkVGKHJlc3VsdCk7Ci0JaWYgKGFyZ3Nfb3duZWQpIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBpZiAoYXJnc19vd25lZCkgeworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiB2b2lkCiBQeVN0cmluZ19JbnRlcm5JblBsYWNlKFB5T2JqZWN0ICoqcCkKIHsKLQlyZWdpc3RlciBQeVN0cmluZ09iamVjdCAqcyA9IChQeVN0cmluZ09iamVjdCAqKSgqcCk7Ci0JUHlPYmplY3QgKnQ7Ci0JaWYgKHMgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2socykpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5U3RyaW5nX0ludGVybkluUGxhY2U6IHN0cmluZ3Mgb25seSBwbGVhc2UhIik7Ci0JLyogSWYgaXQncyBhIHN0cmluZyBzdWJjbGFzcywgd2UgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCBwdXR0aW5nCi0JICAgaXQgaW4gdGhlIGludGVybmVkIGRpY3QgbWlnaHQgZG8uICovCi0JaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KHMpKQotCQlyZXR1cm47Ci0JaWYgKFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKHMpKQotCQlyZXR1cm47Ci0JaWYgKGludGVybmVkID09IE5VTEwpIHsKLQkJaW50ZXJuZWQgPSBQeURpY3RfTmV3KCk7Ci0JCWlmIChpbnRlcm5lZCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOyAvKiBEb24ndCBsZWF2ZSBhbiBleGNlcHRpb24gKi8KLQkJCXJldHVybjsKLQkJfQotCX0KLQl0ID0gUHlEaWN0X0dldEl0ZW0oaW50ZXJuZWQsIChQeU9iamVjdCAqKXMpOwotCWlmICh0KSB7Ci0JCVB5X0lOQ1JFRih0KTsKLQkJUHlfREVDUkVGKCpwKTsKLQkJKnAgPSB0OwotCQlyZXR1cm47Ci0JfQorICAgIHJlZ2lzdGVyIFB5U3RyaW5nT2JqZWN0ICpzID0gKFB5U3RyaW5nT2JqZWN0ICopKCpwKTsKKyAgICBQeU9iamVjdCAqdDsKKyAgICBpZiAocyA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhzKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlTdHJpbmdfSW50ZXJuSW5QbGFjZTogc3RyaW5ncyBvbmx5IHBsZWFzZSEiKTsKKyAgICAvKiBJZiBpdCdzIGEgc3RyaW5nIHN1YmNsYXNzLCB3ZSBkb24ndCByZWFsbHkga25vdyB3aGF0IHB1dHRpbmcKKyAgICAgICBpdCBpbiB0aGUgaW50ZXJuZWQgZGljdCBtaWdodCBkby4gKi8KKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3QocykpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQocykpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoaW50ZXJuZWQgPT0gTlVMTCkgeworICAgICAgICBpbnRlcm5lZCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGludGVybmVkID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIERvbid0IGxlYXZlIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHQgPSBQeURpY3RfR2V0SXRlbShpbnRlcm5lZCwgKFB5T2JqZWN0ICopcyk7CisgICAgaWYgKHQpIHsKKyAgICAgICAgUHlfSU5DUkVGKHQpOworICAgICAgICBQeV9ERUNSRUYoKnApOworICAgICAgICAqcCA9IHQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW0oaW50ZXJuZWQsIChQeU9iamVjdCAqKXMsIChQeU9iamVjdCAqKXMpIDwgMCkgewotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm47Ci0JfQotCS8qIFRoZSB0d28gcmVmZXJlbmNlcyBpbiBpbnRlcm5lZCBhcmUgbm90IGNvdW50ZWQgYnkgcmVmY250LgotCSAgIFRoZSBzdHJpbmcgZGVhbGxvY2F0b3Igd2lsbCB0YWtlIGNhcmUgb2YgdGhpcyAqLwotCVB5X1JFRkNOVChzKSAtPSAyOwotCVB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKHMpID0gU1NUQVRFX0lOVEVSTkVEX01PUlRBTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW0oaW50ZXJuZWQsIChQeU9iamVjdCAqKXMsIChQeU9iamVjdCAqKXMpIDwgMCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIFRoZSB0d28gcmVmZXJlbmNlcyBpbiBpbnRlcm5lZCBhcmUgbm90IGNvdW50ZWQgYnkgcmVmY250LgorICAgICAgIFRoZSBzdHJpbmcgZGVhbGxvY2F0b3Igd2lsbCB0YWtlIGNhcmUgb2YgdGhpcyAqLworICAgIFB5X1JFRkNOVChzKSAtPSAyOworICAgIFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKHMpID0gU1NUQVRFX0lOVEVSTkVEX01PUlRBTDsKIH0KIAogdm9pZAogUHlTdHJpbmdfSW50ZXJuSW1tb3J0YWwoUHlPYmplY3QgKipwKQogewotCVB5U3RyaW5nX0ludGVybkluUGxhY2UocCk7Ci0JaWYgKFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKCpwKSAhPSBTU1RBVEVfSU5URVJORURfSU1NT1JUQUwpIHsKLQkJUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQoKnApID0gU1NUQVRFX0lOVEVSTkVEX0lNTU9SVEFMOwotCQlQeV9JTkNSRUYoKnApOwotCX0KKyAgICBQeVN0cmluZ19JbnRlcm5JblBsYWNlKHApOworICAgIGlmIChQeVN0cmluZ19DSEVDS19JTlRFUk5FRCgqcCkgIT0gU1NUQVRFX0lOVEVSTkVEX0lNTU9SVEFMKSB7CisgICAgICAgIFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKCpwKSA9IFNTVEFURV9JTlRFUk5FRF9JTU1PUlRBTDsKKyAgICAgICAgUHlfSU5DUkVGKCpwKTsKKyAgICB9CiB9CiAKIAogUHlPYmplY3QgKgogUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhjb25zdCBjaGFyICpjcCkKIHsKLQlQeU9iamVjdCAqcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoY3ApOwotCWlmIChzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5U3RyaW5nX0ludGVybkluUGxhY2UoJnMpOwotCXJldHVybiBzOworICAgIFB5T2JqZWN0ICpzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjcCk7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmcyk7CisgICAgcmV0dXJuIHM7CiB9CiAKIHZvaWQKIFB5U3RyaW5nX0Zpbmkodm9pZCkKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgVUNIQVJfTUFYICsgMTsgaSsrKSB7Ci0JCVB5X1hERUNSRUYoY2hhcmFjdGVyc1tpXSk7Ci0JCWNoYXJhY3RlcnNbaV0gPSBOVUxMOwotCX0KLQlQeV9YREVDUkVGKG51bGxzdHJpbmcpOwotCW51bGxzdHJpbmcgPSBOVUxMOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBVQ0hBUl9NQVggKyAxOyBpKyspIHsKKyAgICAgICAgUHlfWERFQ1JFRihjaGFyYWN0ZXJzW2ldKTsKKyAgICAgICAgY2hhcmFjdGVyc1tpXSA9IE5VTEw7CisgICAgfQorICAgIFB5X1hERUNSRUYobnVsbHN0cmluZyk7CisgICAgbnVsbHN0cmluZyA9IE5VTEw7CiB9CiAKIHZvaWQgX1B5X1JlbGVhc2VJbnRlcm5lZFN0cmluZ3Modm9pZCkKIHsKLQlQeU9iamVjdCAqa2V5czsKLQlQeVN0cmluZ09iamVjdCAqczsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlfc3NpemVfdCBpbW1vcnRhbF9zaXplID0gMCwgbW9ydGFsX3NpemUgPSAwOworICAgIFB5T2JqZWN0ICprZXlzOworICAgIFB5U3RyaW5nT2JqZWN0ICpzOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeV9zc2l6ZV90IGltbW9ydGFsX3NpemUgPSAwLCBtb3J0YWxfc2l6ZSA9IDA7CiAKLQlpZiAoaW50ZXJuZWQgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGludGVybmVkKSkKLQkJcmV0dXJuOwotCWtleXMgPSBQeURpY3RfS2V5cyhpbnRlcm5lZCk7Ci0JaWYgKGtleXMgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKGtleXMpKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKGludGVybmVkID09IE5VTEwgfHwgIVB5RGljdF9DaGVjayhpbnRlcm5lZCkpCisgICAgICAgIHJldHVybjsKKyAgICBrZXlzID0gUHlEaWN0X0tleXMoaW50ZXJuZWQpOworICAgIGlmIChrZXlzID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhrZXlzKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JLyogU2luY2UgX1B5X1JlbGVhc2VJbnRlcm5lZFN0cmluZ3MoKSBpcyBpbnRlbmRlZCB0byBoZWxwIGEgbGVhawotCSAgIGRldGVjdG9yLCBpbnRlcm5lZCBzdHJpbmdzIGFyZSBub3QgZm9yY2libHkgZGVhbGxvY2F0ZWQ7IHJhdGhlciwgd2UKLQkgICBnaXZlIHRoZW0gdGhlaXIgc3RvbGVuIHJlZmVyZW5jZXMgYmFjaywgYW5kIHRoZW4gY2xlYXIgYW5kIERFQ1JFRgotCSAgIHRoZSBpbnRlcm5lZCBkaWN0LiAqLworICAgIC8qIFNpbmNlIF9QeV9SZWxlYXNlSW50ZXJuZWRTdHJpbmdzKCkgaXMgaW50ZW5kZWQgdG8gaGVscCBhIGxlYWsKKyAgICAgICBkZXRlY3RvciwgaW50ZXJuZWQgc3RyaW5ncyBhcmUgbm90IGZvcmNpYmx5IGRlYWxsb2NhdGVkOyByYXRoZXIsIHdlCisgICAgICAgZ2l2ZSB0aGVtIHRoZWlyIHN0b2xlbiByZWZlcmVuY2VzIGJhY2ssIGFuZCB0aGVuIGNsZWFyIGFuZCBERUNSRUYKKyAgICAgICB0aGUgaW50ZXJuZWQgZGljdC4gKi8KIAotCW4gPSBQeUxpc3RfR0VUX1NJWkUoa2V5cyk7Ci0JZnByaW50ZihzdGRlcnIsICJyZWxlYXNpbmcgJSIgUFlfRk9STUFUX1NJWkVfVCAiZCBpbnRlcm5lZCBzdHJpbmdzXG4iLAotCQluKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXMgPSAoUHlTdHJpbmdPYmplY3QgKikgUHlMaXN0X0dFVF9JVEVNKGtleXMsIGkpOwotCQlzd2l0Y2ggKHMtPm9iX3NzdGF0ZSkgewotCQljYXNlIFNTVEFURV9OT1RfSU5URVJORUQ6Ci0JCQkvKiBYWFggU2hvdWxkbid0IGhhcHBlbiAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NUQVRFX0lOVEVSTkVEX0lNTU9SVEFMOgotCQkJUHlfUkVGQ05UKHMpICs9IDE7Ci0JCQlpbW1vcnRhbF9zaXplICs9IFB5X1NJWkUocyk7Ci0JCQlicmVhazsKLQkJY2FzZSBTU1RBVEVfSU5URVJORURfTU9SVEFMOgotCQkJUHlfUkVGQ05UKHMpICs9IDI7Ci0JCQltb3J0YWxfc2l6ZSArPSBQeV9TSVpFKHMpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQeV9GYXRhbEVycm9yKCJJbmNvbnNpc3RlbnQgaW50ZXJuZWQgc3RyaW5nIHN0YXRlLiIpOwotCQl9Ci0JCXMtPm9iX3NzdGF0ZSA9IFNTVEFURV9OT1RfSU5URVJORUQ7Ci0JfQotCWZwcmludGYoc3RkZXJyLCAidG90YWwgc2l6ZSBvZiBhbGwgaW50ZXJuZWQgc3RyaW5nczogIgotCQkJIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQvJSIgUFlfRk9STUFUX1NJWkVfVCAiZCAiCi0JCQkibW9ydGFsL2ltbW9ydGFsXG4iLCBtb3J0YWxfc2l6ZSwgaW1tb3J0YWxfc2l6ZSk7Ci0JUHlfREVDUkVGKGtleXMpOwotCVB5RGljdF9DbGVhcihpbnRlcm5lZCk7Ci0JUHlfREVDUkVGKGludGVybmVkKTsKLQlpbnRlcm5lZCA9IE5VTEw7CisgICAgbiA9IFB5TGlzdF9HRVRfU0laRShrZXlzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInJlbGVhc2luZyAlIiBQWV9GT1JNQVRfU0laRV9UICJkIGludGVybmVkIHN0cmluZ3NcbiIsCisgICAgICAgIG4pOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgcyA9IChQeVN0cmluZ09iamVjdCAqKSBQeUxpc3RfR0VUX0lURU0oa2V5cywgaSk7CisgICAgICAgIHN3aXRjaCAocy0+b2Jfc3N0YXRlKSB7CisgICAgICAgIGNhc2UgU1NUQVRFX05PVF9JTlRFUk5FRDoKKyAgICAgICAgICAgIC8qIFhYWCBTaG91bGRuJ3QgaGFwcGVuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTU1RBVEVfSU5URVJORURfSU1NT1JUQUw6CisgICAgICAgICAgICBQeV9SRUZDTlQocykgKz0gMTsKKyAgICAgICAgICAgIGltbW9ydGFsX3NpemUgKz0gUHlfU0laRShzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNTVEFURV9JTlRFUk5FRF9NT1JUQUw6CisgICAgICAgICAgICBQeV9SRUZDTlQocykgKz0gMjsKKyAgICAgICAgICAgIG1vcnRhbF9zaXplICs9IFB5X1NJWkUocyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkluY29uc2lzdGVudCBpbnRlcm5lZCBzdHJpbmcgc3RhdGUuIik7CisgICAgICAgIH0KKyAgICAgICAgcy0+b2Jfc3N0YXRlID0gU1NUQVRFX05PVF9JTlRFUk5FRDsKKyAgICB9CisgICAgZnByaW50ZihzdGRlcnIsICJ0b3RhbCBzaXplIG9mIGFsbCBpbnRlcm5lZCBzdHJpbmdzOiAiCisgICAgICAgICAgICAgICAgICAgICIlIiBQWV9GT1JNQVRfU0laRV9UICJkLyUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgIgorICAgICAgICAgICAgICAgICAgICAibW9ydGFsL2ltbW9ydGFsXG4iLCBtb3J0YWxfc2l6ZSwgaW1tb3J0YWxfc2l6ZSk7CisgICAgUHlfREVDUkVGKGtleXMpOworICAgIFB5RGljdF9DbGVhcihpbnRlcm5lZCk7CisgICAgUHlfREVDUkVGKGludGVybmVkKTsKKyAgICBpbnRlcm5lZCA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cnVjdHNlcS5jIGIvT2JqZWN0cy9zdHJ1Y3RzZXEuYwppbmRleCBhZDI0NmExLi41OGUxNWNiIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cnVjdHNlcS5jCisrKyBiL09iamVjdHMvc3RydWN0c2VxLmMKQEAgLTksNyArOSw3IEBACiBzdGF0aWMgY2hhciByZWFsX2xlbmd0aF9rZXlbXSA9ICJuX2ZpZWxkcyI7CiBzdGF0aWMgY2hhciB1bm5hbWVkX2ZpZWxkc19rZXlbXSA9ICJuX3VubmFtZWRfZmllbGRzIjsKIAotLyogRmllbGRzIHdpdGggdGhpcyBuYW1lIGhhdmUgb25seSBhIGZpZWxkIGluZGV4LCBub3QgYSBmaWVsZCBuYW1lLiAKKy8qIEZpZWxkcyB3aXRoIHRoaXMgbmFtZSBoYXZlIG9ubHkgYSBmaWVsZCBpbmRleCwgbm90IGEgZmllbGQgbmFtZS4KICAgIFRoZXkgYXJlIG9ubHkgYWxsb3dlZCBmb3IgaW5kaWNlcyA8IG5fdmlzaWJsZV9maWVsZHMuICovCiBjaGFyICpQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZCA9ICJ1bm5hbWVkIGZpZWxkIjsKIApAQCAtMjksNTExICsyOSw1MTEgQEAKIFB5T2JqZWN0ICoKIFB5U3RydWN0U2VxdWVuY2VfTmV3KFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeVN0cnVjdFNlcXVlbmNlICpvYmo7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqOwogCi0Jb2JqID0gUHlPYmplY3RfTmV3KFB5U3RydWN0U2VxdWVuY2UsIHR5cGUpOwotCWlmIChvYmogPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfU0laRShvYmopID0gVklTSUJMRV9TSVpFX1RQKHR5cGUpOworICAgIG9iaiA9IFB5T2JqZWN0X05ldyhQeVN0cnVjdFNlcXVlbmNlLCB0eXBlKTsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1NJWkUob2JqKSA9IFZJU0lCTEVfU0laRV9UUCh0eXBlKTsKIAotCXJldHVybiAoUHlPYmplY3QqKSBvYmo7CisgICAgcmV0dXJuIChQeU9iamVjdCopIG9iajsKIH0KIAogc3RhdGljIHZvaWQKIHN0cnVjdHNlcV9kZWFsbG9jKFB5U3RydWN0U2VxdWVuY2UgKm9iaikKIHsKLQlQeV9zc2l6ZV90IGksIHNpemU7CisgICAgUHlfc3NpemVfdCBpLCBzaXplOwogCi0Jc2l6ZSA9IFJFQUxfU0laRShvYmopOwotCWZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJUHlfWERFQ1JFRihvYmotPm9iX2l0ZW1baV0pOwotCX0KLQlQeU9iamVjdF9EZWwob2JqKTsKKyAgICBzaXplID0gUkVBTF9TSVpFKG9iaik7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBQeV9YREVDUkVGKG9iai0+b2JfaXRlbVtpXSk7CisgICAgfQorICAgIFB5T2JqZWN0X0RlbChvYmopOwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogc3RydWN0c2VxX2xlbmd0aChQeVN0cnVjdFNlcXVlbmNlICpvYmopCiB7Ci0JcmV0dXJuIFZJU0lCTEVfU0laRShvYmopOworICAgIHJldHVybiBWSVNJQkxFX1NJWkUob2JqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgogc3RydWN0c2VxX2l0ZW0oUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqLCBQeV9zc2l6ZV90IGkpCiB7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gVklTSUJMRV9TSVpFKG9iaikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihvYmotPm9iX2l0ZW1baV0pOwotCXJldHVybiBvYmotPm9iX2l0ZW1baV07CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gVklTSUJMRV9TSVpFKG9iaikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihvYmotPm9iX2l0ZW1baV0pOworICAgIHJldHVybiBvYmotPm9iX2l0ZW1baV07CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHN0cnVjdHNlcV9zbGljZShQeVN0cnVjdFNlcXVlbmNlICpvYmosIFB5X3NzaXplX3QgbG93LCBQeV9zc2l6ZV90IGhpZ2gpCiB7Ci0JUHlUdXBsZU9iamVjdCAqbnA7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5VHVwbGVPYmplY3QgKm5wOworICAgIFB5X3NzaXplX3QgaTsKIAotCWlmIChsb3cgPCAwKQotCQlsb3cgPSAwOwotCWlmIChoaWdoID4gVklTSUJMRV9TSVpFKG9iaikpCi0JCWhpZ2ggPSBWSVNJQkxFX1NJWkUob2JqKTsKLQlpZiAoaGlnaCA8IGxvdykKLQkJaGlnaCA9IGxvdzsKLQlucCA9IChQeVR1cGxlT2JqZWN0ICopUHlUdXBsZV9OZXcoaGlnaC1sb3cpOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IoaSA9IGxvdzsgaSA8IGhpZ2g7ICsraSkgewotCQlQeU9iamVjdCAqdiA9IG9iai0+b2JfaXRlbVtpXTsKLQkJUHlfSU5DUkVGKHYpOwotCQlQeVR1cGxlX1NFVF9JVEVNKG5wLCBpLWxvdywgdik7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKikgbnA7CisgICAgaWYgKGxvdyA8IDApCisgICAgICAgIGxvdyA9IDA7CisgICAgaWYgKGhpZ2ggPiBWSVNJQkxFX1NJWkUob2JqKSkKKyAgICAgICAgaGlnaCA9IFZJU0lCTEVfU0laRShvYmopOworICAgIGlmIChoaWdoIDwgbG93KQorICAgICAgICBoaWdoID0gbG93OworICAgIG5wID0gKFB5VHVwbGVPYmplY3QgKilQeVR1cGxlX05ldyhoaWdoLWxvdyk7CisgICAgaWYgKG5wID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvcihpID0gbG93OyBpIDwgaGlnaDsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gb2JqLT5vYl9pdGVtW2ldOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obnAsIGktbG93LCB2KTsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBucDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9zdWJzY3JpcHQoUHlTdHJ1Y3RTZXF1ZW5jZSAqc2VsZiwgUHlPYmplY3QgKml0ZW0pCiB7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkJaWYgKGkgPCAwKQotCQkJaSArPSBWSVNJQkxFX1NJWkUoc2VsZik7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gVklTSUJMRV9TSVpFKHNlbGYpOwogCi0JCWlmIChpIDwgMCB8fCBpID49IFZJU0lCTEVfU0laRShzZWxmKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCi0JCQkJInR1cGxlIGluZGV4IG91dCBvZiByYW5nZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKHNlbGYtPm9iX2l0ZW1baV0pOwotCQlyZXR1cm4gc2VsZi0+b2JfaXRlbVtpXTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbiwgY3VyLCBpOwotCQlQeU9iamVjdCAqcmVzdWx0OwotCQkKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0ICopaXRlbSwKLQkJCQkJIFZJU0lCTEVfU0laRShzZWxmKSwgJnN0YXJ0LCAmc3RvcCwKLQkJCQkJICZzdGVwLCAmc2xpY2VsZW4pIDwgMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKHNsaWNlbGVuIDw9IDApCi0JCQlyZXR1cm4gUHlUdXBsZV9OZXcoMCk7Ci0JCXJlc3VsdCA9IFB5VHVwbGVfTmV3KHNsaWNlbGVuKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW47Ci0JCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJUHlPYmplY3QgKnYgPSBzZWxmLT5vYl9pdGVtW2N1cl07Ci0JCQlQeV9JTkNSRUYodik7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgdik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInN0cnVjdHNlcSBpbmRleCBtdXN0IGJlIGludGVnZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSBWSVNJQkxFX1NJWkUoc2VsZikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAorICAgICAgICAgICAgICAgICJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5vYl9pdGVtW2ldKTsKKyAgICAgICAgcmV0dXJuIHNlbGYtPm9iX2l0ZW1baV07CisgICAgfQorICAgIGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgc3RvcCwgc3RlcCwgc2xpY2VsZW4sIGN1ciwgaTsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgoKFB5U2xpY2VPYmplY3QgKilpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVklTSUJMRV9TSVpFKHNlbGYpLCAmc3RhcnQsICZzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ZXAsICZzbGljZWxlbikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2xpY2VsZW4gPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcoc2xpY2VsZW4pOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yIChjdXIgPSBzdGFydCwgaSA9IDA7IGkgPCBzbGljZWxlbjsKKyAgICAgICAgICAgICBjdXIgKz0gc3RlcCwgaSsrKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdiA9IHNlbGYtPm9iX2l0ZW1bY3VyXTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCB2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3RzZXEgaW5kZXggbXVzdCBiZSBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JUHlPYmplY3QgKmFyZyA9IE5VTEw7Ci0JUHlPYmplY3QgKmRpY3QgPSBOVUxMOwotCVB5T2JqZWN0ICpvYjsKLQlQeVN0cnVjdFNlcXVlbmNlICpyZXMgPSBOVUxMOwotCVB5X3NzaXplX3QgbGVuLCBtaW5fbGVuLCBtYXhfbGVuLCBpLCBuX3VubmFtZWRfZmllbGRzOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2VxdWVuY2UiLCAiZGljdCIsIDB9OworICAgIFB5T2JqZWN0ICphcmcgPSBOVUxMOworICAgIFB5T2JqZWN0ICpkaWN0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqb2I7CisgICAgUHlTdHJ1Y3RTZXF1ZW5jZSAqcmVzID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGxlbiwgbWluX2xlbiwgbWF4X2xlbiwgaSwgbl91bm5hbWVkX2ZpZWxkczsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcXVlbmNlIiwgImRpY3QiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86c3RydWN0c2VxIiwgCi0JCQkJCSBrd2xpc3QsICZhcmcsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98TzpzdHJ1Y3RzZXEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmFyZywgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFyZyA9IFB5U2VxdWVuY2VfRmFzdChhcmcsICJjb25zdHJ1Y3RvciByZXF1aXJlcyBhIHNlcXVlbmNlIik7CisgICAgYXJnID0gUHlTZXF1ZW5jZV9GYXN0KGFyZywgImNvbnN0cnVjdG9yIHJlcXVpcmVzIGEgc2VxdWVuY2UiKTsKIAotCWlmICghYXJnKSB7CQkJCQotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFhcmcpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKGRpY3QgJiYgIVB5RGljdF9DaGVjayhkaWN0KSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJCSAgICAgIiUuNTAwcygpIHRha2VzIGEgZGljdCBhcyBzZWNvbmQgYXJnLCBpZiBhbnkiLAotCQkJICAgICB0eXBlLT50cF9uYW1lKTsKLQkJUHlfREVDUkVGKGFyZyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZGljdCAmJiAhUHlEaWN0X0NoZWNrKGRpY3QpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJS41MDBzKCkgdGFrZXMgYSBkaWN0IGFzIHNlY29uZCBhcmcsIGlmIGFueSIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWxlbiA9IFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShhcmcpOwotCW1pbl9sZW4gPSBWSVNJQkxFX1NJWkVfVFAodHlwZSk7Ci0JbWF4X2xlbiA9IFJFQUxfU0laRV9UUCh0eXBlKTsKLQluX3VubmFtZWRfZmllbGRzID0gVU5OQU1FRF9GSUVMRFNfVFAodHlwZSk7CisgICAgbGVuID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKGFyZyk7CisgICAgbWluX2xlbiA9IFZJU0lCTEVfU0laRV9UUCh0eXBlKTsKKyAgICBtYXhfbGVuID0gUkVBTF9TSVpFX1RQKHR5cGUpOworICAgIG5fdW5uYW1lZF9maWVsZHMgPSBVTk5BTUVEX0ZJRUxEU19UUCh0eXBlKTsKIAotCWlmIChtaW5fbGVuICE9IG1heF9sZW4pIHsKLQkJaWYgKGxlbiA8IG1pbl9sZW4pIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIAotCSAgICAgICAiJS41MDBzKCkgdGFrZXMgYW4gYXQgbGVhc3QgJXpkLXNlcXVlbmNlICglemQtc2VxdWVuY2UgZ2l2ZW4pIiwKLQkJCQkgICAgIHR5cGUtPnRwX25hbWUsIG1pbl9sZW4sIGxlbik7Ci0JCQlQeV9ERUNSRUYoYXJnKTsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgaWYgKG1pbl9sZW4gIT0gbWF4X2xlbikgeworICAgICAgICBpZiAobGVuIDwgbWluX2xlbikgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgIiUuNTAwcygpIHRha2VzIGFuIGF0IGxlYXN0ICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBtaW5fbGVuLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlpZiAobGVuID4gbWF4X2xlbikgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JICAgICAgICIlLjUwMHMoKSB0YWtlcyBhbiBhdCBtb3N0ICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCi0JCQkJICAgICB0eXBlLT50cF9uYW1lLCBtYXhfbGVuLCBsZW4pOwotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0gCi0JZWxzZSB7Ci0JCWlmIChsZW4gIT0gbWluX2xlbikgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCi0JICAgICAgICIlLjUwMHMoKSB0YWtlcyBhICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCi0JCQkJICAgICB0eXBlLT50cF9uYW1lLCBtaW5fbGVuLCBsZW4pOwotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICAgICAgaWYgKGxlbiA+IG1heF9sZW4pIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICIlLjUwMHMoKSB0YWtlcyBhbiBhdCBtb3N0ICV6ZC1zZXF1ZW5jZSAoJXpkLXNlcXVlbmNlIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBtYXhfbGVuLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChsZW4gIT0gbWluX2xlbikgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgIiUuNTAwcygpIHRha2VzIGEgJXpkLXNlcXVlbmNlICglemQtc2VxdWVuY2UgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsIG1pbl9sZW4sIGxlbik7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmcpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXJlcyA9IChQeVN0cnVjdFNlcXVlbmNlKikgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcodHlwZSk7Ci0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLQkJUHlPYmplY3QgKnYgPSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0oYXJnLCBpKTsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXMtPm9iX2l0ZW1baV0gPSB2OwotCX0KLQlmb3IgKDsgaSA8IG1heF9sZW47ICsraSkgewotCQlpZiAoZGljdCAmJiAob2IgPSBQeURpY3RfR2V0SXRlbVN0cmluZygKLQkJCWRpY3QsIHR5cGUtPnRwX21lbWJlcnNbaS1uX3VubmFtZWRfZmllbGRzXS5uYW1lKSkpIHsKLQkJfQotCQllbHNlIHsKLQkJCW9iID0gUHlfTm9uZTsKLQkJfQotCQlQeV9JTkNSRUYob2IpOwotCQlyZXMtPm9iX2l0ZW1baV0gPSBvYjsKLQl9Ci0JCi0JUHlfREVDUkVGKGFyZyk7Ci0JcmV0dXJuIChQeU9iamVjdCopIHJlczsKKyAgICByZXMgPSAoUHlTdHJ1Y3RTZXF1ZW5jZSopIFB5U3RydWN0U2VxdWVuY2VfTmV3KHR5cGUpOworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGFyZywgaSk7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmVzLT5vYl9pdGVtW2ldID0gdjsKKyAgICB9CisgICAgZm9yICg7IGkgPCBtYXhfbGVuOyArK2kpIHsKKyAgICAgICAgaWYgKGRpY3QgJiYgKG9iID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoCisgICAgICAgICAgICBkaWN0LCB0eXBlLT50cF9tZW1iZXJzW2ktbl91bm5hbWVkX2ZpZWxkc10ubmFtZSkpKSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvYiA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG9iKTsKKyAgICAgICAgcmVzLT5vYl9pdGVtW2ldID0gb2I7CisgICAgfQorCisgICAgUHlfREVDUkVGKGFyZyk7CisgICAgcmV0dXJuIChQeU9iamVjdCopIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2VfdHVwbGUoUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqKQogewotCXJldHVybiBzdHJ1Y3RzZXFfc2xpY2Uob2JqLCAwLCBWSVNJQkxFX1NJWkUob2JqKSk7CisgICAgcmV0dXJuIHN0cnVjdHNlcV9zbGljZShvYmosIDAsIFZJU0lCTEVfU0laRShvYmopKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9yZXByKFB5U3RydWN0U2VxdWVuY2UgKm9iaikKIHsKLQkvKiBidWZmZXIgYW5kIHR5cGUgc2l6ZSB3ZXJlIGNob3NlbiB3ZWxsIGNvbnNpZGVyZWQuICovCisgICAgLyogYnVmZmVyIGFuZCB0eXBlIHNpemUgd2VyZSBjaG9zZW4gd2VsbCBjb25zaWRlcmVkLiAqLwogI2RlZmluZSBSRVBSX0JVRkZFUl9TSVpFIDUxMgogI2RlZmluZSBUWVBFX01BWFNJWkUgMTAwCiAKLQlQeU9iamVjdCAqdHVwOwotCVB5VHlwZU9iamVjdCAqdHlwID0gUHlfVFlQRShvYmopOwotCWludCBpLCByZW1vdmVsYXN0ID0gMDsKLQlQeV9zc2l6ZV90IGxlbjsKLQljaGFyIGJ1ZltSRVBSX0JVRkZFUl9TSVpFXTsKLQljaGFyICplbmRvZmJ1ZiwgKnBidWYgPSBidWY7CisgICAgUHlPYmplY3QgKnR1cDsKKyAgICBQeVR5cGVPYmplY3QgKnR5cCA9IFB5X1RZUEUob2JqKTsKKyAgICBpbnQgaSwgcmVtb3ZlbGFzdCA9IDA7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgY2hhciBidWZbUkVQUl9CVUZGRVJfU0laRV07CisgICAgY2hhciAqZW5kb2ZidWYsICpwYnVmID0gYnVmOwogCi0JLyogcG9pbnRlciB0byBlbmQgb2Ygd3JpdGVhYmxlIGJ1ZmZlcjsgc2FmZXMgc3BhY2UgZm9yICIuLi4pXDAiICovCi0JZW5kb2ZidWY9ICZidWZbUkVQUl9CVUZGRVJfU0laRS01XTsKKyAgICAvKiBwb2ludGVyIHRvIGVuZCBvZiB3cml0ZWFibGUgYnVmZmVyOyBzYWZlcyBzcGFjZSBmb3IgIi4uLilcMCIgKi8KKyAgICBlbmRvZmJ1Zj0gJmJ1ZltSRVBSX0JVRkZFUl9TSVpFLTVdOwogCi0JaWYgKCh0dXAgPSBtYWtlX3R1cGxlKG9iaikpID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgodHVwID0gbWFrZV90dXBsZShvYmopKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qICJ0eXBlbmFtZSgiLCBsaW1pdGVkIHRvICBUWVBFX01BWFNJWkUgKi8KLQlsZW4gPSBzdHJsZW4odHlwLT50cF9uYW1lKSA+IFRZUEVfTUFYU0laRSA/IFRZUEVfTUFYU0laRSA6Ci0JCQkJCQkgICAgc3RybGVuKHR5cC0+dHBfbmFtZSk7Ci0Jc3RybmNweShwYnVmLCB0eXAtPnRwX25hbWUsIGxlbik7Ci0JcGJ1ZiArPSBsZW47Ci0JKnBidWYrKyA9ICcoJzsKKyAgICAvKiAidHlwZW5hbWUoIiwgbGltaXRlZCB0byAgVFlQRV9NQVhTSVpFICovCisgICAgbGVuID0gc3RybGVuKHR5cC0+dHBfbmFtZSkgPiBUWVBFX01BWFNJWkUgPyBUWVBFX01BWFNJWkUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbih0eXAtPnRwX25hbWUpOworICAgIHN0cm5jcHkocGJ1ZiwgdHlwLT50cF9uYW1lLCBsZW4pOworICAgIHBidWYgKz0gbGVuOworICAgICpwYnVmKysgPSAnKCc7CiAKLQlmb3IgKGk9MDsgaSA8IFZJU0lCTEVfU0laRShvYmopOyBpKyspIHsKLQkJUHlPYmplY3QgKnZhbCwgKnJlcHI7Ci0JCWNoYXIgKmNuYW1lLCAqY3JlcHI7CisgICAgZm9yIChpPTA7IGkgPCBWSVNJQkxFX1NJWkUob2JqKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2YWwsICpyZXByOworICAgICAgICBjaGFyICpjbmFtZSwgKmNyZXByOwogCi0JCWNuYW1lID0gdHlwLT50cF9tZW1iZXJzW2ldLm5hbWU7Ci0JCQotCQl2YWwgPSBQeVR1cGxlX0dldEl0ZW0odHVwLCBpKTsKLQkJaWYgKGNuYW1lID09IE5VTEwgfHwgdmFsID09IE5VTEwpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJlcHIgPSBQeU9iamVjdF9SZXByKHZhbCk7Ci0JCWlmIChyZXByID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih0dXApOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJY3JlcHIgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXByKTsKLQkJaWYgKGNyZXByID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih0dXApOwotCQkJUHlfREVDUkVGKHJlcHIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJCi0JCS8qICsgMzoga2VlcCBzcGFjZSBmb3IgIj0iIGFuZCAiLCAiICovCi0gCQlsZW4gPSBzdHJsZW4oY25hbWUpICsgc3RybGVuKGNyZXByKSArIDM7Ci0JCWlmICgocGJ1ZitsZW4pIDw9IGVuZG9mYnVmKSB7Ci0JCQlzdHJjcHkocGJ1ZiwgY25hbWUpOwotCQkJcGJ1ZiArPSBzdHJsZW4oY25hbWUpOwotCQkJKnBidWYrKyA9ICc9JzsKLQkJCXN0cmNweShwYnVmLCBjcmVwcik7Ci0JCQlwYnVmICs9IHN0cmxlbihjcmVwcik7Ci0JCQkqcGJ1ZisrID0gJywnOwotCQkJKnBidWYrKyA9ICcgJzsKLQkJCXJlbW92ZWxhc3QgPSAxOwotCQkJUHlfREVDUkVGKHJlcHIpOwotCQl9Ci0JCWVsc2UgewotCQkJc3RyY3B5KHBidWYsICIuLi4iKTsKLQkJCXBidWYgKz0gMzsKLQkJCXJlbW92ZWxhc3QgPSAwOwotCQkJUHlfREVDUkVGKHJlcHIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JUHlfREVDUkVGKHR1cCk7Ci0JaWYgKHJlbW92ZWxhc3QpIHsKLQkJLyogb3ZlcndyaXRlIGxhc3QgIiwgIiAqLwotCQlwYnVmLT0yOwotCX0KLQkqcGJ1ZisrID0gJyknOwotCSpwYnVmID0gJ1wwJzsKKyAgICAgICAgY25hbWUgPSB0eXAtPnRwX21lbWJlcnNbaV0ubmFtZTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgICAgIHZhbCA9IFB5VHVwbGVfR2V0SXRlbSh0dXAsIGkpOworICAgICAgICBpZiAoY25hbWUgPT0gTlVMTCB8fCB2YWwgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmVwciA9IFB5T2JqZWN0X1JlcHIodmFsKTsKKyAgICAgICAgaWYgKHJlcHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHR1cCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBjcmVwciA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcHIpOworICAgICAgICBpZiAoY3JlcHIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHR1cCk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVwcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8qICsgMzoga2VlcCBzcGFjZSBmb3IgIj0iIGFuZCAiLCAiICovCisgICAgICAgIGxlbiA9IHN0cmxlbihjbmFtZSkgKyBzdHJsZW4oY3JlcHIpICsgMzsKKyAgICAgICAgaWYgKChwYnVmK2xlbikgPD0gZW5kb2ZidWYpIHsKKyAgICAgICAgICAgIHN0cmNweShwYnVmLCBjbmFtZSk7CisgICAgICAgICAgICBwYnVmICs9IHN0cmxlbihjbmFtZSk7CisgICAgICAgICAgICAqcGJ1ZisrID0gJz0nOworICAgICAgICAgICAgc3RyY3B5KHBidWYsIGNyZXByKTsKKyAgICAgICAgICAgIHBidWYgKz0gc3RybGVuKGNyZXByKTsKKyAgICAgICAgICAgICpwYnVmKysgPSAnLCc7CisgICAgICAgICAgICAqcGJ1ZisrID0gJyAnOworICAgICAgICAgICAgcmVtb3ZlbGFzdCA9IDE7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVwcik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdHJjcHkocGJ1ZiwgIi4uLiIpOworICAgICAgICAgICAgcGJ1ZiArPSAzOworICAgICAgICAgICAgcmVtb3ZlbGFzdCA9IDA7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVwcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICBpZiAocmVtb3ZlbGFzdCkgeworICAgICAgICAvKiBvdmVyd3JpdGUgbGFzdCAiLCAiICovCisgICAgICAgIHBidWYtPTI7CisgICAgfQorICAgICpwYnVmKysgPSAnKSc7CisgICAgKnBidWYgPSAnXDAnOworCisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9jb25jYXQoUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqLCBQeU9iamVjdCAqYikKIHsKLQlQeU9iamVjdCAqdHVwLCAqcmVzdWx0OwotCXR1cCA9IG1ha2VfdHVwbGUob2JqKTsKLQlyZXN1bHQgPSBQeVNlcXVlbmNlX0NvbmNhdCh0dXAsIGIpOwotCVB5X0RFQ1JFRih0dXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnR1cCwgKnJlc3VsdDsKKyAgICB0dXAgPSBtYWtlX3R1cGxlKG9iaik7CisgICAgcmVzdWx0ID0gUHlTZXF1ZW5jZV9Db25jYXQodHVwLCBiKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RydWN0c2VxX3JlcGVhdChQeVN0cnVjdFNlcXVlbmNlICpvYmosIFB5X3NzaXplX3QgbikKIHsKLQlQeU9iamVjdCAqdHVwLCAqcmVzdWx0OwotCXR1cCA9IG1ha2VfdHVwbGUob2JqKTsKLQlyZXN1bHQgPSBQeVNlcXVlbmNlX1JlcGVhdCh0dXAsIG4pOwotCVB5X0RFQ1JFRih0dXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnR1cCwgKnJlc3VsdDsKKyAgICB0dXAgPSBtYWtlX3R1cGxlKG9iaik7CisgICAgcmVzdWx0ID0gUHlTZXF1ZW5jZV9SZXBlYXQodHVwLCBuKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBzdHJ1Y3RzZXFfY29udGFpbnMoUHlTdHJ1Y3RTZXF1ZW5jZSAqb2JqLCBQeU9iamVjdCAqbykKIHsKLQlQeU9iamVjdCAqdHVwOwotCWludCByZXN1bHQ7Ci0JdHVwID0gbWFrZV90dXBsZShvYmopOwotCWlmICghdHVwKQotCQlyZXR1cm4gLTE7Ci0JcmVzdWx0ID0gUHlTZXF1ZW5jZV9Db250YWlucyh0dXAsIG8pOwotCVB5X0RFQ1JFRih0dXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnR1cDsKKyAgICBpbnQgcmVzdWx0OworICAgIHR1cCA9IG1ha2VfdHVwbGUob2JqKTsKKyAgICBpZiAoIXR1cCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlc3VsdCA9IFB5U2VxdWVuY2VfQ29udGFpbnModHVwLCBvKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgbG9uZwogc3RydWN0c2VxX2hhc2goUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqdHVwOwotCWxvbmcgcmVzdWx0OwotCXR1cCA9IG1ha2VfdHVwbGUoKFB5U3RydWN0U2VxdWVuY2UqKSBvYmopOwotCWlmICghdHVwKQotCQlyZXR1cm4gLTE7Ci0JcmVzdWx0ID0gUHlPYmplY3RfSGFzaCh0dXApOwotCVB5X0RFQ1JFRih0dXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnR1cDsKKyAgICBsb25nIHJlc3VsdDsKKyAgICB0dXAgPSBtYWtlX3R1cGxlKChQeVN0cnVjdFNlcXVlbmNlKikgb2JqKTsKKyAgICBpZiAoIXR1cCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0hhc2godHVwKTsKKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RydWN0c2VxX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICpvMiwgaW50IG9wKQogewotCVB5T2JqZWN0ICp0dXAsICpyZXN1bHQ7Ci0JdHVwID0gbWFrZV90dXBsZSgoUHlTdHJ1Y3RTZXF1ZW5jZSopIG9iaik7Ci0JcmVzdWx0ID0gUHlPYmplY3RfUmljaENvbXBhcmUodHVwLCBvMiwgb3ApOwotCVB5X0RFQ1JFRih0dXApOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKnR1cCwgKnJlc3VsdDsKKyAgICB0dXAgPSBtYWtlX3R1cGxlKChQeVN0cnVjdFNlcXVlbmNlKikgb2JqKTsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9SaWNoQ29tcGFyZSh0dXAsIG8yLCBvcCk7CisgICAgUHlfREVDUkVGKHR1cCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN0cnVjdHNlcV9yZWR1Y2UoUHlTdHJ1Y3RTZXF1ZW5jZSogc2VsZikKIHsKLQlQeU9iamVjdCogdHVwOwotCVB5T2JqZWN0KiBkaWN0OwotCVB5T2JqZWN0KiByZXN1bHQ7Ci0JUHlfc3NpemVfdCBuX2ZpZWxkcywgbl92aXNpYmxlX2ZpZWxkcywgbl91bm5hbWVkX2ZpZWxkczsKLQlpbnQgaTsKLQkKLQluX2ZpZWxkcyA9IFJFQUxfU0laRShzZWxmKTsKLQluX3Zpc2libGVfZmllbGRzID0gVklTSUJMRV9TSVpFKHNlbGYpOwotCW5fdW5uYW1lZF9maWVsZHMgPSBVTk5BTUVEX0ZJRUxEUyhzZWxmKTsKLQl0dXAgPSBQeVR1cGxlX05ldyhuX3Zpc2libGVfZmllbGRzKTsKLQlpZiAoIXR1cCkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgUHlPYmplY3QqIHR1cDsKKyAgICBQeU9iamVjdCogZGljdDsKKyAgICBQeU9iamVjdCogcmVzdWx0OworICAgIFB5X3NzaXplX3Qgbl9maWVsZHMsIG5fdmlzaWJsZV9maWVsZHMsIG5fdW5uYW1lZF9maWVsZHM7CisgICAgaW50IGk7CiAKLQlkaWN0ID0gUHlEaWN0X05ldygpOwotCWlmICghZGljdCkgewotCQlQeV9ERUNSRUYodHVwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG5fZmllbGRzID0gUkVBTF9TSVpFKHNlbGYpOworICAgIG5fdmlzaWJsZV9maWVsZHMgPSBWSVNJQkxFX1NJWkUoc2VsZik7CisgICAgbl91bm5hbWVkX2ZpZWxkcyA9IFVOTkFNRURfRklFTERTKHNlbGYpOworICAgIHR1cCA9IFB5VHVwbGVfTmV3KG5fdmlzaWJsZV9maWVsZHMpOworICAgIGlmICghdHVwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBuX3Zpc2libGVfZmllbGRzOyBpKyspIHsKLQkJUHlfSU5DUkVGKHNlbGYtPm9iX2l0ZW1baV0pOwotCQlQeVR1cGxlX1NFVF9JVEVNKHR1cCwgaSwgc2VsZi0+b2JfaXRlbVtpXSk7Ci0JfQotCQotCWZvciAoOyBpIDwgbl9maWVsZHM7IGkrKykgewotCQljaGFyICpuID0gUHlfVFlQRShzZWxmKS0+dHBfbWVtYmVyc1tpLW5fdW5uYW1lZF9maWVsZHNdLm5hbWU7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG4sCi0JCQkJICAgICBzZWxmLT5vYl9pdGVtW2ldKTsKLQl9CisgICAgZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIWRpY3QpIHsKKyAgICAgICAgUHlfREVDUkVGKHR1cCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIihPKE9PKSkiLCBQeV9UWVBFKHNlbGYpLCB0dXAsIGRpY3QpOworICAgIGZvciAoaSA9IDA7IGkgPCBuX3Zpc2libGVfZmllbGRzOyBpKyspIHsKKyAgICAgICAgUHlfSU5DUkVGKHNlbGYtPm9iX2l0ZW1baV0pOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cCwgaSwgc2VsZi0+b2JfaXRlbVtpXSk7CisgICAgfQogCi0JUHlfREVDUkVGKHR1cCk7Ci0JUHlfREVDUkVGKGRpY3QpOworICAgIGZvciAoOyBpIDwgbl9maWVsZHM7IGkrKykgeworICAgICAgICBjaGFyICpuID0gUHlfVFlQRShzZWxmKS0+dHBfbWVtYmVyc1tpLW5fdW5uYW1lZF9maWVsZHNdLm5hbWU7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPm9iX2l0ZW1baV0pOworICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiKE8oT08pKSIsIFB5X1RZUEUoc2VsZiksIHR1cCwgZGljdCk7CisKKyAgICBQeV9ERUNSRUYodHVwKTsKKyAgICBQeV9ERUNSRUYoZGljdCk7CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgc3RydWN0c2VxX2FzX3NlcXVlbmNlID0gewotCShsZW5mdW5jKXN0cnVjdHNlcV9sZW5ndGgsCi0JKGJpbmFyeWZ1bmMpc3RydWN0c2VxX2NvbmNhdCwgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLwotCShzc2l6ZWFyZ2Z1bmMpc3RydWN0c2VxX3JlcGVhdCwgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KLQkoc3NpemVhcmdmdW5jKXN0cnVjdHNlcV9pdGVtLAkJLyogc3FfaXRlbSAqLwotCShzc2l6ZXNzaXplYXJnZnVuYylzdHJ1Y3RzZXFfc2xpY2UsCS8qIHNxX3NsaWNlICovCi0JMCwJCQkJCS8qIHNxX2Fzc19pdGVtICovCi0JMCwJCQkJCS8qIHNxX2Fzc19zbGljZSAqLwotCShvYmpvYmpwcm9jKXN0cnVjdHNlcV9jb250YWlucywJICAgICAgICAvKiBzcV9jb250YWlucyAqLworICAgIChsZW5mdW5jKXN0cnVjdHNlcV9sZW5ndGgsCisgICAgKGJpbmFyeWZ1bmMpc3RydWN0c2VxX2NvbmNhdCwgICAgICAgICAgIC8qIHNxX2NvbmNhdCAqLworICAgIChzc2l6ZWFyZ2Z1bmMpc3RydWN0c2VxX3JlcGVhdCwgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKXN0cnVjdHNlcV9pdGVtLCAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAoc3NpemVzc2l6ZWFyZ2Z1bmMpc3RydWN0c2VxX3NsaWNlLCAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2Mpc3RydWN0c2VxX2NvbnRhaW5zLCAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLwogfTsKIAogc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgc3RydWN0c2VxX2FzX21hcHBpbmcgPSB7Ci0JKGxlbmZ1bmMpc3RydWN0c2VxX2xlbmd0aCwKLQkoYmluYXJ5ZnVuYylzdHJ1Y3RzZXFfc3Vic2NyaXB0LAorICAgIChsZW5mdW5jKXN0cnVjdHNlcV9sZW5ndGgsCisgICAgKGJpbmFyeWZ1bmMpc3RydWN0c2VxX3N1YnNjcmlwdCwKIH07CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzdHJ1Y3RzZXFfbWV0aG9kc1tdID0gewotCXsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilzdHJ1Y3RzZXFfcmVkdWNlLCAKLQkgTUVUSF9OT0FSR1MsIE5VTEx9LAotCXtOVUxMLCBOVUxMfQorICAgIHsiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilzdHJ1Y3RzZXFfcmVkdWNlLAorICAgICBNRVRIX05PQVJHUywgTlVMTH0sCisgICAge05VTEwsIE5VTEx9CiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IF9zdHJ1Y3Rfc2VxdWVuY2VfdGVtcGxhdGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQlOVUxMLAkgICAgICAgICAgICAgICAgICAgICAJCS8qIHRwX25hbWUgKi8KLSAgICAgICAgMCwJCSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCSAgICAgICAgICAgICAgICAgICAgICAJCS8qIHRwX2l0ZW1zaXplICovCi0JKGRlc3RydWN0b3Ipc3RydWN0c2VxX2RlYWxsb2MsCSAgICAgICAgLyogdHBfZGVhbGxvYyAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLAkJCSAJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsICAgICAgICAgICAgICAgCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYylzdHJ1Y3RzZXFfcmVwciwgICAgICAgICAgICAgCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JJnN0cnVjdHNlcV9hc19zZXF1ZW5jZSwJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCSZzdHJ1Y3RzZXFfYXNfbWFwcGluZywJCQkvKiB0cF9hc19tYXBwaW5nICovCi0Jc3RydWN0c2VxX2hhc2gsCQkJCS8qIHRwX2hhc2ggKi8KLQkwLCAgICAgICAgICAgICAgCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCSAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KLQlOVUxMLAkgCQkgICAgICAgICAJLyogdHBfZG9jICovCi0JMCwJCQkJCS8qIHRwX3RyYXZlcnNlICovCi0JMCwJCQkJCS8qIHRwX2NsZWFyICovCi0Jc3RydWN0c2VxX3JpY2hjb21wYXJlLAkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0JMCwJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQlzdHJ1Y3RzZXFfbWV0aG9kcywgICAgICAJCS8qIHRwX21ldGhvZHMgKi8KLSAgICAgICAgTlVMTCwJCQkgICAgICAgICAgICAgCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCSAgICAgICAgICAJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQlzdHJ1Y3RzZXFfbmV3LAkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIChkZXN0cnVjdG9yKXN0cnVjdHNlcV9kZWFsbG9jLCAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpc3RydWN0c2VxX3JlcHIsICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICZzdHJ1Y3RzZXFfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmc3RydWN0c2VxX2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICBzdHJ1Y3RzZXFfaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgc3RydWN0c2VxX3JpY2hjb21wYXJlLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgc3RydWN0c2VxX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIHN0cnVjdHNlcV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCiB2b2lkCiBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlTdHJ1Y3RTZXF1ZW5jZV9EZXNjICpkZXNjKQogewotCVB5T2JqZWN0ICpkaWN0OwotCVB5TWVtYmVyRGVmKiBtZW1iZXJzOwotCWludCBuX21lbWJlcnMsIG5fdW5uYW1lZF9tZW1iZXJzLCBpLCBrOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5TWVtYmVyRGVmKiBtZW1iZXJzOworICAgIGludCBuX21lbWJlcnMsIG5fdW5uYW1lZF9tZW1iZXJzLCBpLCBrOwogCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwotCS8qIGlmIHRoZSB0eXBlIG9iamVjdCB3YXMgY2hhaW5lZCwgdW5jaGFpbiBpdCBmaXJzdAotCSAgIGJlZm9yZSBvdmVyd3JpdGluZyBpdHMgc3RvcmFnZSAqLwotCWlmICh0eXBlLT5fb2JfbmV4dCkgewotCQlfUHlfRm9yZ2V0UmVmZXJlbmNlKChQeU9iamVjdCopdHlwZSk7Ci0JfQorICAgIC8qIGlmIHRoZSB0eXBlIG9iamVjdCB3YXMgY2hhaW5lZCwgdW5jaGFpbiBpdCBmaXJzdAorICAgICAgIGJlZm9yZSBvdmVyd3JpdGluZyBpdHMgc3RvcmFnZSAqLworICAgIGlmICh0eXBlLT5fb2JfbmV4dCkgeworICAgICAgICBfUHlfRm9yZ2V0UmVmZXJlbmNlKChQeU9iamVjdCopdHlwZSk7CisgICAgfQogI2VuZGlmCiAKLQluX3VubmFtZWRfbWVtYmVycyA9IDA7Ci0JZm9yIChpID0gMDsgZGVzYy0+ZmllbGRzW2ldLm5hbWUgIT0gTlVMTDsgKytpKQotCQlpZiAoZGVzYy0+ZmllbGRzW2ldLm5hbWUgPT0gUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQpCi0JCQluX3VubmFtZWRfbWVtYmVycysrOwotCW5fbWVtYmVycyA9IGk7CisgICAgbl91bm5hbWVkX21lbWJlcnMgPSAwOworICAgIGZvciAoaSA9IDA7IGRlc2MtPmZpZWxkc1tpXS5uYW1lICE9IE5VTEw7ICsraSkKKyAgICAgICAgaWYgKGRlc2MtPmZpZWxkc1tpXS5uYW1lID09IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkKQorICAgICAgICAgICAgbl91bm5hbWVkX21lbWJlcnMrKzsKKyAgICBuX21lbWJlcnMgPSBpOwogCi0JbWVtY3B5KHR5cGUsICZfc3RydWN0X3NlcXVlbmNlX3RlbXBsYXRlLCBzaXplb2YoUHlUeXBlT2JqZWN0KSk7Ci0JdHlwZS0+dHBfbmFtZSA9IGRlc2MtPm5hbWU7Ci0JdHlwZS0+dHBfZG9jID0gZGVzYy0+ZG9jOwotCXR5cGUtPnRwX2Jhc2ljc2l6ZSA9IHNpemVvZihQeVN0cnVjdFNlcXVlbmNlKSsKLQkJc2l6ZW9mKFB5T2JqZWN0KikqKG5fbWVtYmVycy0xKTsKLQl0eXBlLT50cF9pdGVtc2l6ZSA9IDA7CisgICAgbWVtY3B5KHR5cGUsICZfc3RydWN0X3NlcXVlbmNlX3RlbXBsYXRlLCBzaXplb2YoUHlUeXBlT2JqZWN0KSk7CisgICAgdHlwZS0+dHBfbmFtZSA9IGRlc2MtPm5hbWU7CisgICAgdHlwZS0+dHBfZG9jID0gZGVzYy0+ZG9jOworICAgIHR5cGUtPnRwX2Jhc2ljc2l6ZSA9IHNpemVvZihQeVN0cnVjdFNlcXVlbmNlKSsKKyAgICAgICAgc2l6ZW9mKFB5T2JqZWN0KikqKG5fbWVtYmVycy0xKTsKKyAgICB0eXBlLT50cF9pdGVtc2l6ZSA9IDA7CiAKLQltZW1iZXJzID0gUHlNZW1fTkVXKFB5TWVtYmVyRGVmLCBuX21lbWJlcnMtbl91bm5hbWVkX21lbWJlcnMrMSk7Ci0JaWYgKG1lbWJlcnMgPT0gTlVMTCkKLQkJcmV0dXJuOwotCQotCWZvciAoaSA9IGsgPSAwOyBpIDwgbl9tZW1iZXJzOyArK2kpIHsKLQkJaWYgKGRlc2MtPmZpZWxkc1tpXS5uYW1lID09IFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkKQotCQkJY29udGludWU7Ci0JCW1lbWJlcnNba10ubmFtZSA9IGRlc2MtPmZpZWxkc1tpXS5uYW1lOwotCQltZW1iZXJzW2tdLnR5cGUgPSBUX09CSkVDVDsKLQkJbWVtYmVyc1trXS5vZmZzZXQgPSBvZmZzZXRvZihQeVN0cnVjdFNlcXVlbmNlLCBvYl9pdGVtKQotCQkgICsgaSAqIHNpemVvZihQeU9iamVjdCopOwotCQltZW1iZXJzW2tdLmZsYWdzID0gUkVBRE9OTFk7Ci0JCW1lbWJlcnNba10uZG9jID0gZGVzYy0+ZmllbGRzW2ldLmRvYzsKLQkJaysrOwotCX0KLQltZW1iZXJzW2tdLm5hbWUgPSBOVUxMOworICAgIG1lbWJlcnMgPSBQeU1lbV9ORVcoUHlNZW1iZXJEZWYsIG5fbWVtYmVycy1uX3VubmFtZWRfbWVtYmVycysxKTsKKyAgICBpZiAobWVtYmVycyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CiAKLQl0eXBlLT50cF9tZW1iZXJzID0gbWVtYmVyczsKKyAgICBmb3IgKGkgPSBrID0gMDsgaSA8IG5fbWVtYmVyczsgKytpKSB7CisgICAgICAgIGlmIChkZXNjLT5maWVsZHNbaV0ubmFtZSA9PSBQeVN0cnVjdFNlcXVlbmNlX1VubmFtZWRGaWVsZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBtZW1iZXJzW2tdLm5hbWUgPSBkZXNjLT5maWVsZHNbaV0ubmFtZTsKKyAgICAgICAgbWVtYmVyc1trXS50eXBlID0gVF9PQkpFQ1Q7CisgICAgICAgIG1lbWJlcnNba10ub2Zmc2V0ID0gb2Zmc2V0b2YoUHlTdHJ1Y3RTZXF1ZW5jZSwgb2JfaXRlbSkKKyAgICAgICAgICArIGkgKiBzaXplb2YoUHlPYmplY3QqKTsKKyAgICAgICAgbWVtYmVyc1trXS5mbGFncyA9IFJFQURPTkxZOworICAgICAgICBtZW1iZXJzW2tdLmRvYyA9IGRlc2MtPmZpZWxkc1tpXS5kb2M7CisgICAgICAgIGsrKzsKKyAgICB9CisgICAgbWVtYmVyc1trXS5uYW1lID0gTlVMTDsKIAotCWlmIChQeVR5cGVfUmVhZHkodHlwZSkgPCAwKQotCQlyZXR1cm47Ci0JUHlfSU5DUkVGKHR5cGUpOworICAgIHR5cGUtPnRwX21lbWJlcnMgPSBtZW1iZXJzOwogCi0JZGljdCA9IHR5cGUtPnRwX2RpY3Q7Ci0jZGVmaW5lIFNFVF9ESUNUX0ZST01fSU5UKGtleSwgdmFsdWUpCQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJUHlPYmplY3QgKnYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOwlcCi0JCWlmICh2ICE9IE5VTEwpIHsJCQkJXAotCQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwga2V5LCB2KTsJXAotCQkJUHlfREVDUkVGKHYpOwkJCQlcCi0JCX0JCQkJCQlcCi0JfSB3aGlsZSAoMCkKKyAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5X0lOQ1JFRih0eXBlKTsKIAotCVNFVF9ESUNUX0ZST01fSU5UKHZpc2libGVfbGVuZ3RoX2tleSwgZGVzYy0+bl9pbl9zZXF1ZW5jZSk7Ci0JU0VUX0RJQ1RfRlJPTV9JTlQocmVhbF9sZW5ndGhfa2V5LCBuX21lbWJlcnMpOwotCVNFVF9ESUNUX0ZST01fSU5UKHVubmFtZWRfZmllbGRzX2tleSwgbl91bm5hbWVkX21lbWJlcnMpOworICAgIGRpY3QgPSB0eXBlLT50cF9kaWN0OworI2RlZmluZSBTRVRfRElDVF9GUk9NX0lOVChrZXksIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsgICAgICAgICAgICAgXAorICAgICAgICBpZiAodiAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIGtleSwgdik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeV9ERUNSRUYodik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgU0VUX0RJQ1RfRlJPTV9JTlQodmlzaWJsZV9sZW5ndGhfa2V5LCBkZXNjLT5uX2luX3NlcXVlbmNlKTsKKyAgICBTRVRfRElDVF9GUk9NX0lOVChyZWFsX2xlbmd0aF9rZXksIG5fbWVtYmVycyk7CisgICAgU0VUX0RJQ1RfRlJPTV9JTlQodW5uYW1lZF9maWVsZHNfa2V5LCBuX3VubmFtZWRfbWVtYmVycyk7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3R1cGxlb2JqZWN0LmMgYi9PYmplY3RzL3R1cGxlb2JqZWN0LmMKaW5kZXggOTJmYzFmNC4uYmJjNzhmNCAxMDA2NDQKLS0tIGEvT2JqZWN0cy90dXBsZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHVwbGVvYmplY3QuYwpAQCAtNSw5ICs1LDkgQEAKIAogLyogU3BlZWQgb3B0aW1pemF0aW9uIHRvIGF2b2lkIGZyZXF1ZW50IG1hbGxvYy9mcmVlIG9mIHNtYWxsIHR1cGxlcyAqLwogI2lmbmRlZiBQeVR1cGxlX01BWFNBVkVTSVpFCi0jZGVmaW5lIFB5VHVwbGVfTUFYU0FWRVNJWkUJMjAgIC8qIExhcmdlc3QgdHVwbGUgdG8gc2F2ZSBvbiBmcmVlIGxpc3QgKi8KKyNkZWZpbmUgUHlUdXBsZV9NQVhTQVZFU0laRSAgICAgMjAgIC8qIExhcmdlc3QgdHVwbGUgdG8gc2F2ZSBvbiBmcmVlIGxpc3QgKi8KICNlbmRpZgotI2lmbmRlZiBQeVR1cGxlX01BWEZSRUVMSVNUIAorI2lmbmRlZiBQeVR1cGxlX01BWEZSRUVMSVNUCiAjZGVmaW5lIFB5VHVwbGVfTUFYRlJFRUxJU1QgIDIwMDAgIC8qIE1heGltdW0gbnVtYmVyIG9mIHR1cGxlcyBvZiBlYWNoIHNpemUgdG8gc2F2ZSAqLwogI2VuZGlmCiAKQEAgLTI2LDEzMiArMjYsMTMyIEBACiBQeU9iamVjdCAqCiBQeVR1cGxlX05ldyhyZWdpc3RlciBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JcmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqb3A7Ci0JUHlfc3NpemVfdCBpOwotCWlmIChzaXplIDwgMCkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKm9wOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNpZiBQeVR1cGxlX01BWFNBVkVTSVpFID4gMAotCWlmIChzaXplID09IDAgJiYgZnJlZV9saXN0WzBdKSB7Ci0JCW9wID0gZnJlZV9saXN0WzBdOwotCQlQeV9JTkNSRUYob3ApOworICAgIGlmIChzaXplID09IDAgJiYgZnJlZV9saXN0WzBdKSB7CisgICAgICAgIG9wID0gZnJlZV9saXN0WzBdOworICAgICAgICBQeV9JTkNSRUYob3ApOwogI2lmZGVmIENPVU5UX0FMTE9DUwotCQl0dXBsZV96ZXJvX2FsbG9jcysrOworICAgICAgICB0dXBsZV96ZXJvX2FsbG9jcysrOwogI2VuZGlmCi0JCXJldHVybiAoUHlPYmplY3QgKikgb3A7Ci0JfQotCWlmIChzaXplIDwgUHlUdXBsZV9NQVhTQVZFU0laRSAmJiAob3AgPSBmcmVlX2xpc3Rbc2l6ZV0pICE9IE5VTEwpIHsKLQkJZnJlZV9saXN0W3NpemVdID0gKFB5VHVwbGVPYmplY3QgKikgb3AtPm9iX2l0ZW1bMF07Ci0JCW51bWZyZWVbc2l6ZV0tLTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKKyAgICB9CisgICAgaWYgKHNpemUgPCBQeVR1cGxlX01BWFNBVkVTSVpFICYmIChvcCA9IGZyZWVfbGlzdFtzaXplXSkgIT0gTlVMTCkgeworICAgICAgICBmcmVlX2xpc3Rbc2l6ZV0gPSAoUHlUdXBsZU9iamVjdCAqKSBvcC0+b2JfaXRlbVswXTsKKyAgICAgICAgbnVtZnJlZVtzaXplXS0tOwogI2lmZGVmIENPVU5UX0FMTE9DUwotCQlmYXN0X3R1cGxlX2FsbG9jcysrOworICAgICAgICBmYXN0X3R1cGxlX2FsbG9jcysrOwogI2VuZGlmCi0JCS8qIElubGluZSBQeU9iamVjdF9Jbml0VmFyICovCisgICAgICAgIC8qIElubGluZSBQeU9iamVjdF9Jbml0VmFyICovCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwotCQlQeV9TSVpFKG9wKSA9IHNpemU7Ci0JCVB5X1RZUEUob3ApID0gJlB5VHVwbGVfVHlwZTsKKyAgICAgICAgUHlfU0laRShvcCkgPSBzaXplOworICAgICAgICBQeV9UWVBFKG9wKSA9ICZQeVR1cGxlX1R5cGU7CiAjZW5kaWYKLQkJX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilvcCk7Ci0JfQotCWVsc2UKKyAgICAgICAgX1B5X05ld1JlZmVyZW5jZSgoUHlPYmplY3QgKilvcCk7CisgICAgfQorICAgIGVsc2UKICNlbmRpZgotCXsKLQkJUHlfc3NpemVfdCBuYnl0ZXMgPSBzaXplICogc2l6ZW9mKFB5T2JqZWN0ICopOwotCQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLQkJaWYgKG5ieXRlcyAvIHNpemVvZihQeU9iamVjdCAqKSAhPSAoc2l6ZV90KXNpemUgfHwKLQkJICAgIChuYnl0ZXMgPiBQWV9TU0laRV9UX01BWCAtIHNpemVvZihQeVR1cGxlT2JqZWN0KSAtIHNpemVvZihQeU9iamVjdCAqKSkpCi0JCXsKLQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCQl9Ci0JCW5ieXRlcyArPSBzaXplb2YoUHlUdXBsZU9iamVjdCkgLSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgeworICAgICAgICBQeV9zc2l6ZV90IG5ieXRlcyA9IHNpemUgKiBzaXplb2YoUHlPYmplY3QgKik7CisgICAgICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLworICAgICAgICBpZiAobmJ5dGVzIC8gc2l6ZW9mKFB5T2JqZWN0ICopICE9IChzaXplX3Qpc2l6ZSB8fAorICAgICAgICAgICAgKG5ieXRlcyA+IFBZX1NTSVpFX1RfTUFYIC0gc2l6ZW9mKFB5VHVwbGVPYmplY3QpIC0gc2l6ZW9mKFB5T2JqZWN0ICopKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgbmJ5dGVzICs9IHNpemVvZihQeVR1cGxlT2JqZWN0KSAtIHNpemVvZihQeU9iamVjdCAqKTsKIAotCQlvcCA9IFB5T2JqZWN0X0dDX05ld1ZhcihQeVR1cGxlT2JqZWN0LCAmUHlUdXBsZV9UeXBlLCBzaXplKTsKLQkJaWYgKG9wID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZm9yIChpPTA7IGkgPCBzaXplOyBpKyspCi0JCW9wLT5vYl9pdGVtW2ldID0gTlVMTDsKKyAgICAgICAgb3AgPSBQeU9iamVjdF9HQ19OZXdWYXIoUHlUdXBsZU9iamVjdCwgJlB5VHVwbGVfVHlwZSwgc2l6ZSk7CisgICAgICAgIGlmIChvcCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaT0wOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICBvcC0+b2JfaXRlbVtpXSA9IE5VTEw7CiAjaWYgUHlUdXBsZV9NQVhTQVZFU0laRSA+IDAKLQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCWZyZWVfbGlzdFswXSA9IG9wOwotCQkrK251bWZyZWVbMF07Ci0JCVB5X0lOQ1JFRihvcCk7CS8qIGV4dHJhIElOQ1JFRiBzbyB0aGF0IHRoaXMgaXMgbmV2ZXIgZnJlZWQgKi8KLQl9CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBmcmVlX2xpc3RbMF0gPSBvcDsKKyAgICAgICAgKytudW1mcmVlWzBdOworICAgICAgICBQeV9JTkNSRUYob3ApOyAgICAgICAgICAvKiBleHRyYSBJTkNSRUYgc28gdGhhdCB0aGlzIGlzIG5ldmVyIGZyZWVkICovCisgICAgfQogI2VuZGlmCi0JX1B5T2JqZWN0X0dDX1RSQUNLKG9wKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopIG9wOworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvcCk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBvcDsKIH0KIAogUHlfc3NpemVfdAogUHlUdXBsZV9TaXplKHJlZ2lzdGVyIFB5T2JqZWN0ICpvcCkKIHsKLQlpZiAoIVB5VHVwbGVfQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5X1NJWkUob3ApOworICAgIGlmICghUHlUdXBsZV9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlfU0laRShvcCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5VHVwbGVfR2V0SXRlbShyZWdpc3RlciBQeU9iamVjdCAqb3AsIHJlZ2lzdGVyIFB5X3NzaXplX3QgaSkKIHsKLQlpZiAoIVB5VHVwbGVfQ2hlY2sob3ApKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShvcCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiAoKFB5VHVwbGVPYmplY3QgKilvcCkgLT4gb2JfaXRlbVtpXTsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2sob3ApKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShvcCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKFB5VHVwbGVPYmplY3QgKilvcCkgLT4gb2JfaXRlbVtpXTsKIH0KIAogaW50CiBQeVR1cGxlX1NldEl0ZW0ocmVnaXN0ZXIgUHlPYmplY3QgKm9wLCByZWdpc3RlciBQeV9zc2l6ZV90IGksIFB5T2JqZWN0ICpuZXdpdGVtKQogewotCXJlZ2lzdGVyIFB5T2JqZWN0ICpvbGRpdGVtOwotCXJlZ2lzdGVyIFB5T2JqZWN0ICoqcDsKLQlpZiAoIVB5VHVwbGVfQ2hlY2sob3ApIHx8IG9wLT5vYl9yZWZjbnQgIT0gMSkgewotCQlQeV9YREVDUkVGKG5ld2l0ZW0pOwotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKG9wKSkgewotCQlQeV9YREVDUkVGKG5ld2l0ZW0pOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkidHVwbGUgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlwID0gKChQeVR1cGxlT2JqZWN0ICopb3ApIC0+IG9iX2l0ZW0gKyBpOwotCW9sZGl0ZW0gPSAqcDsKLQkqcCA9IG5ld2l0ZW07Ci0JUHlfWERFQ1JFRihvbGRpdGVtKTsKLQlyZXR1cm4gMDsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqb2xkaXRlbTsKKyAgICByZWdpc3RlciBQeU9iamVjdCAqKnA7CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKG9wKSB8fCBvcC0+b2JfcmVmY250ICE9IDEpIHsKKyAgICAgICAgUHlfWERFQ1JFRihuZXdpdGVtKTsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShvcCkpIHsKKyAgICAgICAgUHlfWERFQ1JFRihuZXdpdGVtKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidHVwbGUgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBwID0gKChQeVR1cGxlT2JqZWN0ICopb3ApIC0+IG9iX2l0ZW0gKyBpOworICAgIG9sZGl0ZW0gPSAqcDsKKyAgICAqcCA9IG5ld2l0ZW07CisgICAgUHlfWERFQ1JFRihvbGRpdGVtKTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlPYmplY3QgKgogUHlUdXBsZV9QYWNrKFB5X3NzaXplX3QgbiwgLi4uKQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqbzsKLQlQeU9iamVjdCAqcmVzdWx0OwotCVB5T2JqZWN0ICoqaXRlbXM7Ci0JdmFfbGlzdCB2YXJnczsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKm87CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqKml0ZW1zOworICAgIHZhX2xpc3QgdmFyZ3M7CiAKLQl2YV9zdGFydCh2YXJncywgbik7Ci0JcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpdGVtcyA9ICgoUHlUdXBsZU9iamVjdCAqKXJlc3VsdCktPm9iX2l0ZW07Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlvID0gdmFfYXJnKHZhcmdzLCBQeU9iamVjdCAqKTsKLQkJUHlfSU5DUkVGKG8pOwotCQlpdGVtc1tpXSA9IG87Ci0JfQotCXZhX2VuZCh2YXJncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB2YV9zdGFydCh2YXJncywgbik7CisgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcobik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdGVtcyA9ICgoUHlUdXBsZU9iamVjdCAqKXJlc3VsdCktPm9iX2l0ZW07CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBvID0gdmFfYXJnKHZhcmdzLCBQeU9iamVjdCAqKTsKKyAgICAgICAgUHlfSU5DUkVGKG8pOworICAgICAgICBpdGVtc1tpXSA9IG87CisgICAgfQorICAgIHZhX2VuZCh2YXJncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogCkBAIC0xNjAsNDMwICsxNjAsNDMwIEBACiBzdGF0aWMgdm9pZAogdHVwbGVkZWFsbG9jKHJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKm9wKQogewotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGxlbiA9ICBQeV9TSVpFKG9wKTsKLQlQeU9iamVjdF9HQ19VblRyYWNrKG9wKTsKLQlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG9wKQotCWlmIChsZW4gPiAwKSB7Ci0JCWkgPSBsZW47Ci0JCXdoaWxlICgtLWkgPj0gMCkKLQkJCVB5X1hERUNSRUYob3AtPm9iX2l0ZW1baV0pOworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGxlbiA9ICBQeV9TSVpFKG9wKTsKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKG9wKTsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG9wKQorICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIGkgPSBsZW47CisgICAgICAgIHdoaWxlICgtLWkgPj0gMCkKKyAgICAgICAgICAgIFB5X1hERUNSRUYob3AtPm9iX2l0ZW1baV0pOwogI2lmIFB5VHVwbGVfTUFYU0FWRVNJWkUgPiAwCi0JCWlmIChsZW4gPCBQeVR1cGxlX01BWFNBVkVTSVpFICYmCi0JCSAgICBudW1mcmVlW2xlbl0gPCBQeVR1cGxlX01BWEZSRUVMSVNUICYmCi0JCSAgICBQeV9UWVBFKG9wKSA9PSAmUHlUdXBsZV9UeXBlKQotCQl7Ci0JCQlvcC0+b2JfaXRlbVswXSA9IChQeU9iamVjdCAqKSBmcmVlX2xpc3RbbGVuXTsKLQkJCW51bWZyZWVbbGVuXSsrOwotCQkJZnJlZV9saXN0W2xlbl0gPSBvcDsKLQkJCWdvdG8gZG9uZTsgLyogcmV0dXJuICovCi0JCX0KKyAgICAgICAgaWYgKGxlbiA8IFB5VHVwbGVfTUFYU0FWRVNJWkUgJiYKKyAgICAgICAgICAgIG51bWZyZWVbbGVuXSA8IFB5VHVwbGVfTUFYRlJFRUxJU1QgJiYKKyAgICAgICAgICAgIFB5X1RZUEUob3ApID09ICZQeVR1cGxlX1R5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wLT5vYl9pdGVtWzBdID0gKFB5T2JqZWN0ICopIGZyZWVfbGlzdFtsZW5dOworICAgICAgICAgICAgbnVtZnJlZVtsZW5dKys7CisgICAgICAgICAgICBmcmVlX2xpc3RbbGVuXSA9IG9wOworICAgICAgICAgICAgZ290byBkb25lOyAvKiByZXR1cm4gKi8KKyAgICAgICAgfQogI2VuZGlmCi0JfQotCVB5X1RZUEUob3ApLT50cF9mcmVlKChQeU9iamVjdCAqKW9wKTsKKyAgICB9CisgICAgUHlfVFlQRShvcCktPnRwX2ZyZWUoKFB5T2JqZWN0ICopb3ApOwogZG9uZToKLQlQeV9UUkFTSENBTl9TQUZFX0VORChvcCkKKyAgICBQeV9UUkFTSENBTl9TQUZFX0VORChvcCkKIH0KIAogc3RhdGljIGludAogdHVwbGVwcmludChQeVR1cGxlT2JqZWN0ICpvcCwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWZwcmludGYoZnAsICIoIik7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShvcCk7IGkrKykgewotCQlpZiAoaSA+IDApIHsKLQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJCWZwcmludGYoZnAsICIsICIpOwotCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJfQotCQlpZiAoUHlPYmplY3RfUHJpbnQob3AtPm9iX2l0ZW1baV0sIGZwLCAwKSAhPSAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQlpID0gUHlfU0laRShvcCk7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWlmIChpID09IDEpCi0JCWZwcmludGYoZnAsICIsIik7Ci0JZnByaW50ZihmcCwgIikiKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXJldHVybiAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgZnByaW50ZihmcCwgIigiKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKG9wKTsgaSsrKSB7CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICAgICAgZnByaW50ZihmcCwgIiwgIik7CisgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICB9CisgICAgICAgIGlmIChQeU9iamVjdF9QcmludChvcC0+b2JfaXRlbVtpXSwgZnAsIDApICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGkgPSBQeV9TSVpFKG9wKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgaWYgKGkgPT0gMSkKKyAgICAgICAgZnByaW50ZihmcCwgIiwiKTsKKyAgICBmcHJpbnRmKGZwLCAiKSIpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZXJlcHIoUHlUdXBsZU9iamVjdCAqdikKIHsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKnMsICp0ZW1wOwotCVB5T2JqZWN0ICpwaWVjZXMsICpyZXN1bHQgPSBOVUxMOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqcywgKnRlbXA7CisgICAgUHlPYmplY3QgKnBpZWNlcywgKnJlc3VsdCA9IE5VTEw7CiAKLQluID0gUHlfU0laRSh2KTsKLQlpZiAobiA9PSAwKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiKCkiKTsKKyAgICBuID0gUHlfU0laRSh2KTsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiKCkiKTsKIAotCS8qIFdoaWxlIG5vdCBtdXRhYmxlLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBlbmQgdXAgd2l0aCBhIGN5Y2xlIGluIGEKLQkgICB0dXBsZSB0aHJvdWdoIGFuIG9iamVjdCB0aGF0IHN0b3JlcyBpdHNlbGYgd2l0aGluIGEgdHVwbGUgKGFuZCB0aHVzCi0JICAgaW5maW5pdGVseSBhc2tzIGZvciB0aGUgcmVwciBvZiBpdHNlbGYpLiBUaGlzIHNob3VsZCBvbmx5IGJlCi0JICAgcG9zc2libGUgd2l0aGluIGEgdHlwZS4gKi8KLQlpID0gUHlfUmVwckVudGVyKChQeU9iamVjdCAqKXYpOwotCWlmIChpICE9IDApIHsKLQkJcmV0dXJuIGkgPiAwID8gUHlTdHJpbmdfRnJvbVN0cmluZygiKC4uLikiKSA6IE5VTEw7Ci0JfQorICAgIC8qIFdoaWxlIG5vdCBtdXRhYmxlLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBlbmQgdXAgd2l0aCBhIGN5Y2xlIGluIGEKKyAgICAgICB0dXBsZSB0aHJvdWdoIGFuIG9iamVjdCB0aGF0IHN0b3JlcyBpdHNlbGYgd2l0aGluIGEgdHVwbGUgKGFuZCB0aHVzCisgICAgICAgaW5maW5pdGVseSBhc2tzIGZvciB0aGUgcmVwciBvZiBpdHNlbGYpLiBUaGlzIHNob3VsZCBvbmx5IGJlCisgICAgICAgcG9zc2libGUgd2l0aGluIGEgdHlwZS4gKi8KKyAgICBpID0gUHlfUmVwckVudGVyKChQeU9iamVjdCAqKXYpOworICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGkgPiAwID8gUHlTdHJpbmdfRnJvbVN0cmluZygiKC4uLikiKSA6IE5VTEw7CisgICAgfQogCi0JcGllY2VzID0gUHlUdXBsZV9OZXcobik7Ci0JaWYgKHBpZWNlcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBwaWVjZXMgPSBQeVR1cGxlX05ldyhuKTsKKyAgICBpZiAocGllY2VzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogRG8gcmVwcigpIG9uIGVhY2ggZWxlbWVudC4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiB3aGlsZSBnZXR0aW5nIHRoZSByZXByIG9mIGEgdHVwbGUiKSkKLQkJCWdvdG8gRG9uZTsKLQkJcyA9IFB5T2JqZWN0X1JlcHIodi0+b2JfaXRlbVtpXSk7Ci0JCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCQlpZiAocyA9PSBOVUxMKQotCQkJZ290byBEb25lOwotCQlQeVR1cGxlX1NFVF9JVEVNKHBpZWNlcywgaSwgcyk7Ci0JfQorICAgIC8qIERvIHJlcHIoKSBvbiBlYWNoIGVsZW1lbnQuICovCisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgd2hpbGUgZ2V0dGluZyB0aGUgcmVwciBvZiBhIHR1cGxlIikpCisgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgIHMgPSBQeU9iamVjdF9SZXByKHYtPm9iX2l0ZW1baV0pOworICAgICAgICBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShwaWVjZXMsIGksIHMpOworICAgIH0KIAotCS8qIEFkZCAiKCkiIGRlY29yYXRpb25zIHRvIHRoZSBmaXJzdCBhbmQgbGFzdCBpdGVtcy4gKi8KLQlhc3NlcnQobiA+IDApOwotCXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIoIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXRlbXAgPSBQeVR1cGxlX0dFVF9JVEVNKHBpZWNlcywgMCk7Ci0JUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0ZW1wKTsKLQlQeVR1cGxlX1NFVF9JVEVNKHBpZWNlcywgMCwgcyk7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOworICAgIC8qIEFkZCAiKCkiIGRlY29yYXRpb25zIHRvIHRoZSBmaXJzdCBhbmQgbGFzdCBpdGVtcy4gKi8KKyAgICBhc3NlcnQobiA+IDApOworICAgIHMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIoIik7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOworICAgIHRlbXAgPSBQeVR1cGxlX0dFVF9JVEVNKHBpZWNlcywgMCk7CisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzLCB0ZW1wKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHBpZWNlcywgMCwgcyk7CisgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobiA9PSAxID8gIiwpIiA6ICIpIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXRlbXAgPSBQeVR1cGxlX0dFVF9JVEVNKHBpZWNlcywgbi0xKTsKLQlQeVN0cmluZ19Db25jYXRBbmREZWwoJnRlbXAsIHMpOwotCVB5VHVwbGVfU0VUX0lURU0ocGllY2VzLCBuLTEsIHRlbXApOwotCWlmICh0ZW1wID09IE5VTEwpCi0JCWdvdG8gRG9uZTsKKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuID09IDEgPyAiLCkiIDogIikiKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgdGVtcCA9IFB5VHVwbGVfR0VUX0lURU0ocGllY2VzLCBuLTEpOworICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmdGVtcCwgcyk7CisgICAgUHlUdXBsZV9TRVRfSVRFTShwaWVjZXMsIG4tMSwgdGVtcCk7CisgICAgaWYgKHRlbXAgPT0gTlVMTCkKKyAgICAgICAgZ290byBEb25lOwogCi0JLyogUGFzdGUgdGhlbSBhbGwgdG9nZXRoZXIgd2l0aCAiLCAiIGJldHdlZW4uICovCi0JcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwgIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkJZ290byBEb25lOwotCXJlc3VsdCA9IF9QeVN0cmluZ19Kb2luKHMsIHBpZWNlcyk7Ci0JUHlfREVDUkVGKHMpOwkKKyAgICAvKiBQYXN0ZSB0aGVtIGFsbCB0b2dldGhlciB3aXRoICIsICIgYmV0d2Vlbi4gKi8KKyAgICBzID0gUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKTsKKyAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICBnb3RvIERvbmU7CisgICAgcmVzdWx0ID0gX1B5U3RyaW5nX0pvaW4ocywgcGllY2VzKTsKKyAgICBQeV9ERUNSRUYocyk7CiAKIERvbmU6Ci0JUHlfREVDUkVGKHBpZWNlcyk7Ci0JUHlfUmVwckxlYXZlKChQeU9iamVjdCAqKXYpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlfREVDUkVGKHBpZWNlcyk7CisgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCAqKXYpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLS8qIFRoZSBhZGRlbmQgODI1MjAsIHdhcyBzZWxlY3RlZCBmcm9tIHRoZSByYW5nZSgwLCAxMDAwMDAwKSBmb3IgCi0gICBnZW5lcmF0aW5nIHRoZSBncmVhdGVzdCBudW1iZXIgb2YgcHJpbWUgbXVsdGlwbGllcnMgZm9yIHR1cGxlcyAKKy8qIFRoZSBhZGRlbmQgODI1MjAsIHdhcyBzZWxlY3RlZCBmcm9tIHRoZSByYW5nZSgwLCAxMDAwMDAwKSBmb3IKKyAgIGdlbmVyYXRpbmcgdGhlIGdyZWF0ZXN0IG51bWJlciBvZiBwcmltZSBtdWx0aXBsaWVycyBmb3IgdHVwbGVzCiAgICB1cHRvIGxlbmd0aCBlaWdodDoKIAotICAgICAxMDgyNTI3LCAxMTY1MDQ5LCAxMDgyNTMxLCAxMTY1MDU3LCAxMjQ3NTgxLCAxMzMwMTAzLCAxMDgyNTMzLCAKKyAgICAgMTA4MjUyNywgMTE2NTA0OSwgMTA4MjUzMSwgMTE2NTA1NywgMTI0NzU4MSwgMTMzMDEwMywgMTA4MjUzMywKICAgICAgMTMzMDExMSwgMTQxMjYzMywgMTE2NTA2OSwgMTI0NzU5OSwgMTQ5NTE3NywgMTU3NzY5OQogKi8KIAogc3RhdGljIGxvbmcKIHR1cGxlaGFzaChQeVR1cGxlT2JqZWN0ICp2KQogewotCXJlZ2lzdGVyIGxvbmcgeCwgeTsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGxlbiA9IFB5X1NJWkUodik7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKipwOwotCWxvbmcgbXVsdCA9IDEwMDAwMDNMOwotCXggPSAweDM0NTY3OEw7Ci0JcCA9IHYtPm9iX2l0ZW07Ci0Jd2hpbGUgKC0tbGVuID49IDApIHsKLQkJeSA9IFB5T2JqZWN0X0hhc2goKnArKyk7Ci0JCWlmICh5ID09IC0xKQotCQkJcmV0dXJuIC0xOwotCQl4ID0gKHggXiB5KSAqIG11bHQ7Ci0JCS8qIHRoZSBjYXN0IG1pZ2h0IHRydW5jYXRlIGxlbjsgdGhhdCBkb2Vzbid0IGNoYW5nZSBoYXNoIHN0YWJpbGl0eSAqLwotCQltdWx0ICs9IChsb25nKSg4MjUyMEwgKyBsZW4gKyBsZW4pOwotCX0KLQl4ICs9IDk3NTMxTDsKLQlpZiAoeCA9PSAtMSkKLQkJeCA9IC0yOwotCXJldHVybiB4OworICAgIHJlZ2lzdGVyIGxvbmcgeCwgeTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGxlbiA9IFB5X1NJWkUodik7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKipwOworICAgIGxvbmcgbXVsdCA9IDEwMDAwMDNMOworICAgIHggPSAweDM0NTY3OEw7CisgICAgcCA9IHYtPm9iX2l0ZW07CisgICAgd2hpbGUgKC0tbGVuID49IDApIHsKKyAgICAgICAgeSA9IFB5T2JqZWN0X0hhc2goKnArKyk7CisgICAgICAgIGlmICh5ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB4ID0gKHggXiB5KSAqIG11bHQ7CisgICAgICAgIC8qIHRoZSBjYXN0IG1pZ2h0IHRydW5jYXRlIGxlbjsgdGhhdCBkb2Vzbid0IGNoYW5nZSBoYXNoIHN0YWJpbGl0eSAqLworICAgICAgICBtdWx0ICs9IChsb25nKSg4MjUyMEwgKyBsZW4gKyBsZW4pOworICAgIH0KKyAgICB4ICs9IDk3NTMxTDsKKyAgICBpZiAoeCA9PSAtMSkKKyAgICAgICAgeCA9IC0yOworICAgIHJldHVybiB4OwogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogdHVwbGVsZW5ndGgoUHlUdXBsZU9iamVjdCAqYSkKIHsKLQlyZXR1cm4gUHlfU0laRShhKTsKKyAgICByZXR1cm4gUHlfU0laRShhKTsKIH0KIAogc3RhdGljIGludAogdHVwbGVjb250YWlucyhQeVR1cGxlT2JqZWN0ICphLCBQeU9iamVjdCAqZWwpCiB7Ci0JUHlfc3NpemVfdCBpOwotCWludCBjbXA7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCBjbXA7CiAKLQlmb3IgKGkgPSAwLCBjbXAgPSAwIDsgY21wID09IDAgJiYgaSA8IFB5X1NJWkUoYSk7ICsraSkKLQkJY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsLCBQeVR1cGxlX0dFVF9JVEVNKGEsIGkpLAotCQkJCQkJICAgUHlfRVEpOwotCXJldHVybiBjbXA7CisgICAgZm9yIChpID0gMCwgY21wID0gMCA7IGNtcCA9PSAwICYmIGkgPCBQeV9TSVpFKGEpOyArK2kpCisgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChlbCwgUHlUdXBsZV9HRVRfSVRFTShhLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9FUSk7CisgICAgcmV0dXJuIGNtcDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlaXRlbShyZWdpc3RlciBQeVR1cGxlT2JqZWN0ICphLCByZWdpc3RlciBQeV9zc2l6ZV90IGkpCiB7Ci0JaWYgKGkgPCAwIHx8IGkgPj0gUHlfU0laRShhKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgInR1cGxlIGluZGV4IG91dCBvZiByYW5nZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKGEtPm9iX2l0ZW1baV0pOwotCXJldHVybiBhLT5vYl9pdGVtW2ldOworICAgIGlmIChpIDwgMCB8fCBpID49IFB5X1NJWkUoYSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJ0dXBsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihhLT5vYl9pdGVtW2ldKTsKKyAgICByZXR1cm4gYS0+b2JfaXRlbVtpXTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXR1cGxlc2xpY2UocmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqYSwgcmVnaXN0ZXIgUHlfc3NpemVfdCBpbG93LCAKLQkgICByZWdpc3RlciBQeV9zc2l6ZV90IGloaWdoKQordHVwbGVzbGljZShyZWdpc3RlciBQeVR1cGxlT2JqZWN0ICphLCByZWdpc3RlciBQeV9zc2l6ZV90IGlsb3csCisgICAgICAgICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgaWhpZ2gpCiB7Ci0JcmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqbnA7Ci0JUHlPYmplY3QgKipzcmMsICoqZGVzdDsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IGk7Ci0JUHlfc3NpemVfdCBsZW47Ci0JaWYgKGlsb3cgPCAwKQotCQlpbG93ID0gMDsKLQlpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQotCQlpaGlnaCA9IFB5X1NJWkUoYSk7Ci0JaWYgKGloaWdoIDwgaWxvdykKLQkJaWhpZ2ggPSBpbG93OwotCWlmIChpbG93ID09IDAgJiYgaWhpZ2ggPT0gUHlfU0laRShhKSAmJiBQeVR1cGxlX0NoZWNrRXhhY3QoYSkpIHsKLQkJUHlfSU5DUkVGKGEpOwotCQlyZXR1cm4gKFB5T2JqZWN0ICopYTsKLQl9Ci0JbGVuID0gaWhpZ2ggLSBpbG93OwotCW5wID0gKFB5VHVwbGVPYmplY3QgKilQeVR1cGxlX05ldyhsZW4pOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzcmMgPSBhLT5vYl9pdGVtICsgaWxvdzsKLQlkZXN0ID0gbnAtPm9iX2l0ZW07Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gc3JjW2ldOwotCQlQeV9JTkNSRUYodik7Ci0JCWRlc3RbaV0gPSB2OwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbnA7CisgICAgcmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqbnA7CisgICAgUHlPYmplY3QgKipzcmMsICoqZGVzdDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgaWYgKGlsb3cgPCAwKQorICAgICAgICBpbG93ID0gMDsKKyAgICBpZiAoaWhpZ2ggPiBQeV9TSVpFKGEpKQorICAgICAgICBpaGlnaCA9IFB5X1NJWkUoYSk7CisgICAgaWYgKGloaWdoIDwgaWxvdykKKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgIGlmIChpbG93ID09IDAgJiYgaWhpZ2ggPT0gUHlfU0laRShhKSAmJiBQeVR1cGxlX0NoZWNrRXhhY3QoYSkpIHsKKyAgICAgICAgUHlfSU5DUkVGKGEpOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopYTsKKyAgICB9CisgICAgbGVuID0gaWhpZ2ggLSBpbG93OworICAgIG5wID0gKFB5VHVwbGVPYmplY3QgKilQeVR1cGxlX05ldyhsZW4pOworICAgIGlmIChucCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzcmMgPSBhLT5vYl9pdGVtICsgaWxvdzsKKyAgICBkZXN0ID0gbnAtPm9iX2l0ZW07CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gc3JjW2ldOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIGRlc3RbaV0gPSB2OworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbnA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5VHVwbGVfR2V0U2xpY2UoUHlPYmplY3QgKm9wLCBQeV9zc2l6ZV90IGksIFB5X3NzaXplX3QgaikKIHsKLQlpZiAob3AgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhvcCkpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gdHVwbGVzbGljZSgoUHlUdXBsZU9iamVjdCAqKW9wLCBpLCBqKTsKKyAgICBpZiAob3AgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhvcCkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gdHVwbGVzbGljZSgoUHlUdXBsZU9iamVjdCAqKW9wLCBpLCBqKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlY29uY2F0KHJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKmEsIHJlZ2lzdGVyIFB5T2JqZWN0ICpiYikKIHsKLQlyZWdpc3RlciBQeV9zc2l6ZV90IHNpemU7Ci0JcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwotCVB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7Ci0JUHlUdXBsZU9iamVjdCAqbnA7Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKGJiKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgIAkJICAgICAiY2FuIG9ubHkgY29uY2F0ZW5hdGUgdHVwbGUgKG5vdCBcIiUuMjAwc1wiKSB0byB0dXBsZSIsCi0JCQkgICAgIFB5X1RZUEUoYmIpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHJlZ2lzdGVyIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKipzcmMsICoqZGVzdDsKKyAgICBQeVR1cGxlT2JqZWN0ICpucDsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYmIpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgImNhbiBvbmx5IGNvbmNhdGVuYXRlIHR1cGxlIChub3QgXCIlLjIwMHNcIikgdG8gdHVwbGUiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKGJiKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNkZWZpbmUgYiAoKFB5VHVwbGVPYmplY3QgKiliYikKLQlzaXplID0gUHlfU0laRShhKSArIFB5X1NJWkUoYik7Ci0JaWYgKHNpemUgPCAwKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlucCA9IChQeVR1cGxlT2JqZWN0ICopIFB5VHVwbGVfTmV3KHNpemUpOwotCWlmIChucCA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzcmMgPSBhLT5vYl9pdGVtOwotCWRlc3QgPSBucC0+b2JfaXRlbTsKLQlmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShhKTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp2ID0gc3JjW2ldOwotCQlQeV9JTkNSRUYodik7Ci0JCWRlc3RbaV0gPSB2OwotCX0KLQlzcmMgPSBiLT5vYl9pdGVtOwotCWRlc3QgPSBucC0+b2JfaXRlbSArIFB5X1NJWkUoYSk7Ci0JZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYik7IGkrKykgewotCQlQeU9iamVjdCAqdiA9IHNyY1tpXTsKLQkJUHlfSU5DUkVGKHYpOwotCQlkZXN0W2ldID0gdjsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5wOworICAgIHNpemUgPSBQeV9TSVpFKGEpICsgUHlfU0laRShiKTsKKyAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIG5wID0gKFB5VHVwbGVPYmplY3QgKikgUHlUdXBsZV9OZXcoc2l6ZSk7CisgICAgaWYgKG5wID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNyYyA9IGEtPm9iX2l0ZW07CisgICAgZGVzdCA9IG5wLT5vYl9pdGVtOworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKGEpOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBzcmNbaV07CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgZGVzdFtpXSA9IHY7CisgICAgfQorICAgIHNyYyA9IGItPm9iX2l0ZW07CisgICAgZGVzdCA9IG5wLT5vYl9pdGVtICsgUHlfU0laRShhKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRShiKTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gc3JjW2ldOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIGRlc3RbaV0gPSB2OworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbnA7CiAjdW5kZWYgYgogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVyZXBlYXQoUHlUdXBsZU9iamVjdCAqYSwgUHlfc3NpemVfdCBuKQogewotCVB5X3NzaXplX3QgaSwgajsKLQlQeV9zc2l6ZV90IHNpemU7Ci0JUHlUdXBsZU9iamVjdCAqbnA7Ci0JUHlPYmplY3QgKipwLCAqKml0ZW1zOwotCWlmIChuIDwgMCkKLQkJbiA9IDA7Ci0JaWYgKFB5X1NJWkUoYSkgPT0gMCB8fCBuID09IDEpIHsKLQkJaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdChhKSkgewotCQkJLyogU2luY2UgdHVwbGVzIGFyZSBpbW11dGFibGUsIHdlIGNhbiByZXR1cm4gYSBzaGFyZWQKLQkJCSAgIGNvcHkgaW4gdGhpcyBjYXNlICovCi0JCQlQeV9JTkNSRUYoYSk7Ci0JCQlyZXR1cm4gKFB5T2JqZWN0ICopYTsKLQkJfQotCQlpZiAoUHlfU0laRShhKSA9PSAwKQotCQkJcmV0dXJuIFB5VHVwbGVfTmV3KDApOwotCX0KLQlzaXplID0gUHlfU0laRShhKSAqIG47Ci0JaWYgKHNpemUvUHlfU0laRShhKSAhPSBuKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlucCA9IChQeVR1cGxlT2JqZWN0ICopIFB5VHVwbGVfTmV3KHNpemUpOwotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gbnAtPm9iX2l0ZW07Ci0JaXRlbXMgPSBhLT5vYl9pdGVtOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IFB5X1NJWkUoYSk7IGorKykgewotCQkJKnAgPSBpdGVtc1tqXTsKLQkJCVB5X0lOQ1JFRigqcCk7Ci0JCQlwKys7Ci0JCX0KLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKSBucDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5VHVwbGVPYmplY3QgKm5wOworICAgIFB5T2JqZWN0ICoqcCwgKippdGVtczsKKyAgICBpZiAobiA8IDApCisgICAgICAgIG4gPSAwOworICAgIGlmIChQeV9TSVpFKGEpID09IDAgfHwgbiA9PSAxKSB7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QoYSkpIHsKKyAgICAgICAgICAgIC8qIFNpbmNlIHR1cGxlcyBhcmUgaW1tdXRhYmxlLCB3ZSBjYW4gcmV0dXJuIGEgc2hhcmVkCisgICAgICAgICAgICAgICBjb3B5IGluIHRoaXMgY2FzZSAqLworICAgICAgICAgICAgUHlfSU5DUkVGKGEpOworICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5X1NJWkUoYSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBQeVR1cGxlX05ldygwKTsKKyAgICB9CisgICAgc2l6ZSA9IFB5X1NJWkUoYSkgKiBuOworICAgIGlmIChzaXplL1B5X1NJWkUoYSkgIT0gbikKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgbnAgPSAoUHlUdXBsZU9iamVjdCAqKSBQeVR1cGxlX05ldyhzaXplKTsKKyAgICBpZiAobnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IG5wLT5vYl9pdGVtOworICAgIGl0ZW1zID0gYS0+b2JfaXRlbTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBQeV9TSVpFKGEpOyBqKyspIHsKKyAgICAgICAgICAgICpwID0gaXRlbXNbal07CisgICAgICAgICAgICBQeV9JTkNSRUYoKnApOworICAgICAgICAgICAgcCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKikgbnA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZWluZGV4KFB5VHVwbGVPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgaSwgc3RhcnQ9MCwgc3RvcD1QeV9TSVpFKHNlbGYpOwotCVB5T2JqZWN0ICp2OworICAgIFB5X3NzaXplX3QgaSwgc3RhcnQ9MCwgc3RvcD1QeV9TSVpFKHNlbGYpOworICAgIFB5T2JqZWN0ICp2OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6aW5kZXgiLCAmdiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0b3ApKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoc3RhcnQgPCAwKSB7Ci0JCXN0YXJ0ICs9IFB5X1NJWkUoc2VsZik7Ci0JCWlmIChzdGFydCA8IDApCi0JCQlzdGFydCA9IDA7Ci0JfQotCWlmIChzdG9wIDwgMCkgewotCQlzdG9wICs9IFB5X1NJWkUoc2VsZik7Ci0JCWlmIChzdG9wIDwgMCkKLQkJCXN0b3AgPSAwOwotCX0KLQlmb3IgKGkgPSBzdGFydDsgaSA8IHN0b3AgJiYgaSA8IFB5X1NJWkUoc2VsZik7IGkrKykgewotCQlpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHNlbGYtPm9iX2l0ZW1baV0sIHYsIFB5X0VRKTsKLQkJaWYgKGNtcCA+IDApCi0JCQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoaSk7Ci0JCWVsc2UgaWYgKGNtcCA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ0dXBsZS5pbmRleCh4KTogeCBub3QgaW4gbGlzdCIpOwotCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmluZGV4IiwgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdG9wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHN0YXJ0IDwgMCkgeworICAgICAgICBzdGFydCArPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgc3RhcnQgPSAwOworICAgIH0KKyAgICBpZiAoc3RvcCA8IDApIHsKKyAgICAgICAgc3RvcCArPSBQeV9TSVpFKHNlbGYpOworICAgICAgICBpZiAoc3RvcCA8IDApCisgICAgICAgICAgICBzdG9wID0gMDsKKyAgICB9CisgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wICYmIGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKKyAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmLT5vYl9pdGVtW2ldLCB2LCBQeV9FUSk7CisgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGkpOworICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidHVwbGUuaW5kZXgoeCk6IHggbm90IGluIGxpc3QiKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlY291bnQoUHlUdXBsZU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlfc3NpemVfdCBjb3VudCA9IDA7Ci0JUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgY291bnQgPSAwOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKLQkJaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmLT5vYl9pdGVtW2ldLCB2LCBQeV9FUSk7Ci0JCWlmIChjbXAgPiAwKQotCQkJY291bnQrKzsKLQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoY291bnQpOworICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHNlbGYpOyBpKyspIHsKKyAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzZWxmLT5vYl9pdGVtW2ldLCB2LCBQeV9FUSk7CisgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QoY291bnQpOwogfQogCiBzdGF0aWMgaW50CiB0dXBsZXRyYXZlcnNlKFB5VHVwbGVPYmplY3QgKm8sIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlmb3IgKGkgPSBQeV9TSVpFKG8pOyAtLWkgPj0gMDsgKQotCQlQeV9WSVNJVChvLT5vYl9pdGVtW2ldKTsKLQlyZXR1cm4gMDsKKyAgICBmb3IgKGkgPSBQeV9TSVpFKG8pOyAtLWkgPj0gMDsgKQorICAgICAgICBQeV9WSVNJVChvLT5vYl9pdGVtW2ldKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlcmljaGNvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JUHlUdXBsZU9iamVjdCAqdnQsICp3dDsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlfc3NpemVfdCB2bGVuLCB3bGVuOworICAgIFB5VHVwbGVPYmplY3QgKnZ0LCAqd3Q7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3Qgdmxlbiwgd2xlbjsKIAotCWlmICghUHlUdXBsZV9DaGVjayh2KSB8fCAhUHlUdXBsZV9DaGVjayh3KSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQorICAgIGlmICghUHlUdXBsZV9DaGVjayh2KSB8fCAhUHlUdXBsZV9DaGVjayh3KSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQogCi0JdnQgPSAoUHlUdXBsZU9iamVjdCAqKXY7Ci0Jd3QgPSAoUHlUdXBsZU9iamVjdCAqKXc7CisgICAgdnQgPSAoUHlUdXBsZU9iamVjdCAqKXY7CisgICAgd3QgPSAoUHlUdXBsZU9iamVjdCAqKXc7CiAKLQl2bGVuID0gUHlfU0laRSh2dCk7Ci0Jd2xlbiA9IFB5X1NJWkUod3QpOworICAgIHZsZW4gPSBQeV9TSVpFKHZ0KTsKKyAgICB3bGVuID0gUHlfU0laRSh3dCk7CiAKLQkvKiBOb3RlOiAgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBmb3IgbGlzdHMgaGFzIGFuICJlYXJseSBvdXQiIHRlc3QKLQkgKiBoZXJlIHdoZW4gb3AgaXMgRVEgb3IgTkUgYW5kIHRoZSBsZW5ndGhzIGRpZmZlci4gIFRoYXQgcGF5cyB0aGVyZSwKLQkgKiBidXQgVGltIHdhcyB1bmFibGUgdG8gZmluZCBhbnkgcmVhbCBjb2RlIHdoZXJlIEVRL05FIHR1cGxlCi0JICogY29tcGFyZXMgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGgsIHNvIHRlc3RpbmcgZm9yIGl0IGhlcmUgd291bGQKLQkgKiBoYXZlIGNvc3Qgd2l0aG91dCBiZW5lZml0LgotCSAqLworICAgIC8qIE5vdGU6ICB0aGUgY29ycmVzcG9uZGluZyBjb2RlIGZvciBsaXN0cyBoYXMgYW4gImVhcmx5IG91dCIgdGVzdAorICAgICAqIGhlcmUgd2hlbiBvcCBpcyBFUSBvciBORSBhbmQgdGhlIGxlbmd0aHMgZGlmZmVyLiAgVGhhdCBwYXlzIHRoZXJlLAorICAgICAqIGJ1dCBUaW0gd2FzIHVuYWJsZSB0byBmaW5kIGFueSByZWFsIGNvZGUgd2hlcmUgRVEvTkUgdHVwbGUKKyAgICAgKiBjb21wYXJlcyBkb24ndCBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgc28gdGVzdGluZyBmb3IgaXQgaGVyZSB3b3VsZAorICAgICAqIGhhdmUgY29zdCB3aXRob3V0IGJlbmVmaXQuCisgICAgICovCiAKLQkvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBpdGVtcyBhcmUgZGlmZmVyZW50LgotCSAqIE5vdGUgdGhhdCBiZWNhdXNlIHR1cGxlcyBhcmUgaW1tdXRhYmxlLCBpdCdzIHNhZmUgdG8gcmV1c2UKLQkgKiB2bGVuIGFuZCB3bGVuIGFjcm9zcyB0aGUgY29tcGFyaXNvbiBjYWxscy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgdmxlbiAmJiBpIDwgd2xlbjsgaSsrKSB7Ci0JCWludCBrID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHZ0LT5vYl9pdGVtW2ldLAotCQkJCQkJIHd0LT5vYl9pdGVtW2ldLCBQeV9FUSk7Ci0JCWlmIChrIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoIWspCi0JCQlicmVhazsKLQl9CisgICAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgaW5kZXggd2hlcmUgaXRlbXMgYXJlIGRpZmZlcmVudC4KKyAgICAgKiBOb3RlIHRoYXQgYmVjYXVzZSB0dXBsZXMgYXJlIGltbXV0YWJsZSwgaXQncyBzYWZlIHRvIHJldXNlCisgICAgICogdmxlbiBhbmQgd2xlbiBhY3Jvc3MgdGhlIGNvbXBhcmlzb24gY2FsbHMuCisgICAgICovCisgICAgZm9yIChpID0gMDsgaSA8IHZsZW4gJiYgaSA8IHdsZW47IGkrKykgeworICAgICAgICBpbnQgayA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2dC0+b2JfaXRlbVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3QtPm9iX2l0ZW1baV0sIFB5X0VRKTsKKyAgICAgICAgaWYgKGsgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghaykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAotCWlmIChpID49IHZsZW4gfHwgaSA+PSB3bGVuKSB7Ci0JCS8qIE5vIG1vcmUgaXRlbXMgdG8gY29tcGFyZSAtLSBjb21wYXJlIHNpemVzICovCi0JCWludCBjbXA7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCXN3aXRjaCAob3ApIHsKLQkJY2FzZSBQeV9MVDogY21wID0gdmxlbiA8ICB3bGVuOyBicmVhazsKLQkJY2FzZSBQeV9MRTogY21wID0gdmxlbiA8PSB3bGVuOyBicmVhazsKLQkJY2FzZSBQeV9FUTogY21wID0gdmxlbiA9PSB3bGVuOyBicmVhazsKLQkJY2FzZSBQeV9ORTogY21wID0gdmxlbiAhPSB3bGVuOyBicmVhazsKLQkJY2FzZSBQeV9HVDogY21wID0gdmxlbiA+ICB3bGVuOyBicmVhazsKLQkJY2FzZSBQeV9HRTogY21wID0gdmxlbiA+PSB3bGVuOyBicmVhazsKLQkJZGVmYXVsdDogcmV0dXJuIE5VTEw7IC8qIGNhbm5vdCBoYXBwZW4gKi8KLQkJfQotCQlpZiAoY21wKQotCQkJcmVzID0gUHlfVHJ1ZTsKLQkJZWxzZQotCQkJcmVzID0gUHlfRmFsc2U7Ci0JCVB5X0lOQ1JFRihyZXMpOwotCQlyZXR1cm4gcmVzOwotCX0KKyAgICBpZiAoaSA+PSB2bGVuIHx8IGkgPj0gd2xlbikgeworICAgICAgICAvKiBObyBtb3JlIGl0ZW1zIHRvIGNvbXBhcmUgLS0gY29tcGFyZSBzaXplcyAqLworICAgICAgICBpbnQgY21wOworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBzd2l0Y2ggKG9wKSB7CisgICAgICAgIGNhc2UgUHlfTFQ6IGNtcCA9IHZsZW4gPCAgd2xlbjsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTEU6IGNtcCA9IHZsZW4gPD0gd2xlbjsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfRVE6IGNtcCA9IHZsZW4gPT0gd2xlbjsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfTkU6IGNtcCA9IHZsZW4gIT0gd2xlbjsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfR1Q6IGNtcCA9IHZsZW4gPiAgd2xlbjsgYnJlYWs7CisgICAgICAgIGNhc2UgUHlfR0U6IGNtcCA9IHZsZW4gPj0gd2xlbjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOVUxMOyAvKiBjYW5ub3QgaGFwcGVuICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCkKKyAgICAgICAgICAgIHJlcyA9IFB5X1RydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IFB5X0ZhbHNlOworICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQkvKiBXZSBoYXZlIGFuIGl0ZW0gdGhhdCBkaWZmZXJzIC0tIHNob3J0Y3V0cyBmb3IgRVEvTkUgKi8KLQlpZiAob3AgPT0gUHlfRVEpIHsKLQkJUHlfSU5DUkVGKFB5X0ZhbHNlKTsKLQkJcmV0dXJuIFB5X0ZhbHNlOwotCX0KLQlpZiAob3AgPT0gUHlfTkUpIHsKLQkJUHlfSU5DUkVGKFB5X1RydWUpOwotCQlyZXR1cm4gUHlfVHJ1ZTsKLQl9CisgICAgLyogV2UgaGF2ZSBhbiBpdGVtIHRoYXQgZGlmZmVycyAtLSBzaG9ydGN1dHMgZm9yIEVRL05FICovCisgICAgaWYgKG9wID09IFB5X0VRKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgICAgIHJldHVybiBQeV9GYWxzZTsKKyAgICB9CisgICAgaWYgKG9wID09IFB5X05FKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9UcnVlKTsKKyAgICAgICAgcmV0dXJuIFB5X1RydWU7CisgICAgfQogCi0JLyogQ29tcGFyZSB0aGUgZmluYWwgaXRlbSBhZ2FpbiB1c2luZyB0aGUgcHJvcGVyIG9wZXJhdG9yICovCi0JcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlKHZ0LT5vYl9pdGVtW2ldLCB3dC0+b2JfaXRlbVtpXSwgb3ApOworICAgIC8qIENvbXBhcmUgdGhlIGZpbmFsIGl0ZW0gYWdhaW4gdXNpbmcgdGhlIHByb3BlciBvcGVyYXRvciAqLworICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZSh2dC0+b2JfaXRlbVtpXSwgd3QtPm9iX2l0ZW1baV0sIG9wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTU5Miw0MSArNTkyLDQxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICphcmcgPSBOVUxMOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2VxdWVuY2UiLCAwfTsKKyAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNlcXVlbmNlIiwgMH07CiAKLQlpZiAodHlwZSAhPSAmUHlUdXBsZV9UeXBlKQotCQlyZXR1cm4gdHVwbGVfc3VidHlwZV9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInxPOnR1cGxlIiwga3dsaXN0LCAmYXJnKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cGUgIT0gJlB5VHVwbGVfVHlwZSkKKyAgICAgICAgcmV0dXJuIHR1cGxlX3N1YnR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJ8Tzp0dXBsZSIsIGt3bGlzdCwgJmFyZykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGFyZyA9PSBOVUxMKQotCQlyZXR1cm4gUHlUdXBsZV9OZXcoMCk7Ci0JZWxzZQotCQlyZXR1cm4gUHlTZXF1ZW5jZV9UdXBsZShhcmcpOworICAgIGlmIChhcmcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5VHVwbGVfTmV3KDApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5U2VxdWVuY2VfVHVwbGUoYXJnKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlX3N1YnR5cGVfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICp0bXAsICpuZXdvYmosICppdGVtOwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqdG1wLCAqbmV3b2JqLCAqaXRlbTsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKLQlhc3NlcnQoUHlUeXBlX0lzU3VidHlwZSh0eXBlLCAmUHlUdXBsZV9UeXBlKSk7Ci0JdG1wID0gdHVwbGVfbmV3KCZQeVR1cGxlX1R5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmICh0bXAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JYXNzZXJ0KFB5VHVwbGVfQ2hlY2sodG1wKSk7Ci0JbmV3b2JqID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgbiA9IFB5VHVwbGVfR0VUX1NJWkUodG1wKSk7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWl0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHRtcCwgaSk7Ci0JCVB5X0lOQ1JFRihpdGVtKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShuZXdvYmosIGksIGl0ZW0pOwotCX0KLQlQeV9ERUNSRUYodG1wKTsKLQlyZXR1cm4gbmV3b2JqOworICAgIGFzc2VydChQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsICZQeVR1cGxlX1R5cGUpKTsKKyAgICB0bXAgPSB0dXBsZV9uZXcoJlB5VHVwbGVfVHlwZSwgYXJncywga3dkcyk7CisgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayh0bXApKTsKKyAgICBuZXdvYmogPSB0eXBlLT50cF9hbGxvYyh0eXBlLCBuID0gUHlUdXBsZV9HRVRfU0laRSh0bXApKTsKKyAgICBpZiAobmV3b2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0odG1wLCBpKTsKKyAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld29iaiwgaSwgaXRlbSk7CisgICAgfQorICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiBuZXdvYmo7CiB9CiAKIFB5RG9jX1NUUlZBUih0dXBsZV9kb2MsCkBAIC02MzYsODYgKzYzNiw4NiBAQAogSWYgdGhlIGFyZ3VtZW50IGlzIGEgdHVwbGUsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNhbWUgb2JqZWN0LiIpOwogCiBzdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgdHVwbGVfYXNfc2VxdWVuY2UgPSB7Ci0JKGxlbmZ1bmMpdHVwbGVsZW5ndGgsCQkJLyogc3FfbGVuZ3RoICovCi0JKGJpbmFyeWZ1bmMpdHVwbGVjb25jYXQsCQkvKiBzcV9jb25jYXQgKi8KLQkoc3NpemVhcmdmdW5jKXR1cGxlcmVwZWF0LAkJLyogc3FfcmVwZWF0ICovCi0JKHNzaXplYXJnZnVuYyl0dXBsZWl0ZW0sCQkvKiBzcV9pdGVtICovCi0JKHNzaXplc3NpemVhcmdmdW5jKXR1cGxlc2xpY2UsCQkvKiBzcV9zbGljZSAqLwotCTAsCQkJCQkvKiBzcV9hc3NfaXRlbSAqLwotCTAsCQkJCQkvKiBzcV9hc3Nfc2xpY2UgKi8KLQkob2Jqb2JqcHJvYyl0dXBsZWNvbnRhaW5zLAkJLyogc3FfY29udGFpbnMgKi8KKyAgICAobGVuZnVuYyl0dXBsZWxlbmd0aCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHNxX2xlbmd0aCAqLworICAgIChiaW5hcnlmdW5jKXR1cGxlY29uY2F0LCAgICAgICAgICAgICAgICAgICAgLyogc3FfY29uY2F0ICovCisgICAgKHNzaXplYXJnZnVuYyl0dXBsZXJlcGVhdCwgICAgICAgICAgICAgICAgICAvKiBzcV9yZXBlYXQgKi8KKyAgICAoc3NpemVhcmdmdW5jKXR1cGxlaXRlbSwgICAgICAgICAgICAgICAgICAgIC8qIHNxX2l0ZW0gKi8KKyAgICAoc3NpemVzc2l6ZWFyZ2Z1bmMpdHVwbGVzbGljZSwgICAgICAgICAgICAgIC8qIHNxX3NsaWNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzcV9hc3NfaXRlbSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3FfYXNzX3NsaWNlICovCisgICAgKG9iam9ianByb2MpdHVwbGVjb250YWlucywgICAgICAgICAgICAgICAgICAvKiBzcV9jb250YWlucyAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0KgogdHVwbGVzdWJzY3JpcHQoUHlUdXBsZU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGl0ZW0pCiB7Ci0JaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKLQkJUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOwotCQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChpIDwgMCkKLQkJCWkgKz0gUHlUdXBsZV9HRVRfU0laRShzZWxmKTsKLQkJcmV0dXJuIHR1cGxlaXRlbShzZWxmLCBpKTsKLQl9Ci0JZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgewotCQlQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOwotCQlQeU9iamVjdCogcmVzdWx0OwotCQlQeU9iamVjdCogaXQ7Ci0JCVB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIFB5RXhjX0luZGV4RXJyb3IpOworICAgICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpIDwgMCkKKyAgICAgICAgICAgIGkgKz0gUHlUdXBsZV9HRVRfU0laRShzZWxmKTsKKyAgICAgICAgcmV0dXJuIHR1cGxlaXRlbShzZWxmLCBpKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlTbGljZV9DaGVjayhpdGVtKSkgeworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBzdG9wLCBzdGVwLCBzbGljZWxlbmd0aCwgY3VyLCBpOworICAgICAgICBQeU9iamVjdCogcmVzdWx0OworICAgICAgICBQeU9iamVjdCogaXQ7CisgICAgICAgIFB5T2JqZWN0ICoqc3JjLCAqKmRlc3Q7CiAKLQkJaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KChQeVNsaWNlT2JqZWN0KilpdGVtLAotCQkJCSBQeVR1cGxlX0dFVF9TSVpFKHNlbGYpLAotCQkJCSAmc3RhcnQsICZzdG9wLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA8IDApIHsKLQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeCgoUHlTbGljZU9iamVjdCopaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKHNlbGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJnN0b3AsICZzdGVwLCAmc2xpY2VsZW5ndGgpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlpZiAoc2xpY2VsZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIFB5VHVwbGVfTmV3KDApOwotCQl9Ci0JCWVsc2UgaWYgKHN0YXJ0ID09IDAgJiYgc3RlcCA9PSAxICYmCi0JCQkgc2xpY2VsZW5ndGggPT0gUHlUdXBsZV9HRVRfU0laRShzZWxmKSAmJgotCQkJIFB5VHVwbGVfQ2hlY2tFeGFjdChzZWxmKSkgewotCQkJUHlfSU5DUkVGKHNlbGYpOwotCQkJcmV0dXJuIChQeU9iamVjdCAqKXNlbGY7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBQeVR1cGxlX05ldyhzbGljZWxlbmd0aCk7Ci0JCQlpZiAoIXJlc3VsdCkgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzbGljZWxlbmd0aCA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RhcnQgPT0gMCAmJiBzdGVwID09IDEgJiYKKyAgICAgICAgICAgICAgICAgc2xpY2VsZW5ndGggPT0gUHlUdXBsZV9HRVRfU0laRShzZWxmKSAmJgorICAgICAgICAgICAgICAgICBQeVR1cGxlX0NoZWNrRXhhY3Qoc2VsZikpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlUdXBsZV9OZXcoc2xpY2VsZW5ndGgpOworICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBOVUxMOwogCi0JCQlzcmMgPSBzZWxmLT5vYl9pdGVtOwotCQkJZGVzdCA9ICgoUHlUdXBsZU9iamVjdCAqKXJlc3VsdCktPm9iX2l0ZW07Ci0JCQlmb3IgKGN1ciA9IHN0YXJ0LCBpID0gMDsgaSA8IHNsaWNlbGVuZ3RoOyAKLQkJCSAgICAgY3VyICs9IHN0ZXAsIGkrKykgewotCQkJCWl0ID0gc3JjW2N1cl07Ci0JCQkJUHlfSU5DUkVGKGl0KTsKLQkJCQlkZXN0W2ldID0gaXQ7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIAotCQkJICAgICAidHVwbGUgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzLCBub3QgJS4yMDBzIiwKLQkJCSAgICAgUHlfVFlQRShpdGVtKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAgICAgICAgIHNyYyA9IHNlbGYtPm9iX2l0ZW07CisgICAgICAgICAgICBkZXN0ID0gKChQeVR1cGxlT2JqZWN0ICopcmVzdWx0KS0+b2JfaXRlbTsKKyAgICAgICAgICAgIGZvciAoY3VyID0gc3RhcnQsIGkgPSAwOyBpIDwgc2xpY2VsZW5ndGg7CisgICAgICAgICAgICAgICAgIGN1ciArPSBzdGVwLCBpKyspIHsKKyAgICAgICAgICAgICAgICBpdCA9IHNyY1tjdXJdOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgZGVzdFtpXSA9IGl0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInR1cGxlIGluZGljZXMgbXVzdCBiZSBpbnRlZ2Vycywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGl0ZW0pLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVfZ2V0bmV3YXJncyhQeVR1cGxlT2JqZWN0ICp2KQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoTikiLCB0dXBsZXNsaWNlKHYsIDAsIFB5X1NJWkUodikpKTsKLQkKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKE4pIiwgdHVwbGVzbGljZSh2LCAwLCBQeV9TSVpFKHYpKSk7CisKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlX3NpemVvZihQeVR1cGxlT2JqZWN0ICpzZWxmKQogewotCVB5X3NzaXplX3QgcmVzOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0JcmVzID0gUHlUdXBsZV9UeXBlLnRwX2Jhc2ljc2l6ZSArIFB5X1NJWkUoc2VsZikgKiBzaXplb2YoUHlPYmplY3QgKik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CisgICAgcmVzID0gUHlUdXBsZV9UeXBlLnRwX2Jhc2ljc2l6ZSArIFB5X1NJWkUoc2VsZikgKiBzaXplb2YoUHlPYmplY3QgKik7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CiB9CiAKIFB5RG9jX1NUUlZBUihpbmRleF9kb2MsCkBAIC03MjgsNjIgKzcyOCw2MiBAQAogIlQuX19zaXplb2ZfXygpIC0tIHNpemUgb2YgVCBpbiBtZW1vcnksIGluIGJ5dGVzIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0dXBsZV9tZXRob2RzW10gPSB7Ci0JeyJfX2dldG5ld2FyZ3NfXyIsCShQeUNGdW5jdGlvbil0dXBsZV9nZXRuZXdhcmdzLAlNRVRIX05PQVJHU30sCi0JeyJfX3NpemVvZl9fIiwJKFB5Q0Z1bmN0aW9uKXR1cGxlX3NpemVvZiwgTUVUSF9OT0FSR1MsIHNpemVvZl9kb2N9LAotCXsiaW5kZXgiLAkoUHlDRnVuY3Rpb24pdHVwbGVpbmRleCwgIE1FVEhfVkFSQVJHUywgaW5kZXhfZG9jfSwKLQl7ImNvdW50IiwJKFB5Q0Z1bmN0aW9uKXR1cGxlY291bnQsICBNRVRIX08sIGNvdW50X2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fZ2V0bmV3YXJnc19fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXR1cGxlX2dldG5ld2FyZ3MsICBNRVRIX05PQVJHU30sCisgICAgeyJfX3NpemVvZl9fIiwgICAgICAoUHlDRnVuY3Rpb24pdHVwbGVfc2l6ZW9mLCBNRVRIX05PQVJHUywgc2l6ZW9mX2RvY30sCisgICAgeyJpbmRleCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pdHVwbGVpbmRleCwgIE1FVEhfVkFSQVJHUywgaW5kZXhfZG9jfSwKKyAgICB7ImNvdW50IiwgICAgICAgICAgIChQeUNGdW5jdGlvbil0dXBsZWNvdW50LCAgTUVUSF9PLCBjb3VudF9kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyB0dXBsZV9hc19tYXBwaW5nID0gewotCShsZW5mdW5jKXR1cGxlbGVuZ3RoLAotCShiaW5hcnlmdW5jKXR1cGxlc3Vic2NyaXB0LAotCTAKKyAgICAobGVuZnVuYyl0dXBsZWxlbmd0aCwKKyAgICAoYmluYXJ5ZnVuYyl0dXBsZXN1YnNjcmlwdCwKKyAgICAwCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKnR1cGxlX2l0ZXIoUHlPYmplY3QgKnNlcSk7CiAKIFB5VHlwZU9iamVjdCBQeVR1cGxlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkidHVwbGUiLAotCXNpemVvZihQeVR1cGxlT2JqZWN0KSAtIHNpemVvZihQeU9iamVjdCAqKSwKLQlzaXplb2YoUHlPYmplY3QgKiksCi0JKGRlc3RydWN0b3IpdHVwbGVkZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCShwcmludGZ1bmMpdHVwbGVwcmludCwJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyl0dXBsZXJlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkmdHVwbGVfYXNfc2VxdWVuY2UsCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkmdHVwbGVfYXNfbWFwcGluZywJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKXR1cGxlaGFzaCwJCQkvKiB0cF9oYXNoICovCi0JMCwJCQkJCS8qIHRwX2NhbGwgKi8KLQkwLAkJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCQkvKiB0cF9hc19idWZmZXIgKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFIHwgUHlfVFBGTEFHU19UVVBMRV9TVUJDTEFTUywgLyogdHBfZmxhZ3MgKi8KLQl0dXBsZV9kb2MsCQkJCS8qIHRwX2RvYyAqLwotIAkodHJhdmVyc2Vwcm9jKXR1cGxldHJhdmVyc2UsCQkvKiB0cF90cmF2ZXJzZSAqLwotCTAsCQkJCQkvKiB0cF9jbGVhciAqLwotCXR1cGxlcmljaGNvbXBhcmUsCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQl0dXBsZV9pdGVyLAkgICAgCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCXR1cGxlX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQkwLAkJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCTAsCQkJCQkvKiB0cF9pbml0ICovCi0JMCwJCQkJCS8qIHRwX2FsbG9jICovCi0JdHVwbGVfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9HQ19EZWwsICAgICAgICAJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJ0dXBsZSIsCisgICAgc2l6ZW9mKFB5VHVwbGVPYmplY3QpIC0gc2l6ZW9mKFB5T2JqZWN0ICopLAorICAgIHNpemVvZihQeU9iamVjdCAqKSwKKyAgICAoZGVzdHJ1Y3Rvcil0dXBsZWRlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAocHJpbnRmdW5jKXR1cGxlcHJpbnQsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXR1cGxlcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmdHVwbGVfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgJnR1cGxlX2FzX21hcHBpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKXR1cGxlaGFzaCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfVFVQTEVfU1VCQ0xBU1MsIC8qIHRwX2ZsYWdzICovCisgICAgdHVwbGVfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAodHJhdmVyc2Vwcm9jKXR1cGxldHJhdmVyc2UsICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIHR1cGxlcmljaGNvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgdHVwbGVfaXRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHR1cGxlX21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICB0dXBsZV9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBicmVha3MgdGhlIG5vdGlvbiB0aGF0IHR1cGxlcyBhcmUgaW1tdXRhYmxlOgpAQCAtNzk2LDIwMyArNzk2LDIwMyBAQAogaW50CiBfUHlUdXBsZV9SZXNpemUoUHlPYmplY3QgKipwdiwgUHlfc3NpemVfdCBuZXdzaXplKQogewotCXJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKnY7Ci0JcmVnaXN0ZXIgUHlUdXBsZU9iamVjdCAqc3Y7Ci0JUHlfc3NpemVfdCBpOwotCVB5X3NzaXplX3Qgb2xkc2l6ZTsKKyAgICByZWdpc3RlciBQeVR1cGxlT2JqZWN0ICp2OworICAgIHJlZ2lzdGVyIFB5VHVwbGVPYmplY3QgKnN2OworICAgIFB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IG9sZHNpemU7CiAKLQl2ID0gKFB5VHVwbGVPYmplY3QgKikgKnB2OwotCWlmICh2ID09IE5VTEwgfHwgUHlfVFlQRSh2KSAhPSAmUHlUdXBsZV9UeXBlIHx8Ci0JICAgIChQeV9TSVpFKHYpICE9IDAgJiYgUHlfUkVGQ05UKHYpICE9IDEpKSB7Ci0JCSpwdiA9IDA7Ci0JCVB5X1hERUNSRUYodik7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW9sZHNpemUgPSBQeV9TSVpFKHYpOwotCWlmIChvbGRzaXplID09IG5ld3NpemUpCi0JCXJldHVybiAwOworICAgIHYgPSAoUHlUdXBsZU9iamVjdCAqKSAqcHY7CisgICAgaWYgKHYgPT0gTlVMTCB8fCBQeV9UWVBFKHYpICE9ICZQeVR1cGxlX1R5cGUgfHwKKyAgICAgICAgKFB5X1NJWkUodikgIT0gMCAmJiBQeV9SRUZDTlQodikgIT0gMSkpIHsKKyAgICAgICAgKnB2ID0gMDsKKyAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgb2xkc2l6ZSA9IFB5X1NJWkUodik7CisgICAgaWYgKG9sZHNpemUgPT0gbmV3c2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAob2xkc2l6ZSA9PSAwKSB7Ci0JCS8qIEVtcHR5IHR1cGxlcyBhcmUgb2Z0ZW4gc2hhcmVkLCBzbyB3ZSBzaG91bGQgbmV2ZXIgCi0JCSAgIHJlc2l6ZSB0aGVtIGluLXBsYWNlIGV2ZW4gaWYgd2UgZG8gb3duIHRoZSBvbmx5Ci0JCSAgIChjdXJyZW50KSByZWZlcmVuY2UgKi8KLQkJUHlfREVDUkVGKHYpOwotCQkqcHYgPSBQeVR1cGxlX05ldyhuZXdzaXplKTsKLQkJcmV0dXJuICpwdiA9PSBOVUxMID8gLTEgOiAwOwotCX0KKyAgICBpZiAob2xkc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qIEVtcHR5IHR1cGxlcyBhcmUgb2Z0ZW4gc2hhcmVkLCBzbyB3ZSBzaG91bGQgbmV2ZXIKKyAgICAgICAgICAgcmVzaXplIHRoZW0gaW4tcGxhY2UgZXZlbiBpZiB3ZSBkbyBvd24gdGhlIG9ubHkKKyAgICAgICAgICAgKGN1cnJlbnQpIHJlZmVyZW5jZSAqLworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICpwdiA9IFB5VHVwbGVfTmV3KG5ld3NpemUpOworICAgICAgICByZXR1cm4gKnB2ID09IE5VTEwgPyAtMSA6IDA7CisgICAgfQogCi0JLyogWFhYIFVOUkVGL05FV1JFRiBpbnRlcmZhY2Ugc2hvdWxkIGJlIG1vcmUgc3ltbWV0cmljYWwgKi8KLQlfUHlfREVDX1JFRlRPVEFMOwotCV9QeU9iamVjdF9HQ19VTlRSQUNLKHYpOwotCV9QeV9Gb3JnZXRSZWZlcmVuY2UoKFB5T2JqZWN0ICopIHYpOwotCS8qIERFQ1JFRiBpdGVtcyBkZWxldGVkIGJ5IHNocmlua2FnZSAqLwotCWZvciAoaSA9IG5ld3NpemU7IGkgPCBvbGRzaXplOyBpKyspIHsKLQkJUHlfWERFQ1JFRih2LT5vYl9pdGVtW2ldKTsKLQkJdi0+b2JfaXRlbVtpXSA9IE5VTEw7Ci0JfQotCXN2ID0gUHlPYmplY3RfR0NfUmVzaXplKFB5VHVwbGVPYmplY3QsIHYsIG5ld3NpemUpOwotCWlmIChzdiA9PSBOVUxMKSB7Ci0JCSpwdiA9IE5VTEw7Ci0JCVB5T2JqZWN0X0dDX0RlbCh2KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKSBzdik7Ci0JLyogWmVybyBvdXQgaXRlbXMgYWRkZWQgYnkgZ3Jvd2luZyAqLwotCWlmIChuZXdzaXplID4gb2xkc2l6ZSkKLQkJbWVtc2V0KCZzdi0+b2JfaXRlbVtvbGRzaXplXSwgMCwKLQkJICAgICAgIHNpemVvZigqc3YtPm9iX2l0ZW0pICogKG5ld3NpemUgLSBvbGRzaXplKSk7Ci0JKnB2ID0gKFB5T2JqZWN0ICopIHN2OwotCV9QeU9iamVjdF9HQ19UUkFDSyhzdik7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYIFVOUkVGL05FV1JFRiBpbnRlcmZhY2Ugc2hvdWxkIGJlIG1vcmUgc3ltbWV0cmljYWwgKi8KKyAgICBfUHlfREVDX1JFRlRPVEFMOworICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKHYpOworICAgIF9QeV9Gb3JnZXRSZWZlcmVuY2UoKFB5T2JqZWN0ICopIHYpOworICAgIC8qIERFQ1JFRiBpdGVtcyBkZWxldGVkIGJ5IHNocmlua2FnZSAqLworICAgIGZvciAoaSA9IG5ld3NpemU7IGkgPCBvbGRzaXplOyBpKyspIHsKKyAgICAgICAgUHlfWERFQ1JFRih2LT5vYl9pdGVtW2ldKTsKKyAgICAgICAgdi0+b2JfaXRlbVtpXSA9IE5VTEw7CisgICAgfQorICAgIHN2ID0gUHlPYmplY3RfR0NfUmVzaXplKFB5VHVwbGVPYmplY3QsIHYsIG5ld3NpemUpOworICAgIGlmIChzdiA9PSBOVUxMKSB7CisgICAgICAgICpwdiA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0X0dDX0RlbCh2KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKSBzdik7CisgICAgLyogWmVybyBvdXQgaXRlbXMgYWRkZWQgYnkgZ3Jvd2luZyAqLworICAgIGlmIChuZXdzaXplID4gb2xkc2l6ZSkKKyAgICAgICAgbWVtc2V0KCZzdi0+b2JfaXRlbVtvbGRzaXplXSwgMCwKKyAgICAgICAgICAgICAgIHNpemVvZigqc3YtPm9iX2l0ZW0pICogKG5ld3NpemUgLSBvbGRzaXplKSk7CisgICAgKnB2ID0gKFB5T2JqZWN0ICopIHN2OworICAgIF9QeU9iamVjdF9HQ19UUkFDSyhzdik7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlUdXBsZV9DbGVhckZyZWVMaXN0KHZvaWQpCiB7Ci0JaW50IGZyZWVsaXN0X3NpemUgPSAwOworICAgIGludCBmcmVlbGlzdF9zaXplID0gMDsKICNpZiBQeVR1cGxlX01BWFNBVkVTSVpFID4gMAotCWludCBpOwotCWZvciAoaSA9IDE7IGkgPCBQeVR1cGxlX01BWFNBVkVTSVpFOyBpKyspIHsKLQkJUHlUdXBsZU9iamVjdCAqcCwgKnE7Ci0JCXAgPSBmcmVlX2xpc3RbaV07Ci0JCWZyZWVsaXN0X3NpemUgKz0gbnVtZnJlZVtpXTsKLQkJZnJlZV9saXN0W2ldID0gTlVMTDsKLQkJbnVtZnJlZVtpXSA9IDA7Ci0JCXdoaWxlIChwKSB7Ci0JCQlxID0gcDsKLQkJCXAgPSAoUHlUdXBsZU9iamVjdCAqKShwLT5vYl9pdGVtWzBdKTsKLQkJCVB5T2JqZWN0X0dDX0RlbChxKTsKLQkJfQotCX0KKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgUHlUdXBsZV9NQVhTQVZFU0laRTsgaSsrKSB7CisgICAgICAgIFB5VHVwbGVPYmplY3QgKnAsICpxOworICAgICAgICBwID0gZnJlZV9saXN0W2ldOworICAgICAgICBmcmVlbGlzdF9zaXplICs9IG51bWZyZWVbaV07CisgICAgICAgIGZyZWVfbGlzdFtpXSA9IE5VTEw7CisgICAgICAgIG51bWZyZWVbaV0gPSAwOworICAgICAgICB3aGlsZSAocCkgeworICAgICAgICAgICAgcSA9IHA7CisgICAgICAgICAgICBwID0gKFB5VHVwbGVPYmplY3QgKikocC0+b2JfaXRlbVswXSk7CisgICAgICAgICAgICBQeU9iamVjdF9HQ19EZWwocSk7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKKyAgICByZXR1cm4gZnJlZWxpc3Rfc2l6ZTsKIH0KLQkKKwogdm9pZAogUHlUdXBsZV9GaW5pKHZvaWQpCiB7CiAjaWYgUHlUdXBsZV9NQVhTQVZFU0laRSA+IDAKLQkvKiBlbXB0eSB0dXBsZXMgYXJlIHVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlIGFuZCBhcHBsaWNhdGlvbnMgbWF5Ci0JICogcmVseSBvbiB0aGUgZmFjdCB0aGF0IGFuIGVtcHR5IHR1cGxlIGlzIGEgc2luZ2xldG9uLiAqLwotCVB5X1hERUNSRUYoZnJlZV9saXN0WzBdKTsKLQlmcmVlX2xpc3RbMF0gPSBOVUxMOworICAgIC8qIGVtcHR5IHR1cGxlcyBhcmUgdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UgYW5kIGFwcGxpY2F0aW9ucyBtYXkKKyAgICAgKiByZWx5IG9uIHRoZSBmYWN0IHRoYXQgYW4gZW1wdHkgdHVwbGUgaXMgYSBzaW5nbGV0b24uICovCisgICAgUHlfWERFQ1JFRihmcmVlX2xpc3RbMF0pOworICAgIGZyZWVfbGlzdFswXSA9IE5VTEw7CiAKLQkodm9pZClQeVR1cGxlX0NsZWFyRnJlZUxpc3QoKTsKKyAgICAodm9pZClQeVR1cGxlX0NsZWFyRnJlZUxpc3QoKTsKICNlbmRpZgogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKiogVHVwbGUgSXRlcmF0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JbG9uZyBpdF9pbmRleDsKLQlQeVR1cGxlT2JqZWN0ICppdF9zZXE7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgaXRfaW5kZXg7CisgICAgUHlUdXBsZU9iamVjdCAqaXRfc2VxOyAvKiBTZXQgdG8gTlVMTCB3aGVuIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSB0dXBsZWl0ZXJvYmplY3Q7CiAKIHN0YXRpYyB2b2lkCiB0dXBsZWl0ZXJfZGVhbGxvYyh0dXBsZWl0ZXJvYmplY3QgKml0KQogewotCV9QeU9iamVjdF9HQ19VTlRSQUNLKGl0KTsKLQlQeV9YREVDUkVGKGl0LT5pdF9zZXEpOwotCVB5T2JqZWN0X0dDX0RlbChpdCk7CisgICAgX1B5T2JqZWN0X0dDX1VOVFJBQ0soaXQpOworICAgIFB5X1hERUNSRUYoaXQtPml0X3NlcSk7CisgICAgUHlPYmplY3RfR0NfRGVsKGl0KTsKIH0KIAogc3RhdGljIGludAogdHVwbGVpdGVyX3RyYXZlcnNlKHR1cGxlaXRlcm9iamVjdCAqaXQsIHZpc2l0cHJvYyB2aXNpdCwgdm9pZCAqYXJnKQogewotCVB5X1ZJU0lUKGl0LT5pdF9zZXEpOwotCXJldHVybiAwOworICAgIFB5X1ZJU0lUKGl0LT5pdF9zZXEpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHVwbGVpdGVyX25leHQodHVwbGVpdGVyb2JqZWN0ICppdCkKIHsKLQlQeVR1cGxlT2JqZWN0ICpzZXE7Ci0JUHlPYmplY3QgKml0ZW07CisgICAgUHlUdXBsZU9iamVjdCAqc2VxOworICAgIFB5T2JqZWN0ICppdGVtOwogCi0JYXNzZXJ0KGl0ICE9IE5VTEwpOwotCXNlcSA9IGl0LT5pdF9zZXE7Ci0JaWYgKHNlcSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhzZXEpKTsKKyAgICBhc3NlcnQoaXQgIT0gTlVMTCk7CisgICAgc2VxID0gaXQtPml0X3NlcTsKKyAgICBpZiAoc2VxID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKHNlcSkpOwogCi0JaWYgKGl0LT5pdF9pbmRleCA8IFB5VHVwbGVfR0VUX1NJWkUoc2VxKSkgewotCQlpdGVtID0gUHlUdXBsZV9HRVRfSVRFTShzZXEsIGl0LT5pdF9pbmRleCk7Ci0JCSsraXQtPml0X2luZGV4OwotCQlQeV9JTkNSRUYoaXRlbSk7Ci0JCXJldHVybiBpdGVtOwotCX0KKyAgICBpZiAoaXQtPml0X2luZGV4IDwgUHlUdXBsZV9HRVRfU0laRShzZXEpKSB7CisgICAgICAgIGl0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKHNlcSwgaXQtPml0X2luZGV4KTsKKyAgICAgICAgKytpdC0+aXRfaW5kZXg7CisgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQogCi0JUHlfREVDUkVGKHNlcSk7Ci0JaXQtPml0X3NlcSA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHNlcSk7CisgICAgaXQtPml0X3NlcSA9IE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0dXBsZWl0ZXJfbGVuKHR1cGxlaXRlcm9iamVjdCAqaXQpCiB7Ci0JUHlfc3NpemVfdCBsZW4gPSAwOwotCWlmIChpdC0+aXRfc2VxKQotCQlsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKGl0LT5pdF9zZXEpIC0gaXQtPml0X2luZGV4OwotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChsZW4pOworICAgIFB5X3NzaXplX3QgbGVuID0gMDsKKyAgICBpZiAoaXQtPml0X3NlcSkKKyAgICAgICAgbGVuID0gUHlUdXBsZV9HRVRfU0laRShpdC0+aXRfc2VxKSAtIGl0LT5pdF9pbmRleDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QobGVuKTsKIH0KIAogUHlEb2NfU1RSVkFSKGxlbmd0aF9oaW50X2RvYywgIlByaXZhdGUgbWV0aG9kIHJldHVybmluZyBhbiBlc3RpbWF0ZSBvZiBsZW4obGlzdChpdCkpLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgdHVwbGVpdGVyX21ldGhvZHNbXSA9IHsKLQl7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbil0dXBsZWl0ZXJfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKLSAJe05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7Il9fbGVuZ3RoX2hpbnRfXyIsIChQeUNGdW5jdGlvbil0dXBsZWl0ZXJfbGVuLCBNRVRIX05PQVJHUywgbGVuZ3RoX2hpbnRfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlUeXBlT2JqZWN0IFB5VHVwbGVJdGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkidHVwbGVpdGVyYXRvciIsCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZih0dXBsZWl0ZXJvYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKXR1cGxlaXRlcl9kZWFsbG9jLAkJLyogdHBfZGVhbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9wcmludCAqLwotCTAsCQkJCQkvKiB0cF9nZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfY29tcGFyZSAqLwotCTAsCQkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkodHJhdmVyc2Vwcm9jKXR1cGxlaXRlcl90cmF2ZXJzZSwJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQlQeU9iamVjdF9TZWxmSXRlciwJCQkvKiB0cF9pdGVyICovCi0JKGl0ZXJuZXh0ZnVuYyl0dXBsZWl0ZXJfbmV4dCwJCS8qIHRwX2l0ZXJuZXh0ICovCi0JdHVwbGVpdGVyX21ldGhvZHMsCQkJLyogdHBfbWV0aG9kcyAqLwotCTAsCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAidHVwbGVpdGVyYXRvciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YodHVwbGVpdGVyb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpdHVwbGVpdGVyX2RlYWxsb2MsICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyl0dXBsZWl0ZXJfdHJhdmVyc2UsICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIChpdGVybmV4dGZ1bmMpdHVwbGVpdGVyX25leHQsICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICB0dXBsZWl0ZXJfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLAogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHR1cGxlX2l0ZXIoUHlPYmplY3QgKnNlcSkKIHsKLQl0dXBsZWl0ZXJvYmplY3QgKml0OworICAgIHR1cGxlaXRlcm9iamVjdCAqaXQ7CiAKLQlpZiAoIVB5VHVwbGVfQ2hlY2soc2VxKSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfR0NfTmV3KHR1cGxlaXRlcm9iamVjdCwgJlB5VHVwbGVJdGVyX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpdC0+aXRfaW5kZXggPSAwOwotCVB5X0lOQ1JFRihzZXEpOwotCWl0LT5pdF9zZXEgPSAoUHlUdXBsZU9iamVjdCAqKXNlcTsKLQlfUHlPYmplY3RfR0NfVFJBQ0soaXQpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soc2VxKSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfR0NfTmV3KHR1cGxlaXRlcm9iamVjdCwgJlB5VHVwbGVJdGVyX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdC0+aXRfaW5kZXggPSAwOworICAgIFB5X0lOQ1JFRihzZXEpOworICAgIGl0LT5pdF9zZXEgPSAoUHlUdXBsZU9iamVjdCAqKXNlcTsKKyAgICBfUHlPYmplY3RfR0NfVFJBQ0soaXQpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvdHlwZW9iamVjdC5jIGIvT2JqZWN0cy90eXBlb2JqZWN0LmMKaW5kZXggMGJhNDJjZS4uMzBlN2EyZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy90eXBlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy90eXBlb2JqZWN0LmMKQEAgLTEyLDIyICsxMiwyMiBAQAogICAgdGhleSBub3JtYWxseSB3b3VsZC4gIFRoaXMgaXMgd2h5IHRoZSBtYXhpbXVtIHNpemUgaXMgbGltaXRlZCB0bwogICAgTUNBQ0hFX01BWF9BVFRSX1NJWkUsIHNpbmNlIGl0IG1pZ2h0IGJlIGEgcHJvYmxlbSBpZiB2ZXJ5IGxhcmdlCiAgICBzdHJpbmdzIGFyZSB1c2VkIGFzIGF0dHJpYnV0ZSBuYW1lcy4gKi8KLSNkZWZpbmUgTUNBQ0hFX01BWF9BVFRSX1NJWkUJMTAwCi0jZGVmaW5lIE1DQUNIRV9TSVpFX0VYUAkJMTAKLSNkZWZpbmUgTUNBQ0hFX0hBU0godmVyc2lvbiwgbmFtZV9oYXNoKQkJCQkJXAotCQkoKCh1bnNpZ25lZCBpbnQpKHZlcnNpb24pICogKHVuc2lnbmVkIGludCkobmFtZV9oYXNoKSkJXAotCQkgPj4gKDgqc2l6ZW9mKHVuc2lnbmVkIGludCkgLSBNQ0FDSEVfU0laRV9FWFApKQorI2RlZmluZSBNQ0FDSEVfTUFYX0FUVFJfU0laRSAgICAxMDAKKyNkZWZpbmUgTUNBQ0hFX1NJWkVfRVhQICAgICAgICAgMTAKKyNkZWZpbmUgTUNBQ0hFX0hBU0godmVyc2lvbiwgbmFtZV9oYXNoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCgodW5zaWduZWQgaW50KSh2ZXJzaW9uKSAqICh1bnNpZ25lZCBpbnQpKG5hbWVfaGFzaCkpICAgICAgICAgIFwKKyAgICAgICAgID4+ICg4KnNpemVvZih1bnNpZ25lZCBpbnQpIC0gTUNBQ0hFX1NJWkVfRVhQKSkKICNkZWZpbmUgTUNBQ0hFX0hBU0hfTUVUSE9EKHR5cGUsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJTUNBQ0hFX0hBU0goKHR5cGUpLT50cF92ZXJzaW9uX3RhZywgICAgICAgICAgICAgICAgICAgICBcCi0JCSAgICAgICAgICAgICgoUHlTdHJpbmdPYmplY3QgKikobmFtZSkpLT5vYl9zaGFzaCkKKyAgICAgICAgTUNBQ0hFX0hBU0goKHR5cGUpLT50cF92ZXJzaW9uX3RhZywgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICgoUHlTdHJpbmdPYmplY3QgKikobmFtZSkpLT5vYl9zaGFzaCkKICNkZWZpbmUgTUNBQ0hFX0NBQ0hFQUJMRV9OQU1FKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJUHlTdHJpbmdfQ2hlY2tFeGFjdChuYW1lKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCVB5U3RyaW5nX0dFVF9TSVpFKG5hbWUpIDw9IE1DQUNIRV9NQVhfQVRUUl9TSVpFCisgICAgICAgIFB5U3RyaW5nX0NoZWNrRXhhY3QobmFtZSkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeVN0cmluZ19HRVRfU0laRShuYW1lKSA8PSBNQ0FDSEVfTUFYX0FUVFJfU0laRQogCiBzdHJ1Y3QgbWV0aG9kX2NhY2hlX2VudHJ5IHsKLQl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKLQlQeU9iamVjdCAqbmFtZTsJCS8qIHJlZmVyZW5jZSB0byBleGFjdGx5IGEgc3RyIG9yIE5vbmUgKi8KLQlQeU9iamVjdCAqdmFsdWU7CS8qIGJvcnJvd2VkICovCisgICAgdW5zaWduZWQgaW50IHZlcnNpb247CisgICAgUHlPYmplY3QgKm5hbWU7ICAgICAgICAgICAgIC8qIHJlZmVyZW5jZSB0byBleGFjdGx5IGEgc3RyIG9yIE5vbmUgKi8KKyAgICBQeU9iamVjdCAqdmFsdWU7ICAgICAgICAgICAgLyogYm9ycm93ZWQgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWV0aG9kX2NhY2hlX2VudHJ5IG1ldGhvZF9jYWNoZVsxIDw8IE1DQUNIRV9TSVpFX0VYUF07CkBAIC0zNiwzMTMgKzM2LDMxMyBAQAogdW5zaWduZWQgaW50CiBQeVR5cGVfQ2xlYXJDYWNoZSh2b2lkKQogewotCVB5X3NzaXplX3QgaTsKLQl1bnNpZ25lZCBpbnQgY3VyX3ZlcnNpb25fdGFnID0gbmV4dF92ZXJzaW9uX3RhZyAtIDE7Ci0JCi0JZm9yIChpID0gMDsgaSA8ICgxIDw8IE1DQUNIRV9TSVpFX0VYUCk7IGkrKykgewotCQltZXRob2RfY2FjaGVbaV0udmVyc2lvbiA9IDA7Ci0JCVB5X0NMRUFSKG1ldGhvZF9jYWNoZVtpXS5uYW1lKTsKLQkJbWV0aG9kX2NhY2hlW2ldLnZhbHVlID0gTlVMTDsKLQl9Ci0JbmV4dF92ZXJzaW9uX3RhZyA9IDA7Ci0JLyogbWFyayBhbGwgdmVyc2lvbiB0YWdzIGFzIGludmFsaWQgKi8KLQlQeVR5cGVfTW9kaWZpZWQoJlB5QmFzZU9iamVjdF9UeXBlKTsKLQlyZXR1cm4gY3VyX3ZlcnNpb25fdGFnOworICAgIFB5X3NzaXplX3QgaTsKKyAgICB1bnNpZ25lZCBpbnQgY3VyX3ZlcnNpb25fdGFnID0gbmV4dF92ZXJzaW9uX3RhZyAtIDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKDEgPDwgTUNBQ0hFX1NJWkVfRVhQKTsgaSsrKSB7CisgICAgICAgIG1ldGhvZF9jYWNoZVtpXS52ZXJzaW9uID0gMDsKKyAgICAgICAgUHlfQ0xFQVIobWV0aG9kX2NhY2hlW2ldLm5hbWUpOworICAgICAgICBtZXRob2RfY2FjaGVbaV0udmFsdWUgPSBOVUxMOworICAgIH0KKyAgICBuZXh0X3ZlcnNpb25fdGFnID0gMDsKKyAgICAvKiBtYXJrIGFsbCB2ZXJzaW9uIHRhZ3MgYXMgaW52YWxpZCAqLworICAgIFB5VHlwZV9Nb2RpZmllZCgmUHlCYXNlT2JqZWN0X1R5cGUpOworICAgIHJldHVybiBjdXJfdmVyc2lvbl90YWc7CiB9CiAKIHZvaWQKIFB5VHlwZV9Nb2RpZmllZChQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JLyogSW52YWxpZGF0ZSBhbnkgY2FjaGVkIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgYWxsCi0JICAgc3ViY2xhc3Nlcy4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBiYXNlCi0JICAgY2xhc3NlcywgbXJvLCBvciBhdHRyaWJ1dGVzIG9mIHRoZSB0eXBlIGFyZSBhbHRlcmVkLgorICAgIC8qIEludmFsaWRhdGUgYW55IGNhY2hlZCBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIGFsbAorICAgICAgIHN1YmNsYXNzZXMuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgYmFzZQorICAgICAgIGNsYXNzZXMsIG1ybywgb3IgYXR0cmlidXRlcyBvZiB0aGUgdHlwZSBhcmUgYWx0ZXJlZC4KIAotCSAgIEludmFyaWFudHM6CisgICAgICAgSW52YXJpYW50czoKIAotCSAgIC0gUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRyBpcyBuZXZlciBzZXQgaWYKLQkgICAgIFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBRyBpcyBub3Qgc2V0IChlLmcuIG9uIHR5cGUKLQkgICAgIG9iamVjdHMgY29taW5nIGZyb20gbm9uLXJlY29tcGlsZWQgZXh0ZW5zaW9uIG1vZHVsZXMpCisgICAgICAgLSBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHIGlzIG5ldmVyIHNldCBpZgorICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHIGlzIG5vdCBzZXQgKGUuZy4gb24gdHlwZQorICAgICAgICAgb2JqZWN0cyBjb21pbmcgZnJvbSBub24tcmVjb21waWxlZCBleHRlbnNpb24gbW9kdWxlcykKIAotCSAgIC0gYmVmb3JlIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcgY2FuIGJlIHNldCBvbiBhIHR5cGUsCi0JICAgICBpdCBtdXN0IGZpcnN0IGJlIHNldCBvbiBhbGwgc3VwZXIgdHlwZXMuCisgICAgICAgLSBiZWZvcmUgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRyBjYW4gYmUgc2V0IG9uIGEgdHlwZSwKKyAgICAgICAgIGl0IG11c3QgZmlyc3QgYmUgc2V0IG9uIGFsbCBzdXBlciB0eXBlcy4KIAotCSAgIFRoaXMgZnVuY3Rpb24gY2xlYXJzIHRoZSBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHIG9mIGEKLQkgICB0eXBlIChzbyBpdCBtdXN0IGZpcnN0IGNsZWFyIGl0IG9uIGFsbCBzdWJjbGFzc2VzKS4gIFRoZQotCSAgIHRwX3ZlcnNpb25fdGFnIHZhbHVlIGlzIG1lYW5pbmdsZXNzIHVubGVzcyB0aGlzIGZsYWcgaXMgc2V0LgotCSAgIFdlIGRvbid0IGFzc2lnbiBuZXcgdmVyc2lvbiB0YWdzIGVhZ2VybHksIGJ1dCBvbmx5IGFzCi0JICAgbmVlZGVkLgotCSAqLwotCVB5T2JqZWN0ICpyYXcsICpyZWY7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgICAgIFRoaXMgZnVuY3Rpb24gY2xlYXJzIHRoZSBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHIG9mIGEKKyAgICAgICB0eXBlIChzbyBpdCBtdXN0IGZpcnN0IGNsZWFyIGl0IG9uIGFsbCBzdWJjbGFzc2VzKS4gIFRoZQorICAgICAgIHRwX3ZlcnNpb25fdGFnIHZhbHVlIGlzIG1lYW5pbmdsZXNzIHVubGVzcyB0aGlzIGZsYWcgaXMgc2V0LgorICAgICAgIFdlIGRvbid0IGFzc2lnbiBuZXcgdmVyc2lvbiB0YWdzIGVhZ2VybHksIGJ1dCBvbmx5IGFzCisgICAgICAgbmVlZGVkLgorICAgICAqLworICAgIFB5T2JqZWN0ICpyYXcsICpyZWY7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHKSkKLQkJcmV0dXJuOworICAgIGlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRykpCisgICAgICAgIHJldHVybjsKIAotCXJhdyA9IHR5cGUtPnRwX3N1YmNsYXNzZXM7Ci0JaWYgKHJhdyAhPSBOVUxMKSB7Ci0JCW4gPSBQeUxpc3RfR0VUX1NJWkUocmF3KTsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJcmVmID0gUHlMaXN0X0dFVF9JVEVNKHJhdywgaSk7Ci0JCQlyZWYgPSBQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpOwotCQkJaWYgKHJlZiAhPSBQeV9Ob25lKSB7Ci0JCQkJUHlUeXBlX01vZGlmaWVkKChQeVR5cGVPYmplY3QgKilyZWYpOwotCQkJfQotCQl9Ci0JfQotCXR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHOworICAgIHJhdyA9IHR5cGUtPnRwX3N1YmNsYXNzZXM7CisgICAgaWYgKHJhdyAhPSBOVUxMKSB7CisgICAgICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUocmF3KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgcmVmID0gUHlMaXN0X0dFVF9JVEVNKHJhdywgaSk7CisgICAgICAgICAgICByZWYgPSBQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpOworICAgICAgICAgICAgaWYgKHJlZiAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgUHlUeXBlX01vZGlmaWVkKChQeVR5cGVPYmplY3QgKilyZWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHOwogfQogCiBzdGF0aWMgdm9pZAogdHlwZV9tcm9fbW9kaWZpZWQoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYmFzZXMpIHsKLQkvKgotCSAgIENoZWNrIHRoYXQgYWxsIGJhc2UgY2xhc3NlcyBvciBlbGVtZW50cyBvZiB0aGUgbXJvIG9mIHR5cGUgYXJlCi0JICAgYWJsZSB0byBiZSBjYWNoZWQuICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgYmFzZQotCSAgIGNsYXNzZXMgb3IgbXJvIG9mIHRoZSB0eXBlIGFyZSBhbHRlcmVkLgorICAgIC8qCisgICAgICAgQ2hlY2sgdGhhdCBhbGwgYmFzZSBjbGFzc2VzIG9yIGVsZW1lbnRzIG9mIHRoZSBtcm8gb2YgdHlwZSBhcmUKKyAgICAgICBhYmxlIHRvIGJlIGNhY2hlZC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBiYXNlCisgICAgICAgY2xhc3NlcyBvciBtcm8gb2YgdGhlIHR5cGUgYXJlIGFsdGVyZWQuCiAKLQkgICBVbnNldCBIQVZFX1ZFUlNJT05fVEFHIGFuZCBWQUxJRF9WRVJTSU9OX1RBRyBpZiB0aGUgdHlwZQotCSAgIGluaGVyaXRzIGZyb20gYW4gb2xkLXN0eWxlIGNsYXNzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaWYgaXQKLQkgICBhcHBlYXJzIGluIHRoZSBNUk8gb2YgYSBuZXctc3R5bGUgY2xhc3MuICBObyBzdXBwb3J0IGVpdGhlciBmb3IKLQkgICBjdXN0b20gTVJPcyB0aGF0IGluY2x1ZGUgdHlwZXMgdGhhdCBhcmUgbm90IG9mZmljaWFsbHkgc3VwZXIKLQkgICB0eXBlcy4KKyAgICAgICBVbnNldCBIQVZFX1ZFUlNJT05fVEFHIGFuZCBWQUxJRF9WRVJTSU9OX1RBRyBpZiB0aGUgdHlwZQorICAgICAgIGluaGVyaXRzIGZyb20gYW4gb2xkLXN0eWxlIGNsYXNzLCBlaXRoZXIgZGlyZWN0bHkgb3IgaWYgaXQKKyAgICAgICBhcHBlYXJzIGluIHRoZSBNUk8gb2YgYSBuZXctc3R5bGUgY2xhc3MuICBObyBzdXBwb3J0IGVpdGhlciBmb3IKKyAgICAgICBjdXN0b20gTVJPcyB0aGF0IGluY2x1ZGUgdHlwZXMgdGhhdCBhcmUgbm90IG9mZmljaWFsbHkgc3VwZXIKKyAgICAgICB0eXBlcy4KIAotCSAgIENhbGxlZCBmcm9tIG1yb19pbnRlcm5hbCwgd2hpY2ggd2lsbCBzdWJzZXF1ZW50bHkgYmUgY2FsbGVkIG9uCi0JICAgZWFjaCBzdWJjbGFzcyB3aGVuIHRoZWlyIG1ybyBpcyByZWN1cnNpdmVseSB1cGRhdGVkLgotCSAqLwotCVB5X3NzaXplX3QgaSwgbjsKLQlpbnQgY2xlYXIgPSAwOworICAgICAgIENhbGxlZCBmcm9tIG1yb19pbnRlcm5hbCwgd2hpY2ggd2lsbCBzdWJzZXF1ZW50bHkgYmUgY2FsbGVkIG9uCisgICAgICAgZWFjaCBzdWJjbGFzcyB3aGVuIHRoZWlyIG1ybyBpcyByZWN1cnNpdmVseSB1cGRhdGVkLgorICAgICAqLworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBpbnQgY2xlYXIgPSAwOwogCi0JaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcpKQotCQlyZXR1cm47CisgICAgaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcpKQorICAgICAgICByZXR1cm47CiAKLQluID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlQeU9iamVjdCAqYiA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOwotCQlQeVR5cGVPYmplY3QgKmNsczsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqYiA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOworICAgICAgICBQeVR5cGVPYmplY3QgKmNsczsKIAotCQlpZiAoIVB5VHlwZV9DaGVjayhiKSApIHsKLQkJCWNsZWFyID0gMTsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgIGlmICghUHlUeXBlX0NoZWNrKGIpICkgeworICAgICAgICAgICAgY2xlYXIgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQljbHMgPSAoUHlUeXBlT2JqZWN0ICopYjsKKyAgICAgICAgY2xzID0gKFB5VHlwZU9iamVjdCAqKWI7CiAKLQkJaWYgKCFQeVR5cGVfSGFzRmVhdHVyZShjbHMsIFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBRykgfHwKLQkJICAgICFQeVR5cGVfSXNTdWJ0eXBlKHR5cGUsIGNscykpIHsKLQkJCWNsZWFyID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQorICAgICAgICBpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKGNscywgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKSB8fAorICAgICAgICAgICAgIVB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgY2xzKSkgeworICAgICAgICAgICAgY2xlYXIgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoY2xlYXIpCi0JCXR5cGUtPnRwX2ZsYWdzICY9IH4oUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHfAotCQkgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcpOworICAgIGlmIChjbGVhcikKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgJj0gfihQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUd8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRyk7CiB9CiAKIHN0YXRpYyBpbnQKIGFzc2lnbl92ZXJzaW9uX3RhZyhQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JLyogRW5zdXJlIHRoYXQgdGhlIHRwX3ZlcnNpb25fdGFnIGlzIHZhbGlkIGFuZCBzZXQKLQkgICBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHLiAgVG8gcmVzcGVjdCB0aGUgaW52YXJpYW50LCB0aGlzCi0JICAgbXVzdCBmaXJzdCBiZSBkb25lIG9uIGFsbCBzdXBlciBjbGFzc2VzLiAgUmV0dXJuIDAgaWYgdGhpcwotCSAgIGNhbm5vdCBiZSBkb25lLCAxIGlmIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcuCi0JKi8KLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlPYmplY3QgKmJhc2VzOworICAgIC8qIEVuc3VyZSB0aGF0IHRoZSB0cF92ZXJzaW9uX3RhZyBpcyB2YWxpZCBhbmQgc2V0CisgICAgICAgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRy4gIFRvIHJlc3BlY3QgdGhlIGludmFyaWFudCwgdGhpcworICAgICAgIG11c3QgZmlyc3QgYmUgZG9uZSBvbiBhbGwgc3VwZXIgY2xhc3Nlcy4gIFJldHVybiAwIGlmIHRoaXMKKyAgICAgICBjYW5ub3QgYmUgZG9uZSwgMSBpZiBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHLgorICAgICovCisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpiYXNlczsKIAotCWlmIChQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHKSkKLQkJcmV0dXJuIDE7Ci0JaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUcpKQotCQlyZXR1cm4gMDsKLQlpZiAoIVB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfUkVBRFkpKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRykpCisgICAgICAgIHJldHVybiAxOworICAgIGlmICghUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFQeVR5cGVfSGFzRmVhdHVyZSh0eXBlLCBQeV9UUEZMQUdTX1JFQURZKSkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQl0eXBlLT50cF92ZXJzaW9uX3RhZyA9IG5leHRfdmVyc2lvbl90YWcrKzsKLQkvKiBmb3Igc3RyZXNzLXRlc3Rpbmc6IG5leHRfdmVyc2lvbl90YWcgJj0gMHhGRjsgKi8KKyAgICB0eXBlLT50cF92ZXJzaW9uX3RhZyA9IG5leHRfdmVyc2lvbl90YWcrKzsKKyAgICAvKiBmb3Igc3RyZXNzLXRlc3Rpbmc6IG5leHRfdmVyc2lvbl90YWcgJj0gMHhGRjsgKi8KIAotCWlmICh0eXBlLT50cF92ZXJzaW9uX3RhZyA9PSAwKSB7Ci0JCS8qIHdyYXAtYXJvdW5kIG9yIGp1c3Qgc3RhcnRpbmcgUHl0aG9uIC0gY2xlYXIgdGhlIHdob2xlCi0JCSAgIGNhY2hlIGJ5IGZpbGxpbmcgbmFtZXMgd2l0aCByZWZlcmVuY2VzIHRvIFB5X05vbmUuCi0JCSAgIFZhbHVlcyBhcmUgYWxzbyBzZXQgdG8gTlVMTCBmb3IgYWRkZWQgcHJvdGVjdGlvbiwgYXMgdGhleQotCQkgICBhcmUgYm9ycm93ZWQgcmVmZXJlbmNlICovCi0JCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBNQ0FDSEVfU0laRV9FWFApOyBpKyspIHsKLQkJCW1ldGhvZF9jYWNoZVtpXS52YWx1ZSA9IE5VTEw7Ci0JCQlQeV9YREVDUkVGKG1ldGhvZF9jYWNoZVtpXS5uYW1lKTsKLQkJCW1ldGhvZF9jYWNoZVtpXS5uYW1lID0gUHlfTm9uZTsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJfQotCQkvKiBtYXJrIGFsbCB2ZXJzaW9uIHRhZ3MgYXMgaW52YWxpZCAqLwotCQlQeVR5cGVfTW9kaWZpZWQoJlB5QmFzZU9iamVjdF9UeXBlKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWJhc2VzID0gdHlwZS0+dHBfYmFzZXM7Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJYXNzZXJ0KFB5VHlwZV9DaGVjayhiKSk7Ci0JCWlmICghYXNzaWduX3ZlcnNpb25fdGFnKChQeVR5cGVPYmplY3QgKiliKSkKLQkJCXJldHVybiAwOwotCX0KLQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHOwotCXJldHVybiAxOworICAgIGlmICh0eXBlLT50cF92ZXJzaW9uX3RhZyA9PSAwKSB7CisgICAgICAgIC8qIHdyYXAtYXJvdW5kIG9yIGp1c3Qgc3RhcnRpbmcgUHl0aG9uIC0gY2xlYXIgdGhlIHdob2xlCisgICAgICAgICAgIGNhY2hlIGJ5IGZpbGxpbmcgbmFtZXMgd2l0aCByZWZlcmVuY2VzIHRvIFB5X05vbmUuCisgICAgICAgICAgIFZhbHVlcyBhcmUgYWxzbyBzZXQgdG8gTlVMTCBmb3IgYWRkZWQgcHJvdGVjdGlvbiwgYXMgdGhleQorICAgICAgICAgICBhcmUgYm9ycm93ZWQgcmVmZXJlbmNlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoMSA8PCBNQ0FDSEVfU0laRV9FWFApOyBpKyspIHsKKyAgICAgICAgICAgIG1ldGhvZF9jYWNoZVtpXS52YWx1ZSA9IE5VTEw7CisgICAgICAgICAgICBQeV9YREVDUkVGKG1ldGhvZF9jYWNoZVtpXS5uYW1lKTsKKyAgICAgICAgICAgIG1ldGhvZF9jYWNoZVtpXS5uYW1lID0gUHlfTm9uZTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgfQorICAgICAgICAvKiBtYXJrIGFsbCB2ZXJzaW9uIHRhZ3MgYXMgaW52YWxpZCAqLworICAgICAgICBQeVR5cGVfTW9kaWZpZWQoJlB5QmFzZU9iamVjdF9UeXBlKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGJhc2VzID0gdHlwZS0+dHBfYmFzZXM7CisgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayhiKSk7CisgICAgICAgIGlmICghYXNzaWduX3ZlcnNpb25fdGFnKChQeVR5cGVPYmplY3QgKiliKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1ZBTElEX1ZFUlNJT05fVEFHOworICAgIHJldHVybiAxOwogfQogCiAKIHN0YXRpYyBQeU1lbWJlckRlZiB0eXBlX21lbWJlcnNbXSA9IHsKLQl7Il9fYmFzaWNzaXplX18iLCBUX0lOVCwgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LHRwX2Jhc2ljc2l6ZSksUkVBRE9OTFl9LAotCXsiX19pdGVtc2l6ZV9fIiwgVF9JTlQsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfaXRlbXNpemUpLCBSRUFET05MWX0sCi0JeyJfX2ZsYWdzX18iLCBUX0xPTkcsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfZmxhZ3MpLCBSRUFET05MWX0sCi0JeyJfX3dlYWtyZWZvZmZzZXRfXyIsIFRfTE9ORywKLQkgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF93ZWFrbGlzdG9mZnNldCksIFJFQURPTkxZfSwKLQl7Il9fYmFzZV9fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfYmFzZSksIFJFQURPTkxZfSwKLQl7Il9fZGljdG9mZnNldF9fIiwgVF9MT05HLAotCSBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX2RpY3RvZmZzZXQpLCBSRUFET05MWX0sCi0JeyJfX21yb19fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfbXJvKSwgUkVBRE9OTFl9LAotCXswfQorICAgIHsiX19iYXNpY3NpemVfXyIsIFRfSU5ULCBvZmZzZXRvZihQeVR5cGVPYmplY3QsdHBfYmFzaWNzaXplKSxSRUFET05MWX0sCisgICAgeyJfX2l0ZW1zaXplX18iLCBUX0lOVCwgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF9pdGVtc2l6ZSksIFJFQURPTkxZfSwKKyAgICB7Il9fZmxhZ3NfXyIsIFRfTE9ORywgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF9mbGFncyksIFJFQURPTkxZfSwKKyAgICB7Il9fd2Vha3JlZm9mZnNldF9fIiwgVF9MT05HLAorICAgICBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX3dlYWtsaXN0b2Zmc2V0KSwgUkVBRE9OTFl9LAorICAgIHsiX19iYXNlX18iLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF9iYXNlKSwgUkVBRE9OTFl9LAorICAgIHsiX19kaWN0b2Zmc2V0X18iLCBUX0xPTkcsCisgICAgIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfZGljdG9mZnNldCksIFJFQURPTkxZfSwKKyAgICB7Il9fbXJvX18iLCBUX09CSkVDVCwgb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF9tcm8pLCBSRUFET05MWX0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9uYW1lKFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKLQljb25zdCBjaGFyICpzOworICAgIGNvbnN0IGNoYXIgKnM7CiAKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSB7Ci0JCVB5SGVhcFR5cGVPYmplY3QqIGV0ID0gKFB5SGVhcFR5cGVPYmplY3QqKXR5cGU7CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgeworICAgICAgICBQeUhlYXBUeXBlT2JqZWN0KiBldCA9IChQeUhlYXBUeXBlT2JqZWN0Kil0eXBlOwogCi0JCVB5X0lOQ1JFRihldC0+aHRfbmFtZSk7Ci0JCXJldHVybiBldC0+aHRfbmFtZTsKLQl9Ci0JZWxzZSB7Ci0JCXMgPSBzdHJyY2hyKHR5cGUtPnRwX25hbWUsICcuJyk7Ci0JCWlmIChzID09IE5VTEwpCi0JCQlzID0gdHlwZS0+dHBfbmFtZTsKLQkJZWxzZQotCQkJcysrOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKLQl9CisgICAgICAgIFB5X0lOQ1JFRihldC0+aHRfbmFtZSk7CisgICAgICAgIHJldHVybiBldC0+aHRfbmFtZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHMgPSBzdHJyY2hyKHR5cGUtPnRwX25hbWUsICcuJyk7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICBzID0gdHlwZS0+dHBfbmFtZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcysrOworICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfc2V0X25hbWUoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JUHlIZWFwVHlwZU9iamVjdCogZXQ7CisgICAgUHlIZWFwVHlwZU9iamVjdCogZXQ7CiAKLQlpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYW4ndCBzZXQgJXMuX19uYW1lX18iLCB0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIXZhbHVlKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJjYW4ndCBkZWxldGUgJXMuX19uYW1lX18iLCB0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY2FuIG9ubHkgYXNzaWduIHN0cmluZyB0byAlcy5fX25hbWVfXywgbm90ICclcyciLAotCQkJICAgICB0eXBlLT50cF9uYW1lLCBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpKQotCSAgICAhPSAoc2l6ZV90KVB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCSAgICAgIl9fbmFtZV9fIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBzZXQgJXMuX19uYW1lX18iLCB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlICVzLl9fbmFtZV9fIiwgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW4gb25seSBhc3NpZ24gc3RyaW5nIHRvICVzLl9fbmFtZV9fLCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpKQorICAgICAgICAhPSAoc2l6ZV90KVB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJfX25hbWVfXyBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWV0ID0gKFB5SGVhcFR5cGVPYmplY3QqKXR5cGU7CisgICAgZXQgPSAoUHlIZWFwVHlwZU9iamVjdCopdHlwZTsKIAotCVB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKIAotCVB5X0RFQ1JFRihldC0+aHRfbmFtZSk7Ci0JZXQtPmh0X25hbWUgPSB2YWx1ZTsKKyAgICBQeV9ERUNSRUYoZXQtPmh0X25hbWUpOworICAgIGV0LT5odF9uYW1lID0gdmFsdWU7CiAKLQl0eXBlLT50cF9uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKTsKKyAgICB0eXBlLT50cF9uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKHZhbHVlKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9tb2R1bGUoUHlUeXBlT2JqZWN0ICp0eXBlLCB2b2lkICpjb250ZXh0KQogewotCVB5T2JqZWN0ICptb2Q7Ci0JY2hhciAqczsKKyAgICBQeU9iamVjdCAqbW9kOworICAgIGNoYXIgKnM7CiAKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSB7Ci0JCW1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX21vZHVsZV9fIik7Ci0JCWlmICghbW9kKSB7IAotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiX19tb2R1bGVfXyIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfWElOQ1JFRihtb2QpOwotCQlyZXR1cm4gbW9kOwotCX0KLQllbHNlIHsKLQkJcyA9IHN0cnJjaHIodHlwZS0+dHBfbmFtZSwgJy4nKTsKLQkJaWYgKHMgIT0gTlVMTCkKLQkJCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLQkJCSAgICB0eXBlLT50cF9uYW1lLCAoUHlfc3NpemVfdCkocyAtIHR5cGUtPnRwX25hbWUpKTsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIl9fYnVpbHRpbl9fIik7Ci0JfQorICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpIHsKKyAgICAgICAgbW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fbW9kdWxlX18iKTsKKyAgICAgICAgaWYgKCFtb2QpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgIl9fbW9kdWxlX18iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFB5X1hJTkNSRUYobW9kKTsKKyAgICAgICAgcmV0dXJuIG1vZDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHMgPSBzdHJyY2hyKHR5cGUtPnRwX25hbWUsICcuJyk7CisgICAgICAgIGlmIChzICE9IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgKFB5X3NzaXplX3QpKHMgLSB0eXBlLT50cF9uYW1lKSk7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfX2J1aWx0aW5fXyIpOworICAgIH0KIH0KIAogc3RhdGljIGludAogdHlwZV9zZXRfbW9kdWxlKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQogewotCWlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbid0IHNldCAlcy5fX21vZHVsZV9fIiwgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCF2YWx1ZSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY2FuJ3QgZGVsZXRlICVzLl9fbW9kdWxlX18iLCB0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgc2V0ICVzLl9fbW9kdWxlX18iLCB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlICVzLl9fbW9kdWxlX18iLCB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCVB5VHlwZV9Nb2RpZmllZCh0eXBlKTsKKyAgICBQeVR5cGVfTW9kaWZpZWQodHlwZSk7CiAKLQlyZXR1cm4gUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fbW9kdWxlX18iLCB2YWx1ZSk7CisgICAgcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX21vZHVsZV9fIiwgdmFsdWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9hYnN0cmFjdG1ldGhvZHMoUHlUeXBlT2JqZWN0ICp0eXBlLCB2b2lkICpjb250ZXh0KQogewotCVB5T2JqZWN0ICptb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LAotCQkJCQkgICAgICJfX2Fic3RyYWN0bWV0aG9kc19fIik7Ci0JaWYgKCFtb2QpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiX19hYnN0cmFjdG1ldGhvZHNfXyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfWElOQ1JFRihtb2QpOwotCXJldHVybiBtb2Q7CisgICAgUHlPYmplY3QgKm1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2Fic3RyYWN0bWV0aG9kc19fIik7CisgICAgaWYgKCFtb2QpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAiX19hYnN0cmFjdG1ldGhvZHNfXyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfWElOQ1JFRihtb2QpOworICAgIHJldHVybiBtb2Q7CiB9CiAKIHN0YXRpYyBpbnQKIHR5cGVfc2V0X2Fic3RyYWN0bWV0aG9kcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY29udGV4dCkKIHsKLQkvKiBfX2Fic3RyYWN0bWV0aG9kc19fIHNob3VsZCBvbmx5IGJlIHNldCBvbmNlIG9uIGEgdHlwZSwgaW4KLQkgICBhYmMuQUJDTWV0YS5fX25ld19fLCBzbyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcKLQkgICBzcGVjaWFsIHRvIHVwZGF0ZSBzdWJjbGFzc2VzLgotCSovCi0JaW50IHJlcyA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsCi0JCQkJICAgICAgICJfX2Fic3RyYWN0bWV0aG9kc19fIiwgdmFsdWUpOwotCWlmIChyZXMgPT0gMCkgewotCQlQeVR5cGVfTW9kaWZpZWQodHlwZSk7Ci0JCWlmICh2YWx1ZSAmJiBQeU9iamVjdF9Jc1RydWUodmFsdWUpKSB7Ci0JCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0lTX0FCU1RSQUNUOwotCQl9Ci0JCWVsc2UgewotCQkJdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfSVNfQUJTVFJBQ1Q7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlczsKKyAgICAvKiBfX2Fic3RyYWN0bWV0aG9kc19fIHNob3VsZCBvbmx5IGJlIHNldCBvbmNlIG9uIGEgdHlwZSwgaW4KKyAgICAgICBhYmMuQUJDTWV0YS5fX25ld19fLCBzbyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcKKyAgICAgICBzcGVjaWFsIHRvIHVwZGF0ZSBzdWJjbGFzc2VzLgorICAgICovCisgICAgaW50IHJlcyA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2Fic3RyYWN0bWV0aG9kc19fIiwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICBQeVR5cGVfTW9kaWZpZWQodHlwZSk7CisgICAgICAgIGlmICh2YWx1ZSAmJiBQeU9iamVjdF9Jc1RydWUodmFsdWUpKSB7CisgICAgICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0lTX0FCU1RSQUNUOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfSVNfQUJTVFJBQ1Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfZ2V0X2Jhc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKLQlQeV9JTkNSRUYodHlwZS0+dHBfYmFzZXMpOwotCXJldHVybiB0eXBlLT50cF9iYXNlczsKKyAgICBQeV9JTkNSRUYodHlwZS0+dHBfYmFzZXMpOworICAgIHJldHVybiB0eXBlLT50cF9iYXNlczsKIH0KIAogc3RhdGljIFB5VHlwZU9iamVjdCAqYmVzdF9iYXNlKFB5T2JqZWN0ICopOwpAQCAtMzU0LDQzMyArMzU0LDQzMyBAQAogCiB0eXBlZGVmIGludCAoKnVwZGF0ZV9jYWxsYmFjaykoUHlUeXBlT2JqZWN0ICosIHZvaWQgKik7CiBzdGF0aWMgaW50IHVwZGF0ZV9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKm5hbWUsCi0JCQkgICAgIHVwZGF0ZV9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqZGF0YSk7CiBzdGF0aWMgaW50IHJlY3Vyc2VfZG93bl9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKm5hbWUsCi0JCQkJICAgdXBkYXRlX2NhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX2NhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpkYXRhKTsKIAogc3RhdGljIGludAogbXJvX3N1YmNsYXNzZXMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCogdGVtcCkKIHsKLQlQeVR5cGVPYmplY3QgKnN1YmNsYXNzOwotCVB5T2JqZWN0ICpyZWYsICpzdWJjbGFzc2VzLCAqb2xkX21ybzsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlUeXBlT2JqZWN0ICpzdWJjbGFzczsKKyAgICBQeU9iamVjdCAqcmVmLCAqc3ViY2xhc3NlcywgKm9sZF9tcm87CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0Jc3ViY2xhc3NlcyA9IHR5cGUtPnRwX3N1YmNsYXNzZXM7Ci0JaWYgKHN1YmNsYXNzZXMgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JYXNzZXJ0KFB5TGlzdF9DaGVjayhzdWJjbGFzc2VzKSk7Ci0JbiA9IFB5TGlzdF9HRVRfU0laRShzdWJjbGFzc2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXJlZiA9IFB5TGlzdF9HRVRfSVRFTShzdWJjbGFzc2VzLCBpKTsKLQkJYXNzZXJ0KFB5V2Vha3JlZl9DaGVja1JlZihyZWYpKTsKLQkJc3ViY2xhc3MgPSAoUHlUeXBlT2JqZWN0ICopUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKTsKLQkJYXNzZXJ0KHN1YmNsYXNzICE9IE5VTEwpOwotCQlpZiAoKFB5T2JqZWN0ICopc3ViY2xhc3MgPT0gUHlfTm9uZSkKLQkJCWNvbnRpbnVlOwotCQlhc3NlcnQoUHlUeXBlX0NoZWNrKHN1YmNsYXNzKSk7Ci0JCW9sZF9tcm8gPSBzdWJjbGFzcy0+dHBfbXJvOwotCQlpZiAobXJvX2ludGVybmFsKHN1YmNsYXNzKSA8IDApIHsKLQkJCXN1YmNsYXNzLT50cF9tcm8gPSBvbGRfbXJvOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWVsc2UgewotCQkJUHlPYmplY3QqIHR1cGxlOwotCQkJdHVwbGUgPSBQeVR1cGxlX1BhY2soMiwgc3ViY2xhc3MsIG9sZF9tcm8pOwotCQkJUHlfREVDUkVGKG9sZF9tcm8pOwotCQkJaWYgKCF0dXBsZSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAoUHlMaXN0X0FwcGVuZCh0ZW1wLCB0dXBsZSkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCVB5X0RFQ1JFRih0dXBsZSk7Ci0JCX0KLQkJaWYgKG1yb19zdWJjbGFzc2VzKHN1YmNsYXNzLCB0ZW1wKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIHN1YmNsYXNzZXMgPSB0eXBlLT50cF9zdWJjbGFzc2VzOworICAgIGlmIChzdWJjbGFzc2VzID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGFzc2VydChQeUxpc3RfQ2hlY2soc3ViY2xhc3NlcykpOworICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoc3ViY2xhc3Nlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICByZWYgPSBQeUxpc3RfR0VUX0lURU0oc3ViY2xhc3NlcywgaSk7CisgICAgICAgIGFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7CisgICAgICAgIHN1YmNsYXNzID0gKFB5VHlwZU9iamVjdCAqKVB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZik7CisgICAgICAgIGFzc2VydChzdWJjbGFzcyAhPSBOVUxMKTsKKyAgICAgICAgaWYgKChQeU9iamVjdCAqKXN1YmNsYXNzID09IFB5X05vbmUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayhzdWJjbGFzcykpOworICAgICAgICBvbGRfbXJvID0gc3ViY2xhc3MtPnRwX21ybzsKKyAgICAgICAgaWYgKG1yb19pbnRlcm5hbChzdWJjbGFzcykgPCAwKSB7CisgICAgICAgICAgICBzdWJjbGFzcy0+dHBfbXJvID0gb2xkX21ybzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T2JqZWN0KiB0dXBsZTsKKyAgICAgICAgICAgIHR1cGxlID0gUHlUdXBsZV9QYWNrKDIsIHN1YmNsYXNzLCBvbGRfbXJvKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvbGRfbXJvKTsKKyAgICAgICAgICAgIGlmICghdHVwbGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQodGVtcCwgdHVwbGUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBQeV9ERUNSRUYodHVwbGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtcm9fc3ViY2xhc3NlcyhzdWJjbGFzcywgdGVtcCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogdHlwZV9zZXRfYmFzZXMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JUHlfc3NpemVfdCBpOwotCWludCByID0gMDsKLQlQeU9iamVjdCAqb2IsICp0ZW1wOwotCVB5VHlwZU9iamVjdCAqbmV3X2Jhc2UsICpvbGRfYmFzZTsKLQlQeU9iamVjdCAqb2xkX2Jhc2VzLCAqb2xkX21ybzsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHIgPSAwOworICAgIFB5T2JqZWN0ICpvYiwgKnRlbXA7CisgICAgUHlUeXBlT2JqZWN0ICpuZXdfYmFzZSwgKm9sZF9iYXNlOworICAgIFB5T2JqZWN0ICpvbGRfYmFzZXMsICpvbGRfbXJvOwogCi0JaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiY2FuJ3Qgc2V0ICVzLl9fYmFzZXNfXyIsIHR5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghdmFsdWUpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbid0IGRlbGV0ZSAlcy5fX2Jhc2VzX18iLCB0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoIVB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgImNhbiBvbmx5IGFzc2lnbiB0dXBsZSB0byAlcy5fX2Jhc2VzX18sIG5vdCAlcyIsCi0JCQkgICAgIHR5cGUtPnRwX25hbWUsIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlUdXBsZV9HRVRfU0laRSh2YWx1ZSkgPT0gMCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJjYW4gb25seSBhc3NpZ24gbm9uLWVtcHR5IHR1cGxlIHRvICVzLl9fYmFzZXNfXywgbm90ICgpIiwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUodmFsdWUpOyBpKyspIHsKLQkJb2IgPSBQeVR1cGxlX0dFVF9JVEVNKHZhbHVlLCBpKTsKLQkJaWYgKCFQeUNsYXNzX0NoZWNrKG9iKSAmJiAhUHlUeXBlX0NoZWNrKG9iKSkgewotCQkJUHlFcnJfRm9ybWF0KAotCQkJCVB5RXhjX1R5cGVFcnJvciwKLQkiJXMuX19iYXNlc19fIG11c3QgYmUgdHVwbGUgb2Ygb2xkLSBvciBuZXctc3R5bGUgY2xhc3Nlcywgbm90ICclcyciLAotCQkJCXR5cGUtPnRwX25hbWUsIFB5X1RZUEUob2IpLT50cF9uYW1lKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpZiAoUHlUeXBlX0NoZWNrKG9iKSkgewotCQkJaWYgKFB5VHlwZV9Jc1N1YnR5cGUoKFB5VHlwZU9iamVjdCopb2IsIHR5cGUpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJhIF9fYmFzZXNfXyBpdGVtIGNhdXNlcyBhbiBpbmhlcml0YW5jZSBjeWNsZSIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCX0KKyAgICBpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgc2V0ICVzLl9fYmFzZXNfXyIsIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgJXMuX19iYXNlc19fIiwgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICJjYW4gb25seSBhc3NpZ24gdHVwbGUgdG8gJXMuX19iYXNlc19fLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUodmFsdWUpID09IDApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAiY2FuIG9ubHkgYXNzaWduIG5vbi1lbXB0eSB0dXBsZSB0byAlcy5fX2Jhc2VzX18sIG5vdCAoKSIsCisgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHZhbHVlKTsgaSsrKSB7CisgICAgICAgIG9iID0gUHlUdXBsZV9HRVRfSVRFTSh2YWx1ZSwgaSk7CisgICAgICAgIGlmICghUHlDbGFzc19DaGVjayhvYikgJiYgIVB5VHlwZV9DaGVjayhvYikpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgIiVzLl9fYmFzZXNfXyBtdXN0IGJlIHR1cGxlIG9mIG9sZC0gb3IgbmV3LXN0eWxlIGNsYXNzZXMsIG5vdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lLCBQeV9UWVBFKG9iKS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlUeXBlX0NoZWNrKG9iKSkgeworICAgICAgICAgICAgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoKFB5VHlwZU9iamVjdCopb2IsIHR5cGUpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJhIF9fYmFzZXNfXyBpdGVtIGNhdXNlcyBhbiBpbmhlcml0YW5jZSBjeWNsZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCW5ld19iYXNlID0gYmVzdF9iYXNlKHZhbHVlKTsKKyAgICBuZXdfYmFzZSA9IGJlc3RfYmFzZSh2YWx1ZSk7CiAKLQlpZiAoIW5ld19iYXNlKSB7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKCFuZXdfYmFzZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JaWYgKCFjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KHR5cGUtPnRwX2Jhc2UsIG5ld19iYXNlLCAiX19iYXNlc19fIikpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIWNvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQodHlwZS0+dHBfYmFzZSwgbmV3X2Jhc2UsICJfX2Jhc2VzX18iKSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUHlfSU5DUkVGKG5ld19iYXNlKTsKLQlQeV9JTkNSRUYodmFsdWUpOworICAgIFB5X0lOQ1JFRihuZXdfYmFzZSk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKIAotCW9sZF9iYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOwotCW9sZF9iYXNlID0gdHlwZS0+dHBfYmFzZTsKLQlvbGRfbXJvID0gdHlwZS0+dHBfbXJvOworICAgIG9sZF9iYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOworICAgIG9sZF9iYXNlID0gdHlwZS0+dHBfYmFzZTsKKyAgICBvbGRfbXJvID0gdHlwZS0+dHBfbXJvOwogCi0JdHlwZS0+dHBfYmFzZXMgPSB2YWx1ZTsKLQl0eXBlLT50cF9iYXNlID0gbmV3X2Jhc2U7CisgICAgdHlwZS0+dHBfYmFzZXMgPSB2YWx1ZTsKKyAgICB0eXBlLT50cF9iYXNlID0gbmV3X2Jhc2U7CiAKLQlpZiAobXJvX2ludGVybmFsKHR5cGUpIDwgMCkgewotCQlnb3RvIGJhaWw7Ci0JfQorICAgIGlmIChtcm9faW50ZXJuYWwodHlwZSkgPCAwKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CiAKLQl0ZW1wID0gUHlMaXN0X05ldygwKTsKLQlpZiAoIXRlbXApCi0JCWdvdG8gYmFpbDsKKyAgICB0ZW1wID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoIXRlbXApCisgICAgICAgIGdvdG8gYmFpbDsKIAotCXIgPSBtcm9fc3ViY2xhc3Nlcyh0eXBlLCB0ZW1wKTsKKyAgICByID0gbXJvX3N1YmNsYXNzZXModHlwZSwgdGVtcCk7CiAKLQlpZiAociA8IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IFB5TGlzdF9TaXplKHRlbXApOyBpKyspIHsKLQkJCVB5VHlwZU9iamVjdCogY2xzOwotCQkJUHlPYmplY3QqIG1ybzsKLQkJCVB5QXJnX1VucGFja1R1cGxlKFB5TGlzdF9HRVRfSVRFTSh0ZW1wLCBpKSwKLQkJCQkJICIiLCAyLCAyLCAmY2xzLCAmbXJvKTsKLQkJCVB5X0lOQ1JFRihtcm8pOwotCQkJb2IgPSBjbHMtPnRwX21ybzsKLQkJCWNscy0+dHBfbXJvID0gbXJvOwotCQkJUHlfREVDUkVGKG9iKTsKLQkJfQotCQlQeV9ERUNSRUYodGVtcCk7Ci0JCWdvdG8gYmFpbDsKLQl9CisgICAgaWYgKHIgPCAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeUxpc3RfU2l6ZSh0ZW1wKTsgaSsrKSB7CisgICAgICAgICAgICBQeVR5cGVPYmplY3QqIGNsczsKKyAgICAgICAgICAgIFB5T2JqZWN0KiBtcm87CisgICAgICAgICAgICBQeUFyZ19VbnBhY2tUdXBsZShQeUxpc3RfR0VUX0lURU0odGVtcCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLCAyLCAyLCAmY2xzLCAmbXJvKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihtcm8pOworICAgICAgICAgICAgb2IgPSBjbHMtPnRwX21ybzsKKyAgICAgICAgICAgIGNscy0+dHBfbXJvID0gbXJvOworICAgICAgICAgICAgUHlfREVDUkVGKG9iKTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICB9CiAKLQlQeV9ERUNSRUYodGVtcCk7CisgICAgUHlfREVDUkVGKHRlbXApOwogCi0JLyogYW55IGJhc2UgdGhhdCB3YXMgaW4gX19iYXNlc19fIGJ1dCBub3cgaXNuJ3QsIHdlCi0JICAgbmVlZCB0byByZW1vdmUgfHR5cGV8IGZyb20gaXRzIHRwX3N1YmNsYXNzZXMuCi0JICAgY29udmVyc2VseSwgYW55IGNsYXNzIG5vdyBpbiBfX2Jhc2VzX18gdGhhdCB3YXNuJ3QKLQkgICBuZWVkcyB0byBoYXZlIHx0eXBlfCBhZGRlZCB0byBpdHMgc3ViY2xhc3Nlcy4gKi8KKyAgICAvKiBhbnkgYmFzZSB0aGF0IHdhcyBpbiBfX2Jhc2VzX18gYnV0IG5vdyBpc24ndCwgd2UKKyAgICAgICBuZWVkIHRvIHJlbW92ZSB8dHlwZXwgZnJvbSBpdHMgdHBfc3ViY2xhc3Nlcy4KKyAgICAgICBjb252ZXJzZWx5LCBhbnkgY2xhc3Mgbm93IGluIF9fYmFzZXNfXyB0aGF0IHdhc24ndAorICAgICAgIG5lZWRzIHRvIGhhdmUgfHR5cGV8IGFkZGVkIHRvIGl0cyBzdWJjbGFzc2VzLiAqLwogCi0JLyogZm9yIG5vdywgc29kIHRoYXQ6IGp1c3QgcmVtb3ZlIGZyb20gYWxsIG9sZF9iYXNlcywKLQkgICBhZGQgdG8gYWxsIG5ld19iYXNlcyAqLworICAgIC8qIGZvciBub3csIHNvZCB0aGF0OiBqdXN0IHJlbW92ZSBmcm9tIGFsbCBvbGRfYmFzZXMsCisgICAgICAgYWRkIHRvIGFsbCBuZXdfYmFzZXMgKi8KIAotCWZvciAoaSA9IFB5VHVwbGVfR0VUX1NJWkUob2xkX2Jhc2VzKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCW9iID0gUHlUdXBsZV9HRVRfSVRFTShvbGRfYmFzZXMsIGkpOwotCQlpZiAoUHlUeXBlX0NoZWNrKG9iKSkgewotCQkJcmVtb3ZlX3N1YmNsYXNzKAotCQkJCShQeVR5cGVPYmplY3QqKW9iLCB0eXBlKTsKLQkJfQotCX0KKyAgICBmb3IgKGkgPSBQeVR1cGxlX0dFVF9TSVpFKG9sZF9iYXNlcykgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBvYiA9IFB5VHVwbGVfR0VUX0lURU0ob2xkX2Jhc2VzLCBpKTsKKyAgICAgICAgaWYgKFB5VHlwZV9DaGVjayhvYikpIHsKKyAgICAgICAgICAgIHJlbW92ZV9zdWJjbGFzcygKKyAgICAgICAgICAgICAgICAoUHlUeXBlT2JqZWN0KilvYiwgdHlwZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlmb3IgKGkgPSBQeVR1cGxlX0dFVF9TSVpFKHZhbHVlKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCW9iID0gUHlUdXBsZV9HRVRfSVRFTSh2YWx1ZSwgaSk7Ci0JCWlmIChQeVR5cGVfQ2hlY2sob2IpKSB7Ci0JCQlpZiAoYWRkX3N1YmNsYXNzKChQeVR5cGVPYmplY3QqKW9iLCB0eXBlKSA8IDApCi0JCQkJciA9IC0xOwotCQl9Ci0JfQorICAgIGZvciAoaSA9IFB5VHVwbGVfR0VUX1NJWkUodmFsdWUpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgb2IgPSBQeVR1cGxlX0dFVF9JVEVNKHZhbHVlLCBpKTsKKyAgICAgICAgaWYgKFB5VHlwZV9DaGVjayhvYikpIHsKKyAgICAgICAgICAgIGlmIChhZGRfc3ViY2xhc3MoKFB5VHlwZU9iamVjdCopb2IsIHR5cGUpIDwgMCkKKyAgICAgICAgICAgICAgICByID0gLTE7CisgICAgICAgIH0KKyAgICB9CiAKLQl1cGRhdGVfYWxsX3Nsb3RzKHR5cGUpOworICAgIHVwZGF0ZV9hbGxfc2xvdHModHlwZSk7CiAKLQlQeV9ERUNSRUYob2xkX2Jhc2VzKTsKLQlQeV9ERUNSRUYob2xkX2Jhc2UpOwotCVB5X0RFQ1JFRihvbGRfbXJvKTsKKyAgICBQeV9ERUNSRUYob2xkX2Jhc2VzKTsKKyAgICBQeV9ERUNSRUYob2xkX2Jhc2UpOworICAgIFB5X0RFQ1JFRihvbGRfbXJvKTsKIAotCXJldHVybiByOworICAgIHJldHVybiByOwogCiAgIGJhaWw6Ci0JUHlfREVDUkVGKHR5cGUtPnRwX2Jhc2VzKTsKLQlQeV9ERUNSRUYodHlwZS0+dHBfYmFzZSk7Ci0JaWYgKHR5cGUtPnRwX21ybyAhPSBvbGRfbXJvKSB7Ci0JCVB5X0RFQ1JFRih0eXBlLT50cF9tcm8pOwotCX0KKyAgICBQeV9ERUNSRUYodHlwZS0+dHBfYmFzZXMpOworICAgIFB5X0RFQ1JFRih0eXBlLT50cF9iYXNlKTsKKyAgICBpZiAodHlwZS0+dHBfbXJvICE9IG9sZF9tcm8pIHsKKyAgICAgICAgUHlfREVDUkVGKHR5cGUtPnRwX21ybyk7CisgICAgfQogCi0JdHlwZS0+dHBfYmFzZXMgPSBvbGRfYmFzZXM7Ci0JdHlwZS0+dHBfYmFzZSA9IG9sZF9iYXNlOwotCXR5cGUtPnRwX21ybyA9IG9sZF9tcm87CisgICAgdHlwZS0+dHBfYmFzZXMgPSBvbGRfYmFzZXM7CisgICAgdHlwZS0+dHBfYmFzZSA9IG9sZF9iYXNlOworICAgIHR5cGUtPnRwX21ybyA9IG9sZF9tcm87CiAKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9kaWN0KFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKLQlpZiAodHlwZS0+dHBfZGljdCA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBQeURpY3RQcm94eV9OZXcodHlwZS0+dHBfZGljdCk7CisgICAgaWYgKHR5cGUtPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUHlEaWN0UHJveHlfTmV3KHR5cGUtPnRwX2RpY3QpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9nZXRfZG9jKFB5VHlwZU9iamVjdCAqdHlwZSwgdm9pZCAqY29udGV4dCkKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCWlmICghKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkgJiYgdHlwZS0+dHBfZG9jICE9IE5VTEwpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHR5cGUtPnRwX2RvYyk7Ci0JcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fZG9jX18iKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJcmVzdWx0ID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JfQotCWVsc2UgaWYgKFB5X1RZUEUocmVzdWx0KS0+dHBfZGVzY3JfZ2V0KSB7Ci0JCXJlc3VsdCA9IFB5X1RZUEUocmVzdWx0KS0+dHBfZGVzY3JfZ2V0KHJlc3VsdCwgTlVMTCwKLQkJCQkJCSAgICAgICAoUHlPYmplY3QgKil0eXBlKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSAmJiB0eXBlLT50cF9kb2MgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcodHlwZS0+dHBfZG9jKTsKKyAgICByZXN1bHQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCAiX19kb2NfXyIpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlfVFlQRShyZXN1bHQpLT50cF9kZXNjcl9nZXQpIHsKKyAgICAgICAgcmVzdWx0ID0gUHlfVFlQRShyZXN1bHQpLT50cF9kZXNjcl9nZXQocmVzdWx0LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKil0eXBlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9fX2luc3RhbmNlY2hlY2tfXyhQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmluc3QpCiB7Ci0Jc3dpdGNoIChfUHlPYmplY3RfUmVhbElzSW5zdGFuY2UoaW5zdCwgdHlwZSkpIHsKLQljYXNlIC0xOgotCQlyZXR1cm4gTlVMTDsKLQljYXNlIDA6Ci0JCVB5X1JFVFVSTl9GQUxTRTsKLQlkZWZhdWx0OgotCQlQeV9SRVRVUk5fVFJVRTsKLQl9CisgICAgc3dpdGNoIChfUHlPYmplY3RfUmVhbElzSW5zdGFuY2UoaW5zdCwgdHlwZSkpIHsKKyAgICBjYXNlIC0xOgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlIDA6CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfZ2V0X2luc3RhbmNlY2hlY2soUHlPYmplY3QgKnR5cGUsIHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RhdGljIFB5TWV0aG9kRGVmIG1sID0geyJfX2luc3RhbmNlY2hlY2tfXyIsCi0JCQkJIHR5cGVfX19pbnN0YW5jZWNoZWNrX18sIE1FVEhfTyB9OwotCXJldHVybiBQeUNGdW5jdGlvbl9OZXcoJm1sLCB0eXBlKTsKKyAgICBzdGF0aWMgUHlNZXRob2REZWYgbWwgPSB7Il9faW5zdGFuY2VjaGVja19fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9fX2luc3RhbmNlY2hlY2tfXywgTUVUSF9PIH07CisgICAgcmV0dXJuIFB5Q0Z1bmN0aW9uX05ldygmbWwsIHR5cGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9fX3N1YmNsYXNzY2hlY2tfXyhQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmluc3QpCiB7Ci0Jc3dpdGNoIChfUHlPYmplY3RfUmVhbElzU3ViY2xhc3MoaW5zdCwgdHlwZSkpIHsKLQljYXNlIC0xOgotCQlyZXR1cm4gTlVMTDsKLQljYXNlIDA6Ci0JCVB5X1JFVFVSTl9GQUxTRTsKLQlkZWZhdWx0OgotCQlQeV9SRVRVUk5fVFJVRTsKLQl9CisgICAgc3dpdGNoIChfUHlPYmplY3RfUmVhbElzU3ViY2xhc3MoaW5zdCwgdHlwZSkpIHsKKyAgICBjYXNlIC0xOgorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlIDA6CisgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICB9CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0eXBlX2dldF9zdWJjbGFzc2NoZWNrKFB5T2JqZWN0ICp0eXBlLCB2b2lkICpjb250ZXh0KQogewotCXN0YXRpYyBQeU1ldGhvZERlZiBtbCA9IHsiX19zdWJjbGFzc2NoZWNrX18iLAotCQkJCSB0eXBlX19fc3ViY2xhc3NjaGVja19fLCBNRVRIX08gfTsKLQlyZXR1cm4gUHlDRnVuY3Rpb25fTmV3KCZtbCwgdHlwZSk7CisgICAgc3RhdGljIFB5TWV0aG9kRGVmIG1sID0geyJfX3N1YmNsYXNzY2hlY2tfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfX19zdWJjbGFzc2NoZWNrX18sIE1FVEhfTyB9OworICAgIHJldHVybiBQeUNGdW5jdGlvbl9OZXcoJm1sLCB0eXBlKTsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIHR5cGVfZ2V0c2V0c1tdID0gewotCXsiX19uYW1lX18iLCAoZ2V0dGVyKXR5cGVfbmFtZSwgKHNldHRlcil0eXBlX3NldF9uYW1lLCBOVUxMfSwKLQl7Il9fYmFzZXNfXyIsIChnZXR0ZXIpdHlwZV9nZXRfYmFzZXMsIChzZXR0ZXIpdHlwZV9zZXRfYmFzZXMsIE5VTEx9LAotCXsiX19tb2R1bGVfXyIsIChnZXR0ZXIpdHlwZV9tb2R1bGUsIChzZXR0ZXIpdHlwZV9zZXRfbW9kdWxlLCBOVUxMfSwKLQl7Il9fYWJzdHJhY3RtZXRob2RzX18iLCAoZ2V0dGVyKXR5cGVfYWJzdHJhY3RtZXRob2RzLAotCSAoc2V0dGVyKXR5cGVfc2V0X2Fic3RyYWN0bWV0aG9kcywgTlVMTH0sCi0JeyJfX2RpY3RfXyIsICAoZ2V0dGVyKXR5cGVfZGljdCwgIE5VTEwsIE5VTEx9LAotCXsiX19kb2NfXyIsIChnZXR0ZXIpdHlwZV9nZXRfZG9jLCBOVUxMLCBOVUxMfSwKLQl7Il9faW5zdGFuY2VjaGVja19fIiwgKGdldHRlcil0eXBlX2dldF9pbnN0YW5jZWNoZWNrLCBOVUxMLCBOVUxMfSwKLQl7Il9fc3ViY2xhc3NjaGVja19fIiwgKGdldHRlcil0eXBlX2dldF9zdWJjbGFzc2NoZWNrLCBOVUxMLCBOVUxMfSwKLQl7MH0KKyAgICB7Il9fbmFtZV9fIiwgKGdldHRlcil0eXBlX25hbWUsIChzZXR0ZXIpdHlwZV9zZXRfbmFtZSwgTlVMTH0sCisgICAgeyJfX2Jhc2VzX18iLCAoZ2V0dGVyKXR5cGVfZ2V0X2Jhc2VzLCAoc2V0dGVyKXR5cGVfc2V0X2Jhc2VzLCBOVUxMfSwKKyAgICB7Il9fbW9kdWxlX18iLCAoZ2V0dGVyKXR5cGVfbW9kdWxlLCAoc2V0dGVyKXR5cGVfc2V0X21vZHVsZSwgTlVMTH0sCisgICAgeyJfX2Fic3RyYWN0bWV0aG9kc19fIiwgKGdldHRlcil0eXBlX2Fic3RyYWN0bWV0aG9kcywKKyAgICAgKHNldHRlcil0eXBlX3NldF9hYnN0cmFjdG1ldGhvZHMsIE5VTEx9LAorICAgIHsiX19kaWN0X18iLCAgKGdldHRlcil0eXBlX2RpY3QsICBOVUxMLCBOVUxMfSwKKyAgICB7Il9fZG9jX18iLCAoZ2V0dGVyKXR5cGVfZ2V0X2RvYywgTlVMTCwgTlVMTH0sCisgICAgeyJfX2luc3RhbmNlY2hlY2tfXyIsIChnZXR0ZXIpdHlwZV9nZXRfaW5zdGFuY2VjaGVjaywgTlVMTCwgTlVMTH0sCisgICAgeyJfX3N1YmNsYXNzY2hlY2tfXyIsIChnZXR0ZXIpdHlwZV9nZXRfc3ViY2xhc3NjaGVjaywgTlVMTCwgTlVMTH0sCisgICAgezB9CiB9OwogCiAKIHN0YXRpYyBQeU9iamVjdCoKIHR5cGVfcmljaGNvbXBhcmUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LCBpbnQgb3ApCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeV91aW50cHRyX3QgdnYsIHd3OwotCWludCBjOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlfdWludHB0cl90IHZ2LCB3dzsKKyAgICBpbnQgYzsKIAotCS8qIE1ha2Ugc3VyZSBib3RoIGFyZ3VtZW50cyBhcmUgdHlwZXMuICovCi0JaWYgKCFQeVR5cGVfQ2hlY2sodikgfHwgIVB5VHlwZV9DaGVjayh3KSB8fAotCSAgICAvKiBJZiB0aGVyZSBpcyBhIF9fY21wX18gbWV0aG9kIGRlZmluZWQsIGxldCBpdCBiZSBjYWxsZWQgaW5zdGVhZAotCSAgICAgICBvZiBvdXIgZHVtYiBmdW5jdGlvbiBkZXNpZ25lZCBtZXJlbHkgdG8gd2Fybi4gIFNlZSBidWcKLQkgICAgICAgIzc0OTEuICovCi0JICAgIFB5X1RZUEUodiktPnRwX2NvbXBhcmUgfHwgUHlfVFlQRSh3KS0+dHBfY29tcGFyZSkgewotCQlyZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKLQkJZ290byBvdXQ7Ci0JfQorICAgIC8qIE1ha2Ugc3VyZSBib3RoIGFyZ3VtZW50cyBhcmUgdHlwZXMuICovCisgICAgaWYgKCFQeVR5cGVfQ2hlY2sodikgfHwgIVB5VHlwZV9DaGVjayh3KSB8fAorICAgICAgICAvKiBJZiB0aGVyZSBpcyBhIF9fY21wX18gbWV0aG9kIGRlZmluZWQsIGxldCBpdCBiZSBjYWxsZWQgaW5zdGVhZAorICAgICAgICAgICBvZiBvdXIgZHVtYiBmdW5jdGlvbiBkZXNpZ25lZCBtZXJlbHkgdG8gd2Fybi4gIFNlZSBidWcKKyAgICAgICAgICAgIzc0OTEuICovCisgICAgICAgIFB5X1RZUEUodiktPnRwX2NvbXBhcmUgfHwgUHlfVFlQRSh3KS0+dHBfY29tcGFyZSkgeworICAgICAgICByZXN1bHQgPSBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQogCi0JLyogUHkzSyB3YXJuaW5nIGlmIGNvbXBhcmlzb24gaXNuJ3QgPT0gb3IgIT0gICovCi0JaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAmJiBvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSAmJgotCQlQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJICAgInR5cGUgaW5lcXVhbGl0eSBjb21wYXJpc29ucyBub3Qgc3VwcG9ydGVkICIKLQkJCSAgICJpbiAzLngiLCAxKSA8IDApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFB5M0sgd2FybmluZyBpZiBjb21wYXJpc29uIGlzbid0ID09IG9yICE9ICAqLworICAgIGlmIChQeV9QeTNrV2FybmluZ0ZsYWcgJiYgb3AgIT0gUHlfRVEgJiYgb3AgIT0gUHlfTkUgJiYKKyAgICAgICAgUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAidHlwZSBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICJpbiAzLngiLCAxKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ29tcGFyZSBhZGRyZXNzZXMgKi8KLQl2diA9IChQeV91aW50cHRyX3QpdjsKLQl3dyA9IChQeV91aW50cHRyX3QpdzsKLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBQeV9MVDogYyA9IHZ2IDwgIHd3OyBicmVhazsKLQljYXNlIFB5X0xFOiBjID0gdnYgPD0gd3c7IGJyZWFrOwotCWNhc2UgUHlfRVE6IGMgPSB2diA9PSB3dzsgYnJlYWs7Ci0JY2FzZSBQeV9ORTogYyA9IHZ2ICE9IHd3OyBicmVhazsKLQljYXNlIFB5X0dUOiBjID0gdnYgPiAgd3c7IGJyZWFrOwotCWNhc2UgUHlfR0U6IGMgPSB2diA+PSB3dzsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmVzdWx0ID0gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JCWdvdG8gb3V0OwotCX0KLQlyZXN1bHQgPSBjID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOworICAgIC8qIENvbXBhcmUgYWRkcmVzc2VzICovCisgICAgdnYgPSAoUHlfdWludHB0cl90KXY7CisgICAgd3cgPSAoUHlfdWludHB0cl90KXc7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgUHlfTFQ6IGMgPSB2diA8ICB3dzsgYnJlYWs7CisgICAgY2FzZSBQeV9MRTogYyA9IHZ2IDw9IHd3OyBicmVhazsKKyAgICBjYXNlIFB5X0VROiBjID0gdnYgPT0gd3c7IGJyZWFrOworICAgIGNhc2UgUHlfTkU6IGMgPSB2diAhPSB3dzsgYnJlYWs7CisgICAgY2FzZSBQeV9HVDogYyA9IHZ2ID4gIHd3OyBicmVhazsKKyAgICBjYXNlIFB5X0dFOiBjID0gdnYgPj0gd3c7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJlc3VsdCA9IFB5X05vdEltcGxlbWVudGVkOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgcmVzdWx0ID0gYyA/IFB5X1RydWUgOiBQeV9GYWxzZTsKIAogICAvKiBpbmNyZWYgYW5kIHJldHVybiAqLwogICBvdXQ6Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9JTkNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9yZXByKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqbW9kLCAqbmFtZSwgKnJ0bjsKLQljaGFyICpraW5kOworICAgIFB5T2JqZWN0ICptb2QsICpuYW1lLCAqcnRuOworICAgIGNoYXIgKmtpbmQ7CiAKLQltb2QgPSB0eXBlX21vZHVsZSh0eXBlLCBOVUxMKTsKLQlpZiAobW9kID09IE5VTEwpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKG1vZCkpIHsKLQkJUHlfREVDUkVGKG1vZCk7Ci0JCW1vZCA9IE5VTEw7Ci0JfQotCW5hbWUgPSB0eXBlX25hbWUodHlwZSwgTlVMTCk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbW9kID0gdHlwZV9tb2R1bGUodHlwZSwgTlVMTCk7CisgICAgaWYgKG1vZCA9PSBOVUxMKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhtb2QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihtb2QpOworICAgICAgICBtb2QgPSBOVUxMOworICAgIH0KKyAgICBuYW1lID0gdHlwZV9uYW1lKHR5cGUsIE5VTEwpOworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKLQkJa2luZCA9ICJjbGFzcyI7Ci0JZWxzZQotCQlraW5kID0gInR5cGUiOworICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCisgICAgICAgIGtpbmQgPSAiY2xhc3MiOworICAgIGVsc2UKKyAgICAgICAga2luZCA9ICJ0eXBlIjsKIAotCWlmIChtb2QgIT0gTlVMTCAmJiBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCksICJfX2J1aWx0aW5fXyIpKSB7Ci0JCXJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyAnJXMuJXMnPiIsCi0JCQkJCSAga2luZCwKLQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcobW9kKSwKLQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwotCX0KLQllbHNlCi0JCXJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyAnJXMnPiIsIGtpbmQsIHR5cGUtPnRwX25hbWUpOworICAgIGlmIChtb2QgIT0gTlVMTCAmJiBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCksICJfX2J1aWx0aW5fXyIpKSB7CisgICAgICAgIHJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyAnJXMuJXMnPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobW9kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyAnJXMnPiIsIGtpbmQsIHR5cGUtPnRwX25hbWUpOwogCi0JUHlfWERFQ1JFRihtb2QpOwotCVB5X0RFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcnRuOworICAgIFB5X1hERUNSRUYobW9kKTsKKyAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJ0bjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHR5cGVfY2FsbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqb2JqOworICAgIFB5T2JqZWN0ICpvYmo7CiAKLQlpZiAodHlwZS0+dHBfbmV3ID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbm5vdCBjcmVhdGUgJyUuMTAwcycgaW5zdGFuY2VzIiwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodHlwZS0+dHBfbmV3ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY3JlYXRlICclLjEwMHMnIGluc3RhbmNlcyIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jb2JqID0gdHlwZS0+dHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotCWlmIChvYmogIT0gTlVMTCkgewotCQkvKiBVZ2x5IGV4Y2VwdGlvbjogd2hlbiB0aGUgY2FsbCB3YXMgdHlwZShzb21ldGhpbmcpLAotCQkgICBkb24ndCBjYWxsIHRwX2luaXQgb24gdGhlIHJlc3VsdC4gKi8KLQkJaWYgKHR5cGUgPT0gJlB5VHlwZV9UeXBlICYmCi0JCSAgICBQeVR1cGxlX0NoZWNrKGFyZ3MpICYmIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSAmJgotCQkgICAgKGt3ZHMgPT0gTlVMTCB8fAotCQkgICAgIChQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgPT0gMCkpKQotCQkJcmV0dXJuIG9iajsKLQkJLyogSWYgdGhlIHJldHVybmVkIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdHlwZSwKLQkJICAgaXQgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuICovCi0JCWlmICghUHlUeXBlX0lzU3VidHlwZShvYmotPm9iX3R5cGUsIHR5cGUpKQotCQkJcmV0dXJuIG9iajsKLQkJdHlwZSA9IG9iai0+b2JfdHlwZTsKLQkJaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykgJiYKLQkJICAgIHR5cGUtPnRwX2luaXQgIT0gTlVMTCAmJgotCQkgICAgdHlwZS0+dHBfaW5pdChvYmosIGFyZ3MsIGt3ZHMpIDwgMCkgewotCQkJUHlfREVDUkVGKG9iaik7Ci0JCQlvYmogPSBOVUxMOwotCQl9Ci0JfQotCXJldHVybiBvYmo7CisgICAgb2JqID0gdHlwZS0+dHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOworICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAvKiBVZ2x5IGV4Y2VwdGlvbjogd2hlbiB0aGUgY2FsbCB3YXMgdHlwZShzb21ldGhpbmcpLAorICAgICAgICAgICBkb24ndCBjYWxsIHRwX2luaXQgb24gdGhlIHJlc3VsdC4gKi8KKyAgICAgICAgaWYgKHR5cGUgPT0gJlB5VHlwZV9UeXBlICYmCisgICAgICAgICAgICBQeVR1cGxlX0NoZWNrKGFyZ3MpICYmIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSAmJgorICAgICAgICAgICAgKGt3ZHMgPT0gTlVMTCB8fAorICAgICAgICAgICAgIChQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgPT0gMCkpKQorICAgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgLyogSWYgdGhlIHJldHVybmVkIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdHlwZSwKKyAgICAgICAgICAgaXQgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuICovCisgICAgICAgIGlmICghUHlUeXBlX0lzU3VidHlwZShvYmotPm9iX3R5cGUsIHR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgICAgdHlwZSA9IG9iai0+b2JfdHlwZTsKKyAgICAgICAgaWYgKFB5VHlwZV9IYXNGZWF0dXJlKHR5cGUsIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykgJiYKKyAgICAgICAgICAgIHR5cGUtPnRwX2luaXQgIT0gTlVMTCAmJgorICAgICAgICAgICAgdHlwZS0+dHBfaW5pdChvYmosIGFyZ3MsIGt3ZHMpIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgICAgICBvYmogPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvYmo7CiB9CiAKIFB5T2JqZWN0ICoKIFB5VHlwZV9HZW5lcmljQWxsb2MoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IG5pdGVtcykKIHsKLQlQeU9iamVjdCAqb2JqOwotCWNvbnN0IHNpemVfdCBzaXplID0gX1B5T2JqZWN0X1ZBUl9TSVpFKHR5cGUsIG5pdGVtcysxKTsKLQkvKiBub3RlIHRoYXQgd2UgbmVlZCB0byBhZGQgb25lLCBmb3IgdGhlIHNlbnRpbmVsICovCisgICAgUHlPYmplY3QgKm9iajsKKyAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IF9QeU9iamVjdF9WQVJfU0laRSh0eXBlLCBuaXRlbXMrMSk7CisgICAgLyogbm90ZSB0aGF0IHdlIG5lZWQgdG8gYWRkIG9uZSwgZm9yIHRoZSBzZW50aW5lbCAqLwogCi0JaWYgKFB5VHlwZV9JU19HQyh0eXBlKSkKLQkJb2JqID0gX1B5T2JqZWN0X0dDX01hbGxvYyhzaXplKTsKLQllbHNlCi0JCW9iaiA9IChQeU9iamVjdCAqKVB5T2JqZWN0X01BTExPQyhzaXplKTsKKyAgICBpZiAoUHlUeXBlX0lTX0dDKHR5cGUpKQorICAgICAgICBvYmogPSBfUHlPYmplY3RfR0NfTWFsbG9jKHNpemUpOworICAgIGVsc2UKKyAgICAgICAgb2JqID0gKFB5T2JqZWN0ICopUHlPYmplY3RfTUFMTE9DKHNpemUpOwogCi0JaWYgKG9iaiA9PSBOVUxMKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JbWVtc2V0KG9iaiwgJ1wwJywgc2l6ZSk7CisgICAgbWVtc2V0KG9iaiwgJ1wwJywgc2l6ZSk7CiAKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQotCQlQeV9JTkNSRUYodHlwZSk7CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKKyAgICAgICAgUHlfSU5DUkVGKHR5cGUpOwogCi0JaWYgKHR5cGUtPnRwX2l0ZW1zaXplID09IDApCi0JCVB5T2JqZWN0X0lOSVQob2JqLCB0eXBlKTsKLQllbHNlCi0JCSh2b2lkKSBQeU9iamVjdF9JTklUX1ZBUigoUHlWYXJPYmplY3QgKilvYmosIHR5cGUsIG5pdGVtcyk7CisgICAgaWYgKHR5cGUtPnRwX2l0ZW1zaXplID09IDApCisgICAgICAgIFB5T2JqZWN0X0lOSVQob2JqLCB0eXBlKTsKKyAgICBlbHNlCisgICAgICAgICh2b2lkKSBQeU9iamVjdF9JTklUX1ZBUigoUHlWYXJPYmplY3QgKilvYmosIHR5cGUsIG5pdGVtcyk7CiAKLQlpZiAoUHlUeXBlX0lTX0dDKHR5cGUpKQotCQlfUHlPYmplY3RfR0NfVFJBQ0sob2JqKTsKLQlyZXR1cm4gb2JqOworICAgIGlmIChQeVR5cGVfSVNfR0ModHlwZSkpCisgICAgICAgIF9QeU9iamVjdF9HQ19UUkFDSyhvYmopOworICAgIHJldHVybiBvYmo7CiB9CiAKIFB5T2JqZWN0ICoKIFB5VHlwZV9HZW5lcmljTmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKTsKKyAgICByZXR1cm4gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CiB9CiAKIC8qIEhlbHBlcnMgZm9yIHN1YnR5cGluZyAqLwpAQCAtNzg4LDM0MSArNzg4LDM0MSBAQAogc3RhdGljIGludAogdHJhdmVyc2Vfc2xvdHMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqc2VsZiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfc3NpemVfdCBpLCBuOwotCVB5TWVtYmVyRGVmICptcDsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlNZW1iZXJEZWYgKm1wOwogCi0JbiA9IFB5X1NJWkUodHlwZSk7Ci0JbXAgPSBQeUhlYXBUeXBlX0dFVF9NRU1CRVJTKChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZSk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKywgbXArKykgewotCQlpZiAobXAtPnR5cGUgPT0gVF9PQkpFQ1RfRVgpIHsKLQkJCWNoYXIgKmFkZHIgPSAoY2hhciAqKXNlbGYgKyBtcC0+b2Zmc2V0OwotCQkJUHlPYmplY3QgKm9iaiA9ICooUHlPYmplY3QgKiopYWRkcjsKLQkJCWlmIChvYmogIT0gTlVMTCkgewotCQkJCWludCBlcnIgPSB2aXNpdChvYmosIGFyZyk7Ci0JCQkJaWYgKGVycikKLQkJCQkJcmV0dXJuIGVycjsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICBuID0gUHlfU0laRSh0eXBlKTsKKyAgICBtcCA9IFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBtcCsrKSB7CisgICAgICAgIGlmIChtcC0+dHlwZSA9PSBUX09CSkVDVF9FWCkgeworICAgICAgICAgICAgY2hhciAqYWRkciA9IChjaGFyICopc2VsZiArIG1wLT5vZmZzZXQ7CisgICAgICAgICAgICBQeU9iamVjdCAqb2JqID0gKihQeU9iamVjdCAqKilhZGRyOworICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW50IGVyciA9IHZpc2l0KG9iaiwgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBzdWJ0eXBlX3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlQeVR5cGVPYmplY3QgKnR5cGUsICpiYXNlOwotCXRyYXZlcnNlcHJvYyBiYXNldHJhdmVyc2U7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlLCAqYmFzZTsKKyAgICB0cmF2ZXJzZXByb2MgYmFzZXRyYXZlcnNlOwogCi0JLyogRmluZCB0aGUgbmVhcmVzdCBiYXNlIHdpdGggYSBkaWZmZXJlbnQgdHBfdHJhdmVyc2UsCi0JICAgYW5kIHRyYXZlcnNlIHNsb3RzIHdoaWxlIHdlJ3JlIGF0IGl0ICovCi0JdHlwZSA9IFB5X1RZUEUoc2VsZik7Ci0JYmFzZSA9IHR5cGU7Ci0Jd2hpbGUgKChiYXNldHJhdmVyc2UgPSBiYXNlLT50cF90cmF2ZXJzZSkgPT0gc3VidHlwZV90cmF2ZXJzZSkgewotCQlpZiAoUHlfU0laRShiYXNlKSkgewotCQkJaW50IGVyciA9IHRyYXZlcnNlX3Nsb3RzKGJhc2UsIHNlbGYsIHZpc2l0LCBhcmcpOwotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gZXJyOwotCQl9Ci0JCWJhc2UgPSBiYXNlLT50cF9iYXNlOwotCQlhc3NlcnQoYmFzZSk7Ci0JfQorICAgIC8qIEZpbmQgdGhlIG5lYXJlc3QgYmFzZSB3aXRoIGEgZGlmZmVyZW50IHRwX3RyYXZlcnNlLAorICAgICAgIGFuZCB0cmF2ZXJzZSBzbG90cyB3aGlsZSB3ZSdyZSBhdCBpdCAqLworICAgIHR5cGUgPSBQeV9UWVBFKHNlbGYpOworICAgIGJhc2UgPSB0eXBlOworICAgIHdoaWxlICgoYmFzZXRyYXZlcnNlID0gYmFzZS0+dHBfdHJhdmVyc2UpID09IHN1YnR5cGVfdHJhdmVyc2UpIHsKKyAgICAgICAgaWYgKFB5X1NJWkUoYmFzZSkpIHsKKyAgICAgICAgICAgIGludCBlcnIgPSB0cmF2ZXJzZV9zbG90cyhiYXNlLCBzZWxmLCB2aXNpdCwgYXJnKTsKKyAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBiYXNlID0gYmFzZS0+dHBfYmFzZTsKKyAgICAgICAgYXNzZXJ0KGJhc2UpOworICAgIH0KIAotCWlmICh0eXBlLT50cF9kaWN0b2Zmc2V0ICE9IGJhc2UtPnRwX2RpY3RvZmZzZXQpIHsKLQkJUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoc2VsZik7Ci0JCWlmIChkaWN0cHRyICYmICpkaWN0cHRyKQotCQkJUHlfVklTSVQoKmRpY3RwdHIpOwotCX0KKyAgICBpZiAodHlwZS0+dHBfZGljdG9mZnNldCAhPSBiYXNlLT50cF9kaWN0b2Zmc2V0KSB7CisgICAgICAgIFB5T2JqZWN0ICoqZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKHNlbGYpOworICAgICAgICBpZiAoZGljdHB0ciAmJiAqZGljdHB0cikKKyAgICAgICAgICAgIFB5X1ZJU0lUKCpkaWN0cHRyKTsKKyAgICB9CiAKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQotCQkvKiBGb3IgYSBoZWFwdHlwZSwgdGhlIGluc3RhbmNlcyBjb3VudCBhcyByZWZlcmVuY2VzCi0JCSAgIHRvIHRoZSB0eXBlLgkgVHJhdmVyc2UgdGhlIHR5cGUgc28gdGhlIGNvbGxlY3RvcgotCQkgICBjYW4gZmluZCBjeWNsZXMgaW52b2x2aW5nIHRoaXMgbGluay4gKi8KLQkJUHlfVklTSVQodHlwZSk7CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKKyAgICAgICAgLyogRm9yIGEgaGVhcHR5cGUsIHRoZSBpbnN0YW5jZXMgY291bnQgYXMgcmVmZXJlbmNlcworICAgICAgICAgICB0byB0aGUgdHlwZS4gICAgICAgICAgVHJhdmVyc2UgdGhlIHR5cGUgc28gdGhlIGNvbGxlY3RvcgorICAgICAgICAgICBjYW4gZmluZCBjeWNsZXMgaW52b2x2aW5nIHRoaXMgbGluay4gKi8KKyAgICAgICAgUHlfVklTSVQodHlwZSk7CiAKLQlpZiAoYmFzZXRyYXZlcnNlKQotCQlyZXR1cm4gYmFzZXRyYXZlcnNlKHNlbGYsIHZpc2l0LCBhcmcpOwotCXJldHVybiAwOworICAgIGlmIChiYXNldHJhdmVyc2UpCisgICAgICAgIHJldHVybiBiYXNldHJhdmVyc2Uoc2VsZiwgdmlzaXQsIGFyZyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBjbGVhcl9zbG90cyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpzZWxmKQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU1lbWJlckRlZiAqbXA7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5TWVtYmVyRGVmICptcDsKIAotCW4gPSBQeV9TSVpFKHR5cGUpOwotCW1wID0gUHlIZWFwVHlwZV9HRVRfTUVNQkVSUygoUHlIZWFwVHlwZU9iamVjdCAqKXR5cGUpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyssIG1wKyspIHsKLQkJaWYgKG1wLT50eXBlID09IFRfT0JKRUNUX0VYICYmICEobXAtPmZsYWdzICYgUkVBRE9OTFkpKSB7Ci0JCQljaGFyICphZGRyID0gKGNoYXIgKilzZWxmICsgbXAtPm9mZnNldDsKLQkJCVB5T2JqZWN0ICpvYmogPSAqKFB5T2JqZWN0ICoqKWFkZHI7Ci0JCQlpZiAob2JqICE9IE5VTEwpIHsKLQkJCQkqKFB5T2JqZWN0ICoqKWFkZHIgPSBOVUxMOwotCQkJCVB5X0RFQ1JFRihvYmopOwotCQkJfQotCQl9Ci0JfQorICAgIG4gPSBQeV9TSVpFKHR5cGUpOworICAgIG1wID0gUHlIZWFwVHlwZV9HRVRfTUVNQkVSUygoUHlIZWFwVHlwZU9iamVjdCAqKXR5cGUpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyssIG1wKyspIHsKKyAgICAgICAgaWYgKG1wLT50eXBlID09IFRfT0JKRUNUX0VYICYmICEobXAtPmZsYWdzICYgUkVBRE9OTFkpKSB7CisgICAgICAgICAgICBjaGFyICphZGRyID0gKGNoYXIgKilzZWxmICsgbXAtPm9mZnNldDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvYmogPSAqKFB5T2JqZWN0ICoqKWFkZHI7CisgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqKFB5T2JqZWN0ICoqKWFkZHIgPSBOVUxMOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBzdWJ0eXBlX2NsZWFyKFB5T2JqZWN0ICpzZWxmKQogewotCVB5VHlwZU9iamVjdCAqdHlwZSwgKmJhc2U7Ci0JaW5xdWlyeSBiYXNlY2xlYXI7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlLCAqYmFzZTsKKyAgICBpbnF1aXJ5IGJhc2VjbGVhcjsKIAotCS8qIEZpbmQgdGhlIG5lYXJlc3QgYmFzZSB3aXRoIGEgZGlmZmVyZW50IHRwX2NsZWFyCi0JICAgYW5kIGNsZWFyIHNsb3RzIHdoaWxlIHdlJ3JlIGF0IGl0ICovCi0JdHlwZSA9IFB5X1RZUEUoc2VsZik7Ci0JYmFzZSA9IHR5cGU7Ci0Jd2hpbGUgKChiYXNlY2xlYXIgPSBiYXNlLT50cF9jbGVhcikgPT0gc3VidHlwZV9jbGVhcikgewotCQlpZiAoUHlfU0laRShiYXNlKSkKLQkJCWNsZWFyX3Nsb3RzKGJhc2UsIHNlbGYpOwotCQliYXNlID0gYmFzZS0+dHBfYmFzZTsKLQkJYXNzZXJ0KGJhc2UpOwotCX0KKyAgICAvKiBGaW5kIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF9jbGVhcgorICAgICAgIGFuZCBjbGVhciBzbG90cyB3aGlsZSB3ZSdyZSBhdCBpdCAqLworICAgIHR5cGUgPSBQeV9UWVBFKHNlbGYpOworICAgIGJhc2UgPSB0eXBlOworICAgIHdoaWxlICgoYmFzZWNsZWFyID0gYmFzZS0+dHBfY2xlYXIpID09IHN1YnR5cGVfY2xlYXIpIHsKKyAgICAgICAgaWYgKFB5X1NJWkUoYmFzZSkpCisgICAgICAgICAgICBjbGVhcl9zbG90cyhiYXNlLCBzZWxmKTsKKyAgICAgICAgYmFzZSA9IGJhc2UtPnRwX2Jhc2U7CisgICAgICAgIGFzc2VydChiYXNlKTsKKyAgICB9CiAKLQkvKiBUaGVyZSdzIG5vIG5lZWQgdG8gY2xlYXIgdGhlIGluc3RhbmNlIGRpY3QgKGlmIGFueSk7Ci0JICAgdGhlIGNvbGxlY3RvciB3aWxsIGNhbGwgaXRzIHRwX2NsZWFyIGhhbmRsZXIuICovCisgICAgLyogVGhlcmUncyBubyBuZWVkIHRvIGNsZWFyIHRoZSBpbnN0YW5jZSBkaWN0IChpZiBhbnkpOworICAgICAgIHRoZSBjb2xsZWN0b3Igd2lsbCBjYWxsIGl0cyB0cF9jbGVhciBoYW5kbGVyLiAqLwogCi0JaWYgKGJhc2VjbGVhcikKLQkJcmV0dXJuIGJhc2VjbGVhcihzZWxmKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoYmFzZWNsZWFyKQorICAgICAgICByZXR1cm4gYmFzZWNsZWFyKHNlbGYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogc3VidHlwZV9kZWFsbG9jKFB5T2JqZWN0ICpzZWxmKQogewotCVB5VHlwZU9iamVjdCAqdHlwZSwgKmJhc2U7Ci0JZGVzdHJ1Y3RvciBiYXNlZGVhbGxvYzsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGUsICpiYXNlOworICAgIGRlc3RydWN0b3IgYmFzZWRlYWxsb2M7CiAKLQkvKiBFeHRyYWN0IHRoZSB0eXBlOyB3ZSBleHBlY3QgaXQgdG8gYmUgYSBoZWFwIHR5cGUgKi8KLQl0eXBlID0gUHlfVFlQRShzZWxmKTsKLQlhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKKyAgICAvKiBFeHRyYWN0IHRoZSB0eXBlOyB3ZSBleHBlY3QgaXQgdG8gYmUgYSBoZWFwIHR5cGUgKi8KKyAgICB0eXBlID0gUHlfVFlQRShzZWxmKTsKKyAgICBhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKIAotCS8qIFRlc3Qgd2hldGhlciB0aGUgdHlwZSBoYXMgR0MgZXhhY3RseSBvbmNlICovCisgICAgLyogVGVzdCB3aGV0aGVyIHRoZSB0eXBlIGhhcyBHQyBleGFjdGx5IG9uY2UgKi8KIAotCWlmICghUHlUeXBlX0lTX0dDKHR5cGUpKSB7Ci0JCS8qIEl0J3MgcmVhbGx5IHJhcmUgdG8gZmluZCBhIGR5bmFtaWMgdHlwZSB0aGF0IGRvZXNuJ3QgaGF2ZQotCQkgICBHQzsgaXQgY2FuIG9ubHkgaGFwcGVuIHdoZW4gZGVyaXZpbmcgZnJvbSAnb2JqZWN0JyBhbmQgbm90Ci0JCSAgIGFkZGluZyBhbnkgc2xvdHMgb3IgaW5zdGFuY2UgdmFyaWFibGVzLiAgVGhpcyBhbGxvd3MKLQkJICAgY2VydGFpbiBzaW1wbGlmaWNhdGlvbnM6IHRoZXJlJ3Mgbm8gbmVlZCB0byBjYWxsCi0JCSAgIGNsZWFyX3Nsb3RzKCksIG9yIERFQ1JFRiB0aGUgZGljdCwgb3IgY2xlYXIgd2Vha3JlZnMuICovCisgICAgaWYgKCFQeVR5cGVfSVNfR0ModHlwZSkpIHsKKyAgICAgICAgLyogSXQncyByZWFsbHkgcmFyZSB0byBmaW5kIGEgZHluYW1pYyB0eXBlIHRoYXQgZG9lc24ndCBoYXZlCisgICAgICAgICAgIEdDOyBpdCBjYW4gb25seSBoYXBwZW4gd2hlbiBkZXJpdmluZyBmcm9tICdvYmplY3QnIGFuZCBub3QKKyAgICAgICAgICAgYWRkaW5nIGFueSBzbG90cyBvciBpbnN0YW5jZSB2YXJpYWJsZXMuICBUaGlzIGFsbG93cworICAgICAgICAgICBjZXJ0YWluIHNpbXBsaWZpY2F0aW9uczogdGhlcmUncyBubyBuZWVkIHRvIGNhbGwKKyAgICAgICAgICAgY2xlYXJfc2xvdHMoKSwgb3IgREVDUkVGIHRoZSBkaWN0LCBvciBjbGVhciB3ZWFrcmVmcy4gKi8KIAotCQkvKiBNYXliZSBjYWxsIGZpbmFsaXplcjsgZXhpdCBlYXJseSBpZiByZXN1cnJlY3RlZCAqLwotCQlpZiAodHlwZS0+dHBfZGVsKSB7Ci0JCQl0eXBlLT50cF9kZWwoc2VsZik7Ci0JCQlpZiAoc2VsZi0+b2JfcmVmY250ID4gMCkKLQkJCQlyZXR1cm47Ci0JCX0KKyAgICAgICAgLyogTWF5YmUgY2FsbCBmaW5hbGl6ZXI7IGV4aXQgZWFybHkgaWYgcmVzdXJyZWN0ZWQgKi8KKyAgICAgICAgaWYgKHR5cGUtPnRwX2RlbCkgeworICAgICAgICAgICAgdHlwZS0+dHBfZGVsKHNlbGYpOworICAgICAgICAgICAgaWYgKHNlbGYtPm9iX3JlZmNudCA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLQkJLyogRmluZCB0aGUgbmVhcmVzdCBiYXNlIHdpdGggYSBkaWZmZXJlbnQgdHBfZGVhbGxvYyAqLwotCQliYXNlID0gdHlwZTsKLQkJd2hpbGUgKChiYXNlZGVhbGxvYyA9IGJhc2UtPnRwX2RlYWxsb2MpID09IHN1YnR5cGVfZGVhbGxvYykgewotCQkJYXNzZXJ0KFB5X1NJWkUoYmFzZSkgPT0gMCk7Ci0JCQliYXNlID0gYmFzZS0+dHBfYmFzZTsKLQkJCWFzc2VydChiYXNlKTsKLQkJfQorICAgICAgICAvKiBGaW5kIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF9kZWFsbG9jICovCisgICAgICAgIGJhc2UgPSB0eXBlOworICAgICAgICB3aGlsZSAoKGJhc2VkZWFsbG9jID0gYmFzZS0+dHBfZGVhbGxvYykgPT0gc3VidHlwZV9kZWFsbG9jKSB7CisgICAgICAgICAgICBhc3NlcnQoUHlfU0laRShiYXNlKSA9PSAwKTsKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICAgICAgYXNzZXJ0KGJhc2UpOworICAgICAgICB9CiAKLQkJLyogRXh0cmFjdCB0aGUgdHlwZSBhZ2FpbjsgdHBfZGVsIG1heSBoYXZlIGNoYW5nZWQgaXQgKi8KLQkJdHlwZSA9IFB5X1RZUEUoc2VsZik7CisgICAgICAgIC8qIEV4dHJhY3QgdGhlIHR5cGUgYWdhaW47IHRwX2RlbCBtYXkgaGF2ZSBjaGFuZ2VkIGl0ICovCisgICAgICAgIHR5cGUgPSBQeV9UWVBFKHNlbGYpOwogCi0JCS8qIENhbGwgdGhlIGJhc2UgdHBfZGVhbGxvYygpICovCi0JCWFzc2VydChiYXNlZGVhbGxvYyk7Ci0JCWJhc2VkZWFsbG9jKHNlbGYpOworICAgICAgICAvKiBDYWxsIHRoZSBiYXNlIHRwX2RlYWxsb2MoKSAqLworICAgICAgICBhc3NlcnQoYmFzZWRlYWxsb2MpOworICAgICAgICBiYXNlZGVhbGxvYyhzZWxmKTsKIAotCQkvKiBDYW4ndCByZWZlcmVuY2Ugc2VsZiBiZXlvbmQgdGhpcyBwb2ludCAqLwotCQlQeV9ERUNSRUYodHlwZSk7CisgICAgICAgIC8qIENhbid0IHJlZmVyZW5jZSBzZWxmIGJleW9uZCB0aGlzIHBvaW50ICovCisgICAgICAgIFB5X0RFQ1JFRih0eXBlKTsKIAotCQkvKiBEb25lICovCi0JCXJldHVybjsKLQl9CisgICAgICAgIC8qIERvbmUgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCS8qIFdlIGdldCBoZXJlIG9ubHkgaWYgdGhlIHR5cGUgaGFzIEdDICovCisgICAgLyogV2UgZ2V0IGhlcmUgb25seSBpZiB0aGUgdHlwZSBoYXMgR0MgKi8KIAotCS8qIFVuVHJhY2sgYW5kIHJlLVRyYWNrIGFyb3VuZCB0aGUgdHJhc2hjYW4gbWFjcm8sIGFsYXMgKi8KLQkvKiBTZWUgZXhwbGFuYXRpb24gYXQgZW5kIG9mIGZ1bmN0aW9uIGZvciBmdWxsIGRpc2Nsb3N1cmUgKi8KLQlQeU9iamVjdF9HQ19VblRyYWNrKHNlbGYpOwotCSsrX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7Ci0JUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihzZWxmKTsKLQktLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOwotCS8qIERPIE5PVCByZXN0b3JlIEdDIHRyYWNraW5nIGF0IHRoaXMgcG9pbnQuICB3ZWFrcmVmIGNhbGxiYWNrcwotCSAqIChpZiBhbnksIGFuZCB3aGV0aGVyIGRpcmVjdGx5IGhlcmUgb3IgaW5kaXJlY3RseSBpbiBzb21ldGhpbmcgd2UKLQkgKiBjYWxsKSBtYXkgdHJpZ2dlciBHQywgYW5kIGlmIHNlbGYgaXMgdHJhY2tlZCBhdCB0aGF0IHBvaW50LCBpdAotCSAqIHdpbGwgbG9vayBsaWtlIHRyYXNoIHRvIEdDIGFuZCBHQyB3aWxsIHRyeSB0byBkZWxldGUgc2VsZiBhZ2Fpbi4KLQkgKi8KKyAgICAvKiBVblRyYWNrIGFuZCByZS1UcmFjayBhcm91bmQgdGhlIHRyYXNoY2FuIG1hY3JvLCBhbGFzICovCisgICAgLyogU2VlIGV4cGxhbmF0aW9uIGF0IGVuZCBvZiBmdW5jdGlvbiBmb3IgZnVsbCBkaXNjbG9zdXJlICovCisgICAgUHlPYmplY3RfR0NfVW5UcmFjayhzZWxmKTsKKyAgICArK19QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4oc2VsZik7CisgICAgLS1fUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKKyAgICAvKiBETyBOT1QgcmVzdG9yZSBHQyB0cmFja2luZyBhdCB0aGlzIHBvaW50LiAgd2Vha3JlZiBjYWxsYmFja3MKKyAgICAgKiAoaWYgYW55LCBhbmQgd2hldGhlciBkaXJlY3RseSBoZXJlIG9yIGluZGlyZWN0bHkgaW4gc29tZXRoaW5nIHdlCisgICAgICogY2FsbCkgbWF5IHRyaWdnZXIgR0MsIGFuZCBpZiBzZWxmIGlzIHRyYWNrZWQgYXQgdGhhdCBwb2ludCwgaXQKKyAgICAgKiB3aWxsIGxvb2sgbGlrZSB0cmFzaCB0byBHQyBhbmQgR0Mgd2lsbCB0cnkgdG8gZGVsZXRlIHNlbGYgYWdhaW4uCisgICAgICovCiAKLQkvKiBGaW5kIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF9kZWFsbG9jICovCi0JYmFzZSA9IHR5cGU7Ci0Jd2hpbGUgKChiYXNlZGVhbGxvYyA9IGJhc2UtPnRwX2RlYWxsb2MpID09IHN1YnR5cGVfZGVhbGxvYykgewotCQliYXNlID0gYmFzZS0+dHBfYmFzZTsKLQkJYXNzZXJ0KGJhc2UpOwotCX0KKyAgICAvKiBGaW5kIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF9kZWFsbG9jICovCisgICAgYmFzZSA9IHR5cGU7CisgICAgd2hpbGUgKChiYXNlZGVhbGxvYyA9IGJhc2UtPnRwX2RlYWxsb2MpID09IHN1YnR5cGVfZGVhbGxvYykgeworICAgICAgICBiYXNlID0gYmFzZS0+dHBfYmFzZTsKKyAgICAgICAgYXNzZXJ0KGJhc2UpOworICAgIH0KIAotCS8qIElmIHdlIGFkZGVkIGEgd2Vha2xpc3QsIHdlIGNsZWFyIGl0LgkgRG8gdGhpcyAqYmVmb3JlKiBjYWxsaW5nCi0JICAgdGhlIGZpbmFsaXplciAoX19kZWxfXyksIGNsZWFyaW5nIHNsb3RzLCBvciBjbGVhcmluZyB0aGUgaW5zdGFuY2UKLQkgICBkaWN0LiAqLworICAgIC8qIElmIHdlIGFkZGVkIGEgd2Vha2xpc3QsIHdlIGNsZWFyIGl0LiAgICAgIERvIHRoaXMgKmJlZm9yZSogY2FsbGluZworICAgICAgIHRoZSBmaW5hbGl6ZXIgKF9fZGVsX18pLCBjbGVhcmluZyBzbG90cywgb3IgY2xlYXJpbmcgdGhlIGluc3RhbmNlCisgICAgICAgZGljdC4gKi8KIAotCWlmICh0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiAhYmFzZS0+dHBfd2Vha2xpc3RvZmZzZXQpCi0JCVB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoc2VsZik7CisgICAgaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmICFiYXNlLT50cF93ZWFrbGlzdG9mZnNldCkKKyAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcyhzZWxmKTsKIAotCS8qIE1heWJlIGNhbGwgZmluYWxpemVyOyBleGl0IGVhcmx5IGlmIHJlc3VycmVjdGVkICovCi0JaWYgKHR5cGUtPnRwX2RlbCkgewotCQlfUHlPYmplY3RfR0NfVFJBQ0soc2VsZik7Ci0JCXR5cGUtPnRwX2RlbChzZWxmKTsKLQkJaWYgKHNlbGYtPm9iX3JlZmNudCA+IDApCi0JCQlnb3RvIGVuZGxhYmVsOwkvKiByZXN1cnJlY3RlZCAqLwotCQllbHNlCi0JCQlfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKLQkJLyogTmV3IHdlYWtyZWZzIGNvdWxkIGJlIGNyZWF0ZWQgZHVyaW5nIHRoZSBmaW5hbGl6ZXIgY2FsbC4KLQkJICAgIElmIHRoaXMgb2NjdXJzLCBjbGVhciB0aGVtIG91dCB3aXRob3V0IGNhbGxpbmcgdGhlaXIKLQkJICAgIGZpbmFsaXplcnMgc2luY2UgdGhleSBtaWdodCByZWx5IG9uIHBhcnQgb2YgdGhlIG9iamVjdAotCQkgICAgYmVpbmcgZmluYWxpemVkIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQuICovCi0JCWlmICh0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiAhYmFzZS0+dHBfd2Vha2xpc3RvZmZzZXQpIHsKLQkJCS8qIE1vZGVsZWQgYWZ0ZXIgR0VUX1dFQUtSRUZTX0xJU1RQVFIoKSAqLwotCQkJUHlXZWFrUmVmZXJlbmNlICoqbGlzdCA9IChQeVdlYWtSZWZlcmVuY2UgKiopIFwKLQkJCQlQeU9iamVjdF9HRVRfV0VBS1JFRlNfTElTVFBUUihzZWxmKTsKLQkJCXdoaWxlICgqbGlzdCkKLQkJCQlfUHlXZWFrcmVmX0NsZWFyUmVmKCpsaXN0KTsKLQkJfQotCX0KKyAgICAvKiBNYXliZSBjYWxsIGZpbmFsaXplcjsgZXhpdCBlYXJseSBpZiByZXN1cnJlY3RlZCAqLworICAgIGlmICh0eXBlLT50cF9kZWwpIHsKKyAgICAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKHNlbGYpOworICAgICAgICB0eXBlLT50cF9kZWwoc2VsZik7CisgICAgICAgIGlmIChzZWxmLT5vYl9yZWZjbnQgPiAwKQorICAgICAgICAgICAgZ290byBlbmRsYWJlbDsgICAgICAgICAgICAgIC8qIHJlc3VycmVjdGVkICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9QeU9iamVjdF9HQ19VTlRSQUNLKHNlbGYpOworICAgICAgICAvKiBOZXcgd2Vha3JlZnMgY291bGQgYmUgY3JlYXRlZCBkdXJpbmcgdGhlIGZpbmFsaXplciBjYWxsLgorICAgICAgICAgICAgSWYgdGhpcyBvY2N1cnMsIGNsZWFyIHRoZW0gb3V0IHdpdGhvdXQgY2FsbGluZyB0aGVpcgorICAgICAgICAgICAgZmluYWxpemVycyBzaW5jZSB0aGV5IG1pZ2h0IHJlbHkgb24gcGFydCBvZiB0aGUgb2JqZWN0CisgICAgICAgICAgICBiZWluZyBmaW5hbGl6ZWQgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZC4gKi8KKyAgICAgICAgaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmICFiYXNlLT50cF93ZWFrbGlzdG9mZnNldCkgeworICAgICAgICAgICAgLyogTW9kZWxlZCBhZnRlciBHRVRfV0VBS1JFRlNfTElTVFBUUigpICovCisgICAgICAgICAgICBQeVdlYWtSZWZlcmVuY2UgKipsaXN0ID0gKFB5V2Vha1JlZmVyZW5jZSAqKikgXAorICAgICAgICAgICAgICAgIFB5T2JqZWN0X0dFVF9XRUFLUkVGU19MSVNUUFRSKHNlbGYpOworICAgICAgICAgICAgd2hpbGUgKCpsaXN0KQorICAgICAgICAgICAgICAgIF9QeVdlYWtyZWZfQ2xlYXJSZWYoKmxpc3QpOworICAgICAgICB9CisgICAgfQogCi0JLyogIENsZWFyIHNsb3RzIHVwIHRvIHRoZSBuZWFyZXN0IGJhc2Ugd2l0aCBhIGRpZmZlcmVudCB0cF9kZWFsbG9jICovCi0JYmFzZSA9IHR5cGU7Ci0Jd2hpbGUgKChiYXNlZGVhbGxvYyA9IGJhc2UtPnRwX2RlYWxsb2MpID09IHN1YnR5cGVfZGVhbGxvYykgewotCQlpZiAoUHlfU0laRShiYXNlKSkKLQkJCWNsZWFyX3Nsb3RzKGJhc2UsIHNlbGYpOwotCQliYXNlID0gYmFzZS0+dHBfYmFzZTsKLQkJYXNzZXJ0KGJhc2UpOwotCX0KKyAgICAvKiAgQ2xlYXIgc2xvdHMgdXAgdG8gdGhlIG5lYXJlc3QgYmFzZSB3aXRoIGEgZGlmZmVyZW50IHRwX2RlYWxsb2MgKi8KKyAgICBiYXNlID0gdHlwZTsKKyAgICB3aGlsZSAoKGJhc2VkZWFsbG9jID0gYmFzZS0+dHBfZGVhbGxvYykgPT0gc3VidHlwZV9kZWFsbG9jKSB7CisgICAgICAgIGlmIChQeV9TSVpFKGJhc2UpKQorICAgICAgICAgICAgY2xlYXJfc2xvdHMoYmFzZSwgc2VsZik7CisgICAgICAgIGJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICBhc3NlcnQoYmFzZSk7CisgICAgfQogCi0JLyogSWYgd2UgYWRkZWQgYSBkaWN0LCBERUNSRUYgaXQgKi8KLQlpZiAodHlwZS0+dHBfZGljdG9mZnNldCAmJiAhYmFzZS0+dHBfZGljdG9mZnNldCkgewotCQlQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihzZWxmKTsKLQkJaWYgKGRpY3RwdHIgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKmRpY3QgPSAqZGljdHB0cjsKLQkJCWlmIChkaWN0ICE9IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoZGljdCk7Ci0JCQkJKmRpY3RwdHIgPSBOVUxMOwotCQkJfQotCQl9Ci0JfQorICAgIC8qIElmIHdlIGFkZGVkIGEgZGljdCwgREVDUkVGIGl0ICovCisgICAgaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgJiYgIWJhc2UtPnRwX2RpY3RvZmZzZXQpIHsKKyAgICAgICAgUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIoc2VsZik7CisgICAgICAgIGlmIChkaWN0cHRyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpkaWN0ID0gKmRpY3RwdHI7CisgICAgICAgICAgICBpZiAoZGljdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICAgICAgICAgICpkaWN0cHRyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qIEV4dHJhY3QgdGhlIHR5cGUgYWdhaW47IHRwX2RlbCBtYXkgaGF2ZSBjaGFuZ2VkIGl0ICovCi0JdHlwZSA9IFB5X1RZUEUoc2VsZik7CisgICAgLyogRXh0cmFjdCB0aGUgdHlwZSBhZ2FpbjsgdHBfZGVsIG1heSBoYXZlIGNoYW5nZWQgaXQgKi8KKyAgICB0eXBlID0gUHlfVFlQRShzZWxmKTsKIAotCS8qIENhbGwgdGhlIGJhc2UgdHBfZGVhbGxvYygpOyBmaXJzdCByZXRyYWNrIHNlbGYgaWYKLQkgKiBiYXNlZGVhbGxvYyBrbm93cyBhYm91dCBnYy4KLQkgKi8KLQlpZiAoUHlUeXBlX0lTX0dDKGJhc2UpKQotCQlfUHlPYmplY3RfR0NfVFJBQ0soc2VsZik7Ci0JYXNzZXJ0KGJhc2VkZWFsbG9jKTsKLQliYXNlZGVhbGxvYyhzZWxmKTsKKyAgICAvKiBDYWxsIHRoZSBiYXNlIHRwX2RlYWxsb2MoKTsgZmlyc3QgcmV0cmFjayBzZWxmIGlmCisgICAgICogYmFzZWRlYWxsb2Mga25vd3MgYWJvdXQgZ2MuCisgICAgICovCisgICAgaWYgKFB5VHlwZV9JU19HQyhiYXNlKSkKKyAgICAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKHNlbGYpOworICAgIGFzc2VydChiYXNlZGVhbGxvYyk7CisgICAgYmFzZWRlYWxsb2Moc2VsZik7CiAKLQkvKiBDYW4ndCByZWZlcmVuY2Ugc2VsZiBiZXlvbmQgdGhpcyBwb2ludCAqLwotCVB5X0RFQ1JFRih0eXBlKTsKKyAgICAvKiBDYW4ndCByZWZlcmVuY2Ugc2VsZiBiZXlvbmQgdGhpcyBwb2ludCAqLworICAgIFB5X0RFQ1JFRih0eXBlKTsKIAogICBlbmRsYWJlbDoKLQkrK19QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOwotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKHNlbGYpOwotCS0tX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgKytfUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKKyAgICBQeV9UUkFTSENBTl9TQUZFX0VORChzZWxmKTsKKyAgICAtLV9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOwogCi0JLyogRXhwbGFuYXRpb24gb2YgdGhlIHdlaXJkbmVzcyBhcm91bmQgdGhlIHRyYXNoY2FuIG1hY3JvczoKKyAgICAvKiBFeHBsYW5hdGlvbiBvZiB0aGUgd2VpcmRuZXNzIGFyb3VuZCB0aGUgdHJhc2hjYW4gbWFjcm9zOgogCi0JICAgUS4gV2hhdCBkbyB0aGUgdHJhc2hjYW4gbWFjcm9zIGRvPworICAgICAgIFEuIFdoYXQgZG8gdGhlIHRyYXNoY2FuIG1hY3JvcyBkbz8KIAotCSAgIEEuIFJlYWQgdGhlIGNvbW1lbnQgdGl0bGVkICJUcmFzaGNhbiBtZWNoYW5pc20iIGluIG9iamVjdC5oLgotCSAgICAgIEZvciBvbmUsIHRoaXMgZXhwbGFpbnMgd2h5IHRoZXJlIG11c3QgYmUgYSBjYWxsIHRvIEdDLXVudHJhY2sKLQkgICAgICBiZWZvcmUgdGhlIHRyYXNoY2FuIGJlZ2luIG1hY3JvLglXaXRob3V0IHVuZGVyc3RhbmRpbmcgdGhlCi0JICAgICAgdHJhc2hjYW4gY29kZSwgdGhlIGFuc3dlcnMgdG8gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMgZG9uJ3QgbWFrZQotCSAgICAgIHNlbnNlLgorICAgICAgIEEuIFJlYWQgdGhlIGNvbW1lbnQgdGl0bGVkICJUcmFzaGNhbiBtZWNoYW5pc20iIGluIG9iamVjdC5oLgorICAgICAgICAgIEZvciBvbmUsIHRoaXMgZXhwbGFpbnMgd2h5IHRoZXJlIG11c3QgYmUgYSBjYWxsIHRvIEdDLXVudHJhY2sKKyAgICAgICAgICBiZWZvcmUgdGhlIHRyYXNoY2FuIGJlZ2luIG1hY3JvLiAgICAgIFdpdGhvdXQgdW5kZXJzdGFuZGluZyB0aGUKKyAgICAgICAgICB0cmFzaGNhbiBjb2RlLCB0aGUgYW5zd2VycyB0byB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucyBkb24ndCBtYWtlCisgICAgICAgICAgc2Vuc2UuCiAKLQkgICBRLiBXaHkgZG8gd2UgR0MtdW50cmFjayBiZWZvcmUgdGhlIHRyYXNoY2FuIGFuZCB0aGVuIGltbWVkaWF0ZWx5Ci0JICAgICAgR0MtdHJhY2sgYWdhaW4gYWZ0ZXJ3YXJkPworICAgICAgIFEuIFdoeSBkbyB3ZSBHQy11bnRyYWNrIGJlZm9yZSB0aGUgdHJhc2hjYW4gYW5kIHRoZW4gaW1tZWRpYXRlbHkKKyAgICAgICAgICBHQy10cmFjayBhZ2FpbiBhZnRlcndhcmQ/CiAKLQkgICBBLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBiYXNlIGNsYXNzIGlzIEdDLWF3YXJlLCB0aGUgYmFzZSBjbGFzcwotCSAgICAgIHByb2JhYmx5IEdDLXVudHJhY2tzIHRoZSBvYmplY3QuCUlmIGl0IGRvZXMgdGhhdCB1c2luZyB0aGUKLQkgICAgICBVTlRSQUNLIG1hY3JvLCB0aGlzIHdpbGwgY3Jhc2ggd2hlbiB0aGUgb2JqZWN0IGlzIGFscmVhZHkKLQkgICAgICB1bnRyYWNrZWQuICBCZWNhdXNlIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgYmFzZSBjbGFzcyBkb2VzLCB0aGUKLQkgICAgICBvbmx5IHNhZmUgdGhpbmcgaXMgdG8gbWFrZSBzdXJlIHRoZSBvYmplY3QgaXMgdHJhY2tlZCB3aGVuIHdlCi0JICAgICAgY2FsbCB0aGUgYmFzZSBjbGFzcyBkZWFsbG9jLiAgQnV0Li4uICBUaGUgdHJhc2hjYW4gYmVnaW4gbWFjcm8KLQkgICAgICByZXF1aXJlcyB0aGF0IHRoZSBvYmplY3QgaXMgKnVudHJhY2tlZCogYmVmb3JlIGl0IGlzIGNhbGxlZC4gIFNvCi0JICAgICAgdGhlIGRhbmNlIGJlY29tZXM6CisgICAgICAgQS4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgYmFzZSBjbGFzcyBpcyBHQy1hd2FyZSwgdGhlIGJhc2UgY2xhc3MKKyAgICAgICAgICBwcm9iYWJseSBHQy11bnRyYWNrcyB0aGUgb2JqZWN0LiAgICAgIElmIGl0IGRvZXMgdGhhdCB1c2luZyB0aGUKKyAgICAgICAgICBVTlRSQUNLIG1hY3JvLCB0aGlzIHdpbGwgY3Jhc2ggd2hlbiB0aGUgb2JqZWN0IGlzIGFscmVhZHkKKyAgICAgICAgICB1bnRyYWNrZWQuICBCZWNhdXNlIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgYmFzZSBjbGFzcyBkb2VzLCB0aGUKKyAgICAgICAgICBvbmx5IHNhZmUgdGhpbmcgaXMgdG8gbWFrZSBzdXJlIHRoZSBvYmplY3QgaXMgdHJhY2tlZCB3aGVuIHdlCisgICAgICAgICAgY2FsbCB0aGUgYmFzZSBjbGFzcyBkZWFsbG9jLiAgQnV0Li4uICBUaGUgdHJhc2hjYW4gYmVnaW4gbWFjcm8KKyAgICAgICAgICByZXF1aXJlcyB0aGF0IHRoZSBvYmplY3QgaXMgKnVudHJhY2tlZCogYmVmb3JlIGl0IGlzIGNhbGxlZC4gIFNvCisgICAgICAgICAgdGhlIGRhbmNlIGJlY29tZXM6CiAKLQkJIEdDIHVudHJhY2sKLQkJIHRyYXNoY2FuIGJlZ2luCi0JCSBHQyB0cmFjaworICAgICAgICAgR0MgdW50cmFjaworICAgICAgICAgdHJhc2hjYW4gYmVnaW4KKyAgICAgICAgIEdDIHRyYWNrCiAKLQkgICBRLiBXaHkgZGlkIHRoZSBsYXN0IHF1ZXN0aW9uIHNheSAiaW1tZWRpYXRlbHkgR0MtdHJhY2sgYWdhaW4iPwotCSAgICAgIEl0J3Mgbm93aGVyZSBuZWFyIGltbWVkaWF0ZWx5LgorICAgICAgIFEuIFdoeSBkaWQgdGhlIGxhc3QgcXVlc3Rpb24gc2F5ICJpbW1lZGlhdGVseSBHQy10cmFjayBhZ2FpbiI/CisgICAgICAgICAgSXQncyBub3doZXJlIG5lYXIgaW1tZWRpYXRlbHkuCiAKLQkgICBBLiBCZWNhdXNlIHRoZSBjb2RlICp1c2VkKiB0byByZS10cmFjayBpbW1lZGlhdGVseS4JQmFkIElkZWEuCi0JICAgICAgc2VsZiBoYXMgYSByZWZjb3VudCBvZiAwLCBhbmQgaWYgZ2MgZXZlciBnZXRzIGl0cyBoYW5kcyBvbiBpdAotCSAgICAgICh3aGljaCBjYW4gaGFwcGVuIGlmIGFueSB3ZWFrcmVmIGNhbGxiYWNrIGdldHMgaW52b2tlZCksIGl0Ci0JICAgICAgbG9va3MgbGlrZSB0cmFzaCB0byBnYyB0b28sIGFuZCBnYyBhbHNvIHRyaWVzIHRvIGRlbGV0ZSBzZWxmCi0JICAgICAgdGhlbi4gIEJ1dCB3ZSdyZSBhbHJlYWR5IGRlbGV0aW5nIHNlbGYuICBEb3VibGUgZGVhbGxvY3Rpb24gaXMKLQkgICAgICBhIHN1YnRsZSBkaXNhc3Rlci4KKyAgICAgICBBLiBCZWNhdXNlIHRoZSBjb2RlICp1c2VkKiB0byByZS10cmFjayBpbW1lZGlhdGVseS4gICAgICBCYWQgSWRlYS4KKyAgICAgICAgICBzZWxmIGhhcyBhIHJlZmNvdW50IG9mIDAsIGFuZCBpZiBnYyBldmVyIGdldHMgaXRzIGhhbmRzIG9uIGl0CisgICAgICAgICAgKHdoaWNoIGNhbiBoYXBwZW4gaWYgYW55IHdlYWtyZWYgY2FsbGJhY2sgZ2V0cyBpbnZva2VkKSwgaXQKKyAgICAgICAgICBsb29rcyBsaWtlIHRyYXNoIHRvIGdjIHRvbywgYW5kIGdjIGFsc28gdHJpZXMgdG8gZGVsZXRlIHNlbGYKKyAgICAgICAgICB0aGVuLiAgQnV0IHdlJ3JlIGFscmVhZHkgZGVsZXRpbmcgc2VsZi4gIERvdWJsZSBkZWFsbG9jdGlvbiBpcworICAgICAgICAgIGEgc3VidGxlIGRpc2FzdGVyLgogCi0JICAgUS4gV2h5IHRoZSBiaXphcnJlIChuZXQtemVybykgbWFuaXB1bGF0aW9uIG9mCi0JICAgICAgX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgYXJvdW5kIHRoZSB0cmFzaGNhbiBtYWNyb3M/CisgICAgICAgUS4gV2h5IHRoZSBiaXphcnJlIChuZXQtemVybykgbWFuaXB1bGF0aW9uIG9mCisgICAgICAgICAgX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgYXJvdW5kIHRoZSB0cmFzaGNhbiBtYWNyb3M/CiAKLQkgICBBLiBTb21lIGJhc2UgY2xhc3NlcyAoZS5nLiBsaXN0KSBhbHNvIHVzZSB0aGUgdHJhc2hjYW4gbWVjaGFuaXNtLgotCSAgICAgIFRoZSBmb2xsb3dpbmcgc2NlbmFyaW8gdXNlZCB0byBiZSBwb3NzaWJsZToKKyAgICAgICBBLiBTb21lIGJhc2UgY2xhc3NlcyAoZS5nLiBsaXN0KSBhbHNvIHVzZSB0aGUgdHJhc2hjYW4gbWVjaGFuaXNtLgorICAgICAgICAgIFRoZSBmb2xsb3dpbmcgc2NlbmFyaW8gdXNlZCB0byBiZSBwb3NzaWJsZToKIAotCSAgICAgIC0gc3VwcG9zZSB0aGUgdHJhc2hjYW4gbGV2ZWwgaXMgb25lIGJlbG93IHRoZSB0cmFzaGNhbiBsaW1pdAorICAgICAgICAgIC0gc3VwcG9zZSB0aGUgdHJhc2hjYW4gbGV2ZWwgaXMgb25lIGJlbG93IHRoZSB0cmFzaGNhbiBsaW1pdAogCi0JICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSBpcyBjYWxsZWQKKyAgICAgICAgICAtIHN1YnR5cGVfZGVhbGxvYygpIGlzIGNhbGxlZAogCi0JICAgICAgLSB0aGUgdHJhc2hjYW4gbGltaXQgaXMgbm90IHlldCByZWFjaGVkLCBzbyB0aGUgdHJhc2hjYW4gbGV2ZWwKLQkJaXMgaW5jcmVtZW50ZWQgYW5kIHRoZSBjb2RlIGJldHdlZW4gdHJhc2hjYW4gYmVnaW4gYW5kIGVuZCBpcwotCQlleGVjdXRlZAorICAgICAgICAgIC0gdGhlIHRyYXNoY2FuIGxpbWl0IGlzIG5vdCB5ZXQgcmVhY2hlZCwgc28gdGhlIHRyYXNoY2FuIGxldmVsCisgICAgICAgIGlzIGluY3JlbWVudGVkIGFuZCB0aGUgY29kZSBiZXR3ZWVuIHRyYXNoY2FuIGJlZ2luIGFuZCBlbmQgaXMKKyAgICAgICAgZXhlY3V0ZWQKIAotCSAgICAgIC0gdGhpcyBkZXN0cm95cyBtdWNoIG9mIHRoZSBvYmplY3QncyBjb250ZW50cywgaW5jbHVkaW5nIGl0cwotCQlzbG90cyBhbmQgX19kaWN0X18KKyAgICAgICAgICAtIHRoaXMgZGVzdHJveXMgbXVjaCBvZiB0aGUgb2JqZWN0J3MgY29udGVudHMsIGluY2x1ZGluZyBpdHMKKyAgICAgICAgc2xvdHMgYW5kIF9fZGljdF9fCiAKLQkgICAgICAtIGJhc2VkZWFsbG9jKCkgaXMgY2FsbGVkOyB0aGlzIGlzIHJlYWxseSBsaXN0X2RlYWxsb2MoKSwgb3IKLQkJc29tZSBvdGhlciB0eXBlIHdoaWNoIGFsc28gdXNlcyB0aGUgdHJhc2hjYW4gbWFjcm9zCisgICAgICAgICAgLSBiYXNlZGVhbGxvYygpIGlzIGNhbGxlZDsgdGhpcyBpcyByZWFsbHkgbGlzdF9kZWFsbG9jKCksIG9yCisgICAgICAgIHNvbWUgb3RoZXIgdHlwZSB3aGljaCBhbHNvIHVzZXMgdGhlIHRyYXNoY2FuIG1hY3JvcwogCi0JICAgICAgLSB0aGUgdHJhc2hjYW4gbGltaXQgaXMgbm93IHJlYWNoZWQsIHNvIHRoZSBvYmplY3QgaXMgcHV0IG9uIHRoZQotCQl0cmFzaGNhbidzIHRvLWJlLWRlbGV0ZWQtbGF0ZXIgbGlzdAorICAgICAgICAgIC0gdGhlIHRyYXNoY2FuIGxpbWl0IGlzIG5vdyByZWFjaGVkLCBzbyB0aGUgb2JqZWN0IGlzIHB1dCBvbiB0aGUKKyAgICAgICAgdHJhc2hjYW4ncyB0by1iZS1kZWxldGVkLWxhdGVyIGxpc3QKIAotCSAgICAgIC0gYmFzZWRlYWxsb2MoKSByZXR1cm5zCisgICAgICAgICAgLSBiYXNlZGVhbGxvYygpIHJldHVybnMKIAotCSAgICAgIC0gc3VidHlwZV9kZWFsbG9jKCkgZGVjcmVmcyB0aGUgb2JqZWN0J3MgdHlwZQorICAgICAgICAgIC0gc3VidHlwZV9kZWFsbG9jKCkgZGVjcmVmcyB0aGUgb2JqZWN0J3MgdHlwZQogCi0JICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSByZXR1cm5zCisgICAgICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSByZXR1cm5zCiAKLQkgICAgICAtIGxhdGVyLCB0aGUgdHJhc2hjYW4gY29kZSBzdGFydHMgZGVsZXRpbmcgdGhlIG9iamVjdHMgZnJvbSBpdHMKLQkJdG8tYmUtZGVsZXRlZC1sYXRlciBsaXN0CisgICAgICAgICAgLSBsYXRlciwgdGhlIHRyYXNoY2FuIGNvZGUgc3RhcnRzIGRlbGV0aW5nIHRoZSBvYmplY3RzIGZyb20gaXRzCisgICAgICAgIHRvLWJlLWRlbGV0ZWQtbGF0ZXIgbGlzdAogCi0JICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSBpcyBjYWxsZWQgKkFHQUlOKiBmb3IgdGhlIHNhbWUgb2JqZWN0CisgICAgICAgICAgLSBzdWJ0eXBlX2RlYWxsb2MoKSBpcyBjYWxsZWQgKkFHQUlOKiBmb3IgdGhlIHNhbWUgb2JqZWN0CiAKLQkgICAgICAtIGF0IHRoZSB2ZXJ5IGxlYXN0IChpZiB0aGUgZGVzdHJveWVkIHNsb3RzIGFuZCBfX2RpY3RfXyBkb24ndAotCQljYXVzZSBwcm9ibGVtcykgdGhlIG9iamVjdCdzIHR5cGUgZ2V0cyBkZWNyZWYnZWQgYSBzZWNvbmQKLQkJdGltZSwgd2hpY2ggaXMgKkJBRCohISEKKyAgICAgICAgICAtIGF0IHRoZSB2ZXJ5IGxlYXN0IChpZiB0aGUgZGVzdHJveWVkIHNsb3RzIGFuZCBfX2RpY3RfXyBkb24ndAorICAgICAgICBjYXVzZSBwcm9ibGVtcykgdGhlIG9iamVjdCdzIHR5cGUgZ2V0cyBkZWNyZWYnZWQgYSBzZWNvbmQKKyAgICAgICAgdGltZSwgd2hpY2ggaXMgKkJBRCohISEKIAotCSAgICAgIFRoZSByZW1lZHkgaXMgdG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlIGNvZGUgYmV0d2VlbiB0cmFzaGNhbgotCSAgICAgIGJlZ2luIGFuZCBlbmQgaW4gc3VidHlwZV9kZWFsbG9jKCkgaXMgY2FsbGVkLCB0aGUgY29kZSBiZXR3ZWVuCi0JICAgICAgdHJhc2hjYW4gYmVnaW4gYW5kIGVuZCBpbiBiYXNlZGVhbGxvYygpIHdpbGwgYWxzbyBiZSBjYWxsZWQuCi0JICAgICAgVGhpcyBpcyBkb25lIGJ5IGRlY3JlbWVudGluZyB0aGUgbGV2ZWwgYWZ0ZXIgcGFzc2luZyBpbnRvIHRoZQotCSAgICAgIHRyYXNoY2FuIGJsb2NrLCBhbmQgaW5jcmVtZW50aW5nIGl0IGp1c3QgYmVmb3JlIGxlYXZpbmcgdGhlCi0JICAgICAgYmxvY2suCisgICAgICAgICAgVGhlIHJlbWVkeSBpcyB0byBtYWtlIHN1cmUgdGhhdCBpZiB0aGUgY29kZSBiZXR3ZWVuIHRyYXNoY2FuCisgICAgICAgICAgYmVnaW4gYW5kIGVuZCBpbiBzdWJ0eXBlX2RlYWxsb2MoKSBpcyBjYWxsZWQsIHRoZSBjb2RlIGJldHdlZW4KKyAgICAgICAgICB0cmFzaGNhbiBiZWdpbiBhbmQgZW5kIGluIGJhc2VkZWFsbG9jKCkgd2lsbCBhbHNvIGJlIGNhbGxlZC4KKyAgICAgICAgICBUaGlzIGlzIGRvbmUgYnkgZGVjcmVtZW50aW5nIHRoZSBsZXZlbCBhZnRlciBwYXNzaW5nIGludG8gdGhlCisgICAgICAgICAgdHJhc2hjYW4gYmxvY2ssIGFuZCBpbmNyZW1lbnRpbmcgaXQganVzdCBiZWZvcmUgbGVhdmluZyB0aGUKKyAgICAgICAgICBibG9jay4KIAotCSAgICAgIEJ1dCBub3cgaXQncyBwb3NzaWJsZSB0aGF0IGEgY2hhaW4gb2Ygb2JqZWN0cyBjb25zaXN0aW5nIHNvbGVseQotCSAgICAgIG9mIG9iamVjdHMgd2hvc2UgZGVhbGxvY2F0b3IgaXMgc3VidHlwZV9kZWFsbG9jKCkgd2lsbCBkZWZlYXQKLQkgICAgICB0aGUgdHJhc2hjYW4gbWVjaGFuaXNtIGNvbXBsZXRlbHk6IHRoZSBkZWNyZW1lbnRlZCBsZXZlbCBtZWFucwotCSAgICAgIHRoYXQgdGhlIGVmZmVjdGl2ZSBsZXZlbCBuZXZlciByZWFjaGVzIHRoZSBsaW1pdC4JIFRoZXJlZm9yZSwgd2UKLQkgICAgICAqaW5jcmVtZW50KiB0aGUgbGV2ZWwgKmJlZm9yZSogZW50ZXJpbmcgdGhlIHRyYXNoY2FuIGJsb2NrLCBhbmQKLQkgICAgICBtYXRjaGluZ2x5IGRlY3JlbWVudCBpdCBhZnRlciBsZWF2aW5nLiAgVGhpcyBtZWFucyB0aGUgdHJhc2hjYW4KLQkgICAgICBjb2RlIHdpbGwgdHJpZ2dlciBhIGxpdHRsZSBlYXJseSwgYnV0IHRoYXQncyBubyBiaWcgZGVhbC4KKyAgICAgICAgICBCdXQgbm93IGl0J3MgcG9zc2libGUgdGhhdCBhIGNoYWluIG9mIG9iamVjdHMgY29uc2lzdGluZyBzb2xlbHkKKyAgICAgICAgICBvZiBvYmplY3RzIHdob3NlIGRlYWxsb2NhdG9yIGlzIHN1YnR5cGVfZGVhbGxvYygpIHdpbGwgZGVmZWF0CisgICAgICAgICAgdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSBjb21wbGV0ZWx5OiB0aGUgZGVjcmVtZW50ZWQgbGV2ZWwgbWVhbnMKKyAgICAgICAgICB0aGF0IHRoZSBlZmZlY3RpdmUgbGV2ZWwgbmV2ZXIgcmVhY2hlcyB0aGUgbGltaXQuICAgICAgVGhlcmVmb3JlLCB3ZQorICAgICAgICAgICppbmNyZW1lbnQqIHRoZSBsZXZlbCAqYmVmb3JlKiBlbnRlcmluZyB0aGUgdHJhc2hjYW4gYmxvY2ssIGFuZAorICAgICAgICAgIG1hdGNoaW5nbHkgZGVjcmVtZW50IGl0IGFmdGVyIGxlYXZpbmcuICBUaGlzIG1lYW5zIHRoZSB0cmFzaGNhbgorICAgICAgICAgIGNvZGUgd2lsbCB0cmlnZ2VyIGEgbGl0dGxlIGVhcmx5LCBidXQgdGhhdCdzIG5vIGJpZyBkZWFsLgogCi0JICAgUS4gQXJlIHRoZXJlIGFueSBsaXZlIGV4YW1wbGVzIG9mIGNvZGUgaW4gbmVlZCBvZiBhbGwgdGhpcwotCSAgICAgIGNvbXBsZXhpdHk/CisgICAgICAgUS4gQXJlIHRoZXJlIGFueSBsaXZlIGV4YW1wbGVzIG9mIGNvZGUgaW4gbmVlZCBvZiBhbGwgdGhpcworICAgICAgICAgIGNvbXBsZXhpdHk/CiAKLQkgICBBLiBZZXMuICBTZWUgU0YgYnVnIDY2ODQzMyBmb3IgY29kZSB0aGF0IGNyYXNoZWQgKHdoZW4gUHl0aG9uIHdhcwotCSAgICAgIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUpIGJlZm9yZSB0aGUgdHJhc2hjYW4gbGV2ZWwgbWFuaXB1bGF0aW9ucwotCSAgICAgIHdlcmUgYWRkZWQuICBGb3IgbW9yZSBkaXNjdXNzaW9uLCBzZWUgU0YgcGF0Y2hlcyA1ODE3NDIsIDU3NTA3MwotCSAgICAgIGFuZCBidWcgNTc0MjA3LgotCSovCisgICAgICAgQS4gWWVzLiAgU2VlIFNGIGJ1ZyA2Njg0MzMgZm9yIGNvZGUgdGhhdCBjcmFzaGVkICh3aGVuIFB5dGhvbiB3YXMKKyAgICAgICAgICBjb21waWxlZCBpbiBkZWJ1ZyBtb2RlKSBiZWZvcmUgdGhlIHRyYXNoY2FuIGxldmVsIG1hbmlwdWxhdGlvbnMKKyAgICAgICAgICB3ZXJlIGFkZGVkLiAgRm9yIG1vcmUgZGlzY3Vzc2lvbiwgc2VlIFNGIHBhdGNoZXMgNTgxNzQyLCA1NzUwNzMKKyAgICAgICAgICBhbmQgYnVnIDU3NDIwNy4KKyAgICAqLwogfQogCiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpzb2xpZF9iYXNlKFB5VHlwZU9iamVjdCAqdHlwZSk7CkBAIC0xMTMyLDM5ICsxMTMyLDM5IEBACiBpbnQKIFB5VHlwZV9Jc1N1YnR5cGUoUHlUeXBlT2JqZWN0ICphLCBQeVR5cGVPYmplY3QgKmIpCiB7Ci0JUHlPYmplY3QgKm1ybzsKKyAgICBQeU9iamVjdCAqbXJvOwogCi0JaWYgKCEoYS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpKQotCQlyZXR1cm4gYiA9PSBhIHx8IGIgPT0gJlB5QmFzZU9iamVjdF9UeXBlOworICAgIGlmICghKGEtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSkKKyAgICAgICAgcmV0dXJuIGIgPT0gYSB8fCBiID09ICZQeUJhc2VPYmplY3RfVHlwZTsKIAotCW1ybyA9IGEtPnRwX21ybzsKLQlpZiAobXJvICE9IE5VTEwpIHsKLQkJLyogRGVhbCB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlIHdpdGhvdXQgcmVjdXJzaW9uCi0JCSAgIGJ5IHdhbGtpbmcgdGhlIE1STyB0dXBsZSAqLwotCQlQeV9zc2l6ZV90IGksIG47Ci0JCWFzc2VydChQeVR1cGxlX0NoZWNrKG1ybykpOwotCQluID0gUHlUdXBsZV9HRVRfU0laRShtcm8pOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlpZiAoUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpID09IChQeU9iamVjdCAqKWIpCi0JCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgewotCQkvKiBhIGlzIG5vdCBjb21wbGV0ZWx5IGluaXRpbGl6ZWQgeWV0OyBmb2xsb3cgdHBfYmFzZSAqLwotCQlkbyB7Ci0JCQlpZiAoYSA9PSBiKQotCQkJCXJldHVybiAxOwotCQkJYSA9IGEtPnRwX2Jhc2U7Ci0JCX0gd2hpbGUgKGEgIT0gTlVMTCk7Ci0JCXJldHVybiBiID09ICZQeUJhc2VPYmplY3RfVHlwZTsKLQl9CisgICAgbXJvID0gYS0+dHBfbXJvOworICAgIGlmIChtcm8gIT0gTlVMTCkgeworICAgICAgICAvKiBEZWFsIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2Ugd2l0aG91dCByZWN1cnNpb24KKyAgICAgICAgICAgYnkgd2Fsa2luZyB0aGUgTVJPIHR1cGxlICovCisgICAgICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICAgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2sobXJvKSk7CisgICAgICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKG1ybyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQeVR1cGxlX0dFVF9JVEVNKG1ybywgaSkgPT0gKFB5T2JqZWN0ICopYikKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGEgaXMgbm90IGNvbXBsZXRlbHkgaW5pdGlsaXplZCB5ZXQ7IGZvbGxvdyB0cF9iYXNlICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChhID09IGIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBhID0gYS0+dHBfYmFzZTsKKyAgICAgICAgfSB3aGlsZSAoYSAhPSBOVUxMKTsKKyAgICAgICAgcmV0dXJuIGIgPT0gJlB5QmFzZU9iamVjdF9UeXBlOworICAgIH0KIH0KIAogLyogSW50ZXJuYWwgcm91dGluZXMgdG8gZG8gYSBtZXRob2QgbG9va3VwIGluIHRoZSB0eXBlCiAgICB3aXRob3V0IGxvb2tpbmcgaW4gdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkKICAgIChzbyB3ZSBjYW4ndCB1c2UgUHlPYmplY3RfR2V0QXR0cikgYnV0IHN0aWxsIGJpbmRpbmcKLSAgIGl0IHRvIHRoZSBpbnN0YW5jZS4JVGhlIGFyZ3VtZW50cyBhcmUgdGhlIG9iamVjdCwKKyAgIGl0IHRvIHRoZSBpbnN0YW5jZS4gIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBvYmplY3QsCiAgICB0aGUgbWV0aG9kIG5hbWUgYXMgYSBDIHN0cmluZywgYW5kIHRoZSBhZGRyZXNzIG9mIGEKICAgIHN0YXRpYyB2YXJpYWJsZSB1c2VkIHRvIGNhY2hlIHRoZSBpbnRlcm5lZCBQeXRob24gc3RyaW5nLgogCkBAIC0xMTc5LDY5ICsxMTc5LDY5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbG9va3VwX21heWJlKFB5T2JqZWN0ICpzZWxmLCBjaGFyICphdHRyc3RyLCBQeU9iamVjdCAqKmF0dHJvYmopCiB7Ci0JUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKCphdHRyb2JqID09IE5VTEwpIHsKLQkJKmF0dHJvYmogPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKGF0dHJzdHIpOwotCQlpZiAoKmF0dHJvYmogPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXMgPSBfUHlUeXBlX0xvb2t1cChQeV9UWVBFKHNlbGYpLCAqYXR0cm9iaik7Ci0JaWYgKHJlcyAhPSBOVUxMKSB7Ci0JCWRlc2NyZ2V0ZnVuYyBmOwotCQlpZiAoKGYgPSBQeV9UWVBFKHJlcyktPnRwX2Rlc2NyX2dldCkgPT0gTlVMTCkKLQkJCVB5X0lOQ1JFRihyZXMpOwotCQllbHNlCi0JCQlyZXMgPSBmKHJlcywgc2VsZiwgKFB5T2JqZWN0ICopKFB5X1RZUEUoc2VsZikpKTsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoKmF0dHJvYmogPT0gTlVMTCkgeworICAgICAgICAqYXR0cm9iaiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoYXR0cnN0cik7CisgICAgICAgIGlmICgqYXR0cm9iaiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlcyA9IF9QeVR5cGVfTG9va3VwKFB5X1RZUEUoc2VsZiksICphdHRyb2JqKTsKKyAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVzY3JnZXRmdW5jIGY7CisgICAgICAgIGlmICgoZiA9IFB5X1RZUEUocmVzKS0+dHBfZGVzY3JfZ2V0KSA9PSBOVUxMKQorICAgICAgICAgICAgUHlfSU5DUkVGKHJlcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IGYocmVzLCBzZWxmLCAoUHlPYmplY3QgKikoUHlfVFlQRShzZWxmKSkpOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbG9va3VwX21ldGhvZChQeU9iamVjdCAqc2VsZiwgY2hhciAqYXR0cnN0ciwgUHlPYmplY3QgKiphdHRyb2JqKQogewotCVB5T2JqZWN0ICpyZXMgPSBsb29rdXBfbWF5YmUoc2VsZiwgYXR0cnN0ciwgYXR0cm9iaik7Ci0JaWYgKHJlcyA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsICphdHRyb2JqKTsKLQlyZXR1cm4gcmVzOworICAgIFB5T2JqZWN0ICpyZXMgPSBsb29rdXBfbWF5YmUoc2VsZiwgYXR0cnN0ciwgYXR0cm9iaik7CisgICAgaWYgKHJlcyA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsICphdHRyb2JqKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKiBBIHZhcmlhdGlvbiBvZiBQeU9iamVjdF9DYWxsTWV0aG9kIHRoYXQgdXNlcyBsb29rdXBfbWV0aG9kKCkKLSAgIGluc3RlYWQgb2YgUHlPYmplY3RfR2V0QXR0clN0cmluZygpLgkgVGhpcyB1c2VzIHRoZSBzYW1lIGNvbnZlbnRpb24KKyAgIGluc3RlYWQgb2YgUHlPYmplY3RfR2V0QXR0clN0cmluZygpLiAgVGhpcyB1c2VzIHRoZSBzYW1lIGNvbnZlbnRpb24KICAgIGFzIGxvb2t1cF9tZXRob2QgdG8gY2FjaGUgdGhlIGludGVybmVkIG5hbWUgc3RyaW5nIG9iamVjdC4gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfbWV0aG9kKFB5T2JqZWN0ICpvLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqKm5hbWVvYmosIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7Ci0JUHlPYmplY3QgKmFyZ3MsICpmdW5jID0gMCwgKnJldHZhbDsKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICB2YV9saXN0IHZhOworICAgIFB5T2JqZWN0ICphcmdzLCAqZnVuYyA9IDAsICpyZXR2YWw7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CiAKLQlmdW5jID0gbG9va3VwX21heWJlKG8sIG5hbWUsIG5hbWVvYmopOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJdmFfZW5kKHZhKTsKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAqbmFtZW9iaik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBmdW5jID0gbG9va3VwX21heWJlKG8sIG5hbWUsIG5hbWVvYmopOworICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgdmFfZW5kKHZhKTsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAqbmFtZW9iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChmb3JtYXQgJiYgKmZvcm1hdCkKLQkJYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhKTsKLQllbHNlCi0JCWFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAoZm9ybWF0ICYmICpmb3JtYXQpCisgICAgICAgIGFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7CisgICAgZWxzZQorICAgICAgICBhcmdzID0gUHlUdXBsZV9OZXcoMCk7CiAKLQl2YV9lbmQodmEpOworICAgIHZhX2VuZCh2YSk7CiAKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLQlyZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwogCi0JUHlfREVDUkVGKGFyZ3MpOwotCVB5X0RFQ1JFRihmdW5jKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOwogCi0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAvKiBDbG9uZSBvZiBjYWxsX21ldGhvZCgpIHRoYXQgcmV0dXJucyBOb3RJbXBsZW1lbnRlZCB3aGVuIHRoZSBsb29rdXAgZmFpbHMuICovCkBAIC0xMjQ5LDc4ICsxMjQ5LDc4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9tYXliZShQeU9iamVjdCAqbywgY2hhciAqbmFtZSwgUHlPYmplY3QgKipuYW1lb2JqLCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOwotCVB5T2JqZWN0ICphcmdzLCAqZnVuYyA9IDAsICpyZXR2YWw7Ci0JdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgdmFfbGlzdCB2YTsKKyAgICBQeU9iamVjdCAqYXJncywgKmZ1bmMgPSAwLCAqcmV0dmFsOworICAgIHZhX3N0YXJ0KHZhLCBmb3JtYXQpOwogCi0JZnVuYyA9IGxvb2t1cF9tYXliZShvLCBuYW1lLCBuYW1lb2JqKTsKLQlpZiAoZnVuYyA9PSBOVUxMKSB7Ci0JCXZhX2VuZCh2YSk7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLQkJCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQkJfQotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgZnVuYyA9IGxvb2t1cF9tYXliZShvLCBuYW1lLCBuYW1lb2JqKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIHZhX2VuZCh2YSk7CisgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICAgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZm9ybWF0ICYmICpmb3JtYXQpCi0JCWFyZ3MgPSBQeV9WYUJ1aWxkVmFsdWUoZm9ybWF0LCB2YSk7Ci0JZWxzZQotCQlhcmdzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgaWYgKGZvcm1hdCAmJiAqZm9ybWF0KQorICAgICAgICBhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmEpOworICAgIGVsc2UKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDApOwogCi0JdmFfZW5kKHZhKTsKKyAgICB2YV9lbmQodmEpOwogCi0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JcmV0dmFsID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgcmV0dmFsID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKIAotCVB5X0RFQ1JFRihhcmdzKTsKLQlQeV9ERUNSRUYoZnVuYyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKIAotCXJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGludAogZmlsbF9jbGFzc2ljX21ybyhQeU9iamVjdCAqbXJvLCBQeU9iamVjdCAqY2xzKQogewotCVB5T2JqZWN0ICpiYXNlcywgKmJhc2U7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICpiYXNlcywgKmJhc2U7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JYXNzZXJ0KFB5TGlzdF9DaGVjayhtcm8pKTsKLQlhc3NlcnQoUHlDbGFzc19DaGVjayhjbHMpKTsKLQlpID0gUHlTZXF1ZW5jZV9Db250YWlucyhtcm8sIGNscyk7Ci0JaWYgKGkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFpKSB7Ci0JCWlmIChQeUxpc3RfQXBwZW5kKG1ybywgY2xzKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCWJhc2VzID0gKChQeUNsYXNzT2JqZWN0ICopY2xzKS0+Y2xfYmFzZXM7Ci0JYXNzZXJ0KGJhc2VzICYmIFB5VHVwbGVfQ2hlY2soYmFzZXMpKTsKLQluID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQliYXNlID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCWlmIChmaWxsX2NsYXNzaWNfbXJvKG1ybywgYmFzZSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKG1ybykpOworICAgIGFzc2VydChQeUNsYXNzX0NoZWNrKGNscykpOworICAgIGkgPSBQeVNlcXVlbmNlX0NvbnRhaW5zKG1ybywgY2xzKTsKKyAgICBpZiAoaSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIWkpIHsKKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobXJvLCBjbHMpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYmFzZXMgPSAoKFB5Q2xhc3NPYmplY3QgKiljbHMpLT5jbF9iYXNlczsKKyAgICBhc3NlcnQoYmFzZXMgJiYgUHlUdXBsZV9DaGVjayhiYXNlcykpOworICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGJhc2UgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgaWYgKGZpbGxfY2xhc3NpY19tcm8obXJvLCBiYXNlKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2xhc3NpY19tcm8oUHlPYmplY3QgKmNscykKIHsKLQlQeU9iamVjdCAqbXJvOworICAgIFB5T2JqZWN0ICptcm87CiAKLQlhc3NlcnQoUHlDbGFzc19DaGVjayhjbHMpKTsKLQltcm8gPSBQeUxpc3RfTmV3KDApOwotCWlmIChtcm8gIT0gTlVMTCkgewotCQlpZiAoZmlsbF9jbGFzc2ljX21ybyhtcm8sIGNscykgPT0gMCkKLQkJCXJldHVybiBtcm87Ci0JCVB5X0RFQ1JFRihtcm8pOwotCX0KLQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlDbGFzc19DaGVjayhjbHMpKTsKKyAgICBtcm8gPSBQeUxpc3RfTmV3KDApOworICAgIGlmIChtcm8gIT0gTlVMTCkgeworICAgICAgICBpZiAoZmlsbF9jbGFzc2ljX21ybyhtcm8sIGNscykgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBtcm87CisgICAgICAgIFB5X0RFQ1JFRihtcm8pOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyoKQEAgLTEzNTMsNjMgKzEzNTMsNjMgQEAKIAogc3RhdGljIGludAogdGFpbF9jb250YWlucyhQeU9iamVjdCAqbGlzdCwgaW50IHdoZW5jZSwgUHlPYmplY3QgKm8pIHsKLQlQeV9zc2l6ZV90IGosIHNpemU7Ci0Jc2l6ZSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKKyAgICBQeV9zc2l6ZV90IGosIHNpemU7CisgICAgc2l6ZSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKIAotCWZvciAoaiA9IHdoZW5jZSsxOyBqIDwgc2l6ZTsgaisrKSB7Ci0JCWlmIChQeUxpc3RfR0VUX0lURU0obGlzdCwgaikgPT0gbykKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICBmb3IgKGogPSB3aGVuY2UrMTsgaiA8IHNpemU7IGorKykgeworICAgICAgICBpZiAoUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGopID09IG8pCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjbGFzc19uYW1lKFB5T2JqZWN0ICpjbHMpCiB7Ci0JUHlPYmplY3QgKm5hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNscywgIl9fbmFtZV9fIik7Ci0JaWYgKG5hbWUgPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlQeV9YREVDUkVGKG5hbWUpOwotCQluYW1lID0gUHlPYmplY3RfUmVwcihjbHMpOwotCX0KLQlpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7Ci0JCVB5X0RFQ1JFRihuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBuYW1lOworICAgIFB5T2JqZWN0ICpuYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjbHMsICJfX25hbWVfXyIpOworICAgIGlmIChuYW1lID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICAgICAgbmFtZSA9IFB5T2JqZWN0X1JlcHIoY2xzKTsKKyAgICB9CisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgICAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmFtZTsKIH0KIAogc3RhdGljIGludAogY2hlY2tfZHVwbGljYXRlcyhQeU9iamVjdCAqbGlzdCkKIHsKLQlQeV9zc2l6ZV90IGksIGosIG47Ci0JLyogTGV0J3MgdXNlIGEgcXVhZHJhdGljIHRpbWUgYWxnb3JpdGhtLAotCSAgIGFzc3VtaW5nIHRoYXQgdGhlIGJhc2VzIGxpc3RzIGlzIHNob3J0LgotCSovCi0JbiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpvID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwotCQlmb3IgKGogPSBpICsgMTsgaiA8IG47IGorKykgewotCQkJaWYgKFB5TGlzdF9HRVRfSVRFTShsaXN0LCBqKSA9PSBvKSB7Ci0JCQkJbyA9IGNsYXNzX25hbWUobyk7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgICAiZHVwbGljYXRlIGJhc2UgY2xhc3MgJXMiLAotCQkJCQkgICAgIG8gPyBQeVN0cmluZ19BU19TVFJJTkcobykgOiAiPyIpOwotCQkJCVB5X1hERUNSRUYobyk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOworICAgIFB5X3NzaXplX3QgaSwgaiwgbjsKKyAgICAvKiBMZXQncyB1c2UgYSBxdWFkcmF0aWMgdGltZSBhbGdvcml0aG0sCisgICAgICAgYXNzdW1pbmcgdGhhdCB0aGUgYmFzZXMgbGlzdHMgaXMgc2hvcnQuCisgICAgKi8KKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKm8gPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CisgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbjsgaisrKSB7CisgICAgICAgICAgICBpZiAoUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGopID09IG8pIHsKKyAgICAgICAgICAgICAgICBvID0gY2xhc3NfbmFtZShvKTsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIGJhc2UgY2xhc3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID8gUHlTdHJpbmdfQVNfU1RSSU5HKG8pIDogIj8iKTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKG8pOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogLyogUmFpc2UgYSBUeXBlRXJyb3IgZm9yIGFuIE1STyBvcmRlciBkaXNhZ3JlZW1lbnQuCiAKICAgIEl0J3MgaGFyZCB0byBwcm9kdWNlIGEgZ29vZCBlcnJvciBtZXNzYWdlLiAgSW4gdGhlIGFic2VuY2Ugb2YgYmV0dGVyCiAgICBpbnNpZ2h0IGludG8gZXJyb3IgcmVwb3J0aW5nLCByZXBvcnQgdGhlIGNsYXNzZXMgdGhhdCB3ZXJlIGNhbmRpZGF0ZXMKLSAgIHRvIGJlIHB1dCBuZXh0IGludG8gdGhlIE1STy4JIFRoZXJlIGlzIHNvbWUgY29uZmxpY3QgYmV0d2VlbiB0aGUKKyAgIHRvIGJlIHB1dCBuZXh0IGludG8gdGhlIE1STy4gIFRoZXJlIGlzIHNvbWUgY29uZmxpY3QgYmV0d2VlbiB0aGUKICAgIG9yZGVyIGluIHdoaWNoIHRoZXkgc2hvdWxkIGJlIHB1dCBpbiB0aGUgTVJPLCBidXQgaXQncyBoYXJkIHRvCiAgICBkaWFnbm9zZSB3aGF0IGNvbnN0cmFpbnQgY2FuJ3QgYmUgc2F0aXNmaWVkLgogKi8KQEAgLTE0MTcsMjU4ICsxNDE3LDI1OCBAQAogc3RhdGljIHZvaWQKIHNldF9tcm9fZXJyb3IoUHlPYmplY3QgKnRvX21lcmdlLCBpbnQgKnJlbWFpbikKIHsKLQlQeV9zc2l6ZV90IGksIG4sIG9mZiwgdG9fbWVyZ2Vfc2l6ZTsKLQljaGFyIGJ1ZlsxMDAwXTsKLQlQeU9iamVjdCAqaywgKnY7Ci0JUHlPYmplY3QgKnNldCA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIXNldCkgcmV0dXJuOworICAgIFB5X3NzaXplX3QgaSwgbiwgb2ZmLCB0b19tZXJnZV9zaXplOworICAgIGNoYXIgYnVmWzEwMDBdOworICAgIFB5T2JqZWN0ICprLCAqdjsKKyAgICBQeU9iamVjdCAqc2V0ID0gUHlEaWN0X05ldygpOworICAgIGlmICghc2V0KSByZXR1cm47CiAKLQl0b19tZXJnZV9zaXplID0gUHlMaXN0X0dFVF9TSVpFKHRvX21lcmdlKTsKLQlmb3IgKGkgPSAwOyBpIDwgdG9fbWVyZ2Vfc2l6ZTsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpMID0gUHlMaXN0X0dFVF9JVEVNKHRvX21lcmdlLCBpKTsKLQkJaWYgKHJlbWFpbltpXSA8IFB5TGlzdF9HRVRfU0laRShMKSkgewotCQkJUHlPYmplY3QgKmMgPSBQeUxpc3RfR0VUX0lURU0oTCwgcmVtYWluW2ldKTsKLQkJCWlmIChQeURpY3RfU2V0SXRlbShzZXQsIGMsIFB5X05vbmUpIDwgMCkgewotCQkJCVB5X0RFQ1JFRihzZXQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQluID0gUHlEaWN0X1NpemUoc2V0KTsKKyAgICB0b19tZXJnZV9zaXplID0gUHlMaXN0X0dFVF9TSVpFKHRvX21lcmdlKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdG9fbWVyZ2Vfc2l6ZTsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpMID0gUHlMaXN0X0dFVF9JVEVNKHRvX21lcmdlLCBpKTsKKyAgICAgICAgaWYgKHJlbWFpbltpXSA8IFB5TGlzdF9HRVRfU0laRShMKSkgeworICAgICAgICAgICAgUHlPYmplY3QgKmMgPSBQeUxpc3RfR0VUX0lURU0oTCwgcmVtYWluW2ldKTsKKyAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzZXQsIGMsIFB5X05vbmUpIDwgMCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzZXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBuID0gUHlEaWN0X1NpemUoc2V0KTsKIAotCW9mZiA9IFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkNhbm5vdCBjcmVhdGUgYSBcCisgICAgb2ZmID0gUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiQ2Fubm90IGNyZWF0ZSBhIFwKIGNvbnNpc3RlbnQgbWV0aG9kIHJlc29sdXRpb25cbm9yZGVyIChNUk8pIGZvciBiYXNlcyIpOwotCWkgPSAwOwotCXdoaWxlIChQeURpY3RfTmV4dChzZXQsICZpLCAmaywgJnYpICYmIChzaXplX3Qpb2ZmIDwgc2l6ZW9mKGJ1ZikpIHsKLQkJUHlPYmplY3QgKm5hbWUgPSBjbGFzc19uYW1lKGspOwotCQlvZmYgKz0gUHlPU19zbnByaW50ZihidWYgKyBvZmYsIHNpemVvZihidWYpIC0gb2ZmLCAiICVzIiwKLQkJCQkgICAgIG5hbWUgPyBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkgOiAiPyIpOwotCQlQeV9YREVDUkVGKG5hbWUpOwotCQlpZiAoLS1uICYmIChzaXplX3QpKG9mZisxKSA8IHNpemVvZihidWYpKSB7Ci0JCQlidWZbb2ZmKytdID0gJywnOwotCQkJYnVmW29mZl0gPSAnXDAnOwotCQl9Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGJ1Zik7Ci0JUHlfREVDUkVGKHNldCk7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KHNldCwgJmksICZrLCAmdikgJiYgKHNpemVfdClvZmYgPCBzaXplb2YoYnVmKSkgeworICAgICAgICBQeU9iamVjdCAqbmFtZSA9IGNsYXNzX25hbWUoayk7CisgICAgICAgIG9mZiArPSBQeU9TX3NucHJpbnRmKGJ1ZiArIG9mZiwgc2l6ZW9mKGJ1ZikgLSBvZmYsICIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID8gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpIDogIj8iKTsKKyAgICAgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICAgICAgaWYgKC0tbiAmJiAoc2l6ZV90KShvZmYrMSkgPCBzaXplb2YoYnVmKSkgeworICAgICAgICAgICAgYnVmW29mZisrXSA9ICcsJzsKKyAgICAgICAgICAgIGJ1ZltvZmZdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBidWYpOworICAgIFB5X0RFQ1JFRihzZXQpOwogfQogCiBzdGF0aWMgaW50CiBwbWVyZ2UoUHlPYmplY3QgKmFjYywgUHlPYmplY3QqIHRvX21lcmdlKSB7Ci0JUHlfc3NpemVfdCBpLCBqLCB0b19tZXJnZV9zaXplLCBlbXB0eV9jbnQ7Ci0JaW50ICpyZW1haW47Ci0JaW50IG9rOworICAgIFB5X3NzaXplX3QgaSwgaiwgdG9fbWVyZ2Vfc2l6ZSwgZW1wdHlfY250OworICAgIGludCAqcmVtYWluOworICAgIGludCBvazsKIAotCXRvX21lcmdlX3NpemUgPSBQeUxpc3RfR0VUX1NJWkUodG9fbWVyZ2UpOworICAgIHRvX21lcmdlX3NpemUgPSBQeUxpc3RfR0VUX1NJWkUodG9fbWVyZ2UpOwogCi0JLyogcmVtYWluIHN0b3JlcyBhbiBpbmRleCBpbnRvIGVhY2ggc3VibGlzdCBvZiB0b19tZXJnZS4KLQkgICByZW1haW5baV0gaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGJhc2UgaW4gdG9fbWVyZ2VbaV0KLQkgICB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiBhY2MuCi0JKi8KLQlyZW1haW4gPSAoaW50ICopUHlNZW1fTUFMTE9DKFNJWkVPRl9JTlQqdG9fbWVyZ2Vfc2l6ZSk7Ci0JaWYgKHJlbWFpbiA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JZm9yIChpID0gMDsgaSA8IHRvX21lcmdlX3NpemU7IGkrKykKLQkJcmVtYWluW2ldID0gMDsKKyAgICAvKiByZW1haW4gc3RvcmVzIGFuIGluZGV4IGludG8gZWFjaCBzdWJsaXN0IG9mIHRvX21lcmdlLgorICAgICAgIHJlbWFpbltpXSBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgYmFzZSBpbiB0b19tZXJnZVtpXQorICAgICAgIHRoYXQgaXMgbm90IGluY2x1ZGVkIGluIGFjYy4KKyAgICAqLworICAgIHJlbWFpbiA9IChpbnQgKilQeU1lbV9NQUxMT0MoU0laRU9GX0lOVCp0b19tZXJnZV9zaXplKTsKKyAgICBpZiAocmVtYWluID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdG9fbWVyZ2Vfc2l6ZTsgaSsrKQorICAgICAgICByZW1haW5baV0gPSAwOwogCiAgIGFnYWluOgotCWVtcHR5X2NudCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHRvX21lcmdlX3NpemU7IGkrKykgewotCQlQeU9iamVjdCAqY2FuZGlkYXRlOworICAgIGVtcHR5X2NudCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHRvX21lcmdlX3NpemU7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqY2FuZGlkYXRlOwogCi0JCVB5T2JqZWN0ICpjdXJfbGlzdCA9IFB5TGlzdF9HRVRfSVRFTSh0b19tZXJnZSwgaSk7CisgICAgICAgIFB5T2JqZWN0ICpjdXJfbGlzdCA9IFB5TGlzdF9HRVRfSVRFTSh0b19tZXJnZSwgaSk7CiAKLQkJaWYgKHJlbWFpbltpXSA+PSBQeUxpc3RfR0VUX1NJWkUoY3VyX2xpc3QpKSB7Ci0JCQllbXB0eV9jbnQrKzsKLQkJCWNvbnRpbnVlOwotCQl9CisgICAgICAgIGlmIChyZW1haW5baV0gPj0gUHlMaXN0X0dFVF9TSVpFKGN1cl9saXN0KSkgeworICAgICAgICAgICAgZW1wdHlfY250Kys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0JCS8qIENob29zZSBuZXh0IGNhbmRpZGF0ZSBmb3IgTVJPLgorICAgICAgICAvKiBDaG9vc2UgbmV4dCBjYW5kaWRhdGUgZm9yIE1STy4KIAotCQkgICBUaGUgaW5wdXQgc2VxdWVuY2VzIGFsb25lIGNhbiBkZXRlcm1pbmUgdGhlIGNob2ljZS4KLQkJICAgSWYgbm90LCBjaG9vc2UgdGhlIGNsYXNzIHdoaWNoIGFwcGVhcnMgaW4gdGhlIE1STwotCQkgICBvZiB0aGUgZWFybGllc3QgZGlyZWN0IHN1cGVyY2xhc3Mgb2YgdGhlIG5ldyBjbGFzcy4KLQkJKi8KKyAgICAgICAgICAgVGhlIGlucHV0IHNlcXVlbmNlcyBhbG9uZSBjYW4gZGV0ZXJtaW5lIHRoZSBjaG9pY2UuCisgICAgICAgICAgIElmIG5vdCwgY2hvb3NlIHRoZSBjbGFzcyB3aGljaCBhcHBlYXJzIGluIHRoZSBNUk8KKyAgICAgICAgICAgb2YgdGhlIGVhcmxpZXN0IGRpcmVjdCBzdXBlcmNsYXNzIG9mIHRoZSBuZXcgY2xhc3MuCisgICAgICAgICovCiAKLQkJY2FuZGlkYXRlID0gUHlMaXN0X0dFVF9JVEVNKGN1cl9saXN0LCByZW1haW5baV0pOwotCQlmb3IgKGogPSAwOyBqIDwgdG9fbWVyZ2Vfc2l6ZTsgaisrKSB7Ci0JCQlQeU9iamVjdCAqal9sc3QgPSBQeUxpc3RfR0VUX0lURU0odG9fbWVyZ2UsIGopOwotCQkJaWYgKHRhaWxfY29udGFpbnMoal9sc3QsIHJlbWFpbltqXSwgY2FuZGlkYXRlKSkgewotCQkJCWdvdG8gc2tpcDsgLyogY29udGludWUgb3V0ZXIgbG9vcCAqLwotCQkJfQotCQl9Ci0JCW9rID0gUHlMaXN0X0FwcGVuZChhY2MsIGNhbmRpZGF0ZSk7Ci0JCWlmIChvayA8IDApIHsKLQkJCVB5TWVtX0ZyZWUocmVtYWluKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlmb3IgKGogPSAwOyBqIDwgdG9fbWVyZ2Vfc2l6ZTsgaisrKSB7Ci0JCQlQeU9iamVjdCAqal9sc3QgPSBQeUxpc3RfR0VUX0lURU0odG9fbWVyZ2UsIGopOwotCQkJaWYgKHJlbWFpbltqXSA8IFB5TGlzdF9HRVRfU0laRShqX2xzdCkgJiYKLQkJCSAgICBQeUxpc3RfR0VUX0lURU0oal9sc3QsIHJlbWFpbltqXSkgPT0gY2FuZGlkYXRlKSB7Ci0JCQkJcmVtYWluW2pdKys7Ci0JCQl9Ci0JCX0KLQkJZ290byBhZ2FpbjsKLQkgIHNraXA6IDsKLQl9CisgICAgICAgIGNhbmRpZGF0ZSA9IFB5TGlzdF9HRVRfSVRFTShjdXJfbGlzdCwgcmVtYWluW2ldKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHRvX21lcmdlX3NpemU7IGorKykgeworICAgICAgICAgICAgUHlPYmplY3QgKmpfbHN0ID0gUHlMaXN0X0dFVF9JVEVNKHRvX21lcmdlLCBqKTsKKyAgICAgICAgICAgIGlmICh0YWlsX2NvbnRhaW5zKGpfbHN0LCByZW1haW5bal0sIGNhbmRpZGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIHNraXA7IC8qIGNvbnRpbnVlIG91dGVyIGxvb3AgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvayA9IFB5TGlzdF9BcHBlbmQoYWNjLCBjYW5kaWRhdGUpOworICAgICAgICBpZiAob2sgPCAwKSB7CisgICAgICAgICAgICBQeU1lbV9GcmVlKHJlbWFpbik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHRvX21lcmdlX3NpemU7IGorKykgeworICAgICAgICAgICAgUHlPYmplY3QgKmpfbHN0ID0gUHlMaXN0X0dFVF9JVEVNKHRvX21lcmdlLCBqKTsKKyAgICAgICAgICAgIGlmIChyZW1haW5bal0gPCBQeUxpc3RfR0VUX1NJWkUoal9sc3QpICYmCisgICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGpfbHN0LCByZW1haW5bal0pID09IGNhbmRpZGF0ZSkgeworICAgICAgICAgICAgICAgIHJlbWFpbltqXSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdvdG8gYWdhaW47CisgICAgICBza2lwOiA7CisgICAgfQogCi0JaWYgKGVtcHR5X2NudCA9PSB0b19tZXJnZV9zaXplKSB7Ci0JCVB5TWVtX0ZSRUUocmVtYWluKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNldF9tcm9fZXJyb3IodG9fbWVyZ2UsIHJlbWFpbik7Ci0JUHlNZW1fRlJFRShyZW1haW4pOwotCXJldHVybiAtMTsKKyAgICBpZiAoZW1wdHlfY250ID09IHRvX21lcmdlX3NpemUpIHsKKyAgICAgICAgUHlNZW1fRlJFRShyZW1haW4pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc2V0X21yb19lcnJvcih0b19tZXJnZSwgcmVtYWluKTsKKyAgICBQeU1lbV9GUkVFKHJlbWFpbik7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbXJvX2ltcGxlbWVudGF0aW9uKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeV9zc2l6ZV90IGksIG47Ci0JaW50IG9rOwotCVB5T2JqZWN0ICpiYXNlcywgKnJlc3VsdDsKLQlQeU9iamVjdCAqdG9fbWVyZ2UsICpiYXNlc19hc2xpc3Q7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIGludCBvazsKKyAgICBQeU9iamVjdCAqYmFzZXMsICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnRvX21lcmdlLCAqYmFzZXNfYXNsaXN0OwogCi0JaWYgKHR5cGUtPnRwX2RpY3QgPT0gTlVMTCkgewotCQlpZiAoUHlUeXBlX1JlYWR5KHR5cGUpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAodHlwZS0+dHBfZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeVR5cGVfUmVhZHkodHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogRmluZCBhIHN1cGVyY2xhc3MgbGluZWFyaXphdGlvbiB0aGF0IGhvbm9ycyB0aGUgY29uc3RyYWludHMKLQkgICBvZiB0aGUgZXhwbGljaXQgbGlzdHMgb2YgYmFzZXMgYW5kIHRoZSBjb25zdHJhaW50cyBpbXBsaWVkIGJ5Ci0JICAgZWFjaCBiYXNlIGNsYXNzLgorICAgIC8qIEZpbmQgYSBzdXBlcmNsYXNzIGxpbmVhcml6YXRpb24gdGhhdCBob25vcnMgdGhlIGNvbnN0cmFpbnRzCisgICAgICAgb2YgdGhlIGV4cGxpY2l0IGxpc3RzIG9mIGJhc2VzIGFuZCB0aGUgY29uc3RyYWludHMgaW1wbGllZCBieQorICAgICAgIGVhY2ggYmFzZSBjbGFzcy4KIAotCSAgIHRvX21lcmdlIGlzIGEgbGlzdCBvZiBsaXN0cywgd2hlcmUgZWFjaCBsaXN0IGlzIGEgc3VwZXJjbGFzcwotCSAgIGxpbmVhcml6YXRpb24gaW1wbGllZCBieSBhIGJhc2UgY2xhc3MuICBUaGUgbGFzdCBlbGVtZW50IG9mCi0JICAgdG9fbWVyZ2UgaXMgdGhlIGRlY2xhcmVkIGxpc3Qgb2YgYmFzZXMuCi0JKi8KKyAgICAgICB0b19tZXJnZSBpcyBhIGxpc3Qgb2YgbGlzdHMsIHdoZXJlIGVhY2ggbGlzdCBpcyBhIHN1cGVyY2xhc3MKKyAgICAgICBsaW5lYXJpemF0aW9uIGltcGxpZWQgYnkgYSBiYXNlIGNsYXNzLiAgVGhlIGxhc3QgZWxlbWVudCBvZgorICAgICAgIHRvX21lcmdlIGlzIHRoZSBkZWNsYXJlZCBsaXN0IG9mIGJhc2VzLgorICAgICovCiAKLQliYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKKyAgICBiYXNlcyA9IHR5cGUtPnRwX2Jhc2VzOworICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKIAotCXRvX21lcmdlID0gUHlMaXN0X05ldyhuKzEpOwotCWlmICh0b19tZXJnZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICB0b19tZXJnZSA9IFB5TGlzdF9OZXcobisxKTsKKyAgICBpZiAodG9fbWVyZ2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICpiYXNlID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCVB5T2JqZWN0ICpwYXJlbnRNUk87Ci0JCWlmIChQeVR5cGVfQ2hlY2soYmFzZSkpCi0JCQlwYXJlbnRNUk8gPSBQeVNlcXVlbmNlX0xpc3QoCi0JCQkJKChQeVR5cGVPYmplY3QqKWJhc2UpLT50cF9tcm8pOwotCQllbHNlCi0JCQlwYXJlbnRNUk8gPSBjbGFzc2ljX21ybyhiYXNlKTsKLQkJaWYgKHBhcmVudE1STyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYodG9fbWVyZ2UpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpiYXNlID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7CisgICAgICAgIFB5T2JqZWN0ICpwYXJlbnRNUk87CisgICAgICAgIGlmIChQeVR5cGVfQ2hlY2soYmFzZSkpCisgICAgICAgICAgICBwYXJlbnRNUk8gPSBQeVNlcXVlbmNlX0xpc3QoCisgICAgICAgICAgICAgICAgKChQeVR5cGVPYmplY3QqKWJhc2UpLT50cF9tcm8pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXJlbnRNUk8gPSBjbGFzc2ljX21ybyhiYXNlKTsKKyAgICAgICAgaWYgKHBhcmVudE1STyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodG9fbWVyZ2UpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQlQeUxpc3RfU0VUX0lURU0odG9fbWVyZ2UsIGksIHBhcmVudE1STyk7Ci0JfQorICAgICAgICBQeUxpc3RfU0VUX0lURU0odG9fbWVyZ2UsIGksIHBhcmVudE1STyk7CisgICAgfQogCi0JYmFzZXNfYXNsaXN0ID0gUHlTZXF1ZW5jZV9MaXN0KGJhc2VzKTsKLQlpZiAoYmFzZXNfYXNsaXN0ID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKHRvX21lcmdlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFRoaXMgaXMganVzdCBhIGJhc2ljIHNhbml0eSBjaGVjay4gKi8KLQlpZiAoY2hlY2tfZHVwbGljYXRlcyhiYXNlc19hc2xpc3QpIDwgMCkgewotCQlQeV9ERUNSRUYodG9fbWVyZ2UpOwotCQlQeV9ERUNSRUYoYmFzZXNfYXNsaXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5TGlzdF9TRVRfSVRFTSh0b19tZXJnZSwgbiwgYmFzZXNfYXNsaXN0KTsKKyAgICBiYXNlc19hc2xpc3QgPSBQeVNlcXVlbmNlX0xpc3QoYmFzZXMpOworICAgIGlmIChiYXNlc19hc2xpc3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodG9fbWVyZ2UpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogVGhpcyBpcyBqdXN0IGEgYmFzaWMgc2FuaXR5IGNoZWNrLiAqLworICAgIGlmIChjaGVja19kdXBsaWNhdGVzKGJhc2VzX2FzbGlzdCkgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRih0b19tZXJnZSk7CisgICAgICAgIFB5X0RFQ1JFRihiYXNlc19hc2xpc3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlMaXN0X1NFVF9JVEVNKHRvX21lcmdlLCBuLCBiYXNlc19hc2xpc3QpOwogCi0JcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiW09dIiwgKFB5T2JqZWN0ICopdHlwZSk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRih0b19tZXJnZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJbT10iLCAoUHlPYmplY3QgKil0eXBlKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHRvX21lcmdlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jb2sgPSBwbWVyZ2UocmVzdWx0LCB0b19tZXJnZSk7Ci0JUHlfREVDUkVGKHRvX21lcmdlKTsKLQlpZiAob2sgPCAwKSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgb2sgPSBwbWVyZ2UocmVzdWx0LCB0b19tZXJnZSk7CisgICAgUHlfREVDUkVGKHRvX21lcmdlKTsKKyAgICBpZiAob2sgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBtcm9fZXh0ZXJuYWwoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlID0gKFB5VHlwZU9iamVjdCAqKXNlbGY7CisgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gKFB5VHlwZU9iamVjdCAqKXNlbGY7CiAKLQlyZXR1cm4gbXJvX2ltcGxlbWVudGF0aW9uKHR5cGUpOworICAgIHJldHVybiBtcm9faW1wbGVtZW50YXRpb24odHlwZSk7CiB9CiAKIHN0YXRpYyBpbnQKIG1yb19pbnRlcm5hbChQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlPYmplY3QgKm1ybywgKnJlc3VsdCwgKnR1cGxlOwotCWludCBjaGVja2l0ID0gMDsKKyAgICBQeU9iamVjdCAqbXJvLCAqcmVzdWx0LCAqdHVwbGU7CisgICAgaW50IGNoZWNraXQgPSAwOwogCi0JaWYgKFB5X1RZUEUodHlwZSkgPT0gJlB5VHlwZV9UeXBlKSB7Ci0JCXJlc3VsdCA9IG1yb19pbXBsZW1lbnRhdGlvbih0eXBlKTsKLQl9Ci0JZWxzZSB7Ci0JCXN0YXRpYyBQeU9iamVjdCAqbXJvX3N0cjsKLQkJY2hlY2tpdCA9IDE7Ci0JCW1ybyA9IGxvb2t1cF9tZXRob2QoKFB5T2JqZWN0ICopdHlwZSwgIm1ybyIsICZtcm9fc3RyKTsKLQkJaWYgKG1ybyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KG1ybywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihtcm8pOwotCX0KLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQl0dXBsZSA9IFB5U2VxdWVuY2VfVHVwbGUocmVzdWx0KTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlpZiAodHVwbGUgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWlmIChjaGVja2l0KSB7Ci0JCVB5X3NzaXplX3QgaSwgbGVuOwotCQlQeU9iamVjdCAqY2xzOwotCQlQeVR5cGVPYmplY3QgKnNvbGlkOworICAgIGlmIChQeV9UWVBFKHR5cGUpID09ICZQeVR5cGVfVHlwZSkgeworICAgICAgICByZXN1bHQgPSBtcm9faW1wbGVtZW50YXRpb24odHlwZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGF0aWMgUHlPYmplY3QgKm1yb19zdHI7CisgICAgICAgIGNoZWNraXQgPSAxOworICAgICAgICBtcm8gPSBsb29rdXBfbWV0aG9kKChQeU9iamVjdCAqKXR5cGUsICJtcm8iLCAmbXJvX3N0cik7CisgICAgICAgIGlmIChtcm8gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChtcm8sIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYobXJvKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgdHVwbGUgPSBQeVNlcXVlbmNlX1R1cGxlKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoY2hlY2tpdCkgeworICAgICAgICBQeV9zc2l6ZV90IGksIGxlbjsKKyAgICAgICAgUHlPYmplY3QgKmNsczsKKyAgICAgICAgUHlUeXBlT2JqZWN0ICpzb2xpZDsKIAotCQlzb2xpZCA9IHNvbGlkX2Jhc2UodHlwZSk7CisgICAgICAgIHNvbGlkID0gc29saWRfYmFzZSh0eXBlKTsKIAotCQlsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKHR1cGxlKTsKKyAgICAgICAgbGVuID0gUHlUdXBsZV9HRVRfU0laRSh0dXBsZSk7CiAKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlQeVR5cGVPYmplY3QgKnQ7Ci0JCQljbHMgPSBQeVR1cGxlX0dFVF9JVEVNKHR1cGxlLCBpKTsKLQkJCWlmIChQeUNsYXNzX0NoZWNrKGNscykpIAotCQkJCWNvbnRpbnVlOwotCQkJZWxzZSBpZiAoIVB5VHlwZV9DaGVjayhjbHMpKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIm1ybygpIHJldHVybmVkIGEgbm9uLWNsYXNzICgnJS41MDBzJykiLAotCQkJCQkgICAgIFB5X1RZUEUoY2xzKS0+dHBfbmFtZSk7Ci0JCQkJUHlfREVDUkVGKHR1cGxlKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQl0ID0gKFB5VHlwZU9iamVjdCopY2xzOwotCQkJaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKHNvbGlkLCBzb2xpZF9iYXNlKHQpKSkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgIm1ybygpIHJldHVybmVkIGJhc2Ugd2l0aCB1bnN1aXRhYmxlIGxheW91dCAoJyUuNTAwcycpIiwKLQkJCQkJICAgICB0LT50cF9uYW1lKTsKLQkJCQlQeV9ERUNSRUYodHVwbGUpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCX0KLQl0eXBlLT50cF9tcm8gPSB0dXBsZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBQeVR5cGVPYmplY3QgKnQ7CisgICAgICAgICAgICBjbHMgPSBQeVR1cGxlX0dFVF9JVEVNKHR1cGxlLCBpKTsKKyAgICAgICAgICAgIGlmIChQeUNsYXNzX0NoZWNrKGNscykpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBlbHNlIGlmICghUHlUeXBlX0NoZWNrKGNscykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAibXJvKCkgcmV0dXJuZWQgYSBub24tY2xhc3MgKCclLjUwMHMnKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGNscyktPnRwX25hbWUpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0dXBsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdCA9IChQeVR5cGVPYmplY3QqKWNsczsKKyAgICAgICAgICAgIGlmICghUHlUeXBlX0lzU3VidHlwZShzb2xpZCwgc29saWRfYmFzZSh0KSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICJtcm8oKSByZXR1cm5lZCBiYXNlIHdpdGggdW5zdWl0YWJsZSBsYXlvdXQgKCclLjUwMHMnKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodHVwbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHR5cGUtPnRwX21ybyA9IHR1cGxlOwogCi0JdHlwZV9tcm9fbW9kaWZpZWQodHlwZSwgdHlwZS0+dHBfbXJvKTsKLQkvKiBjb3JuZXIgY2FzZTogdGhlIG9sZC1zdHlsZSBzdXBlciBjbGFzcyBtaWdodCBoYXZlIGJlZW4gaGlkZGVuCi0JICAgZnJvbSB0aGUgY3VzdG9tIE1STyAqLwotCXR5cGVfbXJvX21vZGlmaWVkKHR5cGUsIHR5cGUtPnRwX2Jhc2VzKTsKKyAgICB0eXBlX21yb19tb2RpZmllZCh0eXBlLCB0eXBlLT50cF9tcm8pOworICAgIC8qIGNvcm5lciBjYXNlOiB0aGUgb2xkLXN0eWxlIHN1cGVyIGNsYXNzIG1pZ2h0IGhhdmUgYmVlbiBoaWRkZW4KKyAgICAgICBmcm9tIHRoZSBjdXN0b20gTVJPICovCisgICAgdHlwZV9tcm9fbW9kaWZpZWQodHlwZSwgdHlwZS0+dHBfYmFzZXMpOwogCi0JUHlUeXBlX01vZGlmaWVkKHR5cGUpOworICAgIFB5VHlwZV9Nb2RpZmllZCh0eXBlKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTE2NzgsOTIgKzE2NzgsOTIgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKgogYmVzdF9iYXNlKFB5T2JqZWN0ICpiYXNlcykKIHsKLQlQeV9zc2l6ZV90IGksIG47Ci0JUHlUeXBlT2JqZWN0ICpiYXNlLCAqd2lubmVyLCAqY2FuZGlkYXRlLCAqYmFzZV9pOwotCVB5T2JqZWN0ICpiYXNlX3Byb3RvOworICAgIFB5X3NzaXplX3QgaSwgbjsKKyAgICBQeVR5cGVPYmplY3QgKmJhc2UsICp3aW5uZXIsICpjYW5kaWRhdGUsICpiYXNlX2k7CisgICAgUHlPYmplY3QgKmJhc2VfcHJvdG87CiAKLQlhc3NlcnQoUHlUdXBsZV9DaGVjayhiYXNlcykpOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQlhc3NlcnQobiA+IDApOwotCWJhc2UgPSBOVUxMOwotCXdpbm5lciA9IE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQliYXNlX3Byb3RvID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCWlmIChQeUNsYXNzX0NoZWNrKGJhc2VfcHJvdG8pKQotCQkJY29udGludWU7Ci0JCWlmICghUHlUeXBlX0NoZWNrKGJhc2VfcHJvdG8pKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoCi0JCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJCSJiYXNlcyBtdXN0IGJlIHR5cGVzIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQliYXNlX2kgPSAoUHlUeXBlT2JqZWN0ICopYmFzZV9wcm90bzsKLQkJaWYgKGJhc2VfaS0+dHBfZGljdCA9PSBOVUxMKSB7Ci0JCQlpZiAoUHlUeXBlX1JlYWR5KGJhc2VfaSkgPCAwKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWNhbmRpZGF0ZSA9IHNvbGlkX2Jhc2UoYmFzZV9pKTsKLQkJaWYgKHdpbm5lciA9PSBOVUxMKSB7Ci0JCQl3aW5uZXIgPSBjYW5kaWRhdGU7Ci0JCQliYXNlID0gYmFzZV9pOwotCQl9Ci0JCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUod2lubmVyLCBjYW5kaWRhdGUpKQotCQkJOwotCQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGNhbmRpZGF0ZSwgd2lubmVyKSkgewotCQkJd2lubmVyID0gY2FuZGlkYXRlOwotCQkJYmFzZSA9IGJhc2VfaTsKLQkJfQotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIm11bHRpcGxlIGJhc2VzIGhhdmUgIgotCQkJCSJpbnN0YW5jZSBsYXktb3V0IGNvbmZsaWN0Iik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlpZiAoYmFzZSA9PSBOVUxMKQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImEgbmV3LXN0eWxlIGNsYXNzIGNhbid0IGhhdmUgb25seSBjbGFzc2ljIGJhc2VzIik7Ci0JcmV0dXJuIGJhc2U7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYmFzZXMpKTsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7CisgICAgYXNzZXJ0KG4gPiAwKTsKKyAgICBiYXNlID0gTlVMTDsKKyAgICB3aW5uZXIgPSBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYmFzZV9wcm90byA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOworICAgICAgICBpZiAoUHlDbGFzc19DaGVjayhiYXNlX3Byb3RvKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIVB5VHlwZV9DaGVjayhiYXNlX3Byb3RvKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiYmFzZXMgbXVzdCBiZSB0eXBlcyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgYmFzZV9pID0gKFB5VHlwZU9iamVjdCAqKWJhc2VfcHJvdG87CisgICAgICAgIGlmIChiYXNlX2ktPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5VHlwZV9SZWFkeShiYXNlX2kpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBjYW5kaWRhdGUgPSBzb2xpZF9iYXNlKGJhc2VfaSk7CisgICAgICAgIGlmICh3aW5uZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgd2lubmVyID0gY2FuZGlkYXRlOworICAgICAgICAgICAgYmFzZSA9IGJhc2VfaTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKHdpbm5lciwgY2FuZGlkYXRlKSkKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShjYW5kaWRhdGUsIHdpbm5lcikpIHsKKyAgICAgICAgICAgIHdpbm5lciA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlX2k7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJtdWx0aXBsZSBiYXNlcyBoYXZlICIKKyAgICAgICAgICAgICAgICAiaW5zdGFuY2UgbGF5LW91dCBjb25mbGljdCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJhc2UgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJhIG5ldy1zdHlsZSBjbGFzcyBjYW4ndCBoYXZlIG9ubHkgY2xhc3NpYyBiYXNlcyIpOworICAgIHJldHVybiBiYXNlOwogfQogCiBzdGF0aWMgaW50CiBleHRyYV9pdmFycyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5VHlwZU9iamVjdCAqYmFzZSkKIHsKLQlzaXplX3QgdF9zaXplID0gdHlwZS0+dHBfYmFzaWNzaXplOwotCXNpemVfdCBiX3NpemUgPSBiYXNlLT50cF9iYXNpY3NpemU7CisgICAgc2l6ZV90IHRfc2l6ZSA9IHR5cGUtPnRwX2Jhc2ljc2l6ZTsKKyAgICBzaXplX3QgYl9zaXplID0gYmFzZS0+dHBfYmFzaWNzaXplOwogCi0JYXNzZXJ0KHRfc2l6ZSA+PSBiX3NpemUpOyAvKiBFbHNlIHR5cGUgc21hbGxlciB0aGFuIGJhc2UhICovCi0JaWYgKHR5cGUtPnRwX2l0ZW1zaXplIHx8IGJhc2UtPnRwX2l0ZW1zaXplKSB7Ci0JCS8qIElmIGl0ZW1zaXplIGlzIGludm9sdmVkLCBzdHJpY3RlciBydWxlcyAqLwotCQlyZXR1cm4gdF9zaXplICE9IGJfc2l6ZSB8fAotCQkJdHlwZS0+dHBfaXRlbXNpemUgIT0gYmFzZS0+dHBfaXRlbXNpemU7Ci0JfQotCWlmICh0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiBiYXNlLT50cF93ZWFrbGlzdG9mZnNldCA9PSAwICYmCi0JICAgIHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICsgc2l6ZW9mKFB5T2JqZWN0ICopID09IHRfc2l6ZSAmJgotCSAgICB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCi0JCXRfc2l6ZSAtPSBzaXplb2YoUHlPYmplY3QgKik7Ci0JaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgJiYgYmFzZS0+dHBfZGljdG9mZnNldCA9PSAwICYmCi0JICAgIHR5cGUtPnRwX2RpY3RvZmZzZXQgKyBzaXplb2YoUHlPYmplY3QgKikgPT0gdF9zaXplICYmCi0JICAgIHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKLQkJdF9zaXplIC09IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICBhc3NlcnQodF9zaXplID49IGJfc2l6ZSk7IC8qIEVsc2UgdHlwZSBzbWFsbGVyIHRoYW4gYmFzZSEgKi8KKyAgICBpZiAodHlwZS0+dHBfaXRlbXNpemUgfHwgYmFzZS0+dHBfaXRlbXNpemUpIHsKKyAgICAgICAgLyogSWYgaXRlbXNpemUgaXMgaW52b2x2ZWQsIHN0cmljdGVyIHJ1bGVzICovCisgICAgICAgIHJldHVybiB0X3NpemUgIT0gYl9zaXplIHx8CisgICAgICAgICAgICB0eXBlLT50cF9pdGVtc2l6ZSAhPSBiYXNlLT50cF9pdGVtc2l6ZTsKKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmIGJhc2UtPnRwX3dlYWtsaXN0b2Zmc2V0ID09IDAgJiYKKyAgICAgICAgdHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgKyBzaXplb2YoUHlPYmplY3QgKikgPT0gdF9zaXplICYmCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKKyAgICAgICAgdF9zaXplIC09IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICBpZiAodHlwZS0+dHBfZGljdG9mZnNldCAmJiBiYXNlLT50cF9kaWN0b2Zmc2V0ID09IDAgJiYKKyAgICAgICAgdHlwZS0+dHBfZGljdG9mZnNldCArIHNpemVvZihQeU9iamVjdCAqKSA9PSB0X3NpemUgJiYKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQorICAgICAgICB0X3NpemUgLT0gc2l6ZW9mKFB5T2JqZWN0ICopOwogCi0JcmV0dXJuIHRfc2l6ZSAhPSBiX3NpemU7CisgICAgcmV0dXJuIHRfc2l6ZSAhPSBiX3NpemU7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKgogc29saWRfYmFzZShQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlUeXBlT2JqZWN0ICpiYXNlOworICAgIFB5VHlwZU9iamVjdCAqYmFzZTsKIAotCWlmICh0eXBlLT50cF9iYXNlKQotCQliYXNlID0gc29saWRfYmFzZSh0eXBlLT50cF9iYXNlKTsKLQllbHNlCi0JCWJhc2UgPSAmUHlCYXNlT2JqZWN0X1R5cGU7Ci0JaWYgKGV4dHJhX2l2YXJzKHR5cGUsIGJhc2UpKQotCQlyZXR1cm4gdHlwZTsKLQllbHNlCi0JCXJldHVybiBiYXNlOworICAgIGlmICh0eXBlLT50cF9iYXNlKQorICAgICAgICBiYXNlID0gc29saWRfYmFzZSh0eXBlLT50cF9iYXNlKTsKKyAgICBlbHNlCisgICAgICAgIGJhc2UgPSAmUHlCYXNlT2JqZWN0X1R5cGU7CisgICAgaWYgKGV4dHJhX2l2YXJzKHR5cGUsIGJhc2UpKQorICAgICAgICByZXR1cm4gdHlwZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBiYXNlOwogfQogCiBzdGF0aWMgdm9pZCBvYmplY3RfZGVhbGxvYyhQeU9iamVjdCAqKTsKQEAgLTE3NzksMTkxICsxNzc5LDE5MSBAQAogc3RhdGljIFB5VHlwZU9iamVjdCAqCiBnZXRfYnVpbHRpbl9iYXNlX3dpdGhfZGljdChQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0Jd2hpbGUgKHR5cGUtPnRwX2Jhc2UgIT0gTlVMTCkgewotCQlpZiAodHlwZS0+dHBfZGljdG9mZnNldCAhPSAwICYmCi0JCSAgICAhKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkpCi0JCQlyZXR1cm4gdHlwZTsKLQkJdHlwZSA9IHR5cGUtPnRwX2Jhc2U7Ci0JfQotCXJldHVybiBOVUxMOworICAgIHdoaWxlICh0eXBlLT50cF9iYXNlICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHR5cGUtPnRwX2RpY3RvZmZzZXQgIT0gMCAmJgorICAgICAgICAgICAgISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQorICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIHR5cGUgPSB0eXBlLT50cF9iYXNlOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9kaWN0X2Rlc2NyaXB0b3IoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCXN0YXRpYyBQeU9iamVjdCAqZGljdF9zdHI7Ci0JUHlPYmplY3QgKmRlc2NyOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGljdF9zdHI7CisgICAgUHlPYmplY3QgKmRlc2NyOwogCi0JaWYgKGRpY3Rfc3RyID09IE5VTEwpIHsKLQkJZGljdF9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2RpY3RfXyIpOwotCQlpZiAoZGljdF9zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlkZXNjciA9IF9QeVR5cGVfTG9va3VwKHR5cGUsIGRpY3Rfc3RyKTsKLQlpZiAoZGVzY3IgPT0gTlVMTCB8fCAhUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZGljdF9zdHIgPT0gTlVMTCkgeworICAgICAgICBkaWN0X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZGljdF9fIik7CisgICAgICAgIGlmIChkaWN0X3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHlwZSwgZGljdF9zdHIpOworICAgIGlmIChkZXNjciA9PSBOVUxMIHx8ICFQeURlc2NyX0lzRGF0YShkZXNjcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIGRlc2NyOworICAgIHJldHVybiBkZXNjcjsKIH0KIAogc3RhdGljIHZvaWQKIHJhaXNlX2RpY3RfZGVzY3JfZXJyb3IoUHlPYmplY3QgKm9iaikKIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJ0aGlzIF9fZGljdF9fIGRlc2NyaXB0b3IgZG9lcyBub3Qgc3VwcG9ydCAiCi0JCSAgICAgIiclLjIwMHMnIG9iamVjdHMiLCBvYmotPm9iX3R5cGUtPnRwX25hbWUpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJ0aGlzIF9fZGljdF9fIGRlc2NyaXB0b3IgZG9lcyBub3Qgc3VwcG9ydCAiCisgICAgICAgICAgICAgICAgICInJS4yMDBzJyBvYmplY3RzIiwgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN1YnR5cGVfZGljdChQeU9iamVjdCAqb2JqLCB2b2lkICpjb250ZXh0KQogewotCVB5T2JqZWN0ICoqZGljdHB0cjsKLQlQeU9iamVjdCAqZGljdDsKLQlQeVR5cGVPYmplY3QgKmJhc2U7CisgICAgUHlPYmplY3QgKipkaWN0cHRyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5VHlwZU9iamVjdCAqYmFzZTsKIAotCWJhc2UgPSBnZXRfYnVpbHRpbl9iYXNlX3dpdGhfZGljdChvYmotPm9iX3R5cGUpOwotCWlmIChiYXNlICE9IE5VTEwpIHsKLQkJZGVzY3JnZXRmdW5jIGZ1bmM7Ci0JCVB5T2JqZWN0ICpkZXNjciA9IGdldF9kaWN0X2Rlc2NyaXB0b3IoYmFzZSk7Ci0JCWlmIChkZXNjciA9PSBOVUxMKSB7Ci0JCQlyYWlzZV9kaWN0X2Rlc2NyX2Vycm9yKG9iaik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlmdW5jID0gZGVzY3ItPm9iX3R5cGUtPnRwX2Rlc2NyX2dldDsKLQkJaWYgKGZ1bmMgPT0gTlVMTCkgewotCQkJcmFpc2VfZGljdF9kZXNjcl9lcnJvcihvYmopOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJcmV0dXJuIGZ1bmMoZGVzY3IsIG9iaiwgKFB5T2JqZWN0ICopKG9iai0+b2JfdHlwZSkpOwotCX0KKyAgICBiYXNlID0gZ2V0X2J1aWx0aW5fYmFzZV93aXRoX2RpY3Qob2JqLT5vYl90eXBlKTsKKyAgICBpZiAoYmFzZSAhPSBOVUxMKSB7CisgICAgICAgIGRlc2NyZ2V0ZnVuYyBmdW5jOworICAgICAgICBQeU9iamVjdCAqZGVzY3IgPSBnZXRfZGljdF9kZXNjcmlwdG9yKGJhc2UpOworICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkgeworICAgICAgICAgICAgcmFpc2VfZGljdF9kZXNjcl9lcnJvcihvYmopOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZnVuYyA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9nZXQ7CisgICAgICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJhaXNlX2RpY3RfZGVzY3JfZXJyb3Iob2JqKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmdW5jKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKShvYmotPm9iX3R5cGUpKTsKKyAgICB9CiAKLQlkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIob2JqKTsKLQlpZiAoZGljdHB0ciA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkiVGhpcyBvYmplY3QgaGFzIG5vIF9fZGljdF9fIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlkaWN0ID0gKmRpY3RwdHI7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJKmRpY3RwdHIgPSBkaWN0ID0gUHlEaWN0X05ldygpOwotCVB5X1hJTkNSRUYoZGljdCk7Ci0JcmV0dXJuIGRpY3Q7CisgICAgZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKG9iaik7CisgICAgaWYgKGRpY3RwdHIgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBvYmplY3QgaGFzIG5vIF9fZGljdF9fIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWN0ID0gKmRpY3RwdHI7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgKmRpY3RwdHIgPSBkaWN0ID0gUHlEaWN0X05ldygpOworICAgIFB5X1hJTkNSRUYoZGljdCk7CisgICAgcmV0dXJuIGRpY3Q7CiB9CiAKIHN0YXRpYyBpbnQKIHN1YnR5cGVfc2V0ZGljdChQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7Ci0JUHlPYmplY3QgKipkaWN0cHRyOwotCVB5T2JqZWN0ICpkaWN0OwotCVB5VHlwZU9iamVjdCAqYmFzZTsKKyAgICBQeU9iamVjdCAqKmRpY3RwdHI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlUeXBlT2JqZWN0ICpiYXNlOwogCi0JYmFzZSA9IGdldF9idWlsdGluX2Jhc2Vfd2l0aF9kaWN0KG9iai0+b2JfdHlwZSk7Ci0JaWYgKGJhc2UgIT0gTlVMTCkgewotCQlkZXNjcnNldGZ1bmMgZnVuYzsKLQkJUHlPYmplY3QgKmRlc2NyID0gZ2V0X2RpY3RfZGVzY3JpcHRvcihiYXNlKTsKLQkJaWYgKGRlc2NyID09IE5VTEwpIHsKLQkJCXJhaXNlX2RpY3RfZGVzY3JfZXJyb3Iob2JqKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlmdW5jID0gZGVzY3ItPm9iX3R5cGUtPnRwX2Rlc2NyX3NldDsKLQkJaWYgKGZ1bmMgPT0gTlVMTCkgewotCQkJcmFpc2VfZGljdF9kZXNjcl9lcnJvcihvYmopOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiBmdW5jKGRlc2NyLCBvYmosIHZhbHVlKTsKLQl9CisgICAgYmFzZSA9IGdldF9idWlsdGluX2Jhc2Vfd2l0aF9kaWN0KG9iai0+b2JfdHlwZSk7CisgICAgaWYgKGJhc2UgIT0gTlVMTCkgeworICAgICAgICBkZXNjcnNldGZ1bmMgZnVuYzsKKyAgICAgICAgUHlPYmplY3QgKmRlc2NyID0gZ2V0X2RpY3RfZGVzY3JpcHRvcihiYXNlKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJhaXNlX2RpY3RfZGVzY3JfZXJyb3Iob2JqKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmdW5jID0gZGVzY3ItPm9iX3R5cGUtPnRwX2Rlc2NyX3NldDsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmFpc2VfZGljdF9kZXNjcl9lcnJvcihvYmopOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmdW5jKGRlc2NyLCBvYmosIHZhbHVlKTsKKyAgICB9CiAKLQlkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIob2JqKTsKLQlpZiAoZGljdHB0ciA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLQkJCQkiVGhpcyBvYmplY3QgaGFzIG5vIF9fZGljdF9fIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKHZhbHVlICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayh2YWx1ZSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIl9fZGljdF9fIG11c3QgYmUgc2V0IHRvIGEgZGljdGlvbmFyeSwgIgotCQkJICAgICAibm90IGEgJyUuMjAwcyciLCBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JZGljdCA9ICpkaWN0cHRyOwotCVB5X1hJTkNSRUYodmFsdWUpOwotCSpkaWN0cHRyID0gdmFsdWU7Ci0JUHlfWERFQ1JFRihkaWN0KTsKLQlyZXR1cm4gMDsKKyAgICBkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIob2JqKTsKKyAgICBpZiAoZGljdHB0ciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG9iamVjdCBoYXMgbm8gX19kaWN0X18iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAodmFsdWUgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIl9fZGljdF9fIG11c3QgYmUgc2V0IHRvIGEgZGljdGlvbmFyeSwgIgorICAgICAgICAgICAgICAgICAgICAgIm5vdCBhICclLjIwMHMnIiwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGRpY3QgPSAqZGljdHB0cjsKKyAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICAqZGljdHB0ciA9IHZhbHVlOworICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdWJ0eXBlX2dldHdlYWtyZWYoUHlPYmplY3QgKm9iaiwgdm9pZCAqY29udGV4dCkKIHsKLQlQeU9iamVjdCAqKndlYWtsaXN0cHRyOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKip3ZWFrbGlzdHB0cjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKFB5X1RZUEUob2JqKS0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0JCQkJIlRoaXMgb2JqZWN0IGhhcyBubyBfX3dlYWtyZWZfXyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXNzZXJ0KFB5X1RZUEUob2JqKS0+dHBfd2Vha2xpc3RvZmZzZXQgPiAwKTsKLQlhc3NlcnQoUHlfVFlQRShvYmopLT50cF93ZWFrbGlzdG9mZnNldCArIHNpemVvZihQeU9iamVjdCAqKSA8PQotCSAgICAgICAoc2l6ZV90KShQeV9UWVBFKG9iaiktPnRwX2Jhc2ljc2l6ZSkpOwotCXdlYWtsaXN0cHRyID0gKFB5T2JqZWN0ICoqKQotCQkoKGNoYXIgKilvYmogKyBQeV9UWVBFKG9iaiktPnRwX3dlYWtsaXN0b2Zmc2V0KTsKLQlpZiAoKndlYWtsaXN0cHRyID09IE5VTEwpCi0JCXJlc3VsdCA9IFB5X05vbmU7Ci0JZWxzZQotCQlyZXN1bHQgPSAqd2Vha2xpc3RwdHI7Ci0JUHlfSU5DUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoUHlfVFlQRShvYmopLT50cF93ZWFrbGlzdG9mZnNldCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG9iamVjdCBoYXMgbm8gX193ZWFrcmVmX18iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydChQeV9UWVBFKG9iaiktPnRwX3dlYWtsaXN0b2Zmc2V0ID4gMCk7CisgICAgYXNzZXJ0KFB5X1RZUEUob2JqKS0+dHBfd2Vha2xpc3RvZmZzZXQgKyBzaXplb2YoUHlPYmplY3QgKikgPD0KKyAgICAgICAgICAgKHNpemVfdCkoUHlfVFlQRShvYmopLT50cF9iYXNpY3NpemUpKTsKKyAgICB3ZWFrbGlzdHB0ciA9IChQeU9iamVjdCAqKikKKyAgICAgICAgKChjaGFyICopb2JqICsgUHlfVFlQRShvYmopLT50cF93ZWFrbGlzdG9mZnNldCk7CisgICAgaWYgKCp3ZWFrbGlzdHB0ciA9PSBOVUxMKQorICAgICAgICByZXN1bHQgPSBQeV9Ob25lOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gKndlYWtsaXN0cHRyOworICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIFRocmVlIHZhcmlhbnRzIG9uIHRoZSBzdWJ0eXBlX2dldHNldHMgbGlzdC4gKi8KIAogc3RhdGljIFB5R2V0U2V0RGVmIHN1YnR5cGVfZ2V0c2V0c19mdWxsW10gPSB7Ci0JeyJfX2RpY3RfXyIsIHN1YnR5cGVfZGljdCwgc3VidHlwZV9zZXRkaWN0LAotCSBQeURvY19TVFIoImRpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZCkiKX0sCi0JeyJfX3dlYWtyZWZfXyIsIHN1YnR5cGVfZ2V0d2Vha3JlZiwgTlVMTCwKLQkgUHlEb2NfU1RSKCJsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IChpZiBkZWZpbmVkKSIpfSwKLQl7MH0KKyAgICB7Il9fZGljdF9fIiwgc3VidHlwZV9kaWN0LCBzdWJ0eXBlX3NldGRpY3QsCisgICAgIFB5RG9jX1NUUigiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKSIpfSwKKyAgICB7Il9fd2Vha3JlZl9fIiwgc3VidHlwZV9nZXR3ZWFrcmVmLCBOVUxMLAorICAgICBQeURvY19TVFIoImxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QgKGlmIGRlZmluZWQpIil9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5R2V0U2V0RGVmIHN1YnR5cGVfZ2V0c2V0c19kaWN0X29ubHlbXSA9IHsKLQl7Il9fZGljdF9fIiwgc3VidHlwZV9kaWN0LCBzdWJ0eXBlX3NldGRpY3QsCi0JIFB5RG9jX1NUUigiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKSIpfSwKLQl7MH0KKyAgICB7Il9fZGljdF9fIiwgc3VidHlwZV9kaWN0LCBzdWJ0eXBlX3NldGRpY3QsCisgICAgIFB5RG9jX1NUUigiZGljdGlvbmFyeSBmb3IgaW5zdGFuY2UgdmFyaWFibGVzIChpZiBkZWZpbmVkKSIpfSwKKyAgICB7MH0KIH07CiAKIHN0YXRpYyBQeUdldFNldERlZiBzdWJ0eXBlX2dldHNldHNfd2Vha3JlZl9vbmx5W10gPSB7Ci0JeyJfX3dlYWtyZWZfXyIsIHN1YnR5cGVfZ2V0d2Vha3JlZiwgTlVMTCwKLQkgUHlEb2NfU1RSKCJsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IChpZiBkZWZpbmVkKSIpfSwKLQl7MH0KKyAgICB7Il9fd2Vha3JlZl9fIiwgc3VidHlwZV9nZXR3ZWFrcmVmLCBOVUxMLAorICAgICBQeURvY19TVFIoImxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QgKGlmIGRlZmluZWQpIil9LAorICAgIHswfQogfTsKIAogc3RhdGljIGludAogdmFsaWRfaWRlbnRpZmllcihQeU9iamVjdCAqcykKIHsKLQl1bnNpZ25lZCBjaGFyICpwOwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCWlmICghUHlTdHJpbmdfQ2hlY2socykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIl9fc2xvdHNfXyBpdGVtcyBtdXN0IGJlIHN0cmluZ3MsIG5vdCAnJS4yMDBzJyIsCi0JCQkgICAgIFB5X1RZUEUocyktPnRwX25hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcCA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzKTsKLQluID0gUHlTdHJpbmdfR0VUX1NJWkUocyk7Ci0JLyogV2UgbXVzdCByZWplY3QgYW4gZW1wdHkgbmFtZS4gIEFzIGEgaGFjaywgd2UgYnVtcCB0aGUKLQkgICBsZW5ndGggdG8gMSBzbyB0aGF0IHRoZSBsb29wIHdpbGwgYmFsayBvbiB0aGUgdHJhaWxpbmcgXDAuICovCi0JaWYgKG4gPT0gMCkKLQkJbiA9IDE7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKywgcCsrKSB7Ci0JCWlmICghKGkgPT0gMCA/IGlzYWxwaGEoKnApIDogaXNhbG51bSgqcCkpICYmICpwICE9ICdfJykgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIl9fc2xvdHNfXyBtdXN0IGJlIGlkZW50aWZpZXJzIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHMpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19zbG90c19fIGl0ZW1zIG11c3QgYmUgc3RyaW5ncywgbm90ICclLjIwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUocyktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIFB5U3RyaW5nX0FTX1NUUklORyhzKTsKKyAgICBuID0gUHlTdHJpbmdfR0VUX1NJWkUocyk7CisgICAgLyogV2UgbXVzdCByZWplY3QgYW4gZW1wdHkgbmFtZS4gIEFzIGEgaGFjaywgd2UgYnVtcCB0aGUKKyAgICAgICBsZW5ndGggdG8gMSBzbyB0aGF0IHRoZSBsb29wIHdpbGwgYmFsayBvbiB0aGUgdHJhaWxpbmcgXDAuICovCisgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgbiA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKywgcCsrKSB7CisgICAgICAgIGlmICghKGkgPT0gMCA/IGlzYWxwaGEoKnApIDogaXNhbG51bSgqcCkpICYmICpwICE9ICdfJykgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19zbG90c19fIG11c3QgYmUgaWRlbnRpZmllcnMiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQpAQCAtMTk3MiwzMyArMTk3MiwzMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF91bmljb2RlX3RvX3N0cmluZyhQeU9iamVjdCAqc2xvdHMsIFB5X3NzaXplX3QgbnNsb3RzKQogewotCVB5T2JqZWN0ICp0bXAgPSBOVUxMOwotCVB5T2JqZWN0ICpzbG90X25hbWUsICpuZXdfbmFtZTsKLQlQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKnRtcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnNsb3RfbmFtZSwgKm5ld19uYW1lOworICAgIFB5X3NzaXplX3QgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBuc2xvdHM7IGkrKykgewotCQlpZiAoUHlVbmljb2RlX0NoZWNrKHNsb3RfbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oc2xvdHMsIGkpKSkgewotCQkJaWYgKHRtcCA9PSBOVUxMKSB7Ci0JCQkJdG1wID0gUHlTZXF1ZW5jZV9MaXN0KHNsb3RzKTsKLQkJCQlpZiAodG1wID09IE5VTEwpCi0JCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJbmV3X25hbWUgPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcoc2xvdF9uYW1lLAotCQkJCQkJCQkgICAgIE5VTEwpOwotCQkJaWYgKG5ld19uYW1lID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYodG1wKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCVB5X0lOQ1JFRihuZXdfbmFtZSk7Ci0JCQlQeUxpc3RfU0VUX0lURU0odG1wLCBpLCBuZXdfbmFtZSk7Ci0JCQlQeV9ERUNSRUYoc2xvdF9uYW1lKTsKLQkJfQotCX0KLQlpZiAodG1wICE9IE5VTEwpIHsKLQkJc2xvdHMgPSBQeUxpc3RfQXNUdXBsZSh0bXApOwotCQlQeV9ERUNSRUYodG1wKTsKLQl9Ci0JcmV0dXJuIHNsb3RzOworICAgIGZvciAoaSA9IDA7IGkgPCBuc2xvdHM7IGkrKykgeworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHNsb3RfbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oc2xvdHMsIGkpKSkgeworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdG1wID0gUHlTZXF1ZW5jZV9MaXN0KHNsb3RzKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3X25hbWUgPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcoc2xvdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBpZiAobmV3X25hbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfSU5DUkVGKG5ld19uYW1lKTsKKyAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTSh0bXAsIGksIG5ld19uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzbG90X25hbWUpOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0bXAgIT0gTlVMTCkgeworICAgICAgICBzbG90cyA9IFB5TGlzdF9Bc1R1cGxlKHRtcCk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgIH0KKyAgICByZXR1cm4gc2xvdHM7CiB9CiAjZW5kaWYKIApAQCAtMjAwOSw0NDggKzIwMDksNDQ4IEBACiBzdGF0aWMgaW50CiB0eXBlX2luaXQoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWludCByZXM7CisgICAgaW50IHJlczsKIAotCWFzc2VydChhcmdzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JYXNzZXJ0KGt3ZHMgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa3dkcykpOworICAgIGFzc2VydChhcmdzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgYXNzZXJ0KGt3ZHMgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa3dkcykpOwogCi0JaWYgKGt3ZHMgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgIT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ0eXBlLl9faW5pdF9fKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHMiKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoa3dkcyAhPSBOVUxMICYmIFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSAhPSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidHlwZS5fX2luaXRfXygpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQlpZiAoYXJncyAhPSBOVUxMICYmIFB5VHVwbGVfQ2hlY2soYXJncykgJiYKLQkgICAgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgIT0gMSAmJiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IDMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInR5cGUuX19pbml0X18oKSB0YWtlcyAxIG9yIDMgYXJndW1lbnRzIik7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpICYmCisgICAgICAgIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpICE9IDEgJiYgUHlUdXBsZV9HRVRfU0laRShhcmdzKSAhPSAzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUuX19pbml0X18oKSB0YWtlcyAxIG9yIDMgYXJndW1lbnRzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLQkvKiBDYWxsIG9iamVjdC5fX2luaXRfXyhzZWxmKSBub3cuICovCi0JLyogWFhYIENvdWxkIGNhbGwgc3VwZXIodHlwZSwgY2xzKS5fX2luaXRfXygpIGJ1dCB3aGF0J3MgdGhlIHBvaW50PyAqLwotCWFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDAsIDApOwotCXJlcyA9IG9iamVjdF9pbml0KGNscywgYXJncywgTlVMTCk7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCXJldHVybiByZXM7CisgICAgLyogQ2FsbCBvYmplY3QuX19pbml0X18oc2VsZikgbm93LiAqLworICAgIC8qIFhYWCBDb3VsZCBjYWxsIHN1cGVyKHR5cGUsIGNscykuX19pbml0X18oKSBidXQgd2hhdCdzIHRoZSBwb2ludD8gKi8KKyAgICBhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAwLCAwKTsKKyAgICByZXMgPSBvYmplY3RfaW5pdChjbHMsIGFyZ3MsIE5VTEwpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9uZXcoUHlUeXBlT2JqZWN0ICptZXRhdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpuYW1lLCAqYmFzZXMsICpkaWN0OwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJiYXNlcyIsICJkaWN0IiwgMH07Ci0JUHlPYmplY3QgKnNsb3RzLCAqdG1wLCAqbmV3c2xvdHM7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlLCAqYmFzZSwgKnRtcHR5cGUsICp3aW5uZXI7Ci0JUHlIZWFwVHlwZU9iamVjdCAqZXQ7Ci0JUHlNZW1iZXJEZWYgKm1wOwotCVB5X3NzaXplX3QgaSwgbmJhc2VzLCBuc2xvdHMsIHNsb3RvZmZzZXQsIGFkZF9kaWN0LCBhZGRfd2VhazsKLQlpbnQgaiwgbWF5X2FkZF9kaWN0LCBtYXlfYWRkX3dlYWs7CisgICAgUHlPYmplY3QgKm5hbWUsICpiYXNlcywgKmRpY3Q7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgImJhc2VzIiwgImRpY3QiLCAwfTsKKyAgICBQeU9iamVjdCAqc2xvdHMsICp0bXAsICpuZXdzbG90czsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGUsICpiYXNlLCAqdG1wdHlwZSwgKndpbm5lcjsKKyAgICBQeUhlYXBUeXBlT2JqZWN0ICpldDsKKyAgICBQeU1lbWJlckRlZiAqbXA7CisgICAgUHlfc3NpemVfdCBpLCBuYmFzZXMsIG5zbG90cywgc2xvdG9mZnNldCwgYWRkX2RpY3QsIGFkZF93ZWFrOworICAgIGludCBqLCBtYXlfYWRkX2RpY3QsIG1heV9hZGRfd2VhazsKIAotCWFzc2VydChhcmdzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdzKSk7Ci0JYXNzZXJ0KGt3ZHMgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa3dkcykpOworICAgIGFzc2VydChhcmdzICE9IE5VTEwgJiYgUHlUdXBsZV9DaGVjayhhcmdzKSk7CisgICAgYXNzZXJ0KGt3ZHMgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa3dkcykpOwogCi0JLyogU3BlY2lhbCBjYXNlOiB0eXBlKHgpIHNob3VsZCByZXR1cm4geC0+b2JfdHlwZSAqLwotCXsKLQkJY29uc3QgUHlfc3NpemVfdCBuYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JCWNvbnN0IFB5X3NzaXplX3Qgbmt3ZHMgPSBrd2RzID09IE5VTEwgPyAwIDogUHlEaWN0X1NpemUoa3dkcyk7CisgICAgLyogU3BlY2lhbCBjYXNlOiB0eXBlKHgpIHNob3VsZCByZXR1cm4geC0+b2JfdHlwZSAqLworICAgIHsKKyAgICAgICAgY29uc3QgUHlfc3NpemVfdCBuYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgICAgIGNvbnN0IFB5X3NzaXplX3Qgbmt3ZHMgPSBrd2RzID09IE5VTEwgPyAwIDogUHlEaWN0X1NpemUoa3dkcyk7CiAKLQkJaWYgKFB5VHlwZV9DaGVja0V4YWN0KG1ldGF0eXBlKSAmJiBuYXJncyA9PSAxICYmIG5rd2RzID09IDApIHsKLQkJCVB5T2JqZWN0ICp4ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQkJCVB5X0lOQ1JFRihQeV9UWVBFKHgpKTsKLQkJCXJldHVybiAoUHlPYmplY3QgKikgUHlfVFlQRSh4KTsKLQkJfQorICAgICAgICBpZiAoUHlUeXBlX0NoZWNrRXhhY3QobWV0YXR5cGUpICYmIG5hcmdzID09IDEgJiYgbmt3ZHMgPT0gMCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnggPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X1RZUEUoeCkpOworICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKSBQeV9UWVBFKHgpOworICAgICAgICB9CiAKLQkJLyogU0YgYnVnIDQ3NTMyNyAtLSBpZiB0aGF0IGRpZG4ndCB0cmlnZ2VyLCB3ZSBuZWVkIDMKLQkJICAgYXJndW1lbnRzLiBidXQgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzIGJlbG93IG1heSBnaXZlCi0JCSAgIGEgbXNnIHNheWluZyB0eXBlKCkgbmVlZHMgZXhhY3RseSAzLiAqLwotCQlpZiAobmFyZ3MgKyBua3dkcyAhPSAzKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkidHlwZSgpIHRha2VzIDEgb3IgMyBhcmd1bWVudHMiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgICAgICAvKiBTRiBidWcgNDc1MzI3IC0tIGlmIHRoYXQgZGlkbid0IHRyaWdnZXIsIHdlIG5lZWQgMworICAgICAgICAgICBhcmd1bWVudHMuIGJ1dCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMgYmVsb3cgbWF5IGdpdmUKKyAgICAgICAgICAgYSBtc2cgc2F5aW5nIHR5cGUoKSBuZWVkcyBleGFjdGx5IDMuICovCisgICAgICAgIGlmIChuYXJncyArIG5rd2RzICE9IDMpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUoKSB0YWtlcyAxIG9yIDMgYXJndW1lbnRzIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIENoZWNrIGFyZ3VtZW50czogKG5hbWUsIGJhc2VzLCBkaWN0KSAqLwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJTTyFPITp0eXBlIiwga3dsaXN0LAotCQkJCQkgJm5hbWUsCi0JCQkJCSAmUHlUdXBsZV9UeXBlLCAmYmFzZXMsCi0JCQkJCSAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogQ2hlY2sgYXJndW1lbnRzOiAobmFtZSwgYmFzZXMsIGRpY3QpICovCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIlNPIU8hOnR5cGUiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlB5VHVwbGVfVHlwZSwgJmJhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIERldGVybWluZSB0aGUgcHJvcGVyIG1ldGF0eXBlIHRvIGRlYWwgd2l0aCB0aGlzLAotCSAgIGFuZCBjaGVjayBmb3IgbWV0YXR5cGUgY29uZmxpY3RzIHdoaWxlIHdlJ3JlIGF0IGl0LgotCSAgIE5vdGUgdGhhdCBpZiBzb21lIG90aGVyIG1ldGF0eXBlIHdpbnMgdG8gY29udHJhY3QsCi0JICAgaXQncyBwb3NzaWJsZSB0aGF0IGl0cyBpbnN0YW5jZXMgYXJlIG5vdCB0eXBlcy4gKi8KLQluYmFzZXMgPSBQeVR1cGxlX0dFVF9TSVpFKGJhc2VzKTsKLQl3aW5uZXIgPSBtZXRhdHlwZTsKLQlmb3IgKGkgPSAwOyBpIDwgbmJhc2VzOyBpKyspIHsKLQkJdG1wID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgaSk7Ci0JCXRtcHR5cGUgPSB0bXAtPm9iX3R5cGU7Ci0JCWlmICh0bXB0eXBlID09ICZQeUNsYXNzX1R5cGUpCi0JCQljb250aW51ZTsgLyogU3BlY2lhbCBjYXNlIGNsYXNzaWMgY2xhc3NlcyAqLwotCQlpZiAoUHlUeXBlX0lzU3VidHlwZSh3aW5uZXIsIHRtcHR5cGUpKQotCQkJY29udGludWU7Ci0JCWlmIChQeVR5cGVfSXNTdWJ0eXBlKHRtcHR5cGUsIHdpbm5lcikpIHsKLQkJCXdpbm5lciA9IHRtcHR5cGU7Ci0JCQljb250aW51ZTsKLQkJfQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJtZXRhY2xhc3MgY29uZmxpY3Q6ICIKLQkJCQkidGhlIG1ldGFjbGFzcyBvZiBhIGRlcml2ZWQgY2xhc3MgIgotCQkJCSJtdXN0IGJlIGEgKG5vbi1zdHJpY3QpIHN1YmNsYXNzICIKLQkJCQkib2YgdGhlIG1ldGFjbGFzc2VzIG9mIGFsbCBpdHMgYmFzZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh3aW5uZXIgIT0gbWV0YXR5cGUpIHsKLQkJaWYgKHdpbm5lci0+dHBfbmV3ICE9IHR5cGVfbmV3KSAvKiBQYXNzIGl0IHRvIHRoZSB3aW5uZXIgKi8KLQkJCXJldHVybiB3aW5uZXItPnRwX25ldyh3aW5uZXIsIGFyZ3MsIGt3ZHMpOwotCQltZXRhdHlwZSA9IHdpbm5lcjsKLQl9CisgICAgLyogRGV0ZXJtaW5lIHRoZSBwcm9wZXIgbWV0YXR5cGUgdG8gZGVhbCB3aXRoIHRoaXMsCisgICAgICAgYW5kIGNoZWNrIGZvciBtZXRhdHlwZSBjb25mbGljdHMgd2hpbGUgd2UncmUgYXQgaXQuCisgICAgICAgTm90ZSB0aGF0IGlmIHNvbWUgb3RoZXIgbWV0YXR5cGUgd2lucyB0byBjb250cmFjdCwKKyAgICAgICBpdCdzIHBvc3NpYmxlIHRoYXQgaXRzIGluc3RhbmNlcyBhcmUgbm90IHR5cGVzLiAqLworICAgIG5iYXNlcyA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOworICAgIHdpbm5lciA9IG1ldGF0eXBlOworICAgIGZvciAoaSA9IDA7IGkgPCBuYmFzZXM7IGkrKykgeworICAgICAgICB0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgdG1wdHlwZSA9IHRtcC0+b2JfdHlwZTsKKyAgICAgICAgaWYgKHRtcHR5cGUgPT0gJlB5Q2xhc3NfVHlwZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBTcGVjaWFsIGNhc2UgY2xhc3NpYyBjbGFzc2VzICovCisgICAgICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKHdpbm5lciwgdG1wdHlwZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKFB5VHlwZV9Jc1N1YnR5cGUodG1wdHlwZSwgd2lubmVyKSkgeworICAgICAgICAgICAgd2lubmVyID0gdG1wdHlwZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWV0YWNsYXNzIGNvbmZsaWN0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAidGhlIG1ldGFjbGFzcyBvZiBhIGRlcml2ZWQgY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgYSAobm9uLXN0cmljdCkgc3ViY2xhc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHRoZSBtZXRhY2xhc3NlcyBvZiBhbGwgaXRzIGJhc2VzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAod2lubmVyICE9IG1ldGF0eXBlKSB7CisgICAgICAgIGlmICh3aW5uZXItPnRwX25ldyAhPSB0eXBlX25ldykgLyogUGFzcyBpdCB0byB0aGUgd2lubmVyICovCisgICAgICAgICAgICByZXR1cm4gd2lubmVyLT50cF9uZXcod2lubmVyLCBhcmdzLCBrd2RzKTsKKyAgICAgICAgbWV0YXR5cGUgPSB3aW5uZXI7CisgICAgfQogCi0JLyogQWRqdXN0IGZvciBlbXB0eSB0dXBsZSBiYXNlcyAqLwotCWlmIChuYmFzZXMgPT0gMCkgewotCQliYXNlcyA9IFB5VHVwbGVfUGFjaygxLCAmUHlCYXNlT2JqZWN0X1R5cGUpOwotCQlpZiAoYmFzZXMgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQluYmFzZXMgPSAxOwotCX0KLQllbHNlCi0JCVB5X0lOQ1JFRihiYXNlcyk7CisgICAgLyogQWRqdXN0IGZvciBlbXB0eSB0dXBsZSBiYXNlcyAqLworICAgIGlmIChuYmFzZXMgPT0gMCkgeworICAgICAgICBiYXNlcyA9IFB5VHVwbGVfUGFjaygxLCAmUHlCYXNlT2JqZWN0X1R5cGUpOworICAgICAgICBpZiAoYmFzZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBuYmFzZXMgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRihiYXNlcyk7CiAKLQkvKiBYWFggRnJvbSBoZXJlIHVudGlsIHR5cGUgaXMgYWxsb2NhdGVkLCAicmV0dXJuIE5VTEwiIGxlYWtzIGJhc2VzISAqLworICAgIC8qIFhYWCBGcm9tIGhlcmUgdW50aWwgdHlwZSBpcyBhbGxvY2F0ZWQsICJyZXR1cm4gTlVMTCIgbGVha3MgYmFzZXMhICovCiAKLQkvKiBDYWxjdWxhdGUgYmVzdCBiYXNlLCBhbmQgY2hlY2sgdGhhdCBhbGwgYmFzZXMgYXJlIHR5cGUgb2JqZWN0cyAqLwotCWJhc2UgPSBiZXN0X2Jhc2UoYmFzZXMpOwotCWlmIChiYXNlID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlUeXBlX0hhc0ZlYXR1cmUoYmFzZSwgUHlfVFBGTEFHU19CQVNFVFlQRSkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgInR5cGUgJyUuMTAwcycgaXMgbm90IGFuIGFjY2VwdGFibGUgYmFzZSB0eXBlIiwKLQkJCSAgICAgYmFzZS0+dHBfbmFtZSk7Ci0JCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBDYWxjdWxhdGUgYmVzdCBiYXNlLCBhbmQgY2hlY2sgdGhhdCBhbGwgYmFzZXMgYXJlIHR5cGUgb2JqZWN0cyAqLworICAgIGJhc2UgPSBiZXN0X2Jhc2UoYmFzZXMpOworICAgIGlmIChiYXNlID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlUeXBlX0hhc0ZlYXR1cmUoYmFzZSwgUHlfVFBGTEFHU19CQVNFVFlQRSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ0eXBlICclLjEwMHMnIGlzIG5vdCBhbiBhY2NlcHRhYmxlIGJhc2UgdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICBiYXNlLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogQ2hlY2sgZm9yIGEgX19zbG90c19fIHNlcXVlbmNlIHZhcmlhYmxlIGluIGRpY3QsIGFuZCBjb3VudCBpdCAqLwotCXNsb3RzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fc2xvdHNfXyIpOwotCW5zbG90cyA9IDA7Ci0JYWRkX2RpY3QgPSAwOwotCWFkZF93ZWFrID0gMDsKLQltYXlfYWRkX2RpY3QgPSBiYXNlLT50cF9kaWN0b2Zmc2V0ID09IDA7Ci0JbWF5X2FkZF93ZWFrID0gYmFzZS0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gMCAmJiBiYXNlLT50cF9pdGVtc2l6ZSA9PSAwOwotCWlmIChzbG90cyA9PSBOVUxMKSB7Ci0JCWlmIChtYXlfYWRkX2RpY3QpIHsKLQkJCWFkZF9kaWN0Kys7Ci0JCX0KLQkJaWYgKG1heV9hZGRfd2VhaykgewotCQkJYWRkX3dlYWsrKzsKLQkJfQotCX0KLQllbHNlIHsKLQkJLyogSGF2ZSBzbG90cyAqLworICAgIC8qIENoZWNrIGZvciBhIF9fc2xvdHNfXyBzZXF1ZW5jZSB2YXJpYWJsZSBpbiBkaWN0LCBhbmQgY291bnQgaXQgKi8KKyAgICBzbG90cyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX3Nsb3RzX18iKTsKKyAgICBuc2xvdHMgPSAwOworICAgIGFkZF9kaWN0ID0gMDsKKyAgICBhZGRfd2VhayA9IDA7CisgICAgbWF5X2FkZF9kaWN0ID0gYmFzZS0+dHBfZGljdG9mZnNldCA9PSAwOworICAgIG1heV9hZGRfd2VhayA9IGJhc2UtPnRwX3dlYWtsaXN0b2Zmc2V0ID09IDAgJiYgYmFzZS0+dHBfaXRlbXNpemUgPT0gMDsKKyAgICBpZiAoc2xvdHMgPT0gTlVMTCkgeworICAgICAgICBpZiAobWF5X2FkZF9kaWN0KSB7CisgICAgICAgICAgICBhZGRfZGljdCsrOworICAgICAgICB9CisgICAgICAgIGlmIChtYXlfYWRkX3dlYWspIHsKKyAgICAgICAgICAgIGFkZF93ZWFrKys7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIEhhdmUgc2xvdHMgKi8KIAotCQkvKiBNYWtlIGl0IGludG8gYSB0dXBsZSAqLwotCQlpZiAoUHlTdHJpbmdfQ2hlY2soc2xvdHMpIHx8IFB5VW5pY29kZV9DaGVjayhzbG90cykpCi0JCQlzbG90cyA9IFB5VHVwbGVfUGFjaygxLCBzbG90cyk7Ci0JCWVsc2UKLQkJCXNsb3RzID0gUHlTZXF1ZW5jZV9UdXBsZShzbG90cyk7Ci0JCWlmIChzbG90cyA9PSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoYmFzZXMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJYXNzZXJ0KFB5VHVwbGVfQ2hlY2soc2xvdHMpKTsKKyAgICAgICAgLyogTWFrZSBpdCBpbnRvIGEgdHVwbGUgKi8KKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHNsb3RzKSB8fCBQeVVuaWNvZGVfQ2hlY2soc2xvdHMpKQorICAgICAgICAgICAgc2xvdHMgPSBQeVR1cGxlX1BhY2soMSwgc2xvdHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzbG90cyA9IFB5U2VxdWVuY2VfVHVwbGUoc2xvdHMpOworICAgICAgICBpZiAoc2xvdHMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKHNsb3RzKSk7CiAKLQkJLyogQXJlIHNsb3RzIGFsbG93ZWQ/ICovCi0JCW5zbG90cyA9IFB5VHVwbGVfR0VUX1NJWkUoc2xvdHMpOwotCQlpZiAobnNsb3RzID4gMCAmJiBiYXNlLT50cF9pdGVtc2l6ZSAhPSAwKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgIm5vbmVtcHR5IF9fc2xvdHNfXyAiCi0JCQkJICAgICAibm90IHN1cHBvcnRlZCBmb3Igc3VidHlwZSBvZiAnJXMnIiwKLQkJCQkgICAgIGJhc2UtPnRwX25hbWUpOwotCQkgIGJhZF9zbG90czoKLQkJCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCQlQeV9ERUNSRUYoc2xvdHMpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgLyogQXJlIHNsb3RzIGFsbG93ZWQ/ICovCisgICAgICAgIG5zbG90cyA9IFB5VHVwbGVfR0VUX1NJWkUoc2xvdHMpOworICAgICAgICBpZiAobnNsb3RzID4gMCAmJiBiYXNlLT50cF9pdGVtc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJub25lbXB0eSBfX3Nsb3RzX18gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJub3Qgc3VwcG9ydGVkIGZvciBzdWJ0eXBlIG9mICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPnRwX25hbWUpOworICAgICAgICAgIGJhZF9zbG90czoKKyAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2xvdHMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJdG1wID0gX3VuaWNvZGVfdG9fc3RyaW5nKHNsb3RzLCBuc2xvdHMpOwotCQlpZiAodG1wID09IE5VTEwpCi0JCQlnb3RvIGJhZF9zbG90czsKLQkJaWYgKHRtcCAhPSBzbG90cykgewotCQkJUHlfREVDUkVGKHNsb3RzKTsKLQkJCXNsb3RzID0gdG1wOwotCQl9CisgICAgICAgIHRtcCA9IF91bmljb2RlX3RvX3N0cmluZyhzbG90cywgbnNsb3RzKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBiYWRfc2xvdHM7CisgICAgICAgIGlmICh0bXAgIT0gc2xvdHMpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzbG90cyk7CisgICAgICAgICAgICBzbG90cyA9IHRtcDsKKyAgICAgICAgfQogI2VuZGlmCi0JCS8qIENoZWNrIGZvciB2YWxpZCBzbG90IG5hbWVzIGFuZCB0d28gc3BlY2lhbCBjYXNlcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbnNsb3RzOyBpKyspIHsKLQkJCVB5T2JqZWN0ICp0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKHNsb3RzLCBpKTsKLQkJCWNoYXIgKnM7Ci0JCQlpZiAoIXZhbGlkX2lkZW50aWZpZXIodG1wKSkKLQkJCQlnb3RvIGJhZF9zbG90czsKLQkJCWFzc2VydChQeVN0cmluZ19DaGVjayh0bXApKTsKLQkJCXMgPSBQeVN0cmluZ19BU19TVFJJTkcodG1wKTsKLQkJCWlmIChzdHJjbXAocywgIl9fZGljdF9fIikgPT0gMCkgewotCQkJCWlmICghbWF5X2FkZF9kaWN0IHx8IGFkZF9kaWN0KSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkiX19kaWN0X18gc2xvdCBkaXNhbGxvd2VkOiAiCi0JCQkJCQkid2UgYWxyZWFkeSBnb3Qgb25lIik7Ci0JCQkJCWdvdG8gYmFkX3Nsb3RzOwotCQkJCX0KLQkJCQlhZGRfZGljdCsrOwotCQkJfQotCQkJaWYgKHN0cmNtcChzLCAiX193ZWFrcmVmX18iKSA9PSAwKSB7Ci0JCQkJaWYgKCFtYXlfYWRkX3dlYWsgfHwgYWRkX3dlYWspIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJfX3dlYWtyZWZfXyBzbG90IGRpc2FsbG93ZWQ6ICIKLQkJCQkJCSJlaXRoZXIgd2UgYWxyZWFkeSBnb3Qgb25lLCAiCi0JCQkJCQkib3IgX19pdGVtc2l6ZV9fICE9IDAiKTsKLQkJCQkJZ290byBiYWRfc2xvdHM7Ci0JCQkJfQotCQkJCWFkZF93ZWFrKys7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLyogQ2hlY2sgZm9yIHZhbGlkIHNsb3QgbmFtZXMgYW5kIHR3byBzcGVjaWFsIGNhc2VzICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuc2xvdHM7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKnRtcCA9IFB5VHVwbGVfR0VUX0lURU0oc2xvdHMsIGkpOworICAgICAgICAgICAgY2hhciAqczsKKyAgICAgICAgICAgIGlmICghdmFsaWRfaWRlbnRpZmllcih0bXApKQorICAgICAgICAgICAgICAgIGdvdG8gYmFkX3Nsb3RzOworICAgICAgICAgICAgYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHRtcCkpOworICAgICAgICAgICAgcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0bXApOworICAgICAgICAgICAgaWYgKHN0cmNtcChzLCAiX19kaWN0X18iKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtYXlfYWRkX2RpY3QgfHwgYWRkX2RpY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2RpY3RfXyBzbG90IGRpc2FsbG93ZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3ZSBhbHJlYWR5IGdvdCBvbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfc2xvdHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZF9kaWN0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyY21wKHMsICJfX3dlYWtyZWZfXyIpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1heV9hZGRfd2VhayB8fCBhZGRfd2VhaykgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fd2Vha3JlZl9fIHNsb3QgZGlzYWxsb3dlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgImVpdGhlciB3ZSBhbHJlYWR5IGdvdCBvbmUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvciBfX2l0ZW1zaXplX18gIT0gMCIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZF9zbG90czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkX3dlYWsrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8qIENvcHkgc2xvdHMgaW50byBhIGxpc3QsIG1hbmdsZSBuYW1lcyBhbmQgc29ydCB0aGVtLgotCQkgICBTb3J0ZWQgbmFtZXMgYXJlIG5lZWRlZCBmb3IgX19jbGFzc19fIGFzc2lnbm1lbnQuCi0JCSAgIENvbnZlcnQgdGhlbSBiYWNrIHRvIHR1cGxlIGF0IHRoZSBlbmQuCi0JCSovCi0JCW5ld3Nsb3RzID0gUHlMaXN0X05ldyhuc2xvdHMgLSBhZGRfZGljdCAtIGFkZF93ZWFrKTsKLQkJaWYgKG5ld3Nsb3RzID09IE5VTEwpCi0JCQlnb3RvIGJhZF9zbG90czsKLQkJZm9yIChpID0gaiA9IDA7IGkgPCBuc2xvdHM7IGkrKykgewotCQkJY2hhciAqczsKLQkJCXRtcCA9IFB5VHVwbGVfR0VUX0lURU0oc2xvdHMsIGkpOwotCQkJcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0bXApOwotCQkJaWYgKChhZGRfZGljdCAmJiBzdHJjbXAocywgIl9fZGljdF9fIikgPT0gMCkgfHwKLQkJCSAgICAoYWRkX3dlYWsgJiYgc3RyY21wKHMsICJfX3dlYWtyZWZfXyIpID09IDApKQotCQkJCWNvbnRpbnVlOwotCQkJdG1wID1fUHlfTWFuZ2xlKG5hbWUsIHRtcCk7Ci0JCQlpZiAoIXRtcCkKLQkJCSAgICBnb3RvIGJhZF9zbG90czsKLQkJCVB5TGlzdF9TRVRfSVRFTShuZXdzbG90cywgaiwgdG1wKTsKLQkJCWorKzsKLQkJfQotCQlhc3NlcnQoaiA9PSBuc2xvdHMgLSBhZGRfZGljdCAtIGFkZF93ZWFrKTsKLQkJbnNsb3RzID0gajsKLQkJUHlfREVDUkVGKHNsb3RzKTsKLQkJaWYgKFB5TGlzdF9Tb3J0KG5ld3Nsb3RzKSA9PSAtMSkgewotCQkJUHlfREVDUkVGKGJhc2VzKTsKLQkJCVB5X0RFQ1JFRihuZXdzbG90cyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzbG90cyA9IFB5TGlzdF9Bc1R1cGxlKG5ld3Nsb3RzKTsKLQkJUHlfREVDUkVGKG5ld3Nsb3RzKTsKLQkJaWYgKHNsb3RzID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihiYXNlcyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgICAgICAvKiBDb3B5IHNsb3RzIGludG8gYSBsaXN0LCBtYW5nbGUgbmFtZXMgYW5kIHNvcnQgdGhlbS4KKyAgICAgICAgICAgU29ydGVkIG5hbWVzIGFyZSBuZWVkZWQgZm9yIF9fY2xhc3NfXyBhc3NpZ25tZW50LgorICAgICAgICAgICBDb252ZXJ0IHRoZW0gYmFjayB0byB0dXBsZSBhdCB0aGUgZW5kLgorICAgICAgICAqLworICAgICAgICBuZXdzbG90cyA9IFB5TGlzdF9OZXcobnNsb3RzIC0gYWRkX2RpY3QgLSBhZGRfd2Vhayk7CisgICAgICAgIGlmIChuZXdzbG90cyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBiYWRfc2xvdHM7CisgICAgICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbnNsb3RzOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgKnM7CisgICAgICAgICAgICB0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKHNsb3RzLCBpKTsKKyAgICAgICAgICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcodG1wKTsKKyAgICAgICAgICAgIGlmICgoYWRkX2RpY3QgJiYgc3RyY21wKHMsICJfX2RpY3RfXyIpID09IDApIHx8CisgICAgICAgICAgICAgICAgKGFkZF93ZWFrICYmIHN0cmNtcChzLCAiX193ZWFrcmVmX18iKSA9PSAwKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHRtcCA9X1B5X01hbmdsZShuYW1lLCB0bXApOworICAgICAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICAgICAgZ290byBiYWRfc2xvdHM7CisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0obmV3c2xvdHMsIGosIHRtcCk7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KGogPT0gbnNsb3RzIC0gYWRkX2RpY3QgLSBhZGRfd2Vhayk7CisgICAgICAgIG5zbG90cyA9IGo7CisgICAgICAgIFB5X0RFQ1JFRihzbG90cyk7CisgICAgICAgIGlmIChQeUxpc3RfU29ydChuZXdzbG90cykgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlcyk7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3c2xvdHMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2xvdHMgPSBQeUxpc3RfQXNUdXBsZShuZXdzbG90cyk7CisgICAgICAgIFB5X0RFQ1JFRihuZXdzbG90cyk7CisgICAgICAgIGlmIChzbG90cyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoYmFzZXMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQkvKiBTZWNvbmRhcnkgYmFzZXMgbWF5IHByb3ZpZGUgd2Vha3JlZnMgb3IgZGljdCAqLwotCQlpZiAobmJhc2VzID4gMSAmJgotCQkgICAgKChtYXlfYWRkX2RpY3QgJiYgIWFkZF9kaWN0KSB8fAotCQkgICAgIChtYXlfYWRkX3dlYWsgJiYgIWFkZF93ZWFrKSkpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBuYmFzZXM7IGkrKykgewotCQkJCXRtcCA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOwotCQkJCWlmICh0bXAgPT0gKFB5T2JqZWN0ICopYmFzZSkKLQkJCQkJY29udGludWU7IC8qIFNraXAgcHJpbWFyeSBiYXNlICovCi0JCQkJaWYgKFB5Q2xhc3NfQ2hlY2sodG1wKSkgewotCQkJCQkvKiBDbGFzc2ljIGJhc2UgY2xhc3MgcHJvdmlkZXMgYm90aCAqLwotCQkJCQlpZiAobWF5X2FkZF9kaWN0ICYmICFhZGRfZGljdCkKLQkJCQkJCWFkZF9kaWN0Kys7Ci0JCQkJCWlmIChtYXlfYWRkX3dlYWsgJiYgIWFkZF93ZWFrKQotCQkJCQkJYWRkX3dlYWsrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWFzc2VydChQeVR5cGVfQ2hlY2sodG1wKSk7Ci0JCQkJdG1wdHlwZSA9IChQeVR5cGVPYmplY3QgKil0bXA7Ci0JCQkJaWYgKG1heV9hZGRfZGljdCAmJiAhYWRkX2RpY3QgJiYKLQkJCQkgICAgdG1wdHlwZS0+dHBfZGljdG9mZnNldCAhPSAwKQotCQkJCQlhZGRfZGljdCsrOwotCQkJCWlmIChtYXlfYWRkX3dlYWsgJiYgIWFkZF93ZWFrICYmCi0JCQkJICAgIHRtcHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICE9IDApCi0JCQkJCWFkZF93ZWFrKys7Ci0JCQkJaWYgKG1heV9hZGRfZGljdCAmJiAhYWRkX2RpY3QpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtYXlfYWRkX3dlYWsgJiYgIWFkZF93ZWFrKQotCQkJCQljb250aW51ZTsKLQkJCQkvKiBOb3RoaW5nIG1vcmUgdG8gY2hlY2sgKi8KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgLyogU2Vjb25kYXJ5IGJhc2VzIG1heSBwcm92aWRlIHdlYWtyZWZzIG9yIGRpY3QgKi8KKyAgICAgICAgaWYgKG5iYXNlcyA+IDEgJiYKKyAgICAgICAgICAgICgobWF5X2FkZF9kaWN0ICYmICFhZGRfZGljdCkgfHwKKyAgICAgICAgICAgICAobWF5X2FkZF93ZWFrICYmICFhZGRfd2VhaykpKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJhc2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IChQeU9iamVjdCAqKWJhc2UpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBTa2lwIHByaW1hcnkgYmFzZSAqLworICAgICAgICAgICAgICAgIGlmIChQeUNsYXNzX0NoZWNrKHRtcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ2xhc3NpYyBiYXNlIGNsYXNzIHByb3ZpZGVzIGJvdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heV9hZGRfZGljdCAmJiAhYWRkX2RpY3QpCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZGljdCsrOworICAgICAgICAgICAgICAgICAgICBpZiAobWF5X2FkZF93ZWFrICYmICFhZGRfd2VhaykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZF93ZWFrKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlUeXBlX0NoZWNrKHRtcCkpOworICAgICAgICAgICAgICAgIHRtcHR5cGUgPSAoUHlUeXBlT2JqZWN0ICopdG1wOworICAgICAgICAgICAgICAgIGlmIChtYXlfYWRkX2RpY3QgJiYgIWFkZF9kaWN0ICYmCisgICAgICAgICAgICAgICAgICAgIHRtcHR5cGUtPnRwX2RpY3RvZmZzZXQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYWRkX2RpY3QrKzsKKyAgICAgICAgICAgICAgICBpZiAobWF5X2FkZF93ZWFrICYmICFhZGRfd2VhayAmJgorICAgICAgICAgICAgICAgICAgICB0bXB0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAhPSAwKQorICAgICAgICAgICAgICAgICAgICBhZGRfd2VhaysrOworICAgICAgICAgICAgICAgIGlmIChtYXlfYWRkX2RpY3QgJiYgIWFkZF9kaWN0KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAobWF5X2FkZF93ZWFrICYmICFhZGRfd2VhaykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgLyogTm90aGluZyBtb3JlIHRvIGNoZWNrICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBYWFggRnJvbSBoZXJlIHVudGlsIHR5cGUgaXMgc2FmZWx5IGFsbG9jYXRlZCwKLQkgICAicmV0dXJuIE5VTEwiIG1heSBsZWFrIHNsb3RzISAqLworICAgIC8qIFhYWCBGcm9tIGhlcmUgdW50aWwgdHlwZSBpcyBzYWZlbHkgYWxsb2NhdGVkLAorICAgICAgICJyZXR1cm4gTlVMTCIgbWF5IGxlYWsgc2xvdHMhICovCiAKLQkvKiBBbGxvY2F0ZSB0aGUgdHlwZSBvYmplY3QgKi8KLQl0eXBlID0gKFB5VHlwZU9iamVjdCAqKW1ldGF0eXBlLT50cF9hbGxvYyhtZXRhdHlwZSwgbnNsb3RzKTsKLQlpZiAodHlwZSA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYoc2xvdHMpOwotCQlQeV9ERUNSRUYoYmFzZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQWxsb2NhdGUgdGhlIHR5cGUgb2JqZWN0ICovCisgICAgdHlwZSA9IChQeVR5cGVPYmplY3QgKiltZXRhdHlwZS0+dHBfYWxsb2MobWV0YXR5cGUsIG5zbG90cyk7CisgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgICBQeV9YREVDUkVGKHNsb3RzKTsKKyAgICAgICAgUHlfREVDUkVGKGJhc2VzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogS2VlcCBuYW1lIGFuZCBzbG90cyBhbGl2ZSBpbiB0aGUgZXh0ZW5kZWQgdHlwZSBvYmplY3QgKi8KLQlldCA9IChQeUhlYXBUeXBlT2JqZWN0ICopdHlwZTsKLQlQeV9JTkNSRUYobmFtZSk7Ci0JZXQtPmh0X25hbWUgPSBuYW1lOwotCWV0LT5odF9zbG90cyA9IHNsb3RzOworICAgIC8qIEtlZXAgbmFtZSBhbmQgc2xvdHMgYWxpdmUgaW4gdGhlIGV4dGVuZGVkIHR5cGUgb2JqZWN0ICovCisgICAgZXQgPSAoUHlIZWFwVHlwZU9iamVjdCAqKXR5cGU7CisgICAgUHlfSU5DUkVGKG5hbWUpOworICAgIGV0LT5odF9uYW1lID0gbmFtZTsKKyAgICBldC0+aHRfc2xvdHMgPSBzbG90czsKIAotCS8qIEluaXRpYWxpemUgdHBfZmxhZ3MgKi8KLQl0eXBlLT50cF9mbGFncyA9IFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEVBUFRZUEUgfAotCQlQeV9UUEZMQUdTX0JBU0VUWVBFOwotCWlmIChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19IQVZFX0dDOworICAgIC8qIEluaXRpYWxpemUgdHBfZmxhZ3MgKi8KKyAgICB0eXBlLT50cF9mbGFncyA9IFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEVBUFRZUEUgfAorICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFOworICAgIGlmIChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19IQVZFX0dDOwogCi0JLyogSXQncyBhIG5ldy1zdHlsZSBudW1iZXIgdW5sZXNzIGl0IHNwZWNpZmljYWxseSBpbmhlcml0cyBhbnkKLQkgICBvbGQtc3R5bGUgbnVtZXJpYyBiZWhhdmlvciAqLwotCWlmICgoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpIHx8Ci0JICAgIChiYXNlLT50cF9hc19udW1iZXIgPT0gTlVMTCkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUzsKKyAgICAvKiBJdCdzIGEgbmV3LXN0eWxlIG51bWJlciB1bmxlc3MgaXQgc3BlY2lmaWNhbGx5IGluaGVyaXRzIGFueQorICAgICAgIG9sZC1zdHlsZSBudW1lcmljIGJlaGF2aW9yICovCisgICAgaWYgKChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykgfHwKKyAgICAgICAgKGJhc2UtPnRwX2FzX251bWJlciA9PSBOVUxMKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19DSEVDS1RZUEVTOwogCi0JLyogSW5pdGlhbGl6ZSBlc3NlbnRpYWwgZmllbGRzICovCi0JdHlwZS0+dHBfYXNfbnVtYmVyID0gJmV0LT5hc19udW1iZXI7Ci0JdHlwZS0+dHBfYXNfc2VxdWVuY2UgPSAmZXQtPmFzX3NlcXVlbmNlOwotCXR5cGUtPnRwX2FzX21hcHBpbmcgPSAmZXQtPmFzX21hcHBpbmc7Ci0JdHlwZS0+dHBfYXNfYnVmZmVyID0gJmV0LT5hc19idWZmZXI7Ci0JdHlwZS0+dHBfbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKTsKKyAgICAvKiBJbml0aWFsaXplIGVzc2VudGlhbCBmaWVsZHMgKi8KKyAgICB0eXBlLT50cF9hc19udW1iZXIgPSAmZXQtPmFzX251bWJlcjsKKyAgICB0eXBlLT50cF9hc19zZXF1ZW5jZSA9ICZldC0+YXNfc2VxdWVuY2U7CisgICAgdHlwZS0+dHBfYXNfbWFwcGluZyA9ICZldC0+YXNfbWFwcGluZzsKKyAgICB0eXBlLT50cF9hc19idWZmZXIgPSAmZXQtPmFzX2J1ZmZlcjsKKyAgICB0eXBlLT50cF9uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpOwogCi0JLyogU2V0IHRwX2Jhc2UgYW5kIHRwX2Jhc2VzICovCi0JdHlwZS0+dHBfYmFzZXMgPSBiYXNlczsKLQlQeV9JTkNSRUYoYmFzZSk7Ci0JdHlwZS0+dHBfYmFzZSA9IGJhc2U7CisgICAgLyogU2V0IHRwX2Jhc2UgYW5kIHRwX2Jhc2VzICovCisgICAgdHlwZS0+dHBfYmFzZXMgPSBiYXNlczsKKyAgICBQeV9JTkNSRUYoYmFzZSk7CisgICAgdHlwZS0+dHBfYmFzZSA9IGJhc2U7CiAKLQkvKiBJbml0aWFsaXplIHRwX2RpY3QgZnJvbSBwYXNzZWQtaW4gZGljdCAqLwotCXR5cGUtPnRwX2RpY3QgPSBkaWN0ID0gUHlEaWN0X0NvcHkoZGljdCk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodHlwZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHRwX2RpY3QgZnJvbSBwYXNzZWQtaW4gZGljdCAqLworICAgIHR5cGUtPnRwX2RpY3QgPSBkaWN0ID0gUHlEaWN0X0NvcHkoZGljdCk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFNldCBfX21vZHVsZV9fIGluIHRoZSBkaWN0ICovCi0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX21vZHVsZV9fIikgPT0gTlVMTCkgewotCQl0bXAgPSBQeUV2YWxfR2V0R2xvYmFscygpOwotCQlpZiAodG1wICE9IE5VTEwpIHsKLQkJCXRtcCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHRtcCwgIl9fbmFtZV9fIik7Ci0JCQlpZiAodG1wICE9IE5VTEwpIHsKLQkJCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fbW9kdWxlX18iLAotCQkJCQkJCSB0bXApIDwgMCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogU2V0IF9fbW9kdWxlX18gaW4gdGhlIGRpY3QgKi8KKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fbW9kdWxlX18iKSA9PSBOVUxMKSB7CisgICAgICAgIHRtcCA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7CisgICAgICAgIGlmICh0bXAgIT0gTlVMTCkgeworICAgICAgICAgICAgdG1wID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodG1wLCAiX19uYW1lX18iKTsKKyAgICAgICAgICAgIGlmICh0bXAgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19tb2R1bGVfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCS8qIFNldCB0cF9kb2MgdG8gYSBjb3B5IG9mIGRpY3RbJ19fZG9jX18nXSwgaWYgdGhlIGxhdHRlciBpcyB0aGVyZQotCSAgIGFuZCBpcyBhIHN0cmluZy4gIFRoZSBfX2RvY19fIGFjY2Vzc29yIHdpbGwgZmlyc3QgbG9vayBmb3IgdHBfZG9jOwotCSAgIGlmIHRoYXQgZmFpbHMsIGl0IHdpbGwgc3RpbGwgbG9vayBpbnRvIF9fZGljdF9fLgotCSovCi0JewotCQlQeU9iamVjdCAqZG9jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iKTsKLQkJaWYgKGRvYyAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGRvYykpIHsKLQkJCWNvbnN0IHNpemVfdCBuID0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRShkb2MpOwotCQkJY2hhciAqdHBfZG9jID0gKGNoYXIgKilQeU9iamVjdF9NQUxMT0MobisxKTsKLQkJCWlmICh0cF9kb2MgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRih0eXBlKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCW1lbWNweSh0cF9kb2MsIFB5U3RyaW5nX0FTX1NUUklORyhkb2MpLCBuKzEpOwotCQkJdHlwZS0+dHBfZG9jID0gdHBfZG9jOwotCQl9Ci0JfQorICAgIC8qIFNldCB0cF9kb2MgdG8gYSBjb3B5IG9mIGRpY3RbJ19fZG9jX18nXSwgaWYgdGhlIGxhdHRlciBpcyB0aGVyZQorICAgICAgIGFuZCBpcyBhIHN0cmluZy4gIFRoZSBfX2RvY19fIGFjY2Vzc29yIHdpbGwgZmlyc3QgbG9vayBmb3IgdHBfZG9jOworICAgICAgIGlmIHRoYXQgZmFpbHMsIGl0IHdpbGwgc3RpbGwgbG9vayBpbnRvIF9fZGljdF9fLgorICAgICovCisgICAgeworICAgICAgICBQeU9iamVjdCAqZG9jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fZG9jX18iKTsKKyAgICAgICAgaWYgKGRvYyAhPSBOVUxMICYmIFB5U3RyaW5nX0NoZWNrKGRvYykpIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBuID0gKHNpemVfdClQeVN0cmluZ19HRVRfU0laRShkb2MpOworICAgICAgICAgICAgY2hhciAqdHBfZG9jID0gKGNoYXIgKilQeU9iamVjdF9NQUxMT0MobisxKTsKKyAgICAgICAgICAgIGlmICh0cF9kb2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweSh0cF9kb2MsIFB5U3RyaW5nX0FTX1NUUklORyhkb2MpLCBuKzEpOworICAgICAgICAgICAgdHlwZS0+dHBfZG9jID0gdHBfZG9jOworICAgICAgICB9CisgICAgfQogCi0JLyogU3BlY2lhbC1jYXNlIF9fbmV3X186IGlmIGl0J3MgYSBwbGFpbiBmdW5jdGlvbiwKLQkgICBtYWtlIGl0IGEgc3RhdGljIGZ1bmN0aW9uICovCi0JdG1wID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgIl9fbmV3X18iKTsKLQlpZiAodG1wICE9IE5VTEwgJiYgUHlGdW5jdGlvbl9DaGVjayh0bXApKSB7Ci0JCXRtcCA9IFB5U3RhdGljTWV0aG9kX05ldyh0bXApOwotCQlpZiAodG1wID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih0eXBlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX25ld19fIiwgdG1wKTsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JfQorICAgIC8qIFNwZWNpYWwtY2FzZSBfX25ld19fOiBpZiBpdCdzIGEgcGxhaW4gZnVuY3Rpb24sCisgICAgICAgbWFrZSBpdCBhIHN0YXRpYyBmdW5jdGlvbiAqLworICAgIHRtcCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJfX25ld19fIik7CisgICAgaWYgKHRtcCAhPSBOVUxMICYmIFB5RnVuY3Rpb25fQ2hlY2sodG1wKSkgeworICAgICAgICB0bXAgPSBQeVN0YXRpY01ldGhvZF9OZXcodG1wKTsKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19uZXdfXyIsIHRtcCk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgIH0KIAotCS8qIEFkZCBkZXNjcmlwdG9ycyBmb3IgY3VzdG9tIHNsb3RzIGZyb20gX19zbG90c19fLCBvciBmb3IgX19kaWN0X18gKi8KLQltcCA9IFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoZXQpOwotCXNsb3RvZmZzZXQgPSBiYXNlLT50cF9iYXNpY3NpemU7Ci0JaWYgKHNsb3RzICE9IE5VTEwpIHsKLQkJZm9yIChpID0gMDsgaSA8IG5zbG90czsgaSsrLCBtcCsrKSB7Ci0JCQltcC0+bmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORygKLQkJCQlQeVR1cGxlX0dFVF9JVEVNKHNsb3RzLCBpKSk7Ci0JCQltcC0+dHlwZSA9IFRfT0JKRUNUX0VYOwotCQkJbXAtPm9mZnNldCA9IHNsb3RvZmZzZXQ7CisgICAgLyogQWRkIGRlc2NyaXB0b3JzIGZvciBjdXN0b20gc2xvdHMgZnJvbSBfX3Nsb3RzX18sIG9yIGZvciBfX2RpY3RfXyAqLworICAgIG1wID0gUHlIZWFwVHlwZV9HRVRfTUVNQkVSUyhldCk7CisgICAgc2xvdG9mZnNldCA9IGJhc2UtPnRwX2Jhc2ljc2l6ZTsKKyAgICBpZiAoc2xvdHMgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNsb3RzOyBpKyssIG1wKyspIHsKKyAgICAgICAgICAgIG1wLT5uYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc2xvdHMsIGkpKTsKKyAgICAgICAgICAgIG1wLT50eXBlID0gVF9PQkpFQ1RfRVg7CisgICAgICAgICAgICBtcC0+b2Zmc2V0ID0gc2xvdG9mZnNldDsKIAotCQkJLyogX19kaWN0X18gYW5kIF9fd2Vha3JlZl9fIGFyZSBhbHJlYWR5IGZpbHRlcmVkIG91dCAqLwotCQkJYXNzZXJ0KHN0cmNtcChtcC0+bmFtZSwgIl9fZGljdF9fIikgIT0gMCk7Ci0JCQlhc3NlcnQoc3RyY21wKG1wLT5uYW1lLCAiX193ZWFrcmVmX18iKSAhPSAwKTsKKyAgICAgICAgICAgIC8qIF9fZGljdF9fIGFuZCBfX3dlYWtyZWZfXyBhcmUgYWxyZWFkeSBmaWx0ZXJlZCBvdXQgKi8KKyAgICAgICAgICAgIGFzc2VydChzdHJjbXAobXAtPm5hbWUsICJfX2RpY3RfXyIpICE9IDApOworICAgICAgICAgICAgYXNzZXJ0KHN0cmNtcChtcC0+bmFtZSwgIl9fd2Vha3JlZl9fIikgIT0gMCk7CiAKLQkJCXNsb3RvZmZzZXQgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOwotCQl9Ci0JfQotCWlmIChhZGRfZGljdCkgewotCQlpZiAoYmFzZS0+dHBfaXRlbXNpemUpCi0JCQl0eXBlLT50cF9kaWN0b2Zmc2V0ID0gLShsb25nKXNpemVvZihQeU9iamVjdCAqKTsKLQkJZWxzZQotCQkJdHlwZS0+dHBfZGljdG9mZnNldCA9IHNsb3RvZmZzZXQ7Ci0JCXNsb3RvZmZzZXQgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOwotCX0KLQlpZiAoYWRkX3dlYWspIHsKLQkJYXNzZXJ0KCFiYXNlLT50cF9pdGVtc2l6ZSk7Ci0JCXR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ID0gc2xvdG9mZnNldDsKLQkJc2xvdG9mZnNldCArPSBzaXplb2YoUHlPYmplY3QgKik7Ci0JfQotCXR5cGUtPnRwX2Jhc2ljc2l6ZSA9IHNsb3RvZmZzZXQ7Ci0JdHlwZS0+dHBfaXRlbXNpemUgPSBiYXNlLT50cF9pdGVtc2l6ZTsKLQl0eXBlLT50cF9tZW1iZXJzID0gUHlIZWFwVHlwZV9HRVRfTUVNQkVSUyhldCk7CisgICAgICAgICAgICBzbG90b2Zmc2V0ICs9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYWRkX2RpY3QpIHsKKyAgICAgICAgaWYgKGJhc2UtPnRwX2l0ZW1zaXplKQorICAgICAgICAgICAgdHlwZS0+dHBfZGljdG9mZnNldCA9IC0obG9uZylzaXplb2YoUHlPYmplY3QgKik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGUtPnRwX2RpY3RvZmZzZXQgPSBzbG90b2Zmc2V0OworICAgICAgICBzbG90b2Zmc2V0ICs9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICB9CisgICAgaWYgKGFkZF93ZWFrKSB7CisgICAgICAgIGFzc2VydCghYmFzZS0+dHBfaXRlbXNpemUpOworICAgICAgICB0eXBlLT50cF93ZWFrbGlzdG9mZnNldCA9IHNsb3RvZmZzZXQ7CisgICAgICAgIHNsb3RvZmZzZXQgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOworICAgIH0KKyAgICB0eXBlLT50cF9iYXNpY3NpemUgPSBzbG90b2Zmc2V0OworICAgIHR5cGUtPnRwX2l0ZW1zaXplID0gYmFzZS0+dHBfaXRlbXNpemU7CisgICAgdHlwZS0+dHBfbWVtYmVycyA9IFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoZXQpOwogCi0JaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmIHR5cGUtPnRwX2RpY3RvZmZzZXQpCi0JCXR5cGUtPnRwX2dldHNldCA9IHN1YnR5cGVfZ2V0c2V0c19mdWxsOwotCWVsc2UgaWYgKHR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmICF0eXBlLT50cF9kaWN0b2Zmc2V0KQotCQl0eXBlLT50cF9nZXRzZXQgPSBzdWJ0eXBlX2dldHNldHNfd2Vha3JlZl9vbmx5OwotCWVsc2UgaWYgKCF0eXBlLT50cF93ZWFrbGlzdG9mZnNldCAmJiB0eXBlLT50cF9kaWN0b2Zmc2V0KQotCQl0eXBlLT50cF9nZXRzZXQgPSBzdWJ0eXBlX2dldHNldHNfZGljdF9vbmx5OwotCWVsc2UKLQkJdHlwZS0+dHBfZ2V0c2V0ID0gTlVMTDsKKyAgICBpZiAodHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgdHlwZS0+dHBfZGljdG9mZnNldCkKKyAgICAgICAgdHlwZS0+dHBfZ2V0c2V0ID0gc3VidHlwZV9nZXRzZXRzX2Z1bGw7CisgICAgZWxzZSBpZiAodHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgJiYgIXR5cGUtPnRwX2RpY3RvZmZzZXQpCisgICAgICAgIHR5cGUtPnRwX2dldHNldCA9IHN1YnR5cGVfZ2V0c2V0c193ZWFrcmVmX29ubHk7CisgICAgZWxzZSBpZiAoIXR5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ICYmIHR5cGUtPnRwX2RpY3RvZmZzZXQpCisgICAgICAgIHR5cGUtPnRwX2dldHNldCA9IHN1YnR5cGVfZ2V0c2V0c19kaWN0X29ubHk7CisgICAgZWxzZQorICAgICAgICB0eXBlLT50cF9nZXRzZXQgPSBOVUxMOwogCi0JLyogU3BlY2lhbCBjYXNlIHNvbWUgc2xvdHMgKi8KLQlpZiAodHlwZS0+dHBfZGljdG9mZnNldCAhPSAwIHx8IG5zbG90cyA+IDApIHsKLQkJaWYgKGJhc2UtPnRwX2dldGF0dHIgPT0gTlVMTCAmJiBiYXNlLT50cF9nZXRhdHRybyA9PSBOVUxMKQotCQkJdHlwZS0+dHBfZ2V0YXR0cm8gPSBQeU9iamVjdF9HZW5lcmljR2V0QXR0cjsKLQkJaWYgKGJhc2UtPnRwX3NldGF0dHIgPT0gTlVMTCAmJiBiYXNlLT50cF9zZXRhdHRybyA9PSBOVUxMKQotCQkJdHlwZS0+dHBfc2V0YXR0cm8gPSBQeU9iamVjdF9HZW5lcmljU2V0QXR0cjsKLQl9Ci0JdHlwZS0+dHBfZGVhbGxvYyA9IHN1YnR5cGVfZGVhbGxvYzsKKyAgICAvKiBTcGVjaWFsIGNhc2Ugc29tZSBzbG90cyAqLworICAgIGlmICh0eXBlLT50cF9kaWN0b2Zmc2V0ICE9IDAgfHwgbnNsb3RzID4gMCkgeworICAgICAgICBpZiAoYmFzZS0+dHBfZ2V0YXR0ciA9PSBOVUxMICYmIGJhc2UtPnRwX2dldGF0dHJvID09IE5VTEwpCisgICAgICAgICAgICB0eXBlLT50cF9nZXRhdHRybyA9IFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyOworICAgICAgICBpZiAoYmFzZS0+dHBfc2V0YXR0ciA9PSBOVUxMICYmIGJhc2UtPnRwX3NldGF0dHJvID09IE5VTEwpCisgICAgICAgICAgICB0eXBlLT50cF9zZXRhdHRybyA9IFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyOworICAgIH0KKyAgICB0eXBlLT50cF9kZWFsbG9jID0gc3VidHlwZV9kZWFsbG9jOwogCi0JLyogRW5hYmxlIEdDIHVubGVzcyB0aGVyZSBhcmUgcmVhbGx5IG5vIGluc3RhbmNlIHZhcmlhYmxlcyBwb3NzaWJsZSAqLwotCWlmICghKHR5cGUtPnRwX2Jhc2ljc2l6ZSA9PSBzaXplb2YoUHlPYmplY3QpICYmCi0JICAgICAgdHlwZS0+dHBfaXRlbXNpemUgPT0gMCkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSEFWRV9HQzsKKyAgICAvKiBFbmFibGUgR0MgdW5sZXNzIHRoZXJlIGFyZSByZWFsbHkgbm8gaW5zdGFuY2UgdmFyaWFibGVzIHBvc3NpYmxlICovCisgICAgaWYgKCEodHlwZS0+dHBfYmFzaWNzaXplID09IHNpemVvZihQeU9iamVjdCkgJiYKKyAgICAgICAgICB0eXBlLT50cF9pdGVtc2l6ZSA9PSAwKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19IQVZFX0dDOwogCi0JLyogQWx3YXlzIG92ZXJyaWRlIGFsbG9jYXRpb24gc3RyYXRlZ3kgdG8gdXNlIHJlZ3VsYXIgaGVhcCAqLwotCXR5cGUtPnRwX2FsbG9jID0gUHlUeXBlX0dlbmVyaWNBbGxvYzsKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpIHsKLQkJdHlwZS0+dHBfZnJlZSA9IFB5T2JqZWN0X0dDX0RlbDsKLQkJdHlwZS0+dHBfdHJhdmVyc2UgPSBzdWJ0eXBlX3RyYXZlcnNlOwotCQl0eXBlLT50cF9jbGVhciA9IHN1YnR5cGVfY2xlYXI7Ci0JfQotCWVsc2UKLQkJdHlwZS0+dHBfZnJlZSA9IFB5T2JqZWN0X0RlbDsKKyAgICAvKiBBbHdheXMgb3ZlcnJpZGUgYWxsb2NhdGlvbiBzdHJhdGVneSB0byB1c2UgcmVndWxhciBoZWFwICovCisgICAgdHlwZS0+dHBfYWxsb2MgPSBQeVR5cGVfR2VuZXJpY0FsbG9jOworICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykgeworICAgICAgICB0eXBlLT50cF9mcmVlID0gUHlPYmplY3RfR0NfRGVsOworICAgICAgICB0eXBlLT50cF90cmF2ZXJzZSA9IHN1YnR5cGVfdHJhdmVyc2U7CisgICAgICAgIHR5cGUtPnRwX2NsZWFyID0gc3VidHlwZV9jbGVhcjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB0eXBlLT50cF9mcmVlID0gUHlPYmplY3RfRGVsOwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgcmVzdCAqLwotCWlmIChQeVR5cGVfUmVhZHkodHlwZSkgPCAwKSB7Ci0JCVB5X0RFQ1JFRih0eXBlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgdGhlIHJlc3QgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGUpIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFB1dCB0aGUgcHJvcGVyIHNsb3RzIGluIHBsYWNlICovCi0JZml4dXBfc2xvdF9kaXNwYXRjaGVycyh0eXBlKTsKKyAgICAvKiBQdXQgdGhlIHByb3BlciBzbG90cyBpbiBwbGFjZSAqLworICAgIGZpeHVwX3Nsb3RfZGlzcGF0Y2hlcnModHlwZSk7CiAKLQlyZXR1cm4gKFB5T2JqZWN0ICopdHlwZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopdHlwZTsKIH0KIAogLyogSW50ZXJuYWwgQVBJIHRvIGxvb2sgZm9yIGEgbmFtZSB0aHJvdWdoIHRoZSBNUk8uCkBAIC0yNDU4LDU0ICsyNDU4LDU0IEBACiBQeU9iamVjdCAqCiBfUHlUeXBlX0xvb2t1cChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqbXJvLCAqcmVzLCAqYmFzZSwgKmRpY3Q7Ci0JdW5zaWduZWQgaW50IGg7CisgICAgUHlfc3NpemVfdCBpLCBuOworICAgIFB5T2JqZWN0ICptcm8sICpyZXMsICpiYXNlLCAqZGljdDsKKyAgICB1bnNpZ25lZCBpbnQgaDsKIAotCWlmIChNQ0FDSEVfQ0FDSEVBQkxFX05BTUUobmFtZSkgJiYKLQkgICAgUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRykpIHsKLQkJLyogZmFzdCBwYXRoICovCi0JCWggPSBNQ0FDSEVfSEFTSF9NRVRIT0QodHlwZSwgbmFtZSk7Ci0JCWlmIChtZXRob2RfY2FjaGVbaF0udmVyc2lvbiA9PSB0eXBlLT50cF92ZXJzaW9uX3RhZyAmJgotCQkgICAgbWV0aG9kX2NhY2hlW2hdLm5hbWUgPT0gbmFtZSkKLQkJICAgIHJldHVybiBtZXRob2RfY2FjaGVbaF0udmFsdWU7Ci0JfQorICAgIGlmIChNQ0FDSEVfQ0FDSEVBQkxFX05BTUUobmFtZSkgJiYKKyAgICAgICAgUHlUeXBlX0hhc0ZlYXR1cmUodHlwZSwgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRykpIHsKKyAgICAgICAgLyogZmFzdCBwYXRoICovCisgICAgICAgIGggPSBNQ0FDSEVfSEFTSF9NRVRIT0QodHlwZSwgbmFtZSk7CisgICAgICAgIGlmIChtZXRob2RfY2FjaGVbaF0udmVyc2lvbiA9PSB0eXBlLT50cF92ZXJzaW9uX3RhZyAmJgorICAgICAgICAgICAgbWV0aG9kX2NhY2hlW2hdLm5hbWUgPT0gbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBtZXRob2RfY2FjaGVbaF0udmFsdWU7CisgICAgfQogCi0JLyogTG9vayBpbiB0cF9kaWN0IG9mIHR5cGVzIGluIE1STyAqLwotCW1ybyA9IHR5cGUtPnRwX21ybzsKKyAgICAvKiBMb29rIGluIHRwX2RpY3Qgb2YgdHlwZXMgaW4gTVJPICovCisgICAgbXJvID0gdHlwZS0+dHBfbXJvOwogCi0JLyogSWYgbXJvIGlzIE5VTEwsIHRoZSB0eXBlIGlzIGVpdGhlciBub3QgeWV0IGluaXRpYWxpemVkCi0JICAgYnkgUHlUeXBlX1JlYWR5KCksIG9yIGFscmVhZHkgY2xlYXJlZCBieSB0eXBlX2NsZWFyKCkuCi0JICAgRWl0aGVyIHdheSB0aGUgc2FmZXN0IHRoaW5nIHRvIGRvIGlzIHRvIHJldHVybiBOVUxMLiAqLwotCWlmIChtcm8gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogSWYgbXJvIGlzIE5VTEwsIHRoZSB0eXBlIGlzIGVpdGhlciBub3QgeWV0IGluaXRpYWxpemVkCisgICAgICAgYnkgUHlUeXBlX1JlYWR5KCksIG9yIGFscmVhZHkgY2xlYXJlZCBieSB0eXBlX2NsZWFyKCkuCisgICAgICAgRWl0aGVyIHdheSB0aGUgc2FmZXN0IHRoaW5nIHRvIGRvIGlzIHRvIHJldHVybiBOVUxMLiAqLworICAgIGlmIChtcm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXMgPSBOVUxMOwotCWFzc2VydChQeVR1cGxlX0NoZWNrKG1ybykpOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKG1ybyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQliYXNlID0gUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpOwotCQlpZiAoUHlDbGFzc19DaGVjayhiYXNlKSkKLQkJCWRpY3QgPSAoKFB5Q2xhc3NPYmplY3QgKiliYXNlKS0+Y2xfZGljdDsKLQkJZWxzZSB7Ci0JCQlhc3NlcnQoUHlUeXBlX0NoZWNrKGJhc2UpKTsKLQkJCWRpY3QgPSAoKFB5VHlwZU9iamVjdCAqKWJhc2UpLT50cF9kaWN0OwotCQl9Ci0JCWFzc2VydChkaWN0ICYmIFB5RGljdF9DaGVjayhkaWN0KSk7Ci0JCXJlcyA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIG5hbWUpOwotCQlpZiAocmVzICE9IE5VTEwpCi0JCQlicmVhazsKLQl9CisgICAgcmVzID0gTlVMTDsKKyAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhtcm8pKTsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShtcm8pOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgYmFzZSA9IFB5VHVwbGVfR0VUX0lURU0obXJvLCBpKTsKKyAgICAgICAgaWYgKFB5Q2xhc3NfQ2hlY2soYmFzZSkpCisgICAgICAgICAgICBkaWN0ID0gKChQeUNsYXNzT2JqZWN0ICopYmFzZSktPmNsX2RpY3Q7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayhiYXNlKSk7CisgICAgICAgICAgICBkaWN0ID0gKChQeVR5cGVPYmplY3QgKiliYXNlKS0+dHBfZGljdDsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoZGljdCAmJiBQeURpY3RfQ2hlY2soZGljdCkpOworICAgICAgICByZXMgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogCi0JaWYgKE1DQUNIRV9DQUNIRUFCTEVfTkFNRShuYW1lKSAmJiBhc3NpZ25fdmVyc2lvbl90YWcodHlwZSkpIHsKLQkJaCA9IE1DQUNIRV9IQVNIX01FVEhPRCh0eXBlLCBuYW1lKTsKLQkJbWV0aG9kX2NhY2hlW2hdLnZlcnNpb24gPSB0eXBlLT50cF92ZXJzaW9uX3RhZzsKLQkJbWV0aG9kX2NhY2hlW2hdLnZhbHVlID0gcmVzOyAgLyogYm9ycm93ZWQgKi8KLQkJUHlfSU5DUkVGKG5hbWUpOwotCQlQeV9ERUNSRUYobWV0aG9kX2NhY2hlW2hdLm5hbWUpOwotCQltZXRob2RfY2FjaGVbaF0ubmFtZSA9IG5hbWU7Ci0JfQotCXJldHVybiByZXM7CisgICAgaWYgKE1DQUNIRV9DQUNIRUFCTEVfTkFNRShuYW1lKSAmJiBhc3NpZ25fdmVyc2lvbl90YWcodHlwZSkpIHsKKyAgICAgICAgaCA9IE1DQUNIRV9IQVNIX01FVEhPRCh0eXBlLCBuYW1lKTsKKyAgICAgICAgbWV0aG9kX2NhY2hlW2hdLnZlcnNpb24gPSB0eXBlLT50cF92ZXJzaW9uX3RhZzsKKyAgICAgICAgbWV0aG9kX2NhY2hlW2hdLnZhbHVlID0gcmVzOyAgLyogYm9ycm93ZWQgKi8KKyAgICAgICAgUHlfSU5DUkVGKG5hbWUpOworICAgICAgICBQeV9ERUNSRUYobWV0aG9kX2NhY2hlW2hdLm5hbWUpOworICAgICAgICBtZXRob2RfY2FjaGVbaF0ubmFtZSA9IG5hbWU7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIC8qIFRoaXMgaXMgc2ltaWxhciB0byBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigpLApAQCAtMjUxMywxNTIgKzI1MTMsMTUyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9nZXRhdHRybyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5VHlwZU9iamVjdCAqbWV0YXR5cGUgPSBQeV9UWVBFKHR5cGUpOwotCVB5T2JqZWN0ICptZXRhX2F0dHJpYnV0ZSwgKmF0dHJpYnV0ZTsKLQlkZXNjcmdldGZ1bmMgbWV0YV9nZXQ7CisgICAgUHlUeXBlT2JqZWN0ICptZXRhdHlwZSA9IFB5X1RZUEUodHlwZSk7CisgICAgUHlPYmplY3QgKm1ldGFfYXR0cmlidXRlLCAqYXR0cmlidXRlOworICAgIGRlc2NyZ2V0ZnVuYyBtZXRhX2dldDsKIAotCS8qIEluaXRpYWxpemUgdGhpcyB0eXBlICh3ZSdsbCBhc3N1bWUgdGhlIG1ldGF0eXBlIGlzIGluaXRpYWxpemVkKSAqLwotCWlmICh0eXBlLT50cF9kaWN0ID09IE5VTEwpIHsKLQkJaWYgKFB5VHlwZV9SZWFkeSh0eXBlKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0aGlzIHR5cGUgKHdlJ2xsIGFzc3VtZSB0aGUgbWV0YXR5cGUgaXMgaW5pdGlhbGl6ZWQpICovCisgICAgaWYgKHR5cGUtPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KHR5cGUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIE5vIHJlYWRhYmxlIGRlc2NyaXB0b3IgZm91bmQgeWV0ICovCi0JbWV0YV9nZXQgPSBOVUxMOworICAgIC8qIE5vIHJlYWRhYmxlIGRlc2NyaXB0b3IgZm91bmQgeWV0ICovCisgICAgbWV0YV9nZXQgPSBOVUxMOwogCi0JLyogTG9vayBmb3IgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgbWV0YXR5cGUgKi8KLQltZXRhX2F0dHJpYnV0ZSA9IF9QeVR5cGVfTG9va3VwKG1ldGF0eXBlLCBuYW1lKTsKKyAgICAvKiBMb29rIGZvciB0aGUgYXR0cmlidXRlIGluIHRoZSBtZXRhdHlwZSAqLworICAgIG1ldGFfYXR0cmlidXRlID0gX1B5VHlwZV9Mb29rdXAobWV0YXR5cGUsIG5hbWUpOwogCi0JaWYgKG1ldGFfYXR0cmlidXRlICE9IE5VTEwpIHsKLQkJbWV0YV9nZXQgPSBQeV9UWVBFKG1ldGFfYXR0cmlidXRlKS0+dHBfZGVzY3JfZ2V0OworICAgIGlmIChtZXRhX2F0dHJpYnV0ZSAhPSBOVUxMKSB7CisgICAgICAgIG1ldGFfZ2V0ID0gUHlfVFlQRShtZXRhX2F0dHJpYnV0ZSktPnRwX2Rlc2NyX2dldDsKIAotCQlpZiAobWV0YV9nZXQgIT0gTlVMTCAmJiBQeURlc2NyX0lzRGF0YShtZXRhX2F0dHJpYnV0ZSkpIHsKLQkJCS8qIERhdGEgZGVzY3JpcHRvcnMgaW1wbGVtZW50IHRwX2Rlc2NyX3NldCB0byBpbnRlcmNlcHQKLQkJCSAqIHdyaXRlcy4gQXNzdW1lIHRoZSBhdHRyaWJ1dGUgaXMgbm90IG92ZXJyaWRkZW4gaW4KLQkJCSAqIHR5cGUncyB0cF9kaWN0IChhbmQgYmFzZXMpOiBjYWxsIHRoZSBkZXNjcmlwdG9yIG5vdy4KLQkJCSAqLwotCQkJcmV0dXJuIG1ldGFfZ2V0KG1ldGFfYXR0cmlidXRlLCAoUHlPYmplY3QgKil0eXBlLAotCQkJCQkoUHlPYmplY3QgKiltZXRhdHlwZSk7Ci0JCX0KLQkJUHlfSU5DUkVGKG1ldGFfYXR0cmlidXRlKTsKLQl9CisgICAgICAgIGlmIChtZXRhX2dldCAhPSBOVUxMICYmIFB5RGVzY3JfSXNEYXRhKG1ldGFfYXR0cmlidXRlKSkgeworICAgICAgICAgICAgLyogRGF0YSBkZXNjcmlwdG9ycyBpbXBsZW1lbnQgdHBfZGVzY3Jfc2V0IHRvIGludGVyY2VwdAorICAgICAgICAgICAgICogd3JpdGVzLiBBc3N1bWUgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgb3ZlcnJpZGRlbiBpbgorICAgICAgICAgICAgICogdHlwZSdzIHRwX2RpY3QgKGFuZCBiYXNlcyk6IGNhbGwgdGhlIGRlc2NyaXB0b3Igbm93LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gbWV0YV9nZXQobWV0YV9hdHRyaWJ1dGUsIChQeU9iamVjdCAqKXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopbWV0YXR5cGUpOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihtZXRhX2F0dHJpYnV0ZSk7CisgICAgfQogCi0JLyogTm8gZGF0YSBkZXNjcmlwdG9yIGZvdW5kIG9uIG1ldGF0eXBlLiBMb29rIGluIHRwX2RpY3Qgb2YgdGhpcwotCSAqIHR5cGUgYW5kIGl0cyBiYXNlcyAqLwotCWF0dHJpYnV0ZSA9IF9QeVR5cGVfTG9va3VwKHR5cGUsIG5hbWUpOwotCWlmIChhdHRyaWJ1dGUgIT0gTlVMTCkgewotCQkvKiBJbXBsZW1lbnQgZGVzY3JpcHRvciBmdW5jdGlvbmFsaXR5LCBpZiBhbnkgKi8KLQkJZGVzY3JnZXRmdW5jIGxvY2FsX2dldCA9IFB5X1RZUEUoYXR0cmlidXRlKS0+dHBfZGVzY3JfZ2V0OworICAgIC8qIE5vIGRhdGEgZGVzY3JpcHRvciBmb3VuZCBvbiBtZXRhdHlwZS4gTG9vayBpbiB0cF9kaWN0IG9mIHRoaXMKKyAgICAgKiB0eXBlIGFuZCBpdHMgYmFzZXMgKi8KKyAgICBhdHRyaWJ1dGUgPSBfUHlUeXBlX0xvb2t1cCh0eXBlLCBuYW1lKTsKKyAgICBpZiAoYXR0cmlidXRlICE9IE5VTEwpIHsKKyAgICAgICAgLyogSW1wbGVtZW50IGRlc2NyaXB0b3IgZnVuY3Rpb25hbGl0eSwgaWYgYW55ICovCisgICAgICAgIGRlc2NyZ2V0ZnVuYyBsb2NhbF9nZXQgPSBQeV9UWVBFKGF0dHJpYnV0ZSktPnRwX2Rlc2NyX2dldDsKIAotCQlQeV9YREVDUkVGKG1ldGFfYXR0cmlidXRlKTsKKyAgICAgICAgUHlfWERFQ1JFRihtZXRhX2F0dHJpYnV0ZSk7CiAKLQkJaWYgKGxvY2FsX2dldCAhPSBOVUxMKSB7Ci0JCQkvKiBOVUxMIDJuZCBhcmd1bWVudCBpbmRpY2F0ZXMgdGhlIGRlc2NyaXB0b3Igd2FzCi0JCQkgKiBmb3VuZCBvbiB0aGUgdGFyZ2V0IG9iamVjdCBpdHNlbGYgKG9yIGEgYmFzZSkgICovCi0JCQlyZXR1cm4gbG9jYWxfZ2V0KGF0dHJpYnV0ZSwgKFB5T2JqZWN0ICopTlVMTCwKLQkJCQkJIChQeU9iamVjdCAqKXR5cGUpOwotCQl9CisgICAgICAgIGlmIChsb2NhbF9nZXQgIT0gTlVMTCkgeworICAgICAgICAgICAgLyogTlVMTCAybmQgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkZXNjcmlwdG9yIHdhcworICAgICAgICAgICAgICogZm91bmQgb24gdGhlIHRhcmdldCBvYmplY3QgaXRzZWxmIChvciBhIGJhc2UpICAqLworICAgICAgICAgICAgcmV0dXJuIGxvY2FsX2dldChhdHRyaWJ1dGUsIChQeU9iamVjdCAqKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKXR5cGUpOworICAgICAgICB9CiAKLQkJUHlfSU5DUkVGKGF0dHJpYnV0ZSk7Ci0JCXJldHVybiBhdHRyaWJ1dGU7Ci0JfQorICAgICAgICBQeV9JTkNSRUYoYXR0cmlidXRlKTsKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKKyAgICB9CiAKLQkvKiBObyBhdHRyaWJ1dGUgZm91bmQgaW4gbG9jYWwgX19kaWN0X18gKG9yIGJhc2VzKTogdXNlIHRoZQotCSAqIGRlc2NyaXB0b3IgZnJvbSB0aGUgbWV0YXR5cGUsIGlmIGFueSAqLwotCWlmIChtZXRhX2dldCAhPSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpyZXM7Ci0JCXJlcyA9IG1ldGFfZ2V0KG1ldGFfYXR0cmlidXRlLCAoUHlPYmplY3QgKil0eXBlLAotCQkJICAgICAgIChQeU9iamVjdCAqKW1ldGF0eXBlKTsKLQkJUHlfREVDUkVGKG1ldGFfYXR0cmlidXRlKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgLyogTm8gYXR0cmlidXRlIGZvdW5kIGluIGxvY2FsIF9fZGljdF9fIChvciBiYXNlcyk6IHVzZSB0aGUKKyAgICAgKiBkZXNjcmlwdG9yIGZyb20gdGhlIG1ldGF0eXBlLCBpZiBhbnkgKi8KKyAgICBpZiAobWV0YV9nZXQgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICByZXMgPSBtZXRhX2dldChtZXRhX2F0dHJpYnV0ZSwgKFB5T2JqZWN0ICopdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopbWV0YXR5cGUpOworICAgICAgICBQeV9ERUNSRUYobWV0YV9hdHRyaWJ1dGUpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotCS8qIElmIGFuIG9yZGluYXJ5IGF0dHJpYnV0ZSB3YXMgZm91bmQgb24gdGhlIG1ldGF0eXBlLCByZXR1cm4gaXQgbm93ICovCi0JaWYgKG1ldGFfYXR0cmlidXRlICE9IE5VTEwpIHsKLQkJcmV0dXJuIG1ldGFfYXR0cmlidXRlOwotCX0KKyAgICAvKiBJZiBhbiBvcmRpbmFyeSBhdHRyaWJ1dGUgd2FzIGZvdW5kIG9uIHRoZSBtZXRhdHlwZSwgcmV0dXJuIGl0IG5vdyAqLworICAgIGlmIChtZXRhX2F0dHJpYnV0ZSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtZXRhX2F0dHJpYnV0ZTsKKyAgICB9CiAKLQkvKiBHaXZlIHVwICovCi0JUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICJ0eXBlIG9iamVjdCAnJS41MHMnIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAotCQkJIHR5cGUtPnRwX25hbWUsIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgLyogR2l2ZSB1cCAqLworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ0eXBlIG9iamVjdCAnJS41MHMnIGhhcyBubyBhdHRyaWJ1dGUgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAogdHlwZV9zZXRhdHRybyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSkgewotCQlQeUVycl9Gb3JtYXQoCi0JCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkiY2FuJ3Qgc2V0IGF0dHJpYnV0ZXMgb2YgYnVpbHQtaW4vZXh0ZW5zaW9uIHR5cGUgJyVzJyIsCi0JCQl0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoKFB5T2JqZWN0ICopdHlwZSwgbmFtZSwgdmFsdWUpIDwgMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiB1cGRhdGVfc2xvdCh0eXBlLCBuYW1lKTsKKyAgICBpZiAoISh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJjYW4ndCBzZXQgYXR0cmlidXRlcyBvZiBidWlsdC1pbi9leHRlbnNpb24gdHlwZSAnJXMnIiwKKyAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9HZW5lcmljU2V0QXR0cigoUHlPYmplY3QgKil0eXBlLCBuYW1lLCB2YWx1ZSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHVwZGF0ZV9zbG90KHR5cGUsIG5hbWUpOwogfQogCiBzdGF0aWMgdm9pZAogdHlwZV9kZWFsbG9jKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeUhlYXBUeXBlT2JqZWN0ICpldDsKKyAgICBQeUhlYXBUeXBlT2JqZWN0ICpldDsKIAotCS8qIEFzc2VydCB0aGlzIGlzIGEgaGVhcC1hbGxvY2F0ZWQgdHlwZSBvYmplY3QgKi8KLQlhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyh0eXBlKTsKLQlQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKXR5cGUpOwotCWV0ID0gKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlOwotCVB5X1hERUNSRUYodHlwZS0+dHBfYmFzZSk7Ci0JUHlfWERFQ1JFRih0eXBlLT50cF9kaWN0KTsKLQlQeV9YREVDUkVGKHR5cGUtPnRwX2Jhc2VzKTsKLQlQeV9YREVDUkVGKHR5cGUtPnRwX21ybyk7Ci0JUHlfWERFQ1JFRih0eXBlLT50cF9jYWNoZSk7Ci0JUHlfWERFQ1JFRih0eXBlLT50cF9zdWJjbGFzc2VzKTsKLQkvKiBBIHR5cGUncyB0cF9kb2MgaXMgaGVhcCBhbGxvY2F0ZWQsIHVubGlrZSB0aGUgdHBfZG9jIHNsb3RzCi0JICogb2YgbW9zdCBvdGhlciBvYmplY3RzLiAgSXQncyBva2F5IHRvIGNhc3QgaXQgdG8gY2hhciAqLgotCSAqLwotCVB5T2JqZWN0X0ZyZWUoKGNoYXIgKil0eXBlLT50cF9kb2MpOwotCVB5X1hERUNSRUYoZXQtPmh0X25hbWUpOwotCVB5X1hERUNSRUYoZXQtPmh0X3Nsb3RzKTsKLQlQeV9UWVBFKHR5cGUpLT50cF9mcmVlKChQeU9iamVjdCAqKXR5cGUpOworICAgIC8qIEFzc2VydCB0aGlzIGlzIGEgaGVhcC1hbGxvY2F0ZWQgdHlwZSBvYmplY3QgKi8KKyAgICBhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyh0eXBlKTsKKyAgICBQeU9iamVjdF9DbGVhcldlYWtSZWZzKChQeU9iamVjdCAqKXR5cGUpOworICAgIGV0ID0gKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlOworICAgIFB5X1hERUNSRUYodHlwZS0+dHBfYmFzZSk7CisgICAgUHlfWERFQ1JFRih0eXBlLT50cF9kaWN0KTsKKyAgICBQeV9YREVDUkVGKHR5cGUtPnRwX2Jhc2VzKTsKKyAgICBQeV9YREVDUkVGKHR5cGUtPnRwX21ybyk7CisgICAgUHlfWERFQ1JFRih0eXBlLT50cF9jYWNoZSk7CisgICAgUHlfWERFQ1JFRih0eXBlLT50cF9zdWJjbGFzc2VzKTsKKyAgICAvKiBBIHR5cGUncyB0cF9kb2MgaXMgaGVhcCBhbGxvY2F0ZWQsIHVubGlrZSB0aGUgdHBfZG9jIHNsb3RzCisgICAgICogb2YgbW9zdCBvdGhlciBvYmplY3RzLiAgSXQncyBva2F5IHRvIGNhc3QgaXQgdG8gY2hhciAqLgorICAgICAqLworICAgIFB5T2JqZWN0X0ZyZWUoKGNoYXIgKil0eXBlLT50cF9kb2MpOworICAgIFB5X1hERUNSRUYoZXQtPmh0X25hbWUpOworICAgIFB5X1hERUNSRUYoZXQtPmh0X3Nsb3RzKTsKKyAgICBQeV9UWVBFKHR5cGUpLT50cF9mcmVlKChQeU9iamVjdCAqKXR5cGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdHlwZV9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3NfaWdub3JlZCkKIHsKLQlQeU9iamVjdCAqbGlzdCwgKnJhdywgKnJlZjsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKmxpc3QsICpyYXcsICpyZWY7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKGxpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmF3ID0gdHlwZS0+dHBfc3ViY2xhc3NlczsKLQlpZiAocmF3ID09IE5VTEwpCi0JCXJldHVybiBsaXN0OwotCWFzc2VydChQeUxpc3RfQ2hlY2socmF3KSk7Ci0JbiA9IFB5TGlzdF9HRVRfU0laRShyYXcpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJcmVmID0gUHlMaXN0X0dFVF9JVEVNKHJhdywgaSk7Ci0JCWFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7Ci0JCXJlZiA9IFB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZik7Ci0JCWlmIChyZWYgIT0gUHlfTm9uZSkgewotCQkJaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgcmVmKSA8IDApIHsKLQkJCQlQeV9ERUNSRUYobGlzdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGxpc3Q7CisgICAgbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmF3ID0gdHlwZS0+dHBfc3ViY2xhc3NlczsKKyAgICBpZiAocmF3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBsaXN0OworICAgIGFzc2VydChQeUxpc3RfQ2hlY2socmF3KSk7CisgICAgbiA9IFB5TGlzdF9HRVRfU0laRShyYXcpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgcmVmID0gUHlMaXN0X0dFVF9JVEVNKHJhdywgaSk7CisgICAgICAgIGFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7CisgICAgICAgIHJlZiA9IFB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZik7CisgICAgICAgIGlmIChyZWYgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgcmVmKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxpc3Q7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0eXBlX21ldGhvZHNbXSA9IHsKLQl7Im1ybyIsIChQeUNGdW5jdGlvbiltcm9fZXh0ZXJuYWwsIE1FVEhfTk9BUkdTLAotCSBQeURvY19TVFIoIm1ybygpIC0+IGxpc3RcbnJldHVybiBhIHR5cGUncyBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciIpfSwKLQl7Il9fc3ViY2xhc3Nlc19fIiwgKFB5Q0Z1bmN0aW9uKXR5cGVfc3ViY2xhc3NlcywgTUVUSF9OT0FSR1MsCi0JIFB5RG9jX1NUUigiX19zdWJjbGFzc2VzX18oKSAtPiBsaXN0IG9mIGltbWVkaWF0ZSBzdWJjbGFzc2VzIil9LAotCXswfQorICAgIHsibXJvIiwgKFB5Q0Z1bmN0aW9uKW1yb19leHRlcm5hbCwgTUVUSF9OT0FSR1MsCisgICAgIFB5RG9jX1NUUigibXJvKCkgLT4gbGlzdFxucmV0dXJuIGEgdHlwZSdzIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyIil9LAorICAgIHsiX19zdWJjbGFzc2VzX18iLCAoUHlDRnVuY3Rpb24pdHlwZV9zdWJjbGFzc2VzLCBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJfX3N1YmNsYXNzZXNfXygpIC0+IGxpc3Qgb2YgaW1tZWRpYXRlIHN1YmNsYXNzZXMiKX0sCisgICAgezB9CiB9OwogCiBQeURvY19TVFJWQVIodHlwZV9kb2MsCkBAIC0yNjY4LDEwOSArMjY2OCwxMDkgQEAKIHN0YXRpYyBpbnQKIHR5cGVfdHJhdmVyc2UoUHlUeXBlT2JqZWN0ICp0eXBlLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQkvKiBCZWNhdXNlIG9mIHR5cGVfaXNfZ2MoKSwgdGhlIGNvbGxlY3RvciBvbmx5IGNhbGxzIHRoaXMKLQkgICBmb3IgaGVhcHR5cGVzLiAqLwotCWFzc2VydCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpOworICAgIC8qIEJlY2F1c2Ugb2YgdHlwZV9pc19nYygpLCB0aGUgY29sbGVjdG9yIG9ubHkgY2FsbHMgdGhpcworICAgICAgIGZvciBoZWFwdHlwZXMuICovCisgICAgYXNzZXJ0KHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSk7CiAKLQlQeV9WSVNJVCh0eXBlLT50cF9kaWN0KTsKLQlQeV9WSVNJVCh0eXBlLT50cF9jYWNoZSk7Ci0JUHlfVklTSVQodHlwZS0+dHBfbXJvKTsKLQlQeV9WSVNJVCh0eXBlLT50cF9iYXNlcyk7Ci0JUHlfVklTSVQodHlwZS0+dHBfYmFzZSk7CisgICAgUHlfVklTSVQodHlwZS0+dHBfZGljdCk7CisgICAgUHlfVklTSVQodHlwZS0+dHBfY2FjaGUpOworICAgIFB5X1ZJU0lUKHR5cGUtPnRwX21ybyk7CisgICAgUHlfVklTSVQodHlwZS0+dHBfYmFzZXMpOworICAgIFB5X1ZJU0lUKHR5cGUtPnRwX2Jhc2UpOwogCi0JLyogVGhlcmUncyBubyBuZWVkIHRvIHZpc2l0IHR5cGUtPnRwX3N1YmNsYXNzZXMgb3IKLQkgICAoKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlKS0+aHRfc2xvdHMsIGJlY2F1c2UgdGhleSBjYW4ndCBiZSBpbnZvbHZlZAotCSAgIGluIGN5Y2xlczsgdHBfc3ViY2xhc3NlcyBpcyBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzLAotCSAgIGFuZCBzbG90cyBpcyBhIHR1cGxlIG9mIHN0cmluZ3MuICovCisgICAgLyogVGhlcmUncyBubyBuZWVkIHRvIHZpc2l0IHR5cGUtPnRwX3N1YmNsYXNzZXMgb3IKKyAgICAgICAoKFB5SGVhcFR5cGVPYmplY3QgKil0eXBlKS0+aHRfc2xvdHMsIGJlY2F1c2UgdGhleSBjYW4ndCBiZSBpbnZvbHZlZAorICAgICAgIGluIGN5Y2xlczsgdHBfc3ViY2xhc3NlcyBpcyBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzLAorICAgICAgIGFuZCBzbG90cyBpcyBhIHR1cGxlIG9mIHN0cmluZ3MuICovCiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogdHlwZV9jbGVhcihQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JLyogQmVjYXVzZSBvZiB0eXBlX2lzX2djKCksIHRoZSBjb2xsZWN0b3Igb25seSBjYWxscyB0aGlzCi0JICAgZm9yIGhlYXB0eXBlcy4gKi8KLQlhc3NlcnQodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKTsKKyAgICAvKiBCZWNhdXNlIG9mIHR5cGVfaXNfZ2MoKSwgdGhlIGNvbGxlY3RvciBvbmx5IGNhbGxzIHRoaXMKKyAgICAgICBmb3IgaGVhcHR5cGVzLiAqLworICAgIGFzc2VydCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpOwogCi0JLyogVGhlIG9ubHkgZmllbGQgd2UgbmVlZCB0byBjbGVhciBpcyB0cF9tcm8sIHdoaWNoIGlzIHBhcnQgb2YgYQotCSAgIGhhcmQgY3ljbGUgKGl0cyBmaXJzdCBlbGVtZW50IGlzIHRoZSBjbGFzcyBpdHNlbGYpIHRoYXQgd29uJ3QKLQkgICBiZSBicm9rZW4gb3RoZXJ3aXNlIChpdCdzIGEgdHVwbGUgYW5kIHR1cGxlcyBkb24ndCBoYXZlIGEKLQkgICB0cF9jbGVhciBoYW5kbGVyKS4gIE5vbmUgb2YgdGhlIG90aGVyIGZpZWxkcyBuZWVkIHRvIGJlCi0JICAgY2xlYXJlZCwgYW5kIGhlcmUncyB3aHk6CisgICAgLyogVGhlIG9ubHkgZmllbGQgd2UgbmVlZCB0byBjbGVhciBpcyB0cF9tcm8sIHdoaWNoIGlzIHBhcnQgb2YgYQorICAgICAgIGhhcmQgY3ljbGUgKGl0cyBmaXJzdCBlbGVtZW50IGlzIHRoZSBjbGFzcyBpdHNlbGYpIHRoYXQgd29uJ3QKKyAgICAgICBiZSBicm9rZW4gb3RoZXJ3aXNlIChpdCdzIGEgdHVwbGUgYW5kIHR1cGxlcyBkb24ndCBoYXZlIGEKKyAgICAgICB0cF9jbGVhciBoYW5kbGVyKS4gIE5vbmUgb2YgdGhlIG90aGVyIGZpZWxkcyBuZWVkIHRvIGJlCisgICAgICAgY2xlYXJlZCwgYW5kIGhlcmUncyB3aHk6CiAKLQkgICB0cF9kaWN0OgotCSAgICAgICBJdCBpcyBhIGRpY3QsIHNvIHRoZSBjb2xsZWN0b3Igd2lsbCBjYWxsIGl0cyB0cF9jbGVhci4KKyAgICAgICB0cF9kaWN0OgorICAgICAgICAgICBJdCBpcyBhIGRpY3QsIHNvIHRoZSBjb2xsZWN0b3Igd2lsbCBjYWxsIGl0cyB0cF9jbGVhci4KIAotCSAgIHRwX2NhY2hlOgotCSAgICAgICBOb3QgdXNlZDsgaWYgaXQgd2VyZSwgaXQgd291bGQgYmUgYSBkaWN0LgorICAgICAgIHRwX2NhY2hlOgorICAgICAgICAgICBOb3QgdXNlZDsgaWYgaXQgd2VyZSwgaXQgd291bGQgYmUgYSBkaWN0LgogCi0JICAgdHBfYmFzZXMsIHRwX2Jhc2U6Ci0JICAgICAgIElmIHRoZXNlIGFyZSBpbnZvbHZlZCBpbiBhIGN5Y2xlLCB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0Ci0JICAgICAgIG9uZSBvdGhlciwgbXV0YWJsZSBvYmplY3QgaW4gdGhlIGN5Y2xlLCBlLmcuIGEgYmFzZQotCSAgICAgICBjbGFzcydzIGRpY3Q7IHRoZSBjeWNsZSB3aWxsIGJlIGJyb2tlbiB0aGF0IHdheS4KKyAgICAgICB0cF9iYXNlcywgdHBfYmFzZToKKyAgICAgICAgICAgSWYgdGhlc2UgYXJlIGludm9sdmVkIGluIGEgY3ljbGUsIHRoZXJlIG11c3QgYmUgYXQgbGVhc3QKKyAgICAgICAgICAgb25lIG90aGVyLCBtdXRhYmxlIG9iamVjdCBpbiB0aGUgY3ljbGUsIGUuZy4gYSBiYXNlCisgICAgICAgICAgIGNsYXNzJ3MgZGljdDsgdGhlIGN5Y2xlIHdpbGwgYmUgYnJva2VuIHRoYXQgd2F5LgogCi0JICAgdHBfc3ViY2xhc3NlczoKLQkgICAgICAgQSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyBjYW4ndCBiZSBwYXJ0IG9mIGEgY3ljbGU7IGFuZAotCSAgICAgICBsaXN0cyBoYXZlIHRoZWlyIG93biB0cF9jbGVhci4KKyAgICAgICB0cF9zdWJjbGFzc2VzOgorICAgICAgICAgICBBIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIGNhbid0IGJlIHBhcnQgb2YgYSBjeWNsZTsgYW5kCisgICAgICAgICAgIGxpc3RzIGhhdmUgdGhlaXIgb3duIHRwX2NsZWFyLgogCi0JICAgc2xvdHMgKGluIFB5SGVhcFR5cGVPYmplY3QpOgotCSAgICAgICBBIHR1cGxlIG9mIHN0cmluZ3MgY2FuJ3QgYmUgcGFydCBvZiBhIGN5Y2xlLgotCSovCisgICAgICAgc2xvdHMgKGluIFB5SGVhcFR5cGVPYmplY3QpOgorICAgICAgICAgICBBIHR1cGxlIG9mIHN0cmluZ3MgY2FuJ3QgYmUgcGFydCBvZiBhIGN5Y2xlLgorICAgICovCiAKLQlQeV9DTEVBUih0eXBlLT50cF9tcm8pOworICAgIFB5X0NMRUFSKHR5cGUtPnRwX21ybyk7CiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogdHlwZV9pc19nYyhQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JcmV0dXJuIHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRTsKKyAgICByZXR1cm4gdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFOwogfQogCiBQeVR5cGVPYmplY3QgUHlUeXBlX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkidHlwZSIsCQkJCQkvKiB0cF9uYW1lICovCi0Jc2l6ZW9mKFB5SGVhcFR5cGVPYmplY3QpLAkJLyogdHBfYmFzaWNzaXplICovCi0Jc2l6ZW9mKFB5TWVtYmVyRGVmKSwJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCShkZXN0cnVjdG9yKXR5cGVfZGVhbGxvYywJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJLyogdHBfY29tcGFyZSAqLwotCShyZXByZnVuYyl0eXBlX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCQkJLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYylfUHlfSGFzaFBvaW50ZXIsCQkvKiB0cF9oYXNoICovCi0JKHRlcm5hcnlmdW5jKXR5cGVfY2FsbCwJCQkvKiB0cF9jYWxsICovCi0JMCwJCQkJCS8qIHRwX3N0ciAqLwotCShnZXRhdHRyb2Z1bmMpdHlwZV9nZXRhdHRybywJCS8qIHRwX2dldGF0dHJvICovCi0JKHNldGF0dHJvZnVuYyl0eXBlX3NldGF0dHJvLAkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfVFlQRV9TVUJDTEFTUywJLyogdHBfZmxhZ3MgKi8KLQl0eXBlX2RvYywJCQkJLyogdHBfZG9jICovCi0JKHRyYXZlcnNlcHJvYyl0eXBlX3RyYXZlcnNlLAkJLyogdHBfdHJhdmVyc2UgKi8KLQkoaW5xdWlyeSl0eXBlX2NsZWFyLAkJCS8qIHRwX2NsZWFyICovCi0JdHlwZV9yaWNoY29tcGFyZSwJCQkJCS8qIHRwX3JpY2hjb21wYXJlICovCi0Jb2Zmc2V0b2YoUHlUeXBlT2JqZWN0LCB0cF93ZWFrbGlzdCksCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0JMCwJCQkJCS8qIHRwX2l0ZXIgKi8KLQkwLAkJCQkJLyogdHBfaXRlcm5leHQgKi8KLQl0eXBlX21ldGhvZHMsCQkJCS8qIHRwX21ldGhvZHMgKi8KLQl0eXBlX21lbWJlcnMsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQl0eXBlX2dldHNldHMsCQkJCS8qIHRwX2dldHNldCAqLwotCTAsCQkJCQkvKiB0cF9iYXNlICovCi0JMCwJCQkJCS8qIHRwX2RpY3QgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3JfZ2V0ICovCi0JMCwJCQkJCS8qIHRwX2Rlc2NyX3NldCAqLwotCW9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfZGljdCksCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQl0eXBlX2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQkwLAkJCQkJLyogdHBfYWxsb2MgKi8KLQl0eXBlX25ldywJCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJCS8qIHRwX2ZyZWUgKi8KLQkoaW5xdWlyeSl0eXBlX2lzX2djLAkJCS8qIHRwX2lzX2djICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAidHlwZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICBzaXplb2YoUHlIZWFwVHlwZU9iamVjdCksICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgIHNpemVvZihQeU1lbWJlckRlZiksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAoZGVzdHJ1Y3Rvcil0eXBlX2RlYWxsb2MsICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgIChyZXByZnVuYyl0eXBlX3JlcHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYylfUHlfSGFzaFBvaW50ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICh0ZXJuYXJ5ZnVuYyl0eXBlX2NhbGwsICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgKGdldGF0dHJvZnVuYyl0eXBlX2dldGF0dHJvLCAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIChzZXRhdHRyb2Z1bmMpdHlwZV9zZXRhdHRybywgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8CisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1MsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICB0eXBlX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpdHlwZV90cmF2ZXJzZSwgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAoaW5xdWlyeSl0eXBlX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgdHlwZV9yaWNoY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeVR5cGVPYmplY3QsIHRwX3dlYWtsaXN0KSwgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIHR5cGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHR5cGVfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIHR5cGVfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgdHBfZGljdCksICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIHR5cGVfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICB0eXBlX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIChpbnF1aXJ5KXR5cGVfaXNfZ2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXNfZ2MgKi8KIH07CiAKIApAQCAtMjgyMywyODIgKzI4MjMsMjgyIEBACiBzdGF0aWMgaW50CiBleGNlc3NfYXJncyhQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcmV0dXJuIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgfHwKLQkJKGt3ZHMgJiYgUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpKTsKKyAgICByZXR1cm4gUHlUdXBsZV9HRVRfU0laRShhcmdzKSB8fAorICAgICAgICAoa3dkcyAmJiBQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykpOwogfQogCiBzdGF0aWMgaW50CiBvYmplY3RfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWludCBlcnIgPSAwOwotCWlmIChleGNlc3NfYXJncyhhcmdzLCBrd2RzKSkgewotCQlQeVR5cGVPYmplY3QgKnR5cGUgPSBQeV9UWVBFKHNlbGYpOwotCQlpZiAodHlwZS0+dHBfaW5pdCAhPSBvYmplY3RfaW5pdCAmJgotCQkgICAgdHlwZS0+dHBfbmV3ICE9IG9iamVjdF9uZXcpCi0JCXsKLQkJCWVyciA9IFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJICAgIm9iamVjdC5fX2luaXRfXygpIHRha2VzIG5vIHBhcmFtZXRlcnMiLAotCQkJCSAgIDEpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUtPnRwX2luaXQgIT0gb2JqZWN0X2luaXQgfHwKLQkJCSB0eXBlLT50cF9uZXcgPT0gb2JqZWN0X25ldykKLQkJewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkib2JqZWN0Ll9faW5pdF9fKCkgdGFrZXMgbm8gcGFyYW1ldGVycyIpOwotCQkJZXJyID0gLTE7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKKyAgICBpbnQgZXJyID0gMDsKKyAgICBpZiAoZXhjZXNzX2FyZ3MoYXJncywga3dkcykpIHsKKyAgICAgICAgUHlUeXBlT2JqZWN0ICp0eXBlID0gUHlfVFlQRShzZWxmKTsKKyAgICAgICAgaWYgKHR5cGUtPnRwX2luaXQgIT0gb2JqZWN0X2luaXQgJiYKKyAgICAgICAgICAgIHR5cGUtPnRwX25ldyAhPSBvYmplY3RfbmV3KQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0Ll9faW5pdF9fKCkgdGFrZXMgbm8gcGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR5cGUtPnRwX2luaXQgIT0gb2JqZWN0X2luaXQgfHwKKyAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmV3ID09IG9iamVjdF9uZXcpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIm9iamVjdC5fX2luaXRfXygpIHRha2VzIG5vIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvYmplY3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWludCBlcnIgPSAwOwotCWlmIChleGNlc3NfYXJncyhhcmdzLCBrd2RzKSkgewotCQlpZiAodHlwZS0+dHBfbmV3ICE9IG9iamVjdF9uZXcgJiYKLQkJICAgIHR5cGUtPnRwX2luaXQgIT0gb2JqZWN0X2luaXQpCi0JCXsKLQkJCWVyciA9IFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJICAgIm9iamVjdC5fX25ld19fKCkgdGFrZXMgbm8gcGFyYW1ldGVycyIsCi0JCQkJICAgMSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZS0+dHBfbmV3ICE9IG9iamVjdF9uZXcgfHwKLQkJCSB0eXBlLT50cF9pbml0ID09IG9iamVjdF9pbml0KQotCQl7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJvYmplY3QuX19uZXdfXygpIHRha2VzIG5vIHBhcmFtZXRlcnMiKTsKLQkJCWVyciA9IC0xOwotCQl9Ci0JfQotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgZXJyID0gMDsKKyAgICBpZiAoZXhjZXNzX2FyZ3MoYXJncywga3dkcykpIHsKKyAgICAgICAgaWYgKHR5cGUtPnRwX25ldyAhPSBvYmplY3RfbmV3ICYmCisgICAgICAgICAgICB0eXBlLT50cF9pbml0ICE9IG9iamVjdF9pbml0KQorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0Ll9fbmV3X18oKSB0YWtlcyBubyBwYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZS0+dHBfbmV3ICE9IG9iamVjdF9uZXcgfHwKKyAgICAgICAgICAgICAgICAgdHlwZS0+dHBfaW5pdCA9PSBvYmplY3RfaW5pdCkKKyAgICAgICAgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAib2JqZWN0Ll9fbmV3X18oKSB0YWtlcyBubyBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0lTX0FCU1RSQUNUKSB7Ci0JCXN0YXRpYyBQeU9iamVjdCAqY29tbWEgPSBOVUxMOwotCQlQeU9iamVjdCAqYWJzdHJhY3RfbWV0aG9kcyA9IE5VTEw7Ci0JCVB5T2JqZWN0ICpidWlsdGluczsKLQkJUHlPYmplY3QgKnNvcnRlZDsKLQkJUHlPYmplY3QgKnNvcnRlZF9tZXRob2RzID0gTlVMTDsKLQkJUHlPYmplY3QgKmpvaW5lZCA9IE5VTEw7Ci0JCWNvbnN0IGNoYXIgKmpvaW5lZF9zdHI7CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19JU19BQlNUUkFDVCkgeworICAgICAgICBzdGF0aWMgUHlPYmplY3QgKmNvbW1hID0gTlVMTDsKKyAgICAgICAgUHlPYmplY3QgKmFic3RyYWN0X21ldGhvZHMgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqYnVpbHRpbnM7CisgICAgICAgIFB5T2JqZWN0ICpzb3J0ZWQ7CisgICAgICAgIFB5T2JqZWN0ICpzb3J0ZWRfbWV0aG9kcyA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICpqb2luZWQgPSBOVUxMOworICAgICAgICBjb25zdCBjaGFyICpqb2luZWRfc3RyOwogCi0JCS8qIENvbXB1dGUgIiwgIi5qb2luKHNvcnRlZCh0eXBlLl9fYWJzdHJhY3RtZXRob2RzX18pKQotCQkgICBpbnRvIGpvaW5lZC4gKi8KLQkJYWJzdHJhY3RfbWV0aG9kcyA9IHR5cGVfYWJzdHJhY3RtZXRob2RzKHR5cGUsIE5VTEwpOwotCQlpZiAoYWJzdHJhY3RfbWV0aG9kcyA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJYnVpbHRpbnMgPSBQeUV2YWxfR2V0QnVpbHRpbnMoKTsKLQkJaWYgKGJ1aWx0aW5zID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQlzb3J0ZWQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhidWlsdGlucywgInNvcnRlZCIpOwotCQlpZiAoc29ydGVkID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQlzb3J0ZWRfbWV0aG9kcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moc29ydGVkLAotCQkJCQkJCSAgICAgIGFic3RyYWN0X21ldGhvZHMsCi0JCQkJCQkJICAgICAgTlVMTCk7Ci0JCWlmIChzb3J0ZWRfbWV0aG9kcyA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKGNvbW1hID09IE5VTEwpIHsKLQkJCWNvbW1hID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiLCAiKTsKLQkJCWlmIChjb21tYSA9PSBOVUxMKQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQkJam9pbmVkID0gUHlPYmplY3RfQ2FsbE1ldGhvZChjb21tYSwgImpvaW4iLAotCQkJCQkgICAgICJPIiwgIHNvcnRlZF9tZXRob2RzKTsKLQkJaWYgKGpvaW5lZCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJam9pbmVkX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKGpvaW5lZCk7Ci0JCWlmIChqb2luZWRfc3RyID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOworICAgICAgICAvKiBDb21wdXRlICIsICIuam9pbihzb3J0ZWQodHlwZS5fX2Fic3RyYWN0bWV0aG9kc19fKSkKKyAgICAgICAgICAgaW50byBqb2luZWQuICovCisgICAgICAgIGFic3RyYWN0X21ldGhvZHMgPSB0eXBlX2Fic3RyYWN0bWV0aG9kcyh0eXBlLCBOVUxMKTsKKyAgICAgICAgaWYgKGFic3RyYWN0X21ldGhvZHMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGJ1aWx0aW5zID0gUHlFdmFsX0dldEJ1aWx0aW5zKCk7CisgICAgICAgIGlmIChidWlsdGlucyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgc29ydGVkID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoYnVpbHRpbnMsICJzb3J0ZWQiKTsKKyAgICAgICAgaWYgKHNvcnRlZCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgc29ydGVkX21ldGhvZHMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHNvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0X21ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgaWYgKHNvcnRlZF9tZXRob2RzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAoY29tbWEgPT0gTlVMTCkgeworICAgICAgICAgICAgY29tbWEgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCIsICIpOworICAgICAgICAgICAgaWYgKGNvbW1hID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBqb2luZWQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGNvbW1hLCAiam9pbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk8iLCAgc29ydGVkX21ldGhvZHMpOworICAgICAgICBpZiAoam9pbmVkID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBqb2luZWRfc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoam9pbmVkKTsKKyAgICAgICAgaWYgKGpvaW5lZF9zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIkNhbid0IGluc3RhbnRpYXRlIGFic3RyYWN0IGNsYXNzICVzICIKLQkJCSAgICAgIndpdGggYWJzdHJhY3QgbWV0aG9kcyAlcyIsCi0JCQkgICAgIHR5cGUtPnRwX25hbWUsCi0JCQkgICAgIGpvaW5lZF9zdHIpOwotCWVycm9yOgotCQlQeV9YREVDUkVGKGpvaW5lZCk7Ci0JCVB5X1hERUNSRUYoc29ydGVkX21ldGhvZHMpOwotCQlQeV9YREVDUkVGKGFic3RyYWN0X21ldGhvZHMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkNhbid0IGluc3RhbnRpYXRlIGFic3RyYWN0IGNsYXNzICVzICIKKyAgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFic3RyYWN0IG1ldGhvZHMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGpvaW5lZF9zdHIpOworICAgIGVycm9yOgorICAgICAgICBQeV9YREVDUkVGKGpvaW5lZCk7CisgICAgICAgIFB5X1hERUNSRUYoc29ydGVkX21ldGhvZHMpOworICAgICAgICBQeV9YREVDUkVGKGFic3RyYWN0X21ldGhvZHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApOwogfQogCiBzdGF0aWMgdm9pZAogb2JqZWN0X2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqZWN0X3JlcHIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlOwotCVB5T2JqZWN0ICptb2QsICpuYW1lLCAqcnRuOworICAgIFB5VHlwZU9iamVjdCAqdHlwZTsKKyAgICBQeU9iamVjdCAqbW9kLCAqbmFtZSwgKnJ0bjsKIAotCXR5cGUgPSBQeV9UWVBFKHNlbGYpOwotCW1vZCA9IHR5cGVfbW9kdWxlKHR5cGUsIE5VTEwpOwotCWlmIChtb2QgPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlIGlmICghUHlTdHJpbmdfQ2hlY2sobW9kKSkgewotCQlQeV9ERUNSRUYobW9kKTsKLQkJbW9kID0gTlVMTDsKLQl9Ci0JbmFtZSA9IHR5cGVfbmFtZSh0eXBlLCBOVUxMKTsKLQlpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobW9kICE9IE5VTEwgJiYgc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLCAiX19idWlsdGluX18iKSkKLQkJcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzLiVzIG9iamVjdCBhdCAlcD4iLAotCQkJCQkgIFB5U3RyaW5nX0FTX1NUUklORyhtb2QpLAotCQkJCQkgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwKLQkJCQkJICBzZWxmKTsKLQllbHNlCi0JCXJ0biA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIjwlcyBvYmplY3QgYXQgJXA+IiwKLQkJCQkJICB0eXBlLT50cF9uYW1lLCBzZWxmKTsKLQlQeV9YREVDUkVGKG1vZCk7Ci0JUHlfREVDUkVGKG5hbWUpOwotCXJldHVybiBydG47CisgICAgdHlwZSA9IFB5X1RZUEUoc2VsZik7CisgICAgbW9kID0gdHlwZV9tb2R1bGUodHlwZSwgTlVMTCk7CisgICAgaWYgKG1vZCA9PSBOVUxMKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIGVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhtb2QpKSB7CisgICAgICAgIFB5X0RFQ1JFRihtb2QpOworICAgICAgICBtb2QgPSBOVUxMOworICAgIH0KKyAgICBuYW1lID0gdHlwZV9uYW1lKHR5cGUsIE5VTEwpOworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChtb2QgIT0gTlVMTCAmJiBzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCksICJfX2J1aWx0aW5fXyIpKQorICAgICAgICBydG4gPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMuJXMgb2JqZWN0IGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG1vZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOworICAgIGVsc2UKKyAgICAgICAgcnRuID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsIHNlbGYpOworICAgIFB5X1hERUNSRUYobW9kKTsKKyAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJ0bjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9iamVjdF9zdHIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JdW5hcnlmdW5jIGY7CisgICAgdW5hcnlmdW5jIGY7CiAKLQlmID0gUHlfVFlQRShzZWxmKS0+dHBfcmVwcjsKLQlpZiAoZiA9PSBOVUxMKQotCQlmID0gb2JqZWN0X3JlcHI7Ci0JcmV0dXJuIGYoc2VsZik7CisgICAgZiA9IFB5X1RZUEUoc2VsZiktPnRwX3JlcHI7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgZiA9IG9iamVjdF9yZXByOworICAgIHJldHVybiBmKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqZWN0X2dldF9jbGFzcyhQeU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeV9JTkNSRUYoUHlfVFlQRShzZWxmKSk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKTsKKyAgICBQeV9JTkNSRUYoUHlfVFlQRShzZWxmKSk7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKShQeV9UWVBFKHNlbGYpKTsKIH0KIAogc3RhdGljIGludAogZXF1aXZfc3RydWN0cyhQeVR5cGVPYmplY3QgKmEsIFB5VHlwZU9iamVjdCAqYikKIHsKLQlyZXR1cm4gYSA9PSBiIHx8Ci0JICAgICAgIChhICE9IE5VTEwgJiYKLQkJYiAhPSBOVUxMICYmCi0JCWEtPnRwX2Jhc2ljc2l6ZSA9PSBiLT50cF9iYXNpY3NpemUgJiYKLQkJYS0+dHBfaXRlbXNpemUgPT0gYi0+dHBfaXRlbXNpemUgJiYKLQkJYS0+dHBfZGljdG9mZnNldCA9PSBiLT50cF9kaWN0b2Zmc2V0ICYmCi0JCWEtPnRwX3dlYWtsaXN0b2Zmc2V0ID09IGItPnRwX3dlYWtsaXN0b2Zmc2V0ICYmCi0JCSgoYS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpID09Ci0JCSAoYi0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpKSk7CisgICAgcmV0dXJuIGEgPT0gYiB8fAorICAgICAgICAgICAoYSAhPSBOVUxMICYmCisgICAgICAgIGIgIT0gTlVMTCAmJgorICAgICAgICBhLT50cF9iYXNpY3NpemUgPT0gYi0+dHBfYmFzaWNzaXplICYmCisgICAgICAgIGEtPnRwX2l0ZW1zaXplID09IGItPnRwX2l0ZW1zaXplICYmCisgICAgICAgIGEtPnRwX2RpY3RvZmZzZXQgPT0gYi0+dHBfZGljdG9mZnNldCAmJgorICAgICAgICBhLT50cF93ZWFrbGlzdG9mZnNldCA9PSBiLT50cF93ZWFrbGlzdG9mZnNldCAmJgorICAgICAgICAoKGEtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSA9PQorICAgICAgICAgKGItPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSkpOwogfQogCiBzdGF0aWMgaW50CiBzYW1lX3Nsb3RzX2FkZGVkKFB5VHlwZU9iamVjdCAqYSwgUHlUeXBlT2JqZWN0ICpiKQogewotCVB5VHlwZU9iamVjdCAqYmFzZSA9IGEtPnRwX2Jhc2U7Ci0JUHlfc3NpemVfdCBzaXplOwotCVB5T2JqZWN0ICpzbG90c19hLCAqc2xvdHNfYjsKKyAgICBQeVR5cGVPYmplY3QgKmJhc2UgPSBhLT50cF9iYXNlOworICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICBQeU9iamVjdCAqc2xvdHNfYSwgKnNsb3RzX2I7CiAKLQlpZiAoYmFzZSAhPSBiLT50cF9iYXNlKQotCQlyZXR1cm4gMDsKLQlpZiAoZXF1aXZfc3RydWN0cyhhLCBiYXNlKSAmJiBlcXVpdl9zdHJ1Y3RzKGIsIGJhc2UpKQotCQlyZXR1cm4gMTsKLQlzaXplID0gYmFzZS0+dHBfYmFzaWNzaXplOwotCWlmIChhLT50cF9kaWN0b2Zmc2V0ID09IHNpemUgJiYgYi0+dHBfZGljdG9mZnNldCA9PSBzaXplKQotCQlzaXplICs9IHNpemVvZihQeU9iamVjdCAqKTsKLQlpZiAoYS0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gc2l6ZSAmJiBiLT50cF93ZWFrbGlzdG9mZnNldCA9PSBzaXplKQotCQlzaXplICs9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICBpZiAoYmFzZSAhPSBiLT50cF9iYXNlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZXF1aXZfc3RydWN0cyhhLCBiYXNlKSAmJiBlcXVpdl9zdHJ1Y3RzKGIsIGJhc2UpKQorICAgICAgICByZXR1cm4gMTsKKyAgICBzaXplID0gYmFzZS0+dHBfYmFzaWNzaXplOworICAgIGlmIChhLT50cF9kaWN0b2Zmc2V0ID09IHNpemUgJiYgYi0+dHBfZGljdG9mZnNldCA9PSBzaXplKQorICAgICAgICBzaXplICs9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICBpZiAoYS0+dHBfd2Vha2xpc3RvZmZzZXQgPT0gc2l6ZSAmJiBiLT50cF93ZWFrbGlzdG9mZnNldCA9PSBzaXplKQorICAgICAgICBzaXplICs9IHNpemVvZihQeU9iamVjdCAqKTsKIAotCS8qIENoZWNrIHNsb3RzIGNvbXBsaWFuY2UgKi8KLQlzbG90c19hID0gKChQeUhlYXBUeXBlT2JqZWN0ICopYSktPmh0X3Nsb3RzOwotCXNsb3RzX2IgPSAoKFB5SGVhcFR5cGVPYmplY3QgKiliKS0+aHRfc2xvdHM7Ci0JaWYgKHNsb3RzX2EgJiYgc2xvdHNfYikgewotCQlpZiAoUHlPYmplY3RfQ29tcGFyZShzbG90c19hLCBzbG90c19iKSAhPSAwKQotCQkJcmV0dXJuIDA7Ci0JCXNpemUgKz0gc2l6ZW9mKFB5T2JqZWN0ICopICogUHlUdXBsZV9HRVRfU0laRShzbG90c19hKTsKLQl9Ci0JcmV0dXJuIHNpemUgPT0gYS0+dHBfYmFzaWNzaXplICYmIHNpemUgPT0gYi0+dHBfYmFzaWNzaXplOworICAgIC8qIENoZWNrIHNsb3RzIGNvbXBsaWFuY2UgKi8KKyAgICBzbG90c19hID0gKChQeUhlYXBUeXBlT2JqZWN0ICopYSktPmh0X3Nsb3RzOworICAgIHNsb3RzX2IgPSAoKFB5SGVhcFR5cGVPYmplY3QgKiliKS0+aHRfc2xvdHM7CisgICAgaWYgKHNsb3RzX2EgJiYgc2xvdHNfYikgeworICAgICAgICBpZiAoUHlPYmplY3RfQ29tcGFyZShzbG90c19hLCBzbG90c19iKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHNpemUgKz0gc2l6ZW9mKFB5T2JqZWN0ICopICogUHlUdXBsZV9HRVRfU0laRShzbG90c19hKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemUgPT0gYS0+dHBfYmFzaWNzaXplICYmIHNpemUgPT0gYi0+dHBfYmFzaWNzaXplOwogfQogCiBzdGF0aWMgaW50CiBjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KFB5VHlwZU9iamVjdCogb2xkdG8sIFB5VHlwZU9iamVjdCogbmV3dG8sIGNoYXIqIGF0dHIpCiB7Ci0JUHlUeXBlT2JqZWN0ICpuZXdiYXNlLCAqb2xkYmFzZTsKKyAgICBQeVR5cGVPYmplY3QgKm5ld2Jhc2UsICpvbGRiYXNlOwogCi0JaWYgKG5ld3RvLT50cF9kZWFsbG9jICE9IG9sZHRvLT50cF9kZWFsbG9jIHx8Ci0JICAgIG5ld3RvLT50cF9mcmVlICE9IG9sZHRvLT50cF9mcmVlKQotCXsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiVzIGFzc2lnbm1lbnQ6ICIKLQkJCSAgICAgIiclcycgZGVhbGxvY2F0b3IgZGlmZmVycyBmcm9tICclcyciLAotCQkJICAgICBhdHRyLAotCQkJICAgICBuZXd0by0+dHBfbmFtZSwKLQkJCSAgICAgb2xkdG8tPnRwX25hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JbmV3YmFzZSA9IG5ld3RvOwotCW9sZGJhc2UgPSBvbGR0bzsKLQl3aGlsZSAoZXF1aXZfc3RydWN0cyhuZXdiYXNlLCBuZXdiYXNlLT50cF9iYXNlKSkKLQkJbmV3YmFzZSA9IG5ld2Jhc2UtPnRwX2Jhc2U7Ci0Jd2hpbGUgKGVxdWl2X3N0cnVjdHMob2xkYmFzZSwgb2xkYmFzZS0+dHBfYmFzZSkpCi0JCW9sZGJhc2UgPSBvbGRiYXNlLT50cF9iYXNlOwotCWlmIChuZXdiYXNlICE9IG9sZGJhc2UgJiYKLQkgICAgKG5ld2Jhc2UtPnRwX2Jhc2UgIT0gb2xkYmFzZS0+dHBfYmFzZSB8fAotCSAgICAgIXNhbWVfc2xvdHNfYWRkZWQobmV3YmFzZSwgb2xkYmFzZSkpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIlcyBhc3NpZ25tZW50OiAiCi0JCQkgICAgICInJXMnIG9iamVjdCBsYXlvdXQgZGlmZmVycyBmcm9tICclcyciLAotCQkJICAgICBhdHRyLAotCQkJICAgICBuZXd0by0+dHBfbmFtZSwKLQkJCSAgICAgb2xkdG8tPnRwX25hbWUpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKG5ld3RvLT50cF9kZWFsbG9jICE9IG9sZHRvLT50cF9kZWFsbG9jIHx8CisgICAgICAgIG5ld3RvLT50cF9mcmVlICE9IG9sZHRvLT50cF9mcmVlKQorICAgIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlcyBhc3NpZ25tZW50OiAiCisgICAgICAgICAgICAgICAgICAgICAiJyVzJyBkZWFsbG9jYXRvciBkaWZmZXJzIGZyb20gJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgbmV3dG8tPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBvbGR0by0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBuZXdiYXNlID0gbmV3dG87CisgICAgb2xkYmFzZSA9IG9sZHRvOworICAgIHdoaWxlIChlcXVpdl9zdHJ1Y3RzKG5ld2Jhc2UsIG5ld2Jhc2UtPnRwX2Jhc2UpKQorICAgICAgICBuZXdiYXNlID0gbmV3YmFzZS0+dHBfYmFzZTsKKyAgICB3aGlsZSAoZXF1aXZfc3RydWN0cyhvbGRiYXNlLCBvbGRiYXNlLT50cF9iYXNlKSkKKyAgICAgICAgb2xkYmFzZSA9IG9sZGJhc2UtPnRwX2Jhc2U7CisgICAgaWYgKG5ld2Jhc2UgIT0gb2xkYmFzZSAmJgorICAgICAgICAobmV3YmFzZS0+dHBfYmFzZSAhPSBvbGRiYXNlLT50cF9iYXNlIHx8CisgICAgICAgICAhc2FtZV9zbG90c19hZGRlZChuZXdiYXNlLCBvbGRiYXNlKSkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlcyBhc3NpZ25tZW50OiAiCisgICAgICAgICAgICAgICAgICAgICAiJyVzJyBvYmplY3QgbGF5b3V0IGRpZmZlcnMgZnJvbSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICBuZXd0by0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIG9sZHRvLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIG9iamVjdF9zZXRfY2xhc3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeVR5cGVPYmplY3QgKm9sZHRvID0gUHlfVFlQRShzZWxmKTsKLQlQeVR5cGVPYmplY3QgKm5ld3RvOworICAgIFB5VHlwZU9iamVjdCAqb2xkdG8gPSBQeV9UWVBFKHNlbGYpOworICAgIFB5VHlwZU9iamVjdCAqbmV3dG87CiAKLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjYW4ndCBkZWxldGUgX19jbGFzc19fIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghUHlUeXBlX0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICJfX2NsYXNzX18gbXVzdCBiZSBzZXQgdG8gbmV3LXN0eWxlIGNsYXNzLCBub3QgJyVzJyBvYmplY3QiLAotCQkgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQluZXd0byA9IChQeVR5cGVPYmplY3QgKil2YWx1ZTsKLQlpZiAoIShuZXd0by0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSB8fAotCSAgICAhKG9sZHRvLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQotCXsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIl9fY2xhc3NfXyBhc3NpZ25tZW50OiBvbmx5IGZvciBoZWFwIHR5cGVzIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGNvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQobmV3dG8sIG9sZHRvLCAiX19jbGFzc19fIikpIHsKLQkJUHlfSU5DUkVGKG5ld3RvKTsKLQkJUHlfVFlQRShzZWxmKSA9IG5ld3RvOwotCQlQeV9ERUNSRUYob2xkdG8pOwotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgX19jbGFzc19fIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghUHlUeXBlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICJfX2NsYXNzX18gbXVzdCBiZSBzZXQgdG8gbmV3LXN0eWxlIGNsYXNzLCBub3QgJyVzJyBvYmplY3QiLAorICAgICAgICAgIFB5X1RZUEUodmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBuZXd0byA9IChQeVR5cGVPYmplY3QgKil2YWx1ZTsKKyAgICBpZiAoIShuZXd0by0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKSB8fAorICAgICAgICAhKG9sZHRvLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQorICAgIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJfX2NsYXNzX18gYXNzaWdubWVudDogb25seSBmb3IgaGVhcCB0eXBlcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KG5ld3RvLCBvbGR0bywgIl9fY2xhc3NfXyIpKSB7CisgICAgICAgIFB5X0lOQ1JFRihuZXd0byk7CisgICAgICAgIFB5X1RZUEUoc2VsZikgPSBuZXd0bzsKKyAgICAgICAgUHlfREVDUkVGKG9sZHRvKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgb2JqZWN0X2dldHNldHNbXSA9IHsKLQl7Il9fY2xhc3NfXyIsIG9iamVjdF9nZXRfY2xhc3MsIG9iamVjdF9zZXRfY2xhc3MsCi0JIFB5RG9jX1NUUigidGhlIG9iamVjdCdzIGNsYXNzIil9LAotCXswfQorICAgIHsiX19jbGFzc19fIiwgb2JqZWN0X2dldF9jbGFzcywgb2JqZWN0X3NldF9jbGFzcywKKyAgICAgUHlEb2NfU1RSKCJ0aGUgb2JqZWN0J3MgY2xhc3MiKX0sCisgICAgezB9CiB9OwogCiAKQEAgLTMxMTIsMTkwICszMTEyLDE5MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGltcG9ydF9jb3B5cmVnKHZvaWQpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjb3B5cmVnX3N0cjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNvcHlyZWdfc3RyOwogCi0JaWYgKCFjb3B5cmVnX3N0cikgewotCQljb3B5cmVnX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoImNvcHlfcmVnIik7Ci0JCWlmIChjb3B5cmVnX3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghY29weXJlZ19zdHIpIHsKKyAgICAgICAgY29weXJlZ19zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJjb3B5X3JlZyIpOworICAgICAgICBpZiAoY29weXJlZ19zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJldHVybiBQeUltcG9ydF9JbXBvcnQoY29weXJlZ19zdHIpOworICAgIHJldHVybiBQeUltcG9ydF9JbXBvcnQoY29weXJlZ19zdHIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdG5hbWVzKFB5T2JqZWN0ICpjbHMpCiB7Ci0JUHlPYmplY3QgKmNsc2RpY3Q7Ci0JUHlPYmplY3QgKmNvcHlyZWc7Ci0JUHlPYmplY3QgKnNsb3RuYW1lczsKKyAgICBQeU9iamVjdCAqY2xzZGljdDsKKyAgICBQeU9iamVjdCAqY29weXJlZzsKKyAgICBQeU9iamVjdCAqc2xvdG5hbWVzOwogCi0JaWYgKCFQeVR5cGVfQ2hlY2soY2xzKSkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KKyAgICBpZiAoIVB5VHlwZV9DaGVjayhjbHMpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogCi0JY2xzZGljdCA9ICgoUHlUeXBlT2JqZWN0ICopY2xzKS0+dHBfZGljdDsKLQlzbG90bmFtZXMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhjbHNkaWN0LCAiX19zbG90bmFtZXNfXyIpOwotCWlmIChzbG90bmFtZXMgIT0gTlVMTCAmJiBQeUxpc3RfQ2hlY2soc2xvdG5hbWVzKSkgewotCQlQeV9JTkNSRUYoc2xvdG5hbWVzKTsKLQkJcmV0dXJuIHNsb3RuYW1lczsKLQl9CisgICAgY2xzZGljdCA9ICgoUHlUeXBlT2JqZWN0ICopY2xzKS0+dHBfZGljdDsKKyAgICBzbG90bmFtZXMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhjbHNkaWN0LCAiX19zbG90bmFtZXNfXyIpOworICAgIGlmIChzbG90bmFtZXMgIT0gTlVMTCAmJiBQeUxpc3RfQ2hlY2soc2xvdG5hbWVzKSkgeworICAgICAgICBQeV9JTkNSRUYoc2xvdG5hbWVzKTsKKyAgICAgICAgcmV0dXJuIHNsb3RuYW1lczsKKyAgICB9CiAKLQljb3B5cmVnID0gaW1wb3J0X2NvcHlyZWcoKTsKLQlpZiAoY29weXJlZyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjb3B5cmVnID0gaW1wb3J0X2NvcHlyZWcoKTsKKyAgICBpZiAoY29weXJlZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXNsb3RuYW1lcyA9IFB5T2JqZWN0X0NhbGxNZXRob2QoY29weXJlZywgIl9zbG90bmFtZXMiLCAiTyIsIGNscyk7Ci0JUHlfREVDUkVGKGNvcHlyZWcpOwotCWlmIChzbG90bmFtZXMgIT0gTlVMTCAmJgotCSAgICBzbG90bmFtZXMgIT0gUHlfTm9uZSAmJgotCSAgICAhUHlMaXN0X0NoZWNrKHNsb3RuYW1lcykpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImNvcHlfcmVnLl9zbG90bmFtZXMgZGlkbid0IHJldHVybiBhIGxpc3Qgb3IgTm9uZSIpOwotCQlQeV9ERUNSRUYoc2xvdG5hbWVzKTsKLQkJc2xvdG5hbWVzID0gTlVMTDsKLQl9CisgICAgc2xvdG5hbWVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChjb3B5cmVnLCAiX3Nsb3RuYW1lcyIsICJPIiwgY2xzKTsKKyAgICBQeV9ERUNSRUYoY29weXJlZyk7CisgICAgaWYgKHNsb3RuYW1lcyAhPSBOVUxMICYmCisgICAgICAgIHNsb3RuYW1lcyAhPSBQeV9Ob25lICYmCisgICAgICAgICFQeUxpc3RfQ2hlY2soc2xvdG5hbWVzKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiY29weV9yZWcuX3Nsb3RuYW1lcyBkaWRuJ3QgcmV0dXJuIGEgbGlzdCBvciBOb25lIik7CisgICAgICAgIFB5X0RFQ1JFRihzbG90bmFtZXMpOworICAgICAgICBzbG90bmFtZXMgPSBOVUxMOworICAgIH0KIAotCXJldHVybiBzbG90bmFtZXM7CisgICAgcmV0dXJuIHNsb3RuYW1lczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJlZHVjZV8yKFB5T2JqZWN0ICpvYmopCiB7Ci0JUHlPYmplY3QgKmNscywgKmdldG5ld2FyZ3M7Ci0JUHlPYmplY3QgKmFyZ3MgPSBOVUxMLCAqYXJnczIgPSBOVUxMOwotCVB5T2JqZWN0ICpnZXRzdGF0ZSA9IE5VTEwsICpzdGF0ZSA9IE5VTEwsICpuYW1lcyA9IE5VTEw7Ci0JUHlPYmplY3QgKnNsb3RzID0gTlVMTCwgKmxpc3RpdGVtcyA9IE5VTEwsICpkaWN0aXRlbXMgPSBOVUxMOwotCVB5T2JqZWN0ICpjb3B5cmVnID0gTlVMTCwgKm5ld29iaiA9IE5VTEwsICpyZXMgPSBOVUxMOwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqY2xzLCAqZ2V0bmV3YXJnczsKKyAgICBQeU9iamVjdCAqYXJncyA9IE5VTEwsICphcmdzMiA9IE5VTEw7CisgICAgUHlPYmplY3QgKmdldHN0YXRlID0gTlVMTCwgKnN0YXRlID0gTlVMTCwgKm5hbWVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc2xvdHMgPSBOVUxMLCAqbGlzdGl0ZW1zID0gTlVMTCwgKmRpY3RpdGVtcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNvcHlyZWcgPSBOVUxMLCAqbmV3b2JqID0gTlVMTCwgKnJlcyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JY2xzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2NsYXNzX18iKTsKLQlpZiAoY2xzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGNscyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19jbGFzc19fIik7CisgICAgaWYgKGNscyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWdldG5ld2FyZ3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fZ2V0bmV3YXJnc19fIik7Ci0JaWYgKGdldG5ld2FyZ3MgIT0gTlVMTCkgewotCQlhcmdzID0gUHlPYmplY3RfQ2FsbE9iamVjdChnZXRuZXdhcmdzLCBOVUxMKTsKLQkJUHlfREVDUkVGKGdldG5ld2FyZ3MpOwotCQlpZiAoYXJncyAhPSBOVUxMICYmICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2dldG5ld2FyZ3NfXyBzaG91bGQgcmV0dXJuIGEgdHVwbGUsICIKLQkJCQkibm90ICclLjIwMHMnIiwgUHlfVFlQRShhcmdzKS0+dHBfbmFtZSk7Ci0JCQlnb3RvIGVuZDsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOwotCX0KLQlpZiAoYXJncyA9PSBOVUxMKQotCQlnb3RvIGVuZDsKKyAgICBnZXRuZXdhcmdzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2dldG5ld2FyZ3NfXyIpOworICAgIGlmIChnZXRuZXdhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgYXJncyA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZ2V0bmV3YXJncywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihnZXRuZXdhcmdzKTsKKyAgICAgICAgaWYgKGFyZ3MgIT0gTlVMTCAmJiAhUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiX19nZXRuZXdhcmdzX18gc2hvdWxkIHJldHVybiBhIHR1cGxlLCAiCisgICAgICAgICAgICAgICAgIm5vdCAnJS4yMDBzJyIsIFB5X1RZUEUoYXJncyktPnRwX25hbWUpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICB9CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgZ290byBlbmQ7CiAKLQlnZXRzdGF0ZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCAiX19nZXRzdGF0ZV9fIik7Ci0JaWYgKGdldHN0YXRlICE9IE5VTEwpIHsKLQkJc3RhdGUgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGdldHN0YXRlLCBOVUxMKTsKLQkJUHlfREVDUkVGKGdldHN0YXRlKTsKLQkJaWYgKHN0YXRlID09IE5VTEwpCi0JCQlnb3RvIGVuZDsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCXN0YXRlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2RpY3RfXyIpOwotCQlpZiAoc3RhdGUgPT0gTlVMTCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXN0YXRlID0gUHlfTm9uZTsKLQkJCVB5X0lOQ1JFRihzdGF0ZSk7Ci0JCX0KLQkJbmFtZXMgPSBzbG90bmFtZXMoY2xzKTsKLQkJaWYgKG5hbWVzID09IE5VTEwpCi0JCQlnb3RvIGVuZDsKLQkJaWYgKG5hbWVzICE9IFB5X05vbmUpIHsKLQkJCWFzc2VydChQeUxpc3RfQ2hlY2sobmFtZXMpKTsKLQkJCXNsb3RzID0gUHlEaWN0X05ldygpOwotCQkJaWYgKHNsb3RzID09IE5VTEwpCi0JCQkJZ290byBlbmQ7Ci0JCQluID0gMDsKLQkJCS8qIENhbid0IHByZS1jb21wdXRlIHRoZSBsaXN0IHNpemU7IHRoZSBsaXN0Ci0JCQkgICBpcyBzdG9yZWQgb24gdGhlIGNsYXNzIHNvIGFjY2Vzc2libGUgdG8gb3RoZXIKLQkJCSAgIHRocmVhZHMsIHdoaWNoIG1heSBiZSBydW4gYnkgREVDUkVGICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X0dFVF9TSVpFKG5hbWVzKTsgaSsrKSB7Ci0JCQkJUHlPYmplY3QgKm5hbWUsICp2YWx1ZTsKLQkJCQluYW1lID0gUHlMaXN0X0dFVF9JVEVNKG5hbWVzLCBpKTsKLQkJCQl2YWx1ZSA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBuYW1lKTsKLQkJCQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQllbHNlIHsKLQkJCQkJaW50IGVyciA9IFB5RGljdF9TZXRJdGVtKHNsb3RzLCBuYW1lLAotCQkJCQkJCQkgdmFsdWUpOwotCQkJCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJCQlpZiAoZXJyKQotCQkJCQkJZ290byBlbmQ7Ci0JCQkJCW4rKzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobikgewotCQkJCXN0YXRlID0gUHlfQnVpbGRWYWx1ZSgiKE5PKSIsIHN0YXRlLCBzbG90cyk7Ci0JCQkJaWYgKHN0YXRlID09IE5VTEwpCi0JCQkJCWdvdG8gZW5kOwotCQkJfQotCQl9Ci0JfQorICAgIGdldHN0YXRlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosICJfX2dldHN0YXRlX18iKTsKKyAgICBpZiAoZ2V0c3RhdGUgIT0gTlVMTCkgeworICAgICAgICBzdGF0ZSA9IFB5T2JqZWN0X0NhbGxPYmplY3QoZ2V0c3RhdGUsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZ2V0c3RhdGUpOworICAgICAgICBpZiAoc3RhdGUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgc3RhdGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgIl9fZGljdF9fIik7CisgICAgICAgIGlmIChzdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgc3RhdGUgPSBQeV9Ob25lOworICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXRlKTsKKyAgICAgICAgfQorICAgICAgICBuYW1lcyA9IHNsb3RuYW1lcyhjbHMpOworICAgICAgICBpZiAobmFtZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBpZiAobmFtZXMgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhuYW1lcykpOworICAgICAgICAgICAgc2xvdHMgPSBQeURpY3RfTmV3KCk7CisgICAgICAgICAgICBpZiAoc2xvdHMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIG4gPSAwOworICAgICAgICAgICAgLyogQ2FuJ3QgcHJlLWNvbXB1dGUgdGhlIGxpc3Qgc2l6ZTsgdGhlIGxpc3QKKyAgICAgICAgICAgICAgIGlzIHN0b3JlZCBvbiB0aGUgY2xhc3Mgc28gYWNjZXNzaWJsZSB0byBvdGhlcgorICAgICAgICAgICAgICAgdGhyZWFkcywgd2hpY2ggbWF5IGJlIHJ1biBieSBERUNSRUYgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeUxpc3RfR0VUX1NJWkUobmFtZXMpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSwgKnZhbHVlOworICAgICAgICAgICAgICAgIG5hbWUgPSBQeUxpc3RfR0VUX0lURU0obmFtZXMsIGkpOworICAgICAgICAgICAgICAgIHZhbHVlID0gUHlPYmplY3RfR2V0QXR0cihvYmosIG5hbWUpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyID0gUHlEaWN0X1NldEl0ZW0oc2xvdHMsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBQeV9CdWlsZFZhbHVlKCIoTk8pIiwgc3RhdGUsIHNsb3RzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoIVB5TGlzdF9DaGVjayhvYmopKSB7Ci0JCWxpc3RpdGVtcyA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihsaXN0aXRlbXMpOwotCX0KLQllbHNlIHsKLQkJbGlzdGl0ZW1zID0gUHlPYmplY3RfR2V0SXRlcihvYmopOwotCQlpZiAobGlzdGl0ZW1zID09IE5VTEwpCi0JCQlnb3RvIGVuZDsKLQl9CisgICAgaWYgKCFQeUxpc3RfQ2hlY2sob2JqKSkgeworICAgICAgICBsaXN0aXRlbXMgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYobGlzdGl0ZW1zKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGxpc3RpdGVtcyA9IFB5T2JqZWN0X0dldEl0ZXIob2JqKTsKKyAgICAgICAgaWYgKGxpc3RpdGVtcyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgfQogCi0JaWYgKCFQeURpY3RfQ2hlY2sob2JqKSkgewotCQlkaWN0aXRlbXMgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoZGljdGl0ZW1zKTsKLQl9Ci0JZWxzZSB7Ci0JCWRpY3RpdGVtcyA9IFB5T2JqZWN0X0NhbGxNZXRob2Qob2JqLCAiaXRlcml0ZW1zIiwgIiIpOwotCQlpZiAoZGljdGl0ZW1zID09IE5VTEwpCi0JCQlnb3RvIGVuZDsKLQl9CisgICAgaWYgKCFQeURpY3RfQ2hlY2sob2JqKSkgeworICAgICAgICBkaWN0aXRlbXMgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoZGljdGl0ZW1zKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRpY3RpdGVtcyA9IFB5T2JqZWN0X0NhbGxNZXRob2Qob2JqLCAiaXRlcml0ZW1zIiwgIiIpOworICAgICAgICBpZiAoZGljdGl0ZW1zID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CiAKLQljb3B5cmVnID0gaW1wb3J0X2NvcHlyZWcoKTsKLQlpZiAoY29weXJlZyA9PSBOVUxMKQotCQlnb3RvIGVuZDsKLQluZXdvYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNvcHlyZWcsICJfX25ld29ial9fIik7Ci0JaWYgKG5ld29iaiA9PSBOVUxMKQotCQlnb3RvIGVuZDsKKyAgICBjb3B5cmVnID0gaW1wb3J0X2NvcHlyZWcoKTsKKyAgICBpZiAoY29weXJlZyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVuZDsKKyAgICBuZXdvYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNvcHlyZWcsICJfX25ld29ial9fIik7CisgICAgaWYgKG5ld29iaiA9PSBOVUxMKQorICAgICAgICBnb3RvIGVuZDsKIAotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwotCWFyZ3MyID0gUHlUdXBsZV9OZXcobisxKTsKLQlpZiAoYXJnczIgPT0gTlVMTCkKLQkJZ290byBlbmQ7Ci0JUHlUdXBsZV9TRVRfSVRFTShhcmdzMiwgMCwgY2xzKTsKLQljbHMgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlQeV9JTkNSRUYodik7Ci0JCVB5VHVwbGVfU0VUX0lURU0oYXJnczIsIGkrMSwgdik7Ci0JfQorICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGFyZ3MyID0gUHlUdXBsZV9OZXcobisxKTsKKyAgICBpZiAoYXJnczIgPT0gTlVMTCkKKyAgICAgICAgZ290byBlbmQ7CisgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzMiwgMCwgY2xzKTsKKyAgICBjbHMgPSBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKnYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJnczIsIGkrMSwgdik7CisgICAgfQogCi0JcmVzID0gUHlUdXBsZV9QYWNrKDUsIG5ld29iaiwgYXJnczIsIHN0YXRlLCBsaXN0aXRlbXMsIGRpY3RpdGVtcyk7CisgICAgcmVzID0gUHlUdXBsZV9QYWNrKDUsIG5ld29iaiwgYXJnczIsIHN0YXRlLCBsaXN0aXRlbXMsIGRpY3RpdGVtcyk7CiAKICAgZW5kOgotCVB5X1hERUNSRUYoY2xzKTsKLQlQeV9YREVDUkVGKGFyZ3MpOwotCVB5X1hERUNSRUYoYXJnczIpOwotCVB5X1hERUNSRUYoc2xvdHMpOwotCVB5X1hERUNSRUYoc3RhdGUpOwotCVB5X1hERUNSRUYobmFtZXMpOwotCVB5X1hERUNSRUYobGlzdGl0ZW1zKTsKLQlQeV9YREVDUkVGKGRpY3RpdGVtcyk7Ci0JUHlfWERFQ1JFRihjb3B5cmVnKTsKLQlQeV9YREVDUkVGKG5ld29iaik7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9YREVDUkVGKGNscyk7CisgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICBQeV9YREVDUkVGKGFyZ3MyKTsKKyAgICBQeV9YREVDUkVGKHNsb3RzKTsKKyAgICBQeV9YREVDUkVGKHN0YXRlKTsKKyAgICBQeV9YREVDUkVGKG5hbWVzKTsKKyAgICBQeV9YREVDUkVGKGxpc3RpdGVtcyk7CisgICAgUHlfWERFQ1JFRihkaWN0aXRlbXMpOworICAgIFB5X1hERUNSRUYoY29weXJlZyk7CisgICAgUHlfWERFQ1JFRihuZXdvYmopOworICAgIHJldHVybiByZXM7CiB9CiAKIC8qCkBAIC0zMzE2LDc5ICszMzE2LDc5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvbW1vbl9yZWR1Y2UoUHlPYmplY3QgKnNlbGYsIGludCBwcm90bykKIHsKLQlQeU9iamVjdCAqY29weXJlZywgKnJlczsKKyAgICBQeU9iamVjdCAqY29weXJlZywgKnJlczsKIAotCWlmIChwcm90byA+PSAyKQotCQlyZXR1cm4gcmVkdWNlXzIoc2VsZik7CisgICAgaWYgKHByb3RvID49IDIpCisgICAgICAgIHJldHVybiByZWR1Y2VfMihzZWxmKTsKIAotCWNvcHlyZWcgPSBpbXBvcnRfY29weXJlZygpOwotCWlmICghY29weXJlZykKLQkJcmV0dXJuIE5VTEw7CisgICAgY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7CisgICAgaWYgKCFjb3B5cmVnKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlcyA9IFB5RXZhbF9DYWxsTWV0aG9kKGNvcHlyZWcsICJfcmVkdWNlX2V4IiwgIihPaSkiLCBzZWxmLCBwcm90byk7Ci0JUHlfREVDUkVGKGNvcHlyZWcpOworICAgIHJlcyA9IFB5RXZhbF9DYWxsTWV0aG9kKGNvcHlyZWcsICJfcmVkdWNlX2V4IiwgIihPaSkiLCBzZWxmLCBwcm90byk7CisgICAgUHlfREVDUkVGKGNvcHlyZWcpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogb2JqZWN0X3JlZHVjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHByb3RvID0gMDsKKyAgICBpbnQgcHJvdG8gPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfX3JlZHVjZV9fIiwgJnByb3RvKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfX3JlZHVjZV9fIiwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gX2NvbW1vbl9yZWR1Y2Uoc2VsZiwgcHJvdG8pOworICAgIHJldHVybiBfY29tbW9uX3JlZHVjZShzZWxmLCBwcm90byk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvYmplY3RfcmVkdWNlX2V4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmVkdWNlLCAqcmVzOwotCWludCBwcm90byA9IDA7CisgICAgUHlPYmplY3QgKnJlZHVjZSwgKnJlczsKKyAgICBpbnQgcHJvdG8gPSAwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfX3JlZHVjZV9leF9fIiwgJnByb3RvKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfX3JlZHVjZV9leF9fIiwgJnByb3RvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZWR1Y2UgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJfX3JlZHVjZV9fIik7Ci0JaWYgKHJlZHVjZSA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOwotCWVsc2UgewotCQlQeU9iamVjdCAqY2xzLCAqY2xzcmVkdWNlLCAqb2JqcmVkdWNlOwotCQlpbnQgb3ZlcnJpZGU7Ci0JCWNscyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZiwgIl9fY2xhc3NfXyIpOwotCQlpZiAoY2xzID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZWR1Y2UpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJY2xzcmVkdWNlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjbHMsICJfX3JlZHVjZV9fIik7Ci0JCVB5X0RFQ1JFRihjbHMpOwotCQlpZiAoY2xzcmVkdWNlID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihyZWR1Y2UpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJb2JqcmVkdWNlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoUHlCYXNlT2JqZWN0X1R5cGUudHBfZGljdCwKLQkJCQkJCSAiX19yZWR1Y2VfXyIpOwotCQlvdmVycmlkZSA9IChjbHNyZWR1Y2UgIT0gb2JqcmVkdWNlKTsKLQkJUHlfREVDUkVGKGNsc3JlZHVjZSk7Ci0JCWlmIChvdmVycmlkZSkgewotCQkJcmVzID0gUHlPYmplY3RfQ2FsbE9iamVjdChyZWR1Y2UsIE5VTEwpOwotCQkJUHlfREVDUkVGKHJlZHVjZSk7Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCWVsc2UKLQkJCVB5X0RFQ1JFRihyZWR1Y2UpOwotCX0KKyAgICByZWR1Y2UgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNlbGYsICJfX3JlZHVjZV9fIik7CisgICAgaWYgKHJlZHVjZSA9PSBOVUxMKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqY2xzLCAqY2xzcmVkdWNlLCAqb2JqcmVkdWNlOworICAgICAgICBpbnQgb3ZlcnJpZGU7CisgICAgICAgIGNscyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZiwgIl9fY2xhc3NfXyIpOworICAgICAgICBpZiAoY2xzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZWR1Y2UpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgY2xzcmVkdWNlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjbHMsICJfX3JlZHVjZV9fIik7CisgICAgICAgIFB5X0RFQ1JFRihjbHMpOworICAgICAgICBpZiAoY2xzcmVkdWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZWR1Y2UpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgb2JqcmVkdWNlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoUHlCYXNlT2JqZWN0X1R5cGUudHBfZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fcmVkdWNlX18iKTsKKyAgICAgICAgb3ZlcnJpZGUgPSAoY2xzcmVkdWNlICE9IG9ianJlZHVjZSk7CisgICAgICAgIFB5X0RFQ1JFRihjbHNyZWR1Y2UpOworICAgICAgICBpZiAob3ZlcnJpZGUpIHsKKyAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxPYmplY3QocmVkdWNlLCBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZWR1Y2UpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9ERUNSRUYocmVkdWNlKTsKKyAgICB9CiAKLQlyZXR1cm4gX2NvbW1vbl9yZWR1Y2Uoc2VsZiwgcHJvdG8pOworICAgIHJldHVybiBfY29tbW9uX3JlZHVjZShzZWxmLCBwcm90byk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBvYmplY3Rfc3ViY2xhc3Nob29rKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBQeURvY19TVFJWQVIob2JqZWN0X3N1YmNsYXNzaG9va19kb2MsCkBAIC0zNDA0LDExNCArMzQwNCwxMTQgQEAKIAogICAgY2xhc3Mgb2JqZWN0OgogICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKToKLSAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmb3JtYXRfc3BlYywgc3RyKToKLSAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQoc3RyKHNlbGYpLCBmb3JtYXRfc3BlYykKLSAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZvcm1hdF9zcGVjLCB1bmljb2RlKToKLSAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQodW5pY29kZShzZWxmKSwgZm9ybWF0X3NwZWMpCisgICAgICAgaWYgaXNpbnN0YW5jZShmb3JtYXRfc3BlYywgc3RyKToKKyAgICAgICAgICAgcmV0dXJuIGZvcm1hdChzdHIoc2VsZiksIGZvcm1hdF9zcGVjKQorICAgICAgIGVsaWYgaXNpbnN0YW5jZShmb3JtYXRfc3BlYywgdW5pY29kZSk6CisgICAgICAgICAgIHJldHVybiBmb3JtYXQodW5pY29kZShzZWxmKSwgZm9ybWF0X3NwZWMpCiAqLwogc3RhdGljIFB5T2JqZWN0ICoKIG9iamVjdF9mb3JtYXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgICAgICBQeU9iamVjdCAqZm9ybWF0X3NwZWM7Ci0gICAgICAgIFB5T2JqZWN0ICpzZWxmX2FzX3N0ciA9IE5VTEw7Ci0gICAgICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotICAgICAgICBQeU9iamVjdCAqZm9ybWF0X21ldGggPSBOVUxMOworICAgIFB5T2JqZWN0ICpmb3JtYXRfc3BlYzsKKyAgICBQeU9iamVjdCAqc2VsZl9hc19zdHIgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmb3JtYXRfbWV0aCA9IE5VTEw7CiAKLSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCWlmIChQeVVuaWNvZGVfQ2hlY2soZm9ybWF0X3NwZWMpKSB7Ci0JICAgICAgICBzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1VuaWNvZGUoc2VsZik7Ci0JfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhmb3JtYXRfc3BlYykpIHsKLQkgICAgICAgIHNlbGZfYXNfc3RyID0gUHlPYmplY3RfU3RyKHNlbGYpOwotCX0gZWxzZSB7Ci0JICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYXJndW1lbnQgdG8gX19mb3JtYXRfXyBtdXN0IGJlIHVuaWNvZGUgb3Igc3RyIik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOl9fZm9ybWF0X18iLCAmZm9ybWF0X3NwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGZvcm1hdF9zcGVjKSkgeworICAgICAgICBzZWxmX2FzX3N0ciA9IFB5T2JqZWN0X1VuaWNvZGUoc2VsZik7CisgICAgfSBlbHNlIGlmIChQeVN0cmluZ19DaGVjayhmb3JtYXRfc3BlYykpIHsKKyAgICAgICAgc2VsZl9hc19zdHIgPSBQeU9iamVjdF9TdHIoc2VsZik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZ3VtZW50IHRvIF9fZm9ybWF0X18gbXVzdCBiZSB1bmljb2RlIG9yIHN0ciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgaWYgKHNlbGZfYXNfc3RyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBmaW5kIHRoZSBmb3JtYXQgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBmb3JtYXRfbWV0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc2VsZl9hc19zdHIsICJfX2Zvcm1hdF9fIik7Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdF9tZXRoICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIGNhbGwgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZm9ybWF0X21ldGgsIGZvcm1hdF9zcGVjLCBOVUxMKTsKLSAgICAgICAgICAgICAgICB9CisgICAgaWYgKHNlbGZfYXNfc3RyICE9IE5VTEwpIHsKKyAgICAgICAgLyogZmluZCB0aGUgZm9ybWF0IGZ1bmN0aW9uICovCisgICAgICAgIGZvcm1hdF9tZXRoID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmX2FzX3N0ciwgIl9fZm9ybWF0X18iKTsKKyAgICAgICAgaWYgKGZvcm1hdF9tZXRoICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgIC8qIGFuZCBjYWxsIGl0ICovCisgICAgICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZvcm1hdF9tZXRoLCBmb3JtYXRfc3BlYywgTlVMTCk7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgUHlfWERFQ1JFRihzZWxmX2FzX3N0cik7Ci0gICAgICAgIFB5X1hERUNSRUYoZm9ybWF0X21ldGgpOworICAgIFB5X1hERUNSRUYoc2VsZl9hc19zdHIpOworICAgIFB5X1hERUNSRUYoZm9ybWF0X21ldGgpOwogCi0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9iamVjdF9zaXplb2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X3NzaXplX3QgcmVzLCBpc2l6ZTsKKyAgICBQeV9zc2l6ZV90IHJlcywgaXNpemU7CiAKLQlyZXMgPSAwOwotCWlzaXplID0gc2VsZi0+b2JfdHlwZS0+dHBfaXRlbXNpemU7Ci0JaWYgKGlzaXplID4gMCkKLQkJcmVzID0gc2VsZi0+b2JfdHlwZS0+b2Jfc2l6ZSAqIGlzaXplOwotCXJlcyArPSBzZWxmLT5vYl90eXBlLT50cF9iYXNpY3NpemU7CisgICAgcmVzID0gMDsKKyAgICBpc2l6ZSA9IHNlbGYtPm9iX3R5cGUtPnRwX2l0ZW1zaXplOworICAgIGlmIChpc2l6ZSA+IDApCisgICAgICAgIHJlcyA9IHNlbGYtPm9iX3R5cGUtPm9iX3NpemUgKiBpc2l6ZTsKKyAgICByZXMgKz0gc2VsZi0+b2JfdHlwZS0+dHBfYmFzaWNzaXplOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KHJlcyk7CSAKKyAgICByZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIG9iamVjdF9tZXRob2RzW10gPSB7Ci0JeyJfX3JlZHVjZV9leF9fIiwgb2JqZWN0X3JlZHVjZV9leCwgTUVUSF9WQVJBUkdTLAotCSBQeURvY19TVFIoImhlbHBlciBmb3IgcGlja2xlIil9LAotCXsiX19yZWR1Y2VfXyIsIG9iamVjdF9yZWR1Y2UsIE1FVEhfVkFSQVJHUywKLQkgUHlEb2NfU1RSKCJoZWxwZXIgZm9yIHBpY2tsZSIpfSwKLQl7Il9fc3ViY2xhc3Nob29rX18iLCBvYmplY3Rfc3ViY2xhc3Nob29rLCBNRVRIX0NMQVNTIHwgTUVUSF9WQVJBUkdTLAotCSBvYmplY3Rfc3ViY2xhc3Nob29rX2RvY30sCi0gICAgICAgIHsiX19mb3JtYXRfXyIsIG9iamVjdF9mb3JtYXQsIE1FVEhfVkFSQVJHUywKLSAgICAgICAgIFB5RG9jX1NUUigiZGVmYXVsdCBvYmplY3QgZm9ybWF0dGVyIil9LAotICAgICAgICB7Il9fc2l6ZW9mX18iLCBvYmplY3Rfc2l6ZW9mLCBNRVRIX05PQVJHUywKLSAgICAgICAgIFB5RG9jX1NUUigiX19zaXplb2ZfXygpIC0+IHNpemUgb2Ygb2JqZWN0IGluIG1lbW9yeSwgaW4gYnl0ZXMiKX0sCi0JezB9CisgICAgeyJfX3JlZHVjZV9leF9fIiwgb2JqZWN0X3JlZHVjZV9leCwgTUVUSF9WQVJBUkdTLAorICAgICBQeURvY19TVFIoImhlbHBlciBmb3IgcGlja2xlIil9LAorICAgIHsiX19yZWR1Y2VfXyIsIG9iamVjdF9yZWR1Y2UsIE1FVEhfVkFSQVJHUywKKyAgICAgUHlEb2NfU1RSKCJoZWxwZXIgZm9yIHBpY2tsZSIpfSwKKyAgICB7Il9fc3ViY2xhc3Nob29rX18iLCBvYmplY3Rfc3ViY2xhc3Nob29rLCBNRVRIX0NMQVNTIHwgTUVUSF9WQVJBUkdTLAorICAgICBvYmplY3Rfc3ViY2xhc3Nob29rX2RvY30sCisgICAgeyJfX2Zvcm1hdF9fIiwgb2JqZWN0X2Zvcm1hdCwgTUVUSF9WQVJBUkdTLAorICAgICBQeURvY19TVFIoImRlZmF1bHQgb2JqZWN0IGZvcm1hdHRlciIpfSwKKyAgICB7Il9fc2l6ZW9mX18iLCBvYmplY3Rfc2l6ZW9mLCBNRVRIX05PQVJHUywKKyAgICAgUHlEb2NfU1RSKCJfX3NpemVvZl9fKCkgLT4gc2l6ZSBvZiBvYmplY3QgaW4gbWVtb3J5LCBpbiBieXRlcyIpfSwKKyAgICB7MH0KIH07CiAKIAogUHlUeXBlT2JqZWN0IFB5QmFzZU9iamVjdF9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JIm9iamVjdCIsCQkJCS8qIHRwX25hbWUgKi8KLQlzaXplb2YoUHlPYmplY3QpLAkJCS8qIHRwX2Jhc2ljc2l6ZSAqLwotCTAsCQkJCQkvKiB0cF9pdGVtc2l6ZSAqLwotCW9iamVjdF9kZWFsbG9jLAkJCQkvKiB0cF9kZWFsbG9jICovCi0JMCwJCQkJCS8qIHRwX3ByaW50ICovCi0JMCwJCQkJCS8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9jb21wYXJlICovCi0Jb2JqZWN0X3JlcHIsCQkJCS8qIHRwX3JlcHIgKi8KLQkwLAkJCQkJLyogdHBfYXNfbnVtYmVyICovCi0JMCwJCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJCS8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpX1B5X0hhc2hQb2ludGVyLAkJLyogdHBfaGFzaCAqLwotCTAsCQkJCQkvKiB0cF9jYWxsICovCi0Jb2JqZWN0X3N0ciwJCQkJLyogdHBfc3RyICovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsCQkvKiB0cF9nZXRhdHRybyAqLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLAkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQlQeURvY19TVFIoIlRoZSBtb3N0IGJhc2UgdHlwZSIpLAkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCW9iamVjdF9tZXRob2RzLAkJCQkvKiB0cF9tZXRob2RzICovCi0JMCwJCQkJCS8qIHRwX21lbWJlcnMgKi8KLQlvYmplY3RfZ2V0c2V0cywJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQlvYmplY3RfaW5pdCwJCQkJLyogdHBfaW5pdCAqLwotCVB5VHlwZV9HZW5lcmljQWxsb2MsCQkJLyogdHBfYWxsb2MgKi8KLQlvYmplY3RfbmV3LAkJCQkvKiB0cF9uZXcgKi8KLQlQeU9iamVjdF9EZWwsCQkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJvYmplY3QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihQeU9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIG9iamVjdF9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICBvYmplY3RfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpX1B5X0hhc2hQb2ludGVyLCAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICBvYmplY3Rfc3RyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIFB5RG9jX1NUUigiVGhlIG1vc3QgYmFzZSB0eXBlIiksICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBvYmplY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBvYmplY3RfZ2V0c2V0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICBvYmplY3RfaW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgb2JqZWN0X25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKIApAQCAtMzUyMCwxOTAgKzM1MjAsMTkwIEBACiBzdGF0aWMgaW50CiBhZGRfbWV0aG9kcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5TWV0aG9kRGVmICptZXRoKQogewotCVB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CiAKLQlmb3IgKDsgbWV0aC0+bWxfbmFtZSAhPSBOVUxMOyBtZXRoKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgbWV0aC0+bWxfbmFtZSkgJiYKLQkJCSEobWV0aC0+bWxfZmxhZ3MgJiBNRVRIX0NPRVhJU1QpKQotCQkJCWNvbnRpbnVlOwotCQlpZiAobWV0aC0+bWxfZmxhZ3MgJiBNRVRIX0NMQVNTKSB7Ci0JCQlpZiAobWV0aC0+bWxfZmxhZ3MgJiBNRVRIX1NUQVRJQykgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAgICAgIm1ldGhvZCBjYW5ub3QgYmUgYm90aCBjbGFzcyBhbmQgc3RhdGljIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZGVzY3IgPSBQeURlc2NyX05ld0NsYXNzTWV0aG9kKHR5cGUsIG1ldGgpOwotCQl9Ci0JCWVsc2UgaWYgKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9TVEFUSUMpIHsKLQkJCVB5T2JqZWN0ICpjZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyhtZXRoLCBOVUxMKTsKLQkJCWlmIChjZnVuYyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCWRlc2NyID0gUHlTdGF0aWNNZXRob2RfTmV3KGNmdW5jKTsKLQkJCVB5X0RFQ1JFRihjZnVuYyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZXNjciA9IFB5RGVzY3JfTmV3TWV0aG9kKHR5cGUsIG1ldGgpOwotCQl9Ci0JCWlmIChkZXNjciA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbWV0aC0+bWxfbmFtZSwgZGVzY3IpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGRlc2NyKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgZm9yICg7IG1ldGgtPm1sX25hbWUgIT0gTlVMTDsgbWV0aCsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpkZXNjcjsKKyAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIG1ldGgtPm1sX25hbWUpICYmCisgICAgICAgICAgICAhKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9DT0VYSVNUKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9DTEFTUykgeworICAgICAgICAgICAgaWYgKG1ldGgtPm1sX2ZsYWdzICYgTUVUSF9TVEFUSUMpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJtZXRob2QgY2Fubm90IGJlIGJvdGggY2xhc3MgYW5kIHN0YXRpYyIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2NyID0gUHlEZXNjcl9OZXdDbGFzc01ldGhvZCh0eXBlLCBtZXRoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtZXRoLT5tbF9mbGFncyAmIE1FVEhfU1RBVElDKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqY2Z1bmMgPSBQeUNGdW5jdGlvbl9OZXcobWV0aCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoY2Z1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBkZXNjciA9IFB5U3RhdGljTWV0aG9kX05ldyhjZnVuYyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2Z1bmMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZGVzY3IgPSBQeURlc2NyX05ld01ldGhvZCh0eXBlLCBtZXRoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIG1ldGgtPm1sX25hbWUsIGRlc2NyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBhZGRfbWVtYmVycyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5TWVtYmVyRGVmICptZW1iKQogewotCVB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CiAKLQlmb3IgKDsgbWVtYi0+bmFtZSAhPSBOVUxMOyBtZW1iKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgbWVtYi0+bmFtZSkpCi0JCQljb250aW51ZTsKLQkJZGVzY3IgPSBQeURlc2NyX05ld01lbWJlcih0eXBlLCBtZW1iKTsKLQkJaWYgKGRlc2NyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBtZW1iLT5uYW1lLCBkZXNjcikgPCAwKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYoZGVzY3IpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBmb3IgKDsgbWVtYi0+bmFtZSAhPSBOVUxMOyBtZW1iKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmRlc2NyOworICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgbWVtYi0+bmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGVzY3IgPSBQeURlc2NyX05ld01lbWJlcih0eXBlLCBtZW1iKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBtZW1iLT5uYW1lLCBkZXNjcikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogYWRkX2dldHNldChQeVR5cGVPYmplY3QgKnR5cGUsIFB5R2V0U2V0RGVmICpnc3ApCiB7Ci0JUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OworICAgIFB5T2JqZWN0ICpkaWN0ID0gdHlwZS0+dHBfZGljdDsKIAotCWZvciAoOyBnc3AtPm5hbWUgIT0gTlVMTDsgZ3NwKyspIHsKLQkJUHlPYmplY3QgKmRlc2NyOwotCQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgZ3NwLT5uYW1lKSkKLQkJCWNvbnRpbnVlOwotCQlkZXNjciA9IFB5RGVzY3JfTmV3R2V0U2V0KHR5cGUsIGdzcCk7CisgICAgZm9yICg7IGdzcC0+bmFtZSAhPSBOVUxMOyBnc3ArKykgeworICAgICAgICBQeU9iamVjdCAqZGVzY3I7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCBnc3AtPm5hbWUpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlc2NyID0gUHlEZXNjcl9OZXdHZXRTZXQodHlwZSwgZ3NwKTsKIAotCQlpZiAoZGVzY3IgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIGdzcC0+bmFtZSwgZGVzY3IpIDwgMCkKLQkJCXJldHVybiAtMTsKLQkJUHlfREVDUkVGKGRlc2NyKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGlmIChkZXNjciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgZ3NwLT5uYW1lLCBkZXNjcikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYoZGVzY3IpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIGluaGVyaXRfc3BlY2lhbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5VHlwZU9iamVjdCAqYmFzZSkKIHsKLQlQeV9zc2l6ZV90IG9sZHNpemUsIG5ld3NpemU7CisgICAgUHlfc3NpemVfdCBvbGRzaXplLCBuZXdzaXplOwogCi0JLyogU3BlY2lhbCBmbGFnIG1hZ2ljICovCi0JaWYgKCF0eXBlLT50cF9hc19idWZmZXIgJiYgYmFzZS0+dHBfYXNfYnVmZmVyKSB7Ci0JCXR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUjsKLQkJdHlwZS0+dHBfZmxhZ3MgfD0KLQkJCWJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVI7Ci0JfQotCWlmICghdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYgYmFzZS0+dHBfYXNfc2VxdWVuY2UpIHsKLQkJdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTjsKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfU0VRVUVOQ0VfSU47Ci0JfQotCWlmICgodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUykgIT0KLQkgICAgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMpKSB7Ci0JCWlmICgoIXR5cGUtPnRwX2FzX251bWJlciAmJiBiYXNlLT50cF9hc19udW1iZXIpIHx8Ci0JCSAgICAoIXR5cGUtPnRwX2FzX3NlcXVlbmNlICYmIGJhc2UtPnRwX2FzX3NlcXVlbmNlKSkgewotCQkJdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTOwotCQkJaWYgKCF0eXBlLT50cF9hc19udW1iZXIgJiYgIXR5cGUtPnRwX2FzX3NlcXVlbmNlKSB7Ci0JCQkJdHlwZS0+dHBfZmxhZ3MgfD0gYmFzZS0+dHBfZmxhZ3MgJgotCQkJCQlQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUzsKLQkJCX0KLQkJfQotCQkvKiBXb3cgKi8KLQl9Ci0JaWYgKCF0eXBlLT50cF9hc19udW1iZXIgJiYgYmFzZS0+dHBfYXNfbnVtYmVyKSB7Ci0JCXR5cGUtPnRwX2ZsYWdzICY9IH5QeV9UUEZMQUdTX0NIRUNLVFlQRVM7Ci0JCXR5cGUtPnRwX2ZsYWdzIHw9IGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19DSEVDS1RZUEVTOwotCX0KKyAgICAvKiBTcGVjaWFsIGZsYWcgbWFnaWMgKi8KKyAgICBpZiAoIXR5cGUtPnRwX2FzX2J1ZmZlciAmJiBiYXNlLT50cF9hc19idWZmZXIpIHsKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSOworICAgICAgICB0eXBlLT50cF9mbGFncyB8PQorICAgICAgICAgICAgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUjsKKyAgICB9CisgICAgaWYgKCF0eXBlLT50cF9hc19zZXF1ZW5jZSAmJiBiYXNlLT50cF9hc19zZXF1ZW5jZSkgeworICAgICAgICB0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOOworICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTjsKKyAgICB9CisgICAgaWYgKCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTKSAhPQorICAgICAgICAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUykpIHsKKyAgICAgICAgaWYgKCghdHlwZS0+dHBfYXNfbnVtYmVyICYmIGJhc2UtPnRwX2FzX251bWJlcikgfHwKKyAgICAgICAgICAgICghdHlwZS0+dHBfYXNfc2VxdWVuY2UgJiYgYmFzZS0+dHBfYXNfc2VxdWVuY2UpKSB7CisgICAgICAgICAgICB0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFM7CisgICAgICAgICAgICBpZiAoIXR5cGUtPnRwX2FzX251bWJlciAmJiAhdHlwZS0+dHBfYXNfc2VxdWVuY2UpIHsKKyAgICAgICAgICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBiYXNlLT50cF9mbGFncyAmCisgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIFdvdyAqLworICAgIH0KKyAgICBpZiAoIXR5cGUtPnRwX2FzX251bWJlciAmJiBiYXNlLT50cF9hc19udW1iZXIpIHsKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfQ0hFQ0tUWVBFUzsKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVM7CisgICAgfQogCi0JLyogQ29weWluZyBiYXNpY3NpemUgaXMgY29ubmVjdGVkIHRvIHRoZSBHQyBmbGFncyAqLwotCW9sZHNpemUgPSBiYXNlLT50cF9iYXNpY3NpemU7Ci0JbmV3c2l6ZSA9IHR5cGUtPnRwX2Jhc2ljc2l6ZSA/IHR5cGUtPnRwX2Jhc2ljc2l6ZSA6IG9sZHNpemU7Ci0JaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpICYmCi0JICAgIChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykgJiYKLQkgICAgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFLypHQyBzbG90cyBleGlzdCovKSAmJgotCSAgICAoIXR5cGUtPnRwX3RyYXZlcnNlICYmICF0eXBlLT50cF9jbGVhcikpIHsKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19IQVZFX0dDOwotCQlpZiAodHlwZS0+dHBfdHJhdmVyc2UgPT0gTlVMTCkKLQkJCXR5cGUtPnRwX3RyYXZlcnNlID0gYmFzZS0+dHBfdHJhdmVyc2U7Ci0JCWlmICh0eXBlLT50cF9jbGVhciA9PSBOVUxMKQotCQkJdHlwZS0+dHBfY2xlYXIgPSBiYXNlLT50cF9jbGVhcjsKLQl9Ci0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpIHsKLQkJLyogVGhlIGNvbmRpdGlvbiBiZWxvdyBjb3VsZCB1c2Ugc29tZSBleHBsYW5hdGlvbi4KLQkJICAgSXQgYXBwZWFycyB0aGF0IHRwX25ldyBpcyBub3QgaW5oZXJpdGVkIGZvciBzdGF0aWMgdHlwZXMKLQkJICAgd2hvc2UgYmFzZSBjbGFzcyBpcyAnb2JqZWN0JzsgdGhpcyBzZWVtcyB0byBiZSBhIHByZWNhdXRpb24KLQkJICAgc28gdGhhdCBvbGQgZXh0ZW5zaW9uIHR5cGVzIGRvbid0IHN1ZGRlbmx5IGJlY29tZQotCQkgICBjYWxsYWJsZSAob2JqZWN0Ll9fbmV3X18gd291bGRuJ3QgaW5zdXJlIHRoZSBpbnZhcmlhbnRzCi0JCSAgIHRoYXQgdGhlIGV4dGVuc2lvbiB0eXBlJ3Mgb3duIGZhY3RvcnkgZnVuY3Rpb24gZW5zdXJlcykuCi0JCSAgIEhlYXAgdHlwZXMsIG9mIGNvdXJzZSwgYXJlIHVuZGVyIG91ciBjb250cm9sLCBzbyB0aGV5IGRvCi0JCSAgIGluaGVyaXQgdHBfbmV3OyBzdGF0aWMgZXh0ZW5zaW9uIHR5cGVzIHRoYXQgc3BlY2lmeSBzb21lCi0JCSAgIG90aGVyIGJ1aWx0LWluIHR5cGUgYXMgdGhlIGRlZmF1bHQgYXJlIGNvbnNpZGVyZWQKLQkJICAgbmV3LXN0eWxlLWF3YXJlIHNvIHRoZXkgYWxzbyBpbmhlcml0IG9iamVjdC5fX25ld19fLiAqLwotCQlpZiAoYmFzZSAhPSAmUHlCYXNlT2JqZWN0X1R5cGUgfHwKLQkJICAgICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7Ci0JCQlpZiAodHlwZS0+dHBfbmV3ID09IE5VTEwpCi0JCQkJdHlwZS0+dHBfbmV3ID0gYmFzZS0+dHBfbmV3OwotCQl9Ci0JfQotCXR5cGUtPnRwX2Jhc2ljc2l6ZSA9IG5ld3NpemU7CisgICAgLyogQ29weWluZyBiYXNpY3NpemUgaXMgY29ubmVjdGVkIHRvIHRoZSBHQyBmbGFncyAqLworICAgIG9sZHNpemUgPSBiYXNlLT50cF9iYXNpY3NpemU7CisgICAgbmV3c2l6ZSA9IHR5cGUtPnRwX2Jhc2ljc2l6ZSA/IHR5cGUtPnRwX2Jhc2ljc2l6ZSA6IG9sZHNpemU7CisgICAgaWYgKCEodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpICYmCisgICAgICAgIChiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9HQykgJiYKKyAgICAgICAgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFLypHQyBzbG90cyBleGlzdCovKSAmJgorICAgICAgICAoIXR5cGUtPnRwX3RyYXZlcnNlICYmICF0eXBlLT50cF9jbGVhcikpIHsKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19IQVZFX0dDOworICAgICAgICBpZiAodHlwZS0+dHBfdHJhdmVyc2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHR5cGUtPnRwX3RyYXZlcnNlID0gYmFzZS0+dHBfdHJhdmVyc2U7CisgICAgICAgIGlmICh0eXBlLT50cF9jbGVhciA9PSBOVUxMKQorICAgICAgICAgICAgdHlwZS0+dHBfY2xlYXIgPSBiYXNlLT50cF9jbGVhcjsKKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpIHsKKyAgICAgICAgLyogVGhlIGNvbmRpdGlvbiBiZWxvdyBjb3VsZCB1c2Ugc29tZSBleHBsYW5hdGlvbi4KKyAgICAgICAgICAgSXQgYXBwZWFycyB0aGF0IHRwX25ldyBpcyBub3QgaW5oZXJpdGVkIGZvciBzdGF0aWMgdHlwZXMKKyAgICAgICAgICAgd2hvc2UgYmFzZSBjbGFzcyBpcyAnb2JqZWN0JzsgdGhpcyBzZWVtcyB0byBiZSBhIHByZWNhdXRpb24KKyAgICAgICAgICAgc28gdGhhdCBvbGQgZXh0ZW5zaW9uIHR5cGVzIGRvbid0IHN1ZGRlbmx5IGJlY29tZQorICAgICAgICAgICBjYWxsYWJsZSAob2JqZWN0Ll9fbmV3X18gd291bGRuJ3QgaW5zdXJlIHRoZSBpbnZhcmlhbnRzCisgICAgICAgICAgIHRoYXQgdGhlIGV4dGVuc2lvbiB0eXBlJ3Mgb3duIGZhY3RvcnkgZnVuY3Rpb24gZW5zdXJlcykuCisgICAgICAgICAgIEhlYXAgdHlwZXMsIG9mIGNvdXJzZSwgYXJlIHVuZGVyIG91ciBjb250cm9sLCBzbyB0aGV5IGRvCisgICAgICAgICAgIGluaGVyaXQgdHBfbmV3OyBzdGF0aWMgZXh0ZW5zaW9uIHR5cGVzIHRoYXQgc3BlY2lmeSBzb21lCisgICAgICAgICAgIG90aGVyIGJ1aWx0LWluIHR5cGUgYXMgdGhlIGRlZmF1bHQgYXJlIGNvbnNpZGVyZWQKKyAgICAgICAgICAgbmV3LXN0eWxlLWF3YXJlIHNvIHRoZXkgYWxzbyBpbmhlcml0IG9iamVjdC5fX25ld19fLiAqLworICAgICAgICBpZiAoYmFzZSAhPSAmUHlCYXNlT2JqZWN0X1R5cGUgfHwKKyAgICAgICAgICAgICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKSB7CisgICAgICAgICAgICBpZiAodHlwZS0+dHBfbmV3ID09IE5VTEwpCisgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmV3ID0gYmFzZS0+dHBfbmV3OworICAgICAgICB9CisgICAgfQorICAgIHR5cGUtPnRwX2Jhc2ljc2l6ZSA9IG5ld3NpemU7CiAKLQkvKiBDb3B5IG90aGVyIG5vbi1mdW5jdGlvbiBzbG90cyAqLworICAgIC8qIENvcHkgb3RoZXIgbm9uLWZ1bmN0aW9uIHNsb3RzICovCiAKICN1bmRlZiBDT1BZVkFMCiAjZGVmaW5lIENPUFlWQUwoU0xPVCkgXAotCWlmICh0eXBlLT5TTE9UID09IDApIHR5cGUtPlNMT1QgPSBiYXNlLT5TTE9UCisgICAgaWYgKHR5cGUtPlNMT1QgPT0gMCkgdHlwZS0+U0xPVCA9IGJhc2UtPlNMT1QKIAotCUNPUFlWQUwodHBfaXRlbXNpemUpOwotCWlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTKSB7Ci0JCUNPUFlWQUwodHBfd2Vha2xpc3RvZmZzZXQpOwotCX0KLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9DTEFTUykgewotCQlDT1BZVkFMKHRwX2RpY3RvZmZzZXQpOwotCX0KKyAgICBDT1BZVkFMKHRwX2l0ZW1zaXplKTsKKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUykgeworICAgICAgICBDT1BZVkFMKHRwX3dlYWtsaXN0b2Zmc2V0KTsKKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MpIHsKKyAgICAgICAgQ09QWVZBTCh0cF9kaWN0b2Zmc2V0KTsKKyAgICB9CiAKLQkvKiBTZXR1cCBmYXN0IHN1YmNsYXNzIGZsYWdzICovCi0JaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgKFB5VHlwZU9iamVjdCopUHlFeGNfQmFzZUV4Y2VwdGlvbikpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfQkFTRV9FWENfU1VCQ0xBU1M7Ci0JZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShiYXNlLCAmUHlUeXBlX1R5cGUpKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1M7Ci0JZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShiYXNlLCAmUHlJbnRfVHlwZSkpCi0JCXR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSU5UX1NVQkNMQVNTOwotCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5TG9uZ19UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19MT05HX1NVQkNMQVNTOwotCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5U3RyaW5nX1R5cGUpKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUzsKKyAgICAvKiBTZXR1cCBmYXN0IHN1YmNsYXNzIGZsYWdzICovCisgICAgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgKFB5VHlwZU9iamVjdCopUHlFeGNfQmFzZUV4Y2VwdGlvbikpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfQkFTRV9FWENfU1VCQ0xBU1M7CisgICAgZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShiYXNlLCAmUHlUeXBlX1R5cGUpKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1M7CisgICAgZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShiYXNlLCAmUHlJbnRfVHlwZSkpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfSU5UX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5TG9uZ19UeXBlKSkKKyAgICAgICAgdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19MT05HX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5U3RyaW5nX1R5cGUpKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUzsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShiYXNlLCAmUHlVbmljb2RlX1R5cGUpKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1VOSUNPREVfU1VCQ0xBU1M7CisgICAgZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShiYXNlLCAmUHlVbmljb2RlX1R5cGUpKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1VOSUNPREVfU1VCQ0xBU1M7CiAjZW5kaWYKLQllbHNlIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGJhc2UsICZQeVR1cGxlX1R5cGUpKQotCQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTOwotCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5TGlzdF9UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19MSVNUX1NVQkNMQVNTOwotCWVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5RGljdF9UeXBlKSkKLQkJdHlwZS0+dHBfZmxhZ3MgfD0gUHlfVFBGTEFHU19ESUNUX1NVQkNMQVNTOworICAgIGVsc2UgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoYmFzZSwgJlB5VHVwbGVfVHlwZSkpCisgICAgICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfVFVQTEVfU1VCQ0xBU1M7CisgICAgZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShiYXNlLCAmUHlMaXN0X1R5cGUpKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0xJU1RfU1VCQ0xBU1M7CisgICAgZWxzZSBpZiAoUHlUeXBlX0lzU3VidHlwZShiYXNlLCAmUHlEaWN0X1R5cGUpKQorICAgICAgICB0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX0RJQ1RfU1VCQ0xBU1M7CiB9CiAKIHN0YXRpYyBpbnQKIG92ZXJyaWRlc19uYW1lKFB5VHlwZU9iamVjdCAqdHlwZSwgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CisgICAgUHlPYmplY3QgKmRpY3QgPSB0eXBlLT50cF9kaWN0OwogCi0JYXNzZXJ0KGRpY3QgIT0gTlVMTCk7Ci0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsIG5hbWUpICE9IE5VTEwpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgIGFzc2VydChkaWN0ICE9IE5VTEwpOworICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCBuYW1lKSAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogI2RlZmluZSBPVkVSUklERVNfSEFTSCh4KSAgICAgICBvdmVycmlkZXNfbmFtZSh4LCAiX19oYXNoX18iKQpAQCAtMzcxMyw3ICszNzEzLDcgQEAKIHN0YXRpYyB2b2lkCiBpbmhlcml0X3Nsb3RzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlUeXBlT2JqZWN0ICpiYXNlKQogewotCVB5VHlwZU9iamVjdCAqYmFzZWJhc2U7CisgICAgUHlUeXBlT2JqZWN0ICpiYXNlYmFzZTsKIAogI3VuZGVmIFNMT1RERUZJTkVECiAjdW5kZWYgQ09QWVNMT1QKQEAgLTM3MjMsMTg1ICszNzIzLDE4NSBAQAogI3VuZGVmIENPUFlCVUYKIAogI2RlZmluZSBTTE9UREVGSU5FRChTTE9UKSBcCi0JKGJhc2UtPlNMT1QgIT0gMCAmJiBcCi0JIChiYXNlYmFzZSA9PSBOVUxMIHx8IGJhc2UtPlNMT1QgIT0gYmFzZWJhc2UtPlNMT1QpKQorICAgIChiYXNlLT5TTE9UICE9IDAgJiYgXAorICAgICAoYmFzZWJhc2UgPT0gTlVMTCB8fCBiYXNlLT5TTE9UICE9IGJhc2ViYXNlLT5TTE9UKSkKIAogI2RlZmluZSBDT1BZU0xPVChTTE9UKSBcCi0JaWYgKCF0eXBlLT5TTE9UICYmIFNMT1RERUZJTkVEKFNMT1QpKSB0eXBlLT5TTE9UID0gYmFzZS0+U0xPVAorICAgIGlmICghdHlwZS0+U0xPVCAmJiBTTE9UREVGSU5FRChTTE9UKSkgdHlwZS0+U0xPVCA9IGJhc2UtPlNMT1QKIAogI2RlZmluZSBDT1BZTlVNKFNMT1QpIENPUFlTTE9UKHRwX2FzX251bWJlci0+U0xPVCkKICNkZWZpbmUgQ09QWVNFUShTTE9UKSBDT1BZU0xPVCh0cF9hc19zZXF1ZW5jZS0+U0xPVCkKICNkZWZpbmUgQ09QWU1BUChTTE9UKSBDT1BZU0xPVCh0cF9hc19tYXBwaW5nLT5TTE9UKQogI2RlZmluZSBDT1BZQlVGKFNMT1QpIENPUFlTTE9UKHRwX2FzX2J1ZmZlci0+U0xPVCkKIAotCS8qIFRoaXMgd29uJ3QgaW5oZXJpdCBpbmRpcmVjdCBzbG90cyAoZnJvbSB0cF9hc19udW1iZXIgZXRjLikKLQkgICBpZiB0eXBlIGRvZXNuJ3QgcHJvdmlkZSB0aGUgc3BhY2UuICovCisgICAgLyogVGhpcyB3b24ndCBpbmhlcml0IGluZGlyZWN0IHNsb3RzIChmcm9tIHRwX2FzX251bWJlciBldGMuKQorICAgICAgIGlmIHR5cGUgZG9lc24ndCBwcm92aWRlIHRoZSBzcGFjZS4gKi8KIAotCWlmICh0eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBiYXNlLT50cF9hc19udW1iZXIgIT0gTlVMTCkgewotCQliYXNlYmFzZSA9IGJhc2UtPnRwX2Jhc2U7Ci0JCWlmIChiYXNlYmFzZS0+dHBfYXNfbnVtYmVyID09IE5VTEwpCi0JCQliYXNlYmFzZSA9IE5VTEw7Ci0JCUNPUFlOVU0obmJfYWRkKTsKLQkJQ09QWU5VTShuYl9zdWJ0cmFjdCk7Ci0JCUNPUFlOVU0obmJfbXVsdGlwbHkpOwotCQlDT1BZTlVNKG5iX2RpdmlkZSk7Ci0JCUNPUFlOVU0obmJfcmVtYWluZGVyKTsKLQkJQ09QWU5VTShuYl9kaXZtb2QpOwotCQlDT1BZTlVNKG5iX3Bvd2VyKTsKLQkJQ09QWU5VTShuYl9uZWdhdGl2ZSk7Ci0JCUNPUFlOVU0obmJfcG9zaXRpdmUpOwotCQlDT1BZTlVNKG5iX2Fic29sdXRlKTsKLQkJQ09QWU5VTShuYl9ub256ZXJvKTsKLQkJQ09QWU5VTShuYl9pbnZlcnQpOwotCQlDT1BZTlVNKG5iX2xzaGlmdCk7Ci0JCUNPUFlOVU0obmJfcnNoaWZ0KTsKLQkJQ09QWU5VTShuYl9hbmQpOwotCQlDT1BZTlVNKG5iX3hvcik7Ci0JCUNPUFlOVU0obmJfb3IpOwotCQlDT1BZTlVNKG5iX2NvZXJjZSk7Ci0JCUNPUFlOVU0obmJfaW50KTsKLQkJQ09QWU5VTShuYl9sb25nKTsKLQkJQ09QWU5VTShuYl9mbG9hdCk7Ci0JCUNPUFlOVU0obmJfb2N0KTsKLQkJQ09QWU5VTShuYl9oZXgpOwotCQlDT1BZTlVNKG5iX2lucGxhY2VfYWRkKTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX3N1YnRyYWN0KTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX211bHRpcGx5KTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX2RpdmlkZSk7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9yZW1haW5kZXIpOwotCQlDT1BZTlVNKG5iX2lucGxhY2VfcG93ZXIpOwotCQlDT1BZTlVNKG5iX2lucGxhY2VfbHNoaWZ0KTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX3JzaGlmdCk7Ci0JCUNPUFlOVU0obmJfaW5wbGFjZV9hbmQpOwotCQlDT1BZTlVNKG5iX2lucGxhY2VfeG9yKTsKLQkJQ09QWU5VTShuYl9pbnBsYWNlX29yKTsKLQkJaWYgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19DSEVDS1RZUEVTKSB7Ci0JCQlDT1BZTlVNKG5iX3RydWVfZGl2aWRlKTsKLQkJCUNPUFlOVU0obmJfZmxvb3JfZGl2aWRlKTsKLQkJCUNPUFlOVU0obmJfaW5wbGFjZV90cnVlX2RpdmlkZSk7Ci0JCQlDT1BZTlVNKG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlKTsKLQkJfQotCQlpZiAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSU5ERVgpIHsKLQkJCUNPUFlOVU0obmJfaW5kZXgpOwotCQl9Ci0JfQorICAgIGlmICh0eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBiYXNlLT50cF9hc19udW1iZXIgIT0gTlVMTCkgeworICAgICAgICBiYXNlYmFzZSA9IGJhc2UtPnRwX2Jhc2U7CisgICAgICAgIGlmIChiYXNlYmFzZS0+dHBfYXNfbnVtYmVyID09IE5VTEwpCisgICAgICAgICAgICBiYXNlYmFzZSA9IE5VTEw7CisgICAgICAgIENPUFlOVU0obmJfYWRkKTsKKyAgICAgICAgQ09QWU5VTShuYl9zdWJ0cmFjdCk7CisgICAgICAgIENPUFlOVU0obmJfbXVsdGlwbHkpOworICAgICAgICBDT1BZTlVNKG5iX2RpdmlkZSk7CisgICAgICAgIENPUFlOVU0obmJfcmVtYWluZGVyKTsKKyAgICAgICAgQ09QWU5VTShuYl9kaXZtb2QpOworICAgICAgICBDT1BZTlVNKG5iX3Bvd2VyKTsKKyAgICAgICAgQ09QWU5VTShuYl9uZWdhdGl2ZSk7CisgICAgICAgIENPUFlOVU0obmJfcG9zaXRpdmUpOworICAgICAgICBDT1BZTlVNKG5iX2Fic29sdXRlKTsKKyAgICAgICAgQ09QWU5VTShuYl9ub256ZXJvKTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnZlcnQpOworICAgICAgICBDT1BZTlVNKG5iX2xzaGlmdCk7CisgICAgICAgIENPUFlOVU0obmJfcnNoaWZ0KTsKKyAgICAgICAgQ09QWU5VTShuYl9hbmQpOworICAgICAgICBDT1BZTlVNKG5iX3hvcik7CisgICAgICAgIENPUFlOVU0obmJfb3IpOworICAgICAgICBDT1BZTlVNKG5iX2NvZXJjZSk7CisgICAgICAgIENPUFlOVU0obmJfaW50KTsKKyAgICAgICAgQ09QWU5VTShuYl9sb25nKTsKKyAgICAgICAgQ09QWU5VTShuYl9mbG9hdCk7CisgICAgICAgIENPUFlOVU0obmJfb2N0KTsKKyAgICAgICAgQ09QWU5VTShuYl9oZXgpOworICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfYWRkKTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX3N1YnRyYWN0KTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX211bHRpcGx5KTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX2RpdmlkZSk7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9yZW1haW5kZXIpOworICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfcG93ZXIpOworICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfbHNoaWZ0KTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX3JzaGlmdCk7CisgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV9hbmQpOworICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfeG9yKTsKKyAgICAgICAgQ09QWU5VTShuYl9pbnBsYWNlX29yKTsKKyAgICAgICAgaWYgKGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19DSEVDS1RZUEVTKSB7CisgICAgICAgICAgICBDT1BZTlVNKG5iX3RydWVfZGl2aWRlKTsKKyAgICAgICAgICAgIENPUFlOVU0obmJfZmxvb3JfZGl2aWRlKTsKKyAgICAgICAgICAgIENPUFlOVU0obmJfaW5wbGFjZV90cnVlX2RpdmlkZSk7CisgICAgICAgICAgICBDT1BZTlVNKG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfSU5ERVgpIHsKKyAgICAgICAgICAgIENPUFlOVU0obmJfaW5kZXgpOworICAgICAgICB9CisgICAgfQogCi0JaWYgKHR5cGUtPnRwX2FzX3NlcXVlbmNlICE9IE5VTEwgJiYgYmFzZS0+dHBfYXNfc2VxdWVuY2UgIT0gTlVMTCkgewotCQliYXNlYmFzZSA9IGJhc2UtPnRwX2Jhc2U7Ci0JCWlmIChiYXNlYmFzZS0+dHBfYXNfc2VxdWVuY2UgPT0gTlVMTCkKLQkJCWJhc2ViYXNlID0gTlVMTDsKLQkJQ09QWVNFUShzcV9sZW5ndGgpOwotCQlDT1BZU0VRKHNxX2NvbmNhdCk7Ci0JCUNPUFlTRVEoc3FfcmVwZWF0KTsKLQkJQ09QWVNFUShzcV9pdGVtKTsKLQkJQ09QWVNFUShzcV9zbGljZSk7Ci0JCUNPUFlTRVEoc3FfYXNzX2l0ZW0pOwotCQlDT1BZU0VRKHNxX2Fzc19zbGljZSk7Ci0JCUNPUFlTRVEoc3FfY29udGFpbnMpOwotCQlDT1BZU0VRKHNxX2lucGxhY2VfY29uY2F0KTsKLQkJQ09QWVNFUShzcV9pbnBsYWNlX3JlcGVhdCk7Ci0JfQorICAgIGlmICh0eXBlLT50cF9hc19zZXF1ZW5jZSAhPSBOVUxMICYmIGJhc2UtPnRwX2FzX3NlcXVlbmNlICE9IE5VTEwpIHsKKyAgICAgICAgYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgICAgICBpZiAoYmFzZWJhc2UtPnRwX2FzX3NlcXVlbmNlID09IE5VTEwpCisgICAgICAgICAgICBiYXNlYmFzZSA9IE5VTEw7CisgICAgICAgIENPUFlTRVEoc3FfbGVuZ3RoKTsKKyAgICAgICAgQ09QWVNFUShzcV9jb25jYXQpOworICAgICAgICBDT1BZU0VRKHNxX3JlcGVhdCk7CisgICAgICAgIENPUFlTRVEoc3FfaXRlbSk7CisgICAgICAgIENPUFlTRVEoc3Ffc2xpY2UpOworICAgICAgICBDT1BZU0VRKHNxX2Fzc19pdGVtKTsKKyAgICAgICAgQ09QWVNFUShzcV9hc3Nfc2xpY2UpOworICAgICAgICBDT1BZU0VRKHNxX2NvbnRhaW5zKTsKKyAgICAgICAgQ09QWVNFUShzcV9pbnBsYWNlX2NvbmNhdCk7CisgICAgICAgIENPUFlTRVEoc3FfaW5wbGFjZV9yZXBlYXQpOworICAgIH0KIAotCWlmICh0eXBlLT50cF9hc19tYXBwaW5nICE9IE5VTEwgJiYgYmFzZS0+dHBfYXNfbWFwcGluZyAhPSBOVUxMKSB7Ci0JCWJhc2ViYXNlID0gYmFzZS0+dHBfYmFzZTsKLQkJaWYgKGJhc2ViYXNlLT50cF9hc19tYXBwaW5nID09IE5VTEwpCi0JCQliYXNlYmFzZSA9IE5VTEw7Ci0JCUNPUFlNQVAobXBfbGVuZ3RoKTsKLQkJQ09QWU1BUChtcF9zdWJzY3JpcHQpOwotCQlDT1BZTUFQKG1wX2Fzc19zdWJzY3JpcHQpOwotCX0KKyAgICBpZiAodHlwZS0+dHBfYXNfbWFwcGluZyAhPSBOVUxMICYmIGJhc2UtPnRwX2FzX21hcHBpbmcgIT0gTlVMTCkgeworICAgICAgICBiYXNlYmFzZSA9IGJhc2UtPnRwX2Jhc2U7CisgICAgICAgIGlmIChiYXNlYmFzZS0+dHBfYXNfbWFwcGluZyA9PSBOVUxMKQorICAgICAgICAgICAgYmFzZWJhc2UgPSBOVUxMOworICAgICAgICBDT1BZTUFQKG1wX2xlbmd0aCk7CisgICAgICAgIENPUFlNQVAobXBfc3Vic2NyaXB0KTsKKyAgICAgICAgQ09QWU1BUChtcF9hc3Nfc3Vic2NyaXB0KTsKKyAgICB9CiAKLQlpZiAodHlwZS0+dHBfYXNfYnVmZmVyICE9IE5VTEwgJiYgYmFzZS0+dHBfYXNfYnVmZmVyICE9IE5VTEwpIHsKLQkJYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOwotCQlpZiAoYmFzZWJhc2UtPnRwX2FzX2J1ZmZlciA9PSBOVUxMKQotCQkJYmFzZWJhc2UgPSBOVUxMOwotCQlDT1BZQlVGKGJmX2dldHJlYWRidWZmZXIpOwotCQlDT1BZQlVGKGJmX2dldHdyaXRlYnVmZmVyKTsKLQkJQ09QWUJVRihiZl9nZXRzZWdjb3VudCk7Ci0JCUNPUFlCVUYoYmZfZ2V0Y2hhcmJ1ZmZlcik7Ci0JCUNPUFlCVUYoYmZfZ2V0YnVmZmVyKTsKLQkJQ09QWUJVRihiZl9yZWxlYXNlYnVmZmVyKTsKLQl9CisgICAgaWYgKHR5cGUtPnRwX2FzX2J1ZmZlciAhPSBOVUxMICYmIGJhc2UtPnRwX2FzX2J1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIGJhc2ViYXNlID0gYmFzZS0+dHBfYmFzZTsKKyAgICAgICAgaWYgKGJhc2ViYXNlLT50cF9hc19idWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIGJhc2ViYXNlID0gTlVMTDsKKyAgICAgICAgQ09QWUJVRihiZl9nZXRyZWFkYnVmZmVyKTsKKyAgICAgICAgQ09QWUJVRihiZl9nZXR3cml0ZWJ1ZmZlcik7CisgICAgICAgIENPUFlCVUYoYmZfZ2V0c2VnY291bnQpOworICAgICAgICBDT1BZQlVGKGJmX2dldGNoYXJidWZmZXIpOworICAgICAgICBDT1BZQlVGKGJmX2dldGJ1ZmZlcik7CisgICAgICAgIENPUFlCVUYoYmZfcmVsZWFzZWJ1ZmZlcik7CisgICAgfQogCi0JYmFzZWJhc2UgPSBiYXNlLT50cF9iYXNlOworICAgIGJhc2ViYXNlID0gYmFzZS0+dHBfYmFzZTsKIAotCUNPUFlTTE9UKHRwX2RlYWxsb2MpOwotCUNPUFlTTE9UKHRwX3ByaW50KTsKLQlpZiAodHlwZS0+dHBfZ2V0YXR0ciA9PSBOVUxMICYmIHR5cGUtPnRwX2dldGF0dHJvID09IE5VTEwpIHsKLQkJdHlwZS0+dHBfZ2V0YXR0ciA9IGJhc2UtPnRwX2dldGF0dHI7Ci0JCXR5cGUtPnRwX2dldGF0dHJvID0gYmFzZS0+dHBfZ2V0YXR0cm87Ci0JfQotCWlmICh0eXBlLT50cF9zZXRhdHRyID09IE5VTEwgJiYgdHlwZS0+dHBfc2V0YXR0cm8gPT0gTlVMTCkgewotCQl0eXBlLT50cF9zZXRhdHRyID0gYmFzZS0+dHBfc2V0YXR0cjsKLQkJdHlwZS0+dHBfc2V0YXR0cm8gPSBiYXNlLT50cF9zZXRhdHRybzsKLQl9Ci0JLyogdHBfY29tcGFyZSBzZWUgdHBfcmljaGNvbXBhcmUgKi8KLQlDT1BZU0xPVCh0cF9yZXByKTsKLQkvKiB0cF9oYXNoIHNlZSB0cF9yaWNoY29tcGFyZSAqLwotCUNPUFlTTE9UKHRwX2NhbGwpOwotCUNPUFlTTE9UKHRwX3N0cik7Ci0JaWYgKHR5cGUtPnRwX2ZsYWdzICYgYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUpIHsKLQkJaWYgKHR5cGUtPnRwX2NvbXBhcmUgPT0gTlVMTCAmJgotCQkgICAgdHlwZS0+dHBfcmljaGNvbXBhcmUgPT0gTlVMTCAmJgotCQkgICAgdHlwZS0+dHBfaGFzaCA9PSBOVUxMKQotCQl7Ci0JCQl0eXBlLT50cF9jb21wYXJlID0gYmFzZS0+dHBfY29tcGFyZTsKLQkJCXR5cGUtPnRwX3JpY2hjb21wYXJlID0gYmFzZS0+dHBfcmljaGNvbXBhcmU7Ci0JCQl0eXBlLT50cF9oYXNoID0gYmFzZS0+dHBfaGFzaDsKLQkJCS8qIENoZWNrIGZvciBjaGFuZ2VzIHRvIGluaGVyaXRlZCBtZXRob2RzIGluIFB5M2sqLwotCQkJaWYgKFB5X1B5M2tXYXJuaW5nRmxhZykgewotCQkJCWlmIChiYXNlLT50cF9oYXNoICYmCi0JCQkJCQkoYmFzZS0+dHBfaGFzaCAhPSBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQpICYmCi0JCQkJCQkhT1ZFUlJJREVTX0hBU0godHlwZSkpIHsKLQkJCQkJaWYgKE9WRVJSSURFU19DTVAodHlwZSkpIHsKLQkJCQkJCVB5RXJyX1dhcm5QeTNrKCJPdmVycmlkaW5nICIKLQkJCQkJCSAgIl9fY21wX18gYmxvY2tzIGluaGVyaXRhbmNlICIKLQkJCQkJCSAgIm9mIF9faGFzaF9fIGluIDMueCIsCi0JCQkJCQkgIDEpOwotCQkJCQl9Ci0JCQkJCWlmIChPVkVSUklERVNfRVEodHlwZSkpIHsKLQkJCQkJCVB5RXJyX1dhcm5QeTNrKCJPdmVycmlkaW5nICIKLQkJCQkJCSAgIl9fZXFfXyBibG9ja3MgaW5oZXJpdGFuY2UgIgotCQkJCQkJICAib2YgX19oYXNoX18gaW4gMy54IiwKLQkJCQkJCSAgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCUNPUFlTTE9UKHRwX2NvbXBhcmUpOwotCX0KLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9JVEVSKSB7Ci0JCUNPUFlTTE9UKHRwX2l0ZXIpOwotCQlDT1BZU0xPVCh0cF9pdGVybmV4dCk7Ci0JfQotCWlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSB7Ci0JCUNPUFlTTE9UKHRwX2Rlc2NyX2dldCk7Ci0JCUNPUFlTTE9UKHRwX2Rlc2NyX3NldCk7Ci0JCUNPUFlTTE9UKHRwX2RpY3RvZmZzZXQpOwotCQlDT1BZU0xPVCh0cF9pbml0KTsKLQkJQ09QWVNMT1QodHBfYWxsb2MpOwotCQlDT1BZU0xPVCh0cF9pc19nYyk7Ci0JCWlmICgodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpID09Ci0JCSAgICAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpKSB7Ci0JCQkvKiBUaGV5IGFncmVlIGFib3V0IGdjLiAqLwotCQkJQ09QWVNMT1QodHBfZnJlZSk7Ci0JCX0KLQkJZWxzZSBpZiAoKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSAmJgotCQkJIHR5cGUtPnRwX2ZyZWUgPT0gTlVMTCAmJgotCQkJIGJhc2UtPnRwX2ZyZWUgPT0gX1B5T2JqZWN0X0RlbCkgewotCQkJLyogQSBiaXQgb2YgbWFnaWMgdG8gcGx1ZyBpbiB0aGUgY29ycmVjdCBkZWZhdWx0Ci0JCQkgKiB0cF9mcmVlIGZ1bmN0aW9uIHdoZW4gYSBkZXJpdmVkIGNsYXNzIGFkZHMgZ2MsCi0JCQkgKiBkaWRuJ3QgZGVmaW5lIHRwX2ZyZWUsIGFuZCB0aGUgYmFzZSB1c2VzIHRoZQotCQkJICogZGVmYXVsdCBub24tZ2MgdHBfZnJlZS4KLQkJCSAqLwotCQkJdHlwZS0+dHBfZnJlZSA9IFB5T2JqZWN0X0dDX0RlbDsKLQkJfQotCQkvKiBlbHNlIHRoZXkgZGlkbid0IGFncmVlIGFib3V0IGdjLCBhbmQgdGhlcmUgaXNuJ3Qgc29tZXRoaW5nCi0JCSAqIG9idmlvdXMgdG8gYmUgZG9uZSAtLSB0aGUgdHlwZSBpcyBvbiBpdHMgb3duLgotCQkgKi8KLQl9CisgICAgQ09QWVNMT1QodHBfZGVhbGxvYyk7CisgICAgQ09QWVNMT1QodHBfcHJpbnQpOworICAgIGlmICh0eXBlLT50cF9nZXRhdHRyID09IE5VTEwgJiYgdHlwZS0+dHBfZ2V0YXR0cm8gPT0gTlVMTCkgeworICAgICAgICB0eXBlLT50cF9nZXRhdHRyID0gYmFzZS0+dHBfZ2V0YXR0cjsKKyAgICAgICAgdHlwZS0+dHBfZ2V0YXR0cm8gPSBiYXNlLT50cF9nZXRhdHRybzsKKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX3NldGF0dHIgPT0gTlVMTCAmJiB0eXBlLT50cF9zZXRhdHRybyA9PSBOVUxMKSB7CisgICAgICAgIHR5cGUtPnRwX3NldGF0dHIgPSBiYXNlLT50cF9zZXRhdHRyOworICAgICAgICB0eXBlLT50cF9zZXRhdHRybyA9IGJhc2UtPnRwX3NldGF0dHJvOworICAgIH0KKyAgICAvKiB0cF9jb21wYXJlIHNlZSB0cF9yaWNoY29tcGFyZSAqLworICAgIENPUFlTTE9UKHRwX3JlcHIpOworICAgIC8qIHRwX2hhc2ggc2VlIHRwX3JpY2hjb21wYXJlICovCisgICAgQ09QWVNMT1QodHBfY2FsbCk7CisgICAgQ09QWVNMT1QodHBfc3RyKTsKKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9SSUNIQ09NUEFSRSkgeworICAgICAgICBpZiAodHlwZS0+dHBfY29tcGFyZSA9PSBOVUxMICYmCisgICAgICAgICAgICB0eXBlLT50cF9yaWNoY29tcGFyZSA9PSBOVUxMICYmCisgICAgICAgICAgICB0eXBlLT50cF9oYXNoID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGUtPnRwX2NvbXBhcmUgPSBiYXNlLT50cF9jb21wYXJlOworICAgICAgICAgICAgdHlwZS0+dHBfcmljaGNvbXBhcmUgPSBiYXNlLT50cF9yaWNoY29tcGFyZTsKKyAgICAgICAgICAgIHR5cGUtPnRwX2hhc2ggPSBiYXNlLT50cF9oYXNoOworICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGNoYW5nZXMgdG8gaW5oZXJpdGVkIG1ldGhvZHMgaW4gUHkzayovCisgICAgICAgICAgICBpZiAoUHlfUHkza1dhcm5pbmdGbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKGJhc2UtPnRwX2hhc2ggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2UtPnRwX2hhc2ggIT0gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhT1ZFUlJJREVTX0hBU0godHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE9WRVJSSURFU19DTVAodHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1dhcm5QeTNrKCJPdmVycmlkaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fY21wX18gYmxvY2tzIGluaGVyaXRhbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIF9faGFzaF9fIGluIDMueCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChPVkVSUklERVNfRVEodHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1dhcm5QeTNrKCJPdmVycmlkaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fZXFfXyBibG9ja3MgaW5oZXJpdGFuY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib2YgX19oYXNoX18gaW4gMy54IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIENPUFlTTE9UKHRwX2NvbXBhcmUpOworICAgIH0KKyAgICBpZiAodHlwZS0+dHBfZmxhZ3MgJiBiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEFWRV9JVEVSKSB7CisgICAgICAgIENPUFlTTE9UKHRwX2l0ZXIpOworICAgICAgICBDT1BZU0xPVCh0cF9pdGVybmV4dCk7CisgICAgfQorICAgIGlmICh0eXBlLT50cF9mbGFncyAmIGJhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0NMQVNTKSB7CisgICAgICAgIENPUFlTTE9UKHRwX2Rlc2NyX2dldCk7CisgICAgICAgIENPUFlTTE9UKHRwX2Rlc2NyX3NldCk7CisgICAgICAgIENPUFlTTE9UKHRwX2RpY3RvZmZzZXQpOworICAgICAgICBDT1BZU0xPVCh0cF9pbml0KTsKKyAgICAgICAgQ09QWVNMT1QodHBfYWxsb2MpOworICAgICAgICBDT1BZU0xPVCh0cF9pc19nYyk7CisgICAgICAgIGlmICgodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpID09CisgICAgICAgICAgICAoYmFzZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hBVkVfR0MpKSB7CisgICAgICAgICAgICAvKiBUaGV5IGFncmVlIGFib3V0IGdjLiAqLworICAgICAgICAgICAgQ09QWVNMT1QodHBfZnJlZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IQVZFX0dDKSAmJgorICAgICAgICAgICAgICAgICB0eXBlLT50cF9mcmVlID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgYmFzZS0+dHBfZnJlZSA9PSBfUHlPYmplY3RfRGVsKSB7CisgICAgICAgICAgICAvKiBBIGJpdCBvZiBtYWdpYyB0byBwbHVnIGluIHRoZSBjb3JyZWN0IGRlZmF1bHQKKyAgICAgICAgICAgICAqIHRwX2ZyZWUgZnVuY3Rpb24gd2hlbiBhIGRlcml2ZWQgY2xhc3MgYWRkcyBnYywKKyAgICAgICAgICAgICAqIGRpZG4ndCBkZWZpbmUgdHBfZnJlZSwgYW5kIHRoZSBiYXNlIHVzZXMgdGhlCisgICAgICAgICAgICAgKiBkZWZhdWx0IG5vbi1nYyB0cF9mcmVlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0eXBlLT50cF9mcmVlID0gUHlPYmplY3RfR0NfRGVsOworICAgICAgICB9CisgICAgICAgIC8qIGVsc2UgdGhleSBkaWRuJ3QgYWdyZWUgYWJvdXQgZ2MsIGFuZCB0aGVyZSBpc24ndCBzb21ldGhpbmcKKyAgICAgICAgICogb2J2aW91cyB0byBiZSBkb25lIC0tIHRoZSB0eXBlIGlzIG9uIGl0cyBvd24uCisgICAgICAgICAqLworICAgIH0KIH0KIAogc3RhdGljIGludCBhZGRfb3BlcmF0b3JzKFB5VHlwZU9iamVjdCAqKTsKQEAgLTM5MDksMjQ0ICszOTA5LDI0NCBAQAogaW50CiBQeVR5cGVfUmVhZHkoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5T2JqZWN0ICpkaWN0LCAqYmFzZXM7Ci0JUHlUeXBlT2JqZWN0ICpiYXNlOwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBQeU9iamVjdCAqZGljdCwgKmJhc2VzOworICAgIFB5VHlwZU9iamVjdCAqYmFzZTsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKLQlpZiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX1JFQURZKSB7Ci0JCWFzc2VydCh0eXBlLT50cF9kaWN0ICE9IE5VTEwpOwotCQlyZXR1cm4gMDsKLQl9Ci0JYXNzZXJ0KCh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfUkVBRFlJTkcpID09IDApOworICAgIGlmICh0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfUkVBRFkpIHsKKyAgICAgICAgYXNzZXJ0KHR5cGUtPnRwX2RpY3QgIT0gTlVMTCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhc3NlcnQoKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19SRUFEWUlORykgPT0gMCk7CiAKLQl0eXBlLT50cF9mbGFncyB8PSBQeV9UUEZMQUdTX1JFQURZSU5HOworICAgIHR5cGUtPnRwX2ZsYWdzIHw9IFB5X1RQRkxBR1NfUkVBRFlJTkc7CiAKICNpZmRlZiBQeV9UUkFDRV9SRUZTCi0JLyogUHlUeXBlX1JlYWR5IGlzIHRoZSBjbG9zZXN0IHRoaW5nIHdlIGhhdmUgdG8gYSBjaG9rZSBwb2ludAotCSAqIGZvciB0eXBlIG9iamVjdHMsIHNvIGlzIHRoZSBiZXN0IHBsYWNlIEkgY2FuIHRoaW5rIG9mIHRvIHRyeQotCSAqIHRvIGdldCB0eXBlIG9iamVjdHMgaW50byB0aGUgZG91Ymx5LWxpbmtlZCBsaXN0IG9mIGFsbCBvYmplY3RzLgotCSAqIFN0aWxsLCBub3QgYWxsIHR5cGUgb2JqZWN0cyBnbyB0aHJ1IFB5VHlwZV9SZWFkeS4KLQkgKi8KLQlfUHlfQWRkVG9BbGxPYmplY3RzKChQeU9iamVjdCAqKXR5cGUsIDApOworICAgIC8qIFB5VHlwZV9SZWFkeSBpcyB0aGUgY2xvc2VzdCB0aGluZyB3ZSBoYXZlIHRvIGEgY2hva2UgcG9pbnQKKyAgICAgKiBmb3IgdHlwZSBvYmplY3RzLCBzbyBpcyB0aGUgYmVzdCBwbGFjZSBJIGNhbiB0aGluayBvZiB0byB0cnkKKyAgICAgKiB0byBnZXQgdHlwZSBvYmplY3RzIGludG8gdGhlIGRvdWJseS1saW5rZWQgbGlzdCBvZiBhbGwgb2JqZWN0cy4KKyAgICAgKiBTdGlsbCwgbm90IGFsbCB0eXBlIG9iamVjdHMgZ28gdGhydSBQeVR5cGVfUmVhZHkuCisgICAgICovCisgICAgX1B5X0FkZFRvQWxsT2JqZWN0cygoUHlPYmplY3QgKil0eXBlLCAwKTsKICNlbmRpZgogCi0JLyogSW5pdGlhbGl6ZSB0cF9iYXNlIChkZWZhdWx0cyB0byBCYXNlT2JqZWN0IHVubGVzcyB0aGF0J3MgdXMpICovCi0JYmFzZSA9IHR5cGUtPnRwX2Jhc2U7Ci0JaWYgKGJhc2UgPT0gTlVMTCAmJiB0eXBlICE9ICZQeUJhc2VPYmplY3RfVHlwZSkgewotCQliYXNlID0gdHlwZS0+dHBfYmFzZSA9ICZQeUJhc2VPYmplY3RfVHlwZTsKLQkJUHlfSU5DUkVGKGJhc2UpOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHRwX2Jhc2UgKGRlZmF1bHRzIHRvIEJhc2VPYmplY3QgdW5sZXNzIHRoYXQncyB1cykgKi8KKyAgICBiYXNlID0gdHlwZS0+dHBfYmFzZTsKKyAgICBpZiAoYmFzZSA9PSBOVUxMICYmIHR5cGUgIT0gJlB5QmFzZU9iamVjdF9UeXBlKSB7CisgICAgICAgIGJhc2UgPSB0eXBlLT50cF9iYXNlID0gJlB5QmFzZU9iamVjdF9UeXBlOworICAgICAgICBQeV9JTkNSRUYoYmFzZSk7CisgICAgfQogCi0JLyogTm93IHRoZSBvbmx5IHdheSBiYXNlIGNhbiBzdGlsbCBiZSBOVUxMIGlzIGlmIHR5cGUgaXMKLQkgKiAmUHlCYXNlT2JqZWN0X1R5cGUuCi0JICovCisgICAgLyogTm93IHRoZSBvbmx5IHdheSBiYXNlIGNhbiBzdGlsbCBiZSBOVUxMIGlzIGlmIHR5cGUgaXMKKyAgICAgKiAmUHlCYXNlT2JqZWN0X1R5cGUuCisgICAgICovCiAKLQkvKiBJbml0aWFsaXplIHRoZSBiYXNlIGNsYXNzICovCi0JaWYgKGJhc2UgJiYgYmFzZS0+dHBfZGljdCA9PSBOVUxMKSB7Ci0JCWlmIChQeVR5cGVfUmVhZHkoYmFzZSkgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzcyAqLworICAgIGlmIChiYXNlICYmIGJhc2UtPnRwX2RpY3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlUeXBlX1JlYWR5KGJhc2UpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JLyogSW5pdGlhbGl6ZSBvYl90eXBlIGlmIE5VTEwuCVRoaXMgbWVhbnMgZXh0ZW5zaW9ucyB0aGF0IHdhbnQgdG8gYmUKLQkgICBjb21waWxhYmxlIHNlcGFyYXRlbHkgb24gV2luZG93cyBjYW4gY2FsbCBQeVR5cGVfUmVhZHkoKSBpbnN0ZWFkIG9mCi0JICAgaW5pdGlhbGl6aW5nIHRoZSBvYl90eXBlIGZpZWxkIG9mIHRoZWlyIHR5cGUgb2JqZWN0cy4gKi8KLQkvKiBUaGUgdGVzdCBmb3IgYmFzZSAhPSBOVUxMIGlzIHJlYWxseSB1bm5lY2Vzc2FyeSwgc2luY2UgYmFzZSBpcyBvbmx5Ci0JICAgTlVMTCB3aGVuIHR5cGUgaXMgJlB5QmFzZU9iamVjdF9UeXBlLCBhbmQgd2Uga25vdyBpdHMgb2JfdHlwZSBpcwotCSAgIG5vdCBOVUxMIChpdCdzIGluaXRpYWxpemVkIHRvICZQeVR5cGVfVHlwZSkuCSBCdXQgY292ZXJpdHkgZG9lc24ndAotCSAgIGtub3cgdGhhdC4gKi8KLQlpZiAoUHlfVFlQRSh0eXBlKSA9PSBOVUxMICYmIGJhc2UgIT0gTlVMTCkKLQkJUHlfVFlQRSh0eXBlKSA9IFB5X1RZUEUoYmFzZSk7CisgICAgLyogSW5pdGlhbGl6ZSBvYl90eXBlIGlmIE5VTEwuICAgICAgVGhpcyBtZWFucyBleHRlbnNpb25zIHRoYXQgd2FudCB0byBiZQorICAgICAgIGNvbXBpbGFibGUgc2VwYXJhdGVseSBvbiBXaW5kb3dzIGNhbiBjYWxsIFB5VHlwZV9SZWFkeSgpIGluc3RlYWQgb2YKKyAgICAgICBpbml0aWFsaXppbmcgdGhlIG9iX3R5cGUgZmllbGQgb2YgdGhlaXIgdHlwZSBvYmplY3RzLiAqLworICAgIC8qIFRoZSB0ZXN0IGZvciBiYXNlICE9IE5VTEwgaXMgcmVhbGx5IHVubmVjZXNzYXJ5LCBzaW5jZSBiYXNlIGlzIG9ubHkKKyAgICAgICBOVUxMIHdoZW4gdHlwZSBpcyAmUHlCYXNlT2JqZWN0X1R5cGUsIGFuZCB3ZSBrbm93IGl0cyBvYl90eXBlIGlzCisgICAgICAgbm90IE5VTEwgKGl0J3MgaW5pdGlhbGl6ZWQgdG8gJlB5VHlwZV9UeXBlKS4gICAgICBCdXQgY292ZXJpdHkgZG9lc24ndAorICAgICAgIGtub3cgdGhhdC4gKi8KKyAgICBpZiAoUHlfVFlQRSh0eXBlKSA9PSBOVUxMICYmIGJhc2UgIT0gTlVMTCkKKyAgICAgICAgUHlfVFlQRSh0eXBlKSA9IFB5X1RZUEUoYmFzZSk7CiAKLQkvKiBJbml0aWFsaXplIHRwX2Jhc2VzICovCi0JYmFzZXMgPSB0eXBlLT50cF9iYXNlczsKLQlpZiAoYmFzZXMgPT0gTlVMTCkgewotCQlpZiAoYmFzZSA9PSBOVUxMKQotCQkJYmFzZXMgPSBQeVR1cGxlX05ldygwKTsKLQkJZWxzZQotCQkJYmFzZXMgPSBQeVR1cGxlX1BhY2soMSwgYmFzZSk7Ci0JCWlmIChiYXNlcyA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJdHlwZS0+dHBfYmFzZXMgPSBiYXNlczsKLQl9CisgICAgLyogSW5pdGlhbGl6ZSB0cF9iYXNlcyAqLworICAgIGJhc2VzID0gdHlwZS0+dHBfYmFzZXM7CisgICAgaWYgKGJhc2VzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGJhc2UgPT0gTlVMTCkKKyAgICAgICAgICAgIGJhc2VzID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJhc2VzID0gUHlUdXBsZV9QYWNrKDEsIGJhc2UpOworICAgICAgICBpZiAoYmFzZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHR5cGUtPnRwX2Jhc2VzID0gYmFzZXM7CisgICAgfQogCi0JLyogSW5pdGlhbGl6ZSB0cF9kaWN0ICovCi0JZGljdCA9IHR5cGUtPnRwX2RpY3Q7Ci0JaWYgKGRpY3QgPT0gTlVMTCkgewotCQlkaWN0ID0gUHlEaWN0X05ldygpOwotCQlpZiAoZGljdCA9PSBOVUxMKQotCQkJZ290byBlcnJvcjsKLQkJdHlwZS0+dHBfZGljdCA9IGRpY3Q7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgdHBfZGljdCAqLworICAgIGRpY3QgPSB0eXBlLT50cF9kaWN0OworICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHR5cGUtPnRwX2RpY3QgPSBkaWN0OworICAgIH0KIAotCS8qIEFkZCB0eXBlLXNwZWNpZmljIGRlc2NyaXB0b3JzIHRvIHRwX2RpY3QgKi8KLQlpZiAoYWRkX29wZXJhdG9ycyh0eXBlKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JaWYgKHR5cGUtPnRwX21ldGhvZHMgIT0gTlVMTCkgewotCQlpZiAoYWRkX21ldGhvZHModHlwZSwgdHlwZS0+dHBfbWV0aG9kcykgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9Ci0JaWYgKHR5cGUtPnRwX21lbWJlcnMgIT0gTlVMTCkgewotCQlpZiAoYWRkX21lbWJlcnModHlwZSwgdHlwZS0+dHBfbWVtYmVycykgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9Ci0JaWYgKHR5cGUtPnRwX2dldHNldCAhPSBOVUxMKSB7Ci0JCWlmIChhZGRfZ2V0c2V0KHR5cGUsIHR5cGUtPnRwX2dldHNldCkgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogQWRkIHR5cGUtc3BlY2lmaWMgZGVzY3JpcHRvcnMgdG8gdHBfZGljdCAqLworICAgIGlmIChhZGRfb3BlcmF0b3JzKHR5cGUpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAodHlwZS0+dHBfbWV0aG9kcyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhZGRfbWV0aG9kcyh0eXBlLCB0eXBlLT50cF9tZXRob2RzKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAodHlwZS0+dHBfbWVtYmVycyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhZGRfbWVtYmVycyh0eXBlLCB0eXBlLT50cF9tZW1iZXJzKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBpZiAodHlwZS0+dHBfZ2V0c2V0ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGFkZF9nZXRzZXQodHlwZSwgdHlwZS0+dHBfZ2V0c2V0KSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCS8qIENhbGN1bGF0ZSBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciAqLwotCWlmIChtcm9faW50ZXJuYWwodHlwZSkgPCAwKSB7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIC8qIENhbGN1bGF0ZSBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciAqLworICAgIGlmIChtcm9faW50ZXJuYWwodHlwZSkgPCAwKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JLyogSW5oZXJpdCBzcGVjaWFsIGZsYWdzIGZyb20gZG9taW5hbnQgYmFzZSAqLwotCWlmICh0eXBlLT50cF9iYXNlICE9IE5VTEwpCi0JCWluaGVyaXRfc3BlY2lhbCh0eXBlLCB0eXBlLT50cF9iYXNlKTsKKyAgICAvKiBJbmhlcml0IHNwZWNpYWwgZmxhZ3MgZnJvbSBkb21pbmFudCBiYXNlICovCisgICAgaWYgKHR5cGUtPnRwX2Jhc2UgIT0gTlVMTCkKKyAgICAgICAgaW5oZXJpdF9zcGVjaWFsKHR5cGUsIHR5cGUtPnRwX2Jhc2UpOwogCi0JLyogSW5pdGlhbGl6ZSB0cF9kaWN0IHByb3Blcmx5ICovCi0JYmFzZXMgPSB0eXBlLT50cF9tcm87Ci0JYXNzZXJ0KGJhc2VzICE9IE5VTEwpOwotCWFzc2VydChQeVR1cGxlX0NoZWNrKGJhc2VzKSk7Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOwotCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJaWYgKFB5VHlwZV9DaGVjayhiKSkKLQkJCWluaGVyaXRfc2xvdHModHlwZSwgKFB5VHlwZU9iamVjdCAqKWIpOwotCX0KKyAgICAvKiBJbml0aWFsaXplIHRwX2RpY3QgcHJvcGVybHkgKi8KKyAgICBiYXNlcyA9IHR5cGUtPnRwX21ybzsKKyAgICBhc3NlcnQoYmFzZXMgIT0gTlVMTCk7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYmFzZXMpKTsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7CisgICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqYiA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOworICAgICAgICBpZiAoUHlUeXBlX0NoZWNrKGIpKQorICAgICAgICAgICAgaW5oZXJpdF9zbG90cyh0eXBlLCAoUHlUeXBlT2JqZWN0ICopYik7CisgICAgfQogCi0JLyogU2FuaXR5IGNoZWNrIGZvciB0cF9mcmVlLiAqLwotCWlmIChQeVR5cGVfSVNfR0ModHlwZSkgJiYgKHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19CQVNFVFlQRSkgJiYKLQkgICAgKHR5cGUtPnRwX2ZyZWUgPT0gTlVMTCB8fCB0eXBlLT50cF9mcmVlID09IFB5T2JqZWN0X0RlbCkpIHsKLQkJLyogVGhpcyBiYXNlIGNsYXNzIG5lZWRzIHRvIGNhbGwgdHBfZnJlZSwgYnV0IGRvZXNuJ3QgaGF2ZQotCQkgKiBvbmUsIG9yIGl0cyB0cF9mcmVlIGlzIGZvciBub24tZ2MnZWQgb2JqZWN0cy4KLQkJICovCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJ0eXBlICclLjEwMHMnIHBhcnRpY2lwYXRlcyBpbiAiCi0JCQkgICAgICJnYyBhbmQgaXMgYSBiYXNlIHR5cGUgYnV0IGhhcyBpbmFwcHJvcHJpYXRlICIKLQkJCSAgICAgInRwX2ZyZWUgc2xvdCIsCi0JCQkgICAgIHR5cGUtPnRwX25hbWUpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICAvKiBTYW5pdHkgY2hlY2sgZm9yIHRwX2ZyZWUuICovCisgICAgaWYgKFB5VHlwZV9JU19HQyh0eXBlKSAmJiAodHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0JBU0VUWVBFKSAmJgorICAgICAgICAodHlwZS0+dHBfZnJlZSA9PSBOVUxMIHx8IHR5cGUtPnRwX2ZyZWUgPT0gUHlPYmplY3RfRGVsKSkgeworICAgICAgICAvKiBUaGlzIGJhc2UgY2xhc3MgbmVlZHMgdG8gY2FsbCB0cF9mcmVlLCBidXQgZG9lc24ndCBoYXZlCisgICAgICAgICAqIG9uZSwgb3IgaXRzIHRwX2ZyZWUgaXMgZm9yIG5vbi1nYydlZCBvYmplY3RzLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInR5cGUgJyUuMTAwcycgcGFydGljaXBhdGVzIGluICIKKyAgICAgICAgICAgICAgICAgICAgICJnYyBhbmQgaXMgYSBiYXNlIHR5cGUgYnV0IGhhcyBpbmFwcHJvcHJpYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICJ0cF9mcmVlIHNsb3QiLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JLyogaWYgdGhlIHR5cGUgZGljdGlvbmFyeSBkb2Vzbid0IGNvbnRhaW4gYSBfX2RvY19fLCBzZXQgaXQgZnJvbQotCSAgIHRoZSB0cF9kb2Mgc2xvdC4KLQkgKi8KLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fZG9jX18iKSA9PSBOVUxMKSB7Ci0JCWlmICh0eXBlLT50cF9kb2MgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKmRvYyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodHlwZS0+dHBfZG9jKTsKLQkJCWlmIChkb2MgPT0gTlVMTCkKLQkJCQlnb3RvIGVycm9yOwotCQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fZG9jX18iLCBkb2MpOwotCQkJUHlfREVDUkVGKGRvYyk7Ci0JCX0gZWxzZSB7Ci0JCQlQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LAotCQkJCQkgICAgICJfX2RvY19fIiwgUHlfTm9uZSk7Ci0JCX0KLQl9CisgICAgLyogaWYgdGhlIHR5cGUgZGljdGlvbmFyeSBkb2Vzbid0IGNvbnRhaW4gYSBfX2RvY19fLCBzZXQgaXQgZnJvbQorICAgICAgIHRoZSB0cF9kb2Mgc2xvdC4KKyAgICAgKi8KKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fZG9jX18iKSA9PSBOVUxMKSB7CisgICAgICAgIGlmICh0eXBlLT50cF9kb2MgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKmRvYyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodHlwZS0+dHBfZG9jKTsKKyAgICAgICAgICAgIGlmIChkb2MgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fZG9jX18iLCBkb2MpOworICAgICAgICAgICAgUHlfREVDUkVGKGRvYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fZG9jX18iLCBQeV9Ob25lKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIFNvbWUgbW9yZSBzcGVjaWFsIHN0dWZmICovCi0JYmFzZSA9IHR5cGUtPnRwX2Jhc2U7Ci0JaWYgKGJhc2UgIT0gTlVMTCkgewotCQlpZiAodHlwZS0+dHBfYXNfbnVtYmVyID09IE5VTEwpCi0JCQl0eXBlLT50cF9hc19udW1iZXIgPSBiYXNlLT50cF9hc19udW1iZXI7Ci0JCWlmICh0eXBlLT50cF9hc19zZXF1ZW5jZSA9PSBOVUxMKQotCQkJdHlwZS0+dHBfYXNfc2VxdWVuY2UgPSBiYXNlLT50cF9hc19zZXF1ZW5jZTsKLQkJaWYgKHR5cGUtPnRwX2FzX21hcHBpbmcgPT0gTlVMTCkKLQkJCXR5cGUtPnRwX2FzX21hcHBpbmcgPSBiYXNlLT50cF9hc19tYXBwaW5nOwotCQlpZiAodHlwZS0+dHBfYXNfYnVmZmVyID09IE5VTEwpCi0JCQl0eXBlLT50cF9hc19idWZmZXIgPSBiYXNlLT50cF9hc19idWZmZXI7Ci0JfQorICAgIC8qIFNvbWUgbW9yZSBzcGVjaWFsIHN0dWZmICovCisgICAgYmFzZSA9IHR5cGUtPnRwX2Jhc2U7CisgICAgaWYgKGJhc2UgIT0gTlVMTCkgeworICAgICAgICBpZiAodHlwZS0+dHBfYXNfbnVtYmVyID09IE5VTEwpCisgICAgICAgICAgICB0eXBlLT50cF9hc19udW1iZXIgPSBiYXNlLT50cF9hc19udW1iZXI7CisgICAgICAgIGlmICh0eXBlLT50cF9hc19zZXF1ZW5jZSA9PSBOVUxMKQorICAgICAgICAgICAgdHlwZS0+dHBfYXNfc2VxdWVuY2UgPSBiYXNlLT50cF9hc19zZXF1ZW5jZTsKKyAgICAgICAgaWYgKHR5cGUtPnRwX2FzX21hcHBpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIHR5cGUtPnRwX2FzX21hcHBpbmcgPSBiYXNlLT50cF9hc19tYXBwaW5nOworICAgICAgICBpZiAodHlwZS0+dHBfYXNfYnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICB0eXBlLT50cF9hc19idWZmZXIgPSBiYXNlLT50cF9hc19idWZmZXI7CisgICAgfQogCi0JLyogTGluayBpbnRvIGVhY2ggYmFzZSBjbGFzcydzIGxpc3Qgb2Ygc3ViY2xhc3NlcyAqLwotCWJhc2VzID0gdHlwZS0+dHBfYmFzZXM7Ci0JbiA9IFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUHlPYmplY3QgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCBpKTsKLQkJaWYgKFB5VHlwZV9DaGVjayhiKSAmJgotCQkgICAgYWRkX3N1YmNsYXNzKChQeVR5cGVPYmplY3QgKiliLCB0eXBlKSA8IDApCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICAvKiBMaW5rIGludG8gZWFjaCBiYXNlIGNsYXNzJ3MgbGlzdCBvZiBzdWJjbGFzc2VzICovCisgICAgYmFzZXMgPSB0eXBlLT50cF9iYXNlczsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShiYXNlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqYiA9IFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIGkpOworICAgICAgICBpZiAoUHlUeXBlX0NoZWNrKGIpICYmCisgICAgICAgICAgICBhZGRfc3ViY2xhc3MoKFB5VHlwZU9iamVjdCAqKWIsIHR5cGUpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JLyogQWxsIGRvbmUgLS0gc2V0IHRoZSByZWFkeSBmbGFnICovCi0JYXNzZXJ0KHR5cGUtPnRwX2RpY3QgIT0gTlVMTCk7Ci0JdHlwZS0+dHBfZmxhZ3MgPQotCQkodHlwZS0+dHBfZmxhZ3MgJiB+UHlfVFBGTEFHU19SRUFEWUlORykgfCBQeV9UUEZMQUdTX1JFQURZOwotCXJldHVybiAwOworICAgIC8qIEFsbCBkb25lIC0tIHNldCB0aGUgcmVhZHkgZmxhZyAqLworICAgIGFzc2VydCh0eXBlLT50cF9kaWN0ICE9IE5VTEwpOworICAgIHR5cGUtPnRwX2ZsYWdzID0KKyAgICAgICAgKHR5cGUtPnRwX2ZsYWdzICYgflB5X1RQRkxBR1NfUkVBRFlJTkcpIHwgUHlfVFBGTEFHU19SRUFEWTsKKyAgICByZXR1cm4gMDsKIAogICBlcnJvcjoKLQl0eXBlLT50cF9mbGFncyAmPSB+UHlfVFBGTEFHU19SRUFEWUlORzsKLQlyZXR1cm4gLTE7CisgICAgdHlwZS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfUkVBRFlJTkc7CisgICAgcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50CiBhZGRfc3ViY2xhc3MoUHlUeXBlT2JqZWN0ICpiYXNlLCBQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0JUHlfc3NpemVfdCBpOwotCWludCByZXN1bHQ7Ci0JUHlPYmplY3QgKmxpc3QsICpyZWYsICpuZXdvYmo7CisgICAgUHlfc3NpemVfdCBpOworICAgIGludCByZXN1bHQ7CisgICAgUHlPYmplY3QgKmxpc3QsICpyZWYsICpuZXdvYmo7CiAKLQlsaXN0ID0gYmFzZS0+dHBfc3ViY2xhc3NlczsKLQlpZiAobGlzdCA9PSBOVUxMKSB7Ci0JCWJhc2UtPnRwX3N1YmNsYXNzZXMgPSBsaXN0ID0gUHlMaXN0X05ldygwKTsKLQkJaWYgKGxpc3QgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQl9Ci0JYXNzZXJ0KFB5TGlzdF9DaGVjayhsaXN0KSk7Ci0JbmV3b2JqID0gUHlXZWFrcmVmX05ld1JlZigoUHlPYmplY3QgKil0eXBlLCBOVUxMKTsKLQlpID0gUHlMaXN0X0dFVF9TSVpFKGxpc3QpOwotCXdoaWxlICgtLWkgPj0gMCkgewotCQlyZWYgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7Ci0JCWFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7Ci0JCWlmIChQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpID09IFB5X05vbmUpCi0JCQlyZXR1cm4gUHlMaXN0X1NldEl0ZW0obGlzdCwgaSwgbmV3b2JqKTsKLQl9Ci0JcmVzdWx0ID0gUHlMaXN0X0FwcGVuZChsaXN0LCBuZXdvYmopOwotCVB5X0RFQ1JFRihuZXdvYmopOwotCXJldHVybiByZXN1bHQ7CisgICAgbGlzdCA9IGJhc2UtPnRwX3N1YmNsYXNzZXM7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgICBiYXNlLT50cF9zdWJjbGFzc2VzID0gbGlzdCA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGFzc2VydChQeUxpc3RfQ2hlY2sobGlzdCkpOworICAgIG5ld29iaiA9IFB5V2Vha3JlZl9OZXdSZWYoKFB5T2JqZWN0ICopdHlwZSwgTlVMTCk7CisgICAgaSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKKyAgICB3aGlsZSAoLS1pID49IDApIHsKKyAgICAgICAgcmVmID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOworICAgICAgICBhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOworICAgICAgICBpZiAoUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKSA9PSBQeV9Ob25lKQorICAgICAgICAgICAgcmV0dXJuIFB5TGlzdF9TZXRJdGVtKGxpc3QsIGksIG5ld29iaik7CisgICAgfQorICAgIHJlc3VsdCA9IFB5TGlzdF9BcHBlbmQobGlzdCwgbmV3b2JqKTsKKyAgICBQeV9ERUNSRUYobmV3b2JqKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZAogcmVtb3ZlX3N1YmNsYXNzKFB5VHlwZU9iamVjdCAqYmFzZSwgUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5X3NzaXplX3QgaTsKLQlQeU9iamVjdCAqbGlzdCwgKnJlZjsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlPYmplY3QgKmxpc3QsICpyZWY7CiAKLQlsaXN0ID0gYmFzZS0+dHBfc3ViY2xhc3NlczsKLQlpZiAobGlzdCA9PSBOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0JYXNzZXJ0KFB5TGlzdF9DaGVjayhsaXN0KSk7Ci0JaSA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKLQl3aGlsZSAoLS1pID49IDApIHsKLQkJcmVmID0gUHlMaXN0X0dFVF9JVEVNKGxpc3QsIGkpOwotCQlhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOwotCQlpZiAoUHlXZWFrcmVmX0dFVF9PQkpFQ1QocmVmKSA9PSAoUHlPYmplY3QqKXR5cGUpIHsKLQkJCS8qIHRoaXMgY2FuJ3QgZmFpbCwgcmlnaHQ/ICovCi0JCQlQeVNlcXVlbmNlX0RlbEl0ZW0obGlzdCwgaSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9CisgICAgbGlzdCA9IGJhc2UtPnRwX3N1YmNsYXNzZXM7CisgICAgaWYgKGxpc3QgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGFzc2VydChQeUxpc3RfQ2hlY2sobGlzdCkpOworICAgIGkgPSBQeUxpc3RfR0VUX1NJWkUobGlzdCk7CisgICAgd2hpbGUgKC0taSA+PSAwKSB7CisgICAgICAgIHJlZiA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKKyAgICAgICAgYXNzZXJ0KFB5V2Vha3JlZl9DaGVja1JlZihyZWYpKTsKKyAgICAgICAgaWYgKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZikgPT0gKFB5T2JqZWN0Kil0eXBlKSB7CisgICAgICAgICAgICAvKiB0aGlzIGNhbid0IGZhaWwsIHJpZ2h0PyAqLworICAgICAgICAgICAgUHlTZXF1ZW5jZV9EZWxJdGVtKGxpc3QsIGkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBjaGVja19udW1fYXJncyhQeU9iamVjdCAqb2IsIGludCBuKQogewotCWlmICghUHlUdXBsZV9DaGVja0V4YWN0KG9iKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCSAgICAiUHlBcmdfVW5wYWNrVHVwbGUoKSBhcmd1bWVudCBsaXN0IGlzIG5vdCBhIHR1cGxlIik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobiA9PSBQeVR1cGxlX0dFVF9TSVpFKG9iKSkKLQkJcmV0dXJuIDE7Ci0JUHlFcnJfRm9ybWF0KAotCSAgICBQeUV4Y19UeXBlRXJyb3IsIAotCSAgICAiZXhwZWN0ZWQgJWQgYXJndW1lbnRzLCBnb3QgJXpkIiwgbiwgUHlUdXBsZV9HRVRfU0laRShvYikpOwotCXJldHVybiAwOworICAgIGlmICghUHlUdXBsZV9DaGVja0V4YWN0KG9iKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAiUHlBcmdfVW5wYWNrVHVwbGUoKSBhcmd1bWVudCBsaXN0IGlzIG5vdCBhIHR1cGxlIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAobiA9PSBQeVR1cGxlX0dFVF9TSVpFKG9iKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICJleHBlY3RlZCAlZCBhcmd1bWVudHMsIGdvdCAlemQiLCBuLCBQeVR1cGxlX0dFVF9TSVpFKG9iKSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIEdlbmVyaWMgd3JhcHBlcnMgZm9yIG92ZXJsb2FkYWJsZSAnb3BlcmF0b3JzJyBzdWNoIGFzIF9fZ2V0aXRlbV9fICovCiAKIC8qIFRoZXJlJ3MgYSB3cmFwcGVyICpmdW5jdGlvbiogZm9yIGVhY2ggZGlzdGluY3QgZnVuY3Rpb24gdHlwZWRlZiB1c2VkCi0gICBmb3IgdHlwZSBvYmplY3Qgc2xvdHMgKGUuZy4gYmluYXJ5ZnVuYywgdGVybmFyeWZ1bmMsIGV0Yy4pLglUaGVyZSdzIGEKKyAgIGZvciB0eXBlIG9iamVjdCBzbG90cyAoZS5nLiBiaW5hcnlmdW5jLCB0ZXJuYXJ5ZnVuYywgZXRjLikuICBUaGVyZSdzIGEKICAgIHdyYXBwZXIgKnRhYmxlKiBmb3IgZWFjaCBkaXN0aW5jdCBvcGVyYXRpb24gKGUuZy4gX19sZW5fXywgX19hZGRfXykuCiAgICBNb3N0IHRhYmxlcyBoYXZlIG9ubHkgb25lIGVudHJ5OyB0aGUgdGFibGVzIGZvciBiaW5hcnkgb3BlcmF0b3JzIGhhdmUgdHdvCiAgICBlbnRyaWVzLCBvbmUgcmVndWxhciBhbmQgb25lIHdpdGggcmV2ZXJzZWQgYXJndW1lbnRzLiAqLwpAQCAtNDE1NCwzNTcgKzQxNTQsMzU3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9sZW5mdW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlsZW5mdW5jIGZ1bmMgPSAobGVuZnVuYyl3cmFwcGVkOwotCVB5X3NzaXplX3QgcmVzOworICAgIGxlbmZ1bmMgZnVuYyA9IChsZW5mdW5jKXdyYXBwZWQ7CisgICAgUHlfc3NpemVfdCByZXM7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDApKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXJlcyk7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmKTsKKyAgICBpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXMpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9pbnF1aXJ5cHJlZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JaW5xdWlyeSBmdW5jID0gKGlucXVpcnkpd3JhcHBlZDsKLQlpbnQgcmVzOworICAgIGlucXVpcnkgZnVuYyA9IChpbnF1aXJ5KXdyYXBwZWQ7CisgICAgaW50IHJlczsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMCkpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9ICgqZnVuYykoc2VsZik7Ci0JaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKXJlcyk7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmKTsKKyAgICBpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpcmVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfYmluYXJ5ZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JYmluYXJ5ZnVuYyBmdW5jID0gKGJpbmFyeWZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb3RoZXI7CisgICAgYmluYXJ5ZnVuYyBmdW5jID0gKGJpbmFyeWZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JcmV0dXJuICgqZnVuYykoc2VsZiwgb3RoZXIpOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICByZXR1cm4gKCpmdW5jKShzZWxmLCBvdGhlcik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2JpbmFyeWZ1bmNfbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JYmluYXJ5ZnVuYyBmdW5jID0gKGJpbmFyeWZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb3RoZXI7CisgICAgYmluYXJ5ZnVuYyBmdW5jID0gKGJpbmFyeWZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKCEoc2VsZi0+b2JfdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpICYmCi0JICAgICFQeVR5cGVfSXNTdWJ0eXBlKG90aGVyLT5vYl90eXBlLCBzZWxmLT5vYl90eXBlKSkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJldHVybiAoKmZ1bmMpKHNlbGYsIG90aGVyKTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgaWYgKCEoc2VsZi0+b2JfdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0NIRUNLVFlQRVMpICYmCisgICAgICAgICFQeVR5cGVfSXNTdWJ0eXBlKG90aGVyLT5vYl90eXBlLCBzZWxmLT5vYl90eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIHJldHVybiAoKmZ1bmMpKHNlbGYsIG90aGVyKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfYmluYXJ5ZnVuY19yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQliaW5hcnlmdW5jIGZ1bmMgPSAoYmluYXJ5ZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICpvdGhlcjsKKyAgICBiaW5hcnlmdW5jIGZ1bmMgPSAoYmluYXJ5ZnVuYyl3cmFwcGVkOworICAgIFB5T2JqZWN0ICpvdGhlcjsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCi0JCXJldHVybiBOVUxMOwotCW90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlpZiAoIShzZWxmLT5vYl90eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykgJiYKLQkgICAgIVB5VHlwZV9Jc1N1YnR5cGUob3RoZXItPm9iX3R5cGUsIHNlbGYtPm9iX3R5cGUpKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLQl9Ci0JcmV0dXJuICgqZnVuYykob3RoZXIsIHNlbGYpOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBpZiAoIShzZWxmLT5vYl90eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUykgJiYKKyAgICAgICAgIVB5VHlwZV9Jc1N1YnR5cGUob3RoZXItPm9iX3R5cGUsIHNlbGYtPm9iX3R5cGUpKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgcmV0dXJuICgqZnVuYykob3RoZXIsIHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9jb2VyY2VmdW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQljb2VyY2lvbiBmdW5jID0gKGNvZXJjaW9uKXdyYXBwZWQ7Ci0JUHlPYmplY3QgKm90aGVyLCAqcmVzOwotCWludCBvazsKKyAgICBjb2VyY2lvbiBmdW5jID0gKGNvZXJjaW9uKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKm90aGVyLCAqcmVzOworICAgIGludCBvazsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCi0JCXJldHVybiBOVUxMOwotCW90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlvayA9IGZ1bmMoJnNlbGYsICZvdGhlcik7Ci0JaWYgKG9rIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKG9rID4gMCkgewotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCXJlcyA9IFB5VHVwbGVfTmV3KDIpOwotCWlmIChyZXMgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYoc2VsZik7Ci0JCVB5X0RFQ1JFRihvdGhlcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeVR1cGxlX1NFVF9JVEVNKHJlcywgMCwgc2VsZik7Ci0JUHlUdXBsZV9TRVRfSVRFTShyZXMsIDEsIG90aGVyKTsKLQlyZXR1cm4gcmVzOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBvayA9IGZ1bmMoJnNlbGYsICZvdGhlcik7CisgICAgaWYgKG9rIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG9rID4gMCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgICAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CisgICAgfQorICAgIHJlcyA9IFB5VHVwbGVfTmV3KDIpOworICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoc2VsZik7CisgICAgICAgIFB5X0RFQ1JFRihvdGhlcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHJlcywgMCwgc2VsZik7CisgICAgUHlUdXBsZV9TRVRfSVRFTShyZXMsIDEsIG90aGVyKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF90ZXJuYXJ5ZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JdGVybmFyeWZ1bmMgZnVuYyA9ICh0ZXJuYXJ5ZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICpvdGhlcjsKLQlQeU9iamVjdCAqdGhpcmQgPSBQeV9Ob25lOworICAgIHRlcm5hcnlmdW5jIGZ1bmMgPSAodGVybmFyeWZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb3RoZXI7CisgICAgUHlPYmplY3QgKnRoaXJkID0gUHlfTm9uZTsKIAotCS8qIE5vdGU6IFRoaXMgd3JhcHBlciBvbmx5IHdvcmtzIGZvciBfX3Bvd19fKCkgKi8KKyAgICAvKiBOb3RlOiBUaGlzIHdyYXBwZXIgb25seSB3b3JrcyBmb3IgX19wb3dfXygpICovCiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmb3RoZXIsICZ0aGlyZCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoKmZ1bmMpKHNlbGYsIG90aGVyLCB0aGlyZCk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm90aGVyLCAmdGhpcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKCpmdW5jKShzZWxmLCBvdGhlciwgdGhpcmQpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF90ZXJuYXJ5ZnVuY19yKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQl0ZXJuYXJ5ZnVuYyBmdW5jID0gKHRlcm5hcnlmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QgKm90aGVyOwotCVB5T2JqZWN0ICp0aGlyZCA9IFB5X05vbmU7CisgICAgdGVybmFyeWZ1bmMgZnVuYyA9ICh0ZXJuYXJ5ZnVuYyl3cmFwcGVkOworICAgIFB5T2JqZWN0ICpvdGhlcjsKKyAgICBQeU9iamVjdCAqdGhpcmQgPSBQeV9Ob25lOwogCi0JLyogTm90ZTogVGhpcyB3cmFwcGVyIG9ubHkgd29ya3MgZm9yIF9fcG93X18oKSAqLworICAgIC8qIE5vdGU6IFRoaXMgd3JhcHBlciBvbmx5IHdvcmtzIGZvciBfX3Bvd19fKCkgKi8KIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDIsICZvdGhlciwgJnRoaXJkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICgqZnVuYykob3RoZXIsIHNlbGYsIHRoaXJkKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmb3RoZXIsICZ0aGlyZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoKmZ1bmMpKG90aGVyLCBzZWxmLCB0aGlyZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3VuYXJ5ZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JdW5hcnlmdW5jIGZ1bmMgPSAodW5hcnlmdW5jKXdyYXBwZWQ7CisgICAgdW5hcnlmdW5jIGZ1bmMgPSAodW5hcnlmdW5jKXdyYXBwZWQ7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDApKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKCpmdW5jKShzZWxmKTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKCpmdW5jKShzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfaW5kZXhhcmdmdW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzc2l6ZWFyZ2Z1bmMgZnVuYyA9IChzc2l6ZWFyZ2Z1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCogbzsKLQlQeV9zc2l6ZV90IGk7CisgICAgc3NpemVhcmdmdW5jIGZ1bmMgPSAoc3NpemVhcmdmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QqIG87CisgICAgUHlfc3NpemVfdCBpOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMSwgJm8pKQotCQlyZXR1cm4gTlVMTDsKLQlpID0gUHlOdW1iZXJfQXNTc2l6ZV90KG8sIFB5RXhjX092ZXJmbG93RXJyb3IpOwotCWlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoKmZ1bmMpKHNlbGYsIGkpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDEsIDEsICZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaSA9IFB5TnVtYmVyX0FzU3NpemVfdChvLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKKyAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKCpmdW5jKShzZWxmLCBpKTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGdldGluZGV4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCVB5X3NzaXplX3QgaTsKKyAgICBQeV9zc2l6ZV90IGk7CiAKLQlpID0gUHlOdW1iZXJfQXNTc2l6ZV90KGFyZywgUHlFeGNfT3ZlcmZsb3dFcnJvcik7Ci0JaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIC0xOwotCWlmIChpIDwgMCkgewotCQlQeVNlcXVlbmNlTWV0aG9kcyAqc3EgPSBQeV9UWVBFKHNlbGYpLT50cF9hc19zZXF1ZW5jZTsKLQkJaWYgKHNxICYmIHNxLT5zcV9sZW5ndGgpIHsKLQkJCVB5X3NzaXplX3QgbiA9ICgqc3EtPnNxX2xlbmd0aCkoc2VsZik7Ci0JCQlpZiAobiA8IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJaSArPSBuOwotCQl9Ci0JfQotCXJldHVybiBpOworICAgIGkgPSBQeU51bWJlcl9Bc1NzaXplX3QoYXJnLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKKyAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKGkgPCAwKSB7CisgICAgICAgIFB5U2VxdWVuY2VNZXRob2RzICpzcSA9IFB5X1RZUEUoc2VsZiktPnRwX2FzX3NlcXVlbmNlOworICAgICAgICBpZiAoc3EgJiYgc3EtPnNxX2xlbmd0aCkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBuID0gKCpzcS0+c3FfbGVuZ3RoKShzZWxmKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpICs9IG47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3NxX2l0ZW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXNzaXplYXJnZnVuYyBmdW5jID0gKHNzaXplYXJnZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICphcmc7Ci0JUHlfc3NpemVfdCBpOworICAgIHNzaXplYXJnZnVuYyBmdW5jID0gKHNzaXplYXJnZnVuYyl3cmFwcGVkOworICAgIFB5T2JqZWN0ICphcmc7CisgICAgUHlfc3NpemVfdCBpOwogCi0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSkgewotCQlhcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCQlpID0gZ2V0aW5kZXgoc2VsZiwgYXJnKTsKLQkJaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBOVUxMOwotCQlyZXR1cm4gKCpmdW5jKShzZWxmLCBpKTsKLQl9Ci0JY2hlY2tfbnVtX2FyZ3MoYXJncywgMSk7Ci0JYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOwotCXJldHVybiBOVUxMOworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDEpIHsKKyAgICAgICAgYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICAgICAgaSA9IGdldGluZGV4KHNlbGYsIGFyZyk7CisgICAgICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgaSk7CisgICAgfQorICAgIGNoZWNrX251bV9hcmdzKGFyZ3MsIDEpOworICAgIGFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfc3NpemVzc2l6ZWFyZ2Z1bmMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXNzaXplc3NpemVhcmdmdW5jIGZ1bmMgPSAoc3NpemVzc2l6ZWFyZ2Z1bmMpd3JhcHBlZDsKLQlQeV9zc2l6ZV90IGksIGo7CisgICAgc3NpemVzc2l6ZWFyZ2Z1bmMgZnVuYyA9IChzc2l6ZXNzaXplYXJnZnVuYyl3cmFwcGVkOworICAgIFB5X3NzaXplX3QgaSwgajsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibm4iLCAmaSwgJmopKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gKCpmdW5jKShzZWxmLCBpLCBqKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5uIiwgJmksICZqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgaSwgaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3NxX3NldGl0ZW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXNzaXplb2JqYXJncHJvYyBmdW5jID0gKHNzaXplb2JqYXJncHJvYyl3cmFwcGVkOwotCVB5X3NzaXplX3QgaTsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICphcmcsICp2YWx1ZTsKKyAgICBzc2l6ZW9iamFyZ3Byb2MgZnVuYyA9IChzc2l6ZW9iamFyZ3Byb2Mpd3JhcHBlZDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHJlczsKKyAgICBQeU9iamVjdCAqYXJnLCAqdmFsdWU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAyLCAyLCAmYXJnLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpID0gZ2V0aW5kZXgoc2VsZiwgYXJnKTsKLQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYsIGksIHZhbHVlKTsKLQlpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAyLCAyLCAmYXJnLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpID0gZ2V0aW5kZXgoc2VsZiwgYXJnKTsKKyAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSAoKmZ1bmMpKHNlbGYsIGksIHZhbHVlKTsKKyAgICBpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfc3FfZGVsaXRlbShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jc3NpemVvYmphcmdwcm9jIGZ1bmMgPSAoc3NpemVvYmphcmdwcm9jKXdyYXBwZWQ7Ci0JUHlfc3NpemVfdCBpOwotCWludCByZXM7Ci0JUHlPYmplY3QgKmFyZzsKKyAgICBzc2l6ZW9iamFyZ3Byb2MgZnVuYyA9IChzc2l6ZW9iamFyZ3Byb2Mpd3JhcHBlZDsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IHJlczsKKyAgICBQeU9iamVjdCAqYXJnOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYXJnID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlpID0gZ2V0aW5kZXgoc2VsZiwgYXJnKTsKLQlpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYsIGksIE5VTEwpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgaSA9IGdldGluZGV4KHNlbGYsIGFyZyk7CisgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCBpLCBOVUxMKTsKKyAgICBpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfc3NpemVzc2l6ZW9iamFyZ3Byb2MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCXNzaXplc3NpemVvYmphcmdwcm9jIGZ1bmMgPSAoc3NpemVzc2l6ZW9iamFyZ3Byb2Mpd3JhcHBlZDsKLQlQeV9zc2l6ZV90IGksIGo7Ci0JaW50IHJlczsKLQlQeU9iamVjdCAqdmFsdWU7CisgICAgc3NpemVzc2l6ZW9iamFyZ3Byb2MgZnVuYyA9IChzc2l6ZXNzaXplb2JqYXJncHJvYyl3cmFwcGVkOworICAgIFB5X3NzaXplX3QgaSwgajsKKyAgICBpbnQgcmVzOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibm5PIiwgJmksICZqLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYsIGksIGosIHZhbHVlKTsKLQlpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5uTyIsICZpLCAmaiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCBpLCBqLCB2YWx1ZSk7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2RlbHNsaWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzc2l6ZXNzaXplb2JqYXJncHJvYyBmdW5jID0gKHNzaXplc3NpemVvYmphcmdwcm9jKXdyYXBwZWQ7Ci0JUHlfc3NpemVfdCBpLCBqOwotCWludCByZXM7CisgICAgc3NpemVzc2l6ZW9iamFyZ3Byb2MgZnVuYyA9IChzc2l6ZXNzaXplb2JqYXJncHJvYyl3cmFwcGVkOworICAgIFB5X3NzaXplX3QgaSwgajsKKyAgICBpbnQgcmVzOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJubiIsICZpLCAmaikpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9ICgqZnVuYykoc2VsZiwgaSwgaiwgTlVMTCk7Ci0JaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJubiIsICZpLCAmaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9ICgqZnVuYykoc2VsZiwgaSwgaiwgTlVMTCk7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8qIFhYWCBvYmpvYmpwcm9jIGlzIGEgbWlzbm9tZXI7IHNob3VsZCBiZSBvYmphcmdwcmVkICovCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9vYmpvYmpwcm9jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlvYmpvYmpwcm9jIGZ1bmMgPSAob2Jqb2JqcHJvYyl3cmFwcGVkOwotCWludCByZXM7Ci0JUHlPYmplY3QgKnZhbHVlOworICAgIG9iam9ianByb2MgZnVuYyA9IChvYmpvYmpwcm9jKXdyYXBwZWQ7CisgICAgaW50IHJlczsKKyAgICBQeU9iamVjdCAqdmFsdWU7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQl2YWx1ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQllbHNlCi0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzKTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2YWx1ZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCB2YWx1ZSk7CisgICAgaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfb2Jqb2JqYXJncHJvYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jb2Jqb2JqYXJncHJvYyBmdW5jID0gKG9iam9iamFyZ3Byb2Mpd3JhcHBlZDsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKKyAgICBvYmpvYmphcmdwcm9jIGZ1bmMgPSAob2Jqb2JqYXJncHJvYyl3cmFwcGVkOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJmtleSwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBrZXksIHZhbHVlKTsKLQlpZiAocmVzID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAyLCAyLCAma2V5LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSAoKmZ1bmMpKHNlbGYsIGtleSwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9kZWxpdGVtKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlvYmpvYmphcmdwcm9jIGZ1bmMgPSAob2Jqb2JqYXJncHJvYyl3cmFwcGVkOwotCWludCByZXM7Ci0JUHlPYmplY3QgKmtleTsKKyAgICBvYmpvYmphcmdwcm9jIGZ1bmMgPSAob2Jqb2JqYXJncHJvYyl3cmFwcGVkOworICAgIGludCByZXM7CisgICAgUHlPYmplY3QgKmtleTsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCi0JCXJldHVybiBOVUxMOwotCWtleSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JcmVzID0gKCpmdW5jKShzZWxmLCBrZXksIE5VTEwpOwotCWlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGtleSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCBrZXksIE5VTEwpOworICAgIGlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9jbXBmdW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQljbXBmdW5jIGZ1bmMgPSAoY21wZnVuYyl3cmFwcGVkOwotCWludCByZXM7Ci0JUHlPYmplY3QgKm90aGVyOworICAgIGNtcGZ1bmMgZnVuYyA9IChjbXBmdW5jKXdyYXBwZWQ7CisgICAgaW50IHJlczsKKyAgICBQeU9iamVjdCAqb3RoZXI7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlvdGhlciA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKFB5X1RZUEUob3RoZXIpLT50cF9jb21wYXJlICE9IGZ1bmMgJiYKLQkgICAgIVB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvdGhlciksIFB5X1RZUEUoc2VsZikpKSB7Ci0JCVB5RXJyX0Zvcm1hdCgKLQkJCVB5RXhjX1R5cGVFcnJvciwKLQkJCSIlcy5fX2NtcF9fKHgseSkgcmVxdWlyZXMgeSB0byBiZSBhICclcycsIG5vdCBhICclcyciLAotCQkJUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwKLQkJCVB5X1RZUEUoc2VsZiktPnRwX25hbWUsCi0JCQlQeV9UWVBFKG90aGVyKS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXMgPSAoKmZ1bmMpKHNlbGYsIG90aGVyKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXJlcyk7CisgICAgaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3RoZXIgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOworICAgIGlmIChQeV9UWVBFKG90aGVyKS0+dHBfY29tcGFyZSAhPSBmdW5jICYmCisgICAgICAgICFQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob3RoZXIpLCBQeV9UWVBFKHNlbGYpKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiJXMuX19jbXBfXyh4LHkpIHJlcXVpcmVzIHkgdG8gYmUgYSAnJXMnLCBub3QgYSAnJXMnIiwKKyAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsCisgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lLAorICAgICAgICAgICAgUHlfVFlQRShvdGhlciktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCBvdGhlcik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylyZXMpOwogfQogCiAvKiBIZWxwZXIgdG8gY2hlY2sgZm9yIG9iamVjdC5fX3NldGF0dHJfXyBvciBfX2RlbGF0dHJfXyBhcHBsaWVkIHRvIGEgdHlwZS4KQEAgLTQ1MTIsOTAgKzQ1MTIsOTAgQEAKIHN0YXRpYyBpbnQKIGhhY2tjaGVjayhQeU9iamVjdCAqc2VsZiwgc2V0YXR0cm9mdW5jIGZ1bmMsIGNoYXIgKndoYXQpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0eXBlID0gUHlfVFlQRShzZWxmKTsKLQl3aGlsZSAodHlwZSAmJiB0eXBlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpCi0JCXR5cGUgPSB0eXBlLT50cF9iYXNlOwotCS8qIElmIHR5cGUgaXMgTlVMTCBub3csIHRoaXMgaXMgYSByZWFsbHkgd2VpcmQgdHlwZS4KLQkgICBJbiB0aGUgc3Bpcml0IG9mIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICg/KSwganVzdCBzaHV0IHVwLiAqLwotCWlmICh0eXBlICYmIHR5cGUtPnRwX3NldGF0dHJvICE9IGZ1bmMpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImNhbid0IGFwcGx5IHRoaXMgJXMgdG8gJXMgb2JqZWN0IiwKLQkJCSAgICAgd2hhdCwKLQkJCSAgICAgdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGUgPSBQeV9UWVBFKHNlbGYpOworICAgIHdoaWxlICh0eXBlICYmIHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKKyAgICAgICAgdHlwZSA9IHR5cGUtPnRwX2Jhc2U7CisgICAgLyogSWYgdHlwZSBpcyBOVUxMIG5vdywgdGhpcyBpcyBhIHJlYWxseSB3ZWlyZCB0eXBlLgorICAgICAgIEluIHRoZSBzcGlyaXQgb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKD8pLCBqdXN0IHNodXQgdXAuICovCisgICAgaWYgKHR5cGUgJiYgdHlwZS0+dHBfc2V0YXR0cm8gIT0gZnVuYykgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImNhbid0IGFwcGx5IHRoaXMgJXMgdG8gJXMgb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgIHdoYXQsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9zZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCkKIHsKLQlzZXRhdHRyb2Z1bmMgZnVuYyA9IChzZXRhdHRyb2Z1bmMpd3JhcHBlZDsKLQlpbnQgcmVzOwotCVB5T2JqZWN0ICpuYW1lLCAqdmFsdWU7CisgICAgc2V0YXR0cm9mdW5jIGZ1bmMgPSAoc2V0YXR0cm9mdW5jKXdyYXBwZWQ7CisgICAgaW50IHJlczsKKyAgICBQeU9iamVjdCAqbmFtZSwgKnZhbHVlOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJm5hbWUsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghaGFja2NoZWNrKHNlbGYsIGZ1bmMsICJfX3NldGF0dHJfXyIpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXMgPSAoKmZ1bmMpKHNlbGYsIG5hbWUsIHZhbHVlKTsKLQlpZiAocmVzIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIiIsIDIsIDIsICZuYW1lLCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWhhY2tjaGVjayhzZWxmLCBmdW5jLCAiX19zZXRhdHRyX18iKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCBuYW1lLCB2YWx1ZSk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfZGVsYXR0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0Jc2V0YXR0cm9mdW5jIGZ1bmMgPSAoc2V0YXR0cm9mdW5jKXdyYXBwZWQ7Ci0JaW50IHJlczsKLQlQeU9iamVjdCAqbmFtZTsKKyAgICBzZXRhdHRyb2Z1bmMgZnVuYyA9IChzZXRhdHRyb2Z1bmMpd3JhcHBlZDsKKyAgICBpbnQgcmVzOworICAgIFB5T2JqZWN0ICpuYW1lOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAxKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKCFoYWNrY2hlY2soc2VsZiwgZnVuYywgIl9fZGVsYXR0cl9fIikpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9ICgqZnVuYykoc2VsZiwgbmFtZSwgTlVMTCk7Ci0JaWYgKHJlcyA8IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICBpZiAoIWhhY2tjaGVjayhzZWxmLCBmdW5jLCAiX19kZWxhdHRyX18iKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gKCpmdW5jKShzZWxmLCBuYW1lLCBOVUxMKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9oYXNoZnVuYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JaGFzaGZ1bmMgZnVuYyA9IChoYXNoZnVuYyl3cmFwcGVkOwotCWxvbmcgcmVzOworICAgIGhhc2hmdW5jIGZ1bmMgPSAoaGFzaGZ1bmMpd3JhcHBlZDsKKyAgICBsb25nIHJlczsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMCkpCi0JCXJldHVybiBOVUxMOwotCXJlcyA9ICgqZnVuYykoc2VsZik7Ci0JaWYgKHJlcyA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzKTsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSAoKmZ1bmMpKHNlbGYpOworICAgIGlmIChyZXMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2NhbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkLCBQeU9iamVjdCAqa3dkcykKIHsKLQl0ZXJuYXJ5ZnVuYyBmdW5jID0gKHRlcm5hcnlmdW5jKXdyYXBwZWQ7CisgICAgdGVybmFyeWZ1bmMgZnVuYyA9ICh0ZXJuYXJ5ZnVuYyl3cmFwcGVkOwogCi0JcmV0dXJuICgqZnVuYykoc2VsZiwgYXJncywga3dkcyk7CisgICAgcmV0dXJuICgqZnVuYykoc2VsZiwgYXJncywga3dkcyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX3JpY2hjbXBmdW5jKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgdm9pZCAqd3JhcHBlZCwgaW50IG9wKQogewotCXJpY2hjbXBmdW5jIGZ1bmMgPSAocmljaGNtcGZ1bmMpd3JhcHBlZDsKLQlQeU9iamVjdCAqb3RoZXI7CisgICAgcmljaGNtcGZ1bmMgZnVuYyA9IChyaWNoY21wZnVuYyl3cmFwcGVkOworICAgIFB5T2JqZWN0ICpvdGhlcjsKIAotCWlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCi0JCXJldHVybiBOVUxMOwotCW90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKLQlyZXR1cm4gKCpmdW5jKShzZWxmLCBvdGhlciwgb3ApOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG90aGVyID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKKyAgICByZXR1cm4gKCpmdW5jKShzZWxmLCBvdGhlciwgb3ApOwogfQogCiAjdW5kZWYgUklDSENNUF9XUkFQUEVSCkBAIC00NjAzLDcgKzQ2MDMsNyBAQAogc3RhdGljIFB5T2JqZWN0ICogXAogcmljaGNtcF8jI05BTUUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKSBcCiB7IFwKLQlyZXR1cm4gd3JhcF9yaWNoY21wZnVuYyhzZWxmLCBhcmdzLCB3cmFwcGVkLCBPUCk7IFwKKyAgICByZXR1cm4gd3JhcF9yaWNoY21wZnVuYyhzZWxmLCBhcmdzLCB3cmFwcGVkLCBPUCk7IFwKIH0KIAogUklDSENNUF9XUkFQUEVSKGx0LCBQeV9MVCkKQEAgLTQ2MTYsMTY0ICs0NjE2LDE2NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdyYXBfbmV4dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JdW5hcnlmdW5jIGZ1bmMgPSAodW5hcnlmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QgKnJlczsKKyAgICB1bmFyeWZ1bmMgZnVuYyA9ICh1bmFyeWZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKCFjaGVja19udW1fYXJncyhhcmdzLCAwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gKCpmdW5jKShzZWxmKTsKLQlpZiAocmVzID09IE5VTEwgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0JCVB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSAoKmZ1bmMpKHNlbGYpOworICAgIGlmIChyZXMgPT0gTlVMTCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9kZXNjcl9nZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWRlc2NyZ2V0ZnVuYyBmdW5jID0gKGRlc2NyZ2V0ZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICpvYmo7Ci0JUHlPYmplY3QgKnR5cGUgPSBOVUxMOworICAgIGRlc2NyZ2V0ZnVuYyBmdW5jID0gKGRlc2NyZ2V0ZnVuYyl3cmFwcGVkOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgUHlPYmplY3QgKnR5cGUgPSBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMSwgMiwgJm9iaiwgJnR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAob2JqID09IFB5X05vbmUpCi0JCW9iaiA9IE5VTEw7Ci0JaWYgKHR5cGUgPT0gUHlfTm9uZSkKLQkJdHlwZSA9IE5VTEw7Ci0JaWYgKHR5cGUgPT0gTlVMTCAmJm9iaiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIl9fZ2V0X18oTm9uZSwgTm9uZSkgaXMgaW52YWxpZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuICgqZnVuYykoc2VsZiwgb2JqLCB0eXBlKTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAxLCAyLCAmb2JqLCAmdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvYmogPT0gUHlfTm9uZSkKKyAgICAgICAgb2JqID0gTlVMTDsKKyAgICBpZiAodHlwZSA9PSBQeV9Ob25lKQorICAgICAgICB0eXBlID0gTlVMTDsKKyAgICBpZiAodHlwZSA9PSBOVUxMICYmb2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2dldF9fKE5vbmUsIE5vbmUpIGlzIGludmFsaWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoKmZ1bmMpKHNlbGYsIG9iaiwgdHlwZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2Rlc2NyX3NldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIHZvaWQgKndyYXBwZWQpCiB7Ci0JZGVzY3JzZXRmdW5jIGZ1bmMgPSAoZGVzY3JzZXRmdW5jKXdyYXBwZWQ7Ci0JUHlPYmplY3QgKm9iaiwgKnZhbHVlOwotCWludCByZXQ7CisgICAgZGVzY3JzZXRmdW5jIGZ1bmMgPSAoZGVzY3JzZXRmdW5jKXdyYXBwZWQ7CisgICAgUHlPYmplY3QgKm9iaiwgKnZhbHVlOworICAgIGludCByZXQ7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICIiLCAyLCAyLCAmb2JqLCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXQgPSAoKmZ1bmMpKHNlbGYsIG9iaiwgdmFsdWUpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiIiwgMiwgMiwgJm9iaiwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0ID0gKCpmdW5jKShzZWxmLCBvYmosIHZhbHVlKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogd3JhcF9kZXNjcl9kZWxldGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkKQogewotCWRlc2Nyc2V0ZnVuYyBmdW5jID0gKGRlc2Nyc2V0ZnVuYyl3cmFwcGVkOwotCVB5T2JqZWN0ICpvYmo7Ci0JaW50IHJldDsKKyAgICBkZXNjcnNldGZ1bmMgZnVuYyA9IChkZXNjcnNldGZ1bmMpd3JhcHBlZDsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIGludCByZXQ7CiAKLQlpZiAoIWNoZWNrX251bV9hcmdzKGFyZ3MsIDEpKQotCQlyZXR1cm4gTlVMTDsKLQlvYmogPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIDApOwotCXJldCA9ICgqZnVuYykoc2VsZiwgb2JqLCBOVUxMKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghY2hlY2tfbnVtX2FyZ3MoYXJncywgMSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9iaiA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgcmV0ID0gKCpmdW5jKShzZWxmLCBvYmosIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3cmFwX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCB2b2lkICp3cmFwcGVkLCBQeU9iamVjdCAqa3dkcykKIHsKLQlpbml0cHJvYyBmdW5jID0gKGluaXRwcm9jKXdyYXBwZWQ7CisgICAgaW5pdHByb2MgZnVuYyA9IChpbml0cHJvYyl3cmFwcGVkOwogCi0JaWYgKGZ1bmMoc2VsZiwgYXJncywga3dkcykgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGZ1bmMoc2VsZiwgYXJncywga3dkcykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB0cF9uZXdfd3JhcHBlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5VHlwZU9iamVjdCAqdHlwZSwgKnN1YnR5cGUsICpzdGF0aWNiYXNlOwotCVB5T2JqZWN0ICphcmcwLCAqcmVzOworICAgIFB5VHlwZU9iamVjdCAqdHlwZSwgKnN1YnR5cGUsICpzdGF0aWNiYXNlOworICAgIFB5T2JqZWN0ICphcmcwLCAqcmVzOwogCi0JaWYgKHNlbGYgPT0gTlVMTCB8fCAhUHlUeXBlX0NoZWNrKHNlbGYpKQotCQlQeV9GYXRhbEVycm9yKCJfX25ld19fKCkgY2FsbGVkIHdpdGggbm9uLXR5cGUgJ3NlbGYnIik7Ci0JdHlwZSA9IChQeVR5cGVPYmplY3QgKilzZWxmOwotCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSB8fCBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpIDwgMSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJXMuX19uZXdfXygpOiBub3QgZW5vdWdoIGFyZ3VtZW50cyIsCi0JCQkgICAgIHR5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXJnMCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7Ci0JaWYgKCFQeVR5cGVfQ2hlY2soYXJnMCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiVzLl9fbmV3X18oWCk6IFggaXMgbm90IGEgdHlwZSBvYmplY3QgKCVzKSIsCi0JCQkgICAgIHR5cGUtPnRwX25hbWUsCi0JCQkgICAgIFB5X1RZUEUoYXJnMCktPnRwX25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3VidHlwZSA9IChQeVR5cGVPYmplY3QgKilhcmcwOwotCWlmICghUHlUeXBlX0lzU3VidHlwZShzdWJ0eXBlLCB0eXBlKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJXMuX19uZXdfXyglcyk6ICVzIGlzIG5vdCBhIHN1YnR5cGUgb2YgJXMiLAotCQkJICAgICB0eXBlLT50cF9uYW1lLAotCQkJICAgICBzdWJ0eXBlLT50cF9uYW1lLAotCQkJICAgICBzdWJ0eXBlLT50cF9uYW1lLAotCQkJICAgICB0eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzZWxmID09IE5VTEwgfHwgIVB5VHlwZV9DaGVjayhzZWxmKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiX19uZXdfXygpIGNhbGxlZCB3aXRoIG5vbi10eXBlICdzZWxmJyIpOworICAgIHR5cGUgPSAoUHlUeXBlT2JqZWN0ICopc2VsZjsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykgfHwgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA8IDEpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlcy5fX25ld19fKCk6IG5vdCBlbm91Z2ggYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXJnMCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CisgICAgaWYgKCFQeVR5cGVfQ2hlY2soYXJnMCkpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlcy5fX25ld19fKFgpOiBYIGlzIG5vdCBhIHR5cGUgb2JqZWN0ICglcykiLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJnMCktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3VidHlwZSA9IChQeVR5cGVPYmplY3QgKilhcmcwOworICAgIGlmICghUHlUeXBlX0lzU3VidHlwZShzdWJ0eXBlLCB0eXBlKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiVzLl9fbmV3X18oJXMpOiAlcyBpcyBub3QgYSBzdWJ0eXBlIG9mICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgc3VidHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBDaGVjayB0aGF0IHRoZSB1c2UgZG9lc24ndCBkbyBzb21ldGhpbmcgc2lsbHkgYW5kIHVuc2FmZSBsaWtlCi0JICAgb2JqZWN0Ll9fbmV3X18oZGljdCkuICBUbyBkbyB0aGlzLCB3ZSBjaGVjayB0aGF0IHRoZQotCSAgIG1vc3QgZGVyaXZlZCBiYXNlIHRoYXQncyBub3QgYSBoZWFwIHR5cGUgaXMgdGhpcyB0eXBlLiAqLwotCXN0YXRpY2Jhc2UgPSBzdWJ0eXBlOwotCXdoaWxlIChzdGF0aWNiYXNlICYmIChzdGF0aWNiYXNlLT50cF9mbGFncyAmIFB5X1RQRkxBR1NfSEVBUFRZUEUpKQotCQlzdGF0aWNiYXNlID0gc3RhdGljYmFzZS0+dHBfYmFzZTsKLQkvKiBJZiBzdGF0aWNiYXNlIGlzIE5VTEwgbm93LCBpdCBpcyBhIHJlYWxseSB3ZWlyZCB0eXBlLgotCSAgIEluIHRoZSBzcGlyaXQgb2YgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKD8pLCBqdXN0IHNodXQgdXAuICovCi0JaWYgKHN0YXRpY2Jhc2UgJiYgc3RhdGljYmFzZS0+dHBfbmV3ICE9IHR5cGUtPnRwX25ldykgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiJXMuX19uZXdfXyglcykgaXMgbm90IHNhZmUsIHVzZSAlcy5fX25ld19fKCkiLAotCQkJICAgICB0eXBlLT50cF9uYW1lLAotCQkJICAgICBzdWJ0eXBlLT50cF9uYW1lLAotCQkJICAgICBzdGF0aWNiYXNlID09IE5VTEwgPyAiPyIgOiBzdGF0aWNiYXNlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIENoZWNrIHRoYXQgdGhlIHVzZSBkb2Vzbid0IGRvIHNvbWV0aGluZyBzaWxseSBhbmQgdW5zYWZlIGxpa2UKKyAgICAgICBvYmplY3QuX19uZXdfXyhkaWN0KS4gIFRvIGRvIHRoaXMsIHdlIGNoZWNrIHRoYXQgdGhlCisgICAgICAgbW9zdCBkZXJpdmVkIGJhc2UgdGhhdCdzIG5vdCBhIGhlYXAgdHlwZSBpcyB0aGlzIHR5cGUuICovCisgICAgc3RhdGljYmFzZSA9IHN1YnR5cGU7CisgICAgd2hpbGUgKHN0YXRpY2Jhc2UgJiYgKHN0YXRpY2Jhc2UtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkpCisgICAgICAgIHN0YXRpY2Jhc2UgPSBzdGF0aWNiYXNlLT50cF9iYXNlOworICAgIC8qIElmIHN0YXRpY2Jhc2UgaXMgTlVMTCBub3csIGl0IGlzIGEgcmVhbGx5IHdlaXJkIHR5cGUuCisgICAgICAgSW4gdGhlIHNwaXJpdCBvZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoPyksIGp1c3Qgc2h1dCB1cC4gKi8KKyAgICBpZiAoc3RhdGljYmFzZSAmJiBzdGF0aWNiYXNlLT50cF9uZXcgIT0gdHlwZS0+dHBfbmV3KSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJXMuX19uZXdfXyglcykgaXMgbm90IHNhZmUsIHVzZSAlcy5fX25ld19fKCkiLAorICAgICAgICAgICAgICAgICAgICAgdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGUtPnRwX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNiYXNlID09IE5VTEwgPyAiPyIgOiBzdGF0aWNiYXNlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYXJncyA9IFB5VHVwbGVfR2V0U2xpY2UoYXJncywgMSwgUHlUdXBsZV9HRVRfU0laRShhcmdzKSk7Ci0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzID0gdHlwZS0+dHBfbmV3KHN1YnR5cGUsIGFyZ3MsIGt3ZHMpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlyZXR1cm4gcmVzOworICAgIGFyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIFB5VHVwbGVfR0VUX1NJWkUoYXJncykpOworICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IHR5cGUtPnRwX25ldyhzdWJ0eXBlLCBhcmdzLCBrd2RzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiB0cF9uZXdfbWV0aG9kZGVmW10gPSB7Ci0JeyJfX25ld19fIiwgKFB5Q0Z1bmN0aW9uKXRwX25ld193cmFwcGVyLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKLQkgUHlEb2NfU1RSKCJULl9fbmV3X18oUywgLi4uKSAtPiAiCi0JCSAgICJhIG5ldyBvYmplY3Qgd2l0aCB0eXBlIFMsIGEgc3VidHlwZSBvZiBUIil9LAotCXswfQorICAgIHsiX19uZXdfXyIsIChQeUNGdW5jdGlvbil0cF9uZXdfd3JhcHBlciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgIFB5RG9jX1NUUigiVC5fX25ld19fKFMsIC4uLikgLT4gIgorICAgICAgICAgICAgICAgImEgbmV3IG9iamVjdCB3aXRoIHR5cGUgUywgYSBzdWJ0eXBlIG9mIFQiKX0sCisgICAgezB9CiB9OwogCiBzdGF0aWMgaW50CiBhZGRfdHBfbmV3X3dyYXBwZXIoUHlUeXBlT2JqZWN0ICp0eXBlKQogewotCVB5T2JqZWN0ICpmdW5jOworICAgIFB5T2JqZWN0ICpmdW5jOwogCi0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX25ld19fIikgIT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JZnVuYyA9IFB5Q0Z1bmN0aW9uX05ldyh0cF9uZXdfbWV0aG9kZGVmLCAoUHlPYmplY3QgKil0eXBlKTsKLQlpZiAoZnVuYyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHR5cGUtPnRwX2RpY3QsICJfX25ld19fIiwgZnVuYykpIHsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fbmV3X18iKSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmdW5jID0gUHlDRnVuY3Rpb25fTmV3KHRwX25ld19tZXRob2RkZWYsIChQeU9iamVjdCAqKXR5cGUpOworICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fbmV3X18iLCBmdW5jKSkgeworICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiAwOwogfQogCiAvKiBTbG90IHdyYXBwZXJzIHRoYXQgY2FsbCB0aGUgY29ycmVzcG9uZGluZyBfX2Zvb19fIHNsb3QuICBTZWUgY29tbWVudHMKQEAgLTQ3ODMsMTYgKzQ3ODMsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqIFwKIEZVTkNOQU1FKFB5T2JqZWN0ICpzZWxmKSBcCiB7IFwKLQlzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0cjsgXAotCXJldHVybiBjYWxsX21ldGhvZChzZWxmLCBPUFNUUiwgJmNhY2hlX3N0ciwgIigpIik7IFwKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0cjsgXAorICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCBPUFNUUiwgJmNhY2hlX3N0ciwgIigpIik7IFwKIH0KIAogI2RlZmluZSBTTE9UMShGVU5DTkFNRSwgT1BTVFIsIEFSRzFUWVBFLCBBUkdDT0RFUykgXAogc3RhdGljIFB5T2JqZWN0ICogXAogRlVOQ05BTUUoUHlPYmplY3QgKnNlbGYsIEFSRzFUWVBFIGFyZzEpIFwKIHsgXAotCXN0YXRpYyBQeU9iamVjdCAqY2FjaGVfc3RyOyBcCi0JcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsIE9QU1RSLCAmY2FjaGVfc3RyLCAiKCIgQVJHQ09ERVMgIikiLCBhcmcxKTsgXAorICAgIHN0YXRpYyBQeU9iamVjdCAqY2FjaGVfc3RyOyBcCisgICAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsIE9QU1RSLCAmY2FjaGVfc3RyLCAiKCIgQVJHQ09ERVMgIikiLCBhcmcxKTsgXAogfQogCiAvKiBCb29sZWFuIGhlbHBlciBmb3IgU0xPVDFCSU5GVUxMKCkuCkBAIC00ODAwLDMzICs0ODAwLDMzIEBACiBzdGF0aWMgaW50CiBtZXRob2RfaXNfb3ZlcmxvYWRlZChQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0LCBjaGFyICpuYW1lKQogewotCVB5T2JqZWN0ICphLCAqYjsKLQlpbnQgb2s7CisgICAgUHlPYmplY3QgKmEsICpiOworICAgIGludCBvazsKIAotCWIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKChQeU9iamVjdCAqKShQeV9UWVBFKHJpZ2h0KSksIG5hbWUpOwotCWlmIChiID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJLyogSWYgcmlnaHQgZG9lc24ndCBoYXZlIGl0LCBpdCdzIG5vdCBvdmVybG9hZGVkICovCi0JCXJldHVybiAwOwotCX0KKyAgICBiID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKikoUHlfVFlQRShyaWdodCkpLCBuYW1lKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIC8qIElmIHJpZ2h0IGRvZXNuJ3QgaGF2ZSBpdCwgaXQncyBub3Qgb3ZlcmxvYWRlZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlhID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKikoUHlfVFlQRShsZWZ0KSksIG5hbWUpOwotCWlmIChhID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfREVDUkVGKGIpOwotCQkvKiBJZiByaWdodCBoYXMgaXQgYnV0IGxlZnQgZG9lc24ndCwgaXQncyBvdmVybG9hZGVkICovCi0JCXJldHVybiAxOwotCX0KKyAgICBhID0gUHlPYmplY3RfR2V0QXR0clN0cmluZygoUHlPYmplY3QgKikoUHlfVFlQRShsZWZ0KSksIG5hbWUpOworICAgIGlmIChhID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfREVDUkVGKGIpOworICAgICAgICAvKiBJZiByaWdodCBoYXMgaXQgYnV0IGxlZnQgZG9lc24ndCwgaXQncyBvdmVybG9hZGVkICovCisgICAgICAgIHJldHVybiAxOworICAgIH0KIAotCW9rID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGEsIGIsIFB5X05FKTsKLQlQeV9ERUNSRUYoYSk7Ci0JUHlfREVDUkVGKGIpOwotCWlmIChvayA8IDApIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIG9rID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGEsIGIsIFB5X05FKTsKKyAgICBQeV9ERUNSRUYoYSk7CisgICAgUHlfREVDUkVGKGIpOworICAgIGlmIChvayA8IDApIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JcmV0dXJuIG9rOworICAgIHJldHVybiBvazsKIH0KIAogCkBAIC00ODM0LDY4ICs0ODM0LDY4IEBACiBzdGF0aWMgUHlPYmplY3QgKiBcCiBGVU5DTkFNRShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyKSBcCiB7IFwKLQlzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0ciwgKnJjYWNoZV9zdHI7IFwKLQlpbnQgZG9fb3RoZXIgPSBQeV9UWVBFKHNlbGYpICE9IFB5X1RZUEUob3RoZXIpICYmIFwKLQkgICAgUHlfVFlQRShvdGhlciktPnRwX2FzX251bWJlciAhPSBOVUxMICYmIFwKLQkgICAgUHlfVFlQRShvdGhlciktPnRwX2FzX251bWJlci0+U0xPVE5BTUUgPT0gVEVTVEZVTkM7IFwKLQlpZiAoUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgXAotCSAgICBQeV9UWVBFKHNlbGYpLT50cF9hc19udW1iZXItPlNMT1ROQU1FID09IFRFU1RGVU5DKSB7IFwKLQkJUHlPYmplY3QgKnI7IFwKLQkJaWYgKGRvX290aGVyICYmIFwKLQkJICAgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvdGhlciksIFB5X1RZUEUoc2VsZikpICYmIFwKLQkJICAgIG1ldGhvZF9pc19vdmVybG9hZGVkKHNlbGYsIG90aGVyLCBST1BTVFIpKSB7IFwKLQkJCXIgPSBjYWxsX21heWJlKCBcCi0JCQkJb3RoZXIsIFJPUFNUUiwgJnJjYWNoZV9zdHIsICIoTykiLCBzZWxmKTsgXAotCQkJaWYgKHIgIT0gUHlfTm90SW1wbGVtZW50ZWQpIFwKLQkJCQlyZXR1cm4gcjsgXAotCQkJUHlfREVDUkVGKHIpOyBcCi0JCQlkb19vdGhlciA9IDA7IFwKLQkJfSBcCi0JCXIgPSBjYWxsX21heWJlKCBcCi0JCQlzZWxmLCBPUFNUUiwgJmNhY2hlX3N0ciwgIihPKSIsIG90aGVyKTsgXAotCQlpZiAociAhPSBQeV9Ob3RJbXBsZW1lbnRlZCB8fCBcCi0JCSAgICBQeV9UWVBFKG90aGVyKSA9PSBQeV9UWVBFKHNlbGYpKSBcCi0JCQlyZXR1cm4gcjsgXAotCQlQeV9ERUNSRUYocik7IFwKLQl9IFwKLQlpZiAoZG9fb3RoZXIpIHsgXAotCQlyZXR1cm4gY2FsbF9tYXliZSggXAotCQkJb3RoZXIsIFJPUFNUUiwgJnJjYWNoZV9zdHIsICIoTykiLCBzZWxmKTsgXAotCX0gXAotCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7IFwKLQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7IFwKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0ciwgKnJjYWNoZV9zdHI7IFwKKyAgICBpbnQgZG9fb3RoZXIgPSBQeV9UWVBFKHNlbGYpICE9IFB5X1RZUEUob3RoZXIpICYmIFwKKyAgICAgICAgUHlfVFlQRShvdGhlciktPnRwX2FzX251bWJlciAhPSBOVUxMICYmIFwKKyAgICAgICAgUHlfVFlQRShvdGhlciktPnRwX2FzX251bWJlci0+U0xPVE5BTUUgPT0gVEVTVEZVTkM7IFwKKyAgICBpZiAoUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgXAorICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9hc19udW1iZXItPlNMT1ROQU1FID09IFRFU1RGVU5DKSB7IFwKKyAgICAgICAgUHlPYmplY3QgKnI7IFwKKyAgICAgICAgaWYgKGRvX290aGVyICYmIFwKKyAgICAgICAgICAgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvdGhlciksIFB5X1RZUEUoc2VsZikpICYmIFwKKyAgICAgICAgICAgIG1ldGhvZF9pc19vdmVybG9hZGVkKHNlbGYsIG90aGVyLCBST1BTVFIpKSB7IFwKKyAgICAgICAgICAgIHIgPSBjYWxsX21heWJlKCBcCisgICAgICAgICAgICAgICAgb3RoZXIsIFJPUFNUUiwgJnJjYWNoZV9zdHIsICIoTykiLCBzZWxmKTsgXAorICAgICAgICAgICAgaWYgKHIgIT0gUHlfTm90SW1wbGVtZW50ZWQpIFwKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsgXAorICAgICAgICAgICAgUHlfREVDUkVGKHIpOyBcCisgICAgICAgICAgICBkb19vdGhlciA9IDA7IFwKKyAgICAgICAgfSBcCisgICAgICAgIHIgPSBjYWxsX21heWJlKCBcCisgICAgICAgICAgICBzZWxmLCBPUFNUUiwgJmNhY2hlX3N0ciwgIihPKSIsIG90aGVyKTsgXAorICAgICAgICBpZiAociAhPSBQeV9Ob3RJbXBsZW1lbnRlZCB8fCBcCisgICAgICAgICAgICBQeV9UWVBFKG90aGVyKSA9PSBQeV9UWVBFKHNlbGYpKSBcCisgICAgICAgICAgICByZXR1cm4gcjsgXAorICAgICAgICBQeV9ERUNSRUYocik7IFwKKyAgICB9IFwKKyAgICBpZiAoZG9fb3RoZXIpIHsgXAorICAgICAgICByZXR1cm4gY2FsbF9tYXliZSggXAorICAgICAgICAgICAgb3RoZXIsIFJPUFNUUiwgJnJjYWNoZV9zdHIsICIoTykiLCBzZWxmKTsgXAorICAgIH0gXAorICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7IFwKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7IFwKIH0KIAogI2RlZmluZSBTTE9UMUJJTihGVU5DTkFNRSwgU0xPVE5BTUUsIE9QU1RSLCBST1BTVFIpIFwKLQlTTE9UMUJJTkZVTEwoRlVOQ05BTUUsIEZVTkNOQU1FLCBTTE9UTkFNRSwgT1BTVFIsIFJPUFNUUikKKyAgICBTTE9UMUJJTkZVTEwoRlVOQ05BTUUsIEZVTkNOQU1FLCBTTE9UTkFNRSwgT1BTVFIsIFJPUFNUUikKIAogI2RlZmluZSBTTE9UMihGVU5DTkFNRSwgT1BTVFIsIEFSRzFUWVBFLCBBUkcyVFlQRSwgQVJHQ09ERVMpIFwKIHN0YXRpYyBQeU9iamVjdCAqIFwKIEZVTkNOQU1FKFB5T2JqZWN0ICpzZWxmLCBBUkcxVFlQRSBhcmcxLCBBUkcyVFlQRSBhcmcyKSBcCiB7IFwKLQlzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0cjsgXAotCXJldHVybiBjYWxsX21ldGhvZChzZWxmLCBPUFNUUiwgJmNhY2hlX3N0ciwgXAotCQkJICAgIigiIEFSR0NPREVTICIpIiwgYXJnMSwgYXJnMik7IFwKKyAgICBzdGF0aWMgUHlPYmplY3QgKmNhY2hlX3N0cjsgXAorICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCBPUFNUUiwgJmNhY2hlX3N0ciwgXAorICAgICAgICAgICAgICAgICAgICAgICAiKCIgQVJHQ09ERVMgIikiLCBhcmcxLCBhcmcyKTsgXAogfQogCiBzdGF0aWMgUHlfc3NpemVfdAogc2xvdF9zcV9sZW5ndGgoUHlPYmplY3QgKnNlbGYpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpsZW5fc3RyOwotCVB5T2JqZWN0ICpyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19sZW5fXyIsICZsZW5fc3RyLCAiKCkiKTsKLQlQeV9zc2l6ZV90IGxlbjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmxlbl9zdHI7CisgICAgUHlPYmplY3QgKnJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2xlbl9fIiwgJmxlbl9zdHIsICIoKSIpOworICAgIFB5X3NzaXplX3QgbGVuOwogCi0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JbGVuID0gUHlJbnRfQXNTc2l6ZV90KHJlcyk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JaWYgKGxlbiA8IDApIHsKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJfX2xlbl9fKCkgc2hvdWxkIHJldHVybiA+PSAwIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIGxlbjsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBsZW4gPSBQeUludF9Bc1NzaXplX3QocmVzKTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19sZW5fXygpIHNob3VsZCByZXR1cm4gPj0gMCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBsZW47CiB9CiAKIC8qIFN1cGVyLW9wdGltaXplZCB2ZXJzaW9uIG9mIHNsb3Rfc3FfaXRlbS4KQEAgLTQ5MDMsMTMxICs0OTAzLDEzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3Rfc3FfaXRlbShQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpKQogewotCXN0YXRpYyBQeU9iamVjdCAqZ2V0aXRlbV9zdHI7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmdzID0gTlVMTCwgKml2YWwgPSBOVUxMLCAqcmV0dmFsID0gTlVMTDsKLQlkZXNjcmdldGZ1bmMgZjsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldGl0ZW1fc3RyOworICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJncyA9IE5VTEwsICppdmFsID0gTlVMTCwgKnJldHZhbCA9IE5VTEw7CisgICAgZGVzY3JnZXRmdW5jIGY7CiAKLQlpZiAoZ2V0aXRlbV9zdHIgPT0gTlVMTCkgewotCQlnZXRpdGVtX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0aXRlbV9fIik7Ci0JCWlmIChnZXRpdGVtX3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZ1bmMgPSBfUHlUeXBlX0xvb2t1cChQeV9UWVBFKHNlbGYpLCBnZXRpdGVtX3N0cik7Ci0JaWYgKGZ1bmMgIT0gTlVMTCkgewotCQlpZiAoKGYgPSBQeV9UWVBFKGZ1bmMpLT50cF9kZXNjcl9nZXQpID09IE5VTEwpCi0JCQlQeV9JTkNSRUYoZnVuYyk7Ci0JCWVsc2UgewotCQkJZnVuYyA9IGYoZnVuYywgc2VsZiwgKFB5T2JqZWN0ICopKFB5X1RZUEUoc2VsZikpKTsKLQkJCWlmIChmdW5jID09IE5VTEwpIHsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCQlpdmFsID0gUHlJbnRfRnJvbVNzaXplX3QoaSk7Ci0JCWlmIChpdmFsICE9IE5VTEwpIHsKLQkJCWFyZ3MgPSBQeVR1cGxlX05ldygxKTsKLQkJCWlmIChhcmdzICE9IE5VTEwpIHsKLQkJCQlQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIGl2YWwpOwotCQkJCXJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0JCQkJUHlfWERFQ1JFRihhcmdzKTsKLQkJCQlQeV9YREVDUkVGKGZ1bmMpOwotCQkJCXJldHVybiByZXR2YWw7Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgZ2V0aXRlbV9zdHIpOwotCX0KLQlQeV9YREVDUkVGKGFyZ3MpOwotCVB5X1hERUNSRUYoaXZhbCk7Ci0JUHlfWERFQ1JFRihmdW5jKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZ2V0aXRlbV9zdHIgPT0gTlVMTCkgeworICAgICAgICBnZXRpdGVtX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0aXRlbV9fIik7CisgICAgICAgIGlmIChnZXRpdGVtX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZ1bmMgPSBfUHlUeXBlX0xvb2t1cChQeV9UWVBFKHNlbGYpLCBnZXRpdGVtX3N0cik7CisgICAgaWYgKGZ1bmMgIT0gTlVMTCkgeworICAgICAgICBpZiAoKGYgPSBQeV9UWVBFKGZ1bmMpLT50cF9kZXNjcl9nZXQpID09IE5VTEwpCisgICAgICAgICAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnVuYyA9IGYoZnVuYywgc2VsZiwgKFB5T2JqZWN0ICopKFB5X1RZUEUoc2VsZikpKTsKKyAgICAgICAgICAgIGlmIChmdW5jID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpdmFsID0gUHlJbnRfRnJvbVNzaXplX3QoaSk7CisgICAgICAgIGlmIChpdmFsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygxKTsKKyAgICAgICAgICAgIGlmIChhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIGl2YWwpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGZ1bmMpOworICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwgZ2V0aXRlbV9zdHIpOworICAgIH0KKyAgICBQeV9YREVDUkVGKGFyZ3MpOworICAgIFB5X1hERUNSRUYoaXZhbCk7CisgICAgUHlfWERFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgogc2xvdF9zcV9zbGljZShQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IGopCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpnZXRzbGljZV9zdHI7Ci0JCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJpbiAzLngsIF9fZ2V0c2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkOyAiCi0JCQkgICAgInVzZSBfX2dldGl0ZW1fXyIsIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJfX2dldHNsaWNlX18iLCAmZ2V0c2xpY2Vfc3RyLAotCQkibm4iLCBpLCBqKTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldHNsaWNlX3N0cjsKKworICAgIGlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX2dldHNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgInVzZSBfX2dldGl0ZW1fXyIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJfX2dldHNsaWNlX18iLCAmZ2V0c2xpY2Vfc3RyLAorICAgICAgICAibm4iLCBpLCBqKTsKIH0KIAogc3RhdGljIGludAogc2xvdF9zcV9hc3NfaXRlbShQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpkZWxpdGVtX3N0ciwgKnNldGl0ZW1fc3RyOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpkZWxpdGVtX3N0ciwgKnNldGl0ZW1fc3RyOwogCi0JaWYgKHZhbHVlID09IE5VTEwpCi0JCXJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2RlbGl0ZW1fXyIsICZkZWxpdGVtX3N0ciwKLQkJCQkgICIobikiLCBpbmRleCk7Ci0JZWxzZQotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19zZXRpdGVtX18iLCAmc2V0aXRlbV9zdHIsCi0JCQkJICAiKG5PKSIsIGluZGV4LCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2RlbGl0ZW1fXyIsICZkZWxpdGVtX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihuKSIsIGluZGV4KTsKKyAgICBlbHNlCisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldGl0ZW1fXyIsICZzZXRpdGVtX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihuTykiLCBpbmRleCwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBzbG90X3NxX2Fzc19zbGljZShQeU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IGosIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqZGVsc2xpY2Vfc3RyLCAqc2V0c2xpY2Vfc3RyOwotCQotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCWlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX2RlbHNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZDsgIgotCQkJCSAgICJ1c2UgX19kZWxpdGVtX18iLCAxKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JCXJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2RlbHNsaWNlX18iLCAmZGVsc2xpY2Vfc3RyLAotCQkJCSAgIihubikiLCBpLCBqKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChQeUVycl9XYXJuUHkzaygiaW4gMy54LCBfX3NldHNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZDsgIgotCQkJCQkidXNlIF9fc2V0aXRlbV9fIiwgMSkgPCAwKQotCQkJcmV0dXJuIC0xOwkJCi0JCXJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldHNsaWNlX18iLCAmc2V0c2xpY2Vfc3RyLAotCQkJICAiKG5uTykiLCBpLCBqLCB2YWx1ZSk7Ci0JfQotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpkZWxzbGljZV9zdHIsICpzZXRzbGljZV9zdHI7CisKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfV2FyblB5M2soImluIDMueCwgX19kZWxzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgX19kZWxpdGVtX18iLCAxKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2RlbHNsaWNlX18iLCAmZGVsc2xpY2Vfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKG5uKSIsIGksIGopOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJpbiAzLngsIF9fc2V0c2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgX19zZXRpdGVtX18iLCAxKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX3NldHNsaWNlX18iLCAmc2V0c2xpY2Vfc3RyLAorICAgICAgICAgICAgICAgICAgIihubk8pIiwgaSwgaiwgdmFsdWUpOworICAgIH0KKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogc2xvdF9zcV9jb250YWlucyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICpmdW5jLCAqcmVzLCAqYXJnczsKLQlpbnQgcmVzdWx0ID0gLTE7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXMsICphcmdzOworICAgIGludCByZXN1bHQgPSAtMTsKIAotCXN0YXRpYyBQeU9iamVjdCAqY29udGFpbnNfc3RyOworICAgIHN0YXRpYyBQeU9iamVjdCAqY29udGFpbnNfc3RyOwogCi0JZnVuYyA9IGxvb2t1cF9tYXliZShzZWxmLCAiX19jb250YWluc19fIiwgJmNvbnRhaW5zX3N0cik7Ci0JaWYgKGZ1bmMgIT0gTlVMTCkgewotCQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHZhbHVlKTsKLQkJaWYgKGFyZ3MgPT0gTlVMTCkKLQkJCXJlcyA9IE5VTEw7Ci0JCWVsc2UgewotCQkJcmVzID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLQkJCVB5X0RFQ1JFRihhcmdzKTsKLQkJfQotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCWlmIChyZXMgIT0gTlVMTCkgewotCQkJcmVzdWx0ID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0JCQlQeV9ERUNSRUYocmVzKTsKLQkJfQotCX0KLQllbHNlIGlmICghIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJLyogUG9zc2libGUgcmVzdWx0czogLTEgYW5kIDEgKi8KLQkJcmVzdWx0ID0gKGludClfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKHNlbGYsIHZhbHVlLAotCQkJCQkJIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGZ1bmMgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fY29udGFpbnNfXyIsICZjb250YWluc19zdHIpOworICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7CisgICAgICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgICAgICByZXMgPSBOVUxMOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoISBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIC8qIFBvc3NpYmxlIHJlc3VsdHM6IC0xIGFuZCAxICovCisgICAgICAgIHJlc3VsdCA9IChpbnQpX1B5U2VxdWVuY2VfSXRlclNlYXJjaChzZWxmLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFlfSVRFUlNFQVJDSF9DT05UQUlOUyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKICNkZWZpbmUgc2xvdF9tcF9sZW5ndGggc2xvdF9zcV9sZW5ndGgKQEAgLTUwMzcsMTkgKzUwMzcsMTkgQEAKIHN0YXRpYyBpbnQKIHNsb3RfbXBfYXNzX3N1YnNjcmlwdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpkZWxpdGVtX3N0ciwgKnNldGl0ZW1fc3RyOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpkZWxpdGVtX3N0ciwgKnNldGl0ZW1fc3RyOwogCi0JaWYgKHZhbHVlID09IE5VTEwpCi0JCXJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2RlbGl0ZW1fXyIsICZkZWxpdGVtX3N0ciwKLQkJCQkgICIoTykiLCBrZXkpOwotCWVsc2UKLQkJcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fc2V0aXRlbV9fIiwgJnNldGl0ZW1fc3RyLAotCQkJCSAiKE9PKSIsIGtleSwgdmFsdWUpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiAwOworICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxpdGVtX18iLCAmZGVsaXRlbV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoTykiLCBrZXkpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fc2V0aXRlbV9fIiwgJnNldGl0ZW1fc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICIoT08pIiwga2V5LCB2YWx1ZSk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIFNMT1QxQklOKHNsb3RfbmJfYWRkLCBuYl9hZGQsICJfX2FkZF9fIiwgIl9fcmFkZF9fIikKQEAgLTUwNjIsMjUgKzUwNjIsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqc2xvdF9uYl9wb3dlcihQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIAogU0xPVDFCSU5GVUxMKHNsb3RfbmJfcG93ZXJfYmluYXJ5LCBzbG90X25iX3Bvd2VyLAotCSAgICAgbmJfcG93ZXIsICJfX3Bvd19fIiwgIl9fcnBvd19fIikKKyAgICAgICAgICAgICBuYl9wb3dlciwgIl9fcG93X18iLCAiX19ycG93X18iKQogCiBzdGF0aWMgUHlPYmplY3QgKgogc2xvdF9uYl9wb3dlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyLCBQeU9iamVjdCAqbW9kdWx1cykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKnBvd19zdHI7CisgICAgc3RhdGljIFB5T2JqZWN0ICpwb3dfc3RyOwogCi0JaWYgKG1vZHVsdXMgPT0gUHlfTm9uZSkKLQkJcmV0dXJuIHNsb3RfbmJfcG93ZXJfYmluYXJ5KHNlbGYsIG90aGVyKTsKLQkvKiBUaHJlZS1hcmcgcG93ZXIgZG9lc24ndCB1c2UgX19ycG93X18uICBCdXQgdGVybmFyeV9vcAotCSAgIGNhbiBjYWxsIHRoaXMgd2hlbiB0aGUgc2Vjb25kIGFyZ3VtZW50J3MgdHlwZSB1c2VzCi0JICAgc2xvdF9uYl9wb3dlciwgc28gY2hlY2sgYmVmb3JlIGNhbGxpbmcgc2VsZi5fX3Bvd19fLiAqLwotCWlmIChQeV9UWVBFKHNlbGYpLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJgotCSAgICBQeV9UWVBFKHNlbGYpLT50cF9hc19udW1iZXItPm5iX3Bvd2VyID09IHNsb3RfbmJfcG93ZXIpIHsKLQkJcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJfX3Bvd19fIiwgJnBvd19zdHIsCi0JCQkJICAgIihPTykiLCBvdGhlciwgbW9kdWx1cyk7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOworICAgIGlmIChtb2R1bHVzID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiBzbG90X25iX3Bvd2VyX2JpbmFyeShzZWxmLCBvdGhlcik7CisgICAgLyogVGhyZWUtYXJnIHBvd2VyIGRvZXNuJ3QgdXNlIF9fcnBvd19fLiAgQnV0IHRlcm5hcnlfb3AKKyAgICAgICBjYW4gY2FsbCB0aGlzIHdoZW4gdGhlIHNlY29uZCBhcmd1bWVudCdzIHR5cGUgdXNlcworICAgICAgIHNsb3RfbmJfcG93ZXIsIHNvIGNoZWNrIGJlZm9yZSBjYWxsaW5nIHNlbGYuX19wb3dfXy4gKi8KKyAgICBpZiAoUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYKKyAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfYXNfbnVtYmVyLT5uYl9wb3dlciA9PSBzbG90X25iX3Bvd2VyKSB7CisgICAgICAgIHJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19wb3dfXyIsICZwb3dfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIihPTykiLCBvdGhlciwgbW9kdWx1cyk7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwogfQogCiBTTE9UMChzbG90X25iX25lZ2F0aXZlLCAiX19uZWdfXyIpCkBAIC01MDkwLDQ5ICs1MDkwLDQ5IEBACiBzdGF0aWMgaW50CiBzbG90X25iX25vbnplcm8oUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmdzOwotCXN0YXRpYyBQeU9iamVjdCAqbm9uemVyb19zdHIsICpsZW5fc3RyOwotCWludCByZXN1bHQgPSAtMTsKLQlpbnQgdXNpbmdfbGVuID0gMDsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3M7CisgICAgc3RhdGljIFB5T2JqZWN0ICpub256ZXJvX3N0ciwgKmxlbl9zdHI7CisgICAgaW50IHJlc3VsdCA9IC0xOworICAgIGludCB1c2luZ19sZW4gPSAwOwogCi0JZnVuYyA9IGxvb2t1cF9tYXliZShzZWxmLCAiX19ub256ZXJvX18iLCAmbm9uemVyb19zdHIpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWZ1bmMgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fbGVuX18iLCAmbGVuX3N0cik7Ci0JCWlmIChmdW5jID09IE5VTEwpCi0JCQlyZXR1cm4gUHlFcnJfT2NjdXJyZWQoKSA/IC0xIDogMTsKLQkJdXNpbmdfbGVuID0gMTsKLQl9Ci0JYXJncyA9IFB5VHVwbGVfTmV3KDApOwotCWlmIChhcmdzICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKnRlbXAgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JCWlmICh0ZW1wICE9IE5VTEwpIHsKLQkJCWlmIChQeUludF9DaGVja0V4YWN0KHRlbXApIHx8IFB5Qm9vbF9DaGVjayh0ZW1wKSkKLQkJCQlyZXN1bHQgPSBQeU9iamVjdF9Jc1RydWUodGVtcCk7Ci0JCQllbHNlIHsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgICAgICIlcyBzaG91bGQgcmV0dXJuICIKLQkJCQkJICAgICAiYm9vbCBvciBpbnQsIHJldHVybmVkICVzIiwKLQkJCQkJICAgICAodXNpbmdfbGVuID8gIl9fbGVuX18iCi0JCQkJCSAgICAgICAgICAgICAgICA6ICJfX25vbnplcm9fXyIpLAotCQkJCQkgICAgIHRlbXAtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJCXJlc3VsdCA9IC0xOwotCQkJfQotCQkJUHlfREVDUkVGKHRlbXApOwotCQl9Ci0JfQotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIGZ1bmMgPSBsb29rdXBfbWF5YmUoc2VsZiwgIl9fbm9uemVyb19fIiwgJm5vbnplcm9fc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBmdW5jID0gbG9va3VwX21heWJlKHNlbGYsICJfX2xlbl9fIiwgJmxlbl9zdHIpOworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIFB5RXJyX09jY3VycmVkKCkgPyAtMSA6IDE7CisgICAgICAgIHVzaW5nX2xlbiA9IDE7CisgICAgfQorICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICBpZiAoYXJncyAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBpZiAodGVtcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdCh0ZW1wKSB8fCBQeUJvb2xfQ2hlY2sodGVtcCkpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfSXNUcnVlKHRlbXApOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHNob3VsZCByZXR1cm4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9vbCBvciBpbnQsIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzaW5nX2xlbiA/ICJfX2xlbl9fIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIl9fbm9uemVyb19fIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X25iX2luZGV4KFB5T2JqZWN0ICpzZWxmKQogewotCXN0YXRpYyBQeU9iamVjdCAqaW5kZXhfc3RyOwotCXJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19pbmRleF9fIiwgJmluZGV4X3N0ciwgIigpIik7CisgICAgc3RhdGljIFB5T2JqZWN0ICppbmRleF9zdHI7CisgICAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJfX2luZGV4X18iLCAmaW5kZXhfc3RyLCAiKCkiKTsKIH0KIAogCkBAIC01MTQ2LDU5ICs1MTQ2LDU5IEBACiBzdGF0aWMgaW50CiBzbG90X25iX2NvZXJjZShQeU9iamVjdCAqKmEsIFB5T2JqZWN0ICoqYikKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmNvZXJjZV9zdHI7Ci0JUHlPYmplY3QgKnNlbGYgPSAqYSwgKm90aGVyID0gKmI7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjb2VyY2Vfc3RyOworICAgIFB5T2JqZWN0ICpzZWxmID0gKmEsICpvdGhlciA9ICpiOwogCi0JaWYgKHNlbGYtPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmCi0JICAgIHNlbGYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfY29lcmNlID09IHNsb3RfbmJfY29lcmNlKSB7Ci0JCVB5T2JqZWN0ICpyOwotCQlyID0gY2FsbF9tYXliZSgKLQkJCXNlbGYsICJfX2NvZXJjZV9fIiwgJmNvZXJjZV9zdHIsICIoTykiLCBvdGhlcik7Ci0JCWlmIChyID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChyID09IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCQlQeV9ERUNSRUYocik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoIVB5VHVwbGVfQ2hlY2socikgfHwgUHlUdXBsZV9HRVRfU0laRShyKSAhPSAyKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIl9fY29lcmNlX18gZGlkbid0IHJldHVybiBhIDItdHVwbGUiKTsKLQkJCQlQeV9ERUNSRUYocik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJKmEgPSBQeVR1cGxlX0dFVF9JVEVNKHIsIDApOwotCQkJUHlfSU5DUkVGKCphKTsKLQkJCSpiID0gUHlUdXBsZV9HRVRfSVRFTShyLCAxKTsKLQkJCVB5X0lOQ1JFRigqYik7Ci0JCQlQeV9ERUNSRUYocik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlpZiAob3RoZXItPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmCi0JICAgIG90aGVyLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSA9PSBzbG90X25iX2NvZXJjZSkgewotCQlQeU9iamVjdCAqcjsKLQkJciA9IGNhbGxfbWF5YmUoCi0JCQlvdGhlciwgIl9fY29lcmNlX18iLCAmY29lcmNlX3N0ciwgIihPKSIsIHNlbGYpOwotCQlpZiAociA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlpZiAociA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQkJUHlfREVDUkVGKHIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJaWYgKCFQeVR1cGxlX0NoZWNrKHIpIHx8IFB5VHVwbGVfR0VUX1NJWkUocikgIT0gMikgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJIl9fY29lcmNlX18gZGlkbid0IHJldHVybiBhIDItdHVwbGUiKTsKLQkJCVB5X0RFQ1JFRihyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkqYSA9IFB5VHVwbGVfR0VUX0lURU0ociwgMSk7Ci0JCVB5X0lOQ1JFRigqYSk7Ci0JCSpiID0gUHlUdXBsZV9HRVRfSVRFTShyLCAwKTsKLQkJUHlfSU5DUkVGKCpiKTsKLQkJUHlfREVDUkVGKHIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaWYgKHNlbGYtPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmCisgICAgICAgIHNlbGYtPm9iX3R5cGUtPnRwX2FzX251bWJlci0+bmJfY29lcmNlID09IHNsb3RfbmJfY29lcmNlKSB7CisgICAgICAgIFB5T2JqZWN0ICpyOworICAgICAgICByID0gY2FsbF9tYXliZSgKKyAgICAgICAgICAgIHNlbGYsICJfX2NvZXJjZV9fIiwgJmNvZXJjZV9zdHIsICIoTykiLCBvdGhlcik7CisgICAgICAgIGlmIChyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChyID09IFB5X05vdEltcGxlbWVudGVkKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2socikgfHwgUHlUdXBsZV9HRVRfU0laRShyKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIl9fY29lcmNlX18gZGlkbid0IHJldHVybiBhIDItdHVwbGUiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmEgPSBQeVR1cGxlX0dFVF9JVEVNKHIsIDApOworICAgICAgICAgICAgUHlfSU5DUkVGKCphKTsKKyAgICAgICAgICAgICpiID0gUHlUdXBsZV9HRVRfSVRFTShyLCAxKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRigqYik7CisgICAgICAgICAgICBQeV9ERUNSRUYocik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAob3RoZXItPm9iX3R5cGUtPnRwX2FzX251bWJlciAhPSBOVUxMICYmCisgICAgICAgIG90aGVyLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2NvZXJjZSA9PSBzbG90X25iX2NvZXJjZSkgeworICAgICAgICBQeU9iamVjdCAqcjsKKyAgICAgICAgciA9IGNhbGxfbWF5YmUoCisgICAgICAgICAgICBvdGhlciwgIl9fY29lcmNlX18iLCAmY29lcmNlX3N0ciwgIihPKSIsIHNlbGYpOworICAgICAgICBpZiAociA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAociA9PSBQeV9Ob3RJbXBsZW1lbnRlZCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrKHIpIHx8IFB5VHVwbGVfR0VUX1NJWkUocikgIT0gMikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19jb2VyY2VfXyBkaWRuJ3QgcmV0dXJuIGEgMi10dXBsZSIpOworICAgICAgICAgICAgUHlfREVDUkVGKHIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgICphID0gUHlUdXBsZV9HRVRfSVRFTShyLCAxKTsKKyAgICAgICAgUHlfSU5DUkVGKCphKTsKKyAgICAgICAgKmIgPSBQeVR1cGxlX0dFVF9JVEVNKHIsIDApOworICAgICAgICBQeV9JTkNSRUYoKmIpOworICAgICAgICBQeV9ERUNSRUYocik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogU0xPVDAoc2xvdF9uYl9pbnQsICJfX2ludF9fIikKQEAgLTUyMTIsMTEgKzUyMTIsMTEgQEAKIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV9kaXZpZGUsICJfX2lkaXZfXyIsIFB5T2JqZWN0ICosICJPIikKIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV9yZW1haW5kZXIsICJfX2ltb2RfXyIsIFB5T2JqZWN0ICosICJPIikKIC8qIENhbid0IHVzZSBTTE9UMSBoZXJlLCBiZWNhdXNlIG5iX2lucGxhY2VfcG93ZXIgaXMgdGVybmFyeSAqLwotc3RhdGljIFB5T2JqZWN0ICogCi1zbG90X25iX2lucGxhY2VfcG93ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICogYXJnMSwgUHlPYmplY3QgKmFyZzIpIAoteyAKLSAgc3RhdGljIFB5T2JqZWN0ICpjYWNoZV9zdHI7IAotICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgIl9faXBvd19fIiwgJmNhY2hlX3N0ciwgIigiICJPIiAiKSIsIGFyZzEpOyAKK3N0YXRpYyBQeU9iamVjdCAqCitzbG90X25iX2lucGxhY2VfcG93ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICogYXJnMSwgUHlPYmplY3QgKmFyZzIpCit7CisgIHN0YXRpYyBQeU9iamVjdCAqY2FjaGVfc3RyOworICByZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgIl9faXBvd19fIiwgJmNhY2hlX3N0ciwgIigiICJPIiAiKSIsIGFyZzEpOwogfQogU0xPVDEoc2xvdF9uYl9pbnBsYWNlX2xzaGlmdCwgIl9faWxzaGlmdF9fIiwgUHlPYmplY3QgKiwgIk8iKQogU0xPVDEoc2xvdF9uYl9pbnBsYWNlX3JzaGlmdCwgIl9faXJzaGlmdF9fIiwgUHlPYmplY3QgKiwgIk8iKQpAQCAtNTIyNCw3ICs1MjI0LDcgQEAKIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV94b3IsICJfX2l4b3JfXyIsIFB5T2JqZWN0ICosICJPIikKIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV9vciwgIl9faW9yX18iLCBQeU9iamVjdCAqLCAiTyIpCiBTTE9UMUJJTihzbG90X25iX2Zsb29yX2RpdmlkZSwgbmJfZmxvb3JfZGl2aWRlLAotCSAiX19mbG9vcmRpdl9fIiwgIl9fcmZsb29yZGl2X18iKQorICAgICAgICAgIl9fZmxvb3JkaXZfXyIsICJfX3JmbG9vcmRpdl9fIikKIFNMT1QxQklOKHNsb3RfbmJfdHJ1ZV9kaXZpZGUsIG5iX3RydWVfZGl2aWRlLCAiX190cnVlZGl2X18iLCAiX19ydHJ1ZWRpdl9fIikKIFNMT1QxKHNsb3RfbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGUsICJfX2lmbG9vcmRpdl9fIiwgUHlPYmplY3QgKiwgIk8iKQogU0xPVDEoc2xvdF9uYl9pbnBsYWNlX3RydWVfZGl2aWRlLCAiX19pdHJ1ZWRpdl9fIiwgUHlPYmplY3QgKiwgIk8iKQpAQCAtNTIzMiwxNDggKzUyMzIsMTQ4IEBACiBzdGF0aWMgaW50CiBoYWxmX2NvbXBhcmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlcikKIHsKLQlQeU9iamVjdCAqZnVuYywgKmFyZ3MsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpjbXBfc3RyOwotCVB5X3NzaXplX3QgYzsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFyZ3MsICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjbXBfc3RyOworICAgIFB5X3NzaXplX3QgYzsKIAotCWZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2NtcF9fIiwgJmNtcF9zdHIpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JZWxzZSB7Ci0JCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgb3RoZXIpOwotCQlpZiAoYXJncyA9PSBOVUxMKQotCQkJcmVzID0gTlVMTDsKLQkJZWxzZSB7Ci0JCQlyZXMgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotCQkJUHlfREVDUkVGKGFyZ3MpOwotCQl9Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkgewotCQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJCXJldHVybiAtMjsKLQkJCWMgPSBQeUludF9Bc0xvbmcocmVzKTsKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJaWYgKGMgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gLTI7Ci0JCQlyZXR1cm4gKGMgPCAwKSA/IC0xIDogKGMgPiAwKSA/IDEgOiAwOwotCQl9Ci0JCVB5X0RFQ1JFRihyZXMpOwotCX0KLQlyZXR1cm4gMjsKKyAgICBmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19jbXBfXyIsICZjbXBfc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDEsIG90aGVyKTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIGlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgICAgICBjID0gUHlJbnRfQXNMb25nKHJlcyk7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIGlmIChjID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICAgICAgcmV0dXJuIChjIDwgMCkgPyAtMSA6IChjID4gMCkgPyAxIDogMDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICB9CisgICAgcmV0dXJuIDI7CiB9CiAKIC8qIFRoaXMgc2xvdCBpcyBwdWJsaXNoZWQgZm9yIHRoZSBiZW5lZml0IG9mIHRyeV8zd2F5X2NvbXBhcmUgaW4gb2JqZWN0LmMgKi8KIGludAogX1B5T2JqZWN0X1Nsb3RDb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIpCiB7Ci0JaW50IGM7CisgICAgaW50IGM7CiAKLQlpZiAoUHlfVFlQRShzZWxmKS0+dHBfY29tcGFyZSA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUpIHsKLQkJYyA9IGhhbGZfY29tcGFyZShzZWxmLCBvdGhlcik7Ci0JCWlmIChjIDw9IDEpCi0JCQlyZXR1cm4gYzsKLQl9Ci0JaWYgKFB5X1RZUEUob3RoZXIpLT50cF9jb21wYXJlID09IF9QeU9iamVjdF9TbG90Q29tcGFyZSkgewotCQljID0gaGFsZl9jb21wYXJlKG90aGVyLCBzZWxmKTsKLQkJaWYgKGMgPCAtMSkKLQkJCXJldHVybiAtMjsKLQkJaWYgKGMgPD0gMSkKLQkJCXJldHVybiAtYzsKLQl9Ci0JcmV0dXJuICh2b2lkICopc2VsZiA8ICh2b2lkICopb3RoZXIgPyAtMSA6Ci0JCSh2b2lkICopc2VsZiA+ICh2b2lkICopb3RoZXIgPyAxIDogMDsKKyAgICBpZiAoUHlfVFlQRShzZWxmKS0+dHBfY29tcGFyZSA9PSBfUHlPYmplY3RfU2xvdENvbXBhcmUpIHsKKyAgICAgICAgYyA9IGhhbGZfY29tcGFyZShzZWxmLCBvdGhlcik7CisgICAgICAgIGlmIChjIDw9IDEpCisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICB9CisgICAgaWYgKFB5X1RZUEUob3RoZXIpLT50cF9jb21wYXJlID09IF9QeU9iamVjdF9TbG90Q29tcGFyZSkgeworICAgICAgICBjID0gaGFsZl9jb21wYXJlKG90aGVyLCBzZWxmKTsKKyAgICAgICAgaWYgKGMgPCAtMSkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgaWYgKGMgPD0gMSkKKyAgICAgICAgICAgIHJldHVybiAtYzsKKyAgICB9CisgICAgcmV0dXJuICh2b2lkICopc2VsZiA8ICh2b2lkICopb3RoZXIgPyAtMSA6CisgICAgICAgICh2b2lkICopc2VsZiA+ICh2b2lkICopb3RoZXIgPyAxIDogMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RfdHBfcmVwcihQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZnVuYywgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKnJlcHJfc3RyOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqcmVwcl9zdHI7CiAKLQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19yZXByX18iLCAmcmVwcl9zdHIpOwotCWlmIChmdW5jICE9IE5VTEwpIHsKLQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIG9iamVjdCBhdCAlcD4iLAotCQkJCSAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIHNlbGYpOworICAgIGZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX3JlcHJfXyIsICZyZXByX3N0cik7CisgICAgaWYgKGZ1bmMgIT0gTlVMTCkgeworICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KCI8JXMgb2JqZWN0IGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwgc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX3N0cihQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZnVuYywgKnJlczsKLQlzdGF0aWMgUHlPYmplY3QgKnN0cl9zdHI7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpzdHJfc3RyOwogCi0JZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fc3RyX18iLCAmc3RyX3N0cik7Ci0JaWYgKGZ1bmMgIT0gTlVMTCkgewotCQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBOVUxMKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQllbHNlIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIHNsb3RfdHBfcmVwcihzZWxmKTsKLQl9CisgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fc3RyX18iLCAmc3RyX3N0cik7CisgICAgaWYgKGZ1bmMgIT0gTlVMTCkgeworICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIHNsb3RfdHBfcmVwcihzZWxmKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBsb25nCiBzbG90X3RwX2hhc2goUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpoYXNoX3N0ciwgKmVxX3N0ciwgKmNtcF9zdHI7Ci0JbG9uZyBoOworICAgIFB5T2JqZWN0ICpmdW5jOworICAgIHN0YXRpYyBQeU9iamVjdCAqaGFzaF9zdHIsICplcV9zdHIsICpjbXBfc3RyOworICAgIGxvbmcgaDsKIAotCWZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2hhc2hfXyIsICZoYXNoX3N0cik7CisgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9faGFzaF9fIiwgJmhhc2hfc3RyKTsKIAotCWlmIChmdW5jICE9IE5VTEwgJiYgZnVuYyAhPSBQeV9Ob25lKSB7Ci0JCVB5T2JqZWN0ICpyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBOVUxMKTsKLQkJUHlfREVDUkVGKGZ1bmMpOwotCQlpZiAocmVzID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChQeUxvbmdfQ2hlY2socmVzKSkKLQkJCWggPSBQeUxvbmdfVHlwZS50cF9oYXNoKHJlcyk7Ci0JCWVsc2UKLQkJCWggPSBQeUludF9Bc0xvbmcocmVzKTsKLQkJUHlfREVDUkVGKHJlcyk7Ci0JfQotCWVsc2UgewotCQlQeV9YREVDUkVGKGZ1bmMpOyAvKiBtYXkgYmUgTm9uZSAqLwotCQlQeUVycl9DbGVhcigpOwotCQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19lcV9fIiwgJmVxX3N0cik7Ci0JCWlmIChmdW5jID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19jbXBfXyIsICZjbXBfc3RyKTsKLQkJfQotCQlpZiAoZnVuYyAhPSBOVUxMKSB7Ci0JCQlQeV9ERUNSRUYoZnVuYyk7Ci0JCQlyZXR1cm4gUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKHNlbGYpOwotCQl9Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JCWggPSBfUHlfSGFzaFBvaW50ZXIoKHZvaWQgKilzZWxmKTsKLQl9Ci0JaWYgKGggPT0gLTEgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0JCWggPSAtMjsKLQlyZXR1cm4gaDsKKyAgICBpZiAoZnVuYyAhPSBOVUxMICYmIGZ1bmMgIT0gUHlfTm9uZSkgeworICAgICAgICBQeU9iamVjdCAqcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlMb25nX0NoZWNrKHJlcykpCisgICAgICAgICAgICBoID0gUHlMb25nX1R5cGUudHBfaGFzaChyZXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoID0gUHlJbnRfQXNMb25nKHJlcyk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfWERFQ1JFRihmdW5jKTsgLyogbWF5IGJlIE5vbmUgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fZXFfXyIsICZlcV9zdHIpOworICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fY21wX18iLCAmY21wX3N0cik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZ1bmMgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZChzZWxmKTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBoID0gX1B5X0hhc2hQb2ludGVyKCh2b2lkICopc2VsZik7CisgICAgfQorICAgIGlmIChoID09IC0xICYmICFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBoID0gLTI7CisgICAgcmV0dXJuIGg7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX2NhbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmNhbGxfc3RyOwotCVB5T2JqZWN0ICptZXRoID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19jYWxsX18iLCAmY2FsbF9zdHIpOwotCVB5T2JqZWN0ICpyZXM7CisgICAgc3RhdGljIFB5T2JqZWN0ICpjYWxsX3N0cjsKKyAgICBQeU9iamVjdCAqbWV0aCA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fY2FsbF9fIiwgJmNhbGxfc3RyKTsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKG1ldGggPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKG1ldGggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXMgPSBQeU9iamVjdF9DYWxsKG1ldGgsIGFyZ3MsIGt3ZHMpOworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGwobWV0aCwgYXJncywga3dkcyk7CiAKLQlQeV9ERUNSRUYobWV0aCk7Ci0JcmV0dXJuIHJlczsKKyAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogVGhlcmUgYXJlIHR3byBzbG90IGRpc3BhdGNoIGZ1bmN0aW9ucyBmb3IgdHBfZ2V0YXR0cm8uCkBAIC01MzkwLDEwMCArNTM5MCwxMDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX2dldGF0dHJvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKmdldGF0dHJpYnV0ZV9zdHIgPSBOVUxMOwotCXJldHVybiBjYWxsX21ldGhvZChzZWxmLCAiX19nZXRhdHRyaWJ1dGVfXyIsICZnZXRhdHRyaWJ1dGVfc3RyLAotCQkJICAgIihPKSIsIG5hbWUpOworICAgIHN0YXRpYyBQeU9iamVjdCAqZ2V0YXR0cmlidXRlX3N0ciA9IE5VTEw7CisgICAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJfX2dldGF0dHJpYnV0ZV9fIiwgJmdldGF0dHJpYnV0ZV9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICIoTykiLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfYXR0cmlidXRlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXR0ciwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKnJlcywgKmRlc2NyID0gTlVMTDsKLQlkZXNjcmdldGZ1bmMgZiA9IFB5X1RZUEUoYXR0ciktPnRwX2Rlc2NyX2dldDsKKyAgICBQeU9iamVjdCAqcmVzLCAqZGVzY3IgPSBOVUxMOworICAgIGRlc2NyZ2V0ZnVuYyBmID0gUHlfVFlQRShhdHRyKS0+dHBfZGVzY3JfZ2V0OwogCi0JaWYgKGYgIT0gTlVMTCkgewotCQlkZXNjciA9IGYoYXR0ciwgc2VsZiwgKFB5T2JqZWN0ICopKFB5X1RZUEUoc2VsZikpKTsKLQkJaWYgKGRlc2NyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZWxzZQotCQkJYXR0ciA9IGRlc2NyOwotCX0KLQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGF0dHIsIG5hbWUsIE5VTEwpOwotCVB5X1hERUNSRUYoZGVzY3IpOwotCXJldHVybiByZXM7CisgICAgaWYgKGYgIT0gTlVMTCkgeworICAgICAgICBkZXNjciA9IGYoYXR0ciwgc2VsZiwgKFB5T2JqZWN0ICopKFB5X1RZUEUoc2VsZikpKTsKKyAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXR0ciA9IGRlc2NyOworICAgIH0KKyAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGF0dHIsIG5hbWUsIE5VTEwpOworICAgIFB5X1hERUNSRUYoZGVzY3IpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX2dldGF0dHJfaG9vayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUoc2VsZik7Ci0JUHlPYmplY3QgKmdldGF0dHIsICpnZXRhdHRyaWJ1dGUsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpnZXRhdHRyaWJ1dGVfc3RyID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKmdldGF0dHJfc3RyID0gTlVMTDsKKyAgICBQeVR5cGVPYmplY3QgKnRwID0gUHlfVFlQRShzZWxmKTsKKyAgICBQeU9iamVjdCAqZ2V0YXR0ciwgKmdldGF0dHJpYnV0ZSwgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldGF0dHJpYnV0ZV9zdHIgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqZ2V0YXR0cl9zdHIgPSBOVUxMOwogCi0JaWYgKGdldGF0dHJfc3RyID09IE5VTEwpIHsKLQkJZ2V0YXR0cl9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldGF0dHJfXyIpOwotCQlpZiAoZ2V0YXR0cl9zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZ2V0YXR0cmlidXRlX3N0ciA9PSBOVUxMKSB7Ci0JCWdldGF0dHJpYnV0ZV9zdHIgPQotCQkJUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRhdHRyaWJ1dGVfXyIpOwotCQlpZiAoZ2V0YXR0cmlidXRlX3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIHNwZWVkIGhhY2s6IHdlIGNvdWxkIHVzZSBsb29rdXBfbWF5YmUsIGJ1dCB0aGF0IHdvdWxkIHJlc29sdmUgdGhlCi0JICAgbWV0aG9kIGZ1bGx5IGZvciBlYWNoIGF0dHJpYnV0ZSBsb29rdXAgZm9yIGNsYXNzZXMgd2l0aAotCSAgIF9fZ2V0YXR0cl9fLCBldmVuIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBwcmVzZW50LiBTbyB3ZSB1c2UKLQkgICBfUHlUeXBlX0xvb2t1cCBhbmQgY3JlYXRlIHRoZSBtZXRob2Qgb25seSB3aGVuIG5lZWRlZCwgd2l0aAotCSAgIGNhbGxfYXR0cmlidXRlLiAqLwotCWdldGF0dHIgPSBfUHlUeXBlX0xvb2t1cCh0cCwgZ2V0YXR0cl9zdHIpOwotCWlmIChnZXRhdHRyID09IE5VTEwpIHsKLQkJLyogTm8gX19nZXRhdHRyX18gaG9vazogdXNlIGEgc2ltcGxlciBkaXNwYXRjaGVyICovCi0JCXRwLT50cF9nZXRhdHRybyA9IHNsb3RfdHBfZ2V0YXR0cm87Ci0JCXJldHVybiBzbG90X3RwX2dldGF0dHJvKHNlbGYsIG5hbWUpOwotCX0KLQlQeV9JTkNSRUYoZ2V0YXR0cik7Ci0JLyogc3BlZWQgaGFjazogd2UgY291bGQgdXNlIGxvb2t1cF9tYXliZSwgYnV0IHRoYXQgd291bGQgcmVzb2x2ZSB0aGUKLQkgICBtZXRob2QgZnVsbHkgZm9yIGVhY2ggYXR0cmlidXRlIGxvb2t1cCBmb3IgY2xhc3NlcyB3aXRoCi0JICAgX19nZXRhdHRyX18sIGV2ZW4gd2hlbiBzZWxmIGhhcyB0aGUgZGVmYXVsdCBfX2dldGF0dHJpYnV0ZV9fCi0JICAgbWV0aG9kLiBTbyB3ZSB1c2UgX1B5VHlwZV9Mb29rdXAgYW5kIGNyZWF0ZSB0aGUgbWV0aG9kIG9ubHkgd2hlbgotCSAgIG5lZWRlZCwgd2l0aCBjYWxsX2F0dHJpYnV0ZS4gKi8KLQlnZXRhdHRyaWJ1dGUgPSBfUHlUeXBlX0xvb2t1cCh0cCwgZ2V0YXR0cmlidXRlX3N0cik7Ci0JaWYgKGdldGF0dHJpYnV0ZSA9PSBOVUxMIHx8Ci0JICAgIChQeV9UWVBFKGdldGF0dHJpYnV0ZSkgPT0gJlB5V3JhcHBlckRlc2NyX1R5cGUgJiYKLQkgICAgICgoUHlXcmFwcGVyRGVzY3JPYmplY3QgKilnZXRhdHRyaWJ1dGUpLT5kX3dyYXBwZWQgPT0KLQkgICAgICh2b2lkICopUHlPYmplY3RfR2VuZXJpY0dldEF0dHIpKQotCQlyZXMgPSBQeU9iamVjdF9HZW5lcmljR2V0QXR0cihzZWxmLCBuYW1lKTsKLQllbHNlIHsKLQkJUHlfSU5DUkVGKGdldGF0dHJpYnV0ZSk7Ci0JCXJlcyA9IGNhbGxfYXR0cmlidXRlKHNlbGYsIGdldGF0dHJpYnV0ZSwgbmFtZSk7Ci0JCVB5X0RFQ1JFRihnZXRhdHRyaWJ1dGUpOwotCX0KLQlpZiAocmVzID09IE5VTEwgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmVzID0gY2FsbF9hdHRyaWJ1dGUoc2VsZiwgZ2V0YXR0ciwgbmFtZSk7Ci0JfQotCVB5X0RFQ1JFRihnZXRhdHRyKTsKLQlyZXR1cm4gcmVzOworICAgIGlmIChnZXRhdHRyX3N0ciA9PSBOVUxMKSB7CisgICAgICAgIGdldGF0dHJfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRhdHRyX18iKTsKKyAgICAgICAgaWYgKGdldGF0dHJfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGdldGF0dHJpYnV0ZV9zdHIgPT0gTlVMTCkgeworICAgICAgICBnZXRhdHRyaWJ1dGVfc3RyID0KKyAgICAgICAgICAgIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZ2V0YXR0cmlidXRlX18iKTsKKyAgICAgICAgaWYgKGdldGF0dHJpYnV0ZV9zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBzcGVlZCBoYWNrOiB3ZSBjb3VsZCB1c2UgbG9va3VwX21heWJlLCBidXQgdGhhdCB3b3VsZCByZXNvbHZlIHRoZQorICAgICAgIG1ldGhvZCBmdWxseSBmb3IgZWFjaCBhdHRyaWJ1dGUgbG9va3VwIGZvciBjbGFzc2VzIHdpdGgKKyAgICAgICBfX2dldGF0dHJfXywgZXZlbiB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgcHJlc2VudC4gU28gd2UgdXNlCisgICAgICAgX1B5VHlwZV9Mb29rdXAgYW5kIGNyZWF0ZSB0aGUgbWV0aG9kIG9ubHkgd2hlbiBuZWVkZWQsIHdpdGgKKyAgICAgICBjYWxsX2F0dHJpYnV0ZS4gKi8KKyAgICBnZXRhdHRyID0gX1B5VHlwZV9Mb29rdXAodHAsIGdldGF0dHJfc3RyKTsKKyAgICBpZiAoZ2V0YXR0ciA9PSBOVUxMKSB7CisgICAgICAgIC8qIE5vIF9fZ2V0YXR0cl9fIGhvb2s6IHVzZSBhIHNpbXBsZXIgZGlzcGF0Y2hlciAqLworICAgICAgICB0cC0+dHBfZ2V0YXR0cm8gPSBzbG90X3RwX2dldGF0dHJvOworICAgICAgICByZXR1cm4gc2xvdF90cF9nZXRhdHRybyhzZWxmLCBuYW1lKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKGdldGF0dHIpOworICAgIC8qIHNwZWVkIGhhY2s6IHdlIGNvdWxkIHVzZSBsb29rdXBfbWF5YmUsIGJ1dCB0aGF0IHdvdWxkIHJlc29sdmUgdGhlCisgICAgICAgbWV0aG9kIGZ1bGx5IGZvciBlYWNoIGF0dHJpYnV0ZSBsb29rdXAgZm9yIGNsYXNzZXMgd2l0aAorICAgICAgIF9fZ2V0YXR0cl9fLCBldmVuIHdoZW4gc2VsZiBoYXMgdGhlIGRlZmF1bHQgX19nZXRhdHRyaWJ1dGVfXworICAgICAgIG1ldGhvZC4gU28gd2UgdXNlIF9QeVR5cGVfTG9va3VwIGFuZCBjcmVhdGUgdGhlIG1ldGhvZCBvbmx5IHdoZW4KKyAgICAgICBuZWVkZWQsIHdpdGggY2FsbF9hdHRyaWJ1dGUuICovCisgICAgZ2V0YXR0cmlidXRlID0gX1B5VHlwZV9Mb29rdXAodHAsIGdldGF0dHJpYnV0ZV9zdHIpOworICAgIGlmIChnZXRhdHRyaWJ1dGUgPT0gTlVMTCB8fAorICAgICAgICAoUHlfVFlQRShnZXRhdHRyaWJ1dGUpID09ICZQeVdyYXBwZXJEZXNjcl9UeXBlICYmCisgICAgICAgICAoKFB5V3JhcHBlckRlc2NyT2JqZWN0ICopZ2V0YXR0cmlidXRlKS0+ZF93cmFwcGVkID09CisgICAgICAgICAodm9pZCAqKVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKSkKKyAgICAgICAgcmVzID0gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoc2VsZiwgbmFtZSk7CisgICAgZWxzZSB7CisgICAgICAgIFB5X0lOQ1JFRihnZXRhdHRyaWJ1dGUpOworICAgICAgICByZXMgPSBjYWxsX2F0dHJpYnV0ZShzZWxmLCBnZXRhdHRyaWJ1dGUsIG5hbWUpOworICAgICAgICBQeV9ERUNSRUYoZ2V0YXR0cmlidXRlKTsKKyAgICB9CisgICAgaWYgKHJlcyA9PSBOVUxMICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJlcyA9IGNhbGxfYXR0cmlidXRlKHNlbGYsIGdldGF0dHIsIG5hbWUpOworICAgIH0KKyAgICBQeV9ERUNSRUYoZ2V0YXR0cik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGludAogc2xvdF90cF9zZXRhdHRybyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLQlQeU9iamVjdCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqZGVsYXR0cl9zdHIsICpzZXRhdHRyX3N0cjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsYXR0cl9zdHIsICpzZXRhdHRyX3N0cjsKIAotCWlmICh2YWx1ZSA9PSBOVUxMKQotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19kZWxhdHRyX18iLCAmZGVsYXR0cl9zdHIsCi0JCQkJICAiKE8pIiwgbmFtZSk7Ci0JZWxzZQotCQlyZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19zZXRhdHRyX18iLCAmc2V0YXR0cl9zdHIsCi0JCQkJICAiKE9PKSIsIG5hbWUsIHZhbHVlKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fZGVsYXR0cl9fIiwgJmRlbGF0dHJfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKE8pIiwgbmFtZSk7CisgICAgZWxzZQorICAgICAgICByZXMgPSBjYWxsX21ldGhvZChzZWxmLCAiX19zZXRhdHRyX18iLCAmc2V0YXR0cl9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoT08pIiwgbmFtZSwgdmFsdWUpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgY2hhciAqbmFtZV9vcFtdID0gewpAQCAtNTQ5OCwyNDQgKzU0OTgsMjQ0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaGFsZl9yaWNoY29tcGFyZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyLCBpbnQgb3ApCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICphcmdzLCAqcmVzOwotCXN0YXRpYyBQeU9iamVjdCAqb3Bfc3RyWzZdOworICAgIFB5T2JqZWN0ICpmdW5jLCAqYXJncywgKnJlczsKKyAgICBzdGF0aWMgUHlPYmplY3QgKm9wX3N0cls2XTsKIAotCWZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsIG5hbWVfb3Bbb3BdLCAmb3Bfc3RyW29wXSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkgewotCQlQeUVycl9DbGVhcigpOwotCQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCQlyZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0JfQotCWFyZ3MgPSBQeVR1cGxlX1BhY2soMSwgb3RoZXIpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJlcyA9IE5VTEw7Ci0JZWxzZSB7Ci0JCXJlcyA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQl9Ci0JUHlfREVDUkVGKGZ1bmMpOwotCXJldHVybiByZXM7CisgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgbmFtZV9vcFtvcF0sICZvcF9zdHJbb3BdKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7CisgICAgICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICB9CisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCBvdGhlcik7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmVzID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RfdHBfcmljaGNvbXBhcmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvdGhlciwgaW50IG9wKQogewotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChQeV9UWVBFKHNlbGYpLT50cF9yaWNoY29tcGFyZSA9PSBzbG90X3RwX3JpY2hjb21wYXJlKSB7Ci0JCXJlcyA9IGhhbGZfcmljaGNvbXBhcmUoc2VsZiwgb3RoZXIsIG9wKTsKLQkJaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkKLQkJCXJldHVybiByZXM7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCX0KLQlpZiAoUHlfVFlQRShvdGhlciktPnRwX3JpY2hjb21wYXJlID09IHNsb3RfdHBfcmljaGNvbXBhcmUpIHsKLQkJcmVzID0gaGFsZl9yaWNoY29tcGFyZShvdGhlciwgc2VsZiwgX1B5X1N3YXBwZWRPcFtvcF0pOwotCQlpZiAocmVzICE9IFB5X05vdEltcGxlbWVudGVkKSB7Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCVB5X0RFQ1JFRihyZXMpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotCXJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgICBpZiAoUHlfVFlQRShzZWxmKS0+dHBfcmljaGNvbXBhcmUgPT0gc2xvdF90cF9yaWNoY29tcGFyZSkgeworICAgICAgICByZXMgPSBoYWxmX3JpY2hjb21wYXJlKHNlbGYsIG90aGVyLCBvcCk7CisgICAgICAgIGlmIChyZXMgIT0gUHlfTm90SW1wbGVtZW50ZWQpCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICB9CisgICAgaWYgKFB5X1RZUEUob3RoZXIpLT50cF9yaWNoY29tcGFyZSA9PSBzbG90X3RwX3JpY2hjb21wYXJlKSB7CisgICAgICAgIHJlcyA9IGhhbGZfcmljaGNvbXBhcmUob3RoZXIsIHNlbGYsIF9QeV9Td2FwcGVkT3Bbb3BdKTsKKyAgICAgICAgaWYgKHJlcyAhPSBQeV9Ob3RJbXBsZW1lbnRlZCkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbG90X3RwX2l0ZXIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICppdGVyX3N0ciwgKmdldGl0ZW1fc3RyOworICAgIFB5T2JqZWN0ICpmdW5jLCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqaXRlcl9zdHIsICpnZXRpdGVtX3N0cjsKIAotCWZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2l0ZXJfXyIsICZpdGVyX3N0cik7Ci0JaWYgKGZ1bmMgIT0gTlVMTCkgewotCQlQeU9iamVjdCAqYXJnczsKLQkJYXJncyA9IHJlcyA9IFB5VHVwbGVfTmV3KDApOwotCQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCQlyZXMgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotCQkJUHlfREVDUkVGKGFyZ3MpOwotCQl9Ci0JCVB5X0RFQ1JFRihmdW5jKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JUHlFcnJfQ2xlYXIoKTsKLQlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19nZXRpdGVtX18iLCAmZ2V0aXRlbV9zdHIpOwotCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiclLjIwMHMnIG9iamVjdCBpcyBub3QgaXRlcmFibGUiLAotCQkJICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4gUHlTZXFJdGVyX05ldyhzZWxmKTsKKyAgICBmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19pdGVyX18iLCAmaXRlcl9zdHIpOworICAgIGlmIChmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgICAgIGFyZ3MgPSByZXMgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgaWYgKGFyZ3MgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZnVuYyA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9fZ2V0aXRlbV9fIiwgJmdldGl0ZW1fc3RyKTsKKyAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHNlbGYpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICByZXR1cm4gUHlTZXFJdGVyX05ldyhzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RfdHBfaXRlcm5leHQoUHlPYmplY3QgKnNlbGYpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpuZXh0X3N0cjsKLQlyZXR1cm4gY2FsbF9tZXRob2Qoc2VsZiwgIm5leHQiLCAmbmV4dF9zdHIsICIoKSIpOworICAgIHN0YXRpYyBQeU9iamVjdCAqbmV4dF9zdHI7CisgICAgcmV0dXJuIGNhbGxfbWV0aG9kKHNlbGYsICJuZXh0IiwgJm5leHRfc3RyLCAiKCkiKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RfdHBfZGVzY3JfZ2V0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdHlwZSkKIHsKLQlQeVR5cGVPYmplY3QgKnRwID0gUHlfVFlQRShzZWxmKTsKLQlQeU9iamVjdCAqZ2V0OwotCXN0YXRpYyBQeU9iamVjdCAqZ2V0X3N0ciA9IE5VTEw7CisgICAgUHlUeXBlT2JqZWN0ICp0cCA9IFB5X1RZUEUoc2VsZik7CisgICAgUHlPYmplY3QgKmdldDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldF9zdHIgPSBOVUxMOwogCi0JaWYgKGdldF9zdHIgPT0gTlVMTCkgewotCQlnZXRfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19nZXRfXyIpOwotCQlpZiAoZ2V0X3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWdldCA9IF9QeVR5cGVfTG9va3VwKHRwLCBnZXRfc3RyKTsKLQlpZiAoZ2V0ID09IE5VTEwpIHsKLQkJLyogQXZvaWQgZnVydGhlciBzbG93ZG93bnMgKi8KLQkJaWYgKHRwLT50cF9kZXNjcl9nZXQgPT0gc2xvdF90cF9kZXNjcl9nZXQpCi0JCQl0cC0+dHBfZGVzY3JfZ2V0ID0gTlVMTDsKLQkJUHlfSU5DUkVGKHNlbGYpOwotCQlyZXR1cm4gc2VsZjsKLQl9Ci0JaWYgKG9iaiA9PSBOVUxMKQotCQlvYmogPSBQeV9Ob25lOwotCWlmICh0eXBlID09IE5VTEwpCi0JCXR5cGUgPSBQeV9Ob25lOwotCXJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdldCwgc2VsZiwgb2JqLCB0eXBlLCBOVUxMKTsKKyAgICBpZiAoZ2V0X3N0ciA9PSBOVUxMKSB7CisgICAgICAgIGdldF9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2dldF9fIik7CisgICAgICAgIGlmIChnZXRfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZ2V0ID0gX1B5VHlwZV9Mb29rdXAodHAsIGdldF9zdHIpOworICAgIGlmIChnZXQgPT0gTlVMTCkgeworICAgICAgICAvKiBBdm9pZCBmdXJ0aGVyIHNsb3dkb3ducyAqLworICAgICAgICBpZiAodHAtPnRwX2Rlc2NyX2dldCA9PSBzbG90X3RwX2Rlc2NyX2dldCkKKyAgICAgICAgICAgIHRwLT50cF9kZXNjcl9nZXQgPSBOVUxMOworICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgIHJldHVybiBzZWxmOworICAgIH0KKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIG9iaiA9IFB5X05vbmU7CisgICAgaWYgKHR5cGUgPT0gTlVMTCkKKyAgICAgICAgdHlwZSA9IFB5X05vbmU7CisgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2V0LCBzZWxmLCBvYmosIHR5cGUsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50CiBzbG90X3RwX2Rlc2NyX3NldChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnRhcmdldCwgUHlPYmplY3QgKnZhbHVlKQogewotCVB5T2JqZWN0ICpyZXM7Ci0Jc3RhdGljIFB5T2JqZWN0ICpkZWxfc3RyLCAqc2V0X3N0cjsKKyAgICBQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqZGVsX3N0ciwgKnNldF9zdHI7CiAKLQlpZiAodmFsdWUgPT0gTlVMTCkKLQkJcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fZGVsZXRlX18iLCAmZGVsX3N0ciwKLQkJCQkgICIoTykiLCB0YXJnZXQpOwotCWVsc2UKLQkJcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fc2V0X18iLCAmc2V0X3N0ciwKLQkJCQkgICIoT08pIiwgdGFyZ2V0LCB2YWx1ZSk7Ci0JaWYgKHJlcyA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIHJlcyA9IGNhbGxfbWV0aG9kKHNlbGYsICJfX2RlbGV0ZV9fIiwgJmRlbF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoTykiLCB0YXJnZXQpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gY2FsbF9tZXRob2Qoc2VsZiwgIl9fc2V0X18iLCAmc2V0X3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihPTykiLCB0YXJnZXQsIHZhbHVlKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogc2xvdF90cF9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICppbml0X3N0cjsKLQlQeU9iamVjdCAqbWV0aCA9IGxvb2t1cF9tZXRob2Qoc2VsZiwgIl9faW5pdF9fIiwgJmluaXRfc3RyKTsKLQlQeU9iamVjdCAqcmVzOworICAgIHN0YXRpYyBQeU9iamVjdCAqaW5pdF9zdHI7CisgICAgUHlPYmplY3QgKm1ldGggPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2luaXRfXyIsICZpbml0X3N0cik7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmIChtZXRoID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlyZXMgPSBQeU9iamVjdF9DYWxsKG1ldGgsIGFyZ3MsIGt3ZHMpOwotCVB5X0RFQ1JFRihtZXRoKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAocmVzICE9IFB5X05vbmUpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIl9faW5pdF9fKCkgc2hvdWxkIHJldHVybiBOb25lLCBub3QgJyUuMjAwcyciLAotCQkJICAgICBQeV9UWVBFKHJlcyktPnRwX25hbWUpOwotCQlQeV9ERUNSRUYocmVzKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAobWV0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmVzID0gUHlPYmplY3RfQ2FsbChtZXRoLCBhcmdzLCBrd2RzKTsKKyAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHJlcyAhPSBQeV9Ob25lKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19pbml0X18oKSBzaG91bGQgcmV0dXJuIE5vbmUsIG5vdCAnJS4yMDBzJyIsCisgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHJlcyktPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNsb3RfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBQeU9iamVjdCAqbmV3X3N0cjsKLQlQeU9iamVjdCAqZnVuYzsKLQlQeU9iamVjdCAqbmV3YXJncywgKng7Ci0JUHlfc3NpemVfdCBpLCBuOworICAgIHN0YXRpYyBQeU9iamVjdCAqbmV3X3N0cjsKKyAgICBQeU9iamVjdCAqZnVuYzsKKyAgICBQeU9iamVjdCAqbmV3YXJncywgKng7CisgICAgUHlfc3NpemVfdCBpLCBuOwogCi0JaWYgKG5ld19zdHIgPT0gTlVMTCkgewotCQluZXdfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19uZXdfXyIpOwotCQlpZiAobmV3X3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZ1bmMgPSBQeU9iamVjdF9HZXRBdHRyKChQeU9iamVjdCAqKXR5cGUsIG5ld19zdHIpOwotCWlmIChmdW5jID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLQluID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQluZXdhcmdzID0gUHlUdXBsZV9OZXcobisxKTsKLQlpZiAobmV3YXJncyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYodHlwZSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCAwLCAoUHlPYmplY3QgKil0eXBlKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCXggPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlQeV9JTkNSRUYoeCk7Ci0JCVB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgaSsxLCB4KTsKLQl9Ci0JeCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgbmV3YXJncywga3dkcyk7Ci0JUHlfREVDUkVGKG5ld2FyZ3MpOwotCVB5X0RFQ1JFRihmdW5jKTsKLQlyZXR1cm4geDsKKyAgICBpZiAobmV3X3N0ciA9PSBOVUxMKSB7CisgICAgICAgIG5ld19zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25ld19fIik7CisgICAgICAgIGlmIChuZXdfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnVuYyA9IFB5T2JqZWN0X0dldEF0dHIoKFB5T2JqZWN0ICopdHlwZSwgbmV3X3N0cik7CisgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5VHVwbGVfQ2hlY2soYXJncykpOworICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIG5ld2FyZ3MgPSBQeVR1cGxlX05ldyhuKzEpOworICAgIGlmIChuZXdhcmdzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRih0eXBlKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2FyZ3MsIDAsIChQeU9iamVjdCAqKXR5cGUpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgeCA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCBpKzEsIHgpOworICAgIH0KKyAgICB4ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBuZXdhcmdzLCBrd2RzKTsKKyAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgUHlfREVDUkVGKGZ1bmMpOworICAgIHJldHVybiB4OwogfQogCiBzdGF0aWMgdm9pZAogc2xvdF90cF9kZWwoUHlPYmplY3QgKnNlbGYpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpkZWxfc3RyID0gTlVMTDsKLQlQeU9iamVjdCAqZGVsLCAqcmVzOwotCVB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CisgICAgc3RhdGljIFB5T2JqZWN0ICpkZWxfc3RyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGVsLCAqcmVzOworICAgIFB5T2JqZWN0ICplcnJvcl90eXBlLCAqZXJyb3JfdmFsdWUsICplcnJvcl90cmFjZWJhY2s7CiAKLQkvKiBUZW1wb3JhcmlseSByZXN1cnJlY3QgdGhlIG9iamVjdC4gKi8KLQlhc3NlcnQoc2VsZi0+b2JfcmVmY250ID09IDApOwotCXNlbGYtPm9iX3JlZmNudCA9IDE7CisgICAgLyogVGVtcG9yYXJpbHkgcmVzdXJyZWN0IHRoZSBvYmplY3QuICovCisgICAgYXNzZXJ0KHNlbGYtPm9iX3JlZmNudCA9PSAwKTsKKyAgICBzZWxmLT5vYl9yZWZjbnQgPSAxOwogCi0JLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KLQlQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKKyAgICAvKiBTYXZlIHRoZSBjdXJyZW50IGV4Y2VwdGlvbiwgaWYgYW55LiAqLworICAgIFB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOwogCi0JLyogRXhlY3V0ZSBfX2RlbF9fIG1ldGhvZCwgaWYgYW55LiAqLwotCWRlbCA9IGxvb2t1cF9tYXliZShzZWxmLCAiX19kZWxfXyIsICZkZWxfc3RyKTsKLQlpZiAoZGVsICE9IE5VTEwpIHsKLQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZGVsLCBOVUxMKTsKLQkJaWYgKHJlcyA9PSBOVUxMKQotCQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGRlbCk7Ci0JCWVsc2UKLQkJCVB5X0RFQ1JFRihyZXMpOwotCQlQeV9ERUNSRUYoZGVsKTsKLQl9CisgICAgLyogRXhlY3V0ZSBfX2RlbF9fIG1ldGhvZCwgaWYgYW55LiAqLworICAgIGRlbCA9IGxvb2t1cF9tYXliZShzZWxmLCAiX19kZWxfXyIsICZkZWxfc3RyKTsKKyAgICBpZiAoZGVsICE9IE5VTEwpIHsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoZGVsLCBOVUxMKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKGRlbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICBQeV9ERUNSRUYoZGVsKTsKKyAgICB9CiAKLQkvKiBSZXN0b3JlIHRoZSBzYXZlZCBleGNlcHRpb24uICovCi0JUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKKyAgICAvKiBSZXN0b3JlIHRoZSBzYXZlZCBleGNlcHRpb24uICovCisgICAgUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKIAotCS8qIFVuZG8gdGhlIHRlbXBvcmFyeSByZXN1cnJlY3Rpb247IGNhbid0IHVzZSBERUNSRUYgaGVyZSwgaXQgd291bGQKLQkgKiBjYXVzZSBhIHJlY3Vyc2l2ZSBjYWxsLgotCSAqLwotCWFzc2VydChzZWxmLT5vYl9yZWZjbnQgPiAwKTsKLQlpZiAoLS1zZWxmLT5vYl9yZWZjbnQgPT0gMCkKLQkJcmV0dXJuOwkvKiB0aGlzIGlzIHRoZSBub3JtYWwgcGF0aCBvdXQgKi8KKyAgICAvKiBVbmRvIHRoZSB0ZW1wb3JhcnkgcmVzdXJyZWN0aW9uOyBjYW4ndCB1c2UgREVDUkVGIGhlcmUsIGl0IHdvdWxkCisgICAgICogY2F1c2UgYSByZWN1cnNpdmUgY2FsbC4KKyAgICAgKi8KKyAgICBhc3NlcnQoc2VsZi0+b2JfcmVmY250ID4gMCk7CisgICAgaWYgKC0tc2VsZi0+b2JfcmVmY250ID09IDApCisgICAgICAgIHJldHVybjsgICAgICAgICAvKiB0aGlzIGlzIHRoZSBub3JtYWwgcGF0aCBvdXQgKi8KIAotCS8qIF9fZGVsX18gcmVzdXJyZWN0ZWQgaXQhICBNYWtlIGl0IGxvb2sgbGlrZSB0aGUgb3JpZ2luYWwgUHlfREVDUkVGCi0JICogbmV2ZXIgaGFwcGVuZWQuCi0JICovCi0JewotCQlQeV9zc2l6ZV90IHJlZmNudCA9IHNlbGYtPm9iX3JlZmNudDsKLQkJX1B5X05ld1JlZmVyZW5jZShzZWxmKTsKLQkJc2VsZi0+b2JfcmVmY250ID0gcmVmY250OwotCX0KLQlhc3NlcnQoIVB5VHlwZV9JU19HQyhQeV9UWVBFKHNlbGYpKSB8fAotCSAgICAgICBfUHlfQVNfR0Moc2VsZiktPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpOwotCS8qIElmIFB5X1JFRl9ERUJVRywgX1B5X05ld1JlZmVyZW5jZSBidW1wZWQgX1B5X1JlZlRvdGFsLCBzbwotCSAqIHdlIG5lZWQgdG8gdW5kbyB0aGF0LiAqLwotCV9QeV9ERUNfUkVGVE9UQUw7Ci0JLyogSWYgUHlfVFJBQ0VfUkVGUywgX1B5X05ld1JlZmVyZW5jZSByZS1hZGRlZCBzZWxmIHRvIHRoZSBvYmplY3QKLQkgKiBjaGFpbiwgc28gbm8gbW9yZSB0byBkbyB0aGVyZS4KLQkgKiBJZiBDT1VOVF9BTExPQ1MsIHRoZSBvcmlnaW5hbCBkZWNyZWYgYnVtcGVkIHRwX2ZyZWVzLCBhbmQKLQkgKiBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCB0cF9hbGxvY3M6ICBib3RoIG9mIHRob3NlIG5lZWQgdG8gYmUKLQkgKiB1bmRvbmUuCi0JICovCisgICAgLyogX19kZWxfXyByZXN1cnJlY3RlZCBpdCEgIE1ha2UgaXQgbG9vayBsaWtlIHRoZSBvcmlnaW5hbCBQeV9ERUNSRUYKKyAgICAgKiBuZXZlciBoYXBwZW5lZC4KKyAgICAgKi8KKyAgICB7CisgICAgICAgIFB5X3NzaXplX3QgcmVmY250ID0gc2VsZi0+b2JfcmVmY250OworICAgICAgICBfUHlfTmV3UmVmZXJlbmNlKHNlbGYpOworICAgICAgICBzZWxmLT5vYl9yZWZjbnQgPSByZWZjbnQ7CisgICAgfQorICAgIGFzc2VydCghUHlUeXBlX0lTX0dDKFB5X1RZUEUoc2VsZikpIHx8CisgICAgICAgICAgIF9QeV9BU19HQyhzZWxmKS0+Z2MuZ2NfcmVmcyAhPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCk7CisgICAgLyogSWYgUHlfUkVGX0RFQlVHLCBfUHlfTmV3UmVmZXJlbmNlIGJ1bXBlZCBfUHlfUmVmVG90YWwsIHNvCisgICAgICogd2UgbmVlZCB0byB1bmRvIHRoYXQuICovCisgICAgX1B5X0RFQ19SRUZUT1RBTDsKKyAgICAvKiBJZiBQeV9UUkFDRV9SRUZTLCBfUHlfTmV3UmVmZXJlbmNlIHJlLWFkZGVkIHNlbGYgdG8gdGhlIG9iamVjdAorICAgICAqIGNoYWluLCBzbyBubyBtb3JlIHRvIGRvIHRoZXJlLgorICAgICAqIElmIENPVU5UX0FMTE9DUywgdGhlIG9yaWdpbmFsIGRlY3JlZiBidW1wZWQgdHBfZnJlZXMsIGFuZAorICAgICAqIF9QeV9OZXdSZWZlcmVuY2UgYnVtcGVkIHRwX2FsbG9jczogIGJvdGggb2YgdGhvc2UgbmVlZCB0byBiZQorICAgICAqIHVuZG9uZS4KKyAgICAgKi8KICNpZmRlZiBDT1VOVF9BTExPQ1MKLQktLVB5X1RZUEUoc2VsZiktPnRwX2ZyZWVzOwotCS0tUHlfVFlQRShzZWxmKS0+dHBfYWxsb2NzOworICAgIC0tUHlfVFlQRShzZWxmKS0+dHBfZnJlZXM7CisgICAgLS1QeV9UWVBFKHNlbGYpLT50cF9hbGxvY3M7CiAjZW5kaWYKIH0KIApAQCAtNTc2NCwyNjcgKzU3NjQsMjY3IEBACiAjdW5kZWYgUkJJTlNMT1QKIAogI2RlZmluZSBUUFNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCXtOQU1FLCBvZmZzZXRvZihQeVR5cGVPYmplY3QsIFNMT1QpLCAodm9pZCAqKShGVU5DVElPTiksIFdSQVBQRVIsIFwKLQkgUHlEb2NfU1RSKERPQyl9CisgICAge05BTUUsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgU0xPVCksICh2b2lkICopKEZVTkNUSU9OKSwgV1JBUFBFUiwgXAorICAgICBQeURvY19TVFIoRE9DKX0KICNkZWZpbmUgRkxTTE9UKE5BTUUsIFNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MsIEZMQUdTKSBcCi0Je05BTUUsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgU0xPVCksICh2b2lkICopKEZVTkNUSU9OKSwgV1JBUFBFUiwgXAotCSBQeURvY19TVFIoRE9DKSwgRkxBR1N9CisgICAge05BTUUsIG9mZnNldG9mKFB5VHlwZU9iamVjdCwgU0xPVCksICh2b2lkICopKEZVTkNUSU9OKSwgV1JBUFBFUiwgXAorICAgICBQeURvY19TVFIoRE9DKSwgRkxBR1N9CiAjZGVmaW5lIEVUU0xPVChOQU1FLCBTTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKSBcCi0Je05BTUUsIG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIFNMT1QpLCAodm9pZCAqKShGVU5DVElPTiksIFdSQVBQRVIsIFwKLQkgUHlEb2NfU1RSKERPQyl9CisgICAge05BTUUsIG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIFNMT1QpLCAodm9pZCAqKShGVU5DVElPTiksIFdSQVBQRVIsIFwKKyAgICAgUHlEb2NfU1RSKERPQyl9CiAjZGVmaW5lIFNRU0xPVChOQU1FLCBTTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKSBcCi0JRVRTTE9UKE5BTUUsIGFzX3NlcXVlbmNlLlNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpCisgICAgRVRTTE9UKE5BTUUsIGFzX3NlcXVlbmNlLlNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpCiAjZGVmaW5lIE1QU0xPVChOQU1FLCBTTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKSBcCi0JRVRTTE9UKE5BTUUsIGFzX21hcHBpbmcuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykKKyAgICBFVFNMT1QoTkFNRSwgYXNfbWFwcGluZy5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKQogI2RlZmluZSBOQlNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIFdSQVBQRVIsIERPQykKKyAgICBFVFNMT1QoTkFNRSwgYXNfbnVtYmVyLlNMT1QsIEZVTkNUSU9OLCBXUkFQUEVSLCBET0MpCiAjZGVmaW5lIFVOU0xPVChOQU1FLCBTTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKSBcCi0JRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgXAotCSAgICAgICAieC4iIE5BTUUgIigpIDw9PT4gIiBET0MpCisgICAgRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgXAorICAgICAgICAgICAieC4iIE5BTUUgIigpIDw9PT4gIiBET0MpCiAjZGVmaW5lIElCU0xPVChOQU1FLCBTTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgRE9DKSBcCi0JRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgXAotCSAgICAgICAieC4iIE5BTUUgIih5KSA8PT0+IHgiIERPQyAieSIpCisgICAgRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgV1JBUFBFUiwgXAorICAgICAgICAgICAieC4iIE5BTUUgIih5KSA8PT0+IHgiIERPQyAieSIpCiAjZGVmaW5lIEJJTlNMT1QoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIHdyYXBfYmluYXJ5ZnVuY19sLCBcCi0JICAgICAgICJ4LiIgTkFNRSAiKHkpIDw9PT4geCIgRE9DICJ5IikKKyAgICBFVFNMT1QoTkFNRSwgYXNfbnVtYmVyLlNMT1QsIEZVTkNUSU9OLCB3cmFwX2JpbmFyeWZ1bmNfbCwgXAorICAgICAgICAgICAieC4iIE5BTUUgIih5KSA8PT0+IHgiIERPQyAieSIpCiAjZGVmaW5lIFJCSU5TTE9UKE5BTUUsIFNMT1QsIEZVTkNUSU9OLCBET0MpIFwKLQlFVFNMT1QoTkFNRSwgYXNfbnVtYmVyLlNMT1QsIEZVTkNUSU9OLCB3cmFwX2JpbmFyeWZ1bmNfciwgXAotCSAgICAgICAieC4iIE5BTUUgIih5KSA8PT0+IHkiIERPQyAieCIpCisgICAgRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgd3JhcF9iaW5hcnlmdW5jX3IsIFwKKyAgICAgICAgICAgInguIiBOQU1FICIoeSkgPD09PiB5IiBET0MgIngiKQogI2RlZmluZSBCSU5TTE9UTk9USU5GSVgoTkFNRSwgU0xPVCwgRlVOQ1RJT04sIERPQykgXAotCUVUU0xPVChOQU1FLCBhc19udW1iZXIuU0xPVCwgRlVOQ1RJT04sIHdyYXBfYmluYXJ5ZnVuY19sLCBcCi0JICAgICAgICJ4LiIgTkFNRSAiKHkpIDw9PT4gIiBET0MpCisgICAgRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgd3JhcF9iaW5hcnlmdW5jX2wsIFwKKyAgICAgICAgICAgInguIiBOQU1FICIoeSkgPD09PiAiIERPQykKICNkZWZpbmUgUkJJTlNMT1ROT1RJTkZJWChOQU1FLCBTTE9ULCBGVU5DVElPTiwgRE9DKSBcCi0JRVRTTE9UKE5BTUUsIGFzX251bWJlci5TTE9ULCBGVU5DVElPTiwgd3JhcF9iaW5hcnlmdW5jX3IsIFwKLQkgICAgICAgInguIiBOQU1FICIoeSkgPD09PiAiIERPQykKKyAgICBFVFNMT1QoTkFNRSwgYXNfbnVtYmVyLlNMT1QsIEZVTkNUSU9OLCB3cmFwX2JpbmFyeWZ1bmNfciwgXAorICAgICAgICAgICAieC4iIE5BTUUgIih5KSA8PT0+ICIgRE9DKQogCiBzdGF0aWMgc2xvdGRlZiBzbG90ZGVmc1tdID0gewotCVNRU0xPVCgiX19sZW5fXyIsIHNxX2xlbmd0aCwgc2xvdF9zcV9sZW5ndGgsIHdyYXBfbGVuZnVuYywKLQkgICAgICAgInguX19sZW5fXygpIDw9PT4gbGVuKHgpIiksCi0JLyogSGVhcCB0eXBlcyBkZWZpbmluZyBfX2FkZF9fL19fbXVsX18gaGF2ZSBzcV9jb25jYXQvc3FfcmVwZWF0ID09IE5VTEwuCi0JICAgVGhlIGxvZ2ljIGluIGFic3RyYWN0LmMgYWx3YXlzIGZhbGxzIGJhY2sgdG8gbmJfYWRkL25iX211bHRpcGx5IGluCi0JICAgdGhpcyBjYXNlLiAgRGVmaW5pbmcgYm90aCB0aGUgbmJfKiBhbmQgdGhlIHNxXyogc2xvdHMgdG8gY2FsbCB0aGUKLQkgICB1c2VyLWRlZmluZWQgbWV0aG9kcyBoYXMgdW5leHBlY3RlZCBzaWRlLWVmZmVjdHMsIGFzIHNob3duIGJ5Ci0JICAgdGVzdF9kZXNjci5ub3RpbXBsZW1lbnRlZCgpICovCi0JU1FTTE9UKCJfX2FkZF9fIiwgc3FfY29uY2F0LCBOVUxMLCB3cmFwX2JpbmFyeWZ1bmMsCi0JICAieC5fX2FkZF9fKHkpIDw9PT4geCt5IiksCi0JU1FTTE9UKCJfX211bF9fIiwgc3FfcmVwZWF0LCBOVUxMLCB3cmFwX2luZGV4YXJnZnVuYywKLQkgICJ4Ll9fbXVsX18obikgPD09PiB4Km4iKSwKLQlTUVNMT1QoIl9fcm11bF9fIiwgc3FfcmVwZWF0LCBOVUxMLCB3cmFwX2luZGV4YXJnZnVuYywKLQkgICJ4Ll9fcm11bF9fKG4pIDw9PT4gbip4IiksCi0JU1FTTE9UKCJfX2dldGl0ZW1fXyIsIHNxX2l0ZW0sIHNsb3Rfc3FfaXRlbSwgd3JhcF9zcV9pdGVtLAotCSAgICAgICAieC5fX2dldGl0ZW1fXyh5KSA8PT0+IHhbeV0iKSwKLQlTUVNMT1QoIl9fZ2V0c2xpY2VfXyIsIHNxX3NsaWNlLCBzbG90X3NxX3NsaWNlLCB3cmFwX3NzaXplc3NpemVhcmdmdW5jLAotCSAgICAgICAieC5fX2dldHNsaWNlX18oaSwgaikgPD09PiB4W2k6al1cblwKLQkgICAgICAgXG5cCi0JICAgICAgIFVzZSBvZiBuZWdhdGl2ZSBpbmRpY2VzIGlzIG5vdCBzdXBwb3J0ZWQuIiksCi0JU1FTTE9UKCJfX3NldGl0ZW1fXyIsIHNxX2Fzc19pdGVtLCBzbG90X3NxX2Fzc19pdGVtLCB3cmFwX3NxX3NldGl0ZW0sCi0JICAgICAgICJ4Ll9fc2V0aXRlbV9fKGksIHkpIDw9PT4geFtpXT15IiksCi0JU1FTTE9UKCJfX2RlbGl0ZW1fXyIsIHNxX2Fzc19pdGVtLCBzbG90X3NxX2Fzc19pdGVtLCB3cmFwX3NxX2RlbGl0ZW0sCi0JICAgICAgICJ4Ll9fZGVsaXRlbV9fKHkpIDw9PT4gZGVsIHhbeV0iKSwKLQlTUVNMT1QoIl9fc2V0c2xpY2VfXyIsIHNxX2Fzc19zbGljZSwgc2xvdF9zcV9hc3Nfc2xpY2UsCi0JICAgICAgIHdyYXBfc3NpemVzc2l6ZW9iamFyZ3Byb2MsCi0JICAgICAgICJ4Ll9fc2V0c2xpY2VfXyhpLCBqLCB5KSA8PT0+IHhbaTpqXT15XG5cCi0JICAgICAgIFxuXAotCSAgICAgICBVc2UgIG9mIG5lZ2F0aXZlIGluZGljZXMgaXMgbm90IHN1cHBvcnRlZC4iKSwKLQlTUVNMT1QoIl9fZGVsc2xpY2VfXyIsIHNxX2Fzc19zbGljZSwgc2xvdF9zcV9hc3Nfc2xpY2UsIHdyYXBfZGVsc2xpY2UsCi0JICAgICAgICJ4Ll9fZGVsc2xpY2VfXyhpLCBqKSA8PT0+IGRlbCB4W2k6al1cblwKLQkgICAgICAgXG5cCi0JICAgICAgIFVzZSBvZiBuZWdhdGl2ZSBpbmRpY2VzIGlzIG5vdCBzdXBwb3J0ZWQuIiksCi0JU1FTTE9UKCJfX2NvbnRhaW5zX18iLCBzcV9jb250YWlucywgc2xvdF9zcV9jb250YWlucywgd3JhcF9vYmpvYmpwcm9jLAotCSAgICAgICAieC5fX2NvbnRhaW5zX18oeSkgPD09PiB5IGluIHgiKSwKLQlTUVNMT1QoIl9faWFkZF9fIiwgc3FfaW5wbGFjZV9jb25jYXQsIE5VTEwsCi0JICB3cmFwX2JpbmFyeWZ1bmMsICJ4Ll9faWFkZF9fKHkpIDw9PT4geCs9eSIpLAotCVNRU0xPVCgiX19pbXVsX18iLCBzcV9pbnBsYWNlX3JlcGVhdCwgTlVMTCwKLQkgIHdyYXBfaW5kZXhhcmdmdW5jLCAieC5fX2ltdWxfXyh5KSA8PT0+IHgqPXkiKSwKKyAgICBTUVNMT1QoIl9fbGVuX18iLCBzcV9sZW5ndGgsIHNsb3Rfc3FfbGVuZ3RoLCB3cmFwX2xlbmZ1bmMsCisgICAgICAgICAgICJ4Ll9fbGVuX18oKSA8PT0+IGxlbih4KSIpLAorICAgIC8qIEhlYXAgdHlwZXMgZGVmaW5pbmcgX19hZGRfXy9fX211bF9fIGhhdmUgc3FfY29uY2F0L3NxX3JlcGVhdCA9PSBOVUxMLgorICAgICAgIFRoZSBsb2dpYyBpbiBhYnN0cmFjdC5jIGFsd2F5cyBmYWxscyBiYWNrIHRvIG5iX2FkZC9uYl9tdWx0aXBseSBpbgorICAgICAgIHRoaXMgY2FzZS4gIERlZmluaW5nIGJvdGggdGhlIG5iXyogYW5kIHRoZSBzcV8qIHNsb3RzIHRvIGNhbGwgdGhlCisgICAgICAgdXNlci1kZWZpbmVkIG1ldGhvZHMgaGFzIHVuZXhwZWN0ZWQgc2lkZS1lZmZlY3RzLCBhcyBzaG93biBieQorICAgICAgIHRlc3RfZGVzY3Iubm90aW1wbGVtZW50ZWQoKSAqLworICAgIFNRU0xPVCgiX19hZGRfXyIsIHNxX2NvbmNhdCwgTlVMTCwgd3JhcF9iaW5hcnlmdW5jLAorICAgICAgInguX19hZGRfXyh5KSA8PT0+IHgreSIpLAorICAgIFNRU0xPVCgiX19tdWxfXyIsIHNxX3JlcGVhdCwgTlVMTCwgd3JhcF9pbmRleGFyZ2Z1bmMsCisgICAgICAieC5fX211bF9fKG4pIDw9PT4geCpuIiksCisgICAgU1FTTE9UKCJfX3JtdWxfXyIsIHNxX3JlcGVhdCwgTlVMTCwgd3JhcF9pbmRleGFyZ2Z1bmMsCisgICAgICAieC5fX3JtdWxfXyhuKSA8PT0+IG4qeCIpLAorICAgIFNRU0xPVCgiX19nZXRpdGVtX18iLCBzcV9pdGVtLCBzbG90X3NxX2l0ZW0sIHdyYXBfc3FfaXRlbSwKKyAgICAgICAgICAgInguX19nZXRpdGVtX18oeSkgPD09PiB4W3ldIiksCisgICAgU1FTTE9UKCJfX2dldHNsaWNlX18iLCBzcV9zbGljZSwgc2xvdF9zcV9zbGljZSwgd3JhcF9zc2l6ZXNzaXplYXJnZnVuYywKKyAgICAgICAgICAgInguX19nZXRzbGljZV9fKGksIGopIDw9PT4geFtpOmpdXG5cCisgICAgICAgICAgIFxuXAorICAgICAgICAgICBVc2Ugb2YgbmVnYXRpdmUgaW5kaWNlcyBpcyBub3Qgc3VwcG9ydGVkLiIpLAorICAgIFNRU0xPVCgiX19zZXRpdGVtX18iLCBzcV9hc3NfaXRlbSwgc2xvdF9zcV9hc3NfaXRlbSwgd3JhcF9zcV9zZXRpdGVtLAorICAgICAgICAgICAieC5fX3NldGl0ZW1fXyhpLCB5KSA8PT0+IHhbaV09eSIpLAorICAgIFNRU0xPVCgiX19kZWxpdGVtX18iLCBzcV9hc3NfaXRlbSwgc2xvdF9zcV9hc3NfaXRlbSwgd3JhcF9zcV9kZWxpdGVtLAorICAgICAgICAgICAieC5fX2RlbGl0ZW1fXyh5KSA8PT0+IGRlbCB4W3ldIiksCisgICAgU1FTTE9UKCJfX3NldHNsaWNlX18iLCBzcV9hc3Nfc2xpY2UsIHNsb3Rfc3FfYXNzX3NsaWNlLAorICAgICAgICAgICB3cmFwX3NzaXplc3NpemVvYmphcmdwcm9jLAorICAgICAgICAgICAieC5fX3NldHNsaWNlX18oaSwgaiwgeSkgPD09PiB4W2k6al09eVxuXAorICAgICAgICAgICBcblwKKyAgICAgICAgICAgVXNlICBvZiBuZWdhdGl2ZSBpbmRpY2VzIGlzIG5vdCBzdXBwb3J0ZWQuIiksCisgICAgU1FTTE9UKCJfX2RlbHNsaWNlX18iLCBzcV9hc3Nfc2xpY2UsIHNsb3Rfc3FfYXNzX3NsaWNlLCB3cmFwX2RlbHNsaWNlLAorICAgICAgICAgICAieC5fX2RlbHNsaWNlX18oaSwgaikgPD09PiBkZWwgeFtpOmpdXG5cCisgICAgICAgICAgIFxuXAorICAgICAgICAgICBVc2Ugb2YgbmVnYXRpdmUgaW5kaWNlcyBpcyBub3Qgc3VwcG9ydGVkLiIpLAorICAgIFNRU0xPVCgiX19jb250YWluc19fIiwgc3FfY29udGFpbnMsIHNsb3Rfc3FfY29udGFpbnMsIHdyYXBfb2Jqb2JqcHJvYywKKyAgICAgICAgICAgInguX19jb250YWluc19fKHkpIDw9PT4geSBpbiB4IiksCisgICAgU1FTTE9UKCJfX2lhZGRfXyIsIHNxX2lucGxhY2VfY29uY2F0LCBOVUxMLAorICAgICAgd3JhcF9iaW5hcnlmdW5jLCAieC5fX2lhZGRfXyh5KSA8PT0+IHgrPXkiKSwKKyAgICBTUVNMT1QoIl9faW11bF9fIiwgc3FfaW5wbGFjZV9yZXBlYXQsIE5VTEwsCisgICAgICB3cmFwX2luZGV4YXJnZnVuYywgInguX19pbXVsX18oeSkgPD09PiB4Kj15IiksCiAKLQlNUFNMT1QoIl9fbGVuX18iLCBtcF9sZW5ndGgsIHNsb3RfbXBfbGVuZ3RoLCB3cmFwX2xlbmZ1bmMsCi0JICAgICAgICJ4Ll9fbGVuX18oKSA8PT0+IGxlbih4KSIpLAotCU1QU0xPVCgiX19nZXRpdGVtX18iLCBtcF9zdWJzY3JpcHQsIHNsb3RfbXBfc3Vic2NyaXB0LAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsCi0JICAgICAgICJ4Ll9fZ2V0aXRlbV9fKHkpIDw9PT4geFt5XSIpLAotCU1QU0xPVCgiX19zZXRpdGVtX18iLCBtcF9hc3Nfc3Vic2NyaXB0LCBzbG90X21wX2Fzc19zdWJzY3JpcHQsCi0JICAgICAgIHdyYXBfb2Jqb2JqYXJncHJvYywKLQkgICAgICAgInguX19zZXRpdGVtX18oaSwgeSkgPD09PiB4W2ldPXkiKSwKLQlNUFNMT1QoIl9fZGVsaXRlbV9fIiwgbXBfYXNzX3N1YnNjcmlwdCwgc2xvdF9tcF9hc3Nfc3Vic2NyaXB0LAotCSAgICAgICB3cmFwX2RlbGl0ZW0sCi0JICAgICAgICJ4Ll9fZGVsaXRlbV9fKHkpIDw9PT4gZGVsIHhbeV0iKSwKKyAgICBNUFNMT1QoIl9fbGVuX18iLCBtcF9sZW5ndGgsIHNsb3RfbXBfbGVuZ3RoLCB3cmFwX2xlbmZ1bmMsCisgICAgICAgICAgICJ4Ll9fbGVuX18oKSA8PT0+IGxlbih4KSIpLAorICAgIE1QU0xPVCgiX19nZXRpdGVtX18iLCBtcF9zdWJzY3JpcHQsIHNsb3RfbXBfc3Vic2NyaXB0LAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsCisgICAgICAgICAgICJ4Ll9fZ2V0aXRlbV9fKHkpIDw9PT4geFt5XSIpLAorICAgIE1QU0xPVCgiX19zZXRpdGVtX18iLCBtcF9hc3Nfc3Vic2NyaXB0LCBzbG90X21wX2Fzc19zdWJzY3JpcHQsCisgICAgICAgICAgIHdyYXBfb2Jqb2JqYXJncHJvYywKKyAgICAgICAgICAgInguX19zZXRpdGVtX18oaSwgeSkgPD09PiB4W2ldPXkiKSwKKyAgICBNUFNMT1QoIl9fZGVsaXRlbV9fIiwgbXBfYXNzX3N1YnNjcmlwdCwgc2xvdF9tcF9hc3Nfc3Vic2NyaXB0LAorICAgICAgICAgICB3cmFwX2RlbGl0ZW0sCisgICAgICAgICAgICJ4Ll9fZGVsaXRlbV9fKHkpIDw9PT4gZGVsIHhbeV0iKSwKIAotCUJJTlNMT1QoIl9fYWRkX18iLCBuYl9hZGQsIHNsb3RfbmJfYWRkLAotCQkiKyIpLAotCVJCSU5TTE9UKCJfX3JhZGRfXyIsIG5iX2FkZCwgc2xvdF9uYl9hZGQsCi0JCSAiKyIpLAotCUJJTlNMT1QoIl9fc3ViX18iLCBuYl9zdWJ0cmFjdCwgc2xvdF9uYl9zdWJ0cmFjdCwKLQkJIi0iKSwKLQlSQklOU0xPVCgiX19yc3ViX18iLCBuYl9zdWJ0cmFjdCwgc2xvdF9uYl9zdWJ0cmFjdCwKLQkJICItIiksCi0JQklOU0xPVCgiX19tdWxfXyIsIG5iX211bHRpcGx5LCBzbG90X25iX211bHRpcGx5LAotCQkiKiIpLAotCVJCSU5TTE9UKCJfX3JtdWxfXyIsIG5iX211bHRpcGx5LCBzbG90X25iX211bHRpcGx5LAotCQkgIioiKSwKLQlCSU5TTE9UKCJfX2Rpdl9fIiwgbmJfZGl2aWRlLCBzbG90X25iX2RpdmlkZSwKLQkJIi8iKSwKLQlSQklOU0xPVCgiX19yZGl2X18iLCBuYl9kaXZpZGUsIHNsb3RfbmJfZGl2aWRlLAotCQkgIi8iKSwKLQlCSU5TTE9UKCJfX21vZF9fIiwgbmJfcmVtYWluZGVyLCBzbG90X25iX3JlbWFpbmRlciwKLQkJIiUiKSwKLQlSQklOU0xPVCgiX19ybW9kX18iLCBuYl9yZW1haW5kZXIsIHNsb3RfbmJfcmVtYWluZGVyLAotCQkgIiUiKSwKLQlCSU5TTE9UTk9USU5GSVgoIl9fZGl2bW9kX18iLCBuYl9kaXZtb2QsIHNsb3RfbmJfZGl2bW9kLAotCQkiZGl2bW9kKHgsIHkpIiksCi0JUkJJTlNMT1ROT1RJTkZJWCgiX19yZGl2bW9kX18iLCBuYl9kaXZtb2QsIHNsb3RfbmJfZGl2bW9kLAotCQkgImRpdm1vZCh5LCB4KSIpLAotCU5CU0xPVCgiX19wb3dfXyIsIG5iX3Bvd2VyLCBzbG90X25iX3Bvd2VyLCB3cmFwX3Rlcm5hcnlmdW5jLAotCSAgICAgICAieC5fX3Bvd19fKHlbLCB6XSkgPD09PiBwb3coeCwgeVssIHpdKSIpLAotCU5CU0xPVCgiX19ycG93X18iLCBuYl9wb3dlciwgc2xvdF9uYl9wb3dlciwgd3JhcF90ZXJuYXJ5ZnVuY19yLAotCSAgICAgICAieS5fX3Jwb3dfXyh4Wywgel0pIDw9PT4gcG93KHgsIHlbLCB6XSkiKSwKLQlVTlNMT1QoIl9fbmVnX18iLCBuYl9uZWdhdGl2ZSwgc2xvdF9uYl9uZWdhdGl2ZSwgd3JhcF91bmFyeWZ1bmMsICIteCIpLAotCVVOU0xPVCgiX19wb3NfXyIsIG5iX3Bvc2l0aXZlLCBzbG90X25iX3Bvc2l0aXZlLCB3cmFwX3VuYXJ5ZnVuYywgIit4IiksCi0JVU5TTE9UKCJfX2Fic19fIiwgbmJfYWJzb2x1dGUsIHNsb3RfbmJfYWJzb2x1dGUsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAiYWJzKHgpIiksCi0JVU5TTE9UKCJfX25vbnplcm9fXyIsIG5iX25vbnplcm8sIHNsb3RfbmJfbm9uemVybywgd3JhcF9pbnF1aXJ5cHJlZCwKLQkgICAgICAgInggIT0gMCIpLAotCVVOU0xPVCgiX19pbnZlcnRfXyIsIG5iX2ludmVydCwgc2xvdF9uYl9pbnZlcnQsIHdyYXBfdW5hcnlmdW5jLCAifngiKSwKLQlCSU5TTE9UKCJfX2xzaGlmdF9fIiwgbmJfbHNoaWZ0LCBzbG90X25iX2xzaGlmdCwgIjw8IiksCi0JUkJJTlNMT1QoIl9fcmxzaGlmdF9fIiwgbmJfbHNoaWZ0LCBzbG90X25iX2xzaGlmdCwgIjw8IiksCi0JQklOU0xPVCgiX19yc2hpZnRfXyIsIG5iX3JzaGlmdCwgc2xvdF9uYl9yc2hpZnQsICI+PiIpLAotCVJCSU5TTE9UKCJfX3Jyc2hpZnRfXyIsIG5iX3JzaGlmdCwgc2xvdF9uYl9yc2hpZnQsICI+PiIpLAotCUJJTlNMT1QoIl9fYW5kX18iLCBuYl9hbmQsIHNsb3RfbmJfYW5kLCAiJiIpLAotCVJCSU5TTE9UKCJfX3JhbmRfXyIsIG5iX2FuZCwgc2xvdF9uYl9hbmQsICImIiksCi0JQklOU0xPVCgiX194b3JfXyIsIG5iX3hvciwgc2xvdF9uYl94b3IsICJeIiksCi0JUkJJTlNMT1QoIl9fcnhvcl9fIiwgbmJfeG9yLCBzbG90X25iX3hvciwgIl4iKSwKLQlCSU5TTE9UKCJfX29yX18iLCBuYl9vciwgc2xvdF9uYl9vciwgInwiKSwKLQlSQklOU0xPVCgiX19yb3JfXyIsIG5iX29yLCBzbG90X25iX29yLCAifCIpLAotCU5CU0xPVCgiX19jb2VyY2VfXyIsIG5iX2NvZXJjZSwgc2xvdF9uYl9jb2VyY2UsIHdyYXBfY29lcmNlZnVuYywKLQkgICAgICAgInguX19jb2VyY2VfXyh5KSA8PT0+IGNvZXJjZSh4LCB5KSIpLAotCVVOU0xPVCgiX19pbnRfXyIsIG5iX2ludCwgc2xvdF9uYl9pbnQsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAiaW50KHgpIiksCi0JVU5TTE9UKCJfX2xvbmdfXyIsIG5iX2xvbmcsIHNsb3RfbmJfbG9uZywgd3JhcF91bmFyeWZ1bmMsCi0JICAgICAgICJsb25nKHgpIiksCi0JVU5TTE9UKCJfX2Zsb2F0X18iLCBuYl9mbG9hdCwgc2xvdF9uYl9mbG9hdCwgd3JhcF91bmFyeWZ1bmMsCi0JICAgICAgICJmbG9hdCh4KSIpLAotCVVOU0xPVCgiX19vY3RfXyIsIG5iX29jdCwgc2xvdF9uYl9vY3QsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAib2N0KHgpIiksCi0JVU5TTE9UKCJfX2hleF9fIiwgbmJfaGV4LCBzbG90X25iX2hleCwgd3JhcF91bmFyeWZ1bmMsCi0JICAgICAgICJoZXgoeCkiKSwKLQlOQlNMT1QoIl9faW5kZXhfXyIsIG5iX2luZGV4LCBzbG90X25iX2luZGV4LCB3cmFwX3VuYXJ5ZnVuYywgCi0JICAgICAgICJ4W3k6el0gPD09PiB4W3kuX19pbmRleF9fKCk6ei5fX2luZGV4X18oKV0iKSwKLQlJQlNMT1QoIl9faWFkZF9fIiwgbmJfaW5wbGFjZV9hZGQsIHNsb3RfbmJfaW5wbGFjZV9hZGQsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIisiKSwKLQlJQlNMT1QoIl9faXN1Yl9fIiwgbmJfaW5wbGFjZV9zdWJ0cmFjdCwgc2xvdF9uYl9pbnBsYWNlX3N1YnRyYWN0LAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICItIiksCi0JSUJTTE9UKCJfX2ltdWxfXyIsIG5iX2lucGxhY2VfbXVsdGlwbHksIHNsb3RfbmJfaW5wbGFjZV9tdWx0aXBseSwKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiKiIpLAotCUlCU0xPVCgiX19pZGl2X18iLCBuYl9pbnBsYWNlX2RpdmlkZSwgc2xvdF9uYl9pbnBsYWNlX2RpdmlkZSwKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiLyIpLAotCUlCU0xPVCgiX19pbW9kX18iLCBuYl9pbnBsYWNlX3JlbWFpbmRlciwgc2xvdF9uYl9pbnBsYWNlX3JlbWFpbmRlciwKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiJSIpLAotCUlCU0xPVCgiX19pcG93X18iLCBuYl9pbnBsYWNlX3Bvd2VyLCBzbG90X25iX2lucGxhY2VfcG93ZXIsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIioqIiksCi0JSUJTTE9UKCJfX2lsc2hpZnRfXyIsIG5iX2lucGxhY2VfbHNoaWZ0LCBzbG90X25iX2lucGxhY2VfbHNoaWZ0LAotCSAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICI8PCIpLAotCUlCU0xPVCgiX19pcnNoaWZ0X18iLCBuYl9pbnBsYWNlX3JzaGlmdCwgc2xvdF9uYl9pbnBsYWNlX3JzaGlmdCwKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiPj4iKSwKLQlJQlNMT1QoIl9faWFuZF9fIiwgbmJfaW5wbGFjZV9hbmQsIHNsb3RfbmJfaW5wbGFjZV9hbmQsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIiYiKSwKLQlJQlNMT1QoIl9faXhvcl9fIiwgbmJfaW5wbGFjZV94b3IsIHNsb3RfbmJfaW5wbGFjZV94b3IsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIl4iKSwKLQlJQlNMT1QoIl9faW9yX18iLCBuYl9pbnBsYWNlX29yLCBzbG90X25iX2lucGxhY2Vfb3IsCi0JICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgInwiKSwKLQlCSU5TTE9UKCJfX2Zsb29yZGl2X18iLCBuYl9mbG9vcl9kaXZpZGUsIHNsb3RfbmJfZmxvb3JfZGl2aWRlLCAiLy8iKSwKLQlSQklOU0xPVCgiX19yZmxvb3JkaXZfXyIsIG5iX2Zsb29yX2RpdmlkZSwgc2xvdF9uYl9mbG9vcl9kaXZpZGUsICIvLyIpLAotCUJJTlNMT1QoIl9fdHJ1ZWRpdl9fIiwgbmJfdHJ1ZV9kaXZpZGUsIHNsb3RfbmJfdHJ1ZV9kaXZpZGUsICIvIiksCi0JUkJJTlNMT1QoIl9fcnRydWVkaXZfXyIsIG5iX3RydWVfZGl2aWRlLCBzbG90X25iX3RydWVfZGl2aWRlLCAiLyIpLAotCUlCU0xPVCgiX19pZmxvb3JkaXZfXyIsIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlLAotCSAgICAgICBzbG90X25iX2lucGxhY2VfZmxvb3JfZGl2aWRlLCB3cmFwX2JpbmFyeWZ1bmMsICIvLyIpLAotCUlCU0xPVCgiX19pdHJ1ZWRpdl9fIiwgbmJfaW5wbGFjZV90cnVlX2RpdmlkZSwKLQkgICAgICAgc2xvdF9uYl9pbnBsYWNlX3RydWVfZGl2aWRlLCB3cmFwX2JpbmFyeWZ1bmMsICIvIiksCisgICAgQklOU0xPVCgiX19hZGRfXyIsIG5iX2FkZCwgc2xvdF9uYl9hZGQsCisgICAgICAgICIrIiksCisgICAgUkJJTlNMT1QoIl9fcmFkZF9fIiwgbmJfYWRkLCBzbG90X25iX2FkZCwKKyAgICAgICAgICAgICAiKyIpLAorICAgIEJJTlNMT1QoIl9fc3ViX18iLCBuYl9zdWJ0cmFjdCwgc2xvdF9uYl9zdWJ0cmFjdCwKKyAgICAgICAgIi0iKSwKKyAgICBSQklOU0xPVCgiX19yc3ViX18iLCBuYl9zdWJ0cmFjdCwgc2xvdF9uYl9zdWJ0cmFjdCwKKyAgICAgICAgICAgICAiLSIpLAorICAgIEJJTlNMT1QoIl9fbXVsX18iLCBuYl9tdWx0aXBseSwgc2xvdF9uYl9tdWx0aXBseSwKKyAgICAgICAgIioiKSwKKyAgICBSQklOU0xPVCgiX19ybXVsX18iLCBuYl9tdWx0aXBseSwgc2xvdF9uYl9tdWx0aXBseSwKKyAgICAgICAgICAgICAiKiIpLAorICAgIEJJTlNMT1QoIl9fZGl2X18iLCBuYl9kaXZpZGUsIHNsb3RfbmJfZGl2aWRlLAorICAgICAgICAiLyIpLAorICAgIFJCSU5TTE9UKCJfX3JkaXZfXyIsIG5iX2RpdmlkZSwgc2xvdF9uYl9kaXZpZGUsCisgICAgICAgICAgICAgIi8iKSwKKyAgICBCSU5TTE9UKCJfX21vZF9fIiwgbmJfcmVtYWluZGVyLCBzbG90X25iX3JlbWFpbmRlciwKKyAgICAgICAgIiUiKSwKKyAgICBSQklOU0xPVCgiX19ybW9kX18iLCBuYl9yZW1haW5kZXIsIHNsb3RfbmJfcmVtYWluZGVyLAorICAgICAgICAgICAgICIlIiksCisgICAgQklOU0xPVE5PVElORklYKCJfX2Rpdm1vZF9fIiwgbmJfZGl2bW9kLCBzbG90X25iX2Rpdm1vZCwKKyAgICAgICAgImRpdm1vZCh4LCB5KSIpLAorICAgIFJCSU5TTE9UTk9USU5GSVgoIl9fcmRpdm1vZF9fIiwgbmJfZGl2bW9kLCBzbG90X25iX2Rpdm1vZCwKKyAgICAgICAgICAgICAiZGl2bW9kKHksIHgpIiksCisgICAgTkJTTE9UKCJfX3Bvd19fIiwgbmJfcG93ZXIsIHNsb3RfbmJfcG93ZXIsIHdyYXBfdGVybmFyeWZ1bmMsCisgICAgICAgICAgICJ4Ll9fcG93X18oeVssIHpdKSA8PT0+IHBvdyh4LCB5Wywgel0pIiksCisgICAgTkJTTE9UKCJfX3Jwb3dfXyIsIG5iX3Bvd2VyLCBzbG90X25iX3Bvd2VyLCB3cmFwX3Rlcm5hcnlmdW5jX3IsCisgICAgICAgICAgICJ5Ll9fcnBvd19fKHhbLCB6XSkgPD09PiBwb3coeCwgeVssIHpdKSIpLAorICAgIFVOU0xPVCgiX19uZWdfXyIsIG5iX25lZ2F0aXZlLCBzbG90X25iX25lZ2F0aXZlLCB3cmFwX3VuYXJ5ZnVuYywgIi14IiksCisgICAgVU5TTE9UKCJfX3Bvc19fIiwgbmJfcG9zaXRpdmUsIHNsb3RfbmJfcG9zaXRpdmUsIHdyYXBfdW5hcnlmdW5jLCAiK3giKSwKKyAgICBVTlNMT1QoIl9fYWJzX18iLCBuYl9hYnNvbHV0ZSwgc2xvdF9uYl9hYnNvbHV0ZSwgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJhYnMoeCkiKSwKKyAgICBVTlNMT1QoIl9fbm9uemVyb19fIiwgbmJfbm9uemVybywgc2xvdF9uYl9ub256ZXJvLCB3cmFwX2lucXVpcnlwcmVkLAorICAgICAgICAgICAieCAhPSAwIiksCisgICAgVU5TTE9UKCJfX2ludmVydF9fIiwgbmJfaW52ZXJ0LCBzbG90X25iX2ludmVydCwgd3JhcF91bmFyeWZ1bmMsICJ+eCIpLAorICAgIEJJTlNMT1QoIl9fbHNoaWZ0X18iLCBuYl9sc2hpZnQsIHNsb3RfbmJfbHNoaWZ0LCAiPDwiKSwKKyAgICBSQklOU0xPVCgiX19ybHNoaWZ0X18iLCBuYl9sc2hpZnQsIHNsb3RfbmJfbHNoaWZ0LCAiPDwiKSwKKyAgICBCSU5TTE9UKCJfX3JzaGlmdF9fIiwgbmJfcnNoaWZ0LCBzbG90X25iX3JzaGlmdCwgIj4+IiksCisgICAgUkJJTlNMT1QoIl9fcnJzaGlmdF9fIiwgbmJfcnNoaWZ0LCBzbG90X25iX3JzaGlmdCwgIj4+IiksCisgICAgQklOU0xPVCgiX19hbmRfXyIsIG5iX2FuZCwgc2xvdF9uYl9hbmQsICImIiksCisgICAgUkJJTlNMT1QoIl9fcmFuZF9fIiwgbmJfYW5kLCBzbG90X25iX2FuZCwgIiYiKSwKKyAgICBCSU5TTE9UKCJfX3hvcl9fIiwgbmJfeG9yLCBzbG90X25iX3hvciwgIl4iKSwKKyAgICBSQklOU0xPVCgiX19yeG9yX18iLCBuYl94b3IsIHNsb3RfbmJfeG9yLCAiXiIpLAorICAgIEJJTlNMT1QoIl9fb3JfXyIsIG5iX29yLCBzbG90X25iX29yLCAifCIpLAorICAgIFJCSU5TTE9UKCJfX3Jvcl9fIiwgbmJfb3IsIHNsb3RfbmJfb3IsICJ8IiksCisgICAgTkJTTE9UKCJfX2NvZXJjZV9fIiwgbmJfY29lcmNlLCBzbG90X25iX2NvZXJjZSwgd3JhcF9jb2VyY2VmdW5jLAorICAgICAgICAgICAieC5fX2NvZXJjZV9fKHkpIDw9PT4gY29lcmNlKHgsIHkpIiksCisgICAgVU5TTE9UKCJfX2ludF9fIiwgbmJfaW50LCBzbG90X25iX2ludCwgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJpbnQoeCkiKSwKKyAgICBVTlNMT1QoIl9fbG9uZ19fIiwgbmJfbG9uZywgc2xvdF9uYl9sb25nLCB3cmFwX3VuYXJ5ZnVuYywKKyAgICAgICAgICAgImxvbmcoeCkiKSwKKyAgICBVTlNMT1QoIl9fZmxvYXRfXyIsIG5iX2Zsb2F0LCBzbG90X25iX2Zsb2F0LCB3cmFwX3VuYXJ5ZnVuYywKKyAgICAgICAgICAgImZsb2F0KHgpIiksCisgICAgVU5TTE9UKCJfX29jdF9fIiwgbmJfb2N0LCBzbG90X25iX29jdCwgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJvY3QoeCkiKSwKKyAgICBVTlNMT1QoIl9faGV4X18iLCBuYl9oZXgsIHNsb3RfbmJfaGV4LCB3cmFwX3VuYXJ5ZnVuYywKKyAgICAgICAgICAgImhleCh4KSIpLAorICAgIE5CU0xPVCgiX19pbmRleF9fIiwgbmJfaW5kZXgsIHNsb3RfbmJfaW5kZXgsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAieFt5OnpdIDw9PT4geFt5Ll9faW5kZXhfXygpOnouX19pbmRleF9fKCldIiksCisgICAgSUJTTE9UKCJfX2lhZGRfXyIsIG5iX2lucGxhY2VfYWRkLCBzbG90X25iX2lucGxhY2VfYWRkLAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIrIiksCisgICAgSUJTTE9UKCJfX2lzdWJfXyIsIG5iX2lucGxhY2Vfc3VidHJhY3QsIHNsb3RfbmJfaW5wbGFjZV9zdWJ0cmFjdCwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiLSIpLAorICAgIElCU0xPVCgiX19pbXVsX18iLCBuYl9pbnBsYWNlX211bHRpcGx5LCBzbG90X25iX2lucGxhY2VfbXVsdGlwbHksCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIioiKSwKKyAgICBJQlNMT1QoIl9faWRpdl9fIiwgbmJfaW5wbGFjZV9kaXZpZGUsIHNsb3RfbmJfaW5wbGFjZV9kaXZpZGUsCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIi8iKSwKKyAgICBJQlNMT1QoIl9faW1vZF9fIiwgbmJfaW5wbGFjZV9yZW1haW5kZXIsIHNsb3RfbmJfaW5wbGFjZV9yZW1haW5kZXIsCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIiUiKSwKKyAgICBJQlNMT1QoIl9faXBvd19fIiwgbmJfaW5wbGFjZV9wb3dlciwgc2xvdF9uYl9pbnBsYWNlX3Bvd2VyLAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICIqKiIpLAorICAgIElCU0xPVCgiX19pbHNoaWZ0X18iLCBuYl9pbnBsYWNlX2xzaGlmdCwgc2xvdF9uYl9pbnBsYWNlX2xzaGlmdCwKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAiPDwiKSwKKyAgICBJQlNMT1QoIl9faXJzaGlmdF9fIiwgbmJfaW5wbGFjZV9yc2hpZnQsIHNsb3RfbmJfaW5wbGFjZV9yc2hpZnQsCisgICAgICAgICAgIHdyYXBfYmluYXJ5ZnVuYywgIj4+IiksCisgICAgSUJTTE9UKCJfX2lhbmRfXyIsIG5iX2lucGxhY2VfYW5kLCBzbG90X25iX2lucGxhY2VfYW5kLAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICImIiksCisgICAgSUJTTE9UKCJfX2l4b3JfXyIsIG5iX2lucGxhY2VfeG9yLCBzbG90X25iX2lucGxhY2VfeG9yLAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICJeIiksCisgICAgSUJTTE9UKCJfX2lvcl9fIiwgbmJfaW5wbGFjZV9vciwgc2xvdF9uYl9pbnBsYWNlX29yLAorICAgICAgICAgICB3cmFwX2JpbmFyeWZ1bmMsICJ8IiksCisgICAgQklOU0xPVCgiX19mbG9vcmRpdl9fIiwgbmJfZmxvb3JfZGl2aWRlLCBzbG90X25iX2Zsb29yX2RpdmlkZSwgIi8vIiksCisgICAgUkJJTlNMT1QoIl9fcmZsb29yZGl2X18iLCBuYl9mbG9vcl9kaXZpZGUsIHNsb3RfbmJfZmxvb3JfZGl2aWRlLCAiLy8iKSwKKyAgICBCSU5TTE9UKCJfX3RydWVkaXZfXyIsIG5iX3RydWVfZGl2aWRlLCBzbG90X25iX3RydWVfZGl2aWRlLCAiLyIpLAorICAgIFJCSU5TTE9UKCJfX3J0cnVlZGl2X18iLCBuYl90cnVlX2RpdmlkZSwgc2xvdF9uYl90cnVlX2RpdmlkZSwgIi8iKSwKKyAgICBJQlNMT1QoIl9faWZsb29yZGl2X18iLCBuYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSwKKyAgICAgICAgICAgc2xvdF9uYl9pbnBsYWNlX2Zsb29yX2RpdmlkZSwgd3JhcF9iaW5hcnlmdW5jLCAiLy8iKSwKKyAgICBJQlNMT1QoIl9faXRydWVkaXZfXyIsIG5iX2lucGxhY2VfdHJ1ZV9kaXZpZGUsCisgICAgICAgICAgIHNsb3RfbmJfaW5wbGFjZV90cnVlX2RpdmlkZSwgd3JhcF9iaW5hcnlmdW5jLCAiLyIpLAogCi0JVFBTTE9UKCJfX3N0cl9fIiwgdHBfc3RyLCBzbG90X3RwX3N0ciwgd3JhcF91bmFyeWZ1bmMsCi0JICAgICAgICJ4Ll9fc3RyX18oKSA8PT0+IHN0cih4KSIpLAotCVRQU0xPVCgiX19zdHJfXyIsIHRwX3ByaW50LCBOVUxMLCBOVUxMLCAiIiksCi0JVFBTTE9UKCJfX3JlcHJfXyIsIHRwX3JlcHIsIHNsb3RfdHBfcmVwciwgd3JhcF91bmFyeWZ1bmMsCi0JICAgICAgICJ4Ll9fcmVwcl9fKCkgPD09PiByZXByKHgpIiksCi0JVFBTTE9UKCJfX3JlcHJfXyIsIHRwX3ByaW50LCBOVUxMLCBOVUxMLCAiIiksCi0JVFBTTE9UKCJfX2NtcF9fIiwgdHBfY29tcGFyZSwgX1B5T2JqZWN0X1Nsb3RDb21wYXJlLCB3cmFwX2NtcGZ1bmMsCi0JICAgICAgICJ4Ll9fY21wX18oeSkgPD09PiBjbXAoeCx5KSIpLAotCVRQU0xPVCgiX19oYXNoX18iLCB0cF9oYXNoLCBzbG90X3RwX2hhc2gsIHdyYXBfaGFzaGZ1bmMsCi0JICAgICAgICJ4Ll9faGFzaF9fKCkgPD09PiBoYXNoKHgpIiksCi0JRkxTTE9UKCJfX2NhbGxfXyIsIHRwX2NhbGwsIHNsb3RfdHBfY2FsbCwgKHdyYXBwZXJmdW5jKXdyYXBfY2FsbCwKLQkgICAgICAgInguX19jYWxsX18oLi4uKSA8PT0+IHgoLi4uKSIsIFB5V3JhcHBlckZsYWdfS0VZV09SRFMpLAotCVRQU0xPVCgiX19nZXRhdHRyaWJ1dGVfXyIsIHRwX2dldGF0dHJvLCBzbG90X3RwX2dldGF0dHJfaG9vaywKLQkgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAieC5fX2dldGF0dHJpYnV0ZV9fKCduYW1lJykgPD09PiB4Lm5hbWUiKSwKLQlUUFNMT1QoIl9fZ2V0YXR0cmlidXRlX18iLCB0cF9nZXRhdHRyLCBOVUxMLCBOVUxMLCAiIiksCi0JVFBTTE9UKCJfX2dldGF0dHJfXyIsIHRwX2dldGF0dHJvLCBzbG90X3RwX2dldGF0dHJfaG9vaywgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19nZXRhdHRyX18iLCB0cF9nZXRhdHRyLCBOVUxMLCBOVUxMLCAiIiksCi0JVFBTTE9UKCJfX3NldGF0dHJfXyIsIHRwX3NldGF0dHJvLCBzbG90X3RwX3NldGF0dHJvLCB3cmFwX3NldGF0dHIsCi0JICAgICAgICJ4Ll9fc2V0YXR0cl9fKCduYW1lJywgdmFsdWUpIDw9PT4geC5uYW1lID0gdmFsdWUiKSwKLQlUUFNMT1QoIl9fc2V0YXR0cl9fIiwgdHBfc2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAotCVRQU0xPVCgiX19kZWxhdHRyX18iLCB0cF9zZXRhdHRybywgc2xvdF90cF9zZXRhdHRybywgd3JhcF9kZWxhdHRyLAotCSAgICAgICAieC5fX2RlbGF0dHJfXygnbmFtZScpIDw9PT4gZGVsIHgubmFtZSIpLAotCVRQU0xPVCgiX19kZWxhdHRyX18iLCB0cF9zZXRhdHRyLCBOVUxMLCBOVUxMLCAiIiksCi0JVFBTTE9UKCJfX2x0X18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9sdCwKLQkgICAgICAgInguX19sdF9fKHkpIDw9PT4geDx5IiksCi0JVFBTTE9UKCJfX2xlX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9sZSwKLQkgICAgICAgInguX19sZV9fKHkpIDw9PT4geDw9eSIpLAotCVRQU0xPVCgiX19lcV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZXEsCi0JICAgICAgICJ4Ll9fZXFfXyh5KSA8PT0+IHg9PXkiKSwKLQlUUFNMT1QoIl9fbmVfXyIsIHRwX3JpY2hjb21wYXJlLCBzbG90X3RwX3JpY2hjb21wYXJlLCByaWNoY21wX25lLAotCSAgICAgICAieC5fX25lX18oeSkgPD09PiB4IT15IiksCi0JVFBTTE9UKCJfX2d0X18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9ndCwKLQkgICAgICAgInguX19ndF9fKHkpIDw9PT4geD55IiksCi0JVFBTTE9UKCJfX2dlX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9nZSwKLQkgICAgICAgInguX19nZV9fKHkpIDw9PT4geD49eSIpLAotCVRQU0xPVCgiX19pdGVyX18iLCB0cF9pdGVyLCBzbG90X3RwX2l0ZXIsIHdyYXBfdW5hcnlmdW5jLAotCSAgICAgICAieC5fX2l0ZXJfXygpIDw9PT4gaXRlcih4KSIpLAotCVRQU0xPVCgibmV4dCIsIHRwX2l0ZXJuZXh0LCBzbG90X3RwX2l0ZXJuZXh0LCB3cmFwX25leHQsCi0JICAgICAgICJ4Lm5leHQoKSAtPiB0aGUgbmV4dCB2YWx1ZSwgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbiIpLAotCVRQU0xPVCgiX19nZXRfXyIsIHRwX2Rlc2NyX2dldCwgc2xvdF90cF9kZXNjcl9nZXQsIHdyYXBfZGVzY3JfZ2V0LAotCSAgICAgICAiZGVzY3IuX19nZXRfXyhvYmpbLCB0eXBlXSkgLT4gdmFsdWUiKSwKLQlUUFNMT1QoIl9fc2V0X18iLCB0cF9kZXNjcl9zZXQsIHNsb3RfdHBfZGVzY3Jfc2V0LCB3cmFwX2Rlc2NyX3NldCwKLQkgICAgICAgImRlc2NyLl9fc2V0X18ob2JqLCB2YWx1ZSkiKSwKLQlUUFNMT1QoIl9fZGVsZXRlX18iLCB0cF9kZXNjcl9zZXQsIHNsb3RfdHBfZGVzY3Jfc2V0LAotCSAgICAgICB3cmFwX2Rlc2NyX2RlbGV0ZSwgImRlc2NyLl9fZGVsZXRlX18ob2JqKSIpLAotCUZMU0xPVCgiX19pbml0X18iLCB0cF9pbml0LCBzbG90X3RwX2luaXQsICh3cmFwcGVyZnVuYyl3cmFwX2luaXQsCi0JICAgICAgICJ4Ll9faW5pdF9fKC4uLikgaW5pdGlhbGl6ZXMgeDsgIgotCSAgICAgICAic2VlIHguX19jbGFzc19fLl9fZG9jX18gZm9yIHNpZ25hdHVyZSIsCi0JICAgICAgIFB5V3JhcHBlckZsYWdfS0VZV09SRFMpLAotCVRQU0xPVCgiX19uZXdfXyIsIHRwX25ldywgc2xvdF90cF9uZXcsIE5VTEwsICIiKSwKLQlUUFNMT1QoIl9fZGVsX18iLCB0cF9kZWwsIHNsb3RfdHBfZGVsLCBOVUxMLCAiIiksCi0Je05VTEx9CisgICAgVFBTTE9UKCJfX3N0cl9fIiwgdHBfc3RyLCBzbG90X3RwX3N0ciwgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJ4Ll9fc3RyX18oKSA8PT0+IHN0cih4KSIpLAorICAgIFRQU0xPVCgiX19zdHJfXyIsIHRwX3ByaW50LCBOVUxMLCBOVUxMLCAiIiksCisgICAgVFBTTE9UKCJfX3JlcHJfXyIsIHRwX3JlcHIsIHNsb3RfdHBfcmVwciwgd3JhcF91bmFyeWZ1bmMsCisgICAgICAgICAgICJ4Ll9fcmVwcl9fKCkgPD09PiByZXByKHgpIiksCisgICAgVFBTTE9UKCJfX3JlcHJfXyIsIHRwX3ByaW50LCBOVUxMLCBOVUxMLCAiIiksCisgICAgVFBTTE9UKCJfX2NtcF9fIiwgdHBfY29tcGFyZSwgX1B5T2JqZWN0X1Nsb3RDb21wYXJlLCB3cmFwX2NtcGZ1bmMsCisgICAgICAgICAgICJ4Ll9fY21wX18oeSkgPD09PiBjbXAoeCx5KSIpLAorICAgIFRQU0xPVCgiX19oYXNoX18iLCB0cF9oYXNoLCBzbG90X3RwX2hhc2gsIHdyYXBfaGFzaGZ1bmMsCisgICAgICAgICAgICJ4Ll9faGFzaF9fKCkgPD09PiBoYXNoKHgpIiksCisgICAgRkxTTE9UKCJfX2NhbGxfXyIsIHRwX2NhbGwsIHNsb3RfdHBfY2FsbCwgKHdyYXBwZXJmdW5jKXdyYXBfY2FsbCwKKyAgICAgICAgICAgInguX19jYWxsX18oLi4uKSA8PT0+IHgoLi4uKSIsIFB5V3JhcHBlckZsYWdfS0VZV09SRFMpLAorICAgIFRQU0xPVCgiX19nZXRhdHRyaWJ1dGVfXyIsIHRwX2dldGF0dHJvLCBzbG90X3RwX2dldGF0dHJfaG9vaywKKyAgICAgICAgICAgd3JhcF9iaW5hcnlmdW5jLCAieC5fX2dldGF0dHJpYnV0ZV9fKCduYW1lJykgPD09PiB4Lm5hbWUiKSwKKyAgICBUUFNMT1QoIl9fZ2V0YXR0cmlidXRlX18iLCB0cF9nZXRhdHRyLCBOVUxMLCBOVUxMLCAiIiksCisgICAgVFBTTE9UKCJfX2dldGF0dHJfXyIsIHRwX2dldGF0dHJvLCBzbG90X3RwX2dldGF0dHJfaG9vaywgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19nZXRhdHRyX18iLCB0cF9nZXRhdHRyLCBOVUxMLCBOVUxMLCAiIiksCisgICAgVFBTTE9UKCJfX3NldGF0dHJfXyIsIHRwX3NldGF0dHJvLCBzbG90X3RwX3NldGF0dHJvLCB3cmFwX3NldGF0dHIsCisgICAgICAgICAgICJ4Ll9fc2V0YXR0cl9fKCduYW1lJywgdmFsdWUpIDw9PT4geC5uYW1lID0gdmFsdWUiKSwKKyAgICBUUFNMT1QoIl9fc2V0YXR0cl9fIiwgdHBfc2V0YXR0ciwgTlVMTCwgTlVMTCwgIiIpLAorICAgIFRQU0xPVCgiX19kZWxhdHRyX18iLCB0cF9zZXRhdHRybywgc2xvdF90cF9zZXRhdHRybywgd3JhcF9kZWxhdHRyLAorICAgICAgICAgICAieC5fX2RlbGF0dHJfXygnbmFtZScpIDw9PT4gZGVsIHgubmFtZSIpLAorICAgIFRQU0xPVCgiX19kZWxhdHRyX18iLCB0cF9zZXRhdHRyLCBOVUxMLCBOVUxMLCAiIiksCisgICAgVFBTTE9UKCJfX2x0X18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9sdCwKKyAgICAgICAgICAgInguX19sdF9fKHkpIDw9PT4geDx5IiksCisgICAgVFBTTE9UKCJfX2xlX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9sZSwKKyAgICAgICAgICAgInguX19sZV9fKHkpIDw9PT4geDw9eSIpLAorICAgIFRQU0xPVCgiX19lcV9fIiwgdHBfcmljaGNvbXBhcmUsIHNsb3RfdHBfcmljaGNvbXBhcmUsIHJpY2hjbXBfZXEsCisgICAgICAgICAgICJ4Ll9fZXFfXyh5KSA8PT0+IHg9PXkiKSwKKyAgICBUUFNMT1QoIl9fbmVfXyIsIHRwX3JpY2hjb21wYXJlLCBzbG90X3RwX3JpY2hjb21wYXJlLCByaWNoY21wX25lLAorICAgICAgICAgICAieC5fX25lX18oeSkgPD09PiB4IT15IiksCisgICAgVFBTTE9UKCJfX2d0X18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9ndCwKKyAgICAgICAgICAgInguX19ndF9fKHkpIDw9PT4geD55IiksCisgICAgVFBTTE9UKCJfX2dlX18iLCB0cF9yaWNoY29tcGFyZSwgc2xvdF90cF9yaWNoY29tcGFyZSwgcmljaGNtcF9nZSwKKyAgICAgICAgICAgInguX19nZV9fKHkpIDw9PT4geD49eSIpLAorICAgIFRQU0xPVCgiX19pdGVyX18iLCB0cF9pdGVyLCBzbG90X3RwX2l0ZXIsIHdyYXBfdW5hcnlmdW5jLAorICAgICAgICAgICAieC5fX2l0ZXJfXygpIDw9PT4gaXRlcih4KSIpLAorICAgIFRQU0xPVCgibmV4dCIsIHRwX2l0ZXJuZXh0LCBzbG90X3RwX2l0ZXJuZXh0LCB3cmFwX25leHQsCisgICAgICAgICAgICJ4Lm5leHQoKSAtPiB0aGUgbmV4dCB2YWx1ZSwgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbiIpLAorICAgIFRQU0xPVCgiX19nZXRfXyIsIHRwX2Rlc2NyX2dldCwgc2xvdF90cF9kZXNjcl9nZXQsIHdyYXBfZGVzY3JfZ2V0LAorICAgICAgICAgICAiZGVzY3IuX19nZXRfXyhvYmpbLCB0eXBlXSkgLT4gdmFsdWUiKSwKKyAgICBUUFNMT1QoIl9fc2V0X18iLCB0cF9kZXNjcl9zZXQsIHNsb3RfdHBfZGVzY3Jfc2V0LCB3cmFwX2Rlc2NyX3NldCwKKyAgICAgICAgICAgImRlc2NyLl9fc2V0X18ob2JqLCB2YWx1ZSkiKSwKKyAgICBUUFNMT1QoIl9fZGVsZXRlX18iLCB0cF9kZXNjcl9zZXQsIHNsb3RfdHBfZGVzY3Jfc2V0LAorICAgICAgICAgICB3cmFwX2Rlc2NyX2RlbGV0ZSwgImRlc2NyLl9fZGVsZXRlX18ob2JqKSIpLAorICAgIEZMU0xPVCgiX19pbml0X18iLCB0cF9pbml0LCBzbG90X3RwX2luaXQsICh3cmFwcGVyZnVuYyl3cmFwX2luaXQsCisgICAgICAgICAgICJ4Ll9faW5pdF9fKC4uLikgaW5pdGlhbGl6ZXMgeDsgIgorICAgICAgICAgICAic2VlIHguX19jbGFzc19fLl9fZG9jX18gZm9yIHNpZ25hdHVyZSIsCisgICAgICAgICAgIFB5V3JhcHBlckZsYWdfS0VZV09SRFMpLAorICAgIFRQU0xPVCgiX19uZXdfXyIsIHRwX25ldywgc2xvdF90cF9uZXcsIE5VTEwsICIiKSwKKyAgICBUUFNMT1QoIl9fZGVsX18iLCB0cF9kZWwsIHNsb3RfdHBfZGVsLCBOVUxMLCAiIiksCisgICAge05VTEx9CiB9OwogCiAvKiBHaXZlbiBhIHR5cGUgcG9pbnRlciBhbmQgYW4gb2Zmc2V0IGdvdHRlbiBmcm9tIGEgc2xvdGRlZiBlbnRyeSwgcmV0dXJuIGEKLSAgIHBvaW50ZXIgdG8gdGhlIGFjdHVhbCBzbG90LglUaGlzIGlzIG5vdCBxdWl0ZSB0aGUgc2FtZSBhcyBzaW1wbHkgYWRkaW5nCisgICBwb2ludGVyIHRvIHRoZSBhY3R1YWwgc2xvdC4gIFRoaXMgaXMgbm90IHF1aXRlIHRoZSBzYW1lIGFzIHNpbXBseSBhZGRpbmcKICAgIHRoZSBvZmZzZXQgdG8gdGhlIHR5cGUgcG9pbnRlciwgc2luY2UgaXQgdGFrZXMgY2FyZSB0byBpbmRpcmVjdCB0aHJvdWdoIHRoZQogICAgcHJvcGVyIGluZGlyZWN0aW9uIHBvaW50ZXIgKGFzX2J1ZmZlciwgZXRjLik7IGl0IHJldHVybnMgTlVMTCBpZiB0aGUKICAgIGluZGlyZWN0aW9uIHBvaW50ZXIgaXMgTlVMTC4gKi8KIHN0YXRpYyB2b2lkICoqCiBzbG90cHRyKFB5VHlwZU9iamVjdCAqdHlwZSwgaW50IGlvZmZzZXQpCiB7Ci0JY2hhciAqcHRyOwotCWxvbmcgb2Zmc2V0ID0gaW9mZnNldDsKKyAgICBjaGFyICpwdHI7CisgICAgbG9uZyBvZmZzZXQgPSBpb2Zmc2V0OwogCi0JLyogTm90ZTogdGhpcyBkZXBlbmRzIG9uIHRoZSBvcmRlciBvZiB0aGUgbWVtYmVycyBvZiBQeUhlYXBUeXBlT2JqZWN0ISAqLwotCWFzc2VydChvZmZzZXQgPj0gMCk7Ci0JYXNzZXJ0KChzaXplX3Qpb2Zmc2V0IDwgb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfYnVmZmVyKSk7Ci0JaWYgKChzaXplX3Qpb2Zmc2V0ID49IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX3NlcXVlbmNlKSkgewotCQlwdHIgPSAoY2hhciAqKXR5cGUtPnRwX2FzX3NlcXVlbmNlOwotCQlvZmZzZXQgLT0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfc2VxdWVuY2UpOwotCX0KLQllbHNlIGlmICgoc2l6ZV90KW9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19tYXBwaW5nKSkgewotCQlwdHIgPSAoY2hhciAqKXR5cGUtPnRwX2FzX21hcHBpbmc7Ci0JCW9mZnNldCAtPSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19tYXBwaW5nKTsKLQl9Ci0JZWxzZSBpZiAoKHNpemVfdClvZmZzZXQgPj0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbnVtYmVyKSkgewotCQlwdHIgPSAoY2hhciAqKXR5cGUtPnRwX2FzX251bWJlcjsKLQkJb2Zmc2V0IC09IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX251bWJlcik7Ci0JfQotCWVsc2UgewotCQlwdHIgPSAoY2hhciAqKXR5cGU7Ci0JfQotCWlmIChwdHIgIT0gTlVMTCkKLQkJcHRyICs9IG9mZnNldDsKLQlyZXR1cm4gKHZvaWQgKiopcHRyOworICAgIC8qIE5vdGU6IHRoaXMgZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2YgdGhlIG1lbWJlcnMgb2YgUHlIZWFwVHlwZU9iamVjdCEgKi8KKyAgICBhc3NlcnQob2Zmc2V0ID49IDApOworICAgIGFzc2VydCgoc2l6ZV90KW9mZnNldCA8IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX2J1ZmZlcikpOworICAgIGlmICgoc2l6ZV90KW9mZnNldCA+PSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19zZXF1ZW5jZSkpIHsKKyAgICAgICAgcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19zZXF1ZW5jZTsKKyAgICAgICAgb2Zmc2V0IC09IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX3NlcXVlbmNlKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHNpemVfdClvZmZzZXQgPj0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbWFwcGluZykpIHsKKyAgICAgICAgcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19tYXBwaW5nOworICAgICAgICBvZmZzZXQgLT0gb2Zmc2V0b2YoUHlIZWFwVHlwZU9iamVjdCwgYXNfbWFwcGluZyk7CisgICAgfQorICAgIGVsc2UgaWYgKChzaXplX3Qpb2Zmc2V0ID49IG9mZnNldG9mKFB5SGVhcFR5cGVPYmplY3QsIGFzX251bWJlcikpIHsKKyAgICAgICAgcHRyID0gKGNoYXIgKil0eXBlLT50cF9hc19udW1iZXI7CisgICAgICAgIG9mZnNldCAtPSBvZmZzZXRvZihQeUhlYXBUeXBlT2JqZWN0LCBhc19udW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHRyID0gKGNoYXIgKil0eXBlOworICAgIH0KKyAgICBpZiAocHRyICE9IE5VTEwpCisgICAgICAgIHB0ciArPSBvZmZzZXQ7CisgICAgcmV0dXJuICh2b2lkICoqKXB0cjsKIH0KIAogLyogTGVuZ3RoIG9mIGFycmF5IG9mIHNsb3RkZWYgcG9pbnRlcnMgdXNlZCB0byBzdG9yZSBzbG90cyB3aXRoIHRoZQpAQCAtNjAzOCwzNyArNjAzOCwzNyBAQAogc3RhdGljIHZvaWQgKioKIHJlc29sdmVfc2xvdGR1cHMoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqbmFtZSkKIHsKLQkvKiBYWFggTWF5YmUgdGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgbW9yZSAtLSBidXQgaXMgaXQgd29ydGggaXQ/ICovCisgICAgLyogWFhYIE1heWJlIHRoaXMgY291bGQgYmUgb3B0aW1pemVkIG1vcmUgLS0gYnV0IGlzIGl0IHdvcnRoIGl0PyAqLwogCi0JLyogcG5hbWUgYW5kIHB0cnMgYWN0IGFzIGEgbGl0dGxlIGNhY2hlICovCi0Jc3RhdGljIFB5T2JqZWN0ICpwbmFtZTsKLQlzdGF0aWMgc2xvdGRlZiAqcHRyc1tNQVhfRVFVSVZdOwotCXNsb3RkZWYgKnAsICoqcHA7Ci0Jdm9pZCAqKnJlcywgKipwdHI7CisgICAgLyogcG5hbWUgYW5kIHB0cnMgYWN0IGFzIGEgbGl0dGxlIGNhY2hlICovCisgICAgc3RhdGljIFB5T2JqZWN0ICpwbmFtZTsKKyAgICBzdGF0aWMgc2xvdGRlZiAqcHRyc1tNQVhfRVFVSVZdOworICAgIHNsb3RkZWYgKnAsICoqcHA7CisgICAgdm9pZCAqKnJlcywgKipwdHI7CiAKLQlpZiAocG5hbWUgIT0gbmFtZSkgewotCQkvKiBDb2xsZWN0IGFsbCBzbG90ZGVmcyB0aGF0IG1hdGNoIG5hbWUgaW50byBwdHJzLiAqLwotCQlwbmFtZSA9IG5hbWU7Ci0JCXBwID0gcHRyczsKLQkJZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWVfc3Ryb2JqOyBwKyspIHsKLQkJCWlmIChwLT5uYW1lX3N0cm9iaiA9PSBuYW1lKQotCQkJCSpwcCsrID0gcDsKLQkJfQotCQkqcHAgPSBOVUxMOwotCX0KKyAgICBpZiAocG5hbWUgIT0gbmFtZSkgeworICAgICAgICAvKiBDb2xsZWN0IGFsbCBzbG90ZGVmcyB0aGF0IG1hdGNoIG5hbWUgaW50byBwdHJzLiAqLworICAgICAgICBwbmFtZSA9IG5hbWU7CisgICAgICAgIHBwID0gcHRyczsKKyAgICAgICAgZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWVfc3Ryb2JqOyBwKyspIHsKKyAgICAgICAgICAgIGlmIChwLT5uYW1lX3N0cm9iaiA9PSBuYW1lKQorICAgICAgICAgICAgICAgICpwcCsrID0gcDsKKyAgICAgICAgfQorICAgICAgICAqcHAgPSBOVUxMOworICAgIH0KIAotCS8qIExvb2sgaW4gYWxsIG1hdGNoaW5nIHNsb3RzIG9mIHRoZSB0eXBlOyBpZiBleGFjdGx5IG9uZSBvZiB0aGVzZSBoYXMKLQkgICBhIGZpbGxlZC1pbiBzbG90LCByZXR1cm4gaXRzIHZhbHVlLglPdGhlcndpc2UgcmV0dXJuIE5VTEwuICovCi0JcmVzID0gTlVMTDsKLQlmb3IgKHBwID0gcHRyczsgKnBwOyBwcCsrKSB7Ci0JCXB0ciA9IHNsb3RwdHIodHlwZSwgKCpwcCktPm9mZnNldCk7Ci0JCWlmIChwdHIgPT0gTlVMTCB8fCAqcHRyID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJaWYgKHJlcyAhPSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJlcyA9IHB0cjsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICAvKiBMb29rIGluIGFsbCBtYXRjaGluZyBzbG90cyBvZiB0aGUgdHlwZTsgaWYgZXhhY3RseSBvbmUgb2YgdGhlc2UgaGFzCisgICAgICAgYSBmaWxsZWQtaW4gc2xvdCwgcmV0dXJuIGl0cyB2YWx1ZS4gICAgICBPdGhlcndpc2UgcmV0dXJuIE5VTEwuICovCisgICAgcmVzID0gTlVMTDsKKyAgICBmb3IgKHBwID0gcHRyczsgKnBwOyBwcCsrKSB7CisgICAgICAgIHB0ciA9IHNsb3RwdHIodHlwZSwgKCpwcCktPm9mZnNldCk7CisgICAgICAgIGlmIChwdHIgPT0gTlVMTCB8fCAqcHRyID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHJlcyAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlcyA9IHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKIH0KIAogLyogQ29tbW9uIGNvZGUgZm9yIHVwZGF0ZV9zbG90c19jYWxsYmFjaygpIGFuZCBmaXh1cF9zbG90X2Rpc3BhdGNoZXJzKCkuICBUaGlzCkBAIC02MDgwLDc3ICs2MDgwLDc3IEBACiBzdGF0aWMgc2xvdGRlZiAqCiB1cGRhdGVfb25lX3Nsb3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBzbG90ZGVmICpwKQogewotCVB5T2JqZWN0ICpkZXNjcjsKLQlQeVdyYXBwZXJEZXNjck9iamVjdCAqZDsKLQl2b2lkICpnZW5lcmljID0gTlVMTCwgKnNwZWNpZmljID0gTlVMTDsKLQlpbnQgdXNlX2dlbmVyaWMgPSAwOwotCWludCBvZmZzZXQgPSBwLT5vZmZzZXQ7Ci0Jdm9pZCAqKnB0ciA9IHNsb3RwdHIodHlwZSwgb2Zmc2V0KTsKKyAgICBQeU9iamVjdCAqZGVzY3I7CisgICAgUHlXcmFwcGVyRGVzY3JPYmplY3QgKmQ7CisgICAgdm9pZCAqZ2VuZXJpYyA9IE5VTEwsICpzcGVjaWZpYyA9IE5VTEw7CisgICAgaW50IHVzZV9nZW5lcmljID0gMDsKKyAgICBpbnQgb2Zmc2V0ID0gcC0+b2Zmc2V0OworICAgIHZvaWQgKipwdHIgPSBzbG90cHRyKHR5cGUsIG9mZnNldCk7CiAKLQlpZiAocHRyID09IE5VTEwpIHsKLQkJZG8gewotCQkJKytwOwotCQl9IHdoaWxlIChwLT5vZmZzZXQgPT0gb2Zmc2V0KTsKLQkJcmV0dXJuIHA7Ci0JfQotCWRvIHsKLQkJZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0eXBlLCBwLT5uYW1lX3N0cm9iaik7Ci0JCWlmIChkZXNjciA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWlmIChQeV9UWVBFKGRlc2NyKSA9PSAmUHlXcmFwcGVyRGVzY3JfVHlwZSkgewotCQkJdm9pZCAqKnRwdHIgPSByZXNvbHZlX3Nsb3RkdXBzKHR5cGUsIHAtPm5hbWVfc3Ryb2JqKTsKLQkJCWlmICh0cHRyID09IE5VTEwgfHwgdHB0ciA9PSBwdHIpCi0JCQkJZ2VuZXJpYyA9IHAtPmZ1bmN0aW9uOwotCQkJZCA9IChQeVdyYXBwZXJEZXNjck9iamVjdCAqKWRlc2NyOwotCQkJaWYgKGQtPmRfYmFzZS0+d3JhcHBlciA9PSBwLT53cmFwcGVyICYmCi0JCQkgICAgUHlUeXBlX0lzU3VidHlwZSh0eXBlLCBkLT5kX3R5cGUpKQotCQkJewotCQkJCWlmIChzcGVjaWZpYyA9PSBOVUxMIHx8Ci0JCQkJICAgIHNwZWNpZmljID09IGQtPmRfd3JhcHBlZCkKLQkJCQkJc3BlY2lmaWMgPSBkLT5kX3dyYXBwZWQ7Ci0JCQkJZWxzZQotCQkJCQl1c2VfZ2VuZXJpYyA9IDE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoUHlfVFlQRShkZXNjcikgPT0gJlB5Q0Z1bmN0aW9uX1R5cGUgJiYKLQkJCSBQeUNGdW5jdGlvbl9HRVRfRlVOQ1RJT04oZGVzY3IpID09Ci0JCQkgKFB5Q0Z1bmN0aW9uKXRwX25ld193cmFwcGVyICYmCi0JCQkgc3RyY21wKHAtPm5hbWUsICJfX25ld19fIikgPT0gMCkKLQkJewotCQkJLyogVGhlIF9fbmV3X18gd3JhcHBlciBpcyBub3QgYSB3cmFwcGVyIGRlc2NyaXB0b3IsCi0JCQkgICBzbyBtdXN0IGJlIHNwZWNpYWwtY2FzZWQgZGlmZmVyZW50bHkuCi0JCQkgICBJZiB3ZSBkb24ndCBkbyB0aGlzLCBjcmVhdGluZyBhbiBpbnN0YW5jZSB3aWxsCi0JCQkgICBhbHdheXMgdXNlIHNsb3RfdHBfbmV3IHdoaWNoIHdpbGwgbG9vayB1cAotCQkJICAgX19uZXdfXyBpbiB0aGUgTVJPIHdoaWNoIHdpbGwgY2FsbCB0cF9uZXdfd3JhcHBlcgotCQkJICAgd2hpY2ggd2lsbCBsb29rIHRocm91Z2ggdGhlIGJhc2UgY2xhc3NlcyBsb29raW5nCi0JCQkgICBmb3IgYSBzdGF0aWMgYmFzZSBhbmQgY2FsbCBpdHMgdHBfbmV3ICh1c3VhbGx5Ci0JCQkgICBQeVR5cGVfR2VuZXJpY05ldyksIGFmdGVyIHBlcmZvcm1pbmcgdmFyaW91cwotCQkJICAgc2FuaXR5IGNoZWNrcyBhbmQgY29uc3RydWN0aW5nIGEgbmV3IGFyZ3VtZW50Ci0JCQkgICBsaXN0LiAgQ3V0IGFsbCB0aGF0IG5vbnNlbnNlIHNob3J0IC0tIHRoaXMgc3BlZWRzCi0JCQkgICB1cCBpbnN0YW5jZSBjcmVhdGlvbiB0cmVtZW5kb3VzbHkuICovCi0JCQlzcGVjaWZpYyA9ICh2b2lkICopdHlwZS0+dHBfbmV3OwotCQkJLyogWFhYIEknbSBub3QgMTAwJSBzdXJlIHRoYXQgdGhlcmUgaXNuJ3QgYSBob2xlCi0JCQkgICBpbiB0aGlzIHJlYXNvbmluZyB0aGF0IHJlcXVpcmVzIGFkZGl0aW9uYWwKLQkJCSAgIHNhbml0eSBjaGVja3MuICBJJ2xsIGJ1eSB0aGUgZmlyc3QgcGVyc29uIHRvCi0JCQkgICBwb2ludCBvdXQgYSBidWcgaW4gdGhpcyByZWFzb25pbmcgYSBiZWVyLiAqLwotCQl9Ci0JCWVsc2UgaWYgKGRlc2NyID09IFB5X05vbmUgJiYKLQkJCSBzdHJjbXAocC0+bmFtZSwgIl9faGFzaF9fIikgPT0gMCkgewotCQkJLyogV2Ugc3BlY2lmaWNhbGx5IGFsbG93IF9faGFzaF9fIHRvIGJlIHNldCB0byBOb25lCi0JCQkgICB0byBwcmV2ZW50IGluaGVyaXRhbmNlIG9mIHRoZSBkZWZhdWx0Ci0JCQkgICBpbXBsZW1lbnRhdGlvbiBmcm9tIG9iamVjdC5fX2hhc2hfXyAqLwotCQkJc3BlY2lmaWMgPSBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1c2VfZ2VuZXJpYyA9IDE7Ci0JCQlnZW5lcmljID0gcC0+ZnVuY3Rpb247Ci0JCX0KLQl9IHdoaWxlICgoKytwKS0+b2Zmc2V0ID09IG9mZnNldCk7Ci0JaWYgKHNwZWNpZmljICYmICF1c2VfZ2VuZXJpYykKLQkJKnB0ciA9IHNwZWNpZmljOwotCWVsc2UKLQkJKnB0ciA9IGdlbmVyaWM7Ci0JcmV0dXJuIHA7CisgICAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICsrcDsKKyAgICAgICAgfSB3aGlsZSAocC0+b2Zmc2V0ID09IG9mZnNldCk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHlwZSwgcC0+bmFtZV9zdHJvYmopOworICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoUHlfVFlQRShkZXNjcikgPT0gJlB5V3JhcHBlckRlc2NyX1R5cGUpIHsKKyAgICAgICAgICAgIHZvaWQgKip0cHRyID0gcmVzb2x2ZV9zbG90ZHVwcyh0eXBlLCBwLT5uYW1lX3N0cm9iaik7CisgICAgICAgICAgICBpZiAodHB0ciA9PSBOVUxMIHx8IHRwdHIgPT0gcHRyKQorICAgICAgICAgICAgICAgIGdlbmVyaWMgPSBwLT5mdW5jdGlvbjsKKyAgICAgICAgICAgIGQgPSAoUHlXcmFwcGVyRGVzY3JPYmplY3QgKilkZXNjcjsKKyAgICAgICAgICAgIGlmIChkLT5kX2Jhc2UtPndyYXBwZXIgPT0gcC0+d3JhcHBlciAmJgorICAgICAgICAgICAgICAgIFB5VHlwZV9Jc1N1YnR5cGUodHlwZSwgZC0+ZF90eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3BlY2lmaWMgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyA9PSBkLT5kX3dyYXBwZWQpCisgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljID0gZC0+ZF93cmFwcGVkOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdXNlX2dlbmVyaWMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5X1RZUEUoZGVzY3IpID09ICZQeUNGdW5jdGlvbl9UeXBlICYmCisgICAgICAgICAgICAgICAgIFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihkZXNjcikgPT0KKyAgICAgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKXRwX25ld193cmFwcGVyICYmCisgICAgICAgICAgICAgICAgIHN0cmNtcChwLT5uYW1lLCAiX19uZXdfXyIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBfX25ld19fIHdyYXBwZXIgaXMgbm90IGEgd3JhcHBlciBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgc28gbXVzdCBiZSBzcGVjaWFsLWNhc2VkIGRpZmZlcmVudGx5LgorICAgICAgICAgICAgICAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgY3JlYXRpbmcgYW4gaW5zdGFuY2Ugd2lsbAorICAgICAgICAgICAgICAgYWx3YXlzIHVzZSBzbG90X3RwX25ldyB3aGljaCB3aWxsIGxvb2sgdXAKKyAgICAgICAgICAgICAgIF9fbmV3X18gaW4gdGhlIE1STyB3aGljaCB3aWxsIGNhbGwgdHBfbmV3X3dyYXBwZXIKKyAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgbG9vayB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgbG9va2luZworICAgICAgICAgICAgICAgZm9yIGEgc3RhdGljIGJhc2UgYW5kIGNhbGwgaXRzIHRwX25ldyAodXN1YWxseQorICAgICAgICAgICAgICAgUHlUeXBlX0dlbmVyaWNOZXcpLCBhZnRlciBwZXJmb3JtaW5nIHZhcmlvdXMKKyAgICAgICAgICAgICAgIHNhbml0eSBjaGVja3MgYW5kIGNvbnN0cnVjdGluZyBhIG5ldyBhcmd1bWVudAorICAgICAgICAgICAgICAgbGlzdC4gIEN1dCBhbGwgdGhhdCBub25zZW5zZSBzaG9ydCAtLSB0aGlzIHNwZWVkcworICAgICAgICAgICAgICAgdXAgaW5zdGFuY2UgY3JlYXRpb24gdHJlbWVuZG91c2x5LiAqLworICAgICAgICAgICAgc3BlY2lmaWMgPSAodm9pZCAqKXR5cGUtPnRwX25ldzsKKyAgICAgICAgICAgIC8qIFhYWCBJJ20gbm90IDEwMCUgc3VyZSB0aGF0IHRoZXJlIGlzbid0IGEgaG9sZQorICAgICAgICAgICAgICAgaW4gdGhpcyByZWFzb25pbmcgdGhhdCByZXF1aXJlcyBhZGRpdGlvbmFsCisgICAgICAgICAgICAgICBzYW5pdHkgY2hlY2tzLiAgSSdsbCBidXkgdGhlIGZpcnN0IHBlcnNvbiB0bworICAgICAgICAgICAgICAgcG9pbnQgb3V0IGEgYnVnIGluIHRoaXMgcmVhc29uaW5nIGEgYmVlci4gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkZXNjciA9PSBQeV9Ob25lICYmCisgICAgICAgICAgICAgICAgIHN0cmNtcChwLT5uYW1lLCAiX19oYXNoX18iKSA9PSAwKSB7CisgICAgICAgICAgICAvKiBXZSBzcGVjaWZpY2FsbHkgYWxsb3cgX19oYXNoX18gdG8gYmUgc2V0IHRvIE5vbmUKKyAgICAgICAgICAgICAgIHRvIHByZXZlbnQgaW5oZXJpdGFuY2Ugb2YgdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGZyb20gb2JqZWN0Ll9faGFzaF9fICovCisgICAgICAgICAgICBzcGVjaWZpYyA9IFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHVzZV9nZW5lcmljID0gMTsKKyAgICAgICAgICAgIGdlbmVyaWMgPSBwLT5mdW5jdGlvbjsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCgrK3ApLT5vZmZzZXQgPT0gb2Zmc2V0KTsKKyAgICBpZiAoc3BlY2lmaWMgJiYgIXVzZV9nZW5lcmljKQorICAgICAgICAqcHRyID0gc3BlY2lmaWM7CisgICAgZWxzZQorICAgICAgICAqcHRyID0gZ2VuZXJpYzsKKyAgICByZXR1cm4gcDsKIH0KIAogLyogSW4gdGhlIHR5cGUsIHVwZGF0ZSB0aGUgc2xvdHMgd2hvc2Ugc2xvdGRlZnMgYXJlIGdhdGhlcmVkIGluIHRoZSBwcCBhcnJheS4KQEAgLTYxNTgsMTEgKzYxNTgsMTEgQEAKIHN0YXRpYyBpbnQKIHVwZGF0ZV9zbG90c19jYWxsYmFjayhQeVR5cGVPYmplY3QgKnR5cGUsIHZvaWQgKmRhdGEpCiB7Ci0Jc2xvdGRlZiAqKnBwID0gKHNsb3RkZWYgKiopZGF0YTsKKyAgICBzbG90ZGVmICoqcHAgPSAoc2xvdGRlZiAqKilkYXRhOwogCi0JZm9yICg7ICpwcDsgcHArKykKLQkJdXBkYXRlX29uZV9zbG90KHR5cGUsICpwcCk7Ci0JcmV0dXJuIDA7CisgICAgZm9yICg7ICpwcDsgcHArKykKKyAgICAgICAgdXBkYXRlX29uZV9zbG90KHR5cGUsICpwcCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHFzb3J0KCkgdG8gY29tcGFyZSBzbG90ZGVmcyBieSB0aGVpciBvZmZzZXQsIGFuZApAQCAtNjE3MCwxNCArNjE3MCwxNCBAQAogc3RhdGljIGludAogc2xvdGRlZl9jbXAoY29uc3Qgdm9pZCAqYWEsIGNvbnN0IHZvaWQgKmJiKQogewotCWNvbnN0IHNsb3RkZWYgKmEgPSAoY29uc3Qgc2xvdGRlZiAqKWFhLCAqYiA9IChjb25zdCBzbG90ZGVmICopYmI7Ci0JaW50IGMgPSBhLT5vZmZzZXQgLSBiLT5vZmZzZXQ7Ci0JaWYgKGMgIT0gMCkKLQkJcmV0dXJuIGM7Ci0JZWxzZQotCQkvKiBDYW5ub3QgdXNlIGEtYiwgYXMgdGhpcyBnaXZlcyBvZmZfdCwgCi0JCSAgIHdoaWNoIG1heSBsb3NlIHByZWNpc2lvbiB3aGVuIGNvbnZlcnRlZCB0byBpbnQuICovCi0JCXJldHVybiAoYSA+IGIpID8gMSA6IChhIDwgYikgPyAtMSA6IDA7CisgICAgY29uc3Qgc2xvdGRlZiAqYSA9IChjb25zdCBzbG90ZGVmICopYWEsICpiID0gKGNvbnN0IHNsb3RkZWYgKiliYjsKKyAgICBpbnQgYyA9IGEtPm9mZnNldCAtIGItPm9mZnNldDsKKyAgICBpZiAoYyAhPSAwKQorICAgICAgICByZXR1cm4gYzsKKyAgICBlbHNlCisgICAgICAgIC8qIENhbm5vdCB1c2UgYS1iLCBhcyB0aGlzIGdpdmVzIG9mZl90LAorICAgICAgICAgICB3aGljaCBtYXkgbG9zZSBwcmVjaXNpb24gd2hlbiBjb252ZXJ0ZWQgdG8gaW50LiAqLworICAgICAgICByZXR1cm4gKGEgPiBiKSA/IDEgOiAoYSA8IGIpID8gLTEgOiAwOwogfQogCiAvKiBJbml0aWFsaXplIHRoZSBzbG90ZGVmcyB0YWJsZSBieSBhZGRpbmcgaW50ZXJuZWQgc3RyaW5nIG9iamVjdHMgZm9yIHRoZQpAQCAtNjE4NSw1NiArNjE4NSw1NiBAQAogc3RhdGljIHZvaWQKIGluaXRfc2xvdGRlZnModm9pZCkKIHsKLQlzbG90ZGVmICpwOwotCXN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworICAgIHNsb3RkZWYgKnA7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CiAKLQlpZiAoaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQlmb3IgKHAgPSBzbG90ZGVmczsgcC0+bmFtZTsgcCsrKSB7Ci0JCXAtPm5hbWVfc3Ryb2JqID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhwLT5uYW1lKTsKLQkJaWYgKCFwLT5uYW1lX3N0cm9iaikKLQkJCVB5X0ZhdGFsRXJyb3IoIk91dCBvZiBtZW1vcnkgaW50ZXJuaW5nIHNsb3RkZWYgbmFtZXMiKTsKLQl9Ci0JcXNvcnQoKHZvaWQgKilzbG90ZGVmcywgKHNpemVfdCkocC1zbG90ZGVmcyksIHNpemVvZihzbG90ZGVmKSwKLQkgICAgICBzbG90ZGVmX2NtcCk7Ci0JaW5pdGlhbGl6ZWQgPSAxOworICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyBwKyspIHsKKyAgICAgICAgcC0+bmFtZV9zdHJvYmogPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKHAtPm5hbWUpOworICAgICAgICBpZiAoIXAtPm5hbWVfc3Ryb2JqKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiT3V0IG9mIG1lbW9yeSBpbnRlcm5pbmcgc2xvdGRlZiBuYW1lcyIpOworICAgIH0KKyAgICBxc29ydCgodm9pZCAqKXNsb3RkZWZzLCAoc2l6ZV90KShwLXNsb3RkZWZzKSwgc2l6ZW9mKHNsb3RkZWYpLAorICAgICAgICAgIHNsb3RkZWZfY21wKTsKKyAgICBpbml0aWFsaXplZCA9IDE7CiB9CiAKIC8qIFVwZGF0ZSB0aGUgc2xvdHMgYWZ0ZXIgYXNzaWdubWVudCB0byBhIGNsYXNzICh0eXBlKSBhdHRyaWJ1dGUuICovCiBzdGF0aWMgaW50CiB1cGRhdGVfc2xvdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lKQogewotCXNsb3RkZWYgKnB0cnNbTUFYX0VRVUlWXTsKLQlzbG90ZGVmICpwOwotCXNsb3RkZWYgKipwcDsKLQlpbnQgb2Zmc2V0OworICAgIHNsb3RkZWYgKnB0cnNbTUFYX0VRVUlWXTsKKyAgICBzbG90ZGVmICpwOworICAgIHNsb3RkZWYgKipwcDsKKyAgICBpbnQgb2Zmc2V0OwogCi0JLyogQ2xlYXIgdGhlIFZBTElEX1ZFUlNJT04gZmxhZyBvZiAndHlwZScgYW5kIGFsbCBpdHMKLQkgICBzdWJjbGFzc2VzLiAgVGhpcyBjb3VsZCBwb3NzaWJseSBiZSB1bmlmaWVkIHdpdGggdGhlCi0JICAgdXBkYXRlX3N1YmNsYXNzZXMoKSByZWN1cnNpb24gYmVsb3csIGJ1dCBjYXJlZnVsbHk6Ci0JICAgdGhleSBlYWNoIGhhdmUgdGhlaXIgb3duIGNvbmRpdGlvbnMgb24gd2hpY2ggdG8gc3RvcAotCSAgIHJlY3Vyc2luZyBpbnRvIHN1YmNsYXNzZXMuICovCi0JUHlUeXBlX01vZGlmaWVkKHR5cGUpOworICAgIC8qIENsZWFyIHRoZSBWQUxJRF9WRVJTSU9OIGZsYWcgb2YgJ3R5cGUnIGFuZCBhbGwgaXRzCisgICAgICAgc3ViY2xhc3Nlcy4gIFRoaXMgY291bGQgcG9zc2libHkgYmUgdW5pZmllZCB3aXRoIHRoZQorICAgICAgIHVwZGF0ZV9zdWJjbGFzc2VzKCkgcmVjdXJzaW9uIGJlbG93LCBidXQgY2FyZWZ1bGx5OgorICAgICAgIHRoZXkgZWFjaCBoYXZlIHRoZWlyIG93biBjb25kaXRpb25zIG9uIHdoaWNoIHRvIHN0b3AKKyAgICAgICByZWN1cnNpbmcgaW50byBzdWJjbGFzc2VzLiAqLworICAgIFB5VHlwZV9Nb2RpZmllZCh0eXBlKTsKIAotCWluaXRfc2xvdGRlZnMoKTsKLQlwcCA9IHB0cnM7Ci0JZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWU7IHArKykgewotCQkvKiBYWFggYXNzdW1lIG5hbWUgaXMgaW50ZXJuZWQhICovCi0JCWlmIChwLT5uYW1lX3N0cm9iaiA9PSBuYW1lKQotCQkJKnBwKysgPSBwOwotCX0KLQkqcHAgPSBOVUxMOwotCWZvciAocHAgPSBwdHJzOyAqcHA7IHBwKyspIHsKLQkJcCA9ICpwcDsKLQkJb2Zmc2V0ID0gcC0+b2Zmc2V0OwotCQl3aGlsZSAocCA+IHNsb3RkZWZzICYmIChwLTEpLT5vZmZzZXQgPT0gb2Zmc2V0KQotCQkJLS1wOwotCQkqcHAgPSBwOwotCX0KLQlpZiAocHRyc1swXSA9PSBOVUxMKQotCQlyZXR1cm4gMDsgLyogTm90IGFuIGF0dHJpYnV0ZSB0aGF0IGFmZmVjdHMgYW55IHNsb3RzICovCi0JcmV0dXJuIHVwZGF0ZV9zdWJjbGFzc2VzKHR5cGUsIG5hbWUsCi0JCQkJIHVwZGF0ZV9zbG90c19jYWxsYmFjaywgKHZvaWQgKilwdHJzKTsKKyAgICBpbml0X3Nsb3RkZWZzKCk7CisgICAgcHAgPSBwdHJzOworICAgIGZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyBwKyspIHsKKyAgICAgICAgLyogWFhYIGFzc3VtZSBuYW1lIGlzIGludGVybmVkISAqLworICAgICAgICBpZiAocC0+bmFtZV9zdHJvYmogPT0gbmFtZSkKKyAgICAgICAgICAgICpwcCsrID0gcDsKKyAgICB9CisgICAgKnBwID0gTlVMTDsKKyAgICBmb3IgKHBwID0gcHRyczsgKnBwOyBwcCsrKSB7CisgICAgICAgIHAgPSAqcHA7CisgICAgICAgIG9mZnNldCA9IHAtPm9mZnNldDsKKyAgICAgICAgd2hpbGUgKHAgPiBzbG90ZGVmcyAmJiAocC0xKS0+b2Zmc2V0ID09IG9mZnNldCkKKyAgICAgICAgICAgIC0tcDsKKyAgICAgICAgKnBwID0gcDsKKyAgICB9CisgICAgaWYgKHB0cnNbMF0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7IC8qIE5vdCBhbiBhdHRyaWJ1dGUgdGhhdCBhZmZlY3RzIGFueSBzbG90cyAqLworICAgIHJldHVybiB1cGRhdGVfc3ViY2xhc3Nlcyh0eXBlLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfc2xvdHNfY2FsbGJhY2ssICh2b2lkICopcHRycyk7CiB9CiAKIC8qIFN0b3JlIHRoZSBwcm9wZXIgZnVuY3Rpb25zIGluIHRoZSBzbG90IGRpc3BhdGNoZXMgYXQgY2xhc3MgKHR5cGUpCkBAIC02MjQzLDIzICs2MjQzLDIzIEBACiBzdGF0aWMgdm9pZAogZml4dXBfc2xvdF9kaXNwYXRjaGVycyhQeVR5cGVPYmplY3QgKnR5cGUpCiB7Ci0Jc2xvdGRlZiAqcDsKKyAgICBzbG90ZGVmICpwOwogCi0JaW5pdF9zbG90ZGVmcygpOwotCWZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyApCi0JCXAgPSB1cGRhdGVfb25lX3Nsb3QodHlwZSwgcCk7CisgICAgaW5pdF9zbG90ZGVmcygpOworICAgIGZvciAocCA9IHNsb3RkZWZzOyBwLT5uYW1lOyApCisgICAgICAgIHAgPSB1cGRhdGVfb25lX3Nsb3QodHlwZSwgcCk7CiB9CiAKIHN0YXRpYyB2b2lkCiB1cGRhdGVfYWxsX3Nsb3RzKFB5VHlwZU9iamVjdCogdHlwZSkKIHsKLQlzbG90ZGVmICpwOworICAgIHNsb3RkZWYgKnA7CiAKLQlpbml0X3Nsb3RkZWZzKCk7Ci0JZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWU7IHArKykgewotCQkvKiB1cGRhdGVfc2xvdCByZXR1cm5zIGludCBidXQgY2FuJ3QgYWN0dWFsbHkgZmFpbCAqLwotCQl1cGRhdGVfc2xvdCh0eXBlLCBwLT5uYW1lX3N0cm9iaik7Ci0JfQorICAgIGluaXRfc2xvdGRlZnMoKTsKKyAgICBmb3IgKHAgPSBzbG90ZGVmczsgcC0+bmFtZTsgcCsrKSB7CisgICAgICAgIC8qIHVwZGF0ZV9zbG90IHJldHVybnMgaW50IGJ1dCBjYW4ndCBhY3R1YWxseSBmYWlsICovCisgICAgICAgIHVwZGF0ZV9zbG90KHR5cGUsIHAtPm5hbWVfc3Ryb2JqKTsKKyAgICB9CiB9CiAKIC8qIHJlY3Vyc2VfZG93bl9zdWJjbGFzc2VzKCkgYW5kIHVwZGF0ZV9zdWJjbGFzc2VzKCkgYXJlIG11dHVhbGx5CkBAIC02MjY4LDU2ICs2MjY4LDU2IEBACiAKIHN0YXRpYyBpbnQKIHVwZGF0ZV9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKm5hbWUsCi0JCSAgdXBkYXRlX2NhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpkYXRhKQorICAgICAgICAgICAgICAgICAgdXBkYXRlX2NhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpkYXRhKQogewotCWlmIChjYWxsYmFjayh0eXBlLCBkYXRhKSA8IDApCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gcmVjdXJzZV9kb3duX3N1YmNsYXNzZXModHlwZSwgbmFtZSwgY2FsbGJhY2ssIGRhdGEpOworICAgIGlmIChjYWxsYmFjayh0eXBlLCBkYXRhKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gcmVjdXJzZV9kb3duX3N1YmNsYXNzZXModHlwZSwgbmFtZSwgY2FsbGJhY2ssIGRhdGEpOwogfQogCiBzdGF0aWMgaW50CiByZWN1cnNlX2Rvd25fc3ViY2xhc3NlcyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpuYW1lLAotCQkJdXBkYXRlX2NhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX2NhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpkYXRhKQogewotCVB5VHlwZU9iamVjdCAqc3ViY2xhc3M7Ci0JUHlPYmplY3QgKnJlZiwgKnN1YmNsYXNzZXMsICpkaWN0OwotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBQeVR5cGVPYmplY3QgKnN1YmNsYXNzOworICAgIFB5T2JqZWN0ICpyZWYsICpzdWJjbGFzc2VzLCAqZGljdDsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKLQlzdWJjbGFzc2VzID0gdHlwZS0+dHBfc3ViY2xhc3NlczsKLQlpZiAoc3ViY2xhc3NlcyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKHN1YmNsYXNzZXMpKTsKLQluID0gUHlMaXN0X0dFVF9TSVpFKHN1YmNsYXNzZXMpOwotCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJcmVmID0gUHlMaXN0X0dFVF9JVEVNKHN1YmNsYXNzZXMsIGkpOwotCQlhc3NlcnQoUHlXZWFrcmVmX0NoZWNrUmVmKHJlZikpOwotCQlzdWJjbGFzcyA9IChQeVR5cGVPYmplY3QgKilQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpOwotCQlhc3NlcnQoc3ViY2xhc3MgIT0gTlVMTCk7Ci0JCWlmICgoUHlPYmplY3QgKilzdWJjbGFzcyA9PSBQeV9Ob25lKQotCQkJY29udGludWU7Ci0JCWFzc2VydChQeVR5cGVfQ2hlY2soc3ViY2xhc3MpKTsKLQkJLyogQXZvaWQgcmVjdXJzaW5nIGRvd24gaW50byB1bmFmZmVjdGVkIGNsYXNzZXMgKi8KLQkJZGljdCA9IHN1YmNsYXNzLT50cF9kaWN0OwotCQlpZiAoZGljdCAhPSBOVUxMICYmIFB5RGljdF9DaGVjayhkaWN0KSAmJgotCQkgICAgUHlEaWN0X0dldEl0ZW0oZGljdCwgbmFtZSkgIT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCQlpZiAodXBkYXRlX3N1YmNsYXNzZXMoc3ViY2xhc3MsIG5hbWUsIGNhbGxiYWNrLCBkYXRhKSA8IDApCi0JCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIHN1YmNsYXNzZXMgPSB0eXBlLT50cF9zdWJjbGFzc2VzOworICAgIGlmIChzdWJjbGFzc2VzID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGFzc2VydChQeUxpc3RfQ2hlY2soc3ViY2xhc3NlcykpOworICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoc3ViY2xhc3Nlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICByZWYgPSBQeUxpc3RfR0VUX0lURU0oc3ViY2xhc3NlcywgaSk7CisgICAgICAgIGFzc2VydChQeVdlYWtyZWZfQ2hlY2tSZWYocmVmKSk7CisgICAgICAgIHN1YmNsYXNzID0gKFB5VHlwZU9iamVjdCAqKVB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZik7CisgICAgICAgIGFzc2VydChzdWJjbGFzcyAhPSBOVUxMKTsKKyAgICAgICAgaWYgKChQeU9iamVjdCAqKXN1YmNsYXNzID09IFB5X05vbmUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYXNzZXJ0KFB5VHlwZV9DaGVjayhzdWJjbGFzcykpOworICAgICAgICAvKiBBdm9pZCByZWN1cnNpbmcgZG93biBpbnRvIHVuYWZmZWN0ZWQgY2xhc3NlcyAqLworICAgICAgICBkaWN0ID0gc3ViY2xhc3MtPnRwX2RpY3Q7CisgICAgICAgIGlmIChkaWN0ICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGRpY3QpICYmCisgICAgICAgICAgICBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKSAhPSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICh1cGRhdGVfc3ViY2xhc3NlcyhzdWJjbGFzcywgbmFtZSwgY2FsbGJhY2ssIGRhdGEpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFB5VHlwZV9SZWFkeSgpIHRvIHBvcHVsYXRlIHRoZSB0eXBlJ3MKICAgIGRpY3Rpb25hcnkgd2l0aCBtZXRob2QgZGVzY3JpcHRvcnMgZm9yIGZ1bmN0aW9uIHNsb3RzLiAgRm9yIGVhY2gKICAgIGZ1bmN0aW9uIHNsb3QgKGxpa2UgdHBfcmVwcikgdGhhdCdzIGRlZmluZWQgaW4gdGhlIHR5cGUsIG9uZSBvciBtb3JlCiAgICBjb3JyZXNwb25kaW5nIGRlc2NyaXB0b3JzIGFyZSBhZGRlZCBpbiB0aGUgdHlwZSdzIHRwX2RpY3QgZGljdGlvbmFyeQotICAgdW5kZXIgdGhlIGFwcHJvcHJpYXRlIG5hbWUgKGxpa2UgX19yZXByX18pLglTb21lIGZ1bmN0aW9uIHNsb3RzCisgICB1bmRlciB0aGUgYXBwcm9wcmlhdGUgbmFtZSAobGlrZSBfX3JlcHJfXykuICBTb21lIGZ1bmN0aW9uIHNsb3RzCiAgICBjYXVzZSBtb3JlIHRoYW4gb25lIGRlc2NyaXB0b3IgdG8gYmUgYWRkZWQgKGZvciBleGFtcGxlLCB0aGUgbmJfYWRkCiAgICBzbG90IGFkZHMgYm90aCBfX2FkZF9fIGFuZCBfX3JhZGRfXyBkZXNjcmlwdG9ycykgYW5kIHNvbWUgZnVuY3Rpb24KICAgIHNsb3RzIGNvbXBldGUgZm9yIHRoZSBzYW1lIGRlc2NyaXB0b3IgKGZvciBleGFtcGxlIGJvdGggc3FfaXRlbSBhbmQKICAgIG1wX3N1YnNjcmlwdCBnZW5lcmF0ZSBhIF9fZ2V0aXRlbV9fIGRlc2NyaXB0b3IpLgogCi0gICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBmaXJzdCBzbG90ZGVmIGVudHJ5IGVuY291dGVyZWQgd2lucy4JIFNpbmNlCisgICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBmaXJzdCBzbG90ZGVmIGVudHJ5IGVuY291dGVyZWQgd2lucy4gIFNpbmNlCiAgICBzbG90ZGVmIGVudHJpZXMgYXJlIHNvcnRlZCBieSB0aGUgb2Zmc2V0IG9mIHRoZSBzbG90IGluIHRoZQogICAgUHlIZWFwVHlwZU9iamVjdCwgdGhpcyBnaXZlcyB1cyBzb21lIGNvbnRyb2wgb3ZlciBkaXNhbWJpZ3VhdGluZwogICAgYmV0d2VlbiBjb21wZXRpbmcgc2xvdHM6IHRoZSBtZW1iZXJzIG9mIFB5SGVhcFR5cGVPYmplY3QgYXJlIGxpc3RlZApAQCAtNjM0MCwyODIgKzYzNDAsMjgyIEBACiBzdGF0aWMgaW50CiBhZGRfb3BlcmF0b3JzKFB5VHlwZU9iamVjdCAqdHlwZSkKIHsKLQlQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7Ci0Jc2xvdGRlZiAqcDsKLQlQeU9iamVjdCAqZGVzY3I7Ci0Jdm9pZCAqKnB0cjsKKyAgICBQeU9iamVjdCAqZGljdCA9IHR5cGUtPnRwX2RpY3Q7CisgICAgc2xvdGRlZiAqcDsKKyAgICBQeU9iamVjdCAqZGVzY3I7CisgICAgdm9pZCAqKnB0cjsKIAotCWluaXRfc2xvdGRlZnMoKTsKLQlmb3IgKHAgPSBzbG90ZGVmczsgcC0+bmFtZTsgcCsrKSB7Ci0JCWlmIChwLT53cmFwcGVyID09IE5VTEwpCi0JCQljb250aW51ZTsKLQkJcHRyID0gc2xvdHB0cih0eXBlLCBwLT5vZmZzZXQpOwotCQlpZiAoIXB0ciB8fCAhKnB0cikKLQkJCWNvbnRpbnVlOwotCQlpZiAoUHlEaWN0X0dldEl0ZW0oZGljdCwgcC0+bmFtZV9zdHJvYmopKQotCQkJY29udGludWU7Ci0JCWlmICgqcHRyID09IFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCkgewotCQkJLyogQ2xhc3NlcyBtYXkgcHJldmVudCB0aGUgaW5oZXJpdGFuY2Ugb2YgdGhlIHRwX2hhc2gKLQkJCSAgIHNsb3QgYnkgc3RvcmluZyBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQgaW4gaXQuIE1ha2UgaXQKLSAJCQkgICB2aXNpYmxlIGFzIGEgTm9uZSB2YWx1ZSBmb3IgdGhlIF9faGFzaF9fIGF0dHJpYnV0ZS4gKi8KLQkJCWlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBwLT5uYW1lX3N0cm9iaiwgUHlfTm9uZSkgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJfQotCQllbHNlIHsKLQkJCWRlc2NyID0gUHlEZXNjcl9OZXdXcmFwcGVyKHR5cGUsIHAsICpwdHIpOwotCQkJaWYgKGRlc2NyID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIHAtPm5hbWVfc3Ryb2JqLCBkZXNjcikgPCAwKQotCQkJCXJldHVybiAtMTsKLQkJCVB5X0RFQ1JFRihkZXNjcik7Ci0JCX0KLQl9Ci0JaWYgKHR5cGUtPnRwX25ldyAhPSBOVUxMKSB7Ci0JCWlmIChhZGRfdHBfbmV3X3dyYXBwZXIodHlwZSkgPCAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpbml0X3Nsb3RkZWZzKCk7CisgICAgZm9yIChwID0gc2xvdGRlZnM7IHAtPm5hbWU7IHArKykgeworICAgICAgICBpZiAocC0+d3JhcHBlciA9PSBOVUxMKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHB0ciA9IHNsb3RwdHIodHlwZSwgcC0+b2Zmc2V0KTsKKyAgICAgICAgaWYgKCFwdHIgfHwgISpwdHIpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtKGRpY3QsIHAtPm5hbWVfc3Ryb2JqKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoKnB0ciA9PSBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQpIHsKKyAgICAgICAgICAgIC8qIENsYXNzZXMgbWF5IHByZXZlbnQgdGhlIGluaGVyaXRhbmNlIG9mIHRoZSB0cF9oYXNoCisgICAgICAgICAgICAgICBzbG90IGJ5IHN0b3JpbmcgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkIGluIGl0LiBNYWtlIGl0CisgICAgICAgICAgICAgICB2aXNpYmxlIGFzIGEgTm9uZSB2YWx1ZSBmb3IgdGhlIF9faGFzaF9fIGF0dHJpYnV0ZS4gKi8KKyAgICAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBwLT5uYW1lX3N0cm9iaiwgUHlfTm9uZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRlc2NyID0gUHlEZXNjcl9OZXdXcmFwcGVyKHR5cGUsIHAsICpwdHIpOworICAgICAgICAgICAgaWYgKGRlc2NyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIHAtPm5hbWVfc3Ryb2JqLCBkZXNjcikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkZXNjcik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHR5cGUtPnRwX25ldyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChhZGRfdHBfbmV3X3dyYXBwZXIodHlwZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCiAvKiBDb29wZXJhdGl2ZSAnc3VwZXInICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JUHlUeXBlT2JqZWN0ICp0eXBlOwotCVB5T2JqZWN0ICpvYmo7Ci0JUHlUeXBlT2JqZWN0ICpvYmpfdHlwZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlUeXBlT2JqZWN0ICp0eXBlOworICAgIFB5T2JqZWN0ICpvYmo7CisgICAgUHlUeXBlT2JqZWN0ICpvYmpfdHlwZTsKIH0gc3VwZXJvYmplY3Q7CiAKIHN0YXRpYyBQeU1lbWJlckRlZiBzdXBlcl9tZW1iZXJzW10gPSB7Ci0JeyJfX3RoaXNjbGFzc19fIiwgVF9PQkpFQ1QsIG9mZnNldG9mKHN1cGVyb2JqZWN0LCB0eXBlKSwgUkVBRE9OTFksCi0JICJ0aGUgY2xhc3MgaW52b2tpbmcgc3VwZXIoKSJ9LAotCXsiX19zZWxmX18iLCAgVF9PQkpFQ1QsIG9mZnNldG9mKHN1cGVyb2JqZWN0LCBvYmopLCBSRUFET05MWSwKLQkgInRoZSBpbnN0YW5jZSBpbnZva2luZyBzdXBlcigpOyBtYXkgYmUgTm9uZSJ9LAotCXsiX19zZWxmX2NsYXNzX18iLCBUX09CSkVDVCwgb2Zmc2V0b2Yoc3VwZXJvYmplY3QsIG9ial90eXBlKSwgUkVBRE9OTFksCi0JICJ0aGUgdHlwZSBvZiB0aGUgaW5zdGFuY2UgaW52b2tpbmcgc3VwZXIoKTsgbWF5IGJlIE5vbmUifSwKLQl7MH0KKyAgICB7Il9fdGhpc2NsYXNzX18iLCBUX09CSkVDVCwgb2Zmc2V0b2Yoc3VwZXJvYmplY3QsIHR5cGUpLCBSRUFET05MWSwKKyAgICAgInRoZSBjbGFzcyBpbnZva2luZyBzdXBlcigpIn0sCisgICAgeyJfX3NlbGZfXyIsICBUX09CSkVDVCwgb2Zmc2V0b2Yoc3VwZXJvYmplY3QsIG9iaiksIFJFQURPTkxZLAorICAgICAidGhlIGluc3RhbmNlIGludm9raW5nIHN1cGVyKCk7IG1heSBiZSBOb25lIn0sCisgICAgeyJfX3NlbGZfY2xhc3NfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihzdXBlcm9iamVjdCwgb2JqX3R5cGUpLCBSRUFET05MWSwKKyAgICAgInRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZSBpbnZva2luZyBzdXBlcigpOyBtYXkgYmUgTm9uZSJ9LAorICAgIHswfQogfTsKIAogc3RhdGljIHZvaWQKIHN1cGVyX2RlYWxsb2MoUHlPYmplY3QgKnNlbGYpCiB7Ci0Jc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKKyAgICBzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOwogCi0JX1B5T2JqZWN0X0dDX1VOVFJBQ0soc2VsZik7Ci0JUHlfWERFQ1JFRihzdS0+b2JqKTsKLQlQeV9YREVDUkVGKHN1LT50eXBlKTsKLQlQeV9YREVDUkVGKHN1LT5vYmpfdHlwZSk7Ci0JUHlfVFlQRShzZWxmKS0+dHBfZnJlZShzZWxmKTsKKyAgICBfUHlPYmplY3RfR0NfVU5UUkFDSyhzZWxmKTsKKyAgICBQeV9YREVDUkVGKHN1LT5vYmopOworICAgIFB5X1hERUNSRUYoc3UtPnR5cGUpOworICAgIFB5X1hERUNSRUYoc3UtPm9ial90eXBlKTsKKyAgICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3VwZXJfcmVwcihQeU9iamVjdCAqc2VsZikKIHsKLQlzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOworICAgIHN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7CiAKLQlpZiAoc3UtPm9ial90eXBlKQotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgKLQkJCSI8c3VwZXI6IDxjbGFzcyAnJXMnPiwgPCVzIG9iamVjdD4+IiwKLQkJCXN1LT50eXBlID8gc3UtPnR5cGUtPnRwX25hbWUgOiAiTlVMTCIsCi0JCQlzdS0+b2JqX3R5cGUtPnRwX25hbWUpOwotCWVsc2UKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21Gb3JtYXQoCi0JCQkiPHN1cGVyOiA8Y2xhc3MgJyVzJz4sIE5VTEw+IiwKLQkJCXN1LT50eXBlID8gc3UtPnR5cGUtPnRwX25hbWUgOiAiTlVMTCIpOworICAgIGlmIChzdS0+b2JqX3R5cGUpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgICAgICAgICAgIjxzdXBlcjogPGNsYXNzICclcyc+LCA8JXMgb2JqZWN0Pj4iLAorICAgICAgICAgICAgc3UtPnR5cGUgPyBzdS0+dHlwZS0+dHBfbmFtZSA6ICJOVUxMIiwKKyAgICAgICAgICAgIHN1LT5vYmpfdHlwZS0+dHBfbmFtZSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbUZvcm1hdCgKKyAgICAgICAgICAgICI8c3VwZXI6IDxjbGFzcyAnJXMnPiwgTlVMTD4iLAorICAgICAgICAgICAgc3UtPnR5cGUgPyBzdS0+dHlwZS0+dHBfbmFtZSA6ICJOVUxMIik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdXBlcl9nZXRhdHRybyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5hbWUpCiB7Ci0Jc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKLQlpbnQgc2tpcCA9IHN1LT5vYmpfdHlwZSA9PSBOVUxMOworICAgIHN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7CisgICAgaW50IHNraXAgPSBzdS0+b2JqX3R5cGUgPT0gTlVMTDsKIAotCWlmICghc2tpcCkgewotCQkvKiBXZSB3YW50IF9fY2xhc3NfXyB0byByZXR1cm4gdGhlIGNsYXNzIG9mIHRoZSBzdXBlciBvYmplY3QKLQkJICAgKGkuZS4gc3VwZXIsIG9yIGEgc3ViY2xhc3MpLCBub3QgdGhlIGNsYXNzIG9mIHN1LT5vYmouICovCi0JCXNraXAgPSAoUHlTdHJpbmdfQ2hlY2sobmFtZSkgJiYKLQkJCVB5U3RyaW5nX0dFVF9TSVpFKG5hbWUpID09IDkgJiYKLQkJCXN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobmFtZSksICJfX2NsYXNzX18iKSA9PSAwKTsKLQl9CisgICAgaWYgKCFza2lwKSB7CisgICAgICAgIC8qIFdlIHdhbnQgX19jbGFzc19fIHRvIHJldHVybiB0aGUgY2xhc3Mgb2YgdGhlIHN1cGVyIG9iamVjdAorICAgICAgICAgICAoaS5lLiBzdXBlciwgb3IgYSBzdWJjbGFzcyksIG5vdCB0aGUgY2xhc3Mgb2Ygc3UtPm9iai4gKi8KKyAgICAgICAgc2tpcCA9IChQeVN0cmluZ19DaGVjayhuYW1lKSAmJgorICAgICAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUobmFtZSkgPT0gOSAmJgorICAgICAgICAgICAgc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgIl9fY2xhc3NfXyIpID09IDApOworICAgIH0KIAotCWlmICghc2tpcCkgewotCQlQeU9iamVjdCAqbXJvLCAqcmVzLCAqdG1wLCAqZGljdDsKLQkJUHlUeXBlT2JqZWN0ICpzdGFydHR5cGU7Ci0JCWRlc2NyZ2V0ZnVuYyBmOwotCQlQeV9zc2l6ZV90IGksIG47CisgICAgaWYgKCFza2lwKSB7CisgICAgICAgIFB5T2JqZWN0ICptcm8sICpyZXMsICp0bXAsICpkaWN0OworICAgICAgICBQeVR5cGVPYmplY3QgKnN0YXJ0dHlwZTsKKyAgICAgICAgZGVzY3JnZXRmdW5jIGY7CisgICAgICAgIFB5X3NzaXplX3QgaSwgbjsKIAotCQlzdGFydHR5cGUgPSBzdS0+b2JqX3R5cGU7Ci0JCW1ybyA9IHN0YXJ0dHlwZS0+dHBfbXJvOworICAgICAgICBzdGFydHR5cGUgPSBzdS0+b2JqX3R5cGU7CisgICAgICAgIG1ybyA9IHN0YXJ0dHlwZS0+dHBfbXJvOwogCi0JCWlmIChtcm8gPT0gTlVMTCkKLQkJCW4gPSAwOwotCQllbHNlIHsKLQkJCWFzc2VydChQeVR1cGxlX0NoZWNrKG1ybykpOwotCQkJbiA9IFB5VHVwbGVfR0VUX1NJWkUobXJvKTsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlpZiAoKFB5T2JqZWN0ICopKHN1LT50eXBlKSA9PSBQeVR1cGxlX0dFVF9JVEVNKG1ybywgaSkpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaSsrOwotCQlyZXMgPSBOVUxMOwotCQlmb3IgKDsgaSA8IG47IGkrKykgewotCQkJdG1wID0gUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpOwotCQkJaWYgKFB5VHlwZV9DaGVjayh0bXApKQotCQkJCWRpY3QgPSAoKFB5VHlwZU9iamVjdCAqKXRtcCktPnRwX2RpY3Q7Ci0JCQllbHNlIGlmIChQeUNsYXNzX0NoZWNrKHRtcCkpCi0JCQkJZGljdCA9ICgoUHlDbGFzc09iamVjdCAqKXRtcCktPmNsX2RpY3Q7Ci0JCQllbHNlCi0JCQkJY29udGludWU7Ci0JCQlyZXMgPSBQeURpY3RfR2V0SXRlbShkaWN0LCBuYW1lKTsKLQkJCWlmIChyZXMgIT0gTlVMTCkgewotCQkJCVB5X0lOQ1JFRihyZXMpOwotCQkJCWYgPSBQeV9UWVBFKHJlcyktPnRwX2Rlc2NyX2dldDsKLQkJCQlpZiAoZiAhPSBOVUxMKSB7Ci0JCQkJCXRtcCA9IGYocmVzLAotCQkJCQkJLyogT25seSBwYXNzICdvYmonIHBhcmFtIGlmCi0JCQkJCQkgICB0aGlzIGlzIGluc3RhbmNlLW1vZGUgc3VwZXIgCi0JCQkJCQkgICAoU2VlIFNGIElEICM3NDM2MjcpCi0JCQkJCQkqLwotCQkJCQkJKHN1LT5vYmogPT0gKFB5T2JqZWN0ICopCi0JCQkJCQkJICAgIHN1LT5vYmpfdHlwZSAKLQkJCQkJCQk/IChQeU9iamVjdCAqKU5VTEwgCi0JCQkJCQkJOiBzdS0+b2JqKSwKLQkJCQkJCShQeU9iamVjdCAqKXN0YXJ0dHlwZSk7Ci0JCQkJCVB5X0RFQ1JFRihyZXMpOwotCQkJCQlyZXMgPSB0bXA7Ci0JCQkJfQotCQkJCXJldHVybiByZXM7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKHNlbGYsIG5hbWUpOworICAgICAgICBpZiAobXJvID09IE5VTEwpCisgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoUHlUdXBsZV9DaGVjayhtcm8pKTsKKyAgICAgICAgICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKG1ybyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgaWYgKChQeU9iamVjdCAqKShzdS0+dHlwZSkgPT0gUHlUdXBsZV9HRVRfSVRFTShtcm8sIGkpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICAgICAgcmVzID0gTlVMTDsKKyAgICAgICAgZm9yICg7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHRtcCA9IFB5VHVwbGVfR0VUX0lURU0obXJvLCBpKTsKKyAgICAgICAgICAgIGlmIChQeVR5cGVfQ2hlY2sodG1wKSkKKyAgICAgICAgICAgICAgICBkaWN0ID0gKChQeVR5cGVPYmplY3QgKil0bXApLT50cF9kaWN0OworICAgICAgICAgICAgZWxzZSBpZiAoUHlDbGFzc19DaGVjayh0bXApKQorICAgICAgICAgICAgICAgIGRpY3QgPSAoKFB5Q2xhc3NPYmplY3QgKil0bXApLT5jbF9kaWN0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcmVzID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgbmFtZSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYocmVzKTsKKyAgICAgICAgICAgICAgICBmID0gUHlfVFlQRShyZXMpLT50cF9kZXNjcl9nZXQ7CisgICAgICAgICAgICAgICAgaWYgKGYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBmKHJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9ubHkgcGFzcyAnb2JqJyBwYXJhbSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBpbnN0YW5jZS1tb2RlIHN1cGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2VlIFNGIElEICM3NDM2MjcpCisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHN1LT5vYmogPT0gKFB5T2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdS0+b2JqX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChQeU9iamVjdCAqKU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN1LT5vYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopc3RhcnR0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHRtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoc2VsZiwgbmFtZSk7CiB9CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKgogc3VwZXJjaGVjayhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpvYmopCiB7Ci0JLyogQ2hlY2sgdGhhdCBhIHN1cGVyKCkgY2FsbCBtYWtlcyBzZW5zZS4gIFJldHVybiBhIHR5cGUgb2JqZWN0LgorICAgIC8qIENoZWNrIHRoYXQgYSBzdXBlcigpIGNhbGwgbWFrZXMgc2Vuc2UuICBSZXR1cm4gYSB0eXBlIG9iamVjdC4KIAotCSAgIG9iaiBjYW4gYmUgYSBuZXctc3R5bGUgY2xhc3MsIG9yIGFuIGluc3RhbmNlIG9mIG9uZToKKyAgICAgICBvYmogY2FuIGJlIGEgbmV3LXN0eWxlIGNsYXNzLCBvciBhbiBpbnN0YW5jZSBvZiBvbmU6CiAKLQkgICAtIElmIGl0IGlzIGEgY2xhc3MsIGl0IG11c3QgYmUgYSBzdWJjbGFzcyBvZiAndHlwZScuCSBUaGlzIGNhc2UgaXMKLQkgICAgIHVzZWQgZm9yIGNsYXNzIG1ldGhvZHM7IHRoZSByZXR1cm4gdmFsdWUgaXMgb2JqLgorICAgICAgIC0gSWYgaXQgaXMgYSBjbGFzcywgaXQgbXVzdCBiZSBhIHN1YmNsYXNzIG9mICd0eXBlJy4gICAgICBUaGlzIGNhc2UgaXMKKyAgICAgICAgIHVzZWQgZm9yIGNsYXNzIG1ldGhvZHM7IHRoZSByZXR1cm4gdmFsdWUgaXMgb2JqLgogCi0JICAgLSBJZiBpdCBpcyBhbiBpbnN0YW5jZSwgaXQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiAndHlwZScuICBUaGlzIGlzCi0JICAgICB0aGUgbm9ybWFsIGNhc2U7IHRoZSByZXR1cm4gdmFsdWUgaXMgb2JqLl9fY2xhc3NfXy4KKyAgICAgICAtIElmIGl0IGlzIGFuIGluc3RhbmNlLCBpdCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mICd0eXBlJy4gIFRoaXMgaXMKKyAgICAgICAgIHRoZSBub3JtYWwgY2FzZTsgdGhlIHJldHVybiB2YWx1ZSBpcyBvYmouX19jbGFzc19fLgogCi0JICAgQnV0Li4uIHdoZW4gb2JqIGlzIGFuIGluc3RhbmNlLCB3ZSB3YW50IHRvIGFsbG93IGZvciB0aGUgY2FzZSB3aGVyZQotCSAgIFB5X1RZUEUob2JqKSBpcyBub3QgYSBzdWJjbGFzcyBvZiB0eXBlLCBidXQgb2JqLl9fY2xhc3NfXyBpcyEKLQkgICBUaGlzIHdpbGwgYWxsb3cgdXNpbmcgc3VwZXIoKSB3aXRoIGEgcHJveHkgZm9yIG9iai4KLQkqLworICAgICAgIEJ1dC4uLiB3aGVuIG9iaiBpcyBhbiBpbnN0YW5jZSwgd2Ugd2FudCB0byBhbGxvdyBmb3IgdGhlIGNhc2Ugd2hlcmUKKyAgICAgICBQeV9UWVBFKG9iaikgaXMgbm90IGEgc3ViY2xhc3Mgb2YgdHlwZSwgYnV0IG9iai5fX2NsYXNzX18gaXMhCisgICAgICAgVGhpcyB3aWxsIGFsbG93IHVzaW5nIHN1cGVyKCkgd2l0aCBhIHByb3h5IGZvciBvYmouCisgICAgKi8KIAotCS8qIENoZWNrIGZvciBmaXJzdCBidWxsZXQgYWJvdmUgKHNwZWNpYWwgY2FzZSkgKi8KLQlpZiAoUHlUeXBlX0NoZWNrKG9iaikgJiYgUHlUeXBlX0lzU3VidHlwZSgoUHlUeXBlT2JqZWN0ICopb2JqLCB0eXBlKSkgewotCQlQeV9JTkNSRUYob2JqKTsKLQkJcmV0dXJuIChQeVR5cGVPYmplY3QgKilvYmo7Ci0JfQorICAgIC8qIENoZWNrIGZvciBmaXJzdCBidWxsZXQgYWJvdmUgKHNwZWNpYWwgY2FzZSkgKi8KKyAgICBpZiAoUHlUeXBlX0NoZWNrKG9iaikgJiYgUHlUeXBlX0lzU3VidHlwZSgoUHlUeXBlT2JqZWN0ICopb2JqLCB0eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICAgICAgcmV0dXJuIChQeVR5cGVPYmplY3QgKilvYmo7CisgICAgfQogCi0JLyogTm9ybWFsIGNhc2UgKi8KLQlpZiAoUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iaiksIHR5cGUpKSB7Ci0JCVB5X0lOQ1JFRihQeV9UWVBFKG9iaikpOwotCQlyZXR1cm4gUHlfVFlQRShvYmopOwotCX0KLQllbHNlIHsKLQkJLyogVHJ5IHRoZSBzbG93IHdheSAqLwotCQlzdGF0aWMgUHlPYmplY3QgKmNsYXNzX3N0ciA9IE5VTEw7Ci0JCVB5T2JqZWN0ICpjbGFzc19hdHRyOworICAgIC8qIE5vcm1hbCBjYXNlICovCisgICAgaWYgKFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYmopLCB0eXBlKSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfVFlQRShvYmopKTsKKyAgICAgICAgcmV0dXJuIFB5X1RZUEUob2JqKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFRyeSB0aGUgc2xvdyB3YXkgKi8KKyAgICAgICAgc3RhdGljIFB5T2JqZWN0ICpjbGFzc19zdHIgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqY2xhc3NfYXR0cjsKIAotCQlpZiAoY2xhc3Nfc3RyID09IE5VTEwpIHsKLQkJCWNsYXNzX3N0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl9fY2xhc3NfXyIpOwotCQkJaWYgKGNsYXNzX3N0ciA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQl9CisgICAgICAgIGlmIChjbGFzc19zdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgY2xhc3Nfc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19jbGFzc19fIik7CisgICAgICAgICAgICBpZiAoY2xhc3Nfc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAotCQljbGFzc19hdHRyID0gUHlPYmplY3RfR2V0QXR0cihvYmosIGNsYXNzX3N0cik7CisgICAgICAgIGNsYXNzX2F0dHIgPSBQeU9iamVjdF9HZXRBdHRyKG9iaiwgY2xhc3Nfc3RyKTsKIAotCQlpZiAoY2xhc3NfYXR0ciAhPSBOVUxMICYmCi0JCSAgICBQeVR5cGVfQ2hlY2soY2xhc3NfYXR0cikgJiYKLQkJICAgIChQeVR5cGVPYmplY3QgKiljbGFzc19hdHRyICE9IFB5X1RZUEUob2JqKSkKLQkJewotCQkJaW50IG9rID0gUHlUeXBlX0lzU3VidHlwZSgKLQkJCQkoUHlUeXBlT2JqZWN0ICopY2xhc3NfYXR0ciwgdHlwZSk7Ci0JCQlpZiAob2spCi0JCQkJcmV0dXJuIChQeVR5cGVPYmplY3QgKiljbGFzc19hdHRyOwotCQl9CisgICAgICAgIGlmIChjbGFzc19hdHRyICE9IE5VTEwgJiYKKyAgICAgICAgICAgIFB5VHlwZV9DaGVjayhjbGFzc19hdHRyKSAmJgorICAgICAgICAgICAgKFB5VHlwZU9iamVjdCAqKWNsYXNzX2F0dHIgIT0gUHlfVFlQRShvYmopKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgb2sgPSBQeVR5cGVfSXNTdWJ0eXBlKAorICAgICAgICAgICAgICAgIChQeVR5cGVPYmplY3QgKiljbGFzc19hdHRyLCB0eXBlKTsKKyAgICAgICAgICAgIGlmIChvaykKKyAgICAgICAgICAgICAgICByZXR1cm4gKFB5VHlwZU9iamVjdCAqKWNsYXNzX2F0dHI7CisgICAgICAgIH0KIAotCQlpZiAoY2xhc3NfYXR0ciA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZQotCQkJUHlfREVDUkVGKGNsYXNzX2F0dHIpOwotCX0KKyAgICAgICAgaWYgKGNsYXNzX2F0dHIgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjbGFzc19hdHRyKTsKKyAgICB9CiAKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJInN1cGVyKHR5cGUsIG9iaik6ICIKLQkJCSJvYmogbXVzdCBiZSBhbiBpbnN0YW5jZSBvciBzdWJ0eXBlIG9mIHR5cGUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAic3VwZXIodHlwZSwgb2JqKTogIgorICAgICAgICAgICAgICAgICAgICAib2JqIG11c3QgYmUgYW4gaW5zdGFuY2Ugb3Igc3VidHlwZSBvZiB0eXBlIik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzdXBlcl9kZXNjcl9nZXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp0eXBlKQogewotCXN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7Ci0Jc3VwZXJvYmplY3QgKm5ld29iajsKKyAgICBzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOworICAgIHN1cGVyb2JqZWN0ICpuZXdvYmo7CiAKLQlpZiAob2JqID09IE5VTEwgfHwgb2JqID09IFB5X05vbmUgfHwgc3UtPm9iaiAhPSBOVUxMKSB7Ci0JCS8qIE5vdCBiaW5kaW5nIHRvIGFuIG9iamVjdCwgb3IgYWxyZWFkeSBib3VuZCAqLwotCQlQeV9JTkNSRUYoc2VsZik7Ci0JCXJldHVybiBzZWxmOwotCX0KLQlpZiAoUHlfVFlQRShzdSkgIT0gJlB5U3VwZXJfVHlwZSkKLQkJLyogSWYgc3UgaXMgYW4gaW5zdGFuY2Ugb2YgYSAoc3RyaWN0KSBzdWJjbGFzcyBvZiBzdXBlciwKLQkJICAgY2FsbCBpdHMgdHlwZSAqLwotCQlyZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QgKilQeV9UWVBFKHN1KSwKLQkJCQkJCSAgICBzdS0+dHlwZSwgb2JqLCBOVUxMKTsKLQllbHNlIHsKLQkJLyogSW5saW5lIHRoZSBjb21tb24gY2FzZSAqLwotCQlQeVR5cGVPYmplY3QgKm9ial90eXBlID0gc3VwZXJjaGVjayhzdS0+dHlwZSwgb2JqKTsKLQkJaWYgKG9ial90eXBlID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJbmV3b2JqID0gKHN1cGVyb2JqZWN0ICopUHlTdXBlcl9UeXBlLnRwX25ldygmUHlTdXBlcl9UeXBlLAotCQkJCQkJCSBOVUxMLCBOVUxMKTsKLQkJaWYgKG5ld29iaiA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCVB5X0lOQ1JFRihzdS0+dHlwZSk7Ci0JCVB5X0lOQ1JFRihvYmopOwotCQluZXdvYmotPnR5cGUgPSBzdS0+dHlwZTsKLQkJbmV3b2JqLT5vYmogPSBvYmo7Ci0JCW5ld29iai0+b2JqX3R5cGUgPSBvYmpfdHlwZTsKLQkJcmV0dXJuIChQeU9iamVjdCAqKW5ld29iajsKLQl9CisgICAgaWYgKG9iaiA9PSBOVUxMIHx8IG9iaiA9PSBQeV9Ob25lIHx8IHN1LT5vYmogIT0gTlVMTCkgeworICAgICAgICAvKiBOb3QgYmluZGluZyB0byBhbiBvYmplY3QsIG9yIGFscmVhZHkgYm91bmQgKi8KKyAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICByZXR1cm4gc2VsZjsKKyAgICB9CisgICAgaWYgKFB5X1RZUEUoc3UpICE9ICZQeVN1cGVyX1R5cGUpCisgICAgICAgIC8qIElmIHN1IGlzIGFuIGluc3RhbmNlIG9mIGEgKHN0cmljdCkgc3ViY2xhc3Mgb2Ygc3VwZXIsCisgICAgICAgICAgIGNhbGwgaXRzIHR5cGUgKi8KKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0ICopUHlfVFlQRShzdSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1LT50eXBlLCBvYmosIE5VTEwpOworICAgIGVsc2UgeworICAgICAgICAvKiBJbmxpbmUgdGhlIGNvbW1vbiBjYXNlICovCisgICAgICAgIFB5VHlwZU9iamVjdCAqb2JqX3R5cGUgPSBzdXBlcmNoZWNrKHN1LT50eXBlLCBvYmopOworICAgICAgICBpZiAob2JqX3R5cGUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBuZXdvYmogPSAoc3VwZXJvYmplY3QgKilQeVN1cGVyX1R5cGUudHBfbmV3KCZQeVN1cGVyX1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmIChuZXdvYmogPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9JTkNSRUYoc3UtPnR5cGUpOworICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICAgICAgbmV3b2JqLT50eXBlID0gc3UtPnR5cGU7CisgICAgICAgIG5ld29iai0+b2JqID0gb2JqOworICAgICAgICBuZXdvYmotPm9ial90eXBlID0gb2JqX3R5cGU7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdvYmo7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBzdXBlcl9pbml0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0Jc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKLQlQeVR5cGVPYmplY3QgKnR5cGU7Ci0JUHlPYmplY3QgKm9iaiA9IE5VTEw7Ci0JUHlUeXBlT2JqZWN0ICpvYmpfdHlwZSA9IE5VTEw7CisgICAgc3VwZXJvYmplY3QgKnN1ID0gKHN1cGVyb2JqZWN0ICopc2VsZjsKKyAgICBQeVR5cGVPYmplY3QgKnR5cGU7CisgICAgUHlPYmplY3QgKm9iaiA9IE5VTEw7CisgICAgUHlUeXBlT2JqZWN0ICpvYmpfdHlwZSA9IE5VTEw7CiAKLQlpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJzdXBlciIsIGt3ZHMpKQotCQlyZXR1cm4gLTE7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOnN1cGVyIiwgJlB5VHlwZV9UeXBlLCAmdHlwZSwgJm9iaikpCi0JCXJldHVybiAtMTsKLQlpZiAob2JqID09IFB5X05vbmUpCi0JCW9iaiA9IE5VTEw7Ci0JaWYgKG9iaiAhPSBOVUxMKSB7Ci0JCW9ial90eXBlID0gc3VwZXJjaGVjayh0eXBlLCBvYmopOwotCQlpZiAob2JqX3R5cGUgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJUHlfSU5DUkVGKG9iaik7Ci0JfQotCVB5X0lOQ1JFRih0eXBlKTsKLQlzdS0+dHlwZSA9IHR5cGU7Ci0Jc3UtPm9iaiA9IG9iajsKLQlzdS0+b2JqX3R5cGUgPSBvYmpfdHlwZTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJzdXBlciIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXxPOnN1cGVyIiwgJlB5VHlwZV9UeXBlLCAmdHlwZSwgJm9iaikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAob2JqID09IFB5X05vbmUpCisgICAgICAgIG9iaiA9IE5VTEw7CisgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgIG9ial90eXBlID0gc3VwZXJjaGVjayh0eXBlLCBvYmopOworICAgICAgICBpZiAob2JqX3R5cGUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgfQorICAgIFB5X0lOQ1JFRih0eXBlKTsKKyAgICBzdS0+dHlwZSA9IHR5cGU7CisgICAgc3UtPm9iaiA9IG9iajsKKyAgICBzdS0+b2JqX3R5cGUgPSBvYmpfdHlwZTsKKyAgICByZXR1cm4gMDsKIH0KIAogUHlEb2NfU1RSVkFSKHN1cGVyX2RvYywKQEAgLTY2MjUsNjAgKzY2MjUsNjAgQEAKICJUeXBpY2FsIHVzZSB0byBjYWxsIGEgY29vcGVyYXRpdmUgc3VwZXJjbGFzcyBtZXRob2Q6XG4iCiAiY2xhc3MgQyhCKTpcbiIKICIgICAgZGVmIG1ldGgoc2VsZiwgYXJnKTpcbiIKLSIJIHN1cGVyKEMsIHNlbGYpLm1ldGgoYXJnKSIpOworIiAgICAgICAgc3VwZXIoQywgc2VsZikubWV0aChhcmcpIik7CiAKIHN0YXRpYyBpbnQKIHN1cGVyX3RyYXZlcnNlKFB5T2JqZWN0ICpzZWxmLCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLQlzdXBlcm9iamVjdCAqc3UgPSAoc3VwZXJvYmplY3QgKilzZWxmOworICAgIHN1cGVyb2JqZWN0ICpzdSA9IChzdXBlcm9iamVjdCAqKXNlbGY7CiAKLQlQeV9WSVNJVChzdS0+b2JqKTsKLQlQeV9WSVNJVChzdS0+dHlwZSk7Ci0JUHlfVklTSVQoc3UtPm9ial90eXBlKTsKKyAgICBQeV9WSVNJVChzdS0+b2JqKTsKKyAgICBQeV9WSVNJVChzdS0+dHlwZSk7CisgICAgUHlfVklTSVQoc3UtPm9ial90eXBlKTsKIAotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiBQeVR5cGVPYmplY3QgUHlTdXBlcl9UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInN1cGVyIiwJCQkJLyogdHBfbmFtZSAqLwotCXNpemVvZihzdXBlcm9iamVjdCksCQkJLyogdHBfYmFzaWNzaXplICovCi0JMCwJCQkJCS8qIHRwX2l0ZW1zaXplICovCi0JLyogbWV0aG9kcyAqLwotCXN1cGVyX2RlYWxsb2MsCQkJCS8qIHRwX2RlYWxsb2MgKi8KLQkwLAkJCQkJLyogdHBfcHJpbnQgKi8KLQkwLAkJCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCQkvKiB0cF9zZXRhdHRyICovCi0JMCwJCQkJCS8qIHRwX2NvbXBhcmUgKi8KLQlzdXBlcl9yZXByLAkJCQkvKiB0cF9yZXByICovCi0JMCwJCQkJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlzdXBlcl9nZXRhdHRybywJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0cm8gKi8KLQkwLAkJCQkJLyogdHBfYXNfYnVmZmVyICovCi0JUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLQkJUHlfVFBGTEFHU19CQVNFVFlQRSwJCS8qIHRwX2ZsYWdzICovCi0Jc3VwZXJfZG9jLAkJCQkvKiB0cF9kb2MgKi8KLQlzdXBlcl90cmF2ZXJzZSwJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0Jc3VwZXJfbWVtYmVycywJCQkJLyogdHBfbWVtYmVycyAqLwotCTAsCQkJCQkvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCi0Jc3VwZXJfZGVzY3JfZ2V0LAkJCS8qIHRwX2Rlc2NyX2dldCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLAkJCQkJLyogdHBfZGljdG9mZnNldCAqLwotCXN1cGVyX2luaXQsCQkJCS8qIHRwX2luaXQgKi8KLQlQeVR5cGVfR2VuZXJpY0FsbG9jLAkJCS8qIHRwX2FsbG9jICovCi0JUHlUeXBlX0dlbmVyaWNOZXcsCQkJLyogdHBfbmV3ICovCi0JUHlPYmplY3RfR0NfRGVsLAkJCS8qIHRwX2ZyZWUgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzdXBlciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgIHNpemVvZihzdXBlcm9iamVjdCksICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICBzdXBlcl9kZWFsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgc3VwZXJfcmVwciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBzdXBlcl9nZXRhdHRybywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgc3VwZXJfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICBzdXBlcl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIHN1cGVyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgc3VwZXJfZGVzY3JfZ2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIHN1cGVyX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKZGlmZiAtLWdpdCBhL09iamVjdHMvdW5pY29kZWN0eXBlLmMgYi9PYmplY3RzL3VuaWNvZGVjdHlwZS5jCmluZGV4IDJhZmFmYjguLjc4YzQwYjUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvdW5pY29kZWN0eXBlLmMKKysrIGIvT2JqZWN0cy91bmljb2RlY3R5cGUuYwpAQCAtMzksMTIgKzM5LDEyIEBACiAKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBpZiAoY29kZSA+PSAweDExMDAwMCkKLSAgICAgICAgaW5kZXggPSAwOworICAgIGluZGV4ID0gMDsKICAgICBlbHNlCiAjZW5kaWYKICAgICB7Ci0gICAgICAgIGluZGV4ID0gaW5kZXgxWyhjb2RlPj5TSElGVCldOwotICAgICAgICBpbmRleCA9IGluZGV4MlsoaW5kZXg8PFNISUZUKSsoY29kZSYoKDE8PFNISUZUKS0xKSldOworICAgIGluZGV4ID0gaW5kZXgxWyhjb2RlPj5TSElGVCldOworICAgIGluZGV4ID0gaW5kZXgyWyhpbmRleDw8U0hJRlQpKyhjb2RlJigoMTw8U0hJRlQpLTEpKV07CiAgICAgfQogCiAgICAgcmV0dXJuICZfUHlVbmljb2RlX1R5cGVSZWNvcmRzW2luZGV4XTsKQEAgLTY0LDkgKzY0LDkgQEAKICAgICBjYXNlIDB4MDA4NTogLyogTkVYVCBMSU5FICovCiAgICAgY2FzZSAweDIwMjg6IC8qIExJTkUgU0VQQVJBVE9SICovCiAgICAgY2FzZSAweDIwMjk6IC8qIFBBUkFHUkFQSCBTRVBBUkFUT1IgKi8KLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKICAgICBkZWZhdWx0OgotCXJldHVybiAwOworICAgIHJldHVybiAwOwogICAgIH0KIH0KIApAQCAtNzksMTAgKzc5LDEwIEBACiAgICAgaW50IGRlbHRhID0gY3R5cGUtPnRpdGxlOwogCiAgICAgaWYgKGN0eXBlLT5mbGFncyAmIE5PREVMVEFfTUFTSykKLQlyZXR1cm4gZGVsdGE7CisgICAgcmV0dXJuIGRlbHRhOwogCiAgICAgaWYgKGRlbHRhID49IDMyNzY4KQotCSAgICBkZWx0YSAtPSA2NTUzNjsKKyAgICAgICAgZGVsdGEgLT0gNjU1MzY7CiAKICAgICByZXR1cm4gY2ggKyBkZWx0YTsKIH0KQEAgLTExMCw3ICsxMTAsNyBAQAogaW50IF9QeVVuaWNvZGVfSXNEZWNpbWFsRGlnaXQoUHlfVU5JQ09ERSBjaCkKIHsKICAgICBpZiAoX1B5VW5pY29kZV9Ub0RlY2ltYWxEaWdpdChjaCkgPCAwKQotCXJldHVybiAwOworICAgIHJldHVybiAwOwogICAgIHJldHVybiAxOwogfQogCkBAIC0xMjcsNyArMTI3LDcgQEAKIGludCBfUHlVbmljb2RlX0lzRGlnaXQoUHlfVU5JQ09ERSBjaCkKIHsKICAgICBpZiAoX1B5VW5pY29kZV9Ub0RpZ2l0KGNoKSA8IDApCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTE0MCwxMyArMTQwLDEzIEBACiB7CiAgICAgc3dpdGNoIChjaCkgewogICAgIGNhc2UgMHgwRjMzOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgLTEgLyAyOworICAgIHJldHVybiAoZG91YmxlKSAtMSAvIDI7CiAgICAgY2FzZSAweDE3RjA6CiAgICAgY2FzZSAweDMwMDc6CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMThBOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDA7CisgICAgcmV0dXJuIChkb3VibGUpIDA7CiAgICAgY2FzZSAweDA5RjQ6CiAgICAgY2FzZSAweDE3RjE6CiAgICAgY2FzZSAweDIxNUY6CkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICBjYXNlIDB4MTAzMjA6CiAgICAgY2FzZSAweDEwM0QxOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDE7CisgICAgcmV0dXJuIChkb3VibGUpIDE7CiAgICAgY2FzZSAweDAwQkQ6CiAgICAgY2FzZSAweDBGMkE6CiAgICAgY2FzZSAweDJDRkQ6CkBAIC0xNzQsMjAgKzE3NCwyMCBAQAogICAgIGNhc2UgMHgxMDE3NToKICAgICBjYXNlIDB4MTAxNzY6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgMSAvIDI7CisgICAgcmV0dXJuIChkb3VibGUpIDEgLyAyOwogICAgIGNhc2UgMHgyMTUzOgotCXJldHVybiAoZG91YmxlKSAxIC8gMzsKKyAgICByZXR1cm4gKGRvdWJsZSkgMSAvIDM7CiAgICAgY2FzZSAweDAwQkM6CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTQwOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDEgLyA0OworICAgIHJldHVybiAoZG91YmxlKSAxIC8gNDsKICAgICBjYXNlIDB4MjE1NToKLQlyZXR1cm4gKGRvdWJsZSkgMSAvIDU7CisgICAgcmV0dXJuIChkb3VibGUpIDEgLyA1OwogICAgIGNhc2UgMHgyMTU5OgotCXJldHVybiAoZG91YmxlKSAxIC8gNjsKKyAgICByZXR1cm4gKGRvdWJsZSkgMSAvIDY7CiAgICAgY2FzZSAweDIxNUI6Ci0JcmV0dXJuIChkb3VibGUpIDEgLyA4OworICAgIHJldHVybiAoZG91YmxlKSAxIC8gODsKICAgICBjYXNlIDB4MEJGMDoKICAgICBjYXNlIDB4MTM3MjoKICAgICBjYXNlIDB4MjE2OToKQEAgLTIxNiw3ICsyMTYsNyBAQAogICAgIGNhc2UgMHgxMDNEMzoKICAgICBjYXNlIDB4MTBBNDQ6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgMTA7CisgICAgcmV0dXJuIChkb3VibGUpIDEwOwogICAgIGNhc2UgMHgwQkYxOgogICAgIGNhc2UgMHgxMzdCOgogICAgIGNhc2UgMHgyMTZEOgpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgY2FzZSAweDEwM0Q1OgogICAgIGNhc2UgMHgxMEE0NjoKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSAxMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDEwMDsKICAgICBjYXNlIDB4MEJGMjoKICAgICBjYXNlIDB4MjE2RjoKICAgICBjYXNlIDB4MjE3RjoKQEAgLTI0MSw3NSArMjQxLDc1IEBACiAgICAgY2FzZSAweDEwMTcxOgogICAgIGNhc2UgMHgxMEE0NzoKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSAxMDAwOworICAgIHJldHVybiAoZG91YmxlKSAxMDAwOwogICAgIGNhc2UgMHgxMzdDOgogICAgIGNhc2UgMHgyMTgyOgogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDEyQjoKICAgICBjYXNlIDB4MTAxNTU6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgMTAwMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDEwMDAwOwogICAgIGNhc2UgMHgyMTZBOgogICAgIGNhc2UgMHgyMTdBOgogICAgIGNhc2UgMHgyNDZBOgogICAgIGNhc2UgMHgyNDdFOgogICAgIGNhc2UgMHgyNDkyOgogICAgIGNhc2UgMHgyNEVCOgotCXJldHVybiAoZG91YmxlKSAxMTsKKyAgICByZXR1cm4gKGRvdWJsZSkgMTE7CiAgICAgY2FzZSAweDBGMkY6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAxMSAvIDI7CisgICAgcmV0dXJuIChkb3VibGUpIDExIC8gMjsKICAgICBjYXNlIDB4MjE2QjoKICAgICBjYXNlIDB4MjE3QjoKICAgICBjYXNlIDB4MjQ2QjoKICAgICBjYXNlIDB4MjQ3RjoKICAgICBjYXNlIDB4MjQ5MzoKICAgICBjYXNlIDB4MjRFQzoKLQlyZXR1cm4gKGRvdWJsZSkgMTI7CisgICAgcmV0dXJuIChkb3VibGUpIDEyOwogICAgIGNhc2UgMHgyNDZDOgogICAgIGNhc2UgMHgyNDgwOgogICAgIGNhc2UgMHgyNDk0OgogICAgIGNhc2UgMHgyNEVEOgotCXJldHVybiAoZG91YmxlKSAxMzsKKyAgICByZXR1cm4gKGRvdWJsZSkgMTM7CiAgICAgY2FzZSAweDBGMzA6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAxMyAvIDI7CisgICAgcmV0dXJuIChkb3VibGUpIDEzIC8gMjsKICAgICBjYXNlIDB4MjQ2RDoKICAgICBjYXNlIDB4MjQ4MToKICAgICBjYXNlIDB4MjQ5NToKICAgICBjYXNlIDB4MjRFRToKLQlyZXR1cm4gKGRvdWJsZSkgMTQ7CisgICAgcmV0dXJuIChkb3VibGUpIDE0OwogICAgIGNhc2UgMHgyNDZFOgogICAgIGNhc2UgMHgyNDgyOgogICAgIGNhc2UgMHgyNDk2OgogICAgIGNhc2UgMHgyNEVGOgotCXJldHVybiAoZG91YmxlKSAxNTsKKyAgICByZXR1cm4gKGRvdWJsZSkgMTU7CiAgICAgY2FzZSAweDBGMzE6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAxNSAvIDI7CisgICAgcmV0dXJuIChkb3VibGUpIDE1IC8gMjsKICAgICBjYXNlIDB4MDlGOToKICAgICBjYXNlIDB4MjQ2RjoKICAgICBjYXNlIDB4MjQ4MzoKICAgICBjYXNlIDB4MjQ5NzoKICAgICBjYXNlIDB4MjRGMDoKLQlyZXR1cm4gKGRvdWJsZSkgMTY7CisgICAgcmV0dXJuIChkb3VibGUpIDE2OwogICAgIGNhc2UgMHgxNkVFOgogICAgIGNhc2UgMHgyNDcwOgogICAgIGNhc2UgMHgyNDg0OgogICAgIGNhc2UgMHgyNDk4OgogICAgIGNhc2UgMHgyNEYxOgotCXJldHVybiAoZG91YmxlKSAxNzsKKyAgICByZXR1cm4gKGRvdWJsZSkgMTc7CiAgICAgY2FzZSAweDBGMzI6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAxNyAvIDI7CisgICAgcmV0dXJuIChkb3VibGUpIDE3IC8gMjsKICAgICBjYXNlIDB4MTZFRjoKICAgICBjYXNlIDB4MjQ3MToKICAgICBjYXNlIDB4MjQ4NToKICAgICBjYXNlIDB4MjQ5OToKICAgICBjYXNlIDB4MjRGMjoKLQlyZXR1cm4gKGRvdWJsZSkgMTg7CisgICAgcmV0dXJuIChkb3VibGUpIDE4OwogICAgIGNhc2UgMHgxNkYwOgogICAgIGNhc2UgMHgyNDcyOgogICAgIGNhc2UgMHgyNDg2OgogICAgIGNhc2UgMHgyNDlBOgogICAgIGNhc2UgMHgyNEYzOgotCXJldHVybiAoZG91YmxlKSAxOTsKKyAgICByZXR1cm4gKGRvdWJsZSkgMTk7CiAgICAgY2FzZSAweDA5RjU6CiAgICAgY2FzZSAweDE3RjI6CiAgICAgY2FzZSAweDIxNjE6CkBAIC0zMjYsMTQgKzMyNiwxNCBAQAogICAgIGNhc2UgMHgxMDE1RToKICAgICBjYXNlIDB4MTAzRDI6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgMjsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjsKICAgICBjYXNlIDB4MjE1NDoKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxNzc6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgMiAvIDM7CisgICAgcmV0dXJuIChkb3VibGUpIDIgLyAzOwogICAgIGNhc2UgMHgyMTU2OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMiAvIDU7CisgICAgcmV0dXJuIChkb3VibGUpIDIgLyA1OwogICAgIGNhc2UgMHgxMzczOgogICAgIGNhc2UgMHgyNDczOgogICAgIGNhc2UgMHgyNDg3OgpAQCAtMzQ1LDMzICszNDUsMzMgQEAKICAgICBjYXNlIDB4MTAzRDQ6CiAgICAgY2FzZSAweDEwQTQ1OgogI2VuZGlmCi0gICAgICAgIHJldHVybiAoZG91YmxlKSAyMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjA7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTFBOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMjAwOworICAgIHJldHVybiAoZG91YmxlKSAyMDA7CiAgICAgY2FzZSAweDEwMTIzOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMjAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjAwMDsKICAgICBjYXNlIDB4MTAxMkM6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAyMDAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgMjAwMDA7CiAjZW5kaWYKICAgICBjYXNlIDB4MzI1MToKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDIxOworICAgIHJldHVybiAoZG91YmxlKSAyMTsKICAgICBjYXNlIDB4MzI1MjoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDIyOworICAgIHJldHVybiAoZG91YmxlKSAyMjsKICAgICBjYXNlIDB4MzI1MzoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDIzOworICAgIHJldHVybiAoZG91YmxlKSAyMzsKICAgICBjYXNlIDB4MzI1NDoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDI0OworICAgIHJldHVybiAoZG91YmxlKSAyNDsKICAgICBjYXNlIDB4MzI1NToKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDI1OworICAgIHJldHVybiAoZG91YmxlKSAyNTsKICAgICBjYXNlIDB4MzI1NjoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDI2OworICAgIHJldHVybiAoZG91YmxlKSAyNjsKICAgICBjYXNlIDB4MzI1NzoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDI3OworICAgIHJldHVybiAoZG91YmxlKSAyNzsKICAgICBjYXNlIDB4MzI1ODoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDI4OworICAgIHJldHVybiAoZG91YmxlKSAyODsKICAgICBjYXNlIDB4MzI1OToKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDI5OworICAgIHJldHVybiAoZG91YmxlKSAyOTsKICAgICBjYXNlIDB4MDlGNjoKICAgICBjYXNlIDB4MTdGMzoKICAgICBjYXNlIDB4MjE2MjoKQEAgLTM4MywxOCArMzgzLDE4IEBACiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTA5OgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDM7CisgICAgcmV0dXJuIChkb3VibGUpIDM7CiAgICAgY2FzZSAweDBGMkI6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAzIC8gMjsKKyAgICByZXR1cm4gKGRvdWJsZSkgMyAvIDI7CiAgICAgY2FzZSAweDAwQkU6CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTc4OgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDMgLyA0OworICAgIHJldHVybiAoZG91YmxlKSAzIC8gNDsKICAgICBjYXNlIDB4MjE1NzoKLQlyZXR1cm4gKGRvdWJsZSkgMyAvIDU7CisgICAgcmV0dXJuIChkb3VibGUpIDMgLyA1OwogICAgIGNhc2UgMHgyMTVDOgotCXJldHVybiAoZG91YmxlKSAzIC8gODsKKyAgICByZXR1cm4gKGRvdWJsZSkgMyAvIDg7CiAgICAgY2FzZSAweDEzNzQ6CiAgICAgY2FzZSAweDMwM0E6CiAgICAgY2FzZSAweDMyNUE6CkBAIC00MDIsMzQgKzQwMiwzNCBAQAogICAgIGNhc2UgMHgxMDExMjoKICAgICBjYXNlIDB4MTAxNjU6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgMzA7CisgICAgcmV0dXJuIChkb3VibGUpIDMwOwogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDExQjoKICAgICBjYXNlIDB4MTAxNkI6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAzMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDMwMDsKICAgICBjYXNlIDB4MTAxMjQ6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSAzMDAwOworICAgIHJldHVybiAoZG91YmxlKSAzMDAwOwogICAgIGNhc2UgMHgxMDEyRDoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDMwMDAwOworICAgIHJldHVybiAoZG91YmxlKSAzMDAwMDsKICNlbmRpZgogICAgIGNhc2UgMHgzMjVCOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzE7CisgICAgcmV0dXJuIChkb3VibGUpIDMxOwogICAgIGNhc2UgMHgzMjVDOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzI7CisgICAgcmV0dXJuIChkb3VibGUpIDMyOwogICAgIGNhc2UgMHgzMjVEOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzM7CisgICAgcmV0dXJuIChkb3VibGUpIDMzOwogICAgIGNhc2UgMHgzMjVFOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzQ7CisgICAgcmV0dXJuIChkb3VibGUpIDM0OwogICAgIGNhc2UgMHgzMjVGOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzU7CisgICAgcmV0dXJuIChkb3VibGUpIDM1OwogICAgIGNhc2UgMHgzMkIxOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzY7CisgICAgcmV0dXJuIChkb3VibGUpIDM2OwogICAgIGNhc2UgMHgzMkIyOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzc7CisgICAgcmV0dXJuIChkb3VibGUpIDM3OwogICAgIGNhc2UgMHgzMkIzOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzg7CisgICAgcmV0dXJuIChkb3VibGUpIDM4OwogICAgIGNhc2UgMHgzMkI0OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgMzk7CisgICAgcmV0dXJuIChkb3VibGUpIDM5OwogICAgIGNhc2UgMHgwOUY3OgogICAgIGNhc2UgMHgxN0Y0OgogICAgIGNhc2UgMHgyMTYzOgpAQCAtNDQxLDQxICs0NDEsNDEgQEAKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMEE6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgNDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDsKICAgICBjYXNlIDB4MjE1ODoKLQlyZXR1cm4gKGRvdWJsZSkgNCAvIDU7CisgICAgcmV0dXJuIChkb3VibGUpIDQgLyA1OwogICAgIGNhc2UgMHgxMzc1OgogICAgIGNhc2UgMHgzMkI1OgogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDExMzoKICNlbmRpZgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDA7CisgICAgcmV0dXJuIChkb3VibGUpIDQwOwogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDExQzoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDQwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDAwOwogICAgIGNhc2UgMHgxMDEyNToKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDQwMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDQwMDA7CiAgICAgY2FzZSAweDEwMTJFOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNDAwMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDQwMDAwOwogI2VuZGlmCiAgICAgY2FzZSAweDMyQjY6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0MTsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDE7CiAgICAgY2FzZSAweDMyQjc6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0MjsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDI7CiAgICAgY2FzZSAweDMyQjg6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0MzsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDM7CiAgICAgY2FzZSAweDMyQjk6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0NDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDQ7CiAgICAgY2FzZSAweDMyQkE6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0NTsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDU7CiAgICAgY2FzZSAweDMyQkI6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0NjsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDY7CiAgICAgY2FzZSAweDMyQkM6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0NzsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDc7CiAgICAgY2FzZSAweDMyQkQ6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0ODsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDg7CiAgICAgY2FzZSAweDMyQkU6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA0OTsKKyAgICByZXR1cm4gKGRvdWJsZSkgNDk7CiAgICAgY2FzZSAweDE3RjU6CiAgICAgY2FzZSAweDIxNjQ6CiAgICAgY2FzZSAweDIxNzQ6CkBAIC00OTEsMTMgKzQ5MSwxMyBAQAogICAgIGNhc2UgMHgxMDE3MzoKICAgICBjYXNlIDB4MTAzMjE6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgNTsKKyAgICByZXR1cm4gKGRvdWJsZSkgNTsKICAgICBjYXNlIDB4MEYyQzoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDUgLyAyOworICAgIHJldHVybiAoZG91YmxlKSA1IC8gMjsKICAgICBjYXNlIDB4MjE1QToKLQlyZXR1cm4gKGRvdWJsZSkgNSAvIDY7CisgICAgcmV0dXJuIChkb3VibGUpIDUgLyA2OwogICAgIGNhc2UgMHgyMTVEOgotCXJldHVybiAoZG91YmxlKSA1IC8gODsKKyAgICByZXR1cm4gKGRvdWJsZSkgNSAvIDg7CiAgICAgY2FzZSAweDEzNzY6CiAgICAgY2FzZSAweDIxNkM6CiAgICAgY2FzZSAweDIxN0M6CkBAIC01MTQsNyArNTE0LDcgQEAKICAgICBjYXNlIDB4MTAxNzQ6CiAgICAgY2FzZSAweDEwMzIzOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDUwOworICAgIHJldHVybiAoZG91YmxlKSA1MDsKICAgICBjYXNlIDB4MjE2RToKICAgICBjYXNlIDB4MjE3RToKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKQEAgLTUyOCw3ICs1MjgsNyBAQAogICAgIGNhc2UgMHgxMDE2RjoKICAgICBjYXNlIDB4MTAxNzA6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgNTAwOworICAgIHJldHVybiAoZG91YmxlKSA1MDA7CiAgICAgY2FzZSAweDIxODE6CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTI2OgpAQCAtNTM2LDEyICs1MzYsMTIgQEAKICAgICBjYXNlIDB4MTAxNEU6CiAgICAgY2FzZSAweDEwMTcyOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDUwMDA7CisgICAgcmV0dXJuIChkb3VibGUpIDUwMDA7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTJGOgogICAgIGNhc2UgMHgxMDE0NzoKICAgICBjYXNlIDB4MTAxNTY6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA1MDAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNTAwMDA7CiAjZW5kaWYKICAgICBjYXNlIDB4MTdGNjoKICAgICBjYXNlIDB4MjE2NToKQEAgLTU1MiwxOSArNTUyLDE5IEBACiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTBDOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDY7CisgICAgcmV0dXJuIChkb3VibGUpIDY7CiAgICAgY2FzZSAweDEzNzc6CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTE1OgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDYwOworICAgIHJldHVybiAoZG91YmxlKSA2MDsKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMUU6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA2MDA7CisgICAgcmV0dXJuIChkb3VibGUpIDYwMDsKICAgICBjYXNlIDB4MTAxMjc6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA2MDAwOworICAgIHJldHVybiAoZG91YmxlKSA2MDAwOwogICAgIGNhc2UgMHgxMDEzMDoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDYwMDAwOworICAgIHJldHVybiAoZG91YmxlKSA2MDAwMDsKICNlbmRpZgogICAgIGNhc2UgMHgxN0Y3OgogICAgIGNhc2UgMHgyMTY2OgpAQCAtNTc1LDIzICs1NzUsMjMgQEAKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMEQ6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgNzsKKyAgICByZXR1cm4gKGRvdWJsZSkgNzsKICAgICBjYXNlIDB4MEYyRDoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDcgLyAyOworICAgIHJldHVybiAoZG91YmxlKSA3IC8gMjsKICAgICBjYXNlIDB4MjE1RToKLQlyZXR1cm4gKGRvdWJsZSkgNyAvIDg7CisgICAgcmV0dXJuIChkb3VibGUpIDcgLyA4OwogICAgIGNhc2UgMHgxMzc4OgogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDExNjoKICNlbmRpZgotCXJldHVybiAoZG91YmxlKSA3MDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNzA7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTFGOgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNzAwOworICAgIHJldHVybiAoZG91YmxlKSA3MDA7CiAgICAgY2FzZSAweDEwMTI4OgotICAgICAgICByZXR1cm4gKGRvdWJsZSkgNzAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNzAwMDsKICAgICBjYXNlIDB4MTAxMzE6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA3MDAwMDsKKyAgICByZXR1cm4gKGRvdWJsZSkgNzAwMDA7CiAjZW5kaWYKICAgICBjYXNlIDB4MTdGODoKICAgICBjYXNlIDB4MjE2NzoKQEAgLTYwMiwxOSArNjAyLDE5IEBACiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTBFOgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDg7CisgICAgcmV0dXJuIChkb3VibGUpIDg7CiAgICAgY2FzZSAweDEzNzk6CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgY2FzZSAweDEwMTE3OgogI2VuZGlmCi0JcmV0dXJuIChkb3VibGUpIDgwOworICAgIHJldHVybiAoZG91YmxlKSA4MDsKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMjA6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA4MDA7CisgICAgcmV0dXJuIChkb3VibGUpIDgwMDsKICAgICBjYXNlIDB4MTAxMjk6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA4MDAwOworICAgIHJldHVybiAoZG91YmxlKSA4MDAwOwogICAgIGNhc2UgMHgxMDEzMjoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDgwMDAwOworICAgIHJldHVybiAoZG91YmxlKSA4MDAwMDsKICNlbmRpZgogICAgIGNhc2UgMHgxN0Y5OgogICAgIGNhc2UgMHgyMTY4OgpAQCAtNjI1LDI1ICs2MjUsMjUgQEAKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMEY6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgOTsKKyAgICByZXR1cm4gKGRvdWJsZSkgOTsKICAgICBjYXNlIDB4MEYyRToKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDkgLyAyOworICAgIHJldHVybiAoZG91YmxlKSA5IC8gMjsKICAgICBjYXNlIDB4MTM3QToKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKICAgICBjYXNlIDB4MTAxMTg6CiAjZW5kaWYKLQlyZXR1cm4gKGRvdWJsZSkgOTA7CisgICAgcmV0dXJuIChkb3VibGUpIDkwOwogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgIGNhc2UgMHgxMDEyMToKICAgICBjYXNlIDB4MTAzNEE6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA5MDA7CisgICAgcmV0dXJuIChkb3VibGUpIDkwMDsKICAgICBjYXNlIDB4MTAxMkE6Ci0gICAgICAgIHJldHVybiAoZG91YmxlKSA5MDAwOworICAgIHJldHVybiAoZG91YmxlKSA5MDAwOwogICAgIGNhc2UgMHgxMDEzMzoKLSAgICAgICAgcmV0dXJuIChkb3VibGUpIDkwMDAwOworICAgIHJldHVybiAoZG91YmxlKSA5MDAwMDsKICNlbmRpZgogICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIChkb3VibGUpIF9QeVVuaWNvZGVfVG9EaWdpdChjaCk7CisgICAgcmV0dXJuIChkb3VibGUpIF9QeVVuaWNvZGVfVG9EaWdpdChjaCk7CiAgICAgfQogfQogCkBAIC02OTAsOSArNjkwLDkgQEAKICAgICBjYXNlIDB4MjAyRjogLyogTkFSUk9XIE5PLUJSRUFLIFNQQUNFICovCiAgICAgY2FzZSAweDIwNUY6IC8qIE1FRElVTSBNQVRIRU1BVElDQUwgU1BBQ0UgKi8KICAgICBjYXNlIDB4MzAwMDogLyogSURFT0dSQVBISUMgU1BBQ0UgKi8KLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKICAgICBkZWZhdWx0OgotCXJldHVybiAwOworICAgIHJldHVybiAwOwogICAgIH0KIH0KIApAQCAtNzI0LDkgKzcyNCw5IEBACiAgICAgY29uc3QgX1B5VW5pY29kZV9UeXBlUmVjb3JkICpjdHlwZSA9IGdldHR5cGVyZWNvcmQoY2gpOwogICAgIGludCBkZWx0YSA9IGN0eXBlLT51cHBlcjsKICAgICBpZiAoY3R5cGUtPmZsYWdzICYgTk9ERUxUQV9NQVNLKQotCXJldHVybiBkZWx0YTsKKyAgICByZXR1cm4gZGVsdGE7CiAgICAgaWYgKGRlbHRhID49IDMyNzY4KQotCSAgICBkZWx0YSAtPSA2NTUzNjsKKyAgICAgICAgZGVsdGEgLT0gNjU1MzY7CiAgICAgcmV0dXJuIGNoICsgZGVsdGE7CiB9CiAKQEAgLTczOCw5ICs3MzgsOSBAQAogICAgIGNvbnN0IF9QeVVuaWNvZGVfVHlwZVJlY29yZCAqY3R5cGUgPSBnZXR0eXBlcmVjb3JkKGNoKTsKICAgICBpbnQgZGVsdGEgPSBjdHlwZS0+bG93ZXI7CiAgICAgaWYgKGN0eXBlLT5mbGFncyAmIE5PREVMVEFfTUFTSykKLQlyZXR1cm4gZGVsdGE7CisgICAgcmV0dXJuIGRlbHRhOwogICAgIGlmIChkZWx0YSA+PSAzMjc2OCkKLQkgICAgZGVsdGEgLT0gNjU1MzY7CisgICAgICAgIGRlbHRhIC09IDY1NTM2OwogICAgIHJldHVybiBjaCArIGRlbHRhOwogfQogCmRpZmYgLS1naXQgYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCmluZGV4IDFhOTk4YjYuLjBlNDZkOTIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCisrKyBiL09iamVjdHMvd2Vha3JlZm9iamVjdC5jCkBAIC01Nyw5ICs1Nyw5IEBACiAgICAgICAgICAgICBQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSk7CiAKICAgICAgICAgaWYgKCpsaXN0ID09IHNlbGYpCi0JICAgIC8qIElmICdzZWxmJyBpcyB0aGUgZW5kIG9mIHRoZSBsaXN0IChhbmQgdGh1cyBzZWxmLT53cl9uZXh0ID09IE5VTEwpCi0JICAgICAgIHRoZW4gdGhlIHdlYWtyZWYgbGlzdCBpdHNlbGYgKGFuZCB0aHVzIHRoZSB2YWx1ZSBvZiAqbGlzdCkgd2lsbAotCSAgICAgICBlbmQgdXAgYmVpbmcgc2V0IHRvIE5VTEwuICovCisgICAgICAgICAgICAvKiBJZiAnc2VsZicgaXMgdGhlIGVuZCBvZiB0aGUgbGlzdCAoYW5kIHRodXMgc2VsZi0+d3JfbmV4dCA9PSBOVUxMKQorICAgICAgICAgICAgICAgdGhlbiB0aGUgd2Vha3JlZiBsaXN0IGl0c2VsZiAoYW5kIHRodXMgdGhlIHZhbHVlIG9mICpsaXN0KSB3aWxsCisgICAgICAgICAgICAgICBlbmQgdXAgYmVpbmcgc2V0IHRvIE5VTEwuICovCiAgICAgICAgICAgICAqbGlzdCA9IHNlbGYtPndyX25leHQ7CiAgICAgICAgIHNlbGYtPndyX29iamVjdCA9IFB5X05vbmU7CiAgICAgICAgIGlmIChzZWxmLT53cl9wcmV2ICE9IE5VTEwpCkBAIC0xNjEsMjEgKzE2MSwyMSBAQAogICAgICAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICI8d2Vha3JlZiBhdCAlcDsgZGVhZD4iLCBzZWxmKTsKICAgICB9CiAgICAgZWxzZSB7Ci0JY2hhciAqbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKm5hbWVvYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHNlbGYpLAotCQkJCQkJICAgIl9fbmFtZV9fIik7Ci0JaWYgKG5hbWVvYmogPT0gTlVMTCkKLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlIGlmIChQeVN0cmluZ19DaGVjayhuYW1lb2JqKSkKLQkJbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lb2JqKTsKKyAgICAgICAgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICpuYW1lb2JqID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX25hbWVfXyIpOworICAgICAgICBpZiAobmFtZW9iaiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKG5hbWVvYmopKQorICAgICAgICAgICAgICAgIG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZW9iaik7CiAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJICAgICAgbmFtZSA/ICI8d2Vha3JlZiBhdCAlcDsgdG8gJyUuNTBzJyBhdCAlcCAoJXMpPiIKLQkJICAgICAgICAgICA6ICI8d2Vha3JlZiBhdCAlcDsgdG8gJyUuNTBzJyBhdCAlcD4iLAotCQkgICAgICBzZWxmLAotCQkgICAgICBQeV9UWVBFKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHNlbGYpKS0+dHBfbmFtZSwKLQkJICAgICAgUHlXZWFrcmVmX0dFVF9PQkpFQ1Qoc2VsZiksCi0JCSAgICAgIG5hbWUpOwotCVB5X1hERUNSRUYobmFtZW9iaik7CisgICAgICAgICAgICAgICAgICAgICAgbmFtZSA/ICI8d2Vha3JlZiBhdCAlcDsgdG8gJyUuNTBzJyBhdCAlcCAoJXMpPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIjx3ZWFrcmVmIGF0ICVwOyB0byAnJS41MHMnIGF0ICVwPiIsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHNlbGYpKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBQeVdlYWtyZWZfR0VUX09CSkVDVChzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgUHlfWERFQ1JFRihuYW1lb2JqKTsKICAgICB9CiAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmZmVyKTsKIH0KQEAgLTMzNywxMCArMzM3LDEwIEBACiAgICAgc2l6ZW9mKFB5V2Vha1JlZmVyZW5jZSksCiAgICAgMCwKICAgICB3ZWFrcmVmX2RlYWxsb2MsICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KLSAgICAwLAkgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCi0gICAgMCwJICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KICAgICAocmVwcmZ1bmMpd2Vha3JlZl9yZXByLCAgICAgLyp0cF9yZXByKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KQEAgLTM1Niw3ICszNTYsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCiAgICAgKHRyYXZlcnNlcHJvYylnY190cmF2ZXJzZSwgIC8qdHBfdHJhdmVyc2UqLwogICAgIChpbnF1aXJ5KWdjX2NsZWFyLCAgICAgICAgICAvKnRwX2NsZWFyKi8KLSAgICAocmljaGNtcGZ1bmMpd2Vha3JlZl9yaWNoY29tcGFyZSwJLyp0cF9yaWNoY29tcGFyZSovCisgICAgKHJpY2hjbXBmdW5jKXdlYWtyZWZfcmljaGNvbXBhcmUsICAgLyp0cF9yaWNoY29tcGFyZSovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KQEAgLTQzNiw5ICs0MzYsOSBAQAogI2RlZmluZSBXUkFQX01FVEhPRChtZXRob2QsIHNwZWNpYWwpIFwKICAgICBzdGF0aWMgUHlPYmplY3QgKiBcCiAgICAgbWV0aG9kKFB5T2JqZWN0ICpwcm94eSkgeyBcCi0JICAgIFVOV1JBUChwcm94eSk7IFwKLQkJcmV0dXJuIFB5T2JqZWN0X0NhbGxNZXRob2QocHJveHksIHNwZWNpYWwsICIiKTsgXAotCX0KKyAgICAgICAgICAgIFVOV1JBUChwcm94eSk7IFwKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbE1ldGhvZChwcm94eSwgc3BlY2lhbCwgIiIpOyBcCisgICAgICAgIH0KIAogCiAvKiBkaXJlY3Qgc2xvdHMgKi8KQEAgLTQ1Miw5ICs0NTIsOSBAQAogewogICAgIGNoYXIgYnVmWzE2MF07CiAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkgICI8d2Vha3Byb3h5IGF0ICVwIHRvICUuMTAwcyBhdCAlcD4iLCBwcm94eSwKLQkJICBQeV9UWVBFKFB5V2Vha3JlZl9HRVRfT0JKRUNUKHByb3h5KSktPnRwX25hbWUsCi0JCSAgUHlXZWFrcmVmX0dFVF9PQkpFQ1QocHJveHkpKTsKKyAgICAgICAgICAgICAgICAgICI8d2Vha3Byb3h5IGF0ICVwIHRvICUuMTAwcyBhdCAlcD4iLCBwcm94eSwKKyAgICAgICAgICAgICAgICAgIFB5X1RZUEUoUHlXZWFrcmVmX0dFVF9PQkpFQ1QocHJveHkpKS0+dHBfbmFtZSwKKyAgICAgICAgICAgICAgICAgIFB5V2Vha3JlZl9HRVRfT0JKRUNUKHByb3h5KSk7CiAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIApAQCAtNjA0LDggKzYwNCw4IEBACiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHByb3h5X21ldGhvZHNbXSA9IHsKLQl7Il9fdW5pY29kZV9fIiwgKFB5Q0Z1bmN0aW9uKXByb3h5X3VuaWNvZGUsIE1FVEhfTk9BUkdTfSwKLQl7TlVMTCwgTlVMTH0KKyAgICAgICAgeyJfX3VuaWNvZGVfXyIsIChQeUNGdW5jdGlvbilwcm94eV91bmljb2RlLCBNRVRIX05PQVJHU30sCisgICAgICAgIHtOVUxMLCBOVUxMfQogfTsKIAogCkBAIC02NzcsMjAgKzY3NywyMCBAQAogICAgIDAsCiAgICAgLyogbWV0aG9kcyAqLwogICAgIChkZXN0cnVjdG9yKXByb3h5X2RlYWxsb2MsICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLSAgICAwLAkJCQkgICAgICAgIC8qIHRwX3ByaW50ICovCi0gICAgMCwJCQkJICAgICAgICAvKiB0cF9nZXRhdHRyICovCi0gICAgMCwgCQkJCSAgICAgICAgLyogdHBfc2V0YXR0ciAqLwotICAgIHByb3h5X2NvbXBhcmUsCQkgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLSAgICAocmVwcmZ1bmMpcHJveHlfcmVwciwJICAgICAgICAvKiB0cF9yZXByICovCi0gICAgJnByb3h5X2FzX251bWJlciwJCSAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCi0gICAgJnByb3h5X2FzX3NlcXVlbmNlLAkJICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwotICAgICZwcm94eV9hc19tYXBwaW5nLAkJICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0gICAgMCwJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIHByb3h5X2NvbXBhcmUsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAocmVwcmZ1bmMpcHJveHlfcmVwciwgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJnByb3h5X2FzX251bWJlciwgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgJnByb3h5X2FzX3NlcXVlbmNlLCAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAmcHJveHlfYXNfbWFwcGluZywgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KICAgICBwcm94eV9zdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KICAgICBwcm94eV9nZXRhdHRyLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIChzZXRhdHRyb2Z1bmMpcHJveHlfc2V0YXR0ciwgICAgICAgIC8qIHRwX3NldGF0dHJvICovCi0gICAgMCwJCQkJICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MKICAgICB8IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUywgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwpAQCAtNzAwLDcgKzcwMCw3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAoZ2V0aXRlcmZ1bmMpcHJveHlfaXRlciwgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgKGl0ZXJuZXh0ZnVuYylwcm94eV9pdGVybmV4dCwgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLQlwcm94eV9tZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgICAgIHByb3h5X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KIH07CiAKIApAQCAtNzEyLDIwICs3MTIsMjAgQEAKICAgICAwLAogICAgIC8qIG1ldGhvZHMgKi8KICAgICAoZGVzdHJ1Y3Rvcilwcm94eV9kZWFsbG9jLCAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCi0gICAgMCwJCQkJICAgICAgICAvKiB0cF9wcmludCAqLwotICAgIDAsCQkJCSAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwotICAgIDAsIAkJCQkgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KLSAgICBwcm94eV9jb21wYXJlLAkJICAgICAgICAvKiB0cF9jb21wYXJlICovCi0gICAgKHVuYXJ5ZnVuYylwcm94eV9yZXByLAkgICAgICAgIC8qIHRwX3JlcHIgKi8KLSAgICAmcHJveHlfYXNfbnVtYmVyLAkJICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLSAgICAmcHJveHlfYXNfc2VxdWVuY2UsCQkgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCi0gICAgJnByb3h5X2FzX21hcHBpbmcsCQkgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KLSAgICAwLAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KLSAgICBwcm94eV9jYWxsLAkgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCi0gICAgcHJveHlfc3RyLAkgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgcHJveHlfY29tcGFyZSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY29tcGFyZSAqLworICAgICh1bmFyeWZ1bmMpcHJveHlfcmVwciwgICAgICAgICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAmcHJveHlfYXNfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAmcHJveHlfYXNfc2VxdWVuY2UsICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICZwcm94eV9hc19tYXBwaW5nLCAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgcHJveHlfY2FsbCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIHByb3h5X3N0ciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwogICAgIHByb3h5X2dldGF0dHIsICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgKHNldGF0dHJvZnVuYylwcm94eV9zZXRhdHRyLCAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KLSAgICAwLAkJCQkgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQwogICAgIHwgUHlfVFBGTEFHU19DSEVDS1RZUEVTLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCkBAIC03NDgsNyArNzQ4LDcgQEAKIAogICAgIGlmICghUHlUeXBlX1NVUFBPUlRTX1dFQUtSRUZTKFB5X1RZUEUob2IpKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgICJjYW5ub3QgY3JlYXRlIHdlYWsgcmVmZXJlbmNlIHRvICclcycgb2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY3JlYXRlIHdlYWsgcmVmZXJlbmNlIHRvICclcycgb2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUob2IpLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtODA3LDcgKzgwNyw3IEBACiAKICAgICBpZiAoIVB5VHlwZV9TVVBQT1JUU19XRUFLUkVGUyhQeV9UWVBFKG9iKSkpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAiY2Fubm90IGNyZWF0ZSB3ZWFrIHJlZmVyZW5jZSB0byAnJXMnIG9iamVjdCIsCisgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNyZWF0ZSB3ZWFrIHJlZmVyZW5jZSB0byAnJXMnIG9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTkzMiw3ICs5MzIsNyBAQAogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp0dXBsZTsKICAgICAgICAgICAgIFB5X3NzaXplX3QgaSA9IDA7Ci0gICAgCisKICAgICAgICAgICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoY291bnQgKiAyKTsKICAgICAgICAgICAgIGlmICh0dXBsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKHJlc3RvcmVfZXJyb3IpCmRpZmYgLS1naXQgYS9QQy9WUzcuMS9tYWtlX2J1aWxkaW5mby5jIGIvUEMvVlM3LjEvbWFrZV9idWlsZGluZm8uYwppbmRleCAyNzU4MGJiLi4yYWEyYjY2IDEwMDY0NAotLS0gYS9QQy9WUzcuMS9tYWtlX2J1aWxkaW5mby5jCisrKyBiL1BDL1ZTNy4xL21ha2VfYnVpbGRpbmZvLmMKQEAgLTIxLDcyICsyMSw3MiBAQAogCiBpbnQgbWFrZV9idWlsZGluZm8yKCkKIHsKLQlzdHJ1Y3QgX3N0YXQgc3Q7Ci0JSEtFWSBoVG9ydG9pc2U7Ci0JY2hhciBjb21tYW5kWzUwMF07Ci0JRFdPUkQgdHlwZSwgc2l6ZTsKLQlpZiAoX3N0YXQoIi5zdm4iLCAmc3QpIDwgMCkKLQkJcmV0dXJuIDA7Ci0JLyogQWxsb3cgc3VwcHJlc3Npb24gb2Ygc3Vid2NyZXYuZXhlIGludm9jYXRpb24gaWYgYSBub19zdWJ3Y3JldiBmaWxlIGlzIHByZXNlbnQuICovCi0JaWYgKF9zdGF0KCJub19zdWJ3Y3JldiIsICZzdCkgPT0gMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKFJlZ09wZW5LZXkoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUyAmJgotCSAgICBSZWdPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUykKLQkJLyogVG9ydG9pc2Ugbm90IGluc3RhbGxlZCAqLwotCQlyZXR1cm4gMDsKLQljb21tYW5kWzBdID0gJyInOyAgLyogcXVvdGUgdGhlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgKi8KLQlzaXplID0gc2l6ZW9mKGNvbW1hbmQpIC0gMTsKLQlpZiAoUmVnUXVlcnlWYWx1ZUV4KGhUb3J0b2lzZSwgIkRpcmVjdG9yeSIsIDAsICZ0eXBlLCBjb21tYW5kKzEsICZzaXplKSAhPSBFUlJPUl9TVUNDRVNTIHx8Ci0JICAgIHR5cGUgIT0gUkVHX1NaKQotCQkvKiBSZWdpc3RyeSBjb3JydXB0ZWQgKi8KLQkJcmV0dXJuIDA7Ci0Jc3RyY2F0KGNvbW1hbmQsICJiaW5cXHN1YndjcmV2LmV4ZSIpOwotCWlmIChfc3RhdChjb21tYW5kKzEsICZzdCkgPCAwKQotCQkvKiBzdWJ3Y3Jldi5leGUgbm90IHBhcnQgb2YgdGhlIHJlbGVhc2UgKi8KLQkJcmV0dXJuIDA7Ci0Jc3RyY2F0KGNvbW1hbmQsICJcIiAuLlxcLi4gLi5cXC4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyBnZXRidWlsZGluZm8yLmMiKTsKLQlwdXRzKGNvbW1hbmQpOyBmZmx1c2goc3Rkb3V0KTsKLQlpZiAoc3lzdGVtKGNvbW1hbmQpIDwgMCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgc3RydWN0IF9zdGF0IHN0OworICAgIEhLRVkgaFRvcnRvaXNlOworICAgIGNoYXIgY29tbWFuZFs1MDBdOworICAgIERXT1JEIHR5cGUsIHNpemU7CisgICAgaWYgKF9zdGF0KCIuc3ZuIiwgJnN0KSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIC8qIEFsbG93IHN1cHByZXNzaW9uIG9mIHN1YndjcmV2LmV4ZSBpbnZvY2F0aW9uIGlmIGEgbm9fc3Vid2NyZXYgZmlsZSBpcyBwcmVzZW50LiAqLworICAgIGlmIChfc3RhdCgibm9fc3Vid2NyZXYiLCAmc3QpID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChSZWdPcGVuS2V5KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MgJiYKKyAgICAgICAgUmVnT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIC8qIFRvcnRvaXNlIG5vdCBpbnN0YWxsZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgY29tbWFuZFswXSA9ICciJzsgIC8qIHF1b3RlIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlICovCisgICAgc2l6ZSA9IHNpemVvZihjb21tYW5kKSAtIDE7CisgICAgaWYgKFJlZ1F1ZXJ5VmFsdWVFeChoVG9ydG9pc2UsICJEaXJlY3RvcnkiLCAwLCAmdHlwZSwgY29tbWFuZCsxLCAmc2l6ZSkgIT0gRVJST1JfU1VDQ0VTUyB8fAorICAgICAgICB0eXBlICE9IFJFR19TWikKKyAgICAgICAgLyogUmVnaXN0cnkgY29ycnVwdGVkICovCisgICAgICAgIHJldHVybiAwOworICAgIHN0cmNhdChjb21tYW5kLCAiYmluXFxzdWJ3Y3Jldi5leGUiKTsKKyAgICBpZiAoX3N0YXQoY29tbWFuZCsxLCAmc3QpIDwgMCkKKyAgICAgICAgLyogc3Vid2NyZXYuZXhlIG5vdCBwYXJ0IG9mIHRoZSByZWxlYXNlICovCisgICAgICAgIHJldHVybiAwOworICAgIHN0cmNhdChjb21tYW5kLCAiXCIgLi5cXC4uIC4uXFwuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7CisgICAgcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgaWYgKHN5c3RlbShjb21tYW5kKSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciphcmd2W10pCiB7Ci0JY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7Ci0JaW50IGRvX3VubGluaywgcmVzdWx0OwotCWlmIChhcmdjICE9IDIpIHsKLQkJZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7Ci0JCXJldHVybiBFWElUX0ZBSUxVUkU7Ci0JfQotCWlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7Ci0JCXN0cmNhdChjb21tYW5kLCAiLU1EICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgewotCQlzdHJjYXQoY29tbWFuZCwgIi1EX0RFQlVHIC1NRGQgIik7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7Ci0JCXN0cmNhdChjb21tYW5kLCAiLU1EIC9VU0VDTDpNU19JVEFOSVVNICIpOwotCX0KLQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsKLQkJc3RyY2F0KGNvbW1hbmQsICItTUQgIik7Ci0JCXN0cmNhdChjb21tYW5kLCAiLU1EIC9VU0VDTDpNU19PUFRFUk9OICIpOwotCX0KLQllbHNlIHsKLQkJZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2WzFdKTsKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQl9CisgICAgY2hhciBjb21tYW5kWzUwMF0gPSAiY2wuZXhlIC1jIC1EX1dJTjMyIC1EVVNFX0RMX0VYUE9SVCAtRF9XSU5ET1dTIC1EV0lOMzIgLURfV0lORExMICI7CisgICAgaW50IGRvX3VubGluaywgcmVzdWx0OworICAgIGlmIChhcmdjICE9IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWtlX2J1aWxkaW5mbyAkKENvbmZpZ3VyYXRpb25OYW1lKVxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2UiKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdChjb21tYW5kLCAiLU1EICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIkRlYnVnIikgPT0gMCkgeworICAgICAgICBzdHJjYXQoY29tbWFuZCwgIi1EX0RFQlVHIC1NRGQgIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUl0YW5pdW0iKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdChjb21tYW5kLCAiLU1EIC9VU0VDTDpNU19JVEFOSVVNICIpOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIlJlbGVhc2VBTUQ2NCIpID09IDApIHsKKyAgICAgICAgc3RyY2F0KGNvbW1hbmQsICItTUQgIik7CisgICAgICAgIHN0cmNhdChjb21tYW5kLCAiLU1EIC9VU0VDTDpNU19PUFRFUk9OICIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9uICVzXG4iLCBhcmd2WzFdKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CiAKLQlpZiAoKGRvX3VubGluayA9IG1ha2VfYnVpbGRpbmZvMigpKSkKLQkJc3RyY2F0KGNvbW1hbmQsICJnZXRidWlsZGluZm8yLmMgLURTVUJXQ1JFViAiKTsKLQllbHNlCi0JCXN0cmNhdChjb21tYW5kLCAiLi5cXC4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyIpOwotCXN0cmNhdChjb21tYW5kLCAiIC1Gb2dldGJ1aWxkaW5mby5vIC1JLi5cXC4uXFxJbmNsdWRlIC1JLi5cXC4uXFxQQyIpOwotCXB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOwotCXJlc3VsdCA9IHN5c3RlbShjb21tYW5kKTsKLQlpZiAoZG9fdW5saW5rKQotCQl1bmxpbmsoImdldGJ1aWxkaW5mbzIuYyIpOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwotCXJldHVybiAwOworICAgIGlmICgoZG9fdW5saW5rID0gbWFrZV9idWlsZGluZm8yKCkpKQorICAgICAgICBzdHJjYXQoY29tbWFuZCwgImdldGJ1aWxkaW5mbzIuYyAtRFNVQldDUkVWICIpOworICAgIGVsc2UKKyAgICAgICAgc3RyY2F0KGNvbW1hbmQsICIuLlxcLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIik7CisgICAgc3RyY2F0KGNvbW1hbmQsICIgLUZvZ2V0YnVpbGRpbmZvLm8gLUkuLlxcLi5cXEluY2x1ZGUgLUkuLlxcLi5cXFBDIik7CisgICAgcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7CisgICAgcmVzdWx0ID0gc3lzdGVtKGNvbW1hbmQpOworICAgIGlmIChkb191bmxpbmspCisgICAgICAgIHVubGluaygiZ2V0YnVpbGRpbmZvMi5jIik7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9QQy9WUzguMC9tYWtlX2J1aWxkaW5mby5jIGIvUEMvVlM4LjAvbWFrZV9idWlsZGluZm8uYwppbmRleCAxMzNjZmVlLi44Y2MzZGEyIDEwMDY0NAotLS0gYS9QQy9WUzguMC9tYWtlX2J1aWxkaW5mby5jCisrKyBiL1BDL1ZTOC4wL21ha2VfYnVpbGRpbmZvLmMKQEAgLTIzLDcyICsyMyw3MiBAQAogCiBpbnQgbWFrZV9idWlsZGluZm8yKCkKIHsKLQlzdHJ1Y3QgX3N0YXQgc3Q7Ci0JSEtFWSBoVG9ydG9pc2U7Ci0JY2hhciBjb21tYW5kW0NNRF9TSVpFKzFdOwotCURXT1JEIHR5cGUsIHNpemU7Ci0JaWYgKF9zdGF0KCIuc3ZuIiwgJnN0KSA8IDApCi0JCXJldHVybiAwOwotCS8qIEFsbG93IHN1cHByZXNzaW9uIG9mIHN1YndjcmV2LmV4ZSBpbnZvY2F0aW9uIGlmIGEgbm9fc3Vid2NyZXYgZmlsZSBpcyBwcmVzZW50LiAqLwotCWlmIChfc3RhdCgibm9fc3Vid2NyZXYiLCAmc3QpID09IDApCi0JCXJldHVybiAwOwotCWlmIChSZWdPcGVuS2V5KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MgJiYKLQkgICAgUmVnT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgIlNvZnR3YXJlXFxUb3J0b2lzZVNWTiIsICZoVG9ydG9pc2UpICE9IEVSUk9SX1NVQ0NFU1MpCi0JCS8qIFRvcnRvaXNlIG5vdCBpbnN0YWxsZWQgKi8KLQkJcmV0dXJuIDA7Ci0JY29tbWFuZFswXSA9ICciJzsgIC8qIHF1b3RlIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlICovCi0Jc2l6ZSA9IHNpemVvZihjb21tYW5kKSAtIDE7Ci0JaWYgKFJlZ1F1ZXJ5VmFsdWVFeChoVG9ydG9pc2UsICJEaXJlY3RvcnkiLCAwLCAmdHlwZSwgY29tbWFuZCsxLCAmc2l6ZSkgIT0gRVJST1JfU1VDQ0VTUyB8fAotCSAgICB0eXBlICE9IFJFR19TWikKLQkJLyogUmVnaXN0cnkgY29ycnVwdGVkICovCi0JCXJldHVybiAwOwotCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiYmluXFxzdWJ3Y3Jldi5leGUiKTsKLQlpZiAoX3N0YXQoY29tbWFuZCsxLCAmc3QpIDwgMCkKLQkJLyogc3Vid2NyZXYuZXhlIG5vdCBwYXJ0IG9mIHRoZSByZWxlYXNlICovCi0JCXJldHVybiAwOwotCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiXCIgLi5cXC4uIC4uXFwuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMgZ2V0YnVpbGRpbmZvMi5jIik7Ci0JcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7Ci0JaWYgKHN5c3RlbShjb21tYW5kKSA8IDApCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgIHN0cnVjdCBfc3RhdCBzdDsKKyAgICBIS0VZIGhUb3J0b2lzZTsKKyAgICBjaGFyIGNvbW1hbmRbQ01EX1NJWkUrMV07CisgICAgRFdPUkQgdHlwZSwgc2l6ZTsKKyAgICBpZiAoX3N0YXQoIi5zdm4iLCAmc3QpIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLyogQWxsb3cgc3VwcHJlc3Npb24gb2Ygc3Vid2NyZXYuZXhlIGludm9jYXRpb24gaWYgYSBub19zdWJ3Y3JldiBmaWxlIGlzIHByZXNlbnQuICovCisgICAgaWYgKF9zdGF0KCJub19zdWJ3Y3JldiIsICZzdCkgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKFJlZ09wZW5LZXkoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUyAmJgorICAgICAgICBSZWdPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCAiU29mdHdhcmVcXFRvcnRvaXNlU1ZOIiwgJmhUb3J0b2lzZSkgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgLyogVG9ydG9pc2Ugbm90IGluc3RhbGxlZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICBjb21tYW5kWzBdID0gJyInOyAgLyogcXVvdGUgdGhlIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgKi8KKyAgICBzaXplID0gc2l6ZW9mKGNvbW1hbmQpIC0gMTsKKyAgICBpZiAoUmVnUXVlcnlWYWx1ZUV4KGhUb3J0b2lzZSwgIkRpcmVjdG9yeSIsIDAsICZ0eXBlLCBjb21tYW5kKzEsICZzaXplKSAhPSBFUlJPUl9TVUNDRVNTIHx8CisgICAgICAgIHR5cGUgIT0gUkVHX1NaKQorICAgICAgICAvKiBSZWdpc3RyeSBjb3JydXB0ZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJiaW5cXHN1YndjcmV2LmV4ZSIpOworICAgIGlmIChfc3RhdChjb21tYW5kKzEsICZzdCkgPCAwKQorICAgICAgICAvKiBzdWJ3Y3Jldi5leGUgbm90IHBhcnQgb2YgdGhlIHJlbGVhc2UgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJcIiAuLlxcLi4gLi5cXC4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyBnZXRidWlsZGluZm8yLmMiKTsKKyAgICBwdXRzKGNvbW1hbmQpOyBmZmx1c2goc3Rkb3V0KTsKKyAgICBpZiAoc3lzdGVtKGNvbW1hbmQpIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKmFyZ3ZbXSkKIHsKLQljaGFyIGNvbW1hbmRbNTAwXSA9ICJjbC5leGUgLWMgLURfV0lOMzIgLURVU0VfRExfRVhQT1JUIC1EX1dJTkRPV1MgLURXSU4zMiAtRF9XSU5ETEwgIjsKLQlpbnQgZG9fdW5saW5rLCByZXN1bHQ7Ci0JaWYgKGFyZ2MgIT0gMikgewotCQlmcHJpbnRmKHN0ZGVyciwgIm1ha2VfYnVpbGRpbmZvICQoQ29uZmlndXJhdGlvbk5hbWUpXG4iKTsKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQl9Ci0JaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZSIpID09IDApIHsKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiRGVidWciKSA9PSAwKSB7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLURfREVCVUcgLU1EZCAiKTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlSXRhbml1bSIpID09IDApIHsKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgL1VTRUNMOk1TX0lUQU5JVU0gIik7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUFNRDY0IikgPT0gMCkgewotCQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1NRCAiKTsKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgL1VTRUNMOk1TX09QVEVST04gIik7Ci0JfQotCWVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgInVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gJXNcbiIsIGFyZ3ZbMV0pOwotCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwotCX0KKyAgICBjaGFyIGNvbW1hbmRbNTAwXSA9ICJjbC5leGUgLWMgLURfV0lOMzIgLURVU0VfRExfRVhQT1JUIC1EX1dJTkRPV1MgLURXSU4zMiAtRF9XSU5ETEwgIjsKKyAgICBpbnQgZG9fdW5saW5rLCByZXN1bHQ7CisgICAgaWYgKGFyZ2MgIT0gMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2VfYnVpbGRpbmZvICQoQ29uZmlndXJhdGlvbk5hbWUpXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZSIpID09IDApIHsKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiRGVidWciKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLURfREVCVUcgLU1EZCAiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlSXRhbml1bSIpID09IDApIHsKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgL1VTRUNMOk1TX0lUQU5JVU0gIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUFNRDY0IikgPT0gMCkgeworICAgICAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1NRCAiKTsKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgL1VTRUNMOk1TX09QVEVST04gIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gJXNcbiIsIGFyZ3ZbMV0pOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KIAotCWlmICgoZG9fdW5saW5rID0gbWFrZV9idWlsZGluZm8yKCkpKQotCQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgImdldGJ1aWxkaW5mbzIuYyAtRFNVQldDUkVWICIpOwotCWVsc2UKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICIuLlxcLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIik7Ci0Jc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICIgLUZvZ2V0YnVpbGRpbmZvLm8gLUkuLlxcLi5cXEluY2x1ZGUgLUkuLlxcLi5cXFBDIik7Ci0JcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7Ci0JcmVzdWx0ID0gc3lzdGVtKGNvbW1hbmQpOwotCWlmIChkb191bmxpbmspCi0JCV91bmxpbmsoImdldGJ1aWxkaW5mbzIuYyIpOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwotCXJldHVybiAwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBpZiAoKGRvX3VubGluayA9IG1ha2VfYnVpbGRpbmZvMigpKSkKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJnZXRidWlsZGluZm8yLmMgLURTVUJXQ1JFViAiKTsKKyAgICBlbHNlCisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLi5cXC4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyIpOworICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiIC1Gb2dldGJ1aWxkaW5mby5vIC1JLi5cXC4uXFxJbmNsdWRlIC1JLi5cXC4uXFxQQyIpOworICAgIHB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOworICAgIHJlc3VsdCA9IHN5c3RlbShjb21tYW5kKTsKKyAgICBpZiAoZG9fdW5saW5rKQorICAgICAgICBfdW5saW5rKCJnZXRidWlsZGluZm8yLmMiKTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL1BDL19tc2kuYyBiL1BDL19tc2kuYwppbmRleCA1OGIyNTMwLi41NzRkZGRlIDEwMDY0NAotLS0gYS9QQy9fbXNpLmMKKysrIGIvUEMvX21zaS5jCkBAIC0yMCwxOSArMjAsMTkgQEAKICAgICBVVUlEIHJlc3VsdDsKICAgICBjaGFyICpjcmVzdWx0OwogICAgIFB5T2JqZWN0ICpvcmVzdWx0OwotICAgIAorCiAgICAgLyogTWF5IHJldHVybiBvaywgbG9jYWwgb25seSwgYW5kIG5vIGFkZHJlc3MuCiAgICAgICAgRm9yIGxvY2FsIG9ubHksIHRoZSBkb2N1bWVudGF0aW9uIHNheXMgd2Ugc3RpbGwgZ2V0IGEgdXVpZC4KICAgICAgICBGb3IgUlBDX1NfVVVJRF9OT19BRERSRVNTLCBpdCdzIG5vdCBjbGVhciB3aGV0aGVyIHdlIGNhbgogICAgICAgIHVzZSB0aGUgcmVzdWx0LiAqLwogICAgIGlmIChVdWlkQ3JlYXRlKCZyZXN1bHQpID09IFJQQ19TX1VVSURfTk9fQUREUkVTUykgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAicHJvY2Vzc2luZyAnbm8gYWRkcmVzcycgcmVzdWx0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAicHJvY2Vzc2luZyAnbm8gYWRkcmVzcycgcmVzdWx0Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGlmIChVdWlkVG9TdHJpbmcoJnJlc3VsdCwgJmNyZXN1bHQpID09IFJQQ19TX09VVF9PRl9NRU1PUlkpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJvdXQgb2YgbWVtb3J5IGluIHV1aWRnZW4iKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAib3V0IG9mIG1lbW9yeSBpbiB1dWlkZ2VuIik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIG9yZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGNyZXN1bHQpOwpAQCAtNTcsNyArNTcsNyBAQAogewogICAgIGludCByZXN1bHQgPSBfb3Blbihwc3pGaWxlLCBvZmxhZywgcG1vZGUpOwogICAgIGlmIChyZXN1bHQgPT0gLTEpCi0JKmVyciA9IGVycm5vOworICAgICAgICAqZXJyID0gZXJybm87CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNjUsNyArNjUsNyBAQAogewogICAgIFVJTlQgcmVzdWx0ID0gKFVJTlQpX3JlYWQoaGYsIG1lbW9yeSwgY2IpOwogICAgIGlmIChyZXN1bHQgIT0gY2IpCi0JKmVyciA9IGVycm5vOworICAgICAgICAqZXJyID0gZXJybm87CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNzMsNyArNzMsNyBAQAogewogICAgIFVJTlQgcmVzdWx0ID0gKFVJTlQpX3dyaXRlKGhmLCBtZW1vcnksIGNiKTsKICAgICBpZiAocmVzdWx0ICE9IGNiKQotCSplcnIgPSBlcnJubzsKKyAgICAgICAgKmVyciA9IGVycm5vOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTgxLDcgKzgxLDcgQEAKIHsKICAgICBpbnQgcmVzdWx0ID0gX2Nsb3NlKGhmKTsKICAgICBpZiAocmVzdWx0ICE9IDApCi0JKmVyciA9IGVycm5vOworICAgICAgICAqZXJyID0gZXJybm87CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtODksNyArODksNyBAQAogewogICAgIGxvbmcgcmVzdWx0ID0gKGxvbmcpX2xzZWVrKGhmLCBkaXN0LCBzZWVrdHlwZSk7CiAgICAgaWYgKHJlc3VsdCA9PSAtMSkKLQkqZXJyID0gZXJybm87CisgICAgICAgICplcnIgPSBlcnJubzsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC05Nyw3ICs5Nyw3IEBACiB7CiAgICAgaW50IHJlc3VsdCA9IHJlbW92ZShwc3pGaWxlKTsKICAgICBpZiAocmVzdWx0ICE9IDApCi0JKmVyciA9IGVycm5vOworICAgICAgICAqZXJyID0gZXJybm87CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTEwLDkgKzExMCw5IEBACiB7CiAgICAgY2hhciAqbmFtZSA9IF90ZW1wbmFtKCIiLCAidG1wIik7CiAgICAgaWYgKChuYW1lICE9IE5VTEwpICYmICgoaW50KXN0cmxlbihuYW1lKSA8IGNiVGVtcE5hbWUpKSB7Ci0Jc3RyY3B5KHBzelRlbXBOYW1lLCBuYW1lKTsKLQlmcmVlKG5hbWUpOwotCXJldHVybiBUUlVFOworICAgICAgICBzdHJjcHkocHN6VGVtcE5hbWUsIG5hbWUpOworICAgICAgICBmcmVlKG5hbWUpOworICAgICAgICByZXR1cm4gVFJVRTsKICAgICB9CiAKICAgICBpZiAobmFtZSkgZnJlZShuYW1lKTsKQEAgLTEyMiwxMCArMTIyLDEwIEBACiBzdGF0aWMgRk5GQ0lTVEFUVVMoY2Jfc3RhdHVzKQogewogICAgIGlmIChwdikgewotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHB2LCAic3RhdHVzIiwgImlpaSIsIHR5cGVTdGF0dXMsIGNiMSwgY2IyKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JICAgIHJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocHYsICJzdGF0dXMiLCAiaWlpIiwgdHlwZVN0YXR1cywgY2IxLCBjYjIpOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTEzMywxOCArMTMzLDE4IEBACiBzdGF0aWMgRk5GQ0lHRVRORVhUQ0FCSU5FVChjYl9nZXRuZXh0Y2FiaW5ldCkKIHsKICAgICBpZiAocHYpIHsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChwdiwgImdldG5leHRjYWJpbmV0IiwgImkiLCBwY2NhYi0+aUNhYik7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKQotCSAgICByZXR1cm4gLTE7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayhyZXN1bHQpKSB7Ci0JICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIAotCQkiSW5jb3JyZWN0IHJldHVybiB0eXBlICVzIGZyb20gZ2V0bmV4dGNhYmluZXQiLAotCQlyZXN1bHQtPm9iX3R5cGUtPnRwX25hbWUpOwotCSAgICBQeV9ERUNSRUYocmVzdWx0KTsKLQkgICAgcmV0dXJuIEZBTFNFOwotCX0KLQlzdHJuY3B5KHBjY2FiLT5zekNhYiwgUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KSwgc2l6ZW9mKHBjY2FiLT5zekNhYikpOwotCXJldHVybiBUUlVFOworICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChwdiwgImdldG5leHRjYWJpbmV0IiwgImkiLCBwY2NhYi0+aUNhYik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhyZXN1bHQpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJJbmNvcnJlY3QgcmV0dXJuIHR5cGUgJXMgZnJvbSBnZXRuZXh0Y2FiaW5ldCIsCisgICAgICAgICAgICAgICAgcmVzdWx0LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIHN0cm5jcHkocGNjYWItPnN6Q2FiLCBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpLCBzaXplb2YocGNjYWItPnN6Q2FiKSk7CisgICAgICAgIHJldHVybiBUUlVFOwogICAgIH0KICAgICByZXR1cm4gRkFMU0U7CiB9CkBAIC0xNTcsMjEgKzE1NywyMSBAQAogCiAgICAgLyogTmVlZCBXaW4zMiBoYW5kbGUgdG8gZ2V0IHRpbWUgc3RhbXBzICovCiAgICAgaGFuZGxlID0gQ3JlYXRlRmlsZShwc3pOYW1lLCBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKLQlPUEVOX0VYSVNUSU5HLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOworICAgICAgICBPUEVOX0VYSVNUSU5HLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOwogICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0JcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAoR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoaGFuZGxlLCAmYmhmaSkgPT0gRkFMU0UpCiAgICAgewotCUNsb3NlSGFuZGxlKGhhbmRsZSk7Ci0JcmV0dXJuIC0xOworICAgICAgICBDbG9zZUhhbmRsZShoYW5kbGUpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgRmlsZVRpbWVUb0xvY2FsRmlsZVRpbWUoJmJoZmkuZnRMYXN0V3JpdGVUaW1lLCAmZmlsZXRpbWUpOwogICAgIEZpbGVUaW1lVG9Eb3NEYXRlVGltZSgmZmlsZXRpbWUsIHBkYXRlLCBwdGltZSk7CiAKLSAgICAqcGF0dHJpYnMgPSAoaW50KShiaGZpLmR3RmlsZUF0dHJpYnV0ZXMgJiAKLQkoX0FfUkRPTkxZIHwgX0FfU1lTVEVNIHwgX0FfSElEREVOIHwgX0FfQVJDSCkpOworICAgICpwYXR0cmlicyA9IChpbnQpKGJoZmkuZHdGaWxlQXR0cmlidXRlcyAmCisgICAgICAgIChfQV9SRE9OTFkgfCBfQV9TWVNURU0gfCBfQV9ISURERU4gfCBfQV9BUkNIKSk7CiAKICAgICBDbG9zZUhhbmRsZShoYW5kbGUpOwogCkBAIC0xODksMTEgKzE4OSwxMSBAQAogCiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOkZDSUNyZWF0ZSIsICZjYWJuYW1lLCAmZmlsZXMpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmICghUHlMaXN0X0NoZWNrKGZpbGVzKSkgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGQ0lDcmVhdGUgZXhwZWN0cyBhIGxpc3QiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZDSUNyZWF0ZSBleHBlY3RzIGEgbGlzdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBjY2FiLmNiID0gSU5UX01BWDsgLyogbm8gbmVlZCB0byBzcGxpdCBDQUIgaW50byBtdWx0aXBsZSBtZWRpYSAqLwpAQCAtMjA5LDQ5ICsyMDksNDkgQEAKICAgICBjY2FiLnN6RGlza1swXSA9ICdcMCc7CiAKICAgICBmb3IgKGkgPSAwLCBwID0gY2FibmFtZTsgKnA7IHAgPSBDaGFyTmV4dChwKSkKLQlpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnLycpCi0JICAgIGkgPSBwIC0gY2FibmFtZSArIDE7CisgICAgICAgIGlmICgqcCA9PSAnXFwnIHx8ICpwID09ICcvJykKKyAgICAgICAgICAgIGkgPSBwIC0gY2FibmFtZSArIDE7CiAKICAgICBpZiAoaSA+PSBzaXplb2YoY2NhYi5zekNhYlBhdGgpIHx8Ci0Jc3RybGVuKGNhYm5hbWUraSkgPj0gc2l6ZW9mKGNjYWIuc3pDYWIpKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJwYXRoIG5hbWUgdG9vIGxvbmciKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgc3RybGVuKGNhYm5hbWUraSkgPj0gc2l6ZW9mKGNjYWIuc3pDYWIpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicGF0aCBuYW1lIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIGlmIChpID4gMCkgewotCW1lbWNweShjY2FiLnN6Q2FiUGF0aCwgY2FibmFtZSwgaSk7Ci0JY2NhYi5zekNhYlBhdGhbaV0gPSAnXDAnOwotCXN0cmNweShjY2FiLnN6Q2FiLCBjYWJuYW1lK2kpOworICAgICAgICBtZW1jcHkoY2NhYi5zekNhYlBhdGgsIGNhYm5hbWUsIGkpOworICAgICAgICBjY2FiLnN6Q2FiUGF0aFtpXSA9ICdcMCc7CisgICAgICAgIHN0cmNweShjY2FiLnN6Q2FiLCBjYWJuYW1lK2kpOwogICAgIH0gZWxzZSB7Ci0Jc3RyY3B5KGNjYWIuc3pDYWJQYXRoLCAiLlxcIik7Ci0Jc3RyY3B5KGNjYWIuc3pDYWIsIGNhYm5hbWUpOworICAgICAgICBzdHJjcHkoY2NhYi5zekNhYlBhdGgsICIuXFwiKTsKKyAgICAgICAgc3RyY3B5KGNjYWIuc3pDYWIsIGNhYm5hbWUpOwogICAgIH0KIAogICAgIGhmY2kgPSBGQ0lDcmVhdGUoJmVyZiwgY2JfZmlsZXBsYWNlZCwgY2JfYWxsb2MsIGNiX2ZyZWUsCi0JY2Jfb3BlbiwgY2JfcmVhZCwgY2Jfd3JpdGUsIGNiX2Nsb3NlLCBjYl9zZWVrLCBjYl9kZWxldGUsCi0JY2JfZ2V0dGVtcGZpbGUsICZjY2FiLCBOVUxMKTsKKyAgICAgICAgY2Jfb3BlbiwgY2JfcmVhZCwgY2Jfd3JpdGUsIGNiX2Nsb3NlLCBjYl9zZWVrLCBjYl9kZWxldGUsCisgICAgICAgIGNiX2dldHRlbXBmaWxlLCAmY2NhYiwgTlVMTCk7CiAKICAgICBpZiAoaGZjaSA9PSBOVUxMKSB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJGQ0kgZXJyb3IgJWQiLCBlcmYuZXJmT3Blcik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiRkNJIGVycm9yICVkIiwgZXJmLmVyZk9wZXIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBmb3IgKGk9MDsgaSA8IFB5TGlzdF9HRVRfU0laRShmaWxlcyk7IGkrKykgewotCVB5T2JqZWN0ICppdGVtID0gUHlMaXN0X0dFVF9JVEVNKGZpbGVzLCBpKTsKLQljaGFyICpmaWxlbmFtZSwgKmNhYm5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGl0ZW0sICJzcyIsICZmaWxlbmFtZSwgJmNhYm5hbWUpKQotCSAgICBnb3RvIGVycjsKLQlpZiAoIUZDSUFkZEZpbGUoaGZjaSwgZmlsZW5hbWUsIGNhYm5hbWUsIEZBTFNFLCAKLQkgICAgY2JfZ2V0bmV4dGNhYmluZXQsIGNiX3N0YXR1cywgY2JfZ2V0b3BlbmluZm8sCi0JICAgIHRjb21wVFlQRV9NU1pJUCkpCi0JICAgIGdvdG8gZXJyOworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShmaWxlcywgaSk7CisgICAgICAgIGNoYXIgKmZpbGVuYW1lLCAqY2FibmFtZTsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGl0ZW0sICJzcyIsICZmaWxlbmFtZSwgJmNhYm5hbWUpKQorICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIGlmICghRkNJQWRkRmlsZShoZmNpLCBmaWxlbmFtZSwgY2FibmFtZSwgRkFMU0UsCisgICAgICAgICAgICBjYl9nZXRuZXh0Y2FiaW5ldCwgY2Jfc3RhdHVzLCBjYl9nZXRvcGVuaW5mbywKKyAgICAgICAgICAgIHRjb21wVFlQRV9NU1pJUCkpCisgICAgICAgICAgICBnb3RvIGVycjsKICAgICB9CiAKICAgICBpZiAoIUZDSUZsdXNoQ2FiaW5ldChoZmNpLCBGQUxTRSwgY2JfZ2V0bmV4dGNhYmluZXQsIGNiX3N0YXR1cykpCi0JZ290byBlcnI7CisgICAgICAgIGdvdG8gZXJyOwogCiAgICAgaWYgKCFGQ0lEZXN0cm95KGhmY2kpKQotCWdvdG8gZXJyOworICAgICAgICBnb3RvIGVycjsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgIE1TSUhBTkRMRSBoOwogfW1zaW9iajsKIAotc3RhdGljIHZvaWQgCitzdGF0aWMgdm9pZAogbXNpb2JqX2RlYWxsb2MobXNpb2JqKiBtc2lkYikKIHsKICAgICBNc2lDbG9zZUhhbmRsZShtc2lkYi0+aCk7CkBAIC0yOTIsNDEgKzI5Miw0MSBAQAogICAgIE1TSUhBTkRMRSBlcnIgPSBNc2lHZXRMYXN0RXJyb3JSZWNvcmQoKTsKIAogICAgIGlmIChlcnIgPT0gMCkgewotCXN3aXRjaChzdGF0dXMpIHsKLQljYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6Ci0JICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImFjY2VzcyBkZW5pZWQiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JY2FzZSBFUlJPUl9GVU5DVElPTl9GQUlMRUQ6Ci0JICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImZ1bmN0aW9uIGZhaWxlZCIpOwotCSAgICByZXR1cm4gTlVMTDsKLQljYXNlIEVSUk9SX0lOVkFMSURfREFUQToKLQkgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiaW52YWxpZCBkYXRhIik7Ci0JICAgIHJldHVybiBOVUxMOwotCWNhc2UgRVJST1JfSU5WQUxJRF9IQU5ETEU6Ci0JICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgaGFuZGxlIik7Ci0JICAgIHJldHVybiBOVUxMOwotCWNhc2UgRVJST1JfSU5WQUxJRF9TVEFURToKLQkgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiaW52YWxpZCBzdGF0ZSIpOwotCSAgICByZXR1cm4gTlVMTDsKLQljYXNlIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOgotCSAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJpbnZhbGlkIHBhcmFtZXRlciIpOwotCSAgICByZXR1cm4gTlVMTDsKLQlkZWZhdWx0OgotCSAgICBQeUVycl9Gb3JtYXQoTVNJRXJyb3IsICJ1bmtub3duIGVycm9yICV4Iiwgc3RhdHVzKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgIGNhc2UgRVJST1JfQUNDRVNTX0RFTklFRDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImFjY2VzcyBkZW5pZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjYXNlIEVSUk9SX0ZVTkNUSU9OX0ZBSUxFRDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImZ1bmN0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9EQVRBOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiaW52YWxpZCBkYXRhIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX0hBTkRMRToKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgaGFuZGxlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX1NUQVRFOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiaW52YWxpZCBzdGF0ZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9QQVJBTUVURVI6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJpbnZhbGlkIHBhcmFtZXRlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoTVNJRXJyb3IsICJ1bmtub3duIGVycm9yICV4Iiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgfQogCiAgICAgY29kZSA9IE1zaVJlY29yZEdldEludGVnZXIoZXJyLCAxKTsgLyogWFhYIGNvZGUgKi8KICAgICBpZiAoTXNpRm9ybWF0UmVjb3JkKDAsIGVyciwgcmVzLCAmc2l6ZSkgPT0gRVJST1JfTU9SRV9EQVRBKSB7Ci0JcmVzID0gbWFsbG9jKHNpemUrMSk7Ci0JTXNpRm9ybWF0UmVjb3JkKDAsIGVyciwgcmVzLCAmc2l6ZSk7Ci0JcmVzW3NpemVdPSdcMCc7CisgICAgICAgIHJlcyA9IG1hbGxvYyhzaXplKzEpOworICAgICAgICBNc2lGb3JtYXRSZWNvcmQoMCwgZXJyLCByZXMsICZzaXplKTsKKyAgICAgICAgcmVzW3NpemVdPSdcMCc7CiAgICAgfQogICAgIE1zaUNsb3NlSGFuZGxlKGVycik7CiAgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCByZXMpOwogICAgIGlmIChyZXMgIT0gYnVmKQotCWZyZWUocmVzKTsKKyAgICAgICAgZnJlZShyZXMpOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0zNDMsNyArMzQzLDcgQEAKIHsKICAgICB1bnNpZ25lZCBpbnQgZmllbGQ7CiAgICAgaW50IHN0YXR1czsKLSAgICAKKwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSTpHZXRJbnRlZ2VyIiwgJmZpZWxkKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgc3RhdHVzID0gTXNpUmVjb3JkR2V0SW50ZWdlcihyZWNvcmQtPmgsIGZpZWxkKTsKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgIGNoYXIgKnJlcyA9IGJ1ZjsKICAgICBEV09SRCBzaXplID0gc2l6ZW9mKGJ1Zik7CiAgICAgUHlPYmplY3QqIHN0cmluZzsKLSAgICAKKwogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSTpHZXRTdHJpbmciLCAmZmllbGQpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBzdGF0dXMgPSBNc2lSZWNvcmRHZXRTdHJpbmcocmVjb3JkLT5oLCBmaWVsZCwgcmVzLCAmc2l6ZSk7CkBAIC0zODYsNyArMzg2LDcgQEAKIHsKICAgICBpbnQgc3RhdHVzID0gTXNpUmVjb3JkQ2xlYXJEYXRhKHJlY29yZC0+aCk7CiAgICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTQwMCwxMCArNDAwLDEwIEBACiAgICAgY2hhciAqZGF0YTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXM6U2V0U3RyaW5nIiwgJmZpZWxkLCAmZGF0YSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKChzdGF0dXMgPSBNc2lSZWNvcmRTZXRTdHJpbmcocmVjb3JkLT5oLCBmaWVsZCwgZGF0YSkpICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwpAQCAtNDE3LDEwICs0MTcsMTAgQEAKICAgICBjaGFyICpkYXRhOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpczpTZXRTdHJlYW0iLCAmZmllbGQsICZkYXRhKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaVJlY29yZFNldFN0cmVhbShyZWNvcmQtPmgsIGZpZWxkLCBkYXRhKSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC00MzQsMTAgKzQzNCwxMCBAQAogICAgIGludCBkYXRhOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpTZXRJbnRlZ2VyIiwgJmZpZWxkLCAmZGF0YSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKChzdGF0dXMgPSBNc2lSZWNvcmRTZXRJbnRlZ2VyKHJlY29yZC0+aCwgZmllbGQsIGRhdGEpKSAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTQ0NiwzOSArNDQ2LDM5IEBACiAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHJlY29yZF9tZXRob2RzW10gPSB7Ci0gICAgeyAiR2V0RmllbGRDb3VudCIsIChQeUNGdW5jdGlvbilyZWNvcmRfZ2V0ZmllbGRjb3VudCwgTUVUSF9OT0FSR1MsIAotCVB5RG9jX1NUUigiR2V0RmllbGRDb3VudCgpIC0+IGludFxuV3JhcHMgTXNpUmVjb3JkR2V0RmllbGRDb3VudCIpfSwKKyAgICB7ICJHZXRGaWVsZENvdW50IiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9nZXRmaWVsZGNvdW50LCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJHZXRGaWVsZENvdW50KCkgLT4gaW50XG5XcmFwcyBNc2lSZWNvcmRHZXRGaWVsZENvdW50Iil9LAogICAgIHsgIkdldEludGVnZXIiLCAoUHlDRnVuY3Rpb24pcmVjb3JkX2dldGludGVnZXIsIE1FVEhfVkFSQVJHUywKICAgICBQeURvY19TVFIoIkdldEludGVnZXIoZmllbGQpIC0+IGludFxuV3JhcHMgTXNpUmVjb3JkR2V0SW50ZWdlciIpfSwKICAgICB7ICJHZXRTdHJpbmciLCAoUHlDRnVuY3Rpb24pcmVjb3JkX2dldHN0cmluZywgTUVUSF9WQVJBUkdTLAogICAgIFB5RG9jX1NUUigiR2V0U3RyaW5nKGZpZWxkKSAtPiBzdHJpbmdcbldyYXBzIE1zaVJlY29yZEdldFN0cmluZyIpfSwKLSAgICB7ICJTZXRTdHJpbmciLCAoUHlDRnVuY3Rpb24pcmVjb3JkX3NldHN0cmluZywgTUVUSF9WQVJBUkdTLCAKLQlQeURvY19TVFIoIlNldFN0cmluZyhmaWVsZCxzdHIpIC0+IE5vbmVcbldyYXBzIE1zaVJlY29yZFNldFN0cmluZyIpfSwKLSAgICB7ICJTZXRTdHJlYW0iLCAoUHlDRnVuY3Rpb24pcmVjb3JkX3NldHN0cmVhbSwgTUVUSF9WQVJBUkdTLCAKLQlQeURvY19TVFIoIlNldFN0cmVhbShmaWVsZCxmaWxlbmFtZSkgLT4gTm9uZVxuV3JhcHMgTXNpUmVjb3JkU2V0SW50ZWdlciIpfSwKLSAgICB7ICJTZXRJbnRlZ2VyIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRpbnRlZ2VyLCBNRVRIX1ZBUkFSR1MsIAotCVB5RG9jX1NUUigiU2V0SW50ZWdlcihmaWVsZCxpbnQpIC0+IE5vbmVcbldyYXBzIE1zaVJlY29yZFNldEludGVnZXIiKX0sCi0gICAgeyAiQ2xlYXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9jbGVhcmRhdGEsIE1FVEhfTk9BUkdTLCAKLQlQeURvY19TVFIoIkNsZWFyRGF0YSgpIC0+IGludFxuV3JhcHMgTXNpUmVjb3JkR0NsZWFyRGF0YSIpfSwKKyAgICB7ICJTZXRTdHJpbmciLCAoUHlDRnVuY3Rpb24pcmVjb3JkX3NldHN0cmluZywgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIlNldFN0cmluZyhmaWVsZCxzdHIpIC0+IE5vbmVcbldyYXBzIE1zaVJlY29yZFNldFN0cmluZyIpfSwKKyAgICB7ICJTZXRTdHJlYW0iLCAoUHlDRnVuY3Rpb24pcmVjb3JkX3NldHN0cmVhbSwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIlNldFN0cmVhbShmaWVsZCxmaWxlbmFtZSkgLT4gTm9uZVxuV3JhcHMgTXNpUmVjb3JkU2V0SW50ZWdlciIpfSwKKyAgICB7ICJTZXRJbnRlZ2VyIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRpbnRlZ2VyLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiU2V0SW50ZWdlcihmaWVsZCxpbnQpIC0+IE5vbmVcbldyYXBzIE1zaVJlY29yZFNldEludGVnZXIiKX0sCisgICAgeyAiQ2xlYXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9jbGVhcmRhdGEsIE1FVEhfTk9BUkdTLAorICAgICAgICBQeURvY19TVFIoIkNsZWFyRGF0YSgpIC0+IGludFxuV3JhcHMgTXNpUmVjb3JkR0NsZWFyRGF0YSIpfSwKICAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCByZWNvcmRfVHlwZSA9IHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLQkiX21zaS5SZWNvcmQiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YobXNpb2JqKSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwJCQkvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KKyAgICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgICAgICJfbXNpLlJlY29yZCIsICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgICAgIHNpemVvZihtc2lvYmopLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgICAgICAvKiBtZXRob2RzICovCisgICAgICAgIChkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwogICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KQEAgLTUxMyw4ICs1MTMsOCBAQAogICAgIG1zaW9iaiAqcmVzdWx0ID0gUHlPYmplY3RfTkVXKHN0cnVjdCBtc2lvYmosICZyZWNvcmRfVHlwZSk7CiAKICAgICBpZiAoIXJlc3VsdCkgewotCU1zaUNsb3NlSGFuZGxlKGgpOwotCXJldHVybiBOVUxMOworICAgICAgICBNc2lDbG9zZUhhbmRsZShoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmVzdWx0LT5oID0gaDsKQEAgLTUzNywyNyArNTM3LDI3IEBACiAgICAgRFdPUkQgc3NpemUgPSBzaXplb2Yoc3ZhbCk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6R2V0UHJvcGVydHkiLCAmZmllbGQpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCAmdHlwZSwgJml2YWwsIAotCSZmdmFsLCBzdmFsLCAmc3NpemUpOworICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCAmdHlwZSwgJml2YWwsCisgICAgICAgICZmdmFsLCBzdmFsLCAmc3NpemUpOwogICAgIGlmIChzdGF0dXMgPT0gRVJST1JfTU9SRV9EQVRBKSB7Ci0Jc3ZhbCA9IG1hbGxvYyhzc2l6ZSk7Ci0gICAgICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCAmdHlwZSwgJml2YWwsIAotICAgIAkgICAgJmZ2YWwsIHN2YWwsICZzc2l6ZSk7CisgICAgICAgIHN2YWwgPSBtYWxsb2Moc3NpemUpOworICAgICAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5KHNpLT5oLCBmaWVsZCwgJnR5cGUsICZpdmFsLAorICAgICAgICAgICAgJmZ2YWwsIHN2YWwsICZzc2l6ZSk7CiAgICAgfQogCiAgICAgc3dpdGNoKHR5cGUpIHsKLQljYXNlIFZUX0kyOiBjYXNlIFZUX0k0OgotCSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoaXZhbCk7Ci0JY2FzZSBWVF9GSUxFVElNRToKLQkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsICJGSUxFVElNRSByZXN1bHQiKTsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JY2FzZSBWVF9MUFNUUjoKLQkgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3ZhbCwgc3NpemUpOwotCSAgICBpZiAoc3ZhbCAhPSBzYnVmKQotCQlmcmVlKHN2YWwpOwotCSAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBjYXNlIFZUX0kyOiBjYXNlIFZUX0k0OgorICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGl2YWwpOworICAgICAgICBjYXNlIFZUX0ZJTEVUSU1FOgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsICJGSUxFVElNRSByZXN1bHQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjYXNlIFZUX0xQU1RSOgorICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3ZhbCwgc3NpemUpOworICAgICAgICAgICAgaWYgKHN2YWwgIT0gc2J1ZikKKyAgICAgICAgICAgICAgICBmcmVlKHN2YWwpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsICJyZXN1bHQgb2YgdHlwZSAlZCIsIHR5cGUpOwogICAgIHJldHVybiBOVUxMOwpAQCAtNTcxLDcgKzU3MSw3IEBACiAKICAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5Q291bnQoc2ktPmgsICZyZXN1bHQpOwogICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzdWx0KTsKIH0KQEAgLTU4NCwyMSArNTg0LDIxIEBACiAgICAgUHlPYmplY3QqIGRhdGE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOlNldFByb3BlcnR5IiwgJmZpZWxkLCAmZGF0YSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGRhdGEpKSB7Ci0Jc3RhdHVzID0gTXNpU3VtbWFyeUluZm9TZXRQcm9wZXJ0eShzaS0+aCwgZmllbGQsIFZUX0xQU1RSLAotCSAgICAwLCBOVUxMLCBQeVN0cmluZ19Bc1N0cmluZyhkYXRhKSk7CisgICAgICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvU2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCBWVF9MUFNUUiwKKyAgICAgICAgICAgIDAsIE5VTEwsIFB5U3RyaW5nX0FzU3RyaW5nKGRhdGEpKTsKICAgICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKGRhdGEpKSB7Ci0Jc3RhdHVzID0gTXNpU3VtbWFyeUluZm9TZXRQcm9wZXJ0eShzaS0+aCwgZmllbGQsIFZUX0k0LAotCSAgICBQeUludF9Bc0xvbmcoZGF0YSksIE5VTEwsIE5VTEwpOworICAgICAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb1NldFByb3BlcnR5KHNpLT5oLCBmaWVsZCwgVlRfSTQsCisgICAgICAgICAgICBQeUludF9Bc0xvbmcoZGF0YSksIE5VTEwsIE5VTEwpOwogICAgIH0gZWxzZSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuc3VwcG9ydGVkIHR5cGUiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuc3VwcG9ydGVkIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIAorCiAgICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTYxMiwzOSArNjEyLDM5IEBACiAKICAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb1BlcnNpc3Qoc2ktPmgpOwogICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3VtbWFyeV9tZXRob2RzW10gPSB7Ci0gICAgeyAiR2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pc3VtbWFyeV9nZXRwcm9wZXJ0eSwgTUVUSF9WQVJBUkdTLCAKLQlQeURvY19TVFIoIkdldFByb3BlcnR5KHByb3BpZCkgLT4gdmFsdWVcbldyYXBzIE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHkiKX0sCi0gICAgeyAiR2V0UHJvcGVydHlDb3VudCIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X2dldHByb3BlcnR5Y291bnQsIE1FVEhfTk9BUkdTLCAKLQlQeURvY19TVFIoIkdldFByb3BlcnR5KCkgLT4gaW50XG5XcmFwcyBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5Q291bnQiKX0sCi0gICAgeyAiU2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pc3VtbWFyeV9zZXRwcm9wZXJ0eSwgTUVUSF9WQVJBUkdTLCAKLQlQeURvY19TVFIoIlNldFByb3BlcnR5KHZhbHVlKSAtPiBOb25lXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb1Byb3BlcnR5Iil9LAotICAgIHsgIlBlcnNpc3QiLCAoUHlDRnVuY3Rpb24pc3VtbWFyeV9wZXJzaXN0LCBNRVRIX05PQVJHUywgCi0JUHlEb2NfU1RSKCJQZXJzaXN0KCkgLT4gTm9uZVxuV3JhcHMgTXNpU3VtbWFyeUluZm9QZXJzaXN0Iil9LAorICAgIHsgIkdldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfZ2V0cHJvcGVydHksIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJHZXRQcm9wZXJ0eShwcm9waWQpIC0+IHZhbHVlXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5Iil9LAorICAgIHsgIkdldFByb3BlcnR5Q291bnQiLCAoUHlDRnVuY3Rpb24pc3VtbWFyeV9nZXRwcm9wZXJ0eWNvdW50LCBNRVRIX05PQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJHZXRQcm9wZXJ0eSgpIC0+IGludFxuV3JhcHMgTXNpU3VtbWFyeUluZm9HZXRQcm9wZXJ0eUNvdW50Iil9LAorICAgIHsgIlNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfc2V0cHJvcGVydHksIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJTZXRQcm9wZXJ0eSh2YWx1ZSkgLT4gTm9uZVxuV3JhcHMgTXNpU3VtbWFyeUluZm9Qcm9wZXJ0eSIpfSwKKyAgICB7ICJQZXJzaXN0IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfcGVyc2lzdCwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiUGVyc2lzdCgpIC0+IE5vbmVcbldyYXBzIE1zaVN1bW1hcnlJbmZvUGVyc2lzdCIpfSwKICAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBzdW1tYXJ5X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9tc2kuU3VtbWFyeUluZm9ybWF0aW9uIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKG1zaW9iaiksCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCS8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3Rvciltc2lvYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLAkJCS8qdHBfcHJpbnQqLwotCTAsCQkJLyp0cF9nZXRhdHRyKi8KLQkwLAkJCS8qdHBfc2V0YXR0ciovCi0JMCwJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KLQkwLAkJCS8qdHBfaGFzaCovCisgICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICAgICAiX21zaS5TdW1tYXJ5SW5mb3JtYXRpb24iLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICAgICAgc2l6ZW9mKG1zaW9iaiksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgICAgIC8qIG1ldGhvZHMgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpbXNpb2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAgICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwpAQCAtNjgzLDcgKzY4Myw3IEBACiAgICAgUHlPYmplY3QgKm9wYXJhbXMgPSBQeV9Ob25lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOkV4ZWN1dGUiLCAmb3BhcmFtcykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKG9wYXJhbXMgIT0gUHlfTm9uZSkgewogICAgICAgICBpZiAob3BhcmFtcy0+b2JfdHlwZSAhPSAmcmVjb3JkX1R5cGUpIHsKQEAgLTY5NSw3ICs2OTUsNyBAQAogCiAgICAgc3RhdHVzID0gTXNpVmlld0V4ZWN1dGUodmlldy0+aCwgcGFyYW1zKTsKICAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCi0JcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CisgICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwogCiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgIHJldHVybiBQeV9Ob25lOwpAQCAtNzA4LDcgKzcwOCw3IEBACiAgICAgTVNJSEFORExFIHJlc3VsdDsKIAogICAgIGlmICgoc3RhdHVzID0gTXNpVmlld0ZldGNoKHZpZXctPmgsICZyZXN1bHQpKSAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIHJldHVybiByZWNvcmRfbmV3KHJlc3VsdCk7CiB9CkBAIC03MjEsMTAgKzcyMSwxMCBAQAogICAgIE1TSUhBTkRMRSByZXN1bHQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6R2V0Q29sdW1uSW5mbyIsICZraW5kKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdHZXRDb2x1bW5JbmZvKHZpZXctPmgsIGtpbmQsICZyZXN1bHQpKSAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIHJldHVybiByZWNvcmRfbmV3KHJlc3VsdCk7CiB9CkBAIC03MzcsMTUgKzczNywxNSBAQAogICAgIGludCBzdGF0dXM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOk1vZGlmeSIsICZraW5kLCAmZGF0YSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKGRhdGEtPm9iX3R5cGUgIT0gJnJlY29yZF9UeXBlKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1vZGlmeSBleHBlY3RzIGEgcmVjb3JkIG9iamVjdCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTW9kaWZ5IGV4cGVjdHMgYSByZWNvcmQgb2JqZWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGlmICgoc3RhdHVzID0gTXNpVmlld01vZGlmeSh2aWV3LT5oLCBraW5kLCAoKG1zaW9iaiopZGF0YSktPmgpKSAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTc1Nyw0MiArNzU3LDQyIEBACiAgICAgaW50IHN0YXR1czsKIAogICAgIGlmICgoc3RhdHVzID0gTXNpVmlld0Nsb3NlKHZpZXctPmgpKSAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIHZpZXdfbWV0aG9kc1tdID0gewotICAgIHsgIkV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pdmlld19leGVjdXRlLCBNRVRIX1ZBUkFSR1MsIAotCVB5RG9jX1NUUigiRXhlY3V0ZShwYXJhbXM9Tm9uZSkgLT4gTm9uZVxuV3JhcHMgTXNpVmlld0V4ZWN1dGUiKX0sCisgICAgeyAiRXhlY3V0ZSIsIChQeUNGdW5jdGlvbil2aWV3X2V4ZWN1dGUsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlKHBhcmFtcz1Ob25lKSAtPiBOb25lXG5XcmFwcyBNc2lWaWV3RXhlY3V0ZSIpfSwKICAgICB7ICJHZXRDb2x1bW5JbmZvIiwgKFB5Q0Z1bmN0aW9uKXZpZXdfZ2V0Y29sdW1uaW5mbywgTUVUSF9WQVJBUkdTLAotCVB5RG9jX1NUUigiR2V0Q29sdW1uSW5mbygpIC0+IHJlc3VsdFxuV3JhcHMgTXNpR2V0Q29sdW1uSW5mbyIpfSwKKyAgICAgICAgUHlEb2NfU1RSKCJHZXRDb2x1bW5JbmZvKCkgLT4gcmVzdWx0XG5XcmFwcyBNc2lHZXRDb2x1bW5JbmZvIil9LAogICAgIHsgIkZldGNoIiwgKFB5Q0Z1bmN0aW9uKXZpZXdfZmV0Y2gsIE1FVEhfTk9BUkdTLAotCVB5RG9jX1NUUigiRmV0Y2goKSAtPiByZXN1bHRcbldyYXBzIE1zaVZpZXdGZXRjaCIpfSwKKyAgICAgICAgUHlEb2NfU1RSKCJGZXRjaCgpIC0+IHJlc3VsdFxuV3JhcHMgTXNpVmlld0ZldGNoIil9LAogICAgIHsgIk1vZGlmeSIsIChQeUNGdW5jdGlvbil2aWV3X21vZGlmeSwgTUVUSF9WQVJBUkdTLAotCVB5RG9jX1NUUigiTW9kaWZ5KG1vZGUscmVjb3JkKSAtPiBOb25lXG5XcmFwcyBNc2lWaWV3TW9kaWZ5Iil9LAorICAgICAgICBQeURvY19TVFIoIk1vZGlmeShtb2RlLHJlY29yZCkgLT4gTm9uZVxuV3JhcHMgTXNpVmlld01vZGlmeSIpfSwKICAgICB7ICJDbG9zZSIsIChQeUNGdW5jdGlvbil2aWV3X2Nsb3NlLCBNRVRIX05PQVJHUywKLQlQeURvY19TVFIoIkNsb3NlKCkgLT4gcmVzdWx0XG5XcmFwcyBNc2lWaWV3Q2xvc2UiKX0sCisgICAgICAgIFB5RG9jX1NUUigiQ2xvc2UoKSAtPiByZXN1bHRcbldyYXBzIE1zaVZpZXdDbG9zZSIpfSwKICAgICB7IE5VTEwsIE5VTEwgfQogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBtc2l2aWV3X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9tc2kuVmlldyIsCQkvKnRwX25hbWUqLwotCXNpemVvZihtc2lvYmopLAkvKnRwX2Jhc2ljc2l6ZSovCi0JMCwJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbXNpb2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCQkvKnRwX3ByaW50Ki8KLQkwLAkJCS8qdHBfZ2V0YXR0ciovCi0JMCwJCQkvKnRwX3NldGF0dHIqLwotCTAsCQkJLyp0cF9jb21wYXJlKi8KLQkwLAkJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLAkJCS8qdHBfYXNfbWFwcGluZyovCi0JMCwJCQkvKnRwX2hhc2gqLworICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAgICAgIl9tc2kuVmlldyIsICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICAgICAgc2l6ZW9mKG1zaW9iaiksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgICAgIC8qIG1ldGhvZHMgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpbXNpb2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAgICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwpAQCAtODMyLDE1ICs4MzIsMTUgQEAKICAgICBtc2lvYmogKnJlc3VsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpPcGVuVmlldyIsICZzcWwpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmICgoc3RhdHVzID0gTXNpRGF0YWJhc2VPcGVuVmlldyhtc2lkYi0+aCwgc3FsLCAmaFZpZXcpKSAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIHJlc3VsdCA9IFB5T2JqZWN0X05FVyhzdHJ1Y3QgbXNpb2JqLCAmbXNpdmlld19UeXBlKTsKICAgICBpZiAoIXJlc3VsdCkgewotCU1zaUNsb3NlSGFuZGxlKGhWaWV3KTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgTXNpQ2xvc2VIYW5kbGUoaFZpZXcpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICByZXN1bHQtPmggPSBoVmlldzsKQEAgLTg1Myw3ICs4NTMsNyBAQAogICAgIGludCBzdGF0dXM7CiAKICAgICBpZiAoKHN0YXR1cyA9IE1zaURhdGFiYXNlQ29tbWl0KG1zaWRiLT5oKSkgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICAgcmV0dXJuIFB5X05vbmU7CkBAIC04NjgsMTYgKzg2OCwxNiBAQAogICAgIG1zaW9iaiAqb3Jlc3VsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpHZXRTdW1tYXJ5SW5mb3JtYXRpb24iLCAmY291bnQpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHN0YXR1cyA9IE1zaUdldFN1bW1hcnlJbmZvcm1hdGlvbihkYi0+aCwgTlVMTCwgY291bnQsICZyZXN1bHQpOwogICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKLQlyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CiAKICAgICBvcmVzdWx0ID0gUHlPYmplY3RfTkVXKHN0cnVjdCBtc2lvYmosICZzdW1tYXJ5X1R5cGUpOwogICAgIGlmICghcmVzdWx0KSB7Ci0JTXNpQ2xvc2VIYW5kbGUocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgTXNpQ2xvc2VIYW5kbGUocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgb3Jlc3VsdC0+aCA9IHJlc3VsdDsKQEAgLTg4NSwzMSArODg1LDMxIEBACiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBkYl9tZXRob2RzW10gPSB7Ci0gICAgeyAiT3BlblZpZXciLCAoUHlDRnVuY3Rpb24pbXNpZGJfb3BlbnZpZXcsIE1FVEhfVkFSQVJHUywgCi0JUHlEb2NfU1RSKCJPcGVuVmlldyhzcWwpIC0+IHZpZXdvYmpcbldyYXBzIE1zaURhdGFiYXNlT3BlblZpZXciKX0sCisgICAgeyAiT3BlblZpZXciLCAoUHlDRnVuY3Rpb24pbXNpZGJfb3BlbnZpZXcsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJPcGVuVmlldyhzcWwpIC0+IHZpZXdvYmpcbldyYXBzIE1zaURhdGFiYXNlT3BlblZpZXciKX0sCiAgICAgeyAiQ29tbWl0IiwgKFB5Q0Z1bmN0aW9uKW1zaWRiX2NvbW1pdCwgTUVUSF9OT0FSR1MsCi0JUHlEb2NfU1RSKCJDb21taXQoKSAtPiBOb25lXG5XcmFwcyBNc2lEYXRhYmFzZUNvbW1pdCIpfSwKLSAgICB7ICJHZXRTdW1tYXJ5SW5mb3JtYXRpb24iLCAoUHlDRnVuY3Rpb24pbXNpZGJfZ2V0c3VtbWFyeWluZm9ybWF0aW9uLCBNRVRIX1ZBUkFSR1MsIAotCVB5RG9jX1NUUigiR2V0U3VtbWFyeUluZm9ybWF0aW9uKHVwZGF0ZUNvdW50KSAtPiB2aWV3b2JqXG5XcmFwcyBNc2lHZXRTdW1tYXJ5SW5mb3JtYXRpb24iKX0sCisgICAgICAgIFB5RG9jX1NUUigiQ29tbWl0KCkgLT4gTm9uZVxuV3JhcHMgTXNpRGF0YWJhc2VDb21taXQiKX0sCisgICAgeyAiR2V0U3VtbWFyeUluZm9ybWF0aW9uIiwgKFB5Q0Z1bmN0aW9uKW1zaWRiX2dldHN1bW1hcnlpbmZvcm1hdGlvbiwgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIkdldFN1bW1hcnlJbmZvcm1hdGlvbih1cGRhdGVDb3VudCkgLT4gdmlld29ialxuV3JhcHMgTXNpR2V0U3VtbWFyeUluZm9ybWF0aW9uIil9LAogICAgIHsgTlVMTCwgTlVMTCB9CiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IG1zaWRiX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JIl9tc2kuRGF0YWJhc2UiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YobXNpb2JqKSwJLyp0cF9iYXNpY3NpemUqLwotCTAsCQkJLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsCQkJLyp0cF9wcmludCovCi0JMCwJCQkvKnRwX2dldGF0dHIqLwotCTAsCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCS8qdHBfY29tcGFyZSovCi0JMCwJCQkvKnRwX3JlcHIqLwotCTAsCQkJLyp0cF9hc19udW1iZXIqLwotCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkJLyp0cF9oYXNoKi8KKyAgICAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgICAgICJfbXNpLkRhdGFiYXNlIiwgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICAgICAgc2l6ZW9mKG1zaW9iaiksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgICAgIC8qIG1ldGhvZHMgKi8KKyAgICAgICAgKGRlc3RydWN0b3IpbXNpb2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAgICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwpAQCAtOTQ1LDE4ICs5NDUsMTggQEAKICAgICBpbnQgcGVyc2lzdDsKICAgICBNU0lIQU5ETEUgaDsKICAgICBtc2lvYmogKnJlc3VsdDsKLSAgICAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpOk1TSU9wZW5EYXRhYmFzZSIsICZwYXRoLCAmcGVyc2lzdCkpCi0JcmV0dXJuIE5VTEw7CiAKLQlzdGF0dXMgPSBNc2lPcGVuRGF0YWJhc2UocGF0aCwgKExQQ1NUUilwZXJzaXN0LCAmaCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaTpNU0lPcGVuRGF0YWJhc2UiLCAmcGF0aCwgJnBlcnNpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBzdGF0dXMgPSBNc2lPcGVuRGF0YWJhc2UocGF0aCwgKExQQ1NUUilwZXJzaXN0LCAmaCk7CiAgICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBtc2llcnJvcihzdGF0dXMpOworICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKIAogICAgIHJlc3VsdCA9IFB5T2JqZWN0X05FVyhzdHJ1Y3QgbXNpb2JqLCAmbXNpZGJfVHlwZSk7CiAgICAgaWYgKCFyZXN1bHQpIHsKLQlNc2lDbG9zZUhhbmRsZShoKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgTXNpQ2xvc2VIYW5kbGUoaCk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXN1bHQtPmggPSBoOwogICAgIHJldHVybiAoUHlPYmplY3QqKXJlc3VsdDsKQEAgLTk2OSwxMSArOTY5LDExIEBACiAgICAgTVNJSEFORExFIGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6Q3JlYXRlUmVjb3JkIiwgJmNvdW50KSkKLQlyZXR1cm4gTlVMTDsKLSAgICAKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKICAgICBoID0gTXNpQ3JlYXRlUmVjb3JkKGNvdW50KTsKICAgICBpZiAoaCA9PSAwKQotCXJldHVybiBtc2llcnJvcigwKTsKKyAgICAgICAgcmV0dXJuIG1zaWVycm9yKDApOwogCiAgICAgcmV0dXJuIHJlY29yZF9uZXcoaCk7CiB9CkBAIC05ODEsMTQgKzk4MSwxNCBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYgbXNpX21ldGhvZHNbXSA9IHsKICAgICAgICAgeyJVdWlkQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKXV1aWRjcmVhdGUsIE1FVEhfTk9BUkdTLAotCQlQeURvY19TVFIoIlV1aWRDcmVhdGUoKSAtPiBzdHJpbmciKX0sCi0JeyJGQ0lDcmVhdGUiLAkoUHlDRnVuY3Rpb24pZmNpY3JlYXRlLAlNRVRIX1ZBUkFSR1MsCi0JCVB5RG9jX1NUUigiZmNpY3JlYXRlKGNhYm5hbWUsZmlsZXMpIC0+IE5vbmUiKX0sCi0JeyJPcGVuRGF0YWJhc2UiLCAoUHlDRnVuY3Rpb24pbXNpb3BlbmRiLCBNRVRIX1ZBUkFSR1MsCi0JUHlEb2NfU1RSKCJPcGVuRGF0YWJhc2UobmFtZSwgZmxhZ3MpIC0+IGRib2JqXG5XcmFwcyBNc2lPcGVuRGF0YWJhc2UiKX0sCi0JeyJDcmVhdGVSZWNvcmQiLCAoUHlDRnVuY3Rpb24pY3JlYXRlcmVjb3JkLCBNRVRIX1ZBUkFSR1MsCi0JUHlEb2NfU1RSKCJPcGVuRGF0YWJhc2UobmFtZSwgZmxhZ3MpIC0+IGRib2JqXG5XcmFwcyBNc2lDcmVhdGVSZWNvcmQiKX0sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICAgICAgICAgICAgICBQeURvY19TVFIoIlV1aWRDcmVhdGUoKSAtPiBzdHJpbmciKX0sCisgICAgICAgIHsiRkNJQ3JlYXRlIiwgICAoUHlDRnVuY3Rpb24pZmNpY3JlYXRlLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgUHlEb2NfU1RSKCJmY2ljcmVhdGUoY2FibmFtZSxmaWxlcykgLT4gTm9uZSIpfSwKKyAgICAgICAgeyJPcGVuRGF0YWJhc2UiLCAoUHlDRnVuY3Rpb24pbXNpb3BlbmRiLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiT3BlbkRhdGFiYXNlKG5hbWUsIGZsYWdzKSAtPiBkYm9ialxuV3JhcHMgTXNpT3BlbkRhdGFiYXNlIil9LAorICAgICAgICB7IkNyZWF0ZVJlY29yZCIsIChQeUNGdW5jdGlvbiljcmVhdGVyZWNvcmQsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJPcGVuRGF0YWJhc2UobmFtZSwgZmxhZ3MpIC0+IGRib2JqXG5XcmFwcyBNc2lDcmVhdGVSZWNvcmQiKX0sCisgICAgICAgIHtOVUxMLCAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBjaGFyIG1zaV9kb2NbXSA9ICJEb2N1bWVudGF0aW9uIjsKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAKICAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9tc2kiLCBtc2lfbWV0aG9kcywgbXNpX2RvYyk7CiAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFRElSRUNUIiwgKGludClNU0lEQk9QRU5fQ1JFQVRFRElSRUNUKTsKICAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0NSRUFURSIsIChpbnQpTVNJREJPUEVOX0NSRUFURSk7CkBAIC0xMDQ2LDYgKzEwNDYsNiBAQAogCiAgICAgTVNJRXJyb3IgPSBQeUVycl9OZXdFeGNlcHRpb24gKCJfbXNpLk1TSUVycm9yIiwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKCFNU0lFcnJvcikKLQlyZXR1cm47CisgICAgICAgIHJldHVybjsKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1TSUVycm9yIiwgTVNJRXJyb3IpOwogfQpkaWZmIC0tZ2l0IGEvUEMvX3N1YnByb2Nlc3MuYyBiL1BDL19zdWJwcm9jZXNzLmMKaW5kZXggNTM4OWQ3OS4uNmIzNDE3NSAxMDA2NDQKLS0tIGEvUEMvX3N1YnByb2Nlc3MuYworKysgYi9QQy9fc3VicHJvY2Vzcy5jCkBAIC00OSw4ICs0OSw4IEBACiAgICB0aGUgd3JhcHBlciBpcyB1c2VkIHRvIHByb3ZpZGUgRGV0YWNoIGFuZCBDbG9zZSBtZXRob2RzICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JSEFORExFIGhhbmRsZTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgSEFORExFIGhhbmRsZTsKIH0gc3BfaGFuZGxlX29iamVjdDsKIAogc3RhdGljZm9yd2FyZCBQeVR5cGVPYmplY3Qgc3BfaGFuZGxlX3R5cGU7CkBAIC01OCw5NyArNTgsOTcgQEAKIHN0YXRpYyBQeU9iamVjdCoKIHNwX2hhbmRsZV9uZXcoSEFORExFIGhhbmRsZSkKIHsKLQlzcF9oYW5kbGVfb2JqZWN0KiBzZWxmOworICAgIHNwX2hhbmRsZV9vYmplY3QqIHNlbGY7CiAKLQlzZWxmID0gUHlPYmplY3RfTkVXKHNwX2hhbmRsZV9vYmplY3QsICZzcF9oYW5kbGVfdHlwZSk7Ci0JaWYgKHNlbGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VsZiA9IFB5T2JqZWN0X05FVyhzcF9oYW5kbGVfb2JqZWN0LCAmc3BfaGFuZGxlX3R5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jc2VsZi0+aGFuZGxlID0gaGFuZGxlOworICAgIHNlbGYtPmhhbmRsZSA9IGhhbmRsZTsKIAotCXJldHVybiAoUHlPYmplY3QqKSBzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwogfQogCiAjaWYgZGVmaW5lZChNU19XSU4zMikgJiYgIWRlZmluZWQoTVNfV0lONjQpCi0jZGVmaW5lIEhBTkRMRV9UT19QWU5VTShoYW5kbGUpCVB5SW50X0Zyb21Mb25nKChsb25nKSBoYW5kbGUpCi0jZGVmaW5lIFBZX0hBTkRMRV9QQVJBTQkibCIKKyNkZWZpbmUgSEFORExFX1RPX1BZTlVNKGhhbmRsZSkgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGhhbmRsZSkKKyNkZWZpbmUgUFlfSEFORExFX1BBUkFNICJsIgogI2Vsc2UKLSNkZWZpbmUgSEFORExFX1RPX1BZTlVNKGhhbmRsZSkJUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSBoYW5kbGUpCi0jZGVmaW5lIFBZX0hBTkRMRV9QQVJBTQkiTCIKKyNkZWZpbmUgSEFORExFX1RPX1BZTlVNKGhhbmRsZSkgUHlMb25nX0Zyb21Mb25nTG9uZygobG9uZyBsb25nKSBoYW5kbGUpCisjZGVmaW5lIFBZX0hBTkRMRV9QQVJBTSAiTCIKICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QqCiBzcF9oYW5kbGVfZGV0YWNoKHNwX2hhbmRsZV9vYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUhBTkRMRSBoYW5kbGU7CisgICAgSEFORExFIGhhbmRsZTsKIAotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpEZXRhY2giKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOkRldGFjaCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWhhbmRsZSA9IHNlbGYtPmhhbmRsZTsKKyAgICBoYW5kbGUgPSBzZWxmLT5oYW5kbGU7CiAKLQlzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICBzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKIAotCS8qIG5vdGU6IHJldHVybiB0aGUgY3VycmVudCBoYW5kbGUsIGFzIGFuIGludGVnZXIgKi8KLQlyZXR1cm4gSEFORExFX1RPX1BZTlVNKGhhbmRsZSk7CisgICAgLyogbm90ZTogcmV0dXJuIHRoZSBjdXJyZW50IGhhbmRsZSwgYXMgYW4gaW50ZWdlciAqLworICAgIHJldHVybiBIQU5ETEVfVE9fUFlOVU0oaGFuZGxlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgogc3BfaGFuZGxlX2Nsb3NlKHNwX2hhbmRsZV9vYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpDbG9zZSIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Q2xvc2UiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2VsZi0+aGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCUNsb3NlSGFuZGxlKHNlbGYtPmhhbmRsZSk7Ci0JCXNlbGYtPmhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHNlbGYtPmhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBDbG9zZUhhbmRsZShzZWxmLT5oYW5kbGUpOworICAgICAgICBzZWxmLT5oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgdm9pZAogc3BfaGFuZGxlX2RlYWxsb2Moc3BfaGFuZGxlX29iamVjdCogc2VsZikKIHsKLQlpZiAoc2VsZi0+aGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQotCQlDbG9zZUhhbmRsZShzZWxmLT5oYW5kbGUpOwotCVB5T2JqZWN0X0ZSRUUoc2VsZik7CisgICAgaWYgKHNlbGYtPmhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgQ2xvc2VIYW5kbGUoc2VsZi0+aGFuZGxlKTsKKyAgICBQeU9iamVjdF9GUkVFKHNlbGYpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgc3BfaGFuZGxlX21ldGhvZHNbXSA9IHsKLQl7IkRldGFjaCIsIChQeUNGdW5jdGlvbikgc3BfaGFuZGxlX2RldGFjaCwgTUVUSF9WQVJBUkdTfSwKLQl7IkNsb3NlIiwgIChQeUNGdW5jdGlvbikgc3BfaGFuZGxlX2Nsb3NlLCAgTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwgTlVMTH0KKyAgICB7IkRldGFjaCIsIChQeUNGdW5jdGlvbikgc3BfaGFuZGxlX2RldGFjaCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7IkNsb3NlIiwgIChQeUNGdW5jdGlvbikgc3BfaGFuZGxlX2Nsb3NlLCAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgTlVMTH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCoKIHNwX2hhbmRsZV9nZXRhdHRyKHNwX2hhbmRsZV9vYmplY3QqIHNlbGYsIGNoYXIqIG5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc3BfaGFuZGxlX21ldGhvZHMsIChQeU9iamVjdCopIHNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKHNwX2hhbmRsZV9tZXRob2RzLCAoUHlPYmplY3QqKSBzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0Kgogc3BfaGFuZGxlX2FzX2ludChzcF9oYW5kbGVfb2JqZWN0KiBzZWxmKQogewotCXJldHVybiBIQU5ETEVfVE9fUFlOVU0oc2VsZi0+aGFuZGxlKTsKKyAgICByZXR1cm4gSEFORExFX1RPX1BZTlVNKHNlbGYtPmhhbmRsZSk7CiB9CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgc3BfaGFuZGxlX2FzX251bWJlcjsKIAogc3RhdGljaGVyZSBQeVR5cGVPYmplY3Qgc3BfaGFuZGxlX3R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiX3N1YnByb2Nlc3NfaGFuZGxlIiwgc2l6ZW9mKHNwX2hhbmRsZV9vYmplY3QpLCAwLAotCShkZXN0cnVjdG9yKSBzcF9oYW5kbGVfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpIHNwX2hhbmRsZV9nZXRhdHRyLC8qdHBfZ2V0YXR0ciovCi0JMCwJCQkJLyp0cF9zZXRhdHRyKi8KLQkwLAkJCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkJCS8qdHBfcmVwciovCi0JJnNwX2hhbmRsZV9hc19udW1iZXIsCQkvKnRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qdHBfYXNfc2VxdWVuY2UgKi8KLQkwLAkJCQkvKnRwX2FzX21hcHBpbmcgKi8KLQkwCQkJCS8qdHBfaGFzaCovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvYl9zaXplKi8KKyAgICAiX3N1YnByb2Nlc3NfaGFuZGxlIiwgc2l6ZW9mKHNwX2hhbmRsZV9vYmplY3QpLCAwLAorICAgIChkZXN0cnVjdG9yKSBzcF9oYW5kbGVfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpIHNwX2hhbmRsZV9nZXRhdHRyLC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgJnNwX2hhbmRsZV9hc19udW1iZXIsICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nICovCisgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNjQsMjYgKzE2NCwyNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwX0dldFN0ZEhhbmRsZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JSEFORExFIGhhbmRsZTsKLQlpbnQgc3RkX2hhbmRsZTsKKyAgICBIQU5ETEUgaGFuZGxlOworICAgIGludCBzdGRfaGFuZGxlOwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpHZXRTdGRIYW5kbGUiLCAmc3RkX2hhbmRsZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6R2V0U3RkSGFuZGxlIiwgJnN0ZF9oYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQloYW5kbGUgPSBHZXRTdGRIYW5kbGUoKERXT1JEKSBzdGRfaGFuZGxlKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBoYW5kbGUgPSBHZXRTdGRIYW5kbGUoKERXT1JEKSBzdGRfaGFuZGxlKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKKyAgICBpZiAoaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOwogCi0JaWYgKCEgaGFuZGxlKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIGlmICghIGhhbmRsZSkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAotCS8qIG5vdGU6IHJldHVybnMgaW50ZWdlciwgbm90IGhhbmRsZSBvYmplY3QgKi8KLQlyZXR1cm4gSEFORExFX1RPX1BZTlVNKGhhbmRsZSk7CisgICAgLyogbm90ZTogcmV0dXJucyBpbnRlZ2VyLCBub3QgaGFuZGxlIG9iamVjdCAqLworICAgIHJldHVybiBIQU5ETEVfVE9fUFlOVU0oaGFuZGxlKTsKIH0KIAogUHlEb2NfU1RSVkFSKEdldEN1cnJlbnRQcm9jZXNzX2RvYywKQEAgLTE5NCwxMCArMTk0LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BfR2V0Q3VycmVudFByb2Nlc3MoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRDdXJyZW50UHJvY2VzcyIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6R2V0Q3VycmVudFByb2Nlc3MiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gc3BfaGFuZGxlX25ldyhHZXRDdXJyZW50UHJvY2VzcygpKTsKKyAgICByZXR1cm4gc3BfaGFuZGxlX25ldyhHZXRDdXJyZW50UHJvY2VzcygpKTsKIH0KIAogUHlEb2NfU1RSVkFSKER1cGxpY2F0ZUhhbmRsZV9kb2MsCkBAIC0yMTQsNDMgKzIxNCw0MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwX0R1cGxpY2F0ZUhhbmRsZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JSEFORExFIHRhcmdldF9oYW5kbGU7Ci0JQk9PTCByZXN1bHQ7CisgICAgSEFORExFIHRhcmdldF9oYW5kbGU7CisgICAgQk9PTCByZXN1bHQ7CiAKLQlIQU5ETEUgc291cmNlX3Byb2Nlc3NfaGFuZGxlOwotCUhBTkRMRSBzb3VyY2VfaGFuZGxlOwotCUhBTkRMRSB0YXJnZXRfcHJvY2Vzc19oYW5kbGU7Ci0JaW50IGRlc2lyZWRfYWNjZXNzOwotCWludCBpbmhlcml0X2hhbmRsZTsKLQlpbnQgb3B0aW9ucyA9IDA7CisgICAgSEFORExFIHNvdXJjZV9wcm9jZXNzX2hhbmRsZTsKKyAgICBIQU5ETEUgc291cmNlX2hhbmRsZTsKKyAgICBIQU5ETEUgdGFyZ2V0X3Byb2Nlc3NfaGFuZGxlOworICAgIGludCBkZXNpcmVkX2FjY2VzczsKKyAgICBpbnQgaW5oZXJpdF9oYW5kbGU7CisgICAgaW50IG9wdGlvbnMgPSAwOwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLAotCQkJICAgICAgIFBZX0hBTkRMRV9QQVJBTSBQWV9IQU5ETEVfUEFSQU0gUFlfSEFORExFX1BBUkFNCi0JCQkgICAgICAgImlpfGk6RHVwbGljYXRlSGFuZGxlIiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VfcHJvY2Vzc19oYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlX2hhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRfcHJvY2Vzc19oYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZGVzaXJlZF9hY2Nlc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmaW5oZXJpdF9oYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZX0hBTkRMRV9QQVJBTSBQWV9IQU5ETEVfUEFSQU0gUFlfSEFORExFX1BBUkFNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWl8aTpEdXBsaWNhdGVIYW5kbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZV9wcm9jZXNzX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldF9wcm9jZXNzX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNpcmVkX2FjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmhlcml0X2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzdWx0ID0gRHVwbGljYXRlSGFuZGxlKAotCQlzb3VyY2VfcHJvY2Vzc19oYW5kbGUsCi0JCXNvdXJjZV9oYW5kbGUsCi0JCXRhcmdldF9wcm9jZXNzX2hhbmRsZSwKLQkJJnRhcmdldF9oYW5kbGUsCi0JCWRlc2lyZWRfYWNjZXNzLAotCQlpbmhlcml0X2hhbmRsZSwKLQkJb3B0aW9ucwotCSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzdWx0ID0gRHVwbGljYXRlSGFuZGxlKAorICAgICAgICBzb3VyY2VfcHJvY2Vzc19oYW5kbGUsCisgICAgICAgIHNvdXJjZV9oYW5kbGUsCisgICAgICAgIHRhcmdldF9wcm9jZXNzX2hhbmRsZSwKKyAgICAgICAgJnRhcmdldF9oYW5kbGUsCisgICAgICAgIGRlc2lyZWRfYWNjZXNzLAorICAgICAgICBpbmhlcml0X2hhbmRsZSwKKyAgICAgICAgb3B0aW9ucworICAgICk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICghIHJlc3VsdCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKKyAgICBpZiAoISByZXN1bHQpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CiAKLQlyZXR1cm4gc3BfaGFuZGxlX25ldyh0YXJnZXRfaGFuZGxlKTsKKyAgICByZXR1cm4gc3BfaGFuZGxlX25ldyh0YXJnZXRfaGFuZGxlKTsKIH0KIAogUHlEb2NfU1RSVkFSKENyZWF0ZVBpcGVfZG9jLApAQCAtMjY0LDI1ICsyNjQsMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcF9DcmVhdGVQaXBlKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlIQU5ETEUgcmVhZF9waXBlOwotCUhBTkRMRSB3cml0ZV9waXBlOwotCUJPT0wgcmVzdWx0OworICAgIEhBTkRMRSByZWFkX3BpcGU7CisgICAgSEFORExFIHdyaXRlX3BpcGU7CisgICAgQk9PTCByZXN1bHQ7CiAKLQlQeU9iamVjdCogcGlwZV9hdHRyaWJ1dGVzOyAvKiBpZ25vcmVkICovCi0JaW50IHNpemU7CisgICAgUHlPYmplY3QqIHBpcGVfYXR0cmlidXRlczsgLyogaWdub3JlZCAqLworICAgIGludCBzaXplOwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6Q3JlYXRlUGlwZSIsICZwaXBlX2F0dHJpYnV0ZXMsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6Q3JlYXRlUGlwZSIsICZwaXBlX2F0dHJpYnV0ZXMsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzdWx0ID0gQ3JlYXRlUGlwZSgmcmVhZF9waXBlLCAmd3JpdGVfcGlwZSwgTlVMTCwgc2l6ZSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzdWx0ID0gQ3JlYXRlUGlwZSgmcmVhZF9waXBlLCAmd3JpdGVfcGlwZSwgTlVMTCwgc2l6ZSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICghIHJlc3VsdCkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKKyAgICBpZiAoISByZXN1bHQpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgKLQkJIk5OIiwgc3BfaGFuZGxlX25ldyhyZWFkX3BpcGUpLCBzcF9oYW5kbGVfbmV3KHdyaXRlX3BpcGUpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgKKyAgICAgICAgIk5OIiwgc3BfaGFuZGxlX25ldyhyZWFkX3BpcGUpLCBzcF9oYW5kbGVfbmV3KHdyaXRlX3BpcGUpKTsKIH0KIAogLyogaGVscGVycyBmb3IgY3JlYXRlcHJvY2VzcyAqLwpAQCAtMjkwLDExMCArMjkwLDExMCBAQAogc3RhdGljIGludAogZ2V0aW50KFB5T2JqZWN0KiBvYmosIGNoYXIqIG5hbWUpCiB7Ci0JUHlPYmplY3QqIHZhbHVlOwotCWludCByZXQ7CisgICAgUHlPYmplY3QqIHZhbHVlOworICAgIGludCByZXQ7CiAKLQl2YWx1ZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCBuYW1lKTsKLQlpZiAoISB2YWx1ZSkgewotCQlQeUVycl9DbGVhcigpOyAvKiBGSVhNRTogcHJvcGFnYXRlIGVycm9yPyAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0ID0gKGludCkgUHlJbnRfQXNMb25nKHZhbHVlKTsKLQlQeV9ERUNSRUYodmFsdWUpOwotCXJldHVybiByZXQ7CisgICAgdmFsdWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG9iaiwgbmFtZSk7CisgICAgaWYgKCEgdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsgLyogRklYTUU6IHByb3BhZ2F0ZSBlcnJvcj8gKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldCA9IChpbnQpIFB5SW50X0FzTG9uZyh2YWx1ZSk7CisgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgSEFORExFCiBnZXRoYW5kbGUoUHlPYmplY3QqIG9iaiwgY2hhciogbmFtZSkKIHsKLQlzcF9oYW5kbGVfb2JqZWN0KiB2YWx1ZTsKLQlIQU5ETEUgcmV0OworICAgIHNwX2hhbmRsZV9vYmplY3QqIHZhbHVlOworICAgIEhBTkRMRSByZXQ7CiAKLQl2YWx1ZSA9IChzcF9oYW5kbGVfb2JqZWN0KikgUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosIG5hbWUpOwotCWlmICghIHZhbHVlKSB7Ci0JCVB5RXJyX0NsZWFyKCk7IC8qIEZJWE1FOiBwcm9wYWdhdGUgZXJyb3I/ICovCi0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAodmFsdWUtPm9iX3R5cGUgIT0gJnNwX2hhbmRsZV90eXBlKQotCQlyZXQgPSBOVUxMOwotCWVsc2UKLQkJcmV0ID0gdmFsdWUtPmhhbmRsZTsKLQlQeV9ERUNSRUYodmFsdWUpOwotCXJldHVybiByZXQ7CisgICAgdmFsdWUgPSAoc3BfaGFuZGxlX29iamVjdCopIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCBuYW1lKTsKKyAgICBpZiAoISB2YWx1ZSkgeworICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBGSVhNRTogcHJvcGFnYXRlIGVycm9yPyAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHZhbHVlLT5vYl90eXBlICE9ICZzcF9oYW5kbGVfdHlwZSkKKyAgICAgICAgcmV0ID0gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IHZhbHVlLT5oYW5kbGU7CisgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgUHlPYmplY3QqCiBnZXRlbnZpcm9ubWVudChQeU9iamVjdCogZW52aXJvbm1lbnQpCiB7Ci0JaW50IGksIGVudnNpemU7Ci0JUHlPYmplY3QqIG91dCA9IE5VTEw7Ci0JUHlPYmplY3QqIGtleXM7Ci0JUHlPYmplY3QqIHZhbHVlczsKLQljaGFyKiBwOworICAgIGludCBpLCBlbnZzaXplOworICAgIFB5T2JqZWN0KiBvdXQgPSBOVUxMOworICAgIFB5T2JqZWN0KiBrZXlzOworICAgIFB5T2JqZWN0KiB2YWx1ZXM7CisgICAgY2hhciogcDsKIAotCS8qIGNvbnZlcnQgZW52aXJvbm1lbnQgZGljdGlvbmFyeSB0byB3aW5kb3dzIGVudmlyb21lbnQgc3RyaW5nICovCi0JaWYgKCEgUHlNYXBwaW5nX0NoZWNrKGVudmlyb25tZW50KSkgewotCQlQeUVycl9TZXRTdHJpbmcoCi0JCSAgICBQeUV4Y19UeXBlRXJyb3IsICJlbnZpcm9ubWVudCBtdXN0IGJlIGRpY3Rpb25hcnkgb3IgTm9uZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY29udmVydCBlbnZpcm9ubWVudCBkaWN0aW9uYXJ5IHRvIHdpbmRvd3MgZW52aXJvbWVudCBzdHJpbmcgKi8KKyAgICBpZiAoISBQeU1hcHBpbmdfQ2hlY2soZW52aXJvbm1lbnQpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwgImVudmlyb25tZW50IG11c3QgYmUgZGljdGlvbmFyeSBvciBOb25lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWVudnNpemUgPSBQeU1hcHBpbmdfTGVuZ3RoKGVudmlyb25tZW50KTsKKyAgICBlbnZzaXplID0gUHlNYXBwaW5nX0xlbmd0aChlbnZpcm9ubWVudCk7CiAKLQlrZXlzID0gUHlNYXBwaW5nX0tleXMoZW52aXJvbm1lbnQpOwotCXZhbHVlcyA9IFB5TWFwcGluZ19WYWx1ZXMoZW52aXJvbm1lbnQpOwotCWlmICgha2V5cyB8fCAhdmFsdWVzKQotCQlnb3RvIGVycm9yOworICAgIGtleXMgPSBQeU1hcHBpbmdfS2V5cyhlbnZpcm9ubWVudCk7CisgICAgdmFsdWVzID0gUHlNYXBwaW5nX1ZhbHVlcyhlbnZpcm9ubWVudCk7CisgICAgaWYgKCFrZXlzIHx8ICF2YWx1ZXMpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlvdXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAyMDQ4KTsKLQlpZiAoISBvdXQpCi0JCWdvdG8gZXJyb3I7CisgICAgb3V0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMjA0OCk7CisgICAgaWYgKCEgb3V0KQorICAgICAgICBnb3RvIGVycm9yOwogCi0JcCA9IFB5U3RyaW5nX0FTX1NUUklORyhvdXQpOworICAgIHAgPSBQeVN0cmluZ19BU19TVFJJTkcob3V0KTsKIAotCWZvciAoaSA9IDA7IGkgPCBlbnZzaXplOyBpKyspIHsKLQkJaW50IGtzaXplLCB2c2l6ZSwgdG90YWxzaXplOwotCQlQeU9iamVjdCoga2V5ID0gUHlMaXN0X0dFVF9JVEVNKGtleXMsIGkpOwotCQlQeU9iamVjdCogdmFsdWUgPSBQeUxpc3RfR0VUX0lURU0odmFsdWVzLCBpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZW52c2l6ZTsgaSsrKSB7CisgICAgICAgIGludCBrc2l6ZSwgdnNpemUsIHRvdGFsc2l6ZTsKKyAgICAgICAgUHlPYmplY3QqIGtleSA9IFB5TGlzdF9HRVRfSVRFTShrZXlzLCBpKTsKKyAgICAgICAgUHlPYmplY3QqIHZhbHVlID0gUHlMaXN0X0dFVF9JVEVNKHZhbHVlcywgaSk7CiAKLQkJaWYgKCEgUHlTdHJpbmdfQ2hlY2soa2V5KSB8fCAhIFB5U3RyaW5nX0NoZWNrKHZhbHVlKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZW52aXJvbm1lbnQgY2FuIG9ubHkgY29udGFpbiBzdHJpbmdzIik7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCWtzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUoa2V5KTsKLQkJdnNpemUgPSBQeVN0cmluZ19HRVRfU0laRSh2YWx1ZSk7Ci0JCXRvdGFsc2l6ZSA9IChwIC0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCkpICsga3NpemUgKyAxICsKLQkJCQkJCQkgICAgIHZzaXplICsgMSArIDE7Ci0JCWlmICh0b3RhbHNpemUgPiBQeVN0cmluZ19HRVRfU0laRShvdXQpKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gcCAtIFB5U3RyaW5nX0FTX1NUUklORyhvdXQpOwotCQkJX1B5U3RyaW5nX1Jlc2l6ZSgmb3V0LCB0b3RhbHNpemUgKyAxMDI0KTsKLQkJCXAgPSBQeVN0cmluZ19BU19TVFJJTkcob3V0KSArIG9mZnNldDsKLQkJfQotCQltZW1jcHkocCwgUHlTdHJpbmdfQVNfU1RSSU5HKGtleSksIGtzaXplKTsKLQkJcCArPSBrc2l6ZTsKLQkJKnArKyA9ICc9JzsKLQkJbWVtY3B5KHAsIFB5U3RyaW5nX0FTX1NUUklORyh2YWx1ZSksIHZzaXplKTsKLQkJcCArPSB2c2l6ZTsKLQkJKnArKyA9ICdcMCc7Ci0JfQorICAgICAgICBpZiAoISBQeVN0cmluZ19DaGVjayhrZXkpIHx8ICEgUHlTdHJpbmdfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJlbnZpcm9ubWVudCBjYW4gb25seSBjb250YWluIHN0cmluZ3MiKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAga3NpemUgPSBQeVN0cmluZ19HRVRfU0laRShrZXkpOworICAgICAgICB2c2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHZhbHVlKTsKKyAgICAgICAgdG90YWxzaXplID0gKHAgLSBQeVN0cmluZ19BU19TVFJJTkcob3V0KSkgKyBrc2l6ZSArIDEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2l6ZSArIDEgKyAxOworICAgICAgICBpZiAodG90YWxzaXplID4gUHlTdHJpbmdfR0VUX1NJWkUob3V0KSkgeworICAgICAgICAgICAgaW50IG9mZnNldCA9IHAgLSBQeVN0cmluZ19BU19TVFJJTkcob3V0KTsKKyAgICAgICAgICAgIF9QeVN0cmluZ19SZXNpemUoJm91dCwgdG90YWxzaXplICsgMTAyNCk7CisgICAgICAgICAgICBwID0gUHlTdHJpbmdfQVNfU1RSSU5HKG91dCkgKyBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHAsIFB5U3RyaW5nX0FTX1NUUklORyhrZXkpLCBrc2l6ZSk7CisgICAgICAgIHAgKz0ga3NpemU7CisgICAgICAgICpwKysgPSAnPSc7CisgICAgICAgIG1lbWNweShwLCBQeVN0cmluZ19BU19TVFJJTkcodmFsdWUpLCB2c2l6ZSk7CisgICAgICAgIHAgKz0gdnNpemU7CisgICAgICAgICpwKysgPSAnXDAnOworICAgIH0KIAotCS8qIGFkZCB0cmFpbGluZyBudWxsIGJ5dGUgKi8KLQkqcCsrID0gJ1wwJzsKLQlfUHlTdHJpbmdfUmVzaXplKCZvdXQsIHAgLSBQeVN0cmluZ19BU19TVFJJTkcob3V0KSk7CisgICAgLyogYWRkIHRyYWlsaW5nIG51bGwgYnl0ZSAqLworICAgICpwKysgPSAnXDAnOworICAgIF9QeVN0cmluZ19SZXNpemUoJm91dCwgcCAtIFB5U3RyaW5nX0FTX1NUUklORyhvdXQpKTsKIAotCS8qIFB5T2JqZWN0X1ByaW50KG91dCwgc3Rkb3V0LCAwKTsgKi8KKyAgICAvKiBQeU9iamVjdF9QcmludChvdXQsIHN0ZG91dCwgMCk7ICovCiAKLQlQeV9YREVDUkVGKGtleXMpOwotCVB5X1hERUNSRUYodmFsdWVzKTsKKyAgICBQeV9YREVDUkVGKGtleXMpOworICAgIFB5X1hERUNSRUYodmFsdWVzKTsKIAotCXJldHVybiBvdXQ7CisgICAgcmV0dXJuIG91dDsKIAogIGVycm9yOgotCVB5X1hERUNSRUYob3V0KTsKLQlQeV9YREVDUkVGKGtleXMpOwotCVB5X1hERUNSRUYodmFsdWVzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKG91dCk7CisgICAgUHlfWERFQ1JFRihrZXlzKTsKKyAgICBQeV9YREVDUkVGKHZhbHVlcyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihDcmVhdGVQcm9jZXNzX2RvYywKQEAgLTQxMSw3NyArNDExLDc3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3BfQ3JlYXRlUHJvY2VzcyhQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JQk9PTCByZXN1bHQ7Ci0JUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKLQlTVEFSVFVQSU5GTyBzaTsKLQlQeU9iamVjdCogZW52aXJvbm1lbnQ7CisgICAgQk9PTCByZXN1bHQ7CisgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKKyAgICBTVEFSVFVQSU5GTyBzaTsKKyAgICBQeU9iamVjdCogZW52aXJvbm1lbnQ7CiAKLQljaGFyKiBhcHBsaWNhdGlvbl9uYW1lOwotCWNoYXIqIGNvbW1hbmRfbGluZTsKLQlQeU9iamVjdCogcHJvY2Vzc19hdHRyaWJ1dGVzOyAvKiBpZ25vcmVkICovCi0JUHlPYmplY3QqIHRocmVhZF9hdHRyaWJ1dGVzOyAvKiBpZ25vcmVkICovCi0JaW50IGluaGVyaXRfaGFuZGxlczsKLQlpbnQgY3JlYXRpb25fZmxhZ3M7Ci0JUHlPYmplY3QqIGVudl9tYXBwaW5nOwotCWNoYXIqIGN1cnJlbnRfZGlyZWN0b3J5OwotCVB5T2JqZWN0KiBzdGFydHVwX2luZm87CisgICAgY2hhciogYXBwbGljYXRpb25fbmFtZTsKKyAgICBjaGFyKiBjb21tYW5kX2xpbmU7CisgICAgUHlPYmplY3QqIHByb2Nlc3NfYXR0cmlidXRlczsgLyogaWdub3JlZCAqLworICAgIFB5T2JqZWN0KiB0aHJlYWRfYXR0cmlidXRlczsgLyogaWdub3JlZCAqLworICAgIGludCBpbmhlcml0X2hhbmRsZXM7CisgICAgaW50IGNyZWF0aW9uX2ZsYWdzOworICAgIFB5T2JqZWN0KiBlbnZfbWFwcGluZzsKKyAgICBjaGFyKiBjdXJyZW50X2RpcmVjdG9yeTsKKyAgICBQeU9iamVjdCogc3RhcnR1cF9pbmZvOwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienpPT2lpT3pPOkNyZWF0ZVByb2Nlc3MiLAotCQkJICAgICAgICZhcHBsaWNhdGlvbl9uYW1lLAotCQkJICAgICAgICZjb21tYW5kX2xpbmUsCi0JCQkgICAgICAgJnByb2Nlc3NfYXR0cmlidXRlcywKLQkJCSAgICAgICAmdGhyZWFkX2F0dHJpYnV0ZXMsCi0JCQkgICAgICAgJmluaGVyaXRfaGFuZGxlcywKLQkJCSAgICAgICAmY3JlYXRpb25fZmxhZ3MsCi0JCQkgICAgICAgJmVudl9tYXBwaW5nLAotCQkJICAgICAgICZjdXJyZW50X2RpcmVjdG9yeSwKLQkJCSAgICAgICAmc3RhcnR1cF9pbmZvKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAienpPT2lpT3pPOkNyZWF0ZVByb2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFwcGxpY2F0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2Nlc3NfYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJlYWRfYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmhlcml0X2hhbmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRpb25fZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52X21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9kaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnR1cF9pbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlaZXJvTWVtb3J5KCZzaSwgc2l6ZW9mKHNpKSk7Ci0Jc2kuY2IgPSBzaXplb2Yoc2kpOworICAgIFplcm9NZW1vcnkoJnNpLCBzaXplb2Yoc2kpKTsKKyAgICBzaS5jYiA9IHNpemVvZihzaSk7CiAKLQkvKiBub3RlOiB3ZSBvbmx5IHN1cHBvcnQgYSBzbWFsbCBzdWJzZXQgb2YgYWxsIFNJIGF0dHJpYnV0ZXMgKi8KLQlzaS5kd0ZsYWdzID0gZ2V0aW50KHN0YXJ0dXBfaW5mbywgImR3RmxhZ3MiKTsKLQlzaS53U2hvd1dpbmRvdyA9IGdldGludChzdGFydHVwX2luZm8sICJ3U2hvd1dpbmRvdyIpOwotCXNpLmhTdGRJbnB1dCA9IGdldGhhbmRsZShzdGFydHVwX2luZm8sICJoU3RkSW5wdXQiKTsKLQlzaS5oU3RkT3V0cHV0ID0gZ2V0aGFuZGxlKHN0YXJ0dXBfaW5mbywgImhTdGRPdXRwdXQiKTsKLQlzaS5oU3RkRXJyb3IgPSBnZXRoYW5kbGUoc3RhcnR1cF9pbmZvLCAiaFN0ZEVycm9yIik7CisgICAgLyogbm90ZTogd2Ugb25seSBzdXBwb3J0IGEgc21hbGwgc3Vic2V0IG9mIGFsbCBTSSBhdHRyaWJ1dGVzICovCisgICAgc2kuZHdGbGFncyA9IGdldGludChzdGFydHVwX2luZm8sICJkd0ZsYWdzIik7CisgICAgc2kud1Nob3dXaW5kb3cgPSBnZXRpbnQoc3RhcnR1cF9pbmZvLCAid1Nob3dXaW5kb3ciKTsKKyAgICBzaS5oU3RkSW5wdXQgPSBnZXRoYW5kbGUoc3RhcnR1cF9pbmZvLCAiaFN0ZElucHV0Iik7CisgICAgc2kuaFN0ZE91dHB1dCA9IGdldGhhbmRsZShzdGFydHVwX2luZm8sICJoU3RkT3V0cHV0Iik7CisgICAgc2kuaFN0ZEVycm9yID0gZ2V0aGFuZGxlKHN0YXJ0dXBfaW5mbywgImhTdGRFcnJvciIpOwogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChlbnZfbWFwcGluZyA9PSBQeV9Ob25lKQotCQllbnZpcm9ubWVudCA9IE5VTEw7Ci0JZWxzZSB7Ci0JCWVudmlyb25tZW50ID0gZ2V0ZW52aXJvbm1lbnQoZW52X21hcHBpbmcpOwotCQlpZiAoISBlbnZpcm9ubWVudCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZW52X21hcHBpbmcgPT0gUHlfTm9uZSkKKyAgICAgICAgZW52aXJvbm1lbnQgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICBlbnZpcm9ubWVudCA9IGdldGVudmlyb25tZW50KGVudl9tYXBwaW5nKTsKKyAgICAgICAgaWYgKCEgZW52aXJvbm1lbnQpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmVzdWx0ID0gQ3JlYXRlUHJvY2VzcyhhcHBsaWNhdGlvbl9uYW1lLAotCQkJICAgICAgIGNvbW1hbmRfbGluZSwKLQkJCSAgICAgICBOVUxMLAotCQkJICAgICAgIE5VTEwsCi0JCQkgICAgICAgaW5oZXJpdF9oYW5kbGVzLAotCQkJICAgICAgIGNyZWF0aW9uX2ZsYWdzLAotCQkJICAgICAgIGVudmlyb25tZW50ID8gUHlTdHJpbmdfQVNfU1RSSU5HKGVudmlyb25tZW50KSA6IE5VTEwsCi0JCQkgICAgICAgY3VycmVudF9kaXJlY3RvcnksCi0JCQkgICAgICAgJnNpLAotCQkJICAgICAgICZwaSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmVzdWx0ID0gQ3JlYXRlUHJvY2VzcyhhcHBsaWNhdGlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0X2hhbmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbl9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50ID8gUHlTdHJpbmdfQVNfU1RSSU5HKGVudmlyb25tZW50KSA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCVB5X1hERUNSRUYoZW52aXJvbm1lbnQpOworICAgIFB5X1hERUNSRUYoZW52aXJvbm1lbnQpOwogCi0JaWYgKCEgcmVzdWx0KQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIGlmICghIHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJOTmlpIiwKLQkJCSAgICAgc3BfaGFuZGxlX25ldyhwaS5oUHJvY2VzcyksCi0JCQkgICAgIHNwX2hhbmRsZV9uZXcocGkuaFRocmVhZCksCi0JCQkgICAgIHBpLmR3UHJvY2Vzc0lkLAotCQkJICAgICBwaS5kd1RocmVhZElkKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTk5paSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BfaGFuZGxlX25ldyhwaS5oUHJvY2VzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BfaGFuZGxlX25ldyhwaS5oVGhyZWFkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwaS5kd1Byb2Nlc3NJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwaS5kd1RocmVhZElkKTsKIH0KIAogUHlEb2NfU1RSVkFSKFRlcm1pbmF0ZVByb2Nlc3NfZG9jLApAQCAtNDkyLDIxICs0OTIsMjEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzcF9UZXJtaW5hdGVQcm9jZXNzKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlCT09MIHJlc3VsdDsKKyAgICBCT09MIHJlc3VsdDsKIAotCUhBTkRMRSBwcm9jZXNzOwotCWludCBleGl0X2NvZGU7Ci0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBQWV9IQU5ETEVfUEFSQU0gImk6VGVybWluYXRlUHJvY2VzcyIsCi0JCQkgICAgICAgJnByb2Nlc3MsICZleGl0X2NvZGUpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBIQU5ETEUgcHJvY2VzczsKKyAgICBpbnQgZXhpdF9jb2RlOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgUFlfSEFORExFX1BBUkFNICJpOlRlcm1pbmF0ZVByb2Nlc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2Nlc3MsICZleGl0X2NvZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJlc3VsdCA9IFRlcm1pbmF0ZVByb2Nlc3MocHJvY2VzcywgZXhpdF9jb2RlKTsKKyAgICByZXN1bHQgPSBUZXJtaW5hdGVQcm9jZXNzKHByb2Nlc3MsIGV4aXRfY29kZSk7CiAKLQlpZiAoISByZXN1bHQpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CisgICAgaWYgKCEgcmVzdWx0KQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOwogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKEdldEV4aXRDb2RlUHJvY2Vzc19kb2MsCkBAIC01MTcsMTkgKzUxNywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwX0dldEV4aXRDb2RlUHJvY2VzcyhQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JRFdPUkQgZXhpdF9jb2RlOwotCUJPT0wgcmVzdWx0OworICAgIERXT1JEIGV4aXRfY29kZTsKKyAgICBCT09MIHJlc3VsdDsKIAotCUhBTkRMRSBwcm9jZXNzOwotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgUFlfSEFORExFX1BBUkFNICI6R2V0RXhpdENvZGVQcm9jZXNzIiwgJnByb2Nlc3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBIQU5ETEUgcHJvY2VzczsKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIFBZX0hBTkRMRV9QQVJBTSAiOkdldEV4aXRDb2RlUHJvY2VzcyIsICZwcm9jZXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXN1bHQgPSBHZXRFeGl0Q29kZVByb2Nlc3MocHJvY2VzcywgJmV4aXRfY29kZSk7CisgICAgcmVzdWx0ID0gR2V0RXhpdENvZGVQcm9jZXNzKHByb2Nlc3MsICZleGl0X2NvZGUpOwogCi0JaWYgKCEgcmVzdWx0KQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIGlmICghIHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZyhleGl0X2NvZGUpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhleGl0X2NvZGUpOwogfQogCiBQeURvY19TVFJWQVIoV2FpdEZvclNpbmdsZU9iamVjdF9kb2MsCkBAIC01NDIsMjMgKzU0MiwyMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwX1dhaXRGb3JTaW5nbGVPYmplY3QoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCURXT1JEIHJlc3VsdDsKKyAgICBEV09SRCByZXN1bHQ7CiAKLQlIQU5ETEUgaGFuZGxlOwotCWludCBtaWxsaXNlY29uZHM7Ci0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBQWV9IQU5ETEVfUEFSQU0gImk6V2FpdEZvclNpbmdsZU9iamVjdCIsCi0JICAgICAgICAgICAgICAgICAgCSAgICAgJmhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAJICAgICAmbWlsbGlzZWNvbmRzKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgSEFORExFIGhhbmRsZTsKKyAgICBpbnQgbWlsbGlzZWNvbmRzOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgUFlfSEFORExFX1BBUkFNICJpOldhaXRGb3JTaW5nbGVPYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaXNlY29uZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhhbmRsZSwgKERXT1JEKSBtaWxsaXNlY29uZHMpOwotCVB5X0VORF9BTExPV19USFJFQURTCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3QoaGFuZGxlLCAoRFdPUkQpIG1pbGxpc2Vjb25kcyk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmIChyZXN1bHQgPT0gV0FJVF9GQUlMRUQpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycihHZXRMYXN0RXJyb3IoKSk7CisgICAgaWYgKHJlc3VsdCA9PSBXQUlUX0ZBSUxFRCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKIAotCXJldHVybiBQeUludF9Gcm9tTG9uZygoaW50KSByZXN1bHQpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygoaW50KSByZXN1bHQpOwogfQogCiBQeURvY19TVFJWQVIoR2V0VmVyc2lvbl9kb2MsCkBAIC01NjksMTAgKzU2OSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwX0dldFZlcnNpb24oUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCWlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRWZXJzaW9uIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpHZXRWZXJzaW9uIikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChpbnQpIEdldFZlcnNpb24oKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChpbnQpIEdldFZlcnNpb24oKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihHZXRNb2R1bGVGaWxlTmFtZV9kb2MsCkBAIC01OTAsNDEgKzU5MCw0MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNwX0dldE1vZHVsZUZpbGVOYW1lKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlCT09MIHJlc3VsdDsKLQlITU9EVUxFIG1vZHVsZTsKLQlUQ0hBUiBmaWxlbmFtZVtNQVhfUEFUSF07CisgICAgQk9PTCByZXN1bHQ7CisgICAgSE1PRFVMRSBtb2R1bGU7CisgICAgVENIQVIgZmlsZW5hbWVbTUFYX1BBVEhdOwogCi0JaWYgKCEgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBQWV9IQU5ETEVfUEFSQU0gIjpHZXRNb2R1bGVGaWxlTmFtZSIsCi0JCQkgICAgICAgJm1vZHVsZSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGUoYXJncywgUFlfSEFORExFX1BBUkFNICI6R2V0TW9kdWxlRmlsZU5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZHVsZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gR2V0TW9kdWxlRmlsZU5hbWUobW9kdWxlLCBmaWxlbmFtZSwgTUFYX1BBVEgpOwotCWZpbGVuYW1lW01BWF9QQVRILTFdID0gJ1wwJzsKKyAgICByZXN1bHQgPSBHZXRNb2R1bGVGaWxlTmFtZShtb2R1bGUsIGZpbGVuYW1lLCBNQVhfUEFUSCk7CisgICAgZmlsZW5hbWVbTUFYX1BBVEgtMV0gPSAnXDAnOwogCi0JaWYgKCEgcmVzdWx0KQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoR2V0TGFzdEVycm9yKCkpOworICAgIGlmICghIHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKEdldExhc3RFcnJvcigpKTsKIAotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSk7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzcF9mdW5jdGlvbnNbXSA9IHsKLQl7IkdldFN0ZEhhbmRsZSIsIHNwX0dldFN0ZEhhbmRsZSwgTUVUSF9WQVJBUkdTLCBHZXRTdGRIYW5kbGVfZG9jfSwKLQl7IkdldEN1cnJlbnRQcm9jZXNzIiwgc3BfR2V0Q3VycmVudFByb2Nlc3MsCU1FVEhfVkFSQVJHUywgCi0JCQkJCQkgIEdldEN1cnJlbnRQcm9jZXNzX2RvY30sCi0JeyJEdXBsaWNhdGVIYW5kbGUiLAlzcF9EdXBsaWNhdGVIYW5kbGUsCU1FVEhfVkFSQVJHUywgCi0JCQkJCQlEdXBsaWNhdGVIYW5kbGVfZG9jfSwKLQl7IkNyZWF0ZVBpcGUiLCBzcF9DcmVhdGVQaXBlLCBNRVRIX1ZBUkFSR1MsIENyZWF0ZVBpcGVfZG9jfSwKLQl7IkNyZWF0ZVByb2Nlc3MiLCBzcF9DcmVhdGVQcm9jZXNzLCBNRVRIX1ZBUkFSR1MsIENyZWF0ZVByb2Nlc3NfZG9jfSwKLQl7IlRlcm1pbmF0ZVByb2Nlc3MiLCBzcF9UZXJtaW5hdGVQcm9jZXNzLCBNRVRIX1ZBUkFSR1MsCi0JCQkJCQkgVGVybWluYXRlUHJvY2Vzc19kb2N9LAotCXsiR2V0RXhpdENvZGVQcm9jZXNzIiwgc3BfR2V0RXhpdENvZGVQcm9jZXNzLCBNRVRIX1ZBUkFSR1MsCi0JCQkJCQkgICBHZXRFeGl0Q29kZVByb2Nlc3NfZG9jfSwKLQl7IldhaXRGb3JTaW5nbGVPYmplY3QiLCBzcF9XYWl0Rm9yU2luZ2xlT2JqZWN0LCBNRVRIX1ZBUkFSR1MsCi0JCQkJCQkJV2FpdEZvclNpbmdsZU9iamVjdF9kb2N9LAotCXsiR2V0VmVyc2lvbiIsIHNwX0dldFZlcnNpb24sIE1FVEhfVkFSQVJHUywgR2V0VmVyc2lvbl9kb2N9LAotCXsiR2V0TW9kdWxlRmlsZU5hbWUiLCBzcF9HZXRNb2R1bGVGaWxlTmFtZSwgTUVUSF9WQVJBUkdTLAotCQkJCQkJICBHZXRNb2R1bGVGaWxlTmFtZV9kb2N9LAotCXtOVUxMLCBOVUxMfQorICAgIHsiR2V0U3RkSGFuZGxlIiwgc3BfR2V0U3RkSGFuZGxlLCBNRVRIX1ZBUkFSR1MsIEdldFN0ZEhhbmRsZV9kb2N9LAorICAgIHsiR2V0Q3VycmVudFByb2Nlc3MiLCBzcF9HZXRDdXJyZW50UHJvY2VzcywgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q3VycmVudFByb2Nlc3NfZG9jfSwKKyAgICB7IkR1cGxpY2F0ZUhhbmRsZSIsICAgICAgICAgc3BfRHVwbGljYXRlSGFuZGxlLCAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXBsaWNhdGVIYW5kbGVfZG9jfSwKKyAgICB7IkNyZWF0ZVBpcGUiLCBzcF9DcmVhdGVQaXBlLCBNRVRIX1ZBUkFSR1MsIENyZWF0ZVBpcGVfZG9jfSwKKyAgICB7IkNyZWF0ZVByb2Nlc3MiLCBzcF9DcmVhdGVQcm9jZXNzLCBNRVRIX1ZBUkFSR1MsIENyZWF0ZVByb2Nlc3NfZG9jfSwKKyAgICB7IlRlcm1pbmF0ZVByb2Nlc3MiLCBzcF9UZXJtaW5hdGVQcm9jZXNzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtaW5hdGVQcm9jZXNzX2RvY30sCisgICAgeyJHZXRFeGl0Q29kZVByb2Nlc3MiLCBzcF9HZXRFeGl0Q29kZVByb2Nlc3MsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RXhpdENvZGVQcm9jZXNzX2RvY30sCisgICAgeyJXYWl0Rm9yU2luZ2xlT2JqZWN0Iiwgc3BfV2FpdEZvclNpbmdsZU9iamVjdCwgTUVUSF9WQVJBUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3RfZG9jfSwKKyAgICB7IkdldFZlcnNpb24iLCBzcF9HZXRWZXJzaW9uLCBNRVRIX1ZBUkFSR1MsIEdldFZlcnNpb25fZG9jfSwKKyAgICB7IkdldE1vZHVsZUZpbGVOYW1lIiwgc3BfR2V0TW9kdWxlRmlsZU5hbWUsIE1FVEhfVkFSQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRNb2R1bGVGaWxlTmFtZV9kb2N9LAorICAgIHtOVUxMLCBOVUxMfQogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTYzMiwxMSArNjMyLDExIEBACiBzdGF0aWMgdm9pZAogZGVmaW50KFB5T2JqZWN0KiBkLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgdmFsdWUpCiB7Ci0JUHlPYmplY3QqIHYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOwotCWlmICh2KSB7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIChjaGFyKikgbmFtZSwgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9CisgICAgUHlPYmplY3QqIHYgPSBQeUludF9Gcm9tTG9uZygobG9uZykgdmFsdWUpOworICAgIGlmICh2KSB7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIChjaGFyKikgbmFtZSwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiB9CiAKICNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDMwMDAwCkBAIC02NDYsMjcgKzY0NiwyNyBAQAogI2VuZGlmCiBpbml0X3N1YnByb2Nlc3MoKQogewotCVB5T2JqZWN0ICpkOwotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOwogCi0JLyogcGF0Y2ggdXAgb2JqZWN0IGRlc2NyaXB0b3JzICovCi0Jc3BfaGFuZGxlX3R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlzcF9oYW5kbGVfYXNfbnVtYmVyLm5iX2ludCA9ICh1bmFyeWZ1bmMpIHNwX2hhbmRsZV9hc19pbnQ7CisgICAgLyogcGF0Y2ggdXAgb2JqZWN0IGRlc2NyaXB0b3JzICovCisgICAgc3BfaGFuZGxlX3R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBzcF9oYW5kbGVfYXNfbnVtYmVyLm5iX2ludCA9ICh1bmFyeWZ1bmMpIHNwX2hhbmRsZV9hc19pbnQ7CiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX3N1YnByb2Nlc3MiLCBzcF9mdW5jdGlvbnMpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybjsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX3N1YnByb2Nlc3MiLCBzcF9mdW5jdGlvbnMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKIAotCS8qIGNvbnN0YW50cyAqLwotCWRlZmludChkLCAiU1REX0lOUFVUX0hBTkRMRSIsIFNURF9JTlBVVF9IQU5ETEUpOwotCWRlZmludChkLCAiU1REX09VVFBVVF9IQU5ETEUiLCBTVERfT1VUUFVUX0hBTkRMRSk7Ci0JZGVmaW50KGQsICJTVERfRVJST1JfSEFORExFIiwgU1REX0VSUk9SX0hBTkRMRSk7Ci0JZGVmaW50KGQsICJEVVBMSUNBVEVfU0FNRV9BQ0NFU1MiLCBEVVBMSUNBVEVfU0FNRV9BQ0NFU1MpOwotCWRlZmludChkLCAiU1RBUlRGX1VTRVNUREhBTkRMRVMiLCBTVEFSVEZfVVNFU1RESEFORExFUyk7Ci0JZGVmaW50KGQsICJTVEFSVEZfVVNFU0hPV1dJTkRPVyIsIFNUQVJURl9VU0VTSE9XV0lORE9XKTsKLQlkZWZpbnQoZCwgIlNXX0hJREUiLCBTV19ISURFKTsKLQlkZWZpbnQoZCwgIklORklOSVRFIiwgSU5GSU5JVEUpOwotCWRlZmludChkLCAiV0FJVF9PQkpFQ1RfMCIsIFdBSVRfT0JKRUNUXzApOwotCWRlZmludChkLCAiQ1JFQVRFX05FV19DT05TT0xFIiwgQ1JFQVRFX05FV19DT05TT0xFKTsKKyAgICAvKiBjb25zdGFudHMgKi8KKyAgICBkZWZpbnQoZCwgIlNURF9JTlBVVF9IQU5ETEUiLCBTVERfSU5QVVRfSEFORExFKTsKKyAgICBkZWZpbnQoZCwgIlNURF9PVVRQVVRfSEFORExFIiwgU1REX09VVFBVVF9IQU5ETEUpOworICAgIGRlZmludChkLCAiU1REX0VSUk9SX0hBTkRMRSIsIFNURF9FUlJPUl9IQU5ETEUpOworICAgIGRlZmludChkLCAiRFVQTElDQVRFX1NBTUVfQUNDRVNTIiwgRFVQTElDQVRFX1NBTUVfQUNDRVNTKTsKKyAgICBkZWZpbnQoZCwgIlNUQVJURl9VU0VTVERIQU5ETEVTIiwgU1RBUlRGX1VTRVNUREhBTkRMRVMpOworICAgIGRlZmludChkLCAiU1RBUlRGX1VTRVNIT1dXSU5ET1ciLCBTVEFSVEZfVVNFU0hPV1dJTkRPVyk7CisgICAgZGVmaW50KGQsICJTV19ISURFIiwgU1dfSElERSk7CisgICAgZGVmaW50KGQsICJJTkZJTklURSIsIElORklOSVRFKTsKKyAgICBkZWZpbnQoZCwgIldBSVRfT0JKRUNUXzAiLCBXQUlUX09CSkVDVF8wKTsKKyAgICBkZWZpbnQoZCwgIkNSRUFURV9ORVdfQ09OU09MRSIsIENSRUFURV9ORVdfQ09OU09MRSk7CiB9CmRpZmYgLS1naXQgYS9QQy9fd2lucmVnLmMgYi9QQy9fd2lucmVnLmMKaW5kZXggZTk3MzViMi4uMWZiNjU2YiAxMDA2NDQKLS0tIGEvUEMvX3dpbnJlZy5jCisrKyBiL1BDL193aW5yZWcuYwpAQCAtNCw3ICs0LDcgQEAKICAgV2luZG93cyBSZWdpc3RyeSBhY2Nlc3MgbW9kdWxlIGZvciBQeXRob24uCiAKICAgKiBTaW1wbGUgcmVnaXN0cnkgYWNjZXNzIHdyaXR0ZW4gYnkgTWFyayBIYW1tb25kIGluIHdpbjMyYXBpCi0JbW9kdWxlIGNpcmNhIDE5OTUuCisgICAgbW9kdWxlIGNpcmNhIDE5OTUuCiAgICogQmlsbCBUdXR0IGV4cGFuZGVkIHRoZSBzdXBwb3J0IHNpZ25pZmljYW50bHkgbm90IGxvbmcgYWZ0ZXIuCiAgICogTnVtZXJvdXMgb3RoZXIgcGVvcGxlIGhhdmUgc3VibWl0dGVkIHBhdGNoZXMgc2luY2UgdGhlbi4KICAgKiBSaXBwZWQgZnJvbSB3aW4zMmFwaSBtb2R1bGUgMDMtRmViLTIwMDAgYnkgTWFyayBIYW1tb25kLCBhbmQKQEAgLTI5LDcgKzI5LDcgQEAKICAgIHdhbnQgdG8gbG9zZSB0aGlzIGluZm8uLi4KICovCiAjZGVmaW5lIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCBmbm5hbWUpIFwKLQlQeUVycl9TZXRGcm9tV2luZG93c0VycihyYykKKyAgICBQeUVycl9TZXRGcm9tV2luZG93c0VycihyYykKIAogLyogRm9yd2FyZCBkZWNsYXJlcyAqLwogCkBAIC0zNTQsOCArMzU0LDggQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdHlwZWRlZiBzdHJ1Y3QgewotCVB5T2JqZWN0X1ZBUl9IRUFECi0JSEtFWSBoa2V5OworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgSEtFWSBoa2V5OwogfSBQeUhLRVlPYmplY3Q7CiAKICNkZWZpbmUgUHlIS0VZX0NoZWNrKG9wKSAoKG9wKS0+b2JfdHlwZSA9PSAmUHlIS0VZX1R5cGUpCkBAIC0zNjUsMTEyICszNjUsMTEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMoUHlPYmplY3QgKm9iKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGZhaWxNc2cpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGZhaWxNc2cpOworICAgIHJldHVybiBOVUxMOwogfQogc3RhdGljIFB5T2JqZWN0ICoKIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYyhQeU9iamVjdCAqb2IxLCBQeU9iamVjdCAqb2IyKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGZhaWxNc2cpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGZhaWxNc2cpOworICAgIHJldHVybiBOVUxMOwogfQogc3RhdGljIFB5T2JqZWN0ICoKIFB5SEtFWV90ZXJuYXJ5RmFpbHVyZUZ1bmMoUHlPYmplY3QgKm9iMSwgUHlPYmplY3QgKm9iMiwgUHlPYmplY3QgKm9iMykKIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBmYWlsTXNnKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBmYWlsTXNnKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQKIFB5SEtFWV9kZWFsbG9jRnVuYyhQeU9iamVjdCAqb2IpCiB7Ci0JLyogQ2FuIG5vdCBjYWxsIFB5SEtFWV9DbG9zZSwgYXMgdGhlIG9iLT50cF90eXBlCi0JICAgaGFzIGFscmVhZHkgYmVlbiBjbGVhcmVkLCB0aHVzIGNhdXNpbmcgdGhlIHR5cGUKLQkgICBjaGVjayB0byBmYWlsIQotCSovCi0JUHlIS0VZT2JqZWN0ICpvYmtleSA9IChQeUhLRVlPYmplY3QgKilvYjsKLQlpZiAob2JrZXktPmhrZXkpCi0JCVJlZ0Nsb3NlS2V5KChIS0VZKW9ia2V5LT5oa2V5KTsKLQlQeU9iamVjdF9ERUwob2IpOworICAgIC8qIENhbiBub3QgY2FsbCBQeUhLRVlfQ2xvc2UsIGFzIHRoZSBvYi0+dHBfdHlwZQorICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gY2xlYXJlZCwgdGh1cyBjYXVzaW5nIHRoZSB0eXBlCisgICAgICAgY2hlY2sgdG8gZmFpbCEKKyAgICAqLworICAgIFB5SEtFWU9iamVjdCAqb2JrZXkgPSAoUHlIS0VZT2JqZWN0ICopb2I7CisgICAgaWYgKG9ia2V5LT5oa2V5KQorICAgICAgICBSZWdDbG9zZUtleSgoSEtFWSlvYmtleS0+aGtleSk7CisgICAgUHlPYmplY3RfREVMKG9iKTsKIH0KIAogc3RhdGljIGludAogUHlIS0VZX25vbnplcm9GdW5jKFB5T2JqZWN0ICpvYikKIHsKLQlyZXR1cm4gKChQeUhLRVlPYmplY3QgKilvYiktPmhrZXkgIT0gMDsKKyAgICByZXR1cm4gKChQeUhLRVlPYmplY3QgKilvYiktPmhrZXkgIT0gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5SEtFWV9pbnRGdW5jKFB5T2JqZWN0ICpvYikKIHsKLQlQeUhLRVlPYmplY3QgKnB5aGtleSA9IChQeUhLRVlPYmplY3QgKilvYjsKLQlyZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHB5aGtleS0+aGtleSk7CisgICAgUHlIS0VZT2JqZWN0ICpweWhrZXkgPSAoUHlIS0VZT2JqZWN0ICopb2I7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihweWhrZXktPmhrZXkpOwogfQogCiBzdGF0aWMgaW50CiBQeUhLRVlfcHJpbnRGdW5jKFB5T2JqZWN0ICpvYiwgRklMRSAqZnAsIGludCBmbGFncykKIHsKLQlQeUhLRVlPYmplY3QgKnB5aGtleSA9IChQeUhLRVlPYmplY3QgKilvYjsKLQljaGFyIHJlc0J1ZlsxNjBdOwotCXdzcHJpbnRmKHJlc0J1ZiwgIjxQeUhLRVkgYXQgJXAgKCVwKT4iLAotCQkgb2IsIHB5aGtleS0+aGtleSk7Ci0JZnB1dHMocmVzQnVmLCBmcCk7Ci0JcmV0dXJuIDA7CisgICAgUHlIS0VZT2JqZWN0ICpweWhrZXkgPSAoUHlIS0VZT2JqZWN0ICopb2I7CisgICAgY2hhciByZXNCdWZbMTYwXTsKKyAgICB3c3ByaW50ZihyZXNCdWYsICI8UHlIS0VZIGF0ICVwICglcCk+IiwKKyAgICAgICAgICAgICBvYiwgcHloa2V5LT5oa2V5KTsKKyAgICBmcHV0cyhyZXNCdWYsIGZwKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5SEtFWV9zdHJGdW5jKFB5T2JqZWN0ICpvYikKIHsKLQlQeUhLRVlPYmplY3QgKnB5aGtleSA9IChQeUhLRVlPYmplY3QgKilvYjsKLQljaGFyIHJlc0J1ZlsxNjBdOwotCXdzcHJpbnRmKHJlc0J1ZiwgIjxQeUhLRVk6JXA+IiwgcHloa2V5LT5oa2V5KTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhyZXNCdWYpOworICAgIFB5SEtFWU9iamVjdCAqcHloa2V5ID0gKFB5SEtFWU9iamVjdCAqKW9iOworICAgIGNoYXIgcmVzQnVmWzE2MF07CisgICAgd3NwcmludGYocmVzQnVmLCAiPFB5SEtFWTolcD4iLCBweWhrZXktPmhrZXkpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHJlc0J1Zik7CiB9CiAKIHN0YXRpYyBpbnQKIFB5SEtFWV9jb21wYXJlRnVuYyhQeU9iamVjdCAqb2IxLCBQeU9iamVjdCAqb2IyKQogewotCVB5SEtFWU9iamVjdCAqcHloa2V5MSA9IChQeUhLRVlPYmplY3QgKilvYjE7Ci0JUHlIS0VZT2JqZWN0ICpweWhrZXkyID0gKFB5SEtFWU9iamVjdCAqKW9iMjsKLQlyZXR1cm4gcHloa2V5MSA9PSBweWhrZXkyID8gMCA6Ci0JCSAocHloa2V5MSA8IHB5aGtleTIgPyAtMSA6IDEpOworICAgIFB5SEtFWU9iamVjdCAqcHloa2V5MSA9IChQeUhLRVlPYmplY3QgKilvYjE7CisgICAgUHlIS0VZT2JqZWN0ICpweWhrZXkyID0gKFB5SEtFWU9iamVjdCAqKW9iMjsKKyAgICByZXR1cm4gcHloa2V5MSA9PSBweWhrZXkyID8gMCA6CisgICAgICAgICAocHloa2V5MSA8IHB5aGtleTIgPyAtMSA6IDEpOwogfQogCiBzdGF0aWMgbG9uZwogUHlIS0VZX2hhc2hGdW5jKFB5T2JqZWN0ICpvYikKIHsKLQkvKiBKdXN0IHVzZSB0aGUgYWRkcmVzcy4KLQkgICBYWFggLSBzaG91bGQgd2UgdXNlIHRoZSBoYW5kbGUgdmFsdWU/Ci0JKi8KLQlyZXR1cm4gX1B5X0hhc2hQb2ludGVyKG9iKTsKKyAgICAvKiBKdXN0IHVzZSB0aGUgYWRkcmVzcy4KKyAgICAgICBYWFggLSBzaG91bGQgd2UgdXNlIHRoZSBoYW5kbGUgdmFsdWU/CisgICAgKi8KKyAgICByZXR1cm4gX1B5X0hhc2hQb2ludGVyKG9iKTsKIH0KIAogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIFB5SEtFWV9OdW1iZXJNZXRob2RzID0KIHsKLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2FkZCAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfc3VidHJhY3QgKi8KLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX211bHRpcGx5ICovCi0JUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9kaXZpZGUgKi8KLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX3JlbWFpbmRlciAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfZGl2bW9kICovCi0JUHlIS0VZX3Rlcm5hcnlGYWlsdXJlRnVuYywJLyogbmJfcG93ZXIgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfbmVnYXRpdmUgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfcG9zaXRpdmUgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfYWJzb2x1dGUgKi8KLQlQeUhLRVlfbm9uemVyb0Z1bmMsCQkvKiBuYl9ub256ZXJvICovCi0JUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2ludmVydCAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfbHNoaWZ0ICovCi0JUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9yc2hpZnQgKi8KLQlQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsCS8qIG5iX2FuZCAqLwotCVB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywJLyogbmJfeG9yICovCi0JUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9vciAqLwotCTAsCQkvKiBuYl9jb2VyY2UgKGFsbG93ZWQgdG8gYmUgemVybykgKi8KLQlQeUhLRVlfaW50RnVuYywJCQkvKiBuYl9pbnQgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfbG9uZyAqLwotCVB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9mbG9hdCAqLwotCVB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLAkvKiBuYl9vY3QgKi8KLQlQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywJLyogbmJfaGV4ICovCisgICAgUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgLyogbmJfYWRkICovCisgICAgUHlIS0VZX2JpbmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgLyogbmJfc3VidHJhY3QgKi8KKyAgICBQeUhLRVlfYmluYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAvKiBuYl9tdWx0aXBseSAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX2RpdmlkZSAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX3JlbWFpbmRlciAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX2Rpdm1vZCAqLworICAgIFB5SEtFWV90ZXJuYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgIC8qIG5iX3Bvd2VyICovCisgICAgUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAgLyogbmJfbmVnYXRpdmUgKi8KKyAgICBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgICAvKiBuYl9wb3NpdGl2ZSAqLworICAgIFB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgIC8qIG5iX2Fic29sdXRlICovCisgICAgUHlIS0VZX25vbnplcm9GdW5jLCAgICAgICAgICAgICAgICAgLyogbmJfbm9uemVybyAqLworICAgIFB5SEtFWV91bmFyeUZhaWx1cmVGdW5jLCAgICAgICAgICAgIC8qIG5iX2ludmVydCAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX2xzaGlmdCAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX3JzaGlmdCAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX2FuZCAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX3hvciAqLworICAgIFB5SEtFWV9iaW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgIC8qIG5iX29yICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiBuYl9jb2VyY2UgKGFsbG93ZWQgdG8gYmUgemVybykgKi8KKyAgICBQeUhLRVlfaW50RnVuYywgICAgICAgICAgICAgICAgICAgICAvKiBuYl9pbnQgKi8KKyAgICBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgICAvKiBuYl9sb25nICovCisgICAgUHlIS0VZX3VuYXJ5RmFpbHVyZUZ1bmMsICAgICAgICAgICAgLyogbmJfZmxvYXQgKi8KKyAgICBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgICAvKiBuYl9vY3QgKi8KKyAgICBQeUhLRVlfdW5hcnlGYWlsdXJlRnVuYywgICAgICAgICAgICAvKiBuYl9oZXggKi8KIH07CiAKIApAQCAtNDgwLDM0ICs0ODAsMzQgQEAKIC8qIFRoZSB0eXBlIGl0c2VsZiAqLwogUHlUeXBlT2JqZWN0IFB5SEtFWV9UeXBlID0KIHsKLQlQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkgLyogZmlsbCBpbiB0eXBlIGF0IG1vZHVsZSBpbml0ICovCi0JIlB5SEtFWSIsCi0Jc2l6ZW9mKFB5SEtFWU9iamVjdCksCi0JMCwKLQlQeUhLRVlfZGVhbGxvY0Z1bmMsCQkvKiB0cF9kZWFsbG9jICovCi0JUHlIS0VZX3ByaW50RnVuYywJCS8qIHRwX3ByaW50ICovCi0JUHlIS0VZX2dldGF0dHIsCQkJLyogdHBfZ2V0YXR0ciAqLwotCTAsCQkJCS8qIHRwX3NldGF0dHIgKi8KLQlQeUhLRVlfY29tcGFyZUZ1bmMsCQkvKiB0cF9jb21wYXJlICovCi0JMCwJCQkJLyogdHBfcmVwciAqLwotCSZQeUhLRVlfTnVtYmVyTWV0aG9kcywJCS8qIHRwX2FzX251bWJlciAqLwotCTAsCQkJCS8qIHRwX2FzX3NlcXVlbmNlICovCi0JMCwJCQkJLyogdHBfYXNfbWFwcGluZyAqLwotCVB5SEtFWV9oYXNoRnVuYywJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkvKiB0cF9jYWxsICovCi0JUHlIS0VZX3N0ckZ1bmMsCQkJLyogdHBfc3RyICovCi0JMCwJCQkJLyogdHBfZ2V0YXR0cm8gKi8KLQkwLAkJCQkvKiB0cF9zZXRhdHRybyAqLwotCTAsCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCTAsCQkJCS8qIHRwX2ZsYWdzICovCi0JUHlIS0VZX2RvYywJCQkvKiB0cF9kb2MgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoMCwgMCkgLyogZmlsbCBpbiB0eXBlIGF0IG1vZHVsZSBpbml0ICovCisgICAgIlB5SEtFWSIsCisgICAgc2l6ZW9mKFB5SEtFWU9iamVjdCksCisgICAgMCwKKyAgICBQeUhLRVlfZGVhbGxvY0Z1bmMsICAgICAgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgUHlIS0VZX3ByaW50RnVuYywgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICBQeUhLRVlfZ2V0YXR0ciwgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIFB5SEtFWV9jb21wYXJlRnVuYywgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgJlB5SEtFWV9OdW1iZXJNZXRob2RzLCAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgUHlIS0VZX2hhc2hGdW5jLCAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICBQeUhLRVlfc3RyRnVuYywgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBQeUhLRVlfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KIH07CiAKICNkZWZpbmUgT0ZGKGUpIG9mZnNldG9mKFB5SEtFWU9iamVjdCwgZSkKIAogc3RhdGljIHN0cnVjdCBtZW1iZXJsaXN0IFB5SEtFWV9tZW1iZXJsaXN0W10gPSB7Ci0JeyJoYW5kbGUiLCAgICAgIFRfSU5ULCAgICAgIE9GRihoa2V5KX0sCi0Je05VTEx9ICAgIC8qIFNlbnRpbmVsICovCisgICAgeyJoYW5kbGUiLCAgICAgIFRfSU5ULCAgICAgIE9GRihoa2V5KX0sCisgICAge05VTEx9ICAgIC8qIFNlbnRpbmVsICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MTgsNjIgKzUxOCw2MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5SEtFWV9DbG9zZU1ldGhvZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Q2xvc2UiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQ2xvc2Uoc2VsZikpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpDbG9zZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9DbG9zZShzZWxmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlIS0VZX0RldGFjaE1ldGhvZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jdm9pZCogcmV0OwotCVB5SEtFWU9iamVjdCAqcFRoaXMgPSAoUHlIS0VZT2JqZWN0ICopc2VsZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpEZXRhY2giKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0ID0gKHZvaWQqKXBUaGlzLT5oa2V5OwotCXBUaGlzLT5oa2V5ID0gMDsKLQlyZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHJldCk7CisgICAgdm9pZCogcmV0OworICAgIFB5SEtFWU9iamVjdCAqcFRoaXMgPSAoUHlIS0VZT2JqZWN0ICopc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpEZXRhY2giKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0ID0gKHZvaWQqKXBUaGlzLT5oa2V5OworICAgIHBUaGlzLT5oa2V5ID0gMDsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHJldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUhLRVlfRW50ZXIoUHlPYmplY3QgKnNlbGYpCiB7Ci0JUHlfWElOQ1JFRihzZWxmKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeV9YSU5DUkVGKHNlbGYpOworICAgIHJldHVybiBzZWxmOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlIS0VZX0V4aXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlIS0VZX0Nsb3NlKHNlbGYpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBpZiAoIVB5SEtFWV9DbG9zZShzZWxmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBQeUhLRVlfbWV0aG9kc1tdID0gewotCXsiQ2xvc2UiLCAgUHlIS0VZX0Nsb3NlTWV0aG9kLCBNRVRIX1ZBUkFSR1MsIFB5SEtFWV9DbG9zZV9kb2N9LAotCXsiRGV0YWNoIiwgUHlIS0VZX0RldGFjaE1ldGhvZCwgTUVUSF9WQVJBUkdTLCBQeUhLRVlfRGV0YWNoX2RvY30sCi0JeyJfX2VudGVyX18iLCAoUHlDRnVuY3Rpb24pUHlIS0VZX0VudGVyLCBNRVRIX05PQVJHUywgTlVMTH0sCi0JeyJfX2V4aXRfXyIsIFB5SEtFWV9FeGl0LCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAotCXtOVUxMfQorICAgIHsiQ2xvc2UiLCAgUHlIS0VZX0Nsb3NlTWV0aG9kLCBNRVRIX1ZBUkFSR1MsIFB5SEtFWV9DbG9zZV9kb2N9LAorICAgIHsiRGV0YWNoIiwgUHlIS0VZX0RldGFjaE1ldGhvZCwgTUVUSF9WQVJBUkdTLCBQeUhLRVlfRGV0YWNoX2RvY30sCisgICAgeyJfX2VudGVyX18iLCAoUHlDRnVuY3Rpb24pUHlIS0VZX0VudGVyLCBNRVRIX05PQVJHUywgTlVMTH0sCisgICAgeyJfX2V4aXRfXyIsIFB5SEtFWV9FeGl0LCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAorICAgIHtOVUxMfQogfTsKIAogLypzdGF0aWMqLyBQeU9iamVjdCAqCiBQeUhLRVlfZ2V0YXR0cihQeU9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlyZXMgPSBQeV9GaW5kTWV0aG9kKFB5SEtFWV9tZXRob2RzLCBzZWxmLCBuYW1lKTsKLQlpZiAocmVzICE9IE5VTEwpCi0JCXJldHVybiByZXM7Ci0JUHlFcnJfQ2xlYXIoKTsKLQlpZiAoc3RyY21wKG5hbWUsICJoYW5kbGUiKSA9PSAwKQotCQlyZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKCgoUHlIS0VZT2JqZWN0ICopc2VsZiktPmhrZXkpOwotCXJldHVybiBQeU1lbWJlcl9HZXQoKGNoYXIgKilzZWxmLCBQeUhLRVlfbWVtYmVybGlzdCwgbmFtZSk7CisgICAgcmVzID0gUHlfRmluZE1ldGhvZChQeUhLRVlfbWV0aG9kcywgc2VsZiwgbmFtZSk7CisgICAgaWYgKHJlcyAhPSBOVUxMKQorICAgICAgICByZXR1cm4gcmVzOworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgaWYgKHN0cmNtcChuYW1lLCAiaGFuZGxlIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cigoKFB5SEtFWU9iamVjdCAqKXNlbGYpLT5oa2V5KTsKKyAgICByZXR1cm4gUHlNZW1iZXJfR2V0KChjaGFyICopc2VsZiwgUHlIS0VZX21lbWJlcmxpc3QsIG5hbWUpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01ODIsNzQgKzU4Miw3NCBAQAogUHlPYmplY3QgKgogUHlIS0VZX05ldyhIS0VZIGhJbml0KQogewotCVB5SEtFWU9iamVjdCAqa2V5ID0gUHlPYmplY3RfTkVXKFB5SEtFWU9iamVjdCwgJlB5SEtFWV9UeXBlKTsKLQlpZiAoa2V5KQotCQlrZXktPmhrZXkgPSBoSW5pdDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopa2V5OworICAgIFB5SEtFWU9iamVjdCAqa2V5ID0gUHlPYmplY3RfTkVXKFB5SEtFWU9iamVjdCwgJlB5SEtFWV9UeXBlKTsKKyAgICBpZiAoa2V5KQorICAgICAgICBrZXktPmhrZXkgPSBoSW5pdDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopa2V5OwogfQogCiBCT09MCiBQeUhLRVlfQ2xvc2UoUHlPYmplY3QgKm9iX2hhbmRsZSkKIHsKLQlMT05HIHJjOwotCVB5SEtFWU9iamVjdCAqa2V5OworICAgIExPTkcgcmM7CisgICAgUHlIS0VZT2JqZWN0ICprZXk7CiAKLQlpZiAoIVB5SEtFWV9DaGVjayhvYl9oYW5kbGUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgb3BlcmFuZCB0eXBlIik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0Ja2V5ID0gKFB5SEtFWU9iamVjdCAqKW9iX2hhbmRsZTsKLQlyYyA9IGtleS0+aGtleSA/IFJlZ0Nsb3NlS2V5KChIS0VZKWtleS0+aGtleSkgOiBFUlJPUl9TVUNDRVNTOwotCWtleS0+aGtleSA9IDA7Ci0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCVB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnQ2xvc2VLZXkiKTsKLQlyZXR1cm4gcmMgPT0gRVJST1JfU1VDQ0VTUzsKKyAgICBpZiAoIVB5SEtFWV9DaGVjayhvYl9oYW5kbGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJiYWQgb3BlcmFuZCB0eXBlIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAga2V5ID0gKFB5SEtFWU9iamVjdCAqKW9iX2hhbmRsZTsKKyAgICByYyA9IGtleS0+aGtleSA/IFJlZ0Nsb3NlS2V5KChIS0VZKWtleS0+aGtleSkgOiBFUlJPUl9TVUNDRVNTOworICAgIGtleS0+aGtleSA9IDA7CisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnQ2xvc2VLZXkiKTsKKyAgICByZXR1cm4gcmMgPT0gRVJST1JfU1VDQ0VTUzsKIH0KIAogQk9PTAogUHlIS0VZX0FzSEtFWShQeU9iamVjdCAqb2IsIEhLRVkgKnBIQU5ETEUsIEJPT0wgYk5vbmVPSykKIHsKLQlpZiAob2IgPT0gUHlfTm9uZSkgewotCQlpZiAoIWJOb25lT0spIHsKLQkJCVB5RXJyX1NldFN0cmluZygKLQkJCQkgIFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICJOb25lIGlzIG5vdCBhIHZhbGlkIEhLRVkgaW4gdGhpcyBjb250ZXh0Iik7Ci0JCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQkJKnBIQU5ETEUgPSAoSEtFWSkwOwotCX0KLQllbHNlIGlmIChQeUhLRVlfQ2hlY2sob2IpKSB7Ci0JCVB5SEtFWU9iamVjdCAqcEggPSAoUHlIS0VZT2JqZWN0ICopb2I7Ci0JCSpwSEFORExFID0gcEgtPmhrZXk7Ci0JfQotCWVsc2UgaWYgKFB5SW50X0NoZWNrKG9iKSB8fCBQeUxvbmdfQ2hlY2sob2IpKSB7Ci0JCS8qIFdlIGFsc28gc3VwcG9ydCBpbnRlZ2VycyAqLwotCQlQeUVycl9DbGVhcigpOwotCQkqcEhBTkRMRSA9IChIS0VZKVB5TG9uZ19Bc1ZvaWRQdHIob2IpOwotCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZygKLQkJCQlQeUV4Y19UeXBlRXJyb3IsCi0JCQkiVGhlIG9iamVjdCBpcyBub3QgYSBQeUhLRVkgb2JqZWN0Iik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgaWYgKG9iID09IFB5X05vbmUpIHsKKyAgICAgICAgaWYgKCFiTm9uZU9LKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICJOb25lIGlzIG5vdCBhIHZhbGlkIEhLRVkgaW4gdGhpcyBjb250ZXh0Iik7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgKnBIQU5ETEUgPSAoSEtFWSkwOworICAgIH0KKyAgICBlbHNlIGlmIChQeUhLRVlfQ2hlY2sob2IpKSB7CisgICAgICAgIFB5SEtFWU9iamVjdCAqcEggPSAoUHlIS0VZT2JqZWN0ICopb2I7CisgICAgICAgICpwSEFORExFID0gcEgtPmhrZXk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKG9iKSB8fCBQeUxvbmdfQ2hlY2sob2IpKSB7CisgICAgICAgIC8qIFdlIGFsc28gc3VwcG9ydCBpbnRlZ2VycyAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAqcEhBTkRMRSA9IChIS0VZKVB5TG9uZ19Bc1ZvaWRQdHIob2IpOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJUaGUgb2JqZWN0IGlzIG5vdCBhIFB5SEtFWSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKIH0KIAogUHlPYmplY3QgKgogUHlIS0VZX0Zyb21IS0VZKEhLRVkgaCkKIHsKLQlQeUhLRVlPYmplY3QgKm9wOworICAgIFB5SEtFWU9iamVjdCAqb3A7CiAKLQkvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCi0Jb3AgPSAoUHlIS0VZT2JqZWN0ICopIFB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlIS0VZT2JqZWN0KSk7Ci0JaWYgKG9wID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCVB5T2JqZWN0X0lOSVQob3AsICZQeUhLRVlfVHlwZSk7Ci0Jb3AtPmhrZXkgPSBoOwotCXJldHVybiAoUHlPYmplY3QgKilvcDsKKyAgICAvKiBJbmxpbmUgUHlPYmplY3RfTmV3ICovCisgICAgb3AgPSAoUHlIS0VZT2JqZWN0ICopIFB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlIS0VZT2JqZWN0KSk7CisgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIFB5T2JqZWN0X0lOSVQob3AsICZQeUhLRVlfVHlwZSk7CisgICAgb3AtPmhrZXkgPSBoOworICAgIHJldHVybiAoUHlPYmplY3QgKilvcDsKIH0KIAogCkBAIC02NTksMzIgKzY1OSwzMiBAQAogQk9PTAogUHlXaW5PYmplY3RfQ2xvc2VIS0VZKFB5T2JqZWN0ICpvYkhhbmRsZSkKIHsKLQlCT09MIG9rOwotCWlmIChQeUhLRVlfQ2hlY2sob2JIYW5kbGUpKSB7Ci0JCW9rID0gUHlIS0VZX0Nsb3NlKG9iSGFuZGxlKTsKLQl9CisgICAgQk9PTCBvazsKKyAgICBpZiAoUHlIS0VZX0NoZWNrKG9iSGFuZGxlKSkgeworICAgICAgICBvayA9IFB5SEtFWV9DbG9zZShvYkhhbmRsZSk7CisgICAgfQogI2lmIFNJWkVPRl9MT05HID49IFNJWkVPRl9IS0VZCi0JZWxzZSBpZiAoUHlJbnRfQ2hlY2sob2JIYW5kbGUpKSB7Ci0JCWxvbmcgcmMgPSBSZWdDbG9zZUtleSgoSEtFWSlQeUludF9Bc0xvbmcob2JIYW5kbGUpKTsKLQkJb2sgPSAocmMgPT0gRVJST1JfU1VDQ0VTUyk7Ci0JCWlmICghb2spCi0JCQlQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0Nsb3NlS2V5Iik7Ci0JfQorICAgIGVsc2UgaWYgKFB5SW50X0NoZWNrKG9iSGFuZGxlKSkgeworICAgICAgICBsb25nIHJjID0gUmVnQ2xvc2VLZXkoKEhLRVkpUHlJbnRfQXNMb25nKG9iSGFuZGxlKSk7CisgICAgICAgIG9rID0gKHJjID09IEVSUk9SX1NVQ0NFU1MpOworICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdDbG9zZUtleSIpOworICAgIH0KICNlbHNlCi0JZWxzZSBpZiAoUHlMb25nX0NoZWNrKG9iSGFuZGxlKSkgewotCQlsb25nIHJjID0gUmVnQ2xvc2VLZXkoKEhLRVkpUHlMb25nX0FzVm9pZFB0cihvYkhhbmRsZSkpOwotCQlvayA9IChyYyA9PSBFUlJPUl9TVUNDRVNTKTsKLQkJaWYgKCFvaykKLQkJCVB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnQ2xvc2VLZXkiKTsKLQl9CisgICAgZWxzZSBpZiAoUHlMb25nX0NoZWNrKG9iSGFuZGxlKSkgeworICAgICAgICBsb25nIHJjID0gUmVnQ2xvc2VLZXkoKEhLRVkpUHlMb25nX0FzVm9pZFB0cihvYkhhbmRsZSkpOworICAgICAgICBvayA9IChyYyA9PSBFUlJPUl9TVUNDRVNTKTsKKyAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnQ2xvc2VLZXkiKTsKKyAgICB9CiAjZW5kaWYKLQllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKAotCQkJUHlFeGNfVHlwZUVycm9yLAotCQkJIkEgaGFuZGxlIG11c3QgYmUgYSBIS0VZIG9iamVjdCBvciBhbiBpbnRlZ2VyIik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JcmV0dXJuIG9rOworICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoCisgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiQSBoYW5kbGUgbXVzdCBiZSBhIEhLRVkgb2JqZWN0IG9yIGFuIGludGVnZXIiKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gb2s7CiB9CiAKIApAQCAtNzAxLDI5ICs3MDEsMjkgQEAKIHN0YXRpYyB2b2lkCiBmaXh1cE11bHRpU1ooY2hhciAqKnN0ciwgY2hhciAqZGF0YSwgaW50IGxlbikKIHsKLQljaGFyICpQOwotCWludCBpOwotCWNoYXIgKlE7CisgICAgY2hhciAqUDsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpROwogCi0JUSA9IGRhdGEgKyBsZW47Ci0JZm9yIChQID0gZGF0YSwgaSA9IDA7IFAgPCBRICYmICpQICE9ICdcMCc7IFArKywgaSsrKSB7Ci0JCXN0cltpXSA9IFA7Ci0JCWZvcig7ICpQICE9ICdcMCc7IFArKykKLQkJCTsKLQl9CisgICAgUSA9IGRhdGEgKyBsZW47CisgICAgZm9yIChQID0gZGF0YSwgaSA9IDA7IFAgPCBRICYmICpQICE9ICdcMCc7IFArKywgaSsrKSB7CisgICAgICAgIHN0cltpXSA9IFA7CisgICAgICAgIGZvcig7ICpQICE9ICdcMCc7IFArKykKKyAgICAgICAgICAgIDsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGNvdW50U3RyaW5ncyhjaGFyICpkYXRhLCBpbnQgbGVuKQogewotCWludCBzdHJpbmdzOwotCWNoYXIgKlA7Ci0JY2hhciAqUSA9IGRhdGEgKyBsZW47CisgICAgaW50IHN0cmluZ3M7CisgICAgY2hhciAqUDsKKyAgICBjaGFyICpRID0gZGF0YSArIGxlbjsKIAotCWZvciAoUCA9IGRhdGEsIHN0cmluZ3MgPSAwOyBQIDwgUSAmJiAqUCAhPSAnXDAnOyBQKyssIHN0cmluZ3MrKykKLQkJZm9yICg7IFAgPCBRICYmICpQICE9ICdcMCc7IFArKykKLQkJCTsKLQlyZXR1cm4gc3RyaW5nczsKKyAgICBmb3IgKFAgPSBkYXRhLCBzdHJpbmdzID0gMDsgUCA8IFEgJiYgKlAgIT0gJ1wwJzsgUCsrLCBzdHJpbmdzKyspCisgICAgICAgIGZvciAoOyBQIDwgUSAmJiAqUCAhPSAnXDAnOyBQKyspCisgICAgICAgICAgICA7CisgICAgcmV0dXJuIHN0cmluZ3M7CiB9CiAKIC8qIENvbnZlcnQgUHlPYmplY3QgaW50byBSZWdpc3RyeSBkYXRhLgpAQCAtNzMxLDI0NCArNzMxLDI0NCBAQAogc3RhdGljIEJPT0wKIFB5MlJlZyhQeU9iamVjdCAqdmFsdWUsIERXT1JEIHR5cCwgQllURSAqKnJldERhdGFCdWYsIERXT1JEICpyZXREYXRhU2l6ZSkKIHsKLQlQeV9zc2l6ZV90IGksajsKLQlzd2l0Y2ggKHR5cCkgewotCQljYXNlIFJFR19EV09SRDoKLQkJCWlmICh2YWx1ZSAhPSBQeV9Ob25lICYmICFQeUludF9DaGVjayh2YWx1ZSkpCi0JCQkJcmV0dXJuIEZBTFNFOwotCQkJKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhEV09SRCwgMSk7Ci0JCQlpZiAoKnJldERhdGFCdWY9PU5VTEwpewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQkJKnJldERhdGFTaXplID0gc2l6ZW9mKERXT1JEKTsKLQkJCWlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7Ci0JCQkJRFdPUkQgemVybyA9IDA7Ci0JCQkJbWVtY3B5KCpyZXREYXRhQnVmLCAmemVybywgc2l6ZW9mKERXT1JEKSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbWVtY3B5KCpyZXREYXRhQnVmLAotCQkJCSAgICAgICAmUHlJbnRfQVNfTE9ORygoUHlJbnRPYmplY3QgKil2YWx1ZSksCi0JCQkJICAgICAgIHNpemVvZihEV09SRCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkVHX1NaOgotCQljYXNlIFJFR19FWFBBTkRfU1o6Ci0JCQl7Ci0JCQlpbnQgbmVlZF9kZWNyZWYgPSAwOwotCQkJaWYgKHZhbHVlID09IFB5X05vbmUpCi0JCQkJKnJldERhdGFTaXplID0gMTsKLQkJCWVsc2UgewotCQkJCWlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZygKLQkJCQkJCSAgICAgIHZhbHVlLAotCQkJCQkJICAgICAgIm1iY3MiLAotCQkJCQkJICAgICAgTlVMTCk7Ci0JCQkJCWlmICh2YWx1ZT09TlVMTCkKLQkJCQkJCXJldHVybiBGQUxTRTsKLQkJCQkJbmVlZF9kZWNyZWYgPSAxOwotCQkJCX0KLQkJCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHZhbHVlKSkKLQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCSpyZXREYXRhU2l6ZSA9IDEgKyBzdHJsZW4oCi0JCQkJCVB5U3RyaW5nX0FTX1NUUklORygKLQkJCQkJCShQeVN0cmluZ09iamVjdCAqKXZhbHVlKSk7Ci0JCQl9Ci0JCQkqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKERXT1JELCAqcmV0RGF0YVNpemUpOwotCQkJaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCXJldHVybiBGQUxTRTsKLQkJCX0KLQkJCWlmICh2YWx1ZSA9PSBQeV9Ob25lKQotCQkJCXN0cmNweSgoY2hhciAqKSpyZXREYXRhQnVmLCAiIik7Ci0JCQllbHNlCi0JCQkJc3RyY3B5KChjaGFyICopKnJldERhdGFCdWYsCi0JCQkJICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygKLQkJCQkgICAgICAgCQkoUHlTdHJpbmdPYmplY3QgKil2YWx1ZSkpOwotCQkJaWYgKG5lZWRfZGVjcmVmKQotCQkJCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCQlicmVhazsKLQkJCX0KLQkJY2FzZSBSRUdfTVVMVElfU1o6Ci0JCQl7Ci0JCQkJRFdPUkQgc2l6ZSA9IDA7Ci0JCQkJY2hhciAqUDsKLQkJCQlQeU9iamVjdCAqKm9icyA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBpLGo7CisgICAgc3dpdGNoICh0eXApIHsKKyAgICAgICAgY2FzZSBSRUdfRFdPUkQ6CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gUHlfTm9uZSAmJiAhUHlJbnRfQ2hlY2sodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoRFdPUkQsIDEpOworICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpyZXREYXRhU2l6ZSA9IHNpemVvZihEV09SRCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIERXT1JEIHplcm8gPSAwOworICAgICAgICAgICAgICAgIG1lbWNweSgqcmV0RGF0YUJ1ZiwgJnplcm8sIHNpemVvZihEV09SRCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1lbWNweSgqcmV0RGF0YUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJlB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopdmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRFdPUkQpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFR19TWjoKKyAgICAgICAgY2FzZSBSRUdfRVhQQU5EX1NaOgorICAgICAgICAgICAgeworICAgICAgICAgICAgaW50IG5lZWRfZGVjcmVmID0gMDsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSA9IDE7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iY3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWU9PU5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIG5lZWRfZGVjcmVmID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAqcmV0RGF0YVNpemUgPSAxICsgc3RybGVuKAorICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoCisgICAgICAgICAgICAgICAgICAgICAgICAoUHlTdHJpbmdPYmplY3QgKil2YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhEV09SRCwgKnJldERhdGFTaXplKTsKKyAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICBzdHJjcHkoKGNoYXIgKikqcmV0RGF0YUJ1ZiwgIiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0cmNweSgoY2hhciAqKSpyZXREYXRhQnVmLAorICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeVN0cmluZ09iamVjdCAqKXZhbHVlKSk7CisgICAgICAgICAgICBpZiAobmVlZF9kZWNyZWYpCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIFJFR19NVUxUSV9TWjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEV09SRCBzaXplID0gMDsKKyAgICAgICAgICAgICAgICBjaGFyICpQOworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqb2JzID0gTlVMTDsKIAotCQkJCWlmICh2YWx1ZSA9PSBQeV9Ob25lKQotCQkJCQlpID0gMDsKLQkJCQllbHNlIHsKLQkJCQkJaWYgKCFQeUxpc3RfQ2hlY2sodmFsdWUpKQotCQkJCQkJcmV0dXJuIEZBTFNFOwotCQkJCQlpID0gUHlMaXN0X1NpemUodmFsdWUpOwotCQkJCX0KLQkJCQlvYnMgPSBtYWxsb2Moc2l6ZW9mKFB5T2JqZWN0ICopICogaSk7Ci0JCQkJbWVtc2V0KG9icywgMCwgc2l6ZW9mKFB5T2JqZWN0ICopICogaSk7Ci0JCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJCQl7Ci0JCQkJCVB5T2JqZWN0ICp0OwotCQkJCQl0ID0gUHlMaXN0X0dFVF9JVEVNKAotCQkJCQkJKFB5TGlzdE9iamVjdCAqKXZhbHVlLGopOwotCQkJCQlpZiAoUHlTdHJpbmdfQ2hlY2sodCkpIHsKLQkJCQkJCW9ic1tqXSA9IHQ7Ci0JCQkJCQlQeV9JTkNSRUYodCk7Ci0JCQkJCX0gZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHQpKSB7Ci0JCQkJCQlvYnNbal0gPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAotCQkJCQkJCQl0LAotCQkJCQkJCQkibWJjcyIsCi0JCQkJCQkJCU5VTEwpOwotCQkJCQkJaWYgKG9ic1tqXT09TlVMTCkKLQkJCQkJCQlnb3RvIHJlZ19tdWx0aV9mYWlsOwotCQkJCQl9IGVsc2UKLQkJCQkJCWdvdG8gcmVnX211bHRpX2ZhaWw7Ci0JCQkJCXNpemUgKz0gMSArIHN0cmxlbigKLQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORygKLQkJCQkJCQkoUHlTdHJpbmdPYmplY3QgKilvYnNbal0pKTsKLQkJCQl9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVB5TGlzdF9DaGVjayh2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGkgPSBQeUxpc3RfU2l6ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9icyA9IG1hbGxvYyhzaXplb2YoUHlPYmplY3QgKikgKiBpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQob2JzLCAwLCBzaXplb2YoUHlPYmplY3QgKikgKiBpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnQ7CisgICAgICAgICAgICAgICAgICAgIHQgPSBQeUxpc3RfR0VUX0lURU0oCisgICAgICAgICAgICAgICAgICAgICAgICAoUHlMaXN0T2JqZWN0ICopdmFsdWUsaik7CisgICAgICAgICAgICAgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayh0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2JzW2pdID0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9ic1tqXSA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWJjcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JzW2pdPT1OVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVnX211bHRpX2ZhaWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWdfbXVsdGlfZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSAxICsgc3RybGVuKAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeVN0cmluZ09iamVjdCAqKW9ic1tqXSkpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCSpyZXREYXRhU2l6ZSA9IHNpemUgKyAxOwotCQkJCSpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoY2hhciwKLQkJCQkJCQkgICAgICAgICpyZXREYXRhU2l6ZSk7Ci0JCQkJaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKLQkJCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQkJZ290byByZWdfbXVsdGlfZmFpbDsKLQkJCQl9Ci0JCQkJUCA9IChjaGFyICopKnJldERhdGFCdWY7CisgICAgICAgICAgICAgICAgKnJldERhdGFTaXplID0gc2l6ZSArIDE7CisgICAgICAgICAgICAgICAgKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJldERhdGFTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoKnJldERhdGFCdWY9PU5VTEwpeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgICAgICBnb3RvIHJlZ19tdWx0aV9mYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQID0gKGNoYXIgKikqcmV0RGF0YUJ1ZjsKIAotCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJewotCQkJCQlQeU9iamVjdCAqdDsKLQkJCQkJdCA9IG9ic1tqXTsKLQkJCQkJc3RyY3B5KFAsCi0JCQkJCSAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoCi0JCQkJCSAgICAgICAJCShQeVN0cmluZ09iamVjdCAqKXQpKTsKLQkJCQkJUCArPSAxICsgc3RybGVuKAotCQkJCQkJUHlTdHJpbmdfQVNfU1RSSU5HKAotCQkJCQkJCShQeVN0cmluZ09iamVjdCAqKXQpKTsKLQkJCQkJUHlfREVDUkVGKG9ic1tqXSk7Ci0JCQkJfQotCQkJCS8qIEFuZCBkb3VibHktdGVybWluYXRlIHRoZSBsaXN0Li4uICovCi0JCQkJKlAgPSAnXDAnOwotCQkJCWZyZWUob2JzKTsKLQkJCQlicmVhazsKLQkJCXJlZ19tdWx0aV9mYWlsOgotCQkJCWlmIChvYnMpIHsKLQkJCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJCQkJCVB5X1hERUNSRUYob2JzW2pdKTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnQ7CisgICAgICAgICAgICAgICAgICAgIHQgPSBvYnNbal07CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5U3RyaW5nT2JqZWN0ICopdCkpOworICAgICAgICAgICAgICAgICAgICBQICs9IDEgKyBzdHJsZW4oCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5U3RyaW5nT2JqZWN0ICopdCkpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2JzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogQW5kIGRvdWJseS10ZXJtaW5hdGUgdGhlIGxpc3QuLi4gKi8KKyAgICAgICAgICAgICAgICAqUCA9ICdcMCc7CisgICAgICAgICAgICAgICAgZnJlZShvYnMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmVnX211bHRpX2ZhaWw6CisgICAgICAgICAgICAgICAgaWYgKG9icykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihvYnNbal0pOwogCi0JCQkJCWZyZWUob2JzKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQljYXNlIFJFR19CSU5BUlk6Ci0JCS8qIEFMU08gaGFuZGxlIEFMTCB1bmtub3duIGRhdGEgdHlwZXMgaGVyZS4gIEV2ZW4gaWYgd2UgY2FuJ3QKLQkJICAgc3VwcG9ydCBpdCBuYXRpdmVseSwgd2Ugc2hvdWxkIGhhbmRsZSB0aGUgYml0cy4gKi8KLQkJZGVmYXVsdDoKLQkJCWlmICh2YWx1ZSA9PSBQeV9Ob25lKQotCQkJCSpyZXREYXRhU2l6ZSA9IDA7Ci0JCQllbHNlIHsKLQkJCQl2b2lkICpzcmNfYnVmOwotCQkJCVB5QnVmZmVyUHJvY3MgKnBiID0gdmFsdWUtPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKLQkJCQlpZiAocGI9PU5VTEwpIHsKLQkJCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJPYmplY3RzIG9mIHR5cGUgJyVzJyBjYW4gbm90ICIKLQkJCQkJCSJiZSB1c2VkIGFzIGJpbmFyeSByZWdpc3RyeSB2YWx1ZXMiLAotCQkJCQkJdmFsdWUtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQkJfQotCQkJCSpyZXREYXRhU2l6ZSA9ICgqcGItPmJmX2dldHJlYWRidWZmZXIpKHZhbHVlLCAwLCAmc3JjX2J1Zik7Ci0JCQkJKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhjaGFyLAotCQkJCQkJCQkqcmV0RGF0YVNpemUpOwotCQkJCWlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7Ci0JCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJCXJldHVybiBGQUxTRTsKLQkJCQl9Ci0JCQkJbWVtY3B5KCpyZXREYXRhQnVmLCBzcmNfYnVmLCAqcmV0RGF0YVNpemUpOwotCQkJfQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICBmcmVlKG9icyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBSRUdfQklOQVJZOgorICAgICAgICAvKiBBTFNPIGhhbmRsZSBBTEwgdW5rbm93biBkYXRhIHR5cGVzIGhlcmUuICBFdmVuIGlmIHdlIGNhbid0CisgICAgICAgICAgIHN1cHBvcnQgaXQgbmF0aXZlbHksIHdlIHNob3VsZCBoYW5kbGUgdGhlIGJpdHMuICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgICAgICAqcmV0RGF0YVNpemUgPSAwOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdm9pZCAqc3JjX2J1ZjsKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlclByb2NzICpwYiA9IHZhbHVlLT5vYl90eXBlLT50cF9hc19idWZmZXI7CisgICAgICAgICAgICAgICAgaWYgKHBiPT1OVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiT2JqZWN0cyBvZiB0eXBlICclcycgY2FuIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYmUgdXNlZCBhcyBiaW5hcnkgcmVnaXN0cnkgdmFsdWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqcmV0RGF0YVNpemUgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKSh2YWx1ZSwgMCwgJnNyY19idWYpOworICAgICAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsIHNyY19idWYsICpyZXREYXRhU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qIENvbnZlcnQgUmVnaXN0cnkgZGF0YSBpbnRvIFB5T2JqZWN0Ki8KIHN0YXRpYyBQeU9iamVjdCAqCiBSZWcyUHkoY2hhciAqcmV0RGF0YUJ1ZiwgRFdPUkQgcmV0RGF0YVNpemUsIERXT1JEIHR5cCkKIHsKLQlQeU9iamVjdCAqb2JEYXRhOworICAgIFB5T2JqZWN0ICpvYkRhdGE7CiAKLQlzd2l0Y2ggKHR5cCkgewotCQljYXNlIFJFR19EV09SRDoKLQkJCWlmIChyZXREYXRhU2l6ZSA9PSAwKQotCQkJCW9iRGF0YSA9IFB5X0J1aWxkVmFsdWUoImkiLCAwKTsKLQkJCWVsc2UKLQkJCQlvYkRhdGEgPSBQeV9CdWlsZFZhbHVlKCJpIiwKLQkJCQkJCSAgICAgICAqKGludCAqKXJldERhdGFCdWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkVHX1NaOgotCQljYXNlIFJFR19FWFBBTkRfU1o6Ci0JCQkvKiByZXREYXRhQnVmIG1heSBvciBtYXkgbm90IGhhdmUgYSB0cmFpbGluZyBOVUxMIGluCi0JCQkgICB0aGUgYnVmZmVyLiAqLwotCQkJaWYgKHJldERhdGFTaXplICYmIHJldERhdGFCdWZbcmV0RGF0YVNpemUtMV0gPT0gJ1wwJykKLQkJCQktLXJldERhdGFTaXplOwotCQkJaWYgKHJldERhdGFTaXplID09MCkKLQkJCQlyZXREYXRhQnVmID0gIiI7Ci0JCQlvYkRhdGEgPSBQeVVuaWNvZGVfRGVjb2RlTUJDUyhyZXREYXRhQnVmLAotCQkJCQkJICAgICAgcmV0RGF0YVNpemUsCi0JCQkJCQkgICAgICBOVUxMKTsKLQkJCWJyZWFrOwotCQljYXNlIFJFR19NVUxUSV9TWjoKLQkJCWlmIChyZXREYXRhU2l6ZSA9PSAwKQotCQkJCW9iRGF0YSA9IFB5TGlzdF9OZXcoMCk7Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlpbnQgcyA9IGNvdW50U3RyaW5ncyhyZXREYXRhQnVmLCByZXREYXRhU2l6ZSk7Ci0JCQkJY2hhciAqKnN0ciA9IChjaGFyICoqKW1hbGxvYyhzaXplb2YoY2hhciAqKSpzKTsKLQkJCQlpZiAoc3RyID09IE5VTEwpCi0JCQkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIHN3aXRjaCAodHlwKSB7CisgICAgICAgIGNhc2UgUkVHX0RXT1JEOgorICAgICAgICAgICAgaWYgKHJldERhdGFTaXplID09IDApCisgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlfQnVpbGRWYWx1ZSgiaSIsIDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5X0J1aWxkVmFsdWUoImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQgKilyZXREYXRhQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFR19TWjoKKyAgICAgICAgY2FzZSBSRUdfRVhQQU5EX1NaOgorICAgICAgICAgICAgLyogcmV0RGF0YUJ1ZiBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgdHJhaWxpbmcgTlVMTCBpbgorICAgICAgICAgICAgICAgdGhlIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIGlmIChyZXREYXRhU2l6ZSAmJiByZXREYXRhQnVmW3JldERhdGFTaXplLTFdID09ICdcMCcpCisgICAgICAgICAgICAgICAgLS1yZXREYXRhU2l6ZTsKKyAgICAgICAgICAgIGlmIChyZXREYXRhU2l6ZSA9PTApCisgICAgICAgICAgICAgICAgcmV0RGF0YUJ1ZiA9ICIiOworICAgICAgICAgICAgb2JEYXRhID0gUHlVbmljb2RlX0RlY29kZU1CQ1MocmV0RGF0YUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldERhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfTVVMVElfU1o6CisgICAgICAgICAgICBpZiAocmV0RGF0YVNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeUxpc3RfTmV3KDApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgaW50IHMgPSBjb3VudFN0cmluZ3MocmV0RGF0YUJ1ZiwgcmV0RGF0YVNpemUpOworICAgICAgICAgICAgICAgIGNoYXIgKipzdHIgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikqcyk7CisgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAotCQkJCWZpeHVwTXVsdGlTWihzdHIsIHJldERhdGFCdWYsIHJldERhdGFTaXplKTsKLQkJCQlvYkRhdGEgPSBQeUxpc3RfTmV3KHMpOwotCQkJCWlmIChvYkRhdGEgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgczsgaW5kZXgrKykKLQkJCQl7Ci0JCQkJCXNpemVfdCBsZW4gPSBfbWJzdHJsZW4oc3RyW2luZGV4XSk7Ci0JCQkJCWlmIChsZW4gPiBJTlRfTUFYKSB7Ci0JCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkJCQkicmVnaXN0cnkgc3RyaW5nIGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKLQkJCQkJCVB5X0RFQ1JFRihvYkRhdGEpOwotCQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJCX0KLQkJCQkJUHlMaXN0X1NldEl0ZW0ob2JEYXRhLAotCQkJCQkJICAgICAgIGluZGV4LAotCQkJCQkJICAgICAgIFB5VW5pY29kZV9EZWNvZGVNQkNTKAotCQkJCQkJICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilzdHJbaW5kZXhdLAotCQkJCQkJCSAgIChpbnQpbGVuLAotCQkJCQkJCSAgICBOVUxMKQotCQkJCQkJICAgICAgICk7Ci0JCQkJfQotCQkJCWZyZWUoc3RyKTsKKyAgICAgICAgICAgICAgICBmaXh1cE11bHRpU1ooc3RyLCByZXREYXRhQnVmLCByZXREYXRhU2l6ZSk7CisgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlMaXN0X05ldyhzKTsKKyAgICAgICAgICAgICAgICBpZiAob2JEYXRhID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHM7IGluZGV4KyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuID0gX21ic3RybGVuKHN0cltpbmRleF0pOworICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdHJ5IHN0cmluZyBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2JEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9TZXRJdGVtKG9iRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9EZWNvZGVNQkNTKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopc3RyW2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWUoc3RyKTsKIAotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIFJFR19CSU5BUlk6Ci0JCS8qIEFMU08gaGFuZGxlIEFMTCB1bmtub3duIGRhdGEgdHlwZXMgaGVyZS4gIEV2ZW4gaWYgd2UgY2FuJ3QKLQkJICAgc3VwcG9ydCBpdCBuYXRpdmVseSwgd2Ugc2hvdWxkIGhhbmRsZSB0aGUgYml0cy4gKi8KLQkJZGVmYXVsdDoKLQkJCWlmIChyZXREYXRhU2l6ZSA9PSAwKSB7Ci0JCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJCW9iRGF0YSA9IFB5X05vbmU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJb2JEYXRhID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCQkJCQkgCSAgICAgICAoY2hhciAqKXJldERhdGFCdWYsCi0JCQkJCSAJICAgICAgIHJldERhdGFTaXplKTsKLQkJCWJyZWFrOwotCX0KLQlpZiAob2JEYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWVsc2UKLQkJcmV0dXJuIG9iRGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBSRUdfQklOQVJZOgorICAgICAgICAvKiBBTFNPIGhhbmRsZSBBTEwgdW5rbm93biBkYXRhIHR5cGVzIGhlcmUuICBFdmVuIGlmIHdlIGNhbid0CisgICAgICAgICAgIHN1cHBvcnQgaXQgbmF0aXZlbHksIHdlIHNob3VsZCBoYW5kbGUgdGhlIGJpdHMuICovCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAocmV0RGF0YVNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeV9Ob25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopcmV0RGF0YUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldERhdGFTaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAob2JEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG9iRGF0YTsKIH0KIAogLyogVGhlIFB5dGhvbiBtZXRob2RzICovCkBAIC05NzYsMjgxICs5NzYsMjgxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogUHlDbG9zZUtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpDbG9zZUtleSIsICZvYktleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0Nsb3NlKG9iS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86Q2xvc2VLZXkiLCAmb2JLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9DbG9zZShvYktleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q29ubmVjdFJlZ2lzdHJ5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWNoYXIgKnN6Q29tcE5hbWUgPSBOVUxMOwotCUhLRVkgcmV0S2V5OwotCWxvbmcgcmM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ6TzpDb25uZWN0UmVnaXN0cnkiLCAmc3pDb21wTmFtZSwgJm9iS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSBSZWdDb25uZWN0UmVnaXN0cnkoc3pDb21wTmFtZSwgaEtleSwgJnJldEtleSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJDb25uZWN0UmVnaXN0cnkiKTsKLQlyZXR1cm4gUHlIS0VZX0Zyb21IS0VZKHJldEtleSk7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBjaGFyICpzekNvbXBOYW1lID0gTlVMTDsKKyAgICBIS0VZIHJldEtleTsKKyAgICBsb25nIHJjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiek86Q29ubmVjdFJlZ2lzdHJ5IiwgJnN6Q29tcE5hbWUsICZvYktleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnQ29ubmVjdFJlZ2lzdHJ5KHN6Q29tcE5hbWUsIGhLZXksICZyZXRLZXkpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0UmVnaXN0cnkiKTsKKyAgICByZXR1cm4gUHlIS0VZX0Zyb21IS0VZKHJldEtleSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNyZWF0ZUtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzdWJLZXk7Ci0JSEtFWSByZXRLZXk7Ci0JbG9uZyByYzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk96OkNyZWF0ZUtleSIsICZvYktleSwgJnN1YktleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmMgPSBSZWdDcmVhdGVLZXkoaEtleSwgc3ViS2V5LCAmcmV0S2V5KTsKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiQ3JlYXRlS2V5Iik7Ci0JcmV0dXJuIFB5SEtFWV9Gcm9tSEtFWShyZXRLZXkpOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgY2hhciAqc3ViS2V5OworICAgIEhLRVkgcmV0S2V5OworICAgIGxvbmcgcmM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPejpDcmVhdGVLZXkiLCAmb2JLZXksICZzdWJLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJjID0gUmVnQ3JlYXRlS2V5KGhLZXksIHN1YktleSwgJnJldEtleSk7CisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIkNyZWF0ZUtleSIpOworICAgIHJldHVybiBQeUhLRVlfRnJvbUhLRVkocmV0S2V5KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5RGVsZXRlS2V5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWNoYXIgKnN1YktleTsKLQlsb25nIHJjOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3M6RGVsZXRlS2V5IiwgJm9iS2V5LCAmc3ViS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKLQlyYyA9IFJlZ0RlbGV0ZUtleShoS2V5LCBzdWJLZXkgKTsKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnRGVsZXRlS2V5Iik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgY2hhciAqc3ViS2V5OworICAgIGxvbmcgcmM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPczpEZWxldGVLZXkiLCAmb2JLZXksICZzdWJLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJjID0gUmVnRGVsZXRlS2V5KGhLZXksIHN1YktleSApOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdEZWxldGVLZXkiKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeURlbGV0ZVZhbHVlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWNoYXIgKnN1YktleTsKLQlsb25nIHJjOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6RGVsZXRlVmFsdWUiLCAmb2JLZXksICZzdWJLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ0RlbGV0ZVZhbHVlKGhLZXksIHN1YktleSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT1FUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCi0JCQkJCQkJICAgIlJlZ0RlbGV0ZVZhbHVlIik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgY2hhciAqc3ViS2V5OworICAgIGxvbmcgcmM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPejpEZWxldGVWYWx1ZSIsICZvYktleSwgJnN1YktleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnRGVsZXRlVmFsdWUoaEtleSwgc3ViS2V5KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPUVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdEZWxldGVWYWx1ZSIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5RW51bUtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQlpbnQgaW5kZXg7Ci0JbG9uZyByYzsKLQlQeU9iamVjdCAqcmV0U3RyOwotCWNoYXIgdG1wYnVmWzI1Nl07IC8qIG1heCBrZXkgbmFtZSBsZW5ndGggaXMgMjU1ICovCi0JRFdPUkQgbGVuID0gc2l6ZW9mKHRtcGJ1Zik7IC8qIGluY2x1ZGVzIE5VTEwgdGVybWluYXRvciAqLworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgaW50IGluZGV4OworICAgIGxvbmcgcmM7CisgICAgUHlPYmplY3QgKnJldFN0cjsKKyAgICBjaGFyIHRtcGJ1ZlsyNTZdOyAvKiBtYXgga2V5IG5hbWUgbGVuZ3RoIGlzIDI1NSAqLworICAgIERXT1JEIGxlbiA9IHNpemVvZih0bXBidWYpOyAvKiBpbmNsdWRlcyBOVUxMIHRlcm1pbmF0b3IgKi8KIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2k6RW51bUtleSIsICZvYktleSwgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pOkVudW1LZXkiLCAmb2JLZXksICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSBSZWdFbnVtS2V5RXgoaEtleSwgaW5kZXgsIHRtcGJ1ZiwgJmxlbiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnRW51bUtleUV4Iik7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnRW51bUtleUV4KGhLZXksIGluZGV4LCB0bXBidWYsICZsZW4sIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ0VudW1LZXlFeCIpOwogCi0JcmV0U3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodG1wYnVmLCBsZW4pOwotCXJldHVybiByZXRTdHI7ICAvKiBjYW4gYmUgTlVMTCAqLworICAgIHJldFN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHRtcGJ1ZiwgbGVuKTsKKyAgICByZXR1cm4gcmV0U3RyOyAgLyogY2FuIGJlIE5VTEwgKi8KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5RW51bVZhbHVlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWludCBpbmRleDsKLQlsb25nIHJjOwotCWNoYXIgKnJldFZhbHVlQnVmOwotCWNoYXIgKnJldERhdGFCdWY7Ci0JRFdPUkQgcmV0VmFsdWVTaXplOwotCURXT1JEIHJldERhdGFTaXplOwotCURXT1JEIHR5cDsKLQlQeU9iamVjdCAqb2JEYXRhOwotCVB5T2JqZWN0ICpyZXRWYWw7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBpbnQgaW5kZXg7CisgICAgbG9uZyByYzsKKyAgICBjaGFyICpyZXRWYWx1ZUJ1ZjsKKyAgICBjaGFyICpyZXREYXRhQnVmOworICAgIERXT1JEIHJldFZhbHVlU2l6ZTsKKyAgICBEV09SRCByZXREYXRhU2l6ZTsKKyAgICBEV09SRCB0eXA7CisgICAgUHlPYmplY3QgKm9iRGF0YTsKKyAgICBQeU9iamVjdCAqcmV0VmFsOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpFbnVtVmFsdWUiLCAmb2JLZXksICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaTpFbnVtVmFsdWUiLCAmb2JLZXksICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoKHJjID0gUmVnUXVlcnlJbmZvS2V5KGhLZXksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JCQkJICBOVUxMLAotCQkJCSAgJnJldFZhbHVlU2l6ZSwgJnJldERhdGFTaXplLCBOVUxMLCBOVUxMKSkKLQkgICAgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdRdWVyeUluZm9LZXkiKTsKLQkrK3JldFZhbHVlU2l6ZTsgICAgLyogaW5jbHVkZSBudWxsIHRlcm1pbmF0b3JzICovCi0JKytyZXREYXRhU2l6ZTsKLQlyZXRWYWx1ZUJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKHJldFZhbHVlU2l6ZSk7Ci0JaWYgKHJldFZhbHVlQnVmID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCXJldERhdGFCdWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhyZXREYXRhU2l6ZSk7Ci0JaWYgKHJldERhdGFCdWYgPT0gTlVMTCkgewotCQlQeU1lbV9GcmVlKHJldFZhbHVlQnVmKTsKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JfQorICAgIGlmICgocmMgPSBSZWdRdWVyeUluZm9LZXkoaEtleSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0VmFsdWVTaXplLCAmcmV0RGF0YVNpemUsIE5VTEwsIE5VTEwpKQorICAgICAgICAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlJbmZvS2V5Iik7CisgICAgKytyZXRWYWx1ZVNpemU7ICAgIC8qIGluY2x1ZGUgbnVsbCB0ZXJtaW5hdG9ycyAqLworICAgICsrcmV0RGF0YVNpemU7CisgICAgcmV0VmFsdWVCdWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhyZXRWYWx1ZVNpemUpOworICAgIGlmIChyZXRWYWx1ZUJ1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICByZXREYXRhQnVmID0gKGNoYXIgKilQeU1lbV9NYWxsb2MocmV0RGF0YVNpemUpOworICAgIGlmIChyZXREYXRhQnVmID09IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fRnJlZShyZXRWYWx1ZUJ1Zik7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ0VudW1WYWx1ZShoS2V5LAotCQkJICBpbmRleCwKLQkJCSAgcmV0VmFsdWVCdWYsCi0JCQkgICZyZXRWYWx1ZVNpemUsCi0JCQkgIE5VTEwsCi0JCQkgICZ0eXAsCi0JCQkgIChCWVRFICopcmV0RGF0YUJ1ZiwKLQkJCSAgJnJldERhdGFTaXplKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ0VudW1WYWx1ZShoS2V5LAorICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIHJldFZhbHVlQnVmLAorICAgICAgICAgICAgICAgICAgICAgICZyZXRWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAmdHlwLAorICAgICAgICAgICAgICAgICAgICAgIChCWVRFICopcmV0RGF0YUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAmcmV0RGF0YVNpemUpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykgewotCQlyZXRWYWwgPSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJCQkJCQkgICAgICJQeVJlZ0VudW1WYWx1ZSIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCW9iRGF0YSA9IFJlZzJQeShyZXREYXRhQnVmLCByZXREYXRhU2l6ZSwgdHlwKTsKLQlpZiAob2JEYXRhID09IE5VTEwpIHsKLQkJcmV0VmFsID0gTlVMTDsKLQkJZ290byBmYWlsOwotCX0KLQlyZXRWYWwgPSBQeV9CdWlsZFZhbHVlKCJzT2kiLCByZXRWYWx1ZUJ1Ziwgb2JEYXRhLCB0eXApOwotCVB5X0RFQ1JFRihvYkRhdGEpOworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIHJldFZhbCA9IFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlSZWdFbnVtVmFsdWUiKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBvYkRhdGEgPSBSZWcyUHkocmV0RGF0YUJ1ZiwgcmV0RGF0YVNpemUsIHR5cCk7CisgICAgaWYgKG9iRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldFZhbCA9IE5VTEw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcmV0VmFsID0gUHlfQnVpbGRWYWx1ZSgic09pIiwgcmV0VmFsdWVCdWYsIG9iRGF0YSwgdHlwKTsKKyAgICBQeV9ERUNSRUYob2JEYXRhKTsKICAgZmFpbDoKLQlQeU1lbV9GcmVlKHJldFZhbHVlQnVmKTsKLQlQeU1lbV9GcmVlKHJldERhdGFCdWYpOwotCXJldHVybiByZXRWYWw7CisgICAgUHlNZW1fRnJlZShyZXRWYWx1ZUJ1Zik7CisgICAgUHlNZW1fRnJlZShyZXREYXRhQnVmKTsKKyAgICByZXR1cm4gcmV0VmFsOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X1VOSUNPREUgKnJldFZhbHVlID0gTlVMTDsKLQlQeV9VTklDT0RFICpzcmM7Ci0JRFdPUkQgcmV0VmFsdWVTaXplOwotCURXT1JEIHJjOwotCVB5T2JqZWN0ICpvOworICAgIFB5X1VOSUNPREUgKnJldFZhbHVlID0gTlVMTDsKKyAgICBQeV9VTklDT0RFICpzcmM7CisgICAgRFdPUkQgcmV0VmFsdWVTaXplOworICAgIERXT1JEIHJjOworICAgIFB5T2JqZWN0ICpvOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1OkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyIsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInU6RXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzIiwgJnNyYykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0VmFsdWVTaXplID0gRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzVyhzcmMsIHJldFZhbHVlLCAwKTsKLQlpZiAocmV0VmFsdWVTaXplID09IDApIHsKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJldFZhbHVlU2l6ZSwKLQkJCQkJCSJFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiKTsKLQl9Ci0JcmV0VmFsdWUgPSAoUHlfVU5JQ09ERSAqKVB5TWVtX01hbGxvYyhyZXRWYWx1ZVNpemUgKiBzaXplb2YoUHlfVU5JQ09ERSkpOwotCWlmIChyZXRWYWx1ZSA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCX0KKyAgICByZXRWYWx1ZVNpemUgPSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NXKHNyYywgcmV0VmFsdWUsIDApOworICAgIGlmIChyZXRWYWx1ZVNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmV0VmFsdWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiKTsKKyAgICB9CisgICAgcmV0VmFsdWUgPSAoUHlfVU5JQ09ERSAqKVB5TWVtX01hbGxvYyhyZXRWYWx1ZVNpemUgKiBzaXplb2YoUHlfVU5JQ09ERSkpOworICAgIGlmIChyZXRWYWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIH0KIAotCXJjID0gRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzVyhzcmMsIHJldFZhbHVlLCByZXRWYWx1ZVNpemUpOwotCWlmIChyYyA9PSAwKSB7Ci0JCVB5TWVtX0ZyZWUocmV0VmFsdWUpOwotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmV0VmFsdWVTaXplLAotCQkJCQkJIkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyIpOwotCX0KLQlvID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHJldFZhbHVlLCB3Y3NsZW4ocmV0VmFsdWUpKTsKLQlQeU1lbV9GcmVlKHJldFZhbHVlKTsKLQlyZXR1cm4gbzsKKyAgICByYyA9IEV4cGFuZEVudmlyb25tZW50U3RyaW5nc1coc3JjLCByZXRWYWx1ZSwgcmV0VmFsdWVTaXplKTsKKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgICBQeU1lbV9GcmVlKHJldFZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJldFZhbHVlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzIik7CisgICAgfQorICAgIG8gPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUocmV0VmFsdWUsIHdjc2xlbihyZXRWYWx1ZSkpOworICAgIFB5TWVtX0ZyZWUocmV0VmFsdWUpOworICAgIHJldHVybiBvOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlGbHVzaEtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQlsb25nIHJjOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpGbHVzaEtleSIsICZvYktleSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gUmVnRmx1c2hLZXkoaEtleSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnRmx1c2hLZXkiKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBsb25nIHJjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpGbHVzaEtleSIsICZvYktleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnRmx1c2hLZXkoaEtleSk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnRmx1c2hLZXkiKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiBzdGF0aWMgUHlPYmplY3QgKgogUHlMb2FkS2V5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWNoYXIgKnN1YktleTsKLQljaGFyICpmaWxlTmFtZTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnN1YktleTsKKyAgICBjaGFyICpmaWxlTmFtZTsKIAotCWxvbmcgcmM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPc3M6TG9hZEtleSIsICZvYktleSwgJnN1YktleSwgJmZpbGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSBSZWdMb2FkS2V5KGhLZXksIHN1YktleSwgZmlsZU5hbWUgKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdMb2FkS2V5Iik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGxvbmcgcmM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPc3M6TG9hZEtleSIsICZvYktleSwgJnN1YktleSwgJmZpbGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBSZWdMb2FkS2V5KGhLZXksIHN1YktleSwgZmlsZU5hbWUgKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdMb2FkS2V5Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlPcGVuS2V5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CiAKLQljaGFyICpzdWJLZXk7Ci0JaW50IHJlcyA9IDA7Ci0JSEtFWSByZXRLZXk7Ci0JbG9uZyByYzsKLQlSRUdTQU0gc2FtID0gS0VZX1JFQUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPenxpaTpPcGVuS2V5IiwgJm9iS2V5LCAmc3ViS2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzLCAmc2FtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBjaGFyICpzdWJLZXk7CisgICAgaW50IHJlcyA9IDA7CisgICAgSEtFWSByZXRLZXk7CisgICAgbG9uZyByYzsKKyAgICBSRUdTQU0gc2FtID0gS0VZX1JFQUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPenxpaTpPcGVuS2V5IiwgJm9iS2V5LCAmc3ViS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzLCAmc2FtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ09wZW5LZXlFeChoS2V5LCBzdWJLZXksIHJlcywgc2FtLCAmcmV0S2V5KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdPcGVuS2V5RXgiKTsKLQlyZXR1cm4gUHlIS0VZX0Zyb21IS0VZKHJldEtleSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gUmVnT3BlbktleUV4KGhLZXksIHN1YktleSwgcmVzLCBzYW0sICZyZXRLZXkpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ09wZW5LZXlFeCIpOworICAgIHJldHVybiBQeUhLRVlfRnJvbUhLRVkocmV0S2V5KTsKIH0KIAogCkBAIC0xMjY2LDE4ICsxMjY2LDE4IEBACiAgIFB5T2JqZWN0ICpsOwogICBQeU9iamVjdCAqcmV0OwogICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86UXVlcnlJbmZvS2V5IiwgJm9iS2V5KSkKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICBpZiAoKHJjID0gUmVnUXVlcnlJbmZvS2V5KGhLZXksIE5VTEwsIE5VTEwsIDAsICZuU3ViS2V5cywgTlVMTCwgTlVMTCwKLQkJCSAgICAmblZhbHVlcywgIE5VTEwsICBOVUxMLCBOVUxMLCAmZnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuVmFsdWVzLCAgTlVMTCwgIE5VTEwsIE5VTEwsICZmdCkpCiAgICAgICAhPSBFUlJPUl9TVUNDRVNTKQotCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ1F1ZXJ5SW5mb0tleSIpOworICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywgIlJlZ1F1ZXJ5SW5mb0tleSIpOwogICBsaS5Mb3dQYXJ0ID0gZnQuZHdMb3dEYXRlVGltZTsKICAgbGkuSGlnaFBhcnQgPSBmdC5kd0hpZ2hEYXRlVGltZTsKICAgbCA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcobGkuUXVhZFBhcnQpOwogICBpZiAobCA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICByZXQgPSBQeV9CdWlsZFZhbHVlKCJpaU8iLCBuU3ViS2V5cywgblZhbHVlcywgbCk7CiAgIFB5X0RFQ1JFRihsKTsKICAgcmV0dXJuIHJldDsKQEAgLTEyODYsMzM2ICsxMjg2LDMzNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5UXVlcnlWYWx1ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzdWJLZXk7Ci0JbG9uZyByYzsKLQlQeU9iamVjdCAqcmV0U3RyOwotCWNoYXIgKnJldEJ1ZjsKLQlsb25nIGJ1ZlNpemUgPSAwOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgY2hhciAqc3ViS2V5OworICAgIGxvbmcgcmM7CisgICAgUHlPYmplY3QgKnJldFN0cjsKKyAgICBjaGFyICpyZXRCdWY7CisgICAgbG9uZyBidWZTaXplID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6UXVlcnlWYWx1ZSIsICZvYktleSwgJnN1YktleSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6UXVlcnlWYWx1ZSIsICZvYktleSwgJnN1YktleSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKHJjID0gUmVnUXVlcnlWYWx1ZShoS2V5LCBzdWJLZXksIE5VTEwsICZidWZTaXplKSkKLQkgICAgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdRdWVyeVZhbHVlIik7Ci0JcmV0U3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnVmU2l6ZSk7Ci0JaWYgKHJldFN0ciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXRCdWYgPSBQeVN0cmluZ19BU19TVFJJTkcocmV0U3RyKTsKLQlpZiAoKHJjID0gUmVnUXVlcnlWYWx1ZShoS2V5LCBzdWJLZXksIHJldEJ1ZiwgJmJ1ZlNpemUpKQotCSAgICAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0JCVB5X0RFQ1JFRihyZXRTdHIpOwotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCi0JCQkJCQkJICAgIlJlZ1F1ZXJ5VmFsdWUiKTsKLQl9Ci0JX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0U3RyLCBzdHJsZW4ocmV0QnVmKSk7Ci0JcmV0dXJuIHJldFN0cjsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgocmMgPSBSZWdRdWVyeVZhbHVlKGhLZXksIHN1YktleSwgTlVMTCwgJmJ1ZlNpemUpKQorICAgICAgICAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlWYWx1ZSIpOworICAgIHJldFN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ1ZlNpemUpOworICAgIGlmIChyZXRTdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0QnVmID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJldFN0cik7CisgICAgaWYgKChyYyA9IFJlZ1F1ZXJ5VmFsdWUoaEtleSwgc3ViS2V5LCByZXRCdWYsICZidWZTaXplKSkKKyAgICAgICAgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBQeV9ERUNSRUYocmV0U3RyKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ1F1ZXJ5VmFsdWUiKTsKKyAgICB9CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0U3RyLCBzdHJsZW4ocmV0QnVmKSk7CisgICAgcmV0dXJuIHJldFN0cjsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5UXVlcnlWYWx1ZUV4KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlIS0VZIGhLZXk7Ci0JUHlPYmplY3QgKm9iS2V5OwotCWNoYXIgKnZhbHVlTmFtZTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnZhbHVlTmFtZTsKIAotCWxvbmcgcmM7Ci0JY2hhciAqcmV0QnVmOwotCURXT1JEIGJ1ZlNpemUgPSAwOwotCURXT1JEIHR5cDsKLQlQeU9iamVjdCAqb2JEYXRhOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgbG9uZyByYzsKKyAgICBjaGFyICpyZXRCdWY7CisgICAgRFdPUkQgYnVmU2l6ZSA9IDA7CisgICAgRFdPUkQgdHlwOworICAgIFB5T2JqZWN0ICpvYkRhdGE7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3o6UXVlcnlWYWx1ZUV4IiwgJm9iS2V5LCAmdmFsdWVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPejpRdWVyeVZhbHVlRXgiLCAmb2JLZXksICZ2YWx1ZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChyYyA9IFJlZ1F1ZXJ5VmFsdWVFeChoS2V5LCB2YWx1ZU5hbWUsCi0JCQkJICBOVUxMLCBOVUxMLCBOVUxMLAotCQkJCSAgJmJ1ZlNpemUpKQotCSAgICAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCi0JCQkJCQkJICAgIlJlZ1F1ZXJ5VmFsdWVFeCIpOwotCXJldEJ1ZiA9IChjaGFyICopUHlNZW1fTWFsbG9jKGJ1ZlNpemUpOwotCWlmIChyZXRCdWYgPT0gTlVMTCkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JaWYgKChyYyA9IFJlZ1F1ZXJ5VmFsdWVFeChoS2V5LCB2YWx1ZU5hbWUsIE5VTEwsCi0JCQkJICAmdHlwLCAoQllURSAqKXJldEJ1ZiwgJmJ1ZlNpemUpKQotCSAgICAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0JCVB5TWVtX0ZyZWUocmV0QnVmKTsKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdRdWVyeVZhbHVlRXgiKTsKLQl9Ci0Jb2JEYXRhID0gUmVnMlB5KHJldEJ1ZiwgYnVmU2l6ZSwgdHlwKTsKLQlQeU1lbV9GcmVlKCh2b2lkICopcmV0QnVmKTsKLQlpZiAob2JEYXRhID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk9pIiwgb2JEYXRhLCB0eXApOwotCVB5X0RFQ1JFRihvYkRhdGEpOwotCXJldHVybiByZXN1bHQ7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHJjID0gUmVnUXVlcnlWYWx1ZUV4KGhLZXksIHZhbHVlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmU2l6ZSkpCisgICAgICAgICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdRdWVyeVZhbHVlRXgiKTsKKyAgICByZXRCdWYgPSAoY2hhciAqKVB5TWVtX01hbGxvYyhidWZTaXplKTsKKyAgICBpZiAocmV0QnVmID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIGlmICgocmMgPSBSZWdRdWVyeVZhbHVlRXgoaEtleSwgdmFsdWVOYW1lLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cCwgKEJZVEUgKilyZXRCdWYsICZidWZTaXplKSkKKyAgICAgICAgIT0gRVJST1JfU1VDQ0VTUykgeworICAgICAgICBQeU1lbV9GcmVlKHJldEJ1Zik7CisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdRdWVyeVZhbHVlRXgiKTsKKyAgICB9CisgICAgb2JEYXRhID0gUmVnMlB5KHJldEJ1ZiwgYnVmU2l6ZSwgdHlwKTsKKyAgICBQeU1lbV9GcmVlKCh2b2lkICopcmV0QnVmKTsKKyAgICBpZiAob2JEYXRhID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk9pIiwgb2JEYXRhLCB0eXApOworICAgIFB5X0RFQ1JFRihvYkRhdGEpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5U2F2ZUtleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpmaWxlTmFtZTsKLQlMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcFNBID0gTlVMTDsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKmZpbGVOYW1lOworICAgIExQU0VDVVJJVFlfQVRUUklCVVRFUyBwU0EgPSBOVUxMOwogCi0JbG9uZyByYzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zOlNhdmVLZXkiLCAmb2JLZXksICZmaWxlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgbG9uZyByYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9zOlNhdmVLZXkiLCAmb2JLZXksICZmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAvKiAgT25lIGRheSB3ZSBtYXkgZ2V0IHNlY3VyaXR5IGludG8gdGhlIGNvcmU/Ci0JaWYgKCFQeVdpbk9iamVjdF9Bc1NFQ1VSSVRZX0FUVFJJQlVURVMob2JTQSwgJnBTQSwgVFJVRSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlXaW5PYmplY3RfQXNTRUNVUklUWV9BVFRSSUJVVEVTKG9iU0EsICZwU0EsIFRSVUUpKQorICAgICAgICByZXR1cm4gTlVMTDsKICovCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gUmVnU2F2ZUtleShoS2V5LCBmaWxlTmFtZSwgcFNBICk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLCAiUmVnU2F2ZUtleSIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgcmMgPSBSZWdTYXZlS2V5KGhLZXksIGZpbGVOYW1lLCBwU0EgKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdTYXZlS2V5Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlTZXRWYWx1ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICpzdWJLZXk7Ci0JY2hhciAqc3RyOwotCURXT1JEIHR5cDsKLQlEV09SRCBsZW47Ci0JbG9uZyByYzsKLQlQeU9iamVjdCAqb2JTdHJWYWw7Ci0JUHlPYmplY3QgKm9iU3ViS2V5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09pTzpTZXRWYWx1ZSIsCi0JCQkgICAgICAmb2JLZXksCi0JCQkgICAgICAmb2JTdWJLZXksCi0JCQkgICAgICAmdHlwLAotCQkJICAgICAgJm9iU3RyVmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodHlwICE9IFJFR19TWikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJUeXBlIG11c3QgYmUgX3dpbnJlZy5SRUdfU1oiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFhYWCAtIG5lZWQgVW5pY29kZSBzdXBwb3J0ICovCi0Jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob2JTdHJWYWwpOwotCWlmIChzdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbGVuID0gUHlTdHJpbmdfU2l6ZShvYlN0clZhbCk7Ci0JaWYgKG9iU3ViS2V5ID09IFB5X05vbmUpCi0JCXN1YktleSA9IE5VTEw7Ci0JZWxzZSB7Ci0JCXN1YktleSA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iU3ViS2V5KTsKLQkJaWYgKHN1YktleSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9IFJlZ1NldFZhbHVlKGhLZXksIHN1YktleSwgUkVHX1NaLCBzdHIsIGxlbisxKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdTZXRWYWx1ZSIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBIS0VZIGhLZXk7CisgICAgUHlPYmplY3QgKm9iS2V5OworICAgIGNoYXIgKnN1YktleTsKKyAgICBjaGFyICpzdHI7CisgICAgRFdPUkQgdHlwOworICAgIERXT1JEIGxlbjsKKyAgICBsb25nIHJjOworICAgIFB5T2JqZWN0ICpvYlN0clZhbDsKKyAgICBQeU9iamVjdCAqb2JTdWJLZXk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT2lPOlNldFZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JTdWJLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYlN0clZhbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHR5cCAhPSBSRUdfU1opIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlIG11c3QgYmUgX3dpbnJlZy5SRUdfU1oiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8qIFhYWCAtIG5lZWQgVW5pY29kZSBzdXBwb3J0ICovCisgICAgc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob2JTdHJWYWwpOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbGVuID0gUHlTdHJpbmdfU2l6ZShvYlN0clZhbCk7CisgICAgaWYgKG9iU3ViS2V5ID09IFB5X05vbmUpCisgICAgICAgIHN1YktleSA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHN1YktleSA9IFB5U3RyaW5nX0FzU3RyaW5nKG9iU3ViS2V5KTsKKyAgICAgICAgaWYgKHN1YktleSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ1NldFZhbHVlKGhLZXksIHN1YktleSwgUkVHX1NaLCBzdHIsIGxlbisxKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsICJSZWdTZXRWYWx1ZSIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFB5U2V0VmFsdWVFeChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQljaGFyICp2YWx1ZU5hbWU7Ci0JUHlPYmplY3QgKm9iUmVzOwotCVB5T2JqZWN0ICp2YWx1ZTsKLQlCWVRFICpkYXRhOwotCURXT1JEIGxlbjsKLQlEV09SRCB0eXA7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBjaGFyICp2YWx1ZU5hbWU7CisgICAgUHlPYmplY3QgKm9iUmVzOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKKyAgICBCWVRFICpkYXRhOworICAgIERXT1JEIGxlbjsKKyAgICBEV09SRCB0eXA7CiAKLQlMT05HIHJjOworICAgIExPTkcgcmM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk96T2lPOlNldFZhbHVlRXgiLAotCQkJICAgICAgJm9iS2V5LAotCQkJICAgICAgJnZhbHVlTmFtZSwKLQkJCSAgICAgICZvYlJlcywKLQkJCSAgICAgICZ0eXAsCi0JCQkgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHkyUmVnKHZhbHVlLCB0eXAsICZkYXRhLCAmbGVuKSkKLQl7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSAiQ291bGQgbm90IGNvbnZlcnQgdGhlIGRhdGEgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gUmVnU2V0VmFsdWVFeChoS2V5LCB2YWx1ZU5hbWUsIDAsIHR5cCwgZGF0YSwgbGVuKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCVB5TWVtX0RFTChkYXRhKTsKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkJCQkJCSAgICJSZWdTZXRWYWx1ZUV4Iik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3pPaU86U2V0VmFsdWVFeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvYktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHkyUmVnKHZhbHVlLCB0eXAsICZkYXRhLCAmbGVuKSkKKyAgICB7CisgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjb252ZXJ0IHRoZSBkYXRhIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9IFJlZ1NldFZhbHVlRXgoaEtleSwgdmFsdWVOYW1lLCAwLCB0eXAsIGRhdGEsIGxlbik7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICBQeU1lbV9ERUwoZGF0YSk7CisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdTZXRWYWx1ZUV4Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlEaXNhYmxlUmVmbGVjdGlvbktleShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JSEtFWSBoS2V5OwotCVB5T2JqZWN0ICpvYktleTsKLQlITU9EVUxFIGhNb2Q7Ci0JdHlwZWRlZiBMT05HIChXSU5BUEkgKlJEUktGdW5jKShIS0VZKTsKLQlSRFJLRnVuYyBwZm4gPSBOVUxMOwotCUxPTkcgcmM7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBITU9EVUxFIGhNb2Q7CisgICAgdHlwZWRlZiBMT05HIChXSU5BUEkgKlJEUktGdW5jKShIS0VZKTsKKyAgICBSRFJLRnVuYyBwZm4gPSBOVUxMOworICAgIExPTkcgcmM7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86RGlzYWJsZVJlZmxlY3Rpb25LZXkiLCAmb2JLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpEaXNhYmxlUmVmbGVjdGlvbktleSIsICZvYktleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlIS0VZX0FzSEtFWShvYktleSwgJmhLZXksIEZBTFNFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvLyBPbmx5IGF2YWlsYWJsZSBvbiA2NGJpdCBwbGF0Zm9ybXMsIHNvIHdlIG11c3QgbG9hZCBpdAotCS8vIGR5bmFtaWNhbGx5LgotCWhNb2QgPSBHZXRNb2R1bGVIYW5kbGUoImFkdmFwaTMyLmRsbCIpOwotCWlmIChoTW9kKQotCQlwZm4gPSAoUkRSS0Z1bmMpR2V0UHJvY0FkZHJlc3MoaE1vZCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdEaXNhYmxlUmVmbGVjdGlvbktleSIpOwotCWlmICghcGZuKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLAotCQkgICAgICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JcmMgPSAoKnBmbikoaEtleSk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlpZiAocmMgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZ1bmN0aW9uKHJjLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ0Rpc2FibGVSZWZsZWN0aW9uS2V5Iik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIC8vIE9ubHkgYXZhaWxhYmxlIG9uIDY0Yml0IHBsYXRmb3Jtcywgc28gd2UgbXVzdCBsb2FkIGl0CisgICAgLy8gZHluYW1pY2FsbHkuCisgICAgaE1vZCA9IEdldE1vZHVsZUhhbmRsZSgiYWR2YXBpMzIuZGxsIik7CisgICAgaWYgKGhNb2QpCisgICAgICAgIHBmbiA9IChSRFJLRnVuYylHZXRQcm9jQWRkcmVzcyhoTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ0Rpc2FibGVSZWZsZWN0aW9uS2V5Iik7CisgICAgaWYgKCFwZm4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9ICgqcGZuKShoS2V5KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnRGlzYWJsZVJlZmxlY3Rpb25LZXkiKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUVuYWJsZVJlZmxlY3Rpb25LZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JSE1PRFVMRSBoTW9kOwotCXR5cGVkZWYgTE9ORyAoV0lOQVBJICpSRVJLRnVuYykoSEtFWSk7Ci0JUkVSS0Z1bmMgcGZuID0gTlVMTDsKLQlMT05HIHJjOworICAgIEhLRVkgaEtleTsKKyAgICBQeU9iamVjdCAqb2JLZXk7CisgICAgSE1PRFVMRSBoTW9kOworICAgIHR5cGVkZWYgTE9ORyAoV0lOQVBJICpSRVJLRnVuYykoSEtFWSk7CisgICAgUkVSS0Z1bmMgcGZuID0gTlVMTDsKKyAgICBMT05HIHJjOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOkVuYWJsZVJlZmxlY3Rpb25LZXkiLCAmb2JLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpFbmFibGVSZWZsZWN0aW9uS2V5IiwgJm9iS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUhLRVlfQXNIS0VZKG9iS2V5LCAmaEtleSwgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8vIE9ubHkgYXZhaWxhYmxlIG9uIDY0Yml0IHBsYXRmb3Jtcywgc28gd2UgbXVzdCBsb2FkIGl0Ci0JLy8gZHluYW1pY2FsbHkuCi0JaE1vZCA9IEdldE1vZHVsZUhhbmRsZSgiYWR2YXBpMzIuZGxsIik7Ci0JaWYgKGhNb2QpCi0JCXBmbiA9IChSRVJLRnVuYylHZXRQcm9jQWRkcmVzcyhoTW9kLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ0VuYWJsZVJlZmxlY3Rpb25LZXkiKTsKLQlpZiAoIXBmbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKLQkJICAgICAgICAgICAgICAgICJub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCXJjID0gKCpwZm4pKGhLZXkpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdFbmFibGVSZWZsZWN0aW9uS2V5Iik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIC8vIE9ubHkgYXZhaWxhYmxlIG9uIDY0Yml0IHBsYXRmb3Jtcywgc28gd2UgbXVzdCBsb2FkIGl0CisgICAgLy8gZHluYW1pY2FsbHkuCisgICAgaE1vZCA9IEdldE1vZHVsZUhhbmRsZSgiYWR2YXBpMzIuZGxsIik7CisgICAgaWYgKGhNb2QpCisgICAgICAgIHBmbiA9IChSRVJLRnVuYylHZXRQcm9jQWRkcmVzcyhoTW9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ0VuYWJsZVJlZmxlY3Rpb25LZXkiKTsKKyAgICBpZiAoIXBmbikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9ybSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIHJjID0gKCpwZm4pKGhLZXkpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKHJjICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGdW5jdGlvbihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdFbmFibGVSZWZsZWN0aW9uS2V5Iik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlRdWVyeVJlZmxlY3Rpb25LZXkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUhLRVkgaEtleTsKLQlQeU9iamVjdCAqb2JLZXk7Ci0JSE1PRFVMRSBoTW9kOwotCXR5cGVkZWYgTE9ORyAoV0lOQVBJICpSUVJLRnVuYykoSEtFWSwgQk9PTCAqKTsKLQlSUVJLRnVuYyBwZm4gPSBOVUxMOwotCUJPT0wgcmVzdWx0OwotCUxPTkcgcmM7CisgICAgSEtFWSBoS2V5OworICAgIFB5T2JqZWN0ICpvYktleTsKKyAgICBITU9EVUxFIGhNb2Q7CisgICAgdHlwZWRlZiBMT05HIChXSU5BUEkgKlJRUktGdW5jKShIS0VZLCBCT09MICopOworICAgIFJRUktGdW5jIHBmbiA9IE5VTEw7CisgICAgQk9PTCByZXN1bHQ7CisgICAgTE9ORyByYzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpRdWVyeVJlZmxlY3Rpb25LZXkiLCAmb2JLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpRdWVyeVJlZmxlY3Rpb25LZXkiLCAmb2JLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLy8gT25seSBhdmFpbGFibGUgb24gNjRiaXQgcGxhdGZvcm1zLCBzbyB3ZSBtdXN0IGxvYWQgaXQKLQkvLyBkeW5hbWljYWxseS4KLQloTW9kID0gR2V0TW9kdWxlSGFuZGxlKCJhZHZhcGkzMi5kbGwiKTsKLQlpZiAoaE1vZCkKLQkJcGZuID0gKFJRUktGdW5jKUdldFByb2NBZGRyZXNzKGhNb2QsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlSZWZsZWN0aW9uS2V5Iik7Ci0JaWYgKCFwZm4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCi0JCSAgICAgICAgICAgICAgICAibm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlyYyA9ICgqcGZuKShoS2V5LCAmcmVzdWx0KTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlSZWZsZWN0aW9uS2V5Iik7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyYyk7CisgICAgLy8gT25seSBhdmFpbGFibGUgb24gNjRiaXQgcGxhdGZvcm1zLCBzbyB3ZSBtdXN0IGxvYWQgaXQKKyAgICAvLyBkeW5hbWljYWxseS4KKyAgICBoTW9kID0gR2V0TW9kdWxlSGFuZGxlKCJhZHZhcGkzMi5kbGwiKTsKKyAgICBpZiAoaE1vZCkKKyAgICAgICAgcGZuID0gKFJRUktGdW5jKUdldFByb2NBZGRyZXNzKGhNb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlSZWZsZWN0aW9uS2V5Iik7CisgICAgaWYgKCFwZm4pIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICByYyA9ICgqcGZuKShoS2V5LCAmcmVzdWx0KTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnUXVlcnlSZWZsZWN0aW9uS2V5Iik7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyYyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgd2lucmVnX21ldGhvZHNbXSA9IHsKLQl7IkNsb3NlS2V5IiwgICAgICAgICBQeUNsb3NlS2V5LCAgICAgICAgTUVUSF9WQVJBUkdTLCBDbG9zZUtleV9kb2N9LAotCXsiQ29ubmVjdFJlZ2lzdHJ5IiwgIFB5Q29ubmVjdFJlZ2lzdHJ5LCBNRVRIX1ZBUkFSR1MsIENvbm5lY3RSZWdpc3RyeV9kb2N9LAotCXsiQ3JlYXRlS2V5IiwgICAgICAgIFB5Q3JlYXRlS2V5LCAgICAgICBNRVRIX1ZBUkFSR1MsIENyZWF0ZUtleV9kb2N9LAotCXsiRGVsZXRlS2V5IiwgICAgICAgIFB5RGVsZXRlS2V5LCAgICAgICBNRVRIX1ZBUkFSR1MsIERlbGV0ZUtleV9kb2N9LAotCXsiRGVsZXRlVmFsdWUiLCAgICAgIFB5RGVsZXRlVmFsdWUsICAgICBNRVRIX1ZBUkFSR1MsIERlbGV0ZVZhbHVlX2RvY30sCi0JeyJEaXNhYmxlUmVmbGVjdGlvbktleSIsIFB5RGlzYWJsZVJlZmxlY3Rpb25LZXksIE1FVEhfVkFSQVJHUywgRGlzYWJsZVJlZmxlY3Rpb25LZXlfZG9jfSwKLQl7IkVuYWJsZVJlZmxlY3Rpb25LZXkiLCAgUHlFbmFibGVSZWZsZWN0aW9uS2V5LCAgTUVUSF9WQVJBUkdTLCBFbmFibGVSZWZsZWN0aW9uS2V5X2RvY30sCi0JeyJFbnVtS2V5IiwgICAgICAgICAgUHlFbnVtS2V5LCAgICAgICAgIE1FVEhfVkFSQVJHUywgRW51bUtleV9kb2N9LAotCXsiRW51bVZhbHVlIiwgICAgICAgIFB5RW51bVZhbHVlLCAgICAgICBNRVRIX1ZBUkFSR1MsIEVudW1WYWx1ZV9kb2N9LAotCXsiRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzIiwgUHlFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MsIE1FVEhfVkFSQVJHUywKLQkJRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzX2RvYyB9LAotCXsiRmx1c2hLZXkiLCAgICAgICAgIFB5Rmx1c2hLZXksICAgICAgICBNRVRIX1ZBUkFSR1MsIEZsdXNoS2V5X2RvY30sCi0JeyJMb2FkS2V5IiwgICAgICAgICAgUHlMb2FkS2V5LCAgICAgICAgIE1FVEhfVkFSQVJHUywgTG9hZEtleV9kb2N9LAotCXsiT3BlbktleSIsICAgICAgICAgIFB5T3BlbktleSwgICAgICAgICBNRVRIX1ZBUkFSR1MsIE9wZW5LZXlfZG9jfSwKLQl7Ik9wZW5LZXlFeCIsICAgICAgICBQeU9wZW5LZXksICAgICAgICAgTUVUSF9WQVJBUkdTLCBPcGVuS2V5RXhfZG9jfSwKLQl7IlF1ZXJ5VmFsdWUiLCAgICAgICBQeVF1ZXJ5VmFsdWUsICAgICAgTUVUSF9WQVJBUkdTLCBRdWVyeVZhbHVlX2RvY30sCi0JeyJRdWVyeVZhbHVlRXgiLCAgICAgUHlRdWVyeVZhbHVlRXgsICAgIE1FVEhfVkFSQVJHUywgUXVlcnlWYWx1ZUV4X2RvY30sCi0JeyJRdWVyeUluZm9LZXkiLCAgICAgUHlRdWVyeUluZm9LZXksICAgIE1FVEhfVkFSQVJHUywgUXVlcnlJbmZvS2V5X2RvY30sCi0JeyJRdWVyeVJlZmxlY3Rpb25LZXkiLFB5UXVlcnlSZWZsZWN0aW9uS2V5LE1FVEhfVkFSQVJHUywgUXVlcnlSZWZsZWN0aW9uS2V5X2RvY30sCi0JeyJTYXZlS2V5IiwgICAgICAgICAgUHlTYXZlS2V5LCAgICAgICAgIE1FVEhfVkFSQVJHUywgU2F2ZUtleV9kb2N9LAotCXsiU2V0VmFsdWUiLCAgICAgICAgIFB5U2V0VmFsdWUsICAgICAgICBNRVRIX1ZBUkFSR1MsIFNldFZhbHVlX2RvY30sCi0JeyJTZXRWYWx1ZUV4IiwgICAgICAgUHlTZXRWYWx1ZUV4LCAgICAgIE1FVEhfVkFSQVJHUywgU2V0VmFsdWVFeF9kb2N9LAotCU5VTEwsCisgICAgeyJDbG9zZUtleSIsICAgICAgICAgUHlDbG9zZUtleSwgICAgICAgIE1FVEhfVkFSQVJHUywgQ2xvc2VLZXlfZG9jfSwKKyAgICB7IkNvbm5lY3RSZWdpc3RyeSIsICBQeUNvbm5lY3RSZWdpc3RyeSwgTUVUSF9WQVJBUkdTLCBDb25uZWN0UmVnaXN0cnlfZG9jfSwKKyAgICB7IkNyZWF0ZUtleSIsICAgICAgICBQeUNyZWF0ZUtleSwgICAgICAgTUVUSF9WQVJBUkdTLCBDcmVhdGVLZXlfZG9jfSwKKyAgICB7IkRlbGV0ZUtleSIsICAgICAgICBQeURlbGV0ZUtleSwgICAgICAgTUVUSF9WQVJBUkdTLCBEZWxldGVLZXlfZG9jfSwKKyAgICB7IkRlbGV0ZVZhbHVlIiwgICAgICBQeURlbGV0ZVZhbHVlLCAgICAgTUVUSF9WQVJBUkdTLCBEZWxldGVWYWx1ZV9kb2N9LAorICAgIHsiRGlzYWJsZVJlZmxlY3Rpb25LZXkiLCBQeURpc2FibGVSZWZsZWN0aW9uS2V5LCBNRVRIX1ZBUkFSR1MsIERpc2FibGVSZWZsZWN0aW9uS2V5X2RvY30sCisgICAgeyJFbmFibGVSZWZsZWN0aW9uS2V5IiwgIFB5RW5hYmxlUmVmbGVjdGlvbktleSwgIE1FVEhfVkFSQVJHUywgRW5hYmxlUmVmbGVjdGlvbktleV9kb2N9LAorICAgIHsiRW51bUtleSIsICAgICAgICAgIFB5RW51bUtleSwgICAgICAgICBNRVRIX1ZBUkFSR1MsIEVudW1LZXlfZG9jfSwKKyAgICB7IkVudW1WYWx1ZSIsICAgICAgICBQeUVudW1WYWx1ZSwgICAgICAgTUVUSF9WQVJBUkdTLCBFbnVtVmFsdWVfZG9jfSwKKyAgICB7IkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyIsIFB5RXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzLCBNRVRIX1ZBUkFSR1MsCisgICAgICAgIEV4cGFuZEVudmlyb25tZW50U3RyaW5nc19kb2MgfSwKKyAgICB7IkZsdXNoS2V5IiwgICAgICAgICBQeUZsdXNoS2V5LCAgICAgICAgTUVUSF9WQVJBUkdTLCBGbHVzaEtleV9kb2N9LAorICAgIHsiTG9hZEtleSIsICAgICAgICAgIFB5TG9hZEtleSwgICAgICAgICBNRVRIX1ZBUkFSR1MsIExvYWRLZXlfZG9jfSwKKyAgICB7Ik9wZW5LZXkiLCAgICAgICAgICBQeU9wZW5LZXksICAgICAgICAgTUVUSF9WQVJBUkdTLCBPcGVuS2V5X2RvY30sCisgICAgeyJPcGVuS2V5RXgiLCAgICAgICAgUHlPcGVuS2V5LCAgICAgICAgIE1FVEhfVkFSQVJHUywgT3BlbktleUV4X2RvY30sCisgICAgeyJRdWVyeVZhbHVlIiwgICAgICAgUHlRdWVyeVZhbHVlLCAgICAgIE1FVEhfVkFSQVJHUywgUXVlcnlWYWx1ZV9kb2N9LAorICAgIHsiUXVlcnlWYWx1ZUV4IiwgICAgIFB5UXVlcnlWYWx1ZUV4LCAgICBNRVRIX1ZBUkFSR1MsIFF1ZXJ5VmFsdWVFeF9kb2N9LAorICAgIHsiUXVlcnlJbmZvS2V5IiwgICAgIFB5UXVlcnlJbmZvS2V5LCAgICBNRVRIX1ZBUkFSR1MsIFF1ZXJ5SW5mb0tleV9kb2N9LAorICAgIHsiUXVlcnlSZWZsZWN0aW9uS2V5IixQeVF1ZXJ5UmVmbGVjdGlvbktleSxNRVRIX1ZBUkFSR1MsIFF1ZXJ5UmVmbGVjdGlvbktleV9kb2N9LAorICAgIHsiU2F2ZUtleSIsICAgICAgICAgIFB5U2F2ZUtleSwgICAgICAgICBNRVRIX1ZBUkFSR1MsIFNhdmVLZXlfZG9jfSwKKyAgICB7IlNldFZhbHVlIiwgICAgICAgICBQeVNldFZhbHVlLCAgICAgICAgTUVUSF9WQVJBUkdTLCBTZXRWYWx1ZV9kb2N9LAorICAgIHsiU2V0VmFsdWVFeCIsICAgICAgIFB5U2V0VmFsdWVFeCwgICAgICBNRVRIX1ZBUkFSR1MsIFNldFZhbHVlRXhfZG9jfSwKKyAgICBOVUxMLAogfTsKIAogc3RhdGljIHZvaWQKIGluc2ludChQeU9iamVjdCAqIGQsIGNoYXIgKiBuYW1lLCBsb25nIHZhbHVlKQogewotCVB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwotCWlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KSkKLQkJUHlFcnJfQ2xlYXIoKTsKLQlQeV9YREVDUkVGKHYpOworICAgIFB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworICAgIGlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBQeV9YREVDUkVGKHYpOwogfQogCiAjZGVmaW5lIEFERF9JTlQodmFsKSBpbnNpbnQoZCwgI3ZhbCwgdmFsKQpAQCAtMTYyMyw4OCArMTYyMyw4OCBAQAogc3RhdGljIHZvaWQKIGluc2tleShQeU9iamVjdCAqIGQsIGNoYXIgKiBuYW1lLCBIS0VZIGtleSkKIHsKLQlQeU9iamVjdCAqdiA9IFB5TG9uZ19Gcm9tVm9pZFB0cihrZXkpOwotCWlmICghdiB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCBuYW1lLCB2KSkKLQkJUHlFcnJfQ2xlYXIoKTsKLQlQeV9YREVDUkVGKHYpOworICAgIFB5T2JqZWN0ICp2ID0gUHlMb25nX0Zyb21Wb2lkUHRyKGtleSk7CisgICAgaWYgKCF2IHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYodik7CiB9CiAKICNkZWZpbmUgQUREX0tFWSh2YWwpIGluc2tleShkLCAjdmFsLCB2YWwpCiAKIFB5TU9ESU5JVF9GVU5DIGluaXRfd2lucmVnKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCW0gPSBQeV9Jbml0TW9kdWxlMygiX3dpbnJlZyIsIHdpbnJlZ19tZXRob2RzLCBtb2R1bGVfZG9jKTsKLQlpZiAobSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JUHlIS0VZX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlQeUhLRVlfVHlwZS50cF9kb2MgPSBQeUhLRVlfZG9jOwotCVB5X0lOQ1JFRigmUHlIS0VZX1R5cGUpOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSEtFWVR5cGUiLAotCQkJCSAoUHlPYmplY3QgKikmUHlIS0VZX1R5cGUpICE9IDApCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoUHlFeGNfV2luZG93c0Vycm9yKTsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwKLQkJCQkgUHlFeGNfV2luZG93c0Vycm9yKSAhPSAwKQotCQlyZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkOworICAgIG0gPSBQeV9Jbml0TW9kdWxlMygiX3dpbnJlZyIsIHdpbnJlZ19tZXRob2RzLCBtb2R1bGVfZG9jKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgUHlIS0VZX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBQeUhLRVlfVHlwZS50cF9kb2MgPSBQeUhLRVlfZG9jOworICAgIFB5X0lOQ1JFRigmUHlIS0VZX1R5cGUpOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiSEtFWVR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKikmUHlIS0VZX1R5cGUpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9JTkNSRUYoUHlFeGNfV2luZG93c0Vycm9yKTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfV2luZG93c0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CiAKLQkvKiBBZGQgdGhlIHJlbGV2YW50IGNvbnN0YW50cyAqLwotCUFERF9LRVkoSEtFWV9DTEFTU0VTX1JPT1QpOwotCUFERF9LRVkoSEtFWV9DVVJSRU5UX1VTRVIpOwotCUFERF9LRVkoSEtFWV9MT0NBTF9NQUNISU5FKTsKLQlBRERfS0VZKEhLRVlfVVNFUlMpOwotCUFERF9LRVkoSEtFWV9QRVJGT1JNQU5DRV9EQVRBKTsKKyAgICAvKiBBZGQgdGhlIHJlbGV2YW50IGNvbnN0YW50cyAqLworICAgIEFERF9LRVkoSEtFWV9DTEFTU0VTX1JPT1QpOworICAgIEFERF9LRVkoSEtFWV9DVVJSRU5UX1VTRVIpOworICAgIEFERF9LRVkoSEtFWV9MT0NBTF9NQUNISU5FKTsKKyAgICBBRERfS0VZKEhLRVlfVVNFUlMpOworICAgIEFERF9LRVkoSEtFWV9QRVJGT1JNQU5DRV9EQVRBKTsKICNpZmRlZiBIS0VZX0NVUlJFTlRfQ09ORklHCi0JQUREX0tFWShIS0VZX0NVUlJFTlRfQ09ORklHKTsKKyAgICBBRERfS0VZKEhLRVlfQ1VSUkVOVF9DT05GSUcpOwogI2VuZGlmCiAjaWZkZWYgSEtFWV9EWU5fREFUQQotCUFERF9LRVkoSEtFWV9EWU5fREFUQSk7CisgICAgQUREX0tFWShIS0VZX0RZTl9EQVRBKTsKICNlbmRpZgotCUFERF9JTlQoS0VZX1FVRVJZX1ZBTFVFKTsKLQlBRERfSU5UKEtFWV9TRVRfVkFMVUUpOwotCUFERF9JTlQoS0VZX0NSRUFURV9TVUJfS0VZKTsKLQlBRERfSU5UKEtFWV9FTlVNRVJBVEVfU1VCX0tFWVMpOwotCUFERF9JTlQoS0VZX05PVElGWSk7Ci0JQUREX0lOVChLRVlfQ1JFQVRFX0xJTkspOwotCUFERF9JTlQoS0VZX1JFQUQpOwotCUFERF9JTlQoS0VZX1dSSVRFKTsKLQlBRERfSU5UKEtFWV9FWEVDVVRFKTsKLQlBRERfSU5UKEtFWV9BTExfQUNDRVNTKTsKKyAgICBBRERfSU5UKEtFWV9RVUVSWV9WQUxVRSk7CisgICAgQUREX0lOVChLRVlfU0VUX1ZBTFVFKTsKKyAgICBBRERfSU5UKEtFWV9DUkVBVEVfU1VCX0tFWSk7CisgICAgQUREX0lOVChLRVlfRU5VTUVSQVRFX1NVQl9LRVlTKTsKKyAgICBBRERfSU5UKEtFWV9OT1RJRlkpOworICAgIEFERF9JTlQoS0VZX0NSRUFURV9MSU5LKTsKKyAgICBBRERfSU5UKEtFWV9SRUFEKTsKKyAgICBBRERfSU5UKEtFWV9XUklURSk7CisgICAgQUREX0lOVChLRVlfRVhFQ1VURSk7CisgICAgQUREX0lOVChLRVlfQUxMX0FDQ0VTUyk7CiAjaWZkZWYgS0VZX1dPVzY0XzY0S0VZCi0JQUREX0lOVChLRVlfV09XNjRfNjRLRVkpOworICAgIEFERF9JTlQoS0VZX1dPVzY0XzY0S0VZKTsKICNlbmRpZgogI2lmZGVmIEtFWV9XT1c2NF8zMktFWQotCUFERF9JTlQoS0VZX1dPVzY0XzMyS0VZKTsKKyAgICBBRERfSU5UKEtFWV9XT1c2NF8zMktFWSk7CiAjZW5kaWYKLQlBRERfSU5UKFJFR19PUFRJT05fUkVTRVJWRUQpOwotCUFERF9JTlQoUkVHX09QVElPTl9OT05fVk9MQVRJTEUpOwotCUFERF9JTlQoUkVHX09QVElPTl9WT0xBVElMRSk7Ci0JQUREX0lOVChSRUdfT1BUSU9OX0NSRUFURV9MSU5LKTsKLQlBRERfSU5UKFJFR19PUFRJT05fQkFDS1VQX1JFU1RPUkUpOwotCUFERF9JTlQoUkVHX09QVElPTl9PUEVOX0xJTkspOwotCUFERF9JTlQoUkVHX0xFR0FMX09QVElPTik7Ci0JQUREX0lOVChSRUdfQ1JFQVRFRF9ORVdfS0VZKTsKLQlBRERfSU5UKFJFR19PUEVORURfRVhJU1RJTkdfS0VZKTsKLQlBRERfSU5UKFJFR19XSE9MRV9ISVZFX1ZPTEFUSUxFKTsKLQlBRERfSU5UKFJFR19SRUZSRVNIX0hJVkUpOwotCUFERF9JTlQoUkVHX05PX0xBWllfRkxVU0gpOwotCUFERF9JTlQoUkVHX05PVElGWV9DSEFOR0VfTkFNRSk7Ci0JQUREX0lOVChSRUdfTk9USUZZX0NIQU5HRV9BVFRSSUJVVEVTKTsKLQlBRERfSU5UKFJFR19OT1RJRllfQ0hBTkdFX0xBU1RfU0VUKTsKLQlBRERfSU5UKFJFR19OT1RJRllfQ0hBTkdFX1NFQ1VSSVRZKTsKLQlBRERfSU5UKFJFR19MRUdBTF9DSEFOR0VfRklMVEVSKTsKLQlBRERfSU5UKFJFR19OT05FKTsKLQlBRERfSU5UKFJFR19TWik7Ci0JQUREX0lOVChSRUdfRVhQQU5EX1NaKTsKLQlBRERfSU5UKFJFR19CSU5BUlkpOwotCUFERF9JTlQoUkVHX0RXT1JEKTsKLQlBRERfSU5UKFJFR19EV09SRF9MSVRUTEVfRU5ESUFOKTsKLQlBRERfSU5UKFJFR19EV09SRF9CSUdfRU5ESUFOKTsKLQlBRERfSU5UKFJFR19MSU5LKTsKLQlBRERfSU5UKFJFR19NVUxUSV9TWik7Ci0JQUREX0lOVChSRUdfUkVTT1VSQ0VfTElTVCk7Ci0JQUREX0lOVChSRUdfRlVMTF9SRVNPVVJDRV9ERVNDUklQVE9SKTsKLQlBRERfSU5UKFJFR19SRVNPVVJDRV9SRVFVSVJFTUVOVFNfTElTVCk7CisgICAgQUREX0lOVChSRUdfT1BUSU9OX1JFU0VSVkVEKTsKKyAgICBBRERfSU5UKFJFR19PUFRJT05fTk9OX1ZPTEFUSUxFKTsKKyAgICBBRERfSU5UKFJFR19PUFRJT05fVk9MQVRJTEUpOworICAgIEFERF9JTlQoUkVHX09QVElPTl9DUkVBVEVfTElOSyk7CisgICAgQUREX0lOVChSRUdfT1BUSU9OX0JBQ0tVUF9SRVNUT1JFKTsKKyAgICBBRERfSU5UKFJFR19PUFRJT05fT1BFTl9MSU5LKTsKKyAgICBBRERfSU5UKFJFR19MRUdBTF9PUFRJT04pOworICAgIEFERF9JTlQoUkVHX0NSRUFURURfTkVXX0tFWSk7CisgICAgQUREX0lOVChSRUdfT1BFTkVEX0VYSVNUSU5HX0tFWSk7CisgICAgQUREX0lOVChSRUdfV0hPTEVfSElWRV9WT0xBVElMRSk7CisgICAgQUREX0lOVChSRUdfUkVGUkVTSF9ISVZFKTsKKyAgICBBRERfSU5UKFJFR19OT19MQVpZX0ZMVVNIKTsKKyAgICBBRERfSU5UKFJFR19OT1RJRllfQ0hBTkdFX05BTUUpOworICAgIEFERF9JTlQoUkVHX05PVElGWV9DSEFOR0VfQVRUUklCVVRFUyk7CisgICAgQUREX0lOVChSRUdfTk9USUZZX0NIQU5HRV9MQVNUX1NFVCk7CisgICAgQUREX0lOVChSRUdfTk9USUZZX0NIQU5HRV9TRUNVUklUWSk7CisgICAgQUREX0lOVChSRUdfTEVHQUxfQ0hBTkdFX0ZJTFRFUik7CisgICAgQUREX0lOVChSRUdfTk9ORSk7CisgICAgQUREX0lOVChSRUdfU1opOworICAgIEFERF9JTlQoUkVHX0VYUEFORF9TWik7CisgICAgQUREX0lOVChSRUdfQklOQVJZKTsKKyAgICBBRERfSU5UKFJFR19EV09SRCk7CisgICAgQUREX0lOVChSRUdfRFdPUkRfTElUVExFX0VORElBTik7CisgICAgQUREX0lOVChSRUdfRFdPUkRfQklHX0VORElBTik7CisgICAgQUREX0lOVChSRUdfTElOSyk7CisgICAgQUREX0lOVChSRUdfTVVMVElfU1opOworICAgIEFERF9JTlQoUkVHX1JFU09VUkNFX0xJU1QpOworICAgIEFERF9JTlQoUkVHX0ZVTExfUkVTT1VSQ0VfREVTQ1JJUFRPUik7CisgICAgQUREX0lOVChSRUdfUkVTT1VSQ0VfUkVRVUlSRU1FTlRTX0xJU1QpOwogfQogCmRpZmYgLS1naXQgYS9QQy9iZGlzdF93aW5pbnN0L2FyY2hpdmUuaCBiL1BDL2JkaXN0X3dpbmluc3QvYXJjaGl2ZS5oCmluZGV4IDM1ZDJmZDYuLjMxYTc4MDUgMTAwNjQ0Ci0tLSBhL1BDL2JkaXN0X3dpbmluc3QvYXJjaGl2ZS5oCisrKyBiL1BDL2JkaXN0X3dpbmluc3QvYXJjaGl2ZS5oCkBAIC0xNCw1NSArMTQsNTUgQEAKICAqLwogCiBzdHJ1Y3QgZW9mX2NkaXIgewotCWxvbmcgdGFnOwkvKiBtdXN0IGJlIDB4MDYwNTRiNTAgKi8KLQlzaG9ydCBkaXNrbnVtOwotCXNob3J0IGZpcnN0ZGlzazsKLQlzaG9ydCBuVG90YWxDRGlyVGhpczsKLQlzaG9ydCBuVG90YWxDRGlyOwotCWxvbmcgbkJ5dGVzQ0RpcjsKLQlsb25nIG9mc0NEaXI7Ci0Jc2hvcnQgY29tbWVudGxlbjsKKyAgICBsb25nIHRhZzsgICAgICAgICAgIC8qIG11c3QgYmUgMHgwNjA1NGI1MCAqLworICAgIHNob3J0IGRpc2tudW07CisgICAgc2hvcnQgZmlyc3RkaXNrOworICAgIHNob3J0IG5Ub3RhbENEaXJUaGlzOworICAgIHNob3J0IG5Ub3RhbENEaXI7CisgICAgbG9uZyBuQnl0ZXNDRGlyOworICAgIGxvbmcgb2ZzQ0RpcjsKKyAgICBzaG9ydCBjb21tZW50bGVuOwogfTsKIAogc3RydWN0IGNkaXIgewotCWxvbmcgdGFnOwkvKiBtdXN0IGJlIDB4MDIwMTRiNTAgKi8KLQlzaG9ydCB2ZXJzaW9uX21hZGU7Ci0Jc2hvcnQgdmVyc2lvbl9leHRyYWN0OwotCXNob3J0IGdwX2JpdGZsYWc7Ci0Jc2hvcnQgY29tcF9tZXRob2Q7Ci0Jc2hvcnQgbGFzdF9tb2RfZmlsZV90aW1lOwotCXNob3J0IGxhc3RfbW9kX2ZpbGVfZGF0ZTsKLQlsb25nIGNyYzMyOwotCWxvbmcgY29tcF9zaXplOwotCWxvbmcgdW5jb21wX3NpemU7Ci0Jc2hvcnQgZm5hbWVfbGVuZ3RoOwotCXNob3J0IGV4dHJhX2xlbmd0aDsKLQlzaG9ydCBjb21tZW50X2xlbmd0aDsKLQlzaG9ydCBkaXNrbnVtX3N0YXJ0OwotCXNob3J0IGludF9maWxlX2F0dHI7Ci0JbG9uZyBleHRfZmlsZV9hdHRyOwotCWxvbmcgb2ZzX2xvY2FsX2hlYWRlcjsKKyAgICBsb25nIHRhZzsgICAgICAgICAgIC8qIG11c3QgYmUgMHgwMjAxNGI1MCAqLworICAgIHNob3J0IHZlcnNpb25fbWFkZTsKKyAgICBzaG9ydCB2ZXJzaW9uX2V4dHJhY3Q7CisgICAgc2hvcnQgZ3BfYml0ZmxhZzsKKyAgICBzaG9ydCBjb21wX21ldGhvZDsKKyAgICBzaG9ydCBsYXN0X21vZF9maWxlX3RpbWU7CisgICAgc2hvcnQgbGFzdF9tb2RfZmlsZV9kYXRlOworICAgIGxvbmcgY3JjMzI7CisgICAgbG9uZyBjb21wX3NpemU7CisgICAgbG9uZyB1bmNvbXBfc2l6ZTsKKyAgICBzaG9ydCBmbmFtZV9sZW5ndGg7CisgICAgc2hvcnQgZXh0cmFfbGVuZ3RoOworICAgIHNob3J0IGNvbW1lbnRfbGVuZ3RoOworICAgIHNob3J0IGRpc2tudW1fc3RhcnQ7CisgICAgc2hvcnQgaW50X2ZpbGVfYXR0cjsKKyAgICBsb25nIGV4dF9maWxlX2F0dHI7CisgICAgbG9uZyBvZnNfbG9jYWxfaGVhZGVyOwogfTsKIAogc3RydWN0IGZoZHIgewotCWxvbmcgdGFnOwkvKiBtdXN0IGJlIDB4MDQwMzRiNTAgKi8KLQlzaG9ydCB2ZXJzaW9uX25lZWRlZDsKLQlzaG9ydCBmbGFnczsKLQlzaG9ydCBtZXRob2Q7Ci0Jc2hvcnQgbGFzdF9tb2RfZmlsZV90aW1lOwotCXNob3J0IGxhc3RfbW9kX2ZpbGVfZGF0ZTsKLQlsb25nIGNyYzMyOwotCWxvbmcgY29tcF9zaXplOwotCWxvbmcgdW5jb21wX3NpemU7Ci0Jc2hvcnQgZm5hbWVfbGVuZ3RoOwotCXNob3J0IGV4dHJhX2xlbmd0aDsKKyAgICBsb25nIHRhZzsgICAgICAgICAgIC8qIG11c3QgYmUgMHgwNDAzNGI1MCAqLworICAgIHNob3J0IHZlcnNpb25fbmVlZGVkOworICAgIHNob3J0IGZsYWdzOworICAgIHNob3J0IG1ldGhvZDsKKyAgICBzaG9ydCBsYXN0X21vZF9maWxlX3RpbWU7CisgICAgc2hvcnQgbGFzdF9tb2RfZmlsZV9kYXRlOworICAgIGxvbmcgY3JjMzI7CisgICAgbG9uZyBjb21wX3NpemU7CisgICAgbG9uZyB1bmNvbXBfc2l6ZTsKKyAgICBzaG9ydCBmbmFtZV9sZW5ndGg7CisgICAgc2hvcnQgZXh0cmFfbGVuZ3RoOwogfTsKIAogCiBzdHJ1Y3QgbWV0YV9kYXRhX2hkciB7Ci0JaW50IHRhZzsKLQlpbnQgdW5jb21wX3NpemU7Ci0JaW50IGJpdG1hcF9zaXplOworICAgIGludCB0YWc7CisgICAgaW50IHVuY29tcF9zaXplOworICAgIGludCBiaXRtYXBfc2l6ZTsKIH07CiAKICNwcmFnbWEgcGFjaygpCkBAIC03MCwyOSArNzAsMjkgQEAKIC8qIGluc3RhbGxhdGlvbiBzY2hlbWUgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgdGFnU0NIRU1FIHsKLQljaGFyICpuYW1lOwotCWNoYXIgKnByZWZpeDsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKnByZWZpeDsKIH0gU0NIRU1FOwogCiB0eXBlZGVmIGludCAoKk5PVElGWVBST0MpKGludCBjb2RlLCBMUFNUUiB0ZXh0LCAuLi4pOwogCiBleHRlcm4gQk9PTAogZXh0cmFjdF9maWxlKGNoYXIgKmRzdCwgY2hhciAqc3JjLCBpbnQgbWV0aG9kLCBpbnQgY29tcF9zaXplLAotCSAgICAgaW50IHVuY29tcF9zaXplLCBOT1RJRllQUk9DIG5vdGlmeSk7CisgICAgICAgICAgICAgaW50IHVuY29tcF9zaXplLCBOT1RJRllQUk9DIG5vdGlmeSk7CiAKIGV4dGVybiBCT09MCiB1bnppcF9hcmNoaXZlKFNDSEVNRSAqc2NoZW1lLCBjaGFyICpkaXJuYW1lLCBjaGFyICpkYXRhLAotCSAgICAgIERXT1JEIHNpemUsICBOT1RJRllQUk9DIG5vdGlmeSk7CisgICAgICAgICAgICAgIERXT1JEIHNpemUsICBOT1RJRllQUk9DIG5vdGlmeSk7CiAKIGV4dGVybiBjaGFyICoKIG1hcF9uZXdfZmlsZShEV09SRCBmbGFncywgY2hhciAqZmlsZW5hbWUsIGNoYXIKLQkgICAgICpwYXRobmFtZV9wYXJ0LCBpbnQgc2l6ZSwKLQkgICAgIFdPUkQgd0ZhdERhdGUsIFdPUkQgd0ZhdFRpbWUsCi0JICAgICBOT1RJRllQUk9DIGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAqcGF0aG5hbWVfcGFydCwgaW50IHNpemUsCisgICAgICAgICAgICAgV09SRCB3RmF0RGF0ZSwgV09SRCB3RmF0VGltZSwKKyAgICAgICAgICAgICBOT1RJRllQUk9DIGNhbGxiYWNrKTsKIAogZXh0ZXJuIEJPT0wKIGVuc3VyZV9kaXJlY3RvcnkgKGNoYXIgKnBhdGhuYW1lLCBjaGFyICpuZXdfcGFydCwKLQkJICBOT1RJRllQUk9DIGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgIE5PVElGWVBST0MgY2FsbGJhY2spOwogCiAvKiBjb2RlcyBmb3IgTk9JVElGWVBST0MgKi8KICNkZWZpbmUgRElSX0NSRUFURUQgMQpkaWZmIC0tZ2l0IGEvUEMvYmRpc3Rfd2luaW5zdC9leHRyYWN0LmMgYi9QQy9iZGlzdF93aW5pbnN0L2V4dHJhY3QuYwppbmRleCBiNDk1ZTFjLi5mYzJkMmI5IDEwMDY0NAotLS0gYS9QQy9iZGlzdF93aW5pbnN0L2V4dHJhY3QuYworKysgYi9QQy9iZGlzdF93aW5pbnN0L2V4dHJhY3QuYwpAQCAtMTksMTgxICsxOSwxODEgQEAKIC8qIENvbnZlcnQgdW5peC1wYXRoIHRvIGRvcy1wYXRoICovCiBzdGF0aWMgdm9pZCBub3JtcGF0aChjaGFyICpwYXRoKQogewotCXdoaWxlIChwYXRoICYmICpwYXRoKSB7Ci0JCWlmICgqcGF0aCA9PSAnLycpCi0JCQkqcGF0aCA9ICdcXCc7Ci0JCSsrcGF0aDsKLQl9CisgICAgd2hpbGUgKHBhdGggJiYgKnBhdGgpIHsKKyAgICAgICAgaWYgKCpwYXRoID09ICcvJykKKyAgICAgICAgICAgICpwYXRoID0gJ1xcJzsKKyAgICAgICAgKytwYXRoOworICAgIH0KIH0KIAogQk9PTCBlbnN1cmVfZGlyZWN0b3J5KGNoYXIgKnBhdGhuYW1lLCBjaGFyICpuZXdfcGFydCwgTk9USUZZUFJPQyBub3RpZnkpCiB7Ci0Jd2hpbGUgKG5ld19wYXJ0ICYmICpuZXdfcGFydCAmJiAobmV3X3BhcnQgPSBzdHJjaHIobmV3X3BhcnQsICdcXCcpKSkgewotCQlEV09SRCBhdHRyOwotCQkqbmV3X3BhcnQgPSAnXDAnOwotCQlhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXMocGF0aG5hbWUpOwotCQlpZiAoYXR0ciA9PSAtMSkgewotCQkJLyogbm90aGluZyBmb3VuZCAqLwotCQkJaWYgKCFDcmVhdGVEaXJlY3RvcnkocGF0aG5hbWUsIE5VTEwpICYmIG5vdGlmeSkKLQkJCQlub3RpZnkoU1lTVEVNX0VSUk9SLAotCQkJCSAgICAgICAiQ3JlYXRlRGlyZWN0b3J5ICglcykiLCBwYXRobmFtZSk7Ci0JCQllbHNlCi0JCQkJbm90aWZ5KERJUl9DUkVBVEVELCBwYXRobmFtZSk7Ci0JCX0KLQkJaWYgKGF0dHIgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpIHsKLQkJCTsKLQkJfSBlbHNlIHsKLQkJCVNldExhc3RFcnJvcigxODMpOwotCQkJaWYgKG5vdGlmeSkKLQkJCQlub3RpZnkoU1lTVEVNX0VSUk9SLAotCQkJCSAgICAgICAiQ3JlYXRlRGlyZWN0b3J5ICglcykiLCBwYXRobmFtZSk7Ci0JCX0KLQkJKm5ld19wYXJ0ID0gJ1xcJzsKLQkJKytuZXdfcGFydDsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgd2hpbGUgKG5ld19wYXJ0ICYmICpuZXdfcGFydCAmJiAobmV3X3BhcnQgPSBzdHJjaHIobmV3X3BhcnQsICdcXCcpKSkgeworICAgICAgICBEV09SRCBhdHRyOworICAgICAgICAqbmV3X3BhcnQgPSAnXDAnOworICAgICAgICBhdHRyID0gR2V0RmlsZUF0dHJpYnV0ZXMocGF0aG5hbWUpOworICAgICAgICBpZiAoYXR0ciA9PSAtMSkgeworICAgICAgICAgICAgLyogbm90aGluZyBmb3VuZCAqLworICAgICAgICAgICAgaWYgKCFDcmVhdGVEaXJlY3RvcnkocGF0aG5hbWUsIE5VTEwpICYmIG5vdGlmeSkKKyAgICAgICAgICAgICAgICBub3RpZnkoU1lTVEVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRlRGlyZWN0b3J5ICglcykiLCBwYXRobmFtZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbm90aWZ5KERJUl9DUkVBVEVELCBwYXRobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHIgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpIHsKKyAgICAgICAgICAgIDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNldExhc3RFcnJvcigxODMpOworICAgICAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgICAgICBub3RpZnkoU1lTVEVNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ3JlYXRlRGlyZWN0b3J5ICglcykiLCBwYXRobmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgKm5ld19wYXJ0ID0gJ1xcJzsKKyAgICAgICAgKytuZXdfcGFydDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qIFhYWCBTaG91bGQgYmV0dGVyIGV4cGxpY2l0ZWx5IHNwZWNpZnkKICAqIHVuY29tcF9zaXplIGFuZCBmaWxlX3RpbWVzIGluc3RlYWQgb2YgcGZoZHIhCiAgKi8KIGNoYXIgKm1hcF9uZXdfZmlsZShEV09SRCBmbGFncywgY2hhciAqZmlsZW5hbWUsCi0JCSAgIGNoYXIgKnBhdGhuYW1lX3BhcnQsIGludCBzaXplLAotCQkgICBXT1JEIHdGYXREYXRlLCBXT1JEIHdGYXRUaW1lLAotCQkgICBOT1RJRllQUk9DIG5vdGlmeSkKKyAgICAgICAgICAgICAgICAgICBjaGFyICpwYXRobmFtZV9wYXJ0LCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBXT1JEIHdGYXREYXRlLCBXT1JEIHdGYXRUaW1lLAorICAgICAgICAgICAgICAgICAgIE5PVElGWVBST0Mgbm90aWZ5KQogewotCUhBTkRMRSBoRmlsZSwgaEZpbGVNYXBwaW5nOwotCWNoYXIgKmRzdDsKLQlGSUxFVElNRSBmdDsKKyAgICBIQU5ETEUgaEZpbGUsIGhGaWxlTWFwcGluZzsKKyAgICBjaGFyICpkc3Q7CisgICAgRklMRVRJTUUgZnQ7CiAKICAgdHJ5X2FnYWluOgotCWlmICghZmxhZ3MpCi0JCWZsYWdzID0gQ1JFQVRFX05FVzsKLQloRmlsZSA9IENyZWF0ZUZpbGUoZmlsZW5hbWUsCi0JCQkgICBHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19SRUFELAotCQkJICAgMCwgTlVMTCwKLQkJCSAgIGZsYWdzLAotCQkJICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKLQlpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKLQkJRFdPUkQgeCA9IEdldExhc3RFcnJvcigpOwotCQlzd2l0Y2ggKHgpIHsKLQkJY2FzZSBFUlJPUl9GSUxFX0VYSVNUUzoKLQkJCWlmIChub3RpZnkgJiYgbm90aWZ5KENBTl9PVkVSV1JJVEUsIGZpbGVuYW1lKSkKLQkJCQloRmlsZSA9IENyZWF0ZUZpbGUoZmlsZW5hbWUsCi0JCQkJCQkgICBHRU5FUklDX1dSSVRFfEdFTkVSSUNfUkVBRCwKLQkJCQkJCSAgIDAsIE5VTEwsCi0JCQkJCQkgICBDUkVBVEVfQUxXQVlTLAotCQkJCQkJICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLAotCQkJCQkJICAgTlVMTCk7Ci0JCQllbHNlIHsKLQkJCQlpZiAobm90aWZ5KQotCQkJCQlub3RpZnkoRklMRV9PVkVSV1JJVFRFTiwgZmlsZW5hbWUpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRVJST1JfUEFUSF9OT1RfRk9VTkQ6Ci0JCQlpZiAoZW5zdXJlX2RpcmVjdG9yeShmaWxlbmFtZSwgcGF0aG5hbWVfcGFydCwgbm90aWZ5KSkKLQkJCQlnb3RvIHRyeV9hZ2FpbjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gRkFMU0U7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVNldExhc3RFcnJvcih4KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQlpZiAobm90aWZ5KQotCQkJbm90aWZ5IChTWVNURU1fRVJST1IsICJDcmVhdGVGaWxlICglcykiLCBmaWxlbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIWZsYWdzKQorICAgICAgICBmbGFncyA9IENSRUFURV9ORVc7CisgICAgaEZpbGUgPSBDcmVhdGVGaWxlKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKKyAgICBpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgRFdPUkQgeCA9IEdldExhc3RFcnJvcigpOworICAgICAgICBzd2l0Y2ggKHgpIHsKKyAgICAgICAgY2FzZSBFUlJPUl9GSUxFX0VYSVNUUzoKKyAgICAgICAgICAgIGlmIChub3RpZnkgJiYgbm90aWZ5KENBTl9PVkVSV1JJVEUsIGZpbGVuYW1lKSkKKyAgICAgICAgICAgICAgICBoRmlsZSA9IENyZWF0ZUZpbGUoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfV1JJVEV8R0VORVJJQ19SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEVfQUxXQVlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0FUVFJJQlVURV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KEZJTEVfT1ZFUldSSVRURU4sIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVSUk9SX1BBVEhfTk9UX0ZPVU5EOgorICAgICAgICAgICAgaWYgKGVuc3VyZV9kaXJlY3RvcnkoZmlsZW5hbWUsIHBhdGhuYW1lX3BhcnQsIG5vdGlmeSkpCisgICAgICAgICAgICAgICAgZ290byB0cnlfYWdhaW47CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBTZXRMYXN0RXJyb3IoeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgIG5vdGlmeSAoU1lTVEVNX0VSUk9SLCAiQ3JlYXRlRmlsZSAoJXMpIiwgZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAobm90aWZ5KQotCQlub3RpZnkoRklMRV9DUkVBVEVELCBmaWxlbmFtZSk7CisgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgbm90aWZ5KEZJTEVfQ1JFQVRFRCwgZmlsZW5hbWUpOwogCi0JRG9zRGF0ZVRpbWVUb0ZpbGVUaW1lKHdGYXREYXRlLCB3RmF0VGltZSwgJmZ0KTsKLQlTZXRGaWxlVGltZShoRmlsZSwgJmZ0LCAmZnQsICZmdCk7CisgICAgRG9zRGF0ZVRpbWVUb0ZpbGVUaW1lKHdGYXREYXRlLCB3RmF0VGltZSwgJmZ0KTsKKyAgICBTZXRGaWxlVGltZShoRmlsZSwgJmZ0LCAmZnQsICZmdCk7CiAKIAotCWlmIChzaXplID09IDApIHsKLQkJLyogV2UgY2Fubm90IG1hcCBhIHplcm8tbGVuZ3RoIGZpbGUgKEFsc28gaXQgbWFrZXMKLQkJICAgbm8gc2Vuc2UgKi8KLQkJQ2xvc2VIYW5kbGUoaEZpbGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAvKiBXZSBjYW5ub3QgbWFwIGEgemVyby1sZW5ndGggZmlsZSAoQWxzbyBpdCBtYWtlcworICAgICAgICAgICBubyBzZW5zZSAqLworICAgICAgICBDbG9zZUhhbmRsZShoRmlsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWhGaWxlTWFwcGluZyA9IENyZWF0ZUZpbGVNYXBwaW5nKGhGaWxlLAotCQkJCQkgTlVMTCwgUEFHRV9SRUFEV1JJVEUsIDAsIHNpemUsIE5VTEwpOworICAgIGhGaWxlTWFwcGluZyA9IENyZWF0ZUZpbGVNYXBwaW5nKGhGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIFBBR0VfUkVBRFdSSVRFLCAwLCBzaXplLCBOVUxMKTsKIAotCUNsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICBDbG9zZUhhbmRsZShoRmlsZSk7CiAKLQlpZiAoaEZpbGVNYXBwaW5nID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0JCWlmIChub3RpZnkpCi0JCQlub3RpZnkoU1lTVEVNX0VSUk9SLAotCQkJICAgICAgICJDcmVhdGVGaWxlTWFwcGluZyAoJXMpIiwgZmlsZW5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGhGaWxlTWFwcGluZyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgICBpZiAobm90aWZ5KQorICAgICAgICAgICAgbm90aWZ5KFNZU1RFTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ3JlYXRlRmlsZU1hcHBpbmcgKCVzKSIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZHN0ID0gTWFwVmlld09mRmlsZShoRmlsZU1hcHBpbmcsCi0JCQkgICAgRklMRV9NQVBfV1JJVEUsIDAsIDAsIDApOworICAgIGRzdCA9IE1hcFZpZXdPZkZpbGUoaEZpbGVNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9NQVBfV1JJVEUsIDAsIDAsIDApOwogCi0JQ2xvc2VIYW5kbGUoaEZpbGVNYXBwaW5nKTsKKyAgICBDbG9zZUhhbmRsZShoRmlsZU1hcHBpbmcpOwogCi0JaWYgKCFkc3QpIHsKLQkJaWYgKG5vdGlmeSkKLQkJCW5vdGlmeShTWVNURU1fRVJST1IsICJNYXBWaWV3T2ZGaWxlICglcykiLCBmaWxlbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gZHN0OworICAgIGlmICghZHN0KSB7CisgICAgICAgIGlmIChub3RpZnkpCisgICAgICAgICAgICBub3RpZnkoU1lTVEVNX0VSUk9SLCAiTWFwVmlld09mRmlsZSAoJXMpIiwgZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGRzdDsKIH0KIAogCiBCT09MCiBleHRyYWN0X2ZpbGUoY2hhciAqZHN0LCBjaGFyICpzcmMsIGludCBtZXRob2QsIGludCBjb21wX3NpemUsCi0JICAgICBpbnQgdW5jb21wX3NpemUsIE5PVElGWVBST0Mgbm90aWZ5KQorICAgICAgICAgICAgIGludCB1bmNvbXBfc2l6ZSwgTk9USUZZUFJPQyBub3RpZnkpCiB7Ci0Jel9zdHJlYW0genN0cmVhbTsKLQlpbnQgcmVzdWx0OworICAgIHpfc3RyZWFtIHpzdHJlYW07CisgICAgaW50IHJlc3VsdDsKIAotCWlmIChtZXRob2QgPT0gWl9ERUZMQVRFRCkgewotCQlpbnQgeDsKLQkJbWVtc2V0KCZ6c3RyZWFtLCAwLCBzaXplb2YoenN0cmVhbSkpOwotCQl6c3RyZWFtLm5leHRfaW4gPSBzcmM7Ci0JCXpzdHJlYW0uYXZhaWxfaW4gPSBjb21wX3NpemUrMTsKLQkJenN0cmVhbS5uZXh0X291dCA9IGRzdDsKLQkJenN0cmVhbS5hdmFpbF9vdXQgPSB1bmNvbXBfc2l6ZTsKKyAgICBpZiAobWV0aG9kID09IFpfREVGTEFURUQpIHsKKyAgICAgICAgaW50IHg7CisgICAgICAgIG1lbXNldCgmenN0cmVhbSwgMCwgc2l6ZW9mKHpzdHJlYW0pKTsKKyAgICAgICAgenN0cmVhbS5uZXh0X2luID0gc3JjOworICAgICAgICB6c3RyZWFtLmF2YWlsX2luID0gY29tcF9zaXplKzE7CisgICAgICAgIHpzdHJlYW0ubmV4dF9vdXQgPSBkc3Q7CisgICAgICAgIHpzdHJlYW0uYXZhaWxfb3V0ID0gdW5jb21wX3NpemU7CiAKIC8qIEFwcGFyZW50bHkgYW4gdW5kb2N1bWVudGVkIGZlYXR1cmUgb2YgemxpYjogU2V0IHdpbmRvd3NpemUKICAgIHRvIG5lZ2F0aXZlIHZhbHVlcyB0byBzdXByZXNzIHRoZSBnemlwIGhlYWRlciBhbmQgYmUgY29tcGF0aWJsZSB3aXRoCiAgICB6aXAhICovCi0JCXJlc3VsdCA9IFRSVUU7Ci0JCWlmIChaX09LICE9ICh4ID0gaW5mbGF0ZUluaXQyKCZ6c3RyZWFtLCAtMTUpKSkgewotCQkJaWYgKG5vdGlmeSkKLQkJCQlub3RpZnkoWkxJQl9FUlJPUiwKLQkJCQkgICAgICAgImluZmxhdGVJbml0MiByZXR1cm5zICVkIiwgeCk7Ci0JCQlyZXN1bHQgPSBGQUxTRTsKLQkJCWdvdG8gY2xlYW51cDsKLQkJfQotCQlpZiAoWl9TVFJFQU1fRU5EICE9ICh4ID0gaW5mbGF0ZSgmenN0cmVhbSwgWl9GSU5JU0gpKSkgewotCQkJaWYgKG5vdGlmeSkKLQkJCQlub3RpZnkoWkxJQl9FUlJPUiwKLQkJCQkgICAgICAgImluZmxhdGUgcmV0dXJucyAlZCIsIHgpOwotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCX0KLQkgIGNsZWFudXA6Ci0JCWlmIChaX09LICE9ICh4ID0gaW5mbGF0ZUVuZCgmenN0cmVhbSkpKSB7Ci0JCQlpZiAobm90aWZ5KQotCQkJCW5vdGlmeSAoWkxJQl9FUlJPUiwKLQkJCQkJImluZmxhdGVFbmQgcmV0dXJucyAlZCIsIHgpOwotCQkJcmVzdWx0ID0gRkFMU0U7Ci0JCX0KLQl9IGVsc2UgaWYgKG1ldGhvZCA9PSAwKSB7Ci0JCW1lbWNweShkc3QsIHNyYywgdW5jb21wX3NpemUpOwotCQlyZXN1bHQgPSBUUlVFOwotCX0gZWxzZQotCQlyZXN1bHQgPSBGQUxTRTsKLQlVbm1hcFZpZXdPZkZpbGUoZHN0KTsKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICByZXN1bHQgPSBUUlVFOworICAgICAgICBpZiAoWl9PSyAhPSAoeCA9IGluZmxhdGVJbml0MigmenN0cmVhbSwgLTE1KSkpIHsKKyAgICAgICAgICAgIGlmIChub3RpZnkpCisgICAgICAgICAgICAgICAgbm90aWZ5KFpMSUJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlSW5pdDIgcmV0dXJucyAlZCIsIHgpOworICAgICAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFpfU1RSRUFNX0VORCAhPSAoeCA9IGluZmxhdGUoJnpzdHJlYW0sIFpfRklOSVNIKSkpIHsKKyAgICAgICAgICAgIGlmIChub3RpZnkpCisgICAgICAgICAgICAgICAgbm90aWZ5KFpMSUJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlIHJldHVybnMgJWQiLCB4KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICB9CisgICAgICBjbGVhbnVwOgorICAgICAgICBpZiAoWl9PSyAhPSAoeCA9IGluZmxhdGVFbmQoJnpzdHJlYW0pKSkgeworICAgICAgICAgICAgaWYgKG5vdGlmeSkKKyAgICAgICAgICAgICAgICBub3RpZnkgKFpMSUJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlRW5kIHJldHVybnMgJWQiLCB4KTsKKyAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtZXRob2QgPT0gMCkgeworICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHVuY29tcF9zaXplKTsKKyAgICAgICAgcmVzdWx0ID0gVFJVRTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmVzdWx0ID0gRkFMU0U7CisgICAgVW5tYXBWaWV3T2ZGaWxlKGRzdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogT3BlbiBhIHppcC1jb21wYXRpYmxlIGFyY2hpdmUgYW5kIGV4dHJhY3QgYWxsIGZpbGVzCkBAIC0yMDEsMTIxICsyMDEsMTIxIEBACiAgKi8KIEJPT0wKIHVuemlwX2FyY2hpdmUoU0NIRU1FICpzY2hlbWUsIGNoYXIgKmRpcm5hbWUsIGNoYXIgKmRhdGEsIERXT1JEIHNpemUsCi0JICAgICAgTk9USUZZUFJPQyBub3RpZnkpCisgICAgICAgICAgICAgIE5PVElGWVBST0Mgbm90aWZ5KQogewotCWludCBuOwotCWNoYXIgcGF0aG5hbWVbTUFYX1BBVEhdOwotCWNoYXIgKm5ld19wYXJ0OworICAgIGludCBuOworICAgIGNoYXIgcGF0aG5hbWVbTUFYX1BBVEhdOworICAgIGNoYXIgKm5ld19wYXJ0OwogCi0JLyogcmVhZCB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCAqLwotCXN0cnVjdCBlb2ZfY2RpciAqcGUgPSAoc3RydWN0IGVvZl9jZGlyICopJmRhdGFbc2l6ZSAtIHNpemVvZgotCQkJCQkJICAgICAgIChzdHJ1Y3QgZW9mX2NkaXIpXTsKKyAgICAvKiByZWFkIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICovCisgICAgc3RydWN0IGVvZl9jZGlyICpwZSA9IChzdHJ1Y3QgZW9mX2NkaXIgKikmZGF0YVtzaXplIC0gc2l6ZW9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGVvZl9jZGlyKV07CiAKLQlpbnQgYXJjX3N0YXJ0ID0gc2l6ZSAtIHNpemVvZiAoc3RydWN0IGVvZl9jZGlyKSAtIHBlLT5uQnl0ZXNDRGlyIC0KLQkJcGUtPm9mc0NEaXI7CisgICAgaW50IGFyY19zdGFydCA9IHNpemUgLSBzaXplb2YgKHN0cnVjdCBlb2ZfY2RpcikgLSBwZS0+bkJ5dGVzQ0RpciAtCisgICAgICAgIHBlLT5vZnNDRGlyOwogCi0JLyogc2V0IHBvc2l0aW9uIHRvIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5ICovCi0JaW50IHBvcyA9IGFyY19zdGFydCArIHBlLT5vZnNDRGlyOworICAgIC8qIHNldCBwb3NpdGlvbiB0byBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeSAqLworICAgIGludCBwb3MgPSBhcmNfc3RhcnQgKyBwZS0+b2ZzQ0RpcjsKIAotCS8qIG1ha2Ugc3VyZSB0aGlzIGlzIGEgemlwIGZpbGUgKi8KLQlpZiAocGUtPnRhZyAhPSAweDA2MDU0YjUwKQotCQlyZXR1cm4gRkFMU0U7Ci0gICAgCi0JLyogTG9vcCB0aHJvdWdoIHRoZSBjZW50cmFsIGRpcmVjdG9yeSwgcmVhZGluZyBhbGwgZW50cmllcyAqLwotCWZvciAobiA9IDA7IG4gPCBwZS0+blRvdGFsQ0RpcjsgKytuKSB7Ci0JCWludCBpOwotCQljaGFyICpmbmFtZTsKLQkJY2hhciAqcGNvbXA7Ci0JCWNoYXIgKmRzdDsKLQkJc3RydWN0IGNkaXIgKnBjZGlyOwotCQlzdHJ1Y3QgZmhkciAqcGZoZHI7CisgICAgLyogbWFrZSBzdXJlIHRoaXMgaXMgYSB6aXAgZmlsZSAqLworICAgIGlmIChwZS0+dGFnICE9IDB4MDYwNTRiNTApCisgICAgICAgIHJldHVybiBGQUxTRTsKIAotCQlwY2RpciA9IChzdHJ1Y3QgY2RpciAqKSZkYXRhW3Bvc107Ci0JCXBmaGRyID0gKHN0cnVjdCBmaGRyICopJmRhdGFbcGNkaXItPm9mc19sb2NhbF9oZWFkZXIgKwotCQkJCQkgICAgIGFyY19zdGFydF07CisgICAgLyogTG9vcCB0aHJvdWdoIHRoZSBjZW50cmFsIGRpcmVjdG9yeSwgcmVhZGluZyBhbGwgZW50cmllcyAqLworICAgIGZvciAobiA9IDA7IG4gPCBwZS0+blRvdGFsQ0RpcjsgKytuKSB7CisgICAgICAgIGludCBpOworICAgICAgICBjaGFyICpmbmFtZTsKKyAgICAgICAgY2hhciAqcGNvbXA7CisgICAgICAgIGNoYXIgKmRzdDsKKyAgICAgICAgc3RydWN0IGNkaXIgKnBjZGlyOworICAgICAgICBzdHJ1Y3QgZmhkciAqcGZoZHI7CiAKLQkJaWYgKHBjZGlyLT50YWcgIT0gMHgwMjAxNGI1MCkKLQkJCXJldHVybiBGQUxTRTsKLQkJaWYgKHBmaGRyLT50YWcgIT0gMHgwNDAzNGI1MCkKLQkJCXJldHVybiBGQUxTRTsKLQkJcG9zICs9IHNpemVvZihzdHJ1Y3QgY2Rpcik7Ci0JCWZuYW1lID0gKGNoYXIgKikmZGF0YVtwb3NdOyAvKiBUaGlzIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQhICovCi0JCXBvcyArPSBwY2Rpci0+Zm5hbWVfbGVuZ3RoICsgcGNkaXItPmV4dHJhX2xlbmd0aCArCi0JCQlwY2Rpci0+Y29tbWVudF9sZW5ndGg7CisgICAgICAgIHBjZGlyID0gKHN0cnVjdCBjZGlyICopJmRhdGFbcG9zXTsKKyAgICAgICAgcGZoZHIgPSAoc3RydWN0IGZoZHIgKikmZGF0YVtwY2Rpci0+b2ZzX2xvY2FsX2hlYWRlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjX3N0YXJ0XTsKIAotCQlwY29tcCA9ICZkYXRhW3BjZGlyLT5vZnNfbG9jYWxfaGVhZGVyCi0JCQkgICAgICArIHNpemVvZihzdHJ1Y3QgZmhkcikKLQkJCSAgICAgICsgYXJjX3N0YXJ0Ci0JCQkgICAgICArIHBmaGRyLT5mbmFtZV9sZW5ndGgKLQkJCSAgICAgICsgcGZoZHItPmV4dHJhX2xlbmd0aF07CisgICAgICAgIGlmIChwY2Rpci0+dGFnICE9IDB4MDIwMTRiNTApCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmIChwZmhkci0+dGFnICE9IDB4MDQwMzRiNTApCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHBvcyArPSBzaXplb2Yoc3RydWN0IGNkaXIpOworICAgICAgICBmbmFtZSA9IChjaGFyICopJmRhdGFbcG9zXTsgLyogVGhpcyBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkISAqLworICAgICAgICBwb3MgKz0gcGNkaXItPmZuYW1lX2xlbmd0aCArIHBjZGlyLT5leHRyYV9sZW5ndGggKworICAgICAgICAgICAgcGNkaXItPmNvbW1lbnRfbGVuZ3RoOwogCi0JCS8qIGRpcm5hbWUgaXMgdGhlIFB5dGhvbiBob21lIGRpcmVjdG9yeSAocHJlZml4KSAqLwotCQlzdHJjcHkocGF0aG5hbWUsIGRpcm5hbWUpOwotCQlpZiAocGF0aG5hbWVbc3RybGVuKHBhdGhuYW1lKS0xXSAhPSAnXFwnKQotCQkJc3RyY2F0KHBhdGhuYW1lLCAiXFwiKTsKLQkJbmV3X3BhcnQgPSAmcGF0aG5hbWVbbHN0cmxlbihwYXRobmFtZSldOwotCQkvKiB3ZSBtdXN0IG5vdyBtYXRjaCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcGF0aG5hbWUKLQkJICogaW4gdGhlIGFyY2hpdmUgdG8gYSBjb21wb25lbnQgaW4gdGhlIGluc3RhbGxhdGlvbgotCQkgKiBzY2hlbWUgKFBVUkVMSUIsIFBMQVRMSUIsIEhFQURFUlMsIFNDUklQVFMsIG9yIERBVEEpCi0JCSAqIGFuZCByZXBsYWNlIHRoaXMgcGFydCBieSB0aGUgb25lIGluIHRoZSBzY2hlbWUgdG8gdXNlCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBzY2hlbWVbaV0ubmFtZTsgKytpKSB7Ci0JCQlpZiAoMCA9PSBzdHJuaWNtcChzY2hlbWVbaV0ubmFtZSwgZm5hbWUsCi0JCQkJCSAgc3RybGVuKHNjaGVtZVtpXS5uYW1lKSkpIHsKLQkJCQljaGFyICpyZXN0OwotCQkJCWludCBsZW47Ci0JCQkJCi0JCQkJLyogbGVuZ3RoIG9mIHRoZSByZXBsYWNlZCBwYXJ0ICovCi0JCQkJaW50IG5hbWVsZW4gPSBzdHJsZW4oc2NoZW1lW2ldLm5hbWUpOwotCQkJCQotCQkJCXN0cmNhdChwYXRobmFtZSwgc2NoZW1lW2ldLnByZWZpeCk7Ci0JCQkJCi0JCQkJcmVzdCA9IGZuYW1lICsgbmFtZWxlbjsKLQkJCQlsZW4gPSBwZmhkci0+Zm5hbWVfbGVuZ3RoIC0gbmFtZWxlbjsKLQkJCQkKLQkJCQlpZiAoKHBhdGhuYW1lW3N0cmxlbihwYXRobmFtZSktMV0gIT0gJ1xcJykKLQkJCQkgICAgJiYgKHBhdGhuYW1lW3N0cmxlbihwYXRobmFtZSktMV0gIT0gJy8nKSkKLQkJCQkJc3RyY2F0KHBhdGhuYW1lLCAiXFwiKTsKLQkJCQkvKiBOb3cgdGhhdCBwYXRobmFtZSBlbmRzIHdpdGggYSBzZXBhcmF0b3IsCi0JCQkJICogd2UgbXVzdCBtYWtlIHN1cmUgcmVzdCBkb2VzIG5vdCBzdGFydCB3aXRoCi0JCQkJICogYW4gYWRkaXRpb25hbCBvbmUuCi0JCQkJICovCi0JCQkJaWYgKChyZXN0WzBdID09ICdcXCcpIHx8IChyZXN0WzBdID09ICcvJykpIHsKLQkJCQkJKytyZXN0OwotCQkJCQktLWxlbjsKLQkJCQl9CisgICAgICAgIHBjb21wID0gJmRhdGFbcGNkaXItPm9mc19sb2NhbF9oZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihzdHJ1Y3QgZmhkcikKKyAgICAgICAgICAgICAgICAgICAgICArIGFyY19zdGFydAorICAgICAgICAgICAgICAgICAgICAgICsgcGZoZHItPmZuYW1lX2xlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICsgcGZoZHItPmV4dHJhX2xlbmd0aF07CiAKLQkJCQlzdHJuY2F0KHBhdGhuYW1lLCByZXN0LCBsZW4pOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJfQotCQkvKiBubyBwcmVmaXggdG8gcmVwbGFjZSBmb3VuZCwgZ28gdW5jaGFuZ2VkICovCi0JCXN0cm5jYXQocGF0aG5hbWUsIGZuYW1lLCBwZmhkci0+Zm5hbWVfbGVuZ3RoKTsKLQkgIERvbmU6Ci0JCW5vcm1wYXRoKHBhdGhuYW1lKTsKLQkJaWYgKHBhdGhuYW1lW3N0cmxlbihwYXRobmFtZSktMV0gIT0gJ1xcJykgewotCQkJLyoKLQkJCSAqIFRoZSBsb2NhbCBmaWxlIGhlYWRlciAocGZoZHIpIGRvZXMgbm90IGFsd2F5cwotCQkJICogY29udGFpbiB0aGUgY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIHNpemVzIG9mCi0JCQkgKiB0aGUgZGF0YSBkZXBlbmRpbmcgb24gYml0IDMgb2YgdGhlIGZsYWdzIGZpZWxkLiAgU28KLQkJCSAqIGl0IHNlZW1zIGJldHRlciB0byB1c2UgdGhlIGRhdGEgZnJvbSB0aGUgY2VudHJhbAotCQkJICogZGlyZWN0b3J5IChwY2RpcikuCi0JCQkgKi8KLQkJCWRzdCA9IG1hcF9uZXdfZmlsZSgwLCBwYXRobmFtZSwgbmV3X3BhcnQsCi0JCQkJCSAgIHBjZGlyLT51bmNvbXBfc2l6ZSwKLQkJCQkJICAgcGNkaXItPmxhc3RfbW9kX2ZpbGVfZGF0ZSwKLQkJCQkJICAgcGNkaXItPmxhc3RfbW9kX2ZpbGVfdGltZSwgbm90aWZ5KTsKLQkJCWlmIChkc3QpIHsKLQkJCQlpZiAoIWV4dHJhY3RfZmlsZShkc3QsIHBjb21wLCBwZmhkci0+bWV0aG9kLAotCQkJCQkJICBwY2Rpci0+Y29tcF9zaXplLAotCQkJCQkJICBwY2Rpci0+dW5jb21wX3NpemUsCi0JCQkJCQkgIG5vdGlmeSkpCi0JCQkJCXJldHVybiBGQUxTRTsKLQkJCX0gLyogZWxzZSA/Pz8gKi8KLQkJfQotCQlpZiAobm90aWZ5KQotCQkJbm90aWZ5KE5VTV9GSUxFUywgbmV3X3BhcnQsIChpbnQpcGUtPm5Ub3RhbENEaXIsCi0JCQkgICAgICAgKGludCluKzEpOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgICAgICAgLyogZGlybmFtZSBpcyB0aGUgUHl0aG9uIGhvbWUgZGlyZWN0b3J5IChwcmVmaXgpICovCisgICAgICAgIHN0cmNweShwYXRobmFtZSwgZGlybmFtZSk7CisgICAgICAgIGlmIChwYXRobmFtZVtzdHJsZW4ocGF0aG5hbWUpLTFdICE9ICdcXCcpCisgICAgICAgICAgICBzdHJjYXQocGF0aG5hbWUsICJcXCIpOworICAgICAgICBuZXdfcGFydCA9ICZwYXRobmFtZVtsc3RybGVuKHBhdGhuYW1lKV07CisgICAgICAgIC8qIHdlIG11c3Qgbm93IG1hdGNoIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwYXRobmFtZQorICAgICAgICAgKiBpbiB0aGUgYXJjaGl2ZSB0byBhIGNvbXBvbmVudCBpbiB0aGUgaW5zdGFsbGF0aW9uCisgICAgICAgICAqIHNjaGVtZSAoUFVSRUxJQiwgUExBVExJQiwgSEVBREVSUywgU0NSSVBUUywgb3IgREFUQSkKKyAgICAgICAgICogYW5kIHJlcGxhY2UgdGhpcyBwYXJ0IGJ5IHRoZSBvbmUgaW4gdGhlIHNjaGVtZSB0byB1c2UKKyAgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IHNjaGVtZVtpXS5uYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmICgwID09IHN0cm5pY21wKHNjaGVtZVtpXS5uYW1lLCBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihzY2hlbWVbaV0ubmFtZSkpKSB7CisgICAgICAgICAgICAgICAgY2hhciAqcmVzdDsKKyAgICAgICAgICAgICAgICBpbnQgbGVuOworCisgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIHRoZSByZXBsYWNlZCBwYXJ0ICovCisgICAgICAgICAgICAgICAgaW50IG5hbWVsZW4gPSBzdHJsZW4oc2NoZW1lW2ldLm5hbWUpOworCisgICAgICAgICAgICAgICAgc3RyY2F0KHBhdGhuYW1lLCBzY2hlbWVbaV0ucHJlZml4KTsKKworICAgICAgICAgICAgICAgIHJlc3QgPSBmbmFtZSArIG5hbWVsZW47CisgICAgICAgICAgICAgICAgbGVuID0gcGZoZHItPmZuYW1lX2xlbmd0aCAtIG5hbWVsZW47CisKKyAgICAgICAgICAgICAgICBpZiAoKHBhdGhuYW1lW3N0cmxlbihwYXRobmFtZSktMV0gIT0gJ1xcJykKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGhuYW1lW3N0cmxlbihwYXRobmFtZSktMV0gIT0gJy8nKSkKKyAgICAgICAgICAgICAgICAgICAgc3RyY2F0KHBhdGhuYW1lLCAiXFwiKTsKKyAgICAgICAgICAgICAgICAvKiBOb3cgdGhhdCBwYXRobmFtZSBlbmRzIHdpdGggYSBzZXBhcmF0b3IsCisgICAgICAgICAgICAgICAgICogd2UgbXVzdCBtYWtlIHN1cmUgcmVzdCBkb2VzIG5vdCBzdGFydCB3aXRoCisgICAgICAgICAgICAgICAgICogYW4gYWRkaXRpb25hbCBvbmUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKChyZXN0WzBdID09ICdcXCcpIHx8IChyZXN0WzBdID09ICcvJykpIHsKKyAgICAgICAgICAgICAgICAgICAgKytyZXN0OworICAgICAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdHJuY2F0KHBhdGhuYW1lLCByZXN0LCBsZW4pOworICAgICAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBubyBwcmVmaXggdG8gcmVwbGFjZSBmb3VuZCwgZ28gdW5jaGFuZ2VkICovCisgICAgICAgIHN0cm5jYXQocGF0aG5hbWUsIGZuYW1lLCBwZmhkci0+Zm5hbWVfbGVuZ3RoKTsKKyAgICAgIERvbmU6CisgICAgICAgIG5vcm1wYXRoKHBhdGhuYW1lKTsKKyAgICAgICAgaWYgKHBhdGhuYW1lW3N0cmxlbihwYXRobmFtZSktMV0gIT0gJ1xcJykgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBsb2NhbCBmaWxlIGhlYWRlciAocGZoZHIpIGRvZXMgbm90IGFsd2F5cworICAgICAgICAgICAgICogY29udGFpbiB0aGUgY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkIHNpemVzIG9mCisgICAgICAgICAgICAgKiB0aGUgZGF0YSBkZXBlbmRpbmcgb24gYml0IDMgb2YgdGhlIGZsYWdzIGZpZWxkLiAgU28KKyAgICAgICAgICAgICAqIGl0IHNlZW1zIGJldHRlciB0byB1c2UgdGhlIGRhdGEgZnJvbSB0aGUgY2VudHJhbAorICAgICAgICAgICAgICogZGlyZWN0b3J5IChwY2RpcikuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGRzdCA9IG1hcF9uZXdfZmlsZSgwLCBwYXRobmFtZSwgbmV3X3BhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNkaXItPnVuY29tcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjZGlyLT5sYXN0X21vZF9maWxlX2RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNkaXItPmxhc3RfbW9kX2ZpbGVfdGltZSwgbm90aWZ5KTsKKyAgICAgICAgICAgIGlmIChkc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWV4dHJhY3RfZmlsZShkc3QsIHBjb21wLCBwZmhkci0+bWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjZGlyLT5jb21wX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNkaXItPnVuY29tcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0gLyogZWxzZSA/Pz8gKi8KKyAgICAgICAgfQorICAgICAgICBpZiAobm90aWZ5KQorICAgICAgICAgICAgbm90aWZ5KE5VTV9GSUxFUywgbmV3X3BhcnQsIChpbnQpcGUtPm5Ub3RhbENEaXIsCisgICAgICAgICAgICAgICAgICAgKGludCluKzEpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jIGIvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKaW5kZXggYWU4ZDBkYi4uZDU0NzJlZiAxMDA2NDQKLS0tIGEvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKKysrIGIvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKQEAgLTIwLDIxICsyMCwyMSBAQAogICoKICAqIEF0IHJ1bnRpbWUsIHRoZSBleGVmaWxlIGhhcyBhcHBlbmRlZDoKICAqIC0gY29tcHJlc3NlZCBzZXR1cC1kYXRhIGluIGluaS1mb3JtYXQsIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBzZWN0aW9uczoKLSAqCVttZXRhZGF0YV0KLSAqCWF1dGhvcj1HcmVnIFdhcmQKLSAqCWF1dGhvcl9lbWFpbD1nd2FyZEBweXRob24ubmV0Ci0gKglkZXNjcmlwdGlvbj1QeXRob24gRGlzdHJpYnV0aW9uIFV0aWxpdGllcwotICoJbGljZW5jZT1QeXRob24KLSAqCW5hbWU9RGlzdHV0aWxzCi0gKgl1cmw9aHR0cDovL3d3dy5weXRob24ub3JnL3NpZ3MvZGlzdHV0aWxzLXNpZy8KLSAqCXZlcnNpb249MC45cHJlCisgKiAgICAgIFttZXRhZGF0YV0KKyAqICAgICAgYXV0aG9yPUdyZWcgV2FyZAorICogICAgICBhdXRob3JfZW1haWw9Z3dhcmRAcHl0aG9uLm5ldAorICogICAgICBkZXNjcmlwdGlvbj1QeXRob24gRGlzdHJpYnV0aW9uIFV0aWxpdGllcworICogICAgICBsaWNlbmNlPVB5dGhvbgorICogICAgICBuYW1lPURpc3R1dGlscworICogICAgICB1cmw9aHR0cDovL3d3dy5weXRob24ub3JnL3NpZ3MvZGlzdHV0aWxzLXNpZy8KKyAqICAgICAgdmVyc2lvbj0wLjlwcmUKICAqCi0gKglbU2V0dXBdCi0gKglpbmZvPSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZWRpdC1ib3gKLSAqCXRpdGxlPSB0byBiZSBkaXNwbGF5ZWQgYnkgdGhpcyBwcm9ncmFtCi0gKgl0YXJnZXRfdmVyc2lvbiA9IGlmIHByZXNlbnQsIHB5dGhvbiB2ZXJzaW9uIHJlcXVpcmVkCi0gKglweWNfY29tcGlsZSA9IGlmIDAsIGRvIG5vdCBjb21waWxlIHB5IHRvIHB5YwotICoJcHlvX2NvbXBpbGUgPSBpZiAwLCBkbyBub3QgY29tcGlsZSBweSB0byBweW8KKyAqICAgICAgW1NldHVwXQorICogICAgICBpbmZvPSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgZWRpdC1ib3gKKyAqICAgICAgdGl0bGU9IHRvIGJlIGRpc3BsYXllZCBieSB0aGlzIHByb2dyYW0KKyAqICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBpZiBwcmVzZW50LCBweXRob24gdmVyc2lvbiByZXF1aXJlZAorICogICAgICBweWNfY29tcGlsZSA9IGlmIDAsIGRvIG5vdCBjb21waWxlIHB5IHRvIHB5YworICogICAgICBweW9fY29tcGlsZSA9IGlmIDAsIGRvIG5vdCBjb21waWxlIHB5IHRvIHB5bwogICoKICAqIC0gYSBzdHJ1Y3QgbWV0YV9kYXRhX2hkciwgZGVzY3JpYmluZyB0aGUgYWJvdmUKICAqIC0gYSB6aXAtZmlsZSwgY29udGFpbmluZyB0aGUgbW9kdWxlcyB0byBiZSBpbnN0YWxsZWQuCkBAIC0xMTgsMjggKzExOCwyOCBAQAogSFdORCBod25kTWFpbjsKIEhXTkQgaERpYWxvZzsKIAotY2hhciAqaW5pX2ZpbGU7CQkJLyogRnVsbCBwYXRobmFtZSBvZiBpbmktZmlsZSAqLworY2hhciAqaW5pX2ZpbGU7ICAgICAgICAgICAgICAgICAvKiBGdWxsIHBhdGhuYW1lIG9mIGluaS1maWxlICovCiAvKiBGcm9tIGluaS1maWxlICovCi1jaGFyIGluZm9bNDA5Nl07CQkvKiBbU2V0dXBdIGluZm89ICovCi1jaGFyIHRpdGxlWzgwXTsJCQkvKiBbU2V0dXBdIHRpdGxlPSwgY29udGFpbnMgcGFja2FnZSBuYW1lCi0JCQkJICAgaW5jbHVkaW5nIHZlcnNpb246ICJEaXN0dXRpbHMtMS4wLjEiICovCi1jaGFyIHRhcmdldF92ZXJzaW9uWzEwXTsJLyogW1NldHVwXSB0YXJnZXRfdmVyc2lvbj0sIHJlcXVpcmVkIHB5dGhvbgotCQkJCSAgIHZlcnNpb24gb3IgZW1wdHkgc3RyaW5nICovCi1jaGFyIGJ1aWxkX2luZm9bODBdOwkJLyogW1NldHVwXSBidWlsZF9pbmZvPSwgZGlzdHV0aWxzIHZlcnNpb24KLQkJCQkgICBhbmQgYnVpbGQgZGF0ZSAqLworY2hhciBpbmZvWzQwOTZdOyAgICAgICAgICAgICAgICAvKiBbU2V0dXBdIGluZm89ICovCitjaGFyIHRpdGxlWzgwXTsgICAgICAgICAgICAgICAgIC8qIFtTZXR1cF0gdGl0bGU9LCBjb250YWlucyBwYWNrYWdlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHZlcnNpb246ICJEaXN0dXRpbHMtMS4wLjEiICovCitjaGFyIHRhcmdldF92ZXJzaW9uWzEwXTsgICAgICAgIC8qIFtTZXR1cF0gdGFyZ2V0X3ZlcnNpb249LCByZXF1aXJlZCBweXRob24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBvciBlbXB0eSBzdHJpbmcgKi8KK2NoYXIgYnVpbGRfaW5mb1s4MF07ICAgICAgICAgICAgLyogW1NldHVwXSBidWlsZF9pbmZvPSwgZGlzdHV0aWxzIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGJ1aWxkIGRhdGUgKi8KIAotY2hhciBtZXRhX25hbWVbODBdOwkJLyogcGFja2FnZSBuYW1lIHdpdGhvdXQgdmVyc2lvbiBsaWtlCi0JCQkJICAgJ0Rpc3R1dGlscycgKi8KK2NoYXIgbWV0YV9uYW1lWzgwXTsgICAgICAgICAgICAgLyogcGFja2FnZSBuYW1lIHdpdGhvdXQgdmVyc2lvbiBsaWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEaXN0dXRpbHMnICovCiBjaGFyIGluc3RhbGxfc2NyaXB0W01BWF9QQVRIXTsKIGNoYXIgKnByZV9pbnN0YWxsX3NjcmlwdDsgLyogcnVuIGJlZm9yZSB3ZSBpbnN0YWxsIGEgc2luZ2xlIGZpbGUgKi8KIAogY2hhciB1c2VyX2FjY2Vzc19jb250cm9sWzEwXTsgLy8gb25lIG9mICdhdXRvJywgJ2ZvcmNlJywgb3RoZXJ3aXNlIG5vbmUuCiAKLWludCBweV9tYWpvciwgcHlfbWlub3I7CQkvKiBQeXRob24gdmVyc2lvbiBzZWxlY3RlZCBmb3IgaW5zdGFsbGF0aW9uICovCitpbnQgcHlfbWFqb3IsIHB5X21pbm9yOyAgICAgICAgIC8qIFB5dGhvbiB2ZXJzaW9uIHNlbGVjdGVkIGZvciBpbnN0YWxsYXRpb24gKi8KIAotY2hhciAqYXJjX2RhdGE7CQkJLyogbWVtb3J5IG1hcHBlZCBhcmNoaXZlICovCi1EV09SRCBhcmNfc2l6ZTsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gYXJjaGl2ZSAqLwotaW50IGV4ZV9zaXplOwkJCS8qIG51bWJlciBvZiBieXRlcyBmb3IgZXhlLWZpbGUgcG9ydGlvbiAqLworY2hhciAqYXJjX2RhdGE7ICAgICAgICAgICAgICAgICAvKiBtZW1vcnkgbWFwcGVkIGFyY2hpdmUgKi8KK0RXT1JEIGFyY19zaXplOyAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIGluIGFyY2hpdmUgKi8KK2ludCBleGVfc2l6ZTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIGZvciBleGUtZmlsZSBwb3J0aW9uICovCiBjaGFyIHB5dGhvbl9kaXJbTUFYX1BBVEhdOwogY2hhciBweXRob25kbGxbTUFYX1BBVEhdOwogQk9PTCBweWNfY29tcGlsZSwgcHlvX2NvbXBpbGU7CkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgIHRoZSBwZXJtaXNzaW9ucyBvZiB0aGUgY3VycmVudCB1c2VyLiAqLwogSEtFWSBoa2V5X3Jvb3QgPSAoSEtFWSktMTsKIAotQk9PTCBzdWNjZXNzOwkJCS8qIEluc3RhbGxhdGlvbiBzdWNjZXNzZnVsbD8gKi8KK0JPT0wgc3VjY2VzczsgICAgICAgICAgICAgICAgICAgLyogSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWxsPyAqLwogY2hhciAqZmFpbHVyZV9yZWFzb24gPSBOVUxMOwogCiBIQU5ETEUgaEJpdG1hcDsKQEAgLTE2NSwxMjggKzE2NSwxMjggQEAKIC8qIE5vdGU6IElmIHNjaGVtZS5wcmVmaXggaXMgbm9uZW1wdHksIGl0IG11c3QgZW5kIHdpdGggYSAnXCchICovCiAvKiBOb3RlOiBwdXJlbGliIG11c3QgYmUgdGhlIEZJUlNUIGVudHJ5ISAqLwogU0NIRU1FIG9sZF9zY2hlbWVbXSA9IHsKLQl7ICJQVVJFTElCIiwgIiIgfSwKLQl7ICJQTEFUTElCIiwgIiIgfSwKLQl7ICJIRUFERVJTIiwgIiIgfSwgLyogJ0luY2x1ZGUvZGlzdF9uYW1lJyBwYXJ0IGFscmVhZHkgaW4gYXJjaGl2ZSAqLwotCXsgIlNDUklQVFMiLCAiU2NyaXB0c1xcIiB9LAotCXsgIkRBVEEiLCAiIiB9LAotCXsgTlVMTCwgTlVMTCB9LAorICAgIHsgIlBVUkVMSUIiLCAiIiB9LAorICAgIHsgIlBMQVRMSUIiLCAiIiB9LAorICAgIHsgIkhFQURFUlMiLCAiIiB9LCAvKiAnSW5jbHVkZS9kaXN0X25hbWUnIHBhcnQgYWxyZWFkeSBpbiBhcmNoaXZlICovCisgICAgeyAiU0NSSVBUUyIsICJTY3JpcHRzXFwiIH0sCisgICAgeyAiREFUQSIsICIiIH0sCisgICAgeyBOVUxMLCBOVUxMIH0sCiB9OwogCiBTQ0hFTUUgbmV3X3NjaGVtZVtdID0gewotCXsgIlBVUkVMSUIiLCAiTGliXFxzaXRlLXBhY2thZ2VzXFwiIH0sCi0JeyAiUExBVExJQiIsICJMaWJcXHNpdGUtcGFja2FnZXNcXCIgfSwKLQl7ICJIRUFERVJTIiwgIiIgfSwgLyogJ0luY2x1ZGUvZGlzdF9uYW1lJyBwYXJ0IGFscmVhZHkgaW4gYXJjaGl2ZSAqLwotCXsgIlNDUklQVFMiLCAiU2NyaXB0c1xcIiB9LAotCXsgIkRBVEEiLCAiIiB9LAotCXsgTlVMTCwgTlVMTCB9LAorICAgIHsgIlBVUkVMSUIiLCAiTGliXFxzaXRlLXBhY2thZ2VzXFwiIH0sCisgICAgeyAiUExBVExJQiIsICJMaWJcXHNpdGUtcGFja2FnZXNcXCIgfSwKKyAgICB7ICJIRUFERVJTIiwgIiIgfSwgLyogJ0luY2x1ZGUvZGlzdF9uYW1lJyBwYXJ0IGFscmVhZHkgaW4gYXJjaGl2ZSAqLworICAgIHsgIlNDUklQVFMiLCAiU2NyaXB0c1xcIiB9LAorICAgIHsgIkRBVEEiLCAiIiB9LAorICAgIHsgTlVMTCwgTlVMTCB9LAogfTsKIAogc3RhdGljIHZvaWQgdW5lc2NhcGUoY2hhciAqZHN0LCBjaGFyICpzcmMsIHVuc2lnbmVkIHNpemUpCiB7Ci0JY2hhciAqZW9uOwotCWNoYXIgY2g7CisgICAgY2hhciAqZW9uOworICAgIGNoYXIgY2g7CiAKLQl3aGlsZSAoc3JjICYmICpzcmMgJiYgKHNpemUgPiAyKSkgewotCQlpZiAoKnNyYyA9PSAnXFwnKSB7Ci0JCQlzd2l0Y2ggKCorK3NyYykgewotCQkJY2FzZSAnbic6Ci0JCQkJKytzcmM7Ci0JCQkJKmRzdCsrID0gJ1xyJzsKLQkJCQkqZHN0KysgPSAnXG4nOwotCQkJCXNpemUgLT0gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ3InOgotCQkJCSsrc3JjOwotCQkJCSpkc3QrKyA9ICdccic7Ci0JCQkJLS1zaXplOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6Ci0JCQkJY2ggPSAoY2hhcilzdHJ0b2woc3JjLCAmZW9uLCA4KTsKLQkJCQlpZiAoY2ggPT0gJ1xuJykgewotCQkJCQkqZHN0KysgPSAnXHInOwotCQkJCQktLXNpemU7Ci0JCQkJfQotCQkJCSpkc3QrKyA9IGNoOwotCQkJCS0tc2l6ZTsKLQkJCQlzcmMgPSBlb247Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkqZHN0KysgPSAqc3JjKys7Ci0JCQktLXNpemU7Ci0JCX0KLQl9Ci0JKmRzdCA9ICdcMCc7CisgICAgd2hpbGUgKHNyYyAmJiAqc3JjICYmIChzaXplID4gMikpIHsKKyAgICAgICAgaWYgKCpzcmMgPT0gJ1xcJykgeworICAgICAgICAgICAgc3dpdGNoICgqKytzcmMpIHsKKyAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgICsrc3JjOworICAgICAgICAgICAgICAgICpkc3QrKyA9ICdccic7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gJ1xuJzsKKyAgICAgICAgICAgICAgICBzaXplIC09IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICArK3NyYzsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSAnXHInOworICAgICAgICAgICAgICAgIC0tc2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOgorICAgICAgICAgICAgICAgIGNoID0gKGNoYXIpc3RydG9sKHNyYywgJmVvbiwgOCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gJ1xyJzsKKyAgICAgICAgICAgICAgICAgICAgLS1zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqZHN0KysgPSBjaDsKKyAgICAgICAgICAgICAgICAtLXNpemU7CisgICAgICAgICAgICAgICAgc3JjID0gZW9uOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICAgICAgLS1zaXplOworICAgICAgICB9CisgICAgfQorICAgICpkc3QgPSAnXDAnOwogfQogCiBzdGF0aWMgc3RydWN0IHRhZ0ZpbGUgewotCWNoYXIgKnBhdGg7Ci0Jc3RydWN0IHRhZ0ZpbGUgKm5leHQ7CisgICAgY2hhciAqcGF0aDsKKyAgICBzdHJ1Y3QgdGFnRmlsZSAqbmV4dDsKIH0gKmZpbGVfbGlzdCA9IE5VTEw7CiAKIHN0YXRpYyB2b2lkIHNldF9mYWlsdXJlX3JlYXNvbihjaGFyICpyZWFzb24pCiB7CiAgICAgaWYgKGZhaWx1cmVfcmVhc29uKQotCWZyZWUoZmFpbHVyZV9yZWFzb24pOworICAgIGZyZWUoZmFpbHVyZV9yZWFzb24pOwogICAgIGZhaWx1cmVfcmVhc29uID0gc3RyZHVwKHJlYXNvbik7CiAgICAgc3VjY2VzcyA9IEZBTFNFOwogfQogc3RhdGljIGNoYXIgKmdldF9mYWlsdXJlX3JlYXNvbigpCiB7CiAgICAgaWYgKCFmYWlsdXJlX3JlYXNvbikKLQlyZXR1cm4gIkluc3RhbGxhdGlvbiBmYWlsZWQuIjsKKyAgICByZXR1cm4gIkluc3RhbGxhdGlvbiBmYWlsZWQuIjsKICAgICByZXR1cm4gZmFpbHVyZV9yZWFzb247CiB9CiAKIHN0YXRpYyB2b2lkIGFkZF90b19maWxlbGlzdChjaGFyICpwYXRoKQogewotCXN0cnVjdCB0YWdGaWxlICpwOwotCXAgPSAoc3RydWN0IHRhZ0ZpbGUgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB0YWdGaWxlKSk7Ci0JcC0+cGF0aCA9IHN0cmR1cChwYXRoKTsKLQlwLT5uZXh0ID0gZmlsZV9saXN0OwotCWZpbGVfbGlzdCA9IHA7CisgICAgc3RydWN0IHRhZ0ZpbGUgKnA7CisgICAgcCA9IChzdHJ1Y3QgdGFnRmlsZSAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRhZ0ZpbGUpKTsKKyAgICBwLT5wYXRoID0gc3RyZHVwKHBhdGgpOworICAgIHAtPm5leHQgPSBmaWxlX2xpc3Q7CisgICAgZmlsZV9saXN0ID0gcDsKIH0KIAogc3RhdGljIGludCBkb19jb21waWxlX2ZpbGVzKGludCAoX19jZGVjbCAqIFB5UnVuX1NpbXBsZVN0cmluZykoY2hhciAqKSwKLQkJCSAgICAgaW50IG9wdGltaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW1pemUpCiB7Ci0Jc3RydWN0IHRhZ0ZpbGUgKnA7Ci0JaW50IHRvdGFsLCBuOwotCWNoYXIgQnVmZmVyW01BWF9QQVRIICsgNjRdOwotCWludCBlcnJvcnMgPSAwOworICAgIHN0cnVjdCB0YWdGaWxlICpwOworICAgIGludCB0b3RhbCwgbjsKKyAgICBjaGFyIEJ1ZmZlcltNQVhfUEFUSCArIDY0XTsKKyAgICBpbnQgZXJyb3JzID0gMDsKIAotCXRvdGFsID0gMDsKLQlwID0gZmlsZV9saXN0OwotCXdoaWxlIChwKSB7Ci0JCSsrdG90YWw7Ci0JCXAgPSBwLT5uZXh0OwotCX0KLQlTZW5kRGxnSXRlbU1lc3NhZ2UoaERpYWxvZywgSURDX1BST0dSRVNTLCBQQk1fU0VUUkFOR0UsIDAsCi0JCQkgICAgTUFLRUxQQVJBTSgwLCB0b3RhbCkpOwotCVNlbmREbGdJdGVtTWVzc2FnZShoRGlhbG9nLCBJRENfUFJPR1JFU1MsIFBCTV9TRVRQT1MsIDAsIDApOworICAgIHRvdGFsID0gMDsKKyAgICBwID0gZmlsZV9saXN0OworICAgIHdoaWxlIChwKSB7CisgICAgICAgICsrdG90YWw7CisgICAgICAgIHAgPSBwLT5uZXh0OworICAgIH0KKyAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaERpYWxvZywgSURDX1BST0dSRVNTLCBQQk1fU0VUUkFOR0UsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBNQUtFTFBBUkFNKDAsIHRvdGFsKSk7CisgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGhEaWFsb2csIElEQ19QUk9HUkVTUywgUEJNX1NFVFBPUywgMCwgMCk7CiAKLQluID0gMDsKLQlwID0gZmlsZV9saXN0OwotCXdoaWxlIChwKSB7Ci0JCSsrbjsKLQkJd3NwcmludGYoQnVmZmVyLAotCQkJICAiaW1wb3J0IHB5X2NvbXBpbGU7IHB5X2NvbXBpbGUuY29tcGlsZSAociclcycpIiwKLQkJCSAgcC0+cGF0aCk7Ci0JCWlmIChQeVJ1bl9TaW1wbGVTdHJpbmcoQnVmZmVyKSkgewotCQkJKytlcnJvcnM7Ci0JCX0KLQkJLyogV2Ugc2VuZCB0aGUgbm90aWZpY2F0aW9uIGV2ZW4gaWYgdGhlIGZpbGVzIGNvdWxkIG5vdAotCQkgKiBiZSBjcmVhdGVkIHNvIHRoYXQgdGhlIHVuaW5zdGFsbGVyIHdpbGwgcmVtb3ZlIHRoZW0KLQkJICogaW4gY2FzZSB0aGV5IGFyZSBjcmVhdGVkIGxhdGVyLgotCQkgKi8KLQkJd3NwcmludGYoQnVmZmVyLCAiJXMlYyIsIHAtPnBhdGgsIG9wdGltaXplID8gJ28nIDogJ2MnKTsKLQkJbm90aWZ5KEZJTEVfQ1JFQVRFRCwgQnVmZmVyKTsKKyAgICBuID0gMDsKKyAgICBwID0gZmlsZV9saXN0OworICAgIHdoaWxlIChwKSB7CisgICAgICAgICsrbjsKKyAgICAgICAgd3NwcmludGYoQnVmZmVyLAorICAgICAgICAgICAgICAgICAgImltcG9ydCBweV9jb21waWxlOyBweV9jb21waWxlLmNvbXBpbGUgKHInJXMnKSIsCisgICAgICAgICAgICAgICAgICBwLT5wYXRoKTsKKyAgICAgICAgaWYgKFB5UnVuX1NpbXBsZVN0cmluZyhCdWZmZXIpKSB7CisgICAgICAgICAgICArK2Vycm9yczsKKyAgICAgICAgfQorICAgICAgICAvKiBXZSBzZW5kIHRoZSBub3RpZmljYXRpb24gZXZlbiBpZiB0aGUgZmlsZXMgY291bGQgbm90CisgICAgICAgICAqIGJlIGNyZWF0ZWQgc28gdGhhdCB0aGUgdW5pbnN0YWxsZXIgd2lsbCByZW1vdmUgdGhlbQorICAgICAgICAgKiBpbiBjYXNlIHRoZXkgYXJlIGNyZWF0ZWQgbGF0ZXIuCisgICAgICAgICAqLworICAgICAgICB3c3ByaW50ZihCdWZmZXIsICIlcyVjIiwgcC0+cGF0aCwgb3B0aW1pemUgPyAnbycgOiAnYycpOworICAgICAgICBub3RpZnkoRklMRV9DUkVBVEVELCBCdWZmZXIpOwogCi0JCVNlbmREbGdJdGVtTWVzc2FnZShoRGlhbG9nLCBJRENfUFJPR1JFU1MsIFBCTV9TRVRQT1MsIG4sIDApOwotCQlTZXREbGdJdGVtVGV4dChoRGlhbG9nLCBJRENfSU5GTywgcC0+cGF0aCk7Ci0JCXAgPSBwLT5uZXh0OwotCX0KLQlyZXR1cm4gZXJyb3JzOworICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaERpYWxvZywgSURDX1BST0dSRVNTLCBQQk1fU0VUUE9TLCBuLCAwKTsKKyAgICAgICAgU2V0RGxnSXRlbVRleHQoaERpYWxvZywgSURDX0lORk8sIHAtPnBhdGgpOworICAgICAgICBwID0gcC0+bmV4dDsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yczsKIH0KIAogI2RlZmluZSBERUNMUFJPQyhkbGwsIHJlc3VsdCwgbmFtZSwgYXJncylcCkBAIC0zMDYsNDcgKzMwNiw0NyBAQAogICovCiBzdGF0aWMgaW50IGNvbXBpbGVfZmlsZWxpc3QoSElOU1RBTkNFIGhQeXRob24sIEJPT0wgb3B0aW1pemVfZmxhZykKIHsKLQlERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9Jbml0aWFsaXplLCAodm9pZCkpOwotCURFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X1NldFByb2dyYW1OYW1lLCAoY2hhciAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfRmluYWxpemUsICh2b2lkKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVJ1bl9TaW1wbGVTdHJpbmcsIChjaGFyICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeVN5c19HZXRPYmplY3QsIChjaGFyICopKTsKLQlERUNMVkFSKGhQeXRob24sIGludCwgUHlfT3B0aW1pemVGbGFnKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9Jbml0aWFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X1NldFByb2dyYW1OYW1lLCAoY2hhciAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfRmluYWxpemUsICh2b2lkKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVJ1bl9TaW1wbGVTdHJpbmcsIChjaGFyICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeVN5c19HZXRPYmplY3QsIChjaGFyICopKTsKKyAgICBERUNMVkFSKGhQeXRob24sIGludCwgUHlfT3B0aW1pemVGbGFnKTsKIAotCWludCBlcnJvcnMgPSAwOwotCXN0cnVjdCB0YWdGaWxlICpwID0gZmlsZV9saXN0OworICAgIGludCBlcnJvcnMgPSAwOworICAgIHN0cnVjdCB0YWdGaWxlICpwID0gZmlsZV9saXN0OwogCi0JaWYgKCFwKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeV9TZXRQcm9ncmFtTmFtZSB8fCAhUHlfRmluYWxpemUpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5X1NldFByb2dyYW1OYW1lIHx8ICFQeV9GaW5hbGl6ZSkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JaWYgKCFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5U3lzX0dldE9iamVjdCB8fCAhUHlfT3B0aW1pemVGbGFnKQotCQlyZXR1cm4gLTE7CisgICAgaWYgKCFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5U3lzX0dldE9iamVjdCB8fCAhUHlfT3B0aW1pemVGbGFnKQorICAgICAgICByZXR1cm4gLTE7CiAKLQkqUHlfT3B0aW1pemVGbGFnID0gb3B0aW1pemVfZmxhZyA/IDEgOiAwOwotCVB5X1NldFByb2dyYW1OYW1lKG1vZHVsZW5hbWUpOwotCVB5X0luaXRpYWxpemUoKTsKKyAgICAqUHlfT3B0aW1pemVGbGFnID0gb3B0aW1pemVfZmxhZyA/IDEgOiAwOworICAgIFB5X1NldFByb2dyYW1OYW1lKG1vZHVsZW5hbWUpOworICAgIFB5X0luaXRpYWxpemUoKTsKIAotCWVycm9ycyArPSBkb19jb21waWxlX2ZpbGVzKFB5UnVuX1NpbXBsZVN0cmluZywgb3B0aW1pemVfZmxhZyk7Ci0JUHlfRmluYWxpemUoKTsKKyAgICBlcnJvcnMgKz0gZG9fY29tcGlsZV9maWxlcyhQeVJ1bl9TaW1wbGVTdHJpbmcsIG9wdGltaXplX2ZsYWcpOworICAgIFB5X0ZpbmFsaXplKCk7CiAKLQlyZXR1cm4gZXJyb3JzOworICAgIHJldHVybiBlcnJvcnM7CiB9CiAKIHR5cGVkZWYgUHlPYmplY3QgKigqUHlDRnVuY3Rpb24pKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogCiBzdHJ1Y3QgUHlNZXRob2REZWYgewotCWNoYXIJKm1sX25hbWU7Ci0JUHlDRnVuY3Rpb24gIG1sX21ldGg7Ci0JaW50CQkgbWxfZmxhZ3M7Ci0JY2hhcgkqbWxfZG9jOworICAgIGNoYXIgICAgICAgICptbF9uYW1lOworICAgIFB5Q0Z1bmN0aW9uICBtbF9tZXRoOworICAgIGludCAgICAgICAgICAgICAgICAgIG1sX2ZsYWdzOworICAgIGNoYXIgICAgICAgICptbF9kb2M7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgUHlNZXRob2REZWYgUHlNZXRob2REZWY7CiAKIC8vIFhYWCAtIGFsbCBvZiB0aGVzZSBhcmUgcG90ZW50aWFsbHkgZnJhZ2lsZSEgIFdlIGxvYWQgYW5kIHVubG9hZAotLy8gdGhlIFB5dGhvbiBETEwgbXVsdGlwbGUgdGltZXMgLSBzbyBzdG9yaW5nIGZ1bmN0aW9ucyBwb2ludGVycyAKKy8vIHRoZSBQeXRob24gRExMIG11bHRpcGxlIHRpbWVzIC0gc28gc3RvcmluZyBmdW5jdGlvbnMgcG9pbnRlcnMKIC8vIGlzIGRhbmdlcm91cyAoYWx0aG91Z2ggdGhpbmdzICpsb29rKiBPSyBhdCBwcmVzZW50KQogLy8gQmV0dGVyIG1pZ2h0IGJlIHRvIHJvbGwgcHJlcGFyZV9zY3JpcHRfZW52aXJvbm1lbnQoKSBpbnRvCiAvLyBMb2FkUHl0aG9uRGxsKCksIGFuZCBjcmVhdGUgYSBuZXcgVW5sb2FkUHl0aG9uRExMKCkgd2hpY2ggYWxzbwpAQCAtMzYzLDI0OSArMzYzLDI0OSBAQAogI2RlZmluZSBERUZfQ1NJREwobmFtZSkgeyBuYW1lLCAjbmFtZSB9CiAKIHN0cnVjdCB7Ci0JaW50IG5Gb2xkZXI7Ci0JY2hhciAqbmFtZTsKKyAgICBpbnQgbkZvbGRlcjsKKyAgICBjaGFyICpuYW1lOwogfSBjc2lkbF9uYW1lc1tdID0gewotCS8qIFN0YXJ0dXAgbWVudSBmb3IgYWxsIHVzZXJzLgotCSAgIE5UIG9ubHkgKi8KLQlERUZfQ1NJREwoQ1NJRExfQ09NTU9OX1NUQVJUTUVOVSksCi0JLyogU3RhcnR1cCBtZW51LiAqLwotCURFRl9DU0lETChDU0lETF9TVEFSVE1FTlUpLAorICAgIC8qIFN0YXJ0dXAgbWVudSBmb3IgYWxsIHVzZXJzLgorICAgICAgIE5UIG9ubHkgKi8KKyAgICBERUZfQ1NJREwoQ1NJRExfQ09NTU9OX1NUQVJUTUVOVSksCisgICAgLyogU3RhcnR1cCBtZW51LiAqLworICAgIERFRl9DU0lETChDU0lETF9TVEFSVE1FTlUpLAogCiAvKiAgICBERUZfQ1NJREwoQ1NJRExfQ09NTU9OX0FQUERBVEEpLCAqLwogLyogICAgREVGX0NTSURMKENTSURMX0xPQ0FMX0FQUERBVEEpLCAqLwotCS8qIFJlcG9zaXRvcnkgZm9yIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRhdGEuCi0JICAgTmVlZHMgSW50ZXJuZXQgRXhwbG9yZXIgNC4wICovCi0JREVGX0NTSURMKENTSURMX0FQUERBVEEpLAorICAgIC8qIFJlcG9zaXRvcnkgZm9yIGFwcGxpY2F0aW9uLXNwZWNpZmljIGRhdGEuCisgICAgICAgTmVlZHMgSW50ZXJuZXQgRXhwbG9yZXIgNC4wICovCisgICAgREVGX0NTSURMKENTSURMX0FQUERBVEEpLAogCi0JLyogVGhlIGRlc2t0b3AgZm9yIGFsbCB1c2Vycy4KLQkgICBOVCBvbmx5ICovCi0JREVGX0NTSURMKENTSURMX0NPTU1PTl9ERVNLVE9QRElSRUNUT1JZKSwKLQkvKiBUaGUgZGVza3RvcC4gKi8KLQlERUZfQ1NJREwoQ1NJRExfREVTS1RPUERJUkVDVE9SWSksCisgICAgLyogVGhlIGRlc2t0b3AgZm9yIGFsbCB1c2Vycy4KKyAgICAgICBOVCBvbmx5ICovCisgICAgREVGX0NTSURMKENTSURMX0NPTU1PTl9ERVNLVE9QRElSRUNUT1JZKSwKKyAgICAvKiBUaGUgZGVza3RvcC4gKi8KKyAgICBERUZfQ1NJREwoQ1NJRExfREVTS1RPUERJUkVDVE9SWSksCiAKLQkvKiBTdGFydHVwIGZvbGRlciBmb3IgYWxsIHVzZXJzLgotCSAgIE5UIG9ubHkgKi8KLQlERUZfQ1NJREwoQ1NJRExfQ09NTU9OX1NUQVJUVVApLAotCS8qIFN0YXJ0dXAgZm9sZGVyLiAqLwotCURFRl9DU0lETChDU0lETF9TVEFSVFVQKSwKKyAgICAvKiBTdGFydHVwIGZvbGRlciBmb3IgYWxsIHVzZXJzLgorICAgICAgIE5UIG9ubHkgKi8KKyAgICBERUZfQ1NJREwoQ1NJRExfQ09NTU9OX1NUQVJUVVApLAorICAgIC8qIFN0YXJ0dXAgZm9sZGVyLiAqLworICAgIERFRl9DU0lETChDU0lETF9TVEFSVFVQKSwKIAotCS8qIFByb2dyYW1zIGl0ZW0gaW4gdGhlIHN0YXJ0IG1lbnUgZm9yIGFsbCB1c2Vycy4KLQkgICBOVCBvbmx5ICovCi0JREVGX0NTSURMKENTSURMX0NPTU1PTl9QUk9HUkFNUyksCi0JLyogUHJvZ3JhbSBpdGVtIGluIHRoZSB1c2VyJ3Mgc3RhcnQgbWVudS4gKi8KLQlERUZfQ1NJREwoQ1NJRExfUFJPR1JBTVMpLAorICAgIC8qIFByb2dyYW1zIGl0ZW0gaW4gdGhlIHN0YXJ0IG1lbnUgZm9yIGFsbCB1c2Vycy4KKyAgICAgICBOVCBvbmx5ICovCisgICAgREVGX0NTSURMKENTSURMX0NPTU1PTl9QUk9HUkFNUyksCisgICAgLyogUHJvZ3JhbSBpdGVtIGluIHRoZSB1c2VyJ3Mgc3RhcnQgbWVudS4gKi8KKyAgICBERUZfQ1NJREwoQ1NJRExfUFJPR1JBTVMpLAogCiAvKiAgICBERUZfQ1NJREwoQ1NJRExfUFJPR1JBTV9GSUxFU19DT01NT04pLCAqLwogLyogICAgREVGX0NTSURMKENTSURMX1BST0dSQU1fRklMRVMpLCAqLwogCi0JLyogVmlydHVhbCBmb2xkZXIgY29udGFpbmluZyBmb250cy4gKi8KLQlERUZfQ1NJREwoQ1NJRExfRk9OVFMpLAorICAgIC8qIFZpcnR1YWwgZm9sZGVyIGNvbnRhaW5pbmcgZm9udHMuICovCisgICAgREVGX0NTSURMKENTSURMX0ZPTlRTKSwKIH07CiAKICNkZWZpbmUgRElNKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlQ3JlYXRlZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcGF0aDsKLQlpZiAoIWdfUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZwYXRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jbm90aWZ5KEZJTEVfQ1JFQVRFRCwgcGF0aCk7Ci0JcmV0dXJuIGdfUHlfQnVpbGRWYWx1ZSgiIik7CisgICAgY2hhciAqcGF0aDsKKyAgICBpZiAoIWdfUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZwYXRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbm90aWZ5KEZJTEVfQ1JFQVRFRCwgcGF0aCk7CisgICAgcmV0dXJuIGdfUHlfQnVpbGRWYWx1ZSgiIik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGlyZWN0b3J5Q3JlYXRlZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcGF0aDsKLQlpZiAoIWdfUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZwYXRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jbm90aWZ5KERJUl9DUkVBVEVELCBwYXRoKTsKLQlyZXR1cm4gZ19QeV9CdWlsZFZhbHVlKCIiKTsKKyAgICBjaGFyICpwYXRoOworICAgIGlmICghZ19QeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBub3RpZnkoRElSX0NSRUFURUQsIHBhdGgpOworICAgIHJldHVybiBnX1B5X0J1aWxkVmFsdWUoIiIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdldFNwZWNpYWxGb2xkZXJQYXRoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWNoYXIgbHBzelBhdGhbTUFYX1BBVEhdOwotCWludCBpOwotCXN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKk15X1NIR2V0U3BlY2lhbEZvbGRlclBhdGgpKEhXTkQgaHduZCwKLQkJCQkJCQkgICBMUFRTVFIgbHBzelBhdGgsCi0JCQkJCQkJICAgaW50IG5Gb2xkZXIsCi0JCQkJCQkJICAgQk9PTCBmQ3JlYXRlKTsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgbHBzelBhdGhbTUFYX1BBVEhdOworICAgIGludCBpOworICAgIHN0YXRpYyBIUkVTVUxUIChXSU5BUEkgKk15X1NIR2V0U3BlY2lhbEZvbGRlclBhdGgpKEhXTkQgaHduZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFRTVFIgbHBzelBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Gb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBmQ3JlYXRlKTsKIAotCWlmICghTXlfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aCkgewotCQlISU5TVEFOQ0UgaExpYiA9IExvYWRMaWJyYXJ5KCJzaGVsbDMyLmRsbCIpOwotCQlpZiAoIWhMaWIpIHsKLQkJCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCQkgICAgICAgImZ1bmN0aW9uIG5vdCBhdmFpbGFibGUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCU15X1NIR2V0U3BlY2lhbEZvbGRlclBhdGggPSAoQk9PTCAoV0lOQVBJICopKEhXTkQsIExQVFNUUiwKLQkJCQkJCQkgICAgIGludCwgQk9PTCkpCi0JCQlHZXRQcm9jQWRkcmVzcyhoTGliLAotCQkJCSAgICAgICAiU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEiKTsKLQl9CisgICAgaWYgKCFNeV9TSEdldFNwZWNpYWxGb2xkZXJQYXRoKSB7CisgICAgICAgIEhJTlNUQU5DRSBoTGliID0gTG9hZExpYnJhcnkoInNoZWxsMzIuZGxsIik7CisgICAgICAgIGlmICghaExpYikgeworICAgICAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIE15X1NIR2V0U3BlY2lhbEZvbGRlclBhdGggPSAoQk9PTCAoV0lOQVBJICopKEhXTkQsIExQVFNUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBCT09MKSkKKyAgICAgICAgICAgIEdldFByb2NBZGRyZXNzKGhMaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0hHZXRTcGVjaWFsRm9sZGVyUGF0aEEiKTsKKyAgICB9CiAKLQlpZiAoIWdfUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgCi0JaWYgKCFNeV9TSEdldFNwZWNpYWxGb2xkZXJQYXRoKSB7Ci0JCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwgImZ1bmN0aW9uIG5vdCBhdmFpbGFibGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghZ19QeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBESU0oY3NpZGxfbmFtZXMpOyArK2kpIHsKLQkJaWYgKDAgPT0gc3RyY21waShjc2lkbF9uYW1lc1tpXS5uYW1lLCBuYW1lKSkgewotCQkJaW50IG5Gb2xkZXI7Ci0JCQluRm9sZGVyID0gY3NpZGxfbmFtZXNbaV0ubkZvbGRlcjsKLQkJCWlmIChNeV9TSEdldFNwZWNpYWxGb2xkZXJQYXRoKE5VTEwsIGxwc3pQYXRoLAotCQkJCQkJICAgICAgbkZvbGRlciwgMCkpCi0JCQkJcmV0dXJuIGdfUHlfQnVpbGRWYWx1ZSgicyIsIGxwc3pQYXRoKTsKLQkJCWVsc2UgewotCQkJCWdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKLQkJCQkJICAgICAgICJubyBzdWNoIGZvbGRlciAoJXMpIiwgbmFtZSk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQotCQl9Ci0JfTsKLQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX1ZhbHVlRXJyb3IsICJ1bmtub3duIENTSURMICglcykiLCBuYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIU15X1NIR2V0U3BlY2lhbEZvbGRlclBhdGgpIHsKKyAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLCAiZnVuY3Rpb24gbm90IGF2YWlsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRElNKGNzaWRsX25hbWVzKTsgKytpKSB7CisgICAgICAgIGlmICgwID09IHN0cmNtcGkoY3NpZGxfbmFtZXNbaV0ubmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgIGludCBuRm9sZGVyOworICAgICAgICAgICAgbkZvbGRlciA9IGNzaWRsX25hbWVzW2ldLm5Gb2xkZXI7CisgICAgICAgICAgICBpZiAoTXlfU0hHZXRTcGVjaWFsRm9sZGVyUGF0aChOVUxMLCBscHN6UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Gb2xkZXIsIDApKQorICAgICAgICAgICAgICAgIHJldHVybiBnX1B5X0J1aWxkVmFsdWUoInMiLCBscHN6UGF0aCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIHN1Y2ggZm9sZGVyICglcykiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfTsKKyAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX1ZhbHVlRXJyb3IsICJ1bmtub3duIENTSURMICglcykiLCBuYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDcmVhdGVTaG9ydGN1dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcGF0aDsgLyogcGF0aCBhbmQgZmlsZW5hbWUgKi8KLQljaGFyICpkZXNjcmlwdGlvbjsKLQljaGFyICpmaWxlbmFtZTsKKyAgICBjaGFyICpwYXRoOyAvKiBwYXRoIGFuZCBmaWxlbmFtZSAqLworICAgIGNoYXIgKmRlc2NyaXB0aW9uOworICAgIGNoYXIgKmZpbGVuYW1lOwogCi0JY2hhciAqYXJndW1lbnRzID0gTlVMTDsKLQljaGFyICppY29ucGF0aCA9IE5VTEw7Ci0JaW50IGljb25pbmRleCA9IDA7Ci0JY2hhciAqd29ya2RpciA9IE5VTEw7CisgICAgY2hhciAqYXJndW1lbnRzID0gTlVMTDsKKyAgICBjaGFyICppY29ucGF0aCA9IE5VTEw7CisgICAgaW50IGljb25pbmRleCA9IDA7CisgICAgY2hhciAqd29ya2RpciA9IE5VTEw7CiAKLQlXQ0hBUiB3c3pGaWxlbmFtZVtNQVhfUEFUSF07CisgICAgV0NIQVIgd3N6RmlsZW5hbWVbTUFYX1BBVEhdOwogCi0JSVNoZWxsTGluayAqcHMxID0gTlVMTDsKLQlJUGVyc2lzdEZpbGUgKnBQZiA9IE5VTEw7CisgICAgSVNoZWxsTGluayAqcHMxID0gTlVMTDsKKyAgICBJUGVyc2lzdEZpbGUgKnBQZiA9IE5VTEw7CiAKLQlIUkVTVUxUIGhyOworICAgIEhSRVNVTFQgaHI7CiAKLQlociA9IENvSW5pdGlhbGl6ZShOVUxMKTsKLQlpZiAoRkFJTEVEKGhyKSkgewotCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkgICAgICAgIkNvSW5pdGlhbGl6ZSBmYWlsZWQsIGVycm9yIDB4JXgiLCBocik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorICAgIGhyID0gQ29Jbml0aWFsaXplKE5VTEwpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvSW5pdGlhbGl6ZSBmYWlsZWQsIGVycm9yIDB4JXgiLCBocik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JaWYgKCFnX1B5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzc3xzc3NpIiwKLQkJCQkmcGF0aCwgJmRlc2NyaXB0aW9uLCAmZmlsZW5hbWUsCi0JCQkJJmFyZ3VtZW50cywgJndvcmtkaXIsICZpY29ucGF0aCwgJmljb25pbmRleCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghZ19QeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3N8c3NzaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsICZkZXNjcmlwdGlvbiwgJmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmd1bWVudHMsICZ3b3JrZGlyLCAmaWNvbnBhdGgsICZpY29uaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWhyID0gQ29DcmVhdGVJbnN0YW5jZSgmQ0xTSURfU2hlbGxMaW5rLAotCQkJICAgICAgTlVMTCwKLQkJCSAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAotCQkJICAgICAgJklJRF9JU2hlbGxMaW5rLAotCQkJICAgICAgJnBzMSk7Ci0JaWYgKEZBSUxFRChocikpIHsKLQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJICAgICAgICJDb0NyZWF0ZUluc3RhbmNlIGZhaWxlZCwgZXJyb3IgMHgleCIsIGhyKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaHIgPSBDb0NyZWF0ZUluc3RhbmNlKCZDTFNJRF9TaGVsbExpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmSUlEX0lTaGVsbExpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwczEpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNvQ3JlYXRlSW5zdGFuY2UgZmFpbGVkLCBlcnJvciAweCV4IiwgaHIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWhyID0gcHMxLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHBzMSwgJklJRF9JUGVyc2lzdEZpbGUsCi0JCQkJCSAodm9pZCAqKikmcFBmKTsKLQlpZiAoRkFJTEVEKGhyKSkgewotCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkgICAgICAgIlF1ZXJ5SW50ZXJmYWNlKElQZXJzaXN0RmlsZSkgZXJyb3IgMHgleCIsIGhyKTsKLQkJZ290byBlcnJvcjsKLQl9CisgICAgaHIgPSBwczEtPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocHMxLCAmSUlEX0lQZXJzaXN0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikmcFBmKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJRdWVyeUludGVyZmFjZShJUGVyc2lzdEZpbGUpIGVycm9yIDB4JXgiLCBocik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCiAKLQlociA9IHBzMS0+bHBWdGJsLT5TZXRQYXRoKHBzMSwgcGF0aCk7Ci0JaWYgKEZBSUxFRChocikpIHsKLQkJZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAotCQkJICAgICAgICJTZXRQYXRoKCkgZmFpbGVkLCBlcnJvciAweCV4IiwgaHIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBociA9IHBzMS0+bHBWdGJsLT5TZXRQYXRoKHBzMSwgcGF0aCk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAiU2V0UGF0aCgpIGZhaWxlZCwgZXJyb3IgMHgleCIsIGhyKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlociA9IHBzMS0+bHBWdGJsLT5TZXREZXNjcmlwdGlvbihwczEsIGRlc2NyaXB0aW9uKTsKLQlpZiAoRkFJTEVEKGhyKSkgewotCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkgICAgICAgIlNldERlc2NyaXB0aW9uKCkgZmFpbGVkLCBlcnJvciAweCV4IiwgaHIpOwotCQlnb3RvIGVycm9yOwotCX0KKyAgICBociA9IHBzMS0+bHBWdGJsLT5TZXREZXNjcmlwdGlvbihwczEsIGRlc2NyaXB0aW9uKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICJTZXREZXNjcmlwdGlvbigpIGZhaWxlZCwgZXJyb3IgMHgleCIsIGhyKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQlpZiAoYXJndW1lbnRzKSB7Ci0JCWhyID0gcHMxLT5scFZ0YmwtPlNldEFyZ3VtZW50cyhwczEsIGFyZ3VtZW50cyk7Ci0JCWlmIChGQUlMRUQoaHIpKSB7Ci0JCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkJICAgICAgICJTZXRBcmd1bWVudHMoKSBlcnJvciAweCV4IiwgaHIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCX0KKyAgICBpZiAoYXJndW1lbnRzKSB7CisgICAgICAgIGhyID0gcHMxLT5scFZ0YmwtPlNldEFyZ3VtZW50cyhwczEsIGFyZ3VtZW50cyk7CisgICAgICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0QXJndW1lbnRzKCkgZXJyb3IgMHgleCIsIGhyKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAoaWNvbnBhdGgpIHsKLQkJaHIgPSBwczEtPmxwVnRibC0+U2V0SWNvbkxvY2F0aW9uKHBzMSwgaWNvbnBhdGgsIGljb25pbmRleCk7Ci0JCWlmIChGQUlMRUQoaHIpKSB7Ci0JCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkJICAgICAgICJTZXRJY29uTG9jYXRpb24oKSBlcnJvciAweCV4IiwgaHIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCX0KKyAgICBpZiAoaWNvbnBhdGgpIHsKKyAgICAgICAgaHIgPSBwczEtPmxwVnRibC0+U2V0SWNvbkxvY2F0aW9uKHBzMSwgaWNvbnBhdGgsIGljb25pbmRleCk7CisgICAgICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgICAgICBnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0SWNvbkxvY2F0aW9uKCkgZXJyb3IgMHgleCIsIGhyKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAod29ya2RpcikgewotCQlociA9IHBzMS0+bHBWdGJsLT5TZXRXb3JraW5nRGlyZWN0b3J5KHBzMSwgd29ya2Rpcik7Ci0JCWlmIChGQUlMRUQoaHIpKSB7Ci0JCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkJICAgICAgICJTZXRXb3JraW5nRGlyZWN0b3J5KCkgZXJyb3IgMHgleCIsIGhyKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9CisgICAgaWYgKHdvcmtkaXIpIHsKKyAgICAgICAgaHIgPSBwczEtPmxwVnRibC0+U2V0V29ya2luZ0RpcmVjdG9yeShwczEsIHdvcmtkaXIpOworICAgICAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICAgICAgZ19QeUVycl9Gb3JtYXQoZ19QeUV4Y19PU0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldFdvcmtpbmdEaXJlY3RvcnkoKSBlcnJvciAweCV4IiwgaHIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KIAotCU11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLAotCQkJICAgIGZpbGVuYW1lLCAtMSwKLQkJCSAgICB3c3pGaWxlbmFtZSwgTUFYX1BBVEgpOwotCQkJCi0JaHIgPSBwUGYtPmxwVnRibC0+U2F2ZShwUGYsIHdzekZpbGVuYW1lLCBUUlVFKTsKLQlpZiAoRkFJTEVEKGhyKSkgewotCQlnX1B5RXJyX0Zvcm1hdChnX1B5RXhjX09TRXJyb3IsCi0JCQkgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgc2hvcnRjdXQgJyVzJyAtIGVycm9yIDB4JXgiLCBmaWxlbmFtZSwgaHIpOwotCQlnb3RvIGVycm9yOwotCX0KLSAgICAKLQlwUGYtPmxwVnRibC0+UmVsZWFzZShwUGYpOwotCXBzMS0+bHBWdGJsLT5SZWxlYXNlKHBzMSk7Ci0JQ29VbmluaXRpYWxpemUoKTsKLQlyZXR1cm4gZ19QeV9CdWlsZFZhbHVlKCIiKTsKLSAgICAKKyAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzekZpbGVuYW1lLCBNQVhfUEFUSCk7CisKKyAgICBociA9IHBQZi0+bHBWdGJsLT5TYXZlKHBQZiwgd3N6RmlsZW5hbWUsIFRSVUUpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGdfUHlFcnJfRm9ybWF0KGdfUHlFeGNfT1NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgc2hvcnRjdXQgJyVzJyAtIGVycm9yIDB4JXgiLCBmaWxlbmFtZSwgaHIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHBQZi0+bHBWdGJsLT5SZWxlYXNlKHBQZik7CisgICAgcHMxLT5scFZ0YmwtPlJlbGVhc2UocHMxKTsKKyAgICBDb1VuaW5pdGlhbGl6ZSgpOworICAgIHJldHVybiBnX1B5X0J1aWxkVmFsdWUoIiIpOworCiAgIGVycm9yOgotCWlmIChwUGYpCi0JCXBQZi0+bHBWdGJsLT5SZWxlYXNlKHBQZik7CisgICAgaWYgKHBQZikKKyAgICAgICAgcFBmLT5scFZ0YmwtPlJlbGVhc2UocFBmKTsKIAotCWlmIChwczEpCi0JCXBzMS0+bHBWdGJsLT5SZWxlYXNlKHBzMSk7CisgICAgaWYgKHBzMSkKKyAgICAgICAgcHMxLT5scFZ0YmwtPlJlbGVhc2UocHMxKTsKIAotCUNvVW5pbml0aWFsaXplKCk7CisgICAgQ29VbmluaXRpYWxpemUoKTsKIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlB5TWVzc2FnZUJveChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHJjOwotCWNoYXIgKnRleHQsICpjYXB0aW9uOwotCWludCBmbGFnczsKLQlpZiAoIWdfUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3NpIiwgJnRleHQsICZjYXB0aW9uLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlyYyA9IE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgdGV4dCwgY2FwdGlvbiwgZmxhZ3MpOwotCXJldHVybiBnX1B5X0J1aWxkVmFsdWUoImkiLCByYyk7CisgICAgaW50IHJjOworICAgIGNoYXIgKnRleHQsICpjYXB0aW9uOworICAgIGludCBmbGFnczsKKyAgICBpZiAoIWdfUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3NpIiwgJnRleHQsICZjYXB0aW9uLCAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByYyA9IE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgdGV4dCwgY2FwdGlvbiwgZmxhZ3MpOworICAgIHJldHVybiBnX1B5X0J1aWxkVmFsdWUoImkiLCByYyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR2V0Um9vdEhLZXkoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIGdfUHlMb25nX0Zyb21Wb2lkUHRyKGhrZXlfcm9vdCk7CisgICAgcmV0dXJuIGdfUHlMb25nX0Zyb21Wb2lkUHRyKGhrZXlfcm9vdCk7CiB9CiAKICNkZWZpbmUgTUVUSF9WQVJBUkdTIDB4MDAwMQpAQCAtNjEzLDc0ICs2MTMsNzQgQEAKIHR5cGVkZWYgUHlPYmplY3QgKigqUHlDRnVuY3Rpb24pKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogCiBQeU1ldGhvZERlZiBtZXRoW10gPSB7Ci0JeyJjcmVhdGVfc2hvcnRjdXQiLCBDcmVhdGVTaG9ydGN1dCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKLQl7ImdldF9zcGVjaWFsX2ZvbGRlcl9wYXRoIiwgR2V0U3BlY2lhbEZvbGRlclBhdGgsIE1FVEhfVkFSQVJHUywgTlVMTH0sCi0JeyJnZXRfcm9vdF9oa2V5IiwgKFB5Q0Z1bmN0aW9uKUdldFJvb3RIS2V5LCBNRVRIX05PQVJHUywgTlVMTH0sCi0JeyJmaWxlX2NyZWF0ZWQiLCBGaWxlQ3JlYXRlZCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKLQl7ImRpcmVjdG9yeV9jcmVhdGVkIiwgRGlyZWN0b3J5Q3JlYXRlZCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKLQl7Im1lc3NhZ2VfYm94IiwgUHlNZXNzYWdlQm94LCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAorICAgIHsiY3JlYXRlX3Nob3J0Y3V0IiwgQ3JlYXRlU2hvcnRjdXQsIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAgeyJnZXRfc3BlY2lhbF9mb2xkZXJfcGF0aCIsIEdldFNwZWNpYWxGb2xkZXJQYXRoLCBNRVRIX1ZBUkFSR1MsIE5VTEx9LAorICAgIHsiZ2V0X3Jvb3RfaGtleSIsIChQeUNGdW5jdGlvbilHZXRSb290SEtleSwgTUVUSF9OT0FSR1MsIE5VTEx9LAorICAgIHsiZmlsZV9jcmVhdGVkIiwgRmlsZUNyZWF0ZWQsIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAgeyJkaXJlY3RvcnlfY3JlYXRlZCIsIERpcmVjdG9yeUNyZWF0ZWQsIE1FVEhfVkFSQVJHUywgTlVMTH0sCisgICAgeyJtZXNzYWdlX2JveCIsIFB5TWVzc2FnZUJveCwgTUVUSF9WQVJBUkdTLCBOVUxMfSwKIH07CiAKIHN0YXRpYyBISU5TVEFOQ0UgTG9hZFB5dGhvbkRsbChjaGFyICpmbmFtZSkKIHsKLQljaGFyIGZ1bGxwYXRoW19NQVhfUEFUSF07Ci0JTE9ORyBzaXplID0gc2l6ZW9mKGZ1bGxwYXRoKTsKLQljaGFyIHN1YmtleV9uYW1lWzgwXTsKLQljaGFyIGJ1ZmZlclsyNjAgKyAxMl07Ci0JSElOU1RBTkNFIGg7CisgICAgY2hhciBmdWxscGF0aFtfTUFYX1BBVEhdOworICAgIExPTkcgc2l6ZSA9IHNpemVvZihmdWxscGF0aCk7CisgICAgY2hhciBzdWJrZXlfbmFtZVs4MF07CisgICAgY2hhciBidWZmZXJbMjYwICsgMTJdOworICAgIEhJTlNUQU5DRSBoOwogCi0JLyogbWFrZSBzdXJlIFBZVEhPTkhPTUUgaXMgc2V0LCB0byB0aGF0IHN5cy5wYXRoIGlzIGluaXRpYWxpemVkIGNvcnJlY3RseSAqLwotCXdzcHJpbnRmKGJ1ZmZlciwgIlBZVEhPTkhPTUU9JXMiLCBweXRob25fZGlyKTsKLQlfcHV0ZW52KGJ1ZmZlcik7Ci0JaCA9IExvYWRMaWJyYXJ5KGZuYW1lKTsKLQlpZiAoaCkKLQkJcmV0dXJuIGg7Ci0Jd3NwcmludGYoc3Via2V5X25hbWUsCi0JCSAiU09GVFdBUkVcXFB5dGhvblxcUHl0aG9uQ29yZVxcJWQuJWRcXEluc3RhbGxQYXRoIiwKLQkJIHB5X21ham9yLCBweV9taW5vcik7Ci0JaWYgKEVSUk9SX1NVQ0NFU1MgIT0gUmVnUXVlcnlWYWx1ZShIS0VZX0NVUlJFTlRfVVNFUiwgc3Via2V5X25hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCwgJnNpemUpICYmCi0JICAgIEVSUk9SX1NVQ0NFU1MgIT0gUmVnUXVlcnlWYWx1ZShIS0VZX0xPQ0FMX01BQ0hJTkUsIHN1YmtleV9uYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGgsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3RyY2F0KGZ1bGxwYXRoLCAiXFwiKTsKLQlzdHJjYXQoZnVsbHBhdGgsIGZuYW1lKTsKLQlyZXR1cm4gTG9hZExpYnJhcnkoZnVsbHBhdGgpOworICAgIC8qIG1ha2Ugc3VyZSBQWVRIT05IT01FIGlzIHNldCwgdG8gdGhhdCBzeXMucGF0aCBpcyBpbml0aWFsaXplZCBjb3JyZWN0bHkgKi8KKyAgICB3c3ByaW50ZihidWZmZXIsICJQWVRIT05IT01FPSVzIiwgcHl0aG9uX2Rpcik7CisgICAgX3B1dGVudihidWZmZXIpOworICAgIGggPSBMb2FkTGlicmFyeShmbmFtZSk7CisgICAgaWYgKGgpCisgICAgICAgIHJldHVybiBoOworICAgIHdzcHJpbnRmKHN1YmtleV9uYW1lLAorICAgICAgICAgICAgICJTT0ZUV0FSRVxcUHl0aG9uXFxQeXRob25Db3JlXFwlZC4lZFxcSW5zdGFsbFBhdGgiLAorICAgICAgICAgICAgIHB5X21ham9yLCBweV9taW5vcik7CisgICAgaWYgKEVSUk9SX1NVQ0NFU1MgIT0gUmVnUXVlcnlWYWx1ZShIS0VZX0NVUlJFTlRfVVNFUiwgc3Via2V5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCwgJnNpemUpICYmCisgICAgICAgIEVSUk9SX1NVQ0NFU1MgIT0gUmVnUXVlcnlWYWx1ZShIS0VZX0xPQ0FMX01BQ0hJTkUsIHN1YmtleV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGgsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3RyY2F0KGZ1bGxwYXRoLCAiXFwiKTsKKyAgICBzdHJjYXQoZnVsbHBhdGgsIGZuYW1lKTsKKyAgICByZXR1cm4gTG9hZExpYnJhcnkoZnVsbHBhdGgpOwogfQogCiBzdGF0aWMgaW50IHByZXBhcmVfc2NyaXB0X2Vudmlyb25tZW50KEhJTlNUQU5DRSBoUHl0aG9uKQogewotCVB5T2JqZWN0ICptb2Q7Ci0JREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlJbXBvcnRfSW1wb3J0TW9kdWxlLCAoY2hhciAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeU9iamVjdF9TZXRBdHRyU3RyaW5nLCAoUHlPYmplY3QgKiwgY2hhciAqLCBQeU9iamVjdCAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlPYmplY3RfR2V0QXR0clN0cmluZywgKFB5T2JqZWN0ICosIGNoYXIgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5Q0Z1bmN0aW9uX05ldywgKFB5TWV0aG9kRGVmICosIFB5T2JqZWN0ICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeV9CdWlsZFZhbHVlLCAoY2hhciAqLCAuLi4pKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5QXJnX1BhcnNlVHVwbGUsIChQeU9iamVjdCAqLCBjaGFyICosIC4uLikpOwotCURFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5RXJyX0Zvcm1hdCwgKFB5T2JqZWN0ICosIGNoYXIgKikpOwotCURFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5TG9uZ19Gcm9tVm9pZFB0ciwgKHZvaWQgKikpOwotCWlmICghUHlJbXBvcnRfSW1wb3J0TW9kdWxlIHx8ICFQeU9iamVjdF9HZXRBdHRyU3RyaW5nIHx8IAotCSAgICAhUHlPYmplY3RfU2V0QXR0clN0cmluZyB8fCAhUHlDRnVuY3Rpb25fTmV3KQotCQlyZXR1cm4gMTsKLQlpZiAoIVB5X0J1aWxkVmFsdWUgfHwgIVB5QXJnX1BhcnNlVHVwbGUgfHwgIVB5RXJyX0Zvcm1hdCkKLQkJcmV0dXJuIDE7CisgICAgUHlPYmplY3QgKm1vZDsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUltcG9ydF9JbXBvcnRNb2R1bGUsIChjaGFyICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcsIChQeU9iamVjdCAqLCBjaGFyICosIFB5T2JqZWN0ICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeU9iamVjdF9HZXRBdHRyU3RyaW5nLCAoUHlPYmplY3QgKiwgY2hhciAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlDRnVuY3Rpb25fTmV3LCAoUHlNZXRob2REZWYgKiwgUHlPYmplY3QgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5X0J1aWxkVmFsdWUsIChjaGFyICosIC4uLikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlBcmdfUGFyc2VUdXBsZSwgKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlFcnJfRm9ybWF0LCAoUHlPYmplY3QgKiwgY2hhciAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlMb25nX0Zyb21Wb2lkUHRyLCAodm9pZCAqKSk7CisgICAgaWYgKCFQeUltcG9ydF9JbXBvcnRNb2R1bGUgfHwgIVB5T2JqZWN0X0dldEF0dHJTdHJpbmcgfHwKKyAgICAgICAgIVB5T2JqZWN0X1NldEF0dHJTdHJpbmcgfHwgIVB5Q0Z1bmN0aW9uX05ldykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKCFQeV9CdWlsZFZhbHVlIHx8ICFQeUFyZ19QYXJzZVR1cGxlIHx8ICFQeUVycl9Gb3JtYXQpCisgICAgICAgIHJldHVybiAxOwogCi0JbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJfX2J1aWx0aW5fXyIpOwotCWlmIChtb2QpIHsKLQkJaW50IGk7Ci0JCWdfUHlFeGNfVmFsdWVFcnJvciA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiVmFsdWVFcnJvciIpOwotCQlnX1B5RXhjX09TRXJyb3IgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIk9TRXJyb3IiKTsKLQkJZm9yIChpID0gMDsgaSA8IERJTShtZXRoKTsgKytpKSB7Ci0JCQlQeU9iamVjdF9TZXRBdHRyU3RyaW5nKG1vZCwgbWV0aFtpXS5tbF9uYW1lLAotCQkJCQkgICAgICAgUHlDRnVuY3Rpb25fTmV3KCZtZXRoW2ldLCBOVUxMKSk7Ci0JCX0KLQl9Ci0JZ19QeV9CdWlsZFZhbHVlID0gUHlfQnVpbGRWYWx1ZTsKLQlnX1B5QXJnX1BhcnNlVHVwbGUgPSBQeUFyZ19QYXJzZVR1cGxlOwotCWdfUHlFcnJfRm9ybWF0ID0gUHlFcnJfRm9ybWF0OwotCWdfUHlMb25nX0Zyb21Wb2lkUHRyID0gUHlMb25nX0Zyb21Wb2lkUHRyOworICAgIG1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiX19idWlsdGluX18iKTsKKyAgICBpZiAobW9kKSB7CisgICAgICAgIGludCBpOworICAgICAgICBnX1B5RXhjX1ZhbHVlRXJyb3IgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIlZhbHVlRXJyb3IiKTsKKyAgICAgICAgZ19QeUV4Y19PU0Vycm9yID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJPU0Vycm9yIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBESU0obWV0aCk7ICsraSkgeworICAgICAgICAgICAgUHlPYmplY3RfU2V0QXR0clN0cmluZyhtb2QsIG1ldGhbaV0ubWxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDRnVuY3Rpb25fTmV3KCZtZXRoW2ldLCBOVUxMKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZ19QeV9CdWlsZFZhbHVlID0gUHlfQnVpbGRWYWx1ZTsKKyAgICBnX1B5QXJnX1BhcnNlVHVwbGUgPSBQeUFyZ19QYXJzZVR1cGxlOworICAgIGdfUHlFcnJfRm9ybWF0ID0gUHlFcnJfRm9ybWF0OworICAgIGdfUHlMb25nX0Zyb21Wb2lkUHRyID0gUHlMb25nX0Zyb21Wb2lkUHRyOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC02OTYsNDczICs2OTYsNDczIEBACiBzdGF0aWMgaW50CiBkb19ydW5faW5zdGFsbHNjcmlwdChISU5TVEFOQ0UgaFB5dGhvbiwgY2hhciAqcGF0aG5hbWUsIGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlpbnQgZmgsIHJlc3VsdDsKLQlERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9Jbml0aWFsaXplLCAodm9pZCkpOwotCURFQ0xQUk9DKGhQeXRob24sIGludCwgUHlTeXNfU2V0QXJndiwgKGludCwgY2hhciAqKikpOwotCURFQ0xQUk9DKGhQeXRob24sIGludCwgUHlSdW5fU2ltcGxlU3RyaW5nLCAoY2hhciAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfRmluYWxpemUsICh2b2lkKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlfQnVpbGRWYWx1ZSwgKGNoYXIgKiwgLi4uKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlDRnVuY3Rpb25fTmV3LAotCQkgKFB5TWV0aG9kRGVmICosIFB5T2JqZWN0ICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5QXJnX1BhcnNlVHVwbGUsIChQeU9iamVjdCAqLCBjaGFyICosIC4uLikpOwotCURFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5RXJyX0Zvcm1hdCwgKFB5T2JqZWN0ICosIGNoYXIgKikpOworICAgIGludCBmaCwgcmVzdWx0OworICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0luaXRpYWxpemUsICh2b2lkKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVN5c19TZXRBcmd2LCAoaW50LCBjaGFyICoqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVJ1bl9TaW1wbGVTdHJpbmcsIChjaGFyICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9GaW5hbGl6ZSwgKHZvaWQpKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeV9CdWlsZFZhbHVlLCAoY2hhciAqLCAuLi4pKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUNGdW5jdGlvbl9OZXcsCisgICAgICAgICAgICAgKFB5TWV0aG9kRGVmICosIFB5T2JqZWN0ICopKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5QXJnX1BhcnNlVHVwbGUsIChQeU9iamVjdCAqLCBjaGFyICosIC4uLikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5RXJyX0Zvcm1hdCwgKFB5T2JqZWN0ICosIGNoYXIgKikpOwogCi0JaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeVN5c19TZXRBcmd2Ci0JICAgIHx8ICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5X0ZpbmFsaXplKQotCQlyZXR1cm4gMTsKLQkKLQlpZiAoIVB5X0J1aWxkVmFsdWUgfHwgIVB5QXJnX1BhcnNlVHVwbGUgfHwgIVB5RXJyX0Zvcm1hdCkKLQkJcmV0dXJuIDE7CisgICAgaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeVN5c19TZXRBcmd2CisgICAgICAgIHx8ICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5X0ZpbmFsaXplKQorICAgICAgICByZXR1cm4gMTsKIAotCWlmICghUHlDRnVuY3Rpb25fTmV3IHx8ICFQeUFyZ19QYXJzZVR1cGxlIHx8ICFQeUVycl9Gb3JtYXQpCi0JCXJldHVybiAxOworICAgIGlmICghUHlfQnVpbGRWYWx1ZSB8fCAhUHlBcmdfUGFyc2VUdXBsZSB8fCAhUHlFcnJfRm9ybWF0KQorICAgICAgICByZXR1cm4gMTsKIAotCWlmIChwYXRobmFtZSA9PSBOVUxMIHx8IHBhdGhuYW1lWzBdID09ICdcMCcpCi0JCXJldHVybiAyOworICAgIGlmICghUHlDRnVuY3Rpb25fTmV3IHx8ICFQeUFyZ19QYXJzZVR1cGxlIHx8ICFQeUVycl9Gb3JtYXQpCisgICAgICAgIHJldHVybiAxOwogCi0JZmggPSBvcGVuKHBhdGhuYW1lLCBfT19SRE9OTFkpOwotCWlmICgtMSA9PSBmaCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHBvc3RpbnN0YWxsLXNjcmlwdCAlc1xuIiwKLQkJCXBhdGhuYW1lKTsKLQkJcmV0dXJuIDM7Ci0JfQorICAgIGlmIChwYXRobmFtZSA9PSBOVUxMIHx8IHBhdGhuYW1lWzBdID09ICdcMCcpCisgICAgICAgIHJldHVybiAyOwogCi0JU2V0RGxnSXRlbVRleHQoaERpYWxvZywgSURDX0lORk8sICJSdW5uaW5nIFNjcmlwdC4uLiIpOworICAgIGZoID0gb3BlbihwYXRobmFtZSwgX09fUkRPTkxZKTsKKyAgICBpZiAoLTEgPT0gZmgpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBwb3N0aW5zdGFsbC1zY3JpcHQgJXNcbiIsCisgICAgICAgICAgICBwYXRobmFtZSk7CisgICAgICAgIHJldHVybiAzOworICAgIH0KIAotCVB5X0luaXRpYWxpemUoKTsKKyAgICBTZXREbGdJdGVtVGV4dChoRGlhbG9nLCBJRENfSU5GTywgIlJ1bm5pbmcgU2NyaXB0Li4uIik7CiAKLQlwcmVwYXJlX3NjcmlwdF9lbnZpcm9ubWVudChoUHl0aG9uKTsKLQlQeVN5c19TZXRBcmd2KGFyZ2MsIGFyZ3YpOwotCXJlc3VsdCA9IDM7Ci0JewotCQlzdHJ1Y3QgX3N0YXQgc3RhdGJ1ZjsKLQkJaWYoMCA9PSBfZnN0YXQoZmgsICZzdGF0YnVmKSkgewotCQkJY2hhciAqc2NyaXB0ID0gYWxsb2NhKHN0YXRidWYuc3Rfc2l6ZSArIDUpOwotCQkJaW50IG4gPSByZWFkKGZoLCBzY3JpcHQsIHN0YXRidWYuc3Rfc2l6ZSk7Ci0JCQlpZiAobiA+IDApIHsKLQkJCQlzY3JpcHRbbl0gPSAnXG4nOwotCQkJCXNjcmlwdFtuKzFdID0gMDsKLQkJCQlyZXN1bHQgPSBQeVJ1bl9TaW1wbGVTdHJpbmcoc2NyaXB0KTsKLQkJCX0KLQkJfQotCX0KLQlQeV9GaW5hbGl6ZSgpOworICAgIFB5X0luaXRpYWxpemUoKTsKIAotCWNsb3NlKGZoKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIHByZXBhcmVfc2NyaXB0X2Vudmlyb25tZW50KGhQeXRob24pOworICAgIFB5U3lzX1NldEFyZ3YoYXJnYywgYXJndik7CisgICAgcmVzdWx0ID0gMzsKKyAgICB7CisgICAgICAgIHN0cnVjdCBfc3RhdCBzdGF0YnVmOworICAgICAgICBpZigwID09IF9mc3RhdChmaCwgJnN0YXRidWYpKSB7CisgICAgICAgICAgICBjaGFyICpzY3JpcHQgPSBhbGxvY2Eoc3RhdGJ1Zi5zdF9zaXplICsgNSk7CisgICAgICAgICAgICBpbnQgbiA9IHJlYWQoZmgsIHNjcmlwdCwgc3RhdGJ1Zi5zdF9zaXplKTsKKyAgICAgICAgICAgIGlmIChuID4gMCkgeworICAgICAgICAgICAgICAgIHNjcmlwdFtuXSA9ICdcbic7CisgICAgICAgICAgICAgICAgc2NyaXB0W24rMV0gPSAwOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5UnVuX1NpbXBsZVN0cmluZyhzY3JpcHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFB5X0ZpbmFsaXplKCk7CisKKyAgICBjbG9zZShmaCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludAogcnVuX2luc3RhbGxzY3JpcHQoY2hhciAqcGF0aG5hbWUsIGludCBhcmdjLCBjaGFyICoqYXJndiwgY2hhciAqKnBPdXRwdXQpCiB7Ci0JSElOU1RBTkNFIGhQeXRob247Ci0JaW50IHJlc3VsdCA9IDE7Ci0JaW50IG91dF9idWZfc2l6ZTsKLQlIQU5ETEUgcmVkaXJlY3RlZCwgb2xkX3N0ZGVyciwgb2xkX3N0ZG91dDsKLQljaGFyICp0ZW1wbmFtZTsKKyAgICBISU5TVEFOQ0UgaFB5dGhvbjsKKyAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICBpbnQgb3V0X2J1Zl9zaXplOworICAgIEhBTkRMRSByZWRpcmVjdGVkLCBvbGRfc3RkZXJyLCBvbGRfc3Rkb3V0OworICAgIGNoYXIgKnRlbXBuYW1lOwogCi0JKnBPdXRwdXQgPSBOVUxMOworICAgICpwT3V0cHV0ID0gTlVMTDsKIAotCXRlbXBuYW1lID0gdGVtcG5hbShOVUxMLCBOVUxMKTsKLQkvLyBXZSB1c2UgYSBzdGF0aWMgQ1JUIHdoaWxlIHRoZSBQeXRob24gdmVyc2lvbiB3ZSBsb2FkIHVzZXMKLQkvLyB0aGUgQ1JUIGZyb20gb25lIG9mIHZhcmlvdXMgcG9zc2liaWxlIERMTHMuICBBcyBhIHJlc3VsdCB3ZQotCS8vIG5lZWQgdG8gcmVkaXJlY3QgdGhlIHN0YW5kYXJkIGhhbmRsZXMgdXNpbmcgdGhlIEFQSSByYXRoZXIKLQkvLyB0aGFuIHRoZSBDUlQuCi0JcmVkaXJlY3RlZCA9IENyZWF0ZUZpbGUoCi0JCQkJCXRlbXBuYW1lLAotCQkJCQlHRU5FUklDX1dSSVRFIHwgR0VORVJJQ19SRUFELAotCQkJCQlGSUxFX1NIQVJFX1JFQUQsCi0JCQkJCU5VTEwsCi0JCQkJCUNSRUFURV9BTFdBWVMsCi0JCQkJCUZJTEVfQVRUUklCVVRFX05PUk1BTCB8IEZJTEVfRkxBR19XUklURV9USFJPVUdILAotCQkJCQlOVUxMKTsKLQlvbGRfc3Rkb3V0ID0gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKLQlvbGRfc3RkZXJyID0gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpOwotCVNldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSwgcmVkaXJlY3RlZCk7Ci0JU2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUsIHJlZGlyZWN0ZWQpOworICAgIHRlbXBuYW1lID0gdGVtcG5hbShOVUxMLCBOVUxMKTsKKyAgICAvLyBXZSB1c2UgYSBzdGF0aWMgQ1JUIHdoaWxlIHRoZSBQeXRob24gdmVyc2lvbiB3ZSBsb2FkIHVzZXMKKyAgICAvLyB0aGUgQ1JUIGZyb20gb25lIG9mIHZhcmlvdXMgcG9zc2liaWxlIERMTHMuICBBcyBhIHJlc3VsdCB3ZQorICAgIC8vIG5lZWQgdG8gcmVkaXJlY3QgdGhlIHN0YW5kYXJkIGhhbmRsZXMgdXNpbmcgdGhlIEFQSSByYXRoZXIKKyAgICAvLyB0aGFuIHRoZSBDUlQuCisgICAgcmVkaXJlY3RlZCA9IENyZWF0ZUZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfV1JJVEUgfCBHRU5FUklDX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFX0FMV0FZUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCB8IEZJTEVfRkxBR19XUklURV9USFJPVUdILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgb2xkX3N0ZG91dCA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisgICAgb2xkX3N0ZGVyciA9IEdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKTsKKyAgICBTZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUsIHJlZGlyZWN0ZWQpOworICAgIFNldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFLCByZWRpcmVjdGVkKTsKIAotCWhQeXRob24gPSBMb2FkUHl0aG9uRGxsKHB5dGhvbmRsbCk7Ci0JaWYgKGhQeXRob24pIHsKLQkJcmVzdWx0ID0gZG9fcnVuX2luc3RhbGxzY3JpcHQoaFB5dGhvbiwgcGF0aG5hbWUsIGFyZ2MsIGFyZ3YpOwotCQlGcmVlTGlicmFyeShoUHl0aG9uKTsKLQl9IGVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgIioqKiBDb3VsZCBub3QgbG9hZCBQeXRob24gKioqIik7Ci0JfQotCVNldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSwgb2xkX3N0ZG91dCk7Ci0JU2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUsIG9sZF9zdGRlcnIpOwotCW91dF9idWZfc2l6ZSA9IG1pbihHZXRGaWxlU2l6ZShyZWRpcmVjdGVkLCBOVUxMKSwgNDA5Nik7Ci0JKnBPdXRwdXQgPSBtYWxsb2Mob3V0X2J1Zl9zaXplKzEpOwotCWlmICgqcE91dHB1dCkgewotCQlEV09SRCBucmVhZCA9IDA7Ci0JCVNldEZpbGVQb2ludGVyKHJlZGlyZWN0ZWQsIDAsIDAsIEZJTEVfQkVHSU4pOwotCQlSZWFkRmlsZShyZWRpcmVjdGVkLCAqcE91dHB1dCwgb3V0X2J1Zl9zaXplLCAmbnJlYWQsIE5VTEwpOwotCQkoKnBPdXRwdXQpW25yZWFkXSA9ICdcMCc7Ci0JfQotCUNsb3NlSGFuZGxlKHJlZGlyZWN0ZWQpOwotCURlbGV0ZUZpbGUodGVtcG5hbWUpOwotCXJldHVybiByZXN1bHQ7CisgICAgaFB5dGhvbiA9IExvYWRQeXRob25EbGwocHl0aG9uZGxsKTsKKyAgICBpZiAoaFB5dGhvbikgeworICAgICAgICByZXN1bHQgPSBkb19ydW5faW5zdGFsbHNjcmlwdChoUHl0aG9uLCBwYXRobmFtZSwgYXJnYywgYXJndik7CisgICAgICAgIEZyZWVMaWJyYXJ5KGhQeXRob24pOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKioqIENvdWxkIG5vdCBsb2FkIFB5dGhvbiAqKioiKTsKKyAgICB9CisgICAgU2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFLCBvbGRfc3Rkb3V0KTsKKyAgICBTZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSwgb2xkX3N0ZGVycik7CisgICAgb3V0X2J1Zl9zaXplID0gbWluKEdldEZpbGVTaXplKHJlZGlyZWN0ZWQsIE5VTEwpLCA0MDk2KTsKKyAgICAqcE91dHB1dCA9IG1hbGxvYyhvdXRfYnVmX3NpemUrMSk7CisgICAgaWYgKCpwT3V0cHV0KSB7CisgICAgICAgIERXT1JEIG5yZWFkID0gMDsKKyAgICAgICAgU2V0RmlsZVBvaW50ZXIocmVkaXJlY3RlZCwgMCwgMCwgRklMRV9CRUdJTik7CisgICAgICAgIFJlYWRGaWxlKHJlZGlyZWN0ZWQsICpwT3V0cHV0LCBvdXRfYnVmX3NpemUsICZucmVhZCwgTlVMTCk7CisgICAgICAgICgqcE91dHB1dClbbnJlYWRdID0gJ1wwJzsKKyAgICB9CisgICAgQ2xvc2VIYW5kbGUocmVkaXJlY3RlZCk7CisgICAgRGVsZXRlRmlsZSh0ZW1wbmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGludCBkb19ydW5fc2ltcGxlX3NjcmlwdChISU5TVEFOQ0UgaFB5dGhvbiwgY2hhciAqc2NyaXB0KQogewotCWludCByYzsKLQlERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9Jbml0aWFsaXplLCAodm9pZCkpOwotCURFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X1NldFByb2dyYW1OYW1lLCAoY2hhciAqKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfRmluYWxpemUsICh2b2lkKSk7Ci0JREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVJ1bl9TaW1wbGVTdHJpbmcsIChjaGFyICopKTsKLQlERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeUVycl9QcmludCwgKHZvaWQpKTsKKyAgICBpbnQgcmM7CisgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9TZXRQcm9ncmFtTmFtZSwgKGNoYXIgKikpOworICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlSdW5fU2ltcGxlU3RyaW5nLCAoY2hhciAqKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlFcnJfUHJpbnQsICh2b2lkKSk7CiAKLQlpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5X1NldFByb2dyYW1OYW1lIHx8ICFQeV9GaW5hbGl6ZSB8fCAKLQkgICAgIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlFcnJfUHJpbnQpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5X1NldFByb2dyYW1OYW1lIHx8ICFQeV9GaW5hbGl6ZSB8fAorICAgICAgICAhUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeUVycl9QcmludCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JUHlfU2V0UHJvZ3JhbU5hbWUobW9kdWxlbmFtZSk7Ci0JUHlfSW5pdGlhbGl6ZSgpOwotCXByZXBhcmVfc2NyaXB0X2Vudmlyb25tZW50KGhQeXRob24pOwotCXJjID0gUHlSdW5fU2ltcGxlU3RyaW5nKHNjcmlwdCk7Ci0JaWYgKHJjKQotCQlQeUVycl9QcmludCgpOwotCVB5X0ZpbmFsaXplKCk7Ci0JcmV0dXJuIHJjOworICAgIFB5X1NldFByb2dyYW1OYW1lKG1vZHVsZW5hbWUpOworICAgIFB5X0luaXRpYWxpemUoKTsKKyAgICBwcmVwYXJlX3NjcmlwdF9lbnZpcm9ubWVudChoUHl0aG9uKTsKKyAgICByYyA9IFB5UnVuX1NpbXBsZVN0cmluZyhzY3JpcHQpOworICAgIGlmIChyYykKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICBQeV9GaW5hbGl6ZSgpOworICAgIHJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBydW5fc2ltcGxlX3NjcmlwdChjaGFyICpzY3JpcHQpCiB7Ci0JaW50IHJjOwotCUhJTlNUQU5DRSBoUHl0aG9uOwotCWNoYXIgKnRlbXBuYW1lID0gdGVtcG5hbShOVUxMLCBOVUxMKTsKLQkvLyBSZWRpcmVjdCBvdXRwdXQgdXNpbmcgd2luMzIgQVBJIC0gc2VlIGNvbW1lbnRzIGFib3ZlLi4uCi0JSEFORExFIHJlZGlyZWN0ZWQgPSBDcmVhdGVGaWxlKAotCQkJCQl0ZW1wbmFtZSwKLQkJCQkJR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRCwKLQkJCQkJRklMRV9TSEFSRV9SRUFELAotCQkJCQlOVUxMLAotCQkJCQlDUkVBVEVfQUxXQVlTLAotCQkJCQlGSUxFX0FUVFJJQlVURV9OT1JNQUwgfCBGSUxFX0ZMQUdfV1JJVEVfVEhST1VHSCwKLQkJCQkJTlVMTCk7Ci0JSEFORExFIG9sZF9zdGRvdXQgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOwotCUhBTkRMRSBvbGRfc3RkZXJyID0gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpOwotCVNldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSwgcmVkaXJlY3RlZCk7Ci0JU2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUsIHJlZGlyZWN0ZWQpOworICAgIGludCByYzsKKyAgICBISU5TVEFOQ0UgaFB5dGhvbjsKKyAgICBjaGFyICp0ZW1wbmFtZSA9IHRlbXBuYW0oTlVMTCwgTlVMTCk7CisgICAgLy8gUmVkaXJlY3Qgb3V0cHV0IHVzaW5nIHdpbjMyIEFQSSAtIHNlZSBjb21tZW50cyBhYm92ZS4uLgorICAgIEhBTkRMRSByZWRpcmVjdGVkID0gQ3JlYXRlRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19XUklURSB8IEdFTkVSSUNfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVEVfQUxXQVlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMIHwgRklMRV9GTEFHX1dSSVRFX1RIUk9VR0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBIQU5ETEUgb2xkX3N0ZG91dCA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisgICAgSEFORExFIG9sZF9zdGRlcnIgPSBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7CisgICAgU2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFLCByZWRpcmVjdGVkKTsKKyAgICBTZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSwgcmVkaXJlY3RlZCk7CiAKLQloUHl0aG9uID0gTG9hZFB5dGhvbkRsbChweXRob25kbGwpOwotCWlmICghaFB5dGhvbikgewotCQljaGFyIHJlYXNvblsxMjhdOwotCQl3c3ByaW50ZihyZWFzb24sICJDYW4ndCBsb2FkIFB5dGhvbiBmb3IgcHJlLWluc3RhbGwgc2NyaXB0ICglZCkiLCBHZXRMYXN0RXJyb3IoKSk7Ci0JCXNldF9mYWlsdXJlX3JlYXNvbihyZWFzb24pOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJjID0gZG9fcnVuX3NpbXBsZV9zY3JpcHQoaFB5dGhvbiwgc2NyaXB0KTsKLQlGcmVlTGlicmFyeShoUHl0aG9uKTsKLQlTZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUsIG9sZF9zdGRvdXQpOwotCVNldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFLCBvbGRfc3RkZXJyKTsKLQkvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIG91dHB1dCB3aGVuIHdlIGZhaWwuICBJZiB0aGUgc2NyaXB0IHdvcmtzCi0JICAgT0ssIHRoZW4gd2UgZGlzY2FyZCBpdAotCSovCi0JaWYgKHJjKSB7Ci0JCWludCBlcnJfYnVmX3NpemU7Ci0JCWNoYXIgKmVycl9idWY7Ci0JCWNvbnN0IGNoYXIgKnByZWZpeCA9ICJSdW5uaW5nIHRoZSBwcmUtaW5zdGFsbGF0aW9uIHNjcmlwdCBmYWlsZWRcclxuIjsKLQkJaW50IHByZWZpeF9sZW4gPSBzdHJsZW4ocHJlZml4KTsKLQkJZXJyX2J1Zl9zaXplID0gR2V0RmlsZVNpemUocmVkaXJlY3RlZCwgTlVMTCk7Ci0JCWlmIChlcnJfYnVmX3NpemU9PUlOVkFMSURfRklMRV9TSVpFKSAvLyBhbiBlcnJvciAtIGxldCdzIHRyeSBhbnl3YXkuLi4KLQkJCWVycl9idWZfc2l6ZSA9IDQwOTY7Ci0JCWVycl9idWYgPSBtYWxsb2MocHJlZml4X2xlbiArIGVycl9idWZfc2l6ZSArIDEpOwotCQlpZiAoZXJyX2J1ZikgewotCQkJRFdPUkQgbiA9IDA7Ci0JCQlzdHJjcHkoZXJyX2J1ZiwgcHJlZml4KTsKLQkJCVNldEZpbGVQb2ludGVyKHJlZGlyZWN0ZWQsIDAsIDAsIEZJTEVfQkVHSU4pOwotCQkJUmVhZEZpbGUocmVkaXJlY3RlZCwgZXJyX2J1ZitwcmVmaXhfbGVuLCBlcnJfYnVmX3NpemUsICZuLCBOVUxMKTsKLQkJCWVycl9idWZbcHJlZml4X2xlbituXSA9ICdcMCc7Ci0JCQlzZXRfZmFpbHVyZV9yZWFzb24oZXJyX2J1Zik7Ci0JCQlmcmVlKGVycl9idWYpOwotCQl9IGVsc2UgewotCQkJc2V0X2ZhaWx1cmVfcmVhc29uKCJPdXQgb2YgbWVtb3J5ISIpOwotCQl9Ci0JfQotCUNsb3NlSGFuZGxlKHJlZGlyZWN0ZWQpOwotCURlbGV0ZUZpbGUodGVtcG5hbWUpOwotCXJldHVybiByYzsKKyAgICBoUHl0aG9uID0gTG9hZFB5dGhvbkRsbChweXRob25kbGwpOworICAgIGlmICghaFB5dGhvbikgeworICAgICAgICBjaGFyIHJlYXNvblsxMjhdOworICAgICAgICB3c3ByaW50ZihyZWFzb24sICJDYW4ndCBsb2FkIFB5dGhvbiBmb3IgcHJlLWluc3RhbGwgc2NyaXB0ICglZCkiLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICAgIHNldF9mYWlsdXJlX3JlYXNvbihyZWFzb24pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJjID0gZG9fcnVuX3NpbXBsZV9zY3JpcHQoaFB5dGhvbiwgc2NyaXB0KTsKKyAgICBGcmVlTGlicmFyeShoUHl0aG9uKTsKKyAgICBTZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUsIG9sZF9zdGRvdXQpOworICAgIFNldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFLCBvbGRfc3RkZXJyKTsKKyAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIG91dHB1dCB3aGVuIHdlIGZhaWwuICBJZiB0aGUgc2NyaXB0IHdvcmtzCisgICAgICAgT0ssIHRoZW4gd2UgZGlzY2FyZCBpdAorICAgICovCisgICAgaWYgKHJjKSB7CisgICAgICAgIGludCBlcnJfYnVmX3NpemU7CisgICAgICAgIGNoYXIgKmVycl9idWY7CisgICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICJSdW5uaW5nIHRoZSBwcmUtaW5zdGFsbGF0aW9uIHNjcmlwdCBmYWlsZWRcclxuIjsKKyAgICAgICAgaW50IHByZWZpeF9sZW4gPSBzdHJsZW4ocHJlZml4KTsKKyAgICAgICAgZXJyX2J1Zl9zaXplID0gR2V0RmlsZVNpemUocmVkaXJlY3RlZCwgTlVMTCk7CisgICAgICAgIGlmIChlcnJfYnVmX3NpemU9PUlOVkFMSURfRklMRV9TSVpFKSAvLyBhbiBlcnJvciAtIGxldCdzIHRyeSBhbnl3YXkuLi4KKyAgICAgICAgICAgIGVycl9idWZfc2l6ZSA9IDQwOTY7CisgICAgICAgIGVycl9idWYgPSBtYWxsb2MocHJlZml4X2xlbiArIGVycl9idWZfc2l6ZSArIDEpOworICAgICAgICBpZiAoZXJyX2J1ZikgeworICAgICAgICAgICAgRFdPUkQgbiA9IDA7CisgICAgICAgICAgICBzdHJjcHkoZXJyX2J1ZiwgcHJlZml4KTsKKyAgICAgICAgICAgIFNldEZpbGVQb2ludGVyKHJlZGlyZWN0ZWQsIDAsIDAsIEZJTEVfQkVHSU4pOworICAgICAgICAgICAgUmVhZEZpbGUocmVkaXJlY3RlZCwgZXJyX2J1ZitwcmVmaXhfbGVuLCBlcnJfYnVmX3NpemUsICZuLCBOVUxMKTsKKyAgICAgICAgICAgIGVycl9idWZbcHJlZml4X2xlbituXSA9ICdcMCc7CisgICAgICAgICAgICBzZXRfZmFpbHVyZV9yZWFzb24oZXJyX2J1Zik7CisgICAgICAgICAgICBmcmVlKGVycl9idWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0X2ZhaWx1cmVfcmVhc29uKCJPdXQgb2YgbWVtb3J5ISIpOworICAgICAgICB9CisgICAgfQorICAgIENsb3NlSGFuZGxlKHJlZGlyZWN0ZWQpOworICAgIERlbGV0ZUZpbGUodGVtcG5hbWUpOworICAgIHJldHVybiByYzsKIH0KIAogCiBzdGF0aWMgQk9PTCBTeXN0ZW1FcnJvcihpbnQgZXJyb3IsIGNoYXIgKm1zZykKIHsKLQljaGFyIEJ1ZmZlclsxMDI0XTsKLQlpbnQgbjsKKyAgICBjaGFyIEJ1ZmZlclsxMDI0XTsKKyAgICBpbnQgbjsKIAotCWlmIChlcnJvcikgewotCQlMUFZPSUQgbHBNc2dCdWY7Ci0JCUZvcm1hdE1lc3NhZ2UoIAotCQkJRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwgCi0JCQlGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSwKLQkJCU5VTEwsCi0JCQllcnJvciwKLQkJCU1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLCBTVUJMQU5HX0RFRkFVTFQpLAotCQkJKExQU1RSKSZscE1zZ0J1ZiwKLQkJCTAsCi0JCQlOVUxMIAotCQkJKTsKLQkJc3RybmNweShCdWZmZXIsIGxwTXNnQnVmLCBzaXplb2YoQnVmZmVyKSk7Ci0JCUxvY2FsRnJlZShscE1zZ0J1Zik7Ci0JfSBlbHNlCi0JCUJ1ZmZlclswXSA9ICdcMCc7Ci0JbiA9IGxzdHJsZW4oQnVmZmVyKTsKLQlfc25wcmludGYoQnVmZmVyK24sIHNpemVvZihCdWZmZXIpLW4sIG1zZyk7Ci0JTWVzc2FnZUJveChod25kTWFpbiwgQnVmZmVyLCAiUnVudGltZSBFcnJvciIsIE1CX09LIHwgTUJfSUNPTlNUT1ApOwotCXJldHVybiBGQUxTRTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgTFBWT0lEIGxwTXNnQnVmOworICAgICAgICBGb3JtYXRNZXNzYWdlKAorICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwKKyAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgIGVycm9yLAorICAgICAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsIFNVQkxBTkdfREVGQVVMVCksCisgICAgICAgICAgICAoTFBTVFIpJmxwTXNnQnVmLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICk7CisgICAgICAgIHN0cm5jcHkoQnVmZmVyLCBscE1zZ0J1Ziwgc2l6ZW9mKEJ1ZmZlcikpOworICAgICAgICBMb2NhbEZyZWUobHBNc2dCdWYpOworICAgIH0gZWxzZQorICAgICAgICBCdWZmZXJbMF0gPSAnXDAnOworICAgIG4gPSBsc3RybGVuKEJ1ZmZlcik7CisgICAgX3NucHJpbnRmKEJ1ZmZlcituLCBzaXplb2YoQnVmZmVyKS1uLCBtc2cpOworICAgIE1lc3NhZ2VCb3goaHduZE1haW4sIEJ1ZmZlciwgIlJ1bnRpbWUgRXJyb3IiLCBNQl9PSyB8IE1CX0lDT05TVE9QKTsKKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKIHN0YXRpYyBCT09MIG5vdGlmeSAoaW50IGNvZGUsIGNoYXIgKmZtdCwgLi4uKQogewotCWNoYXIgQnVmZmVyWzEwMjRdOwotCXZhX2xpc3QgbWFya2VyOwotCUJPT0wgcmVzdWx0ID0gVFJVRTsKLQlpbnQgYSwgYjsKLQljaGFyICpjcDsKKyAgICBjaGFyIEJ1ZmZlclsxMDI0XTsKKyAgICB2YV9saXN0IG1hcmtlcjsKKyAgICBCT09MIHJlc3VsdCA9IFRSVUU7CisgICAgaW50IGEsIGI7CisgICAgY2hhciAqY3A7CiAKLQl2YV9zdGFydChtYXJrZXIsIGZtdCk7Ci0JX3ZzbnByaW50ZihCdWZmZXIsIHNpemVvZihCdWZmZXIpLCBmbXQsIG1hcmtlcik7CisgICAgdmFfc3RhcnQobWFya2VyLCBmbXQpOworICAgIF92c25wcmludGYoQnVmZmVyLCBzaXplb2YoQnVmZmVyKSwgZm10LCBtYXJrZXIpOwogCi0Jc3dpdGNoIChjb2RlKSB7CisgICAgc3dpdGNoIChjb2RlKSB7CiAvKiBRdWVzdGlvbnMgKi8KLQljYXNlIENBTl9PVkVSV1JJVEU6Ci0JCWJyZWFrOworICAgIGNhc2UgQ0FOX09WRVJXUklURToKKyAgICAgICAgYnJlYWs7CiAKIC8qIEluZm9ybWF0aW9uIG5vdGlmaWNhdGlvbiAqLwotCWNhc2UgRElSX0NSRUFURUQ6Ci0JCWlmIChsb2dmaWxlKQotCQkJZnByaW50Zihsb2dmaWxlLCAiMTAwIE1hZGUgRGlyOiAlc1xuIiwgZm10KTsKLQkJYnJlYWs7CisgICAgY2FzZSBESVJfQ1JFQVRFRDoKKyAgICAgICAgaWYgKGxvZ2ZpbGUpCisgICAgICAgICAgICBmcHJpbnRmKGxvZ2ZpbGUsICIxMDAgTWFkZSBEaXI6ICVzXG4iLCBmbXQpOworICAgICAgICBicmVhazsKIAotCWNhc2UgRklMRV9DUkVBVEVEOgotCQlpZiAobG9nZmlsZSkKLQkJCWZwcmludGYobG9nZmlsZSwgIjIwMCBGaWxlIENvcHk6ICVzXG4iLCBmbXQpOwotCQlnb3RvIGFkZF90b19maWxlbGlzdF9sYWJlbDsKLQkJYnJlYWs7CisgICAgY2FzZSBGSUxFX0NSRUFURUQ6CisgICAgICAgIGlmIChsb2dmaWxlKQorICAgICAgICAgICAgZnByaW50Zihsb2dmaWxlLCAiMjAwIEZpbGUgQ29weTogJXNcbiIsIGZtdCk7CisgICAgICAgIGdvdG8gYWRkX3RvX2ZpbGVsaXN0X2xhYmVsOworICAgICAgICBicmVhazsKIAotCWNhc2UgRklMRV9PVkVSV1JJVFRFTjoKLQkJaWYgKGxvZ2ZpbGUpCi0JCQlmcHJpbnRmKGxvZ2ZpbGUsICIyMDAgRmlsZSBPdmVyd3JpdGU6ICVzXG4iLCBmbXQpOwotCSAgYWRkX3RvX2ZpbGVsaXN0X2xhYmVsOgotCQlpZiAoKGNwID0gc3RycmNocihmbXQsICcuJykpICYmICgwID09IHN0cmNtcCAoY3AsICIucHkiKSkpCi0JCQlhZGRfdG9fZmlsZWxpc3QoZm10KTsKLQkJYnJlYWs7CisgICAgY2FzZSBGSUxFX09WRVJXUklUVEVOOgorICAgICAgICBpZiAobG9nZmlsZSkKKyAgICAgICAgICAgIGZwcmludGYobG9nZmlsZSwgIjIwMCBGaWxlIE92ZXJ3cml0ZTogJXNcbiIsIGZtdCk7CisgICAgICBhZGRfdG9fZmlsZWxpc3RfbGFiZWw6CisgICAgICAgIGlmICgoY3AgPSBzdHJyY2hyKGZtdCwgJy4nKSkgJiYgKDAgPT0gc3RyY21wIChjcCwgIi5weSIpKSkKKyAgICAgICAgICAgIGFkZF90b19maWxlbGlzdChmbXQpOworICAgICAgICBicmVhazsKIAogLyogRXJyb3IgTWVzc2FnZXMgKi8KLQljYXNlIFpMSUJfRVJST1I6Ci0JCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgQnVmZmVyLCAiRXJyb3IiLAotCQkJICAgIE1CX09LIHwgTUJfSUNPTldBUk5JTkcpOwotCQlicmVhazsKKyAgICBjYXNlIFpMSUJfRVJST1I6CisgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgQnVmZmVyLCAiRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICBNQl9PSyB8IE1CX0lDT05XQVJOSU5HKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFNZU1RFTV9FUlJPUjoKLQkJU3lzdGVtRXJyb3IoR2V0TGFzdEVycm9yKCksIEJ1ZmZlcik7Ci0JCWJyZWFrOworICAgIGNhc2UgU1lTVEVNX0VSUk9SOgorICAgICAgICBTeXN0ZW1FcnJvcihHZXRMYXN0RXJyb3IoKSwgQnVmZmVyKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIE5VTV9GSUxFUzoKLQkJYSA9IHZhX2FyZyhtYXJrZXIsIGludCk7Ci0JCWIgPSB2YV9hcmcobWFya2VyLCBpbnQpOwotCQlTZW5kTWVzc2FnZShoRGlhbG9nLCBXTV9OVU1GSUxFUywgMCwgTUFLRUxQQVJBTSgwLCBhKSk7Ci0JCVNlbmRNZXNzYWdlKGhEaWFsb2csIFdNX05FWFRGSUxFLCBiLChMUEFSQU0pZm10KTsKLQl9Ci0JdmFfZW5kKG1hcmtlcik7Ci0gICAgCi0JcmV0dXJuIHJlc3VsdDsKKyAgICBjYXNlIE5VTV9GSUxFUzoKKyAgICAgICAgYSA9IHZhX2FyZyhtYXJrZXIsIGludCk7CisgICAgICAgIGIgPSB2YV9hcmcobWFya2VyLCBpbnQpOworICAgICAgICBTZW5kTWVzc2FnZShoRGlhbG9nLCBXTV9OVU1GSUxFUywgMCwgTUFLRUxQQVJBTSgwLCBhKSk7CisgICAgICAgIFNlbmRNZXNzYWdlKGhEaWFsb2csIFdNX05FWFRGSUxFLCBiLChMUEFSQU0pZm10KTsKKyAgICB9CisgICAgdmFfZW5kKG1hcmtlcik7CisKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgY2hhciAqTWFwRXhpc3RpbmdGaWxlKGNoYXIgKnBhdGhuYW1lLCBEV09SRCAqcHNpemUpCiB7Ci0JSEFORExFIGhGaWxlLCBoRmlsZU1hcHBpbmc7Ci0JRFdPUkQgblNpemVMb3csIG5TaXplSGlnaDsKLQljaGFyICpkYXRhOworICAgIEhBTkRMRSBoRmlsZSwgaEZpbGVNYXBwaW5nOworICAgIERXT1JEIG5TaXplTG93LCBuU2l6ZUhpZ2g7CisgICAgY2hhciAqZGF0YTsKIAotCWhGaWxlID0gQ3JlYXRlRmlsZShwYXRobmFtZSwKLQkJCSAgICBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKLQkJCSAgICBPUEVOX0VYSVNUSU5HLAotCQkJICAgIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgTlVMTCk7Ci0JaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotCQlyZXR1cm4gTlVMTDsKLQluU2l6ZUxvdyA9IEdldEZpbGVTaXplKGhGaWxlLCAmblNpemVIaWdoKTsKLQloRmlsZU1hcHBpbmcgPSBDcmVhdGVGaWxlTWFwcGluZyhoRmlsZSwKLQkJCQkJICBOVUxMLCBQQUdFX1JFQURPTkxZLCAwLCAwLCBOVUxMKTsKLQlDbG9zZUhhbmRsZShoRmlsZSk7CisgICAgaEZpbGUgPSBDcmVhdGVGaWxlKHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFELCBGSUxFX1NIQVJFX1JFQUQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKKyAgICBpZiAoaEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5TaXplTG93ID0gR2V0RmlsZVNpemUoaEZpbGUsICZuU2l6ZUhpZ2gpOworICAgIGhGaWxlTWFwcGluZyA9IENyZWF0ZUZpbGVNYXBwaW5nKGhGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBQQUdFX1JFQURPTkxZLCAwLCAwLCBOVUxMKTsKKyAgICBDbG9zZUhhbmRsZShoRmlsZSk7CiAKLQlpZiAoaEZpbGVNYXBwaW5nID09IElOVkFMSURfSEFORExFX1ZBTFVFKQotCQlyZXR1cm4gTlVMTDsKLSAgICAKLQlkYXRhID0gTWFwVmlld09mRmlsZShoRmlsZU1hcHBpbmcsCi0JCQkgICAgICBGSUxFX01BUF9SRUFELCAwLCAwLCAwKTsKKyAgICBpZiAoaEZpbGVNYXBwaW5nID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCUNsb3NlSGFuZGxlKGhGaWxlTWFwcGluZyk7Ci0JKnBzaXplID0gblNpemVMb3c7Ci0JcmV0dXJuIGRhdGE7CisgICAgZGF0YSA9IE1hcFZpZXdPZkZpbGUoaEZpbGVNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX01BUF9SRUFELCAwLCAwLCAwKTsKKworICAgIENsb3NlSGFuZGxlKGhGaWxlTWFwcGluZyk7CisgICAgKnBzaXplID0gblNpemVMb3c7CisgICAgcmV0dXJuIGRhdGE7CiB9CiAKIAogc3RhdGljIHZvaWQgY3JlYXRlX2JpdG1hcChIV05EIGh3bmQpCiB7Ci0JQklUTUFQRklMRUhFQURFUiAqYmZoOwotCUJJVE1BUElORk8gKmJpOwotCUhEQyBoZGM7CisgICAgQklUTUFQRklMRUhFQURFUiAqYmZoOworICAgIEJJVE1BUElORk8gKmJpOworICAgIEhEQyBoZGM7CiAKLQlpZiAoIWJpdG1hcF9ieXRlcykKLQkJcmV0dXJuOworICAgIGlmICghYml0bWFwX2J5dGVzKQorICAgICAgICByZXR1cm47CiAKLQlpZiAoaEJpdG1hcCkKLQkJcmV0dXJuOworICAgIGlmIChoQml0bWFwKQorICAgICAgICByZXR1cm47CiAKLQloZGMgPSBHZXREQyhod25kKTsKKyAgICBoZGMgPSBHZXREQyhod25kKTsKIAotCWJmaCA9IChCSVRNQVBGSUxFSEVBREVSICopYml0bWFwX2J5dGVzOwotCWJpID0gKEJJVE1BUElORk8gKikoYml0bWFwX2J5dGVzICsgc2l6ZW9mKEJJVE1BUEZJTEVIRUFERVIpKTsKKyAgICBiZmggPSAoQklUTUFQRklMRUhFQURFUiAqKWJpdG1hcF9ieXRlczsKKyAgICBiaSA9IChCSVRNQVBJTkZPICopKGJpdG1hcF9ieXRlcyArIHNpemVvZihCSVRNQVBGSUxFSEVBREVSKSk7CiAKLQloQml0bWFwID0gQ3JlYXRlRElCaXRtYXAoaGRjLAotCQkJCSAmYmktPmJtaUhlYWRlciwKLQkJCQkgQ0JNX0lOSVQsCi0JCQkJIGJpdG1hcF9ieXRlcyArIGJmaC0+YmZPZmZCaXRzLAotCQkJCSBiaSwKLQkJCQkgRElCX1JHQl9DT0xPUlMpOwotCVJlbGVhc2VEQyhod25kLCBoZGMpOworICAgIGhCaXRtYXAgPSBDcmVhdGVESUJpdG1hcChoZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiaS0+Ym1pSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQk1fSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwX2J5dGVzICsgYmZoLT5iZk9mZkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUJfUkdCX0NPTE9SUyk7CisgICAgUmVsZWFzZURDKGh3bmQsIGhkYyk7CiB9CiAKIC8qIEV4dHJhY3QgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIGJlZ2luIHRoZSBpbnN0YWxsYXRpb24uICBDdXJyZW50bHkgdGhpcwogICAgaXMgdGhlIElOSSBmaWxlbmFtZSB3aXRoIGluc3RhbGwgZGF0YSwgYW5kIHRoZSByYXcgcHJlLWluc3RhbGwgc2NyaXB0CiAqLwogc3RhdGljIEJPT0wgRXh0cmFjdEluc3RhbGxEYXRhKGNoYXIgKmRhdGEsIERXT1JEIHNpemUsIGludCAqcGV4ZV9zaXplLAotCQkJICAgICAgIGNoYXIgKipvdXRfaW5pX2ZpbGUsIGNoYXIgKipvdXRfcHJlaW5zdGFsbF9zY3JpcHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKm91dF9pbmlfZmlsZSwgY2hhciAqKm91dF9wcmVpbnN0YWxsX3NjcmlwdCkKIHsKLQkvKiByZWFkIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICovCi0Jc3RydWN0IGVvZl9jZGlyICpwZSA9IChzdHJ1Y3QgZW9mX2NkaXIgKikmZGF0YVtzaXplIC0gc2l6ZW9mCi0JCQkJCQkgICAgICAgKHN0cnVjdCBlb2ZfY2RpcildOwotICAgIAotCWludCBhcmNfc3RhcnQgPSBzaXplIC0gc2l6ZW9mIChzdHJ1Y3QgZW9mX2NkaXIpIC0gcGUtPm5CeXRlc0NEaXIgLQotCQlwZS0+b2ZzQ0RpcjsKKyAgICAvKiByZWFkIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkICovCisgICAgc3RydWN0IGVvZl9jZGlyICpwZSA9IChzdHJ1Y3QgZW9mX2NkaXIgKikmZGF0YVtzaXplIC0gc2l6ZW9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGVvZl9jZGlyKV07CiAKLQlpbnQgb2ZzID0gYXJjX3N0YXJ0IC0gc2l6ZW9mIChzdHJ1Y3QgbWV0YV9kYXRhX2hkcik7CisgICAgaW50IGFyY19zdGFydCA9IHNpemUgLSBzaXplb2YgKHN0cnVjdCBlb2ZfY2RpcikgLSBwZS0+bkJ5dGVzQ0RpciAtCisgICAgICAgIHBlLT5vZnNDRGlyOwogCi0JLyogcmVhZCBtZXRhX2RhdGEgaW5mbyAqLwotCXN0cnVjdCBtZXRhX2RhdGFfaGRyICpwbWQgPSAoc3RydWN0IG1ldGFfZGF0YV9oZHIgKikmZGF0YVtvZnNdOwotCWNoYXIgKnNyYywgKmRzdDsKLQljaGFyICppbmlfZmlsZTsKLQljaGFyIHRlbXBkaXJbTUFYX1BBVEhdOworICAgIGludCBvZnMgPSBhcmNfc3RhcnQgLSBzaXplb2YgKHN0cnVjdCBtZXRhX2RhdGFfaGRyKTsKIAotCS8qIGVuc3VyZSB0aGF0IGlmIHdlIGZhaWwsIHdlIGRvbid0IGhhdmUgZ2FyYmFnZSBvdXQgcG9pbnRlcnMgKi8KLQkqb3V0X2luaV9maWxlID0gKm91dF9wcmVpbnN0YWxsX3NjcmlwdCA9IE5VTEw7CisgICAgLyogcmVhZCBtZXRhX2RhdGEgaW5mbyAqLworICAgIHN0cnVjdCBtZXRhX2RhdGFfaGRyICpwbWQgPSAoc3RydWN0IG1ldGFfZGF0YV9oZHIgKikmZGF0YVtvZnNdOworICAgIGNoYXIgKnNyYywgKmRzdDsKKyAgICBjaGFyICppbmlfZmlsZTsKKyAgICBjaGFyIHRlbXBkaXJbTUFYX1BBVEhdOwogCi0JaWYgKHBlLT50YWcgIT0gMHgwNjA1NGI1MCkgewotCQlyZXR1cm4gRkFMU0U7Ci0JfQorICAgIC8qIGVuc3VyZSB0aGF0IGlmIHdlIGZhaWwsIHdlIGRvbid0IGhhdmUgZ2FyYmFnZSBvdXQgcG9pbnRlcnMgKi8KKyAgICAqb3V0X2luaV9maWxlID0gKm91dF9wcmVpbnN0YWxsX3NjcmlwdCA9IE5VTEw7CiAKLQlpZiAocG1kLT50YWcgIT0gMHgxMjM0NTY3QikgewotCQlyZXR1cm4gU3lzdGVtRXJyb3IoMCwKLQkJCSAgICJJbnZhbGlkIGNmZ2RhdGEgbWFnaWMgbnVtYmVyIChzZWUgYmRpc3Rfd2luaW5zdC5weSkiKTsKLQl9Ci0JaWYgKG9mcyA8IDApIHsKLQkJcmV0dXJuIEZBTFNFOwotCX0KKyAgICBpZiAocGUtPnRhZyAhPSAweDA2MDU0YjUwKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAKLQlpZiAocG1kLT5iaXRtYXBfc2l6ZSkgewotCQkvKiBTdG9yZSBwb2ludGVyIHRvIGJpdG1hcCBieXRlcyAqLwotCQliaXRtYXBfYnl0ZXMgPSAoY2hhciAqKXBtZCAtIHBtZC0+dW5jb21wX3NpemUgLSBwbWQtPmJpdG1hcF9zaXplOwotCX0KKyAgICBpZiAocG1kLT50YWcgIT0gMHgxMjM0NTY3QikgeworICAgICAgICByZXR1cm4gU3lzdGVtRXJyb3IoMCwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjZmdkYXRhIG1hZ2ljIG51bWJlciAoc2VlIGJkaXN0X3dpbmluc3QucHkpIik7CisgICAgfQorICAgIGlmIChvZnMgPCAwKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAKLQkqcGV4ZV9zaXplID0gb2ZzIC0gcG1kLT51bmNvbXBfc2l6ZSAtIHBtZC0+Yml0bWFwX3NpemU7CisgICAgaWYgKHBtZC0+Yml0bWFwX3NpemUpIHsKKyAgICAgICAgLyogU3RvcmUgcG9pbnRlciB0byBiaXRtYXAgYnl0ZXMgKi8KKyAgICAgICAgYml0bWFwX2J5dGVzID0gKGNoYXIgKilwbWQgLSBwbWQtPnVuY29tcF9zaXplIC0gcG1kLT5iaXRtYXBfc2l6ZTsKKyAgICB9CiAKLQlzcmMgPSAoKGNoYXIgKilwbWQpIC0gcG1kLT51bmNvbXBfc2l6ZTsKLQlpbmlfZmlsZSA9IG1hbGxvYyhNQVhfUEFUSCk7IC8qIHdpbGwgYmUgcmV0dXJuZWQsIHNvIGRvIG5vdCBmcmVlIGl0ICovCi0JaWYgKCFpbmlfZmlsZSkKLQkJcmV0dXJuIEZBTFNFOwotCWlmICghR2V0VGVtcFBhdGgoc2l6ZW9mKHRlbXBkaXIpLCB0ZW1wZGlyKQotCSAgICB8fCAhR2V0VGVtcEZpbGVOYW1lKHRlbXBkaXIsICJ+ZHUiLCAwLCBpbmlfZmlsZSkpIHsKLQkJU3lzdGVtRXJyb3IoR2V0TGFzdEVycm9yKCksCi0JCQkgICAgICJDb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSBmaWxlIik7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0gICAgCi0JZHN0ID0gbWFwX25ld19maWxlKENSRUFURV9BTFdBWVMsIGluaV9maWxlLCBOVUxMLCBwbWQtPnVuY29tcF9zaXplLAotCQkJICAgIDAsIDAsIE5VTEwvKm5vdGlmeSovKTsKLQlpZiAoIWRzdCkKLQkJcmV0dXJuIEZBTFNFOwotCS8qIFVwIHRvIHRoZSBmaXJzdCBcMCBpcyB0aGUgSU5JIGZpbGUgZGF0YS4gKi8KLQlzdHJuY3B5KGRzdCwgc3JjLCBwbWQtPnVuY29tcF9zaXplKTsKLQlzcmMgKz0gc3RybGVuKGRzdCkgKyAxOwotCS8qIFVwIHRvIG5leHQgXDAgaXMgdGhlIHByZS1pbnN0YWxsIHNjcmlwdCAqLwotCSpvdXRfcHJlaW5zdGFsbF9zY3JpcHQgPSBzdHJkdXAoc3JjKTsKLQkqb3V0X2luaV9maWxlID0gaW5pX2ZpbGU7Ci0JVW5tYXBWaWV3T2ZGaWxlKGRzdCk7Ci0JcmV0dXJuIFRSVUU7CisgICAgKnBleGVfc2l6ZSA9IG9mcyAtIHBtZC0+dW5jb21wX3NpemUgLSBwbWQtPmJpdG1hcF9zaXplOworCisgICAgc3JjID0gKChjaGFyICopcG1kKSAtIHBtZC0+dW5jb21wX3NpemU7CisgICAgaW5pX2ZpbGUgPSBtYWxsb2MoTUFYX1BBVEgpOyAvKiB3aWxsIGJlIHJldHVybmVkLCBzbyBkbyBub3QgZnJlZSBpdCAqLworICAgIGlmICghaW5pX2ZpbGUpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIUdldFRlbXBQYXRoKHNpemVvZih0ZW1wZGlyKSwgdGVtcGRpcikKKyAgICAgICAgfHwgIUdldFRlbXBGaWxlTmFtZSh0ZW1wZGlyLCAifmR1IiwgMCwgaW5pX2ZpbGUpKSB7CisgICAgICAgIFN5c3RlbUVycm9yKEdldExhc3RFcnJvcigpLAorICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGRzdCA9IG1hcF9uZXdfZmlsZShDUkVBVEVfQUxXQVlTLCBpbmlfZmlsZSwgTlVMTCwgcG1kLT51bmNvbXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIE5VTEwvKm5vdGlmeSovKTsKKyAgICBpZiAoIWRzdCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIC8qIFVwIHRvIHRoZSBmaXJzdCBcMCBpcyB0aGUgSU5JIGZpbGUgZGF0YS4gKi8KKyAgICBzdHJuY3B5KGRzdCwgc3JjLCBwbWQtPnVuY29tcF9zaXplKTsKKyAgICBzcmMgKz0gc3RybGVuKGRzdCkgKyAxOworICAgIC8qIFVwIHRvIG5leHQgXDAgaXMgdGhlIHByZS1pbnN0YWxsIHNjcmlwdCAqLworICAgICpvdXRfcHJlaW5zdGFsbF9zY3JpcHQgPSBzdHJkdXAoc3JjKTsKKyAgICAqb3V0X2luaV9maWxlID0gaW5pX2ZpbGU7CisgICAgVW5tYXBWaWV3T2ZGaWxlKGRzdCk7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHN0YXRpYyB2b2lkIFB1bXBNZXNzYWdlcyh2b2lkKQogewotCU1TRyBtc2c7Ci0Jd2hpbGUgKFBlZWtNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDAsIFBNX1JFTU9WRSkpIHsKLQkJVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKLQkJRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOwotCX0KKyAgICBNU0cgbXNnOworICAgIHdoaWxlIChQZWVrTWVzc2FnZSgmbXNnLCBOVUxMLCAwLCAwLCBQTV9SRU1PVkUpKSB7CisgICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CisgICAgICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnKTsKKyAgICB9CiB9CiAKIExSRVNVTFQgQ0FMTEJBQ0sKIFdpbmRvd1Byb2MoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlIREMgaGRjOwotCUhGT05UIGhGb250OwotCWludCBoOwotCVBBSU5UU1RSVUNUIHBzOwotCXN3aXRjaCAobXNnKSB7Ci0JY2FzZSBXTV9QQUlOVDoKLQkJaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOwotCQloID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTikgLyAxMDsKLQkJaEZvbnQgPSBDcmVhdGVGb250KGgsIDAsIDAsIDAsIDcwMCwgVFJVRSwKLQkJCQkgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIlRpbWVzIFJvbWFuIik7Ci0JCWhGb250ID0gU2VsZWN0T2JqZWN0KGhkYywgaEZvbnQpOwotCQlTZXRCa01vZGUoaGRjLCBUUkFOU1BBUkVOVCk7Ci0JCVRleHRPdXQoaGRjLCAxNSwgMTUsIHRpdGxlLCBzdHJsZW4odGl0bGUpKTsKLQkJU2V0VGV4dENvbG9yKGhkYywgUkdCKDI1NSwgMjU1LCAyNTUpKTsKLQkJVGV4dE91dChoZGMsIDEwLCAxMCwgdGl0bGUsIHN0cmxlbih0aXRsZSkpOwotCQlEZWxldGVPYmplY3QoU2VsZWN0T2JqZWN0KGhkYywgaEZvbnQpKTsKLQkJRW5kUGFpbnQoaHduZCwgJnBzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiBEZWZXaW5kb3dQcm9jKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOworICAgIEhEQyBoZGM7CisgICAgSEZPTlQgaEZvbnQ7CisgICAgaW50IGg7CisgICAgUEFJTlRTVFJVQ1QgcHM7CisgICAgc3dpdGNoIChtc2cpIHsKKyAgICBjYXNlIFdNX1BBSU5UOgorICAgICAgICBoZGMgPSBCZWdpblBhaW50KGh3bmQsICZwcyk7CisgICAgICAgIGggPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZU0NSRUVOKSAvIDEwOworICAgICAgICBoRm9udCA9IENyZWF0ZUZvbnQoaCwgMCwgMCwgMCwgNzAwLCBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsICJUaW1lcyBSb21hbiIpOworICAgICAgICBoRm9udCA9IFNlbGVjdE9iamVjdChoZGMsIGhGb250KTsKKyAgICAgICAgU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOworICAgICAgICBUZXh0T3V0KGhkYywgMTUsIDE1LCB0aXRsZSwgc3RybGVuKHRpdGxlKSk7CisgICAgICAgIFNldFRleHRDb2xvcihoZGMsIFJHQigyNTUsIDI1NSwgMjU1KSk7CisgICAgICAgIFRleHRPdXQoaGRjLCAxMCwgMTAsIHRpdGxlLCBzdHJsZW4odGl0bGUpKTsKKyAgICAgICAgRGVsZXRlT2JqZWN0KFNlbGVjdE9iamVjdChoZGMsIGhGb250KSk7CisgICAgICAgIEVuZFBhaW50KGh3bmQsICZwcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gRGVmV2luZG93UHJvYyhod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKIH0KIAogc3RhdGljIEhXTkQgQ3JlYXRlQmFja2dyb3VuZChjaGFyICp0aXRsZSkKIHsKLQlXTkRDTEFTUyB3YzsKLQlIV05EIGh3bmQ7Ci0JY2hhciBidWZmZXJbNDA5Nl07CisgICAgV05EQ0xBU1Mgd2M7CisgICAgSFdORCBod25kOworICAgIGNoYXIgYnVmZmVyWzQwOTZdOwogCi0Jd2Muc3R5bGUgPSBDU19WUkVEUkFXIHwgQ1NfSFJFRFJBVzsKLQl3Yy5scGZuV25kUHJvYyA9IFdpbmRvd1Byb2M7Ci0Jd2MuY2JXbmRFeHRyYSA9IDA7Ci0Jd2MuY2JDbHNFeHRyYSA9IDA7Ci0Jd2MuaEluc3RhbmNlID0gR2V0TW9kdWxlSGFuZGxlKE5VTEwpOwotCXdjLmhJY29uID0gTlVMTDsKLQl3Yy5oQ3Vyc29yID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOwotCXdjLmhickJhY2tncm91bmQgPSBDcmVhdGVTb2xpZEJydXNoKFJHQigwLCAwLCAxMjgpKTsKLQl3Yy5scHN6TWVudU5hbWUgPSBOVUxMOwotCXdjLmxwc3pDbGFzc05hbWUgPSAiU2V0dXBXaW5kb3dDbGFzcyI7CisgICAgd2Muc3R5bGUgPSBDU19WUkVEUkFXIHwgQ1NfSFJFRFJBVzsKKyAgICB3Yy5scGZuV25kUHJvYyA9IFdpbmRvd1Byb2M7CisgICAgd2MuY2JXbmRFeHRyYSA9IDA7CisgICAgd2MuY2JDbHNFeHRyYSA9IDA7CisgICAgd2MuaEluc3RhbmNlID0gR2V0TW9kdWxlSGFuZGxlKE5VTEwpOworICAgIHdjLmhJY29uID0gTlVMTDsKKyAgICB3Yy5oQ3Vyc29yID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOworICAgIHdjLmhickJhY2tncm91bmQgPSBDcmVhdGVTb2xpZEJydXNoKFJHQigwLCAwLCAxMjgpKTsKKyAgICB3Yy5scHN6TWVudU5hbWUgPSBOVUxMOworICAgIHdjLmxwc3pDbGFzc05hbWUgPSAiU2V0dXBXaW5kb3dDbGFzcyI7CiAKLQlpZiAoIVJlZ2lzdGVyQ2xhc3MoJndjKSkKLQkJTWVzc2FnZUJveChod25kTWFpbiwKLQkJCSAgICAiQ291bGQgbm90IHJlZ2lzdGVyIHdpbmRvdyBjbGFzcyIsCi0JCQkgICAgIlNldHVwLmV4ZSIsIE1CX09LKTsKKyAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MoJndjKSkKKyAgICAgICAgTWVzc2FnZUJveChod25kTWFpbiwKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZWdpc3RlciB3aW5kb3cgY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAiU2V0dXAuZXhlIiwgTUJfT0spOwogCi0Jd3NwcmludGYoYnVmZmVyLCAiU2V0dXAgJXMiLCB0aXRsZSk7Ci0JaHduZCA9IENyZWF0ZVdpbmRvdygiU2V0dXBXaW5kb3dDbGFzcyIsCi0JCQkgICAgIGJ1ZmZlciwKLQkJCSAgICAgMCwKLQkJCSAgICAgMCwgMCwKLQkJCSAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWEZVTExTQ1JFRU4pLAotCQkJICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZRlVMTFNDUkVFTiksCi0JCQkgICAgIE5VTEwsCi0JCQkgICAgIE5VTEwsCi0JCQkgICAgIEdldE1vZHVsZUhhbmRsZShOVUxMKSwKLQkJCSAgICAgTlVMTCk7Ci0JU2hvd1dpbmRvdyhod25kLCBTV19TSE9XTUFYSU1JWkVEKTsKLQlVcGRhdGVXaW5kb3coaHduZCk7Ci0JcmV0dXJuIGh3bmQ7CisgICAgd3NwcmludGYoYnVmZmVyLCAiU2V0dXAgJXMiLCB0aXRsZSk7CisgICAgaHduZCA9IENyZWF0ZVdpbmRvdygiU2V0dXBXaW5kb3dDbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYRlVMTFNDUkVFTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U3lzdGVtTWV0cmljcyhTTV9DWUZVTExTQ1JFRU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgU2hvd1dpbmRvdyhod25kLCBTV19TSE9XTUFYSU1JWkVEKTsKKyAgICBVcGRhdGVXaW5kb3coaHduZCk7CisgICAgcmV0dXJuIGh3bmQ7CiB9CiAKIC8qCkBAIC0xMTcwLDE2ICsxMTcwLDE2IEBACiAgKi8KIHN0YXRpYyB2b2lkIENlbnRlcldpbmRvdyhIV05EIGh3bmQpCiB7Ci0JUkVDVCByYzsKLQlpbnQgdywgaDsKKyAgICBSRUNUIHJjOworICAgIGludCB3LCBoOwogCi0JR2V0V2luZG93UmVjdChod25kLCAmcmMpOwotCXcgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKLQloID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7Ci0JTW92ZVdpbmRvdyhod25kLAotCQkgICAodyAtIChyYy5yaWdodC1yYy5sZWZ0KSkvMiwKLQkJICAgKGggLSAocmMuYm90dG9tLXJjLnRvcCkpLzIsCi0JCSAgICByYy5yaWdodC1yYy5sZWZ0LCByYy5ib3R0b20tcmMudG9wLCBGQUxTRSk7CisgICAgR2V0V2luZG93UmVjdChod25kLCAmcmMpOworICAgIHcgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYU0NSRUVOKTsKKyAgICBoID0gR2V0U3lzdGVtTWV0cmljcyhTTV9DWVNDUkVFTik7CisgICAgTW92ZVdpbmRvdyhod25kLAorICAgICAgICAgICAgICAgKHcgLSAocmMucmlnaHQtcmMubGVmdCkpLzIsCisgICAgICAgICAgICAgICAoaCAtIChyYy5ib3R0b20tcmMudG9wKSkvMiwKKyAgICAgICAgICAgICAgICByYy5yaWdodC1yYy5sZWZ0LCByYy5ib3R0b20tcmMudG9wLCBGQUxTRSk7CiB9CiAKICNpbmNsdWRlIDxwcnNodC5oPgpAQCAtMTE4Nyw0NSArMTE4Nyw0NSBAQAogQk9PTCBDQUxMQkFDSwogSW50cm9EbGdQcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JTFBOTUhEUiBscG5tOwotCWNoYXIgQnVmZmVyWzQwOTZdOworICAgIExQTk1IRFIgbHBubTsKKyAgICBjaGFyIEJ1ZmZlcls0MDk2XTsKIAotCXN3aXRjaCAobXNnKSB7Ci0JY2FzZSBXTV9JTklURElBTE9HOgotCQljcmVhdGVfYml0bWFwKGh3bmQpOwotCQlpZihoQml0bWFwKQotCQkJU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19CSVRNQVAsIFNUTV9TRVRJTUFHRSwKLQkJCQkJICAgSU1BR0VfQklUTUFQLCAoTFBBUkFNKWhCaXRtYXApOwotCQlDZW50ZXJXaW5kb3coR2V0UGFyZW50KGh3bmQpKTsKLQkJd3NwcmludGYoQnVmZmVyLAotCQkJICAiVGhpcyBXaXphcmQgd2lsbCBpbnN0YWxsICVzIG9uIHlvdXIgY29tcHV0ZXIuICIKLQkJCSAgIkNsaWNrIE5leHQgdG8gY29udGludWUgIgotCQkJICAib3IgQ2FuY2VsIHRvIGV4aXQgdGhlIFNldHVwIFdpemFyZC4iLAotCQkJICBtZXRhX25hbWUpOwotCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsIEJ1ZmZlcik7Ci0JCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTlRST19URVhULCBpbmZvKTsKLQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0JVSUxEX0lORk8sIGJ1aWxkX2luZm8pOwotCQlyZXR1cm4gRkFMU0U7CisgICAgc3dpdGNoIChtc2cpIHsKKyAgICBjYXNlIFdNX0lOSVRESUFMT0c6CisgICAgICAgIGNyZWF0ZV9iaXRtYXAoaHduZCk7CisgICAgICAgIGlmKGhCaXRtYXApCisgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX0JJVE1BUCwgU1RNX1NFVElNQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0JJVE1BUCwgKExQQVJBTSloQml0bWFwKTsKKyAgICAgICAgQ2VudGVyV2luZG93KEdldFBhcmVudChod25kKSk7CisgICAgICAgIHdzcHJpbnRmKEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICJUaGlzIFdpemFyZCB3aWxsIGluc3RhbGwgJXMgb24geW91ciBjb21wdXRlci4gIgorICAgICAgICAgICAgICAgICAgIkNsaWNrIE5leHQgdG8gY29udGludWUgIgorICAgICAgICAgICAgICAgICAgIm9yIENhbmNlbCB0byBleGl0IHRoZSBTZXR1cCBXaXphcmQuIiwKKyAgICAgICAgICAgICAgICAgIG1ldGFfbmFtZSk7CisgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwgQnVmZmVyKTsKKyAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lOVFJPX1RFWFQsIGluZm8pOworICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfQlVJTERfSU5GTywgYnVpbGRfaW5mbyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKIAotCWNhc2UgV01fTk9USUZZOgotCQlscG5tID0gKExQTk1IRFIpIGxQYXJhbTsKKyAgICBjYXNlIFdNX05PVElGWToKKyAgICAgICAgbHBubSA9IChMUE5NSERSKSBsUGFyYW07CiAKLQkJc3dpdGNoIChscG5tLT5jb2RlKSB7Ci0JCWNhc2UgUFNOX1NFVEFDVElWRToKLQkJCVByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwgUFNXSVpCX05FWFQpOwotCQkJYnJlYWs7CisgICAgICAgIHN3aXRjaCAobHBubS0+Y29kZSkgeworICAgICAgICBjYXNlIFBTTl9TRVRBQ1RJVkU6CisgICAgICAgICAgICBQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksIFBTV0laQl9ORVhUKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1dJWk5FWFQ6Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBQU05fV0laTkVYVDoKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1JFU0VUOgotCQkJYnJlYWs7Ci0JCQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIEZBTFNFOworICAgICAgICBjYXNlIFBTTl9SRVNFVDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7CiB9CiAKICNpZmRlZiBVU0VfT1RIRVJfUFlUSE9OX1ZFUlNJT05TCkBAIC0xMjM3LDEzMyArMTIzNywxMzMgQEAKIGludCBib3VuZF9pbWFnZV9taW5vcjsKIAogc3RhdGljIEJPT0wgX19zdGRjYWxsIFN0YXR1c1JvdXRpbmUoSU1BR0VITFBfU1RBVFVTX1JFQVNPTiByZWFzb24sCi0JCQkJICAgIFBTVFIgSW1hZ2VOYW1lLAotCQkJCSAgICBQU1RSIERsbE5hbWUsCi0JCQkJICAgIFVMT05HIFZhLAotCQkJCSAgICBVTE9ORyBQYXJhbWV0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1RSIEltYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTVFIgRGxsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIFZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcgUGFyYW1ldGVyKQogewotCWNoYXIgZm5hbWVbX01BWF9QQVRIXTsKLQlpbnQgaW50X3ZlcnNpb247CisgICAgY2hhciBmbmFtZVtfTUFYX1BBVEhdOworICAgIGludCBpbnRfdmVyc2lvbjsKIAotCXN3aXRjaChyZWFzb24pIHsKLQljYXNlIEJpbmRPdXRPZk1lbW9yeToKLQljYXNlIEJpbmRSdmFUb1ZhRmFpbGVkOgotCWNhc2UgQmluZE5vUm9vbUluSW1hZ2U6Ci0JY2FzZSBCaW5kSW1wb3J0UHJvY2VkdXJlRmFpbGVkOgotCQlicmVhazsKKyAgICBzd2l0Y2gocmVhc29uKSB7CisgICAgY2FzZSBCaW5kT3V0T2ZNZW1vcnk6CisgICAgY2FzZSBCaW5kUnZhVG9WYUZhaWxlZDoKKyAgICBjYXNlIEJpbmROb1Jvb21JbkltYWdlOgorICAgIGNhc2UgQmluZEltcG9ydFByb2NlZHVyZUZhaWxlZDoKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIEJpbmRJbXBvcnRQcm9jZWR1cmU6Ci0JY2FzZSBCaW5kRm9yd2FyZGVyOgotCWNhc2UgQmluZEZvcndhcmRlck5PVDoKLQljYXNlIEJpbmRJbWFnZU1vZGlmaWVkOgotCWNhc2UgQmluZEV4cGFuZEZpbGVIZWFkZXJzOgotCWNhc2UgQmluZEltYWdlQ29tcGxldGU6Ci0JY2FzZSBCaW5kU3ltYm9sc05vdFVwZGF0ZWQ6Ci0JY2FzZSBCaW5kTWlzbWF0Y2hlZFN5bWJvbHM6Ci0JY2FzZSBCaW5kSW1wb3J0TW9kdWxlRmFpbGVkOgotCQlicmVhazsKKyAgICBjYXNlIEJpbmRJbXBvcnRQcm9jZWR1cmU6CisgICAgY2FzZSBCaW5kRm9yd2FyZGVyOgorICAgIGNhc2UgQmluZEZvcndhcmRlck5PVDoKKyAgICBjYXNlIEJpbmRJbWFnZU1vZGlmaWVkOgorICAgIGNhc2UgQmluZEV4cGFuZEZpbGVIZWFkZXJzOgorICAgIGNhc2UgQmluZEltYWdlQ29tcGxldGU6CisgICAgY2FzZSBCaW5kU3ltYm9sc05vdFVwZGF0ZWQ6CisgICAgY2FzZSBCaW5kTWlzbWF0Y2hlZFN5bWJvbHM6CisgICAgY2FzZSBCaW5kSW1wb3J0TW9kdWxlRmFpbGVkOgorICAgICAgICBicmVhazsKIAotCWNhc2UgQmluZEltcG9ydE1vZHVsZToKLQkJaWYgKDEgPT0gc3NjYW5mKERsbE5hbWUsICJweXRob24lZCIsICZpbnRfdmVyc2lvbikpIHsKLQkJCVNlYXJjaFBhdGgoTlVMTCwgRGxsTmFtZSwgTlVMTCwgc2l6ZW9mKGZuYW1lKSwKLQkJCQkgICBmbmFtZSwgTlVMTCk7Ci0JCQlzdHJjcHkoYm91bmRfaW1hZ2VfZGxsLCBmbmFtZSk7Ci0JCQlib3VuZF9pbWFnZV9tYWpvciA9IGludF92ZXJzaW9uIC8gMTA7Ci0JCQlib3VuZF9pbWFnZV9taW5vciA9IGludF92ZXJzaW9uICUgMTA7Ci0JCQlPdXRwdXREZWJ1Z1N0cmluZygiQk9VTkQgIik7Ci0JCQlPdXRwdXREZWJ1Z1N0cmluZyhmbmFtZSk7Ci0JCQlPdXRwdXREZWJ1Z1N0cmluZygiXG4iKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgY2FzZSBCaW5kSW1wb3J0TW9kdWxlOgorICAgICAgICBpZiAoMSA9PSBzc2NhbmYoRGxsTmFtZSwgInB5dGhvbiVkIiwgJmludF92ZXJzaW9uKSkgeworICAgICAgICAgICAgU2VhcmNoUGF0aChOVUxMLCBEbGxOYW1lLCBOVUxMLCBzaXplb2YoZm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwgTlVMTCk7CisgICAgICAgICAgICBzdHJjcHkoYm91bmRfaW1hZ2VfZGxsLCBmbmFtZSk7CisgICAgICAgICAgICBib3VuZF9pbWFnZV9tYWpvciA9IGludF92ZXJzaW9uIC8gMTA7CisgICAgICAgICAgICBib3VuZF9pbWFnZV9taW5vciA9IGludF92ZXJzaW9uICUgMTA7CisgICAgICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZygiQk9VTkQgIik7CisgICAgICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZyhmbmFtZSk7CisgICAgICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZygiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qCiAgKi8KIHN0YXRpYyBMUFNUUiBnZXRfc3lzX3ByZWZpeChMUFNUUiBleGUsIExQU1RSIGRsbCkKIHsKLQl2b2lkIChfX2NkZWNsICogUHlfSW5pdGlhbGl6ZSkodm9pZCk7Ci0Jdm9pZCAoX19jZGVjbCAqIFB5X1NldFByb2dyYW1OYW1lKShjaGFyICopOwotCXZvaWQgKF9fY2RlY2wgKiBQeV9GaW5hbGl6ZSkodm9pZCk7Ci0Jdm9pZCogKF9fY2RlY2wgKiBQeVN5c19HZXRPYmplY3QpKGNoYXIgKik7Ci0Jdm9pZCAoX19jZGVjbCAqIFB5U3lzX1NldEFyZ3YpKGludCwgY2hhciAqKik7Ci0JY2hhciogKF9fY2RlY2wgKiBQeV9HZXRQcmVmaXgpKHZvaWQpOwotCWNoYXIqIChfX2NkZWNsICogUHlfR2V0UGF0aCkodm9pZCk7Ci0JSElOU1RBTkNFIGhQeXRob247Ci0JTFBTVFIgcHJlZml4ID0gTlVMTDsKLQlpbnQgKF9fY2RlY2wgKiBQeVJ1bl9TaW1wbGVTdHJpbmcpKGNoYXIgKik7CisgICAgdm9pZCAoX19jZGVjbCAqIFB5X0luaXRpYWxpemUpKHZvaWQpOworICAgIHZvaWQgKF9fY2RlY2wgKiBQeV9TZXRQcm9ncmFtTmFtZSkoY2hhciAqKTsKKyAgICB2b2lkIChfX2NkZWNsICogUHlfRmluYWxpemUpKHZvaWQpOworICAgIHZvaWQqIChfX2NkZWNsICogUHlTeXNfR2V0T2JqZWN0KShjaGFyICopOworICAgIHZvaWQgKF9fY2RlY2wgKiBQeVN5c19TZXRBcmd2KShpbnQsIGNoYXIgKiopOworICAgIGNoYXIqIChfX2NkZWNsICogUHlfR2V0UHJlZml4KSh2b2lkKTsKKyAgICBjaGFyKiAoX19jZGVjbCAqIFB5X0dldFBhdGgpKHZvaWQpOworICAgIEhJTlNUQU5DRSBoUHl0aG9uOworICAgIExQU1RSIHByZWZpeCA9IE5VTEw7CisgICAgaW50IChfX2NkZWNsICogUHlSdW5fU2ltcGxlU3RyaW5nKShjaGFyICopOwogCi0JewotCQljaGFyIEJ1ZmZlclsyNTZdOwotCQl3c3ByaW50ZihCdWZmZXIsICJQWVRIT05IT01FPSVzIiwgZXhlKTsKLQkJKnN0cnJjaHIoQnVmZmVyLCAnXFwnKSA9ICdcMCc7Ci0vLwlNZXNzYWdlQm94KEdldEZvY3VzKCksIEJ1ZmZlciwgIlBZVEhPTkhPTUUiLCBNQl9PSyk7Ci0JCV9wdXRlbnYoQnVmZmVyKTsKLQkJX3B1dGVudigiUFlUSE9OUEFUSD0iKTsKLQl9CisgICAgeworICAgICAgICBjaGFyIEJ1ZmZlclsyNTZdOworICAgICAgICB3c3ByaW50ZihCdWZmZXIsICJQWVRIT05IT01FPSVzIiwgZXhlKTsKKyAgICAgICAgKnN0cnJjaHIoQnVmZmVyLCAnXFwnKSA9ICdcMCc7CisvLyAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgQnVmZmVyLCAiUFlUSE9OSE9NRSIsIE1CX09LKTsKKyAgICAgICAgICAgICAgICBfcHV0ZW52KEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgX3B1dGVudigiUFlUSE9OUEFUSD0iKTsKKyAgICB9CiAKLQloUHl0aG9uID0gTG9hZExpYnJhcnkoZGxsKTsKLQlpZiAoIWhQeXRob24pCi0JCXJldHVybiBOVUxMOwotCVB5X0luaXRpYWxpemUgPSAodm9pZCAoKikodm9pZCkpR2V0UHJvY0FkZHJlc3MKLQkJKGhQeXRob24sIlB5X0luaXRpYWxpemUiKTsKKyAgICBoUHl0aG9uID0gTG9hZExpYnJhcnkoZGxsKTsKKyAgICBpZiAoIWhQeXRob24pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0luaXRpYWxpemUgPSAodm9pZCAoKikodm9pZCkpR2V0UHJvY0FkZHJlc3MKKyAgICAgICAgKGhQeXRob24sIlB5X0luaXRpYWxpemUiKTsKIAotCVB5U3lzX1NldEFyZ3YgPSAodm9pZCAoKikoaW50LCBjaGFyICoqKSlHZXRQcm9jQWRkcmVzcwotCQkoaFB5dGhvbiwiUHlTeXNfU2V0QXJndiIpOworICAgIFB5U3lzX1NldEFyZ3YgPSAodm9pZCAoKikoaW50LCBjaGFyICoqKSlHZXRQcm9jQWRkcmVzcworICAgICAgICAoaFB5dGhvbiwiUHlTeXNfU2V0QXJndiIpOwogCi0JUHlSdW5fU2ltcGxlU3RyaW5nID0gKGludCAoKikoY2hhciAqKSlHZXRQcm9jQWRkcmVzcwotCQkoaFB5dGhvbiwiUHlSdW5fU2ltcGxlU3RyaW5nIik7CisgICAgUHlSdW5fU2ltcGxlU3RyaW5nID0gKGludCAoKikoY2hhciAqKSlHZXRQcm9jQWRkcmVzcworICAgICAgICAoaFB5dGhvbiwiUHlSdW5fU2ltcGxlU3RyaW5nIik7CiAKLQlQeV9TZXRQcm9ncmFtTmFtZSA9ICh2b2lkICgqKShjaGFyICopKUdldFByb2NBZGRyZXNzCi0JCShoUHl0aG9uLCJQeV9TZXRQcm9ncmFtTmFtZSIpOworICAgIFB5X1NldFByb2dyYW1OYW1lID0gKHZvaWQgKCopKGNoYXIgKikpR2V0UHJvY0FkZHJlc3MKKyAgICAgICAgKGhQeXRob24sIlB5X1NldFByb2dyYW1OYW1lIik7CiAKLQlQeVN5c19HZXRPYmplY3QgPSAodm9pZCogKCopKGNoYXIgKikpR2V0UHJvY0FkZHJlc3MKLQkJKGhQeXRob24sIlB5U3lzX0dldE9iamVjdCIpOworICAgIFB5U3lzX0dldE9iamVjdCA9ICh2b2lkKiAoKikoY2hhciAqKSlHZXRQcm9jQWRkcmVzcworICAgICAgICAoaFB5dGhvbiwiUHlTeXNfR2V0T2JqZWN0Iik7CiAKLQlQeV9HZXRQcmVmaXggPSAoY2hhciAqICgqKSh2b2lkKSlHZXRQcm9jQWRkcmVzcwotCQkoaFB5dGhvbiwiUHlfR2V0UHJlZml4Iik7CisgICAgUHlfR2V0UHJlZml4ID0gKGNoYXIgKiAoKikodm9pZCkpR2V0UHJvY0FkZHJlc3MKKyAgICAgICAgKGhQeXRob24sIlB5X0dldFByZWZpeCIpOwogCi0JUHlfR2V0UGF0aCA9IChjaGFyICogKCopKHZvaWQpKUdldFByb2NBZGRyZXNzCi0JCShoUHl0aG9uLCJQeV9HZXRQYXRoIik7CisgICAgUHlfR2V0UGF0aCA9IChjaGFyICogKCopKHZvaWQpKUdldFByb2NBZGRyZXNzCisgICAgICAgIChoUHl0aG9uLCJQeV9HZXRQYXRoIik7CiAKLQlQeV9GaW5hbGl6ZSA9ICh2b2lkICgqKSh2b2lkKSlHZXRQcm9jQWRkcmVzcyhoUHl0aG9uLAotCQkJCQkJICAgICAgIlB5X0ZpbmFsaXplIik7Ci0JUHlfU2V0UHJvZ3JhbU5hbWUoZXhlKTsKLQlQeV9Jbml0aWFsaXplKCk7Ci0JUHlTeXNfU2V0QXJndigxLCAmZXhlKTsKKyAgICBQeV9GaW5hbGl6ZSA9ICh2b2lkICgqKSh2b2lkKSlHZXRQcm9jQWRkcmVzcyhoUHl0aG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlfRmluYWxpemUiKTsKKyAgICBQeV9TZXRQcm9ncmFtTmFtZShleGUpOworICAgIFB5X0luaXRpYWxpemUoKTsKKyAgICBQeVN5c19TZXRBcmd2KDEsICZleGUpOwogCi0JTWVzc2FnZUJveChHZXRGb2N1cygpLCBQeV9HZXRQcmVmaXgoKSwgIlBSRUZJWCIsIE1CX09LKTsKLQlNZXNzYWdlQm94KEdldEZvY3VzKCksIFB5X0dldFBhdGgoKSwgIlBBVEgiLCBNQl9PSyk7CisgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBQeV9HZXRQcmVmaXgoKSwgIlBSRUZJWCIsIE1CX09LKTsKKyAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIFB5X0dldFBhdGgoKSwgIlBBVEgiLCBNQl9PSyk7CiAKLQlQeV9GaW5hbGl6ZSgpOwotCUZyZWVMaWJyYXJ5KGhQeXRob24pOworICAgIFB5X0ZpbmFsaXplKCk7CisgICAgRnJlZUxpYnJhcnkoaFB5dGhvbik7CiAKLQlyZXR1cm4gcHJlZml4OworICAgIHJldHVybiBwcmVmaXg7CiB9CiAKIHN0YXRpYyBCT09MCiBDaGVja1B5dGhvbkV4ZShMUFNUUiBwYXRobmFtZSwgTFBTVFIgdmVyc2lvbiwgaW50ICpwbWFqb3IsIGludCAqcG1pbm9yKQogewotCWJvdW5kX2ltYWdlX2RsbFswXSA9ICdcMCc7Ci0JaWYgKCFCaW5kSW1hZ2VFeChCSU5EX05PX0JPVU5EX0lNUE9SVFMgfCBCSU5EX05PX1VQREFURSB8IEJJTkRfQUxMX0lNQUdFUywKLQkJCSBwYXRobmFtZSwKLQkJCSBOVUxMLAotCQkJIE5VTEwsCi0JCQkgU3RhdHVzUm91dGluZSkpCi0JCXJldHVybiBTeXN0ZW1FcnJvcigwLCAiQ291bGQgbm90IGJpbmQgaW1hZ2UiKTsKLQlpZiAoYm91bmRfaW1hZ2VfZGxsWzBdID09ICdcMCcpCi0JCXJldHVybiBTeXN0ZW1FcnJvcigwLCAiRG9lcyBub3Qgc2VlbSB0byBiZSBhIHB5dGhvbiBleGVjdXRhYmxlIik7Ci0JKnBtYWpvciA9IGJvdW5kX2ltYWdlX21ham9yOwotCSpwbWlub3IgPSBib3VuZF9pbWFnZV9taW5vcjsKLQlpZiAodmVyc2lvbiAmJiAqdmVyc2lvbikgewotCQljaGFyIGNvcmVfdmVyc2lvblsxMl07Ci0JCXdzcHJpbnRmKGNvcmVfdmVyc2lvbiwgIiVkLiVkIiwgYm91bmRfaW1hZ2VfbWFqb3IsIGJvdW5kX2ltYWdlX21pbm9yKTsKLQkJaWYgKHN0cmNtcCh2ZXJzaW9uLCBjb3JlX3ZlcnNpb24pKQotCQkJcmV0dXJuIFN5c3RlbUVycm9yKDAsICJXcm9uZyBQeXRob24gdmVyc2lvbiIpOwotCX0KLQlnZXRfc3lzX3ByZWZpeChwYXRobmFtZSwgYm91bmRfaW1hZ2VfZGxsKTsKLQlyZXR1cm4gVFJVRTsKKyAgICBib3VuZF9pbWFnZV9kbGxbMF0gPSAnXDAnOworICAgIGlmICghQmluZEltYWdlRXgoQklORF9OT19CT1VORF9JTVBPUlRTIHwgQklORF9OT19VUERBVEUgfCBCSU5EX0FMTF9JTUFHRVMsCisgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgU3RhdHVzUm91dGluZSkpCisgICAgICAgIHJldHVybiBTeXN0ZW1FcnJvcigwLCAiQ291bGQgbm90IGJpbmQgaW1hZ2UiKTsKKyAgICBpZiAoYm91bmRfaW1hZ2VfZGxsWzBdID09ICdcMCcpCisgICAgICAgIHJldHVybiBTeXN0ZW1FcnJvcigwLCAiRG9lcyBub3Qgc2VlbSB0byBiZSBhIHB5dGhvbiBleGVjdXRhYmxlIik7CisgICAgKnBtYWpvciA9IGJvdW5kX2ltYWdlX21ham9yOworICAgICpwbWlub3IgPSBib3VuZF9pbWFnZV9taW5vcjsKKyAgICBpZiAodmVyc2lvbiAmJiAqdmVyc2lvbikgeworICAgICAgICBjaGFyIGNvcmVfdmVyc2lvblsxMl07CisgICAgICAgIHdzcHJpbnRmKGNvcmVfdmVyc2lvbiwgIiVkLiVkIiwgYm91bmRfaW1hZ2VfbWFqb3IsIGJvdW5kX2ltYWdlX21pbm9yKTsKKyAgICAgICAgaWYgKHN0cmNtcCh2ZXJzaW9uLCBjb3JlX3ZlcnNpb24pKQorICAgICAgICAgICAgcmV0dXJuIFN5c3RlbUVycm9yKDAsICJXcm9uZyBQeXRob24gdmVyc2lvbiIpOworICAgIH0KKyAgICBnZXRfc3lzX3ByZWZpeChwYXRobmFtZSwgYm91bmRfaW1hZ2VfZGxsKTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogLyoKQEAgLTEzNzIsNDggKzEzNzIsNDggQEAKICAqLwogc3RhdGljIEJPT0wgR2V0T3RoZXJQeXRob25WZXJzaW9uKEhXTkQgaHduZCwgTFBTVFIgdmVyc2lvbikKIHsKLQljaGFyIHZlcnNfbmFtZVtfTUFYX1BBVEggKyA4MF07Ci0JRFdPUkQgaXRlbWluZGV4OwotCU9QRU5GSUxFTkFNRSBvZjsKLQljaGFyIHBhdGhuYW1lW19NQVhfUEFUSF07Ci0JRFdPUkQgcmVzdWx0OworICAgIGNoYXIgdmVyc19uYW1lW19NQVhfUEFUSCArIDgwXTsKKyAgICBEV09SRCBpdGVtaW5kZXg7CisgICAgT1BFTkZJTEVOQU1FIG9mOworICAgIGNoYXIgcGF0aG5hbWVbX01BWF9QQVRIXTsKKyAgICBEV09SRCByZXN1bHQ7CiAKLQlzdHJjcHkocGF0aG5hbWUsICJweXRob24uZXhlIik7CisgICAgc3RyY3B5KHBhdGhuYW1lLCAicHl0aG9uLmV4ZSIpOwogCi0JbWVtc2V0KCZvZiwgMCwgc2l6ZW9mKG9mKSk7Ci0Jb2YubFN0cnVjdFNpemUgPSBzaXplb2YoT1BFTkZJTEVOQU1FKTsKLQlvZi5od25kT3duZXIgPSBHZXRQYXJlbnQoaHduZCk7Ci0Jb2YuaEluc3RhbmNlID0gTlVMTDsKLQlvZi5scHN0ckZpbHRlciA9ICJweXRob24uZXhlXDBweXRob24uZXhlXDAiOwotCW9mLmxwc3RyQ3VzdG9tRmlsdGVyID0gTlVMTDsKLQlvZi5uTWF4Q3VzdEZpbHRlciA9IDA7Ci0Jb2YubkZpbHRlckluZGV4ID0gMTsKLQlvZi5scHN0ckZpbGUgPSBwYXRobmFtZTsKLQlvZi5uTWF4RmlsZSA9IHNpemVvZihwYXRobmFtZSk7Ci0Jb2YubHBzdHJGaWxlVGl0bGUgPSBOVUxMOwotCW9mLm5NYXhGaWxlVGl0bGUgPSAwOwotCW9mLmxwc3RySW5pdGlhbERpciA9IE5VTEw7Ci0Jb2YubHBzdHJUaXRsZSA9ICJQeXRob24gZXhlY3V0YWJsZSI7Ci0Jb2YuRmxhZ3MgPSBPRk5fRklMRU1VU1RFWElTVCB8IE9GTl9QQVRITVVTVEVYSVNUOwotCW9mLmxwc3RyRGVmRXh0ID0gImV4ZSI7CisgICAgbWVtc2V0KCZvZiwgMCwgc2l6ZW9mKG9mKSk7CisgICAgb2YubFN0cnVjdFNpemUgPSBzaXplb2YoT1BFTkZJTEVOQU1FKTsKKyAgICBvZi5od25kT3duZXIgPSBHZXRQYXJlbnQoaHduZCk7CisgICAgb2YuaEluc3RhbmNlID0gTlVMTDsKKyAgICBvZi5scHN0ckZpbHRlciA9ICJweXRob24uZXhlXDBweXRob24uZXhlXDAiOworICAgIG9mLmxwc3RyQ3VzdG9tRmlsdGVyID0gTlVMTDsKKyAgICBvZi5uTWF4Q3VzdEZpbHRlciA9IDA7CisgICAgb2YubkZpbHRlckluZGV4ID0gMTsKKyAgICBvZi5scHN0ckZpbGUgPSBwYXRobmFtZTsKKyAgICBvZi5uTWF4RmlsZSA9IHNpemVvZihwYXRobmFtZSk7CisgICAgb2YubHBzdHJGaWxlVGl0bGUgPSBOVUxMOworICAgIG9mLm5NYXhGaWxlVGl0bGUgPSAwOworICAgIG9mLmxwc3RySW5pdGlhbERpciA9IE5VTEw7CisgICAgb2YubHBzdHJUaXRsZSA9ICJQeXRob24gZXhlY3V0YWJsZSI7CisgICAgb2YuRmxhZ3MgPSBPRk5fRklMRU1VU1RFWElTVCB8IE9GTl9QQVRITVVTVEVYSVNUOworICAgIG9mLmxwc3RyRGVmRXh0ID0gImV4ZSI7CiAKLQlyZXN1bHQgPSBHZXRPcGVuRmlsZU5hbWUoJm9mKTsKLQlpZiAocmVzdWx0KSB7Ci0JCWludCBtYWpvciwgbWlub3I7Ci0JCWlmICghQ2hlY2tQeXRob25FeGUocGF0aG5hbWUsIHZlcnNpb24sICZtYWpvciwgJm1pbm9yKSkgewotCQkJcmV0dXJuIEZBTFNFOwotCQl9Ci0JCSpzdHJyY2hyKHBhdGhuYW1lLCAnXFwnKSA9ICdcMCc7Ci0JCXdzcHJpbnRmKHZlcnNfbmFtZSwgIlB5dGhvbiBWZXJzaW9uICVkLiVkIGluICVzIiwKLQkJCSAgbWFqb3IsIG1pbm9yLCBwYXRobmFtZSk7Ci0JCWl0ZW1pbmRleCA9IFNlbmRNZXNzYWdlKGh3bmQsIExCX0lOU0VSVFNUUklORywgLTEsCi0JCQkJCShMUEFSQU0pKExQU1RSKXZlcnNfbmFtZSk7Ci0JCVNlbmRNZXNzYWdlKGh3bmQsIExCX1NFVENVUlNFTCwgaXRlbWluZGV4LCAwKTsKLQkJU2VuZE1lc3NhZ2UoaHduZCwgTEJfU0VUSVRFTURBVEEsIGl0ZW1pbmRleCwKLQkJCSAgICAoTFBBUkFNKShMUFNUUilzdHJkdXAocGF0aG5hbWUpKTsKLQkJcmV0dXJuIFRSVUU7Ci0JfQotCXJldHVybiBGQUxTRTsKKyAgICByZXN1bHQgPSBHZXRPcGVuRmlsZU5hbWUoJm9mKTsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIGludCBtYWpvciwgbWlub3I7CisgICAgICAgIGlmICghQ2hlY2tQeXRob25FeGUocGF0aG5hbWUsIHZlcnNpb24sICZtYWpvciwgJm1pbm9yKSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICpzdHJyY2hyKHBhdGhuYW1lLCAnXFwnKSA9ICdcMCc7CisgICAgICAgIHdzcHJpbnRmKHZlcnNfbmFtZSwgIlB5dGhvbiBWZXJzaW9uICVkLiVkIGluICVzIiwKKyAgICAgICAgICAgICAgICAgIG1ham9yLCBtaW5vciwgcGF0aG5hbWUpOworICAgICAgICBpdGVtaW5kZXggPSBTZW5kTWVzc2FnZShod25kLCBMQl9JTlNFUlRTVFJJTkcsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKShMUFNUUil2ZXJzX25hbWUpOworICAgICAgICBTZW5kTWVzc2FnZShod25kLCBMQl9TRVRDVVJTRUwsIGl0ZW1pbmRleCwgMCk7CisgICAgICAgIFNlbmRNZXNzYWdlKGh3bmQsIExCX1NFVElURU1EQVRBLCBpdGVtaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pKExQU1RSKXN0cmR1cChwYXRobmFtZSkpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOwogfQogI2VuZGlmIC8qIFVTRV9PVEhFUl9QWVRIT05fVkVSU0lPTlMgKi8KIApAQCAtMTQzMCw3MSArMTQzMCw3MSBAQAogICovCiBzdGF0aWMgQk9PTCBHZXRQeXRob25WZXJzaW9ucyhIV05EIGh3bmQsIEhLRVkgaGtSb290LCBMUFNUUiB2ZXJzaW9uKQogewotCURXT1JEIGluZGV4ID0gMDsKLQljaGFyIGNvcmVfdmVyc2lvbls4MF07Ci0JSEtFWSBoS2V5OwotCUJPT0wgcmVzdWx0ID0gVFJVRTsKLQlEV09SRCBidWZzaXplOworICAgIERXT1JEIGluZGV4ID0gMDsKKyAgICBjaGFyIGNvcmVfdmVyc2lvbls4MF07CisgICAgSEtFWSBoS2V5OworICAgIEJPT0wgcmVzdWx0ID0gVFJVRTsKKyAgICBEV09SRCBidWZzaXplOwogCi0JaWYgKEVSUk9SX1NVQ0NFU1MgIT0gUmVnT3BlbktleUV4KGhrUm9vdCwKLQkJCQkJICAgIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmUiLAotCQkJCQkgICAwLAlLRVlfUkVBRCwgJmhLZXkpKQotCQlyZXR1cm4gRkFMU0U7Ci0JYnVmc2l6ZSA9IHNpemVvZihjb3JlX3ZlcnNpb24pOwotCXdoaWxlIChFUlJPUl9TVUNDRVNTID09IFJlZ0VudW1LZXlFeChoS2V5LCBpbmRleCwKLQkJCQkJICAgICAgY29yZV92ZXJzaW9uLCAmYnVmc2l6ZSwgTlVMTCwKLQkJCQkJICAgICAgTlVMTCwgTlVMTCwgTlVMTCkpIHsKLQkJY2hhciBzdWJrZXlfbmFtZVs4MF0sIHZlcnNfbmFtZVs4MF07Ci0JCWludCBpdGVtaW5kZXg7Ci0JCURXT1JEIHZhbHVlX3NpemU7Ci0JCUhLRVkgaGs7CisgICAgaWYgKEVSUk9SX1NVQ0NFU1MgIT0gUmVnT3BlbktleUV4KGhrUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgIEtFWV9SRUFELCAmaEtleSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBidWZzaXplID0gc2l6ZW9mKGNvcmVfdmVyc2lvbik7CisgICAgd2hpbGUgKEVSUk9SX1NVQ0NFU1MgPT0gUmVnRW51bUtleUV4KGhLZXksIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZV92ZXJzaW9uLCAmYnVmc2l6ZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpKSB7CisgICAgICAgIGNoYXIgc3Via2V5X25hbWVbODBdLCB2ZXJzX25hbWVbODBdOworICAgICAgICBpbnQgaXRlbWluZGV4OworICAgICAgICBEV09SRCB2YWx1ZV9zaXplOworICAgICAgICBIS0VZIGhrOwogCi0JCWJ1ZnNpemUgPSBzaXplb2YoY29yZV92ZXJzaW9uKTsKLQkJKytpbmRleDsKLQkJaWYgKHZlcnNpb24gJiYgKnZlcnNpb24gJiYgc3RyY21wKHZlcnNpb24sIGNvcmVfdmVyc2lvbikpCi0JCQljb250aW51ZTsKKyAgICAgICAgYnVmc2l6ZSA9IHNpemVvZihjb3JlX3ZlcnNpb24pOworICAgICAgICArK2luZGV4OworICAgICAgICBpZiAodmVyc2lvbiAmJiAqdmVyc2lvbiAmJiBzdHJjbXAodmVyc2lvbiwgY29yZV92ZXJzaW9uKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCXdzcHJpbnRmKHZlcnNfbmFtZSwgIlB5dGhvbiBWZXJzaW9uICVzIChmb3VuZCBpbiByZWdpc3RyeSkiLAotCQkJICBjb3JlX3ZlcnNpb24pOwotCQl3c3ByaW50ZihzdWJrZXlfbmFtZSwKLQkJCSAgIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCVzXFxJbnN0YWxsUGF0aCIsCi0JCQkgIGNvcmVfdmVyc2lvbik7Ci0JCWlmIChFUlJPUl9TVUNDRVNTID09IFJlZ09wZW5LZXlFeChoa1Jvb3QsIHN1YmtleV9uYW1lLCAwLCBLRVlfUkVBRCwgJmhrKSkgewotCQkJSW5zdGFsbGVkVmVyc2lvbkluZm8gKml2aSA9IAotCQkJICAgICAgKEluc3RhbGxlZFZlcnNpb25JbmZvICopbWFsbG9jKHNpemVvZihJbnN0YWxsZWRWZXJzaW9uSW5mbykpOwotCQkJdmFsdWVfc2l6ZSA9IHNpemVvZihpdmktPnByZWZpeCk7Ci0JCQlpZiAoaXZpICYmIAotCQkJICAgIEVSUk9SX1NVQ0NFU1MgPT0gUmVnUXVlcnlWYWx1ZUV4KGhrLCBOVUxMLCBOVUxMLCBOVUxMLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2aS0+cHJlZml4LCAmdmFsdWVfc2l6ZSkpIHsKLQkJCQlpdGVtaW5kZXggPSBTZW5kTWVzc2FnZShod25kLCBMQl9BRERTVFJJTkcsIDAsCi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkoTFBTVFIpdmVyc19uYW1lKTsKLQkJCQlpdmktPmhrZXkgPSBoa1Jvb3Q7Ci0JCQkJU2VuZE1lc3NhZ2UoaHduZCwgTEJfU0VUSVRFTURBVEEsIGl0ZW1pbmRleCwKLQkJCQkgICAgICAgICAgICAoTFBBUkFNKShMUFNUUilpdmkpOwotCQkJfQotCQkJUmVnQ2xvc2VLZXkoaGspOwotCQl9Ci0JfQotCVJlZ0Nsb3NlS2V5KGhLZXkpOwotCXJldHVybiByZXN1bHQ7CisgICAgICAgIHdzcHJpbnRmKHZlcnNfbmFtZSwgIlB5dGhvbiBWZXJzaW9uICVzIChmb3VuZCBpbiByZWdpc3RyeSkiLAorICAgICAgICAgICAgICAgICAgY29yZV92ZXJzaW9uKTsKKyAgICAgICAgd3NwcmludGYoc3Via2V5X25hbWUsCisgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcJXNcXEluc3RhbGxQYXRoIiwKKyAgICAgICAgICAgICAgICAgIGNvcmVfdmVyc2lvbik7CisgICAgICAgIGlmIChFUlJPUl9TVUNDRVNTID09IFJlZ09wZW5LZXlFeChoa1Jvb3QsIHN1YmtleV9uYW1lLCAwLCBLRVlfUkVBRCwgJmhrKSkgeworICAgICAgICAgICAgSW5zdGFsbGVkVmVyc2lvbkluZm8gKml2aSA9CisgICAgICAgICAgICAgICAgICAoSW5zdGFsbGVkVmVyc2lvbkluZm8gKiltYWxsb2Moc2l6ZW9mKEluc3RhbGxlZFZlcnNpb25JbmZvKSk7CisgICAgICAgICAgICB2YWx1ZV9zaXplID0gc2l6ZW9mKGl2aS0+cHJlZml4KTsKKyAgICAgICAgICAgIGlmIChpdmkgJiYKKyAgICAgICAgICAgICAgICBFUlJPUl9TVUNDRVNTID09IFJlZ1F1ZXJ5VmFsdWVFeChoaywgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmktPnByZWZpeCwgJnZhbHVlX3NpemUpKSB7CisgICAgICAgICAgICAgICAgaXRlbWluZGV4ID0gU2VuZE1lc3NhZ2UoaHduZCwgTEJfQUREU1RSSU5HLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEFSQU0pKExQU1RSKXZlcnNfbmFtZSk7CisgICAgICAgICAgICAgICAgaXZpLT5oa2V5ID0gaGtSb290OworICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKGh3bmQsIExCX1NFVElURU1EQVRBLCBpdGVtaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkoTFBTVFIpaXZpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlZ0Nsb3NlS2V5KGhrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBSZWdDbG9zZUtleShoS2V5KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBEZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgdXNlciBjYW4gd3JpdGUgdG8gSEtFWV9MT0NBTF9NQUNISU5FICovCiBCT09MIEhhc0xvY2FsTWFjaGluZVByaXZzKCkKIHsKLQkJSEtFWSBoS2V5OwotCQlEV09SRCByZXN1bHQ7Ci0JCXN0YXRpYyBjaGFyIEtleU5hbWVbXSA9IAotCQkJIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGwiOworICAgICAgICAgICAgICAgIEhLRVkgaEtleTsKKyAgICAgICAgICAgICAgICBEV09SRCByZXN1bHQ7CisgICAgICAgICAgICAgICAgc3RhdGljIGNoYXIgS2V5TmFtZVtdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsIjsKIAotCQlyZXN1bHQgPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLAotCQkJCQkgIEtleU5hbWUsCi0JCQkJCSAgMCwKLQkJCQkJICBLRVlfQ1JFQVRFX1NVQl9LRVksCi0JCQkJCSAgJmhLZXkpOwotCQlpZiAocmVzdWx0PT0wKQotCQkJUmVnQ2xvc2VLZXkoaEtleSk7Ci0JCXJldHVybiByZXN1bHQ9PTA7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX0NSRUFURV9TVUJfS0VZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhLZXkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ9PTApCisgICAgICAgICAgICAgICAgICAgICAgICBSZWdDbG9zZUtleShoS2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0PT0wOwogfQogCiAvLyBDaGVjayB0aGUgcm9vdCByZWdpc3RyeSBrZXkgdG8gdXNlIC0gZWl0aGVyIEhLTE0gb3IgSEtDVS4KQEAgLTE1MDcsODYgKzE1MDcsODYgQEAKIC8vIFdlIGFzc3VtZSBoa2V5X3Jvb3QgaXMgYWxyZWFkeSBzZXQgdG8gd2hlcmUgUHl0aG9uIGl0c2VsZiBpcyBpbnN0YWxsZWQuCiB2b2lkIENoZWNrUm9vdEtleShIV05EIGh3bmQpCiB7Ci0JaWYgKGhrZXlfcm9vdD09SEtFWV9DVVJSRU5UX1VTRVIpIHsKLQkJOyAvLyBhcyBhYm92ZSwgYWx3YXlzIGluc3RhbGwgb3Vyc2VsZiBpbiBIS0NVIHRvby4KLQl9IGVsc2UgaWYgKGhrZXlfcm9vdD09SEtFWV9MT0NBTF9NQUNISU5FKSB7Ci0JCS8vIFB5dGhvbiBpbiBIS0xNLCBidXQgd2UgbWF5IG9yIG1heSBub3QgaGF2ZSBwZXJtaXNzaW9ucyB0aGVyZS4KLQkJLy8gT3BlbiB0aGUgdW5pbnN0YWxsIGtleSB3aXRoICdjcmVhdGUnIHBlcm1pc3Npb25zIC0gaWYgdGhpcyBmYWlscywKLQkJLy8gd2UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uLgotCQlpZiAoIUhhc0xvY2FsTWFjaGluZVByaXZzKCkpCi0JCQloa2V5X3Jvb3QgPSBIS0VZX0NVUlJFTlRfVVNFUjsKLQl9IGVsc2UgewotCQlNZXNzYWdlQm94KGh3bmQsICJEb24ndCBrbm93IFB5dGhvbidzIGluc3RhbGxhdGlvbiB0eXBlIiwKLQkJCQkgICAiU3RyYW5nZSIsIE1CX09LIHwgTUJfSUNPTlNUT1ApOwotCQkvKiBEZWZhdWx0IHRvIHdoZXJldmVyIHRoZXkgY2FuLCBidXQgcHJlZmVycmluZyBIS0xNICovCi0JCWhrZXlfcm9vdCA9IEhhc0xvY2FsTWFjaGluZVByaXZzKCkgPyBIS0VZX0xPQ0FMX01BQ0hJTkUgOiBIS0VZX0NVUlJFTlRfVVNFUjsKLQl9CisgICAgaWYgKGhrZXlfcm9vdD09SEtFWV9DVVJSRU5UX1VTRVIpIHsKKyAgICAgICAgOyAvLyBhcyBhYm92ZSwgYWx3YXlzIGluc3RhbGwgb3Vyc2VsZiBpbiBIS0NVIHRvby4KKyAgICB9IGVsc2UgaWYgKGhrZXlfcm9vdD09SEtFWV9MT0NBTF9NQUNISU5FKSB7CisgICAgICAgIC8vIFB5dGhvbiBpbiBIS0xNLCBidXQgd2UgbWF5IG9yIG1heSBub3QgaGF2ZSBwZXJtaXNzaW9ucyB0aGVyZS4KKyAgICAgICAgLy8gT3BlbiB0aGUgdW5pbnN0YWxsIGtleSB3aXRoICdjcmVhdGUnIHBlcm1pc3Npb25zIC0gaWYgdGhpcyBmYWlscywKKyAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uLgorICAgICAgICBpZiAoIUhhc0xvY2FsTWFjaGluZVByaXZzKCkpCisgICAgICAgICAgICBoa2V5X3Jvb3QgPSBIS0VZX0NVUlJFTlRfVVNFUjsKKyAgICB9IGVsc2UgeworICAgICAgICBNZXNzYWdlQm94KGh3bmQsICJEb24ndCBrbm93IFB5dGhvbidzIGluc3RhbGxhdGlvbiB0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJhbmdlIiwgTUJfT0sgfCBNQl9JQ09OU1RPUCk7CisgICAgICAgIC8qIERlZmF1bHQgdG8gd2hlcmV2ZXIgdGhleSBjYW4sIGJ1dCBwcmVmZXJyaW5nIEhLTE0gKi8KKyAgICAgICAgaGtleV9yb290ID0gSGFzTG9jYWxNYWNoaW5lUHJpdnMoKSA/IEhLRVlfTE9DQUxfTUFDSElORSA6IEhLRVlfQ1VSUkVOVF9VU0VSOworICAgIH0KIH0KIAogLyogUmV0dXJuIHRoZSBpbnN0YWxsYXRpb24gc2NoZW1lIGRlcGVuZGluZyBvbiBQeXRob24gdmVyc2lvbiBudW1iZXIgKi8KIFNDSEVNRSAqR2V0U2NoZW1lKGludCBtYWpvciwgaW50IG1pbm9yKQogewotCWlmIChtYWpvciA+IDIpCi0JCXJldHVybiBuZXdfc2NoZW1lOwotCWVsc2UgaWYoKG1ham9yID09IDIpICYmIChtaW5vciA+PSAyKSkKLQkJcmV0dXJuIG5ld19zY2hlbWU7Ci0JcmV0dXJuIG9sZF9zY2hlbWU7CisgICAgaWYgKG1ham9yID4gMikKKyAgICAgICAgcmV0dXJuIG5ld19zY2hlbWU7CisgICAgZWxzZSBpZigobWFqb3IgPT0gMikgJiYgKG1pbm9yID49IDIpKQorICAgICAgICByZXR1cm4gbmV3X3NjaGVtZTsKKyAgICByZXR1cm4gb2xkX3NjaGVtZTsKIH0KIAogQk9PTCBDQUxMQkFDSwogU2VsZWN0UHl0aG9uRGxnUHJvYyhIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCUxQTk1IRFIgbHBubTsKKyAgICBMUE5NSERSIGxwbm07CiAKLQlzd2l0Y2ggKG1zZykgewotCWNhc2UgV01fSU5JVERJQUxPRzoKLQkJaWYgKGhCaXRtYXApCi0JCQlTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX0JJVE1BUCwgU1RNX1NFVElNQUdFLAotCQkJCQkgICBJTUFHRV9CSVRNQVAsIChMUEFSQU0paEJpdG1hcCk7Ci0JCUdldFB5dGhvblZlcnNpb25zKEdldERsZ0l0ZW0oaHduZCwgSURDX1ZFUlNJT05TX0xJU1QpLAotCQkJCSAgIEhLRVlfTE9DQUxfTUFDSElORSwgdGFyZ2V0X3ZlcnNpb24pOwotCQlHZXRQeXRob25WZXJzaW9ucyhHZXREbGdJdGVtKGh3bmQsIElEQ19WRVJTSU9OU19MSVNUKSwKLQkJCQkgICBIS0VZX0NVUlJFTlRfVVNFUiwgdGFyZ2V0X3ZlcnNpb24pOwotCQl7CS8qIHNlbGVjdCB0aGUgbGFzdCBlbnRyeSB3aGljaCBpcyB0aGUgaGlnaGVzdCBweXRob24KLQkJCSAgIHZlcnNpb24gZm91bmQgKi8KLQkJCWludCBjb3VudDsKLQkJCWNvdW50ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULAotCQkJCQkJICAgIExCX0dFVENPVU5ULCAwLCAwKTsKLQkJCWlmIChjb3VudCAmJiBjb3VudCAhPSBMQl9FUlIpCi0JCQkJU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULCBMQl9TRVRDVVJTRUwsCi0JCQkJCQkgICAgY291bnQtMSwgMCk7Ci0JICAgIAotCQkJLyogSWYgYSBzcGVjaWZpYyBQeXRob24gdmVyc2lvbiBpcyByZXF1aXJlZCwKLQkJCSAqIGRpc3BsYXkgYSBwcm9taW5lbnQgbm90aWNlIHNob3dpbmcgdGhpcyBmYWN0LgotCQkJICovCi0JCQlpZiAodGFyZ2V0X3ZlcnNpb24gJiYgdGFyZ2V0X3ZlcnNpb25bMF0pIHsKLQkJCQljaGFyIGJ1ZmZlcls0MDk2XTsKLQkJCQl3c3ByaW50ZihidWZmZXIsCi0JCQkJCSAiUHl0aG9uICVzIGlzIHJlcXVpcmVkIGZvciB0aGlzIHBhY2thZ2UuICIKLQkJCQkJICJTZWxlY3QgaW5zdGFsbGF0aW9uIHRvIHVzZToiLAotCQkJCQkgdGFyZ2V0X3ZlcnNpb24pOwotCQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwgYnVmZmVyKTsKLQkJCX0KKyAgICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICAgICAgaWYgKGhCaXRtYXApCisgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX0JJVE1BUCwgU1RNX1NFVElNQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0JJVE1BUCwgKExQQVJBTSloQml0bWFwKTsKKyAgICAgICAgR2V0UHl0aG9uVmVyc2lvbnMoR2V0RGxnSXRlbShod25kLCBJRENfVkVSU0lPTlNfTElTVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIS0VZX0xPQ0FMX01BQ0hJTkUsIHRhcmdldF92ZXJzaW9uKTsKKyAgICAgICAgR2V0UHl0aG9uVmVyc2lvbnMoR2V0RGxnSXRlbShod25kLCBJRENfVkVSU0lPTlNfTElTVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIS0VZX0NVUlJFTlRfVVNFUiwgdGFyZ2V0X3ZlcnNpb24pOworICAgICAgICB7ICAgICAgICAgICAgICAgLyogc2VsZWN0IHRoZSBsYXN0IGVudHJ5IHdoaWNoIGlzIHRoZSBoaWdoZXN0IHB5dGhvbgorICAgICAgICAgICAgICAgICAgIHZlcnNpb24gZm91bmQgKi8KKyAgICAgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgICAgIGNvdW50ID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExCX0dFVENPVU5ULCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChjb3VudCAmJiBjb3VudCAhPSBMQl9FUlIpCisgICAgICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULCBMQl9TRVRDVVJTRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudC0xLCAwKTsKIAotCQkJaWYgKGNvdW50ID09IDApIHsKLQkJCQljaGFyIEJ1ZmZlcls0MDk2XTsKLQkJCQljaGFyICptc2c7Ci0JCQkJaWYgKHRhcmdldF92ZXJzaW9uICYmIHRhcmdldF92ZXJzaW9uWzBdKSB7Ci0JCQkJCXdzcHJpbnRmKEJ1ZmZlciwKLQkJCQkJCSAiUHl0aG9uIHZlcnNpb24gJXMgcmVxdWlyZWQsIHdoaWNoIHdhcyBub3QgZm91bmQiCi0JCQkJCQkgIiBpbiB0aGUgcmVnaXN0cnkuIiwgdGFyZ2V0X3ZlcnNpb24pOwotCQkJCQltc2cgPSBCdWZmZXI7Ci0JCQkJfSBlbHNlCi0JCQkJCW1zZyA9ICJObyBQeXRob24gaW5zdGFsbGF0aW9uIGZvdW5kIGluIHRoZSByZWdpc3RyeS4iOwotCQkJCU1lc3NhZ2VCb3goaHduZCwgbXNnLCAiQ2Fubm90IGluc3RhbGwiLAotCQkJCQkgICBNQl9PSyB8IE1CX0lDT05TVE9QKTsKLQkJCX0KLQkJfQotCQlnb3RvIFVwZGF0ZUluc3RhbGxEaXI7Ci0JCWJyZWFrOworICAgICAgICAgICAgLyogSWYgYSBzcGVjaWZpYyBQeXRob24gdmVyc2lvbiBpcyByZXF1aXJlZCwKKyAgICAgICAgICAgICAqIGRpc3BsYXkgYSBwcm9taW5lbnQgbm90aWNlIHNob3dpbmcgdGhpcyBmYWN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAodGFyZ2V0X3ZlcnNpb24gJiYgdGFyZ2V0X3ZlcnNpb25bMF0pIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZmZlcls0MDk2XTsKKyAgICAgICAgICAgICAgICB3c3ByaW50ZihidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiAlcyBpcyByZXF1aXJlZCBmb3IgdGhpcyBwYWNrYWdlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbGVjdCBpbnN0YWxsYXRpb24gdG8gdXNlOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24pOworICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwgYnVmZmVyKTsKKyAgICAgICAgICAgIH0KIAotCWNhc2UgV01fQ09NTUFORDoKLQkJc3dpdGNoIChMT1dPUkQod1BhcmFtKSkgeworICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBjaGFyIEJ1ZmZlcls0MDk2XTsKKyAgICAgICAgICAgICAgICBjaGFyICptc2c7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldF92ZXJzaW9uICYmIHRhcmdldF92ZXJzaW9uWzBdKSB7CisgICAgICAgICAgICAgICAgICAgIHdzcHJpbnRmKEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB2ZXJzaW9uICVzIHJlcXVpcmVkLCB3aGljaCB3YXMgbm90IGZvdW5kIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIHRoZSByZWdpc3RyeS4iLCB0YXJnZXRfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gIk5vIFB5dGhvbiBpbnN0YWxsYXRpb24gZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiI7CisgICAgICAgICAgICAgICAgTWVzc2FnZUJveChod25kLCBtc2csICJDYW5ub3QgaW5zdGFsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNQl9PSyB8IE1CX0lDT05TVE9QKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBnb3RvIFVwZGF0ZUluc3RhbGxEaXI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBXTV9DT01NQU5EOgorICAgICAgICBzd2l0Y2ggKExPV09SRCh3UGFyYW0pKSB7CiAvKgogICBjYXNlIElEQ19PVEhFUlBZVEhPTjoKICAgaWYgKEdldE90aGVyUHl0aG9uVmVyc2lvbihHZXREbGdJdGVtKGh3bmQsIElEQ19WRVJTSU9OU19MSVNUKSwKQEAgLTE1OTQsMzA3ICsxNTk0LDMwNyBAQAogICBnb3RvIFVwZGF0ZUluc3RhbGxEaXI7CiAgIGJyZWFrOwogKi8KLQkJY2FzZSBJRENfVkVSU0lPTlNfTElTVDoKLQkJCXN3aXRjaCAoSElXT1JEKHdQYXJhbSkpIHsKLQkJCQlpbnQgaWQ7Ci0JCQljYXNlIExCTl9TRUxDSEFOR0U6Ci0JCQkgIFVwZGF0ZUluc3RhbGxEaXI6Ci0JCQkJUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAotCQkJCQkJCVBTV0laQl9CQUNLIHwgUFNXSVpCX05FWFQpOwotCQkJCWlkID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULAotCQkJCQkJCSBMQl9HRVRDVVJTRUwsIDAsIDApOwotCQkJCWlmIChpZCA9PSBMQl9FUlIpIHsKLQkJCQkJUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAotCQkJCQkJCQlQU1dJWkJfQkFDSyk7Ci0JCQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19QQVRILCAiIik7Ci0JCQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTlNUQUxMX1BBVEgsICIiKTsKLQkJCQkJc3RyY3B5KHB5dGhvbl9kaXIsICIiKTsKLQkJCQkJc3RyY3B5KHB5dGhvbmRsbCwgIiIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNoYXIgKnBidWY7Ci0JCQkJCWludCByZXN1bHQ7Ci0JCQkJCUluc3RhbGxlZFZlcnNpb25JbmZvICppdmk7Ci0JCQkJCVByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKLQkJCQkJCQkJUFNXSVpCX0JBQ0sgfCBQU1dJWkJfTkVYVCk7Ci0JCQkJCS8qIEdldCB0aGUgcHl0aG9uIGRpcmVjdG9yeSAqLwotICAgICAgICAgICAgICAgICAgICBpdmkgPSAoSW5zdGFsbGVkVmVyc2lvbkluZm8gKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsCi0JCQkJCQkJCQlJRENfVkVSU0lPTlNfTElTVCwKLQkJCQkJCQkJCUxCX0dFVElURU1EQVRBLAotCQkJCQkJCQkJaWQsCi0JCQkJCQkJCQkwKTsKLSAgICAgICAgICAgICAgICAgICAgaGtleV9yb290ID0gaXZpLT5oa2V5OwotCQkJCQlzdHJjcHkocHl0aG9uX2RpciwgaXZpLT5wcmVmaXgpOwotCQkJCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfUEFUSCwgcHl0aG9uX2Rpcik7Ci0JCQkJCS8qIHJldHJpZXZlIHRoZSBweXRob24gdmVyc2lvbiBhbmQgcHl0aG9uZGxsIHRvIHVzZSAqLwotCQkJCQlyZXN1bHQgPSBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsCi0JCQkJCQkJCSAgICAgTEJfR0VUVEVYVExFTiwgKFdQQVJBTSlpZCwgMCk7Ci0JCQkJCXBidWYgPSAoY2hhciAqKW1hbGxvYyhyZXN1bHQgKyAxKTsKLQkJCQkJaWYgKHBidWYpIHsKLQkJCQkJCS8qIGd1ZXNzIHRoZSBuYW1lIG9mIHRoZSBweXRob24tZGxsICovCi0JCQkJCQlTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX1ZFUlNJT05TX0xJU1QsCi0JCQkJCQkJCSAgICBMQl9HRVRURVhULCAoV1BBUkFNKWlkLAotCQkJCQkJCQkgICAgKExQQVJBTSlwYnVmKTsKLQkJCQkJCXJlc3VsdCA9IHNzY2FuZihwYnVmLCAiUHl0aG9uIFZlcnNpb24gJWQuJWQiLAotCQkJCQkJCQkgJnB5X21ham9yLCAmcHlfbWlub3IpOwotCQkJCQkJaWYgKHJlc3VsdCA9PSAyKSB7CisgICAgICAgIGNhc2UgSURDX1ZFUlNJT05TX0xJU1Q6CisgICAgICAgICAgICBzd2l0Y2ggKEhJV09SRCh3UGFyYW0pKSB7CisgICAgICAgICAgICAgICAgaW50IGlkOworICAgICAgICAgICAgY2FzZSBMQk5fU0VMQ0hBTkdFOgorICAgICAgICAgICAgICBVcGRhdGVJbnN0YWxsRGlyOgorICAgICAgICAgICAgICAgIFByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1dJWkJfQkFDSyB8IFBTV0laQl9ORVhUKTsKKyAgICAgICAgICAgICAgICBpZCA9IFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEJfR0VUQ1VSU0VMLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoaWQgPT0gTEJfRVJSKSB7CisgICAgICAgICAgICAgICAgICAgIFByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNXSVpCX0JBQ0spOworICAgICAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfUEFUSCwgIiIpOworICAgICAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5TVEFMTF9QQVRILCAiIik7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShweXRob25fZGlyLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHN0cmNweShweXRob25kbGwsICIiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYnVmOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICAgICAgICAgICAgICBJbnN0YWxsZWRWZXJzaW9uSW5mbyAqaXZpOworICAgICAgICAgICAgICAgICAgICBQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTV0laQl9CQUNLIHwgUFNXSVpCX05FWFQpOworICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHB5dGhvbiBkaXJlY3RvcnkgKi8KKyAgICAgICAgICAgIGl2aSA9IChJbnN0YWxsZWRWZXJzaW9uSW5mbyAqKQorICAgICAgICAgICAgICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURDX1ZFUlNJT05TX0xJU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEJfR0VUSVRFTURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBoa2V5X3Jvb3QgPSBpdmktPmhrZXk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShweXRob25fZGlyLCBpdmktPnByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19QQVRILCBweXRob25fZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmUgdGhlIHB5dGhvbiB2ZXJzaW9uIGFuZCBweXRob25kbGwgdG8gdXNlICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQl9HRVRURVhUTEVOLCAoV1BBUkFNKWlkLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcGJ1ZiA9IChjaGFyICopbWFsbG9jKHJlc3VsdCArIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAocGJ1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3Vlc3MgdGhlIG5hbWUgb2YgdGhlIHB5dGhvbi1kbGwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEJfR0VUVEVYVCwgKFdQQVJBTSlpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlwYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNzY2FuZihwYnVmLCAiUHl0aG9uIFZlcnNpb24gJWQuJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHlfbWFqb3IsICZweV9taW5vcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IDIpIHsKICNpZmRlZiBfREVCVUcKLQkJCQkJCQl3c3ByaW50ZihweXRob25kbGwsICJweXRob24lZCVkX2QuZGxsIiwKLQkJCQkJCQkJIHB5X21ham9yLCBweV9taW5vcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NwcmludGYocHl0aG9uZGxsLCAicHl0aG9uJWQlZF9kLmRsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfbWFqb3IsIHB5X21pbm9yKTsKICNlbHNlCi0JCQkJCQkJd3NwcmludGYocHl0aG9uZGxsLCAicHl0aG9uJWQlZC5kbGwiLAotCQkJCQkJCQkgcHlfbWFqb3IsIHB5X21pbm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c3ByaW50ZihweXRob25kbGwsICJweXRob24lZCVkLmRsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfbWFqb3IsIHB5X21pbm9yKTsKICNlbmRpZgotCQkJCQkJfQotCQkJCQkJZnJlZShwYnVmKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlzdHJjcHkocHl0aG9uZGxsLCAiIik7Ci0JCQkJCS8qIHJldHJpZXZlIHRoZSBzY2hlbWUgZm9yIHRoaXMgdmVyc2lvbiAqLwotCQkJCQl7Ci0JCQkJCQljaGFyIGluc3RhbGxfcGF0aFtfTUFYX1BBVEhdOwotCQkJCQkJU0NIRU1FICpzY2hlbWUgPSBHZXRTY2hlbWUocHlfbWFqb3IsIHB5X21pbm9yKTsKLQkJCQkJCXN0cmNweShpbnN0YWxsX3BhdGgsIHB5dGhvbl9kaXIpOwotCQkJCQkJaWYgKGluc3RhbGxfcGF0aFtzdHJsZW4oaW5zdGFsbF9wYXRoKS0xXSAhPSAnXFwnKQotCQkJCQkJCXN0cmNhdChpbnN0YWxsX3BhdGgsICJcXCIpOwotCQkJCQkJc3RyY2F0KGluc3RhbGxfcGF0aCwgc2NoZW1lWzBdLnByZWZpeCk7Ci0JCQkJCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5TVEFMTF9QQVRILCBpbnN0YWxsX3BhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBidWYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShweXRob25kbGwsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmUgdGhlIHNjaGVtZSBmb3IgdGhpcyB2ZXJzaW9uICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgaW5zdGFsbF9wYXRoW19NQVhfUEFUSF07CisgICAgICAgICAgICAgICAgICAgICAgICBTQ0hFTUUgKnNjaGVtZSA9IEdldFNjaGVtZShweV9tYWpvciwgcHlfbWlub3IpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KGluc3RhbGxfcGF0aCwgcHl0aG9uX2Rpcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbF9wYXRoW3N0cmxlbihpbnN0YWxsX3BhdGgpLTFdICE9ICdcXCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY2F0KGluc3RhbGxfcGF0aCwgIlxcIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXQoaW5zdGFsbF9wYXRoLCBzY2hlbWVbMF0ucHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTlNUQUxMX1BBVEgsIGluc3RhbGxfcGF0aCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKIAotCWNhc2UgV01fTk9USUZZOgotCQlscG5tID0gKExQTk1IRFIpIGxQYXJhbTsKKyAgICBjYXNlIFdNX05PVElGWToKKyAgICAgICAgbHBubSA9IChMUE5NSERSKSBsUGFyYW07CiAKLQkJc3dpdGNoIChscG5tLT5jb2RlKSB7Ci0JCQlpbnQgaWQ7Ci0JCWNhc2UgUFNOX1NFVEFDVElWRToKLQkJCWlkID0gU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19WRVJTSU9OU19MSVNULAotCQkJCQkJIExCX0dFVENVUlNFTCwgMCwgMCk7Ci0JCQlpZiAoaWQgPT0gTEJfRVJSKQotCQkJCVByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKLQkJCQkJCQlQU1dJWkJfQkFDSyk7Ci0JCQllbHNlCi0JCQkJUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLAotCQkJCQkJCVBTV0laQl9CQUNLIHwgUFNXSVpCX05FWFQpOwotCQkJYnJlYWs7CisgICAgICAgIHN3aXRjaCAobHBubS0+Y29kZSkgeworICAgICAgICAgICAgaW50IGlkOworICAgICAgICBjYXNlIFBTTl9TRVRBQ1RJVkU6CisgICAgICAgICAgICBpZCA9IFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfVkVSU0lPTlNfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQl9HRVRDVVJTRUwsIDAsIDApOworICAgICAgICAgICAgaWYgKGlkID09IExCX0VSUikKKyAgICAgICAgICAgICAgICBQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNXSVpCX0JBQ0spOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1dJWkJfQkFDSyB8IFBTV0laQl9ORVhUKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1dJWk5FWFQ6Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBQU05fV0laTkVYVDoKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1dJWkZJTklTSDoKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFBTTl9XSVpGSU5JU0g6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9SRVNFVDoKLQkJCWJyZWFrOwotCQkKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAwOworICAgICAgICBjYXNlIFBTTl9SRVNFVDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIEJPT0wgT3BlbkxvZ2ZpbGUoY2hhciAqZGlyKQogewotCWNoYXIgYnVmZmVyW19NQVhfUEFUSCsxXTsKLQl0aW1lX3QgbHRpbWU7Ci0Jc3RydWN0IHRtICpub3c7Ci0JbG9uZyByZXN1bHQ7Ci0JSEtFWSBoS2V5LCBoU3Via2V5OwotCWNoYXIgc3Via2V5X25hbWVbMjU2XTsKLQlzdGF0aWMgY2hhciBLZXlOYW1lW10gPSAKLQkJIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGwiOwotCWNvbnN0IGNoYXIgKnJvb3RfbmFtZSA9IChoa2V5X3Jvb3Q9PUhLRVlfTE9DQUxfTUFDSElORSA/Ci0JICAgICAgICAgICAgICAgICAgICAgICAgIkhLRVlfTE9DQUxfTUFDSElORSIgOiAiSEtFWV9DVVJSRU5UX1VTRVIiKTsKLQlEV09SRCBkaXNwb3NpdGlvbjsKKyAgICBjaGFyIGJ1ZmZlcltfTUFYX1BBVEgrMV07CisgICAgdGltZV90IGx0aW1lOworICAgIHN0cnVjdCB0bSAqbm93OworICAgIGxvbmcgcmVzdWx0OworICAgIEhLRVkgaEtleSwgaFN1YmtleTsKKyAgICBjaGFyIHN1YmtleV9uYW1lWzI1Nl07CisgICAgc3RhdGljIGNoYXIgS2V5TmFtZVtdID0KKyAgICAgICAgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGwiOworICAgIGNvbnN0IGNoYXIgKnJvb3RfbmFtZSA9IChoa2V5X3Jvb3Q9PUhLRVlfTE9DQUxfTUFDSElORSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhLRVlfTE9DQUxfTUFDSElORSIgOiAiSEtFWV9DVVJSRU5UX1VTRVIiKTsKKyAgICBEV09SRCBkaXNwb3NpdGlvbjsKIAotCS8qIFVzZSBDcmVhdGUsIGFzIHRoZSBVbmluc3RhbGwgc3Via2V5IG1heSBub3QgZXhpc3QgdW5kZXIgSEtDVS4KLQkgICBVc2UgQ3JlYXRlS2V5RXgsIHNvIHdlIGNhbiBzcGVjaWZ5IGEgU0FNIHNwZWNpZnlpbmcgd3JpdGUgYWNjZXNzCi0JKi8KLQkJcmVzdWx0ID0gUmVnQ3JlYXRlS2V5RXgoaGtleV9yb290LAotCQkJICAgICAgS2V5TmFtZSwKLQkJCSAgICAgIDAsIC8qIHJlc2VydmVkICovCi0JCQkgICAgICBOVUxMLCAvKiBjbGFzcyAqLwotCQkJICAgICAgMCwgLyogb3B0aW9ucyAqLwotCQkJICAgICAgS0VZX0NSRUFURV9TVUJfS0VZLCAvKiBzYW0gKi8KLQkJCSAgICAgIE5VTEwsIC8qIHNlY3VyaXR5ICovCi0JCQkgICAgICAmaEtleSwgLyogcmVzdWx0IGtleSAqLwotCQkJICAgICAgTlVMTCk7IC8qIGRpc3Bvc2l0aW9uICovCi0JaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0JCWlmIChyZXN1bHQgPT0gRVJST1JfQUNDRVNTX0RFTklFRCkgewotCQkJLyogVGhpcyBzaG91bGQgbm8gbG9uZ2VyIGJlIGFibGUgdG8gaGFwcGVuIC0gd2UgaGF2ZSBhbHJlYWR5Ci0JCQkgICBjaGVja2VkIGlmIHRoZXkgaGF2ZSBwZXJtaXNzaW9ucyBpbiBIS0xNLCBhbmQgYWxsIHVzZXJzCi0JCQkgICBzaG91bGQgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gSEtDVS4KLQkJCSovCi0JCQlNZXNzYWdlQm94KEdldEZvY3VzKCksCi0JCQkJICAgIllvdSBkbyBub3Qgc2VlbSB0byBoYXZlIHN1ZmZpY2llbnQgYWNjZXNzIHJpZ2h0c1xuIgotCQkJCSAgICJvbiB0aGlzIG1hY2hpbmUgdG8gaW5zdGFsbCB0aGlzIHNvZnR3YXJlIiwKLQkJCQkgICBOVUxMLAotCQkJCSAgIE1CX09LIHwgTUJfSUNPTlNUT1ApOwotCQkJcmV0dXJuIEZBTFNFOwotCQl9IGVsc2UgewotCQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCBLZXlOYW1lLCAiQ291bGQgbm90IG9wZW4ga2V5IiwgTUJfT0spOwotCQl9Ci0JfQorICAgIC8qIFVzZSBDcmVhdGUsIGFzIHRoZSBVbmluc3RhbGwgc3Via2V5IG1heSBub3QgZXhpc3QgdW5kZXIgSEtDVS4KKyAgICAgICBVc2UgQ3JlYXRlS2V5RXgsIHNvIHdlIGNhbiBzcGVjaWZ5IGEgU0FNIHNwZWNpZnlpbmcgd3JpdGUgYWNjZXNzCisgICAgKi8KKyAgICAgICAgcmVzdWx0ID0gUmVnQ3JlYXRlS2V5RXgoaGtleV9yb290LAorICAgICAgICAgICAgICAgICAgICAgIEtleU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgMCwgLyogcmVzZXJ2ZWQgKi8KKyAgICAgICAgICAgICAgICAgIE5VTEwsIC8qIGNsYXNzICovCisgICAgICAgICAgICAgICAgICAwLCAvKiBvcHRpb25zICovCisgICAgICAgICAgICAgICAgICBLRVlfQ1JFQVRFX1NVQl9LRVksIC8qIHNhbSAqLworICAgICAgICAgICAgICAgICAgTlVMTCwgLyogc2VjdXJpdHkgKi8KKyAgICAgICAgICAgICAgICAgICZoS2V5LCAvKiByZXN1bHQga2V5ICovCisgICAgICAgICAgICAgICAgICBOVUxMKTsgLyogZGlzcG9zaXRpb24gKi8KKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBFUlJPUl9BQ0NFU1NfREVOSUVEKSB7CisgICAgICAgICAgICAvKiBUaGlzIHNob3VsZCBubyBsb25nZXIgYmUgYWJsZSB0byBoYXBwZW4gLSB3ZSBoYXZlIGFscmVhZHkKKyAgICAgICAgICAgICAgIGNoZWNrZWQgaWYgdGhleSBoYXZlIHBlcm1pc3Npb25zIGluIEhLTE0sIGFuZCBhbGwgdXNlcnMKKyAgICAgICAgICAgICAgIHNob3VsZCBoYXZlIHdyaXRlIGFjY2VzcyB0byBIS0NVLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIllvdSBkbyBub3Qgc2VlbSB0byBoYXZlIHN1ZmZpY2llbnQgYWNjZXNzIHJpZ2h0c1xuIgorICAgICAgICAgICAgICAgICAgICAgICAib24gdGhpcyBtYWNoaW5lIHRvIGluc3RhbGwgdGhpcyBzb2Z0d2FyZSIsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIE1CX09LIHwgTUJfSUNPTlNUT1ApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBLZXlOYW1lLCAiQ291bGQgbm90IG9wZW4ga2V5IiwgTUJfT0spOworICAgICAgICB9CisgICAgfQogCi0Jc3ByaW50ZihidWZmZXIsICIlc1xcJXMtd2luaW5zdC5sb2ciLCBkaXIsIG1ldGFfbmFtZSk7Ci0JbG9nZmlsZSA9IGZvcGVuKGJ1ZmZlciwgImEiKTsKLQl0aW1lKCZsdGltZSk7Ci0Jbm93ID0gbG9jYWx0aW1lKCZsdGltZSk7Ci0Jc3RyZnRpbWUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJICIqKiogSW5zdGFsbGF0aW9uIHN0YXJ0ZWQgJVkvJW0vJWQgJUg6JU0gKioqXG4iLAotCQkgbG9jYWx0aW1lKCZsdGltZSkpOwotCWZwcmludGYobG9nZmlsZSwgYnVmZmVyKTsKLQlmcHJpbnRmKGxvZ2ZpbGUsICJTb3VyY2U6ICVzXG4iLCBtb2R1bGVuYW1lKTsKKyAgICBzcHJpbnRmKGJ1ZmZlciwgIiVzXFwlcy13aW5pbnN0LmxvZyIsIGRpciwgbWV0YV9uYW1lKTsKKyAgICBsb2dmaWxlID0gZm9wZW4oYnVmZmVyLCAiYSIpOworICAgIHRpbWUoJmx0aW1lKTsKKyAgICBub3cgPSBsb2NhbHRpbWUoJmx0aW1lKTsKKyAgICBzdHJmdGltZShidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICIqKiogSW5zdGFsbGF0aW9uIHN0YXJ0ZWQgJVkvJW0vJWQgJUg6JU0gKioqXG4iLAorICAgICAgICAgICAgIGxvY2FsdGltZSgmbHRpbWUpKTsKKyAgICBmcHJpbnRmKGxvZ2ZpbGUsIGJ1ZmZlcik7CisgICAgZnByaW50Zihsb2dmaWxlLCAiU291cmNlOiAlc1xuIiwgbW9kdWxlbmFtZSk7CiAKLQkvKiBSb290IGtleSBtdXN0IGJlIGZpcnN0IGVudHJ5IHByb2Nlc3NlZCBieSB1bmluc3RhbGxlci4gKi8KLQlmcHJpbnRmKGxvZ2ZpbGUsICI5OTkgUm9vdCBLZXk6ICVzXG4iLCByb290X25hbWUpOworICAgIC8qIFJvb3Qga2V5IG11c3QgYmUgZmlyc3QgZW50cnkgcHJvY2Vzc2VkIGJ5IHVuaW5zdGFsbGVyLiAqLworICAgIGZwcmludGYobG9nZmlsZSwgIjk5OSBSb290IEtleTogJXNcbiIsIHJvb3RfbmFtZSk7CiAKLQlzcHJpbnRmKHN1YmtleV9uYW1lLCAiJXMtcHklZC4lZCIsIG1ldGFfbmFtZSwgcHlfbWFqb3IsIHB5X21pbm9yKTsKKyAgICBzcHJpbnRmKHN1YmtleV9uYW1lLCAiJXMtcHklZC4lZCIsIG1ldGFfbmFtZSwgcHlfbWFqb3IsIHB5X21pbm9yKTsKIAotCXJlc3VsdCA9IFJlZ0NyZWF0ZUtleUV4KGhLZXksIHN1YmtleV9uYW1lLAotCQkJCTAsIE5VTEwsIDAsCi0JCQkJS0VZX1dSSVRFLAotCQkJCU5VTEwsCi0JCQkJJmhTdWJrZXksCi0JCQkJJmRpc3Bvc2l0aW9uKTsKKyAgICByZXN1bHQgPSBSZWdDcmVhdGVLZXlFeChoS2V5LCBzdWJrZXlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU3Via2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwb3NpdGlvbik7CiAKLQlpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCi0JCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgc3Via2V5X25hbWUsICJDb3VsZCBub3QgY3JlYXRlIGtleSIsIE1CX09LKTsKKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgc3Via2V5X25hbWUsICJDb3VsZCBub3QgY3JlYXRlIGtleSIsIE1CX09LKTsKIAotCVJlZ0Nsb3NlS2V5KGhLZXkpOworICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOwogCi0JaWYgKGRpc3Bvc2l0aW9uID09IFJFR19DUkVBVEVEX05FV19LRVkpCi0JCWZwcmludGYobG9nZmlsZSwgIjAyMCBSZWcgREIgS2V5OiBbJXNdJXNcbiIsIEtleU5hbWUsIHN1YmtleV9uYW1lKTsKKyAgICBpZiAoZGlzcG9zaXRpb24gPT0gUkVHX0NSRUFURURfTkVXX0tFWSkKKyAgICAgICAgZnByaW50Zihsb2dmaWxlLCAiMDIwIFJlZyBEQiBLZXk6IFslc10lc1xuIiwgS2V5TmFtZSwgc3Via2V5X25hbWUpOwogCi0Jc3ByaW50ZihidWZmZXIsICJQeXRob24gJWQuJWQgJXMiLCBweV9tYWpvciwgcHlfbWlub3IsIHRpdGxlKTsKKyAgICBzcHJpbnRmKGJ1ZmZlciwgIlB5dGhvbiAlZC4lZCAlcyIsIHB5X21ham9yLCBweV9taW5vciwgdGl0bGUpOwogCi0JcmVzdWx0ID0gUmVnU2V0VmFsdWVFeChoU3Via2V5LCAiRGlzcGxheU5hbWUiLAotCQkJICAgICAgIDAsCi0JCQkgICAgICAgUkVHX1NaLAotCQkJICAgICAgIGJ1ZmZlciwKLQkJCSAgICAgICBzdHJsZW4oYnVmZmVyKSsxKTsKKyAgICByZXN1bHQgPSBSZWdTZXRWYWx1ZUV4KGhTdWJrZXksICJEaXNwbGF5TmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX1NaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGJ1ZmZlcikrMSk7CiAKLQlpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCi0JCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgYnVmZmVyLCAiQ291bGQgbm90IHNldCBrZXkgdmFsdWUiLCBNQl9PSyk7CisgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIGJ1ZmZlciwgIkNvdWxkIG5vdCBzZXQga2V5IHZhbHVlIiwgTUJfT0spOwogCi0JZnByaW50Zihsb2dmaWxlLCAiMDQwIFJlZyBEQiBWYWx1ZTogWyVzXFwlc10lcz0lc1xuIiwKLQkJS2V5TmFtZSwgc3Via2V5X25hbWUsICJEaXNwbGF5TmFtZSIsIGJ1ZmZlcik7CisgICAgZnByaW50Zihsb2dmaWxlLCAiMDQwIFJlZyBEQiBWYWx1ZTogWyVzXFwlc10lcz0lc1xuIiwKKyAgICAgICAgS2V5TmFtZSwgc3Via2V5X25hbWUsICJEaXNwbGF5TmFtZSIsIGJ1ZmZlcik7CiAKLQl7Ci0JCUZJTEUgKmZwOwotCQlzcHJpbnRmKGJ1ZmZlciwgIiVzXFxSZW1vdmUlcy5leGUiLCBkaXIsIG1ldGFfbmFtZSk7Ci0JCWZwID0gZm9wZW4oYnVmZmVyLCAid2IiKTsKLQkJZndyaXRlKGFyY19kYXRhLCBleGVfc2l6ZSwgMSwgZnApOwotCQlmY2xvc2UoZnApOworICAgIHsKKyAgICAgICAgRklMRSAqZnA7CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJXNcXFJlbW92ZSVzLmV4ZSIsIGRpciwgbWV0YV9uYW1lKTsKKyAgICAgICAgZnAgPSBmb3BlbihidWZmZXIsICJ3YiIpOworICAgICAgICBmd3JpdGUoYXJjX2RhdGEsIGV4ZV9zaXplLCAxLCBmcCk7CisgICAgICAgIGZjbG9zZShmcCk7CiAKLQkJc3ByaW50ZihidWZmZXIsICJcIiVzXFxSZW1vdmUlcy5leGVcIiAtdSBcIiVzXFwlcy13aW5pbnN0LmxvZ1wiIiwKLQkJCWRpciwgbWV0YV9uYW1lLCBkaXIsIG1ldGFfbmFtZSk7CisgICAgICAgIHNwcmludGYoYnVmZmVyLCAiXCIlc1xcUmVtb3ZlJXMuZXhlXCIgLXUgXCIlc1xcJXMtd2luaW5zdC5sb2dcIiIsCisgICAgICAgICAgICBkaXIsIG1ldGFfbmFtZSwgZGlyLCBtZXRhX25hbWUpOwogCi0JCXJlc3VsdCA9IFJlZ1NldFZhbHVlRXgoaFN1YmtleSwgIlVuaW5zdGFsbFN0cmluZyIsCi0JCQkJICAgICAgIDAsCi0JCQkJICAgICAgIFJFR19TWiwKLQkJCQkgICAgICAgYnVmZmVyLAotCQkJCSAgICAgICBzdHJsZW4oYnVmZmVyKSsxKTsKLQkKLQkJaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotCQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCBidWZmZXIsICJDb3VsZCBub3Qgc2V0IGtleSB2YWx1ZSIsIE1CX09LKTsKKyAgICAgICAgcmVzdWx0ID0gUmVnU2V0VmFsdWVFeChoU3Via2V5LCAiVW5pbnN0YWxsU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19TWiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGJ1ZmZlcikrMSk7CiAKLQkJZnByaW50Zihsb2dmaWxlLCAiMDQwIFJlZyBEQiBWYWx1ZTogWyVzXFwlc10lcz0lc1xuIiwKLQkJCUtleU5hbWUsIHN1YmtleV9uYW1lLCAiVW5pbnN0YWxsU3RyaW5nIiwgYnVmZmVyKTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgICAgIE1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgYnVmZmVyLCAiQ291bGQgbm90IHNldCBrZXkgdmFsdWUiLCBNQl9PSyk7CisKKyAgICAgICAgZnByaW50Zihsb2dmaWxlLCAiMDQwIFJlZyBEQiBWYWx1ZTogWyVzXFwlc10lcz0lc1xuIiwKKyAgICAgICAgICAgIEtleU5hbWUsIHN1YmtleV9uYW1lLCAiVW5pbnN0YWxsU3RyaW5nIiwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIHN0YXRpYyB2b2lkIENsb3NlTG9nZmlsZSh2b2lkKQogewotCWNoYXIgYnVmZmVyW19NQVhfUEFUSCsxXTsKLQl0aW1lX3QgbHRpbWU7Ci0Jc3RydWN0IHRtICpub3c7CisgICAgY2hhciBidWZmZXJbX01BWF9QQVRIKzFdOworICAgIHRpbWVfdCBsdGltZTsKKyAgICBzdHJ1Y3QgdG0gKm5vdzsKIAotCXRpbWUoJmx0aW1lKTsKLQlub3cgPSBsb2NhbHRpbWUoJmx0aW1lKTsKLQlzdHJmdGltZShidWZmZXIsIHNpemVvZihidWZmZXIpLAotCQkgIioqKiBJbnN0YWxsYXRpb24gZmluaXNoZWQgJVkvJW0vJWQgJUg6JU0gKioqXG4iLAotCQkgbG9jYWx0aW1lKCZsdGltZSkpOwotCWZwcmludGYobG9nZmlsZSwgYnVmZmVyKTsKLQlpZiAobG9nZmlsZSkKLQkJZmNsb3NlKGxvZ2ZpbGUpOworICAgIHRpbWUoJmx0aW1lKTsKKyAgICBub3cgPSBsb2NhbHRpbWUoJmx0aW1lKTsKKyAgICBzdHJmdGltZShidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICIqKiogSW5zdGFsbGF0aW9uIGZpbmlzaGVkICVZLyVtLyVkICVIOiVNICoqKlxuIiwKKyAgICAgICAgICAgICBsb2NhbHRpbWUoJmx0aW1lKSk7CisgICAgZnByaW50Zihsb2dmaWxlLCBidWZmZXIpOworICAgIGlmIChsb2dmaWxlKQorICAgICAgICBmY2xvc2UobG9nZmlsZSk7CiB9CiAKIEJPT0wgQ0FMTEJBQ0sKIEluc3RhbGxGaWxlc0RsZ1Byb2MoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlMUE5NSERSIGxwbm07Ci0JY2hhciBCdWZmZXJbNDA5Nl07Ci0JU0NIRU1FICpzY2hlbWU7CisgICAgTFBOTUhEUiBscG5tOworICAgIGNoYXIgQnVmZmVyWzQwOTZdOworICAgIFNDSEVNRSAqc2NoZW1lOwogCi0Jc3dpdGNoIChtc2cpIHsKLQljYXNlIFdNX0lOSVRESUFMT0c6Ci0JCWlmIChoQml0bWFwKQotCQkJU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19CSVRNQVAsIFNUTV9TRVRJTUFHRSwKLQkJCQkJICAgSU1BR0VfQklUTUFQLCAoTFBBUkFNKWhCaXRtYXApOwotCQl3c3ByaW50ZihCdWZmZXIsCi0JCQkgICJDbGljayBOZXh0IHRvIGJlZ2luIHRoZSBpbnN0YWxsYXRpb24gb2YgJXMuICIKLQkJCSAgIklmIHlvdSB3YW50IHRvIHJldmlldyBvciBjaGFuZ2UgYW55IG9mIHlvdXIgIgotCQkJICAiIGluc3RhbGxhdGlvbiBzZXR0aW5ncywgY2xpY2sgQmFjay4gIgotCQkJICAiQ2xpY2sgQ2FuY2VsIHRvIGV4aXQgdGhlIHdpemFyZC4iLAotCQkJICBtZXRhX25hbWUpOwotCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsIEJ1ZmZlcik7Ci0JCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTkZPLCAiUmVhZHkgdG8gaW5zdGFsbCIpOwotCQlicmVhazsKKyAgICBzd2l0Y2ggKG1zZykgeworICAgIGNhc2UgV01fSU5JVERJQUxPRzoKKyAgICAgICAgaWYgKGhCaXRtYXApCisgICAgICAgICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX0JJVE1BUCwgU1RNX1NFVElNQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX0JJVE1BUCwgKExQQVJBTSloQml0bWFwKTsKKyAgICAgICAgd3NwcmludGYoQnVmZmVyLAorICAgICAgICAgICAgICAgICAgIkNsaWNrIE5leHQgdG8gYmVnaW4gdGhlIGluc3RhbGxhdGlvbiBvZiAlcy4gIgorICAgICAgICAgICAgICAgICAgIklmIHlvdSB3YW50IHRvIHJldmlldyBvciBjaGFuZ2UgYW55IG9mIHlvdXIgIgorICAgICAgICAgICAgICAgICAgIiBpbnN0YWxsYXRpb24gc2V0dGluZ3MsIGNsaWNrIEJhY2suICIKKyAgICAgICAgICAgICAgICAgICJDbGljayBDYW5jZWwgdG8gZXhpdCB0aGUgd2l6YXJkLiIsCisgICAgICAgICAgICAgICAgICBtZXRhX25hbWUpOworICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsIEJ1ZmZlcik7CisgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTkZPLCAiUmVhZHkgdG8gaW5zdGFsbCIpOworICAgICAgICBicmVhazsKIAotCWNhc2UgV01fTlVNRklMRVM6Ci0JCVNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfUFJPR1JFU1MsIFBCTV9TRVRSQU5HRSwgMCwgbFBhcmFtKTsKLQkJUHVtcE1lc3NhZ2VzKCk7Ci0JCXJldHVybiBUUlVFOworICAgIGNhc2UgV01fTlVNRklMRVM6CisgICAgICAgIFNlbmREbGdJdGVtTWVzc2FnZShod25kLCBJRENfUFJPR1JFU1MsIFBCTV9TRVRSQU5HRSwgMCwgbFBhcmFtKTsKKyAgICAgICAgUHVtcE1lc3NhZ2VzKCk7CisgICAgICAgIHJldHVybiBUUlVFOwogCi0JY2FzZSBXTV9ORVhURklMRToKLQkJU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19QUk9HUkVTUywgUEJNX1NFVFBPUywgd1BhcmFtLAotCQkJCSAgICAwKTsKLQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lORk8sIChMUFNUUilsUGFyYW0pOwotCQlQdW1wTWVzc2FnZXMoKTsKLQkJcmV0dXJuIFRSVUU7CisgICAgY2FzZSBXTV9ORVhURklMRToKKyAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19QUk9HUkVTUywgUEJNX1NFVFBPUywgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5GTywgKExQU1RSKWxQYXJhbSk7CisgICAgICAgIFB1bXBNZXNzYWdlcygpOworICAgICAgICByZXR1cm4gVFJVRTsKIAotCWNhc2UgV01fTk9USUZZOgotCQlscG5tID0gKExQTk1IRFIpIGxQYXJhbTsKKyAgICBjYXNlIFdNX05PVElGWToKKyAgICAgICAgbHBubSA9IChMUE5NSERSKSBsUGFyYW07CiAKLQkJc3dpdGNoIChscG5tLT5jb2RlKSB7Ci0JCWNhc2UgUFNOX1NFVEFDVElWRToKLQkJCVByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwKLQkJCQkJCVBTV0laQl9CQUNLIHwgUFNXSVpCX05FWFQpOwotCQkJYnJlYWs7CisgICAgICAgIHN3aXRjaCAobHBubS0+Y29kZSkgeworICAgICAgICBjYXNlIFBTTl9TRVRBQ1RJVkU6CisgICAgICAgICAgICBQcm9wU2hlZXRfU2V0V2l6QnV0dG9ucyhHZXRQYXJlbnQoaHduZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU1dJWkJfQkFDSyB8IFBTV0laQl9ORVhUKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1dJWkZJTklTSDoKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFBTTl9XSVpGSU5JU0g6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9XSVpORVhUOgotCQkJLyogSGFuZGxlIGEgTmV4dCBidXR0b24gY2xpY2sgaGVyZSAqLwotCQkJaERpYWxvZyA9IGh3bmQ7Ci0JCQlzdWNjZXNzID0gVFJVRTsKKyAgICAgICAgY2FzZSBQU05fV0laTkVYVDoKKyAgICAgICAgICAgIC8qIEhhbmRsZSBhIE5leHQgYnV0dG9uIGNsaWNrIGhlcmUgKi8KKyAgICAgICAgICAgIGhEaWFsb2cgPSBod25kOworICAgICAgICAgICAgc3VjY2VzcyA9IFRSVUU7CiAKLQkJCS8qIERpc2FibGUgdGhlIGJ1dHRvbnMgd2hpbGUgd2Ugd29yay4gIFNlbmRpbmcgQ0FOQ0VMVE9DTE9TRSBoYXMKLQkJCSAgdGhlIGVmZmVjdCBvZiBkaXNhYmxpbmcgdGhlIGNhbmNlbCBidXR0b24sIHdoaWNoIGlzIGEpIGFzIHdlCi0JCQkgIGRvIGV2ZXJ5dGhpbmcgc3luY2hyb25vdXNseSB3ZSBjYW4ndCBjYW5jZWwsIGFuZCBiKSB0aGUgbmV4dAotCQkJICBzdGVwIGlzICdmaW5pc2hlZCcsIHdoZW4gaXQgaXMgdG9vIGxhdGUgdG8gY2FuY2VsIGFueXdheS4KLQkJCSAgVGhlIG5leHQgc3RlcCBiZWluZyAnRmluaXNoZWQnIG1lYW5zIHdlIGFsc28gZG9uJ3QgbmVlZCB0bwotCQkJICByZXN0b3JlIHRoZSBidXR0b24gc3RhdGUgYmFjayAqLwotCQkJUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLCAwKTsKLQkJCVNlbmRNZXNzYWdlKEdldFBhcmVudChod25kKSwgUFNNX0NBTkNFTFRPQ0xPU0UsIDAsIDApOwotCQkJLyogTWFrZSBzdXJlIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG5hbWUgZW5kcyBpbiBhICovCi0JCQkvKiBiYWNrc2xhc2ggKi8KLQkJCWlmIChweXRob25fZGlyW3N0cmxlbihweXRob25fZGlyKS0xXSAhPSAnXFwnKQotCQkJCXN0cmNhdChweXRob25fZGlyLCAiXFwiKTsKLQkJCS8qIFN0cmlwIHRoZSB0cmFpbGluZyBiYWNrc2xhc2ggYWdhaW4gKi8KLQkJCXB5dGhvbl9kaXJbc3RybGVuKHB5dGhvbl9kaXIpLTFdID0gJ1wwJzsKLSAgICAgICAgICAgIAotCQkJQ2hlY2tSb290S2V5KGh3bmQpOwotCSAgICAKLQkJCWlmICghT3BlbkxvZ2ZpbGUocHl0aG9uX2RpcikpCi0JCQkJYnJlYWs7CisgICAgICAgICAgICAvKiBEaXNhYmxlIHRoZSBidXR0b25zIHdoaWxlIHdlIHdvcmsuICBTZW5kaW5nIENBTkNFTFRPQ0xPU0UgaGFzCisgICAgICAgICAgICAgIHRoZSBlZmZlY3Qgb2YgZGlzYWJsaW5nIHRoZSBjYW5jZWwgYnV0dG9uLCB3aGljaCBpcyBhKSBhcyB3ZQorICAgICAgICAgICAgICBkbyBldmVyeXRoaW5nIHN5bmNocm9ub3VzbHkgd2UgY2FuJ3QgY2FuY2VsLCBhbmQgYikgdGhlIG5leHQKKyAgICAgICAgICAgICAgc3RlcCBpcyAnZmluaXNoZWQnLCB3aGVuIGl0IGlzIHRvbyBsYXRlIHRvIGNhbmNlbCBhbnl3YXkuCisgICAgICAgICAgICAgIFRoZSBuZXh0IHN0ZXAgYmVpbmcgJ0ZpbmlzaGVkJyBtZWFucyB3ZSBhbHNvIGRvbid0IG5lZWQgdG8KKyAgICAgICAgICAgICAgcmVzdG9yZSB0aGUgYnV0dG9uIHN0YXRlIGJhY2sgKi8KKyAgICAgICAgICAgIFByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwgMCk7CisgICAgICAgICAgICBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFBTTV9DQU5DRUxUT0NMT1NFLCAwLCAwKTsKKyAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBuYW1lIGVuZHMgaW4gYSAqLworICAgICAgICAgICAgLyogYmFja3NsYXNoICovCisgICAgICAgICAgICBpZiAocHl0aG9uX2RpcltzdHJsZW4ocHl0aG9uX2RpciktMV0gIT0gJ1xcJykKKyAgICAgICAgICAgICAgICBzdHJjYXQocHl0aG9uX2RpciwgIlxcIik7CisgICAgICAgICAgICAvKiBTdHJpcCB0aGUgdHJhaWxpbmcgYmFja3NsYXNoIGFnYWluICovCisgICAgICAgICAgICBweXRob25fZGlyW3N0cmxlbihweXRob25fZGlyKS0xXSA9ICdcMCc7CisKKyAgICAgICAgICAgIENoZWNrUm9vdEtleShod25kKTsKKworICAgICAgICAgICAgaWYgKCFPcGVuTG9nZmlsZShweXRob25fZGlyKSkKKyAgICAgICAgICAgICAgICBicmVhazsKIAogLyoKICAqIFRoZSBzY2hlbWUgd2UgaGF2ZSB0byB1c2UgZGVwZW5kcyBvbiB0aGUgUHl0aG9uIHZlcnNpb24uLi4KQEAgLTE5MTUsMjAyICsxOTE1LDIwMiBAQAogICdkYXRhJyAgIDogJyRiYXNlJywKICB9CiAqLwotCQkJc2NoZW1lID0gR2V0U2NoZW1lKHB5X21ham9yLCBweV9taW5vcik7Ci0JCQkvKiBSdW4gdGhlIHByZS1pbnN0YWxsIHNjcmlwdC4gKi8KLQkJCWlmIChwcmVfaW5zdGFsbF9zY3JpcHQgJiYgKnByZV9pbnN0YWxsX3NjcmlwdCkgewotCQkJCVNldERsZ0l0ZW1UZXh0IChod25kLCBJRENfVElUTEUsCi0JCQkJCQkiUnVubmluZyBwcmUtaW5zdGFsbGF0aW9uIHNjcmlwdCIpOwotCQkJCXJ1bl9zaW1wbGVfc2NyaXB0KHByZV9pbnN0YWxsX3NjcmlwdCk7Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8qIEV4dHJhY3QgYWxsIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgKi8KLQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwgIkluc3RhbGxpbmcgZmlsZXMuLi4iKTsKLQkJCWlmICghdW56aXBfYXJjaGl2ZSAoc2NoZW1lLAotCQkJCQkgICAgcHl0aG9uX2RpciwgYXJjX2RhdGEsCi0JCQkJCSAgICBhcmNfc2l6ZSwgbm90aWZ5KSkKLQkJCQlzZXRfZmFpbHVyZV9yZWFzb24oIkZhaWxlZCB0byB1bnppcCBpbnN0YWxsYXRpb24gZmlsZXMiKTsKLQkJCS8qIENvbXBpbGUgdGhlIHB5LWZpbGVzICovCi0JCQlpZiAoc3VjY2VzcyAmJiBweWNfY29tcGlsZSkgewotCQkJCWludCBlcnJvcnM7Ci0JCQkJSElOU1RBTkNFIGhQeXRob247Ci0JCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLAotCQkJCQkJIkNvbXBpbGluZyBmaWxlcyB0byAucHljLi4uIik7CisgICAgICAgICAgICBzY2hlbWUgPSBHZXRTY2hlbWUocHlfbWFqb3IsIHB5X21pbm9yKTsKKyAgICAgICAgICAgIC8qIFJ1biB0aGUgcHJlLWluc3RhbGwgc2NyaXB0LiAqLworICAgICAgICAgICAgaWYgKHByZV9pbnN0YWxsX3NjcmlwdCAmJiAqcHJlX2luc3RhbGxfc2NyaXB0KSB7CisgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQgKGh3bmQsIElEQ19USVRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1bm5pbmcgcHJlLWluc3RhbGxhdGlvbiBzY3JpcHQiKTsKKyAgICAgICAgICAgICAgICBydW5fc2ltcGxlX3NjcmlwdChwcmVfaW5zdGFsbF9zY3JpcHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBFeHRyYWN0IGFsbCBmaWxlcyBmcm9tIHRoZSBhcmNoaXZlICovCisgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsICJJbnN0YWxsaW5nIGZpbGVzLi4uIik7CisgICAgICAgICAgICBpZiAoIXVuemlwX2FyY2hpdmUgKHNjaGVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0aG9uX2RpciwgYXJjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY19zaXplLCBub3RpZnkpKQorICAgICAgICAgICAgICAgIHNldF9mYWlsdXJlX3JlYXNvbigiRmFpbGVkIHRvIHVuemlwIGluc3RhbGxhdGlvbiBmaWxlcyIpOworICAgICAgICAgICAgLyogQ29tcGlsZSB0aGUgcHktZmlsZXMgKi8KKyAgICAgICAgICAgIGlmIChzdWNjZXNzICYmIHB5Y19jb21waWxlKSB7CisgICAgICAgICAgICAgICAgaW50IGVycm9yczsKKyAgICAgICAgICAgICAgICBISU5TVEFOQ0UgaFB5dGhvbjsKKyAgICAgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb21waWxpbmcgZmlsZXMgdG8gLnB5Yy4uLiIpOwogCi0JCQkJU2V0RGxnSXRlbVRleHQoaERpYWxvZywgSURDX0lORk8sICJMb2FkaW5nIHB5dGhvbi4uLiIpOwotCQkJCWhQeXRob24gPSBMb2FkUHl0aG9uRGxsKHB5dGhvbmRsbCk7Ci0JCQkJaWYgKGhQeXRob24pIHsKLQkJCQkJZXJyb3JzID0gY29tcGlsZV9maWxlbGlzdChoUHl0aG9uLCBGQUxTRSk7Ci0JCQkJCUZyZWVMaWJyYXJ5KGhQeXRob24pOwotCQkJCX0KLQkJCQkvKiBDb21waWxhdGlvbiBlcnJvcnMgYXJlIGludGVudGlvbmFsbHkgaWdub3JlZDoKLQkJCQkgKiBQeXRob24yLjAgY29udGFpbnMgYSBidWcgd2hpY2ggd2lsbCByZXN1bHQKLQkJCQkgKiBpbiBzeXMucGF0aCBjb250YWluaW5nIGdhcmJhZ2UgdW5kZXIgY2VydGFpbgotCQkJCSAqIGNpcmN1bXN0YW5jZXMsIGFuZCBhbiBlcnJvciBtZXNzYWdlIHdpbGwgb25seQotCQkJCSAqIGNvbmZ1c2UgdGhlIHVzZXIuCi0JCQkJICovCi0JCQl9Ci0JCQlpZiAoc3VjY2VzcyAmJiBweW9fY29tcGlsZSkgewotCQkJCWludCBlcnJvcnM7Ci0JCQkJSElOU1RBTkNFIGhQeXRob247Ci0JCQkJU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLAotCQkJCQkJIkNvbXBpbGluZyBmaWxlcyB0byAucHlvLi4uIik7CisgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaERpYWxvZywgSURDX0lORk8sICJMb2FkaW5nIHB5dGhvbi4uLiIpOworICAgICAgICAgICAgICAgIGhQeXRob24gPSBMb2FkUHl0aG9uRGxsKHB5dGhvbmRsbCk7CisgICAgICAgICAgICAgICAgaWYgKGhQeXRob24pIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gY29tcGlsZV9maWxlbGlzdChoUHl0aG9uLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIEZyZWVMaWJyYXJ5KGhQeXRob24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBDb21waWxhdGlvbiBlcnJvcnMgYXJlIGludGVudGlvbmFsbHkgaWdub3JlZDoKKyAgICAgICAgICAgICAgICAgKiBQeXRob24yLjAgY29udGFpbnMgYSBidWcgd2hpY2ggd2lsbCByZXN1bHQKKyAgICAgICAgICAgICAgICAgKiBpbiBzeXMucGF0aCBjb250YWluaW5nIGdhcmJhZ2UgdW5kZXIgY2VydGFpbgorICAgICAgICAgICAgICAgICAqIGNpcmN1bXN0YW5jZXMsIGFuZCBhbiBlcnJvciBtZXNzYWdlIHdpbGwgb25seQorICAgICAgICAgICAgICAgICAqIGNvbmZ1c2UgdGhlIHVzZXIuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VjY2VzcyAmJiBweW9fY29tcGlsZSkgeworICAgICAgICAgICAgICAgIGludCBlcnJvcnM7CisgICAgICAgICAgICAgICAgSElOU1RBTkNFIGhQeXRob247CisgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX1RJVExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGlsaW5nIGZpbGVzIHRvIC5weW8uLi4iKTsKIAotCQkJCVNldERsZ0l0ZW1UZXh0KGhEaWFsb2csIElEQ19JTkZPLCAiTG9hZGluZyBweXRob24uLi4iKTsKLQkJCQloUHl0aG9uID0gTG9hZFB5dGhvbkRsbChweXRob25kbGwpOwotCQkJCWlmIChoUHl0aG9uKSB7Ci0JCQkJCWVycm9ycyA9IGNvbXBpbGVfZmlsZWxpc3QoaFB5dGhvbiwgVFJVRSk7Ci0JCQkJCUZyZWVMaWJyYXJ5KGhQeXRob24pOwotCQkJCX0KLQkJCQkvKiBFcnJvcnMgaWdub3JlZDogc2VlIGFib3ZlICovCi0JCQl9CisgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaERpYWxvZywgSURDX0lORk8sICJMb2FkaW5nIHB5dGhvbi4uLiIpOworICAgICAgICAgICAgICAgIGhQeXRob24gPSBMb2FkUHl0aG9uRGxsKHB5dGhvbmRsbCk7CisgICAgICAgICAgICAgICAgaWYgKGhQeXRob24pIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gY29tcGlsZV9maWxlbGlzdChoUHl0aG9uLCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgRnJlZUxpYnJhcnkoaFB5dGhvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEVycm9ycyBpZ25vcmVkOiBzZWUgYWJvdmUgKi8KKyAgICAgICAgICAgIH0KIAogCi0JCQlicmVhazsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFNOX1JFU0VUOgotCQkJYnJlYWs7Ci0JCQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIGNhc2UgUFNOX1JFU0VUOgorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKIEJPT0wgQ0FMTEJBQ0sKIEZpbmlzaGVkRGxnUHJvYyhIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCUxQTk1IRFIgbHBubTsKKyAgICBMUE5NSERSIGxwbm07CiAKLQlzd2l0Y2ggKG1zZykgewotCWNhc2UgV01fSU5JVERJQUxPRzoKLQkJaWYgKGhCaXRtYXApCi0JCQlTZW5kRGxnSXRlbU1lc3NhZ2UoaHduZCwgSURDX0JJVE1BUCwgU1RNX1NFVElNQUdFLAotCQkJCQkgICBJTUFHRV9CSVRNQVAsIChMUEFSQU0paEJpdG1hcCk7Ci0JCWlmICghc3VjY2VzcykKLQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTkZPLCBnZXRfZmFpbHVyZV9yZWFzb24oKSk7CisgICAgc3dpdGNoIChtc2cpIHsKKyAgICBjYXNlIFdNX0lOSVRESUFMT0c6CisgICAgICAgIGlmIChoQml0bWFwKQorICAgICAgICAgICAgU2VuZERsZ0l0ZW1NZXNzYWdlKGh3bmQsIElEQ19CSVRNQVAsIFNUTV9TRVRJTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUFHRV9CSVRNQVAsIChMUEFSQU0paEJpdG1hcCk7CisgICAgICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19JTkZPLCBnZXRfZmFpbHVyZV9yZWFzb24oKSk7CiAKLQkJLyogYXN5bmMgZGVsYXk6IHdpbGwgc2hvdyB0aGUgZGlhbG9nIGJveCBjb21wbGV0ZWx5IGJlZm9yZQotCQkgICB0aGUgaW5zdGFsbF9zY3JpcHQgaXMgc3RhcnRlZCAqLwotCQlQb3N0TWVzc2FnZShod25kLCBXTV9VU0VSLCAwLCAwTCk7Ci0JCXJldHVybiBUUlVFOworICAgICAgICAvKiBhc3luYyBkZWxheTogd2lsbCBzaG93IHRoZSBkaWFsb2cgYm94IGNvbXBsZXRlbHkgYmVmb3JlCisgICAgICAgICAgIHRoZSBpbnN0YWxsX3NjcmlwdCBpcyBzdGFydGVkICovCisgICAgICAgIFBvc3RNZXNzYWdlKGh3bmQsIFdNX1VTRVIsIDAsIDBMKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAKLQljYXNlIFdNX1VTRVI6CisgICAgY2FzZSBXTV9VU0VSOgogCi0JCWlmIChzdWNjZXNzICYmIGluc3RhbGxfc2NyaXB0ICYmIGluc3RhbGxfc2NyaXB0WzBdKSB7Ci0JCQljaGFyIGZuYW1lW01BWF9QQVRIXTsKLQkJCWNoYXIgKmJ1ZmZlcjsKLQkJCUhDVVJTT1IgaEN1cnNvcjsKLQkJCWludCByZXN1bHQ7CisgICAgICAgIGlmIChzdWNjZXNzICYmIGluc3RhbGxfc2NyaXB0ICYmIGluc3RhbGxfc2NyaXB0WzBdKSB7CisgICAgICAgICAgICBjaGFyIGZuYW1lW01BWF9QQVRIXTsKKyAgICAgICAgICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICAgICAgICAgIEhDVVJTT1IgaEN1cnNvcjsKKyAgICAgICAgICAgIGludCByZXN1bHQ7CiAKLQkJCWNoYXIgKmFyZ3ZbM10gPSB7TlVMTCwgIi1pbnN0YWxsIiwgTlVMTH07CisgICAgICAgICAgICBjaGFyICphcmd2WzNdID0ge05VTEwsICItaW5zdGFsbCIsIE5VTEx9OwogCi0JCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsCi0JCQkJCSJQbGVhc2Ugd2FpdCB3aGlsZSBydW5uaW5nIHBvc3RpbnN0YWxsIHNjcmlwdC4uLiIpOwotCQkJc3RyY3B5KGZuYW1lLCBweXRob25fZGlyKTsKLQkJCXN0cmNhdChmbmFtZSwgIlxcU2NyaXB0c1xcIik7Ci0JCQlzdHJjYXQoZm5hbWUsIGluc3RhbGxfc2NyaXB0KTsKKyAgICAgICAgICAgIFNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHdhaXQgd2hpbGUgcnVubmluZyBwb3N0aW5zdGFsbCBzY3JpcHQuLi4iKTsKKyAgICAgICAgICAgIHN0cmNweShmbmFtZSwgcHl0aG9uX2Rpcik7CisgICAgICAgICAgICBzdHJjYXQoZm5hbWUsICJcXFNjcmlwdHNcXCIpOworICAgICAgICAgICAgc3RyY2F0KGZuYW1lLCBpbnN0YWxsX3NjcmlwdCk7CiAKLQkJCWlmIChsb2dmaWxlKQotCQkJCWZwcmludGYobG9nZmlsZSwgIjMwMCBSdW4gU2NyaXB0OiBbJXNdJXNcbiIsIHB5dGhvbmRsbCwgZm5hbWUpOworICAgICAgICAgICAgaWYgKGxvZ2ZpbGUpCisgICAgICAgICAgICAgICAgZnByaW50Zihsb2dmaWxlLCAiMzAwIFJ1biBTY3JpcHQ6IFslc10lc1xuIiwgcHl0aG9uZGxsLCBmbmFtZSk7CiAKLQkJCWhDdXJzb3IgPSBTZXRDdXJzb3IoTG9hZEN1cnNvcihOVUxMLCBJRENfV0FJVCkpOworICAgICAgICAgICAgaEN1cnNvciA9IFNldEN1cnNvcihMb2FkQ3Vyc29yKE5VTEwsIElEQ19XQUlUKSk7CiAKLQkJCWFyZ3ZbMF0gPSBmbmFtZTsKKyAgICAgICAgICAgIGFyZ3ZbMF0gPSBmbmFtZTsKIAotCQkJcmVzdWx0ID0gcnVuX2luc3RhbGxzY3JpcHQoZm5hbWUsIDIsIGFyZ3YsICZidWZmZXIpOwotCQkJaWYgKDAgIT0gcmVzdWx0KSB7Ci0JCQkJZnByaW50ZihzdGRlcnIsICIqKiogcnVuX2luc3RhbGxzY3JpcHQ6IGludGVybmFsIGVycm9yIDB4JVggKioqXG4iLCByZXN1bHQpOwotCQkJfQotCQkJaWYgKGJ1ZmZlcikKLQkJCQlTZXREbGdJdGVtVGV4dChod25kLCBJRENfSU5GTywgYnVmZmVyKTsKLQkJCVNldERsZ0l0ZW1UZXh0KGh3bmQsIElEQ19USVRMRSwKLQkJCQkJIlBvc3RpbnN0YWxsIHNjcmlwdCBmaW5pc2hlZC5cbiIKLQkJCQkJIkNsaWNrIHRoZSBGaW5pc2ggYnV0dG9uIHRvIGV4aXQgdGhlIFNldHVwIHdpemFyZC4iKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHJ1bl9pbnN0YWxsc2NyaXB0KGZuYW1lLCAyLCBhcmd2LCAmYnVmZmVyKTsKKyAgICAgICAgICAgIGlmICgwICE9IHJlc3VsdCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKioqIHJ1bl9pbnN0YWxsc2NyaXB0OiBpbnRlcm5hbCBlcnJvciAweCVYICoqKlxuIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWZmZXIpCisgICAgICAgICAgICAgICAgU2V0RGxnSXRlbVRleHQoaHduZCwgSURDX0lORk8sIGJ1ZmZlcik7CisgICAgICAgICAgICBTZXREbGdJdGVtVGV4dChod25kLCBJRENfVElUTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvc3RpbnN0YWxsIHNjcmlwdCBmaW5pc2hlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xpY2sgdGhlIEZpbmlzaCBidXR0b24gdG8gZXhpdCB0aGUgU2V0dXAgd2l6YXJkLiIpOwogCi0JCQlmcmVlKGJ1ZmZlcik7Ci0JCQlTZXRDdXJzb3IoaEN1cnNvcik7Ci0JCQlDbG9zZUxvZ2ZpbGUoKTsKLQkJfQorICAgICAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgICAgICAgU2V0Q3Vyc29yKGhDdXJzb3IpOworICAgICAgICAgICAgQ2xvc2VMb2dmaWxlKCk7CisgICAgICAgIH0KIAotCQlyZXR1cm4gVFJVRTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CiAKLQljYXNlIFdNX05PVElGWToKLQkJbHBubSA9IChMUE5NSERSKSBsUGFyYW07CisgICAgY2FzZSBXTV9OT1RJRlk6CisgICAgICAgIGxwbm0gPSAoTFBOTUhEUikgbFBhcmFtOwogCi0JCXN3aXRjaCAobHBubS0+Y29kZSkgewotCQljYXNlIFBTTl9TRVRBQ1RJVkU6IC8qIEVuYWJsZSB0aGUgRmluaXNoIGJ1dHRvbiAqLwotCQkJUHJvcFNoZWV0X1NldFdpekJ1dHRvbnMoR2V0UGFyZW50KGh3bmQpLCBQU1dJWkJfRklOSVNIKTsKLQkJCWJyZWFrOworICAgICAgICBzd2l0Y2ggKGxwbm0tPmNvZGUpIHsKKyAgICAgICAgY2FzZSBQU05fU0VUQUNUSVZFOiAvKiBFbmFibGUgdGhlIEZpbmlzaCBidXR0b24gKi8KKyAgICAgICAgICAgIFByb3BTaGVldF9TZXRXaXpCdXR0b25zKEdldFBhcmVudChod25kKSwgUFNXSVpCX0ZJTklTSCk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9XSVpORVhUOgotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUFNOX1dJWk5FWFQ6CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBTTl9XSVpGSU5JU0g6Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBQU05fV0laRklOSVNIOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBQU05fUkVTRVQ6Ci0JCQlicmVhazsKLQkJCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBQU05fUkVTRVQ6CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHZvaWQgUnVuV2l6YXJkKEhXTkQgaHduZCkKIHsKLQlQUk9QU0hFRVRQQUdFICAgcHNwID0gICAgICAgezB9OwotCUhQUk9QU0hFRVRQQUdFICBhaHBzcFs0XSA9ICB7MH07Ci0JUFJPUFNIRUVUSEVBREVSIHBzaCA9ICAgICAgIHswfTsKKyAgICBQUk9QU0hFRVRQQUdFICAgcHNwID0gICAgICAgezB9OworICAgIEhQUk9QU0hFRVRQQUdFICBhaHBzcFs0XSA9ICB7MH07CisgICAgUFJPUFNIRUVUSEVBREVSIHBzaCA9ICAgICAgIHswfTsKIAotCS8qIERpc3BsYXkgbW9kdWxlIGluZm9ybWF0aW9uICovCi0JcHNwLmR3U2l6ZSA9ICAgICAgICBzaXplb2YocHNwKTsKLQlwc3AuZHdGbGFncyA9ICAgICAgIFBTUF9ERUZBVUxUfFBTUF9ISURFSEVBREVSOwotCXBzcC5oSW5zdGFuY2UgPSAgICAgR2V0TW9kdWxlSGFuZGxlIChOVUxMKTsKLQlwc3AubFBhcmFtID0gICAgICAgIDA7Ci0JcHNwLnBmbkRsZ1Byb2MgPSAgICBJbnRyb0RsZ1Byb2M7Ci0JcHNwLnBzelRlbXBsYXRlID0gICBNQUtFSU5UUkVTT1VSQ0UoSUREX0lOVFJPKTsKKyAgICAvKiBEaXNwbGF5IG1vZHVsZSBpbmZvcm1hdGlvbiAqLworICAgIHBzcC5kd1NpemUgPSAgICAgICAgc2l6ZW9mKHBzcCk7CisgICAgcHNwLmR3RmxhZ3MgPSAgICAgICBQU1BfREVGQVVMVHxQU1BfSElERUhFQURFUjsKKyAgICBwc3AuaEluc3RhbmNlID0gICAgIEdldE1vZHVsZUhhbmRsZSAoTlVMTCk7CisgICAgcHNwLmxQYXJhbSA9ICAgICAgICAwOworICAgIHBzcC5wZm5EbGdQcm9jID0gICAgSW50cm9EbGdQcm9jOworICAgIHBzcC5wc3pUZW1wbGF0ZSA9ICAgTUFLRUlOVFJFU09VUkNFKElERF9JTlRSTyk7CiAKLQlhaHBzcFswXSA9ICAgICAgICAgIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCZwc3ApOworICAgIGFocHNwWzBdID0gICAgICAgICAgQ3JlYXRlUHJvcGVydHlTaGVldFBhZ2UoJnBzcCk7CiAKLQkvKiBTZWxlY3QgcHl0aG9uIHZlcnNpb24gdG8gdXNlICovCi0JcHNwLmR3RmxhZ3MgPSAgICAgICBQU1BfREVGQVVMVHxQU1BfSElERUhFQURFUjsKLQlwc3AucHN6VGVtcGxhdGUgPSAgICAgICBNQUtFSU5UUkVTT1VSQ0UoSUREX1NFTEVDVFBZVEhPTik7Ci0JcHNwLnBmbkRsZ1Byb2MgPSAgICAgICAgU2VsZWN0UHl0aG9uRGxnUHJvYzsKKyAgICAvKiBTZWxlY3QgcHl0aG9uIHZlcnNpb24gdG8gdXNlICovCisgICAgcHNwLmR3RmxhZ3MgPSAgICAgICBQU1BfREVGQVVMVHxQU1BfSElERUhFQURFUjsKKyAgICBwc3AucHN6VGVtcGxhdGUgPSAgICAgICBNQUtFSU5UUkVTT1VSQ0UoSUREX1NFTEVDVFBZVEhPTik7CisgICAgcHNwLnBmbkRsZ1Byb2MgPSAgICAgICAgU2VsZWN0UHl0aG9uRGxnUHJvYzsKIAotCWFocHNwWzFdID0gICAgICAgICAgICAgIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCZwc3ApOworICAgIGFocHNwWzFdID0gICAgICAgICAgICAgIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCZwc3ApOwogCi0JLyogSW5zdGFsbCB0aGUgZmlsZXMgKi8KLQlwc3AuZHdGbGFncyA9CSAgICBQU1BfREVGQVVMVHxQU1BfSElERUhFQURFUjsKLQlwc3AucHN6VGVtcGxhdGUgPSAgICAgICBNQUtFSU5UUkVTT1VSQ0UoSUREX0lOU1RBTExGSUxFUyk7Ci0JcHNwLnBmbkRsZ1Byb2MgPSAgICAgICAgSW5zdGFsbEZpbGVzRGxnUHJvYzsKKyAgICAvKiBJbnN0YWxsIHRoZSBmaWxlcyAqLworICAgIHBzcC5kd0ZsYWdzID0gICAgICAgICAgIFBTUF9ERUZBVUxUfFBTUF9ISURFSEVBREVSOworICAgIHBzcC5wc3pUZW1wbGF0ZSA9ICAgICAgIE1BS0VJTlRSRVNPVVJDRShJRERfSU5TVEFMTEZJTEVTKTsKKyAgICBwc3AucGZuRGxnUHJvYyA9ICAgICAgICBJbnN0YWxsRmlsZXNEbGdQcm9jOwogCi0JYWhwc3BbMl0gPSAgICAgICAgICAgICAgQ3JlYXRlUHJvcGVydHlTaGVldFBhZ2UoJnBzcCk7CisgICAgYWhwc3BbMl0gPSAgICAgICAgICAgICAgQ3JlYXRlUHJvcGVydHlTaGVldFBhZ2UoJnBzcCk7CiAKLQkvKiBTaG93IHN1Y2Nlc3Mgb3IgZmFpbHVyZSAqLwotCXBzcC5kd0ZsYWdzID0gICAgICAgICAgIFBTUF9ERUZBVUxUfFBTUF9ISURFSEVBREVSOwotCXBzcC5wc3pUZW1wbGF0ZSA9ICAgICAgIE1BS0VJTlRSRVNPVVJDRShJRERfRklOSVNIRUQpOwotCXBzcC5wZm5EbGdQcm9jID0gICAgICAgIEZpbmlzaGVkRGxnUHJvYzsKKyAgICAvKiBTaG93IHN1Y2Nlc3Mgb3IgZmFpbHVyZSAqLworICAgIHBzcC5kd0ZsYWdzID0gICAgICAgICAgIFBTUF9ERUZBVUxUfFBTUF9ISURFSEVBREVSOworICAgIHBzcC5wc3pUZW1wbGF0ZSA9ICAgICAgIE1BS0VJTlRSRVNPVVJDRShJRERfRklOSVNIRUQpOworICAgIHBzcC5wZm5EbGdQcm9jID0gICAgICAgIEZpbmlzaGVkRGxnUHJvYzsKIAotCWFocHNwWzNdID0gICAgICAgICAgICAgIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCZwc3ApOworICAgIGFocHNwWzNdID0gICAgICAgICAgICAgIENyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCZwc3ApOwogCi0JLyogQ3JlYXRlIHRoZSBwcm9wZXJ0eSBzaGVldCAqLwotCXBzaC5kd1NpemUgPSAgICAgICAgICAgIHNpemVvZihwc2gpOwotCXBzaC5oSW5zdGFuY2UgPSAgICAgICAgIEdldE1vZHVsZUhhbmRsZShOVUxMKTsKLQlwc2guaHduZFBhcmVudCA9ICAgICAgICBod25kOwotCXBzaC5waHBhZ2UgPSAgICAgICAgICAgIGFocHNwOwotCXBzaC5kd0ZsYWdzID0gICAgICAgICAgIFBTSF9XSVpBUkQvKjk3Ki8vKnxQU0hfV0FURVJNQVJLfFBTSF9IRUFERVIqLzsKLQkJcHNoLnBzemJtV2F0ZXJtYXJrID0gICAgTlVMTDsKLQkJcHNoLnBzemJtSGVhZGVyID0gICAgICAgTlVMTDsKLQkJcHNoLm5TdGFydFBhZ2UgPSAgICAgICAgMDsKLQkJcHNoLm5QYWdlcyA9ICAgICAgICAgICAgNDsKKyAgICAvKiBDcmVhdGUgdGhlIHByb3BlcnR5IHNoZWV0ICovCisgICAgcHNoLmR3U2l6ZSA9ICAgICAgICAgICAgc2l6ZW9mKHBzaCk7CisgICAgcHNoLmhJbnN0YW5jZSA9ICAgICAgICAgR2V0TW9kdWxlSGFuZGxlKE5VTEwpOworICAgIHBzaC5od25kUGFyZW50ID0gICAgICAgIGh3bmQ7CisgICAgcHNoLnBocGFnZSA9ICAgICAgICAgICAgYWhwc3A7CisgICAgcHNoLmR3RmxhZ3MgPSAgICAgICAgICAgUFNIX1dJWkFSRC8qOTcqLy8qfFBTSF9XQVRFUk1BUkt8UFNIX0hFQURFUiovOworICAgICAgICBwc2gucHN6Ym1XYXRlcm1hcmsgPSAgICBOVUxMOworICAgICAgICBwc2gucHN6Ym1IZWFkZXIgPSAgICAgICBOVUxMOworICAgICAgICBwc2gublN0YXJ0UGFnZSA9ICAgICAgICAwOworICAgICAgICBwc2gublBhZ2VzID0gICAgICAgICAgICA0OwogCi0JCVByb3BlcnR5U2hlZXQoJnBzaCk7CisgICAgICAgIFByb3BlcnR5U2hlZXQoJnBzaCk7CiB9CiAKIC8vIHN1YnRseSBkaWZmZXJlbnQgZnJvbSBIYXNMb2NhbE1hY2hpbmVQcml2cygpLCBpbiB0aGF0IGFmdGVyIGV4ZWN1dGluZwpAQCAtMjExOCwxNiArMjExOCwxNiBAQAogLy8gc3VjaCBpbXBsaWNhdGlvbiBmb3IgSGFzTG9jYWxNYWNoaW5lUHJpdnMKIEJPT0wgTXlJc1VzZXJBbkFkbWluKCkKIHsKLQl0eXBlZGVmIEJPT0wgKFdJTkFQSSAqUEZOSXNVc2VyQW5BZG1pbikoKTsKLQlzdGF0aWMgUEZOSXNVc2VyQW5BZG1pbiBwZm5Jc1VzZXJBbkFkbWluID0gTlVMTDsKLQlITU9EVUxFIHNoZWxsMzI7Ci0JLy8gVGhpcyBmdW5jdGlvbiBpc24ndCBndWFyYW50ZWVkIHRvIGJlIGF2YWlsYWJsZSAoYW5kIGl0IGNhbid0IGh1cnQgCi0JLy8gdG8gbGVhdmUgdGhlIGxpYnJhcnkgbG9hZGVkKQotCWlmICgwID09IChzaGVsbDMyPUxvYWRMaWJyYXJ5KCJzaGVsbDMyLmRsbCIpKSkKLQkJcmV0dXJuIEZBTFNFOwotCWlmICgwID09IChwZm5Jc1VzZXJBbkFkbWluPShQRk5Jc1VzZXJBbkFkbWluKUdldFByb2NBZGRyZXNzKHNoZWxsMzIsICJJc1VzZXJBbkFkbWluIikpKQotCQlyZXR1cm4gRkFMU0U7Ci0JcmV0dXJuICgqcGZuSXNVc2VyQW5BZG1pbikoKTsKKyAgICB0eXBlZGVmIEJPT0wgKFdJTkFQSSAqUEZOSXNVc2VyQW5BZG1pbikoKTsKKyAgICBzdGF0aWMgUEZOSXNVc2VyQW5BZG1pbiBwZm5Jc1VzZXJBbkFkbWluID0gTlVMTDsKKyAgICBITU9EVUxFIHNoZWxsMzI7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpc24ndCBndWFyYW50ZWVkIHRvIGJlIGF2YWlsYWJsZSAoYW5kIGl0IGNhbid0IGh1cnQKKyAgICAvLyB0byBsZWF2ZSB0aGUgbGlicmFyeSBsb2FkZWQpCisgICAgaWYgKDAgPT0gKHNoZWxsMzI9TG9hZExpYnJhcnkoInNoZWxsMzIuZGxsIikpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKDAgPT0gKHBmbklzVXNlckFuQWRtaW49KFBGTklzVXNlckFuQWRtaW4pR2V0UHJvY0FkZHJlc3Moc2hlbGwzMiwgIklzVXNlckFuQWRtaW4iKSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gKCpwZm5Jc1VzZXJBbkFkbWluKSgpOwogfQogCiAvLyBTb21lIG1hZ2ljIGZvciBWaXN0YSdzIFVBQy4gIElmIHRoZXJlIGlzIGEgdGFyZ2V0X3ZlcnNpb24sIGFuZApAQCAtMjEzOSwzOCArMjEzOSwzOCBAQAogLy8gUmV0dXJucyBUUlVFIGlmIHdlIHNob3VsZCBzcGF3biBhbiBlbGV2YXRlZCBjaGlsZAogQk9PTCBOZWVkQXV0b1VBQygpCiB7Ci0JSEtFWSBoazsKLQljaGFyIGtleV9uYW1lWzgwXTsKLQkvLyBubyBQeXRob24gdmVyc2lvbiBpbmZvID09IHdlIGNhbid0IGtub3cgeWV0LgotCWlmICh0YXJnZXRfdmVyc2lvblswXSA9PSAnXDAnKQotCQlyZXR1cm4gRkFMU0U7Ci0JLy8gc2VlIGhvdyBweXRob24gaXMgY3VycmVudCBpbnN0YWxsZWQKLQl3c3ByaW50ZihrZXlfbmFtZSwKLQkJCSAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcJXNcXEluc3RhbGxQYXRoIiwKLQkJCSB0YXJnZXRfdmVyc2lvbik7Ci0JaWYgKEVSUk9SX1NVQ0NFU1MgIT0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9uYW1lLCAwLCBLRVlfUkVBRCwgJmhrKSkKLQkJcmV0dXJuIEZBTFNFOwotCVJlZ0Nsb3NlS2V5KGhrKTsKLQkvLyBQeXRob24gaXMgaW5zdGFsbGVkIGluIEhLTE0gLSB3ZSBtdXN0IGVsZXZhdGUuCi0JcmV0dXJuIFRSVUU7CisgICAgSEtFWSBoazsKKyAgICBjaGFyIGtleV9uYW1lWzgwXTsKKyAgICAvLyBubyBQeXRob24gdmVyc2lvbiBpbmZvID09IHdlIGNhbid0IGtub3cgeWV0LgorICAgIGlmICh0YXJnZXRfdmVyc2lvblswXSA9PSAnXDAnKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgLy8gc2VlIGhvdyBweXRob24gaXMgY3VycmVudCBpbnN0YWxsZWQKKyAgICB3c3ByaW50ZihrZXlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwlc1xcSW5zdGFsbFBhdGgiLAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24pOworICAgIGlmIChFUlJPUl9TVUNDRVNTICE9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9uYW1lLCAwLCBLRVlfUkVBRCwgJmhrKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIFJlZ0Nsb3NlS2V5KGhrKTsKKyAgICAvLyBQeXRob24gaXMgaW5zdGFsbGVkIGluIEhLTE0gLSB3ZSBtdXN0IGVsZXZhdGUuCisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8vIFJldHVybnMgVFJVRSBpZiB0aGUgcGxhdGZvcm0gc3VwcG9ydHMgVUFDLgogQk9PTCBQbGF0Zm9ybVN1cHBvcnRzVUFDKCkKIHsKLQkvLyBOb3RlIHRoYXQgd2luMmsgZG9lcyBzZWVtIHRvIHN1cHBvcnQgU2hlbGxFeGVjdXRlIHdpdGggJ3J1bmFzJywKLQkvLyBidXQgZG9lcyAqbm90KiBzdXBwb3J0IElzVXNlckFuQWRtaW4gLSBzbyB3ZSBqdXN0IHByZXRlbmQgdGhpbmdzCi0JLy8gb25seSB3b3JrIG9uIFhQIGFuZCBsYXRlci4KLQlCT09MIGJJc1dpbmRvd3NYUG9yTGF0ZXI7Ci0JT1NWRVJTSU9OSU5GTyB3aW52ZXJpbmZvOwotCXdpbnZlcmluZm8uZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZih3aW52ZXJpbmZvKTsKLQlpZiAoIUdldFZlcnNpb25FeCgmd2ludmVyaW5mbykpCi0JCXJldHVybiBGQUxTRTsgLy8gc29tZXRoaW5nIGJhZCBoYXMgZ29uZSB3cm9uZwotCWJJc1dpbmRvd3NYUG9yTGF0ZXIgPSAKKyAgICAvLyBOb3RlIHRoYXQgd2luMmsgZG9lcyBzZWVtIHRvIHN1cHBvcnQgU2hlbGxFeGVjdXRlIHdpdGggJ3J1bmFzJywKKyAgICAvLyBidXQgZG9lcyAqbm90KiBzdXBwb3J0IElzVXNlckFuQWRtaW4gLSBzbyB3ZSBqdXN0IHByZXRlbmQgdGhpbmdzCisgICAgLy8gb25seSB3b3JrIG9uIFhQIGFuZCBsYXRlci4KKyAgICBCT09MIGJJc1dpbmRvd3NYUG9yTGF0ZXI7CisgICAgT1NWRVJTSU9OSU5GTyB3aW52ZXJpbmZvOworICAgIHdpbnZlcmluZm8uZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZih3aW52ZXJpbmZvKTsKKyAgICBpZiAoIUdldFZlcnNpb25FeCgmd2ludmVyaW5mbykpCisgICAgICAgIHJldHVybiBGQUxTRTsgLy8gc29tZXRoaW5nIGJhZCBoYXMgZ29uZSB3cm9uZworICAgIGJJc1dpbmRvd3NYUG9yTGF0ZXIgPQogICAgICAgICggKHdpbnZlcmluZm8uZHdNYWpvclZlcnNpb24gPiA1KSB8fAogICAgICAgICggKHdpbnZlcmluZm8uZHdNYWpvclZlcnNpb24gPT0gNSkgJiYgKHdpbnZlcmluZm8uZHdNaW5vclZlcnNpb24gPj0gMSkgKSk7Ci0JcmV0dXJuIGJJc1dpbmRvd3NYUG9yTGF0ZXI7CisgICAgcmV0dXJuIGJJc1dpbmRvd3NYUG9yTGF0ZXI7CiB9CiAKIC8vIFNwYXduIG91cnNlbGYgYXMgYW4gZWxldmF0ZWQgYXBwbGljYXRpb24uICBPbiBmYWlsdXJlLCBhIG1lc3NhZ2UgaXMKQEAgLTIxNzgsOTcgKzIxNzgsOTcgQEAKIC8vIG9uIGVycm9yLgogdm9pZCBTcGF3blVBQygpCiB7Ci0JLy8gaW50ZXJlc3RpbmcgZmFpbHVyZSBzY2VuYXJpbyB0aGF0IGhhcyBiZWVuIHNlZW46IGluaXRpYWwgZXhlY3V0YWJsZQotCS8vIHJ1bnMgZnJvbSBhIG5ldHdvcmsgZHJpdmUgLSBidXQgb25jZSBlbGV2YXRlZCwgdGhhdCBuZXR3b3JrIHNoYXJlCi0JLy8gaXNuJ3Qgc2VlbiwgYW5kIFNoZWxsRXhlY3V0ZSBmYWlscyB3aXRoIFNFX0VSUl9BQ0NFU1NERU5JRUQuCi0JaW50IHJldCA9IChpbnQpU2hlbGxFeGVjdXRlKDAsICJydW5hcyIsIG1vZHVsZW5hbWUsICIiLCBOVUxMLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dfU0hPV05PUk1BTCk7Ci0JaWYgKHJldCA8PSAzMikgewotCQljaGFyIG1zZ1sxMjhdOwotCQl3c3ByaW50Zihtc2csICJGYWlsZWQgdG8gc3RhcnQgZWxldmF0ZWQgcHJvY2VzcyAoU2hlbGxFeGVjdXRlIHJldHVybmVkICVkKSIsIHJldCk7Ci0JCU1lc3NhZ2VCb3goMCwgbXNnLCAiU2V0dXAiLCBNQl9PSyB8IE1CX0lDT05FUlJPUik7Ci0JfQorICAgIC8vIGludGVyZXN0aW5nIGZhaWx1cmUgc2NlbmFyaW8gdGhhdCBoYXMgYmVlbiBzZWVuOiBpbml0aWFsIGV4ZWN1dGFibGUKKyAgICAvLyBydW5zIGZyb20gYSBuZXR3b3JrIGRyaXZlIC0gYnV0IG9uY2UgZWxldmF0ZWQsIHRoYXQgbmV0d29yayBzaGFyZQorICAgIC8vIGlzbid0IHNlZW4sIGFuZCBTaGVsbEV4ZWN1dGUgZmFpbHMgd2l0aCBTRV9FUlJfQUNDRVNTREVOSUVELgorICAgIGludCByZXQgPSAoaW50KVNoZWxsRXhlY3V0ZSgwLCAicnVuYXMiLCBtb2R1bGVuYW1lLCAiIiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1dfU0hPV05PUk1BTCk7CisgICAgaWYgKHJldCA8PSAzMikgeworICAgICAgICBjaGFyIG1zZ1sxMjhdOworICAgICAgICB3c3ByaW50Zihtc2csICJGYWlsZWQgdG8gc3RhcnQgZWxldmF0ZWQgcHJvY2VzcyAoU2hlbGxFeGVjdXRlIHJldHVybmVkICVkKSIsIHJldCk7CisgICAgICAgIE1lc3NhZ2VCb3goMCwgbXNnLCAiU2V0dXAiLCBNQl9PSyB8IE1CX0lDT05FUlJPUik7CisgICAgfQogfQogCiBpbnQgRG9JbnN0YWxsKHZvaWQpCiB7Ci0JY2hhciBpbmlfYnVmZmVyWzQwOTZdOworICAgIGNoYXIgaW5pX2J1ZmZlcls0MDk2XTsKIAotCS8qIFJlYWQgaW5zdGFsbGF0aW9uIGluZm9ybWF0aW9uICovCi0JR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmcoIlNldHVwIiwgInRpdGxlIiwgIiIsIGluaV9idWZmZXIsCi0JCQkJIHNpemVvZihpbmlfYnVmZmVyKSwgaW5pX2ZpbGUpOwotCXVuZXNjYXBlKHRpdGxlLCBpbmlfYnVmZmVyLCBzaXplb2YodGl0bGUpKTsKKyAgICAvKiBSZWFkIGluc3RhbGxhdGlvbiBpbmZvcm1hdGlvbiAqLworICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJ0aXRsZSIsICIiLCBpbmlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW5pX2J1ZmZlciksIGluaV9maWxlKTsKKyAgICB1bmVzY2FwZSh0aXRsZSwgaW5pX2J1ZmZlciwgc2l6ZW9mKHRpdGxlKSk7CiAKLQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAiaW5mbyIsICIiLCBpbmlfYnVmZmVyLAotCQkJCSBzaXplb2YoaW5pX2J1ZmZlciksIGluaV9maWxlKTsKLQl1bmVzY2FwZShpbmZvLCBpbmlfYnVmZmVyLCBzaXplb2YoaW5mbykpOworICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJpbmZvIiwgIiIsIGluaV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbmlfYnVmZmVyKSwgaW5pX2ZpbGUpOworICAgIHVuZXNjYXBlKGluZm8sIGluaV9idWZmZXIsIHNpemVvZihpbmZvKSk7CiAKLQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAiYnVpbGRfaW5mbyIsICIiLCBidWlsZF9pbmZvLAotCQkJCSBzaXplb2YoYnVpbGRfaW5mbyksIGluaV9maWxlKTsKKyAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAiYnVpbGRfaW5mbyIsICIiLCBidWlsZF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnVpbGRfaW5mbyksIGluaV9maWxlKTsKIAotCXB5Y19jb21waWxlID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIlNldHVwIiwgInRhcmdldF9jb21waWxlIiwgMSwKLQkJCQkJICAgIGluaV9maWxlKTsKLQlweW9fY29tcGlsZSA9IEdldFByaXZhdGVQcm9maWxlSW50KCJTZXR1cCIsICJ0YXJnZXRfb3B0aW1pemUiLCAxLAotCQkJCQkgICAgaW5pX2ZpbGUpOworICAgIHB5Y19jb21waWxlID0gR2V0UHJpdmF0ZVByb2ZpbGVJbnQoIlNldHVwIiwgInRhcmdldF9jb21waWxlIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmlfZmlsZSk7CisgICAgcHlvX2NvbXBpbGUgPSBHZXRQcml2YXRlUHJvZmlsZUludCgiU2V0dXAiLCAidGFyZ2V0X29wdGltaXplIiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmlfZmlsZSk7CiAKLQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAidGFyZ2V0X3ZlcnNpb24iLCAiIiwKLQkJCQkgdGFyZ2V0X3ZlcnNpb24sIHNpemVvZih0YXJnZXRfdmVyc2lvbiksCi0JCQkJIGluaV9maWxlKTsKKyAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAidGFyZ2V0X3ZlcnNpb24iLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24sIHNpemVvZih0YXJnZXRfdmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaV9maWxlKTsKIAotCUdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJtZXRhZGF0YSIsICJuYW1lIiwgIiIsCi0JCQkJIG1ldGFfbmFtZSwgc2l6ZW9mKG1ldGFfbmFtZSksCi0JCQkJIGluaV9maWxlKTsKKyAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygibWV0YWRhdGEiLCAibmFtZSIsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX25hbWUsIHNpemVvZihtZXRhX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmlfZmlsZSk7CiAKLQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAiaW5zdGFsbF9zY3JpcHQiLCAiIiwKLQkJCQkgaW5zdGFsbF9zY3JpcHQsIHNpemVvZihpbnN0YWxsX3NjcmlwdCksCi0JCQkJIGluaV9maWxlKTsKKyAgICBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiU2V0dXAiLCAiaW5zdGFsbF9zY3JpcHQiLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9zY3JpcHQsIHNpemVvZihpbnN0YWxsX3NjcmlwdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaV9maWxlKTsKIAotCUdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJ1c2VyX2FjY2Vzc19jb250cm9sIiwgIiIsCi0JCQkJIHVzZXJfYWNjZXNzX2NvbnRyb2wsIHNpemVvZih1c2VyX2FjY2Vzc19jb250cm9sKSwgaW5pX2ZpbGUpOworICAgIEdldFByaXZhdGVQcm9maWxlU3RyaW5nKCJTZXR1cCIsICJ1c2VyX2FjY2Vzc19jb250cm9sIiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfYWNjZXNzX2NvbnRyb2wsIHNpemVvZih1c2VyX2FjY2Vzc19jb250cm9sKSwgaW5pX2ZpbGUpOwogCi0JLy8gU2VlIGlmIHdlIG5lZWQgdG8gZG8gdGhlIFZpc3RhIFVBQyBtYWdpYy4KLQlpZiAoc3RyY21wKHVzZXJfYWNjZXNzX2NvbnRyb2wsICJmb3JjZSIpPT0wKSB7Ci0JCWlmIChQbGF0Zm9ybVN1cHBvcnRzVUFDKCkgJiYgIU15SXNVc2VyQW5BZG1pbigpKSB7Ci0JCQlTcGF3blVBQygpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJLy8gYWxyZWFkeSBhZG1pbiAtIGtlZXAgZ29pbmcKLQl9IGVsc2UgaWYgKHN0cmNtcCh1c2VyX2FjY2Vzc19jb250cm9sLCAiYXV0byIpPT0wKSB7Ci0JCS8vIENoZWNrIGlmIGl0IGxvb2tzIGxpa2Ugd2UgbmVlZCBVQUMgY29udHJvbCwgYmFzZWQKLQkJLy8gb24gaG93IFB5dGhvbiBpdHNlbGYgd2FzIGluc3RhbGxlZC4KLQkJaWYgKFBsYXRmb3JtU3VwcG9ydHNVQUMoKSAmJiAhTXlJc1VzZXJBbkFkbWluKCkgJiYgTmVlZEF1dG9VQUMoKSkgewotCQkJU3Bhd25VQUMoKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJLy8gZGlzcGxheSBhIHdhcm5pbmcgYWJvdXQgdW5rbm93biB2YWx1ZXMgLSBvbmx5IHRoZSBkZXZlbG9wZXIKLQkJLy8gb2YgdGhlIGV4dGVuc2lvbiB3aWxsIHNlZSBpdCAodW50aWwgdGhleSBmaXggaXQhKQotCQlpZiAodXNlcl9hY2Nlc3NfY29udHJvbFswXSAmJiBzdHJjbXAodXNlcl9hY2Nlc3NfY29udHJvbCwgIm5vbmUiKSAhPSAwKSB7Ci0JCQlNZXNzYWdlQm94KEdldEZvY3VzKCksICJCYWQgdXNlcl9hY2Nlc3NfY29udHJvbCB2YWx1ZSIsICJvb3BzIiwgTUJfT0spOwotCQkvLyBub3RoaW5nIHRvIGRvLgotCQl9Ci0JfQorICAgIC8vIFNlZSBpZiB3ZSBuZWVkIHRvIGRvIHRoZSBWaXN0YSBVQUMgbWFnaWMuCisgICAgaWYgKHN0cmNtcCh1c2VyX2FjY2Vzc19jb250cm9sLCAiZm9yY2UiKT09MCkgeworICAgICAgICBpZiAoUGxhdGZvcm1TdXBwb3J0c1VBQygpICYmICFNeUlzVXNlckFuQWRtaW4oKSkgeworICAgICAgICAgICAgU3Bhd25VQUMoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8vIGFscmVhZHkgYWRtaW4gLSBrZWVwIGdvaW5nCisgICAgfSBlbHNlIGlmIChzdHJjbXAodXNlcl9hY2Nlc3NfY29udHJvbCwgImF1dG8iKT09MCkgeworICAgICAgICAvLyBDaGVjayBpZiBpdCBsb29rcyBsaWtlIHdlIG5lZWQgVUFDIGNvbnRyb2wsIGJhc2VkCisgICAgICAgIC8vIG9uIGhvdyBQeXRob24gaXRzZWxmIHdhcyBpbnN0YWxsZWQuCisgICAgICAgIGlmIChQbGF0Zm9ybVN1cHBvcnRzVUFDKCkgJiYgIU15SXNVc2VyQW5BZG1pbigpICYmIE5lZWRBdXRvVUFDKCkpIHsKKyAgICAgICAgICAgIFNwYXduVUFDKCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGRpc3BsYXkgYSB3YXJuaW5nIGFib3V0IHVua25vd24gdmFsdWVzIC0gb25seSB0aGUgZGV2ZWxvcGVyCisgICAgICAgIC8vIG9mIHRoZSBleHRlbnNpb24gd2lsbCBzZWUgaXQgKHVudGlsIHRoZXkgZml4IGl0ISkKKyAgICAgICAgaWYgKHVzZXJfYWNjZXNzX2NvbnRyb2xbMF0gJiYgc3RyY21wKHVzZXJfYWNjZXNzX2NvbnRyb2wsICJub25lIikgIT0gMCkgeworICAgICAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCAiQmFkIHVzZXJfYWNjZXNzX2NvbnRyb2wgdmFsdWUiLCAib29wcyIsIE1CX09LKTsKKyAgICAgICAgLy8gbm90aGluZyB0byBkby4KKyAgICAgICAgfQorICAgIH0KIAotCWh3bmRNYWluID0gQ3JlYXRlQmFja2dyb3VuZCh0aXRsZSk7CisgICAgaHduZE1haW4gPSBDcmVhdGVCYWNrZ3JvdW5kKHRpdGxlKTsKIAotCVJ1bldpemFyZChod25kTWFpbik7CisgICAgUnVuV2l6YXJkKGh3bmRNYWluKTsKIAotCS8qIENsZWFuIHVwICovCi0JVW5tYXBWaWV3T2ZGaWxlKGFyY19kYXRhKTsKLQlpZiAoaW5pX2ZpbGUpCi0JCURlbGV0ZUZpbGUoaW5pX2ZpbGUpOworICAgIC8qIENsZWFuIHVwICovCisgICAgVW5tYXBWaWV3T2ZGaWxlKGFyY19kYXRhKTsKKyAgICBpZiAoaW5pX2ZpbGUpCisgICAgICAgIERlbGV0ZUZpbGUoaW5pX2ZpbGUpOwogCi0JaWYgKGhCaXRtYXApCi0JCURlbGV0ZU9iamVjdChoQml0bWFwKTsKKyAgICBpZiAoaEJpdG1hcCkKKyAgICAgICAgRGVsZXRlT2JqZWN0KGhCaXRtYXApOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiB1bmluc3RhbGwgc2VjdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbnQgY29tcGFyZShjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCiB7Ci0JcmV0dXJuIHN0cmNtcCgqKGNoYXIgKiopcDIsICooY2hhciAqKilwMSk7CisgICAgcmV0dXJuIHN0cmNtcCgqKGNoYXIgKiopcDIsICooY2hhciAqKilwMSk7CiB9CiAKIC8qCkBAIC0yMjgyLDM3OSArMjI4MiwzNzkgQEAKICAqLwogdm9pZCByZW1vdmVfZXhlKHZvaWQpCiB7Ci0JY2hhciBleGVuYW1lW19NQVhfUEFUSF07Ci0JY2hhciBiYXRuYW1lW19NQVhfUEFUSF07Ci0JRklMRSAqZnA7Ci0JU1RBUlRVUElORk8gc2k7Ci0JUFJPQ0VTU19JTkZPUk1BVElPTiBwaTsKKyAgICBjaGFyIGV4ZW5hbWVbX01BWF9QQVRIXTsKKyAgICBjaGFyIGJhdG5hbWVbX01BWF9QQVRIXTsKKyAgICBGSUxFICpmcDsKKyAgICBTVEFSVFVQSU5GTyBzaTsKKyAgICBQUk9DRVNTX0lORk9STUFUSU9OIHBpOwogCi0JR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgZXhlbmFtZSwgc2l6ZW9mKGV4ZW5hbWUpKTsKLQlzcHJpbnRmKGJhdG5hbWUsICIlcy5iYXQiLCBleGVuYW1lKTsKLQlmcCA9IGZvcGVuKGJhdG5hbWUsICJ3Iik7Ci0JZnByaW50ZihmcCwgIjpSZXBlYXRcbiIpOwotCWZwcmludGYoZnAsICJkZWwgXCIlc1wiXG4iLCBleGVuYW1lKTsKLQlmcHJpbnRmKGZwLCAiaWYgZXhpc3QgXCIlc1wiIGdvdG8gUmVwZWF0XG4iLCBleGVuYW1lKTsKLQlmcHJpbnRmKGZwLCAiZGVsIFwiJXNcIlxuIiwgYmF0bmFtZSk7Ci0JZmNsb3NlKGZwKTsKLSAgICAKLQlaZXJvTWVtb3J5KCZzaSwgc2l6ZW9mKHNpKSk7Ci0Jc2kuY2IgPSBzaXplb2Yoc2kpOwotCXNpLmR3RmxhZ3MgPSBTVEFSVEZfVVNFU0hPV1dJTkRPVzsKLQlzaS53U2hvd1dpbmRvdyA9IFNXX0hJREU7Ci0JaWYgKENyZWF0ZVByb2Nlc3MoTlVMTCwKLQkJCSAgYmF0bmFtZSwKLQkJCSAgTlVMTCwKLQkJCSAgTlVMTCwKLQkJCSAgRkFMU0UsCi0JCQkgIENSRUFURV9TVVNQRU5ERUQgfCBJRExFX1BSSU9SSVRZX0NMQVNTLAotCQkJICBOVUxMLAotCQkJICAiXFwiLAotCQkJICAmc2ksCi0JCQkgICZwaSkpIHsKLQkJU2V0VGhyZWFkUHJpb3JpdHkocGkuaFRocmVhZCwgVEhSRUFEX1BSSU9SSVRZX0lETEUpOwotCQlTZXRUaHJlYWRQcmlvcml0eShHZXRDdXJyZW50VGhyZWFkKCksIFRIUkVBRF9QUklPUklUWV9USU1FX0NSSVRJQ0FMKTsKLQkJU2V0UHJpb3JpdHlDbGFzcyhHZXRDdXJyZW50UHJvY2VzcygpLCBISUdIX1BSSU9SSVRZX0NMQVNTKTsKLQkJQ2xvc2VIYW5kbGUocGkuaFByb2Nlc3MpOwotCQlSZXN1bWVUaHJlYWQocGkuaFRocmVhZCk7Ci0JCUNsb3NlSGFuZGxlKHBpLmhUaHJlYWQpOwotCX0KKyAgICBHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBleGVuYW1lLCBzaXplb2YoZXhlbmFtZSkpOworICAgIHNwcmludGYoYmF0bmFtZSwgIiVzLmJhdCIsIGV4ZW5hbWUpOworICAgIGZwID0gZm9wZW4oYmF0bmFtZSwgInciKTsKKyAgICBmcHJpbnRmKGZwLCAiOlJlcGVhdFxuIik7CisgICAgZnByaW50ZihmcCwgImRlbCBcIiVzXCJcbiIsIGV4ZW5hbWUpOworICAgIGZwcmludGYoZnAsICJpZiBleGlzdCBcIiVzXCIgZ290byBSZXBlYXRcbiIsIGV4ZW5hbWUpOworICAgIGZwcmludGYoZnAsICJkZWwgXCIlc1wiXG4iLCBiYXRuYW1lKTsKKyAgICBmY2xvc2UoZnApOworCisgICAgWmVyb01lbW9yeSgmc2ksIHNpemVvZihzaSkpOworICAgIHNpLmNiID0gc2l6ZW9mKHNpKTsKKyAgICBzaS5kd0ZsYWdzID0gU1RBUlRGX1VTRVNIT1dXSU5ET1c7CisgICAgc2kud1Nob3dXaW5kb3cgPSBTV19ISURFOworICAgIGlmIChDcmVhdGVQcm9jZXNzKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgYmF0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRFX1NVU1BFTkRFRCB8IElETEVfUFJJT1JJVFlfQ0xBU1MsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAiXFwiLAorICAgICAgICAgICAgICAgICAgICAgICZzaSwKKyAgICAgICAgICAgICAgICAgICAgICAmcGkpKSB7CisgICAgICAgIFNldFRocmVhZFByaW9yaXR5KHBpLmhUaHJlYWQsIFRIUkVBRF9QUklPUklUWV9JRExFKTsKKyAgICAgICAgU2V0VGhyZWFkUHJpb3JpdHkoR2V0Q3VycmVudFRocmVhZCgpLCBUSFJFQURfUFJJT1JJVFlfVElNRV9DUklUSUNBTCk7CisgICAgICAgIFNldFByaW9yaXR5Q2xhc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgSElHSF9QUklPUklUWV9DTEFTUyk7CisgICAgICAgIENsb3NlSGFuZGxlKHBpLmhQcm9jZXNzKTsKKyAgICAgICAgUmVzdW1lVGhyZWFkKHBpLmhUaHJlYWQpOworICAgICAgICBDbG9zZUhhbmRsZShwaS5oVGhyZWFkKTsKKyAgICB9CiB9CiAKIHZvaWQgRGVsZXRlUmVnaXN0cnlLZXkoY2hhciAqc3RyaW5nKQogewotCWNoYXIgKmtleW5hbWU7Ci0JY2hhciAqc3Via2V5bmFtZTsKLQljaGFyICpkZWxpbTsKLQlIS0VZIGhLZXk7Ci0JbG9uZyByZXN1bHQ7Ci0JY2hhciAqbGluZTsKKyAgICBjaGFyICprZXluYW1lOworICAgIGNoYXIgKnN1YmtleW5hbWU7CisgICAgY2hhciAqZGVsaW07CisgICAgSEtFWSBoS2V5OworICAgIGxvbmcgcmVzdWx0OworICAgIGNoYXIgKmxpbmU7CiAKLQlsaW5lID0gc3RyZHVwKHN0cmluZyk7IC8qIHNvIHdlIGNhbiBjaGFuZ2UgaXQgKi8KKyAgICBsaW5lID0gc3RyZHVwKHN0cmluZyk7IC8qIHNvIHdlIGNhbiBjaGFuZ2UgaXQgKi8KIAotCWtleW5hbWUgPSBzdHJjaHIobGluZSwgJ1snKTsKLQlpZiAoIWtleW5hbWUpCi0JCXJldHVybjsKLQkrK2tleW5hbWU7CisgICAga2V5bmFtZSA9IHN0cmNocihsaW5lLCAnWycpOworICAgIGlmICgha2V5bmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgICsra2V5bmFtZTsKIAotCXN1YmtleW5hbWUgPSBzdHJjaHIoa2V5bmFtZSwgJ10nKTsKLQlpZiAoIXN1YmtleW5hbWUpCi0JCXJldHVybjsKLQkqc3Via2V5bmFtZSsrPSdcMCc7Ci0JZGVsaW0gPSBzdHJjaHIoc3Via2V5bmFtZSwgJ1xuJyk7Ci0JaWYgKGRlbGltKQotCQkqZGVsaW0gPSAnXDAnOworICAgIHN1YmtleW5hbWUgPSBzdHJjaHIoa2V5bmFtZSwgJ10nKTsKKyAgICBpZiAoIXN1YmtleW5hbWUpCisgICAgICAgIHJldHVybjsKKyAgICAqc3Via2V5bmFtZSsrPSdcMCc7CisgICAgZGVsaW0gPSBzdHJjaHIoc3Via2V5bmFtZSwgJ1xuJyk7CisgICAgaWYgKGRlbGltKQorICAgICAgICAqZGVsaW0gPSAnXDAnOwogCi0JcmVzdWx0ID0gUmVnT3BlbktleUV4KGhrZXlfcm9vdCwKLQkJCSAgICAgIGtleW5hbWUsCi0JCQkgICAgICAwLAotCQkJICAgICAgS0VZX1dSSVRFLAotCQkJICAgICAgJmhLZXkpOwotICAgIAotCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCBzdHJpbmcsICJDb3VsZCBub3Qgb3BlbiBrZXkiLCBNQl9PSyk7Ci0JZWxzZSB7Ci0JCXJlc3VsdCA9IFJlZ0RlbGV0ZUtleShoS2V5LCBzdWJrZXluYW1lKTsKLQkJaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTICYmIHJlc3VsdCAhPSBFUlJPUl9GSUxFX05PVF9GT1VORCkKLQkJCU1lc3NhZ2VCb3goR2V0Rm9jdXMoKSwgc3RyaW5nLCAiQ291bGQgbm90IGRlbGV0ZSBrZXkiLCBNQl9PSyk7Ci0JCVJlZ0Nsb3NlS2V5KGhLZXkpOwotCX0KLQlmcmVlKGxpbmUpOworICAgIHJlc3VsdCA9IFJlZ09wZW5LZXlFeChoa2V5X3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtleW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhLZXkpOworCisgICAgaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIHN0cmluZywgIkNvdWxkIG5vdCBvcGVuIGtleSIsIE1CX09LKTsKKyAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUmVnRGVsZXRlS2V5KGhLZXksIHN1YmtleW5hbWUpOworICAgICAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MgJiYgcmVzdWx0ICE9IEVSUk9SX0ZJTEVfTk9UX0ZPVU5EKQorICAgICAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBzdHJpbmcsICJDb3VsZCBub3QgZGVsZXRlIGtleSIsIE1CX09LKTsKKyAgICAgICAgUmVnQ2xvc2VLZXkoaEtleSk7CisgICAgfQorICAgIGZyZWUobGluZSk7CiB9CiAKIHZvaWQgRGVsZXRlUmVnaXN0cnlWYWx1ZShjaGFyICpzdHJpbmcpCiB7Ci0JY2hhciAqa2V5bmFtZTsKLQljaGFyICp2YWx1ZW5hbWU7Ci0JY2hhciAqdmFsdWU7Ci0JSEtFWSBoS2V5OwotCWxvbmcgcmVzdWx0OwotCWNoYXIgKmxpbmU7CisgICAgY2hhciAqa2V5bmFtZTsKKyAgICBjaGFyICp2YWx1ZW5hbWU7CisgICAgY2hhciAqdmFsdWU7CisgICAgSEtFWSBoS2V5OworICAgIGxvbmcgcmVzdWx0OworICAgIGNoYXIgKmxpbmU7CiAKLQlsaW5lID0gc3RyZHVwKHN0cmluZyk7IC8qIHNvIHdlIGNhbiBjaGFuZ2UgaXQgKi8KKyAgICBsaW5lID0gc3RyZHVwKHN0cmluZyk7IC8qIHNvIHdlIGNhbiBjaGFuZ2UgaXQgKi8KIAogLyogRm9ybWF0IGlzICdSZWcgREIgVmFsdWU6IFtrZXldbmFtZT12YWx1ZScgKi8KLQlrZXluYW1lID0gc3RyY2hyKGxpbmUsICdbJyk7Ci0JaWYgKCFrZXluYW1lKQotCQlyZXR1cm47Ci0JKytrZXluYW1lOwotCXZhbHVlbmFtZSA9IHN0cmNocihrZXluYW1lLCAnXScpOwotCWlmICghdmFsdWVuYW1lKQotCQlyZXR1cm47Ci0JKnZhbHVlbmFtZSsrID0gJ1wwJzsKLQl2YWx1ZSA9IHN0cmNocih2YWx1ZW5hbWUsICc9Jyk7Ci0JaWYgKCF2YWx1ZSkKLQkJcmV0dXJuOworICAgIGtleW5hbWUgPSBzdHJjaHIobGluZSwgJ1snKTsKKyAgICBpZiAoIWtleW5hbWUpCisgICAgICAgIHJldHVybjsKKyAgICArK2tleW5hbWU7CisgICAgdmFsdWVuYW1lID0gc3RyY2hyKGtleW5hbWUsICddJyk7CisgICAgaWYgKCF2YWx1ZW5hbWUpCisgICAgICAgIHJldHVybjsKKyAgICAqdmFsdWVuYW1lKysgPSAnXDAnOworICAgIHZhbHVlID0gc3RyY2hyKHZhbHVlbmFtZSwgJz0nKTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm47CiAKLQkqdmFsdWUrKyA9ICdcMCc7CisgICAgKnZhbHVlKysgPSAnXDAnOwogCi0JcmVzdWx0ID0gUmVnT3BlbktleUV4KGhrZXlfcm9vdCwKLQkJCSAgICAgIGtleW5hbWUsCi0JCQkgICAgICAwLAotCQkJICAgICAgS0VZX1dSSVRFLAotCQkJICAgICAgJmhLZXkpOwotCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLQkJTWVzc2FnZUJveChHZXRGb2N1cygpLCBzdHJpbmcsICJDb3VsZCBub3Qgb3BlbiBrZXkiLCBNQl9PSyk7Ci0JZWxzZSB7Ci0JCXJlc3VsdCA9IFJlZ0RlbGV0ZVZhbHVlKGhLZXksIHZhbHVlbmFtZSk7Ci0JCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUyAmJiByZXN1bHQgIT0gRVJST1JfRklMRV9OT1RfRk9VTkQpCi0JCQlNZXNzYWdlQm94KEdldEZvY3VzKCksIHN0cmluZywgIkNvdWxkIG5vdCBkZWxldGUgdmFsdWUiLCBNQl9PSyk7Ci0JCVJlZ0Nsb3NlS2V5KGhLZXkpOwotCX0KLQlmcmVlKGxpbmUpOworICAgIHJlc3VsdCA9IFJlZ09wZW5LZXlFeChoa2V5X3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtleW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhLZXkpOworICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgTWVzc2FnZUJveChHZXRGb2N1cygpLCBzdHJpbmcsICJDb3VsZCBub3Qgb3BlbiBrZXkiLCBNQl9PSyk7CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFJlZ0RlbGV0ZVZhbHVlKGhLZXksIHZhbHVlbmFtZSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUyAmJiByZXN1bHQgIT0gRVJST1JfRklMRV9OT1RfRk9VTkQpCisgICAgICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIHN0cmluZywgIkNvdWxkIG5vdCBkZWxldGUgdmFsdWUiLCBNQl9PSyk7CisgICAgICAgIFJlZ0Nsb3NlS2V5KGhLZXkpOworICAgIH0KKyAgICBmcmVlKGxpbmUpOwogfQogCiBCT09MIE15RGVsZXRlRmlsZShjaGFyICpsaW5lKQogewotCWNoYXIgKnBhdGhuYW1lID0gc3RyY2hyKGxpbmUsICc6Jyk7Ci0JaWYgKCFwYXRobmFtZSkKLQkJcmV0dXJuIEZBTFNFOwotCSsrcGF0aG5hbWU7Ci0Jd2hpbGUgKGlzc3BhY2UoKnBhdGhuYW1lKSkKLQkJKytwYXRobmFtZTsKLQlyZXR1cm4gRGVsZXRlRmlsZShwYXRobmFtZSk7CisgICAgY2hhciAqcGF0aG5hbWUgPSBzdHJjaHIobGluZSwgJzonKTsKKyAgICBpZiAoIXBhdGhuYW1lKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgKytwYXRobmFtZTsKKyAgICB3aGlsZSAoaXNzcGFjZSgqcGF0aG5hbWUpKQorICAgICAgICArK3BhdGhuYW1lOworICAgIHJldHVybiBEZWxldGVGaWxlKHBhdGhuYW1lKTsKIH0KIAogQk9PTCBNeVJlbW92ZURpcmVjdG9yeShjaGFyICpsaW5lKQogewotCWNoYXIgKnBhdGhuYW1lID0gc3RyY2hyKGxpbmUsICc6Jyk7Ci0JaWYgKCFwYXRobmFtZSkKLQkJcmV0dXJuIEZBTFNFOwotCSsrcGF0aG5hbWU7Ci0Jd2hpbGUgKGlzc3BhY2UoKnBhdGhuYW1lKSkKLQkJKytwYXRobmFtZTsKLQlyZXR1cm4gUmVtb3ZlRGlyZWN0b3J5KHBhdGhuYW1lKTsKKyAgICBjaGFyICpwYXRobmFtZSA9IHN0cmNocihsaW5lLCAnOicpOworICAgIGlmICghcGF0aG5hbWUpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICArK3BhdGhuYW1lOworICAgIHdoaWxlIChpc3NwYWNlKCpwYXRobmFtZSkpCisgICAgICAgICsrcGF0aG5hbWU7CisgICAgcmV0dXJuIFJlbW92ZURpcmVjdG9yeShwYXRobmFtZSk7CiB9CiAKIEJPT0wgUnVuX1JlbW92ZVNjcmlwdChjaGFyICpsaW5lKQogewotCWNoYXIgKmRsbG5hbWU7Ci0JY2hhciAqc2NyaXB0bmFtZTsKLQlzdGF0aWMgY2hhciBsYXN0c2NyaXB0W01BWF9QQVRIXTsKKyAgICBjaGFyICpkbGxuYW1lOworICAgIGNoYXIgKnNjcmlwdG5hbWU7CisgICAgc3RhdGljIGNoYXIgbGFzdHNjcmlwdFtNQVhfUEFUSF07CiAKIC8qIEZvcm1hdCBpcyAnUnVuIFNjcmlwdHM6IFtweXRob25kbGxdc2NyaXB0bmFtZScgKi8KIC8qIFhYWCBDdXJyZW50bHksIHB5dGhvbmRsbCBjYXJyaWVzIG5vIHBhdGghISEgKi8KLQlkbGxuYW1lID0gc3RyY2hyKGxpbmUsICdbJyk7Ci0JaWYgKCFkbGxuYW1lKQotCQlyZXR1cm4gRkFMU0U7Ci0JKytkbGxuYW1lOwotCXNjcmlwdG5hbWUgPSBzdHJjaHIoZGxsbmFtZSwgJ10nKTsKLQlpZiAoIXNjcmlwdG5hbWUpCi0JCXJldHVybiBGQUxTRTsKLQkqc2NyaXB0bmFtZSsrID0gJ1wwJzsKLQkvKiB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uZSB0aW1lIHdpdGggdGhlIHNhbWUKLQkgICBzY3JpcHQsIG9ubHkgcnVuIGl0IG9uZSB0aW1lICovCi0JaWYgKHN0cmNtcChsYXN0c2NyaXB0LCBzY3JpcHRuYW1lKSkgewotCQljaGFyICphcmd2WzNdID0ge05VTEwsICItcmVtb3ZlIiwgTlVMTH07Ci0JCWNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgZGxsbmFtZSA9IHN0cmNocihsaW5lLCAnWycpOworICAgIGlmICghZGxsbmFtZSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICsrZGxsbmFtZTsKKyAgICBzY3JpcHRuYW1lID0gc3RyY2hyKGRsbG5hbWUsICddJyk7CisgICAgaWYgKCFzY3JpcHRuYW1lKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgKnNjcmlwdG5hbWUrKyA9ICdcMCc7CisgICAgLyogdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmUgdGltZSB3aXRoIHRoZSBzYW1lCisgICAgICAgc2NyaXB0LCBvbmx5IHJ1biBpdCBvbmUgdGltZSAqLworICAgIGlmIChzdHJjbXAobGFzdHNjcmlwdCwgc2NyaXB0bmFtZSkpIHsKKyAgICAgICAgY2hhciAqYXJndlszXSA9IHtOVUxMLCAiLXJlbW92ZSIsIE5VTEx9OworICAgICAgICBjaGFyICpidWZmZXIgPSBOVUxMOwogCi0JCWFyZ3ZbMF0gPSBzY3JpcHRuYW1lOworICAgICAgICBhcmd2WzBdID0gc2NyaXB0bmFtZTsKIAotCQlpZiAoMCAhPSBydW5faW5zdGFsbHNjcmlwdChzY3JpcHRuYW1lLCAyLCBhcmd2LCAmYnVmZmVyKSkKLQkJCWZwcmludGYoc3RkZXJyLCAiKioqIENvdWxkIG5vdCBydW4gaW5zdGFsbGF0aW9uIHNjcmlwdCAqKioiKTsKKyAgICAgICAgaWYgKDAgIT0gcnVuX2luc3RhbGxzY3JpcHQoc2NyaXB0bmFtZSwgMiwgYXJndiwgJmJ1ZmZlcikpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIioqKiBDb3VsZCBub3QgcnVuIGluc3RhbGxhdGlvbiBzY3JpcHQgKioqIik7CiAKLQkJaWYgKGJ1ZmZlciAmJiBidWZmZXJbMF0pCi0JCQlNZXNzYWdlQm94KEdldEZvY3VzKCksIGJ1ZmZlciwgInVuaW5zdGFsbC1zY3JpcHQiLCBNQl9PSyk7Ci0JCWZyZWUoYnVmZmVyKTsKKyAgICAgICAgaWYgKGJ1ZmZlciAmJiBidWZmZXJbMF0pCisgICAgICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksIGJ1ZmZlciwgInVuaW5zdGFsbC1zY3JpcHQiLCBNQl9PSyk7CisgICAgICAgIGZyZWUoYnVmZmVyKTsKIAotCQlzdHJjcHkobGFzdHNjcmlwdCwgc2NyaXB0bmFtZSk7Ci0JfQotCXJldHVybiBUUlVFOworICAgICAgICBzdHJjcHkobGFzdHNjcmlwdCwgc2NyaXB0bmFtZSk7CisgICAgfQorICAgIHJldHVybiBUUlVFOwogfQogCiBpbnQgRG9Vbmluc3RhbGwoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCUZJTEUgKmxvZ2ZpbGU7Ci0JY2hhciBidWZmZXJbNDA5Nl07Ci0JaW50IG5MaW5lcyA9IDA7Ci0JaW50IGk7Ci0JY2hhciAqY3A7Ci0JaW50IG5GaWxlcyA9IDA7Ci0JaW50IG5EaXJzID0gMDsKLQlpbnQgbkVycm9ycyA9IDA7Ci0JY2hhciAqKmxpbmVzOwotCWludCBsaW5lc19idWZmZXJfc2l6ZSA9IDEwOwotICAgIAotCWlmIChhcmdjICE9IDMpIHsKLQkJTWVzc2FnZUJveChOVUxMLAotCQkJICAgIldyb25nIG51bWJlciBvZiBhcmdzIiwKLQkJCSAgIE5VTEwsCi0JCQkgICBNQl9PSyk7Ci0JCXJldHVybiAxOyAvKiBFcnJvciAqLwotCX0KLQlpZiAoc3RyY21wKGFyZ3ZbMV0sICItdSIpKSB7Ci0JCU1lc3NhZ2VCb3goTlVMTCwKLQkJCSAgICIyLiBhcmcgaXMgbm90IC11IiwKLQkJCSAgIE5VTEwsCi0JCQkgICBNQl9PSyk7Ci0JCXJldHVybiAxOyAvKiBFcnJvciAqLwotCX0KKyAgICBGSUxFICpsb2dmaWxlOworICAgIGNoYXIgYnVmZmVyWzQwOTZdOworICAgIGludCBuTGluZXMgPSAwOworICAgIGludCBpOworICAgIGNoYXIgKmNwOworICAgIGludCBuRmlsZXMgPSAwOworICAgIGludCBuRGlycyA9IDA7CisgICAgaW50IG5FcnJvcnMgPSAwOworICAgIGNoYXIgKipsaW5lczsKKyAgICBpbnQgbGluZXNfYnVmZmVyX3NpemUgPSAxMDsKIAotCWxvZ2ZpbGUgPSBmb3Blbihhcmd2WzJdLCAiciIpOwotCWlmICghbG9nZmlsZSkgewotCQlNZXNzYWdlQm94KE5VTEwsCi0JCQkgICAiY291bGQgbm90IG9wZW4gbG9nZmlsZSIsCi0JCQkgICBOVUxMLAotCQkJICAgTUJfT0spOwotCQlyZXR1cm4gMTsgLyogRXJyb3IgKi8KLQl9Ci0gICAgCi0JbGluZXMgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBsaW5lc19idWZmZXJfc2l6ZSk7Ci0JaWYgKCFsaW5lcykKLQkJcmV0dXJuIFN5c3RlbUVycm9yKDAsICJPdXQgb2YgbWVtb3J5Iik7CisgICAgaWYgKGFyZ2MgIT0gMykgeworICAgICAgICBNZXNzYWdlQm94KE5VTEwsCisgICAgICAgICAgICAgICAgICAgIldyb25nIG51bWJlciBvZiBhcmdzIiwKKyAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgIE1CX09LKTsKKyAgICAgICAgcmV0dXJuIDE7IC8qIEVycm9yICovCisgICAgfQorICAgIGlmIChzdHJjbXAoYXJndlsxXSwgIi11IikpIHsKKyAgICAgICAgTWVzc2FnZUJveChOVUxMLAorICAgICAgICAgICAgICAgICAgICIyLiBhcmcgaXMgbm90IC11IiwKKyAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgIE1CX09LKTsKKyAgICAgICAgcmV0dXJuIDE7IC8qIEVycm9yICovCisgICAgfQogCi0JLyogUmVhZCB0aGUgd2hvbGUgbG9nZmlsZSwgcmVhbGxvYWN0aW5nIHRoZSBidWZmZXIgKi8KLQl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgbG9nZmlsZSkpIHsKLQkJaW50IGxlbiA9IHN0cmxlbihidWZmZXIpOwotCQkvKiByZW1vdmUgdHJhaWxpbmcgd2hpdGUgc3BhY2UgKi8KLQkJd2hpbGUgKGlzc3BhY2UoYnVmZmVyW2xlbi0xXSkpCi0JCQlsZW4gLT0gMTsKLQkJYnVmZmVyW2xlbl0gPSAnXDAnOwotCQlsaW5lc1tuTGluZXMrK10gPSBzdHJkdXAoYnVmZmVyKTsKLQkJaWYgKG5MaW5lcyA+PSBsaW5lc19idWZmZXJfc2l6ZSkgewotCQkJbGluZXNfYnVmZmVyX3NpemUgKz0gMTA7Ci0JCQlsaW5lcyA9IChjaGFyICoqKXJlYWxsb2MobGluZXMsCi0JCQkJCQkgc2l6ZW9mKGNoYXIgKikgKiBsaW5lc19idWZmZXJfc2l6ZSk7Ci0JCQlpZiAoIWxpbmVzKQotCQkJCXJldHVybiBTeXN0ZW1FcnJvcigwLCAiT3V0IG9mIG1lbW9yeSIpOwotCQl9Ci0JfQotCWZjbG9zZShsb2dmaWxlKTsKKyAgICBsb2dmaWxlID0gZm9wZW4oYXJndlsyXSwgInIiKTsKKyAgICBpZiAoIWxvZ2ZpbGUpIHsKKyAgICAgICAgTWVzc2FnZUJveChOVUxMLAorICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3Qgb3BlbiBsb2dmaWxlIiwKKyAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgIE1CX09LKTsKKyAgICAgICAgcmV0dXJuIDE7IC8qIEVycm9yICovCisgICAgfQogCi0JLyogU29ydCBhbGwgdGhlIGxpbmVzLCBzbyB0aGF0IGhpZ2hlc3QgMy1kaWdpdCBjb2RlcyBhcmUgZmlyc3QgKi8KLQlxc29ydCgmbGluZXNbMF0sIG5MaW5lcywgc2l6ZW9mKGNoYXIgKiksCi0JICAgICAgY29tcGFyZSk7CisgICAgbGluZXMgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBsaW5lc19idWZmZXJfc2l6ZSk7CisgICAgaWYgKCFsaW5lcykKKyAgICAgICAgcmV0dXJuIFN5c3RlbUVycm9yKDAsICJPdXQgb2YgbWVtb3J5Iik7CiAKLQlpZiAoSURZRVMgIT0gTWVzc2FnZUJveChOVUxMLAotCQkJCSJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gcmVtb3ZlXG4iCi0JCQkJInRoaXMgcGFja2FnZSBmcm9tIHlvdXIgY29tcHV0ZXI/IiwKLQkJCQkiUGxlYXNlIGNvbmZpcm0iLAotCQkJCU1CX1lFU05PIHwgTUJfSUNPTlFVRVNUSU9OKSkKLQkJcmV0dXJuIDA7CisgICAgLyogUmVhZCB0aGUgd2hvbGUgbG9nZmlsZSwgcmVhbGxvYWN0aW5nIHRoZSBidWZmZXIgKi8KKyAgICB3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgbG9nZmlsZSkpIHsKKyAgICAgICAgaW50IGxlbiA9IHN0cmxlbihidWZmZXIpOworICAgICAgICAvKiByZW1vdmUgdHJhaWxpbmcgd2hpdGUgc3BhY2UgKi8KKyAgICAgICAgd2hpbGUgKGlzc3BhY2UoYnVmZmVyW2xlbi0xXSkpCisgICAgICAgICAgICBsZW4gLT0gMTsKKyAgICAgICAgYnVmZmVyW2xlbl0gPSAnXDAnOworICAgICAgICBsaW5lc1tuTGluZXMrK10gPSBzdHJkdXAoYnVmZmVyKTsKKyAgICAgICAgaWYgKG5MaW5lcyA+PSBsaW5lc19idWZmZXJfc2l6ZSkgeworICAgICAgICAgICAgbGluZXNfYnVmZmVyX3NpemUgKz0gMTA7CisgICAgICAgICAgICBsaW5lcyA9IChjaGFyICoqKXJlYWxsb2MobGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYXIgKikgKiBsaW5lc19idWZmZXJfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWxpbmVzKQorICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW1FcnJvcigwLCAiT3V0IG9mIG1lbW9yeSIpOworICAgICAgICB9CisgICAgfQorICAgIGZjbG9zZShsb2dmaWxlKTsKIAotCWhrZXlfcm9vdCA9IEhLRVlfTE9DQUxfTUFDSElORTsKLQljcCA9ICIiOwotCWZvciAoaSA9IDA7IGkgPCBuTGluZXM7ICsraSkgewotCQkvKiBJZ25vcmUgZHVwbGljYXRlIGxpbmVzICovCi0JCWlmIChzdHJjbXAoY3AsIGxpbmVzW2ldKSkgewotCQkJaW50IGlnbjsKLQkJCWNwID0gbGluZXNbaV07Ci0JCQkvKiBQYXJzZSB0aGUgbGluZXMgKi8KLQkJCWlmICgyID09IHNzY2FuZihjcCwgIiVkIFJvb3QgS2V5OiAlcyIsICZpZ24sICZidWZmZXIpKSB7Ci0JCQkJaWYgKHN0cmNtcChidWZmZXIsICJIS0VZX0NVUlJFTlRfVVNFUiIpPT0wKQotCQkJCQloa2V5X3Jvb3QgPSBIS0VZX0NVUlJFTlRfVVNFUjsKLQkJCQllbHNlIHsKLQkJCQkJLy8gSEtMTSAtIGNoZWNrIHRoZXkgaGF2ZSBwZXJtaXNzaW9ucy4KLQkJCQkJaWYgKCFIYXNMb2NhbE1hY2hpbmVQcml2cygpKSB7Ci0JCQkJCQlNZXNzYWdlQm94KEdldEZvY3VzKCksCi0JCQkJCQkJICAgIllvdSBkbyBub3Qgc2VlbSB0byBoYXZlIHN1ZmZpY2llbnQgYWNjZXNzIHJpZ2h0c1xuIgotCQkJCQkJCSAgICJvbiB0aGlzIG1hY2hpbmUgdG8gdW5pbnN0YWxsIHRoaXMgc29mdHdhcmUiLAotCQkJCQkJCSAgIE5VTEwsCi0JCQkJCQkJICAgTUJfT0sgfCBNQl9JQ09OU1RPUCk7Ci0JCQkJCQlyZXR1cm4gMTsgLyogRXJyb3IgKi8KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBNYWRlIERpcjogJXMiLCAmaWduLCAmYnVmZmVyKSkgewotCQkJCWlmIChNeVJlbW92ZURpcmVjdG9yeShjcCkpCi0JCQkJCSsrbkRpcnM7Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBjb2RlID0gR2V0TGFzdEVycm9yKCk7Ci0JCQkJCWlmIChjb2RlICE9IDIgJiYgY29kZSAhPSAzKSB7IC8qIGZpbGUgb3IgcGF0aCBub3QgZm91bmQgKi8KLQkJCQkJCSsrbkVycm9yczsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBGaWxlIENvcHk6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKLQkJCQlpZiAoTXlEZWxldGVGaWxlKGNwKSkKLQkJCQkJKytuRmlsZXM7Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBjb2RlID0gR2V0TGFzdEVycm9yKCk7Ci0JCQkJCWlmIChjb2RlICE9IDIgJiYgY29kZSAhPSAzKSB7IC8qIGZpbGUgb3IgcGF0aCBub3QgZm91bmQgKi8KLQkJCQkJCSsrbkVycm9yczsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBGaWxlIE92ZXJ3cml0ZTogJXMiLCAmaWduLCAmYnVmZmVyKSkgewotCQkJCWlmIChNeURlbGV0ZUZpbGUoY3ApKQotCQkJCQkrK25GaWxlczsKLQkJCQllbHNlIHsKLQkJCQkJaW50IGNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKLQkJCQkJaWYgKGNvZGUgIT0gMiAmJiBjb2RlICE9IDMpIHsgLyogZmlsZSBvciBwYXRoIG5vdCBmb3VuZCAqLwotCQkJCQkJKytuRXJyb3JzOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIFJlZyBEQiBLZXk6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKLQkJCQlEZWxldGVSZWdpc3RyeUtleShjcCk7Ci0JCQl9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgUmVnIERCIFZhbHVlOiAlcyIsICZpZ24sICZidWZmZXIpKSB7Ci0JCQkJRGVsZXRlUmVnaXN0cnlWYWx1ZShjcCk7Ci0JCQl9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgUnVuIFNjcmlwdDogJXMiLCAmaWduLCAmYnVmZmVyKSkgewotCQkJCVJ1bl9SZW1vdmVTY3JpcHQoY3ApOwotCQkJfQotCQl9Ci0JfQorICAgIC8qIFNvcnQgYWxsIHRoZSBsaW5lcywgc28gdGhhdCBoaWdoZXN0IDMtZGlnaXQgY29kZXMgYXJlIGZpcnN0ICovCisgICAgcXNvcnQoJmxpbmVzWzBdLCBuTGluZXMsIHNpemVvZihjaGFyICopLAorICAgICAgICAgIGNvbXBhcmUpOwogCi0JaWYgKERlbGV0ZUZpbGUoYXJndlsyXSkpIHsKLQkJKytuRmlsZXM7Ci0JfSBlbHNlIHsKLQkJKytuRXJyb3JzOwotCQlTeXN0ZW1FcnJvcihHZXRMYXN0RXJyb3IoKSwgYXJndlsyXSk7Ci0JfQotCWlmIChuRXJyb3JzKQotCQl3c3ByaW50ZihidWZmZXIsCi0JCQkgIiVkIGZpbGVzIGFuZCAlZCBkaXJlY3RvcmllcyByZW1vdmVkXG4iCi0JCQkgIiVkIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGNvdWxkIG5vdCBiZSByZW1vdmVkIiwKLQkJCSBuRmlsZXMsIG5EaXJzLCBuRXJyb3JzKTsKLQllbHNlCi0JCXdzcHJpbnRmKGJ1ZmZlciwgIiVkIGZpbGVzIGFuZCAlZCBkaXJlY3RvcmllcyByZW1vdmVkIiwKLQkJCSBuRmlsZXMsIG5EaXJzKTsKLQlNZXNzYWdlQm94KE5VTEwsIGJ1ZmZlciwgIlVuaW5zdGFsbCBGaW5pc2hlZCEiLAotCQkgICBNQl9PSyB8IE1CX0lDT05JTkZPUk1BVElPTik7Ci0JcmVtb3ZlX2V4ZSgpOwotCXJldHVybiAwOworICAgIGlmIChJRFlFUyAhPSBNZXNzYWdlQm94KE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwYWNrYWdlIGZyb20geW91ciBjb21wdXRlcj8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgY29uZmlybSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfWUVTTk8gfCBNQl9JQ09OUVVFU1RJT04pKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGhrZXlfcm9vdCA9IEhLRVlfTE9DQUxfTUFDSElORTsKKyAgICBjcCA9ICIiOworICAgIGZvciAoaSA9IDA7IGkgPCBuTGluZXM7ICsraSkgeworICAgICAgICAvKiBJZ25vcmUgZHVwbGljYXRlIGxpbmVzICovCisgICAgICAgIGlmIChzdHJjbXAoY3AsIGxpbmVzW2ldKSkgeworICAgICAgICAgICAgaW50IGlnbjsKKyAgICAgICAgICAgIGNwID0gbGluZXNbaV07CisgICAgICAgICAgICAvKiBQYXJzZSB0aGUgbGluZXMgKi8KKyAgICAgICAgICAgIGlmICgyID09IHNzY2FuZihjcCwgIiVkIFJvb3QgS2V5OiAlcyIsICZpZ24sICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChidWZmZXIsICJIS0VZX0NVUlJFTlRfVVNFUiIpPT0wKQorICAgICAgICAgICAgICAgICAgICBoa2V5X3Jvb3QgPSBIS0VZX0NVUlJFTlRfVVNFUjsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSEtMTSAtIGNoZWNrIHRoZXkgaGF2ZSBwZXJtaXNzaW9ucy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFIYXNMb2NhbE1hY2hpbmVQcml2cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQm94KEdldEZvY3VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgZG8gbm90IHNlZW0gdG8gaGF2ZSBzdWZmaWNpZW50IGFjY2VzcyByaWdodHNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgbWFjaGluZSB0byB1bmluc3RhbGwgdGhpcyBzb2Z0d2FyZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CX09LIHwgTUJfSUNPTlNUT1ApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIEVycm9yICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgTWFkZSBEaXI6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBpZiAoTXlSZW1vdmVEaXJlY3RvcnkoY3ApKQorICAgICAgICAgICAgICAgICAgICArK25EaXJzOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAyICYmIGNvZGUgIT0gMykgeyAvKiBmaWxlIG9yIHBhdGggbm90IGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICArK25FcnJvcnM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgRmlsZSBDb3B5OiAlcyIsICZpZ24sICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgaWYgKE15RGVsZXRlRmlsZShjcCkpCisgICAgICAgICAgICAgICAgICAgICsrbkZpbGVzOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSAyICYmIGNvZGUgIT0gMykgeyAvKiBmaWxlIG9yIHBhdGggbm90IGZvdW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICArK25FcnJvcnM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKDIgPT0gc3NjYW5mKGNwLCAiJWQgRmlsZSBPdmVyd3JpdGU6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBpZiAoTXlEZWxldGVGaWxlKGNwKSkKKyAgICAgICAgICAgICAgICAgICAgKytuRmlsZXM7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IDIgJiYgY29kZSAhPSAzKSB7IC8qIGZpbGUgb3IgcGF0aCBub3QgZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICsrbkVycm9yczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoMiA9PSBzc2NhbmYoY3AsICIlZCBSZWcgREIgS2V5OiAlcyIsICZpZ24sICZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgRGVsZXRlUmVnaXN0cnlLZXkoY3ApOworICAgICAgICAgICAgfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIFJlZyBEQiBWYWx1ZTogJXMiLCAmaWduLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIERlbGV0ZVJlZ2lzdHJ5VmFsdWUoY3ApOworICAgICAgICAgICAgfSBlbHNlIGlmICgyID09IHNzY2FuZihjcCwgIiVkIFJ1biBTY3JpcHQ6ICVzIiwgJmlnbiwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBSdW5fUmVtb3ZlU2NyaXB0KGNwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChEZWxldGVGaWxlKGFyZ3ZbMl0pKSB7CisgICAgICAgICsrbkZpbGVzOworICAgIH0gZWxzZSB7CisgICAgICAgICsrbkVycm9yczsKKyAgICAgICAgU3lzdGVtRXJyb3IoR2V0TGFzdEVycm9yKCksIGFyZ3ZbMl0pOworICAgIH0KKyAgICBpZiAobkVycm9ycykKKyAgICAgICAgd3NwcmludGYoYnVmZmVyLAorICAgICAgICAgICAgICAgICAiJWQgZmlsZXMgYW5kICVkIGRpcmVjdG9yaWVzIHJlbW92ZWRcbiIKKyAgICAgICAgICAgICAgICAgIiVkIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGNvdWxkIG5vdCBiZSByZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgbkZpbGVzLCBuRGlycywgbkVycm9ycyk7CisgICAgZWxzZQorICAgICAgICB3c3ByaW50ZihidWZmZXIsICIlZCBmaWxlcyBhbmQgJWQgZGlyZWN0b3JpZXMgcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgIG5GaWxlcywgbkRpcnMpOworICAgIE1lc3NhZ2VCb3goTlVMTCwgYnVmZmVyLCAiVW5pbnN0YWxsIEZpbmlzaGVkISIsCisgICAgICAgICAgICAgICBNQl9PSyB8IE1CX0lDT05JTkZPUk1BVElPTik7CisgICAgcmVtb3ZlX2V4ZSgpOworICAgIHJldHVybiAwOwogfQogCiBpbnQgV0lOQVBJIFdpbk1haW4oSElOU1RBTkNFIGhJbnN0LCBISU5TVEFOQ0UgaFByZXZJbnN0LAotCQkgICAgTFBTVFIgbHBzekNtZExpbmUsIElOVCBuQ21kU2hvdykKKyAgICAgICAgICAgICAgICAgICAgTFBTVFIgbHBzekNtZExpbmUsIElOVCBuQ21kU2hvdykKIHsKLQlleHRlcm4gaW50IF9fYXJnYzsKLQlleHRlcm4gY2hhciAqKl9fYXJndjsKLQljaGFyICpiYXNlbmFtZTsKKyAgICBleHRlcm4gaW50IF9fYXJnYzsKKyAgICBleHRlcm4gY2hhciAqKl9fYXJndjsKKyAgICBjaGFyICpiYXNlbmFtZTsKIAotCUdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIG1vZHVsZW5hbWUsIHNpemVvZihtb2R1bGVuYW1lKSk7CisgICAgR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgbW9kdWxlbmFtZSwgc2l6ZW9mKG1vZHVsZW5hbWUpKTsKIAotCS8qIE1hcCB0aGUgZXhlY3V0YWJsZSBmaWxlIHRvIG1lbW9yeSAqLwotCWFyY19kYXRhID0gTWFwRXhpc3RpbmdGaWxlKG1vZHVsZW5hbWUsICZhcmNfc2l6ZSk7Ci0JaWYgKCFhcmNfZGF0YSkgewotCQlTeXN0ZW1FcnJvcihHZXRMYXN0RXJyb3IoKSwgIkNvdWxkIG5vdCBvcGVuIGFyY2hpdmUiKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIC8qIE1hcCB0aGUgZXhlY3V0YWJsZSBmaWxlIHRvIG1lbW9yeSAqLworICAgIGFyY19kYXRhID0gTWFwRXhpc3RpbmdGaWxlKG1vZHVsZW5hbWUsICZhcmNfc2l6ZSk7CisgICAgaWYgKCFhcmNfZGF0YSkgeworICAgICAgICBTeXN0ZW1FcnJvcihHZXRMYXN0RXJyb3IoKSwgIkNvdWxkIG5vdCBvcGVuIGFyY2hpdmUiKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogCi0JLyogT0suIFNvIHRoaXMgcHJvZ3JhbSBjYW4gYWN0IGFzIGluc3RhbGxlciAoc2VsZi1leHRyYWN0aW5nCi0JICogemlwLWZpbGUsIG9yIGFzIHVuaW5zdGFsbGVyIHdoZW4gc3RhcnRlZCB3aXRoICctdSBsb2dmaWxlJwotCSAqIGNvbW1hbmQgbGluZSBmbGFncy4KLQkgKgotCSAqIFRoZSBpbnN0YWxsZXIgaXMgdXN1YWxseSBzdGFydGVkIHdpdGhvdXQgY29tbWFuZCBsaW5lIGZsYWdzLAotCSAqIGFuZCB0aGUgdW5pbnN0YWxsZXIgaXMgdXN1YWxseSBzdGFydGVkIHdpdGggdGhlICctdSBsb2dmaWxlJwotCSAqIGZsYWcuIFdoYXQgdG8gZG8gaWYgc29tZSBpbm5vY2VudCB1c2VyIGRvdWJsZS1jbGlja3MgdGhlCi0JICogZXhlLWZpbGU/Ci0JICogVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRzIGEgZGVmZW5zaXZlIHN0cmF0ZWd5Li4uCi0JICovCisgICAgLyogT0suIFNvIHRoaXMgcHJvZ3JhbSBjYW4gYWN0IGFzIGluc3RhbGxlciAoc2VsZi1leHRyYWN0aW5nCisgICAgICogemlwLWZpbGUsIG9yIGFzIHVuaW5zdGFsbGVyIHdoZW4gc3RhcnRlZCB3aXRoICctdSBsb2dmaWxlJworICAgICAqIGNvbW1hbmQgbGluZSBmbGFncy4KKyAgICAgKgorICAgICAqIFRoZSBpbnN0YWxsZXIgaXMgdXN1YWxseSBzdGFydGVkIHdpdGhvdXQgY29tbWFuZCBsaW5lIGZsYWdzLAorICAgICAqIGFuZCB0aGUgdW5pbnN0YWxsZXIgaXMgdXN1YWxseSBzdGFydGVkIHdpdGggdGhlICctdSBsb2dmaWxlJworICAgICAqIGZsYWcuIFdoYXQgdG8gZG8gaWYgc29tZSBpbm5vY2VudCB1c2VyIGRvdWJsZS1jbGlja3MgdGhlCisgICAgICogZXhlLWZpbGU/CisgICAgICogVGhlIGZvbGxvd2luZyBpbXBsZW1lbnRzIGEgZGVmZW5zaXZlIHN0cmF0ZWd5Li4uCisgICAgICovCiAKLQkvKiBUcnkgdG8gZXh0cmFjdCB0aGUgY29uZmlndXJhdGlvbiBkYXRhIGludG8gYSB0ZW1wb3JhcnkgZmlsZSAqLwotCWlmIChFeHRyYWN0SW5zdGFsbERhdGEoYXJjX2RhdGEsIGFyY19zaXplLCAmZXhlX3NpemUsCi0JCQkgICAgICAgJmluaV9maWxlLCAmcHJlX2luc3RhbGxfc2NyaXB0KSkKLQkJcmV0dXJuIERvSW5zdGFsbCgpOworICAgIC8qIFRyeSB0byBleHRyYWN0IHRoZSBjb25maWd1cmF0aW9uIGRhdGEgaW50byBhIHRlbXBvcmFyeSBmaWxlICovCisgICAgaWYgKEV4dHJhY3RJbnN0YWxsRGF0YShhcmNfZGF0YSwgYXJjX3NpemUsICZleGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmlfZmlsZSwgJnByZV9pbnN0YWxsX3NjcmlwdCkpCisgICAgICAgIHJldHVybiBEb0luc3RhbGwoKTsKIAotCWlmICghaW5pX2ZpbGUgJiYgX19hcmdjID4gMSkgewotCQlyZXR1cm4gRG9Vbmluc3RhbGwoX19hcmdjLCBfX2FyZ3YpOwotCX0KKyAgICBpZiAoIWluaV9maWxlICYmIF9fYXJnYyA+IDEpIHsKKyAgICAgICAgcmV0dXJuIERvVW5pbnN0YWxsKF9fYXJnYywgX19hcmd2KTsKKyAgICB9CiAKIAotCWJhc2VuYW1lID0gc3RycmNocihtb2R1bGVuYW1lLCAnXFwnKTsKLQlpZiAoYmFzZW5hbWUpCi0JCSsrYmFzZW5hbWU7CisgICAgYmFzZW5hbWUgPSBzdHJyY2hyKG1vZHVsZW5hbWUsICdcXCcpOworICAgIGlmIChiYXNlbmFtZSkKKyAgICAgICAgKytiYXNlbmFtZTsKIAotCS8qIExhc3QgZ3Vlc3MgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBwcm9ncmFtICovCi0JaWYgKGJhc2VuYW1lICYmICgwID09IHN0cm5jbXAoYmFzZW5hbWUsICJSZW1vdmUiLCA2KSkpCi0JCVN5c3RlbUVycm9yKDAsICJUaGlzIHByb2dyYW0gaXMgbm9ybWFsbHkgc3RhcnRlZCBieSB3aW5kb3dzIik7Ci0JZWxzZQotCQlTeXN0ZW1FcnJvcigwLCAiU2V0dXAgcHJvZ3JhbSBpbnZhbGlkIG9yIGRhbWFnZWQiKTsKLQlyZXR1cm4gMTsKKyAgICAvKiBMYXN0IGd1ZXNzIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoaXMgcHJvZ3JhbSAqLworICAgIGlmIChiYXNlbmFtZSAmJiAoMCA9PSBzdHJuY21wKGJhc2VuYW1lLCAiUmVtb3ZlIiwgNikpKQorICAgICAgICBTeXN0ZW1FcnJvcigwLCAiVGhpcyBwcm9ncmFtIGlzIG5vcm1hbGx5IHN0YXJ0ZWQgYnkgd2luZG93cyIpOworICAgIGVsc2UKKyAgICAgICAgU3lzdGVtRXJyb3IoMCwgIlNldHVwIHByb2dyYW0gaW52YWxpZCBvciBkYW1hZ2VkIik7CisgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9QQy9jb25maWcuYyBiL1BDL2NvbmZpZy5jCmluZGV4IGE1ZTE1MzAuLjNmZDhkYjcgMTAwNjQ0Ci0tLSBhL1BDL2NvbmZpZy5jCisrKyBiL1BDL2NvbmZpZy5jCkBAIC03OCw5NCArNzgsOTQgQEAKIAogc3RydWN0IF9pbml0dGFiIF9QeUltcG9ydF9Jbml0dGFiW10gPSB7CiAKLSAgICAgICAgeyJhcnJheSIsIGluaXRhcnJheX0sCi0JeyJfYXN0IiwgaW5pdF9hc3R9LAorICAgIHsiYXJyYXkiLCBpbml0YXJyYXl9LAorICAgIHsiX2FzdCIsIGluaXRfYXN0fSwKICNpZmRlZiBNU19XSU5ET1dTCiAjaWZuZGVmIE1TX1dJTkk2NAotICAgICAgICB7ImF1ZGlvb3AiLCBpbml0YXVkaW9vcH0sCisgICAgeyJhdWRpb29wIiwgaW5pdGF1ZGlvb3B9LAogI2VuZGlmCiAjZW5kaWYKLSAgICAgICAgeyJiaW5hc2NpaSIsIGluaXRiaW5hc2NpaX0sCi0gICAgICAgIHsiY21hdGgiLCBpbml0Y21hdGh9LAotICAgICAgICB7ImVycm5vIiwgaW5pdGVycm5vfSwKLSAgICAgICAgeyJmdXR1cmVfYnVpbHRpbnMiLCBpbml0ZnV0dXJlX2J1aWx0aW5zfSwKLSAgICAgICAgeyJnYyIsIGluaXRnY30sCisgICAgeyJiaW5hc2NpaSIsIGluaXRiaW5hc2NpaX0sCisgICAgeyJjbWF0aCIsIGluaXRjbWF0aH0sCisgICAgeyJlcnJubyIsIGluaXRlcnJub30sCisgICAgeyJmdXR1cmVfYnVpbHRpbnMiLCBpbml0ZnV0dXJlX2J1aWx0aW5zfSwKKyAgICB7ImdjIiwgaW5pdGdjfSwKICNpZm5kZWYgTVNfV0lOSTY0Ci0gICAgICAgIHsiaW1hZ2VvcCIsIGluaXRpbWFnZW9wfSwKKyAgICB7ImltYWdlb3AiLCBpbml0aW1hZ2VvcH0sCiAjZW5kaWYKLSAgICAgICAgeyJtYXRoIiwgaW5pdG1hdGh9LAotICAgICAgICB7Il9tZDUiLCBpbml0X21kNX0sCi0gICAgICAgIHsibnQiLCBpbml0bnR9LCAvKiBVc2UgdGhlIE5UIG9zIGZ1bmN0aW9ucywgbm90IHBvc2l4ICovCi0gICAgICAgIHsib3BlcmF0b3IiLCBpbml0b3BlcmF0b3J9LAotICAgICAgICB7InNpZ25hbCIsIGluaXRzaWduYWx9LAotICAgICAgICB7Il9zaGEiLCBpbml0X3NoYX0sCi0gICAgICAgIHsiX3NoYTI1NiIsIGluaXRfc2hhMjU2fSwKLSAgICAgICAgeyJfc2hhNTEyIiwgaW5pdF9zaGE1MTJ9LAotICAgICAgICB7InN0cm9wIiwgaW5pdHN0cm9wfSwKLSAgICAgICAgeyJ0aW1lIiwgaW5pdHRpbWV9LAorICAgIHsibWF0aCIsIGluaXRtYXRofSwKKyAgICB7Il9tZDUiLCBpbml0X21kNX0sCisgICAgeyJudCIsIGluaXRudH0sIC8qIFVzZSB0aGUgTlQgb3MgZnVuY3Rpb25zLCBub3QgcG9zaXggKi8KKyAgICB7Im9wZXJhdG9yIiwgaW5pdG9wZXJhdG9yfSwKKyAgICB7InNpZ25hbCIsIGluaXRzaWduYWx9LAorICAgIHsiX3NoYSIsIGluaXRfc2hhfSwKKyAgICB7Il9zaGEyNTYiLCBpbml0X3NoYTI1Nn0sCisgICAgeyJfc2hhNTEyIiwgaW5pdF9zaGE1MTJ9LAorICAgIHsic3Ryb3AiLCBpbml0c3Ryb3B9LAorICAgIHsidGltZSIsIGluaXR0aW1lfSwKICNpZmRlZiBXSVRIX1RIUkVBRAotICAgICAgICB7InRocmVhZCIsIGluaXR0aHJlYWR9LAorICAgIHsidGhyZWFkIiwgaW5pdHRocmVhZH0sCiAjZW5kaWYKLSAgICAgICAgeyJjU3RyaW5nSU8iLCBpbml0Y1N0cmluZ0lPfSwKLSAgICAgICAgeyJjUGlja2xlIiwgaW5pdGNQaWNrbGV9LAorICAgIHsiY1N0cmluZ0lPIiwgaW5pdGNTdHJpbmdJT30sCisgICAgeyJjUGlja2xlIiwgaW5pdGNQaWNrbGV9LAogI2lmZGVmIFdJTjMyCi0gICAgICAgIHsibXN2Y3J0IiwgaW5pdG1zdmNydH0sCi0gICAgICAgIHsiX2xvY2FsZSIsIGluaXRfbG9jYWxlfSwKKyAgICB7Im1zdmNydCIsIGluaXRtc3ZjcnR9LAorICAgIHsiX2xvY2FsZSIsIGluaXRfbG9jYWxlfSwKICNlbmRpZgotCS8qIFhYWCBTaG91bGQgX3N1YnByb2Nlc3MgZ28gaW4gYSBXSU4zMiBibG9jaz8gIG5vdCBXSU42ND8gKi8KLQl7Il9zdWJwcm9jZXNzIiwgaW5pdF9zdWJwcm9jZXNzfSwKKyAgICAvKiBYWFggU2hvdWxkIF9zdWJwcm9jZXNzIGdvIGluIGEgV0lOMzIgYmxvY2s/ICBub3QgV0lONjQ/ICovCisgICAgeyJfc3VicHJvY2VzcyIsIGluaXRfc3VicHJvY2Vzc30sCiAKLSAgICAgICAgeyJfY29kZWNzIiwgaW5pdF9jb2RlY3N9LAotCXsiX3dlYWtyZWYiLCBpbml0X3dlYWtyZWZ9LAotCXsiX2hvdHNob3QiLCBpbml0X2hvdHNob3R9LAotCXsiX3JhbmRvbSIsIGluaXRfcmFuZG9tfSwKLSAgICAgICAgeyJfYmlzZWN0IiwgaW5pdF9iaXNlY3R9LAotICAgICAgICB7Il9oZWFwcSIsIGluaXRfaGVhcHF9LAotCXsiX2xzcHJvZiIsIGluaXRfbHNwcm9mfSwKLQl7Iml0ZXJ0b29scyIsIGluaXRpdGVydG9vbHN9LAotICAgICAgICB7Il9jb2xsZWN0aW9ucyIsIGluaXRfY29sbGVjdGlvbnN9LAotCXsiX3N5bXRhYmxlIiwgaW5pdF9zeW10YWJsZX0sCi0JeyJtbWFwIiwgaW5pdG1tYXB9LAotCXsiX2NzdiIsIGluaXRfY3N2fSwKLQl7Il9zcmUiLCBpbml0X3NyZX0sCi0JeyJwYXJzZXIiLCBpbml0cGFyc2VyfSwKLQl7Il93aW5yZWciLCBpbml0X3dpbnJlZ30sCi0JeyJfc3RydWN0IiwgaW5pdF9zdHJ1Y3R9LAotCXsiZGF0ZXRpbWUiLCBpbml0ZGF0ZXRpbWV9LAotCXsiX2ZpbGVpbyIsIGluaXRfZmlsZWlvfSwKLQl7Il9ieXRlc2lvIiwgaW5pdF9ieXRlc2lvfSwKLQl7Il9mdW5jdG9vbHMiLCBpbml0X2Z1bmN0b29sc30sCi0JeyJfanNvbiIsIGluaXRfanNvbn0sCisgICAgeyJfY29kZWNzIiwgaW5pdF9jb2RlY3N9LAorICAgIHsiX3dlYWtyZWYiLCBpbml0X3dlYWtyZWZ9LAorICAgIHsiX2hvdHNob3QiLCBpbml0X2hvdHNob3R9LAorICAgIHsiX3JhbmRvbSIsIGluaXRfcmFuZG9tfSwKKyAgICB7Il9iaXNlY3QiLCBpbml0X2Jpc2VjdH0sCisgICAgeyJfaGVhcHEiLCBpbml0X2hlYXBxfSwKKyAgICB7Il9sc3Byb2YiLCBpbml0X2xzcHJvZn0sCisgICAgeyJpdGVydG9vbHMiLCBpbml0aXRlcnRvb2xzfSwKKyAgICB7Il9jb2xsZWN0aW9ucyIsIGluaXRfY29sbGVjdGlvbnN9LAorICAgIHsiX3N5bXRhYmxlIiwgaW5pdF9zeW10YWJsZX0sCisgICAgeyJtbWFwIiwgaW5pdG1tYXB9LAorICAgIHsiX2NzdiIsIGluaXRfY3N2fSwKKyAgICB7Il9zcmUiLCBpbml0X3NyZX0sCisgICAgeyJwYXJzZXIiLCBpbml0cGFyc2VyfSwKKyAgICB7Il93aW5yZWciLCBpbml0X3dpbnJlZ30sCisgICAgeyJfc3RydWN0IiwgaW5pdF9zdHJ1Y3R9LAorICAgIHsiZGF0ZXRpbWUiLCBpbml0ZGF0ZXRpbWV9LAorICAgIHsiX2ZpbGVpbyIsIGluaXRfZmlsZWlvfSwKKyAgICB7Il9ieXRlc2lvIiwgaW5pdF9ieXRlc2lvfSwKKyAgICB7Il9mdW5jdG9vbHMiLCBpbml0X2Z1bmN0b29sc30sCisgICAgeyJfanNvbiIsIGluaXRfanNvbn0sCiAKLQl7Inh4c3VidHlwZSIsIGluaXR4eHN1YnR5cGV9LAotCXsiemlwaW1wb3J0IiwgaW5pdHppcGltcG9ydH0sCi0JeyJ6bGliIiwgaW5pdHpsaWJ9LAotCQotCS8qIENKSyBjb2RlY3MgKi8KLQl7Il9tdWx0aWJ5dGVjb2RlYyIsIGluaXRfbXVsdGlieXRlY29kZWN9LAotCXsiX2NvZGVjc19jbiIsIGluaXRfY29kZWNzX2NufSwKLQl7Il9jb2RlY3NfaGsiLCBpbml0X2NvZGVjc19oa30sCi0JeyJfY29kZWNzX2lzbzIwMjIiLCBpbml0X2NvZGVjc19pc28yMDIyfSwKLQl7Il9jb2RlY3NfanAiLCBpbml0X2NvZGVjc19qcH0sCi0JeyJfY29kZWNzX2tyIiwgaW5pdF9jb2RlY3Nfa3J9LAotCXsiX2NvZGVjc190dyIsIGluaXRfY29kZWNzX3R3fSwKKyAgICB7Inh4c3VidHlwZSIsIGluaXR4eHN1YnR5cGV9LAorICAgIHsiemlwaW1wb3J0IiwgaW5pdHppcGltcG9ydH0sCisgICAgeyJ6bGliIiwgaW5pdHpsaWJ9LAorCisgICAgLyogQ0pLIGNvZGVjcyAqLworICAgIHsiX211bHRpYnl0ZWNvZGVjIiwgaW5pdF9tdWx0aWJ5dGVjb2RlY30sCisgICAgeyJfY29kZWNzX2NuIiwgaW5pdF9jb2RlY3NfY259LAorICAgIHsiX2NvZGVjc19oayIsIGluaXRfY29kZWNzX2hrfSwKKyAgICB7Il9jb2RlY3NfaXNvMjAyMiIsIGluaXRfY29kZWNzX2lzbzIwMjJ9LAorICAgIHsiX2NvZGVjc19qcCIsIGluaXRfY29kZWNzX2pwfSwKKyAgICB7Il9jb2RlY3Nfa3IiLCBpbml0X2NvZGVjc19rcn0sCisgICAgeyJfY29kZWNzX3R3IiwgaW5pdF9jb2RlY3NfdHd9LAogCiAvKiB0b29scy9mcmVlemUvbWFrZWNvbmZpZy5weSBtYXJrZXIgZm9yIGFkZGl0aW9uYWwgIl9pbml0dGFiIiBlbnRyaWVzICovCiAvKiAtLSBBRERNT0RVTEUgTUFSS0VSIDIgLS0gKi8KIAotICAgICAgICAvKiBUaGlzIG1vZHVsZSAibGl2ZXMgaW4iIHdpdGggbWFyc2hhbC5jICovCi0gICAgICAgIHsibWFyc2hhbCIsIFB5TWFyc2hhbF9Jbml0fSwKKyAgICAvKiBUaGlzIG1vZHVsZSAibGl2ZXMgaW4iIHdpdGggbWFyc2hhbC5jICovCisgICAgeyJtYXJzaGFsIiwgUHlNYXJzaGFsX0luaXR9LAogCi0gICAgICAgIC8qIFRoaXMgbGl2ZXMgaXQgd2l0aCBpbXBvcnQuYyAqLwotICAgICAgICB7ImltcCIsIGluaXRpbXB9LAorICAgIC8qIFRoaXMgbGl2ZXMgaXQgd2l0aCBpbXBvcnQuYyAqLworICAgIHsiaW1wIiwgaW5pdGltcH0sCiAKLSAgICAgICAgLyogVGhlc2UgZW50cmllcyBhcmUgaGVyZSBmb3Igc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzICovCi0gICAgICAgIHsiX19tYWluX18iLCBOVUxMfSwKLSAgICAgICAgeyJfX2J1aWx0aW5fXyIsIE5VTEx9LAotICAgICAgICB7InN5cyIsIE5VTEx9LAotCXsiZXhjZXB0aW9ucyIsIE5VTEx9LAotICAgICAgICB7Il93YXJuaW5ncyIsIF9QeVdhcm5pbmdzX0luaXR9LAorICAgIC8qIFRoZXNlIGVudHJpZXMgYXJlIGhlcmUgZm9yIHN5cy5idWlsdGluX21vZHVsZV9uYW1lcyAqLworICAgIHsiX19tYWluX18iLCBOVUxMfSwKKyAgICB7Il9fYnVpbHRpbl9fIiwgTlVMTH0sCisgICAgeyJzeXMiLCBOVUxMfSwKKyAgICB7ImV4Y2VwdGlvbnMiLCBOVUxMfSwKKyAgICB7Il93YXJuaW5ncyIsIF9QeVdhcm5pbmdzX0luaXR9LAogCi0gICAgICAgIC8qIFNlbnRpbmVsICovCi0gICAgICAgIHswLCAwfQorICAgIC8qIFNlbnRpbmVsICovCisgICAgezAsIDB9CiB9OwpkaWZmIC0tZ2l0IGEvUEMvZGxfbnQuYyBiL1BDL2RsX250LmMKaW5kZXggZjhhZjgwMi4uZWYxY2UwOSAxMDA2NDQKLS0tIGEvUEMvZGxfbnQuYworKysgYi9QQy9kbF9udC5jCkBAIC0zLDcgKzMsNyBAQAogRW50cnkgcG9pbnQgZm9yIHRoZSBXaW5kb3dzIE5UIERMTC4KIAogQWJvdXQgdGhlIG9ubHkgcmVhc29uIGZvciBoYXZpbmcgdGhpcywgaXMgc28gaW5pdGFsbCgpIGNhbiBhdXRvbWF0aWNhbGx5Ci1iZSBjYWxsZWQsIHJlbW92aW5nIHRoYXQgYnVyZGVuIChhbmQgcG9zc2libGUgc291cmNlIG9mIGZydXN0cmF0aW9uIGlmIAorYmUgY2FsbGVkLCByZW1vdmluZyB0aGF0IGJ1cmRlbiAoYW5kIHBvc3NpYmxlIHNvdXJjZSBvZiBmcnVzdHJhdGlvbiBpZgogZm9yZ290dGVuKSBmcm9tIHRoZSBwcm9ncmFtbWVyLgogCiAqLwpAQCAtNDYsNjEgKzQ2LDYxIEBACiAKIHZvaWQgX0xvYWRBY3RDdHhQb2ludGVycygpCiB7Ci0JSElOU1RBTkNFIGhLZXJuZWwzMiA9IEdldE1vZHVsZUhhbmRsZVcoTCJrZXJuZWwzMi5kbGwiKTsKLQlpZiAoaEtlcm5lbDMyKQotCQlwZm5HZXRDdXJyZW50QWN0Q3R4ID0gKFBGTl9HRVRDVVJSRU5UQUNUQ1RYKSBHZXRQcm9jQWRkcmVzcyhoS2VybmVsMzIsICJHZXRDdXJyZW50QWN0Q3R4Iik7Ci0JLy8gSWYgd2UgY2FuJ3QgbG9hZCBHZXRDdXJyZW50QWN0Q3R4IChpZSwgcHJlIFhQKSAsIGRvbid0IGJvdGhlciB3aXRoIHRoZSByZXN0LgotCWlmIChwZm5HZXRDdXJyZW50QWN0Q3R4KSB7Ci0JCXBmbkFjdGl2YXRlQWN0Q3R4ID0gKFBGTl9BQ1RJVkFURUFDVENUWCkgR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLCAiQWN0aXZhdGVBY3RDdHgiKTsKLQkJcGZuRGVhY3RpdmF0ZUFjdEN0eCA9IChQRk5fREVBQ1RJVkFURUFDVENUWCkgR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLCAiRGVhY3RpdmF0ZUFjdEN0eCIpOwotCQlwZm5BZGRSZWZBY3RDdHggPSAoUEZOX0FERFJFRkFDVENUWCkgR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLCAiQWRkUmVmQWN0Q3R4Iik7Ci0JCXBmblJlbGVhc2VBY3RDdHggPSAoUEZOX1JFTEVBU0VBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIlJlbGVhc2VBY3RDdHgiKTsKLQl9CisgICAgSElOU1RBTkNFIGhLZXJuZWwzMiA9IEdldE1vZHVsZUhhbmRsZVcoTCJrZXJuZWwzMi5kbGwiKTsKKyAgICBpZiAoaEtlcm5lbDMyKQorICAgICAgICBwZm5HZXRDdXJyZW50QWN0Q3R4ID0gKFBGTl9HRVRDVVJSRU5UQUNUQ1RYKSBHZXRQcm9jQWRkcmVzcyhoS2VybmVsMzIsICJHZXRDdXJyZW50QWN0Q3R4Iik7CisgICAgLy8gSWYgd2UgY2FuJ3QgbG9hZCBHZXRDdXJyZW50QWN0Q3R4IChpZSwgcHJlIFhQKSAsIGRvbid0IGJvdGhlciB3aXRoIHRoZSByZXN0LgorICAgIGlmIChwZm5HZXRDdXJyZW50QWN0Q3R4KSB7CisgICAgICAgIHBmbkFjdGl2YXRlQWN0Q3R4ID0gKFBGTl9BQ1RJVkFURUFDVENUWCkgR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLCAiQWN0aXZhdGVBY3RDdHgiKTsKKyAgICAgICAgcGZuRGVhY3RpdmF0ZUFjdEN0eCA9IChQRk5fREVBQ1RJVkFURUFDVENUWCkgR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLCAiRGVhY3RpdmF0ZUFjdEN0eCIpOworICAgICAgICBwZm5BZGRSZWZBY3RDdHggPSAoUEZOX0FERFJFRkFDVENUWCkgR2V0UHJvY0FkZHJlc3MoaEtlcm5lbDMyLCAiQWRkUmVmQWN0Q3R4Iik7CisgICAgICAgIHBmblJlbGVhc2VBY3RDdHggPSAoUEZOX1JFTEVBU0VBQ1RDVFgpIEdldFByb2NBZGRyZXNzKGhLZXJuZWwzMiwgIlJlbGVhc2VBY3RDdHgiKTsKKyAgICB9CiB9CiAKIFVMT05HX1BUUiBfUHlfQWN0aXZhdGVBY3RDdHgoKQogewotCVVMT05HX1BUUiByZXQgPSAwOwotCWlmIChQeVdpbl9ETExoQWN0aXZhdGlvbkNvbnRleHQgJiYgcGZuQWN0aXZhdGVBY3RDdHgpCi0JCWlmICghKCpwZm5BY3RpdmF0ZUFjdEN0eCkoUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0LCAmcmV0KSkgewotCQkJT3V0cHV0RGVidWdTdHJpbmcoIlB5dGhvbiBmYWlsZWQgdG8gYWN0aXZhdGUgdGhlIGFjdGl2YXRpb24gY29udGV4dCBiZWZvcmUgbG9hZGluZyBhIERMTFxuIik7Ci0JCQlyZXQgPSAwOyAvLyBubyBwcm9taXNlIHRoZSBmYWlsaW5nIGZ1bmN0aW9uIGRpZG4ndCBjaGFuZ2UgaXQhCi0JCX0KLQlyZXR1cm4gcmV0OworICAgIFVMT05HX1BUUiByZXQgPSAwOworICAgIGlmIChQeVdpbl9ETExoQWN0aXZhdGlvbkNvbnRleHQgJiYgcGZuQWN0aXZhdGVBY3RDdHgpCisgICAgICAgIGlmICghKCpwZm5BY3RpdmF0ZUFjdEN0eCkoUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0LCAmcmV0KSkgeworICAgICAgICAgICAgT3V0cHV0RGVidWdTdHJpbmcoIlB5dGhvbiBmYWlsZWQgdG8gYWN0aXZhdGUgdGhlIGFjdGl2YXRpb24gY29udGV4dCBiZWZvcmUgbG9hZGluZyBhIERMTFxuIik7CisgICAgICAgICAgICByZXQgPSAwOyAvLyBubyBwcm9taXNlIHRoZSBmYWlsaW5nIGZ1bmN0aW9uIGRpZG4ndCBjaGFuZ2UgaXQhCisgICAgICAgIH0KKyAgICByZXR1cm4gcmV0OwogfQogCiB2b2lkIF9QeV9EZWFjdGl2YXRlQWN0Q3R4KFVMT05HX1BUUiBjb29raWUpCiB7Ci0JaWYgKGNvb2tpZSAmJiBwZm5EZWFjdGl2YXRlQWN0Q3R4KQotCQlpZiAoISgqcGZuRGVhY3RpdmF0ZUFjdEN0eCkoMCwgY29va2llKSkKLQkJCU91dHB1dERlYnVnU3RyaW5nKCJQeXRob24gZmFpbGVkIHRvIGRlLWFjdGl2YXRlIHRoZSBhY3RpdmF0aW9uIGNvbnRleHRcbiIpOworICAgIGlmIChjb29raWUgJiYgcGZuRGVhY3RpdmF0ZUFjdEN0eCkKKyAgICAgICAgaWYgKCEoKnBmbkRlYWN0aXZhdGVBY3RDdHgpKDAsIGNvb2tpZSkpCisgICAgICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZygiUHl0aG9uIGZhaWxlZCB0byBkZS1hY3RpdmF0ZSB0aGUgYWN0aXZhdGlvbiBjb250ZXh0XG4iKTsKIH0KIAotQk9PTAlXSU5BUEkJRGxsTWFpbiAoSEFORExFIGhJbnN0LCAKLQkJCQkJCVVMT05HIHVsX3JlYXNvbl9mb3JfY2FsbCwKLQkJCQkJCUxQVk9JRCBscFJlc2VydmVkKQorQk9PTCAgICBXSU5BUEkgIERsbE1haW4gKEhBTkRMRSBoSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIHVsX3JlYXNvbl9mb3JfY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVk9JRCBscFJlc2VydmVkKQogewotCXN3aXRjaCAodWxfcmVhc29uX2Zvcl9jYWxsKQotCXsKLQkJY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6Ci0JCQlQeVdpbl9ETExoTW9kdWxlID0gaEluc3Q7Ci0JCQkvLyAxMDAwIGlzIGEgbWFnaWMgbnVtYmVyIEkgcGlja2VkIG91dCBvZiB0aGUgYWlyLiAgQ291bGQgZG8gd2l0aCBhICNkZWZpbmUsIEkgc3Bvc2UuLi4KLQkJCUxvYWRTdHJpbmcoaEluc3QsIDEwMDAsIGRsbFZlcnNpb25CdWZmZXIsIHNpemVvZihkbGxWZXJzaW9uQnVmZmVyKSk7CisgICAgc3dpdGNoICh1bF9yZWFzb25fZm9yX2NhbGwpCisgICAgeworICAgICAgICBjYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKyAgICAgICAgICAgIFB5V2luX0RMTGhNb2R1bGUgPSBoSW5zdDsKKyAgICAgICAgICAgIC8vIDEwMDAgaXMgYSBtYWdpYyBudW1iZXIgSSBwaWNrZWQgb3V0IG9mIHRoZSBhaXIuICBDb3VsZCBkbyB3aXRoIGEgI2RlZmluZSwgSSBzcG9zZS4uLgorICAgICAgICAgICAgTG9hZFN0cmluZyhoSW5zdCwgMTAwMCwgZGxsVmVyc2lvbkJ1ZmZlciwgc2l6ZW9mKGRsbFZlcnNpb25CdWZmZXIpKTsKIAotCQkJLy8gYW5kIGNhcHR1cmUgb3VyIGFjdGl2YXRpb24gY29udGV4dCBmb3IgdXNlIHdoZW4gbG9hZGluZyBleHRlbnNpb25zLgotCQkJX0xvYWRBY3RDdHhQb2ludGVycygpOwotCQkJaWYgKHBmbkdldEN1cnJlbnRBY3RDdHggJiYgcGZuQWRkUmVmQWN0Q3R4KQotCQkJCWlmICgoKnBmbkdldEN1cnJlbnRBY3RDdHgpKCZQeVdpbl9ETExoQWN0aXZhdGlvbkNvbnRleHQpKQotCQkJCQlpZiAoISgqcGZuQWRkUmVmQWN0Q3R4KShQeVdpbl9ETExoQWN0aXZhdGlvbkNvbnRleHQpKQotCQkJCQkJT3V0cHV0RGVidWdTdHJpbmcoIlB5dGhvbiBmYWlsZWQgdG8gbG9hZCB0aGUgZGVmYXVsdCBhY3RpdmF0aW9uIGNvbnRleHRcbiIpOwotCQkJYnJlYWs7CisgICAgICAgICAgICAvLyBhbmQgY2FwdHVyZSBvdXIgYWN0aXZhdGlvbiBjb250ZXh0IGZvciB1c2Ugd2hlbiBsb2FkaW5nIGV4dGVuc2lvbnMuCisgICAgICAgICAgICBfTG9hZEFjdEN0eFBvaW50ZXJzKCk7CisgICAgICAgICAgICBpZiAocGZuR2V0Q3VycmVudEFjdEN0eCAmJiBwZm5BZGRSZWZBY3RDdHgpCisgICAgICAgICAgICAgICAgaWYgKCgqcGZuR2V0Q3VycmVudEFjdEN0eCkoJlB5V2luX0RMTGhBY3RpdmF0aW9uQ29udGV4dCkpCisgICAgICAgICAgICAgICAgICAgIGlmICghKCpwZm5BZGRSZWZBY3RDdHgpKFB5V2luX0RMTGhBY3RpdmF0aW9uQ29udGV4dCkpCisgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZygiUHl0aG9uIGZhaWxlZCB0byBsb2FkIHRoZSBkZWZhdWx0IGFjdGl2YXRpb24gY29udGV4dFxuIik7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIERMTF9QUk9DRVNTX0RFVEFDSDoKLQkJCWlmIChwZm5SZWxlYXNlQWN0Q3R4KQotCQkJCSgqcGZuUmVsZWFzZUFjdEN0eCkoUHlXaW5fRExMaEFjdGl2YXRpb25Db250ZXh0KTsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gVFJVRTsKKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6CisgICAgICAgICAgICBpZiAocGZuUmVsZWFzZUFjdEN0eCkKKyAgICAgICAgICAgICAgICAoKnBmblJlbGVhc2VBY3RDdHgpKFB5V2luX0RMTGhBY3RpdmF0aW9uQ29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKICNlbmRpZiAvKiBQeV9FTkFCTEVfU0hBUkVEICovCmRpZmYgLS1naXQgYS9QQy9lcnJtYXAuaCBiL1BDL2Vycm1hcC5oCmluZGV4IDU5YWVlYTEuLmQyMjVhYTQgMTAwNjQ0Ci0tLSBhL1BDL2Vycm1hcC5oCisrKyBiL1BDL2Vycm1hcC5oCkBAIC0xLDc4ICsxLDc4IEBACiAvKiBHZW5lcmF0ZWQgZmlsZS4gRG8gbm90IGVkaXQuICovCiBpbnQgd2luZXJyb3JfdG9fZXJybm8oaW50IHdpbmVycm9yKQogewotCXN3aXRjaCh3aW5lcnJvcikgewotCQljYXNlIDI6IHJldHVybiAyOwotCQljYXNlIDM6IHJldHVybiAyOwotCQljYXNlIDQ6IHJldHVybiAyNDsKLQkJY2FzZSA1OiByZXR1cm4gMTM7Ci0JCWNhc2UgNjogcmV0dXJuIDk7Ci0JCWNhc2UgNzogcmV0dXJuIDEyOwotCQljYXNlIDg6IHJldHVybiAxMjsKLQkJY2FzZSA5OiByZXR1cm4gMTI7Ci0JCWNhc2UgMTA6IHJldHVybiA3OwotCQljYXNlIDExOiByZXR1cm4gODsKLQkJY2FzZSAxNTogcmV0dXJuIDI7Ci0JCWNhc2UgMTY6IHJldHVybiAxMzsKLQkJY2FzZSAxNzogcmV0dXJuIDE4OwotCQljYXNlIDE4OiByZXR1cm4gMjsKLQkJY2FzZSAxOTogcmV0dXJuIDEzOwotCQljYXNlIDIwOiByZXR1cm4gMTM7Ci0JCWNhc2UgMjE6IHJldHVybiAxMzsKLQkJY2FzZSAyMjogcmV0dXJuIDEzOwotCQljYXNlIDIzOiByZXR1cm4gMTM7Ci0JCWNhc2UgMjQ6IHJldHVybiAxMzsKLQkJY2FzZSAyNTogcmV0dXJuIDEzOwotCQljYXNlIDI2OiByZXR1cm4gMTM7Ci0JCWNhc2UgMjc6IHJldHVybiAxMzsKLQkJY2FzZSAyODogcmV0dXJuIDEzOwotCQljYXNlIDI5OiByZXR1cm4gMTM7Ci0JCWNhc2UgMzA6IHJldHVybiAxMzsKLQkJY2FzZSAzMTogcmV0dXJuIDEzOwotCQljYXNlIDMyOiByZXR1cm4gMTM7Ci0JCWNhc2UgMzM6IHJldHVybiAxMzsKLQkJY2FzZSAzNDogcmV0dXJuIDEzOwotCQljYXNlIDM1OiByZXR1cm4gMTM7Ci0JCWNhc2UgMzY6IHJldHVybiAxMzsKLQkJY2FzZSA1MzogcmV0dXJuIDI7Ci0JCWNhc2UgNjU6IHJldHVybiAxMzsKLQkJY2FzZSA2NzogcmV0dXJuIDI7Ci0JCWNhc2UgODA6IHJldHVybiAxNzsKLQkJY2FzZSA4MjogcmV0dXJuIDEzOwotCQljYXNlIDgzOiByZXR1cm4gMTM7Ci0JCWNhc2UgODk6IHJldHVybiAxMTsKLQkJY2FzZSAxMDg6IHJldHVybiAxMzsKLQkJY2FzZSAxMDk6IHJldHVybiAzMjsKLQkJY2FzZSAxMTI6IHJldHVybiAyODsKLQkJY2FzZSAxMTQ6IHJldHVybiA5OwotCQljYXNlIDEyODogcmV0dXJuIDEwOwotCQljYXNlIDEyOTogcmV0dXJuIDEwOwotCQljYXNlIDEzMDogcmV0dXJuIDk7Ci0JCWNhc2UgMTMyOiByZXR1cm4gMTM7Ci0JCWNhc2UgMTQ1OiByZXR1cm4gNDE7Ci0JCWNhc2UgMTU4OiByZXR1cm4gMTM7Ci0JCWNhc2UgMTYxOiByZXR1cm4gMjsKLQkJY2FzZSAxNjQ6IHJldHVybiAxMTsKLQkJY2FzZSAxNjc6IHJldHVybiAxMzsKLQkJY2FzZSAxODM6IHJldHVybiAxNzsKLQkJY2FzZSAxODg6IHJldHVybiA4OwotCQljYXNlIDE4OTogcmV0dXJuIDg7Ci0JCWNhc2UgMTkwOiByZXR1cm4gODsKLQkJY2FzZSAxOTE6IHJldHVybiA4OwotCQljYXNlIDE5MjogcmV0dXJuIDg7Ci0JCWNhc2UgMTkzOiByZXR1cm4gODsKLQkJY2FzZSAxOTQ6IHJldHVybiA4OwotCQljYXNlIDE5NTogcmV0dXJuIDg7Ci0JCWNhc2UgMTk2OiByZXR1cm4gODsKLQkJY2FzZSAxOTc6IHJldHVybiA4OwotCQljYXNlIDE5ODogcmV0dXJuIDg7Ci0JCWNhc2UgMTk5OiByZXR1cm4gODsKLQkJY2FzZSAyMDA6IHJldHVybiA4OwotCQljYXNlIDIwMTogcmV0dXJuIDg7Ci0JCWNhc2UgMjAyOiByZXR1cm4gODsKLQkJY2FzZSAyMDY6IHJldHVybiAyOwotCQljYXNlIDIxNTogcmV0dXJuIDExOwotCQljYXNlIDE4MTY6IHJldHVybiAxMjsKLQkJZGVmYXVsdDogcmV0dXJuIEVJTlZBTDsKLQl9CisgICAgc3dpdGNoKHdpbmVycm9yKSB7CisgICAgICAgIGNhc2UgMjogcmV0dXJuIDI7CisgICAgICAgIGNhc2UgMzogcmV0dXJuIDI7CisgICAgICAgIGNhc2UgNDogcmV0dXJuIDI0OworICAgICAgICBjYXNlIDU6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSA2OiByZXR1cm4gOTsKKyAgICAgICAgY2FzZSA3OiByZXR1cm4gMTI7CisgICAgICAgIGNhc2UgODogcmV0dXJuIDEyOworICAgICAgICBjYXNlIDk6IHJldHVybiAxMjsKKyAgICAgICAgY2FzZSAxMDogcmV0dXJuIDc7CisgICAgICAgIGNhc2UgMTE6IHJldHVybiA4OworICAgICAgICBjYXNlIDE1OiByZXR1cm4gMjsKKyAgICAgICAgY2FzZSAxNjogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDE3OiByZXR1cm4gMTg7CisgICAgICAgIGNhc2UgMTg6IHJldHVybiAyOworICAgICAgICBjYXNlIDE5OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMjA6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAyMTogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDIyOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMjM6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAyNDogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDI1OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMjY6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAyNzogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDI4OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMjk6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAzMDogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDMxOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMzI6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAzMzogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDM0OiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgMzU6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAzNjogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDUzOiByZXR1cm4gMjsKKyAgICAgICAgY2FzZSA2NTogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDY3OiByZXR1cm4gMjsKKyAgICAgICAgY2FzZSA4MDogcmV0dXJuIDE3OworICAgICAgICBjYXNlIDgyOiByZXR1cm4gMTM7CisgICAgICAgIGNhc2UgODM6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSA4OTogcmV0dXJuIDExOworICAgICAgICBjYXNlIDEwODogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDEwOTogcmV0dXJuIDMyOworICAgICAgICBjYXNlIDExMjogcmV0dXJuIDI4OworICAgICAgICBjYXNlIDExNDogcmV0dXJuIDk7CisgICAgICAgIGNhc2UgMTI4OiByZXR1cm4gMTA7CisgICAgICAgIGNhc2UgMTI5OiByZXR1cm4gMTA7CisgICAgICAgIGNhc2UgMTMwOiByZXR1cm4gOTsKKyAgICAgICAgY2FzZSAxMzI6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAxNDU6IHJldHVybiA0MTsKKyAgICAgICAgY2FzZSAxNTg6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAxNjE6IHJldHVybiAyOworICAgICAgICBjYXNlIDE2NDogcmV0dXJuIDExOworICAgICAgICBjYXNlIDE2NzogcmV0dXJuIDEzOworICAgICAgICBjYXNlIDE4MzogcmV0dXJuIDE3OworICAgICAgICBjYXNlIDE4ODogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTg5OiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxOTA6IHJldHVybiA4OworICAgICAgICBjYXNlIDE5MTogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTkyOiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxOTM6IHJldHVybiA4OworICAgICAgICBjYXNlIDE5NDogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTk1OiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxOTY6IHJldHVybiA4OworICAgICAgICBjYXNlIDE5NzogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMTk4OiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAxOTk6IHJldHVybiA4OworICAgICAgICBjYXNlIDIwMDogcmV0dXJuIDg7CisgICAgICAgIGNhc2UgMjAxOiByZXR1cm4gODsKKyAgICAgICAgY2FzZSAyMDI6IHJldHVybiA4OworICAgICAgICBjYXNlIDIwNjogcmV0dXJuIDI7CisgICAgICAgIGNhc2UgMjE1OiByZXR1cm4gMTE7CisgICAgICAgIGNhc2UgMTgxNjogcmV0dXJuIDEyOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gRUlOVkFMOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL1BDL2Zyb3plbl9kbGxtYWluLmMgYi9QQy9mcm96ZW5fZGxsbWFpbi5jCmluZGV4IGZiYjQ3MTMuLmE4Y2M4ODUgMTAwNjQ0Ci0tLSBhL1BDL2Zyb3plbl9kbGxtYWluLmMKKysrIGIvUEMvZnJvemVuX2RsbG1haW4uYwpAQCAtOSw3ICs5LDcgQEAKIAogVGhlIHNvbHV0aW9uIGlzOgogKiBFYWNoIG1vZHVsZSBjaGVja3MgZm9yIGEgZnJvemVuIGJ1aWxkLCBhbmQgaWYgc28sIGRlZmluZXMgaXRzIERMTE1haW4KLSAgZnVuY3Rpb24gYXMgIl9fZGVjbHNwZWMoZGxsZXhwb3J0KSBEbGxNYWluJW1vZHVsZSUiIAorICBmdW5jdGlvbiBhcyAiX19kZWNsc3BlYyhkbGxleHBvcnQpIERsbE1haW4lbW9kdWxlJSIKICAgKGVnLCBEbGxNYWlucHl0aG9uY29tLCBvciBEbGxNYWlucHl3aW50eXBlcykKIAogKiBUaGUgZnJvemVuIC5FWEUvLkRMTCBsaW5rcyBhZ2FpbnN0IHRoaXMgbW9kdWxlLCB3aGljaCBwcm92aWRlcwpAQCAtNDcsMTAgKzQ3LDEwIEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogCiBzdGF0aWMgY2hhciAqcG9zc2libGVNb2R1bGVzW10gPSB7Ci0JInB5d2ludHlwZXMiLAotCSJweXRob25jb20iLAotCSJ3aW4zMnVpIiwKLQlOVUxMLAorICAgICJweXdpbnR5cGVzIiwKKyAgICAicHl0aG9uY29tIiwKKyAgICAid2luMzJ1aSIsCisgICAgTlVMTCwKIH07CiAKIEJPT0wgQ2FsbE1vZHVsZURsbE1haW4oY2hhciAqbW9kTmFtZSwgRFdPUkQgZHdSZWFzb24pOwpAQCAtNjIsNzMgKzYyLDczIEBACiAqLwogdm9pZCBQeVdpbkZyZWV6ZV9FeGVJbml0KHZvaWQpCiB7Ci0JY2hhciAqKm1vZE5hbWU7Ci0JZm9yIChtb2ROYW1lID0gcG9zc2libGVNb2R1bGVzOyptb2ROYW1lOyptb2ROYW1lKyspIHsKLS8qCQlwcmludGYoIkluaXRpYWxpc2luZyAnJXMnXG4iLCAqbW9kTmFtZSk7ICovCi0JCUNhbGxNb2R1bGVEbGxNYWluKCptb2ROYW1lLCBETExfUFJPQ0VTU19BVFRBQ0gpOwotCX0KKyAgICBjaGFyICoqbW9kTmFtZTsKKyAgICBmb3IgKG1vZE5hbWUgPSBwb3NzaWJsZU1vZHVsZXM7Km1vZE5hbWU7Km1vZE5hbWUrKykgeworLyogICAgICAgICAgICAgIHByaW50ZigiSW5pdGlhbGlzaW5nICclcydcbiIsICptb2ROYW1lKTsgKi8KKyAgICAgICAgQ2FsbE1vZHVsZURsbE1haW4oKm1vZE5hbWUsIERMTF9QUk9DRVNTX0FUVEFDSCk7CisgICAgfQogfQogCiAvKgogICBDYWxsZWQgYnkgYSBmcm96ZW4gLkVYRSBvbmx5LCBzbyB0aGF0IGJ1aWx0LWluIGV4dGVuc2lvbgotICBtb2R1bGVzIGFyZSBjbGVhbmVkIHVwIAorICBtb2R1bGVzIGFyZSBjbGVhbmVkIHVwCiAqLwogdm9pZCBQeVdpbkZyZWV6ZV9FeGVUZXJtKHZvaWQpCiB7Ci0JLy8gTXVzdCBnbyBiYWNrd2FyZHMKLQljaGFyICoqbW9kTmFtZTsKLQlmb3IgKG1vZE5hbWUgPSBwb3NzaWJsZU1vZHVsZXMrKHNpemVvZihwb3NzaWJsZU1vZHVsZXMpIC8gc2l6ZW9mKGNoYXIgKikpLTI7Ci0JICAgICBtb2ROYW1lID49IHBvc3NpYmxlTW9kdWxlczsKLQkgICAgICptb2ROYW1lLS0pIHsKLS8qCQlwcmludGYoIlRlcm1pbmF0aW5nICclcydcbiIsICptb2ROYW1lKTsqLwotCQlDYWxsTW9kdWxlRGxsTWFpbigqbW9kTmFtZSwgRExMX1BST0NFU1NfREVUQUNIKTsKLQl9CisgICAgLy8gTXVzdCBnbyBiYWNrd2FyZHMKKyAgICBjaGFyICoqbW9kTmFtZTsKKyAgICBmb3IgKG1vZE5hbWUgPSBwb3NzaWJsZU1vZHVsZXMrKHNpemVvZihwb3NzaWJsZU1vZHVsZXMpIC8gc2l6ZW9mKGNoYXIgKikpLTI7CisgICAgICAgICBtb2ROYW1lID49IHBvc3NpYmxlTW9kdWxlczsKKyAgICAgICAgICptb2ROYW1lLS0pIHsKKy8qICAgICAgICAgICAgICBwcmludGYoIlRlcm1pbmF0aW5nICclcydcbiIsICptb2ROYW1lKTsqLworICAgICAgICBDYWxsTW9kdWxlRGxsTWFpbigqbW9kTmFtZSwgRExMX1BST0NFU1NfREVUQUNIKTsKKyAgICB9CiB9CiAKIEJPT0wgV0lOQVBJIERsbE1haW4oSElOU1RBTkNFIGhJbnN0YW5jZSwgRFdPUkQgZHdSZWFzb24sIExQVk9JRCBscFJlc2VydmVkKQogewotCUJPT0wgcmV0ID0gVFJVRTsKLQlzd2l0Y2ggKGR3UmVhc29uKSB7Ci0JCWNhc2UgRExMX1BST0NFU1NfQVRUQUNIOiAKLQkJewotCQkJY2hhciAqKm1vZE5hbWU7Ci0JCQlmb3IgKG1vZE5hbWUgPSBwb3NzaWJsZU1vZHVsZXM7Km1vZE5hbWU7Km1vZE5hbWUrKykgewotCQkJCUJPT0wgb2sgPSBDYWxsTW9kdWxlRGxsTWFpbigqbW9kTmFtZSwgZHdSZWFzb24pOwotCQkJCWlmICghb2spCi0JCQkJCXJldCA9IEZBTFNFOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6IAotCQl7Ci0JCQkvLyBNdXN0IGdvIGJhY2t3YXJkcwotCQkJY2hhciAqKm1vZE5hbWU7Ci0JCQlmb3IgKG1vZE5hbWUgPSBwb3NzaWJsZU1vZHVsZXMrKHNpemVvZihwb3NzaWJsZU1vZHVsZXMpIC8gc2l6ZW9mKGNoYXIgKikpLTI7Ci0JCQkgICAgIG1vZE5hbWUgPj0gcG9zc2libGVNb2R1bGVzOwotCQkJICAgICAqbW9kTmFtZS0tKQotCQkJCUNhbGxNb2R1bGVEbGxNYWluKCptb2ROYW1lLCBETExfUFJPQ0VTU19ERVRBQ0gpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJldDsKKyAgICBCT09MIHJldCA9IFRSVUU7CisgICAgc3dpdGNoIChkd1JlYXNvbikgeworICAgICAgICBjYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciAqKm1vZE5hbWU7CisgICAgICAgICAgICBmb3IgKG1vZE5hbWUgPSBwb3NzaWJsZU1vZHVsZXM7Km1vZE5hbWU7Km1vZE5hbWUrKykgeworICAgICAgICAgICAgICAgIEJPT0wgb2sgPSBDYWxsTW9kdWxlRGxsTWFpbigqbW9kTmFtZSwgZHdSZWFzb24pOworICAgICAgICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgICAgIHJldCA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE11c3QgZ28gYmFja3dhcmRzCisgICAgICAgICAgICBjaGFyICoqbW9kTmFtZTsKKyAgICAgICAgICAgIGZvciAobW9kTmFtZSA9IHBvc3NpYmxlTW9kdWxlcysoc2l6ZW9mKHBvc3NpYmxlTW9kdWxlcykgLyBzaXplb2YoY2hhciAqKSktMjsKKyAgICAgICAgICAgICAgICAgbW9kTmFtZSA+PSBwb3NzaWJsZU1vZHVsZXM7CisgICAgICAgICAgICAgICAgICptb2ROYW1lLS0pCisgICAgICAgICAgICAgICAgQ2FsbE1vZHVsZURsbE1haW4oKm1vZE5hbWUsIERMTF9QUk9DRVNTX0RFVEFDSCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OwogfQogCiBCT09MIENhbGxNb2R1bGVEbGxNYWluKGNoYXIgKm1vZE5hbWUsIERXT1JEIGR3UmVhc29uKQogewotCUJPT0wgKFdJTkFQSSAqIHBmbmRsbG1haW4pKEhJTlNUQU5DRSwgRFdPUkQsIExQVk9JRCk7CisgICAgQk9PTCAoV0lOQVBJICogcGZuZGxsbWFpbikoSElOU1RBTkNFLCBEV09SRCwgTFBWT0lEKTsKIAotCWNoYXIgZnVuY05hbWVbMjU1XTsKLQlITU9EVUxFIGhtb2QgPSBHZXRNb2R1bGVIYW5kbGUoTlVMTCk7Ci0Jc3RyY3B5KGZ1bmNOYW1lLCAiX0RsbE1haW4iKTsKLQlzdHJjYXQoZnVuY05hbWUsIG1vZE5hbWUpOwotCXN0cmNhdChmdW5jTmFtZSwgIkAxMiIpOyAvLyBzdGRjYWxsIGNvbnZlbnRpb24uCi0JcGZuZGxsbWFpbiA9IChCT09MIChXSU5BUEkgKikoSElOU1RBTkNFLCBEV09SRCwgTFBWT0lEKSlHZXRQcm9jQWRkcmVzcyhobW9kLCBmdW5jTmFtZSk7Ci0JaWYgKHBmbmRsbG1haW49PU5VTEwpIHsKLQkJLyogTm8gZnVuY3Rpb24gYnkgdGhhdCBuYW1lIGV4cG9ydGVkIC0gdGhlbiB0aGF0IG1vZHVsZSBkb2VzCi0gCQkgICBub3QgYXBwZWFyIGluIG91ciBmcm96ZW4gcHJvZ3JhbSAtIHJldHVybiBPSwotICAgICAgICAgICAgICAgICovCi0JCXJldHVybiBUUlVFOwotCX0KLQlyZXR1cm4gKCpwZm5kbGxtYWluKShobW9kLCBkd1JlYXNvbiwgTlVMTCk7CisgICAgY2hhciBmdW5jTmFtZVsyNTVdOworICAgIEhNT0RVTEUgaG1vZCA9IEdldE1vZHVsZUhhbmRsZShOVUxMKTsKKyAgICBzdHJjcHkoZnVuY05hbWUsICJfRGxsTWFpbiIpOworICAgIHN0cmNhdChmdW5jTmFtZSwgbW9kTmFtZSk7CisgICAgc3RyY2F0KGZ1bmNOYW1lLCAiQDEyIik7IC8vIHN0ZGNhbGwgY29udmVudGlvbi4KKyAgICBwZm5kbGxtYWluID0gKEJPT0wgKFdJTkFQSSAqKShISU5TVEFOQ0UsIERXT1JELCBMUFZPSUQpKUdldFByb2NBZGRyZXNzKGhtb2QsIGZ1bmNOYW1lKTsKKyAgICBpZiAocGZuZGxsbWFpbj09TlVMTCkgeworICAgICAgICAvKiBObyBmdW5jdGlvbiBieSB0aGF0IG5hbWUgZXhwb3J0ZWQgLSB0aGVuIHRoYXQgbW9kdWxlIGRvZXMKKyAgICAgICAgICAgbm90IGFwcGVhciBpbiBvdXIgZnJvemVuIHByb2dyYW0gLSByZXR1cm4gT0sKKyAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiAoKnBmbmRsbG1haW4pKGhtb2QsIGR3UmVhc29uLCBOVUxMKTsKIH0KIApkaWZmIC0tZ2l0IGEvUEMvZ2VuZXJybWFwLmMgYi9QQy9nZW5lcnJtYXAuYwppbmRleCAyYjI1MDYzLi5iZjEwODFiIDEwMDY0NAotLS0gYS9QQy9nZW5lcnJtYXAuYworKysgYi9QQy9nZW5lcnJtYXAuYwpAQCAtNSwxNiArNSwxNiBAQAogCiBpbnQgbWFpbigpCiB7Ci0JaW50IGk7Ci0JcHJpbnRmKCIvKiBHZW5lcmF0ZWQgZmlsZS4gRG8gbm90IGVkaXQuICovXG4iKTsKLQlwcmludGYoImludCB3aW5lcnJvcl90b19lcnJubyhpbnQgd2luZXJyb3IpXG4iKTsKLQlwcmludGYoIntcblx0c3dpdGNoKHdpbmVycm9yKSB7XG4iKTsKLQlmb3IoaT0xOyBpIDwgNjUwMDA7IGkrKykgewotCQlfZG9zbWFwZXJyKGkpOwotCQlpZiAoZXJybm8gPT0gRUlOVkFMKQotCQkJY29udGludWU7Ci0JCXByaW50ZigiXHRcdGNhc2UgJWQ6IHJldHVybiAlZDtcbiIsIGksIGVycm5vKTsKLQl9Ci0JcHJpbnRmKCJcdFx0ZGVmYXVsdDogcmV0dXJuIEVJTlZBTDtcbiIpOwotCXByaW50ZigiXHR9XG59XG4iKTsKKyAgICBpbnQgaTsKKyAgICBwcmludGYoIi8qIEdlbmVyYXRlZCBmaWxlLiBEbyBub3QgZWRpdC4gKi9cbiIpOworICAgIHByaW50ZigiaW50IHdpbmVycm9yX3RvX2Vycm5vKGludCB3aW5lcnJvcilcbiIpOworICAgIHByaW50Zigie1xuXHRzd2l0Y2god2luZXJyb3IpIHtcbiIpOworICAgIGZvcihpPTE7IGkgPCA2NTAwMDsgaSsrKSB7CisgICAgICAgIF9kb3NtYXBlcnIoaSk7CisgICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcHJpbnRmKCJcdFx0Y2FzZSAlZDogcmV0dXJuICVkO1xuIiwgaSwgZXJybm8pOworICAgIH0KKyAgICBwcmludGYoIlx0XHRkZWZhdWx0OiByZXR1cm4gRUlOVkFMO1xuIik7CisgICAgcHJpbnRmKCJcdH1cbn1cbiIpOwogfQpkaWZmIC0tZ2l0IGEvUEMvZ2V0cGF0aHAuYyBiL1BDL2dldHBhdGhwLmMKaW5kZXggNzhmNDQ2NS4uNDYxZjlmYyAxMDA2NDQKLS0tIGEvUEMvZ2V0cGF0aHAuYworKysgYi9QQy9nZXRwYXRocC5jCkBAIC00LDggKzQsOCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBQQVRIIFJVTEVTIEZPUiBXSU5ET1dTOgotICAgVGhpcyBkZXNjcmliZXMgaG93IHN5cy5wYXRoIGlzIGZvcm1lZCBvbiBXaW5kb3dzLiAgSXQgZGVzY3JpYmVzIHRoZSAKLSAgIGZ1bmN0aW9uYWxpdHksIG5vdCB0aGUgaW1wbGVtZW50YXRpb24gKGllLCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlc2UgCisgICBUaGlzIGRlc2NyaWJlcyBob3cgc3lzLnBhdGggaXMgZm9ybWVkIG9uIFdpbmRvd3MuICBJdCBkZXNjcmliZXMgdGhlCisgICBmdW5jdGlvbmFsaXR5LCBub3QgdGhlIGltcGxlbWVudGF0aW9uIChpZSwgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXNlCiAgICBhcmUgYWN0dWFsbHkgZmV0Y2hlZCBpcyBkaWZmZXJlbnQpCiAKICAgICogUHl0aG9uIGFsd2F5cyBhZGRzIGFuIGVtcHR5IGVudHJ5IGF0IHRoZSBzdGFydCwgd2hpY2ggY29ycmVzcG9uZHMKQEAgLTI0LDE1ICsyNCwxNSBAQAogICAgKiBXZSBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgIlB5dGhvbiBIb21lIiAtIGlmIHRoZSBQWVRIT05IT01FIGVudiB2YXIKICAgICAgaXMgc2V0LCB3ZSBiZWxpZXZlIGl0LiAgT3RoZXJ3aXNlLCB3ZSB1c2UgdGhlIHBhdGggb2Ygb3VyIGhvc3QgLkVYRSdzCiAgICAgIHRvIHRyeSBhbmQgbG9jYXRlIG91ciAibGFuZG1hcmsiIChsaWJcXG9zLnB5KSBhbmQgZGVkdWNlIG91ciBob21lLgotICAgICAtIElmIHdlIERPIGhhdmUgYSBQeXRob24gSG9tZTogVGhlIHJlbGV2YW50IHN1Yi1kaXJlY3RvcmllcyAoTGliLCAKKyAgICAgLSBJZiB3ZSBETyBoYXZlIGEgUHl0aG9uIEhvbWU6IFRoZSByZWxldmFudCBzdWItZGlyZWN0b3JpZXMgKExpYiwKICAgICAgICBwbGF0LXdpbiwgbGliLXRrLCBldGMpIGFyZSBiYXNlZCBvbiB0aGUgUHl0aG9uIEhvbWUKICAgICAgLSBJZiB3ZSBETyBOT1QgaGF2ZSBhIFB5dGhvbiBIb21lLCB0aGUgY29yZSBQeXRob24gUGF0aCBpcwotICAgICAgIGxvYWRlZCBmcm9tIHRoZSByZWdpc3RyeS4gIFRoaXMgaXMgdGhlIG1haW4gUHl0aG9uUGF0aCBrZXksIAorICAgICAgIGxvYWRlZCBmcm9tIHRoZSByZWdpc3RyeS4gIFRoaXMgaXMgdGhlIG1haW4gUHl0aG9uUGF0aCBrZXksCiAgICAgICAgYW5kIGJvdGggSEtMTSBhbmQgSEtDVSBhcmUgY29tYmluZWQgdG8gZm9ybSB0aGUgcGF0aCkKIAogICAgKiBJZmYgLSB3ZSBjYW4gbm90IGxvY2F0ZSB0aGUgUHl0aG9uIEhvbWUsIGhhdmUgbm90IGhhZCBhIFBZVEhPTlBBVEgKICAgICAgc3BlY2lmaWVkLCBhbmQgY2FuJ3QgbG9jYXRlIGFueSBSZWdpc3RyeSBlbnRyaWVzIChpZSwgd2UgaGF2ZSBfbm90aGluZ18KLSAgICAgd2UgY2FuIGFzc3VtZSBpcyBhIGdvb2QgcGF0aCksIGEgZGVmYXVsdCBwYXRoIHdpdGggcmVsYXRpdmUgZW50cmllcyBpcyAKKyAgICAgd2UgY2FuIGFzc3VtZSBpcyBhIGdvb2QgcGF0aCksIGEgZGVmYXVsdCBwYXRoIHdpdGggcmVsYXRpdmUgZW50cmllcyBpcwogICAgICB1c2VkIChlZy4gLlxMaWI7LlxwbGF0LXdpbiwgZXRjKQogCiAKQEAgLTQyLDkgKzQyLDkgQEAKICAgICB0aGUgY29yZSBwYXRoIGlzIGRlZHVjZWQsIGFuZCB0aGUgY29yZSBwYXRocyBpbiB0aGUgcmVnaXN0cnkgYXJlCiAgICAgaWdub3JlZC4gIE90aGVyICJhcHBsaWNhdGlvbiBwYXRocyIgaW4gdGhlIHJlZ2lzdHJ5IGFyZSBhbHdheXMgcmVhZC4KIAotICAqIFdoZW4gUHl0aG9uIGlzIGhvc3RlZCBpbiBhbm90aGVyIGV4ZSAoZGlmZmVyZW50IGRpcmVjdG9yeSwgZW1iZWRkZWQgdmlhIAorICAqIFdoZW4gUHl0aG9uIGlzIGhvc3RlZCBpbiBhbm90aGVyIGV4ZSAoZGlmZmVyZW50IGRpcmVjdG9yeSwgZW1iZWRkZWQgdmlhCiAgICAgQ09NLCBldGMpLCB0aGUgUHl0aG9uIEhvbWUgd2lsbCBub3QgYmUgZGVkdWNlZCwgc28gdGhlIGNvcmUgcGF0aCBmcm9tCi0gICAgdGhlIHJlZ2lzdHJ5IGlzIHVzZWQuICBPdGhlciAiYXBwbGljYXRpb24gcGF0aHMiIGluIHRoZSByZWdpc3RyeSBhcmUgCisgICAgdGhlIHJlZ2lzdHJ5IGlzIHVzZWQuICBPdGhlciAiYXBwbGljYXRpb24gcGF0aHMiIGluIHRoZSByZWdpc3RyeSBhcmUKICAgICBhbHdheXMgcmVhZC4KIAogICAqIElmIFB5dGhvbiBjYW4ndCBmaW5kIGl0cyBob21lIGFuZCB0aGVyZSBpcyBubyByZWdpc3RyeSAoZWcsIGZyb3plbgpAQCAtOTIsMTIgKzkyLDEyIEBACiAKIAogc3RhdGljIGludAotaXNfc2VwKGNoYXIgY2gpCS8qIGRldGVybWluZSBpZiAiY2giIGlzIGEgc2VwYXJhdG9yIGNoYXJhY3RlciAqLworaXNfc2VwKGNoYXIgY2gpIC8qIGRldGVybWluZSBpZiAiY2giIGlzIGEgc2VwYXJhdG9yIGNoYXJhY3RlciAqLwogewogI2lmZGVmIEFMVFNFUAotCXJldHVybiBjaCA9PSBTRVAgfHwgY2ggPT0gQUxUU0VQOworICAgIHJldHVybiBjaCA9PSBTRVAgfHwgY2ggPT0gQUxUU0VQOwogI2Vsc2UKLQlyZXR1cm4gY2ggPT0gU0VQOworICAgIHJldHVybiBjaCA9PSBTRVA7CiAjZW5kaWYKIH0KIApAQCAtMTA3LDM2ICsxMDcsMzYgQEAKIHN0YXRpYyB2b2lkCiByZWR1Y2UoY2hhciAqZGlyKQogewotCXNpemVfdCBpID0gc3RybGVuKGRpcik7Ci0Jd2hpbGUgKGkgPiAwICYmICFpc19zZXAoZGlyW2ldKSkKLQkJLS1pOwotCWRpcltpXSA9ICdcMCc7CisgICAgc2l6ZV90IGkgPSBzdHJsZW4oZGlyKTsKKyAgICB3aGlsZSAoaSA+IDAgJiYgIWlzX3NlcChkaXJbaV0pKQorICAgICAgICAtLWk7CisgICAgZGlyW2ldID0gJ1wwJzsKIH0KLQkKKwogCiBzdGF0aWMgaW50CiBleGlzdHMoY2hhciAqZmlsZW5hbWUpCiB7Ci0Jc3RydWN0IHN0YXQgYnVmOwotCXJldHVybiBzdGF0KGZpbGVuYW1lLCAmYnVmKSA9PSAwOworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICByZXR1cm4gc3RhdChmaWxlbmFtZSwgJmJ1ZikgPT0gMDsKIH0KIAotLyogQXNzdW1lcyAnZmlsZW5hbWUnIE1BWFBBVEhMRU4rMSBieXRlcyBsb25nIC0gCisvKiBBc3N1bWVzICdmaWxlbmFtZScgTUFYUEFUSExFTisxIGJ5dGVzIGxvbmcgLQogICAgbWF5IGV4dGVuZCAnZmlsZW5hbWUnIGJ5IG9uZSBjaGFyYWN0ZXIuCiAqLwogc3RhdGljIGludAotaXNtb2R1bGUoY2hhciAqZmlsZW5hbWUpCS8qIElzIG1vZHVsZSAtLSBjaGVjayBmb3IgLnB5Yy8ucHlvIHRvbyAqLworaXNtb2R1bGUoY2hhciAqZmlsZW5hbWUpICAgICAgICAvKiBJcyBtb2R1bGUgLS0gY2hlY2sgZm9yIC5weWMvLnB5byB0b28gKi8KIHsKLQlpZiAoZXhpc3RzKGZpbGVuYW1lKSkKLQkJcmV0dXJuIDE7CisgICAgaWYgKGV4aXN0cyhmaWxlbmFtZSkpCisgICAgICAgIHJldHVybiAxOwogCi0JLyogQ2hlY2sgZm9yIHRoZSBjb21waWxlZCB2ZXJzaW9uIG9mIHByZWZpeC4gKi8KLQlpZiAoc3RybGVuKGZpbGVuYW1lKSA8IE1BWFBBVEhMRU4pIHsKLQkJc3RyY2F0KGZpbGVuYW1lLCBQeV9PcHRpbWl6ZUZsYWcgPyAibyIgOiAiYyIpOwotCQlpZiAoZXhpc3RzKGZpbGVuYW1lKSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICAvKiBDaGVjayBmb3IgdGhlIGNvbXBpbGVkIHZlcnNpb24gb2YgcHJlZml4LiAqLworICAgIGlmIChzdHJsZW4oZmlsZW5hbWUpIDwgTUFYUEFUSExFTikgeworICAgICAgICBzdHJjYXQoZmlsZW5hbWUsIFB5X09wdGltaXplRmxhZyA/ICJvIiA6ICJjIik7CisgICAgICAgIGlmIChleGlzdHMoZmlsZW5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBBZGQgYSBwYXRoIGNvbXBvbmVudCwgYnkgYXBwZW5kaW5nIHN0dWZmIHRvIGJ1ZmZlci4KQEAgLTE1MSwyMSArMTUxLDIxIEBACiBzdGF0aWMgdm9pZAogam9pbihjaGFyICpidWZmZXIsIGNoYXIgKnN0dWZmKQogewotCXNpemVfdCBuLCBrOwotCWlmIChpc19zZXAoc3R1ZmZbMF0pKQotCQluID0gMDsKLQllbHNlIHsKLQkJbiA9IHN0cmxlbihidWZmZXIpOwotCQlpZiAobiA+IDAgJiYgIWlzX3NlcChidWZmZXJbbi0xXSkgJiYgbiA8IE1BWFBBVEhMRU4pCi0JCQlidWZmZXJbbisrXSA9IFNFUDsKLQl9Ci0JaWYgKG4gPiBNQVhQQVRITEVOKQotCQlQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aHAuYydzIGpvaW5wYXRoKCkiKTsKLQlrID0gc3RybGVuKHN0dWZmKTsKLQlpZiAobiArIGsgPiBNQVhQQVRITEVOKQotCQlrID0gTUFYUEFUSExFTiAtIG47Ci0Jc3RybmNweShidWZmZXIrbiwgc3R1ZmYsIGspOwotCWJ1ZmZlcltuK2tdID0gJ1wwJzsKKyAgICBzaXplX3QgbiwgazsKKyAgICBpZiAoaXNfc2VwKHN0dWZmWzBdKSkKKyAgICAgICAgbiA9IDA7CisgICAgZWxzZSB7CisgICAgICAgIG4gPSBzdHJsZW4oYnVmZmVyKTsKKyAgICAgICAgaWYgKG4gPiAwICYmICFpc19zZXAoYnVmZmVyW24tMV0pICYmIG4gPCBNQVhQQVRITEVOKQorICAgICAgICAgICAgYnVmZmVyW24rK10gPSBTRVA7CisgICAgfQorICAgIGlmIChuID4gTUFYUEFUSExFTikKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiYnVmZmVyIG92ZXJmbG93IGluIGdldHBhdGhwLmMncyBqb2lucGF0aCgpIik7CisgICAgayA9IHN0cmxlbihzdHVmZik7CisgICAgaWYgKG4gKyBrID4gTUFYUEFUSExFTikKKyAgICAgICAgayA9IE1BWFBBVEhMRU4gLSBuOworICAgIHN0cm5jcHkoYnVmZmVyK24sIHN0dWZmLCBrKTsKKyAgICBidWZmZXJbbitrXSA9ICdcMCc7CiB9CiAKIC8qIGdvdGxhbmRtYXJrIG9ubHkgY2FsbGVkIGJ5IHNlYXJjaF9mb3JfcHJlZml4LCB3aGljaCBlbnN1cmVzCkBAIC0xNzUsMjkgKzE3NSwyOSBAQAogc3RhdGljIGludAogZ290bGFuZG1hcmsoY2hhciAqbGFuZG1hcmspCiB7Ci0JaW50IG9rOwotCVB5X3NzaXplX3QgbjsKKyAgICBpbnQgb2s7CisgICAgUHlfc3NpemVfdCBuOwogCi0JbiA9IHN0cmxlbihwcmVmaXgpOwotCWpvaW4ocHJlZml4LCBsYW5kbWFyayk7Ci0Jb2sgPSBpc21vZHVsZShwcmVmaXgpOwotCXByZWZpeFtuXSA9ICdcMCc7Ci0JcmV0dXJuIG9rOworICAgIG4gPSBzdHJsZW4ocHJlZml4KTsKKyAgICBqb2luKHByZWZpeCwgbGFuZG1hcmspOworICAgIG9rID0gaXNtb2R1bGUocHJlZml4KTsKKyAgICBwcmVmaXhbbl0gPSAnXDAnOworICAgIHJldHVybiBvazsKIH0KIAotLyogYXNzdW1lcyBhcmd2MF9wYXRoIGlzIE1BWFBBVEhMRU4rMSBieXRlcyBsb25nLCBhbHJlYWR5IFwwIHRlcm0nZC4gCisvKiBhc3N1bWVzIGFyZ3YwX3BhdGggaXMgTUFYUEFUSExFTisxIGJ5dGVzIGxvbmcsIGFscmVhZHkgXDAgdGVybSdkLgogICAgYXNzdW1wdGlvbiBwcm92aWRlZCBieSBvbmx5IGNhbGxlciwgY2FsY3VsYXRlX3BhdGgoKSAqLwogc3RhdGljIGludAogc2VhcmNoX2Zvcl9wcmVmaXgoY2hhciAqYXJndjBfcGF0aCwgY2hhciAqbGFuZG1hcmspCiB7Ci0JLyogU2VhcmNoIGZyb20gYXJndjBfcGF0aCwgdW50aWwgbGFuZG1hcmsgaXMgZm91bmQgKi8KLQlzdHJjcHkocHJlZml4LCBhcmd2MF9wYXRoKTsKLQlkbyB7Ci0JCWlmIChnb3RsYW5kbWFyayhsYW5kbWFyaykpCi0JCQlyZXR1cm4gMTsKLQkJcmVkdWNlKHByZWZpeCk7Ci0JfSB3aGlsZSAocHJlZml4WzBdKTsKLQlyZXR1cm4gMDsKKyAgICAvKiBTZWFyY2ggZnJvbSBhcmd2MF9wYXRoLCB1bnRpbCBsYW5kbWFyayBpcyBmb3VuZCAqLworICAgIHN0cmNweShwcmVmaXgsIGFyZ3YwX3BhdGgpOworICAgIGRvIHsKKyAgICAgICAgaWYgKGdvdGxhbmRtYXJrKGxhbmRtYXJrKSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZWR1Y2UocHJlZml4KTsKKyAgICB9IHdoaWxlIChwcmVmaXhbMF0pOworICAgIHJldHVybiAwOwogfQogCiAjaWZkZWYgTVNfV0lORE9XUwpAQCAtMjIzLDE0NiArMjIzLDE0NiBAQAogc3RhdGljIGNoYXIgKgogZ2V0cHl0aG9ucmVncGF0aChIS0VZIGtleUJhc2UsIGludCBza2lwY29yZSkKIHsKLQlIS0VZIG5ld0tleSA9IDA7Ci0JRFdPUkQgZGF0YVNpemUgPSAwOwotCURXT1JEIG51bUtleXMgPSAwOwotCUxPTkcgcmM7Ci0JY2hhciAqcmV0dmFsID0gTlVMTDsKLQlUQ0hBUiAqZGF0YUJ1ZiA9IE5VTEw7Ci0Jc3RhdGljIGNvbnN0IFRDSEFSIGtleVByZWZpeFtdID0gX1QoIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCIpOwotCXN0YXRpYyBjb25zdCBUQ0hBUiBrZXlTdWZmaXhbXSA9IF9UKCJcXFB5dGhvblBhdGgiKTsKLQlzaXplX3QgdmVyc2lvbkxlbjsKLQlEV09SRCBpbmRleDsKLQlUQ0hBUiAqa2V5QnVmID0gTlVMTDsKLQlUQ0hBUiAqa2V5QnVmUHRyOwotCVRDSEFSICoqcHBQYXRocyA9IE5VTEw7CisgICAgSEtFWSBuZXdLZXkgPSAwOworICAgIERXT1JEIGRhdGFTaXplID0gMDsKKyAgICBEV09SRCBudW1LZXlzID0gMDsKKyAgICBMT05HIHJjOworICAgIGNoYXIgKnJldHZhbCA9IE5VTEw7CisgICAgVENIQVIgKmRhdGFCdWYgPSBOVUxMOworICAgIHN0YXRpYyBjb25zdCBUQ0hBUiBrZXlQcmVmaXhbXSA9IF9UKCJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwiKTsKKyAgICBzdGF0aWMgY29uc3QgVENIQVIga2V5U3VmZml4W10gPSBfVCgiXFxQeXRob25QYXRoIik7CisgICAgc2l6ZV90IHZlcnNpb25MZW47CisgICAgRFdPUkQgaW5kZXg7CisgICAgVENIQVIgKmtleUJ1ZiA9IE5VTEw7CisgICAgVENIQVIgKmtleUJ1ZlB0cjsKKyAgICBUQ0hBUiAqKnBwUGF0aHMgPSBOVUxMOwogCi0JLyogVHJpZWQgdG8gdXNlIHN5c2dldCgid2ludmVyIikgYnV0IGhlcmUgaXMgdG9vIGVhcmx5IDotKCAqLwotCXZlcnNpb25MZW4gPSBfdGNzbGVuKFB5V2luX0RMTFZlcnNpb25TdHJpbmcpOwotCS8qIFNwYWNlIGZvciBhbGwgdGhlIGNoYXJzLCBwbHVzIG9uZSBcMCAqLwotCWtleUJ1ZiA9IGtleUJ1ZlB0ciA9IG1hbGxvYyhzaXplb2Yoa2V5UHJlZml4KSArIAotCQkgICAgICAgICAgICAgICAgICAgIHNpemVvZihUQ0hBUikqKHZlcnNpb25MZW4tMSkgKyAKLQkJCQkgICAgc2l6ZW9mKGtleVN1ZmZpeCkpOwotCWlmIChrZXlCdWY9PU5VTEwpIGdvdG8gZG9uZTsKKyAgICAvKiBUcmllZCB0byB1c2Ugc3lzZ2V0KCJ3aW52ZXIiKSBidXQgaGVyZSBpcyB0b28gZWFybHkgOi0oICovCisgICAgdmVyc2lvbkxlbiA9IF90Y3NsZW4oUHlXaW5fRExMVmVyc2lvblN0cmluZyk7CisgICAgLyogU3BhY2UgZm9yIGFsbCB0aGUgY2hhcnMsIHBsdXMgb25lIFwwICovCisgICAga2V5QnVmID0ga2V5QnVmUHRyID0gbWFsbG9jKHNpemVvZihrZXlQcmVmaXgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRDSEFSKSoodmVyc2lvbkxlbi0xKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrZXlTdWZmaXgpKTsKKyAgICBpZiAoa2V5QnVmPT1OVUxMKSBnb3RvIGRvbmU7CiAKLQltZW1jcHkoa2V5QnVmUHRyLCBrZXlQcmVmaXgsIHNpemVvZihrZXlQcmVmaXgpLXNpemVvZihUQ0hBUikpOwotCWtleUJ1ZlB0ciArPSBzaXplb2Yoa2V5UHJlZml4KS9zaXplb2YoVENIQVIpIC0gMTsKLQltZW1jcHkoa2V5QnVmUHRyLCBQeVdpbl9ETExWZXJzaW9uU3RyaW5nLCB2ZXJzaW9uTGVuICogc2l6ZW9mKFRDSEFSKSk7Ci0Ja2V5QnVmUHRyICs9IHZlcnNpb25MZW47Ci0JLyogTlVMTCBjb21lcyB3aXRoIHRoaXMgb25lISAqLwotCW1lbWNweShrZXlCdWZQdHIsIGtleVN1ZmZpeCwgc2l6ZW9mKGtleVN1ZmZpeCkpOwotCS8qIE9wZW4gdGhlIHJvb3QgUHl0aG9uIGtleSAqLwotCXJjPVJlZ09wZW5LZXlFeChrZXlCYXNlLAotCSAgICAgICAgICAgICAgICBrZXlCdWYsIC8qIHN1YmtleSAqLwotCSAgICAgICAgICAgICAgICAwLCAvKiByZXNlcnZlZCAqLwotCSAgICAgICAgICAgICAgICBLRVlfUkVBRCwKLQkgICAgICAgICAgICAgICAgJm5ld0tleSk7Ci0JaWYgKHJjIT1FUlJPUl9TVUNDRVNTKSBnb3RvIGRvbmU7Ci0JLyogRmluZCBvdXQgaG93IGJpZyBvdXIgY29yZSBidWZmZXIgaXMsIGFuZCBob3cgbWFueSBzdWJrZXlzIHdlIGhhdmUgKi8KLQlyYyA9IFJlZ1F1ZXJ5SW5mb0tleShuZXdLZXksIE5VTEwsIE5VTEwsIE5VTEwsICZudW1LZXlzLCBOVUxMLCBOVUxMLCAKLQkgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgJmRhdGFTaXplLCBOVUxMLCBOVUxMKTsKLQlpZiAocmMhPUVSUk9SX1NVQ0NFU1MpIGdvdG8gZG9uZTsKLQlpZiAoc2tpcGNvcmUpIGRhdGFTaXplID0gMDsgLyogT25seSBjb3VudCBjb3JlIG9uZXMgaWYgd2Ugd2FudCB0aGVtISAqLwotCS8qIEFsbG9jYXRlIGEgdGVtcCBhcnJheSBvZiBjaGFyIGJ1ZmZlcnMsIHNvIHdlIG9ubHkgbmVlZCB0byBsb29wIAotCSAgIHJlYWRpbmcgdGhlIHJlZ2lzdHJ5IG9uY2UKLQkqLwotCXBwUGF0aHMgPSBtYWxsb2MoIHNpemVvZihUQ0hBUiAqKSAqIG51bUtleXMgKTsKLQlpZiAocHBQYXRocz09TlVMTCkgZ290byBkb25lOwotCW1lbXNldChwcFBhdGhzLCAwLCBzaXplb2YoVENIQVIgKikgKiBudW1LZXlzKTsKLQkvKiBMb29wIG92ZXIgYWxsIHN1YmtleXMsIGFsbG9jYXRpbmcgYSB0ZW1wIHN1Yi1idWZmZXIuICovCi0JZm9yKGluZGV4PTA7aW5kZXg8bnVtS2V5cztpbmRleCsrKSB7Ci0JCVRDSEFSIGtleUJ1ZltNQVhfUEFUSCsxXTsKLQkJSEtFWSBzdWJLZXkgPSAwOwotCQlEV09SRCByZXFkU2l6ZSA9IE1BWF9QQVRIKzE7Ci0JCS8qIEdldCB0aGUgc3ViLWtleSBuYW1lICovCi0JCURXT1JEIHJjID0gUmVnRW51bUtleUV4KG5ld0tleSwgaW5kZXgsIGtleUJ1ZiwgJnJlcWRTaXplLAotCQkgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7Ci0JCWlmIChyYyE9RVJST1JfU1VDQ0VTUykgZ290byBkb25lOwotCQkvKiBPcGVuIHRoZSBzdWIta2V5ICovCi0JCXJjPVJlZ09wZW5LZXlFeChuZXdLZXksCi0JCQkJCQlrZXlCdWYsIC8qIHN1YmtleSAqLwotCQkJCQkJMCwgLyogcmVzZXJ2ZWQgKi8KLQkJCQkJCUtFWV9SRUFELAotCQkJCQkJJnN1YktleSk7Ci0JCWlmIChyYyE9RVJST1JfU1VDQ0VTUykgZ290byBkb25lOwotCQkvKiBGaW5kIHRoZSB2YWx1ZSBvZiB0aGUgYnVmZmVyIHNpemUsIG1hbGxvYywgdGhlbiByZWFkIGl0ICovCi0JCVJlZ1F1ZXJ5VmFsdWVFeChzdWJLZXksIE5VTEwsIDAsIE5VTEwsIE5VTEwsICZyZXFkU2l6ZSk7Ci0JCWlmIChyZXFkU2l6ZSkgewotCQkJcHBQYXRoc1tpbmRleF0gPSBtYWxsb2MocmVxZFNpemUpOwotCQkJaWYgKHBwUGF0aHNbaW5kZXhdKSB7Ci0JCQkJUmVnUXVlcnlWYWx1ZUV4KHN1YktleSwgTlVMTCwgMCwgTlVMTCwgCi0JCQkJICAgICAgICAgICAgICAgIChMUEJZVEUpcHBQYXRoc1tpbmRleF0sIAotCQkJCSAgICAgICAgICAgICAgICAmcmVxZFNpemUpOwotCQkJCWRhdGFTaXplICs9IHJlcWRTaXplICsgMTsgLyogMSBmb3IgdGhlICI7IiAqLwotCQkJfQotCQl9Ci0JCVJlZ0Nsb3NlS2V5KHN1YktleSk7Ci0JfQorICAgIG1lbWNweShrZXlCdWZQdHIsIGtleVByZWZpeCwgc2l6ZW9mKGtleVByZWZpeCktc2l6ZW9mKFRDSEFSKSk7CisgICAga2V5QnVmUHRyICs9IHNpemVvZihrZXlQcmVmaXgpL3NpemVvZihUQ0hBUikgLSAxOworICAgIG1lbWNweShrZXlCdWZQdHIsIFB5V2luX0RMTFZlcnNpb25TdHJpbmcsIHZlcnNpb25MZW4gKiBzaXplb2YoVENIQVIpKTsKKyAgICBrZXlCdWZQdHIgKz0gdmVyc2lvbkxlbjsKKyAgICAvKiBOVUxMIGNvbWVzIHdpdGggdGhpcyBvbmUhICovCisgICAgbWVtY3B5KGtleUJ1ZlB0ciwga2V5U3VmZml4LCBzaXplb2Yoa2V5U3VmZml4KSk7CisgICAgLyogT3BlbiB0aGUgcm9vdCBQeXRob24ga2V5ICovCisgICAgcmM9UmVnT3BlbktleUV4KGtleUJhc2UsCisgICAgICAgICAgICAgICAgICAgIGtleUJ1ZiwgLyogc3Via2V5ICovCisgICAgICAgICAgICAwLCAvKiByZXNlcnZlZCAqLworICAgICAgICAgICAgS0VZX1JFQUQsCisgICAgICAgICAgICAmbmV3S2V5KTsKKyAgICBpZiAocmMhPUVSUk9SX1NVQ0NFU1MpIGdvdG8gZG9uZTsKKyAgICAvKiBGaW5kIG91dCBob3cgYmlnIG91ciBjb3JlIGJ1ZmZlciBpcywgYW5kIGhvdyBtYW55IHN1YmtleXMgd2UgaGF2ZSAqLworICAgIHJjID0gUmVnUXVlcnlJbmZvS2V5KG5ld0tleSwgTlVMTCwgTlVMTCwgTlVMTCwgJm51bUtleXMsIE5VTEwsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICZkYXRhU2l6ZSwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHJjIT1FUlJPUl9TVUNDRVNTKSBnb3RvIGRvbmU7CisgICAgaWYgKHNraXBjb3JlKSBkYXRhU2l6ZSA9IDA7IC8qIE9ubHkgY291bnQgY29yZSBvbmVzIGlmIHdlIHdhbnQgdGhlbSEgKi8KKyAgICAvKiBBbGxvY2F0ZSBhIHRlbXAgYXJyYXkgb2YgY2hhciBidWZmZXJzLCBzbyB3ZSBvbmx5IG5lZWQgdG8gbG9vcAorICAgICAgIHJlYWRpbmcgdGhlIHJlZ2lzdHJ5IG9uY2UKKyAgICAqLworICAgIHBwUGF0aHMgPSBtYWxsb2MoIHNpemVvZihUQ0hBUiAqKSAqIG51bUtleXMgKTsKKyAgICBpZiAocHBQYXRocz09TlVMTCkgZ290byBkb25lOworICAgIG1lbXNldChwcFBhdGhzLCAwLCBzaXplb2YoVENIQVIgKikgKiBudW1LZXlzKTsKKyAgICAvKiBMb29wIG92ZXIgYWxsIHN1YmtleXMsIGFsbG9jYXRpbmcgYSB0ZW1wIHN1Yi1idWZmZXIuICovCisgICAgZm9yKGluZGV4PTA7aW5kZXg8bnVtS2V5cztpbmRleCsrKSB7CisgICAgICAgIFRDSEFSIGtleUJ1ZltNQVhfUEFUSCsxXTsKKyAgICAgICAgSEtFWSBzdWJLZXkgPSAwOworICAgICAgICBEV09SRCByZXFkU2l6ZSA9IE1BWF9QQVRIKzE7CisgICAgICAgIC8qIEdldCB0aGUgc3ViLWtleSBuYW1lICovCisgICAgICAgIERXT1JEIHJjID0gUmVnRW51bUtleUV4KG5ld0tleSwgaW5kZXgsIGtleUJ1ZiwgJnJlcWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICk7CisgICAgICAgIGlmIChyYyE9RVJST1JfU1VDQ0VTUykgZ290byBkb25lOworICAgICAgICAvKiBPcGVuIHRoZSBzdWIta2V5ICovCisgICAgICAgIHJjPVJlZ09wZW5LZXlFeChuZXdLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5QnVmLCAvKiBzdWJrZXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIHJlc2VydmVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzdWJLZXkpOworICAgICAgICBpZiAocmMhPUVSUk9SX1NVQ0NFU1MpIGdvdG8gZG9uZTsKKyAgICAgICAgLyogRmluZCB0aGUgdmFsdWUgb2YgdGhlIGJ1ZmZlciBzaXplLCBtYWxsb2MsIHRoZW4gcmVhZCBpdCAqLworICAgICAgICBSZWdRdWVyeVZhbHVlRXgoc3ViS2V5LCBOVUxMLCAwLCBOVUxMLCBOVUxMLCAmcmVxZFNpemUpOworICAgICAgICBpZiAocmVxZFNpemUpIHsKKyAgICAgICAgICAgIHBwUGF0aHNbaW5kZXhdID0gbWFsbG9jKHJlcWRTaXplKTsKKyAgICAgICAgICAgIGlmIChwcFBhdGhzW2luZGV4XSkgeworICAgICAgICAgICAgICAgIFJlZ1F1ZXJ5VmFsdWVFeChzdWJLZXksIE5VTEwsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUEJZVEUpcHBQYXRoc1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXFkU2l6ZSk7CisgICAgICAgICAgICAgICAgZGF0YVNpemUgKz0gcmVxZFNpemUgKyAxOyAvKiAxIGZvciB0aGUgIjsiICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUmVnQ2xvc2VLZXkoc3ViS2V5KTsKKyAgICB9CiAKLQkvKiByZXR1cm4gbnVsbCBpZiBubyBwYXRoIHRvIHJldHVybiAqLwotCWlmIChkYXRhU2l6ZSA9PSAwKSBnb3RvIGRvbmU7CisgICAgLyogcmV0dXJuIG51bGwgaWYgbm8gcGF0aCB0byByZXR1cm4gKi8KKyAgICBpZiAoZGF0YVNpemUgPT0gMCkgZ290byBkb25lOwogCi0JLyogb3JpZ2luYWwgZGF0YXNpemUgZnJvbSBSZWdRdWVyeUluZm8gZG9lc24ndCBpbmNsdWRlIHRoZSBcMCAqLwotCWRhdGFCdWYgPSBtYWxsb2MoKGRhdGFTaXplKzEpICogc2l6ZW9mKFRDSEFSKSk7Ci0JaWYgKGRhdGFCdWYpIHsKLQkJVENIQVIgKnN6Q3VyID0gZGF0YUJ1ZjsKLQkJRFdPUkQgcmVxZFNpemUgPSBkYXRhU2l6ZTsKLQkJLyogQ29weSBvdXIgY29sbGVjdGVkIHN0cmluZ3MgKi8KLQkJZm9yIChpbmRleD0wO2luZGV4PG51bUtleXM7aW5kZXgrKykgewotCQkJaWYgKGluZGV4ID4gMCkgewotCQkJCSooc3pDdXIrKykgPSBfVCgnOycpOwotCQkJCWRhdGFTaXplLS07Ci0JCQl9Ci0JCQlpZiAocHBQYXRoc1tpbmRleF0pIHsKLQkJCQlQeV9zc2l6ZV90IGxlbiA9IF90Y3NsZW4ocHBQYXRoc1tpbmRleF0pOwotCQkJCV90Y3NuY3B5KHN6Q3VyLCBwcFBhdGhzW2luZGV4XSwgbGVuKTsKLQkJCQlzekN1ciArPSBsZW47Ci0JCQkJYXNzZXJ0KGRhdGFTaXplID4gKERXT1JEKWxlbik7Ci0JCQkJZGF0YVNpemUgLT0gKERXT1JEKWxlbjsKLQkJCX0KLQkJfQotCQlpZiAoc2tpcGNvcmUpCi0JCQkqc3pDdXIgPSAnXDAnOwotCQllbHNlIHsKLQkJCS8qIElmIHdlIGhhdmUgbm8gdmFsdWVzLCB3ZSBkb250IG5lZWQgYSAnOycgKi8KLQkJCWlmIChudW1LZXlzKSB7Ci0JCQkJKihzekN1cisrKSA9IF9UKCc7Jyk7Ci0JCQkJZGF0YVNpemUtLTsKLQkJCX0KLQkJCS8qIE5vdyBhcHBlbmQgdGhlIGNvcmUgcGF0aCBlbnRyaWVzIC0gCi0JCQkgICB0aGlzIHdpbGwgaW5jbHVkZSB0aGUgTlVMTCAKLQkJCSovCi0JCQlyYyA9IFJlZ1F1ZXJ5VmFsdWVFeChuZXdLZXksIE5VTEwsIDAsIE5VTEwsIAotCQkJICAgICAgICAgICAgICAgICAgICAgKExQQllURSlzekN1ciwgJmRhdGFTaXplKTsKLQkJfQotCQkvKiBBbmQgc2V0IHRoZSByZXN1bHQgLSBjYWxsZXIgbXVzdCBmcmVlIAotCQkgICBJZiBNQkNTLCBpdCBpcyBmaW5lIGFzIGlzLiAgSWYgVW5pY29kZSwgYWxsb2NhdGUgbmV3Ci0JCSAgIGJ1ZmZlciBhbmQgY29udmVydC4KLQkJKi8KKyAgICAvKiBvcmlnaW5hbCBkYXRhc2l6ZSBmcm9tIFJlZ1F1ZXJ5SW5mbyBkb2Vzbid0IGluY2x1ZGUgdGhlIFwwICovCisgICAgZGF0YUJ1ZiA9IG1hbGxvYygoZGF0YVNpemUrMSkgKiBzaXplb2YoVENIQVIpKTsKKyAgICBpZiAoZGF0YUJ1ZikgeworICAgICAgICBUQ0hBUiAqc3pDdXIgPSBkYXRhQnVmOworICAgICAgICBEV09SRCByZXFkU2l6ZSA9IGRhdGFTaXplOworICAgICAgICAvKiBDb3B5IG91ciBjb2xsZWN0ZWQgc3RyaW5ncyAqLworICAgICAgICBmb3IgKGluZGV4PTA7aW5kZXg8bnVtS2V5cztpbmRleCsrKSB7CisgICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7CisgICAgICAgICAgICAgICAgKihzekN1cisrKSA9IF9UKCc7Jyk7CisgICAgICAgICAgICAgICAgZGF0YVNpemUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcFBhdGhzW2luZGV4XSkgeworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuID0gX3Rjc2xlbihwcFBhdGhzW2luZGV4XSk7CisgICAgICAgICAgICAgICAgX3Rjc25jcHkoc3pDdXIsIHBwUGF0aHNbaW5kZXhdLCBsZW4pOworICAgICAgICAgICAgICAgIHN6Q3VyICs9IGxlbjsKKyAgICAgICAgICAgICAgICBhc3NlcnQoZGF0YVNpemUgPiAoRFdPUkQpbGVuKTsKKyAgICAgICAgICAgICAgICBkYXRhU2l6ZSAtPSAoRFdPUkQpbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChza2lwY29yZSkKKyAgICAgICAgICAgICpzekN1ciA9ICdcMCc7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogSWYgd2UgaGF2ZSBubyB2YWx1ZXMsIHdlIGRvbnQgbmVlZCBhICc7JyAqLworICAgICAgICAgICAgaWYgKG51bUtleXMpIHsKKyAgICAgICAgICAgICAgICAqKHN6Q3VyKyspID0gX1QoJzsnKTsKKyAgICAgICAgICAgICAgICBkYXRhU2l6ZS0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogTm93IGFwcGVuZCB0aGUgY29yZSBwYXRoIGVudHJpZXMgLQorICAgICAgICAgICAgICAgdGhpcyB3aWxsIGluY2x1ZGUgdGhlIE5VTEwKKyAgICAgICAgICAgICovCisgICAgICAgICAgICByYyA9IFJlZ1F1ZXJ5VmFsdWVFeChuZXdLZXksIE5VTEwsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBCWVRFKXN6Q3VyLCAmZGF0YVNpemUpOworICAgICAgICB9CisgICAgICAgIC8qIEFuZCBzZXQgdGhlIHJlc3VsdCAtIGNhbGxlciBtdXN0IGZyZWUKKyAgICAgICAgICAgSWYgTUJDUywgaXQgaXMgZmluZSBhcyBpcy4gIElmIFVuaWNvZGUsIGFsbG9jYXRlIG5ldworICAgICAgICAgICBidWZmZXIgYW5kIGNvbnZlcnQuCisgICAgICAgICovCiAjaWZkZWYgVU5JQ09ERQotCQlyZXR2YWwgPSAoY2hhciAqKW1hbGxvYyhyZXFkU2l6ZSsxKTsKLQkJaWYgKHJldHZhbCkKLQkJCVdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCAKLQkJCQkJZGF0YUJ1ZiwgLTEsIC8qIHNvdXJjZSAqLyAKLQkJCQkJcmV0dmFsLCByZXFkU2l6ZSsxLCAvKiBkZXN0ICovCi0JCQkJCU5VTEwsIE5VTEwpOwotCQlmcmVlKGRhdGFCdWYpOworICAgICAgICByZXR2YWwgPSAoY2hhciAqKW1hbGxvYyhyZXFkU2l6ZSsxKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFCdWYsIC0xLCAvKiBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsLCByZXFkU2l6ZSsxLCAvKiBkZXN0ICovCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgICAgICBmcmVlKGRhdGFCdWYpOwogI2Vsc2UKLQkJcmV0dmFsID0gZGF0YUJ1ZjsKKyAgICAgICAgcmV0dmFsID0gZGF0YUJ1ZjsKICNlbmRpZgotCX0KKyAgICB9CiBkb25lOgotCS8qIExvb3AgZnJlZWluZyBteSB0ZW1wIGJ1ZmZlcnMgKi8KLQlpZiAocHBQYXRocykgewotCQlmb3IoaW5kZXg9MDtpbmRleDxudW1LZXlzO2luZGV4KyspCi0JCQlpZiAocHBQYXRoc1tpbmRleF0pIGZyZWUocHBQYXRoc1tpbmRleF0pOwotCQlmcmVlKHBwUGF0aHMpOwotCX0KLQlpZiAobmV3S2V5KQotCQlSZWdDbG9zZUtleShuZXdLZXkpOwotCWlmIChrZXlCdWYpCi0JCWZyZWUoa2V5QnVmKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIC8qIExvb3AgZnJlZWluZyBteSB0ZW1wIGJ1ZmZlcnMgKi8KKyAgICBpZiAocHBQYXRocykgeworICAgICAgICBmb3IoaW5kZXg9MDtpbmRleDxudW1LZXlzO2luZGV4KyspCisgICAgICAgICAgICBpZiAocHBQYXRoc1tpbmRleF0pIGZyZWUocHBQYXRoc1tpbmRleF0pOworICAgICAgICBmcmVlKHBwUGF0aHMpOworICAgIH0KKyAgICBpZiAobmV3S2V5KQorICAgICAgICBSZWdDbG9zZUtleShuZXdLZXkpOworICAgIGlmIChrZXlCdWYpCisgICAgICAgIGZyZWUoa2V5QnVmKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogI2VuZGlmIC8qIFB5X0VOQUJMRV9TSEFSRUQgKi8KICNlbmRpZiAvKiBNU19XSU5ET1dTICovCkBAIC0zNzAsMzE0ICszNzAsMzE0IEBACiBzdGF0aWMgdm9pZAogZ2V0X3Byb2dwYXRoKHZvaWQpCiB7Ci0JZXh0ZXJuIGNoYXIgKlB5X0dldFByb2dyYW1OYW1lKHZvaWQpOwotCWNoYXIgKnBhdGggPSBnZXRlbnYoIlBBVEgiKTsKLQljaGFyICpwcm9nID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKKyAgICBleHRlcm4gY2hhciAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CisgICAgY2hhciAqcGF0aCA9IGdldGVudigiUEFUSCIpOworICAgIGNoYXIgKnByb2cgPSBQeV9HZXRQcm9ncmFtTmFtZSgpOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCWV4dGVybiBIQU5ETEUgUHlXaW5fRExMaE1vZHVsZTsKKyAgICBleHRlcm4gSEFORExFIFB5V2luX0RMTGhNb2R1bGU7CiAjaWZkZWYgVU5JQ09ERQotCVdDSEFSIHdwcm9ncGF0aFtNQVhQQVRITEVOKzFdOwotCS8qIFdpbmRvd3MgZG9jdW1lbnRzIHRoYXQgR2V0TW9kdWxlRmlsZU5hbWUoKSB3aWxsICJ0cnVuY2F0ZSIsCi0JICAgYnV0IG1ha2VzIG5vIG1lbnRpb24gb2YgdGhlIG51bGwgdGVybWluYXRvci4gIFBsYXkgaXQgc2FmZS4KLQkgICBQTFVTIFdpbmRvd3MgaXRzZWxmIGRlZmluZXMgTUFYX1BBVEggYXMgdGhlIHNhbWUsIGJ1dCBhbnl3YXkuLi4KLQkqLworICAgIFdDSEFSIHdwcm9ncGF0aFtNQVhQQVRITEVOKzFdOworICAgIC8qIFdpbmRvd3MgZG9jdW1lbnRzIHRoYXQgR2V0TW9kdWxlRmlsZU5hbWUoKSB3aWxsICJ0cnVuY2F0ZSIsCisgICAgICAgYnV0IG1ha2VzIG5vIG1lbnRpb24gb2YgdGhlIG51bGwgdGVybWluYXRvci4gIFBsYXkgaXQgc2FmZS4KKyAgICAgICBQTFVTIFdpbmRvd3MgaXRzZWxmIGRlZmluZXMgTUFYX1BBVEggYXMgdGhlIHNhbWUsIGJ1dCBhbnl3YXkuLi4KKyAgICAqLwogI2lmZGVmIFB5X0VOQUJMRV9TSEFSRUQKLQl3cHJvZ3BhdGhbTUFYUEFUSExFTl09X1QoJ1wwJyk7Ci0JaWYgKFB5V2luX0RMTGhNb2R1bGUgJiYKLQkgICAgR2V0TW9kdWxlRmlsZU5hbWUoUHlXaW5fRExMaE1vZHVsZSwgd3Byb2dwYXRoLCBNQVhQQVRITEVOKSkgewotCQlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgCi0JCSAgICAgICAgICAgICAgICAgICAgd3Byb2dwYXRoLCAtMSwgCi0JCSAgICAgICAgICAgICAgICAgICAgZGxscGF0aCwgTUFYUEFUSExFTisxLCAKLQkJICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKLQl9CisgICAgd3Byb2dwYXRoW01BWFBBVEhMRU5dPV9UKCdcMCcpOworICAgIGlmIChQeVdpbl9ETExoTW9kdWxlICYmCisgICAgICAgIEdldE1vZHVsZUZpbGVOYW1lKFB5V2luX0RMTGhNb2R1bGUsIHdwcm9ncGF0aCwgTUFYUEFUSExFTikpIHsKKyAgICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3Byb2dwYXRoLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGxwYXRoLCBNQVhQQVRITEVOKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CisgICAgfQogI2Vsc2UKLQlkbGxwYXRoWzBdID0gMDsKKyAgICBkbGxwYXRoWzBdID0gMDsKICNlbmRpZgotCXdwcm9ncGF0aFtNQVhQQVRITEVOXT1fVCgnXDAnKTsKLQlpZiAoR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgd3Byb2dwYXRoLCBNQVhQQVRITEVOKSkgewotCQlXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgCi0JCSAgICAgICAgICAgICAgICAgICAgd3Byb2dwYXRoLCAtMSwgCi0JCSAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIE1BWFBBVEhMRU4rMSwgCi0JCSAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7Ci0JCXJldHVybjsKLQl9CisgICAgd3Byb2dwYXRoW01BWFBBVEhMRU5dPV9UKCdcMCcpOworICAgIGlmIChHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCB3cHJvZ3BhdGgsIE1BWFBBVEhMRU4pKSB7CisgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdwcm9ncGF0aCwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3BhdGgsIE1BWFBBVEhMRU4rMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICNlbHNlCi0JLyogc3RhdGljIGluaXQgb2YgcHJvZ3BhdGggZW5zdXJlcyBmaW5hbCBjaGFyIHJlbWFpbnMgXDAgKi8KKyAgICAvKiBzdGF0aWMgaW5pdCBvZiBwcm9ncGF0aCBlbnN1cmVzIGZpbmFsIGNoYXIgcmVtYWlucyBcMCAqLwogI2lmZGVmIFB5X0VOQUJMRV9TSEFSRUQKLQlpZiAoUHlXaW5fRExMaE1vZHVsZSkKLQkJaWYgKCFHZXRNb2R1bGVGaWxlTmFtZShQeVdpbl9ETExoTW9kdWxlLCBkbGxwYXRoLCBNQVhQQVRITEVOKSkKLQkJCWRsbHBhdGhbMF0gPSAwOworICAgIGlmIChQeVdpbl9ETExoTW9kdWxlKQorICAgICAgICBpZiAoIUdldE1vZHVsZUZpbGVOYW1lKFB5V2luX0RMTGhNb2R1bGUsIGRsbHBhdGgsIE1BWFBBVEhMRU4pKQorICAgICAgICAgICAgZGxscGF0aFswXSA9IDA7CiAjZWxzZQotCWRsbHBhdGhbMF0gPSAwOworICAgIGRsbHBhdGhbMF0gPSAwOwogI2VuZGlmCi0JaWYgKEdldE1vZHVsZUZpbGVOYW1lKE5VTEwsIHByb2dwYXRoLCBNQVhQQVRITEVOKSkKLQkJcmV0dXJuOworICAgIGlmIChHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBwcm9ncGF0aCwgTUFYUEFUSExFTikpCisgICAgICAgIHJldHVybjsKICNlbmRpZgogI2VuZGlmCi0JaWYgKHByb2cgPT0gTlVMTCB8fCAqcHJvZyA9PSAnXDAnKQotCQlwcm9nID0gInB5dGhvbiI7CisgICAgaWYgKHByb2cgPT0gTlVMTCB8fCAqcHJvZyA9PSAnXDAnKQorICAgICAgICBwcm9nID0gInB5dGhvbiI7CiAKLQkvKiBJZiB0aGVyZSBpcyBubyBzbGFzaCBpbiB0aGUgYXJndjAgcGF0aCwgdGhlbiB3ZSBoYXZlIHRvCi0JICogYXNzdW1lIHB5dGhvbiBpcyBvbiB0aGUgdXNlcidzICRQQVRILCBzaW5jZSB0aGVyZSdzIG5vCi0JICogb3RoZXIgd2F5IHRvIGZpbmQgYSBkaXJlY3RvcnkgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLiAgSWYKLQkgKiAkUEFUSCBpc24ndCBleHBvcnRlZCwgeW91IGxvc2UuCi0JICovCisgICAgLyogSWYgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIGFyZ3YwIHBhdGgsIHRoZW4gd2UgaGF2ZSB0bworICAgICAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubworICAgICAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCisgICAgICogJFBBVEggaXNuJ3QgZXhwb3J0ZWQsIHlvdSBsb3NlLgorICAgICAqLwogI2lmZGVmIEFMVFNFUAotCWlmIChzdHJjaHIocHJvZywgU0VQKSB8fCBzdHJjaHIocHJvZywgQUxUU0VQKSkKKyAgICBpZiAoc3RyY2hyKHByb2csIFNFUCkgfHwgc3RyY2hyKHByb2csIEFMVFNFUCkpCiAjZWxzZQotCWlmIChzdHJjaHIocHJvZywgU0VQKSkKKyAgICBpZiAoc3RyY2hyKHByb2csIFNFUCkpCiAjZW5kaWYKLQkJc3RybmNweShwcm9ncGF0aCwgcHJvZywgTUFYUEFUSExFTik7Ci0JZWxzZSBpZiAocGF0aCkgewotCQl3aGlsZSAoMSkgewotCQkJY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOworICAgICAgICBzdHJuY3B5KHByb2dwYXRoLCBwcm9nLCBNQVhQQVRITEVOKTsKKyAgICBlbHNlIGlmIChwYXRoKSB7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBjaGFyICpkZWxpbSA9IHN0cmNocihwYXRoLCBERUxJTSk7CiAKLQkJCWlmIChkZWxpbSkgewotCQkJCXNpemVfdCBsZW4gPSBkZWxpbSAtIHBhdGg7Ci0JCQkJLyogZW5zdXJlIHdlIGNhbid0IG92ZXJ3cml0ZSBidWZmZXIgKi8KLQkJCQlsZW4gPSBtaW4oTUFYUEFUSExFTixsZW4pOwotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIGxlbik7Ci0JCQkJKihwcm9ncGF0aCArIGxlbikgPSAnXDAnOwotCQkJfQotCQkJZWxzZQotCQkJCXN0cm5jcHkocHJvZ3BhdGgsIHBhdGgsIE1BWFBBVEhMRU4pOworICAgICAgICAgICAgaWYgKGRlbGltKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiA9IGRlbGltIC0gcGF0aDsKKyAgICAgICAgICAgICAgICAvKiBlbnN1cmUgd2UgY2FuJ3Qgb3ZlcndyaXRlIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIGxlbiA9IG1pbihNQVhQQVRITEVOLGxlbik7CisgICAgICAgICAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcGF0aCwgbGVuKTsKKyAgICAgICAgICAgICAgICAqKHByb2dwYXRoICsgbGVuKSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcGF0aCwgTUFYUEFUSExFTik7CiAKLQkJCS8qIGpvaW4oKSBpcyBzYWZlIGZvciBNQVhQQVRITEVOKzEgc2l6ZSBidWZmZXIgKi8KLQkJCWpvaW4ocHJvZ3BhdGgsIHByb2cpOwotCQkJaWYgKGV4aXN0cyhwcm9ncGF0aCkpCi0JCQkJYnJlYWs7CisgICAgICAgICAgICAvKiBqb2luKCkgaXMgc2FmZSBmb3IgTUFYUEFUSExFTisxIHNpemUgYnVmZmVyICovCisgICAgICAgICAgICBqb2luKHByb2dwYXRoLCBwcm9nKTsKKyAgICAgICAgICAgIGlmIChleGlzdHMocHJvZ3BhdGgpKQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQlpZiAoIWRlbGltKSB7Ci0JCQkJcHJvZ3BhdGhbMF0gPSAnXDAnOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcGF0aCA9IGRlbGltICsgMTsKLQkJfQotCX0KLQllbHNlCi0JCXByb2dwYXRoWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIGlmICghZGVsaW0pIHsKKyAgICAgICAgICAgICAgICBwcm9ncGF0aFswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRoID0gZGVsaW0gKyAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJvZ3BhdGhbMF0gPSAnXDAnOwogfQogCiBzdGF0aWMgdm9pZAogY2FsY3VsYXRlX3BhdGgodm9pZCkKIHsKLQljaGFyIGFyZ3YwX3BhdGhbTUFYUEFUSExFTisxXTsKLQljaGFyICpidWY7Ci0Jc2l6ZV90IGJ1ZnN6OwotCWNoYXIgKnB5dGhvbmhvbWUgPSBQeV9HZXRQeXRob25Ib21lKCk7Ci0JY2hhciAqZW52cGF0aCA9IFB5X0dFVEVOVigiUFlUSE9OUEFUSCIpOworICAgIGNoYXIgYXJndjBfcGF0aFtNQVhQQVRITEVOKzFdOworICAgIGNoYXIgKmJ1ZjsKKyAgICBzaXplX3QgYnVmc3o7CisgICAgY2hhciAqcHl0aG9uaG9tZSA9IFB5X0dldFB5dGhvbkhvbWUoKTsKKyAgICBjaGFyICplbnZwYXRoID0gUHlfR0VURU5WKCJQWVRIT05QQVRIIik7CiAKICNpZmRlZiBNU19XSU5ET1dTCi0JaW50IHNraXBob21lLCBza2lwZGVmYXVsdDsKLQljaGFyICptYWNoaW5lcGF0aCA9IE5VTEw7Ci0JY2hhciAqdXNlcnBhdGggPSBOVUxMOwotCWNoYXIgemlwX3BhdGhbTUFYUEFUSExFTisxXTsKLQlzaXplX3QgbGVuOworICAgIGludCBza2lwaG9tZSwgc2tpcGRlZmF1bHQ7CisgICAgY2hhciAqbWFjaGluZXBhdGggPSBOVUxMOworICAgIGNoYXIgKnVzZXJwYXRoID0gTlVMTDsKKyAgICBjaGFyIHppcF9wYXRoW01BWFBBVEhMRU4rMV07CisgICAgc2l6ZV90IGxlbjsKICNlbmRpZgogCi0JZ2V0X3Byb2dwYXRoKCk7Ci0JLyogcHJvZ3BhdGggZ3VhcmFudGVlZCBcMCB0ZXJtaW5hdGVkIGluIE1BWFBBVEgrMSBieXRlcy4gKi8KLQlzdHJjcHkoYXJndjBfcGF0aCwgcHJvZ3BhdGgpOwotCXJlZHVjZShhcmd2MF9wYXRoKTsKLQlpZiAocHl0aG9uaG9tZSA9PSBOVUxMIHx8ICpweXRob25ob21lID09ICdcMCcpIHsKLQkJaWYgKHNlYXJjaF9mb3JfcHJlZml4KGFyZ3YwX3BhdGgsIExBTkRNQVJLKSkKLQkJCXB5dGhvbmhvbWUgPSBwcmVmaXg7Ci0JCWVsc2UKLQkJCXB5dGhvbmhvbWUgPSBOVUxMOwotCX0KLQllbHNlCi0JCXN0cm5jcHkocHJlZml4LCBweXRob25ob21lLCBNQVhQQVRITEVOKTsKKyAgICBnZXRfcHJvZ3BhdGgoKTsKKyAgICAvKiBwcm9ncGF0aCBndWFyYW50ZWVkIFwwIHRlcm1pbmF0ZWQgaW4gTUFYUEFUSCsxIGJ5dGVzLiAqLworICAgIHN0cmNweShhcmd2MF9wYXRoLCBwcm9ncGF0aCk7CisgICAgcmVkdWNlKGFyZ3YwX3BhdGgpOworICAgIGlmIChweXRob25ob21lID09IE5VTEwgfHwgKnB5dGhvbmhvbWUgPT0gJ1wwJykgeworICAgICAgICBpZiAoc2VhcmNoX2Zvcl9wcmVmaXgoYXJndjBfcGF0aCwgTEFORE1BUkspKQorICAgICAgICAgICAgcHl0aG9uaG9tZSA9IHByZWZpeDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHl0aG9uaG9tZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3RybmNweShwcmVmaXgsIHB5dGhvbmhvbWUsIE1BWFBBVEhMRU4pOwogCi0JaWYgKGVudnBhdGggJiYgKmVudnBhdGggPT0gJ1wwJykKLQkJZW52cGF0aCA9IE5VTEw7CisgICAgaWYgKGVudnBhdGggJiYgKmVudnBhdGggPT0gJ1wwJykKKyAgICAgICAgZW52cGF0aCA9IE5VTEw7CiAKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQkvKiBDYWxjdWxhdGUgemlwIGFyY2hpdmUgcGF0aCAqLwotCWlmIChkbGxwYXRoWzBdKQkJLyogdXNlIG5hbWUgb2YgcHl0aG9uIERMTCAqLwotCQlzdHJuY3B5KHppcF9wYXRoLCBkbGxwYXRoLCBNQVhQQVRITEVOKTsKLQllbHNlCQkJLyogdXNlIG5hbWUgb2YgZXhlY3V0YWJsZSBwcm9ncmFtICovCi0JCXN0cm5jcHkoemlwX3BhdGgsIHByb2dwYXRoLCBNQVhQQVRITEVOKTsKLQl6aXBfcGF0aFtNQVhQQVRITEVOXSA9ICdcMCc7Ci0JbGVuID0gc3RybGVuKHppcF9wYXRoKTsKLQlpZiAobGVuID4gNCkgewotCQl6aXBfcGF0aFtsZW4tM10gPSAneic7CS8qIGNoYW5nZSBlbmRpbmcgdG8gInppcCIgKi8KLQkJemlwX3BhdGhbbGVuLTJdID0gJ2knOwotCQl6aXBfcGF0aFtsZW4tMV0gPSAncCc7Ci0JfQotCWVsc2UgewotCQl6aXBfcGF0aFswXSA9IDA7Ci0JfQotIAotCXNraXBob21lID0gcHl0aG9uaG9tZT09TlVMTCA/IDAgOiAxOworICAgIC8qIENhbGN1bGF0ZSB6aXAgYXJjaGl2ZSBwYXRoICovCisgICAgaWYgKGRsbHBhdGhbMF0pICAgICAgICAgICAgIC8qIHVzZSBuYW1lIG9mIHB5dGhvbiBETEwgKi8KKyAgICAgICAgc3RybmNweSh6aXBfcGF0aCwgZGxscGF0aCwgTUFYUEFUSExFTik7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBuYW1lIG9mIGV4ZWN1dGFibGUgcHJvZ3JhbSAqLworICAgICAgICBzdHJuY3B5KHppcF9wYXRoLCBwcm9ncGF0aCwgTUFYUEFUSExFTik7CisgICAgemlwX3BhdGhbTUFYUEFUSExFTl0gPSAnXDAnOworICAgIGxlbiA9IHN0cmxlbih6aXBfcGF0aCk7CisgICAgaWYgKGxlbiA+IDQpIHsKKyAgICAgICAgemlwX3BhdGhbbGVuLTNdID0gJ3onOyAgICAgICAgICAvKiBjaGFuZ2UgZW5kaW5nIHRvICJ6aXAiICovCisgICAgICAgIHppcF9wYXRoW2xlbi0yXSA9ICdpJzsKKyAgICAgICAgemlwX3BhdGhbbGVuLTFdID0gJ3AnOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgemlwX3BhdGhbMF0gPSAwOworICAgIH0KKworICAgIHNraXBob21lID0gcHl0aG9uaG9tZT09TlVMTCA/IDAgOiAxOwogI2lmZGVmIFB5X0VOQUJMRV9TSEFSRUQKLQltYWNoaW5lcGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9MT0NBTF9NQUNISU5FLCBza2lwaG9tZSk7Ci0JdXNlcnBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfQ1VSUkVOVF9VU0VSLCBza2lwaG9tZSk7CisgICAgbWFjaGluZXBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfTE9DQUxfTUFDSElORSwgc2tpcGhvbWUpOworICAgIHVzZXJwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0NVUlJFTlRfVVNFUiwgc2tpcGhvbWUpOwogI2VuZGlmCi0JLyogV2Ugb25seSB1c2UgdGhlIGRlZmF1bHQgcmVsYXRpdmUgUFlUSE9OUEFUSCBpZiB3ZSBoYXZlbnQKLQkgICBhbnl0aGluZyBiZXR0ZXIgdG8gdXNlISAqLwotCXNraXBkZWZhdWx0ID0gZW52cGF0aCE9TlVMTCB8fCBweXRob25ob21lIT1OVUxMIHx8IFwKLQkJICAgICAgbWFjaGluZXBhdGghPU5VTEwgfHwgdXNlcnBhdGghPU5VTEw7CisgICAgLyogV2Ugb25seSB1c2UgdGhlIGRlZmF1bHQgcmVsYXRpdmUgUFlUSE9OUEFUSCBpZiB3ZSBoYXZlbnQKKyAgICAgICBhbnl0aGluZyBiZXR0ZXIgdG8gdXNlISAqLworICAgIHNraXBkZWZhdWx0ID0gZW52cGF0aCE9TlVMTCB8fCBweXRob25ob21lIT1OVUxMIHx8IFwKKyAgICAgICAgICAgICAgICAgIG1hY2hpbmVwYXRoIT1OVUxMIHx8IHVzZXJwYXRoIT1OVUxMOwogI2VuZGlmCiAKLQkvKiBXZSBuZWVkIHRvIGNvbnN0cnVjdCBhIHBhdGggZnJvbSB0aGUgZm9sbG93aW5nIHBhcnRzLgotCSAgICgxKSB0aGUgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0OwotCSAgICgyKSBmb3IgV2luMzIsIHRoZSB6aXAgYXJjaGl2ZSBmaWxlIHBhdGg7Ci0JICAgKDMpIGZvciBXaW4zMiwgdGhlIG1hY2hpbmVwYXRoIGFuZCB1c2VycGF0aCwgaWYgc2V0OwotCSAgICg0KSB0aGUgUFlUSE9OUEFUSCBjb25maWcgbWFjcm8sIHdpdGggdGhlIGxlYWRpbmcgIi4iCi0JICAgICAgIG9mIGVhY2ggY29tcG9uZW50IHJlcGxhY2VkIHdpdGggcHl0aG9uaG9tZSwgaWYgc2V0OwotCSAgICg1KSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGV4ZWN1dGFibGUgKGFyZ3YwX3BhdGgpLgotCSAgIFRoZSBsZW5ndGggY2FsY3VsYXRpb24gY2FsY3VsYXRlcyAjNCBmaXJzdC4KLQkgICBFeHRyYSBydWxlczoKLQkgICAtIElmIFBZVEhPTkhPTUUgaXMgc2V0IChpbiBhbnkgd2F5KSBpdGVtICgzKSBpcyBpZ25vcmVkLgotCSAgIC0gSWYgcmVnaXN0cnkgdmFsdWVzIGFyZSB1c2VkLCAoNCkgYW5kICg1KSBhcmUgaWdub3JlZC4KLQkqLworICAgIC8qIFdlIG5lZWQgdG8gY29uc3RydWN0IGEgcGF0aCBmcm9tIHRoZSBmb2xsb3dpbmcgcGFydHMuCisgICAgICAgKDEpIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiBzZXQ7CisgICAgICAgKDIpIGZvciBXaW4zMiwgdGhlIHppcCBhcmNoaXZlIGZpbGUgcGF0aDsKKyAgICAgICAoMykgZm9yIFdpbjMyLCB0aGUgbWFjaGluZXBhdGggYW5kIHVzZXJwYXRoLCBpZiBzZXQ7CisgICAgICAgKDQpIHRoZSBQWVRIT05QQVRIIGNvbmZpZyBtYWNybywgd2l0aCB0aGUgbGVhZGluZyAiLiIKKyAgICAgICAgICAgb2YgZWFjaCBjb21wb25lbnQgcmVwbGFjZWQgd2l0aCBweXRob25ob21lLCBpZiBzZXQ7CisgICAgICAgKDUpIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZXhlY3V0YWJsZSAoYXJndjBfcGF0aCkuCisgICAgICAgVGhlIGxlbmd0aCBjYWxjdWxhdGlvbiBjYWxjdWxhdGVzICM0IGZpcnN0LgorICAgICAgIEV4dHJhIHJ1bGVzOgorICAgICAgIC0gSWYgUFlUSE9OSE9NRSBpcyBzZXQgKGluIGFueSB3YXkpIGl0ZW0gKDMpIGlzIGlnbm9yZWQuCisgICAgICAgLSBJZiByZWdpc3RyeSB2YWx1ZXMgYXJlIHVzZWQsICg0KSBhbmQgKDUpIGFyZSBpZ25vcmVkLgorICAgICovCiAKLQkvKiBDYWxjdWxhdGUgc2l6ZSBvZiByZXR1cm4gYnVmZmVyICovCi0JaWYgKHB5dGhvbmhvbWUgIT0gTlVMTCkgewotCQljaGFyICpwOwotCQlidWZzeiA9IDE7CQotCQlmb3IgKHAgPSBQWVRIT05QQVRIOyAqcDsgcCsrKSB7Ci0JCQlpZiAoKnAgPT0gREVMSU0pCi0JCQkJYnVmc3orKzsgLyogbnVtYmVyIG9mIERFTElNIHBsdXMgb25lICovCi0JCX0KLQkJYnVmc3ogKj0gc3RybGVuKHB5dGhvbmhvbWUpOwotCX0KLQllbHNlCi0JCWJ1ZnN6ID0gMDsKLQlidWZzeiArPSBzdHJsZW4oUFlUSE9OUEFUSCkgKyAxOwotCWJ1ZnN6ICs9IHN0cmxlbihhcmd2MF9wYXRoKSArIDE7CisgICAgLyogQ2FsY3VsYXRlIHNpemUgb2YgcmV0dXJuIGJ1ZmZlciAqLworICAgIGlmIChweXRob25ob21lICE9IE5VTEwpIHsKKyAgICAgICAgY2hhciAqcDsKKyAgICAgICAgYnVmc3ogPSAxOworICAgICAgICBmb3IgKHAgPSBQWVRIT05QQVRIOyAqcDsgcCsrKSB7CisgICAgICAgICAgICBpZiAoKnAgPT0gREVMSU0pCisgICAgICAgICAgICAgICAgYnVmc3orKzsgLyogbnVtYmVyIG9mIERFTElNIHBsdXMgb25lICovCisgICAgICAgIH0KKyAgICAgICAgYnVmc3ogKj0gc3RybGVuKHB5dGhvbmhvbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGJ1ZnN6ID0gMDsKKyAgICBidWZzeiArPSBzdHJsZW4oUFlUSE9OUEFUSCkgKyAxOworICAgIGJ1ZnN6ICs9IHN0cmxlbihhcmd2MF9wYXRoKSArIDE7CiAjaWZkZWYgTVNfV0lORE9XUwotCWlmICh1c2VycGF0aCkKLQkJYnVmc3ogKz0gc3RybGVuKHVzZXJwYXRoKSArIDE7Ci0JaWYgKG1hY2hpbmVwYXRoKQotCQlidWZzeiArPSBzdHJsZW4obWFjaGluZXBhdGgpICsgMTsKLQlidWZzeiArPSBzdHJsZW4oemlwX3BhdGgpICsgMTsKKyAgICBpZiAodXNlcnBhdGgpCisgICAgICAgIGJ1ZnN6ICs9IHN0cmxlbih1c2VycGF0aCkgKyAxOworICAgIGlmIChtYWNoaW5lcGF0aCkKKyAgICAgICAgYnVmc3ogKz0gc3RybGVuKG1hY2hpbmVwYXRoKSArIDE7CisgICAgYnVmc3ogKz0gc3RybGVuKHppcF9wYXRoKSArIDE7CiAjZW5kaWYKLQlpZiAoZW52cGF0aCAhPSBOVUxMKQotCQlidWZzeiArPSBzdHJsZW4oZW52cGF0aCkgKyAxOworICAgIGlmIChlbnZwYXRoICE9IE5VTEwpCisgICAgICAgIGJ1ZnN6ICs9IHN0cmxlbihlbnZwYXRoKSArIDE7CiAKLQltb2R1bGVfc2VhcmNoX3BhdGggPSBidWYgPSBtYWxsb2MoYnVmc3opOwotCWlmIChidWYgPT0gTlVMTCkgewotCQkvKiBXZSBjYW4ndCBleGl0LCBzbyBwcmludCBhIHdhcm5pbmcgYW5kIGxpbXAgYWxvbmcgKi8KLQkJZnByaW50ZihzdGRlcnIsICJDYW4ndCBtYWxsb2MgZHluYW1pYyBQWVRIT05QQVRILlxuIik7Ci0JCWlmIChlbnZwYXRoKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGVudmlyb25tZW50ICRQWVRIT05QQVRILlxuIik7Ci0JCQltb2R1bGVfc2VhcmNoX3BhdGggPSBlbnZwYXRoOwotCQl9Ci0JCWVsc2UgewotCQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBkZWZhdWx0IHN0YXRpYyBwYXRoLlxuIik7Ci0JCQltb2R1bGVfc2VhcmNoX3BhdGggPSBQWVRIT05QQVRIOwotCQl9CisgICAgbW9kdWxlX3NlYXJjaF9wYXRoID0gYnVmID0gbWFsbG9jKGJ1ZnN6KTsKKyAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgLyogV2UgY2FuJ3QgZXhpdCwgc28gcHJpbnQgYSB3YXJuaW5nIGFuZCBsaW1wIGFsb25nICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgbWFsbG9jIGR5bmFtaWMgUFlUSE9OUEFUSC5cbiIpOworICAgICAgICBpZiAoZW52cGF0aCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2luZyBlbnZpcm9ubWVudCAkUFlUSE9OUEFUSC5cbiIpOworICAgICAgICAgICAgbW9kdWxlX3NlYXJjaF9wYXRoID0gZW52cGF0aDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNpbmcgZGVmYXVsdCBzdGF0aWMgcGF0aC5cbiIpOworICAgICAgICAgICAgbW9kdWxlX3NlYXJjaF9wYXRoID0gUFlUSE9OUEFUSDsKKyAgICAgICAgfQogI2lmZGVmIE1TX1dJTkRPV1MKLQkJaWYgKG1hY2hpbmVwYXRoKQotCQkJZnJlZShtYWNoaW5lcGF0aCk7Ci0JCWlmICh1c2VycGF0aCkKLQkJCWZyZWUodXNlcnBhdGgpOworICAgICAgICBpZiAobWFjaGluZXBhdGgpCisgICAgICAgICAgICBmcmVlKG1hY2hpbmVwYXRoKTsKKyAgICAgICAgaWYgKHVzZXJwYXRoKQorICAgICAgICAgICAgZnJlZSh1c2VycGF0aCk7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwotCQlyZXR1cm47Ci0JfQorICAgICAgICByZXR1cm47CisgICAgfQogCi0JaWYgKGVudnBhdGgpIHsKLQkJc3RyY3B5KGJ1ZiwgZW52cGF0aCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkqYnVmKysgPSBERUxJTTsKLQl9CisgICAgaWYgKGVudnBhdGgpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgZW52cGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICB9CiAjaWZkZWYgTVNfV0lORE9XUwotCWlmICh6aXBfcGF0aFswXSkgewotCQlzdHJjcHkoYnVmLCB6aXBfcGF0aCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkqYnVmKysgPSBERUxJTTsKLQl9Ci0JaWYgKHVzZXJwYXRoKSB7Ci0JCXN0cmNweShidWYsIHVzZXJwYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JCSpidWYrKyA9IERFTElNOwotCQlmcmVlKHVzZXJwYXRoKTsKLQl9Ci0JaWYgKG1hY2hpbmVwYXRoKSB7Ci0JCXN0cmNweShidWYsIG1hY2hpbmVwYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JCSpidWYrKyA9IERFTElNOwotCQlmcmVlKG1hY2hpbmVwYXRoKTsKLQl9Ci0JaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCkgewotCQlpZiAoIXNraXBkZWZhdWx0KSB7Ci0JCQlzdHJjcHkoYnVmLCBQWVRIT05QQVRIKTsKLQkJCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQl9Ci0JfQorICAgIGlmICh6aXBfcGF0aFswXSkgeworICAgICAgICBzdHJjcHkoYnVmLCB6aXBfcGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICB9CisgICAgaWYgKHVzZXJwYXRoKSB7CisgICAgICAgIHN0cmNweShidWYsIHVzZXJwYXRoKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgICAgICpidWYrKyA9IERFTElNOworICAgICAgICBmcmVlKHVzZXJwYXRoKTsKKyAgICB9CisgICAgaWYgKG1hY2hpbmVwYXRoKSB7CisgICAgICAgIHN0cmNweShidWYsIG1hY2hpbmVwYXRoKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgICAgICpidWYrKyA9IERFTElNOworICAgICAgICBmcmVlKG1hY2hpbmVwYXRoKTsKKyAgICB9CisgICAgaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCkgeworICAgICAgICBpZiAoIXNraXBkZWZhdWx0KSB7CisgICAgICAgICAgICBzdHJjcHkoYnVmLCBQWVRIT05QQVRIKTsKKyAgICAgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICB9CisgICAgfQogI2Vsc2UKLQlpZiAocHl0aG9uaG9tZSA9PSBOVUxMKSB7Ci0JCXN0cmNweShidWYsIFBZVEhPTlBBVEgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQl9CisgICAgaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCkgeworICAgICAgICBzdHJjcHkoYnVmLCBQWVRIT05QQVRIKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgfQogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KLQllbHNlIHsKLQkJY2hhciAqcCA9IFBZVEhPTlBBVEg7Ci0JCWNoYXIgKnE7Ci0JCXNpemVfdCBuOwotCQlmb3IgKDs7KSB7Ci0JCQlxID0gc3RyY2hyKHAsIERFTElNKTsKLQkJCWlmIChxID09IE5VTEwpCi0JCQkJbiA9IHN0cmxlbihwKTsKLQkJCWVsc2UKLQkJCQluID0gcS1wOwotCQkJaWYgKHBbMF0gPT0gJy4nICYmIGlzX3NlcChwWzFdKSkgewotCQkJCXN0cmNweShidWYsIHB5dGhvbmhvbWUpOwotCQkJCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkJCXArKzsKLQkJCQluLS07Ci0JCQl9Ci0JCQlzdHJuY3B5KGJ1ZiwgcCwgbik7Ci0JCQlidWYgKz0gbjsKLQkJCWlmIChxID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQkqYnVmKysgPSBERUxJTTsKLQkJCXAgPSBxKzE7Ci0JCX0KLQl9Ci0JaWYgKGFyZ3YwX3BhdGgpIHsKLQkJKmJ1ZisrID0gREVMSU07Ci0JCXN0cmNweShidWYsIGFyZ3YwX3BhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQl9Ci0JKmJ1ZiA9ICdcMCc7Ci0JLyogTm93IHRvIHB1bGwgb25lIGxhc3QgaGFjay90cmljay4gIElmIHN5cy5wcmVmaXggaXMKLQkgICBlbXB0eSwgdGhlbiB0cnkgYW5kIGZpbmQgaXQgc29tZXdoZXJlIG9uIHRoZSBwYXRocwotCSAgIHdlIGNhbGN1bGF0ZWQuICBXZSBzY2FuIGJhY2t3YXJkcywgYXMgb3VyIGdlbmVyYWwgcG9saWN5Ci0JICAgaXMgdGhhdCBQeXRob24gY29yZSBkaXJlY3RvcmllcyBhcmUgYXQgdGhlICplbmQqIG9mCi0JICAgc3lzLnBhdGguICBXZSBhc3N1bWUgdGhhdCBvdXIgImxpYiIgZGlyZWN0b3J5IGlzCi0JICAgb24gdGhlIHBhdGgsIGFuZCB0aGF0IG91ciAncHJlZml4JyBkaXJlY3RvcnkgaXMKLQkgICB0aGUgcGFyZW50IG9mIHRoYXQuCi0JKi8KLQlpZiAoKnByZWZpeD09J1wwJykgewotCQljaGFyIGxvb2tCdWZbTUFYUEFUSExFTisxXTsKLQkJY2hhciAqbG9vayA9IGJ1ZiAtIDE7IC8qICdidWYnIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotCQl3aGlsZSAoMSkgewotCQkJUHlfc3NpemVfdCBuY2hhcnM7Ci0JCQljaGFyICpsb29rRW5kID0gbG9vazsKLQkJCS8qICdsb29rJyB3aWxsIGVuZCB1cCBvbmUgY2hhcmFjdGVyIGJlZm9yZSB0aGUKLQkJCSAgIHN0YXJ0IG9mIHRoZSBwYXRoIGluIHF1ZXN0aW9uIC0gZXZlbiBpZiB0aGlzCi0JCQkgICBpcyBvbmUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlcgotCQkJKi8KLQkJCXdoaWxlIChsb29rID49IG1vZHVsZV9zZWFyY2hfcGF0aCAmJiAqbG9vayAhPSBERUxJTSkKLQkJCQlsb29rLS07Ci0JCQluY2hhcnMgPSBsb29rRW5kLWxvb2s7Ci0JCQlzdHJuY3B5KGxvb2tCdWYsIGxvb2srMSwgbmNoYXJzKTsKLQkJCWxvb2tCdWZbbmNoYXJzXSA9ICdcMCc7Ci0JCQkvKiBVcCBvbmUgbGV2ZWwgdG8gdGhlIHBhcmVudCAqLwotCQkJcmVkdWNlKGxvb2tCdWYpOwotCQkJaWYgKHNlYXJjaF9mb3JfcHJlZml4KGxvb2tCdWYsIExBTkRNQVJLKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJLyogSWYgd2UgYXJlIG91dCBvZiBwYXRocyB0byBzZWFyY2ggLSBnaXZlIHVwICovCi0JCQlpZiAobG9vayA8IG1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJCQlicmVhazsKLQkJCWxvb2stLTsKLQkJfQotCX0KKyAgICBlbHNlIHsKKyAgICAgICAgY2hhciAqcCA9IFBZVEhPTlBBVEg7CisgICAgICAgIGNoYXIgKnE7CisgICAgICAgIHNpemVfdCBuOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBxID0gc3RyY2hyKHAsIERFTElNKTsKKyAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgbiA9IHN0cmxlbihwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuID0gcS1wOworICAgICAgICAgICAgaWYgKHBbMF0gPT0gJy4nICYmIGlzX3NlcChwWzFdKSkgeworICAgICAgICAgICAgICAgIHN0cmNweShidWYsIHB5dGhvbmhvbWUpOworICAgICAgICAgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBuLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJuY3B5KGJ1ZiwgcCwgbik7CisgICAgICAgICAgICBidWYgKz0gbjsKKyAgICAgICAgICAgIGlmIChxID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgICAgIHAgPSBxKzE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFyZ3YwX3BhdGgpIHsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgICAgIHN0cmNweShidWYsIGFyZ3YwX3BhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICB9CisgICAgKmJ1ZiA9ICdcMCc7CisgICAgLyogTm93IHRvIHB1bGwgb25lIGxhc3QgaGFjay90cmljay4gIElmIHN5cy5wcmVmaXggaXMKKyAgICAgICBlbXB0eSwgdGhlbiB0cnkgYW5kIGZpbmQgaXQgc29tZXdoZXJlIG9uIHRoZSBwYXRocworICAgICAgIHdlIGNhbGN1bGF0ZWQuICBXZSBzY2FuIGJhY2t3YXJkcywgYXMgb3VyIGdlbmVyYWwgcG9saWN5CisgICAgICAgaXMgdGhhdCBQeXRob24gY29yZSBkaXJlY3RvcmllcyBhcmUgYXQgdGhlICplbmQqIG9mCisgICAgICAgc3lzLnBhdGguICBXZSBhc3N1bWUgdGhhdCBvdXIgImxpYiIgZGlyZWN0b3J5IGlzCisgICAgICAgb24gdGhlIHBhdGgsIGFuZCB0aGF0IG91ciAncHJlZml4JyBkaXJlY3RvcnkgaXMKKyAgICAgICB0aGUgcGFyZW50IG9mIHRoYXQuCisgICAgKi8KKyAgICBpZiAoKnByZWZpeD09J1wwJykgeworICAgICAgICBjaGFyIGxvb2tCdWZbTUFYUEFUSExFTisxXTsKKyAgICAgICAgY2hhciAqbG9vayA9IGJ1ZiAtIDE7IC8qICdidWYnIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBuY2hhcnM7CisgICAgICAgICAgICBjaGFyICpsb29rRW5kID0gbG9vazsKKyAgICAgICAgICAgIC8qICdsb29rJyB3aWxsIGVuZCB1cCBvbmUgY2hhcmFjdGVyIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgIHN0YXJ0IG9mIHRoZSBwYXRoIGluIHF1ZXN0aW9uIC0gZXZlbiBpZiB0aGlzCisgICAgICAgICAgICAgICBpcyBvbmUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdoaWxlIChsb29rID49IG1vZHVsZV9zZWFyY2hfcGF0aCAmJiAqbG9vayAhPSBERUxJTSkKKyAgICAgICAgICAgICAgICBsb29rLS07CisgICAgICAgICAgICBuY2hhcnMgPSBsb29rRW5kLWxvb2s7CisgICAgICAgICAgICBzdHJuY3B5KGxvb2tCdWYsIGxvb2srMSwgbmNoYXJzKTsKKyAgICAgICAgICAgIGxvb2tCdWZbbmNoYXJzXSA9ICdcMCc7CisgICAgICAgICAgICAvKiBVcCBvbmUgbGV2ZWwgdG8gdGhlIHBhcmVudCAqLworICAgICAgICAgICAgcmVkdWNlKGxvb2tCdWYpOworICAgICAgICAgICAgaWYgKHNlYXJjaF9mb3JfcHJlZml4KGxvb2tCdWYsIExBTkRNQVJLKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgd2UgYXJlIG91dCBvZiBwYXRocyB0byBzZWFyY2ggLSBnaXZlIHVwICovCisgICAgICAgICAgICBpZiAobG9vayA8IG1vZHVsZV9zZWFyY2hfcGF0aCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGxvb2stLTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogCkBAIC02ODYsMjkgKzY4NiwyOSBAQAogY2hhciAqCiBQeV9HZXRQYXRoKHZvaWQpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7Ci0JcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKKyAgICBpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKKyAgICAgICAgY2FsY3VsYXRlX3BhdGgoKTsKKyAgICByZXR1cm4gbW9kdWxlX3NlYXJjaF9wYXRoOwogfQogCiBjaGFyICoKIFB5X0dldFByZWZpeCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBwcmVmaXg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIHByZWZpeDsKIH0KIAogY2hhciAqCiBQeV9HZXRFeGVjUHJlZml4KHZvaWQpCiB7Ci0JcmV0dXJuIFB5X0dldFByZWZpeCgpOworICAgIHJldHVybiBQeV9HZXRQcmVmaXgoKTsKIH0KIAogY2hhciAqCiBQeV9HZXRQcm9ncmFtRnVsbFBhdGgodm9pZCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKLQlyZXR1cm4gcHJvZ3BhdGg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIHByb2dwYXRoOwogfQpkaWZmIC0tZ2l0IGEvUEMvaW1wb3J0X250LmMgYi9QQy9pbXBvcnRfbnQuYwppbmRleCBlN2QxNTJhLi4xOTZhNzc0IDEwMDY0NAotLS0gYS9QQy9pbXBvcnRfbnQuYworKysgYi9QQy9pbXBvcnRfbnQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gaW1wb3J0X250LmMgCisgaW1wb3J0X250LmMKIAogICBXaW4zMiBzcGVjaWZpYyBpbXBvcnQgY29kZS4KIApAQCAtMTYsNzEgKzE2LDcxIEBACiBleHRlcm4gY29uc3QgY2hhciAqUHlXaW5fRExMVmVyc2lvblN0cmluZzsKIAogRklMRSAqUHlXaW5fRmluZFJlZ2lzdGVyZWRNb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlTmFtZSwKLQkJCQkgc3RydWN0IGZpbGVkZXNjciAqKnBwRmlsZURlc2MsCi0JCQkJIGNoYXIgKnBhdGhCdWYsCi0JCQkJIFB5X3NzaXplX3QgcGF0aExlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmaWxlZGVzY3IgKipwcEZpbGVEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGF0aEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgcGF0aExlbikKIHsKLQljaGFyICptb2R1bGVLZXk7Ci0JY29uc3QgY2hhciBrZXlQcmVmaXhbXSA9ICJTb2Z0d2FyZVxcUHl0aG9uXFxQeXRob25Db3JlXFwiOwotCWNvbnN0IGNoYXIga2V5U3VmZml4W10gPSAiXFxNb2R1bGVzXFwiOworICAgIGNoYXIgKm1vZHVsZUtleTsKKyAgICBjb25zdCBjaGFyIGtleVByZWZpeFtdID0gIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCI7CisgICAgY29uc3QgY2hhciBrZXlTdWZmaXhbXSA9ICJcXE1vZHVsZXNcXCI7CiAjaWZkZWYgX0RFQlVHCi0JLyogSW4gZGVidWdnaW5nIGJ1aWxkcywgd2UgX211c3RfIGhhdmUgdGhlIGRlYnVnIHZlcnNpb24KLQkgKiByZWdpc3RlcmVkLgotCSAqLwotCWNvbnN0IGNoYXIgZGVidWdTdHJpbmdbXSA9ICJcXERlYnVnIjsKKyAgICAvKiBJbiBkZWJ1Z2dpbmcgYnVpbGRzLCB3ZSBfbXVzdF8gaGF2ZSB0aGUgZGVidWcgdmVyc2lvbgorICAgICAqIHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgY29uc3QgY2hhciBkZWJ1Z1N0cmluZ1tdID0gIlxcRGVidWciOwogI2Vsc2UKLQljb25zdCBjaGFyIGRlYnVnU3RyaW5nW10gPSAiIjsKKyAgICBjb25zdCBjaGFyIGRlYnVnU3RyaW5nW10gPSAiIjsKICNlbmRpZgotCXN0cnVjdCBmaWxlZGVzY3IgKmZkcCA9IE5VTEw7Ci0JRklMRSAqZnA7Ci0JSEtFWSBrZXlCYXNlID0gSEtFWV9DVVJSRU5UX1VTRVI7Ci0JaW50IG1vZE5hbWVTaXplOwotCWxvbmcgcmVnU3RhdDsKKyAgICBzdHJ1Y3QgZmlsZWRlc2NyICpmZHAgPSBOVUxMOworICAgIEZJTEUgKmZwOworICAgIEhLRVkga2V5QmFzZSA9IEhLRVlfQ1VSUkVOVF9VU0VSOworICAgIGludCBtb2ROYW1lU2l6ZTsKKyAgICBsb25nIHJlZ1N0YXQ7CiAKLQkvKiBDYWxjdWxhdGUgdGhlIHNpemUgZm9yIHRoZSBzcHJpbnRmIGJ1ZmZlci4KLQkgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGNoYXJzIG9ubHksIHBsdXMgMSBOVUxMLgotCSAqLwotCXNpemVfdCBidWZTaXplID0gc2l6ZW9mKGtleVByZWZpeCktMSArCi0JICAgICAgICAgICAgICAgICBzdHJsZW4oUHlXaW5fRExMVmVyc2lvblN0cmluZykgKwotCSAgICAgICAgICAgICAgICAgc2l6ZW9mKGtleVN1ZmZpeCkgKwotCSAgICAgICAgICAgICAgICAgc3RybGVuKG1vZHVsZU5hbWUpICsKLQkgICAgICAgICAgICAgICAgIHNpemVvZihkZWJ1Z1N0cmluZykgLSAxOwotCS8qIGFsbG9jYSA9PSBubyBmcmVlIHJlcXVpcmVkLCBidXQgbWVtb3J5IG9ubHkgbG9jYWwgdG8gZm4sCi0JICogYWxzbyBubyBoZWFwIGZyYWdtZW50YXRpb24hCi0JICovCi0JbW9kdWxlS2V5ID0gYWxsb2NhKGJ1ZlNpemUpOyAKLQlQeU9TX3NucHJpbnRmKG1vZHVsZUtleSwgYnVmU2l6ZSwKLQkJICAgICAgIlNvZnR3YXJlXFxQeXRob25cXFB5dGhvbkNvcmVcXCVzXFxNb2R1bGVzXFwlcyVzIiwKLQkJICAgICAgUHlXaW5fRExMVmVyc2lvblN0cmluZywgbW9kdWxlTmFtZSwgZGVidWdTdHJpbmcpOworICAgIC8qIENhbGN1bGF0ZSB0aGUgc2l6ZSBmb3IgdGhlIHNwcmludGYgYnVmZmVyLgorICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgY2hhcnMgb25seSwgcGx1cyAxIE5VTEwuCisgICAgICovCisgICAgc2l6ZV90IGJ1ZlNpemUgPSBzaXplb2Yoa2V5UHJlZml4KS0xICsKKyAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihQeVdpbl9ETExWZXJzaW9uU3RyaW5nKSArCisgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa2V5U3VmZml4KSArCisgICAgICAgICAgICAgICAgICAgICBzdHJsZW4obW9kdWxlTmFtZSkgKworICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRlYnVnU3RyaW5nKSAtIDE7CisgICAgLyogYWxsb2NhID09IG5vIGZyZWUgcmVxdWlyZWQsIGJ1dCBtZW1vcnkgb25seSBsb2NhbCB0byBmbiwKKyAgICAgKiBhbHNvIG5vIGhlYXAgZnJhZ21lbnRhdGlvbiEKKyAgICAgKi8KKyAgICBtb2R1bGVLZXkgPSBhbGxvY2EoYnVmU2l6ZSk7CisgICAgUHlPU19zbnByaW50Zihtb2R1bGVLZXksIGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcJXNcXE1vZHVsZXNcXCVzJXMiLAorICAgICAgICAgICAgICAgICAgUHlXaW5fRExMVmVyc2lvblN0cmluZywgbW9kdWxlTmFtZSwgZGVidWdTdHJpbmcpOwogCi0JYXNzZXJ0KHBhdGhMZW4gPCBJTlRfTUFYKTsKLQltb2ROYW1lU2l6ZSA9IChpbnQpcGF0aExlbjsKLQlyZWdTdGF0ID0gUmVnUXVlcnlWYWx1ZShrZXlCYXNlLCBtb2R1bGVLZXksIHBhdGhCdWYsICZtb2ROYW1lU2l6ZSk7Ci0JaWYgKHJlZ1N0YXQgIT0gRVJST1JfU1VDQ0VTUykgewotCQkvKiBObyB1c2VyIHNldHRpbmcgLSBsb29rdXAgaW4gbWFjaGluZSBzZXR0aW5ncyAqLwotCQlrZXlCYXNlID0gSEtFWV9MT0NBTF9NQUNISU5FOwotCQkvKiBiZSBhbmFsIC0gZmFpbHVyZSBtYXkgaGF2ZSByZXNldCBzaXplIHBhcmFtICovCi0JCW1vZE5hbWVTaXplID0gKGludClwYXRoTGVuOwotCQlyZWdTdGF0ID0gUmVnUXVlcnlWYWx1ZShrZXlCYXNlLCBtb2R1bGVLZXksIAotCQkgICAgICAgICAgICAgICAgICAgICAgICBwYXRoQnVmLCAmbW9kTmFtZVNpemUpOworICAgIGFzc2VydChwYXRoTGVuIDwgSU5UX01BWCk7CisgICAgbW9kTmFtZVNpemUgPSAoaW50KXBhdGhMZW47CisgICAgcmVnU3RhdCA9IFJlZ1F1ZXJ5VmFsdWUoa2V5QmFzZSwgbW9kdWxlS2V5LCBwYXRoQnVmLCAmbW9kTmFtZVNpemUpOworICAgIGlmIChyZWdTdGF0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgLyogTm8gdXNlciBzZXR0aW5nIC0gbG9va3VwIGluIG1hY2hpbmUgc2V0dGluZ3MgKi8KKyAgICAgICAga2V5QmFzZSA9IEhLRVlfTE9DQUxfTUFDSElORTsKKyAgICAgICAgLyogYmUgYW5hbCAtIGZhaWx1cmUgbWF5IGhhdmUgcmVzZXQgc2l6ZSBwYXJhbSAqLworICAgICAgICBtb2ROYW1lU2l6ZSA9IChpbnQpcGF0aExlbjsKKyAgICAgICAgcmVnU3RhdCA9IFJlZ1F1ZXJ5VmFsdWUoa2V5QmFzZSwgbW9kdWxlS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoQnVmLCAmbW9kTmFtZVNpemUpOwogCi0JCWlmIChyZWdTdGF0ICE9IEVSUk9SX1NVQ0NFU1MpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogdXNlIHRoZSBmaWxlIGV4dGVuc2lvbiB0byBsb2NhdGUgdGhlIHR5cGUgZW50cnkuICovCi0JZm9yIChmZHAgPSBfUHlJbXBvcnRfRmlsZXRhYjsgZmRwLT5zdWZmaXggIT0gTlVMTDsgZmRwKyspIHsKLQkJc2l6ZV90IGV4dExlbiA9IHN0cmxlbihmZHAtPnN1ZmZpeCk7Ci0JCWFzc2VydChtb2ROYW1lU2l6ZSA+PSAwKTsgLyogZWxzZSBjYXN0IHRvIHNpemVfdCBpcyB3cm9uZyAqLwotCQlpZiAoKHNpemVfdCltb2ROYW1lU2l6ZSA+IGV4dExlbiAmJgotCQkgICAgc3RybmljbXAocGF0aEJ1ZiArICgoc2l6ZV90KW1vZE5hbWVTaXplLWV4dExlbi0xKSwKLQkJICAgICAgICAgICAgIGZkcC0+c3VmZml4LAotCQkgICAgICAgICAgICAgZXh0TGVuKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChmZHAtPnN1ZmZpeCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmcCA9IGZvcGVuKHBhdGhCdWYsIGZkcC0+bW9kZSk7Ci0JaWYgKGZwICE9IE5VTEwpCi0JCSpwcEZpbGVEZXNjID0gZmRwOwotCXJldHVybiBmcDsKKyAgICAgICAgaWYgKHJlZ1N0YXQgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiB1c2UgdGhlIGZpbGUgZXh0ZW5zaW9uIHRvIGxvY2F0ZSB0aGUgdHlwZSBlbnRyeS4gKi8KKyAgICBmb3IgKGZkcCA9IF9QeUltcG9ydF9GaWxldGFiOyBmZHAtPnN1ZmZpeCAhPSBOVUxMOyBmZHArKykgeworICAgICAgICBzaXplX3QgZXh0TGVuID0gc3RybGVuKGZkcC0+c3VmZml4KTsKKyAgICAgICAgYXNzZXJ0KG1vZE5hbWVTaXplID49IDApOyAvKiBlbHNlIGNhc3QgdG8gc2l6ZV90IGlzIHdyb25nICovCisgICAgICAgIGlmICgoc2l6ZV90KW1vZE5hbWVTaXplID4gZXh0TGVuICYmCisgICAgICAgICAgICBzdHJuaWNtcChwYXRoQnVmICsgKChzaXplX3QpbW9kTmFtZVNpemUtZXh0TGVuLTEpLAorICAgICAgICAgICAgICAgICAgICAgZmRwLT5zdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICBleHRMZW4pID09IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGZkcC0+c3VmZml4ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZwID0gZm9wZW4ocGF0aEJ1ZiwgZmRwLT5tb2RlKTsKKyAgICBpZiAoZnAgIT0gTlVMTCkKKyAgICAgICAgKnBwRmlsZURlc2MgPSBmZHA7CisgICAgcmV0dXJuIGZwOwogfQpkaWZmIC0tZ2l0IGEvUEMvbWFrZV92ZXJzaW9uaW5mby5jIGIvUEMvbWFrZV92ZXJzaW9uaW5mby5jCmluZGV4IGI5ZjliODguLmU5Njk2NzEgMTAwNjQ0Ci0tLSBhL1BDL21ha2VfdmVyc2lvbmluZm8uYworKysgYi9QQy9tYWtlX3ZlcnNpb25pbmZvLmMKQEAgLTIyLDE3ICsyMiwxNyBAQAogICovCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JcHJpbnRmKCIvKiBUaGlzIGZpbGUgY3JlYXRlZCBieSBtYWtlX3ZlcnNpb25pbmZvLmV4ZSAqL1xuIik7Ci0JcHJpbnRmKCIjZGVmaW5lIEZJRUxEMyAlZFxuIiwKLQkJUFlfTUlDUk9fVkVSU0lPTioxMDAwICsgUFlfUkVMRUFTRV9MRVZFTCoxMCArIFBZX1JFTEVBU0VfU0VSSUFMKTsKLQlwcmludGYoIiNkZWZpbmUgTVNfRExMX0lEIFwiJWQuJWRcIlxuIiwKLQkgICAgICAgUFlfTUFKT1JfVkVSU0lPTiwgUFlfTUlOT1JfVkVSU0lPTik7Ci0JcHJpbnRmKCIjaWZuZGVmIF9ERUJVR1xuIik7Ci0JcHJpbnRmKCIjZGVmaW5lIFBZVEhPTl9ETExfTkFNRSBcInB5dGhvbiVkJWQuZGxsXCJcbiIsCi0JICAgICAgIFBZX01BSk9SX1ZFUlNJT04sIFBZX01JTk9SX1ZFUlNJT04pOwotCXByaW50ZigiI2Vsc2VcbiIpOwotCXByaW50ZigiI2RlZmluZSBQWVRIT05fRExMX05BTUUgXCJweXRob24lZCVkX2QuZGxsXCJcbiIsCi0JICAgICAgIFBZX01BSk9SX1ZFUlNJT04sIFBZX01JTk9SX1ZFUlNJT04pOwotCXByaW50ZigiI2VuZGlmXG4iKTsKLQlyZXR1cm4gMDsKKyAgICBwcmludGYoIi8qIFRoaXMgZmlsZSBjcmVhdGVkIGJ5IG1ha2VfdmVyc2lvbmluZm8uZXhlICovXG4iKTsKKyAgICBwcmludGYoIiNkZWZpbmUgRklFTEQzICVkXG4iLAorICAgICAgICBQWV9NSUNST19WRVJTSU9OKjEwMDAgKyBQWV9SRUxFQVNFX0xFVkVMKjEwICsgUFlfUkVMRUFTRV9TRVJJQUwpOworICAgIHByaW50ZigiI2RlZmluZSBNU19ETExfSUQgXCIlZC4lZFwiXG4iLAorICAgICAgICAgICBQWV9NQUpPUl9WRVJTSU9OLCBQWV9NSU5PUl9WRVJTSU9OKTsKKyAgICBwcmludGYoIiNpZm5kZWYgX0RFQlVHXG4iKTsKKyAgICBwcmludGYoIiNkZWZpbmUgUFlUSE9OX0RMTF9OQU1FIFwicHl0aG9uJWQlZC5kbGxcIlxuIiwKKyAgICAgICAgICAgUFlfTUFKT1JfVkVSU0lPTiwgUFlfTUlOT1JfVkVSU0lPTik7CisgICAgcHJpbnRmKCIjZWxzZVxuIik7CisgICAgcHJpbnRmKCIjZGVmaW5lIFBZVEhPTl9ETExfTkFNRSBcInB5dGhvbiVkJWRfZC5kbGxcIlxuIiwKKyAgICAgICAgICAgUFlfTUFKT1JfVkVSU0lPTiwgUFlfTUlOT1JfVkVSU0lPTik7CisgICAgcHJpbnRmKCIjZW5kaWZcbiIpOworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvUEMvbXN2Y3J0bW9kdWxlLmMgYi9QQy9tc3ZjcnRtb2R1bGUuYwppbmRleCA0ZmU0ZWI0Li40MTg5NjVkIDEwMDc1NQotLS0gYS9QQy9tc3ZjcnRtb2R1bGUuYworKysgYi9QQy9tc3ZjcnRtb2R1bGUuYwpAQCAtMSwxOCArMSwxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0JbXN2Y3J0bW9kdWxlLmMKKyAgICBtc3ZjcnRtb2R1bGUuYwogCi0JQSBQeXRob24gaW50ZXJmYWNlIHRvIHRoZSBNaWNyb3NvZnQgVmlzdWFsIEMgUnVudGltZQotCUxpYnJhcnksIHByb3ZpZGluZyBhY2Nlc3MgdG8gdGhvc2Ugbm9uLXBvcnRhYmxlLCBidXQKLQlzdGlsbCB1c2VmdWwgcm91dGluZXMuCisgICAgQSBQeXRob24gaW50ZXJmYWNlIHRvIHRoZSBNaWNyb3NvZnQgVmlzdWFsIEMgUnVudGltZQorICAgIExpYnJhcnksIHByb3ZpZGluZyBhY2Nlc3MgdG8gdGhvc2Ugbm9uLXBvcnRhYmxlLCBidXQKKyAgICBzdGlsbCB1c2VmdWwgcm91dGluZXMuCiAKLQlPbmx5IGV2ZXIgY29tcGlsZWQgd2l0aCBhbiBNUyBjb21waWxlciwgc28gbm8gYXR0ZW1wdAotCWhhcyBiZWVuIG1hZGUgdG8gYXZvaWQgTVMgbGFuZ3VhZ2UgZXh0ZW5zaW9ucywgZXRjLi4uCisgICAgT25seSBldmVyIGNvbXBpbGVkIHdpdGggYW4gTVMgY29tcGlsZXIsIHNvIG5vIGF0dGVtcHQKKyAgICBoYXMgYmVlbiBtYWRlIHRvIGF2b2lkIE1TIGxhbmd1YWdlIGV4dGVuc2lvbnMsIGV0Yy4uLgogCi0JVGhpcyBtYXkgb25seSB3b3JrIG9uIE5UIG9yIDk1Li4uCisgICAgVGhpcyBtYXkgb25seSB3b3JrIG9uIE5UIG9yIDk1Li4uCiAKLQlBdXRob3I6IE1hcmsgSGFtbW9uZCBhbmQgR3VpZG8gdmFuIFJvc3N1bS4KLQlNYWludGVuYW5jZTogR3VpZG8gdmFuIFJvc3N1bS4KKyAgICBBdXRob3I6IE1hcmsgSGFtbW9uZCBhbmQgR3VpZG8gdmFuIFJvc3N1bS4KKyAgICBNYWludGVuYW5jZTogR3VpZG8gdmFuIFJvc3N1bS4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTMzLDkwICszMyw5MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9oZWFwbWluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpoZWFwbWluIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmhlYXBtaW4iKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoX2hlYXBtaW4oKSAhPSAwKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIGlmIChfaGVhcG1pbigpICE9IDApCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAvLyBQZXJmb3JtIGxvY2tpbmcgb3BlcmF0aW9ucyBvbiBhIEMgcnVudGltZSBmaWxlIGRlc2NyaXB0b3IuCiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X2xvY2tpbmcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZDsKLQlpbnQgbW9kZTsKLQlsb25nIG5ieXRlczsKLQlpbnQgZXJyOworICAgIGludCBmZDsKKyAgICBpbnQgbW9kZTsKKyAgICBsb25nIG5ieXRlczsKKyAgICBpbnQgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWw6bG9ja2luZyIsICZmZCwgJm1vZGUsICZuYnl0ZXMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpbDpsb2NraW5nIiwgJmZkLCAmbW9kZSwgJm5ieXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCWVyciA9IF9sb2NraW5nKGZkLCBtb2RlLCBuYnl0ZXMpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0JaWYgKGVyciAhPSAwKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBlcnIgPSBfbG9ja2luZyhmZCwgbW9kZSwgbmJ5dGVzKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIC8vIFNldCB0aGUgZmlsZSB0cmFuc2xhdGlvbiBtb2RlIGZvciBhIEMgcnVudGltZSBmaWxlIGRlc2NyaXB0b3IuCiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X3NldG1vZGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmZDsKLQlpbnQgZmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsImlpOnNldG1vZGUiLCAmZmQsICZmbGFncykpCi0JCXJldHVybiBOVUxMOworICAgIGludCBmZDsKKyAgICBpbnQgZmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsImlpOnNldG1vZGUiLCAmZmQsICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZmxhZ3MgPSBfc2V0bW9kZShmZCwgZmxhZ3MpOwotCWlmIChmbGFncyA9PSAtMSkKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICBmbGFncyA9IF9zZXRtb2RlKGZkLCBmbGFncyk7CisgICAgaWYgKGZsYWdzID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZsYWdzKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZmxhZ3MpOwogfQogCiAvLyBDb252ZXJ0IGFuIE9TIGZpbGUgaGFuZGxlIHRvIGEgQyBydW50aW1lIGZpbGUgZGVzY3JpcHRvci4KIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfb3Blbl9vc2ZoYW5kbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWxvbmcgaGFuZGxlOwotCWludCBmbGFnczsKLQlpbnQgZmQ7CisgICAgbG9uZyBoYW5kbGU7CisgICAgaW50IGZsYWdzOworICAgIGludCBmZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGk6b3Blbl9vc2ZoYW5kbGUiLCAmaGFuZGxlLCAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxpOm9wZW5fb3NmaGFuZGxlIiwgJmhhbmRsZSwgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmZCA9IF9vcGVuX29zZmhhbmRsZShoYW5kbGUsIGZsYWdzKTsKLQlpZiAoZmQgPT0gLTEpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgZmQgPSBfb3Blbl9vc2ZoYW5kbGUoaGFuZGxlLCBmbGFncyk7CisgICAgaWYgKGZkID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwogCi0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKGZkKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZmQpOwogfQogCiAvLyBDb252ZXJ0IGEgQyBydW50aW1lIGZpbGUgZGVzY3JpcHRvciB0byBhbiBPUyBmaWxlIGhhbmRsZS4KIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfZ2V0X29zZmhhbmRsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZkOwotCVB5X2ludHB0cl90IGhhbmRsZTsKKyAgICBpbnQgZmQ7CisgICAgUHlfaW50cHRyX3QgaGFuZGxlOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsImk6Z2V0X29zZmhhbmRsZSIsICZmZCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJpOmdldF9vc2ZoYW5kbGUiLCAmZmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWhhbmRsZSA9IF9nZXRfb3NmaGFuZGxlKGZkKTsKLQlpZiAoaGFuZGxlID09IC0xKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIGhhbmRsZSA9IF9nZXRfb3NmaGFuZGxlKGZkKTsKKyAgICBpZiAoaGFuZGxlID09IC0xKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOwogCi0JLyogdGVjaG5pY2FsbHkgJ2hhbmRsZScgaXMgbm90IGEgcG9pbnRlciwgYnV0IGEgaW50ZWdlciBhcwotCSAgIGxhcmdlIGFzIGEgcG9pbnRlciwgUHl0aG9uJ3MgKlZvaWRQdHIgaW50ZXJmYWNlIGlzIHRoZQotCSAgIG1vc3QgYXBwcm9wcmlhdGUgaGVyZSAqLwotCXJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQqKWhhbmRsZSk7CisgICAgLyogdGVjaG5pY2FsbHkgJ2hhbmRsZScgaXMgbm90IGEgcG9pbnRlciwgYnV0IGEgaW50ZWdlciBhcworICAgICAgIGxhcmdlIGFzIGEgcG9pbnRlciwgUHl0aG9uJ3MgKlZvaWRQdHIgaW50ZXJmYWNlIGlzIHRoZQorICAgICAgIG1vc3QgYXBwcm9wcmlhdGUgaGVyZSAqLworICAgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQqKWhhbmRsZSk7CiB9CiAKIC8qIENvbnNvbGUgSS9PICovCkBAIC0xMjQsMTEzICsxMjQsMTEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X2tiaGl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgb2s7CisgICAgaW50IG9rOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6a2JoaXQiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6a2JoaXQiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlvayA9IF9rYmhpdCgpOwotCXJldHVybiBQeUludF9Gcm9tTG9uZyhvayk7CisgICAgb2sgPSBfa2JoaXQoKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcob2spOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X2dldGNoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgY2g7Ci0JY2hhciBzWzFdOworICAgIGludCBjaDsKKyAgICBjaGFyIHNbMV07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRjaCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXRjaCIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQljaCA9IF9nZXRjaCgpOwotCVB5X0VORF9BTExPV19USFJFQURTCi0Jc1swXSA9IGNoOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAxKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgY2ggPSBfZ2V0Y2goKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIHNbMF0gPSBjaDsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgMSk7CiB9CiAKICNpZmRlZiBfV0NPTklPX0RFRklORUQKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfZ2V0d2NoKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9VTklDT0RFIGNoOwotCVB5X1VOSUNPREUgdVsxXTsKKyAgICBQeV9VTklDT0RFIGNoOworICAgIFB5X1VOSUNPREUgdVsxXTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldHdjaCIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpnZXR3Y2giKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JY2ggPSBfZ2V0d2NoKCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQl1WzBdID0gY2g7Ci0JcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZSh1LCAxKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgY2ggPSBfZ2V0d2NoKCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB1WzBdID0gY2g7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZSh1LCAxKTsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogbXN2Y3J0X2dldGNoZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGNoOwotCWNoYXIgc1sxXTsKKyAgICBpbnQgY2g7CisgICAgY2hhciBzWzFdOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0Y2hlIikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldGNoZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQljaCA9IF9nZXRjaGUoKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCXNbMF0gPSBjaDsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgMSk7CisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGNoID0gX2dldGNoZSgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgc1swXSA9IGNoOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAxKTsKIH0KIAogI2lmZGVmIF9XQ09OSU9fREVGSU5FRAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9nZXR3Y2hlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeV9VTklDT0RFIGNoOwotCVB5X1VOSUNPREUgc1sxXTsKKyAgICBQeV9VTklDT0RFIGNoOworICAgIFB5X1VOSUNPREUgc1sxXTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiOmdldHdjaGUiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6Z2V0d2NoZSIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQljaCA9IF9nZXR3Y2hlKCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQlzWzBdID0gY2g7Ci0JcmV0dXJuIFB5VW5pY29kZV9Gcm9tVW5pY29kZShzLCAxKTsKKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgY2ggPSBfZ2V0d2NoZSgpOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgc1swXSA9IGNoOworICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVVuaWNvZGUocywgMSk7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9wdXRjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciBjaDsKKyAgICBjaGFyIGNoOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjOnB1dGNoIiwgJmNoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjOnB1dGNoIiwgJmNoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlfcHV0Y2goY2gpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBfcHV0Y2goY2gpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2lmZGVmIF9XQ09OSU9fREVGSU5FRAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF9wdXR3Y2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5X1VOSUNPREUgKmNoOwotCWludCBzaXplOworICAgIFB5X1VOSUNPREUgKmNoOworICAgIGludCBzaXplOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1IzpwdXR3Y2giLCAmY2gsICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1IzpwdXR3Y2giLCAmY2gsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJIkV4cGVjdGVkIHVuaWNvZGUgc3RyaW5nIG9mIGxlbmd0aCAxIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlfcHV0d2NoKCpjaCk7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICJFeHBlY3RlZCB1bmljb2RlIHN0cmluZyBvZiBsZW5ndGggMSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgX3B1dHdjaCgqY2gpOworICAgIFB5X1JFVFVSTl9OT05FOwogCiB9CiAjZW5kaWYKQEAgLTIzOCwxMDAgKzIzOCwxMDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBtc3ZjcnRfdW5nZXRjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciBjaDsKKyAgICBjaGFyIGNoOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJjOnVuZ2V0Y2giLCAmY2gpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImM6dW5nZXRjaCIsICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKF91bmdldGNoKGNoKSA9PSBFT0YpCi0JCXJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmIChfdW5nZXRjaChjaCkgPT0gRU9GKQorICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2lmZGVmIF9XQ09OSU9fREVGSU5FRAogc3RhdGljIFB5T2JqZWN0ICoKIG1zdmNydF91bmdldHdjaChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfVU5JQ09ERSBjaDsKKyAgICBQeV9VTklDT0RFIGNoOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1OnVuZ2V0d2NoIiwgJmNoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ1OnVuZ2V0d2NoIiwgJmNoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoX3VuZ2V0Y2goY2gpID09IEVPRikKLQkJcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKF91bmdldGNoKGNoKSA9PSBFT0YpCisgICAgICAgIHJldHVybiBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkCiBpbnNlcnRpbnQoUHlPYmplY3QgKmQsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSkKIHsKLQlQeU9iamVjdCAqdiA9IFB5SW50X0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQkvKiBEb24ndCBib3RoZXIgcmVwb3J0aW5nIHRoaXMgZXJyb3IgKi8KLQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpOwotCQlQeV9ERUNSRUYodik7Ci0JfQorICAgIFB5T2JqZWN0ICp2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHZhbHVlKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIC8qIERvbid0IGJvdGhlciByZXBvcnRpbmcgdGhpcyBlcnJvciAqLworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbmFtZSwgdik7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICB9CiB9CiAKIAogLyogTGlzdCBvZiBmdW5jdGlvbnMgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUgKi8KIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgbXN2Y3J0X2Z1bmN0aW9uc1tdID0gewotCXsiaGVhcG1pbiIsCQltc3ZjcnRfaGVhcG1pbiwgTUVUSF9WQVJBUkdTfSwKLQl7ImxvY2tpbmciLCAgICAgICAgICAgICBtc3ZjcnRfbG9ja2luZywgTUVUSF9WQVJBUkdTfSwKLQl7InNldG1vZGUiLAkJbXN2Y3J0X3NldG1vZGUsIE1FVEhfVkFSQVJHU30sCi0JeyJvcGVuX29zZmhhbmRsZSIsCW1zdmNydF9vcGVuX29zZmhhbmRsZSwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldF9vc2ZoYW5kbGUiLAltc3ZjcnRfZ2V0X29zZmhhbmRsZSwgTUVUSF9WQVJBUkdTfSwKLQl7ImtiaGl0IiwJCW1zdmNydF9rYmhpdCwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGNoIiwJCW1zdmNydF9nZXRjaCwgTUVUSF9WQVJBUkdTfSwKLQl7ImdldGNoZSIsCQltc3ZjcnRfZ2V0Y2hlLCBNRVRIX1ZBUkFSR1N9LAotCXsicHV0Y2giLAkJbXN2Y3J0X3B1dGNoLCBNRVRIX1ZBUkFSR1N9LAotCXsidW5nZXRjaCIsCQltc3ZjcnRfdW5nZXRjaCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImhlYXBtaW4iLCAgICAgICAgICAgICAgICAgbXN2Y3J0X2hlYXBtaW4sIE1FVEhfVkFSQVJHU30sCisgICAgeyJsb2NraW5nIiwgICAgICAgICAgICAgbXN2Y3J0X2xvY2tpbmcsIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXRtb2RlIiwgICAgICAgICAgICAgICAgIG1zdmNydF9zZXRtb2RlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsib3Blbl9vc2ZoYW5kbGUiLCAgICAgICAgICBtc3ZjcnRfb3Blbl9vc2ZoYW5kbGUsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRfb3NmaGFuZGxlIiwgICAgICAgICAgIG1zdmNydF9nZXRfb3NmaGFuZGxlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsia2JoaXQiLCAgICAgICAgICAgICAgICAgICBtc3ZjcnRfa2JoaXQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJnZXRjaCIsICAgICAgICAgICAgICAgICAgIG1zdmNydF9nZXRjaCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGNoZSIsICAgICAgICAgICAgICAgICAgbXN2Y3J0X2dldGNoZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InB1dGNoIiwgICAgICAgICAgICAgICAgICAgbXN2Y3J0X3B1dGNoLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsidW5nZXRjaCIsICAgICAgICAgICAgICAgICBtc3ZjcnRfdW5nZXRjaCwgTUVUSF9WQVJBUkdTfSwKICNpZmRlZiBfV0NPTklPX0RFRklORUQKLQl7ImdldHdjaCIsCQltc3ZjcnRfZ2V0d2NoLCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0d2NoZSIsCQltc3ZjcnRfZ2V0d2NoZSwgTUVUSF9WQVJBUkdTfSwKLQl7InB1dHdjaCIsCQltc3ZjcnRfcHV0d2NoLCBNRVRIX1ZBUkFSR1N9LAotCXsidW5nZXR3Y2giLAkJbXN2Y3J0X3VuZ2V0d2NoLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0d2NoIiwgICAgICAgICAgICAgICAgICBtc3ZjcnRfZ2V0d2NoLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0d2NoZSIsICAgICAgICAgICAgICAgICBtc3ZjcnRfZ2V0d2NoZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InB1dHdjaCIsICAgICAgICAgICAgICAgICAgbXN2Y3J0X3B1dHdjaCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InVuZ2V0d2NoIiwgICAgICAgICAgICAgICAgbXN2Y3J0X3VuZ2V0d2NoLCBNRVRIX1ZBUkFSR1N9LAogI2VuZGlmCi0Je05VTEwsCQkJTlVMTH0KKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0KIH07CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0bXN2Y3J0KHZvaWQpCiB7Ci0JaW50IHN0OwotCVB5T2JqZWN0ICpkOwotCVB5T2JqZWN0ICptID0gUHlfSW5pdE1vZHVsZSgibXN2Y3J0IiwgbXN2Y3J0X2Z1bmN0aW9ucyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGludCBzdDsKKyAgICBQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbSA9IFB5X0luaXRNb2R1bGUoIm1zdmNydCIsIG1zdmNydF9mdW5jdGlvbnMpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKIAotCS8qIGNvbnN0YW50cyBmb3IgdGhlIGxvY2tpbmcoKSBmdW5jdGlvbidzIG1vZGUgYXJndW1lbnQgKi8KLQlpbnNlcnRpbnQoZCwgIkxLX0xPQ0siLCBfTEtfTE9DSyk7Ci0JaW5zZXJ0aW50KGQsICJMS19OQkxDSyIsIF9MS19OQkxDSyk7Ci0JaW5zZXJ0aW50KGQsICJMS19OQlJMQ0siLCBfTEtfTkJSTENLKTsKLQlpbnNlcnRpbnQoZCwgIkxLX1JMQ0siLCBfTEtfUkxDSyk7Ci0JaW5zZXJ0aW50KGQsICJMS19VTkxDSyIsIF9MS19VTkxDSyk7CisgICAgLyogY29uc3RhbnRzIGZvciB0aGUgbG9ja2luZygpIGZ1bmN0aW9uJ3MgbW9kZSBhcmd1bWVudCAqLworICAgIGluc2VydGludChkLCAiTEtfTE9DSyIsIF9MS19MT0NLKTsKKyAgICBpbnNlcnRpbnQoZCwgIkxLX05CTENLIiwgX0xLX05CTENLKTsKKyAgICBpbnNlcnRpbnQoZCwgIkxLX05CUkxDSyIsIF9MS19OQlJMQ0spOworICAgIGluc2VydGludChkLCAiTEtfUkxDSyIsIF9MS19STENLKTsKKyAgICBpbnNlcnRpbnQoZCwgIkxLX1VOTENLIiwgX0xLX1VOTENLKTsKIAotCS8qIGNvbnN0YW50cyBmb3IgdGhlIGNydCB2ZXJzaW9ucyAqLworICAgIC8qIGNvbnN0YW50cyBmb3IgdGhlIGNydCB2ZXJzaW9ucyAqLwogI2lmZGVmIF9WQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTgotCXN0ID0gUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIlZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOIiwKLQkJCQkJX1ZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOKTsKLQlpZiAoc3QgPCAwKXJldHVybjsKKyAgICBzdCA9IFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJWQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVkNfQVNTRU1CTFlfUFVCTElDS0VZVE9LRU4pOworICAgIGlmIChzdCA8IDApcmV0dXJuOwogI2VuZGlmCiAjaWZkZWYgX0NSVF9BU1NFTUJMWV9WRVJTSU9OCi0Jc3QgPSBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiQ1JUX0FTU0VNQkxZX1ZFUlNJT04iLAotCQkJCQlfQ1JUX0FTU0VNQkxZX1ZFUlNJT04pOwotCWlmIChzdCA8IDApcmV0dXJuOworICAgIHN0ID0gUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIkNSVF9BU1NFTUJMWV9WRVJTSU9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DUlRfQVNTRU1CTFlfVkVSU0lPTik7CisgICAgaWYgKHN0IDwgMClyZXR1cm47CiAjZW5kaWYKICNpZmRlZiBfX0xJQlJBUklFU19BU1NFTUJMWV9OQU1FX1BSRUZJWAotCXN0ID0gUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIkxJQlJBUklFU19BU1NFTUJMWV9OQU1FX1BSRUZJWCIsCi0JCQkJCV9fTElCUkFSSUVTX0FTU0VNQkxZX05BTUVfUFJFRklYKTsKLQlpZiAoc3QgPCAwKXJldHVybjsKKyAgICBzdCA9IFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJMSUJSQVJJRVNfQVNTRU1CTFlfTkFNRV9QUkVGSVgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19MSUJSQVJJRVNfQVNTRU1CTFlfTkFNRV9QUkVGSVgpOworICAgIGlmIChzdCA8IDApcmV0dXJuOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9QQy9vczJlbXgvY29uZmlnLmMgYi9QQy9vczJlbXgvY29uZmlnLmMKaW5kZXggNDA4MzgxYy4uY2JhYjI1YyAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L2NvbmZpZy5jCisrKyBiL1BDL29zMmVteC9jb25maWcuYwpAQCAtMTAyLDgxICsxMDIsODEgQEAKIAogc3RydWN0IF9pbml0dGFiIF9QeUltcG9ydF9Jbml0dGFiW10gPSB7CiAKLQl7Im9zMiIsIGluaXRvczJ9LAotCXsic2lnbmFsIiwgaW5pdHNpZ25hbH0sCisgICAgeyJvczIiLCBpbml0b3MyfSwKKyAgICB7InNpZ25hbCIsIGluaXRzaWduYWx9LAogI2lmZGVmIFdJVEhfVEhSRUFECi0JeyJ0aHJlYWQiLCBpbml0dGhyZWFkfSwKKyAgICB7InRocmVhZCIsIGluaXR0aHJlYWR9LAogI2VuZGlmCi0JeyJfY29kZWNzIiwgaW5pdF9jb2RlY3N9LAotCXsiX2NzdiIsIGluaXRfY3N2fSwKLQl7Il9sb2NhbGUiLCBpbml0X2xvY2FsZX0sCi0JeyJfcmFuZG9tIiwgaW5pdF9yYW5kb219LAotCXsiX3NyZSIsIGluaXRfc3JlfSwKLQl7Il9zeW10YWJsZSIsIGluaXRfc3ltdGFibGV9LAotCXsiX3dlYWtyZWYiLCBpbml0X3dlYWtyZWZ9LAotCXsiYXJyYXkiLCBpbml0YXJyYXl9LAotCXsiYmluYXNjaWkiLCBpbml0YmluYXNjaWl9LAotCXsiY1BpY2tsZSIsIGluaXRjUGlja2xlfSwKLQl7ImNTdHJpbmdJTyIsIGluaXRjU3RyaW5nSU99LAotCXsiX2NvbGxlY3Rpb25zIiwgaW5pdF9jb2xsZWN0aW9uc30sCi0JeyJjbWF0aCIsIGluaXRjbWF0aH0sCi0JeyJkYXRldGltZSIsIGluaXRkYXRldGltZX0sCi0JeyJkbCIsIGluaXRkbH0sCi0JeyJlcnJubyIsIGluaXRlcnJub30sCi0JeyJmY250bCIsIGluaXRmY250bH0sCi0JeyJfZmlsZWlvIiwgaW5pdF9maWxlaW99LAotCXsiX2Z1bmN0b29scyIsIGluaXRfZnVuY3Rvb2xzfSwKLQl7Il9oZWFwcSIsIGluaXRfaGVhcHF9LAotCXsiaW1hZ2VvcCIsIGluaXRpbWFnZW9wfSwKLQl7Iml0ZXJ0b29scyIsIGluaXRpdGVydG9vbHN9LAotCXsibWF0aCIsIGluaXRtYXRofSwKLQl7Il9tZDUiLCBpbml0X21kNX0sCi0JeyJvcGVyYXRvciIsIGluaXRvcGVyYXRvcn0sCi0JeyJfc2hhIiwgaW5pdF9zaGF9LAotCXsiX3NoYTI1NiIsIGluaXRfc2hhMjU2fSwKLQl7Il9zaGE1MTIiLCBpbml0X3NoYTUxMn0sCi0JeyJzdHJvcCIsIGluaXRzdHJvcH0sCi0JeyJfc3RydWN0IiwgaW5pdF9zdHJ1Y3R9LAotCXsidGVybWlvcyIsIGluaXR0ZXJtaW9zfSwKLQl7InRpbWUiLCBpbml0dGltZX0sCi0JeyJ0aW1pbmciLCBpbml0dGltaW5nfSwKLQl7Inh4c3VidHlwZSIsIGluaXR4eHN1YnR5cGV9LAotCXsiemlwaW1wb3J0IiwgaW5pdHppcGltcG9ydH0sCisgICAgeyJfY29kZWNzIiwgaW5pdF9jb2RlY3N9LAorICAgIHsiX2NzdiIsIGluaXRfY3N2fSwKKyAgICB7Il9sb2NhbGUiLCBpbml0X2xvY2FsZX0sCisgICAgeyJfcmFuZG9tIiwgaW5pdF9yYW5kb219LAorICAgIHsiX3NyZSIsIGluaXRfc3JlfSwKKyAgICB7Il9zeW10YWJsZSIsIGluaXRfc3ltdGFibGV9LAorICAgIHsiX3dlYWtyZWYiLCBpbml0X3dlYWtyZWZ9LAorICAgIHsiYXJyYXkiLCBpbml0YXJyYXl9LAorICAgIHsiYmluYXNjaWkiLCBpbml0YmluYXNjaWl9LAorICAgIHsiY1BpY2tsZSIsIGluaXRjUGlja2xlfSwKKyAgICB7ImNTdHJpbmdJTyIsIGluaXRjU3RyaW5nSU99LAorICAgIHsiX2NvbGxlY3Rpb25zIiwgaW5pdF9jb2xsZWN0aW9uc30sCisgICAgeyJjbWF0aCIsIGluaXRjbWF0aH0sCisgICAgeyJkYXRldGltZSIsIGluaXRkYXRldGltZX0sCisgICAgeyJkbCIsIGluaXRkbH0sCisgICAgeyJlcnJubyIsIGluaXRlcnJub30sCisgICAgeyJmY250bCIsIGluaXRmY250bH0sCisgICAgeyJfZmlsZWlvIiwgaW5pdF9maWxlaW99LAorICAgIHsiX2Z1bmN0b29scyIsIGluaXRfZnVuY3Rvb2xzfSwKKyAgICB7Il9oZWFwcSIsIGluaXRfaGVhcHF9LAorICAgIHsiaW1hZ2VvcCIsIGluaXRpbWFnZW9wfSwKKyAgICB7Iml0ZXJ0b29scyIsIGluaXRpdGVydG9vbHN9LAorICAgIHsibWF0aCIsIGluaXRtYXRofSwKKyAgICB7Il9tZDUiLCBpbml0X21kNX0sCisgICAgeyJvcGVyYXRvciIsIGluaXRvcGVyYXRvcn0sCisgICAgeyJfc2hhIiwgaW5pdF9zaGF9LAorICAgIHsiX3NoYTI1NiIsIGluaXRfc2hhMjU2fSwKKyAgICB7Il9zaGE1MTIiLCBpbml0X3NoYTUxMn0sCisgICAgeyJzdHJvcCIsIGluaXRzdHJvcH0sCisgICAgeyJfc3RydWN0IiwgaW5pdF9zdHJ1Y3R9LAorICAgIHsidGVybWlvcyIsIGluaXR0ZXJtaW9zfSwKKyAgICB7InRpbWUiLCBpbml0dGltZX0sCisgICAgeyJ0aW1pbmciLCBpbml0dGltaW5nfSwKKyAgICB7Inh4c3VidHlwZSIsIGluaXR4eHN1YnR5cGV9LAorICAgIHsiemlwaW1wb3J0IiwgaW5pdHppcGltcG9ydH0sCiAjaWYgIUhBVkVfRFlOQU1JQ19MT0FESU5HCi0JeyJfY3Vyc2VzIiwgaW5pdF9jdXJzZXN9LAotCXsiX2N1cnNlc19wYW5lbCIsIGluaXRfY3Vyc2VzX3BhbmVsfSwKLQl7Il9ob3RzaG90IiwgaW5pdF9ob3RzaG90fSwKLQl7Il90ZXN0Y2FwaSIsIGluaXRfdGVzdGNhcGl9LAotCXsiYnNkZGIxODUiLCBpbml0YnNkZGIxODV9LAotCXsiYnoyIiwgaW5pdGJ6Mn0sCi0JeyJmcGVjdGwiLCBpbml0ZnBlY3RsfSwKLQl7ImZwZXRlc3QiLCBpbml0ZnBldGVzdH0sCi0JeyJwYXJzZXIiLCBpbml0cGFyc2VyfSwKLQl7InB3ZCIsIGluaXRwd2R9LAotCXsidW5pY29kZWRhdGEiLCBpbml0dW5pY29kZWRhdGF9LAotCXsiemxpYiIsIGluaXR6bGlifSwKKyAgICB7Il9jdXJzZXMiLCBpbml0X2N1cnNlc30sCisgICAgeyJfY3Vyc2VzX3BhbmVsIiwgaW5pdF9jdXJzZXNfcGFuZWx9LAorICAgIHsiX2hvdHNob3QiLCBpbml0X2hvdHNob3R9LAorICAgIHsiX3Rlc3RjYXBpIiwgaW5pdF90ZXN0Y2FwaX0sCisgICAgeyJic2RkYjE4NSIsIGluaXRic2RkYjE4NX0sCisgICAgeyJiejIiLCBpbml0YnoyfSwKKyAgICB7ImZwZWN0bCIsIGluaXRmcGVjdGx9LAorICAgIHsiZnBldGVzdCIsIGluaXRmcGV0ZXN0fSwKKyAgICB7InBhcnNlciIsIGluaXRwYXJzZXJ9LAorICAgIHsicHdkIiwgaW5pdHB3ZH0sCisgICAgeyJ1bmljb2RlZGF0YSIsIGluaXR1bmljb2RlZGF0YX0sCisgICAgeyJ6bGliIiwgaW5pdHpsaWJ9LAogI2lmZGVmIFVTRV9TT0NLRVQKLQl7Il9zb2NrZXQiLCBpbml0X3NvY2tldH0sCi0JeyJzZWxlY3QiLCBpbml0c2VsZWN0fSwKKyAgICB7Il9zb2NrZXQiLCBpbml0X3NvY2tldH0sCisgICAgeyJzZWxlY3QiLCBpbml0c2VsZWN0fSwKICNlbmRpZgogI2VuZGlmCiAvKiAtLSBBRERNT0RVTEUgTUFSS0VSIDIgLS0gKi8KIAotCS8qIFRoaXMgbW9kdWxlICJsaXZlcyBpbiIgd2l0aCBtYXJzaGFsLmMgKi8KLQl7Im1hcnNoYWwiLCBQeU1hcnNoYWxfSW5pdH0sCisgICAgLyogVGhpcyBtb2R1bGUgImxpdmVzIGluIiB3aXRoIG1hcnNoYWwuYyAqLworICAgIHsibWFyc2hhbCIsIFB5TWFyc2hhbF9Jbml0fSwKIAotCS8qIFRoaXMgbGl2ZXMgaXQgd2l0aCBpbXBvcnQuYyAqLwotCXsiaW1wIiwgaW5pdGltcH0sCisgICAgLyogVGhpcyBsaXZlcyBpdCB3aXRoIGltcG9ydC5jICovCisgICAgeyJpbXAiLCBpbml0aW1wfSwKIAotCS8qIFRoZXNlIGVudHJpZXMgYXJlIGhlcmUgZm9yIHN5cy5idWlsdGluX21vZHVsZV9uYW1lcyAqLwotCXsiX19tYWluX18iLCBOVUxMfSwKLQl7Il9fYnVpbHRpbl9fIiwgTlVMTH0sCi0JeyJzeXMiLCBOVUxMfSwKLQl7ImV4Y2VwdGlvbnMiLCBOVUxMfSwKKyAgICAvKiBUaGVzZSBlbnRyaWVzIGFyZSBoZXJlIGZvciBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMgKi8KKyAgICB7Il9fbWFpbl9fIiwgTlVMTH0sCisgICAgeyJfX2J1aWx0aW5fXyIsIE5VTEx9LAorICAgIHsic3lzIiwgTlVMTH0sCisgICAgeyJleGNlcHRpb25zIiwgTlVMTH0sCiAKLQkvKiBUaGlzIGxpdmVzIGluIGdjbW9kdWxlLmMgKi8KLQl7ImdjIiwgaW5pdGdjfSwKKyAgICAvKiBUaGlzIGxpdmVzIGluIGdjbW9kdWxlLmMgKi8KKyAgICB7ImdjIiwgaW5pdGdjfSwKIAotCS8qIFNlbnRpbmVsICovCi0JezAsIDB9CisgICAgLyogU2VudGluZWwgKi8KKyAgICB7MCwgMH0KIH07CmRpZmYgLS1naXQgYS9QQy9vczJlbXgvZGxmY24uYyBiL1BDL29zMmVteC9kbGZjbi5jCmluZGV4IDllODhkNWUuLjQ3YzA0NmMgMTAwNjQ0Ci0tLSBhL1BDL29zMmVteC9kbGZjbi5jCisrKyBiL1BDL29zMmVteC9kbGZjbi5jCkBAIC00NiwxNzggKzQ2LDE3OCBAQAogI2luY2x1ZGUgPG1hbGxvYy5oPgogCiB0eXBlZGVmIHN0cnVjdCBfdHJhY2tfcmVjIHsKLQljaGFyICpuYW1lOwotCUhNT0RVTEUgaGFuZGxlOwotCXZvaWQgKmlkOwotCXN0cnVjdCBfdHJhY2tfcmVjICpuZXh0OworICAgIGNoYXIgKm5hbWU7CisgICAgSE1PRFVMRSBoYW5kbGU7CisgICAgdm9pZCAqaWQ7CisgICAgc3RydWN0IF90cmFja19yZWMgKm5leHQ7CiB9IHRETExjaGFpbiwgKkRMTGNoYWluOwogCi1zdGF0aWMgRExMY2hhaW4gZGxsb2FkID0gTlVMTDsJLyogQSBzaW1wbGUgY2hhaW5lZCBsaXN0IG9mIERMTCBuYW1lcyAqLwotc3RhdGljIGNoYXIgZGxlcnIgWzI1Nl07CS8qIGxhc3QgZXJyb3IgdGV4dCBzdHJpbmcgKi8KK3N0YXRpYyBETExjaGFpbiBkbGxvYWQgPSBOVUxMOyAgLyogQSBzaW1wbGUgY2hhaW5lZCBsaXN0IG9mIERMTCBuYW1lcyAqLworc3RhdGljIGNoYXIgZGxlcnIgWzI1Nl07ICAgICAgICAvKiBsYXN0IGVycm9yIHRleHQgc3RyaW5nICovCiBzdGF0aWMgdm9pZCAqbGFzdF9pZDsKIAogc3RhdGljIERMTGNoYWluIGZpbmRfaWQodm9pZCAqaWQpCiB7Ci0JRExMY2hhaW4gdG1wOworICAgIERMTGNoYWluIHRtcDsKIAotCWZvciAodG1wID0gZGxsb2FkOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKLQkJaWYgKGlkID09IHRtcC0+aWQpCi0JCQlyZXR1cm4gdG1wOworICAgIGZvciAodG1wID0gZGxsb2FkOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkKKyAgICAgICAgaWYgKGlkID09IHRtcC0+aWQpCisgICAgICAgICAgICByZXR1cm4gdG1wOwogCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIGxvYWQgYSBkeW5hbWljLWxpbmsgbGlicmFyeSBhbmQgcmV0dXJuIGhhbmRsZSAqLwogdm9pZCAqZGxvcGVuKGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MpCiB7Ci0JSE1PRFVMRSBobTsKLQlETExjaGFpbiB0bXA7Ci0JY2hhciBlcnJbMjU2XTsKLQljaGFyICplcnJ0eHQ7Ci0JaW50IHJjID0gMCwgc2V0X2NoYWluID0gMDsKKyAgICBITU9EVUxFIGhtOworICAgIERMTGNoYWluIHRtcDsKKyAgICBjaGFyIGVyclsyNTZdOworICAgIGNoYXIgKmVycnR4dDsKKyAgICBpbnQgcmMgPSAwLCBzZXRfY2hhaW4gPSAwOwogCi0JZm9yICh0bXAgPSBkbGxvYWQ7IHRtcDsgdG1wID0gdG1wLT5uZXh0KQotCQlpZiAoc3RybmljbXAodG1wLT5uYW1lLCBmaWxlbmFtZSwgOTk5KSA9PSAwKQotCQkJYnJlYWs7CisgICAgZm9yICh0bXAgPSBkbGxvYWQ7IHRtcDsgdG1wID0gdG1wLT5uZXh0KQorICAgICAgICBpZiAoc3RybmljbXAodG1wLT5uYW1lLCBmaWxlbmFtZSwgOTk5KSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CiAKLQlpZiAoIXRtcCkKLQl7Ci0JCXRtcCA9IChETExjaGFpbikgbWFsbG9jKHNpemVvZih0RExMY2hhaW4pKTsKLQkJaWYgKCF0bXApCi0JCQlnb3RvIG5vbWVtOwotCQl0bXAtPm5hbWUgPSBzdHJkdXAoZmlsZW5hbWUpOwotCQl0bXAtPm5leHQgPSBkbGxvYWQ7Ci0JCXNldF9jaGFpbiA9IDE7Ci0JfQorICAgIGlmICghdG1wKQorICAgIHsKKyAgICAgICAgdG1wID0gKERMTGNoYWluKSBtYWxsb2Moc2l6ZW9mKHRETExjaGFpbikpOworICAgICAgICBpZiAoIXRtcCkKKyAgICAgICAgICAgIGdvdG8gbm9tZW07CisgICAgICAgIHRtcC0+bmFtZSA9IHN0cmR1cChmaWxlbmFtZSk7CisgICAgICAgIHRtcC0+bmV4dCA9IGRsbG9hZDsKKyAgICAgICAgc2V0X2NoYWluID0gMTsKKyAgICB9CiAKLQlzd2l0Y2ggKHJjID0gRG9zTG9hZE1vZHVsZSgoUFNaKSZlcnIsIHNpemVvZihlcnIpLCBmaWxlbmFtZSwgJmhtKSkKLQl7Ci0JCWNhc2UgTk9fRVJST1I6Ci0JCQl0bXAtPmhhbmRsZSA9IGhtOwotCQkJaWYgKHNldF9jaGFpbikKLQkJCXsKLQkJCQlkbwotCQkJCQlsYXN0X2lkKys7Ci0JCQkJd2hpbGUgKChsYXN0X2lkID09IDApIHx8IChmaW5kX2lkKGxhc3RfaWQpKSk7Ci0JCQkJdG1wLT5pZCA9IGxhc3RfaWQ7Ci0JCQkJZGxsb2FkID0gdG1wOwotCQkJfQotCQkJcmV0dXJuIHRtcC0+aWQ7Ci0JCWNhc2UgRVJST1JfRklMRV9OT1RfRk9VTkQ6Ci0JCWNhc2UgRVJST1JfUEFUSF9OT1RfRk9VTkQ6Ci0JCQllcnJ0eHQgPSAibW9kdWxlIGAlcycgbm90IGZvdW5kIjsKLQkJCWJyZWFrOwotCQljYXNlIEVSUk9SX1RPT19NQU5ZX09QRU5fRklMRVM6Ci0JCWNhc2UgRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk6Ci0JCWNhc2UgRVJST1JfU0hBUklOR19CVUZGRVJfRVhDRUVERUQ6CisgICAgc3dpdGNoIChyYyA9IERvc0xvYWRNb2R1bGUoKFBTWikmZXJyLCBzaXplb2YoZXJyKSwgZmlsZW5hbWUsICZobSkpCisgICAgeworICAgICAgICBjYXNlIE5PX0VSUk9SOgorICAgICAgICAgICAgdG1wLT5oYW5kbGUgPSBobTsKKyAgICAgICAgICAgIGlmIChzZXRfY2hhaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgbGFzdF9pZCsrOworICAgICAgICAgICAgICAgIHdoaWxlICgobGFzdF9pZCA9PSAwKSB8fCAoZmluZF9pZChsYXN0X2lkKSkpOworICAgICAgICAgICAgICAgIHRtcC0+aWQgPSBsYXN0X2lkOworICAgICAgICAgICAgICAgIGRsbG9hZCA9IHRtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0bXAtPmlkOworICAgICAgICBjYXNlIEVSUk9SX0ZJTEVfTk9UX0ZPVU5EOgorICAgICAgICBjYXNlIEVSUk9SX1BBVEhfTk9UX0ZPVU5EOgorICAgICAgICAgICAgZXJydHh0ID0gIm1vZHVsZSBgJXMnIG5vdCBmb3VuZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFUlJPUl9UT09fTUFOWV9PUEVOX0ZJTEVTOgorICAgICAgICBjYXNlIEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZOgorICAgICAgICBjYXNlIEVSUk9SX1NIQVJJTkdfQlVGRkVSX0VYQ0VFREVEOgogbm9tZW06Ci0JCQllcnJ0eHQgPSAib3V0IG9mIHN5c3RlbSByZXNvdXJjZXMiOwotCQkJYnJlYWs7Ci0JCWNhc2UgRVJST1JfQUNDRVNTX0RFTklFRDoKLQkJCWVycnR4dCA9ICJhY2Nlc3MgZGVuaWVkIjsKLQkJCWJyZWFrOwotCQljYXNlIEVSUk9SX0JBRF9GT1JNQVQ6Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9TRUdNRU5UX05VTUJFUjoKLQkJY2FzZSBFUlJPUl9JTlZBTElEX09SRElOQUw6Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9NT0RVTEVUWVBFOgotCQljYXNlIEVSUk9SX0lOVkFMSURfRVhFX1NJR05BVFVSRToKLQkJY2FzZSBFUlJPUl9FWEVfTUFSS0VEX0lOVkFMSUQ6Ci0JCWNhc2UgRVJST1JfSVRFUkFURURfREFUQV9FWENFRURTXzY0SzoKLQkJY2FzZSBFUlJPUl9JTlZBTElEX01JTkFMTE9DU0laRToKLQkJY2FzZSBFUlJPUl9JTlZBTElEX1NFR0RQTDoKLQkJY2FzZSBFUlJPUl9BVVRPREFUQVNFR19FWENFRURTXzY0SzoKLQkJY2FzZSBFUlJPUl9SRUxPQ1NSQ19DSEFJTl9FWENFRURTX1NFR0xJTUlUOgotCQkJZXJydHh0ID0gImludmFsaWQgbW9kdWxlIGZvcm1hdCI7Ci0JCQlicmVhazsKLQkJY2FzZSBFUlJPUl9JTlZBTElEX05BTUU6Ci0JCQllcnJ0eHQgPSAiZmlsZW5hbWUgZG9lc24ndCBtYXRjaCBtb2R1bGUgbmFtZSI7Ci0JCQlicmVhazsKLQkJY2FzZSBFUlJPUl9TSEFSSU5HX1ZJT0xBVElPTjoKLQkJY2FzZSBFUlJPUl9MT0NLX1ZJT0xBVElPTjoKLQkJCWVycnR4dCA9ICJzaGFyaW5nIHZpb2xhdGlvbiI7Ci0JCQlicmVhazsKLQkJY2FzZSBFUlJPUl9JTklUX1JPVVRJTkVfRkFJTEVEOgotCQkJZXJydHh0ID0gIm1vZHVsZSBpbml0aWFsaXphdGlvbiBmYWlsZWQiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQllcnJ0eHQgPSAiY2F1c2UgYCVzJywgZXJyb3IgY29kZSA9ICVkIjsKLQkJCWJyZWFrOwotCX0KLQlzbnByaW50ZihkbGVyciwgc2l6ZW9mKGRsZXJyKSwgZXJydHh0LCAmZXJyLCByYyk7Ci0JaWYgKHRtcCkKLQl7Ci0JCWlmICh0bXAtPm5hbWUpCi0JCQlmcmVlKHRtcC0+bmFtZSk7Ci0JCWZyZWUodG1wKTsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgICAgICBlcnJ0eHQgPSAib3V0IG9mIHN5c3RlbSByZXNvdXJjZXMiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVJST1JfQUNDRVNTX0RFTklFRDoKKyAgICAgICAgICAgIGVycnR4dCA9ICJhY2Nlc3MgZGVuaWVkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVSUk9SX0JBRF9GT1JNQVQ6CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9TRUdNRU5UX05VTUJFUjoKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX09SRElOQUw6CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9NT0RVTEVUWVBFOgorICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfRVhFX1NJR05BVFVSRToKKyAgICAgICAgY2FzZSBFUlJPUl9FWEVfTUFSS0VEX0lOVkFMSUQ6CisgICAgICAgIGNhc2UgRVJST1JfSVRFUkFURURfREFUQV9FWENFRURTXzY0SzoKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX01JTkFMTE9DU0laRToKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX1NFR0RQTDoKKyAgICAgICAgY2FzZSBFUlJPUl9BVVRPREFUQVNFR19FWENFRURTXzY0SzoKKyAgICAgICAgY2FzZSBFUlJPUl9SRUxPQ1NSQ19DSEFJTl9FWENFRURTX1NFR0xJTUlUOgorICAgICAgICAgICAgZXJydHh0ID0gImludmFsaWQgbW9kdWxlIGZvcm1hdCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX05BTUU6CisgICAgICAgICAgICBlcnJ0eHQgPSAiZmlsZW5hbWUgZG9lc24ndCBtYXRjaCBtb2R1bGUgbmFtZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFUlJPUl9TSEFSSU5HX1ZJT0xBVElPTjoKKyAgICAgICAgY2FzZSBFUlJPUl9MT0NLX1ZJT0xBVElPTjoKKyAgICAgICAgICAgIGVycnR4dCA9ICJzaGFyaW5nIHZpb2xhdGlvbiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFUlJPUl9JTklUX1JPVVRJTkVfRkFJTEVEOgorICAgICAgICAgICAgZXJydHh0ID0gIm1vZHVsZSBpbml0aWFsaXphdGlvbiBmYWlsZWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnJ0eHQgPSAiY2F1c2UgYCVzJywgZXJyb3IgY29kZSA9ICVkIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzbnByaW50ZihkbGVyciwgc2l6ZW9mKGRsZXJyKSwgZXJydHh0LCAmZXJyLCByYyk7CisgICAgaWYgKHRtcCkKKyAgICB7CisgICAgICAgIGlmICh0bXAtPm5hbWUpCisgICAgICAgICAgICBmcmVlKHRtcC0+bmFtZSk7CisgICAgICAgIGZyZWUodG1wKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGBzeW1ib2wnIGluIERMTCAqLwogdm9pZCAqZGxzeW0odm9pZCAqaGFuZGxlLCBjaGFyICpzeW1ib2wpCiB7Ci0JaW50IHJjID0gMDsKLQlQRk4gYWRkcjsKLQljaGFyICplcnJ0eHQ7Ci0JaW50IHN5bW9yZCA9IDA7Ci0JRExMY2hhaW4gdG1wID0gZmluZF9pZChoYW5kbGUpOworICAgIGludCByYyA9IDA7CisgICAgUEZOIGFkZHI7CisgICAgY2hhciAqZXJydHh0OworICAgIGludCBzeW1vcmQgPSAwOworICAgIERMTGNoYWluIHRtcCA9IGZpbmRfaWQoaGFuZGxlKTsKIAotCWlmICghdG1wKQotCQlnb3RvIGludl9oYW5kbGU7CisgICAgaWYgKCF0bXApCisgICAgICAgIGdvdG8gaW52X2hhbmRsZTsKIAotCWlmICgqc3ltYm9sID09ICcjJykKLQkJc3ltb3JkID0gYXRvaShzeW1ib2wgKyAxKTsKKyAgICBpZiAoKnN5bWJvbCA9PSAnIycpCisgICAgICAgIHN5bW9yZCA9IGF0b2koc3ltYm9sICsgMSk7CiAKLQlzd2l0Y2ggKHJjID0gRG9zUXVlcnlQcm9jQWRkcih0bXAtPmhhbmRsZSwgc3ltb3JkLCBzeW1ib2wsICZhZGRyKSkKLQl7Ci0JCWNhc2UgTk9fRVJST1I6Ci0JCQlyZXR1cm4gKHZvaWQgKilhZGRyOwotCQljYXNlIEVSUk9SX0lOVkFMSURfSEFORExFOgorICAgIHN3aXRjaCAocmMgPSBEb3NRdWVyeVByb2NBZGRyKHRtcC0+aGFuZGxlLCBzeW1vcmQsIHN5bWJvbCwgJmFkZHIpKQorICAgIHsKKyAgICAgICAgY2FzZSBOT19FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiAodm9pZCAqKWFkZHI7CisgICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9IQU5ETEU6CiBpbnZfaGFuZGxlOgotCQkJZXJydHh0ID0gImludmFsaWQgbW9kdWxlIGhhbmRsZSI7Ci0JCQlicmVhazsKLQkJY2FzZSBFUlJPUl9QUk9DX05PVF9GT1VORDoKLQkJY2FzZSBFUlJPUl9JTlZBTElEX05BTUU6Ci0JCQllcnJ0eHQgPSAibm8gc3ltYm9sIGAlcycgaW4gbW9kdWxlIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZXJydHh0ID0gInN5bWJvbCBgJXMnLCBlcnJvciBjb2RlID0gJWQiOwotCQkJYnJlYWs7Ci0JfQotCXNucHJpbnRmKGRsZXJyLCBzaXplb2YoZGxlcnIpLCBlcnJ0eHQsIHN5bWJvbCwgcmMpOwotCXJldHVybiBOVUxMOworICAgICAgICAgICAgZXJydHh0ID0gImludmFsaWQgbW9kdWxlIGhhbmRsZSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFUlJPUl9QUk9DX05PVF9GT1VORDoKKyAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX05BTUU6CisgICAgICAgICAgICBlcnJ0eHQgPSAibm8gc3ltYm9sIGAlcycgaW4gbW9kdWxlIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZXJydHh0ID0gInN5bWJvbCBgJXMnLCBlcnJvciBjb2RlID0gJWQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHNucHJpbnRmKGRsZXJyLCBzaXplb2YoZGxlcnIpLCBlcnJ0eHQsIHN5bWJvbCwgcmMpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBmcmVlIGR5bmFtaWNhbHktbGlua2VkIGxpYnJhcnkgKi8KIGludCBkbGNsb3NlKHZvaWQgKmhhbmRsZSkKIHsKLQlpbnQgcmM7Ci0JRExMY2hhaW4gdG1wID0gZmluZF9pZChoYW5kbGUpOworICAgIGludCByYzsKKyAgICBETExjaGFpbiB0bXAgPSBmaW5kX2lkKGhhbmRsZSk7CiAKLQlpZiAoIXRtcCkKLQkJZ290byBpbnZfaGFuZGxlOworICAgIGlmICghdG1wKQorICAgICAgICBnb3RvIGludl9oYW5kbGU7CiAKLQlzd2l0Y2ggKHJjID0gRG9zRnJlZU1vZHVsZSh0bXAtPmhhbmRsZSkpCi0JewotCQljYXNlIE5PX0VSUk9SOgotCQkJZnJlZSh0bXAtPm5hbWUpOwotCQkJZGxsb2FkID0gdG1wLT5uZXh0OwotCQkJZnJlZSh0bXApOwotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgRVJST1JfSU5WQUxJRF9IQU5ETEU6CisgICAgc3dpdGNoIChyYyA9IERvc0ZyZWVNb2R1bGUodG1wLT5oYW5kbGUpKQorICAgIHsKKyAgICAgICAgY2FzZSBOT19FUlJPUjoKKyAgICAgICAgICAgIGZyZWUodG1wLT5uYW1lKTsKKyAgICAgICAgICAgIGRsbG9hZCA9IHRtcC0+bmV4dDsKKyAgICAgICAgICAgIGZyZWUodG1wKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfSEFORExFOgogaW52X2hhbmRsZToKLQkJCXN0cmNweShkbGVyciwgImludmFsaWQgbW9kdWxlIGhhbmRsZSIpOwotCQkJcmV0dXJuIC0xOwotCQljYXNlIEVSUk9SX0lOVkFMSURfQUNDRVNTOgotCQkJc3RyY3B5KGRsZXJyLCAiYWNjZXNzIGRlbmllZCIpOwotCQkJcmV0dXJuIC0xOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC0xOwotCX0KKyAgICAgICAgICAgIHN0cmNweShkbGVyciwgImludmFsaWQgbW9kdWxlIGhhbmRsZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIEVSUk9SX0lOVkFMSURfQUNDRVNTOgorICAgICAgICAgICAgc3RyY3B5KGRsZXJyLCAiYWNjZXNzIGRlbmllZCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogLyogcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgbGFzdCBvY2N1cnJlZCBkbCBlcnJvciAqLwogY2hhciAqZGxlcnJvcigpCiB7Ci0JcmV0dXJuIGRsZXJyOworICAgIHJldHVybiBkbGVycjsKIH0KZGlmZiAtLWdpdCBhL1BDL29zMmVteC9kbGxlbnRyeS5jIGIvUEMvb3MyZW14L2RsbGVudHJ5LmMKaW5kZXggZGJmOWM5OC4uOWNjY2ExYyAxMDA2NDQKLS0tIGEvUEMvb3MyZW14L2RsbGVudHJ5LmMKKysrIGIvUEMvb3MyZW14L2RsbGVudHJ5LmMKQEAgLTQsNyArNCw3IEBACiAKICNkZWZpbmUgTlVMTCAwCiAKLSNkZWZpbmUgUkVGKHMpCWV4dGVybiB2b2lkIHMoKTsgdm9pZCAqX19fX3JlZl8jI3MgPSAmczsKKyNkZWZpbmUgUkVGKHMpICBleHRlcm4gdm9pZCBzKCk7IHZvaWQgKl9fX19yZWZfIyNzID0gJnM7CiAKIC8qIE1ha2UgcmVmZXJlbmNlcyB0byBpbXBvcnRlZCBzeW1ib2xzIHRvIHB1bGwgdGhlbSBmcm9tIHN0YXRpYyBsaWJyYXJ5ICovCiBSRUYoUHlfTWFpbik7CkBAIC0xOCwyNSArMTgsMjUgQEAKIAogdW5zaWduZWQgbG9uZyBfRExMX0luaXRUZXJtKHVuc2lnbmVkIGxvbmcgbW9kX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBmbGFnKQogewotCXN3aXRjaCAoZmxhZykKLQl7Ci0JCWNhc2UgMDoKLQkJCWlmIChfQ1JUX2luaXQoKSkKLQkJCQlyZXR1cm4gMDsKLQkJCV9fY3RvcmR0b3JJbml0KCk7CisgICAgc3dpdGNoIChmbGFnKQorICAgIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgaWYgKF9DUlRfaW5pdCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgX19jdG9yZHRvckluaXQoKTsKIAotCQkJLyogSWdub3JlIGZhdGFsIHNpZ25hbHMgKi8KLQkJCXNpZ25hbChTSUdTRUdWLCBTSUdfSUdOKTsKLQkJCXNpZ25hbChTSUdGUEUsIFNJR19JR04pOworICAgICAgICAgICAgLyogSWdub3JlIGZhdGFsIHNpZ25hbHMgKi8KKyAgICAgICAgICAgIHNpZ25hbChTSUdTRUdWLCBTSUdfSUdOKTsKKyAgICAgICAgICAgIHNpZ25hbChTSUdGUEUsIFNJR19JR04pOwogCi0JCQlyZXR1cm4gMTsKKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCWNhc2UgMToKLQkJCV9fY3RvcmR0b3JUZXJtKCk7Ci0JCQlfQ1JUX3Rlcm0oKTsKLQkJCXJldHVybiAxOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBfX2N0b3JkdG9yVGVybSgpOworICAgICAgICAgICAgX0NSVF90ZXJtKCk7CisgICAgICAgICAgICByZXR1cm4gMTsKIAotCQlkZWZhdWx0OgotCQkJcmV0dXJuIDA7Ci0JfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L2dldHBhdGhwLmMgYi9QQy9vczJlbXgvZ2V0cGF0aHAuYwppbmRleCA1ODM5ZWFiLi40ZmFhNTA1IDEwMDY0NAotLS0gYS9QQy9vczJlbXgvZ2V0cGF0aHAuYworKysgYi9QQy9vczJlbXgvZ2V0cGF0aHAuYwpAQCAtNCw4ICs0LDggQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgUEFUSCBSVUxFUyBGT1IgT1MvMitFTVg6Ci0gICBUaGlzIGRlc2NyaWJlcyBob3cgc3lzLnBhdGggaXMgZm9ybWVkIG9uIE9TLzIrRU1YLiAgSXQgZGVzY3JpYmVzIHRoZSAKLSAgIGZ1bmN0aW9uYWxpdHksIG5vdCB0aGUgaW1wbGVtZW50YXRpb24gKGllLCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlc2UgCisgICBUaGlzIGRlc2NyaWJlcyBob3cgc3lzLnBhdGggaXMgZm9ybWVkIG9uIE9TLzIrRU1YLiAgSXQgZGVzY3JpYmVzIHRoZQorICAgZnVuY3Rpb25hbGl0eSwgbm90IHRoZSBpbXBsZW1lbnRhdGlvbiAoaWUsIHRoZSBvcmRlciBpbiB3aGljaCB0aGVzZQogICAgYXJlIGFjdHVhbGx5IGZldGNoZWQgaXMgZGlmZmVyZW50KQogCiAgICAqIFB5dGhvbiBhbHdheXMgYWRkcyBhbiBlbXB0eSBlbnRyeSBhdCB0aGUgc3RhcnQsIHdoaWNoIGNvcnJlc3BvbmRzCkBAIC0xNiwxMCArMTYsMTAgQEAKICAgICogV2UgYXR0ZW1wdCB0byBsb2NhdGUgdGhlICJQeXRob24gSG9tZSIgLSBpZiB0aGUgUFlUSE9OSE9NRSBlbnYgdmFyCiAgICAgIGlzIHNldCwgd2UgYmVsaWV2ZSBpdC4gIE90aGVyd2lzZSwgd2UgdXNlIHRoZSBwYXRoIG9mIG91ciBob3N0IC5FWEUncwogICAgICB0byB0cnkgYW5kIGxvY2F0ZSBvdXIgImxhbmRtYXJrIiAobGliXFxvcy5weSkgYW5kIGRlZHVjZSBvdXIgaG9tZS4KLSAgICAgLSBJZiB3ZSBETyBoYXZlIGEgUHl0aG9uIEhvbWU6IFRoZSByZWxldmFudCBzdWItZGlyZWN0b3JpZXMgKExpYiwgCisgICAgIC0gSWYgd2UgRE8gaGF2ZSBhIFB5dGhvbiBIb21lOiBUaGUgcmVsZXZhbnQgc3ViLWRpcmVjdG9yaWVzIChMaWIsCiAgICAgICAgcGxhdC13aW4sIGxpYi10aywgZXRjKSBhcmUgYmFzZWQgb24gdGhlIFB5dGhvbiBIb21lCiAgICAgIC0gSWYgd2UgRE8gTk9UIGhhdmUgYSBQeXRob24gSG9tZSwgdGhlIGNvcmUgUHl0aG9uIFBhdGggaXMKLSAgICAgICBsb2FkZWQgZnJvbSB0aGUgcmVnaXN0cnkuICBUaGlzIGlzIHRoZSBtYWluIFB5dGhvblBhdGgga2V5LCAKKyAgICAgICBsb2FkZWQgZnJvbSB0aGUgcmVnaXN0cnkuICBUaGlzIGlzIHRoZSBtYWluIFB5dGhvblBhdGgga2V5LAogICAgICAgIGFuZCBib3RoIEhLTE0gYW5kIEhLQ1UgYXJlIGNvbWJpbmVkIHRvIGZvcm0gdGhlIHBhdGgpCiAKICAgICogSWZmIC0gd2UgY2FuIG5vdCBsb2NhdGUgdGhlIFB5dGhvbiBIb21lLCBhbmQgaGF2ZSBub3QgaGFkIGEgUFlUSE9OUEFUSApAQCAtMzIsOSArMzIsOSBAQAogICAgIChlaXRoZXIgYW4gaW5zdGFsbGVkIHZlcnNpb24sIG9yIGRpcmVjdGx5IGZyb20gdGhlIFBDYnVpbGQgZGlyZWN0b3J5KSwKICAgICB0aGUgY29yZSBwYXRoIGlzIGRlZHVjZWQuCiAKLSAgKiBXaGVuIFB5dGhvbiBpcyBob3N0ZWQgaW4gYW5vdGhlciBleGUgKGRpZmZlcmVudCBkaXJlY3RvcnksIGVtYmVkZGVkIHZpYSAKKyAgKiBXaGVuIFB5dGhvbiBpcyBob3N0ZWQgaW4gYW5vdGhlciBleGUgKGRpZmZlcmVudCBkaXJlY3RvcnksIGVtYmVkZGVkIHZpYQogICAgIENPTSwgZXRjKSwgdGhlIFB5dGhvbiBIb21lIHdpbGwgbm90IGJlIGRlZHVjZWQsIHNvIHRoZSBjb3JlIHBhdGggZnJvbQotICAgIHRoZSByZWdpc3RyeSBpcyB1c2VkLiAgT3RoZXIgImFwcGxpY2F0aW9uIHBhdGhzICJpbiB0aGUgcmVnaXN0cnkgYXJlIAorICAgIHRoZSByZWdpc3RyeSBpcyB1c2VkLiAgT3RoZXIgImFwcGxpY2F0aW9uIHBhdGhzICJpbiB0aGUgcmVnaXN0cnkgYXJlCiAgICAgYWx3YXlzIHJlYWQuCiAKICAgKiBJZiBQeXRob24gY2FuJ3QgZmluZCBpdHMgaG9tZSBhbmQgdGhlcmUgaXMgbm8gcmVnaXN0cnkgKGVnLCBmcm96ZW4KQEAgLTg1LDEyICs4NSwxMiBAQAogCiAKIHN0YXRpYyBpbnQKLWlzX3NlcChjaGFyIGNoKQkvKiBkZXRlcm1pbmUgaWYgImNoIiBpcyBhIHNlcGFyYXRvciBjaGFyYWN0ZXIgKi8KK2lzX3NlcChjaGFyIGNoKSAvKiBkZXRlcm1pbmUgaWYgImNoIiBpcyBhIHNlcGFyYXRvciBjaGFyYWN0ZXIgKi8KIHsKICNpZmRlZiBBTFRTRVAKLQlyZXR1cm4gY2ggPT0gU0VQIHx8IGNoID09IEFMVFNFUDsKKyAgICByZXR1cm4gY2ggPT0gU0VQIHx8IGNoID09IEFMVFNFUDsKICNlbHNlCi0JcmV0dXJuIGNoID09IFNFUDsKKyAgICByZXR1cm4gY2ggPT0gU0VQOwogI2VuZGlmCiB9CiAKQEAgLTEwMCwzNiArMTAwLDM2IEBACiBzdGF0aWMgdm9pZAogcmVkdWNlKGNoYXIgKmRpcikKIHsKLQlzaXplX3QgaSA9IHN0cmxlbihkaXIpOwotCXdoaWxlIChpID4gMCAmJiAhaXNfc2VwKGRpcltpXSkpCi0JCS0taTsKLQlkaXJbaV0gPSAnXDAnOworICAgIHNpemVfdCBpID0gc3RybGVuKGRpcik7CisgICAgd2hpbGUgKGkgPiAwICYmICFpc19zZXAoZGlyW2ldKSkKKyAgICAgICAgLS1pOworICAgIGRpcltpXSA9ICdcMCc7CiB9Ci0JCisKIHN0YXRpYyBpbnQKIGV4aXN0cyhjaGFyICpmaWxlbmFtZSkKIHsKLQlzdHJ1Y3Qgc3RhdCBidWY7Ci0JcmV0dXJuIHN0YXQoZmlsZW5hbWUsICZidWYpID09IDA7CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHJldHVybiBzdGF0KGZpbGVuYW1lLCAmYnVmKSA9PSAwOwogfQogCiAvKiBJcyBtb2R1bGUgIChjaGVjayBmb3IgLnB5Yy8ucHlvIHRvbykKLSAqIEFzc3VtZXMgJ2ZpbGVuYW1lJyBNQVhQQVRITEVOKzEgYnl0ZXMgbG9uZyAtIAorICogQXNzdW1lcyAnZmlsZW5hbWUnIE1BWFBBVEhMRU4rMSBieXRlcyBsb25nIC0KICAqIG1heSBleHRlbmQgJ2ZpbGVuYW1lJyBieSBvbmUgY2hhcmFjdGVyLgogICovCiBzdGF0aWMgaW50CiBpc21vZHVsZShjaGFyICpmaWxlbmFtZSkKIHsKLQlpZiAoZXhpc3RzKGZpbGVuYW1lKSkKLQkJcmV0dXJuIDE7CisgICAgaWYgKGV4aXN0cyhmaWxlbmFtZSkpCisgICAgICAgIHJldHVybiAxOwogCi0JLyogQ2hlY2sgZm9yIHRoZSBjb21waWxlZCB2ZXJzaW9uIG9mIHByZWZpeC4gKi8KLQlpZiAoc3RybGVuKGZpbGVuYW1lKSA8IE1BWFBBVEhMRU4pIHsKLQkJc3RyY2F0KGZpbGVuYW1lLCBQeV9PcHRpbWl6ZUZsYWcgPyAibyIgOiAiYyIpOwotCQlpZiAoZXhpc3RzKGZpbGVuYW1lKSkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKyAgICAvKiBDaGVjayBmb3IgdGhlIGNvbXBpbGVkIHZlcnNpb24gb2YgcHJlZml4LiAqLworICAgIGlmIChzdHJsZW4oZmlsZW5hbWUpIDwgTUFYUEFUSExFTikgeworICAgICAgICBzdHJjYXQoZmlsZW5hbWUsIFB5X09wdGltaXplRmxhZyA/ICJvIiA6ICJjIik7CisgICAgICAgIGlmIChleGlzdHMoZmlsZW5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAvKiBBZGQgYSBwYXRoIGNvbXBvbmVudCwgYnkgYXBwZW5kaW5nIHN0dWZmIHRvIGJ1ZmZlci4KQEAgLTE0NSwyMSArMTQ1LDIxIEBACiBzdGF0aWMgdm9pZAogam9pbihjaGFyICpidWZmZXIsIGNoYXIgKnN0dWZmKQogewotCXNpemVfdCBuLCBrOwotCWlmIChpc19zZXAoc3R1ZmZbMF0pKQotCQluID0gMDsKLQllbHNlIHsKLQkJbiA9IHN0cmxlbihidWZmZXIpOwotCQlpZiAobiA+IDAgJiYgIWlzX3NlcChidWZmZXJbbi0xXSkgJiYgbiA8IE1BWFBBVEhMRU4pCi0JCQlidWZmZXJbbisrXSA9IFNFUDsKLQl9Ci0JaWYgKG4gPiBNQVhQQVRITEVOKQotCQlQeV9GYXRhbEVycm9yKCJidWZmZXIgb3ZlcmZsb3cgaW4gZ2V0cGF0aHAuYydzIGpvaW5wYXRoKCkiKTsKLQlrID0gc3RybGVuKHN0dWZmKTsKLQlpZiAobiArIGsgPiBNQVhQQVRITEVOKQotCQlrID0gTUFYUEFUSExFTiAtIG47Ci0Jc3RybmNweShidWZmZXIrbiwgc3R1ZmYsIGspOwotCWJ1ZmZlcltuK2tdID0gJ1wwJzsKKyAgICBzaXplX3QgbiwgazsKKyAgICBpZiAoaXNfc2VwKHN0dWZmWzBdKSkKKyAgICAgICAgbiA9IDA7CisgICAgZWxzZSB7CisgICAgICAgIG4gPSBzdHJsZW4oYnVmZmVyKTsKKyAgICAgICAgaWYgKG4gPiAwICYmICFpc19zZXAoYnVmZmVyW24tMV0pICYmIG4gPCBNQVhQQVRITEVOKQorICAgICAgICAgICAgYnVmZmVyW24rK10gPSBTRVA7CisgICAgfQorICAgIGlmIChuID4gTUFYUEFUSExFTikKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiYnVmZmVyIG92ZXJmbG93IGluIGdldHBhdGhwLmMncyBqb2lucGF0aCgpIik7CisgICAgayA9IHN0cmxlbihzdHVmZik7CisgICAgaWYgKG4gKyBrID4gTUFYUEFUSExFTikKKyAgICAgICAgayA9IE1BWFBBVEhMRU4gLSBuOworICAgIHN0cm5jcHkoYnVmZmVyK24sIHN0dWZmLCBrKTsKKyAgICBidWZmZXJbbitrXSA9ICdcMCc7CiB9CiAKIC8qIGdvdGxhbmRtYXJrIG9ubHkgY2FsbGVkIGJ5IHNlYXJjaF9mb3JfcHJlZml4LCB3aGljaCBlbnN1cmVzCkBAIC0xNjksMjE5ICsxNjksMjE5IEBACiBzdGF0aWMgaW50CiBnb3RsYW5kbWFyayhjaGFyICpsYW5kbWFyaykKIHsKLQlpbnQgbiwgb2s7CisgICAgaW50IG4sIG9rOwogCi0JbiA9IHN0cmxlbihwcmVmaXgpOwotCWpvaW4ocHJlZml4LCBsYW5kbWFyayk7Ci0Jb2sgPSBpc21vZHVsZShwcmVmaXgpOwotCXByZWZpeFtuXSA9ICdcMCc7Ci0JcmV0dXJuIG9rOworICAgIG4gPSBzdHJsZW4ocHJlZml4KTsKKyAgICBqb2luKHByZWZpeCwgbGFuZG1hcmspOworICAgIG9rID0gaXNtb2R1bGUocHJlZml4KTsKKyAgICBwcmVmaXhbbl0gPSAnXDAnOworICAgIHJldHVybiBvazsKIH0KIAotLyogYXNzdW1lcyBhcmd2MF9wYXRoIGlzIE1BWFBBVEhMRU4rMSBieXRlcyBsb25nLCBhbHJlYWR5IFwwIHRlcm0nZC4gCisvKiBhc3N1bWVzIGFyZ3YwX3BhdGggaXMgTUFYUEFUSExFTisxIGJ5dGVzIGxvbmcsIGFscmVhZHkgXDAgdGVybSdkLgogICogYXNzdW1wdGlvbiBwcm92aWRlZCBieSBvbmx5IGNhbGxlciwgY2FsY3VsYXRlX3BhdGgoKQogICovCiBzdGF0aWMgaW50CiBzZWFyY2hfZm9yX3ByZWZpeChjaGFyICphcmd2MF9wYXRoLCBjaGFyICpsYW5kbWFyaykKIHsKLQkvKiBTZWFyY2ggZnJvbSBhcmd2MF9wYXRoLCB1bnRpbCBsYW5kbWFyayBpcyBmb3VuZCAqLwotCXN0cmNweShwcmVmaXgsIGFyZ3YwX3BhdGgpOwotCWRvIHsKLQkJaWYgKGdvdGxhbmRtYXJrKGxhbmRtYXJrKSkKLQkJCXJldHVybiAxOwotCQlyZWR1Y2UocHJlZml4KTsKLQl9IHdoaWxlIChwcmVmaXhbMF0pOwotCXJldHVybiAwOworICAgIC8qIFNlYXJjaCBmcm9tIGFyZ3YwX3BhdGgsIHVudGlsIGxhbmRtYXJrIGlzIGZvdW5kICovCisgICAgc3RyY3B5KHByZWZpeCwgYXJndjBfcGF0aCk7CisgICAgZG8geworICAgICAgICBpZiAoZ290bGFuZG1hcmsobGFuZG1hcmspKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJlZHVjZShwcmVmaXgpOworICAgIH0gd2hpbGUgKHByZWZpeFswXSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIHZvaWQKIGdldF9wcm9ncGF0aCh2b2lkKQogewotCWV4dGVybiBjaGFyICpQeV9HZXRQcm9ncmFtTmFtZSh2b2lkKTsKLQljaGFyICpwYXRoID0gZ2V0ZW52KCJQQVRIIik7Ci0JY2hhciAqcHJvZyA9IFB5X0dldFByb2dyYW1OYW1lKCk7CisgICAgZXh0ZXJuIGNoYXIgKlB5X0dldFByb2dyYW1OYW1lKHZvaWQpOworICAgIGNoYXIgKnBhdGggPSBnZXRlbnYoIlBBVEgiKTsKKyAgICBjaGFyICpwcm9nID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKIAotCVBQSUIgcGliOwotCWlmICgoRG9zR2V0SW5mb0Jsb2NrcyhOVUxMLCAmcGliKSA9PSAwKSAmJgotCSAgICAoRG9zUXVlcnlNb2R1bGVOYW1lKHBpYi0+cGliX2htdGUsIHNpemVvZihwcm9ncGF0aCksIHByb2dwYXRoKSA9PSAwKSkKLQkJcmV0dXJuOworICAgIFBQSUIgcGliOworICAgIGlmICgoRG9zR2V0SW5mb0Jsb2NrcyhOVUxMLCAmcGliKSA9PSAwKSAmJgorICAgICAgICAoRG9zUXVlcnlNb2R1bGVOYW1lKHBpYi0+cGliX2htdGUsIHNpemVvZihwcm9ncGF0aCksIHByb2dwYXRoKSA9PSAwKSkKKyAgICAgICAgcmV0dXJuOwogCi0JaWYgKHByb2cgPT0gTlVMTCB8fCAqcHJvZyA9PSAnXDAnKQotCQlwcm9nID0gInB5dGhvbiI7CisgICAgaWYgKHByb2cgPT0gTlVMTCB8fCAqcHJvZyA9PSAnXDAnKQorICAgICAgICBwcm9nID0gInB5dGhvbiI7CiAKLQkvKiBJZiB0aGVyZSBpcyBubyBzbGFzaCBpbiB0aGUgYXJndjAgcGF0aCwgdGhlbiB3ZSBoYXZlIHRvCi0JICogYXNzdW1lIHB5dGhvbiBpcyBvbiB0aGUgdXNlcidzICRQQVRILCBzaW5jZSB0aGVyZSdzIG5vCi0JICogb3RoZXIgd2F5IHRvIGZpbmQgYSBkaXJlY3RvcnkgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLiAgSWYKLQkgKiAkUEFUSCBpc24ndCBleHBvcnRlZCwgeW91IGxvc2UuCi0JICovCisgICAgLyogSWYgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIGFyZ3YwIHBhdGgsIHRoZW4gd2UgaGF2ZSB0bworICAgICAqIGFzc3VtZSBweXRob24gaXMgb24gdGhlIHVzZXIncyAkUEFUSCwgc2luY2UgdGhlcmUncyBubworICAgICAqIG90aGVyIHdheSB0byBmaW5kIGEgZGlyZWN0b3J5IHRvIHN0YXJ0IHRoZSBzZWFyY2ggZnJvbS4gIElmCisgICAgICogJFBBVEggaXNuJ3QgZXhwb3J0ZWQsIHlvdSBsb3NlLgorICAgICAqLwogI2lmZGVmIEFMVFNFUAotCWlmIChzdHJjaHIocHJvZywgU0VQKSB8fCBzdHJjaHIocHJvZywgQUxUU0VQKSkKKyAgICBpZiAoc3RyY2hyKHByb2csIFNFUCkgfHwgc3RyY2hyKHByb2csIEFMVFNFUCkpCiAjZWxzZQotCWlmIChzdHJjaHIocHJvZywgU0VQKSkKKyAgICBpZiAoc3RyY2hyKHByb2csIFNFUCkpCiAjZW5kaWYKLQkJc3RybmNweShwcm9ncGF0aCwgcHJvZywgTUFYUEFUSExFTik7Ci0JZWxzZSBpZiAocGF0aCkgewotCQl3aGlsZSAoMSkgewotCQkJY2hhciAqZGVsaW0gPSBzdHJjaHIocGF0aCwgREVMSU0pOworICAgICAgICBzdHJuY3B5KHByb2dwYXRoLCBwcm9nLCBNQVhQQVRITEVOKTsKKyAgICBlbHNlIGlmIChwYXRoKSB7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBjaGFyICpkZWxpbSA9IHN0cmNocihwYXRoLCBERUxJTSk7CiAKLQkJCWlmIChkZWxpbSkgewotCQkJCXNpemVfdCBsZW4gPSBkZWxpbSAtIHBhdGg7Ci0JCQkJLyogZW5zdXJlIHdlIGNhbid0IG92ZXJ3cml0ZSBidWZmZXIgKi8KKyAgICAgICAgICAgIGlmIChkZWxpbSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBkZWxpbSAtIHBhdGg7CisgICAgICAgICAgICAgICAgLyogZW5zdXJlIHdlIGNhbid0IG92ZXJ3cml0ZSBidWZmZXIgKi8KICNpZiAhZGVmaW5lZChQWUNDX0dDQykKLQkJCQlsZW4gPSBtaW4oTUFYUEFUSExFTixsZW4pOworICAgICAgICAgICAgICAgIGxlbiA9IG1pbihNQVhQQVRITEVOLGxlbik7CiAjZWxzZQotCQkJCWxlbiA9IE1BWFBBVEhMRU4gPCBsZW4gPyBNQVhQQVRITEVOIDogbGVuOworICAgICAgICAgICAgICAgIGxlbiA9IE1BWFBBVEhMRU4gPCBsZW4gPyBNQVhQQVRITEVOIDogbGVuOwogI2VuZGlmCi0JCQkJc3RybmNweShwcm9ncGF0aCwgcGF0aCwgbGVuKTsKLQkJCQkqKHByb2dwYXRoICsgbGVuKSA9ICdcMCc7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc3RybmNweShwcm9ncGF0aCwgcGF0aCwgTUFYUEFUSExFTik7CisgICAgICAgICAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcGF0aCwgbGVuKTsKKyAgICAgICAgICAgICAgICAqKHByb2dwYXRoICsgbGVuKSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcGF0aCwgTUFYUEFUSExFTik7CiAKLQkJCS8qIGpvaW4oKSBpcyBzYWZlIGZvciBNQVhQQVRITEVOKzEgc2l6ZSBidWZmZXIgKi8KLQkJCWpvaW4ocHJvZ3BhdGgsIHByb2cpOwotCQkJaWYgKGV4aXN0cyhwcm9ncGF0aCkpCi0JCQkJYnJlYWs7CisgICAgICAgICAgICAvKiBqb2luKCkgaXMgc2FmZSBmb3IgTUFYUEFUSExFTisxIHNpemUgYnVmZmVyICovCisgICAgICAgICAgICBqb2luKHByb2dwYXRoLCBwcm9nKTsKKyAgICAgICAgICAgIGlmIChleGlzdHMocHJvZ3BhdGgpKQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQlpZiAoIWRlbGltKSB7Ci0JCQkJcHJvZ3BhdGhbMF0gPSAnXDAnOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcGF0aCA9IGRlbGltICsgMTsKLQkJfQotCX0KLQllbHNlCi0JCXByb2dwYXRoWzBdID0gJ1wwJzsKKyAgICAgICAgICAgIGlmICghZGVsaW0pIHsKKyAgICAgICAgICAgICAgICBwcm9ncGF0aFswXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRoID0gZGVsaW0gKyAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcHJvZ3BhdGhbMF0gPSAnXDAnOwogfQogCiBzdGF0aWMgdm9pZAogY2FsY3VsYXRlX3BhdGgodm9pZCkKIHsKLQljaGFyIGFyZ3YwX3BhdGhbTUFYUEFUSExFTisxXTsKLQljaGFyICpidWY7Ci0Jc2l6ZV90IGJ1ZnN6OwotCWNoYXIgKnB5dGhvbmhvbWUgPSBQeV9HZXRQeXRob25Ib21lKCk7Ci0JY2hhciAqZW52cGF0aCA9IGdldGVudigiUFlUSE9OUEFUSCIpOwotCWNoYXIgemlwX3BhdGhbTUFYUEFUSExFTisxXTsKLQlzaXplX3QgbGVuOworICAgIGNoYXIgYXJndjBfcGF0aFtNQVhQQVRITEVOKzFdOworICAgIGNoYXIgKmJ1ZjsKKyAgICBzaXplX3QgYnVmc3o7CisgICAgY2hhciAqcHl0aG9uaG9tZSA9IFB5X0dldFB5dGhvbkhvbWUoKTsKKyAgICBjaGFyICplbnZwYXRoID0gZ2V0ZW52KCJQWVRIT05QQVRIIik7CisgICAgY2hhciB6aXBfcGF0aFtNQVhQQVRITEVOKzFdOworICAgIHNpemVfdCBsZW47CiAKLQlnZXRfcHJvZ3BhdGgoKTsKLQkvKiBwcm9ncGF0aCBndWFyYW50ZWVkIFwwIHRlcm1pbmF0ZWQgaW4gTUFYUEFUSCsxIGJ5dGVzLiAqLwotCXN0cmNweShhcmd2MF9wYXRoLCBwcm9ncGF0aCk7Ci0JcmVkdWNlKGFyZ3YwX3BhdGgpOwotCWlmIChweXRob25ob21lID09IE5VTEwgfHwgKnB5dGhvbmhvbWUgPT0gJ1wwJykgewotCQlpZiAoc2VhcmNoX2Zvcl9wcmVmaXgoYXJndjBfcGF0aCwgTEFORE1BUkspKQotCQkJcHl0aG9uaG9tZSA9IHByZWZpeDsKLQkJZWxzZQotCQkJcHl0aG9uaG9tZSA9IE5VTEw7Ci0JfQotCWVsc2UKLQkJc3RybmNweShwcmVmaXgsIHB5dGhvbmhvbWUsIE1BWFBBVEhMRU4pOworICAgIGdldF9wcm9ncGF0aCgpOworICAgIC8qIHByb2dwYXRoIGd1YXJhbnRlZWQgXDAgdGVybWluYXRlZCBpbiBNQVhQQVRIKzEgYnl0ZXMuICovCisgICAgc3RyY3B5KGFyZ3YwX3BhdGgsIHByb2dwYXRoKTsKKyAgICByZWR1Y2UoYXJndjBfcGF0aCk7CisgICAgaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCB8fCAqcHl0aG9uaG9tZSA9PSAnXDAnKSB7CisgICAgICAgIGlmIChzZWFyY2hfZm9yX3ByZWZpeChhcmd2MF9wYXRoLCBMQU5ETUFSSykpCisgICAgICAgICAgICBweXRob25ob21lID0gcHJlZml4OworICAgICAgICBlbHNlCisgICAgICAgICAgICBweXRob25ob21lID0gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzdHJuY3B5KHByZWZpeCwgcHl0aG9uaG9tZSwgTUFYUEFUSExFTik7CiAKLQlpZiAoZW52cGF0aCAmJiAqZW52cGF0aCA9PSAnXDAnKQotCQllbnZwYXRoID0gTlVMTDsKKyAgICBpZiAoZW52cGF0aCAmJiAqZW52cGF0aCA9PSAnXDAnKQorICAgICAgICBlbnZwYXRoID0gTlVMTDsKIAotCS8qIENhbGN1bGF0ZSB6aXAgYXJjaGl2ZSBwYXRoICovCi0Jc3RybmNweSh6aXBfcGF0aCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pOwotCXppcF9wYXRoW01BWFBBVEhMRU5dID0gJ1wwJzsKLQlsZW4gPSBzdHJsZW4oemlwX3BhdGgpOwotCWlmIChsZW4gPiA0KSB7Ci0JCXppcF9wYXRoW2xlbi0zXSA9ICd6JzsgIC8qIGNoYW5nZSBlbmRpbmcgdG8gInppcCIgKi8KLQkJemlwX3BhdGhbbGVuLTJdID0gJ2knOwotCQl6aXBfcGF0aFtsZW4tMV0gPSAncCc7Ci0JfQotCWVsc2UgewotCQl6aXBfcGF0aFswXSA9IDA7Ci0JfQorICAgIC8qIENhbGN1bGF0ZSB6aXAgYXJjaGl2ZSBwYXRoICovCisgICAgc3RybmNweSh6aXBfcGF0aCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pOworICAgIHppcF9wYXRoW01BWFBBVEhMRU5dID0gJ1wwJzsKKyAgICBsZW4gPSBzdHJsZW4oemlwX3BhdGgpOworICAgIGlmIChsZW4gPiA0KSB7CisgICAgICAgIHppcF9wYXRoW2xlbi0zXSA9ICd6JzsgIC8qIGNoYW5nZSBlbmRpbmcgdG8gInppcCIgKi8KKyAgICAgICAgemlwX3BhdGhbbGVuLTJdID0gJ2knOworICAgICAgICB6aXBfcGF0aFtsZW4tMV0gPSAncCc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB6aXBfcGF0aFswXSA9IDA7CisgICAgfQogCi0JLyogV2UgbmVlZCB0byBjb25zdHJ1Y3QgYSBwYXRoIGZyb20gdGhlIGZvbGxvd2luZyBwYXJ0cy4KLQkgKiAoMSkgdGhlIFBZVEhPTlBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHNldDsKLQkgKiAoMikgdGhlIHppcCBhcmNoaXZlIGZpbGUgcGF0aDsKLQkgKiAoMykgdGhlIFBZVEhPTlBBVEggY29uZmlnIG1hY3JvLCB3aXRoIHRoZSBsZWFkaW5nICIuIgotCSAqICAgICBvZiBlYWNoIGNvbXBvbmVudCByZXBsYWNlZCB3aXRoIHB5dGhvbmhvbWUsIGlmIHNldDsKLQkgKiAoNCkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIChhcmd2MF9wYXRoKS4KLQkgKiBUaGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGNhbGN1bGF0ZXMgIzMgZmlyc3QuCi0JICovCisgICAgLyogV2UgbmVlZCB0byBjb25zdHJ1Y3QgYSBwYXRoIGZyb20gdGhlIGZvbGxvd2luZyBwYXJ0cy4KKyAgICAgKiAoMSkgdGhlIFBZVEhPTlBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHNldDsKKyAgICAgKiAoMikgdGhlIHppcCBhcmNoaXZlIGZpbGUgcGF0aDsKKyAgICAgKiAoMykgdGhlIFBZVEhPTlBBVEggY29uZmlnIG1hY3JvLCB3aXRoIHRoZSBsZWFkaW5nICIuIgorICAgICAqICAgICBvZiBlYWNoIGNvbXBvbmVudCByZXBsYWNlZCB3aXRoIHB5dGhvbmhvbWUsIGlmIHNldDsKKyAgICAgKiAoNCkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlIChhcmd2MF9wYXRoKS4KKyAgICAgKiBUaGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGNhbGN1bGF0ZXMgIzMgZmlyc3QuCisgICAgICovCiAKLQkvKiBDYWxjdWxhdGUgc2l6ZSBvZiByZXR1cm4gYnVmZmVyICovCi0JaWYgKHB5dGhvbmhvbWUgIT0gTlVMTCkgewotCQljaGFyICpwOwotCQlidWZzeiA9IDE7CQotCQlmb3IgKHAgPSBQWVRIT05QQVRIOyAqcDsgcCsrKSB7Ci0JCQlpZiAoKnAgPT0gREVMSU0pCi0JCQkJYnVmc3orKzsgLyogbnVtYmVyIG9mIERFTElNIHBsdXMgb25lICovCi0JCX0KLQkJYnVmc3ogKj0gc3RybGVuKHB5dGhvbmhvbWUpOwotCX0KLQllbHNlCi0JCWJ1ZnN6ID0gMDsKLQlidWZzeiArPSBzdHJsZW4oUFlUSE9OUEFUSCkgKyAxOwotCWJ1ZnN6ICs9IHN0cmxlbihhcmd2MF9wYXRoKSArIDE7Ci0JYnVmc3ogKz0gc3RybGVuKHppcF9wYXRoKSArIDE7Ci0JaWYgKGVudnBhdGggIT0gTlVMTCkKLQkJYnVmc3ogKz0gc3RybGVuKGVudnBhdGgpICsgMTsKKyAgICAvKiBDYWxjdWxhdGUgc2l6ZSBvZiByZXR1cm4gYnVmZmVyICovCisgICAgaWYgKHB5dGhvbmhvbWUgIT0gTlVMTCkgeworICAgICAgICBjaGFyICpwOworICAgICAgICBidWZzeiA9IDE7CisgICAgICAgIGZvciAocCA9IFBZVEhPTlBBVEg7ICpwOyBwKyspIHsKKyAgICAgICAgICAgIGlmICgqcCA9PSBERUxJTSkKKyAgICAgICAgICAgICAgICBidWZzeisrOyAvKiBudW1iZXIgb2YgREVMSU0gcGx1cyBvbmUgKi8KKyAgICAgICAgfQorICAgICAgICBidWZzeiAqPSBzdHJsZW4ocHl0aG9uaG9tZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYnVmc3ogPSAwOworICAgIGJ1ZnN6ICs9IHN0cmxlbihQWVRIT05QQVRIKSArIDE7CisgICAgYnVmc3ogKz0gc3RybGVuKGFyZ3YwX3BhdGgpICsgMTsKKyAgICBidWZzeiArPSBzdHJsZW4oemlwX3BhdGgpICsgMTsKKyAgICBpZiAoZW52cGF0aCAhPSBOVUxMKQorICAgICAgICBidWZzeiArPSBzdHJsZW4oZW52cGF0aCkgKyAxOwogCi0JbW9kdWxlX3NlYXJjaF9wYXRoID0gYnVmID0gbWFsbG9jKGJ1ZnN6KTsKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJLyogV2UgY2FuJ3QgZXhpdCwgc28gcHJpbnQgYSB3YXJuaW5nIGFuZCBsaW1wIGFsb25nICovCi0JCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgbWFsbG9jIGR5bmFtaWMgUFlUSE9OUEFUSC5cbiIpOwotCQlpZiAoZW52cGF0aCkgewotCQkJZnByaW50ZihzdGRlcnIsICJVc2luZyBlbnZpcm9ubWVudCAkUFlUSE9OUEFUSC5cbiIpOwotCQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gZW52cGF0aDsKLQkJfQotCQllbHNlIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgZGVmYXVsdCBzdGF0aWMgcGF0aC5cbiIpOwotCQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gUFlUSE9OUEFUSDsKLQkJfQotCQlyZXR1cm47Ci0JfQorICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IGJ1ZiA9IG1hbGxvYyhidWZzeik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIC8qIFdlIGNhbid0IGV4aXQsIHNvIHByaW50IGEgd2FybmluZyBhbmQgbGltcCBhbG9uZyAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG1hbGxvYyBkeW5hbWljIFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgaWYgKGVudnBhdGgpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNpbmcgZW52aXJvbm1lbnQgJFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IGVudnBhdGg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGRlZmF1bHQgc3RhdGljIHBhdGguXG4iKTsKKyAgICAgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IFBZVEhPTlBBVEg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCWlmIChlbnZwYXRoKSB7Ci0JCXN0cmNweShidWYsIGVudnBhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJKmJ1ZisrID0gREVMSU07Ci0JfQotCWlmICh6aXBfcGF0aFswXSkgewotCQlzdHJjcHkoYnVmLCB6aXBfcGF0aCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkqYnVmKysgPSBERUxJTTsKLQl9CisgICAgaWYgKGVudnBhdGgpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgZW52cGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICB9CisgICAgaWYgKHppcF9wYXRoWzBdKSB7CisgICAgICAgIHN0cmNweShidWYsIHppcF9wYXRoKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgICAgICpidWYrKyA9IERFTElNOworICAgIH0KIAotCWlmIChweXRob25ob21lID09IE5VTEwpIHsKLQkJc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCX0KLQllbHNlIHsKLQkJY2hhciAqcCA9IFBZVEhPTlBBVEg7Ci0JCWNoYXIgKnE7Ci0JCXNpemVfdCBuOwotCQlmb3IgKDs7KSB7Ci0JCQlxID0gc3RyY2hyKHAsIERFTElNKTsKLQkJCWlmIChxID09IE5VTEwpCi0JCQkJbiA9IHN0cmxlbihwKTsKLQkJCWVsc2UKLQkJCQluID0gcS1wOwotCQkJaWYgKHBbMF0gPT0gJy4nICYmIGlzX3NlcChwWzFdKSkgewotCQkJCXN0cmNweShidWYsIHB5dGhvbmhvbWUpOwotCQkJCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkJCXArKzsKLQkJCQluLS07Ci0JCQl9Ci0JCQlzdHJuY3B5KGJ1ZiwgcCwgbik7Ci0JCQlidWYgKz0gbjsKLQkJCWlmIChxID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQkqYnVmKysgPSBERUxJTTsKLQkJCXAgPSBxKzE7Ci0JCX0KLQl9Ci0JaWYgKGFyZ3YwX3BhdGgpIHsKLQkJKmJ1ZisrID0gREVMSU07Ci0JCXN0cmNweShidWYsIGFyZ3YwX3BhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQl9Ci0JKmJ1ZiA9ICdcMCc7CisgICAgaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCkgeworICAgICAgICBzdHJjcHkoYnVmLCBQWVRIT05QQVRIKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjaGFyICpwID0gUFlUSE9OUEFUSDsKKyAgICAgICAgY2hhciAqcTsKKyAgICAgICAgc2l6ZV90IG47CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHEgPSBzdHJjaHIocCwgREVMSU0pOworICAgICAgICAgICAgaWYgKHEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBuID0gc3RybGVuKHApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG4gPSBxLXA7CisgICAgICAgICAgICBpZiAocFswXSA9PSAnLicgJiYgaXNfc2VwKHBbMV0pKSB7CisgICAgICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgcHl0aG9uaG9tZSk7CisgICAgICAgICAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm5jcHkoYnVmLCBwLCBuKTsKKyAgICAgICAgICAgIGJ1ZiArPSBuOworICAgICAgICAgICAgaWYgKHEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICpidWYrKyA9IERFTElNOworICAgICAgICAgICAgcCA9IHErMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYXJndjBfcGF0aCkgeworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgYXJndjBfcGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgIH0KKyAgICAqYnVmID0gJ1wwJzsKIH0KIAogCkBAIC0zOTAsMjkgKzM5MCwyOSBAQAogY2hhciAqCiBQeV9HZXRQYXRoKHZvaWQpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7Ci0JcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKKyAgICBpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKKyAgICAgICAgY2FsY3VsYXRlX3BhdGgoKTsKKyAgICByZXR1cm4gbW9kdWxlX3NlYXJjaF9wYXRoOwogfQogCiBjaGFyICoKIFB5X0dldFByZWZpeCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBwcmVmaXg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIHByZWZpeDsKIH0KIAogY2hhciAqCiBQeV9HZXRFeGVjUHJlZml4KHZvaWQpCiB7Ci0JcmV0dXJuIFB5X0dldFByZWZpeCgpOworICAgIHJldHVybiBQeV9HZXRQcmVmaXgoKTsKIH0KIAogY2hhciAqCiBQeV9HZXRQcm9ncmFtRnVsbFBhdGgodm9pZCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKLQlyZXR1cm4gcHJvZ3BhdGg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIHByb2dwYXRoOwogfQpkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L3B5dGhvbnBtLmMgYi9QQy9vczJlbXgvcHl0aG9ucG0uYwppbmRleCA1YWNjYmJkLi5iYTQ3ZjRiIDEwMDY0NAotLS0gYS9QQy9vczJlbXgvcHl0aG9ucG0uYworKysgYi9QQy9vczJlbXgvcHl0aG9ucG0uYwpAQCAtMjcsMTAgKzI3LDEwIEBACiAvKiB1c2Ugc3RydWN0dXJlIHRvIHBhc3MgY29tbWFuZCBsaW5lIHRvIFB5dGhvbiB0aHJlYWQgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0JaW50IGFyZ2M7Ci0JY2hhciAqKmFyZ3Y7Ci0JSFdORCBGcmFtZTsKLQlpbnQgcnVubmluZzsKKyAgICBpbnQgYXJnYzsKKyAgICBjaGFyICoqYXJndjsKKyAgICBIV05EIEZyYW1lOworICAgIGludCBydW5uaW5nOwogfSBhcmdsaXN0OwogCiAvKiBtYWtlIHRoaXMgYSBnbG9iYWwgdG8gc2ltcGxpZnkgYWNjZXNzLgpAQCAtNDUsODAgKzQ1LDgwIEBACiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCVVMT05HIEZyYW1lRmxhZ3MgPSBGQ0ZfVElUTEVCQVIgfAotCQkJICAgRkNGX1NZU01FTlUgfAotCQkJICAgRkNGX1NJWkVCT1JERVIgfAotCQkJICAgRkNGX0hJREVCVVRUT04gfAotCQkJICAgRkNGX1NIRUxMUE9TSVRJT04gfAotCQkJICAgRkNGX1RBU0tMSVNUOwotCUhBQiBoYWI7Ci0JSE1RIGhtcTsKLQlIV05EIENsaWVudDsKLQlRTVNHIHFtc2c7Ci0JYXJnbGlzdCBhcmdzOwotCWludCBweXRob25fdGlkOworICAgIFVMT05HIEZyYW1lRmxhZ3MgPSBGQ0ZfVElUTEVCQVIgfAorICAgICAgICAgICAgICAgICAgICAgICBGQ0ZfU1lTTUVOVSB8CisgICAgICAgICAgICAgICAgICAgICAgIEZDRl9TSVpFQk9SREVSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgRkNGX0hJREVCVVRUT04gfAorICAgICAgICAgICAgICAgICAgICAgICBGQ0ZfU0hFTExQT1NJVElPTiB8CisgICAgICAgICAgICAgICAgICAgICAgIEZDRl9UQVNLTElTVDsKKyAgICBIQUIgaGFiOworICAgIEhNUSBobXE7CisgICAgSFdORCBDbGllbnQ7CisgICAgUU1TRyBxbXNnOworICAgIGFyZ2xpc3QgYXJnczsKKyAgICBpbnQgcHl0aG9uX3RpZDsKIAotCS8qIGluaXQgUE0gYW5kIGNyZWF0ZSBtZXNzYWdlIHF1ZXVlICovCi0JaGFiID0gV2luSW5pdGlhbGl6ZSgwKTsKLQlobXEgPSBXaW5DcmVhdGVNc2dRdWV1ZShoYWIsIDApOworICAgIC8qIGluaXQgUE0gYW5kIGNyZWF0ZSBtZXNzYWdlIHF1ZXVlICovCisgICAgaGFiID0gV2luSW5pdGlhbGl6ZSgwKTsKKyAgICBobXEgPSBXaW5DcmVhdGVNc2dRdWV1ZShoYWIsIDApOwogCi0JLyogY3JlYXRlIGEgKGhpZGRlbikgV2luZG93IHRvIGhvdXNlIHRoZSB3aW5kb3cgcHJvY2VkdXJlICovCi0JYXJncy5GcmFtZSA9IFdpbkNyZWF0ZVN0ZFdpbmRvdyhIV05EX0RFU0tUT1AsCi0JCQkJCTAsCi0JCQkJCSZGcmFtZUZsYWdzLAotCQkJCQlOVUxMLAotCQkJCQkiUHl0aG9uUE0iLAotCQkJCQkwTCwKLQkJCQkJMCwKLQkJCQkJMCwKLQkJCQkJJkNsaWVudCk7CisgICAgLyogY3JlYXRlIGEgKGhpZGRlbikgV2luZG93IHRvIGhvdXNlIHRoZSB3aW5kb3cgcHJvY2VkdXJlICovCisgICAgYXJncy5GcmFtZSA9IFdpbkNyZWF0ZVN0ZFdpbmRvdyhIV05EX0RFU0tUT1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkZyYW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvblBNIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xpZW50KTsKIAotCS8qIHJ1biBQeXRob24gaW50ZXJwcmV0ZXIgaW4gYSB0aHJlYWQgKi8KLQlhcmdzLmFyZ2MgPSBhcmdjOwotCWFyZ3MuYXJndiA9IGFyZ3Y7Ci0JYXJncy5ydW5uaW5nID0gMDsKLQlpZiAoLTEgPT0gKHB5dGhvbl90aWQgPSBfYmVnaW50aHJlYWQoUHl0aG9uVGhyZWFkLCBOVUxMLCAxMDI0ICogMTAyNCwgJmFyZ3MpKSkKLQl7Ci0JCS8qIGNvdWxkbid0IHN0YXJ0IHRocmVhZCAqLwotCQlXaW5BbGFybShIV05EX0RFU0tUT1AsIFdBX0VSUk9SKTsKLQkJUHl0aG9uUkMgPSAxOwotCX0KLQllbHNlCi0JewotCQkvKiBwcm9jZXNzIFBNIG1lc3NhZ2VzLCB1bnRpbCBQeXRob24gZXhpdHMgKi8KLQkJd2hpbGUgKFdpbkdldE1zZyhoYWIsICZxbXNnLCBOVUxMSEFORExFLCAwLCAwKSkKLQkJCVdpbkRpc3BhdGNoTXNnKGhhYiwgJnFtc2cpOwotCQlpZiAoYXJncy5ydW5uaW5nID4gMCkKLQkJCURvc0tpbGxUaHJlYWQocHl0aG9uX3RpZCk7Ci0JfQotCQkKLQkvKiBkZXN0cm95IHdpbmRvdywgc2h1dGRvd24gbWVzc2FnZSBxdWV1ZSBhbmQgUE0gKi8KLQlXaW5EZXN0cm95V2luZG93KGFyZ3MuRnJhbWUpOwotCVdpbkRlc3Ryb3lNc2dRdWV1ZShobXEpOwotCVdpblRlcm1pbmF0ZShoYWIpOworICAgIC8qIHJ1biBQeXRob24gaW50ZXJwcmV0ZXIgaW4gYSB0aHJlYWQgKi8KKyAgICBhcmdzLmFyZ2MgPSBhcmdjOworICAgIGFyZ3MuYXJndiA9IGFyZ3Y7CisgICAgYXJncy5ydW5uaW5nID0gMDsKKyAgICBpZiAoLTEgPT0gKHB5dGhvbl90aWQgPSBfYmVnaW50aHJlYWQoUHl0aG9uVGhyZWFkLCBOVUxMLCAxMDI0ICogMTAyNCwgJmFyZ3MpKSkKKyAgICB7CisgICAgICAgIC8qIGNvdWxkbid0IHN0YXJ0IHRocmVhZCAqLworICAgICAgICBXaW5BbGFybShIV05EX0RFU0tUT1AsIFdBX0VSUk9SKTsKKyAgICAgICAgUHl0aG9uUkMgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBwcm9jZXNzIFBNIG1lc3NhZ2VzLCB1bnRpbCBQeXRob24gZXhpdHMgKi8KKyAgICAgICAgd2hpbGUgKFdpbkdldE1zZyhoYWIsICZxbXNnLCBOVUxMSEFORExFLCAwLCAwKSkKKyAgICAgICAgICAgIFdpbkRpc3BhdGNoTXNnKGhhYiwgJnFtc2cpOworICAgICAgICBpZiAoYXJncy5ydW5uaW5nID4gMCkKKyAgICAgICAgICAgIERvc0tpbGxUaHJlYWQocHl0aG9uX3RpZCk7CisgICAgfQogCi0JcmV0dXJuIFB5dGhvblJDOworICAgIC8qIGRlc3Ryb3kgd2luZG93LCBzaHV0ZG93biBtZXNzYWdlIHF1ZXVlIGFuZCBQTSAqLworICAgIFdpbkRlc3Ryb3lXaW5kb3coYXJncy5GcmFtZSk7CisgICAgV2luRGVzdHJveU1zZ1F1ZXVlKGhtcSk7CisgICAgV2luVGVybWluYXRlKGhhYik7CisKKyAgICByZXR1cm4gUHl0aG9uUkM7CiB9CiAKIHZvaWQgUHl0aG9uVGhyZWFkKHZvaWQgKmFyZ2wpCiB7Ci0JSEFCIGhhYjsKLQlhcmdsaXN0ICphcmdzOworICAgIEhBQiBoYWI7CisgICAgYXJnbGlzdCAqYXJnczsKIAotCS8qIFBNIGluaXRpYWxpc2F0aW9uICovCi0JaGFiID0gV2luSW5pdGlhbGl6ZSgwKTsKKyAgICAvKiBQTSBpbml0aWFsaXNhdGlvbiAqLworICAgIGhhYiA9IFdpbkluaXRpYWxpemUoMCk7CiAKLQkvKiBzdGFydCBQeXRob24gKi8KLQlhcmdzID0gKGFyZ2xpc3QgKilhcmdsOwotCWFyZ3MtPnJ1bm5pbmcgPSAxOwotCVB5dGhvblJDID0gUHlfTWFpbihhcmdzLT5hcmdjLCBhcmdzLT5hcmd2KTsKKyAgICAvKiBzdGFydCBQeXRob24gKi8KKyAgICBhcmdzID0gKGFyZ2xpc3QgKilhcmdsOworICAgIGFyZ3MtPnJ1bm5pbmcgPSAxOworICAgIFB5dGhvblJDID0gUHlfTWFpbihhcmdzLT5hcmdjLCBhcmdzLT5hcmd2KTsKIAotCS8qIGVudGVyIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgc2VuZCB0aGUgdGVybWluYXRpb24gbWVzc2FnZSAqLwotCURvc0VudGVyQ3JpdFNlYygpOwotCWFyZ3MtPnJ1bm5pbmcgPSAwOwotCVdpblBvc3RNc2coYXJncy0+RnJhbWUsIFdNX1FVSVQsIE5VTEwsIE5VTEwpOworICAgIC8qIGVudGVyIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgc2VuZCB0aGUgdGVybWluYXRpb24gbWVzc2FnZSAqLworICAgIERvc0VudGVyQ3JpdFNlYygpOworICAgIGFyZ3MtPnJ1bm5pbmcgPSAwOworICAgIFdpblBvc3RNc2coYXJncy0+RnJhbWUsIFdNX1FVSVQsIE5VTEwsIE5VTEwpOwogCi0JLyogc2h1dGRvd24gUE0gYW5kIHRlcm1pbmF0ZSB0aHJlYWQgKi8KLQlXaW5UZXJtaW5hdGUoaGFiKTsKLQlfZW5kdGhyZWFkKCk7CisgICAgLyogc2h1dGRvd24gUE0gYW5kIHRlcm1pbmF0ZSB0aHJlYWQgKi8KKyAgICBXaW5UZXJtaW5hdGUoaGFiKTsKKyAgICBfZW5kdGhyZWFkKCk7CiB9CmRpZmYgLS1naXQgYS9QQy9vczJ2YWNwcC9nZXRwYXRocC5jIGIvUEMvb3MydmFjcHAvZ2V0cGF0aHAuYwppbmRleCA2MDdmMmExLi41YmMyODI3IDEwMDY0NAotLS0gYS9QQy9vczJ2YWNwcC9nZXRwYXRocC5jCisrKyBiL1BDL29zMnZhY3BwL2dldHBhdGhwLmMKQEAgLTU1LDEyICs1NSwxMiBAQAogCiAKIHN0YXRpYyBpbnQKLWlzX3NlcChjaGFyIGNoKQkvKiBkZXRlcm1pbmUgaWYgImNoIiBpcyBhIHNlcGFyYXRvciBjaGFyYWN0ZXIgKi8KK2lzX3NlcChjaGFyIGNoKSAvKiBkZXRlcm1pbmUgaWYgImNoIiBpcyBhIHNlcGFyYXRvciBjaGFyYWN0ZXIgKi8KIHsKICNpZmRlZiBBTFRTRVAKLQlyZXR1cm4gY2ggPT0gU0VQIHx8IGNoID09IEFMVFNFUDsKKyAgICByZXR1cm4gY2ggPT0gU0VQIHx8IGNoID09IEFMVFNFUDsKICNlbHNlCi0JcmV0dXJuIGNoID09IFNFUDsKKyAgICByZXR1cm4gY2ggPT0gU0VQOwogI2VuZGlmCiB9CiAKQEAgLTY4LDE4ICs2OCwxOCBAQAogc3RhdGljIHZvaWQKIHJlZHVjZShjaGFyICpkaXIpCiB7Ci0JaW50IGkgPSBzdHJsZW4oZGlyKTsKLQl3aGlsZSAoaSA+IDAgJiYgIWlzX3NlcChkaXJbaV0pKQotCQktLWk7Ci0JZGlyW2ldID0gJ1wwJzsKKyAgICBpbnQgaSA9IHN0cmxlbihkaXIpOworICAgIHdoaWxlIChpID4gMCAmJiAhaXNfc2VwKGRpcltpXSkpCisgICAgICAgIC0taTsKKyAgICBkaXJbaV0gPSAnXDAnOwogfQotCQorCiAKIHN0YXRpYyBpbnQKIGV4aXN0cyhjaGFyICpmaWxlbmFtZSkKIHsKLQlzdHJ1Y3Qgc3RhdCBidWY7Ci0JcmV0dXJuIHN0YXQoZmlsZW5hbWUsICZidWYpID09IDA7CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHJldHVybiBzdGF0KGZpbGVuYW1lLCAmYnVmKSA9PSAwOwogfQogCiAKQEAgLTk1LDQyICs5NSw0MiBAQAogc3RhdGljIHZvaWQKIGpvaW4oY2hhciAqYnVmZmVyLCBjaGFyICpzdHVmZikKIHsKLQlpbnQgbiwgazsKLQlpZiAoaXNfc2VwKHN0dWZmWzBdKSkKLQkJbiA9IDA7Ci0JZWxzZSB7Ci0JCW4gPSBzdHJsZW4oYnVmZmVyKTsKLQkJaWYgKG4gPiAwICYmICFpc19zZXAoYnVmZmVyW24tMV0pICYmIG4gPCBNQVhQQVRITEVOKQotCQkJYnVmZmVyW24rK10gPSBTRVA7Ci0JfQotCWlmIChuID4gTUFYUEFUSExFTikKLQkJUHlfRmF0YWxFcnJvcigiYnVmZmVyIG92ZXJmbG93IGluIGdldHBhdGhwLmMncyBqb2lucGF0aCgpIik7Ci0JayA9IHN0cmxlbihzdHVmZik7Ci0JaWYgKG4gKyBrID4gTUFYUEFUSExFTikKLQkJayA9IE1BWFBBVEhMRU4gLSBuOwotCXN0cm5jcHkoYnVmZmVyK24sIHN0dWZmLCBrKTsKLQlidWZmZXJbbitrXSA9ICdcMCc7CisgICAgaW50IG4sIGs7CisgICAgaWYgKGlzX3NlcChzdHVmZlswXSkpCisgICAgICAgIG4gPSAwOworICAgIGVsc2UgeworICAgICAgICBuID0gc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIGlmIChuID4gMCAmJiAhaXNfc2VwKGJ1ZmZlcltuLTFdKSAmJiBuIDwgTUFYUEFUSExFTikKKyAgICAgICAgICAgIGJ1ZmZlcltuKytdID0gU0VQOworICAgIH0KKyAgICBpZiAobiA+IE1BWFBBVEhMRU4pCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImJ1ZmZlciBvdmVyZmxvdyBpbiBnZXRwYXRocC5jJ3Mgam9pbnBhdGgoKSIpOworICAgIGsgPSBzdHJsZW4oc3R1ZmYpOworICAgIGlmIChuICsgayA+IE1BWFBBVEhMRU4pCisgICAgICAgIGsgPSBNQVhQQVRITEVOIC0gbjsKKyAgICBzdHJuY3B5KGJ1ZmZlcituLCBzdHVmZiwgayk7CisgICAgYnVmZmVyW24ra10gPSAnXDAnOwogfQogCiAKIHN0YXRpYyBpbnQKIHNlYXJjaF9mb3JfcHJlZml4KGNoYXIgKmFyZ3YwX3BhdGgsIGNoYXIgKmxhbmRtYXJrKQogewotCWludCBuOworICAgIGludCBuOwogCi0JLyogU2VhcmNoIGZyb20gYXJndjBfcGF0aCwgdW50aWwgcm9vdCBpcyBmb3VuZCAqLwotCXN0cmNweShwcmVmaXgsIGFyZ3YwX3BhdGgpOwotCWRvIHsKLQkJbiA9IHN0cmxlbihwcmVmaXgpOwotCQlqb2luKHByZWZpeCwgbGFuZG1hcmspOwotCQlpZiAoZXhpc3RzKHByZWZpeCkpIHsKLQkJCXByZWZpeFtuXSA9ICdcMCc7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlwcmVmaXhbbl0gPSAnXDAnOwotCQlyZWR1Y2UocHJlZml4KTsKLQl9IHdoaWxlIChwcmVmaXhbMF0pOwotCXJldHVybiAwOworICAgIC8qIFNlYXJjaCBmcm9tIGFyZ3YwX3BhdGgsIHVudGlsIHJvb3QgaXMgZm91bmQgKi8KKyAgICBzdHJjcHkocHJlZml4LCBhcmd2MF9wYXRoKTsKKyAgICBkbyB7CisgICAgICAgIG4gPSBzdHJsZW4ocHJlZml4KTsKKyAgICAgICAgam9pbihwcmVmaXgsIGxhbmRtYXJrKTsKKyAgICAgICAgaWYgKGV4aXN0cyhwcmVmaXgpKSB7CisgICAgICAgICAgICBwcmVmaXhbbl0gPSAnXDAnOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcHJlZml4W25dID0gJ1wwJzsKKyAgICAgICAgcmVkdWNlKHByZWZpeCk7CisgICAgfSB3aGlsZSAocHJlZml4WzBdKTsKKyAgICByZXR1cm4gMDsKIH0KIAogI2lmZGVmIE1TX1dJTjMyCkBAIC0xNDcsMjk5ICsxNDcsMjk5IEBACiBzdGF0aWMgY2hhciAqCiBnZXRweXRob25yZWdwYXRoKEhLRVkga2V5QmFzZSwgQk9PTCBiV2luMzJzKQogewotCUhLRVkgbmV3S2V5ID0gMDsKLQlEV09SRCBuYW1lU2l6ZSA9IDA7Ci0JRFdPUkQgZGF0YVNpemUgPSAwOwotCURXT1JEIG51bUVudHJpZXMgPSAwOwotCUxPTkcgcmM7Ci0JY2hhciAqcmV0dmFsID0gTlVMTDsKLQljaGFyICpkYXRhQnVmOwotCWNvbnN0IGNoYXIga2V5UHJlZml4W10gPSAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcIjsKLQljb25zdCBjaGFyIGtleVN1ZmZpeFtdID0gIlxcUHl0aG9uUGF0aCI7Ci0JaW50IHZlcnNpb25MZW47Ci0JY2hhciAqa2V5QnVmOworICAgIEhLRVkgbmV3S2V5ID0gMDsKKyAgICBEV09SRCBuYW1lU2l6ZSA9IDA7CisgICAgRFdPUkQgZGF0YVNpemUgPSAwOworICAgIERXT1JEIG51bUVudHJpZXMgPSAwOworICAgIExPTkcgcmM7CisgICAgY2hhciAqcmV0dmFsID0gTlVMTDsKKyAgICBjaGFyICpkYXRhQnVmOworICAgIGNvbnN0IGNoYXIga2V5UHJlZml4W10gPSAiU29mdHdhcmVcXFB5dGhvblxcUHl0aG9uQ29yZVxcIjsKKyAgICBjb25zdCBjaGFyIGtleVN1ZmZpeFtdID0gIlxcUHl0aG9uUGF0aCI7CisgICAgaW50IHZlcnNpb25MZW47CisgICAgY2hhciAqa2V5QnVmOwogCi0JLy8gVHJpZWQgdG8gdXNlIHN5c2dldCgid2ludmVyIikgYnV0IGhlcmUgaXMgdG9vIGVhcmx5IDotKAotCXZlcnNpb25MZW4gPSBzdHJsZW4oUHlXaW5fRExMVmVyc2lvblN0cmluZyk7Ci0JLy8gYWxsb2NhID09IG5vIGZyZWUgcmVxdWlyZWQsIGJ1dCBtZW1vcnkgb25seSBsb2NhbCB0byBmbi4KLQkvLyBhbHNvIG5vIGhlYXAgZnJhZ21lbnRhdGlvbiEgIEFtIEkgYmVpbmcgc2lsbHk/Ci0Ja2V5QnVmID0gYWxsb2NhKHNpemVvZihrZXlQcmVmaXgpLTEgKyB2ZXJzaW9uTGVuICsgc2l6ZW9mKGtleVN1ZmZpeCkpOyAvLyBjaGFycyBvbmx5LCBwbHVzIDEgTlVMTC4KLQkvLyBsb3RzIG9mIGNvbnN0YW50cyBoZXJlIGZvciB0aGUgY29tcGlsZXIgdG8gb3B0aW1pemUgYXdheSA6LSkKLQltZW1jcHkoa2V5QnVmLCBrZXlQcmVmaXgsIHNpemVvZihrZXlQcmVmaXgpLTEpOwotCW1lbWNweShrZXlCdWYrc2l6ZW9mKGtleVByZWZpeCktMSwgUHlXaW5fRExMVmVyc2lvblN0cmluZywgdmVyc2lvbkxlbik7Ci0JbWVtY3B5KGtleUJ1ZitzaXplb2Yoa2V5UHJlZml4KS0xK3ZlcnNpb25MZW4sIGtleVN1ZmZpeCwgc2l6ZW9mKGtleVN1ZmZpeCkpOyAvLyBOVUxMIGNvbWVzIHdpdGggdGhpcyBvbmUhCisgICAgLy8gVHJpZWQgdG8gdXNlIHN5c2dldCgid2ludmVyIikgYnV0IGhlcmUgaXMgdG9vIGVhcmx5IDotKAorICAgIHZlcnNpb25MZW4gPSBzdHJsZW4oUHlXaW5fRExMVmVyc2lvblN0cmluZyk7CisgICAgLy8gYWxsb2NhID09IG5vIGZyZWUgcmVxdWlyZWQsIGJ1dCBtZW1vcnkgb25seSBsb2NhbCB0byBmbi4KKyAgICAvLyBhbHNvIG5vIGhlYXAgZnJhZ21lbnRhdGlvbiEgIEFtIEkgYmVpbmcgc2lsbHk/CisgICAga2V5QnVmID0gYWxsb2NhKHNpemVvZihrZXlQcmVmaXgpLTEgKyB2ZXJzaW9uTGVuICsgc2l6ZW9mKGtleVN1ZmZpeCkpOyAvLyBjaGFycyBvbmx5LCBwbHVzIDEgTlVMTC4KKyAgICAvLyBsb3RzIG9mIGNvbnN0YW50cyBoZXJlIGZvciB0aGUgY29tcGlsZXIgdG8gb3B0aW1pemUgYXdheSA6LSkKKyAgICBtZW1jcHkoa2V5QnVmLCBrZXlQcmVmaXgsIHNpemVvZihrZXlQcmVmaXgpLTEpOworICAgIG1lbWNweShrZXlCdWYrc2l6ZW9mKGtleVByZWZpeCktMSwgUHlXaW5fRExMVmVyc2lvblN0cmluZywgdmVyc2lvbkxlbik7CisgICAgbWVtY3B5KGtleUJ1ZitzaXplb2Yoa2V5UHJlZml4KS0xK3ZlcnNpb25MZW4sIGtleVN1ZmZpeCwgc2l6ZW9mKGtleVN1ZmZpeCkpOyAvLyBOVUxMIGNvbWVzIHdpdGggdGhpcyBvbmUhCiAKLQlyYz1SZWdPcGVuS2V5KGtleUJhc2UsCi0JCSAgICAgIGtleUJ1ZiwKLQkJICAgICAgJm5ld0tleSk7Ci0JaWYgKHJjPT1FUlJPUl9TVUNDRVNTKSB7Ci0JCVJlZ1F1ZXJ5SW5mb0tleShuZXdLZXksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIAotCQkgICAgICAgICAgICAgICAgJm51bUVudHJpZXMsICZuYW1lU2l6ZSwgJmRhdGFTaXplLCBOVUxMLCBOVUxMKTsKLQl9Ci0JaWYgKGJXaW4zMnMgJiYgbnVtRW50cmllcz09MCAmJiBkYXRhU2l6ZT09MCkgewotCQkvKiBtdXN0IGhhcmRjb2RlIGZvciBXaW4zMnMgKi8KLQkJbnVtRW50cmllcyA9IDE7Ci0JCWRhdGFTaXplID0gNTExOwotCX0KLQlpZiAobnVtRW50cmllcykgewotCQkvKiBMb29wIG92ZXIgYWxsIHN1YmtleXMuICovCi0JCS8qIFdpbjMycyBkb2VzbnQga25vdyBob3cgbWFueSBzdWJrZXlzLCBzbyB3ZSBkbwotCQkgICBpdCB0d2ljZSAqLwotCQljaGFyIGtleUJ1ZltNQVhfUEFUSCsxXTsKLQkJaW50IGluZGV4ID0gMDsKLQkJaW50IG9mZiA9IDA7Ci0JCWZvcihpbmRleD0wOztpbmRleCsrKSB7Ci0JCQlsb25nIHJlcWRTaXplID0gMDsKLQkJCURXT1JEIHJjID0gUmVnRW51bUtleShuZXdLZXksCi0JCQkJCSAgICAgIGluZGV4LCBrZXlCdWYsIE1BWF9QQVRIKzEpOwotCQkJaWYgKHJjKSBicmVhazsKLQkJCXJjID0gUmVnUXVlcnlWYWx1ZShuZXdLZXksIGtleUJ1ZiwgTlVMTCwgJnJlcWRTaXplKTsKLQkJCWlmIChyYykgYnJlYWs7Ci0JCQlpZiAoYldpbjMycyAmJiByZXFkU2l6ZT09MCkgcmVxZFNpemUgPSA1MTI7Ci0JCQlkYXRhU2l6ZSArPSByZXFkU2l6ZSArIDE7IC8qIDEgZm9yIHRoZSAiOyIgKi8KLQkJfQotCQlkYXRhQnVmID0gbWFsbG9jKGRhdGFTaXplKzEpOwotCQlpZiAoZGF0YUJ1Zj09TlVMTCkKLQkJCXJldHVybiBOVUxMOyAvKiBwcmV0dHkgc2VyaW91cz8gIFJhaXNlIGVycm9yPyAqLwotCQkvKiBOb3cgbG9vcCBvdmVyLCBncmFiYmluZyB0aGUgcGF0aHMuCi0JCSAgIFN1YmtleXMgYmVmb3JlIG1haW4gbGlicmFyeSAqLwotCQlmb3IoaW5kZXg9MDs7aW5kZXgrKykgewotCQkJaW50IGFkanVzdDsKLQkJCWxvbmcgcmVxZFNpemUgPSBkYXRhU2l6ZTsKLQkJCURXT1JEIHJjID0gUmVnRW51bUtleShuZXdLZXksCi0JCQkJCSAgICAgIGluZGV4LCBrZXlCdWYsTUFYX1BBVEgrMSk7Ci0JCQlpZiAocmMpIGJyZWFrOwotCQkJcmMgPSBSZWdRdWVyeVZhbHVlKG5ld0tleSwKLQkJCQkJICAga2V5QnVmLCBkYXRhQnVmK29mZiwgJnJlcWRTaXplKTsKLQkJCWlmIChyYykgYnJlYWs7Ci0JCQlpZiAocmVxZFNpemU+MSkgewotCQkJCS8qIElmIE5vdGhpbmcsIG9yIG9ubHkgJ1wwJyBjb3BpZWQuICovCi0JCQkJYWRqdXN0ID0gc3RybGVuKGRhdGFCdWYrb2ZmKTsKLQkJCQlkYXRhU2l6ZSAtPSBhZGp1c3Q7Ci0JCQkJb2ZmICs9IGFkanVzdDsKLQkJCQlkYXRhQnVmW29mZisrXSA9ICc7JzsKLQkJCQlkYXRhQnVmW29mZl0gPSAnXDAnOwotCQkJCWRhdGFTaXplLS07Ci0JCQl9Ci0JCX0KLQkJLyogQWRkaXRpb25hbGx5LCB3aW4zMnMgZG9lc250IHdvcmsgYXMgZXhwZWN0ZWQsIHNvCi0JCSAgIHRoZSBzcGVjaWZpYyBzdHJsZW4oKSBpcyByZXF1aXJlZCBmb3IgMy4xLiAqLwotCQlyYyA9IFJlZ1F1ZXJ5VmFsdWUobmV3S2V5LCAiIiwgZGF0YUJ1ZitvZmYsICZkYXRhU2l6ZSk7Ci0JCWlmIChyYz09RVJST1JfU1VDQ0VTUykgewotCQkJaWYgKHN0cmxlbihkYXRhQnVmKT09MCkKLQkJCQlmcmVlKGRhdGFCdWYpOwotCQkJZWxzZQotCQkJCXJldHZhbCA9IGRhdGFCdWY7IC8qIGNhbGxlciB3aWxsIGZyZWUgKi8KLQkJfQotCQllbHNlCi0JCQlmcmVlKGRhdGFCdWYpOwotCX0KKyAgICByYz1SZWdPcGVuS2V5KGtleUJhc2UsCisgICAgICAgICAgICAgICAgICBrZXlCdWYsCisgICAgICAgICAgICAgICAgICAmbmV3S2V5KTsKKyAgICBpZiAocmM9PUVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgUmVnUXVlcnlJbmZvS2V5KG5ld0tleSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZudW1FbnRyaWVzLCAmbmFtZVNpemUsICZkYXRhU2l6ZSwgTlVMTCwgTlVMTCk7CisgICAgfQorICAgIGlmIChiV2luMzJzICYmIG51bUVudHJpZXM9PTAgJiYgZGF0YVNpemU9PTApIHsKKyAgICAgICAgLyogbXVzdCBoYXJkY29kZSBmb3IgV2luMzJzICovCisgICAgICAgIG51bUVudHJpZXMgPSAxOworICAgICAgICBkYXRhU2l6ZSA9IDUxMTsKKyAgICB9CisgICAgaWYgKG51bUVudHJpZXMpIHsKKyAgICAgICAgLyogTG9vcCBvdmVyIGFsbCBzdWJrZXlzLiAqLworICAgICAgICAvKiBXaW4zMnMgZG9lc250IGtub3cgaG93IG1hbnkgc3Via2V5cywgc28gd2UgZG8KKyAgICAgICAgICAgaXQgdHdpY2UgKi8KKyAgICAgICAgY2hhciBrZXlCdWZbTUFYX1BBVEgrMV07CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBvZmYgPSAwOworICAgICAgICBmb3IoaW5kZXg9MDs7aW5kZXgrKykgeworICAgICAgICAgICAgbG9uZyByZXFkU2l6ZSA9IDA7CisgICAgICAgICAgICBEV09SRCByYyA9IFJlZ0VudW1LZXkobmV3S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBrZXlCdWYsIE1BWF9QQVRIKzEpOworICAgICAgICAgICAgaWYgKHJjKSBicmVhazsKKyAgICAgICAgICAgIHJjID0gUmVnUXVlcnlWYWx1ZShuZXdLZXksIGtleUJ1ZiwgTlVMTCwgJnJlcWRTaXplKTsKKyAgICAgICAgICAgIGlmIChyYykgYnJlYWs7CisgICAgICAgICAgICBpZiAoYldpbjMycyAmJiByZXFkU2l6ZT09MCkgcmVxZFNpemUgPSA1MTI7CisgICAgICAgICAgICBkYXRhU2l6ZSArPSByZXFkU2l6ZSArIDE7IC8qIDEgZm9yIHRoZSAiOyIgKi8KKyAgICAgICAgfQorICAgICAgICBkYXRhQnVmID0gbWFsbG9jKGRhdGFTaXplKzEpOworICAgICAgICBpZiAoZGF0YUJ1Zj09TlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAvKiBwcmV0dHkgc2VyaW91cz8gIFJhaXNlIGVycm9yPyAqLworICAgICAgICAvKiBOb3cgbG9vcCBvdmVyLCBncmFiYmluZyB0aGUgcGF0aHMuCisgICAgICAgICAgIFN1YmtleXMgYmVmb3JlIG1haW4gbGlicmFyeSAqLworICAgICAgICBmb3IoaW5kZXg9MDs7aW5kZXgrKykgeworICAgICAgICAgICAgaW50IGFkanVzdDsKKyAgICAgICAgICAgIGxvbmcgcmVxZFNpemUgPSBkYXRhU2l6ZTsKKyAgICAgICAgICAgIERXT1JEIHJjID0gUmVnRW51bUtleShuZXdLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGtleUJ1ZixNQVhfUEFUSCsxKTsKKyAgICAgICAgICAgIGlmIChyYykgYnJlYWs7CisgICAgICAgICAgICByYyA9IFJlZ1F1ZXJ5VmFsdWUobmV3S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUJ1ZiwgZGF0YUJ1ZitvZmYsICZyZXFkU2l6ZSk7CisgICAgICAgICAgICBpZiAocmMpIGJyZWFrOworICAgICAgICAgICAgaWYgKHJlcWRTaXplPjEpIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBOb3RoaW5nLCBvciBvbmx5ICdcMCcgY29waWVkLiAqLworICAgICAgICAgICAgICAgIGFkanVzdCA9IHN0cmxlbihkYXRhQnVmK29mZik7CisgICAgICAgICAgICAgICAgZGF0YVNpemUgLT0gYWRqdXN0OworICAgICAgICAgICAgICAgIG9mZiArPSBhZGp1c3Q7CisgICAgICAgICAgICAgICAgZGF0YUJ1ZltvZmYrK10gPSAnOyc7CisgICAgICAgICAgICAgICAgZGF0YUJ1ZltvZmZdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBkYXRhU2l6ZS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIEFkZGl0aW9uYWxseSwgd2luMzJzIGRvZXNudCB3b3JrIGFzIGV4cGVjdGVkLCBzbworICAgICAgICAgICB0aGUgc3BlY2lmaWMgc3RybGVuKCkgaXMgcmVxdWlyZWQgZm9yIDMuMS4gKi8KKyAgICAgICAgcmMgPSBSZWdRdWVyeVZhbHVlKG5ld0tleSwgIiIsIGRhdGFCdWYrb2ZmLCAmZGF0YVNpemUpOworICAgICAgICBpZiAocmM9PUVSUk9SX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChzdHJsZW4oZGF0YUJ1Zik9PTApCisgICAgICAgICAgICAgICAgZnJlZShkYXRhQnVmKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBkYXRhQnVmOyAvKiBjYWxsZXIgd2lsbCBmcmVlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnJlZShkYXRhQnVmKTsKKyAgICB9CiAKLQlpZiAobmV3S2V5KQotCQlSZWdDbG9zZUtleShuZXdLZXkpOwotCXJldHVybiByZXR2YWw7CisgICAgaWYgKG5ld0tleSkKKyAgICAgICAgUmVnQ2xvc2VLZXkobmV3S2V5KTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogI2VuZGlmIC8qIE1TX1dJTjMyICovCiAKIHN0YXRpYyB2b2lkCiBnZXRfcHJvZ3BhdGgodm9pZCkKIHsKLQlleHRlcm4gY2hhciAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7Ci0JY2hhciAqcGF0aCA9IGdldGVudigiUEFUSCIpOwotCWNoYXIgKnByb2cgPSBQeV9HZXRQcm9ncmFtTmFtZSgpOworICAgIGV4dGVybiBjaGFyICpQeV9HZXRQcm9ncmFtTmFtZSh2b2lkKTsKKyAgICBjaGFyICpwYXRoID0gZ2V0ZW52KCJQQVRIIik7CisgICAgY2hhciAqcHJvZyA9IFB5X0dldFByb2dyYW1OYW1lKCk7CiAKICNpZmRlZiBNU19XSU4zMgotCWlmIChHZXRNb2R1bGVGaWxlTmFtZShOVUxMLCBwcm9ncGF0aCwgTUFYUEFUSExFTikpCi0JCXJldHVybjsKKyAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUoTlVMTCwgcHJvZ3BhdGgsIE1BWFBBVEhMRU4pKQorICAgICAgICByZXR1cm47CiAjZW5kaWYKLQlpZiAocHJvZyA9PSBOVUxMIHx8ICpwcm9nID09ICdcMCcpCi0JCXByb2cgPSAicHl0aG9uIjsKKyAgICBpZiAocHJvZyA9PSBOVUxMIHx8ICpwcm9nID09ICdcMCcpCisgICAgICAgIHByb2cgPSAicHl0aG9uIjsKIAotCS8qIElmIHRoZXJlIGlzIG5vIHNsYXNoIGluIHRoZSBhcmd2MCBwYXRoLCB0aGVuIHdlIGhhdmUgdG8KLQkgKiBhc3N1bWUgcHl0aG9uIGlzIG9uIHRoZSB1c2VyJ3MgJFBBVEgsIHNpbmNlIHRoZXJlJ3Mgbm8KLQkgKiBvdGhlciB3YXkgdG8gZmluZCBhIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20uICBJZgotCSAqICRQQVRIIGlzbid0IGV4cG9ydGVkLCB5b3UgbG9zZS4KLQkgKi8KKyAgICAvKiBJZiB0aGVyZSBpcyBubyBzbGFzaCBpbiB0aGUgYXJndjAgcGF0aCwgdGhlbiB3ZSBoYXZlIHRvCisgICAgICogYXNzdW1lIHB5dGhvbiBpcyBvbiB0aGUgdXNlcidzICRQQVRILCBzaW5jZSB0aGVyZSdzIG5vCisgICAgICogb3RoZXIgd2F5IHRvIGZpbmQgYSBkaXJlY3RvcnkgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tLiAgSWYKKyAgICAgKiAkUEFUSCBpc24ndCBleHBvcnRlZCwgeW91IGxvc2UuCisgICAgICovCiAjaWZkZWYgQUxUU0VQCi0JaWYgKHN0cmNocihwcm9nLCBTRVApIHx8IHN0cmNocihwcm9nLCBBTFRTRVApKQorICAgIGlmIChzdHJjaHIocHJvZywgU0VQKSB8fCBzdHJjaHIocHJvZywgQUxUU0VQKSkKICNlbHNlCi0JaWYgKHN0cmNocihwcm9nLCBTRVApKQorICAgIGlmIChzdHJjaHIocHJvZywgU0VQKSkKICNlbmRpZgotCQlzdHJjcHkocHJvZ3BhdGgsIHByb2cpOwotCWVsc2UgaWYgKHBhdGgpIHsKLQkJd2hpbGUgKDEpIHsKLQkJCWNoYXIgKmRlbGltID0gc3RyY2hyKHBhdGgsIERFTElNKTsKKyAgICAgICAgc3RyY3B5KHByb2dwYXRoLCBwcm9nKTsKKyAgICBlbHNlIGlmIChwYXRoKSB7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBjaGFyICpkZWxpbSA9IHN0cmNocihwYXRoLCBERUxJTSk7CiAKLQkJCWlmIChkZWxpbSkgewotCQkJCWludCBsZW4gPSBkZWxpbSAtIHBhdGg7Ci0JCQkJc3RybmNweShwcm9ncGF0aCwgcGF0aCwgbGVuKTsKLQkJCQkqKHByb2dwYXRoICsgbGVuKSA9ICdcMCc7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc3RyY3B5KHByb2dwYXRoLCBwYXRoKTsKKyAgICAgICAgICAgIGlmIChkZWxpbSkgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBkZWxpbSAtIHBhdGg7CisgICAgICAgICAgICAgICAgc3RybmNweShwcm9ncGF0aCwgcGF0aCwgbGVuKTsKKyAgICAgICAgICAgICAgICAqKHByb2dwYXRoICsgbGVuKSA9ICdcMCc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RyY3B5KHByb2dwYXRoLCBwYXRoKTsKIAotCQkJam9pbihwcm9ncGF0aCwgcHJvZyk7Ci0JCQlpZiAoZXhpc3RzKHByb2dwYXRoKSkKLQkJCQlicmVhazsKKyAgICAgICAgICAgIGpvaW4ocHJvZ3BhdGgsIHByb2cpOworICAgICAgICAgICAgaWYgKGV4aXN0cyhwcm9ncGF0aCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCWlmICghZGVsaW0pIHsKLQkJCQlwcm9ncGF0aFswXSA9ICdcMCc7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwYXRoID0gZGVsaW0gKyAxOwotCQl9Ci0JfQotCWVsc2UKLQkJcHJvZ3BhdGhbMF0gPSAnXDAnOworICAgICAgICAgICAgaWYgKCFkZWxpbSkgeworICAgICAgICAgICAgICAgIHByb2dwYXRoWzBdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGggPSBkZWxpbSArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBwcm9ncGF0aFswXSA9ICdcMCc7CiB9CiAKIHN0YXRpYyB2b2lkCiBjYWxjdWxhdGVfcGF0aCh2b2lkKQogewotCWNoYXIgYXJndjBfcGF0aFtNQVhQQVRITEVOKzFdOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3o7Ci0JY2hhciAqcHl0aG9uaG9tZSA9IFB5X0dldFB5dGhvbkhvbWUoKTsKLQljaGFyICplbnZwYXRoID0gUHlfR0VURU5WKCJQWVRIT05QQVRIIik7CisgICAgY2hhciBhcmd2MF9wYXRoW01BWFBBVEhMRU4rMV07CisgICAgY2hhciAqYnVmOworICAgIGludCBidWZzejsKKyAgICBjaGFyICpweXRob25ob21lID0gUHlfR2V0UHl0aG9uSG9tZSgpOworICAgIGNoYXIgKmVudnBhdGggPSBQeV9HRVRFTlYoIlBZVEhPTlBBVEgiKTsKICNpZmRlZiBNU19XSU4zMgotCWNoYXIgKm1hY2hpbmVwYXRoLCAqdXNlcnBhdGg7CisgICAgY2hhciAqbWFjaGluZXBhdGgsICp1c2VycGF0aDsKIAotCS8qIEFyZSB3ZSBydW5uaW5nIHVuZGVyIFdpbmRvd3MgMy4xKDEpIFdpbjMycz8gKi8KLQlpZiAoUHlXaW5fSXNXaW4zMnMoKSkgewotCQkvKiBPbmx5IENMQVNTRVNfUk9PVCBpcyBzdXBwb3J0ZWQgKi8KLQkJbWFjaGluZXBhdGggPSBnZXRweXRob25yZWdwYXRoKEhLRVlfQ0xBU1NFU19ST09ULCBUUlVFKTsgCi0JCXVzZXJwYXRoID0gTlVMTDsKLQl9IGVsc2UgewotCQltYWNoaW5lcGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9MT0NBTF9NQUNISU5FLCBGQUxTRSk7Ci0JCXVzZXJwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0NVUlJFTlRfVVNFUiwgRkFMU0UpOwotCX0KKyAgICAvKiBBcmUgd2UgcnVubmluZyB1bmRlciBXaW5kb3dzIDMuMSgxKSBXaW4zMnM/ICovCisgICAgaWYgKFB5V2luX0lzV2luMzJzKCkpIHsKKyAgICAgICAgLyogT25seSBDTEFTU0VTX1JPT1QgaXMgc3VwcG9ydGVkICovCisgICAgICAgIG1hY2hpbmVwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0NMQVNTRVNfUk9PVCwgVFJVRSk7CisgICAgICAgIHVzZXJwYXRoID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBtYWNoaW5lcGF0aCA9IGdldHB5dGhvbnJlZ3BhdGgoSEtFWV9MT0NBTF9NQUNISU5FLCBGQUxTRSk7CisgICAgICAgIHVzZXJwYXRoID0gZ2V0cHl0aG9ucmVncGF0aChIS0VZX0NVUlJFTlRfVVNFUiwgRkFMU0UpOworICAgIH0KICNlbmRpZgogCi0JZ2V0X3Byb2dwYXRoKCk7Ci0Jc3RyY3B5KGFyZ3YwX3BhdGgsIHByb2dwYXRoKTsKLQlyZWR1Y2UoYXJndjBfcGF0aCk7Ci0JaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCB8fCAqcHl0aG9uaG9tZSA9PSAnXDAnKSB7Ci0JCWlmIChzZWFyY2hfZm9yX3ByZWZpeChhcmd2MF9wYXRoLCBMQU5ETUFSSykpCi0JCQlweXRob25ob21lID0gcHJlZml4OwotCQllbHNlCi0JCQlweXRob25ob21lID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0gICAgICAgIGNoYXIgKmRlbGltOworICAgIGdldF9wcm9ncGF0aCgpOworICAgIHN0cmNweShhcmd2MF9wYXRoLCBwcm9ncGF0aCk7CisgICAgcmVkdWNlKGFyZ3YwX3BhdGgpOworICAgIGlmIChweXRob25ob21lID09IE5VTEwgfHwgKnB5dGhvbmhvbWUgPT0gJ1wwJykgeworICAgICAgICBpZiAoc2VhcmNoX2Zvcl9wcmVmaXgoYXJndjBfcGF0aCwgTEFORE1BUkspKQorICAgICAgICAgICAgcHl0aG9uaG9tZSA9IHByZWZpeDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHl0aG9uaG9tZSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgIGNoYXIgKmRlbGltOwogCi0JCXN0cmNweShwcmVmaXgsIHB5dGhvbmhvbWUpOworICAgICAgICBzdHJjcHkocHJlZml4LCBweXRob25ob21lKTsKIAotICAgICAgICAvKiBFeHRyYWN0IEFueSBPcHRpb25hbCBUcmFpbGluZyBFWEVDX1BSRUZJWCAqLwotICAgICAgICAvKiBlLmcuIFBZVEhPTkhPTUU9PHByZWZpeD46PGV4ZWNfcHJlZml4PiAgICovCi0gICAgICAgIGRlbGltID0gc3RyY2hyKHByZWZpeCwgREVMSU0pOwotICAgICAgICBpZiAoZGVsaW0pIHsKLSAgICAgICAgICAgICpkZWxpbSA9ICdcMCc7Ci0gICAgICAgICAgICBzdHJjcHkoZXhlY19wcmVmaXgsIGRlbGltKzEpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN0cmNweShleGVjX3ByZWZpeCwgRVhFQ19QUkVGSVgpOworICAgIC8qIEV4dHJhY3QgQW55IE9wdGlvbmFsIFRyYWlsaW5nIEVYRUNfUFJFRklYICovCisgICAgLyogZS5nLiBQWVRIT05IT01FPTxwcmVmaXg+OjxleGVjX3ByZWZpeD4gICAqLworICAgIGRlbGltID0gc3RyY2hyKHByZWZpeCwgREVMSU0pOworICAgIGlmIChkZWxpbSkgeworICAgICAgICAqZGVsaW0gPSAnXDAnOworICAgICAgICBzdHJjcHkoZXhlY19wcmVmaXgsIGRlbGltKzEpOworICAgIH0gZWxzZQorICAgICAgICBzdHJjcHkoZXhlY19wcmVmaXgsIEVYRUNfUFJFRklYKTsKICAgICB9CiAKLQlpZiAoZW52cGF0aCAmJiAqZW52cGF0aCA9PSAnXDAnKQotCQllbnZwYXRoID0gTlVMTDsKKyAgICBpZiAoZW52cGF0aCAmJiAqZW52cGF0aCA9PSAnXDAnKQorICAgICAgICBlbnZwYXRoID0gTlVMTDsKIAotCS8qIFdlIG5lZWQgdG8gY29uc3RydWN0IGEgcGF0aCBmcm9tIHRoZSBmb2xsb3dpbmcgcGFydHM6Ci0JICAgKDEpIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiBzZXQ7Ci0JICAgKDIpIGZvciBXaW4zMiwgdGhlIG1hY2hpbmVwYXRoIGFuZCB1c2VycGF0aCwgaWYgc2V0OwotCSAgICgzKSB0aGUgUFlUSE9OUEFUSCBjb25maWcgbWFjcm8sIHdpdGggdGhlIGxlYWRpbmcgIi4iCi0JICAgICAgIG9mIGVhY2ggY29tcG9uZW50IHJlcGxhY2VkIHdpdGggcHl0aG9uaG9tZSwgaWYgc2V0OwotCSAgICg0KSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGV4ZWN1dGFibGUgKGFyZ3YwX3BhdGgpLgotCSAgIFRoZSBsZW5ndGggY2FsY3VsYXRpb24gY2FsY3VsYXRlcyAjMyBmaXJzdC4KLQkqLworICAgIC8qIFdlIG5lZWQgdG8gY29uc3RydWN0IGEgcGF0aCBmcm9tIHRoZSBmb2xsb3dpbmcgcGFydHM6CisgICAgICAgKDEpIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpZiBzZXQ7CisgICAgICAgKDIpIGZvciBXaW4zMiwgdGhlIG1hY2hpbmVwYXRoIGFuZCB1c2VycGF0aCwgaWYgc2V0OworICAgICAgICgzKSB0aGUgUFlUSE9OUEFUSCBjb25maWcgbWFjcm8sIHdpdGggdGhlIGxlYWRpbmcgIi4iCisgICAgICAgICAgIG9mIGVhY2ggY29tcG9uZW50IHJlcGxhY2VkIHdpdGggcHl0aG9uaG9tZSwgaWYgc2V0OworICAgICAgICg0KSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGV4ZWN1dGFibGUgKGFyZ3YwX3BhdGgpLgorICAgICAgIFRoZSBsZW5ndGggY2FsY3VsYXRpb24gY2FsY3VsYXRlcyAjMyBmaXJzdC4KKyAgICAqLwogCi0JLyogQ2FsY3VsYXRlIHNpemUgb2YgcmV0dXJuIGJ1ZmZlciAqLwotCWlmIChweXRob25ob21lICE9IE5VTEwpIHsKLQkJY2hhciAqcDsKLQkJYnVmc3ogPSAxOwkKLQkJZm9yIChwID0gUFlUSE9OUEFUSDsgKnA7IHArKykgewotCQkJaWYgKCpwID09IERFTElNKQotCQkJCWJ1ZnN6Kys7IC8qIG51bWJlciBvZiBERUxJTSBwbHVzIG9uZSAqLwotCQl9Ci0JCWJ1ZnN6ICo9IHN0cmxlbihweXRob25ob21lKTsKLQl9Ci0JZWxzZQotCQlidWZzeiA9IDA7Ci0JYnVmc3ogKz0gc3RybGVuKFBZVEhPTlBBVEgpICsgMTsKLQlpZiAoZW52cGF0aCAhPSBOVUxMKQotCQlidWZzeiArPSBzdHJsZW4oZW52cGF0aCkgKyAxOwotCWJ1ZnN6ICs9IHN0cmxlbihhcmd2MF9wYXRoKSArIDE7CisgICAgLyogQ2FsY3VsYXRlIHNpemUgb2YgcmV0dXJuIGJ1ZmZlciAqLworICAgIGlmIChweXRob25ob21lICE9IE5VTEwpIHsKKyAgICAgICAgY2hhciAqcDsKKyAgICAgICAgYnVmc3ogPSAxOworICAgICAgICBmb3IgKHAgPSBQWVRIT05QQVRIOyAqcDsgcCsrKSB7CisgICAgICAgICAgICBpZiAoKnAgPT0gREVMSU0pCisgICAgICAgICAgICAgICAgYnVmc3orKzsgLyogbnVtYmVyIG9mIERFTElNIHBsdXMgb25lICovCisgICAgICAgIH0KKyAgICAgICAgYnVmc3ogKj0gc3RybGVuKHB5dGhvbmhvbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGJ1ZnN6ID0gMDsKKyAgICBidWZzeiArPSBzdHJsZW4oUFlUSE9OUEFUSCkgKyAxOworICAgIGlmIChlbnZwYXRoICE9IE5VTEwpCisgICAgICAgIGJ1ZnN6ICs9IHN0cmxlbihlbnZwYXRoKSArIDE7CisgICAgYnVmc3ogKz0gc3RybGVuKGFyZ3YwX3BhdGgpICsgMTsKICNpZmRlZiBNU19XSU4zMgotCWlmIChtYWNoaW5lcGF0aCkKLQkJYnVmc3ogKz0gc3RybGVuKG1hY2hpbmVwYXRoKSArIDE7Ci0JaWYgKHVzZXJwYXRoKQotCQlidWZzeiArPSBzdHJsZW4odXNlcnBhdGgpICsgMTsKKyAgICBpZiAobWFjaGluZXBhdGgpCisgICAgICAgIGJ1ZnN6ICs9IHN0cmxlbihtYWNoaW5lcGF0aCkgKyAxOworICAgIGlmICh1c2VycGF0aCkKKyAgICAgICAgYnVmc3ogKz0gc3RybGVuKHVzZXJwYXRoKSArIDE7CiAjZW5kaWYKIAotCW1vZHVsZV9zZWFyY2hfcGF0aCA9IGJ1ZiA9IG1hbGxvYyhidWZzeik7Ci0JaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCS8qIFdlIGNhbid0IGV4aXQsIHNvIHByaW50IGEgd2FybmluZyBhbmQgbGltcCBhbG9uZyAqLwotCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG1hbGxvYyBkeW5hbWljIFBZVEhPTlBBVEguXG4iKTsKLQkJaWYgKGVudnBhdGgpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgZGVmYXVsdCBzdGF0aWMgJFBZVEhPTlBBVEguXG4iKTsKLQkJCW1vZHVsZV9zZWFyY2hfcGF0aCA9IGVudnBhdGg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIlVzaW5nIGVudmlyb25tZW50ICRQWVRIT05QQVRILlxuIik7Ci0JCQltb2R1bGVfc2VhcmNoX3BhdGggPSBQWVRIT05QQVRIOwotCQl9Ci0JCXJldHVybjsKLQl9CisgICAgbW9kdWxlX3NlYXJjaF9wYXRoID0gYnVmID0gbWFsbG9jKGJ1ZnN6KTsKKyAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgLyogV2UgY2FuJ3QgZXhpdCwgc28gcHJpbnQgYSB3YXJuaW5nIGFuZCBsaW1wIGFsb25nICovCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgbWFsbG9jIGR5bmFtaWMgUFlUSE9OUEFUSC5cbiIpOworICAgICAgICBpZiAoZW52cGF0aCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2luZyBkZWZhdWx0IHN0YXRpYyAkUFlUSE9OUEFUSC5cbiIpOworICAgICAgICAgICAgbW9kdWxlX3NlYXJjaF9wYXRoID0gZW52cGF0aDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNpbmcgZW52aXJvbm1lbnQgJFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IFBZVEhPTlBBVEg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCWlmIChlbnZwYXRoKSB7Ci0JCXN0cmNweShidWYsIGVudnBhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJKmJ1ZisrID0gREVMSU07Ci0JfQorICAgIGlmIChlbnZwYXRoKSB7CisgICAgICAgIHN0cmNweShidWYsIGVudnBhdGgpOworICAgICAgICBidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKKyAgICAgICAgKmJ1ZisrID0gREVMSU07CisgICAgfQogI2lmZGVmIE1TX1dJTjMyCi0JaWYgKG1hY2hpbmVwYXRoKSB7Ci0JCXN0cmNweShidWYsIG1hY2hpbmVwYXRoKTsKLQkJYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7Ci0JCSpidWYrKyA9IERFTElNOwotCX0KLQlpZiAodXNlcnBhdGgpIHsKLQkJc3RyY3B5KGJ1ZiwgdXNlcnBhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQkJKmJ1ZisrID0gREVMSU07Ci0JfQorICAgIGlmIChtYWNoaW5lcGF0aCkgeworICAgICAgICBzdHJjcHkoYnVmLCBtYWNoaW5lcGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICB9CisgICAgaWYgKHVzZXJwYXRoKSB7CisgICAgICAgIHN0cmNweShidWYsIHVzZXJwYXRoKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgICAgICpidWYrKyA9IERFTElNOworICAgIH0KICNlbmRpZgotCWlmIChweXRob25ob21lID09IE5VTEwpIHsKLQkJc3RyY3B5KGJ1ZiwgUFlUSE9OUEFUSCk7Ci0JCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCX0KLQllbHNlIHsKLQkJY2hhciAqcCA9IFBZVEhPTlBBVEg7Ci0JCWNoYXIgKnE7Ci0JCWludCBuOwotCQlmb3IgKDs7KSB7Ci0JCQlxID0gc3RyY2hyKHAsIERFTElNKTsKLQkJCWlmIChxID09IE5VTEwpCi0JCQkJbiA9IHN0cmxlbihwKTsKLQkJCWVsc2UKLQkJCQluID0gcS1wOwotCQkJaWYgKHBbMF0gPT0gJy4nICYmIGlzX3NlcChwWzFdKSkgewotCQkJCXN0cmNweShidWYsIHB5dGhvbmhvbWUpOwotCQkJCWJ1ZiA9IHN0cmNocihidWYsICdcMCcpOwotCQkJCXArKzsKLQkJCQluLS07Ci0JCQl9Ci0JCQlzdHJuY3B5KGJ1ZiwgcCwgbik7Ci0JCQlidWYgKz0gbjsKLQkJCWlmIChxID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQkqYnVmKysgPSBERUxJTTsKLQkJCXAgPSBxKzE7Ci0JCX0KLQl9Ci0JaWYgKGFyZ3YwX3BhdGgpIHsKLQkJKmJ1ZisrID0gREVMSU07Ci0JCXN0cmNweShidWYsIGFyZ3YwX3BhdGgpOwotCQlidWYgPSBzdHJjaHIoYnVmLCAnXDAnKTsKLQl9Ci0JKmJ1ZiA9ICdcMCc7CisgICAgaWYgKHB5dGhvbmhvbWUgPT0gTlVMTCkgeworICAgICAgICBzdHJjcHkoYnVmLCBQWVRIT05QQVRIKTsKKyAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjaGFyICpwID0gUFlUSE9OUEFUSDsKKyAgICAgICAgY2hhciAqcTsKKyAgICAgICAgaW50IG47CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHEgPSBzdHJjaHIocCwgREVMSU0pOworICAgICAgICAgICAgaWYgKHEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBuID0gc3RybGVuKHApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG4gPSBxLXA7CisgICAgICAgICAgICBpZiAocFswXSA9PSAnLicgJiYgaXNfc2VwKHBbMV0pKSB7CisgICAgICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgcHl0aG9uaG9tZSk7CisgICAgICAgICAgICAgICAgYnVmID0gc3RyY2hyKGJ1ZiwgJ1wwJyk7CisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgICAgIG4tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm5jcHkoYnVmLCBwLCBuKTsKKyAgICAgICAgICAgIGJ1ZiArPSBuOworICAgICAgICAgICAgaWYgKHEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICpidWYrKyA9IERFTElNOworICAgICAgICAgICAgcCA9IHErMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYXJndjBfcGF0aCkgeworICAgICAgICAqYnVmKysgPSBERUxJTTsKKyAgICAgICAgc3RyY3B5KGJ1ZiwgYXJndjBfcGF0aCk7CisgICAgICAgIGJ1ZiA9IHN0cmNocihidWYsICdcMCcpOworICAgIH0KKyAgICAqYnVmID0gJ1wwJzsKIH0KIAogCkBAIC00NDgsMzUgKzQ0OCwzNSBAQAogY2hhciAqCiBQeV9HZXRQYXRoKHZvaWQpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CiAKLQlyZXR1cm4gbW9kdWxlX3NlYXJjaF9wYXRoOworICAgIHJldHVybiBtb2R1bGVfc2VhcmNoX3BhdGg7CiB9CiAKIGNoYXIgKgogUHlfR2V0UHJlZml4KHZvaWQpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CiAKLQlyZXR1cm4gcHJlZml4OworICAgIHJldHVybiBwcmVmaXg7CiB9CiAKIGNoYXIgKgogUHlfR2V0RXhlY1ByZWZpeCh2b2lkKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOworICAgIGlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQorICAgICAgICBjYWxjdWxhdGVfcGF0aCgpOwogCi0JcmV0dXJuIGV4ZWNfcHJlZml4OworICAgIHJldHVybiBleGVjX3ByZWZpeDsKIH0KIAogY2hhciAqCiBQeV9HZXRQcm9ncmFtRnVsbFBhdGgodm9pZCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKKyAgICBpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKKyAgICAgICAgY2FsY3VsYXRlX3BhdGgoKTsKIAotCXJldHVybiBwcm9ncGF0aDsKKyAgICByZXR1cm4gcHJvZ3BhdGg7CiB9CmRpZmYgLS1naXQgYS9QQy93aW5zb3VuZC5jIGIvUEMvd2luc291bmQuYwppbmRleCBlNmZmMjI2Li4wNTMwNWQyIDEwMDY0NAotLS0gYS9QQy93aW5zb3VuZC5jCisrKyBiL1BDL3dpbnNvdW5kLmMKQEAgLTc4LDE0ICs3OCwxNCBAQAogICAgIGludCBvazsKIAogICAgIGlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsInojaTpQbGF5U291bmQiLCZzb3VuZCwmbGVuZ3RoLCZmbGFncykpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgaWYoZmxhZ3MmU05EX0FTWU5DICYmIGZsYWdzICZTTkRfTUVNT1JZKSB7Ci0JLyogU2lkZXN0ZXAgcmVmZXJlbmNlIGNvdW50aW5nIGhlYWRhY2hlOyB1bmZvcnR1bmF0ZWx5IHRoaXMgYWxzbwotCSAgIHByZXZlbnQgU05EX0xPT1AgZnJvbSBtZW1vcnkuICovCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIkNhbm5vdCBwbGF5IGFzeW5jaHJvbm91c2x5IGZyb20gbWVtb3J5Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIFNpZGVzdGVwIHJlZmVyZW5jZSBjb3VudGluZyBoZWFkYWNoZTsgdW5mb3J0dW5hdGVseSB0aGlzIGFsc28KKyAgICAgICBwcmV2ZW50IFNORF9MT09QIGZyb20gbWVtb3J5LiAqLworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIkNhbm5vdCBwbGF5IGFzeW5jaHJvbm91c2x5IGZyb20gbWVtb3J5Iik7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwpAQCAtOTMsOCArOTMsOCBAQAogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgaWYoIW9rKQogICAgIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwiRmFpbGVkIHRvIHBsYXkgc291bmQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwiRmFpbGVkIHRvIHBsYXkgc291bmQiKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC0xMDQsNDAgKzEwNCw0MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNvdW5kX2JlZXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBmcmVxOwotCWludCBkdXI7Ci0JQk9PTCBvazsKKyAgICBpbnQgZnJlcTsKKyAgICBpbnQgZHVyOworICAgIEJPT0wgb2s7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOkJlZXAiLCAmZnJlcSwgICZkdXIpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOkJlZXAiLCAmZnJlcSwgICZkdXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChmcmVxIDwgMzcgfHwgZnJlcSA+IDMyNzY3KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJmcmVxdWVuY3kgbXVzdCBiZSBpbiAzNyB0aHJ1IDMyNzY3Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZnJlcSA8IDM3IHx8IGZyZXEgPiAzMjc2NykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmcmVxdWVuY3kgbXVzdCBiZSBpbiAzNyB0aHJ1IDMyNzY3Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQlvayA9IEJlZXAoZnJlcSwgZHVyKTsKLQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCWlmICghb2spIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwiRmFpbGVkIHRvIGJlZXAiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBvayA9IEJlZXAoZnJlcSwgZHVyKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIGlmICghb2spIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwiRmFpbGVkIHRvIGJlZXAiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHNvdW5kX21zZ2JlZXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCB4ID0gTUJfT0s7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpNZXNzYWdlQmVlcCIsICZ4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWVzc2FnZUJlZXAoeCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGludCB4ID0gTUJfT0s7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpNZXNzYWdlQmVlcCIsICZ4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWVzc2FnZUJlZXAoeCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHNvdW5kX21ldGhvZHNbXSA9CkBAIC0xNTUsNyArMTU1LDcgQEAKICAgICBQeU9iamVjdCAqdj1QeUxvbmdfRnJvbUxvbmcodmFsdWUpOwogICAgIGlmKHYmJmspCiAgICAgewotICAgICAgICBQeURpY3RfU2V0SXRlbShkaWN0LGssdik7CisgICAgUHlEaWN0X1NldEl0ZW0oZGljdCxrLHYpOwogICAgIH0KICAgICBQeV9YREVDUkVGKGspOwogICAgIFB5X1hERUNSRUYodik7CkBAIC0xNjYsMjggKzE2NiwyOCBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXR3aW5zb3VuZCh2b2lkKQogewotCVB5T2JqZWN0ICpkaWN0OwotCVB5T2JqZWN0ICptb2R1bGUgPSBQeV9Jbml0TW9kdWxlMygid2luc291bmQiLAotCQkJCQkgIHNvdW5kX21ldGhvZHMsCi0JCQkJCSAgc291bmRfbW9kdWxlX2RvYyk7Ci0JaWYgKG1vZHVsZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqbW9kdWxlID0gUHlfSW5pdE1vZHVsZTMoIndpbnNvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kdWxlX2RvYyk7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kdWxlKTsKIAotCUFERF9ERUZJTkUoU05EX0FTWU5DKTsKLQlBRERfREVGSU5FKFNORF9OT0RFRkFVTFQpOwotCUFERF9ERUZJTkUoU05EX05PU1RPUCk7Ci0JQUREX0RFRklORShTTkRfTk9XQUlUKTsKLQlBRERfREVGSU5FKFNORF9BTElBUyk7Ci0JQUREX0RFRklORShTTkRfRklMRU5BTUUpOwotCUFERF9ERUZJTkUoU05EX01FTU9SWSk7Ci0JQUREX0RFRklORShTTkRfUFVSR0UpOwotCUFERF9ERUZJTkUoU05EX0xPT1ApOwotCUFERF9ERUZJTkUoU05EX0FQUExJQ0FUSU9OKTsKKyAgICBBRERfREVGSU5FKFNORF9BU1lOQyk7CisgICAgQUREX0RFRklORShTTkRfTk9ERUZBVUxUKTsKKyAgICBBRERfREVGSU5FKFNORF9OT1NUT1ApOworICAgIEFERF9ERUZJTkUoU05EX05PV0FJVCk7CisgICAgQUREX0RFRklORShTTkRfQUxJQVMpOworICAgIEFERF9ERUZJTkUoU05EX0ZJTEVOQU1FKTsKKyAgICBBRERfREVGSU5FKFNORF9NRU1PUlkpOworICAgIEFERF9ERUZJTkUoU05EX1BVUkdFKTsKKyAgICBBRERfREVGSU5FKFNORF9MT09QKTsKKyAgICBBRERfREVGSU5FKFNORF9BUFBMSUNBVElPTik7CiAKLQlBRERfREVGSU5FKE1CX09LKTsKLQlBRERfREVGSU5FKE1CX0lDT05BU1RFUklTSyk7Ci0JQUREX0RFRklORShNQl9JQ09ORVhDTEFNQVRJT04pOwotCUFERF9ERUZJTkUoTUJfSUNPTkhBTkQpOwotCUFERF9ERUZJTkUoTUJfSUNPTlFVRVNUSU9OKTsKKyAgICBBRERfREVGSU5FKE1CX09LKTsKKyAgICBBRERfREVGSU5FKE1CX0lDT05BU1RFUklTSyk7CisgICAgQUREX0RFRklORShNQl9JQ09ORVhDTEFNQVRJT04pOworICAgIEFERF9ERUZJTkUoTUJfSUNPTkhBTkQpOworICAgIEFERF9ERUZJTkUoTUJfSUNPTlFVRVNUSU9OKTsKIH0KZGlmZiAtLWdpdCBhL1BDYnVpbGQvbWFrZV9idWlsZGluZm8uYyBiL1BDYnVpbGQvbWFrZV9idWlsZGluZm8uYwppbmRleCAyMmI5ODgyLi41YTNkMzg1IDEwMDY0NAotLS0gYS9QQ2J1aWxkL21ha2VfYnVpbGRpbmZvLmMKKysrIGIvUENidWlsZC9tYWtlX2J1aWxkaW5mby5jCkBAIC0yMyw3MiArMjMsNzIgQEAKIAogaW50IG1ha2VfYnVpbGRpbmZvMigpCiB7Ci0Jc3RydWN0IF9zdGF0IHN0OwotCUhLRVkgaFRvcnRvaXNlOwotCWNoYXIgY29tbWFuZFtDTURfU0laRSsxXTsKLQlEV09SRCB0eXBlLCBzaXplOwotCWlmIChfc3RhdCgiLnN2biIsICZzdCkgPCAwKQotCQlyZXR1cm4gMDsKLQkvKiBBbGxvdyBzdXBwcmVzc2lvbiBvZiBzdWJ3Y3Jldi5leGUgaW52b2NhdGlvbiBpZiBhIG5vX3N1YndjcmV2IGZpbGUgaXMgcHJlc2VudC4gKi8KLQlpZiAoX3N0YXQoIm5vX3N1YndjcmV2IiwgJnN0KSA9PSAwKQotCQlyZXR1cm4gMDsKLQlpZiAoUmVnT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTICYmCi0JICAgIFJlZ09wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTKQotCQkvKiBUb3J0b2lzZSBub3QgaW5zdGFsbGVkICovCi0JCXJldHVybiAwOwotCWNvbW1hbmRbMF0gPSAnIic7ICAvKiBxdW90ZSB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSAqLwotCXNpemUgPSBzaXplb2YoY29tbWFuZCkgLSAxOwotCWlmIChSZWdRdWVyeVZhbHVlRXgoaFRvcnRvaXNlLCAiRGlyZWN0b3J5IiwgMCwgJnR5cGUsIGNvbW1hbmQrMSwgJnNpemUpICE9IEVSUk9SX1NVQ0NFU1MgfHwKLQkgICAgdHlwZSAhPSBSRUdfU1opCi0JCS8qIFJlZ2lzdHJ5IGNvcnJ1cHRlZCAqLwotCQlyZXR1cm4gMDsKLQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgImJpblxcc3Vid2NyZXYuZXhlIik7Ci0JaWYgKF9zdGF0KGNvbW1hbmQrMSwgJnN0KSA8IDApCi0JCS8qIHN1YndjcmV2LmV4ZSBub3QgcGFydCBvZiB0aGUgcmVsZWFzZSAqLwotCQlyZXR1cm4gMDsKLQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIlwiIC4uIC4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyBnZXRidWlsZGluZm8yLmMiKTsKLQlwdXRzKGNvbW1hbmQpOyBmZmx1c2goc3Rkb3V0KTsKLQlpZiAoc3lzdGVtKGNvbW1hbmQpIDwgMCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgc3RydWN0IF9zdGF0IHN0OworICAgIEhLRVkgaFRvcnRvaXNlOworICAgIGNoYXIgY29tbWFuZFtDTURfU0laRSsxXTsKKyAgICBEV09SRCB0eXBlLCBzaXplOworICAgIGlmIChfc3RhdCgiLnN2biIsICZzdCkgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAvKiBBbGxvdyBzdXBwcmVzc2lvbiBvZiBzdWJ3Y3Jldi5leGUgaW52b2NhdGlvbiBpZiBhIG5vX3N1YndjcmV2IGZpbGUgaXMgcHJlc2VudC4gKi8KKyAgICBpZiAoX3N0YXQoIm5vX3N1YndjcmV2IiwgJnN0KSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUmVnT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTICYmCisgICAgICAgIFJlZ09wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsICJTb2Z0d2FyZVxcVG9ydG9pc2VTVk4iLCAmaFRvcnRvaXNlKSAhPSBFUlJPUl9TVUNDRVNTKQorICAgICAgICAvKiBUb3J0b2lzZSBub3QgaW5zdGFsbGVkICovCisgICAgICAgIHJldHVybiAwOworICAgIGNvbW1hbmRbMF0gPSAnIic7ICAvKiBxdW90ZSB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZSAqLworICAgIHNpemUgPSBzaXplb2YoY29tbWFuZCkgLSAxOworICAgIGlmIChSZWdRdWVyeVZhbHVlRXgoaFRvcnRvaXNlLCAiRGlyZWN0b3J5IiwgMCwgJnR5cGUsIGNvbW1hbmQrMSwgJnNpemUpICE9IEVSUk9SX1NVQ0NFU1MgfHwKKyAgICAgICAgdHlwZSAhPSBSRUdfU1opCisgICAgICAgIC8qIFJlZ2lzdHJ5IGNvcnJ1cHRlZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgImJpblxcc3Vid2NyZXYuZXhlIik7CisgICAgaWYgKF9zdGF0KGNvbW1hbmQrMSwgJnN0KSA8IDApCisgICAgICAgIC8qIHN1YndjcmV2LmV4ZSBub3QgcGFydCBvZiB0aGUgcmVsZWFzZSAqLworICAgICAgICByZXR1cm4gMDsKKyAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIlwiIC4uIC4uXFxNb2R1bGVzXFxnZXRidWlsZGluZm8uYyBnZXRidWlsZGluZm8yLmMiKTsKKyAgICBwdXRzKGNvbW1hbmQpOyBmZmx1c2goc3Rkb3V0KTsKKyAgICBpZiAoc3lzdGVtKGNvbW1hbmQpIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyKmFyZ3ZbXSkKIHsKLQljaGFyIGNvbW1hbmRbNTAwXSA9ICJjbC5leGUgLWMgLURfV0lOMzIgLURVU0VfRExfRVhQT1JUIC1EX1dJTkRPV1MgLURXSU4zMiAtRF9XSU5ETEwgIjsKLQlpbnQgZG9fdW5saW5rLCByZXN1bHQ7Ci0JaWYgKGFyZ2MgIT0gMikgewotCQlmcHJpbnRmKHN0ZGVyciwgIm1ha2VfYnVpbGRpbmZvICQoQ29uZmlndXJhdGlvbk5hbWUpXG4iKTsKLQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKLQl9Ci0JaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZSIpID09IDApIHsKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiRGVidWciKSA9PSAwKSB7Ci0JCXN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLURfREVCVUcgLU1EZCAiKTsKLQl9Ci0JZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlSXRhbml1bSIpID09IDApIHsKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgL1VTRUNMOk1TX0lUQU5JVU0gIik7Ci0JfQotCWVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUFNRDY0IikgPT0gMCkgewotCQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1NRCAiKTsKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgL1VTRUNMOk1TX09QVEVST04gIik7Ci0JfQotCWVsc2UgewotCQlmcHJpbnRmKHN0ZGVyciwgInVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gJXNcbiIsIGFyZ3ZbMV0pOwotCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwotCX0KKyAgICBjaGFyIGNvbW1hbmRbNTAwXSA9ICJjbC5leGUgLWMgLURfV0lOMzIgLURVU0VfRExfRVhQT1JUIC1EX1dJTkRPV1MgLURXSU4zMiAtRF9XSU5ETEwgIjsKKyAgICBpbnQgZG9fdW5saW5rLCByZXN1bHQ7CisgICAgaWYgKGFyZ2MgIT0gMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1ha2VfYnVpbGRpbmZvICQoQ29uZmlndXJhdGlvbk5hbWUpXG4iKTsKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZSIpID09IDApIHsKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiRGVidWciKSA9PSAwKSB7CisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLURfREVCVUcgLU1EZCAiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJSZWxlYXNlSXRhbml1bSIpID09IDApIHsKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgL1VTRUNMOk1TX0lUQU5JVU0gIik7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2WzFdLCAiUmVsZWFzZUFNRDY0IikgPT0gMCkgeworICAgICAgICBzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIi1NRCAiKTsKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICItTUQgL1VTRUNMOk1TX09QVEVST04gIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb24gJXNcbiIsIGFyZ3ZbMV0pOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KIAotCWlmICgoZG9fdW5saW5rID0gbWFrZV9idWlsZGluZm8yKCkpKQotCQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgImdldGJ1aWxkaW5mbzIuYyAtRFNVQldDUkVWICIpOwotCWVsc2UKLQkJc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICIuLlxcTW9kdWxlc1xcZ2V0YnVpbGRpbmZvLmMiKTsKLQlzdHJjYXRfcyhjb21tYW5kLCBDTURfU0laRSwgIiAtRm9nZXRidWlsZGluZm8ubyAtSS4uXFxJbmNsdWRlIC1JLi5cXFBDIik7Ci0JcHV0cyhjb21tYW5kKTsgZmZsdXNoKHN0ZG91dCk7Ci0JcmVzdWx0ID0gc3lzdGVtKGNvbW1hbmQpOwotCWlmIChkb191bmxpbmspCi0JCV91bmxpbmsoImdldGJ1aWxkaW5mbzIuYyIpOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gRVhJVF9GQUlMVVJFOwotCXJldHVybiAwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBpZiAoKGRvX3VubGluayA9IG1ha2VfYnVpbGRpbmZvMigpKSkKKyAgICAgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICJnZXRidWlsZGluZm8yLmMgLURTVUJXQ1JFViAiKTsKKyAgICBlbHNlCisgICAgICAgIHN0cmNhdF9zKGNvbW1hbmQsIENNRF9TSVpFLCAiLi5cXE1vZHVsZXNcXGdldGJ1aWxkaW5mby5jIik7CisgICAgc3RyY2F0X3MoY29tbWFuZCwgQ01EX1NJWkUsICIgLUZvZ2V0YnVpbGRpbmZvLm8gLUkuLlxcSW5jbHVkZSAtSS4uXFxQQyIpOworICAgIHB1dHMoY29tbWFuZCk7IGZmbHVzaChzdGRvdXQpOworICAgIHJlc3VsdCA9IHN5c3RlbShjb21tYW5kKTsKKyAgICBpZiAoZG9fdW5saW5rKQorICAgICAgICBfdW5saW5rKCJnZXRidWlsZGluZm8yLmMiKTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL1BhcnNlci9hY2NlbGVyLmMgYi9QYXJzZXIvYWNjZWxlci5jCmluZGV4IGI0MWIyNjUuLjliMTQyNjMgMTAwNjQ0Ci0tLSBhL1BhcnNlci9hY2NlbGVyLmMKKysrIGIvUGFyc2VyL2FjY2VsZXIuYwpAQCAtMjMsMTAzICsyMywxMDMgQEAKIHZvaWQKIFB5R3JhbW1hcl9BZGRBY2NlbGVyYXRvcnMoZ3JhbW1hciAqZykKIHsKLQlkZmEgKmQ7Ci0JaW50IGk7Ci0JZCA9IGctPmdfZGZhOwotCWZvciAoaSA9IGctPmdfbmRmYXM7IC0taSA+PSAwOyBkKyspCi0JCWZpeGRmYShnLCBkKTsKLQlnLT5nX2FjY2VsID0gMTsKKyAgICBkZmEgKmQ7CisgICAgaW50IGk7CisgICAgZCA9IGctPmdfZGZhOworICAgIGZvciAoaSA9IGctPmdfbmRmYXM7IC0taSA+PSAwOyBkKyspCisgICAgICAgIGZpeGRmYShnLCBkKTsKKyAgICBnLT5nX2FjY2VsID0gMTsKIH0KIAogdm9pZAogUHlHcmFtbWFyX1JlbW92ZUFjY2VsZXJhdG9ycyhncmFtbWFyICpnKQogewotCWRmYSAqZDsKLQlpbnQgaTsKLQlnLT5nX2FjY2VsID0gMDsKLQlkID0gZy0+Z19kZmE7Ci0JZm9yIChpID0gZy0+Z19uZGZhczsgLS1pID49IDA7IGQrKykgewotCQlzdGF0ZSAqczsKLQkJaW50IGo7Ci0JCXMgPSBkLT5kX3N0YXRlOwotCQlmb3IgKGogPSAwOyBqIDwgZC0+ZF9uc3RhdGVzOyBqKyssIHMrKykgewotCQkJaWYgKHMtPnNfYWNjZWwpCi0JCQkJUHlPYmplY3RfRlJFRShzLT5zX2FjY2VsKTsKLQkJCXMtPnNfYWNjZWwgPSBOVUxMOwotCQl9Ci0JfQorICAgIGRmYSAqZDsKKyAgICBpbnQgaTsKKyAgICBnLT5nX2FjY2VsID0gMDsKKyAgICBkID0gZy0+Z19kZmE7CisgICAgZm9yIChpID0gZy0+Z19uZGZhczsgLS1pID49IDA7IGQrKykgeworICAgICAgICBzdGF0ZSAqczsKKyAgICAgICAgaW50IGo7CisgICAgICAgIHMgPSBkLT5kX3N0YXRlOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZC0+ZF9uc3RhdGVzOyBqKyssIHMrKykgeworICAgICAgICAgICAgaWYgKHMtPnNfYWNjZWwpCisgICAgICAgICAgICAgICAgUHlPYmplY3RfRlJFRShzLT5zX2FjY2VsKTsKKyAgICAgICAgICAgIHMtPnNfYWNjZWwgPSBOVUxMOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogZml4ZGZhKGdyYW1tYXIgKmcsIGRmYSAqZCkKIHsKLQlzdGF0ZSAqczsKLQlpbnQgajsKLQlzID0gZC0+ZF9zdGF0ZTsKLQlmb3IgKGogPSAwOyBqIDwgZC0+ZF9uc3RhdGVzOyBqKyssIHMrKykKLQkJZml4c3RhdGUoZywgcyk7CisgICAgc3RhdGUgKnM7CisgICAgaW50IGo7CisgICAgcyA9IGQtPmRfc3RhdGU7CisgICAgZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspCisgICAgICAgIGZpeHN0YXRlKGcsIHMpOwogfQogCiBzdGF0aWMgdm9pZAogZml4c3RhdGUoZ3JhbW1hciAqZywgc3RhdGUgKnMpCiB7Ci0JYXJjICphOwotCWludCBrOwotCWludCAqYWNjZWw7Ci0JaW50IG5sID0gZy0+Z19sbC5sbF9ubGFiZWxzOwotCXMtPnNfYWNjZXB0ID0gMDsKLQlhY2NlbCA9IChpbnQgKikgUHlPYmplY3RfTUFMTE9DKG5sICogc2l6ZW9mKGludCkpOwotCWlmIChhY2NlbCA9PSBOVUxMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibm8gbWVtIHRvIGJ1aWxkIHBhcnNlciBhY2NlbGVyYXRvcnNcbiIpOwotCQlleGl0KDEpOwotCX0KLQlmb3IgKGsgPSAwOyBrIDwgbmw7IGsrKykKLQkJYWNjZWxba10gPSAtMTsKLQlhID0gcy0+c19hcmM7Ci0JZm9yIChrID0gcy0+c19uYXJjczsgLS1rID49IDA7IGErKykgewotCQlpbnQgbGJsID0gYS0+YV9sYmw7Ci0JCWxhYmVsICpsID0gJmctPmdfbGwubGxfbGFiZWxbbGJsXTsKLQkJaW50IHR5cGUgPSBsLT5sYl90eXBlOwotCQlpZiAoYS0+YV9hcnJvdyA+PSAoMSA8PCA3KSkgewotCQkJcHJpbnRmKCJYWFggdG9vIG1hbnkgc3RhdGVzIVxuIik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoSVNOT05URVJNSU5BTCh0eXBlKSkgewotCQkJZGZhICpkMSA9IFB5R3JhbW1hcl9GaW5kREZBKGcsIHR5cGUpOwotCQkJaW50IGliaXQ7Ci0JCQlpZiAodHlwZSAtIE5UX09GRlNFVCA+PSAoMSA8PCA3KSkgewotCQkJCXByaW50ZigiWFhYIHRvbyBoaWdoIG5vbnRlcm1pbmFsIG51bWJlciFcbiIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZm9yIChpYml0ID0gMDsgaWJpdCA8IGctPmdfbGwubGxfbmxhYmVsczsgaWJpdCsrKSB7Ci0JCQkJaWYgKHRlc3RiaXQoZDEtPmRfZmlyc3QsIGliaXQpKSB7Ci0JCQkJCWlmIChhY2NlbFtpYml0XSAhPSAtMSkKLQkJCQkJCXByaW50ZigiWFhYIGFtYmlndWl0eSFcbiIpOwotCQkJCQlhY2NlbFtpYml0XSA9IGEtPmFfYXJyb3cgfCAoMSA8PCA3KSB8Ci0JCQkJCQkoKHR5cGUgLSBOVF9PRkZTRVQpIDw8IDgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChsYmwgPT0gRU1QVFkpCi0JCQlzLT5zX2FjY2VwdCA9IDE7Ci0JCWVsc2UgaWYgKGxibCA+PSAwICYmIGxibCA8IG5sKQotCQkJYWNjZWxbbGJsXSA9IGEtPmFfYXJyb3c7Ci0JfQotCXdoaWxlIChubCA+IDAgJiYgYWNjZWxbbmwtMV0gPT0gLTEpCi0JCW5sLS07Ci0JZm9yIChrID0gMDsgayA8IG5sICYmIGFjY2VsW2tdID09IC0xOykKLQkJaysrOwotCWlmIChrIDwgbmwpIHsKLQkJaW50IGk7Ci0JCXMtPnNfYWNjZWwgPSAoaW50ICopIFB5T2JqZWN0X01BTExPQygobmwtaykgKiBzaXplb2YoaW50KSk7Ci0JCWlmIChzLT5zX2FjY2VsID09IE5VTEwpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAibm8gbWVtIHRvIGFkZCBwYXJzZXIgYWNjZWxlcmF0b3JzXG4iKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQkJcy0+c19sb3dlciA9IGs7Ci0JCXMtPnNfdXBwZXIgPSBubDsKLQkJZm9yIChpID0gMDsgayA8IG5sOyBpKyssIGsrKykKLQkJCXMtPnNfYWNjZWxbaV0gPSBhY2NlbFtrXTsKLQl9Ci0JUHlPYmplY3RfRlJFRShhY2NlbCk7CisgICAgYXJjICphOworICAgIGludCBrOworICAgIGludCAqYWNjZWw7CisgICAgaW50IG5sID0gZy0+Z19sbC5sbF9ubGFiZWxzOworICAgIHMtPnNfYWNjZXB0ID0gMDsKKyAgICBhY2NlbCA9IChpbnQgKikgUHlPYmplY3RfTUFMTE9DKG5sICogc2l6ZW9mKGludCkpOworICAgIGlmIChhY2NlbCA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm8gbWVtIHRvIGJ1aWxkIHBhcnNlciBhY2NlbGVyYXRvcnNcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBmb3IgKGsgPSAwOyBrIDwgbmw7IGsrKykKKyAgICAgICAgYWNjZWxba10gPSAtMTsKKyAgICBhID0gcy0+c19hcmM7CisgICAgZm9yIChrID0gcy0+c19uYXJjczsgLS1rID49IDA7IGErKykgeworICAgICAgICBpbnQgbGJsID0gYS0+YV9sYmw7CisgICAgICAgIGxhYmVsICpsID0gJmctPmdfbGwubGxfbGFiZWxbbGJsXTsKKyAgICAgICAgaW50IHR5cGUgPSBsLT5sYl90eXBlOworICAgICAgICBpZiAoYS0+YV9hcnJvdyA+PSAoMSA8PCA3KSkgeworICAgICAgICAgICAgcHJpbnRmKCJYWFggdG9vIG1hbnkgc3RhdGVzIVxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoSVNOT05URVJNSU5BTCh0eXBlKSkgeworICAgICAgICAgICAgZGZhICpkMSA9IFB5R3JhbW1hcl9GaW5kREZBKGcsIHR5cGUpOworICAgICAgICAgICAgaW50IGliaXQ7CisgICAgICAgICAgICBpZiAodHlwZSAtIE5UX09GRlNFVCA+PSAoMSA8PCA3KSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiWFhYIHRvbyBoaWdoIG5vbnRlcm1pbmFsIG51bWJlciFcbiIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpYml0ID0gMDsgaWJpdCA8IGctPmdfbGwubGxfbmxhYmVsczsgaWJpdCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHRlc3RiaXQoZDEtPmRfZmlyc3QsIGliaXQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2NlbFtpYml0XSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiWFhYIGFtYmlndWl0eSFcbiIpOworICAgICAgICAgICAgICAgICAgICBhY2NlbFtpYml0XSA9IGEtPmFfYXJyb3cgfCAoMSA8PCA3KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoKHR5cGUgLSBOVF9PRkZTRVQpIDw8IDgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsYmwgPT0gRU1QVFkpCisgICAgICAgICAgICBzLT5zX2FjY2VwdCA9IDE7CisgICAgICAgIGVsc2UgaWYgKGxibCA+PSAwICYmIGxibCA8IG5sKQorICAgICAgICAgICAgYWNjZWxbbGJsXSA9IGEtPmFfYXJyb3c7CisgICAgfQorICAgIHdoaWxlIChubCA+IDAgJiYgYWNjZWxbbmwtMV0gPT0gLTEpCisgICAgICAgIG5sLS07CisgICAgZm9yIChrID0gMDsgayA8IG5sICYmIGFjY2VsW2tdID09IC0xOykKKyAgICAgICAgaysrOworICAgIGlmIChrIDwgbmwpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHMtPnNfYWNjZWwgPSAoaW50ICopIFB5T2JqZWN0X01BTExPQygobmwtaykgKiBzaXplb2YoaW50KSk7CisgICAgICAgIGlmIChzLT5zX2FjY2VsID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm8gbWVtIHRvIGFkZCBwYXJzZXIgYWNjZWxlcmF0b3JzXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgcy0+c19sb3dlciA9IGs7CisgICAgICAgIHMtPnNfdXBwZXIgPSBubDsKKyAgICAgICAgZm9yIChpID0gMDsgayA8IG5sOyBpKyssIGsrKykKKyAgICAgICAgICAgIHMtPnNfYWNjZWxbaV0gPSBhY2NlbFtrXTsKKyAgICB9CisgICAgUHlPYmplY3RfRlJFRShhY2NlbCk7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvYml0c2V0LmMgYi9QYXJzZXIvYml0c2V0LmMKaW5kZXggYjU1NDNiOC4uZjViZmQ0MSAxMDA2NDQKLS0tIGEvUGFyc2VyL2JpdHNldC5jCisrKyBiL1BhcnNlci9iaXRzZXQuYwpAQCAtNyw2MCArNyw2MCBAQAogYml0c2V0CiBuZXdiaXRzZXQoaW50IG5iaXRzKQogewotCWludCBuYnl0ZXMgPSBOQllURVMobmJpdHMpOwotCWJpdHNldCBzcyA9IChjaGFyICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihCWVRFKSAqICBuYnl0ZXMpOwotCQotCWlmIChzcyA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIGJpdHNldCIpOwotCQotCXNzICs9IG5ieXRlczsKLQl3aGlsZSAoLS1uYnl0ZXMgPj0gMCkKLQkJKi0tc3MgPSAwOwotCXJldHVybiBzczsKKyAgICBpbnQgbmJ5dGVzID0gTkJZVEVTKG5iaXRzKTsKKyAgICBiaXRzZXQgc3MgPSAoY2hhciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoQllURSkgKiAgbmJ5dGVzKTsKKworICAgIGlmIChzcyA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIGJpdHNldCIpOworCisgICAgc3MgKz0gbmJ5dGVzOworICAgIHdoaWxlICgtLW5ieXRlcyA+PSAwKQorICAgICAgICAqLS1zcyA9IDA7CisgICAgcmV0dXJuIHNzOwogfQogCiB2b2lkCiBkZWxiaXRzZXQoYml0c2V0IHNzKQogewotCVB5T2JqZWN0X0ZSRUUoc3MpOworICAgIFB5T2JqZWN0X0ZSRUUoc3MpOwogfQogCiBpbnQKIGFkZGJpdChiaXRzZXQgc3MsIGludCBpYml0KQogewotCWludCBpYnl0ZSA9IEJJVDJCWVRFKGliaXQpOwotCUJZVEUgbWFzayA9IEJJVDJNQVNLKGliaXQpOwotCQotCWlmIChzc1tpYnl0ZV0gJiBtYXNrKQotCQlyZXR1cm4gMDsgLyogQml0IGFscmVhZHkgc2V0ICovCi0Jc3NbaWJ5dGVdIHw9IG1hc2s7Ci0JcmV0dXJuIDE7CisgICAgaW50IGlieXRlID0gQklUMkJZVEUoaWJpdCk7CisgICAgQllURSBtYXNrID0gQklUMk1BU0soaWJpdCk7CisKKyAgICBpZiAoc3NbaWJ5dGVdICYgbWFzaykKKyAgICAgICAgcmV0dXJuIDA7IC8qIEJpdCBhbHJlYWR5IHNldCAqLworICAgIHNzW2lieXRlXSB8PSBtYXNrOworICAgIHJldHVybiAxOwogfQogCiAjaWYgMCAvKiBOb3cgYSBtYWNybyAqLwogaW50CiB0ZXN0Yml0KGJpdHNldCBzcywgaW50IGliaXQpCiB7Ci0JcmV0dXJuIChzc1tCSVQyQllURShpYml0KV0gJiBCSVQyTUFTSyhpYml0KSkgIT0gMDsKKyAgICByZXR1cm4gKHNzW0JJVDJCWVRFKGliaXQpXSAmIEJJVDJNQVNLKGliaXQpKSAhPSAwOwogfQogI2VuZGlmCiAKIGludAogc2FtZWJpdHNldChiaXRzZXQgc3MxLCBiaXRzZXQgc3MyLCBpbnQgbmJpdHMpCiB7Ci0JaW50IGk7Ci0JCi0JZm9yIChpID0gTkJZVEVTKG5iaXRzKTsgLS1pID49IDA7ICkKLQkJaWYgKCpzczErKyAhPSAqc3MyKyspCi0JCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IE5CWVRFUyhuYml0cyk7IC0taSA+PSAwOyApCisgICAgICAgIGlmICgqc3MxKysgIT0gKnNzMisrKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIHZvaWQKIG1lcmdlYml0c2V0KGJpdHNldCBzczEsIGJpdHNldCBzczIsIGludCBuYml0cykKIHsKLQlpbnQgaTsKLQkKLQlmb3IgKGkgPSBOQllURVMobmJpdHMpOyAtLWkgPj0gMDsgKQotCQkqc3MxKysgfD0gKnNzMisrOworICAgIGludCBpOworCisgICAgZm9yIChpID0gTkJZVEVTKG5iaXRzKTsgLS1pID49IDA7ICkKKyAgICAgICAgKnNzMSsrIHw9ICpzczIrKzsKIH0KZGlmZiAtLWdpdCBhL1BhcnNlci9maXJzdHNldHMuYyBiL1BhcnNlci9maXJzdHNldHMuYwppbmRleCAwMDQ2N2IzLi5lZTc1ZDFiIDEwMDY0NAotLS0gYS9QYXJzZXIvZmlyc3RzZXRzLmMKKysrIGIvUGFyc2VyL2ZpcnN0c2V0cy5jCkBAIC0xMywxMDEgKzEzLDEwMSBAQAogdm9pZAogYWRkZmlyc3RzZXRzKGdyYW1tYXIgKmcpCiB7Ci0JaW50IGk7Ci0JZGZhICpkOworICAgIGludCBpOworICAgIGRmYSAqZDsKIAotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50ZigiQWRkaW5nIEZJUlNUIHNldHMgLi4uXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgZy0+Z19uZGZhczsgaSsrKSB7Ci0JCWQgPSAmZy0+Z19kZmFbaV07Ci0JCWlmIChkLT5kX2ZpcnN0ID09IE5VTEwpCi0JCQljYWxjZmlyc3RzZXQoZywgZCk7Ci0JfQorICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCisgICAgICAgIHByaW50ZigiQWRkaW5nIEZJUlNUIHNldHMgLi4uXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZy0+Z19uZGZhczsgaSsrKSB7CisgICAgICAgIGQgPSAmZy0+Z19kZmFbaV07CisgICAgICAgIGlmIChkLT5kX2ZpcnN0ID09IE5VTEwpCisgICAgICAgICAgICBjYWxjZmlyc3RzZXQoZywgZCk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogY2FsY2ZpcnN0c2V0KGdyYW1tYXIgKmcsIGRmYSAqZCkKIHsKLQlpbnQgaSwgajsKLQlzdGF0ZSAqczsKLQlhcmMgKmE7Ci0JaW50IG5zeW1zOwotCWludCAqc3ltOwotCWludCBuYml0czsKLQlzdGF0aWMgYml0c2V0IGR1bW15OwotCWJpdHNldCByZXN1bHQ7Ci0JaW50IHR5cGU7Ci0JZGZhICpkMTsKLQlsYWJlbCAqbDA7Ci0JCi0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJDYWxjdWxhdGUgRklSU1Qgc2V0IGZvciAnJXMnXG4iLCBkLT5kX25hbWUpOwotCQotCWlmIChkdW1teSA9PSBOVUxMKQotCQlkdW1teSA9IG5ld2JpdHNldCgxKTsKLQlpZiAoZC0+ZF9maXJzdCA9PSBkdW1teSkgewotCQlmcHJpbnRmKHN0ZGVyciwgIkxlZnQtcmVjdXJzaW9uIGZvciAnJXMnXG4iLCBkLT5kX25hbWUpOwotCQlyZXR1cm47Ci0JfQotCWlmIChkLT5kX2ZpcnN0ICE9IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJSZS1jYWxjdWxhdGluZyBGSVJTVCBzZXQgZm9yICclcycgPz8/XG4iLAotCQkJZC0+ZF9uYW1lKTsKLQl9Ci0JZC0+ZF9maXJzdCA9IGR1bW15OwotCQotCWwwID0gZy0+Z19sbC5sbF9sYWJlbDsKLQluYml0cyA9IGctPmdfbGwubGxfbmxhYmVsczsKLQlyZXN1bHQgPSBuZXdiaXRzZXQobmJpdHMpOwotCQotCXN5bSA9IChpbnQgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKGludCkpOwotCWlmIChzeW0gPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgc3ltIGluIGNhbGNmaXJzdHNldCIpOwotCW5zeW1zID0gMTsKLQlzeW1bMF0gPSBmaW5kbGFiZWwoJmctPmdfbGwsIGQtPmRfdHlwZSwgKGNoYXIgKilOVUxMKTsKLQkKLQlzID0gJmQtPmRfc3RhdGVbZC0+ZF9pbml0aWFsXTsKLQlmb3IgKGkgPSAwOyBpIDwgcy0+c19uYXJjczsgaSsrKSB7Ci0JCWEgPSAmcy0+c19hcmNbaV07Ci0JCWZvciAoaiA9IDA7IGogPCBuc3ltczsgaisrKSB7Ci0JCQlpZiAoc3ltW2pdID09IGEtPmFfbGJsKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChqID49IG5zeW1zKSB7IC8qIE5ldyBsYWJlbCAqLwotCQkJc3ltID0gKGludCAqKVB5T2JqZWN0X1JFQUxMT0Moc3ltLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogKG5zeW1zICsgMSkpOwotCQkJaWYgKHN5bSA9PSBOVUxMKQotCQkJCVB5X0ZhdGFsRXJyb3IoCi0JCQkJICAgICJubyBtZW0gdG8gcmVzaXplIHN5bSBpbiBjYWxjZmlyc3RzZXQiKTsKLQkJCXN5bVtuc3ltcysrXSA9IGEtPmFfbGJsOwotCQkJdHlwZSA9IGwwW2EtPmFfbGJsXS5sYl90eXBlOwotCQkJaWYgKElTTk9OVEVSTUlOQUwodHlwZSkpIHsKLQkJCQlkMSA9IFB5R3JhbW1hcl9GaW5kREZBKGcsIHR5cGUpOwotCQkJCWlmIChkMS0+ZF9maXJzdCA9PSBkdW1teSkgewotCQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkJCSJMZWZ0LXJlY3Vyc2lvbiBiZWxvdyAnJXMnXG4iLAotCQkJCQkJZC0+ZF9uYW1lKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChkMS0+ZF9maXJzdCA9PSBOVUxMKQotCQkJCQkJY2FsY2ZpcnN0c2V0KGcsIGQxKTsKLQkJCQkJbWVyZ2ViaXRzZXQocmVzdWx0LAotCQkJCQkJICAgIGQxLT5kX2ZpcnN0LCBuYml0cyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoSVNURVJNSU5BTCh0eXBlKSkgewotCQkJCWFkZGJpdChyZXN1bHQsIGEtPmFfbGJsKTsKLQkJCX0KLQkJfQotCX0KLQlkLT5kX2ZpcnN0ID0gcmVzdWx0OwotCWlmIChQeV9EZWJ1Z0ZsYWcpIHsKLQkJcHJpbnRmKCJGSVJTVCBzZXQgZm9yICclcyc6IHsiLCBkLT5kX25hbWUpOwotCQlmb3IgKGkgPSAwOyBpIDwgbmJpdHM7IGkrKykgewotCQkJaWYgKHRlc3RiaXQocmVzdWx0LCBpKSkKLQkJCQlwcmludGYoIiAlcyIsIFB5R3JhbW1hcl9MYWJlbFJlcHIoJmwwW2ldKSk7Ci0JCX0KLQkJcHJpbnRmKCIgfVxuIik7Ci0JfQorICAgIGludCBpLCBqOworICAgIHN0YXRlICpzOworICAgIGFyYyAqYTsKKyAgICBpbnQgbnN5bXM7CisgICAgaW50ICpzeW07CisgICAgaW50IG5iaXRzOworICAgIHN0YXRpYyBiaXRzZXQgZHVtbXk7CisgICAgYml0c2V0IHJlc3VsdDsKKyAgICBpbnQgdHlwZTsKKyAgICBkZmEgKmQxOworICAgIGxhYmVsICpsMDsKIAotCVB5T2JqZWN0X0ZSRUUoc3ltKTsKKyAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICBwcmludGYoIkNhbGN1bGF0ZSBGSVJTVCBzZXQgZm9yICclcydcbiIsIGQtPmRfbmFtZSk7CisKKyAgICBpZiAoZHVtbXkgPT0gTlVMTCkKKyAgICAgICAgZHVtbXkgPSBuZXdiaXRzZXQoMSk7CisgICAgaWYgKGQtPmRfZmlyc3QgPT0gZHVtbXkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJMZWZ0LXJlY3Vyc2lvbiBmb3IgJyVzJ1xuIiwgZC0+ZF9uYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZC0+ZF9maXJzdCAhPSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUmUtY2FsY3VsYXRpbmcgRklSU1Qgc2V0IGZvciAnJXMnID8/P1xuIiwKKyAgICAgICAgICAgIGQtPmRfbmFtZSk7CisgICAgfQorICAgIGQtPmRfZmlyc3QgPSBkdW1teTsKKworICAgIGwwID0gZy0+Z19sbC5sbF9sYWJlbDsKKyAgICBuYml0cyA9IGctPmdfbGwubGxfbmxhYmVsczsKKyAgICByZXN1bHQgPSBuZXdiaXRzZXQobmJpdHMpOworCisgICAgc3ltID0gKGludCAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YoaW50KSk7CisgICAgaWYgKHN5bSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIG5ldyBzeW0gaW4gY2FsY2ZpcnN0c2V0Iik7CisgICAgbnN5bXMgPSAxOworICAgIHN5bVswXSA9IGZpbmRsYWJlbCgmZy0+Z19sbCwgZC0+ZF90eXBlLCAoY2hhciAqKU5VTEwpOworCisgICAgcyA9ICZkLT5kX3N0YXRlW2QtPmRfaW5pdGlhbF07CisgICAgZm9yIChpID0gMDsgaSA8IHMtPnNfbmFyY3M7IGkrKykgeworICAgICAgICBhID0gJnMtPnNfYXJjW2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnN5bXM7IGorKykgeworICAgICAgICAgICAgaWYgKHN5bVtqXSA9PSBhLT5hX2xibCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaiA+PSBuc3ltcykgeyAvKiBOZXcgbGFiZWwgKi8KKyAgICAgICAgICAgIHN5bSA9IChpbnQgKilQeU9iamVjdF9SRUFMTE9DKHN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpICogKG5zeW1zICsgMSkpOworICAgICAgICAgICAgaWYgKHN5bSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJubyBtZW0gdG8gcmVzaXplIHN5bSBpbiBjYWxjZmlyc3RzZXQiKTsKKyAgICAgICAgICAgIHN5bVtuc3ltcysrXSA9IGEtPmFfbGJsOworICAgICAgICAgICAgdHlwZSA9IGwwW2EtPmFfbGJsXS5sYl90eXBlOworICAgICAgICAgICAgaWYgKElTTk9OVEVSTUlOQUwodHlwZSkpIHsKKyAgICAgICAgICAgICAgICBkMSA9IFB5R3JhbW1hcl9GaW5kREZBKGcsIHR5cGUpOworICAgICAgICAgICAgICAgIGlmIChkMS0+ZF9maXJzdCA9PSBkdW1teSkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJMZWZ0LXJlY3Vyc2lvbiBiZWxvdyAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZC0+ZF9uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkMS0+ZF9maXJzdCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsY2ZpcnN0c2V0KGcsIGQxKTsKKyAgICAgICAgICAgICAgICAgICAgbWVyZ2ViaXRzZXQocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMS0+ZF9maXJzdCwgbmJpdHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKElTVEVSTUlOQUwodHlwZSkpIHsKKyAgICAgICAgICAgICAgICBhZGRiaXQocmVzdWx0LCBhLT5hX2xibCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZC0+ZF9maXJzdCA9IHJlc3VsdDsKKyAgICBpZiAoUHlfRGVidWdGbGFnKSB7CisgICAgICAgIHByaW50ZigiRklSU1Qgc2V0IGZvciAnJXMnOiB7IiwgZC0+ZF9uYW1lKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iaXRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0ZXN0Yml0KHJlc3VsdCwgaSkpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBQeUdyYW1tYXJfTGFiZWxSZXByKCZsMFtpXSkpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiIH1cbiIpOworICAgIH0KKworICAgIFB5T2JqZWN0X0ZSRUUoc3ltKTsKIH0KZGlmZiAtLWdpdCBhL1BhcnNlci9ncmFtbWFyLmMgYi9QYXJzZXIvZ3JhbW1hci5jCmluZGV4IDllN2M0OWEuLmZhMWRkN2MgMTAwNjQ0Ci0tLSBhL1BhcnNlci9ncmFtbWFyLmMKKysrIGIvUGFyc2VyL2dyYW1tYXIuYwpAQCAtMTgsOTggKzE4LDk4IEBACiBncmFtbWFyICoKIG5ld2dyYW1tYXIoaW50IHN0YXJ0KQogewotCWdyYW1tYXIgKmc7Ci0JCi0JZyA9IChncmFtbWFyICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihncmFtbWFyKSk7Ci0JaWYgKGcgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgZ3JhbW1hciIpOwotCWctPmdfbmRmYXMgPSAwOwotCWctPmdfZGZhID0gTlVMTDsKLQlnLT5nX3N0YXJ0ID0gc3RhcnQ7Ci0JZy0+Z19sbC5sbF9ubGFiZWxzID0gMDsKLQlnLT5nX2xsLmxsX2xhYmVsID0gTlVMTDsKLQlnLT5nX2FjY2VsID0gMDsKLQlyZXR1cm4gZzsKKyAgICBncmFtbWFyICpnOworCisgICAgZyA9IChncmFtbWFyICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihncmFtbWFyKSk7CisgICAgaWYgKGcgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgZ3JhbW1hciIpOworICAgIGctPmdfbmRmYXMgPSAwOworICAgIGctPmdfZGZhID0gTlVMTDsKKyAgICBnLT5nX3N0YXJ0ID0gc3RhcnQ7CisgICAgZy0+Z19sbC5sbF9ubGFiZWxzID0gMDsKKyAgICBnLT5nX2xsLmxsX2xhYmVsID0gTlVMTDsKKyAgICBnLT5nX2FjY2VsID0gMDsKKyAgICByZXR1cm4gZzsKIH0KIAogZGZhICoKIGFkZGRmYShncmFtbWFyICpnLCBpbnQgdHlwZSwgY2hhciAqbmFtZSkKIHsKLQlkZmEgKmQ7Ci0JCi0JZy0+Z19kZmEgPSAoZGZhICopUHlPYmplY3RfUkVBTExPQyhnLT5nX2RmYSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZmEpICogKGctPmdfbmRmYXMgKyAxKSk7Ci0JaWYgKGctPmdfZGZhID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgZGZhIGluIGFkZGRmYSIpOwotCWQgPSAmZy0+Z19kZmFbZy0+Z19uZGZhcysrXTsKLQlkLT5kX3R5cGUgPSB0eXBlOwotCWQtPmRfbmFtZSA9IHN0cmR1cChuYW1lKTsKLQlkLT5kX25zdGF0ZXMgPSAwOwotCWQtPmRfc3RhdGUgPSBOVUxMOwotCWQtPmRfaW5pdGlhbCA9IC0xOwotCWQtPmRfZmlyc3QgPSBOVUxMOwotCXJldHVybiBkOyAvKiBPbmx5IHVzZSB3aGlsZSBmcmVzaCEgKi8KKyAgICBkZmEgKmQ7CisKKyAgICBnLT5nX2RmYSA9IChkZmEgKilQeU9iamVjdF9SRUFMTE9DKGctPmdfZGZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZmEpICogKGctPmdfbmRmYXMgKyAxKSk7CisgICAgaWYgKGctPmdfZGZhID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSB0byByZXNpemUgZGZhIGluIGFkZGRmYSIpOworICAgIGQgPSAmZy0+Z19kZmFbZy0+Z19uZGZhcysrXTsKKyAgICBkLT5kX3R5cGUgPSB0eXBlOworICAgIGQtPmRfbmFtZSA9IHN0cmR1cChuYW1lKTsKKyAgICBkLT5kX25zdGF0ZXMgPSAwOworICAgIGQtPmRfc3RhdGUgPSBOVUxMOworICAgIGQtPmRfaW5pdGlhbCA9IC0xOworICAgIGQtPmRfZmlyc3QgPSBOVUxMOworICAgIHJldHVybiBkOyAvKiBPbmx5IHVzZSB3aGlsZSBmcmVzaCEgKi8KIH0KIAogaW50CiBhZGRzdGF0ZShkZmEgKmQpCiB7Ci0Jc3RhdGUgKnM7Ci0JCi0JZC0+ZF9zdGF0ZSA9IChzdGF0ZSAqKVB5T2JqZWN0X1JFQUxMT0MoZC0+ZF9zdGF0ZSwKLQkJCQkgICAgICBzaXplb2Yoc3RhdGUpICogKGQtPmRfbnN0YXRlcyArIDEpKTsKLQlpZiAoZC0+ZF9zdGF0ZSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gdG8gcmVzaXplIHN0YXRlIGluIGFkZHN0YXRlIik7Ci0JcyA9ICZkLT5kX3N0YXRlW2QtPmRfbnN0YXRlcysrXTsKLQlzLT5zX25hcmNzID0gMDsKLQlzLT5zX2FyYyA9IE5VTEw7Ci0Jcy0+c19sb3dlciA9IDA7Ci0Jcy0+c191cHBlciA9IDA7Ci0Jcy0+c19hY2NlbCA9IE5VTEw7Ci0Jcy0+c19hY2NlcHQgPSAwOwotCXJldHVybiBzIC0gZC0+ZF9zdGF0ZTsKKyAgICBzdGF0ZSAqczsKKworICAgIGQtPmRfc3RhdGUgPSAoc3RhdGUgKilQeU9iamVjdF9SRUFMTE9DKGQtPmRfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0YXRlKSAqIChkLT5kX25zdGF0ZXMgKyAxKSk7CisgICAgaWYgKGQtPmRfc3RhdGUgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBzdGF0ZSBpbiBhZGRzdGF0ZSIpOworICAgIHMgPSAmZC0+ZF9zdGF0ZVtkLT5kX25zdGF0ZXMrK107CisgICAgcy0+c19uYXJjcyA9IDA7CisgICAgcy0+c19hcmMgPSBOVUxMOworICAgIHMtPnNfbG93ZXIgPSAwOworICAgIHMtPnNfdXBwZXIgPSAwOworICAgIHMtPnNfYWNjZWwgPSBOVUxMOworICAgIHMtPnNfYWNjZXB0ID0gMDsKKyAgICByZXR1cm4gcyAtIGQtPmRfc3RhdGU7CiB9CiAKIHZvaWQKIGFkZGFyYyhkZmEgKmQsIGludCBmcm9tLCBpbnQgdG8sIGludCBsYmwpCiB7Ci0Jc3RhdGUgKnM7Ci0JYXJjICphOwotCQotCWFzc2VydCgwIDw9IGZyb20gJiYgZnJvbSA8IGQtPmRfbnN0YXRlcyk7Ci0JYXNzZXJ0KDAgPD0gdG8gJiYgdG8gPCBkLT5kX25zdGF0ZXMpOwotCQotCXMgPSAmZC0+ZF9zdGF0ZVtmcm9tXTsKLQlzLT5zX2FyYyA9IChhcmMgKilQeU9iamVjdF9SRUFMTE9DKHMtPnNfYXJjLCBzaXplb2YoYXJjKSAqIChzLT5zX25hcmNzICsgMSkpOwotCWlmIChzLT5zX2FyYyA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gdG8gcmVzaXplIGFyYyBsaXN0IGluIGFkZGFyYyIpOwotCWEgPSAmcy0+c19hcmNbcy0+c19uYXJjcysrXTsKLQlhLT5hX2xibCA9IGxibDsKLQlhLT5hX2Fycm93ID0gdG87CisgICAgc3RhdGUgKnM7CisgICAgYXJjICphOworCisgICAgYXNzZXJ0KDAgPD0gZnJvbSAmJiBmcm9tIDwgZC0+ZF9uc3RhdGVzKTsKKyAgICBhc3NlcnQoMCA8PSB0byAmJiB0byA8IGQtPmRfbnN0YXRlcyk7CisKKyAgICBzID0gJmQtPmRfc3RhdGVbZnJvbV07CisgICAgcy0+c19hcmMgPSAoYXJjICopUHlPYmplY3RfUkVBTExPQyhzLT5zX2FyYywgc2l6ZW9mKGFyYykgKiAocy0+c19uYXJjcyArIDEpKTsKKyAgICBpZiAocy0+c19hcmMgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBhcmMgbGlzdCBpbiBhZGRhcmMiKTsKKyAgICBhID0gJnMtPnNfYXJjW3MtPnNfbmFyY3MrK107CisgICAgYS0+YV9sYmwgPSBsYmw7CisgICAgYS0+YV9hcnJvdyA9IHRvOwogfQogCiBpbnQKIGFkZGxhYmVsKGxhYmVsbGlzdCAqbGwsIGludCB0eXBlLCBjaGFyICpzdHIpCiB7Ci0JaW50IGk7Ci0JbGFiZWwgKmxiOwotCQotCWZvciAoaSA9IDA7IGkgPCBsbC0+bGxfbmxhYmVsczsgaSsrKSB7Ci0JCWlmIChsbC0+bGxfbGFiZWxbaV0ubGJfdHlwZSA9PSB0eXBlICYmCi0JCQlzdHJjbXAobGwtPmxsX2xhYmVsW2ldLmxiX3N0ciwgc3RyKSA9PSAwKQotCQkJcmV0dXJuIGk7Ci0JfQotCWxsLT5sbF9sYWJlbCA9IChsYWJlbCAqKVB5T2JqZWN0X1JFQUxMT0MobGwtPmxsX2xhYmVsLAotCQkJCQlzaXplb2YobGFiZWwpICogKGxsLT5sbF9ubGFiZWxzICsgMSkpOwotCWlmIChsbC0+bGxfbGFiZWwgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBsYWJlbGxpc3QgaW4gYWRkbGFiZWwiKTsKLQlsYiA9ICZsbC0+bGxfbGFiZWxbbGwtPmxsX25sYWJlbHMrK107Ci0JbGItPmxiX3R5cGUgPSB0eXBlOwotCWxiLT5sYl9zdHIgPSBzdHJkdXAoc3RyKTsKLQlpZiAoUHlfRGVidWdGbGFnKQotCQlwcmludGYoIkxhYmVsIEAgJThwLCAlZDogJXNcbiIsIGxsLCBsbC0+bGxfbmxhYmVscywKLQkJICAgICAgIFB5R3JhbW1hcl9MYWJlbFJlcHIobGIpKTsKLQlyZXR1cm4gbGIgLSBsbC0+bGxfbGFiZWw7CisgICAgaW50IGk7CisgICAgbGFiZWwgKmxiOworCisgICAgZm9yIChpID0gMDsgaSA8IGxsLT5sbF9ubGFiZWxzOyBpKyspIHsKKyAgICAgICAgaWYgKGxsLT5sbF9sYWJlbFtpXS5sYl90eXBlID09IHR5cGUgJiYKKyAgICAgICAgICAgIHN0cmNtcChsbC0+bGxfbGFiZWxbaV0ubGJfc3RyLCBzdHIpID09IDApCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgbGwtPmxsX2xhYmVsID0gKGxhYmVsICopUHlPYmplY3RfUkVBTExPQyhsbC0+bGxfbGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFiZWwpICogKGxsLT5sbF9ubGFiZWxzICsgMSkpOworICAgIGlmIChsbC0+bGxfbGFiZWwgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIHRvIHJlc2l6ZSBsYWJlbGxpc3QgaW4gYWRkbGFiZWwiKTsKKyAgICBsYiA9ICZsbC0+bGxfbGFiZWxbbGwtPmxsX25sYWJlbHMrK107CisgICAgbGItPmxiX3R5cGUgPSB0eXBlOworICAgIGxiLT5sYl9zdHIgPSBzdHJkdXAoc3RyKTsKKyAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICBwcmludGYoIkxhYmVsIEAgJThwLCAlZDogJXNcbiIsIGxsLCBsbC0+bGxfbmxhYmVscywKKyAgICAgICAgICAgICAgIFB5R3JhbW1hcl9MYWJlbFJlcHIobGIpKTsKKyAgICByZXR1cm4gbGIgLSBsbC0+bGxfbGFiZWw7CiB9CiAKIC8qIFNhbWUsIGJ1dCByYXRoZXIgZGllcyB0aGFuIGFkZHMgKi8KQEAgLTExNywxNiArMTE3LDE2IEBACiBpbnQKIGZpbmRsYWJlbChsYWJlbGxpc3QgKmxsLCBpbnQgdHlwZSwgY2hhciAqc3RyKQogewotCWludCBpOwotCQotCWZvciAoaSA9IDA7IGkgPCBsbC0+bGxfbmxhYmVsczsgaSsrKSB7Ci0JCWlmIChsbC0+bGxfbGFiZWxbaV0ubGJfdHlwZSA9PSB0eXBlIC8qJiYKLQkJCXN0cmNtcChsbC0+bGxfbGFiZWxbaV0ubGJfc3RyLCBzdHIpID09IDAqLykKLQkJCXJldHVybiBpOwotCX0KLQlmcHJpbnRmKHN0ZGVyciwgIkxhYmVsICVkLyclcycgbm90IGZvdW5kXG4iLCB0eXBlLCBzdHIpOwotCVB5X0ZhdGFsRXJyb3IoImdyYW1tYXIuYzpmaW5kbGFiZWwoKSIpOwotCXJldHVybiAwOyAvKiBNYWtlIGdjYyAtV2FsbCBoYXBweSAqLworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxsLT5sbF9ubGFiZWxzOyBpKyspIHsKKyAgICAgICAgaWYgKGxsLT5sbF9sYWJlbFtpXS5sYl90eXBlID09IHR5cGUgLyomJgorICAgICAgICAgICAgc3RyY21wKGxsLT5sbF9sYWJlbFtpXS5sYl9zdHIsIHN0cikgPT0gMCovKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiTGFiZWwgJWQvJyVzJyBub3QgZm91bmRcbiIsIHR5cGUsIHN0cik7CisgICAgUHlfRmF0YWxFcnJvcigiZ3JhbW1hci5jOmZpbmRsYWJlbCgpIik7CisgICAgcmV0dXJuIDA7IC8qIE1ha2UgZ2NjIC1XYWxsIGhhcHB5ICovCiB9CiAKIC8qIEZvcndhcmQgKi8KQEAgLTEzNSwxMjAgKzEzNSwxMjAgQEAKIHZvaWQKIHRyYW5zbGF0ZWxhYmVscyhncmFtbWFyICpnKQogewotCWludCBpOworICAgIGludCBpOwogCiAjaWZkZWYgUHlfREVCVUcKLQlwcmludGYoIlRyYW5zbGF0aW5nIGxhYmVscyAuLi5cbiIpOworICAgIHByaW50ZigiVHJhbnNsYXRpbmcgbGFiZWxzIC4uLlxuIik7CiAjZW5kaWYKLQkvKiBEb24ndCB0cmFuc2xhdGUgRU1QVFkgKi8KLQlmb3IgKGkgPSBFTVBUWSsxOyBpIDwgZy0+Z19sbC5sbF9ubGFiZWxzOyBpKyspCi0JCXRyYW5zbGFiZWwoZywgJmctPmdfbGwubGxfbGFiZWxbaV0pOworICAgIC8qIERvbid0IHRyYW5zbGF0ZSBFTVBUWSAqLworICAgIGZvciAoaSA9IEVNUFRZKzE7IGkgPCBnLT5nX2xsLmxsX25sYWJlbHM7IGkrKykKKyAgICAgICAgdHJhbnNsYWJlbChnLCAmZy0+Z19sbC5sbF9sYWJlbFtpXSk7CiB9CiAKIHN0YXRpYyB2b2lkCiB0cmFuc2xhYmVsKGdyYW1tYXIgKmcsIGxhYmVsICpsYikKIHsKLQlpbnQgaTsKLQkKLQlpZiAoUHlfRGVidWdGbGFnKQotCQlwcmludGYoIlRyYW5zbGF0aW5nIGxhYmVsICVzIC4uLlxuIiwgUHlHcmFtbWFyX0xhYmVsUmVwcihsYikpOwotCQotCWlmIChsYi0+bGJfdHlwZSA9PSBOQU1FKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBnLT5nX25kZmFzOyBpKyspIHsKLQkJCWlmIChzdHJjbXAobGItPmxiX3N0ciwgZy0+Z19kZmFbaV0uZF9uYW1lKSA9PSAwKSB7Ci0JCQkJaWYgKFB5X0RlYnVnRmxhZykKLQkJCQkJcHJpbnRmKAotCQkJCQkgICAgIkxhYmVsICVzIGlzIG5vbi10ZXJtaW5hbCAlZC5cbiIsCi0JCQkJCSAgICBsYi0+bGJfc3RyLAotCQkJCQkgICAgZy0+Z19kZmFbaV0uZF90eXBlKTsKLQkJCQlsYi0+bGJfdHlwZSA9IGctPmdfZGZhW2ldLmRfdHlwZTsKLQkJCQlmcmVlKGxiLT5sYl9zdHIpOwotCQkJCWxiLT5sYl9zdHIgPSBOVUxMOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgKGludClOX1RPS0VOUzsgaSsrKSB7Ci0JCQlpZiAoc3RyY21wKGxiLT5sYl9zdHIsIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW2ldKSA9PSAwKSB7Ci0JCQkJaWYgKFB5X0RlYnVnRmxhZykKLQkJCQkJcHJpbnRmKCJMYWJlbCAlcyBpcyB0ZXJtaW5hbCAlZC5cbiIsCi0JCQkJCQlsYi0+bGJfc3RyLCBpKTsKLQkJCQlsYi0+bGJfdHlwZSA9IGk7Ci0JCQkJZnJlZShsYi0+bGJfc3RyKTsKLQkJCQlsYi0+bGJfc3RyID0gTlVMTDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJcHJpbnRmKCJDYW4ndCB0cmFuc2xhdGUgTkFNRSBsYWJlbCAnJXMnXG4iLCBsYi0+bGJfc3RyKTsKLQkJcmV0dXJuOwotCX0KLQkKLQlpZiAobGItPmxiX3R5cGUgPT0gU1RSSU5HKSB7Ci0JCWlmIChpc2FscGhhKFB5X0NIQVJNQVNLKGxiLT5sYl9zdHJbMV0pKSB8fAotCQkgICAgbGItPmxiX3N0clsxXSA9PSAnXycpIHsKLQkJCWNoYXIgKnA7Ci0JCQljaGFyICpzcmM7Ci0JCQljaGFyICpkZXN0OwotCQkJc2l6ZV90IG5hbWVfbGVuOwotCQkJaWYgKFB5X0RlYnVnRmxhZykKLQkJCQlwcmludGYoIkxhYmVsICVzIGlzIGEga2V5d29yZFxuIiwgbGItPmxiX3N0cik7Ci0JCQlsYi0+bGJfdHlwZSA9IE5BTUU7Ci0JCQlzcmMgPSBsYi0+bGJfc3RyICsgMTsKLQkJCXAgPSBzdHJjaHIoc3JjLCAnXCcnKTsKLQkJCWlmIChwKQotCQkJCW5hbWVfbGVuID0gcCAtIHNyYzsKLQkJCWVsc2UKLQkJCQluYW1lX2xlbiA9IHN0cmxlbihzcmMpOwotCQkJZGVzdCA9IChjaGFyICopbWFsbG9jKG5hbWVfbGVuICsgMSk7Ci0JCQlpZiAoIWRlc3QpIHsKLQkJCQlwcmludGYoIkNhbid0IGFsbG9jIGRlc3QgJyVzJ1xuIiwgc3JjKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzdHJuY3B5KGRlc3QsIHNyYywgbmFtZV9sZW4pOwotCQkJZGVzdFtuYW1lX2xlbl0gPSAnXDAnOwotCQkJZnJlZShsYi0+bGJfc3RyKTsKLQkJCWxiLT5sYl9zdHIgPSBkZXN0OwotCQl9Ci0JCWVsc2UgaWYgKGxiLT5sYl9zdHJbMl0gPT0gbGItPmxiX3N0clswXSkgewotCQkJaW50IHR5cGUgPSAoaW50KSBQeVRva2VuX09uZUNoYXIobGItPmxiX3N0clsxXSk7Ci0JCQlpZiAodHlwZSAhPSBPUCkgewotCQkJCWxiLT5sYl90eXBlID0gdHlwZTsKLQkJCQlmcmVlKGxiLT5sYl9zdHIpOwotCQkJCWxiLT5sYl9zdHIgPSBOVUxMOwotCQkJfQotCQkJZWxzZQotCQkJCXByaW50ZigiVW5rbm93biBPUCBsYWJlbCAlc1xuIiwKLQkJCQkJbGItPmxiX3N0cik7Ci0JCX0KLQkJZWxzZSBpZiAobGItPmxiX3N0clsyXSAmJiBsYi0+bGJfc3RyWzNdID09IGxiLT5sYl9zdHJbMF0pIHsKLQkJCWludCB0eXBlID0gKGludCkgUHlUb2tlbl9Ud29DaGFycyhsYi0+bGJfc3RyWzFdLAotCQkJCQkJICAgbGItPmxiX3N0clsyXSk7Ci0JCQlpZiAodHlwZSAhPSBPUCkgewotCQkJCWxiLT5sYl90eXBlID0gdHlwZTsKLQkJCQlmcmVlKGxiLT5sYl9zdHIpOwotCQkJCWxiLT5sYl9zdHIgPSBOVUxMOwotCQkJfQotCQkJZWxzZQotCQkJCXByaW50ZigiVW5rbm93biBPUCBsYWJlbCAlc1xuIiwKLQkJCQkJbGItPmxiX3N0cik7Ci0JCX0KLQkJZWxzZSBpZiAobGItPmxiX3N0clsyXSAmJiBsYi0+bGJfc3RyWzNdICYmIGxiLT5sYl9zdHJbNF0gPT0gbGItPmxiX3N0clswXSkgewotCQkJaW50IHR5cGUgPSAoaW50KSBQeVRva2VuX1RocmVlQ2hhcnMobGItPmxiX3N0clsxXSwKLQkJCQkJCQkgICAgbGItPmxiX3N0clsyXSwKLQkJCQkJCQkgICAgbGItPmxiX3N0clszXSk7Ci0JCQlpZiAodHlwZSAhPSBPUCkgewotCQkJCWxiLT5sYl90eXBlID0gdHlwZTsKLQkJCQlmcmVlKGxiLT5sYl9zdHIpOwotCQkJCWxiLT5sYl9zdHIgPSBOVUxMOwotCQkJfQotCQkJZWxzZQotCQkJCXByaW50ZigiVW5rbm93biBPUCBsYWJlbCAlc1xuIiwKLQkJCQkJbGItPmxiX3N0cik7Ci0JCX0KLQkJZWxzZQotCQkJcHJpbnRmKCJDYW4ndCB0cmFuc2xhdGUgU1RSSU5HIGxhYmVsICVzXG4iLAotCQkJCWxiLT5sYl9zdHIpOwotCX0KLQllbHNlCi0JCXByaW50ZigiQ2FuJ3QgdHJhbnNsYXRlIGxhYmVsICclcydcbiIsCi0JCSAgICAgICBQeUdyYW1tYXJfTGFiZWxSZXByKGxiKSk7CisgICAgaW50IGk7CisKKyAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICBwcmludGYoIlRyYW5zbGF0aW5nIGxhYmVsICVzIC4uLlxuIiwgUHlHcmFtbWFyX0xhYmVsUmVwcihsYikpOworCisgICAgaWYgKGxiLT5sYl90eXBlID09IE5BTUUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGctPmdfbmRmYXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHN0cmNtcChsYi0+bGJfc3RyLCBnLT5nX2RmYVtpXS5kX25hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAiTGFiZWwgJXMgaXMgbm9uLXRlcm1pbmFsICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBnLT5nX2RmYVtpXS5kX3R5cGUpOworICAgICAgICAgICAgICAgIGxiLT5sYl90eXBlID0gZy0+Z19kZmFbaV0uZF90eXBlOworICAgICAgICAgICAgICAgIGZyZWUobGItPmxiX3N0cik7CisgICAgICAgICAgICAgICAgbGItPmxiX3N0ciA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KU5fVE9LRU5TOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAobGItPmxiX3N0ciwgX1B5UGFyc2VyX1Rva2VuTmFtZXNbaV0pID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIkxhYmVsICVzIGlzIHRlcm1pbmFsICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIsIGkpOworICAgICAgICAgICAgICAgIGxiLT5sYl90eXBlID0gaTsKKyAgICAgICAgICAgICAgICBmcmVlKGxiLT5sYl9zdHIpOworICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmludGYoIkNhbid0IHRyYW5zbGF0ZSBOQU1FIGxhYmVsICclcydcbiIsIGxiLT5sYl9zdHIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGxiLT5sYl90eXBlID09IFNUUklORykgeworICAgICAgICBpZiAoaXNhbHBoYShQeV9DSEFSTUFTSyhsYi0+bGJfc3RyWzFdKSkgfHwKKyAgICAgICAgICAgIGxiLT5sYl9zdHJbMV0gPT0gJ18nKSB7CisgICAgICAgICAgICBjaGFyICpwOworICAgICAgICAgICAgY2hhciAqc3JjOworICAgICAgICAgICAgY2hhciAqZGVzdDsKKyAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbjsKKyAgICAgICAgICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCisgICAgICAgICAgICAgICAgcHJpbnRmKCJMYWJlbCAlcyBpcyBhIGtleXdvcmRcbiIsIGxiLT5sYl9zdHIpOworICAgICAgICAgICAgbGItPmxiX3R5cGUgPSBOQU1FOworICAgICAgICAgICAgc3JjID0gbGItPmxiX3N0ciArIDE7CisgICAgICAgICAgICBwID0gc3RyY2hyKHNyYywgJ1wnJyk7CisgICAgICAgICAgICBpZiAocCkKKyAgICAgICAgICAgICAgICBuYW1lX2xlbiA9IHAgLSBzcmM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmFtZV9sZW4gPSBzdHJsZW4oc3JjKTsKKyAgICAgICAgICAgIGRlc3QgPSAoY2hhciAqKW1hbGxvYyhuYW1lX2xlbiArIDEpOworICAgICAgICAgICAgaWYgKCFkZXN0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJDYW4ndCBhbGxvYyBkZXN0ICclcydcbiIsIHNyYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybmNweShkZXN0LCBzcmMsIG5hbWVfbGVuKTsKKyAgICAgICAgICAgIGRlc3RbbmFtZV9sZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIGZyZWUobGItPmxiX3N0cik7CisgICAgICAgICAgICBsYi0+bGJfc3RyID0gZGVzdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsYi0+bGJfc3RyWzJdID09IGxiLT5sYl9zdHJbMF0pIHsKKyAgICAgICAgICAgIGludCB0eXBlID0gKGludCkgUHlUb2tlbl9PbmVDaGFyKGxiLT5sYl9zdHJbMV0pOworICAgICAgICAgICAgaWYgKHR5cGUgIT0gT1ApIHsKKyAgICAgICAgICAgICAgICBsYi0+bGJfdHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgZnJlZShsYi0+bGJfc3RyKTsKKyAgICAgICAgICAgICAgICBsYi0+bGJfc3RyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIlVua25vd24gT1AgbGFiZWwgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxiLT5sYl9zdHJbMl0gJiYgbGItPmxiX3N0clszXSA9PSBsYi0+bGJfc3RyWzBdKSB7CisgICAgICAgICAgICBpbnQgdHlwZSA9IChpbnQpIFB5VG9rZW5fVHdvQ2hhcnMobGItPmxiX3N0clsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxiLT5sYl9zdHJbMl0pOworICAgICAgICAgICAgaWYgKHR5cGUgIT0gT1ApIHsKKyAgICAgICAgICAgICAgICBsYi0+bGJfdHlwZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgZnJlZShsYi0+bGJfc3RyKTsKKyAgICAgICAgICAgICAgICBsYi0+bGJfc3RyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwcmludGYoIlVua25vd24gT1AgbGFiZWwgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGxiLT5sYl9zdHJbMl0gJiYgbGItPmxiX3N0clszXSAmJiBsYi0+bGJfc3RyWzRdID09IGxiLT5sYl9zdHJbMF0pIHsKKyAgICAgICAgICAgIGludCB0eXBlID0gKGludCkgUHlUb2tlbl9UaHJlZUNoYXJzKGxiLT5sYl9zdHJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYi0+bGJfc3RyWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGItPmxiX3N0clszXSk7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBPUCkgeworICAgICAgICAgICAgICAgIGxiLT5sYl90eXBlID0gdHlwZTsKKyAgICAgICAgICAgICAgICBmcmVlKGxiLT5sYl9zdHIpOworICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigiVW5rbm93biBPUCBsYWJlbCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgbGItPmxiX3N0cik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpbnRmKCJDYW4ndCB0cmFuc2xhdGUgU1RSSU5HIGxhYmVsICVzXG4iLAorICAgICAgICAgICAgICAgIGxiLT5sYl9zdHIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHByaW50ZigiQ2FuJ3QgdHJhbnNsYXRlIGxhYmVsICclcydcbiIsCisgICAgICAgICAgICAgICBQeUdyYW1tYXJfTGFiZWxSZXByKGxiKSk7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvZ3JhbW1hcjEuYyBiL1BhcnNlci9ncmFtbWFyMS5jCmluZGV4IGI3NjcxOWEuLjFmN2QyNjQgMTAwNjQ0Ci0tLSBhL1BhcnNlci9ncmFtbWFyMS5jCisrKyBiL1BhcnNlci9ncmFtbWFyMS5jCkBAIC0xMSw0NyArMTEsNDcgQEAKIGRmYSAqCiBQeUdyYW1tYXJfRmluZERGQShncmFtbWFyICpnLCByZWdpc3RlciBpbnQgdHlwZSkKIHsKLQlyZWdpc3RlciBkZmEgKmQ7CisgICAgcmVnaXN0ZXIgZGZhICpkOwogI2lmIDEKLQkvKiBNYXNzaXZlIHNwZWVkLXVwICovCi0JZCA9ICZnLT5nX2RmYVt0eXBlIC0gTlRfT0ZGU0VUXTsKLQlhc3NlcnQoZC0+ZF90eXBlID09IHR5cGUpOwotCXJldHVybiBkOworICAgIC8qIE1hc3NpdmUgc3BlZWQtdXAgKi8KKyAgICBkID0gJmctPmdfZGZhW3R5cGUgLSBOVF9PRkZTRVRdOworICAgIGFzc2VydChkLT5kX3R5cGUgPT0gdHlwZSk7CisgICAgcmV0dXJuIGQ7CiAjZWxzZQotCS8qIE9sZCwgc2xvdyB2ZXJzaW9uICovCi0JcmVnaXN0ZXIgaW50IGk7Ci0JCi0JZm9yIChpID0gZy0+Z19uZGZhcywgZCA9IGctPmdfZGZhOyAtLWkgPj0gMDsgZCsrKSB7Ci0JCWlmIChkLT5kX3R5cGUgPT0gdHlwZSkKLQkJCXJldHVybiBkOwotCX0KLQlhc3NlcnQoMCk7Ci0JLyogTk9UUkVBQ0hFRCAqLworICAgIC8qIE9sZCwgc2xvdyB2ZXJzaW9uICovCisgICAgcmVnaXN0ZXIgaW50IGk7CisKKyAgICBmb3IgKGkgPSBnLT5nX25kZmFzLCBkID0gZy0+Z19kZmE7IC0taSA+PSAwOyBkKyspIHsKKyAgICAgICAgaWYgKGQtPmRfdHlwZSA9PSB0eXBlKQorICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgfQorICAgIGFzc2VydCgwKTsKKyAgICAvKiBOT1RSRUFDSEVEICovCiAjZW5kaWYKIH0KIAogY2hhciAqCiBQeUdyYW1tYXJfTGFiZWxSZXByKGxhYmVsICpsYikKIHsKLQlzdGF0aWMgY2hhciBidWZbMTAwXTsKLQkKLQlpZiAobGItPmxiX3R5cGUgPT0gRU5ETUFSS0VSKQotCQlyZXR1cm4gIkVNUFRZIjsKLQllbHNlIGlmIChJU05PTlRFUk1JTkFMKGxiLT5sYl90eXBlKSkgewotCQlpZiAobGItPmxiX3N0ciA9PSBOVUxMKSB7Ci0JCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJOVCVkIiwgbGItPmxiX3R5cGUpOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gbGItPmxiX3N0cjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChsYi0+bGJfc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gX1B5UGFyc2VyX1Rva2VuTmFtZXNbbGItPmxiX3R5cGVdOwotCQllbHNlIHsKLQkJCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUuMzJzKCUuMzJzKSIsCi0JCQkJX1B5UGFyc2VyX1Rva2VuTmFtZXNbbGItPmxiX3R5cGVdLCBsYi0+bGJfc3RyKTsKLQkJCXJldHVybiBidWY7Ci0JCX0KLQl9CisgICAgc3RhdGljIGNoYXIgYnVmWzEwMF07CisKKyAgICBpZiAobGItPmxiX3R5cGUgPT0gRU5ETUFSS0VSKQorICAgICAgICByZXR1cm4gIkVNUFRZIjsKKyAgICBlbHNlIGlmIChJU05PTlRFUk1JTkFMKGxiLT5sYl90eXBlKSkgeworICAgICAgICBpZiAobGItPmxiX3N0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJOVCVkIiwgbGItPmxiX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbGItPmxiX3N0cjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChsYi0+bGJfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gX1B5UGFyc2VyX1Rva2VuTmFtZXNbbGItPmxiX3R5cGVdOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUuMzJzKCUuMzJzKSIsCisgICAgICAgICAgICAgICAgX1B5UGFyc2VyX1Rva2VuTmFtZXNbbGItPmxiX3R5cGVdLCBsYi0+bGJfc3RyKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvaW50cmNoZWNrLmMgYi9QYXJzZXIvaW50cmNoZWNrLmMKaW5kZXggMTM1NjE5MS4uMWM4ODhhNSAxMDA2NDQKLS0tIGEvUGFyc2VyL2ludHJjaGVjay5jCisrKyBiL1BhcnNlci9pbnRyY2hlY2suYwpAQCAtMjEsNyArMjEsNyBAQAogaW50CiBQeU9TX0ludGVycnVwdE9jY3VycmVkKHZvaWQpCiB7Ci0JX3d5aWVsZCgpOworICAgIF93eWllbGQoKTsKIH0KIAogI2RlZmluZSBPSwpAQCAtNDcsNyArNDcsNyBAQAogdm9pZAogUHlPU19Jbml0SW50ZXJydXB0cyh2b2lkKQogewotCV9nbzMyX3dhbnRfY3RybF9icmVhaygxIC8qIFRSVUUgKi8pOworICAgIF9nbzMyX3dhbnRfY3RybF9icmVhaygxIC8qIFRSVUUgKi8pOwogfQogCiB2b2lkCkBAIC01OCw3ICs1OCw3IEBACiBpbnQKIFB5T1NfSW50ZXJydXB0T2NjdXJyZWQodm9pZCkKIHsKLQlyZXR1cm4gX2dvMzJfd2FzX2N0cmxfYnJlYWtfaGl0KCk7CisgICAgcmV0dXJuIF9nbzMyX3dhc19jdHJsX2JyZWFrX2hpdCgpOwogfQogCiAjZWxzZSAvKiAhX19HTlVDX18gKi8KQEAgLTc4LDEyICs3OCwxMiBAQAogaW50CiBQeU9TX0ludGVycnVwdE9jY3VycmVkKHZvaWQpCiB7Ci0JaW50IGludGVycnVwdGVkID0gMDsKLQl3aGlsZSAoa2JoaXQoKSkgewotCQlpZiAoZ2V0Y2goKSA9PSAnXDAwMycpCi0JCQlpbnRlcnJ1cHRlZCA9IDE7Ci0JfQotCXJldHVybiBpbnRlcnJ1cHRlZDsKKyAgICBpbnQgaW50ZXJydXB0ZWQgPSAwOworICAgIHdoaWxlIChrYmhpdCgpKSB7CisgICAgICAgIGlmIChnZXRjaCgpID09ICdcMDAzJykKKyAgICAgICAgICAgIGludGVycnVwdGVkID0gMTsKKyAgICB9CisgICAgcmV0dXJuIGludGVycnVwdGVkOwogfQogCiAjZW5kaWYgLyogX19HTlVDX18gKi8KQEAgLTEwNiw3ICsxMDYsNyBAQAogdm9pZAogUHlFcnJfU2V0SW50ZXJydXB0KHZvaWQpCiB7Ci0JaW50ZXJydXB0ZWQgPSAxOworICAgIGludGVycnVwdGVkID0gMTsKIH0KIAogZXh0ZXJuIGludCBQeUVycl9DaGVja1NpZ25hbHModm9pZCk7CkBAIC0xMTQsMzIgKzExNCwzMiBAQAogc3RhdGljIGludAogY2hlY2tzaWduYWxzX3dpdGhhcmcodm9pZCAqIGFyZykKIHsKLQlyZXR1cm4gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CisgICAgcmV0dXJuIFB5RXJyX0NoZWNrU2lnbmFscygpOwogfQogCiBzdGF0aWMgdm9pZAogaW50Y2F0Y2hlcihpbnQgc2lnKQogewotCWV4dGVybiB2b2lkIFB5X0V4aXQoaW50KTsKLQlzdGF0aWMgY2hhciBtZXNzYWdlW10gPQorICAgIGV4dGVybiB2b2lkIFB5X0V4aXQoaW50KTsKKyAgICBzdGF0aWMgY2hhciBtZXNzYWdlW10gPQogInB5dGhvbjogdG8gaW50ZXJydXB0IGEgdHJ1bHkgaGFuZ2luZyBQeXRob24gcHJvZ3JhbSwgaW50ZXJydXB0IG9uY2UgbW9yZS5cbiI7Ci0Jc3dpdGNoIChpbnRlcnJ1cHRlZCsrKSB7Ci0JY2FzZSAwOgotCQlicmVhazsKLQljYXNlIDE6CisgICAgc3dpdGNoIChpbnRlcnJ1cHRlZCsrKSB7CisgICAgY2FzZSAwOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CiAjaWZkZWYgUklTQ09TCi0JCWZwcmludGYoc3RkZXJyLCBtZXNzYWdlKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIG1lc3NhZ2UpOwogI2Vsc2UKLQkJd3JpdGUoMiwgbWVzc2FnZSwgc3RybGVuKG1lc3NhZ2UpKTsKKyAgICAgICAgd3JpdGUoMiwgbWVzc2FnZSwgc3RybGVuKG1lc3NhZ2UpKTsKICNlbmRpZgotCQlicmVhazsKLQljYXNlIDI6Ci0JCWludGVycnVwdGVkID0gMDsKLQkJUHlfRXhpdCgxKTsKLQkJYnJlYWs7Ci0JfQotCVB5T1Nfc2V0c2lnKFNJR0lOVCwgaW50Y2F0Y2hlcik7Ci0JUHlfQWRkUGVuZGluZ0NhbGwoY2hlY2tzaWduYWxzX3dpdGhhcmcsIE5VTEwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGludGVycnVwdGVkID0gMDsKKyAgICAgICAgUHlfRXhpdCgxKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFB5T1Nfc2V0c2lnKFNJR0lOVCwgaW50Y2F0Y2hlcik7CisgICAgUHlfQWRkUGVuZGluZ0NhbGwoY2hlY2tzaWduYWxzX3dpdGhhcmcsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCAoKm9sZF9zaWdpbnRoYW5kbGVyKShpbnQpID0gU0lHX0RGTDsKQEAgLTE0NywyMyArMTQ3LDIzIEBACiB2b2lkCiBQeU9TX0luaXRJbnRlcnJ1cHRzKHZvaWQpCiB7Ci0JaWYgKChvbGRfc2lnaW50aGFuZGxlciA9IFB5T1Nfc2V0c2lnKFNJR0lOVCwgU0lHX0lHTikpICE9IFNJR19JR04pCi0JCVB5T1Nfc2V0c2lnKFNJR0lOVCwgaW50Y2F0Y2hlcik7CisgICAgaWYgKChvbGRfc2lnaW50aGFuZGxlciA9IFB5T1Nfc2V0c2lnKFNJR0lOVCwgU0lHX0lHTikpICE9IFNJR19JR04pCisgICAgICAgIFB5T1Nfc2V0c2lnKFNJR0lOVCwgaW50Y2F0Y2hlcik7CiB9CiAKIHZvaWQKIFB5T1NfRmluaUludGVycnVwdHModm9pZCkKIHsKLQlQeU9TX3NldHNpZyhTSUdJTlQsIG9sZF9zaWdpbnRoYW5kbGVyKTsKKyAgICBQeU9TX3NldHNpZyhTSUdJTlQsIG9sZF9zaWdpbnRoYW5kbGVyKTsKIH0KIAogaW50CiBQeU9TX0ludGVycnVwdE9jY3VycmVkKHZvaWQpCiB7Ci0JaWYgKCFpbnRlcnJ1cHRlZCkKLQkJcmV0dXJuIDA7Ci0JaW50ZXJydXB0ZWQgPSAwOwotCXJldHVybiAxOworICAgIGlmICghaW50ZXJydXB0ZWQpCisgICAgICAgIHJldHVybiAwOworICAgIGludGVycnVwdGVkID0gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogI2VuZGlmIC8qICFPSyAqLwpAQCAtMTcyLDcgKzE3Miw3IEBACiBQeU9TX0FmdGVyRm9yayh2b2lkKQogewogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlFdmFsX1JlSW5pdFRocmVhZHMoKTsKLQlQeVRocmVhZF9SZUluaXRUTFMoKTsKKyAgICBQeUV2YWxfUmVJbml0VGhyZWFkcygpOworICAgIFB5VGhyZWFkX1JlSW5pdFRMUygpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvbGlzdG5vZGUuYyBiL1BhcnNlci9saXN0bm9kZS5jCmluZGV4IGMwYjNiNjYuLmI1ZjhhZDIgMTAwNjQ0Ci0tLSBhL1BhcnNlci9saXN0bm9kZS5jCisrKyBiL1BhcnNlci9saXN0bm9kZS5jCkBAIC0xMiw3ICsxMiw3IEBACiB2b2lkCiBQeU5vZGVfTGlzdFRyZWUobm9kZSAqbikKIHsKLQlsaXN0bm9kZShzdGRvdXQsIG4pOworICAgIGxpc3Rub2RlKHN0ZG91dCwgbik7CiB9CiAKIHN0YXRpYyBpbnQgbGV2ZWwsIGF0Ym9sOwpAQCAtMjAsNDcgKzIwLDQ3IEBACiBzdGF0aWMgdm9pZAogbGlzdG5vZGUoRklMRSAqZnAsIG5vZGUgKm4pCiB7Ci0JbGV2ZWwgPSAwOwotCWF0Ym9sID0gMTsKLQlsaXN0MW5vZGUoZnAsIG4pOworICAgIGxldmVsID0gMDsKKyAgICBhdGJvbCA9IDE7CisgICAgbGlzdDFub2RlKGZwLCBuKTsKIH0KIAogc3RhdGljIHZvaWQKIGxpc3Qxbm9kZShGSUxFICpmcCwgbm9kZSAqbikKIHsKLQlpZiAobiA9PSAwKQotCQlyZXR1cm47Ci0JaWYgKElTTk9OVEVSTUlOQUwoVFlQRShuKSkpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBOQ0gobik7IGkrKykKLQkJCWxpc3Qxbm9kZShmcCwgQ0hJTEQobiwgaSkpOwotCX0KLQllbHNlIGlmIChJU1RFUk1JTkFMKFRZUEUobikpKSB7Ci0JCXN3aXRjaCAoVFlQRShuKSkgewotCQljYXNlIElOREVOVDoKLQkJCSsrbGV2ZWw7Ci0JCQlicmVhazsKLQkJY2FzZSBERURFTlQ6Ci0JCQktLWxldmVsOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoYXRib2wpIHsKLQkJCQlpbnQgaTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgbGV2ZWw7ICsraSkKLQkJCQkJZnByaW50ZihmcCwgIlx0Iik7Ci0JCQkJYXRib2wgPSAwOwotCQkJfQotCQkJaWYgKFRZUEUobikgPT0gTkVXTElORSkgewotCQkJCWlmIChTVFIobikgIT0gTlVMTCkKLQkJCQkJZnByaW50ZihmcCwgIiVzIiwgU1RSKG4pKTsKLQkJCQlmcHJpbnRmKGZwLCAiXG4iKTsKLQkJCQlhdGJvbCA9IDE7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJZnByaW50ZihmcCwgIiVzICIsIFNUUihuKSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQllbHNlCi0JCWZwcmludGYoZnAsICI/ICIpOworICAgIGlmIChuID09IDApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoSVNOT05URVJNSU5BTChUWVBFKG4pKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5DSChuKTsgaSsrKQorICAgICAgICAgICAgbGlzdDFub2RlKGZwLCBDSElMRChuLCBpKSk7CisgICAgfQorICAgIGVsc2UgaWYgKElTVEVSTUlOQUwoVFlQRShuKSkpIHsKKyAgICAgICAgc3dpdGNoIChUWVBFKG4pKSB7CisgICAgICAgIGNhc2UgSU5ERU5UOgorICAgICAgICAgICAgKytsZXZlbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERFREVOVDoKKyAgICAgICAgICAgIC0tbGV2ZWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChhdGJvbCkgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZXZlbDsgKytpKQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHQiKTsKKyAgICAgICAgICAgICAgICBhdGJvbCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoVFlQRShuKSA9PSBORVdMSU5FKSB7CisgICAgICAgICAgICAgICAgaWYgKFNUUihuKSAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXMiLCBTVFIobikpOworICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICJcbiIpOworICAgICAgICAgICAgICAgIGF0Ym9sID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXMgIiwgU1RSKG4pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZnByaW50ZihmcCwgIj8gIik7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvbWV0YWdyYW1tYXIuYyBiL1BhcnNlci9tZXRhZ3JhbW1hci5jCmluZGV4IGI2MWJjNmQuLjUzODEwYjggMTAwNjQ0Ci0tLSBhL1BhcnNlci9tZXRhZ3JhbW1hci5jCisrKyBiL1BhcnNlci9tZXRhZ3JhbW1hci5jCkBAIC00LDE1MiArNCwxNTIgQEAKICNpbmNsdWRlICJncmFtbWFyLmgiCiAjaW5jbHVkZSAicGdlbi5oIgogc3RhdGljIGFyYyBhcmNzXzBfMFszXSA9IHsKLQl7MiwgMH0sCi0JezMsIDB9LAotCXs0LCAxfSwKKyAgICB7MiwgMH0sCisgICAgezMsIDB9LAorICAgIHs0LCAxfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMF8xWzFdID0gewotCXswLCAxfSwKKyAgICB7MCwgMX0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc18wWzJdID0gewotCXszLCBhcmNzXzBfMH0sCi0JezEsIGFyY3NfMF8xfSwKKyAgICB7MywgYXJjc18wXzB9LAorICAgIHsxLCBhcmNzXzBfMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzFfMFsxXSA9IHsKLQl7NSwgMX0sCisgICAgezUsIDF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xXzFbMV0gPSB7Ci0JezYsIDJ9LAorICAgIHs2LCAyfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMV8yWzFdID0gewotCXs3LCAzfSwKKyAgICB7NywgM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzFfM1sxXSA9IHsKLQl7MywgNH0sCisgICAgezMsIDR9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xXzRbMV0gPSB7Ci0JezAsIDR9LAorICAgIHswLCA0fSwKIH07CiBzdGF0aWMgc3RhdGUgc3RhdGVzXzFbNV0gPSB7Ci0JezEsIGFyY3NfMV8wfSwKLQl7MSwgYXJjc18xXzF9LAotCXsxLCBhcmNzXzFfMn0sCi0JezEsIGFyY3NfMV8zfSwKLQl7MSwgYXJjc18xXzR9LAorICAgIHsxLCBhcmNzXzFfMH0sCisgICAgezEsIGFyY3NfMV8xfSwKKyAgICB7MSwgYXJjc18xXzJ9LAorICAgIHsxLCBhcmNzXzFfM30sCisgICAgezEsIGFyY3NfMV80fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMl8wWzFdID0gewotCXs4LCAxfSwKKyAgICB7OCwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzJfMVsyXSA9IHsKLQl7OSwgMH0sCi0JezAsIDF9LAorICAgIHs5LCAwfSwKKyAgICB7MCwgMX0sCiB9Owogc3RhdGljIHN0YXRlIHN0YXRlc18yWzJdID0gewotCXsxLCBhcmNzXzJfMH0sCi0JezIsIGFyY3NfMl8xfSwKKyAgICB7MSwgYXJjc18yXzB9LAorICAgIHsyLCBhcmNzXzJfMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzNfMFsxXSA9IHsKLQl7MTAsIDF9LAorICAgIHsxMCwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzNfMVsyXSA9IHsKLQl7MTAsIDF9LAotCXswLCAxfSwKKyAgICB7MTAsIDF9LAorICAgIHswLCAxfSwKIH07CiBzdGF0aWMgc3RhdGUgc3RhdGVzXzNbMl0gPSB7Ci0JezEsIGFyY3NfM18wfSwKLQl7MiwgYXJjc18zXzF9LAorICAgIHsxLCBhcmNzXzNfMH0sCisgICAgezIsIGFyY3NfM18xfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNF8wWzJdID0gewotCXsxMSwgMX0sCi0JezEzLCAyfSwKKyAgICB7MTEsIDF9LAorICAgIHsxMywgMn0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzRfMVsxXSA9IHsKLQl7NywgM30sCisgICAgezcsIDN9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180XzJbM10gPSB7Ci0JezE0LCA0fSwKLQl7MTUsIDR9LAotCXswLCAyfSwKKyAgICB7MTQsIDR9LAorICAgIHsxNSwgNH0sCisgICAgezAsIDJ9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180XzNbMV0gPSB7Ci0JezEyLCA0fSwKKyAgICB7MTIsIDR9LAogfTsKIHN0YXRpYyBhcmMgYXJjc180XzRbMV0gPSB7Ci0JezAsIDR9LAorICAgIHswLCA0fSwKIH07CiBzdGF0aWMgc3RhdGUgc3RhdGVzXzRbNV0gPSB7Ci0JezIsIGFyY3NfNF8wfSwKLQl7MSwgYXJjc180XzF9LAotCXszLCBhcmNzXzRfMn0sCi0JezEsIGFyY3NfNF8zfSwKLQl7MSwgYXJjc180XzR9LAorICAgIHsyLCBhcmNzXzRfMH0sCisgICAgezEsIGFyY3NfNF8xfSwKKyAgICB7MywgYXJjc180XzJ9LAorICAgIHsxLCBhcmNzXzRfM30sCisgICAgezEsIGFyY3NfNF80fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNV8wWzNdID0gewotCXs1LCAxfSwKLQl7MTYsIDF9LAotCXsxNywgMn0sCisgICAgezUsIDF9LAorICAgIHsxNiwgMX0sCisgICAgezE3LCAyfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfNV8xWzFdID0gewotCXswLCAxfSwKKyAgICB7MCwgMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzVfMlsxXSA9IHsKLQl7NywgM30sCisgICAgezcsIDN9LAogfTsKIHN0YXRpYyBhcmMgYXJjc181XzNbMV0gPSB7Ci0JezE4LCAxfSwKKyAgICB7MTgsIDF9LAogfTsKIHN0YXRpYyBzdGF0ZSBzdGF0ZXNfNVs0XSA9IHsKLQl7MywgYXJjc181XzB9LAotCXsxLCBhcmNzXzVfMX0sCi0JezEsIGFyY3NfNV8yfSwKLQl7MSwgYXJjc181XzN9LAorICAgIHszLCBhcmNzXzVfMH0sCisgICAgezEsIGFyY3NfNV8xfSwKKyAgICB7MSwgYXJjc181XzJ9LAorICAgIHsxLCBhcmNzXzVfM30sCiB9Owogc3RhdGljIGRmYSBkZmFzWzZdID0gewotCXsyNTYsICJNU1RBUlQiLCAwLCAyLCBzdGF0ZXNfMCwKLQkgIlwwNzBcMDAwXDAwMCJ9LAotCXsyNTcsICJSVUxFIiwgMCwgNSwgc3RhdGVzXzEsCi0JICJcMDQwXDAwMFwwMDAifSwKLQl7MjU4LCAiUkhTIiwgMCwgMiwgc3RhdGVzXzIsCi0JICJcMDQwXDAxMFwwMDMifSwKLQl7MjU5LCAiQUxUIiwgMCwgMiwgc3RhdGVzXzMsCi0JICJcMDQwXDAxMFwwMDMifSwKLQl7MjYwLCAiSVRFTSIsIDAsIDUsIHN0YXRlc180LAotCSAiXDA0MFwwMTBcMDAzIn0sCi0JezI2MSwgIkFUT00iLCAwLCA0LCBzdGF0ZXNfNSwKLQkgIlwwNDBcMDAwXDAwMyJ9LAorICAgIHsyNTYsICJNU1RBUlQiLCAwLCAyLCBzdGF0ZXNfMCwKKyAgICAgIlwwNzBcMDAwXDAwMCJ9LAorICAgIHsyNTcsICJSVUxFIiwgMCwgNSwgc3RhdGVzXzEsCisgICAgICJcMDQwXDAwMFwwMDAifSwKKyAgICB7MjU4LCAiUkhTIiwgMCwgMiwgc3RhdGVzXzIsCisgICAgICJcMDQwXDAxMFwwMDMifSwKKyAgICB7MjU5LCAiQUxUIiwgMCwgMiwgc3RhdGVzXzMsCisgICAgICJcMDQwXDAxMFwwMDMifSwKKyAgICB7MjYwLCAiSVRFTSIsIDAsIDUsIHN0YXRlc180LAorICAgICAiXDA0MFwwMTBcMDAzIn0sCisgICAgezI2MSwgIkFUT00iLCAwLCA0LCBzdGF0ZXNfNSwKKyAgICAgIlwwNDBcMDAwXDAwMyJ9LAogfTsKIHN0YXRpYyBsYWJlbCBsYWJlbHNbMTldID0gewotCXswLCAiRU1QVFkifSwKLQl7MjU2LCAwfSwKLQl7MjU3LCAwfSwKLQl7NCwgMH0sCi0JezAsIDB9LAotCXsxLCAwfSwKLQl7MTEsIDB9LAotCXsyNTgsIDB9LAotCXsyNTksIDB9LAotCXsxOCwgMH0sCi0JezI2MCwgMH0sCi0JezksIDB9LAotCXsxMCwgMH0sCi0JezI2MSwgMH0sCi0JezE2LCAwfSwKLQl7MTQsIDB9LAotCXszLCAwfSwKLQl7NywgMH0sCi0JezgsIDB9LAorICAgIHswLCAiRU1QVFkifSwKKyAgICB7MjU2LCAwfSwKKyAgICB7MjU3LCAwfSwKKyAgICB7NCwgMH0sCisgICAgezAsIDB9LAorICAgIHsxLCAwfSwKKyAgICB7MTEsIDB9LAorICAgIHsyNTgsIDB9LAorICAgIHsyNTksIDB9LAorICAgIHsxOCwgMH0sCisgICAgezI2MCwgMH0sCisgICAgezksIDB9LAorICAgIHsxMCwgMH0sCisgICAgezI2MSwgMH0sCisgICAgezE2LCAwfSwKKyAgICB7MTQsIDB9LAorICAgIHszLCAwfSwKKyAgICB7NywgMH0sCisgICAgezgsIDB9LAogfTsKIHN0YXRpYyBncmFtbWFyIF9QeVBhcnNlcl9HcmFtbWFyID0gewotCTYsCi0JZGZhcywKLQl7MTksIGxhYmVsc30sCi0JMjU2CisgICAgNiwKKyAgICBkZmFzLAorICAgIHsxOSwgbGFiZWxzfSwKKyAgICAyNTYKIH07CiAKIGdyYW1tYXIgKgogbWV0YV9ncmFtbWFyKHZvaWQpCiB7Ci0JcmV0dXJuICZfUHlQYXJzZXJfR3JhbW1hcjsKKyAgICByZXR1cm4gJl9QeVBhcnNlcl9HcmFtbWFyOwogfQogCiBncmFtbWFyICoKZGlmZiAtLWdpdCBhL1BhcnNlci9teXJlYWRsaW5lLmMgYi9QYXJzZXIvbXlyZWFkbGluZS5jCmluZGV4IDMyYTEwODguLjEyMmY4OTYgMTAwNjQ0Ci0tLSBhL1BhcnNlci9teXJlYWRsaW5lLmMKKysrIGIvUGFyc2VyL215cmVhZGxpbmUuYwpAQCAtMzksNjcgKzM5LDY3IEBACiBzdGF0aWMgaW50CiBteV9mZ2V0cyhjaGFyICpidWYsIGludCBsZW4sIEZJTEUgKmZwKQogewotCWNoYXIgKnA7Ci0JZm9yICg7OykgewotCQlpZiAoUHlPU19JbnB1dEhvb2sgIT0gTlVMTCkKLQkJCSh2b2lkKShQeU9TX0lucHV0SG9vaykoKTsKLQkJZXJybm8gPSAwOwotCQlwID0gZmdldHMoYnVmLCBsZW4sIGZwKTsKLQkJaWYgKHAgIT0gTlVMTCkKLQkJCXJldHVybiAwOyAvKiBObyBlcnJvciAqLworICAgIGNoYXIgKnA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoUHlPU19JbnB1dEhvb2sgIT0gTlVMTCkKKyAgICAgICAgICAgICh2b2lkKShQeU9TX0lucHV0SG9vaykoKTsKKyAgICAgICAgZXJybm8gPSAwOworICAgICAgICBwID0gZmdldHMoYnVmLCBsZW4sIGZwKTsKKyAgICAgICAgaWYgKHAgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBObyBlcnJvciAqLwogI2lmZGVmIE1TX1dJTkRPV1MKLQkJLyogSW4gdGhlIGNhc2Ugb2YgYSBDdHJsK0Mgb3Igc29tZSBvdGhlciBleHRlcm5hbCBldmVudCAKLQkJICAgaW50ZXJydXB0aW5nIHRoZSBvcGVyYXRpb246Ci0JCSAgIFdpbjJrL05UOiBFUlJPUl9PUEVSQVRJT05fQUJPUlRFRCBpcyB0aGUgbW9zdCByZWNlbnQgV2luMzIgCi0JCSAgIGVycm9yIGNvZGUgKGFuZCBmZW9mKCkgcmV0dXJucyBUUlVFKS4KLQkJICAgV2luOXg6IEN0cmwrQyBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdCBvbiBmZ2V0cygpIHJldHVybmluZwotCQkgICBlYXJseSAtIHRoZSBzaWduYWwgaGFuZGxlciBpcyBjYWxsZWQsIGJ1dCB0aGUgZmdldHMoKQotCQkgICBvbmx5IHJldHVybnMgIm5vcm1hbGx5IiAoaWUsIHdoZW4gRW50ZXIgaGl0IG9yIGZlb2YoKSkKLQkJKi8KLQkJaWYgKEdldExhc3RFcnJvcigpPT1FUlJPUl9PUEVSQVRJT05fQUJPUlRFRCkgewotCQkJLyogU2lnbmFscyBjb21lIGFzeW5jaHJvbm91c2x5LCBzbyB3ZSBzbGVlcCBhIGJyaWVmIAotCQkJICAgbW9tZW50IGJlZm9yZSBjaGVja2luZyBpZiB0aGUgaGFuZGxlciBoYXMgYmVlbiAKLQkJCSAgIHRyaWdnZXJlZCAod2UgY2FudCBqdXN0IHJldHVybiAxIGJlZm9yZSB0aGUgCi0JCQkgICBzaWduYWwgaGFuZGxlciBoYXMgYmVlbiBjYWxsZWQsIGFzIHRoZSBsYXRlciAKLQkJCSAgIHNpZ25hbCBtYXkgYmUgdHJlYXRlZCBhcyBhIHNlcGFyYXRlIGludGVycnVwdCkuCi0JCQkqLwotCQkJU2xlZXAoMSk7Ci0JCQlpZiAoUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpKSB7Ci0JCQkJcmV0dXJuIDE7IC8qIEludGVycnVwdCAqLwotCQkJfQotCQkJLyogRWl0aGVyIHRoZSBzbGVlcCB3YXNuJ3QgbG9uZyBlbm91Z2ggKG5lZWQgYQotCQkJICAgc2hvcnQgbG9vcCByZXRyeWluZz8pIG9yIG5vdCBpbnRlcnJ1cHRlZCBhdCBhbGwKLQkJCSAgIChpbiB3aGljaCBjYXNlIHdlIHNob3VsZCByZXZpc2l0IHRoZSB3aG9sZSB0aGluZyEpCi0JCQkgICBMb2dnaW5nIHNvbWUgd2FybmluZyB3b3VsZCBiZSBuaWNlLiAgYXNzZXJ0IGlzIG5vdAotCQkJICAgdmlhYmxlIGFzIHVuZGVyIHRoZSBkZWJ1Z2dlciwgdGhlIHZhcmlvdXMgZGlhbG9ncwotCQkJICAgbWVhbiB0aGUgY29uZGl0aW9uIGlzIG5vdCB0cnVlLgotCQkJKi8KLQkJfQorICAgICAgICAvKiBJbiB0aGUgY2FzZSBvZiBhIEN0cmwrQyBvciBzb21lIG90aGVyIGV4dGVybmFsIGV2ZW50CisgICAgICAgICAgIGludGVycnVwdGluZyB0aGUgb3BlcmF0aW9uOgorICAgICAgICAgICBXaW4yay9OVDogRVJST1JfT1BFUkFUSU9OX0FCT1JURUQgaXMgdGhlIG1vc3QgcmVjZW50IFdpbjMyCisgICAgICAgICAgIGVycm9yIGNvZGUgKGFuZCBmZW9mKCkgcmV0dXJucyBUUlVFKS4KKyAgICAgICAgICAgV2luOXg6IEN0cmwrQyBzZWVtcyB0byBoYXZlIG5vIGVmZmVjdCBvbiBmZ2V0cygpIHJldHVybmluZworICAgICAgICAgICBlYXJseSAtIHRoZSBzaWduYWwgaGFuZGxlciBpcyBjYWxsZWQsIGJ1dCB0aGUgZmdldHMoKQorICAgICAgICAgICBvbmx5IHJldHVybnMgIm5vcm1hbGx5IiAoaWUsIHdoZW4gRW50ZXIgaGl0IG9yIGZlb2YoKSkKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKEdldExhc3RFcnJvcigpPT1FUlJPUl9PUEVSQVRJT05fQUJPUlRFRCkgeworICAgICAgICAgICAgLyogU2lnbmFscyBjb21lIGFzeW5jaHJvbm91c2x5LCBzbyB3ZSBzbGVlcCBhIGJyaWVmCisgICAgICAgICAgICAgICBtb21lbnQgYmVmb3JlIGNoZWNraW5nIGlmIHRoZSBoYW5kbGVyIGhhcyBiZWVuCisgICAgICAgICAgICAgICB0cmlnZ2VyZWQgKHdlIGNhbnQganVzdCByZXR1cm4gMSBiZWZvcmUgdGhlCisgICAgICAgICAgICAgICBzaWduYWwgaGFuZGxlciBoYXMgYmVlbiBjYWxsZWQsIGFzIHRoZSBsYXRlcgorICAgICAgICAgICAgICAgc2lnbmFsIG1heSBiZSB0cmVhdGVkIGFzIGEgc2VwYXJhdGUgaW50ZXJydXB0KS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBTbGVlcCgxKTsKKyAgICAgICAgICAgIGlmIChQeU9TX0ludGVycnVwdE9jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogSW50ZXJydXB0ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBFaXRoZXIgdGhlIHNsZWVwIHdhc24ndCBsb25nIGVub3VnaCAobmVlZCBhCisgICAgICAgICAgICAgICBzaG9ydCBsb29wIHJldHJ5aW5nPykgb3Igbm90IGludGVycnVwdGVkIGF0IGFsbAorICAgICAgICAgICAgICAgKGluIHdoaWNoIGNhc2Ugd2Ugc2hvdWxkIHJldmlzaXQgdGhlIHdob2xlIHRoaW5nISkKKyAgICAgICAgICAgICAgIExvZ2dpbmcgc29tZSB3YXJuaW5nIHdvdWxkIGJlIG5pY2UuICBhc3NlcnQgaXMgbm90CisgICAgICAgICAgICAgICB2aWFibGUgYXMgdW5kZXIgdGhlIGRlYnVnZ2VyLCB0aGUgdmFyaW91cyBkaWFsb2dzCisgICAgICAgICAgICAgICBtZWFuIHRoZSBjb25kaXRpb24gaXMgbm90IHRydWUuCisgICAgICAgICAgICAqLworICAgICAgICB9CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwotCQlpZiAoZmVvZihmcCkpIHsKLQkJCXJldHVybiAtMTsgLyogRU9GICovCi0JCX0KKyAgICAgICAgaWYgKGZlb2YoZnApKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7IC8qIEVPRiAqLworICAgICAgICB9CiAjaWZkZWYgRUlOVFIKLQkJaWYgKGVycm5vID09IEVJTlRSKSB7Ci0JCQlpbnQgczsKKyAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CisgICAgICAgICAgICBpbnQgczsKICNpZmRlZiBXSVRIX1RIUkVBRAotCQkJUHlFdmFsX1Jlc3RvcmVUaHJlYWQoX1B5T1NfUmVhZGxpbmVUU3RhdGUpOworICAgICAgICAgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoX1B5T1NfUmVhZGxpbmVUU3RhdGUpOwogI2VuZGlmCi0JCQlzID0gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CisgICAgICAgICAgICBzID0gUHlFcnJfQ2hlY2tTaWduYWxzKCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJCVB5RXZhbF9TYXZlVGhyZWFkKCk7CisgICAgICAgICAgICBQeUV2YWxfU2F2ZVRocmVhZCgpOwogI2VuZGlmCi0JCQlpZiAocyA8IDApIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgaWYgKHMgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbmRpZgotCQlpZiAoUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCgpKSB7Ci0JCQlyZXR1cm4gMTsgLyogSW50ZXJydXB0ICovCi0JCX0KLQkJcmV0dXJuIC0yOyAvKiBFcnJvciAqLwotCX0KLQkvKiBOT1RSRUFDSEVEICovCisgICAgICAgIGlmIChQeU9TX0ludGVycnVwdE9jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAxOyAvKiBJbnRlcnJ1cHQgKi8KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTI7IC8qIEVycm9yICovCisgICAgfQorICAgIC8qIE5PVFJFQUNIRUQgKi8KIH0KIAogCkBAIC0xMDgsNTAgKzEwOCw1MCBAQAogY2hhciAqCiBQeU9TX1N0ZGlvUmVhZGxpbmUoRklMRSAqc3lzX3N0ZGluLCBGSUxFICpzeXNfc3Rkb3V0LCBjaGFyICpwcm9tcHQpCiB7Ci0Jc2l6ZV90IG47Ci0JY2hhciAqcDsKLQluID0gMTAwOwotCWlmICgocCA9IChjaGFyICopUHlNZW1fTUFMTE9DKG4pKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmZmx1c2goc3lzX3N0ZG91dCk7CisgICAgc2l6ZV90IG47CisgICAgY2hhciAqcDsKKyAgICBuID0gMTAwOworICAgIGlmICgocCA9IChjaGFyICopUHlNZW1fTUFMTE9DKG4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmZmx1c2goc3lzX3N0ZG91dCk7CiAjaWZuZGVmIFJJU0NPUwotCWlmIChwcm9tcHQpCi0JCWZwcmludGYoc3RkZXJyLCAiJXMiLCBwcm9tcHQpOworICAgIGlmIChwcm9tcHQpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBwcm9tcHQpOwogI2Vsc2UKLQlpZiAocHJvbXB0KSB7Ci0JCWlmKFB5X1JJU0NPU1dpbXBGbGFnKQotCQkJZnByaW50ZihzdGRlcnIsICJceDBjciVzXHgwYyIsIHByb21wdCk7Ci0JCWVsc2UKLQkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBwcm9tcHQpOwotCX0KKyAgICBpZiAocHJvbXB0KSB7CisgICAgICAgIGlmKFB5X1JJU0NPU1dpbXBGbGFnKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJceDBjciVzXHgwYyIsIHByb21wdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBwcm9tcHQpOworICAgIH0KICNlbmRpZgotCWZmbHVzaChzdGRlcnIpOwotCXN3aXRjaCAobXlfZmdldHMocCwgKGludCluLCBzeXNfc3RkaW4pKSB7Ci0JY2FzZSAwOiAvKiBOb3JtYWwgY2FzZSAqLwotCQlicmVhazsKLQljYXNlIDE6IC8qIEludGVycnVwdCAqLwotCQlQeU1lbV9GUkVFKHApOwotCQlyZXR1cm4gTlVMTDsKLQljYXNlIC0xOiAvKiBFT0YgKi8KLQljYXNlIC0yOiAvKiBFcnJvciAqLwotCWRlZmF1bHQ6IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KLQkJKnAgPSAnXDAnOwotCQlicmVhazsKLQl9Ci0JbiA9IHN0cmxlbihwKTsKLQl3aGlsZSAobiA+IDAgJiYgcFtuLTFdICE9ICdcbicpIHsKLQkJc2l6ZV90IGluY3IgPSBuKzI7Ci0JCXAgPSAoY2hhciAqKVB5TWVtX1JFQUxMT0MocCwgbiArIGluY3IpOwotCQlpZiAocCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChpbmNyID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnB1dCBsaW5lIHRvbyBsb25nIik7Ci0JCX0KLQkJaWYgKG15X2ZnZXRzKHArbiwgKGludClpbmNyLCBzeXNfc3RkaW4pICE9IDApCi0JCQlicmVhazsKLQkJbiArPSBzdHJsZW4ocCtuKTsKLQl9Ci0JcmV0dXJuIChjaGFyICopUHlNZW1fUkVBTExPQyhwLCBuKzEpOworICAgIGZmbHVzaChzdGRlcnIpOworICAgIHN3aXRjaCAobXlfZmdldHMocCwgKGludCluLCBzeXNfc3RkaW4pKSB7CisgICAgY2FzZSAwOiAvKiBOb3JtYWwgY2FzZSAqLworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8qIEludGVycnVwdCAqLworICAgICAgICBQeU1lbV9GUkVFKHApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjYXNlIC0xOiAvKiBFT0YgKi8KKyAgICBjYXNlIC0yOiAvKiBFcnJvciAqLworICAgIGRlZmF1bHQ6IC8qIFNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgKnAgPSAnXDAnOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgbiA9IHN0cmxlbihwKTsKKyAgICB3aGlsZSAobiA+IDAgJiYgcFtuLTFdICE9ICdcbicpIHsKKyAgICAgICAgc2l6ZV90IGluY3IgPSBuKzI7CisgICAgICAgIHAgPSAoY2hhciAqKVB5TWVtX1JFQUxMT0MocCwgbiArIGluY3IpOworICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChpbmNyID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnB1dCBsaW5lIHRvbyBsb25nIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG15X2ZnZXRzKHArbiwgKGludClpbmNyLCBzeXNfc3RkaW4pICE9IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbiArPSBzdHJsZW4ocCtuKTsKKyAgICB9CisgICAgcmV0dXJuIChjaGFyICopUHlNZW1fUkVBTExPQyhwLCBuKzEpOwogfQogCiAKQEAgLTE2OCw1MiArMTY4LDUyIEBACiBjaGFyICoKIFB5T1NfUmVhZGxpbmUoRklMRSAqc3lzX3N0ZGluLCBGSUxFICpzeXNfc3Rkb3V0LCBjaGFyICpwcm9tcHQpCiB7Ci0JY2hhciAqcnY7CisgICAgY2hhciAqcnY7CiAKLQlpZiAoX1B5T1NfUmVhZGxpbmVUU3RhdGUgPT0gUHlUaHJlYWRTdGF0ZV9HRVQoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCSJjYW4ndCByZS1lbnRlciByZWFkbGluZSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JCisgICAgaWYgKF9QeU9TX1JlYWRsaW5lVFN0YXRlID09IFB5VGhyZWFkU3RhdGVfR0VUKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCByZS1lbnRlciByZWFkbGluZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciA9PSBOVUxMKSB7CisKKyAgICBpZiAoUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciA9PSBOVUxMKSB7CiAjaWZkZWYgX19WTVMKLSAgICAgICAgICAgICAgICBQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyID0gdm1zX19TdGRpb1JlYWRsaW5lOworICAgICAgICBQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyID0gdm1zX19TdGRpb1JlYWRsaW5lOwogI2Vsc2UKLSAgICAgICAgICAgICAgICBQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyID0gUHlPU19TdGRpb1JlYWRsaW5lOworICAgICAgICBQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyID0gUHlPU19TdGRpb1JlYWRsaW5lOwogI2VuZGlmCi0JfQotCQotI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKF9QeU9TX1JlYWRsaW5lTG9jayA9PSBOVUxMKSB7Ci0JCV9QeU9TX1JlYWRsaW5lTG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsJCQotCX0KLSNlbmRpZgotCi0JX1B5T1NfUmVhZGxpbmVUU3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhfUHlPU19SZWFkbGluZUxvY2ssIDEpOwotI2VuZGlmCi0KLSAgICAgICAgLyogVGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlIHRoZSB1bmxpa2VseSBjYXNlIHRoYXQgdGhlCi0gICAgICAgICAqIGludGVycHJldGVyIGlzIGluIGludGVyYWN0aXZlIG1vZGUgKmFuZCogc3RkaW4vb3V0IGFyZSBub3QKLSAgICAgICAgICogYSB0dHkuICBUaGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlIGlmIHB5dGhvbiBpcyBydW4gbGlrZQotICAgICAgICAgKiB0aGlzOiBweXRob24gLWkgPCB0ZXN0MS5weQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFpc2F0dHkgKGZpbGVubyAoc3lzX3N0ZGluKSkgfHwgIWlzYXR0eSAoZmlsZW5vIChzeXNfc3Rkb3V0KSkpCi0gICAgICAgICAgICAgICAgcnYgPSBQeU9TX1N0ZGlvUmVhZGxpbmUgKHN5c19zdGRpbiwgc3lzX3N0ZG91dCwgcHJvbXB0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJ2ID0gKCpQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyKShzeXNfc3RkaW4sIHN5c19zdGRvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdCk7Ci0JUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhfUHlPU19SZWFkbGluZUxvY2spOworICAgIGlmIChfUHlPU19SZWFkbGluZUxvY2sgPT0gTlVMTCkgeworICAgICAgICBfUHlPU19SZWFkbGluZUxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgfQogI2VuZGlmCiAKLQlfUHlPU19SZWFkbGluZVRTdGF0ZSA9IE5VTEw7CisgICAgX1B5T1NfUmVhZGxpbmVUU3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhfUHlPU19SZWFkbGluZUxvY2ssIDEpOworI2VuZGlmCiAKLQlyZXR1cm4gcnY7CisgICAgLyogVGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlIHRoZSB1bmxpa2VseSBjYXNlIHRoYXQgdGhlCisgICAgICogaW50ZXJwcmV0ZXIgaXMgaW4gaW50ZXJhY3RpdmUgbW9kZSAqYW5kKiBzdGRpbi9vdXQgYXJlIG5vdAorICAgICAqIGEgdHR5LiAgVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSBpZiBweXRob24gaXMgcnVuIGxpa2UKKyAgICAgKiB0aGlzOiBweXRob24gLWkgPCB0ZXN0MS5weQorICAgICAqLworICAgIGlmICghaXNhdHR5IChmaWxlbm8gKHN5c19zdGRpbikpIHx8ICFpc2F0dHkgKGZpbGVubyAoc3lzX3N0ZG91dCkpKQorICAgICAgICBydiA9IFB5T1NfU3RkaW9SZWFkbGluZSAoc3lzX3N0ZGluLCBzeXNfc3Rkb3V0LCBwcm9tcHQpOworICAgIGVsc2UKKyAgICAgICAgcnYgPSAoKlB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIpKHN5c19zdGRpbiwgc3lzX3N0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKF9QeU9TX1JlYWRsaW5lTG9jayk7CisjZW5kaWYKKworICAgIF9QeU9TX1JlYWRsaW5lVFN0YXRlID0gTlVMTDsKKworICAgIHJldHVybiBydjsKIH0KZGlmZiAtLWdpdCBhL1BhcnNlci9ub2RlLmMgYi9QYXJzZXIvbm9kZS5jCmluZGV4IGY0Yzg2Y2IuLjllYmE3NmIgMTAwNjQ0Ci0tLSBhL1BhcnNlci9ub2RlLmMKKysrIGIvUGFyc2VyL25vZGUuYwpAQCAtNywzMCArNywzMCBAQAogbm9kZSAqCiBQeU5vZGVfTmV3KGludCB0eXBlKQogewotCW5vZGUgKm4gPSAobm9kZSAqKSBQeU9iamVjdF9NQUxMT0MoMSAqIHNpemVvZihub2RlKSk7Ci0JaWYgKG4gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jbi0+bl90eXBlID0gdHlwZTsKLQluLT5uX3N0ciA9IE5VTEw7Ci0Jbi0+bl9saW5lbm8gPSAwOwotCW4tPm5fbmNoaWxkcmVuID0gMDsKLQluLT5uX2NoaWxkID0gTlVMTDsKLQlyZXR1cm4gbjsKKyAgICBub2RlICpuID0gKG5vZGUgKikgUHlPYmplY3RfTUFMTE9DKDEgKiBzaXplb2Yobm9kZSkpOworICAgIGlmIChuID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG4tPm5fdHlwZSA9IHR5cGU7CisgICAgbi0+bl9zdHIgPSBOVUxMOworICAgIG4tPm5fbGluZW5vID0gMDsKKyAgICBuLT5uX25jaGlsZHJlbiA9IDA7CisgICAgbi0+bl9jaGlsZCA9IE5VTEw7CisgICAgcmV0dXJuIG47CiB9CiAKIC8qIFNlZSBjb21tZW50cyBhdCBYWFhST1VORFVQIGJlbG93LiAgUmV0dXJucyAtMSBvbiBvdmVyZmxvdy4gKi8KIHN0YXRpYyBpbnQKIGZhbmN5X3JvdW5kdXAoaW50IG4pCiB7Ci0JLyogUm91bmQgdXAgdG8gdGhlIGNsb3Nlc3QgcG93ZXIgb2YgMiA+PSBuLiAqLwotCWludCByZXN1bHQgPSAyNTY7Ci0JYXNzZXJ0KG4gPiAxMjgpOwotCXdoaWxlIChyZXN1bHQgPCBuKSB7Ci0JCXJlc3VsdCA8PD0gMTsKLQkJaWYgKHJlc3VsdCA8PSAwKQotCQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIFJvdW5kIHVwIHRvIHRoZSBjbG9zZXN0IHBvd2VyIG9mIDIgPj0gbi4gKi8KKyAgICBpbnQgcmVzdWx0ID0gMjU2OworICAgIGFzc2VydChuID4gMTI4KTsKKyAgICB3aGlsZSAocmVzdWx0IDwgbikgeworICAgICAgICByZXN1bHQgPDw9IDE7CisgICAgICAgIGlmIChyZXN1bHQgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogQSBnaW1taWNrIHRvIG1ha2UgbWFzc2l2ZSBudW1iZXJzIG9mIHJlYWxsb2NzIHF1aWNrZXIuICBUaGUgcmVzdWx0IGlzCkBAIC03MCw0NiArNzAsNDYgQEAKICAqIE5vdGUgdGhhdCB0aGlzIHdvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCBpZiBhIG5vZGUgc3RvcmVkIGl0cyBjdXJyZW50CiAgKiBjYXBhY2l0eS4gIFRoZSBjb2RlIGlzIHRyaWNreSB0byBhdm9pZCB0aGF0LgogICovCi0jZGVmaW5lIFhYWFJPVU5EVVAobikgKChuKSA8PSAxID8gKG4pIDogCQlcCi0JCSAgICAgICAobikgPD0gMTI4ID8gKCgobikgKyAzKSAmIH4zKSA6CVwKLQkJICAgICAgIGZhbmN5X3JvdW5kdXAobikpCisjZGVmaW5lIFhYWFJPVU5EVVAobikgKChuKSA8PSAxID8gKG4pIDogICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIChuKSA8PSAxMjggPyAoKChuKSArIDMpICYgfjMpIDogICAgICAgICAgXAorICAgICAgICAgICAgICAgZmFuY3lfcm91bmR1cChuKSkKIAogCiBpbnQKIFB5Tm9kZV9BZGRDaGlsZChyZWdpc3RlciBub2RlICpuMSwgaW50IHR5cGUsIGNoYXIgKnN0ciwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQpCiB7Ci0JY29uc3QgaW50IG5jaCA9IG4xLT5uX25jaGlsZHJlbjsKLQlpbnQgY3VycmVudF9jYXBhY2l0eTsKLQlpbnQgcmVxdWlyZWRfY2FwYWNpdHk7Ci0Jbm9kZSAqbjsKKyAgICBjb25zdCBpbnQgbmNoID0gbjEtPm5fbmNoaWxkcmVuOworICAgIGludCBjdXJyZW50X2NhcGFjaXR5OworICAgIGludCByZXF1aXJlZF9jYXBhY2l0eTsKKyAgICBub2RlICpuOwogCi0JaWYgKG5jaCA9PSBJTlRfTUFYIHx8IG5jaCA8IDApCi0JCXJldHVybiBFX09WRVJGTE9XOworICAgIGlmIChuY2ggPT0gSU5UX01BWCB8fCBuY2ggPCAwKQorICAgICAgICByZXR1cm4gRV9PVkVSRkxPVzsKIAotCWN1cnJlbnRfY2FwYWNpdHkgPSBYWFhST1VORFVQKG5jaCk7Ci0JcmVxdWlyZWRfY2FwYWNpdHkgPSBYWFhST1VORFVQKG5jaCArIDEpOwotCWlmIChjdXJyZW50X2NhcGFjaXR5IDwgMCB8fCByZXF1aXJlZF9jYXBhY2l0eSA8IDApCi0JCXJldHVybiBFX09WRVJGTE9XOwotCWlmIChjdXJyZW50X2NhcGFjaXR5IDwgcmVxdWlyZWRfY2FwYWNpdHkpIHsKLQkJaWYgKHJlcXVpcmVkX2NhcGFjaXR5ID4gUFlfU0laRV9NQVggLyBzaXplb2Yobm9kZSkpIHsKLQkJCXJldHVybiBFX05PTUVNOwotCQl9Ci0JCW4gPSBuMS0+bl9jaGlsZDsKLQkJbiA9IChub2RlICopIFB5T2JqZWN0X1JFQUxMT0MobiwKLQkJCQkJICAgICAgcmVxdWlyZWRfY2FwYWNpdHkgKiBzaXplb2Yobm9kZSkpOwotCQlpZiAobiA9PSBOVUxMKQotCQkJcmV0dXJuIEVfTk9NRU07Ci0JCW4xLT5uX2NoaWxkID0gbjsKLQl9CisgICAgY3VycmVudF9jYXBhY2l0eSA9IFhYWFJPVU5EVVAobmNoKTsKKyAgICByZXF1aXJlZF9jYXBhY2l0eSA9IFhYWFJPVU5EVVAobmNoICsgMSk7CisgICAgaWYgKGN1cnJlbnRfY2FwYWNpdHkgPCAwIHx8IHJlcXVpcmVkX2NhcGFjaXR5IDwgMCkKKyAgICAgICAgcmV0dXJuIEVfT1ZFUkZMT1c7CisgICAgaWYgKGN1cnJlbnRfY2FwYWNpdHkgPCByZXF1aXJlZF9jYXBhY2l0eSkgeworICAgICAgICBpZiAocmVxdWlyZWRfY2FwYWNpdHkgPiBQWV9TSVpFX01BWCAvIHNpemVvZihub2RlKSkgeworICAgICAgICAgICAgcmV0dXJuIEVfTk9NRU07CisgICAgICAgIH0KKyAgICAgICAgbiA9IG4xLT5uX2NoaWxkOworICAgICAgICBuID0gKG5vZGUgKikgUHlPYmplY3RfUkVBTExPQyhuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZF9jYXBhY2l0eSAqIHNpemVvZihub2RlKSk7CisgICAgICAgIGlmIChuID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gRV9OT01FTTsKKyAgICAgICAgbjEtPm5fY2hpbGQgPSBuOworICAgIH0KIAotCW4gPSAmbjEtPm5fY2hpbGRbbjEtPm5fbmNoaWxkcmVuKytdOwotCW4tPm5fdHlwZSA9IHR5cGU7Ci0Jbi0+bl9zdHIgPSBzdHI7Ci0Jbi0+bl9saW5lbm8gPSBsaW5lbm87Ci0Jbi0+bl9jb2xfb2Zmc2V0ID0gY29sX29mZnNldDsKLQluLT5uX25jaGlsZHJlbiA9IDA7Ci0Jbi0+bl9jaGlsZCA9IE5VTEw7Ci0JcmV0dXJuIDA7CisgICAgbiA9ICZuMS0+bl9jaGlsZFtuMS0+bl9uY2hpbGRyZW4rK107CisgICAgbi0+bl90eXBlID0gdHlwZTsKKyAgICBuLT5uX3N0ciA9IHN0cjsKKyAgICBuLT5uX2xpbmVubyA9IGxpbmVubzsKKyAgICBuLT5uX2NvbF9vZmZzZXQgPSBjb2xfb2Zmc2V0OworICAgIG4tPm5fbmNoaWxkcmVuID0gMDsKKyAgICBuLT5uX2NoaWxkID0gTlVMTDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogRm9yd2FyZCAqLwpAQCAtMTE5LDIwICsxMTksMjAgQEAKIHZvaWQKIFB5Tm9kZV9GcmVlKG5vZGUgKm4pCiB7Ci0JaWYgKG4gIT0gTlVMTCkgewotCQlmcmVlY2hpbGRyZW4obik7Ci0JCVB5T2JqZWN0X0ZSRUUobik7Ci0JfQorICAgIGlmIChuICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZWNoaWxkcmVuKG4pOworICAgICAgICBQeU9iamVjdF9GUkVFKG4pOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGZyZWVjaGlsZHJlbihub2RlICpuKQogewotCWludCBpOwotCWZvciAoaSA9IE5DSChuKTsgLS1pID49IDA7ICkKLQkJZnJlZWNoaWxkcmVuKENISUxEKG4sIGkpKTsKLQlpZiAobi0+bl9jaGlsZCAhPSBOVUxMKQotCQlQeU9iamVjdF9GUkVFKG4tPm5fY2hpbGQpOwotCWlmIChTVFIobikgIT0gTlVMTCkKLQkJUHlPYmplY3RfRlJFRShTVFIobikpOworICAgIGludCBpOworICAgIGZvciAoaSA9IE5DSChuKTsgLS1pID49IDA7ICkKKyAgICAgICAgZnJlZWNoaWxkcmVuKENISUxEKG4sIGkpKTsKKyAgICBpZiAobi0+bl9jaGlsZCAhPSBOVUxMKQorICAgICAgICBQeU9iamVjdF9GUkVFKG4tPm5fY2hpbGQpOworICAgIGlmIChTVFIobikgIT0gTlVMTCkKKyAgICAgICAgUHlPYmplY3RfRlJFRShTVFIobikpOwogfQpkaWZmIC0tZ2l0IGEvUGFyc2VyL3BhcnNlci5jIGIvUGFyc2VyL3BhcnNlci5jCmluZGV4IGU1OTdlYTIuLmI3NTNhMTcgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wYXJzZXIuYworKysgYi9QYXJzZXIvcGFyc2VyLmMKQEAgLTI5LDcgKzI5LDcgQEAKIHN0YXRpYyB2b2lkCiBzX3Jlc2V0KHN0YWNrICpzKQogewotCXMtPnNfdG9wID0gJnMtPnNfYmFzZVtNQVhTVEFDS107CisgICAgcy0+c190b3AgPSAmcy0+c19iYXNlW01BWFNUQUNLXTsKIH0KIAogI2RlZmluZSBzX2VtcHR5KHMpICgocyktPnNfdG9wID09ICYocyktPnNfYmFzZVtNQVhTVEFDS10pCkBAIC0zNywxNiArMzcsMTYgQEAKIHN0YXRpYyBpbnQKIHNfcHVzaChyZWdpc3RlciBzdGFjayAqcywgZGZhICpkLCBub2RlICpwYXJlbnQpCiB7Ci0JcmVnaXN0ZXIgc3RhY2tlbnRyeSAqdG9wOwotCWlmIChzLT5zX3RvcCA9PSBzLT5zX2Jhc2UpIHsKLQkJZnByaW50ZihzdGRlcnIsICJzX3B1c2g6IHBhcnNlciBzdGFjayBvdmVyZmxvd1xuIik7Ci0JCXJldHVybiBFX05PTUVNOwotCX0KLQl0b3AgPSAtLXMtPnNfdG9wOwotCXRvcC0+c19kZmEgPSBkOwotCXRvcC0+c19wYXJlbnQgPSBwYXJlbnQ7Ci0JdG9wLT5zX3N0YXRlID0gMDsKLQlyZXR1cm4gMDsKKyAgICByZWdpc3RlciBzdGFja2VudHJ5ICp0b3A7CisgICAgaWYgKHMtPnNfdG9wID09IHMtPnNfYmFzZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNfcHVzaDogcGFyc2VyIHN0YWNrIG92ZXJmbG93XG4iKTsKKyAgICAgICAgcmV0dXJuIEVfTk9NRU07CisgICAgfQorICAgIHRvcCA9IC0tcy0+c190b3A7CisgICAgdG9wLT5zX2RmYSA9IGQ7CisgICAgdG9wLT5zX3BhcmVudCA9IHBhcmVudDsKKyAgICB0b3AtPnNfc3RhdGUgPSAwOworICAgIHJldHVybiAwOwogfQogCiAjaWZkZWYgUHlfREVCVUcKQEAgLTU0LDkgKzU0LDkgQEAKIHN0YXRpYyB2b2lkCiBzX3BvcChyZWdpc3RlciBzdGFjayAqcykKIHsKLQlpZiAoc19lbXB0eShzKSkKLQkJUHlfRmF0YWxFcnJvcigic19wb3A6IHBhcnNlciBzdGFjayB1bmRlcmZsb3cgLS0gRkFUQUwiKTsKLQlzLT5zX3RvcCsrOworICAgIGlmIChzX2VtcHR5KHMpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJzX3BvcDogcGFyc2VyIHN0YWNrIHVuZGVyZmxvdyAtLSBGQVRBTCIpOworICAgIHMtPnNfdG9wKys7CiB9CiAKICNlbHNlIC8qICFQeV9ERUJVRyAqLwpAQCAtNzEsMzQgKzcxLDM0IEBACiBwYXJzZXJfc3RhdGUgKgogUHlQYXJzZXJfTmV3KGdyYW1tYXIgKmcsIGludCBzdGFydCkKIHsKLQlwYXJzZXJfc3RhdGUgKnBzOwotCQotCWlmICghZy0+Z19hY2NlbCkKLQkJUHlHcmFtbWFyX0FkZEFjY2VsZXJhdG9ycyhnKTsKLQlwcyA9IChwYXJzZXJfc3RhdGUgKilQeU1lbV9NQUxMT0Moc2l6ZW9mKHBhcnNlcl9zdGF0ZSkpOwotCWlmIChwcyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlwcy0+cF9ncmFtbWFyID0gZzsKKyAgICBwYXJzZXJfc3RhdGUgKnBzOworCisgICAgaWYgKCFnLT5nX2FjY2VsKQorICAgICAgICBQeUdyYW1tYXJfQWRkQWNjZWxlcmF0b3JzKGcpOworICAgIHBzID0gKHBhcnNlcl9zdGF0ZSAqKVB5TWVtX01BTExPQyhzaXplb2YocGFyc2VyX3N0YXRlKSk7CisgICAgaWYgKHBzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBzLT5wX2dyYW1tYXIgPSBnOwogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAotCXBzLT5wX2ZsYWdzID0gMDsKKyAgICBwcy0+cF9mbGFncyA9IDA7CiAjZW5kaWYKLQlwcy0+cF90cmVlID0gUHlOb2RlX05ldyhzdGFydCk7Ci0JaWYgKHBzLT5wX3RyZWUgPT0gTlVMTCkgewotCQlQeU1lbV9GUkVFKHBzKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNfcmVzZXQoJnBzLT5wX3N0YWNrKTsKLQkodm9pZCkgc19wdXNoKCZwcy0+cF9zdGFjaywgUHlHcmFtbWFyX0ZpbmRERkEoZywgc3RhcnQpLCBwcy0+cF90cmVlKTsKLQlyZXR1cm4gcHM7CisgICAgcHMtPnBfdHJlZSA9IFB5Tm9kZV9OZXcoc3RhcnQpOworICAgIGlmIChwcy0+cF90cmVlID09IE5VTEwpIHsKKyAgICAgICAgUHlNZW1fRlJFRShwcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzX3Jlc2V0KCZwcy0+cF9zdGFjayk7CisgICAgKHZvaWQpIHNfcHVzaCgmcHMtPnBfc3RhY2ssIFB5R3JhbW1hcl9GaW5kREZBKGcsIHN0YXJ0KSwgcHMtPnBfdHJlZSk7CisgICAgcmV0dXJuIHBzOwogfQogCiB2b2lkCiBQeVBhcnNlcl9EZWxldGUocGFyc2VyX3N0YXRlICpwcykKIHsKLQkvKiBOQiBJZiB5b3Ugd2FudCB0byBzYXZlIHRoZSBwYXJzZSB0cmVlLAotCSAgIHlvdSBtdXN0IHNldCBwX3RyZWUgdG8gTlVMTCBiZWZvcmUgY2FsbGluZyBkZWxwYXJzZXIhICovCi0JUHlOb2RlX0ZyZWUocHMtPnBfdHJlZSk7Ci0JUHlNZW1fRlJFRShwcyk7CisgICAgLyogTkIgSWYgeW91IHdhbnQgdG8gc2F2ZSB0aGUgcGFyc2UgdHJlZSwKKyAgICAgICB5b3UgbXVzdCBzZXQgcF90cmVlIHRvIE5VTEwgYmVmb3JlIGNhbGxpbmcgZGVscGFyc2VyISAqLworICAgIFB5Tm9kZV9GcmVlKHBzLT5wX3RyZWUpOworICAgIFB5TWVtX0ZSRUUocHMpOwogfQogCiAKQEAgLTEwNywyNyArMTA3LDI3IEBACiBzdGF0aWMgaW50CiBzaGlmdChyZWdpc3RlciBzdGFjayAqcywgaW50IHR5cGUsIGNoYXIgKnN0ciwgaW50IG5ld3N0YXRlLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCkKIHsKLQlpbnQgZXJyOwotCWFzc2VydCghc19lbXB0eShzKSk7Ci0JZXJyID0gUHlOb2RlX0FkZENoaWxkKHMtPnNfdG9wLT5zX3BhcmVudCwgdHlwZSwgc3RyLCBsaW5lbm8sIGNvbF9vZmZzZXQpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0Jcy0+c190b3AtPnNfc3RhdGUgPSBuZXdzdGF0ZTsKLQlyZXR1cm4gMDsKKyAgICBpbnQgZXJyOworICAgIGFzc2VydCghc19lbXB0eShzKSk7CisgICAgZXJyID0gUHlOb2RlX0FkZENoaWxkKHMtPnNfdG9wLT5zX3BhcmVudCwgdHlwZSwgc3RyLCBsaW5lbm8sIGNvbF9vZmZzZXQpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgcy0+c190b3AtPnNfc3RhdGUgPSBuZXdzdGF0ZTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogcHVzaChyZWdpc3RlciBzdGFjayAqcywgaW50IHR5cGUsIGRmYSAqZCwgaW50IG5ld3N0YXRlLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCkKIHsKLQlpbnQgZXJyOwotCXJlZ2lzdGVyIG5vZGUgKm47Ci0JbiA9IHMtPnNfdG9wLT5zX3BhcmVudDsKLQlhc3NlcnQoIXNfZW1wdHkocykpOwotCWVyciA9IFB5Tm9kZV9BZGRDaGlsZChuLCB0eXBlLCAoY2hhciAqKU5VTEwsIGxpbmVubywgY29sX29mZnNldCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQlzLT5zX3RvcC0+c19zdGF0ZSA9IG5ld3N0YXRlOwotCXJldHVybiBzX3B1c2gocywgZCwgQ0hJTEQobiwgTkNIKG4pLTEpKTsKKyAgICBpbnQgZXJyOworICAgIHJlZ2lzdGVyIG5vZGUgKm47CisgICAgbiA9IHMtPnNfdG9wLT5zX3BhcmVudDsKKyAgICBhc3NlcnQoIXNfZW1wdHkocykpOworICAgIGVyciA9IFB5Tm9kZV9BZGRDaGlsZChuLCB0eXBlLCAoY2hhciAqKU5VTEwsIGxpbmVubywgY29sX29mZnNldCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICBzLT5zX3RvcC0+c19zdGF0ZSA9IG5ld3N0YXRlOworICAgIHJldHVybiBzX3B1c2gocywgZCwgQ0hJTEQobiwgTkNIKG4pLTEpKTsKIH0KIAogCkBAIC0xMzYsMTg5ICsxMzYsMTg5IEBACiBzdGF0aWMgaW50CiBjbGFzc2lmeShwYXJzZXJfc3RhdGUgKnBzLCBpbnQgdHlwZSwgY2hhciAqc3RyKQogewotCWdyYW1tYXIgKmcgPSBwcy0+cF9ncmFtbWFyOwotCXJlZ2lzdGVyIGludCBuID0gZy0+Z19sbC5sbF9ubGFiZWxzOwotCQotCWlmICh0eXBlID09IE5BTUUpIHsKLQkJcmVnaXN0ZXIgY2hhciAqcyA9IHN0cjsKLQkJcmVnaXN0ZXIgbGFiZWwgKmwgPSBnLT5nX2xsLmxsX2xhYmVsOwotCQlyZWdpc3RlciBpbnQgaTsKLQkJZm9yIChpID0gbjsgaSA+IDA7IGktLSwgbCsrKSB7Ci0JCQlpZiAobC0+bGJfdHlwZSAhPSBOQU1FIHx8IGwtPmxiX3N0ciA9PSBOVUxMIHx8Ci0JCQkgICAgbC0+bGJfc3RyWzBdICE9IHNbMF0gfHwKLQkJCSAgICBzdHJjbXAobC0+bGJfc3RyLCBzKSAhPSAwKQotCQkJCWNvbnRpbnVlOworICAgIGdyYW1tYXIgKmcgPSBwcy0+cF9ncmFtbWFyOworICAgIHJlZ2lzdGVyIGludCBuID0gZy0+Z19sbC5sbF9ubGFiZWxzOworCisgICAgaWYgKHR5cGUgPT0gTkFNRSkgeworICAgICAgICByZWdpc3RlciBjaGFyICpzID0gc3RyOworICAgICAgICByZWdpc3RlciBsYWJlbCAqbCA9IGctPmdfbGwubGxfbGFiZWw7CisgICAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgaS0tLCBsKyspIHsKKyAgICAgICAgICAgIGlmIChsLT5sYl90eXBlICE9IE5BTUUgfHwgbC0+bGJfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBsLT5sYl9zdHJbMF0gIT0gc1swXSB8fAorICAgICAgICAgICAgICAgIHN0cmNtcChsLT5sYl9zdHIsIHMpICE9IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHMtPnBfZmxhZ3MgJiBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT04gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzWzBdID09ICdwJyAmJiBzdHJjbXAocywgInByaW50IikgPT0gMCkgeyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIG5vIGxvbmdlciBhIGtleXdvcmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcy0+cF9mbGFncyAmIENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTiAmJgorICAgICAgICAgICAgICAgIHNbMF0gPT0gJ3AnICYmIHN0cmNtcChzLCAicHJpbnQiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIG5vIGxvbmdlciBhIGtleXdvcmQgKi8KKyAgICAgICAgICAgIH0KICNlbmRpZgotCQkJRChwcmludGYoIkl0J3MgYSBrZXl3b3JkXG4iKSk7Ci0JCQlyZXR1cm4gbiAtIGk7Ci0JCX0KLQl9Ci0JCi0JewotCQlyZWdpc3RlciBsYWJlbCAqbCA9IGctPmdfbGwubGxfbGFiZWw7Ci0JCXJlZ2lzdGVyIGludCBpOwotCQlmb3IgKGkgPSBuOyBpID4gMDsgaS0tLCBsKyspIHsKLQkJCWlmIChsLT5sYl90eXBlID09IHR5cGUgJiYgbC0+bGJfc3RyID09IE5VTEwpIHsKLQkJCQlEKHByaW50ZigiSXQncyBhIHRva2VuIHdlIGtub3dcbiIpKTsKLQkJCQlyZXR1cm4gbiAtIGk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JRChwcmludGYoIklsbGVnYWwgdG9rZW5cbiIpKTsKLQlyZXR1cm4gLTE7CisgICAgICAgICAgICBEKHByaW50ZigiSXQncyBhIGtleXdvcmRcbiIpKTsKKyAgICAgICAgICAgIHJldHVybiBuIC0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgcmVnaXN0ZXIgbGFiZWwgKmwgPSBnLT5nX2xsLmxsX2xhYmVsOworICAgICAgICByZWdpc3RlciBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSwgbCsrKSB7CisgICAgICAgICAgICBpZiAobC0+bGJfdHlwZSA9PSB0eXBlICYmIGwtPmxiX3N0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgRChwcmludGYoIkl0J3MgYSB0b2tlbiB3ZSBrbm93XG4iKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG4gLSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgRChwcmludGYoIklsbGVnYWwgdG9rZW5cbiIpKTsKKyAgICByZXR1cm4gLTE7CiB9CiAKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKIHN0YXRpYyB2b2lkCiBmdXR1cmVfaGFjayhwYXJzZXJfc3RhdGUgKnBzKQogewotCW5vZGUgKm4gPSBwcy0+cF9zdGFjay5zX3RvcC0+c19wYXJlbnQ7Ci0Jbm9kZSAqY2gsICpjY2g7Ci0JaW50IGk7CisgICAgbm9kZSAqbiA9IHBzLT5wX3N0YWNrLnNfdG9wLT5zX3BhcmVudDsKKyAgICBub2RlICpjaCwgKmNjaDsKKyAgICBpbnQgaTsKIAotCS8qIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgLi4uLCBtdXN0IGhhdmUgYXQgbGVhc3QgNCBjaGlsZHJlbiAqLwotCW4gPSBDSElMRChuLCAwKTsKLQlpZiAoTkNIKG4pIDwgNCkKLQkJcmV0dXJuOwotCWNoID0gQ0hJTEQobiwgMCk7Ci0JaWYgKFNUUihjaCkgPT0gTlVMTCB8fCBzdHJjbXAoU1RSKGNoKSwgImZyb20iKSAhPSAwKQotCQlyZXR1cm47Ci0JY2ggPSBDSElMRChuLCAxKTsKLQlpZiAoTkNIKGNoKSA9PSAxICYmIFNUUihDSElMRChjaCwgMCkpICYmCi0JICAgIHN0cmNtcChTVFIoQ0hJTEQoY2gsIDApKSwgIl9fZnV0dXJlX18iKSAhPSAwKQotCQlyZXR1cm47Ci0JY2ggPSBDSElMRChuLCAzKTsKLQkvKiBjaCBjYW4gYmUgYSBzdGFyLCBhIHBhcmVudGhlc2lzIG9yIGltcG9ydF9hc19uYW1lcyAqLwotCWlmIChUWVBFKGNoKSA9PSBTVEFSKQotCQlyZXR1cm47Ci0JaWYgKFRZUEUoY2gpID09IExQQVIpCi0JCWNoID0gQ0hJTEQobiwgNCk7Ci0JCi0JZm9yIChpID0gMDsgaSA8IE5DSChjaCk7IGkgKz0gMikgewotCQljY2ggPSBDSElMRChjaCwgaSk7Ci0JCWlmIChOQ0goY2NoKSA+PSAxICYmIFRZUEUoQ0hJTEQoY2NoLCAwKSkgPT0gTkFNRSkgewotCQkJY2hhciAqc3RyX2NoID0gU1RSKENISUxEKGNjaCwgMCkpOwotCQkJaWYgKHN0cmNtcChzdHJfY2gsIEZVVFVSRV9XSVRIX1NUQVRFTUVOVCkgPT0gMCkgewotCQkJCXBzLT5wX2ZsYWdzIHw9IENPX0ZVVFVSRV9XSVRIX1NUQVRFTUVOVDsKLQkJCX0gZWxzZSBpZiAoc3RyY21wKHN0cl9jaCwgRlVUVVJFX1BSSU5UX0ZVTkNUSU9OKSA9PSAwKSB7Ci0JCQkJcHMtPnBfZmxhZ3MgfD0gQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OOwotCQkJfSBlbHNlIGlmIChzdHJjbXAoc3RyX2NoLCBGVVRVUkVfVU5JQ09ERV9MSVRFUkFMUykgPT0gMCkgewotCQkJCXBzLT5wX2ZsYWdzIHw9IENPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTOwotCQkJfQotCQl9Ci0JfQorICAgIC8qIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgLi4uLCBtdXN0IGhhdmUgYXQgbGVhc3QgNCBjaGlsZHJlbiAqLworICAgIG4gPSBDSElMRChuLCAwKTsKKyAgICBpZiAoTkNIKG4pIDwgNCkKKyAgICAgICAgcmV0dXJuOworICAgIGNoID0gQ0hJTEQobiwgMCk7CisgICAgaWYgKFNUUihjaCkgPT0gTlVMTCB8fCBzdHJjbXAoU1RSKGNoKSwgImZyb20iKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgY2ggPSBDSElMRChuLCAxKTsKKyAgICBpZiAoTkNIKGNoKSA9PSAxICYmIFNUUihDSElMRChjaCwgMCkpICYmCisgICAgICAgIHN0cmNtcChTVFIoQ0hJTEQoY2gsIDApKSwgIl9fZnV0dXJlX18iKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgY2ggPSBDSElMRChuLCAzKTsKKyAgICAvKiBjaCBjYW4gYmUgYSBzdGFyLCBhIHBhcmVudGhlc2lzIG9yIGltcG9ydF9hc19uYW1lcyAqLworICAgIGlmIChUWVBFKGNoKSA9PSBTVEFSKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFRZUEUoY2gpID09IExQQVIpCisgICAgICAgIGNoID0gQ0hJTEQobiwgNCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkNIKGNoKTsgaSArPSAyKSB7CisgICAgICAgIGNjaCA9IENISUxEKGNoLCBpKTsKKyAgICAgICAgaWYgKE5DSChjY2gpID49IDEgJiYgVFlQRShDSElMRChjY2gsIDApKSA9PSBOQU1FKSB7CisgICAgICAgICAgICBjaGFyICpzdHJfY2ggPSBTVFIoQ0hJTEQoY2NoLCAwKSk7CisgICAgICAgICAgICBpZiAoc3RyY21wKHN0cl9jaCwgRlVUVVJFX1dJVEhfU1RBVEVNRU5UKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHMtPnBfZmxhZ3MgfD0gQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoc3RyX2NoLCBGVVRVUkVfUFJJTlRfRlVOQ1RJT04pID09IDApIHsKKyAgICAgICAgICAgICAgICBwcy0+cF9mbGFncyB8PSBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT047CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChzdHJfY2gsIEZVVFVSRV9VTklDT0RFX0xJVEVSQUxTKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHMtPnBfZmxhZ3MgfD0gQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAjZW5kaWYgLyogZnV0dXJlIGtleXdvcmQgKi8KIAogaW50CiBQeVBhcnNlcl9BZGRUb2tlbihyZWdpc3RlciBwYXJzZXJfc3RhdGUgKnBzLCByZWdpc3RlciBpbnQgdHlwZSwgY2hhciAqc3RyLAotCSAgICAgICAgICBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgaW50ICpleHBlY3RlZF9yZXQpCisgICAgICAgICAgICAgICAgICBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgaW50ICpleHBlY3RlZF9yZXQpCiB7Ci0JcmVnaXN0ZXIgaW50IGlsYWJlbDsKLQlpbnQgZXJyOwotCQotCUQocHJpbnRmKCJUb2tlbiAlcy8nJXMnIC4uLiAiLCBfUHlQYXJzZXJfVG9rZW5OYW1lc1t0eXBlXSwgc3RyKSk7Ci0JCi0JLyogRmluZCBvdXQgd2hpY2ggbGFiZWwgdGhpcyB0b2tlbiBpcyAqLwotCWlsYWJlbCA9IGNsYXNzaWZ5KHBzLCB0eXBlLCBzdHIpOwotCWlmIChpbGFiZWwgPCAwKQotCQlyZXR1cm4gRV9TWU5UQVg7Ci0JCi0JLyogTG9vcCB1bnRpbCB0aGUgdG9rZW4gaXMgc2hpZnRlZCBvciBhbiBlcnJvciBvY2N1cnJlZCAqLwotCWZvciAoOzspIHsKLQkJLyogRmV0Y2ggdGhlIGN1cnJlbnQgZGZhIGFuZCBzdGF0ZSAqLwotCQlyZWdpc3RlciBkZmEgKmQgPSBwcy0+cF9zdGFjay5zX3RvcC0+c19kZmE7Ci0JCXJlZ2lzdGVyIHN0YXRlICpzID0gJmQtPmRfc3RhdGVbcHMtPnBfc3RhY2suc190b3AtPnNfc3RhdGVdOwotCQkKLQkJRChwcmludGYoIiBERkEgJyVzJywgc3RhdGUgJWQ6IiwKLQkJCWQtPmRfbmFtZSwgcHMtPnBfc3RhY2suc190b3AtPnNfc3RhdGUpKTsKLQkJCi0JCS8qIENoZWNrIGFjY2VsZXJhdG9yICovCi0JCWlmIChzLT5zX2xvd2VyIDw9IGlsYWJlbCAmJiBpbGFiZWwgPCBzLT5zX3VwcGVyKSB7Ci0JCQlyZWdpc3RlciBpbnQgeCA9IHMtPnNfYWNjZWxbaWxhYmVsIC0gcy0+c19sb3dlcl07Ci0JCQlpZiAoeCAhPSAtMSkgewotCQkJCWlmICh4ICYgKDE8PDcpKSB7Ci0JCQkJCS8qIFB1c2ggbm9uLXRlcm1pbmFsICovCi0JCQkJCWludCBudCA9ICh4ID4+IDgpICsgTlRfT0ZGU0VUOwotCQkJCQlpbnQgYXJyb3cgPSB4ICYgKCgxPDw3KS0xKTsKLQkJCQkJZGZhICpkMSA9IFB5R3JhbW1hcl9GaW5kREZBKAotCQkJCQkJcHMtPnBfZ3JhbW1hciwgbnQpOwotCQkJCQlpZiAoKGVyciA9IHB1c2goJnBzLT5wX3N0YWNrLCBudCwgZDEsCi0JCQkJCQlhcnJvdywgbGluZW5vLCBjb2xfb2Zmc2V0KSkgPiAwKSB7Ci0JCQkJCQlEKHByaW50ZigiIE1lbUVycm9yOiBwdXNoXG4iKSk7Ci0JCQkJCQlyZXR1cm4gZXJyOwotCQkJCQl9Ci0JCQkJCUQocHJpbnRmKCIgUHVzaCAuLi5cbiIpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCS8qIFNoaWZ0IHRoZSB0b2tlbiAqLwotCQkJCWlmICgoZXJyID0gc2hpZnQoJnBzLT5wX3N0YWNrLCB0eXBlLCBzdHIsCi0JCQkJCQl4LCBsaW5lbm8sIGNvbF9vZmZzZXQpKSA+IDApIHsKLQkJCQkJRChwcmludGYoIiBNZW1FcnJvcjogc2hpZnQuXG4iKSk7Ci0JCQkJCXJldHVybiBlcnI7Ci0JCQkJfQotCQkJCUQocHJpbnRmKCIgU2hpZnQuXG4iKSk7Ci0JCQkJLyogUG9wIHdoaWxlIHdlIGFyZSBpbiBhbiBhY2NlcHQtb25seSBzdGF0ZSAqLwotCQkJCXdoaWxlIChzID0gJmQtPmRfc3RhdGUKLQkJCQkJCVtwcy0+cF9zdGFjay5zX3RvcC0+c19zdGF0ZV0sCi0JCQkJCXMtPnNfYWNjZXB0ICYmIHMtPnNfbmFyY3MgPT0gMSkgewotCQkJCQlEKHByaW50ZigiICBERkEgJyVzJywgc3RhdGUgJWQ6ICIKLQkJCQkJCSAiRGlyZWN0IHBvcC5cbiIsCi0JCQkJCQkgZC0+ZF9uYW1lLAotCQkJCQkJIHBzLT5wX3N0YWNrLnNfdG9wLT5zX3N0YXRlKSk7CisgICAgcmVnaXN0ZXIgaW50IGlsYWJlbDsKKyAgICBpbnQgZXJyOworCisgICAgRChwcmludGYoIlRva2VuICVzLyclcycgLi4uICIsIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW3R5cGVdLCBzdHIpKTsKKworICAgIC8qIEZpbmQgb3V0IHdoaWNoIGxhYmVsIHRoaXMgdG9rZW4gaXMgKi8KKyAgICBpbGFiZWwgPSBjbGFzc2lmeShwcywgdHlwZSwgc3RyKTsKKyAgICBpZiAoaWxhYmVsIDwgMCkKKyAgICAgICAgcmV0dXJuIEVfU1lOVEFYOworCisgICAgLyogTG9vcCB1bnRpbCB0aGUgdG9rZW4gaXMgc2hpZnRlZCBvciBhbiBlcnJvciBvY2N1cnJlZCAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogRmV0Y2ggdGhlIGN1cnJlbnQgZGZhIGFuZCBzdGF0ZSAqLworICAgICAgICByZWdpc3RlciBkZmEgKmQgPSBwcy0+cF9zdGFjay5zX3RvcC0+c19kZmE7CisgICAgICAgIHJlZ2lzdGVyIHN0YXRlICpzID0gJmQtPmRfc3RhdGVbcHMtPnBfc3RhY2suc190b3AtPnNfc3RhdGVdOworCisgICAgICAgIEQocHJpbnRmKCIgREZBICclcycsIHN0YXRlICVkOiIsCisgICAgICAgICAgICBkLT5kX25hbWUsIHBzLT5wX3N0YWNrLnNfdG9wLT5zX3N0YXRlKSk7CisKKyAgICAgICAgLyogQ2hlY2sgYWNjZWxlcmF0b3IgKi8KKyAgICAgICAgaWYgKHMtPnNfbG93ZXIgPD0gaWxhYmVsICYmIGlsYWJlbCA8IHMtPnNfdXBwZXIpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGludCB4ID0gcy0+c19hY2NlbFtpbGFiZWwgLSBzLT5zX2xvd2VyXTsKKyAgICAgICAgICAgIGlmICh4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKHggJiAoMTw8NykpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUHVzaCBub24tdGVybWluYWwgKi8KKyAgICAgICAgICAgICAgICAgICAgaW50IG50ID0gKHggPj4gOCkgKyBOVF9PRkZTRVQ7CisgICAgICAgICAgICAgICAgICAgIGludCBhcnJvdyA9IHggJiAoKDE8PDcpLTEpOworICAgICAgICAgICAgICAgICAgICBkZmEgKmQxID0gUHlHcmFtbWFyX0ZpbmRERkEoCisgICAgICAgICAgICAgICAgICAgICAgICBwcy0+cF9ncmFtbWFyLCBudCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZXJyID0gcHVzaCgmcHMtPnBfc3RhY2ssIG50LCBkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycm93LCBsaW5lbm8sIGNvbF9vZmZzZXQpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEQocHJpbnRmKCIgTWVtRXJyb3I6IHB1c2hcbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRChwcmludGYoIiBQdXNoIC4uLlxuIikpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBTaGlmdCB0aGUgdG9rZW4gKi8KKyAgICAgICAgICAgICAgICBpZiAoKGVyciA9IHNoaWZ0KCZwcy0+cF9zdGFjaywgdHlwZSwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBsaW5lbm8sIGNvbF9vZmZzZXQpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgRChwcmludGYoIiBNZW1FcnJvcjogc2hpZnQuXG4iKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEQocHJpbnRmKCIgU2hpZnQuXG4iKSk7CisgICAgICAgICAgICAgICAgLyogUG9wIHdoaWxlIHdlIGFyZSBpbiBhbiBhY2NlcHQtb25seSBzdGF0ZSAqLworICAgICAgICAgICAgICAgIHdoaWxlIChzID0gJmQtPmRfc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BzLT5wX3N0YWNrLnNfdG9wLT5zX3N0YXRlXSwKKyAgICAgICAgICAgICAgICAgICAgcy0+c19hY2NlcHQgJiYgcy0+c19uYXJjcyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEQocHJpbnRmKCIgIERGQSAnJXMnLCBzdGF0ZSAlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlyZWN0IHBvcC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHMtPnBfc3RhY2suc190b3AtPnNfc3RhdGUpKTsKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKLQkJCQkJaWYgKGQtPmRfbmFtZVswXSA9PSAnaScgJiYKLQkJCQkJICAgIHN0cmNtcChkLT5kX25hbWUsCi0JCQkJCQkgICAiaW1wb3J0X3N0bXQiKSA9PSAwKQotCQkJCQkJZnV0dXJlX2hhY2socHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZC0+ZF9uYW1lWzBdID09ICdpJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGQtPmRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnRfc3RtdCIpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmVfaGFjayhwcyk7CiAjZW5kaWYKLQkJCQkJc19wb3AoJnBzLT5wX3N0YWNrKTsKLQkJCQkJaWYgKHNfZW1wdHkoJnBzLT5wX3N0YWNrKSkgewotCQkJCQkJRChwcmludGYoIiAgQUNDRVBULlxuIikpOwotCQkJCQkJcmV0dXJuIEVfRE9ORTsKLQkJCQkJfQotCQkJCQlkID0gcHMtPnBfc3RhY2suc190b3AtPnNfZGZhOwotCQkJCX0KLQkJCQlyZXR1cm4gRV9PSzsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHMtPnNfYWNjZXB0KSB7CisgICAgICAgICAgICAgICAgICAgIHNfcG9wKCZwcy0+cF9zdGFjayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzX2VtcHR5KCZwcy0+cF9zdGFjaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEQocHJpbnRmKCIgIEFDQ0VQVC5cbiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFX0RPTkU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZCA9IHBzLT5wX3N0YWNrLnNfdG9wLT5zX2RmYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIEVfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+c19hY2NlcHQpIHsKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKLQkJCWlmIChkLT5kX25hbWVbMF0gPT0gJ2knICYmCi0JCQkgICAgc3RyY21wKGQtPmRfbmFtZSwgImltcG9ydF9zdG10IikgPT0gMCkKLQkJCQlmdXR1cmVfaGFjayhwcyk7CisgICAgICAgICAgICBpZiAoZC0+ZF9uYW1lWzBdID09ICdpJyAmJgorICAgICAgICAgICAgICAgIHN0cmNtcChkLT5kX25hbWUsICJpbXBvcnRfc3RtdCIpID09IDApCisgICAgICAgICAgICAgICAgZnV0dXJlX2hhY2socHMpOwogI2VuZGlmCi0JCQkvKiBQb3AgdGhpcyBkZmEgYW5kIHRyeSBhZ2FpbiAqLwotCQkJc19wb3AoJnBzLT5wX3N0YWNrKTsKLQkJCUQocHJpbnRmKCIgUG9wIC4uLlxuIikpOwotCQkJaWYgKHNfZW1wdHkoJnBzLT5wX3N0YWNrKSkgewotCQkJCUQocHJpbnRmKCIgRXJyb3I6IGJvdHRvbSBvZiBzdGFjay5cbiIpKTsKLQkJCQlyZXR1cm4gRV9TWU5UQVg7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCQkKLQkJLyogU3R1Y2ssIHJlcG9ydCBzeW50YXggZXJyb3IgKi8KLQkJRChwcmludGYoIiBFcnJvci5cbiIpKTsKLQkJaWYgKGV4cGVjdGVkX3JldCkgewotCQkJaWYgKHMtPnNfbG93ZXIgPT0gcy0+c191cHBlciAtIDEpIHsKLQkJCQkvKiBPbmx5IG9uZSBwb3NzaWJsZSBleHBlY3RlZCB0b2tlbiAqLwotCQkJCSpleHBlY3RlZF9yZXQgPSBwcy0+cF9ncmFtbWFyLT4KLQkJCQkgICAgZ19sbC5sbF9sYWJlbFtzLT5zX2xvd2VyXS5sYl90eXBlOwotCQkJfQotCQkJZWxzZSAKLQkJICAgICAgICAJKmV4cGVjdGVkX3JldCA9IC0xOwotCQl9Ci0JCXJldHVybiBFX1NZTlRBWDsKLQl9CisgICAgICAgICAgICAvKiBQb3AgdGhpcyBkZmEgYW5kIHRyeSBhZ2FpbiAqLworICAgICAgICAgICAgc19wb3AoJnBzLT5wX3N0YWNrKTsKKyAgICAgICAgICAgIEQocHJpbnRmKCIgUG9wIC4uLlxuIikpOworICAgICAgICAgICAgaWYgKHNfZW1wdHkoJnBzLT5wX3N0YWNrKSkgeworICAgICAgICAgICAgICAgIEQocHJpbnRmKCIgRXJyb3I6IGJvdHRvbSBvZiBzdGFjay5cbiIpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRV9TWU5UQVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFN0dWNrLCByZXBvcnQgc3ludGF4IGVycm9yICovCisgICAgICAgIEQocHJpbnRmKCIgRXJyb3IuXG4iKSk7CisgICAgICAgIGlmIChleHBlY3RlZF9yZXQpIHsKKyAgICAgICAgICAgIGlmIChzLT5zX2xvd2VyID09IHMtPnNfdXBwZXIgLSAxKSB7CisgICAgICAgICAgICAgICAgLyogT25seSBvbmUgcG9zc2libGUgZXhwZWN0ZWQgdG9rZW4gKi8KKyAgICAgICAgICAgICAgICAqZXhwZWN0ZWRfcmV0ID0gcHMtPnBfZ3JhbW1hci0+CisgICAgICAgICAgICAgICAgICAgIGdfbGwubGxfbGFiZWxbcy0+c19sb3dlcl0ubGJfdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqZXhwZWN0ZWRfcmV0ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEVfU1lOVEFYOworICAgIH0KIH0KIAogCkBAIC0zMjksNjIgKzMyOSw2MiBAQAogdm9pZAogZHVtcHRyZWUoZ3JhbW1hciAqZywgbm9kZSAqbikKIHsKLQlpbnQgaTsKLQkKLQlpZiAobiA9PSBOVUxMKQotCQlwcmludGYoIk5JTCIpOwotCWVsc2UgewotCQlsYWJlbCBsOwotCQlsLmxiX3R5cGUgPSBUWVBFKG4pOwotCQlsLmxiX3N0ciA9IFNUUihuKTsKLQkJcHJpbnRmKCIlcyIsIFB5R3JhbW1hcl9MYWJlbFJlcHIoJmwpKTsKLQkJaWYgKElTTk9OVEVSTUlOQUwoVFlQRShuKSkpIHsKLQkJCXByaW50ZigiKCIpOwotCQkJZm9yIChpID0gMDsgaSA8IE5DSChuKTsgaSsrKSB7Ci0JCQkJaWYgKGkgPiAwKQotCQkJCQlwcmludGYoIiwiKTsKLQkJCQlkdW1wdHJlZShnLCBDSElMRChuLCBpKSk7Ci0JCQl9Ci0JCQlwcmludGYoIikiKTsKLQkJfQotCX0KKyAgICBpbnQgaTsKKworICAgIGlmIChuID09IE5VTEwpCisgICAgICAgIHByaW50ZigiTklMIik7CisgICAgZWxzZSB7CisgICAgICAgIGxhYmVsIGw7CisgICAgICAgIGwubGJfdHlwZSA9IFRZUEUobik7CisgICAgICAgIGwubGJfc3RyID0gU1RSKG4pOworICAgICAgICBwcmludGYoIiVzIiwgUHlHcmFtbWFyX0xhYmVsUmVwcigmbCkpOworICAgICAgICBpZiAoSVNOT05URVJNSU5BTChUWVBFKG4pKSkgeworICAgICAgICAgICAgcHJpbnRmKCIoIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCIpOworICAgICAgICAgICAgICAgIGR1bXB0cmVlKGcsIENISUxEKG4sIGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigiKSIpOworICAgICAgICB9CisgICAgfQogfQogCiB2b2lkCiBzaG93dHJlZShncmFtbWFyICpnLCBub2RlICpuKQogewotCWludCBpOwotCQotCWlmIChuID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAoSVNOT05URVJNSU5BTChUWVBFKG4pKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpKyspCi0JCQlzaG93dHJlZShnLCBDSElMRChuLCBpKSk7Ci0JfQotCWVsc2UgaWYgKElTVEVSTUlOQUwoVFlQRShuKSkpIHsKLQkJcHJpbnRmKCIlcyIsIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW1RZUEUobildKTsKLQkJaWYgKFRZUEUobikgPT0gTlVNQkVSIHx8IFRZUEUobikgPT0gTkFNRSkKLQkJCXByaW50ZigiKCVzKSIsIFNUUihuKSk7Ci0JCXByaW50ZigiICIpOwotCX0KLQllbHNlCi0JCXByaW50ZigiPyAiKTsKKyAgICBpbnQgaTsKKworICAgIGlmIChuID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoSVNOT05URVJNSU5BTChUWVBFKG4pKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpKyspCisgICAgICAgICAgICBzaG93dHJlZShnLCBDSElMRChuLCBpKSk7CisgICAgfQorICAgIGVsc2UgaWYgKElTVEVSTUlOQUwoVFlQRShuKSkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyIsIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW1RZUEUobildKTsKKyAgICAgICAgaWYgKFRZUEUobikgPT0gTlVNQkVSIHx8IFRZUEUobikgPT0gTkFNRSkKKyAgICAgICAgICAgIHByaW50ZigiKCVzKSIsIFNUUihuKSk7CisgICAgICAgIHByaW50ZigiICIpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHByaW50ZigiPyAiKTsKIH0KIAogdm9pZAogcHJpbnR0cmVlKHBhcnNlcl9zdGF0ZSAqcHMpCiB7Ci0JaWYgKFB5X0RlYnVnRmxhZykgewotCQlwcmludGYoIlBhcnNlIHRyZWU6XG4iKTsKLQkJZHVtcHRyZWUocHMtPnBfZ3JhbW1hciwgcHMtPnBfdHJlZSk7Ci0JCXByaW50ZigiXG4iKTsKLQkJcHJpbnRmKCJUb2tlbnM6XG4iKTsKLQkJc2hvd3RyZWUocHMtPnBfZ3JhbW1hciwgcHMtPnBfdHJlZSk7Ci0JCXByaW50ZigiXG4iKTsKLQl9Ci0JcHJpbnRmKCJMaXN0aW5nOlxuIik7Ci0JUHlOb2RlX0xpc3RUcmVlKHBzLT5wX3RyZWUpOwotCXByaW50ZigiXG4iKTsKKyAgICBpZiAoUHlfRGVidWdGbGFnKSB7CisgICAgICAgIHByaW50ZigiUGFyc2UgdHJlZTpcbiIpOworICAgICAgICBkdW1wdHJlZShwcy0+cF9ncmFtbWFyLCBwcy0+cF90cmVlKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBwcmludGYoIlRva2VuczpcbiIpOworICAgICAgICBzaG93dHJlZShwcy0+cF9ncmFtbWFyLCBwcy0+cF90cmVlKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyAgICBwcmludGYoIkxpc3Rpbmc6XG4iKTsKKyAgICBQeU5vZGVfTGlzdFRyZWUocHMtPnBfdHJlZSk7CisgICAgcHJpbnRmKCJcbiIpOwogfQogCiAjZW5kaWYgLyogUHlfREVCVUcgKi8KQEAgLTQxOSwxNSArNDE5LDE1IEBACiAKIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoaXMgZ3JhbW1hcjoKIAotZXhwcjoJdGVybSAoT1AgdGVybSkqCi10ZXJtOglDT05TVEFOVCB8ICcoJyBleHByICcpJworZXhwcjogICB0ZXJtIChPUCB0ZXJtKSoKK3Rlcm06ICAgQ09OU1RBTlQgfCAnKCcgZXhwciAnKScKIAogVGhlIERGQSBjb3JyZXNwb25kaW5nIHRvIHRoZSBydWxlIGZvciBleHByIGlzOgogCiAtLS0tLS0tPi4tLS10ZXJtLS0+Li0tLS0tLS0+Ci0JXiAgICAgICAgICB8Ci0JfCAgICAgICAgICB8Ci0JXC0tLS1PUC0tLS0vCisgICAgXiAgICAgICAgICB8CisgICAgfCAgICAgICAgICB8CisgICAgXC0tLS1PUC0tLS0vCiAKIFRoZSBwYXJzZSB0cmVlIGdlbmVyYXRlZCBmb3IgdGhlIGlucHV0IGErYiBpczoKIApkaWZmIC0tZ2l0IGEvUGFyc2VyL3BhcnNldG9rLmMgYi9QYXJzZXIvcGFyc2V0b2suYwppbmRleCA3MTc5MmRkLi5jYWQ3YTgwIDEwMDY0NAotLS0gYS9QYXJzZXIvcGFyc2V0b2suYworKysgYi9QYXJzZXIvcGFyc2V0b2suYwpAQCAtMjEsODkgKzIxLDg5IEBACiBub2RlICoKIFB5UGFyc2VyX1BhcnNlU3RyaW5nKGNvbnN0IGNoYXIgKnMsIGdyYW1tYXIgKmcsIGludCBzdGFydCwgcGVycmRldGFpbCAqZXJyX3JldCkKIHsKLQlyZXR1cm4gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHMsIE5VTEwsIGcsIHN0YXJ0LCBlcnJfcmV0LCAwKTsKKyAgICByZXR1cm4gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKHMsIE5VTEwsIGcsIHN0YXJ0LCBlcnJfcmV0LCAwKTsKIH0KIAogbm9kZSAqCiBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKnMsIGdyYW1tYXIgKmcsIGludCBzdGFydCwKLQkJICAgICAgICAgIHBlcnJkZXRhaWwgKmVycl9yZXQsIGludCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGVycmRldGFpbCAqZXJyX3JldCwgaW50IGZsYWdzKQogewotCXJldHVybiBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUocywgTlVMTCwKLQkJCQkJCSBnLCBzdGFydCwgZXJyX3JldCwgZmxhZ3MpOworICAgIHJldHVybiBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUocywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcsIHN0YXJ0LCBlcnJfcmV0LCBmbGFncyk7CiB9CiAKIG5vZGUgKgogUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJICBncmFtbWFyICpnLCBpbnQgc3RhcnQsCi0JCSAgICAgICAgICBwZXJyZGV0YWlsICplcnJfcmV0LCBpbnQgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXIgKmcsIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGVycmRldGFpbCAqZXJyX3JldCwgaW50IGZsYWdzKQogewotCWludCBpZmxhZ3MgPSBmbGFnczsKLQlyZXR1cm4gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lRXgocywgZmlsZW5hbWUsIGcsIHN0YXJ0LAotCQkJCQkJICAgZXJyX3JldCwgJmlmbGFncyk7CisgICAgaW50IGlmbGFncyA9IGZsYWdzOworICAgIHJldHVybiBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWVFeChzLCBmaWxlbmFtZSwgZywgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl9yZXQsICZpZmxhZ3MpOwogfQogCiBub2RlICoKIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZUV4KGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJICBncmFtbWFyICpnLCBpbnQgc3RhcnQsCi0JCSAgICAgICAgICBwZXJyZGV0YWlsICplcnJfcmV0LCBpbnQgKmZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyICpnLCBpbnQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJkZXRhaWwgKmVycl9yZXQsIGludCAqZmxhZ3MpCiB7Ci0Jc3RydWN0IHRva19zdGF0ZSAqdG9rOworICAgIHN0cnVjdCB0b2tfc3RhdGUgKnRvazsKIAotCWluaXRlcnIoZXJyX3JldCwgZmlsZW5hbWUpOworICAgIGluaXRlcnIoZXJyX3JldCwgZmlsZW5hbWUpOwogCi0JaWYgKCh0b2sgPSBQeVRva2VuaXplcl9Gcm9tU3RyaW5nKHMpKSA9PSBOVUxMKSB7Ci0JCWVycl9yZXQtPmVycm9yID0gUHlFcnJfT2NjdXJyZWQoKSA/IEVfREVDT0RFIDogRV9OT01FTTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICgodG9rID0gUHlUb2tlbml6ZXJfRnJvbVN0cmluZyhzKSkgPT0gTlVMTCkgeworICAgICAgICBlcnJfcmV0LT5lcnJvciA9IFB5RXJyX09jY3VycmVkKCkgPyBFX0RFQ09ERSA6IEVfTk9NRU07CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgICAgICB0b2stPmZpbGVuYW1lID0gZmlsZW5hbWUgPyBmaWxlbmFtZSA6ICI8c3RyaW5nPiI7Ci0JaWYgKFB5X1RhYmNoZWNrRmxhZyB8fCBQeV9WZXJib3NlRmxhZykgewotCQl0b2stPmFsdHdhcm5pbmcgPSAodG9rLT5maWxlbmFtZSAhPSBOVUxMKTsKLQkJaWYgKFB5X1RhYmNoZWNrRmxhZyA+PSAyKQotCQkJdG9rLT5hbHRlcnJvcisrOwotCX0KKyAgICB0b2stPmZpbGVuYW1lID0gZmlsZW5hbWUgPyBmaWxlbmFtZSA6ICI8c3RyaW5nPiI7CisgICAgaWYgKFB5X1RhYmNoZWNrRmxhZyB8fCBQeV9WZXJib3NlRmxhZykgeworICAgICAgICB0b2stPmFsdHdhcm5pbmcgPSAodG9rLT5maWxlbmFtZSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKFB5X1RhYmNoZWNrRmxhZyA+PSAyKQorICAgICAgICAgICAgdG9rLT5hbHRlcnJvcisrOworICAgIH0KIAotCXJldHVybiBwYXJzZXRvayh0b2ssIGcsIHN0YXJ0LCBlcnJfcmV0LCBmbGFncyk7CisgICAgcmV0dXJuIHBhcnNldG9rKHRvaywgZywgc3RhcnQsIGVycl9yZXQsIGZsYWdzKTsKIH0KIAogLyogUGFyc2UgaW5wdXQgY29taW5nIGZyb20gYSBmaWxlLiAgUmV0dXJuIGVycm9yIGNvZGUsIHByaW50IHNvbWUgZXJyb3JzLiAqLwogCiBub2RlICoKIFB5UGFyc2VyX1BhcnNlRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGdyYW1tYXIgKmcsIGludCBzdGFydCwKLQkJICAgY2hhciAqcHMxLCBjaGFyICpwczIsIHBlcnJkZXRhaWwgKmVycl9yZXQpCisgICAgICAgICAgICAgICAgICAgY2hhciAqcHMxLCBjaGFyICpwczIsIHBlcnJkZXRhaWwgKmVycl9yZXQpCiB7Ci0JcmV0dXJuIFB5UGFyc2VyX1BhcnNlRmlsZUZsYWdzKGZwLCBmaWxlbmFtZSwgZywgc3RhcnQsIHBzMSwgcHMyLAotCQkJCSAgICAgICBlcnJfcmV0LCAwKTsKKyAgICByZXR1cm4gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3MoZnAsIGZpbGVuYW1lLCBnLCBzdGFydCwgcHMxLCBwczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycl9yZXQsIDApOwogfQogCiBub2RlICoKIFB5UGFyc2VyX1BhcnNlRmlsZUZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgZ3JhbW1hciAqZywgaW50IHN0YXJ0LAotCQkJY2hhciAqcHMxLCBjaGFyICpwczIsIHBlcnJkZXRhaWwgKmVycl9yZXQsIGludCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBzMSwgY2hhciAqcHMyLCBwZXJyZGV0YWlsICplcnJfcmV0LCBpbnQgZmxhZ3MpCiB7Ci0JaW50IGlmbGFncyA9IGZsYWdzOwotCXJldHVybiBQeVBhcnNlcl9QYXJzZUZpbGVGbGFnc0V4KGZwLCBmaWxlbmFtZSwgZywgc3RhcnQsIHBzMSwgcHMyLCBlcnJfcmV0LCAmaWZsYWdzKTsKKyAgICBpbnQgaWZsYWdzID0gZmxhZ3M7CisgICAgcmV0dXJuIFB5UGFyc2VyX1BhcnNlRmlsZUZsYWdzRXgoZnAsIGZpbGVuYW1lLCBnLCBzdGFydCwgcHMxLCBwczIsIGVycl9yZXQsICZpZmxhZ3MpOwogfQogCiBub2RlICoKIFB5UGFyc2VyX1BhcnNlRmlsZUZsYWdzRXgoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBncmFtbWFyICpnLCBpbnQgc3RhcnQsCi0JCQkgIGNoYXIgKnBzMSwgY2hhciAqcHMyLCBwZXJyZGV0YWlsICplcnJfcmV0LCBpbnQgKmZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwczEsIGNoYXIgKnBzMiwgcGVycmRldGFpbCAqZXJyX3JldCwgaW50ICpmbGFncykKIHsKLQlzdHJ1Y3QgdG9rX3N0YXRlICp0b2s7CisgICAgc3RydWN0IHRva19zdGF0ZSAqdG9rOwogCi0JaW5pdGVycihlcnJfcmV0LCBmaWxlbmFtZSk7CisgICAgaW5pdGVycihlcnJfcmV0LCBmaWxlbmFtZSk7CiAKLQlpZiAoKHRvayA9IFB5VG9rZW5pemVyX0Zyb21GaWxlKGZwLCBwczEsIHBzMikpID09IE5VTEwpIHsKLQkJZXJyX3JldC0+ZXJyb3IgPSBFX05PTUVNOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdG9rLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotCWlmIChQeV9UYWJjaGVja0ZsYWcgfHwgUHlfVmVyYm9zZUZsYWcpIHsKLQkJdG9rLT5hbHR3YXJuaW5nID0gKGZpbGVuYW1lICE9IE5VTEwpOwotCQlpZiAoUHlfVGFiY2hlY2tGbGFnID49IDIpCi0JCQl0b2stPmFsdGVycm9yKys7Ci0JfQorICAgIGlmICgodG9rID0gUHlUb2tlbml6ZXJfRnJvbUZpbGUoZnAsIHBzMSwgcHMyKSkgPT0gTlVMTCkgeworICAgICAgICBlcnJfcmV0LT5lcnJvciA9IEVfTk9NRU07CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB0b2stPmZpbGVuYW1lID0gZmlsZW5hbWU7CisgICAgaWYgKFB5X1RhYmNoZWNrRmxhZyB8fCBQeV9WZXJib3NlRmxhZykgeworICAgICAgICB0b2stPmFsdHdhcm5pbmcgPSAoZmlsZW5hbWUgIT0gTlVMTCk7CisgICAgICAgIGlmIChQeV9UYWJjaGVja0ZsYWcgPj0gMikKKyAgICAgICAgICAgIHRvay0+YWx0ZXJyb3IrKzsKKyAgICB9CiAKLQlyZXR1cm4gcGFyc2V0b2sodG9rLCBnLCBzdGFydCwgZXJyX3JldCwgZmxhZ3MpOworICAgIHJldHVybiBwYXJzZXRvayh0b2ssIGcsIHN0YXJ0LCBlcnJfcmV0LCBmbGFncyk7CiB9CiAKICNpZiAwCkBAIC0xMTYsOSArMTE2LDkgQEAKIHN0YXRpYyB2b2lkCiB3YXJuKGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pCiB7Ci0JaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JCWZpbGVuYW1lID0gIjxzdHJpbmc+IjsKLQlQeVN5c19Xcml0ZVN0ZGVycihtc2csIGZpbGVuYW1lLCBsaW5lbm8pOworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQorICAgICAgICBmaWxlbmFtZSA9ICI8c3RyaW5nPiI7CisgICAgUHlTeXNfV3JpdGVTdGRlcnIobXNnLCBmaWxlbmFtZSwgbGluZW5vKTsKIH0KICNlbmRpZgogCkBAIC0xMjcsMTQ5ICsxMjcsMTQ5IEBACiAKIHN0YXRpYyBub2RlICoKIHBhcnNldG9rKHN0cnVjdCB0b2tfc3RhdGUgKnRvaywgZ3JhbW1hciAqZywgaW50IHN0YXJ0LCBwZXJyZGV0YWlsICplcnJfcmV0LAotCSBpbnQgKmZsYWdzKQorICAgICAgICAgaW50ICpmbGFncykKIHsKLQlwYXJzZXJfc3RhdGUgKnBzOwotCW5vZGUgKm47Ci0JaW50IHN0YXJ0ZWQgPSAwLCBoYW5kbGluZ19pbXBvcnQgPSAwLCBoYW5kbGluZ193aXRoID0gMDsKKyAgICBwYXJzZXJfc3RhdGUgKnBzOworICAgIG5vZGUgKm47CisgICAgaW50IHN0YXJ0ZWQgPSAwLCBoYW5kbGluZ19pbXBvcnQgPSAwLCBoYW5kbGluZ193aXRoID0gMDsKIAotCWlmICgocHMgPSBQeVBhcnNlcl9OZXcoZywgc3RhcnQpKSA9PSBOVUxMKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAibm8gbWVtIGZvciBuZXcgcGFyc2VyXG4iKTsKLQkJZXJyX3JldC0+ZXJyb3IgPSBFX05PTUVNOwotCQlQeVRva2VuaXplcl9GcmVlKHRvayk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKHBzID0gUHlQYXJzZXJfTmV3KGcsIHN0YXJ0KSkgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIG1lbSBmb3IgbmV3IHBhcnNlclxuIik7CisgICAgICAgIGVycl9yZXQtPmVycm9yID0gRV9OT01FTTsKKyAgICAgICAgUHlUb2tlbml6ZXJfRnJlZSh0b2spOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECi0JaWYgKCpmbGFncyAmIFB5UEFSU0VfUFJJTlRfSVNfRlVOQ1RJT04pIHsKLQkJcHMtPnBfZmxhZ3MgfD0gQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OOwotCX0KLQlpZiAoKmZsYWdzICYgUHlQQVJTRV9VTklDT0RFX0xJVEVSQUxTKSB7Ci0JCXBzLT5wX2ZsYWdzIHw9IENPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTOwotCX0KKyAgICBpZiAoKmZsYWdzICYgUHlQQVJTRV9QUklOVF9JU19GVU5DVElPTikgeworICAgICAgICBwcy0+cF9mbGFncyB8PSBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT047CisgICAgfQorICAgIGlmICgqZmxhZ3MgJiBQeVBBUlNFX1VOSUNPREVfTElURVJBTFMpIHsKKyAgICAgICAgcHMtPnBfZmxhZ3MgfD0gQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFM7CisgICAgfQogCiAjZW5kaWYKIAotCWZvciAoOzspIHsKLQkJY2hhciAqYSwgKmI7Ci0JCWludCB0eXBlOwotCQlzaXplX3QgbGVuOwotCQljaGFyICpzdHI7Ci0JCWludCBjb2xfb2Zmc2V0OworICAgIGZvciAoOzspIHsKKyAgICAgICAgY2hhciAqYSwgKmI7CisgICAgICAgIGludCB0eXBlOworICAgICAgICBzaXplX3QgbGVuOworICAgICAgICBjaGFyICpzdHI7CisgICAgICAgIGludCBjb2xfb2Zmc2V0OwogCi0JCXR5cGUgPSBQeVRva2VuaXplcl9HZXQodG9rLCAmYSwgJmIpOwotCQlpZiAodHlwZSA9PSBFUlJPUlRPS0VOKSB7Ci0JCQllcnJfcmV0LT5lcnJvciA9IHRvay0+ZG9uZTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0eXBlID09IEVORE1BUktFUiAmJiBzdGFydGVkKSB7Ci0JCQl0eXBlID0gTkVXTElORTsgLyogQWRkIGFuIGV4dHJhIG5ld2xpbmUgKi8KLQkJCWhhbmRsaW5nX3dpdGggPSBoYW5kbGluZ19pbXBvcnQgPSAwOwotCQkJc3RhcnRlZCA9IDA7Ci0JCQkvKiBBZGQgdGhlIHJpZ2h0IG51bWJlciBvZiBkZWRlbnQgdG9rZW5zLAotCQkJICAgZXhjZXB0IGlmIGEgY2VydGFpbiBmbGFnIGlzIGdpdmVuIC0tCi0JCQkgICBjb2Rlb3AucHkgdXNlcyB0aGlzLiAqLwotCQkJaWYgKHRvay0+aW5kZW50ICYmCi0JCQkgICAgISgqZmxhZ3MgJiBQeVBBUlNFX0RPTlRfSU1QTFlfREVERU5UKSkKLQkJCXsKLQkJCQl0b2stPnBlbmRpbiA9IC10b2stPmluZGVudDsKLQkJCQl0b2stPmluZGVudCA9IDA7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJc3RhcnRlZCA9IDE7Ci0JCWxlbiA9IGIgLSBhOyAvKiBYWFggdGhpcyBtYXkgY29tcHV0ZSBOVUxMIC0gTlVMTCAqLwotCQlzdHIgPSAoY2hhciAqKSBQeU9iamVjdF9NQUxMT0MobGVuICsgMSk7Ci0JCWlmIChzdHIgPT0gTlVMTCkgewotCQkJZnByaW50ZihzdGRlcnIsICJubyBtZW0gZm9yIG5leHQgdG9rZW5cbiIpOwotCQkJZXJyX3JldC0+ZXJyb3IgPSBFX05PTUVNOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGxlbiA+IDApCi0JCQlzdHJuY3B5KHN0ciwgYSwgbGVuKTsKLQkJc3RyW2xlbl0gPSAnXDAnOworICAgICAgICB0eXBlID0gUHlUb2tlbml6ZXJfR2V0KHRvaywgJmEsICZiKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gRVJST1JUT0tFTikgeworICAgICAgICAgICAgZXJyX3JldC0+ZXJyb3IgPSB0b2stPmRvbmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSA9PSBFTkRNQVJLRVIgJiYgc3RhcnRlZCkgeworICAgICAgICAgICAgdHlwZSA9IE5FV0xJTkU7IC8qIEFkZCBhbiBleHRyYSBuZXdsaW5lICovCisgICAgICAgICAgICBoYW5kbGluZ193aXRoID0gaGFuZGxpbmdfaW1wb3J0ID0gMDsKKyAgICAgICAgICAgIHN0YXJ0ZWQgPSAwOworICAgICAgICAgICAgLyogQWRkIHRoZSByaWdodCBudW1iZXIgb2YgZGVkZW50IHRva2VucywKKyAgICAgICAgICAgICAgIGV4Y2VwdCBpZiBhIGNlcnRhaW4gZmxhZyBpcyBnaXZlbiAtLQorICAgICAgICAgICAgICAgY29kZW9wLnB5IHVzZXMgdGhpcy4gKi8KKyAgICAgICAgICAgIGlmICh0b2stPmluZGVudCAmJgorICAgICAgICAgICAgICAgICEoKmZsYWdzICYgUHlQQVJTRV9ET05UX0lNUExZX0RFREVOVCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9rLT5wZW5kaW4gPSAtdG9rLT5pbmRlbnQ7CisgICAgICAgICAgICAgICAgdG9rLT5pbmRlbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0YXJ0ZWQgPSAxOworICAgICAgICBsZW4gPSBiIC0gYTsgLyogWFhYIHRoaXMgbWF5IGNvbXB1dGUgTlVMTCAtIE5VTEwgKi8KKyAgICAgICAgc3RyID0gKGNoYXIgKikgUHlPYmplY3RfTUFMTE9DKGxlbiArIDEpOworICAgICAgICBpZiAoc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibm8gbWVtIGZvciBuZXh0IHRva2VuXG4iKTsKKyAgICAgICAgICAgIGVycl9yZXQtPmVycm9yID0gRV9OT01FTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPiAwKQorICAgICAgICAgICAgc3RybmNweShzdHIsIGEsIGxlbik7CisgICAgICAgIHN0cltsZW5dID0gJ1wwJzsKIAogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAogI2VuZGlmCi0JCWlmIChhID49IHRvay0+bGluZV9zdGFydCkKLQkJCWNvbF9vZmZzZXQgPSBhIC0gdG9rLT5saW5lX3N0YXJ0OwotCQllbHNlCi0JCQljb2xfb2Zmc2V0ID0gLTE7Ci0JCQkKLQkJaWYgKChlcnJfcmV0LT5lcnJvciA9Ci0JCSAgICAgUHlQYXJzZXJfQWRkVG9rZW4ocHMsIChpbnQpdHlwZSwgc3RyLCB0b2stPmxpbmVubywgY29sX29mZnNldCwKLQkJCQkgICAgICAgJihlcnJfcmV0LT5leHBlY3RlZCkpKSAhPSBFX09LKSB7Ci0JCQlpZiAoZXJyX3JldC0+ZXJyb3IgIT0gRV9ET05FKSB7Ci0JCQkJUHlPYmplY3RfRlJFRShzdHIpOwotCQkJCWVycl9yZXQtPnRva2VuID0gdHlwZTsKLQkJCX0JCQkJCi0JCQlicmVhazsKLQkJfQotCX0KKyAgICAgICAgaWYgKGEgPj0gdG9rLT5saW5lX3N0YXJ0KQorICAgICAgICAgICAgY29sX29mZnNldCA9IGEgLSB0b2stPmxpbmVfc3RhcnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbF9vZmZzZXQgPSAtMTsKIAotCWlmIChlcnJfcmV0LT5lcnJvciA9PSBFX0RPTkUpIHsKLQkJbiA9IHBzLT5wX3RyZWU7Ci0JCXBzLT5wX3RyZWUgPSBOVUxMOwotCX0KLQllbHNlCi0JCW4gPSBOVUxMOworICAgICAgICBpZiAoKGVycl9yZXQtPmVycm9yID0KKyAgICAgICAgICAgICBQeVBhcnNlcl9BZGRUb2tlbihwcywgKGludCl0eXBlLCBzdHIsIHRvay0+bGluZW5vLCBjb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoZXJyX3JldC0+ZXhwZWN0ZWQpKSkgIT0gRV9PSykgeworICAgICAgICAgICAgaWYgKGVycl9yZXQtPmVycm9yICE9IEVfRE9ORSkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUoc3RyKTsKKyAgICAgICAgICAgICAgICBlcnJfcmV0LT50b2tlbiA9IHR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcnJfcmV0LT5lcnJvciA9PSBFX0RPTkUpIHsKKyAgICAgICAgbiA9IHBzLT5wX3RyZWU7CisgICAgICAgIHBzLT5wX3RyZWUgPSBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIG4gPSBOVUxMOwogCiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECi0JKmZsYWdzID0gcHMtPnBfZmxhZ3M7CisgICAgKmZsYWdzID0gcHMtPnBfZmxhZ3M7CiAjZW5kaWYKLQlQeVBhcnNlcl9EZWxldGUocHMpOworICAgIFB5UGFyc2VyX0RlbGV0ZShwcyk7CiAKLQlpZiAobiA9PSBOVUxMKSB7Ci0JCWlmICh0b2stPmxpbmVubyA8PSAxICYmIHRvay0+ZG9uZSA9PSBFX0VPRikKLQkJCWVycl9yZXQtPmVycm9yID0gRV9FT0Y7Ci0JCWVycl9yZXQtPmxpbmVubyA9IHRvay0+bGluZW5vOwotCQlpZiAodG9rLT5idWYgIT0gTlVMTCkgewotCQkJY2hhciAqdGV4dCA9IE5VTEw7Ci0JCQlzaXplX3QgbGVuOwotCQkJYXNzZXJ0KHRvay0+Y3VyIC0gdG9rLT5idWYgPCBJTlRfTUFYKTsKLQkJCWVycl9yZXQtPm9mZnNldCA9IChpbnQpKHRvay0+Y3VyIC0gdG9rLT5idWYpOwotCQkJbGVuID0gdG9rLT5pbnAgLSB0b2stPmJ1ZjsKKyAgICBpZiAobiA9PSBOVUxMKSB7CisgICAgICAgIGlmICh0b2stPmxpbmVubyA8PSAxICYmIHRvay0+ZG9uZSA9PSBFX0VPRikKKyAgICAgICAgICAgIGVycl9yZXQtPmVycm9yID0gRV9FT0Y7CisgICAgICAgIGVycl9yZXQtPmxpbmVubyA9IHRvay0+bGluZW5vOworICAgICAgICBpZiAodG9rLT5idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgY2hhciAqdGV4dCA9IE5VTEw7CisgICAgICAgICAgICBzaXplX3QgbGVuOworICAgICAgICAgICAgYXNzZXJ0KHRvay0+Y3VyIC0gdG9rLT5idWYgPCBJTlRfTUFYKTsKKyAgICAgICAgICAgIGVycl9yZXQtPm9mZnNldCA9IChpbnQpKHRvay0+Y3VyIC0gdG9rLT5idWYpOworICAgICAgICAgICAgbGVuID0gdG9rLT5pbnAgLSB0b2stPmJ1ZjsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQl0ZXh0ID0gUHlUb2tlbml6ZXJfUmVzdG9yZUVuY29kaW5nKHRvaywgbGVuLCAmZXJyX3JldC0+b2Zmc2V0KTsKKyAgICAgICAgICAgIHRleHQgPSBQeVRva2VuaXplcl9SZXN0b3JlRW5jb2RpbmcodG9rLCBsZW4sICZlcnJfcmV0LT5vZmZzZXQpOwogCiAjZW5kaWYKLQkJCWlmICh0ZXh0ID09IE5VTEwpIHsKLQkJCQl0ZXh0ID0gKGNoYXIgKikgUHlPYmplY3RfTUFMTE9DKGxlbiArIDEpOwotCQkJCWlmICh0ZXh0ICE9IE5VTEwpIHsKLQkJCQkJaWYgKGxlbiA+IDApCi0JCQkJCQlzdHJuY3B5KHRleHQsIHRvay0+YnVmLCBsZW4pOwotCQkJCQl0ZXh0W2xlbl0gPSAnXDAnOwotCQkJCX0KLQkJCX0KLQkJCWVycl9yZXQtPnRleHQgPSB0ZXh0OwotCQl9Ci0JfSBlbHNlIGlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpIHsKLQkJbm9kZSogciA9IFB5Tm9kZV9OZXcoZW5jb2RpbmdfZGVjbCk7Ci0JCWlmICghcikgewotCQkJZXJyX3JldC0+ZXJyb3IgPSBFX05PTUVNOwotCQkJbiA9IE5VTEw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJci0+bl9zdHIgPSB0b2stPmVuY29kaW5nOwotCQlyLT5uX25jaGlsZHJlbiA9IDE7Ci0JCXItPm5fY2hpbGQgPSBuOwotCQl0b2stPmVuY29kaW5nID0gTlVMTDsKLQkJbiA9IHI7Ci0JfQorICAgICAgICAgICAgaWYgKHRleHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHRleHQgPSAoY2hhciAqKSBQeU9iamVjdF9NQUxMT0MobGVuICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkodGV4dCwgdG9rLT5idWYsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIHRleHRbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyX3JldC0+dGV4dCA9IHRleHQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRvay0+ZW5jb2RpbmcgIT0gTlVMTCkgeworICAgICAgICBub2RlKiByID0gUHlOb2RlX05ldyhlbmNvZGluZ19kZWNsKTsKKyAgICAgICAgaWYgKCFyKSB7CisgICAgICAgICAgICBlcnJfcmV0LT5lcnJvciA9IEVfTk9NRU07CisgICAgICAgICAgICBuID0gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgICByLT5uX3N0ciA9IHRvay0+ZW5jb2Rpbmc7CisgICAgICAgIHItPm5fbmNoaWxkcmVuID0gMTsKKyAgICAgICAgci0+bl9jaGlsZCA9IG47CisgICAgICAgIHRvay0+ZW5jb2RpbmcgPSBOVUxMOworICAgICAgICBuID0gcjsKKyAgICB9CiAKIGRvbmU6Ci0JUHlUb2tlbml6ZXJfRnJlZSh0b2spOworICAgIFB5VG9rZW5pemVyX0ZyZWUodG9rKTsKIAotCXJldHVybiBuOworICAgIHJldHVybiBuOwogfQogCiBzdGF0aWMgdm9pZAogaW5pdGVycihwZXJyZGV0YWlsICplcnJfcmV0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQllcnJfcmV0LT5lcnJvciA9IEVfT0s7Ci0JZXJyX3JldC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQllcnJfcmV0LT5saW5lbm8gPSAwOwotCWVycl9yZXQtPm9mZnNldCA9IDA7Ci0JZXJyX3JldC0+dGV4dCA9IE5VTEw7Ci0JZXJyX3JldC0+dG9rZW4gPSAtMTsKLQllcnJfcmV0LT5leHBlY3RlZCA9IC0xOworICAgIGVycl9yZXQtPmVycm9yID0gRV9PSzsKKyAgICBlcnJfcmV0LT5maWxlbmFtZSA9IGZpbGVuYW1lOworICAgIGVycl9yZXQtPmxpbmVubyA9IDA7CisgICAgZXJyX3JldC0+b2Zmc2V0ID0gMDsKKyAgICBlcnJfcmV0LT50ZXh0ID0gTlVMTDsKKyAgICBlcnJfcmV0LT50b2tlbiA9IC0xOworICAgIGVycl9yZXQtPmV4cGVjdGVkID0gLTE7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvcGdlbi5jIGIvUGFyc2VyL3BnZW4uYwppbmRleCA5NTlhNWQzLi5iZWFmNTNiIDEwMDY0NAotLS0gYS9QYXJzZXIvcGdlbi5jCisrKyBiL1BhcnNlci9wZ2VuLmMKQEAgLTE3LDg1ICsxNyw4NSBAQAogLyogUEFSVCBPTkUgLS0gQ09OU1RSVUNUIE5GQSAtLSBDZi4gQWxnb3JpdGhtIDMuMiBmcm9tIFtBaG8mVWxsbWFuIDc3XSAqLwogCiB0eXBlZGVmIHN0cnVjdCBfbmZhYXJjIHsKLQlpbnQJYXJfbGFiZWw7Ci0JaW50CWFyX2Fycm93OworICAgIGludCAgICAgICAgIGFyX2xhYmVsOworICAgIGludCAgICAgICAgIGFyX2Fycm93OwogfSBuZmFhcmM7CiAKIHR5cGVkZWYgc3RydWN0IF9uZmFzdGF0ZSB7Ci0JaW50CXN0X25hcmNzOwotCW5mYWFyYwkqc3RfYXJjOworICAgIGludCAgICAgICAgIHN0X25hcmNzOworICAgIG5mYWFyYyAgICAgICpzdF9hcmM7CiB9IG5mYXN0YXRlOwogCiB0eXBlZGVmIHN0cnVjdCBfbmZhIHsKLQlpbnQJCW5mX3R5cGU7Ci0JY2hhcgkJKm5mX25hbWU7Ci0JaW50CQluZl9uc3RhdGVzOwotCW5mYXN0YXRlCSpuZl9zdGF0ZTsKLQlpbnQJCW5mX3N0YXJ0LCBuZl9maW5pc2g7CisgICAgaW50ICAgICAgICAgICAgICAgICBuZl90eXBlOworICAgIGNoYXIgICAgICAgICAgICAgICAgKm5mX25hbWU7CisgICAgaW50ICAgICAgICAgICAgICAgICBuZl9uc3RhdGVzOworICAgIG5mYXN0YXRlICAgICAgICAgICAgKm5mX3N0YXRlOworICAgIGludCAgICAgICAgICAgICAgICAgbmZfc3RhcnQsIG5mX2ZpbmlzaDsKIH0gbmZhOwogCiAvKiBGb3J3YXJkICovCiBzdGF0aWMgdm9pZCBjb21waWxlX3JocyhsYWJlbGxpc3QgKmxsLAotCQkJbmZhICpuZiwgbm9kZSAqbiwgaW50ICpwYSwgaW50ICpwYik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKTsKIHN0YXRpYyB2b2lkIGNvbXBpbGVfYWx0KGxhYmVsbGlzdCAqbGwsCi0JCQluZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpOwogc3RhdGljIHZvaWQgY29tcGlsZV9pdGVtKGxhYmVsbGlzdCAqbGwsCi0JCQkgbmZhICpuZiwgbm9kZSAqbiwgaW50ICpwYSwgaW50ICpwYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgbmZhICpuZiwgbm9kZSAqbiwgaW50ICpwYSwgaW50ICpwYik7CiBzdGF0aWMgdm9pZCBjb21waWxlX2F0b20obGFiZWxsaXN0ICpsbCwKLQkJCSBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZmEgKm5mLCBub2RlICpuLCBpbnQgKnBhLCBpbnQgKnBiKTsKIAogc3RhdGljIGludAogYWRkbmZhc3RhdGUobmZhICpuZikKIHsKLQluZmFzdGF0ZSAqc3Q7Ci0JCi0JbmYtPm5mX3N0YXRlID0gKG5mYXN0YXRlICopUHlPYmplY3RfUkVBTExPQyhuZi0+bmZfc3RhdGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5mYXN0YXRlKSAqIChuZi0+bmZfbnN0YXRlcyArIDEpKTsKLQlpZiAobmYtPm5mX3N0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm91dCBvZiBtZW0iKTsKLQlzdCA9ICZuZi0+bmZfc3RhdGVbbmYtPm5mX25zdGF0ZXMrK107Ci0Jc3QtPnN0X25hcmNzID0gMDsKLQlzdC0+c3RfYXJjID0gTlVMTDsKLQlyZXR1cm4gc3QgLSBuZi0+bmZfc3RhdGU7CisgICAgbmZhc3RhdGUgKnN0OworCisgICAgbmYtPm5mX3N0YXRlID0gKG5mYXN0YXRlICopUHlPYmplY3RfUkVBTExPQyhuZi0+bmZfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZmFzdGF0ZSkgKiAobmYtPm5mX25zdGF0ZXMgKyAxKSk7CisgICAgaWYgKG5mLT5uZl9zdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7CisgICAgc3QgPSAmbmYtPm5mX3N0YXRlW25mLT5uZl9uc3RhdGVzKytdOworICAgIHN0LT5zdF9uYXJjcyA9IDA7CisgICAgc3QtPnN0X2FyYyA9IE5VTEw7CisgICAgcmV0dXJuIHN0IC0gbmYtPm5mX3N0YXRlOwogfQogCiBzdGF0aWMgdm9pZAogYWRkbmZhYXJjKG5mYSAqbmYsIGludCBmcm9tLCBpbnQgdG8sIGludCBsYmwpCiB7Ci0JbmZhc3RhdGUgKnN0OwotCW5mYWFyYyAqYXI7Ci0JCi0Jc3QgPSAmbmYtPm5mX3N0YXRlW2Zyb21dOwotCXN0LT5zdF9hcmMgPSAobmZhYXJjICopUHlPYmplY3RfUkVBTExPQyhzdC0+c3RfYXJjLAotCQkJCSAgICAgIHNpemVvZihuZmFhcmMpICogKHN0LT5zdF9uYXJjcyArIDEpKTsKLQlpZiAoc3QtPnN0X2FyYyA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7Ci0JYXIgPSAmc3QtPnN0X2FyY1tzdC0+c3RfbmFyY3MrK107Ci0JYXItPmFyX2xhYmVsID0gbGJsOwotCWFyLT5hcl9hcnJvdyA9IHRvOworICAgIG5mYXN0YXRlICpzdDsKKyAgICBuZmFhcmMgKmFyOworCisgICAgc3QgPSAmbmYtPm5mX3N0YXRlW2Zyb21dOworICAgIHN0LT5zdF9hcmMgPSAobmZhYXJjICopUHlPYmplY3RfUkVBTExPQyhzdC0+c3RfYXJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZmFhcmMpICogKHN0LT5zdF9uYXJjcyArIDEpKTsKKyAgICBpZiAoc3QtPnN0X2FyYyA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7CisgICAgYXIgPSAmc3QtPnN0X2FyY1tzdC0+c3RfbmFyY3MrK107CisgICAgYXItPmFyX2xhYmVsID0gbGJsOworICAgIGFyLT5hcl9hcnJvdyA9IHRvOwogfQogCiBzdGF0aWMgbmZhICoKIG5ld25mYShjaGFyICpuYW1lKQogewotCW5mYSAqbmY7Ci0Jc3RhdGljIGludCB0eXBlID0gTlRfT0ZGU0VUOyAvKiBBbGwgdHlwZXMgd2lsbCBiZSBkaXNqdW5jdCAqLwotCQotCW5mID0gKG5mYSAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YobmZhKSk7Ci0JaWYgKG5mID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgbmV3IG5mYSIpOwotCW5mLT5uZl90eXBlID0gdHlwZSsrOwotCW5mLT5uZl9uYW1lID0gbmFtZTsgLyogWFhYIHN0cmR1cChuYW1lKSA/Pz8gKi8KLQluZi0+bmZfbnN0YXRlcyA9IDA7Ci0JbmYtPm5mX3N0YXRlID0gTlVMTDsKLQluZi0+bmZfc3RhcnQgPSBuZi0+bmZfZmluaXNoID0gLTE7Ci0JcmV0dXJuIG5mOworICAgIG5mYSAqbmY7CisgICAgc3RhdGljIGludCB0eXBlID0gTlRfT0ZGU0VUOyAvKiBBbGwgdHlwZXMgd2lsbCBiZSBkaXNqdW5jdCAqLworCisgICAgbmYgPSAobmZhICopUHlPYmplY3RfTUFMTE9DKHNpemVvZihuZmEpKTsKKyAgICBpZiAobmYgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgbmZhIik7CisgICAgbmYtPm5mX3R5cGUgPSB0eXBlKys7CisgICAgbmYtPm5mX25hbWUgPSBuYW1lOyAvKiBYWFggc3RyZHVwKG5hbWUpID8/PyAqLworICAgIG5mLT5uZl9uc3RhdGVzID0gMDsKKyAgICBuZi0+bmZfc3RhdGUgPSBOVUxMOworICAgIG5mLT5uZl9zdGFydCA9IG5mLT5uZl9maW5pc2ggPSAtMTsKKyAgICByZXR1cm4gbmY7CiB9CiAKIHR5cGVkZWYgc3RydWN0IF9uZmFncmFtbWFyIHsKLQlpbnQJCWdyX25uZmFzOwotCW5mYQkJKipncl9uZmE7Ci0JbGFiZWxsaXN0CWdyX2xsOworICAgIGludCAgICAgICAgICAgICAgICAgZ3Jfbm5mYXM7CisgICAgbmZhICAgICAgICAgICAgICAgICAqKmdyX25mYTsKKyAgICBsYWJlbGxpc3QgICAgICAgICAgIGdyX2xsOwogfSBuZmFncmFtbWFyOwogCiAvKiBGb3J3YXJkICovCkBAIC0xMDQsMzIgKzEwNCwzMiBAQAogc3RhdGljIG5mYWdyYW1tYXIgKgogbmV3bmZhZ3JhbW1hcih2b2lkKQogewotCW5mYWdyYW1tYXIgKmdyOwotCQotCWdyID0gKG5mYWdyYW1tYXIgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKG5mYWdyYW1tYXIpKTsKLQlpZiAoZ3IgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciBuZXcgbmZhIGdyYW1tYXIiKTsKLQlnci0+Z3Jfbm5mYXMgPSAwOwotCWdyLT5ncl9uZmEgPSBOVUxMOwotCWdyLT5ncl9sbC5sbF9ubGFiZWxzID0gMDsKLQlnci0+Z3JfbGwubGxfbGFiZWwgPSBOVUxMOwotCWFkZGxhYmVsKCZnci0+Z3JfbGwsIEVORE1BUktFUiwgIkVNUFRZIik7Ci0JcmV0dXJuIGdyOworICAgIG5mYWdyYW1tYXIgKmdyOworCisgICAgZ3IgPSAobmZhZ3JhbW1hciAqKVB5T2JqZWN0X01BTExPQyhzaXplb2YobmZhZ3JhbW1hcikpOworICAgIGlmIChnciA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIG5ldyBuZmEgZ3JhbW1hciIpOworICAgIGdyLT5ncl9ubmZhcyA9IDA7CisgICAgZ3ItPmdyX25mYSA9IE5VTEw7CisgICAgZ3ItPmdyX2xsLmxsX25sYWJlbHMgPSAwOworICAgIGdyLT5ncl9sbC5sbF9sYWJlbCA9IE5VTEw7CisgICAgYWRkbGFiZWwoJmdyLT5ncl9sbCwgRU5ETUFSS0VSLCAiRU1QVFkiKTsKKyAgICByZXR1cm4gZ3I7CiB9CiAKIHN0YXRpYyBuZmEgKgogYWRkbmZhKG5mYWdyYW1tYXIgKmdyLCBjaGFyICpuYW1lKQogewotCW5mYSAqbmY7Ci0JCi0JbmYgPSBuZXduZmEobmFtZSk7Ci0JZ3ItPmdyX25mYSA9IChuZmEgKiopUHlPYmplY3RfUkVBTExPQyhnci0+Z3JfbmZhLAotCQkJCSAgICAgIHNpemVvZihuZmEqKSAqIChnci0+Z3Jfbm5mYXMgKyAxKSk7Ci0JaWYgKGdyLT5ncl9uZmEgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOwotCWdyLT5ncl9uZmFbZ3ItPmdyX25uZmFzKytdID0gbmY7Ci0JYWRkbGFiZWwoJmdyLT5ncl9sbCwgTkFNRSwgbmYtPm5mX25hbWUpOwotCXJldHVybiBuZjsKKyAgICBuZmEgKm5mOworCisgICAgbmYgPSBuZXduZmEobmFtZSk7CisgICAgZ3ItPmdyX25mYSA9IChuZmEgKiopUHlPYmplY3RfUkVBTExPQyhnci0+Z3JfbmZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihuZmEqKSAqIChnci0+Z3Jfbm5mYXMgKyAxKSk7CisgICAgaWYgKGdyLT5ncl9uZmEgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOworICAgIGdyLT5ncl9uZmFbZ3ItPmdyX25uZmFzKytdID0gbmY7CisgICAgYWRkbGFiZWwoJmdyLT5ncl9sbCwgTkFNRSwgbmYtPm5mX25hbWUpOworICAgIHJldHVybiBuZjsKIH0KIAogI2lmZGVmIFB5X0RFQlVHCkBAIC0xMzcsMjAzICsxMzcsMjAzIEBACiBzdGF0aWMgY2hhciBSRVFORk1UW10gPSAibWV0YWNvbXBpbGU6IGxlc3MgdGhhbiAlZCBjaGlsZHJlblxuIjsKIAogI2RlZmluZSBSRVFOKGksIGNvdW50KSBcCi0gCWlmIChpIDwgY291bnQpIHsgXAotCQlmcHJpbnRmKHN0ZGVyciwgUkVRTkZNVCwgY291bnQpOyBcCi0JCVB5X0ZhdGFsRXJyb3IoIlJFUU4iKTsgXAotCX0gZWxzZQorICAgIGlmIChpIDwgY291bnQpIHsgXAorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgUkVRTkZNVCwgY291bnQpOyBcCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlJFUU4iKTsgXAorICAgIH0gZWxzZQogCiAjZWxzZQotI2RlZmluZSBSRVFOKGksIGNvdW50KQkvKiBlbXB0eSAqLworI2RlZmluZSBSRVFOKGksIGNvdW50KSAgLyogZW1wdHkgKi8KICNlbmRpZgogCiBzdGF0aWMgbmZhZ3JhbW1hciAqCiBtZXRhY29tcGlsZShub2RlICpuKQogewotCW5mYWdyYW1tYXIgKmdyOwotCWludCBpOworICAgIG5mYWdyYW1tYXIgKmdyOworICAgIGludCBpOwogCi0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJDb21waWxpbmcgKG1ldGEtKSBwYXJzZSB0cmVlIGludG8gTkZBIGdyYW1tYXJcbiIpOwotCWdyID0gbmV3bmZhZ3JhbW1hcigpOwotCVJFUShuLCBNU1RBUlQpOwotCWkgPSBuLT5uX25jaGlsZHJlbiAtIDE7IC8qIExhc3QgY2hpbGQgaXMgRU5ETUFSS0VSICovCi0JbiA9IG4tPm5fY2hpbGQ7Ci0JZm9yICg7IC0taSA+PSAwOyBuKyspIHsKLQkJaWYgKG4tPm5fdHlwZSAhPSBORVdMSU5FKQotCQkJY29tcGlsZV9ydWxlKGdyLCBuKTsKLQl9Ci0JcmV0dXJuIGdyOworICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCisgICAgICAgIHByaW50ZigiQ29tcGlsaW5nIChtZXRhLSkgcGFyc2UgdHJlZSBpbnRvIE5GQSBncmFtbWFyXG4iKTsKKyAgICBnciA9IG5ld25mYWdyYW1tYXIoKTsKKyAgICBSRVEobiwgTVNUQVJUKTsKKyAgICBpID0gbi0+bl9uY2hpbGRyZW4gLSAxOyAvKiBMYXN0IGNoaWxkIGlzIEVORE1BUktFUiAqLworICAgIG4gPSBuLT5uX2NoaWxkOworICAgIGZvciAoOyAtLWkgPj0gMDsgbisrKSB7CisgICAgICAgIGlmIChuLT5uX3R5cGUgIT0gTkVXTElORSkKKyAgICAgICAgICAgIGNvbXBpbGVfcnVsZShnciwgbik7CisgICAgfQorICAgIHJldHVybiBncjsKIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVfcnVsZShuZmFncmFtbWFyICpnciwgbm9kZSAqbikKIHsKLQluZmEgKm5mOwotCQotCVJFUShuLCBSVUxFKTsKLQlSRVFOKG4tPm5fbmNoaWxkcmVuLCA0KTsKLQluID0gbi0+bl9jaGlsZDsKLQlSRVEobiwgTkFNRSk7Ci0JbmYgPSBhZGRuZmEoZ3IsIG4tPm5fc3RyKTsKLQluKys7Ci0JUkVRKG4sIENPTE9OKTsKLQluKys7Ci0JUkVRKG4sIFJIUyk7Ci0JY29tcGlsZV9yaHMoJmdyLT5ncl9sbCwgbmYsIG4sICZuZi0+bmZfc3RhcnQsICZuZi0+bmZfZmluaXNoKTsKLQluKys7Ci0JUkVRKG4sIE5FV0xJTkUpOworICAgIG5mYSAqbmY7CisKKyAgICBSRVEobiwgUlVMRSk7CisgICAgUkVRTihuLT5uX25jaGlsZHJlbiwgNCk7CisgICAgbiA9IG4tPm5fY2hpbGQ7CisgICAgUkVRKG4sIE5BTUUpOworICAgIG5mID0gYWRkbmZhKGdyLCBuLT5uX3N0cik7CisgICAgbisrOworICAgIFJFUShuLCBDT0xPTik7CisgICAgbisrOworICAgIFJFUShuLCBSSFMpOworICAgIGNvbXBpbGVfcmhzKCZnci0+Z3JfbGwsIG5mLCBuLCAmbmYtPm5mX3N0YXJ0LCAmbmYtPm5mX2ZpbmlzaCk7CisgICAgbisrOworICAgIFJFUShuLCBORVdMSU5FKTsKIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVfcmhzKGxhYmVsbGlzdCAqbGwsIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpCiB7Ci0JaW50IGk7Ci0JaW50IGEsIGI7Ci0JCi0JUkVRKG4sIFJIUyk7Ci0JaSA9IG4tPm5fbmNoaWxkcmVuOwotCVJFUU4oaSwgMSk7Ci0JbiA9IG4tPm5fY2hpbGQ7Ci0JUkVRKG4sIEFMVCk7Ci0JY29tcGlsZV9hbHQobGwsIG5mLCBuLCBwYSwgcGIpOwotCWlmICgtLWkgPD0gMCkKLQkJcmV0dXJuOwotCW4rKzsKLQlhID0gKnBhOwotCWIgPSAqcGI7Ci0JKnBhID0gYWRkbmZhc3RhdGUobmYpOwotCSpwYiA9IGFkZG5mYXN0YXRlKG5mKTsKLQlhZGRuZmFhcmMobmYsICpwYSwgYSwgRU1QVFkpOwotCWFkZG5mYWFyYyhuZiwgYiwgKnBiLCBFTVBUWSk7Ci0JZm9yICg7IC0taSA+PSAwOyBuKyspIHsKLQkJUkVRKG4sIFZCQVIpOwotCQlSRVFOKGksIDEpOwotCQktLWk7Ci0JCW4rKzsKLQkJUkVRKG4sIEFMVCk7Ci0JCWNvbXBpbGVfYWx0KGxsLCBuZiwgbiwgJmEsICZiKTsKLQkJYWRkbmZhYXJjKG5mLCAqcGEsIGEsIEVNUFRZKTsKLQkJYWRkbmZhYXJjKG5mLCBiLCAqcGIsIEVNUFRZKTsKLQl9CisgICAgaW50IGk7CisgICAgaW50IGEsIGI7CisKKyAgICBSRVEobiwgUkhTKTsKKyAgICBpID0gbi0+bl9uY2hpbGRyZW47CisgICAgUkVRTihpLCAxKTsKKyAgICBuID0gbi0+bl9jaGlsZDsKKyAgICBSRVEobiwgQUxUKTsKKyAgICBjb21waWxlX2FsdChsbCwgbmYsIG4sIHBhLCBwYik7CisgICAgaWYgKC0taSA8PSAwKQorICAgICAgICByZXR1cm47CisgICAgbisrOworICAgIGEgPSAqcGE7CisgICAgYiA9ICpwYjsKKyAgICAqcGEgPSBhZGRuZmFzdGF0ZShuZik7CisgICAgKnBiID0gYWRkbmZhc3RhdGUobmYpOworICAgIGFkZG5mYWFyYyhuZiwgKnBhLCBhLCBFTVBUWSk7CisgICAgYWRkbmZhYXJjKG5mLCBiLCAqcGIsIEVNUFRZKTsKKyAgICBmb3IgKDsgLS1pID49IDA7IG4rKykgeworICAgICAgICBSRVEobiwgVkJBUik7CisgICAgICAgIFJFUU4oaSwgMSk7CisgICAgICAgIC0taTsKKyAgICAgICAgbisrOworICAgICAgICBSRVEobiwgQUxUKTsKKyAgICAgICAgY29tcGlsZV9hbHQobGwsIG5mLCBuLCAmYSwgJmIpOworICAgICAgICBhZGRuZmFhcmMobmYsICpwYSwgYSwgRU1QVFkpOworICAgICAgICBhZGRuZmFhcmMobmYsIGIsICpwYiwgRU1QVFkpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVfYWx0KGxhYmVsbGlzdCAqbGwsIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpCiB7Ci0JaW50IGk7Ci0JaW50IGEsIGI7Ci0JCi0JUkVRKG4sIEFMVCk7Ci0JaSA9IG4tPm5fbmNoaWxkcmVuOwotCVJFUU4oaSwgMSk7Ci0JbiA9IG4tPm5fY2hpbGQ7Ci0JUkVRKG4sIElURU0pOwotCWNvbXBpbGVfaXRlbShsbCwgbmYsIG4sIHBhLCBwYik7Ci0JLS1pOwotCW4rKzsKLQlmb3IgKDsgLS1pID49IDA7IG4rKykgewotCQlSRVEobiwgSVRFTSk7Ci0JCWNvbXBpbGVfaXRlbShsbCwgbmYsIG4sICZhLCAmYik7Ci0JCWFkZG5mYWFyYyhuZiwgKnBiLCBhLCBFTVBUWSk7Ci0JCSpwYiA9IGI7Ci0JfQorICAgIGludCBpOworICAgIGludCBhLCBiOworCisgICAgUkVRKG4sIEFMVCk7CisgICAgaSA9IG4tPm5fbmNoaWxkcmVuOworICAgIFJFUU4oaSwgMSk7CisgICAgbiA9IG4tPm5fY2hpbGQ7CisgICAgUkVRKG4sIElURU0pOworICAgIGNvbXBpbGVfaXRlbShsbCwgbmYsIG4sIHBhLCBwYik7CisgICAgLS1pOworICAgIG4rKzsKKyAgICBmb3IgKDsgLS1pID49IDA7IG4rKykgeworICAgICAgICBSRVEobiwgSVRFTSk7CisgICAgICAgIGNvbXBpbGVfaXRlbShsbCwgbmYsIG4sICZhLCAmYik7CisgICAgICAgIGFkZG5mYWFyYyhuZiwgKnBiLCBhLCBFTVBUWSk7CisgICAgICAgICpwYiA9IGI7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogY29tcGlsZV9pdGVtKGxhYmVsbGlzdCAqbGwsIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpCiB7Ci0JaW50IGk7Ci0JaW50IGEsIGI7Ci0JCi0JUkVRKG4sIElURU0pOwotCWkgPSBuLT5uX25jaGlsZHJlbjsKLQlSRVFOKGksIDEpOwotCW4gPSBuLT5uX2NoaWxkOwotCWlmIChuLT5uX3R5cGUgPT0gTFNRQikgewotCQlSRVFOKGksIDMpOwotCQluKys7Ci0JCVJFUShuLCBSSFMpOwotCQkqcGEgPSBhZGRuZmFzdGF0ZShuZik7Ci0JCSpwYiA9IGFkZG5mYXN0YXRlKG5mKTsKLQkJYWRkbmZhYXJjKG5mLCAqcGEsICpwYiwgRU1QVFkpOwotCQljb21waWxlX3JocyhsbCwgbmYsIG4sICZhLCAmYik7Ci0JCWFkZG5mYWFyYyhuZiwgKnBhLCBhLCBFTVBUWSk7Ci0JCWFkZG5mYWFyYyhuZiwgYiwgKnBiLCBFTVBUWSk7Ci0JCVJFUU4oaSwgMSk7Ci0JCW4rKzsKLQkJUkVRKG4sIFJTUUIpOwotCX0KLQllbHNlIHsKLQkJY29tcGlsZV9hdG9tKGxsLCBuZiwgbiwgcGEsIHBiKTsKLQkJaWYgKC0taSA8PSAwKQotCQkJcmV0dXJuOwotCQluKys7Ci0JCWFkZG5mYWFyYyhuZiwgKnBiLCAqcGEsIEVNUFRZKTsKLQkJaWYgKG4tPm5fdHlwZSA9PSBTVEFSKQotCQkJKnBiID0gKnBhOwotCQllbHNlCi0JCQlSRVEobiwgUExVUyk7Ci0JfQorICAgIGludCBpOworICAgIGludCBhLCBiOworCisgICAgUkVRKG4sIElURU0pOworICAgIGkgPSBuLT5uX25jaGlsZHJlbjsKKyAgICBSRVFOKGksIDEpOworICAgIG4gPSBuLT5uX2NoaWxkOworICAgIGlmIChuLT5uX3R5cGUgPT0gTFNRQikgeworICAgICAgICBSRVFOKGksIDMpOworICAgICAgICBuKys7CisgICAgICAgIFJFUShuLCBSSFMpOworICAgICAgICAqcGEgPSBhZGRuZmFzdGF0ZShuZik7CisgICAgICAgICpwYiA9IGFkZG5mYXN0YXRlKG5mKTsKKyAgICAgICAgYWRkbmZhYXJjKG5mLCAqcGEsICpwYiwgRU1QVFkpOworICAgICAgICBjb21waWxlX3JocyhsbCwgbmYsIG4sICZhLCAmYik7CisgICAgICAgIGFkZG5mYWFyYyhuZiwgKnBhLCBhLCBFTVBUWSk7CisgICAgICAgIGFkZG5mYWFyYyhuZiwgYiwgKnBiLCBFTVBUWSk7CisgICAgICAgIFJFUU4oaSwgMSk7CisgICAgICAgIG4rKzsKKyAgICAgICAgUkVRKG4sIFJTUUIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY29tcGlsZV9hdG9tKGxsLCBuZiwgbiwgcGEsIHBiKTsKKyAgICAgICAgaWYgKC0taSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBuKys7CisgICAgICAgIGFkZG5mYWFyYyhuZiwgKnBiLCAqcGEsIEVNUFRZKTsKKyAgICAgICAgaWYgKG4tPm5fdHlwZSA9PSBTVEFSKQorICAgICAgICAgICAgKnBiID0gKnBhOworICAgICAgICBlbHNlCisgICAgICAgICAgICBSRVEobiwgUExVUyk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogY29tcGlsZV9hdG9tKGxhYmVsbGlzdCAqbGwsIG5mYSAqbmYsIG5vZGUgKm4sIGludCAqcGEsIGludCAqcGIpCiB7Ci0JaW50IGk7Ci0JCi0JUkVRKG4sIEFUT00pOwotCWkgPSBuLT5uX25jaGlsZHJlbjsKLQlSRVFOKGksIDEpOwotCW4gPSBuLT5uX2NoaWxkOwotCWlmIChuLT5uX3R5cGUgPT0gTFBBUikgewotCQlSRVFOKGksIDMpOwotCQluKys7Ci0JCVJFUShuLCBSSFMpOwotCQljb21waWxlX3JocyhsbCwgbmYsIG4sIHBhLCBwYik7Ci0JCW4rKzsKLQkJUkVRKG4sIFJQQVIpOwotCX0KLQllbHNlIGlmIChuLT5uX3R5cGUgPT0gTkFNRSB8fCBuLT5uX3R5cGUgPT0gU1RSSU5HKSB7Ci0JCSpwYSA9IGFkZG5mYXN0YXRlKG5mKTsKLQkJKnBiID0gYWRkbmZhc3RhdGUobmYpOwotCQlhZGRuZmFhcmMobmYsICpwYSwgKnBiLCBhZGRsYWJlbChsbCwgbi0+bl90eXBlLCBuLT5uX3N0cikpOwotCX0KLQllbHNlCi0JCVJFUShuLCBOQU1FKTsKKyAgICBpbnQgaTsKKworICAgIFJFUShuLCBBVE9NKTsKKyAgICBpID0gbi0+bl9uY2hpbGRyZW47CisgICAgUkVRTihpLCAxKTsKKyAgICBuID0gbi0+bl9jaGlsZDsKKyAgICBpZiAobi0+bl90eXBlID09IExQQVIpIHsKKyAgICAgICAgUkVRTihpLCAzKTsKKyAgICAgICAgbisrOworICAgICAgICBSRVEobiwgUkhTKTsKKyAgICAgICAgY29tcGlsZV9yaHMobGwsIG5mLCBuLCBwYSwgcGIpOworICAgICAgICBuKys7CisgICAgICAgIFJFUShuLCBSUEFSKTsKKyAgICB9CisgICAgZWxzZSBpZiAobi0+bl90eXBlID09IE5BTUUgfHwgbi0+bl90eXBlID09IFNUUklORykgeworICAgICAgICAqcGEgPSBhZGRuZmFzdGF0ZShuZik7CisgICAgICAgICpwYiA9IGFkZG5mYXN0YXRlKG5mKTsKKyAgICAgICAgYWRkbmZhYXJjKG5mLCAqcGEsICpwYiwgYWRkbGFiZWwobGwsIG4tPm5fdHlwZSwgbi0+bl9zdHIpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBSRVEobiwgTkFNRSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBkdW1wc3RhdGUobGFiZWxsaXN0ICpsbCwgbmZhICpuZiwgaW50IGlzdGF0ZSkKIHsKLQluZmFzdGF0ZSAqc3Q7Ci0JaW50IGk7Ci0JbmZhYXJjICphcjsKLQkKLQlwcmludGYoIiVjJTJkJWMiLAotCQlpc3RhdGUgPT0gbmYtPm5mX3N0YXJ0ID8gJyonIDogJyAnLAotCQlpc3RhdGUsCi0JCWlzdGF0ZSA9PSBuZi0+bmZfZmluaXNoID8gJy4nIDogJyAnKTsKLQlzdCA9ICZuZi0+bmZfc3RhdGVbaXN0YXRlXTsKLQlhciA9IHN0LT5zdF9hcmM7Ci0JZm9yIChpID0gMDsgaSA8IHN0LT5zdF9uYXJjczsgaSsrKSB7Ci0JCWlmIChpID4gMCkKLQkJCXByaW50ZigiXG4gICAgIik7Ci0JCXByaW50ZigiLT4gJTJkICAlcyIsIGFyLT5hcl9hcnJvdywKLQkJCVB5R3JhbW1hcl9MYWJlbFJlcHIoJmxsLT5sbF9sYWJlbFthci0+YXJfbGFiZWxdKSk7Ci0JCWFyKys7Ci0JfQotCXByaW50ZigiXG4iKTsKKyAgICBuZmFzdGF0ZSAqc3Q7CisgICAgaW50IGk7CisgICAgbmZhYXJjICphcjsKKworICAgIHByaW50ZigiJWMlMmQlYyIsCisgICAgICAgIGlzdGF0ZSA9PSBuZi0+bmZfc3RhcnQgPyAnKicgOiAnICcsCisgICAgICAgIGlzdGF0ZSwKKyAgICAgICAgaXN0YXRlID09IG5mLT5uZl9maW5pc2ggPyAnLicgOiAnICcpOworICAgIHN0ID0gJm5mLT5uZl9zdGF0ZVtpc3RhdGVdOworICAgIGFyID0gc3QtPnN0X2FyYzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPnN0X25hcmNzOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAiKTsKKyAgICAgICAgcHJpbnRmKCItPiAlMmQgICVzIiwgYXItPmFyX2Fycm93LAorICAgICAgICAgICAgUHlHcmFtbWFyX0xhYmVsUmVwcigmbGwtPmxsX2xhYmVsW2FyLT5hcl9sYWJlbF0pKTsKKyAgICAgICAgYXIrKzsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOwogfQogCiBzdGF0aWMgdm9pZAogZHVtcG5mYShsYWJlbGxpc3QgKmxsLCBuZmEgKm5mKQogewotCWludCBpOwotCQotCXByaW50ZigiTkZBICclcycgaGFzICVkIHN0YXRlczsgc3RhcnQgJWQsIGZpbmlzaCAlZFxuIiwKLQkJbmYtPm5mX25hbWUsIG5mLT5uZl9uc3RhdGVzLCBuZi0+bmZfc3RhcnQsIG5mLT5uZl9maW5pc2gpOwotCWZvciAoaSA9IDA7IGkgPCBuZi0+bmZfbnN0YXRlczsgaSsrKQotCQlkdW1wc3RhdGUobGwsIG5mLCBpKTsKKyAgICBpbnQgaTsKKworICAgIHByaW50ZigiTkZBICclcycgaGFzICVkIHN0YXRlczsgc3RhcnQgJWQsIGZpbmlzaCAlZFxuIiwKKyAgICAgICAgbmYtPm5mX25hbWUsIG5mLT5uZl9uc3RhdGVzLCBuZi0+bmZfc3RhcnQsIG5mLT5uZl9maW5pc2gpOworICAgIGZvciAoaSA9IDA7IGkgPCBuZi0+bmZfbnN0YXRlczsgaSsrKQorICAgICAgICBkdW1wc3RhdGUobGwsIG5mLCBpKTsKIH0KIAogCkBAIC0zNDIsMTg0ICszNDIsMTg0IEBACiBzdGF0aWMgdm9pZAogYWRkY2xvc3VyZShiaXRzZXQgc3MsIG5mYSAqbmYsIGludCBpc3RhdGUpCiB7Ci0JaWYgKGFkZGJpdChzcywgaXN0YXRlKSkgewotCQluZmFzdGF0ZSAqc3QgPSAmbmYtPm5mX3N0YXRlW2lzdGF0ZV07Ci0JCW5mYWFyYyAqYXIgPSBzdC0+c3RfYXJjOwotCQlpbnQgaTsKLQkJCi0JCWZvciAoaSA9IHN0LT5zdF9uYXJjczsgLS1pID49IDA7ICkgewotCQkJaWYgKGFyLT5hcl9sYWJlbCA9PSBFTVBUWSkKLQkJCQlhZGRjbG9zdXJlKHNzLCBuZiwgYXItPmFyX2Fycm93KTsKLQkJCWFyKys7Ci0JCX0KLQl9CisgICAgaWYgKGFkZGJpdChzcywgaXN0YXRlKSkgeworICAgICAgICBuZmFzdGF0ZSAqc3QgPSAmbmYtPm5mX3N0YXRlW2lzdGF0ZV07CisgICAgICAgIG5mYWFyYyAqYXIgPSBzdC0+c3RfYXJjOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSBzdC0+c3RfbmFyY3M7IC0taSA+PSAwOyApIHsKKyAgICAgICAgICAgIGlmIChhci0+YXJfbGFiZWwgPT0gRU1QVFkpCisgICAgICAgICAgICAgICAgYWRkY2xvc3VyZShzcywgbmYsIGFyLT5hcl9hcnJvdyk7CisgICAgICAgICAgICBhcisrOworICAgICAgICB9CisgICAgfQogfQogCiB0eXBlZGVmIHN0cnVjdCBfc3NfYXJjIHsKLQliaXRzZXQJc2FfYml0c2V0OwotCWludAlzYV9hcnJvdzsKLQlpbnQJc2FfbGFiZWw7CisgICAgYml0c2V0ICAgICAgc2FfYml0c2V0OworICAgIGludCAgICAgICAgIHNhX2Fycm93OworICAgIGludCAgICAgICAgIHNhX2xhYmVsOwogfSBzc19hcmM7CiAKIHR5cGVkZWYgc3RydWN0IF9zc19zdGF0ZSB7Ci0JYml0c2V0CXNzX3NzOwotCWludAlzc19uYXJjczsKLQlzdHJ1Y3QgX3NzX2FyYwkqc3NfYXJjOwotCWludAlzc19kZWxldGVkOwotCWludAlzc19maW5pc2g7Ci0JaW50CXNzX3JlbmFtZTsKKyAgICBiaXRzZXQgICAgICBzc19zczsKKyAgICBpbnQgICAgICAgICBzc19uYXJjczsKKyAgICBzdHJ1Y3QgX3NzX2FyYyAgICAgICpzc19hcmM7CisgICAgaW50ICAgICAgICAgc3NfZGVsZXRlZDsKKyAgICBpbnQgICAgICAgICBzc19maW5pc2g7CisgICAgaW50ICAgICAgICAgc3NfcmVuYW1lOwogfSBzc19zdGF0ZTsKIAogdHlwZWRlZiBzdHJ1Y3QgX3NzX2RmYSB7Ci0JaW50CXNkX25zdGF0ZXM7Ci0Jc3Nfc3RhdGUgKnNkX3N0YXRlOworICAgIGludCAgICAgICAgIHNkX25zdGF0ZXM7CisgICAgc3Nfc3RhdGUgKnNkX3N0YXRlOwogfSBzc19kZmE7CiAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyB2b2lkIHByaW50c3NkZmEoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSwgaW50IG5iaXRzLAotCQkgICAgICAgbGFiZWxsaXN0ICpsbCwgY2hhciAqbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY2hhciAqbXNnKTsKIHN0YXRpYyB2b2lkIHNpbXBsaWZ5KGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUpOwogc3RhdGljIHZvaWQgY29udmVydChkZmEgKmQsIGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUpOwogCiBzdGF0aWMgdm9pZAogbWFrZWRmYShuZmFncmFtbWFyICpnciwgbmZhICpuZiwgZGZhICpkKQogewotCWludCBuYml0cyA9IG5mLT5uZl9uc3RhdGVzOwotCWJpdHNldCBzczsKLQlpbnQgeHhfbnN0YXRlczsKLQlzc19zdGF0ZSAqeHhfc3RhdGUsICp5eTsKLQlzc19hcmMgKnp6OwotCWludCBpc3RhdGUsIGpzdGF0ZSwgaWFyYywgamFyYywgaWJpdDsKLQluZmFzdGF0ZSAqc3Q7Ci0JbmZhYXJjICphcjsKLQkKLQlzcyA9IG5ld2JpdHNldChuYml0cyk7Ci0JYWRkY2xvc3VyZShzcywgbmYsIG5mLT5uZl9zdGFydCk7Ci0JeHhfc3RhdGUgPSAoc3Nfc3RhdGUgKilQeU9iamVjdF9NQUxMT0Moc2l6ZW9mKHNzX3N0YXRlKSk7Ci0JaWYgKHh4X3N0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3IgeHhfc3RhdGUgaW4gbWFrZWRmYSIpOwotCXh4X25zdGF0ZXMgPSAxOwotCXl5ID0gJnh4X3N0YXRlWzBdOwotCXl5LT5zc19zcyA9IHNzOwotCXl5LT5zc19uYXJjcyA9IDA7Ci0JeXktPnNzX2FyYyA9IE5VTEw7Ci0JeXktPnNzX2RlbGV0ZWQgPSAwOwotCXl5LT5zc19maW5pc2ggPSB0ZXN0Yml0KHNzLCBuZi0+bmZfZmluaXNoKTsKLQlpZiAoeXktPnNzX2ZpbmlzaCkKLQkJcHJpbnRmKCJFcnJvcjogbm9udGVybWluYWwgJyVzJyBtYXkgcHJvZHVjZSBlbXB0eS5cbiIsCi0JCQluZi0+bmZfbmFtZSk7Ci0JCi0JLyogVGhpcyBhbGdvcml0aG0gaXMgZnJvbSBhIGJvb2sgd3JpdHRlbiBiZWZvcmUKLQkgICB0aGUgaW52ZW50aW9uIG9mIHN0cnVjdHVyZWQgcHJvZ3JhbW1pbmcuLi4gKi8KKyAgICBpbnQgbmJpdHMgPSBuZi0+bmZfbnN0YXRlczsKKyAgICBiaXRzZXQgc3M7CisgICAgaW50IHh4X25zdGF0ZXM7CisgICAgc3Nfc3RhdGUgKnh4X3N0YXRlLCAqeXk7CisgICAgc3NfYXJjICp6ejsKKyAgICBpbnQgaXN0YXRlLCBqc3RhdGUsIGlhcmMsIGphcmMsIGliaXQ7CisgICAgbmZhc3RhdGUgKnN0OworICAgIG5mYWFyYyAqYXI7CiAKLQkvKiBGb3IgZWFjaCB1bm1hcmtlZCBzdGF0ZS4uLiAqLwotCWZvciAoaXN0YXRlID0gMDsgaXN0YXRlIDwgeHhfbnN0YXRlczsgKytpc3RhdGUpIHsKLQkJc2l6ZV90IHNpemU7Ci0JCXl5ID0gJnh4X3N0YXRlW2lzdGF0ZV07Ci0JCXNzID0geXktPnNzX3NzOwotCQkvKiBGb3IgYWxsIGl0cyBzdGF0ZXMuLi4gKi8KLQkJZm9yIChpYml0ID0gMDsgaWJpdCA8IG5mLT5uZl9uc3RhdGVzOyArK2liaXQpIHsKLQkJCWlmICghdGVzdGJpdChzcywgaWJpdCkpCi0JCQkJY29udGludWU7Ci0JCQlzdCA9ICZuZi0+bmZfc3RhdGVbaWJpdF07Ci0JCQkvKiBGb3IgYWxsIG5vbi1lbXB0eSBhcmNzIGZyb20gdGhpcyBzdGF0ZS4uLiAqLwotCQkJZm9yIChpYXJjID0gMDsgaWFyYyA8IHN0LT5zdF9uYXJjczsgaWFyYysrKSB7Ci0JCQkJYXIgPSAmc3QtPnN0X2FyY1tpYXJjXTsKLQkJCQlpZiAoYXItPmFyX2xhYmVsID09IEVNUFRZKQotCQkJCQljb250aW51ZTsKLQkJCQkvKiBMb29rIHVwIGluIGxpc3Qgb2YgYXJjcyBmcm9tIHRoaXMgc3RhdGUgKi8KLQkJCQlmb3IgKGphcmMgPSAwOyBqYXJjIDwgeXktPnNzX25hcmNzOyArK2phcmMpIHsKLQkJCQkJenogPSAmeXktPnNzX2FyY1tqYXJjXTsKLQkJCQkJaWYgKGFyLT5hcl9sYWJlbCA9PSB6ei0+c2FfbGFiZWwpCi0JCQkJCQlnb3RvIGZvdW5kOwotCQkJCX0KLQkJCQkvKiBBZGQgbmV3IGFyYyBmb3IgdGhpcyBzdGF0ZSAqLwotCQkJCXNpemUgPSBzaXplb2Yoc3NfYXJjKSAqICh5eS0+c3NfbmFyY3MgKyAxKTsKLQkJCQl5eS0+c3NfYXJjID0gKHNzX2FyYyAqKVB5T2JqZWN0X1JFQUxMT0MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eS0+c3NfYXJjLCBzaXplKTsKLQkJCQlpZiAoeXktPnNzX2FyYyA9PSBOVUxMKQotCQkJCQlQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7Ci0JCQkJenogPSAmeXktPnNzX2FyY1t5eS0+c3NfbmFyY3MrK107Ci0JCQkJenotPnNhX2xhYmVsID0gYXItPmFyX2xhYmVsOwotCQkJCXp6LT5zYV9iaXRzZXQgPSBuZXdiaXRzZXQobmJpdHMpOwotCQkJCXp6LT5zYV9hcnJvdyA9IC0xOwotCQkJIGZvdW5kOgk7Ci0JCQkJLyogQWRkIGRlc3RpbmF0aW9uICovCi0JCQkJYWRkY2xvc3VyZSh6ei0+c2FfYml0c2V0LCBuZiwgYXItPmFyX2Fycm93KTsKLQkJCX0KLQkJfQotCQkvKiBOb3cgbG9vayB1cCBhbGwgdGhlIGFycm93IHN0YXRlcyAqLwotCQlmb3IgKGphcmMgPSAwOyBqYXJjIDwgeHhfc3RhdGVbaXN0YXRlXS5zc19uYXJjczsgamFyYysrKSB7Ci0JCQl6eiA9ICZ4eF9zdGF0ZVtpc3RhdGVdLnNzX2FyY1tqYXJjXTsKLQkJCWZvciAoanN0YXRlID0gMDsganN0YXRlIDwgeHhfbnN0YXRlczsganN0YXRlKyspIHsKLQkJCQlpZiAoc2FtZWJpdHNldCh6ei0+c2FfYml0c2V0LAotCQkJCQl4eF9zdGF0ZVtqc3RhdGVdLnNzX3NzLCBuYml0cykpIHsKLQkJCQkJenotPnNhX2Fycm93ID0ganN0YXRlOwotCQkJCQlnb3RvIGRvbmU7Ci0JCQkJfQotCQkJfQotCQkJc2l6ZSA9IHNpemVvZihzc19zdGF0ZSkgKiAoeHhfbnN0YXRlcyArIDEpOwotCQkJeHhfc3RhdGUgPSAoc3Nfc3RhdGUgKilQeU9iamVjdF9SRUFMTE9DKHh4X3N0YXRlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0JCQlpZiAoeHhfc3RhdGUgPT0gTlVMTCkKLQkJCQlQeV9GYXRhbEVycm9yKCJvdXQgb2YgbWVtIik7Ci0JCQl6ei0+c2FfYXJyb3cgPSB4eF9uc3RhdGVzOwotCQkJeXkgPSAmeHhfc3RhdGVbeHhfbnN0YXRlcysrXTsKLQkJCXl5LT5zc19zcyA9IHp6LT5zYV9iaXRzZXQ7Ci0JCQl5eS0+c3NfbmFyY3MgPSAwOwotCQkJeXktPnNzX2FyYyA9IE5VTEw7Ci0JCQl5eS0+c3NfZGVsZXRlZCA9IDA7Ci0JCQl5eS0+c3NfZmluaXNoID0gdGVzdGJpdCh5eS0+c3Nfc3MsIG5mLT5uZl9maW5pc2gpOwotCQkgZG9uZToJOwotCQl9Ci0JfQotCQotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50c3NkZmEoeHhfbnN0YXRlcywgeHhfc3RhdGUsIG5iaXRzLCAmZ3ItPmdyX2xsLAotCQkJCQkJImJlZm9yZSBtaW5pbWl6aW5nIik7Ci0JCi0Jc2ltcGxpZnkoeHhfbnN0YXRlcywgeHhfc3RhdGUpOwotCQotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50c3NkZmEoeHhfbnN0YXRlcywgeHhfc3RhdGUsIG5iaXRzLCAmZ3ItPmdyX2xsLAotCQkJCQkJImFmdGVyIG1pbmltaXppbmciKTsKLQkKLQljb252ZXJ0KGQsIHh4X25zdGF0ZXMsIHh4X3N0YXRlKTsKLQkKLQkvKiBYWFggY2xlYW51cCAqLwotCVB5T2JqZWN0X0ZSRUUoeHhfc3RhdGUpOworICAgIHNzID0gbmV3Yml0c2V0KG5iaXRzKTsKKyAgICBhZGRjbG9zdXJlKHNzLCBuZiwgbmYtPm5mX3N0YXJ0KTsKKyAgICB4eF9zdGF0ZSA9IChzc19zdGF0ZSAqKVB5T2JqZWN0X01BTExPQyhzaXplb2Yoc3Nfc3RhdGUpKTsKKyAgICBpZiAoeHhfc3RhdGUgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigibm8gbWVtIGZvciB4eF9zdGF0ZSBpbiBtYWtlZGZhIik7CisgICAgeHhfbnN0YXRlcyA9IDE7CisgICAgeXkgPSAmeHhfc3RhdGVbMF07CisgICAgeXktPnNzX3NzID0gc3M7CisgICAgeXktPnNzX25hcmNzID0gMDsKKyAgICB5eS0+c3NfYXJjID0gTlVMTDsKKyAgICB5eS0+c3NfZGVsZXRlZCA9IDA7CisgICAgeXktPnNzX2ZpbmlzaCA9IHRlc3RiaXQoc3MsIG5mLT5uZl9maW5pc2gpOworICAgIGlmICh5eS0+c3NfZmluaXNoKQorICAgICAgICBwcmludGYoIkVycm9yOiBub250ZXJtaW5hbCAnJXMnIG1heSBwcm9kdWNlIGVtcHR5LlxuIiwKKyAgICAgICAgICAgIG5mLT5uZl9uYW1lKTsKKworICAgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIGZyb20gYSBib29rIHdyaXR0ZW4gYmVmb3JlCisgICAgICAgdGhlIGludmVudGlvbiBvZiBzdHJ1Y3R1cmVkIHByb2dyYW1taW5nLi4uICovCisKKyAgICAvKiBGb3IgZWFjaCB1bm1hcmtlZCBzdGF0ZS4uLiAqLworICAgIGZvciAoaXN0YXRlID0gMDsgaXN0YXRlIDwgeHhfbnN0YXRlczsgKytpc3RhdGUpIHsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIHl5ID0gJnh4X3N0YXRlW2lzdGF0ZV07CisgICAgICAgIHNzID0geXktPnNzX3NzOworICAgICAgICAvKiBGb3IgYWxsIGl0cyBzdGF0ZXMuLi4gKi8KKyAgICAgICAgZm9yIChpYml0ID0gMDsgaWJpdCA8IG5mLT5uZl9uc3RhdGVzOyArK2liaXQpIHsKKyAgICAgICAgICAgIGlmICghdGVzdGJpdChzcywgaWJpdCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzdCA9ICZuZi0+bmZfc3RhdGVbaWJpdF07CisgICAgICAgICAgICAvKiBGb3IgYWxsIG5vbi1lbXB0eSBhcmNzIGZyb20gdGhpcyBzdGF0ZS4uLiAqLworICAgICAgICAgICAgZm9yIChpYXJjID0gMDsgaWFyYyA8IHN0LT5zdF9uYXJjczsgaWFyYysrKSB7CisgICAgICAgICAgICAgICAgYXIgPSAmc3QtPnN0X2FyY1tpYXJjXTsKKyAgICAgICAgICAgICAgICBpZiAoYXItPmFyX2xhYmVsID09IEVNUFRZKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvKiBMb29rIHVwIGluIGxpc3Qgb2YgYXJjcyBmcm9tIHRoaXMgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGphcmMgPSAwOyBqYXJjIDwgeXktPnNzX25hcmNzOyArK2phcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgenogPSAmeXktPnNzX2FyY1tqYXJjXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyLT5hcl9sYWJlbCA9PSB6ei0+c2FfbGFiZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBBZGQgbmV3IGFyYyBmb3IgdGhpcyBzdGF0ZSAqLworICAgICAgICAgICAgICAgIHNpemUgPSBzaXplb2Yoc3NfYXJjKSAqICh5eS0+c3NfbmFyY3MgKyAxKTsKKyAgICAgICAgICAgICAgICB5eS0+c3NfYXJjID0gKHNzX2FyYyAqKVB5T2JqZWN0X1JFQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5LT5zc19hcmMsIHNpemUpOworICAgICAgICAgICAgICAgIGlmICh5eS0+c3NfYXJjID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm91dCBvZiBtZW0iKTsKKyAgICAgICAgICAgICAgICB6eiA9ICZ5eS0+c3NfYXJjW3l5LT5zc19uYXJjcysrXTsKKyAgICAgICAgICAgICAgICB6ei0+c2FfbGFiZWwgPSBhci0+YXJfbGFiZWw7CisgICAgICAgICAgICAgICAgenotPnNhX2JpdHNldCA9IG5ld2JpdHNldChuYml0cyk7CisgICAgICAgICAgICAgICAgenotPnNhX2Fycm93ID0gLTE7CisgICAgICAgICAgICAgZm91bmQ6ICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAvKiBBZGQgZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICBhZGRjbG9zdXJlKHp6LT5zYV9iaXRzZXQsIG5mLCBhci0+YXJfYXJyb3cpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIE5vdyBsb29rIHVwIGFsbCB0aGUgYXJyb3cgc3RhdGVzICovCisgICAgICAgIGZvciAoamFyYyA9IDA7IGphcmMgPCB4eF9zdGF0ZVtpc3RhdGVdLnNzX25hcmNzOyBqYXJjKyspIHsKKyAgICAgICAgICAgIHp6ID0gJnh4X3N0YXRlW2lzdGF0ZV0uc3NfYXJjW2phcmNdOworICAgICAgICAgICAgZm9yIChqc3RhdGUgPSAwOyBqc3RhdGUgPCB4eF9uc3RhdGVzOyBqc3RhdGUrKykgeworICAgICAgICAgICAgICAgIGlmIChzYW1lYml0c2V0KHp6LT5zYV9iaXRzZXQsCisgICAgICAgICAgICAgICAgICAgIHh4X3N0YXRlW2pzdGF0ZV0uc3Nfc3MsIG5iaXRzKSkgeworICAgICAgICAgICAgICAgICAgICB6ei0+c2FfYXJyb3cgPSBqc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKHNzX3N0YXRlKSAqICh4eF9uc3RhdGVzICsgMSk7CisgICAgICAgICAgICB4eF9zdGF0ZSA9IChzc19zdGF0ZSAqKVB5T2JqZWN0X1JFQUxMT0MoeHhfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgICAgICAgICAgaWYgKHh4X3N0YXRlID09IE5VTEwpCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigib3V0IG9mIG1lbSIpOworICAgICAgICAgICAgenotPnNhX2Fycm93ID0geHhfbnN0YXRlczsKKyAgICAgICAgICAgIHl5ID0gJnh4X3N0YXRlW3h4X25zdGF0ZXMrK107CisgICAgICAgICAgICB5eS0+c3Nfc3MgPSB6ei0+c2FfYml0c2V0OworICAgICAgICAgICAgeXktPnNzX25hcmNzID0gMDsKKyAgICAgICAgICAgIHl5LT5zc19hcmMgPSBOVUxMOworICAgICAgICAgICAgeXktPnNzX2RlbGV0ZWQgPSAwOworICAgICAgICAgICAgeXktPnNzX2ZpbmlzaCA9IHRlc3RiaXQoeXktPnNzX3NzLCBuZi0+bmZfZmluaXNoKTsKKyAgICAgICAgIGRvbmU6ICAgICAgICAgIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCisgICAgICAgIHByaW50c3NkZmEoeHhfbnN0YXRlcywgeHhfc3RhdGUsIG5iaXRzLCAmZ3ItPmdyX2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmUgbWluaW1pemluZyIpOworCisgICAgc2ltcGxpZnkoeHhfbnN0YXRlcywgeHhfc3RhdGUpOworCisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRzc2RmYSh4eF9uc3RhdGVzLCB4eF9zdGF0ZSwgbmJpdHMsICZnci0+Z3JfbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyIG1pbmltaXppbmciKTsKKworICAgIGNvbnZlcnQoZCwgeHhfbnN0YXRlcywgeHhfc3RhdGUpOworCisgICAgLyogWFhYIGNsZWFudXAgKi8KKyAgICBQeU9iamVjdF9GUkVFKHh4X3N0YXRlKTsKIH0KIAogc3RhdGljIHZvaWQKIHByaW50c3NkZmEoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSwgaW50IG5iaXRzLAotCSAgIGxhYmVsbGlzdCAqbGwsIGNoYXIgKm1zZykKKyAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY2hhciAqbXNnKQogewotCWludCBpLCBpYml0LCBpYXJjOwotCXNzX3N0YXRlICp5eTsKLQlzc19hcmMgKnp6OwotCQotCXByaW50ZigiU3Vic2V0IERGQSAlc1xuIiwgbXNnKTsKLQlmb3IgKGkgPSAwOyBpIDwgeHhfbnN0YXRlczsgaSsrKSB7Ci0JCXl5ID0gJnh4X3N0YXRlW2ldOwotCQlpZiAoeXktPnNzX2RlbGV0ZWQpCi0JCQljb250aW51ZTsKLQkJcHJpbnRmKCIgU3Vic2V0ICVkIiwgaSk7Ci0JCWlmICh5eS0+c3NfZmluaXNoKQotCQkJcHJpbnRmKCIgKGZpbmlzaCkiKTsKLQkJcHJpbnRmKCIgeyAiKTsKLQkJZm9yIChpYml0ID0gMDsgaWJpdCA8IG5iaXRzOyBpYml0KyspIHsKLQkJCWlmICh0ZXN0Yml0KHl5LT5zc19zcywgaWJpdCkpCi0JCQkJcHJpbnRmKCIlZCAiLCBpYml0KTsKLQkJfQotCQlwcmludGYoIn1cbiIpOwotCQlmb3IgKGlhcmMgPSAwOyBpYXJjIDwgeXktPnNzX25hcmNzOyBpYXJjKyspIHsKLQkJCXp6ID0gJnl5LT5zc19hcmNbaWFyY107Ci0JCQlwcmludGYoIiAgQXJjIHRvIHN0YXRlICVkLCBsYWJlbCAlc1xuIiwKLQkJCQl6ei0+c2FfYXJyb3csCi0JCQkJUHlHcmFtbWFyX0xhYmVsUmVwcigKLQkJCQkJJmxsLT5sbF9sYWJlbFt6ei0+c2FfbGFiZWxdKSk7Ci0JCX0KLQl9CisgICAgaW50IGksIGliaXQsIGlhcmM7CisgICAgc3Nfc3RhdGUgKnl5OworICAgIHNzX2FyYyAqeno7CisKKyAgICBwcmludGYoIlN1YnNldCBERkEgJXNcbiIsIG1zZyk7CisgICAgZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgeworICAgICAgICB5eSA9ICZ4eF9zdGF0ZVtpXTsKKyAgICAgICAgaWYgKHl5LT5zc19kZWxldGVkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHByaW50ZigiIFN1YnNldCAlZCIsIGkpOworICAgICAgICBpZiAoeXktPnNzX2ZpbmlzaCkKKyAgICAgICAgICAgIHByaW50ZigiIChmaW5pc2gpIik7CisgICAgICAgIHByaW50ZigiIHsgIik7CisgICAgICAgIGZvciAoaWJpdCA9IDA7IGliaXQgPCBuYml0czsgaWJpdCsrKSB7CisgICAgICAgICAgICBpZiAodGVzdGJpdCh5eS0+c3Nfc3MsIGliaXQpKQorICAgICAgICAgICAgICAgIHByaW50ZigiJWQgIiwgaWJpdCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJ9XG4iKTsKKyAgICAgICAgZm9yIChpYXJjID0gMDsgaWFyYyA8IHl5LT5zc19uYXJjczsgaWFyYysrKSB7CisgICAgICAgICAgICB6eiA9ICZ5eS0+c3NfYXJjW2lhcmNdOworICAgICAgICAgICAgcHJpbnRmKCIgIEFyYyB0byBzdGF0ZSAlZCwgbGFiZWwgJXNcbiIsCisgICAgICAgICAgICAgICAgenotPnNhX2Fycm93LAorICAgICAgICAgICAgICAgIFB5R3JhbW1hcl9MYWJlbFJlcHIoCisgICAgICAgICAgICAgICAgICAgICZsbC0+bGxfbGFiZWxbenotPnNhX2xhYmVsXSkpOworICAgICAgICB9CisgICAgfQogfQogCiAKQEAgLTUzNSw1OSArNTM1LDU5IEBACiBzdGF0aWMgaW50CiBzYW1lc3RhdGUoc3Nfc3RhdGUgKnMxLCBzc19zdGF0ZSAqczIpCiB7Ci0JaW50IGk7Ci0JCi0JaWYgKHMxLT5zc19uYXJjcyAhPSBzMi0+c3NfbmFyY3MgfHwgczEtPnNzX2ZpbmlzaCAhPSBzMi0+c3NfZmluaXNoKQotCQlyZXR1cm4gMDsKLQlmb3IgKGkgPSAwOyBpIDwgczEtPnNzX25hcmNzOyBpKyspIHsKLQkJaWYgKHMxLT5zc19hcmNbaV0uc2FfYXJyb3cgIT0gczItPnNzX2FyY1tpXS5zYV9hcnJvdyB8fAotCQkJczEtPnNzX2FyY1tpXS5zYV9sYWJlbCAhPSBzMi0+c3NfYXJjW2ldLnNhX2xhYmVsKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIGludCBpOworCisgICAgaWYgKHMxLT5zc19uYXJjcyAhPSBzMi0+c3NfbmFyY3MgfHwgczEtPnNzX2ZpbmlzaCAhPSBzMi0+c3NfZmluaXNoKQorICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgczEtPnNzX25hcmNzOyBpKyspIHsKKyAgICAgICAgaWYgKHMxLT5zc19hcmNbaV0uc2FfYXJyb3cgIT0gczItPnNzX2FyY1tpXS5zYV9hcnJvdyB8fAorICAgICAgICAgICAgczEtPnNzX2FyY1tpXS5zYV9sYWJlbCAhPSBzMi0+c3NfYXJjW2ldLnNhX2xhYmVsKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogcmVuYW1lc3RhdGVzKGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUsIGludCBmcm9tLCBpbnQgdG8pCiB7Ci0JaW50IGksIGo7Ci0JCi0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJSZW5hbWUgc3RhdGUgJWQgdG8gJWQuXG4iLCBmcm9tLCB0byk7Ci0JZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgewotCQlpZiAoeHhfc3RhdGVbaV0uc3NfZGVsZXRlZCkKLQkJCWNvbnRpbnVlOwotCQlmb3IgKGogPSAwOyBqIDwgeHhfc3RhdGVbaV0uc3NfbmFyY3M7IGorKykgewotCQkJaWYgKHh4X3N0YXRlW2ldLnNzX2FyY1tqXS5zYV9hcnJvdyA9PSBmcm9tKQotCQkJCXh4X3N0YXRlW2ldLnNzX2FyY1tqXS5zYV9hcnJvdyA9IHRvOwotCQl9Ci0JfQorICAgIGludCBpLCBqOworCisgICAgaWYgKFB5X0RlYnVnRmxhZykKKyAgICAgICAgcHJpbnRmKCJSZW5hbWUgc3RhdGUgJWQgdG8gJWQuXG4iLCBmcm9tLCB0byk7CisgICAgZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgeworICAgICAgICBpZiAoeHhfc3RhdGVbaV0uc3NfZGVsZXRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgeHhfc3RhdGVbaV0uc3NfbmFyY3M7IGorKykgeworICAgICAgICAgICAgaWYgKHh4X3N0YXRlW2ldLnNzX2FyY1tqXS5zYV9hcnJvdyA9PSBmcm9tKQorICAgICAgICAgICAgICAgIHh4X3N0YXRlW2ldLnNzX2FyY1tqXS5zYV9hcnJvdyA9IHRvOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogc2ltcGxpZnkoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSkKIHsKLQlpbnQgY2hhbmdlczsKLQlpbnQgaSwgajsKLQkKLQlkbyB7Ci0JCWNoYW5nZXMgPSAwOwotCQlmb3IgKGkgPSAxOyBpIDwgeHhfbnN0YXRlczsgaSsrKSB7Ci0JCQlpZiAoeHhfc3RhdGVbaV0uc3NfZGVsZXRlZCkKLQkJCQljb250aW51ZTsKLQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQlpZiAoeHhfc3RhdGVbal0uc3NfZGVsZXRlZCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHNhbWVzdGF0ZSgmeHhfc3RhdGVbaV0sICZ4eF9zdGF0ZVtqXSkpIHsKLQkJCQkJeHhfc3RhdGVbaV0uc3NfZGVsZXRlZCsrOwotCQkJCQlyZW5hbWVzdGF0ZXMoeHhfbnN0YXRlcywgeHhfc3RhdGUsCi0JCQkJCQkgICAgIGksIGopOwotCQkJCQljaGFuZ2VzKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gd2hpbGUgKGNoYW5nZXMpOworICAgIGludCBjaGFuZ2VzOworICAgIGludCBpLCBqOworCisgICAgZG8geworICAgICAgICBjaGFuZ2VzID0gMDsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHh4X25zdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHh4X3N0YXRlW2ldLnNzX2RlbGV0ZWQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHh4X3N0YXRlW2pdLnNzX2RlbGV0ZWQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChzYW1lc3RhdGUoJnh4X3N0YXRlW2ldLCAmeHhfc3RhdGVbal0pKSB7CisgICAgICAgICAgICAgICAgICAgIHh4X3N0YXRlW2ldLnNzX2RlbGV0ZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVuYW1lc3RhdGVzKHh4X25zdGF0ZXMsIHh4X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaik7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAoY2hhbmdlcyk7CiB9CiAKIApAQCAtNTk4LDMyICs1OTgsMzIgQEAKIHN0YXRpYyB2b2lkCiBjb252ZXJ0KGRmYSAqZCwgaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSkKIHsKLQlpbnQgaSwgajsKLQlzc19zdGF0ZSAqeXk7Ci0Jc3NfYXJjICp6ejsKLQkKLQlmb3IgKGkgPSAwOyBpIDwgeHhfbnN0YXRlczsgaSsrKSB7Ci0JCXl5ID0gJnh4X3N0YXRlW2ldOwotCQlpZiAoeXktPnNzX2RlbGV0ZWQpCi0JCQljb250aW51ZTsKLQkJeXktPnNzX3JlbmFtZSA9IGFkZHN0YXRlKGQpOwotCX0KLQkKLQlmb3IgKGkgPSAwOyBpIDwgeHhfbnN0YXRlczsgaSsrKSB7Ci0JCXl5ID0gJnh4X3N0YXRlW2ldOwotCQlpZiAoeXktPnNzX2RlbGV0ZWQpCi0JCQljb250aW51ZTsKLQkJZm9yIChqID0gMDsgaiA8IHl5LT5zc19uYXJjczsgaisrKSB7Ci0JCQl6eiA9ICZ5eS0+c3NfYXJjW2pdOwotCQkJYWRkYXJjKGQsIHl5LT5zc19yZW5hbWUsCi0JCQkJeHhfc3RhdGVbenotPnNhX2Fycm93XS5zc19yZW5hbWUsCi0JCQkJenotPnNhX2xhYmVsKTsKLQkJfQotCQlpZiAoeXktPnNzX2ZpbmlzaCkKLQkJCWFkZGFyYyhkLCB5eS0+c3NfcmVuYW1lLCB5eS0+c3NfcmVuYW1lLCAwKTsKLQl9Ci0JCi0JZC0+ZF9pbml0aWFsID0gMDsKKyAgICBpbnQgaSwgajsKKyAgICBzc19zdGF0ZSAqeXk7CisgICAgc3NfYXJjICp6ejsKKworICAgIGZvciAoaSA9IDA7IGkgPCB4eF9uc3RhdGVzOyBpKyspIHsKKyAgICAgICAgeXkgPSAmeHhfc3RhdGVbaV07CisgICAgICAgIGlmICh5eS0+c3NfZGVsZXRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB5eS0+c3NfcmVuYW1lID0gYWRkc3RhdGUoZCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHh4X25zdGF0ZXM7IGkrKykgeworICAgICAgICB5eSA9ICZ4eF9zdGF0ZVtpXTsKKyAgICAgICAgaWYgKHl5LT5zc19kZWxldGVkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB5eS0+c3NfbmFyY3M7IGorKykgeworICAgICAgICAgICAgenogPSAmeXktPnNzX2FyY1tqXTsKKyAgICAgICAgICAgIGFkZGFyYyhkLCB5eS0+c3NfcmVuYW1lLAorICAgICAgICAgICAgICAgIHh4X3N0YXRlW3p6LT5zYV9hcnJvd10uc3NfcmVuYW1lLAorICAgICAgICAgICAgICAgIHp6LT5zYV9sYWJlbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHl5LT5zc19maW5pc2gpCisgICAgICAgICAgICBhZGRhcmMoZCwgeXktPnNzX3JlbmFtZSwgeXktPnNzX3JlbmFtZSwgMCk7CisgICAgfQorCisgICAgZC0+ZF9pbml0aWFsID0gMDsKIH0KIAogCkBAIC02MzIsNDMgKzYzMiw0MyBAQAogc3RhdGljIGdyYW1tYXIgKgogbWFrZXRhYmxlcyhuZmFncmFtbWFyICpncikKIHsKLQlpbnQgaTsKLQluZmEgKm5mOwotCWRmYSAqZDsKLQlncmFtbWFyICpnOwotCQotCWlmIChnci0+Z3Jfbm5mYXMgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JZyA9IG5ld2dyYW1tYXIoZ3ItPmdyX25mYVswXS0+bmZfdHlwZSk7Ci0JCQkvKiBYWFggZmlyc3QgcnVsZSBtdXN0IGJlIHN0YXJ0IHJ1bGUgKi8KLQlnLT5nX2xsID0gZ3ItPmdyX2xsOwotCQotCWZvciAoaSA9IDA7IGkgPCBnci0+Z3Jfbm5mYXM7IGkrKykgewotCQluZiA9IGdyLT5ncl9uZmFbaV07Ci0JCWlmIChQeV9EZWJ1Z0ZsYWcpIHsKLQkJCXByaW50ZigiRHVtcCBvZiBORkEgZm9yICclcycgLi4uXG4iLCBuZi0+bmZfbmFtZSk7Ci0JCQlkdW1wbmZhKCZnci0+Z3JfbGwsIG5mKTsKLQkJCXByaW50ZigiTWFraW5nIERGQSBmb3IgJyVzJyAuLi5cbiIsIG5mLT5uZl9uYW1lKTsKLQkJfQotCQlkID0gYWRkZGZhKGcsIG5mLT5uZl90eXBlLCBuZi0+bmZfbmFtZSk7Ci0JCW1ha2VkZmEoZ3IsIGdyLT5ncl9uZmFbaV0sIGQpOwotCX0KLQkKLQlyZXR1cm4gZzsKKyAgICBpbnQgaTsKKyAgICBuZmEgKm5mOworICAgIGRmYSAqZDsKKyAgICBncmFtbWFyICpnOworCisgICAgaWYgKGdyLT5ncl9ubmZhcyA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBnID0gbmV3Z3JhbW1hcihnci0+Z3JfbmZhWzBdLT5uZl90eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgLyogWFhYIGZpcnN0IHJ1bGUgbXVzdCBiZSBzdGFydCBydWxlICovCisgICAgZy0+Z19sbCA9IGdyLT5ncl9sbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnci0+Z3Jfbm5mYXM7IGkrKykgeworICAgICAgICBuZiA9IGdyLT5ncl9uZmFbaV07CisgICAgICAgIGlmIChQeV9EZWJ1Z0ZsYWcpIHsKKyAgICAgICAgICAgIHByaW50ZigiRHVtcCBvZiBORkEgZm9yICclcycgLi4uXG4iLCBuZi0+bmZfbmFtZSk7CisgICAgICAgICAgICBkdW1wbmZhKCZnci0+Z3JfbGwsIG5mKTsKKyAgICAgICAgICAgIHByaW50ZigiTWFraW5nIERGQSBmb3IgJyVzJyAuLi5cbiIsIG5mLT5uZl9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBkID0gYWRkZGZhKGcsIG5mLT5uZl90eXBlLCBuZi0+bmZfbmFtZSk7CisgICAgICAgIG1ha2VkZmEoZ3IsIGdyLT5ncl9uZmFbaV0sIGQpOworICAgIH0KKworICAgIHJldHVybiBnOwogfQogCiBncmFtbWFyICoKIHBnZW4obm9kZSAqbikKIHsKLQluZmFncmFtbWFyICpncjsKLQlncmFtbWFyICpnOwotCQotCWdyID0gbWV0YWNvbXBpbGUobik7Ci0JZyA9IG1ha2V0YWJsZXMoZ3IpOwotCXRyYW5zbGF0ZWxhYmVscyhnKTsKLQlhZGRmaXJzdHNldHMoZyk7Ci0JUHlPYmplY3RfRlJFRShncik7Ci0JcmV0dXJuIGc7CisgICAgbmZhZ3JhbW1hciAqZ3I7CisgICAgZ3JhbW1hciAqZzsKKworICAgIGdyID0gbWV0YWNvbXBpbGUobik7CisgICAgZyA9IG1ha2V0YWJsZXMoZ3IpOworICAgIHRyYW5zbGF0ZWxhYmVscyhnKTsKKyAgICBhZGRmaXJzdHNldHMoZyk7CisgICAgUHlPYmplY3RfRlJFRShncik7CisgICAgcmV0dXJuIGc7CiB9CiAKIGdyYW1tYXIgKgpAQCAtNzAyLDcgKzcwMiw3IEBACiAtLS0tLS0tLS0KIAogW0FobyZVbGxtYW4gNzddCi0JQWhvJlVsbG1hbiwgUHJpbmNpcGxlcyBvZiBDb21waWxlciBEZXNpZ24sIEFkZGlzb24tV2VzbGV5IDE5NzcKLQkoZmlyc3QgZWRpdGlvbikKKyAgICBBaG8mVWxsbWFuLCBQcmluY2lwbGVzIG9mIENvbXBpbGVyIERlc2lnbiwgQWRkaXNvbi1XZXNsZXkgMTk3NworICAgIChmaXJzdCBlZGl0aW9uKQogCiAqLwpkaWZmIC0tZ2l0IGEvUGFyc2VyL3BnZW5tYWluLmMgYi9QYXJzZXIvcGdlbm1haW4uYwppbmRleCBmYzI3YTJjLi44OGZhN2YxIDEwMDY0NAotLS0gYS9QYXJzZXIvcGdlbm1haW4uYworKysgYi9QYXJzZXIvcGdlbm1haW4uYwpAQCAtMzAsMTA0ICszMCwxMDQgQEAKIHZvaWQKIFB5X0V4aXQoaW50IHN0cykKIHsKLQlleGl0KHN0cyk7CisgICAgZXhpdChzdHMpOwogfQogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWdyYW1tYXIgKmc7Ci0JRklMRSAqZnA7Ci0JY2hhciAqZmlsZW5hbWUsICpncmFtaW5pdF9oLCAqZ3JhbWluaXRfYzsKLQkKLQlpZiAoYXJnYyAhPSA0KSB7Ci0JCWZwcmludGYoc3RkZXJyLAotCQkJInVzYWdlOiAlcyBncmFtbWFyIGdyYW1pbml0LmggZ3JhbWluaXQuY1xuIiwgYXJndlswXSk7Ci0JCVB5X0V4aXQoMik7Ci0JfQotCWZpbGVuYW1lID0gYXJndlsxXTsKLQlncmFtaW5pdF9oID0gYXJndlsyXTsKLQlncmFtaW5pdF9jID0gYXJndlszXTsKLQlnID0gZ2V0Z3JhbW1hcihmaWxlbmFtZSk7Ci0JZnAgPSBmb3BlbihncmFtaW5pdF9jLCAidyIpOwotCWlmIChmcCA9PSBOVUxMKSB7Ci0JCXBlcnJvcihncmFtaW5pdF9jKTsKLQkJUHlfRXhpdCgxKTsKLQl9Ci0JaWYgKFB5X0RlYnVnRmxhZykKLQkJcHJpbnRmKCJXcml0aW5nICVzIC4uLlxuIiwgZ3JhbWluaXRfYyk7Ci0JcHJpbnRncmFtbWFyKGcsIGZwKTsKLQlmY2xvc2UoZnApOwotCWZwID0gZm9wZW4oZ3JhbWluaXRfaCwgInciKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCQlwZXJyb3IoZ3JhbWluaXRfaCk7Ci0JCVB5X0V4aXQoMSk7Ci0JfQotCWlmIChQeV9EZWJ1Z0ZsYWcpCi0JCXByaW50ZigiV3JpdGluZyAlcyAuLi5cbiIsIGdyYW1pbml0X2gpOwotCXByaW50bm9udGVybWluYWxzKGcsIGZwKTsKLQlmY2xvc2UoZnApOwotCVB5X0V4aXQoMCk7Ci0JcmV0dXJuIDA7IC8qIE1ha2UgZ2NjIC1XYWxsIGhhcHB5ICovCisgICAgZ3JhbW1hciAqZzsKKyAgICBGSUxFICpmcDsKKyAgICBjaGFyICpmaWxlbmFtZSwgKmdyYW1pbml0X2gsICpncmFtaW5pdF9jOworCisgICAgaWYgKGFyZ2MgIT0gNCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJ1c2FnZTogJXMgZ3JhbW1hciBncmFtaW5pdC5oIGdyYW1pbml0LmNcbiIsIGFyZ3ZbMF0pOworICAgICAgICBQeV9FeGl0KDIpOworICAgIH0KKyAgICBmaWxlbmFtZSA9IGFyZ3ZbMV07CisgICAgZ3JhbWluaXRfaCA9IGFyZ3ZbMl07CisgICAgZ3JhbWluaXRfYyA9IGFyZ3ZbM107CisgICAgZyA9IGdldGdyYW1tYXIoZmlsZW5hbWUpOworICAgIGZwID0gZm9wZW4oZ3JhbWluaXRfYywgInciKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZ3JhbWluaXRfYyk7CisgICAgICAgIFB5X0V4aXQoMSk7CisgICAgfQorICAgIGlmIChQeV9EZWJ1Z0ZsYWcpCisgICAgICAgIHByaW50ZigiV3JpdGluZyAlcyAuLi5cbiIsIGdyYW1pbml0X2MpOworICAgIHByaW50Z3JhbW1hcihnLCBmcCk7CisgICAgZmNsb3NlKGZwKTsKKyAgICBmcCA9IGZvcGVuKGdyYW1pbml0X2gsICJ3Iik7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgcGVycm9yKGdyYW1pbml0X2gpOworICAgICAgICBQeV9FeGl0KDEpOworICAgIH0KKyAgICBpZiAoUHlfRGVidWdGbGFnKQorICAgICAgICBwcmludGYoIldyaXRpbmcgJXMgLi4uXG4iLCBncmFtaW5pdF9oKTsKKyAgICBwcmludG5vbnRlcm1pbmFscyhnLCBmcCk7CisgICAgZmNsb3NlKGZwKTsKKyAgICBQeV9FeGl0KDApOworICAgIHJldHVybiAwOyAvKiBNYWtlIGdjYyAtV2FsbCBoYXBweSAqLwogfQogCiBncmFtbWFyICoKIGdldGdyYW1tYXIoY2hhciAqZmlsZW5hbWUpCiB7Ci0JRklMRSAqZnA7Ci0Jbm9kZSAqbjsKLQlncmFtbWFyICpnMCwgKmc7Ci0JcGVycmRldGFpbCBlcnI7Ci0JCi0JZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLQlpZiAoZnAgPT0gTlVMTCkgewotCQlwZXJyb3IoZmlsZW5hbWUpOwotCQlQeV9FeGl0KDEpOwotCX0KLQlnMCA9IG1ldGFfZ3JhbW1hcigpOwotCW4gPSBQeVBhcnNlcl9QYXJzZUZpbGUoZnAsIGZpbGVuYW1lLCBnMCwgZzAtPmdfc3RhcnQsCi0JCSAgICAgIChjaGFyICopTlVMTCwgKGNoYXIgKilOVUxMLCAmZXJyKTsKLQlmY2xvc2UoZnApOwotCWlmIChuID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsICJQYXJzaW5nIGVycm9yICVkLCBsaW5lICVkLlxuIiwKLQkJCWVyci5lcnJvciwgZXJyLmxpbmVubyk7Ci0JCWlmIChlcnIudGV4dCAhPSBOVUxMKSB7Ci0JCQlzaXplX3QgaTsKLQkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBlcnIudGV4dCk7Ci0JCQlpID0gc3RybGVuKGVyci50ZXh0KTsKLQkJCWlmIChpID09IDAgfHwgZXJyLnRleHRbaS0xXSAhPSAnXG4nKQotCQkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBlcnIub2Zmc2V0OyBpKyspIHsKLQkJCQlpZiAoZXJyLnRleHRbaV0gPT0gJ1x0JykKLQkJCQkJcHV0YygnXHQnLCBzdGRlcnIpOwotCQkJCWVsc2UKLQkJCQkJcHV0YygnICcsIHN0ZGVycik7Ci0JCQl9Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIl5cbiIpOwotCQkJUHlPYmplY3RfRlJFRShlcnIudGV4dCk7Ci0JCX0KLQkJUHlfRXhpdCgxKTsKLQl9Ci0JZyA9IHBnZW4obik7Ci0JaWYgKGcgPT0gTlVMTCkgewotCQlwcmludGYoIkJhZCBncmFtbWFyLlxuIik7Ci0JCVB5X0V4aXQoMSk7Ci0JfQotCXJldHVybiBnOworICAgIEZJTEUgKmZwOworICAgIG5vZGUgKm47CisgICAgZ3JhbW1hciAqZzAsICpnOworICAgIHBlcnJkZXRhaWwgZXJyOworCisgICAgZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBwZXJyb3IoZmlsZW5hbWUpOworICAgICAgICBQeV9FeGl0KDEpOworICAgIH0KKyAgICBnMCA9IG1ldGFfZ3JhbW1hcigpOworICAgIG4gPSBQeVBhcnNlcl9QYXJzZUZpbGUoZnAsIGZpbGVuYW1lLCBnMCwgZzAtPmdfc3RhcnQsCisgICAgICAgICAgICAgICAgICAoY2hhciAqKU5VTEwsIChjaGFyICopTlVMTCwgJmVycik7CisgICAgZmNsb3NlKGZwKTsKKyAgICBpZiAobiA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFyc2luZyBlcnJvciAlZCwgbGluZSAlZC5cbiIsCisgICAgICAgICAgICBlcnIuZXJyb3IsIGVyci5saW5lbm8pOworICAgICAgICBpZiAoZXJyLnRleHQgIT0gTlVMTCkgeworICAgICAgICAgICAgc2l6ZV90IGk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgZXJyLnRleHQpOworICAgICAgICAgICAgaSA9IHN0cmxlbihlcnIudGV4dCk7CisgICAgICAgICAgICBpZiAoaSA9PSAwIHx8IGVyci50ZXh0W2ktMV0gIT0gJ1xuJykKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXJyLm9mZnNldDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGVyci50ZXh0W2ldID09ICdcdCcpCisgICAgICAgICAgICAgICAgICAgIHB1dGMoJ1x0Jywgc3RkZXJyKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHB1dGMoJyAnLCBzdGRlcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJeXG4iKTsKKyAgICAgICAgICAgIFB5T2JqZWN0X0ZSRUUoZXJyLnRleHQpOworICAgICAgICB9CisgICAgICAgIFB5X0V4aXQoMSk7CisgICAgfQorICAgIGcgPSBwZ2VuKG4pOworICAgIGlmIChnID09IE5VTEwpIHsKKyAgICAgICAgcHJpbnRmKCJCYWQgZ3JhbW1hci5cbiIpOworICAgICAgICBQeV9FeGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gZzsKIH0KIAogLyogQ2FuJ3QgaGFwcGVuIGluIHBnZW4gKi8KIFB5T2JqZWN0KgogUHlFcnJfT2NjdXJyZWQoKQogewotCXJldHVybiAwOworICAgIHJldHVybiAwOwogfQogCiB2b2lkCiBQeV9GYXRhbEVycm9yKGNvbnN0IGNoYXIgKm1zZykKIHsKLQlmcHJpbnRmKHN0ZGVyciwgInBnZW46IEZBVEFMIEVSUk9SOiAlc1xuIiwgbXNnKTsKLQlQeV9FeGl0KDEpOworICAgIGZwcmludGYoc3RkZXJyLCAicGdlbjogRkFUQUwgRVJST1I6ICVzXG4iLCBtc2cpOworICAgIFB5X0V4aXQoMSk7CiB9CiAKIC8qIE5vLW5vbnNlbnNlIG15X3JlYWRsaW5lKCkgZm9yIHRva2VuaXplci5jICovCkBAIC0xMzUsMjggKzEzNSwyOCBAQAogY2hhciAqCiBQeU9TX1JlYWRsaW5lKEZJTEUgKnN5c19zdGRpbiwgRklMRSAqc3lzX3N0ZG91dCwgY2hhciAqcHJvbXB0KQogewotCXNpemVfdCBuID0gMTAwMDsKLQljaGFyICpwID0gKGNoYXIgKilQeU1lbV9NQUxMT0Mobik7Ci0JY2hhciAqcTsKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgcHJvbXB0KTsKLQlxID0gZmdldHMocCwgbiwgc3lzX3N0ZGluKTsKLQlpZiAocSA9PSBOVUxMKSB7Ci0JCSpwID0gJ1wwJzsKLQkJcmV0dXJuIHA7Ci0JfQotCW4gPSBzdHJsZW4ocCk7Ci0JaWYgKG4gPiAwICYmIHBbbi0xXSAhPSAnXG4nKQotCQlwW24tMV0gPSAnXG4nOwotCXJldHVybiAoY2hhciAqKVB5TWVtX1JFQUxMT0MocCwgbisxKTsKKyAgICBzaXplX3QgbiA9IDEwMDA7CisgICAgY2hhciAqcCA9IChjaGFyICopUHlNZW1fTUFMTE9DKG4pOworICAgIGNoYXIgKnE7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIHByb21wdCk7CisgICAgcSA9IGZnZXRzKHAsIG4sIHN5c19zdGRpbik7CisgICAgaWYgKHEgPT0gTlVMTCkgeworICAgICAgICAqcCA9ICdcMCc7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKyAgICBuID0gc3RybGVuKHApOworICAgIGlmIChuID4gMCAmJiBwW24tMV0gIT0gJ1xuJykKKyAgICAgICAgcFtuLTFdID0gJ1xuJzsKKyAgICByZXR1cm4gKGNoYXIgKilQeU1lbV9SRUFMTE9DKHAsIG4rMSk7CiB9CiAKIC8qIE5vLW5vbnNlbnNlIGZnZXRzICovCiBjaGFyICoKIFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhjaGFyICpidWYsIGludCBuLCBGSUxFICpzdHJlYW0sIFB5T2JqZWN0ICpmb2JqKQogewotCXJldHVybiBmZ2V0cyhidWYsIG4sIHN0cmVhbSk7CisgICAgcmV0dXJuIGZnZXRzKGJ1Ziwgbiwgc3RyZWFtKTsKIH0KIAogCkBAIC0xNjUsOSArMTY1LDkgQEAKIHZvaWQKIFB5U3lzX1dyaXRlU3RkZXJyKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7CisgICAgdmFfbGlzdCB2YTsKIAotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCB2YSk7Ci0JdmFfZW5kKHZhKTsKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CiB9CmRpZmYgLS1naXQgYS9QYXJzZXIvcHJpbnRncmFtbWFyLmMgYi9QYXJzZXIvcHJpbnRncmFtbWFyLmMKaW5kZXggYWUxODBlMS4uM2I1NGEwNSAxMDA2NDQKLS0tIGEvUGFyc2VyL3ByaW50Z3JhbW1hci5jCisrKyBiL1BhcnNlci9wcmludGdyYW1tYXIuYwpAQCAtMTMsMTA1ICsxMywxMDUgQEAKIHZvaWQKIHByaW50Z3JhbW1hcihncmFtbWFyICpnLCBGSUxFICpmcCkKIHsKLQlmcHJpbnRmKGZwLCAiLyogR2VuZXJhdGVkIGJ5IFBhcnNlci9wZ2VuICovXG5cbiIpOwotCWZwcmludGYoZnAsICIjaW5jbHVkZSBcInBnZW5oZWFkZXJzLmhcIlxuIik7Ci0JZnByaW50ZihmcCwgIiNpbmNsdWRlIFwiZ3JhbW1hci5oXCJcbiIpOwotCWZwcmludGYoZnAsICJQeUFQSV9EQVRBKGdyYW1tYXIpIF9QeVBhcnNlcl9HcmFtbWFyO1xuIik7Ci0JcHJpbnRkZmFzKGcsIGZwKTsKLQlwcmludGxhYmVscyhnLCBmcCk7Ci0JZnByaW50ZihmcCwgImdyYW1tYXIgX1B5UGFyc2VyX0dyYW1tYXIgPSB7XG4iKTsKLQlmcHJpbnRmKGZwLCAiXHQlZCxcbiIsIGctPmdfbmRmYXMpOwotCWZwcmludGYoZnAsICJcdGRmYXMsXG4iKTsKLQlmcHJpbnRmKGZwLCAiXHR7JWQsIGxhYmVsc30sXG4iLCBnLT5nX2xsLmxsX25sYWJlbHMpOwotCWZwcmludGYoZnAsICJcdCVkXG4iLCBnLT5nX3N0YXJ0KTsKLQlmcHJpbnRmKGZwLCAifTtcbiIpOworICAgIGZwcmludGYoZnAsICIvKiBHZW5lcmF0ZWQgYnkgUGFyc2VyL3BnZW4gKi9cblxuIik7CisgICAgZnByaW50ZihmcCwgIiNpbmNsdWRlIFwicGdlbmhlYWRlcnMuaFwiXG4iKTsKKyAgICBmcHJpbnRmKGZwLCAiI2luY2x1ZGUgXCJncmFtbWFyLmhcIlxuIik7CisgICAgZnByaW50ZihmcCwgIlB5QVBJX0RBVEEoZ3JhbW1hcikgX1B5UGFyc2VyX0dyYW1tYXI7XG4iKTsKKyAgICBwcmludGRmYXMoZywgZnApOworICAgIHByaW50bGFiZWxzKGcsIGZwKTsKKyAgICBmcHJpbnRmKGZwLCAiZ3JhbW1hciBfUHlQYXJzZXJfR3JhbW1hciA9IHtcbiIpOworICAgIGZwcmludGYoZnAsICJcdCVkLFxuIiwgZy0+Z19uZGZhcyk7CisgICAgZnByaW50ZihmcCwgIlx0ZGZhcyxcbiIpOworICAgIGZwcmludGYoZnAsICJcdHslZCwgbGFiZWxzfSxcbiIsIGctPmdfbGwubGxfbmxhYmVscyk7CisgICAgZnByaW50ZihmcCwgIlx0JWRcbiIsIGctPmdfc3RhcnQpOworICAgIGZwcmludGYoZnAsICJ9O1xuIik7CiB9CiAKIHZvaWQKIHByaW50bm9udGVybWluYWxzKGdyYW1tYXIgKmcsIEZJTEUgKmZwKQogewotCWRmYSAqZDsKLQlpbnQgaTsKLQkKLQlmcHJpbnRmKGZwLCAiLyogR2VuZXJhdGVkIGJ5IFBhcnNlci9wZ2VuICovXG5cbiIpOwotCQotCWQgPSBnLT5nX2RmYTsKLQlmb3IgKGkgPSBnLT5nX25kZmFzOyAtLWkgPj0gMDsgZCsrKQotCQlmcHJpbnRmKGZwLCAiI2RlZmluZSAlcyAlZFxuIiwgZC0+ZF9uYW1lLCBkLT5kX3R5cGUpOworICAgIGRmYSAqZDsKKyAgICBpbnQgaTsKKworICAgIGZwcmludGYoZnAsICIvKiBHZW5lcmF0ZWQgYnkgUGFyc2VyL3BnZW4gKi9cblxuIik7CisKKyAgICBkID0gZy0+Z19kZmE7CisgICAgZm9yIChpID0gZy0+Z19uZGZhczsgLS1pID49IDA7IGQrKykKKyAgICAgICAgZnByaW50ZihmcCwgIiNkZWZpbmUgJXMgJWRcbiIsIGQtPmRfbmFtZSwgZC0+ZF90eXBlKTsKIH0KIAogc3RhdGljIHZvaWQKIHByaW50YXJjcyhpbnQgaSwgZGZhICpkLCBGSUxFICpmcCkKIHsKLQlhcmMgKmE7Ci0Jc3RhdGUgKnM7Ci0JaW50IGosIGs7Ci0JCi0JcyA9IGQtPmRfc3RhdGU7Ci0JZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspIHsKLQkJZnByaW50ZihmcCwgInN0YXRpYyBhcmMgYXJjc18lZF8lZFslZF0gPSB7XG4iLAotCQkJaSwgaiwgcy0+c19uYXJjcyk7Ci0JCWEgPSBzLT5zX2FyYzsKLQkJZm9yIChrID0gMDsgayA8IHMtPnNfbmFyY3M7IGsrKywgYSsrKQotCQkJZnByaW50ZihmcCwgIlx0eyVkLCAlZH0sXG4iLCBhLT5hX2xibCwgYS0+YV9hcnJvdyk7Ci0JCWZwcmludGYoZnAsICJ9O1xuIik7Ci0JfQorICAgIGFyYyAqYTsKKyAgICBzdGF0ZSAqczsKKyAgICBpbnQgaiwgazsKKworICAgIHMgPSBkLT5kX3N0YXRlOworICAgIGZvciAoaiA9IDA7IGogPCBkLT5kX25zdGF0ZXM7IGorKywgcysrKSB7CisgICAgICAgIGZwcmludGYoZnAsICJzdGF0aWMgYXJjIGFyY3NfJWRfJWRbJWRdID0ge1xuIiwKKyAgICAgICAgICAgIGksIGosIHMtPnNfbmFyY3MpOworICAgICAgICBhID0gcy0+c19hcmM7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5zX25hcmNzOyBrKyssIGErKykKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcdHslZCwgJWR9LFxuIiwgYS0+YV9sYmwsIGEtPmFfYXJyb3cpOworICAgICAgICBmcHJpbnRmKGZwLCAifTtcbiIpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHByaW50c3RhdGVzKGdyYW1tYXIgKmcsIEZJTEUgKmZwKQogewotCXN0YXRlICpzOwotCWRmYSAqZDsKLQlpbnQgaSwgajsKLQkKLQlkID0gZy0+Z19kZmE7Ci0JZm9yIChpID0gMDsgaSA8IGctPmdfbmRmYXM7IGkrKywgZCsrKSB7Ci0JCXByaW50YXJjcyhpLCBkLCBmcCk7Ci0JCWZwcmludGYoZnAsICJzdGF0aWMgc3RhdGUgc3RhdGVzXyVkWyVkXSA9IHtcbiIsCi0JCQlpLCBkLT5kX25zdGF0ZXMpOwotCQlzID0gZC0+ZF9zdGF0ZTsKLQkJZm9yIChqID0gMDsgaiA8IGQtPmRfbnN0YXRlczsgaisrLCBzKyspCi0JCQlmcHJpbnRmKGZwLCAiXHR7JWQsIGFyY3NfJWRfJWR9LFxuIiwKLQkJCQlzLT5zX25hcmNzLCBpLCBqKTsKLQkJZnByaW50ZihmcCwgIn07XG4iKTsKLQl9CisgICAgc3RhdGUgKnM7CisgICAgZGZhICpkOworICAgIGludCBpLCBqOworCisgICAgZCA9IGctPmdfZGZhOworICAgIGZvciAoaSA9IDA7IGkgPCBnLT5nX25kZmFzOyBpKyssIGQrKykgeworICAgICAgICBwcmludGFyY3MoaSwgZCwgZnApOworICAgICAgICBmcHJpbnRmKGZwLCAic3RhdGljIHN0YXRlIHN0YXRlc18lZFslZF0gPSB7XG4iLAorICAgICAgICAgICAgaSwgZC0+ZF9uc3RhdGVzKTsKKyAgICAgICAgcyA9IGQtPmRfc3RhdGU7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkLT5kX25zdGF0ZXM7IGorKywgcysrKQorICAgICAgICAgICAgZnByaW50ZihmcCwgIlx0eyVkLCBhcmNzXyVkXyVkfSxcbiIsCisgICAgICAgICAgICAgICAgcy0+c19uYXJjcywgaSwgaik7CisgICAgICAgIGZwcmludGYoZnAsICJ9O1xuIik7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogcHJpbnRkZmFzKGdyYW1tYXIgKmcsIEZJTEUgKmZwKQogewotCWRmYSAqZDsKLQlpbnQgaSwgajsKLQkKLQlwcmludHN0YXRlcyhnLCBmcCk7Ci0JZnByaW50ZihmcCwgInN0YXRpYyBkZmEgZGZhc1slZF0gPSB7XG4iLCBnLT5nX25kZmFzKTsKLQlkID0gZy0+Z19kZmE7Ci0JZm9yIChpID0gMDsgaSA8IGctPmdfbmRmYXM7IGkrKywgZCsrKSB7Ci0JCWZwcmludGYoZnAsICJcdHslZCwgXCIlc1wiLCAlZCwgJWQsIHN0YXRlc18lZCxcbiIsCi0JCQlkLT5kX3R5cGUsIGQtPmRfbmFtZSwgZC0+ZF9pbml0aWFsLCBkLT5kX25zdGF0ZXMsIGkpOwotCQlmcHJpbnRmKGZwLCAiXHQgXCIiKTsKLQkJZm9yIChqID0gMDsgaiA8IE5CWVRFUyhnLT5nX2xsLmxsX25sYWJlbHMpOyBqKyspCi0JCQlmcHJpbnRmKGZwLCAiXFwlMDNvIiwgZC0+ZF9maXJzdFtqXSAmIDB4ZmYpOwotCQlmcHJpbnRmKGZwLCAiXCJ9LFxuIik7Ci0JfQotCWZwcmludGYoZnAsICJ9O1xuIik7CisgICAgZGZhICpkOworICAgIGludCBpLCBqOworCisgICAgcHJpbnRzdGF0ZXMoZywgZnApOworICAgIGZwcmludGYoZnAsICJzdGF0aWMgZGZhIGRmYXNbJWRdID0ge1xuIiwgZy0+Z19uZGZhcyk7CisgICAgZCA9IGctPmdfZGZhOworICAgIGZvciAoaSA9IDA7IGkgPCBnLT5nX25kZmFzOyBpKyssIGQrKykgeworICAgICAgICBmcHJpbnRmKGZwLCAiXHR7JWQsIFwiJXNcIiwgJWQsICVkLCBzdGF0ZXNfJWQsXG4iLAorICAgICAgICAgICAgZC0+ZF90eXBlLCBkLT5kX25hbWUsIGQtPmRfaW5pdGlhbCwgZC0+ZF9uc3RhdGVzLCBpKTsKKyAgICAgICAgZnByaW50ZihmcCwgIlx0IFwiIik7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBOQllURVMoZy0+Z19sbC5sbF9ubGFiZWxzKTsgaisrKQorICAgICAgICAgICAgZnByaW50ZihmcCwgIlxcJTAzbyIsIGQtPmRfZmlyc3Rbal0gJiAweGZmKTsKKyAgICAgICAgZnByaW50ZihmcCwgIlwifSxcbiIpOworICAgIH0KKyAgICBmcHJpbnRmKGZwLCAifTtcbiIpOwogfQogCiBzdGF0aWMgdm9pZAogcHJpbnRsYWJlbHMoZ3JhbW1hciAqZywgRklMRSAqZnApCiB7Ci0JbGFiZWwgKmw7Ci0JaW50IGk7Ci0JCi0JZnByaW50ZihmcCwgInN0YXRpYyBsYWJlbCBsYWJlbHNbJWRdID0ge1xuIiwgZy0+Z19sbC5sbF9ubGFiZWxzKTsKLQlsID0gZy0+Z19sbC5sbF9sYWJlbDsKLQlmb3IgKGkgPSBnLT5nX2xsLmxsX25sYWJlbHM7IC0taSA+PSAwOyBsKyspIHsKLQkJaWYgKGwtPmxiX3N0ciA9PSBOVUxMKQotCQkJZnByaW50ZihmcCwgIlx0eyVkLCAwfSxcbiIsIGwtPmxiX3R5cGUpOwotCQllbHNlCi0JCQlmcHJpbnRmKGZwLCAiXHR7JWQsIFwiJXNcIn0sXG4iLAotCQkJCWwtPmxiX3R5cGUsIGwtPmxiX3N0cik7Ci0JfQotCWZwcmludGYoZnAsICJ9O1xuIik7CisgICAgbGFiZWwgKmw7CisgICAgaW50IGk7CisKKyAgICBmcHJpbnRmKGZwLCAic3RhdGljIGxhYmVsIGxhYmVsc1slZF0gPSB7XG4iLCBnLT5nX2xsLmxsX25sYWJlbHMpOworICAgIGwgPSBnLT5nX2xsLmxsX2xhYmVsOworICAgIGZvciAoaSA9IGctPmdfbGwubGxfbmxhYmVsczsgLS1pID49IDA7IGwrKykgeworICAgICAgICBpZiAobC0+bGJfc3RyID09IE5VTEwpCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiXHR7JWQsIDB9LFxuIiwgbC0+bGJfdHlwZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZwcmludGYoZnAsICJcdHslZCwgXCIlc1wifSxcbiIsCisgICAgICAgICAgICAgICAgbC0+bGJfdHlwZSwgbC0+bGJfc3RyKTsKKyAgICB9CisgICAgZnByaW50ZihmcCwgIn07XG4iKTsKIH0KZGlmZiAtLWdpdCBhL1BhcnNlci90b2tlbml6ZXIuYyBiL1BhcnNlci90b2tlbml6ZXIuYwppbmRleCBiODRhMTU0Li5hMDhmMTgzIDEwMDY0NAotLS0gYS9QYXJzZXIvdG9rZW5pemVyLmMKKysrIGIvUGFyc2VyL3Rva2VuaXplci5jCkBAIC0zNSw2MSArMzUsNjEgQEAKIC8qIFRva2VuIG5hbWVzICovCiAKIGNoYXIgKl9QeVBhcnNlcl9Ub2tlbk5hbWVzW10gPSB7Ci0JIkVORE1BUktFUiIsCi0JIk5BTUUiLAotCSJOVU1CRVIiLAotCSJTVFJJTkciLAotCSJORVdMSU5FIiwKLQkiSU5ERU5UIiwKLQkiREVERU5UIiwKLQkiTFBBUiIsCi0JIlJQQVIiLAotCSJMU1FCIiwKLQkiUlNRQiIsCi0JIkNPTE9OIiwKLQkiQ09NTUEiLAotCSJTRU1JIiwKLQkiUExVUyIsCi0JIk1JTlVTIiwKLQkiU1RBUiIsCi0JIlNMQVNIIiwKLQkiVkJBUiIsCi0JIkFNUEVSIiwKLQkiTEVTUyIsCi0JIkdSRUFURVIiLAotCSJFUVVBTCIsCi0JIkRPVCIsCi0JIlBFUkNFTlQiLAotCSJCQUNLUVVPVEUiLAotCSJMQlJBQ0UiLAotCSJSQlJBQ0UiLAotCSJFUUVRVUFMIiwKLQkiTk9URVFVQUwiLAotCSJMRVNTRVFVQUwiLAotCSJHUkVBVEVSRVFVQUwiLAotCSJUSUxERSIsCi0JIkNJUkNVTUZMRVgiLAotCSJMRUZUU0hJRlQiLAotCSJSSUdIVFNISUZUIiwKLQkiRE9VQkxFU1RBUiIsCi0JIlBMVVNFUVVBTCIsCi0JIk1JTkVRVUFMIiwKLQkiU1RBUkVRVUFMIiwKLQkiU0xBU0hFUVVBTCIsCi0JIlBFUkNFTlRFUVVBTCIsCi0JIkFNUEVSRVFVQUwiLAotCSJWQkFSRVFVQUwiLAotCSJDSVJDVU1GTEVYRVFVQUwiLAotCSJMRUZUU0hJRlRFUVVBTCIsCi0JIlJJR0hUU0hJRlRFUVVBTCIsCi0JIkRPVUJMRVNUQVJFUVVBTCIsCi0JIkRPVUJMRVNMQVNIIiwKLQkiRE9VQkxFU0xBU0hFUVVBTCIsCi0JIkFUIiwKLQkvKiBUaGlzIHRhYmxlIG11c3QgbWF0Y2ggdGhlICNkZWZpbmVzIGluIHRva2VuLmghICovCi0JIk9QIiwKLQkiPEVSUk9SVE9LRU4+IiwKLQkiPE5fVE9LRU5TPiIKKyAgICAiRU5ETUFSS0VSIiwKKyAgICAiTkFNRSIsCisgICAgIk5VTUJFUiIsCisgICAgIlNUUklORyIsCisgICAgIk5FV0xJTkUiLAorICAgICJJTkRFTlQiLAorICAgICJERURFTlQiLAorICAgICJMUEFSIiwKKyAgICAiUlBBUiIsCisgICAgIkxTUUIiLAorICAgICJSU1FCIiwKKyAgICAiQ09MT04iLAorICAgICJDT01NQSIsCisgICAgIlNFTUkiLAorICAgICJQTFVTIiwKKyAgICAiTUlOVVMiLAorICAgICJTVEFSIiwKKyAgICAiU0xBU0giLAorICAgICJWQkFSIiwKKyAgICAiQU1QRVIiLAorICAgICJMRVNTIiwKKyAgICAiR1JFQVRFUiIsCisgICAgIkVRVUFMIiwKKyAgICAiRE9UIiwKKyAgICAiUEVSQ0VOVCIsCisgICAgIkJBQ0tRVU9URSIsCisgICAgIkxCUkFDRSIsCisgICAgIlJCUkFDRSIsCisgICAgIkVRRVFVQUwiLAorICAgICJOT1RFUVVBTCIsCisgICAgIkxFU1NFUVVBTCIsCisgICAgIkdSRUFURVJFUVVBTCIsCisgICAgIlRJTERFIiwKKyAgICAiQ0lSQ1VNRkxFWCIsCisgICAgIkxFRlRTSElGVCIsCisgICAgIlJJR0hUU0hJRlQiLAorICAgICJET1VCTEVTVEFSIiwKKyAgICAiUExVU0VRVUFMIiwKKyAgICAiTUlORVFVQUwiLAorICAgICJTVEFSRVFVQUwiLAorICAgICJTTEFTSEVRVUFMIiwKKyAgICAiUEVSQ0VOVEVRVUFMIiwKKyAgICAiQU1QRVJFUVVBTCIsCisgICAgIlZCQVJFUVVBTCIsCisgICAgIkNJUkNVTUZMRVhFUVVBTCIsCisgICAgIkxFRlRTSElGVEVRVUFMIiwKKyAgICAiUklHSFRTSElGVEVRVUFMIiwKKyAgICAiRE9VQkxFU1RBUkVRVUFMIiwKKyAgICAiRE9VQkxFU0xBU0giLAorICAgICJET1VCTEVTTEFTSEVRVUFMIiwKKyAgICAiQVQiLAorICAgIC8qIFRoaXMgdGFibGUgbXVzdCBtYXRjaCB0aGUgI2RlZmluZXMgaW4gdG9rZW4uaCEgKi8KKyAgICAiT1AiLAorICAgICI8RVJST1JUT0tFTj4iLAorICAgICI8Tl9UT0tFTlM+IgogfTsKIAogCkBAIC05OCwzNiArOTgsMzYgQEAKIHN0YXRpYyBzdHJ1Y3QgdG9rX3N0YXRlICoKIHRva19uZXcodm9pZCkKIHsKLQlzdHJ1Y3QgdG9rX3N0YXRlICp0b2sgPSAoc3RydWN0IHRva19zdGF0ZSAqKVB5TWVtX01BTExPQygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgdG9rX3N0YXRlKSk7Ci0JaWYgKHRvayA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl0b2stPmJ1ZiA9IHRvay0+Y3VyID0gdG9rLT5lbmQgPSB0b2stPmlucCA9IHRvay0+c3RhcnQgPSBOVUxMOwotCXRvay0+ZG9uZSA9IEVfT0s7Ci0JdG9rLT5mcCA9IE5VTEw7Ci0JdG9rLT50YWJzaXplID0gVEFCU0laRTsKLQl0b2stPmluZGVudCA9IDA7Ci0JdG9rLT5pbmRzdGFja1swXSA9IDA7Ci0JdG9rLT5hdGJvbCA9IDE7Ci0JdG9rLT5wZW5kaW4gPSAwOwotCXRvay0+cHJvbXB0ID0gdG9rLT5uZXh0cHJvbXB0ID0gTlVMTDsKLQl0b2stPmxpbmVubyA9IDA7Ci0JdG9rLT5sZXZlbCA9IDA7Ci0JdG9rLT5maWxlbmFtZSA9IE5VTEw7Ci0JdG9rLT5hbHR3YXJuaW5nID0gMDsKLQl0b2stPmFsdGVycm9yID0gMDsKLQl0b2stPmFsdHRhYnNpemUgPSAxOwotCXRvay0+YWx0aW5kc3RhY2tbMF0gPSAwOwotCXRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAwOwotCXRvay0+ZGVjb2RpbmdfZXJyZWQgPSAwOwotCXRvay0+cmVhZF9jb2Rpbmdfc3BlYyA9IDA7Ci0JdG9rLT5lbmNvZGluZyA9IE5VTEw7Ci0gICAgICAgIHRvay0+Y29udF9saW5lID0gMDsKKyAgICBzdHJ1Y3QgdG9rX3N0YXRlICp0b2sgPSAoc3RydWN0IHRva19zdGF0ZSAqKVB5TWVtX01BTExPQygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB0b2tfc3RhdGUpKTsKKyAgICBpZiAodG9rID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRvay0+YnVmID0gdG9rLT5jdXIgPSB0b2stPmVuZCA9IHRvay0+aW5wID0gdG9rLT5zdGFydCA9IE5VTEw7CisgICAgdG9rLT5kb25lID0gRV9PSzsKKyAgICB0b2stPmZwID0gTlVMTDsKKyAgICB0b2stPnRhYnNpemUgPSBUQUJTSVpFOworICAgIHRvay0+aW5kZW50ID0gMDsKKyAgICB0b2stPmluZHN0YWNrWzBdID0gMDsKKyAgICB0b2stPmF0Ym9sID0gMTsKKyAgICB0b2stPnBlbmRpbiA9IDA7CisgICAgdG9rLT5wcm9tcHQgPSB0b2stPm5leHRwcm9tcHQgPSBOVUxMOworICAgIHRvay0+bGluZW5vID0gMDsKKyAgICB0b2stPmxldmVsID0gMDsKKyAgICB0b2stPmZpbGVuYW1lID0gTlVMTDsKKyAgICB0b2stPmFsdHdhcm5pbmcgPSAwOworICAgIHRvay0+YWx0ZXJyb3IgPSAwOworICAgIHRvay0+YWx0dGFic2l6ZSA9IDE7CisgICAgdG9rLT5hbHRpbmRzdGFja1swXSA9IDA7CisgICAgdG9rLT5kZWNvZGluZ19zdGF0ZSA9IDA7CisgICAgdG9rLT5kZWNvZGluZ19lcnJlZCA9IDA7CisgICAgdG9rLT5yZWFkX2NvZGluZ19zcGVjID0gMDsKKyAgICB0b2stPmVuY29kaW5nID0gTlVMTDsKKyAgICB0b2stPmNvbnRfbGluZSA9IDA7CiAjaWZuZGVmIFBHRU4KLQl0b2stPmRlY29kaW5nX3JlYWRsaW5lID0gTlVMTDsKLQl0b2stPmRlY29kaW5nX2J1ZmZlciA9IE5VTEw7CisgICAgdG9rLT5kZWNvZGluZ19yZWFkbGluZSA9IE5VTEw7CisgICAgdG9rLT5kZWNvZGluZ19idWZmZXIgPSBOVUxMOwogI2VuZGlmCi0JcmV0dXJuIHRvazsKKyAgICByZXR1cm4gdG9rOwogfQogCiAjaWZkZWYgUEdFTgpAQCAtMTM1LDE5ICsxMzUsMTkgQEAKIHN0YXRpYyBjaGFyICoKIGRlY29kaW5nX2ZnZXRzKGNoYXIgKnMsIGludCBzaXplLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JcmV0dXJuIGZnZXRzKHMsIHNpemUsIHRvay0+ZnApOworICAgIHJldHVybiBmZ2V0cyhzLCBzaXplLCB0b2stPmZwKTsKIH0KIAogc3RhdGljIGludAogZGVjb2RpbmdfZmVvZihzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JcmV0dXJuIGZlb2YodG9rLT5mcCk7CisgICAgcmV0dXJuIGZlb2YodG9rLT5mcCk7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICoKIGRlY29kZV9zdHIoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JcmV0dXJuIHN0cjsKKyAgICByZXR1cm4gc3RyOwogfQogCiAjZWxzZSAvKiBQR0VOICovCkBAIC0xNTUsNDUgKzE1NSw0NSBAQAogc3RhdGljIGNoYXIgKgogZXJyb3JfcmV0KHN0cnVjdCB0b2tfc3RhdGUgKnRvaykgLyogWFhYICovCiB7Ci0JdG9rLT5kZWNvZGluZ19lcnJlZCA9IDE7Ci0JaWYgKHRvay0+ZnAgIT0gTlVMTCAmJiB0b2stPmJ1ZiAhPSBOVUxMKSAvKiBzZWUgUHlUb2tlbml6ZXJfRnJlZSAqLwotCQlQeU1lbV9GUkVFKHRvay0+YnVmKTsKLQl0b2stPmJ1ZiA9IE5VTEw7Ci0JcmV0dXJuIE5VTEw7CQkvKiBhcyBpZiBpdCB3ZXJlIEVPRiAqLworICAgIHRvay0+ZGVjb2RpbmdfZXJyZWQgPSAxOworICAgIGlmICh0b2stPmZwICE9IE5VTEwgJiYgdG9rLT5idWYgIT0gTlVMTCkgLyogc2VlIFB5VG9rZW5pemVyX0ZyZWUgKi8KKyAgICAgICAgUHlNZW1fRlJFRSh0b2stPmJ1Zik7CisgICAgdG9rLT5idWYgPSBOVUxMOworICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAvKiBhcyBpZiBpdCB3ZXJlIEVPRiAqLwogfQogCiBzdGF0aWMgY2hhciAqCiBuZXdfc3RyaW5nKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewotCWNoYXIqIHJlc3VsdCA9IChjaGFyICopUHlNZW1fTUFMTE9DKGxlbiArIDEpOwotCWlmIChyZXN1bHQgIT0gTlVMTCkgewotCQltZW1jcHkocmVzdWx0LCBzLCBsZW4pOwotCQlyZXN1bHRbbGVuXSA9ICdcMCc7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgY2hhciogcmVzdWx0ID0gKGNoYXIgKilQeU1lbV9NQUxMT0MobGVuICsgMSk7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweShyZXN1bHQsIHMsIGxlbik7CisgICAgICAgIHJlc3VsdFtsZW5dID0gJ1wwJzsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIGNoYXIgKgotZ2V0X25vcm1hbF9uYW1lKGNoYXIgKnMpCS8qIGZvciB1dGYtOCBhbmQgbGF0aW4tMSAqLworZ2V0X25vcm1hbF9uYW1lKGNoYXIgKnMpICAgICAgICAvKiBmb3IgdXRmLTggYW5kIGxhdGluLTEgKi8KIHsKLQljaGFyIGJ1ZlsxM107Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKLQkJaW50IGMgPSBzW2ldOwotCQlpZiAoYyA9PSAnXDAnKSBicmVhazsKLQkJZWxzZSBpZiAoYyA9PSAnXycpIGJ1ZltpXSA9ICctJzsKLQkJZWxzZSBidWZbaV0gPSB0b2xvd2VyKGMpOwotCX0KLQlidWZbaV0gPSAnXDAnOwotCWlmIChzdHJjbXAoYnVmLCAidXRmLTgiKSA9PSAwIHx8Ci0JICAgIHN0cm5jbXAoYnVmLCAidXRmLTgtIiwgNikgPT0gMCkgcmV0dXJuICJ1dGYtOCI7Ci0JZWxzZSBpZiAoc3RyY21wKGJ1ZiwgImxhdGluLTEiKSA9PSAwIHx8Ci0JCSBzdHJjbXAoYnVmLCAiaXNvLTg4NTktMSIpID09IDAgfHwKLQkJIHN0cmNtcChidWYsICJpc28tbGF0aW4tMSIpID09IDAgfHwKLQkJIHN0cm5jbXAoYnVmLCAibGF0aW4tMS0iLCA4KSA9PSAwIHx8Ci0JCSBzdHJuY21wKGJ1ZiwgImlzby04ODU5LTEtIiwgMTEpID09IDAgfHwKLQkJIHN0cm5jbXAoYnVmLCAiaXNvLWxhdGluLTEtIiwgMTIpID09IDApIHJldHVybiAiaXNvLTg4NTktMSI7Ci0JZWxzZSByZXR1cm4gczsKKyAgICBjaGFyIGJ1ZlsxM107CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKyAgICAgICAgaW50IGMgPSBzW2ldOworICAgICAgICBpZiAoYyA9PSAnXDAnKSBicmVhazsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnXycpIGJ1ZltpXSA9ICctJzsKKyAgICAgICAgZWxzZSBidWZbaV0gPSB0b2xvd2VyKGMpOworICAgIH0KKyAgICBidWZbaV0gPSAnXDAnOworICAgIGlmIChzdHJjbXAoYnVmLCAidXRmLTgiKSA9PSAwIHx8CisgICAgICAgIHN0cm5jbXAoYnVmLCAidXRmLTgtIiwgNikgPT0gMCkgcmV0dXJuICJ1dGYtOCI7CisgICAgZWxzZSBpZiAoc3RyY21wKGJ1ZiwgImxhdGluLTEiKSA9PSAwIHx8CisgICAgICAgICAgICAgc3RyY21wKGJ1ZiwgImlzby04ODU5LTEiKSA9PSAwIHx8CisgICAgICAgICAgICAgc3RyY21wKGJ1ZiwgImlzby1sYXRpbi0xIikgPT0gMCB8fAorICAgICAgICAgICAgIHN0cm5jbXAoYnVmLCAibGF0aW4tMS0iLCA4KSA9PSAwIHx8CisgICAgICAgICAgICAgc3RybmNtcChidWYsICJpc28tODg1OS0xLSIsIDExKSA9PSAwIHx8CisgICAgICAgICAgICAgc3RybmNtcChidWYsICJpc28tbGF0aW4tMS0iLCAxMikgPT0gMCkgcmV0dXJuICJpc28tODg1OS0xIjsKKyAgICBlbHNlIHJldHVybiBzOwogfQogCiAvKiBSZXR1cm4gdGhlIGNvZGluZyBzcGVjIGluIFMsIG9yIE5VTEwgaWYgbm9uZSBpcyBmb3VuZC4gICovCkBAIC0yMDEsNDMgKzIwMSw0MyBAQAogc3RhdGljIGNoYXIgKgogZ2V0X2NvZGluZ19zcGVjKGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLQlQeV9zc2l6ZV90IGk7Ci0JLyogQ29kaW5nIHNwZWMgbXVzdCBiZSBpbiBhIGNvbW1lbnQsIGFuZCB0aGF0IGNvbW1lbnQgbXVzdCBiZQotICAgICAgICAgKiB0aGUgb25seSBzdGF0ZW1lbnQgb24gdGhlIHNvdXJjZSBjb2RlIGxpbmUuICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplIC0gNjsgaSsrKSB7Ci0JCWlmIChzW2ldID09ICcjJykKLQkJCWJyZWFrOwotCQlpZiAoc1tpXSAhPSAnICcgJiYgc1tpXSAhPSAnXHQnICYmIHNbaV0gIT0gJ1wwMTQnKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAoOyBpIDwgc2l6ZSAtIDY7IGkrKykgeyAvKiBYWFggaW5lZmZpY2llbnQgc2VhcmNoICovCi0JCWNvbnN0IGNoYXIqIHQgPSBzICsgaTsKLQkJaWYgKHN0cm5jbXAodCwgImNvZGluZyIsIDYpID09IDApIHsKLQkJCWNvbnN0IGNoYXIqIGJlZ2luID0gTlVMTDsKLQkJCXQgKz0gNjsKLQkJCWlmICh0WzBdICE9ICc6JyAmJiB0WzBdICE9ICc9JykKLQkJCQljb250aW51ZTsKLQkJCWRvIHsKLQkJCQl0Kys7Ci0JCQl9IHdoaWxlICh0WzBdID09ICdceDIwJyB8fCB0WzBdID09ICdcdCcpOworICAgIFB5X3NzaXplX3QgaTsKKyAgICAvKiBDb2Rpbmcgc3BlYyBtdXN0IGJlIGluIGEgY29tbWVudCwgYW5kIHRoYXQgY29tbWVudCBtdXN0IGJlCisgICAgICogdGhlIG9ubHkgc3RhdGVtZW50IG9uIHRoZSBzb3VyY2UgY29kZSBsaW5lLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplIC0gNjsgaSsrKSB7CisgICAgICAgIGlmIChzW2ldID09ICcjJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoc1tpXSAhPSAnICcgJiYgc1tpXSAhPSAnXHQnICYmIHNbaV0gIT0gJ1wwMTQnKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoOyBpIDwgc2l6ZSAtIDY7IGkrKykgeyAvKiBYWFggaW5lZmZpY2llbnQgc2VhcmNoICovCisgICAgICAgIGNvbnN0IGNoYXIqIHQgPSBzICsgaTsKKyAgICAgICAgaWYgKHN0cm5jbXAodCwgImNvZGluZyIsIDYpID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGJlZ2luID0gTlVMTDsKKyAgICAgICAgICAgIHQgKz0gNjsKKyAgICAgICAgICAgIGlmICh0WzBdICE9ICc6JyAmJiB0WzBdICE9ICc9JykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB0Kys7CisgICAgICAgICAgICB9IHdoaWxlICh0WzBdID09ICdceDIwJyB8fCB0WzBdID09ICdcdCcpOwogCi0JCQliZWdpbiA9IHQ7Ci0JCQl3aGlsZSAoaXNhbG51bShQeV9DSEFSTUFTSyh0WzBdKSkgfHwKLQkJCSAgICAgICB0WzBdID09ICctJyB8fCB0WzBdID09ICdfJyB8fCB0WzBdID09ICcuJykKLQkJCQl0Kys7CisgICAgICAgICAgICBiZWdpbiA9IHQ7CisgICAgICAgICAgICB3aGlsZSAoaXNhbG51bShQeV9DSEFSTUFTSyh0WzBdKSkgfHwKKyAgICAgICAgICAgICAgICAgICB0WzBdID09ICctJyB8fCB0WzBdID09ICdfJyB8fCB0WzBdID09ICcuJykKKyAgICAgICAgICAgICAgICB0Kys7CiAKLQkJCWlmIChiZWdpbiA8IHQpIHsKLQkJCQljaGFyKiByID0gbmV3X3N0cmluZyhiZWdpbiwgdCAtIGJlZ2luKTsKLQkJCQljaGFyKiBxID0gZ2V0X25vcm1hbF9uYW1lKHIpOwotCQkJCWlmIChyICE9IHEpIHsKLQkJCQkJUHlNZW1fRlJFRShyKTsKLQkJCQkJciA9IG5ld19zdHJpbmcocSwgc3RybGVuKHEpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHI7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBpZiAoYmVnaW4gPCB0KSB7CisgICAgICAgICAgICAgICAgY2hhciogciA9IG5ld19zdHJpbmcoYmVnaW4sIHQgLSBiZWdpbik7CisgICAgICAgICAgICAgICAgY2hhciogcSA9IGdldF9ub3JtYWxfbmFtZShyKTsKKyAgICAgICAgICAgICAgICBpZiAociAhPSBxKSB7CisgICAgICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUocik7CisgICAgICAgICAgICAgICAgICAgIHIgPSBuZXdfc3RyaW5nKHEsIHN0cmxlbihxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBDaGVjayB3aGV0aGVyIHRoZSBsaW5lIGNvbnRhaW5zIGEgY29kaW5nIHNwZWMuIElmIGl0IGRvZXMsCkBAIC0yNDcsNTEgKzI0Nyw1MSBAQAogCiBzdGF0aWMgaW50CiBjaGVja19jb2Rpbmdfc3BlYyhjb25zdCBjaGFyKiBsaW5lLCBQeV9zc2l6ZV90IHNpemUsIHN0cnVjdCB0b2tfc3RhdGUgKnRvaywKLQkJICBpbnQgc2V0X3JlYWRsaW5lKHN0cnVjdCB0b2tfc3RhdGUgKiwgY29uc3QgY2hhciAqKSkKKyAgICAgICAgICAgICAgICAgIGludCBzZXRfcmVhZGxpbmUoc3RydWN0IHRva19zdGF0ZSAqLCBjb25zdCBjaGFyICopKQogewotCWNoYXIgKiBjczsKLQlpbnQgciA9IDE7CisgICAgY2hhciAqIGNzOworICAgIGludCByID0gMTsKIAotICAgICAgICBpZiAodG9rLT5jb250X2xpbmUpCi0JCS8qIEl0J3MgYSBjb250aW51YXRpb24gbGluZSwgc28gaXQgY2FuJ3QgYmUgYSBjb2Rpbmcgc3BlYy4gKi8KLQkJcmV0dXJuIDE7Ci0JY3MgPSBnZXRfY29kaW5nX3NwZWMobGluZSwgc2l6ZSk7Ci0JaWYgKGNzICE9IE5VTEwpIHsKLQkJdG9rLT5yZWFkX2NvZGluZ19zcGVjID0gMTsKLQkJaWYgKHRvay0+ZW5jb2RpbmcgPT0gTlVMTCkgewotCQkJYXNzZXJ0KHRvay0+ZGVjb2Rpbmdfc3RhdGUgPT0gMSk7IC8qIHJhdyAqLwotCQkJaWYgKHN0cmNtcChjcywgInV0Zi04IikgPT0gMCB8fAotCQkJICAgIHN0cmNtcChjcywgImlzby04ODU5LTEiKSA9PSAwKSB7Ci0JCQkJdG9rLT5lbmNvZGluZyA9IGNzOwotCQkJfSBlbHNlIHsKKyAgICBpZiAodG9rLT5jb250X2xpbmUpCisgICAgICAgIC8qIEl0J3MgYSBjb250aW51YXRpb24gbGluZSwgc28gaXQgY2FuJ3QgYmUgYSBjb2Rpbmcgc3BlYy4gKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgY3MgPSBnZXRfY29kaW5nX3NwZWMobGluZSwgc2l6ZSk7CisgICAgaWYgKGNzICE9IE5VTEwpIHsKKyAgICAgICAgdG9rLT5yZWFkX2NvZGluZ19zcGVjID0gMTsKKyAgICAgICAgaWYgKHRvay0+ZW5jb2RpbmcgPT0gTlVMTCkgeworICAgICAgICAgICAgYXNzZXJ0KHRvay0+ZGVjb2Rpbmdfc3RhdGUgPT0gMSk7IC8qIHJhdyAqLworICAgICAgICAgICAgaWYgKHN0cmNtcChjcywgInV0Zi04IikgPT0gMCB8fAorICAgICAgICAgICAgICAgIHN0cmNtcChjcywgImlzby04ODU5LTEiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdG9rLT5lbmNvZGluZyA9IGNzOworICAgICAgICAgICAgfSBlbHNlIHsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQkJciA9IHNldF9yZWFkbGluZSh0b2ssIGNzKTsKLQkJCQlpZiAocikgewotCQkJCQl0b2stPmVuY29kaW5nID0gY3M7Ci0JCQkJCXRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAtMTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlQeU1lbV9GUkVFKGNzKTsKKyAgICAgICAgICAgICAgICByID0gc2V0X3JlYWRsaW5lKHRvaywgY3MpOworICAgICAgICAgICAgICAgIGlmIChyKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZW5jb2RpbmcgPSBjczsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kZWNvZGluZ19zdGF0ZSA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUoY3MpOwogI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2l0aG91dCBVbmljb2RlIHN1cHBvcnQsIHdlIGNhbm5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIHRoZSBjb2Rpbmcgc3BlYy4gU2luY2UgdGhlcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29uJ3QgYmUgYW55IFVuaWNvZGUgbGl0ZXJhbHMsIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29uJ3QgbWF0dGVyLiAqLwotCQkJCVB5TWVtX0ZSRUUoY3MpOworICAgICAgICAgICAgICAgIC8qIFdpdGhvdXQgVW5pY29kZSBzdXBwb3J0LCB3ZSBjYW5ub3QKKyAgICAgICAgICAgICAgICAgICBwcm9jZXNzIHRoZSBjb2Rpbmcgc3BlYy4gU2luY2UgdGhlcmUKKyAgICAgICAgICAgICAgICAgICB3b24ndCBiZSBhbnkgVW5pY29kZSBsaXRlcmFscywgdGhhdAorICAgICAgICAgICAgICAgICAgIHdvbid0IG1hdHRlci4gKi8KKyAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKGNzKTsKICNlbmRpZgotCQkJfQotCQl9IGVsc2UgewkvKiB0aGVuLCBjb21wYXJlIGNzIHdpdGggQk9NICovCi0JCQlyID0gKHN0cmNtcCh0b2stPmVuY29kaW5nLCBjcykgPT0gMCk7Ci0JCQlQeU1lbV9GUkVFKGNzKTsKLQkJfQotCX0KLQlpZiAoIXIpIHsKLQkJY3MgPSB0b2stPmVuY29kaW5nOwotCQlpZiAoIWNzKQotCQkJY3MgPSAid2l0aCBCT00iOwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsICJlbmNvZGluZyBwcm9ibGVtOiAlcyIsIGNzKTsKLQl9Ci0JcmV0dXJuIHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIHRoZW4sIGNvbXBhcmUgY3Mgd2l0aCBCT00gKi8KKyAgICAgICAgICAgIHIgPSAoc3RyY21wKHRvay0+ZW5jb2RpbmcsIGNzKSA9PSAwKTsKKyAgICAgICAgICAgIFB5TWVtX0ZSRUUoY3MpOworICAgICAgICB9CisgICAgfQorICAgIGlmICghcikgeworICAgICAgICBjcyA9IHRvay0+ZW5jb2Rpbmc7CisgICAgICAgIGlmICghY3MpCisgICAgICAgICAgICBjcyA9ICJ3aXRoIEJPTSI7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwgImVuY29kaW5nIHByb2JsZW06ICVzIiwgY3MpOworICAgIH0KKyAgICByZXR1cm4gcjsKIH0KIAogLyogU2VlIHdoZXRoZXIgdGhlIGZpbGUgc3RhcnRzIHdpdGggYSBCT00uIElmIGl0IGRvZXMsCkBAIC0zMDAsNjEgKzMwMCw2MSBAQAogCiBzdGF0aWMgaW50CiBjaGVja19ib20oaW50IGdldF9jaGFyKHN0cnVjdCB0b2tfc3RhdGUgKiksCi0JICB2b2lkIHVuZ2V0X2NoYXIoaW50LCBzdHJ1Y3QgdG9rX3N0YXRlICopLAotCSAgaW50IHNldF9yZWFkbGluZShzdHJ1Y3QgdG9rX3N0YXRlICosIGNvbnN0IGNoYXIgKiksCi0JICBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCisgICAgICAgICAgdm9pZCB1bmdldF9jaGFyKGludCwgc3RydWN0IHRva19zdGF0ZSAqKSwKKyAgICAgICAgICBpbnQgc2V0X3JlYWRsaW5lKHN0cnVjdCB0b2tfc3RhdGUgKiwgY29uc3QgY2hhciAqKSwKKyAgICAgICAgICBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7Ci0JaW50IGNoMSwgY2gyLCBjaDM7Ci0JY2gxID0gZ2V0X2NoYXIodG9rKTsKLQl0b2stPmRlY29kaW5nX3N0YXRlID0gMTsKLQlpZiAoY2gxID09IEVPRikgewotCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKGNoMSA9PSAweEVGKSB7Ci0JCWNoMiA9IGdldF9jaGFyKHRvayk7Ci0JCWlmIChjaDIgIT0gMHhCQikgewotCQkJdW5nZXRfY2hhcihjaDIsIHRvayk7Ci0JCQl1bmdldF9jaGFyKGNoMSwgdG9rKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCWNoMyA9IGdldF9jaGFyKHRvayk7Ci0JCWlmIChjaDMgIT0gMHhCRikgewotCQkJdW5nZXRfY2hhcihjaDMsIHRvayk7Ci0JCQl1bmdldF9jaGFyKGNoMiwgdG9rKTsKLQkJCXVuZ2V0X2NoYXIoY2gxLCB0b2spOwotCQkJcmV0dXJuIDE7Ci0JCX0KKyAgICBpbnQgY2gxLCBjaDIsIGNoMzsKKyAgICBjaDEgPSBnZXRfY2hhcih0b2spOworICAgIHRvay0+ZGVjb2Rpbmdfc3RhdGUgPSAxOworICAgIGlmIChjaDEgPT0gRU9GKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSBpZiAoY2gxID09IDB4RUYpIHsKKyAgICAgICAgY2gyID0gZ2V0X2NoYXIodG9rKTsKKyAgICAgICAgaWYgKGNoMiAhPSAweEJCKSB7CisgICAgICAgICAgICB1bmdldF9jaGFyKGNoMiwgdG9rKTsKKyAgICAgICAgICAgIHVuZ2V0X2NoYXIoY2gxLCB0b2spOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgY2gzID0gZ2V0X2NoYXIodG9rKTsKKyAgICAgICAgaWYgKGNoMyAhPSAweEJGKSB7CisgICAgICAgICAgICB1bmdldF9jaGFyKGNoMywgdG9rKTsKKyAgICAgICAgICAgIHVuZ2V0X2NoYXIoY2gyLCB0b2spOworICAgICAgICAgICAgdW5nZXRfY2hhcihjaDEsIHRvayk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQogI2lmIDAKLQkvKiBEaXNhYmxlIHN1cHBvcnQgZm9yIFVURi0xNiBCT01zIHVudGlsIGEgZGVjaXNpb24KLQkgICBpcyBtYWRlIHdoZXRoZXIgdGhpcyBuZWVkcyB0byBiZSBzdXBwb3J0ZWQuICAqLwotCX0gZWxzZSBpZiAoY2gxID09IDB4RkUpIHsKLQkJY2gyID0gZ2V0X2NoYXIodG9rKTsKLQkJaWYgKGNoMiAhPSAweEZGKSB7Ci0JCQl1bmdldF9jaGFyKGNoMiwgdG9rKTsKLQkJCXVuZ2V0X2NoYXIoY2gxLCB0b2spOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJaWYgKCFzZXRfcmVhZGxpbmUodG9rLCAidXRmLTE2LWJlIikpCi0JCQlyZXR1cm4gMDsKLQkJdG9rLT5kZWNvZGluZ19zdGF0ZSA9IC0xOwotCX0gZWxzZSBpZiAoY2gxID09IDB4RkYpIHsKLQkJY2gyID0gZ2V0X2NoYXIodG9rKTsKLQkJaWYgKGNoMiAhPSAweEZFKSB7Ci0JCQl1bmdldF9jaGFyKGNoMiwgdG9rKTsKLQkJCXVuZ2V0X2NoYXIoY2gxLCB0b2spOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJaWYgKCFzZXRfcmVhZGxpbmUodG9rLCAidXRmLTE2LWxlIikpCi0JCQlyZXR1cm4gMDsKLQkJdG9rLT5kZWNvZGluZ19zdGF0ZSA9IC0xOworICAgIC8qIERpc2FibGUgc3VwcG9ydCBmb3IgVVRGLTE2IEJPTXMgdW50aWwgYSBkZWNpc2lvbgorICAgICAgIGlzIG1hZGUgd2hldGhlciB0aGlzIG5lZWRzIHRvIGJlIHN1cHBvcnRlZC4gICovCisgICAgfSBlbHNlIGlmIChjaDEgPT0gMHhGRSkgeworICAgICAgICBjaDIgPSBnZXRfY2hhcih0b2spOworICAgICAgICBpZiAoY2gyICE9IDB4RkYpIHsKKyAgICAgICAgICAgIHVuZ2V0X2NoYXIoY2gyLCB0b2spOworICAgICAgICAgICAgdW5nZXRfY2hhcihjaDEsIHRvayk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldF9yZWFkbGluZSh0b2ssICJ1dGYtMTYtYmUiKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB0b2stPmRlY29kaW5nX3N0YXRlID0gLTE7CisgICAgfSBlbHNlIGlmIChjaDEgPT0gMHhGRikgeworICAgICAgICBjaDIgPSBnZXRfY2hhcih0b2spOworICAgICAgICBpZiAoY2gyICE9IDB4RkUpIHsKKyAgICAgICAgICAgIHVuZ2V0X2NoYXIoY2gyLCB0b2spOworICAgICAgICAgICAgdW5nZXRfY2hhcihjaDEsIHRvayk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNldF9yZWFkbGluZSh0b2ssICJ1dGYtMTYtbGUiKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB0b2stPmRlY29kaW5nX3N0YXRlID0gLTE7CiAjZW5kaWYKLQl9IGVsc2UgewotCQl1bmdldF9jaGFyKGNoMSwgdG9rKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpCi0JCVB5TWVtX0ZSRUUodG9rLT5lbmNvZGluZyk7Ci0JdG9rLT5lbmNvZGluZyA9IG5ld19zdHJpbmcoInV0Zi04IiwgNSk7CS8qIHJlc3VsdGluZyBpcyBpbiB1dGYtOCAqLwotCXJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHVuZ2V0X2NoYXIoY2gxLCB0b2spOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKHRvay0+ZW5jb2RpbmcgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRlJFRSh0b2stPmVuY29kaW5nKTsKKyAgICB0b2stPmVuY29kaW5nID0gbmV3X3N0cmluZygidXRmLTgiLCA1KTsgICAgIC8qIHJlc3VsdGluZyBpcyBpbiB1dGYtOCAqLworICAgIHJldHVybiAxOwogfQogCiAvKiBSZWFkIGEgbGluZSBvZiB0ZXh0IGZyb20gVE9LIGludG8gUywgdXNpbmcgdGhlIHN0cmVhbSBpbiBUT0suCkBAIC0zNjMsNjIgKzM2Myw2MiBAQAogICAgT24gZW50cnksIHRvay0+ZGVjb2RpbmdfYnVmZmVyIHdpbGwgYmUgb25lIG9mOgogICAgICAxKSBOVUxMOiBuZWVkIHRvIGNhbGwgdG9rLT5kZWNvZGluZ19yZWFkbGluZSB0byBnZXQgYSBuZXcgbGluZQogICAgICAyKSBQeVVuaWNvZGVPYmplY3QgKjogZGVjb2RpbmdfZmVvZiBoYXMgY2FsbGVkIHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUgYW5kCi0gICAgICAgICAgIHN0b3JlZCB0aGUgcmVzdWx0IGluIHRvay0+ZGVjb2RpbmdfYnVmZmVyCisgICAgICAgc3RvcmVkIHRoZSByZXN1bHQgaW4gdG9rLT5kZWNvZGluZ19idWZmZXIKICAgICAgMykgUHlTdHJpbmdPYmplY3QgKjogcHJldmlvdXMgY2FsbCB0byBmcF9yZWFkbCBkaWQgbm90IGhhdmUgZW5vdWdoIHJvb20KLSAgICAgICAgICAgKGluIHRoZSBzIGJ1ZmZlcikgdG8gY29weSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGxpbmUgcmVhZAotICAgICAgICAgICBieSB0b2stPmRlY29kaW5nX3JlYWRsaW5lLiAgdG9rLT5kZWNvZGluZ19idWZmZXIgaGFzIHRoZSBvdmVyZmxvdy4KLSAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBmcF9yZWFkbCBpcyBjYWxsZWQgaW4gYSBsb29wICh3aXRoIGFuIGV4cGFuZGVkIGJ1ZmZlcikKLSAgICAgICAgICAgdW50aWwgdGhlIGJ1ZmZlciBlbmRzIHdpdGggYSAnXG4nIChvciB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzCi0gICAgICAgICAgIHJlYWNoZWQpOiBzZWUgdG9rX25leHRjIGFuZCBpdHMgY2FsbHMgdG8gZGVjb2RpbmdfZmdldHMuCisgICAgICAgKGluIHRoZSBzIGJ1ZmZlcikgdG8gY29weSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGxpbmUgcmVhZAorICAgICAgIGJ5IHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUuICB0b2stPmRlY29kaW5nX2J1ZmZlciBoYXMgdGhlIG92ZXJmbG93LgorICAgICAgIEluIHRoaXMgY2FzZSwgZnBfcmVhZGwgaXMgY2FsbGVkIGluIGEgbG9vcCAod2l0aCBhbiBleHBhbmRlZCBidWZmZXIpCisgICAgICAgdW50aWwgdGhlIGJ1ZmZlciBlbmRzIHdpdGggYSAnXG4nIChvciB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzCisgICAgICAgcmVhY2hlZCk6IHNlZSB0b2tfbmV4dGMgYW5kIGl0cyBjYWxscyB0byBkZWNvZGluZ19mZ2V0cy4KICovCiAKIHN0YXRpYyBjaGFyICoKIGZwX3JlYWRsKGNoYXIgKnMsIGludCBzaXplLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spCiB7CiAjaWZuZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkvKiBJbiBhIG5vbi1Vbmljb2RlIGJ1aWx0LCB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQuICovCi0JUHlfRmF0YWxFcnJvcigiZnBfcmVhZGwgc2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gdGhpcyBidWlsZC4iKTsKLQlyZXR1cm4gTlVMTDsgLyogS2VlcCBjb21waWxlciBoYXBweSAobm90IHJlYWNoYWJsZSkgKi8KKyAgICAvKiBJbiBhIG5vbi1Vbmljb2RlIGJ1aWx0LCB0aGlzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQuICovCisgICAgUHlfRmF0YWxFcnJvcigiZnBfcmVhZGwgc2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gdGhpcyBidWlsZC4iKTsKKyAgICByZXR1cm4gTlVMTDsgLyogS2VlcCBjb21waWxlciBoYXBweSAobm90IHJlYWNoYWJsZSkgKi8KICNlbHNlCi0JUHlPYmplY3QqIHV0ZjggPSBOVUxMOwotCVB5T2JqZWN0KiBidWYgPSB0b2stPmRlY29kaW5nX2J1ZmZlcjsKLQljaGFyICpzdHI7Ci0JUHlfc3NpemVfdCB1dGY4bGVuOworICAgIFB5T2JqZWN0KiB1dGY4ID0gTlVMTDsKKyAgICBQeU9iamVjdCogYnVmID0gdG9rLT5kZWNvZGluZ19idWZmZXI7CisgICAgY2hhciAqc3RyOworICAgIFB5X3NzaXplX3QgdXRmOGxlbjsKIAotCS8qIEFzayBmb3Igb25lIGxlc3MgYnl0ZSBzbyB3ZSBjYW4gdGVybWluYXRlIGl0ICovCi0JYXNzZXJ0KHNpemUgPiAwKTsKLQlzaXplLS07CisgICAgLyogQXNrIGZvciBvbmUgbGVzcyBieXRlIHNvIHdlIGNhbiB0ZXJtaW5hdGUgaXQgKi8KKyAgICBhc3NlcnQoc2l6ZSA+IDApOworICAgIHNpemUtLTsKIAotCWlmIChidWYgPT0gTlVMTCkgewotCQlidWYgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUsIE5VTEwpOwotCQlpZiAoYnVmID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0JfSBlbHNlIHsKLQkJdG9rLT5kZWNvZGluZ19idWZmZXIgPSBOVUxMOwotCQlpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChidWYpKQotCQkJdXRmOCA9IGJ1ZjsKLQl9Ci0JaWYgKHV0ZjggPT0gTlVMTCkgewotCQl1dGY4ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhidWYpOwotCQlQeV9ERUNSRUYoYnVmKTsKLQkJaWYgKHV0ZjggPT0gTlVMTCkKLQkJCXJldHVybiBlcnJvcl9yZXQodG9rKTsKLQl9Ci0Jc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcodXRmOCk7Ci0JdXRmOGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHV0ZjgpOwotCWlmICh1dGY4bGVuID4gc2l6ZSkgewotCQl0b2stPmRlY29kaW5nX2J1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0citzaXplLCB1dGY4bGVuLXNpemUpOwotCQlpZiAodG9rLT5kZWNvZGluZ19idWZmZXIgPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKHV0ZjgpOwotCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCQl9Ci0JCXV0ZjhsZW4gPSBzaXplOwotCX0KLQltZW1jcHkocywgc3RyLCB1dGY4bGVuKTsKLQlzW3V0ZjhsZW5dID0gJ1wwJzsKLQlQeV9ERUNSRUYodXRmOCk7Ci0JaWYgKHV0ZjhsZW4gPT0gMCkgcmV0dXJuIE5VTEw7IC8qIEVPRiAqLwotCXJldHVybiBzOworICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICBidWYgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHRvay0+ZGVjb2RpbmdfcmVhZGxpbmUsIE5VTEwpOworICAgICAgICBpZiAoYnVmID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG9rLT5kZWNvZGluZ19idWZmZXIgPSBOVUxMOworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChidWYpKQorICAgICAgICAgICAgdXRmOCA9IGJ1ZjsKKyAgICB9CisgICAgaWYgKHV0ZjggPT0gTlVMTCkgeworICAgICAgICB1dGY4ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhidWYpOworICAgICAgICBQeV9ERUNSRUYoYnVmKTsKKyAgICAgICAgaWYgKHV0ZjggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcl9yZXQodG9rKTsKKyAgICB9CisgICAgc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcodXRmOCk7CisgICAgdXRmOGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHV0ZjgpOworICAgIGlmICh1dGY4bGVuID4gc2l6ZSkgeworICAgICAgICB0b2stPmRlY29kaW5nX2J1ZmZlciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0citzaXplLCB1dGY4bGVuLXNpemUpOworICAgICAgICBpZiAodG9rLT5kZWNvZGluZ19idWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHV0ZjgpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yX3JldCh0b2spOworICAgICAgICB9CisgICAgICAgIHV0ZjhsZW4gPSBzaXplOworICAgIH0KKyAgICBtZW1jcHkocywgc3RyLCB1dGY4bGVuKTsKKyAgICBzW3V0ZjhsZW5dID0gJ1wwJzsKKyAgICBQeV9ERUNSRUYodXRmOCk7CisgICAgaWYgKHV0ZjhsZW4gPT0gMCkgcmV0dXJuIE5VTEw7IC8qIEVPRiAqLworICAgIHJldHVybiBzOwogI2VuZGlmCiB9CiAKQEAgLTQzNSwzNyArNDM1LDM3IEBACiBzdGF0aWMgaW50CiBmcF9zZXRyZWFkbChzdHJ1Y3QgdG9rX3N0YXRlICp0b2ssIGNvbnN0IGNoYXIqIGVuYykKIHsKLQlQeU9iamVjdCAqcmVhZGVyLCAqc3RyZWFtLCAqcmVhZGxpbmU7CisgICAgUHlPYmplY3QgKnJlYWRlciwgKnN0cmVhbSwgKnJlYWRsaW5lOwogCi0JLyogWFhYOiBjb25zdGlmeSBmaWxlbmFtZSBhcmd1bWVudC4gKi8KLQlzdHJlYW0gPSBQeUZpbGVfRnJvbUZpbGUodG9rLT5mcCwgKGNoYXIqKXRvay0+ZmlsZW5hbWUsICJyYiIsIE5VTEwpOwotCWlmIChzdHJlYW0gPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisgICAgLyogWFhYOiBjb25zdGlmeSBmaWxlbmFtZSBhcmd1bWVudC4gKi8KKyAgICBzdHJlYW0gPSBQeUZpbGVfRnJvbUZpbGUodG9rLT5mcCwgKGNoYXIqKXRvay0+ZmlsZW5hbWUsICJyYiIsIE5VTEwpOworICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlyZWFkZXIgPSBQeUNvZGVjX1N0cmVhbVJlYWRlcihlbmMsIHN0cmVhbSwgTlVMTCk7Ci0JUHlfREVDUkVGKHN0cmVhbSk7Ci0JaWYgKHJlYWRlciA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICByZWFkZXIgPSBQeUNvZGVjX1N0cmVhbVJlYWRlcihlbmMsIHN0cmVhbSwgTlVMTCk7CisgICAgUHlfREVDUkVGKHN0cmVhbSk7CisgICAgaWYgKHJlYWRlciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCXJlYWRsaW5lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhyZWFkZXIsICJyZWFkbGluZSIpOwotCVB5X0RFQ1JFRihyZWFkZXIpOwotCWlmIChyZWFkbGluZSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICByZWFkbGluZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcocmVhZGVyLCAicmVhZGxpbmUiKTsKKyAgICBQeV9ERUNSRUYocmVhZGVyKTsKKyAgICBpZiAocmVhZGxpbmUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQl0b2stPmRlY29kaW5nX3JlYWRsaW5lID0gcmVhZGxpbmU7Ci0JcmV0dXJuIDE7CisgICAgdG9rLT5kZWNvZGluZ19yZWFkbGluZSA9IHJlYWRsaW5lOworICAgIHJldHVybiAxOwogfQogCiAvKiBGZXRjaCB0aGUgbmV4dCBieXRlIGZyb20gVE9LLiAqLwogCiBzdGF0aWMgaW50IGZwX2dldGMoc3RydWN0IHRva19zdGF0ZSAqdG9rKSB7Ci0JcmV0dXJuIGdldGModG9rLT5mcCk7CisgICAgcmV0dXJuIGdldGModG9rLT5mcCk7CiB9CiAKIC8qIFVuZmV0Y2ggdGhlIGxhc3QgYnl0ZSBiYWNrIGludG8gVE9LLiAgKi8KIAogc3RhdGljIHZvaWQgZnBfdW5nZXRjKGludCBjLCBzdHJ1Y3QgdG9rX3N0YXRlICp0b2spIHsKLQl1bmdldGMoYywgdG9rLT5mcCk7CisgICAgdW5nZXRjKGMsIHRvay0+ZnApOwogfQogCiAvKiBSZWFkIGEgbGluZSBvZiBpbnB1dCBmcm9tIFRPSy4gRGV0ZXJtaW5lIGVuY29kaW5nCkBAIC00NzQsOTQgKzQ3NCw5NCBAQAogc3RhdGljIGNoYXIgKgogZGVjb2RpbmdfZmdldHMoY2hhciAqcywgaW50IHNpemUsIHN0cnVjdCB0b2tfc3RhdGUgKnRvaykKIHsKLQljaGFyICpsaW5lID0gTlVMTDsKLQlpbnQgYmFkY2hhciA9IDA7Ci0JZm9yICg7OykgewotCQlpZiAodG9rLT5kZWNvZGluZ19zdGF0ZSA8IDApIHsKLQkJCS8qIFdlIGFscmVhZHkgaGF2ZSBhIGNvZGVjIGFzc29jaWF0ZWQgd2l0aAotCQkJICAgdGhpcyBpbnB1dC4gKi8KLQkJCWxpbmUgPSBmcF9yZWFkbChzLCBzaXplLCB0b2spOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAodG9rLT5kZWNvZGluZ19zdGF0ZSA+IDApIHsKLQkJCS8qIFdlIHdhbnQgYSAncmF3JyByZWFkLiAqLwotCQkJbGluZSA9IFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhzLCBzaXplLAotCQkJCQkJCXRvay0+ZnAsIE5VTEwpOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBXZSBoYXZlIG5vdCB5ZXQgZGV0ZXJtaW5lZCB0aGUgZW5jb2RpbmcuCi0JCQkgICBJZiBhbiBlbmNvZGluZyBpcyBmb3VuZCwgdXNlIHRoZSBmaWxlLXBvaW50ZXIKLQkJCSAgIHJlYWRlciBmdW5jdGlvbnMgZnJvbSBub3cgb24uICovCi0JCQlpZiAoIWNoZWNrX2JvbShmcF9nZXRjLCBmcF91bmdldGMsIGZwX3NldHJlYWRsLCB0b2spKQotCQkJCXJldHVybiBlcnJvcl9yZXQodG9rKTsKLQkJCWFzc2VydCh0b2stPmRlY29kaW5nX3N0YXRlICE9IDApOwotCQl9Ci0JfQotCWlmIChsaW5lICE9IE5VTEwgJiYgdG9rLT5saW5lbm8gPCAyICYmICF0b2stPnJlYWRfY29kaW5nX3NwZWMpIHsKLQkJaWYgKCFjaGVja19jb2Rpbmdfc3BlYyhsaW5lLCBzdHJsZW4obGluZSksIHRvaywgZnBfc2V0cmVhZGwpKSB7Ci0JCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0JCX0KLQl9CisgICAgY2hhciAqbGluZSA9IE5VTEw7CisgICAgaW50IGJhZGNoYXIgPSAwOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKHRvay0+ZGVjb2Rpbmdfc3RhdGUgPCAwKSB7CisgICAgICAgICAgICAvKiBXZSBhbHJlYWR5IGhhdmUgYSBjb2RlYyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgICAgICAgIHRoaXMgaW5wdXQuICovCisgICAgICAgICAgICBsaW5lID0gZnBfcmVhZGwocywgc2l6ZSwgdG9rKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHRvay0+ZGVjb2Rpbmdfc3RhdGUgPiAwKSB7CisgICAgICAgICAgICAvKiBXZSB3YW50IGEgJ3JhdycgcmVhZC4gKi8KKyAgICAgICAgICAgIGxpbmUgPSBQeV9Vbml2ZXJzYWxOZXdsaW5lRmdldHMocywgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT5mcCwgTlVMTCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFdlIGhhdmUgbm90IHlldCBkZXRlcm1pbmVkIHRoZSBlbmNvZGluZy4KKyAgICAgICAgICAgICAgIElmIGFuIGVuY29kaW5nIGlzIGZvdW5kLCB1c2UgdGhlIGZpbGUtcG9pbnRlcgorICAgICAgICAgICAgICAgcmVhZGVyIGZ1bmN0aW9ucyBmcm9tIG5vdyBvbi4gKi8KKyAgICAgICAgICAgIGlmICghY2hlY2tfYm9tKGZwX2dldGMsIGZwX3VuZ2V0YywgZnBfc2V0cmVhZGwsIHRvaykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yX3JldCh0b2spOworICAgICAgICAgICAgYXNzZXJ0KHRvay0+ZGVjb2Rpbmdfc3RhdGUgIT0gMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGxpbmUgIT0gTlVMTCAmJiB0b2stPmxpbmVubyA8IDIgJiYgIXRvay0+cmVhZF9jb2Rpbmdfc3BlYykgeworICAgICAgICBpZiAoIWNoZWNrX2NvZGluZ19zcGVjKGxpbmUsIHN0cmxlbihsaW5lKSwgdG9rLCBmcF9zZXRyZWFkbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcl9yZXQodG9rKTsKKyAgICAgICAgfQorICAgIH0KICNpZm5kZWYgUEdFTgotCS8qIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIEFTQ0lJLCBzbyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBhbnkKLSAgICAgICAgICAgbm9uLUFTQ0lJIGJ5dGVzIGluIGl0LiAqLwotCWlmIChsaW5lICYmICF0b2stPmVuY29kaW5nKSB7Ci0JCXVuc2lnbmVkIGNoYXIgKmM7Ci0JCWZvciAoYyA9ICh1bnNpZ25lZCBjaGFyICopbGluZTsgKmM7IGMrKykKLQkJCWlmICgqYyA+IDEyNykgewotCQkJCWJhZGNoYXIgPSAqYzsKLQkJCQlicmVhazsKLQkJCX0KLQl9Ci0JaWYgKGJhZGNoYXIpIHsKLQkJY2hhciBidWZbNTAwXTsKLQkJLyogTmVlZCB0byBhZGQgMSB0byB0aGUgbGluZSBudW1iZXIsIHNpbmNlIHRoaXMgbGluZQotCQkgICBoYXMgbm90IGJlZW4gY291bnRlZCwgeWV0LiAgKi8KLQkJc3ByaW50ZihidWYsCi0JCQkiTm9uLUFTQ0lJIGNoYXJhY3RlciAnXFx4JS4yeCcgIgotCQkJImluIGZpbGUgJS4yMDBzIG9uIGxpbmUgJWksICIKLQkJCSJidXQgbm8gZW5jb2RpbmcgZGVjbGFyZWQ7ICIKLQkJCSJzZWUgaHR0cDovL3d3dy5weXRob24ub3JnL3BlcHMvcGVwLTAyNjMuaHRtbCBmb3IgZGV0YWlscyIsCi0JCQliYWRjaGFyLCB0b2stPmZpbGVuYW1lLCB0b2stPmxpbmVubyArIDEpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsIGJ1Zik7Ci0JCXJldHVybiBlcnJvcl9yZXQodG9rKTsKLQl9CisgICAgLyogVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgQVNDSUksIHNvIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGFueQorICAgICAgIG5vbi1BU0NJSSBieXRlcyBpbiBpdC4gKi8KKyAgICBpZiAobGluZSAmJiAhdG9rLT5lbmNvZGluZykgeworICAgICAgICB1bnNpZ25lZCBjaGFyICpjOworICAgICAgICBmb3IgKGMgPSAodW5zaWduZWQgY2hhciAqKWxpbmU7ICpjOyBjKyspCisgICAgICAgICAgICBpZiAoKmMgPiAxMjcpIHsKKyAgICAgICAgICAgICAgICBiYWRjaGFyID0gKmM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgfQorICAgIGlmIChiYWRjaGFyKSB7CisgICAgICAgIGNoYXIgYnVmWzUwMF07CisgICAgICAgIC8qIE5lZWQgdG8gYWRkIDEgdG8gdGhlIGxpbmUgbnVtYmVyLCBzaW5jZSB0aGlzIGxpbmUKKyAgICAgICAgICAgaGFzIG5vdCBiZWVuIGNvdW50ZWQsIHlldC4gICovCisgICAgICAgIHNwcmludGYoYnVmLAorICAgICAgICAgICAgIk5vbi1BU0NJSSBjaGFyYWN0ZXIgJ1xceCUuMngnICIKKyAgICAgICAgICAgICJpbiBmaWxlICUuMjAwcyBvbiBsaW5lICVpLCAiCisgICAgICAgICAgICAiYnV0IG5vIGVuY29kaW5nIGRlY2xhcmVkOyAiCisgICAgICAgICAgICAic2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wZXBzL3BlcC0wMjYzLmh0bWwgZm9yIGRldGFpbHMiLAorICAgICAgICAgICAgYmFkY2hhciwgdG9rLT5maWxlbmFtZSwgdG9rLT5saW5lbm8gKyAxKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLCBidWYpOworICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgfQogI2VuZGlmCi0JcmV0dXJuIGxpbmU7CisgICAgcmV0dXJuIGxpbmU7CiB9CiAKIHN0YXRpYyBpbnQKIGRlY29kaW5nX2Zlb2Yoc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCWlmICh0b2stPmRlY29kaW5nX3N0YXRlID49IDApIHsKLQkJcmV0dXJuIGZlb2YodG9rLT5mcCk7Ci0JfSBlbHNlIHsKLQkJUHlPYmplY3QqIGJ1ZiA9IHRvay0+ZGVjb2RpbmdfYnVmZmVyOwotCQlpZiAoYnVmID09IE5VTEwpIHsKLQkJCWJ1ZiA9IFB5T2JqZWN0X0NhbGxPYmplY3QodG9rLT5kZWNvZGluZ19yZWFkbGluZSwgTlVMTCk7Ci0JCQlpZiAoYnVmID09IE5VTEwpIHsKLQkJCQllcnJvcl9yZXQodG9rKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJdG9rLT5kZWNvZGluZ19idWZmZXIgPSBidWY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFB5T2JqZWN0X0xlbmd0aChidWYpID09IDA7Ci0JfQorICAgIGlmICh0b2stPmRlY29kaW5nX3N0YXRlID49IDApIHsKKyAgICAgICAgcmV0dXJuIGZlb2YodG9rLT5mcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QqIGJ1ZiA9IHRvay0+ZGVjb2RpbmdfYnVmZmVyOworICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIGJ1ZiA9IFB5T2JqZWN0X0NhbGxPYmplY3QodG9rLT5kZWNvZGluZ19yZWFkbGluZSwgTlVMTCk7CisgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnJvcl9yZXQodG9rKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9rLT5kZWNvZGluZ19idWZmZXIgPSBidWY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0xlbmd0aChidWYpID09IDA7CisgICAgfQogfQogCiAvKiBGZXRjaCBhIGJ5dGUgZnJvbSBUT0ssIHVzaW5nIHRoZSBzdHJpbmcgYnVmZmVyLiAqLwogCiBzdGF0aWMgaW50CiBidWZfZ2V0YyhzdHJ1Y3QgdG9rX3N0YXRlICp0b2spIHsKLQlyZXR1cm4gUHlfQ0hBUk1BU0soKnRvay0+c3RyKyspOworICAgIHJldHVybiBQeV9DSEFSTUFTSygqdG9rLT5zdHIrKyk7CiB9CiAKIC8qIFVuZmV0Y2ggYSBieXRlIGZyb20gVE9LLCB1c2luZyB0aGUgc3RyaW5nIGJ1ZmZlci4gKi8KIAogc3RhdGljIHZvaWQKIGJ1Zl91bmdldGMoaW50IGMsIHN0cnVjdCB0b2tfc3RhdGUgKnRvaykgewotCXRvay0+c3RyLS07Ci0JYXNzZXJ0KFB5X0NIQVJNQVNLKCp0b2stPnN0cikgPT0gYyk7CS8qIHRvay0+Y3VyIG1heSBwb2ludCB0byByZWFkLW9ubHkgc2VnbWVudCAqLworICAgIHRvay0+c3RyLS07CisgICAgYXNzZXJ0KFB5X0NIQVJNQVNLKCp0b2stPnN0cikgPT0gYyk7ICAgICAgICAvKiB0b2stPmN1ciBtYXkgcG9pbnQgdG8gcmVhZC1vbmx5IHNlZ21lbnQgKi8KIH0KIAogLyogU2V0IHRoZSByZWFkbGluZSBmdW5jdGlvbiBmb3IgVE9LIHRvIEVOQy4gRm9yIHRoZSBzdHJpbmctYmFzZWQKQEAgLTU2OSw4ICs1NjksOCBAQAogCiBzdGF0aWMgaW50CiBidWZfc2V0cmVhZGwoc3RydWN0IHRva19zdGF0ZSAqdG9rLCBjb25zdCBjaGFyKiBlbmMpIHsKLQl0b2stPmVuYyA9IGVuYzsKLQlyZXR1cm4gMTsKKyAgICB0b2stPmVuYyA9IGVuYzsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogUmV0dXJuIGEgVVRGLTggZW5jb2RpbmcgUHl0aG9uIHN0cmluZyBvYmplY3QgZnJvbSB0aGUKQEAgLTU3OSwxMyArNTc5LDEzIEBACiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogc3RhdGljIFB5T2JqZWN0ICoKIHRyYW5zbGF0ZV9pbnRvX3V0ZjgoY29uc3QgY2hhciogc3RyLCBjb25zdCBjaGFyKiBlbmMpIHsKLQlQeU9iamVjdCAqdXRmODsKLQlQeU9iamVjdCogYnVmID0gUHlVbmljb2RlX0RlY29kZShzdHIsIHN0cmxlbihzdHIpLCBlbmMsIE5VTEwpOwotCWlmIChidWYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JdXRmOCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoYnVmKTsKLQlQeV9ERUNSRUYoYnVmKTsKLQlyZXR1cm4gdXRmODsKKyAgICBQeU9iamVjdCAqdXRmODsKKyAgICBQeU9iamVjdCogYnVmID0gUHlVbmljb2RlX0RlY29kZShzdHIsIHN0cmxlbihzdHIpLCBlbmMsIE5VTEwpOworICAgIGlmIChidWYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdXRmOCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoYnVmKTsKKyAgICBQeV9ERUNSRUYoYnVmKTsKKyAgICByZXR1cm4gdXRmODsKIH0KICNlbmRpZgogCkBAIC01OTYsNjAgKzU5Niw2MCBAQAogc3RhdGljIGNvbnN0IGNoYXIgKgogZGVjb2RlX3N0cihjb25zdCBjaGFyICpzdHIsIHN0cnVjdCB0b2tfc3RhdGUgKnRvaykKIHsKLQlQeU9iamVjdCogdXRmOCA9IE5VTEw7Ci0JY29uc3QgY2hhciAqczsKLQljb25zdCBjaGFyICpuZXdsWzJdID0ge05VTEwsIE5VTEx9OwotCWludCBsaW5lbm8gPSAwOwotCXRvay0+ZW5jID0gTlVMTDsKLQl0b2stPnN0ciA9IHN0cjsKLQlpZiAoIWNoZWNrX2JvbShidWZfZ2V0YywgYnVmX3VuZ2V0YywgYnVmX3NldHJlYWRsLCB0b2spKQotCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0Jc3RyID0gdG9rLT5zdHI7CQkvKiBzdHJpbmcgYWZ0ZXIgQk9NIGlmIGFueSAqLwotCWFzc2VydChzdHIpOworICAgIFB5T2JqZWN0KiB1dGY4ID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpzOworICAgIGNvbnN0IGNoYXIgKm5ld2xbMl0gPSB7TlVMTCwgTlVMTH07CisgICAgaW50IGxpbmVubyA9IDA7CisgICAgdG9rLT5lbmMgPSBOVUxMOworICAgIHRvay0+c3RyID0gc3RyOworICAgIGlmICghY2hlY2tfYm9tKGJ1Zl9nZXRjLCBidWZfdW5nZXRjLCBidWZfc2V0cmVhZGwsIHRvaykpCisgICAgICAgIHJldHVybiBlcnJvcl9yZXQodG9rKTsKKyAgICBzdHIgPSB0b2stPnN0cjsgICAgICAgICAgICAgLyogc3RyaW5nIGFmdGVyIEJPTSBpZiBhbnkgKi8KKyAgICBhc3NlcnQoc3RyKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKHRvay0+ZW5jICE9IE5VTEwpIHsKLQkJdXRmOCA9IHRyYW5zbGF0ZV9pbnRvX3V0Zjgoc3RyLCB0b2stPmVuYyk7Ci0JCWlmICh1dGY4ID09IE5VTEwpCi0JCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0JCXN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHV0ZjgpOwotCX0KKyAgICBpZiAodG9rLT5lbmMgIT0gTlVMTCkgeworICAgICAgICB1dGY4ID0gdHJhbnNsYXRlX2ludG9fdXRmOChzdHIsIHRvay0+ZW5jKTsKKyAgICAgICAgaWYgKHV0ZjggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcl9yZXQodG9rKTsKKyAgICAgICAgc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcodXRmOCk7CisgICAgfQogI2VuZGlmCi0JZm9yIChzID0gc3RyOzsgcysrKSB7Ci0JCWlmICgqcyA9PSAnXDAnKSBicmVhazsKLQkJZWxzZSBpZiAoKnMgPT0gJ1xuJykgewotCQkJYXNzZXJ0KGxpbmVubyA8IDIpOwotCQkJbmV3bFtsaW5lbm9dID0gczsKLQkJCWxpbmVubysrOwotCQkJaWYgKGxpbmVubyA9PSAyKSBicmVhazsKLQkJfQotCX0KLQl0b2stPmVuYyA9IE5VTEw7Ci0JLyogbmVlZCB0byBjaGVjayBsaW5lIDEgYW5kIDIgc2VwYXJhdGVseSBzaW5jZSBjaGVja19jb2Rpbmdfc3BlYwotCSAgIGFzc3VtZXMgYSBzaW5nbGUgbGluZSBhcyBpbnB1dCAqLwotCWlmIChuZXdsWzBdKSB7Ci0JCWlmICghY2hlY2tfY29kaW5nX3NwZWMoc3RyLCBuZXdsWzBdIC0gc3RyLCB0b2ssIGJ1Zl9zZXRyZWFkbCkpCi0JCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0JCWlmICh0b2stPmVuYyA9PSBOVUxMICYmIG5ld2xbMV0pIHsKLQkJCWlmICghY2hlY2tfY29kaW5nX3NwZWMobmV3bFswXSsxLCBuZXdsWzFdIC0gbmV3bFswXSwKLQkJCQkJICAgICAgIHRvaywgYnVmX3NldHJlYWRsKSkKLQkJCQlyZXR1cm4gZXJyb3JfcmV0KHRvayk7Ci0JCX0KLQl9CisgICAgZm9yIChzID0gc3RyOzsgcysrKSB7CisgICAgICAgIGlmICgqcyA9PSAnXDAnKSBicmVhazsKKyAgICAgICAgZWxzZSBpZiAoKnMgPT0gJ1xuJykgeworICAgICAgICAgICAgYXNzZXJ0KGxpbmVubyA8IDIpOworICAgICAgICAgICAgbmV3bFtsaW5lbm9dID0gczsKKyAgICAgICAgICAgIGxpbmVubysrOworICAgICAgICAgICAgaWYgKGxpbmVubyA9PSAyKSBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICB0b2stPmVuYyA9IE5VTEw7CisgICAgLyogbmVlZCB0byBjaGVjayBsaW5lIDEgYW5kIDIgc2VwYXJhdGVseSBzaW5jZSBjaGVja19jb2Rpbmdfc3BlYworICAgICAgIGFzc3VtZXMgYSBzaW5nbGUgbGluZSBhcyBpbnB1dCAqLworICAgIGlmIChuZXdsWzBdKSB7CisgICAgICAgIGlmICghY2hlY2tfY29kaW5nX3NwZWMoc3RyLCBuZXdsWzBdIC0gc3RyLCB0b2ssIGJ1Zl9zZXRyZWFkbCkpCisgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgIGlmICh0b2stPmVuYyA9PSBOVUxMICYmIG5ld2xbMV0pIHsKKyAgICAgICAgICAgIGlmICghY2hlY2tfY29kaW5nX3NwZWMobmV3bFswXSsxLCBuZXdsWzFdIC0gbmV3bFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLCBidWZfc2V0cmVhZGwpKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcl9yZXQodG9rKTsKKyAgICAgICAgfQorICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JaWYgKHRvay0+ZW5jICE9IE5VTEwpIHsKLQkJYXNzZXJ0KHV0ZjggPT0gTlVMTCk7Ci0JCXV0ZjggPSB0cmFuc2xhdGVfaW50b191dGY4KHN0ciwgdG9rLT5lbmMpOwotCQlpZiAodXRmOCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsCi0JCQkJInVua25vd24gZW5jb2Rpbmc6ICVzIiwgdG9rLT5lbmMpOwotCQkJcmV0dXJuIGVycm9yX3JldCh0b2spOwotCQl9Ci0JCXN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHV0ZjgpOwotCX0KKyAgICBpZiAodG9rLT5lbmMgIT0gTlVMTCkgeworICAgICAgICBhc3NlcnQodXRmOCA9PSBOVUxMKTsKKyAgICAgICAgdXRmOCA9IHRyYW5zbGF0ZV9pbnRvX3V0Zjgoc3RyLCB0b2stPmVuYyk7CisgICAgICAgIGlmICh1dGY4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwKKyAgICAgICAgICAgICAgICAidW5rbm93biBlbmNvZGluZzogJXMiLCB0b2stPmVuYyk7CisgICAgICAgICAgICByZXR1cm4gZXJyb3JfcmV0KHRvayk7CisgICAgICAgIH0KKyAgICAgICAgc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcodXRmOCk7CisgICAgfQogI2VuZGlmCi0JYXNzZXJ0KHRvay0+ZGVjb2RpbmdfYnVmZmVyID09IE5VTEwpOwotCXRvay0+ZGVjb2RpbmdfYnVmZmVyID0gdXRmODsgLyogQ0FVVElPTiAqLwotCXJldHVybiBzdHI7CisgICAgYXNzZXJ0KHRvay0+ZGVjb2RpbmdfYnVmZmVyID09IE5VTEwpOworICAgIHRvay0+ZGVjb2RpbmdfYnVmZmVyID0gdXRmODsgLyogQ0FVVElPTiAqLworICAgIHJldHVybiBzdHI7CiB9CiAKICNlbmRpZiAvKiBQR0VOICovCkBAIC02NTksMTggKzY1OSwxOCBAQAogc3RydWN0IHRva19zdGF0ZSAqCiBQeVRva2VuaXplcl9Gcm9tU3RyaW5nKGNvbnN0IGNoYXIgKnN0cikKIHsKLQlzdHJ1Y3QgdG9rX3N0YXRlICp0b2sgPSB0b2tfbmV3KCk7Ci0JaWYgKHRvayA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlzdHIgPSAoY2hhciAqKWRlY29kZV9zdHIoc3RyLCB0b2spOwotCWlmIChzdHIgPT0gTlVMTCkgewotCQlQeVRva2VuaXplcl9GcmVlKHRvayk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBzdHJ1Y3QgdG9rX3N0YXRlICp0b2sgPSB0b2tfbmV3KCk7CisgICAgaWYgKHRvayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdHIgPSAoY2hhciAqKWRlY29kZV9zdHIoc3RyLCB0b2spOworICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICBQeVRva2VuaXplcl9GcmVlKHRvayk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIFhYWDogY29uc3RpZnkgbWVtYmVycy4gKi8KLQl0b2stPmJ1ZiA9IHRvay0+Y3VyID0gdG9rLT5lbmQgPSB0b2stPmlucCA9IChjaGFyKilzdHI7Ci0JcmV0dXJuIHRvazsKKyAgICAvKiBYWFg6IGNvbnN0aWZ5IG1lbWJlcnMuICovCisgICAgdG9rLT5idWYgPSB0b2stPmN1ciA9IHRvay0+ZW5kID0gdG9rLT5pbnAgPSAoY2hhciopc3RyOworICAgIHJldHVybiB0b2s7CiB9CiAKIApAQCAtNjc5LDE5ICs2NzksMTkgQEAKIHN0cnVjdCB0b2tfc3RhdGUgKgogUHlUb2tlbml6ZXJfRnJvbUZpbGUoRklMRSAqZnAsIGNoYXIgKnBzMSwgY2hhciAqcHMyKQogewotCXN0cnVjdCB0b2tfc3RhdGUgKnRvayA9IHRva19uZXcoKTsKLQlpZiAodG9rID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICgodG9rLT5idWYgPSAoY2hhciAqKVB5TWVtX01BTExPQyhCVUZTSVopKSA9PSBOVUxMKSB7Ci0JCVB5VG9rZW5pemVyX0ZyZWUodG9rKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXRvay0+Y3VyID0gdG9rLT5pbnAgPSB0b2stPmJ1ZjsKLQl0b2stPmVuZCA9IHRvay0+YnVmICsgQlVGU0laOwotCXRvay0+ZnAgPSBmcDsKLQl0b2stPnByb21wdCA9IHBzMTsKLQl0b2stPm5leHRwcm9tcHQgPSBwczI7Ci0JcmV0dXJuIHRvazsKKyAgICBzdHJ1Y3QgdG9rX3N0YXRlICp0b2sgPSB0b2tfbmV3KCk7CisgICAgaWYgKHRvayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKHRvay0+YnVmID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoQlVGU0laKSkgPT0gTlVMTCkgeworICAgICAgICBQeVRva2VuaXplcl9GcmVlKHRvayk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB0b2stPmN1ciA9IHRvay0+aW5wID0gdG9rLT5idWY7CisgICAgdG9rLT5lbmQgPSB0b2stPmJ1ZiArIEJVRlNJWjsKKyAgICB0b2stPmZwID0gZnA7CisgICAgdG9rLT5wcm9tcHQgPSBwczE7CisgICAgdG9rLT5uZXh0cHJvbXB0ID0gcHMyOworICAgIHJldHVybiB0b2s7CiB9CiAKIApAQCAtNzAwLDc4ICs3MDAsNzggQEAKIHZvaWQKIFB5VG9rZW5pemVyX0ZyZWUoc3RydWN0IHRva19zdGF0ZSAqdG9rKQogewotCWlmICh0b2stPmVuY29kaW5nICE9IE5VTEwpCi0JCVB5TWVtX0ZSRUUodG9rLT5lbmNvZGluZyk7CisgICAgaWYgKHRvay0+ZW5jb2RpbmcgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRlJFRSh0b2stPmVuY29kaW5nKTsKICNpZm5kZWYgUEdFTgotCVB5X1hERUNSRUYodG9rLT5kZWNvZGluZ19yZWFkbGluZSk7Ci0JUHlfWERFQ1JFRih0b2stPmRlY29kaW5nX2J1ZmZlcik7CisgICAgUHlfWERFQ1JFRih0b2stPmRlY29kaW5nX3JlYWRsaW5lKTsKKyAgICBQeV9YREVDUkVGKHRvay0+ZGVjb2RpbmdfYnVmZmVyKTsKICNlbmRpZgotCWlmICh0b2stPmZwICE9IE5VTEwgJiYgdG9rLT5idWYgIT0gTlVMTCkKLQkJUHlNZW1fRlJFRSh0b2stPmJ1Zik7Ci0JUHlNZW1fRlJFRSh0b2spOworICAgIGlmICh0b2stPmZwICE9IE5VTEwgJiYgdG9rLT5idWYgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRlJFRSh0b2stPmJ1Zik7CisgICAgUHlNZW1fRlJFRSh0b2spOwogfQogCiAjaWYgIWRlZmluZWQoUEdFTikgJiYgZGVmaW5lZChQeV9VU0lOR19VTklDT0RFKQogc3RhdGljIGludAogdG9rX3N0ZGluX2RlY29kZShzdHJ1Y3QgdG9rX3N0YXRlICp0b2ssIGNoYXIgKippbnApCiB7Ci0JUHlPYmplY3QgKmVuYywgKnN5c3N0ZGluLCAqZGVjb2RlZCwgKnV0Zjg7Ci0JY29uc3QgY2hhciAqZW5jb2Rpbmc7Ci0JY2hhciAqY29udmVydGVkOworICAgIFB5T2JqZWN0ICplbmMsICpzeXNzdGRpbiwgKmRlY29kZWQsICp1dGY4OworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nOworICAgIGNoYXIgKmNvbnZlcnRlZDsKIAotCWlmIChQeVN5c19HZXRGaWxlKChjaGFyICopInN0ZGluIiwgTlVMTCkgIT0gc3RkaW4pCi0JCXJldHVybiAwOwotCXN5c3N0ZGluID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRpbiIpOwotCWlmIChzeXNzdGRpbiA9PSBOVUxMIHx8ICFQeUZpbGVfQ2hlY2soc3lzc3RkaW4pKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoUHlTeXNfR2V0RmlsZSgoY2hhciAqKSJzdGRpbiIsIE5VTEwpICE9IHN0ZGluKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzeXNzdGRpbiA9IFB5U3lzX0dldE9iamVjdCgic3RkaW4iKTsKKyAgICBpZiAoc3lzc3RkaW4gPT0gTlVMTCB8fCAhUHlGaWxlX0NoZWNrKHN5c3N0ZGluKSkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQllbmMgPSAoKFB5RmlsZU9iamVjdCAqKXN5c3N0ZGluKS0+Zl9lbmNvZGluZzsKLQlpZiAoZW5jID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKGVuYykpCi0JCXJldHVybiAwOwotCVB5X0lOQ1JFRihlbmMpOworICAgIGVuYyA9ICgoUHlGaWxlT2JqZWN0ICopc3lzc3RkaW4pLT5mX2VuY29kaW5nOworICAgIGlmIChlbmMgPT0gTlVMTCB8fCAhUHlTdHJpbmdfQ2hlY2soZW5jKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUHlfSU5DUkVGKGVuYyk7CiAKLQllbmNvZGluZyA9IFB5U3RyaW5nX0FzU3RyaW5nKGVuYyk7Ci0JZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGUoKmlucCwgc3RybGVuKCppbnApLCBlbmNvZGluZywgTlVMTCk7Ci0JaWYgKGRlY29kZWQgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9jbGVhcjsKKyAgICBlbmNvZGluZyA9IFB5U3RyaW5nX0FzU3RyaW5nKGVuYyk7CisgICAgZGVjb2RlZCA9IFB5VW5pY29kZV9EZWNvZGUoKmlucCwgc3RybGVuKCppbnApLCBlbmNvZGluZywgTlVMTCk7CisgICAgaWYgKGRlY29kZWQgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcl9jbGVhcjsKIAotCXV0ZjggPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKGRlY29kZWQsICJ1dGYtOCIsIE5VTEwpOwotCVB5X0RFQ1JFRihkZWNvZGVkKTsKLQlpZiAodXRmOCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX2NsZWFyOworICAgIHV0ZjggPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKGRlY29kZWQsICJ1dGYtOCIsIE5VTEwpOworICAgIFB5X0RFQ1JFRihkZWNvZGVkKTsKKyAgICBpZiAodXRmOCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yX2NsZWFyOwogCi0JYXNzZXJ0KFB5U3RyaW5nX0NoZWNrKHV0ZjgpKTsKLQljb252ZXJ0ZWQgPSBuZXdfc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyh1dGY4KSwKLQkJCSAgICAgICBQeVN0cmluZ19HRVRfU0laRSh1dGY4KSk7Ci0JUHlfREVDUkVGKHV0ZjgpOwotCWlmIChjb252ZXJ0ZWQgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9ub21lbTsKKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2sodXRmOCkpOworICAgIGNvbnZlcnRlZCA9IG5ld19zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHV0ZjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUodXRmOCkpOworICAgIFB5X0RFQ1JFRih1dGY4KTsKKyAgICBpZiAoY29udmVydGVkID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3Jfbm9tZW07CiAKLQlQeU1lbV9GUkVFKCppbnApOwotCSppbnAgPSBjb252ZXJ0ZWQ7Ci0JaWYgKHRvay0+ZW5jb2RpbmcgIT0gTlVMTCkKLQkJUHlNZW1fRlJFRSh0b2stPmVuY29kaW5nKTsKLQl0b2stPmVuY29kaW5nID0gbmV3X3N0cmluZyhlbmNvZGluZywgc3RybGVuKGVuY29kaW5nKSk7Ci0JaWYgKHRvay0+ZW5jb2RpbmcgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9ub21lbTsKKyAgICBQeU1lbV9GUkVFKCppbnApOworICAgICppbnAgPSBjb252ZXJ0ZWQ7CisgICAgaWYgKHRvay0+ZW5jb2RpbmcgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRlJFRSh0b2stPmVuY29kaW5nKTsKKyAgICB0b2stPmVuY29kaW5nID0gbmV3X3N0cmluZyhlbmNvZGluZywgc3RybGVuKGVuY29kaW5nKSk7CisgICAgaWYgKHRvay0+ZW5jb2RpbmcgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcl9ub21lbTsKIAotCVB5X0RFQ1JFRihlbmMpOwotCXJldHVybiAwOworICAgIFB5X0RFQ1JFRihlbmMpOworICAgIHJldHVybiAwOwogCiBlcnJvcl9ub21lbToKLQlQeV9ERUNSRUYoZW5jKTsKLQl0b2stPmRvbmUgPSBFX05PTUVNOwotCXJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYoZW5jKTsKKyAgICB0b2stPmRvbmUgPSBFX05PTUVNOworICAgIHJldHVybiAtMTsKIAogZXJyb3JfY2xlYXI6Ci0JUHlfREVDUkVGKGVuYyk7Ci0JaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvcikpIHsKLQkJdG9rLT5kb25lID0gRV9FUlJPUjsKLQkJcmV0dXJuIC0xOwotCX0KLQkvKiBGYWxsYmFjayB0byBpc28tODg1OS0xOiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKGVuYyk7CisgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvcikpIHsKKyAgICAgICAgdG9rLT5kb25lID0gRV9FUlJPUjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBGYWxsYmFjayB0byBpc28tODg1OS0xOiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApAQCAtNzgwLDE2OSArNzgwLDE2OSBAQAogc3RhdGljIGludAogdG9rX25leHRjKHJlZ2lzdGVyIHN0cnVjdCB0b2tfc3RhdGUgKnRvaykKIHsKLQlmb3IgKDs7KSB7Ci0JCWlmICh0b2stPmN1ciAhPSB0b2stPmlucCkgewotCQkJcmV0dXJuIFB5X0NIQVJNQVNLKCp0b2stPmN1cisrKTsgLyogRmFzdCBwYXRoICovCi0JCX0KLQkJaWYgKHRvay0+ZG9uZSAhPSBFX09LKQotCQkJcmV0dXJuIEVPRjsKLQkJaWYgKHRvay0+ZnAgPT0gTlVMTCkgewotCQkJY2hhciAqZW5kID0gc3RyY2hyKHRvay0+aW5wLCAnXG4nKTsKLQkJCWlmIChlbmQgIT0gTlVMTCkKLQkJCQllbmQrKzsKLQkJCWVsc2UgewotCQkJCWVuZCA9IHN0cmNocih0b2stPmlucCwgJ1wwJyk7Ci0JCQkJaWYgKGVuZCA9PSB0b2stPmlucCkgewotCQkJCQl0b2stPmRvbmUgPSBFX0VPRjsKLQkJCQkJcmV0dXJuIEVPRjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodG9rLT5zdGFydCA9PSBOVUxMKQotCQkJCXRvay0+YnVmID0gdG9rLT5jdXI7Ci0JCQl0b2stPmxpbmVfc3RhcnQgPSB0b2stPmN1cjsKLQkJCXRvay0+bGluZW5vKys7Ci0JCQl0b2stPmlucCA9IGVuZDsKLQkJCXJldHVybiBQeV9DSEFSTUFTSygqdG9rLT5jdXIrKyk7Ci0JCX0KLQkJaWYgKHRvay0+cHJvbXB0ICE9IE5VTEwpIHsKLQkJCWNoYXIgKm5ld3RvayA9IFB5T1NfUmVhZGxpbmUoc3RkaW4sIHN0ZG91dCwgdG9rLT5wcm9tcHQpOwotCQkJaWYgKHRvay0+bmV4dHByb21wdCAhPSBOVUxMKQotCQkJCXRvay0+cHJvbXB0ID0gdG9rLT5uZXh0cHJvbXB0OwotCQkJaWYgKG5ld3RvayA9PSBOVUxMKQotCQkJCXRvay0+ZG9uZSA9IEVfSU5UUjsKLQkJCWVsc2UgaWYgKCpuZXd0b2sgPT0gJ1wwJykgewotCQkJCVB5TWVtX0ZSRUUobmV3dG9rKTsKLQkJCQl0b2stPmRvbmUgPSBFX0VPRjsKLQkJCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICh0b2stPmN1ciAhPSB0b2stPmlucCkgeworICAgICAgICAgICAgcmV0dXJuIFB5X0NIQVJNQVNLKCp0b2stPmN1cisrKTsgLyogRmFzdCBwYXRoICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvay0+ZG9uZSAhPSBFX09LKQorICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgICAgaWYgKHRvay0+ZnAgPT0gTlVMTCkgeworICAgICAgICAgICAgY2hhciAqZW5kID0gc3RyY2hyKHRvay0+aW5wLCAnXG4nKTsKKyAgICAgICAgICAgIGlmIChlbmQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBlbmQrKzsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGVuZCA9IHN0cmNocih0b2stPmlucCwgJ1wwJyk7CisgICAgICAgICAgICAgICAgaWYgKGVuZCA9PSB0b2stPmlucCkgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0VPRjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodG9rLT5zdGFydCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHRvay0+YnVmID0gdG9rLT5jdXI7CisgICAgICAgICAgICB0b2stPmxpbmVfc3RhcnQgPSB0b2stPmN1cjsKKyAgICAgICAgICAgIHRvay0+bGluZW5vKys7CisgICAgICAgICAgICB0b2stPmlucCA9IGVuZDsKKyAgICAgICAgICAgIHJldHVybiBQeV9DSEFSTUFTSygqdG9rLT5jdXIrKyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvay0+cHJvbXB0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoYXIgKm5ld3RvayA9IFB5T1NfUmVhZGxpbmUoc3RkaW4sIHN0ZG91dCwgdG9rLT5wcm9tcHQpOworICAgICAgICAgICAgaWYgKHRvay0+bmV4dHByb21wdCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHRvay0+cHJvbXB0ID0gdG9rLT5uZXh0cHJvbXB0OworICAgICAgICAgICAgaWYgKG5ld3RvayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfSU5UUjsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpuZXd0b2sgPT0gJ1wwJykgeworICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUobmV3dG9rKTsKKyAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0VPRjsKKyAgICAgICAgICAgIH0KICNpZiAhZGVmaW5lZChQR0VOKSAmJiBkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpCi0JCQllbHNlIGlmICh0b2tfc3RkaW5fZGVjb2RlKHRvaywgJm5ld3RvaykgIT0gMCkKLQkJCQlQeU1lbV9GUkVFKG5ld3Rvayk7CisgICAgICAgICAgICBlbHNlIGlmICh0b2tfc3RkaW5fZGVjb2RlKHRvaywgJm5ld3RvaykgIT0gMCkKKyAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKG5ld3Rvayk7CiAjZW5kaWYKLQkJCWVsc2UgaWYgKHRvay0+c3RhcnQgIT0gTlVMTCkgewotCQkJCXNpemVfdCBzdGFydCA9IHRvay0+c3RhcnQgLSB0b2stPmJ1ZjsKLQkJCQlzaXplX3Qgb2xkbGVuID0gdG9rLT5jdXIgLSB0b2stPmJ1ZjsKLQkJCQlzaXplX3QgbmV3bGVuID0gb2xkbGVuICsgc3RybGVuKG5ld3Rvayk7Ci0JCQkJY2hhciAqYnVmID0gdG9rLT5idWY7Ci0JCQkJYnVmID0gKGNoYXIgKilQeU1lbV9SRUFMTE9DKGJ1ZiwgbmV3bGVuKzEpOwotCQkJCXRvay0+bGluZW5vKys7Ci0JCQkJaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCQkJCVB5TWVtX0ZSRUUodG9rLT5idWYpOwotCQkJCQl0b2stPmJ1ZiA9IE5VTEw7Ci0JCQkJCVB5TWVtX0ZSRUUobmV3dG9rKTsKLQkJCQkJdG9rLT5kb25lID0gRV9OT01FTTsKLQkJCQkJcmV0dXJuIEVPRjsKLQkJCQl9Ci0JCQkJdG9rLT5idWYgPSBidWY7Ci0JCQkJdG9rLT5jdXIgPSB0b2stPmJ1ZiArIG9sZGxlbjsKLQkJCQl0b2stPmxpbmVfc3RhcnQgPSB0b2stPmN1cjsKLQkJCQlzdHJjcHkodG9rLT5idWYgKyBvbGRsZW4sIG5ld3Rvayk7Ci0JCQkJUHlNZW1fRlJFRShuZXd0b2spOwotCQkJCXRvay0+aW5wID0gdG9rLT5idWYgKyBuZXdsZW47Ci0JCQkJdG9rLT5lbmQgPSB0b2stPmlucCArIDE7Ci0JCQkJdG9rLT5zdGFydCA9IHRvay0+YnVmICsgc3RhcnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0b2stPmxpbmVubysrOwotCQkJCWlmICh0b2stPmJ1ZiAhPSBOVUxMKQotCQkJCQlQeU1lbV9GUkVFKHRvay0+YnVmKTsKLQkJCQl0b2stPmJ1ZiA9IG5ld3RvazsKLQkJCQl0b2stPmxpbmVfc3RhcnQgPSB0b2stPmJ1ZjsKLQkJCQl0b2stPmN1ciA9IHRvay0+YnVmOwotCQkJCXRvay0+bGluZV9zdGFydCA9IHRvay0+YnVmOwotCQkJCXRvay0+aW5wID0gc3RyY2hyKHRvay0+YnVmLCAnXDAnKTsKLQkJCQl0b2stPmVuZCA9IHRvay0+aW5wICsgMTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWludCBkb25lID0gMDsKLQkJCVB5X3NzaXplX3QgY3VyID0gMDsKLQkJCWNoYXIgKnB0OwotCQkJaWYgKHRvay0+c3RhcnQgPT0gTlVMTCkgewotCQkJCWlmICh0b2stPmJ1ZiA9PSBOVUxMKSB7Ci0JCQkJCXRvay0+YnVmID0gKGNoYXIgKikKLQkJCQkJCVB5TWVtX01BTExPQyhCVUZTSVopOwotCQkJCQlpZiAodG9rLT5idWYgPT0gTlVMTCkgewotCQkJCQkJdG9rLT5kb25lID0gRV9OT01FTTsKLQkJCQkJCXJldHVybiBFT0Y7Ci0JCQkJCX0KLQkJCQkJdG9rLT5lbmQgPSB0b2stPmJ1ZiArIEJVRlNJWjsKLQkJCQl9Ci0JCQkJaWYgKGRlY29kaW5nX2ZnZXRzKHRvay0+YnVmLCAoaW50KSh0b2stPmVuZCAtIHRvay0+YnVmKSwKLQkJCQkJICB0b2spID09IE5VTEwpIHsKLQkJCQkJdG9rLT5kb25lID0gRV9FT0Y7Ci0JCQkJCWRvbmUgPSAxOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdG9rLT5kb25lID0gRV9PSzsKLQkJCQkJdG9rLT5pbnAgPSBzdHJjaHIodG9rLT5idWYsICdcMCcpOwotCQkJCQlkb25lID0gdG9rLT5pbnBbLTFdID09ICdcbic7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY3VyID0gdG9rLT5jdXIgLSB0b2stPmJ1ZjsKLQkJCQlpZiAoZGVjb2RpbmdfZmVvZih0b2spKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfRU9GOwotCQkJCQlkb25lID0gMTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQl0b2stPmRvbmUgPSBFX09LOwotCQkJfQotCQkJdG9rLT5saW5lbm8rKzsKLQkJCS8qIFJlYWQgdW50aWwgJ1xuJyBvciBFT0YgKi8KLQkJCXdoaWxlICghZG9uZSkgewotCQkJCVB5X3NzaXplX3QgY3Vyc3RhcnQgPSB0b2stPnN0YXJ0ID09IE5VTEwgPyAtMSA6Ci0JCQkJCSAgICAgICAgICB0b2stPnN0YXJ0IC0gdG9rLT5idWY7Ci0JCQkJUHlfc3NpemVfdCBjdXJ2YWxpZCA9IHRvay0+aW5wIC0gdG9rLT5idWY7Ci0JCQkJUHlfc3NpemVfdCBuZXdzaXplID0gY3VydmFsaWQgKyBCVUZTSVo7Ci0JCQkJY2hhciAqbmV3YnVmID0gdG9rLT5idWY7Ci0JCQkJbmV3YnVmID0gKGNoYXIgKilQeU1lbV9SRUFMTE9DKG5ld2J1ZiwKLQkJCQkJCQkgICAgICAgbmV3c2l6ZSk7Ci0JCQkJaWYgKG5ld2J1ZiA9PSBOVUxMKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfTk9NRU07Ci0JCQkJCXRvay0+Y3VyID0gdG9rLT5pbnA7Ci0JCQkJCXJldHVybiBFT0Y7Ci0JCQkJfQotCQkJCXRvay0+YnVmID0gbmV3YnVmOwotCQkJCXRvay0+aW5wID0gdG9rLT5idWYgKyBjdXJ2YWxpZDsKLQkJCQl0b2stPmVuZCA9IHRvay0+YnVmICsgbmV3c2l6ZTsKLQkJCQl0b2stPnN0YXJ0ID0gY3Vyc3RhcnQgPCAwID8gTlVMTCA6Ci0JCQkJCSAgICAgdG9rLT5idWYgKyBjdXJzdGFydDsKLQkJCQlpZiAoZGVjb2RpbmdfZmdldHModG9rLT5pbnAsCi0JCQkJCSAgICAgICAoaW50KSh0b2stPmVuZCAtIHRvay0+aW5wKSwKLQkJCQkJICAgICAgIHRvaykgPT0gTlVMTCkgewotCQkJCQkvKiBCcmVhayBvdXQgZWFybHkgb24gZGVjb2RpbmcKLQkJCQkJICAgZXJyb3JzLCBhcyB0b2stPmJ1ZiB3aWxsIGJlIE5VTEwKLQkJCQkJICovCi0JCQkJCWlmICh0b2stPmRlY29kaW5nX2VycmVkKQotCQkJCQkJcmV0dXJuIEVPRjsKLQkJCQkJLyogTGFzdCBsaW5lIGRvZXMgbm90IGVuZCBpbiBcbiwKLQkJCQkJICAgZmFrZSBvbmUgKi8KLQkJCQkJc3RyY3B5KHRvay0+aW5wLCAiXG4iKTsKLQkJCQl9Ci0JCQkJdG9rLT5pbnAgPSBzdHJjaHIodG9rLT5pbnAsICdcMCcpOwotCQkJCWRvbmUgPSB0b2stPmlucFstMV0gPT0gJ1xuJzsKLQkJCX0KLQkJCWlmICh0b2stPmJ1ZiAhPSBOVUxMKSB7Ci0JCQkJdG9rLT5jdXIgPSB0b2stPmJ1ZiArIGN1cjsKLQkJCQl0b2stPmxpbmVfc3RhcnQgPSB0b2stPmN1cjsKLQkJCQkvKiByZXBsYWNlICJcclxuIiB3aXRoICJcbiIgKi8KLQkJCQkvKiBGb3IgTWFjIGxlYXZlIHRoZSBcciwgZ2l2aW5nIGEgc3ludGF4IGVycm9yICovCi0JCQkJcHQgPSB0b2stPmlucCAtIDI7Ci0JCQkJaWYgKHB0ID49IHRvay0+YnVmICYmICpwdCA9PSAnXHInKSB7Ci0JCQkJCSpwdCsrID0gJ1xuJzsKLQkJCQkJKnB0ID0gJ1wwJzsKLQkJCQkJdG9rLT5pbnAgPSBwdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHRvay0+ZG9uZSAhPSBFX09LKSB7Ci0JCQlpZiAodG9rLT5wcm9tcHQgIT0gTlVMTCkKLQkJCQlQeVN5c19Xcml0ZVN0ZGVycigiXG4iKTsKLQkJCXRvay0+Y3VyID0gdG9rLT5pbnA7Ci0JCQlyZXR1cm4gRU9GOwotCQl9Ci0JfQotCS8qTk9UUkVBQ0hFRCovCisgICAgICAgICAgICBlbHNlIGlmICh0b2stPnN0YXJ0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc3RhcnQgPSB0b2stPnN0YXJ0IC0gdG9rLT5idWY7CisgICAgICAgICAgICAgICAgc2l6ZV90IG9sZGxlbiA9IHRvay0+Y3VyIC0gdG9rLT5idWY7CisgICAgICAgICAgICAgICAgc2l6ZV90IG5ld2xlbiA9IG9sZGxlbiArIHN0cmxlbihuZXd0b2spOworICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZiA9IHRvay0+YnVmOworICAgICAgICAgICAgICAgIGJ1ZiA9IChjaGFyICopUHlNZW1fUkVBTExPQyhidWYsIG5ld2xlbisxKTsKKyAgICAgICAgICAgICAgICB0b2stPmxpbmVubysrOworICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKHRvay0+YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5idWYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBQeU1lbV9GUkVFKG5ld3Rvayk7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfTk9NRU07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFT0Y7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvay0+YnVmID0gYnVmOworICAgICAgICAgICAgICAgIHRvay0+Y3VyID0gdG9rLT5idWYgKyBvbGRsZW47CisgICAgICAgICAgICAgICAgdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5jdXI7CisgICAgICAgICAgICAgICAgc3RyY3B5KHRvay0+YnVmICsgb2xkbGVuLCBuZXd0b2spOworICAgICAgICAgICAgICAgIFB5TWVtX0ZSRUUobmV3dG9rKTsKKyAgICAgICAgICAgICAgICB0b2stPmlucCA9IHRvay0+YnVmICsgbmV3bGVuOworICAgICAgICAgICAgICAgIHRvay0+ZW5kID0gdG9rLT5pbnAgKyAxOworICAgICAgICAgICAgICAgIHRvay0+c3RhcnQgPSB0b2stPmJ1ZiArIHN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdG9rLT5saW5lbm8rKzsKKyAgICAgICAgICAgICAgICBpZiAodG9rLT5idWYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgUHlNZW1fRlJFRSh0b2stPmJ1Zik7CisgICAgICAgICAgICAgICAgdG9rLT5idWYgPSBuZXd0b2s7CisgICAgICAgICAgICAgICAgdG9rLT5saW5lX3N0YXJ0ID0gdG9rLT5idWY7CisgICAgICAgICAgICAgICAgdG9rLT5jdXIgPSB0b2stPmJ1ZjsKKyAgICAgICAgICAgICAgICB0b2stPmxpbmVfc3RhcnQgPSB0b2stPmJ1ZjsKKyAgICAgICAgICAgICAgICB0b2stPmlucCA9IHN0cmNocih0b2stPmJ1ZiwgJ1wwJyk7CisgICAgICAgICAgICAgICAgdG9rLT5lbmQgPSB0b2stPmlucCArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgZG9uZSA9IDA7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGN1ciA9IDA7CisgICAgICAgICAgICBjaGFyICpwdDsKKyAgICAgICAgICAgIGlmICh0b2stPnN0YXJ0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAodG9rLT5idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB0b2stPmJ1ZiA9IChjaGFyICopCisgICAgICAgICAgICAgICAgICAgICAgICBQeU1lbV9NQUxMT0MoQlVGU0laKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRvay0+YnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZW5kID0gdG9rLT5idWYgKyBCVUZTSVo7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkZWNvZGluZ19mZ2V0cyh0b2stPmJ1ZiwgKGludCkodG9rLT5lbmQgLSB0b2stPmJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRvaykgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0VPRjsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX09LOworICAgICAgICAgICAgICAgICAgICB0b2stPmlucCA9IHN0cmNocih0b2stPmJ1ZiwgJ1wwJyk7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0b2stPmlucFstMV0gPT0gJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdXIgPSB0b2stPmN1ciAtIHRvay0+YnVmOworICAgICAgICAgICAgICAgIGlmIChkZWNvZGluZ19mZW9mKHRvaykpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9FT0Y7CisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfT0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b2stPmxpbmVubysrOworICAgICAgICAgICAgLyogUmVhZCB1bnRpbCAnXG4nIG9yIEVPRiAqLworICAgICAgICAgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBjdXJzdGFydCA9IHRvay0+c3RhcnQgPT0gTlVMTCA/IC0xIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT5zdGFydCAtIHRvay0+YnVmOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY3VydmFsaWQgPSB0b2stPmlucCAtIHRvay0+YnVmOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbmV3c2l6ZSA9IGN1cnZhbGlkICsgQlVGU0laOworICAgICAgICAgICAgICAgIGNoYXIgKm5ld2J1ZiA9IHRvay0+YnVmOworICAgICAgICAgICAgICAgIG5ld2J1ZiA9IChjaGFyICopUHlNZW1fUkVBTExPQyhuZXdidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NpemUpOworICAgICAgICAgICAgICAgIGlmIChuZXdidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX05PTUVNOworICAgICAgICAgICAgICAgICAgICB0b2stPmN1ciA9IHRvay0+aW5wOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b2stPmJ1ZiA9IG5ld2J1ZjsKKyAgICAgICAgICAgICAgICB0b2stPmlucCA9IHRvay0+YnVmICsgY3VydmFsaWQ7CisgICAgICAgICAgICAgICAgdG9rLT5lbmQgPSB0b2stPmJ1ZiArIG5ld3NpemU7CisgICAgICAgICAgICAgICAgdG9rLT5zdGFydCA9IGN1cnN0YXJ0IDwgMCA/IE5VTEwgOgorICAgICAgICAgICAgICAgICAgICAgICAgIHRvay0+YnVmICsgY3Vyc3RhcnQ7CisgICAgICAgICAgICAgICAgaWYgKGRlY29kaW5nX2ZnZXRzKHRvay0+aW5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKHRvay0+ZW5kIC0gdG9rLT5pbnApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvaykgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvKiBCcmVhayBvdXQgZWFybHkgb24gZGVjb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCBhcyB0b2stPmJ1ZiB3aWxsIGJlIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICh0b2stPmRlY29kaW5nX2VycmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVPRjsKKyAgICAgICAgICAgICAgICAgICAgLyogTGFzdCBsaW5lIGRvZXMgbm90IGVuZCBpbiBcbiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFrZSBvbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHRvay0+aW5wLCAiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG9rLT5pbnAgPSBzdHJjaHIodG9rLT5pbnAsICdcMCcpOworICAgICAgICAgICAgICAgIGRvbmUgPSB0b2stPmlucFstMV0gPT0gJ1xuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0b2stPmJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdG9rLT5jdXIgPSB0b2stPmJ1ZiArIGN1cjsKKyAgICAgICAgICAgICAgICB0b2stPmxpbmVfc3RhcnQgPSB0b2stPmN1cjsKKyAgICAgICAgICAgICAgICAvKiByZXBsYWNlICJcclxuIiB3aXRoICJcbiIgKi8KKyAgICAgICAgICAgICAgICAvKiBGb3IgTWFjIGxlYXZlIHRoZSBcciwgZ2l2aW5nIGEgc3ludGF4IGVycm9yICovCisgICAgICAgICAgICAgICAgcHQgPSB0b2stPmlucCAtIDI7CisgICAgICAgICAgICAgICAgaWYgKHB0ID49IHRvay0+YnVmICYmICpwdCA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgICAgICpwdCsrID0gJ1xuJzsKKyAgICAgICAgICAgICAgICAgICAgKnB0ID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5pbnAgPSBwdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvay0+ZG9uZSAhPSBFX09LKSB7CisgICAgICAgICAgICBpZiAodG9rLT5wcm9tcHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiXG4iKTsKKyAgICAgICAgICAgIHRvay0+Y3VyID0gdG9rLT5pbnA7CisgICAgICAgICAgICByZXR1cm4gRU9GOworICAgICAgICB9CisgICAgfQorICAgIC8qTk9UUkVBQ0hFRCovCiB9CiAKIApAQCAtOTUxLDEyICs5NTEsMTIgQEAKIHN0YXRpYyB2b2lkCiB0b2tfYmFja3VwKHJlZ2lzdGVyIHN0cnVjdCB0b2tfc3RhdGUgKnRvaywgcmVnaXN0ZXIgaW50IGMpCiB7Ci0JaWYgKGMgIT0gRU9GKSB7Ci0JCWlmICgtLXRvay0+Y3VyIDwgdG9rLT5idWYpCi0JCQlQeV9GYXRhbEVycm9yKCJ0b2tfYmFja3VwOiBiZWdpbiBvZiBidWZmZXIiKTsKLQkJaWYgKCp0b2stPmN1ciAhPSBjKQotCQkJKnRvay0+Y3VyID0gYzsKLQl9CisgICAgaWYgKGMgIT0gRU9GKSB7CisgICAgICAgIGlmICgtLXRvay0+Y3VyIDwgdG9rLT5idWYpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJ0b2tfYmFja3VwOiBiZWdpbiBvZiBidWZmZXIiKTsKKyAgICAgICAgaWYgKCp0b2stPmN1ciAhPSBjKQorICAgICAgICAgICAgKnRvay0+Y3VyID0gYzsKKyAgICB9CiB9CiAKIApAQCAtOTY1LDE3MSArOTY1LDE3MSBAQAogaW50CiBQeVRva2VuX09uZUNoYXIoaW50IGMpCiB7Ci0Jc3dpdGNoIChjKSB7Ci0JY2FzZSAnKCc6CXJldHVybiBMUEFSOwotCWNhc2UgJyknOglyZXR1cm4gUlBBUjsKLQljYXNlICdbJzoJcmV0dXJuIExTUUI7Ci0JY2FzZSAnXSc6CXJldHVybiBSU1FCOwotCWNhc2UgJzonOglyZXR1cm4gQ09MT047Ci0JY2FzZSAnLCc6CXJldHVybiBDT01NQTsKLQljYXNlICc7JzoJcmV0dXJuIFNFTUk7Ci0JY2FzZSAnKyc6CXJldHVybiBQTFVTOwotCWNhc2UgJy0nOglyZXR1cm4gTUlOVVM7Ci0JY2FzZSAnKic6CXJldHVybiBTVEFSOwotCWNhc2UgJy8nOglyZXR1cm4gU0xBU0g7Ci0JY2FzZSAnfCc6CXJldHVybiBWQkFSOwotCWNhc2UgJyYnOglyZXR1cm4gQU1QRVI7Ci0JY2FzZSAnPCc6CXJldHVybiBMRVNTOwotCWNhc2UgJz4nOglyZXR1cm4gR1JFQVRFUjsKLQljYXNlICc9JzoJcmV0dXJuIEVRVUFMOwotCWNhc2UgJy4nOglyZXR1cm4gRE9UOwotCWNhc2UgJyUnOglyZXR1cm4gUEVSQ0VOVDsKLQljYXNlICdgJzoJcmV0dXJuIEJBQ0tRVU9URTsKLQljYXNlICd7JzoJcmV0dXJuIExCUkFDRTsKLQljYXNlICd9JzoJcmV0dXJuIFJCUkFDRTsKLQljYXNlICdeJzoJcmV0dXJuIENJUkNVTUZMRVg7Ci0JY2FzZSAnfic6CXJldHVybiBUSUxERTsKLQljYXNlICdAJzogICAgICAgcmV0dXJuIEFUOwotCWRlZmF1bHQ6CXJldHVybiBPUDsKLQl9CisgICAgc3dpdGNoIChjKSB7CisgICAgY2FzZSAnKCc6ICAgICAgICAgICByZXR1cm4gTFBBUjsKKyAgICBjYXNlICcpJzogICAgICAgICAgIHJldHVybiBSUEFSOworICAgIGNhc2UgJ1snOiAgICAgICAgICAgcmV0dXJuIExTUUI7CisgICAgY2FzZSAnXSc6ICAgICAgICAgICByZXR1cm4gUlNRQjsKKyAgICBjYXNlICc6JzogICAgICAgICAgIHJldHVybiBDT0xPTjsKKyAgICBjYXNlICcsJzogICAgICAgICAgIHJldHVybiBDT01NQTsKKyAgICBjYXNlICc7JzogICAgICAgICAgIHJldHVybiBTRU1JOworICAgIGNhc2UgJysnOiAgICAgICAgICAgcmV0dXJuIFBMVVM7CisgICAgY2FzZSAnLSc6ICAgICAgICAgICByZXR1cm4gTUlOVVM7CisgICAgY2FzZSAnKic6ICAgICAgICAgICByZXR1cm4gU1RBUjsKKyAgICBjYXNlICcvJzogICAgICAgICAgIHJldHVybiBTTEFTSDsKKyAgICBjYXNlICd8JzogICAgICAgICAgIHJldHVybiBWQkFSOworICAgIGNhc2UgJyYnOiAgICAgICAgICAgcmV0dXJuIEFNUEVSOworICAgIGNhc2UgJzwnOiAgICAgICAgICAgcmV0dXJuIExFU1M7CisgICAgY2FzZSAnPic6ICAgICAgICAgICByZXR1cm4gR1JFQVRFUjsKKyAgICBjYXNlICc9JzogICAgICAgICAgIHJldHVybiBFUVVBTDsKKyAgICBjYXNlICcuJzogICAgICAgICAgIHJldHVybiBET1Q7CisgICAgY2FzZSAnJSc6ICAgICAgICAgICByZXR1cm4gUEVSQ0VOVDsKKyAgICBjYXNlICdgJzogICAgICAgICAgIHJldHVybiBCQUNLUVVPVEU7CisgICAgY2FzZSAneyc6ICAgICAgICAgICByZXR1cm4gTEJSQUNFOworICAgIGNhc2UgJ30nOiAgICAgICAgICAgcmV0dXJuIFJCUkFDRTsKKyAgICBjYXNlICdeJzogICAgICAgICAgIHJldHVybiBDSVJDVU1GTEVYOworICAgIGNhc2UgJ34nOiAgICAgICAgICAgcmV0dXJuIFRJTERFOworICAgIGNhc2UgJ0AnOiAgICAgICByZXR1cm4gQVQ7CisgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gT1A7CisgICAgfQogfQogCiAKIGludAogUHlUb2tlbl9Ud29DaGFycyhpbnQgYzEsIGludCBjMikKIHsKLQlzd2l0Y2ggKGMxKSB7Ci0JY2FzZSAnPSc6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPSc6CXJldHVybiBFUUVRVUFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJyEnOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz0nOglyZXR1cm4gTk9URVFVQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnPCc6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPic6CXJldHVybiBOT1RFUVVBTDsKLQkJY2FzZSAnPSc6CXJldHVybiBMRVNTRVFVQUw7Ci0JCWNhc2UgJzwnOglyZXR1cm4gTEVGVFNISUZUOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJz4nOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJz0nOglyZXR1cm4gR1JFQVRFUkVRVUFMOwotCQljYXNlICc+JzoJcmV0dXJuIFJJR0hUU0hJRlQ7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnKyc6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPSc6CXJldHVybiBQTFVTRVFVQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnLSc6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPSc6CXJldHVybiBNSU5FUVVBTDsKLQkJfQotCQlicmVhazsKLQljYXNlICcqJzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICcqJzoJcmV0dXJuIERPVUJMRVNUQVI7Ci0JCWNhc2UgJz0nOglyZXR1cm4gU1RBUkVRVUFMOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgJy8nOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJy8nOglyZXR1cm4gRE9VQkxFU0xBU0g7Ci0JCWNhc2UgJz0nOglyZXR1cm4gU0xBU0hFUVVBTDsKLQkJfQotCQlicmVhazsKLQljYXNlICd8JzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc9JzoJcmV0dXJuIFZCQVJFUVVBTDsKLQkJfQotCQlicmVhazsKLQljYXNlICclJzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc9JzoJcmV0dXJuIFBFUkNFTlRFUVVBTDsKLQkJfQotCQlicmVhazsKLQljYXNlICcmJzoKLQkJc3dpdGNoIChjMikgewotCQljYXNlICc9JzoJcmV0dXJuIEFNUEVSRVFVQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnXic6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPSc6CXJldHVybiBDSVJDVU1GTEVYRVFVQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCXJldHVybiBPUDsKKyAgICBzd2l0Y2ggKGMxKSB7CisgICAgY2FzZSAnPSc6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIEVRRVFVQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnISc6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIE5PVEVRVUFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJzwnOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz4nOiAgICAgICAgICAgICAgIHJldHVybiBOT1RFUVVBTDsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIExFU1NFUVVBTDsKKyAgICAgICAgY2FzZSAnPCc6ICAgICAgICAgICAgICAgcmV0dXJuIExFRlRTSElGVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICc+JzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gR1JFQVRFUkVRVUFMOworICAgICAgICBjYXNlICc+JzogICAgICAgICAgICAgICByZXR1cm4gUklHSFRTSElGVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICcrJzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gUExVU0VRVUFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJy0nOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBNSU5FUVVBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICcqJzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICcqJzogICAgICAgICAgICAgICByZXR1cm4gRE9VQkxFU1RBUjsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIFNUQVJFUVVBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICcvJzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICcvJzogICAgICAgICAgICAgICByZXR1cm4gRE9VQkxFU0xBU0g7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBTTEFTSEVRVUFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ3wnOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJz0nOiAgICAgICAgICAgICAgIHJldHVybiBWQkFSRVFVQUw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnJSc6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPSc6ICAgICAgICAgICAgICAgcmV0dXJuIFBFUkNFTlRFUVVBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICcmJzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gQU1QRVJFUVVBTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICdeJzoKKyAgICAgICAgc3dpdGNoIChjMikgeworICAgICAgICBjYXNlICc9JzogICAgICAgICAgICAgICByZXR1cm4gQ0lSQ1VNRkxFWEVRVUFMOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gT1A7CiB9CiAKIGludAogUHlUb2tlbl9UaHJlZUNoYXJzKGludCBjMSwgaW50IGMyLCBpbnQgYzMpCiB7Ci0Jc3dpdGNoIChjMSkgewotCWNhc2UgJzwnOgotCQlzd2l0Y2ggKGMyKSB7Ci0JCWNhc2UgJzwnOgotCQkJc3dpdGNoIChjMykgewotCQkJY2FzZSAnPSc6Ci0JCQkJcmV0dXJuIExFRlRTSElGVEVRVUFMOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnPic6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnPic6Ci0JCQlzd2l0Y2ggKGMzKSB7Ci0JCQljYXNlICc9JzoKLQkJCQlyZXR1cm4gUklHSFRTSElGVEVRVUFMOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnKic6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnKic6Ci0JCQlzd2l0Y2ggKGMzKSB7Ci0JCQljYXNlICc9JzoKLQkJCQlyZXR1cm4gRE9VQkxFU1RBUkVRVUFMOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAnLyc6Ci0JCXN3aXRjaCAoYzIpIHsKLQkJY2FzZSAnLyc6Ci0JCQlzd2l0Y2ggKGMzKSB7Ci0JCQljYXNlICc9JzoKLQkJCQlyZXR1cm4gRE9VQkxFU0xBU0hFUVVBTDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gT1A7CisgICAgc3dpdGNoIChjMSkgeworICAgIGNhc2UgJzwnOgorICAgICAgICBzd2l0Y2ggKGMyKSB7CisgICAgICAgIGNhc2UgJzwnOgorICAgICAgICAgICAgc3dpdGNoIChjMykgeworICAgICAgICAgICAgY2FzZSAnPSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIExFRlRTSElGVEVRVUFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnPic6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICBzd2l0Y2ggKGMzKSB7CisgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gUklHSFRTSElGVEVRVUFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnKic6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnKic6CisgICAgICAgICAgICBzd2l0Y2ggKGMzKSB7CisgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gRE9VQkxFU1RBUkVRVUFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnLyc6CisgICAgICAgIHN3aXRjaCAoYzIpIHsKKyAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICBzd2l0Y2ggKGMzKSB7CisgICAgICAgICAgICBjYXNlICc9JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gRE9VQkxFU0xBU0hFUVVBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gT1A7CiB9CiAKIHN0YXRpYyBpbnQKIGluZGVudGVycm9yKHN0cnVjdCB0b2tfc3RhdGUgKnRvaykKIHsKLQlpZiAodG9rLT5hbHRlcnJvcikgewotCQl0b2stPmRvbmUgPSBFX1RBQlNQQUNFOwotCQl0b2stPmN1ciA9IHRvay0+aW5wOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKHRvay0+YWx0d2FybmluZykgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiJXM6IGluY29uc2lzdGVudCB1c2Ugb2YgdGFicyBhbmQgc3BhY2VzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gaW5kZW50YXRpb25cbiIsIHRvay0+ZmlsZW5hbWUpOwotCQl0b2stPmFsdHdhcm5pbmcgPSAwOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAodG9rLT5hbHRlcnJvcikgeworICAgICAgICB0b2stPmRvbmUgPSBFX1RBQlNQQUNFOworICAgICAgICB0b2stPmN1ciA9IHRvay0+aW5wOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKHRvay0+YWx0d2FybmluZykgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiJXM6IGluY29uc2lzdGVudCB1c2Ugb2YgdGFicyBhbmQgc3BhY2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImluIGluZGVudGF0aW9uXG4iLCB0b2stPmZpbGVuYW1lKTsKKyAgICAgICAgdG9rLT5hbHR3YXJuaW5nID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTEzOCw0NjYgKzExMzgsNDY2IEBACiBzdGF0aWMgaW50CiB0b2tfZ2V0KHJlZ2lzdGVyIHN0cnVjdCB0b2tfc3RhdGUgKnRvaywgY2hhciAqKnBfc3RhcnQsIGNoYXIgKipwX2VuZCkKIHsKLQlyZWdpc3RlciBpbnQgYzsKLQlpbnQgYmxhbmtsaW5lOworICAgIHJlZ2lzdGVyIGludCBjOworICAgIGludCBibGFua2xpbmU7CiAKLQkqcF9zdGFydCA9ICpwX2VuZCA9IE5VTEw7CisgICAgKnBfc3RhcnQgPSAqcF9lbmQgPSBOVUxMOwogICBuZXh0bGluZToKLQl0b2stPnN0YXJ0ID0gTlVMTDsKLQlibGFua2xpbmUgPSAwOworICAgIHRvay0+c3RhcnQgPSBOVUxMOworICAgIGJsYW5rbGluZSA9IDA7CiAKLQkvKiBHZXQgaW5kZW50YXRpb24gbGV2ZWwgKi8KLQlpZiAodG9rLT5hdGJvbCkgewotCQlyZWdpc3RlciBpbnQgY29sID0gMDsKLQkJcmVnaXN0ZXIgaW50IGFsdGNvbCA9IDA7Ci0JCXRvay0+YXRib2wgPSAwOwotCQlmb3IgKDs7KSB7Ci0JCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQlpZiAoYyA9PSAnICcpCi0JCQkJY29sKyssIGFsdGNvbCsrOwotCQkJZWxzZSBpZiAoYyA9PSAnXHQnKSB7Ci0JCQkJY29sID0gKGNvbC90b2stPnRhYnNpemUgKyAxKSAqIHRvay0+dGFic2l6ZTsKLQkJCQlhbHRjb2wgPSAoYWx0Y29sL3Rvay0+YWx0dGFic2l6ZSArIDEpCi0JCQkJCSogdG9rLT5hbHR0YWJzaXplOwotCQkJfQotCQkJZWxzZSBpZiAoYyA9PSAnXDAxNCcpIC8qIENvbnRyb2wtTCAoZm9ybWZlZWQpICovCi0JCQkJY29sID0gYWx0Y29sID0gMDsgLyogRm9yIEVtYWNzIHVzZXJzICovCi0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQlpZiAoYyA9PSAnIycgfHwgYyA9PSAnXG4nKSB7Ci0JCQkvKiBMaW5lcyB3aXRoIG9ubHkgd2hpdGVzcGFjZSBhbmQvb3IgY29tbWVudHMKLQkJCSAgIHNob3VsZG4ndCBhZmZlY3QgdGhlIGluZGVudGF0aW9uIGFuZCBhcmUKLQkJCSAgIG5vdCBwYXNzZWQgdG8gdGhlIHBhcnNlciBhcyBORVdMSU5FIHRva2VucywKLQkJCSAgIGV4Y2VwdCAqdG90YWxseSogZW1wdHkgbGluZXMgaW4gaW50ZXJhY3RpdmUKLQkJCSAgIG1vZGUsIHdoaWNoIHNpZ25hbCB0aGUgZW5kIG9mIGEgY29tbWFuZCBncm91cC4gKi8KLQkJCWlmIChjb2wgPT0gMCAmJiBjID09ICdcbicgJiYgdG9rLT5wcm9tcHQgIT0gTlVMTCkKLQkJCQlibGFua2xpbmUgPSAwOyAvKiBMZXQgaXQgdGhyb3VnaCAqLwotCQkJZWxzZQotCQkJCWJsYW5rbGluZSA9IDE7IC8qIElnbm9yZSBjb21wbGV0ZWx5ICovCi0JCQkvKiBXZSBjYW4ndCBqdW1wIGJhY2sgcmlnaHQgaGVyZSBzaW5jZSB3ZSBzdGlsbAotCQkJICAgbWF5IG5lZWQgdG8gc2tpcCB0byB0aGUgZW5kIG9mIGEgY29tbWVudCAqLwotCQl9Ci0JCWlmICghYmxhbmtsaW5lICYmIHRvay0+bGV2ZWwgPT0gMCkgewotCQkJaWYgKGNvbCA9PSB0b2stPmluZHN0YWNrW3Rvay0+aW5kZW50XSkgewotCQkJCS8qIE5vIGNoYW5nZSAqLwotCQkJCWlmIChhbHRjb2wgIT0gdG9rLT5hbHRpbmRzdGFja1t0b2stPmluZGVudF0pIHsKLQkJCQkJaWYgKGluZGVudGVycm9yKHRvaykpCi0JCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjb2wgPiB0b2stPmluZHN0YWNrW3Rvay0+aW5kZW50XSkgewotCQkJCS8qIEluZGVudCAtLSBhbHdheXMgb25lICovCi0JCQkJaWYgKHRvay0+aW5kZW50KzEgPj0gTUFYSU5ERU5UKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfVE9PREVFUDsKLQkJCQkJdG9rLT5jdXIgPSB0b2stPmlucDsKLQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJCWlmIChhbHRjb2wgPD0gdG9rLT5hbHRpbmRzdGFja1t0b2stPmluZGVudF0pIHsKLQkJCQkJaWYgKGluZGVudGVycm9yKHRvaykpCi0JCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQkJdG9rLT5wZW5kaW4rKzsKLQkJCQl0b2stPmluZHN0YWNrWysrdG9rLT5pbmRlbnRdID0gY29sOwotCQkJCXRvay0+YWx0aW5kc3RhY2tbdG9rLT5pbmRlbnRdID0gYWx0Y29sOwotCQkJfQotCQkJZWxzZSAvKiBjb2wgPCB0b2stPmluZHN0YWNrW3Rvay0+aW5kZW50XSAqLyB7Ci0JCQkJLyogRGVkZW50IC0tIGFueSBudW1iZXIsIG11c3QgYmUgY29uc2lzdGVudCAqLwotCQkJCXdoaWxlICh0b2stPmluZGVudCA+IDAgJiYKLQkJCQkJY29sIDwgdG9rLT5pbmRzdGFja1t0b2stPmluZGVudF0pIHsKLQkJCQkJdG9rLT5wZW5kaW4tLTsKLQkJCQkJdG9rLT5pbmRlbnQtLTsKLQkJCQl9Ci0JCQkJaWYgKGNvbCAhPSB0b2stPmluZHN0YWNrW3Rvay0+aW5kZW50XSkgewotCQkJCQl0b2stPmRvbmUgPSBFX0RFREVOVDsKLQkJCQkJdG9rLT5jdXIgPSB0b2stPmlucDsKLQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJCWlmIChhbHRjb2wgIT0gdG9rLT5hbHRpbmRzdGFja1t0b2stPmluZGVudF0pIHsKLQkJCQkJaWYgKGluZGVudGVycm9yKHRvaykpCi0JCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9CisgICAgLyogR2V0IGluZGVudGF0aW9uIGxldmVsICovCisgICAgaWYgKHRvay0+YXRib2wpIHsKKyAgICAgICAgcmVnaXN0ZXIgaW50IGNvbCA9IDA7CisgICAgICAgIHJlZ2lzdGVyIGludCBhbHRjb2wgPSAwOworICAgICAgICB0b2stPmF0Ym9sID0gMDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgaWYgKGMgPT0gJyAnKQorICAgICAgICAgICAgICAgIGNvbCsrLCBhbHRjb2wrKzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1x0JykgeworICAgICAgICAgICAgICAgIGNvbCA9IChjb2wvdG9rLT50YWJzaXplICsgMSkgKiB0b2stPnRhYnNpemU7CisgICAgICAgICAgICAgICAgYWx0Y29sID0gKGFsdGNvbC90b2stPmFsdHRhYnNpemUgKyAxKQorICAgICAgICAgICAgICAgICAgICAqIHRvay0+YWx0dGFic2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1wwMTQnKSAvKiBDb250cm9sLUwgKGZvcm1mZWVkKSAqLworICAgICAgICAgICAgICAgIGNvbCA9IGFsdGNvbCA9IDA7IC8qIEZvciBFbWFjcyB1c2VycyAqLworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgaWYgKGMgPT0gJyMnIHx8IGMgPT0gJ1xuJykgeworICAgICAgICAgICAgLyogTGluZXMgd2l0aCBvbmx5IHdoaXRlc3BhY2UgYW5kL29yIGNvbW1lbnRzCisgICAgICAgICAgICAgICBzaG91bGRuJ3QgYWZmZWN0IHRoZSBpbmRlbnRhdGlvbiBhbmQgYXJlCisgICAgICAgICAgICAgICBub3QgcGFzc2VkIHRvIHRoZSBwYXJzZXIgYXMgTkVXTElORSB0b2tlbnMsCisgICAgICAgICAgICAgICBleGNlcHQgKnRvdGFsbHkqIGVtcHR5IGxpbmVzIGluIGludGVyYWN0aXZlCisgICAgICAgICAgICAgICBtb2RlLCB3aGljaCBzaWduYWwgdGhlIGVuZCBvZiBhIGNvbW1hbmQgZ3JvdXAuICovCisgICAgICAgICAgICBpZiAoY29sID09IDAgJiYgYyA9PSAnXG4nICYmIHRvay0+cHJvbXB0ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgYmxhbmtsaW5lID0gMDsgLyogTGV0IGl0IHRocm91Z2ggKi8KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBibGFua2xpbmUgPSAxOyAvKiBJZ25vcmUgY29tcGxldGVseSAqLworICAgICAgICAgICAgLyogV2UgY2FuJ3QganVtcCBiYWNrIHJpZ2h0IGhlcmUgc2luY2Ugd2Ugc3RpbGwKKyAgICAgICAgICAgICAgIG1heSBuZWVkIHRvIHNraXAgdG8gdGhlIGVuZCBvZiBhIGNvbW1lbnQgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoIWJsYW5rbGluZSAmJiB0b2stPmxldmVsID09IDApIHsKKyAgICAgICAgICAgIGlmIChjb2wgPT0gdG9rLT5pbmRzdGFja1t0b2stPmluZGVudF0pIHsKKyAgICAgICAgICAgICAgICAvKiBObyBjaGFuZ2UgKi8KKyAgICAgICAgICAgICAgICBpZiAoYWx0Y29sICE9IHRvay0+YWx0aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRlbnRlcnJvcih0b2spKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoY29sID4gdG9rLT5pbmRzdGFja1t0b2stPmluZGVudF0pIHsKKyAgICAgICAgICAgICAgICAvKiBJbmRlbnQgLS0gYWx3YXlzIG9uZSAqLworICAgICAgICAgICAgICAgIGlmICh0b2stPmluZGVudCsxID49IE1BWElOREVOVCkgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX1RPT0RFRVA7CisgICAgICAgICAgICAgICAgICAgIHRvay0+Y3VyID0gdG9rLT5pbnA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYWx0Y29sIDw9IHRvay0+YWx0aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRlbnRlcnJvcih0b2spKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvay0+cGVuZGluKys7CisgICAgICAgICAgICAgICAgdG9rLT5pbmRzdGFja1srK3Rvay0+aW5kZW50XSA9IGNvbDsKKyAgICAgICAgICAgICAgICB0b2stPmFsdGluZHN0YWNrW3Rvay0+aW5kZW50XSA9IGFsdGNvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogY29sIDwgdG9rLT5pbmRzdGFja1t0b2stPmluZGVudF0gKi8geworICAgICAgICAgICAgICAgIC8qIERlZGVudCAtLSBhbnkgbnVtYmVyLCBtdXN0IGJlIGNvbnNpc3RlbnQgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAodG9rLT5pbmRlbnQgPiAwICYmCisgICAgICAgICAgICAgICAgICAgIGNvbCA8IHRvay0+aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+cGVuZGluLS07CisgICAgICAgICAgICAgICAgICAgIHRvay0+aW5kZW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb2wgIT0gdG9rLT5pbmRzdGFja1t0b2stPmluZGVudF0pIHsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9ERURFTlQ7CisgICAgICAgICAgICAgICAgICAgIHRvay0+Y3VyID0gdG9rLT5pbnA7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYWx0Y29sICE9IHRvay0+YWx0aW5kc3RhY2tbdG9rLT5pbmRlbnRdKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRlbnRlcnJvcih0b2spKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JdG9rLT5zdGFydCA9IHRvay0+Y3VyOworICAgIHRvay0+c3RhcnQgPSB0b2stPmN1cjsKIAotCS8qIFJldHVybiBwZW5kaW5nIGluZGVudHMvZGVkZW50cyAqLwotCWlmICh0b2stPnBlbmRpbiAhPSAwKSB7Ci0JCWlmICh0b2stPnBlbmRpbiA8IDApIHsKLQkJCXRvay0+cGVuZGluKys7Ci0JCQlyZXR1cm4gREVERU5UOwotCQl9Ci0JCWVsc2UgewotCQkJdG9rLT5wZW5kaW4tLTsKLQkJCXJldHVybiBJTkRFTlQ7Ci0JCX0KLQl9CisgICAgLyogUmV0dXJuIHBlbmRpbmcgaW5kZW50cy9kZWRlbnRzICovCisgICAgaWYgKHRvay0+cGVuZGluICE9IDApIHsKKyAgICAgICAgaWYgKHRvay0+cGVuZGluIDwgMCkgeworICAgICAgICAgICAgdG9rLT5wZW5kaW4rKzsKKyAgICAgICAgICAgIHJldHVybiBERURFTlQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0b2stPnBlbmRpbi0tOworICAgICAgICAgICAgcmV0dXJuIElOREVOVDsKKyAgICAgICAgfQorICAgIH0KIAogIGFnYWluOgotCXRvay0+c3RhcnQgPSBOVUxMOwotCS8qIFNraXAgc3BhY2VzICovCi0JZG8gewotCQljID0gdG9rX25leHRjKHRvayk7Ci0JfSB3aGlsZSAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1wwMTQnKTsKKyAgICB0b2stPnN0YXJ0ID0gTlVMTDsKKyAgICAvKiBTa2lwIHNwYWNlcyAqLworICAgIGRvIHsKKyAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgIH0gd2hpbGUgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcMDE0Jyk7CiAKLQkvKiBTZXQgc3RhcnQgb2YgY3VycmVudCB0b2tlbiAqLwotCXRvay0+c3RhcnQgPSB0b2stPmN1ciAtIDE7CisgICAgLyogU2V0IHN0YXJ0IG9mIGN1cnJlbnQgdG9rZW4gKi8KKyAgICB0b2stPnN0YXJ0ID0gdG9rLT5jdXIgLSAxOwogCi0JLyogU2tpcCBjb21tZW50LCB3aGlsZSBsb29raW5nIGZvciB0YWItc2V0dGluZyBtYWdpYyAqLwotCWlmIChjID09ICcjJykgewotCQlzdGF0aWMgY2hhciAqdGFiZm9ybXNbXSA9IHsKLQkJCSJ0YWItd2lkdGg6IiwJCS8qIEVtYWNzICovCi0JCQkiOnRhYnN0b3A9IiwJCS8qIHZpbSwgZnVsbCBmb3JtICovCi0JCQkiOnRzPSIsCQkJLyogdmltLCBhYmJyZXZpYXRlZCBmb3JtICovCi0JCQkic2V0IHRhYnNpemU9IiwJCS8qIHdpbGwgdmkgbmV2ZXIgZGllPyAqLwotCQkvKiBtb3JlIHRlbXBsYXRlcyBjYW4gYmUgYWRkZWQgaGVyZSB0byBzdXBwb3J0IG90aGVyIGVkaXRvcnMgKi8KLQkJfTsKLQkJY2hhciBjYnVmWzgwXTsKLQkJY2hhciAqdHAsICoqY3A7Ci0JCXRwID0gY2J1ZjsKLQkJZG8gewotCQkJKnRwKysgPSBjID0gdG9rX25leHRjKHRvayk7Ci0JCX0gd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJyAmJgotCQkJIChzaXplX3QpKHRwIC0gY2J1ZiArIDEpIDwgc2l6ZW9mKGNidWYpKTsKLQkJKnRwID0gJ1wwJzsKLQkJZm9yIChjcCA9IHRhYmZvcm1zOwotCQkgICAgIGNwIDwgdGFiZm9ybXMgKyBzaXplb2YodGFiZm9ybXMpL3NpemVvZih0YWJmb3Jtc1swXSk7Ci0JCSAgICAgY3ArKykgewotCQkJaWYgKCh0cCA9IHN0cnN0cihjYnVmLCAqY3ApKSkgewotCQkJCWludCBuZXdzaXplID0gYXRvaSh0cCArIHN0cmxlbigqY3ApKTsKKyAgICAvKiBTa2lwIGNvbW1lbnQsIHdoaWxlIGxvb2tpbmcgZm9yIHRhYi1zZXR0aW5nIG1hZ2ljICovCisgICAgaWYgKGMgPT0gJyMnKSB7CisgICAgICAgIHN0YXRpYyBjaGFyICp0YWJmb3Jtc1tdID0geworICAgICAgICAgICAgInRhYi13aWR0aDoiLCAgICAgICAgICAgICAgICAgICAgICAgLyogRW1hY3MgKi8KKyAgICAgICAgICAgICI6dGFic3RvcD0iLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZpbSwgZnVsbCBmb3JtICovCisgICAgICAgICAgICAiOnRzPSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aW0sIGFiYnJldmlhdGVkIGZvcm0gKi8KKyAgICAgICAgICAgICJzZXQgdGFic2l6ZT0iLCAgICAgICAgICAgICAgICAgICAgIC8qIHdpbGwgdmkgbmV2ZXIgZGllPyAqLworICAgICAgICAvKiBtb3JlIHRlbXBsYXRlcyBjYW4gYmUgYWRkZWQgaGVyZSB0byBzdXBwb3J0IG90aGVyIGVkaXRvcnMgKi8KKyAgICAgICAgfTsKKyAgICAgICAgY2hhciBjYnVmWzgwXTsKKyAgICAgICAgY2hhciAqdHAsICoqY3A7CisgICAgICAgIHRwID0gY2J1ZjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgKnRwKysgPSBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgIH0gd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJyAmJgorICAgICAgICAgICAgICAgICAoc2l6ZV90KSh0cCAtIGNidWYgKyAxKSA8IHNpemVvZihjYnVmKSk7CisgICAgICAgICp0cCA9ICdcMCc7CisgICAgICAgIGZvciAoY3AgPSB0YWJmb3JtczsKKyAgICAgICAgICAgICBjcCA8IHRhYmZvcm1zICsgc2l6ZW9mKHRhYmZvcm1zKS9zaXplb2YodGFiZm9ybXNbMF0pOworICAgICAgICAgICAgIGNwKyspIHsKKyAgICAgICAgICAgIGlmICgodHAgPSBzdHJzdHIoY2J1ZiwgKmNwKSkpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3c2l6ZSA9IGF0b2kodHAgKyBzdHJsZW4oKmNwKSk7CiAKLQkJCQlpZiAobmV3c2l6ZSA+PSAxICYmIG5ld3NpemUgPD0gNDApIHsKLQkJCQkJdG9rLT50YWJzaXplID0gbmV3c2l6ZTsKLQkJCQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJCQkgICAgUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkJCQkiVGFiIHNpemUgc2V0IHRvICVkXG4iLAotCQkJCQkJbmV3c2l6ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpCi0JCQljID0gdG9rX25leHRjKHRvayk7Ci0JfQorICAgICAgICAgICAgICAgIGlmIChuZXdzaXplID49IDEgJiYgbmV3c2l6ZSA8PSA0MCkgeworICAgICAgICAgICAgICAgICAgICB0b2stPnRhYnNpemUgPSBuZXdzaXplOworICAgICAgICAgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUYWIgc2l6ZSBzZXQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJykKKyAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICB9CiAKLQkvKiBDaGVjayBmb3IgRU9GIGFuZCBlcnJvcnMgbm93ICovCi0JaWYgKGMgPT0gRU9GKSB7Ci0JCXJldHVybiB0b2stPmRvbmUgPT0gRV9FT0YgPyBFTkRNQVJLRVIgOiBFUlJPUlRPS0VOOwotCX0KKyAgICAvKiBDaGVjayBmb3IgRU9GIGFuZCBlcnJvcnMgbm93ICovCisgICAgaWYgKGMgPT0gRU9GKSB7CisgICAgICAgIHJldHVybiB0b2stPmRvbmUgPT0gRV9FT0YgPyBFTkRNQVJLRVIgOiBFUlJPUlRPS0VOOworICAgIH0KIAotCS8qIElkZW50aWZpZXIgKG1vc3QgZnJlcXVlbnQgdG9rZW4hKSAqLwotCWlmIChpc2FscGhhKGMpIHx8IGMgPT0gJ18nKSB7Ci0JCS8qIFByb2Nlc3MgciIiLCB1IiIgYW5kIHVyIiIgKi8KLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgJ2InOgotCQljYXNlICdCJzoKLQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCWlmIChjID09ICdyJyB8fCBjID09ICdSJykKLQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQlpZiAoYyA9PSAnIicgfHwgYyA9PSAnXCcnKQotCQkJCWdvdG8gbGV0dGVyX3F1b3RlOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQljYXNlICdSJzoKLQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCWlmIChjID09ICciJyB8fCBjID09ICdcJycpCi0JCQkJZ290byBsZXR0ZXJfcXVvdGU7Ci0JCQlicmVhazsKLQkJY2FzZSAndSc6Ci0JCWNhc2UgJ1UnOgotCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJaWYgKGMgPT0gJ3InIHx8IGMgPT0gJ1InKQotCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCWlmIChjID09ICciJyB8fCBjID09ICdcJycpCi0JCQkJZ290byBsZXR0ZXJfcXVvdGU7Ci0JCQlicmVhazsKLQkJfQotCQl3aGlsZSAoaXNhbG51bShjKSB8fCBjID09ICdfJykgewotCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQl9Ci0JCXRva19iYWNrdXAodG9rLCBjKTsKLQkJKnBfc3RhcnQgPSB0b2stPnN0YXJ0OwotCQkqcF9lbmQgPSB0b2stPmN1cjsKLQkJcmV0dXJuIE5BTUU7Ci0JfQorICAgIC8qIElkZW50aWZpZXIgKG1vc3QgZnJlcXVlbnQgdG9rZW4hKSAqLworICAgIGlmIChpc2FscGhhKGMpIHx8IGMgPT0gJ18nKSB7CisgICAgICAgIC8qIFByb2Nlc3MgciIiLCB1IiIgYW5kIHVyIiIgKi8KKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgIGNhc2UgJ2InOgorICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIGlmIChjID09ICdyJyB8fCBjID09ICdSJykKKyAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICBpZiAoYyA9PSAnIicgfHwgYyA9PSAnXCcnKQorICAgICAgICAgICAgICAgIGdvdG8gbGV0dGVyX3F1b3RlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3InOgorICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIGlmIChjID09ICciJyB8fCBjID09ICdcJycpCisgICAgICAgICAgICAgICAgZ290byBsZXR0ZXJfcXVvdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgIGNhc2UgJ1UnOgorICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgaWYgKGMgPT0gJ3InIHx8IGMgPT0gJ1InKQorICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIGlmIChjID09ICciJyB8fCBjID09ICdcJycpCisgICAgICAgICAgICAgICAgZ290byBsZXR0ZXJfcXVvdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoaXNhbG51bShjKSB8fCBjID09ICdfJykgeworICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICB9CisgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgKnBfc3RhcnQgPSB0b2stPnN0YXJ0OworICAgICAgICAqcF9lbmQgPSB0b2stPmN1cjsKKyAgICAgICAgcmV0dXJuIE5BTUU7CisgICAgfQogCi0JLyogTmV3bGluZSAqLwotCWlmIChjID09ICdcbicpIHsKLQkJdG9rLT5hdGJvbCA9IDE7Ci0JCWlmIChibGFua2xpbmUgfHwgdG9rLT5sZXZlbCA+IDApCi0JCQlnb3RvIG5leHRsaW5lOwotCQkqcF9zdGFydCA9IHRvay0+c3RhcnQ7Ci0JCSpwX2VuZCA9IHRvay0+Y3VyIC0gMTsgLyogTGVhdmUgJ1xuJyBvdXQgb2YgdGhlIHN0cmluZyAqLwotICAgICAgICAgICAgICAgIHRvay0+Y29udF9saW5lID0gMDsKLQkJcmV0dXJuIE5FV0xJTkU7Ci0JfQorICAgIC8qIE5ld2xpbmUgKi8KKyAgICBpZiAoYyA9PSAnXG4nKSB7CisgICAgICAgIHRvay0+YXRib2wgPSAxOworICAgICAgICBpZiAoYmxhbmtsaW5lIHx8IHRvay0+bGV2ZWwgPiAwKQorICAgICAgICAgICAgZ290byBuZXh0bGluZTsKKyAgICAgICAgKnBfc3RhcnQgPSB0b2stPnN0YXJ0OworICAgICAgICAqcF9lbmQgPSB0b2stPmN1ciAtIDE7IC8qIExlYXZlICdcbicgb3V0IG9mIHRoZSBzdHJpbmcgKi8KKyAgICAgICAgdG9rLT5jb250X2xpbmUgPSAwOworICAgICAgICByZXR1cm4gTkVXTElORTsKKyAgICB9CiAKLQkvKiBQZXJpb2Qgb3IgbnVtYmVyIHN0YXJ0aW5nIHdpdGggcGVyaW9kPyAqLwotCWlmIChjID09ICcuJykgewotCQljID0gdG9rX25leHRjKHRvayk7Ci0JCWlmIChpc2RpZ2l0KGMpKSB7Ci0JCQlnb3RvIGZyYWN0aW9uOwotCQl9Ci0JCWVsc2UgewotCQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQkJKnBfc3RhcnQgPSB0b2stPnN0YXJ0OwotCQkJKnBfZW5kID0gdG9rLT5jdXI7Ci0JCQlyZXR1cm4gRE9UOwotCQl9Ci0JfQorICAgIC8qIFBlcmlvZCBvciBudW1iZXIgc3RhcnRpbmcgd2l0aCBwZXJpb2Q/ICovCisgICAgaWYgKGMgPT0gJy4nKSB7CisgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgaWYgKGlzZGlnaXQoYykpIHsKKyAgICAgICAgICAgIGdvdG8gZnJhY3Rpb247CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgICAgICAqcF9zdGFydCA9IHRvay0+c3RhcnQ7CisgICAgICAgICAgICAqcF9lbmQgPSB0b2stPmN1cjsKKyAgICAgICAgICAgIHJldHVybiBET1Q7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBOdW1iZXIgKi8KLQlpZiAoaXNkaWdpdChjKSkgewotCQlpZiAoYyA9PSAnMCcpIHsKLQkJCS8qIEhleCwgb2N0YWwgb3IgYmluYXJ5IC0tIG1heWJlLiAqLwotCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJaWYgKGMgPT0gJy4nKQotCQkJCWdvdG8gZnJhY3Rpb247CisgICAgLyogTnVtYmVyICovCisgICAgaWYgKGlzZGlnaXQoYykpIHsKKyAgICAgICAgaWYgKGMgPT0gJzAnKSB7CisgICAgICAgICAgICAvKiBIZXgsIG9jdGFsIG9yIGJpbmFyeSAtLSBtYXliZS4gKi8KKyAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIGlmIChjID09ICcuJykKKyAgICAgICAgICAgICAgICBnb3RvIGZyYWN0aW9uOwogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQkJCWlmIChjID09ICdqJyB8fCBjID09ICdKJykKLQkJCQlnb3RvIGltYWdpbmFyeTsKKyAgICAgICAgICAgIGlmIChjID09ICdqJyB8fCBjID09ICdKJykKKyAgICAgICAgICAgICAgICBnb3RvIGltYWdpbmFyeTsKICNlbmRpZgotCQkJaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKSB7CisgICAgICAgICAgICBpZiAoYyA9PSAneCcgfHwgYyA9PSAnWCcpIHsKIAotCQkJCS8qIEhleCAqLwotCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQlpZiAoIWlzeGRpZ2l0KGMpKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfVE9LRU47Ci0JCQkJCXRva19iYWNrdXAodG9rLCBjKTsKLQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJCWRvIHsKLQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCX0gd2hpbGUgKGlzeGRpZ2l0KGMpKTsKLQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ28nIHx8IGMgPT0gJ08nKSB7Ci0JCQkJLyogT2N0YWwgKi8KLQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJaWYgKGMgPCAnMCcgfHwgYyA+PSAnOCcpIHsKLQkJCQkJdG9rLT5kb25lID0gRV9UT0tFTjsKLQkJCQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQkJZG8gewotCQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJfSB3aGlsZSAoJzAnIDw9IGMgJiYgYyA8ICc4Jyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjID09ICdiJyB8fCBjID09ICdCJykgewotCQkJCS8qIEJpbmFyeSAqLwotCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQlpZiAoYyAhPSAnMCcgJiYgYyAhPSAnMScpIHsKLQkJCQkJdG9rLT5kb25lID0gRV9UT0tFTjsKLQkJCQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQkJCQlyZXR1cm4gRVJST1JUT0tFTjsKLQkJCQl9Ci0JCQkJZG8gewotCQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJfSB3aGlsZSAoYyA9PSAnMCcgfHwgYyA9PSAnMScpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IGZvdW5kX2RlY2ltYWwgPSAwOwotCQkJCS8qIE9jdGFsOyBjIGlzIGZpcnN0IGNoYXIgb2YgaXQgKi8KLQkJCQkvKiBUaGVyZSdzIG5vICdpc29jdGRpZ2l0JyBtYWNybywgc2lnaCAqLwotCQkJCXdoaWxlICgnMCcgPD0gYyAmJiBjIDwgJzgnKSB7Ci0JCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQl9Ci0JCQkJaWYgKGlzZGlnaXQoYykpIHsKLQkJCQkJZm91bmRfZGVjaW1hbCA9IDE7Ci0JCQkJCWRvIHsKLQkJCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQkJfSB3aGlsZSAoaXNkaWdpdChjKSk7Ci0JCQkJfQotCQkJCWlmIChjID09ICcuJykKLQkJCQkJZ290byBmcmFjdGlvbjsKLQkJCQllbHNlIGlmIChjID09ICdlJyB8fCBjID09ICdFJykKLQkJCQkJZ290byBleHBvbmVudDsKKyAgICAgICAgICAgICAgICAvKiBIZXggKi8KKyAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgaWYgKCFpc3hkaWdpdChjKSkgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX1RPS0VOOworICAgICAgICAgICAgICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChpc3hkaWdpdChjKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjID09ICdvJyB8fCBjID09ICdPJykgeworICAgICAgICAgICAgICAgIC8qIE9jdGFsICovCisgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgIGlmIChjIDwgJzAnIHx8IGMgPj0gJzgnKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfVE9LRU47CisgICAgICAgICAgICAgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKCcwJyA8PSBjICYmIGMgPCAnOCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnYicgfHwgYyA9PSAnQicpIHsKKyAgICAgICAgICAgICAgICAvKiBCaW5hcnkgKi8KKyAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgaWYgKGMgIT0gJzAnICYmIGMgIT0gJzEnKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfVE9LRU47CisgICAgICAgICAgICAgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGMgPT0gJzAnIHx8IGMgPT0gJzEnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCBmb3VuZF9kZWNpbWFsID0gMDsKKyAgICAgICAgICAgICAgICAvKiBPY3RhbDsgYyBpcyBmaXJzdCBjaGFyIG9mIGl0ICovCisgICAgICAgICAgICAgICAgLyogVGhlcmUncyBubyAnaXNvY3RkaWdpdCcgbWFjcm8sIHNpZ2ggKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoJzAnIDw9IGMgJiYgYyA8ICc4JykgeworICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpc2RpZ2l0KGMpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2RlY2ltYWwgPSAxOworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlzZGlnaXQoYykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnLicpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZnJhY3Rpb247CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhwb25lbnQ7CiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCQkJCWVsc2UgaWYgKGMgPT0gJ2onIHx8IGMgPT0gJ0onKQotCQkJCQlnb3RvIGltYWdpbmFyeTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdqJyB8fCBjID09ICdKJykKKyAgICAgICAgICAgICAgICAgICAgZ290byBpbWFnaW5hcnk7CiAjZW5kaWYKLQkJCQllbHNlIGlmIChmb3VuZF9kZWNpbWFsKSB7Ci0JCQkJCXRvay0+ZG9uZSA9IEVfVE9LRU47Ci0JCQkJCXRva19iYWNrdXAodG9rLCBjKTsKLQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJfQotCQkJaWYgKGMgPT0gJ2wnIHx8IGMgPT0gJ0wnKQotCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIERlY2ltYWwgKi8KLQkJCWRvIHsKLQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQl9IHdoaWxlIChpc2RpZ2l0KGMpKTsKLQkJCWlmIChjID09ICdsJyB8fCBjID09ICdMJykKLQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQllbHNlIHsKLQkJCQkvKiBBY2NlcHQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gKi8KLQkJCQlpZiAoYyA9PSAnLicpIHsKLQkJZnJhY3Rpb246Ci0JCQkJCS8qIEZyYWN0aW9uICovCi0JCQkJCWRvIHsKLQkJCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQkJfSB3aGlsZSAoaXNkaWdpdChjKSk7Ci0JCQkJfQotCQkJCWlmIChjID09ICdlJyB8fCBjID09ICdFJykgewotCQlleHBvbmVudDoKLQkJCQkJLyogRXhwb25lbnQgcGFydCAqLwotCQkJCQljID0gdG9rX25leHRjKHRvayk7Ci0JCQkJCWlmIChjID09ICcrJyB8fCBjID09ICctJykKLQkJCQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCQkJaWYgKCFpc2RpZ2l0KGMpKSB7Ci0JCQkJCQl0b2stPmRvbmUgPSBFX1RPS0VOOwotCQkJCQkJdG9rX2JhY2t1cCh0b2ssIGMpOwotCQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJCX0KLQkJCQkJZG8gewotCQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCQl9IHdoaWxlIChpc2RpZ2l0KGMpKTsKLQkJCQl9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm91bmRfZGVjaW1hbCkgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX1RPS0VOOworICAgICAgICAgICAgICAgICAgICB0b2tfYmFja3VwKHRvaywgYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICdsJyB8fCBjID09ICdMJykKKyAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBEZWNpbWFsICovCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgfSB3aGlsZSAoaXNkaWdpdChjKSk7CisgICAgICAgICAgICBpZiAoYyA9PSAnbCcgfHwgYyA9PSAnTCcpCisgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogQWNjZXB0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICovCisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJy4nKSB7CisgICAgICAgIGZyYWN0aW9uOgorICAgICAgICAgICAgICAgICAgICAvKiBGcmFjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlzZGlnaXQoYykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpIHsKKyAgICAgICAgZXhwb25lbnQ6CisgICAgICAgICAgICAgICAgICAgIC8qIEV4cG9uZW50IHBhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpCisgICAgICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNkaWdpdChjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT5kb25lID0gRV9UT0tFTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoaXNkaWdpdChjKSk7CisgICAgICAgICAgICAgICAgfQogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQkJCQlpZiAoYyA9PSAnaicgfHwgYyA9PSAnSicpCi0JCQkJCS8qIEltYWdpbmFyeSBwYXJ0ICovCi0JCWltYWdpbmFyeToKLQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICAgICAgICAgIGlmIChjID09ICdqJyB8fCBjID09ICdKJykKKyAgICAgICAgICAgICAgICAgICAgLyogSW1hZ2luYXJ5IHBhcnQgKi8KKyAgICAgICAgaW1hZ2luYXJ5OgorICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CiAjZW5kaWYKLQkJCX0KLQkJfQotCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCSpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKLQkJKnBfZW5kID0gdG9rLT5jdXI7Ci0JCXJldHVybiBOVU1CRVI7Ci0JfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgKnBfc3RhcnQgPSB0b2stPnN0YXJ0OworICAgICAgICAqcF9lbmQgPSB0b2stPmN1cjsKKyAgICAgICAgcmV0dXJuIE5VTUJFUjsKKyAgICB9CiAKICAgbGV0dGVyX3F1b3RlOgotCS8qIFN0cmluZyAqLwotCWlmIChjID09ICdcJycgfHwgYyA9PSAnIicpIHsKLQkJUHlfc3NpemVfdCBxdW90ZTIgPSB0b2stPmN1ciAtIHRvay0+c3RhcnQgKyAxOwotCQlpbnQgcXVvdGUgPSBjOwotCQlpbnQgdHJpcGxlID0gMDsKLQkJaW50IHRyaXBjb3VudCA9IDA7Ci0JCWZvciAoOzspIHsKLQkJCWMgPSB0b2tfbmV4dGModG9rKTsKLQkJCWlmIChjID09ICdcbicpIHsKLQkJCQlpZiAoIXRyaXBsZSkgewotCQkJCQl0b2stPmRvbmUgPSBFX0VPTFM7Ci0JCQkJCXRva19iYWNrdXAodG9rLCBjKTsKLQkJCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQkJfQotCQkJCXRyaXBjb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvay0+Y29udF9saW5lID0gMTsgLyogbXVsdGlsaW5lIHN0cmluZy4gKi8KLQkJCX0KLQkJCWVsc2UgaWYgKGMgPT0gRU9GKSB7Ci0JCQkJaWYgKHRyaXBsZSkKLQkJCQkJdG9rLT5kb25lID0gRV9FT0ZTOwotCQkJCWVsc2UKLQkJCQkJdG9rLT5kb25lID0gRV9FT0xTOwotCQkJCXRvay0+Y3VyID0gdG9rLT5pbnA7Ci0JCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQl9Ci0JCQllbHNlIGlmIChjID09IHF1b3RlKSB7Ci0JCQkJdHJpcGNvdW50Kys7Ci0JCQkJaWYgKHRvay0+Y3VyIC0gdG9rLT5zdGFydCA9PSBxdW90ZTIpIHsKLQkJCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCQlpZiAoYyA9PSBxdW90ZSkgewotCQkJCQkJdHJpcGxlID0gMTsKLQkJCQkJCXRyaXBjb3VudCA9IDA7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQl0b2tfYmFja3VwKHRvaywgYyk7Ci0JCQkJfQotCQkJCWlmICghdHJpcGxlIHx8IHRyaXBjb3VudCA9PSAzKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKGMgPT0gJ1xcJykgewotCQkJCXRyaXBjb3VudCA9IDA7Ci0JCQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQkJCWlmIChjID09IEVPRikgewotCQkJCQl0b2stPmRvbmUgPSBFX0VPTFM7Ci0JCQkJCXRvay0+Y3VyID0gdG9rLT5pbnA7Ci0JCQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQl0cmlwY291bnQgPSAwOwotCQl9Ci0JCSpwX3N0YXJ0ID0gdG9rLT5zdGFydDsKLQkJKnBfZW5kID0gdG9rLT5jdXI7Ci0JCXJldHVybiBTVFJJTkc7Ci0JfQorICAgIC8qIFN0cmluZyAqLworICAgIGlmIChjID09ICdcJycgfHwgYyA9PSAnIicpIHsKKyAgICAgICAgUHlfc3NpemVfdCBxdW90ZTIgPSB0b2stPmN1ciAtIHRvay0+c3RhcnQgKyAxOworICAgICAgICBpbnQgcXVvdGUgPSBjOworICAgICAgICBpbnQgdHJpcGxlID0gMDsKKyAgICAgICAgaW50IHRyaXBjb3VudCA9IDA7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXRyaXBsZSkgeworICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0VPTFM7CisgICAgICAgICAgICAgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyaXBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgdG9rLT5jb250X2xpbmUgPSAxOyAvKiBtdWx0aWxpbmUgc3RyaW5nLiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSBFT0YpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJpcGxlKQorICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0VPRlM7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0VPTFM7CisgICAgICAgICAgICAgICAgdG9rLT5jdXIgPSB0b2stPmlucDsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JUT0tFTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gcXVvdGUpIHsKKyAgICAgICAgICAgICAgICB0cmlwY291bnQrKzsKKyAgICAgICAgICAgICAgICBpZiAodG9rLT5jdXIgLSB0b2stPnN0YXJ0ID09IHF1b3RlMikgeworICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID09IHF1b3RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmlwbGUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdHJpcGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRva19iYWNrdXAodG9rLCBjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF0cmlwbGUgfHwgdHJpcGNvdW50ID09IDMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgdHJpcGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gRU9GKSB7CisgICAgICAgICAgICAgICAgICAgIHRvay0+ZG9uZSA9IEVfRU9MUzsKKyAgICAgICAgICAgICAgICAgICAgdG9rLT5jdXIgPSB0b2stPmlucDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRyaXBjb3VudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgKnBfc3RhcnQgPSB0b2stPnN0YXJ0OworICAgICAgICAqcF9lbmQgPSB0b2stPmN1cjsKKyAgICAgICAgcmV0dXJuIFNUUklORzsKKyAgICB9CiAKLQkvKiBMaW5lIGNvbnRpbnVhdGlvbiAqLwotCWlmIChjID09ICdcXCcpIHsKLQkJYyA9IHRva19uZXh0Yyh0b2spOwotCQlpZiAoYyAhPSAnXG4nKSB7Ci0JCQl0b2stPmRvbmUgPSBFX0xJTkVDT05UOwotCQkJdG9rLT5jdXIgPSB0b2stPmlucDsKLQkJCXJldHVybiBFUlJPUlRPS0VOOwotCQl9Ci0gICAgICAgICAgICAgICAgdG9rLT5jb250X2xpbmUgPSAxOwotCQlnb3RvIGFnYWluOyAvKiBSZWFkIG5leHQgbGluZSAqLwotCX0KKyAgICAvKiBMaW5lIGNvbnRpbnVhdGlvbiAqLworICAgIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOworICAgICAgICBpZiAoYyAhPSAnXG4nKSB7CisgICAgICAgICAgICB0b2stPmRvbmUgPSBFX0xJTkVDT05UOworICAgICAgICAgICAgdG9rLT5jdXIgPSB0b2stPmlucDsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUlRPS0VOOworICAgICAgICB9CisgICAgICAgIHRvay0+Y29udF9saW5lID0gMTsKKyAgICAgICAgZ290byBhZ2FpbjsgLyogUmVhZCBuZXh0IGxpbmUgKi8KKyAgICB9CiAKLQkvKiBDaGVjayBmb3IgdHdvLWNoYXJhY3RlciB0b2tlbiAqLwotCXsKLQkJaW50IGMyID0gdG9rX25leHRjKHRvayk7Ci0JCWludCB0b2tlbiA9IFB5VG9rZW5fVHdvQ2hhcnMoYywgYzIpOworICAgIC8qIENoZWNrIGZvciB0d28tY2hhcmFjdGVyIHRva2VuICovCisgICAgeworICAgICAgICBpbnQgYzIgPSB0b2tfbmV4dGModG9rKTsKKyAgICAgICAgaW50IHRva2VuID0gUHlUb2tlbl9Ud29DaGFycyhjLCBjMik7CiAjaWZuZGVmIFBHRU4KLQkJaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAmJiB0b2tlbiA9PSBOT1RFUVVBTCAmJiBjID09ICc8JykgewotCQkJaWYgKFB5RXJyX1dhcm5FeHBsaWNpdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJCSAgICAgICAiPD4gbm90IHN1cHBvcnRlZCBpbiAzLng7IHVzZSAhPSIsCi0JCQkJCSAgICAgICB0b2stPmZpbGVuYW1lLCB0b2stPmxpbmVubywKLQkJCQkJICAgICAgIE5VTEwsIE5VTEwpKSB7Ci0JCQkJcmV0dXJuIEVSUk9SVE9LRU47Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAmJiB0b2tlbiA9PSBOT1RFUVVBTCAmJiBjID09ICc8JykgeworICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeHBsaWNpdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8PiBub3Qgc3VwcG9ydGVkIGluIDMueDsgdXNlICE9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT5maWxlbmFtZSwgdG9rLT5saW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SVE9LRU47CisgICAgICAgICAgICB9CisgICAgICAgIH0KICNlbmRpZgotCQlpZiAodG9rZW4gIT0gT1ApIHsKLQkJCWludCBjMyA9IHRva19uZXh0Yyh0b2spOwotCQkJaW50IHRva2VuMyA9IFB5VG9rZW5fVGhyZWVDaGFycyhjLCBjMiwgYzMpOwotCQkJaWYgKHRva2VuMyAhPSBPUCkgewotCQkJCXRva2VuID0gdG9rZW4zOwotCQkJfSBlbHNlIHsKLQkJCQl0b2tfYmFja3VwKHRvaywgYzMpOwotCQkJfQotCQkJKnBfc3RhcnQgPSB0b2stPnN0YXJ0OwotCQkJKnBfZW5kID0gdG9rLT5jdXI7Ci0JCQlyZXR1cm4gdG9rZW47Ci0JCX0KLQkJdG9rX2JhY2t1cCh0b2ssIGMyKTsKLQl9CisgICAgICAgIGlmICh0b2tlbiAhPSBPUCkgeworICAgICAgICAgICAgaW50IGMzID0gdG9rX25leHRjKHRvayk7CisgICAgICAgICAgICBpbnQgdG9rZW4zID0gUHlUb2tlbl9UaHJlZUNoYXJzKGMsIGMyLCBjMyk7CisgICAgICAgICAgICBpZiAodG9rZW4zICE9IE9QKSB7CisgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbjM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRva19iYWNrdXAodG9rLCBjMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcF9zdGFydCA9IHRvay0+c3RhcnQ7CisgICAgICAgICAgICAqcF9lbmQgPSB0b2stPmN1cjsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgfQorICAgICAgICB0b2tfYmFja3VwKHRvaywgYzIpOworICAgIH0KIAotCS8qIEtlZXAgdHJhY2sgb2YgcGFyZW50aGVzZXMgbmVzdGluZyBsZXZlbCAqLwotCXN3aXRjaCAoYykgewotCWNhc2UgJygnOgotCWNhc2UgJ1snOgotCWNhc2UgJ3snOgotCQl0b2stPmxldmVsKys7Ci0JCWJyZWFrOwotCWNhc2UgJyknOgotCWNhc2UgJ10nOgotCWNhc2UgJ30nOgotCQl0b2stPmxldmVsLS07Ci0JCWJyZWFrOwotCX0KKyAgICAvKiBLZWVwIHRyYWNrIG9mIHBhcmVudGhlc2VzIG5lc3RpbmcgbGV2ZWwgKi8KKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlICcoJzoKKyAgICBjYXNlICdbJzoKKyAgICBjYXNlICd7JzoKKyAgICAgICAgdG9rLT5sZXZlbCsrOworICAgICAgICBicmVhazsKKyAgICBjYXNlICcpJzoKKyAgICBjYXNlICddJzoKKyAgICBjYXNlICd9JzoKKyAgICAgICAgdG9rLT5sZXZlbC0tOworICAgICAgICBicmVhazsKKyAgICB9CiAKLQkvKiBQdW5jdHVhdGlvbiBjaGFyYWN0ZXIgKi8KLQkqcF9zdGFydCA9IHRvay0+c3RhcnQ7Ci0JKnBfZW5kID0gdG9rLT5jdXI7Ci0JcmV0dXJuIFB5VG9rZW5fT25lQ2hhcihjKTsKKyAgICAvKiBQdW5jdHVhdGlvbiBjaGFyYWN0ZXIgKi8KKyAgICAqcF9zdGFydCA9IHRvay0+c3RhcnQ7CisgICAgKnBfZW5kID0gdG9rLT5jdXI7CisgICAgcmV0dXJuIFB5VG9rZW5fT25lQ2hhcihjKTsKIH0KIAogaW50CiBQeVRva2VuaXplcl9HZXQoc3RydWN0IHRva19zdGF0ZSAqdG9rLCBjaGFyICoqcF9zdGFydCwgY2hhciAqKnBfZW5kKQogewotCWludCByZXN1bHQgPSB0b2tfZ2V0KHRvaywgcF9zdGFydCwgcF9lbmQpOwotCWlmICh0b2stPmRlY29kaW5nX2VycmVkKSB7Ci0JCXJlc3VsdCA9IEVSUk9SVE9LRU47Ci0JCXRvay0+ZG9uZSA9IEVfREVDT0RFOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGludCByZXN1bHQgPSB0b2tfZ2V0KHRvaywgcF9zdGFydCwgcF9lbmQpOworICAgIGlmICh0b2stPmRlY29kaW5nX2VycmVkKSB7CisgICAgICAgIHJlc3VsdCA9IEVSUk9SVE9LRU47CisgICAgICAgIHRvay0+ZG9uZSA9IEVfREVDT0RFOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZyb20gcGFyc2V0b2suIEhvd2V2ZXIsIGl0IGNhbm5vdCBsaXZlCkBAIC0xNjA4LDU0ICsxNjA4LDU0IEBACiBjaGFyKgogUHlUb2tlbml6ZXJfUmVzdG9yZUVuY29kaW5nKHN0cnVjdCB0b2tfc3RhdGUqIHRvaywgaW50IGxlbiwgaW50KiBvZmZzZXQpCiB7Ci0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAjZWxzZQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWNfdXRmOChjb25zdCBjaGFyICplbmMsIGNvbnN0IGNoYXIgKnRleHQsIHNpemVfdCBsZW4pIHsKLQlQeU9iamVjdCAqcmV0ID0gTlVMTDsJCi0JUHlPYmplY3QgKnVuaWNvZGVfdGV4dCA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHRleHQsIGxlbiwgInJlcGxhY2UiKTsKLQlpZiAodW5pY29kZV90ZXh0KSB7Ci0JCXJldCA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodW5pY29kZV90ZXh0LCBlbmMsICJyZXBsYWNlIik7Ci0JCVB5X0RFQ1JFRih1bmljb2RlX3RleHQpOwotCX0KLQlpZiAoIXJldCkgewotCQlQeUVycl9DbGVhcigpOwotCX0KLQlyZXR1cm4gcmV0OworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIFB5T2JqZWN0ICp1bmljb2RlX3RleHQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOCh0ZXh0LCBsZW4sICJyZXBsYWNlIik7CisgICAgaWYgKHVuaWNvZGVfdGV4dCkgeworICAgICAgICByZXQgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHVuaWNvZGVfdGV4dCwgZW5jLCAicmVwbGFjZSIpOworICAgICAgICBQeV9ERUNSRUYodW5pY29kZV90ZXh0KTsKKyAgICB9CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKIH0KIGNoYXIgKgogUHlUb2tlbml6ZXJfUmVzdG9yZUVuY29kaW5nKHN0cnVjdCB0b2tfc3RhdGUqIHRvaywgaW50IGxlbiwgaW50ICpvZmZzZXQpCiB7Ci0JY2hhciAqdGV4dCA9IE5VTEw7Ci0JaWYgKHRvay0+ZW5jb2RpbmcpIHsKLQkJLyogY29udmVydCBzb3VyY2UgdG8gb3JpZ2luYWwgZW5jb25kaWcgKi8KLQkJUHlPYmplY3QgKmxpbmVvYmogPSBkZWNfdXRmOCh0b2stPmVuY29kaW5nLCB0b2stPmJ1ZiwgbGVuKTsKLQkJaWYgKGxpbmVvYmogIT0gTlVMTCkgewotCQkJaW50IGxpbmVsZW4gPSBQeVN0cmluZ19TaXplKGxpbmVvYmopOwotCQkJY29uc3QgY2hhciAqbGluZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGxpbmVvYmopOwotCQkJdGV4dCA9IFB5T2JqZWN0X01BTExPQyhsaW5lbGVuICsgMSk7Ci0JCQlpZiAodGV4dCAhPSBOVUxMICYmIGxpbmUgIT0gTlVMTCkgewotCQkJCWlmIChsaW5lbGVuKQotCQkJCQlzdHJuY3B5KHRleHQsIGxpbmUsIGxpbmVsZW4pOwotCQkJCXRleHRbbGluZWxlbl0gPSAnXDAnOwotCQkJfQotCQkJUHlfREVDUkVGKGxpbmVvYmopOwotCQkJCQkKLQkJCS8qIGFkanVzdCBlcnJvciBvZmZzZXQgKi8KLQkJCWlmICgqb2Zmc2V0ID4gMSkgewotCQkJCVB5T2JqZWN0ICpvZmZzZXRvYmogPSBkZWNfdXRmOCh0b2stPmVuY29kaW5nLCAKLQkJCQkJCQkgICAgICAgdG9rLT5idWYsICpvZmZzZXQtMSk7Ci0JCQkJaWYgKG9mZnNldG9iaikgewotCQkJCQkqb2Zmc2V0ID0gUHlTdHJpbmdfU2l6ZShvZmZzZXRvYmopICsgMTsKLQkJCQkJUHlfREVDUkVGKG9mZnNldG9iaik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0KLQl9Ci0JcmV0dXJuIHRleHQ7CisgICAgY2hhciAqdGV4dCA9IE5VTEw7CisgICAgaWYgKHRvay0+ZW5jb2RpbmcpIHsKKyAgICAgICAgLyogY29udmVydCBzb3VyY2UgdG8gb3JpZ2luYWwgZW5jb25kaWcgKi8KKyAgICAgICAgUHlPYmplY3QgKmxpbmVvYmogPSBkZWNfdXRmOCh0b2stPmVuY29kaW5nLCB0b2stPmJ1ZiwgbGVuKTsKKyAgICAgICAgaWYgKGxpbmVvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGxpbmVsZW4gPSBQeVN0cmluZ19TaXplKGxpbmVvYmopOworICAgICAgICAgICAgY29uc3QgY2hhciAqbGluZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGxpbmVvYmopOworICAgICAgICAgICAgdGV4dCA9IFB5T2JqZWN0X01BTExPQyhsaW5lbGVuICsgMSk7CisgICAgICAgICAgICBpZiAodGV4dCAhPSBOVUxMICYmIGxpbmUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChsaW5lbGVuKQorICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KHRleHQsIGxpbmUsIGxpbmVsZW4pOworICAgICAgICAgICAgICAgIHRleHRbbGluZWxlbl0gPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGxpbmVvYmopOworCisgICAgICAgICAgICAvKiBhZGp1c3QgZXJyb3Igb2Zmc2V0ICovCisgICAgICAgICAgICBpZiAoKm9mZnNldCA+IDEpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqb2Zmc2V0b2JqID0gZGVjX3V0ZjgodG9rLT5lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLT5idWYsICpvZmZzZXQtMSk7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldG9iaikgeworICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gUHlTdHJpbmdfU2l6ZShvZmZzZXRvYmopICsgMTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9mZnNldG9iaik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRleHQ7CiAKIH0KICNlbmRpZiAvKiBkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpICovCkBAIC0xNjY3LDkgKzE2NjcsOSBAQAogdm9pZAogdG9rX2R1bXAoaW50IHR5cGUsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQpCiB7Ci0JcHJpbnRmKCIlcyIsIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW3R5cGVdKTsKLQlpZiAodHlwZSA9PSBOQU1FIHx8IHR5cGUgPT0gTlVNQkVSIHx8IHR5cGUgPT0gU1RSSU5HIHx8IHR5cGUgPT0gT1ApCi0JCXByaW50ZigiKCUuKnMpIiwgKGludCkoZW5kIC0gc3RhcnQpLCBzdGFydCk7CisgICAgcHJpbnRmKCIlcyIsIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW3R5cGVdKTsKKyAgICBpZiAodHlwZSA9PSBOQU1FIHx8IHR5cGUgPT0gTlVNQkVSIHx8IHR5cGUgPT0gU1RSSU5HIHx8IHR5cGUgPT0gT1ApCisgICAgICAgIHByaW50ZigiKCUuKnMpIiwgKGludCkoZW5kIC0gc3RhcnQpLCBzdGFydCk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvUGFyc2VyL3Rva2VuaXplci5oIGIvUGFyc2VyL3Rva2VuaXplci5oCmluZGV4IGUxMDk3MmMuLjE5YWE3MDIgMTAwNjQ0Ci0tLSBhL1BhcnNlci90b2tlbml6ZXIuaAorKysgYi9QYXJzZXIvdG9rZW5pemVyLmgKQEAgLTgsNTAgKzgsNTAgQEAKIAogLyogVG9rZW5pemVyIGludGVyZmFjZSAqLwogCi0jaW5jbHVkZSAidG9rZW4uaCIJLyogRm9yIHRva2VuIHR5cGVzICovCisjaW5jbHVkZSAidG9rZW4uaCIgICAgICAvKiBGb3IgdG9rZW4gdHlwZXMgKi8KIAotI2RlZmluZSBNQVhJTkRFTlQgMTAwCS8qIE1heCBpbmRlbnRhdGlvbiBsZXZlbCAqLworI2RlZmluZSBNQVhJTkRFTlQgMTAwICAgLyogTWF4IGluZGVudGF0aW9uIGxldmVsICovCiAKIC8qIFRva2VuaXplciBzdGF0ZSAqLwogc3RydWN0IHRva19zdGF0ZSB7Ci0JLyogSW5wdXQgc3RhdGU7IGJ1ZiA8PSBjdXIgPD0gaW5wIDw9IGVuZCAqLwotCS8qIE5CIGFuIGVudGlyZSBsaW5lIGlzIGhlbGQgaW4gdGhlIGJ1ZmZlciAqLwotCWNoYXIgKmJ1ZjsJLyogSW5wdXQgYnVmZmVyLCBvciBOVUxMOyBtYWxsb2MnZWQgaWYgZnAgIT0gTlVMTCAqLwotCWNoYXIgKmN1cjsJLyogTmV4dCBjaGFyYWN0ZXIgaW4gYnVmZmVyICovCi0JY2hhciAqaW5wOwkvKiBFbmQgb2YgZGF0YSBpbiBidWZmZXIgKi8KLQljaGFyICplbmQ7CS8qIEVuZCBvZiBpbnB1dCBidWZmZXIgaWYgYnVmICE9IE5VTEwgKi8KLQljaGFyICpzdGFydDsJLyogU3RhcnQgb2YgY3VycmVudCB0b2tlbiBpZiBub3QgTlVMTCAqLwotCWludCBkb25lOwkvKiBFX09LIG5vcm1hbGx5LCBFX0VPRiBhdCBFT0YsIG90aGVyd2lzZSBlcnJvciBjb2RlICovCi0JLyogTkIgSWYgZG9uZSAhPSBFX09LLCBjdXIgbXVzdCBiZSA9PSBpbnAhISEgKi8KLQlGSUxFICpmcDsJLyogUmVzdCBvZiBpbnB1dDsgTlVMTCBpZiB0b2tlbml6aW5nIGEgc3RyaW5nICovCi0JaW50IHRhYnNpemU7CS8qIFRhYiBzcGFjaW5nICovCi0JaW50IGluZGVudDsJLyogQ3VycmVudCBpbmRlbnRhdGlvbiBpbmRleCAqLwotCWludCBpbmRzdGFja1tNQVhJTkRFTlRdOwkvKiBTdGFjayBvZiBpbmRlbnRzICovCi0JaW50IGF0Ym9sOwkvKiBOb256ZXJvIGlmIGF0IGJlZ2luIG9mIG5ldyBsaW5lICovCi0JaW50IHBlbmRpbjsJLyogUGVuZGluZyBpbmRlbnRzIChpZiA+IDApIG9yIGRlZGVudHMgKGlmIDwgMCkgKi8KLQljaGFyICpwcm9tcHQsICpuZXh0cHJvbXB0OwkvKiBGb3IgaW50ZXJhY3RpdmUgcHJvbXB0aW5nICovCi0JaW50IGxpbmVubzsJLyogQ3VycmVudCBsaW5lIG51bWJlciAqLwotCWludCBsZXZlbDsJLyogKCkgW10ge30gUGFyZW50aGVzZXMgbmVzdGluZyBsZXZlbCAqLwotCQkJLyogVXNlZCB0byBhbGxvdyBmcmVlIGNvbnRpbnVhdGlvbnMgaW5zaWRlIHRoZW0gKi8KLQkvKiBTdHVmZiBmb3IgY2hlY2tpbmcgb24gZGlmZmVyZW50IHRhYiBzaXplcyAqLwotCWNvbnN0IGNoYXIgKmZpbGVuYW1lOwkvKiBGb3IgZXJyb3IgbWVzc2FnZXMgKi8KLQlpbnQgYWx0d2FybmluZzsJLyogSXNzdWUgd2FybmluZyBpZiBhbHRlcm5hdGUgdGFicyBkb24ndCBtYXRjaCAqLwotCWludCBhbHRlcnJvcjsJLyogSXNzdWUgZXJyb3IgaWYgYWx0ZXJuYXRlIHRhYnMgZG9uJ3QgbWF0Y2ggKi8KLQlpbnQgYWx0dGFic2l6ZTsJLyogQWx0ZXJuYXRlIHRhYiBzcGFjaW5nICovCi0JaW50IGFsdGluZHN0YWNrW01BWElOREVOVF07CS8qIFN0YWNrIG9mIGFsdGVybmF0ZSBpbmRlbnRzICovCi0JLyogU3R1ZmYgZm9yIFBFUCAwMjYzICovCi0JaW50IGRlY29kaW5nX3N0YXRlOwkvKiAtMTpkZWNvZGluZywgMDppbml0LCAxOnJhdyAqLwotCWludCBkZWNvZGluZ19lcnJlZDsJLyogd2hldGhlciBlcnJlZCBpbiBkZWNvZGluZyAgKi8KLQlpbnQgcmVhZF9jb2Rpbmdfc3BlYzsJLyogd2hldGhlciAnY29kaW5nOi4uLicgaGFzIGJlZW4gcmVhZCAgKi8KLQljaGFyICplbmNvZGluZzsKLQlpbnQgY29udF9saW5lOyAgICAgICAgICAvKiB3aGV0aGVyIHdlIGFyZSBpbiBhIGNvbnRpbnVhdGlvbiBsaW5lLiAqLwotCWNvbnN0IGNoYXIqIGxpbmVfc3RhcnQ7CS8qIHBvaW50ZXIgdG8gc3RhcnQgb2YgY3VycmVudCBsaW5lICovCisgICAgLyogSW5wdXQgc3RhdGU7IGJ1ZiA8PSBjdXIgPD0gaW5wIDw9IGVuZCAqLworICAgIC8qIE5CIGFuIGVudGlyZSBsaW5lIGlzIGhlbGQgaW4gdGhlIGJ1ZmZlciAqLworICAgIGNoYXIgKmJ1ZjsgICAgICAgICAgLyogSW5wdXQgYnVmZmVyLCBvciBOVUxMOyBtYWxsb2MnZWQgaWYgZnAgIT0gTlVMTCAqLworICAgIGNoYXIgKmN1cjsgICAgICAgICAgLyogTmV4dCBjaGFyYWN0ZXIgaW4gYnVmZmVyICovCisgICAgY2hhciAqaW5wOyAgICAgICAgICAvKiBFbmQgb2YgZGF0YSBpbiBidWZmZXIgKi8KKyAgICBjaGFyICplbmQ7ICAgICAgICAgIC8qIEVuZCBvZiBpbnB1dCBidWZmZXIgaWYgYnVmICE9IE5VTEwgKi8KKyAgICBjaGFyICpzdGFydDsgICAgICAgIC8qIFN0YXJ0IG9mIGN1cnJlbnQgdG9rZW4gaWYgbm90IE5VTEwgKi8KKyAgICBpbnQgZG9uZTsgICAgICAgICAgIC8qIEVfT0sgbm9ybWFsbHksIEVfRU9GIGF0IEVPRiwgb3RoZXJ3aXNlIGVycm9yIGNvZGUgKi8KKyAgICAvKiBOQiBJZiBkb25lICE9IEVfT0ssIGN1ciBtdXN0IGJlID09IGlucCEhISAqLworICAgIEZJTEUgKmZwOyAgICAgICAgICAgLyogUmVzdCBvZiBpbnB1dDsgTlVMTCBpZiB0b2tlbml6aW5nIGEgc3RyaW5nICovCisgICAgaW50IHRhYnNpemU7ICAgICAgICAvKiBUYWIgc3BhY2luZyAqLworICAgIGludCBpbmRlbnQ7ICAgICAgICAgLyogQ3VycmVudCBpbmRlbnRhdGlvbiBpbmRleCAqLworICAgIGludCBpbmRzdGFja1tNQVhJTkRFTlRdOyAgICAgICAgICAgIC8qIFN0YWNrIG9mIGluZGVudHMgKi8KKyAgICBpbnQgYXRib2w7ICAgICAgICAgIC8qIE5vbnplcm8gaWYgYXQgYmVnaW4gb2YgbmV3IGxpbmUgKi8KKyAgICBpbnQgcGVuZGluOyAgICAgICAgIC8qIFBlbmRpbmcgaW5kZW50cyAoaWYgPiAwKSBvciBkZWRlbnRzIChpZiA8IDApICovCisgICAgY2hhciAqcHJvbXB0LCAqbmV4dHByb21wdDsgICAgICAgICAgLyogRm9yIGludGVyYWN0aXZlIHByb21wdGluZyAqLworICAgIGludCBsaW5lbm87ICAgICAgICAgLyogQ3VycmVudCBsaW5lIG51bWJlciAqLworICAgIGludCBsZXZlbDsgICAgICAgICAgLyogKCkgW10ge30gUGFyZW50aGVzZXMgbmVzdGluZyBsZXZlbCAqLworICAgICAgICAgICAgLyogVXNlZCB0byBhbGxvdyBmcmVlIGNvbnRpbnVhdGlvbnMgaW5zaWRlIHRoZW0gKi8KKyAgICAvKiBTdHVmZiBmb3IgY2hlY2tpbmcgb24gZGlmZmVyZW50IHRhYiBzaXplcyAqLworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOyAgICAgICAvKiBGb3IgZXJyb3IgbWVzc2FnZXMgKi8KKyAgICBpbnQgYWx0d2FybmluZzsgICAgIC8qIElzc3VlIHdhcm5pbmcgaWYgYWx0ZXJuYXRlIHRhYnMgZG9uJ3QgbWF0Y2ggKi8KKyAgICBpbnQgYWx0ZXJyb3I7ICAgICAgIC8qIElzc3VlIGVycm9yIGlmIGFsdGVybmF0ZSB0YWJzIGRvbid0IG1hdGNoICovCisgICAgaW50IGFsdHRhYnNpemU7ICAgICAvKiBBbHRlcm5hdGUgdGFiIHNwYWNpbmcgKi8KKyAgICBpbnQgYWx0aW5kc3RhY2tbTUFYSU5ERU5UXTsgICAgICAgICAvKiBTdGFjayBvZiBhbHRlcm5hdGUgaW5kZW50cyAqLworICAgIC8qIFN0dWZmIGZvciBQRVAgMDI2MyAqLworICAgIGludCBkZWNvZGluZ19zdGF0ZTsgICAgICAgICAvKiAtMTpkZWNvZGluZywgMDppbml0LCAxOnJhdyAqLworICAgIGludCBkZWNvZGluZ19lcnJlZDsgICAgICAgICAvKiB3aGV0aGVyIGVycmVkIGluIGRlY29kaW5nICAqLworICAgIGludCByZWFkX2NvZGluZ19zcGVjOyAgICAgICAvKiB3aGV0aGVyICdjb2Rpbmc6Li4uJyBoYXMgYmVlbiByZWFkICAqLworICAgIGNoYXIgKmVuY29kaW5nOworICAgIGludCBjb250X2xpbmU7ICAgICAgICAgIC8qIHdoZXRoZXIgd2UgYXJlIGluIGEgY29udGludWF0aW9uIGxpbmUuICovCisgICAgY29uc3QgY2hhciogbGluZV9zdGFydDsgICAgIC8qIHBvaW50ZXIgdG8gc3RhcnQgb2YgY3VycmVudCBsaW5lICovCiAjaWZuZGVmIFBHRU4KLQlQeU9iamVjdCAqZGVjb2RpbmdfcmVhZGxpbmU7IC8qIGNvZGVjcy5vcGVuKC4uLikucmVhZGxpbmUgKi8KLQlQeU9iamVjdCAqZGVjb2RpbmdfYnVmZmVyOworICAgIFB5T2JqZWN0ICpkZWNvZGluZ19yZWFkbGluZTsgLyogY29kZWNzLm9wZW4oLi4uKS5yZWFkbGluZSAqLworICAgIFB5T2JqZWN0ICpkZWNvZGluZ19idWZmZXI7CiAjZW5kaWYKLQljb25zdCBjaGFyKiBlbmM7Ci0JY29uc3QgY2hhciogc3RyOworICAgIGNvbnN0IGNoYXIqIGVuYzsKKyAgICBjb25zdCBjaGFyKiBzdHI7CiB9OwogCiBleHRlcm4gc3RydWN0IHRva19zdGF0ZSAqUHlUb2tlbml6ZXJfRnJvbVN0cmluZyhjb25zdCBjaGFyICopOwpAQCAtNTksOCArNTksOCBAQAogZXh0ZXJuIHZvaWQgUHlUb2tlbml6ZXJfRnJlZShzdHJ1Y3QgdG9rX3N0YXRlICopOwogZXh0ZXJuIGludCBQeVRva2VuaXplcl9HZXQoc3RydWN0IHRva19zdGF0ZSAqLCBjaGFyICoqLCBjaGFyICoqKTsKICNpZiBkZWZpbmVkKFBHRU4pIHx8IGRlZmluZWQoUHlfVVNJTkdfVU5JQ09ERSkKLWV4dGVybiBjaGFyICogUHlUb2tlbml6ZXJfUmVzdG9yZUVuY29kaW5nKHN0cnVjdCB0b2tfc3RhdGUqIHRvaywgCi0JCQkJCSAgaW50IGxlbiwgaW50ICpvZmZzZXQpOworZXh0ZXJuIGNoYXIgKiBQeVRva2VuaXplcl9SZXN0b3JlRW5jb2Rpbmcoc3RydWN0IHRva19zdGF0ZSogdG9rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50ICpvZmZzZXQpOwogI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvUHl0aG9uL193YXJuaW5ncy5jIGIvUHl0aG9uL193YXJuaW5ncy5jCmluZGV4IDFmMGY1OGUuLjMzMTNjNTkgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9fd2FybmluZ3MuYworKysgYi9QeXRob24vX3dhcm5pbmdzLmMKQEAgLTIyLDEwICsyMiwxMCBAQAogICAgIGludCByYzsKIAogICAgIGlmIChvYmogPT0gUHlfTm9uZSkKLSAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvYmosICJtYXRjaCIsICJPIiwgYXJnKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiAKICAgICByYyA9IFB5T2JqZWN0X0lzVHJ1ZShyZXN1bHQpOwogICAgIFB5X0RFQ1JFRihyZXN1bHQpOwpAQCAtNDUsMTkgKzQ1LDE5IEBACiAgICAgaW50IHJlc3VsdDsKIAogICAgIGlmICh3YXJuaW5nc19zdHIgPT0gTlVMTCkgewotICAgICAgICB3YXJuaW5nc19zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJ3YXJuaW5ncyIpOwotICAgICAgICBpZiAod2FybmluZ3Nfc3RyID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3YXJuaW5nc19zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJ3YXJuaW5ncyIpOworICAgIGlmICh3YXJuaW5nc19zdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgYWxsX21vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CiAgICAgcmVzdWx0ID0gUHlEaWN0X0NvbnRhaW5zKGFsbF9tb2R1bGVzLCB3YXJuaW5nc19zdHIpOwogICAgIGlmIChyZXN1bHQgPT0gLTEgfHwgcmVzdWx0ID09IDApCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgd2FybmluZ3NfbW9kdWxlID0gUHlEaWN0X0dldEl0ZW0oYWxsX21vZHVsZXMsIHdhcm5pbmdzX3N0cik7CiAgICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHdhcm5pbmdzX21vZHVsZSwgYXR0cikpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcod2FybmluZ3NfbW9kdWxlLCBhdHRyKTsKIH0KIApAQCAtNjksOSArNjksOSBAQAogCiAgICAgcmVnaXN0cnkgPSBnZXRfd2FybmluZ3NfYXR0cigib25jZXJlZ2lzdHJ5Iik7CiAgICAgaWYgKHJlZ2lzdHJ5ID09IE5VTEwpIHsKLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgcmV0dXJuIF9vbmNlX3JlZ2lzdHJ5OworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gX29uY2VfcmVnaXN0cnk7CiAgICAgfQogICAgIFB5X0RFQ1JFRihfb25jZV9yZWdpc3RyeSk7CiAgICAgX29uY2VfcmVnaXN0cnkgPSByZWdpc3RyeTsKQEAgLTkwLDYyICs5MCw2MiBAQAogCiAgICAgd2FybmluZ3NfZmlsdGVycyA9IGdldF93YXJuaW5nc19hdHRyKCJmaWx0ZXJzIik7CiAgICAgaWYgKHdhcm5pbmdzX2ZpbHRlcnMgPT0gTlVMTCkgewotICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIFB5X0RFQ1JFRihfZmlsdGVycyk7Ci0gICAgICAgIF9maWx0ZXJzID0gd2FybmluZ3NfZmlsdGVyczsKKyAgICBQeV9ERUNSRUYoX2ZpbHRlcnMpOworICAgIF9maWx0ZXJzID0gd2FybmluZ3NfZmlsdGVyczsKICAgICB9CiAKICAgICBpZiAoIVB5TGlzdF9DaGVjayhfZmlsdGVycykpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfTkFNRSAiLmZpbHRlcnMgbXVzdCBiZSBhIGxpc3QiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIE1PRFVMRV9OQU1FICIuZmlsdGVycyBtdXN0IGJlIGEgbGlzdCIpOworICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIC8qIF9maWx0ZXJzIGNvdWxkIGNoYW5nZSB3aGlsZSB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIgaXQuICovCiAgICAgZm9yIChpID0gMDsgaSA8IFB5TGlzdF9HRVRfU0laRShfZmlsdGVycyk7IGkrKykgewotICAgICAgICBQeU9iamVjdCAqdG1wX2l0ZW0sICphY3Rpb24sICptc2csICpjYXQsICptb2QsICpsbl9vYmo7Ci0gICAgICAgIFB5X3NzaXplX3QgbG47Ci0gICAgICAgIGludCBpc19zdWJjbGFzcywgZ29vZF9tc2csIGdvb2RfbW9kOworICAgIFB5T2JqZWN0ICp0bXBfaXRlbSwgKmFjdGlvbiwgKm1zZywgKmNhdCwgKm1vZCwgKmxuX29iajsKKyAgICBQeV9zc2l6ZV90IGxuOworICAgIGludCBpc19zdWJjbGFzcywgZ29vZF9tc2csIGdvb2RfbW9kOwogCi0gICAgICAgIHRtcF9pdGVtID0gKml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oX2ZpbHRlcnMsIGkpOwotICAgICAgICBpZiAoUHlUdXBsZV9TaXplKHRtcF9pdGVtKSAhPSA1KSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfTkFNRSAiLmZpbHRlcnMgaXRlbSAlemQgaXNuJ3QgYSA1LXR1cGxlIiwgaSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgIHRtcF9pdGVtID0gKml0ZW0gPSBQeUxpc3RfR0VUX0lURU0oX2ZpbHRlcnMsIGkpOworICAgIGlmIChQeVR1cGxlX1NpemUodG1wX2l0ZW0pICE9IDUpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICBNT0RVTEVfTkFNRSAiLmZpbHRlcnMgaXRlbSAlemQgaXNuJ3QgYSA1LXR1cGxlIiwgaSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgICAgICAvKiBQeXRob24gY29kZTogYWN0aW9uLCBtc2csIGNhdCwgbW9kLCBsbiA9IGl0ZW0gKi8KLSAgICAgICAgYWN0aW9uID0gUHlUdXBsZV9HRVRfSVRFTSh0bXBfaXRlbSwgMCk7Ci0gICAgICAgIG1zZyA9IFB5VHVwbGVfR0VUX0lURU0odG1wX2l0ZW0sIDEpOwotICAgICAgICBjYXQgPSBQeVR1cGxlX0dFVF9JVEVNKHRtcF9pdGVtLCAyKTsKLSAgICAgICAgbW9kID0gUHlUdXBsZV9HRVRfSVRFTSh0bXBfaXRlbSwgMyk7Ci0gICAgICAgIGxuX29iaiA9IFB5VHVwbGVfR0VUX0lURU0odG1wX2l0ZW0sIDQpOworICAgIC8qIFB5dGhvbiBjb2RlOiBhY3Rpb24sIG1zZywgY2F0LCBtb2QsIGxuID0gaXRlbSAqLworICAgIGFjdGlvbiA9IFB5VHVwbGVfR0VUX0lURU0odG1wX2l0ZW0sIDApOworICAgIG1zZyA9IFB5VHVwbGVfR0VUX0lURU0odG1wX2l0ZW0sIDEpOworICAgIGNhdCA9IFB5VHVwbGVfR0VUX0lURU0odG1wX2l0ZW0sIDIpOworICAgIG1vZCA9IFB5VHVwbGVfR0VUX0lURU0odG1wX2l0ZW0sIDMpOworICAgIGxuX29iaiA9IFB5VHVwbGVfR0VUX0lURU0odG1wX2l0ZW0sIDQpOwogCi0gICAgICAgIGdvb2RfbXNnID0gY2hlY2tfbWF0Y2hlZChtc2csIHRleHQpOwotICAgICAgICBnb29kX21vZCA9IGNoZWNrX21hdGNoZWQobW9kLCBtb2R1bGUpOwotICAgICAgICBpc19zdWJjbGFzcyA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoY2F0ZWdvcnksIGNhdCk7Ci0gICAgICAgIGxuID0gUHlJbnRfQXNTc2l6ZV90KGxuX29iaik7Ci0gICAgICAgIGlmIChnb29kX21zZyA9PSAtMSB8fCBnb29kX21vZCA9PSAtMSB8fCBpc19zdWJjbGFzcyA9PSAtMSB8fAotICAgICAgICAgICAgKGxuID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZ29vZF9tc2cgPSBjaGVja19tYXRjaGVkKG1zZywgdGV4dCk7CisgICAgZ29vZF9tb2QgPSBjaGVja19tYXRjaGVkKG1vZCwgbW9kdWxlKTsKKyAgICBpc19zdWJjbGFzcyA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoY2F0ZWdvcnksIGNhdCk7CisgICAgbG4gPSBQeUludF9Bc1NzaXplX3QobG5fb2JqKTsKKyAgICBpZiAoZ29vZF9tc2cgPT0gLTEgfHwgZ29vZF9tb2QgPT0gLTEgfHwgaXNfc3ViY2xhc3MgPT0gLTEgfHwKKyAgICAgICAgKGxuID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgICAgICBpZiAoZ29vZF9tc2cgJiYgaXNfc3ViY2xhc3MgJiYgZ29vZF9tb2QgJiYgKGxuID09IDAgfHwgbGluZW5vID09IGxuKSkKLSAgICAgICAgICAgIHJldHVybiBQeVN0cmluZ19Bc1N0cmluZyhhY3Rpb24pOworICAgIGlmIChnb29kX21zZyAmJiBpc19zdWJjbGFzcyAmJiBnb29kX21vZCAmJiAobG4gPT0gMCB8fCBsaW5lbm8gPT0gbG4pKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoYWN0aW9uKTsKICAgICB9CiAKICAgICBtID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKE1PRFVMRV9OQU1FKTsKICAgICBpZiAobSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKICAgICBQeV9ERUNSRUYobSk7CiAgICAgaWYgKGQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgYWN0aW9uID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgREVGQVVMVF9BQ1RJT05fTkFNRSk7CiAgICAgaWYgKGFjdGlvbiAhPSBOVUxMKQotICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoYWN0aW9uKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoYWN0aW9uKTsKIAogICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICBNT0RVTEVfTkFNRSAiLiIgREVGQVVMVF9BQ1RJT05fTkFNRSAiIG5vdCBmb3VuZCIpOwpAQCAtMTU4LDE4ICsxNTgsMTggQEAKICAgICBQeU9iamVjdCAqYWxyZWFkeV93YXJuZWQ7CiAKICAgICBpZiAoa2V5ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiAKICAgICBhbHJlYWR5X3dhcm5lZCA9IFB5RGljdF9HZXRJdGVtKHJlZ2lzdHJ5LCBrZXkpOwogICAgIGlmIChhbHJlYWR5X3dhcm5lZCAhPSBOVUxMKSB7Ci0gICAgICAgIGludCByYyA9IFB5T2JqZWN0X0lzVHJ1ZShhbHJlYWR5X3dhcm5lZCk7Ci0gICAgICAgIGlmIChyYyAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIHJjOworICAgIGludCByYyA9IFB5T2JqZWN0X0lzVHJ1ZShhbHJlYWR5X3dhcm5lZCk7CisgICAgaWYgKHJjICE9IDApCisgICAgICAgIHJldHVybiByYzsKICAgICB9CiAKICAgICAvKiBUaGlzIHdhcm5pbmcgd2Fzbid0IGZvdW5kIGluIHRoZSByZWdpc3RyeSwgc2V0IGl0LiAqLwogICAgIGlmIChzaG91bGRfc2V0KQotICAgICAgICByZXR1cm4gUHlEaWN0X1NldEl0ZW0ocmVnaXN0cnksIGtleSwgUHlfVHJ1ZSk7CisgICAgcmV0dXJuIFB5RGljdF9TZXRJdGVtKHJlZ2lzdHJ5LCBrZXksIFB5X1RydWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xODMsMjMgKzE4MywyMyBAQAogCiAgICAgaW50IHJjID0gUHlPYmplY3RfSXNUcnVlKGZpbGVuYW1lKTsKICAgICBpZiAocmMgPT0gLTEpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogICAgIGVsc2UgaWYgKHJjID09IDApCi0gICAgICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8dW5rbm93bj4iKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiPHVua25vd24+Iik7CiAKICAgICBtb2Rfc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoZmlsZW5hbWUpOwogICAgIGlmIChtb2Rfc3RyID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICBsZW4gPSBQeVN0cmluZ19TaXplKGZpbGVuYW1lKTsKICAgICBpZiAobGVuIDwgMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKGxlbiA+PSAzICYmCi0Jc3RybmNtcChtb2Rfc3RyICsgKGxlbiAtIDMpLCAiLnB5IiwgMykgPT0gMCkgewotICAgICAgICBtb2R1bGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShtb2Rfc3RyLCBsZW4tMyk7CisgICAgc3RybmNtcChtb2Rfc3RyICsgKGxlbiAtIDMpLCAiLnB5IiwgMykgPT0gMCkgeworICAgIG1vZHVsZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG1vZF9zdHIsIGxlbi0zKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIG1vZHVsZSA9IGZpbGVuYW1lOwotICAgICAgICBQeV9JTkNSRUYobW9kdWxlKTsKKyAgICBtb2R1bGUgPSBmaWxlbmFtZTsKKyAgICBQeV9JTkNSRUYobW9kdWxlKTsKICAgICB9CiAgICAgcmV0dXJuIG1vZHVsZTsKIH0KQEAgLTIxMiwxMyArMjEyLDEzIEBACiAgICAgaW50IHJjOwogCiAgICAgaWYgKGFkZF96ZXJvKSB7Ci0gICAgICAgIHplcm8gPSBQeUludF9Gcm9tTG9uZygwKTsKLSAgICAgICAgaWYgKHplcm8gPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgYWx0a2V5ID0gUHlUdXBsZV9QYWNrKDMsIHRleHQsIGNhdGVnb3J5LCB6ZXJvKTsKKyAgICB6ZXJvID0gUHlJbnRfRnJvbUxvbmcoMCk7CisgICAgaWYgKHplcm8gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGFsdGtleSA9IFB5VHVwbGVfUGFjaygzLCB0ZXh0LCBjYXRlZ29yeSwgemVybyk7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgYWx0a2V5ID0gUHlUdXBsZV9QYWNrKDIsIHRleHQsIGNhdGVnb3J5KTsKKyAgICBhbHRrZXkgPSBQeVR1cGxlX1BhY2soMiwgdGV4dCwgY2F0ZWdvcnkpOwogCiAgICAgcmMgPSBhbHJlYWR5X3dhcm5lZChyZWdpc3RyeSwgYWx0a2V5LCAxKTsKICAgICBQeV9YREVDUkVGKHplcm8pOwpAQCAtMjM4LDEzICsyMzgsMTMgQEAKIAogICAgIG5hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNhdGVnb3J5LCAiX19uYW1lX18iKTsKICAgICBpZiAobmFtZSA9PSBOVUxMKSAgLyogWFhYIENhbiBhbiBvYmplY3QgbGFjayBhICdfX25hbWVfXycgYXR0cmlidXRlPyAqLwotCSAgICByZXR1cm47CisgICAgICAgIHJldHVybjsKIAogICAgIGZfc3RkZXJyID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKICAgICBpZiAoZl9zdGRlcnIgPT0gTlVMTCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxvc3Qgc3lzLnN0ZGVyclxuIik7Ci0gICAgICAgIFB5X0RFQ1JFRihuYW1lKTsKLSAgICAgICAgcmV0dXJuOworICAgIGZwcmludGYoc3RkZXJyLCAibG9zdCBzeXMuc3RkZXJyXG4iKTsKKyAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgcmV0dXJuOwogICAgIH0KIAogICAgIC8qIFByaW50ICJmaWxlbmFtZTpsaW5lbm86IGNhdGVnb3J5OiB0ZXh0XG4iICovCkBAIC0yNTgsMTcgKzI1OCwxNyBAQAogCiAgICAgLyogUHJpbnQgIiAgc291cmNlX2xpbmVcbiIgKi8KICAgICBpZiAoc291cmNlbGluZSkgewotICAgICAgICBjaGFyICpzb3VyY2VfbGluZV9zdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoc291cmNlbGluZSk7Ci0gICAgICAgIHdoaWxlICgqc291cmNlX2xpbmVfc3RyID09ICcgJyB8fCAqc291cmNlX2xpbmVfc3RyID09ICdcdCcgfHwKLSAgICAgICAgICAgICAgICAqc291cmNlX2xpbmVfc3RyID09ICdcMDE0JykKLSAgICAgICAgICAgIHNvdXJjZV9saW5lX3N0cisrOworICAgIGNoYXIgKnNvdXJjZV9saW5lX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzb3VyY2VsaW5lKTsKKyAgICB3aGlsZSAoKnNvdXJjZV9saW5lX3N0ciA9PSAnICcgfHwgKnNvdXJjZV9saW5lX3N0ciA9PSAnXHQnIHx8CisgICAgICAgICpzb3VyY2VfbGluZV9zdHIgPT0gJ1wwMTQnKQorICAgICAgICBzb3VyY2VfbGluZV9zdHIrKzsKIAotICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoc291cmNlX2xpbmVfc3RyLCBmX3N0ZGVycik7Ci0gICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmX3N0ZGVycik7CisgICAgUHlGaWxlX1dyaXRlU3RyaW5nKHNvdXJjZV9saW5lX3N0ciwgZl9zdGRlcnIpOworICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmX3N0ZGVycik7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgX1B5X0Rpc3BsYXlTb3VyY2VMaW5lKGZfc3RkZXJyLCBQeVN0cmluZ19BU19TVFJJTkcoZmlsZW5hbWUpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgMik7CisgICAgX1B5X0Rpc3BsYXlTb3VyY2VMaW5lKGZfc3RkZXJyLCBQeVN0cmluZ19BU19TVFJJTkcoZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIDIpOwogICAgIFB5RXJyX0NsZWFyKCk7CiB9CiAKQEAgLTI4MSwxNjYgKzI4MSwxNjYgQEAKICAgICBQeU9iamVjdCAqaXRlbSA9IFB5X05vbmU7CiAgICAgY29uc3QgY2hhciAqYWN0aW9uOwogICAgIGludCByYzsKLSAgICAKKwogICAgIGlmIChyZWdpc3RyeSAmJiAhUHlEaWN0X0NoZWNrKHJlZ2lzdHJ5KSAmJiAocmVnaXN0cnkgIT0gUHlfTm9uZSkpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIidyZWdpc3RyeScgbXVzdCBiZSBhIGRpY3QiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIidyZWdpc3RyeScgbXVzdCBiZSBhIGRpY3QiKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICAvKiBOb3JtYWxpemUgbW9kdWxlLiAqLwogICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgewotICAgICAgICBtb2R1bGUgPSBub3JtYWxpemVfbW9kdWxlKGZpbGVuYW1lKTsKLSAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW9kdWxlID0gbm9ybWFsaXplX21vZHVsZShmaWxlbmFtZSk7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBQeV9JTkNSRUYobW9kdWxlKTsKKyAgICBQeV9JTkNSRUYobW9kdWxlKTsKIAogICAgIC8qIE5vcm1hbGl6ZSBtZXNzYWdlLiAqLwogICAgIFB5X0lOQ1JFRihtZXNzYWdlKTsgIC8qIERFQ1JFRidlZCBpbiBjbGVhbnVwLiAqLwogICAgIHJjID0gUHlPYmplY3RfSXNJbnN0YW5jZShtZXNzYWdlLCBQeUV4Y19XYXJuaW5nKTsKICAgICBpZiAocmMgPT0gLTEpIHsKLSAgICAgICAgZ290byBjbGVhbnVwOworICAgIGdvdG8gY2xlYW51cDsKICAgICB9CiAgICAgaWYgKHJjID09IDEpIHsKLSAgICAgICAgdGV4dCA9IFB5T2JqZWN0X1N0cihtZXNzYWdlKTsKLSAgICAgICAgaWYgKHRleHQgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgY2F0ZWdvcnkgPSAoUHlPYmplY3QqKW1lc3NhZ2UtPm9iX3R5cGU7CisgICAgdGV4dCA9IFB5T2JqZWN0X1N0cihtZXNzYWdlKTsKKyAgICBpZiAodGV4dCA9PSBOVUxMKQorICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgY2F0ZWdvcnkgPSAoUHlPYmplY3QqKW1lc3NhZ2UtPm9iX3R5cGU7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICB0ZXh0ID0gbWVzc2FnZTsKLSAgICAgICAgbWVzc2FnZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjYXRlZ29yeSwgIk8iLCBtZXNzYWdlKTsKLSAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB0ZXh0ID0gbWVzc2FnZTsKKyAgICBtZXNzYWdlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGNhdGVnb3J5LCAiTyIsIG1lc3NhZ2UpOworICAgIGlmIChtZXNzYWdlID09IE5VTEwpCisgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICB9CiAKICAgICBsaW5lbm9fb2JqID0gUHlJbnRfRnJvbUxvbmcobGluZW5vKTsKICAgICBpZiAobGluZW5vX29iaiA9PSBOVUxMKQotICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgZ290byBjbGVhbnVwOwogCiAgICAgLyogQ3JlYXRlIGtleS4gKi8KICAgICBrZXkgPSBQeVR1cGxlX1BhY2soMywgdGV4dCwgY2F0ZWdvcnksIGxpbmVub19vYmopOwogICAgIGlmIChrZXkgPT0gTlVMTCkKLSAgICAgICAgZ290byBjbGVhbnVwOworICAgIGdvdG8gY2xlYW51cDsKIAogICAgIGlmICgocmVnaXN0cnkgIT0gTlVMTCkgJiYgKHJlZ2lzdHJ5ICE9IFB5X05vbmUpKSB7Ci0gICAgICAgIHJjID0gYWxyZWFkeV93YXJuZWQocmVnaXN0cnksIGtleSwgMCk7Ci0gICAgICAgIGlmIChyYyA9PSAtMSkKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLQllbHNlIGlmIChyYyA9PSAxKQotICAgICAgICAgICAgZ290byByZXR1cm5fbm9uZTsKLSAgICAgICAgLyogRWxzZSB0aGlzIHdhcm5pbmcgaGFzbid0IGJlZW4gZ2VuZXJhdGVkIGJlZm9yZS4gKi8KKyAgICByYyA9IGFscmVhZHlfd2FybmVkKHJlZ2lzdHJ5LCBrZXksIDApOworICAgIGlmIChyYyA9PSAtMSkKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGVsc2UgaWYgKHJjID09IDEpCisgICAgICAgIGdvdG8gcmV0dXJuX25vbmU7CisgICAgLyogRWxzZSB0aGlzIHdhcm5pbmcgaGFzbid0IGJlZW4gZ2VuZXJhdGVkIGJlZm9yZS4gKi8KICAgICB9CiAKICAgICBhY3Rpb24gPSBnZXRfZmlsdGVyKGNhdGVnb3J5LCB0ZXh0LCBsaW5lbm8sIG1vZHVsZSwgJml0ZW0pOwogICAgIGlmIChhY3Rpb24gPT0gTlVMTCkKLSAgICAgICAgZ290byBjbGVhbnVwOworICAgIGdvdG8gY2xlYW51cDsKIAogICAgIGlmIChzdHJjbXAoYWN0aW9uLCAiZXJyb3IiKSA9PSAwKSB7Ci0gICAgICAgIFB5RXJyX1NldE9iamVjdChjYXRlZ29yeSwgbWVzc2FnZSk7Ci0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBQeUVycl9TZXRPYmplY3QoY2F0ZWdvcnksIG1lc3NhZ2UpOworICAgIGdvdG8gY2xlYW51cDsKICAgICB9CiAKICAgICAvKiBTdG9yZSBpbiB0aGUgcmVnaXN0cnkgdGhhdCB3ZSd2ZSBiZWVuIGhlcmUsICpleGNlcHQqIHdoZW4gdGhlIGFjdGlvbgogICAgICAgIGlzICJhbHdheXMiLiAqLwogICAgIHJjID0gMDsKICAgICBpZiAoc3RyY21wKGFjdGlvbiwgImFsd2F5cyIpICE9IDApIHsKLSAgICAgICAgaWYgKHJlZ2lzdHJ5ICE9IE5VTEwgJiYgcmVnaXN0cnkgIT0gUHlfTm9uZSAmJgotICAgICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtKHJlZ2lzdHJ5LCBrZXksIFB5X1RydWUpIDwgMCkKKyAgICBpZiAocmVnaXN0cnkgIT0gTlVMTCAmJiByZWdpc3RyeSAhPSBQeV9Ob25lICYmCisgICAgICAgIFB5RGljdF9TZXRJdGVtKHJlZ2lzdHJ5LCBrZXksIFB5X1RydWUpIDwgMCkKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJpZ25vcmUiKSA9PSAwKQorICAgICAgICBnb3RvIHJldHVybl9ub25lOworICAgIGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJvbmNlIikgPT0gMCkgeworICAgICAgICBpZiAocmVnaXN0cnkgPT0gTlVMTCB8fCByZWdpc3RyeSA9PSBQeV9Ob25lKSB7CisgICAgICAgIHJlZ2lzdHJ5ID0gZ2V0X29uY2VfcmVnaXN0cnkoKTsKKyAgICAgICAgaWYgKHJlZ2lzdHJ5ID09IE5VTEwpCiAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJpZ25vcmUiKSA9PSAwKQotICAgICAgICAgICAgZ290byByZXR1cm5fbm9uZTsKLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFjdGlvbiwgIm9uY2UiKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocmVnaXN0cnkgPT0gTlVMTCB8fCByZWdpc3RyeSA9PSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICAgICAgcmVnaXN0cnkgPSBnZXRfb25jZV9yZWdpc3RyeSgpOwotICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyeSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBfb25jZV9yZWdpc3RyeVsodGV4dCwgY2F0ZWdvcnkpXSA9IDEgKi8KLSAgICAgICAgICAgIHJjID0gdXBkYXRlX3JlZ2lzdHJ5KHJlZ2lzdHJ5LCB0ZXh0LCBjYXRlZ29yeSwgMCk7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoc3RyY21wKGFjdGlvbiwgIm1vZHVsZSIpID09IDApIHsKLSAgICAgICAgICAgIC8qIHJlZ2lzdHJ5Wyh0ZXh0LCBjYXRlZ29yeSwgMCldID0gMSAqLwotICAgICAgICAgICAgaWYgKHJlZ2lzdHJ5ICE9IE5VTEwgJiYgcmVnaXN0cnkgIT0gUHlfTm9uZSkKLSAgICAgICAgICAgICAgICByYyA9IHVwZGF0ZV9yZWdpc3RyeShyZWdpc3RyeSwgdGV4dCwgY2F0ZWdvcnksIDApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJkZWZhdWx0IikgIT0gMCkgewotICAgICAgICAgICAgUHlPYmplY3QgKnRvX3N0ciA9IFB5T2JqZWN0X1N0cihpdGVtKTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycl9zdHIgPSAiPz8/IjsKKyAgICAgICAgLyogX29uY2VfcmVnaXN0cnlbKHRleHQsIGNhdGVnb3J5KV0gPSAxICovCisgICAgICAgIHJjID0gdXBkYXRlX3JlZ2lzdHJ5KHJlZ2lzdHJ5LCB0ZXh0LCBjYXRlZ29yeSwgMCk7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChhY3Rpb24sICJtb2R1bGUiKSA9PSAwKSB7CisgICAgICAgIC8qIHJlZ2lzdHJ5Wyh0ZXh0LCBjYXRlZ29yeSwgMCldID0gMSAqLworICAgICAgICBpZiAocmVnaXN0cnkgIT0gTlVMTCAmJiByZWdpc3RyeSAhPSBQeV9Ob25lKQorICAgICAgICByYyA9IHVwZGF0ZV9yZWdpc3RyeShyZWdpc3RyeSwgdGV4dCwgY2F0ZWdvcnksIDApOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJjbXAoYWN0aW9uLCAiZGVmYXVsdCIpICE9IDApIHsKKyAgICAgICAgUHlPYmplY3QgKnRvX3N0ciA9IFB5T2JqZWN0X1N0cihpdGVtKTsKKyAgICAgICAgY29uc3QgY2hhciAqZXJyX3N0ciA9ICI/Pz8iOwogCi0gICAgICAgICAgICBpZiAodG9fc3RyICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgZXJyX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh0b19zdHIpOwotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgYWN0aW9uICglcykgaW4gd2FybmluZ3MuZmlsdGVyczpcbiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIGVycl9zdHIpOwotICAgICAgICAgICAgUHlfWERFQ1JFRih0b19zdHIpOwotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9CisgICAgICAgIGlmICh0b19zdHIgIT0gTlVMTCkKKyAgICAgICAgZXJyX3N0ciA9IFB5U3RyaW5nX0FTX1NUUklORyh0b19zdHIpOworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIGFjdGlvbiAoJXMpIGluIHdhcm5pbmdzLmZpbHRlcnM6XG4gJXMiLAorICAgICAgICAgICAgICAgICAgICBhY3Rpb24sIGVycl9zdHIpOworICAgICAgICBQeV9YREVDUkVGKHRvX3N0cik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAgICAgfQogCiAgICAgaWYgKHJjID09IDEpICAvKiBBbHJlYWR5IHdhcm5lZCBmb3IgdGhpcyBtb2R1bGUuICovCi0gICAgICAgIGdvdG8gcmV0dXJuX25vbmU7CisgICAgZ290byByZXR1cm5fbm9uZTsKICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICBQeU9iamVjdCAqc2hvd19meG4gPSBnZXRfd2FybmluZ3NfYXR0cigic2hvd3dhcm5pbmciKTsKLSAgICAgICAgaWYgKHNob3dfZnhuID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIHNob3dfd2FybmluZyhmaWxlbmFtZSwgbGluZW5vLCB0ZXh0LCBjYXRlZ29yeSwgc291cmNlbGluZSk7CisgICAgUHlPYmplY3QgKnNob3dfZnhuID0gZ2V0X3dhcm5pbmdzX2F0dHIoInNob3d3YXJuaW5nIik7CisgICAgaWYgKHNob3dfZnhuID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgc2hvd193YXJuaW5nKGZpbGVuYW1lLCBsaW5lbm8sIHRleHQsIGNhdGVnb3J5LCBzb3VyY2VsaW5lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm1zZyA9ICJmdW5jdGlvbnMgb3ZlcnJpZGluZyB3YXJuaW5ncy5zaG93d2FybmluZygpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBzdXBwb3J0IHRoZSAnbGluZScgYXJndW1lbnQiOworICAgICAgICBjb25zdCBjaGFyICp0ZXh0X2NoYXIgPSBQeVN0cmluZ19BU19TVFJJTkcodGV4dCk7CisKKyAgICAgICAgaWYgKHN0cmNtcChtc2csIHRleHRfY2hhcikgPT0gMCkgeworICAgICAgICAvKiBQcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbiBieSB1c2luZyBidWlsdC1pbiBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICBvZiBzaG93d2FybmluZygpLiAqLworICAgICAgICBzaG93X3dhcm5pbmcoZmlsZW5hbWUsIGxpbmVubywgdGV4dCwgY2F0ZWdvcnksIHNvdXJjZWxpbmUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnID0gImZ1bmN0aW9ucyBvdmVycmlkaW5nIHdhcm5pbmdzLnNob3d3YXJuaW5nKCkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBzdXBwb3J0IHRoZSAnbGluZScgYXJndW1lbnQiOwotICAgICAgICAgICAgY29uc3QgY2hhciAqdGV4dF9jaGFyID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRleHQpOworICAgICAgICBQeU9iamVjdCAqY2hlY2tfZnhuOworICAgICAgICBQeU9iamVjdCAqZGVmYXVsdHM7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CiAKLSAgICAgICAgICAgIGlmIChzdHJjbXAobXNnLCB0ZXh0X2NoYXIpID09IDApIHsKLSAgICAgICAgICAgICAgICAvKiBQcmV2ZW50IGluZmluaXRlIHJlY3Vyc2lvbiBieSB1c2luZyBidWlsdC1pbiBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgICAgICAgIG9mIHNob3d3YXJuaW5nKCkuICovCi0gICAgICAgICAgICAgICAgc2hvd193YXJuaW5nKGZpbGVuYW1lLCBsaW5lbm8sIHRleHQsIGNhdGVnb3J5LCBzb3VyY2VsaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjaGVja19meG47Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmRlZmF1bHRzOwotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIGlmIChQeU1ldGhvZF9DaGVjayhzaG93X2Z4bikpCisgICAgICAgICAgICBjaGVja19meG4gPSBQeU1ldGhvZF9GdW5jdGlvbihzaG93X2Z4bik7CisgICAgICAgIGVsc2UgaWYgKFB5RnVuY3Rpb25fQ2hlY2soc2hvd19meG4pKQorICAgICAgICAgICAgY2hlY2tfZnhuID0gc2hvd19meG47CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZ3Muc2hvd3dhcm5pbmcoKSBtdXN0IGJlIHNldCB0byBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gb3IgbWV0aG9kIik7CisgICAgICAgICAgICBQeV9ERUNSRUYoc2hvd19meG4pOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoUHlNZXRob2RfQ2hlY2soc2hvd19meG4pKQotICAgICAgICAgICAgICAgICAgICBjaGVja19meG4gPSBQeU1ldGhvZF9GdW5jdGlvbihzaG93X2Z4bik7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUHlGdW5jdGlvbl9DaGVjayhzaG93X2Z4bikpCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrX2Z4biA9IHNob3dfZnhuOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm5pbmdzLnNob3d3YXJuaW5nKCkgbXVzdCBiZSBzZXQgdG8gYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gb3IgbWV0aG9kIik7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzaG93X2Z4bik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0cyA9IFB5RnVuY3Rpb25fR2V0RGVmYXVsdHMoY2hlY2tfZnhuKTsKLSAgICAgICAgICAgICAgICAvKiBBIHByb3BlciBpbXBsZW1lbnRhdGlvbiBvZiB3YXJuaW5ncy5zaG93d2FybmluZygpIHNob3VsZAotICAgICAgICAgICAgICAgICAgICBoYXZlIGF0IGxlYXN0IHR3byBkZWZhdWx0IGFyZ3VtZW50cy4gKi8KLSAgICAgICAgICAgICAgICBpZiAoKGRlZmF1bHRzID09IE5VTEwpIHx8IChQeVR1cGxlX1NpemUoZGVmYXVsdHMpIDwgMikpIHsKLQkgICAgICAgICAgICBQeUNvZGVPYmplY3QgKmNvZGUgPSAoUHlDb2RlT2JqZWN0ICopCi0JCQkJCQlQeUZ1bmN0aW9uX0dldENvZGUoY2hlY2tfZnhuKTsKLQkJICAgIGlmICghKGNvZGUtPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykpIHsKLQkJICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgbXNnLCAxKSA8Ci0JCQkJMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzaG93X2Z4bik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHNob3dfZnhuLCBtZXNzYWdlLCBjYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZW5vX29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgZGVmYXVsdHMgPSBQeUZ1bmN0aW9uX0dldERlZmF1bHRzKGNoZWNrX2Z4bik7CisgICAgICAgIC8qIEEgcHJvcGVyIGltcGxlbWVudGF0aW9uIG9mIHdhcm5pbmdzLnNob3d3YXJuaW5nKCkgc2hvdWxkCisgICAgICAgICAgICBoYXZlIGF0IGxlYXN0IHR3byBkZWZhdWx0IGFyZ3VtZW50cy4gKi8KKyAgICAgICAgaWYgKChkZWZhdWx0cyA9PSBOVUxMKSB8fCAoUHlUdXBsZV9TaXplKGRlZmF1bHRzKSA8IDIpKSB7CisgICAgICAgICAgICBQeUNvZGVPYmplY3QgKmNvZGUgPSAoUHlDb2RlT2JqZWN0ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9HZXRDb2RlKGNoZWNrX2Z4bik7CisgICAgICAgICAgICBpZiAoIShjb2RlLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgbXNnLCAxKSA8CisgICAgICAgICAgICAgICAgMCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzaG93X2Z4bik7Ci0gICAgICAgICAgICAgICAgUHlfWERFQ1JFRihyZXMpOwotICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHNob3dfZnhuLCBtZXNzYWdlLCBjYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVub19vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoc2hvd19meG4pOworICAgICAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgIH0KICAgICB9CiAgICAgZWxzZSAvKiBpZiAocmMgPT0gLTEpICovCi0gICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICBnb3RvIGNsZWFudXA7CiAKICByZXR1cm5fbm9uZToKICAgICByZXN1bHQgPSBQeV9Ob25lOwpAQCAtNDY2LDE1ICs0NjYsMTUgQEAKICAgICAvKiBTZXR1cCBnbG9iYWxzIGFuZCBsaW5lbm8uICovCiAgICAgUHlGcmFtZU9iamVjdCAqZiA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmZyYW1lOwogICAgIHdoaWxlICgtLXN0YWNrX2xldmVsID4gMCAmJiBmICE9IE5VTEwpCi0gICAgICAgIGYgPSBmLT5mX2JhY2s7CisgICAgZiA9IGYtPmZfYmFjazsKIAogICAgIGlmIChmID09IE5VTEwpIHsKLSAgICAgICAgZ2xvYmFscyA9IFB5VGhyZWFkU3RhdGVfR2V0KCktPmludGVycC0+c3lzZGljdDsKLSAgICAgICAgKmxpbmVubyA9IDE7CisgICAgZ2xvYmFscyA9IFB5VGhyZWFkU3RhdGVfR2V0KCktPmludGVycC0+c3lzZGljdDsKKyAgICAqbGluZW5vID0gMTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGdsb2JhbHMgPSBmLT5mX2dsb2JhbHM7Ci0gICAgICAgICpsaW5lbm8gPSBQeUNvZGVfQWRkcjJMaW5lKGYtPmZfY29kZSwgZi0+Zl9sYXN0aSk7CisgICAgZ2xvYmFscyA9IGYtPmZfZ2xvYmFsczsKKyAgICAqbGluZW5vID0gUHlDb2RlX0FkZHIyTGluZShmLT5mX2NvZGUsIGYtPmZfbGFzdGkpOwogICAgIH0KIAogICAgICptb2R1bGUgPSBOVUxMOwpAQCAtNDg0LDg0ICs0ODQsODQgQEAKICAgICBhc3NlcnQoUHlEaWN0X0NoZWNrKGdsb2JhbHMpKTsKICAgICAqcmVnaXN0cnkgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX193YXJuaW5ncmVnaXN0cnlfXyIpOwogICAgIGlmICgqcmVnaXN0cnkgPT0gTlVMTCkgewotICAgICAgICBpbnQgcmM7CisgICAgaW50IHJjOwogCi0gICAgICAgICpyZWdpc3RyeSA9IFB5RGljdF9OZXcoKTsKLSAgICAgICAgaWYgKCpyZWdpc3RyeSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgKnJlZ2lzdHJ5ID0gUHlEaWN0X05ldygpOworICAgIGlmICgqcmVnaXN0cnkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgIHJjID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fd2FybmluZ3JlZ2lzdHJ5X18iLCAqcmVnaXN0cnkpOwotICAgICAgICAgaWYgKHJjIDwgMCkKLSAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOworICAgICByYyA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX3dhcm5pbmdyZWdpc3RyeV9fIiwgKnJlZ2lzdHJ5KTsKKyAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7CiAgICAgfQogICAgIGVsc2UKLSAgICAgICAgUHlfSU5DUkVGKCpyZWdpc3RyeSk7CisgICAgUHlfSU5DUkVGKCpyZWdpc3RyeSk7CiAKICAgICAvKiBTZXR1cCBtb2R1bGUuICovCiAgICAgKm1vZHVsZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX25hbWVfXyIpOwogICAgIGlmICgqbW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgKm1vZHVsZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxzdHJpbmc+Iik7Ci0gICAgICAgIGlmICgqbW9kdWxlID09IE5VTEwpCi0gICAgICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKKyAgICAqbW9kdWxlID0gUHlTdHJpbmdfRnJvbVN0cmluZygiPHN0cmluZz4iKTsKKyAgICBpZiAoKm1vZHVsZSA9PSBOVUxMKQorICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKICAgICB9CiAgICAgZWxzZQotICAgICAgICBQeV9JTkNSRUYoKm1vZHVsZSk7CisgICAgUHlfSU5DUkVGKCptb2R1bGUpOwogCiAgICAgLyogU2V0dXAgZmlsZW5hbWUuICovCiAgICAgKmZpbGVuYW1lID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fZmlsZV9fIik7CiAgICAgaWYgKCpmaWxlbmFtZSAhPSBOVUxMKSB7Ci0JICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfU2l6ZSgqZmlsZW5hbWUpOwotICAgICAgICBjb25zdCBjaGFyICpmaWxlX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKCpmaWxlbmFtZSk7Ci0JICAgIGlmIChmaWxlX3N0ciA9PSBOVUxMIHx8IChsZW4gPCAwICYmIFB5RXJyX09jY3VycmVkKCkpKQotICAgICAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7CisgICAgICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfU2l6ZSgqZmlsZW5hbWUpOworICAgIGNvbnN0IGNoYXIgKmZpbGVfc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoKmZpbGVuYW1lKTsKKyAgICAgICAgaWYgKGZpbGVfc3RyID09IE5VTEwgfHwgKGxlbiA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkpCisgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOwogCi0gICAgICAgIC8qIGlmIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoKCIucHljIiwgIi5weW8iKSk6ICovCi0gICAgICAgIGlmIChsZW4gPj0gNCAmJgotICAgICAgICAgICAgZmlsZV9zdHJbbGVuLTRdID09ICcuJyAmJgotICAgICAgICAgICAgdG9sb3dlcihmaWxlX3N0cltsZW4tM10pID09ICdwJyAmJgotICAgICAgICAgICAgdG9sb3dlcihmaWxlX3N0cltsZW4tMl0pID09ICd5JyAmJgotICAgICAgICAgICAgKHRvbG93ZXIoZmlsZV9zdHJbbGVuLTFdKSA9PSAnYycgfHwKLSAgICAgICAgICAgICAgICB0b2xvd2VyKGZpbGVfc3RyW2xlbi0xXSkgPT0gJ28nKSkKLSAgICAgICAgewotICAgICAgICAgICAgKmZpbGVuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZmlsZV9zdHIsIGxlbi0xKTsKLQkgICAgICAgIGlmICgqZmlsZW5hbWUgPT0gTlVMTCkKLQkJICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKLQkgICAgfQotCSAgICBlbHNlCi0gICAgICAgICAgICBQeV9JTkNSRUYoKmZpbGVuYW1lKTsKKyAgICAvKiBpZiBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCgiLnB5YyIsICIucHlvIikpOiAqLworICAgIGlmIChsZW4gPj0gNCAmJgorICAgICAgICBmaWxlX3N0cltsZW4tNF0gPT0gJy4nICYmCisgICAgICAgIHRvbG93ZXIoZmlsZV9zdHJbbGVuLTNdKSA9PSAncCcgJiYKKyAgICAgICAgdG9sb3dlcihmaWxlX3N0cltsZW4tMl0pID09ICd5JyAmJgorICAgICAgICAodG9sb3dlcihmaWxlX3N0cltsZW4tMV0pID09ICdjJyB8fAorICAgICAgICB0b2xvd2VyKGZpbGVfc3RyW2xlbi0xXSkgPT0gJ28nKSkKKyAgICB7CisgICAgICAgICpmaWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGZpbGVfc3RyLCBsZW4tMSk7CisgICAgICAgIGlmICgqZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgUHlfSU5DUkVGKCpmaWxlbmFtZSk7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBjb25zdCBjaGFyICptb2R1bGVfc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoKm1vZHVsZSk7Ci0gICAgICAgIGlmIChtb2R1bGVfc3RyICYmIHN0cmNtcChtb2R1bGVfc3RyLCAiX19tYWluX18iKSA9PSAwKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqYXJndiA9IFB5U3lzX0dldE9iamVjdCgiYXJndiIpOwotICAgICAgICAgICAgaWYgKGFyZ3YgIT0gTlVMTCAmJiBQeUxpc3RfU2l6ZShhcmd2KSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQgaXNfdHJ1ZTsKLSAgICAgICAgICAgICAgICAqZmlsZW5hbWUgPSBQeUxpc3RfR2V0SXRlbShhcmd2LCAwKTsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoKmZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICAvKiBJZiBzeXMuYXJndlswXSBpcyBmYWxzZSwgdGhlbiB1c2UgJ19fbWFpbl9fJy4gKi8KLSAgICAgICAgICAgICAgICBpc190cnVlID0gUHlPYmplY3RfSXNUcnVlKCpmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzX3RydWUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRigqZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIWlzX3RydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKCpmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICpmaWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl9fbWFpbl9fIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqZmlsZW5hbWUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIGVtYmVkZGVkIGludGVycHJldGVycyBkb24ndCBoYXZlIHN5cy5hcmd2LCBzZWUgYnVnICM4MzkxNTEgKi8KLSAgICAgICAgICAgICAgICAqZmlsZW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfX21haW5fXyIpOwotCSAgICAgICAgICAgIGlmICgqZmlsZW5hbWUgPT0gTlVMTCkKLQkgICAgICAgICAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7Ci0gICAgICAgICAgICB9CisgICAgY29uc3QgY2hhciAqbW9kdWxlX3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKCptb2R1bGUpOworICAgIGlmIChtb2R1bGVfc3RyICYmIHN0cmNtcChtb2R1bGVfc3RyLCAiX19tYWluX18iKSA9PSAwKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmd2ID0gUHlTeXNfR2V0T2JqZWN0KCJhcmd2Iik7CisgICAgICAgIGlmIChhcmd2ICE9IE5VTEwgJiYgUHlMaXN0X1NpemUoYXJndikgPiAwKSB7CisgICAgICAgIGludCBpc190cnVlOworICAgICAgICAqZmlsZW5hbWUgPSBQeUxpc3RfR2V0SXRlbShhcmd2LCAwKTsKKyAgICAgICAgUHlfSU5DUkVGKCpmaWxlbmFtZSk7CisgICAgICAgIC8qIElmIHN5cy5hcmd2WzBdIGlzIGZhbHNlLCB0aGVuIHVzZSAnX19tYWluX18nLiAqLworICAgICAgICBpc190cnVlID0gUHlPYmplY3RfSXNUcnVlKCpmaWxlbmFtZSk7CisgICAgICAgIGlmIChpc190cnVlIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKCpmaWxlbmFtZSk7CisgICAgICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKICAgICAgICAgfQotICAgICAgICBpZiAoKmZpbGVuYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgICpmaWxlbmFtZSA9ICptb2R1bGU7Ci0gICAgICAgICAgICBQeV9JTkNSRUYoKmZpbGVuYW1lKTsKKyAgICAgICAgZWxzZSBpZiAoIWlzX3RydWUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRigqZmlsZW5hbWUpOworICAgICAgICAgICAgKmZpbGVuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19tYWluX18iKTsKKyAgICAgICAgICAgIGlmICgqZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOwogICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgIC8qIGVtYmVkZGVkIGludGVycHJldGVycyBkb24ndCBoYXZlIHN5cy5hcmd2LCBzZWUgYnVnICM4MzkxNTEgKi8KKyAgICAgICAgKmZpbGVuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX19tYWluX18iKTsKKyAgICAgICAgICAgIGlmICgqZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOworICAgICAgICB9CisgICAgfQorICAgIGlmICgqZmlsZW5hbWUgPT0gTlVMTCkgeworICAgICAgICAqZmlsZW5hbWUgPSAqbW9kdWxlOworICAgICAgICBQeV9JTkNSRUYoKmZpbGVuYW1lKTsKKyAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIDE7CkBAIC01ODIsMjEgKzU4MiwyMSBAQAogICAgIC8qIEdldCBjYXRlZ29yeS4gKi8KICAgICByYyA9IFB5T2JqZWN0X0lzSW5zdGFuY2UobWVzc2FnZSwgUHlFeGNfV2FybmluZyk7CiAgICAgaWYgKHJjID09IC0xKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChyYyA9PSAxKQotICAgICAgICBjYXRlZ29yeSA9IChQeU9iamVjdCopbWVzc2FnZS0+b2JfdHlwZTsKKyAgICBjYXRlZ29yeSA9IChQeU9iamVjdCopbWVzc2FnZS0+b2JfdHlwZTsKICAgICBlbHNlIGlmIChjYXRlZ29yeSA9PSBOVUxMKQotICAgICAgICBjYXRlZ29yeSA9IFB5RXhjX1VzZXJXYXJuaW5nOworICAgIGNhdGVnb3J5ID0gUHlFeGNfVXNlcldhcm5pbmc7CiAKICAgICAvKiBWYWxpZGF0ZSBjYXRlZ29yeS4gKi8KICAgICByYyA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoY2F0ZWdvcnksIFB5RXhjX1dhcm5pbmcpOwogICAgIGlmIChyYyA9PSAtMSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2F0ZWdvcnkgaXMgbm90IGEgc3ViY2xhc3Mgb2YgV2FybmluZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImNhdGVnb3J5IGlzIG5vdCBhIHN1YmNsYXNzIG9mIFdhcm5pbmciKTsKKyAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICByZXR1cm4gY2F0ZWdvcnk7CkBAIC02MDksNyArNjA5LDcgQEAKICAgICBpbnQgbGluZW5vOwogCiAgICAgaWYgKCFzZXR1cF9jb250ZXh0KHN0YWNrX2xldmVsLCAmZmlsZW5hbWUsICZsaW5lbm8sICZtb2R1bGUsICZyZWdpc3RyeSkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgcmVzID0gd2Fybl9leHBsaWNpdChjYXRlZ29yeSwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLCByZWdpc3RyeSwKICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwpAQCAtNjI4LDExICs2MjgsMTEgQEAKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE9uOndhcm4iLCBrd19saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLCAmY2F0ZWdvcnksICZzdGFja19sZXZlbCkpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogCiAgICAgY2F0ZWdvcnkgPSBnZXRfY2F0ZWdvcnkobWVzc2FnZSwgY2F0ZWdvcnkpOwogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gZG9fd2FybihtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwpOwogfQogCkBAIC02NTIsNjggKzY1Miw2OCBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPT09pfE9PTzp3YXJuX2V4cGxpY2l0IiwKICAgICAgICAgICAgICAgICBrd2RfbGlzdCwgJm1lc3NhZ2UsICZjYXRlZ29yeSwgJmZpbGVuYW1lLCAmbGluZW5vLCAmbW9kdWxlLAogICAgICAgICAgICAgICAgICZyZWdpc3RyeSwgJm1vZHVsZV9nbG9iYWxzKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAobW9kdWxlX2dsb2JhbHMpIHsKLSAgICAgICAgc3RhdGljIFB5T2JqZWN0ICpnZXRfc291cmNlX25hbWUgPSBOVUxMOwotICAgICAgICBzdGF0aWMgUHlPYmplY3QgKnNwbGl0bGluZXNfbmFtZSA9IE5VTEw7Ci0gICAgICAgIFB5T2JqZWN0ICpsb2FkZXI7Ci0gICAgICAgIFB5T2JqZWN0ICptb2R1bGVfbmFtZTsKLSAgICAgICAgUHlPYmplY3QgKnNvdXJjZTsKLSAgICAgICAgUHlPYmplY3QgKnNvdXJjZV9saXN0OwotICAgICAgICBQeU9iamVjdCAqc291cmNlX2xpbmU7Ci0gICAgICAgIFB5T2JqZWN0ICpyZXR1cm5lZDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmdldF9zb3VyY2VfbmFtZSA9IE5VTEw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpzcGxpdGxpbmVzX25hbWUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsb2FkZXI7CisgICAgUHlPYmplY3QgKm1vZHVsZV9uYW1lOworICAgIFB5T2JqZWN0ICpzb3VyY2U7CisgICAgUHlPYmplY3QgKnNvdXJjZV9saXN0OworICAgIFB5T2JqZWN0ICpzb3VyY2VfbGluZTsKKyAgICBQeU9iamVjdCAqcmV0dXJuZWQ7CiAKLSAgICAgICAgaWYgKGdldF9zb3VyY2VfbmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBnZXRfc291cmNlX25hbWUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJnZXRfc291cmNlIik7Ci0gICAgICAgICAgICBpZiAoIWdldF9zb3VyY2VfbmFtZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3BsaXRsaW5lc19uYW1lID09IE5VTEwpIHsKLSAgICAgICAgICAgIHNwbGl0bGluZXNfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoInNwbGl0bGluZXMiKTsKLSAgICAgICAgICAgIGlmICghc3BsaXRsaW5lc19uYW1lKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgaWYgKGdldF9zb3VyY2VfbmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGdldF9zb3VyY2VfbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoImdldF9zb3VyY2UiKTsKKyAgICAgICAgaWYgKCFnZXRfc291cmNlX25hbWUpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoc3BsaXRsaW5lc19uYW1lID09IE5VTEwpIHsKKyAgICAgICAgc3BsaXRsaW5lc19uYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygic3BsaXRsaW5lcyIpOworICAgICAgICBpZiAoIXNwbGl0bGluZXNfbmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgICAgIC8qIENoZWNrL2dldCB0aGUgcmVxdWlzaXRlIHBpZWNlcyBuZWVkZWQgZm9yIHRoZSBsb2FkZXIuICovCi0gICAgICAgIGxvYWRlciA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZV9nbG9iYWxzLCAiX19sb2FkZXJfXyIpOwotICAgICAgICBtb2R1bGVfbmFtZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZV9nbG9iYWxzLCAiX19uYW1lX18iKTsKKyAgICAvKiBDaGVjay9nZXQgdGhlIHJlcXVpc2l0ZSBwaWVjZXMgbmVlZGVkIGZvciB0aGUgbG9hZGVyLiAqLworICAgIGxvYWRlciA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZV9nbG9iYWxzLCAiX19sb2FkZXJfXyIpOworICAgIG1vZHVsZV9uYW1lID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlX2dsb2JhbHMsICJfX25hbWVfXyIpOwogCi0gICAgICAgIGlmIChsb2FkZXIgPT0gTlVMTCB8fCBtb2R1bGVfbmFtZSA9PSBOVUxMKQotICAgICAgICAgICAgZ290byBzdGFuZGFyZF9jYWxsOworICAgIGlmIChsb2FkZXIgPT0gTlVMTCB8fCBtb2R1bGVfbmFtZSA9PSBOVUxMKQorICAgICAgICBnb3RvIHN0YW5kYXJkX2NhbGw7CiAKLSAgICAgICAgLyogTWFrZSBzdXJlIHRoZSBsb2FkZXIgaW1wbGVtZW50cyB0aGUgb3B0aW9uYWwgZ2V0X3NvdXJjZSgpIG1ldGhvZC4gKi8KLSAgICAgICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKGxvYWRlciwgImdldF9zb3VyY2UiKSkKLSAgICAgICAgICAgICAgICBnb3RvIHN0YW5kYXJkX2NhbGw7Ci0gICAgICAgIC8qIENhbGwgZ2V0X3NvdXJjZSgpIHRvIGdldCB0aGUgc291cmNlIGNvZGUuICovCi0gICAgICAgIHNvdXJjZSA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKGxvYWRlciwgZ2V0X3NvdXJjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUsIE5VTEwpOwotICAgICAgICBpZiAoIXNvdXJjZSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBlbHNlIGlmIChzb3VyY2UgPT0gUHlfTm9uZSkgewotICAgICAgICAgICAgUHlfREVDUkVGKFB5X05vbmUpOwotICAgICAgICAgICAgZ290byBzdGFuZGFyZF9jYWxsOwotICAgICAgICB9CisgICAgLyogTWFrZSBzdXJlIHRoZSBsb2FkZXIgaW1wbGVtZW50cyB0aGUgb3B0aW9uYWwgZ2V0X3NvdXJjZSgpIG1ldGhvZC4gKi8KKyAgICBpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcobG9hZGVyLCAiZ2V0X3NvdXJjZSIpKQorICAgICAgICBnb3RvIHN0YW5kYXJkX2NhbGw7CisgICAgLyogQ2FsbCBnZXRfc291cmNlKCkgdG8gZ2V0IHRoZSBzb3VyY2UgY29kZS4gKi8KKyAgICBzb3VyY2UgPSBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncyhsb2FkZXIsIGdldF9zb3VyY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUsIE5VTEwpOworICAgIGlmICghc291cmNlKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlIGlmIChzb3VyY2UgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9ERUNSRUYoUHlfTm9uZSk7CisgICAgICAgIGdvdG8gc3RhbmRhcmRfY2FsbDsKKyAgICB9CiAKLSAgICAgICAgLyogU3BsaXQgdGhlIHNvdXJjZSBpbnRvIGxpbmVzLiAqLwotICAgICAgICBzb3VyY2VfbGlzdCA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKHNvdXJjZSwgc3BsaXRsaW5lc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICBQeV9ERUNSRUYoc291cmNlKTsKLSAgICAgICAgaWYgKCFzb3VyY2VfbGlzdCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIFNwbGl0IHRoZSBzb3VyY2UgaW50byBsaW5lcy4gKi8KKyAgICBzb3VyY2VfbGlzdCA9IFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKHNvdXJjZSwgc3BsaXRsaW5lc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgUHlfREVDUkVGKHNvdXJjZSk7CisgICAgaWYgKCFzb3VyY2VfbGlzdCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgLyogR2V0IHRoZSBzb3VyY2UgbGluZS4gKi8KLSAgICAgICAgc291cmNlX2xpbmUgPSBQeUxpc3RfR2V0SXRlbShzb3VyY2VfbGlzdCwgbGluZW5vLTEpOwotICAgICAgICBpZiAoIXNvdXJjZV9saW5lKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc291cmNlX2xpc3QpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBIYW5kbGUgdGhlIHdhcm5pbmcuICovCi0gICAgICAgIHJldHVybmVkID0gd2Fybl9leHBsaWNpdChjYXRlZ29yeSwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LCBzb3VyY2VfbGluZSk7CisgICAgLyogR2V0IHRoZSBzb3VyY2UgbGluZS4gKi8KKyAgICBzb3VyY2VfbGluZSA9IFB5TGlzdF9HZXRJdGVtKHNvdXJjZV9saXN0LCBsaW5lbm8tMSk7CisgICAgaWYgKCFzb3VyY2VfbGluZSkgewogICAgICAgICBQeV9ERUNSRUYoc291cmNlX2xpc3QpOwotICAgICAgICByZXR1cm4gcmV0dXJuZWQ7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIEhhbmRsZSB0aGUgd2FybmluZy4gKi8KKyAgICByZXR1cm5lZCA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LCBzb3VyY2VfbGluZSk7CisgICAgUHlfREVDUkVGKHNvdXJjZV9saXN0KTsKKyAgICByZXR1cm4gcmV0dXJuZWQ7CiAgICAgfQogCiAgc3RhbmRhcmRfY2FsbDoKQEAgLTcyOSwxNSArNzI5LDE1IEBACiAgICAgUHlPYmplY3QgKnJlczsKICAgICBQeU9iamVjdCAqbWVzc2FnZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodGV4dCk7CiAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKIAogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQotICAgICAgICBjYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOworICAgIGNhdGVnb3J5ID0gUHlFeGNfUnVudGltZVdhcm5pbmc7CiAKICAgICByZXMgPSBkb193YXJuKG1lc3NhZ2UsIGNhdGVnb3J5LCBzdGFja19sZXZlbCk7CiAgICAgUHlfREVDUkVGKG1lc3NhZ2UpOwogICAgIGlmIChyZXMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAtMTsKICAgICBQeV9ERUNSRUYocmVzKTsKIAogICAgIHJldHVybiAwOwpAQCAtNzY3LDE5ICs3NjcsMTkgQEAKICAgICBpbnQgcmV0ID0gLTE7CiAKICAgICBpZiAobWVzc2FnZSA9PSBOVUxMIHx8IGZpbGVuYW1lID09IE5VTEwpCi0gICAgICAgIGdvdG8gZXhpdDsKKyAgICBnb3RvIGV4aXQ7CiAgICAgaWYgKG1vZHVsZV9zdHIgIT0gTlVMTCkgewotICAgICAgICBtb2R1bGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG1vZHVsZV9zdHIpOwotICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICBtb2R1bGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG1vZHVsZV9zdHIpOworICAgICAgICBpZiAobW9kdWxlID09IE5VTEwpCisgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKICAgICBpZiAoY2F0ZWdvcnkgPT0gTlVMTCkKLSAgICAgICAgY2F0ZWdvcnkgPSBQeUV4Y19SdW50aW1lV2FybmluZzsKKyAgICBjYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwogICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgIGdvdG8gZXhpdDsKKyAgICBnb3RvIGV4aXQ7CiAgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgcmV0ID0gMDsKIApAQCAtNzk5LDEyICs3OTksMTIgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHdhcm5pbmdzX2Z1bmN0aW9uc1tdID0gewogICAgIHsid2FybiIsIChQeUNGdW5jdGlvbil3YXJuaW5nc193YXJuLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotICAgICAgICB3YXJuX2RvY30sCisgICAgd2Fybl9kb2N9LAogICAgIHsid2Fybl9leHBsaWNpdCIsIChQeUNGdW5jdGlvbil3YXJuaW5nc193YXJuX2V4cGxpY2l0LAotICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCB3YXJuX2V4cGxpY2l0X2RvY30sCisgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgd2Fybl9leHBsaWNpdF9kb2N9LAogICAgIC8qIFhYWChicmV0dC5jYW5ub24pOiBhZGQgc2hvd3dhcm5pbmc/ICovCiAgICAgLyogWFhYKGJyZXR0LmNhbm5vbik6IFJlYXNvbmFibGUgdG8gYWRkIGZvcm1hdHdhcm5pbmc/ICovCi0gICAge05VTEwsIE5VTEx9CSAgICAgICAgLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgTlVMTH0gICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIApAQCAtODE4LDM3ICs4MTgsMzcgQEAKICAgICBQeU9iamVjdCAqbGluZW5vLCAqcmVzdWx0OwogCiAgICAgaWYgKCFzdHJjbXAoYWN0aW9uLCAiaWdub3JlIikpIHsKLSAgICAgICAgaWYgKGlnbm9yZV9zdHIgPT0gTlVMTCkgewotICAgICAgICAgICAgaWdub3JlX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoImlnbm9yZSIpOwotICAgICAgICAgICAgaWYgKGlnbm9yZV9zdHIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBhY3Rpb25fb2JqID0gaWdub3JlX3N0cjsKKyAgICBpZiAoaWdub3JlX3N0ciA9PSBOVUxMKSB7CisgICAgICAgIGlnbm9yZV9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJpZ25vcmUiKTsKKyAgICAgICAgaWYgKGlnbm9yZV9zdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFjdGlvbl9vYmogPSBpZ25vcmVfc3RyOwogICAgIH0KICAgICBlbHNlIGlmICghc3RyY21wKGFjdGlvbiwgImVycm9yIikpIHsKLSAgICAgICAgaWYgKGVycm9yX3N0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBlcnJvcl9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJlcnJvciIpOwotICAgICAgICAgICAgaWYgKGVycm9yX3N0ciA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGFjdGlvbl9vYmogPSBlcnJvcl9zdHI7CisgICAgaWYgKGVycm9yX3N0ciA9PSBOVUxMKSB7CisgICAgICAgIGVycm9yX3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoImVycm9yIik7CisgICAgICAgIGlmIChlcnJvcl9zdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFjdGlvbl9vYmogPSBlcnJvcl9zdHI7CiAgICAgfQogICAgIGVsc2UgaWYgKCFzdHJjbXAoYWN0aW9uLCAiZGVmYXVsdCIpKSB7Ci0gICAgICAgIGlmIChkZWZhdWx0X3N0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWZhdWx0X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoImRlZmF1bHQiKTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0X3N0ciA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGFjdGlvbl9vYmogPSBkZWZhdWx0X3N0cjsKKyAgICBpZiAoZGVmYXVsdF9zdHIgPT0gTlVMTCkgeworICAgICAgICBkZWZhdWx0X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoImRlZmF1bHQiKTsKKyAgICAgICAgaWYgKGRlZmF1bHRfc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhY3Rpb25fb2JqID0gZGVmYXVsdF9zdHI7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBQeV9GYXRhbEVycm9yKCJ1bmtub3duIGFjdGlvbiIpOworICAgIFB5X0ZhdGFsRXJyb3IoInVua25vd24gYWN0aW9uIik7CiAgICAgfQogCiAgICAgLyogVGhpcyBhc3N1bWVzIHRoZSBsaW5lIG51bWJlciBpcyB6ZXJvIGZvciBub3cuICovCiAgICAgbGluZW5vID0gUHlJbnRfRnJvbUxvbmcoMCk7CiAgICAgaWYgKGxpbmVubyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKICAgICByZXN1bHQgPSBQeVR1cGxlX1BhY2soNSwgYWN0aW9uX29iaiwgUHlfTm9uZSwgY2F0ZWdvcnksIFB5X05vbmUsIGxpbmVubyk7CiAgICAgUHlfREVDUkVGKGxpbmVubyk7CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTg2MCwyNSArODYwLDI1IEBACiAgICAgUHlPYmplY3QgKmZpbHRlcnMgPSBQeUxpc3RfTmV3KDMpOwogICAgIGNvbnN0IGNoYXIgKmJ5dGVzX2FjdGlvbjsKICAgICBpZiAoZmlsdGVycyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIAogICAgIFB5TGlzdF9TRVRfSVRFTShmaWx0ZXJzLCAwLAogICAgICAgICAgICAgICAgICAgICBjcmVhdGVfZmlsdGVyKFB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICJpZ25vcmUiKSk7CiAgICAgUHlMaXN0X1NFVF9JVEVNKGZpbHRlcnMsIDEsIGNyZWF0ZV9maWx0ZXIoUHlFeGNfSW1wb3J0V2FybmluZywgImlnbm9yZSIpKTsKICAgICBpZiAoUHlfQnl0ZXNXYXJuaW5nRmxhZyA+IDEpCi0gICAgICAgIGJ5dGVzX2FjdGlvbiA9ICJlcnJvciI7CisgICAgYnl0ZXNfYWN0aW9uID0gImVycm9yIjsKICAgICBlbHNlIGlmIChQeV9CeXRlc1dhcm5pbmdGbGFnKQotICAgICAgICBieXRlc19hY3Rpb24gPSAiZGVmYXVsdCI7CisgICAgYnl0ZXNfYWN0aW9uID0gImRlZmF1bHQiOwogICAgIGVsc2UKLSAgICAgICAgYnl0ZXNfYWN0aW9uID0gImlnbm9yZSI7CisgICAgYnl0ZXNfYWN0aW9uID0gImlnbm9yZSI7CiAgICAgUHlMaXN0X1NFVF9JVEVNKGZpbHRlcnMsIDIsIGNyZWF0ZV9maWx0ZXIoUHlFeGNfQnl0ZXNXYXJuaW5nLAogICAgICAgICAgICAgICAgICAgICBieXRlc19hY3Rpb24pKTsKIAogICAgIGlmIChQeUxpc3RfR0VUX0lURU0oZmlsdGVycywgMCkgPT0gTlVMTCB8fAotICAgICAgICBQeUxpc3RfR0VUX0lURU0oZmlsdGVycywgMSkgPT0gTlVMTCB8fAotICAgICAgICBQeUxpc3RfR0VUX0lURU0oZmlsdGVycywgMikgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoZmlsdGVycyk7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIFB5TGlzdF9HRVRfSVRFTShmaWx0ZXJzLCAxKSA9PSBOVUxMIHx8CisgICAgUHlMaXN0X0dFVF9JVEVNKGZpbHRlcnMsIDIpID09IE5VTEwpIHsKKyAgICBQeV9ERUNSRUYoZmlsdGVycyk7CisgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgcmV0dXJuIGZpbHRlcnM7CkBAIC04OTIsMjUgKzg5MiwyNSBAQAogCiAgICAgbSA9IFB5X0luaXRNb2R1bGUzKE1PRFVMRV9OQU1FLCB3YXJuaW5nc19mdW5jdGlvbnMsIHdhcm5pbmdzX19kb2NfXyk7CiAgICAgaWYgKG0gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOworICAgIHJldHVybjsKIAogICAgIF9maWx0ZXJzID0gaW5pdF9maWx0ZXJzKCk7CiAgICAgaWYgKF9maWx0ZXJzID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKKyAgICByZXR1cm47CiAgICAgUHlfSU5DUkVGKF9maWx0ZXJzKTsKICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJmaWx0ZXJzIiwgX2ZpbHRlcnMpIDwgMCkKLSAgICAgICAgcmV0dXJuOworICAgIHJldHVybjsKIAogICAgIF9vbmNlX3JlZ2lzdHJ5ID0gUHlEaWN0X05ldygpOwogICAgIGlmIChfb25jZV9yZWdpc3RyeSA9PSBOVUxMKQotICAgICAgICByZXR1cm47CisgICAgcmV0dXJuOwogICAgIFB5X0lOQ1JFRihfb25jZV9yZWdpc3RyeSk7CiAgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCAib25jZV9yZWdpc3RyeSIsIF9vbmNlX3JlZ2lzdHJ5KSA8IDApCi0gICAgICAgIHJldHVybjsKKyAgICByZXR1cm47CiAKICAgICBkZWZhdWx0X2FjdGlvbiA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoImRlZmF1bHQiKTsKICAgICBpZiAoZGVmYXVsdF9hY3Rpb24gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOworICAgIHJldHVybjsKICAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sIERFRkFVTFRfQUNUSU9OX05BTUUsIGRlZmF1bHRfYWN0aW9uKSA8IDApCi0gICAgICAgIHJldHVybjsKKyAgICByZXR1cm47CiB9CmRpZmYgLS1naXQgYS9QeXRob24vYXNkbC5jIGIvUHl0aG9uL2FzZGwuYwppbmRleCAxMTA1ZDNhLi5jMzBkN2QyMCAxMDA2NDQKLS0tIGEvUHl0aG9uL2FzZGwuYworKysgYi9QeXRob24vYXNkbC5jCkBAIC00LDYxICs0LDYxIEBACiBhc2RsX3NlcSAqCiBhc2RsX3NlcV9uZXcoaW50IHNpemUsIFB5QXJlbmEgKmFyZW5hKQogewotCWFzZGxfc2VxICpzZXEgPSBOVUxMOwotCXNpemVfdCBuID0gKHNpemUgPyAoc2l6ZW9mKHZvaWQgKikgKiAoc2l6ZSAtIDEpKSA6IDApOworICAgIGFzZGxfc2VxICpzZXEgPSBOVUxMOworICAgIHNpemVfdCBuID0gKHNpemUgPyAoc2l6ZW9mKHZvaWQgKikgKiAoc2l6ZSAtIDEpKSA6IDApOwogCi0JLyogY2hlY2sgc2l6ZSBpcyBzYW5lICovCi0JaWYgKHNpemUgPCAwIHx8IHNpemUgPT0gSU5UX01JTiB8fCAKLQkJKHNpemUgJiYgKChzaXplIC0gMSkgPiAoUFlfU0laRV9NQVggLyBzaXplb2Yodm9pZCAqKSkpKSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY2hlY2sgc2l6ZSBpcyBzYW5lICovCisgICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPT0gSU5UX01JTiB8fAorICAgICAgICAoc2l6ZSAmJiAoKHNpemUgLSAxKSA+IChQWV9TSVpFX01BWCAvIHNpemVvZih2b2lkICopKSkpKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIGNoZWNrIGlmIHNpemUgY2FuIGJlIGFkZGVkIHNhZmVseSAqLwotCWlmIChuID4gUFlfU0laRV9NQVggLSBzaXplb2YoYXNkbF9zZXEpKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBjaGVjayBpZiBzaXplIGNhbiBiZSBhZGRlZCBzYWZlbHkgKi8KKyAgICBpZiAobiA+IFBZX1NJWkVfTUFYIC0gc2l6ZW9mKGFzZGxfc2VxKSkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluICs9IHNpemVvZihhc2RsX3NlcSk7CisgICAgbiArPSBzaXplb2YoYXNkbF9zZXEpOwogCi0Jc2VxID0gKGFzZGxfc2VxICopUHlBcmVuYV9NYWxsb2MoYXJlbmEsIG4pOwotCWlmICghc2VxKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltZW1zZXQoc2VxLCAwLCBuKTsKLQlzZXEtPnNpemUgPSBzaXplOwotCXJldHVybiBzZXE7CisgICAgc2VxID0gKGFzZGxfc2VxICopUHlBcmVuYV9NYWxsb2MoYXJlbmEsIG4pOworICAgIGlmICghc2VxKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQoc2VxLCAwLCBuKTsKKyAgICBzZXEtPnNpemUgPSBzaXplOworICAgIHJldHVybiBzZXE7CiB9CiAKIGFzZGxfaW50X3NlcSAqCiBhc2RsX2ludF9zZXFfbmV3KGludCBzaXplLCBQeUFyZW5hICphcmVuYSkKIHsKLQlhc2RsX2ludF9zZXEgKnNlcSA9IE5VTEw7Ci0Jc2l6ZV90IG4gPSAoc2l6ZSA/IChzaXplb2Yodm9pZCAqKSAqIChzaXplIC0gMSkpIDogMCk7CisgICAgYXNkbF9pbnRfc2VxICpzZXEgPSBOVUxMOworICAgIHNpemVfdCBuID0gKHNpemUgPyAoc2l6ZW9mKHZvaWQgKikgKiAoc2l6ZSAtIDEpKSA6IDApOwogCi0JLyogY2hlY2sgc2l6ZSBpcyBzYW5lICovCi0JaWYgKHNpemUgPCAwIHx8IHNpemUgPT0gSU5UX01JTiB8fCAKLQkJKHNpemUgJiYgKChzaXplIC0gMSkgPiAoUFlfU0laRV9NQVggLyBzaXplb2Yodm9pZCAqKSkpKSkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBjaGVjayBzaXplIGlzIHNhbmUgKi8KKyAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA9PSBJTlRfTUlOIHx8CisgICAgICAgIChzaXplICYmICgoc2l6ZSAtIDEpID4gKFBZX1NJWkVfTUFYIC8gc2l6ZW9mKHZvaWQgKikpKSkpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBjaGVjayBpZiBzaXplIGNhbiBiZSBhZGRlZCBzYWZlbHkgKi8KLQlpZiAobiA+IFBZX1NJWkVfTUFYIC0gc2l6ZW9mKGFzZGxfc2VxKSkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogY2hlY2sgaWYgc2l6ZSBjYW4gYmUgYWRkZWQgc2FmZWx5ICovCisgICAgaWYgKG4gPiBQWV9TSVpFX01BWCAtIHNpemVvZihhc2RsX3NlcSkpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbiArPSBzaXplb2YoYXNkbF9zZXEpOworICAgIG4gKz0gc2l6ZW9mKGFzZGxfc2VxKTsKIAotCXNlcSA9IChhc2RsX2ludF9zZXEgKilQeUFyZW5hX01hbGxvYyhhcmVuYSwgbik7Ci0JaWYgKCFzZXEpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1lbXNldChzZXEsIDAsIG4pOwotCXNlcS0+c2l6ZSA9IHNpemU7Ci0JcmV0dXJuIHNlcTsKKyAgICBzZXEgPSAoYXNkbF9pbnRfc2VxICopUHlBcmVuYV9NYWxsb2MoYXJlbmEsIG4pOworICAgIGlmICghc2VxKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQoc2VxLCAwLCBuKTsKKyAgICBzZXEtPnNpemUgPSBzaXplOworICAgIHJldHVybiBzZXE7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vYXRvZi5jIGIvUHl0aG9uL2F0b2YuYwppbmRleCA4ZmJkZTM4Li41NjJmY2Q2IDEwMDY0NAotLS0gYS9QeXRob24vYXRvZi5jCisrKyBiL1B5dGhvbi9hdG9mLmMKQEAgLTEwLDQxICsxMCw0MSBAQAogCiBkb3VibGUgYXRvZihjaGFyICpzKQogewotCWRvdWJsZSBhID0gMC4wOwotCWludCBlID0gMDsKLQlpbnQgYzsKLQl3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnICYmIGlzZGlnaXQoYykpIHsKLQkJYSA9IGEqMTAuMCArIChjIC0gJzAnKTsKLQl9Ci0JaWYgKGMgPT0gJy4nKSB7Ci0JCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcgJiYgaXNkaWdpdChjKSkgewotCQkJYSA9IGEqMTAuMCArIChjIC0gJzAnKTsKLQkJCWUgPSBlLTE7Ci0JCX0KLQl9Ci0JaWYgKGMgPT0gJ2UnIHx8IGMgPT0gJ0UnKSB7Ci0JCWludCBzaWduID0gMTsKLQkJaW50IGkgPSAwOwotCQljID0gKnMrKzsKLQkJaWYgKGMgPT0gJysnKQotCQkJYyA9ICpzKys7Ci0JCWVsc2UgaWYgKGMgPT0gJy0nKSB7Ci0JCQljID0gKnMrKzsKLQkJCXNpZ24gPSAtMTsKLQkJfQotCQl3aGlsZSAoaXNkaWdpdChjKSkgewotCQkJaSA9IGkqMTAgKyAoYyAtICcwJyk7Ci0JCQljID0gKnMrKzsKLQkJfQotCQllICs9IGkqc2lnbjsKLQl9Ci0Jd2hpbGUgKGUgPiAwKSB7Ci0JCWEgKj0gMTAuMDsKLQkJZS0tOwotCX0KLQl3aGlsZSAoZSA8IDApIHsKLQkJYSAqPSAwLjE7Ci0JCWUrKzsKLQl9Ci0JcmV0dXJuIGE7CisgICAgZG91YmxlIGEgPSAwLjA7CisgICAgaW50IGUgPSAwOworICAgIGludCBjOworICAgIHdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcgJiYgaXNkaWdpdChjKSkgeworICAgICAgICBhID0gYSoxMC4wICsgKGMgLSAnMCcpOworICAgIH0KKyAgICBpZiAoYyA9PSAnLicpIHsKKyAgICAgICAgd2hpbGUgKChjID0gKnMrKykgIT0gJ1wwJyAmJiBpc2RpZ2l0KGMpKSB7CisgICAgICAgICAgICBhID0gYSoxMC4wICsgKGMgLSAnMCcpOworICAgICAgICAgICAgZSA9IGUtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYyA9PSAnZScgfHwgYyA9PSAnRScpIHsKKyAgICAgICAgaW50IHNpZ24gPSAxOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGMgPSAqcysrOworICAgICAgICBpZiAoYyA9PSAnKycpCisgICAgICAgICAgICBjID0gKnMrKzsKKyAgICAgICAgZWxzZSBpZiAoYyA9PSAnLScpIHsKKyAgICAgICAgICAgIGMgPSAqcysrOworICAgICAgICAgICAgc2lnbiA9IC0xOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChpc2RpZ2l0KGMpKSB7CisgICAgICAgICAgICBpID0gaSoxMCArIChjIC0gJzAnKTsKKyAgICAgICAgICAgIGMgPSAqcysrOworICAgICAgICB9CisgICAgICAgIGUgKz0gaSpzaWduOworICAgIH0KKyAgICB3aGlsZSAoZSA+IDApIHsKKyAgICAgICAgYSAqPSAxMC4wOworICAgICAgICBlLS07CisgICAgfQorICAgIHdoaWxlIChlIDwgMCkgeworICAgICAgICBhICo9IDAuMTsKKyAgICAgICAgZSsrOworICAgIH0KKyAgICByZXR1cm4gYTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9ibHRpbm1vZHVsZS5jIGIvUHl0aG9uL2JsdGlubW9kdWxlLmMKaW5kZXggMDhjYzhiMy4uNTdkOWRmOCAxMDA2NDQKLS0tIGEvUHl0aG9uL2JsdGlubW9kdWxlLmMKKysrIGIvUHl0aG9uL2JsdGlubW9kdWxlLmMKQEAgLTM0LDE5ICszNCwxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fX19pbXBvcnRfXyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJnbG9iYWxzIiwgImxvY2FscyIsICJmcm9tbGlzdCIsCi0JCQkJICJsZXZlbCIsIDB9OwotCWNoYXIgKm5hbWU7Ci0JUHlPYmplY3QgKmdsb2JhbHMgPSBOVUxMOwotCVB5T2JqZWN0ICpsb2NhbHMgPSBOVUxMOwotCVB5T2JqZWN0ICpmcm9tbGlzdCA9IE5VTEw7Ci0JaW50IGxldmVsID0gLTE7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJuYW1lIiwgImdsb2JhbHMiLCAibG9jYWxzIiwgImZyb21saXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxldmVsIiwgMH07CisgICAgY2hhciAqbmFtZTsKKyAgICBQeU9iamVjdCAqZ2xvYmFscyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmxvY2FscyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZyb21saXN0ID0gTlVMTDsKKyAgICBpbnQgbGV2ZWwgPSAtMTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJzfE9PT2k6X19pbXBvcnRfXyIsCi0JCQlrd2xpc3QsICZuYW1lLCAmZ2xvYmFscywgJmxvY2FscywgJmZyb21saXN0LCAmbGV2ZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwobmFtZSwgZ2xvYmFscywgbG9jYWxzLAotCQkJCQkgIGZyb21saXN0LCBsZXZlbCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgInN8T09PaTpfX2ltcG9ydF9fIiwKKyAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmbmFtZSwgJmdsb2JhbHMsICZsb2NhbHMsICZmcm9tbGlzdCwgJmxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsKG5hbWUsIGdsb2JhbHMsIGxvY2FscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbWxpc3QsIGxldmVsKTsKIH0KIAogUHlEb2NfU1RSVkFSKGltcG9ydF9kb2MsCkBAIC02Nyw3ICs2Nyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9hYnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCXJldHVybiBQeU51bWJlcl9BYnNvbHV0ZSh2KTsKKyAgICByZXR1cm4gUHlOdW1iZXJfQWJzb2x1dGUodik7CiB9CiAKIFB5RG9jX1NUUlZBUihhYnNfZG9jLApAQCAtNzgsMzggKzc4LDM4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9hbGwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICppdCwgKml0ZW07Ci0JUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOwotCWludCBjbXA7CisgICAgUHlPYmplY3QgKml0LCAqaXRlbTsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgaW50IGNtcDsKIAotCWl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OwogCi0JZm9yICg7OykgewotCQlpdGVtID0gaXRlcm5leHQoaXQpOwotCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWNtcCA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlpZiAoY21wIDwgMCkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChjbXAgPT0gMCkgewotCQkJUHlfREVDUkVGKGl0KTsKLQkJCVB5X1JFVFVSTl9GQUxTRTsKLQkJfQotCX0KLQlQeV9ERUNSRUYoaXQpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X1JFVFVSTl9UUlVFOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaXRlbSA9IGl0ZXJuZXh0KGl0KTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjbXAgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKGNtcCA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY21wID09IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fVFJVRTsKIH0KIAogUHlEb2NfU1RSVkFSKGFsbF9kb2MsCkBAIC0xMjAsMzggKzEyMCwzOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fYW55KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqaXQsICppdGVtOwotCVB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKLQlpbnQgY21wOworICAgIFB5T2JqZWN0ICppdCwgKml0ZW07CisgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIGludCBjbXA7CiAKLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JaWYgKGl0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKIAotCWZvciAoOzspIHsKLQkJaXRlbSA9IGl0ZXJuZXh0KGl0KTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkKLQkJCWJyZWFrOwotCQljbXAgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQkJaWYgKGNtcCA8IDApIHsKLQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoY21wID09IDEpIHsKLQkJCVB5X0RFQ1JFRihpdCk7Ci0JCQlQeV9SRVRVUk5fVFJVRTsKLQkJfQotCX0KLQlQeV9ERUNSRUYoaXQpOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X1JFVFVSTl9GQUxTRTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGl0ZW0gPSBpdGVybmV4dChpdCk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY21wID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIGlmIChjbXAgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNtcCA9PSAxKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9SRVRVUk5fRkFMU0U7CiB9CiAKIFB5RG9jX1NUUlZBUihhbnlfZG9jLApAQCAtMTYyLDM5ICsxNjIsMzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2FwcGx5KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqZnVuYywgKmFsaXN0ID0gTlVMTCwgKmt3ZGljdCA9IE5VTEw7Ci0JUHlPYmplY3QgKnQgPSBOVUxMLCAqcmV0dmFsID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZnVuYywgKmFsaXN0ID0gTlVMTCwgKmt3ZGljdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnQgPSBOVUxMLCAqcmV0dmFsID0gTlVMTDsKIAotCWlmIChQeUVycl9XYXJuUHkzaygiYXBwbHkoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgotCQkJICAgInVzZSBmdW5jKCphcmdzLCAqKmt3YXJncykiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiYXBwbHkoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgorICAgICAgICAgICAgICAgICAgICAgICAidXNlIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKSIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJhcHBseSIsIDEsIDMsICZmdW5jLCAmYWxpc3QsICZrd2RpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYWxpc3QgIT0gTlVMTCkgewotCQlpZiAoIVB5VHVwbGVfQ2hlY2soYWxpc3QpKSB7Ci0JCQlpZiAoIVB5U2VxdWVuY2VfQ2hlY2soYWxpc3QpKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICJhcHBseSgpIGFyZyAyIGV4cGVjdGVkIHNlcXVlbmNlLCBmb3VuZCAlcyIsCi0JCQkJCSAgICAgYWxpc3QtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJdCA9IFB5U2VxdWVuY2VfVHVwbGUoYWxpc3QpOwotCQkJaWYgKHQgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWFsaXN0ID0gdDsKLQkJfQotCX0KLQlpZiAoa3dkaWN0ICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrd2RpY3QpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJhcHBseSgpIGFyZyAzIGV4cGVjdGVkIGRpY3Rpb25hcnksIGZvdW5kICVzIiwKLQkJCSAgICAga3dkaWN0LT5vYl90eXBlLT50cF9uYW1lKTsKLQkJZ290byBmaW5hbGx5OwotCX0KLQlyZXR2YWwgPSBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhbGlzdCwga3dkaWN0KTsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJhcHBseSIsIDEsIDMsICZmdW5jLCAmYWxpc3QsICZrd2RpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoYWxpc3QgIT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYWxpc3QpKSB7CisgICAgICAgICAgICBpZiAoIVB5U2VxdWVuY2VfQ2hlY2soYWxpc3QpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJhcHBseSgpIGFyZyAyIGV4cGVjdGVkIHNlcXVlbmNlLCBmb3VuZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxpc3QtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdCA9IFB5U2VxdWVuY2VfVHVwbGUoYWxpc3QpOworICAgICAgICAgICAgaWYgKHQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGFsaXN0ID0gdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoa3dkaWN0ICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrd2RpY3QpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiYXBwbHkoKSBhcmcgMyBleHBlY3RlZCBkaWN0aW9uYXJ5LCBmb3VuZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICBrd2RpY3QtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQorICAgIHJldHZhbCA9IFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFsaXN0LCBrd2RpY3QpOwogICBmaW5hbGx5OgotCVB5X1hERUNSRUYodCk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBQeV9YREVDUkVGKHQpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIFB5RG9jX1NUUlZBUihhcHBseV9kb2MsCkBAIC0yMTEsNyArMjExLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2JpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0gICAgICAgIHJldHVybiBQeU51bWJlcl9Ub0Jhc2UodiwgMik7CisgICAgcmV0dXJuIFB5TnVtYmVyX1RvQmFzZSh2LCAyKTsKIH0KIAogUHlEb2NfU1RSVkFSKGJpbl9kb2MsCkBAIC0yMjMsMTAgKzIyMywxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fY2FsbGFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCWlmIChQeUVycl9XYXJuUHkzaygiY2FsbGFibGUoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgotCQkJICAgInVzZSBpc2luc3RhbmNlKHgsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKSIsIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeUNhbGxhYmxlX0NoZWNrKHYpKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImNhbGxhYmxlKCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInVzZSBpc2luc3RhbmNlKHgsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKSIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylQeUNhbGxhYmxlX0NoZWNrKHYpKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNhbGxhYmxlX2RvYywKQEAgLTIzOSwxMDkgKzIzOSwxMDkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2ZpbHRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpzZXEsICpyZXN1bHQsICppdCwgKmFyZzsKLQlQeV9zc2l6ZV90IGxlbjsgICAvKiBndWVzcyBmb3IgcmVzdWx0IGxpc3Qgc2l6ZSAqLwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgajsKKyAgICBQeU9iamVjdCAqZnVuYywgKnNlcSwgKnJlc3VsdCwgKml0LCAqYXJnOworICAgIFB5X3NzaXplX3QgbGVuOyAgIC8qIGd1ZXNzIGZvciByZXN1bHQgbGlzdCBzaXplICovCisgICAgcmVnaXN0ZXIgUHlfc3NpemVfdCBqOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZmlsdGVyIiwgMiwgMiwgJmZ1bmMsICZzZXEpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJmaWx0ZXIiLCAyLCAyLCAmZnVuYywgJnNlcSkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogU3RyaW5ncyBhbmQgdHVwbGVzIHJldHVybiBhIHJlc3VsdCBvZiB0aGUgc2FtZSB0eXBlLiAqLwotCWlmIChQeVN0cmluZ19DaGVjayhzZXEpKQotCQlyZXR1cm4gZmlsdGVyc3RyaW5nKGZ1bmMsIHNlcSk7CisgICAgLyogU3RyaW5ncyBhbmQgdHVwbGVzIHJldHVybiBhIHJlc3VsdCBvZiB0aGUgc2FtZSB0eXBlLiAqLworICAgIGlmIChQeVN0cmluZ19DaGVjayhzZXEpKQorICAgICAgICByZXR1cm4gZmlsdGVyc3RyaW5nKGZ1bmMsIHNlcSk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2soc2VxKSkKLQkJcmV0dXJuIGZpbHRlcnVuaWNvZGUoZnVuYywgc2VxKTsKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHNlcSkpCisgICAgICAgIHJldHVybiBmaWx0ZXJ1bmljb2RlKGZ1bmMsIHNlcSk7CiAjZW5kaWYKLQlpZiAoUHlUdXBsZV9DaGVjayhzZXEpKQotCQlyZXR1cm4gZmlsdGVydHVwbGUoZnVuYywgc2VxKTsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhzZXEpKQorICAgICAgICByZXR1cm4gZmlsdGVydHVwbGUoZnVuYywgc2VxKTsKIAotCS8qIFByZS1hbGxvY2F0ZSBhcmd1bWVudCBsaXN0IHR1cGxlLiAqLwotCWFyZyA9IFB5VHVwbGVfTmV3KDEpOwotCWlmIChhcmcgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogUHJlLWFsbG9jYXRlIGFyZ3VtZW50IGxpc3QgdHVwbGUuICovCisgICAgYXJnID0gUHlUdXBsZV9OZXcoMSk7CisgICAgaWYgKGFyZyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEdldCBpdGVyYXRvci4gKi8KLQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXQgPT0gTlVMTCkKLQkJZ290byBGYWlsX2FyZzsKKyAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHNlcSk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbF9hcmc7CiAKLQkvKiBHdWVzcyBhIHJlc3VsdCBsaXN0IHNpemUuICovCi0JbGVuID0gX1B5T2JqZWN0X0xlbmd0aEhpbnQoc2VxLCA4KTsKLQlpZiAobGVuID09IC0xKQotCQlnb3RvIEZhaWxfaXQ7CisgICAgLyogR3Vlc3MgYSByZXN1bHQgbGlzdCBzaXplLiAqLworICAgIGxlbiA9IF9QeU9iamVjdF9MZW5ndGhIaW50KHNlcSwgOCk7CisgICAgaWYgKGxlbiA9PSAtMSkKKyAgICAgICAgZ290byBGYWlsX2l0OwogCi0JLyogR2V0IGEgcmVzdWx0IGxpc3QuICovCi0JaWYgKFB5TGlzdF9DaGVjayhzZXEpICYmIHNlcS0+b2JfcmVmY250ID09IDEpIHsKLQkJLyogRXd3IC0gY2FuIG1vZGlmeSB0aGUgbGlzdCBpbi1wbGFjZS4gKi8KLQkJUHlfSU5DUkVGKHNlcSk7Ci0JCXJlc3VsdCA9IHNlcTsKLQl9Ci0JZWxzZSB7Ci0JCXJlc3VsdCA9IFB5TGlzdF9OZXcobGVuKTsKLQkJaWYgKHJlc3VsdCA9PSBOVUxMKQotCQkJZ290byBGYWlsX2l0OwotCX0KKyAgICAvKiBHZXQgYSByZXN1bHQgbGlzdC4gKi8KKyAgICBpZiAoUHlMaXN0X0NoZWNrKHNlcSkgJiYgc2VxLT5vYl9yZWZjbnQgPT0gMSkgeworICAgICAgICAvKiBFd3cgLSBjYW4gbW9kaWZ5IHRoZSBsaXN0IGluLXBsYWNlLiAqLworICAgICAgICBQeV9JTkNSRUYoc2VxKTsKKyAgICAgICAgcmVzdWx0ID0gc2VxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlMaXN0X05ldyhsZW4pOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEZhaWxfaXQ7CisgICAgfQogCi0JLyogQnVpbGQgdGhlIHJlc3VsdCBsaXN0LiAqLwotCWogPSAwOwotCWZvciAoOzspIHsKLQkJUHlPYmplY3QgKml0ZW07Ci0JCWludCBvazsKKyAgICAvKiBCdWlsZCB0aGUgcmVzdWx0IGxpc3QuICovCisgICAgaiA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBQeU9iamVjdCAqaXRlbTsKKyAgICAgICAgaW50IG9rOwogCi0JCWl0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWdvdG8gRmFpbF9yZXN1bHRfaXQ7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBpdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfcmVzdWx0X2l0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAoZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGUgfHwgZnVuYyA9PSBQeV9Ob25lKSB7Ci0JCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKLQkJfQotCQllbHNlIHsKLQkJCVB5T2JqZWN0ICpnb29kOwotCQkJUHlUdXBsZV9TRVRfSVRFTShhcmcsIDAsIGl0ZW0pOwotCQkJZ29vZCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJnLCBOVUxMKTsKLQkJCVB5VHVwbGVfU0VUX0lURU0oYXJnLCAwLCBOVUxMKTsKLQkJCWlmIChnb29kID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJZ290byBGYWlsX3Jlc3VsdF9pdDsKLQkJCX0KLQkJCW9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOwotCQkJUHlfREVDUkVGKGdvb2QpOwotCQl9Ci0JCWlmIChvaykgewotCQkJaWYgKGogPCBsZW4pCi0JCQkJUHlMaXN0X1NFVF9JVEVNKHJlc3VsdCwgaiwgaXRlbSk7Ci0JCQllbHNlIHsKLQkJCQlpbnQgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChyZXN1bHQsIGl0ZW0pOwotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQkJZ290byBGYWlsX3Jlc3VsdF9pdDsKLQkJCX0KLQkJCSsrajsKLQkJfQotCQllbHNlCi0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQorICAgICAgICBpZiAoZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGUgfHwgZnVuYyA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpnb29kOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmcsIDAsIGl0ZW0pOworICAgICAgICAgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJnLCBOVUxMKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYXJnLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChnb29kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsX3Jlc3VsdF9pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGdvb2QpOworICAgICAgICAgICAgUHlfREVDUkVGKGdvb2QpOworICAgICAgICB9CisgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgaWYgKGogPCBsZW4pCisgICAgICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHJlc3VsdCwgaiwgaXRlbSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChyZXN1bHQsIGl0ZW0pOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsX3Jlc3VsdF9pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrajsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQogCiAKLQkvKiBDdXQgYmFjayByZXN1bHQgbGlzdCBpZiBsZW4gaXMgdG9vIGJpZy4gKi8KLQlpZiAoaiA8IGxlbiAmJiBQeUxpc3RfU2V0U2xpY2UocmVzdWx0LCBqLCBsZW4sIE5VTEwpIDwgMCkKLQkJZ290byBGYWlsX3Jlc3VsdF9pdDsKKyAgICAvKiBDdXQgYmFjayByZXN1bHQgbGlzdCBpZiBsZW4gaXMgdG9vIGJpZy4gKi8KKyAgICBpZiAoaiA8IGxlbiAmJiBQeUxpc3RfU2V0U2xpY2UocmVzdWx0LCBqLCBsZW4sIE5VTEwpIDwgMCkKKyAgICAgICAgZ290byBGYWlsX3Jlc3VsdF9pdDsKIAotCVB5X0RFQ1JFRihpdCk7Ci0JUHlfREVDUkVGKGFyZyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9ERUNSRUYoaXQpOworICAgIFB5X0RFQ1JFRihhcmcpOworICAgIHJldHVybiByZXN1bHQ7CiAKIEZhaWxfcmVzdWx0X2l0OgotCVB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogRmFpbF9pdDoKLQlQeV9ERUNSRUYoaXQpOworICAgIFB5X0RFQ1JFRihpdCk7CiBGYWlsX2FyZzoKLQlQeV9ERUNSRUYoYXJnKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGZpbHRlcl9kb2MsCkBAIC0zNTQsMTMgKzM1NCwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fZm9ybWF0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdmFsdWU7Ci0JUHlPYmplY3QgKmZvcm1hdF9zcGVjID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdmFsdWU7CisgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjID0gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPOmZvcm1hdCIsICZ2YWx1ZSwgJmZvcm1hdF9zcGVjKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE86Zm9ybWF0IiwgJnZhbHVlLCAmZm9ybWF0X3NwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeU9iamVjdF9Gb3JtYXQodmFsdWUsIGZvcm1hdF9zcGVjKTsKKyAgICByZXR1cm4gUHlPYmplY3RfRm9ybWF0KHZhbHVlLCBmb3JtYXRfc3BlYyk7CiB9CiAKIFB5RG9jX1NUUlZBUihmb3JtYXRfZG9jLApAQCAtMzcyLDE4ICszNzIsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2NocihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyB4OwotCWNoYXIgc1sxXTsKKyAgICBsb25nIHg7CisgICAgY2hhciBzWzFdOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsOmNociIsICZ4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHggPCAwIHx8IHggPj0gMjU2KSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjaHIoKSBhcmcgbm90IGluIHJhbmdlKDI1NikiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNbMF0gPSAoY2hhcil4OwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLCAxKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImw6Y2hyIiwgJngpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoeCA8IDAgfHwgeCA+PSAyNTYpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2hyKCkgYXJnIG5vdCBpbiByYW5nZSgyNTYpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzWzBdID0gKGNoYXIpeDsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgMSk7CiB9CiAKIFB5RG9jX1NUUlZBUihjaHJfZG9jLApAQCAtMzk2LDEyICszOTYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3VuaWNocihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IHg7CisgICAgaW50IHg7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6dW5pY2hyIiwgJngpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6dW5pY2hyIiwgJngpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeVVuaWNvZGVfRnJvbU9yZGluYWwoeCk7CisgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tT3JkaW5hbCh4KTsKIH0KIAogUHlEb2NfU1RSVkFSKHVuaWNocl9kb2MsCkBAIC00MTQsMTQgKzQxNCwxNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fY21wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqYSwgKmI7Ci0JaW50IGM7CisgICAgUHlPYmplY3QgKmEsICpiOworICAgIGludCBjOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY21wIiwgMiwgMiwgJmEsICZiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5T2JqZWN0X0NtcChhLCBiLCAmYykgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpYyk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY21wIiwgMiwgMiwgJmEsICZiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5T2JqZWN0X0NtcChhLCBiLCAmYykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpYyk7CiB9CiAKIFB5RG9jX1NUUlZBUihjbXBfZG9jLApAQCAtNDMzLDIwICs0MzMsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2NvZXJjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnYsICp3OwotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlPYmplY3QgKnYsICp3OworICAgIFB5T2JqZWN0ICpyZXM7CiAKLQlpZiAoUHlFcnJfV2FyblB5M2soImNvZXJjZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soImNvZXJjZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImNvZXJjZSIsIDIsIDIsICZ2LCAmdykpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeU51bWJlcl9Db2VyY2UoJnYsICZ3KSA8IDApCi0JCXJldHVybiBOVUxMOwotCXJlcyA9IFB5VHVwbGVfUGFjaygyLCB2LCB3KTsKLQlQeV9ERUNSRUYodik7Ci0JUHlfREVDUkVGKHcpOwotCXJldHVybiByZXM7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY29lcmNlIiwgMiwgMiwgJnYsICZ3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TnVtYmVyX0NvZXJjZSgmdiwgJncpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gUHlUdXBsZV9QYWNrKDIsIHYsIHcpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBQeV9ERUNSRUYodyk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKGNvZXJjZV9kb2MsCkBAIC00NTksOTggKzQ1OSw5OCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fY29tcGlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCWNoYXIgKnN0cjsKLQljaGFyICpmaWxlbmFtZTsKLQljaGFyICpzdGFydHN0cjsKLQlpbnQgbW9kZSA9IC0xOwotCWludCBkb250X2luaGVyaXQgPSAwOwotCWludCBzdXBwbGllZF9mbGFncyA9IDA7Ci0JaW50IGlzX2FzdDsKLQlQeUNvbXBpbGVyRmxhZ3MgY2Y7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEwsICpjbWQsICp0bXAgPSBOVUxMOwotCVB5X3NzaXplX3QgbGVuZ3RoOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic291cmNlIiwgImZpbGVuYW1lIiwgIm1vZGUiLCAiZmxhZ3MiLAotCQkJCSAiZG9udF9pbmhlcml0IiwgTlVMTH07Ci0JaW50IHN0YXJ0W10gPSB7UHlfZmlsZV9pbnB1dCwgUHlfZXZhbF9pbnB1dCwgUHlfc2luZ2xlX2lucHV0fTsKKyAgICBjaGFyICpzdHI7CisgICAgY2hhciAqZmlsZW5hbWU7CisgICAgY2hhciAqc3RhcnRzdHI7CisgICAgaW50IG1vZGUgPSAtMTsKKyAgICBpbnQgZG9udF9pbmhlcml0ID0gMDsKKyAgICBpbnQgc3VwcGxpZWRfZmxhZ3MgPSAwOworICAgIGludCBpc19hc3Q7CisgICAgUHlDb21waWxlckZsYWdzIGNmOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMLCAqY21kLCAqdG1wID0gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGxlbmd0aDsKKyAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7InNvdXJjZSIsICJmaWxlbmFtZSIsICJtb2RlIiwgImZsYWdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvbnRfaW5oZXJpdCIsIE5VTEx9OworICAgIGludCBzdGFydFtdID0ge1B5X2ZpbGVfaW5wdXQsIFB5X2V2YWxfaW5wdXQsIFB5X3NpbmdsZV9pbnB1dH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3NzfGlpOmNvbXBpbGUiLAotCQkJCQkga3dsaXN0LCAmY21kLCAmZmlsZW5hbWUsICZzdGFydHN0ciwKLQkJCQkJICZzdXBwbGllZF9mbGFncywgJmRvbnRfaW5oZXJpdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPc3N8aWk6Y29tcGlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmY21kLCAmZmlsZW5hbWUsICZzdGFydHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VwcGxpZWRfZmxhZ3MsICZkb250X2luaGVyaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWNmLmNmX2ZsYWdzID0gc3VwcGxpZWRfZmxhZ3M7CisgICAgY2YuY2ZfZmxhZ3MgPSBzdXBwbGllZF9mbGFnczsKIAotCWlmIChzdXBwbGllZF9mbGFncyAmCi0JICAgIH4oUHlDRl9NQVNLIHwgUHlDRl9NQVNLX09CU09MRVRFIHwgUHlDRl9ET05UX0lNUExZX0RFREVOVCB8IFB5Q0ZfT05MWV9BU1QpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJImNvbXBpbGUoKTogdW5yZWNvZ25pc2VkIGZsYWdzIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBYWFggV2FybiBpZiAoc3VwcGxpZWRfZmxhZ3MgJiBQeUNGX01BU0tfT0JTT0xFVEUpICE9IDA/ICovCisgICAgaWYgKHN1cHBsaWVkX2ZsYWdzICYKKyAgICAgICAgfihQeUNGX01BU0sgfCBQeUNGX01BU0tfT0JTT0xFVEUgfCBQeUNGX0RPTlRfSU1QTFlfREVERU5UIHwgUHlDRl9PTkxZX0FTVCkpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlKCk6IHVucmVjb2duaXNlZCBmbGFncyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogWFhYIFdhcm4gaWYgKHN1cHBsaWVkX2ZsYWdzICYgUHlDRl9NQVNLX09CU09MRVRFKSAhPSAwPyAqLwogCi0JaWYgKCFkb250X2luaGVyaXQpIHsKLQkJUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpOwotCX0KKyAgICBpZiAoIWRvbnRfaW5oZXJpdCkgeworICAgICAgICBQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZik7CisgICAgfQogCi0JaWYgKHN0cmNtcChzdGFydHN0ciwgImV4ZWMiKSA9PSAwKQotCQltb2RlID0gMDsKLQllbHNlIGlmIChzdHJjbXAoc3RhcnRzdHIsICJldmFsIikgPT0gMCkKLQkJbW9kZSA9IDE7Ci0JZWxzZSBpZiAoc3RyY21wKHN0YXJ0c3RyLCAic2luZ2xlIikgPT0gMCkKLQkJbW9kZSA9IDI7Ci0JZWxzZSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJjb21waWxlKCkgYXJnIDMgbXVzdCBiZSAnZXhlYycsICdldmFsJyBvciAnc2luZ2xlJyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHN0cmNtcChzdGFydHN0ciwgImV4ZWMiKSA9PSAwKQorICAgICAgICBtb2RlID0gMDsKKyAgICBlbHNlIGlmIChzdHJjbXAoc3RhcnRzdHIsICJldmFsIikgPT0gMCkKKyAgICAgICAgbW9kZSA9IDE7CisgICAgZWxzZSBpZiAoc3RyY21wKHN0YXJ0c3RyLCAic2luZ2xlIikgPT0gMCkKKyAgICAgICAgbW9kZSA9IDI7CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGUoKSBhcmcgMyBtdXN0IGJlICdleGVjJywgJ2V2YWwnIG9yICdzaW5nbGUnIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlzX2FzdCA9IFB5QVNUX0NoZWNrKGNtZCk7Ci0JaWYgKGlzX2FzdCA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGlzX2FzdCkgewotCQlpZiAoc3VwcGxpZWRfZmxhZ3MgJiBQeUNGX09OTFlfQVNUKSB7Ci0JCQlQeV9JTkNSRUYoY21kKTsKLQkJCXJlc3VsdCA9IGNtZDsKLQkJfQotCQllbHNlIHsKLQkJCVB5QXJlbmEgKmFyZW5hOwotCQkJbW9kX3R5IG1vZDsKKyAgICBpc19hc3QgPSBQeUFTVF9DaGVjayhjbWQpOworICAgIGlmIChpc19hc3QgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChpc19hc3QpIHsKKyAgICAgICAgaWYgKHN1cHBsaWVkX2ZsYWdzICYgUHlDRl9PTkxZX0FTVCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGNtZCk7CisgICAgICAgICAgICByZXN1bHQgPSBjbWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUFyZW5hICphcmVuYTsKKyAgICAgICAgICAgIG1vZF90eSBtb2Q7CiAKLQkJCWFyZW5hID0gUHlBcmVuYV9OZXcoKTsKLQkJCW1vZCA9IFB5QVNUX29iajJtb2QoY21kLCBhcmVuYSwgbW9kZSk7Ci0JCQlpZiAobW9kID09IE5VTEwpIHsKLQkJCQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJcmVzdWx0ID0gKFB5T2JqZWN0KilQeUFTVF9Db21waWxlKG1vZCwgZmlsZW5hbWUsCi0JCQkJCQkJICAmY2YsIGFyZW5hKTsKLQkJCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgICAgICAgICBhcmVuYSA9IFB5QXJlbmFfTmV3KCk7CisgICAgICAgICAgICBtb2QgPSBQeUFTVF9vYmoybW9kKGNtZCwgYXJlbmEsIG1vZGUpOworICAgICAgICAgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IChQeU9iamVjdCopUHlBU1RfQ29tcGlsZShtb2QsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjZiwgYXJlbmEpOworICAgICAgICAgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKGNtZCkpIHsKLQkJdG1wID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhjbWQpOwotCQlpZiAodG1wID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJY21kID0gdG1wOwotCQljZi5jZl9mbGFncyB8PSBQeUNGX1NPVVJDRV9JU19VVEY4OwotCX0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGNtZCkpIHsKKyAgICAgICAgdG1wID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhjbWQpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY21kID0gdG1wOworICAgICAgICBjZi5jZl9mbGFncyB8PSBQeUNGX1NPVVJDRV9JU19VVEY4OworICAgIH0KICNlbmRpZgogCi0JaWYgKFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihjbWQsIChjb25zdCB2b2lkICoqKSZzdHIsICZsZW5ndGgpKQotCQlnb3RvIGNsZWFudXA7Ci0JaWYgKChzaXplX3QpbGVuZ3RoICE9IHN0cmxlbihzdHIpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImNvbXBpbGUoKSBleHBlY3RlZCBzdHJpbmcgd2l0aG91dCBudWxsIGJ5dGVzIik7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0JcmVzdWx0ID0gUHlfQ29tcGlsZVN0cmluZ0ZsYWdzKHN0ciwgZmlsZW5hbWUsIHN0YXJ0W21vZGVdLCAmY2YpOworICAgIGlmIChQeU9iamVjdF9Bc1JlYWRCdWZmZXIoY21kLCAoY29uc3Qgdm9pZCAqKikmc3RyLCAmbGVuZ3RoKSkKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGlmICgoc2l6ZV90KWxlbmd0aCAhPSBzdHJsZW4oc3RyKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGUoKSBleHBlY3RlZCBzdHJpbmcgd2l0aG91dCBudWxsIGJ5dGVzIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlfQ29tcGlsZVN0cmluZ0ZsYWdzKHN0ciwgZmlsZW5hbWUsIHN0YXJ0W21vZGVdLCAmY2YpOwogY2xlYW51cDoKLQlQeV9YREVDUkVGKHRtcCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGNvbXBpbGVfZG9jLApAQCAtNTcxLDExICs1NzEsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2RpcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmFyZyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmFyZyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkaXIiLCAwLCAxLCAmYXJnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5T2JqZWN0X0RpcihhcmcpOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRpciIsIDAsIDEsICZhcmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlPYmplY3RfRGlyKGFyZyk7CiB9CiAKIFB5RG9jX1NUUlZBUihkaXJfZG9jLApAQCAtNTk1LDExICs1OTUsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2Rpdm1vZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnYsICp3OworICAgIFB5T2JqZWN0ICp2LCAqdzsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRpdm1vZCIsIDIsIDIsICZ2LCAmdykpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBQeU51bWJlcl9EaXZtb2Qodiwgdyk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZGl2bW9kIiwgMiwgMiwgJnYsICZ3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TnVtYmVyX0Rpdm1vZCh2LCB3KTsKIH0KIAogUHlEb2NfU1RSVkFSKGRpdm1vZF9kb2MsCkBAIC02MTEsODEgKzYxMSw4MSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fZXZhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmNtZCwgKnJlc3VsdCwgKnRtcCA9IE5VTEw7Ci0JUHlPYmplY3QgKmdsb2JhbHMgPSBQeV9Ob25lLCAqbG9jYWxzID0gUHlfTm9uZTsKLQljaGFyICpzdHI7Ci0JUHlDb21waWxlckZsYWdzIGNmOworICAgIFB5T2JqZWN0ICpjbWQsICpyZXN1bHQsICp0bXAgPSBOVUxMOworICAgIFB5T2JqZWN0ICpnbG9iYWxzID0gUHlfTm9uZSwgKmxvY2FscyA9IFB5X05vbmU7CisgICAgY2hhciAqc3RyOworICAgIFB5Q29tcGlsZXJGbGFncyBjZjsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImV2YWwiLCAxLCAzLCAmY21kLCAmZ2xvYmFscywgJmxvY2FscykpCi0JCXJldHVybiBOVUxMOwotCWlmIChsb2NhbHMgIT0gUHlfTm9uZSAmJiAhUHlNYXBwaW5nX0NoZWNrKGxvY2FscykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxvY2FscyBtdXN0IGJlIGEgbWFwcGluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGdsb2JhbHMgIT0gUHlfTm9uZSAmJiAhUHlEaWN0X0NoZWNrKGdsb2JhbHMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFB5TWFwcGluZ19DaGVjayhnbG9iYWxzKSA/Ci0JCQkiZ2xvYmFscyBtdXN0IGJlIGEgcmVhbCBkaWN0OyB0cnkgZXZhbChleHByLCB7fSwgbWFwcGluZykiCi0JCQk6ICJnbG9iYWxzIG11c3QgYmUgYSBkaWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZ2xvYmFscyA9PSBQeV9Ob25lKSB7Ci0JCWdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOwotCQlpZiAobG9jYWxzID09IFB5X05vbmUpCi0JCQlsb2NhbHMgPSBQeUV2YWxfR2V0TG9jYWxzKCk7Ci0JfQotCWVsc2UgaWYgKGxvY2FscyA9PSBQeV9Ob25lKQotCQlsb2NhbHMgPSBnbG9iYWxzOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImV2YWwiLCAxLCAzLCAmY21kLCAmZ2xvYmFscywgJmxvY2FscykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChsb2NhbHMgIT0gUHlfTm9uZSAmJiAhUHlNYXBwaW5nX0NoZWNrKGxvY2FscykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxvY2FscyBtdXN0IGJlIGEgbWFwcGluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGdsb2JhbHMgIT0gUHlfTm9uZSAmJiAhUHlEaWN0X0NoZWNrKGdsb2JhbHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFB5TWFwcGluZ19DaGVjayhnbG9iYWxzKSA/CisgICAgICAgICAgICAiZ2xvYmFscyBtdXN0IGJlIGEgcmVhbCBkaWN0OyB0cnkgZXZhbChleHByLCB7fSwgbWFwcGluZykiCisgICAgICAgICAgICA6ICJnbG9iYWxzIG11c3QgYmUgYSBkaWN0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZ2xvYmFscyA9PSBQeV9Ob25lKSB7CisgICAgICAgIGdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOworICAgICAgICBpZiAobG9jYWxzID09IFB5X05vbmUpCisgICAgICAgICAgICBsb2NhbHMgPSBQeUV2YWxfR2V0TG9jYWxzKCk7CisgICAgfQorICAgIGVsc2UgaWYgKGxvY2FscyA9PSBQeV9Ob25lKQorICAgICAgICBsb2NhbHMgPSBnbG9iYWxzOwogCi0JaWYgKGdsb2JhbHMgPT0gTlVMTCB8fCBsb2NhbHMgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKLQkJCSJldmFsIG11c3QgYmUgZ2l2ZW4gZ2xvYmFscyBhbmQgbG9jYWxzICIKLQkJCSJ3aGVuIGNhbGxlZCB3aXRob3V0IGEgZnJhbWUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChnbG9iYWxzID09IE5VTEwgfHwgbG9jYWxzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJldmFsIG11c3QgYmUgZ2l2ZW4gZ2xvYmFscyBhbmQgbG9jYWxzICIKKyAgICAgICAgICAgICJ3aGVuIGNhbGxlZCB3aXRob3V0IGEgZnJhbWUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIiwKLQkJCQkJIFB5RXZhbF9HZXRCdWlsdGlucygpKSAhPSAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0QnVpbHRpbnMoKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChQeUNvZGVfQ2hlY2soY21kKSkgewotCQlpZiAoUHlDb2RlX0dldE51bUZyZWUoKFB5Q29kZU9iamVjdCAqKWNtZCkgPiAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkiY29kZSBvYmplY3QgcGFzc2VkIHRvIGV2YWwoKSBtYXkgbm90IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXJldHVybiBQeUV2YWxfRXZhbENvZGUoKFB5Q29kZU9iamVjdCAqKSBjbWQsIGdsb2JhbHMsIGxvY2Fscyk7Ci0JfQorICAgIGlmIChQeUNvZGVfQ2hlY2soY21kKSkgeworICAgICAgICBpZiAoUHlDb2RlX0dldE51bUZyZWUoKFB5Q29kZU9iamVjdCAqKWNtZCkgPiAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAiY29kZSBvYmplY3QgcGFzc2VkIHRvIGV2YWwoKSBtYXkgbm90IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUV2YWxfRXZhbENvZGUoKFB5Q29kZU9iamVjdCAqKSBjbWQsIGdsb2JhbHMsIGxvY2Fscyk7CisgICAgfQogCi0JaWYgKCFQeVN0cmluZ19DaGVjayhjbWQpICYmCi0JICAgICFQeVVuaWNvZGVfQ2hlY2soY21kKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgImV2YWwoKSBhcmcgMSBtdXN0IGJlIGEgc3RyaW5nIG9yIGNvZGUgb2JqZWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljZi5jZl9mbGFncyA9IDA7CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayhjbWQpICYmCisgICAgICAgICFQeVVuaWNvZGVfQ2hlY2soY21kKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJldmFsKCkgYXJnIDEgbXVzdCBiZSBhIHN0cmluZyBvciBjb2RlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2YuY2ZfZmxhZ3MgPSAwOwogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2soY21kKSkgewotCQl0bXAgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGNtZCk7Ci0JCWlmICh0bXAgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQljbWQgPSB0bXA7Ci0JCWNmLmNmX2ZsYWdzIHw9IFB5Q0ZfU09VUkNFX0lTX1VURjg7Ci0JfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soY21kKSkgeworICAgICAgICB0bXAgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKGNtZCk7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjbWQgPSB0bXA7CisgICAgICAgIGNmLmNmX2ZsYWdzIHw9IFB5Q0ZfU09VUkNFX0lTX1VURjg7CisgICAgfQogI2VuZGlmCi0JaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShjbWQsICZzdHIsIE5VTEwpKSB7Ci0JCVB5X1hERUNSRUYodG1wKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICdcdCcpCi0JCXN0cisrOworICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoY21kLCAmc3RyLCBOVUxMKSkgeworICAgICAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnXHQnKQorICAgICAgICBzdHIrKzsKIAotCSh2b2lkKVB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKTsKLQlyZXN1bHQgPSBQeVJ1bl9TdHJpbmdGbGFncyhzdHIsIFB5X2V2YWxfaW5wdXQsIGdsb2JhbHMsIGxvY2FscywgJmNmKTsKLQlQeV9YREVDUkVGKHRtcCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAodm9pZClQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZik7CisgICAgcmVzdWx0ID0gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBQeV9ldmFsX2lucHV0LCBnbG9iYWxzLCBsb2NhbHMsICZjZik7CisgICAgUHlfWERFQ1JFRih0bXApOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihldmFsX2RvYywKQEAgLTcwMiw5OCArNzAyLDk4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9leGVjZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqZmlsZW5hbWU7Ci0JUHlPYmplY3QgKmdsb2JhbHMgPSBQeV9Ob25lLCAqbG9jYWxzID0gUHlfTm9uZTsKLQlQeU9iamVjdCAqcmVzOwotCUZJTEUqIGZwID0gTlVMTDsKLQlQeUNvbXBpbGVyRmxhZ3MgY2Y7Ci0JaW50IGV4aXN0czsKKyAgICBjaGFyICpmaWxlbmFtZTsKKyAgICBQeU9iamVjdCAqZ2xvYmFscyA9IFB5X05vbmUsICpsb2NhbHMgPSBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgRklMRSogZnAgPSBOVUxMOworICAgIFB5Q29tcGlsZXJGbGFncyBjZjsKKyAgICBpbnQgZXhpc3RzOwogCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJleGVjZmlsZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyB1c2UgZXhlYygpIiwKLQkJCSAgIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJleGVjZmlsZSgpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyB1c2UgZXhlYygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xPIU86ZXhlY2ZpbGUiLAotCQkJJmZpbGVuYW1lLAotCQkJJlB5RGljdF9UeXBlLCAmZ2xvYmFscywKLQkJCSZsb2NhbHMpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobG9jYWxzICE9IFB5X05vbmUgJiYgIVB5TWFwcGluZ19DaGVjayhsb2NhbHMpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsb2NhbHMgbXVzdCBiZSBhIG1hcHBpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChnbG9iYWxzID09IFB5X05vbmUpIHsKLQkJZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7Ci0JCWlmIChsb2NhbHMgPT0gUHlfTm9uZSkKLQkJCWxvY2FscyA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKLQl9Ci0JZWxzZSBpZiAobG9jYWxzID09IFB5X05vbmUpCi0JCWxvY2FscyA9IGdsb2JhbHM7Ci0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIiwKLQkJCQkJIFB5RXZhbF9HZXRCdWlsdGlucygpKSAhPSAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xPIU86ZXhlY2ZpbGUiLAorICAgICAgICAgICAgICAgICAgICAmZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICZQeURpY3RfVHlwZSwgJmdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICZsb2NhbHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobG9jYWxzICE9IFB5X05vbmUgJiYgIVB5TWFwcGluZ19DaGVjayhsb2NhbHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsb2NhbHMgbXVzdCBiZSBhIG1hcHBpbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChnbG9iYWxzID09IFB5X05vbmUpIHsKKyAgICAgICAgZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7CisgICAgICAgIGlmIChsb2NhbHMgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIGxvY2FscyA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKKyAgICB9CisgICAgZWxzZSBpZiAobG9jYWxzID09IFB5X05vbmUpCisgICAgICAgIGxvY2FscyA9IGdsb2JhbHM7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRCdWlsdGlucygpKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZXhpc3RzID0gMDsKLQkvKiBUZXN0IGZvciBleGlzdGVuY2Ugb3IgZGlyZWN0b3J5LiAqLworICAgIGV4aXN0cyA9IDA7CisgICAgLyogVGVzdCBmb3IgZXhpc3RlbmNlIG9yIGRpcmVjdG9yeS4gKi8KICNpZiBkZWZpbmVkKFBMQU45KQotCXsKLQkJRGlyICpkOworICAgIHsKKyAgICAgICAgRGlyICpkOwogCi0JCWlmICgoZCA9IGRpcnN0YXQoZmlsZW5hbWUpKSE9bmlsKSB7Ci0JCQlpZihkLT5tb2RlICYgRE1ESVIpCi0JCQkJd2VycnN0cigiaXMgYSBkaXJlY3RvcnkiKTsKLQkJCWVsc2UKLQkJCQlleGlzdHMgPSAxOwotCQkJZnJlZShkKTsKLQkJfQotCX0KKyAgICAgICAgaWYgKChkID0gZGlyc3RhdChmaWxlbmFtZSkpIT1uaWwpIHsKKyAgICAgICAgICAgIGlmKGQtPm1vZGUgJiBETURJUikKKyAgICAgICAgICAgICAgICB3ZXJyc3RyKCJpcyBhIGRpcmVjdG9yeSIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGV4aXN0cyA9IDE7CisgICAgICAgICAgICBmcmVlKGQpOworICAgICAgICB9CisgICAgfQogI2VsaWYgZGVmaW5lZChSSVNDT1MpCi0JaWYgKG9iamVjdF9leGlzdHMoZmlsZW5hbWUpKSB7Ci0JCWlmIChpc2RpcihmaWxlbmFtZSkpCi0JCQllcnJubyA9IEVJU0RJUjsKLQkJZWxzZQotCQkJZXhpc3RzID0gMTsKLQl9Ci0jZWxzZQkvKiBzdGFuZGFyZCBQb3NpeCAqLwotCXsKLQkJc3RydWN0IHN0YXQgczsKLQkJaWYgKHN0YXQoZmlsZW5hbWUsICZzKSA9PSAwKSB7Ci0JCQlpZiAoU19JU0RJUihzLnN0X21vZGUpKQotIwkJCQlpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfVkFDUFApCi0JCQkJCWVycm5vID0gRU9TMkVSUjsKLSMJCQkJZWxzZQotCQkJCQllcnJubyA9IEVJU0RJUjsKLSMJCQkJZW5kaWYKLQkJCWVsc2UKLQkJCQlleGlzdHMgPSAxOwotCQl9Ci0JfQorICAgIGlmIChvYmplY3RfZXhpc3RzKGZpbGVuYW1lKSkgeworICAgICAgICBpZiAoaXNkaXIoZmlsZW5hbWUpKQorICAgICAgICAgICAgZXJybm8gPSBFSVNESVI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXN0cyA9IDE7CisgICAgfQorI2Vsc2UgICAvKiBzdGFuZGFyZCBQb3NpeCAqLworICAgIHsKKyAgICAgICAgc3RydWN0IHN0YXQgczsKKyAgICAgICAgaWYgKHN0YXQoZmlsZW5hbWUsICZzKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoU19JU0RJUihzLnN0X21vZGUpKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfVkFDUFApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8gPSBFT1MyRVJSOworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8gPSBFSVNESVI7CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGlmCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXhpc3RzID0gMTsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgogCi0gICAgICAgIGlmIChleGlzdHMpIHsKLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQlmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIgUFlfU1RESU9URVhUTU9ERSk7Ci0JCVB5X0VORF9BTExPV19USFJFQURTCisgICAgaWYgKGV4aXN0cykgeworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIiBQWV9TVERJT1RFWFRNT0RFKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCQlpZiAoZnAgPT0gTlVMTCkgewotCQkJZXhpc3RzID0gMDsKLQkJfQorICAgICAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICAgICAgZXhpc3RzID0gMDsKICAgICAgICAgfQorICAgIH0KIAotCWlmICghZXhpc3RzKSB7Ci0JCVB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShQeUV4Y19JT0Vycm9yLCBmaWxlbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljZi5jZl9mbGFncyA9IDA7Ci0JaWYgKFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKSkKLQkJcmVzID0gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIGZpbGVuYW1lLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLAotCQkJCSAgIGxvY2FscywgMSwgJmNmKTsKLQllbHNlCi0JCXJlcyA9IFB5UnVuX0ZpbGVFeChmcCwgZmlsZW5hbWUsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCi0JCQkJICAgbG9jYWxzLCAxKTsKLQlyZXR1cm4gcmVzOworICAgIGlmICghZXhpc3RzKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZShQeUV4Y19JT0Vycm9yLCBmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjZi5jZl9mbGFncyA9IDA7CisgICAgaWYgKFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKSkKKyAgICAgICAgcmVzID0gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIGZpbGVuYW1lLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxzLCAxLCAmY2YpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gUHlSdW5fRmlsZUV4KGZwLCBmaWxlbmFtZSwgUHlfZmlsZV9pbnB1dCwgZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FscywgMSk7CisgICAgcmV0dXJuIHJlczsKIH0KIAogUHlEb2NfU1RSVkFSKGV4ZWNmaWxlX2RvYywKQEAgLTgwNywzMyArODA3LDMzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9nZXRhdHRyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdiwgKnJlc3VsdCwgKmRmbHQgPSBOVUxMOwotCVB5T2JqZWN0ICpuYW1lOworICAgIFB5T2JqZWN0ICp2LCAqcmVzdWx0LCAqZGZsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5hbWU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJnZXRhdHRyIiwgMiwgMywgJnYsICZuYW1lLCAmZGZsdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImdldGF0dHIiLCAyLCAzLCAmdiwgJm5hbWUsICZkZmx0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKLQkJbmFtZSA9IF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyhuYW1lLCBOVUxMKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7CisgICAgICAgIG5hbWUgPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcobmFtZSwgTlVMTCk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKIAotCWlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiZ2V0YXR0cigpOiBhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzdWx0ID0gUHlPYmplY3RfR2V0QXR0cih2LCBuYW1lKTsKLQlpZiAocmVzdWx0ID09IE5VTEwgJiYgZGZsdCAhPSBOVUxMICYmCi0JICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCXsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfSU5DUkVGKGRmbHQpOwotCQlyZXN1bHQgPSBkZmx0OwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJnZXRhdHRyKCk6IGF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHQgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCAmJiBkZmx0ICE9IE5VTEwgJiYKKyAgICAgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpCisgICAgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9JTkNSRUYoZGZsdCk7CisgICAgICAgIHJlc3VsdCA9IGRmbHQ7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRhdHRyX2RvYywKQEAgLTg0NywxMSArODQ3LDExIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9nbG9iYWxzKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCi0JZCA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7Ci0JUHlfWElOQ1JFRihkKTsKLQlyZXR1cm4gZDsKKyAgICBkID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKKyAgICBQeV9YSU5DUkVGKGQpOworICAgIHJldHVybiBkOwogfQogCiBQeURvY19TVFJWQVIoZ2xvYmFsc19kb2MsCkBAIC04NjMsMzcgKzg2MywzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faGFzYXR0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JUHlPYmplY3QgKm5hbWU7CisgICAgUHlPYmplY3QgKnY7CisgICAgUHlPYmplY3QgKm5hbWU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoYXNhdHRyIiwgMiwgMiwgJnYsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGFzYXR0ciIsIDIsIDIsICZ2LCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7Ci0JCW5hbWUgPSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcobmFtZSwgTlVMTCk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lKSkgeworICAgICAgICBuYW1lID0gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKG5hbWUsIE5VTEwpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogI2VuZGlmCiAKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJImhhc2F0dHIoKTogYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmciKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXYgPSBQeU9iamVjdF9HZXRBdHRyKHYsIG5hbWUpOwotCWlmICh2ID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0V4Y2VwdGlvbikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZWxzZSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJUHlfSU5DUkVGKFB5X0ZhbHNlKTsKLQkJCXJldHVybiBQeV9GYWxzZTsKLQkJfQotCX0KLQlQeV9ERUNSRUYodik7Ci0JUHlfSU5DUkVGKFB5X1RydWUpOwotCXJldHVybiBQeV9UcnVlOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJoYXNhdHRyKCk6IGF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB2ID0gUHlPYmplY3RfR2V0QXR0cih2LCBuYW1lKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19FeGNlcHRpb24pKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gUHlfRmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIFB5X0lOQ1JFRihQeV9UcnVlKTsKKyAgICByZXR1cm4gUHlfVHJ1ZTsKIH0KIAogUHlEb2NfU1RSVkFSKGhhc2F0dHJfZG9jLApAQCAtOTA2LDcgKzkwNiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9pZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cih2KTsKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Wb2lkUHRyKHYpOwogfQogCiBQeURvY19TVFJWQVIoaWRfZG9jLApAQCAtOTE5LDE1NCArOTE5LDE1NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fbWFwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQl0eXBlZGVmIHN0cnVjdCB7Ci0JCVB5T2JqZWN0ICppdDsJLyogdGhlIGl0ZXJhdG9yIG9iamVjdCAqLwotCQlpbnQgc2F3X1N0b3BJdGVyYXRpb247ICAvKiBib29sOiAgZGlkIHRoZSBpdGVyYXRvciBlbmQ/ICovCi0JfSBzZXF1ZW5jZTsKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFB5T2JqZWN0ICppdDsgICAgICAgICAgIC8qIHRoZSBpdGVyYXRvciBvYmplY3QgKi8KKyAgICAgICAgaW50IHNhd19TdG9wSXRlcmF0aW9uOyAgLyogYm9vbDogIGRpZCB0aGUgaXRlcmF0b3IgZW5kPyAqLworICAgIH0gc2VxdWVuY2U7CiAKLQlQeU9iamVjdCAqZnVuYywgKnJlc3VsdDsKLQlzZXF1ZW5jZSAqc2VxcyA9IE5VTEwsICpzcXA7Ci0JUHlfc3NpemVfdCBuLCBsZW47Ci0JcmVnaXN0ZXIgaW50IGksIGo7CisgICAgUHlPYmplY3QgKmZ1bmMsICpyZXN1bHQ7CisgICAgc2VxdWVuY2UgKnNlcXMgPSBOVUxMLCAqc3FwOworICAgIFB5X3NzaXplX3QgbiwgbGVuOworICAgIHJlZ2lzdGVyIGludCBpLCBqOwogCi0JbiA9IFB5VHVwbGVfU2l6ZShhcmdzKTsKLQlpZiAobiA8IDIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibWFwKCkgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIGFyZ3MiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG4gPSBQeVR1cGxlX1NpemUoYXJncyk7CisgICAgaWYgKG4gPCAyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWFwKCkgcmVxdWlyZXMgYXQgbGVhc3QgdHdvIGFyZ3MiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JZnVuYyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKLQluLS07CisgICAgZnVuYyA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKyAgICBuLS07CiAKLQlpZiAoZnVuYyA9PSBQeV9Ob25lKSB7Ci0JCWlmIChQeUVycl9XYXJuUHkzaygibWFwKE5vbmUsIC4uLikgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKLQkJCQkgICAidXNlIGxpc3QoLi4uKSIsIDEpIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAobiA9PSAxKSB7Ci0JCQkvKiBtYXAoTm9uZSwgUykgaXMgdGhlIHNhbWUgYXMgbGlzdChTKS4gKi8KLQkJCXJldHVybiBQeVNlcXVlbmNlX0xpc3QoUHlUdXBsZV9HZXRJdGVtKGFyZ3MsIDEpKTsKLQkJfQotCX0KKyAgICBpZiAoZnVuYyA9PSBQeV9Ob25lKSB7CisgICAgICAgIGlmIChQeUVycl9XYXJuUHkzaygibWFwKE5vbmUsIC4uLikgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgbGlzdCguLi4pIiwgMSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChuID09IDEpIHsKKyAgICAgICAgICAgIC8qIG1hcChOb25lLCBTKSBpcyB0aGUgc2FtZSBhcyBsaXN0KFMpLiAqLworICAgICAgICAgICAgcmV0dXJuIFB5U2VxdWVuY2VfTGlzdChQeVR1cGxlX0dldEl0ZW0oYXJncywgMSkpOworICAgICAgICB9CisgICAgfQogCi0JLyogR2V0IHNwYWNlIGZvciBzZXF1ZW5jZSBkZXNjcmlwdG9ycy4gIE11c3QgTlVMTCBvdXQgdGhlIGl0ZXJhdG9yCi0JICogcG9pbnRlcnMgc28gdGhhdCBqdW1waW5nIHRvIEZhaWxfMiBsYXRlciBkb2Vzbid0IHNlZSB0cmFzaC4KLQkgKi8KLQlpZiAoKHNlcXMgPSBQeU1lbV9ORVcoc2VxdWVuY2UsIG4pKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCXNlcXNbaV0uaXQgPSAoUHlPYmplY3QqKU5VTEw7Ci0JCXNlcXNbaV0uc2F3X1N0b3BJdGVyYXRpb24gPSAwOwotCX0KKyAgICAvKiBHZXQgc3BhY2UgZm9yIHNlcXVlbmNlIGRlc2NyaXB0b3JzLiAgTXVzdCBOVUxMIG91dCB0aGUgaXRlcmF0b3IKKyAgICAgKiBwb2ludGVycyBzbyB0aGF0IGp1bXBpbmcgdG8gRmFpbF8yIGxhdGVyIGRvZXNuJ3Qgc2VlIHRyYXNoLgorICAgICAqLworICAgIGlmICgoc2VxcyA9IFB5TWVtX05FVyhzZXF1ZW5jZSwgbikpID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgc2Vxc1tpXS5pdCA9IChQeU9iamVjdCopTlVMTDsKKyAgICAgICAgc2Vxc1tpXS5zYXdfU3RvcEl0ZXJhdGlvbiA9IDA7CisgICAgfQogCi0JLyogRG8gYSBmaXJzdCBwYXNzIHRvIG9idGFpbiBpdGVyYXRvcnMgZm9yIHRoZSBhcmd1bWVudHMsIGFuZCBzZXQgbGVuCi0JICogdG8gdGhlIGxhcmdlc3Qgb2YgdGhlaXIgbGVuZ3Rocy4KLQkgKi8KLQlsZW4gPSAwOwotCWZvciAoaSA9IDAsIHNxcCA9IHNlcXM7IGkgPCBuOyArK2ksICsrc3FwKSB7Ci0JCVB5T2JqZWN0ICpjdXJzZXE7Ci0JCVB5X3NzaXplX3QgY3VybGVuOworICAgIC8qIERvIGEgZmlyc3QgcGFzcyB0byBvYnRhaW4gaXRlcmF0b3JzIGZvciB0aGUgYXJndW1lbnRzLCBhbmQgc2V0IGxlbgorICAgICAqIHRvIHRoZSBsYXJnZXN0IG9mIHRoZWlyIGxlbmd0aHMuCisgICAgICovCisgICAgbGVuID0gMDsKKyAgICBmb3IgKGkgPSAwLCBzcXAgPSBzZXFzOyBpIDwgbjsgKytpLCArK3NxcCkgeworICAgICAgICBQeU9iamVjdCAqY3Vyc2VxOworICAgICAgICBQeV9zc2l6ZV90IGN1cmxlbjsKIAotCQkvKiBHZXQgaXRlcmF0b3IuICovCi0JCWN1cnNlcSA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKzEpOwotCQlzcXAtPml0ID0gUHlPYmplY3RfR2V0SXRlcihjdXJzZXEpOwotCQlpZiAoc3FwLT5pdCA9PSBOVUxMKSB7Ci0JCQlzdGF0aWMgY2hhciBlcnJtc2dbXSA9Ci0JCQkgICAgImFyZ3VtZW50ICVkIHRvIG1hcCgpIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iOwotCQkJY2hhciBlcnJidWZbc2l6ZW9mKGVycm1zZykgKyAyNV07Ci0JCQlQeU9TX3NucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksIGVycm1zZywgaSsyKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGVycmJ1Zik7Ci0JCQlnb3RvIEZhaWxfMjsKLQkJfQorICAgICAgICAvKiBHZXQgaXRlcmF0b3IuICovCisgICAgICAgIGN1cnNlcSA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKzEpOworICAgICAgICBzcXAtPml0ID0gUHlPYmplY3RfR2V0SXRlcihjdXJzZXEpOworICAgICAgICBpZiAoc3FwLT5pdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBzdGF0aWMgY2hhciBlcnJtc2dbXSA9CisgICAgICAgICAgICAgICAgImFyZ3VtZW50ICVkIHRvIG1hcCgpIG11c3Qgc3VwcG9ydCBpdGVyYXRpb24iOworICAgICAgICAgICAgY2hhciBlcnJidWZbc2l6ZW9mKGVycm1zZykgKyAyNV07CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksIGVycm1zZywgaSsyKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIGVycmJ1Zik7CisgICAgICAgICAgICBnb3RvIEZhaWxfMjsKKyAgICAgICAgfQogCi0JCS8qIFVwZGF0ZSBsZW4uICovCi0JCWN1cmxlbiA9IF9QeU9iamVjdF9MZW5ndGhIaW50KGN1cnNlcSwgOCk7Ci0JCWlmIChjdXJsZW4gPiBsZW4pCi0JCQlsZW4gPSBjdXJsZW47Ci0JfQorICAgICAgICAvKiBVcGRhdGUgbGVuLiAqLworICAgICAgICBjdXJsZW4gPSBfUHlPYmplY3RfTGVuZ3RoSGludChjdXJzZXEsIDgpOworICAgICAgICBpZiAoY3VybGVuID4gbGVuKQorICAgICAgICAgICAgbGVuID0gY3VybGVuOworICAgIH0KIAotCS8qIEdldCBzcGFjZSBmb3IgdGhlIHJlc3VsdCBsaXN0LiAqLwotCWlmICgocmVzdWx0ID0gKFB5T2JqZWN0ICopIFB5TGlzdF9OZXcobGVuKSkgPT0gTlVMTCkKLQkJZ290byBGYWlsXzI7CisgICAgLyogR2V0IHNwYWNlIGZvciB0aGUgcmVzdWx0IGxpc3QuICovCisgICAgaWYgKChyZXN1bHQgPSAoUHlPYmplY3QgKikgUHlMaXN0X05ldyhsZW4pKSA9PSBOVUxMKQorICAgICAgICBnb3RvIEZhaWxfMjsKIAotCS8qIEl0ZXJhdGUgb3ZlciB0aGUgc2VxdWVuY2VzIHVudGlsIGFsbCBoYXZlIHN0b3BwZWQuICovCi0JZm9yIChpID0gMDsgOyArK2kpIHsKLQkJUHlPYmplY3QgKmFsaXN0LCAqaXRlbT1OVUxMLCAqdmFsdWU7Ci0JCWludCBudW1hY3RpdmUgPSAwOworICAgIC8qIEl0ZXJhdGUgb3ZlciB0aGUgc2VxdWVuY2VzIHVudGlsIGFsbCBoYXZlIHN0b3BwZWQuICovCisgICAgZm9yIChpID0gMDsgOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKmFsaXN0LCAqaXRlbT1OVUxMLCAqdmFsdWU7CisgICAgICAgIGludCBudW1hY3RpdmUgPSAwOwogCi0JCWlmIChmdW5jID09IFB5X05vbmUgJiYgbiA9PSAxKQotCQkJYWxpc3QgPSBOVUxMOwotCQllbHNlIGlmICgoYWxpc3QgPSBQeVR1cGxlX05ldyhuKSkgPT0gTlVMTCkKLQkJCWdvdG8gRmFpbF8xOworICAgICAgICBpZiAoZnVuYyA9PSBQeV9Ob25lICYmIG4gPT0gMSkKKyAgICAgICAgICAgIGFsaXN0ID0gTlVMTDsKKyAgICAgICAgZWxzZSBpZiAoKGFsaXN0ID0gUHlUdXBsZV9OZXcobikpID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEZhaWxfMTsKIAotCQlmb3IgKGogPSAwLCBzcXAgPSBzZXFzOyBqIDwgbjsgKytqLCArK3NxcCkgewotCQkJaWYgKHNxcC0+c2F3X1N0b3BJdGVyYXRpb24pIHsKLQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJaXRlbSA9IFB5X05vbmU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpdGVtID0gUHlJdGVyX05leHQoc3FwLT5pdCk7Ci0JCQkJaWYgKGl0ZW0pCi0JCQkJCSsrbnVtYWN0aXZlOwotCQkJCWVsc2UgewotCQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCQkJUHlfWERFQ1JFRihhbGlzdCk7Ci0JCQkJCQlnb3RvIEZhaWxfMTsKLQkJCQkJfQotCQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJCWl0ZW0gPSBQeV9Ob25lOwotCQkJCQlzcXAtPnNhd19TdG9wSXRlcmF0aW9uID0gMTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWxpc3QpCi0JCQkJUHlUdXBsZV9TRVRfSVRFTShhbGlzdCwgaiwgaXRlbSk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgZm9yIChqID0gMCwgc3FwID0gc2VxczsgaiA8IG47ICsraiwgKytzcXApIHsKKyAgICAgICAgICAgIGlmIChzcXAtPnNhd19TdG9wSXRlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIGl0ZW0gPSBQeV9Ob25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlbSA9IFB5SXRlcl9OZXh0KHNxcC0+aXQpOworICAgICAgICAgICAgICAgIGlmIChpdGVtKQorICAgICAgICAgICAgICAgICAgICArK251bWFjdGl2ZTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoYWxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICBpdGVtID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICAgICAgc3FwLT5zYXdfU3RvcEl0ZXJhdGlvbiA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFsaXN0KQorICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oYWxpc3QsIGosIGl0ZW0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJaWYgKCFhbGlzdCkKLQkJCWFsaXN0ID0gaXRlbTsKKyAgICAgICAgaWYgKCFhbGlzdCkKKyAgICAgICAgICAgIGFsaXN0ID0gaXRlbTsKIAotCQlpZiAobnVtYWN0aXZlID09IDApIHsKLQkJCVB5X0RFQ1JFRihhbGlzdCk7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICBpZiAobnVtYWN0aXZlID09IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhbGlzdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCWlmIChmdW5jID09IFB5X05vbmUpCi0JCQl2YWx1ZSA9IGFsaXN0OwotCQllbHNlIHsKLQkJCXZhbHVlID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYWxpc3QpOwotCQkJUHlfREVDUkVGKGFsaXN0KTsKLQkJCWlmICh2YWx1ZSA9PSBOVUxMKQotCQkJCWdvdG8gRmFpbF8xOwotCQl9Ci0JCWlmIChpID49IGxlbikgewotCQkJaW50IHN0YXR1cyA9IFB5TGlzdF9BcHBlbmQocmVzdWx0LCB2YWx1ZSk7Ci0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJaWYgKHN0YXR1cyA8IDApCi0JCQkJZ290byBGYWlsXzE7Ci0JCX0KLQkJZWxzZSBpZiAoUHlMaXN0X1NldEl0ZW0ocmVzdWx0LCBpLCB2YWx1ZSkgPCAwKQotCQkgCWdvdG8gRmFpbF8xOwotCX0KKyAgICAgICAgaWYgKGZ1bmMgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHZhbHVlID0gYWxpc3Q7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdmFsdWUgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhbGlzdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYWxpc3QpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPj0gbGVuKSB7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChyZXN1bHQsIHZhbHVlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChQeUxpc3RfU2V0SXRlbShyZXN1bHQsIGksIHZhbHVlKSA8IDApCisgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICB9CiAKLQlpZiAoaSA8IGxlbiAmJiBQeUxpc3RfU2V0U2xpY2UocmVzdWx0LCBpLCBsZW4sIE5VTEwpIDwgMCkKLQkJZ290byBGYWlsXzE7CisgICAgaWYgKGkgPCBsZW4gJiYgUHlMaXN0X1NldFNsaWNlKHJlc3VsdCwgaSwgbGVuLCBOVUxMKSA8IDApCisgICAgICAgIGdvdG8gRmFpbF8xOwogCi0JZ290byBTdWNjZWVkOworICAgIGdvdG8gU3VjY2VlZDsKIAogRmFpbF8xOgotCVB5X0RFQ1JFRihyZXN1bHQpOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogRmFpbF8yOgotCXJlc3VsdCA9IE5VTEw7CisgICAgcmVzdWx0ID0gTlVMTDsKIFN1Y2NlZWQ6Ci0JYXNzZXJ0KHNlcXMpOwotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCi0JCVB5X1hERUNSRUYoc2Vxc1tpXS5pdCk7Ci0JUHlNZW1fREVMKHNlcXMpOwotCXJldHVybiByZXN1bHQ7CisgICAgYXNzZXJ0KHNlcXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAgIFB5X1hERUNSRUYoc2Vxc1tpXS5pdCk7CisgICAgUHlNZW1fREVMKHNlcXMpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihtYXBfZG9jLApAQCAtMTA4MywzNSArMTA4MywzNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fbmV4dChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKml0LCAqcmVzOwotCVB5T2JqZWN0ICpkZWYgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdCwgKnJlczsKKyAgICBQeU9iamVjdCAqZGVmID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIm5leHQiLCAxLCAyLCAmaXQsICZkZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIVB5SXRlcl9DaGVjayhpdCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSIlLjIwMHMgb2JqZWN0IGlzIG5vdCBhbiBpdGVyYXRvciIsCi0JCQlpdC0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlyZXMgPSAoKml0LT5vYl90eXBlLT50cF9pdGVybmV4dCkoaXQpOwotCWlmIChyZXMgIT0gTlVMTCkgewotCQlyZXR1cm4gcmVzOwotCX0gZWxzZSBpZiAoZGVmICE9IE5VTEwpIHsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCX0KLQkJUHlfSU5DUkVGKGRlZik7Ci0JCXJldHVybiBkZWY7Ci0JfSBlbHNlIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZSB7Ci0JCVB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJuZXh0IiwgMSwgMiwgJml0LCAmZGVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUl0ZXJfQ2hlY2soaXQpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiJS4yMDBzIG9iamVjdCBpcyBub3QgYW4gaXRlcmF0b3IiLAorICAgICAgICAgICAgaXQtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXMgPSAoKml0LT5vYl90eXBlLT50cF9pdGVybmV4dCkoaXQpOworICAgIGlmIChyZXMgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0gZWxzZSBpZiAoZGVmICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKGRlZik7CisgICAgICAgIHJldHVybiBkZWY7CisgICAgfSBlbHNlIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogUHlEb2NfU1RSVkFSKG5leHRfZG9jLApAQCAtMTEyNCwxNiArMTEyNCwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fc2V0YXR0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JUHlPYmplY3QgKm5hbWU7Ci0JUHlPYmplY3QgKnZhbHVlOworICAgIFB5T2JqZWN0ICp2OworICAgIFB5T2JqZWN0ICpuYW1lOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldGF0dHIiLCAzLCAzLCAmdiwgJm5hbWUsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeU9iamVjdF9TZXRBdHRyKHYsIG5hbWUsIHZhbHVlKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0YXR0ciIsIDMsIDMsICZ2LCAmbmFtZSwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5T2JqZWN0X1NldEF0dHIodiwgbmFtZSwgdmFsdWUpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldGF0dHJfZG9jLApAQCAtMTE0NiwxNSArMTE0NiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fZGVsYXR0cihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JUHlPYmplY3QgKm5hbWU7CisgICAgUHlPYmplY3QgKnY7CisgICAgUHlPYmplY3QgKm5hbWU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkZWxhdHRyIiwgMiwgMiwgJnYsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5T2JqZWN0X1NldEF0dHIodiwgbmFtZSwgKFB5T2JqZWN0ICopTlVMTCkgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRlbGF0dHIiLCAyLCAyLCAmdiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlPYmplY3RfU2V0QXR0cih2LCBuYW1lLCAoUHlPYmplY3QgKilOVUxMKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihkZWxhdHRyX2RvYywKQEAgLTExNjcsMTIgKzExNjcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2hhc2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCWxvbmcgeDsKKyAgICBsb25nIHg7CiAKLQl4ID0gUHlPYmplY3RfSGFzaCh2KTsKLQlpZiAoeCA9PSAtMSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIHggPSBQeU9iamVjdF9IYXNoKHYpOworICAgIGlmICh4ID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CiB9CiAKIFB5RG9jX1NUUlZBUihoYXNoX2RvYywKQEAgLTExODUsMjQgKzExODUsMjQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2hleChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JUHlOdW1iZXJNZXRob2RzICpuYjsKLQlQeU9iamVjdCAqcmVzOworICAgIFB5TnVtYmVyTWV0aG9kcyAqbmI7CisgICAgUHlPYmplY3QgKnJlczsKIAotCWlmICgobmIgPSB2LT5vYl90eXBlLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKLQkgICAgbmItPm5iX2hleCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAiaGV4KCkgYXJndW1lbnQgY2FuJ3QgYmUgY29udmVydGVkIHRvIGhleCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gKCpuYi0+bmJfaGV4KSh2KTsKLQlpZiAocmVzICYmICFQeVN0cmluZ19DaGVjayhyZXMpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJfX2hleF9fIHJldHVybmVkIG5vbi1zdHJpbmcgKHR5cGUgJS4yMDBzKSIsCi0JCQkgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAoKG5iID0gdi0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyKSA9PSBOVUxMIHx8CisgICAgICAgIG5iLT5uYl9oZXggPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICJoZXgoKSBhcmd1bWVudCBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gaGV4Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXMgPSAoKm5iLT5uYl9oZXgpKHYpOworICAgIGlmIChyZXMgJiYgIVB5U3RyaW5nX0NoZWNrKHJlcykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJfX2hleF9fIHJldHVybmVkIG5vbi1zdHJpbmcgKHR5cGUgJS4yMDBzKSIsCisgICAgICAgICAgICAgICAgICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXM7CiB9CiAKIFB5RG9jX1NUUlZBUihoZXhfZG9jLApAQCAtMTIxNiwzMSArMTIxNiwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faW5wdXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpsaW5lOwotCWNoYXIgKnN0cjsKLQlQeU9iamVjdCAqcmVzOwotCVB5T2JqZWN0ICpnbG9iYWxzLCAqbG9jYWxzOwotCVB5Q29tcGlsZXJGbGFncyBjZjsKKyAgICBQeU9iamVjdCAqbGluZTsKKyAgICBjaGFyICpzdHI7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBQeU9iamVjdCAqZ2xvYmFscywgKmxvY2FsczsKKyAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CiAKLQlsaW5lID0gYnVpbHRpbl9yYXdfaW5wdXQoc2VsZiwgYXJncyk7Ci0JaWYgKGxpbmUgPT0gTlVMTCkKLQkJcmV0dXJuIGxpbmU7Ci0JaWYgKCFQeUFyZ19QYXJzZShsaW5lLCAicztlbWJlZGRlZCAnXFwwJyBpbiBpbnB1dCBsaW5lIiwgJnN0cikpCi0JCXJldHVybiBOVUxMOwotCXdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICdcdCcpCi0JCQlzdHIrKzsKLQlnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKLQlsb2NhbHMgPSBQeUV2YWxfR2V0TG9jYWxzKCk7Ci0JaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIiwKLQkJCQkJIFB5RXZhbF9HZXRCdWlsdGlucygpKSAhPSAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWNmLmNmX2ZsYWdzID0gMDsKLQlQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZik7Ci0JcmVzID0gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBQeV9ldmFsX2lucHV0LCBnbG9iYWxzLCBsb2NhbHMsICZjZik7Ci0JUHlfREVDUkVGKGxpbmUpOwotCXJldHVybiByZXM7CisgICAgbGluZSA9IGJ1aWx0aW5fcmF3X2lucHV0KHNlbGYsIGFyZ3MpOworICAgIGlmIChsaW5lID09IE5VTEwpCisgICAgICAgIHJldHVybiBsaW5lOworICAgIGlmICghUHlBcmdfUGFyc2UobGluZSwgInM7ZW1iZWRkZWQgJ1xcMCcgaW4gaW5wdXQgbGluZSIsICZzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnXHQnKQorICAgICAgICAgICAgICAgICAgICBzdHIrKzsKKyAgICBnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKKyAgICBsb2NhbHMgPSBQeUV2YWxfR2V0TG9jYWxzKCk7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXZhbF9HZXRCdWlsdGlucygpKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNmLmNmX2ZsYWdzID0gMDsKKyAgICBQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZik7CisgICAgcmVzID0gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBQeV9ldmFsX2lucHV0LCBnbG9iYWxzLCBsb2NhbHMsICZjZik7CisgICAgUHlfREVDUkVGKGxpbmUpOworICAgIHJldHVybiByZXM7CiB9CiAKIFB5RG9jX1NUUlZBUihpbnB1dF9kb2MsCkBAIC0xMjUyLDE3ICsxMjUyLDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9pbnRlcm4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiUzppbnRlcm4iLCAmcykpCi0JCXJldHVybiBOVUxMOwotCWlmICghUHlTdHJpbmdfQ2hlY2tFeGFjdChzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJjYW4ndCBpbnRlcm4gc3ViY2xhc3Mgb2Ygc3RyaW5nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYocyk7Ci0JUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmcyk7Ci0JcmV0dXJuIHM7CisgICAgUHlPYmplY3QgKnM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJTOmludGVybiIsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgaW50ZXJuIHN1YmNsYXNzIG9mIHN0cmluZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKHMpOworICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJnMpOworICAgIHJldHVybiBzOwogfQogCiBQeURvY19TVFJWQVIoaW50ZXJuX2RvYywKQEAgLTEyNzcsMTggKzEyNzcsMTggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2l0ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2LCAqdyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnYsICp3ID0gTlVMTDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIml0ZXIiLCAxLCAyLCAmdiwgJncpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodyA9PSBOVUxMKQotCQlyZXR1cm4gUHlPYmplY3RfR2V0SXRlcih2KTsKLQlpZiAoIVB5Q2FsbGFibGVfQ2hlY2sodikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiaXRlcih2LCB3KTogdiBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlDYWxsSXRlcl9OZXcodiwgdyk7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXRlciIsIDEsIDIsICZ2LCAmdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh3ID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeU9iamVjdF9HZXRJdGVyKHYpOworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayh2KSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXIodiwgdyk6IHYgbXVzdCBiZSBjYWxsYWJsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5Q2FsbEl0ZXJfTmV3KHYsIHcpOwogfQogCiBQeURvY19TVFJWQVIoaXRlcl9kb2MsCkBAIC0xMzAzLDEyICsxMzAzLDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9sZW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2KQogewotCVB5X3NzaXplX3QgcmVzOworICAgIFB5X3NzaXplX3QgcmVzOwogCi0JcmVzID0gUHlPYmplY3RfU2l6ZSh2KTsKLQlpZiAocmVzIDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbVNzaXplX3QocmVzKTsKKyAgICByZXMgPSBQeU9iamVjdF9TaXplKHYpOworICAgIGlmIChyZXMgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdChyZXMpOwogfQogCiBQeURvY19TVFJWQVIobGVuX2RvYywKQEAgLTEzMjAsMTEgKzEzMjAsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2xvY2FscyhQeU9iamVjdCAqc2VsZikKIHsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAotCWQgPSBQeUV2YWxfR2V0TG9jYWxzKCk7Ci0JUHlfWElOQ1JFRihkKTsKLQlyZXR1cm4gZDsKKyAgICBkID0gUHlFdmFsX0dldExvY2FscygpOworICAgIFB5X1hJTkNSRUYoZCk7CisgICAgcmV0dXJuIGQ7CiB9CiAKIFB5RG9jX1NUUlZBUihsb2NhbHNfZG9jLApAQCAtMTMzNiw5NiArMTMzNiw5NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1pbl9tYXgoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBpbnQgb3ApCiB7Ci0JUHlPYmplY3QgKnYsICppdCwgKml0ZW0sICp2YWwsICptYXhpdGVtLCAqbWF4dmFsLCAqa2V5ZnVuYz1OVUxMOwotCWNvbnN0IGNoYXIgKm5hbWUgPSBvcCA9PSBQeV9MVCA/ICJtaW4iIDogIm1heCI7CisgICAgUHlPYmplY3QgKnYsICppdCwgKml0ZW0sICp2YWwsICptYXhpdGVtLCAqbWF4dmFsLCAqa2V5ZnVuYz1OVUxMOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBvcCA9PSBQeV9MVCA/ICJtaW4iIDogIm1heCI7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID4gMSkKLQkJdiA9IGFyZ3M7Ci0JZWxzZSBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIChjaGFyICopbmFtZSwgMSwgMSwgJnYpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlUdXBsZV9TaXplKGFyZ3MpID4gMSkKKyAgICAgICAgdiA9IGFyZ3M7CisgICAgZWxzZSBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIChjaGFyICopbmFtZSwgMSwgMSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChrd2RzICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpKSB7Ci0JCWtleWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhrd2RzLCAia2V5Iik7Ci0JCWlmIChQeURpY3RfU2l6ZShrd2RzKSE9MSAgfHwgIGtleWZ1bmMgPT0gTlVMTCkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiJXMoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50IiwgbmFtZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9JTkNSRUYoa2V5ZnVuYyk7Ci0JfQorICAgIGlmIChrd2RzICE9IE5VTEwgJiYgUHlEaWN0X0NoZWNrKGt3ZHMpICYmIFB5RGljdF9TaXplKGt3ZHMpKSB7CisgICAgICAgIGtleWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhrd2RzLCAia2V5Iik7CisgICAgICAgIGlmIChQeURpY3RfU2l6ZShrd2RzKSE9MSAgfHwgIGtleWZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiJXMoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50IiwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoa2V5ZnVuYyk7CisgICAgfQogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOwotCWlmIChpdCA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYoa2V5ZnVuYyk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRihrZXlmdW5jKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbWF4aXRlbSA9IE5VTEw7IC8qIHRoZSByZXN1bHQgKi8KLQltYXh2YWwgPSBOVUxMOyAgLyogdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzdWx0ICovCi0Jd2hpbGUgKCggaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSApKSB7Ci0JCS8qIGdldCB0aGUgdmFsdWUgZnJvbSB0aGUga2V5IGZ1bmN0aW9uICovCi0JCWlmIChrZXlmdW5jICE9IE5VTEwpIHsKLQkJCXZhbCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moa2V5ZnVuYywgaXRlbSwgTlVMTCk7Ci0JCQlpZiAodmFsID09IE5VTEwpCi0JCQkJZ290byBGYWlsX2l0X2l0ZW07Ci0JCX0KLQkJLyogbm8ga2V5IGZ1bmN0aW9uOyB0aGUgdmFsdWUgaXMgdGhlIGl0ZW0gKi8KLQkJZWxzZSB7Ci0JCQl2YWwgPSBpdGVtOwotCQkJUHlfSU5DUkVGKHZhbCk7Ci0JCX0KKyAgICBtYXhpdGVtID0gTlVMTDsgLyogdGhlIHJlc3VsdCAqLworICAgIG1heHZhbCA9IE5VTEw7ICAvKiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXN1bHQgKi8KKyAgICB3aGlsZSAoKCBpdGVtID0gUHlJdGVyX05leHQoaXQpICkpIHsKKyAgICAgICAgLyogZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBrZXkgZnVuY3Rpb24gKi8KKyAgICAgICAgaWYgKGtleWZ1bmMgIT0gTlVMTCkgeworICAgICAgICAgICAgdmFsID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhrZXlmdW5jLCBpdGVtLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICh2YWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfaXRfaXRlbTsKKyAgICAgICAgfQorICAgICAgICAvKiBubyBrZXkgZnVuY3Rpb247IHRoZSB2YWx1ZSBpcyB0aGUgaXRlbSAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHZhbCA9IGl0ZW07CisgICAgICAgICAgICBQeV9JTkNSRUYodmFsKTsKKyAgICAgICAgfQogCi0JCS8qIG1heGltdW0gdmFsdWUgYW5kIGl0ZW0gYXJlIHVuc2V0OyBzZXQgdGhlbSAqLwotCQlpZiAobWF4dmFsID09IE5VTEwpIHsKLQkJCW1heGl0ZW0gPSBpdGVtOwotCQkJbWF4dmFsID0gdmFsOwotCQl9Ci0JCS8qIG1heGltdW0gdmFsdWUgYW5kIGl0ZW0gYXJlIHNldDsgdXBkYXRlIHRoZW0gYXMgbmVjZXNzYXJ5ICovCi0JCWVsc2UgewotCQkJaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh2YWwsIG1heHZhbCwgb3ApOwotCQkJaWYgKGNtcCA8IDApCi0JCQkJZ290byBGYWlsX2l0X2l0ZW1fYW5kX3ZhbDsKLQkJCWVsc2UgaWYgKGNtcCA+IDApIHsKLQkJCQlQeV9ERUNSRUYobWF4dmFsKTsKLQkJCQlQeV9ERUNSRUYobWF4aXRlbSk7Ci0JCQkJbWF4dmFsID0gdmFsOwotCQkJCW1heGl0ZW0gPSBpdGVtOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCVB5X0RFQ1JFRih2YWwpOwotCQkJfQotCQl9Ci0JfQotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlnb3RvIEZhaWxfaXQ7Ci0JaWYgKG1heHZhbCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotCQkJICAgICAiJXMoKSBhcmcgaXMgYW4gZW1wdHkgc2VxdWVuY2UiLCBuYW1lKTsKLQkJYXNzZXJ0KG1heGl0ZW0gPT0gTlVMTCk7Ci0JfQotCWVsc2UKLQkJUHlfREVDUkVGKG1heHZhbCk7Ci0JUHlfREVDUkVGKGl0KTsKLQlQeV9YREVDUkVGKGtleWZ1bmMpOwotCXJldHVybiBtYXhpdGVtOworICAgICAgICAvKiBtYXhpbXVtIHZhbHVlIGFuZCBpdGVtIGFyZSB1bnNldDsgc2V0IHRoZW0gKi8KKyAgICAgICAgaWYgKG1heHZhbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBtYXhpdGVtID0gaXRlbTsKKyAgICAgICAgICAgIG1heHZhbCA9IHZhbDsKKyAgICAgICAgfQorICAgICAgICAvKiBtYXhpbXVtIHZhbHVlIGFuZCBpdGVtIGFyZSBzZXQ7IHVwZGF0ZSB0aGVtIGFzIG5lY2Vzc2FyeSAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodmFsLCBtYXh2YWwsIG9wKTsKKyAgICAgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbF9pdF9pdGVtX2FuZF92YWw7CisgICAgICAgICAgICBlbHNlIGlmIChjbXAgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1heHZhbCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG1heGl0ZW0pOworICAgICAgICAgICAgICAgIG1heHZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICBtYXhpdGVtID0gaXRlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBGYWlsX2l0OworICAgIGlmIChtYXh2YWwgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlcygpIGFyZyBpcyBhbiBlbXB0eSBzZXF1ZW5jZSIsIG5hbWUpOworICAgICAgICBhc3NlcnQobWF4aXRlbSA9PSBOVUxMKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBQeV9ERUNSRUYobWF4dmFsKTsKKyAgICBQeV9ERUNSRUYoaXQpOworICAgIFB5X1hERUNSRUYoa2V5ZnVuYyk7CisgICAgcmV0dXJuIG1heGl0ZW07CiAKIEZhaWxfaXRfaXRlbV9hbmRfdmFsOgotCVB5X0RFQ1JFRih2YWwpOworICAgIFB5X0RFQ1JFRih2YWwpOwogRmFpbF9pdF9pdGVtOgotCVB5X0RFQ1JFRihpdGVtKTsKKyAgICBQeV9ERUNSRUYoaXRlbSk7CiBGYWlsX2l0OgotCVB5X1hERUNSRUYobWF4dmFsKTsKLQlQeV9YREVDUkVGKG1heGl0ZW0pOwotCVB5X0RFQ1JFRihpdCk7Ci0JUHlfWERFQ1JFRihrZXlmdW5jKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKG1heHZhbCk7CisgICAgUHlfWERFQ1JFRihtYXhpdGVtKTsKKyAgICBQeV9ERUNSRUYoaXQpOworICAgIFB5X1hERUNSRUYoa2V5ZnVuYyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX21pbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiBtaW5fbWF4KGFyZ3MsIGt3ZHMsIFB5X0xUKTsKKyAgICByZXR1cm4gbWluX21heChhcmdzLCBrd2RzLCBQeV9MVCk7CiB9CiAKIFB5RG9jX1NUUlZBUihtaW5fZG9jLApAQCAtMTQzOSw3ICsxNDM5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX21heChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXJldHVybiBtaW5fbWF4KGFyZ3MsIGt3ZHMsIFB5X0dUKTsKKyAgICByZXR1cm4gbWluX21heChhcmdzLCBrd2RzLCBQeV9HVCk7CiB9CiAKIFB5RG9jX1NUUlZBUihtYXhfZG9jLApAQCAtMTQ1MywyNCArMTQ1MywyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fb2N0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdikKIHsKLQlQeU51bWJlck1ldGhvZHMgKm5iOwotCVB5T2JqZWN0ICpyZXM7CisgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JaWYgKHYgPT0gTlVMTCB8fCAobmIgPSB2LT5vYl90eXBlLT50cF9hc19udW1iZXIpID09IE5VTEwgfHwKLQkgICAgbmItPm5iX29jdCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAib2N0KCkgYXJndW1lbnQgY2FuJ3QgYmUgY29udmVydGVkIHRvIG9jdCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmVzID0gKCpuYi0+bmJfb2N0KSh2KTsKLQlpZiAocmVzICYmICFQeVN0cmluZ19DaGVjayhyZXMpKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICJfX29jdF9fIHJldHVybmVkIG5vbi1zdHJpbmcgKHR5cGUgJS4yMDBzKSIsCi0JCQkgICAgIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCVB5X0RFQ1JFRihyZXMpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICBpZiAodiA9PSBOVUxMIHx8IChuYiA9IHYtPm9iX3R5cGUtPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAorICAgICAgICBuYi0+bmJfb2N0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAib2N0KCkgYXJndW1lbnQgY2FuJ3QgYmUgY29udmVydGVkIHRvIG9jdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzID0gKCpuYi0+bmJfb2N0KSh2KTsKKyAgICBpZiAocmVzICYmICFQeVN0cmluZ19DaGVjayhyZXMpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiX19vY3RfXyByZXR1cm5lZCBub24tc3RyaW5nICh0eXBlICUuMjAwcykiLAorICAgICAgICAgICAgICAgICAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiBQeURvY19TVFJWQVIob2N0X2RvYywKQEAgLTE0ODIsNyArMTQ4Miw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9vcGVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X0NhbGwoKFB5T2JqZWN0KikmUHlGaWxlX1R5cGUsIGFyZ3MsIGt3ZHMpOworICAgIHJldHVybiBQeU9iamVjdF9DYWxsKChQeU9iamVjdCopJlB5RmlsZV9UeXBlLCBhcmdzLCBrd2RzKTsKIH0KIAogUHlEb2NfU1RSVkFSKG9wZW5fZG9jLApAQCAtMTQ5NSw0MiArMTQ5NSw0MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fb3JkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCogb2JqKQogewotCWxvbmcgb3JkOwotCVB5X3NzaXplX3Qgc2l6ZTsKKyAgICBsb25nIG9yZDsKKyAgICBQeV9zc2l6ZV90IHNpemU7CiAKLQlpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSkgewotCQlzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUob2JqKTsKLQkJaWYgKHNpemUgPT0gMSkgewotCQkJb3JkID0gKGxvbmcpKCh1bnNpZ25lZCBjaGFyKSpQeVN0cmluZ19BU19TVFJJTkcob2JqKSk7Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcob3JkKTsKLQkJfQotCX0gZWxzZSBpZiAoUHlCeXRlQXJyYXlfQ2hlY2sob2JqKSkgewotCQlzaXplID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUob2JqKTsKLQkJaWYgKHNpemUgPT0gMSkgewotCQkJb3JkID0gKGxvbmcpKCh1bnNpZ25lZCBjaGFyKSpQeUJ5dGVBcnJheV9BU19TVFJJTkcob2JqKSk7Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcob3JkKTsKLQkJfQorICAgIGlmIChQeVN0cmluZ19DaGVjayhvYmopKSB7CisgICAgICAgIHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShvYmopOworICAgICAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICBvcmQgPSAobG9uZykoKHVuc2lnbmVkIGNoYXIpKlB5U3RyaW5nX0FTX1NUUklORyhvYmopKTsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhvcmQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChQeUJ5dGVBcnJheV9DaGVjayhvYmopKSB7CisgICAgICAgIHNpemUgPSBQeUJ5dGVBcnJheV9HRVRfU0laRShvYmopOworICAgICAgICBpZiAoc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICBvcmQgPSAobG9uZykoKHVuc2lnbmVkIGNoYXIpKlB5Qnl0ZUFycmF5X0FTX1NUUklORyhvYmopKTsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhvcmQpOworICAgICAgICB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkgewotCQlzaXplID0gUHlVbmljb2RlX0dFVF9TSVpFKG9iaik7Ci0JCWlmIChzaXplID09IDEpIHsKLQkJCW9yZCA9IChsb25nKSpQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmopOwotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKG9yZCk7Ci0JCX0KKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKSB7CisgICAgICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX1NJWkUob2JqKTsKKyAgICAgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICAgICAgb3JkID0gKGxvbmcpKlB5VW5pY29kZV9BU19VTklDT0RFKG9iaik7CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcob3JkKTsKKyAgICAgICAgfQogI2VuZGlmCi0JfSBlbHNlIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIm9yZCgpIGV4cGVjdGVkIHN0cmluZyBvZiBsZW5ndGggMSwgYnV0ICIgXAotCQkJICAgICAiJS4yMDBzIGZvdW5kIiwgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAib3JkKCkgZXhwZWN0ZWQgc3RyaW5nIG9mIGxlbmd0aCAxLCBidXQgIiBcCisgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzIGZvdW5kIiwgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAib3JkKCkgZXhwZWN0ZWQgYSBjaGFyYWN0ZXIsICIKLQkJICAgICAiYnV0IHN0cmluZyBvZiBsZW5ndGggJXpkIGZvdW5kIiwKLQkJICAgICBzaXplKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAib3JkKCkgZXhwZWN0ZWQgYSBjaGFyYWN0ZXIsICIKKyAgICAgICAgICAgICAgICAgImJ1dCBzdHJpbmcgb2YgbGVuZ3RoICV6ZCBmb3VuZCIsCisgICAgICAgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeURvY19TVFJWQVIob3JkX2RvYywKQEAgLTE1NDIsMTEgKzE1NDIsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3BvdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKnYsICp3LCAqeiA9IFB5X05vbmU7CisgICAgUHlPYmplY3QgKnYsICp3LCAqeiA9IFB5X05vbmU7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJwb3ciLCAyLCAzLCAmdiwgJncsICZ6KSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TnVtYmVyX1Bvd2VyKHYsIHcsIHopOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvdyIsIDIsIDMsICZ2LCAmdywgJnopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlOdW1iZXJfUG93ZXIodiwgdywgeik7CiB9CiAKIFB5RG9jX1NUUlZBUihwb3dfZG9jLApAQCAtMTU1OSwxMjAgKzE1NTksMTIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnVpbHRpbl9wcmludChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsic2VwIiwgImVuZCIsICJmaWxlIiwgMH07Ci0Jc3RhdGljIFB5T2JqZWN0ICpkdW1teV9hcmdzID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKnVuaWNvZGVfbmV3bGluZSA9IE5VTEwsICp1bmljb2RlX3NwYWNlID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKnN0cl9uZXdsaW5lID0gTlVMTCwgKnN0cl9zcGFjZSA9IE5VTEw7Ci0JUHlPYmplY3QgKm5ld2xpbmUsICpzcGFjZTsKLQlQeU9iamVjdCAqc2VwID0gTlVMTCwgKmVuZCA9IE5VTEwsICpmaWxlID0gTlVMTDsKLQlpbnQgaSwgZXJyLCB1c2VfdW5pY29kZSA9IDA7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJzZXAiLCAiZW5kIiwgImZpbGUiLCAwfTsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmR1bW15X2FyZ3MgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqdW5pY29kZV9uZXdsaW5lID0gTlVMTCwgKnVuaWNvZGVfc3BhY2UgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqc3RyX25ld2xpbmUgPSBOVUxMLCAqc3RyX3NwYWNlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbmV3bGluZSwgKnNwYWNlOworICAgIFB5T2JqZWN0ICpzZXAgPSBOVUxMLCAqZW5kID0gTlVMTCwgKmZpbGUgPSBOVUxMOworICAgIGludCBpLCBlcnIsIHVzZV91bmljb2RlID0gMDsKIAotCWlmIChkdW1teV9hcmdzID09IE5VTEwpIHsKLQkJaWYgKCEoZHVtbXlfYXJncyA9IFB5VHVwbGVfTmV3KDApKSkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc3RyX25ld2xpbmUgPT0gTlVMTCkgewotCQlzdHJfbmV3bGluZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlxuIik7Ci0JCWlmIChzdHJfbmV3bGluZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXN0cl9zcGFjZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIiAiKTsKLQkJaWYgKHN0cl9zcGFjZSA9PSBOVUxMKSB7Ci0JCQlQeV9DTEVBUihzdHJfbmV3bGluZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQl1bmljb2RlX25ld2xpbmUgPSBQeVVuaWNvZGVfRnJvbVN0cmluZygiXG4iKTsKLQkJaWYgKHVuaWNvZGVfbmV3bGluZSA9PSBOVUxMKSB7Ci0JCQlQeV9DTEVBUihzdHJfbmV3bGluZSk7Ci0JCQlQeV9DTEVBUihzdHJfc3BhY2UpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJdW5pY29kZV9zcGFjZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCIgIik7Ci0JCWlmICh1bmljb2RlX3NwYWNlID09IE5VTEwpIHsKLQkJCVB5X0NMRUFSKHN0cl9uZXdsaW5lKTsKLQkJCVB5X0NMRUFSKHN0cl9zcGFjZSk7Ci0JCQlQeV9DTEVBUih1bmljb2RlX3NwYWNlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGR1bW15X2FyZ3MsIGt3ZHMsICJ8T09POnByaW50IiwKLQkJCQkJIGt3bGlzdCwgJnNlcCwgJmVuZCwgJmZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZmlsZSA9PSBOVUxMIHx8IGZpbGUgPT0gUHlfTm9uZSkgewotCQlmaWxlID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKLQkJLyogc3lzLnN0ZG91dCBtYXkgYmUgTm9uZSB3aGVuIEZJTEUqIHN0ZG91dCBpc24ndCBjb25uZWN0ZWQgKi8KLQkJaWYgKGZpbGUgPT0gUHlfTm9uZSkKLQkJCVB5X1JFVFVSTl9OT05FOwotCX0KLQlpZiAoc2VwID09IFB5X05vbmUpIHsKLQkJc2VwID0gTlVMTDsKLQl9Ci0JZWxzZSBpZiAoc2VwKSB7Ci0JCWlmIChQeVVuaWNvZGVfQ2hlY2soc2VwKSkgewotCQkJdXNlX3VuaWNvZGUgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhzZXApKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgInNlcCBtdXN0IGJlIE5vbmUsIHN0ciBvciB1bmljb2RlLCBub3QgJS4yMDBzIiwKLQkJCQkgICAgIHNlcC0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlpZiAoZW5kID09IFB5X05vbmUpCi0JCWVuZCA9IE5VTEw7Ci0JZWxzZSBpZiAoZW5kKSB7Ci0JCWlmIChQeVVuaWNvZGVfQ2hlY2soZW5kKSkgewotCQkJdXNlX3VuaWNvZGUgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKCFQeVN0cmluZ19DaGVjayhlbmQpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAgImVuZCBtdXN0IGJlIE5vbmUsIHN0ciBvciB1bmljb2RlLCBub3QgJS4yMDBzIiwKLQkJCQkgICAgIGVuZC0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KKyAgICBpZiAoZHVtbXlfYXJncyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghKGR1bW15X2FyZ3MgPSBQeVR1cGxlX05ldygwKSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHN0cl9uZXdsaW5lID09IE5VTEwpIHsKKyAgICAgICAgc3RyX25ld2xpbmUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJcbiIpOworICAgICAgICBpZiAoc3RyX25ld2xpbmUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzdHJfc3BhY2UgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIgIik7CisgICAgICAgIGlmIChzdHJfc3BhY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfQ0xFQVIoc3RyX25ld2xpbmUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgdW5pY29kZV9uZXdsaW5lID0gUHlVbmljb2RlX0Zyb21TdHJpbmcoIlxuIik7CisgICAgICAgIGlmICh1bmljb2RlX25ld2xpbmUgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfQ0xFQVIoc3RyX25ld2xpbmUpOworICAgICAgICAgICAgUHlfQ0xFQVIoc3RyX3NwYWNlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHVuaWNvZGVfc3BhY2UgPSBQeVVuaWNvZGVfRnJvbVN0cmluZygiICIpOworICAgICAgICBpZiAodW5pY29kZV9zcGFjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9DTEVBUihzdHJfbmV3bGluZSk7CisgICAgICAgICAgICBQeV9DTEVBUihzdHJfc3BhY2UpOworICAgICAgICAgICAgUHlfQ0xFQVIodW5pY29kZV9zcGFjZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhkdW1teV9hcmdzLCBrd2RzLCAifE9PTzpwcmludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dsaXN0LCAmc2VwLCAmZW5kLCAmZmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChmaWxlID09IE5VTEwgfHwgZmlsZSA9PSBQeV9Ob25lKSB7CisgICAgICAgIGZpbGUgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOworICAgICAgICAvKiBzeXMuc3Rkb3V0IG1heSBiZSBOb25lIHdoZW4gRklMRSogc3Rkb3V0IGlzbid0IGNvbm5lY3RlZCAqLworICAgICAgICBpZiAoZmlsZSA9PSBQeV9Ob25lKQorICAgICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQorICAgIGlmIChzZXAgPT0gUHlfTm9uZSkgeworICAgICAgICBzZXAgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmIChzZXApIHsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhzZXApKSB7CisgICAgICAgICAgICB1c2VfdW5pY29kZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKHNlcCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlcCBtdXN0IGJlIE5vbmUsIHN0ciBvciB1bmljb2RlLCBub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXAtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVuZCA9PSBQeV9Ob25lKQorICAgICAgICBlbmQgPSBOVUxMOworICAgIGVsc2UgaWYgKGVuZCkgeworICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKGVuZCkpIHsKKyAgICAgICAgICAgIHVzZV91bmljb2RlID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soZW5kKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZW5kIG11c3QgYmUgTm9uZSwgc3RyIG9yIHVuaWNvZGUsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuZC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICghdXNlX3VuaWNvZGUpIHsKLQkJZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfU2l6ZShhcmdzKTsgaSsrKSB7Ci0JCQlpZiAoUHlVbmljb2RlX0NoZWNrKFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSkpKSB7Ci0JCQkJdXNlX3VuaWNvZGUgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmICh1c2VfdW5pY29kZSkgewotCQluZXdsaW5lID0gdW5pY29kZV9uZXdsaW5lOwotCQlzcGFjZSA9IHVuaWNvZGVfc3BhY2U7Ci0JfQotCWVsc2UgewotCQluZXdsaW5lID0gc3RyX25ld2xpbmU7Ci0JCXNwYWNlID0gc3RyX3NwYWNlOwotCX0KKyAgICBpZiAoIXVzZV91bmljb2RlKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX1NpemUoYXJncyk7IGkrKykgeworICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpKSkgeworICAgICAgICAgICAgICAgIHVzZV91bmljb2RlID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodXNlX3VuaWNvZGUpIHsKKyAgICAgICAgbmV3bGluZSA9IHVuaWNvZGVfbmV3bGluZTsKKyAgICAgICAgc3BhY2UgPSB1bmljb2RlX3NwYWNlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbmV3bGluZSA9IHN0cl9uZXdsaW5lOworICAgICAgICBzcGFjZSA9IHN0cl9zcGFjZTsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9TaXplKGFyZ3MpOyBpKyspIHsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlpZiAoc2VwID09IE5VTEwpCi0JCQkJZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHNwYWNlLCBmaWxlLAotCQkJCQkJCSBQeV9QUklOVF9SQVcpOwotCQkJZWxzZQotCQkJCWVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChzZXAsIGZpbGUsCi0JCQkJCQkJIFB5X1BSSU5UX1JBVyk7Ci0JCQlpZiAoZXJyKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChQeVR1cGxlX0dldEl0ZW0oYXJncywgaSksIGZpbGUsCi0JCQkJCSBQeV9QUklOVF9SQVcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX1NpemUoYXJncyk7IGkrKykgeworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIGlmIChzZXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3Qoc3BhY2UsIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1BSSU5UX1JBVyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHNlcCwgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfUFJJTlRfUkFXKTsKKyAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KFB5VHVwbGVfR2V0SXRlbShhcmdzLCBpKSwgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1BSSU5UX1JBVyk7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoZW5kID09IE5VTEwpCi0JCWVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChuZXdsaW5lLCBmaWxlLCBQeV9QUklOVF9SQVcpOwotCWVsc2UKLQkJZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KGVuZCwgZmlsZSwgUHlfUFJJTlRfUkFXKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoZW5kID09IE5VTEwpCisgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdChuZXdsaW5lLCBmaWxlLCBQeV9QUklOVF9SQVcpOworICAgIGVsc2UKKyAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KGVuZCwgZmlsZSwgUHlfUFJJTlRfUkFXKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X1JFVFVSTl9OT05FOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIocHJpbnRfZG9jLApAQCAtMTY5NCw1NSArMTY5NCw1NSBAQAogc3RhdGljIGxvbmcKIGdldF9sZW5fb2ZfcmFuZ2VfbG9uZ3MoUHlPYmplY3QgKmxvLCBQeU9iamVjdCAqaGksIFB5T2JqZWN0ICpzdGVwKQogewotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlBbGdvcml0aG0gaXMgZXF1YWwgdG8gdGhhdCBvZiBnZXRfbGVuX29mX3JhbmdlKCksIGJ1dCBpdCBvcGVyYXRlcwotCW9uIFB5T2JqZWN0cyAod2hpY2ggYXJlIGFzc3VtZWQgdG8gYmUgUHlMb25nIG9yIFB5SW50IG9iamVjdHMpLgotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JbG9uZyBuOwotCVB5T2JqZWN0ICpkaWZmID0gTlVMTDsKLQlQeU9iamVjdCAqb25lID0gTlVMTDsKLQlQeU9iamVjdCAqdG1wMSA9IE5VTEwsICp0bXAyID0gTlVMTCwgKnRtcDMgPSBOVUxMOwotCQkvKiBob2xkcyBzdWItZXhwcmVzc2lvbiBldmFsdWF0aW9ucyAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBbGdvcml0aG0gaXMgZXF1YWwgdG8gdGhhdCBvZiBnZXRfbGVuX29mX3JhbmdlKCksIGJ1dCBpdCBvcGVyYXRlcworICAgIG9uIFB5T2JqZWN0cyAod2hpY2ggYXJlIGFzc3VtZWQgdG8gYmUgUHlMb25nIG9yIFB5SW50IG9iamVjdHMpLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgbG9uZyBuOworICAgIFB5T2JqZWN0ICpkaWZmID0gTlVMTDsKKyAgICBQeU9iamVjdCAqb25lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdG1wMSA9IE5VTEwsICp0bXAyID0gTlVMTCwgKnRtcDMgPSBOVUxMOworICAgICAgICAvKiBob2xkcyBzdWItZXhwcmVzc2lvbiBldmFsdWF0aW9ucyAqLwogCi0JLyogaWYgKGxvID49IGhpKSwgcmV0dXJuIGxlbmd0aCBvZiAwLiAqLwotCWlmIChQeU9iamVjdF9Db21wYXJlKGxvLCBoaSkgPj0gMCkKLQkJcmV0dXJuIDA7CisgICAgLyogaWYgKGxvID49IGhpKSwgcmV0dXJuIGxlbmd0aCBvZiAwLiAqLworICAgIGlmIChQeU9iamVjdF9Db21wYXJlKGxvLCBoaSkgPj0gMCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoKG9uZSA9IFB5TG9uZ19Gcm9tTG9uZygxTCkpID09IE5VTEwpCi0JCWdvdG8gRmFpbDsKKyAgICBpZiAoKG9uZSA9IFB5TG9uZ19Gcm9tTG9uZygxTCkpID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCWlmICgodG1wMSA9IFB5TnVtYmVyX1N1YnRyYWN0KGhpLCBsbykpID09IE5VTEwpCi0JCWdvdG8gRmFpbDsKKyAgICBpZiAoKHRtcDEgPSBQeU51bWJlcl9TdWJ0cmFjdChoaSwgbG8pKSA9PSBOVUxMKQorICAgICAgICBnb3RvIEZhaWw7CiAKLQlpZiAoKGRpZmYgPSBQeU51bWJlcl9TdWJ0cmFjdCh0bXAxLCBvbmUpKSA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgaWYgKChkaWZmID0gUHlOdW1iZXJfU3VidHJhY3QodG1wMSwgb25lKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOwogCi0JaWYgKCh0bXAyID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUoZGlmZiwgc3RlcCkpID09IE5VTEwpCi0JCWdvdG8gRmFpbDsKKyAgICBpZiAoKHRtcDIgPSBQeU51bWJlcl9GbG9vckRpdmlkZShkaWZmLCBzdGVwKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOwogCi0JaWYgKCh0bXAzID0gUHlOdW1iZXJfQWRkKHRtcDIsIG9uZSkpID09IE5VTEwpCi0JCWdvdG8gRmFpbDsKKyAgICBpZiAoKHRtcDMgPSBQeU51bWJlcl9BZGQodG1wMiwgb25lKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOwogCi0JbiA9IFB5TG9uZ19Bc0xvbmcodG1wMyk7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsgIC8qIENoZWNrIGZvciBPdmVyZmxvdyAqLwotCQlQeUVycl9DbGVhcigpOwotCQlnb3RvIEZhaWw7Ci0JfQorICAgIG4gPSBQeUxvbmdfQXNMb25nKHRtcDMpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7ICAvKiBDaGVjayBmb3IgT3ZlcmZsb3cgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZ290byBGYWlsOworICAgIH0KIAotCVB5X0RFQ1JFRih0bXAzKTsKLQlQeV9ERUNSRUYodG1wMik7Ci0JUHlfREVDUkVGKGRpZmYpOwotCVB5X0RFQ1JFRih0bXAxKTsKLQlQeV9ERUNSRUYob25lKTsKLQlyZXR1cm4gbjsKKyAgICBQeV9ERUNSRUYodG1wMyk7CisgICAgUHlfREVDUkVGKHRtcDIpOworICAgIFB5X0RFQ1JFRihkaWZmKTsKKyAgICBQeV9ERUNSRUYodG1wMSk7CisgICAgUHlfREVDUkVGKG9uZSk7CisgICAgcmV0dXJuIG47CiAKICAgRmFpbDoKLQlQeV9YREVDUkVGKHRtcDMpOwotCVB5X1hERUNSRUYodG1wMik7Ci0JUHlfWERFQ1JFRihkaWZmKTsKLQlQeV9YREVDUkVGKHRtcDEpOwotCVB5X1hERUNSRUYob25lKTsKLQlyZXR1cm4gLTE7CisgICAgUHlfWERFQ1JFRih0bXAzKTsKKyAgICBQeV9YREVDUkVGKHRtcDIpOworICAgIFB5X1hERUNSRUYoZGlmZik7CisgICAgUHlfWERFQ1JFRih0bXAxKTsKKyAgICBQeV9YREVDUkVGKG9uZSk7CisgICAgcmV0dXJuIC0xOwogfQogCiAvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGhhbmRsZV9yYW5nZV9sb25ncy4gIElmIGFyZyBpcyBpbnQgb3IgbG9uZwpAQCAtMTc1NSwyOSArMTc1NSwyOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9yYW5nZV9sb25nX2FyZ3VtZW50KFB5T2JqZWN0ICphcmcsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JUHlOdW1iZXJNZXRob2RzICpuYjsKLQlpZiAoUHlJbnRfQ2hlY2soYXJnKSB8fCBQeUxvbmdfQ2hlY2soYXJnKSkgewotCQlQeV9JTkNSRUYoYXJnKTsKLQkJcmV0dXJuIGFyZzsKLQl9Ci0JaWYgKFB5RmxvYXRfQ2hlY2soYXJnKSB8fAotCSAgICAobmIgPSBQeV9UWVBFKGFyZyktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAotCSAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgInJhbmdlKCkgaW50ZWdlciAlcyBhcmd1bWVudCBleHBlY3RlZCwgZ290ICVzLiIsCi0JCQkgICAgIG5hbWUsIGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2ID0gbmItPm5iX2ludChhcmcpOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeUludF9DaGVjayh2KSB8fCBQeUxvbmdfQ2hlY2sodikpCi0JCXJldHVybiB2OwotCVB5X0RFQ1JFRih2KTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJIl9faW50X18gc2hvdWxkIHJldHVybiBpbnQgb2JqZWN0Iik7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlPYmplY3QgKnY7CisgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKKyAgICBpZiAoUHlJbnRfQ2hlY2soYXJnKSB8fCBQeUxvbmdfQ2hlY2soYXJnKSkgeworICAgICAgICBQeV9JTkNSRUYoYXJnKTsKKyAgICAgICAgcmV0dXJuIGFyZzsKKyAgICB9CisgICAgaWYgKFB5RmxvYXRfQ2hlY2soYXJnKSB8fAorICAgICAgICAobmIgPSBQeV9UWVBFKGFyZyktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fAorICAgICAgICBuYi0+bmJfaW50ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJyYW5nZSgpIGludGVnZXIgJXMgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSwgYXJnLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHYgPSBuYi0+bmJfaW50KGFyZyk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5SW50X0NoZWNrKHYpIHx8IFB5TG9uZ19DaGVjayh2KSkKKyAgICAgICAgcmV0dXJuIHY7CisgICAgUHlfREVDUkVGKHYpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJfX2ludF9fIHNob3VsZCByZXR1cm4gaW50IG9iamVjdCIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBBbiBleHRlbnNpb24gb2YgYnVpbHRpbl9yYW5nZSgpIHRoYXQgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIFB5TG9uZwpAQCAtMTc4NSwxMjkgKzE3ODUsMTI5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogaGFuZGxlX3JhbmdlX2xvbmdzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqaWxvdyA9IE5VTEw7Ci0JUHlPYmplY3QgKmloaWdoID0gTlVMTDsKLQlQeU9iamVjdCAqaXN0ZXAgPSBOVUxMOworICAgIFB5T2JqZWN0ICppbG93ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaWhpZ2ggPSBOVUxMOworICAgIFB5T2JqZWN0ICppc3RlcCA9IE5VTEw7CiAKLQlQeU9iamVjdCAqbG93ID0gTlVMTDsKLQlQeU9iamVjdCAqaGlnaCA9IE5VTEw7Ci0JUHlPYmplY3QgKnN0ZXAgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsb3cgPSBOVUxMOworICAgIFB5T2JqZWN0ICpoaWdoID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RlcCA9IE5VTEw7CiAKLQlQeU9iamVjdCAqY3VybnVtID0gTlVMTDsKLQlQeU9iamVjdCAqdiA9IE5VTEw7Ci0JbG9uZyBiaWduOwotCWludCBpLCBuOwotCWludCBjbXBfcmVzdWx0OworICAgIFB5T2JqZWN0ICpjdXJudW0gPSBOVUxMOworICAgIFB5T2JqZWN0ICp2ID0gTlVMTDsKKyAgICBsb25nIGJpZ247CisgICAgaW50IGksIG47CisgICAgaW50IGNtcF9yZXN1bHQ7CiAKLQlQeU9iamVjdCAqemVybyA9IFB5TG9uZ19Gcm9tTG9uZygwKTsKKyAgICBQeU9iamVjdCAqemVybyA9IFB5TG9uZ19Gcm9tTG9uZygwKTsKIAotCWlmICh6ZXJvID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmICh6ZXJvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmFuZ2UiLCAxLCAzLCAmaWxvdywgJmloaWdoLCAmaXN0ZXApKSB7Ci0JCVB5X0RFQ1JFRih6ZXJvKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJhbmdlIiwgMSwgMywgJmlsb3csICZpaGlnaCwgJmlzdGVwKSkgeworICAgICAgICBQeV9ERUNSRUYoemVybyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEZpZ3VyZSBvdXQgd2hpY2ggd2F5IHdlIHdlcmUgY2FsbGVkLCBzdXBwbHkgZGVmYXVsdHMsIGFuZCBiZQotCSAqIHN1cmUgdG8gaW5jcmVmIGV2ZXJ5dGhpbmcgc28gdGhhdCB0aGUgZGVjcmVmcyBhdCB0aGUgZW5kCi0JICogYXJlIGNvcnJlY3QuIE5COiBpbG93LCBpaGlnaCBhbmQgaXN0ZXAgYXJlIGJvcnJvd2VkIHJlZmVyZW5jZXMuCi0JICovCi0JYXNzZXJ0KGlsb3cgIT0gTlVMTCk7Ci0JaWYgKGloaWdoID09IE5VTEwpIHsKLQkJLyogb25seSAxIGFyZyAtLSBpdCdzIHRoZSB1cHBlciBsaW1pdCAqLwotCQlpaGlnaCA9IGlsb3c7Ci0JCWlsb3cgPSBOVUxMOwotCX0KKyAgICAvKiBGaWd1cmUgb3V0IHdoaWNoIHdheSB3ZSB3ZXJlIGNhbGxlZCwgc3VwcGx5IGRlZmF1bHRzLCBhbmQgYmUKKyAgICAgKiBzdXJlIHRvIGluY3JlZiBldmVyeXRoaW5nIHNvIHRoYXQgdGhlIGRlY3JlZnMgYXQgdGhlIGVuZAorICAgICAqIGFyZSBjb3JyZWN0LiBOQjogaWxvdywgaWhpZ2ggYW5kIGlzdGVwIGFyZSBib3Jyb3dlZCByZWZlcmVuY2VzLgorICAgICAqLworICAgIGFzc2VydChpbG93ICE9IE5VTEwpOworICAgIGlmIChpaGlnaCA9PSBOVUxMKSB7CisgICAgICAgIC8qIG9ubHkgMSBhcmcgLS0gaXQncyB0aGUgdXBwZXIgbGltaXQgKi8KKyAgICAgICAgaWhpZ2ggPSBpbG93OworICAgICAgICBpbG93ID0gTlVMTDsKKyAgICB9CiAKLQkvKiBjb252ZXJ0IGloaWdoIGlmIG5lY2Vzc2FyeSAqLwotCWFzc2VydChpaGlnaCAhPSBOVUxMKTsKLQloaWdoID0gZ2V0X3JhbmdlX2xvbmdfYXJndW1lbnQoaWhpZ2gsICJlbmQiKTsKLQlpZiAoaGlnaCA9PSBOVUxMKQotCQlnb3RvIEZhaWw7CisgICAgLyogY29udmVydCBpaGlnaCBpZiBuZWNlc3NhcnkgKi8KKyAgICBhc3NlcnQoaWhpZ2ggIT0gTlVMTCk7CisgICAgaGlnaCA9IGdldF9yYW5nZV9sb25nX2FyZ3VtZW50KGloaWdoLCAiZW5kIik7CisgICAgaWYgKGhpZ2ggPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsOwogCi0JLyogaWhpZ2ggY29ycmVjdCBub3c7IGRvIGlsb3cgKi8KLQlpZiAoaWxvdyA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRih6ZXJvKTsKLQkJbG93ID0gemVybzsKLQl9Ci0JZWxzZSB7Ci0JCWxvdyA9IGdldF9yYW5nZV9sb25nX2FyZ3VtZW50KGlsb3csICJzdGFydCIpOwotCQlpZiAobG93ID09IE5VTEwpCi0JCQlnb3RvIEZhaWw7Ci0JfQorICAgIC8qIGloaWdoIGNvcnJlY3Qgbm93OyBkbyBpbG93ICovCisgICAgaWYgKGlsb3cgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoemVybyk7CisgICAgICAgIGxvdyA9IHplcm87CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsb3cgPSBnZXRfcmFuZ2VfbG9uZ19hcmd1bWVudChpbG93LCAic3RhcnQiKTsKKyAgICAgICAgaWYgKGxvdyA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgIH0KIAotCS8qIGlsb3cgYW5kIGloaWdoIGNvcnJlY3Qgbm93OyBkbyBpc3RlcCAqLwotCWlmIChpc3RlcCA9PSBOVUxMKQotCQlzdGVwID0gUHlMb25nX0Zyb21Mb25nKDEpOwotCWVsc2UKLQkJc3RlcCA9IGdldF9yYW5nZV9sb25nX2FyZ3VtZW50KGlzdGVwLCAic3RlcCIpOwotCWlmIChzdGVwID09IE5VTEwpCi0JCWdvdG8gRmFpbDsKKyAgICAvKiBpbG93IGFuZCBpaGlnaCBjb3JyZWN0IG5vdzsgZG8gaXN0ZXAgKi8KKyAgICBpZiAoaXN0ZXAgPT0gTlVMTCkKKyAgICAgICAgc3RlcCA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKKyAgICBlbHNlCisgICAgICAgIHN0ZXAgPSBnZXRfcmFuZ2VfbG9uZ19hcmd1bWVudChpc3RlcCwgInN0ZXAiKTsKKyAgICBpZiAoc3RlcCA9PSBOVUxMKQorICAgICAgICBnb3RvIEZhaWw7CiAKLQlpZiAoUHlPYmplY3RfQ21wKHN0ZXAsIHplcm8sICZjbXBfcmVzdWx0KSA9PSAtMSkKLQkJZ290byBGYWlsOworICAgIGlmIChQeU9iamVjdF9DbXAoc3RlcCwgemVybywgJmNtcF9yZXN1bHQpID09IC0xKQorICAgICAgICBnb3RvIEZhaWw7CiAKLQlpZiAoY21wX3Jlc3VsdCA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJyYW5nZSgpIHN0ZXAgYXJndW1lbnQgbXVzdCBub3QgYmUgemVybyIpOwotCQlnb3RvIEZhaWw7Ci0JfQorICAgIGlmIChjbXBfcmVzdWx0ID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2UoKSBzdGVwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHplcm8iKTsKKyAgICAgICAgZ290byBGYWlsOworICAgIH0KIAotCWlmIChjbXBfcmVzdWx0ID4gMCkKLQkJYmlnbiA9IGdldF9sZW5fb2ZfcmFuZ2VfbG9uZ3MobG93LCBoaWdoLCBzdGVwKTsKLQllbHNlIHsKLQkJUHlPYmplY3QgKm5lZ19zdGVwID0gUHlOdW1iZXJfTmVnYXRpdmUoc3RlcCk7Ci0JCWlmIChuZWdfc3RlcCA9PSBOVUxMKQotCQkJZ290byBGYWlsOwotCQliaWduID0gZ2V0X2xlbl9vZl9yYW5nZV9sb25ncyhoaWdoLCBsb3csIG5lZ19zdGVwKTsKLQkJUHlfREVDUkVGKG5lZ19zdGVwKTsKLQl9CisgICAgaWYgKGNtcF9yZXN1bHQgPiAwKQorICAgICAgICBiaWduID0gZ2V0X2xlbl9vZl9yYW5nZV9sb25ncyhsb3csIGhpZ2gsIHN0ZXApOworICAgIGVsc2UgeworICAgICAgICBQeU9iamVjdCAqbmVnX3N0ZXAgPSBQeU51bWJlcl9OZWdhdGl2ZShzdGVwKTsKKyAgICAgICAgaWYgKG5lZ19zdGVwID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIGJpZ24gPSBnZXRfbGVuX29mX3JhbmdlX2xvbmdzKGhpZ2gsIGxvdywgbmVnX3N0ZXApOworICAgICAgICBQeV9ERUNSRUYobmVnX3N0ZXApOworICAgIH0KIAotCW4gPSAoaW50KWJpZ247Ci0JaWYgKGJpZ24gPCAwIHx8IChsb25nKW4gIT0gYmlnbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkicmFuZ2UoKSByZXN1bHQgaGFzIHRvbyBtYW55IGl0ZW1zIik7Ci0JCWdvdG8gRmFpbDsKLQl9CisgICAgbiA9IChpbnQpYmlnbjsKKyAgICBpZiAoYmlnbiA8IDAgfHwgKGxvbmcpbiAhPSBiaWduKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlKCkgcmVzdWx0IGhhcyB0b28gbWFueSBpdGVtcyIpOworICAgICAgICBnb3RvIEZhaWw7CisgICAgfQogCi0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJZ290byBGYWlsOworICAgIHYgPSBQeUxpc3RfTmV3KG4pOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIGdvdG8gRmFpbDsKIAotCWN1cm51bSA9IGxvdzsKLQlQeV9JTkNSRUYoY3VybnVtKTsKKyAgICBjdXJudW0gPSBsb3c7CisgICAgUHlfSU5DUkVGKGN1cm51bSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gUHlOdW1iZXJfTG9uZyhjdXJudW0pOwotCQlQeU9iamVjdCAqdG1wX251bTsKLQkJaWYgKHcgPT0gTlVMTCkKLQkJCWdvdG8gRmFpbDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp3ID0gUHlOdW1iZXJfTG9uZyhjdXJudW0pOworICAgICAgICBQeU9iamVjdCAqdG1wX251bTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKIAotCQlQeUxpc3RfU0VUX0lURU0odiwgaSwgdyk7CisgICAgICAgIFB5TGlzdF9TRVRfSVRFTSh2LCBpLCB3KTsKIAotCQl0bXBfbnVtID0gUHlOdW1iZXJfQWRkKGN1cm51bSwgc3RlcCk7Ci0JCWlmICh0bXBfbnVtID09IE5VTEwpCi0JCQlnb3RvIEZhaWw7CisgICAgICAgIHRtcF9udW0gPSBQeU51bWJlcl9BZGQoY3VybnVtLCBzdGVwKTsKKyAgICAgICAgaWYgKHRtcF9udW0gPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKIAotCQlQeV9ERUNSRUYoY3VybnVtKTsKLQkJY3VybnVtID0gdG1wX251bTsKLQl9Ci0JUHlfREVDUkVGKGxvdyk7Ci0JUHlfREVDUkVGKGhpZ2gpOwotCVB5X0RFQ1JFRihzdGVwKTsKLQlQeV9ERUNSRUYoemVybyk7Ci0JUHlfREVDUkVGKGN1cm51bSk7Ci0JcmV0dXJuIHY7CisgICAgICAgIFB5X0RFQ1JFRihjdXJudW0pOworICAgICAgICBjdXJudW0gPSB0bXBfbnVtOworICAgIH0KKyAgICBQeV9ERUNSRUYobG93KTsKKyAgICBQeV9ERUNSRUYoaGlnaCk7CisgICAgUHlfREVDUkVGKHN0ZXApOworICAgIFB5X0RFQ1JFRih6ZXJvKTsKKyAgICBQeV9ERUNSRUYoY3VybnVtKTsKKyAgICByZXR1cm4gdjsKIAogICBGYWlsOgotCVB5X1hERUNSRUYobG93KTsKLQlQeV9YREVDUkVGKGhpZ2gpOwotCVB5X1hERUNSRUYoc3RlcCk7Ci0JUHlfREVDUkVGKHplcm8pOwotCVB5X1hERUNSRUYoY3VybnVtKTsKLQlQeV9YREVDUkVGKHYpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYobG93KTsKKyAgICBQeV9YREVDUkVGKGhpZ2gpOworICAgIFB5X1hERUNSRUYoc3RlcCk7CisgICAgUHlfREVDUkVGKHplcm8pOworICAgIFB5X1hERUNSRUYoY3VybnVtKTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBSZXR1cm4gbnVtYmVyIG9mIGl0ZW1zIGluIHJhbmdlL3hyYW5nZSAobG8sIGhpLCBzdGVwKS4gIHN0ZXAgPiAwCkBAIC0xOTE3LDgxICsxOTE3LDgxIEBACiBzdGF0aWMgbG9uZwogZ2V0X2xlbl9vZl9yYW5nZShsb25nIGxvLCBsb25nIGhpLCBsb25nIHN0ZXApCiB7Ci0JLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUlmIGxvID49IGhpLCB0aGUgcmFuZ2UgaXMgZW1wdHkuCi0JRWxzZSBpZiBuIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlLCB0aGUgbGFzdCBvbmUgaXMKLQlsbyArIChuLTEpKnN0ZXAsIHdoaWNoIG11c3QgYmUgPD0gaGktMS4gIFJlYXJyYW5naW5nLAotCW4gPD0gKGhpIC0gbG8gLSAxKS9zdGVwICsgMSwgc28gdGFraW5nIHRoZSBmbG9vciBvZiB0aGUgUkhTIGdpdmVzCi0JdGhlIHByb3BlciB2YWx1ZS4gIFNpbmNlIGxvIDwgaGkgaW4gdGhpcyBjYXNlLCBoaS1sby0xID49IDAsIHNvCi0JdGhlIFJIUyBpcyBub24tbmVnYXRpdmUgYW5kIHNvIHRydW5jYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlCi0JZmxvb3IuICBMZXR0aW5nIE0gYmUgdGhlIGxhcmdlc3QgcG9zaXRpdmUgbG9uZywgdGhlIHdvcnN0IGNhc2UKLQlmb3IgdGhlIFJIUyBudW1lcmF0b3IgaXMgaGk9TSwgbG89LU0tMSwgYW5kIHRoZW4KLQloaS1sby0xID0gTS0oLU0tMSktMSA9IDIqTS4gIFRoZXJlZm9yZSB1bnNpZ25lZCBsb25nIGhhcyBlbm91Z2gKLQlwcmVjaXNpb24gdG8gY29tcHV0ZSB0aGUgUkhTIGV4YWN0bHkuCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlsb25nIG4gPSAwOwotCWlmIChsbyA8IGhpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdWhpID0gKHVuc2lnbmVkIGxvbmcpaGk7Ci0JCXVuc2lnbmVkIGxvbmcgdWxvID0gKHVuc2lnbmVkIGxvbmcpbG87Ci0JCXVuc2lnbmVkIGxvbmcgZGlmZiA9IHVoaSAtIHVsbyAtIDE7Ci0JCW4gPSAobG9uZykoZGlmZiAvICh1bnNpZ25lZCBsb25nKXN0ZXAgKyAxKTsKLQl9Ci0JcmV0dXJuIG47CisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIElmIGxvID49IGhpLCB0aGUgcmFuZ2UgaXMgZW1wdHkuCisgICAgRWxzZSBpZiBuIHZhbHVlcyBhcmUgaW4gdGhlIHJhbmdlLCB0aGUgbGFzdCBvbmUgaXMKKyAgICBsbyArIChuLTEpKnN0ZXAsIHdoaWNoIG11c3QgYmUgPD0gaGktMS4gIFJlYXJyYW5naW5nLAorICAgIG4gPD0gKGhpIC0gbG8gLSAxKS9zdGVwICsgMSwgc28gdGFraW5nIHRoZSBmbG9vciBvZiB0aGUgUkhTIGdpdmVzCisgICAgdGhlIHByb3BlciB2YWx1ZS4gIFNpbmNlIGxvIDwgaGkgaW4gdGhpcyBjYXNlLCBoaS1sby0xID49IDAsIHNvCisgICAgdGhlIFJIUyBpcyBub24tbmVnYXRpdmUgYW5kIHNvIHRydW5jYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlCisgICAgZmxvb3IuICBMZXR0aW5nIE0gYmUgdGhlIGxhcmdlc3QgcG9zaXRpdmUgbG9uZywgdGhlIHdvcnN0IGNhc2UKKyAgICBmb3IgdGhlIFJIUyBudW1lcmF0b3IgaXMgaGk9TSwgbG89LU0tMSwgYW5kIHRoZW4KKyAgICBoaS1sby0xID0gTS0oLU0tMSktMSA9IDIqTS4gIFRoZXJlZm9yZSB1bnNpZ25lZCBsb25nIGhhcyBlbm91Z2gKKyAgICBwcmVjaXNpb24gdG8gY29tcHV0ZSB0aGUgUkhTIGV4YWN0bHkuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBsb25nIG4gPSAwOworICAgIGlmIChsbyA8IGhpKSB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdWhpID0gKHVuc2lnbmVkIGxvbmcpaGk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgdWxvID0gKHVuc2lnbmVkIGxvbmcpbG87CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZGlmZiA9IHVoaSAtIHVsbyAtIDE7CisgICAgICAgIG4gPSAobG9uZykoZGlmZiAvICh1bnNpZ25lZCBsb25nKXN0ZXAgKyAxKTsKKyAgICB9CisgICAgcmV0dXJuIG47CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3JhbmdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIGlsb3cgPSAwLCBpaGlnaCA9IDAsIGlzdGVwID0gMTsKLQlsb25nIGJpZ247Ci0JaW50IGksIG47CisgICAgbG9uZyBpbG93ID0gMCwgaWhpZ2ggPSAwLCBpc3RlcCA9IDE7CisgICAgbG9uZyBiaWduOworICAgIGludCBpLCBuOwogCi0JUHlPYmplY3QgKnY7CisgICAgUHlPYmplY3QgKnY7CiAKLQlpZiAoUHlUdXBsZV9TaXplKGFyZ3MpIDw9IDEpIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCi0JCQkJImw7cmFuZ2UoKSByZXF1aXJlcyAxLTMgaW50IGFyZ3VtZW50cyIsCi0JCQkJJmloaWdoKSkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiBoYW5kbGVfcmFuZ2VfbG9uZ3Moc2VsZiwgYXJncyk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAotCQkJCSJsbHxsO3JhbmdlKCkgcmVxdWlyZXMgMS0zIGludCBhcmd1bWVudHMiLAotCQkJCSZpbG93LCAmaWhpZ2gsICZpc3RlcCkpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlyZXR1cm4gaGFuZGxlX3JhbmdlX2xvbmdzKHNlbGYsIGFyZ3MpOwotCQl9Ci0JfQotCWlmIChpc3RlcCA9PSAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJyYW5nZSgpIHN0ZXAgYXJndW1lbnQgbXVzdCBub3QgYmUgemVybyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGlzdGVwID4gMCkKLQkJYmlnbiA9IGdldF9sZW5fb2ZfcmFuZ2UoaWxvdywgaWhpZ2gsIGlzdGVwKTsKLQllbHNlCi0JCWJpZ24gPSBnZXRfbGVuX29mX3JhbmdlKGloaWdoLCBpbG93LCAtaXN0ZXApOwotCW4gPSAoaW50KWJpZ247Ci0JaWYgKGJpZ24gPCAwIHx8IChsb25nKW4gIT0gYmlnbikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLQkJCQkicmFuZ2UoKSByZXN1bHQgaGFzIHRvbyBtYW55IGl0ZW1zIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl2ID0gUHlMaXN0X05ldyhuKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gUHlJbnRfRnJvbUxvbmcoaWxvdyk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TRVRfSVRFTSh2LCBpLCB3KTsKLQkJaWxvdyArPSBpc3RlcDsKLQl9Ci0JcmV0dXJuIHY7CisgICAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSA8PSAxKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgImw7cmFuZ2UoKSByZXF1aXJlcyAxLTMgaW50IGFyZ3VtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWhpZ2gpKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZV9yYW5nZV9sb25ncyhzZWxmLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAibGx8bDtyYW5nZSgpIHJlcXVpcmVzIDEtMyBpbnQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpbG93LCAmaWhpZ2gsICZpc3RlcCkpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlX3JhbmdlX2xvbmdzKHNlbGYsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpc3RlcCA9PSAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlKCkgc3RlcCBhcmd1bWVudCBtdXN0IG5vdCBiZSB6ZXJvIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoaXN0ZXAgPiAwKQorICAgICAgICBiaWduID0gZ2V0X2xlbl9vZl9yYW5nZShpbG93LCBpaGlnaCwgaXN0ZXApOworICAgIGVsc2UKKyAgICAgICAgYmlnbiA9IGdldF9sZW5fb2ZfcmFuZ2UoaWhpZ2gsIGlsb3csIC1pc3RlcCk7CisgICAgbiA9IChpbnQpYmlnbjsKKyAgICBpZiAoYmlnbiA8IDAgfHwgKGxvbmcpbiAhPSBiaWduKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlKCkgcmVzdWx0IGhhcyB0b28gbWFueSBpdGVtcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdiA9IFB5TGlzdF9OZXcobik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdyA9IFB5SW50X0Zyb21Mb25nKGlsb3cpOworICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU0VUX0lURU0odiwgaSwgdyk7CisgICAgICAgIGlsb3cgKz0gaXN0ZXA7CisgICAgfQorICAgIHJldHVybiB2OwogfQogCiBQeURvY19TVFJWQVIocmFuZ2VfZG9jLApAQCAtMjAwNyw3NSArMjAwNyw3NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fcmF3X2lucHV0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqdiA9IE5VTEw7Ci0JUHlPYmplY3QgKmZpbiA9IFB5U3lzX0dldE9iamVjdCgic3RkaW4iKTsKLQlQeU9iamVjdCAqZm91dCA9IFB5U3lzX0dldE9iamVjdCgic3Rkb3V0Iik7CisgICAgUHlPYmplY3QgKnYgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmaW4gPSBQeVN5c19HZXRPYmplY3QoInN0ZGluIik7CisgICAgUHlPYmplY3QgKmZvdXQgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOwogCi0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiW3Jhd19daW5wdXQiLCAwLCAxLCAmdikpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIltyYXdfXWlucHV0IiwgMCwgMSwgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChmaW4gPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiW3Jhd19daW5wdXQ6IGxvc3Qgc3lzLnN0ZGluIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZm91dCA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJbcmF3X11pbnB1dDogbG9zdCBzeXMuc3Rkb3V0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlGaWxlX1NvZnRTcGFjZShmb3V0LCAwKSkgewotCQlpZiAoUHlGaWxlX1dyaXRlU3RyaW5nKCIgIiwgZm91dCkgIT0gMCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlGaWxlX0FzRmlsZShmaW4pICYmIFB5RmlsZV9Bc0ZpbGUoZm91dCkKLSAgICAgICAgICAgICYmIGlzYXR0eShmaWxlbm8oUHlGaWxlX0FzRmlsZShmaW4pKSkKLSAgICAgICAgICAgICYmIGlzYXR0eShmaWxlbm8oUHlGaWxlX0FzRmlsZShmb3V0KSkpKSB7Ci0JCVB5T2JqZWN0ICpwbzsKLQkJY2hhciAqcHJvbXB0OwotCQljaGFyICpzOwotCQlQeU9iamVjdCAqcmVzdWx0OwotCQlpZiAodiAhPSBOVUxMKSB7Ci0JCQlwbyA9IFB5T2JqZWN0X1N0cih2KTsKLQkJCWlmIChwbyA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJcHJvbXB0ID0gUHlTdHJpbmdfQXNTdHJpbmcocG8pOwotCQkJaWYgKHByb21wdCA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWVsc2UgewotCQkJcG8gPSBOVUxMOwotCQkJcHJvbXB0ID0gIiI7Ci0JCX0KLQkJcyA9IFB5T1NfUmVhZGxpbmUoUHlGaWxlX0FzRmlsZShmaW4pLCBQeUZpbGVfQXNGaWxlKGZvdXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdCk7Ci0JCVB5X1hERUNSRUYocG8pOwotCQlpZiAocyA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19LZXlib2FyZEludGVycnVwdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoKnMgPT0gJ1wwJykgewotCQkJUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7Ci0JCQlyZXN1bHQgPSBOVUxMOwotCQl9Ci0JCWVsc2UgeyAvKiBzdHJpcCB0cmFpbGluZyAnXG4nICovCi0JCQlzaXplX3QgbGVuID0gc3RybGVuKHMpOwotCQkJaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJCQkiW3Jhd19daW5wdXQ6IGlucHV0IHRvbyBsb25nIik7Ci0JCQkJcmVzdWx0ID0gTlVMTDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbi0xKTsKLQkJCX0KLQkJfQotCQlQeU1lbV9GUkVFKHMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlpZiAodiAhPSBOVUxMKSB7Ci0JCWlmIChQeUZpbGVfV3JpdGVPYmplY3QodiwgZm91dCwgUHlfUFJJTlRfUkFXKSAhPSAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUZpbGVfR2V0TGluZShmaW4sIC0xKTsKKyAgICBpZiAoZmluID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIltyYXdfXWlucHV0OiBsb3N0IHN5cy5zdGRpbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGZvdXQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiW3Jhd19daW5wdXQ6IGxvc3Qgc3lzLnN0ZG91dCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5RmlsZV9Tb2Z0U3BhY2UoZm91dCwgMCkpIHsKKyAgICAgICAgaWYgKFB5RmlsZV9Xcml0ZVN0cmluZygiICIsIGZvdXQpICE9IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKFB5RmlsZV9Bc0ZpbGUoZmluKSAmJiBQeUZpbGVfQXNGaWxlKGZvdXQpCisgICAgICAgICYmIGlzYXR0eShmaWxlbm8oUHlGaWxlX0FzRmlsZShmaW4pKSkKKyAgICAgICAgJiYgaXNhdHR5KGZpbGVubyhQeUZpbGVfQXNGaWxlKGZvdXQpKSkpIHsKKyAgICAgICAgUHlPYmplY3QgKnBvOworICAgICAgICBjaGFyICpwcm9tcHQ7CisgICAgICAgIGNoYXIgKnM7CisgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBvID0gUHlPYmplY3RfU3RyKHYpOworICAgICAgICAgICAgaWYgKHBvID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBwcm9tcHQgPSBQeVN0cmluZ19Bc1N0cmluZyhwbyk7CisgICAgICAgICAgICBpZiAocHJvbXB0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwbyA9IE5VTEw7CisgICAgICAgICAgICBwcm9tcHQgPSAiIjsKKyAgICAgICAgfQorICAgICAgICBzID0gUHlPU19SZWFkbGluZShQeUZpbGVfQXNGaWxlKGZpbiksIFB5RmlsZV9Bc0ZpbGUoZm91dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdCk7CisgICAgICAgIFB5X1hERUNSRUYocG8pOworICAgICAgICBpZiAocyA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19LZXlib2FyZEludGVycnVwdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnMgPT0gJ1wwJykgeworICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19FT0ZFcnJvcik7CisgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvKiBzdHJpcCB0cmFpbGluZyAnXG4nICovCisgICAgICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKHMpOworICAgICAgICAgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbcmF3X11pbnB1dDogaW5wdXQgdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5TWVtX0ZSRUUocyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RmlsZV9Xcml0ZU9iamVjdCh2LCBmb3V0LCBQeV9QUklOVF9SQVcpICE9IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5RmlsZV9HZXRMaW5lKGZpbiwgLTEpOwogfQogCiBQeURvY19TVFJWQVIocmF3X2lucHV0X2RvYywKQEAgLTIwOTAsMjIgKzIwOTAsMjIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3JlZHVjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpmdW5jdG9vbHNfcmVkdWNlID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmZ1bmN0b29sc19yZWR1Y2UgPSBOVUxMOwogCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJyZWR1Y2UoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgotCQkJICAgInVzZSBmdW5jdG9vbHMucmVkdWNlKCkiLCAxKSA8IDApCi0JCXJldHVybiBOVUxMOworICAgIGlmIChQeUVycl9XYXJuUHkzaygicmVkdWNlKCkgbm90IHN1cHBvcnRlZCBpbiAzLng7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInVzZSBmdW5jdG9vbHMucmVkdWNlKCkiLCAxKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGZ1bmN0b29sc19yZWR1Y2UgPT0gTlVMTCkgewotCQlQeU9iamVjdCAqZnVuY3Rvb2xzID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJmdW5jdG9vbHMiKTsKLQkJaWYgKGZ1bmN0b29scyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZ1bmN0b29sc19yZWR1Y2UgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGZ1bmN0b29scywgInJlZHVjZSIpOwotCQlQeV9ERUNSRUYoZnVuY3Rvb2xzKTsKLQkJaWYgKGZ1bmN0b29sc19yZWR1Y2UgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlPYmplY3RfQ2FsbChmdW5jdG9vbHNfcmVkdWNlLCBhcmdzLCBOVUxMKTsKKyAgICBpZiAoZnVuY3Rvb2xzX3JlZHVjZSA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpmdW5jdG9vbHMgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoImZ1bmN0b29scyIpOworICAgICAgICBpZiAoZnVuY3Rvb2xzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZnVuY3Rvb2xzX3JlZHVjZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuY3Rvb2xzLCAicmVkdWNlIik7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jdG9vbHMpOworICAgICAgICBpZiAoZnVuY3Rvb2xzX3JlZHVjZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeU9iamVjdF9DYWxsKGZ1bmN0b29sc19yZWR1Y2UsIGFyZ3MsIE5VTEwpOwogfQogCiBQeURvY19TVFJWQVIocmVkdWNlX2RvYywKQEAgLTIxMjIsMTEgKzIxMjIsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3JlbG9hZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHJlbG9hZCgpIGlzIHJlbmFtZWQgdG8gaW1wLnJlbG9hZCgpIiwKLQkJCSAgIDEpIDwgMCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHJlbG9hZCgpIGlzIHJlbmFtZWQgdG8gaW1wLnJlbG9hZCgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHVybiBQeUltcG9ydF9SZWxvYWRNb2R1bGUodik7CisgICAgcmV0dXJuIFB5SW1wb3J0X1JlbG9hZE1vZHVsZSh2KTsKIH0KIAogUHlEb2NfU1RSVkFSKHJlbG9hZF9kb2MsCkBAIC0yMTM4LDcgKzIxMzgsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5fcmVwcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5T2JqZWN0X1JlcHIodik7CisgICAgcmV0dXJuIFB5T2JqZWN0X1JlcHIodik7CiB9CiAKIFB5RG9jX1NUUlZBUihyZXByX2RvYywKQEAgLTIxNTEsMzYgKzIxNTEsMzYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3JvdW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0JZG91YmxlIG51bWJlciwgYWJzX251bWJlciwgYWJzX3Jlc3VsdDsKLQlkb3VibGUgZjsKLQlpbnQgbmRpZ2l0cyA9IDA7Ci0JaW50IGk7Ci0Jc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJudW1iZXIiLCAibmRpZ2l0cyIsIDB9OworICAgIGRvdWJsZSBudW1iZXIsIGFic19udW1iZXIsIGFic19yZXN1bHQ7CisgICAgZG91YmxlIGY7CisgICAgaW50IG5kaWdpdHMgPSAwOworICAgIGludCBpOworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibnVtYmVyIiwgIm5kaWdpdHMiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJkfGk6cm91bmQiLAotCQlrd2xpc3QsICZudW1iZXIsICZuZGlnaXRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZiA9IDEuMDsKLQlpID0gYWJzKG5kaWdpdHMpOwotCXdoaWxlICAoLS1pID49IDApCi0JCWYgPSBmKjEwLjA7Ci0JaWYgKG5kaWdpdHMgPCAwKQotCQludW1iZXIgLz0gZjsKLQllbHNlCi0JCW51bWJlciAqPSBmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJkfGk6cm91bmQiLAorICAgICAgICBrd2xpc3QsICZudW1iZXIsICZuZGlnaXRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZiA9IDEuMDsKKyAgICBpID0gYWJzKG5kaWdpdHMpOworICAgIHdoaWxlICAoLS1pID49IDApCisgICAgICAgIGYgPSBmKjEwLjA7CisgICAgaWYgKG5kaWdpdHMgPCAwKQorICAgICAgICBudW1iZXIgLz0gZjsKKyAgICBlbHNlCisgICAgICAgIG51bWJlciAqPSBmOwogCi0JLyogcm91bmQgYG51bWJlcmAgdG8gbmVhcmVzdCBpbnRlZ2VyLCByb3VuZGluZyBoYWx2ZXMgYXdheSBmcm9tIHplcm8gKi8KLQlhYnNfbnVtYmVyID0gZmFicyhudW1iZXIpOwotCWFic19yZXN1bHQgPSBmbG9vcihhYnNfbnVtYmVyKTsKLQlpZiAoYWJzX251bWJlciAtIGFic19yZXN1bHQgPj0gMC41KQotCQlhYnNfcmVzdWx0ICs9IDEuMDsKLQludW1iZXIgPSBjb3B5c2lnbihhYnNfcmVzdWx0LCBudW1iZXIpOworICAgIC8qIHJvdW5kIGBudW1iZXJgIHRvIG5lYXJlc3QgaW50ZWdlciwgcm91bmRpbmcgaGFsdmVzIGF3YXkgZnJvbSB6ZXJvICovCisgICAgYWJzX251bWJlciA9IGZhYnMobnVtYmVyKTsKKyAgICBhYnNfcmVzdWx0ID0gZmxvb3IoYWJzX251bWJlcik7CisgICAgaWYgKGFic19udW1iZXIgLSBhYnNfcmVzdWx0ID49IDAuNSkKKyAgICAgICAgYWJzX3Jlc3VsdCArPSAxLjA7CisgICAgbnVtYmVyID0gY29weXNpZ24oYWJzX3Jlc3VsdCwgbnVtYmVyKTsKIAotCWlmIChuZGlnaXRzIDwgMCkKLQkJbnVtYmVyICo9IGY7Ci0JZWxzZQotCQludW1iZXIgLz0gZjsKLQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKG51bWJlcik7CisgICAgaWYgKG5kaWdpdHMgPCAwKQorICAgICAgICBudW1iZXIgKj0gZjsKKyAgICBlbHNlCisgICAgICAgIG51bWJlciAvPSBmOworICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUobnVtYmVyKTsKIH0KIAogUHlEb2NfU1RSVkFSKHJvdW5kX2RvYywKQEAgLTIxOTIsNDIgKzIxOTIsNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3NvcnRlZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotCVB5T2JqZWN0ICpuZXdsaXN0LCAqdiwgKnNlcSwgKmNvbXBhcmU9TlVMTCwgKmtleWZ1bmM9TlVMTCwgKm5ld2FyZ3M7Ci0JUHlPYmplY3QgKmNhbGxhYmxlOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsiaXRlcmFibGUiLCAiY21wIiwgImtleSIsICJyZXZlcnNlIiwgMH07Ci0JaW50IHJldmVyc2U7CisgICAgUHlPYmplY3QgKm5ld2xpc3QsICp2LCAqc2VxLCAqY29tcGFyZT1OVUxMLCAqa2V5ZnVuYz1OVUxMLCAqbmV3YXJnczsKKyAgICBQeU9iamVjdCAqY2FsbGFibGU7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJpdGVyYWJsZSIsICJjbXAiLCAia2V5IiwgInJldmVyc2UiLCAwfTsKKyAgICBpbnQgcmV2ZXJzZTsKIAotCS8qIGFyZ3MgMS00IHNob3VsZCBtYXRjaCBsaXN0c29ydCBpbiBPYmplY3RzL2xpc3RvYmplY3QuYyAqLwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE9PaTpzb3J0ZWQiLAotCQlrd2xpc3QsICZzZXEsICZjb21wYXJlLCAma2V5ZnVuYywgJnJldmVyc2UpKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBhcmdzIDEtNCBzaG91bGQgbWF0Y2ggbGlzdHNvcnQgaW4gT2JqZWN0cy9saXN0b2JqZWN0LmMgKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPT2k6c29ydGVkIiwKKyAgICAgICAga3dsaXN0LCAmc2VxLCAmY29tcGFyZSwgJmtleWZ1bmMsICZyZXZlcnNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQluZXdsaXN0ID0gUHlTZXF1ZW5jZV9MaXN0KHNlcSk7Ci0JaWYgKG5ld2xpc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgbmV3bGlzdCA9IFB5U2VxdWVuY2VfTGlzdChzZXEpOworICAgIGlmIChuZXdsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG5ld2xpc3QsICJzb3J0Iik7Ci0JaWYgKGNhbGxhYmxlID09IE5VTEwpIHsKLQkJUHlfREVDUkVGKG5ld2xpc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgY2FsbGFibGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG5ld2xpc3QsICJzb3J0Iik7CisgICAgaWYgKGNhbGxhYmxlID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2xpc3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQluZXdhcmdzID0gUHlUdXBsZV9HZXRTbGljZShhcmdzLCAxLCA0KTsKLQlpZiAobmV3YXJncyA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihuZXdsaXN0KTsKLQkJUHlfREVDUkVGKGNhbGxhYmxlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG5ld2FyZ3MgPSBQeVR1cGxlX0dldFNsaWNlKGFyZ3MsIDEsIDQpOworICAgIGlmIChuZXdhcmdzID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2xpc3QpOworICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl2ID0gUHlPYmplY3RfQ2FsbChjYWxsYWJsZSwgbmV3YXJncywga3dkcyk7Ci0JUHlfREVDUkVGKG5ld2FyZ3MpOwotCVB5X0RFQ1JFRihjYWxsYWJsZSk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobmV3bGlzdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIG5ld2xpc3Q7CisgICAgdiA9IFB5T2JqZWN0X0NhbGwoY2FsbGFibGUsIG5ld2FyZ3MsIGt3ZHMpOworICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2xpc3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiBuZXdsaXN0OwogfQogCiBQeURvY19TVFJWQVIoc29ydGVkX2RvYywKQEAgLTIyMzYsMzAgKzIyMzYsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX3ZhcnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp2ID0gTlVMTDsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqdiA9IE5VTEw7CisgICAgUHlPYmplY3QgKmQ7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ2YXJzIiwgMCwgMSwgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCWQgPSBQeUV2YWxfR2V0TG9jYWxzKCk7Ci0JCWlmIChkID09IE5VTEwpIHsKLQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCQkidmFycygpOiBubyBsb2NhbHMhPyIpOwotCQl9Ci0JCWVsc2UKLQkJCVB5X0lOQ1JFRihkKTsKLQl9Ci0JZWxzZSB7Ci0JCWQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsICJfX2RpY3RfXyIpOwotCQlpZiAoZCA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJ2YXJzKCkgYXJndW1lbnQgbXVzdCBoYXZlIF9fZGljdF9fIGF0dHJpYnV0ZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIGQ7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidmFycyIsIDAsIDEsICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBkID0gUHlFdmFsX0dldExvY2FscygpOworICAgICAgICBpZiAoZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFycygpOiBubyBsb2NhbHMhPyIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5X0lOQ1JFRihkKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsICJfX2RpY3RfXyIpOworICAgICAgICBpZiAoZCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJ2YXJzKCkgYXJndW1lbnQgbXVzdCBoYXZlIF9fZGljdF9fIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGQ7CiB9CiAKIFB5RG9jX1NUUlZBUih2YXJzX2RvYywKQEAgLTIyNzIsMTMxICsyMjcyLDEzMSBAQAogc3RhdGljIFB5T2JqZWN0KgogYnVpbHRpbl9zdW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpzZXE7Ci0JUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7Ci0JUHlPYmplY3QgKnRlbXAsICppdGVtLCAqaXRlcjsKKyAgICBQeU9iamVjdCAqc2VxOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0ZW1wLCAqaXRlbSwgKml0ZXI7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdW0iLCAxLCAyLCAmc2VxLCAmcmVzdWx0KSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3VtIiwgMSwgMiwgJnNlcSwgJnJlc3VsdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2VxKTsKLQlpZiAoaXRlciA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpdGVyID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOworICAgIGlmIChpdGVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCXJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKDApOwotCQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihpdGVyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogcmVqZWN0IHN0cmluZyB2YWx1ZXMgZm9yICdzdGFydCcgcGFyYW1ldGVyICovCi0JCWlmIChQeU9iamVjdF9UeXBlQ2hlY2socmVzdWx0LCAmUHlCYXNlU3RyaW5nX1R5cGUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJzdW0oKSBjYW4ndCBzdW0gc3RyaW5ncyBbdXNlICcnLmpvaW4oc2VxKSBpbnN0ZWFkXSIpOwotCQkJUHlfREVDUkVGKGl0ZXIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKHJlc3VsdCk7Ci0JfQorICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZygwKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHJlamVjdCBzdHJpbmcgdmFsdWVzIGZvciAnc3RhcnQnIHBhcmFtZXRlciAqLworICAgICAgICBpZiAoUHlPYmplY3RfVHlwZUNoZWNrKHJlc3VsdCwgJlB5QmFzZVN0cmluZ19UeXBlKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAic3VtKCkgY2FuJ3Qgc3VtIHN0cmluZ3MgW3VzZSAnJy5qb2luKHNlcSkgaW5zdGVhZF0iKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgIH0KIAogI2lmbmRlZiBTTE9XX1NVTQotCS8qIEZhc3QgYWRkaXRpb24gYnkga2VlcGluZyB0ZW1wb3Jhcnkgc3VtcyBpbiBDIGluc3RlYWQgb2YgbmV3IFB5dGhvbiBvYmplY3RzLgotICAgICAgICAgICBBc3N1bWVzIGFsbCBpbnB1dHMgYXJlIHRoZSBzYW1lIHR5cGUuICBJZiB0aGUgYXNzdW1wdGlvbiBmYWlscywgZGVmYXVsdAotICAgICAgICAgICB0byB0aGUgbW9yZSBnZW5lcmFsIHJvdXRpbmUuCi0JKi8KLQlpZiAoUHlJbnRfQ2hlY2tFeGFjdChyZXN1bHQpKSB7Ci0JCWxvbmcgaV9yZXN1bHQgPSBQeUludF9BU19MT05HKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBOVUxMOwotCQl3aGlsZShyZXN1bHQgPT0gTlVMTCkgewotCQkJaXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVyKTsKLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0gICAgCQkJCXJldHVybiBQeUludF9Gcm9tTG9uZyhpX3Jlc3VsdCk7Ci0JCQl9Ci0gICAgICAgIAkJaWYgKFB5SW50X0NoZWNrRXhhY3QoaXRlbSkpIHsKLSAgICAgICAgICAgIAkJCWxvbmcgYiA9IFB5SW50X0FTX0xPTkcoaXRlbSk7Ci0JCQkJbG9uZyB4ID0gaV9yZXN1bHQgKyBiOwotCQkJCWlmICgoeF5pX3Jlc3VsdCkgPj0gMCB8fCAoeF5iKSA+PSAwKSB7Ci0JCQkJCWlfcmVzdWx0ID0geDsKLQkJCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvKiBFaXRoZXIgb3ZlcmZsb3dlZCBvciBpcyBub3QgYW4gaW50LiBSZXN0b3JlIHJlYWwgb2JqZWN0cyBhbmQgcHJvY2VzcyBub3JtYWxseSAqLwotCQkJcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoaV9yZXN1bHQpOwotCQkJdGVtcCA9IFB5TnVtYmVyX0FkZChyZXN1bHQsIGl0ZW0pOwotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlyZXN1bHQgPSB0ZW1wOwotCQkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZXIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQorICAgIC8qIEZhc3QgYWRkaXRpb24gYnkga2VlcGluZyB0ZW1wb3Jhcnkgc3VtcyBpbiBDIGluc3RlYWQgb2YgbmV3IFB5dGhvbiBvYmplY3RzLgorICAgICAgIEFzc3VtZXMgYWxsIGlucHV0cyBhcmUgdGhlIHNhbWUgdHlwZS4gIElmIHRoZSBhc3N1bXB0aW9uIGZhaWxzLCBkZWZhdWx0CisgICAgICAgdG8gdGhlIG1vcmUgZ2VuZXJhbCByb3V0aW5lLgorICAgICovCisgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QocmVzdWx0KSkgeworICAgICAgICBsb25nIGlfcmVzdWx0ID0gUHlJbnRfQVNfTE9ORyhyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgd2hpbGUocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpX3Jlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChpdGVtKSkgeworICAgICAgICAgICAgICAgIGxvbmcgYiA9IFB5SW50X0FTX0xPTkcoaXRlbSk7CisgICAgICAgICAgICAgICAgbG9uZyB4ID0gaV9yZXN1bHQgKyBiOworICAgICAgICAgICAgICAgIGlmICgoeF5pX3Jlc3VsdCkgPj0gMCB8fCAoeF5iKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlfcmVzdWx0ID0geDsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBFaXRoZXIgb3ZlcmZsb3dlZCBvciBpcyBub3QgYW4gaW50LiBSZXN0b3JlIHJlYWwgb2JqZWN0cyBhbmQgcHJvY2VzcyBub3JtYWxseSAqLworICAgICAgICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoaV9yZXN1bHQpOworICAgICAgICAgICAgdGVtcCA9IFB5TnVtYmVyX0FkZChyZXN1bHQsIGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICByZXN1bHQgPSB0ZW1wOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChyZXN1bHQpKSB7Ci0JCWRvdWJsZSBmX3Jlc3VsdCA9IFB5RmxvYXRfQVNfRE9VQkxFKHJlc3VsdCk7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCQlyZXN1bHQgPSBOVUxMOwotCQl3aGlsZShyZXN1bHQgPT0gTlVMTCkgewotCQkJaXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXIpOwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVyKTsKLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0gICAgCQkJCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZl9yZXN1bHQpOwotCQkJfQotICAgICAgICAJCWlmIChQeUZsb2F0X0NoZWNrRXhhY3QoaXRlbSkpIHsKLQkJCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJhZGQiLCBQeV9ERUNSRUYoaXRlbSk7IFB5X0RFQ1JFRihpdGVyKTsgcmV0dXJuIDApCi0JCQkJZl9yZXN1bHQgKz0gUHlGbG9hdF9BU19ET1VCTEUoaXRlbSk7Ci0JCQkJUHlGUEVfRU5EX1BST1RFQ1QoZl9yZXN1bHQpCi0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWNvbnRpbnVlOwotCQkJfQotICAgICAgICAJCWlmIChQeUludF9DaGVja0V4YWN0KGl0ZW0pKSB7Ci0JCQkJUHlGUEVfU1RBUlRfUFJPVEVDVCgiYWRkIiwgUHlfREVDUkVGKGl0ZW0pOyBQeV9ERUNSRUYoaXRlcik7IHJldHVybiAwKQotCQkJCWZfcmVzdWx0ICs9IChkb3VibGUpUHlJbnRfQVNfTE9ORyhpdGVtKTsKLQkJCQlQeUZQRV9FTkRfUFJPVEVDVChmX3Jlc3VsdCkKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUoZl9yZXN1bHQpOwotCQkJdGVtcCA9IFB5TnVtYmVyX0FkZChyZXN1bHQsIGl0ZW0pOwotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlyZXN1bHQgPSB0ZW1wOwotCQkJaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZXIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQl9Ci0JfQorICAgIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QocmVzdWx0KSkgeworICAgICAgICBkb3VibGUgZl9yZXN1bHQgPSBQeUZsb2F0X0FTX0RPVUJMRShyZXN1bHQpOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgd2hpbGUocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcik7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZl9yZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChpdGVtKSkgeworICAgICAgICAgICAgICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImFkZCIsIFB5X0RFQ1JFRihpdGVtKTsgUHlfREVDUkVGKGl0ZXIpOyByZXR1cm4gMCkKKyAgICAgICAgICAgICAgICBmX3Jlc3VsdCArPSBQeUZsb2F0X0FTX0RPVUJMRShpdGVtKTsKKyAgICAgICAgICAgICAgICBQeUZQRV9FTkRfUFJPVEVDVChmX3Jlc3VsdCkKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChpdGVtKSkgeworICAgICAgICAgICAgICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImFkZCIsIFB5X0RFQ1JFRihpdGVtKTsgUHlfREVDUkVGKGl0ZXIpOyByZXR1cm4gMCkKKyAgICAgICAgICAgICAgICBmX3Jlc3VsdCArPSAoZG91YmxlKVB5SW50X0FTX0xPTkcoaXRlbSk7CisgICAgICAgICAgICAgICAgUHlGUEVfRU5EX1BST1RFQ1QoZl9yZXN1bHQpCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKGZfcmVzdWx0KTsKKyAgICAgICAgICAgIHRlbXAgPSBQeU51bWJlcl9BZGQocmVzdWx0LCBpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgcmVzdWx0ID0gdGVtcDsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KICNlbmRpZgogCi0JZm9yKDs7KSB7Ci0JCWl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKLQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJLyogZXJyb3IsIG9yIGVuZC1vZi1zZXF1ZW5jZSAqLwotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJCQlyZXN1bHQgPSBOVUxMOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJdGVtcCA9IFB5TnVtYmVyX0FkZChyZXN1bHQsIGl0ZW0pOwotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJUHlfREVDUkVGKGl0ZW0pOwotCQlyZXN1bHQgPSB0ZW1wOwotCQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCQlicmVhazsKLQl9Ci0JUHlfREVDUkVGKGl0ZXIpOwotCXJldHVybiByZXN1bHQ7CisgICAgZm9yKDs7KSB7CisgICAgICAgIGl0ZW0gPSBQeUl0ZXJfTmV4dChpdGVyKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgLyogZXJyb3IsIG9yIGVuZC1vZi1zZXF1ZW5jZSAqLworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGVtcCA9IFB5TnVtYmVyX0FkZChyZXN1bHQsIGl0ZW0pOworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICByZXN1bHQgPSB0ZW1wOworICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgUHlfREVDUkVGKGl0ZXIpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihzdW1fZG9jLApAQCAtMjQxMCwxNyArMjQxMCwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGJ1aWx0aW5faXNpbnN0YW5jZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmluc3Q7Ci0JUHlPYmplY3QgKmNsczsKLQlpbnQgcmV0dmFsOworICAgIFB5T2JqZWN0ICppbnN0OworICAgIFB5T2JqZWN0ICpjbHM7CisgICAgaW50IHJldHZhbDsKIAotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlzaW5zdGFuY2UiLCAyLCAyLCAmaW5zdCwgJmNscykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlzaW5zdGFuY2UiLCAyLCAyLCAmaW5zdCwgJmNscykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dmFsID0gUHlPYmplY3RfSXNJbnN0YW5jZShpbnN0LCBjbHMpOwotCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJldHZhbCk7CisgICAgcmV0dmFsID0gUHlPYmplY3RfSXNJbnN0YW5jZShpbnN0LCBjbHMpOworICAgIGlmIChyZXR2YWwgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJldHZhbCk7CiB9CiAKIFB5RG9jX1NUUlZBUihpc2luc3RhbmNlX2RvYywKQEAgLTI0MzUsMTcgKzI0MzUsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsdGluX2lzc3ViY2xhc3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpkZXJpdmVkOwotCVB5T2JqZWN0ICpjbHM7Ci0JaW50IHJldHZhbDsKKyAgICBQeU9iamVjdCAqZGVyaXZlZDsKKyAgICBQeU9iamVjdCAqY2xzOworICAgIGludCByZXR2YWw7CiAKLQlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpc3N1YmNsYXNzIiwgMiwgMiwgJmRlcml2ZWQsICZjbHMpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpc3N1YmNsYXNzIiwgMiwgMiwgJmRlcml2ZWQsICZjbHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXJldHZhbCA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXR2YWwpOworICAgIHJldHZhbCA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoZGVyaXZlZCwgY2xzKTsKKyAgICBpZiAocmV0dmFsIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXR2YWwpOwogfQogCiBQeURvY19TVFJWQVIoaXNzdWJjbGFzc19kb2MsCkBAIC0yNDU5LDEwMiArMjQ1OSwxMDIgQEAKIHN0YXRpYyBQeU9iamVjdCoKIGJ1aWx0aW5femlwKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeU9iamVjdCAqcmV0OwotCWNvbnN0IFB5X3NzaXplX3QgaXRlbXNpemUgPSBQeVNlcXVlbmNlX0xlbmd0aChhcmdzKTsKLQlQeV9zc2l6ZV90IGk7Ci0JUHlPYmplY3QgKml0bGlzdDsgIC8qIHR1cGxlIG9mIGl0ZXJhdG9ycyAqLwotCVB5X3NzaXplX3QgbGVuOwkgICAvKiBndWVzcyBhdCByZXN1bHQgbGVuZ3RoICovCisgICAgUHlPYmplY3QgKnJldDsKKyAgICBjb25zdCBQeV9zc2l6ZV90IGl0ZW1zaXplID0gUHlTZXF1ZW5jZV9MZW5ndGgoYXJncyk7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5T2JqZWN0ICppdGxpc3Q7ICAvKiB0dXBsZSBvZiBpdGVyYXRvcnMgKi8KKyAgICBQeV9zc2l6ZV90IGxlbjsgICAgICAgIC8qIGd1ZXNzIGF0IHJlc3VsdCBsZW5ndGggKi8KIAotCWlmIChpdGVtc2l6ZSA9PSAwKQotCQlyZXR1cm4gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoaXRlbXNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5TGlzdF9OZXcoMCk7CiAKLQkvKiBhcmdzIG11c3QgYmUgYSB0dXBsZSAqLwotCWFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICAvKiBhcmdzIG11c3QgYmUgYSB0dXBsZSAqLworICAgIGFzc2VydChQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKIAotCS8qIEd1ZXNzIGF0IHJlc3VsdCBsZW5ndGg6ICB0aGUgc2hvcnRlc3Qgb2YgdGhlIGlucHV0IGxlbmd0aHMuCi0JICAgSWYgc29tZSBhcmd1bWVudCByZWZ1c2VzIHRvIHNheSwgd2UgcmVmdXNlIHRvIGd1ZXNzIHRvbywgbGVzdAotCSAgIGFuIGFyZ3VtZW50IGxpa2UgeHJhbmdlKHN5cy5tYXhpbnQpIGxlYWQgdXMgYXN0cmF5LiovCi0JbGVuID0gLTE7CS8qIHVua25vd24gKi8KLQlmb3IgKGkgPSAwOyBpIDwgaXRlbXNpemU7ICsraSkgewotCQlQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCVB5X3NzaXplX3QgdGhpc2xlbiA9IF9QeU9iamVjdF9MZW5ndGhIaW50KGl0ZW0sIC0xKTsKLQkJaWYgKHRoaXNsZW4gPCAwKSB7Ci0JCQlsZW4gPSAtMTsKLQkJCWJyZWFrOwotCQl9Ci0JCWVsc2UgaWYgKGxlbiA8IDAgfHwgdGhpc2xlbiA8IGxlbikKLQkJCWxlbiA9IHRoaXNsZW47Ci0JfQorICAgIC8qIEd1ZXNzIGF0IHJlc3VsdCBsZW5ndGg6ICB0aGUgc2hvcnRlc3Qgb2YgdGhlIGlucHV0IGxlbmd0aHMuCisgICAgICAgSWYgc29tZSBhcmd1bWVudCByZWZ1c2VzIHRvIHNheSwgd2UgcmVmdXNlIHRvIGd1ZXNzIHRvbywgbGVzdAorICAgICAgIGFuIGFyZ3VtZW50IGxpa2UgeHJhbmdlKHN5cy5tYXhpbnQpIGxlYWQgdXMgYXN0cmF5LiovCisgICAgbGVuID0gLTE7ICAgICAgICAgICAvKiB1bmtub3duICovCisgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1zaXplOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgICAgICBQeV9zc2l6ZV90IHRoaXNsZW4gPSBfUHlPYmplY3RfTGVuZ3RoSGludChpdGVtLCAtMSk7CisgICAgICAgIGlmICh0aGlzbGVuIDwgMCkgeworICAgICAgICAgICAgbGVuID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsZW4gPCAwIHx8IHRoaXNsZW4gPCBsZW4pCisgICAgICAgICAgICBsZW4gPSB0aGlzbGVuOworICAgIH0KIAotCS8qIGFsbG9jYXRlIHJlc3VsdCBsaXN0ICovCi0JaWYgKGxlbiA8IDApCi0JCWxlbiA9IDEwOwkvKiBhcmJpdHJhcnkgKi8KLQlpZiAoKHJldCA9IFB5TGlzdF9OZXcobGVuKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogYWxsb2NhdGUgcmVzdWx0IGxpc3QgKi8KKyAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgbGVuID0gMTA7ICAgICAgICAgICAgICAgLyogYXJiaXRyYXJ5ICovCisgICAgaWYgKChyZXQgPSBQeUxpc3RfTmV3KGxlbikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogb2J0YWluIGl0ZXJhdG9ycyAqLwotCWl0bGlzdCA9IFB5VHVwbGVfTmV3KGl0ZW1zaXplKTsKLQlpZiAoaXRsaXN0ID09IE5VTEwpCi0JCWdvdG8gRmFpbF9yZXQ7Ci0JZm9yIChpID0gMDsgaSA8IGl0ZW1zaXplOyArK2kpIHsKLQkJUHlPYmplY3QgKml0ZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCQlQeU9iamVjdCAqaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZW0pOwotCQlpZiAoaXQgPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCSAgICAiemlwIGFyZ3VtZW50ICMlemQgbXVzdCBzdXBwb3J0IGl0ZXJhdGlvbiIsCi0JCQkJICAgIGkrMSk7Ci0JCQlnb3RvIEZhaWxfcmV0X2l0bGlzdDsKLQkJfQotCQlQeVR1cGxlX1NFVF9JVEVNKGl0bGlzdCwgaSwgaXQpOwotCX0KKyAgICAvKiBvYnRhaW4gaXRlcmF0b3JzICovCisgICAgaXRsaXN0ID0gUHlUdXBsZV9OZXcoaXRlbXNpemUpOworICAgIGlmIChpdGxpc3QgPT0gTlVMTCkKKyAgICAgICAgZ290byBGYWlsX3JldDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXNpemU7ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlbSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJ6aXAgYXJndW1lbnQgIyV6ZCBtdXN0IHN1cHBvcnQgaXRlcmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgaSsxKTsKKyAgICAgICAgICAgIGdvdG8gRmFpbF9yZXRfaXRsaXN0OworICAgICAgICB9CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oaXRsaXN0LCBpLCBpdCk7CisgICAgfQogCi0JLyogYnVpbGQgcmVzdWx0IGludG8gcmV0IGxpc3QgKi8KLQlmb3IgKGkgPSAwOyA7ICsraSkgewotCQlpbnQgajsKLQkJUHlPYmplY3QgKm5leHQgPSBQeVR1cGxlX05ldyhpdGVtc2l6ZSk7Ci0JCWlmICghbmV4dCkKLQkJCWdvdG8gRmFpbF9yZXRfaXRsaXN0OworICAgIC8qIGJ1aWxkIHJlc3VsdCBpbnRvIHJldCBsaXN0ICovCisgICAgZm9yIChpID0gMDsgOyArK2kpIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIFB5T2JqZWN0ICpuZXh0ID0gUHlUdXBsZV9OZXcoaXRlbXNpemUpOworICAgICAgICBpZiAoIW5leHQpCisgICAgICAgICAgICBnb3RvIEZhaWxfcmV0X2l0bGlzdDsKIAotCQlmb3IgKGogPSAwOyBqIDwgaXRlbXNpemU7IGorKykgewotCQkJUHlPYmplY3QgKml0ID0gUHlUdXBsZV9HRVRfSVRFTShpdGxpc3QsIGopOwotCQkJUHlPYmplY3QgKml0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7Ci0JCQlpZiAoIWl0ZW0pIHsKLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCQlQeV9ERUNSRUYocmV0KTsKLQkJCQkJcmV0ID0gTlVMTDsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKG5leHQpOwotCQkJCVB5X0RFQ1JFRihpdGxpc3QpOwotCQkJCWdvdG8gRG9uZTsKLQkJCX0KLQkJCVB5VHVwbGVfU0VUX0lURU0obmV4dCwgaiwgaXRlbSk7Ci0JCX0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGl0ZW1zaXplOyBqKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5VHVwbGVfR0VUX0lURU0oaXRsaXN0LCBqKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICAgICAgaWYgKCFpdGVtKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRsaXN0KTsKKyAgICAgICAgICAgICAgICBnb3RvIERvbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5leHQsIGosIGl0ZW0pOworICAgICAgICB9CiAKLQkJaWYgKGkgPCBsZW4pCi0JCQlQeUxpc3RfU0VUX0lURU0ocmV0LCBpLCBuZXh0KTsKLQkJZWxzZSB7Ci0JCQlpbnQgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChyZXQsIG5leHQpOwotCQkJUHlfREVDUkVGKG5leHQpOwotCQkJKytsZW47Ci0JCQlpZiAoc3RhdHVzIDwgMCkKLQkJCQlnb3RvIEZhaWxfcmV0X2l0bGlzdDsKLQkJfQotCX0KKyAgICAgICAgaWYgKGkgPCBsZW4pCisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0ocmV0LCBpLCBuZXh0KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gUHlMaXN0X0FwcGVuZChyZXQsIG5leHQpOworICAgICAgICAgICAgUHlfREVDUkVGKG5leHQpOworICAgICAgICAgICAgKytsZW47CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfcmV0X2l0bGlzdDsKKyAgICAgICAgfQorICAgIH0KIAogRG9uZToKLQlpZiAocmV0ICE9IE5VTEwgJiYgaSA8IGxlbikgewotCQkvKiBUaGUgbGlzdCBpcyB0b28gYmlnLiAqLwotCQlpZiAoUHlMaXN0X1NldFNsaWNlKHJldCwgaSwgbGVuLCBOVUxMKSA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJldDsKKyAgICBpZiAocmV0ICE9IE5VTEwgJiYgaSA8IGxlbikgeworICAgICAgICAvKiBUaGUgbGlzdCBpcyB0b28gYmlnLiAqLworICAgICAgICBpZiAoUHlMaXN0X1NldFNsaWNlKHJldCwgaSwgbGVuLCBOVUxMKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKIAogRmFpbF9yZXRfaXRsaXN0OgotCVB5X0RFQ1JFRihpdGxpc3QpOworICAgIFB5X0RFQ1JFRihpdGxpc3QpOwogRmFpbF9yZXQ6Ci0JUHlfREVDUkVGKHJldCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfREVDUkVGKHJldCk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtMjU2Nyw2MSArMjU2Nyw2MSBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBidWlsdGluX21ldGhvZHNbXSA9IHsKLSAJeyJfX2ltcG9ydF9fIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fX19pbXBvcnRfXywgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgaW1wb3J0X2RvY30sCi0gCXsiYWJzIiwJCWJ1aWx0aW5fYWJzLCAgICAgICAgTUVUSF9PLCBhYnNfZG9jfSwKLSAJeyJhbGwiLAkJYnVpbHRpbl9hbGwsICAgICAgICBNRVRIX08sIGFsbF9kb2N9LAotIAl7ImFueSIsCQlidWlsdGluX2FueSwgICAgICAgIE1FVEhfTywgYW55X2RvY30sCi0gCXsiYXBwbHkiLAlidWlsdGluX2FwcGx5LCAgICAgIE1FVEhfVkFSQVJHUywgYXBwbHlfZG9jfSwKLQl7ImJpbiIsCQlidWlsdGluX2JpbiwJICAgIE1FVEhfTywgYmluX2RvY30sCi0gCXsiY2FsbGFibGUiLAlidWlsdGluX2NhbGxhYmxlLCAgIE1FVEhfTywgY2FsbGFibGVfZG9jfSwKLSAJeyJjaHIiLAkJYnVpbHRpbl9jaHIsICAgICAgICBNRVRIX1ZBUkFSR1MsIGNocl9kb2N9LAotIAl7ImNtcCIsCQlidWlsdGluX2NtcCwgICAgICAgIE1FVEhfVkFSQVJHUywgY21wX2RvY30sCi0gCXsiY29lcmNlIiwJYnVpbHRpbl9jb2VyY2UsICAgICBNRVRIX1ZBUkFSR1MsIGNvZXJjZV9kb2N9LAotIAl7ImNvbXBpbGUiLAkoUHlDRnVuY3Rpb24pYnVpbHRpbl9jb21waWxlLCAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBjb21waWxlX2RvY30sCi0gCXsiZGVsYXR0ciIsCWJ1aWx0aW5fZGVsYXR0ciwgICAgTUVUSF9WQVJBUkdTLCBkZWxhdHRyX2RvY30sCi0gCXsiZGlyIiwJCWJ1aWx0aW5fZGlyLCAgICAgICAgTUVUSF9WQVJBUkdTLCBkaXJfZG9jfSwKLSAJeyJkaXZtb2QiLAlidWlsdGluX2Rpdm1vZCwgICAgIE1FVEhfVkFSQVJHUywgZGl2bW9kX2RvY30sCi0gCXsiZXZhbCIsCWJ1aWx0aW5fZXZhbCwgICAgICAgTUVUSF9WQVJBUkdTLCBldmFsX2RvY30sCi0gCXsiZXhlY2ZpbGUiLAlidWlsdGluX2V4ZWNmaWxlLCAgIE1FVEhfVkFSQVJHUywgZXhlY2ZpbGVfZG9jfSwKLSAJeyJmaWx0ZXIiLAlidWlsdGluX2ZpbHRlciwgICAgIE1FVEhfVkFSQVJHUywgZmlsdGVyX2RvY30sCi0gCXsiZm9ybWF0IiwJYnVpbHRpbl9mb3JtYXQsICAgICBNRVRIX1ZBUkFSR1MsIGZvcm1hdF9kb2N9LAotIAl7ImdldGF0dHIiLAlidWlsdGluX2dldGF0dHIsICAgIE1FVEhfVkFSQVJHUywgZ2V0YXR0cl9kb2N9LAotIAl7Imdsb2JhbHMiLAkoUHlDRnVuY3Rpb24pYnVpbHRpbl9nbG9iYWxzLCAgICBNRVRIX05PQVJHUywgZ2xvYmFsc19kb2N9LAotIAl7Imhhc2F0dHIiLAlidWlsdGluX2hhc2F0dHIsICAgIE1FVEhfVkFSQVJHUywgaGFzYXR0cl9kb2N9LAotIAl7Imhhc2giLAlidWlsdGluX2hhc2gsICAgICAgIE1FVEhfTywgaGFzaF9kb2N9LAotIAl7ImhleCIsCQlidWlsdGluX2hleCwgICAgICAgIE1FVEhfTywgaGV4X2RvY30sCi0gCXsiaWQiLAkJYnVpbHRpbl9pZCwgICAgICAgICBNRVRIX08sIGlkX2RvY30sCi0gCXsiaW5wdXQiLAlidWlsdGluX2lucHV0LCAgICAgIE1FVEhfVkFSQVJHUywgaW5wdXRfZG9jfSwKLSAJeyJpbnRlcm4iLAlidWlsdGluX2ludGVybiwgICAgIE1FVEhfVkFSQVJHUywgaW50ZXJuX2RvY30sCi0gCXsiaXNpbnN0YW5jZSIsICBidWlsdGluX2lzaW5zdGFuY2UsIE1FVEhfVkFSQVJHUywgaXNpbnN0YW5jZV9kb2N9LAotIAl7Imlzc3ViY2xhc3MiLCAgYnVpbHRpbl9pc3N1YmNsYXNzLCBNRVRIX1ZBUkFSR1MsIGlzc3ViY2xhc3NfZG9jfSwKLSAJeyJpdGVyIiwJYnVpbHRpbl9pdGVyLCAgICAgICBNRVRIX1ZBUkFSR1MsIGl0ZXJfZG9jfSwKLSAJeyJsZW4iLAkJYnVpbHRpbl9sZW4sICAgICAgICBNRVRIX08sIGxlbl9kb2N9LAotIAl7ImxvY2FscyIsCShQeUNGdW5jdGlvbilidWlsdGluX2xvY2FscywgICAgIE1FVEhfTk9BUkdTLCBsb2NhbHNfZG9jfSwKLSAJeyJtYXAiLAkJYnVpbHRpbl9tYXAsICAgICAgICBNRVRIX1ZBUkFSR1MsIG1hcF9kb2N9LAotIAl7Im1heCIsCQkoUHlDRnVuY3Rpb24pYnVpbHRpbl9tYXgsICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBtYXhfZG9jfSwKLSAJeyJtaW4iLAkJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fbWluLCAgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgbWluX2RvY30sCi0JeyJuZXh0IiwgCWJ1aWx0aW5fbmV4dCwgICAgICAgTUVUSF9WQVJBUkdTLCBuZXh0X2RvY30sCi0gCXsib2N0IiwJCWJ1aWx0aW5fb2N0LCAgICAgICAgTUVUSF9PLCBvY3RfZG9jfSwKLSAJeyJvcGVuIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fb3BlbiwgICAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgb3Blbl9kb2N9LAotIAl7Im9yZCIsCQlidWlsdGluX29yZCwgICAgICAgIE1FVEhfTywgb3JkX2RvY30sCi0gCXsicG93IiwJCWJ1aWx0aW5fcG93LCAgICAgICAgTUVUSF9WQVJBUkdTLCBwb3dfZG9jfSwKLSAJeyJwcmludCIsCShQeUNGdW5jdGlvbilidWlsdGluX3ByaW50LCAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHByaW50X2RvY30sCi0gCXsicmFuZ2UiLAlidWlsdGluX3JhbmdlLCAgICAgIE1FVEhfVkFSQVJHUywgcmFuZ2VfZG9jfSwKLSAJeyJyYXdfaW5wdXQiLAlidWlsdGluX3Jhd19pbnB1dCwgIE1FVEhfVkFSQVJHUywgcmF3X2lucHV0X2RvY30sCi0gCXsicmVkdWNlIiwJYnVpbHRpbl9yZWR1Y2UsICAgICBNRVRIX1ZBUkFSR1MsIHJlZHVjZV9kb2N9LAotIAl7InJlbG9hZCIsCWJ1aWx0aW5fcmVsb2FkLCAgICAgTUVUSF9PLCByZWxvYWRfZG9jfSwKLSAJeyJyZXByIiwJYnVpbHRpbl9yZXByLCAgICAgICBNRVRIX08sIHJlcHJfZG9jfSwKLSAJeyJyb3VuZCIsCShQeUNGdW5jdGlvbilidWlsdGluX3JvdW5kLCAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHJvdW5kX2RvY30sCi0gCXsic2V0YXR0ciIsCWJ1aWx0aW5fc2V0YXR0ciwgICAgTUVUSF9WQVJBUkdTLCBzZXRhdHRyX2RvY30sCi0gCXsic29ydGVkIiwJKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fc29ydGVkLCAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgc29ydGVkX2RvY30sCi0gCXsic3VtIiwJCWJ1aWx0aW5fc3VtLCAgICAgICAgTUVUSF9WQVJBUkdTLCBzdW1fZG9jfSwKKyAgICB7Il9faW1wb3J0X18iLCAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX19faW1wb3J0X18sIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGltcG9ydF9kb2N9LAorICAgIHsiYWJzIiwgICAgICAgICAgICAgYnVpbHRpbl9hYnMsICAgICAgICBNRVRIX08sIGFic19kb2N9LAorICAgIHsiYWxsIiwgICAgICAgICAgICAgYnVpbHRpbl9hbGwsICAgICAgICBNRVRIX08sIGFsbF9kb2N9LAorICAgIHsiYW55IiwgICAgICAgICAgICAgYnVpbHRpbl9hbnksICAgICAgICBNRVRIX08sIGFueV9kb2N9LAorICAgIHsiYXBwbHkiLCAgICAgICAgICAgYnVpbHRpbl9hcHBseSwgICAgICBNRVRIX1ZBUkFSR1MsIGFwcGx5X2RvY30sCisgICAgeyJiaW4iLCAgICAgICAgICAgICBidWlsdGluX2JpbiwgICAgICAgIE1FVEhfTywgYmluX2RvY30sCisgICAgeyJjYWxsYWJsZSIsICAgICAgICBidWlsdGluX2NhbGxhYmxlLCAgIE1FVEhfTywgY2FsbGFibGVfZG9jfSwKKyAgICB7ImNociIsICAgICAgICAgICAgIGJ1aWx0aW5fY2hyLCAgICAgICAgTUVUSF9WQVJBUkdTLCBjaHJfZG9jfSwKKyAgICB7ImNtcCIsICAgICAgICAgICAgIGJ1aWx0aW5fY21wLCAgICAgICAgTUVUSF9WQVJBUkdTLCBjbXBfZG9jfSwKKyAgICB7ImNvZXJjZSIsICAgICAgICAgIGJ1aWx0aW5fY29lcmNlLCAgICAgTUVUSF9WQVJBUkdTLCBjb2VyY2VfZG9jfSwKKyAgICB7ImNvbXBpbGUiLCAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX2NvbXBpbGUsICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIGNvbXBpbGVfZG9jfSwKKyAgICB7ImRlbGF0dHIiLCAgICAgICAgIGJ1aWx0aW5fZGVsYXR0ciwgICAgTUVUSF9WQVJBUkdTLCBkZWxhdHRyX2RvY30sCisgICAgeyJkaXIiLCAgICAgICAgICAgICBidWlsdGluX2RpciwgICAgICAgIE1FVEhfVkFSQVJHUywgZGlyX2RvY30sCisgICAgeyJkaXZtb2QiLCAgICAgICAgICBidWlsdGluX2Rpdm1vZCwgICAgIE1FVEhfVkFSQVJHUywgZGl2bW9kX2RvY30sCisgICAgeyJldmFsIiwgICAgICAgICAgICBidWlsdGluX2V2YWwsICAgICAgIE1FVEhfVkFSQVJHUywgZXZhbF9kb2N9LAorICAgIHsiZXhlY2ZpbGUiLCAgICAgICAgYnVpbHRpbl9leGVjZmlsZSwgICBNRVRIX1ZBUkFSR1MsIGV4ZWNmaWxlX2RvY30sCisgICAgeyJmaWx0ZXIiLCAgICAgICAgICBidWlsdGluX2ZpbHRlciwgICAgIE1FVEhfVkFSQVJHUywgZmlsdGVyX2RvY30sCisgICAgeyJmb3JtYXQiLCAgICAgICAgICBidWlsdGluX2Zvcm1hdCwgICAgIE1FVEhfVkFSQVJHUywgZm9ybWF0X2RvY30sCisgICAgeyJnZXRhdHRyIiwgICAgICAgICBidWlsdGluX2dldGF0dHIsICAgIE1FVEhfVkFSQVJHUywgZ2V0YXR0cl9kb2N9LAorICAgIHsiZ2xvYmFscyIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJ1aWx0aW5fZ2xvYmFscywgICAgTUVUSF9OT0FSR1MsIGdsb2JhbHNfZG9jfSwKKyAgICB7Imhhc2F0dHIiLCAgICAgICAgIGJ1aWx0aW5faGFzYXR0ciwgICAgTUVUSF9WQVJBUkdTLCBoYXNhdHRyX2RvY30sCisgICAgeyJoYXNoIiwgICAgICAgICAgICBidWlsdGluX2hhc2gsICAgICAgIE1FVEhfTywgaGFzaF9kb2N9LAorICAgIHsiaGV4IiwgICAgICAgICAgICAgYnVpbHRpbl9oZXgsICAgICAgICBNRVRIX08sIGhleF9kb2N9LAorICAgIHsiaWQiLCAgICAgICAgICAgICAgYnVpbHRpbl9pZCwgICAgICAgICBNRVRIX08sIGlkX2RvY30sCisgICAgeyJpbnB1dCIsICAgICAgICAgICBidWlsdGluX2lucHV0LCAgICAgIE1FVEhfVkFSQVJHUywgaW5wdXRfZG9jfSwKKyAgICB7ImludGVybiIsICAgICAgICAgIGJ1aWx0aW5faW50ZXJuLCAgICAgTUVUSF9WQVJBUkdTLCBpbnRlcm5fZG9jfSwKKyAgICB7ImlzaW5zdGFuY2UiLCAgYnVpbHRpbl9pc2luc3RhbmNlLCBNRVRIX1ZBUkFSR1MsIGlzaW5zdGFuY2VfZG9jfSwKKyAgICB7Imlzc3ViY2xhc3MiLCAgYnVpbHRpbl9pc3N1YmNsYXNzLCBNRVRIX1ZBUkFSR1MsIGlzc3ViY2xhc3NfZG9jfSwKKyAgICB7Iml0ZXIiLCAgICAgICAgICAgIGJ1aWx0aW5faXRlciwgICAgICAgTUVUSF9WQVJBUkdTLCBpdGVyX2RvY30sCisgICAgeyJsZW4iLCAgICAgICAgICAgICBidWlsdGluX2xlbiwgICAgICAgIE1FVEhfTywgbGVuX2RvY30sCisgICAgeyJsb2NhbHMiLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9sb2NhbHMsICAgICBNRVRIX05PQVJHUywgbG9jYWxzX2RvY30sCisgICAgeyJtYXAiLCAgICAgICAgICAgICBidWlsdGluX21hcCwgICAgICAgIE1FVEhfVkFSQVJHUywgbWFwX2RvY30sCisgICAgeyJtYXgiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9tYXgsICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBtYXhfZG9jfSwKKyAgICB7Im1pbiIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX21pbiwgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIG1pbl9kb2N9LAorICAgIHsibmV4dCIsICAgICAgICAgICAgYnVpbHRpbl9uZXh0LCAgICAgICBNRVRIX1ZBUkFSR1MsIG5leHRfZG9jfSwKKyAgICB7Im9jdCIsICAgICAgICAgICAgIGJ1aWx0aW5fb2N0LCAgICAgICAgTUVUSF9PLCBvY3RfZG9jfSwKKyAgICB7Im9wZW4iLCAgICAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX29wZW4sICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIG9wZW5fZG9jfSwKKyAgICB7Im9yZCIsICAgICAgICAgICAgIGJ1aWx0aW5fb3JkLCAgICAgICAgTUVUSF9PLCBvcmRfZG9jfSwKKyAgICB7InBvdyIsICAgICAgICAgICAgIGJ1aWx0aW5fcG93LCAgICAgICAgTUVUSF9WQVJBUkdTLCBwb3dfZG9jfSwKKyAgICB7InByaW50IiwgICAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX3ByaW50LCAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHByaW50X2RvY30sCisgICAgeyJyYW5nZSIsICAgICAgICAgICBidWlsdGluX3JhbmdlLCAgICAgIE1FVEhfVkFSQVJHUywgcmFuZ2VfZG9jfSwKKyAgICB7InJhd19pbnB1dCIsICAgICAgIGJ1aWx0aW5fcmF3X2lucHV0LCAgTUVUSF9WQVJBUkdTLCByYXdfaW5wdXRfZG9jfSwKKyAgICB7InJlZHVjZSIsICAgICAgICAgIGJ1aWx0aW5fcmVkdWNlLCAgICAgTUVUSF9WQVJBUkdTLCByZWR1Y2VfZG9jfSwKKyAgICB7InJlbG9hZCIsICAgICAgICAgIGJ1aWx0aW5fcmVsb2FkLCAgICAgTUVUSF9PLCByZWxvYWRfZG9jfSwKKyAgICB7InJlcHIiLCAgICAgICAgICAgIGJ1aWx0aW5fcmVwciwgICAgICAgTUVUSF9PLCByZXByX2RvY30sCisgICAgeyJyb3VuZCIsICAgICAgICAgICAoUHlDRnVuY3Rpb24pYnVpbHRpbl9yb3VuZCwgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCByb3VuZF9kb2N9LAorICAgIHsic2V0YXR0ciIsICAgICAgICAgYnVpbHRpbl9zZXRhdHRyLCAgICBNRVRIX1ZBUkFSR1MsIHNldGF0dHJfZG9jfSwKKyAgICB7InNvcnRlZCIsICAgICAgICAgIChQeUNGdW5jdGlvbilidWlsdGluX3NvcnRlZCwgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsIHNvcnRlZF9kb2N9LAorICAgIHsic3VtIiwgICAgICAgICAgICAgYnVpbHRpbl9zdW0sICAgICAgICBNRVRIX1ZBUkFSR1MsIHN1bV9kb2N9LAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLSAJeyJ1bmljaHIiLAlidWlsdGluX3VuaWNociwgICAgIE1FVEhfVkFSQVJHUywgdW5pY2hyX2RvY30sCisgICAgeyJ1bmljaHIiLCAgICAgICAgICBidWlsdGluX3VuaWNociwgICAgIE1FVEhfVkFSQVJHUywgdW5pY2hyX2RvY30sCiAjZW5kaWYKLSAJeyJ2YXJzIiwJYnVpbHRpbl92YXJzLCAgICAgICBNRVRIX1ZBUkFSR1MsIHZhcnNfZG9jfSwKLSAgCXsiemlwIiwgICAgICAgICBidWlsdGluX3ppcCwgICAgICAgIE1FVEhfVkFSQVJHUywgemlwX2RvY30sCi0Je05VTEwsCQlOVUxMfSwKKyAgICB7InZhcnMiLCAgICAgICAgICAgIGJ1aWx0aW5fdmFycywgICAgICAgTUVUSF9WQVJBUkdTLCB2YXJzX2RvY30sCisgICAgeyJ6aXAiLCAgICAgICAgIGJ1aWx0aW5femlwLCAgICAgICAgTUVUSF9WQVJBUkdTLCB6aXBfZG9jfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9LAogfTsKIAogUHlEb2NfU1RSVkFSKGJ1aWx0aW5fZG9jLApAQCAtMjYzMiw3NiArMjYzMiw3NiBAQAogUHlPYmplY3QgKgogX1B5QnVpbHRpbl9Jbml0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm1vZCwgKmRpY3QsICpkZWJ1ZzsKLQltb2QgPSBQeV9Jbml0TW9kdWxlNCgiX19idWlsdGluX18iLCBidWlsdGluX21ldGhvZHMsCi0JCQkgICAgIGJ1aWx0aW5fZG9jLCAoUHlPYmplY3QgKilOVUxMLAotCQkJICAgICBQWVRIT05fQVBJX1ZFUlNJT04pOwotCWlmIChtb2QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKKyAgICBQeU9iamVjdCAqbW9kLCAqZGljdCwgKmRlYnVnOworICAgIG1vZCA9IFB5X0luaXRNb2R1bGU0KCJfX2J1aWx0aW5fXyIsIGJ1aWx0aW5fbWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWlsdGluX2RvYywgKFB5T2JqZWN0ICopTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIGlmIChtb2QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKLQkvKiBfX2J1aWx0aW5fXyBleHBvc2VzIGEgbnVtYmVyIG9mIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG9iamVjdHMKLQkgKiB0aGF0LCBiZWZvcmUgdGhpcyBjb2RlIHdhcyBhZGRlZCBpbiAyLjMsIG5ldmVyIHNob3dlZCB1cCBpbgotCSAqIHRoZSBsaXN0IG9mICJhbGwgb2JqZWN0cyIgbWFpbnRhaW5lZCBieSBQeV9UUkFDRV9SRUZTLiAgQXMgYQotCSAqIHJlc3VsdCwgcHJvZ3JhbXMgbGVha2luZyByZWZlcmVuY2VzIHRvIE5vbmUgYW5kIEZhbHNlIChldGMpCi0JICogY291bGRuJ3QgYmUgZGlhZ25vc2VkIGJ5IGV4YW1pbmluZyBzeXMuZ2V0b2JqZWN0cygwKS4KLQkgKi8KKyAgICAvKiBfX2J1aWx0aW5fXyBleHBvc2VzIGEgbnVtYmVyIG9mIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG9iamVjdHMKKyAgICAgKiB0aGF0LCBiZWZvcmUgdGhpcyBjb2RlIHdhcyBhZGRlZCBpbiAyLjMsIG5ldmVyIHNob3dlZCB1cCBpbgorICAgICAqIHRoZSBsaXN0IG9mICJhbGwgb2JqZWN0cyIgbWFpbnRhaW5lZCBieSBQeV9UUkFDRV9SRUZTLiAgQXMgYQorICAgICAqIHJlc3VsdCwgcHJvZ3JhbXMgbGVha2luZyByZWZlcmVuY2VzIHRvIE5vbmUgYW5kIEZhbHNlIChldGMpCisgICAgICogY291bGRuJ3QgYmUgZGlhZ25vc2VkIGJ5IGV4YW1pbmluZyBzeXMuZ2V0b2JqZWN0cygwKS4KKyAgICAgKi8KICNkZWZpbmUgQUREX1RPX0FMTChPQkpFQ1QpIF9QeV9BZGRUb0FsbE9iamVjdHMoKFB5T2JqZWN0ICopKE9CSkVDVCksIDApCiAjZWxzZQogI2RlZmluZSBBRERfVE9fQUxMKE9CSkVDVCkgKHZvaWQpMAogI2VuZGlmCiAKICNkZWZpbmUgU0VUQlVJTFRJTihOQU1FLCBPQkpFQ1QpIFwKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgTkFNRSwgKFB5T2JqZWN0ICopT0JKRUNUKSA8IDApCVwKLQkJcmV0dXJuIE5VTEw7CQkJCQkJXAotCUFERF9UT19BTEwoT0JKRUNUKQorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBOQU1FLCAoUHlPYmplY3QgKilPQkpFQ1QpIDwgMCkgICAgICAgXAorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFERF9UT19BTEwoT0JKRUNUKQogCi0JU0VUQlVJTFRJTigiTm9uZSIsCQlQeV9Ob25lKTsKLQlTRVRCVUlMVElOKCJFbGxpcHNpcyIsCQlQeV9FbGxpcHNpcyk7Ci0JU0VUQlVJTFRJTigiTm90SW1wbGVtZW50ZWQiLAlQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0JU0VUQlVJTFRJTigiRmFsc2UiLAkJUHlfRmFsc2UpOwotCVNFVEJVSUxUSU4oIlRydWUiLAkJUHlfVHJ1ZSk7Ci0JU0VUQlVJTFRJTigiYmFzZXN0cmluZyIsCSZQeUJhc2VTdHJpbmdfVHlwZSk7Ci0JU0VUQlVJTFRJTigiYm9vbCIsCQkmUHlCb29sX1R5cGUpOwotCS8qCVNFVEJVSUxUSU4oIm1lbW9yeXZpZXciLCAgICAgICAgJlB5TWVtb3J5Vmlld19UeXBlKTsgKi8KLQlTRVRCVUlMVElOKCJieXRlYXJyYXkiLAkJJlB5Qnl0ZUFycmF5X1R5cGUpOwotCVNFVEJVSUxUSU4oImJ5dGVzIiwJCSZQeVN0cmluZ19UeXBlKTsKLQlTRVRCVUlMVElOKCJidWZmZXIiLAkJJlB5QnVmZmVyX1R5cGUpOwotCVNFVEJVSUxUSU4oImNsYXNzbWV0aG9kIiwJJlB5Q2xhc3NNZXRob2RfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiTm9uZSIsICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CisgICAgU0VUQlVJTFRJTigiRWxsaXBzaXMiLCAgICAgICAgICAgICAgUHlfRWxsaXBzaXMpOworICAgIFNFVEJVSUxUSU4oIk5vdEltcGxlbWVudGVkIiwgICAgICAgIFB5X05vdEltcGxlbWVudGVkKTsKKyAgICBTRVRCVUlMVElOKCJGYWxzZSIsICAgICAgICAgICAgICAgICBQeV9GYWxzZSk7CisgICAgU0VUQlVJTFRJTigiVHJ1ZSIsICAgICAgICAgICAgICAgICAgUHlfVHJ1ZSk7CisgICAgU0VUQlVJTFRJTigiYmFzZXN0cmluZyIsICAgICAgICAgICAgJlB5QmFzZVN0cmluZ19UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJib29sIiwgICAgICAgICAgICAgICAgICAmUHlCb29sX1R5cGUpOworICAgIC8qICAgICAgICAgIFNFVEJVSUxUSU4oIm1lbW9yeXZpZXciLCAgICAgICAgJlB5TWVtb3J5Vmlld19UeXBlKTsgKi8KKyAgICBTRVRCVUlMVElOKCJieXRlYXJyYXkiLCAgICAgICAgICAgICAmUHlCeXRlQXJyYXlfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiYnl0ZXMiLCAgICAgICAgICAgICAgICAgJlB5U3RyaW5nX1R5cGUpOworICAgIFNFVEJVSUxUSU4oImJ1ZmZlciIsICAgICAgICAgICAgICAgICZQeUJ1ZmZlcl9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJjbGFzc21ldGhvZCIsICAgICAgICAgICAmUHlDbGFzc01ldGhvZF9UeXBlKTsKICNpZm5kZWYgV0lUSE9VVF9DT01QTEVYCi0JU0VUQlVJTFRJTigiY29tcGxleCIsCQkmUHlDb21wbGV4X1R5cGUpOworICAgIFNFVEJVSUxUSU4oImNvbXBsZXgiLCAgICAgICAgICAgICAgICZQeUNvbXBsZXhfVHlwZSk7CiAjZW5kaWYKLQlTRVRCVUlMVElOKCJkaWN0IiwJCSZQeURpY3RfVHlwZSk7Ci0gCVNFVEJVSUxUSU4oImVudW1lcmF0ZSIsCQkmUHlFbnVtX1R5cGUpOwotCVNFVEJVSUxUSU4oImZpbGUiLAkJJlB5RmlsZV9UeXBlKTsKLQlTRVRCVUlMVElOKCJmbG9hdCIsCQkmUHlGbG9hdF9UeXBlKTsKLQlTRVRCVUlMVElOKCJmcm96ZW5zZXQiLAkJJlB5RnJvemVuU2V0X1R5cGUpOwotCVNFVEJVSUxUSU4oInByb3BlcnR5IiwJCSZQeVByb3BlcnR5X1R5cGUpOwotCVNFVEJVSUxUSU4oImludCIsCQkmUHlJbnRfVHlwZSk7Ci0JU0VUQlVJTFRJTigibGlzdCIsCQkmUHlMaXN0X1R5cGUpOwotCVNFVEJVSUxUSU4oImxvbmciLAkJJlB5TG9uZ19UeXBlKTsKLQlTRVRCVUlMVElOKCJvYmplY3QiLAkJJlB5QmFzZU9iamVjdF9UeXBlKTsKLQlTRVRCVUlMVElOKCJyZXZlcnNlZCIsCQkmUHlSZXZlcnNlZF9UeXBlKTsKLQlTRVRCVUlMVElOKCJzZXQiLAkJJlB5U2V0X1R5cGUpOwotCVNFVEJVSUxUSU4oInNsaWNlIiwJCSZQeVNsaWNlX1R5cGUpOwotCVNFVEJVSUxUSU4oInN0YXRpY21ldGhvZCIsCSZQeVN0YXRpY01ldGhvZF9UeXBlKTsKLQlTRVRCVUlMVElOKCJzdHIiLAkJJlB5U3RyaW5nX1R5cGUpOwotCVNFVEJVSUxUSU4oInN1cGVyIiwJCSZQeVN1cGVyX1R5cGUpOwotCVNFVEJVSUxUSU4oInR1cGxlIiwJCSZQeVR1cGxlX1R5cGUpOwotCVNFVEJVSUxUSU4oInR5cGUiLAkJJlB5VHlwZV9UeXBlKTsKLQlTRVRCVUlMVElOKCJ4cmFuZ2UiLAkJJlB5UmFuZ2VfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiZGljdCIsICAgICAgICAgICAgICAgICAgJlB5RGljdF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJlbnVtZXJhdGUiLCAgICAgICAgICAgICAmUHlFbnVtX1R5cGUpOworICAgIFNFVEJVSUxUSU4oImZpbGUiLCAgICAgICAgICAgICAgICAgICZQeUZpbGVfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiZmxvYXQiLCAgICAgICAgICAgICAgICAgJlB5RmxvYXRfVHlwZSk7CisgICAgU0VUQlVJTFRJTigiZnJvemVuc2V0IiwgICAgICAgICAgICAgJlB5RnJvemVuU2V0X1R5cGUpOworICAgIFNFVEJVSUxUSU4oInByb3BlcnR5IiwgICAgICAgICAgICAgICZQeVByb3BlcnR5X1R5cGUpOworICAgIFNFVEJVSUxUSU4oImludCIsICAgICAgICAgICAgICAgICAgICZQeUludF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJsaXN0IiwgICAgICAgICAgICAgICAgICAmUHlMaXN0X1R5cGUpOworICAgIFNFVEJVSUxUSU4oImxvbmciLCAgICAgICAgICAgICAgICAgICZQeUxvbmdfVHlwZSk7CisgICAgU0VUQlVJTFRJTigib2JqZWN0IiwgICAgICAgICAgICAgICAgJlB5QmFzZU9iamVjdF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJyZXZlcnNlZCIsICAgICAgICAgICAgICAmUHlSZXZlcnNlZF9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJzZXQiLCAgICAgICAgICAgICAgICAgICAmUHlTZXRfVHlwZSk7CisgICAgU0VUQlVJTFRJTigic2xpY2UiLCAgICAgICAgICAgICAgICAgJlB5U2xpY2VfVHlwZSk7CisgICAgU0VUQlVJTFRJTigic3RhdGljbWV0aG9kIiwgICAgICAgICAgJlB5U3RhdGljTWV0aG9kX1R5cGUpOworICAgIFNFVEJVSUxUSU4oInN0ciIsICAgICAgICAgICAgICAgICAgICZQeVN0cmluZ19UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJzdXBlciIsICAgICAgICAgICAgICAgICAmUHlTdXBlcl9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJ0dXBsZSIsICAgICAgICAgICAgICAgICAmUHlUdXBsZV9UeXBlKTsKKyAgICBTRVRCVUlMVElOKCJ0eXBlIiwgICAgICAgICAgICAgICAgICAmUHlUeXBlX1R5cGUpOworICAgIFNFVEJVSUxUSU4oInhyYW5nZSIsICAgICAgICAgICAgICAgICZQeVJhbmdlX1R5cGUpOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlTRVRCVUlMVElOKCJ1bmljb2RlIiwJCSZQeVVuaWNvZGVfVHlwZSk7CisgICAgU0VUQlVJTFRJTigidW5pY29kZSIsICAgICAgICAgICAgICAgJlB5VW5pY29kZV9UeXBlKTsKICNlbmRpZgotCWRlYnVnID0gUHlCb29sX0Zyb21Mb25nKFB5X09wdGltaXplRmxhZyA9PSAwKTsKLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fZGVidWdfXyIsIGRlYnVnKSA8IDApIHsKLQkJUHlfWERFQ1JFRihkZWJ1Zyk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9YREVDUkVGKGRlYnVnKTsKKyAgICBkZWJ1ZyA9IFB5Qm9vbF9Gcm9tTG9uZyhQeV9PcHRpbWl6ZUZsYWcgPT0gMCk7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RlYnVnX18iLCBkZWJ1ZykgPCAwKSB7CisgICAgICAgIFB5X1hERUNSRUYoZGVidWcpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfWERFQ1JFRihkZWJ1Zyk7CiAKLQlyZXR1cm4gbW9kOworICAgIHJldHVybiBtb2Q7CiAjdW5kZWYgQUREX1RPX0FMTAogI3VuZGVmIFNFVEJVSUxUSU4KIH0KQEAgLTI3MTEsNjkgKzI3MTEsNjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWx0ZXJ0dXBsZShQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKnR1cGxlKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlfc3NpemVfdCBpLCBqOwotCVB5X3NzaXplX3QgbGVuID0gUHlUdXBsZV9TaXplKHR1cGxlKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5X3NzaXplX3QgaSwgajsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5VHVwbGVfU2l6ZSh0dXBsZSk7CiAKLQlpZiAobGVuID09IDApIHsKLQkJaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh0dXBsZSkpCi0JCQlQeV9JTkNSRUYodHVwbGUpOwotCQllbHNlCi0JCQl0dXBsZSA9IFB5VHVwbGVfTmV3KDApOwotCQlyZXR1cm4gdHVwbGU7Ci0JfQorICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHR1cGxlKSkKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0dXBsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoMCk7CisgICAgICAgIHJldHVybiB0dXBsZTsKKyAgICB9CiAKLQlpZiAoKHJlc3VsdCA9IFB5VHVwbGVfTmV3KGxlbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmICgocmVzdWx0ID0gUHlUdXBsZV9OZXcobGVuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSBqID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtLCAqZ29vZDsKLQkJaW50IG9rOworICAgIGZvciAoaSA9IGogPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0sICpnb29kOworICAgICAgICBpbnQgb2s7CiAKLQkJaWYgKHR1cGxlLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAmJgotCQkgICAgdHVwbGUtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKSB7Ci0JCQlpdGVtID0gdHVwbGUtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKHR1cGxlLCBpKTsKLQkJCWlmIChpdGVtID09IE5VTEwpCi0JCQkJZ290byBGYWlsXzE7Ci0JCX0gZWxzZSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZmlsdGVyKCk6IHVuc3Vic2NyaXB0YWJsZSB0dXBsZSIpOwotCQkJZ290byBGYWlsXzE7Ci0JCX0KLQkJaWYgKGZ1bmMgPT0gUHlfTm9uZSkgewotCQkJUHlfSU5DUkVGKGl0ZW0pOwotCQkJZ29vZCA9IGl0ZW07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeU9iamVjdCAqYXJnID0gUHlUdXBsZV9QYWNrKDEsIGl0ZW0pOwotCQkJaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbF8xOwotCQkJfQotCQkJZ29vZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JCQlQeV9ERUNSRUYoYXJnKTsKLQkJCWlmIChnb29kID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJZ290byBGYWlsXzE7Ci0JCQl9Ci0JCX0KLQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JCVB5X0RFQ1JFRihnb29kKTsKLQkJaWYgKG9rKSB7Ci0JCQlpZiAoUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaisrLCBpdGVtKSA8IDApCi0JCQkJZ290byBGYWlsXzE7Ci0JCX0KLQkJZWxzZQotCQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KKyAgICAgICAgaWYgKHR1cGxlLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSAmJgorICAgICAgICAgICAgdHVwbGUtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKSB7CisgICAgICAgICAgICBpdGVtID0gdHVwbGUtPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKHR1cGxlLCBpKTsKKyAgICAgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZmlsdGVyKCk6IHVuc3Vic2NyaXB0YWJsZSB0dXBsZSIpOworICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZ1bmMgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICAgICAgZ29vZCA9IGl0ZW07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYXJnID0gUHlUdXBsZV9QYWNrKDEsIGl0ZW0pOworICAgICAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ29vZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgIGlmIChnb29kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBpZiAoUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaisrLCBpdGVtKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KIAotCWlmIChfUHlUdXBsZV9SZXNpemUoJnJlc3VsdCwgaikgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoX1B5VHVwbGVfUmVzaXplKCZyZXN1bHQsIGopIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiAKIEZhaWxfMToKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC0yNzgyLDEyNSArMjc4MiwxMjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWx0ZXJzdHJpbmcoUHlPYmplY3QgKmZ1bmMsIFB5T2JqZWN0ICpzdHJvYmopCiB7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeV9zc2l6ZV90IGksIGo7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19TaXplKHN0cm9iaik7Ci0JUHlfc3NpemVfdCBvdXRsZW4gPSBsZW47CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeV9zc2l6ZV90IGksIGo7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19TaXplKHN0cm9iaik7CisgICAgUHlfc3NpemVfdCBvdXRsZW4gPSBsZW47CiAKLQlpZiAoZnVuYyA9PSBQeV9Ob25lKSB7Ci0JCS8qIElmIGl0J3MgYSByZWFsIHN0cmluZyB3ZSBjYW4gcmV0dXJuIHRoZSBvcmlnaW5hbCwKLQkJICogYXMgbm8gY2hhcmFjdGVyIGlzIGV2ZXIgZmFsc2UgYW5kIF9fZ2V0aXRlbV9fCi0JCSAqIGRvZXMgcmV0dXJuIHRoaXMgY2hhcmFjdGVyLiBJZiBpdCdzIGEgc3ViY2xhc3MKLQkJICogd2UgbXVzdCBnbyB0aHJvdWdoIHRoZSBfX2dldGl0ZW1fXyBsb29wICovCi0JCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KHN0cm9iaikpIHsKLQkJCVB5X0lOQ1JFRihzdHJvYmopOwotCQkJcmV0dXJuIHN0cm9iajsKLQkJfQotCX0KLQlpZiAoKHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgLyogSWYgaXQncyBhIHJlYWwgc3RyaW5nIHdlIGNhbiByZXR1cm4gdGhlIG9yaWdpbmFsLAorICAgICAgICAgKiBhcyBubyBjaGFyYWN0ZXIgaXMgZXZlciBmYWxzZSBhbmQgX19nZXRpdGVtX18KKyAgICAgICAgICogZG9lcyByZXR1cm4gdGhpcyBjaGFyYWN0ZXIuIElmIGl0J3MgYSBzdWJjbGFzcworICAgICAgICAgKiB3ZSBtdXN0IGdvIHRocm91Z2ggdGhlIF9fZ2V0aXRlbV9fIGxvb3AgKi8KKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3Qoc3Ryb2JqKSkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHN0cm9iaik7CisgICAgICAgICAgICByZXR1cm4gc3Ryb2JqOworICAgICAgICB9CisgICAgfQorICAgIGlmICgocmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGkgPSBqID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCVB5T2JqZWN0ICppdGVtOwotCQlpbnQgb2s7CisgICAgZm9yIChpID0gaiA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbTsKKyAgICAgICAgaW50IG9rOwogCi0JCWl0ZW0gPSAoKnN0cm9iai0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0pKHN0cm9iaiwgaSk7Ci0JCWlmIChpdGVtID09IE5VTEwpCi0JCQlnb3RvIEZhaWxfMTsKLQkJaWYgKGZ1bmM9PVB5X05vbmUpIHsKLQkJCW9rID0gMTsKLQkJfSBlbHNlIHsKLQkJCVB5T2JqZWN0ICphcmcsICpnb29kOwotCQkJYXJnID0gUHlUdXBsZV9QYWNrKDEsIGl0ZW0pOwotCQkJaWYgKGFyZyA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbF8xOwotCQkJfQotCQkJZ29vZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7Ci0JCQlQeV9ERUNSRUYoYXJnKTsKLQkJCWlmIChnb29kID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJZ290byBGYWlsXzE7Ci0JCQl9Ci0JCQlvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKLQkJCVB5X0RFQ1JFRihnb29kKTsKLQkJfQotCQlpZiAob2spIHsKLQkJCVB5X3NzaXplX3QgcmVzbGVuOwotCQkJaWYgKCFQeVN0cmluZ19DaGVjayhpdGVtKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYW4ndCBmaWx0ZXIgc3RyIHRvIHN0cjoiCi0JCQkJCSIgX19nZXRpdGVtX18gcmV0dXJuZWQgZGlmZmVyZW50IHR5cGUiKTsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJZ290byBGYWlsXzE7Ci0JCQl9Ci0JCQlyZXNsZW4gPSBQeVN0cmluZ19HRVRfU0laRShpdGVtKTsKLQkJCWlmIChyZXNsZW4gPT0gMSkgewotCQkJCVB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpW2orK10gPQotCQkJCQlQeVN0cmluZ19BU19TVFJJTkcoaXRlbSlbMF07Ci0JCQl9IGVsc2UgewotCQkJCS8qIGRvIHdlIG5lZWQgbW9yZSBzcGFjZT8gKi8KLQkJCQlQeV9zc2l6ZV90IG5lZWQgPSBqOworICAgICAgICBpdGVtID0gKCpzdHJvYmotPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKShzdHJvYmosIGkpOworICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgIGlmIChmdW5jPT1QeV9Ob25lKSB7CisgICAgICAgICAgICBvayA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYXJnLCAqZ29vZDsKKyAgICAgICAgICAgIGFyZyA9IFB5VHVwbGVfUGFjaygxLCBpdGVtKTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdvb2QgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOworICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZ29vZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9rKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IHJlc2xlbjsKKyAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiY2FuJ3QgZmlsdGVyIHN0ciB0byBzdHI6IgorICAgICAgICAgICAgICAgICAgICAiIF9fZ2V0aXRlbV9fIHJldHVybmVkIGRpZmZlcmVudCB0eXBlIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoaXRlbSk7CisgICAgICAgICAgICBpZiAocmVzbGVuID09IDEpIHsKKyAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KVtqKytdID0KKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pWzBdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBkbyB3ZSBuZWVkIG1vcmUgc3BhY2U/ICovCisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuZWVkID0gajsKIAotCQkJCS8qIGNhbGN1bGF0ZSBzcGFjZSByZXF1aXJlbWVudHMgd2hpbGUgY2hlY2tpbmcgZm9yIG92ZXJmbG93ICovCi0JCQkJaWYgKG5lZWQgPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbikgewotCQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJCWdvdG8gRmFpbF8xOwotCQkJCX0KKyAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgc3BhY2UgcmVxdWlyZW1lbnRzIHdoaWxlIGNoZWNraW5nIGZvciBvdmVyZmxvdyAqLworICAgICAgICAgICAgICAgIGlmIChuZWVkID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQluZWVkICs9IHJlc2xlbjsKKyAgICAgICAgICAgICAgICBuZWVkICs9IHJlc2xlbjsKIAotCQkJCWlmIChuZWVkID4gUFlfU1NJWkVfVF9NQVggLSBsZW4pIHsKLQkJCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCQlnb3RvIEZhaWxfMTsKLQkJCQl9CisgICAgICAgICAgICAgICAgaWYgKG5lZWQgPiBQWV9TU0laRV9UX01BWCAtIGxlbikgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgICAgIH0KIAotCQkJCW5lZWQgKz0gbGVuOworICAgICAgICAgICAgICAgIG5lZWQgKz0gbGVuOwogCi0JCQkJaWYgKG5lZWQgPD0gaSkgewotCQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJCWdvdG8gRmFpbF8xOwotCQkJCX0KKyAgICAgICAgICAgICAgICBpZiAobmVlZCA8PSBpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJbmVlZCA9IG5lZWQgLSBpIC0gMTsKKyAgICAgICAgICAgICAgICBuZWVkID0gbmVlZCAtIGkgLSAxOwogCi0JCQkJYXNzZXJ0KG5lZWQgPj0gMCk7Ci0JCQkJYXNzZXJ0KG91dGxlbiA+PSAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQobmVlZCA+PSAwKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQob3V0bGVuID49IDApOwogCi0JCQkJaWYgKG5lZWQgPiBvdXRsZW4pIHsKLQkJCQkJLyogb3ZlcmFsbG9jYXRlLCB0byBhdm9pZCByZWFsbG9jYXRpb25zICovCi0JCQkJCWlmIChvdXRsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHsKLQkJCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCQl9CisgICAgICAgICAgICAgICAgaWYgKG5lZWQgPiBvdXRsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogb3ZlcmFsbG9jYXRlLCB0byBhdm9pZCByZWFsbG9jYXRpb25zICovCisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJaWYgKG5lZWQ8MipvdXRsZW4pIHsKLQkJCQkJCW5lZWQgPSAyKm91dGxlbjsKLSAgICAgICAgICB9Ci0JCQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsIG5lZWQpKSB7Ci0JCQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQkJfQotCQkJCQlvdXRsZW4gPSBuZWVkOwotCQkJCX0KLQkJCQltZW1jcHkoCi0JCQkJCVB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpICsgaiwKLQkJCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLAotCQkJCQlyZXNsZW4KLQkJCQkpOwotCQkJCWogKz0gcmVzbGVuOwotCQkJfQotCQl9Ci0JCVB5X0RFQ1JFRihpdGVtKTsKLQl9CisgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkPDIqb3V0bGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZWVkID0gMipvdXRsZW47CisgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBuZWVkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGVuID0gbmVlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCkgKyBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IHJlc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CiAKLQlpZiAoaiA8IG91dGxlbikKLQkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBqKTsKKyAgICBpZiAoaiA8IG91dGxlbikKKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmcmVzdWx0LCBqKTsKIAotCXJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogRmFpbF8xOgotCVB5X0RFQ1JFRihyZXN1bHQpOwotCXJldHVybiBOVUxMOworICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiBOVUxMOwogfQogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQpAQCAtMjkwOSwxMTIgKzI5MDksMTEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZmlsdGVydW5pY29kZShQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKnN0cm9iaikKIHsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXJlZ2lzdGVyIFB5X3NzaXplX3QgaSwgajsKLQlQeV9zc2l6ZV90IGxlbiA9IFB5VW5pY29kZV9HZXRTaXplKHN0cm9iaik7Ci0JUHlfc3NpemVfdCBvdXRsZW4gPSBsZW47CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGksIGo7CisgICAgUHlfc3NpemVfdCBsZW4gPSBQeVVuaWNvZGVfR2V0U2l6ZShzdHJvYmopOworICAgIFB5X3NzaXplX3Qgb3V0bGVuID0gbGVuOwogCi0JaWYgKGZ1bmMgPT0gUHlfTm9uZSkgewotCQkvKiBJZiBpdCdzIGEgcmVhbCBzdHJpbmcgd2UgY2FuIHJldHVybiB0aGUgb3JpZ2luYWwsCi0JCSAqIGFzIG5vIGNoYXJhY3RlciBpcyBldmVyIGZhbHNlIGFuZCBfX2dldGl0ZW1fXwotCQkgKiBkb2VzIHJldHVybiB0aGlzIGNoYXJhY3Rlci4gSWYgaXQncyBhIHN1YmNsYXNzCi0JCSAqIHdlIG11c3QgZ28gdGhyb3VnaCB0aGUgX19nZXRpdGVtX18gbG9vcCAqLwotCQlpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3Ryb2JqKSkgewotCQkJUHlfSU5DUkVGKHN0cm9iaik7Ci0JCQlyZXR1cm4gc3Ryb2JqOwotCQl9Ci0JfQotCWlmICgocmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGxlbikpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChmdW5jID09IFB5X05vbmUpIHsKKyAgICAgICAgLyogSWYgaXQncyBhIHJlYWwgc3RyaW5nIHdlIGNhbiByZXR1cm4gdGhlIG9yaWdpbmFsLAorICAgICAgICAgKiBhcyBubyBjaGFyYWN0ZXIgaXMgZXZlciBmYWxzZSBhbmQgX19nZXRpdGVtX18KKyAgICAgICAgICogZG9lcyByZXR1cm4gdGhpcyBjaGFyYWN0ZXIuIElmIGl0J3MgYSBzdWJjbGFzcworICAgICAgICAgKiB3ZSBtdXN0IGdvIHRocm91Z2ggdGhlIF9fZ2V0aXRlbV9fIGxvb3AgKi8KKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHN0cm9iaikpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzdHJvYmopOworICAgICAgICAgICAgcmV0dXJuIHN0cm9iajsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBsZW4pKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZvciAoaSA9IGogPSAwOyBpIDwgbGVuOyArK2kpIHsKLQkJUHlPYmplY3QgKml0ZW0sICphcmcsICpnb29kOwotCQlpbnQgb2s7CisgICAgZm9yIChpID0gaiA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSwgKmFyZywgKmdvb2Q7CisgICAgICAgIGludCBvazsKIAotCQlpdGVtID0gKCpzdHJvYmotPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKShzdHJvYmosIGkpOwotCQlpZiAoaXRlbSA9PSBOVUxMKQotCQkJZ290byBGYWlsXzE7Ci0JCWlmIChmdW5jID09IFB5X05vbmUpIHsKLQkJCW9rID0gMTsKLQkJfSBlbHNlIHsKLQkJCWFyZyA9IFB5VHVwbGVfUGFjaygxLCBpdGVtKTsKLQkJCWlmIChhcmcgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWxfMTsKLQkJCX0KLQkJCWdvb2QgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwotCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQlpZiAoZ29vZCA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCWdvdG8gRmFpbF8xOwotCQkJfQotCQkJb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7Ci0JCQlQeV9ERUNSRUYoZ29vZCk7Ci0JCX0KLQkJaWYgKG9rKSB7Ci0JCQlQeV9zc2l6ZV90IHJlc2xlbjsKLQkJCWlmICghUHlVbmljb2RlX0NoZWNrKGl0ZW0pKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiY2FuJ3QgZmlsdGVyIHVuaWNvZGUgdG8gdW5pY29kZToiCi0JCQkJIiBfX2dldGl0ZW1fXyByZXR1cm5lZCBkaWZmZXJlbnQgdHlwZSIpOwotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlnb3RvIEZhaWxfMTsKLQkJCX0KLQkJCXJlc2xlbiA9IFB5VW5pY29kZV9HRVRfU0laRShpdGVtKTsKLQkJCWlmIChyZXNsZW4gPT0gMSkKLQkJCQlQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXN1bHQpW2orK10gPQotCQkJCQlQeVVuaWNvZGVfQVNfVU5JQ09ERShpdGVtKVswXTsKLQkJCWVsc2UgewotCQkJCS8qIGRvIHdlIG5lZWQgbW9yZSBzcGFjZT8gKi8KLQkJCQlQeV9zc2l6ZV90IG5lZWQgPSBqICsgcmVzbGVuICsgbGVuIC0gaSAtIDE7Ci0gICAgICAgIAotCQkJCS8qIGNoZWNrIHRoYXQgZGlkbnQgb3ZlcmZsb3cgKi8KLQkJCQlpZiAoKGogPiBQWV9TU0laRV9UX01BWCAtIHJlc2xlbikgfHwKLQkJCQkJKChqICsgcmVzbGVuKSA+IFBZX1NTSVpFX1RfTUFYIC0gbGVuKSB8fAotCQkJCQkJKChqICsgcmVzbGVuICsgbGVuKSA8IGkpIHx8Ci0JCQkJCQkJKChqICsgcmVzbGVuICsgbGVuIC0gaSkgPD0gMCkpIHsKLQkJCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9CisgICAgICAgIGl0ZW0gPSAoKnN0cm9iai0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0pKHN0cm9iaiwgaSk7CisgICAgICAgIGlmIChpdGVtID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIEZhaWxfMTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgb2sgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJnID0gUHlUdXBsZV9QYWNrKDEsIGl0ZW0pOworICAgICAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ29vZCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgIGlmIChnb29kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShnb29kKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihnb29kKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2spIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgcmVzbGVuOworICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soaXRlbSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJjYW4ndCBmaWx0ZXIgdW5pY29kZSB0byB1bmljb2RlOiIKKyAgICAgICAgICAgICAgICAiIF9fZ2V0aXRlbV9fIHJldHVybmVkIGRpZmZlcmVudCB0eXBlIik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGdvdG8gRmFpbF8xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKGl0ZW0pOworICAgICAgICAgICAgaWYgKHJlc2xlbiA9PSAxKQorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKHJlc3VsdClbaisrXSA9CisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKGl0ZW0pWzBdOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZG8gd2UgbmVlZCBtb3JlIHNwYWNlPyAqLworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbmVlZCA9IGogKyByZXNsZW4gKyBsZW4gLSBpIC0gMTsKIAotCQkJCWFzc2VydChuZWVkID49IDApOwotCQkJCWFzc2VydChvdXRsZW4gPj0gMCk7Ci0JCQkJCi0JCQkJaWYgKG5lZWQgPiBvdXRsZW4pIHsKLQkJCQkJLyogb3ZlcmFsbG9jYXRlLAotCQkJCQkgICB0byBhdm9pZCByZWFsbG9jYXRpb25zICovCi0JCQkJCWlmIChuZWVkIDwgMiAqIG91dGxlbikgewotICAgICAgICAgICAgaWYgKG91dGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikgewotICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQluZWVkID0gMiAqIG91dGxlbjsKLQkJCQkgICAgfQotICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBjaGVjayB0aGF0IGRpZG50IG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgaWYgKChqID4gUFlfU1NJWkVfVF9NQVggLSByZXNsZW4pIHx8CisgICAgICAgICAgICAgICAgICAgICgoaiArIHJlc2xlbikgPiBQWV9TU0laRV9UX01BWCAtIGxlbikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoaiArIHJlc2xlbiArIGxlbikgPCBpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaiArIHJlc2xlbiArIGxlbiAtIGkpIDw9IDApKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJCWlmIChQeVVuaWNvZGVfUmVzaXplKAotCQkJCQkJJnJlc3VsdCwgbmVlZCkgPCAwKSB7Ci0JCQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJCQlnb3RvIEZhaWxfMTsKLQkJCQkJfQotCQkJCQlvdXRsZW4gPSBuZWVkOwotCQkJCX0KLQkJCQltZW1jcHkoUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KSArIGosCi0JCQkJICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKGl0ZW0pLAotCQkJCSAgICAgICByZXNsZW4qc2l6ZW9mKFB5X1VOSUNPREUpKTsKLQkJCQlqICs9IHJlc2xlbjsKLQkJCX0KLQkJfQotCQlQeV9ERUNSRUYoaXRlbSk7Ci0JfQorICAgICAgICAgICAgICAgIGFzc2VydChuZWVkID49IDApOworICAgICAgICAgICAgICAgIGFzc2VydChvdXRsZW4gPj0gMCk7CiAKLQlpZiAoaiA8IG91dGxlbikKLQkJUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBqKTsKKyAgICAgICAgICAgICAgICBpZiAobmVlZCA+IG91dGxlbikgeworICAgICAgICAgICAgICAgICAgICAvKiBvdmVyYWxsb2NhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIHRvIGF2b2lkIHJlYWxsb2NhdGlvbnMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWQgPCAyICogb3V0bGVuKSB7CisgICAgICAgIGlmIChvdXRsZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHsKKyAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZCA9IDIgKiBvdXRsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgIH0KIAotCXJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX1Jlc2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwgbmVlZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBGYWlsXzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsZW4gPSBuZWVkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoUHlVbmljb2RlX0FTX1VOSUNPREUocmVzdWx0KSArIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9BU19VTklDT0RFKGl0ZW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNsZW4qc2l6ZW9mKFB5X1VOSUNPREUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IHJlc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CisKKyAgICBpZiAoaiA8IG91dGxlbikKKyAgICAgICAgUHlVbmljb2RlX1Jlc2l6ZSgmcmVzdWx0LCBqKTsKKworICAgIHJldHVybiByZXN1bHQ7CiAKIEZhaWxfMToKLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NldmFsLmMgYi9QeXRob24vY2V2YWwuYwppbmRleCA2ZGQzNzBmLi40ZGQwZTkyIDEwMDY0NAotLS0gYS9QeXRob24vY2V2YWwuYworKysgYi9QeXRob24vY2V2YWwuYwpAQCAtMjgsMjcgKzI4LDI3IEBACiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50NjQ7CiAKICNpZiBkZWZpbmVkKF9fcHBjX18pIC8qIDwtIERvbid0IGtub3cgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBzeW1ib2w7IHRoaXMKLQkJCSAgIHNlY3Rpb24gc2hvdWxkIHdvcmsgZm9yIEdDQyBvbiBhbnkgUG93ZXJQQwotCQkJICAgcGxhdGZvcm0sIGlycmVzcGVjdGl2ZSBvZiBPUy4KLQkJCSAgIFBPV0VSPyAgV2hvIGtub3dzIDotKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBzaG91bGQgd29yayBmb3IgR0NDIG9uIGFueSBQb3dlclBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybSwgaXJyZXNwZWN0aXZlIG9mIE9TLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9XRVI/ICBXaG8ga25vd3MgOi0pICovCiAKICNkZWZpbmUgUkVBRF9USU1FU1RBTVAodmFyKSBwcGNfZ2V0Y291bnRlcigmdmFyKQogCiBzdGF0aWMgdm9pZAogcHBjX2dldGNvdW50ZXIodWludDY0ICp2KQogewotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdGJ1LCB0YiwgdGJ1MjsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHRidSwgdGIsIHRidTI7CiAKICAgbG9vcDoKLQlhc20gdm9sYXRpbGUgKCJtZnRidSAlMCIgOiAiPXIiICh0YnUpICk7Ci0JYXNtIHZvbGF0aWxlICgibWZ0YiAgJTAiIDogIj1yIiAodGIpICApOwotCWFzbSB2b2xhdGlsZSAoIm1mdGJ1ICUwIiA6ICI9ciIgKHRidTIpKTsKLQlpZiAoX19idWlsdGluX2V4cGVjdCh0YnUgIT0gdGJ1MiwgMCkpIGdvdG8gbG9vcDsKKyAgICBhc20gdm9sYXRpbGUgKCJtZnRidSAlMCIgOiAiPXIiICh0YnUpICk7CisgICAgYXNtIHZvbGF0aWxlICgibWZ0YiAgJTAiIDogIj1yIiAodGIpICApOworICAgIGFzbSB2b2xhdGlsZSAoIm1mdGJ1ICUwIiA6ICI9ciIgKHRidTIpKTsKKyAgICBpZiAoX19idWlsdGluX2V4cGVjdCh0YnUgIT0gdGJ1MiwgMCkpIGdvdG8gbG9vcDsKIAotCS8qIFRoZSBzbGlnaHRseSBwZWN1bGlhciB3YXkgb2Ygd3JpdGluZyB0aGUgbmV4dCBsaW5lcyBpcwotCSAgIGNvbXBpbGVkIGJldHRlciBieSBHQ0MgdGhhbiBhbnkgb3RoZXIgd2F5IEkgdHJpZWQuICovCi0JKChsb25nKikodikpWzBdID0gdGJ1OwotCSgobG9uZyopKHYpKVsxXSA9IHRiOworICAgIC8qIFRoZSBzbGlnaHRseSBwZWN1bGlhciB3YXkgb2Ygd3JpdGluZyB0aGUgbmV4dCBsaW5lcyBpcworICAgICAgIGNvbXBpbGVkIGJldHRlciBieSBHQ0MgdGhhbiBhbnkgb3RoZXIgd2F5IEkgdHJpZWQuICovCisgICAgKChsb25nKikodikpWzBdID0gdGJ1OworICAgICgobG9uZyopKHYpKVsxXSA9IHRiOwogfQogCiAjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQpAQCAtNzcsMTcgKzc3LDE3IEBACiAjZW5kaWYKIAogdm9pZCBkdW1wX3RzYyhpbnQgb3Bjb2RlLCBpbnQgdGlja2VkLCB1aW50NjQgaW5zdDAsIHVpbnQ2NCBpbnN0MSwKLQkgICAgICB1aW50NjQgbG9vcDAsIHVpbnQ2NCBsb29wMSwgdWludDY0IGludHIwLCB1aW50NjQgaW50cjEpCisgICAgICAgICAgICAgIHVpbnQ2NCBsb29wMCwgdWludDY0IGxvb3AxLCB1aW50NjQgaW50cjAsIHVpbnQ2NCBpbnRyMSkKIHsKLQl1aW50NjQgaW50ciwgaW5zdCwgbG9vcDsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOwotCWlmICghdHN0YXRlLT5pbnRlcnAtPnRzY2R1bXApCi0JCXJldHVybjsKLQlpbnRyID0gaW50cjEgLSBpbnRyMDsKLQlpbnN0ID0gaW5zdDEgLSBpbnN0MCAtIGludHI7Ci0JbG9vcCA9IGxvb3AxIC0gbG9vcDAgLSBpbnRyOwotCWZwcmludGYoc3RkZXJyLCAib3Bjb2RlPSUwM2QgdD0lZCBpbnN0PSUwNmxsZCBsb29wPSUwNmxsZFxuIiwKLQkJb3Bjb2RlLCB0aWNrZWQsIGluc3QsIGxvb3ApOworICAgIHVpbnQ2NCBpbnRyLCBpbnN0LCBsb29wOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7CisgICAgaWYgKCF0c3RhdGUtPmludGVycC0+dHNjZHVtcCkKKyAgICAgICAgcmV0dXJuOworICAgIGludHIgPSBpbnRyMSAtIGludHIwOworICAgIGluc3QgPSBpbnN0MSAtIGluc3QwIC0gaW50cjsKKyAgICBsb29wID0gbG9vcDEgLSBsb29wMCAtIGludHI7CisgICAgZnByaW50ZihzdGRlcnIsICJvcGNvZGU9JTAzZCB0PSVkIGluc3Q9JTA2bGxkIGxvb3A9JTA2bGxkXG4iLAorICAgICAgICBvcGNvZGUsIHRpY2tlZCwgaW5zdCwgbG9vcCk7CiB9CiAKICNlbmRpZgpAQCAtOTcsOCArOTcsOCBAQAogCiAjaWZkZWYgUHlfREVCVUcKIC8qIEZvciBkZWJ1Z2dpbmcgdGhlIGludGVycHJldGVyOiAqLwotI2RlZmluZSBMTFRSQUNFICAxCS8qIExvdy1sZXZlbCB0cmFjZSBmZWF0dXJlICovCi0jZGVmaW5lIENIRUNLRVhDIDEJLyogRG91YmxlLWNoZWNrIGV4Y2VwdGlvbiBjaGVja2luZyAqLworI2RlZmluZSBMTFRSQUNFICAxICAgICAgLyogTG93LWxldmVsIHRyYWNlIGZlYXR1cmUgKi8KKyNkZWZpbmUgQ0hFQ0tFWEMgMSAgICAgIC8qIERvdWJsZS1jaGVjayBleGNlcHRpb24gY2hlY2tpbmcgKi8KICNlbmRpZgogCiB0eXBlZGVmIFB5T2JqZWN0ICooKmNhbGxwcm9jKShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKQEAgLTExMyw3ICsxMTMsNyBAQAogc3RhdGljIFB5T2JqZWN0ICogZG9fY2FsbChQeU9iamVjdCAqLCBQeU9iamVjdCAqKiosIGludCwgaW50KTsKIHN0YXRpYyBQeU9iamVjdCAqIGV4dF9kb19jYWxsKFB5T2JqZWN0ICosIFB5T2JqZWN0ICoqKiwgaW50LCBpbnQsIGludCk7CiBzdGF0aWMgUHlPYmplY3QgKiB1cGRhdGVfa2V5d29yZF9hcmdzKFB5T2JqZWN0ICosIGludCwgUHlPYmplY3QgKioqLAotCQkJCSAgICAgIFB5T2JqZWN0ICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIHVwZGF0ZV9zdGFyX2FyZ3MoaW50LCBpbnQsIFB5T2JqZWN0ICosIFB5T2JqZWN0ICoqKik7CiBzdGF0aWMgUHlPYmplY3QgKiBsb2FkX2FyZ3MoUHlPYmplY3QgKioqLCBpbnQpOwogI2RlZmluZSBDQUxMX0ZMQUdfVkFSIDEKQEAgLTEyNCwzOCArMTI0LDM4IEBACiBzdGF0aWMgaW50IHBydHJhY2UoUHlPYmplY3QgKiwgY2hhciAqKTsKICNlbmRpZgogc3RhdGljIGludCBjYWxsX3RyYWNlKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKiwgUHlGcmFtZU9iamVjdCAqLAotCQkgICAgICBpbnQsIFB5T2JqZWN0ICopOworICAgICAgICAgICAgICAgICAgICAgIGludCwgUHlPYmplY3QgKik7CiBzdGF0aWMgaW50IGNhbGxfdHJhY2VfcHJvdGVjdGVkKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKiwKLQkJCQkgUHlGcmFtZU9iamVjdCAqLCBpbnQsIFB5T2JqZWN0ICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqLCBpbnQsIFB5T2JqZWN0ICopOwogc3RhdGljIHZvaWQgY2FsbF9leGNfdHJhY2UoUHlfdHJhY2VmdW5jLCBQeU9iamVjdCAqLCBQeUZyYW1lT2JqZWN0ICopOwogc3RhdGljIGludCBtYXliZV9jYWxsX2xpbmVfdHJhY2UoUHlfdHJhY2VmdW5jLCBQeU9iamVjdCAqLAotCQkJCSAgUHlGcmFtZU9iamVjdCAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICosIGludCAqLCBpbnQgKiwgaW50ICopOwogCiBzdGF0aWMgUHlPYmplY3QgKiBhcHBseV9zbGljZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgYXNzaWduX3NsaWNlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0JCQlQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIFB5T2JqZWN0ICogY21wX291dGNvbWUoaW50LCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIGltcG9ydF9mcm9tKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIGludCBpbXBvcnRfYWxsX2Zyb20oUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgUHlPYmplY3QgKiBidWlsZF9jbGFzcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgZXhlY19zdGF0ZW1lbnQoUHlGcmFtZU9iamVjdCAqLAotCQkJICBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgdm9pZCBzZXRfZXhjX2luZm8oUHlUaHJlYWRTdGF0ZSAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyB2b2lkIHJlc2V0X2V4Y19pbmZvKFB5VGhyZWFkU3RhdGUgKik7CiBzdGF0aWMgdm9pZCBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeU9iamVjdCAqLCBjaGFyICosIFB5T2JqZWN0ICopOwogc3RhdGljIFB5T2JqZWN0ICogc3RyaW5nX2NvbmNhdGVuYXRlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0JCQkJICAgIFB5RnJhbWVPYmplY3QgKiwgdW5zaWduZWQgY2hhciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnJhbWVPYmplY3QgKiwgdW5zaWduZWQgY2hhciAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIGt3ZF9hc19zdHJpbmcoUHlPYmplY3QgKik7CiAKICNkZWZpbmUgTkFNRV9FUlJPUl9NU0cgXAotCSJuYW1lICclLjIwMHMnIGlzIG5vdCBkZWZpbmVkIgorICAgICJuYW1lICclLjIwMHMnIGlzIG5vdCBkZWZpbmVkIgogI2RlZmluZSBHTE9CQUxfTkFNRV9FUlJPUl9NU0cgXAotCSJnbG9iYWwgbmFtZSAnJS4yMDBzJyBpcyBub3QgZGVmaW5lZCIKKyAgICAiZ2xvYmFsIG5hbWUgJyUuMjAwcycgaXMgbm90IGRlZmluZWQiCiAjZGVmaW5lIFVOQk9VTkRMT0NBTF9FUlJPUl9NU0cgXAotCSJsb2NhbCB2YXJpYWJsZSAnJS4yMDBzJyByZWZlcmVuY2VkIGJlZm9yZSBhc3NpZ25tZW50IgorICAgICJsb2NhbCB2YXJpYWJsZSAnJS4yMDBzJyByZWZlcmVuY2VkIGJlZm9yZSBhc3NpZ25tZW50IgogI2RlZmluZSBVTkJPVU5ERlJFRV9FUlJPUl9NU0cgXAotCSJmcmVlIHZhcmlhYmxlICclLjIwMHMnIHJlZmVyZW5jZWQgYmVmb3JlIGFzc2lnbm1lbnQiIFwKLSAgICAgICAgIiBpbiBlbmNsb3Npbmcgc2NvcGUiCisgICAgImZyZWUgdmFyaWFibGUgJyUuMjAwcycgcmVmZXJlbmNlZCBiZWZvcmUgYXNzaWdubWVudCIgXAorICAgICIgaW4gZW5jbG9zaW5nIHNjb3BlIgogCiAvKiBEeW5hbWljIGV4ZWN1dGlvbiBwcm9maWxlICovCiAjaWZkZWYgRFlOQU1JQ19FWEVDVVRJT05fUFJPRklMRQpAQCAtMjA3LDEwICsyMDcsMTAgQEAKIFB5T2JqZWN0ICoKIFB5RXZhbF9HZXRDYWxsU3RhdHMoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaWlpaWlpaWlpIiwKLQkJCSAgICAgcGNhbGxbMF0sIHBjYWxsWzFdLCBwY2FsbFsyXSwgcGNhbGxbM10sCi0JCQkgICAgIHBjYWxsWzRdLCBwY2FsbFs1XSwgcGNhbGxbNl0sIHBjYWxsWzddLAotCQkJICAgICBwY2FsbFs4XSwgcGNhbGxbOV0sIHBjYWxsWzEwXSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaWlpaWlpaWlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwY2FsbFswXSwgcGNhbGxbMV0sIHBjYWxsWzJdLCBwY2FsbFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwY2FsbFs0XSwgcGNhbGxbNV0sIHBjYWxsWzZdLCBwY2FsbFs3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwY2FsbFs4XSwgcGNhbGxbOV0sIHBjYWxsWzEwXSk7CiB9CiAjZWxzZQogI2RlZmluZSBQQ0FMTChPKQpAQCAtMjE4LDggKzIxOCw4IEBACiBQeU9iamVjdCAqCiBQeUV2YWxfR2V0Q2FsbFN0YXRzKFB5T2JqZWN0ICpzZWxmKQogewotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYKIApAQCAtMjM3LDUyICsyMzcsNTIgQEAKIGludAogUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZCh2b2lkKQogewotCXJldHVybiBpbnRlcnByZXRlcl9sb2NrICE9IDA7CisgICAgcmV0dXJuIGludGVycHJldGVyX2xvY2sgIT0gMDsKIH0KIAogdm9pZAogUHlFdmFsX0luaXRUaHJlYWRzKHZvaWQpCiB7Ci0JaWYgKGludGVycHJldGVyX2xvY2spCi0JCXJldHVybjsKLQlpbnRlcnByZXRlcl9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOwotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKLQltYWluX3RocmVhZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBpZiAoaW50ZXJwcmV0ZXJfbG9jaykKKyAgICAgICAgcmV0dXJuOworICAgIGludGVycHJldGVyX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOworICAgIG1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwogfQogCiB2b2lkCiBQeUV2YWxfQWNxdWlyZUxvY2sodm9pZCkKIHsKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOwogfQogCiB2b2lkCiBQeUV2YWxfUmVsZWFzZUxvY2sodm9pZCkKIHsKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soaW50ZXJwcmV0ZXJfbG9jayk7CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGludGVycHJldGVyX2xvY2spOwogfQogCiB2b2lkCiBQeUV2YWxfQWNxdWlyZVRocmVhZChQeVRocmVhZFN0YXRlICp0c3RhdGUpCiB7Ci0JaWYgKHRzdGF0ZSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeUV2YWxfQWNxdWlyZVRocmVhZDogTlVMTCBuZXcgdGhyZWFkIHN0YXRlIik7Ci0JLyogQ2hlY2sgc29tZW9uZSBoYXMgY2FsbGVkIFB5RXZhbF9Jbml0VGhyZWFkcygpIHRvIGNyZWF0ZSB0aGUgbG9jayAqLwotCWFzc2VydChpbnRlcnByZXRlcl9sb2NrKTsKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7Ci0JaWYgKFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpICE9IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoCi0JCQkiUHlFdmFsX0FjcXVpcmVUaHJlYWQ6IG5vbi1OVUxMIG9sZCB0aHJlYWQgc3RhdGUiKTsKKyAgICBpZiAodHN0YXRlID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5RXZhbF9BY3F1aXJlVGhyZWFkOiBOVUxMIG5ldyB0aHJlYWQgc3RhdGUiKTsKKyAgICAvKiBDaGVjayBzb21lb25lIGhhcyBjYWxsZWQgUHlFdmFsX0luaXRUaHJlYWRzKCkgdG8gY3JlYXRlIHRoZSBsb2NrICovCisgICAgYXNzZXJ0KGludGVycHJldGVyX2xvY2spOworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKKyAgICBpZiAoUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSkgIT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICJQeUV2YWxfQWNxdWlyZVRocmVhZDogbm9uLU5VTEwgb2xkIHRocmVhZCBzdGF0ZSIpOwogfQogCiB2b2lkCiBQeUV2YWxfUmVsZWFzZVRocmVhZChQeVRocmVhZFN0YXRlICp0c3RhdGUpCiB7Ci0JaWYgKHRzdGF0ZSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeUV2YWxfUmVsZWFzZVRocmVhZDogTlVMTCB0aHJlYWQgc3RhdGUiKTsKLQlpZiAoUHlUaHJlYWRTdGF0ZV9Td2FwKE5VTEwpICE9IHRzdGF0ZSkKLQkJUHlfRmF0YWxFcnJvcigiUHlFdmFsX1JlbGVhc2VUaHJlYWQ6IHdyb25nIHRocmVhZCBzdGF0ZSIpOwotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbnRlcnByZXRlcl9sb2NrKTsKKyAgICBpZiAodHN0YXRlID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5RXZhbF9SZWxlYXNlVGhyZWFkOiBOVUxMIHRocmVhZCBzdGF0ZSIpOworICAgIGlmIChQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCkgIT0gdHN0YXRlKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeUV2YWxfUmVsZWFzZVRocmVhZDogd3JvbmcgdGhyZWFkIHN0YXRlIik7CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGludGVycHJldGVyX2xvY2spOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIFB5T1NfQWZ0ZXJGb3JrIHRvIGVuc3VyZSB0aGF0IG5ld2x5CkBAIC0yOTMsMzUgKzI5MywzNSBAQAogdm9pZAogUHlFdmFsX1JlSW5pdFRocmVhZHModm9pZCkKIHsKLQlQeU9iamVjdCAqdGhyZWFkaW5nLCAqcmVzdWx0OwotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeU9iamVjdCAqdGhyZWFkaW5nLCAqcmVzdWx0OworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKIAotCWlmICghaW50ZXJwcmV0ZXJfbG9jaykKLQkJcmV0dXJuOwotCS8qWFhYIENhbid0IHVzZSBQeVRocmVhZF9mcmVlX2xvY2sgaGVyZSBiZWNhdXNlIGl0IGRvZXMgdG9vCi0JICBtdWNoIGVycm9yLWNoZWNraW5nLiAgRG9pbmcgdGhpcyBjbGVhbmx5IHdvdWxkIHJlcXVpcmUKLQkgIGFkZGluZyBhIG5ldyBmdW5jdGlvbiB0byBlYWNoIHRocmVhZF8qLmguICBJbnN0ZWFkLCBqdXN0Ci0JICBjcmVhdGUgYSBuZXcgbG9jayBhbmQgd2FzdGUgYSBsaXR0bGUgYml0IG9mIG1lbW9yeSAqLwotCWludGVycHJldGVyX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOwotCW1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIGlmICghaW50ZXJwcmV0ZXJfbG9jaykKKyAgICAgICAgcmV0dXJuOworICAgIC8qWFhYIENhbid0IHVzZSBQeVRocmVhZF9mcmVlX2xvY2sgaGVyZSBiZWNhdXNlIGl0IGRvZXMgdG9vCisgICAgICBtdWNoIGVycm9yLWNoZWNraW5nLiAgRG9pbmcgdGhpcyBjbGVhbmx5IHdvdWxkIHJlcXVpcmUKKyAgICAgIGFkZGluZyBhIG5ldyBmdW5jdGlvbiB0byBlYWNoIHRocmVhZF8qLmguICBJbnN0ZWFkLCBqdXN0CisgICAgICBjcmVhdGUgYSBuZXcgbG9jayBhbmQgd2FzdGUgYSBsaXR0bGUgYml0IG9mIG1lbW9yeSAqLworICAgIGludGVycHJldGVyX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOworICAgIG1haW5fdGhyZWFkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwogCi0JLyogVXBkYXRlIHRoZSB0aHJlYWRpbmcgbW9kdWxlIHdpdGggdGhlIG5ldyBzdGF0ZS4KLQkgKi8KLQl0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCXRocmVhZGluZyA9IFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKHRzdGF0ZS0+aW50ZXJwLT5tb2R1bGVzLAotCQkJCQkgICAgInRocmVhZGluZyIpOwotCWlmICh0aHJlYWRpbmcgPT0gTlVMTCkgewotCQkvKiB0aHJlYWRpbmcgbm90IGltcG9ydGVkICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCXJldHVybjsKLQl9Ci0JcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0aHJlYWRpbmcsICJfYWZ0ZXJfZm9yayIsIE5VTEwpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHRocmVhZGluZyk7Ci0JZWxzZQotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYodGhyZWFkaW5nKTsKKyAgICAvKiBVcGRhdGUgdGhlIHRocmVhZGluZyBtb2R1bGUgd2l0aCB0aGUgbmV3IHN0YXRlLgorICAgICAqLworICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgdGhyZWFkaW5nID0gUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcodHN0YXRlLT5pbnRlcnAtPm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZGluZyIpOworICAgIGlmICh0aHJlYWRpbmcgPT0gTlVMTCkgeworICAgICAgICAvKiB0aHJlYWRpbmcgbm90IGltcG9ydGVkICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZCh0aHJlYWRpbmcsICJfYWZ0ZXJfZm9yayIsIE5VTEwpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHRocmVhZGluZyk7CisgICAgZWxzZQorICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICBQeV9ERUNSRUYodGhyZWFkaW5nKTsKIH0KICNlbmRpZgogCkBAIC0zMzIsMjkgKzMzMiwyOSBAQAogUHlUaHJlYWRTdGF0ZSAqCiBQeUV2YWxfU2F2ZVRocmVhZCh2b2lkKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfU3dhcChOVUxMKTsKLQlpZiAodHN0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5RXZhbF9TYXZlVGhyZWFkOiBOVUxMIHRzdGF0ZSIpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfU3dhcChOVUxMKTsKKyAgICBpZiAodHN0YXRlID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5RXZhbF9TYXZlVGhyZWFkOiBOVUxMIHRzdGF0ZSIpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKGludGVycHJldGVyX2xvY2spCi0JCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbnRlcnByZXRlcl9sb2NrKTsKKyAgICBpZiAoaW50ZXJwcmV0ZXJfbG9jaykKKyAgICAgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGludGVycHJldGVyX2xvY2spOwogI2VuZGlmCi0JcmV0dXJuIHRzdGF0ZTsKKyAgICByZXR1cm4gdHN0YXRlOwogfQogCiB2b2lkCiBQeUV2YWxfUmVzdG9yZVRocmVhZChQeVRocmVhZFN0YXRlICp0c3RhdGUpCiB7Ci0JaWYgKHRzdGF0ZSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeUV2YWxfUmVzdG9yZVRocmVhZDogTlVMTCB0c3RhdGUiKTsKKyAgICBpZiAodHN0YXRlID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5RXZhbF9SZXN0b3JlVGhyZWFkOiBOVUxMIHRzdGF0ZSIpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKGludGVycHJldGVyX2xvY2spIHsKLQkJaW50IGVyciA9IGVycm5vOwotCQlQeVRocmVhZF9hY3F1aXJlX2xvY2soaW50ZXJwcmV0ZXJfbG9jaywgMSk7Ci0JCWVycm5vID0gZXJyOwotCX0KKyAgICBpZiAoaW50ZXJwcmV0ZXJfbG9jaykgeworICAgICAgICBpbnQgZXJyID0gZXJybm87CisgICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKKyAgICAgICAgZXJybm8gPSBlcnI7CisgICAgfQogI2VuZGlmCi0JUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSk7CisgICAgUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSk7CiB9CiAKIApAQCAtMzkyLDggKzM5Miw4IEBACiAKICNkZWZpbmUgTlBFTkRJTkdDQUxMUyAzMgogc3RhdGljIHN0cnVjdCB7Ci0JaW50ICgqZnVuYykodm9pZCAqKTsKLQl2b2lkICphcmc7CisgICAgaW50ICgqZnVuYykodm9pZCAqKTsKKyAgICB2b2lkICphcmc7CiB9IHBlbmRpbmdjYWxsc1tOUEVORElOR0NBTExTXTsKIHN0YXRpYyB2b2xhdGlsZSBpbnQgcGVuZGluZ2ZpcnN0ID0gMDsKIHN0YXRpYyB2b2xhdGlsZSBpbnQgcGVuZGluZ2xhc3QgPSAwOwpAQCAtNDAyLDYxICs0MDIsNjEgQEAKIGludAogUHlfQWRkUGVuZGluZ0NhbGwoaW50ICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCXN0YXRpYyB2b2xhdGlsZSBpbnQgYnVzeSA9IDA7Ci0JaW50IGksIGo7Ci0JLyogWFhYIEJlZ2luIGNyaXRpY2FsIHNlY3Rpb24gKi8KLQkvKiBYWFggSWYgeW91IHdhbnQgdGhpcyB0byBiZSBzYWZlIGFnYWluc3QgbmVzdGVkCi0JICAgWFhYIGFzeW5jaHJvbm91cyBjYWxscywgeW91J2xsIGhhdmUgdG8gd29yayBoYXJkZXIhICovCi0JaWYgKGJ1c3kpCi0JCXJldHVybiAtMTsKLQlidXN5ID0gMTsKLQlpID0gcGVuZGluZ2xhc3Q7Ci0JaiA9IChpICsgMSkgJSBOUEVORElOR0NBTExTOwotCWlmIChqID09IHBlbmRpbmdmaXJzdCkgewotCQlidXN5ID0gMDsKLQkJcmV0dXJuIC0xOyAvKiBRdWV1ZSBmdWxsICovCi0JfQotCXBlbmRpbmdjYWxsc1tpXS5mdW5jID0gZnVuYzsKLQlwZW5kaW5nY2FsbHNbaV0uYXJnID0gYXJnOwotCXBlbmRpbmdsYXN0ID0gajsKKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50IGJ1c3kgPSAwOworICAgIGludCBpLCBqOworICAgIC8qIFhYWCBCZWdpbiBjcml0aWNhbCBzZWN0aW9uICovCisgICAgLyogWFhYIElmIHlvdSB3YW50IHRoaXMgdG8gYmUgc2FmZSBhZ2FpbnN0IG5lc3RlZAorICAgICAgIFhYWCBhc3luY2hyb25vdXMgY2FsbHMsIHlvdSdsbCBoYXZlIHRvIHdvcmsgaGFyZGVyISAqLworICAgIGlmIChidXN5KQorICAgICAgICByZXR1cm4gLTE7CisgICAgYnVzeSA9IDE7CisgICAgaSA9IHBlbmRpbmdsYXN0OworICAgIGogPSAoaSArIDEpICUgTlBFTkRJTkdDQUxMUzsKKyAgICBpZiAoaiA9PSBwZW5kaW5nZmlyc3QpIHsKKyAgICAgICAgYnVzeSA9IDA7CisgICAgICAgIHJldHVybiAtMTsgLyogUXVldWUgZnVsbCAqLworICAgIH0KKyAgICBwZW5kaW5nY2FsbHNbaV0uZnVuYyA9IGZ1bmM7CisgICAgcGVuZGluZ2NhbGxzW2ldLmFyZyA9IGFyZzsKKyAgICBwZW5kaW5nbGFzdCA9IGo7CiAKLQlfUHlfVGlja2VyID0gMDsKLQl0aGluZ3NfdG9fZG8gPSAxOyAvKiBTaWduYWwgbWFpbiBsb29wICovCi0JYnVzeSA9IDA7Ci0JLyogWFhYIEVuZCBjcml0aWNhbCBzZWN0aW9uICovCi0JcmV0dXJuIDA7CisgICAgX1B5X1RpY2tlciA9IDA7CisgICAgdGhpbmdzX3RvX2RvID0gMTsgLyogU2lnbmFsIG1haW4gbG9vcCAqLworICAgIGJ1c3kgPSAwOworICAgIC8qIFhYWCBFbmQgY3JpdGljYWwgc2VjdGlvbiAqLworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5X01ha2VQZW5kaW5nQ2FsbHModm9pZCkKIHsKLQlzdGF0aWMgaW50IGJ1c3kgPSAwOworICAgIHN0YXRpYyBpbnQgYnVzeSA9IDA7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAobWFpbl90aHJlYWQgJiYgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKQotCQlyZXR1cm4gMDsKKyAgICBpZiAobWFpbl90aHJlYWQgJiYgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpICE9IG1haW5fdGhyZWFkKQorICAgICAgICByZXR1cm4gMDsKICNlbmRpZgotCWlmIChidXN5KQotCQlyZXR1cm4gMDsKLQlidXN5ID0gMTsKLQl0aGluZ3NfdG9fZG8gPSAwOwotCWZvciAoOzspIHsKLQkJaW50IGk7Ci0JCWludCAoKmZ1bmMpKHZvaWQgKik7Ci0JCXZvaWQgKmFyZzsKLQkJaSA9IHBlbmRpbmdmaXJzdDsKLQkJaWYgKGkgPT0gcGVuZGluZ2xhc3QpCi0JCQlicmVhazsgLyogUXVldWUgZW1wdHkgKi8KLQkJZnVuYyA9IHBlbmRpbmdjYWxsc1tpXS5mdW5jOwotCQlhcmcgPSBwZW5kaW5nY2FsbHNbaV0uYXJnOwotCQlwZW5kaW5nZmlyc3QgPSAoaSArIDEpICUgTlBFTkRJTkdDQUxMUzsKLQkJaWYgKGZ1bmMoYXJnKSA8IDApIHsKLQkJCWJ1c3kgPSAwOwotCQkJdGhpbmdzX3RvX2RvID0gMTsgLyogV2UncmUgbm90IGRvbmUgeWV0ICovCi0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JYnVzeSA9IDA7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGJ1c3kpCisgICAgICAgIHJldHVybiAwOworICAgIGJ1c3kgPSAxOworICAgIHRoaW5nc190b19kbyA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50ICgqZnVuYykodm9pZCAqKTsKKyAgICAgICAgdm9pZCAqYXJnOworICAgICAgICBpID0gcGVuZGluZ2ZpcnN0OworICAgICAgICBpZiAoaSA9PSBwZW5kaW5nbGFzdCkKKyAgICAgICAgICAgIGJyZWFrOyAvKiBRdWV1ZSBlbXB0eSAqLworICAgICAgICBmdW5jID0gcGVuZGluZ2NhbGxzW2ldLmZ1bmM7CisgICAgICAgIGFyZyA9IHBlbmRpbmdjYWxsc1tpXS5hcmc7CisgICAgICAgIHBlbmRpbmdmaXJzdCA9IChpICsgMSkgJSBOUEVORElOR0NBTExTOworICAgICAgICBpZiAoZnVuYyhhcmcpIDwgMCkgeworICAgICAgICAgICAgYnVzeSA9IDA7CisgICAgICAgICAgICB0aGluZ3NfdG9fZG8gPSAxOyAvKiBXZSdyZSBub3QgZG9uZSB5ZXQgKi8KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBidXN5ID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC00NzEsMTQgKzQ3MSwxNCBAQAogaW50CiBQeV9HZXRSZWN1cnNpb25MaW1pdCh2b2lkKQogewotCXJldHVybiByZWN1cnNpb25fbGltaXQ7CisgICAgcmV0dXJuIHJlY3Vyc2lvbl9saW1pdDsKIH0KIAogdm9pZAogUHlfU2V0UmVjdXJzaW9uTGltaXQoaW50IG5ld19saW1pdCkKIHsKLQlyZWN1cnNpb25fbGltaXQgPSBuZXdfbGltaXQ7Ci0JX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQgPSByZWN1cnNpb25fbGltaXQ7CisgICAgcmVjdXJzaW9uX2xpbWl0ID0gbmV3X2xpbWl0OworICAgIF9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0ID0gcmVjdXJzaW9uX2xpbWl0OwogfQogCiAvKiB0aGUgbWFjcm8gUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCkgb25seSBjYWxscyBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsKCkKQEAgLTQ4OSwzNSArNDg5LDM1IEBACiBpbnQKIF9QeV9DaGVja1JlY3Vyc2l2ZUNhbGwoY2hhciAqd2hlcmUpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwogCiAjaWZkZWYgVVNFX1NUQUNLQ0hFQ0sKLQlpZiAoUHlPU19DaGVja1N0YWNrKCkpIHsKLQkJLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAiU3RhY2sgb3ZlcmZsb3ciKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBpZiAoUHlPU19DaGVja1N0YWNrKCkpIHsKKyAgICAgICAgLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAiU3RhY2sgb3ZlcmZsb3ciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICNlbmRpZgotCWlmICh0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aCA+IHJlY3Vyc2lvbl9saW1pdCkgewotCQktLXRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgICAibWF4aW11bSByZWN1cnNpb24gZGVwdGggZXhjZWVkZWQlcyIsCi0JCQkgICAgIHdoZXJlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCA9IHJlY3Vyc2lvbl9saW1pdDsKLQlyZXR1cm4gMDsKKyAgICBpZiAodHN0YXRlLT5yZWN1cnNpb25fZGVwdGggPiByZWN1cnNpb25fbGltaXQpIHsKKyAgICAgICAgLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCBleGNlZWRlZCVzIiwKKyAgICAgICAgICAgICAgICAgICAgIHdoZXJlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCA9IHJlY3Vyc2lvbl9saW1pdDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogU3RhdHVzIGNvZGUgZm9yIG1haW4gbG9vcCAocmVhc29uIGZvciBzdGFjayB1bndpbmQpICovCiBlbnVtIHdoeV9jb2RlIHsKLQkJV0hZX05PVCA9CTB4MDAwMSwJLyogTm8gZXJyb3IgKi8KLQkJV0hZX0VYQ0VQVElPTiA9IDB4MDAwMiwJLyogRXhjZXB0aW9uIG9jY3VycmVkICovCi0JCVdIWV9SRVJBSVNFID0JMHgwMDA0LAkvKiBFeGNlcHRpb24gcmUtcmFpc2VkIGJ5ICdmaW5hbGx5JyAqLwotCQlXSFlfUkVUVVJOID0JMHgwMDA4LAkvKiAncmV0dXJuJyBzdGF0ZW1lbnQgKi8KLQkJV0hZX0JSRUFLID0JMHgwMDEwLAkvKiAnYnJlYWsnIHN0YXRlbWVudCAqLwotCQlXSFlfQ09OVElOVUUgPQkweDAwMjAsCS8qICdjb250aW51ZScgc3RhdGVtZW50ICovCi0JCVdIWV9ZSUVMRCA9CTB4MDA0MAkvKiAneWllbGQnIG9wZXJhdG9yICovCisgICAgICAgICAgICAgICAgV0hZX05PVCA9ICAgICAgIDB4MDAwMSwgLyogTm8gZXJyb3IgKi8KKyAgICAgICAgV0hZX0VYQ0VQVElPTiA9IDB4MDAwMiwgICAgICAgICAvKiBFeGNlcHRpb24gb2NjdXJyZWQgKi8KKyAgICAgICAgV0hZX1JFUkFJU0UgPSAgICAgICAgICAgMHgwMDA0LCAvKiBFeGNlcHRpb24gcmUtcmFpc2VkIGJ5ICdmaW5hbGx5JyAqLworICAgICAgICBXSFlfUkVUVVJOID0gICAgICAgICAgICAweDAwMDgsIC8qICdyZXR1cm4nIHN0YXRlbWVudCAqLworICAgICAgICBXSFlfQlJFQUsgPSAgICAgICAgICAgICAweDAwMTAsIC8qICdicmVhaycgc3RhdGVtZW50ICovCisgICAgICAgIFdIWV9DT05USU5VRSA9ICAgICAgICAgIDB4MDAyMCwgLyogJ2NvbnRpbnVlJyBzdGF0ZW1lbnQgKi8KKyAgICAgICAgV0hZX1lJRUxEID0gICAgICAgICAgICAgMHgwMDQwICAvKiAneWllbGQnIG9wZXJhdG9yICovCiB9OwogCiBzdGF0aWMgZW51bSB3aHlfY29kZSBkb19yYWlzZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKQEAgLTUzOCwxMiArNTM4LDEyIEBACiBQeU9iamVjdCAqCiBQeUV2YWxfRXZhbENvZGUoUHlDb2RlT2JqZWN0ICpjbywgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMpCiB7Ci0JcmV0dXJuIFB5RXZhbF9FdmFsQ29kZUV4KGNvLAotCQkJICBnbG9iYWxzLCBsb2NhbHMsCi0JCQkgIChQeU9iamVjdCAqKilOVUxMLCAwLAotCQkJICAoUHlPYmplY3QgKiopTlVMTCwgMCwKLQkJCSAgKFB5T2JqZWN0ICoqKU5VTEwsIDAsCi0JCQkgIE5VTEwpOworICAgIHJldHVybiBQeUV2YWxfRXZhbENvZGVFeChjbywKKyAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzLCBsb2NhbHMsCisgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICoqKU5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICoqKU5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICoqKU5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiB9CiAKIApAQCAtNTUxLDUwICs1NTEsNTAgQEAKIAogUHlPYmplY3QgKgogUHlFdmFsX0V2YWxGcmFtZShQeUZyYW1lT2JqZWN0ICpmKSB7Ci0JLyogVGhpcyBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4dGVuc2lvbiBtb2R1bGVzIHRoYXQKLSAgICAgICAgICAgdXNlZCB0aGlzIEFQSTsgY29yZSBpbnRlcnByZXRlciBjb2RlIHNob3VsZCBjYWxsCi0gICAgICAgICAgIFB5RXZhbF9FdmFsRnJhbWVFeCgpICovCi0JcmV0dXJuIFB5RXZhbF9FdmFsRnJhbWVFeChmLCAwKTsKKyAgICAvKiBUaGlzIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdAorICAgICAgIHVzZWQgdGhpcyBBUEk7IGNvcmUgaW50ZXJwcmV0ZXIgY29kZSBzaG91bGQgY2FsbAorICAgICAgIFB5RXZhbF9FdmFsRnJhbWVFeCgpICovCisgICAgcmV0dXJuIFB5RXZhbF9FdmFsRnJhbWVFeChmLCAwKTsKIH0KIAogUHlPYmplY3QgKgogUHlFdmFsX0V2YWxGcmFtZUV4KFB5RnJhbWVPYmplY3QgKmYsIGludCB0aHJvd2ZsYWcpCiB7CiAjaWZkZWYgRFhQQUlSUwotCWludCBsYXN0b3Bjb2RlID0gMDsKKyAgICBpbnQgbGFzdG9wY29kZSA9IDA7CiAjZW5kaWYKLQlyZWdpc3RlciBQeU9iamVjdCAqKnN0YWNrX3BvaW50ZXI7ICAvKiBOZXh0IGZyZWUgc2xvdCBpbiB2YWx1ZSBzdGFjayAqLwotCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm5leHRfaW5zdHI7Ci0JcmVnaXN0ZXIgaW50IG9wY29kZTsJLyogQ3VycmVudCBvcGNvZGUgKi8KLQlyZWdpc3RlciBpbnQgb3Bhcmc7CS8qIEN1cnJlbnQgb3Bjb2RlIGFyZ3VtZW50LCBpZiBhbnkgKi8KLQlyZWdpc3RlciBlbnVtIHdoeV9jb2RlIHdoeTsgLyogUmVhc29uIGZvciBibG9jayBzdGFjayB1bndpbmQgKi8KLQlyZWdpc3RlciBpbnQgZXJyOwkvKiBFcnJvciBzdGF0dXMgLS0gbm9uemVybyBpZiBlcnJvciAqLwotCXJlZ2lzdGVyIFB5T2JqZWN0ICp4OwkvKiBSZXN1bHQgb2JqZWN0IC0tIE5VTEwgaWYgZXJyb3IgKi8KLQlyZWdpc3RlciBQeU9iamVjdCAqdjsJLyogVGVtcG9yYXJ5IG9iamVjdHMgcG9wcGVkIG9mZiBzdGFjayAqLwotCXJlZ2lzdGVyIFB5T2JqZWN0ICp3OwotCXJlZ2lzdGVyIFB5T2JqZWN0ICp1OwotCXJlZ2lzdGVyIFB5T2JqZWN0ICp0OwotCXJlZ2lzdGVyIFB5T2JqZWN0ICpzdHJlYW0gPSBOVUxMOyAgICAvKiBmb3IgUFJJTlQgb3Bjb2RlcyAqLwotCXJlZ2lzdGVyIFB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipmcmVldmFyczsKLQlQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsJLyogUmV0dXJuIHZhbHVlICovCi0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeUNvZGVPYmplY3QgKmNvOworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICoqc3RhY2tfcG9pbnRlcjsgIC8qIE5leHQgZnJlZSBzbG90IGluIHZhbHVlIHN0YWNrICovCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqbmV4dF9pbnN0cjsKKyAgICByZWdpc3RlciBpbnQgb3Bjb2RlOyAgICAgICAgLyogQ3VycmVudCBvcGNvZGUgKi8KKyAgICByZWdpc3RlciBpbnQgb3Bhcmc7ICAgICAgICAgLyogQ3VycmVudCBvcGNvZGUgYXJndW1lbnQsIGlmIGFueSAqLworICAgIHJlZ2lzdGVyIGVudW0gd2h5X2NvZGUgd2h5OyAvKiBSZWFzb24gZm9yIGJsb2NrIHN0YWNrIHVud2luZCAqLworICAgIHJlZ2lzdGVyIGludCBlcnI7ICAgICAgICAgICAvKiBFcnJvciBzdGF0dXMgLS0gbm9uemVybyBpZiBlcnJvciAqLworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp4OyAgICAgICAvKiBSZXN1bHQgb2JqZWN0IC0tIE5VTEwgaWYgZXJyb3IgKi8KKyAgICByZWdpc3RlciBQeU9iamVjdCAqdjsgICAgICAgLyogVGVtcG9yYXJ5IG9iamVjdHMgcG9wcGVkIG9mZiBzdGFjayAqLworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp3OworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp1OworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICp0OworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpzdHJlYW0gPSBOVUxMOyAgICAvKiBmb3IgUFJJTlQgb3Bjb2RlcyAqLworICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipmcmVldmFyczsKKyAgICBQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsgICAgICAgICAgICAvKiBSZXR1cm4gdmFsdWUgKi8KKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5Q29kZU9iamVjdCAqY287CiAKLQkvKiB3aGVuIHRyYWNpbmcgd2Ugc2V0IHRoaW5ncyB1cCBzbyB0aGF0CisgICAgLyogd2hlbiB0cmFjaW5nIHdlIHNldCB0aGluZ3MgdXAgc28gdGhhdAogCi0gICAgICAgICAgICAgICBub3QgKGluc3RyX2xiIDw9IGN1cnJlbnRfYnl0ZWNvZGVfb2Zmc2V0IDwgaW5zdHJfdWIpCisgICAgICAgICAgIG5vdCAoaW5zdHJfbGIgPD0gY3VycmVudF9ieXRlY29kZV9vZmZzZXQgPCBpbnN0cl91YikKIAotCSAgIGlzIHRydWUgd2hlbiB0aGUgbGluZSBiZWluZyBleGVjdXRlZCBoYXMgY2hhbmdlZC4gIFRoZQotICAgICAgICAgICBpbml0aWFsIHZhbHVlcyBhcmUgc3VjaCBhcyB0byBtYWtlIHRoaXMgZmFsc2UgdGhlIGZpcnN0Ci0gICAgICAgICAgIHRpbWUgaXQgaXMgdGVzdGVkLiAqLwotCWludCBpbnN0cl91YiA9IC0xLCBpbnN0cl9sYiA9IDAsIGluc3RyX3ByZXYgPSAtMTsKKyAgICAgICBpcyB0cnVlIHdoZW4gdGhlIGxpbmUgYmVpbmcgZXhlY3V0ZWQgaGFzIGNoYW5nZWQuICBUaGUKKyAgICAgICBpbml0aWFsIHZhbHVlcyBhcmUgc3VjaCBhcyB0byBtYWtlIHRoaXMgZmFsc2UgdGhlIGZpcnN0CisgICAgICAgdGltZSBpdCBpcyB0ZXN0ZWQuICovCisgICAgaW50IGluc3RyX3ViID0gLTEsIGluc3RyX2xiID0gMCwgaW5zdHJfcHJldiA9IC0xOwogCi0JdW5zaWduZWQgY2hhciAqZmlyc3RfaW5zdHI7Ci0JUHlPYmplY3QgKm5hbWVzOwotCVB5T2JqZWN0ICpjb25zdHM7CisgICAgdW5zaWduZWQgY2hhciAqZmlyc3RfaW5zdHI7CisgICAgUHlPYmplY3QgKm5hbWVzOworICAgIFB5T2JqZWN0ICpjb25zdHM7CiAjaWYgZGVmaW5lZChQeV9ERUJVRykgfHwgZGVmaW5lZChMTFRSQUNFKQotCS8qIE1ha2UgaXQgZWFzaWVyIHRvIGZpbmQgb3V0IHdoZXJlIHdlIGFyZSB3aXRoIGEgZGVidWdnZXIgKi8KLQljaGFyICpmaWxlbmFtZTsKKyAgICAvKiBNYWtlIGl0IGVhc2llciB0byBmaW5kIG91dCB3aGVyZSB3ZSBhcmUgd2l0aCBhIGRlYnVnZ2VyICovCisgICAgY2hhciAqZmlsZW5hbWU7CiAjZW5kaWYKIAogLyogVHVwbGUgYWNjZXNzIG1hY3JvcyAqLwpAQCAtNjM0LDk4ICs2MzQsOTggQEAKICAgIENBTExfRlVOQ1RJT04gKGFuZCBmcmllbmRzKQogCiAgKi8KLQl1aW50NjQgaW5zdDAsIGluc3QxLCBsb29wMCwgbG9vcDEsIGludHIwID0gMCwgaW50cjEgPSAwOwotCWludCB0aWNrZWQgPSAwOworICAgIHVpbnQ2NCBpbnN0MCwgaW5zdDEsIGxvb3AwLCBsb29wMSwgaW50cjAgPSAwLCBpbnRyMSA9IDA7CisgICAgaW50IHRpY2tlZCA9IDA7CiAKLQlSRUFEX1RJTUVTVEFNUChpbnN0MCk7Ci0JUkVBRF9USU1FU1RBTVAoaW5zdDEpOwotCVJFQURfVElNRVNUQU1QKGxvb3AwKTsKLQlSRUFEX1RJTUVTVEFNUChsb29wMSk7CisgICAgUkVBRF9USU1FU1RBTVAoaW5zdDApOworICAgIFJFQURfVElNRVNUQU1QKGluc3QxKTsKKyAgICBSRUFEX1RJTUVTVEFNUChsb29wMCk7CisgICAgUkVBRF9USU1FU1RBTVAobG9vcDEpOwogCi0JLyogc2h1dCB1cCB0aGUgY29tcGlsZXIgKi8KLQlvcGNvZGUgPSAwOworICAgIC8qIHNodXQgdXAgdGhlIGNvbXBpbGVyICovCisgICAgb3Bjb2RlID0gMDsKICNlbmRpZgogCiAvKiBDb2RlIGFjY2VzcyBtYWNyb3MgKi8KIAotI2RlZmluZSBJTlNUUl9PRkZTRVQoKQkoKGludCkobmV4dF9pbnN0ciAtIGZpcnN0X2luc3RyKSkKLSNkZWZpbmUgTkVYVE9QKCkJKCpuZXh0X2luc3RyKyspCi0jZGVmaW5lIE5FWFRBUkcoKQkobmV4dF9pbnN0ciArPSAyLCAobmV4dF9pbnN0clstMV08PDgpICsgbmV4dF9pbnN0clstMl0pCi0jZGVmaW5lIFBFRUtBUkcoKQkoKG5leHRfaW5zdHJbMl08PDgpICsgbmV4dF9pbnN0clsxXSkKLSNkZWZpbmUgSlVNUFRPKHgpCShuZXh0X2luc3RyID0gZmlyc3RfaW5zdHIgKyAoeCkpCi0jZGVmaW5lIEpVTVBCWSh4KQkobmV4dF9pbnN0ciArPSAoeCkpCisjZGVmaW5lIElOU1RSX09GRlNFVCgpICAoKGludCkobmV4dF9pbnN0ciAtIGZpcnN0X2luc3RyKSkKKyNkZWZpbmUgTkVYVE9QKCkgICAgICAgICgqbmV4dF9pbnN0cisrKQorI2RlZmluZSBORVhUQVJHKCkgICAgICAgKG5leHRfaW5zdHIgKz0gMiwgKG5leHRfaW5zdHJbLTFdPDw4KSArIG5leHRfaW5zdHJbLTJdKQorI2RlZmluZSBQRUVLQVJHKCkgICAgICAgKChuZXh0X2luc3RyWzJdPDw4KSArIG5leHRfaW5zdHJbMV0pCisjZGVmaW5lIEpVTVBUTyh4KSAgICAgICAobmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyICsgKHgpKQorI2RlZmluZSBKVU1QQlkoeCkgICAgICAgKG5leHRfaW5zdHIgKz0gKHgpKQogCiAvKiBPcENvZGUgcHJlZGljdGlvbiBtYWNyb3MKLQlTb21lIG9wY29kZXMgdGVuZCB0byBjb21lIGluIHBhaXJzIHRodXMgbWFraW5nIGl0IHBvc3NpYmxlIHRvCi0JcHJlZGljdCB0aGUgc2Vjb25kIGNvZGUgd2hlbiB0aGUgZmlyc3QgaXMgcnVuLiAgRm9yIGV4YW1wbGUsCi0JQ09NUEFSRV9PUCBpcyBvZnRlbiBmb2xsb3dlZCBieSBKVU1QX0lGX0ZBTFNFIG9yIEpVTVBfSUZfVFJVRS4gIEFuZCwKLQl0aG9zZSBvcGNvZGVzIGFyZSBvZnRlbiBmb2xsb3dlZCBieSBhIFBPUF9UT1AuCisgICAgU29tZSBvcGNvZGVzIHRlbmQgdG8gY29tZSBpbiBwYWlycyB0aHVzIG1ha2luZyBpdCBwb3NzaWJsZSB0bworICAgIHByZWRpY3QgdGhlIHNlY29uZCBjb2RlIHdoZW4gdGhlIGZpcnN0IGlzIHJ1bi4gIEZvciBleGFtcGxlLAorICAgIENPTVBBUkVfT1AgaXMgb2Z0ZW4gZm9sbG93ZWQgYnkgSlVNUF9JRl9GQUxTRSBvciBKVU1QX0lGX1RSVUUuICBBbmQsCisgICAgdGhvc2Ugb3Bjb2RlcyBhcmUgb2Z0ZW4gZm9sbG93ZWQgYnkgYSBQT1BfVE9QLgogCi0JVmVyaWZ5aW5nIHRoZSBwcmVkaWN0aW9uIGNvc3RzIGEgc2luZ2xlIGhpZ2gtc3BlZWQgdGVzdCBvZiBhIHJlZ2lzdGVyCi0JdmFyaWFibGUgYWdhaW5zdCBhIGNvbnN0YW50LiAgSWYgdGhlIHBhaXJpbmcgd2FzIGdvb2QsIHRoZW4gdGhlCi0JcHJvY2Vzc29yJ3Mgb3duIGludGVybmFsIGJyYW5jaCBwcmVkaWNhdGlvbiBoYXMgYSBoaWdoIGxpa2VsaWhvb2Qgb2YKLQlzdWNjZXNzLCByZXN1bHRpbmcgaW4gYSBuZWFybHkgemVyby1vdmVyaGVhZCB0cmFuc2l0aW9uIHRvIHRoZQotCW5leHQgb3Bjb2RlLiAgQSBzdWNjZXNzZnVsIHByZWRpY3Rpb24gc2F2ZXMgYSB0cmlwIHRocm91Z2ggdGhlIGV2YWwtbG9vcAotCWluY2x1ZGluZyBpdHMgdHdvIHVucHJlZGljdGFibGUgYnJhbmNoZXMsIHRoZSBIQVNfQVJHIHRlc3QgYW5kIHRoZQotCXN3aXRjaC1jYXNlLiAgQ29tYmluZWQgd2l0aCB0aGUgcHJvY2Vzc29yJ3MgaW50ZXJuYWwgYnJhbmNoIHByZWRpY3Rpb24sCi0JYSBzdWNjZXNzZnVsIFBSRURJQ1QgaGFzIHRoZSBlZmZlY3Qgb2YgbWFraW5nIHRoZSB0d28gb3Bjb2RlcyBydW4gYXMgaWYKLQl0aGV5IHdlcmUgYSBzaW5nbGUgbmV3IG9wY29kZSB3aXRoIHRoZSBib2RpZXMgY29tYmluZWQuCisgICAgVmVyaWZ5aW5nIHRoZSBwcmVkaWN0aW9uIGNvc3RzIGEgc2luZ2xlIGhpZ2gtc3BlZWQgdGVzdCBvZiBhIHJlZ2lzdGVyCisgICAgdmFyaWFibGUgYWdhaW5zdCBhIGNvbnN0YW50LiAgSWYgdGhlIHBhaXJpbmcgd2FzIGdvb2QsIHRoZW4gdGhlCisgICAgcHJvY2Vzc29yJ3Mgb3duIGludGVybmFsIGJyYW5jaCBwcmVkaWNhdGlvbiBoYXMgYSBoaWdoIGxpa2VsaWhvb2Qgb2YKKyAgICBzdWNjZXNzLCByZXN1bHRpbmcgaW4gYSBuZWFybHkgemVyby1vdmVyaGVhZCB0cmFuc2l0aW9uIHRvIHRoZQorICAgIG5leHQgb3Bjb2RlLiAgQSBzdWNjZXNzZnVsIHByZWRpY3Rpb24gc2F2ZXMgYSB0cmlwIHRocm91Z2ggdGhlIGV2YWwtbG9vcAorICAgIGluY2x1ZGluZyBpdHMgdHdvIHVucHJlZGljdGFibGUgYnJhbmNoZXMsIHRoZSBIQVNfQVJHIHRlc3QgYW5kIHRoZQorICAgIHN3aXRjaC1jYXNlLiAgQ29tYmluZWQgd2l0aCB0aGUgcHJvY2Vzc29yJ3MgaW50ZXJuYWwgYnJhbmNoIHByZWRpY3Rpb24sCisgICAgYSBzdWNjZXNzZnVsIFBSRURJQ1QgaGFzIHRoZSBlZmZlY3Qgb2YgbWFraW5nIHRoZSB0d28gb3Bjb2RlcyBydW4gYXMgaWYKKyAgICB0aGV5IHdlcmUgYSBzaW5nbGUgbmV3IG9wY29kZSB3aXRoIHRoZSBib2RpZXMgY29tYmluZWQuCiAKICAgICBJZiBjb2xsZWN0aW5nIG9wY29kZSBzdGF0aXN0aWNzLCB5b3VyIGNob2ljZXMgYXJlIHRvIGVpdGhlciBrZWVwIHRoZQotCXByZWRpY3Rpb25zIHR1cm5lZC1vbiBhbmQgaW50ZXJwcmV0IHRoZSByZXN1bHRzIGFzIGlmIHNvbWUgb3Bjb2RlcwotCWhhZCBiZWVuIGNvbWJpbmVkIG9yIHR1cm4tb2ZmIHByZWRpY3Rpb25zIHNvIHRoYXQgdGhlIG9wY29kZSBmcmVxdWVuY3kKLQljb3VudGVyIHVwZGF0ZXMgZm9yIGJvdGggb3Bjb2Rlcy4KKyAgICBwcmVkaWN0aW9ucyB0dXJuZWQtb24gYW5kIGludGVycHJldCB0aGUgcmVzdWx0cyBhcyBpZiBzb21lIG9wY29kZXMKKyAgICBoYWQgYmVlbiBjb21iaW5lZCBvciB0dXJuLW9mZiBwcmVkaWN0aW9ucyBzbyB0aGF0IHRoZSBvcGNvZGUgZnJlcXVlbmN5CisgICAgY291bnRlciB1cGRhdGVzIGZvciBib3RoIG9wY29kZXMuCiAqLwogCiAjaWZkZWYgRFlOQU1JQ19FWEVDVVRJT05fUFJPRklMRQotI2RlZmluZSBQUkVESUNUKG9wKQkJaWYgKDApIGdvdG8gUFJFRF8jI29wCisjZGVmaW5lIFBSRURJQ1Qob3ApICAgICAgICAgICAgIGlmICgwKSBnb3RvIFBSRURfIyNvcAogI2Vsc2UKLSNkZWZpbmUgUFJFRElDVChvcCkJCWlmICgqbmV4dF9pbnN0ciA9PSBvcCkgZ290byBQUkVEXyMjb3AKKyNkZWZpbmUgUFJFRElDVChvcCkgICAgICAgICAgICAgaWYgKCpuZXh0X2luc3RyID09IG9wKSBnb3RvIFBSRURfIyNvcAogI2VuZGlmCiAKLSNkZWZpbmUgUFJFRElDVEVEKG9wKQkJUFJFRF8jI29wOiBuZXh0X2luc3RyKysKLSNkZWZpbmUgUFJFRElDVEVEX1dJVEhfQVJHKG9wKQlQUkVEXyMjb3A6IG9wYXJnID0gUEVFS0FSRygpOyBuZXh0X2luc3RyICs9IDMKKyNkZWZpbmUgUFJFRElDVEVEKG9wKSAgICAgICAgICAgUFJFRF8jI29wOiBuZXh0X2luc3RyKysKKyNkZWZpbmUgUFJFRElDVEVEX1dJVEhfQVJHKG9wKSAgUFJFRF8jI29wOiBvcGFyZyA9IFBFRUtBUkcoKTsgbmV4dF9pbnN0ciArPSAzCiAKIC8qIFN0YWNrIG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KIAogLyogVGhlIHN0YWNrIGNhbiBncm93IGF0IG1vc3QgTUFYSU5UIGRlZXAsIGFzIGNvX25sb2NhbHMgYW5kCiAgICBjb19zdGFja3NpemUgYXJlIGludHMuICovCi0jZGVmaW5lIFNUQUNLX0xFVkVMKCkJKChpbnQpKHN0YWNrX3BvaW50ZXIgLSBmLT5mX3ZhbHVlc3RhY2spKQotI2RlZmluZSBFTVBUWSgpCQkoU1RBQ0tfTEVWRUwoKSA9PSAwKQotI2RlZmluZSBUT1AoKQkJKHN0YWNrX3BvaW50ZXJbLTFdKQotI2RlZmluZSBTRUNPTkQoKQkoc3RhY2tfcG9pbnRlclstMl0pCi0jZGVmaW5lIFRISVJEKCkgCShzdGFja19wb2ludGVyWy0zXSkKLSNkZWZpbmUgRk9VUlRIKCkJKHN0YWNrX3BvaW50ZXJbLTRdKQotI2RlZmluZSBTRVRfVE9QKHYpCShzdGFja19wb2ludGVyWy0xXSA9ICh2KSkKLSNkZWZpbmUgU0VUX1NFQ09ORCh2KQkoc3RhY2tfcG9pbnRlclstMl0gPSAodikpCi0jZGVmaW5lIFNFVF9USElSRCh2KQkoc3RhY2tfcG9pbnRlclstM10gPSAodikpCi0jZGVmaW5lIFNFVF9GT1VSVEgodikJKHN0YWNrX3BvaW50ZXJbLTRdID0gKHYpKQotI2RlZmluZSBCQVNJQ19TVEFDS0FESihuKQkoc3RhY2tfcG9pbnRlciArPSBuKQotI2RlZmluZSBCQVNJQ19QVVNIKHYpCSgqc3RhY2tfcG9pbnRlcisrID0gKHYpKQotI2RlZmluZSBCQVNJQ19QT1AoKQkoKi0tc3RhY2tfcG9pbnRlcikKKyNkZWZpbmUgU1RBQ0tfTEVWRUwoKSAgICgoaW50KShzdGFja19wb2ludGVyIC0gZi0+Zl92YWx1ZXN0YWNrKSkKKyNkZWZpbmUgRU1QVFkoKSAgICAgICAgIChTVEFDS19MRVZFTCgpID09IDApCisjZGVmaW5lIFRPUCgpICAgICAgICAgICAoc3RhY2tfcG9pbnRlclstMV0pCisjZGVmaW5lIFNFQ09ORCgpICAgICAgICAoc3RhY2tfcG9pbnRlclstMl0pCisjZGVmaW5lIFRISVJEKCkgICAgICAgICAoc3RhY2tfcG9pbnRlclstM10pCisjZGVmaW5lIEZPVVJUSCgpICAgICAgICAoc3RhY2tfcG9pbnRlclstNF0pCisjZGVmaW5lIFNFVF9UT1AodikgICAgICAoc3RhY2tfcG9pbnRlclstMV0gPSAodikpCisjZGVmaW5lIFNFVF9TRUNPTkQodikgICAoc3RhY2tfcG9pbnRlclstMl0gPSAodikpCisjZGVmaW5lIFNFVF9USElSRCh2KSAgICAoc3RhY2tfcG9pbnRlclstM10gPSAodikpCisjZGVmaW5lIFNFVF9GT1VSVEgodikgICAoc3RhY2tfcG9pbnRlclstNF0gPSAodikpCisjZGVmaW5lIEJBU0lDX1NUQUNLQURKKG4pICAgICAgIChzdGFja19wb2ludGVyICs9IG4pCisjZGVmaW5lIEJBU0lDX1BVU0godikgICAoKnN0YWNrX3BvaW50ZXIrKyA9ICh2KSkKKyNkZWZpbmUgQkFTSUNfUE9QKCkgICAgICgqLS1zdGFja19wb2ludGVyKQogCiAjaWZkZWYgTExUUkFDRQotI2RlZmluZSBQVVNIKHYpCQl7ICh2b2lkKShCQVNJQ19QVVNIKHYpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx0cmFjZSAmJiBwcnRyYWNlKFRPUCgpLCAicHVzaCIpKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChTVEFDS19MRVZFTCgpIDw9IGNvLT5jb19zdGFja3NpemUpOyB9Ci0jZGVmaW5lIFBPUCgpCQkoKHZvaWQpKGxsdHJhY2UgJiYgcHJ0cmFjZShUT1AoKSwgInBvcCIpKSwgXAotCQkJIEJBU0lDX1BPUCgpKQotI2RlZmluZSBTVEFDS0FESihuKQl7ICh2b2lkKShCQVNJQ19TVEFDS0FESihuKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdHJhY2UgJiYgcHJ0cmFjZShUT1AoKSwgInN0YWNrYWRqIikpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFNUQUNLX0xFVkVMKCkgPD0gY28tPmNvX3N0YWNrc2l6ZSk7IH0KKyNkZWZpbmUgUFVTSCh2KSAgICAgICAgIHsgKHZvaWQpKEJBU0lDX1BVU0godiksIFwKKyAgICAgICAgICAgICAgICAgICBsbHRyYWNlICYmIHBydHJhY2UoVE9QKCksICJwdXNoIikpOyBcCisgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFNUQUNLX0xFVkVMKCkgPD0gY28tPmNvX3N0YWNrc2l6ZSk7IH0KKyNkZWZpbmUgUE9QKCkgICAgICAgICAgICgodm9pZCkobGx0cmFjZSAmJiBwcnRyYWNlKFRPUCgpLCAicG9wIikpLCBcCisgICAgICAgICAgICAgQkFTSUNfUE9QKCkpCisjZGVmaW5lIFNUQUNLQURKKG4pICAgICB7ICh2b2lkKShCQVNJQ19TVEFDS0FESihuKSwgXAorICAgICAgICAgICAgICAgICAgIGxsdHJhY2UgJiYgcHJ0cmFjZShUT1AoKSwgInN0YWNrYWRqIikpOyBcCisgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFNUQUNLX0xFVkVMKCkgPD0gY28tPmNvX3N0YWNrc2l6ZSk7IH0KICNkZWZpbmUgRVhUX1BPUChTVEFDS19QT0lOVEVSKSAoKHZvaWQpKGxsdHJhY2UgJiYgXAotCQkJCXBydHJhY2UoKFNUQUNLX1BPSU5URVIpWy0xXSwgImV4dF9wb3AiKSksIFwKLQkJCQkqLS0oU1RBQ0tfUE9JTlRFUikpCisgICAgICAgICAgICAgICAgcHJ0cmFjZSgoU1RBQ0tfUE9JTlRFUilbLTFdLCAiZXh0X3BvcCIpKSwgXAorICAgICAgICAgICAgICAgICotLShTVEFDS19QT0lOVEVSKSkKICNlbHNlCi0jZGVmaW5lIFBVU0godikJCUJBU0lDX1BVU0godikKLSNkZWZpbmUgUE9QKCkJCUJBU0lDX1BPUCgpCi0jZGVmaW5lIFNUQUNLQURKKG4pCUJBU0lDX1NUQUNLQURKKG4pCisjZGVmaW5lIFBVU0godikgICAgICAgICBCQVNJQ19QVVNIKHYpCisjZGVmaW5lIFBPUCgpICAgICAgICAgICBCQVNJQ19QT1AoKQorI2RlZmluZSBTVEFDS0FESihuKSAgICAgQkFTSUNfU1RBQ0tBREoobikKICNkZWZpbmUgRVhUX1BPUChTVEFDS19QT0lOVEVSKSAoKi0tKFNUQUNLX1BPSU5URVIpKQogI2VuZGlmCiAKIC8qIExvY2FsIHZhcmlhYmxlIG1hY3JvcyAqLwogCi0jZGVmaW5lIEdFVExPQ0FMKGkpCShmYXN0bG9jYWxzW2ldKQorI2RlZmluZSBHRVRMT0NBTChpKSAgICAgKGZhc3Rsb2NhbHNbaV0pCiAKIC8qIFRoZSBTRVRMT0NBTCgpIG1hY3JvIG11c3Qgbm90IERFQ1JFRiB0aGUgbG9jYWwgdmFyaWFibGUgaW4tcGxhY2UgYW5kCiAgICB0aGVuIHN0b3JlIHRoZSBuZXcgdmFsdWU7IGl0IG11c3QgY29weSB0aGUgb2xkIHZhbHVlIHRvIGEgdGVtcG9yYXJ5CkBAIC03MzMsMjAyMyArNzMzLDIwMjMgQEAKICAgIFRoaXMgaXMgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0aGF0IGR1cmluZyB0aGUgREVDUkVGIHRoZSBmcmFtZSBpcwogICAgYWNjZXNzZWQgYnkgb3RoZXIgY29kZSAoZS5nLiBhIF9fZGVsX18gbWV0aG9kIG9yIGdjLmNvbGxlY3QoKSkgYW5kIHRoZQogICAgdmFyaWFibGUgd291bGQgYmUgcG9pbnRpbmcgdG8gYWxyZWFkeS1mcmVlZCBtZW1vcnkuICovCi0jZGVmaW5lIFNFVExPQ0FMKGksIHZhbHVlKQlkbyB7IFB5T2JqZWN0ICp0bXAgPSBHRVRMT0NBTChpKTsgXAotCQkJCSAgICAgR0VUTE9DQUwoaSkgPSB2YWx1ZTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodG1wKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgU0VUTE9DQUwoaSwgdmFsdWUpICAgICAgZG8geyBQeU9iamVjdCAqdG1wID0gR0VUTE9DQUwoaSk7IFwKKyAgICAgICAgICAgICAgICAgICAgIEdFVExPQ0FMKGkpID0gdmFsdWU7IFwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodG1wKTsgfSB3aGlsZSAoMCkKIAogLyogU3RhcnQgb2YgY29kZSAqLwogCi0JaWYgKGYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBwdXNoIGZyYW1lICovCi0JaWYgKFB5X0VudGVyUmVjdXJzaXZlQ2FsbCgiIikpCi0JCXJldHVybiBOVUxMOworICAgIC8qIHB1c2ggZnJhbWUgKi8KKyAgICBpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl0c3RhdGUtPmZyYW1lID0gZjsKKyAgICB0c3RhdGUtPmZyYW1lID0gZjsKIAotCWlmICh0c3RhdGUtPnVzZV90cmFjaW5nKSB7Ci0JCWlmICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpIHsKLQkJCS8qIHRzdGF0ZS0+Y190cmFjZWZ1bmMsIGlmIGRlZmluZWQsIGlzIGEKLQkJCSAgIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gKmV2ZXJ5KiBlbnRyeQotCQkJICAgdG8gYSBjb2RlIGJsb2NrLiAgSXRzIHJldHVybiB2YWx1ZSwgaWYgbm90Ci0JCQkgICBOb25lLCBpcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgYXQKLQkJCSAgIHRoZSBzdGFydCBvZiBlYWNoIGV4ZWN1dGVkIGxpbmUgb2YgY29kZS4KLQkJCSAgIChBY3R1YWxseSwgdGhlIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGl0c2VsZgotCQkJICAgaW4gb3JkZXIgdG8gY29udGludWUgdHJhY2luZy4pICBUaGUgdHJhY2UKLQkJCSAgIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdpdGggdGhyZWUgYXJndW1lbnRzOgotCQkJICAgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGZyYW1lLCBhIHN0cmluZwotCQkJICAgaW5kaWNhdGluZyB3aHkgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgYW5kCi0JCQkgICBhbiBhcmd1bWVudCB3aGljaCBkZXBlbmRzIG9uIHRoZSBzaXR1YXRpb24uCi0JCQkgICBUaGUgZ2xvYmFsIHRyYWNlIGZ1bmN0aW9uIGlzIGFsc28gY2FsbGVkCi0JCQkgICB3aGVuZXZlciBhbiBleGNlcHRpb24gaXMgZGV0ZWN0ZWQuICovCi0JCQlpZiAoY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3RyYWNlZnVuYywKLQkJCQkJCSB0c3RhdGUtPmNfdHJhY2VvYmosCi0JCQkJCQkgZiwgUHlUcmFjZV9DQUxMLCBQeV9Ob25lKSkgewotCQkJCS8qIFRyYWNlIGZ1bmN0aW9uIHJhaXNlZCBhbiBlcnJvciAqLwotCQkJCWdvdG8gZXhpdF9ldmFsX2ZyYW1lOwotCQkJfQotCQl9Ci0JCWlmICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkgewotCQkJLyogU2ltaWxhciBmb3IgY19wcm9maWxlZnVuYywgZXhjZXB0IGl0IG5lZWRuJ3QKLQkJCSAgIHJldHVybiBpdHNlbGYgYW5kIGlzbid0IGNhbGxlZCBmb3IgImxpbmUiIGV2ZW50cyAqLwotCQkJaWYgKGNhbGxfdHJhY2VfcHJvdGVjdGVkKHRzdGF0ZS0+Y19wcm9maWxlZnVuYywKLQkJCQkJCSB0c3RhdGUtPmNfcHJvZmlsZW9iaiwKLQkJCQkJCSBmLCBQeVRyYWNlX0NBTEwsIFB5X05vbmUpKSB7Ci0JCQkJLyogUHJvZmlsZSBmdW5jdGlvbiByYWlzZWQgYW4gZXJyb3IgKi8KLQkJCQlnb3RvIGV4aXRfZXZhbF9mcmFtZTsKLQkJCX0KLQkJfQotCX0KKyAgICBpZiAodHN0YXRlLT51c2VfdHJhY2luZykgeworICAgICAgICBpZiAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgICAvKiB0c3RhdGUtPmNfdHJhY2VmdW5jLCBpZiBkZWZpbmVkLCBpcyBhCisgICAgICAgICAgICAgICBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uICpldmVyeSogZW50cnkKKyAgICAgICAgICAgICAgIHRvIGEgY29kZSBibG9jay4gIEl0cyByZXR1cm4gdmFsdWUsIGlmIG5vdAorICAgICAgICAgICAgICAgTm9uZSwgaXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGF0CisgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgZWFjaCBleGVjdXRlZCBsaW5lIG9mIGNvZGUuCisgICAgICAgICAgICAgICAoQWN0dWFsbHksIHRoZSBmdW5jdGlvbiBtdXN0IHJldHVybiBpdHNlbGYKKyAgICAgICAgICAgICAgIGluIG9yZGVyIHRvIGNvbnRpbnVlIHRyYWNpbmcuKSAgVGhlIHRyYWNlCisgICAgICAgICAgICAgICBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBmcmFtZSwgYSBzdHJpbmcKKyAgICAgICAgICAgICAgIGluZGljYXRpbmcgd2h5IHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQsIGFuZAorICAgICAgICAgICAgICAgYW4gYXJndW1lbnQgd2hpY2ggZGVwZW5kcyBvbiB0aGUgc2l0dWF0aW9uLgorICAgICAgICAgICAgICAgVGhlIGdsb2JhbCB0cmFjZSBmdW5jdGlvbiBpcyBhbHNvIGNhbGxlZAorICAgICAgICAgICAgICAgd2hlbmV2ZXIgYW4gZXhjZXB0aW9uIGlzIGRldGVjdGVkLiAqLworICAgICAgICAgICAgaWYgKGNhbGxfdHJhY2VfcHJvdGVjdGVkKHRzdGF0ZS0+Y190cmFjZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5jX3RyYWNlb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsIFB5VHJhY2VfQ0FMTCwgUHlfTm9uZSkpIHsKKyAgICAgICAgICAgICAgICAvKiBUcmFjZSBmdW5jdGlvbiByYWlzZWQgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBnb3RvIGV4aXRfZXZhbF9mcmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIFNpbWlsYXIgZm9yIGNfcHJvZmlsZWZ1bmMsIGV4Y2VwdCBpdCBuZWVkbid0CisgICAgICAgICAgICAgICByZXR1cm4gaXRzZWxmIGFuZCBpc24ndCBjYWxsZWQgZm9yICJsaW5lIiBldmVudHMgKi8KKyAgICAgICAgICAgIGlmIChjYWxsX3RyYWNlX3Byb3RlY3RlZCh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5jX3Byb2ZpbGVvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgUHlUcmFjZV9DQUxMLCBQeV9Ob25lKSkgeworICAgICAgICAgICAgICAgIC8qIFByb2ZpbGUgZnVuY3Rpb24gcmFpc2VkIGFuIGVycm9yICovCisgICAgICAgICAgICAgICAgZ290byBleGl0X2V2YWxfZnJhbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQljbyA9IGYtPmZfY29kZTsKLQluYW1lcyA9IGNvLT5jb19uYW1lczsKLQljb25zdHMgPSBjby0+Y29fY29uc3RzOwotCWZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JZnJlZXZhcnMgPSBmLT5mX2xvY2Fsc3BsdXMgKyBjby0+Y29fbmxvY2FsczsKLQlmaXJzdF9pbnN0ciA9ICh1bnNpZ25lZCBjaGFyKikgUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19jb2RlKTsKLQkvKiBBbiBleHBsYW5hdGlvbiBpcyBpbiBvcmRlciBmb3IgdGhlIG5leHQgbGluZS4KKyAgICBjbyA9IGYtPmZfY29kZTsKKyAgICBuYW1lcyA9IGNvLT5jb19uYW1lczsKKyAgICBjb25zdHMgPSBjby0+Y29fY29uc3RzOworICAgIGZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CisgICAgZnJlZXZhcnMgPSBmLT5mX2xvY2Fsc3BsdXMgKyBjby0+Y29fbmxvY2FsczsKKyAgICBmaXJzdF9pbnN0ciA9ICh1bnNpZ25lZCBjaGFyKikgUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19jb2RlKTsKKyAgICAvKiBBbiBleHBsYW5hdGlvbiBpcyBpbiBvcmRlciBmb3IgdGhlIG5leHQgbGluZS4KIAotCSAgIGYtPmZfbGFzdGkgbm93IHJlZmVycyB0byB0aGUgaW5kZXggb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24KLQkgICBleGVjdXRlZC4gIFlvdSBtaWdodCB0aGluayB0aGlzIHdhcyBvYnZpb3VzIGZyb20gdGhlIG5hbWUsIGJ1dAotCSAgIHRoaXMgd2Fzbid0IGFsd2F5cyB0cnVlIGJlZm9yZSAyLjMhICBQeUZyYW1lX05ldyBub3cgc2V0cwotCSAgIGYtPmZfbGFzdGkgdG8gLTEgKGkuZS4gdGhlIGluZGV4ICpiZWZvcmUqIHRoZSBmaXJzdCBpbnN0cnVjdGlvbikKLQkgICBhbmQgWUlFTERfVkFMVUUgZG9lc24ndCBmaWRkbGUgd2l0aCBmX2xhc3RpIGFueSBtb3JlLiAgU28gdGhpcwotCSAgIGRvZXMgd29yay4gIFByb21pc2UuCisgICAgICAgZi0+Zl9sYXN0aSBub3cgcmVmZXJzIHRvIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBpbnN0cnVjdGlvbgorICAgICAgIGV4ZWN1dGVkLiAgWW91IG1pZ2h0IHRoaW5rIHRoaXMgd2FzIG9idmlvdXMgZnJvbSB0aGUgbmFtZSwgYnV0CisgICAgICAgdGhpcyB3YXNuJ3QgYWx3YXlzIHRydWUgYmVmb3JlIDIuMyEgIFB5RnJhbWVfTmV3IG5vdyBzZXRzCisgICAgICAgZi0+Zl9sYXN0aSB0byAtMSAoaS5lLiB0aGUgaW5kZXggKmJlZm9yZSogdGhlIGZpcnN0IGluc3RydWN0aW9uKQorICAgICAgIGFuZCBZSUVMRF9WQUxVRSBkb2Vzbid0IGZpZGRsZSB3aXRoIGZfbGFzdGkgYW55IG1vcmUuICBTbyB0aGlzCisgICAgICAgZG9lcyB3b3JrLiAgUHJvbWlzZS4KIAotCSAgIFdoZW4gdGhlIFBSRURJQ1QoKSBtYWNyb3MgYXJlIGVuYWJsZWQsIHNvbWUgb3Bjb2RlIHBhaXJzIGZvbGxvdyBpbgotICAgICAgICAgICBkaXJlY3Qgc3VjY2Vzc2lvbiB3aXRob3V0IHVwZGF0aW5nIGYtPmZfbGFzdGkuICBBIHN1Y2Nlc3NmdWwKLSAgICAgICAgICAgcHJlZGljdGlvbiBlZmZlY3RpdmVseSBsaW5rcyB0aGUgdHdvIGNvZGVzIHRvZ2V0aGVyIGFzIGlmIHRoZXkKLSAgICAgICAgICAgd2VyZSBhIHNpbmdsZSBuZXcgb3Bjb2RlOyBhY2NvcmRpbmdseSxmLT5mX2xhc3RpIHdpbGwgcG9pbnQgdG8KLSAgICAgICAgICAgdGhlIGZpcnN0IGNvZGUgaW4gdGhlIHBhaXIgKGZvciBpbnN0YW5jZSwgR0VUX0lURVIgZm9sbG93ZWQgYnkKLSAgICAgICAgICAgRk9SX0lURVIgaXMgZWZmZWN0aXZlbHkgYSBzaW5nbGUgb3Bjb2RlIGFuZCBmLT5mX2xhc3RpIHdpbGwgcG9pbnQKLSAgICAgICAgICAgYXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tYmluZWQgcGFpci4pCi0JKi8KLQluZXh0X2luc3RyID0gZmlyc3RfaW5zdHIgKyBmLT5mX2xhc3RpICsgMTsKLQlzdGFja19wb2ludGVyID0gZi0+Zl9zdGFja3RvcDsKLQlhc3NlcnQoc3RhY2tfcG9pbnRlciAhPSBOVUxMKTsKLQlmLT5mX3N0YWNrdG9wID0gTlVMTDsJLyogcmVtYWlucyBOVUxMIHVubGVzcyB5aWVsZCBzdXNwZW5kcyBmcmFtZSAqLworICAgICAgIFdoZW4gdGhlIFBSRURJQ1QoKSBtYWNyb3MgYXJlIGVuYWJsZWQsIHNvbWUgb3Bjb2RlIHBhaXJzIGZvbGxvdyBpbgorICAgICAgIGRpcmVjdCBzdWNjZXNzaW9uIHdpdGhvdXQgdXBkYXRpbmcgZi0+Zl9sYXN0aS4gIEEgc3VjY2Vzc2Z1bAorICAgICAgIHByZWRpY3Rpb24gZWZmZWN0aXZlbHkgbGlua3MgdGhlIHR3byBjb2RlcyB0b2dldGhlciBhcyBpZiB0aGV5CisgICAgICAgd2VyZSBhIHNpbmdsZSBuZXcgb3Bjb2RlOyBhY2NvcmRpbmdseSxmLT5mX2xhc3RpIHdpbGwgcG9pbnQgdG8KKyAgICAgICB0aGUgZmlyc3QgY29kZSBpbiB0aGUgcGFpciAoZm9yIGluc3RhbmNlLCBHRVRfSVRFUiBmb2xsb3dlZCBieQorICAgICAgIEZPUl9JVEVSIGlzIGVmZmVjdGl2ZWx5IGEgc2luZ2xlIG9wY29kZSBhbmQgZi0+Zl9sYXN0aSB3aWxsIHBvaW50CisgICAgICAgYXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tYmluZWQgcGFpci4pCisgICAgKi8KKyAgICBuZXh0X2luc3RyID0gZmlyc3RfaW5zdHIgKyBmLT5mX2xhc3RpICsgMTsKKyAgICBzdGFja19wb2ludGVyID0gZi0+Zl9zdGFja3RvcDsKKyAgICBhc3NlcnQoc3RhY2tfcG9pbnRlciAhPSBOVUxMKTsKKyAgICBmLT5mX3N0YWNrdG9wID0gTlVMTDsgICAgICAgLyogcmVtYWlucyBOVUxMIHVubGVzcyB5aWVsZCBzdXNwZW5kcyBmcmFtZSAqLwogCiAjaWZkZWYgTExUUkFDRQotCWxsdHJhY2UgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhmLT5mX2dsb2JhbHMsICJfX2xsdHJhY2VfXyIpICE9IE5VTEw7CisgICAgbGx0cmFjZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGYtPmZfZ2xvYmFscywgIl9fbGx0cmFjZV9fIikgIT0gTlVMTDsKICNlbmRpZgogI2lmIGRlZmluZWQoUHlfREVCVUcpIHx8IGRlZmluZWQoTExUUkFDRSkKLQlmaWxlbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19maWxlbmFtZSk7CisgICAgZmlsZW5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fZmlsZW5hbWUpOwogI2VuZGlmCiAKLQl3aHkgPSBXSFlfTk9UOwotCWVyciA9IDA7Ci0JeCA9IFB5X05vbmU7CS8qIE5vdCBhIHJlZmVyZW5jZSwganVzdCBhbnl0aGluZyBub24tTlVMTCAqLwotCXcgPSBOVUxMOworICAgIHdoeSA9IFdIWV9OT1Q7CisgICAgZXJyID0gMDsKKyAgICB4ID0gUHlfTm9uZTsgICAgICAgIC8qIE5vdCBhIHJlZmVyZW5jZSwganVzdCBhbnl0aGluZyBub24tTlVMTCAqLworICAgIHcgPSBOVUxMOwogCi0JaWYgKHRocm93ZmxhZykgeyAvKiBzdXBwb3J0IGZvciBnZW5lcmF0b3IudGhyb3coKSAqLwotCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQlnb3RvIG9uX2Vycm9yOwotCX0KKyAgICBpZiAodGhyb3dmbGFnKSB7IC8qIHN1cHBvcnQgZm9yIGdlbmVyYXRvci50aHJvdygpICovCisgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgfQogCi0JZm9yICg7OykgeworICAgIGZvciAoOzspIHsKICNpZmRlZiBXSVRIX1RTQwotCQlpZiAoaW5zdDEgPT0gMCkgewotCQkJLyogQWxtb3N0IHN1cmVseSwgdGhlIG9wY29kZSBleGVjdXRlZCBhIGJyZWFrCi0JCQkgICBvciBhIGNvbnRpbnVlLCBwcmV2ZW50aW5nIGluc3QxIGZyb20gYmVpbmcgc2V0Ci0JCQkgICBvbiB0aGUgd2F5IG91dCBvZiB0aGUgbG9vcC4KLQkJCSovCi0JCQlSRUFEX1RJTUVTVEFNUChpbnN0MSk7Ci0JCQlsb29wMSA9IGluc3QxOwotCQl9Ci0JCWR1bXBfdHNjKG9wY29kZSwgdGlja2VkLCBpbnN0MCwgaW5zdDEsIGxvb3AwLCBsb29wMSwKLQkJCSBpbnRyMCwgaW50cjEpOwotCQl0aWNrZWQgPSAwOwotCQlpbnN0MSA9IDA7Ci0JCWludHIwID0gMDsKLQkJaW50cjEgPSAwOwotCQlSRUFEX1RJTUVTVEFNUChsb29wMCk7CisgICAgICAgIGlmIChpbnN0MSA9PSAwKSB7CisgICAgICAgICAgICAvKiBBbG1vc3Qgc3VyZWx5LCB0aGUgb3Bjb2RlIGV4ZWN1dGVkIGEgYnJlYWsKKyAgICAgICAgICAgICAgIG9yIGEgY29udGludWUsIHByZXZlbnRpbmcgaW5zdDEgZnJvbSBiZWluZyBzZXQKKyAgICAgICAgICAgICAgIG9uIHRoZSB3YXkgb3V0IG9mIHRoZSBsb29wLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGluc3QxKTsKKyAgICAgICAgICAgIGxvb3AxID0gaW5zdDE7CisgICAgICAgIH0KKyAgICAgICAgZHVtcF90c2Mob3Bjb2RlLCB0aWNrZWQsIGluc3QwLCBpbnN0MSwgbG9vcDAsIGxvb3AxLAorICAgICAgICAgICAgICAgICBpbnRyMCwgaW50cjEpOworICAgICAgICB0aWNrZWQgPSAwOworICAgICAgICBpbnN0MSA9IDA7CisgICAgICAgIGludHIwID0gMDsKKyAgICAgICAgaW50cjEgPSAwOworICAgICAgICBSRUFEX1RJTUVTVEFNUChsb29wMCk7CiAjZW5kaWYKLQkJYXNzZXJ0KHN0YWNrX3BvaW50ZXIgPj0gZi0+Zl92YWx1ZXN0YWNrKTsgLyogZWxzZSB1bmRlcmZsb3cgKi8KLQkJYXNzZXJ0KFNUQUNLX0xFVkVMKCkgPD0gY28tPmNvX3N0YWNrc2l6ZSk7ICAvKiBlbHNlIG92ZXJmbG93ICovCisgICAgICAgIGFzc2VydChzdGFja19wb2ludGVyID49IGYtPmZfdmFsdWVzdGFjayk7IC8qIGVsc2UgdW5kZXJmbG93ICovCisgICAgICAgIGFzc2VydChTVEFDS19MRVZFTCgpIDw9IGNvLT5jb19zdGFja3NpemUpOyAgLyogZWxzZSBvdmVyZmxvdyAqLwogCi0JCS8qIERvIHBlcmlvZGljIHRoaW5ncy4gIERvaW5nIHRoaXMgZXZlcnkgdGltZSB0aHJvdWdoCi0JCSAgIHRoZSBsb29wIHdvdWxkIGFkZCB0b28gbXVjaCBvdmVyaGVhZCwgc28gd2UgZG8gaXQKLQkJICAgb25seSBldmVyeSBOdGggaW5zdHJ1Y3Rpb24uICBXZSBhbHNvIGRvIGl0IGlmCi0JCSAgIGBgdGhpbmdzX3RvX2RvJycgaXMgc2V0LCBpLmUuIHdoZW4gYW4gYXN5bmNocm9ub3VzCi0JCSAgIGV2ZW50IG5lZWRzIGF0dGVudGlvbiAoZS5nLiBhIHNpZ25hbCBoYW5kbGVyIG9yCi0JCSAgIGFzeW5jIEkvTyBoYW5kbGVyKTsgc2VlIFB5X0FkZFBlbmRpbmdDYWxsKCkgYW5kCi0JCSAgIFB5X01ha2VQZW5kaW5nQ2FsbHMoKSBhYm92ZS4gKi8KKyAgICAgICAgLyogRG8gcGVyaW9kaWMgdGhpbmdzLiAgRG9pbmcgdGhpcyBldmVyeSB0aW1lIHRocm91Z2gKKyAgICAgICAgICAgdGhlIGxvb3Agd291bGQgYWRkIHRvbyBtdWNoIG92ZXJoZWFkLCBzbyB3ZSBkbyBpdAorICAgICAgICAgICBvbmx5IGV2ZXJ5IE50aCBpbnN0cnVjdGlvbi4gIFdlIGFsc28gZG8gaXQgaWYKKyAgICAgICAgICAgYGB0aGluZ3NfdG9fZG8nJyBpcyBzZXQsIGkuZS4gd2hlbiBhbiBhc3luY2hyb25vdXMKKyAgICAgICAgICAgZXZlbnQgbmVlZHMgYXR0ZW50aW9uIChlLmcuIGEgc2lnbmFsIGhhbmRsZXIgb3IKKyAgICAgICAgICAgYXN5bmMgSS9PIGhhbmRsZXIpOyBzZWUgUHlfQWRkUGVuZGluZ0NhbGwoKSBhbmQKKyAgICAgICAgICAgUHlfTWFrZVBlbmRpbmdDYWxscygpIGFib3ZlLiAqLwogCi0JCWlmICgtLV9QeV9UaWNrZXIgPCAwKSB7Ci0JCQlpZiAoKm5leHRfaW5zdHIgPT0gU0VUVVBfRklOQUxMWSkgewotCQkJCS8qIE1ha2UgdGhlIGxhc3Qgb3Bjb2RlIGJlZm9yZQotCQkJCSAgIGEgdHJ5OiBmaW5hbGx5OiBibG9jayB1bmludGVycnVwdGFibGUuICovCi0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfQotCQkJX1B5X1RpY2tlciA9IF9QeV9DaGVja0ludGVydmFsOwotCQkJdHN0YXRlLT50aWNrX2NvdW50ZXIrKzsKKyAgICAgICAgaWYgKC0tX1B5X1RpY2tlciA8IDApIHsKKyAgICAgICAgICAgIGlmICgqbmV4dF9pbnN0ciA9PSBTRVRVUF9GSU5BTExZKSB7CisgICAgICAgICAgICAgICAgLyogTWFrZSB0aGUgbGFzdCBvcGNvZGUgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgYSB0cnk6IGZpbmFsbHk6IGJsb2NrIHVuaW50ZXJydXB0YWJsZS4gKi8KKyAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfUHlfVGlja2VyID0gX1B5X0NoZWNrSW50ZXJ2YWw7CisgICAgICAgICAgICB0c3RhdGUtPnRpY2tfY291bnRlcisrOwogI2lmZGVmIFdJVEhfVFNDCi0JCQl0aWNrZWQgPSAxOworICAgICAgICAgICAgdGlja2VkID0gMTsKICNlbmRpZgotCQkJaWYgKHRoaW5nc190b19kbykgewotCQkJCWlmIChQeV9NYWtlUGVuZGluZ0NhbGxzKCkgPCAwKSB7Ci0JCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQkJCWdvdG8gb25fZXJyb3I7Ci0JCQkJfQotCQkJCWlmICh0aGluZ3NfdG9fZG8pCi0JCQkJCS8qIE1ha2VQZW5kaW5nQ2FsbHMoKSBkaWRuJ3Qgc3VjY2VlZC4KLQkJCQkJICAgRm9yY2UgZWFybHkgcmUtZXhlY3V0aW9uIG9mIHRoaXMKLQkJCQkJICAgInBlcmlvZGljIiBjb2RlLCBwb3NzaWJseSBhZnRlcgotCQkJCQkgICBhIHRocmVhZCBzd2l0Y2ggKi8KLQkJCQkJX1B5X1RpY2tlciA9IDA7Ci0JCQl9CisgICAgICAgICAgICBpZiAodGhpbmdzX3RvX2RvKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5X01ha2VQZW5kaW5nQ2FsbHMoKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRoaW5nc190b19kbykKKyAgICAgICAgICAgICAgICAgICAgLyogTWFrZVBlbmRpbmdDYWxscygpIGRpZG4ndCBzdWNjZWVkLgorICAgICAgICAgICAgICAgICAgICAgICBGb3JjZSBlYXJseSByZS1leGVjdXRpb24gb2YgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAicGVyaW9kaWMiIGNvZGUsIHBvc3NpYmx5IGFmdGVyCisgICAgICAgICAgICAgICAgICAgICAgIGEgdGhyZWFkIHN3aXRjaCAqLworICAgICAgICAgICAgICAgICAgICBfUHlfVGlja2VyID0gMDsKKyAgICAgICAgICAgIH0KICNpZmRlZiBXSVRIX1RIUkVBRAotCQkJaWYgKGludGVycHJldGVyX2xvY2spIHsKLQkJCQkvKiBHaXZlIGFub3RoZXIgdGhyZWFkIGEgY2hhbmNlICovCisgICAgICAgICAgICBpZiAoaW50ZXJwcmV0ZXJfbG9jaykgeworICAgICAgICAgICAgICAgIC8qIEdpdmUgYW5vdGhlciB0aHJlYWQgYSBjaGFuY2UgKi8KIAotCQkJCWlmIChQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCkgIT0gdHN0YXRlKQotCQkJCQlQeV9GYXRhbEVycm9yKCJjZXZhbDogdHN0YXRlIG1peC11cCIpOwotCQkJCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbnRlcnByZXRlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlUaHJlYWRTdGF0ZV9Td2FwKE5VTEwpICE9IHRzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiY2V2YWw6IHRzdGF0ZSBtaXgtdXAiKTsKKyAgICAgICAgICAgICAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soaW50ZXJwcmV0ZXJfbG9jayk7CiAKLQkJCQkvKiBPdGhlciB0aHJlYWRzIG1heSBydW4gbm93ICovCisgICAgICAgICAgICAgICAgLyogT3RoZXIgdGhyZWFkcyBtYXkgcnVuIG5vdyAqLwogCi0JCQkJUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGludGVycHJldGVyX2xvY2ssIDEpOwotCQkJCWlmIChQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKSAhPSBOVUxMKQotCQkJCQlQeV9GYXRhbEVycm9yKCJjZXZhbDogb3JwaGFuIHRzdGF0ZSIpOworICAgICAgICAgICAgICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbnRlcnByZXRlcl9sb2NrLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiY2V2YWw6IG9ycGhhbiB0c3RhdGUiKTsKIAotCQkJCS8qIENoZWNrIGZvciB0aHJlYWQgaW50ZXJydXB0cyAqLworICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciB0aHJlYWQgaW50ZXJydXB0cyAqLwogCi0JCQkJaWYgKHRzdGF0ZS0+YXN5bmNfZXhjICE9IE5VTEwpIHsKLQkJCQkJeCA9IHRzdGF0ZS0+YXN5bmNfZXhjOwotCQkJCQl0c3RhdGUtPmFzeW5jX2V4YyA9IE5VTEw7Ci0JCQkJCVB5RXJyX1NldE5vbmUoeCk7Ci0JCQkJCVB5X0RFQ1JFRih4KTsKLQkJCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCQkJZ290byBvbl9lcnJvcjsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAgICAgaWYgKHRzdGF0ZS0+YXN5bmNfZXhjICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IHRzdGF0ZS0+YXN5bmNfZXhjOworICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmFzeW5jX2V4YyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldE5vbmUoeCk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJfQorICAgICAgICB9CiAKLQlmYXN0X25leHRfb3Bjb2RlOgotCQlmLT5mX2xhc3RpID0gSU5TVFJfT0ZGU0VUKCk7CisgICAgZmFzdF9uZXh0X29wY29kZToKKyAgICAgICAgZi0+Zl9sYXN0aSA9IElOU1RSX09GRlNFVCgpOwogCi0JCS8qIGxpbmUtYnktbGluZSB0cmFjaW5nIHN1cHBvcnQgKi8KKyAgICAgICAgLyogbGluZS1ieS1saW5lIHRyYWNpbmcgc3VwcG9ydCAqLwogCi0JCWlmIChfUHlfVHJhY2luZ1Bvc3NpYmxlICYmCi0JCSAgICB0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwgJiYgIXRzdGF0ZS0+dHJhY2luZykgewotCQkJLyogc2VlIG1heWJlX2NhbGxfbGluZV90cmFjZQotCQkJICAgZm9yIGV4cG9zaXRvcnkgY29tbWVudHMgKi8KLQkJCWYtPmZfc3RhY2t0b3AgPSBzdGFja19wb2ludGVyOworICAgICAgICBpZiAoX1B5X1RyYWNpbmdQb3NzaWJsZSAmJgorICAgICAgICAgICAgdHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMICYmICF0c3RhdGUtPnRyYWNpbmcpIHsKKyAgICAgICAgICAgIC8qIHNlZSBtYXliZV9jYWxsX2xpbmVfdHJhY2UKKyAgICAgICAgICAgICAgIGZvciBleHBvc2l0b3J5IGNvbW1lbnRzICovCisgICAgICAgICAgICBmLT5mX3N0YWNrdG9wID0gc3RhY2tfcG9pbnRlcjsKIAotCQkJZXJyID0gbWF5YmVfY2FsbF9saW5lX3RyYWNlKHRzdGF0ZS0+Y190cmFjZWZ1bmMsCi0JCQkJCQkgICAgdHN0YXRlLT5jX3RyYWNlb2JqLAotCQkJCQkJICAgIGYsICZpbnN0cl9sYiwgJmluc3RyX3ViLAotCQkJCQkJICAgICZpbnN0cl9wcmV2KTsKLQkJCS8qIFJlbG9hZCBwb3NzaWJseSBjaGFuZ2VkIGZyYW1lIGZpZWxkcyAqLwotCQkJSlVNUFRPKGYtPmZfbGFzdGkpOwotCQkJaWYgKGYtPmZfc3RhY2t0b3AgIT0gTlVMTCkgewotCQkJCXN0YWNrX3BvaW50ZXIgPSBmLT5mX3N0YWNrdG9wOwotCQkJCWYtPmZfc3RhY2t0b3AgPSBOVUxMOwotCQkJfQotCQkJaWYgKGVycikgewotCQkJCS8qIHRyYWNlIGZ1bmN0aW9uIHJhaXNlZCBhbiBleGNlcHRpb24gKi8KLQkJCQlnb3RvIG9uX2Vycm9yOwotCQkJfQotCQl9CisgICAgICAgICAgICBlcnIgPSBtYXliZV9jYWxsX2xpbmVfdHJhY2UodHN0YXRlLT5jX3RyYWNlZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfdHJhY2VvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgJmluc3RyX2xiLCAmaW5zdHJfdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RyX3ByZXYpOworICAgICAgICAgICAgLyogUmVsb2FkIHBvc3NpYmx5IGNoYW5nZWQgZnJhbWUgZmllbGRzICovCisgICAgICAgICAgICBKVU1QVE8oZi0+Zl9sYXN0aSk7CisgICAgICAgICAgICBpZiAoZi0+Zl9zdGFja3RvcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RhY2tfcG9pbnRlciA9IGYtPmZfc3RhY2t0b3A7CisgICAgICAgICAgICAgICAgZi0+Zl9zdGFja3RvcCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgLyogdHJhY2UgZnVuY3Rpb24gcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBFeHRyYWN0IG9wY29kZSBhbmQgYXJndW1lbnQgKi8KKyAgICAgICAgLyogRXh0cmFjdCBvcGNvZGUgYW5kIGFyZ3VtZW50ICovCiAKLQkJb3Bjb2RlID0gTkVYVE9QKCk7Ci0JCW9wYXJnID0gMDsgICAvKiBhbGxvd3Mgb3BhcmcgdG8gYmUgc3RvcmVkIGluIGEgcmVnaXN0ZXIgYmVjYXVzZQotCQkJaXQgZG9lc24ndCBoYXZlIHRvIGJlIHJlbWVtYmVyZWQgYWNyb3NzIGEgZnVsbCBsb29wICovCi0JCWlmIChIQVNfQVJHKG9wY29kZSkpCi0JCQlvcGFyZyA9IE5FWFRBUkcoKTsKLQkgIGRpc3BhdGNoX29wY29kZToKKyAgICAgICAgb3Bjb2RlID0gTkVYVE9QKCk7CisgICAgICAgIG9wYXJnID0gMDsgICAvKiBhbGxvd3Mgb3BhcmcgdG8gYmUgc3RvcmVkIGluIGEgcmVnaXN0ZXIgYmVjYXVzZQorICAgICAgICAgICAgaXQgZG9lc24ndCBoYXZlIHRvIGJlIHJlbWVtYmVyZWQgYWNyb3NzIGEgZnVsbCBsb29wICovCisgICAgICAgIGlmIChIQVNfQVJHKG9wY29kZSkpCisgICAgICAgICAgICBvcGFyZyA9IE5FWFRBUkcoKTsKKyAgICAgIGRpc3BhdGNoX29wY29kZToKICNpZmRlZiBEWU5BTUlDX0VYRUNVVElPTl9QUk9GSUxFCiAjaWZkZWYgRFhQQUlSUwotCQlkeHBhaXJzW2xhc3RvcGNvZGVdW29wY29kZV0rKzsKLQkJbGFzdG9wY29kZSA9IG9wY29kZTsKKyAgICAgICAgZHhwYWlyc1tsYXN0b3Bjb2RlXVtvcGNvZGVdKys7CisgICAgICAgIGxhc3RvcGNvZGUgPSBvcGNvZGU7CiAjZW5kaWYKLQkJZHhwW29wY29kZV0rKzsKKyAgICAgICAgZHhwW29wY29kZV0rKzsKICNlbmRpZgogCiAjaWZkZWYgTExUUkFDRQotCQkvKiBJbnN0cnVjdGlvbiB0cmFjaW5nICovCisgICAgICAgIC8qIEluc3RydWN0aW9uIHRyYWNpbmcgKi8KIAotCQlpZiAobGx0cmFjZSkgewotCQkJaWYgKEhBU19BUkcob3Bjb2RlKSkgewotCQkJCXByaW50ZigiJWQ6ICVkLCAlZFxuIiwKLQkJCQkgICAgICAgZi0+Zl9sYXN0aSwgb3Bjb2RlLCBvcGFyZyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcmludGYoIiVkOiAlZFxuIiwKLQkJCQkgICAgICAgZi0+Zl9sYXN0aSwgb3Bjb2RlKTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAobGx0cmFjZSkgeworICAgICAgICAgICAgaWYgKEhBU19BUkcob3Bjb2RlKSkgeworICAgICAgICAgICAgICAgIHByaW50ZigiJWQ6ICVkLCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9sYXN0aSwgb3Bjb2RlLCBvcGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVkOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9sYXN0aSwgb3Bjb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAKLQkJLyogTWFpbiBzd2l0Y2ggb24gb3Bjb2RlICovCi0JCVJFQURfVElNRVNUQU1QKGluc3QwKTsKKyAgICAgICAgLyogTWFpbiBzd2l0Y2ggb24gb3Bjb2RlICovCisgICAgICAgIFJFQURfVElNRVNUQU1QKGluc3QwKTsKIAotCQlzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgewogCi0JCS8qIEJFV0FSRSEKLQkJICAgSXQgaXMgZXNzZW50aWFsIHRoYXQgYW55IG9wZXJhdGlvbiB0aGF0IGZhaWxzIHNldHMgZWl0aGVyCi0JCSAgIHggdG8gTlVMTCwgZXJyIHRvIG5vbnplcm8sIG9yIHdoeSB0byBhbnl0aGluZyBidXQgV0hZX05PVCwKLQkJICAgYW5kIHRoYXQgbm8gb3BlcmF0aW9uIHRoYXQgc3VjY2VlZHMgZG9lcyB0aGlzISAqLworICAgICAgICAvKiBCRVdBUkUhCisgICAgICAgICAgIEl0IGlzIGVzc2VudGlhbCB0aGF0IGFueSBvcGVyYXRpb24gdGhhdCBmYWlscyBzZXRzIGVpdGhlcgorICAgICAgICAgICB4IHRvIE5VTEwsIGVyciB0byBub256ZXJvLCBvciB3aHkgdG8gYW55dGhpbmcgYnV0IFdIWV9OT1QsCisgICAgICAgICAgIGFuZCB0aGF0IG5vIG9wZXJhdGlvbiB0aGF0IHN1Y2NlZWRzIGRvZXMgdGhpcyEgKi8KIAotCQkvKiBjYXNlIFNUT1BfQ09ERTogdGhpcyBpcyBhbiBlcnJvciEgKi8KKyAgICAgICAgLyogY2FzZSBTVE9QX0NPREU6IHRoaXMgaXMgYW4gZXJyb3IhICovCiAKLQkJY2FzZSBOT1A6Ci0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgIGNhc2UgTk9QOgorICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCWNhc2UgTE9BRF9GQVNUOgotCQkJeCA9IEdFVExPQ0FMKG9wYXJnKTsKLQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQlQeV9JTkNSRUYoeCk7Ci0JCQkJUFVTSCh4KTsKLQkJCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7Ci0JCQl9Ci0JCQlmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeUV4Y19VbmJvdW5kTG9jYWxFcnJvciwKLQkJCQlVTkJPVU5ETE9DQUxfRVJST1JfTVNHLAotCQkJCVB5VHVwbGVfR2V0SXRlbShjby0+Y29fdmFybmFtZXMsIG9wYXJnKSk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBMT0FEX0ZBU1Q6CisgICAgICAgICAgICB4ID0gR0VUTE9DQUwob3BhcmcpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKFB5RXhjX1VuYm91bmRMb2NhbEVycm9yLAorICAgICAgICAgICAgICAgIFVOQk9VTkRMT0NBTF9FUlJPUl9NU0csCisgICAgICAgICAgICAgICAgUHlUdXBsZV9HZXRJdGVtKGNvLT5jb192YXJuYW1lcywgb3BhcmcpKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTE9BRF9DT05TVDoKLQkJCXggPSBHRVRJVEVNKGNvbnN0cywgb3BhcmcpOwotCQkJUHlfSU5DUkVGKHgpOwotCQkJUFVTSCh4KTsKLQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgY2FzZSBMT0FEX0NPTlNUOgorICAgICAgICAgICAgeCA9IEdFVElURU0oY29uc3RzLCBvcGFyZyk7CisgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCVBSRURJQ1RFRF9XSVRIX0FSRyhTVE9SRV9GQVNUKTsKLQkJY2FzZSBTVE9SRV9GQVNUOgotCQkJdiA9IFBPUCgpOwotCQkJU0VUTE9DQUwob3BhcmcsIHYpOwotCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICBQUkVESUNURURfV0lUSF9BUkcoU1RPUkVfRkFTVCk7CisgICAgICAgIGNhc2UgU1RPUkVfRkFTVDoKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIFNFVExPQ0FMKG9wYXJnLCB2KTsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKIAotCQlQUkVESUNURUQoUE9QX1RPUCk7Ci0JCWNhc2UgUE9QX1RPUDoKLQkJCXYgPSBQT1AoKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgUFJFRElDVEVEKFBPUF9UT1ApOworICAgICAgICBjYXNlIFBPUF9UT1A6CisgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CiAKLQkJY2FzZSBST1RfVFdPOgotCQkJdiA9IFRPUCgpOwotCQkJdyA9IFNFQ09ORCgpOwotCQkJU0VUX1RPUCh3KTsKLQkJCVNFVF9TRUNPTkQodik7Ci0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgIGNhc2UgUk9UX1RXTzoKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHcgPSBTRUNPTkQoKTsKKyAgICAgICAgICAgIFNFVF9UT1Aodyk7CisgICAgICAgICAgICBTRVRfU0VDT05EKHYpOworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCWNhc2UgUk9UX1RIUkVFOgotCQkJdiA9IFRPUCgpOwotCQkJdyA9IFNFQ09ORCgpOwotCQkJeCA9IFRISVJEKCk7Ci0JCQlTRVRfVE9QKHcpOwotCQkJU0VUX1NFQ09ORCh4KTsKLQkJCVNFVF9USElSRCh2KTsKLQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgY2FzZSBST1RfVEhSRUU6CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB3ID0gU0VDT05EKCk7CisgICAgICAgICAgICB4ID0gVEhJUkQoKTsKKyAgICAgICAgICAgIFNFVF9UT1Aodyk7CisgICAgICAgICAgICBTRVRfU0VDT05EKHgpOworICAgICAgICAgICAgU0VUX1RISVJEKHYpOworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCWNhc2UgUk9UX0ZPVVI6Ci0JCQl1ID0gVE9QKCk7Ci0JCQl2ID0gU0VDT05EKCk7Ci0JCQl3ID0gVEhJUkQoKTsKLQkJCXggPSBGT1VSVEgoKTsKLQkJCVNFVF9UT1Aodik7Ci0JCQlTRVRfU0VDT05EKHcpOwotCQkJU0VUX1RISVJEKHgpOwotCQkJU0VUX0ZPVVJUSCh1KTsKLQkJCWdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgY2FzZSBST1RfRk9VUjoKKyAgICAgICAgICAgIHUgPSBUT1AoKTsKKyAgICAgICAgICAgIHYgPSBTRUNPTkQoKTsKKyAgICAgICAgICAgIHcgPSBUSElSRCgpOworICAgICAgICAgICAgeCA9IEZPVVJUSCgpOworICAgICAgICAgICAgU0VUX1RPUCh2KTsKKyAgICAgICAgICAgIFNFVF9TRUNPTkQodyk7CisgICAgICAgICAgICBTRVRfVEhJUkQoeCk7CisgICAgICAgICAgICBTRVRfRk9VUlRIKHUpOworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogCi0JCWNhc2UgRFVQX1RPUDoKLQkJCXYgPSBUT1AoKTsKLQkJCVB5X0lOQ1JFRih2KTsKLQkJCVBVU0godik7Ci0JCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgIGNhc2UgRFVQX1RPUDoKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIFBVU0godik7CisgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CiAKLQkJY2FzZSBEVVBfVE9QWDoKLQkJCWlmIChvcGFyZyA9PSAyKSB7Ci0JCQkJeCA9IFRPUCgpOwotCQkJCVB5X0lOQ1JFRih4KTsKLQkJCQl3ID0gU0VDT05EKCk7Ci0JCQkJUHlfSU5DUkVGKHcpOwotCQkJCVNUQUNLQURKKDIpOwotCQkJCVNFVF9UT1AoeCk7Ci0JCQkJU0VUX1NFQ09ORCh3KTsKLQkJCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7Ci0JCQl9IGVsc2UgaWYgKG9wYXJnID09IDMpIHsKLQkJCQl4ID0gVE9QKCk7Ci0JCQkJUHlfSU5DUkVGKHgpOwotCQkJCXcgPSBTRUNPTkQoKTsKLQkJCQlQeV9JTkNSRUYodyk7Ci0JCQkJdiA9IFRISVJEKCk7Ci0JCQkJUHlfSU5DUkVGKHYpOwotCQkJCVNUQUNLQURKKDMpOwotCQkJCVNFVF9UT1AoeCk7Ci0JCQkJU0VUX1NFQ09ORCh3KTsKLQkJCQlTRVRfVEhJUkQodik7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfQotCQkJUHlfRmF0YWxFcnJvcigiaW52YWxpZCBhcmd1bWVudCB0byBEVVBfVE9QWCIKLQkJCQkgICAgICAiIChieXRlY29kZSBjb3JydXB0aW9uPykiKTsKLQkJCS8qIE5ldmVyIHJldHVybnMsIHNvIGRvbid0IGJvdGhlciB0byBzZXQgd2h5LiAqLwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgRFVQX1RPUFg6CisgICAgICAgICAgICBpZiAob3BhcmcgPT0gMikgeworICAgICAgICAgICAgICAgIHggPSBUT1AoKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICAgICAgdyA9IFNFQ09ORCgpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih3KTsKKyAgICAgICAgICAgICAgICBTVEFDS0FESigyKTsKKyAgICAgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgICAgIFNFVF9TRUNPTkQodyk7CisgICAgICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcGFyZyA9PSAzKSB7CisgICAgICAgICAgICAgICAgeCA9IFRPUCgpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgICAgICB3ID0gU0VDT05EKCk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHcpOworICAgICAgICAgICAgICAgIHYgPSBUSElSRCgpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgICAgICBTVEFDS0FESigzKTsKKyAgICAgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgICAgIFNFVF9TRUNPTkQodyk7CisgICAgICAgICAgICAgICAgU0VUX1RISVJEKHYpOworICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImludmFsaWQgYXJndW1lbnQgdG8gRFVQX1RPUFgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgKGJ5dGVjb2RlIGNvcnJ1cHRpb24/KSIpOworICAgICAgICAgICAgLyogTmV2ZXIgcmV0dXJucywgc28gZG9uJ3QgYm90aGVyIHRvIHNldCB3aHkuICovCisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFVOQVJZX1BPU0lUSVZFOgotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX1Bvc2l0aXZlKHYpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgVU5BUllfUE9TSVRJVkU6CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfUG9zaXRpdmUodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFVOQVJZX05FR0FUSVZFOgotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX05lZ2F0aXZlKHYpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgVU5BUllfTkVHQVRJVkU6CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfTmVnYXRpdmUodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFVOQVJZX05PVDoKLQkJCXYgPSBUT1AoKTsKLQkJCWVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWlmIChlcnIgPT0gMCkgewotCQkJCVB5X0lOQ1JFRihQeV9UcnVlKTsKLQkJCQlTRVRfVE9QKFB5X1RydWUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBpZiAoZXJyID4gMCkgewotCQkJCVB5X0lOQ1JFRihQeV9GYWxzZSk7Ci0JCQkJU0VUX1RPUChQeV9GYWxzZSk7Ci0JCQkJZXJyID0gMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVNUQUNLQURKKC0xKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX05PVDoKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9UcnVlKTsKKyAgICAgICAgICAgICAgICBTRVRfVE9QKFB5X1RydWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZXJyID4gMCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgICAgICAgICAgICAgU0VUX1RPUChQeV9GYWxzZSk7CisgICAgICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNUQUNLQURKKC0xKTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgVU5BUllfQ09OVkVSVDoKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU9iamVjdF9SZXByKHYpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgVU5BUllfQ09OVkVSVDoKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU9iamVjdF9SZXByKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBVTkFSWV9JTlZFUlQ6Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfSW52ZXJ0KHYpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgVU5BUllfSU5WRVJUOgorICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0ludmVydCh2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX1BPV0VSOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX1Bvd2VyKHYsIHcsIFB5X05vbmUpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX1BPV0VSOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX1Bvd2VyKHYsIHcsIFB5X05vbmUpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfTVVMVElQTFk6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfTXVsdGlwbHkodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfTVVMVElQTFk6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfTXVsdGlwbHkodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9ESVZJREU6Ci0JCQlpZiAoIV9QeV9RbmV3RmxhZykgewotCQkJCXcgPSBQT1AoKTsKLQkJCQl2ID0gVE9QKCk7Ci0JCQkJeCA9IFB5TnVtYmVyX0RpdmlkZSh2LCB3KTsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJUHlfREVDUkVGKHcpOwotCQkJCVNFVF9UT1AoeCk7Ci0JCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiAtUW5ldyBpcyBpbiBlZmZlY3Q6CWZhbGwgdGhyb3VnaCB0bwotCQkJICAgQklOQVJZX1RSVUVfRElWSURFICovCi0JCWNhc2UgQklOQVJZX1RSVUVfRElWSURFOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX1RydWVEaXZpZGUodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfRElWSURFOgorICAgICAgICAgICAgaWYgKCFfUHlfUW5ld0ZsYWcpIHsKKyAgICAgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgICAgIHggPSBQeU51bWJlcl9EaXZpZGUodiwgdyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogLVFuZXcgaXMgaW4gZWZmZWN0OiAgICAgICAgICAgICAgZmFsbCB0aHJvdWdoIHRvCisgICAgICAgICAgICAgICBCSU5BUllfVFJVRV9ESVZJREUgKi8KKyAgICAgICAgY2FzZSBCSU5BUllfVFJVRV9ESVZJREU6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfVHJ1ZURpdmlkZSh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX0ZMT09SX0RJVklERToKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9GbG9vckRpdmlkZSh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9GTE9PUl9ESVZJREU6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfRmxvb3JEaXZpZGUodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9NT0RVTE86Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfUmVtYWluZGVyKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX01PRFVMTzoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9SZW1haW5kZXIodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJJTkFSWV9BREQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSAmJiBQeUludF9DaGVja0V4YWN0KHcpKSB7Ci0JCQkJLyogSU5MSU5FOiBpbnQgKyBpbnQgKi8KLQkJCQlyZWdpc3RlciBsb25nIGEsIGIsIGk7Ci0JCQkJYSA9IFB5SW50X0FTX0xPTkcodik7Ci0JCQkJYiA9IFB5SW50X0FTX0xPTkcodyk7Ci0JCQkJLyogY2FzdCB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyCi0JCQkJICAgb24gb3ZlcmZsb3cgKi8KLQkJCQlpID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgKyBiKTsKLQkJCQlpZiAoKGleYSkgPCAwICYmIChpXmIpIDwgMCkKLQkJCQkJZ290byBzbG93X2FkZDsKLQkJCQl4ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChQeVN0cmluZ19DaGVja0V4YWN0KHYpICYmCi0JCQkJIFB5U3RyaW5nX0NoZWNrRXhhY3QodykpIHsKLQkJCQl4ID0gc3RyaW5nX2NvbmNhdGVuYXRlKHYsIHcsIGYsIG5leHRfaW5zdHIpOwotCQkJCS8qIHN0cmluZ19jb25jYXRlbmF0ZSBjb25zdW1lZCB0aGUgcmVmIHRvIHYgKi8KLQkJCQlnb3RvIHNraXBfZGVjcmVmX3Z4OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkgIHNsb3dfYWRkOgotCQkJCXggPSBQeU51bWJlcl9BZGQodiwgdyk7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYodik7Ci0JCSAgc2tpcF9kZWNyZWZfdng6Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfQUREOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodikgJiYgUHlJbnRfQ2hlY2tFeGFjdCh3KSkgeworICAgICAgICAgICAgICAgIC8qIElOTElORTogaW50ICsgaW50ICovCisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgbG9uZyBhLCBiLCBpOworICAgICAgICAgICAgICAgIGEgPSBQeUludF9BU19MT05HKHYpOworICAgICAgICAgICAgICAgIGIgPSBQeUludF9BU19MT05HKHcpOworICAgICAgICAgICAgICAgIC8qIGNhc3QgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91cgorICAgICAgICAgICAgICAgICAgIG9uIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgaSA9IChsb25nKSgodW5zaWduZWQgbG9uZylhICsgYik7CisgICAgICAgICAgICAgICAgaWYgKChpXmEpIDwgMCAmJiAoaV5iKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gc2xvd19hZGQ7CisgICAgICAgICAgICAgICAgeCA9IFB5SW50X0Zyb21Mb25nKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSAmJgorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQ2hlY2tFeGFjdCh3KSkgeworICAgICAgICAgICAgICAgIHggPSBzdHJpbmdfY29uY2F0ZW5hdGUodiwgdywgZiwgbmV4dF9pbnN0cik7CisgICAgICAgICAgICAgICAgLyogc3RyaW5nX2NvbmNhdGVuYXRlIGNvbnN1bWVkIHRoZSByZWYgdG8gdiAqLworICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9kZWNyZWZfdng7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgc2xvd19hZGQ6CisgICAgICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0FkZCh2LCB3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICBza2lwX2RlY3JlZl92eDoKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX1NVQlRSQUNUOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJaWYgKFB5SW50X0NoZWNrRXhhY3QodikgJiYgUHlJbnRfQ2hlY2tFeGFjdCh3KSkgewotCQkJCS8qIElOTElORTogaW50IC0gaW50ICovCi0JCQkJcmVnaXN0ZXIgbG9uZyBhLCBiLCBpOwotCQkJCWEgPSBQeUludF9BU19MT05HKHYpOwotCQkJCWIgPSBQeUludF9BU19MT05HKHcpOwotCQkJCS8qIGNhc3QgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91cgotCQkJCSAgIG9uIG92ZXJmbG93ICovCi0JCQkJaSA9IChsb25nKSgodW5zaWduZWQgbG9uZylhIC0gYik7Ci0JCQkJaWYgKChpXmEpIDwgMCAmJiAoaV5+YikgPCAwKQotCQkJCQlnb3RvIHNsb3dfc3ViOwotCQkJCXggPSBQeUludF9Gcm9tTG9uZyhpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJICBzbG93X3N1YjoKLQkJCQl4ID0gUHlOdW1iZXJfU3VidHJhY3Qodiwgdyk7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfU1VCVFJBQ1Q6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSAmJiBQeUludF9DaGVja0V4YWN0KHcpKSB7CisgICAgICAgICAgICAgICAgLyogSU5MSU5FOiBpbnQgLSBpbnQgKi8KKyAgICAgICAgICAgICAgICByZWdpc3RlciBsb25nIGEsIGIsIGk7CisgICAgICAgICAgICAgICAgYSA9IFB5SW50X0FTX0xPTkcodik7CisgICAgICAgICAgICAgICAgYiA9IFB5SW50X0FTX0xPTkcodyk7CisgICAgICAgICAgICAgICAgLyogY2FzdCB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyCisgICAgICAgICAgICAgICAgICAgb24gb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBpID0gKGxvbmcpKCh1bnNpZ25lZCBsb25nKWEgLSBiKTsKKyAgICAgICAgICAgICAgICBpZiAoKGleYSkgPCAwICYmIChpXn5iKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gc2xvd19zdWI7CisgICAgICAgICAgICAgICAgeCA9IFB5SW50X0Zyb21Mb25nKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIHNsb3dfc3ViOgorICAgICAgICAgICAgICAgIHggPSBQeU51bWJlcl9TdWJ0cmFjdCh2LCB3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgQklOQVJZX1NVQlNDUjoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCWlmIChQeUxpc3RfQ2hlY2tFeGFjdCh2KSAmJiBQeUludF9DaGVja0V4YWN0KHcpKSB7Ci0JCQkJLyogSU5MSU5FOiBsaXN0W2ludF0gKi8KLQkJCQlQeV9zc2l6ZV90IGkgPSBQeUludF9Bc1NzaXplX3Qodyk7Ci0JCQkJaWYgKGkgPCAwKQotCQkJCQlpICs9IFB5TGlzdF9HRVRfU0laRSh2KTsKLQkJCQlpZiAoaSA+PSAwICYmIGkgPCBQeUxpc3RfR0VUX1NJWkUodikpIHsKLQkJCQkJeCA9IFB5TGlzdF9HRVRfSVRFTSh2LCBpKTsKLQkJCQkJUHlfSU5DUkVGKHgpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCWdvdG8gc2xvd19nZXQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQkgIHNsb3dfZ2V0OgotCQkJCXggPSBQeU9iamVjdF9HZXRJdGVtKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX1NVQlNDUjoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIGlmIChQeUxpc3RfQ2hlY2tFeGFjdCh2KSAmJiBQeUludF9DaGVja0V4YWN0KHcpKSB7CisgICAgICAgICAgICAgICAgLyogSU5MSU5FOiBsaXN0W2ludF0gKi8KKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGkgPSBQeUludF9Bc1NzaXplX3Qodyk7CisgICAgICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgICAgICBpICs9IFB5TGlzdF9HRVRfU0laRSh2KTsKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSAwICYmIGkgPCBQeUxpc3RfR0VUX1NJWkUodikpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IFB5TGlzdF9HRVRfSVRFTSh2LCBpKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGdvdG8gc2xvd19nZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHNsb3dfZ2V0OgorICAgICAgICAgICAgICAgIHggPSBQeU9iamVjdF9HZXRJdGVtKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfTFNISUZUOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0xzaGlmdCh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9MU0hJRlQ6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfTHNoaWZ0KHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfUlNISUZUOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX1JzaGlmdCh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9SU0hJRlQ6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfUnNoaWZ0KHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfQU5EOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0FuZCh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9BTkQ6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfQW5kKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfWE9SOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX1hvcih2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9YT1I6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfWG9yKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCSU5BUllfT1I6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfT3Iodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfT1I6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfT3Iodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIExJU1RfQVBQRU5EOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFBPUCgpOwotCQkJZXJyID0gUHlMaXN0X0FwcGVuZCh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWlmIChlcnIgPT0gMCkgewotCQkJCVBSRURJQ1QoSlVNUF9BQlNPTFVURSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBMSVNUX0FQUEVORDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgICAgICBQUkVESUNUKEpVTVBfQUJTT0xVVEUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX1BPV0VSOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VQb3dlcih2LCB3LCBQeV9Ob25lKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIElOUExBQ0VfUE9XRVI6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZVBvd2VyKHYsIHcsIFB5X05vbmUpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX01VTFRJUExZOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseSh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIElOUExBQ0VfTVVMVElQTFk6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZU11bHRpcGx5KHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX0RJVklERToKLQkJCWlmICghX1B5X1FuZXdGbGFnKSB7Ci0JCQkJdyA9IFBPUCgpOwotCQkJCXYgPSBUT1AoKTsKLQkJCQl4ID0gUHlOdW1iZXJfSW5QbGFjZURpdmlkZSh2LCB3KTsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJUHlfREVDUkVGKHcpOwotCQkJCVNFVF9UT1AoeCk7Ci0JCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvKiAtUW5ldyBpcyBpbiBlZmZlY3Q6CWZhbGwgdGhyb3VnaCB0bwotCQkJICAgSU5QTEFDRV9UUlVFX0RJVklERSAqLwotCQljYXNlIElOUExBQ0VfVFJVRV9ESVZJREU6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGUodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX0RJVklERToKKyAgICAgICAgICAgIGlmICghX1B5X1FuZXdGbGFnKSB7CisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZURpdmlkZSh2LCB3KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiAtUW5ldyBpcyBpbiBlZmZlY3Q6ICAgICAgICAgICAgICBmYWxsIHRocm91Z2ggdG8KKyAgICAgICAgICAgICAgIElOUExBQ0VfVFJVRV9ESVZJREUgKi8KKyAgICAgICAgY2FzZSBJTlBMQUNFX1RSVUVfRElWSURFOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX0ZMT09SX0RJVklERToKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGUodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX0ZMT09SX0RJVklERToKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGUodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElOUExBQ0VfTU9EVUxPOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXIodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX01PRFVMTzoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlUmVtYWluZGVyKHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX0FERDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCWlmIChQeUludF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKLQkJCQkvKiBJTkxJTkU6IGludCArIGludCAqLwotCQkJCXJlZ2lzdGVyIGxvbmcgYSwgYiwgaTsKLQkJCQlhID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJCQliID0gUHlJbnRfQVNfTE9ORyh3KTsKLQkJCQlpID0gYSArIGI7Ci0JCQkJaWYgKChpXmEpIDwgMCAmJiAoaV5iKSA8IDApCi0JCQkJCWdvdG8gc2xvd19pYWRkOwotCQkJCXggPSBQeUludF9Gcm9tTG9uZyhpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodikgJiYKLQkJCQkgUHlTdHJpbmdfQ2hlY2tFeGFjdCh3KSkgewotCQkJCXggPSBzdHJpbmdfY29uY2F0ZW5hdGUodiwgdywgZiwgbmV4dF9pbnN0cik7Ci0JCQkJLyogc3RyaW5nX2NvbmNhdGVuYXRlIGNvbnN1bWVkIHRoZSByZWYgdG8gdiAqLwotCQkJCWdvdG8gc2tpcF9kZWNyZWZfdjsKLQkJCX0KLQkJCWVsc2UgewotCQkJICBzbG93X2lhZGQ6Ci0JCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VBZGQodiwgdyk7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYodik7Ci0JCSAgc2tpcF9kZWNyZWZfdjoKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIElOUExBQ0VfQUREOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodikgJiYgUHlJbnRfQ2hlY2tFeGFjdCh3KSkgeworICAgICAgICAgICAgICAgIC8qIElOTElORTogaW50ICsgaW50ICovCisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgbG9uZyBhLCBiLCBpOworICAgICAgICAgICAgICAgIGEgPSBQeUludF9BU19MT05HKHYpOworICAgICAgICAgICAgICAgIGIgPSBQeUludF9BU19MT05HKHcpOworICAgICAgICAgICAgICAgIGkgPSBhICsgYjsKKyAgICAgICAgICAgICAgICBpZiAoKGleYSkgPCAwICYmIChpXmIpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBzbG93X2lhZGQ7CisgICAgICAgICAgICAgICAgeCA9IFB5SW50X0Zyb21Mb25nKGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSAmJgorICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQ2hlY2tFeGFjdCh3KSkgeworICAgICAgICAgICAgICAgIHggPSBzdHJpbmdfY29uY2F0ZW5hdGUodiwgdywgZiwgbmV4dF9pbnN0cik7CisgICAgICAgICAgICAgICAgLyogc3RyaW5nX2NvbmNhdGVuYXRlIGNvbnN1bWVkIHRoZSByZWYgdG8gdiAqLworICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9kZWNyZWZfdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBzbG93X2lhZGQ6CisgICAgICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VBZGQodiwgdyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgc2tpcF9kZWNyZWZfdjoKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9TVUJUUkFDVDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCWlmIChQeUludF9DaGVja0V4YWN0KHYpICYmIFB5SW50X0NoZWNrRXhhY3QodykpIHsKLQkJCQkvKiBJTkxJTkU6IGludCAtIGludCAqLwotCQkJCXJlZ2lzdGVyIGxvbmcgYSwgYiwgaTsKLQkJCQlhID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJCQliID0gUHlJbnRfQVNfTE9ORyh3KTsKLQkJCQlpID0gYSAtIGI7Ci0JCQkJaWYgKChpXmEpIDwgMCAmJiAoaV5+YikgPCAwKQotCQkJCQlnb3RvIHNsb3dfaXN1YjsKLQkJCQl4ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCSAgc2xvd19pc3ViOgotCQkJCXggPSBQeU51bWJlcl9JblBsYWNlU3VidHJhY3Qodiwgdyk7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX1NVQlRSQUNUOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrRXhhY3QodikgJiYgUHlJbnRfQ2hlY2tFeGFjdCh3KSkgeworICAgICAgICAgICAgICAgIC8qIElOTElORTogaW50IC0gaW50ICovCisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgbG9uZyBhLCBiLCBpOworICAgICAgICAgICAgICAgIGEgPSBQeUludF9BU19MT05HKHYpOworICAgICAgICAgICAgICAgIGIgPSBQeUludF9BU19MT05HKHcpOworICAgICAgICAgICAgICAgIGkgPSBhIC0gYjsKKyAgICAgICAgICAgICAgICBpZiAoKGleYSkgPCAwICYmIChpXn5iKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gc2xvd19pc3ViOworICAgICAgICAgICAgICAgIHggPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBzbG93X2lzdWI6CisgICAgICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdCh2LCB3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9MU0hJRlQ6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfSW5QbGFjZUxzaGlmdCh2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIElOUExBQ0VfTFNISUZUOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VMc2hpZnQodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElOUExBQ0VfUlNISUZUOgotCQkJdyA9IFBPUCgpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5TnVtYmVyX0luUGxhY2VSc2hpZnQodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTlBMQUNFX1JTSElGVDoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlUnNoaWZ0KHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBJTlBMQUNFX0FORDoKLQkJCXcgPSBQT1AoKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU51bWJlcl9JblBsYWNlQW5kKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9BTkQ6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlOdW1iZXJfSW5QbGFjZUFuZCh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU5QTEFDRV9YT1I6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfSW5QbGFjZVhvcih2LCB3KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIElOUExBQ0VfWE9SOgorICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5TnVtYmVyX0luUGxhY2VYb3Iodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIElOUExBQ0VfT1I6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQl4ID0gUHlOdW1iZXJfSW5QbGFjZU9yKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU5QTEFDRV9PUjoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9JblBsYWNlT3Iodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFNMSUNFKzA6Ci0JCWNhc2UgU0xJQ0UrMToKLQkJY2FzZSBTTElDRSsyOgotCQljYXNlIFNMSUNFKzM6Ci0JCQlpZiAoKG9wY29kZS1TTElDRSkgJiAyKQotCQkJCXcgPSBQT1AoKTsKLQkJCWVsc2UKLQkJCQl3ID0gTlVMTDsKLQkJCWlmICgob3Bjb2RlLVNMSUNFKSAmIDEpCi0JCQkJdiA9IFBPUCgpOwotCQkJZWxzZQotCQkJCXYgPSBOVUxMOwotCQkJdSA9IFRPUCgpOwotCQkJeCA9IGFwcGx5X3NsaWNlKHUsIHYsIHcpOwotCQkJUHlfREVDUkVGKHUpOwotCQkJUHlfWERFQ1JFRih2KTsKLQkJCVB5X1hERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBTTElDRSswOgorICAgICAgICBjYXNlIFNMSUNFKzE6CisgICAgICAgIGNhc2UgU0xJQ0UrMjoKKyAgICAgICAgY2FzZSBTTElDRSszOgorICAgICAgICAgICAgaWYgKChvcGNvZGUtU0xJQ0UpICYgMikKKyAgICAgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdyA9IE5VTEw7CisgICAgICAgICAgICBpZiAoKG9wY29kZS1TTElDRSkgJiAxKQorICAgICAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgICAgIHUgPSBUT1AoKTsKKyAgICAgICAgICAgIHggPSBhcHBseV9zbGljZSh1LCB2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBTVE9SRV9TTElDRSswOgotCQljYXNlIFNUT1JFX1NMSUNFKzE6Ci0JCWNhc2UgU1RPUkVfU0xJQ0UrMjoKLQkJY2FzZSBTVE9SRV9TTElDRSszOgotCQkJaWYgKChvcGNvZGUtU1RPUkVfU0xJQ0UpICYgMikKLQkJCQl3ID0gUE9QKCk7Ci0JCQllbHNlCi0JCQkJdyA9IE5VTEw7Ci0JCQlpZiAoKG9wY29kZS1TVE9SRV9TTElDRSkgJiAxKQotCQkJCXYgPSBQT1AoKTsKLQkJCWVsc2UKLQkJCQl2ID0gTlVMTDsKLQkJCXUgPSBQT1AoKTsKLQkJCXQgPSBQT1AoKTsKLQkJCWVyciA9IGFzc2lnbl9zbGljZSh1LCB2LCB3LCB0KTsgLyogdVt2OnddID0gdCAqLwotCQkJUHlfREVDUkVGKHQpOwotCQkJUHlfREVDUkVGKHUpOwotCQkJUHlfWERFQ1JFRih2KTsKLQkJCVB5X1hERUNSRUYodyk7Ci0JCQlpZiAoZXJyID09IDApIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUkVfU0xJQ0UrMDoKKyAgICAgICAgY2FzZSBTVE9SRV9TTElDRSsxOgorICAgICAgICBjYXNlIFNUT1JFX1NMSUNFKzI6CisgICAgICAgIGNhc2UgU1RPUkVfU0xJQ0UrMzoKKyAgICAgICAgICAgIGlmICgob3Bjb2RlLVNUT1JFX1NMSUNFKSAmIDIpCisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHcgPSBOVUxMOworICAgICAgICAgICAgaWYgKChvcGNvZGUtU1RPUkVfU0xJQ0UpICYgMSkKKyAgICAgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICB1ID0gUE9QKCk7CisgICAgICAgICAgICB0ID0gUE9QKCk7CisgICAgICAgICAgICBlcnIgPSBhc3NpZ25fc2xpY2UodSwgdiwgdywgdCk7IC8qIHVbdjp3XSA9IHQgKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRih0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHcpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgREVMRVRFX1NMSUNFKzA6Ci0JCWNhc2UgREVMRVRFX1NMSUNFKzE6Ci0JCWNhc2UgREVMRVRFX1NMSUNFKzI6Ci0JCWNhc2UgREVMRVRFX1NMSUNFKzM6Ci0JCQlpZiAoKG9wY29kZS1ERUxFVEVfU0xJQ0UpICYgMikKLQkJCQl3ID0gUE9QKCk7Ci0JCQllbHNlCi0JCQkJdyA9IE5VTEw7Ci0JCQlpZiAoKG9wY29kZS1ERUxFVEVfU0xJQ0UpICYgMSkKLQkJCQl2ID0gUE9QKCk7Ci0JCQllbHNlCi0JCQkJdiA9IE5VTEw7Ci0JCQl1ID0gUE9QKCk7Ci0JCQllcnIgPSBhc3NpZ25fc2xpY2UodSwgdiwgdywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JCQkJCQkJLyogZGVsIHVbdjp3XSAqLwotCQkJUHlfREVDUkVGKHUpOwotCQkJUHlfWERFQ1JFRih2KTsKLQkJCVB5X1hERUNSRUYodyk7Ci0JCQlpZiAoZXJyID09IDApIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzA6CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzE6CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzI6CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzM6CisgICAgICAgICAgICBpZiAoKG9wY29kZS1ERUxFVEVfU0xJQ0UpICYgMikKKyAgICAgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdyA9IE5VTEw7CisgICAgICAgICAgICBpZiAoKG9wY29kZS1ERUxFVEVfU0xJQ0UpICYgMSkKKyAgICAgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICB1ID0gUE9QKCk7CisgICAgICAgICAgICBlcnIgPSBhc3NpZ25fc2xpY2UodSwgdiwgdywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlbCB1W3Y6d10gKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHcpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1RPUkVfU1VCU0NSOgotCQkJdyA9IFRPUCgpOwotCQkJdiA9IFNFQ09ORCgpOwotCQkJdSA9IFRISVJEKCk7Ci0JCQlTVEFDS0FESigtMyk7Ci0JCQkvKiB2W3ddID0gdSAqLwotCQkJZXJyID0gUHlPYmplY3RfU2V0SXRlbSh2LCB3LCB1KTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWlmIChlcnIgPT0gMCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBTVE9SRV9TVUJTQ1I6CisgICAgICAgICAgICB3ID0gVE9QKCk7CisgICAgICAgICAgICB2ID0gU0VDT05EKCk7CisgICAgICAgICAgICB1ID0gVEhJUkQoKTsKKyAgICAgICAgICAgIFNUQUNLQURKKC0zKTsKKyAgICAgICAgICAgIC8qIHZbd10gPSB1ICovCisgICAgICAgICAgICBlcnIgPSBQeU9iamVjdF9TZXRJdGVtKHYsIHcsIHUpOworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgREVMRVRFX1NVQlNDUjoKLQkJCXcgPSBUT1AoKTsKLQkJCXYgPSBTRUNPTkQoKTsKLQkJCVNUQUNLQURKKC0yKTsKLQkJCS8qIGRlbCB2W3ddICovCi0JCQllcnIgPSBQeU9iamVjdF9EZWxJdGVtKHYsIHcpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJaWYgKGVyciA9PSAwKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIERFTEVURV9TVUJTQ1I6CisgICAgICAgICAgICB3ID0gVE9QKCk7CisgICAgICAgICAgICB2ID0gU0VDT05EKCk7CisgICAgICAgICAgICBTVEFDS0FESigtMik7CisgICAgICAgICAgICAvKiBkZWwgdlt3XSAqLworICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfRGVsSXRlbSh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBSSU5UX0VYUFI6Ci0JCQl2ID0gUE9QKCk7Ci0JCQl3ID0gUHlTeXNfR2V0T2JqZWN0KCJkaXNwbGF5aG9vayIpOwotCQkJaWYgKHcgPT0gTlVMTCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJCQkibG9zdCBzeXMuZGlzcGxheWhvb2siKTsKLQkJCQllcnIgPSAtMTsKLQkJCQl4ID0gTlVMTDsKLQkJCX0KLQkJCWlmIChlcnIgPT0gMCkgewotCQkJCXggPSBQeVR1cGxlX1BhY2soMSwgdik7Ci0JCQkJaWYgKHggPT0gTlVMTCkKLQkJCQkJZXJyID0gLTE7Ci0JCQl9Ci0JCQlpZiAoZXJyID09IDApIHsKLQkJCQl3ID0gUHlFdmFsX0NhbGxPYmplY3QodywgeCk7Ci0JCQkJUHlfWERFQ1JFRih3KTsKLQkJCQlpZiAodyA9PSBOVUxMKQotCQkJCQllcnIgPSAtMTsKLQkJCX0KLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X1hERUNSRUYoeCk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBQUklOVF9FWFBSOgorICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgdyA9IFB5U3lzX0dldE9iamVjdCgiZGlzcGxheWhvb2siKTsKKyAgICAgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9zdCBzeXMuZGlzcGxheWhvb2siKTsKKyAgICAgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgICAgICAgICB4ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgICAgIHggPSBQeVR1cGxlX1BhY2soMSwgdik7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgICAgICB3ID0gUHlFdmFsX0NhbGxPYmplY3QodywgeCk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgICAgICBpZiAodyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoeCk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBSSU5UX0lURU1fVE86Ci0JCQl3ID0gc3RyZWFtID0gUE9QKCk7Ci0JCQkvKiBmYWxsIHRocm91Z2ggdG8gUFJJTlRfSVRFTSAqLworICAgICAgICBjYXNlIFBSSU5UX0lURU1fVE86CisgICAgICAgICAgICB3ID0gc3RyZWFtID0gUE9QKCk7CisgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdG8gUFJJTlRfSVRFTSAqLwogCi0JCWNhc2UgUFJJTlRfSVRFTToKLQkJCXYgPSBQT1AoKTsKLQkJCWlmIChzdHJlYW0gPT0gTlVMTCB8fCBzdHJlYW0gPT0gUHlfTm9uZSkgewotCQkJCXcgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOwotCQkJCWlmICh3ID09IE5VTEwpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkJCQkibG9zdCBzeXMuc3Rkb3V0Iik7Ci0JCQkJCWVyciA9IC0xOwotCQkJCX0KLQkJCX0KLQkJCS8qIFB5RmlsZV9Tb2Z0U3BhY2UoKSBjYW4gZXhlY2VjdXRlIGFyYml0cmFyeSBjb2RlCi0JCQkgICBpZiBzeXMuc3Rkb3V0IGlzIGFuIGluc3RhbmNlIHdpdGggYSBfX2dldGF0dHJfXy4KLQkJCSAgIElmIF9fZ2V0YXR0cl9fIHJhaXNlcyBhbiBleGNlcHRpb24sIHcgd2lsbAotCQkJICAgYmUgZnJlZWQsIHNvIHdlIG5lZWQgdG8gcHJldmVudCB0aGF0IHRlbXBvcmFyaWx5LiAqLwotCQkJUHlfWElOQ1JFRih3KTsKLQkJCWlmICh3ICE9IE5VTEwgJiYgUHlGaWxlX1NvZnRTcGFjZSh3LCAwKSkKLQkJCQllcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIiAiLCB3KTsKLQkJCWlmIChlcnIgPT0gMCkKLQkJCQllcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QodiwgdywgUHlfUFJJTlRfUkFXKTsKLQkJCWlmIChlcnIgPT0gMCkgewotCQkJICAgIC8qIFhYWCBtb3ZlIGludG8gd3JpdGVvYmplY3QoKSA/ICovCi0JCQkgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCQkJY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORyh2KTsKLQkJCQlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCQkJCWlmIChsZW4gPT0gMCB8fAotCQkJCSAgICAhaXNzcGFjZShQeV9DSEFSTUFTSyhzW2xlbi0xXSkpIHx8Ci0JCQkJICAgIHNbbGVuLTFdID09ICcgJykKLQkJCQkJUHlGaWxlX1NvZnRTcGFjZSh3LCAxKTsKLQkJCSAgICB9CisgICAgICAgIGNhc2UgUFJJTlRfSVRFTToKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCB8fCBzdHJlYW0gPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIHcgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOworICAgICAgICAgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3N0IHN5cy5zdGRvdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogUHlGaWxlX1NvZnRTcGFjZSgpIGNhbiBleGVjZWN1dGUgYXJiaXRyYXJ5IGNvZGUKKyAgICAgICAgICAgICAgIGlmIHN5cy5zdGRvdXQgaXMgYW4gaW5zdGFuY2Ugd2l0aCBhIF9fZ2V0YXR0cl9fLgorICAgICAgICAgICAgICAgSWYgX19nZXRhdHRyX18gcmFpc2VzIGFuIGV4Y2VwdGlvbiwgdyB3aWxsCisgICAgICAgICAgICAgICBiZSBmcmVlZCwgc28gd2UgbmVlZCB0byBwcmV2ZW50IHRoYXQgdGVtcG9yYXJpbHkuICovCisgICAgICAgICAgICBQeV9YSU5DUkVGKHcpOworICAgICAgICAgICAgaWYgKHcgIT0gTlVMTCAmJiBQeUZpbGVfU29mdFNwYWNlKHcsIDApKQorICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiICIsIHcpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKQorICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZU9iamVjdCh2LCB3LCBQeV9QUklOVF9SQVcpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogWFhYIG1vdmUgaW50byB3cml0ZW9iamVjdCgpID8gKi8KKyAgICAgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpzID0gUHlTdHJpbmdfQVNfU1RSSU5HKHYpOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICFpc3NwYWNlKFB5X0NIQVJNQVNLKHNbbGVuLTFdKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgc1tsZW4tMV0gPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICBQeUZpbGVfU29mdFNwYWNlKHcsIDEpOworICAgICAgICAgICAgICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQkgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7Ci0JCQkJUHlfVU5JQ09ERSAqcyA9IFB5VW5pY29kZV9BU19VTklDT0RFKHYpOwotCQkJCVB5X3NzaXplX3QgbGVuID0gUHlVbmljb2RlX0dFVF9TSVpFKHYpOwotCQkJCWlmIChsZW4gPT0gMCB8fAotCQkJCSAgICAhUHlfVU5JQ09ERV9JU1NQQUNFKHNbbGVuLTFdKSB8fAotCQkJCSAgICBzW2xlbi0xXSA9PSAnICcpCi0JCQkJICAgIFB5RmlsZV9Tb2Z0U3BhY2UodywgMSk7Ci0JCQkgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIFB5X1VOSUNPREUgKnMgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KTsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5VW5pY29kZV9HRVRfU0laRSh2KTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIVB5X1VOSUNPREVfSVNTUEFDRShzW2xlbi0xXSkgfHwKKyAgICAgICAgICAgICAgICAgICAgc1tsZW4tMV0gPT0gJyAnKQorICAgICAgICAgICAgICAgICAgICBQeUZpbGVfU29mdFNwYWNlKHcsIDEpOworICAgICAgICAgICAgICAgIH0KICNlbmRpZgotCQkJICAgIGVsc2UKLQkJCSAgICAJUHlGaWxlX1NvZnRTcGFjZSh3LCAxKTsKLQkJCX0KLQkJCVB5X1hERUNSRUYodyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9YREVDUkVGKHN0cmVhbSk7Ci0JCQlzdHJlYW0gPSBOVUxMOwotCQkJaWYgKGVyciA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5RmlsZV9Tb2Z0U3BhY2UodywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9YREVDUkVGKHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfWERFQ1JFRihzdHJlYW0pOworICAgICAgICAgICAgc3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgUFJJTlRfTkVXTElORV9UTzoKLQkJCXcgPSBzdHJlYW0gPSBQT1AoKTsKLQkJCS8qIGZhbGwgdGhyb3VnaCB0byBQUklOVF9ORVdMSU5FICovCisgICAgICAgIGNhc2UgUFJJTlRfTkVXTElORV9UTzoKKyAgICAgICAgICAgIHcgPSBzdHJlYW0gPSBQT1AoKTsKKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0byBQUklOVF9ORVdMSU5FICovCiAKLQkJY2FzZSBQUklOVF9ORVdMSU5FOgotCQkJaWYgKHN0cmVhbSA9PSBOVUxMIHx8IHN0cmVhbSA9PSBQeV9Ob25lKSB7Ci0JCQkJdyA9IFB5U3lzX0dldE9iamVjdCgic3Rkb3V0Iik7Ci0JCQkJaWYgKHcgPT0gTlVMTCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJCQkJCSJsb3N0IHN5cy5zdGRvdXQiKTsKLQkJCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodyAhPSBOVUxMKSB7Ci0JCQkJLyogdy53cml0ZSgpIG1heSByZXBsYWNlIHN5cy5zdGRvdXQsIHNvIHdlCi0JCQkJICogaGF2ZSB0byBrZWVwIG91ciByZWZlcmVuY2UgdG8gaXQgKi8KLQkJCQlQeV9JTkNSRUYodyk7Ci0JCQkJZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIHcpOwotCQkJCWlmIChlcnIgPT0gMCkKLQkJCQkJUHlGaWxlX1NvZnRTcGFjZSh3LCAwKTsKLQkJCQlQeV9ERUNSRUYodyk7Ci0JCQl9Ci0JCQlQeV9YREVDUkVGKHN0cmVhbSk7Ci0JCQlzdHJlYW0gPSBOVUxMOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgUFJJTlRfTkVXTElORToKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCB8fCBzdHJlYW0gPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIHcgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOworICAgICAgICAgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3N0IHN5cy5zdGRvdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogdy53cml0ZSgpIG1heSByZXBsYWNlIHN5cy5zdGRvdXQsIHNvIHdlCisgICAgICAgICAgICAgICAgICogaGF2ZSB0byBrZWVwIG91ciByZWZlcmVuY2UgdG8gaXQgKi8KKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodyk7CisgICAgICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIHcpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgUHlGaWxlX1NvZnRTcGFjZSh3LCAwKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9YREVDUkVGKHN0cmVhbSk7CisgICAgICAgICAgICBzdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CiAKIAogI2lmZGVmIENBU0VfVE9PX0JJRwotCQlkZWZhdWx0OiBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBkZWZhdWx0OiBzd2l0Y2ggKG9wY29kZSkgewogI2VuZGlmCi0JCWNhc2UgUkFJU0VfVkFSQVJHUzoKLQkJCXUgPSB2ID0gdyA9IE5VTEw7Ci0JCQlzd2l0Y2ggKG9wYXJnKSB7Ci0JCQljYXNlIDM6Ci0JCQkJdSA9IFBPUCgpOyAvKiB0cmFjZWJhY2sgKi8KLQkJCQkvKiBGYWxsdGhyb3VnaCAqLwotCQkJY2FzZSAyOgotCQkJCXYgPSBQT1AoKTsgLyogdmFsdWUgKi8KLQkJCQkvKiBGYWxsdGhyb3VnaCAqLwotCQkJY2FzZSAxOgotCQkJCXcgPSBQT1AoKTsgLyogZXhjICovCi0JCQljYXNlIDA6IC8qIEZhbGx0aHJvdWdoICovCi0JCQkJd2h5ID0gZG9fcmFpc2UodywgdiwgdSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJICAgImJhZCBSQUlTRV9WQVJBUkdTIG9wYXJnIik7Ci0JCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOworICAgICAgICBjYXNlIFJBSVNFX1ZBUkFSR1M6CisgICAgICAgICAgICB1ID0gdiA9IHcgPSBOVUxMOworICAgICAgICAgICAgc3dpdGNoIChvcGFyZykgeworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHUgPSBQT1AoKTsgLyogdHJhY2ViYWNrICovCisgICAgICAgICAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICB2ID0gUE9QKCk7IC8qIHZhbHVlICovCisgICAgICAgICAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICB3ID0gUE9QKCk7IC8qIGV4YyAqLworICAgICAgICAgICAgY2FzZSAwOiAvKiBGYWxsdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIHdoeSA9IGRvX3JhaXNlKHcsIHYsIHUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIFJBSVNFX1ZBUkFSR1Mgb3BhcmciKTsKKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBMT0FEX0xPQ0FMUzoKLQkJCWlmICgoeCA9IGYtPmZfbG9jYWxzKSAhPSBOVUxMKSB7Ci0JCQkJUHlfSU5DUkVGKHgpOwotCQkJCVBVU0goeCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJubyBsb2NhbHMiKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIExPQURfTE9DQUxTOgorICAgICAgICAgICAgaWYgKCh4ID0gZi0+Zl9sb2NhbHMpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIm5vIGxvY2FscyIpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBSRVRVUk5fVkFMVUU6Ci0JCQlyZXR2YWwgPSBQT1AoKTsKLQkJCXdoeSA9IFdIWV9SRVRVUk47Ci0JCQlnb3RvIGZhc3RfYmxvY2tfZW5kOworICAgICAgICBjYXNlIFJFVFVSTl9WQUxVRToKKyAgICAgICAgICAgIHJldHZhbCA9IFBPUCgpOworICAgICAgICAgICAgd2h5ID0gV0hZX1JFVFVSTjsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9ibG9ja19lbmQ7CiAKLQkJY2FzZSBZSUVMRF9WQUxVRToKLQkJCXJldHZhbCA9IFBPUCgpOwotCQkJZi0+Zl9zdGFja3RvcCA9IHN0YWNrX3BvaW50ZXI7Ci0JCQl3aHkgPSBXSFlfWUlFTEQ7Ci0JCQlnb3RvIGZhc3RfeWllbGQ7CisgICAgICAgIGNhc2UgWUlFTERfVkFMVUU6CisgICAgICAgICAgICByZXR2YWwgPSBQT1AoKTsKKyAgICAgICAgICAgIGYtPmZfc3RhY2t0b3AgPSBzdGFja19wb2ludGVyOworICAgICAgICAgICAgd2h5ID0gV0hZX1lJRUxEOworICAgICAgICAgICAgZ290byBmYXN0X3lpZWxkOwogCi0JCWNhc2UgRVhFQ19TVE1UOgotCQkJdyA9IFRPUCgpOwotCQkJdiA9IFNFQ09ORCgpOwotCQkJdSA9IFRISVJEKCk7Ci0JCQlTVEFDS0FESigtMyk7Ci0JCQlSRUFEX1RJTUVTVEFNUChpbnRyMCk7Ci0JCQllcnIgPSBleGVjX3N0YXRlbWVudChmLCB1LCB2LCB3KTsKLQkJCVJFQURfVElNRVNUQU1QKGludHIxKTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEVYRUNfU1RNVDoKKyAgICAgICAgICAgIHcgPSBUT1AoKTsKKyAgICAgICAgICAgIHYgPSBTRUNPTkQoKTsKKyAgICAgICAgICAgIHUgPSBUSElSRCgpOworICAgICAgICAgICAgU1RBQ0tBREooLTMpOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjApOworICAgICAgICAgICAgZXJyID0gZXhlY19zdGF0ZW1lbnQoZiwgdSwgdiwgdyk7CisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFBPUF9CTE9DSzoKLQkJCXsKLQkJCQlQeVRyeUJsb2NrICpiID0gUHlGcmFtZV9CbG9ja1BvcChmKTsKLQkJCQl3aGlsZSAoU1RBQ0tfTEVWRUwoKSA+IGItPmJfbGV2ZWwpIHsKLQkJCQkJdiA9IFBPUCgpOwotCQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJfQotCQkJfQotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgUE9QX0JMT0NLOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFB5VHJ5QmxvY2sgKmIgPSBQeUZyYW1lX0Jsb2NrUG9wKGYpOworICAgICAgICAgICAgICAgIHdoaWxlIChTVEFDS19MRVZFTCgpID4gYi0+Yl9sZXZlbCkgeworICAgICAgICAgICAgICAgICAgICB2ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQlQUkVESUNURUQoRU5EX0ZJTkFMTFkpOwotCQljYXNlIEVORF9GSU5BTExZOgotCQkJdiA9IFBPUCgpOwotCQkJaWYgKFB5SW50X0NoZWNrKHYpKSB7Ci0JCQkJd2h5ID0gKGVudW0gd2h5X2NvZGUpIFB5SW50X0FTX0xPTkcodik7Ci0JCQkJYXNzZXJ0KHdoeSAhPSBXSFlfWUlFTEQpOwotCQkJCWlmICh3aHkgPT0gV0hZX1JFVFVSTiB8fAotCQkJCSAgICB3aHkgPT0gV0hZX0NPTlRJTlVFKQotCQkJCQlyZXR2YWwgPSBQT1AoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodikgfHwKLQkJCSAgICAgICAgIFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCQkJdyA9IFBPUCgpOwotCQkJCXUgPSBQT1AoKTsKLQkJCQlQeUVycl9SZXN0b3JlKHYsIHcsIHUpOwotCQkJCXdoeSA9IFdIWV9SRVJBSVNFOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAodiAhPSBQeV9Ob25lKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkiJ2ZpbmFsbHknIHBvcHMgYmFkIGV4Y2VwdGlvbiIpOwotCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQl9Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlicmVhazsKKyAgICAgICAgUFJFRElDVEVEKEVORF9GSU5BTExZKTsKKyAgICAgICAgY2FzZSBFTkRfRklOQUxMWToKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIGlmIChQeUludF9DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIHdoeSA9IChlbnVtIHdoeV9jb2RlKSBQeUludF9BU19MT05HKHYpOworICAgICAgICAgICAgICAgIGFzc2VydCh3aHkgIT0gV0hZX1lJRUxEKTsKKyAgICAgICAgICAgICAgICBpZiAod2h5ID09IFdIWV9SRVRVUk4gfHwKKyAgICAgICAgICAgICAgICAgICAgd2h5ID09IFdIWV9DT05USU5VRSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUE9QKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHYpIHx8CisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19DaGVjayh2KSkgeworICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICB1ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgUHlFcnJfUmVzdG9yZSh2LCB3LCB1KTsKKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfUkVSQUlTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHYgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIidmaW5hbGx5JyBwb3BzIGJhZCBleGNlcHRpb24iKTsKKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCVUlMRF9DTEFTUzoKLQkJCXUgPSBUT1AoKTsKLQkJCXYgPSBTRUNPTkQoKTsKLQkJCXcgPSBUSElSRCgpOwotCQkJU1RBQ0tBREooLTIpOwotCQkJeCA9IGJ1aWxkX2NsYXNzKHUsIHYsIHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih3KTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJVSUxEX0NMQVNTOgorICAgICAgICAgICAgdSA9IFRPUCgpOworICAgICAgICAgICAgdiA9IFNFQ09ORCgpOworICAgICAgICAgICAgdyA9IFRISVJEKCk7CisgICAgICAgICAgICBTVEFDS0FESigtMik7CisgICAgICAgICAgICB4ID0gYnVpbGRfY2xhc3ModSwgdiwgdyk7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBTVE9SRV9OQU1FOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCXYgPSBQT1AoKTsKLQkJCWlmICgoeCA9IGYtPmZfbG9jYWxzKSAhPSBOVUxMKSB7Ci0JCQkJaWYgKFB5RGljdF9DaGVja0V4YWN0KHgpKQotCQkJCQllcnIgPSBQeURpY3RfU2V0SXRlbSh4LCB3LCB2KTsKLQkJCQllbHNlCi0JCQkJCWVyciA9IFB5T2JqZWN0X1NldEl0ZW0oeCwgdywgdik7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCWlmIChlcnIgPT0gMCkgY29udGludWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJICAgICAibm8gbG9jYWxzIGZvdW5kIHdoZW4gc3RvcmluZyAlcyIsCi0JCQkJICAgICBQeU9iamVjdF9SRVBSKHcpKTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIFNUT1JFX05BTUU6CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgaWYgKCh4ID0gZi0+Zl9sb2NhbHMpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QoeCkpCisgICAgICAgICAgICAgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKHgsIHcsIHYpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfU2V0SXRlbSh4LCB3LCB2KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbG9jYWxzIGZvdW5kIHdoZW4gc3RvcmluZyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfUkVQUih3KSk7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIERFTEVURV9OQU1FOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCWlmICgoeCA9IGYtPmZfbG9jYWxzKSAhPSBOVUxMKSB7Ci0JCQkJaWYgKChlcnIgPSBQeU9iamVjdF9EZWxJdGVtKHgsIHcpKSAhPSAwKQotCQkJCQlmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeUV4Y19OYW1lRXJyb3IsCi0JCQkJCQkJICAgICBOQU1FX0VSUk9SX01TRywKLQkJCQkJCQkgICAgIHcpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSAgICAgIm5vIGxvY2FscyB3aGVuIGRlbGV0aW5nICVzIiwKLQkJCQkgICAgIFB5T2JqZWN0X1JFUFIodykpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgREVMRVRFX05BTUU6CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgaWYgKCh4ID0gZi0+Zl9sb2NhbHMpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGVyciA9IFB5T2JqZWN0X0RlbEl0ZW0oeCwgdykpICE9IDApCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKFB5RXhjX05hbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRV9FUlJPUl9NU0csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJubyBsb2NhbHMgd2hlbiBkZWxldGluZyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfUkVQUih3KSk7CisgICAgICAgICAgICBicmVhazsKIAotCQlQUkVESUNURURfV0lUSF9BUkcoVU5QQUNLX1NFUVVFTkNFKTsKLQkJY2FzZSBVTlBBQ0tfU0VRVUVOQ0U6Ci0JCQl2ID0gUE9QKCk7Ci0JCQlpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHYpICYmCi0JCQkgICAgUHlUdXBsZV9HRVRfU0laRSh2KSA9PSBvcGFyZykgewotCQkJCVB5T2JqZWN0ICoqaXRlbXMgPSBcCi0JCQkJCSgoUHlUdXBsZU9iamVjdCAqKXYpLT5vYl9pdGVtOwotCQkJCXdoaWxlIChvcGFyZy0tKSB7Ci0JCQkJCXcgPSBpdGVtc1tvcGFyZ107Ci0JCQkJCVB5X0lOQ1JFRih3KTsKLQkJCQkJUFVTSCh3KTsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChQeUxpc3RfQ2hlY2tFeGFjdCh2KSAmJgotCQkJCSAgIFB5TGlzdF9HRVRfU0laRSh2KSA9PSBvcGFyZykgewotCQkJCVB5T2JqZWN0ICoqaXRlbXMgPSBcCi0JCQkJCSgoUHlMaXN0T2JqZWN0ICopdiktPm9iX2l0ZW07Ci0JCQkJd2hpbGUgKG9wYXJnLS0pIHsKLQkJCQkJdyA9IGl0ZW1zW29wYXJnXTsKLQkJCQkJUHlfSU5DUkVGKHcpOwotCQkJCQlQVVNIKHcpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAodW5wYWNrX2l0ZXJhYmxlKHYsIG9wYXJnLAotCQkJCQkJICAgc3RhY2tfcG9pbnRlciArIG9wYXJnKSkgewotCQkJCXN0YWNrX3BvaW50ZXIgKz0gb3Bhcmc7Ci0JCQl9IGVsc2UgewotCQkJCS8qIHVucGFja19pdGVyYWJsZSgpIHJhaXNlZCBhbiBleGNlcHRpb24gKi8KLQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkJYnJlYWs7CisgICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhVTlBBQ0tfU0VRVUVOQ0UpOworICAgICAgICBjYXNlIFVOUEFDS19TRVFVRU5DRToKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QodikgJiYKKyAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKHYpID09IG9wYXJnKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKippdGVtcyA9IFwKKyAgICAgICAgICAgICAgICAgICAgKChQeVR1cGxlT2JqZWN0ICopdiktPm9iX2l0ZW07CisgICAgICAgICAgICAgICAgd2hpbGUgKG9wYXJnLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgdyA9IGl0ZW1zW29wYXJnXTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHcpOworICAgICAgICAgICAgICAgICAgICBQVVNIKHcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHYpICYmCisgICAgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfU0laRSh2KSA9PSBvcGFyZykgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqaXRlbXMgPSBcCisgICAgICAgICAgICAgICAgICAgICgoUHlMaXN0T2JqZWN0ICopdiktPm9iX2l0ZW07CisgICAgICAgICAgICAgICAgd2hpbGUgKG9wYXJnLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgdyA9IGl0ZW1zW29wYXJnXTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHcpOworICAgICAgICAgICAgICAgICAgICBQVVNIKHcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAodW5wYWNrX2l0ZXJhYmxlKHYsIG9wYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfcG9pbnRlciArIG9wYXJnKSkgeworICAgICAgICAgICAgICAgIHN0YWNrX3BvaW50ZXIgKz0gb3Bhcmc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIHVucGFja19pdGVyYWJsZSgpIHJhaXNlZCBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBTVE9SRV9BVFRSOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCXYgPSBUT1AoKTsKLQkJCXUgPSBTRUNPTkQoKTsKLQkJCVNUQUNLQURKKC0yKTsKLQkJCWVyciA9IFB5T2JqZWN0X1NldEF0dHIodiwgdywgdSk7IC8qIHYudyA9IHUgKi8KLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCWlmIChlcnIgPT0gMCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBTVE9SRV9BVFRSOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIHYgPSBUT1AoKTsKKyAgICAgICAgICAgIHUgPSBTRUNPTkQoKTsKKyAgICAgICAgICAgIFNUQUNLQURKKC0yKTsKKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X1NldEF0dHIodiwgdywgdSk7IC8qIHYudyA9IHUgKi8KKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIERFTEVURV9BVFRSOgotCQkJdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKLQkJCXYgPSBQT1AoKTsKLQkJCWVyciA9IFB5T2JqZWN0X1NldEF0dHIodiwgdywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JCQkJCQkJLyogZGVsIHYudyAqLwotCQkJUHlfREVDUkVGKHYpOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgREVMRVRFX0FUVFI6CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfU2V0QXR0cih2LCB3LCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVsIHYudyAqLworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBTVE9SRV9HTE9CQUw6Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJdiA9IFBPUCgpOwotCQkJZXJyID0gUHlEaWN0X1NldEl0ZW0oZi0+Zl9nbG9iYWxzLCB3LCB2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWlmIChlcnIgPT0gMCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBTVE9SRV9HTE9CQUw6CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oZi0+Zl9nbG9iYWxzLCB3LCB2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIERFTEVURV9HTE9CQUw6Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJaWYgKChlcnIgPSBQeURpY3RfRGVsSXRlbShmLT5mX2dsb2JhbHMsIHcpKSAhPSAwKQotCQkJCWZvcm1hdF9leGNfY2hlY2tfYXJnKAotCQkJCSAgICBQeUV4Y19OYW1lRXJyb3IsIEdMT0JBTF9OQU1FX0VSUk9SX01TRywgdyk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBERUxFVEVfR0xPQkFMOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIGlmICgoZXJyID0gUHlEaWN0X0RlbEl0ZW0oZi0+Zl9nbG9iYWxzLCB3KSkgIT0gMCkKKyAgICAgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZygKKyAgICAgICAgICAgICAgICAgICAgUHlFeGNfTmFtZUVycm9yLCBHTE9CQUxfTkFNRV9FUlJPUl9NU0csIHcpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBMT0FEX05BTUU6Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJaWYgKCh2ID0gZi0+Zl9sb2NhbHMpID09IE5VTEwpIHsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSAgICAgIm5vIGxvY2FscyB3aGVuIGxvYWRpbmcgJXMiLAotCQkJCQkgICAgIFB5T2JqZWN0X1JFUFIodykpOwotCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoUHlEaWN0X0NoZWNrRXhhY3QodikpIHsKLQkJCQl4ID0gUHlEaWN0X0dldEl0ZW0odiwgdyk7Ci0JCQkJUHlfWElOQ1JFRih4KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXggPSBQeU9iamVjdF9HZXRJdGVtKHYsIHcpOwotCQkJCWlmICh4ID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoCi0JCQkJCQkJUHlFeGNfS2V5RXJyb3IpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHggPT0gTlVMTCkgewotCQkJCXggPSBQeURpY3RfR2V0SXRlbShmLT5mX2dsb2JhbHMsIHcpOwotCQkJCWlmICh4ID09IE5VTEwpIHsKLQkJCQkJeCA9IFB5RGljdF9HZXRJdGVtKGYtPmZfYnVpbHRpbnMsIHcpOwotCQkJCQlpZiAoeCA9PSBOVUxMKSB7Ci0JCQkJCQlmb3JtYXRfZXhjX2NoZWNrX2FyZygKLQkJCQkJCQkgICAgUHlFeGNfTmFtZUVycm9yLAotCQkJCQkJCSAgICBOQU1FX0VSUk9SX01TRywgdyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlQeV9JTkNSRUYoeCk7Ci0JCQl9Ci0JCQlQVVNIKHgpOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9BRF9OQU1FOgorICAgICAgICAgICAgdyA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKKyAgICAgICAgICAgIGlmICgodiA9IGYtPmZfbG9jYWxzKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbG9jYWxzIHdoZW4gbG9hZGluZyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIodykpOworICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgICAgICAgICB4ID0gUHlEaWN0X0dldEl0ZW0odiwgdyk7CisgICAgICAgICAgICAgICAgUHlfWElOQ1JFRih4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHggPSBQeU9iamVjdF9HZXRJdGVtKHYsIHcpOworICAgICAgICAgICAgICAgIGlmICh4ID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19LZXlFcnJvcikpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgeCA9IFB5RGljdF9HZXRJdGVtKGYtPmZfZ2xvYmFscywgdyk7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gUHlEaWN0X0dldEl0ZW0oZi0+Zl9idWlsdGlucywgdyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFeGNfTmFtZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRV9FUlJPUl9NU0csIHcpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgTE9BRF9HTE9CQUw6Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodykpIHsKLQkJCQkvKiBJbmxpbmUgdGhlIFB5RGljdF9HZXRJdGVtKCkgY2FsbHMuCi0JCQkJICAgV0FSTklORzogdGhpcyBpcyBhbiBleHRyZW1lIHNwZWVkIGhhY2suCi0JCQkJICAgRG8gbm90IHRyeSB0aGlzIGF0IGhvbWUuICovCi0JCQkJbG9uZyBoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKXcpLT5vYl9zaGFzaDsKLQkJCQlpZiAoaGFzaCAhPSAtMSkgewotCQkJCQlQeURpY3RPYmplY3QgKmQ7Ci0JCQkJCVB5RGljdEVudHJ5ICplOwotCQkJCQlkID0gKFB5RGljdE9iamVjdCAqKShmLT5mX2dsb2JhbHMpOwotCQkJCQllID0gZC0+bWFfbG9va3VwKGQsIHcsIGhhc2gpOwotCQkJCQlpZiAoZSA9PSBOVUxMKSB7Ci0JCQkJCQl4ID0gTlVMTDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXggPSBlLT5tZV92YWx1ZTsKLQkJCQkJaWYgKHggIT0gTlVMTCkgewotCQkJCQkJUHlfSU5DUkVGKHgpOwotCQkJCQkJUFVTSCh4KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWQgPSAoUHlEaWN0T2JqZWN0ICopKGYtPmZfYnVpbHRpbnMpOwotCQkJCQllID0gZC0+bWFfbG9va3VwKGQsIHcsIGhhc2gpOwotCQkJCQlpZiAoZSA9PSBOVUxMKSB7Ci0JCQkJCQl4ID0gTlVMTDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXggPSBlLT5tZV92YWx1ZTsKLQkJCQkJaWYgKHggIT0gTlVMTCkgewotCQkJCQkJUHlfSU5DUkVGKHgpOwotCQkJCQkJUFVTSCh4KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWdvdG8gbG9hZF9nbG9iYWxfZXJyb3I7Ci0JCQkJfQotCQkJfQotCQkJLyogVGhpcyBpcyB0aGUgdW4taW5saW5lZCB2ZXJzaW9uIG9mIHRoZSBjb2RlIGFib3ZlICovCi0JCQl4ID0gUHlEaWN0X0dldEl0ZW0oZi0+Zl9nbG9iYWxzLCB3KTsKLQkJCWlmICh4ID09IE5VTEwpIHsKLQkJCQl4ID0gUHlEaWN0X0dldEl0ZW0oZi0+Zl9idWlsdGlucywgdyk7Ci0JCQkJaWYgKHggPT0gTlVMTCkgewotCQkJCSAgbG9hZF9nbG9iYWxfZXJyb3I6Ci0JCQkJCWZvcm1hdF9leGNfY2hlY2tfYXJnKAotCQkJCQkJICAgIFB5RXhjX05hbWVFcnJvciwKLQkJCQkJCSAgICBHTE9CQUxfTkFNRV9FUlJPUl9NU0csIHcpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlQeV9JTkNSRUYoeCk7Ci0JCQlQVVNIKHgpOwotCQkJY29udGludWU7CisgICAgICAgIGNhc2UgTE9BRF9HTE9CQUw6CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrRXhhY3QodykpIHsKKyAgICAgICAgICAgICAgICAvKiBJbmxpbmUgdGhlIFB5RGljdF9HZXRJdGVtKCkgY2FsbHMuCisgICAgICAgICAgICAgICAgICAgV0FSTklORzogdGhpcyBpcyBhbiBleHRyZW1lIHNwZWVkIGhhY2suCisgICAgICAgICAgICAgICAgICAgRG8gbm90IHRyeSB0aGlzIGF0IGhvbWUuICovCisgICAgICAgICAgICAgICAgbG9uZyBoYXNoID0gKChQeVN0cmluZ09iamVjdCAqKXcpLT5vYl9zaGFzaDsKKyAgICAgICAgICAgICAgICBpZiAoaGFzaCAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBQeURpY3RPYmplY3QgKmQ7CisgICAgICAgICAgICAgICAgICAgIFB5RGljdEVudHJ5ICplOworICAgICAgICAgICAgICAgICAgICBkID0gKFB5RGljdE9iamVjdCAqKShmLT5mX2dsb2JhbHMpOworICAgICAgICAgICAgICAgICAgICBlID0gZC0+bWFfbG9va3VwKGQsIHcsIGhhc2gpOworICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHggPSBlLT5tZV92YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGQgPSAoUHlEaWN0T2JqZWN0ICopKGYtPmZfYnVpbHRpbnMpOworICAgICAgICAgICAgICAgICAgICBlID0gZC0+bWFfbG9va3VwKGQsIHcsIGhhc2gpOworICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHggPSBlLT5tZV92YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdvdG8gbG9hZF9nbG9iYWxfZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgdW4taW5saW5lZCB2ZXJzaW9uIG9mIHRoZSBjb2RlIGFib3ZlICovCisgICAgICAgICAgICB4ID0gUHlEaWN0X0dldEl0ZW0oZi0+Zl9nbG9iYWxzLCB3KTsKKyAgICAgICAgICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB4ID0gUHlEaWN0X0dldEl0ZW0oZi0+Zl9idWlsdGlucywgdyk7CisgICAgICAgICAgICAgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgbG9hZF9nbG9iYWxfZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19OYW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9OQU1FX0VSUk9SX01TRywgdyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIERFTEVURV9GQVNUOgotCQkJeCA9IEdFVExPQ0FMKG9wYXJnKTsKLQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQlTRVRMT0NBTChvcGFyZywgTlVMTCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlmb3JtYXRfZXhjX2NoZWNrX2FyZygKLQkJCQlQeUV4Y19VbmJvdW5kTG9jYWxFcnJvciwKLQkJCQlVTkJPVU5ETE9DQUxfRVJST1JfTVNHLAotCQkJCVB5VHVwbGVfR2V0SXRlbShjby0+Y29fdmFybmFtZXMsIG9wYXJnKQotCQkJCSk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBERUxFVEVfRkFTVDoKKyAgICAgICAgICAgIHggPSBHRVRMT0NBTChvcGFyZyk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU0VUTE9DQUwob3BhcmcsIE5VTEwpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0X2V4Y19jaGVja19hcmcoCisgICAgICAgICAgICAgICAgUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IsCisgICAgICAgICAgICAgICAgVU5CT1VORExPQ0FMX0VSUk9SX01TRywKKyAgICAgICAgICAgICAgICBQeVR1cGxlX0dldEl0ZW0oY28tPmNvX3Zhcm5hbWVzLCBvcGFyZykKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBMT0FEX0NMT1NVUkU6Ci0JCQl4ID0gZnJlZXZhcnNbb3BhcmddOwotCQkJUHlfSU5DUkVGKHgpOwotCQkJUFVTSCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgTE9BRF9DTE9TVVJFOgorICAgICAgICAgICAgeCA9IGZyZWV2YXJzW29wYXJnXTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTE9BRF9ERVJFRjoKLQkJCXggPSBmcmVldmFyc1tvcGFyZ107Ci0JCQl3ID0gUHlDZWxsX0dldCh4KTsKLQkJCWlmICh3ICE9IE5VTEwpIHsKLQkJCQlQVVNIKHcpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZXJyID0gLTE7Ci0JCQkvKiBEb24ndCBzdG9tcCBleGlzdGluZyBleGNlcHRpb24gKi8KLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCWJyZWFrOwotCQkJaWYgKG9wYXJnIDwgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpKSB7Ci0JCQkJdiA9IFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX2NlbGx2YXJzLAotCQkJCQkJICAgICAgIG9wYXJnKTsKLQkJCSAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZygKLQkJCQkgICAgICAgUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IsCi0JCQkJICAgICAgIFVOQk9VTkRMT0NBTF9FUlJPUl9NU0csCi0JCQkJICAgICAgIHYpOwotCQkJfSBlbHNlIHsKLQkJCQl2ID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fZnJlZXZhcnMsIG9wYXJnIC0KLQkJCQkJUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpKTsKLQkJCQlmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeUV4Y19OYW1lRXJyb3IsCi0JCQkJCQkgICAgIFVOQk9VTkRGUkVFX0VSUk9SX01TRywgdik7Ci0JCQl9Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBMT0FEX0RFUkVGOgorICAgICAgICAgICAgeCA9IGZyZWV2YXJzW29wYXJnXTsKKyAgICAgICAgICAgIHcgPSBQeUNlbGxfR2V0KHgpOworICAgICAgICAgICAgaWYgKHcgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFBVU0godyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgICAgIC8qIERvbid0IHN0b21wIGV4aXN0aW5nIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAob3BhcmcgPCBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycykpIHsKKyAgICAgICAgICAgICAgICB2ID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fY2VsbHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFyZyk7CisgICAgICAgICAgICAgICAgICAgZm9ybWF0X2V4Y19jaGVja19hcmcoCisgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1VuYm91bmRMb2NhbEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBVTkJPVU5ETE9DQUxfRVJST1JfTVNHLAorICAgICAgICAgICAgICAgICAgICAgICB2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX2ZyZWV2YXJzLCBvcGFyZyAtCisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSk7CisgICAgICAgICAgICAgICAgZm9ybWF0X2V4Y19jaGVja19hcmcoUHlFeGNfTmFtZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOQk9VTkRGUkVFX0VSUk9SX01TRywgdik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIFNUT1JFX0RFUkVGOgotCQkJdyA9IFBPUCgpOwotCQkJeCA9IGZyZWV2YXJzW29wYXJnXTsKLQkJCVB5Q2VsbF9TZXQoeCwgdyk7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQljb250aW51ZTsKKyAgICAgICAgY2FzZSBTVE9SRV9ERVJFRjoKKyAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgIHggPSBmcmVldmFyc1tvcGFyZ107CisgICAgICAgICAgICBQeUNlbGxfU2V0KHgsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJY2FzZSBCVUlMRF9UVVBMRToKLQkJCXggPSBQeVR1cGxlX05ldyhvcGFyZyk7Ci0JCQlpZiAoeCAhPSBOVUxMKSB7Ci0JCQkJZm9yICg7IC0tb3BhcmcgPj0gMDspIHsKLQkJCQkJdyA9IFBPUCgpOwotCQkJCQlQeVR1cGxlX1NFVF9JVEVNKHgsIG9wYXJnLCB3KTsKLQkJCQl9Ci0JCQkJUFVTSCh4KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJVSUxEX1RVUExFOgorICAgICAgICAgICAgeCA9IFB5VHVwbGVfTmV3KG9wYXJnKTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKDsgLS1vcGFyZyA+PSAwOykgeworICAgICAgICAgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oeCwgb3BhcmcsIHcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBCVUlMRF9MSVNUOgotCQkJeCA9ICBQeUxpc3RfTmV3KG9wYXJnKTsKLQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQlmb3IgKDsgLS1vcGFyZyA+PSAwOykgewotCQkJCQl3ID0gUE9QKCk7Ci0JCQkJCVB5TGlzdF9TRVRfSVRFTSh4LCBvcGFyZywgdyk7Ci0JCQkJfQotCQkJCVBVU0goeCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBCVUlMRF9MSVNUOgorICAgICAgICAgICAgeCA9ICBQeUxpc3RfTmV3KG9wYXJnKTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKDsgLS1vcGFyZyA+PSAwOykgeworICAgICAgICAgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTSh4LCBvcGFyZywgdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIEJVSUxEX01BUDoKLQkJCXggPSBfUHlEaWN0X05ld1ByZXNpemVkKChQeV9zc2l6ZV90KW9wYXJnKTsKLQkJCVBVU0goeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJVSUxEX01BUDoKKyAgICAgICAgICAgIHggPSBfUHlEaWN0X05ld1ByZXNpemVkKChQeV9zc2l6ZV90KW9wYXJnKTsKKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgU1RPUkVfTUFQOgotCQkJdyA9IFRPUCgpOyAgICAgLyoga2V5ICovCi0JCQl1ID0gU0VDT05EKCk7ICAvKiB2YWx1ZSAqLwotCQkJdiA9IFRISVJEKCk7ICAgLyogZGljdCAqLwotCQkJU1RBQ0tBREooLTIpOwotCQkJYXNzZXJ0IChQeURpY3RfQ2hlY2tFeGFjdCh2KSk7Ci0JCQllcnIgPSBQeURpY3RfU2V0SXRlbSh2LCB3LCB1KTsgIC8qIHZbd10gPSB1ICovCi0JCQlQeV9ERUNSRUYodSk7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlpZiAoZXJyID09IDApIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUkVfTUFQOgorICAgICAgICAgICAgdyA9IFRPUCgpOyAgICAgLyoga2V5ICovCisgICAgICAgICAgICB1ID0gU0VDT05EKCk7ICAvKiB2YWx1ZSAqLworICAgICAgICAgICAgdiA9IFRISVJEKCk7ICAgLyogZGljdCAqLworICAgICAgICAgICAgU1RBQ0tBREooLTIpOworICAgICAgICAgICAgYXNzZXJ0IChQeURpY3RfQ2hlY2tFeGFjdCh2KSk7CisgICAgICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbSh2LCB3LCB1KTsgIC8qIHZbd10gPSB1ICovCisgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgICAgICBpZiAoZXJyID09IDApIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBMT0FEX0FUVFI6Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJdiA9IFRPUCgpOwotCQkJeCA9IFB5T2JqZWN0X0dldEF0dHIodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBMT0FEX0FUVFI6CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5T2JqZWN0X0dldEF0dHIodiwgdyk7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgY29udGludWU7CisgICAgICAgICAgICBicmVhazsKIAotCQljYXNlIENPTVBBUkVfT1A6Ci0JCQl3ID0gUE9QKCk7Ci0JCQl2ID0gVE9QKCk7Ci0JCQlpZiAoUHlJbnRfQ2hlY2tFeGFjdCh3KSAmJiBQeUludF9DaGVja0V4YWN0KHYpKSB7Ci0JCQkJLyogSU5MSU5FOiBjbXAoaW50LCBpbnQpICovCi0JCQkJcmVnaXN0ZXIgbG9uZyBhLCBiOwotCQkJCXJlZ2lzdGVyIGludCByZXM7Ci0JCQkJYSA9IFB5SW50X0FTX0xPTkcodik7Ci0JCQkJYiA9IFB5SW50X0FTX0xPTkcodyk7Ci0JCQkJc3dpdGNoIChvcGFyZykgewotCQkJCWNhc2UgUHlDbXBfTFQ6IHJlcyA9IGEgPCAgYjsgYnJlYWs7Ci0JCQkJY2FzZSBQeUNtcF9MRTogcmVzID0gYSA8PSBiOyBicmVhazsKLQkJCQljYXNlIFB5Q21wX0VROiByZXMgPSBhID09IGI7IGJyZWFrOwotCQkJCWNhc2UgUHlDbXBfTkU6IHJlcyA9IGEgIT0gYjsgYnJlYWs7Ci0JCQkJY2FzZSBQeUNtcF9HVDogcmVzID0gYSA+ICBiOyBicmVhazsKLQkJCQljYXNlIFB5Q21wX0dFOiByZXMgPSBhID49IGI7IGJyZWFrOwotCQkJCWNhc2UgUHlDbXBfSVM6IHJlcyA9IHYgPT0gdzsgYnJlYWs7Ci0JCQkJY2FzZSBQeUNtcF9JU19OT1Q6IHJlcyA9IHYgIT0gdzsgYnJlYWs7Ci0JCQkJZGVmYXVsdDogZ290byBzbG93X2NvbXBhcmU7Ci0JCQkJfQotCQkJCXggPSByZXMgPyBQeV9UcnVlIDogUHlfRmFsc2U7Ci0JCQkJUHlfSU5DUkVGKHgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkgIHNsb3dfY29tcGFyZToKLQkJCQl4ID0gY21wX291dGNvbWUob3BhcmcsIHYsIHcpOwotCQkJfQotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfREVDUkVGKHcpOwotCQkJU0VUX1RPUCh4KTsKLQkJCWlmICh4ID09IE5VTEwpIGJyZWFrOwotCQkJUFJFRElDVChKVU1QX0lGX0ZBTFNFKTsKLQkJCVBSRURJQ1QoSlVNUF9JRl9UUlVFKTsKLQkJCWNvbnRpbnVlOworICAgICAgICBjYXNlIENPTVBBUkVfT1A6CisgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdCh3KSAmJiBQeUludF9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgICAgICAgICAgLyogSU5MSU5FOiBjbXAoaW50LCBpbnQpICovCisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgbG9uZyBhLCBiOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCByZXM7CisgICAgICAgICAgICAgICAgYSA9IFB5SW50X0FTX0xPTkcodik7CisgICAgICAgICAgICAgICAgYiA9IFB5SW50X0FTX0xPTkcodyk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChvcGFyZykgeworICAgICAgICAgICAgICAgIGNhc2UgUHlDbXBfTFQ6IHJlcyA9IGEgPCAgYjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQeUNtcF9MRTogcmVzID0gYSA8PSBiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFB5Q21wX0VROiByZXMgPSBhID09IGI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHlDbXBfTkU6IHJlcyA9IGEgIT0gYjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQeUNtcF9HVDogcmVzID0gYSA+ICBiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFB5Q21wX0dFOiByZXMgPSBhID49IGI7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHlDbXBfSVM6IHJlcyA9IHYgPT0gdzsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQeUNtcF9JU19OT1Q6IHJlcyA9IHYgIT0gdzsgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogZ290byBzbG93X2NvbXBhcmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHggPSByZXMgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIHNsb3dfY29tcGFyZToKKyAgICAgICAgICAgICAgICB4ID0gY21wX291dGNvbWUob3BhcmcsIHYsIHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgU0VUX1RPUCh4KTsKKyAgICAgICAgICAgIGlmICh4ID09IE5VTEwpIGJyZWFrOworICAgICAgICAgICAgUFJFRElDVChKVU1QX0lGX0ZBTFNFKTsKKyAgICAgICAgICAgIFBSRURJQ1QoSlVNUF9JRl9UUlVFKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgSU1QT1JUX05BTUU6Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJeCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGYtPmZfYnVpbHRpbnMsICJfX2ltcG9ydF9fIik7Ci0JCQlpZiAoeCA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCQkJIl9faW1wb3J0X18gbm90IGZvdW5kIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlQeV9JTkNSRUYoeCk7Ci0JCQl2ID0gUE9QKCk7Ci0JCQl1ID0gVE9QKCk7Ci0JCQlpZiAoUHlJbnRfQXNMb25nKHUpICE9IC0xIHx8IFB5RXJyX09jY3VycmVkKCkpCi0JCQkJdyA9IFB5VHVwbGVfUGFjayg1LAotCQkJCQkgICAgdywKLQkJCQkJICAgIGYtPmZfZ2xvYmFscywKLQkJCQkJICAgIGYtPmZfbG9jYWxzID09IE5VTEwgPwotCQkJCQkJICBQeV9Ob25lIDogZi0+Zl9sb2NhbHMsCi0JCQkJCSAgICB2LAotCQkJCQkgICAgdSk7Ci0JCQllbHNlCi0JCQkJdyA9IFB5VHVwbGVfUGFjayg0LAotCQkJCQkgICAgdywKLQkJCQkJICAgIGYtPmZfZ2xvYmFscywKLQkJCQkJICAgIGYtPmZfbG9jYWxzID09IE5VTEwgPwotCQkJCQkJICBQeV9Ob25lIDogZi0+Zl9sb2NhbHMsCi0JCQkJCSAgICB2KTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCVB5X0RFQ1JFRih1KTsKLQkJCWlmICh3ID09IE5VTEwpIHsKLQkJCQl1ID0gUE9QKCk7Ci0JCQkJUHlfREVDUkVGKHgpOwotCQkJCXggPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUkVBRF9USU1FU1RBTVAoaW50cjApOwotCQkJdiA9IHg7Ci0JCQl4ID0gUHlFdmFsX0NhbGxPYmplY3Qodiwgdyk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlSRUFEX1RJTUVTVEFNUChpbnRyMSk7Ci0JCQlQeV9ERUNSRUYodyk7Ci0JCQlTRVRfVE9QKHgpOwotCQkJaWYgKHggIT0gTlVMTCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTVBPUlRfTkFNRToKKyAgICAgICAgICAgIHcgPSBHRVRJVEVNKG5hbWVzLCBvcGFyZyk7CisgICAgICAgICAgICB4ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZi0+Zl9idWlsdGlucywgIl9faW1wb3J0X18iKTsKKyAgICAgICAgICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ltcG9ydF9fIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfSU5DUkVGKHgpOworICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgdSA9IFRPUCgpOworICAgICAgICAgICAgaWYgKFB5SW50X0FzTG9uZyh1KSAhPSAtMSB8fCBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHcgPSBQeVR1cGxlX1BhY2soNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2xvY2FscyA9PSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lIDogZi0+Zl9sb2NhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB3ID0gUHlUdXBsZV9QYWNrKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2dsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9sb2NhbHMgPT0gTlVMTCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSA6IGYtPmZfbG9jYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHUgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgICAgICAgICAgeCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMCk7CisgICAgICAgICAgICB2ID0geDsKKyAgICAgICAgICAgIHggPSBQeUV2YWxfQ2FsbE9iamVjdCh2LCB3KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU1QT1JUX1NUQVI6Ci0JCQl2ID0gUE9QKCk7Ci0JCQlQeUZyYW1lX0Zhc3RUb0xvY2FscyhmKTsKLQkJCWlmICgoeCA9IGYtPmZfbG9jYWxzKSA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkibm8gbG9jYWxzIGZvdW5kIGR1cmluZyAnaW1wb3J0IConIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlSRUFEX1RJTUVTVEFNUChpbnRyMCk7Ci0JCQllcnIgPSBpbXBvcnRfYWxsX2Zyb20oeCwgdik7Ci0JCQlSRUFEX1RJTUVTVEFNUChpbnRyMSk7Ci0JCQlQeUZyYW1lX0xvY2Fsc1RvRmFzdChmLCAwKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWlmIChlcnIgPT0gMCkgY29udGludWU7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBJTVBPUlRfU1RBUjoKKyAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgIFB5RnJhbWVfRmFzdFRvTG9jYWxzKGYpOworICAgICAgICAgICAgaWYgKCh4ID0gZi0+Zl9sb2NhbHMpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJubyBsb2NhbHMgZm91bmQgZHVyaW5nICdpbXBvcnQgKiciKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIwKTsKKyAgICAgICAgICAgIGVyciA9IGltcG9ydF9hbGxfZnJvbSh4LCB2KTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKKyAgICAgICAgICAgIFB5RnJhbWVfTG9jYWxzVG9GYXN0KGYsIDApOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgaWYgKGVyciA9PSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgSU1QT1JUX0ZST006Ci0JCQl3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwotCQkJdiA9IFRPUCgpOwotCQkJUkVBRF9USU1FU1RBTVAoaW50cjApOwotCQkJeCA9IGltcG9ydF9mcm9tKHYsIHcpOwotCQkJUkVBRF9USU1FU1RBTVAoaW50cjEpOwotCQkJUFVTSCh4KTsKLQkJCWlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOwotCQkJYnJlYWs7CisgICAgICAgIGNhc2UgSU1QT1JUX0ZST006CisgICAgICAgICAgICB3ID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOworICAgICAgICAgICAgdiA9IFRPUCgpOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjApOworICAgICAgICAgICAgeCA9IGltcG9ydF9mcm9tKHYsIHcpOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoaW50cjEpOworICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJY2FzZSBKVU1QX0ZPUldBUkQ6Ci0JCQlKVU1QQlkob3BhcmcpOwotCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICBjYXNlIEpVTVBfRk9SV0FSRDoKKyAgICAgICAgICAgIEpVTVBCWShvcGFyZyk7CisgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CiAKLQkJUFJFRElDVEVEX1dJVEhfQVJHKEpVTVBfSUZfRkFMU0UpOwotCQljYXNlIEpVTVBfSUZfRkFMU0U6Ci0JCQl3ID0gVE9QKCk7Ci0JCQlpZiAodyA9PSBQeV9UcnVlKSB7Ci0JCQkJUFJFRElDVChQT1BfVE9QKTsKLQkJCQlnb3RvIGZhc3RfbmV4dF9vcGNvZGU7Ci0JCQl9Ci0JCQlpZiAodyA9PSBQeV9GYWxzZSkgewotCQkJCUpVTVBCWShvcGFyZyk7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfQotCQkJZXJyID0gUHlPYmplY3RfSXNUcnVlKHcpOwotCQkJaWYgKGVyciA+IDApCi0JCQkJZXJyID0gMDsKLQkJCWVsc2UgaWYgKGVyciA9PSAwKQotCQkJCUpVTVBCWShvcGFyZyk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKEpVTVBfSUZfRkFMU0UpOworICAgICAgICBjYXNlIEpVTVBfSUZfRkFMU0U6CisgICAgICAgICAgICB3ID0gVE9QKCk7CisgICAgICAgICAgICBpZiAodyA9PSBQeV9UcnVlKSB7CisgICAgICAgICAgICAgICAgUFJFRElDVChQT1BfVE9QKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodyA9PSBQeV9GYWxzZSkgeworICAgICAgICAgICAgICAgIEpVTVBCWShvcGFyZyk7CisgICAgICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfSXNUcnVlKHcpOworICAgICAgICAgICAgaWYgKGVyciA+IDApCisgICAgICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGVyciA9PSAwKQorICAgICAgICAgICAgICAgIEpVTVBCWShvcGFyZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQlQUkVESUNURURfV0lUSF9BUkcoSlVNUF9JRl9UUlVFKTsKLQkJY2FzZSBKVU1QX0lGX1RSVUU6Ci0JCQl3ID0gVE9QKCk7Ci0JCQlpZiAodyA9PSBQeV9GYWxzZSkgewotCQkJCVBSRURJQ1QoUE9QX1RPUCk7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfQotCQkJaWYgKHcgPT0gUHlfVHJ1ZSkgewotCQkJCUpVTVBCWShvcGFyZyk7Ci0JCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOwotCQkJfQotCQkJZXJyID0gUHlPYmplY3RfSXNUcnVlKHcpOwotCQkJaWYgKGVyciA+IDApIHsKLQkJCQllcnIgPSAwOwotCQkJCUpVTVBCWShvcGFyZyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChlcnIgPT0gMCkKLQkJCQk7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCQljb250aW51ZTsKKyAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKEpVTVBfSUZfVFJVRSk7CisgICAgICAgIGNhc2UgSlVNUF9JRl9UUlVFOgorICAgICAgICAgICAgdyA9IFRPUCgpOworICAgICAgICAgICAgaWYgKHcgPT0gUHlfRmFsc2UpIHsKKyAgICAgICAgICAgICAgICBQUkVESUNUKFBPUF9UT1ApOworICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3ID09IFB5X1RydWUpIHsKKyAgICAgICAgICAgICAgICBKVU1QQlkob3BhcmcpOworICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh3KTsKKyAgICAgICAgICAgIGlmIChlcnIgPiAwKSB7CisgICAgICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgICAgICBKVU1QQlkob3BhcmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZXJyID09IDApCisgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY29udGludWU7CiAKLQkJUFJFRElDVEVEX1dJVEhfQVJHKEpVTVBfQUJTT0xVVEUpOwotCQljYXNlIEpVTVBfQUJTT0xVVEU6Ci0JCQlKVU1QVE8ob3BhcmcpOworICAgICAgICBQUkVESUNURURfV0lUSF9BUkcoSlVNUF9BQlNPTFVURSk7CisgICAgICAgIGNhc2UgSlVNUF9BQlNPTFVURToKKyAgICAgICAgICAgIEpVTVBUTyhvcGFyZyk7CiAjaWYgRkFTVF9MT09QUwotCQkJLyogRW5hYmxpbmcgdGhpcyBwYXRoIHNwZWVkcy11cCBhbGwgd2hpbGUgYW5kIGZvci1sb29wcyBieSBieXBhc3NpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwZXItbG9vcCBjaGVja3MgZm9yIHNpZ25hbHMuICBCeSBkZWZhdWx0LCB0aGlzIHNob3VsZCBiZSB0dXJuZWQtb2ZmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIGl0IHByZXZlbnRzIGRldGVjdGlvbiBvZiBhIGNvbnRyb2wtYnJlYWsgaW4gdGlnaHQgbG9vcHMgbGlrZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWxlIDE6IHBhc3MiLiAgQ29tcGlsZSB3aXRoIHRoaXMgb3B0aW9uIHR1cm5lZC1vbiB3aGVuIHlvdSBuZWVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3BlZWQtdXAgYW5kIGRvIG5vdCBuZWVkIGJyZWFrIGNoZWNraW5nIGluc2lkZSB0aWdodCBsb29wcyAob25lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWluIG9ubHkgaW5zdHJ1Y3Rpb25zIGVuZGluZyB3aXRoIGdvdG8gZmFzdF9uZXh0X29wY29kZSkuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotCQkJZ290byBmYXN0X25leHRfb3Bjb2RlOworICAgICAgICAgICAgLyogRW5hYmxpbmcgdGhpcyBwYXRoIHNwZWVkcy11cCBhbGwgd2hpbGUgYW5kIGZvci1sb29wcyBieSBieXBhc3NpbmcKKyAgICAgICAgICAgICAgIHRoZSBwZXItbG9vcCBjaGVja3MgZm9yIHNpZ25hbHMuICBCeSBkZWZhdWx0LCB0aGlzIHNob3VsZCBiZSB0dXJuZWQtb2ZmCisgICAgICAgICAgICAgICBiZWNhdXNlIGl0IHByZXZlbnRzIGRldGVjdGlvbiBvZiBhIGNvbnRyb2wtYnJlYWsgaW4gdGlnaHQgbG9vcHMgbGlrZQorICAgICAgICAgICAgICAgIndoaWxlIDE6IHBhc3MiLiAgQ29tcGlsZSB3aXRoIHRoaXMgb3B0aW9uIHR1cm5lZC1vbiB3aGVuIHlvdSBuZWVkCisgICAgICAgICAgICAgICB0aGUgc3BlZWQtdXAgYW5kIGRvIG5vdCBuZWVkIGJyZWFrIGNoZWNraW5nIGluc2lkZSB0aWdodCBsb29wcyAob25lcworICAgICAgICAgICAgICAgdGhhdCBjb250YWluIG9ubHkgaW5zdHJ1Y3Rpb25zIGVuZGluZyB3aXRoIGdvdG8gZmFzdF9uZXh0X29wY29kZSkuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOwogI2Vsc2UKLQkJCWNvbnRpbnVlOworICAgICAgICAgICAgY29udGludWU7CiAjZW5kaWYKIAotCQljYXNlIEdFVF9JVEVSOgotCQkJLyogYmVmb3JlOiBbb2JqXTsgYWZ0ZXIgW2dldGl0ZXIob2JqKV0gKi8KLQkJCXYgPSBUT1AoKTsKLQkJCXggPSBQeU9iamVjdF9HZXRJdGVyKHYpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJaWYgKHggIT0gTlVMTCkgewotCQkJCVNFVF9UT1AoeCk7Ci0JCQkJUFJFRElDVChGT1JfSVRFUik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTVEFDS0FESigtMSk7Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSBHRVRfSVRFUjoKKyAgICAgICAgICAgIC8qIGJlZm9yZTogW29ial07IGFmdGVyIFtnZXRpdGVyKG9iaildICovCisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBTRVRfVE9QKHgpOworICAgICAgICAgICAgICAgIFBSRURJQ1QoRk9SX0lURVIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU1RBQ0tBREooLTEpOworICAgICAgICAgICAgYnJlYWs7CiAKLQkJUFJFRElDVEVEX1dJVEhfQVJHKEZPUl9JVEVSKTsKLQkJY2FzZSBGT1JfSVRFUjoKLQkJCS8qIGJlZm9yZTogW2l0ZXJdOyBhZnRlcjogW2l0ZXIsIGl0ZXIoKV0gKm9yKiBbXSAqLwotCQkJdiA9IFRPUCgpOwotCQkJeCA9ICgqdi0+b2JfdHlwZS0+dHBfaXRlcm5leHQpKHYpOwotCQkJaWYgKHggIT0gTlVMTCkgewotCQkJCVBVU0goeCk7Ci0JCQkJUFJFRElDVChTVE9SRV9GQVNUKTsKLQkJCQlQUkVESUNUKFVOUEFDS19TRVFVRU5DRSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCWlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcygKLQkJCQkJCVB5RXhjX1N0b3BJdGVyYXRpb24pKQotCQkJCQlicmVhazsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJfQotCQkJLyogaXRlcmF0b3IgZW5kZWQgbm9ybWFsbHkgKi8KLSAJCQl4ID0gdiA9IFBPUCgpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJSlVNUEJZKG9wYXJnKTsKLQkJCWNvbnRpbnVlOworICAgICAgICBQUkVESUNURURfV0lUSF9BUkcoRk9SX0lURVIpOworICAgICAgICBjYXNlIEZPUl9JVEVSOgorICAgICAgICAgICAgLyogYmVmb3JlOiBbaXRlcl07IGFmdGVyOiBbaXRlciwgaXRlcigpXSAqb3IqIFtdICovCisgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICB4ID0gKCp2LT5vYl90eXBlLT50cF9pdGVybmV4dCkodik7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgICAgICBQUkVESUNUKFNUT1JFX0ZBU1QpOworICAgICAgICAgICAgICAgIFBSRURJQ1QoVU5QQUNLX1NFUVVFTkNFKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGl0ZXJhdG9yIGVuZGVkIG5vcm1hbGx5ICovCisgICAgICAgICAgICB4ID0gdiA9IFBPUCgpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgSlVNUEJZKG9wYXJnKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCWNhc2UgQlJFQUtfTE9PUDoKLQkJCXdoeSA9IFdIWV9CUkVBSzsKLQkJCWdvdG8gZmFzdF9ibG9ja19lbmQ7CisgICAgICAgIGNhc2UgQlJFQUtfTE9PUDoKKyAgICAgICAgICAgIHdoeSA9IFdIWV9CUkVBSzsKKyAgICAgICAgICAgIGdvdG8gZmFzdF9ibG9ja19lbmQ7CiAKLQkJY2FzZSBDT05USU5VRV9MT09QOgotCQkJcmV0dmFsID0gUHlJbnRfRnJvbUxvbmcob3BhcmcpOwotCQkJaWYgKCFyZXR2YWwpIHsKLQkJCQl4ID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXdoeSA9IFdIWV9DT05USU5VRTsKLQkJCWdvdG8gZmFzdF9ibG9ja19lbmQ7CisgICAgICAgIGNhc2UgQ09OVElOVUVfTE9PUDoKKyAgICAgICAgICAgIHJldHZhbCA9IFB5SW50X0Zyb21Mb25nKG9wYXJnKTsKKyAgICAgICAgICAgIGlmICghcmV0dmFsKSB7CisgICAgICAgICAgICAgICAgeCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aHkgPSBXSFlfQ09OVElOVUU7CisgICAgICAgICAgICBnb3RvIGZhc3RfYmxvY2tfZW5kOwogCi0JCWNhc2UgU0VUVVBfTE9PUDoKLQkJY2FzZSBTRVRVUF9FWENFUFQ6Ci0JCWNhc2UgU0VUVVBfRklOQUxMWToKLQkJCS8qIE5PVEU6IElmIHlvdSBhZGQgYW55IG5ldyBibG9jay1zZXR1cCBvcGNvZGVzIHRoYXQKLQkJICAgICAgICAgICBhcmUgbm90IHRyeS9leGNlcHQvZmluYWxseSBoYW5kbGVycywgeW91IG1heSBuZWVkCi0JCSAgICAgICAgICAgdG8gdXBkYXRlIHRoZSBQeUdlbl9OZWVkc0ZpbmFsaXppbmcoKSBmdW5jdGlvbi4KLQkJICAgICAgICAgICAqLworICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CisgICAgICAgIGNhc2UgU0VUVVBfRVhDRVBUOgorICAgICAgICBjYXNlIFNFVFVQX0ZJTkFMTFk6CisgICAgICAgICAgICAvKiBOT1RFOiBJZiB5b3UgYWRkIGFueSBuZXcgYmxvY2stc2V0dXAgb3Bjb2RlcyB0aGF0CisgICAgICAgICAgICAgICBhcmUgbm90IHRyeS9leGNlcHQvZmluYWxseSBoYW5kbGVycywgeW91IG1heSBuZWVkCisgICAgICAgICAgICAgICB0byB1cGRhdGUgdGhlIFB5R2VuX05lZWRzRmluYWxpemluZygpIGZ1bmN0aW9uLgorICAgICAgICAgICAgICAgKi8KIAotCQkJUHlGcmFtZV9CbG9ja1NldHVwKGYsIG9wY29kZSwgSU5TVFJfT0ZGU0VUKCkgKyBvcGFyZywKLQkJCQkJICAgU1RBQ0tfTEVWRUwoKSk7Ci0JCQljb250aW51ZTsKKyAgICAgICAgICAgIFB5RnJhbWVfQmxvY2tTZXR1cChmLCBvcGNvZGUsIElOU1RSX09GRlNFVCgpICsgb3BhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBQ0tfTEVWRUwoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKIAotCQljYXNlIFdJVEhfQ0xFQU5VUDoKLQkJewotCQkJLyogQXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYXJlIDEtMyB2YWx1ZXMgaW5kaWNhdGluZwotCQkJICAgaG93L3doeSB3ZSBlbnRlcmVkIHRoZSBmaW5hbGx5IGNsYXVzZToKLQkJCSAgIC0gVE9QID0gTm9uZQotCQkJICAgLSAoVE9QLCBTRUNPTkQpID0gKFdIWV97UkVUVVJOLENPTlRJTlVFfSksIHJldHZhbAotCQkJICAgLSBUT1AgPSBXSFlfKjsgbm8gcmV0dmFsIGJlbG93IGl0Ci0JCQkgICAtIChUT1AsIFNFQ09ORCwgVEhJUkQpID0gZXhjX2luZm8oKQotCQkJICAgQmVsb3cgdGhlbSBpcyBFWElULCB0aGUgY29udGV4dC5fX2V4aXRfXyBib3VuZCBtZXRob2QuCi0JCQkgICBJbiB0aGUgbGFzdCBjYXNlLCB3ZSBtdXN0IGNhbGwKLQkJCSAgICAgRVhJVChUT1AsIFNFQ09ORCwgVEhJUkQpCi0JCQkgICBvdGhlcndpc2Ugd2UgbXVzdCBjYWxsCi0JCQkgICAgIEVYSVQoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgY2FzZSBXSVRIX0NMRUFOVVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGFyZSAxLTMgdmFsdWVzIGluZGljYXRpbmcKKyAgICAgICAgICAgICAgIGhvdy93aHkgd2UgZW50ZXJlZCB0aGUgZmluYWxseSBjbGF1c2U6CisgICAgICAgICAgICAgICAtIFRPUCA9IE5vbmUKKyAgICAgICAgICAgICAgIC0gKFRPUCwgU0VDT05EKSA9IChXSFlfe1JFVFVSTixDT05USU5VRX0pLCByZXR2YWwKKyAgICAgICAgICAgICAgIC0gVE9QID0gV0hZXyo7IG5vIHJldHZhbCBiZWxvdyBpdAorICAgICAgICAgICAgICAgLSAoVE9QLCBTRUNPTkQsIFRISVJEKSA9IGV4Y19pbmZvKCkKKyAgICAgICAgICAgICAgIEJlbG93IHRoZW0gaXMgRVhJVCwgdGhlIGNvbnRleHQuX19leGl0X18gYm91bmQgbWV0aG9kLgorICAgICAgICAgICAgICAgSW4gdGhlIGxhc3QgY2FzZSwgd2UgbXVzdCBjYWxsCisgICAgICAgICAgICAgICAgIEVYSVQoVE9QLCBTRUNPTkQsIFRISVJEKQorICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHdlIG11c3QgY2FsbAorICAgICAgICAgICAgICAgICBFWElUKE5vbmUsIE5vbmUsIE5vbmUpCiAKLQkJCSAgIEluIGFsbCBjYXNlcywgd2UgcmVtb3ZlIEVYSVQgZnJvbSB0aGUgc3RhY2ssIGxlYXZpbmcKLQkJCSAgIHRoZSByZXN0IGluIHRoZSBzYW1lIG9yZGVyLgorICAgICAgICAgICAgICAgSW4gYWxsIGNhc2VzLCB3ZSByZW1vdmUgRVhJVCBmcm9tIHRoZSBzdGFjaywgbGVhdmluZworICAgICAgICAgICAgICAgdGhlIHJlc3QgaW4gdGhlIHNhbWUgb3JkZXIuCiAKLQkJCSAgIEluIGFkZGl0aW9uLCBpZiB0aGUgc3RhY2sgcmVwcmVzZW50cyBhbiBleGNlcHRpb24sCi0JCQkgICAqYW5kKiB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5zIGEgJ3RydWUnIHZhbHVlLCB3ZQotCQkJICAgInphcCIgdGhpcyBpbmZvcm1hdGlvbiwgdG8gcHJldmVudCBFTkRfRklOQUxMWSBmcm9tCi0JCQkgICByZS1yYWlzaW5nIHRoZSBleGNlcHRpb24uICAoQnV0IG5vbi1sb2NhbCBnb3RvcwotCQkJICAgc2hvdWxkIHN0aWxsIGJlIHJlc3VtZWQuKQotCQkJKi8KKyAgICAgICAgICAgICAgIEluIGFkZGl0aW9uLCBpZiB0aGUgc3RhY2sgcmVwcmVzZW50cyBhbiBleGNlcHRpb24sCisgICAgICAgICAgICAgICAqYW5kKiB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5zIGEgJ3RydWUnIHZhbHVlLCB3ZQorICAgICAgICAgICAgICAgInphcCIgdGhpcyBpbmZvcm1hdGlvbiwgdG8gcHJldmVudCBFTkRfRklOQUxMWSBmcm9tCisgICAgICAgICAgICAgICByZS1yYWlzaW5nIHRoZSBleGNlcHRpb24uICAoQnV0IG5vbi1sb2NhbCBnb3RvcworICAgICAgICAgICAgICAgc2hvdWxkIHN0aWxsIGJlIHJlc3VtZWQuKQorICAgICAgICAgICAgKi8KIAotCQkJUHlPYmplY3QgKmV4aXRfZnVuYzsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpleGl0X2Z1bmM7CiAKLQkJCXUgPSBQT1AoKTsKLQkJCWlmICh1ID09IFB5X05vbmUpIHsKLQkJCSAgICAgICAJZXhpdF9mdW5jID0gVE9QKCk7Ci0JCQkJU0VUX1RPUCh1KTsKLQkJCQl2ID0gdyA9IFB5X05vbmU7Ci0JCQl9Ci0JCQllbHNlIGlmIChQeUludF9DaGVjayh1KSkgewotCQkJCXN3aXRjaChQeUludF9BU19MT05HKHUpKSB7Ci0JCQkJY2FzZSBXSFlfUkVUVVJOOgotCQkJCWNhc2UgV0hZX0NPTlRJTlVFOgotCQkJCQkvKiBSZXR2YWwgaW4gVE9QLiAqLwotCQkJCQlleGl0X2Z1bmMgPSBTRUNPTkQoKTsKLQkJCQkJU0VUX1NFQ09ORChUT1AoKSk7Ci0JCQkJCVNFVF9UT1AodSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWV4aXRfZnVuYyA9IFRPUCgpOwotCQkJCQlTRVRfVE9QKHUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJdSA9IHYgPSB3ID0gUHlfTm9uZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXYgPSBUT1AoKTsKLQkJCQl3ID0gU0VDT05EKCk7Ci0JCQkJZXhpdF9mdW5jID0gVEhJUkQoKTsKLQkJCQlTRVRfVE9QKHUpOwotCQkJCVNFVF9TRUNPTkQodik7Ci0JCQkJU0VUX1RISVJEKHcpOwotCQkJfQotCQkJLyogWFhYIE5vdCB0aGUgZmFzdGVzdCB3YXkgdG8gY2FsbCBpdC4uLiAqLwotCQkJeCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZXhpdF9mdW5jLCB1LCB2LCB3LAotCQkJCQkJCSBOVUxMKTsKLQkJCVB5X0RFQ1JFRihleGl0X2Z1bmMpOwotCQkJaWYgKHggPT0gTlVMTCkKLQkJCQlicmVhazsgLyogR28gdG8gZXJyb3IgZXhpdCAqLworICAgICAgICAgICAgdSA9IFBPUCgpOworICAgICAgICAgICAgaWYgKHUgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIGV4aXRfZnVuYyA9IFRPUCgpOworICAgICAgICAgICAgICAgIFNFVF9UT1AodSk7CisgICAgICAgICAgICAgICAgdiA9IHcgPSBQeV9Ob25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUHlJbnRfQ2hlY2sodSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goUHlJbnRfQVNfTE9ORyh1KSkgeworICAgICAgICAgICAgICAgIGNhc2UgV0hZX1JFVFVSTjoKKyAgICAgICAgICAgICAgICBjYXNlIFdIWV9DT05USU5VRToKKyAgICAgICAgICAgICAgICAgICAgLyogUmV0dmFsIGluIFRPUC4gKi8KKyAgICAgICAgICAgICAgICAgICAgZXhpdF9mdW5jID0gU0VDT05EKCk7CisgICAgICAgICAgICAgICAgICAgIFNFVF9TRUNPTkQoVE9QKCkpOworICAgICAgICAgICAgICAgICAgICBTRVRfVE9QKHUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBleGl0X2Z1bmMgPSBUT1AoKTsKKyAgICAgICAgICAgICAgICAgICAgU0VUX1RPUCh1KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHUgPSB2ID0gdyA9IFB5X05vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB2ID0gVE9QKCk7CisgICAgICAgICAgICAgICAgdyA9IFNFQ09ORCgpOworICAgICAgICAgICAgICAgIGV4aXRfZnVuYyA9IFRISVJEKCk7CisgICAgICAgICAgICAgICAgU0VUX1RPUCh1KTsKKyAgICAgICAgICAgICAgICBTRVRfU0VDT05EKHYpOworICAgICAgICAgICAgICAgIFNFVF9USElSRCh3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFhYWCBOb3QgdGhlIGZhc3Rlc3Qgd2F5IHRvIGNhbGwgaXQuLi4gKi8KKyAgICAgICAgICAgIHggPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGV4aXRfZnVuYywgdSwgdiwgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgUHlfREVDUkVGKGV4aXRfZnVuYyk7CisgICAgICAgICAgICBpZiAoeCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBHbyB0byBlcnJvciBleGl0ICovCiAKLQkJCWlmICh1ICE9IFB5X05vbmUpCi0JCQkJZXJyID0gUHlPYmplY3RfSXNUcnVlKHgpOwotCQkJZWxzZQotCQkJCWVyciA9IDA7Ci0JCQlQeV9ERUNSRUYoeCk7CisgICAgICAgICAgICBpZiAodSAhPSBQeV9Ob25lKQorICAgICAgICAgICAgICAgIGVyciA9IFB5T2JqZWN0X0lzVHJ1ZSh4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgUHlfREVDUkVGKHgpOwogCi0JCQlpZiAoZXJyIDwgMCkKLQkJCQlicmVhazsgLyogR28gdG8gZXJyb3IgZXhpdCAqLwotCQkJZWxzZSBpZiAoZXJyID4gMCkgewotCQkJCWVyciA9IDA7Ci0JCQkJLyogVGhlcmUgd2FzIGFuIGV4Y2VwdGlvbiBhbmQgYSB0cnVlIHJldHVybiAqLwotCQkJCVNUQUNLQURKKC0yKTsKLQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJU0VUX1RPUChQeV9Ob25lKTsKLQkJCQlQeV9ERUNSRUYodSk7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCVB5X0RFQ1JFRih3KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogVGhlIHN0YWNrIHdhcyByZWFycmFuZ2VkIHRvIHJlbW92ZSBFWElUCi0JCQkJICAgYWJvdmUuIExldCBFTkRfRklOQUxMWSBkbyBpdHMgdGhpbmcgKi8KLQkJCX0KLQkJCVBSRURJQ1QoRU5EX0ZJTkFMTFkpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBHbyB0byBlcnJvciBleGl0ICovCisgICAgICAgICAgICBlbHNlIGlmIChlcnIgPiAwKSB7CisgICAgICAgICAgICAgICAgZXJyID0gMDsKKyAgICAgICAgICAgICAgICAvKiBUaGVyZSB3YXMgYW4gZXhjZXB0aW9uIGFuZCBhIHRydWUgcmV0dXJuICovCisgICAgICAgICAgICAgICAgU1RBQ0tBREooLTIpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICBTRVRfVE9QKFB5X05vbmUpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgc3RhY2sgd2FzIHJlYXJyYW5nZWQgdG8gcmVtb3ZlIEVYSVQKKyAgICAgICAgICAgICAgICAgICBhYm92ZS4gTGV0IEVORF9GSU5BTExZIGRvIGl0cyB0aGluZyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgUFJFRElDVChFTkRfRklOQUxMWSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JCWNhc2UgQ0FMTF9GVU5DVElPTjoKLQkJewotCQkJUHlPYmplY3QgKipzcDsKLQkJCVBDQUxMKFBDQUxMX0FMTCk7Ci0JCQlzcCA9IHN0YWNrX3BvaW50ZXI7CisgICAgICAgIGNhc2UgQ0FMTF9GVU5DVElPTjoKKyAgICAgICAgeworICAgICAgICAgICAgUHlPYmplY3QgKipzcDsKKyAgICAgICAgICAgIFBDQUxMKFBDQUxMX0FMTCk7CisgICAgICAgICAgICBzcCA9IHN0YWNrX3BvaW50ZXI7CiAjaWZkZWYgV0lUSF9UU0MKLQkJCXggPSBjYWxsX2Z1bmN0aW9uKCZzcCwgb3BhcmcsICZpbnRyMCwgJmludHIxKTsKKyAgICAgICAgICAgIHggPSBjYWxsX2Z1bmN0aW9uKCZzcCwgb3BhcmcsICZpbnRyMCwgJmludHIxKTsKICNlbHNlCi0JCQl4ID0gY2FsbF9mdW5jdGlvbigmc3AsIG9wYXJnKTsKKyAgICAgICAgICAgIHggPSBjYWxsX2Z1bmN0aW9uKCZzcCwgb3BhcmcpOwogI2VuZGlmCi0JCQlzdGFja19wb2ludGVyID0gc3A7Ci0JCQlQVVNIKHgpOwotCQkJaWYgKHggIT0gTlVMTCkKLQkJCQljb250aW51ZTsKLQkJCWJyZWFrOwotCQl9CisgICAgICAgICAgICBzdGFja19wb2ludGVyID0gc3A7CisgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJY2FzZSBDQUxMX0ZVTkNUSU9OX1ZBUjoKLQkJY2FzZSBDQUxMX0ZVTkNUSU9OX0tXOgotCQljYXNlIENBTExfRlVOQ1RJT05fVkFSX0tXOgotCQl7Ci0JCSAgICBpbnQgbmEgPSBvcGFyZyAmIDB4ZmY7Ci0JCSAgICBpbnQgbmsgPSAob3Bhcmc+PjgpICYgMHhmZjsKLQkJICAgIGludCBmbGFncyA9IChvcGNvZGUgLSBDQUxMX0ZVTkNUSU9OKSAmIDM7Ci0JCSAgICBpbnQgbiA9IG5hICsgMiAqIG5rOwotCQkgICAgUHlPYmplY3QgKipwZnVuYywgKmZ1bmMsICoqc3A7Ci0JCSAgICBQQ0FMTChQQ0FMTF9BTEwpOwotCQkgICAgaWYgKGZsYWdzICYgQ0FMTF9GTEFHX1ZBUikKLQkJCSAgICBuKys7Ci0JCSAgICBpZiAoZmxhZ3MgJiBDQUxMX0ZMQUdfS1cpCi0JCQkgICAgbisrOwotCQkgICAgcGZ1bmMgPSBzdGFja19wb2ludGVyIC0gbiAtIDE7Ci0JCSAgICBmdW5jID0gKnBmdW5jOworICAgICAgICBjYXNlIENBTExfRlVOQ1RJT05fVkFSOgorICAgICAgICBjYXNlIENBTExfRlVOQ1RJT05fS1c6CisgICAgICAgIGNhc2UgQ0FMTF9GVU5DVElPTl9WQVJfS1c6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuYSA9IG9wYXJnICYgMHhmZjsKKyAgICAgICAgICAgIGludCBuayA9IChvcGFyZz4+OCkgJiAweGZmOworICAgICAgICAgICAgaW50IGZsYWdzID0gKG9wY29kZSAtIENBTExfRlVOQ1RJT04pICYgMzsKKyAgICAgICAgICAgIGludCBuID0gbmEgKyAyICogbms7CisgICAgICAgICAgICBQeU9iamVjdCAqKnBmdW5jLCAqZnVuYywgKipzcDsKKyAgICAgICAgICAgIFBDQUxMKFBDQUxMX0FMTCk7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBDQUxMX0ZMQUdfVkFSKQorICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIENBTExfRkxBR19LVykKKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICBwZnVuYyA9IHN0YWNrX3BvaW50ZXIgLSBuIC0gMTsKKyAgICAgICAgICAgIGZ1bmMgPSAqcGZ1bmM7CiAKLQkJICAgIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKQotCQkJJiYgUHlNZXRob2RfR0VUX1NFTEYoZnVuYykgIT0gTlVMTCkgewotCQkJICAgIFB5T2JqZWN0ICpzZWxmID0gUHlNZXRob2RfR0VUX1NFTEYoZnVuYyk7Ci0JCQkgICAgUHlfSU5DUkVGKHNlbGYpOwotCQkJICAgIGZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYyk7Ci0JCQkgICAgUHlfSU5DUkVGKGZ1bmMpOwotCQkJICAgIFB5X0RFQ1JFRigqcGZ1bmMpOwotCQkJICAgICpwZnVuYyA9IHNlbGY7Ci0JCQkgICAgbmErKzsKLQkJCSAgICBuKys7Ci0JCSAgICB9IGVsc2UKLQkJCSAgICBQeV9JTkNSRUYoZnVuYyk7Ci0JCSAgICBzcCA9IHN0YWNrX3BvaW50ZXI7Ci0JCSAgICBSRUFEX1RJTUVTVEFNUChpbnRyMCk7Ci0JCSAgICB4ID0gZXh0X2RvX2NhbGwoZnVuYywgJnNwLCBmbGFncywgbmEsIG5rKTsKLQkJICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKLQkJICAgIHN0YWNrX3BvaW50ZXIgPSBzcDsKLQkJICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKQorICAgICAgICAgICAgJiYgUHlNZXRob2RfR0VUX1NFTEYoZnVuYykgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzZWxmID0gUHlNZXRob2RfR0VUX1NFTEYoZnVuYyk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHNlbGYpOworICAgICAgICAgICAgICAgIGZ1bmMgPSBQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYyk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRigqcGZ1bmMpOworICAgICAgICAgICAgICAgICpwZnVuYyA9IHNlbGY7CisgICAgICAgICAgICAgICAgbmErKzsKKyAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgICAgICAgICBzcCA9IHN0YWNrX3BvaW50ZXI7CisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUChpbnRyMCk7CisgICAgICAgICAgICB4ID0gZXh0X2RvX2NhbGwoZnVuYywgJnNwLCBmbGFncywgbmEsIG5rKTsKKyAgICAgICAgICAgIFJFQURfVElNRVNUQU1QKGludHIxKTsKKyAgICAgICAgICAgIHN0YWNrX3BvaW50ZXIgPSBzcDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKIAotCQkgICAgd2hpbGUgKHN0YWNrX3BvaW50ZXIgPiBwZnVuYykgewotCQkJICAgIHcgPSBQT1AoKTsKLQkJCSAgICBQeV9ERUNSRUYodyk7Ci0JCSAgICB9Ci0JCSAgICBQVVNIKHgpOwotCQkgICAgaWYgKHggIT0gTlVMTCkKLQkJCSAgICBjb250aW51ZTsKLQkJICAgIGJyZWFrOwotCQl9CisgICAgICAgICAgICB3aGlsZSAoc3RhY2tfcG9pbnRlciA+IHBmdW5jKSB7CisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBVU0goeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQljYXNlIE1BS0VfRlVOQ1RJT046Ci0JCQl2ID0gUE9QKCk7IC8qIGNvZGUgb2JqZWN0ICovCi0JCQl4ID0gUHlGdW5jdGlvbl9OZXcodiwgZi0+Zl9nbG9iYWxzKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCS8qIFhYWCBNYXliZSB0aGlzIHNob3VsZCBiZSBhIHNlcGFyYXRlIG9wY29kZT8gKi8KLQkJCWlmICh4ICE9IE5VTEwgJiYgb3BhcmcgPiAwKSB7Ci0JCQkJdiA9IFB5VHVwbGVfTmV3KG9wYXJnKTsKLQkJCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQkJCVB5X0RFQ1JFRih4KTsKLQkJCQkJeCA9IE5VTEw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl3aGlsZSAoLS1vcGFyZyA+PSAwKSB7Ci0JCQkJCXcgPSBQT1AoKTsKLQkJCQkJUHlUdXBsZV9TRVRfSVRFTSh2LCBvcGFyZywgdyk7Ci0JCQkJfQotCQkJCWVyciA9IFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMoeCwgdik7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJfQotCQkJUFVTSCh4KTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIE1BS0VfRlVOQ1RJT046CisgICAgICAgICAgICB2ID0gUE9QKCk7IC8qIGNvZGUgb2JqZWN0ICovCisgICAgICAgICAgICB4ID0gUHlGdW5jdGlvbl9OZXcodiwgZi0+Zl9nbG9iYWxzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIC8qIFhYWCBNYXliZSB0aGlzIHNob3VsZCBiZSBhIHNlcGFyYXRlIG9wY29kZT8gKi8KKyAgICAgICAgICAgIGlmICh4ICE9IE5VTEwgJiYgb3BhcmcgPiAwKSB7CisgICAgICAgICAgICAgICAgdiA9IFB5VHVwbGVfTmV3KG9wYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih4KTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoLS1vcGFyZyA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHcgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCBvcGFyZywgdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMoeCwgdik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUFVTSCh4KTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgTUFLRV9DTE9TVVJFOgotCQl7Ci0JCQl2ID0gUE9QKCk7IC8qIGNvZGUgb2JqZWN0ICovCi0JCQl4ID0gUHlGdW5jdGlvbl9OZXcodiwgZi0+Zl9nbG9iYWxzKTsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCWlmICh4ICE9IE5VTEwpIHsKLQkJCQl2ID0gUE9QKCk7Ci0JCQkJaWYgKFB5RnVuY3Rpb25fU2V0Q2xvc3VyZSh4LCB2KSAhPSAwKSB7Ci0JCQkJCS8qIENhbid0IGhhcHBlbiB1bmxlc3MgYnl0ZWNvZGUgaXMgY29ycnVwdC4gKi8KLQkJCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJfQotCQkJaWYgKHggIT0gTlVMTCAmJiBvcGFyZyA+IDApIHsKLQkJCQl2ID0gUHlUdXBsZV9OZXcob3BhcmcpOwotCQkJCWlmICh2ID09IE5VTEwpIHsKLQkJCQkJUHlfREVDUkVGKHgpOwotCQkJCQl4ID0gTlVMTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXdoaWxlICgtLW9wYXJnID49IDApIHsKLQkJCQkJdyA9IFBPUCgpOwotCQkJCQlQeVR1cGxlX1NFVF9JVEVNKHYsIG9wYXJnLCB3KTsKLQkJCQl9Ci0JCQkJaWYgKFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMoeCwgdikgIT0gMCkgewotCQkJCQkvKiBDYW4ndCBoYXBwZW4gdW5sZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9TZXREZWZhdWx0cyBjaGFuZ2VzLiAqLwotCQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJCX0KLQkJCQlQeV9ERUNSRUYodik7Ci0JCQl9Ci0JCQlQVVNIKHgpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgY2FzZSBNQUtFX0NMT1NVUkU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHYgPSBQT1AoKTsgLyogY29kZSBvYmplY3QgKi8KKyAgICAgICAgICAgIHggPSBQeUZ1bmN0aW9uX05ldyh2LCBmLT5mX2dsb2JhbHMpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXRDbG9zdXJlKHgsIHYpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgaGFwcGVuIHVubGVzcyBieXRlY29kZSBpcyBjb3JydXB0LiAqLworICAgICAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMICYmIG9wYXJnID4gMCkgeworICAgICAgICAgICAgICAgIHYgPSBQeVR1cGxlX05ldyhvcGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeCk7CisgICAgICAgICAgICAgICAgICAgIHggPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKC0tb3BhcmcgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICB3ID0gUE9QKCk7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgb3BhcmcsIHcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXREZWZhdWx0cyh4LCB2KSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbiB1bmxlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9TZXREZWZhdWx0cyBjaGFuZ2VzLiAqLworICAgICAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQVVNIKHgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQljYXNlIEJVSUxEX1NMSUNFOgotCQkJaWYgKG9wYXJnID09IDMpCi0JCQkJdyA9IFBPUCgpOwotCQkJZWxzZQotCQkJCXcgPSBOVUxMOwotCQkJdiA9IFBPUCgpOwotCQkJdSA9IFRPUCgpOwotCQkJeCA9IFB5U2xpY2VfTmV3KHUsIHYsIHcpOwotCQkJUHlfREVDUkVGKHUpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlfWERFQ1JFRih3KTsKLQkJCVNFVF9UT1AoeCk7Ci0JCQlpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKLQkJCWJyZWFrOworICAgICAgICBjYXNlIEJVSUxEX1NMSUNFOgorICAgICAgICAgICAgaWYgKG9wYXJnID09IDMpCisgICAgICAgICAgICAgICAgdyA9IFBPUCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHcgPSBOVUxMOworICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgdSA9IFRPUCgpOworICAgICAgICAgICAgeCA9IFB5U2xpY2VfTmV3KHUsIHYsIHcpOworICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgICAgIFNFVF9UT1AoeCk7CisgICAgICAgICAgICBpZiAoeCAhPSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgIGJyZWFrOwogCi0JCWNhc2UgRVhURU5ERURfQVJHOgotCQkJb3Bjb2RlID0gTkVYVE9QKCk7Ci0JCQlvcGFyZyA9IG9wYXJnPDwxNiB8IE5FWFRBUkcoKTsKLQkJCWdvdG8gZGlzcGF0Y2hfb3Bjb2RlOworICAgICAgICBjYXNlIEVYVEVOREVEX0FSRzoKKyAgICAgICAgICAgIG9wY29kZSA9IE5FWFRPUCgpOworICAgICAgICAgICAgb3BhcmcgPSBvcGFyZzw8MTYgfCBORVhUQVJHKCk7CisgICAgICAgICAgICBnb3RvIGRpc3BhdGNoX29wY29kZTsKIAotCQlkZWZhdWx0OgotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIlhYWCBsaW5lbm86ICVkLCBvcGNvZGU6ICVkXG4iLAotCQkJCVB5Q29kZV9BZGRyMkxpbmUoZi0+Zl9jb2RlLCBmLT5mX2xhc3RpKSwKLQkJCQlvcGNvZGUpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAidW5rbm93biBvcGNvZGUiKTsKLQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQlicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJYWFggbGluZW5vOiAlZCwgb3Bjb2RlOiAlZFxuIiwKKyAgICAgICAgICAgICAgICBQeUNvZGVfQWRkcjJMaW5lKGYtPmZfY29kZSwgZi0+Zl9sYXN0aSksCisgICAgICAgICAgICAgICAgb3Bjb2RlKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgInVua25vd24gb3Bjb2RlIik7CisgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgYnJlYWs7CiAKICNpZmRlZiBDQVNFX1RPT19CSUcKLQkJfQorICAgICAgICB9CiAjZW5kaWYKIAotCQl9IC8qIHN3aXRjaCAqLworICAgICAgICB9IC8qIHN3aXRjaCAqLwogCi0JICAgIG9uX2Vycm9yOgorICAgICAgICBvbl9lcnJvcjoKIAotCQlSRUFEX1RJTUVTVEFNUChpbnN0MSk7CisgICAgICAgIFJFQURfVElNRVNUQU1QKGluc3QxKTsKIAotCQkvKiBRdWlja2x5IGNvbnRpbnVlIGlmIG5vIGVycm9yIG9jY3VycmVkICovCisgICAgICAgIC8qIFF1aWNrbHkgY29udGludWUgaWYgbm8gZXJyb3Igb2NjdXJyZWQgKi8KIAotCQlpZiAod2h5ID09IFdIWV9OT1QpIHsKLQkJCWlmIChlcnIgPT0gMCAmJiB4ICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHdoeSA9PSBXSFlfTk9UKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IDAgJiYgeCAhPSBOVUxMKSB7CiAjaWZkZWYgQ0hFQ0tFWEMKLQkJCQkvKiBUaGlzIGNoZWNrIGlzIGV4cGVuc2l2ZSEgKi8KLQkJCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJCQkiWFhYIHVuZGV0ZWN0ZWQgZXJyb3JcbiIpOwotCQkJCWVsc2UgeworICAgICAgICAgICAgICAgIC8qIFRoaXMgY2hlY2sgaXMgZXhwZW5zaXZlISAqLworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJYWFggdW5kZXRlY3RlZCBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgZWxzZSB7CiAjZW5kaWYKLQkJCQkJUkVBRF9USU1FU1RBTVAobG9vcDEpOwotCQkJCQljb250aW51ZTsgLyogTm9ybWFsLCBmYXN0IHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAobG9vcDEpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogTm9ybWFsLCBmYXN0IHBhdGggKi8KICNpZmRlZiBDSEVDS0VYQwotCQkJCX0KKyAgICAgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCX0KLQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQl4ID0gUHlfTm9uZTsKLQkJCWVyciA9IDA7Ci0JCX0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgICAgICB4ID0gUHlfTm9uZTsKKyAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgIH0KIAotCQkvKiBEb3VibGUtY2hlY2sgZXhjZXB0aW9uIHN0YXR1cyAqLworICAgICAgICAvKiBEb3VibGUtY2hlY2sgZXhjZXB0aW9uIHN0YXR1cyAqLwogCi0JCWlmICh3aHkgPT0gV0hZX0VYQ0VQVElPTiB8fCB3aHkgPT0gV0hZX1JFUkFJU0UpIHsKLQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJImVycm9yIHJldHVybiB3aXRob3V0IGV4Y2VwdGlvbiBzZXQiKTsKLQkJCQl3aHkgPSBXSFlfRVhDRVBUSU9OOwotCQkJfQotCQl9CisgICAgICAgIGlmICh3aHkgPT0gV0hZX0VYQ0VQVElPTiB8fCB3aHkgPT0gV0hZX1JFUkFJU0UpIHsKKyAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImVycm9yIHJldHVybiB3aXRob3V0IGV4Y2VwdGlvbiBzZXQiKTsKKyAgICAgICAgICAgICAgICB3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjaWZkZWYgQ0hFQ0tFWEMKLQkJZWxzZSB7Ci0JCQkvKiBUaGlzIGNoZWNrIGlzIGV4cGVuc2l2ZSEgKi8KLQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkJY2hhciBidWZbMTI4XTsKLQkJCQlzcHJpbnRmKGJ1ZiwgIlN0YWNrIHVud2luZCB3aXRoIGV4Y2VwdGlvbiAiCi0JCQkJCSJzZXQgYW5kIHdoeT0lZCIsIHdoeSk7Ci0JCQkJUHlfRmF0YWxFcnJvcihidWYpOwotCQkJfQotCQl9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogVGhpcyBjaGVjayBpcyBleHBlbnNpdmUhICovCisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICAgICAgICAgICAgc3ByaW50ZihidWYsICJTdGFjayB1bndpbmQgd2l0aCBleGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAic2V0IGFuZCB3aHk9JWQiLCB3aHkpOworICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmCiAKLQkJLyogTG9nIHRyYWNlYmFjayBpbmZvIGlmIHRoaXMgaXMgYSByZWFsIGV4Y2VwdGlvbiAqLworICAgICAgICAvKiBMb2cgdHJhY2ViYWNrIGluZm8gaWYgdGhpcyBpcyBhIHJlYWwgZXhjZXB0aW9uICovCiAKLQkJaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKSB7Ci0JCQlQeVRyYWNlQmFja19IZXJlKGYpOworICAgICAgICBpZiAod2h5ID09IFdIWV9FWENFUFRJT04pIHsKKyAgICAgICAgICAgIFB5VHJhY2VCYWNrX0hlcmUoZik7CiAKLQkJCWlmICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCi0JCQkJY2FsbF9leGNfdHJhY2UodHN0YXRlLT5jX3RyYWNlZnVuYywKLQkJCQkJICAgICAgIHRzdGF0ZS0+Y190cmFjZW9iaiwgZik7Ci0JCX0KKyAgICAgICAgICAgIGlmICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCisgICAgICAgICAgICAgICAgY2FsbF9leGNfdHJhY2UodHN0YXRlLT5jX3RyYWNlZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfdHJhY2VvYmosIGYpOworICAgICAgICB9CiAKLQkJLyogRm9yIHRoZSByZXN0LCB0cmVhdCBXSFlfUkVSQUlTRSBhcyBXSFlfRVhDRVBUSU9OICovCisgICAgICAgIC8qIEZvciB0aGUgcmVzdCwgdHJlYXQgV0hZX1JFUkFJU0UgYXMgV0hZX0VYQ0VQVElPTiAqLwogCi0JCWlmICh3aHkgPT0gV0hZX1JFUkFJU0UpCi0JCQl3aHkgPSBXSFlfRVhDRVBUSU9OOworICAgICAgICBpZiAod2h5ID09IFdIWV9SRVJBSVNFKQorICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKIAotCQkvKiBVbndpbmQgc3RhY2tzIGlmIGEgKHBzZXVkbykgZXhjZXB0aW9uIG9jY3VycmVkICovCisgICAgICAgIC8qIFVud2luZCBzdGFja3MgaWYgYSAocHNldWRvKSBleGNlcHRpb24gb2NjdXJyZWQgKi8KIAogZmFzdF9ibG9ja19lbmQ6Ci0JCXdoaWxlICh3aHkgIT0gV0hZX05PVCAmJiBmLT5mX2libG9jayA+IDApIHsKLQkJCVB5VHJ5QmxvY2sgKmIgPSBQeUZyYW1lX0Jsb2NrUG9wKGYpOworICAgICAgICB3aGlsZSAod2h5ICE9IFdIWV9OT1QgJiYgZi0+Zl9pYmxvY2sgPiAwKSB7CisgICAgICAgICAgICBQeVRyeUJsb2NrICpiID0gUHlGcmFtZV9CbG9ja1BvcChmKTsKIAotCQkJYXNzZXJ0KHdoeSAhPSBXSFlfWUlFTEQpOwotCQkJaWYgKGItPmJfdHlwZSA9PSBTRVRVUF9MT09QICYmIHdoeSA9PSBXSFlfQ09OVElOVUUpIHsKLQkJCQkvKiBGb3IgYSBjb250aW51ZSBpbnNpZGUgYSB0cnkgYmxvY2ssCi0JCQkJICAgZG9uJ3QgcG9wIHRoZSBibG9jayBmb3IgdGhlIGxvb3AuICovCi0JCQkJUHlGcmFtZV9CbG9ja1NldHVwKGYsIGItPmJfdHlwZSwgYi0+Yl9oYW5kbGVyLAotCQkJCQkJICAgYi0+Yl9sZXZlbCk7Ci0JCQkJd2h5ID0gV0hZX05PVDsKLQkJCQlKVU1QVE8oUHlJbnRfQVNfTE9ORyhyZXR2YWwpKTsKLQkJCQlQeV9ERUNSRUYocmV0dmFsKTsKLQkJCQlicmVhazsKLQkJCX0KKyAgICAgICAgICAgIGFzc2VydCh3aHkgIT0gV0hZX1lJRUxEKTsKKyAgICAgICAgICAgIGlmIChiLT5iX3R5cGUgPT0gU0VUVVBfTE9PUCAmJiB3aHkgPT0gV0hZX0NPTlRJTlVFKSB7CisgICAgICAgICAgICAgICAgLyogRm9yIGEgY29udGludWUgaW5zaWRlIGEgdHJ5IGJsb2NrLAorICAgICAgICAgICAgICAgICAgIGRvbid0IHBvcCB0aGUgYmxvY2sgZm9yIHRoZSBsb29wLiAqLworICAgICAgICAgICAgICAgIFB5RnJhbWVfQmxvY2tTZXR1cChmLCBiLT5iX3R5cGUsIGItPmJfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi0+Yl9sZXZlbCk7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX05PVDsKKyAgICAgICAgICAgICAgICBKVU1QVE8oUHlJbnRfQVNfTE9ORyhyZXR2YWwpKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmV0dmFsKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAotCQkJd2hpbGUgKFNUQUNLX0xFVkVMKCkgPiBiLT5iX2xldmVsKSB7Ci0JCQkJdiA9IFBPUCgpOwotCQkJCVB5X1hERUNSRUYodik7Ci0JCQl9Ci0JCQlpZiAoYi0+Yl90eXBlID09IFNFVFVQX0xPT1AgJiYgd2h5ID09IFdIWV9CUkVBSykgewotCQkJCXdoeSA9IFdIWV9OT1Q7Ci0JCQkJSlVNUFRPKGItPmJfaGFuZGxlcik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoYi0+Yl90eXBlID09IFNFVFVQX0ZJTkFMTFkgfHwKLQkJCSAgICAoYi0+Yl90eXBlID09IFNFVFVQX0VYQ0VQVCAmJgotCQkJICAgICB3aHkgPT0gV0hZX0VYQ0VQVElPTikpIHsKLQkJCQlpZiAod2h5ID09IFdIWV9FWENFUFRJT04pIHsKLQkJCQkJUHlPYmplY3QgKmV4YywgKnZhbCwgKnRiOwotCQkJCQlQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOwotCQkJCQlpZiAodmFsID09IE5VTEwpIHsKLQkJCQkJCXZhbCA9IFB5X05vbmU7Ci0JCQkJCQlQeV9JTkNSRUYodmFsKTsKLQkJCQkJfQotCQkJCQkvKiBNYWtlIHRoZSByYXcgZXhjZXB0aW9uIGRhdGEKLQkJCQkJICAgYXZhaWxhYmxlIHRvIHRoZSBoYW5kbGVyLAotCQkJCQkgICBzbyBhIHByb2dyYW0gY2FuIGVtdWxhdGUgdGhlCi0JCQkJCSAgIFB5dGhvbiBtYWluIGxvb3AuICBEb24ndCBkbwotCQkJCQkgICB0aGlzIGZvciAnZmluYWxseScuICovCi0JCQkJCWlmIChiLT5iX3R5cGUgPT0gU0VUVVBfRVhDRVBUKSB7Ci0JCQkJCQlQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oCi0JCQkJCQkJJmV4YywgJnZhbCwgJnRiKTsKLQkJCQkJCXNldF9leGNfaW5mbyh0c3RhdGUsCi0JCQkJCQkJICAgICBleGMsIHZhbCwgdGIpOwotCQkJCQl9Ci0JCQkJCWlmICh0YiA9PSBOVUxMKSB7Ci0JCQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJCQlQVVNIKFB5X05vbmUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCVBVU0godGIpOwotCQkJCQlQVVNIKHZhbCk7Ci0JCQkJCVBVU0goZXhjKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICh3aHkgJiAoV0hZX1JFVFVSTiB8IFdIWV9DT05USU5VRSkpCi0JCQkJCQlQVVNIKHJldHZhbCk7Ci0JCQkJCXYgPSBQeUludF9Gcm9tTG9uZygobG9uZyl3aHkpOwotCQkJCQlQVVNIKHYpOwotCQkJCX0KLQkJCQl3aHkgPSBXSFlfTk9UOwotCQkJCUpVTVBUTyhiLT5iX2hhbmRsZXIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IC8qIHVud2luZCBzdGFjayAqLworICAgICAgICAgICAgd2hpbGUgKFNUQUNLX0xFVkVMKCkgPiBiLT5iX2xldmVsKSB7CisgICAgICAgICAgICAgICAgdiA9IFBPUCgpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYi0+Yl90eXBlID09IFNFVFVQX0xPT1AgJiYgd2h5ID09IFdIWV9CUkVBSykgeworICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9OT1Q7CisgICAgICAgICAgICAgICAgSlVNUFRPKGItPmJfaGFuZGxlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYi0+Yl90eXBlID09IFNFVFVQX0ZJTkFMTFkgfHwKKyAgICAgICAgICAgICAgICAoYi0+Yl90eXBlID09IFNFVFVQX0VYQ0VQVCAmJgorICAgICAgICAgICAgICAgICB3aHkgPT0gV0hZX0VYQ0VQVElPTikpIHsKKyAgICAgICAgICAgICAgICBpZiAod2h5ID09IFdIWV9FWENFUFRJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmV4YywgKnZhbCwgKnRiOworICAgICAgICAgICAgICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFB5X05vbmU7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYodmFsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBNYWtlIHRoZSByYXcgZXhjZXB0aW9uIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIHRvIHRoZSBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICBzbyBhIHByb2dyYW0gY2FuIGVtdWxhdGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIFB5dGhvbiBtYWluIGxvb3AuICBEb24ndCBkbworICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZvciAnZmluYWxseScuICovCisgICAgICAgICAgICAgICAgICAgIGlmIChiLT5iX3R5cGUgPT0gU0VUVVBfRVhDRVBUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4YywgJnZhbCwgJnRiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9leGNfaW5mbyh0c3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLCB2YWwsIHRiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodGIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgUFVTSChQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBQVVNIKHRiKTsKKyAgICAgICAgICAgICAgICAgICAgUFVTSCh2YWwpOworICAgICAgICAgICAgICAgICAgICBQVVNIKGV4Yyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAod2h5ICYgKFdIWV9SRVRVUk4gfCBXSFlfQ09OVElOVUUpKQorICAgICAgICAgICAgICAgICAgICAgICAgUFVTSChyZXR2YWwpOworICAgICAgICAgICAgICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpd2h5KTsKKyAgICAgICAgICAgICAgICAgICAgUFVTSCh2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX05PVDsKKyAgICAgICAgICAgICAgICBKVU1QVE8oYi0+Yl9oYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvKiB1bndpbmQgc3RhY2sgKi8KIAotCQkvKiBFbmQgdGhlIGxvb3AgaWYgd2Ugc3RpbGwgaGF2ZSBhbiBlcnJvciAob3IgcmV0dXJuKSAqLworICAgICAgICAvKiBFbmQgdGhlIGxvb3AgaWYgd2Ugc3RpbGwgaGF2ZSBhbiBlcnJvciAob3IgcmV0dXJuKSAqLwogCi0JCWlmICh3aHkgIT0gV0hZX05PVCkKLQkJCWJyZWFrOwotCQlSRUFEX1RJTUVTVEFNUChsb29wMSk7CisgICAgICAgIGlmICh3aHkgIT0gV0hZX05PVCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBSRUFEX1RJTUVTVEFNUChsb29wMSk7CiAKLQl9IC8qIG1haW4gbG9vcCAqLworICAgIH0gLyogbWFpbiBsb29wICovCiAKLQlhc3NlcnQod2h5ICE9IFdIWV9ZSUVMRCk7Ci0JLyogUG9wIHJlbWFpbmluZyBzdGFjayBlbnRyaWVzLiAqLwotCXdoaWxlICghRU1QVFkoKSkgewotCQl2ID0gUE9QKCk7Ci0JCVB5X1hERUNSRUYodik7Ci0JfQorICAgIGFzc2VydCh3aHkgIT0gV0hZX1lJRUxEKTsKKyAgICAvKiBQb3AgcmVtYWluaW5nIHN0YWNrIGVudHJpZXMuICovCisgICAgd2hpbGUgKCFFTVBUWSgpKSB7CisgICAgICAgIHYgPSBQT1AoKTsKKyAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICB9CiAKLQlpZiAod2h5ICE9IFdIWV9SRVRVUk4pCi0JCXJldHZhbCA9IE5VTEw7CisgICAgaWYgKHdoeSAhPSBXSFlfUkVUVVJOKQorICAgICAgICByZXR2YWwgPSBOVUxMOwogCiBmYXN0X3lpZWxkOgotCWlmICh0c3RhdGUtPnVzZV90cmFjaW5nKSB7Ci0JCWlmICh0c3RhdGUtPmNfdHJhY2VmdW5jKSB7Ci0JCQlpZiAod2h5ID09IFdIWV9SRVRVUk4gfHwgd2h5ID09IFdIWV9ZSUVMRCkgewotCQkJCWlmIChjYWxsX3RyYWNlKHRzdGF0ZS0+Y190cmFjZWZ1bmMsCi0JCQkJCSAgICAgICB0c3RhdGUtPmNfdHJhY2VvYmosIGYsCi0JCQkJCSAgICAgICBQeVRyYWNlX1JFVFVSTiwgcmV0dmFsKSkgewotCQkJCQlQeV9YREVDUkVGKHJldHZhbCk7Ci0JCQkJCXJldHZhbCA9IE5VTEw7Ci0JCQkJCXdoeSA9IFdIWV9FWENFUFRJT047Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAod2h5ID09IFdIWV9FWENFUFRJT04pIHsKLQkJCQljYWxsX3RyYWNlX3Byb3RlY3RlZCh0c3RhdGUtPmNfdHJhY2VmdW5jLAotCQkJCQkJICAgICB0c3RhdGUtPmNfdHJhY2VvYmosIGYsCi0JCQkJCQkgICAgIFB5VHJhY2VfUkVUVVJOLCBOVUxMKTsKLQkJCX0KLQkJfQotCQlpZiAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jKSB7Ci0JCQlpZiAod2h5ID09IFdIWV9FWENFUFRJT04pCi0JCQkJY2FsbF90cmFjZV9wcm90ZWN0ZWQodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLAotCQkJCQkJICAgICB0c3RhdGUtPmNfcHJvZmlsZW9iaiwgZiwKLQkJCQkJCSAgICAgUHlUcmFjZV9SRVRVUk4sIE5VTEwpOwotCQkJZWxzZSBpZiAoY2FsbF90cmFjZSh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMsCi0JCQkJCSAgICB0c3RhdGUtPmNfcHJvZmlsZW9iaiwgZiwKLQkJCQkJICAgIFB5VHJhY2VfUkVUVVJOLCByZXR2YWwpKSB7Ci0JCQkJUHlfWERFQ1JFRihyZXR2YWwpOwotCQkJCXJldHZhbCA9IE5VTEw7Ci0JCQkJd2h5ID0gV0hZX0VYQ0VQVElPTjsKLQkJCX0KLQkJfQotCX0KKyAgICBpZiAodHN0YXRlLT51c2VfdHJhY2luZykgeworICAgICAgICBpZiAodHN0YXRlLT5jX3RyYWNlZnVuYykgeworICAgICAgICAgICAgaWYgKHdoeSA9PSBXSFlfUkVUVVJOIHx8IHdoeSA9PSBXSFlfWUlFTEQpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FsbF90cmFjZSh0c3RhdGUtPmNfdHJhY2VmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+Y190cmFjZW9iaiwgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVRyYWNlX1JFVFVSTiwgcmV0dmFsKSkgeworICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHJldHZhbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHdoeSA9IFdIWV9FWENFUFRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAod2h5ID09IFdIWV9FWENFUFRJT04pIHsKKyAgICAgICAgICAgICAgICBjYWxsX3RyYWNlX3Byb3RlY3RlZCh0c3RhdGUtPmNfdHJhY2VmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+Y190cmFjZW9iaiwgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVRyYWNlX1JFVFVSTiwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYykgeworICAgICAgICAgICAgaWYgKHdoeSA9PSBXSFlfRVhDRVBUSU9OKQorICAgICAgICAgICAgICAgIGNhbGxfdHJhY2VfcHJvdGVjdGVkKHRzdGF0ZS0+Y19wcm9maWxlZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c3RhdGUtPmNfcHJvZmlsZW9iaiwgZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVRyYWNlX1JFVFVSTiwgTlVMTCk7CisgICAgICAgICAgICBlbHNlIGlmIChjYWxsX3RyYWNlKHRzdGF0ZS0+Y19wcm9maWxlZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5jX3Byb2ZpbGVvYmosIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHJhY2VfUkVUVVJOLCByZXR2YWwpKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihyZXR2YWwpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgd2h5ID0gV0hZX0VYQ0VQVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCWlmICh0c3RhdGUtPmZyYW1lLT5mX2V4Y190eXBlICE9IE5VTEwpCi0JCXJlc2V0X2V4Y19pbmZvKHRzdGF0ZSk7Ci0JZWxzZSB7Ci0JCWFzc2VydCh0c3RhdGUtPmZyYW1lLT5mX2V4Y192YWx1ZSA9PSBOVUxMKTsKLQkJYXNzZXJ0KHRzdGF0ZS0+ZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9PSBOVUxMKTsKLQl9CisgICAgaWYgKHRzdGF0ZS0+ZnJhbWUtPmZfZXhjX3R5cGUgIT0gTlVMTCkKKyAgICAgICAgcmVzZXRfZXhjX2luZm8odHN0YXRlKTsKKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KHRzdGF0ZS0+ZnJhbWUtPmZfZXhjX3ZhbHVlID09IE5VTEwpOworICAgICAgICBhc3NlcnQodHN0YXRlLT5mcmFtZS0+Zl9leGNfdHJhY2ViYWNrID09IE5VTEwpOworICAgIH0KIAotCS8qIHBvcCBmcmFtZSAqLworICAgIC8qIHBvcCBmcmFtZSAqLwogZXhpdF9ldmFsX2ZyYW1lOgotCVB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpOwotCXRzdGF0ZS0+ZnJhbWUgPSBmLT5mX2JhY2s7CisgICAgUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisgICAgdHN0YXRlLT5mcmFtZSA9IGYtPmZfYmFjazsKIAotCXJldHVybiByZXR2YWw7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogLyogVGhpcyBpcyBnb25uYSBzZWVtICpyZWFsIHdlaXJkKiwgYnV0IGlmIHlvdSBwdXQgc29tZSBvdGhlciBjb2RlIGJldHdlZW4KQEAgLTI3NTgsMjcwICsyNzU4LDI3MCBAQAogCiBQeU9iamVjdCAqCiBQeUV2YWxfRXZhbENvZGVFeChQeUNvZGVPYmplY3QgKmNvLCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscywKLQkgICBQeU9iamVjdCAqKmFyZ3MsIGludCBhcmdjb3VudCwgUHlPYmplY3QgKiprd3MsIGludCBrd2NvdW50LAotCSAgIFB5T2JqZWN0ICoqZGVmcywgaW50IGRlZmNvdW50LCBQeU9iamVjdCAqY2xvc3VyZSkKKyAgICAgICAgICAgUHlPYmplY3QgKiphcmdzLCBpbnQgYXJnY291bnQsIFB5T2JqZWN0ICoqa3dzLCBpbnQga3djb3VudCwKKyAgICAgICAgICAgUHlPYmplY3QgKipkZWZzLCBpbnQgZGVmY291bnQsIFB5T2JqZWN0ICpjbG9zdXJlKQogewotCXJlZ2lzdGVyIFB5RnJhbWVPYmplY3QgKmY7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7Ci0JcmVnaXN0ZXIgUHlPYmplY3QgKipmYXN0bG9jYWxzLCAqKmZyZWV2YXJzOwotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlPYmplY3QgKngsICp1OworICAgIHJlZ2lzdGVyIFB5RnJhbWVPYmplY3QgKmY7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKipmYXN0bG9jYWxzLCAqKmZyZWV2YXJzOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKngsICp1OwogCi0JaWYgKGdsb2JhbHMgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIlB5RXZhbF9FdmFsQ29kZUV4OiBOVUxMIGdsb2JhbHMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChnbG9iYWxzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlB5RXZhbF9FdmFsQ29kZUV4OiBOVUxMIGdsb2JhbHMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKLQlhc3NlcnQoZ2xvYmFscyAhPSBOVUxMKTsKLQlmID0gUHlGcmFtZV9OZXcodHN0YXRlLCBjbywgZ2xvYmFscywgbG9jYWxzKTsKLQlpZiAoZiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQodHN0YXRlICE9IE5VTEwpOworICAgIGFzc2VydChnbG9iYWxzICE9IE5VTEwpOworICAgIGYgPSBQeUZyYW1lX05ldyh0c3RhdGUsIGNvLCBnbG9iYWxzLCBsb2NhbHMpOworICAgIGlmIChmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKLQlmcmVldmFycyA9IGYtPmZfbG9jYWxzcGx1cyArIGNvLT5jb19ubG9jYWxzOworICAgIGZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CisgICAgZnJlZXZhcnMgPSBmLT5mX2xvY2Fsc3BsdXMgKyBjby0+Y29fbmxvY2FsczsKIAotCWlmIChjby0+Y29fYXJnY291bnQgPiAwIHx8Ci0JICAgIGNvLT5jb19mbGFncyAmIChDT19WQVJBUkdTIHwgQ09fVkFSS0VZV09SRFMpKSB7Ci0JCWludCBpOwotCQlpbnQgbiA9IGFyZ2NvdW50OwotCQlQeU9iamVjdCAqa3dkaWN0ID0gTlVMTDsKLQkJaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUktFWVdPUkRTKSB7Ci0JCQlrd2RpY3QgPSBQeURpY3RfTmV3KCk7Ci0JCQlpZiAoa3dkaWN0ID09IE5VTEwpCi0JCQkJZ290byBmYWlsOwotCQkJaSA9IGNvLT5jb19hcmdjb3VudDsKLQkJCWlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKQotCQkJCWkrKzsKLQkJCVNFVExPQ0FMKGksIGt3ZGljdCk7Ci0JCX0KLQkJaWYgKGFyZ2NvdW50ID4gY28tPmNvX2FyZ2NvdW50KSB7Ci0JCQlpZiAoIShjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKSkgewotCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICIlLjIwMHMoKSB0YWtlcyAlcyAlZCAiCi0JCQkJICAgICIlc2FyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCi0JCQkJICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKLQkJCQkgICAgZGVmY291bnQgPyAiYXQgbW9zdCIgOiAiZXhhY3RseSIsCi0JCQkJICAgIGNvLT5jb19hcmdjb3VudCwKLQkJCQkgICAga3djb3VudCA/ICJub24ta2V5d29yZCAiIDogIiIsCi0JCQkJICAgIGNvLT5jb19hcmdjb3VudCA9PSAxID8gIiIgOiAicyIsCi0JCQkJICAgIGFyZ2NvdW50KTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCQluID0gY28tPmNvX2FyZ2NvdW50OwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXggPSBhcmdzW2ldOwotCQkJUHlfSU5DUkVGKHgpOwotCQkJU0VUTE9DQUwoaSwgeCk7Ci0JCX0KLQkJaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpIHsKLQkJCXUgPSBQeVR1cGxlX05ldyhhcmdjb3VudCAtIG4pOwotCQkJaWYgKHUgPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWw7Ci0JCQlTRVRMT0NBTChjby0+Y29fYXJnY291bnQsIHUpOwotCQkJZm9yIChpID0gbjsgaSA8IGFyZ2NvdW50OyBpKyspIHsKLQkJCQl4ID0gYXJnc1tpXTsKLQkJCQlQeV9JTkNSRUYoeCk7Ci0JCQkJUHlUdXBsZV9TRVRfSVRFTSh1LCBpLW4sIHgpOwotCQkJfQotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBrd2NvdW50OyBpKyspIHsKLQkJCVB5T2JqZWN0ICoqY29fdmFybmFtZXM7Ci0JCQlQeU9iamVjdCAqa2V5d29yZCA9IGt3c1syKmldOwotCQkJUHlPYmplY3QgKnZhbHVlID0ga3dzWzIqaSArIDFdOwotCQkJaW50IGo7Ci0JCQlpZiAoa2V5d29yZCA9PSBOVUxMIHx8ICEoUHlTdHJpbmdfQ2hlY2soa2V5d29yZCkgfHwKLQkJCQkJCSBQeVVuaWNvZGVfQ2hlY2soa2V5d29yZCkpKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgIiUuMjAwcygpIGtleXdvcmRzIG11c3QgYmUgc3RyaW5ncyIsCi0JCQkJICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJLyogU3BlZWQgaGFjazogZG8gcmF3IHBvaW50ZXIgY29tcGFyZXMuIEFzIG5hbWVzIGFyZQotCQkJICAgbm9ybWFsbHkgaW50ZXJuZWQgdGhpcyBzaG91bGQgYWxtb3N0IGFsd2F5cyBoaXQuICovCi0JCQljb192YXJuYW1lcyA9IFB5U2VxdWVuY2VfRmFzdF9JVEVNUyhjby0+Y29fdmFybmFtZXMpOwotCQkJZm9yIChqID0gMDsgaiA8IGNvLT5jb19hcmdjb3VudDsgaisrKSB7Ci0JCQkJUHlPYmplY3QgKm5tID0gY29fdmFybmFtZXNbal07Ci0JCQkJaWYgKG5tID09IGtleXdvcmQpCi0JCQkJCWdvdG8ga3dfZm91bmQ7Ci0JCQl9Ci0JCQkvKiBTbG93IGZhbGxiYWNrLCBqdXN0IGluIGNhc2UgKi8KLQkJCWZvciAoaiA9IDA7IGogPCBjby0+Y29fYXJnY291bnQ7IGorKykgewotCQkJCVB5T2JqZWN0ICpubSA9IGNvX3Zhcm5hbWVzW2pdOwotCQkJCWludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woCi0JCQkJCWtleXdvcmQsIG5tLCBQeV9FUSk7Ci0JCQkJaWYgKGNtcCA+IDApCi0JCQkJCWdvdG8ga3dfZm91bmQ7Ci0JCQkJZWxzZSBpZiAoY21wIDwgMCkKLQkJCQkJZ290byBmYWlsOwotCQkJfQotCQkJLyogQ2hlY2sgZXJyb3JzIGZyb20gQ29tcGFyZSAqLwotCQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQkJZ290byBmYWlsOwotCQkJaWYgKGogPj0gY28tPmNvX2FyZ2NvdW50KSB7Ci0JCQkJaWYgKGt3ZGljdCA9PSBOVUxMKSB7Ci0JCQkJCVB5T2JqZWN0ICprd2Rfc3RyID0ga3dkX2FzX3N0cmluZyhrZXl3b3JkKTsKLQkJCQkJaWYgKGt3ZF9zdHIpIHsKLQkJCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkJICAgICAiJS4yMDBzKCkgZ290IGFuIHVuZXhwZWN0ZWQgIgotCQkJCQkJCSAgICAgImtleXdvcmQgYXJndW1lbnQgJyUuNDAwcyciLAotCQkJCQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpLAotCQkJCQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoa3dkX3N0cikpOwotCQkJCQkJUHlfREVDUkVGKGt3ZF9zdHIpOwotCQkJCQl9Ci0JCQkJCWdvdG8gZmFpbDsKLQkJCQl9Ci0JCQkJUHlEaWN0X1NldEl0ZW0oa3dkaWN0LCBrZXl3b3JkLCB2YWx1ZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9CisgICAgaWYgKGNvLT5jb19hcmdjb3VudCA+IDAgfHwKKyAgICAgICAgY28tPmNvX2ZsYWdzICYgKENPX1ZBUkFSR1MgfCBDT19WQVJLRVlXT1JEUykpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBuID0gYXJnY291bnQ7CisgICAgICAgIFB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOworICAgICAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSS0VZV09SRFMpIHsKKyAgICAgICAgICAgIGt3ZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgICAgIGlmIChrd2RpY3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBpID0gY28tPmNvX2FyZ2NvdW50OworICAgICAgICAgICAgaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgU0VUTE9DQUwoaSwga3dkaWN0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJnY291bnQgPiBjby0+Y29fYXJnY291bnQpIHsKKyAgICAgICAgICAgIGlmICghKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIiUuMjAwcygpIHRha2VzICVzICVkICIKKyAgICAgICAgICAgICAgICAgICAgIiVzYXJndW1lbnQlcyAoJWQgZ2l2ZW4pIiwKKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpLAorICAgICAgICAgICAgICAgICAgICBkZWZjb3VudCA/ICJhdCBtb3N0IiA6ICJleGFjdGx5IiwKKyAgICAgICAgICAgICAgICAgICAgY28tPmNvX2FyZ2NvdW50LAorICAgICAgICAgICAgICAgICAgICBrd2NvdW50ID8gIm5vbi1rZXl3b3JkICIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgY28tPmNvX2FyZ2NvdW50ID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnY291bnQpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG4gPSBjby0+Y29fYXJnY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgeCA9IGFyZ3NbaV07CisgICAgICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgICAgICBTRVRMT0NBTChpLCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykgeworICAgICAgICAgICAgdSA9IFB5VHVwbGVfTmV3KGFyZ2NvdW50IC0gbik7CisgICAgICAgICAgICBpZiAodSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIFNFVExPQ0FMKGNvLT5jb19hcmdjb3VudCwgdSk7CisgICAgICAgICAgICBmb3IgKGkgPSBuOyBpIDwgYXJnY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHggPSBhcmdzW2ldOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih4KTsKKyAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHUsIGktbiwgeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGt3Y291bnQ7IGkrKykgeworICAgICAgICAgICAgUHlPYmplY3QgKipjb192YXJuYW1lczsKKyAgICAgICAgICAgIFB5T2JqZWN0ICprZXl3b3JkID0ga3dzWzIqaV07CisgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBrd3NbMippICsgMV07CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGlmIChrZXl3b3JkID09IE5VTEwgfHwgIShQeVN0cmluZ19DaGVjayhrZXl3b3JkKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9DaGVjayhrZXl3b3JkKSkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAiJS4yMDBzKCkga2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzIiwKKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBTcGVlZCBoYWNrOiBkbyByYXcgcG9pbnRlciBjb21wYXJlcy4gQXMgbmFtZXMgYXJlCisgICAgICAgICAgICAgICBub3JtYWxseSBpbnRlcm5lZCB0aGlzIHNob3VsZCBhbG1vc3QgYWx3YXlzIGhpdC4gKi8KKyAgICAgICAgICAgIGNvX3Zhcm5hbWVzID0gUHlTZXF1ZW5jZV9GYXN0X0lURU1TKGNvLT5jb192YXJuYW1lcyk7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY28tPmNvX2FyZ2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqbm0gPSBjb192YXJuYW1lc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAobm0gPT0ga2V5d29yZCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBrd19mb3VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNsb3cgZmFsbGJhY2ssIGp1c3QgaW4gY2FzZSAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvLT5jb19hcmdjb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5tID0gY29fdmFybmFtZXNbal07CisgICAgICAgICAgICAgICAgaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCgKKyAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgbm0sIFB5X0VRKTsKKyAgICAgICAgICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBrd19mb3VuZDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBDaGVjayBlcnJvcnMgZnJvbSBDb21wYXJlICovCisgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBpZiAoaiA+PSBjby0+Y29fYXJnY291bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoa3dkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmt3ZF9zdHIgPSBrd2RfYXNfc3RyaW5nKGtleXdvcmQpOworICAgICAgICAgICAgICAgICAgICBpZiAoa3dkX3N0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzKCkgZ290IGFuIHVuZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXl3b3JkIGFyZ3VtZW50ICclLjQwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoa3dkX3N0cikpOworICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGt3ZF9zdHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW0oa3dkaWN0LCBrZXl3b3JkLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiBrd19mb3VuZDoKLQkJCWlmIChHRVRMT0NBTChqKSAhPSBOVUxMKSB7Ci0JCQkJUHlPYmplY3QgKmt3ZF9zdHIgPSBrd2RfYXNfc3RyaW5nKGtleXdvcmQpOwotCQkJCWlmIChrd2Rfc3RyKSB7Ci0JCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkgICAgICIlLjIwMHMoKSBnb3QgbXVsdGlwbGUgIgotCQkJCQkJICAgICAidmFsdWVzIGZvciBrZXl3b3JkICIKLQkJCQkJCSAgICAgImFyZ3VtZW50ICclLjQwMHMnIiwKLQkJCQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpLAotCQkJCQkJICAgICBQeVN0cmluZ19Bc1N0cmluZyhrd2Rfc3RyKSk7Ci0JCQkJCVB5X0RFQ1JFRihrd2Rfc3RyKTsKLQkJCQl9Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCQkJUHlfSU5DUkVGKHZhbHVlKTsKLQkJCVNFVExPQ0FMKGosIHZhbHVlKTsKLQkJfQotCQlpZiAoYXJnY291bnQgPCBjby0+Y29fYXJnY291bnQpIHsKLQkJCWludCBtID0gY28tPmNvX2FyZ2NvdW50IC0gZGVmY291bnQ7Ci0JCQlmb3IgKGkgPSBhcmdjb3VudDsgaSA8IG07IGkrKykgewotCQkJCWlmIChHRVRMT0NBTChpKSA9PSBOVUxMKSB7Ci0JCQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSAgICAiJS4yMDBzKCkgdGFrZXMgJXMgJWQgIgotCQkJCQkgICAgIiVzYXJndW1lbnQlcyAoJWQgZ2l2ZW4pIiwKLQkJCQkJICAgIFB5U3RyaW5nX0FzU3RyaW5nKGNvLT5jb19uYW1lKSwKLQkJCQkJICAgICgoY28tPmNvX2ZsYWdzICYgQ09fVkFSQVJHUykgfHwKLQkJCQkJICAgICBkZWZjb3VudCkgPyAiYXQgbGVhc3QiCi0JCQkJCQkgICAgICAgOiAiZXhhY3RseSIsCi0JCQkJCSAgICBtLCBrd2NvdW50ID8gIm5vbi1rZXl3b3JkICIgOiAiIiwKLQkJCQkJICAgIG0gPT0gMSA/ICIiIDogInMiLCBpKTsKLQkJCQkJZ290byBmYWlsOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuID4gbSkKLQkJCQlpID0gbiAtIG07Ci0JCQllbHNlCi0JCQkJaSA9IDA7Ci0JCQlmb3IgKDsgaSA8IGRlZmNvdW50OyBpKyspIHsKLQkJCQlpZiAoR0VUTE9DQUwobStpKSA9PSBOVUxMKSB7Ci0JCQkJCVB5T2JqZWN0ICpkZWYgPSBkZWZzW2ldOwotCQkJCQlQeV9JTkNSRUYoZGVmKTsKLQkJCQkJU0VUTE9DQUwobStpLCBkZWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQllbHNlIHsKLQkJaWYgKGFyZ2NvdW50ID4gMCB8fCBrd2NvdW50ID4gMCkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICIlLjIwMHMoKSB0YWtlcyBubyBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCi0JCQkJICAgICBQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fbmFtZSksCi0JCQkJICAgICBhcmdjb3VudCArIGt3Y291bnQpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHN0b3JhZ2UgZm9yIGNlbGwgdmFycywgYW5kIGNvcHkgZnJlZQotCSAgIHZhcnMgaW50byBmcmFtZS4gIFRoaXMgaXNuJ3QgdG9vIGVmZmljaWVudCByaWdodCBub3cuICovCi0JaWYgKFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSkgewotCQlpbnQgaSwgaiwgbmFyZ3MsIGZvdW5kOwotCQljaGFyICpjZWxsbmFtZSwgKmFyZ25hbWU7Ci0JCVB5T2JqZWN0ICpjOworICAgICAgICAgICAgaWYgKEdFVExPQ0FMKGopICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqa3dkX3N0ciA9IGt3ZF9hc19zdHJpbmcoa2V5d29yZCk7CisgICAgICAgICAgICAgICAgaWYgKGt3ZF9zdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSBnb3QgbXVsdGlwbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlcyBmb3Iga2V5d29yZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgJyUuNDAwcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoa3dkX3N0cikpOworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa3dkX3N0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICBTRVRMT0NBTChqLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFyZ2NvdW50IDwgY28tPmNvX2FyZ2NvdW50KSB7CisgICAgICAgICAgICBpbnQgbSA9IGNvLT5jb19hcmdjb3VudCAtIGRlZmNvdW50OworICAgICAgICAgICAgZm9yIChpID0gYXJnY291bnQ7IGkgPCBtOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoR0VUTE9DQUwoaSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcygpIHRha2VzICVzICVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlc2FyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhjby0+Y29fbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoKGNvLT5jb19mbGFncyAmIENPX1ZBUkFSR1MpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgZGVmY291bnQpID8gImF0IGxlYXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJleGFjdGx5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG0sIGt3Y291bnQgPyAibm9uLWtleXdvcmQgIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgbSA9PSAxID8gIiIgOiAicyIsIGkpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG4gPiBtKQorICAgICAgICAgICAgICAgIGkgPSBuIC0gbTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGZvciAoOyBpIDwgZGVmY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChHRVRMT0NBTChtK2kpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmRlZiA9IGRlZnNbaV07CisgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihkZWYpOworICAgICAgICAgICAgICAgICAgICBTRVRMT0NBTChtK2ksIGRlZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoYXJnY291bnQgPiAwIHx8IGt3Y291bnQgPiAwKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBubyBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2NvdW50ICsga3djb3VudCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgc3RvcmFnZSBmb3IgY2VsbCB2YXJzLCBhbmQgY29weSBmcmVlCisgICAgICAgdmFycyBpbnRvIGZyYW1lLiAgVGhpcyBpc24ndCB0b28gZWZmaWNpZW50IHJpZ2h0IG5vdy4gKi8KKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpKSB7CisgICAgICAgIGludCBpLCBqLCBuYXJncywgZm91bmQ7CisgICAgICAgIGNoYXIgKmNlbGxuYW1lLCAqYXJnbmFtZTsKKyAgICAgICAgUHlPYmplY3QgKmM7CiAKLQkJbmFyZ3MgPSBjby0+Y29fYXJnY291bnQ7Ci0JCWlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKQotCQkJbmFyZ3MrKzsKLQkJaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUktFWVdPUkRTKQotCQkJbmFyZ3MrKzsKKyAgICAgICAgbmFyZ3MgPSBjby0+Y29fYXJnY291bnQ7CisgICAgICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19WQVJBUkdTKQorICAgICAgICAgICAgbmFyZ3MrKzsKKyAgICAgICAgaWYgKGNvLT5jb19mbGFncyAmIENPX1ZBUktFWVdPUkRTKQorICAgICAgICAgICAgbmFyZ3MrKzsKIAotCQkvKiBJbml0aWFsaXplIGVhY2ggY2VsbCB2YXIsIHRha2luZyBpbnRvIGFjY291bnQKLQkJICAgY2VsbCB2YXJzIHRoYXQgYXJlIGluaXRpYWxpemVkIGZyb20gYXJndW1lbnRzLgorICAgICAgICAvKiBJbml0aWFsaXplIGVhY2ggY2VsbCB2YXIsIHRha2luZyBpbnRvIGFjY291bnQKKyAgICAgICAgICAgY2VsbCB2YXJzIHRoYXQgYXJlIGluaXRpYWxpemVkIGZyb20gYXJndW1lbnRzLgogCi0JCSAgIFNob3VsZCBhcnJhbmdlIGZvciB0aGUgY29tcGlsZXIgdG8gcHV0IGNlbGx2YXJzCi0JCSAgIHRoYXQgYXJlIGFyZ3VtZW50cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjZWxsdmFycwotCQkgICBsaXN0IHNvIHRoYXQgd2UgY2FuIG1hcmNoIG92ZXIgaXQgbW9yZSBlZmZpY2llbnRseT8KLQkJKi8KLQkJZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKTsgKytpKSB7Ci0JCQljZWxsbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORygKLQkJCQlQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb19jZWxsdmFycywgaSkpOwotCQkJZm91bmQgPSAwOwotCQkJZm9yIChqID0gMDsgaiA8IG5hcmdzOyBqKyspIHsKLQkJCQlhcmduYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKAotCQkJCQlQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb192YXJuYW1lcywgaikpOwotCQkJCWlmIChzdHJjbXAoY2VsbG5hbWUsIGFyZ25hbWUpID09IDApIHsKLQkJCQkJYyA9IFB5Q2VsbF9OZXcoR0VUTE9DQUwoaikpOwotCQkJCQlpZiAoYyA9PSBOVUxMKQotCQkJCQkJZ290byBmYWlsOwotCQkJCQlHRVRMT0NBTChjby0+Y29fbmxvY2FscyArIGkpID0gYzsKLQkJCQkJZm91bmQgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZm91bmQgPT0gMCkgewotCQkJCWMgPSBQeUNlbGxfTmV3KE5VTEwpOwotCQkJCWlmIChjID09IE5VTEwpCi0JCQkJCWdvdG8gZmFpbDsKLQkJCQlTRVRMT0NBTChjby0+Y29fbmxvY2FscyArIGksIGMpOwotCQkJfQotCQl9Ci0JfQotCWlmIChQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19mcmVldmFycykpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19mcmVldmFycyk7ICsraSkgewotCQkJUHlPYmplY3QgKm8gPSBQeVR1cGxlX0dFVF9JVEVNKGNsb3N1cmUsIGkpOwotCQkJUHlfSU5DUkVGKG8pOwotCQkJZnJlZXZhcnNbUHlUdXBsZV9HRVRfU0laRShjby0+Y29fY2VsbHZhcnMpICsgaV0gPSBvOwotCQl9Ci0JfQorICAgICAgICAgICBTaG91bGQgYXJyYW5nZSBmb3IgdGhlIGNvbXBpbGVyIHRvIHB1dCBjZWxsdmFycworICAgICAgICAgICB0aGF0IGFyZSBhcmd1bWVudHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY2VsbHZhcnMKKyAgICAgICAgICAgbGlzdCBzbyB0aGF0IHdlIGNhbiBtYXJjaCBvdmVyIGl0IG1vcmUgZWZmaWNpZW50bHk/CisgICAgICAgICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycyk7ICsraSkgeworICAgICAgICAgICAgY2VsbG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoCisgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fY2VsbHZhcnMsIGkpKTsKKyAgICAgICAgICAgIGZvdW5kID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuYXJnczsgaisrKSB7CisgICAgICAgICAgICAgICAgYXJnbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORygKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fdmFybmFtZXMsIGopKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGNlbGxuYW1lLCBhcmduYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBQeUNlbGxfTmV3KEdFVExPQ0FMKGopKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgR0VUTE9DQUwoY28tPmNvX25sb2NhbHMgKyBpKSA9IGM7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvdW5kID09IDApIHsKKyAgICAgICAgICAgICAgICBjID0gUHlDZWxsX05ldyhOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgU0VUTE9DQUwoY28tPmNvX25sb2NhbHMgKyBpLCBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShjby0+Y29fZnJlZXZhcnMpOyArK2kpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpvID0gUHlUdXBsZV9HRVRfSVRFTShjbG9zdXJlLCBpKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgICAgIGZyZWV2YXJzW1B5VHVwbGVfR0VUX1NJWkUoY28tPmNvX2NlbGx2YXJzKSArIGldID0gbzsKKyAgICAgICAgfQorICAgIH0KIAotCWlmIChjby0+Y29fZmxhZ3MgJiBDT19HRU5FUkFUT1IpIHsKLQkJLyogRG9uJ3QgbmVlZCB0byBrZWVwIHRoZSByZWZlcmVuY2UgdG8gZl9iYWNrLCBpdCB3aWxsIGJlIHNldAotCQkgKiB3aGVuIHRoZSBnZW5lcmF0b3IgaXMgcmVzdW1lZC4gKi8KLQkJUHlfWERFQ1JFRihmLT5mX2JhY2spOwotCQlmLT5mX2JhY2sgPSBOVUxMOworICAgIGlmIChjby0+Y29fZmxhZ3MgJiBDT19HRU5FUkFUT1IpIHsKKyAgICAgICAgLyogRG9uJ3QgbmVlZCB0byBrZWVwIHRoZSByZWZlcmVuY2UgdG8gZl9iYWNrLCBpdCB3aWxsIGJlIHNldAorICAgICAgICAgKiB3aGVuIHRoZSBnZW5lcmF0b3IgaXMgcmVzdW1lZC4gKi8KKyAgICAgICAgUHlfWERFQ1JFRihmLT5mX2JhY2spOworICAgICAgICBmLT5mX2JhY2sgPSBOVUxMOwogCi0JCVBDQUxMKFBDQUxMX0dFTkVSQVRPUik7CisgICAgICAgIFBDQUxMKFBDQUxMX0dFTkVSQVRPUik7CiAKLQkJLyogQ3JlYXRlIGEgbmV3IGdlbmVyYXRvciB0aGF0IG93bnMgdGhlIHJlYWR5IHRvIHJ1biBmcmFtZQotCQkgKiBhbmQgcmV0dXJuIHRoYXQgYXMgdGhlIHZhbHVlLiAqLwotCQlyZXR1cm4gUHlHZW5fTmV3KGYpOwotCX0KKyAgICAgICAgLyogQ3JlYXRlIGEgbmV3IGdlbmVyYXRvciB0aGF0IG93bnMgdGhlIHJlYWR5IHRvIHJ1biBmcmFtZQorICAgICAgICAgKiBhbmQgcmV0dXJuIHRoYXQgYXMgdGhlIHZhbHVlLiAqLworICAgICAgICByZXR1cm4gUHlHZW5fTmV3KGYpOworICAgIH0KIAotCXJldHZhbCA9IFB5RXZhbF9FdmFsRnJhbWVFeChmLDApOworICAgIHJldHZhbCA9IFB5RXZhbF9FdmFsRnJhbWVFeChmLDApOwogCiBmYWlsOiAvKiBKdW1wIGhlcmUgZnJvbSBwcmVsdWRlIG9uIGZhaWx1cmUgKi8KIAotCS8qIGRlY3JlZidpbmcgdGhlIGZyYW1lIGNhbiBjYXVzZSBfX2RlbF9fIG1ldGhvZHMgdG8gZ2V0IGludm9rZWQsCi0JICAgd2hpY2ggY2FuIGNhbGwgYmFjayBpbnRvIFB5dGhvbi4gIFdoaWxlIHdlJ3JlIGRvbmUgd2l0aCB0aGUKLQkgICBjdXJyZW50IFB5dGhvbiBmcmFtZSAoZiksIHRoZSBhc3NvY2lhdGVkIEMgc3RhY2sgaXMgc3RpbGwgaW4gdXNlLAotCSAgIHNvIHJlY3Vyc2lvbl9kZXB0aCBtdXN0IGJlIGJvb3N0ZWQgZm9yIHRoZSBkdXJhdGlvbi4KLQkqLwotCWFzc2VydCh0c3RhdGUgIT0gTlVMTCk7Ci0JKyt0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKLQlQeV9ERUNSRUYoZik7Ci0JLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKLQlyZXR1cm4gcmV0dmFsOworICAgIC8qIGRlY3JlZidpbmcgdGhlIGZyYW1lIGNhbiBjYXVzZSBfX2RlbF9fIG1ldGhvZHMgdG8gZ2V0IGludm9rZWQsCisgICAgICAgd2hpY2ggY2FuIGNhbGwgYmFjayBpbnRvIFB5dGhvbi4gIFdoaWxlIHdlJ3JlIGRvbmUgd2l0aCB0aGUKKyAgICAgICBjdXJyZW50IFB5dGhvbiBmcmFtZSAoZiksIHRoZSBhc3NvY2lhdGVkIEMgc3RhY2sgaXMgc3RpbGwgaW4gdXNlLAorICAgICAgIHNvIHJlY3Vyc2lvbl9kZXB0aCBtdXN0IGJlIGJvb3N0ZWQgZm9yIHRoZSBkdXJhdGlvbi4KKyAgICAqLworICAgIGFzc2VydCh0c3RhdGUgIT0gTlVMTCk7CisgICAgKyt0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKKyAgICBQeV9ERUNSRUYoZik7CisgICAgLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBrd2RfYXNfc3RyaW5nKFB5T2JqZWN0ICprd2QpIHsKLQlpZiAoUHlTdHJpbmdfQ2hlY2soa3dkKSkgewotCQlQeV9JTkNSRUYoa3dkKTsKLQkJcmV0dXJuIGt3ZDsKLQl9Ci0JZWxzZQotCQlyZXR1cm4gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKGt3ZCwgInJlcGxhY2UiKTsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soa3dkKSkgeworICAgICAgICBQeV9JTkNSRUYoa3dkKTsKKyAgICAgICAgcmV0dXJuIGt3ZDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKGt3ZCwgInJlcGxhY2UiKTsKIH0KIAogCkBAIC0zMDQ4LDEwICszMDQ4LDEwIEBACiAgIHRoaXM6CiAKICAgICAgdHJ5OgotCSJzb21ldGhpbmcgdGhhdCBtYXkgZmFpbCIKKyAgICAic29tZXRoaW5nIHRoYXQgbWF5IGZhaWwiCiAgICAgIGV4Y2VwdCAic29tZSBleGNlcHRpb24iOgotCSJkbyBzb21ldGhpbmcgZWxzZSBmaXJzdCIKLQkicHJpbnQgdGhlIGV4Y2VwdGlvbiBmcm9tIHN5cy5leGNfWlpaLiIKKyAgICAiZG8gc29tZXRoaW5nIGVsc2UgZmlyc3QiCisgICAgInByaW50IHRoZSBleGNlcHRpb24gZnJvbSBzeXMuZXhjX1paWi4iCiAKICAgaWYgImRvIHNvbWV0aGluZyBlbHNlIGZpcnN0IiBpbnZva2VkIHNvbWV0aGluZyB0aGF0IHJhaXNlZCBhbmQgY2F1Z2h0CiAgIGFuIGV4Y2VwdGlvbiwgc3lzLmV4Y19aWlogd2VyZSBvdmVyd3JpdHRlbi4gIFRoYXQgd2FzIGEgZnJlcXVlbnQKQEAgLTMwODksOTIgKzMwODksOTIgQEAKIAogc3RhdGljIHZvaWQKIHNldF9leGNfaW5mbyhQeVRocmVhZFN0YXRlICp0c3RhdGUsCi0JICAgICBQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdGIpCisgICAgICAgICAgICAgUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSwgUHlPYmplY3QgKnRiKQogewotCVB5RnJhbWVPYmplY3QgKmZyYW1lID0gdHN0YXRlLT5mcmFtZTsKLQlQeU9iamVjdCAqdG1wX3R5cGUsICp0bXBfdmFsdWUsICp0bXBfdGI7CisgICAgUHlGcmFtZU9iamVjdCAqZnJhbWUgPSB0c3RhdGUtPmZyYW1lOworICAgIFB5T2JqZWN0ICp0bXBfdHlwZSwgKnRtcF92YWx1ZSwgKnRtcF90YjsKIAotCWFzc2VydCh0eXBlICE9IE5VTEwpOwotCWFzc2VydChmcmFtZSAhPSBOVUxMKTsKLQlpZiAoZnJhbWUtPmZfZXhjX3R5cGUgPT0gTlVMTCkgewotCQlhc3NlcnQoZnJhbWUtPmZfZXhjX3ZhbHVlID09IE5VTEwpOwotCQlhc3NlcnQoZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9PSBOVUxMKTsKLQkJLyogVGhpcyBmcmFtZSBkaWRuJ3QgY2F0Y2ggYW4gZXhjZXB0aW9uIGJlZm9yZS4gKi8KLQkJLyogU2F2ZSBwcmV2aW91cyBleGNlcHRpb24gb2YgdGhpcyB0aHJlYWQgaW4gdGhpcyBmcmFtZS4gKi8KLQkJaWYgKHRzdGF0ZS0+ZXhjX3R5cGUgPT0gTlVMTCkgewotCQkJLyogWFhYIFdoeSBpcyB0aGlzIHNldCB0byBQeV9Ob25lPyAqLwotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJdHN0YXRlLT5leGNfdHlwZSA9IFB5X05vbmU7Ci0JCX0KLQkJUHlfSU5DUkVGKHRzdGF0ZS0+ZXhjX3R5cGUpOwotCQlQeV9YSU5DUkVGKHRzdGF0ZS0+ZXhjX3ZhbHVlKTsKLQkJUHlfWElOQ1JFRih0c3RhdGUtPmV4Y190cmFjZWJhY2spOwotCQlmcmFtZS0+Zl9leGNfdHlwZSA9IHRzdGF0ZS0+ZXhjX3R5cGU7Ci0JCWZyYW1lLT5mX2V4Y192YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOwotCQlmcmFtZS0+Zl9leGNfdHJhY2ViYWNrID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOwotCX0KLQkvKiBTZXQgbmV3IGV4Y2VwdGlvbiBmb3IgdGhpcyB0aHJlYWQuICovCi0JdG1wX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOwotCXRtcF92YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOwotCXRtcF90YiA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKLQlQeV9JTkNSRUYodHlwZSk7Ci0JUHlfWElOQ1JFRih2YWx1ZSk7Ci0JUHlfWElOQ1JFRih0Yik7Ci0JdHN0YXRlLT5leGNfdHlwZSA9IHR5cGU7Ci0JdHN0YXRlLT5leGNfdmFsdWUgPSB2YWx1ZTsKLQl0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSB0YjsKLQlQeV9YREVDUkVGKHRtcF90eXBlKTsKLQlQeV9YREVDUkVGKHRtcF92YWx1ZSk7Ci0JUHlfWERFQ1JFRih0bXBfdGIpOwotCS8qIEZvciBiL3cgY29tcGF0aWJpbGl0eSAqLwotCVB5U3lzX1NldE9iamVjdCgiZXhjX3R5cGUiLCB0eXBlKTsKLQlQeVN5c19TZXRPYmplY3QoImV4Y192YWx1ZSIsIHZhbHVlKTsKLQlQeVN5c19TZXRPYmplY3QoImV4Y190cmFjZWJhY2siLCB0Yik7CisgICAgYXNzZXJ0KHR5cGUgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGZyYW1lICE9IE5VTEwpOworICAgIGlmIChmcmFtZS0+Zl9leGNfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIGFzc2VydChmcmFtZS0+Zl9leGNfdmFsdWUgPT0gTlVMTCk7CisgICAgICAgIGFzc2VydChmcmFtZS0+Zl9leGNfdHJhY2ViYWNrID09IE5VTEwpOworICAgICAgICAvKiBUaGlzIGZyYW1lIGRpZG4ndCBjYXRjaCBhbiBleGNlcHRpb24gYmVmb3JlLiAqLworICAgICAgICAvKiBTYXZlIHByZXZpb3VzIGV4Y2VwdGlvbiBvZiB0aGlzIHRocmVhZCBpbiB0aGlzIGZyYW1lLiAqLworICAgICAgICBpZiAodHN0YXRlLT5leGNfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBYWFggV2h5IGlzIHRoaXMgc2V0IHRvIFB5X05vbmU/ICovCisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICB0c3RhdGUtPmV4Y190eXBlID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYodHN0YXRlLT5leGNfdHlwZSk7CisgICAgICAgIFB5X1hJTkNSRUYodHN0YXRlLT5leGNfdmFsdWUpOworICAgICAgICBQeV9YSU5DUkVGKHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayk7CisgICAgICAgIGZyYW1lLT5mX2V4Y190eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKKyAgICAgICAgZnJhbWUtPmZfZXhjX3ZhbHVlID0gdHN0YXRlLT5leGNfdmFsdWU7CisgICAgICAgIGZyYW1lLT5mX2V4Y190cmFjZWJhY2sgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7CisgICAgfQorICAgIC8qIFNldCBuZXcgZXhjZXB0aW9uIGZvciB0aGlzIHRocmVhZC4gKi8KKyAgICB0bXBfdHlwZSA9IHRzdGF0ZS0+ZXhjX3R5cGU7CisgICAgdG1wX3ZhbHVlID0gdHN0YXRlLT5leGNfdmFsdWU7CisgICAgdG1wX3RiID0gdHN0YXRlLT5leGNfdHJhY2ViYWNrOworICAgIFB5X0lOQ1JFRih0eXBlKTsKKyAgICBQeV9YSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9YSU5DUkVGKHRiKTsKKyAgICB0c3RhdGUtPmV4Y190eXBlID0gdHlwZTsKKyAgICB0c3RhdGUtPmV4Y192YWx1ZSA9IHZhbHVlOworICAgIHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayA9IHRiOworICAgIFB5X1hERUNSRUYodG1wX3R5cGUpOworICAgIFB5X1hERUNSRUYodG1wX3ZhbHVlKTsKKyAgICBQeV9YREVDUkVGKHRtcF90Yik7CisgICAgLyogRm9yIGIvdyBjb21wYXRpYmlsaXR5ICovCisgICAgUHlTeXNfU2V0T2JqZWN0KCJleGNfdHlwZSIsIHR5cGUpOworICAgIFB5U3lzX1NldE9iamVjdCgiZXhjX3ZhbHVlIiwgdmFsdWUpOworICAgIFB5U3lzX1NldE9iamVjdCgiZXhjX3RyYWNlYmFjayIsIHRiKTsKIH0KIAogc3RhdGljIHZvaWQKIHJlc2V0X2V4Y19pbmZvKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIHsKLQlQeUZyYW1lT2JqZWN0ICpmcmFtZTsKLQlQeU9iamVjdCAqdG1wX3R5cGUsICp0bXBfdmFsdWUsICp0bXBfdGI7CisgICAgUHlGcmFtZU9iamVjdCAqZnJhbWU7CisgICAgUHlPYmplY3QgKnRtcF90eXBlLCAqdG1wX3ZhbHVlLCAqdG1wX3RiOwogCi0JLyogSXQncyBhIHByZWNvbmRpdGlvbiB0aGF0IHRoZSB0aHJlYWQgc3RhdGUncyBmcmFtZSBjYXVnaHQgYW4KLQkgKiBleGNlcHRpb24gLS0gdmVyaWZ5IGluIGEgZGVidWcgYnVpbGQuCi0JICovCi0JYXNzZXJ0KHRzdGF0ZSAhPSBOVUxMKTsKLQlmcmFtZSA9IHRzdGF0ZS0+ZnJhbWU7Ci0JYXNzZXJ0KGZyYW1lICE9IE5VTEwpOwotCWFzc2VydChmcmFtZS0+Zl9leGNfdHlwZSAhPSBOVUxMKTsKKyAgICAvKiBJdCdzIGEgcHJlY29uZGl0aW9uIHRoYXQgdGhlIHRocmVhZCBzdGF0ZSdzIGZyYW1lIGNhdWdodCBhbgorICAgICAqIGV4Y2VwdGlvbiAtLSB2ZXJpZnkgaW4gYSBkZWJ1ZyBidWlsZC4KKyAgICAgKi8KKyAgICBhc3NlcnQodHN0YXRlICE9IE5VTEwpOworICAgIGZyYW1lID0gdHN0YXRlLT5mcmFtZTsKKyAgICBhc3NlcnQoZnJhbWUgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGZyYW1lLT5mX2V4Y190eXBlICE9IE5VTEwpOwogCi0JLyogQ29weSB0aGUgZnJhbWUncyBleGNlcHRpb24gaW5mbyBiYWNrIHRvIHRoZSB0aHJlYWQgc3RhdGUuICovCi0JdG1wX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOwotCXRtcF92YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOwotCXRtcF90YiA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKLQlQeV9JTkNSRUYoZnJhbWUtPmZfZXhjX3R5cGUpOwotCVB5X1hJTkNSRUYoZnJhbWUtPmZfZXhjX3ZhbHVlKTsKLQlQeV9YSU5DUkVGKGZyYW1lLT5mX2V4Y190cmFjZWJhY2spOwotCXRzdGF0ZS0+ZXhjX3R5cGUgPSBmcmFtZS0+Zl9leGNfdHlwZTsKLQl0c3RhdGUtPmV4Y192YWx1ZSA9IGZyYW1lLT5mX2V4Y192YWx1ZTsKLQl0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrOwotCVB5X1hERUNSRUYodG1wX3R5cGUpOwotCVB5X1hERUNSRUYodG1wX3ZhbHVlKTsKLQlQeV9YREVDUkVGKHRtcF90Yik7CisgICAgLyogQ29weSB0aGUgZnJhbWUncyBleGNlcHRpb24gaW5mbyBiYWNrIHRvIHRoZSB0aHJlYWQgc3RhdGUuICovCisgICAgdG1wX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOworICAgIHRtcF92YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOworICAgIHRtcF90YiA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKKyAgICBQeV9JTkNSRUYoZnJhbWUtPmZfZXhjX3R5cGUpOworICAgIFB5X1hJTkNSRUYoZnJhbWUtPmZfZXhjX3ZhbHVlKTsKKyAgICBQeV9YSU5DUkVGKGZyYW1lLT5mX2V4Y190cmFjZWJhY2spOworICAgIHRzdGF0ZS0+ZXhjX3R5cGUgPSBmcmFtZS0+Zl9leGNfdHlwZTsKKyAgICB0c3RhdGUtPmV4Y192YWx1ZSA9IGZyYW1lLT5mX2V4Y192YWx1ZTsKKyAgICB0c3RhdGUtPmV4Y190cmFjZWJhY2sgPSBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrOworICAgIFB5X1hERUNSRUYodG1wX3R5cGUpOworICAgIFB5X1hERUNSRUYodG1wX3ZhbHVlKTsKKyAgICBQeV9YREVDUkVGKHRtcF90Yik7CiAKLQkvKiBGb3IgYi93IGNvbXBhdGliaWxpdHkgKi8KLQlQeVN5c19TZXRPYmplY3QoImV4Y190eXBlIiwgZnJhbWUtPmZfZXhjX3R5cGUpOwotCVB5U3lzX1NldE9iamVjdCgiZXhjX3ZhbHVlIiwgZnJhbWUtPmZfZXhjX3ZhbHVlKTsKLQlQeVN5c19TZXRPYmplY3QoImV4Y190cmFjZWJhY2siLCBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrKTsKKyAgICAvKiBGb3IgYi93IGNvbXBhdGliaWxpdHkgKi8KKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y190eXBlIiwgZnJhbWUtPmZfZXhjX3R5cGUpOworICAgIFB5U3lzX1NldE9iamVjdCgiZXhjX3ZhbHVlIiwgZnJhbWUtPmZfZXhjX3ZhbHVlKTsKKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y190cmFjZWJhY2siLCBmcmFtZS0+Zl9leGNfdHJhY2ViYWNrKTsKIAotCS8qIENsZWFyIHRoZSBmcmFtZSdzIGV4Y2VwdGlvbiBpbmZvLiAqLwotCXRtcF90eXBlID0gZnJhbWUtPmZfZXhjX3R5cGU7Ci0JdG1wX3ZhbHVlID0gZnJhbWUtPmZfZXhjX3ZhbHVlOwotCXRtcF90YiA9IGZyYW1lLT5mX2V4Y190cmFjZWJhY2s7Ci0JZnJhbWUtPmZfZXhjX3R5cGUgPSBOVUxMOwotCWZyYW1lLT5mX2V4Y192YWx1ZSA9IE5VTEw7Ci0JZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9IE5VTEw7Ci0JUHlfREVDUkVGKHRtcF90eXBlKTsKLQlQeV9YREVDUkVGKHRtcF92YWx1ZSk7Ci0JUHlfWERFQ1JFRih0bXBfdGIpOworICAgIC8qIENsZWFyIHRoZSBmcmFtZSdzIGV4Y2VwdGlvbiBpbmZvLiAqLworICAgIHRtcF90eXBlID0gZnJhbWUtPmZfZXhjX3R5cGU7CisgICAgdG1wX3ZhbHVlID0gZnJhbWUtPmZfZXhjX3ZhbHVlOworICAgIHRtcF90YiA9IGZyYW1lLT5mX2V4Y190cmFjZWJhY2s7CisgICAgZnJhbWUtPmZfZXhjX3R5cGUgPSBOVUxMOworICAgIGZyYW1lLT5mX2V4Y192YWx1ZSA9IE5VTEw7CisgICAgZnJhbWUtPmZfZXhjX3RyYWNlYmFjayA9IE5VTEw7CisgICAgUHlfREVDUkVGKHRtcF90eXBlKTsKKyAgICBQeV9YREVDUkVGKHRtcF92YWx1ZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdGIpOwogfQogCiAvKiBMb2dpYyBmb3IgdGhlIHJhaXNlIHN0YXRlbWVudCAodG9vIGNvbXBsaWNhdGVkIGZvciBpbmxpbmluZykuCkBAIC0zMTgyLDEwOCArMzE4MiwxMDggQEAKIHN0YXRpYyBlbnVtIHdoeV9jb2RlCiBkb19yYWlzZShQeU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdGIpCiB7Ci0JaWYgKHR5cGUgPT0gTlVMTCkgewotCQkvKiBSZXJhaXNlICovCi0JCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JCXR5cGUgPSB0c3RhdGUtPmV4Y190eXBlID09IE5VTEwgPyBQeV9Ob25lIDogdHN0YXRlLT5leGNfdHlwZTsKLQkJdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKLQkJdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7Ci0JCVB5X1hJTkNSRUYodHlwZSk7Ci0JCVB5X1hJTkNSRUYodmFsdWUpOwotCQlQeV9YSU5DUkVGKHRiKTsKLQl9CisgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgICAvKiBSZXJhaXNlICovCisgICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgICAgIHR5cGUgPSB0c3RhdGUtPmV4Y190eXBlID09IE5VTEwgPyBQeV9Ob25lIDogdHN0YXRlLT5leGNfdHlwZTsKKyAgICAgICAgdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKKyAgICAgICAgdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7CisgICAgICAgIFB5X1hJTkNSRUYodHlwZSk7CisgICAgICAgIFB5X1hJTkNSRUYodmFsdWUpOworICAgICAgICBQeV9YSU5DUkVGKHRiKTsKKyAgICB9CiAKLQkvKiBXZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgZm9ybXMgb2YgcmFpc2U6Ci0JICAgcmFpc2UgPGNsYXNzPiwgPGNsYXNzaW5zdGFuY2U+Ci0JICAgcmFpc2UgPGNsYXNzPiwgPGFyZ3VtZW50IHR1cGxlPgotCSAgIHJhaXNlIDxjbGFzcz4sIE5vbmUKLQkgICByYWlzZSA8Y2xhc3M+LCA8YXJndW1lbnQ+Ci0JICAgcmFpc2UgPGNsYXNzaW5zdGFuY2U+LCBOb25lCi0JICAgcmFpc2UgPHN0cmluZz4sIDxvYmplY3Q+Ci0JICAgcmFpc2UgPHN0cmluZz4sIE5vbmUKKyAgICAvKiBXZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgZm9ybXMgb2YgcmFpc2U6CisgICAgICAgcmFpc2UgPGNsYXNzPiwgPGNsYXNzaW5zdGFuY2U+CisgICAgICAgcmFpc2UgPGNsYXNzPiwgPGFyZ3VtZW50IHR1cGxlPgorICAgICAgIHJhaXNlIDxjbGFzcz4sIE5vbmUKKyAgICAgICByYWlzZSA8Y2xhc3M+LCA8YXJndW1lbnQ+CisgICAgICAgcmFpc2UgPGNsYXNzaW5zdGFuY2U+LCBOb25lCisgICAgICAgcmFpc2UgPHN0cmluZz4sIDxvYmplY3Q+CisgICAgICAgcmFpc2UgPHN0cmluZz4sIE5vbmUKIAotCSAgIEFuIG9taXR0ZWQgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBzYW1lIGFzIE5vbmUuCisgICAgICAgQW4gb21pdHRlZCBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHNhbWUgYXMgTm9uZS4KIAotCSAgIEluIGFkZGl0aW9uLCByYWlzZSA8dHVwbGU+LCA8YW55dGhpbmc+IGlzIHRoZSBzYW1lIGFzCi0JICAgcmFpc2luZyB0aGUgdHVwbGUncyBmaXJzdCBpdGVtIChhbmQgaXQgYmV0dGVyIGhhdmUgb25lISk7Ci0JICAgdGhpcyBydWxlIGlzIGFwcGxpZWQgcmVjdXJzaXZlbHkuCisgICAgICAgSW4gYWRkaXRpb24sIHJhaXNlIDx0dXBsZT4sIDxhbnl0aGluZz4gaXMgdGhlIHNhbWUgYXMKKyAgICAgICByYWlzaW5nIHRoZSB0dXBsZSdzIGZpcnN0IGl0ZW0gKGFuZCBpdCBiZXR0ZXIgaGF2ZSBvbmUhKTsKKyAgICAgICB0aGlzIHJ1bGUgaXMgYXBwbGllZCByZWN1cnNpdmVseS4KIAotCSAgIEZpbmFsbHksIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IGNhbiBiZSBzdXBwbGllZCwgd2hpY2gKLQkgICBnaXZlcyB0aGUgdHJhY2ViYWNrIHRvIGJlIHN1YnN0aXR1dGVkICh1c2VmdWwgd2hlbgotCSAgIHJlLXJhaXNpbmcgYW4gZXhjZXB0aW9uIGFmdGVyIGV4YW1pbmluZyBpdCkuICAqLworICAgICAgIEZpbmFsbHksIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IGNhbiBiZSBzdXBwbGllZCwgd2hpY2gKKyAgICAgICBnaXZlcyB0aGUgdHJhY2ViYWNrIHRvIGJlIHN1YnN0aXR1dGVkICh1c2VmdWwgd2hlbgorICAgICAgIHJlLXJhaXNpbmcgYW4gZXhjZXB0aW9uIGFmdGVyIGV4YW1pbmluZyBpdCkuICAqLwogCi0JLyogRmlyc3QsIGNoZWNrIHRoZSB0cmFjZWJhY2sgYXJndW1lbnQsIHJlcGxhY2luZyBOb25lIHdpdGgKLQkgICBOVUxMLiAqLwotCWlmICh0YiA9PSBQeV9Ob25lKSB7Ci0JCVB5X0RFQ1JFRih0Yik7Ci0JCXRiID0gTlVMTDsKLQl9Ci0JZWxzZSBpZiAodGIgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sodGIpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAicmFpc2U6IGFyZyAzIG11c3QgYmUgYSB0cmFjZWJhY2sgb3IgTm9uZSIpOwotCQlnb3RvIHJhaXNlX2Vycm9yOwotCX0KKyAgICAvKiBGaXJzdCwgY2hlY2sgdGhlIHRyYWNlYmFjayBhcmd1bWVudCwgcmVwbGFjaW5nIE5vbmUgd2l0aAorICAgICAgIE5VTEwuICovCisgICAgaWYgKHRiID09IFB5X05vbmUpIHsKKyAgICAgICAgUHlfREVDUkVGKHRiKTsKKyAgICAgICAgdGIgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIGlmICh0YiAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayh0YikpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAicmFpc2U6IGFyZyAzIG11c3QgYmUgYSB0cmFjZWJhY2sgb3IgTm9uZSIpOworICAgICAgICBnb3RvIHJhaXNlX2Vycm9yOworICAgIH0KIAotCS8qIE5leHQsIHJlcGxhY2UgYSBtaXNzaW5nIHZhbHVlIHdpdGggTm9uZSAqLwotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCXZhbHVlID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQl9CisgICAgLyogTmV4dCwgcmVwbGFjZSBhIG1pc3NpbmcgdmFsdWUgd2l0aCBOb25lICovCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgdmFsdWUgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIH0KIAotCS8qIE5leHQsIHJlcGVhdGVkbHksIHJlcGxhY2UgYSB0dXBsZSBleGNlcHRpb24gd2l0aCBpdHMgZmlyc3QgaXRlbSAqLwotCXdoaWxlIChQeVR1cGxlX0NoZWNrKHR5cGUpICYmIFB5VHVwbGVfU2l6ZSh0eXBlKSA+IDApIHsKLQkJUHlPYmplY3QgKnRtcCA9IHR5cGU7Ci0JCXR5cGUgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGUsIDApOwotCQlQeV9JTkNSRUYodHlwZSk7Ci0JCVB5X0RFQ1JFRih0bXApOwotCX0KKyAgICAvKiBOZXh0LCByZXBlYXRlZGx5LCByZXBsYWNlIGEgdHVwbGUgZXhjZXB0aW9uIHdpdGggaXRzIGZpcnN0IGl0ZW0gKi8KKyAgICB3aGlsZSAoUHlUdXBsZV9DaGVjayh0eXBlKSAmJiBQeVR1cGxlX1NpemUodHlwZSkgPiAwKSB7CisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSB0eXBlOworICAgICAgICB0eXBlID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlLCAwKTsKKyAgICAgICAgUHlfSU5DUkVGKHR5cGUpOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICB9CiAKLQlpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0eXBlKSkKLQkJUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZ0eXBlLCAmdmFsdWUsICZ0Yik7CisgICAgaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwZSkpCisgICAgICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmdHlwZSwgJnZhbHVlLCAmdGIpOwogCi0JZWxzZSBpZiAoUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh0eXBlKSkgewotCQkvKiBSYWlzaW5nIGFuIGluc3RhbmNlLiAgVGhlIHZhbHVlIHNob3VsZCBiZSBhIGR1bW15LiAqLwotCQlpZiAodmFsdWUgIT0gUHlfTm9uZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgImluc3RhbmNlIGV4Y2VwdGlvbiBtYXkgbm90IGhhdmUgYSBzZXBhcmF0ZSB2YWx1ZSIpOwotCQkJZ290byByYWlzZV9lcnJvcjsKLQkJfQotCQllbHNlIHsKLQkJCS8qIE5vcm1hbGl6ZSB0byByYWlzZSA8Y2xhc3M+LCA8aW5zdGFuY2U+ICovCi0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJdmFsdWUgPSB0eXBlOwotCQkJdHlwZSA9IFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3ModHlwZSk7Ci0JCQlQeV9JTkNSRUYodHlwZSk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8qIE5vdCBzb21ldGhpbmcgeW91IGNhbiByYWlzZS4gIFlvdSBnZXQgYW4gZXhjZXB0aW9uCi0JCSAgIGFueXdheSwganVzdCBub3Qgd2hhdCB5b3Ugc3BlY2lmaWVkIDotKSAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICAiZXhjZXB0aW9ucyBtdXN0IGJlIG9sZC1zdHlsZSBjbGFzc2VzIG9yICIKLQkJCSAgICAgImRlcml2ZWQgZnJvbSBCYXNlRXhjZXB0aW9uLCBub3QgJXMiLAotCQkJICAgICB0eXBlLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJZ290byByYWlzZV9lcnJvcjsKLQl9CisgICAgZWxzZSBpZiAoUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh0eXBlKSkgeworICAgICAgICAvKiBSYWlzaW5nIGFuIGluc3RhbmNlLiAgVGhlIHZhbHVlIHNob3VsZCBiZSBhIGR1bW15LiAqLworICAgICAgICBpZiAodmFsdWUgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgImluc3RhbmNlIGV4Y2VwdGlvbiBtYXkgbm90IGhhdmUgYSBzZXBhcmF0ZSB2YWx1ZSIpOworICAgICAgICAgICAgZ290byByYWlzZV9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vcm1hbGl6ZSB0byByYWlzZSA8Y2xhc3M+LCA8aW5zdGFuY2U+ICovCisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgdmFsdWUgPSB0eXBlOworICAgICAgICAgICAgdHlwZSA9IFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3ModHlwZSk7CisgICAgICAgICAgICBQeV9JTkNSRUYodHlwZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIE5vdCBzb21ldGhpbmcgeW91IGNhbiByYWlzZS4gIFlvdSBnZXQgYW4gZXhjZXB0aW9uCisgICAgICAgICAgIGFueXdheSwganVzdCBub3Qgd2hhdCB5b3Ugc3BlY2lmaWVkIDotKSAqLworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnMgbXVzdCBiZSBvbGQtc3R5bGUgY2xhc3NlcyBvciAiCisgICAgICAgICAgICAgICAgICAgICAiZGVyaXZlZCBmcm9tIEJhc2VFeGNlcHRpb24sIG5vdCAlcyIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgZ290byByYWlzZV9lcnJvcjsKKyAgICB9CiAKLQlhc3NlcnQoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0eXBlKSk7Ci0JaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAmJiBQeUNsYXNzX0NoZWNrKHR5cGUpKSB7Ci0JCWlmIChQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCSJleGNlcHRpb25zIG11c3QgZGVyaXZlIGZyb20gQmFzZUV4Y2VwdGlvbiAiCi0JCQkJImluIDMueCIsIDEpIDwgMCkKLQkJCWdvdG8gcmFpc2VfZXJyb3I7Ci0JfQorICAgIGFzc2VydChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHR5cGUpKTsKKyAgICBpZiAoUHlfUHkza1dhcm5pbmdGbGFnICYmIFB5Q2xhc3NfQ2hlY2sodHlwZSkpIHsKKyAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9ucyBtdXN0IGRlcml2ZSBmcm9tIEJhc2VFeGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgImluIDMueCIsIDEpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gcmFpc2VfZXJyb3I7CisgICAgfQogCi0JUHlFcnJfUmVzdG9yZSh0eXBlLCB2YWx1ZSwgdGIpOwotCWlmICh0YiA9PSBOVUxMKQotCQlyZXR1cm4gV0hZX0VYQ0VQVElPTjsKLQllbHNlCi0JCXJldHVybiBXSFlfUkVSQUlTRTsKKyAgICBQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0Yik7CisgICAgaWYgKHRiID09IE5VTEwpCisgICAgICAgIHJldHVybiBXSFlfRVhDRVBUSU9OOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFdIWV9SRVJBSVNFOwogIHJhaXNlX2Vycm9yOgotCVB5X1hERUNSRUYodmFsdWUpOwotCVB5X1hERUNSRUYodHlwZSk7Ci0JUHlfWERFQ1JFRih0Yik7Ci0JcmV0dXJuIFdIWV9FWENFUFRJT047CisgICAgUHlfWERFQ1JFRih2YWx1ZSk7CisgICAgUHlfWERFQ1JFRih0eXBlKTsKKyAgICBQeV9YREVDUkVGKHRiKTsKKyAgICByZXR1cm4gV0hZX0VYQ0VQVElPTjsKIH0KIAogLyogSXRlcmF0ZSB2IGFyZ2NudCB0aW1lcyBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgb24gdGhlIHN0YWNrICh2aWEgZGVjcmVhc2luZwpAQCAtMzI5Miw0NiArMzI5Miw0NiBAQAogc3RhdGljIGludAogdW5wYWNrX2l0ZXJhYmxlKFB5T2JqZWN0ICp2LCBpbnQgYXJnY250LCBQeU9iamVjdCAqKnNwKQogewotCWludCBpID0gMDsKLQlQeU9iamVjdCAqaXQ7ICAvKiBpdGVyKHYpICovCi0JUHlPYmplY3QgKnc7CisgICAgaW50IGkgPSAwOworICAgIFB5T2JqZWN0ICppdDsgIC8qIGl0ZXIodikgKi8KKyAgICBQeU9iamVjdCAqdzsKIAotCWFzc2VydCh2ICE9IE5VTEwpOworICAgIGFzc2VydCh2ICE9IE5VTEwpOwogCi0JaXQgPSBQeU9iamVjdF9HZXRJdGVyKHYpOwotCWlmIChpdCA9PSBOVUxMKQotCQlnb3RvIEVycm9yOworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih2KTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgZ290byBFcnJvcjsKIAotCWZvciAoOyBpIDwgYXJnY250OyBpKyspIHsKLQkJdyA9IFB5SXRlcl9OZXh0KGl0KTsKLQkJaWYgKHcgPT0gTlVMTCkgewotCQkJLyogSXRlcmF0b3IgZG9uZSwgdmlhIGVycm9yIG9yIGV4aGF1c3Rpb24uICovCi0JCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJIm5lZWQgbW9yZSB0aGFuICVkIHZhbHVlJXMgdG8gdW5wYWNrIiwKLQkJCQkJaSwgaSA9PSAxID8gIiIgOiAicyIpOwotCQkJfQotCQkJZ290byBFcnJvcjsKLQkJfQotCQkqLS1zcCA9IHc7Ci0JfQorICAgIGZvciAoOyBpIDwgYXJnY250OyBpKyspIHsKKyAgICAgICAgdyA9IFB5SXRlcl9OZXh0KGl0KTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogSXRlcmF0b3IgZG9uZSwgdmlhIGVycm9yIG9yIGV4aGF1c3Rpb24uICovCisgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIm5lZWQgbW9yZSB0aGFuICVkIHZhbHVlJXMgdG8gdW5wYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgaSA9PSAxID8gIiIgOiAicyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgfQorICAgICAgICAqLS1zcCA9IHc7CisgICAgfQogCi0JLyogV2UgYmV0dGVyIGhhdmUgZXhoYXVzdGVkIHRoZSBpdGVyYXRvciBub3cuICovCi0JdyA9IFB5SXRlcl9OZXh0KGl0KTsKLQlpZiAodyA9PSBOVUxMKSB7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJZ290byBFcnJvcjsKLQkJUHlfREVDUkVGKGl0KTsKLQkJcmV0dXJuIDE7Ci0JfQotCVB5X0RFQ1JFRih3KTsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInRvbyBtYW55IHZhbHVlcyB0byB1bnBhY2siKTsKLQkvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAvKiBXZSBiZXR0ZXIgaGF2ZSBleGhhdXN0ZWQgdGhlIGl0ZXJhdG9yIG5vdy4gKi8KKyAgICB3ID0gUHlJdGVyX05leHQoaXQpOworICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgUHlfREVDUkVGKHcpOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjayIpOworICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogRXJyb3I6Ci0JZm9yICg7IGkgPiAwOyBpLS0sIHNwKyspCi0JCVB5X0RFQ1JFRigqc3ApOwotCVB5X1hERUNSRUYoaXQpOwotCXJldHVybiAwOworICAgIGZvciAoOyBpID4gMDsgaS0tLCBzcCsrKQorICAgICAgICBQeV9ERUNSRUYoKnNwKTsKKyAgICBQeV9YREVDUkVGKGl0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0zMzM5LDI0MSArMzMzOSwyNDEgQEAKIHN0YXRpYyBpbnQKIHBydHJhY2UoUHlPYmplY3QgKnYsIGNoYXIgKnN0cikKIHsKLQlwcmludGYoIiVzICIsIHN0cik7Ci0JaWYgKFB5T2JqZWN0X1ByaW50KHYsIHN0ZG91dCwgMCkgIT0gMCkKLQkJUHlFcnJfQ2xlYXIoKTsgLyogRG9uJ3Qga25vdyB3aGF0IGVsc2UgdG8gZG8gKi8KLQlwcmludGYoIlxuIik7Ci0JcmV0dXJuIDE7CisgICAgcHJpbnRmKCIlcyAiLCBzdHIpOworICAgIGlmIChQeU9iamVjdF9QcmludCh2LCBzdGRvdXQsIDApICE9IDApCisgICAgICAgIFB5RXJyX0NsZWFyKCk7IC8qIERvbid0IGtub3cgd2hhdCBlbHNlIHRvIGRvICovCisgICAgcHJpbnRmKCJcbiIpOworICAgIHJldHVybiAxOwogfQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkCiBjYWxsX2V4Y190cmFjZShQeV90cmFjZWZ1bmMgZnVuYywgUHlPYmplY3QgKnNlbGYsIFB5RnJhbWVPYmplY3QgKmYpCiB7Ci0JUHlPYmplY3QgKnR5cGUsICp2YWx1ZSwgKnRyYWNlYmFjaywgKmFyZzsKLQlpbnQgZXJyOwotCVB5RXJyX0ZldGNoKCZ0eXBlLCAmdmFsdWUsICZ0cmFjZWJhY2spOwotCWlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0JCXZhbHVlID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKHZhbHVlKTsKLQl9Ci0JYXJnID0gUHlUdXBsZV9QYWNrKDMsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOwotCWlmIChhcmcgPT0gTlVMTCkgewotCQlQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOwotCQlyZXR1cm47Ci0JfQotCWVyciA9IGNhbGxfdHJhY2UoZnVuYywgc2VsZiwgZiwgUHlUcmFjZV9FWENFUFRJT04sIGFyZyk7Ci0JUHlfREVDUkVGKGFyZyk7Ci0JaWYgKGVyciA9PSAwKQotCQlQeUVycl9SZXN0b3JlKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOwotCWVsc2UgewotCQlQeV9YREVDUkVGKHR5cGUpOwotCQlQeV9YREVDUkVGKHZhbHVlKTsKLQkJUHlfWERFQ1JFRih0cmFjZWJhY2spOwotCX0KKyAgICBQeU9iamVjdCAqdHlwZSwgKnZhbHVlLCAqdHJhY2ViYWNrLCAqYXJnOworICAgIGludCBlcnI7CisgICAgUHlFcnJfRmV0Y2goJnR5cGUsICZ2YWx1ZSwgJnRyYWNlYmFjayk7CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgdmFsdWUgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIH0KKyAgICBhcmcgPSBQeVR1cGxlX1BhY2soMywgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7CisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1Jlc3RvcmUodHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZXJyID0gY2FsbF90cmFjZShmdW5jLCBzZWxmLCBmLCBQeVRyYWNlX0VYQ0VQVElPTiwgYXJnKTsKKyAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICBpZiAoZXJyID09IDApCisgICAgICAgIFB5RXJyX1Jlc3RvcmUodHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7CisgICAgZWxzZSB7CisgICAgICAgIFB5X1hERUNSRUYodHlwZSk7CisgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOworICAgICAgICBQeV9YREVDUkVGKHRyYWNlYmFjayk7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBjYWxsX3RyYWNlX3Byb3RlY3RlZChQeV90cmFjZWZ1bmMgZnVuYywgUHlPYmplY3QgKm9iaiwgUHlGcmFtZU9iamVjdCAqZnJhbWUsCi0JCSAgICAgaW50IHdoYXQsIFB5T2JqZWN0ICphcmcpCisgICAgICAgICAgICAgICAgICAgICBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKIHsKLQlQeU9iamVjdCAqdHlwZSwgKnZhbHVlLCAqdHJhY2ViYWNrOwotCWludCBlcnI7Ci0JUHlFcnJfRmV0Y2goJnR5cGUsICZ2YWx1ZSwgJnRyYWNlYmFjayk7Ci0JZXJyID0gY2FsbF90cmFjZShmdW5jLCBvYmosIGZyYW1lLCB3aGF0LCBhcmcpOwotCWlmIChlcnIgPT0gMCkKLQl7Ci0JCVB5RXJyX1Jlc3RvcmUodHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7Ci0JCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJUHlfWERFQ1JFRih0eXBlKTsKLQkJUHlfWERFQ1JFRih2YWx1ZSk7Ci0JCVB5X1hERUNSRUYodHJhY2ViYWNrKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBQeU9iamVjdCAqdHlwZSwgKnZhbHVlLCAqdHJhY2ViYWNrOworICAgIGludCBlcnI7CisgICAgUHlFcnJfRmV0Y2goJnR5cGUsICZ2YWx1ZSwgJnRyYWNlYmFjayk7CisgICAgZXJyID0gY2FsbF90cmFjZShmdW5jLCBvYmosIGZyYW1lLCB3aGF0LCBhcmcpOworICAgIGlmIChlcnIgPT0gMCkKKyAgICB7CisgICAgICAgIFB5RXJyX1Jlc3RvcmUodHlwZSwgdmFsdWUsIHRyYWNlYmFjayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfWERFQ1JFRih0eXBlKTsKKyAgICAgICAgUHlfWERFQ1JFRih2YWx1ZSk7CisgICAgICAgIFB5X1hERUNSRUYodHJhY2ViYWNrKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogc3RhdGljIGludAogY2FsbF90cmFjZShQeV90cmFjZWZ1bmMgZnVuYywgUHlPYmplY3QgKm9iaiwgUHlGcmFtZU9iamVjdCAqZnJhbWUsCi0JICAgaW50IHdoYXQsIFB5T2JqZWN0ICphcmcpCisgICAgICAgICAgIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQogewotCXJlZ2lzdGVyIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IGZyYW1lLT5mX3RzdGF0ZTsKLQlpbnQgcmVzdWx0OwotCWlmICh0c3RhdGUtPnRyYWNpbmcpCi0JCXJldHVybiAwOwotCXRzdGF0ZS0+dHJhY2luZysrOwotCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAwOwotCXJlc3VsdCA9IGZ1bmMob2JqLCBmcmFtZSwgd2hhdCwgYXJnKTsKLQl0c3RhdGUtPnVzZV90cmFjaW5nID0gKCh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCi0JCQkgICAgICAgfHwgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSk7Ci0JdHN0YXRlLT50cmFjaW5nLS07Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZWdpc3RlciBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7CisgICAgaW50IHJlc3VsdDsKKyAgICBpZiAodHN0YXRlLT50cmFjaW5nKQorICAgICAgICByZXR1cm4gMDsKKyAgICB0c3RhdGUtPnRyYWNpbmcrKzsKKyAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gMDsKKyAgICByZXN1bHQgPSBmdW5jKG9iaiwgZnJhbWUsIHdoYXQsIGFyZyk7CisgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9ICgodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSk7CisgICAgdHN0YXRlLT50cmFjaW5nLS07CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlPYmplY3QgKgogX1B5RXZhbF9DYWxsVHJhY2luZyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlGcmFtZU9iamVjdCAqZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7Ci0JaW50IHNhdmVfdHJhY2luZyA9IHRzdGF0ZS0+dHJhY2luZzsKLQlpbnQgc2F2ZV91c2VfdHJhY2luZyA9IHRzdGF0ZS0+dXNlX3RyYWNpbmc7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeUZyYW1lT2JqZWN0ICpmcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IGZyYW1lLT5mX3RzdGF0ZTsKKyAgICBpbnQgc2F2ZV90cmFjaW5nID0gdHN0YXRlLT50cmFjaW5nOworICAgIGludCBzYXZlX3VzZV90cmFjaW5nID0gdHN0YXRlLT51c2VfdHJhY2luZzsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JdHN0YXRlLT50cmFjaW5nID0gMDsKLQl0c3RhdGUtPnVzZV90cmFjaW5nID0gKCh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpCi0JCQkgICAgICAgfHwgKHRzdGF0ZS0+Y19wcm9maWxlZnVuYyAhPSBOVUxMKSk7Ci0JcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBhcmdzLCBOVUxMKTsKLQl0c3RhdGUtPnRyYWNpbmcgPSBzYXZlX3RyYWNpbmc7Ci0JdHN0YXRlLT51c2VfdHJhY2luZyA9IHNhdmVfdXNlX3RyYWNpbmc7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICB0c3RhdGUtPnRyYWNpbmcgPSAwOworICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7CisgICAgdHN0YXRlLT50cmFjaW5nID0gc2F2ZV90cmFjaW5nOworICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSBzYXZlX3VzZV90cmFjaW5nOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQKIG1heWJlX2NhbGxfbGluZV90cmFjZShQeV90cmFjZWZ1bmMgZnVuYywgUHlPYmplY3QgKm9iaiwKLQkJICAgICAgUHlGcmFtZU9iamVjdCAqZnJhbWUsIGludCAqaW5zdHJfbGIsIGludCAqaW5zdHJfdWIsCi0JCSAgICAgIGludCAqaW5zdHJfcHJldikKKyAgICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50ICppbnN0cl9sYiwgaW50ICppbnN0cl91YiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluc3RyX3ByZXYpCiB7Ci0JaW50IHJlc3VsdCA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CiAKLSAgICAgICAgLyogSWYgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gZXhlY3V0ZWQgaXNuJ3QgaW4gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgaW5zdHJ1Y3Rpb24gd2luZG93LCByZXNldCB0aGUgd2luZG93LiAgSWYgdGhlIGxhc3QKLSAgICAgICAgICAgaW5zdHJ1Y3Rpb24gaGFwcGVucyB0byBmYWxsIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUgb3IgaWYgaXQKLSAgICAgICAgICAgcmVwcmVzZW50cyBhIGp1bXAgYmFja3dhcmRzLCBjYWxsIHRoZSB0cmFjZSBmdW5jdGlvbi4KLSAgICAgICAgKi8KLQlpZiAoKGZyYW1lLT5mX2xhc3RpIDwgKmluc3RyX2xiIHx8IGZyYW1lLT5mX2xhc3RpID49ICppbnN0cl91YikpIHsKLQkJaW50IGxpbmU7Ci0JCVB5QWRkclBhaXIgYm91bmRzOworICAgIC8qIElmIHRoZSBsYXN0IGluc3RydWN0aW9uIGV4ZWN1dGVkIGlzbid0IGluIHRoZSBjdXJyZW50CisgICAgICAgaW5zdHJ1Y3Rpb24gd2luZG93LCByZXNldCB0aGUgd2luZG93LiAgSWYgdGhlIGxhc3QKKyAgICAgICBpbnN0cnVjdGlvbiBoYXBwZW5zIHRvIGZhbGwgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSBvciBpZiBpdAorICAgICAgIHJlcHJlc2VudHMgYSBqdW1wIGJhY2t3YXJkcywgY2FsbCB0aGUgdHJhY2UgZnVuY3Rpb24uCisgICAgKi8KKyAgICBpZiAoKGZyYW1lLT5mX2xhc3RpIDwgKmluc3RyX2xiIHx8IGZyYW1lLT5mX2xhc3RpID49ICppbnN0cl91YikpIHsKKyAgICAgICAgaW50IGxpbmU7CisgICAgICAgIFB5QWRkclBhaXIgYm91bmRzOwogCi0JCWxpbmUgPSBQeUNvZGVfQ2hlY2tMaW5lTnVtYmVyKGZyYW1lLT5mX2NvZGUsIGZyYW1lLT5mX2xhc3RpLAotCQkJCQkgICAgICAmYm91bmRzKTsKLQkJaWYgKGxpbmUgPj0gMCkgewotCQkJZnJhbWUtPmZfbGluZW5vID0gbGluZTsKLQkJCXJlc3VsdCA9IGNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwKLQkJCQkJICAgIFB5VHJhY2VfTElORSwgUHlfTm9uZSk7Ci0JCX0KLQkJKmluc3RyX2xiID0gYm91bmRzLmFwX2xvd2VyOwotCQkqaW5zdHJfdWIgPSBib3VuZHMuYXBfdXBwZXI7Ci0JfQotCWVsc2UgaWYgKGZyYW1lLT5mX2xhc3RpIDw9ICppbnN0cl9wcmV2KSB7Ci0JCXJlc3VsdCA9IGNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwgUHlUcmFjZV9MSU5FLCBQeV9Ob25lKTsKLQl9Ci0JKmluc3RyX3ByZXYgPSBmcmFtZS0+Zl9sYXN0aTsKLQlyZXR1cm4gcmVzdWx0OworICAgICAgICBsaW5lID0gUHlDb2RlX0NoZWNrTGluZU51bWJlcihmcmFtZS0+Zl9jb2RlLCBmcmFtZS0+Zl9sYXN0aSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgICAgIGlmIChsaW5lID49IDApIHsKKyAgICAgICAgICAgIGZyYW1lLT5mX2xpbmVubyA9IGxpbmU7CisgICAgICAgICAgICByZXN1bHQgPSBjYWxsX3RyYWNlKGZ1bmMsIG9iaiwgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHJhY2VfTElORSwgUHlfTm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgKmluc3RyX2xiID0gYm91bmRzLmFwX2xvd2VyOworICAgICAgICAqaW5zdHJfdWIgPSBib3VuZHMuYXBfdXBwZXI7CisgICAgfQorICAgIGVsc2UgaWYgKGZyYW1lLT5mX2xhc3RpIDw9ICppbnN0cl9wcmV2KSB7CisgICAgICAgIHJlc3VsdCA9IGNhbGxfdHJhY2UoZnVuYywgb2JqLCBmcmFtZSwgUHlUcmFjZV9MSU5FLCBQeV9Ob25lKTsKKyAgICB9CisgICAgKmluc3RyX3ByZXYgPSBmcmFtZS0+Zl9sYXN0aTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiB2b2lkCiBQeUV2YWxfU2V0UHJvZmlsZShQeV90cmFjZWZ1bmMgZnVuYywgUHlPYmplY3QgKmFyZykKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5T2JqZWN0ICp0ZW1wID0gdHN0YXRlLT5jX3Byb2ZpbGVvYmo7Ci0JUHlfWElOQ1JFRihhcmcpOwotCXRzdGF0ZS0+Y19wcm9maWxlZnVuYyA9IE5VTEw7Ci0JdHN0YXRlLT5jX3Byb2ZpbGVvYmogPSBOVUxMOwotCS8qIE11c3QgbWFrZSBzdXJlIHRoYXQgdHJhY2luZyBpcyBub3QgaWdub3JlZCBpZiAndGVtcCcgaXMgZnJlZWQgKi8KLQl0c3RhdGUtPnVzZV90cmFjaW5nID0gdHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMOwotCVB5X1hERUNSRUYodGVtcCk7Ci0JdHN0YXRlLT5jX3Byb2ZpbGVmdW5jID0gZnVuYzsKLQl0c3RhdGUtPmNfcHJvZmlsZW9iaiA9IGFyZzsKLQkvKiBGbGFnIHRoYXQgdHJhY2luZyBvciBwcm9maWxpbmcgaXMgdHVybmVkIG9uICovCi0JdHN0YXRlLT51c2VfdHJhY2luZyA9IChmdW5jICE9IE5VTEwpIHx8ICh0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEwpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKnRlbXAgPSB0c3RhdGUtPmNfcHJvZmlsZW9iajsKKyAgICBQeV9YSU5DUkVGKGFyZyk7CisgICAgdHN0YXRlLT5jX3Byb2ZpbGVmdW5jID0gTlVMTDsKKyAgICB0c3RhdGUtPmNfcHJvZmlsZW9iaiA9IE5VTEw7CisgICAgLyogTXVzdCBtYWtlIHN1cmUgdGhhdCB0cmFjaW5nIGlzIG5vdCBpZ25vcmVkIGlmICd0ZW1wJyBpcyBmcmVlZCAqLworICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSB0c3RhdGUtPmNfdHJhY2VmdW5jICE9IE5VTEw7CisgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICB0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgPSBmdW5jOworICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqID0gYXJnOworICAgIC8qIEZsYWcgdGhhdCB0cmFjaW5nIG9yIHByb2ZpbGluZyBpcyB0dXJuZWQgb24gKi8KKyAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gKGZ1bmMgIT0gTlVMTCkgfHwgKHRzdGF0ZS0+Y190cmFjZWZ1bmMgIT0gTlVMTCk7CiB9CiAKIHZvaWQKIFB5RXZhbF9TZXRUcmFjZShQeV90cmFjZWZ1bmMgZnVuYywgUHlPYmplY3QgKmFyZykKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5T2JqZWN0ICp0ZW1wID0gdHN0YXRlLT5jX3RyYWNlb2JqOwotCV9QeV9UcmFjaW5nUG9zc2libGUgKz0gKGZ1bmMgIT0gTlVMTCkgLSAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKTsKLQlQeV9YSU5DUkVGKGFyZyk7Ci0JdHN0YXRlLT5jX3RyYWNlZnVuYyA9IE5VTEw7Ci0JdHN0YXRlLT5jX3RyYWNlb2JqID0gTlVMTDsKLQkvKiBNdXN0IG1ha2Ugc3VyZSB0aGF0IHByb2ZpbGluZyBpcyBub3QgaWdub3JlZCBpZiAndGVtcCcgaXMgZnJlZWQgKi8KLQl0c3RhdGUtPnVzZV90cmFjaW5nID0gdHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEw7Ci0JUHlfWERFQ1JFRih0ZW1wKTsKLQl0c3RhdGUtPmNfdHJhY2VmdW5jID0gZnVuYzsKLQl0c3RhdGUtPmNfdHJhY2VvYmogPSBhcmc7Ci0JLyogRmxhZyB0aGF0IHRyYWNpbmcgb3IgcHJvZmlsaW5nIGlzIHR1cm5lZCBvbiAqLwotCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoKGZ1bmMgIT0gTlVMTCkKLQkJCSAgICAgICB8fCAodHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEwpKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICp0ZW1wID0gdHN0YXRlLT5jX3RyYWNlb2JqOworICAgIF9QeV9UcmFjaW5nUG9zc2libGUgKz0gKGZ1bmMgIT0gTlVMTCkgLSAodHN0YXRlLT5jX3RyYWNlZnVuYyAhPSBOVUxMKTsKKyAgICBQeV9YSU5DUkVGKGFyZyk7CisgICAgdHN0YXRlLT5jX3RyYWNlZnVuYyA9IE5VTEw7CisgICAgdHN0YXRlLT5jX3RyYWNlb2JqID0gTlVMTDsKKyAgICAvKiBNdXN0IG1ha2Ugc3VyZSB0aGF0IHByb2ZpbGluZyBpcyBub3QgaWdub3JlZCBpZiAndGVtcCcgaXMgZnJlZWQgKi8KKyAgICB0c3RhdGUtPnVzZV90cmFjaW5nID0gdHN0YXRlLT5jX3Byb2ZpbGVmdW5jICE9IE5VTEw7CisgICAgUHlfWERFQ1JFRih0ZW1wKTsKKyAgICB0c3RhdGUtPmNfdHJhY2VmdW5jID0gZnVuYzsKKyAgICB0c3RhdGUtPmNfdHJhY2VvYmogPSBhcmc7CisgICAgLyogRmxhZyB0aGF0IHRyYWNpbmcgb3IgcHJvZmlsaW5nIGlzIHR1cm5lZCBvbiAqLworICAgIHRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAoKGZ1bmMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkpOwogfQogCiBQeU9iamVjdCAqCiBQeUV2YWxfR2V0QnVpbHRpbnModm9pZCkKIHsKLQlQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7Ci0JaWYgKGN1cnJlbnRfZnJhbWUgPT0gTlVMTCkKLQkJcmV0dXJuIFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycC0+YnVpbHRpbnM7Ci0JZWxzZQotCQlyZXR1cm4gY3VycmVudF9mcmFtZS0+Zl9idWlsdGluczsKKyAgICBQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7CisgICAgaWYgKGN1cnJlbnRfZnJhbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycC0+YnVpbHRpbnM7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gY3VycmVudF9mcmFtZS0+Zl9idWlsdGluczsKIH0KIAogUHlPYmplY3QgKgogUHlFdmFsX0dldExvY2Fscyh2b2lkKQogewotCVB5RnJhbWVPYmplY3QgKmN1cnJlbnRfZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKLQlpZiAoY3VycmVudF9mcmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlQeUZyYW1lX0Zhc3RUb0xvY2FscyhjdXJyZW50X2ZyYW1lKTsKLQlyZXR1cm4gY3VycmVudF9mcmFtZS0+Zl9sb2NhbHM7CisgICAgUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOworICAgIGlmIChjdXJyZW50X2ZyYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RnJhbWVfRmFzdFRvTG9jYWxzKGN1cnJlbnRfZnJhbWUpOworICAgIHJldHVybiBjdXJyZW50X2ZyYW1lLT5mX2xvY2FsczsKIH0KIAogUHlPYmplY3QgKgogUHlFdmFsX0dldEdsb2JhbHModm9pZCkKIHsKLQlQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7Ci0JaWYgKGN1cnJlbnRfZnJhbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gY3VycmVudF9mcmFtZS0+Zl9nbG9iYWxzOworICAgIFB5RnJhbWVPYmplY3QgKmN1cnJlbnRfZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKKyAgICBpZiAoY3VycmVudF9mcmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBjdXJyZW50X2ZyYW1lLT5mX2dsb2JhbHM7CiB9CiAKIFB5RnJhbWVPYmplY3QgKgogUHlFdmFsX0dldEZyYW1lKHZvaWQpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlyZXR1cm4gX1B5VGhyZWFkU3RhdGVfR2V0RnJhbWUodHN0YXRlKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIHJldHVybiBfUHlUaHJlYWRTdGF0ZV9HZXRGcmFtZSh0c3RhdGUpOwogfQogCiBpbnQKIFB5RXZhbF9HZXRSZXN0cmljdGVkKHZvaWQpCiB7Ci0JUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOwotCXJldHVybiBjdXJyZW50X2ZyYW1lID09IE5VTEwgPyAwIDogUHlGcmFtZV9Jc1Jlc3RyaWN0ZWQoY3VycmVudF9mcmFtZSk7CisgICAgUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOworICAgIHJldHVybiBjdXJyZW50X2ZyYW1lID09IE5VTEwgPyAwIDogUHlGcmFtZV9Jc1Jlc3RyaWN0ZWQoY3VycmVudF9mcmFtZSk7CiB9CiAKIGludAogUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncyhQeUNvbXBpbGVyRmxhZ3MgKmNmKQogewotCVB5RnJhbWVPYmplY3QgKmN1cnJlbnRfZnJhbWUgPSBQeUV2YWxfR2V0RnJhbWUoKTsKLQlpbnQgcmVzdWx0ID0gY2YtPmNmX2ZsYWdzICE9IDA7CisgICAgUHlGcmFtZU9iamVjdCAqY3VycmVudF9mcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOworICAgIGludCByZXN1bHQgPSBjZi0+Y2ZfZmxhZ3MgIT0gMDsKIAotCWlmIChjdXJyZW50X2ZyYW1lICE9IE5VTEwpIHsKLQkJY29uc3QgaW50IGNvZGVmbGFncyA9IGN1cnJlbnRfZnJhbWUtPmZfY29kZS0+Y29fZmxhZ3M7Ci0JCWNvbnN0IGludCBjb21waWxlcmZsYWdzID0gY29kZWZsYWdzICYgUHlDRl9NQVNLOwotCQlpZiAoY29tcGlsZXJmbGFncykgewotCQkJcmVzdWx0ID0gMTsKLQkJCWNmLT5jZl9mbGFncyB8PSBjb21waWxlcmZsYWdzOwotCQl9CisgICAgaWYgKGN1cnJlbnRfZnJhbWUgIT0gTlVMTCkgeworICAgICAgICBjb25zdCBpbnQgY29kZWZsYWdzID0gY3VycmVudF9mcmFtZS0+Zl9jb2RlLT5jb19mbGFnczsKKyAgICAgICAgY29uc3QgaW50IGNvbXBpbGVyZmxhZ3MgPSBjb2RlZmxhZ3MgJiBQeUNGX01BU0s7CisgICAgICAgIGlmIChjb21waWxlcmZsYWdzKSB7CisgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgY2YtPmNmX2ZsYWdzIHw9IGNvbXBpbGVyZmxhZ3M7CisgICAgICAgIH0KICNpZiAwIC8qIGZ1dHVyZSBrZXl3b3JkICovCi0JCWlmIChjb2RlZmxhZ3MgJiBDT19HRU5FUkFUT1JfQUxMT1dFRCkgewotCQkJcmVzdWx0ID0gMTsKLQkJCWNmLT5jZl9mbGFncyB8PSBDT19HRU5FUkFUT1JfQUxMT1dFRDsKLQkJfQorICAgICAgICBpZiAoY29kZWZsYWdzICYgQ09fR0VORVJBVE9SX0FMTE9XRUQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IDE7CisgICAgICAgICAgICBjZi0+Y2ZfZmxhZ3MgfD0gQ09fR0VORVJBVE9SX0FMTE9XRUQ7CisgICAgICAgIH0KICNlbmRpZgotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBpbnQKIFB5X0ZsdXNoTGluZSh2b2lkKQogewotCVB5T2JqZWN0ICpmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKLQlpZiAoZiA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAoIVB5RmlsZV9Tb2Z0U3BhY2UoZiwgMCkpCi0JCXJldHVybiAwOwotCXJldHVybiBQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZik7CisgICAgUHlPYmplY3QgKmYgPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOworICAgIGlmIChmID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghUHlGaWxlX1NvZnRTcGFjZShmLCAwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmKTsKIH0KIAogCkBAIC0zNTg2LDIwNSArMzU4NiwyMDUgQEAKIFB5T2JqZWN0ICoKIFB5RXZhbF9DYWxsT2JqZWN0KFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJnKQogewotCXJldHVybiBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmcsIChQeU9iamVjdCAqKU5VTEwpOworICAgIHJldHVybiBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmcsIChQeU9iamVjdCAqKU5VTEwpOwogfQogI2RlZmluZSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLGFyZykgXAotICAgICAgICBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhmdW5jLCBhcmcsIChQeU9iamVjdCAqKU5VTEwpCisgICAgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJnLCAoUHlPYmplY3QgKilOVUxMKQogCiBQeU9iamVjdCAqCiBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChhcmcgPT0gTlVMTCkgewotCQlhcmcgPSBQeVR1cGxlX05ldygwKTsKLQkJaWYgKGFyZyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UgaWYgKCFQeVR1cGxlX0NoZWNrKGFyZykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiYXJndW1lbnQgbGlzdCBtdXN0IGJlIGEgdHVwbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWVsc2UKLQkJUHlfSU5DUkVGKGFyZyk7CisgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgIGFyZyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoIVB5VHVwbGVfQ2hlY2soYXJnKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IGxpc3QgbXVzdCBiZSBhIHR1cGxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIFB5X0lOQ1JFRihhcmcpOwogCi0JaWYgKGt3ICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrdykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkia2V5d29yZCBsaXN0IG11c3QgYmUgYSBkaWN0aW9uYXJ5Iik7Ci0JCVB5X0RFQ1JFRihhcmcpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGt3ICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrdykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJrZXl3b3JkIGxpc3QgbXVzdCBiZSBhIGRpY3Rpb25hcnkiKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJnLCBrdyk7Ci0JUHlfREVDUkVGKGFyZyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZywga3cpOworICAgIFB5X0RFQ1JFRihhcmcpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGNvbnN0IGNoYXIgKgogUHlFdmFsX0dldEZ1bmNOYW1lKFB5T2JqZWN0ICpmdW5jKQogewotCWlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSkKLQkJcmV0dXJuIFB5RXZhbF9HZXRGdW5jTmFtZShQeU1ldGhvZF9HRVRfRlVOQ1RJT04oZnVuYykpOwotCWVsc2UgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCi0JCXJldHVybiBQeVN0cmluZ19Bc1N0cmluZygoKFB5RnVuY3Rpb25PYmplY3QqKWZ1bmMpLT5mdW5jX25hbWUpOwotCWVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKQotCQlyZXR1cm4gKChQeUNGdW5jdGlvbk9iamVjdCopZnVuYyktPm1fbWwtPm1sX25hbWU7Ci0JZWxzZSBpZiAoUHlDbGFzc19DaGVjayhmdW5jKSkKLQkJcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKCgoUHlDbGFzc09iamVjdCopZnVuYyktPmNsX25hbWUpOwotCWVsc2UgaWYgKFB5SW5zdGFuY2VfQ2hlY2soZnVuYykpIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKAotCQkJKChQeUluc3RhbmNlT2JqZWN0KilmdW5jKS0+aW5fY2xhc3MtPmNsX25hbWUpOwotCX0gZWxzZSB7Ci0JCXJldHVybiBmdW5jLT5vYl90eXBlLT50cF9uYW1lOwotCX0KKyAgICBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykpCisgICAgICAgIHJldHVybiBQeUV2YWxfR2V0RnVuY05hbWUoUHlNZXRob2RfR0VUX0ZVTkNUSU9OKGZ1bmMpKTsKKyAgICBlbHNlIGlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gUHlTdHJpbmdfQXNTdHJpbmcoKChQeUZ1bmN0aW9uT2JqZWN0KilmdW5jKS0+ZnVuY19uYW1lKTsKKyAgICBlbHNlIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkKKyAgICAgICAgcmV0dXJuICgoUHlDRnVuY3Rpb25PYmplY3QqKWZ1bmMpLT5tX21sLT5tbF9uYW1lOworICAgIGVsc2UgaWYgKFB5Q2xhc3NfQ2hlY2soZnVuYykpCisgICAgICAgIHJldHVybiBQeVN0cmluZ19Bc1N0cmluZygoKFB5Q2xhc3NPYmplY3QqKWZ1bmMpLT5jbF9uYW1lKTsKKyAgICBlbHNlIGlmIChQeUluc3RhbmNlX0NoZWNrKGZ1bmMpKSB7CisgICAgICAgIHJldHVybiBQeVN0cmluZ19Bc1N0cmluZygKKyAgICAgICAgICAgICgoUHlJbnN0YW5jZU9iamVjdCopZnVuYyktPmluX2NsYXNzLT5jbF9uYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZnVuYy0+b2JfdHlwZS0+dHBfbmFtZTsKKyAgICB9CiB9CiAKIGNvbnN0IGNoYXIgKgogUHlFdmFsX0dldEZ1bmNEZXNjKFB5T2JqZWN0ICpmdW5jKQogewotCWlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSkKLQkJcmV0dXJuICIoKSI7Ci0JZWxzZSBpZiAoUHlGdW5jdGlvbl9DaGVjayhmdW5jKSkKLQkJcmV0dXJuICIoKSI7Ci0JZWxzZSBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpCi0JCXJldHVybiAiKCkiOwotCWVsc2UgaWYgKFB5Q2xhc3NfQ2hlY2soZnVuYykpCi0JCXJldHVybiAiIGNvbnN0cnVjdG9yIjsKLQllbHNlIGlmIChQeUluc3RhbmNlX0NoZWNrKGZ1bmMpKSB7Ci0JCXJldHVybiAiIGluc3RhbmNlIjsKLQl9IGVsc2UgewotCQlyZXR1cm4gIiBvYmplY3QiOwotCX0KKyAgICBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykpCisgICAgICAgIHJldHVybiAiKCkiOworICAgIGVsc2UgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCisgICAgICAgIHJldHVybiAiKCkiOworICAgIGVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gIigpIjsKKyAgICBlbHNlIGlmIChQeUNsYXNzX0NoZWNrKGZ1bmMpKQorICAgICAgICByZXR1cm4gIiBjb25zdHJ1Y3RvciI7CisgICAgZWxzZSBpZiAoUHlJbnN0YW5jZV9DaGVjayhmdW5jKSkgeworICAgICAgICByZXR1cm4gIiBpbnN0YW5jZSI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICIgb2JqZWN0IjsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiBlcnJfYXJncyhQeU9iamVjdCAqZnVuYywgaW50IGZsYWdzLCBpbnQgbmFyZ3MpCiB7Ci0JaWYgKGZsYWdzICYgTUVUSF9OT0FSR1MpCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgICIlLjIwMHMoKSB0YWtlcyBubyBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCi0JCQkgICAgICgoUHlDRnVuY3Rpb25PYmplY3QgKilmdW5jKS0+bV9tbC0+bWxfbmFtZSwKLQkJCSAgICAgbmFyZ3MpOwotCWVsc2UKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgIiUuMjAwcygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICglZCBnaXZlbikiLAotCQkJICAgICAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopZnVuYyktPm1fbWwtPm1sX25hbWUsCi0JCQkgICAgIG5hcmdzKTsKKyAgICBpZiAoZmxhZ3MgJiBNRVRIX05PQVJHUykKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMoKSB0YWtlcyBubyBhcmd1bWVudHMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopZnVuYyktPm1fbWwtPm1sX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBuYXJncyk7CisgICAgZWxzZQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIiUuMjAwcygpIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50ICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgKChQeUNGdW5jdGlvbk9iamVjdCAqKWZ1bmMpLT5tX21sLT5tbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgbmFyZ3MpOwogfQogCiAjZGVmaW5lIENfVFJBQ0UoeCwgY2FsbCkgXAogaWYgKHRzdGF0ZS0+dXNlX3RyYWNpbmcgJiYgdHN0YXRlLT5jX3Byb2ZpbGVmdW5jKSB7IFwKLQlpZiAoY2FsbF90cmFjZSh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMsIFwKLQkJdHN0YXRlLT5jX3Byb2ZpbGVvYmosIFwKLQkJdHN0YXRlLT5mcmFtZSwgUHlUcmFjZV9DX0NBTEwsIFwKLQkJZnVuYykpIHsgXAotCQl4ID0gTlVMTDsgXAotCX0gXAotCWVsc2UgeyBcCi0JCXggPSBjYWxsOyBcCi0JCWlmICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkgeyBcCi0JCQlpZiAoeCA9PSBOVUxMKSB7IFwKLQkJCQljYWxsX3RyYWNlX3Byb3RlY3RlZCh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMsIFwKLQkJCQkJdHN0YXRlLT5jX3Byb2ZpbGVvYmosIFwKLQkJCQkJdHN0YXRlLT5mcmFtZSwgUHlUcmFjZV9DX0VYQ0VQVElPTiwgXAotCQkJCQlmdW5jKTsgXAotCQkJCS8qIFhYWCBzaG91bGQgcGFzcyAodHlwZSwgdmFsdWUsIHRiKSAqLyBcCi0JCQl9IGVsc2UgeyBcCi0JCQkJaWYgKGNhbGxfdHJhY2UodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLCBcCi0JCQkJCXRzdGF0ZS0+Y19wcm9maWxlb2JqLCBcCi0JCQkJCXRzdGF0ZS0+ZnJhbWUsIFB5VHJhY2VfQ19SRVRVUk4sIFwKLQkJCQkJZnVuYykpIHsgXAotCQkJCQlQeV9ERUNSRUYoeCk7IFwKLQkJCQkJeCA9IE5VTEw7IFwKLQkJCQl9IFwKLQkJCX0gXAotCQl9IFwKLQl9IFwKKyAgICBpZiAoY2FsbF90cmFjZSh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMsIFwKKyAgICAgICAgdHN0YXRlLT5jX3Byb2ZpbGVvYmosIFwKKyAgICAgICAgdHN0YXRlLT5mcmFtZSwgUHlUcmFjZV9DX0NBTEwsIFwKKyAgICAgICAgZnVuYykpIHsgXAorICAgICAgICB4ID0gTlVMTDsgXAorICAgIH0gXAorICAgIGVsc2UgeyBcCisgICAgICAgIHggPSBjYWxsOyBcCisgICAgICAgIGlmICh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgIT0gTlVMTCkgeyBcCisgICAgICAgICAgICBpZiAoeCA9PSBOVUxMKSB7IFwKKyAgICAgICAgICAgICAgICBjYWxsX3RyYWNlX3Byb3RlY3RlZCh0c3RhdGUtPmNfcHJvZmlsZWZ1bmMsIFwKKyAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5jX3Byb2ZpbGVvYmosIFwKKyAgICAgICAgICAgICAgICAgICAgdHN0YXRlLT5mcmFtZSwgUHlUcmFjZV9DX0VYQ0VQVElPTiwgXAorICAgICAgICAgICAgICAgICAgICBmdW5jKTsgXAorICAgICAgICAgICAgICAgIC8qIFhYWCBzaG91bGQgcGFzcyAodHlwZSwgdmFsdWUsIHRiKSAqLyBcCisgICAgICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICAgICAgaWYgKGNhbGxfdHJhY2UodHN0YXRlLT5jX3Byb2ZpbGVmdW5jLCBcCisgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqLCBcCisgICAgICAgICAgICAgICAgICAgIHRzdGF0ZS0+ZnJhbWUsIFB5VHJhY2VfQ19SRVRVUk4sIFwKKyAgICAgICAgICAgICAgICAgICAgZnVuYykpIHsgXAorICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoeCk7IFwKKyAgICAgICAgICAgICAgICAgICAgeCA9IE5VTEw7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IFwKIH0gZWxzZSB7IFwKLQl4ID0gY2FsbDsgXAotCX0KKyAgICB4ID0gY2FsbDsgXAorICAgIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxfZnVuY3Rpb24oUHlPYmplY3QgKioqcHBfc3RhY2ssIGludCBvcGFyZwogI2lmZGVmIFdJVEhfVFNDCi0JCSwgdWludDY0KiBwaW50cjAsIHVpbnQ2NCogcGludHIxCisgICAgICAgICAgICAgICAgLCB1aW50NjQqIHBpbnRyMCwgdWludDY0KiBwaW50cjEKICNlbmRpZgotCQkpCisgICAgICAgICAgICAgICAgKQogewotCWludCBuYSA9IG9wYXJnICYgMHhmZjsKLQlpbnQgbmsgPSAob3Bhcmc+PjgpICYgMHhmZjsKLQlpbnQgbiA9IG5hICsgMiAqIG5rOwotCVB5T2JqZWN0ICoqcGZ1bmMgPSAoKnBwX3N0YWNrKSAtIG4gLSAxOwotCVB5T2JqZWN0ICpmdW5jID0gKnBmdW5jOwotCVB5T2JqZWN0ICp4LCAqdzsKKyAgICBpbnQgbmEgPSBvcGFyZyAmIDB4ZmY7CisgICAgaW50IG5rID0gKG9wYXJnPj44KSAmIDB4ZmY7CisgICAgaW50IG4gPSBuYSArIDIgKiBuazsKKyAgICBQeU9iamVjdCAqKnBmdW5jID0gKCpwcF9zdGFjaykgLSBuIC0gMTsKKyAgICBQeU9iamVjdCAqZnVuYyA9ICpwZnVuYzsKKyAgICBQeU9iamVjdCAqeCwgKnc7CiAKLQkvKiBBbHdheXMgZGlzcGF0Y2ggUHlDRnVuY3Rpb24gZmlyc3QsIGJlY2F1c2UgdGhlc2UgYXJlCi0JICAgcHJlc3VtZWQgdG8gYmUgdGhlIG1vc3QgZnJlcXVlbnQgY2FsbGFibGUgb2JqZWN0LgotCSovCi0JaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpICYmIG5rID09IDApIHsKLQkJaW50IGZsYWdzID0gUHlDRnVuY3Rpb25fR0VUX0ZMQUdTKGZ1bmMpOwotCQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIC8qIEFsd2F5cyBkaXNwYXRjaCBQeUNGdW5jdGlvbiBmaXJzdCwgYmVjYXVzZSB0aGVzZSBhcmUKKyAgICAgICBwcmVzdW1lZCB0byBiZSB0aGUgbW9zdCBmcmVxdWVudCBjYWxsYWJsZSBvYmplY3QuCisgICAgKi8KKyAgICBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykgJiYgbmsgPT0gMCkgeworICAgICAgICBpbnQgZmxhZ3MgPSBQeUNGdW5jdGlvbl9HRVRfRkxBR1MoZnVuYyk7CisgICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CiAKLQkJUENBTEwoUENBTExfQ0ZVTkNUSU9OKTsKLQkJaWYgKGZsYWdzICYgKE1FVEhfTk9BUkdTIHwgTUVUSF9PKSkgewotCQkJUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKTsKLQkJCVB5T2JqZWN0ICpzZWxmID0gUHlDRnVuY3Rpb25fR0VUX1NFTEYoZnVuYyk7Ci0JCQlpZiAoZmxhZ3MgJiBNRVRIX05PQVJHUyAmJiBuYSA9PSAwKSB7Ci0JCQkJQ19UUkFDRSh4LCAoKm1ldGgpKHNlbGYsTlVMTCkpOwotCQkJfQotCQkJZWxzZSBpZiAoZmxhZ3MgJiBNRVRIX08gJiYgbmEgPT0gMSkgewotCQkJCVB5T2JqZWN0ICphcmcgPSBFWFRfUE9QKCpwcF9zdGFjayk7Ci0JCQkJQ19UUkFDRSh4LCAoKm1ldGgpKHNlbGYsYXJnKSk7Ci0JCQkJUHlfREVDUkVGKGFyZyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllcnJfYXJncyhmdW5jLCBmbGFncywgbmEpOwotCQkJCXggPSBOVUxMOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJUHlPYmplY3QgKmNhbGxhcmdzOwotCQkJY2FsbGFyZ3MgPSBsb2FkX2FyZ3MocHBfc3RhY2ssIG5hKTsKLQkJCVJFQURfVElNRVNUQU1QKCpwaW50cjApOwotCQkJQ19UUkFDRSh4LCBQeUNGdW5jdGlvbl9DYWxsKGZ1bmMsY2FsbGFyZ3MsTlVMTCkpOwotCQkJUkVBRF9USU1FU1RBTVAoKnBpbnRyMSk7Ci0JCQlQeV9YREVDUkVGKGNhbGxhcmdzKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSAmJiBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKSAhPSBOVUxMKSB7Ci0JCQkvKiBvcHRpbWl6ZSBhY2Nlc3MgdG8gYm91bmQgbWV0aG9kcyAqLwotCQkJUHlPYmplY3QgKnNlbGYgPSBQeU1ldGhvZF9HRVRfU0VMRihmdW5jKTsKLQkJCVBDQUxMKFBDQUxMX01FVEhPRCk7Ci0JCQlQQ0FMTChQQ0FMTF9CT1VORF9NRVRIT0QpOwotCQkJUHlfSU5DUkVGKHNlbGYpOwotCQkJZnVuYyA9IFB5TWV0aG9kX0dFVF9GVU5DVElPTihmdW5jKTsKLQkJCVB5X0lOQ1JFRihmdW5jKTsKLQkJCVB5X0RFQ1JFRigqcGZ1bmMpOwotCQkJKnBmdW5jID0gc2VsZjsKLQkJCW5hKys7Ci0JCQluKys7Ci0JCX0gZWxzZQotCQkJUHlfSU5DUkVGKGZ1bmMpOwotCQlSRUFEX1RJTUVTVEFNUCgqcGludHIwKTsKLQkJaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCi0JCQl4ID0gZmFzdF9mdW5jdGlvbihmdW5jLCBwcF9zdGFjaywgbiwgbmEsIG5rKTsKLQkJZWxzZQotCQkJeCA9IGRvX2NhbGwoZnVuYywgcHBfc3RhY2ssIG5hLCBuayk7Ci0JCVJFQURfVElNRVNUQU1QKCpwaW50cjEpOwotCQlQeV9ERUNSRUYoZnVuYyk7Ci0JfQorICAgICAgICBQQ0FMTChQQ0FMTF9DRlVOQ1RJT04pOworICAgICAgICBpZiAoZmxhZ3MgJiAoTUVUSF9OT0FSR1MgfCBNRVRIX08pKSB7CisgICAgICAgICAgICBQeUNGdW5jdGlvbiBtZXRoID0gUHlDRnVuY3Rpb25fR0VUX0ZVTkNUSU9OKGZ1bmMpOworICAgICAgICAgICAgUHlPYmplY3QgKnNlbGYgPSBQeUNGdW5jdGlvbl9HRVRfU0VMRihmdW5jKTsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIE1FVEhfTk9BUkdTICYmIG5hID09IDApIHsKKyAgICAgICAgICAgICAgICBDX1RSQUNFKHgsICgqbWV0aCkoc2VsZixOVUxMKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChmbGFncyAmIE1FVEhfTyAmJiBuYSA9PSAxKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKKyAgICAgICAgICAgICAgICBDX1RSQUNFKHgsICgqbWV0aCkoc2VsZixhcmcpKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGVycl9hcmdzKGZ1bmMsIGZsYWdzLCBuYSk7CisgICAgICAgICAgICAgICAgeCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqY2FsbGFyZ3M7CisgICAgICAgICAgICBjYWxsYXJncyA9IGxvYWRfYXJncyhwcF9zdGFjaywgbmEpOworICAgICAgICAgICAgUkVBRF9USU1FU1RBTVAoKnBpbnRyMCk7CisgICAgICAgICAgICBDX1RSQUNFKHgsIFB5Q0Z1bmN0aW9uX0NhbGwoZnVuYyxjYWxsYXJncyxOVUxMKSk7CisgICAgICAgICAgICBSRUFEX1RJTUVTVEFNUCgqcGludHIxKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoY2FsbGFyZ3MpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpICYmIFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIG9wdGltaXplIGFjY2VzcyB0byBib3VuZCBtZXRob2RzICovCisgICAgICAgICAgICBQeU9iamVjdCAqc2VsZiA9IFB5TWV0aG9kX0dFVF9TRUxGKGZ1bmMpOworICAgICAgICAgICAgUENBTEwoUENBTExfTUVUSE9EKTsKKyAgICAgICAgICAgIFBDQUxMKFBDQUxMX0JPVU5EX01FVEhPRCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7CisgICAgICAgICAgICBmdW5jID0gUHlNZXRob2RfR0VUX0ZVTkNUSU9OKGZ1bmMpOworICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgICAgICAgICAgUHlfREVDUkVGKCpwZnVuYyk7CisgICAgICAgICAgICAqcGZ1bmMgPSBzZWxmOworICAgICAgICAgICAgbmErKzsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBQeV9JTkNSRUYoZnVuYyk7CisgICAgICAgIFJFQURfVElNRVNUQU1QKCpwaW50cjApOworICAgICAgICBpZiAoUHlGdW5jdGlvbl9DaGVjayhmdW5jKSkKKyAgICAgICAgICAgIHggPSBmYXN0X2Z1bmN0aW9uKGZ1bmMsIHBwX3N0YWNrLCBuLCBuYSwgbmspOworICAgICAgICBlbHNlCisgICAgICAgICAgICB4ID0gZG9fY2FsbChmdW5jLCBwcF9zdGFjaywgbmEsIG5rKTsKKyAgICAgICAgUkVBRF9USU1FU1RBTVAoKnBpbnRyMSk7CisgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICB9CiAKLQkvKiBDbGVhciB0aGUgc3RhY2sgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIEFsc28gcmVtb3ZlcwotICAgICAgICAgICB0aGUgYXJndW1lbnRzIGluIGNhc2UgdGhleSB3ZXJlbid0IGNvbnN1bWVkIGFscmVhZHkKLSAgICAgICAgICAgKGZhc3RfZnVuY3Rpb24oKSBhbmQgZXJyX2FyZ3MoKSBsZWF2ZSB0aGVtIG9uIHRoZSBzdGFjaykuCi0JICovCi0Jd2hpbGUgKCgqcHBfc3RhY2spID4gcGZ1bmMpIHsKLQkJdyA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKLQkJUHlfREVDUkVGKHcpOwotCQlQQ0FMTChQQ0FMTF9QT1ApOwotCX0KLQlyZXR1cm4geDsKKyAgICAvKiBDbGVhciB0aGUgc3RhY2sgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIEFsc28gcmVtb3ZlcworICAgICAgIHRoZSBhcmd1bWVudHMgaW4gY2FzZSB0aGV5IHdlcmVuJ3QgY29uc3VtZWQgYWxyZWFkeQorICAgICAgIChmYXN0X2Z1bmN0aW9uKCkgYW5kIGVycl9hcmdzKCkgbGVhdmUgdGhlbSBvbiB0aGUgc3RhY2spLgorICAgICAqLworICAgIHdoaWxlICgoKnBwX3N0YWNrKSA+IHBmdW5jKSB7CisgICAgICAgIHcgPSBFWFRfUE9QKCpwcF9zdGFjayk7CisgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgUENBTEwoUENBTExfUE9QKTsKKyAgICB9CisgICAgcmV0dXJuIHg7CiB9CiAKIC8qIFRoZSBmYXN0X2Z1bmN0aW9uKCkgZnVuY3Rpb24gb3B0aW1pemUgY2FsbHMgZm9yIHdoaWNoIG5vIGFyZ3VtZW50CkBAIC0zNzk5LDI3MyArMzc5OSwyNzMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmYXN0X2Z1bmN0aW9uKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqKipwcF9zdGFjaywgaW50IG4sIGludCBuYSwgaW50IG5rKQogewotCVB5Q29kZU9iamVjdCAqY28gPSAoUHlDb2RlT2JqZWN0ICopUHlGdW5jdGlvbl9HRVRfQ09ERShmdW5jKTsKLQlQeU9iamVjdCAqZ2xvYmFscyA9IFB5RnVuY3Rpb25fR0VUX0dMT0JBTFMoZnVuYyk7Ci0JUHlPYmplY3QgKmFyZ2RlZnMgPSBQeUZ1bmN0aW9uX0dFVF9ERUZBVUxUUyhmdW5jKTsKLQlQeU9iamVjdCAqKmQgPSBOVUxMOwotCWludCBuZCA9IDA7CisgICAgUHlDb2RlT2JqZWN0ICpjbyA9IChQeUNvZGVPYmplY3QgKilQeUZ1bmN0aW9uX0dFVF9DT0RFKGZ1bmMpOworICAgIFB5T2JqZWN0ICpnbG9iYWxzID0gUHlGdW5jdGlvbl9HRVRfR0xPQkFMUyhmdW5jKTsKKyAgICBQeU9iamVjdCAqYXJnZGVmcyA9IFB5RnVuY3Rpb25fR0VUX0RFRkFVTFRTKGZ1bmMpOworICAgIFB5T2JqZWN0ICoqZCA9IE5VTEw7CisgICAgaW50IG5kID0gMDsKIAotCVBDQUxMKFBDQUxMX0ZVTkNUSU9OKTsKLQlQQ0FMTChQQ0FMTF9GQVNUX0ZVTkNUSU9OKTsKLQlpZiAoYXJnZGVmcyA9PSBOVUxMICYmIGNvLT5jb19hcmdjb3VudCA9PSBuICYmIG5rPT0wICYmCi0JICAgIGNvLT5jb19mbGFncyA9PSAoQ09fT1BUSU1JWkVEIHwgQ09fTkVXTE9DQUxTIHwgQ09fTk9GUkVFKSkgewotCQlQeUZyYW1lT2JqZWN0ICpmOwotCQlQeU9iamVjdCAqcmV0dmFsID0gTlVMTDsKLQkJUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQkJUHlPYmplY3QgKipmYXN0bG9jYWxzLCAqKnN0YWNrOwotCQlpbnQgaTsKKyAgICBQQ0FMTChQQ0FMTF9GVU5DVElPTik7CisgICAgUENBTEwoUENBTExfRkFTVF9GVU5DVElPTik7CisgICAgaWYgKGFyZ2RlZnMgPT0gTlVMTCAmJiBjby0+Y29fYXJnY291bnQgPT0gbiAmJiBuaz09MCAmJgorICAgICAgICBjby0+Y29fZmxhZ3MgPT0gKENPX09QVElNSVpFRCB8IENPX05FV0xPQ0FMUyB8IENPX05PRlJFRSkpIHsKKyAgICAgICAgUHlGcmFtZU9iamVjdCAqZjsKKyAgICAgICAgUHlPYmplY3QgKnJldHZhbCA9IE5VTEw7CisgICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgICAgIFB5T2JqZWN0ICoqZmFzdGxvY2FscywgKipzdGFjazsKKyAgICAgICAgaW50IGk7CiAKLQkJUENBTEwoUENBTExfRkFTVEVSX0ZVTkNUSU9OKTsKLQkJYXNzZXJ0KGdsb2JhbHMgIT0gTlVMTCk7Ci0JCS8qIFhYWCBQZXJoYXBzIHdlIHNob3VsZCBjcmVhdGUgYSBzcGVjaWFsaXplZAotCQkgICBQeUZyYW1lX05ldygpIHRoYXQgZG9lc24ndCB0YWtlIGxvY2FscywgYnV0IGRvZXMKLQkJICAgdGFrZSBidWlsdGlucyB3aXRob3V0IHNhbml0eSBjaGVja2luZyB0aGVtLgotCQkqLwotCQlhc3NlcnQodHN0YXRlICE9IE5VTEwpOwotCQlmID0gUHlGcmFtZV9OZXcodHN0YXRlLCBjbywgZ2xvYmFscywgTlVMTCk7Ci0JCWlmIChmID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUENBTEwoUENBTExfRkFTVEVSX0ZVTkNUSU9OKTsKKyAgICAgICAgYXNzZXJ0KGdsb2JhbHMgIT0gTlVMTCk7CisgICAgICAgIC8qIFhYWCBQZXJoYXBzIHdlIHNob3VsZCBjcmVhdGUgYSBzcGVjaWFsaXplZAorICAgICAgICAgICBQeUZyYW1lX05ldygpIHRoYXQgZG9lc24ndCB0YWtlIGxvY2FscywgYnV0IGRvZXMKKyAgICAgICAgICAgdGFrZSBidWlsdGlucyB3aXRob3V0IHNhbml0eSBjaGVja2luZyB0aGVtLgorICAgICAgICAqLworICAgICAgICBhc3NlcnQodHN0YXRlICE9IE5VTEwpOworICAgICAgICBmID0gUHlGcmFtZV9OZXcodHN0YXRlLCBjbywgZ2xvYmFscywgTlVMTCk7CisgICAgICAgIGlmIChmID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwotCQlzdGFjayA9ICgqcHBfc3RhY2spIC0gbjsKKyAgICAgICAgZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKKyAgICAgICAgc3RhY2sgPSAoKnBwX3N0YWNrKSAtIG47CiAKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJUHlfSU5DUkVGKCpzdGFjayk7Ci0JCQlmYXN0bG9jYWxzW2ldID0gKnN0YWNrKys7Ci0JCX0KLQkJcmV0dmFsID0gUHlFdmFsX0V2YWxGcmFtZUV4KGYsMCk7Ci0JCSsrdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7Ci0JCVB5X0RFQ1JFRihmKTsKLQkJLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JaWYgKGFyZ2RlZnMgIT0gTlVMTCkgewotCQlkID0gJlB5VHVwbGVfR0VUX0lURU0oYXJnZGVmcywgMCk7Ci0JCW5kID0gUHlfU0laRShhcmdkZWZzKTsKLQl9Ci0JcmV0dXJuIFB5RXZhbF9FdmFsQ29kZUV4KGNvLCBnbG9iYWxzLAotCQkJCSAoUHlPYmplY3QgKilOVUxMLCAoKnBwX3N0YWNrKS1uLCBuYSwKLQkJCQkgKCpwcF9zdGFjayktMipuaywgbmssIGQsIG5kLAotCQkJCSBQeUZ1bmN0aW9uX0dFVF9DTE9TVVJFKGZ1bmMpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgUHlfSU5DUkVGKCpzdGFjayk7CisgICAgICAgICAgICBmYXN0bG9jYWxzW2ldID0gKnN0YWNrKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gUHlFdmFsX0V2YWxGcmFtZUV4KGYsMCk7CisgICAgICAgICsrdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CisgICAgICAgIFB5X0RFQ1JFRihmKTsKKyAgICAgICAgLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgICAgaWYgKGFyZ2RlZnMgIT0gTlVMTCkgeworICAgICAgICBkID0gJlB5VHVwbGVfR0VUX0lURU0oYXJnZGVmcywgMCk7CisgICAgICAgIG5kID0gUHlfU0laRShhcmdkZWZzKTsKKyAgICB9CisgICAgcmV0dXJuIFB5RXZhbF9FdmFsQ29kZUV4KGNvLCBnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlPYmplY3QgKilOVUxMLCAoKnBwX3N0YWNrKS1uLCBuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpwcF9zdGFjayktMipuaywgbmssIGQsIG5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZ1bmN0aW9uX0dFVF9DTE9TVVJFKGZ1bmMpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHVwZGF0ZV9rZXl3b3JkX2FyZ3MoUHlPYmplY3QgKm9yaWdfa3dkaWN0LCBpbnQgbmssIFB5T2JqZWN0ICoqKnBwX3N0YWNrLAogICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZnVuYykKIHsKLQlQeU9iamVjdCAqa3dkaWN0ID0gTlVMTDsKLQlpZiAob3JpZ19rd2RpY3QgPT0gTlVMTCkKLQkJa3dkaWN0ID0gUHlEaWN0X05ldygpOwotCWVsc2UgewotCQlrd2RpY3QgPSBQeURpY3RfQ29weShvcmlnX2t3ZGljdCk7Ci0JCVB5X0RFQ1JFRihvcmlnX2t3ZGljdCk7Ci0JfQotCWlmIChrd2RpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUgKC0tbmsgPj0gMCkgewotCQlpbnQgZXJyOwotCQlQeU9iamVjdCAqdmFsdWUgPSBFWFRfUE9QKCpwcF9zdGFjayk7Ci0JCVB5T2JqZWN0ICprZXkgPSBFWFRfUE9QKCpwcF9zdGFjayk7Ci0JCWlmIChQeURpY3RfR2V0SXRlbShrd2RpY3QsIGtleSkgIT0gTlVMTCkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkgICAgICIlLjIwMHMlcyBnb3QgbXVsdGlwbGUgdmFsdWVzICIKLQkJCQkgICAgICJmb3Iga2V5d29yZCBhcmd1bWVudCAnJS4yMDBzJyIsCi0JCQkJICAgICBQeUV2YWxfR2V0RnVuY05hbWUoZnVuYyksCi0JCQkJICAgICBQeUV2YWxfR2V0RnVuY0Rlc2MoZnVuYyksCi0JCQkJICAgICBQeVN0cmluZ19Bc1N0cmluZyhrZXkpKTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCVB5X0RFQ1JFRihrd2RpY3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJZXJyID0gUHlEaWN0X1NldEl0ZW0oa3dkaWN0LCBrZXksIHZhbHVlKTsKLQkJUHlfREVDUkVGKGtleSk7Ci0JCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCWlmIChlcnIpIHsKLQkJCVB5X0RFQ1JFRihrd2RpY3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIGt3ZGljdDsKKyAgICBQeU9iamVjdCAqa3dkaWN0ID0gTlVMTDsKKyAgICBpZiAob3JpZ19rd2RpY3QgPT0gTlVMTCkKKyAgICAgICAga3dkaWN0ID0gUHlEaWN0X05ldygpOworICAgIGVsc2UgeworICAgICAgICBrd2RpY3QgPSBQeURpY3RfQ29weShvcmlnX2t3ZGljdCk7CisgICAgICAgIFB5X0RFQ1JFRihvcmlnX2t3ZGljdCk7CisgICAgfQorICAgIGlmIChrd2RpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2hpbGUgKC0tbmsgPj0gMCkgeworICAgICAgICBpbnQgZXJyOworICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBFWFRfUE9QKCpwcF9zdGFjayk7CisgICAgICAgIFB5T2JqZWN0ICprZXkgPSBFWFRfUE9QKCpwcF9zdGFjayk7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbShrd2RpY3QsIGtleSkgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzJXMgZ290IG11bHRpcGxlIHZhbHVlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBrZXl3b3JkIGFyZ3VtZW50ICclLjIwMHMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0RnVuY05hbWUoZnVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKGtleSkpOworICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgUHlfREVDUkVGKGt3ZGljdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbShrd2RpY3QsIGtleSwgdmFsdWUpOworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgUHlfREVDUkVGKGt3ZGljdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ga3dkaWN0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogdXBkYXRlX3N0YXJfYXJncyhpbnQgbnN0YWNrLCBpbnQgbnN0YXIsIFB5T2JqZWN0ICpzdGFyYXJnLAotCQkgUHlPYmplY3QgKioqcHBfc3RhY2spCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqKnBwX3N0YWNrKQogewotCVB5T2JqZWN0ICpjYWxsYXJncywgKnc7CisgICAgUHlPYmplY3QgKmNhbGxhcmdzLCAqdzsKIAotCWNhbGxhcmdzID0gUHlUdXBsZV9OZXcobnN0YWNrICsgbnN0YXIpOwotCWlmIChjYWxsYXJncyA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAobnN0YXIpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuc3RhcjsgaSsrKSB7Ci0JCQlQeU9iamVjdCAqYSA9IFB5VHVwbGVfR0VUX0lURU0oc3RhcmFyZywgaSk7Ci0JCQlQeV9JTkNSRUYoYSk7Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBuc3RhY2sgKyBpLCBhKTsKLQkJfQotCX0KLQl3aGlsZSAoLS1uc3RhY2sgPj0gMCkgewotCQl3ID0gRVhUX1BPUCgqcHBfc3RhY2spOwotCQlQeVR1cGxlX1NFVF9JVEVNKGNhbGxhcmdzLCBuc3RhY2ssIHcpOwotCX0KLQlyZXR1cm4gY2FsbGFyZ3M7CisgICAgY2FsbGFyZ3MgPSBQeVR1cGxlX05ldyhuc3RhY2sgKyBuc3Rhcik7CisgICAgaWYgKGNhbGxhcmdzID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChuc3RhcikgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zdGFyOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICphID0gUHlUdXBsZV9HRVRfSVRFTShzdGFyYXJnLCBpKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihhKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIG5zdGFjayArIGksIGEpOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlICgtLW5zdGFjayA+PSAwKSB7CisgICAgICAgIHcgPSBFWFRfUE9QKCpwcF9zdGFjayk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oY2FsbGFyZ3MsIG5zdGFjaywgdyk7CisgICAgfQorICAgIHJldHVybiBjYWxsYXJnczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGxvYWRfYXJncyhQeU9iamVjdCAqKipwcF9zdGFjaywgaW50IG5hKQogewotCVB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcobmEpOwotCVB5T2JqZWN0ICp3OworICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcobmEpOworICAgIFB5T2JqZWN0ICp3OwogCi0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUgKC0tbmEgPj0gMCkgewotCQl3ID0gRVhUX1BPUCgqcHBfc3RhY2spOwotCQlQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIG5hLCB3KTsKLQl9Ci0JcmV0dXJuIGFyZ3M7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2hpbGUgKC0tbmEgPj0gMCkgeworICAgICAgICB3ID0gRVhUX1BPUCgqcHBfc3RhY2spOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIG5hLCB3KTsKKyAgICB9CisgICAgcmV0dXJuIGFyZ3M7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb19jYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqKipwcF9zdGFjaywgaW50IG5hLCBpbnQgbmspCiB7Ci0JUHlPYmplY3QgKmNhbGxhcmdzID0gTlVMTDsKLQlQeU9iamVjdCAqa3dkaWN0ID0gTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqY2FsbGFyZ3MgPSBOVUxMOworICAgIFB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0JaWYgKG5rID4gMCkgewotCQlrd2RpY3QgPSB1cGRhdGVfa2V5d29yZF9hcmdzKE5VTEwsIG5rLCBwcF9zdGFjaywgZnVuYyk7Ci0JCWlmIChrd2RpY3QgPT0gTlVMTCkKLQkJCWdvdG8gY2FsbF9mYWlsOwotCX0KLQljYWxsYXJncyA9IGxvYWRfYXJncyhwcF9zdGFjaywgbmEpOwotCWlmIChjYWxsYXJncyA9PSBOVUxMKQotCQlnb3RvIGNhbGxfZmFpbDsKKyAgICBpZiAobmsgPiAwKSB7CisgICAgICAgIGt3ZGljdCA9IHVwZGF0ZV9rZXl3b3JkX2FyZ3MoTlVMTCwgbmssIHBwX3N0YWNrLCBmdW5jKTsKKyAgICAgICAgaWYgKGt3ZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBjYWxsX2ZhaWw7CisgICAgfQorICAgIGNhbGxhcmdzID0gbG9hZF9hcmdzKHBwX3N0YWNrLCBuYSk7CisgICAgaWYgKGNhbGxhcmdzID09IE5VTEwpCisgICAgICAgIGdvdG8gY2FsbF9mYWlsOwogI2lmZGVmIENBTExfUFJPRklMRQotCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgdG8gbG9vayBhdCB0aGUgdHlwZSBvZiBmdW5jIHRvCi0JICAgdXBkYXRlIHRoZSBjYWxsIHN0YXRzIHByb3Blcmx5LiAgRG8gaXQgaGVyZSBzbyBhcyB0byBhdm9pZAotCSAgIGV4cG9zaW5nIHRoZSBjYWxsIHN0YXRzIG1hY2hpbmVyeSBvdXRzaWRlIGNldmFsLmMKLQkqLwotCWlmIChQeUZ1bmN0aW9uX0NoZWNrKGZ1bmMpKQotCQlQQ0FMTChQQ0FMTF9GVU5DVElPTik7Ci0JZWxzZSBpZiAoUHlNZXRob2RfQ2hlY2soZnVuYykpCi0JCVBDQUxMKFBDQUxMX01FVEhPRCk7Ci0JZWxzZSBpZiAoUHlUeXBlX0NoZWNrKGZ1bmMpKQotCQlQQ0FMTChQQ0FMTF9UWVBFKTsKLQllbHNlIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkKLQkJUENBTEwoUENBTExfQ0ZVTkNUSU9OKTsKLQllbHNlCi0JCVBDQUxMKFBDQUxMX09USEVSKTsKKyAgICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHRvIGxvb2sgYXQgdGhlIHR5cGUgb2YgZnVuYyB0bworICAgICAgIHVwZGF0ZSB0aGUgY2FsbCBzdGF0cyBwcm9wZXJseS4gIERvIGl0IGhlcmUgc28gYXMgdG8gYXZvaWQKKyAgICAgICBleHBvc2luZyB0aGUgY2FsbCBzdGF0cyBtYWNoaW5lcnkgb3V0c2lkZSBjZXZhbC5jCisgICAgKi8KKyAgICBpZiAoUHlGdW5jdGlvbl9DaGVjayhmdW5jKSkKKyAgICAgICAgUENBTEwoUENBTExfRlVOQ1RJT04pOworICAgIGVsc2UgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpKQorICAgICAgICBQQ0FMTChQQ0FMTF9NRVRIT0QpOworICAgIGVsc2UgaWYgKFB5VHlwZV9DaGVjayhmdW5jKSkKKyAgICAgICAgUENBTEwoUENBTExfVFlQRSk7CisgICAgZWxzZSBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpCisgICAgICAgIFBDQUxMKFBDQUxMX0NGVU5DVElPTik7CisgICAgZWxzZQorICAgICAgICBQQ0FMTChQQ0FMTF9PVEhFUik7CiAjZW5kaWYKLQlpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpIHsKLQkJUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQkJQ19UUkFDRShyZXN1bHQsIFB5Q0Z1bmN0aW9uX0NhbGwoZnVuYywgY2FsbGFyZ3MsIGt3ZGljdCkpOwotCX0KLQllbHNlCi0JCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgY2FsbGFyZ3MsIGt3ZGljdCk7CisgICAgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKSB7CisgICAgICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgICAgIENfVFJBQ0UocmVzdWx0LCBQeUNGdW5jdGlvbl9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpOwogIGNhbGxfZmFpbDoKLQlQeV9YREVDUkVGKGNhbGxhcmdzKTsKLQlQeV9YREVDUkVGKGt3ZGljdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGNhbGxhcmdzKTsKKyAgICBQeV9YREVDUkVGKGt3ZGljdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGV4dF9kb19jYWxsKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqKipwcF9zdGFjaywgaW50IGZsYWdzLCBpbnQgbmEsIGludCBuaykKIHsKLQlpbnQgbnN0YXIgPSAwOwotCVB5T2JqZWN0ICpjYWxsYXJncyA9IE5VTEw7Ci0JUHlPYmplY3QgKnN0YXJhcmcgPSBOVUxMOwotCVB5T2JqZWN0ICprd2RpY3QgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIGludCBuc3RhciA9IDA7CisgICAgUHlPYmplY3QgKmNhbGxhcmdzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc3RhcmFyZyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmt3ZGljdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLQlpZiAoZmxhZ3MgJiBDQUxMX0ZMQUdfS1cpIHsKLQkJa3dkaWN0ID0gRVhUX1BPUCgqcHBfc3RhY2spOwotCQlpZiAoIVB5RGljdF9DaGVjayhrd2RpY3QpKSB7Ci0JCQlQeU9iamVjdCAqZDsKLQkJCWQgPSBQeURpY3RfTmV3KCk7Ci0JCQlpZiAoZCA9PSBOVUxMKQotCQkJCWdvdG8gZXh0X2NhbGxfZmFpbDsKLQkJCWlmIChQeURpY3RfVXBkYXRlKGQsIGt3ZGljdCkgIT0gMCkgewotCQkJCVB5X0RFQ1JFRihkKTsKLQkJCQkvKiBQeURpY3RfVXBkYXRlIHJhaXNlcyBhdHRyaWJ1dGUKLQkJCQkgKiBlcnJvciAocGVyY29sYXRlZCBmcm9tIGFuIGF0dGVtcHQKLQkJCQkgKiB0byBnZXQgJ2tleXMnIGF0dHJpYnV0ZSkgaW5zdGVhZCBvZgotCQkJCSAqIGEgdHlwZSBlcnJvciBpZiBpdHMgc2Vjb25kIGFyZ3VtZW50Ci0JCQkJICogaXMgbm90IGEgbWFwcGluZy4KLQkJCQkgKi8KLQkJCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19BdHRyaWJ1dGVFcnJvcikpIHsKLQkJCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSAgICAgIiUuMjAwcyUuMjAwcyBhcmd1bWVudCBhZnRlciAqKiAiCi0JCQkJCQkgICAgICJtdXN0IGJlIGEgbWFwcGluZywgbm90ICUuMjAwcyIsCi0JCQkJCQkgICAgIFB5RXZhbF9HZXRGdW5jTmFtZShmdW5jKSwKLQkJCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAotCQkJCQkJICAgICBrd2RpY3QtPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJCX0KLQkJCQlnb3RvIGV4dF9jYWxsX2ZhaWw7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoa3dkaWN0KTsKLQkJCWt3ZGljdCA9IGQ7Ci0JCX0KLQl9Ci0JaWYgKGZsYWdzICYgQ0FMTF9GTEFHX1ZBUikgewotCQlzdGFyYXJnID0gRVhUX1BPUCgqcHBfc3RhY2spOwotCQlpZiAoIVB5VHVwbGVfQ2hlY2soc3RhcmFyZykpIHsKLQkJCVB5T2JqZWN0ICp0ID0gTlVMTDsKLQkJCXQgPSBQeVNlcXVlbmNlX1R1cGxlKHN0YXJhcmcpOwotCQkJaWYgKHQgPT0gTlVMTCkgewotCQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKLQkJCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSAgICAgIiUuMjAwcyUuMjAwcyBhcmd1bWVudCBhZnRlciAqICIKLQkJCQkJCSAgICAgIm11c3QgYmUgYSBzZXF1ZW5jZSwgbm90ICUyMDBzIiwKLQkJCQkJCSAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAotCQkJCQkJICAgICBQeUV2YWxfR2V0RnVuY0Rlc2MoZnVuYyksCi0JCQkJCQkgICAgIHN0YXJhcmctPm9iX3R5cGUtPnRwX25hbWUpOwotCQkJCX0KLQkJCQlnb3RvIGV4dF9jYWxsX2ZhaWw7Ci0JCQl9Ci0JCQlQeV9ERUNSRUYoc3RhcmFyZyk7Ci0JCQlzdGFyYXJnID0gdDsKLQkJfQotCQluc3RhciA9IFB5VHVwbGVfR0VUX1NJWkUoc3RhcmFyZyk7Ci0JfQotCWlmIChuayA+IDApIHsKLQkJa3dkaWN0ID0gdXBkYXRlX2tleXdvcmRfYXJncyhrd2RpY3QsIG5rLCBwcF9zdGFjaywgZnVuYyk7Ci0JCWlmIChrd2RpY3QgPT0gTlVMTCkKLQkJCWdvdG8gZXh0X2NhbGxfZmFpbDsKLQl9Ci0JY2FsbGFyZ3MgPSB1cGRhdGVfc3Rhcl9hcmdzKG5hLCBuc3Rhciwgc3RhcmFyZywgcHBfc3RhY2spOwotCWlmIChjYWxsYXJncyA9PSBOVUxMKQotCQlnb3RvIGV4dF9jYWxsX2ZhaWw7CisgICAgaWYgKGZsYWdzICYgQ0FMTF9GTEFHX0tXKSB7CisgICAgICAgIGt3ZGljdCA9IEVYVF9QT1AoKnBwX3N0YWNrKTsKKyAgICAgICAgaWYgKCFQeURpY3RfQ2hlY2soa3dkaWN0KSkgeworICAgICAgICAgICAgUHlPYmplY3QgKmQ7CisgICAgICAgICAgICBkID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKGQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGV4dF9jYWxsX2ZhaWw7CisgICAgICAgICAgICBpZiAoUHlEaWN0X1VwZGF0ZShkLCBrd2RpY3QpICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZCk7CisgICAgICAgICAgICAgICAgLyogUHlEaWN0X1VwZGF0ZSByYWlzZXMgYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICogZXJyb3IgKHBlcmNvbGF0ZWQgZnJvbSBhbiBhdHRlbXB0CisgICAgICAgICAgICAgICAgICogdG8gZ2V0ICdrZXlzJyBhdHRyaWJ1dGUpIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgKiBhIHR5cGUgZXJyb3IgaWYgaXRzIHNlY29uZCBhcmd1bWVudAorICAgICAgICAgICAgICAgICAqIGlzIG5vdCBhIG1hcHBpbmcuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzJS4yMDBzIGFyZ3VtZW50IGFmdGVyICoqICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGEgbWFwcGluZywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0RnVuY05hbWUoZnVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0RnVuY0Rlc2MoZnVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2RpY3QtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIGV4dF9jYWxsX2ZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoa3dkaWN0KTsKKyAgICAgICAgICAgIGt3ZGljdCA9IGQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZsYWdzICYgQ0FMTF9GTEFHX1ZBUikgeworICAgICAgICBzdGFyYXJnID0gRVhUX1BPUCgqcHBfc3RhY2spOworICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soc3RhcmFyZykpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp0ID0gTlVMTDsKKyAgICAgICAgICAgIHQgPSBQeVNlcXVlbmNlX1R1cGxlKHN0YXJhcmcpOworICAgICAgICAgICAgaWYgKHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlLjIwMHMlLjIwMHMgYXJndW1lbnQgYWZ0ZXIgKiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhIHNlcXVlbmNlLCBub3QgJTIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNOYW1lKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFdmFsX0dldEZ1bmNEZXNjKGZ1bmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcmFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gZXh0X2NhbGxfZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFyYXJnKTsKKyAgICAgICAgICAgIHN0YXJhcmcgPSB0OworICAgICAgICB9CisgICAgICAgIG5zdGFyID0gUHlUdXBsZV9HRVRfU0laRShzdGFyYXJnKTsKKyAgICB9CisgICAgaWYgKG5rID4gMCkgeworICAgICAgICBrd2RpY3QgPSB1cGRhdGVfa2V5d29yZF9hcmdzKGt3ZGljdCwgbmssIHBwX3N0YWNrLCBmdW5jKTsKKyAgICAgICAgaWYgKGt3ZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBleHRfY2FsbF9mYWlsOworICAgIH0KKyAgICBjYWxsYXJncyA9IHVwZGF0ZV9zdGFyX2FyZ3MobmEsIG5zdGFyLCBzdGFyYXJnLCBwcF9zdGFjayk7CisgICAgaWYgKGNhbGxhcmdzID09IE5VTEwpCisgICAgICAgIGdvdG8gZXh0X2NhbGxfZmFpbDsKICNpZmRlZiBDQUxMX1BST0ZJTEUKLQkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHRvIGxvb2sgYXQgdGhlIHR5cGUgb2YgZnVuYyB0bwotCSAgIHVwZGF0ZSB0aGUgY2FsbCBzdGF0cyBwcm9wZXJseS4gIERvIGl0IGhlcmUgc28gYXMgdG8gYXZvaWQKLQkgICBleHBvc2luZyB0aGUgY2FsbCBzdGF0cyBtYWNoaW5lcnkgb3V0c2lkZSBjZXZhbC5jCi0JKi8KLQlpZiAoUHlGdW5jdGlvbl9DaGVjayhmdW5jKSkKLQkJUENBTEwoUENBTExfRlVOQ1RJT04pOwotCWVsc2UgaWYgKFB5TWV0aG9kX0NoZWNrKGZ1bmMpKQotCQlQQ0FMTChQQ0FMTF9NRVRIT0QpOwotCWVsc2UgaWYgKFB5VHlwZV9DaGVjayhmdW5jKSkKLQkJUENBTEwoUENBTExfVFlQRSk7Ci0JZWxzZSBpZiAoUHlDRnVuY3Rpb25fQ2hlY2soZnVuYykpCi0JCVBDQUxMKFBDQUxMX0NGVU5DVElPTik7Ci0JZWxzZQotCQlQQ0FMTChQQ0FMTF9PVEhFUik7CisgICAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB0byBsb29rIGF0IHRoZSB0eXBlIG9mIGZ1bmMgdG8KKyAgICAgICB1cGRhdGUgdGhlIGNhbGwgc3RhdHMgcHJvcGVybHkuICBEbyBpdCBoZXJlIHNvIGFzIHRvIGF2b2lkCisgICAgICAgZXhwb3NpbmcgdGhlIGNhbGwgc3RhdHMgbWFjaGluZXJ5IG91dHNpZGUgY2V2YWwuYworICAgICovCisgICAgaWYgKFB5RnVuY3Rpb25fQ2hlY2soZnVuYykpCisgICAgICAgIFBDQUxMKFBDQUxMX0ZVTkNUSU9OKTsKKyAgICBlbHNlIGlmIChQeU1ldGhvZF9DaGVjayhmdW5jKSkKKyAgICAgICAgUENBTEwoUENBTExfTUVUSE9EKTsKKyAgICBlbHNlIGlmIChQeVR5cGVfQ2hlY2soZnVuYykpCisgICAgICAgIFBDQUxMKFBDQUxMX1RZUEUpOworICAgIGVsc2UgaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKQorICAgICAgICBQQ0FMTChQQ0FMTF9DRlVOQ1RJT04pOworICAgIGVsc2UKKyAgICAgICAgUENBTEwoUENBTExfT1RIRVIpOwogI2VuZGlmCi0JaWYgKFB5Q0Z1bmN0aW9uX0NoZWNrKGZ1bmMpKSB7Ci0JCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JCUNfVFJBQ0UocmVzdWx0LCBQeUNGdW5jdGlvbl9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpKTsKLQl9Ci0JZWxzZQotCQlyZXN1bHQgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGNhbGxhcmdzLCBrd2RpY3QpOworICAgIGlmIChQeUNGdW5jdGlvbl9DaGVjayhmdW5jKSkgeworICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgICAgICBDX1RSQUNFKHJlc3VsdCwgUHlDRnVuY3Rpb25fQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbChmdW5jLCBjYWxsYXJncywga3dkaWN0KTsKIGV4dF9jYWxsX2ZhaWw6Ci0JUHlfWERFQ1JFRihjYWxsYXJncyk7Ci0JUHlfWERFQ1JFRihrd2RpY3QpOwotCVB5X1hERUNSRUYoc3RhcmFyZyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeV9YREVDUkVGKGNhbGxhcmdzKTsKKyAgICBQeV9YREVDUkVGKGt3ZGljdCk7CisgICAgUHlfWERFQ1JFRihzdGFyYXJnKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBFeHRyYWN0IGEgc2xpY2UgaW5kZXggZnJvbSBhIFB5SW50IG9yIFB5TG9uZyBvciBhbiBvYmplY3Qgd2l0aCB0aGUKQEAgLTQwODEsOTMgKzQwODEsOTMgQEAKIGludAogX1B5RXZhbF9TbGljZUluZGV4KFB5T2JqZWN0ICp2LCBQeV9zc2l6ZV90ICpwaSkKIHsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCVB5X3NzaXplX3QgeDsKLQkJaWYgKFB5SW50X0NoZWNrKHYpKSB7Ci0JCQkvKiBYWFgobm5vcndpdHopOiBJIHRoaW5rIFB5SW50X0FTX0xPTkcgaXMgY29ycmVjdCwKLQkJCSAgIGhvd2V2ZXIsIGl0IGxvb2tzIGxpa2UgaXQgc2hvdWxkIGJlIEFzU3NpemVfdC4KLQkJCSAgIFRoZXJlIHNob3VsZCBiZSBhIGNvbW1lbnQgaGVyZSBleHBsYWluaW5nIHdoeS4KLQkJCSovCi0JCQl4ID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJfQotCQllbHNlIGlmIChQeUluZGV4X0NoZWNrKHYpKSB7Ci0JCQl4ID0gUHlOdW1iZXJfQXNTc2l6ZV90KHYsIE5VTEwpOwotCQkJaWYgKHggPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJzbGljZSBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMgb3IgIgotCQkJCQkiTm9uZSBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2QiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCSpwaSA9IHg7Ci0JfQotCXJldHVybiAxOworICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfc3NpemVfdCB4OworICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIC8qIFhYWChubm9yd2l0eik6IEkgdGhpbmsgUHlJbnRfQVNfTE9ORyBpcyBjb3JyZWN0LAorICAgICAgICAgICAgICAgaG93ZXZlciwgaXQgbG9va3MgbGlrZSBpdCBzaG91bGQgYmUgQXNTc2l6ZV90LgorICAgICAgICAgICAgICAgVGhlcmUgc2hvdWxkIGJlIGEgY29tbWVudCBoZXJlIGV4cGxhaW5pbmcgd2h5LgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHggPSBQeUludF9BU19MT05HKHYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5SW5kZXhfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIHggPSBQeU51bWJlcl9Bc1NzaXplX3QodiwgTlVMTCk7CisgICAgICAgICAgICBpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2xpY2UgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uZSBvciBoYXZlIGFuIF9faW5kZXhfXyBtZXRob2QiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgICpwaSA9IHg7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAjdW5kZWYgSVNJTkRFWAogI2RlZmluZSBJU0lOREVYKHgpICgoeCkgPT0gTlVMTCB8fCBcCi0JCSAgICBQeUludF9DaGVjayh4KSB8fCBQeUxvbmdfQ2hlY2soeCkgfHwgUHlJbmRleF9DaGVjayh4KSkKKyAgICAgICAgICAgICAgICAgICAgUHlJbnRfQ2hlY2soeCkgfHwgUHlMb25nX0NoZWNrKHgpIHx8IFB5SW5kZXhfQ2hlY2soeCkpCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcHBseV9zbGljZShQeU9iamVjdCAqdSwgUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KSAvKiByZXR1cm4gdVt2OnddICovCiB7Ci0JUHlUeXBlT2JqZWN0ICp0cCA9IHUtPm9iX3R5cGU7Ci0JUHlTZXF1ZW5jZU1ldGhvZHMgKnNxID0gdHAtPnRwX2FzX3NlcXVlbmNlOworICAgIFB5VHlwZU9iamVjdCAqdHAgPSB1LT5vYl90eXBlOworICAgIFB5U2VxdWVuY2VNZXRob2RzICpzcSA9IHRwLT50cF9hc19zZXF1ZW5jZTsKIAotCWlmIChzcSAmJiBzcS0+c3Ffc2xpY2UgJiYgSVNJTkRFWCh2KSAmJiBJU0lOREVYKHcpKSB7Ci0JCVB5X3NzaXplX3QgaWxvdyA9IDAsIGloaWdoID0gUFlfU1NJWkVfVF9NQVg7Ci0JCWlmICghX1B5RXZhbF9TbGljZUluZGV4KHYsICZpbG93KSkKLQkJCXJldHVybiBOVUxMOwotCQlpZiAoIV9QeUV2YWxfU2xpY2VJbmRleCh3LCAmaWhpZ2gpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXJldHVybiBQeVNlcXVlbmNlX0dldFNsaWNlKHUsIGlsb3csIGloaWdoKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpzbGljZSA9IFB5U2xpY2VfTmV3KHYsIHcsIE5VTEwpOwotCQlpZiAoc2xpY2UgIT0gTlVMTCkgewotCQkJUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X0dldEl0ZW0odSwgc2xpY2UpOwotCQkJUHlfREVDUkVGKHNsaWNlKTsKLQkJCXJldHVybiByZXM7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChzcSAmJiBzcS0+c3Ffc2xpY2UgJiYgSVNJTkRFWCh2KSAmJiBJU0lOREVYKHcpKSB7CisgICAgICAgIFB5X3NzaXplX3QgaWxvdyA9IDAsIGloaWdoID0gUFlfU1NJWkVfVF9NQVg7CisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KHYsICZpbG93KSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIV9QeUV2YWxfU2xpY2VJbmRleCh3LCAmaWhpZ2gpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBQeVNlcXVlbmNlX0dldFNsaWNlKHUsIGlsb3csIGloaWdoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpzbGljZSA9IFB5U2xpY2VfTmV3KHYsIHcsIE5VTEwpOworICAgICAgICBpZiAoc2xpY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5T2JqZWN0X0dldEl0ZW0odSwgc2xpY2UpOworICAgICAgICAgICAgUHlfREVDUkVGKHNsaWNlKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBhc3NpZ25fc2xpY2UoUHlPYmplY3QgKnUsIFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywgUHlPYmplY3QgKngpCi0JLyogdVt2OnddID0geCAqLworICAgIC8qIHVbdjp3XSA9IHggKi8KIHsKLQlQeVR5cGVPYmplY3QgKnRwID0gdS0+b2JfdHlwZTsKLQlQeVNlcXVlbmNlTWV0aG9kcyAqc3EgPSB0cC0+dHBfYXNfc2VxdWVuY2U7CisgICAgUHlUeXBlT2JqZWN0ICp0cCA9IHUtPm9iX3R5cGU7CisgICAgUHlTZXF1ZW5jZU1ldGhvZHMgKnNxID0gdHAtPnRwX2FzX3NlcXVlbmNlOwogCi0JaWYgKHNxICYmIHNxLT5zcV9hc3Nfc2xpY2UgJiYgSVNJTkRFWCh2KSAmJiBJU0lOREVYKHcpKSB7Ci0JCVB5X3NzaXplX3QgaWxvdyA9IDAsIGloaWdoID0gUFlfU1NJWkVfVF9NQVg7Ci0JCWlmICghX1B5RXZhbF9TbGljZUluZGV4KHYsICZpbG93KSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgodywgJmloaWdoKSkKLQkJCXJldHVybiAtMTsKLQkJaWYgKHggPT0gTlVMTCkKLQkJCXJldHVybiBQeVNlcXVlbmNlX0RlbFNsaWNlKHUsIGlsb3csIGloaWdoKTsKLQkJZWxzZQotCQkJcmV0dXJuIFB5U2VxdWVuY2VfU2V0U2xpY2UodSwgaWxvdywgaWhpZ2gsIHgpOwotCX0KLQllbHNlIHsKLQkJUHlPYmplY3QgKnNsaWNlID0gUHlTbGljZV9OZXcodiwgdywgTlVMTCk7Ci0JCWlmIChzbGljZSAhPSBOVUxMKSB7Ci0JCQlpbnQgcmVzOwotCQkJaWYgKHggIT0gTlVMTCkKLQkJCQlyZXMgPSBQeU9iamVjdF9TZXRJdGVtKHUsIHNsaWNlLCB4KTsKLQkJCWVsc2UKLQkJCQlyZXMgPSBQeU9iamVjdF9EZWxJdGVtKHUsIHNsaWNlKTsKLQkJCVB5X0RFQ1JFRihzbGljZSk7Ci0JCQlyZXR1cm4gcmVzOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAtMTsKLQl9CisgICAgaWYgKHNxICYmIHNxLT5zcV9hc3Nfc2xpY2UgJiYgSVNJTkRFWCh2KSAmJiBJU0lOREVYKHcpKSB7CisgICAgICAgIFB5X3NzaXplX3QgaWxvdyA9IDAsIGloaWdoID0gUFlfU1NJWkVfVF9NQVg7CisgICAgICAgIGlmICghX1B5RXZhbF9TbGljZUluZGV4KHYsICZpbG93KSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKCFfUHlFdmFsX1NsaWNlSW5kZXgodywgJmloaWdoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHggPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBQeVNlcXVlbmNlX0RlbFNsaWNlKHUsIGlsb3csIGloaWdoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFB5U2VxdWVuY2VfU2V0U2xpY2UodSwgaWxvdywgaWhpZ2gsIHgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKnNsaWNlID0gUHlTbGljZV9OZXcodiwgdywgTlVMTCk7CisgICAgICAgIGlmIChzbGljZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgaWYgKHggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9TZXRJdGVtKHUsIHNsaWNlLCB4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9EZWxJdGVtKHUsIHNsaWNlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzbGljZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiB9CiAKICNkZWZpbmUgUHkza0V4Y2VwdGlvbkNsYXNzX0NoZWNrKHgpICAgICBcCkBAIC00MTc1LDQxNCArNDE3NSw0MTQgQEAKICAgICAgUHlUeXBlX0Zhc3RTdWJjbGFzcygoUHlUeXBlT2JqZWN0KikoeCksIFB5X1RQRkxBR1NfQkFTRV9FWENfU1VCQ0xBU1MpKQogCiAjZGVmaW5lIENBTk5PVF9DQVRDSF9NU0cgImNhdGNoaW5nIGNsYXNzZXMgdGhhdCBkb24ndCBpbmhlcml0IGZyb20gIiBcCi0JCQkgIkJhc2VFeGNlcHRpb24gaXMgbm90IGFsbG93ZWQgaW4gMy54IgorICAgICAgICAgICAgICAgICAgICAgICAgICJCYXNlRXhjZXB0aW9uIGlzIG5vdCBhbGxvd2VkIGluIDMueCIKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNtcF9vdXRjb21lKGludCBvcCwgcmVnaXN0ZXIgUHlPYmplY3QgKnYsIHJlZ2lzdGVyIFB5T2JqZWN0ICp3KQogewotCWludCByZXMgPSAwOwotCXN3aXRjaCAob3ApIHsKLQljYXNlIFB5Q21wX0lTOgotCQlyZXMgPSAodiA9PSB3KTsKLQkJYnJlYWs7Ci0JY2FzZSBQeUNtcF9JU19OT1Q6Ci0JCXJlcyA9ICh2ICE9IHcpOwotCQlicmVhazsKLQljYXNlIFB5Q21wX0lOOgotCQlyZXMgPSBQeVNlcXVlbmNlX0NvbnRhaW5zKHcsIHYpOwotCQlpZiAocmVzIDwgMCkKLQkJCXJldHVybiBOVUxMOwotCQlicmVhazsKLQljYXNlIFB5Q21wX05PVF9JTjoKLQkJcmVzID0gUHlTZXF1ZW5jZV9Db250YWlucyh3LCB2KTsKLQkJaWYgKHJlcyA8IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJcmVzID0gIXJlczsKLQkJYnJlYWs7Ci0JY2FzZSBQeUNtcF9FWENfTUFUQ0g6Ci0JCWlmIChQeVR1cGxlX0NoZWNrKHcpKSB7Ci0JCQlQeV9zc2l6ZV90IGksIGxlbmd0aDsKLQkJCWxlbmd0aCA9IFB5VHVwbGVfU2l6ZSh3KTsKLQkJCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkgewotCQkJCVB5T2JqZWN0ICpleGMgPSBQeVR1cGxlX0dFVF9JVEVNKHcsIGkpOwotCQkJCWlmIChQeVN0cmluZ19DaGVjayhleGMpKSB7Ci0JCQkJCWludCByZXRfdmFsOwotCQkJCQlyZXRfdmFsID0gUHlFcnJfV2FybkV4KAotCQkJCQkJUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCQkJImNhdGNoaW5nIG9mIHN0cmluZyAiCi0JCQkJCQkiZXhjZXB0aW9ucyBpcyBkZXByZWNhdGVkIiwgMSk7Ci0JCQkJCWlmIChyZXRfdmFsIDwgMCkKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJCQllbHNlIGlmIChQeV9QeTNrV2FybmluZ0ZsYWcgICYmCi0JCQkJCSAhUHlUdXBsZV9DaGVjayhleGMpICYmCi0JCQkJCSAhUHkza0V4Y2VwdGlvbkNsYXNzX0NoZWNrKGV4YykpCi0JCQkJewotCQkJCQlpbnQgcmV0X3ZhbDsKLQkJCQkJcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKLQkJCQkJCVB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKLQkJCQkJCUNBTk5PVF9DQVRDSF9NU0csIDEpOwotCQkJCQlpZiAocmV0X3ZhbCA8IDApCi0JCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoUHlTdHJpbmdfQ2hlY2sodykpIHsKLQkJCQlpbnQgcmV0X3ZhbDsKLQkJCQlyZXRfdmFsID0gUHlFcnJfV2FybkV4KAotCQkJCQkJUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCQkJImNhdGNoaW5nIG9mIHN0cmluZyAiCi0JCQkJCQkiZXhjZXB0aW9ucyBpcyBkZXByZWNhdGVkIiwgMSk7Ci0JCQkJaWYgKHJldF92YWwgPCAwKQotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWVsc2UgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAgJiYKLQkJCQkgIVB5VHVwbGVfQ2hlY2sodykgJiYKLQkJCQkgIVB5M2tFeGNlcHRpb25DbGFzc19DaGVjayh3KSkKLQkJCXsKLQkJCQlpbnQgcmV0X3ZhbDsKLQkJCQlyZXRfdmFsID0gUHlFcnJfV2FybkV4KAotCQkJCQlQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCi0JCQkJCUNBTk5PVF9DQVRDSF9NU0csIDEpOwotCQkJCWlmIChyZXRfdmFsIDwgMCkKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJcmVzID0gUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKHYsIHcpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gUHlPYmplY3RfUmljaENvbXBhcmUodiwgdywgb3ApOwotCX0KLQl2ID0gcmVzID8gUHlfVHJ1ZSA6IFB5X0ZhbHNlOwotCVB5X0lOQ1JFRih2KTsKLQlyZXR1cm4gdjsKKyAgICBpbnQgcmVzID0gMDsKKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBQeUNtcF9JUzoKKyAgICAgICAgcmVzID0gKHYgPT0gdyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlDbXBfSVNfTk9UOgorICAgICAgICByZXMgPSAodiAhPSB3KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQeUNtcF9JTjoKKyAgICAgICAgcmVzID0gUHlTZXF1ZW5jZV9Db250YWlucyh3LCB2KTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQeUNtcF9OT1RfSU46CisgICAgICAgIHJlcyA9IFB5U2VxdWVuY2VfQ29udGFpbnModywgdik7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHJlcyA9ICFyZXM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUHlDbXBfRVhDX01BVENIOgorICAgICAgICBpZiAoUHlUdXBsZV9DaGVjayh3KSkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBpLCBsZW5ndGg7CisgICAgICAgICAgICBsZW5ndGggPSBQeVR1cGxlX1NpemUodyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqZXhjID0gUHlUdXBsZV9HRVRfSVRFTSh3LCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soZXhjKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYXRjaGluZyBvZiBzdHJpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnMgaXMgZGVwcmVjYXRlZCIsIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoUHlfUHkza1dhcm5pbmdGbGFnICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICFQeVR1cGxlX0NoZWNrKGV4YykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhUHkza0V4Y2VwdGlvbkNsYXNzX0NoZWNrKGV4YykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IFB5RXJyX1dhcm5FeCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTk5PVF9DQVRDSF9NU0csIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0X3ZhbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodykpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0X3ZhbDsKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gUHlFcnJfV2FybkV4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYXRjaGluZyBvZiBzdHJpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9ucyBpcyBkZXByZWNhdGVkIiwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHJldF92YWwgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKFB5X1B5M2tXYXJuaW5nRmxhZyAgJiYKKyAgICAgICAgICAgICAgICAgICAgICFQeVR1cGxlX0NoZWNrKHcpICYmCisgICAgICAgICAgICAgICAgICAgICAhUHkza0V4Y2VwdGlvbkNsYXNzX0NoZWNrKHcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCByZXRfdmFsOworICAgICAgICAgICAgICAgIHJldF92YWwgPSBQeUVycl9XYXJuRXgoCisgICAgICAgICAgICAgICAgICAgIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgQ0FOTk9UX0NBVENIX01TRywgMSk7CisgICAgICAgICAgICAgICAgaWYgKHJldF92YWwgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXMgPSBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXModiwgdyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZSh2LCB3LCBvcCk7CisgICAgfQorICAgIHYgPSByZXMgPyBQeV9UcnVlIDogUHlfRmFsc2U7CisgICAgUHlfSU5DUkVGKHYpOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wb3J0X2Zyb20oUHlPYmplY3QgKnYsIFB5T2JqZWN0ICpuYW1lKQogewotCVB5T2JqZWN0ICp4OworICAgIFB5T2JqZWN0ICp4OwogCi0JeCA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZSk7Ci0JaWYgKHggPT0gTlVMTCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJjYW5ub3QgaW1wb3J0IG5hbWUgJS4yMzBzIiwKLQkJCSAgICAgUHlTdHJpbmdfQXNTdHJpbmcobmFtZSkpOwotCX0KLQlyZXR1cm4geDsKKyAgICB4ID0gUHlPYmplY3RfR2V0QXR0cih2LCBuYW1lKTsKKyAgICBpZiAoeCA9PSBOVUxMICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgaW1wb3J0IG5hbWUgJS4yMzBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpKTsKKyAgICB9CisgICAgcmV0dXJuIHg7CiB9CiAKIHN0YXRpYyBpbnQKIGltcG9ydF9hbGxfZnJvbShQeU9iamVjdCAqbG9jYWxzLCBQeU9iamVjdCAqdikKIHsKLQlQeU9iamVjdCAqYWxsID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCAiX19hbGxfXyIpOwotCVB5T2JqZWN0ICpkaWN0LCAqbmFtZSwgKnZhbHVlOwotCWludCBza2lwX2xlYWRpbmdfdW5kZXJzY29yZXMgPSAwOwotCWludCBwb3MsIGVycjsKKyAgICBQeU9iamVjdCAqYWxsID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh2LCAiX19hbGxfXyIpOworICAgIFB5T2JqZWN0ICpkaWN0LCAqbmFtZSwgKnZhbHVlOworICAgIGludCBza2lwX2xlYWRpbmdfdW5kZXJzY29yZXMgPSAwOworICAgIGludCBwb3MsIGVycjsKIAotCWlmIChhbGwgPT0gTlVMTCkgewotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJcmV0dXJuIC0xOyAvKiBVbmV4cGVjdGVkIGVycm9yICovCi0JCVB5RXJyX0NsZWFyKCk7Ci0JCWRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsICJfX2RpY3RfXyIpOwotCQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQotCQkJCXJldHVybiAtMTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSJmcm9tLWltcG9ydC0qIG9iamVjdCBoYXMgbm8gX19kaWN0X18gYW5kIG5vIF9fYWxsX18iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlhbGwgPSBQeU1hcHBpbmdfS2V5cyhkaWN0KTsKLQkJUHlfREVDUkVGKGRpY3QpOwotCQlpZiAoYWxsID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCXNraXBfbGVhZGluZ191bmRlcnNjb3JlcyA9IDE7Ci0JfQorICAgIGlmIChhbGwgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgcmV0dXJuIC0xOyAvKiBVbmV4cGVjdGVkIGVycm9yICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHYsICJfX2RpY3RfXyIpOworICAgICAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICJmcm9tLWltcG9ydC0qIG9iamVjdCBoYXMgbm8gX19kaWN0X18gYW5kIG5vIF9fYWxsX18iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBhbGwgPSBQeU1hcHBpbmdfS2V5cyhkaWN0KTsKKyAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICBpZiAoYWxsID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHNraXBfbGVhZGluZ191bmRlcnNjb3JlcyA9IDE7CisgICAgfQogCi0JZm9yIChwb3MgPSAwLCBlcnIgPSAwOyA7IHBvcysrKSB7Ci0JCW5hbWUgPSBQeVNlcXVlbmNlX0dldEl0ZW0oYWxsLCBwb3MpOwotCQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW5kZXhFcnJvcikpCi0JCQkJZXJyID0gLTE7Ci0JCQllbHNlCi0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChza2lwX2xlYWRpbmdfdW5kZXJzY29yZXMgJiYKLQkJICAgIFB5U3RyaW5nX0NoZWNrKG5hbWUpICYmCi0JCSAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSlbMF0gPT0gJ18nKQotCQl7Ci0JCQlQeV9ERUNSRUYobmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQl2YWx1ZSA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZSk7Ci0JCWlmICh2YWx1ZSA9PSBOVUxMKQotCQkJZXJyID0gLTE7Ci0JCWVsc2UgaWYgKFB5RGljdF9DaGVja0V4YWN0KGxvY2FscykpCi0JCQllcnIgPSBQeURpY3RfU2V0SXRlbShsb2NhbHMsIG5hbWUsIHZhbHVlKTsKLQkJZWxzZQotCQkJZXJyID0gUHlPYmplY3RfU2V0SXRlbShsb2NhbHMsIG5hbWUsIHZhbHVlKTsKLQkJUHlfREVDUkVGKG5hbWUpOwotCQlQeV9YREVDUkVGKHZhbHVlKTsKLQkJaWYgKGVyciAhPSAwKQotCQkJYnJlYWs7Ci0JfQotCVB5X0RFQ1JFRihhbGwpOwotCXJldHVybiBlcnI7CisgICAgZm9yIChwb3MgPSAwLCBlcnIgPSAwOyA7IHBvcysrKSB7CisgICAgICAgIG5hbWUgPSBQeVNlcXVlbmNlX0dldEl0ZW0oYWxsLCBwb3MpOworICAgICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW5kZXhFcnJvcikpCisgICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChza2lwX2xlYWRpbmdfdW5kZXJzY29yZXMgJiYKKyAgICAgICAgICAgIFB5U3RyaW5nX0NoZWNrKG5hbWUpICYmCisgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSlbMF0gPT0gJ18nKQorICAgICAgICB7CisgICAgICAgICAgICBQeV9ERUNSRUYobmFtZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IFB5T2JqZWN0X0dldEF0dHIodiwgbmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKQorICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgIGVsc2UgaWYgKFB5RGljdF9DaGVja0V4YWN0KGxvY2FscykpCisgICAgICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbShsb2NhbHMsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJyID0gUHlPYmplY3RfU2V0SXRlbShsb2NhbHMsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgUHlfREVDUkVGKG5hbWUpOworICAgICAgICBQeV9YREVDUkVGKHZhbHVlKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFB5X0RFQ1JFRihhbGwpOworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBidWlsZF9jbGFzcyhQeU9iamVjdCAqbWV0aG9kcywgUHlPYmplY3QgKmJhc2VzLCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeU9iamVjdCAqbWV0YWNsYXNzID0gTlVMTCwgKnJlc3VsdCwgKmJhc2U7CisgICAgUHlPYmplY3QgKm1ldGFjbGFzcyA9IE5VTEwsICpyZXN1bHQsICpiYXNlOwogCi0JaWYgKFB5RGljdF9DaGVjayhtZXRob2RzKSkKLQkJbWV0YWNsYXNzID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobWV0aG9kcywgIl9fbWV0YWNsYXNzX18iKTsKLQlpZiAobWV0YWNsYXNzICE9IE5VTEwpCi0JCVB5X0lOQ1JFRihtZXRhY2xhc3MpOwotCWVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soYmFzZXMpICYmIFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpID4gMCkgewotCQliYXNlID0gUHlUdXBsZV9HRVRfSVRFTShiYXNlcywgMCk7Ci0JCW1ldGFjbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoYmFzZSwgIl9fY2xhc3NfXyIpOwotCQlpZiAobWV0YWNsYXNzID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQltZXRhY2xhc3MgPSAoUHlPYmplY3QgKiliYXNlLT5vYl90eXBlOwotCQkJUHlfSU5DUkVGKG1ldGFjbGFzcyk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpnID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKLQkJaWYgKGcgIT0gTlVMTCAmJiBQeURpY3RfQ2hlY2soZykpCi0JCQltZXRhY2xhc3MgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhnLCAiX19tZXRhY2xhc3NfXyIpOwotCQlpZiAobWV0YWNsYXNzID09IE5VTEwpCi0JCQltZXRhY2xhc3MgPSAoUHlPYmplY3QgKikgJlB5Q2xhc3NfVHlwZTsKLQkJUHlfSU5DUkVGKG1ldGFjbGFzcyk7Ci0JfQotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobWV0YWNsYXNzLCBuYW1lLCBiYXNlcywgbWV0aG9kcywKLQkJCQkJICAgICAgTlVMTCk7Ci0JUHlfREVDUkVGKG1ldGFjbGFzcyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkgewotCQkvKiBBIHR5cGUgZXJyb3IgaGVyZSBsaWtlbHkgbWVhbnMgdGhhdCB0aGUgdXNlciBwYXNzZWQKLQkJICAgaW4gYSBiYXNlIHRoYXQgd2FzIG5vdCBhIGNsYXNzIChzdWNoIHRoZSByYW5kb20gbW9kdWxlCi0JCSAgIGluc3RlYWQgb2YgdGhlIHJhbmRvbS5yYW5kb20gdHlwZSkuICBIZWxwIHRoZW0gb3V0IHdpdGgKLQkJICAgYnkgYXVnbWVudGluZyB0aGUgZXJyb3IgbWVzc2FnZSB3aXRoIG1vcmUgaW5mb3JtYXRpb24uKi8KKyAgICBpZiAoUHlEaWN0X0NoZWNrKG1ldGhvZHMpKQorICAgICAgICBtZXRhY2xhc3MgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtZXRob2RzLCAiX19tZXRhY2xhc3NfXyIpOworICAgIGlmIChtZXRhY2xhc3MgIT0gTlVMTCkKKyAgICAgICAgUHlfSU5DUkVGKG1ldGFjbGFzcyk7CisgICAgZWxzZSBpZiAoUHlUdXBsZV9DaGVjayhiYXNlcykgJiYgUHlUdXBsZV9HRVRfU0laRShiYXNlcykgPiAwKSB7CisgICAgICAgIGJhc2UgPSBQeVR1cGxlX0dFVF9JVEVNKGJhc2VzLCAwKTsKKyAgICAgICAgbWV0YWNsYXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhiYXNlLCAiX19jbGFzc19fIik7CisgICAgICAgIGlmIChtZXRhY2xhc3MgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIG1ldGFjbGFzcyA9IChQeU9iamVjdCAqKWJhc2UtPm9iX3R5cGU7CisgICAgICAgICAgICBQeV9JTkNSRUYobWV0YWNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKmcgPSBQeUV2YWxfR2V0R2xvYmFscygpOworICAgICAgICBpZiAoZyAhPSBOVUxMICYmIFB5RGljdF9DaGVjayhnKSkKKyAgICAgICAgICAgIG1ldGFjbGFzcyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGcsICJfX21ldGFjbGFzc19fIik7CisgICAgICAgIGlmIChtZXRhY2xhc3MgPT0gTlVMTCkKKyAgICAgICAgICAgIG1ldGFjbGFzcyA9IChQeU9iamVjdCAqKSAmUHlDbGFzc19UeXBlOworICAgICAgICBQeV9JTkNSRUYobWV0YWNsYXNzKTsKKyAgICB9CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtZXRhY2xhc3MsIG5hbWUsIGJhc2VzLCBtZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgUHlfREVDUkVGKG1ldGFjbGFzcyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkgeworICAgICAgICAvKiBBIHR5cGUgZXJyb3IgaGVyZSBsaWtlbHkgbWVhbnMgdGhhdCB0aGUgdXNlciBwYXNzZWQKKyAgICAgICAgICAgaW4gYSBiYXNlIHRoYXQgd2FzIG5vdCBhIGNsYXNzIChzdWNoIHRoZSByYW5kb20gbW9kdWxlCisgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIHJhbmRvbS5yYW5kb20gdHlwZSkuICBIZWxwIHRoZW0gb3V0IHdpdGgKKyAgICAgICAgICAgYnkgYXVnbWVudGluZyB0aGUgZXJyb3IgbWVzc2FnZSB3aXRoIG1vcmUgaW5mb3JtYXRpb24uKi8KIAotCQlQeU9iamVjdCAqcHR5cGUsICpwdmFsdWUsICpwdHJhY2ViYWNrOworICAgICAgICBQeU9iamVjdCAqcHR5cGUsICpwdmFsdWUsICpwdHJhY2ViYWNrOwogCi0JCVB5RXJyX0ZldGNoKCZwdHlwZSwgJnB2YWx1ZSwgJnB0cmFjZWJhY2spOwotCQlpZiAoUHlTdHJpbmdfQ2hlY2socHZhbHVlKSkgewotCQkJUHlPYmplY3QgKm5ld21zZzsKLQkJCW5ld21zZyA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoCi0JCQkJIkVycm9yIHdoZW4gY2FsbGluZyB0aGUgbWV0YWNsYXNzIGJhc2VzXG4iCi0JCQkJIiAgICAlcyIsCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKHB2YWx1ZSkpOwotCQkJaWYgKG5ld21zZyAhPSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHB2YWx1ZSk7Ci0JCQkJcHZhbHVlID0gbmV3bXNnOwotCQkJfQotCQl9Ci0JCVB5RXJyX1Jlc3RvcmUocHR5cGUsIHB2YWx1ZSwgcHRyYWNlYmFjayk7Ci0JfQotCXJldHVybiByZXN1bHQ7CisgICAgICAgIFB5RXJyX0ZldGNoKCZwdHlwZSwgJnB2YWx1ZSwgJnB0cmFjZWJhY2spOworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2socHZhbHVlKSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm5ld21zZzsKKyAgICAgICAgICAgIG5ld21zZyA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoCisgICAgICAgICAgICAgICAgIkVycm9yIHdoZW4gY2FsbGluZyB0aGUgbWV0YWNsYXNzIGJhc2VzXG4iCisgICAgICAgICAgICAgICAgIiAgICAlcyIsCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHB2YWx1ZSkpOworICAgICAgICAgICAgaWYgKG5ld21zZyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHB2YWx1ZSk7CisgICAgICAgICAgICAgICAgcHZhbHVlID0gbmV3bXNnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFB5RXJyX1Jlc3RvcmUocHR5cGUsIHB2YWx1ZSwgcHRyYWNlYmFjayk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQKIGV4ZWNfc3RhdGVtZW50KFB5RnJhbWVPYmplY3QgKmYsIFB5T2JqZWN0ICpwcm9nLCBQeU9iamVjdCAqZ2xvYmFscywKLQkgICAgICAgUHlPYmplY3QgKmxvY2FscykKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsb2NhbHMpCiB7Ci0JaW50IG47Ci0JUHlPYmplY3QgKnY7Ci0JaW50IHBsYWluID0gMDsKKyAgICBpbnQgbjsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgcGxhaW4gPSAwOwogCi0JaWYgKFB5VHVwbGVfQ2hlY2socHJvZykgJiYgZ2xvYmFscyA9PSBQeV9Ob25lICYmIGxvY2FscyA9PSBQeV9Ob25lICYmCi0JICAgICgobiA9IFB5VHVwbGVfU2l6ZShwcm9nKSkgPT0gMiB8fCBuID09IDMpKSB7Ci0JCS8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgaGFjayAqLwotCQlnbG9iYWxzID0gUHlUdXBsZV9HZXRJdGVtKHByb2csIDEpOwotCQlpZiAobiA9PSAzKQotCQkJbG9jYWxzID0gUHlUdXBsZV9HZXRJdGVtKHByb2csIDIpOwotCQlwcm9nID0gUHlUdXBsZV9HZXRJdGVtKHByb2csIDApOwotCX0KLQlpZiAoZ2xvYmFscyA9PSBQeV9Ob25lKSB7Ci0JCWdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOwotCQlpZiAobG9jYWxzID09IFB5X05vbmUpIHsKLQkJCWxvY2FscyA9IFB5RXZhbF9HZXRMb2NhbHMoKTsKLQkJCXBsYWluID0gMTsKLQkJfQotCQlpZiAoIWdsb2JhbHMgfHwgIWxvY2FscykgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkiZ2xvYmFscyBhbmQgbG9jYWxzIGNhbm5vdCBiZSBOVUxMIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAobG9jYWxzID09IFB5X05vbmUpCi0JCWxvY2FscyA9IGdsb2JhbHM7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayhwcm9nKSAmJgotCSAgICAhUHlVbmljb2RlX0NoZWNrKHByb2cpICYmCi0JICAgICFQeUNvZGVfQ2hlY2socHJvZykgJiYKLQkgICAgIVB5RmlsZV9DaGVjayhwcm9nKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImV4ZWM6IGFyZyAxIG11c3QgYmUgYSBzdHJpbmcsIGZpbGUsIG9yIGNvZGUgb2JqZWN0Iik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeURpY3RfQ2hlY2soZ2xvYmFscykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICJleGVjOiBhcmcgMiBtdXN0IGJlIGEgZGljdGlvbmFyeSBvciBOb25lIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFQeU1hcHBpbmdfQ2hlY2sobG9jYWxzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgImV4ZWM6IGFyZyAzIG11c3QgYmUgYSBtYXBwaW5nIG9yIE5vbmUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZ2xvYmFscywgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpCi0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iLCBmLT5mX2J1aWx0aW5zKTsKLQlpZiAoUHlDb2RlX0NoZWNrKHByb2cpKSB7Ci0JCWlmIChQeUNvZGVfR2V0TnVtRnJlZSgoUHlDb2RlT2JqZWN0ICopcHJvZykgPiAwKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkiY29kZSBvYmplY3QgcGFzc2VkIHRvIGV4ZWMgbWF5IG5vdCBjb250YWluIGZyZWUgdmFyaWFibGVzIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdiA9IFB5RXZhbF9FdmFsQ29kZSgoUHlDb2RlT2JqZWN0ICopIHByb2csIGdsb2JhbHMsIGxvY2Fscyk7Ci0JfQotCWVsc2UgaWYgKFB5RmlsZV9DaGVjayhwcm9nKSkgewotCQlGSUxFICpmcCA9IFB5RmlsZV9Bc0ZpbGUocHJvZyk7Ci0JCWNoYXIgKm5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhQeUZpbGVfTmFtZShwcm9nKSk7Ci0JCVB5Q29tcGlsZXJGbGFncyBjZjsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJY2YuY2ZfZmxhZ3MgPSAwOwotCQlpZiAoUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpKQotCQkJdiA9IFB5UnVuX0ZpbGVGbGFncyhmcCwgbmFtZSwgUHlfZmlsZV9pbnB1dCwgZ2xvYmFscywKLQkJCQkJICAgIGxvY2FscywgJmNmKTsKLQkJZWxzZQotCQkJdiA9IFB5UnVuX0ZpbGUoZnAsIG5hbWUsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCi0JCQkJICAgICAgIGxvY2Fscyk7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqdG1wID0gTlVMTDsKLQkJY2hhciAqc3RyOwotCQlQeUNvbXBpbGVyRmxhZ3MgY2Y7Ci0JCWNmLmNmX2ZsYWdzID0gMDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhwcm9nKSAmJiBnbG9iYWxzID09IFB5X05vbmUgJiYgbG9jYWxzID09IFB5X05vbmUgJiYKKyAgICAgICAgKChuID0gUHlUdXBsZV9TaXplKHByb2cpKSA9PSAyIHx8IG4gPT0gMykpIHsKKyAgICAgICAgLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSBoYWNrICovCisgICAgICAgIGdsb2JhbHMgPSBQeVR1cGxlX0dldEl0ZW0ocHJvZywgMSk7CisgICAgICAgIGlmIChuID09IDMpCisgICAgICAgICAgICBsb2NhbHMgPSBQeVR1cGxlX0dldEl0ZW0ocHJvZywgMik7CisgICAgICAgIHByb2cgPSBQeVR1cGxlX0dldEl0ZW0ocHJvZywgMCk7CisgICAgfQorICAgIGlmIChnbG9iYWxzID09IFB5X05vbmUpIHsKKyAgICAgICAgZ2xvYmFscyA9IFB5RXZhbF9HZXRHbG9iYWxzKCk7CisgICAgICAgIGlmIChsb2NhbHMgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgbG9jYWxzID0gUHlFdmFsX0dldExvY2FscygpOworICAgICAgICAgICAgcGxhaW4gPSAxOworICAgICAgICB9CisgICAgICAgIGlmICghZ2xvYmFscyB8fCAhbG9jYWxzKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdsb2JhbHMgYW5kIGxvY2FscyBjYW5ub3QgYmUgTlVMTCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGxvY2FscyA9PSBQeV9Ob25lKQorICAgICAgICBsb2NhbHMgPSBnbG9iYWxzOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2socHJvZykgJiYKKyAgICAgICAgIVB5VW5pY29kZV9DaGVjayhwcm9nKSAmJgorICAgICAgICAhUHlDb2RlX0NoZWNrKHByb2cpICYmCisgICAgICAgICFQeUZpbGVfQ2hlY2socHJvZykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJleGVjOiBhcmcgMSBtdXN0IGJlIGEgc3RyaW5nLCBmaWxlLCBvciBjb2RlIG9iamVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghUHlEaWN0X0NoZWNrKGdsb2JhbHMpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiZXhlYzogYXJnIDIgbXVzdCBiZSBhIGRpY3Rpb25hcnkgb3IgTm9uZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghUHlNYXBwaW5nX0NoZWNrKGxvY2FscykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJleGVjOiBhcmcgMyBtdXN0IGJlIGEgbWFwcGluZyBvciBOb25lIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGdsb2JhbHMsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKQorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhnbG9iYWxzLCAiX19idWlsdGluc19fIiwgZi0+Zl9idWlsdGlucyk7CisgICAgaWYgKFB5Q29kZV9DaGVjayhwcm9nKSkgeworICAgICAgICBpZiAoUHlDb2RlX0dldE51bUZyZWUoKFB5Q29kZU9iamVjdCAqKXByb2cpID4gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgImNvZGUgb2JqZWN0IHBhc3NlZCB0byBleGVjIG1heSBub3QgY29udGFpbiBmcmVlIHZhcmlhYmxlcyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHYgPSBQeUV2YWxfRXZhbENvZGUoKFB5Q29kZU9iamVjdCAqKSBwcm9nLCBnbG9iYWxzLCBsb2NhbHMpOworICAgIH0KKyAgICBlbHNlIGlmIChQeUZpbGVfQ2hlY2socHJvZykpIHsKKyAgICAgICAgRklMRSAqZnAgPSBQeUZpbGVfQXNGaWxlKHByb2cpOworICAgICAgICBjaGFyICpuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoUHlGaWxlX05hbWUocHJvZykpOworICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNmLmNmX2ZsYWdzID0gMDsKKyAgICAgICAgaWYgKFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoJmNmKSkKKyAgICAgICAgICAgIHYgPSBQeVJ1bl9GaWxlRmxhZ3MoZnAsIG5hbWUsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FscywgJmNmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdiA9IFB5UnVuX0ZpbGUoZnAsIG5hbWUsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHMpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKnRtcCA9IE5VTEw7CisgICAgICAgIGNoYXIgKnN0cjsKKyAgICAgICAgUHlDb21waWxlckZsYWdzIGNmOworICAgICAgICBjZi5jZl9mbGFncyA9IDA7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCQlpZiAoUHlVbmljb2RlX0NoZWNrKHByb2cpKSB7Ci0JCQl0bXAgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHByb2cpOwotCQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCXByb2cgPSB0bXA7Ci0JCQljZi5jZl9mbGFncyB8PSBQeUNGX1NPVVJDRV9JU19VVEY4OwotCQl9CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2socHJvZykpIHsKKyAgICAgICAgICAgIHRtcCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcocHJvZyk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcHJvZyA9IHRtcDsKKyAgICAgICAgICAgIGNmLmNmX2ZsYWdzIHw9IFB5Q0ZfU09VUkNFX0lTX1VURjg7CisgICAgICAgIH0KICNlbmRpZgotCQlpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHByb2csICZzdHIsIE5VTEwpKQotCQkJcmV0dXJuIC0xOwotCQlpZiAoUHlFdmFsX01lcmdlQ29tcGlsZXJGbGFncygmY2YpKQotCQkJdiA9IFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgUHlfZmlsZV9pbnB1dCwgZ2xvYmFscywKLQkJCQkJICAgICAgbG9jYWxzLCAmY2YpOwotCQllbHNlCi0JCQl2ID0gUHlSdW5fU3RyaW5nKHN0ciwgUHlfZmlsZV9pbnB1dCwgZ2xvYmFscywgbG9jYWxzKTsKLQkJUHlfWERFQ1JFRih0bXApOwotCX0KLQlpZiAocGxhaW4pCi0JCVB5RnJhbWVfTG9jYWxzVG9GYXN0KGYsIDApOwotCWlmICh2ID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIDA7CisgICAgICAgIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUocHJvZywgJnN0ciwgTlVMTCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKCZjZikpCisgICAgICAgICAgICB2ID0gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBQeV9maWxlX2lucHV0LCBnbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FscywgJmNmKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdiA9IFB5UnVuX1N0cmluZyhzdHIsIFB5X2ZpbGVfaW5wdXQsIGdsb2JhbHMsIGxvY2Fscyk7CisgICAgICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICB9CisgICAgaWYgKHBsYWluKQorICAgICAgICBQeUZyYW1lX0xvY2Fsc1RvRmFzdChmLCAwKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogZm9ybWF0X2V4Y19jaGVja19hcmcoUHlPYmplY3QgKmV4YywgY2hhciAqZm9ybWF0X3N0ciwgUHlPYmplY3QgKm9iaikKIHsKLQljaGFyICpvYmpfc3RyOworICAgIGNoYXIgKm9ial9zdHI7CiAKLQlpZiAoIW9iaikKLQkJcmV0dXJuOworICAgIGlmICghb2JqKQorICAgICAgICByZXR1cm47CiAKLQlvYmpfc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob2JqKTsKLQlpZiAoIW9ial9zdHIpCi0JCXJldHVybjsKKyAgICBvYmpfc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcob2JqKTsKKyAgICBpZiAoIW9ial9zdHIpCisgICAgICAgIHJldHVybjsKIAotCVB5RXJyX0Zvcm1hdChleGMsIGZvcm1hdF9zdHIsIG9ial9zdHIpOworICAgIFB5RXJyX0Zvcm1hdChleGMsIGZvcm1hdF9zdHIsIG9ial9zdHIpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2NvbmNhdGVuYXRlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywKLQkJICAgUHlGcmFtZU9iamVjdCAqZiwgdW5zaWduZWQgY2hhciAqbmV4dF9pbnN0cikKKyAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICpmLCB1bnNpZ25lZCBjaGFyICpuZXh0X2luc3RyKQogewotCS8qIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyAndmFyaWFibGUgKz0gZXhwcicgd2hlbiBib3RoIGFyZ3VtZW50cwotCSAgIGFyZSBzdHJpbmdzLiAqLwotCVB5X3NzaXplX3Qgdl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKLQlQeV9zc2l6ZV90IHdfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodyk7Ci0JUHlfc3NpemVfdCBuZXdfbGVuID0gdl9sZW4gKyB3X2xlbjsKLQlpZiAobmV3X2xlbiA8IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJInN0cmluZ3MgYXJlIHRvbyBsYXJnZSB0byBjb25jYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyAndmFyaWFibGUgKz0gZXhwcicgd2hlbiBib3RoIGFyZ3VtZW50cworICAgICAgIGFyZSBzdHJpbmdzLiAqLworICAgIFB5X3NzaXplX3Qgdl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKyAgICBQeV9zc2l6ZV90IHdfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodyk7CisgICAgUHlfc3NpemVfdCBuZXdfbGVuID0gdl9sZW4gKyB3X2xlbjsKKyAgICBpZiAobmV3X2xlbiA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5ncyBhcmUgdG9vIGxhcmdlIHRvIGNvbmNhdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAodi0+b2JfcmVmY250ID09IDIpIHsKLQkJLyogSW4gdGhlIGNvbW1vbiBjYXNlLCB0aGVyZSBhcmUgMiByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZQotCQkgKiBzdG9yZWQgaW4gJ3ZhcmlhYmxlJyB3aGVuIHRoZSArPSBpcyBwZXJmb3JtZWQ6IG9uZSBvbiB0aGUKLQkJICogdmFsdWUgc3RhY2sgKGluICd2JykgYW5kIG9uZSBzdGlsbCBzdG9yZWQgaW4gdGhlCi0JCSAqICd2YXJpYWJsZScuICBXZSB0cnkgdG8gZGVsZXRlIHRoZSB2YXJpYWJsZSBub3cgdG8gcmVkdWNlCi0JCSAqIHRoZSByZWZjbnQgdG8gMS4KLQkJICovCi0JCXN3aXRjaCAoKm5leHRfaW5zdHIpIHsKLQkJY2FzZSBTVE9SRV9GQVNUOgotCQl7Ci0JCQlpbnQgb3BhcmcgPSBQRUVLQVJHKCk7Ci0JCQlQeU9iamVjdCAqKmZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7Ci0JCQlpZiAoR0VUTE9DQUwob3BhcmcpID09IHYpCi0JCQkJU0VUTE9DQUwob3BhcmcsIE5VTEwpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTVE9SRV9ERVJFRjoKLQkJewotCQkJUHlPYmplY3QgKipmcmVldmFycyA9IChmLT5mX2xvY2Fsc3BsdXMgKwotCQkJCQkgICAgICAgZi0+Zl9jb2RlLT5jb19ubG9jYWxzKTsKLQkJCVB5T2JqZWN0ICpjID0gZnJlZXZhcnNbUEVFS0FSRygpXTsKLQkJCWlmIChQeUNlbGxfR0VUKGMpID09IHYpCi0JCQkJUHlDZWxsX1NldChjLCBOVUxMKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgU1RPUkVfTkFNRToKLQkJewotCQkJUHlPYmplY3QgKm5hbWVzID0gZi0+Zl9jb2RlLT5jb19uYW1lczsKLQkJCVB5T2JqZWN0ICpuYW1lID0gR0VUSVRFTShuYW1lcywgUEVFS0FSRygpKTsKLQkJCVB5T2JqZWN0ICpsb2NhbHMgPSBmLT5mX2xvY2FsczsKLQkJCWlmIChQeURpY3RfQ2hlY2tFeGFjdChsb2NhbHMpICYmCi0JCQkgICAgUHlEaWN0X0dldEl0ZW0obG9jYWxzLCBuYW1lKSA9PSB2KSB7Ci0JCQkJaWYgKFB5RGljdF9EZWxJdGVtKGxvY2FscywgbmFtZSkgIT0gMCkgewotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCX0KLQl9CisgICAgaWYgKHYtPm9iX3JlZmNudCA9PSAyKSB7CisgICAgICAgIC8qIEluIHRoZSBjb21tb24gY2FzZSwgdGhlcmUgYXJlIDIgcmVmZXJlbmNlcyB0byB0aGUgdmFsdWUKKyAgICAgICAgICogc3RvcmVkIGluICd2YXJpYWJsZScgd2hlbiB0aGUgKz0gaXMgcGVyZm9ybWVkOiBvbmUgb24gdGhlCisgICAgICAgICAqIHZhbHVlIHN0YWNrIChpbiAndicpIGFuZCBvbmUgc3RpbGwgc3RvcmVkIGluIHRoZQorICAgICAgICAgKiAndmFyaWFibGUnLiAgV2UgdHJ5IHRvIGRlbGV0ZSB0aGUgdmFyaWFibGUgbm93IHRvIHJlZHVjZQorICAgICAgICAgKiB0aGUgcmVmY250IHRvIDEuCisgICAgICAgICAqLworICAgICAgICBzd2l0Y2ggKCpuZXh0X2luc3RyKSB7CisgICAgICAgIGNhc2UgU1RPUkVfRkFTVDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9wYXJnID0gUEVFS0FSRygpOworICAgICAgICAgICAgUHlPYmplY3QgKipmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOworICAgICAgICAgICAgaWYgKEdFVExPQ0FMKG9wYXJnKSA9PSB2KQorICAgICAgICAgICAgICAgIFNFVExPQ0FMKG9wYXJnLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1RPUkVfREVSRUY6CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqZnJlZXZhcnMgPSAoZi0+Zl9sb2NhbHNwbHVzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9jb2RlLT5jb19ubG9jYWxzKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpjID0gZnJlZXZhcnNbUEVFS0FSRygpXTsKKyAgICAgICAgICAgIGlmIChQeUNlbGxfR0VUKGMpID09IHYpCisgICAgICAgICAgICAgICAgUHlDZWxsX1NldChjLCBOVUxMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgU1RPUkVfTkFNRToKKyAgICAgICAgeworICAgICAgICAgICAgUHlPYmplY3QgKm5hbWVzID0gZi0+Zl9jb2RlLT5jb19uYW1lczsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gR0VUSVRFTShuYW1lcywgUEVFS0FSRygpKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpsb2NhbHMgPSBmLT5mX2xvY2FsczsKKyAgICAgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChsb2NhbHMpICYmCisgICAgICAgICAgICAgICAgUHlEaWN0X0dldEl0ZW0obG9jYWxzLCBuYW1lKSA9PSB2KSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RGljdF9EZWxJdGVtKGxvY2FscywgbmFtZSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQlpZiAodi0+b2JfcmVmY250ID09IDEgJiYgIVB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKHYpKSB7Ci0JCS8qIE5vdyB3ZSBvd24gdGhlIGxhc3QgcmVmZXJlbmNlIHRvICd2Jywgc28gd2UgY2FuIHJlc2l6ZSBpdAotCQkgKiBpbi1wbGFjZS4KLQkJICovCi0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCBuZXdfbGVuKSAhPSAwKSB7Ci0JCQkvKiBYWFggaWYgX1B5U3RyaW5nX1Jlc2l6ZSgpIGZhaWxzLCAndicgaGFzIGJlZW4KLQkJCSAqIGRlYWxsb2NhdGVkIHNvIGl0IGNhbm5vdCBiZSBwdXQgYmFjayBpbnRvCi0JCQkgKiAndmFyaWFibGUnLiAgVGhlIE1lbW9yeUVycm9yIGlzIHJhaXNlZCB3aGVuIHRoZXJlCi0JCQkgKiBpcyBubyB2YWx1ZSBpbiAndmFyaWFibGUnLCB3aGljaCBtaWdodCAodmVyeQotCQkJICogcmVtb3RlbHkpIGJlIGEgY2F1c2Ugb2YgaW5jb21wYXRpYmlsaXRpZXMuCi0JCQkgKi8KLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIGNvcHkgJ3cnIGludG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBhcmVhIG9mICd2JyAqLwotCQltZW1jcHkoUHlTdHJpbmdfQVNfU1RSSU5HKHYpICsgdl9sZW4sCi0JCSAgICAgICBQeVN0cmluZ19BU19TVFJJTkcodyksIHdfbGVuKTsKLQkJcmV0dXJuIHY7Ci0JfQotCWVsc2UgewotCQkvKiBXaGVuIGluLXBsYWNlIHJlc2l6aW5nIGlzIG5vdCBhbiBvcHRpb24uICovCi0JCVB5U3RyaW5nX0NvbmNhdCgmdiwgdyk7Ci0JCXJldHVybiB2OwotCX0KKyAgICBpZiAodi0+b2JfcmVmY250ID09IDEgJiYgIVB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKHYpKSB7CisgICAgICAgIC8qIE5vdyB3ZSBvd24gdGhlIGxhc3QgcmVmZXJlbmNlIHRvICd2Jywgc28gd2UgY2FuIHJlc2l6ZSBpdAorICAgICAgICAgKiBpbi1wbGFjZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZ2LCBuZXdfbGVuKSAhPSAwKSB7CisgICAgICAgICAgICAvKiBYWFggaWYgX1B5U3RyaW5nX1Jlc2l6ZSgpIGZhaWxzLCAndicgaGFzIGJlZW4KKyAgICAgICAgICAgICAqIGRlYWxsb2NhdGVkIHNvIGl0IGNhbm5vdCBiZSBwdXQgYmFjayBpbnRvCisgICAgICAgICAgICAgKiAndmFyaWFibGUnLiAgVGhlIE1lbW9yeUVycm9yIGlzIHJhaXNlZCB3aGVuIHRoZXJlCisgICAgICAgICAgICAgKiBpcyBubyB2YWx1ZSBpbiAndmFyaWFibGUnLCB3aGljaCBtaWdodCAodmVyeQorICAgICAgICAgICAgICogcmVtb3RlbHkpIGJlIGEgY2F1c2Ugb2YgaW5jb21wYXRpYmlsaXRpZXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIC8qIGNvcHkgJ3cnIGludG8gdGhlIG5ld2x5IGFsbG9jYXRlZCBhcmVhIG9mICd2JyAqLworICAgICAgICBtZW1jcHkoUHlTdHJpbmdfQVNfU1RSSU5HKHYpICsgdl9sZW4sCisgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcodyksIHdfbGVuKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBXaGVuIGluLXBsYWNlIHJlc2l6aW5nIGlzIG5vdCBhbiBvcHRpb24uICovCisgICAgICAgIFB5U3RyaW5nX0NvbmNhdCgmdiwgdyk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KIH0KIAogI2lmZGVmIERZTkFNSUNfRVhFQ1VUSU9OX1BST0ZJTEUKQEAgLTQ1OTAsNDAgKzQ1OTAsNDAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRhcnJheShsb25nIGFbMjU2XSkKIHsKLQlpbnQgaTsKLQlQeU9iamVjdCAqbCA9IFB5TGlzdF9OZXcoMjU2KTsKLQlpZiAobCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJUHlPYmplY3QgKnggPSBQeUludF9Gcm9tTG9uZyhhW2ldKTsKLQkJaWYgKHggPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGwpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlMaXN0X1NldEl0ZW0obCwgaSwgeCk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLQkJYVtpXSA9IDA7Ci0JcmV0dXJuIGw7CisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKmwgPSBQeUxpc3RfTmV3KDI1Nik7CisgICAgaWYgKGwgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICp4ID0gUHlJbnRfRnJvbUxvbmcoYVtpXSk7CisgICAgICAgIGlmICh4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihsKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5TGlzdF9TZXRJdGVtKGwsIGksIHgpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgIGFbaV0gPSAwOworICAgIHJldHVybiBsOwogfQogCiBQeU9iamVjdCAqCiBfUHlfR2V0RFhQcm9maWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICNpZm5kZWYgRFhQQUlSUwotCXJldHVybiBnZXRhcnJheShkeHApOworICAgIHJldHVybiBnZXRhcnJheShkeHApOwogI2Vsc2UKLQlpbnQgaTsKLQlQeU9iamVjdCAqbCA9IFB5TGlzdF9OZXcoMjU3KTsKLQlpZiAobCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgMjU3OyBpKyspIHsKLQkJUHlPYmplY3QgKnggPSBnZXRhcnJheShkeHBhaXJzW2ldKTsKLQkJaWYgKHggPT0gTlVMTCkgewotCQkJUHlfREVDUkVGKGwpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlMaXN0X1NldEl0ZW0obCwgaSwgeCk7Ci0JfQotCXJldHVybiBsOworICAgIGludCBpOworICAgIFB5T2JqZWN0ICpsID0gUHlMaXN0X05ldygyNTcpOworICAgIGlmIChsID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTc7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqeCA9IGdldGFycmF5KGR4cGFpcnNbaV0pOworICAgICAgICBpZiAoeCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU2V0SXRlbShsLCBpLCB4KTsKKyAgICB9CisgICAgcmV0dXJuIGw7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvUHl0aG9uL2NvZGVjcy5jIGIvUHl0aG9uL2NvZGVjcy5jCmluZGV4IDM4NDljZjkuLjU3YmQwZjQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb2RlY3MuYworKysgYi9QeXRob24vY29kZWNzLmMKQEAgLTE0LDcgKzE0LDcgQEAKIC8qIC0tLSBDb2RlYyBSZWdpc3RyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKiBJbXBvcnQgdGhlIHN0YW5kYXJkIGVuY29kaW5ncyBwYWNrYWdlIHdoaWNoIHdpbGwgcmVnaXN0ZXIgdGhlIGZpcnN0Ci0gICBjb2RlYyBzZWFyY2ggZnVuY3Rpb24uIAorICAgY29kZWMgc2VhcmNoIGZ1bmN0aW9uLgogCiAgICBUaGlzIGlzIGRvbmUgaW4gYSBsYXp5IHdheSBzbyB0aGF0IHRoZSBVbmljb2RlIGltcGxlbWVudGF0aW9uIGRvZXMKICAgIG5vdCBkb3duZ3JhZGUgc3RhcnR1cCB0aW1lIG9mIHNjcmlwdHMgbm90IG5lZWRpbmcgaXQuCkBAIC0zMCwxNCArMzAsMTQgQEAKIHsKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICBpZiAoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCA9PSBOVUxMICYmIF9QeUNvZGVjUmVnaXN0cnlfSW5pdCgpKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIGlmIChzZWFyY2hfZnVuY3Rpb24gPT0gTlVMTCkgewotCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JZ290byBvbkVycm9yOworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhzZWFyY2hfZnVuY3Rpb24pKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFyZ3VtZW50IG11c3QgYmUgY2FsbGFibGUiKTsKLQlnb3RvIG9uRXJyb3I7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhcmd1bWVudCBtdXN0IGJlIGNhbGxhYmxlIik7CisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAgICAgcmV0dXJuIFB5TGlzdF9BcHBlbmQoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCwgc2VhcmNoX2Z1bmN0aW9uKTsKIApAQCAtNTUsMTUgKzU1LDE1IEBACiAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihzdHJpbmcpOwogICAgIGNoYXIgKnA7CiAgICAgUHlPYmplY3QgKnY7Ci0gICAgCisKICAgICBpZiAobGVuID4gUFlfU1NJWkVfVF9NQVgpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInN0cmluZyBpcyB0b28gbGFyZ2UiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJzdHJpbmcgaXMgdG9vIGxhcmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLQkKKwogICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4pOwogICAgIGlmICh2ID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIHAgPSBQeVN0cmluZ19BU19TVFJJTkcodik7CiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgIHJlZ2lzdGVyIGNoYXIgY2ggPSBzdHJpbmdbaV07CkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgICAgICBjaCA9ICctJzsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgY2ggPSB0b2xvd2VyKFB5X0NIQVJNQVNLKGNoKSk7Ci0JcFtpXSA9IGNoOworICAgICAgICBwW2ldID0gY2g7CiAgICAgfQogICAgIHJldHVybiB2OwogfQpAQCAtODMsNyArODMsNyBAQAogICAgY2hhcmFjdGVycy4gVGhpcyBtYWtlcyBlbmNvZGluZ3MgbG9va2VkIHVwIHRocm91Z2ggdGhpcyBtZWNoYW5pc20KICAgIGVmZmVjdGl2ZWx5IGNhc2UtaW5zZW5zaXRpdmUuCiAKLSAgIElmIG5vIGNvZGVjIGlzIGZvdW5kLCBhIExvb2t1cEVycm9yIGlzIHNldCBhbmQgTlVMTCByZXR1cm5lZC4gCisgICBJZiBubyBjb2RlYyBpcyBmb3VuZCwgYSBMb29rdXBFcnJvciBpcyBzZXQgYW5kIE5VTEwgcmV0dXJuZWQuCiAKICAgIEFzIHNpZGUgZWZmZWN0LCB0aGlzIHRyaWVzIHRvIGxvYWQgdGhlIGVuY29kaW5ncyBwYWNrYWdlLCBpZiBub3QKICAgIHlldCBkb25lLiBUaGlzIGlzIHBhcnQgb2YgdGhlIGxhenkgbG9hZCBzdHJhdGVneSBmb3IgdGhlIGVuY29kaW5ncwpAQCAtOTgsNzIgKzk4LDcyIEBACiAgICAgUHlfc3NpemVfdCBpLCBsZW47CiAKICAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkgewotCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JZ290byBvbkVycm9yOworICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCiAgICAgaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOwogICAgIGlmIChpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoID09IE5VTEwgJiYgX1B5Q29kZWNSZWdpc3RyeV9Jbml0KCkpCi0JZ290byBvbkVycm9yOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAKICAgICAvKiBDb252ZXJ0IHRoZSBlbmNvZGluZyB0byBhIG5vcm1hbGl6ZWQgUHl0aG9uIHN0cmluZzogYWxsCiAgICAgICAgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIHRvIGxvd2VyIGNhc2UsIHNwYWNlcyBhbmQgaHlwaGVucyBhcmUKICAgICAgICByZXBsYWNlZCB3aXRoIHVuZGVyc2NvcmVzLiAqLwogICAgIHYgPSBub3JtYWxpemVzdHJpbmcoZW5jb2RpbmcpOwogICAgIGlmICh2ID09IE5VTEwpCi0JZ290byBvbkVycm9yOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdik7CiAKICAgICAvKiBGaXJzdCwgdHJ5IHRvIGxvb2t1cCB0aGUgbmFtZSBpbiB0aGUgcmVnaXN0cnkgZGljdGlvbmFyeSAqLwogICAgIHJlc3VsdCA9IFB5RGljdF9HZXRJdGVtKGludGVycC0+Y29kZWNfc2VhcmNoX2NhY2hlLCB2KTsKICAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHsKLQlQeV9JTkNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYodik7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgUHlfSU5DUkVGKHJlc3VsdCk7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gICAgCisKICAgICAvKiBOZXh0LCBzY2FuIHRoZSBzZWFyY2ggZnVuY3Rpb25zIGluIG9yZGVyIG9mIHJlZ2lzdHJhdGlvbiAqLwogICAgIGFyZ3MgPSBQeVR1cGxlX05ldygxKTsKICAgICBpZiAoYXJncyA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywwLHYpOwogCiAgICAgbGVuID0gUHlMaXN0X1NpemUoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCk7CiAgICAgaWYgKGxlbiA8IDApCi0JZ290byBvbkVycm9yOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgaWYgKGxlbiA9PSAwKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0xvb2t1cEVycm9yLAotCQkJIm5vIGNvZGVjIHNlYXJjaCBmdW5jdGlvbnMgcmVnaXN0ZXJlZDogIgotCQkJImNhbid0IGZpbmQgZW5jb2RpbmciKTsKLQlnb3RvIG9uRXJyb3I7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Mb29rdXBFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJubyBjb2RlYyBzZWFyY2ggZnVuY3Rpb25zIHJlZ2lzdGVyZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBmaW5kIGVuY29kaW5nIik7CisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQlQeU9iamVjdCAqZnVuYzsKLQkKLQlmdW5jID0gUHlMaXN0X0dldEl0ZW0oaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCwgaSk7Ci0JaWYgKGZ1bmMgPT0gTlVMTCkKLQkgICAgZ290byBvbkVycm9yOwotCXJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ3MpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkgICAgZ290byBvbkVycm9yOwotCWlmIChyZXN1bHQgPT0gUHlfTm9uZSkgewotCSAgICBQeV9ERUNSRUYocmVzdWx0KTsKLQkgICAgY29udGludWU7Ci0JfQotCWlmICghUHlUdXBsZV9DaGVjayhyZXN1bHQpIHx8IFB5VHVwbGVfR0VUX1NJWkUocmVzdWx0KSAhPSA0KSB7Ci0JICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgImNvZGVjIHNlYXJjaCBmdW5jdGlvbnMgbXVzdCByZXR1cm4gNC10dXBsZXMiKTsKLQkgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0JICAgIGdvdG8gb25FcnJvcjsKLQl9Ci0JYnJlYWs7CisgICAgICAgIFB5T2JqZWN0ICpmdW5jOworCisgICAgICAgIGZ1bmMgPSBQeUxpc3RfR2V0SXRlbShpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoLCBpKTsKKyAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICghUHlUdXBsZV9DaGVjayhyZXN1bHQpIHx8IFB5VHVwbGVfR0VUX1NJWkUocmVzdWx0KSAhPSA0KSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2RlYyBzZWFyY2ggZnVuY3Rpb25zIG11c3QgcmV0dXJuIDQtdHVwbGVzIik7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICB9CiAgICAgaWYgKGkgPT0gbGVuKSB7Ci0JLyogWFhYIFBlcmhhcHMgd2Ugc2hvdWxkIGNhY2hlIG1pc3NlcyB0b28gPyAqLwotCVB5RXJyX0Zvcm1hdChQeUV4Y19Mb29rdXBFcnJvciwKKyAgICAgICAgLyogWFhYIFBlcmhhcHMgd2Ugc2hvdWxkIGNhY2hlIG1pc3NlcyB0b28gPyAqLworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTG9va3VwRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBlbmNvZGluZzogJXMiLCBlbmNvZGluZyk7Ci0JZ290byBvbkVycm9yOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAgICAgfQogCiAgICAgLyogQ2FjaGUgYW5kIHJldHVybiB0aGUgcmVzdWx0ICovCkBAIC0xNzgsMjQgKzE3OCwyNCBAQAogCiBzdGF0aWMKIFB5T2JqZWN0ICphcmdzX3R1cGxlKFB5T2JqZWN0ICpvYmplY3QsCi0JCSAgICAgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICphcmdzOwotICAgIAorCiAgICAgYXJncyA9IFB5VHVwbGVfTmV3KDEgKyAoZXJyb3JzICE9IE5VTEwpKTsKICAgICBpZiAoYXJncyA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9JTkNSRUYob2JqZWN0KTsKICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsMCxvYmplY3QpOwogICAgIGlmIChlcnJvcnMpIHsKLQlQeU9iamVjdCAqdjsKLQkKLQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhlcnJvcnMpOwotCWlmICh2ID09IE5VTEwpIHsKLQkgICAgUHlfREVDUkVGKGFyZ3MpOwotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0JUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB2KTsKKyAgICAgICAgUHlPYmplY3QgKnY7CisKKyAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZXJyb3JzKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB2KTsKICAgICB9CiAgICAgcmV0dXJuIGFyZ3M7CiB9CkBAIC0yMTAsNyArMjEwLDcgQEAKIAogICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7CiAgICAgaWYgKGNvZGVjcyA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB2ID0gUHlUdXBsZV9HRVRfSVRFTShjb2RlY3MsIGluZGV4KTsKICAgICBQeV9ERUNSRUYoY29kZWNzKTsKICAgICBQeV9JTkNSRUYodik7CkBAIC0yMjEsMjIgKzIyMSwyMiBAQAogCiBzdGF0aWMKIFB5T2JqZWN0ICpjb2RlY19nZXRpbmNyZW1lbnRhbGNvZGVjKGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJCSAgICBjb25zdCBjaGFyICplcnJvcnMsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmF0dHJuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXR0cm5hbWUpCiB7CiAgICAgUHlPYmplY3QgKmNvZGVjcywgKnJldCwgKmluY2NvZGVjOwogCiAgICAgY29kZWNzID0gX1B5Q29kZWNfTG9va3VwKGVuY29kaW5nKTsKICAgICBpZiAoY29kZWNzID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGluY2NvZGVjID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb2RlY3MsIGF0dHJuYW1lKTsKICAgICBQeV9ERUNSRUYoY29kZWNzKTsKICAgICBpZiAoaW5jY29kZWMgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKGVycm9ycykKLQlyZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oaW5jY29kZWMsICJzIiwgZXJyb3JzKTsKKyAgICAgICAgcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGluY2NvZGVjLCAicyIsIGVycm9ycyk7CiAgICAgZWxzZQotCXJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihpbmNjb2RlYywgTlVMTCk7CisgICAgICAgIHJldCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihpbmNjb2RlYywgTlVMTCk7CiAgICAgUHlfREVDUkVGKGluY2NvZGVjKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMjQ1LDI5ICsyNDUsMjkgQEAKIAogc3RhdGljCiBQeU9iamVjdCAqY29kZWNfZ2V0c3RyZWFtY29kZWMoY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKLQkJCSAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCi0JCQkgICAgICAgY29uc3QgaW50IGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCkKIHsKICAgICBQeU9iamVjdCAqY29kZWNzLCAqc3RyZWFtY29kZWMsICpjb2RlY2NsczsKIAogICAgIGNvZGVjcyA9IF9QeUNvZGVjX0xvb2t1cChlbmNvZGluZyk7CiAgICAgaWYgKGNvZGVjcyA9PSBOVUxMKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGNvZGVjY2xzID0gUHlUdXBsZV9HRVRfSVRFTShjb2RlY3MsIGluZGV4KTsKICAgICBpZiAoZXJyb3JzICE9IE5VTEwpCi0Jc3RyZWFtY29kZWMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29kZWNjbHMsICJPcyIsIHN0cmVhbSwgZXJyb3JzKTsKKyAgICAgICAgc3RyZWFtY29kZWMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29kZWNjbHMsICJPcyIsIHN0cmVhbSwgZXJyb3JzKTsKICAgICBlbHNlCi0Jc3RyZWFtY29kZWMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29kZWNjbHMsICJPIiwgc3RyZWFtKTsKKyAgICAgICAgc3RyZWFtY29kZWMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oY29kZWNjbHMsICJPIiwgc3RyZWFtKTsKICAgICBQeV9ERUNSRUYoY29kZWNzKTsKICAgICByZXR1cm4gc3RyZWFtY29kZWM7CiB9CiAKLS8qIENvbnZlbmllbmNlIEFQSXMgdG8gcXVlcnkgdGhlIENvZGVjIHJlZ2lzdHJ5LiAKLSAgIAorLyogQ29udmVuaWVuY2UgQVBJcyB0byBxdWVyeSB0aGUgQ29kZWMgcmVnaXN0cnkuCisKICAgIEFsbCBBUElzIHJldHVybiBhIGNvZGVjIG9iamVjdCB3aXRoIGluY3JlbWVudGVkIHJlZmNvdW50LgotICAgCisKICAqLwogCiBQeU9iamVjdCAqUHlDb2RlY19FbmNvZGVyKGNvbnN0IGNoYXIgKmVuY29kaW5nKQpAQCAtMjgxLDI3ICsyODEsMjcgQEAKIH0KIAogUHlPYmplY3QgKlB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyKGNvbnN0IGNoYXIgKmVuY29kaW5nLAotCQkJCSAgICAgY29uc3QgY2hhciAqZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICByZXR1cm4gY29kZWNfZ2V0aW5jcmVtZW50YWxjb2RlYyhlbmNvZGluZywgZXJyb3JzLCAiaW5jcmVtZW50YWxlbmNvZGVyIik7CiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX0luY3JlbWVudGFsRGVjb2Rlcihjb25zdCBjaGFyICplbmNvZGluZywKLQkJCQkgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgcmV0dXJuIGNvZGVjX2dldGluY3JlbWVudGFsY29kZWMoZW5jb2RpbmcsIGVycm9ycywgImluY3JlbWVudGFsZGVjb2RlciIpOwogfQogCiBQeU9iamVjdCAqUHlDb2RlY19TdHJlYW1SZWFkZXIoY29uc3QgY2hhciAqZW5jb2RpbmcsCi0JCQkgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKLQkJCSAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCiB7CiAgICAgcmV0dXJuIGNvZGVjX2dldHN0cmVhbWNvZGVjKGVuY29kaW5nLCBzdHJlYW0sIGVycm9ycywgMik7CiB9CiAKIFB5T2JqZWN0ICpQeUNvZGVjX1N0cmVhbVdyaXRlcihjb25zdCBjaGFyICplbmNvZGluZywKLQkJCSAgICAgICBQeU9iamVjdCAqc3RyZWFtLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKICAgICByZXR1cm4gY29kZWNfZ2V0c3RyZWFtY29kZWMoZW5jb2RpbmcsIHN0cmVhbSwgZXJyb3JzLCAzKTsKIH0KQEAgLTMxMiw4ICszMTIsOCBAQAogICAgZXJyb3JzIGlzIHBhc3NlZCB0byB0aGUgZW5jb2RlciBmYWN0b3J5IGFzIGFyZ3VtZW50IGlmIG5vbi1OVUxMLiAqLwogCiBQeU9iamVjdCAqUHlDb2RlY19FbmNvZGUoUHlPYmplY3QgKm9iamVjdCwKLQkJCSBjb25zdCBjaGFyICplbmNvZGluZywKLQkJCSBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICplbmNvZGVyID0gTlVMTDsKICAgICBQeU9iamVjdCAqYXJncyA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOwpAQCAtMzIxLDIxICszMjEsMjEgQEAKIAogICAgIGVuY29kZXIgPSBQeUNvZGVjX0VuY29kZXIoZW5jb2RpbmcpOwogICAgIGlmIChlbmNvZGVyID09IE5VTEwpCi0JZ290byBvbkVycm9yOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAKICAgICBhcmdzID0gYXJnc190dXBsZShvYmplY3QsIGVycm9ycyk7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7Ci0gICAgCisgICAgICAgIGdvdG8gb25FcnJvcjsKKwogICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGVuY29kZXIsYXJncyk7CiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKKyAgICAgICAgZ290byBvbkVycm9yOwogCi0gICAgaWYgKCFQeVR1cGxlX0NoZWNrKHJlc3VsdCkgfHwgCi0JUHlUdXBsZV9HRVRfU0laRShyZXN1bHQpICE9IDIpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJImVuY29kZXIgbXVzdCByZXR1cm4gYSB0dXBsZSAob2JqZWN0LGludGVnZXIpIik7Ci0JZ290byBvbkVycm9yOworICAgIGlmICghUHlUdXBsZV9DaGVjayhyZXN1bHQpIHx8CisgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUocmVzdWx0KSAhPSAyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlciBtdXN0IHJldHVybiBhIHR1cGxlIChvYmplY3QsaW50ZWdlcikiKTsKKyAgICAgICAgZ290byBvbkVycm9yOwogICAgIH0KICAgICB2ID0gUHlUdXBsZV9HRVRfSVRFTShyZXN1bHQsMCk7CiAgICAgUHlfSU5DUkVGKHYpOwpAQCAtMzQ1LDcgKzM0NSw3IEBACiAgICAgUHlfREVDUkVGKGVuY29kZXIpOwogICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgIHJldHVybiB2OwotCQorCiAgb25FcnJvcjoKICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CiAgICAgUHlfWERFQ1JFRihhcmdzKTsKQEAgLTM1OSw4ICszNTksOCBAQAogICAgZXJyb3JzIGlzIHBhc3NlZCB0byB0aGUgZGVjb2RlciBmYWN0b3J5IGFzIGFyZ3VtZW50IGlmIG5vbi1OVUxMLiAqLwogCiBQeU9iamVjdCAqUHlDb2RlY19EZWNvZGUoUHlPYmplY3QgKm9iamVjdCwKLQkJCSBjb25zdCBjaGFyICplbmNvZGluZywKLQkJCSBjb25zdCBjaGFyICplcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewogICAgIFB5T2JqZWN0ICpkZWNvZGVyID0gTlVMTDsKICAgICBQeU9iamVjdCAqYXJncyA9IE5VTEwsICpyZXN1bHQgPSBOVUxMOwpAQCAtMzY4LDIwICszNjgsMjAgQEAKIAogICAgIGRlY29kZXIgPSBQeUNvZGVjX0RlY29kZXIoZW5jb2RpbmcpOwogICAgIGlmIChkZWNvZGVyID09IE5VTEwpCi0JZ290byBvbkVycm9yOworICAgICAgICBnb3RvIG9uRXJyb3I7CiAKICAgICBhcmdzID0gYXJnc190dXBsZShvYmplY3QsIGVycm9ycyk7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKLQlnb3RvIG9uRXJyb3I7Ci0gICAgCisgICAgICAgIGdvdG8gb25FcnJvcjsKKwogICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGRlY29kZXIsYXJncyk7CiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotCWdvdG8gb25FcnJvcjsKLSAgICBpZiAoIVB5VHVwbGVfQ2hlY2socmVzdWx0KSB8fCAKLQlQeVR1cGxlX0dFVF9TSVpFKHJlc3VsdCkgIT0gMikgewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiZGVjb2RlciBtdXN0IHJldHVybiBhIHR1cGxlIChvYmplY3QsaW50ZWdlcikiKTsKLQlnb3RvIG9uRXJyb3I7CisgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2socmVzdWx0KSB8fAorICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKHJlc3VsdCkgIT0gMikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlY29kZXIgbXVzdCByZXR1cm4gYSB0dXBsZSAob2JqZWN0LGludGVnZXIpIik7CisgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAgICAgdiA9IFB5VHVwbGVfR0VUX0lURU0ocmVzdWx0LDApOwogICAgIFB5X0lOQ1JFRih2KTsKQEAgLTM5MSw3ICszOTEsNyBAQAogICAgIFB5X0RFQ1JFRihkZWNvZGVyKTsKICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICByZXR1cm4gdjsKLQkKKwogIG9uRXJyb3I6CiAgICAgUHlfWERFQ1JFRihhcmdzKTsKICAgICBQeV9YREVDUkVGKGRlY29kZXIpOwpAQCAtNDA5LDEzICs0MDksMTMgQEAKIHsKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICBpZiAoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCA9PSBOVUxMICYmIF9QeUNvZGVjUmVnaXN0cnlfSW5pdCgpKQotCXJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhlcnJvcikpIHsKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGFuZGxlciBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JcmV0dXJuIC0xOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGFuZGxlciBtdXN0IGJlIGNhbGxhYmxlIik7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnksCi0JICAgIAkJCShjaGFyICopbmFtZSwgZXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5hbWUsIGVycm9yKTsKIH0KIAogLyogTG9va3VwIHRoZSBlcnJvciBoYW5kbGluZyBjYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIHVuZGVyIHRoZQpAQCAtNDI3LDE1ICs0MjcsMTUgQEAKIAogICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOwogICAgIGlmIChpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoID09IE5VTEwgJiYgX1B5Q29kZWNSZWdpc3RyeV9Jbml0KCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKG5hbWU9PU5VTEwpCi0JbmFtZSA9ICJzdHJpY3QiOworICAgICAgICBuYW1lID0gInN0cmljdCI7CiAgICAgaGFuZGxlciA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnksIChjaGFyICopbmFtZSk7CiAgICAgaWYgKCFoYW5kbGVyKQotCVB5RXJyX0Zvcm1hdChQeUV4Y19Mb29rdXBFcnJvciwgInVua25vd24gZXJyb3IgaGFuZGxlciBuYW1lICclLjQwMHMnIiwgbmFtZSk7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19Mb29rdXBFcnJvciwgInVua25vd24gZXJyb3IgaGFuZGxlciBuYW1lICclLjQwMHMnIiwgbmFtZSk7CiAgICAgZWxzZQotCVB5X0lOQ1JFRihoYW5kbGVyKTsKKyAgICAgICAgUHlfSU5DUkVGKGhhbmRsZXIpOwogICAgIHJldHVybiBoYW5kbGVyOwogfQogCkBAIC00NDMsMTggKzQ0MywxOCBAQAogewogICAgIFB5T2JqZWN0ICp0eXBlID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhleGMsICJfX2NsYXNzX18iKTsKICAgICBpZiAodHlwZSAhPSBOVUxMKSB7Ci0JUHlPYmplY3QgKm5hbWUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHR5cGUsICJfX25hbWVfXyIpOwotCVB5X0RFQ1JFRih0eXBlKTsKLQlpZiAobmFtZSAhPSBOVUxMKSB7Ci0JICAgIFB5T2JqZWN0ICpzdHJpbmcgPSBQeU9iamVjdF9TdHIobmFtZSk7Ci0JICAgIFB5X0RFQ1JFRihuYW1lKTsKLQkgICAgaWYgKHN0cmluZyAhPSBOVUxMKSB7Ci0JICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICAgImRvbid0IGtub3cgaG93IHRvIGhhbmRsZSAlLjQwMHMgaW4gZXJyb3IgY2FsbGJhY2siLAotCQkgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0cmluZykpOwotCSAgICAgICAgUHlfREVDUkVGKHN0cmluZyk7Ci0JICAgIH0KLQl9CisgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0eXBlLCAiX19uYW1lX18iKTsKKyAgICAgICAgUHlfREVDUkVGKHR5cGUpOworICAgICAgICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqc3RyaW5nID0gUHlPYmplY3RfU3RyKG5hbWUpOworICAgICAgICAgICAgUHlfREVDUkVGKG5hbWUpOworICAgICAgICAgICAgaWYgKHN0cmluZyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgImRvbid0IGtub3cgaG93IHRvIGhhbmRsZSAlLjQwMHMgaW4gZXJyb3IgY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RyaW5nKSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTQ2Myw3ICs0NjMsNyBAQAogICAgIGlmIChQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKGV4YykpCiAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKGV4YyksIGV4Yyk7CiAgICAgZWxzZQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBtdXN0IHBhc3MgZXhjZXB0aW9uIGluc3RhbmNlIik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjb2RlYyBtdXN0IHBhc3MgZXhjZXB0aW9uIGluc3RhbmNlIik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTQ3MywyMCArNDczLDIwIEBACiB7CiAgICAgUHlfc3NpemVfdCBlbmQ7CiAgICAgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IpKSB7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGVsc2UgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IpKSB7Ci0JaWYgKFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGVsc2UgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IpKSB7Ci0JaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZChleGMsICZlbmQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGVsc2UgewotCXdyb25nX2V4Y2VwdGlvbl90eXBlKGV4Yyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIHdyb25nX2V4Y2VwdGlvbl90eXBlKGV4Yyk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICAvKiBvdWNoOiBwYXNzaW5nIE5VTEwsIDAsIHBvcyBnaXZlcyBOb25lIGluc3RlYWQgb2YgdScnICovCiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIih1I24pIiwgJmVuZCwgMCwgZW5kKTsKQEAgLTUwMSwxNTUgKzUwMSwxNTUgQEAKICAgICBQeV9zc2l6ZV90IGk7CiAKICAgICBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZShleGMsIFB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvcikpIHsKLQlQeU9iamVjdCAqcmVzOwotCVB5X1VOSUNPREUgKnA7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlyZXMgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgZW5kLXN0YXJ0KTsKLQlpZiAocmVzID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWZvciAocCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlcyksIGkgPSBzdGFydDsKLQkgICAgaTxlbmQ7ICsrcCwgKytpKQotCSAgICAqcCA9ICc/JzsKLQlyZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7Ci0JUHlfREVDUkVGKHJlcyk7Ci0JcmV0dXJuIHJlc3R1cGxlOworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBQeV9VTklDT0RFICpwOworICAgICAgICBpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQoZXhjLCAmc3RhcnQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXMgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgZW5kLXN0YXJ0KTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZvciAocCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlcyksIGkgPSBzdGFydDsKKyAgICAgICAgICAgIGk8ZW5kOyArK3AsICsraSkKKyAgICAgICAgICAgICpwID0gJz8nOworICAgICAgICByZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gcmVzdHVwbGU7CiAgICAgfQogICAgIGVsc2UgaWYgKFB5T2JqZWN0X0lzSW5zdGFuY2UoZXhjLCBQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IpKSB7Ci0JUHlfVU5JQ09ERSByZXMgPSBQeV9VTklDT0RFX1JFUExBQ0VNRU5UX0NIQVJBQ1RFUjsKLQlpZiAoUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kKGV4YywgJmVuZCkpCi0JICAgIHJldHVybiBOVUxMOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIodSNuKSIsICZyZXMsIDEsIGVuZCk7CisgICAgICAgIFB5X1VOSUNPREUgcmVzID0gUHlfVU5JQ09ERV9SRVBMQUNFTUVOVF9DSEFSQUNURVI7CisgICAgICAgIGlmIChQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQoZXhjLCAmZW5kKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKHUjbikiLCAmcmVzLCAxLCBlbmQpOwogICAgIH0KICAgICBlbHNlIGlmIChQeU9iamVjdF9Jc0luc3RhbmNlKGV4YywgUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yKSkgewotCVB5T2JqZWN0ICpyZXM7Ci0JUHlfVU5JQ09ERSAqcDsKLQlpZiAoUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQoZXhjLCAmc3RhcnQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlpZiAoUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kKGV4YywgJmVuZCkpCi0JICAgIHJldHVybiBOVUxMOwotCXJlcyA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCBlbmQtc3RhcnQpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JZm9yIChwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzKSwgaSA9IHN0YXJ0OwotCSAgICBpPGVuZDsgKytwLCArK2kpCi0JICAgICpwID0gUHlfVU5JQ09ERV9SRVBMQUNFTUVOVF9DSEFSQUNURVI7Ci0JcmVzdHVwbGUgPSBQeV9CdWlsZFZhbHVlKCIoT24pIiwgcmVzLCBlbmQpOwotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiByZXN0dXBsZTsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgUHlfVU5JQ09ERSAqcDsKKyAgICAgICAgaWYgKFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kKGV4YywgJmVuZCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmVzID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIGVuZC1zdGFydCk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IgKHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpLCBpID0gc3RhcnQ7CisgICAgICAgICAgICBpPGVuZDsgKytwLCArK2kpCisgICAgICAgICAgICAqcCA9IFB5X1VOSUNPREVfUkVQTEFDRU1FTlRfQ0hBUkFDVEVSOworICAgICAgICByZXN0dXBsZSA9IFB5X0J1aWxkVmFsdWUoIihPbikiLCByZXMsIGVuZCk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gcmVzdHVwbGU7CiAgICAgfQogICAgIGVsc2UgewotCXdyb25nX2V4Y2VwdGlvbl90eXBlKGV4Yyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIHdyb25nX2V4Y2VwdGlvbl90eXBlKGV4Yyk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIH0KIAogUHlPYmplY3QgKlB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnMoUHlPYmplY3QgKmV4YykKIHsKICAgICBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZShleGMsIFB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvcikpIHsKLQlQeU9iamVjdCAqcmVzdHVwbGU7Ci0JUHlPYmplY3QgKm9iamVjdDsKLQlQeV9zc2l6ZV90IHN0YXJ0OwotCVB5X3NzaXplX3QgZW5kOwotCVB5T2JqZWN0ICpyZXM7Ci0JUHlfVU5JQ09ERSAqcDsKLQlQeV9VTklDT0RFICpzdGFydHA7Ci0JUHlfVU5JQ09ERSAqb3V0cDsKLQlpbnQgcmVzc2l6ZTsKLQlpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQoZXhjLCAmc3RhcnQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kKGV4YywgJmVuZCkpCi0JICAgIHJldHVybiBOVUxMOwotCWlmICghKG9iamVjdCA9IFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdChleGMpKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0Jc3RhcnRwID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqZWN0KTsKLQlmb3IgKHAgPSBzdGFydHArc3RhcnQsIHJlc3NpemUgPSAwOyBwIDwgc3RhcnRwK2VuZDsgKytwKSB7Ci0JICAgIGlmICgqcDwxMCkKLQkJcmVzc2l6ZSArPSAyKzErMTsKLQkgICAgZWxzZSBpZiAoKnA8MTAwKQotCQlyZXNzaXplICs9IDIrMisxOwotCSAgICBlbHNlIGlmICgqcDwxMDAwKQotCQlyZXNzaXplICs9IDIrMysxOwotCSAgICBlbHNlIGlmICgqcDwxMDAwMCkKLQkJcmVzc2l6ZSArPSAyKzQrMTsKKyAgICAgICAgUHlPYmplY3QgKnJlc3R1cGxlOworICAgICAgICBQeU9iamVjdCAqb2JqZWN0OworICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0OworICAgICAgICBQeV9zc2l6ZV90IGVuZDsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgUHlfVU5JQ09ERSAqcDsKKyAgICAgICAgUHlfVU5JQ09ERSAqc3RhcnRwOworICAgICAgICBQeV9VTklDT0RFICpvdXRwOworICAgICAgICBpbnQgcmVzc2l6ZTsKKyAgICAgICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KGV4YywgJnN0YXJ0KSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kKGV4YywgJmVuZCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCEob2JqZWN0ID0gUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0KGV4YykpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIHN0YXJ0cCA9IFB5VW5pY29kZV9BU19VTklDT0RFKG9iamVjdCk7CisgICAgICAgIGZvciAocCA9IHN0YXJ0cCtzdGFydCwgcmVzc2l6ZSA9IDA7IHAgPCBzdGFydHArZW5kOyArK3ApIHsKKyAgICAgICAgICAgIGlmICgqcDwxMCkKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrMSsxOworICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwKQorICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gMisyKzE7CisgICAgICAgICAgICBlbHNlIGlmICgqcDwxMDAwKQorICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gMiszKzE7CisgICAgICAgICAgICBlbHNlIGlmICgqcDwxMDAwMCkKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrNCsxOwogI2lmbmRlZiBQeV9VTklDT0RFX1dJREUKLQkgICAgZWxzZQotCQlyZXNzaXplICs9IDIrNSsxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gMis1KzE7CiAjZWxzZQotCSAgICBlbHNlIGlmICgqcDwxMDAwMDApCi0JCXJlc3NpemUgKz0gMis1KzE7Ci0JICAgIGVsc2UgaWYgKCpwPDEwMDAwMDApCi0JCXJlc3NpemUgKz0gMis2KzE7Ci0JICAgIGVsc2UKLQkJcmVzc2l6ZSArPSAyKzcrMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwMCkKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrNSsxOworICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMDAwMCkKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDIrNisxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3NpemUgKz0gMis3KzE7CiAjZW5kaWYKLQl9Ci0JLyogYWxsb2NhdGUgcmVwbGFjZW1lbnQgKi8KLQlyZXMgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoTlVMTCwgcmVzc2l6ZSk7Ci0JaWYgKHJlcyA9PSBOVUxMKSB7Ci0JICAgIFB5X0RFQ1JFRihvYmplY3QpOwotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0JLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKi8KLQlmb3IgKHAgPSBzdGFydHArc3RhcnQsIG91dHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpOwotCSAgICBwIDwgc3RhcnRwK2VuZDsgKytwKSB7Ci0JICAgIFB5X1VOSUNPREUgYyA9ICpwOwotCSAgICBpbnQgZGlnaXRzOwotCSAgICBpbnQgYmFzZTsKLQkgICAgKm91dHArKyA9ICcmJzsKLQkgICAgKm91dHArKyA9ICcjJzsKLQkgICAgaWYgKCpwPDEwKSB7Ci0JCWRpZ2l0cyA9IDE7Ci0JCWJhc2UgPSAxOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCpwPDEwMCkgewotCQlkaWdpdHMgPSAyOwotCQliYXNlID0gMTA7Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAoKnA8MTAwMCkgewotCQlkaWdpdHMgPSAzOwotCQliYXNlID0gMTAwOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCpwPDEwMDAwKSB7Ci0JCWRpZ2l0cyA9IDQ7Ci0JCWJhc2UgPSAxMDAwOwotCSAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogYWxsb2NhdGUgcmVwbGFjZW1lbnQgKi8KKyAgICAgICAgcmVzID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHJlc3NpemUpOworICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihvYmplY3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKi8KKyAgICAgICAgZm9yIChwID0gc3RhcnRwK3N0YXJ0LCBvdXRwID0gUHlVbmljb2RlX0FTX1VOSUNPREUocmVzKTsKKyAgICAgICAgICAgIHAgPCBzdGFydHArZW5kOyArK3ApIHsKKyAgICAgICAgICAgIFB5X1VOSUNPREUgYyA9ICpwOworICAgICAgICAgICAgaW50IGRpZ2l0czsKKyAgICAgICAgICAgIGludCBiYXNlOworICAgICAgICAgICAgKm91dHArKyA9ICcmJzsKKyAgICAgICAgICAgICpvdXRwKysgPSAnIyc7CisgICAgICAgICAgICBpZiAoKnA8MTApIHsKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSAxOworICAgICAgICAgICAgICAgIGJhc2UgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwKSB7CisgICAgICAgICAgICAgICAgZGlnaXRzID0gMjsKKyAgICAgICAgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgqcDwxMDAwKSB7CisgICAgICAgICAgICAgICAgZGlnaXRzID0gMzsKKyAgICAgICAgICAgICAgICBiYXNlID0gMTAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMDApIHsKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSA0OworICAgICAgICAgICAgICAgIGJhc2UgPSAxMDAwOworICAgICAgICAgICAgfQogI2lmbmRlZiBQeV9VTklDT0RFX1dJREUKLQkgICAgZWxzZSB7Ci0JCWRpZ2l0cyA9IDU7Ci0JCWJhc2UgPSAxMDAwMDsKLQkgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgZGlnaXRzID0gNTsKKyAgICAgICAgICAgICAgICBiYXNlID0gMTAwMDA7CisgICAgICAgICAgICB9CiAjZWxzZQotCSAgICBlbHNlIGlmICgqcDwxMDAwMDApIHsKLQkJZGlnaXRzID0gNTsKLQkJYmFzZSA9IDEwMDAwOwotCSAgICB9Ci0JICAgIGVsc2UgaWYgKCpwPDEwMDAwMDApIHsKLQkJZGlnaXRzID0gNjsKLQkJYmFzZSA9IDEwMDAwMDsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkJZGlnaXRzID0gNzsKLQkJYmFzZSA9IDEwMDAwMDA7Ci0JICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpwPDEwMDAwMCkgeworICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDU7CisgICAgICAgICAgICAgICAgYmFzZSA9IDEwMDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKnA8MTAwMDAwMCkgeworICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDY7CisgICAgICAgICAgICAgICAgYmFzZSA9IDEwMDAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDc7CisgICAgICAgICAgICAgICAgYmFzZSA9IDEwMDAwMDA7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkgICAgd2hpbGUgKGRpZ2l0cy0tPjApIHsKLQkJKm91dHArKyA9ICcwJyArIGMvYmFzZTsKLQkJYyAlPSBiYXNlOwotCQliYXNlIC89IDEwOwotCSAgICB9Ci0JICAgICpvdXRwKysgPSAnOyc7Ci0JfQotCXJlc3R1cGxlID0gUHlfQnVpbGRWYWx1ZSgiKE9uKSIsIHJlcywgZW5kKTsKLQlQeV9ERUNSRUYocmVzKTsKLQlQeV9ERUNSRUYob2JqZWN0KTsKLQlyZXR1cm4gcmVzdHVwbGU7CisgICAgICAgICAgICB3aGlsZSAoZGlnaXRzLS0+MCkgeworICAgICAgICAgICAgICAgICpvdXRwKysgPSAnMCcgKyBjL2Jhc2U7CisgICAgICAgICAgICAgICAgYyAlPSBiYXNlOworICAgICAgICAgICAgICAgIGJhc2UgLz0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb3V0cCsrID0gJzsnOworICAgICAgICB9CisgICAgICAgIHJlc3R1cGxlID0gUHlfQnVpbGRWYWx1ZSgiKE9uKSIsIHJlcywgZW5kKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIFB5X0RFQ1JFRihvYmplY3QpOworICAgICAgICByZXR1cm4gcmVzdHVwbGU7CiAgICAgfQogICAgIGVsc2UgewotCXdyb25nX2V4Y2VwdGlvbl90eXBlKGV4Yyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIHdyb25nX2V4Y2VwdGlvbl90eXBlKGV4Yyk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIH0KIApAQCAtNjYxLDcyICs2NjEsNzIgQEAKIFB5T2JqZWN0ICpQeUNvZGVjX0JhY2tzbGFzaFJlcGxhY2VFcnJvcnMoUHlPYmplY3QgKmV4YykKIHsKICAgICBpZiAoUHlPYmplY3RfSXNJbnN0YW5jZShleGMsIFB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvcikpIHsKLQlQeU9iamVjdCAqcmVzdHVwbGU7Ci0JUHlPYmplY3QgKm9iamVjdDsKLQlQeV9zc2l6ZV90IHN0YXJ0OwotCVB5X3NzaXplX3QgZW5kOwotCVB5T2JqZWN0ICpyZXM7Ci0JUHlfVU5JQ09ERSAqcDsKLQlQeV9VTklDT0RFICpzdGFydHA7Ci0JUHlfVU5JQ09ERSAqb3V0cDsKLQlpbnQgcmVzc2l6ZTsKLQlpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQoZXhjLCAmc3RhcnQpKQotCSAgICByZXR1cm4gTlVMTDsKLQlpZiAoUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kKGV4YywgJmVuZCkpCi0JICAgIHJldHVybiBOVUxMOwotCWlmICghKG9iamVjdCA9IFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdChleGMpKSkKLQkgICAgcmV0dXJuIE5VTEw7Ci0Jc3RhcnRwID0gUHlVbmljb2RlX0FTX1VOSUNPREUob2JqZWN0KTsKLQlmb3IgKHAgPSBzdGFydHArc3RhcnQsIHJlc3NpemUgPSAwOyBwIDwgc3RhcnRwK2VuZDsgKytwKSB7CisgICAgICAgIFB5T2JqZWN0ICpyZXN0dXBsZTsKKyAgICAgICAgUHlPYmplY3QgKm9iamVjdDsKKyAgICAgICAgUHlfc3NpemVfdCBzdGFydDsKKyAgICAgICAgUHlfc3NpemVfdCBlbmQ7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIFB5X1VOSUNPREUgKnA7CisgICAgICAgIFB5X1VOSUNPREUgKnN0YXJ0cDsKKyAgICAgICAgUHlfVU5JQ09ERSAqb3V0cDsKKyAgICAgICAgaW50IHJlc3NpemU7CisgICAgICAgIGlmIChQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydChleGMsICZzdGFydCkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChleGMsICZlbmQpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghKG9iamVjdCA9IFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdChleGMpKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzdGFydHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvYmplY3QpOworICAgICAgICBmb3IgKHAgPSBzdGFydHArc3RhcnQsIHJlc3NpemUgPSAwOyBwIDwgc3RhcnRwK2VuZDsgKytwKSB7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCi0JICAgIGlmICgqcCA+PSAweDAwMDEwMDAwKQotCQlyZXNzaXplICs9IDErMSs4OwotCSAgICBlbHNlCisgICAgICAgICAgICBpZiAoKnAgPj0gMHgwMDAxMDAwMCkKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDErMSs4OworICAgICAgICAgICAgZWxzZQogI2VuZGlmCi0JICAgIGlmICgqcCA+PSAweDEwMCkgewotCQlyZXNzaXplICs9IDErMSs0OwotCSAgICB9Ci0JICAgIGVsc2UKLQkJcmVzc2l6ZSArPSAxKzErMjsKLQl9Ci0JcmVzID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKE5VTEwsIHJlc3NpemUpOwotCWlmIChyZXM9PU5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCWZvciAocCA9IHN0YXJ0cCtzdGFydCwgb3V0cCA9IFB5VW5pY29kZV9BU19VTklDT0RFKHJlcyk7Ci0JICAgIHAgPCBzdGFydHArZW5kOyArK3ApIHsKLQkgICAgUHlfVU5JQ09ERSBjID0gKnA7Ci0JICAgICpvdXRwKysgPSAnXFwnOworICAgICAgICAgICAgaWYgKCpwID49IDB4MTAwKSB7CisgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSAxKzErNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXNzaXplICs9IDErMSsyOworICAgICAgICB9CisgICAgICAgIHJlcyA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShOVUxMLCByZXNzaXplKTsKKyAgICAgICAgaWYgKHJlcz09TlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IgKHAgPSBzdGFydHArc3RhcnQsIG91dHAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShyZXMpOworICAgICAgICAgICAgcCA8IHN0YXJ0cCtlbmQ7ICsrcCkgeworICAgICAgICAgICAgUHlfVU5JQ09ERSBjID0gKnA7CisgICAgICAgICAgICAqb3V0cCsrID0gJ1xcJzsKICNpZmRlZiBQeV9VTklDT0RFX1dJREUKLQkgICAgaWYgKGMgPj0gMHgwMDAxMDAwMCkgewotCQkqb3V0cCsrID0gJ1UnOwotCQkqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj4yOCkmMHhmXTsKLQkJKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MjQpJjB4Zl07Ci0JCSpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjIwKSYweGZdOwotCQkqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj4xNikmMHhmXTsKLQkJKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MTIpJjB4Zl07Ci0JCSpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjgpJjB4Zl07Ci0JICAgIH0KLQkgICAgZWxzZQorICAgICAgICAgICAgaWYgKGMgPj0gMHgwMDAxMDAwMCkgeworICAgICAgICAgICAgICAgICpvdXRwKysgPSAnVSc7CisgICAgICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MjgpJjB4Zl07CisgICAgICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MjQpJjB4Zl07CisgICAgICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MjApJjB4Zl07CisgICAgICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MTYpJjB4Zl07CisgICAgICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+MTIpJjB4Zl07CisgICAgICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1soYz4+OCkmMHhmXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKICNlbmRpZgotCSAgICBpZiAoYyA+PSAweDEwMCkgewotCQkqb3V0cCsrID0gJ3UnOwotCQkqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj4xMikmMHhmXTsKLQkJKm91dHArKyA9IGhleGRpZ2l0c1soYz4+OCkmMHhmXTsKLQkgICAgfQotCSAgICBlbHNlCi0JCSpvdXRwKysgPSAneCc7Ci0JICAgICpvdXRwKysgPSBoZXhkaWdpdHNbKGM+PjQpJjB4Zl07Ci0JICAgICpvdXRwKysgPSBoZXhkaWdpdHNbYyYweGZdOwotCX0KKyAgICAgICAgICAgIGlmIChjID49IDB4MTAwKSB7CisgICAgICAgICAgICAgICAgKm91dHArKyA9ICd1JzsKKyAgICAgICAgICAgICAgICAqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj4xMikmMHhmXTsKKyAgICAgICAgICAgICAgICAqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj44KSYweGZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpvdXRwKysgPSAneCc7CisgICAgICAgICAgICAqb3V0cCsrID0gaGV4ZGlnaXRzWyhjPj40KSYweGZdOworICAgICAgICAgICAgKm91dHArKyA9IGhleGRpZ2l0c1tjJjB4Zl07CisgICAgICAgIH0KIAotCXJlc3R1cGxlID0gUHlfQnVpbGRWYWx1ZSgiKE9uKSIsIHJlcywgZW5kKTsKLQlQeV9ERUNSRUYocmVzKTsKLQlQeV9ERUNSRUYob2JqZWN0KTsKLQlyZXR1cm4gcmVzdHVwbGU7CisgICAgICAgIHJlc3R1cGxlID0gUHlfQnVpbGRWYWx1ZSgiKE9uKSIsIHJlcywgZW5kKTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIFB5X0RFQ1JFRihvYmplY3QpOworICAgICAgICByZXR1cm4gcmVzdHVwbGU7CiAgICAgfQogICAgIGVsc2UgewotCXdyb25nX2V4Y2VwdGlvbl90eXBlKGV4Yyk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIHdyb25nX2V4Y2VwdGlvbl90eXBlKGV4Yyk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIH0KICNlbmRpZgpAQCAtNzY1LDYzICs3NjUsNjMgQEAKIHN0YXRpYyBpbnQgX1B5Q29kZWNSZWdpc3RyeV9Jbml0KHZvaWQpCiB7CiAgICAgc3RhdGljIHN0cnVjdCB7Ci0JY2hhciAqbmFtZTsKLQlQeU1ldGhvZERlZiBkZWY7CisgICAgICAgIGNoYXIgKm5hbWU7CisgICAgICAgIFB5TWV0aG9kRGVmIGRlZjsKICAgICB9IG1ldGhvZHNbXSA9CiAgICAgewotCXsKLQkgICAgInN0cmljdCIsCi0JICAgIHsKLQkJInN0cmljdF9lcnJvcnMiLAotCQlzdHJpY3RfZXJyb3JzLAotCQlNRVRIX08sCi0JCVB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ3N0cmljdCcgZXJyb3IgaGFuZGxpbmcsIHdoaWNoICIKLQkJCSAgInJhaXNlcyBhIFVuaWNvZGVFcnJvciBvbiBjb2RpbmcgZXJyb3JzLiIpCi0JICAgIH0KLQl9LAorICAgICAgICB7CisgICAgICAgICAgICAic3RyaWN0IiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAic3RyaWN0X2Vycm9ycyIsCisgICAgICAgICAgICAgICAgc3RyaWN0X2Vycm9ycywKKyAgICAgICAgICAgICAgICBNRVRIX08sCisgICAgICAgICAgICAgICAgUHlEb2NfU1RSKCJJbXBsZW1lbnRzIHRoZSAnc3RyaWN0JyBlcnJvciBoYW5kbGluZywgd2hpY2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAicmFpc2VzIGEgVW5pY29kZUVycm9yIG9uIGNvZGluZyBlcnJvcnMuIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JewotCSAgICAiaWdub3JlIiwKLQkgICAgewotCQkiaWdub3JlX2Vycm9ycyIsCi0JCWlnbm9yZV9lcnJvcnMsCi0JCU1FVEhfTywKLQkJUHlEb2NfU1RSKCJJbXBsZW1lbnRzIHRoZSAnaWdub3JlJyBlcnJvciBoYW5kbGluZywgd2hpY2ggIgotCQkJICAiaWdub3JlcyBtYWxmb3JtZWQgZGF0YSBhbmQgY29udGludWVzLiIpCi0JICAgIH0KLQl9LAotCXsKLQkgICAgInJlcGxhY2UiLAotCSAgICB7Ci0JCSJyZXBsYWNlX2Vycm9ycyIsCi0JCXJlcGxhY2VfZXJyb3JzLAotCQlNRVRIX08sCi0JCVB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ3JlcGxhY2UnIGVycm9yIGhhbmRsaW5nLCB3aGljaCAiCi0JCQkgICJyZXBsYWNlcyBtYWxmb3JtZWQgZGF0YSB3aXRoIGEgcmVwbGFjZW1lbnQgbWFya2VyLiIpCi0JICAgIH0KLQl9LAotCXsKLQkgICAgInhtbGNoYXJyZWZyZXBsYWNlIiwKLQkgICAgewotCQkieG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzIiwKLQkJeG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzLAotCQlNRVRIX08sCi0JCVB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ3htbGNoYXJyZWZyZXBsYWNlJyBlcnJvciBoYW5kbGluZywgIgotCQkJICAid2hpY2ggcmVwbGFjZXMgYW4gdW5lbmNvZGFibGUgY2hhcmFjdGVyIHdpdGggdGhlICIKLQkJCSAgImFwcHJvcHJpYXRlIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlLiIpCi0JICAgIH0KLQl9LAotCXsKLQkgICAgImJhY2tzbGFzaHJlcGxhY2UiLAotCSAgICB7Ci0JCSJiYWNrc2xhc2hyZXBsYWNlX2Vycm9ycyIsCi0JCWJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzLAotCQlNRVRIX08sCi0JCVB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ2JhY2tzbGFzaHJlcGxhY2UnIGVycm9yIGhhbmRsaW5nLCAiCi0JCQkgICJ3aGljaCByZXBsYWNlcyBhbiB1bmVuY29kYWJsZSBjaGFyYWN0ZXIgd2l0aCBhICIKLQkJCSAgImJhY2tzbGFzaGVkIGVzY2FwZSBzZXF1ZW5jZS4iKQotCSAgICB9Ci0JfQorICAgICAgICB7CisgICAgICAgICAgICAiaWdub3JlIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaWdub3JlX2Vycm9ycyIsCisgICAgICAgICAgICAgICAgaWdub3JlX2Vycm9ycywKKyAgICAgICAgICAgICAgICBNRVRIX08sCisgICAgICAgICAgICAgICAgUHlEb2NfU1RSKCJJbXBsZW1lbnRzIHRoZSAnaWdub3JlJyBlcnJvciBoYW5kbGluZywgd2hpY2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlcyBtYWxmb3JtZWQgZGF0YSBhbmQgY29udGludWVzLiIpCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAgICJyZXBsYWNlIiwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAicmVwbGFjZV9lcnJvcnMiLAorICAgICAgICAgICAgICAgIHJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICAgICAgIE1FVEhfTywKKyAgICAgICAgICAgICAgICBQeURvY19TVFIoIkltcGxlbWVudHMgdGhlICdyZXBsYWNlJyBlcnJvciBoYW5kbGluZywgd2hpY2ggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZXMgbWFsZm9ybWVkIGRhdGEgd2l0aCBhIHJlcGxhY2VtZW50IG1hcmtlci4iKQorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAieG1sY2hhcnJlZnJlcGxhY2UiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJ4bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMiLAorICAgICAgICAgICAgICAgIHhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycywKKyAgICAgICAgICAgICAgICBNRVRIX08sCisgICAgICAgICAgICAgICAgUHlEb2NfU1RSKCJJbXBsZW1lbnRzIHRoZSAneG1sY2hhcnJlZnJlcGxhY2UnIGVycm9yIGhhbmRsaW5nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCByZXBsYWNlcyBhbiB1bmVuY29kYWJsZSBjaGFyYWN0ZXIgd2l0aCB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwcm9wcmlhdGUgWE1MIGNoYXJhY3RlciByZWZlcmVuY2UuIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImJhY2tzbGFzaHJlcGxhY2UiLAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJiYWNrc2xhc2hyZXBsYWNlX2Vycm9ycyIsCisgICAgICAgICAgICAgICAgYmFja3NsYXNocmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgICAgICAgTUVUSF9PLAorICAgICAgICAgICAgICAgIFB5RG9jX1NUUigiSW1wbGVtZW50cyB0aGUgJ2JhY2tzbGFzaHJlcGxhY2UnIGVycm9yIGhhbmRsaW5nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCByZXBsYWNlcyBhbiB1bmVuY29kYWJsZSBjaGFyYWN0ZXIgd2l0aCBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2tzbGFzaGVkIGVzY2FwZSBzZXF1ZW5jZS4iKQorICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKICAgICB9OwogCkBAIC04MzAsNDIgKzgzMCw0MiBAQAogICAgIHVuc2lnbmVkIGk7CiAKICAgICBpZiAoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCAhPSBOVUxMKQotCXJldHVybiAwOworICAgICAgICByZXR1cm4gMDsKIAogICAgIGludGVycC0+Y29kZWNfc2VhcmNoX3BhdGggPSBQeUxpc3RfTmV3KDApOwogICAgIGludGVycC0+Y29kZWNfc2VhcmNoX2NhY2hlID0gUHlEaWN0X05ldygpOwogICAgIGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkgPSBQeURpY3RfTmV3KCk7CiAKICAgICBpZiAoaW50ZXJwLT5jb2RlY19lcnJvcl9yZWdpc3RyeSkgewotCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobWV0aG9kcykvc2l6ZW9mKG1ldGhvZHNbMF0pOyArK2kpIHsKLQkgICAgUHlPYmplY3QgKmZ1bmMgPSBQeUNGdW5jdGlvbl9OZXcoJm1ldGhvZHNbaV0uZGVmLCBOVUxMKTsKLQkgICAgaW50IHJlczsKLQkgICAgaWYgKCFmdW5jKQotCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIGNvZGVjIGVycm9yIHJlZ2lzdHJ5Iik7Ci0JICAgIHJlcyA9IFB5Q29kZWNfUmVnaXN0ZXJFcnJvcihtZXRob2RzW2ldLm5hbWUsIGZ1bmMpOwotCSAgICBQeV9ERUNSRUYoZnVuYyk7Ci0JICAgIGlmIChyZXMpCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgY29kZWMgZXJyb3IgcmVnaXN0cnkiKTsKLQl9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YobWV0aG9kcykvc2l6ZW9mKG1ldGhvZHNbMF0pOyArK2kpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmdW5jID0gUHlDRnVuY3Rpb25fTmV3KCZtZXRob2RzW2ldLmRlZiwgTlVMTCk7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgaWYgKCFmdW5jKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgY29kZWMgZXJyb3IgcmVnaXN0cnkiKTsKKyAgICAgICAgICAgIHJlcyA9IFB5Q29kZWNfUmVnaXN0ZXJFcnJvcihtZXRob2RzW2ldLm5hbWUsIGZ1bmMpOworICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICAgICAgaWYgKHJlcykKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIGNvZGVjIGVycm9yIHJlZ2lzdHJ5Iik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCA9PSBOVUxMIHx8Ci0JaW50ZXJwLT5jb2RlY19zZWFyY2hfY2FjaGUgPT0gTlVMTCB8fAotCWludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkgPT0gTlVMTCkKLQlQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIGNvZGVjIHJlZ2lzdHJ5Iik7CisgICAgICAgIGludGVycC0+Y29kZWNfc2VhcmNoX2NhY2hlID09IE5VTEwgfHwKKyAgICAgICAgaW50ZXJwLT5jb2RlY19lcnJvcl9yZWdpc3RyeSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIGNvZGVjIHJlZ2lzdHJ5Iik7CiAKICAgICBtb2QgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbCgiZW5jb2RpbmdzIiwgTlVMTCwgTlVMTCwgTlVMTCwgMCk7CiAgICAgaWYgKG1vZCA9PSBOVUxMKSB7Ci0JaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7Ci0JICAgIC8qIElnbm9yZSBJbXBvcnRFcnJvcnMuLi4gdGhpcyBpcyBkb25lIHNvIHRoYXQKLQkgICAgICAgZGlzdHJpYnV0aW9ucyBjYW4gZGlzYWJsZSB0aGUgZW5jb2RpbmdzIHBhY2thZ2UuIE5vdGUKLQkgICAgICAgdGhhdCBvdGhlciBlcnJvcnMgYXJlIG5vdCBtYXNrZWQsIGUuZy4gU3lzdGVtRXJyb3JzCi0JICAgICAgIHJhaXNlZCB0byBpbmZvcm0gdGhlIHVzZXIgb2YgYW4gZXJyb3IgaW4gdGhlIFB5dGhvbgotCSAgICAgICBjb25maWd1cmF0aW9uIGFyZSBzdGlsbCByZXBvcnRlZCBiYWNrIHRvIHRoZSB1c2VyLiAqLwotCSAgICBQeUVycl9DbGVhcigpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbXBvcnRFcnJvcikpIHsKKyAgICAgICAgICAgIC8qIElnbm9yZSBJbXBvcnRFcnJvcnMuLi4gdGhpcyBpcyBkb25lIHNvIHRoYXQKKyAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMgY2FuIGRpc2FibGUgdGhlIGVuY29kaW5ncyBwYWNrYWdlLiBOb3RlCisgICAgICAgICAgICAgICB0aGF0IG90aGVyIGVycm9ycyBhcmUgbm90IG1hc2tlZCwgZS5nLiBTeXN0ZW1FcnJvcnMKKyAgICAgICAgICAgICAgIHJhaXNlZCB0byBpbmZvcm0gdGhlIHVzZXIgb2YgYW4gZXJyb3IgaW4gdGhlIFB5dGhvbgorICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBhcmUgc3RpbGwgcmVwb3J0ZWQgYmFjayB0byB0aGUgdXNlci4gKi8KKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIFB5X0RFQ1JFRihtb2QpOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NvbXBpbGUuYyBiL1B5dGhvbi9jb21waWxlLmMKaW5kZXggZjQxMzEyYS4uNmQzZDg4OSAxMDA2NDQKLS0tIGEvUHl0aG9uL2NvbXBpbGUuYworKysgYi9QeXRob24vY29tcGlsZS5jCkBAIC01LDEwICs1LDEwIEBACiAgKiBQeUNvZGVPYmplY3QuICBUaGUgY29tcGlsZXIgbWFrZXMgc2V2ZXJhbCBwYXNzZXMgdG8gYnVpbGQgdGhlIGNvZGUKICAqIG9iamVjdDoKICAqICAgMS4gQ2hlY2tzIGZvciBmdXR1cmUgc3RhdGVtZW50cy4gIFNlZSBmdXR1cmUuYwotICogICAyLiBCdWlsZHMgYSBzeW1ib2wgdGFibGUuCVNlZSBzeW10YWJsZS5jLgorICogICAyLiBCdWlsZHMgYSBzeW1ib2wgdGFibGUuICBTZWUgc3ltdGFibGUuYy4KICAqICAgMy4gR2VuZXJhdGUgY29kZSBmb3IgYmFzaWMgYmxvY2tzLiAgU2VlIGNvbXBpbGVyX21vZCgpIGluIHRoaXMgZmlsZS4KICAqICAgNC4gQXNzZW1ibGUgdGhlIGJhc2ljIGJsb2NrcyBpbnRvIGZpbmFsIGNvZGUuICBTZWUgYXNzZW1ibGUoKSBpbgotICoJdGhpcyBmaWxlLgkgCisgKiAgICAgIHRoaXMgZmlsZS4KICAqICAgNS4gT3B0aW1pemUgdGhlIGJ5dGUgY29kZSAocGVlcGhvbGUgb3B0aW1pemF0aW9ucykuICBTZWUgcGVlcGhvbGUuYwogICoKICAqIE5vdGUgdGhhdCBjb21waWxlcl9tb2QoKSBzdWdnZXN0cyBtb2R1bGUsIGJ1dCB0aGUgbW9kdWxlIGFzdCB0eXBlCkBAIC00MCwzNyArNDAsMzcgQEAKICNkZWZpbmUgREVGQVVMVF9MTk9UQUJfU0laRSAxNgogCiBzdHJ1Y3QgaW5zdHIgewotCXVuc2lnbmVkIGlfamFicyA6IDE7Ci0JdW5zaWduZWQgaV9qcmVsIDogMTsKLQl1bnNpZ25lZCBpX2hhc2FyZyA6IDE7Ci0JdW5zaWduZWQgY2hhciBpX29wY29kZTsKLQlpbnQgaV9vcGFyZzsKLQlzdHJ1Y3QgYmFzaWNibG9ja18gKmlfdGFyZ2V0OyAvKiB0YXJnZXQgYmxvY2sgKGlmIGp1bXAgaW5zdHJ1Y3Rpb24pICovCi0JaW50IGlfbGluZW5vOworICAgIHVuc2lnbmVkIGlfamFicyA6IDE7CisgICAgdW5zaWduZWQgaV9qcmVsIDogMTsKKyAgICB1bnNpZ25lZCBpX2hhc2FyZyA6IDE7CisgICAgdW5zaWduZWQgY2hhciBpX29wY29kZTsKKyAgICBpbnQgaV9vcGFyZzsKKyAgICBzdHJ1Y3QgYmFzaWNibG9ja18gKmlfdGFyZ2V0OyAvKiB0YXJnZXQgYmxvY2sgKGlmIGp1bXAgaW5zdHJ1Y3Rpb24pICovCisgICAgaW50IGlfbGluZW5vOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgYmFzaWNibG9ja18gewogICAgIC8qIEVhY2ggYmFzaWNibG9jayBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgaXMgbGlua2VkIHZpYSBiX2xpc3QgaW4gdGhlCiAgICAgICAgcmV2ZXJzZSBvcmRlciB0aGF0IHRoZSBibG9jayBhcmUgYWxsb2NhdGVkLiAgYl9saXN0IHBvaW50cyB0byB0aGUgbmV4dAogICAgICAgIGJsb2NrLCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBiX25leHQsIHdoaWNoIGlzIG5leHQgYnkgY29udHJvbCBmbG93LiAqLwotCXN0cnVjdCBiYXNpY2Jsb2NrXyAqYl9saXN0OwotCS8qIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdXNlZCAqLwotCWludCBiX2l1c2VkOwotCS8qIGxlbmd0aCBvZiBpbnN0cnVjdGlvbiBhcnJheSAoYl9pbnN0cikgKi8KLQlpbnQgYl9pYWxsb2M7Ci0JLyogcG9pbnRlciB0byBhbiBhcnJheSBvZiBpbnN0cnVjdGlvbnMsIGluaXRpYWxseSBOVUxMICovCi0Jc3RydWN0IGluc3RyICpiX2luc3RyOwotCS8qIElmIGJfbmV4dCBpcyBub24tTlVMTCwgaXQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0Ci0JICAgYmxvY2sgcmVhY2hlZCBieSBub3JtYWwgY29udHJvbCBmbG93LiAqLwotCXN0cnVjdCBiYXNpY2Jsb2NrXyAqYl9uZXh0OwotCS8qIGJfc2VlbiBpcyB1c2VkIHRvIHBlcmZvcm0gYSBERlMgb2YgYmFzaWNibG9ja3MuICovCi0JdW5zaWduZWQgYl9zZWVuIDogMTsKLQkvKiBiX3JldHVybiBpcyB0cnVlIGlmIGEgUkVUVVJOX1ZBTFVFIG9wY29kZSBpcyBpbnNlcnRlZC4gKi8KLQl1bnNpZ25lZCBiX3JldHVybiA6IDE7Ci0JLyogZGVwdGggb2Ygc3RhY2sgdXBvbiBlbnRyeSBvZiBibG9jaywgY29tcHV0ZWQgYnkgc3RhY2tkZXB0aCgpICovCi0JaW50IGJfc3RhcnRkZXB0aDsKLQkvKiBpbnN0cnVjdGlvbiBvZmZzZXQgZm9yIGJsb2NrLCBjb21wdXRlZCBieSBhc3NlbWJsZV9qdW1wX29mZnNldHMoKSAqLwotCWludCBiX29mZnNldDsKKyAgICBzdHJ1Y3QgYmFzaWNibG9ja18gKmJfbGlzdDsKKyAgICAvKiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHVzZWQgKi8KKyAgICBpbnQgYl9pdXNlZDsKKyAgICAvKiBsZW5ndGggb2YgaW5zdHJ1Y3Rpb24gYXJyYXkgKGJfaW5zdHIpICovCisgICAgaW50IGJfaWFsbG9jOworICAgIC8qIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgaW5zdHJ1Y3Rpb25zLCBpbml0aWFsbHkgTlVMTCAqLworICAgIHN0cnVjdCBpbnN0ciAqYl9pbnN0cjsKKyAgICAvKiBJZiBiX25leHQgaXMgbm9uLU5VTEwsIGl0IGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dAorICAgICAgIGJsb2NrIHJlYWNoZWQgYnkgbm9ybWFsIGNvbnRyb2wgZmxvdy4gKi8KKyAgICBzdHJ1Y3QgYmFzaWNibG9ja18gKmJfbmV4dDsKKyAgICAvKiBiX3NlZW4gaXMgdXNlZCB0byBwZXJmb3JtIGEgREZTIG9mIGJhc2ljYmxvY2tzLiAqLworICAgIHVuc2lnbmVkIGJfc2VlbiA6IDE7CisgICAgLyogYl9yZXR1cm4gaXMgdHJ1ZSBpZiBhIFJFVFVSTl9WQUxVRSBvcGNvZGUgaXMgaW5zZXJ0ZWQuICovCisgICAgdW5zaWduZWQgYl9yZXR1cm4gOiAxOworICAgIC8qIGRlcHRoIG9mIHN0YWNrIHVwb24gZW50cnkgb2YgYmxvY2ssIGNvbXB1dGVkIGJ5IHN0YWNrZGVwdGgoKSAqLworICAgIGludCBiX3N0YXJ0ZGVwdGg7CisgICAgLyogaW5zdHJ1Y3Rpb24gb2Zmc2V0IGZvciBibG9jaywgY29tcHV0ZWQgYnkgYXNzZW1ibGVfanVtcF9vZmZzZXRzKCkgKi8KKyAgICBpbnQgYl9vZmZzZXQ7CiB9IGJhc2ljYmxvY2s7CiAKIC8qIGZibG9ja2luZm8gdHJhY2tzIHRoZSBjdXJyZW50IGZyYW1lIGJsb2NrLgpAQCAtODMsNjUgKzgzLDY1IEBACiBlbnVtIGZibG9ja3R5cGUgeyBMT09QLCBFWENFUFQsIEZJTkFMTFlfVFJZLCBGSU5BTExZX0VORCB9OwogCiBzdHJ1Y3QgZmJsb2NraW5mbyB7Ci0JZW51bSBmYmxvY2t0eXBlIGZiX3R5cGU7Ci0JYmFzaWNibG9jayAqZmJfYmxvY2s7CisgICAgZW51bSBmYmxvY2t0eXBlIGZiX3R5cGU7CisgICAgYmFzaWNibG9jayAqZmJfYmxvY2s7CiB9OwogCiAvKiBUaGUgZm9sbG93aW5nIGl0ZW1zIGNoYW5nZSBvbiBlbnRyeSBhbmQgZXhpdCBvZiBjb2RlIGJsb2Nrcy4KICAgIFRoZXkgbXVzdCBiZSBzYXZlZCBhbmQgcmVzdG9yZWQgd2hlbiByZXR1cm5pbmcgdG8gYSBibG9jay4KICovCiBzdHJ1Y3QgY29tcGlsZXJfdW5pdCB7Ci0JUHlTVEVudHJ5T2JqZWN0ICp1X3N0ZTsKKyAgICBQeVNURW50cnlPYmplY3QgKnVfc3RlOwogCi0JUHlPYmplY3QgKnVfbmFtZTsKLQkvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgZGljdHMgdGhhdCBtYXAgb2JqZWN0cyB0bwotCSAgIHRoZSBpbmRleCBvZiB0aGVtIGluIGNvX1hYWC4JIFRoZSBpbmRleCBpcyB1c2VkIGFzCi0JICAgdGhlIGFyZ3VtZW50IGZvciBvcGNvZGVzIHRoYXQgcmVmZXIgdG8gdGhvc2UgY29sbGVjdGlvbnMuCi0JKi8KLQlQeU9iamVjdCAqdV9jb25zdHM7ICAgIC8qIGFsbCBjb25zdGFudHMgKi8KLQlQeU9iamVjdCAqdV9uYW1lczsgICAgIC8qIGFsbCBuYW1lcyAqLwotCVB5T2JqZWN0ICp1X3Zhcm5hbWVzOyAgLyogbG9jYWwgdmFyaWFibGVzICovCi0JUHlPYmplY3QgKnVfY2VsbHZhcnM7ICAvKiBjZWxsIHZhcmlhYmxlcyAqLwotCVB5T2JqZWN0ICp1X2ZyZWV2YXJzOyAgLyogZnJlZSB2YXJpYWJsZXMgKi8KKyAgICBQeU9iamVjdCAqdV9uYW1lOworICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBkaWN0cyB0aGF0IG1hcCBvYmplY3RzIHRvCisgICAgICAgdGhlIGluZGV4IG9mIHRoZW0gaW4gY29fWFhYLiAgICAgIFRoZSBpbmRleCBpcyB1c2VkIGFzCisgICAgICAgdGhlIGFyZ3VtZW50IGZvciBvcGNvZGVzIHRoYXQgcmVmZXIgdG8gdGhvc2UgY29sbGVjdGlvbnMuCisgICAgKi8KKyAgICBQeU9iamVjdCAqdV9jb25zdHM7ICAgIC8qIGFsbCBjb25zdGFudHMgKi8KKyAgICBQeU9iamVjdCAqdV9uYW1lczsgICAgIC8qIGFsbCBuYW1lcyAqLworICAgIFB5T2JqZWN0ICp1X3Zhcm5hbWVzOyAgLyogbG9jYWwgdmFyaWFibGVzICovCisgICAgUHlPYmplY3QgKnVfY2VsbHZhcnM7ICAvKiBjZWxsIHZhcmlhYmxlcyAqLworICAgIFB5T2JqZWN0ICp1X2ZyZWV2YXJzOyAgLyogZnJlZSB2YXJpYWJsZXMgKi8KIAotCVB5T2JqZWN0ICp1X3ByaXZhdGU7CS8qIGZvciBwcml2YXRlIG5hbWUgbWFuZ2xpbmcgKi8KKyAgICBQeU9iamVjdCAqdV9wcml2YXRlOyAgICAgICAgLyogZm9yIHByaXZhdGUgbmFtZSBtYW5nbGluZyAqLwogCi0JaW50IHVfYXJnY291bnQ7CSAgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGJsb2NrICovIAotCS8qIFBvaW50ZXIgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2NrLiAgQnkgZm9sbG93aW5nIGJfbGlzdAotCSAgIG1lbWJlcnMsIHlvdSBjYW4gcmVhY2ggYWxsIGVhcmx5IGFsbG9jYXRlZCBibG9ja3MuICovCi0JYmFzaWNibG9jayAqdV9ibG9ja3M7Ci0JYmFzaWNibG9jayAqdV9jdXJibG9jazsgLyogcG9pbnRlciB0byBjdXJyZW50IGJsb2NrICovCi0JaW50IHVfdG1wbmFtZTsJCS8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgZm9yIGxpc3QgY29tcHMgKi8KKyAgICBpbnQgdV9hcmdjb3VudDsgICAgICAgIC8qIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGJsb2NrICovCisgICAgLyogUG9pbnRlciB0byB0aGUgbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgYmxvY2suICBCeSBmb2xsb3dpbmcgYl9saXN0CisgICAgICAgbWVtYmVycywgeW91IGNhbiByZWFjaCBhbGwgZWFybHkgYWxsb2NhdGVkIGJsb2Nrcy4gKi8KKyAgICBiYXNpY2Jsb2NrICp1X2Jsb2NrczsKKyAgICBiYXNpY2Jsb2NrICp1X2N1cmJsb2NrOyAvKiBwb2ludGVyIHRvIGN1cnJlbnQgYmxvY2sgKi8KKyAgICBpbnQgdV90bXBuYW1lOyAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlcyBmb3IgbGlzdCBjb21wcyAqLwogCi0JaW50IHVfbmZibG9ja3M7Ci0Jc3RydWN0IGZibG9ja2luZm8gdV9mYmxvY2tbQ09fTUFYQkxPQ0tTXTsKKyAgICBpbnQgdV9uZmJsb2NrczsKKyAgICBzdHJ1Y3QgZmJsb2NraW5mbyB1X2ZibG9ja1tDT19NQVhCTE9DS1NdOwogCi0JaW50IHVfZmlyc3RsaW5lbm87IC8qIHRoZSBmaXJzdCBsaW5lbm8gb2YgdGhlIGJsb2NrICovCi0JaW50IHVfbGluZW5vOwkgICAvKiB0aGUgbGluZW5vIGZvciB0aGUgY3VycmVudCBzdG10ICovCi0JYm9vbCB1X2xpbmVub19zZXQ7IC8qIGJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciBpbnN0cgotCQkJICAgICAgaGFzIGJlZW4gZ2VuZXJhdGVkIHdpdGggY3VycmVudCBsaW5lbm8gKi8KKyAgICBpbnQgdV9maXJzdGxpbmVubzsgLyogdGhlIGZpcnN0IGxpbmVubyBvZiB0aGUgYmxvY2sgKi8KKyAgICBpbnQgdV9saW5lbm87ICAgICAgICAgIC8qIHRoZSBsaW5lbm8gZm9yIHRoZSBjdXJyZW50IHN0bXQgKi8KKyAgICBib29sIHVfbGluZW5vX3NldDsgLyogYm9vbGVhbiB0byBpbmRpY2F0ZSB3aGV0aGVyIGluc3RyCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIGdlbmVyYXRlZCB3aXRoIGN1cnJlbnQgbGluZW5vICovCiB9OwogCi0vKiBUaGlzIHN0cnVjdCBjYXB0dXJlcyB0aGUgZ2xvYmFsIHN0YXRlIG9mIGEgY29tcGlsYXRpb24uICAKKy8qIFRoaXMgc3RydWN0IGNhcHR1cmVzIHRoZSBnbG9iYWwgc3RhdGUgb2YgYSBjb21waWxhdGlvbi4KIAogVGhlIHUgcG9pbnRlciBwb2ludHMgdG8gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCwgd2hpbGUgdW5pdHMKLWZvciBlbmNsb3NpbmcgYmxvY2tzIGFyZSBzdG9yZWQgaW4gY19zdGFjay4JVGhlIHUgYW5kIGNfc3RhY2sgYXJlCitmb3IgZW5jbG9zaW5nIGJsb2NrcyBhcmUgc3RvcmVkIGluIGNfc3RhY2suICAgICBUaGUgdSBhbmQgY19zdGFjayBhcmUKIG1hbmFnZWQgYnkgY29tcGlsZXJfZW50ZXJfc2NvcGUoKSBhbmQgY29tcGlsZXJfZXhpdF9zY29wZSgpLgogKi8KIAogc3RydWN0IGNvbXBpbGVyIHsKLQljb25zdCBjaGFyICpjX2ZpbGVuYW1lOwotCXN0cnVjdCBzeW10YWJsZSAqY19zdDsKLQlQeUZ1dHVyZUZlYXR1cmVzICpjX2Z1dHVyZTsgLyogcG9pbnRlciB0byBtb2R1bGUncyBfX2Z1dHVyZV9fICovCi0JUHlDb21waWxlckZsYWdzICpjX2ZsYWdzOworICAgIGNvbnN0IGNoYXIgKmNfZmlsZW5hbWU7CisgICAgc3RydWN0IHN5bXRhYmxlICpjX3N0OworICAgIFB5RnV0dXJlRmVhdHVyZXMgKmNfZnV0dXJlOyAvKiBwb2ludGVyIHRvIG1vZHVsZSdzIF9fZnV0dXJlX18gKi8KKyAgICBQeUNvbXBpbGVyRmxhZ3MgKmNfZmxhZ3M7CiAKLQlpbnQgY19pbnRlcmFjdGl2ZTsJIC8qIHRydWUgaWYgaW4gaW50ZXJhY3RpdmUgbW9kZSAqLwotCWludCBjX25lc3RsZXZlbDsKKyAgICBpbnQgY19pbnRlcmFjdGl2ZTsgICAgICAgICAgIC8qIHRydWUgaWYgaW4gaW50ZXJhY3RpdmUgbW9kZSAqLworICAgIGludCBjX25lc3RsZXZlbDsKIAotCXN0cnVjdCBjb21waWxlcl91bml0ICp1OyAvKiBjb21waWxlciBzdGF0ZSBmb3IgY3VycmVudCBibG9jayAqLwotCVB5T2JqZWN0ICpjX3N0YWNrOwkgLyogUHl0aG9uIGxpc3QgaG9sZGluZyBjb21waWxlcl91bml0IHB0cnMgKi8KLQljaGFyICpjX2VuY29kaW5nOwkgLyogc291cmNlIGVuY29kaW5nIChhIGJvcnJvd2VkIHJlZmVyZW5jZSkgKi8KLQlQeUFyZW5hICpjX2FyZW5hOwkgLyogcG9pbnRlciB0byBtZW1vcnkgYWxsb2NhdGlvbiBhcmVuYSAqLworICAgIHN0cnVjdCBjb21waWxlcl91bml0ICp1OyAvKiBjb21waWxlciBzdGF0ZSBmb3IgY3VycmVudCBibG9jayAqLworICAgIFB5T2JqZWN0ICpjX3N0YWNrOyAgICAgICAgICAgLyogUHl0aG9uIGxpc3QgaG9sZGluZyBjb21waWxlcl91bml0IHB0cnMgKi8KKyAgICBjaGFyICpjX2VuY29kaW5nOyAgICAgICAgICAgIC8qIHNvdXJjZSBlbmNvZGluZyAoYSBib3Jyb3dlZCByZWZlcmVuY2UpICovCisgICAgUHlBcmVuYSAqY19hcmVuYTsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIG1lbW9yeSBhbGxvY2F0aW9uIGFyZW5hICovCiB9OwogCiBzdGF0aWMgaW50IGNvbXBpbGVyX2VudGVyX3Njb3BlKHN0cnVjdCBjb21waWxlciAqLCBpZGVudGlmaWVyLCB2b2lkICosIGludCk7CkBAIC0xNjIsMTIgKzE2MiwxMiBAQAogc3RhdGljIGludCBjb21waWxlcl92aXNpdF9leHByKHN0cnVjdCBjb21waWxlciAqLCBleHByX3R5KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYXVnYXNzaWduKHN0cnVjdCBjb21waWxlciAqLCBzdG10X3R5KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfdmlzaXRfc2xpY2Uoc3RydWN0IGNvbXBpbGVyICosIHNsaWNlX3R5LAotCQkJCWV4cHJfY29udGV4dF90eSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfY29udGV4dF90eSk7CiAKIHN0YXRpYyBpbnQgY29tcGlsZXJfcHVzaF9mYmxvY2soc3RydWN0IGNvbXBpbGVyICosIGVudW0gZmJsb2NrdHlwZSwKLQkJCQliYXNpY2Jsb2NrICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY2Jsb2NrICopOwogc3RhdGljIHZvaWQgY29tcGlsZXJfcG9wX2ZibG9jayhzdHJ1Y3QgY29tcGlsZXIgKiwgZW51bSBmYmxvY2t0eXBlLAotCQkJCWJhc2ljYmxvY2sgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljYmxvY2sgKik7CiAvKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSBsb29wIG9uIHRoZSBmYmxvY2sgc3RhY2suICovCiBzdGF0aWMgaW50IGNvbXBpbGVyX2luX2xvb3Aoc3RydWN0IGNvbXBpbGVyICopOwogCkBAIC0xODIsMTc1ICsxODIsMTc1IEBACiBQeU9iamVjdCAqCiBfUHlfTWFuZ2xlKFB5T2JqZWN0ICpwcml2YXRlb2JqLCBQeU9iamVjdCAqaWRlbnQpCiB7Ci0JLyogTmFtZSBtYW5nbGluZzogX19wcml2YXRlIGJlY29tZXMgX2NsYXNzbmFtZV9fcHJpdmF0ZS4KLQkgICBUaGlzIGlzIGluZGVwZW5kZW50IGZyb20gaG93IHRoZSBuYW1lIGlzIHVzZWQuICovCi0JY29uc3QgY2hhciAqcCwgKm5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhpZGVudCk7Ci0JY2hhciAqYnVmZmVyOwotCXNpemVfdCBubGVuLCBwbGVuOwotCWlmIChwcml2YXRlb2JqID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKHByaXZhdGVvYmopIHx8Ci0JICAgIG5hbWUgPT0gTlVMTCB8fCBuYW1lWzBdICE9ICdfJyB8fCBuYW1lWzFdICE9ICdfJykgewotCQlQeV9JTkNSRUYoaWRlbnQpOwotCQlyZXR1cm4gaWRlbnQ7Ci0JfQotCXAgPSBQeVN0cmluZ19Bc1N0cmluZyhwcml2YXRlb2JqKTsKLQlubGVuID0gc3RybGVuKG5hbWUpOwotCS8qIERvbid0IG1hbmdsZSBfX2lkX18gb3IgbmFtZXMgd2l0aCBkb3RzLgorICAgIC8qIE5hbWUgbWFuZ2xpbmc6IF9fcHJpdmF0ZSBiZWNvbWVzIF9jbGFzc25hbWVfX3ByaXZhdGUuCisgICAgICAgVGhpcyBpcyBpbmRlcGVuZGVudCBmcm9tIGhvdyB0aGUgbmFtZSBpcyB1c2VkLiAqLworICAgIGNvbnN0IGNoYXIgKnAsICpuYW1lID0gUHlTdHJpbmdfQXNTdHJpbmcoaWRlbnQpOworICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICBzaXplX3QgbmxlbiwgcGxlbjsKKyAgICBpZiAocHJpdmF0ZW9iaiA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhwcml2YXRlb2JqKSB8fAorICAgICAgICBuYW1lID09IE5VTEwgfHwgbmFtZVswXSAhPSAnXycgfHwgbmFtZVsxXSAhPSAnXycpIHsKKyAgICAgICAgUHlfSU5DUkVGKGlkZW50KTsKKyAgICAgICAgcmV0dXJuIGlkZW50OworICAgIH0KKyAgICBwID0gUHlTdHJpbmdfQXNTdHJpbmcocHJpdmF0ZW9iaik7CisgICAgbmxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICAvKiBEb24ndCBtYW5nbGUgX19pZF9fIG9yIG5hbWVzIHdpdGggZG90cy4KIAotCSAgIFRoZSBvbmx5IHRpbWUgYSBuYW1lIHdpdGggYSBkb3QgY2FuIG9jY3VyIGlzIHdoZW4KLQkgICB3ZSBhcmUgY29tcGlsaW5nIGFuIGltcG9ydCBzdGF0ZW1lbnQgdGhhdCBoYXMgYSAKLQkgICBwYWNrYWdlIG5hbWUuCisgICAgICAgVGhlIG9ubHkgdGltZSBhIG5hbWUgd2l0aCBhIGRvdCBjYW4gb2NjdXIgaXMgd2hlbgorICAgICAgIHdlIGFyZSBjb21waWxpbmcgYW4gaW1wb3J0IHN0YXRlbWVudCB0aGF0IGhhcyBhCisgICAgICAgcGFja2FnZSBuYW1lLgogCi0JICAgVE9ETyhqaHlsdG9uKTogRGVjaWRlIHdoZXRoZXIgd2Ugd2FudCB0byBzdXBwb3J0Ci0JICAgbWFuZ2xpbmcgb2YgdGhlIG1vZHVsZSBuYW1lLCBlLmcuIF9fTS5YLgotCSovCi0JaWYgKChuYW1lW25sZW4tMV0gPT0gJ18nICYmIG5hbWVbbmxlbi0yXSA9PSAnXycpIAotCSAgICB8fCBzdHJjaHIobmFtZSwgJy4nKSkgewotCQlQeV9JTkNSRUYoaWRlbnQpOwotCQlyZXR1cm4gaWRlbnQ7IC8qIERvbid0IG1hbmdsZSBfX3doYXRldmVyX18gKi8KLQl9Ci0JLyogU3RyaXAgbGVhZGluZyB1bmRlcnNjb3JlcyBmcm9tIGNsYXNzIG5hbWUgKi8KLQl3aGlsZSAoKnAgPT0gJ18nKQotCQlwKys7Ci0JaWYgKCpwID09ICdcMCcpIHsKLQkJUHlfSU5DUkVGKGlkZW50KTsKLQkJcmV0dXJuIGlkZW50OyAvKiBEb24ndCBtYW5nbGUgaWYgY2xhc3MgaXMganVzdCB1bmRlcnNjb3JlcyAqLwotCX0KLQlwbGVuID0gc3RybGVuKHApOworICAgICAgIFRPRE8oamh5bHRvbik6IERlY2lkZSB3aGV0aGVyIHdlIHdhbnQgdG8gc3VwcG9ydAorICAgICAgIG1hbmdsaW5nIG9mIHRoZSBtb2R1bGUgbmFtZSwgZS5nLiBfX00uWC4KKyAgICAqLworICAgIGlmICgobmFtZVtubGVuLTFdID09ICdfJyAmJiBuYW1lW25sZW4tMl0gPT0gJ18nKQorICAgICAgICB8fCBzdHJjaHIobmFtZSwgJy4nKSkgeworICAgICAgICBQeV9JTkNSRUYoaWRlbnQpOworICAgICAgICByZXR1cm4gaWRlbnQ7IC8qIERvbid0IG1hbmdsZSBfX3doYXRldmVyX18gKi8KKyAgICB9CisgICAgLyogU3RyaXAgbGVhZGluZyB1bmRlcnNjb3JlcyBmcm9tIGNsYXNzIG5hbWUgKi8KKyAgICB3aGlsZSAoKnAgPT0gJ18nKQorICAgICAgICBwKys7CisgICAgaWYgKCpwID09ICdcMCcpIHsKKyAgICAgICAgUHlfSU5DUkVGKGlkZW50KTsKKyAgICAgICAgcmV0dXJuIGlkZW50OyAvKiBEb24ndCBtYW5nbGUgaWYgY2xhc3MgaXMganVzdCB1bmRlcnNjb3JlcyAqLworICAgIH0KKyAgICBwbGVuID0gc3RybGVuKHApOwogCi0JYXNzZXJ0KDEgPD0gUFlfU1NJWkVfVF9NQVggLSBubGVuKTsKLQlhc3NlcnQoMSArIG5sZW4gPD0gUFlfU1NJWkVfVF9NQVggLSBwbGVuKTsKKyAgICBhc3NlcnQoMSA8PSBQWV9TU0laRV9UX01BWCAtIG5sZW4pOworICAgIGFzc2VydCgxICsgbmxlbiA8PSBQWV9TU0laRV9UX01BWCAtIHBsZW4pOwogCi0JaWRlbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAxICsgbmxlbiArIHBsZW4pOwotCWlmICghaWRlbnQpCi0JCXJldHVybiAwOwotCS8qIGlkZW50ID0gIl8iICsgcFs6cGxlbl0gKyBuYW1lICMgaS5lLiAxK3BsZW4rbmxlbiBieXRlcyAqLwotCWJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhpZGVudCk7Ci0JYnVmZmVyWzBdID0gJ18nOwotCXN0cm5jcHkoYnVmZmVyKzEsIHAsIHBsZW4pOwotCXN0cmNweShidWZmZXIrMStwbGVuLCBuYW1lKTsKLQlyZXR1cm4gaWRlbnQ7CisgICAgaWRlbnQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAxICsgbmxlbiArIHBsZW4pOworICAgIGlmICghaWRlbnQpCisgICAgICAgIHJldHVybiAwOworICAgIC8qIGlkZW50ID0gIl8iICsgcFs6cGxlbl0gKyBuYW1lICMgaS5lLiAxK3BsZW4rbmxlbiBieXRlcyAqLworICAgIGJ1ZmZlciA9IFB5U3RyaW5nX0FTX1NUUklORyhpZGVudCk7CisgICAgYnVmZmVyWzBdID0gJ18nOworICAgIHN0cm5jcHkoYnVmZmVyKzEsIHAsIHBsZW4pOworICAgIHN0cmNweShidWZmZXIrMStwbGVuLCBuYW1lKTsKKyAgICByZXR1cm4gaWRlbnQ7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2luaXQoc3RydWN0IGNvbXBpbGVyICpjKQogewotCW1lbXNldChjLCAwLCBzaXplb2Yoc3RydWN0IGNvbXBpbGVyKSk7CisgICAgbWVtc2V0KGMsIDAsIHNpemVvZihzdHJ1Y3QgY29tcGlsZXIpKTsKIAotCWMtPmNfc3RhY2sgPSBQeUxpc3RfTmV3KDApOwotCWlmICghYy0+Y19zdGFjaykKLQkJcmV0dXJuIDA7CisgICAgYy0+Y19zdGFjayA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKCFjLT5jX3N0YWNrKQorICAgICAgICByZXR1cm4gMDsKIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiBQeUNvZGVPYmplY3QgKgogUHlBU1RfQ29tcGlsZShtb2RfdHkgbW9kLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlDb21waWxlckZsYWdzICpmbGFncywKLQkgICAgICBQeUFyZW5hICphcmVuYSkKKyAgICAgICAgICAgICAgUHlBcmVuYSAqYXJlbmEpCiB7Ci0Jc3RydWN0IGNvbXBpbGVyIGM7Ci0JUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7Ci0JUHlDb21waWxlckZsYWdzIGxvY2FsX2ZsYWdzOwotCWludCBtZXJnZWQ7CisgICAgc3RydWN0IGNvbXBpbGVyIGM7CisgICAgUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7CisgICAgUHlDb21waWxlckZsYWdzIGxvY2FsX2ZsYWdzOworICAgIGludCBtZXJnZWQ7CiAKLQlpZiAoIV9fZG9jX18pIHsKLQkJX19kb2NfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZG9jX18iKTsKLQkJaWYgKCFfX2RvY19fKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmICghX19kb2NfXykgeworICAgICAgICBfX2RvY19fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19kb2NfXyIpOworICAgICAgICBpZiAoIV9fZG9jX18pCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlpZiAoIWNvbXBpbGVyX2luaXQoJmMpKQotCQlyZXR1cm4gTlVMTDsKLQljLmNfZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQljLmNfYXJlbmEgPSBhcmVuYTsKLQljLmNfZnV0dXJlID0gUHlGdXR1cmVfRnJvbUFTVChtb2QsIGZpbGVuYW1lKTsKLQlpZiAoYy5jX2Z1dHVyZSA9PSBOVUxMKQotCQlnb3RvIGZpbmFsbHk7Ci0JaWYgKCFmbGFncykgewotCQlsb2NhbF9mbGFncy5jZl9mbGFncyA9IDA7Ci0JCWZsYWdzID0gJmxvY2FsX2ZsYWdzOwotCX0KLQltZXJnZWQgPSBjLmNfZnV0dXJlLT5mZl9mZWF0dXJlcyB8IGZsYWdzLT5jZl9mbGFnczsKLQljLmNfZnV0dXJlLT5mZl9mZWF0dXJlcyA9IG1lcmdlZDsKLQlmbGFncy0+Y2ZfZmxhZ3MgPSBtZXJnZWQ7Ci0JYy5jX2ZsYWdzID0gZmxhZ3M7Ci0JYy5jX25lc3RsZXZlbCA9IDA7CisgICAgaWYgKCFjb21waWxlcl9pbml0KCZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYy5jX2ZpbGVuYW1lID0gZmlsZW5hbWU7CisgICAgYy5jX2FyZW5hID0gYXJlbmE7CisgICAgYy5jX2Z1dHVyZSA9IFB5RnV0dXJlX0Zyb21BU1QobW9kLCBmaWxlbmFtZSk7CisgICAgaWYgKGMuY19mdXR1cmUgPT0gTlVMTCkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIGlmICghZmxhZ3MpIHsKKyAgICAgICAgbG9jYWxfZmxhZ3MuY2ZfZmxhZ3MgPSAwOworICAgICAgICBmbGFncyA9ICZsb2NhbF9mbGFnczsKKyAgICB9CisgICAgbWVyZ2VkID0gYy5jX2Z1dHVyZS0+ZmZfZmVhdHVyZXMgfCBmbGFncy0+Y2ZfZmxhZ3M7CisgICAgYy5jX2Z1dHVyZS0+ZmZfZmVhdHVyZXMgPSBtZXJnZWQ7CisgICAgZmxhZ3MtPmNmX2ZsYWdzID0gbWVyZ2VkOworICAgIGMuY19mbGFncyA9IGZsYWdzOworICAgIGMuY19uZXN0bGV2ZWwgPSAwOwogCi0JYy5jX3N0ID0gUHlTeW10YWJsZV9CdWlsZChtb2QsIGZpbGVuYW1lLCBjLmNfZnV0dXJlKTsKLQlpZiAoYy5jX3N0ID09IE5VTEwpIHsKLQkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAibm8gc3ltdGFibGUiKTsKLQkJZ290byBmaW5hbGx5OwotCX0KKyAgICBjLmNfc3QgPSBQeVN5bXRhYmxlX0J1aWxkKG1vZCwgZmlsZW5hbWUsIGMuY19mdXR1cmUpOworICAgIGlmIChjLmNfc3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJubyBzeW10YWJsZSIpOworICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgfQogCi0JLyogWFhYIGluaXRpYWxpemUgdG8gTlVMTCBmb3Igbm93LCBuZWVkIHRvIGhhbmRsZSAqLwotCWMuY19lbmNvZGluZyA9IE5VTEw7CisgICAgLyogWFhYIGluaXRpYWxpemUgdG8gTlVMTCBmb3Igbm93LCBuZWVkIHRvIGhhbmRsZSAqLworICAgIGMuY19lbmNvZGluZyA9IE5VTEw7CiAKLQljbyA9IGNvbXBpbGVyX21vZCgmYywgbW9kKTsKKyAgICBjbyA9IGNvbXBpbGVyX21vZCgmYywgbW9kKTsKIAogIGZpbmFsbHk6Ci0JY29tcGlsZXJfZnJlZSgmYyk7Ci0JYXNzZXJ0KGNvIHx8IFB5RXJyX09jY3VycmVkKCkpOwotCXJldHVybiBjbzsKKyAgICBjb21waWxlcl9mcmVlKCZjKTsKKyAgICBhc3NlcnQoY28gfHwgUHlFcnJfT2NjdXJyZWQoKSk7CisgICAgcmV0dXJuIGNvOwogfQogCiBQeUNvZGVPYmplY3QgKgogUHlOb2RlX0NvbXBpbGUoc3RydWN0IF9ub2RlICpuLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKLQltb2RfdHkgbW9kOwotCVB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKLQlpZiAoIWFyZW5hKQotCQlyZXR1cm4gTlVMTDsKLQltb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBOVUxMLCBmaWxlbmFtZSwgYXJlbmEpOwotCWlmIChtb2QpCi0JCWNvID0gUHlBU1RfQ29tcGlsZShtb2QsIGZpbGVuYW1lLCBOVUxMLCBhcmVuYSk7Ci0JUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQlyZXR1cm4gY287CisgICAgUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7CisgICAgbW9kX3R5IG1vZDsKKyAgICBQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7CisgICAgaWYgKCFhcmVuYSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbW9kID0gUHlBU1RfRnJvbU5vZGUobiwgTlVMTCwgZmlsZW5hbWUsIGFyZW5hKTsKKyAgICBpZiAobW9kKQorICAgICAgICBjbyA9IFB5QVNUX0NvbXBpbGUobW9kLCBmaWxlbmFtZSwgTlVMTCwgYXJlbmEpOworICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgcmV0dXJuIGNvOwogfQogCiBzdGF0aWMgdm9pZAogY29tcGlsZXJfZnJlZShzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7Ci0JaWYgKGMtPmNfc3QpCi0JCVB5U3ltdGFibGVfRnJlZShjLT5jX3N0KTsKLQlpZiAoYy0+Y19mdXR1cmUpCi0JCVB5T2JqZWN0X0ZyZWUoYy0+Y19mdXR1cmUpOwotCVB5X0RFQ1JFRihjLT5jX3N0YWNrKTsKKyAgICBpZiAoYy0+Y19zdCkKKyAgICAgICAgUHlTeW10YWJsZV9GcmVlKGMtPmNfc3QpOworICAgIGlmIChjLT5jX2Z1dHVyZSkKKyAgICAgICAgUHlPYmplY3RfRnJlZShjLT5jX2Z1dHVyZSk7CisgICAgUHlfREVDUkVGKGMtPmNfc3RhY2spOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdDJkaWN0KFB5T2JqZWN0ICpsaXN0KQogewotCVB5X3NzaXplX3QgaSwgbjsKLQlQeU9iamVjdCAqdiwgKms7Ci0JUHlPYmplY3QgKmRpY3QgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFkaWN0KSByZXR1cm4gTlVMTDsKKyAgICBQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKnYsICprOworICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOworICAgIGlmICghZGljdCkgcmV0dXJuIE5VTEw7CiAKLQluID0gUHlMaXN0X1NpemUobGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQl2ID0gUHlJbnRfRnJvbUxvbmcoaSk7Ci0JCWlmICghdikgewotCQkJUHlfREVDUkVGKGRpY3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJayA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKLQkJayA9IFB5VHVwbGVfUGFjaygyLCBrLCBrLT5vYl90eXBlKTsKLQkJaWYgKGsgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbShkaWN0LCBrLCB2KSA8IDApIHsKLQkJCVB5X1hERUNSRUYoayk7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQlQeV9ERUNSRUYoZGljdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYoayk7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JcmV0dXJuIGRpY3Q7CisgICAgbiA9IFB5TGlzdF9TaXplKGxpc3QpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKGkpOworICAgICAgICBpZiAoIXYpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGsgPSBQeUxpc3RfR0VUX0lURU0obGlzdCwgaSk7CisgICAgICAgIGsgPSBQeVR1cGxlX1BhY2soMiwgaywgay0+b2JfdHlwZSk7CisgICAgICAgIGlmIChrID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW0oZGljdCwgaywgdikgPCAwKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGspOworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGspOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQorICAgIHJldHVybiBkaWN0OwogfQogCiAvKiBSZXR1cm4gbmV3IGRpY3QgY29udGFpbmluZyBuYW1lcyBmcm9tIHNyYyB0aGF0IG1hdGNoIHNjb3BlKHMpLgogCiBzcmMgaXMgYSBzeW1ib2wgdGFibGUgZGljdGlvbmFyeS4gIElmIHRoZSBzY29wZSBvZiBhIG5hbWUgbWF0Y2hlcwotZWl0aGVyIHNjb3BlX3R5cGUgb3IgZmxhZyBpcyBzZXQsIGluc2VydCBpdCBpbnRvIHRoZSBuZXcgZGljdC4JVGhlCitlaXRoZXIgc2NvcGVfdHlwZSBvciBmbGFnIGlzIHNldCwgaW5zZXJ0IGl0IGludG8gdGhlIG5ldyBkaWN0LiAgVGhlCiB2YWx1ZXMgYXJlIGludGVnZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgYW5kIGluY3JlYXNpbmcgYnkgb25lIGZvcgogZWFjaCBrZXkuCiAqLwpAQCAtMzU4LDE4MCArMzU4LDE4MCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRpY3RieXR5cGUoUHlPYmplY3QgKnNyYywgaW50IHNjb3BlX3R5cGUsIGludCBmbGFnLCBpbnQgb2Zmc2V0KQogewotCVB5X3NzaXplX3QgcG9zID0gMCwgaSA9IG9mZnNldCwgc2NvcGU7Ci0JUHlPYmplY3QgKmssICp2LCAqZGVzdCA9IFB5RGljdF9OZXcoKTsKKyAgICBQeV9zc2l6ZV90IHBvcyA9IDAsIGkgPSBvZmZzZXQsIHNjb3BlOworICAgIFB5T2JqZWN0ICprLCAqdiwgKmRlc3QgPSBQeURpY3RfTmV3KCk7CiAKLQlhc3NlcnQob2Zmc2V0ID49IDApOwotCWlmIChkZXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGFzc2VydChvZmZzZXQgPj0gMCk7CisgICAgaWYgKGRlc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQl3aGlsZSAoUHlEaWN0X05leHQoc3JjLCAmcG9zLCAmaywgJnYpKSB7Ci0JCS8qIFhYWCB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIG1hY3JvIGluIHN5bXRhYmxlLmggKi8KLQkJYXNzZXJ0KFB5SW50X0NoZWNrKHYpKTsKLQkJc2NvcGUgPSAoUHlJbnRfQVNfTE9ORyh2KSA+PiBTQ09QRV9PRkYpICYgU0NPUEVfTUFTSzsKKyAgICB3aGlsZSAoUHlEaWN0X05leHQoc3JjLCAmcG9zLCAmaywgJnYpKSB7CisgICAgICAgIC8qIFhYWCB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIG1hY3JvIGluIHN5bXRhYmxlLmggKi8KKyAgICAgICAgYXNzZXJ0KFB5SW50X0NoZWNrKHYpKTsKKyAgICAgICAgc2NvcGUgPSAoUHlJbnRfQVNfTE9ORyh2KSA+PiBTQ09QRV9PRkYpICYgU0NPUEVfTUFTSzsKIAotCQlpZiAoc2NvcGUgPT0gc2NvcGVfdHlwZSB8fCBQeUludF9BU19MT05HKHYpICYgZmxhZykgewotCQkJUHlPYmplY3QgKnR1cGxlLCAqaXRlbSA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQkJaWYgKGl0ZW0gPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihkZXN0KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWkrKzsKLQkJCXR1cGxlID0gUHlUdXBsZV9QYWNrKDIsIGssIGstPm9iX3R5cGUpOwotCQkJaWYgKCF0dXBsZSB8fCBQeURpY3RfU2V0SXRlbShkZXN0LCB0dXBsZSwgaXRlbSkgPCAwKSB7Ci0JCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJCVB5X0RFQ1JFRihkZXN0KTsKLQkJCQlQeV9YREVDUkVGKHR1cGxlKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCVB5X0RFQ1JFRih0dXBsZSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGRlc3Q7CisgICAgICAgIGlmIChzY29wZSA9PSBzY29wZV90eXBlIHx8IFB5SW50X0FTX0xPTkcodikgJiBmbGFnKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdHVwbGUsICppdGVtID0gUHlJbnRfRnJvbUxvbmcoaSk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRlc3QpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgdHVwbGUgPSBQeVR1cGxlX1BhY2soMiwgaywgay0+b2JfdHlwZSk7CisgICAgICAgICAgICBpZiAoIXR1cGxlIHx8IFB5RGljdF9TZXRJdGVtKGRlc3QsIHR1cGxlLCBpdGVtKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRlc3QpOworICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodHVwbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGVzdDsKIH0KIAogc3RhdGljIHZvaWQKIGNvbXBpbGVyX3VuaXRfY2hlY2soc3RydWN0IGNvbXBpbGVyX3VuaXQgKnUpCiB7Ci0JYmFzaWNibG9jayAqYmxvY2s7Ci0JZm9yIChibG9jayA9IHUtPnVfYmxvY2tzOyBibG9jayAhPSBOVUxMOyBibG9jayA9IGJsb2NrLT5iX2xpc3QpIHsKLQkJYXNzZXJ0KCh2b2lkICopYmxvY2sgIT0gKHZvaWQgKikweGNiY2JjYmNiKTsKLQkJYXNzZXJ0KCh2b2lkICopYmxvY2sgIT0gKHZvaWQgKikweGZiZmJmYmZiKTsKLQkJYXNzZXJ0KCh2b2lkICopYmxvY2sgIT0gKHZvaWQgKikweGRiZGJkYmRiKTsKLQkJaWYgKGJsb2NrLT5iX2luc3RyICE9IE5VTEwpIHsKLQkJCWFzc2VydChibG9jay0+Yl9pYWxsb2MgPiAwKTsKLQkJCWFzc2VydChibG9jay0+Yl9pdXNlZCA+IDApOwotCQkJYXNzZXJ0KGJsb2NrLT5iX2lhbGxvYyA+PSBibG9jay0+Yl9pdXNlZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhc3NlcnQgKGJsb2NrLT5iX2l1c2VkID09IDApOwotCQkJYXNzZXJ0IChibG9jay0+Yl9pYWxsb2MgPT0gMCk7Ci0JCX0KLQl9CisgICAgYmFzaWNibG9jayAqYmxvY2s7CisgICAgZm9yIChibG9jayA9IHUtPnVfYmxvY2tzOyBibG9jayAhPSBOVUxMOyBibG9jayA9IGJsb2NrLT5iX2xpc3QpIHsKKyAgICAgICAgYXNzZXJ0KCh2b2lkICopYmxvY2sgIT0gKHZvaWQgKikweGNiY2JjYmNiKTsKKyAgICAgICAgYXNzZXJ0KCh2b2lkICopYmxvY2sgIT0gKHZvaWQgKikweGZiZmJmYmZiKTsKKyAgICAgICAgYXNzZXJ0KCh2b2lkICopYmxvY2sgIT0gKHZvaWQgKikweGRiZGJkYmRiKTsKKyAgICAgICAgaWYgKGJsb2NrLT5iX2luc3RyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFzc2VydChibG9jay0+Yl9pYWxsb2MgPiAwKTsKKyAgICAgICAgICAgIGFzc2VydChibG9jay0+Yl9pdXNlZCA+IDApOworICAgICAgICAgICAgYXNzZXJ0KGJsb2NrLT5iX2lhbGxvYyA+PSBibG9jay0+Yl9pdXNlZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQgKGJsb2NrLT5iX2l1c2VkID09IDApOworICAgICAgICAgICAgYXNzZXJ0IChibG9jay0+Yl9pYWxsb2MgPT0gMCk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiBjb21waWxlcl91bml0X2ZyZWUoc3RydWN0IGNvbXBpbGVyX3VuaXQgKnUpCiB7Ci0JYmFzaWNibG9jayAqYiwgKm5leHQ7CisgICAgYmFzaWNibG9jayAqYiwgKm5leHQ7CiAKLQljb21waWxlcl91bml0X2NoZWNrKHUpOwotCWIgPSB1LT51X2Jsb2NrczsKLQl3aGlsZSAoYiAhPSBOVUxMKSB7Ci0JCWlmIChiLT5iX2luc3RyKQotCQkJUHlPYmplY3RfRnJlZSgodm9pZCAqKWItPmJfaW5zdHIpOwotCQluZXh0ID0gYi0+Yl9saXN0OwotCQlQeU9iamVjdF9GcmVlKCh2b2lkICopYik7Ci0JCWIgPSBuZXh0OwotCX0KLQlQeV9DTEVBUih1LT51X3N0ZSk7Ci0JUHlfQ0xFQVIodS0+dV9uYW1lKTsKLQlQeV9DTEVBUih1LT51X2NvbnN0cyk7Ci0JUHlfQ0xFQVIodS0+dV9uYW1lcyk7Ci0JUHlfQ0xFQVIodS0+dV92YXJuYW1lcyk7Ci0JUHlfQ0xFQVIodS0+dV9mcmVldmFycyk7Ci0JUHlfQ0xFQVIodS0+dV9jZWxsdmFycyk7Ci0JUHlfQ0xFQVIodS0+dV9wcml2YXRlKTsKLQlQeU9iamVjdF9GcmVlKHUpOworICAgIGNvbXBpbGVyX3VuaXRfY2hlY2sodSk7CisgICAgYiA9IHUtPnVfYmxvY2tzOworICAgIHdoaWxlIChiICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGItPmJfaW5zdHIpCisgICAgICAgICAgICBQeU9iamVjdF9GcmVlKCh2b2lkICopYi0+Yl9pbnN0cik7CisgICAgICAgIG5leHQgPSBiLT5iX2xpc3Q7CisgICAgICAgIFB5T2JqZWN0X0ZyZWUoKHZvaWQgKiliKTsKKyAgICAgICAgYiA9IG5leHQ7CisgICAgfQorICAgIFB5X0NMRUFSKHUtPnVfc3RlKTsKKyAgICBQeV9DTEVBUih1LT51X25hbWUpOworICAgIFB5X0NMRUFSKHUtPnVfY29uc3RzKTsKKyAgICBQeV9DTEVBUih1LT51X25hbWVzKTsKKyAgICBQeV9DTEVBUih1LT51X3Zhcm5hbWVzKTsKKyAgICBQeV9DTEVBUih1LT51X2ZyZWV2YXJzKTsKKyAgICBQeV9DTEVBUih1LT51X2NlbGx2YXJzKTsKKyAgICBQeV9DTEVBUih1LT51X3ByaXZhdGUpOworICAgIFB5T2JqZWN0X0ZyZWUodSk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2VudGVyX3Njb3BlKHN0cnVjdCBjb21waWxlciAqYywgaWRlbnRpZmllciBuYW1lLCB2b2lkICprZXksCi0JCSAgICAgaW50IGxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lbm8pCiB7Ci0Jc3RydWN0IGNvbXBpbGVyX3VuaXQgKnU7CisgICAgc3RydWN0IGNvbXBpbGVyX3VuaXQgKnU7CiAKLQl1ID0gKHN0cnVjdCBjb21waWxlcl91bml0ICopUHlPYmplY3RfTWFsbG9jKHNpemVvZigKLQkJCQkJCXN0cnVjdCBjb21waWxlcl91bml0KSk7Ci0JaWYgKCF1KSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAwOwotCX0KLQltZW1zZXQodSwgMCwgc2l6ZW9mKHN0cnVjdCBjb21waWxlcl91bml0KSk7Ci0JdS0+dV9hcmdjb3VudCA9IDA7Ci0JdS0+dV9zdGUgPSBQeVN5bXRhYmxlX0xvb2t1cChjLT5jX3N0LCBrZXkpOwotCWlmICghdS0+dV9zdGUpIHsKLQkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JUHlfSU5DUkVGKG5hbWUpOwotCXUtPnVfbmFtZSA9IG5hbWU7Ci0JdS0+dV92YXJuYW1lcyA9IGxpc3QyZGljdCh1LT51X3N0ZS0+c3RlX3Zhcm5hbWVzKTsKLQl1LT51X2NlbGx2YXJzID0gZGljdGJ5dHlwZSh1LT51X3N0ZS0+c3RlX3N5bWJvbHMsIENFTEwsIDAsIDApOwotCWlmICghdS0+dV92YXJuYW1lcyB8fCAhdS0+dV9jZWxsdmFycykgewotCQljb21waWxlcl91bml0X2ZyZWUodSk7Ci0JCXJldHVybiAwOwotCX0KKyAgICB1ID0gKHN0cnVjdCBjb21waWxlcl91bml0ICopUHlPYmplY3RfTWFsbG9jKHNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGVyX3VuaXQpKTsKKyAgICBpZiAoIXUpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG1lbXNldCh1LCAwLCBzaXplb2Yoc3RydWN0IGNvbXBpbGVyX3VuaXQpKTsKKyAgICB1LT51X2FyZ2NvdW50ID0gMDsKKyAgICB1LT51X3N0ZSA9IFB5U3ltdGFibGVfTG9va3VwKGMtPmNfc3QsIGtleSk7CisgICAgaWYgKCF1LT51X3N0ZSkgeworICAgICAgICBjb21waWxlcl91bml0X2ZyZWUodSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgdS0+dV9uYW1lID0gbmFtZTsKKyAgICB1LT51X3Zhcm5hbWVzID0gbGlzdDJkaWN0KHUtPnVfc3RlLT5zdGVfdmFybmFtZXMpOworICAgIHUtPnVfY2VsbHZhcnMgPSBkaWN0Ynl0eXBlKHUtPnVfc3RlLT5zdGVfc3ltYm9scywgQ0VMTCwgMCwgMCk7CisgICAgaWYgKCF1LT51X3Zhcm5hbWVzIHx8ICF1LT51X2NlbGx2YXJzKSB7CisgICAgICAgIGNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JdS0+dV9mcmVldmFycyA9IGRpY3RieXR5cGUodS0+dV9zdGUtPnN0ZV9zeW1ib2xzLCBGUkVFLCBERUZfRlJFRV9DTEFTUywKLQkJCQkgICBQeURpY3RfU2l6ZSh1LT51X2NlbGx2YXJzKSk7Ci0JaWYgKCF1LT51X2ZyZWV2YXJzKSB7Ci0JCWNvbXBpbGVyX3VuaXRfZnJlZSh1KTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIHUtPnVfZnJlZXZhcnMgPSBkaWN0Ynl0eXBlKHUtPnVfc3RlLT5zdGVfc3ltYm9scywgRlJFRSwgREVGX0ZSRUVfQ0xBU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlEaWN0X1NpemUodS0+dV9jZWxsdmFycykpOworICAgIGlmICghdS0+dV9mcmVldmFycykgeworICAgICAgICBjb21waWxlcl91bml0X2ZyZWUodSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXUtPnVfYmxvY2tzID0gTlVMTDsKLQl1LT51X3RtcG5hbWUgPSAwOwotCXUtPnVfbmZibG9ja3MgPSAwOwotCXUtPnVfZmlyc3RsaW5lbm8gPSBsaW5lbm87Ci0JdS0+dV9saW5lbm8gPSAwOwotCXUtPnVfbGluZW5vX3NldCA9IGZhbHNlOwotCXUtPnVfY29uc3RzID0gUHlEaWN0X05ldygpOwotCWlmICghdS0+dV9jb25zdHMpIHsKLQkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JdS0+dV9uYW1lcyA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIXUtPnVfbmFtZXMpIHsKLQkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgdS0+dV9ibG9ja3MgPSBOVUxMOworICAgIHUtPnVfdG1wbmFtZSA9IDA7CisgICAgdS0+dV9uZmJsb2NrcyA9IDA7CisgICAgdS0+dV9maXJzdGxpbmVubyA9IGxpbmVubzsKKyAgICB1LT51X2xpbmVubyA9IDA7CisgICAgdS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7CisgICAgdS0+dV9jb25zdHMgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCF1LT51X2NvbnN0cykgeworICAgICAgICBjb21waWxlcl91bml0X2ZyZWUodSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB1LT51X25hbWVzID0gUHlEaWN0X05ldygpOworICAgIGlmICghdS0+dV9uYW1lcykgeworICAgICAgICBjb21waWxlcl91bml0X2ZyZWUodSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXUtPnVfcHJpdmF0ZSA9IE5VTEw7CisgICAgdS0+dV9wcml2YXRlID0gTlVMTDsKIAotCS8qIFB1c2ggdGhlIG9sZCBjb21waWxlcl91bml0IG9uIHRoZSBzdGFjay4gKi8KLQlpZiAoYy0+dSkgewotCQlQeU9iamVjdCAqd3JhcHBlciA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cihjLT51LCBOVUxMKTsKLQkJaWYgKCF3cmFwcGVyIHx8IFB5TGlzdF9BcHBlbmQoYy0+Y19zdGFjaywgd3JhcHBlcikgPCAwKSB7Ci0JCQlQeV9YREVDUkVGKHdyYXBwZXIpOwotCQkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfREVDUkVGKHdyYXBwZXIpOwotCQl1LT51X3ByaXZhdGUgPSBjLT51LT51X3ByaXZhdGU7Ci0JCVB5X1hJTkNSRUYodS0+dV9wcml2YXRlKTsKLQl9Ci0JYy0+dSA9IHU7CisgICAgLyogUHVzaCB0aGUgb2xkIGNvbXBpbGVyX3VuaXQgb24gdGhlIHN0YWNrLiAqLworICAgIGlmIChjLT51KSB7CisgICAgICAgIFB5T2JqZWN0ICp3cmFwcGVyID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKGMtPnUsIE5VTEwpOworICAgICAgICBpZiAoIXdyYXBwZXIgfHwgUHlMaXN0X0FwcGVuZChjLT5jX3N0YWNrLCB3cmFwcGVyKSA8IDApIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYod3JhcHBlcik7CisgICAgICAgICAgICBjb21waWxlcl91bml0X2ZyZWUodSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYod3JhcHBlcik7CisgICAgICAgIHUtPnVfcHJpdmF0ZSA9IGMtPnUtPnVfcHJpdmF0ZTsKKyAgICAgICAgUHlfWElOQ1JFRih1LT51X3ByaXZhdGUpOworICAgIH0KKyAgICBjLT51ID0gdTsKIAotCWMtPmNfbmVzdGxldmVsKys7Ci0JaWYgKGNvbXBpbGVyX3VzZV9uZXdfYmxvY2soYykgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisgICAgYy0+Y19uZXN0bGV2ZWwrKzsKKyAgICBpZiAoY29tcGlsZXJfdXNlX25ld19ibG9jayhjKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCXJldHVybiAxOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogY29tcGlsZXJfZXhpdF9zY29wZShzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7Ci0JaW50IG47Ci0JUHlPYmplY3QgKndyYXBwZXI7CisgICAgaW50IG47CisgICAgUHlPYmplY3QgKndyYXBwZXI7CiAKLQljLT5jX25lc3RsZXZlbC0tOwotCWNvbXBpbGVyX3VuaXRfZnJlZShjLT51KTsKLQkvKiBSZXN0b3JlIGMtPnUgdG8gdGhlIHBhcmVudCB1bml0LiAqLwotCW4gPSBQeUxpc3RfR0VUX1NJWkUoYy0+Y19zdGFjaykgLSAxOwotCWlmIChuID49IDApIHsKLQkJd3JhcHBlciA9IFB5TGlzdF9HRVRfSVRFTShjLT5jX3N0YWNrLCBuKTsKLQkJYy0+dSA9IChzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqKVB5Q09iamVjdF9Bc1ZvaWRQdHIod3JhcHBlcik7Ci0JCWFzc2VydChjLT51KTsKLQkJLyogd2UgYXJlIGRlbGV0aW5nIGZyb20gYSBsaXN0IHNvIHRoaXMgcmVhbGx5IHNob3VsZG4ndCBmYWlsICovCi0JCWlmIChQeVNlcXVlbmNlX0RlbEl0ZW0oYy0+Y19zdGFjaywgbikgPCAwKQotCQkJUHlfRmF0YWxFcnJvcigiY29tcGlsZXJfZXhpdF9zY29wZSgpIik7Ci0JCWNvbXBpbGVyX3VuaXRfY2hlY2soYy0+dSk7Ci0JfQotCWVsc2UKLQkJYy0+dSA9IE5VTEw7CisgICAgYy0+Y19uZXN0bGV2ZWwtLTsKKyAgICBjb21waWxlcl91bml0X2ZyZWUoYy0+dSk7CisgICAgLyogUmVzdG9yZSBjLT51IHRvIHRoZSBwYXJlbnQgdW5pdC4gKi8KKyAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGMtPmNfc3RhY2spIC0gMTsKKyAgICBpZiAobiA+PSAwKSB7CisgICAgICAgIHdyYXBwZXIgPSBQeUxpc3RfR0VUX0lURU0oYy0+Y19zdGFjaywgbik7CisgICAgICAgIGMtPnUgPSAoc3RydWN0IGNvbXBpbGVyX3VuaXQgKilQeUNPYmplY3RfQXNWb2lkUHRyKHdyYXBwZXIpOworICAgICAgICBhc3NlcnQoYy0+dSk7CisgICAgICAgIC8qIHdlIGFyZSBkZWxldGluZyBmcm9tIGEgbGlzdCBzbyB0aGlzIHJlYWxseSBzaG91bGRuJ3QgZmFpbCAqLworICAgICAgICBpZiAoUHlTZXF1ZW5jZV9EZWxJdGVtKGMtPmNfc3RhY2ssIG4pIDwgMCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNvbXBpbGVyX2V4aXRfc2NvcGUoKSIpOworICAgICAgICBjb21waWxlcl91bml0X2NoZWNrKGMtPnUpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGMtPnUgPSBOVUxMOwogCiB9CiAKQEAgLTU0Miw5ICs1NDIsOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGNvbXBpbGVyX25ld190bXBuYW1lKHN0cnVjdCBjb21waWxlciAqYykKIHsKLQljaGFyIHRtcG5hbWVbMjU2XTsKLQlQeU9TX3NucHJpbnRmKHRtcG5hbWUsIHNpemVvZih0bXBuYW1lKSwgIl9bJWRdIiwgKytjLT51LT51X3RtcG5hbWUpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKHRtcG5hbWUpOworICAgIGNoYXIgdG1wbmFtZVsyNTZdOworICAgIFB5T1Nfc25wcmludGYodG1wbmFtZSwgc2l6ZW9mKHRtcG5hbWUpLCAiX1slZF0iLCArK2MtPnUtPnVfdG1wbmFtZSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcodG1wbmFtZSk7CiB9CiAKIC8qIEFsbG9jYXRlIGEgbmV3IGJsb2NrIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgpAQCAtNTU0LDUwICs1NTQsNTAgQEAKIHN0YXRpYyBiYXNpY2Jsb2NrICoKIGNvbXBpbGVyX25ld19ibG9jayhzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7Ci0JYmFzaWNibG9jayAqYjsKLQlzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsKKyAgICBiYXNpY2Jsb2NrICpiOworICAgIHN0cnVjdCBjb21waWxlcl91bml0ICp1OwogCi0JdSA9IGMtPnU7Ci0JYiA9IChiYXNpY2Jsb2NrICopUHlPYmplY3RfTWFsbG9jKHNpemVvZihiYXNpY2Jsb2NrKSk7Ci0JaWYgKGIgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtc2V0KCh2b2lkICopYiwgMCwgc2l6ZW9mKGJhc2ljYmxvY2spKTsKLQkvKiBFeHRlbmQgdGhlIHNpbmdseSBsaW5rZWQgbGlzdCBvZiBibG9ja3Mgd2l0aCBuZXcgYmxvY2suICovCi0JYi0+Yl9saXN0ID0gdS0+dV9ibG9ja3M7Ci0JdS0+dV9ibG9ja3MgPSBiOwotCXJldHVybiBiOworICAgIHUgPSBjLT51OworICAgIGIgPSAoYmFzaWNibG9jayAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoYmFzaWNibG9jaykpOworICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldCgodm9pZCAqKWIsIDAsIHNpemVvZihiYXNpY2Jsb2NrKSk7CisgICAgLyogRXh0ZW5kIHRoZSBzaW5nbHkgbGlua2VkIGxpc3Qgb2YgYmxvY2tzIHdpdGggbmV3IGJsb2NrLiAqLworICAgIGItPmJfbGlzdCA9IHUtPnVfYmxvY2tzOworICAgIHUtPnVfYmxvY2tzID0gYjsKKyAgICByZXR1cm4gYjsKIH0KIAogc3RhdGljIGJhc2ljYmxvY2sgKgogY29tcGlsZXJfdXNlX25ld19ibG9jayhzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7Ci0JYmFzaWNibG9jayAqYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKGJsb2NrID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWMtPnUtPnVfY3VyYmxvY2sgPSBibG9jazsKLQlyZXR1cm4gYmxvY2s7CisgICAgYmFzaWNibG9jayAqYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGJsb2NrID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGMtPnUtPnVfY3VyYmxvY2sgPSBibG9jazsKKyAgICByZXR1cm4gYmxvY2s7CiB9CiAKIHN0YXRpYyBiYXNpY2Jsb2NrICoKIGNvbXBpbGVyX25leHRfYmxvY2soc3RydWN0IGNvbXBpbGVyICpjKQogewotCWJhc2ljYmxvY2sgKmJsb2NrID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChibG9jayA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQljLT51LT51X2N1cmJsb2NrLT5iX25leHQgPSBibG9jazsKLQljLT51LT51X2N1cmJsb2NrID0gYmxvY2s7Ci0JcmV0dXJuIGJsb2NrOworICAgIGJhc2ljYmxvY2sgKmJsb2NrID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChibG9jayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjLT51LT51X2N1cmJsb2NrLT5iX25leHQgPSBibG9jazsKKyAgICBjLT51LT51X2N1cmJsb2NrID0gYmxvY2s7CisgICAgcmV0dXJuIGJsb2NrOwogfQogCiBzdGF0aWMgYmFzaWNibG9jayAqCiBjb21waWxlcl91c2VfbmV4dF9ibG9jayhzdHJ1Y3QgY29tcGlsZXIgKmMsIGJhc2ljYmxvY2sgKmJsb2NrKQogewotCWFzc2VydChibG9jayAhPSBOVUxMKTsKLQljLT51LT51X2N1cmJsb2NrLT5iX25leHQgPSBibG9jazsKLQljLT51LT51X2N1cmJsb2NrID0gYmxvY2s7Ci0JcmV0dXJuIGJsb2NrOworICAgIGFzc2VydChibG9jayAhPSBOVUxMKTsKKyAgICBjLT51LT51X2N1cmJsb2NrLT5iX25leHQgPSBibG9jazsKKyAgICBjLT51LT51X2N1cmJsb2NrID0gYmxvY2s7CisgICAgcmV0dXJuIGJsb2NrOwogfQogCiAvKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGN1cnJlbnQgYmxvY2sncwpAQCAtNjA4LDQ0ICs2MDgsNDQgQEAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX25leHRfaW5zdHIoc3RydWN0IGNvbXBpbGVyICpjLCBiYXNpY2Jsb2NrICpiKQogewotCWFzc2VydChiICE9IE5VTEwpOwotCWlmIChiLT5iX2luc3RyID09IE5VTEwpIHsKLQkJYi0+Yl9pbnN0ciA9IChzdHJ1Y3QgaW5zdHIgKilQeU9iamVjdF9NYWxsb2MoCi0JCQkJIHNpemVvZihzdHJ1Y3QgaW5zdHIpICogREVGQVVMVF9CTE9DS19TSVpFKTsKLQkJaWYgKGItPmJfaW5zdHIgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQliLT5iX2lhbGxvYyA9IERFRkFVTFRfQkxPQ0tfU0laRTsKLQkJbWVtc2V0KChjaGFyICopYi0+Yl9pbnN0ciwgMCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW5zdHIpICogREVGQVVMVF9CTE9DS19TSVpFKTsKLQl9Ci0JZWxzZSBpZiAoYi0+Yl9pdXNlZCA9PSBiLT5iX2lhbGxvYykgewotCQlzdHJ1Y3QgaW5zdHIgKnRtcDsKLQkJc2l6ZV90IG9sZHNpemUsIG5ld3NpemU7Ci0JCW9sZHNpemUgPSBiLT5iX2lhbGxvYyAqIHNpemVvZihzdHJ1Y3QgaW5zdHIpOwotCQluZXdzaXplID0gb2xkc2l6ZSA8PCAxOworICAgIGFzc2VydChiICE9IE5VTEwpOworICAgIGlmIChiLT5iX2luc3RyID09IE5VTEwpIHsKKyAgICAgICAgYi0+Yl9pbnN0ciA9IChzdHJ1Y3QgaW5zdHIgKilQeU9iamVjdF9NYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbnN0cikgKiBERUZBVUxUX0JMT0NLX1NJWkUpOworICAgICAgICBpZiAoYi0+Yl9pbnN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGItPmJfaWFsbG9jID0gREVGQVVMVF9CTE9DS19TSVpFOworICAgICAgICBtZW1zZXQoKGNoYXIgKiliLT5iX2luc3RyLCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbnN0cikgKiBERUZBVUxUX0JMT0NLX1NJWkUpOworICAgIH0KKyAgICBlbHNlIGlmIChiLT5iX2l1c2VkID09IGItPmJfaWFsbG9jKSB7CisgICAgICAgIHN0cnVjdCBpbnN0ciAqdG1wOworICAgICAgICBzaXplX3Qgb2xkc2l6ZSwgbmV3c2l6ZTsKKyAgICAgICAgb2xkc2l6ZSA9IGItPmJfaWFsbG9jICogc2l6ZW9mKHN0cnVjdCBpbnN0cik7CisgICAgICAgIG5ld3NpemUgPSBvbGRzaXplIDw8IDE7CiAKLQkJaWYgKG9sZHNpemUgPiAoUFlfU0laRV9NQVggPj4gMSkpIHsKLQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKyAgICAgICAgaWYgKG9sZHNpemUgPiAoUFlfU0laRV9NQVggPj4gMSkpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KIAotCQlpZiAobmV3c2l6ZSA9PSAwKSB7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWItPmJfaWFsbG9jIDw8PSAxOwotCQl0bXAgPSAoc3RydWN0IGluc3RyICopUHlPYmplY3RfUmVhbGxvYygKLQkJCQkJCSh2b2lkICopYi0+Yl9pbnN0ciwgbmV3c2l6ZSk7Ci0JCWlmICh0bXAgPT0gTlVMTCkgewotCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQliLT5iX2luc3RyID0gdG1wOwotCQltZW1zZXQoKGNoYXIgKiliLT5iX2luc3RyICsgb2xkc2l6ZSwgMCwgbmV3c2l6ZSAtIG9sZHNpemUpOwotCX0KLQlyZXR1cm4gYi0+Yl9pdXNlZCsrOworICAgICAgICBpZiAobmV3c2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGItPmJfaWFsbG9jIDw8PSAxOworICAgICAgICB0bXAgPSAoc3RydWN0IGluc3RyICopUHlPYmplY3RfUmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWItPmJfaW5zdHIsIG5ld3NpemUpOworICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYi0+Yl9pbnN0ciA9IHRtcDsKKyAgICAgICAgbWVtc2V0KChjaGFyICopYi0+Yl9pbnN0ciArIG9sZHNpemUsIDAsIG5ld3NpemUgLSBvbGRzaXplKTsKKyAgICB9CisgICAgcmV0dXJuIGItPmJfaXVzZWQrKzsKIH0KIAogLyogU2V0IHRoZSBpX2xpbmVubyBtZW1iZXIgb2YgdGhlIGluc3RydWN0aW9uIGF0IG9mZnNldCBvZmYgaWYgdGhlCkBAIC02NjMsMjM1ICs2NjMsMjM1IEBACiBzdGF0aWMgdm9pZAogY29tcGlsZXJfc2V0X2xpbmVubyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBvZmYpCiB7Ci0JYmFzaWNibG9jayAqYjsKLQlpZiAoYy0+dS0+dV9saW5lbm9fc2V0KQotCQlyZXR1cm47Ci0JYy0+dS0+dV9saW5lbm9fc2V0ID0gdHJ1ZTsKLQliID0gYy0+dS0+dV9jdXJibG9jazsKLQliLT5iX2luc3RyW29mZl0uaV9saW5lbm8gPSBjLT51LT51X2xpbmVubzsKKyAgICBiYXNpY2Jsb2NrICpiOworICAgIGlmIChjLT51LT51X2xpbmVub19zZXQpCisgICAgICAgIHJldHVybjsKKyAgICBjLT51LT51X2xpbmVub19zZXQgPSB0cnVlOworICAgIGIgPSBjLT51LT51X2N1cmJsb2NrOworICAgIGItPmJfaW5zdHJbb2ZmXS5pX2xpbmVubyA9IGMtPnUtPnVfbGluZW5vOwogfQogCiBzdGF0aWMgaW50CiBvcGNvZGVfc3RhY2tfZWZmZWN0KGludCBvcGNvZGUsIGludCBvcGFyZykKIHsKLQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIFBPUF9UT1A6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgUk9UX1RXTzoKLQkJY2FzZSBST1RfVEhSRUU6Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBEVVBfVE9QOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgUk9UX0ZPVVI6Ci0JCQlyZXR1cm4gMDsKKyAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIFBPUF9UT1A6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgUk9UX1RXTzoKKyAgICAgICAgY2FzZSBST1RfVEhSRUU6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBEVVBfVE9QOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgUk9UX0ZPVVI6CisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQljYXNlIFVOQVJZX1BPU0lUSVZFOgotCQljYXNlIFVOQVJZX05FR0FUSVZFOgotCQljYXNlIFVOQVJZX05PVDoKLQkJY2FzZSBVTkFSWV9DT05WRVJUOgotCQljYXNlIFVOQVJZX0lOVkVSVDoKLQkJCXJldHVybiAwOworICAgICAgICBjYXNlIFVOQVJZX1BPU0lUSVZFOgorICAgICAgICBjYXNlIFVOQVJZX05FR0FUSVZFOgorICAgICAgICBjYXNlIFVOQVJZX05PVDoKKyAgICAgICAgY2FzZSBVTkFSWV9DT05WRVJUOgorICAgICAgICBjYXNlIFVOQVJZX0lOVkVSVDoKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWNhc2UgTElTVF9BUFBFTkQ6Ci0JCQlyZXR1cm4gLTI7CisgICAgICAgIGNhc2UgTElTVF9BUFBFTkQ6CisgICAgICAgICAgICByZXR1cm4gLTI7CiAKLQkJY2FzZSBCSU5BUllfUE9XRVI6Ci0JCWNhc2UgQklOQVJZX01VTFRJUExZOgotCQljYXNlIEJJTkFSWV9ESVZJREU6Ci0JCWNhc2UgQklOQVJZX01PRFVMTzoKLQkJY2FzZSBCSU5BUllfQUREOgotCQljYXNlIEJJTkFSWV9TVUJUUkFDVDoKLQkJY2FzZSBCSU5BUllfU1VCU0NSOgotCQljYXNlIEJJTkFSWV9GTE9PUl9ESVZJREU6Ci0JCWNhc2UgQklOQVJZX1RSVUVfRElWSURFOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIElOUExBQ0VfRkxPT1JfRElWSURFOgotCQljYXNlIElOUExBQ0VfVFJVRV9ESVZJREU6Ci0JCQlyZXR1cm4gLTE7CisgICAgICAgIGNhc2UgQklOQVJZX1BPV0VSOgorICAgICAgICBjYXNlIEJJTkFSWV9NVUxUSVBMWToKKyAgICAgICAgY2FzZSBCSU5BUllfRElWSURFOgorICAgICAgICBjYXNlIEJJTkFSWV9NT0RVTE86CisgICAgICAgIGNhc2UgQklOQVJZX0FERDoKKyAgICAgICAgY2FzZSBCSU5BUllfU1VCVFJBQ1Q6CisgICAgICAgIGNhc2UgQklOQVJZX1NVQlNDUjoKKyAgICAgICAgY2FzZSBCSU5BUllfRkxPT1JfRElWSURFOgorICAgICAgICBjYXNlIEJJTkFSWV9UUlVFX0RJVklERToKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBJTlBMQUNFX0ZMT09SX0RJVklERToKKyAgICAgICAgY2FzZSBJTlBMQUNFX1RSVUVfRElWSURFOgorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWNhc2UgU0xJQ0UrMDoKLQkJCXJldHVybiAxOwotCQljYXNlIFNMSUNFKzE6Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBTTElDRSsyOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgU0xJQ0UrMzoKLQkJCXJldHVybiAtMTsKKyAgICAgICAgY2FzZSBTTElDRSswOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgU0xJQ0UrMToKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFNMSUNFKzI6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBTTElDRSszOgorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWNhc2UgU1RPUkVfU0xJQ0UrMDoKLQkJCXJldHVybiAtMjsKLQkJY2FzZSBTVE9SRV9TTElDRSsxOgotCQkJcmV0dXJuIC0zOwotCQljYXNlIFNUT1JFX1NMSUNFKzI6Ci0JCQlyZXR1cm4gLTM7Ci0JCWNhc2UgU1RPUkVfU0xJQ0UrMzoKLQkJCXJldHVybiAtNDsKKyAgICAgICAgY2FzZSBTVE9SRV9TTElDRSswOgorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBjYXNlIFNUT1JFX1NMSUNFKzE6CisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIGNhc2UgU1RPUkVfU0xJQ0UrMjoKKyAgICAgICAgICAgIHJldHVybiAtMzsKKyAgICAgICAgY2FzZSBTVE9SRV9TTElDRSszOgorICAgICAgICAgICAgcmV0dXJuIC00OwogCi0JCWNhc2UgREVMRVRFX1NMSUNFKzA6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgREVMRVRFX1NMSUNFKzE6Ci0JCQlyZXR1cm4gLTI7Ci0JCWNhc2UgREVMRVRFX1NMSUNFKzI6Ci0JCQlyZXR1cm4gLTI7Ci0JCWNhc2UgREVMRVRFX1NMSUNFKzM6Ci0JCQlyZXR1cm4gLTM7CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzA6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzE6CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzI6CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGNhc2UgREVMRVRFX1NMSUNFKzM6CisgICAgICAgICAgICByZXR1cm4gLTM7CiAKLQkJY2FzZSBJTlBMQUNFX0FERDoKLQkJY2FzZSBJTlBMQUNFX1NVQlRSQUNUOgotCQljYXNlIElOUExBQ0VfTVVMVElQTFk6Ci0JCWNhc2UgSU5QTEFDRV9ESVZJREU6Ci0JCWNhc2UgSU5QTEFDRV9NT0RVTE86Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgU1RPUkVfU1VCU0NSOgotCQkJcmV0dXJuIC0zOwotCQljYXNlIFNUT1JFX01BUDoKLQkJCXJldHVybiAtMjsKLQkJY2FzZSBERUxFVEVfU1VCU0NSOgotCQkJcmV0dXJuIC0yOworICAgICAgICBjYXNlIElOUExBQ0VfQUREOgorICAgICAgICBjYXNlIElOUExBQ0VfU1VCVFJBQ1Q6CisgICAgICAgIGNhc2UgSU5QTEFDRV9NVUxUSVBMWToKKyAgICAgICAgY2FzZSBJTlBMQUNFX0RJVklERToKKyAgICAgICAgY2FzZSBJTlBMQUNFX01PRFVMTzoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBTVE9SRV9TVUJTQ1I6CisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIGNhc2UgU1RPUkVfTUFQOgorICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICBjYXNlIERFTEVURV9TVUJTQ1I6CisgICAgICAgICAgICByZXR1cm4gLTI7CiAKLQkJY2FzZSBCSU5BUllfTFNISUZUOgotCQljYXNlIEJJTkFSWV9SU0hJRlQ6Ci0JCWNhc2UgQklOQVJZX0FORDoKLQkJY2FzZSBCSU5BUllfWE9SOgotCQljYXNlIEJJTkFSWV9PUjoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBJTlBMQUNFX1BPV0VSOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIEdFVF9JVEVSOgotCQkJcmV0dXJuIDA7CisgICAgICAgIGNhc2UgQklOQVJZX0xTSElGVDoKKyAgICAgICAgY2FzZSBCSU5BUllfUlNISUZUOgorICAgICAgICBjYXNlIEJJTkFSWV9BTkQ6CisgICAgICAgIGNhc2UgQklOQVJZX1hPUjoKKyAgICAgICAgY2FzZSBCSU5BUllfT1I6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgSU5QTEFDRV9QT1dFUjoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBHRVRfSVRFUjoKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWNhc2UgUFJJTlRfRVhQUjoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBQUklOVF9JVEVNOgotCQkJcmV0dXJuIC0xOwotCQljYXNlIFBSSU5UX05FV0xJTkU6Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBQUklOVF9JVEVNX1RPOgotCQkJcmV0dXJuIC0yOwotCQljYXNlIFBSSU5UX05FV0xJTkVfVE86Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgSU5QTEFDRV9MU0hJRlQ6Ci0JCWNhc2UgSU5QTEFDRV9SU0hJRlQ6Ci0JCWNhc2UgSU5QTEFDRV9BTkQ6Ci0JCWNhc2UgSU5QTEFDRV9YT1I6Ci0JCWNhc2UgSU5QTEFDRV9PUjoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBCUkVBS19MT09QOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgV0lUSF9DTEVBTlVQOgotCQkJcmV0dXJuIC0xOyAvKiBYWFggU29tZXRpbWVzIG1vcmUgKi8KLQkJY2FzZSBMT0FEX0xPQ0FMUzoKLQkJCXJldHVybiAxOwotCQljYXNlIFJFVFVSTl9WQUxVRToKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBJTVBPUlRfU1RBUjoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBFWEVDX1NUTVQ6Ci0JCQlyZXR1cm4gLTM7Ci0JCWNhc2UgWUlFTERfVkFMVUU6Ci0JCQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBQUklOVF9FWFBSOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIFBSSU5UX0lURU06CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgUFJJTlRfTkVXTElORToKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFBSSU5UX0lURU1fVE86CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIGNhc2UgUFJJTlRfTkVXTElORV9UTzoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBJTlBMQUNFX0xTSElGVDoKKyAgICAgICAgY2FzZSBJTlBMQUNFX1JTSElGVDoKKyAgICAgICAgY2FzZSBJTlBMQUNFX0FORDoKKyAgICAgICAgY2FzZSBJTlBMQUNFX1hPUjoKKyAgICAgICAgY2FzZSBJTlBMQUNFX09SOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIEJSRUFLX0xPT1A6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBXSVRIX0NMRUFOVVA6CisgICAgICAgICAgICByZXR1cm4gLTE7IC8qIFhYWCBTb21ldGltZXMgbW9yZSAqLworICAgICAgICBjYXNlIExPQURfTE9DQUxTOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgUkVUVVJOX1ZBTFVFOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIElNUE9SVF9TVEFSOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIEVYRUNfU1RNVDoKKyAgICAgICAgICAgIHJldHVybiAtMzsKKyAgICAgICAgY2FzZSBZSUVMRF9WQUxVRToKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWNhc2UgUE9QX0JMT0NLOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgRU5EX0ZJTkFMTFk6Ci0JCQlyZXR1cm4gLTE7IC8qIG9yIC0yIG9yIC0zIGlmIGV4Y2VwdGlvbiBvY2N1cnJlZCAqLwotCQljYXNlIEJVSUxEX0NMQVNTOgotCQkJcmV0dXJuIC0yOworICAgICAgICBjYXNlIFBPUF9CTE9DSzoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIEVORF9GSU5BTExZOgorICAgICAgICAgICAgcmV0dXJuIC0xOyAvKiBvciAtMiBvciAtMyBpZiBleGNlcHRpb24gb2NjdXJyZWQgKi8KKyAgICAgICAgY2FzZSBCVUlMRF9DTEFTUzoKKyAgICAgICAgICAgIHJldHVybiAtMjsKIAotCQljYXNlIFNUT1JFX05BTUU6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgREVMRVRFX05BTUU6Ci0JCQlyZXR1cm4gMDsKLQkJY2FzZSBVTlBBQ0tfU0VRVUVOQ0U6Ci0JCQlyZXR1cm4gb3BhcmctMTsKLQkJY2FzZSBGT1JfSVRFUjoKLQkJCXJldHVybiAxOworICAgICAgICBjYXNlIFNUT1JFX05BTUU6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgREVMRVRFX05BTUU6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBVTlBBQ0tfU0VRVUVOQ0U6CisgICAgICAgICAgICByZXR1cm4gb3BhcmctMTsKKyAgICAgICAgY2FzZSBGT1JfSVRFUjoKKyAgICAgICAgICAgIHJldHVybiAxOwogCi0JCWNhc2UgU1RPUkVfQVRUUjoKLQkJCXJldHVybiAtMjsKLQkJY2FzZSBERUxFVEVfQVRUUjoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBTVE9SRV9HTE9CQUw6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgREVMRVRFX0dMT0JBTDoKLQkJCXJldHVybiAwOwotCQljYXNlIERVUF9UT1BYOgotCQkJcmV0dXJuIG9wYXJnOwotCQljYXNlIExPQURfQ09OU1Q6Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSBMT0FEX05BTUU6Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSBCVUlMRF9UVVBMRToKLQkJY2FzZSBCVUlMRF9MSVNUOgotCQkJcmV0dXJuIDEtb3Bhcmc7Ci0JCWNhc2UgQlVJTERfTUFQOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgTE9BRF9BVFRSOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgQ09NUEFSRV9PUDoKLQkJCXJldHVybiAtMTsKLQkJY2FzZSBJTVBPUlRfTkFNRToKLQkJCXJldHVybiAwOwotCQljYXNlIElNUE9SVF9GUk9NOgotCQkJcmV0dXJuIDE7CisgICAgICAgIGNhc2UgU1RPUkVfQVRUUjoKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgY2FzZSBERUxFVEVfQVRUUjoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBTVE9SRV9HTE9CQUw6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGNhc2UgREVMRVRFX0dMT0JBTDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIERVUF9UT1BYOgorICAgICAgICAgICAgcmV0dXJuIG9wYXJnOworICAgICAgICBjYXNlIExPQURfQ09OU1Q6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBMT0FEX05BTUU6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBCVUlMRF9UVVBMRToKKyAgICAgICAgY2FzZSBCVUlMRF9MSVNUOgorICAgICAgICAgICAgcmV0dXJuIDEtb3Bhcmc7CisgICAgICAgIGNhc2UgQlVJTERfTUFQOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgTE9BRF9BVFRSOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgQ09NUEFSRV9PUDoKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSBJTVBPUlRfTkFNRToKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIElNUE9SVF9GUk9NOgorICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJY2FzZSBKVU1QX0ZPUldBUkQ6Ci0JCWNhc2UgSlVNUF9JRl9GQUxTRToKLQkJY2FzZSBKVU1QX0lGX1RSVUU6Ci0JCWNhc2UgSlVNUF9BQlNPTFVURToKLQkJCXJldHVybiAwOworICAgICAgICBjYXNlIEpVTVBfRk9SV0FSRDoKKyAgICAgICAgY2FzZSBKVU1QX0lGX0ZBTFNFOgorICAgICAgICBjYXNlIEpVTVBfSUZfVFJVRToKKyAgICAgICAgY2FzZSBKVU1QX0FCU09MVVRFOgorICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJY2FzZSBMT0FEX0dMT0JBTDoKLQkJCXJldHVybiAxOworICAgICAgICBjYXNlIExPQURfR0xPQkFMOgorICAgICAgICAgICAgcmV0dXJuIDE7CiAKLQkJY2FzZSBDT05USU5VRV9MT09QOgotCQkJcmV0dXJuIDA7Ci0JCWNhc2UgU0VUVVBfTE9PUDoKLQkJCXJldHVybiAwOwotCQljYXNlIFNFVFVQX0VYQ0VQVDoKLQkJY2FzZSBTRVRVUF9GSU5BTExZOgotCQkJcmV0dXJuIDM7IC8qIGFjdHVhbGx5IHB1c2hlZCBieSBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgY2FzZSBDT05USU5VRV9MT09QOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIFNFVFVQX0VYQ0VQVDoKKyAgICAgICAgY2FzZSBTRVRVUF9GSU5BTExZOgorICAgICAgICAgICAgcmV0dXJuIDM7IC8qIGFjdHVhbGx5IHB1c2hlZCBieSBhbiBleGNlcHRpb24gKi8KIAotCQljYXNlIExPQURfRkFTVDoKLQkJCXJldHVybiAxOwotCQljYXNlIFNUT1JFX0ZBU1Q6Ci0JCQlyZXR1cm4gLTE7Ci0JCWNhc2UgREVMRVRFX0ZBU1Q6Ci0JCQlyZXR1cm4gMDsKKyAgICAgICAgY2FzZSBMT0FEX0ZBU1Q6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBTVE9SRV9GQVNUOgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBjYXNlIERFTEVURV9GQVNUOgorICAgICAgICAgICAgcmV0dXJuIDA7CiAKLQkJY2FzZSBSQUlTRV9WQVJBUkdTOgotCQkJcmV0dXJuIC1vcGFyZzsKKyAgICAgICAgY2FzZSBSQUlTRV9WQVJBUkdTOgorICAgICAgICAgICAgcmV0dXJuIC1vcGFyZzsKICNkZWZpbmUgTkFSR1MobykgKCgobykgJSAyNTYpICsgMiooKG8pIC8gMjU2KSkKLQkJY2FzZSBDQUxMX0ZVTkNUSU9OOgotCQkJcmV0dXJuIC1OQVJHUyhvcGFyZyk7Ci0JCWNhc2UgQ0FMTF9GVU5DVElPTl9WQVI6Ci0JCWNhc2UgQ0FMTF9GVU5DVElPTl9LVzoKLQkJCXJldHVybiAtTkFSR1Mob3BhcmcpLTE7Ci0JCWNhc2UgQ0FMTF9GVU5DVElPTl9WQVJfS1c6Ci0JCQlyZXR1cm4gLU5BUkdTKG9wYXJnKS0yOworICAgICAgICBjYXNlIENBTExfRlVOQ1RJT046CisgICAgICAgICAgICByZXR1cm4gLU5BUkdTKG9wYXJnKTsKKyAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OX1ZBUjoKKyAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OX0tXOgorICAgICAgICAgICAgcmV0dXJuIC1OQVJHUyhvcGFyZyktMTsKKyAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OX1ZBUl9LVzoKKyAgICAgICAgICAgIHJldHVybiAtTkFSR1Mob3BhcmcpLTI7CiAjdW5kZWYgTkFSR1MKLQkJY2FzZSBNQUtFX0ZVTkNUSU9OOgotCQkJcmV0dXJuIC1vcGFyZzsKLQkJY2FzZSBCVUlMRF9TTElDRToKLQkJCWlmIChvcGFyZyA9PSAzKQotCQkJCXJldHVybiAtMjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gLTE7CisgICAgICAgIGNhc2UgTUFLRV9GVU5DVElPTjoKKyAgICAgICAgICAgIHJldHVybiAtb3Bhcmc7CisgICAgICAgIGNhc2UgQlVJTERfU0xJQ0U6CisgICAgICAgICAgICBpZiAob3BhcmcgPT0gMykKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWNhc2UgTUFLRV9DTE9TVVJFOgotCQkJcmV0dXJuIC1vcGFyZzsKLQkJY2FzZSBMT0FEX0NMT1NVUkU6Ci0JCQlyZXR1cm4gMTsKLQkJY2FzZSBMT0FEX0RFUkVGOgotCQkJcmV0dXJuIDE7Ci0JCWNhc2UgU1RPUkVfREVSRUY6Ci0JCQlyZXR1cm4gLTE7Ci0JCWRlZmF1bHQ6Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIm9wY29kZSA9ICVkXG4iLCBvcGNvZGUpOwotCQkJUHlfRmF0YWxFcnJvcigib3Bjb2RlX3N0YWNrX2VmZmVjdCgpIik7CisgICAgICAgIGNhc2UgTUFLRV9DTE9TVVJFOgorICAgICAgICAgICAgcmV0dXJuIC1vcGFyZzsKKyAgICAgICAgY2FzZSBMT0FEX0NMT1NVUkU6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBMT0FEX0RFUkVGOgorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGNhc2UgU1RPUkVfREVSRUY6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm9wY29kZSA9ICVkXG4iLCBvcGNvZGUpOworICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigib3Bjb2RlX3N0YWNrX2VmZmVjdCgpIik7CiAKLQl9Ci0JcmV0dXJuIDA7IC8qIG5vdCByZWFjaGFibGUgKi8KKyAgICB9CisgICAgcmV0dXJuIDA7IC8qIG5vdCByZWFjaGFibGUgKi8KIH0KIAogLyogQWRkIGFuIG9wY29kZSB3aXRoIG5vIGFyZ3VtZW50LgpAQCAtOTAxLDExNiArOTAxLDExNiBAQAogc3RhdGljIGludAogY29tcGlsZXJfYWRkb3Aoc3RydWN0IGNvbXBpbGVyICpjLCBpbnQgb3Bjb2RlKQogewotCWJhc2ljYmxvY2sgKmI7Ci0Jc3RydWN0IGluc3RyICppOwotCWludCBvZmY7Ci0Jb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKLQlpZiAob2ZmIDwgMCkKLQkJcmV0dXJuIDA7Ci0JYiA9IGMtPnUtPnVfY3VyYmxvY2s7Ci0JaSA9ICZiLT5iX2luc3RyW29mZl07Ci0JaS0+aV9vcGNvZGUgPSBvcGNvZGU7Ci0JaS0+aV9oYXNhcmcgPSAwOwotCWlmIChvcGNvZGUgPT0gUkVUVVJOX1ZBTFVFKQotCQliLT5iX3JldHVybiA9IDE7Ci0JY29tcGlsZXJfc2V0X2xpbmVubyhjLCBvZmYpOwotCXJldHVybiAxOworICAgIGJhc2ljYmxvY2sgKmI7CisgICAgc3RydWN0IGluc3RyICppOworICAgIGludCBvZmY7CisgICAgb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKKyAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYiA9IGMtPnUtPnVfY3VyYmxvY2s7CisgICAgaSA9ICZiLT5iX2luc3RyW29mZl07CisgICAgaS0+aV9vcGNvZGUgPSBvcGNvZGU7CisgICAgaS0+aV9oYXNhcmcgPSAwOworICAgIGlmIChvcGNvZGUgPT0gUkVUVVJOX1ZBTFVFKQorICAgICAgICBiLT5iX3JldHVybiA9IDE7CisgICAgY29tcGlsZXJfc2V0X2xpbmVubyhjLCBvZmYpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9hZGRfbyhzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5T2JqZWN0ICpkaWN0LCBQeU9iamVjdCAqbykKIHsKLQlQeU9iamVjdCAqdCwgKnY7Ci0JUHlfc3NpemVfdCBhcmc7Ci0JZG91YmxlIGQ7CisgICAgUHlPYmplY3QgKnQsICp2OworICAgIFB5X3NzaXplX3QgYXJnOworICAgIGRvdWJsZSBkOwogCi0JLyogbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0eXBlcyBhcmVuJ3QgY29lcmNlZCAoZS5nLiwgaW50IGFuZCBsb25nKSAqLwotICAgICAgICAvKiBfYW5kXyB0byBkaXN0aW5ndWlzaCAwLjAgZnJvbSAtMC4wIGUuZy4gb24gSUVFRSBwbGF0Zm9ybXMgKi8KLSAgICAgICAgaWYgKFB5RmxvYXRfQ2hlY2sobykpIHsKLQkJZCA9IFB5RmxvYXRfQVNfRE9VQkxFKG8pOwotCQkvKiBhbGwgd2UgbmVlZCBpcyB0byBtYWtlIHRoZSB0dXBsZSBkaWZmZXJlbnQgaW4gZWl0aGVyIHRoZSAwLjAKLQkJICogb3IgLTAuMCBjYXNlIGZyb20gYWxsIG90aGVycywganVzdCB0byBhdm9pZCB0aGUgImNvZXJjaW9uIi4KLQkJICovCi0JCWlmIChkID09IDAuMCAmJiBjb3B5c2lnbigxLjAsIGQpIDwgMC4wKQotCQkJdCA9IFB5VHVwbGVfUGFjaygzLCBvLCBvLT5vYl90eXBlLCBQeV9Ob25lKTsKLQkJZWxzZQotCQkJdCA9IFB5VHVwbGVfUGFjaygyLCBvLCBvLT5vYl90eXBlKTsKLQl9CisgICAgLyogbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0eXBlcyBhcmVuJ3QgY29lcmNlZCAoZS5nLiwgaW50IGFuZCBsb25nKSAqLworICAgIC8qIF9hbmRfIHRvIGRpc3Rpbmd1aXNoIDAuMCBmcm9tIC0wLjAgZS5nLiBvbiBJRUVFIHBsYXRmb3JtcyAqLworICAgIGlmIChQeUZsb2F0X0NoZWNrKG8pKSB7CisgICAgICAgIGQgPSBQeUZsb2F0X0FTX0RPVUJMRShvKTsKKyAgICAgICAgLyogYWxsIHdlIG5lZWQgaXMgdG8gbWFrZSB0aGUgdHVwbGUgZGlmZmVyZW50IGluIGVpdGhlciB0aGUgMC4wCisgICAgICAgICAqIG9yIC0wLjAgY2FzZSBmcm9tIGFsbCBvdGhlcnMsIGp1c3QgdG8gYXZvaWQgdGhlICJjb2VyY2lvbiIuCisgICAgICAgICAqLworICAgICAgICBpZiAoZCA9PSAwLjAgJiYgY29weXNpZ24oMS4wLCBkKSA8IDAuMCkKKyAgICAgICAgICAgIHQgPSBQeVR1cGxlX1BhY2soMywgbywgby0+b2JfdHlwZSwgUHlfTm9uZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHQgPSBQeVR1cGxlX1BhY2soMiwgbywgby0+b2JfdHlwZSk7CisgICAgfQogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQllbHNlIGlmIChQeUNvbXBsZXhfQ2hlY2sobykpIHsKLQkJUHlfY29tcGxleCB6OwotCQlpbnQgcmVhbF9uZWd6ZXJvLCBpbWFnX25lZ3plcm87Ci0JCS8qIEZvciB0aGUgY29tcGxleCBjYXNlIHdlIG11c3QgbWFrZSBjb21wbGV4KHgsIDAuKQotCQkgICBkaWZmZXJlbnQgZnJvbSBjb21wbGV4KHgsIC0wLikgYW5kIGNvbXBsZXgoMC4sIHkpCi0JCSAgIGRpZmZlcmVudCBmcm9tIGNvbXBsZXgoLTAuLCB5KSwgZm9yIGFueSB4IGFuZCB5LgotCQkgICBBbGwgZm91ciBjb21wbGV4IHplcm9zIG11c3QgYmUgZGlzdGluZ3Vpc2hlZC4qLwotCQl6ID0gUHlDb21wbGV4X0FzQ0NvbXBsZXgobyk7Ci0JCXJlYWxfbmVnemVybyA9IHoucmVhbCA9PSAwLjAgJiYgY29weXNpZ24oMS4wLCB6LnJlYWwpIDwgMC4wOwotCQlpbWFnX25lZ3plcm8gPSB6LmltYWcgPT0gMC4wICYmIGNvcHlzaWduKDEuMCwgei5pbWFnKSA8IDAuMDsKLQkJaWYgKHJlYWxfbmVnemVybyAmJiBpbWFnX25lZ3plcm8pIHsKLQkJCXQgPSBQeVR1cGxlX1BhY2soNSwgbywgby0+b2JfdHlwZSwKLQkJCQkJIFB5X05vbmUsIFB5X05vbmUsIFB5X05vbmUpOwotCQl9Ci0JCWVsc2UgaWYgKGltYWdfbmVnemVybykgewotCQkJdCA9IFB5VHVwbGVfUGFjayg0LCBvLCBvLT5vYl90eXBlLCBQeV9Ob25lLCBQeV9Ob25lKTsKLQkJfQotCQllbHNlIGlmIChyZWFsX25lZ3plcm8pIHsKLQkJCXQgPSBQeVR1cGxlX1BhY2soMywgbywgby0+b2JfdHlwZSwgUHlfTm9uZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0ID0gUHlUdXBsZV9QYWNrKDIsIG8sIG8tPm9iX3R5cGUpOwotCQl9CisgICAgZWxzZSBpZiAoUHlDb21wbGV4X0NoZWNrKG8pKSB7CisgICAgICAgIFB5X2NvbXBsZXggejsKKyAgICAgICAgaW50IHJlYWxfbmVnemVybywgaW1hZ19uZWd6ZXJvOworICAgICAgICAvKiBGb3IgdGhlIGNvbXBsZXggY2FzZSB3ZSBtdXN0IG1ha2UgY29tcGxleCh4LCAwLikKKyAgICAgICAgICAgZGlmZmVyZW50IGZyb20gY29tcGxleCh4LCAtMC4pIGFuZCBjb21wbGV4KDAuLCB5KQorICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSBjb21wbGV4KC0wLiwgeSksIGZvciBhbnkgeCBhbmQgeS4KKyAgICAgICAgICAgQWxsIGZvdXIgY29tcGxleCB6ZXJvcyBtdXN0IGJlIGRpc3Rpbmd1aXNoZWQuKi8KKyAgICAgICAgeiA9IFB5Q29tcGxleF9Bc0NDb21wbGV4KG8pOworICAgICAgICByZWFsX25lZ3plcm8gPSB6LnJlYWwgPT0gMC4wICYmIGNvcHlzaWduKDEuMCwgei5yZWFsKSA8IDAuMDsKKyAgICAgICAgaW1hZ19uZWd6ZXJvID0gei5pbWFnID09IDAuMCAmJiBjb3B5c2lnbigxLjAsIHouaW1hZykgPCAwLjA7CisgICAgICAgIGlmIChyZWFsX25lZ3plcm8gJiYgaW1hZ19uZWd6ZXJvKSB7CisgICAgICAgICAgICB0ID0gUHlUdXBsZV9QYWNrKDUsIG8sIG8tPm9iX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsIFB5X05vbmUsIFB5X05vbmUpOwogICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGltYWdfbmVnemVybykgeworICAgICAgICAgICAgdCA9IFB5VHVwbGVfUGFjayg0LCBvLCBvLT5vYl90eXBlLCBQeV9Ob25lLCBQeV9Ob25lKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChyZWFsX25lZ3plcm8pIHsKKyAgICAgICAgICAgIHQgPSBQeVR1cGxlX1BhY2soMywgbywgby0+b2JfdHlwZSwgUHlfTm9uZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0ID0gUHlUdXBsZV9QYWNrKDIsIG8sIG8tPm9iX3R5cGUpOworICAgICAgICB9CisgICAgfQogI2VuZGlmIC8qIFdJVEhPVVRfQ09NUExFWCAqLwotCWVsc2UgewotCQl0ID0gUHlUdXBsZV9QYWNrKDIsIG8sIG8tPm9iX3R5cGUpOwotICAgICAgICB9Ci0JaWYgKHQgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIGVsc2UgeworICAgICAgICB0ID0gUHlUdXBsZV9QYWNrKDIsIG8sIG8tPm9iX3R5cGUpOworICAgIH0KKyAgICBpZiAodCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQl2ID0gUHlEaWN0X0dldEl0ZW0oZGljdCwgdCk7Ci0JaWYgKCF2KSB7Ci0JCWFyZyA9IFB5RGljdF9TaXplKGRpY3QpOwotCQl2ID0gUHlJbnRfRnJvbUxvbmcoYXJnKTsKLQkJaWYgKCF2KSB7Ci0JCQlQeV9ERUNSRUYodCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIHQsIHYpIDwgMCkgewotCQkJUHlfREVDUkVGKHQpOwotCQkJUHlfREVDUkVGKHYpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JZWxzZQotCQlhcmcgPSBQeUludF9Bc0xvbmcodik7Ci0JUHlfREVDUkVGKHQpOwotCXJldHVybiBhcmc7CisgICAgdiA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIHQpOworICAgIGlmICghdikgeworICAgICAgICBhcmcgPSBQeURpY3RfU2l6ZShkaWN0KTsKKyAgICAgICAgdiA9IFB5SW50X0Zyb21Mb25nKGFyZyk7CisgICAgICAgIGlmICghdikgeworICAgICAgICAgICAgUHlfREVDUkVGKHQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShkaWN0LCB0LCB2KSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYXJnID0gUHlJbnRfQXNMb25nKHYpOworICAgIFB5X0RFQ1JFRih0KTsKKyAgICByZXR1cm4gYXJnOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9hZGRvcF9vKHN0cnVjdCBjb21waWxlciAqYywgaW50IG9wY29kZSwgUHlPYmplY3QgKmRpY3QsCi0JCSAgICAgUHlPYmplY3QgKm8pCisgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbykKIHsKICAgICBpbnQgYXJnID0gY29tcGlsZXJfYWRkX28oYywgZGljdCwgbyk7CiAgICAgaWYgKGFyZyA8IDApCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgICAgcmV0dXJuIGNvbXBpbGVyX2FkZG9wX2koYywgb3Bjb2RlLCBhcmcpOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9hZGRvcF9uYW1lKHN0cnVjdCBjb21waWxlciAqYywgaW50IG9wY29kZSwgUHlPYmplY3QgKmRpY3QsCi0JCSAgICBQeU9iamVjdCAqbykKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8pCiB7CiAgICAgaW50IGFyZzsKICAgICBQeU9iamVjdCAqbWFuZ2xlZCA9IF9QeV9NYW5nbGUoYy0+dS0+dV9wcml2YXRlLCBvKTsKICAgICBpZiAoIW1hbmdsZWQpCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAgICAgYXJnID0gY29tcGlsZXJfYWRkX28oYywgZGljdCwgbWFuZ2xlZCk7CiAgICAgUHlfREVDUkVGKG1hbmdsZWQpOwogICAgIGlmIChhcmcgPCAwKQotCXJldHVybiAwOworICAgIHJldHVybiAwOwogICAgIHJldHVybiBjb21waWxlcl9hZGRvcF9pKGMsIG9wY29kZSwgYXJnKTsKIH0KIApAQCAtMTAyMSw0MyArMTAyMSw0MyBAQAogc3RhdGljIGludAogY29tcGlsZXJfYWRkb3BfaShzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBvcGNvZGUsIGludCBvcGFyZykKIHsKLQlzdHJ1Y3QgaW5zdHIgKmk7Ci0JaW50IG9mZjsKLQlvZmYgPSBjb21waWxlcl9uZXh0X2luc3RyKGMsIGMtPnUtPnVfY3VyYmxvY2spOwotCWlmIChvZmYgPCAwKQotCQlyZXR1cm4gMDsKLQlpID0gJmMtPnUtPnVfY3VyYmxvY2stPmJfaW5zdHJbb2ZmXTsKLQlpLT5pX29wY29kZSA9IG9wY29kZTsKLQlpLT5pX29wYXJnID0gb3Bhcmc7Ci0JaS0+aV9oYXNhcmcgPSAxOwotCWNvbXBpbGVyX3NldF9saW5lbm8oYywgb2ZmKTsKLQlyZXR1cm4gMTsKKyAgICBzdHJ1Y3QgaW5zdHIgKmk7CisgICAgaW50IG9mZjsKKyAgICBvZmYgPSBjb21waWxlcl9uZXh0X2luc3RyKGMsIGMtPnUtPnVfY3VyYmxvY2spOworICAgIGlmIChvZmYgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpID0gJmMtPnUtPnVfY3VyYmxvY2stPmJfaW5zdHJbb2ZmXTsKKyAgICBpLT5pX29wY29kZSA9IG9wY29kZTsKKyAgICBpLT5pX29wYXJnID0gb3Bhcmc7CisgICAgaS0+aV9oYXNhcmcgPSAxOworICAgIGNvbXBpbGVyX3NldF9saW5lbm8oYywgb2ZmKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfYWRkb3BfaihzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBvcGNvZGUsIGJhc2ljYmxvY2sgKmIsIGludCBhYnNvbHV0ZSkKIHsKLQlzdHJ1Y3QgaW5zdHIgKmk7Ci0JaW50IG9mZjsKKyAgICBzdHJ1Y3QgaW5zdHIgKmk7CisgICAgaW50IG9mZjsKIAotCWFzc2VydChiICE9IE5VTEwpOwotCW9mZiA9IGNvbXBpbGVyX25leHRfaW5zdHIoYywgYy0+dS0+dV9jdXJibG9jayk7Ci0JaWYgKG9mZiA8IDApCi0JCXJldHVybiAwOwotCWkgPSAmYy0+dS0+dV9jdXJibG9jay0+Yl9pbnN0cltvZmZdOwotCWktPmlfb3Bjb2RlID0gb3Bjb2RlOwotCWktPmlfdGFyZ2V0ID0gYjsKLQlpLT5pX2hhc2FyZyA9IDE7Ci0JaWYgKGFic29sdXRlKQotCQlpLT5pX2phYnMgPSAxOwotCWVsc2UKLQkJaS0+aV9qcmVsID0gMTsKLQljb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7Ci0JcmV0dXJuIDE7CisgICAgYXNzZXJ0KGIgIT0gTlVMTCk7CisgICAgb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKKyAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaSA9ICZjLT51LT51X2N1cmJsb2NrLT5iX2luc3RyW29mZl07CisgICAgaS0+aV9vcGNvZGUgPSBvcGNvZGU7CisgICAgaS0+aV90YXJnZXQgPSBiOworICAgIGktPmlfaGFzYXJnID0gMTsKKyAgICBpZiAoYWJzb2x1dGUpCisgICAgICAgIGktPmlfamFicyA9IDE7CisgICAgZWxzZQorICAgICAgICBpLT5pX2pyZWwgPSAxOworICAgIGNvbXBpbGVyX3NldF9saW5lbm8oYywgb2ZmKTsKKyAgICByZXR1cm4gMTsKIH0KIAotLyogVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTkVXX0JMT0NLIGFuZCBORVhUX0JMT0NLIGlzIHN1YnRsZS4JKEknZAotICAgbGlrZSB0byBmaW5kIGJldHRlciBuYW1lcy4pCU5FV19CTE9DSygpIGNyZWF0ZXMgYSBuZXcgYmxvY2sgYW5kIHNldHMKKy8qIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE5FV19CTE9DSyBhbmQgTkVYVF9CTE9DSyBpcyBzdWJ0bGUuICAoSSdkCisgICBsaWtlIHRvIGZpbmQgYmV0dGVyIG5hbWVzLikgIE5FV19CTE9DSygpIGNyZWF0ZXMgYSBuZXcgYmxvY2sgYW5kIHNldHMKICAgIGl0IGFzIHRoZSBjdXJyZW50IGJsb2NrLiAgTkVYVF9CTE9DSygpIGFsc28gY3JlYXRlcyBhbiBpbXBsaWNpdCBqdW1wCiAgICBmcm9tIHRoZSBjdXJyZW50IGJsb2NrIHRvIHRoZSBuZXcgYmxvY2suCiAqLwpAQCAtMTA2OCw1MCArMTA2OCw1MCBAQAogCiAKICNkZWZpbmUgTkVXX0JMT0NLKEMpIHsgXAotCWlmIChjb21waWxlcl91c2VfbmV3X2Jsb2NrKChDKSkgPT0gTlVMTCkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmIChjb21waWxlcl91c2VfbmV3X2Jsb2NrKChDKSkgPT0gTlVMTCkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAjZGVmaW5lIE5FWFRfQkxPQ0soQykgeyBcCi0JaWYgKGNvbXBpbGVyX25leHRfYmxvY2soKEMpKSA9PSBOVUxMKSBcCi0JCXJldHVybiAwOyBcCisgICAgaWYgKGNvbXBpbGVyX25leHRfYmxvY2soKEMpKSA9PSBOVUxMKSBcCisgICAgICAgIHJldHVybiAwOyBcCiB9CiAKICNkZWZpbmUgQURET1AoQywgT1ApIHsgXAotCWlmICghY29tcGlsZXJfYWRkb3AoKEMpLCAoT1ApKSkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3AoKEMpLCAoT1ApKSkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAjZGVmaW5lIEFERE9QX0lOX1NDT1BFKEMsIE9QKSB7IFwKLQlpZiAoIWNvbXBpbGVyX2FkZG9wKChDKSwgKE9QKSkpIHsgXAotCQljb21waWxlcl9leGl0X3Njb3BlKGMpOyBcCi0JCXJldHVybiAwOyBcCi0JfSBcCisgICAgaWYgKCFjb21waWxlcl9hZGRvcCgoQyksIChPUCkpKSB7IFwKKyAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAogfQogCiAjZGVmaW5lIEFERE9QX08oQywgT1AsIE8sIFRZUEUpIHsgXAotCWlmICghY29tcGlsZXJfYWRkb3BfbygoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3BfbygoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAjZGVmaW5lIEFERE9QX05BTUUoQywgT1AsIE8sIFRZUEUpIHsgXAotCWlmICghY29tcGlsZXJfYWRkb3BfbmFtZSgoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3BfbmFtZSgoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAjZGVmaW5lIEFERE9QX0koQywgT1AsIE8pIHsgXAotCWlmICghY29tcGlsZXJfYWRkb3BfaSgoQyksIChPUCksIChPKSkpIFwKLQkJcmV0dXJuIDA7IFwKKyAgICBpZiAoIWNvbXBpbGVyX2FkZG9wX2koKEMpLCAoT1ApLCAoTykpKSBcCisgICAgICAgIHJldHVybiAwOyBcCiB9CiAKICNkZWZpbmUgQURET1BfSkFCUyhDLCBPUCwgTykgeyBcCi0JaWYgKCFjb21waWxlcl9hZGRvcF9qKChDKSwgKE9QKSwgKE8pLCAxKSkgXAotCQlyZXR1cm4gMDsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3BfaigoQyksIChPUCksIChPKSwgMSkpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogI2RlZmluZSBBRERPUF9KUkVMKEMsIE9QLCBPKSB7IFwKLQlpZiAoIWNvbXBpbGVyX2FkZG9wX2ooKEMpLCAoT1ApLCAoTyksIDApKSBcCi0JCXJldHVybiAwOyBcCisgICAgaWYgKCFjb21waWxlcl9hZGRvcF9qKChDKSwgKE9QKSwgKE8pLCAwKSkgXAorICAgICAgICByZXR1cm4gMDsgXAogfQogCiAvKiBWSVNJVCBhbmQgVklTSVRfU0VRIHRha2VzIGFuIEFTREwgdHlwZSBhcyB0aGVpciBzZWNvbmQgYXJndW1lbnQuICBUaGV5IHVzZQpAQCAtMTExOSw0OSArMTExOSw0OSBAQAogKi8KIAogI2RlZmluZSBWSVNJVChDLCBUWVBFLCBWKSB7XAotCWlmICghY29tcGlsZXJfdmlzaXRfICMjIFRZUEUoKEMpLCAoVikpKSBcCi0JCXJldHVybiAwOyBcCisgICAgaWYgKCFjb21waWxlcl92aXNpdF8gIyMgVFlQRSgoQyksIChWKSkpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogI2RlZmluZSBWSVNJVF9JTl9TQ09QRShDLCBUWVBFLCBWKSB7XAotCWlmICghY29tcGlsZXJfdmlzaXRfICMjIFRZUEUoKEMpLCAoVikpKSB7IFwKLQkJY29tcGlsZXJfZXhpdF9zY29wZShjKTsgXAotCQlyZXR1cm4gMDsgXAotCX0gXAorICAgIGlmICghY29tcGlsZXJfdmlzaXRfICMjIFRZUEUoKEMpLCAoVikpKSB7IFwKKyAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAogfQogCiAjZGVmaW5lIFZJU0lUX1NMSUNFKEMsIFYsIENUWCkge1wKLQlpZiAoIWNvbXBpbGVyX3Zpc2l0X3NsaWNlKChDKSwgKFYpLCAoQ1RYKSkpIFwKLQkJcmV0dXJuIDA7IFwKKyAgICBpZiAoIWNvbXBpbGVyX3Zpc2l0X3NsaWNlKChDKSwgKFYpLCAoQ1RYKSkpIFwKKyAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAogI2RlZmluZSBWSVNJVF9TRVEoQywgVFlQRSwgU0VRKSB7IFwKLQlpbnQgX2k7IFwKLQlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAotCWZvciAoX2kgPSAwOyBfaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBfaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIF9pKTsgXAotCQlpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgZWx0KSkgXAotCQkJcmV0dXJuIDA7IFwKLQl9IFwKKyAgICBpbnQgX2k7IFwKKyAgICBhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAorICAgIGZvciAoX2kgPSAwOyBfaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBfaSsrKSB7IFwKKyAgICAgICAgVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIF9pKTsgXAorICAgICAgICBpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgZWx0KSkgXAorICAgICAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKIH0KIAogI2RlZmluZSBWSVNJVF9TRVFfSU5fU0NPUEUoQywgVFlQRSwgU0VRKSB7IFwKLQlpbnQgX2k7IFwKLQlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAotCWZvciAoX2kgPSAwOyBfaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBfaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIF9pKTsgXAotCQlpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgZWx0KSkgeyBcCi0JCQljb21waWxlcl9leGl0X3Njb3BlKGMpOyBcCi0JCQlyZXR1cm4gMDsgXAotCQl9IFwKLQl9IFwKKyAgICBpbnQgX2k7IFwKKyAgICBhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAorICAgIGZvciAoX2kgPSAwOyBfaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBfaSsrKSB7IFwKKyAgICAgICAgVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIF9pKTsgXAorICAgICAgICBpZiAoIWNvbXBpbGVyX3Zpc2l0XyAjIyBUWVBFKChDKSwgZWx0KSkgeyBcCisgICAgICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOyBcCisgICAgICAgICAgICByZXR1cm4gMDsgXAorICAgICAgICB9IFwKKyAgICB9IFwKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaXNkb2NzdHJpbmcoc3RtdF90eSBzKQogewogICAgIGlmIChzLT5raW5kICE9IEV4cHJfa2luZCkKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICAgICByZXR1cm4gcy0+di5FeHByLnZhbHVlLT5raW5kID09IFN0cl9raW5kOwogfQogCkBAIC0xMTcwLDY3ICsxMTcwLDY3IEBACiBzdGF0aWMgaW50CiBjb21waWxlcl9ib2R5KHN0cnVjdCBjb21waWxlciAqYywgYXNkbF9zZXEgKnN0bXRzKQogewotCWludCBpID0gMDsKLQlzdG10X3R5IHN0OworICAgIGludCBpID0gMDsKKyAgICBzdG10X3R5IHN0OwogCi0JaWYgKCFhc2RsX3NlcV9MRU4oc3RtdHMpKQotCQlyZXR1cm4gMTsKLQlzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzdG10cywgMCk7Ci0JaWYgKGNvbXBpbGVyX2lzZG9jc3RyaW5nKHN0KSAmJiBQeV9PcHRpbWl6ZUZsYWcgPCAyKSB7Ci0JCS8qIGRvbid0IGdlbmVyYXRlIGRvY3N0cmluZ3MgaWYgLU9PICovCi0JCWkgPSAxOwotCQlWSVNJVChjLCBleHByLCBzdC0+di5FeHByLnZhbHVlKTsKLQkJaWYgKCFjb21waWxlcl9uYW1lb3AoYywgX19kb2NfXywgU3RvcmUpKQotCQkJcmV0dXJuIDA7Ci0JfQotCWZvciAoOyBpIDwgYXNkbF9zZXFfTEVOKHN0bXRzKTsgaSsrKQotCSAgICBWSVNJVChjLCBzdG10LCAoc3RtdF90eSlhc2RsX3NlcV9HRVQoc3RtdHMsIGkpKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIWFzZGxfc2VxX0xFTihzdG10cykpCisgICAgICAgIHJldHVybiAxOworICAgIHN0ID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHN0bXRzLCAwKTsKKyAgICBpZiAoY29tcGlsZXJfaXNkb2NzdHJpbmcoc3QpICYmIFB5X09wdGltaXplRmxhZyA8IDIpIHsKKyAgICAgICAgLyogZG9uJ3QgZ2VuZXJhdGUgZG9jc3RyaW5ncyBpZiAtT08gKi8KKyAgICAgICAgaSA9IDE7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHN0LT52LkV4cHIudmFsdWUpOworICAgICAgICBpZiAoIWNvbXBpbGVyX25hbWVvcChjLCBfX2RvY19fLCBTdG9yZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZm9yICg7IGkgPCBhc2RsX3NlcV9MRU4oc3RtdHMpOyBpKyspCisgICAgICAgIFZJU0lUKGMsIHN0bXQsIChzdG10X3R5KWFzZGxfc2VxX0dFVChzdG10cywgaSkpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlDb2RlT2JqZWN0ICoKIGNvbXBpbGVyX21vZChzdHJ1Y3QgY29tcGlsZXIgKmMsIG1vZF90eSBtb2QpCiB7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlpbnQgYWRkTm9uZSA9IDE7Ci0Jc3RhdGljIFB5T2JqZWN0ICptb2R1bGU7Ci0JaWYgKCFtb2R1bGUpIHsKLQkJbW9kdWxlID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiPG1vZHVsZT4iKTsKLQkJaWYgKCFtb2R1bGUpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogVXNlIDAgZm9yIGZpcnN0bGluZW5vIGluaXRpYWxseSwgd2lsbCBmaXh1cCBpbiBhc3NlbWJsZSgpLiAqLwotCWlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbW9kdWxlLCBtb2QsIDApKQotCQlyZXR1cm4gTlVMTDsKLQlzd2l0Y2ggKG1vZC0+a2luZCkgewotCWNhc2UgTW9kdWxlX2tpbmQ6IAotCQlpZiAoIWNvbXBpbGVyX2JvZHkoYywgbW9kLT52Lk1vZHVsZS5ib2R5KSkgewotCQkJY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSW50ZXJhY3RpdmVfa2luZDoKLQkJYy0+Y19pbnRlcmFjdGl2ZSA9IDE7Ci0JCVZJU0lUX1NFUV9JTl9TQ09QRShjLCBzdG10LCAKLQkJCQkJbW9kLT52LkludGVyYWN0aXZlLmJvZHkpOwotCQlicmVhazsKLQljYXNlIEV4cHJlc3Npb25fa2luZDoKLQkJVklTSVRfSU5fU0NPUEUoYywgZXhwciwgbW9kLT52LkV4cHJlc3Npb24uYm9keSk7Ci0JCWFkZE5vbmUgPSAwOwotCQlicmVhazsKLQljYXNlIFN1aXRlX2tpbmQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkic3VpdGUgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIpOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgICJtb2R1bGUga2luZCAlZCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIiwKLQkJCSAgICAgbW9kLT5raW5kKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWNvID0gYXNzZW1ibGUoYywgYWRkTm9uZSk7Ci0JY29tcGlsZXJfZXhpdF9zY29wZShjKTsKLQlyZXR1cm4gY287CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBpbnQgYWRkTm9uZSA9IDE7CisgICAgc3RhdGljIFB5T2JqZWN0ICptb2R1bGU7CisgICAgaWYgKCFtb2R1bGUpIHsKKyAgICAgICAgbW9kdWxlID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiPG1vZHVsZT4iKTsKKyAgICAgICAgaWYgKCFtb2R1bGUpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogVXNlIDAgZm9yIGZpcnN0bGluZW5vIGluaXRpYWxseSwgd2lsbCBmaXh1cCBpbiBhc3NlbWJsZSgpLiAqLworICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbW9kdWxlLCBtb2QsIDApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzd2l0Y2ggKG1vZC0+a2luZCkgeworICAgIGNhc2UgTW9kdWxlX2tpbmQ6CisgICAgICAgIGlmICghY29tcGlsZXJfYm9keShjLCBtb2QtPnYuTW9kdWxlLmJvZHkpKSB7CisgICAgICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRlcmFjdGl2ZV9raW5kOgorICAgICAgICBjLT5jX2ludGVyYWN0aXZlID0gMTsKKyAgICAgICAgVklTSVRfU0VRX0lOX1NDT1BFKGMsIHN0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC0+di5JbnRlcmFjdGl2ZS5ib2R5KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFeHByZXNzaW9uX2tpbmQ6CisgICAgICAgIFZJU0lUX0lOX1NDT1BFKGMsIGV4cHIsIG1vZC0+di5FeHByZXNzaW9uLmJvZHkpOworICAgICAgICBhZGROb25lID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTdWl0ZV9raW5kOgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3VpdGUgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibW9kdWxlIGtpbmQgJWQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsCisgICAgICAgICAgICAgICAgICAgICBtb2QtPmtpbmQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY28gPSBhc3NlbWJsZShjLCBhZGROb25lKTsKKyAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgIHJldHVybiBjbzsKIH0KIAogLyogVGhlIHRlc3QgZm9yIExPQ0FMIG11c3QgY29tZSBiZWZvcmUgdGhlIHRlc3QgZm9yIEZSRUUgaW4gb3JkZXIgdG8KQEAgLTEyNDEsMjQgKzEyNDEsMjQgQEAKIHN0YXRpYyBpbnQKIGdldF9yZWZfdHlwZShzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5T2JqZWN0ICpuYW1lKQogewotCWludCBzY29wZSA9IFB5U1RfR2V0U2NvcGUoYy0+dS0+dV9zdGUsIG5hbWUpOwotCWlmIChzY29wZSA9PSAwKSB7Ci0JICAgIGNoYXIgYnVmWzM1MF07Ci0JICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgInVua25vd24gc2NvcGUgZm9yICUuMTAwcyBpbiAlLjEwMHMoJXMpIGluICVzXG4iCi0JCQkgICJzeW1ib2xzOiAlc1xubG9jYWxzOiAlc1xuZ2xvYmFsczogJXNcbiIsCi0JCQkgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgCi0JCQkgIFB5U3RyaW5nX0FTX1NUUklORyhjLT51LT51X25hbWUpLCAKLQkJCSAgUHlPYmplY3RfUkVQUihjLT51LT51X3N0ZS0+c3RlX2lkKSwKLQkJCSAgYy0+Y19maWxlbmFtZSwKLQkJCSAgUHlPYmplY3RfUkVQUihjLT51LT51X3N0ZS0+c3RlX3N5bWJvbHMpLAotCQkJICBQeU9iamVjdF9SRVBSKGMtPnUtPnVfdmFybmFtZXMpLAotCQkJICBQeU9iamVjdF9SRVBSKGMtPnUtPnVfbmFtZXMpCi0JCSk7Ci0JICAgIFB5X0ZhdGFsRXJyb3IoYnVmKTsKLQl9CisgICAgaW50IHNjb3BlID0gUHlTVF9HZXRTY29wZShjLT51LT51X3N0ZSwgbmFtZSk7CisgICAgaWYgKHNjb3BlID09IDApIHsKKyAgICAgICAgY2hhciBidWZbMzUwXTsKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHNjb3BlIGZvciAlLjEwMHMgaW4gJS4xMDBzKCVzKSBpbiAlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICJzeW1ib2xzOiAlc1xubG9jYWxzOiAlc1xuZ2xvYmFsczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhjLT51LT51X25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0X1JFUFIoYy0+dS0+dV9zdGUtPnN0ZV9pZCksCisgICAgICAgICAgICAgICAgICAgICAgYy0+Y19maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdF9SRVBSKGMtPnUtPnVfc3RlLT5zdGVfc3ltYm9scyksCisgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3RfUkVQUihjLT51LT51X3Zhcm5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdF9SRVBSKGMtPnUtPnVfbmFtZXMpCisgICAgICAgICk7CisgICAgICAgIFB5X0ZhdGFsRXJyb3IoYnVmKTsKKyAgICB9CiAKLQlyZXR1cm4gc2NvcGU7CisgICAgcmV0dXJuIHNjb3BlOwogfQogCiBzdGF0aWMgaW50CkBAIC0xMjY3LDUwMiArMTI2Nyw1MDIgQEAKICAgICBQeU9iamVjdCAqaywgKnY7CiAgICAgayA9IFB5VHVwbGVfUGFjaygyLCBuYW1lLCBuYW1lLT5vYl90eXBlKTsKICAgICBpZiAoayA9PSBOVUxMKQotCXJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiAgICAgdiA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIGspOwogICAgIFB5X0RFQ1JFRihrKTsKICAgICBpZiAodiA9PSBOVUxMKQotCXJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiAgICAgcmV0dXJuIFB5SW50X0FTX0xPTkcodik7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX21ha2VfY2xvc3VyZShzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5Q29kZU9iamVjdCAqY28sIGludCBhcmdzKQogewotCWludCBpLCBmcmVlID0gUHlDb2RlX0dldE51bUZyZWUoY28pOwotCWlmIChmcmVlID09IDApIHsKLQkgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCAoUHlPYmplY3QqKWNvLCBjb25zdHMpOwotCSAgICBBRERPUF9JKGMsIE1BS0VfRlVOQ1RJT04sIGFyZ3MpOwotCSAgICByZXR1cm4gMTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGZyZWU7ICsraSkgewotCQkvKiBCeXBhc3MgY29tX2FkZG9wX3Zhcm5hbWUgYmVjYXVzZSBpdCB3aWxsIGdlbmVyYXRlCi0JCSAgIExPQURfREVSRUYgYnV0IExPQURfQ0xPU1VSRSBpcyBuZWVkZWQuIAotCQkqLwotCQlQeU9iamVjdCAqbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX2ZyZWV2YXJzLCBpKTsKLQkJaW50IGFyZywgcmVmdHlwZTsKKyAgICBpbnQgaSwgZnJlZSA9IFB5Q29kZV9HZXROdW1GcmVlKGNvKTsKKyAgICBpZiAoZnJlZSA9PSAwKSB7CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgKFB5T2JqZWN0KiljbywgY29uc3RzKTsKKyAgICAgICAgQURET1BfSShjLCBNQUtFX0ZVTkNUSU9OLCBhcmdzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBmcmVlOyArK2kpIHsKKyAgICAgICAgLyogQnlwYXNzIGNvbV9hZGRvcF92YXJuYW1lIGJlY2F1c2UgaXQgd2lsbCBnZW5lcmF0ZQorICAgICAgICAgICBMT0FEX0RFUkVGIGJ1dCBMT0FEX0NMT1NVUkUgaXMgbmVlZGVkLgorICAgICAgICAqLworICAgICAgICBQeU9iamVjdCAqbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX2ZyZWV2YXJzLCBpKTsKKyAgICAgICAgaW50IGFyZywgcmVmdHlwZTsKIAotCQkvKiBTcGVjaWFsIGNhc2U6IElmIGEgY2xhc3MgY29udGFpbnMgYSBtZXRob2Qgd2l0aCBhCi0JCSAgIGZyZWUgdmFyaWFibGUgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIG1ldGhvZCwKLQkJICAgdGhlIG5hbWUgd2lsbCBiZSBjb25zaWRlcmVkIGZyZWUgKmFuZCogbG9jYWwgaW4gdGhlCi0JCSAgIGNsYXNzLiAgSXQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGNsb3N1cmUsIGFzCi0JCSAgIHdlbGwgYXMgYnkgdGhlIG5vcm1hbCBuYW1lIGxvb29rdXAgbG9naWMuCi0JCSovCi0JCXJlZnR5cGUgPSBnZXRfcmVmX3R5cGUoYywgbmFtZSk7Ci0JCWlmIChyZWZ0eXBlID09IENFTEwpCi0JCQlhcmcgPSBjb21waWxlcl9sb29rdXBfYXJnKGMtPnUtPnVfY2VsbHZhcnMsIG5hbWUpOwotCQllbHNlIC8qIChyZWZ0eXBlID09IEZSRUUpICovCi0JCQlhcmcgPSBjb21waWxlcl9sb29rdXBfYXJnKGMtPnUtPnVfZnJlZXZhcnMsIG5hbWUpOwotCQlpZiAoYXJnID09IC0xKSB7Ci0JCQlwcmludGYoImxvb2t1cCAlcyBpbiAlcyAlZCAlZFxuIgotCQkJCSJmcmVldmFycyBvZiAlczogJXNcbiIsCi0JCQkJUHlPYmplY3RfUkVQUihuYW1lKSwgCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGMtPnUtPnVfbmFtZSksIAotCQkJCXJlZnR5cGUsIGFyZywKLQkJCQlQeVN0cmluZ19BU19TVFJJTkcoY28tPmNvX25hbWUpLAotCQkJCVB5T2JqZWN0X1JFUFIoY28tPmNvX2ZyZWV2YXJzKSk7Ci0JCQlQeV9GYXRhbEVycm9yKCJjb21waWxlcl9tYWtlX2Nsb3N1cmUoKSIpOwotCQl9Ci0JCUFERE9QX0koYywgTE9BRF9DTE9TVVJFLCBhcmcpOwotCX0KLQlBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBmcmVlKTsKLQlBRERPUF9PKGMsIExPQURfQ09OU1QsIChQeU9iamVjdCopY28sIGNvbnN0cyk7Ci0JQURET1BfSShjLCBNQUtFX0NMT1NVUkUsIGFyZ3MpOwotCXJldHVybiAxOworICAgICAgICAvKiBTcGVjaWFsIGNhc2U6IElmIGEgY2xhc3MgY29udGFpbnMgYSBtZXRob2Qgd2l0aCBhCisgICAgICAgICAgIGZyZWUgdmFyaWFibGUgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIG1ldGhvZCwKKyAgICAgICAgICAgdGhlIG5hbWUgd2lsbCBiZSBjb25zaWRlcmVkIGZyZWUgKmFuZCogbG9jYWwgaW4gdGhlCisgICAgICAgICAgIGNsYXNzLiAgSXQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGNsb3N1cmUsIGFzCisgICAgICAgICAgIHdlbGwgYXMgYnkgdGhlIG5vcm1hbCBuYW1lIGxvb29rdXAgbG9naWMuCisgICAgICAgICovCisgICAgICAgIHJlZnR5cGUgPSBnZXRfcmVmX3R5cGUoYywgbmFtZSk7CisgICAgICAgIGlmIChyZWZ0eXBlID09IENFTEwpCisgICAgICAgICAgICBhcmcgPSBjb21waWxlcl9sb29rdXBfYXJnKGMtPnUtPnVfY2VsbHZhcnMsIG5hbWUpOworICAgICAgICBlbHNlIC8qIChyZWZ0eXBlID09IEZSRUUpICovCisgICAgICAgICAgICBhcmcgPSBjb21waWxlcl9sb29rdXBfYXJnKGMtPnUtPnVfZnJlZXZhcnMsIG5hbWUpOworICAgICAgICBpZiAoYXJnID09IC0xKSB7CisgICAgICAgICAgICBwcmludGYoImxvb2t1cCAlcyBpbiAlcyAlZCAlZFxuIgorICAgICAgICAgICAgICAgICJmcmVldmFycyBvZiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgUHlPYmplY3RfUkVQUihuYW1lKSwKKyAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYy0+dS0+dV9uYW1lKSwKKyAgICAgICAgICAgICAgICByZWZ0eXBlLCBhcmcsCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGNvLT5jb19uYW1lKSwKKyAgICAgICAgICAgICAgICBQeU9iamVjdF9SRVBSKGNvLT5jb19mcmVldmFycykpOworICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiY29tcGlsZXJfbWFrZV9jbG9zdXJlKCkiKTsKKyAgICAgICAgfQorICAgICAgICBBRERPUF9JKGMsIExPQURfQ0xPU1VSRSwgYXJnKTsKKyAgICB9CisgICAgQURET1BfSShjLCBCVUlMRF9UVVBMRSwgZnJlZSk7CisgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCAoUHlPYmplY3QqKWNvLCBjb25zdHMpOworICAgIEFERE9QX0koYywgTUFLRV9DTE9TVVJFLCBhcmdzKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfZGVjb3JhdG9ycyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFzZGxfc2VxKiBkZWNvcykKIHsKLQlpbnQgaTsKKyAgICBpbnQgaTsKIAotCWlmICghZGVjb3MpCi0JCXJldHVybiAxOworICAgIGlmICghZGVjb3MpCisgICAgICAgIHJldHVybiAxOwogCi0JZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihkZWNvcyk7IGkrKykgewotCQlWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZGVjb3MsIGkpKTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihkZWNvcyk7IGkrKykgeworICAgICAgICBWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZGVjb3MsIGkpKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2FyZ3VtZW50cyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFyZ3VtZW50c190eSBhcmdzKQogewotCWludCBpOwotCWludCBuID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmFyZ3MpOwotCS8qIENvcnJlY3RseSBoYW5kbGUgbmVzdGVkIGFyZ3VtZW50IGxpc3RzICovCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlleHByX3R5IGFyZyA9IChleHByX3R5KWFzZGxfc2VxX0dFVChhcmdzLT5hcmdzLCBpKTsKLQkJaWYgKGFyZy0+a2luZCA9PSBUdXBsZV9raW5kKSB7Ci0JCQlQeU9iamVjdCAqaWQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCIuJWQiLCBpKTsKLQkJCWlmIChpZCA9PSBOVUxMKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoIWNvbXBpbGVyX25hbWVvcChjLCBpZCwgTG9hZCkpIHsKLQkJCQlQeV9ERUNSRUYoaWQpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJUHlfREVDUkVGKGlkKTsKLQkJCVZJU0lUKGMsIGV4cHIsIGFyZyk7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgaW50IGk7CisgICAgaW50IG4gPSBhc2RsX3NlcV9MRU4oYXJncy0+YXJncyk7CisgICAgLyogQ29ycmVjdGx5IGhhbmRsZSBuZXN0ZWQgYXJndW1lbnQgbGlzdHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGV4cHJfdHkgYXJnID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGFyZ3MtPmFyZ3MsIGkpOworICAgICAgICBpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppZCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIi4lZCIsIGkpOworICAgICAgICAgICAgaWYgKGlkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY29tcGlsZXJfbmFtZW9wKGMsIGlkLCBMb2FkKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoaWQpOworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgYXJnKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfZnVuY3Rpb24oc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlQeU9iamVjdCAqZmlyc3RfY29uc3QgPSBQeV9Ob25lOwotCWFyZ3VtZW50c190eSBhcmdzID0gcy0+di5GdW5jdGlvbkRlZi5hcmdzOwotCWFzZGxfc2VxKiBkZWNvcyA9IHMtPnYuRnVuY3Rpb25EZWYuZGVjb3JhdG9yX2xpc3Q7Ci0Jc3RtdF90eSBzdDsKLQlpbnQgaSwgbiwgZG9jc3RyaW5nOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKmZpcnN0X2NvbnN0ID0gUHlfTm9uZTsKKyAgICBhcmd1bWVudHNfdHkgYXJncyA9IHMtPnYuRnVuY3Rpb25EZWYuYXJnczsKKyAgICBhc2RsX3NlcSogZGVjb3MgPSBzLT52LkZ1bmN0aW9uRGVmLmRlY29yYXRvcl9saXN0OworICAgIHN0bXRfdHkgc3Q7CisgICAgaW50IGksIG4sIGRvY3N0cmluZzsKIAotCWFzc2VydChzLT5raW5kID09IEZ1bmN0aW9uRGVmX2tpbmQpOworICAgIGFzc2VydChzLT5raW5kID09IEZ1bmN0aW9uRGVmX2tpbmQpOwogCi0JaWYgKCFjb21waWxlcl9kZWNvcmF0b3JzKGMsIGRlY29zKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGFyZ3MtPmRlZmF1bHRzKQotCQlWSVNJVF9TRVEoYywgZXhwciwgYXJncy0+ZGVmYXVsdHMpOwotCWlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgcy0+di5GdW5jdGlvbkRlZi5uYW1lLCAodm9pZCAqKXMsCi0JCQkJICBzLT5saW5lbm8pKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoIWNvbXBpbGVyX2RlY29yYXRvcnMoYywgZGVjb3MpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYXJncy0+ZGVmYXVsdHMpCisgICAgICAgIFZJU0lUX1NFUShjLCBleHByLCBhcmdzLT5kZWZhdWx0cyk7CisgICAgaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBzLT52LkZ1bmN0aW9uRGVmLm5hbWUsICh2b2lkICopcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVubykpCisgICAgICAgIHJldHVybiAwOwogCi0Jc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQocy0+di5GdW5jdGlvbkRlZi5ib2R5LCAwKTsKLQlkb2NzdHJpbmcgPSBjb21waWxlcl9pc2RvY3N0cmluZyhzdCk7Ci0JaWYgKGRvY3N0cmluZyAmJiBQeV9PcHRpbWl6ZUZsYWcgPCAyKQotCSAgICBmaXJzdF9jb25zdCA9IHN0LT52LkV4cHIudmFsdWUtPnYuU3RyLnM7Ci0JaWYgKGNvbXBpbGVyX2FkZF9vKGMsIGMtPnUtPnVfY29uc3RzLCBmaXJzdF9jb25zdCkgPCAwKQkgewotCSAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOwotCSAgICByZXR1cm4gMDsKLQl9CisgICAgc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQocy0+di5GdW5jdGlvbkRlZi5ib2R5LCAwKTsKKyAgICBkb2NzdHJpbmcgPSBjb21waWxlcl9pc2RvY3N0cmluZyhzdCk7CisgICAgaWYgKGRvY3N0cmluZyAmJiBQeV9PcHRpbWl6ZUZsYWcgPCAyKQorICAgICAgICBmaXJzdF9jb25zdCA9IHN0LT52LkV4cHIudmFsdWUtPnYuU3RyLnM7CisgICAgaWYgKGNvbXBpbGVyX2FkZF9vKGMsIGMtPnUtPnVfY29uc3RzLCBmaXJzdF9jb25zdCkgPCAwKSAgICAgIHsKKyAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogdW5wYWNrIG5lc3RlZCBhcmd1bWVudHMgKi8KLQljb21waWxlcl9hcmd1bWVudHMoYywgYXJncyk7CisgICAgLyogdW5wYWNrIG5lc3RlZCBhcmd1bWVudHMgKi8KKyAgICBjb21waWxlcl9hcmd1bWVudHMoYywgYXJncyk7CiAKLQljLT51LT51X2FyZ2NvdW50ID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmFyZ3MpOwotCW4gPSBhc2RsX3NlcV9MRU4ocy0+di5GdW5jdGlvbkRlZi5ib2R5KTsKLQkvKiBpZiB0aGVyZSB3YXMgYSBkb2NzdHJpbmcsIHdlIG5lZWQgdG8gc2tpcCB0aGUgZmlyc3Qgc3RhdGVtZW50ICovCi0JZm9yIChpID0gZG9jc3RyaW5nOyBpIDwgbjsgaSsrKSB7Ci0JCXN0ID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHMtPnYuRnVuY3Rpb25EZWYuYm9keSwgaSk7Ci0JCVZJU0lUX0lOX1NDT1BFKGMsIHN0bXQsIHN0KTsKLQl9Ci0JY28gPSBhc3NlbWJsZShjLCAxKTsKLQljb21waWxlcl9leGl0X3Njb3BlKGMpOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICBjLT51LT51X2FyZ2NvdW50ID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmFyZ3MpOworICAgIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5GdW5jdGlvbkRlZi5ib2R5KTsKKyAgICAvKiBpZiB0aGVyZSB3YXMgYSBkb2NzdHJpbmcsIHdlIG5lZWQgdG8gc2tpcCB0aGUgZmlyc3Qgc3RhdGVtZW50ICovCisgICAgZm9yIChpID0gZG9jc3RyaW5nOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIHN0ID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHMtPnYuRnVuY3Rpb25EZWYuYm9keSwgaSk7CisgICAgICAgIFZJU0lUX0lOX1NDT1BFKGMsIHN0bXQsIHN0KTsKKyAgICB9CisgICAgY28gPSBhc3NlbWJsZShjLCAxKTsKKyAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCWNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKSk7Ci0JUHlfREVDUkVGKGNvKTsKKyAgICBjb21waWxlcl9tYWtlX2Nsb3N1cmUoYywgY28sIGFzZGxfc2VxX0xFTihhcmdzLT5kZWZhdWx0cykpOworICAgIFB5X0RFQ1JFRihjbyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGRlY29zKTsgaSsrKSB7Ci0JCUFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgMSk7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oZGVjb3MpOyBpKyspIHsKKyAgICAgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCAxKTsKKyAgICB9CiAKLQlyZXR1cm4gY29tcGlsZXJfbmFtZW9wKGMsIHMtPnYuRnVuY3Rpb25EZWYubmFtZSwgU3RvcmUpOworICAgIHJldHVybiBjb21waWxlcl9uYW1lb3AoYywgcy0+di5GdW5jdGlvbkRlZi5uYW1lLCBTdG9yZSk7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2NsYXNzKHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCWludCBuLCBpOwotCVB5Q29kZU9iamVjdCAqY287Ci0JUHlPYmplY3QgKnN0cjsKLQlhc2RsX3NlcSogZGVjb3MgPSBzLT52LkNsYXNzRGVmLmRlY29yYXRvcl9saXN0OwotCQotCWlmICghY29tcGlsZXJfZGVjb3JhdG9ycyhjLCBkZWNvcykpCi0JCXJldHVybiAwOworICAgIGludCBuLCBpOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKnN0cjsKKyAgICBhc2RsX3NlcSogZGVjb3MgPSBzLT52LkNsYXNzRGVmLmRlY29yYXRvcl9saXN0OwogCi0JLyogcHVzaCBjbGFzcyBuYW1lIG9uIHN0YWNrLCBuZWVkZWQgYnkgQlVJTERfQ0xBU1MgKi8KLQlBRERPUF9PKGMsIExPQURfQ09OU1QsIHMtPnYuQ2xhc3NEZWYubmFtZSwgY29uc3RzKTsKLQkvKiBwdXNoIHRoZSB0dXBsZSBvZiBiYXNlIGNsYXNzZXMgb24gdGhlIHN0YWNrICovCi0JbiA9IGFzZGxfc2VxX0xFTihzLT52LkNsYXNzRGVmLmJhc2VzKTsKLQlpZiAobiA+IDApCi0JCVZJU0lUX1NFUShjLCBleHByLCBzLT52LkNsYXNzRGVmLmJhc2VzKTsKLQlBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBuKTsKLQlpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIHMtPnYuQ2xhc3NEZWYubmFtZSwgKHZvaWQgKilzLAotCQkJCSAgcy0+bGluZW5vKSkKLQkJcmV0dXJuIDA7Ci0JUHlfWERFQ1JFRihjLT51LT51X3ByaXZhdGUpOwotCWMtPnUtPnVfcHJpdmF0ZSA9IHMtPnYuQ2xhc3NEZWYubmFtZTsKLQlQeV9JTkNSRUYoYy0+dS0+dV9wcml2YXRlKTsKLQlzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25hbWVfXyIpOwotCWlmICghc3RyIHx8ICFjb21waWxlcl9uYW1lb3AoYywgc3RyLCBMb2FkKSkgewotCQlQeV9YREVDUkVGKHN0cik7Ci0JCWNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlQeV9ERUNSRUYoc3RyKTsKLQlzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX21vZHVsZV9fIik7Ci0JaWYgKCFzdHIgfHwgIWNvbXBpbGVyX25hbWVvcChjLCBzdHIsIFN0b3JlKSkgewotCQlQeV9YREVDUkVGKHN0cik7Ci0JCWNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7Ci0JCXJldHVybiAwOwotCX0KLQlQeV9ERUNSRUYoc3RyKTsKKyAgICBpZiAoIWNvbXBpbGVyX2RlY29yYXRvcnMoYywgZGVjb3MpKQorICAgICAgICByZXR1cm4gMDsKIAotCWlmICghY29tcGlsZXJfYm9keShjLCBzLT52LkNsYXNzRGVmLmJvZHkpKSB7Ci0JCWNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBwdXNoIGNsYXNzIG5hbWUgb24gc3RhY2ssIG5lZWRlZCBieSBCVUlMRF9DTEFTUyAqLworICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgcy0+di5DbGFzc0RlZi5uYW1lLCBjb25zdHMpOworICAgIC8qIHB1c2ggdGhlIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBvbiB0aGUgc3RhY2sgKi8KKyAgICBuID0gYXNkbF9zZXFfTEVOKHMtPnYuQ2xhc3NEZWYuYmFzZXMpOworICAgIGlmIChuID4gMCkKKyAgICAgICAgVklTSVRfU0VRKGMsIGV4cHIsIHMtPnYuQ2xhc3NEZWYuYmFzZXMpOworICAgIEFERE9QX0koYywgQlVJTERfVFVQTEUsIG4pOworICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgcy0+di5DbGFzc0RlZi5uYW1lLCAodm9pZCAqKXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lbm8pKQorICAgICAgICByZXR1cm4gMDsKKyAgICBQeV9YREVDUkVGKGMtPnUtPnVfcHJpdmF0ZSk7CisgICAgYy0+dS0+dV9wcml2YXRlID0gcy0+di5DbGFzc0RlZi5uYW1lOworICAgIFB5X0lOQ1JFRihjLT51LT51X3ByaXZhdGUpOworICAgIHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fbmFtZV9fIik7CisgICAgaWYgKCFzdHIgfHwgIWNvbXBpbGVyX25hbWVvcChjLCBzdHIsIExvYWQpKSB7CisgICAgICAgIFB5X1hERUNSRUYoc3RyKTsKKyAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JQURET1BfSU5fU0NPUEUoYywgTE9BRF9MT0NBTFMpOwotCUFERE9QX0lOX1NDT1BFKGMsIFJFVFVSTl9WQUxVRSk7Ci0JY28gPSBhc3NlbWJsZShjLCAxKTsKLQljb21waWxlcl9leGl0X3Njb3BlKGMpOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICBzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX21vZHVsZV9fIik7CisgICAgaWYgKCFzdHIgfHwgIWNvbXBpbGVyX25hbWVvcChjLCBzdHIsIFN0b3JlKSkgeworICAgICAgICBQeV9YREVDUkVGKHN0cik7CisgICAgICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBQeV9ERUNSRUYoc3RyKTsKIAotCWNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgMCk7Ci0JUHlfREVDUkVGKGNvKTsKKyAgICBpZiAoIWNvbXBpbGVyX2JvZHkoYywgcy0+di5DbGFzc0RlZi5ib2R5KSkgeworICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDApOwotCUFERE9QKGMsIEJVSUxEX0NMQVNTKTsKLQkvKiBhcHBseSBkZWNvcmF0b3JzICovCi0JZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihkZWNvcyk7IGkrKykgewotCQlBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDEpOwotCX0KLQlpZiAoIWNvbXBpbGVyX25hbWVvcChjLCBzLT52LkNsYXNzRGVmLm5hbWUsIFN0b3JlKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgQURET1BfSU5fU0NPUEUoYywgTE9BRF9MT0NBTFMpOworICAgIEFERE9QX0lOX1NDT1BFKGMsIFJFVFVSTl9WQUxVRSk7CisgICAgY28gPSBhc3NlbWJsZShjLCAxKTsKKyAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOworICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgMCk7CisgICAgUHlfREVDUkVGKGNvKTsKKworICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgMCk7CisgICAgQURET1AoYywgQlVJTERfQ0xBU1MpOworICAgIC8qIGFwcGx5IGRlY29yYXRvcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGRlY29zKTsgaSsrKSB7CisgICAgICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgMSk7CisgICAgfQorICAgIGlmICghY29tcGlsZXJfbmFtZW9wKGMsIHMtPnYuQ2xhc3NEZWYubmFtZSwgU3RvcmUpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaWZleHAoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JYmFzaWNibG9jayAqZW5kLCAqbmV4dDsKLQkKLQlhc3NlcnQoZS0+a2luZCA9PSBJZkV4cF9raW5kKTsKLQllbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKGVuZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQluZXh0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChuZXh0ID09IE5VTEwpCi0JCXJldHVybiAwOwotCVZJU0lUKGMsIGV4cHIsIGUtPnYuSWZFeHAudGVzdCk7Ci0JQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBuZXh0KTsKLQlBRERPUChjLCBQT1BfVE9QKTsKLQlWSVNJVChjLCBleHByLCBlLT52LklmRXhwLmJvZHkpOwotCUFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBlbmQpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIG5leHQpOwotCUFERE9QKGMsIFBPUF9UT1ApOwotCVZJU0lUKGMsIGV4cHIsIGUtPnYuSWZFeHAub3JlbHNlKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwotCXJldHVybiAxOworICAgIGJhc2ljYmxvY2sgKmVuZCwgKm5leHQ7CisKKyAgICBhc3NlcnQoZS0+a2luZCA9PSBJZkV4cF9raW5kKTsKKyAgICBlbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGVuZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuZXh0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuSWZFeHAudGVzdCk7CisgICAgQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBuZXh0KTsKKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICBWSVNJVChjLCBleHByLCBlLT52LklmRXhwLmJvZHkpOworICAgIEFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBlbmQpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIG5leHQpOworICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuSWZFeHAub3JlbHNlKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9sYW1iZGEoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlzdGF0aWMgaWRlbnRpZmllciBuYW1lOwotCWFyZ3VtZW50c190eSBhcmdzID0gZS0+di5MYW1iZGEuYXJnczsKLQlhc3NlcnQoZS0+a2luZCA9PSBMYW1iZGFfa2luZCk7CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBzdGF0aWMgaWRlbnRpZmllciBuYW1lOworICAgIGFyZ3VtZW50c190eSBhcmdzID0gZS0+di5MYW1iZGEuYXJnczsKKyAgICBhc3NlcnQoZS0+a2luZCA9PSBMYW1iZGFfa2luZCk7CiAKLQlpZiAoIW5hbWUpIHsKLQkJbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIjxsYW1iZGE+Iik7Ci0JCWlmICghbmFtZSkKLQkJCXJldHVybiAwOwotCX0KKyAgICBpZiAoIW5hbWUpIHsKKyAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIjxsYW1iZGE+Iik7CisgICAgICAgIGlmICghbmFtZSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmIChhcmdzLT5kZWZhdWx0cykKLQkJVklTSVRfU0VRKGMsIGV4cHIsIGFyZ3MtPmRlZmF1bHRzKTsKLQlpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIG5hbWUsICh2b2lkICopZSwgZS0+bGluZW5vKSkKLQkJcmV0dXJuIDA7CisgICAgaWYgKGFyZ3MtPmRlZmF1bHRzKQorICAgICAgICBWSVNJVF9TRVEoYywgZXhwciwgYXJncy0+ZGVmYXVsdHMpOworICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbmFtZSwgKHZvaWQgKillLCBlLT5saW5lbm8pKQorICAgICAgICByZXR1cm4gMDsKIAotCS8qIHVucGFjayBuZXN0ZWQgYXJndW1lbnRzICovCi0JY29tcGlsZXJfYXJndW1lbnRzKGMsIGFyZ3MpOwotCQotCWMtPnUtPnVfYXJnY291bnQgPSBhc2RsX3NlcV9MRU4oYXJncy0+YXJncyk7Ci0JVklTSVRfSU5fU0NPUEUoYywgZXhwciwgZS0+di5MYW1iZGEuYm9keSk7Ci0JQURET1BfSU5fU0NPUEUoYywgUkVUVVJOX1ZBTFVFKTsKLQljbyA9IGFzc2VtYmxlKGMsIDEpOwotCWNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7Ci0JaWYgKGNvID09IE5VTEwpCi0JCXJldHVybiAwOworICAgIC8qIHVucGFjayBuZXN0ZWQgYXJndW1lbnRzICovCisgICAgY29tcGlsZXJfYXJndW1lbnRzKGMsIGFyZ3MpOwogCi0JY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBhc2RsX3NlcV9MRU4oYXJncy0+ZGVmYXVsdHMpKTsKLQlQeV9ERUNSRUYoY28pOworICAgIGMtPnUtPnVfYXJnY291bnQgPSBhc2RsX3NlcV9MRU4oYXJncy0+YXJncyk7CisgICAgVklTSVRfSU5fU0NPUEUoYywgZXhwciwgZS0+di5MYW1iZGEuYm9keSk7CisgICAgQURET1BfSU5fU0NPUEUoYywgUkVUVVJOX1ZBTFVFKTsKKyAgICBjbyA9IGFzc2VtYmxlKGMsIDEpOworICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7CisgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0JcmV0dXJuIDE7CisgICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBhc2RsX3NlcV9MRU4oYXJncy0+ZGVmYXVsdHMpKTsKKyAgICBQeV9ERUNSRUYoY28pOworCisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3ByaW50KHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCWludCBpLCBuOwotCWJvb2wgZGVzdDsKKyAgICBpbnQgaSwgbjsKKyAgICBib29sIGRlc3Q7CiAKLQlhc3NlcnQocy0+a2luZCA9PSBQcmludF9raW5kKTsKLQluID0gYXNkbF9zZXFfTEVOKHMtPnYuUHJpbnQudmFsdWVzKTsKLQlkZXN0ID0gZmFsc2U7Ci0JaWYgKHMtPnYuUHJpbnQuZGVzdCkgewotCQlWSVNJVChjLCBleHByLCBzLT52LlByaW50LmRlc3QpOwotCQlkZXN0ID0gdHJ1ZTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlleHByX3R5IGUgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQocy0+di5QcmludC52YWx1ZXMsIGkpOwotCQlpZiAoZGVzdCkgewotCQkJQURET1AoYywgRFVQX1RPUCk7Ci0JCQlWSVNJVChjLCBleHByLCBlKTsKLQkJCUFERE9QKGMsIFJPVF9UV08pOwotCQkJQURET1AoYywgUFJJTlRfSVRFTV9UTyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlWSVNJVChjLCBleHByLCBlKTsKLQkJCUFERE9QKGMsIFBSSU5UX0lURU0pOwotCQl9Ci0JfQotCWlmIChzLT52LlByaW50Lm5sKSB7Ci0JCWlmIChkZXN0KQotCQkJQURET1AoYywgUFJJTlRfTkVXTElORV9UTykKLQkJZWxzZQotCQkJQURET1AoYywgUFJJTlRfTkVXTElORSkKLQl9Ci0JZWxzZSBpZiAoZGVzdCkKLQkJQURET1AoYywgUE9QX1RPUCk7Ci0JcmV0dXJuIDE7CisgICAgYXNzZXJ0KHMtPmtpbmQgPT0gUHJpbnRfa2luZCk7CisgICAgbiA9IGFzZGxfc2VxX0xFTihzLT52LlByaW50LnZhbHVlcyk7CisgICAgZGVzdCA9IGZhbHNlOworICAgIGlmIChzLT52LlByaW50LmRlc3QpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5QcmludC5kZXN0KTsKKyAgICAgICAgZGVzdCA9IHRydWU7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZXhwcl90eSBlID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMtPnYuUHJpbnQudmFsdWVzLCBpKTsKKyAgICAgICAgaWYgKGRlc3QpIHsKKyAgICAgICAgICAgIEFERE9QKGMsIERVUF9UT1ApOworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZSk7CisgICAgICAgICAgICBBRERPUChjLCBST1RfVFdPKTsKKyAgICAgICAgICAgIEFERE9QKGMsIFBSSU5UX0lURU1fVE8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZSk7CisgICAgICAgICAgICBBRERPUChjLCBQUklOVF9JVEVNKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+di5QcmludC5ubCkgeworICAgICAgICBpZiAoZGVzdCkKKyAgICAgICAgICAgIEFERE9QKGMsIFBSSU5UX05FV0xJTkVfVE8pCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFERE9QKGMsIFBSSU5UX05FV0xJTkUpCisgICAgfQorICAgIGVsc2UgaWYgKGRlc3QpCisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9pZihzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLQliYXNpY2Jsb2NrICplbmQsICpuZXh0OwotCWludCBjb25zdGFudDsKLQlhc3NlcnQocy0+a2luZCA9PSBJZl9raW5kKTsKLQllbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKGVuZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQluZXh0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChuZXh0ID09IE5VTEwpCi0JICAgIHJldHVybiAwOwotCQotCWNvbnN0YW50ID0gZXhwcl9jb25zdGFudChzLT52LklmLnRlc3QpOwotCS8qIGNvbnN0YW50ID0gMDogImlmIDAiCi0JICogY29uc3RhbnQgPSAxOiAiaWYgMSIsICJpZiAyIiwgLi4uCi0JICogY29uc3RhbnQgPSAtMTogcmVzdCAqLwotCWlmIChjb25zdGFudCA9PSAwKSB7Ci0JCWlmIChzLT52LklmLm9yZWxzZSkKLQkJCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LklmLm9yZWxzZSk7Ci0JfSBlbHNlIGlmIChjb25zdGFudCA9PSAxKSB7Ci0JCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LklmLmJvZHkpOwotCX0gZWxzZSB7Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuSWYudGVzdCk7Ci0JCUFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgbmV4dCk7Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5JZi5ib2R5KTsKLQkJQURET1BfSlJFTChjLCBKVU1QX0ZPUldBUkQsIGVuZCk7Ci0JCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIG5leHQpOwotCQlBRERPUChjLCBQT1BfVE9QKTsKLQkJaWYgKHMtPnYuSWYub3JlbHNlKQotCQkJVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYub3JlbHNlKTsKLQl9Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKLQlyZXR1cm4gMTsKKyAgICBiYXNpY2Jsb2NrICplbmQsICpuZXh0OworICAgIGludCBjb25zdGFudDsKKyAgICBhc3NlcnQocy0+a2luZCA9PSBJZl9raW5kKTsKKyAgICBlbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGVuZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBuZXh0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgY29uc3RhbnQgPSBleHByX2NvbnN0YW50KHMtPnYuSWYudGVzdCk7CisgICAgLyogY29uc3RhbnQgPSAwOiAiaWYgMCIKKyAgICAgKiBjb25zdGFudCA9IDE6ICJpZiAxIiwgImlmIDIiLCAuLi4KKyAgICAgKiBjb25zdGFudCA9IC0xOiByZXN0ICovCisgICAgaWYgKGNvbnN0YW50ID09IDApIHsKKyAgICAgICAgaWYgKHMtPnYuSWYub3JlbHNlKQorICAgICAgICAgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYub3JlbHNlKTsKKyAgICB9IGVsc2UgaWYgKGNvbnN0YW50ID09IDEpIHsKKyAgICAgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuSWYuYm9keSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5JZi50ZXN0KTsKKyAgICAgICAgQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBuZXh0KTsKKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LklmLmJvZHkpOworICAgICAgICBBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgZW5kKTsKKyAgICAgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgbmV4dCk7CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICBpZiAocy0+di5JZi5vcmVsc2UpCisgICAgICAgICAgICBWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5JZi5vcmVsc2UpOworICAgIH0KKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9mb3Ioc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JYmFzaWNibG9jayAqc3RhcnQsICpjbGVhbnVwLCAqZW5kOworICAgIGJhc2ljYmxvY2sgKnN0YXJ0LCAqY2xlYW51cCwgKmVuZDsKIAotCXN0YXJ0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWNsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChzdGFydCA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMIHx8IGNsZWFudXAgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JQURET1BfSlJFTChjLCBTRVRVUF9MT09QLCBlbmQpOwotCWlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgTE9PUCwgc3RhcnQpKQotCQlyZXR1cm4gMDsKLQlWSVNJVChjLCBleHByLCBzLT52LkZvci5pdGVyKTsKLQlBRERPUChjLCBHRVRfSVRFUik7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc3RhcnQpOwotCS8qIGZvciBleHByZXNzaW9ucyBtdXN0IGJlIHRyYWNlZCBvbiBlYWNoIGl0ZXJhdGlvbiwKLQkgICBzbyB3ZSBuZWVkIHRvIHNldCBhbiBleHRyYSBsaW5lIG51bWJlci4gKi8KLQljLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKLQlBRERPUF9KUkVMKGMsIEZPUl9JVEVSLCBjbGVhbnVwKTsKLQlWSVNJVChjLCBleHByLCBzLT52LkZvci50YXJnZXQpOwotCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LkZvci5ib2R5KTsKLQlBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIHN0YXJ0KTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBjbGVhbnVwKTsKLQlBRERPUChjLCBQT1BfQkxPQ0spOwotCWNvbXBpbGVyX3BvcF9mYmxvY2soYywgTE9PUCwgc3RhcnQpOwotCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LkZvci5vcmVsc2UpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7Ci0JcmV0dXJuIDE7CisgICAgc3RhcnQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgY2xlYW51cCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBlbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKHN0YXJ0ID09IE5VTEwgfHwgZW5kID09IE5VTEwgfHwgY2xlYW51cCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBBRERPUF9KUkVMKGMsIFNFVFVQX0xPT1AsIGVuZCk7CisgICAgaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBMT09QLCBzdGFydCkpCisgICAgICAgIHJldHVybiAwOworICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuRm9yLml0ZXIpOworICAgIEFERE9QKGMsIEdFVF9JVEVSKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBzdGFydCk7CisgICAgLyogZm9yIGV4cHJlc3Npb25zIG11c3QgYmUgdHJhY2VkIG9uIGVhY2ggaXRlcmF0aW9uLAorICAgICAgIHNvIHdlIG5lZWQgdG8gc2V0IGFuIGV4dHJhIGxpbmUgbnVtYmVyLiAqLworICAgIGMtPnUtPnVfbGluZW5vX3NldCA9IGZhbHNlOworICAgIEFERE9QX0pSRUwoYywgRk9SX0lURVIsIGNsZWFudXApOworICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuRm9yLnRhcmdldCk7CisgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuRm9yLmJvZHkpOworICAgIEFERE9QX0pBQlMoYywgSlVNUF9BQlNPTFVURSwgc3RhcnQpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGNsZWFudXApOworICAgIEFERE9QKGMsIFBPUF9CTE9DSyk7CisgICAgY29tcGlsZXJfcG9wX2ZibG9jayhjLCBMT09QLCBzdGFydCk7CisgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuRm9yLm9yZWxzZSk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfd2hpbGUoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JYmFzaWNibG9jayAqbG9vcCwgKm9yZWxzZSwgKmVuZCwgKmFuY2hvciA9IE5VTEw7Ci0JaW50IGNvbnN0YW50ID0gZXhwcl9jb25zdGFudChzLT52LldoaWxlLnRlc3QpOworICAgIGJhc2ljYmxvY2sgKmxvb3AsICpvcmVsc2UsICplbmQsICphbmNob3IgPSBOVUxMOworICAgIGludCBjb25zdGFudCA9IGV4cHJfY29uc3RhbnQocy0+di5XaGlsZS50ZXN0KTsKIAotCWlmIChjb25zdGFudCA9PSAwKSB7Ci0JCWlmIChzLT52LldoaWxlLm9yZWxzZSkKLQkJCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LldoaWxlLm9yZWxzZSk7Ci0JCXJldHVybiAxOwotCX0KLQlsb29wID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAoY29uc3RhbnQgPT0gLTEpIHsKLQkJYW5jaG9yID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCQlpZiAoYW5jaG9yID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGxvb3AgPT0gTlVMTCB8fCBlbmQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKHMtPnYuV2hpbGUub3JlbHNlKSB7Ci0JCW9yZWxzZSA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQkJaWYgKG9yZWxzZSA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UKLQkJb3JlbHNlID0gTlVMTDsKKyAgICBpZiAoY29uc3RhbnQgPT0gMCkgeworICAgICAgICBpZiAocy0+di5XaGlsZS5vcmVsc2UpCisgICAgICAgICAgICBWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5XaGlsZS5vcmVsc2UpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgbG9vcCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBlbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGNvbnN0YW50ID09IC0xKSB7CisgICAgICAgIGFuY2hvciA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICAgICAgaWYgKGFuY2hvciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChsb29wID09IE5VTEwgfHwgZW5kID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChzLT52LldoaWxlLm9yZWxzZSkgeworICAgICAgICBvcmVsc2UgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgICAgIGlmIChvcmVsc2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIG9yZWxzZSA9IE5VTEw7CiAKLQlBRERPUF9KUkVMKGMsIFNFVFVQX0xPT1AsIGVuZCk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgbG9vcCk7Ci0JaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBMT09QLCBsb29wKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGNvbnN0YW50ID09IC0xKSB7Ci0JCS8qIHdoaWxlIGV4cHJlc3Npb25zIG11c3QgYmUgdHJhY2VkIG9uIGVhY2ggaXRlcmF0aW9uLAotCQkgICBzbyB3ZSBuZWVkIHRvIHNldCBhbiBleHRyYSBsaW5lIG51bWJlci4gKi8KLQkJYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuV2hpbGUudGVzdCk7Ci0JCUFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgYW5jaG9yKTsKLQkJQURET1AoYywgUE9QX1RPUCk7Ci0JfQotCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LldoaWxlLmJvZHkpOwotCUFERE9QX0pBQlMoYywgSlVNUF9BQlNPTFVURSwgbG9vcCk7CisgICAgQURET1BfSlJFTChjLCBTRVRVUF9MT09QLCBlbmQpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGxvb3ApOworICAgIGlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgTE9PUCwgbG9vcCkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChjb25zdGFudCA9PSAtMSkgeworICAgICAgICAvKiB3aGlsZSBleHByZXNzaW9ucyBtdXN0IGJlIHRyYWNlZCBvbiBlYWNoIGl0ZXJhdGlvbiwKKyAgICAgICAgICAgc28gd2UgbmVlZCB0byBzZXQgYW4gZXh0cmEgbGluZSBudW1iZXIuICovCisgICAgICAgIGMtPnUtPnVfbGluZW5vX3NldCA9IGZhbHNlOworICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LldoaWxlLnRlc3QpOworICAgICAgICBBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIGFuY2hvcik7CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIH0KKyAgICBWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5XaGlsZS5ib2R5KTsKKyAgICBBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIGxvb3ApOwogCi0JLyogWFhYIHNob3VsZCB0aGUgdHdvIFBPUCBpbnN0cnVjdGlvbnMgYmUgaW4gYSBzZXBhcmF0ZSBibG9jawotCSAgIGlmIHRoZXJlIGlzIG5vIGVsc2UgY2xhdXNlID8KLQkqLworICAgIC8qIFhYWCBzaG91bGQgdGhlIHR3byBQT1AgaW5zdHJ1Y3Rpb25zIGJlIGluIGEgc2VwYXJhdGUgYmxvY2sKKyAgICAgICBpZiB0aGVyZSBpcyBubyBlbHNlIGNsYXVzZSA/CisgICAgKi8KIAotCWlmIChjb25zdGFudCA9PSAtMSkgewotCQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBhbmNob3IpOwotCQlBRERPUChjLCBQT1BfVE9QKTsKLQkJQURET1AoYywgUE9QX0JMT0NLKTsKLQl9Ci0JY29tcGlsZXJfcG9wX2ZibG9jayhjLCBMT09QLCBsb29wKTsKLQlpZiAob3JlbHNlICE9IE5VTEwpIC8qIHdoYXQgaWYgb3JlbHNlIGlzIGp1c3QgcGFzcz8gKi8KLQkJVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuV2hpbGUub3JlbHNlKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOworICAgIGlmIChjb25zdGFudCA9PSAtMSkgeworICAgICAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBhbmNob3IpOworICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICAgICAgQURET1AoYywgUE9QX0JMT0NLKTsKKyAgICB9CisgICAgY29tcGlsZXJfcG9wX2ZibG9jayhjLCBMT09QLCBsb29wKTsKKyAgICBpZiAob3JlbHNlICE9IE5VTEwpIC8qIHdoYXQgaWYgb3JlbHNlIGlzIGp1c3QgcGFzcz8gKi8KKyAgICAgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuV2hpbGUub3JlbHNlKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwogCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2NvbnRpbnVlKHN0cnVjdCBjb21waWxlciAqYykKIHsKLQlzdGF0aWMgY29uc3QgY2hhciBMT09QX0VSUk9SX01TR1tdID0gIidjb250aW51ZScgbm90IHByb3Blcmx5IGluIGxvb3AiOwotCXN0YXRpYyBjb25zdCBjaGFyIElOX0ZJTkFMTFlfRVJST1JfTVNHW10gPSAKLQkJCSInY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UiOwotCWludCBpOworICAgIHN0YXRpYyBjb25zdCBjaGFyIExPT1BfRVJST1JfTVNHW10gPSAiJ2NvbnRpbnVlJyBub3QgcHJvcGVybHkgaW4gbG9vcCI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgSU5fRklOQUxMWV9FUlJPUl9NU0dbXSA9CisgICAgICAgICAgICAgICAgICAgICInY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UiOworICAgIGludCBpOwogCi0JaWYgKCFjLT51LT51X25mYmxvY2tzKQotCQlyZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgTE9PUF9FUlJPUl9NU0cpOwotCWkgPSBjLT51LT51X25mYmxvY2tzIC0gMTsKLQlzd2l0Y2ggKGMtPnUtPnVfZmJsb2NrW2ldLmZiX3R5cGUpIHsKLQljYXNlIExPT1A6Ci0JCUFERE9QX0pBQlMoYywgSlVNUF9BQlNPTFVURSwgYy0+dS0+dV9mYmxvY2tbaV0uZmJfYmxvY2spOwotCQlicmVhazsKLQljYXNlIEVYQ0VQVDoKLQljYXNlIEZJTkFMTFlfVFJZOgotCQl3aGlsZSAoLS1pID49IDAgJiYgYy0+dS0+dV9mYmxvY2tbaV0uZmJfdHlwZSAhPSBMT09QKSB7Ci0JCQkvKiBQcmV2ZW50IGNvbnRpbnVlIGFueXdoZXJlIHVuZGVyIGEgZmluYWxseQotCQkJICAgICAgZXZlbiBpZiBoaWRkZW4gaW4gYSBzdWItdHJ5IG9yIGV4Y2VwdC4gKi8KLQkJCWlmIChjLT51LT51X2ZibG9ja1tpXS5mYl90eXBlID09IEZJTkFMTFlfRU5EKQotCQkJCXJldHVybiBjb21waWxlcl9lcnJvcihjLCBJTl9GSU5BTExZX0VSUk9SX01TRyk7Ci0JCX0KLQkJaWYgKGkgPT0gLTEpCi0JCQlyZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgTE9PUF9FUlJPUl9NU0cpOwotCQlBRERPUF9KQUJTKGMsIENPTlRJTlVFX0xPT1AsIGMtPnUtPnVfZmJsb2NrW2ldLmZiX2Jsb2NrKTsKLQkJYnJlYWs7Ci0JY2FzZSBGSU5BTExZX0VORDoKLQkJcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsIElOX0ZJTkFMTFlfRVJST1JfTVNHKTsKLQl9CisgICAgaWYgKCFjLT51LT51X25mYmxvY2tzKQorICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgTE9PUF9FUlJPUl9NU0cpOworICAgIGkgPSBjLT51LT51X25mYmxvY2tzIC0gMTsKKyAgICBzd2l0Y2ggKGMtPnUtPnVfZmJsb2NrW2ldLmZiX3R5cGUpIHsKKyAgICBjYXNlIExPT1A6CisgICAgICAgIEFERE9QX0pBQlMoYywgSlVNUF9BQlNPTFVURSwgYy0+dS0+dV9mYmxvY2tbaV0uZmJfYmxvY2spOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYQ0VQVDoKKyAgICBjYXNlIEZJTkFMTFlfVFJZOgorICAgICAgICB3aGlsZSAoLS1pID49IDAgJiYgYy0+dS0+dV9mYmxvY2tbaV0uZmJfdHlwZSAhPSBMT09QKSB7CisgICAgICAgICAgICAvKiBQcmV2ZW50IGNvbnRpbnVlIGFueXdoZXJlIHVuZGVyIGEgZmluYWxseQorICAgICAgICAgICAgICAgICAgZXZlbiBpZiBoaWRkZW4gaW4gYSBzdWItdHJ5IG9yIGV4Y2VwdC4gKi8KKyAgICAgICAgICAgIGlmIChjLT51LT51X2ZibG9ja1tpXS5mYl90eXBlID09IEZJTkFMTFlfRU5EKQorICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlcl9lcnJvcihjLCBJTl9GSU5BTExZX0VSUk9SX01TRyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgTE9PUF9FUlJPUl9NU0cpOworICAgICAgICBBRERPUF9KQUJTKGMsIENPTlRJTlVFX0xPT1AsIGMtPnUtPnVfZmJsb2NrW2ldLmZiX2Jsb2NrKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGSU5BTExZX0VORDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsIElOX0ZJTkFMTFlfRVJST1JfTVNHKTsKKyAgICB9CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogQ29kZSBnZW5lcmF0ZWQgZm9yICJ0cnk6IDxib2R5PiBmaW5hbGx5OiA8ZmluYWxib2R5PiIgaXMgYXMgZm9sbG93czoKLSAgIAotCQlTRVRVUF9GSU5BTExZCUwKLQkJPGNvZGUgZm9yIGJvZHk+Ci0JCVBPUF9CTE9DSwotCQlMT0FEX0NPTlNUCTxOb25lPgotCUw6CTxjb2RlIGZvciBmaW5hbGJvZHk+Ci0JCUVORF9GSU5BTExZCi0gICAKKworICAgICAgICBTRVRVUF9GSU5BTExZICAgICAgICAgICBMCisgICAgICAgIDxjb2RlIGZvciBib2R5PgorICAgICAgICBQT1BfQkxPQ0sKKyAgICAgICAgTE9BRF9DT05TVCAgICAgICAgICAgICAgPE5vbmU+CisgICAgTDogICAgICAgICAgPGNvZGUgZm9yIGZpbmFsYm9keT4KKyAgICAgICAgRU5EX0ZJTkFMTFkKKwogICAgVGhlIHNwZWNpYWwgaW5zdHJ1Y3Rpb25zIHVzZSB0aGUgYmxvY2sgc3RhY2suICBFYWNoIGJsb2NrCiAgICBzdGFjayBlbnRyeSBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBjcmVhdGVkIGl0IChoZXJlCiAgICBTRVRVUF9GSU5BTExZKSwgdGhlIGxldmVsIG9mIHRoZSB2YWx1ZSBzdGFjayBhdCB0aGUgdGltZSB0aGUKICAgIGJsb2NrIHN0YWNrIGVudHJ5IHdhcyBjcmVhdGVkLCBhbmQgYSBsYWJlbCAoaGVyZSBMKS4KLSAgIAorCiAgICBTRVRVUF9GSU5BTExZOgotCVB1c2hlcyB0aGUgY3VycmVudCB2YWx1ZSBzdGFjayBsZXZlbCBhbmQgdGhlIGxhYmVsCi0Jb250byB0aGUgYmxvY2sgc3RhY2suCisgICAgUHVzaGVzIHRoZSBjdXJyZW50IHZhbHVlIHN0YWNrIGxldmVsIGFuZCB0aGUgbGFiZWwKKyAgICBvbnRvIHRoZSBibG9jayBzdGFjay4KICAgIFBPUF9CTE9DSzoKLQlQb3BzIGVuIGVudHJ5IGZyb20gdGhlIGJsb2NrIHN0YWNrLCBhbmQgcG9wcyB0aGUgdmFsdWUKLQlzdGFjayB1bnRpbCBpdHMgbGV2ZWwgaXMgdGhlIHNhbWUgYXMgaW5kaWNhdGVkIG9uIHRoZQotCWJsb2NrIHN0YWNrLiAgKFRoZSBsYWJlbCBpcyBpZ25vcmVkLikKKyAgICBQb3BzIGVuIGVudHJ5IGZyb20gdGhlIGJsb2NrIHN0YWNrLCBhbmQgcG9wcyB0aGUgdmFsdWUKKyAgICBzdGFjayB1bnRpbCBpdHMgbGV2ZWwgaXMgdGhlIHNhbWUgYXMgaW5kaWNhdGVkIG9uIHRoZQorICAgIGJsb2NrIHN0YWNrLiAgKFRoZSBsYWJlbCBpcyBpZ25vcmVkLikKICAgIEVORF9GSU5BTExZOgotCVBvcHMgYSB2YXJpYWJsZSBudW1iZXIgb2YgZW50cmllcyBmcm9tIHRoZSAqdmFsdWUqIHN0YWNrCi0JYW5kIHJlLXJhaXNlcyB0aGUgZXhjZXB0aW9uIHRoZXkgc3BlY2lmeS4gIFRoZSBudW1iZXIgb2YKLQllbnRyaWVzIHBvcHBlZCBkZXBlbmRzIG9uIHRoZSAocHNldWRvKSBleGNlcHRpb24gdHlwZS4KLSAgIAorICAgIFBvcHMgYSB2YXJpYWJsZSBudW1iZXIgb2YgZW50cmllcyBmcm9tIHRoZSAqdmFsdWUqIHN0YWNrCisgICAgYW5kIHJlLXJhaXNlcyB0aGUgZXhjZXB0aW9uIHRoZXkgc3BlY2lmeS4gIFRoZSBudW1iZXIgb2YKKyAgICBlbnRyaWVzIHBvcHBlZCBkZXBlbmRzIG9uIHRoZSAocHNldWRvKSBleGNlcHRpb24gdHlwZS4KKwogICAgVGhlIGJsb2NrIHN0YWNrIGlzIHVud291bmQgd2hlbiBhbiBleGNlcHRpb24gaXMgcmFpc2VkOgogICAgd2hlbiBhIFNFVFVQX0ZJTkFMTFkgZW50cnkgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgcHVzaGVkCiAgICBvbnRvIHRoZSB2YWx1ZSBzdGFjayAoYW5kIHRoZSBleGNlcHRpb24gY29uZGl0aW9uIGlzIGNsZWFyZWQpLApAQCAtMTc3MywyOSArMTc3MywyOSBAQAogc3RhdGljIGludAogY29tcGlsZXJfdHJ5X2ZpbmFsbHkoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JYmFzaWNibG9jayAqYm9keSwgKmVuZDsKLQlib2R5ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAoYm9keSA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICBiYXNpY2Jsb2NrICpib2R5LCAqZW5kOworICAgIGJvZHkgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChib2R5ID09IE5VTEwgfHwgZW5kID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0JQURET1BfSlJFTChjLCBTRVRVUF9GSU5BTExZLCBlbmQpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGJvZHkpOwotCWlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgRklOQUxMWV9UUlksIGJvZHkpKQotCQlyZXR1cm4gMDsKLQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5UcnlGaW5hbGx5LmJvZHkpOwotCUFERE9QKGMsIFBPUF9CTE9DSyk7Ci0JY29tcGlsZXJfcG9wX2ZibG9jayhjLCBGSU5BTExZX1RSWSwgYm9keSk7CisgICAgQURET1BfSlJFTChjLCBTRVRVUF9GSU5BTExZLCBlbmQpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGJvZHkpOworICAgIGlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgRklOQUxMWV9UUlksIGJvZHkpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5UcnlGaW5hbGx5LmJvZHkpOworICAgIEFERE9QKGMsIFBPUF9CTE9DSyk7CisgICAgY29tcGlsZXJfcG9wX2ZibG9jayhjLCBGSU5BTExZX1RSWSwgYm9keSk7CiAKLQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKLQlpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIEZJTkFMTFlfRU5ELCBlbmQpKQotCQlyZXR1cm4gMDsKLQlWSVNJVF9TRVEoYywgc3RtdCwgcy0+di5UcnlGaW5hbGx5LmZpbmFsYm9keSk7Ci0JQURET1AoYywgRU5EX0ZJTkFMTFkpOwotCWNvbXBpbGVyX3BvcF9mYmxvY2soYywgRklOQUxMWV9FTkQsIGVuZCk7CisgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CisgICAgaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBGSU5BTExZX0VORCwgZW5kKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuVHJ5RmluYWxseS5maW5hbGJvZHkpOworICAgIEFERE9QKGMsIEVORF9GSU5BTExZKTsKKyAgICBjb21waWxlcl9wb3BfZmJsb2NrKGMsIEZJTkFMTFlfRU5ELCBlbmQpOwogCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC0xODAzLDEwMTEgKzE4MDMsMTAxMSBAQAogICAgKFRoZSBjb250ZW50cyBvZiB0aGUgdmFsdWUgc3RhY2sgaXMgc2hvd24gaW4gW10sIHdpdGggdGhlIHRvcAogICAgYXQgdGhlIHJpZ2h0OyAndGInIGlzIHRyYWNlLWJhY2sgaW5mbywgJ3ZhbCcgdGhlIGV4Y2VwdGlvbidzCiAgICBhc3NvY2lhdGVkIHZhbHVlLCBhbmQgJ2V4YycgdGhlIGV4Y2VwdGlvbi4pCi0gICAKLSAgIFZhbHVlIHN0YWNrCQlMYWJlbAlJbnN0cnVjdGlvbglBcmd1bWVudAotICAgW10JCQkJU0VUVVBfRVhDRVBUCUwxCi0gICBbXQkJCQk8Y29kZSBmb3IgUz4KLSAgIFtdCQkJCVBPUF9CTE9DSwotICAgW10JCQkJSlVNUF9GT1JXQVJECUwwCi0gICAKLSAgIFt0YiwgdmFsLCBleGNdCUwxOglEVVAJCQkJKQotICAgW3RiLCB2YWwsIGV4YywgZXhjXQkJPGV2YWx1YXRlIEUxPgkJCSkKLSAgIFt0YiwgdmFsLCBleGMsIGV4YywgRTFdCUNPTVBBUkVfT1AJRVhDX01BVENICSkgb25seSBpZiBFMQotICAgW3RiLCB2YWwsIGV4YywgMS1vci0wXQlKVU1QX0lGX0ZBTFNFCUwyCQkpCi0gICBbdGIsIHZhbCwgZXhjLCAxXQkJUE9QCQkJCSkKLSAgIFt0YiwgdmFsLCBleGNdCQlQT1AKLSAgIFt0YiwgdmFsXQkJCTxhc3NpZ24gdG8gVjE+CShvciBQT1AgaWYgbm8gVjEpCi0gICBbdGJdCQkJCVBPUAotICAgW10JCQkJPGNvZGUgZm9yIFMxPgotCQkJCUpVTVBfRk9SV0FSRAlMMAotICAgCi0gICBbdGIsIHZhbCwgZXhjLCAwXQlMMjoJUE9QCi0gICBbdGIsIHZhbCwgZXhjXQkJRFVQCisKKyAgIFZhbHVlIHN0YWNrICAgICAgICAgIExhYmVsICAgSW5zdHJ1Y3Rpb24gICAgIEFyZ3VtZW50CisgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFVFVQX0VYQ0VQVCAgICBMMQorICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBmb3IgUz4KKyAgIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9QX0JMT0NLCisgICBbXSAgICAgICAgICAgICAgICAgICAgICAgICAgIEpVTVBfRk9SV0FSRCAgICBMMAorCisgICBbdGIsIHZhbCwgZXhjXSAgICAgICBMMTogICAgIERVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgW3RiLCB2YWwsIGV4YywgZXhjXSAgICAgICAgICA8ZXZhbHVhdGUgRTE+ICAgICAgICAgICAgICAgICAgICkKKyAgIFt0YiwgdmFsLCBleGMsIGV4YywgRTFdICAgICAgQ09NUEFSRV9PUCAgICAgIEVYQ19NQVRDSCAgICAgICApIG9ubHkgaWYgRTEKKyAgIFt0YiwgdmFsLCBleGMsIDEtb3ItMF0gICAgICAgSlVNUF9JRl9GQUxTRSAgIEwyICAgICAgICAgICAgICApCisgICBbdGIsIHZhbCwgZXhjLCAxXSAgICAgICAgICAgIFBPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgW3RiLCB2YWwsIGV4Y10gICAgICAgICAgICAgICBQT1AKKyAgIFt0YiwgdmFsXSAgICAgICAgICAgICAgICAgICAgPGFzc2lnbiB0byBWMT4gIChvciBQT1AgaWYgbm8gVjEpCisgICBbdGJdICAgICAgICAgICAgICAgICAgICAgICAgIFBPUAorICAgW10gICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZSBmb3IgUzE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpVTVBfRk9SV0FSRCAgICBMMAorCisgICBbdGIsIHZhbCwgZXhjLCAwXSAgICBMMjogICAgIFBPUAorICAgW3RiLCB2YWwsIGV4Y10gICAgICAgICAgICAgICBEVVAKICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uZXRjLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KIAotICAgW3RiLCB2YWwsIGV4YywgMF0JTG4rMToJUE9QCi0gICBbdGIsIHZhbCwgZXhjXQkJRU5EX0ZJTkFMTFkJIyByZS1yYWlzZSBleGNlcHRpb24KLSAgIAotICAgW10JCQlMMDoJPG5leHQgc3RhdGVtZW50PgotICAgCisgICBbdGIsIHZhbCwgZXhjLCAwXSAgICBMbisxOiAgIFBPUAorICAgW3RiLCB2YWwsIGV4Y10gICAgICAgICAgICAgICBFTkRfRklOQUxMWSAgICAgIyByZS1yYWlzZSBleGNlcHRpb24KKworICAgW10gICAgICAgICAgICAgICAgICAgTDA6ICAgICA8bmV4dCBzdGF0ZW1lbnQ+CisKICAgIE9mIGNvdXJzZSwgcGFydHMgYXJlIG5vdCBnZW5lcmF0ZWQgaWYgVmkgb3IgRWkgaXMgbm90IHByZXNlbnQuCiAqLwogc3RhdGljIGludAogY29tcGlsZXJfdHJ5X2V4Y2VwdChzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKLQliYXNpY2Jsb2NrICpib2R5LCAqb3JlbHNlLCAqZXhjZXB0LCAqZW5kOwotCWludCBpLCBuOworICAgIGJhc2ljYmxvY2sgKmJvZHksICpvcmVsc2UsICpleGNlcHQsICplbmQ7CisgICAgaW50IGksIG47CiAKLQlib2R5ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWV4Y2VwdCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlvcmVsc2UgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmIChib2R5ID09IE5VTEwgfHwgZXhjZXB0ID09IE5VTEwgfHwgb3JlbHNlID09IE5VTEwgfHwgZW5kID09IE5VTEwpCi0JCXJldHVybiAwOwotCUFERE9QX0pSRUwoYywgU0VUVVBfRVhDRVBULCBleGNlcHQpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGJvZHkpOwotCWlmICghY29tcGlsZXJfcHVzaF9mYmxvY2soYywgRVhDRVBULCBib2R5KSkKLQkJcmV0dXJuIDA7Ci0JVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuVHJ5RXhjZXB0LmJvZHkpOwotCUFERE9QKGMsIFBPUF9CTE9DSyk7Ci0JY29tcGlsZXJfcG9wX2ZibG9jayhjLCBFWENFUFQsIGJvZHkpOwotCUFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBvcmVsc2UpOwotCW4gPSBhc2RsX3NlcV9MRU4ocy0+di5UcnlFeGNlcHQuaGFuZGxlcnMpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGV4Y2VwdCk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlleGNlcHRoYW5kbGVyX3R5IGhhbmRsZXIgPSAoZXhjZXB0aGFuZGxlcl90eSlhc2RsX3NlcV9HRVQoCi0JCQkJCQlzLT52LlRyeUV4Y2VwdC5oYW5kbGVycywgaSk7Ci0JCWlmICghaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLnR5cGUgJiYgaSA8IG4tMSkKLQkJICAgIHJldHVybiBjb21waWxlcl9lcnJvcihjLCAiZGVmYXVsdCAnZXhjZXB0OicgbXVzdCBiZSBsYXN0Iik7Ci0JCWMtPnUtPnVfbGluZW5vX3NldCA9IGZhbHNlOwotCQljLT51LT51X2xpbmVubyA9IGhhbmRsZXItPmxpbmVubzsKLQkJZXhjZXB0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCQlpZiAoZXhjZXB0ID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci50eXBlKSB7Ci0JCQlBRERPUChjLCBEVVBfVE9QKTsKLQkJCVZJU0lUKGMsIGV4cHIsIGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci50eXBlKTsKLQkJCUFERE9QX0koYywgQ09NUEFSRV9PUCwgUHlDbXBfRVhDX01BVENIKTsKLQkJCUFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgZXhjZXB0KTsKLQkJCUFERE9QKGMsIFBPUF9UT1ApOwotCQl9Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCQlpZiAoaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLm5hbWUpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci5uYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCUFERE9QKGMsIFBPUF9UT1ApOwotCQl9Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCQlWSVNJVF9TRVEoYywgc3RtdCwgaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLmJvZHkpOwotCQlBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgZW5kKTsKLQkJY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZXhjZXB0KTsKLQkJaWYgKGhhbmRsZXItPnYuRXhjZXB0SGFuZGxlci50eXBlKQotCQkJQURET1AoYywgUE9QX1RPUCk7Ci0JfQotCUFERE9QKGMsIEVORF9GSU5BTExZKTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBvcmVsc2UpOwotCVZJU0lUX1NFUShjLCBzdG10LCBzLT52LlRyeUV4Y2VwdC5vcmVsc2UpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7Ci0JcmV0dXJuIDE7CisgICAgYm9keSA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBleGNlcHQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgb3JlbHNlID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAoYm9keSA9PSBOVUxMIHx8IGV4Y2VwdCA9PSBOVUxMIHx8IG9yZWxzZSA9PSBOVUxMIHx8IGVuZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBBRERPUF9KUkVMKGMsIFNFVFVQX0VYQ0VQVCwgZXhjZXB0KTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBib2R5KTsKKyAgICBpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIEVYQ0VQVCwgYm9keSkpCisgICAgICAgIHJldHVybiAwOworICAgIFZJU0lUX1NFUShjLCBzdG10LCBzLT52LlRyeUV4Y2VwdC5ib2R5KTsKKyAgICBBRERPUChjLCBQT1BfQkxPQ0spOworICAgIGNvbXBpbGVyX3BvcF9mYmxvY2soYywgRVhDRVBULCBib2R5KTsKKyAgICBBRERPUF9KUkVMKGMsIEpVTVBfRk9SV0FSRCwgb3JlbHNlKTsKKyAgICBuID0gYXNkbF9zZXFfTEVOKHMtPnYuVHJ5RXhjZXB0LmhhbmRsZXJzKTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBleGNlcHQpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZXhjZXB0aGFuZGxlcl90eSBoYW5kbGVyID0gKGV4Y2VwdGhhbmRsZXJfdHkpYXNkbF9zZXFfR0VUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnYuVHJ5RXhjZXB0LmhhbmRsZXJzLCBpKTsKKyAgICAgICAgaWYgKCFoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIudHlwZSAmJiBpIDwgbi0xKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICJkZWZhdWx0ICdleGNlcHQ6JyBtdXN0IGJlIGxhc3QiKTsKKyAgICAgICAgYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7CisgICAgICAgIGMtPnUtPnVfbGluZW5vID0gaGFuZGxlci0+bGluZW5vOworICAgICAgICBleGNlcHQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgICAgIGlmIChleGNlcHQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLnR5cGUpIHsKKyAgICAgICAgICAgIEFERE9QKGMsIERVUF9UT1ApOworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLnR5cGUpOworICAgICAgICAgICAgQURET1BfSShjLCBDT01QQVJFX09QLCBQeUNtcF9FWENfTUFUQ0gpOworICAgICAgICAgICAgQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBleGNlcHQpOworICAgICAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgIGlmIChoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIubmFtZSkgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLm5hbWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgIH0KKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgIFZJU0lUX1NFUShjLCBzdG10LCBoYW5kbGVyLT52LkV4Y2VwdEhhbmRsZXIuYm9keSk7CisgICAgICAgIEFERE9QX0pSRUwoYywgSlVNUF9GT1JXQVJELCBlbmQpOworICAgICAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBleGNlcHQpOworICAgICAgICBpZiAoaGFuZGxlci0+di5FeGNlcHRIYW5kbGVyLnR5cGUpCisgICAgICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICB9CisgICAgQURET1AoYywgRU5EX0ZJTkFMTFkpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIG9yZWxzZSk7CisgICAgVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuVHJ5RXhjZXB0Lm9yZWxzZSk7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaW1wb3J0X2FzKHN0cnVjdCBjb21waWxlciAqYywgaWRlbnRpZmllciBuYW1lLCBpZGVudGlmaWVyIGFzbmFtZSkKIHsKLQkvKiBUaGUgSU1QT1JUX05BTUUgb3Bjb2RlIHdhcyBhbHJlYWR5IGdlbmVyYXRlZC4gIFRoaXMgZnVuY3Rpb24KLQkgICBtZXJlbHkgbmVlZHMgdG8gYmluZCB0aGUgcmVzdWx0IHRvIGEgbmFtZS4KKyAgICAvKiBUaGUgSU1QT1JUX05BTUUgb3Bjb2RlIHdhcyBhbHJlYWR5IGdlbmVyYXRlZC4gIFRoaXMgZnVuY3Rpb24KKyAgICAgICBtZXJlbHkgbmVlZHMgdG8gYmluZCB0aGUgcmVzdWx0IHRvIGEgbmFtZS4KIAotCSAgIElmIHRoZXJlIGlzIGEgZG90IGluIG5hbWUsIHdlIG5lZWQgdG8gc3BsaXQgaXQgYW5kIGVtaXQgYSAKLQkgICBMT0FEX0FUVFIgZm9yIGVhY2ggbmFtZS4KLQkqLwotCWNvbnN0IGNoYXIgKnNyYyA9IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKTsKLQljb25zdCBjaGFyICpkb3QgPSBzdHJjaHIoc3JjLCAnLicpOwotCWlmIChkb3QpIHsKLQkJLyogQ29uc3VtZSB0aGUgYmFzZSBtb2R1bGUgbmFtZSB0byBnZXQgdGhlIGZpcnN0IGF0dHJpYnV0ZSAqLwotCQlzcmMgPSBkb3QgKyAxOwotCQl3aGlsZSAoZG90KSB7Ci0JCQkvKiBOQiBzcmMgaXMgb25seSBkZWZpbmVkIHdoZW4gZG90ICE9IE5VTEwgKi8KLQkJCVB5T2JqZWN0ICphdHRyOwotCQkJZG90ID0gc3RyY2hyKHNyYywgJy4nKTsKLQkJCWF0dHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzcmMsIAotCQkJCQkgICAgZG90ID8gZG90IC0gc3JjIDogc3RybGVuKHNyYykpOwotCQkJaWYgKCFhdHRyKQotCQkJCXJldHVybiAtMTsKLQkJCUFERE9QX08oYywgTE9BRF9BVFRSLCBhdHRyLCBuYW1lcyk7Ci0JCQlQeV9ERUNSRUYoYXR0cik7Ci0JCQlzcmMgPSBkb3QgKyAxOwotCQl9Ci0JfQotCXJldHVybiBjb21waWxlcl9uYW1lb3AoYywgYXNuYW1lLCBTdG9yZSk7CisgICAgICAgSWYgdGhlcmUgaXMgYSBkb3QgaW4gbmFtZSwgd2UgbmVlZCB0byBzcGxpdCBpdCBhbmQgZW1pdCBhCisgICAgICAgTE9BRF9BVFRSIGZvciBlYWNoIG5hbWUuCisgICAgKi8KKyAgICBjb25zdCBjaGFyICpzcmMgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7CisgICAgY29uc3QgY2hhciAqZG90ID0gc3RyY2hyKHNyYywgJy4nKTsKKyAgICBpZiAoZG90KSB7CisgICAgICAgIC8qIENvbnN1bWUgdGhlIGJhc2UgbW9kdWxlIG5hbWUgdG8gZ2V0IHRoZSBmaXJzdCBhdHRyaWJ1dGUgKi8KKyAgICAgICAgc3JjID0gZG90ICsgMTsKKyAgICAgICAgd2hpbGUgKGRvdCkgeworICAgICAgICAgICAgLyogTkIgc3JjIGlzIG9ubHkgZGVmaW5lZCB3aGVuIGRvdCAhPSBOVUxMICovCisgICAgICAgICAgICBQeU9iamVjdCAqYXR0cjsKKyAgICAgICAgICAgIGRvdCA9IHN0cmNocihzcmMsICcuJyk7CisgICAgICAgICAgICBhdHRyID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3QgPyBkb3QgLSBzcmMgOiBzdHJsZW4oc3JjKSk7CisgICAgICAgICAgICBpZiAoIWF0dHIpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0FUVFIsIGF0dHIsIG5hbWVzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhdHRyKTsKKyAgICAgICAgICAgIHNyYyA9IGRvdCArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvbXBpbGVyX25hbWVvcChjLCBhc25hbWUsIFN0b3JlKTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaW1wb3J0KHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCS8qIFRoZSBJbXBvcnQgbm9kZSBzdG9yZXMgYSBtb2R1bGUgbmFtZSBsaWtlIGEuYi5jIGFzIGEgc2luZ2xlCi0JICAgc3RyaW5nLiAgVGhpcyBpcyBjb252ZW5pZW50IGZvciBhbGwgY2FzZXMgZXhjZXB0Ci0JICAgICBpbXBvcnQgYS5iLmMgYXMgZAotCSAgIHdoZXJlIHdlIG5lZWQgdG8gcGFyc2UgdGhhdCBzdHJpbmcgdG8gZXh0cmFjdCB0aGUgaW5kaXZpZHVhbAotCSAgIG1vZHVsZSBuYW1lcy4gIAotCSAgIFhYWCBQZXJoYXBzIGNoYW5nZSB0aGUgcmVwcmVzZW50YXRpb24gdG8gbWFrZSB0aGlzIGNhc2Ugc2ltcGxlcj8KLQkgKi8KLQlpbnQgaSwgbiA9IGFzZGxfc2VxX0xFTihzLT52LkltcG9ydC5uYW1lcyk7CisgICAgLyogVGhlIEltcG9ydCBub2RlIHN0b3JlcyBhIG1vZHVsZSBuYW1lIGxpa2UgYS5iLmMgYXMgYSBzaW5nbGUKKyAgICAgICBzdHJpbmcuICBUaGlzIGlzIGNvbnZlbmllbnQgZm9yIGFsbCBjYXNlcyBleGNlcHQKKyAgICAgICAgIGltcG9ydCBhLmIuYyBhcyBkCisgICAgICAgd2hlcmUgd2UgbmVlZCB0byBwYXJzZSB0aGF0IHN0cmluZyB0byBleHRyYWN0IHRoZSBpbmRpdmlkdWFsCisgICAgICAgbW9kdWxlIG5hbWVzLgorICAgICAgIFhYWCBQZXJoYXBzIGNoYW5nZSB0aGUgcmVwcmVzZW50YXRpb24gdG8gbWFrZSB0aGlzIGNhc2Ugc2ltcGxlcj8KKyAgICAgKi8KKyAgICBpbnQgaSwgbiA9IGFzZGxfc2VxX0xFTihzLT52LkltcG9ydC5uYW1lcyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWFsaWFzX3R5IGFsaWFzID0gKGFsaWFzX3R5KWFzZGxfc2VxX0dFVChzLT52LkltcG9ydC5uYW1lcywgaSk7Ci0JCWludCByOwotCQlQeU9iamVjdCAqbGV2ZWw7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnQubmFtZXMsIGkpOworICAgICAgICBpbnQgcjsKKyAgICAgICAgUHlPYmplY3QgKmxldmVsOwogCi0JCWlmIChjLT5jX2ZsYWdzICYmIChjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQpKQotCQkJbGV2ZWwgPSBQeUludF9Gcm9tTG9uZygwKTsKLQkJZWxzZQotCQkJbGV2ZWwgPSBQeUludF9Gcm9tTG9uZygtMSk7CisgICAgICAgIGlmIChjLT5jX2ZsYWdzICYmIChjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQpKQorICAgICAgICAgICAgbGV2ZWwgPSBQeUludF9Gcm9tTG9uZygwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGV2ZWwgPSBQeUludF9Gcm9tTG9uZygtMSk7CiAKLQkJaWYgKGxldmVsID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKGxldmVsID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKIAotCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIGxldmVsLCBjb25zdHMpOwotCQlQeV9ERUNSRUYobGV2ZWwpOwotCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7Ci0JCUFERE9QX05BTUUoYywgSU1QT1JUX05BTUUsIGFsaWFzLT5uYW1lLCBuYW1lcyk7CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgbGV2ZWwsIGNvbnN0cyk7CisgICAgICAgIFB5X0RFQ1JFRihsZXZlbCk7CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKKyAgICAgICAgQURET1BfTkFNRShjLCBJTVBPUlRfTkFNRSwgYWxpYXMtPm5hbWUsIG5hbWVzKTsKIAotCQlpZiAoYWxpYXMtPmFzbmFtZSkgewotCQkJciA9IGNvbXBpbGVyX2ltcG9ydF9hcyhjLCBhbGlhcy0+bmFtZSwgYWxpYXMtPmFzbmFtZSk7Ci0JCQlpZiAoIXIpCi0JCQkgICAgcmV0dXJuIHI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZGVudGlmaWVyIHRtcCA9IGFsaWFzLT5uYW1lOwotCQkJY29uc3QgY2hhciAqYmFzZSA9IFB5U3RyaW5nX0FTX1NUUklORyhhbGlhcy0+bmFtZSk7Ci0JCQljaGFyICpkb3QgPSBzdHJjaHIoYmFzZSwgJy4nKTsKLQkJCWlmIChkb3QpCi0JCQkJdG1wID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYmFzZSwgCi0JCQkJCQkJCSBkb3QgLSBiYXNlKTsKLQkJCXIgPSBjb21waWxlcl9uYW1lb3AoYywgdG1wLCBTdG9yZSk7Ci0JCQlpZiAoZG90KSB7Ci0JCQkJUHlfREVDUkVGKHRtcCk7Ci0JCQl9Ci0JCQlpZiAoIXIpCi0JCQkJcmV0dXJuIHI7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7CisgICAgICAgIGlmIChhbGlhcy0+YXNuYW1lKSB7CisgICAgICAgICAgICByID0gY29tcGlsZXJfaW1wb3J0X2FzKGMsIGFsaWFzLT5uYW1lLCBhbGlhcy0+YXNuYW1lKTsKKyAgICAgICAgICAgIGlmICghcikKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlkZW50aWZpZXIgdG1wID0gYWxpYXMtPm5hbWU7CisgICAgICAgICAgICBjb25zdCBjaGFyICpiYXNlID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFsaWFzLT5uYW1lKTsKKyAgICAgICAgICAgIGNoYXIgKmRvdCA9IHN0cmNocihiYXNlLCAnLicpOworICAgICAgICAgICAgaWYgKGRvdCkKKyAgICAgICAgICAgICAgICB0bXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdCAtIGJhc2UpOworICAgICAgICAgICAgciA9IGNvbXBpbGVyX25hbWVvcChjLCB0bXAsIFN0b3JlKTsKKyAgICAgICAgICAgIGlmIChkb3QpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcikKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfZnJvbV9pbXBvcnQoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0JaW50IGksIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5JbXBvcnRGcm9tLm5hbWVzKTsKKyAgICBpbnQgaSwgbiA9IGFzZGxfc2VxX0xFTihzLT52LkltcG9ydEZyb20ubmFtZXMpOwogCi0JUHlPYmplY3QgKm5hbWVzID0gUHlUdXBsZV9OZXcobik7Ci0JUHlPYmplY3QgKmxldmVsOwotCQotCWlmICghbmFtZXMpCi0JCXJldHVybiAwOworICAgIFB5T2JqZWN0ICpuYW1lcyA9IFB5VHVwbGVfTmV3KG4pOworICAgIFB5T2JqZWN0ICpsZXZlbDsKIAotCWlmIChzLT52LkltcG9ydEZyb20ubGV2ZWwgPT0gMCAmJiBjLT5jX2ZsYWdzICYmCi0JICAgICEoYy0+Y19mbGFncy0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUKSkKLQkJbGV2ZWwgPSBQeUludF9Gcm9tTG9uZygtMSk7Ci0JZWxzZQotCQlsZXZlbCA9IFB5SW50X0Zyb21Mb25nKHMtPnYuSW1wb3J0RnJvbS5sZXZlbCk7CisgICAgaWYgKCFuYW1lcykKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlpZiAoIWxldmVsKSB7Ci0JCVB5X0RFQ1JFRihuYW1lcyk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAocy0+di5JbXBvcnRGcm9tLmxldmVsID09IDAgJiYgYy0+Y19mbGFncyAmJgorICAgICAgICAhKGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVCkpCisgICAgICAgIGxldmVsID0gUHlJbnRfRnJvbUxvbmcoLTEpOworICAgIGVsc2UKKyAgICAgICAgbGV2ZWwgPSBQeUludF9Gcm9tTG9uZyhzLT52LkltcG9ydEZyb20ubGV2ZWwpOwogCi0JLyogYnVpbGQgdXAgdGhlIG5hbWVzICovCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnRGcm9tLm5hbWVzLCBpKTsKLQkJUHlfSU5DUkVGKGFsaWFzLT5uYW1lKTsKLQkJUHlUdXBsZV9TRVRfSVRFTShuYW1lcywgaSwgYWxpYXMtPm5hbWUpOwotCX0KKyAgICBpZiAoIWxldmVsKSB7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCWlmIChzLT5saW5lbm8gPiBjLT5jX2Z1dHVyZS0+ZmZfbGluZW5vKSB7Ci0JCWlmICghc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhzLT52LkltcG9ydEZyb20ubW9kdWxlKSwKLQkJCSAgICAiX19mdXR1cmVfXyIpKSB7Ci0JCQlQeV9ERUNSRUYobGV2ZWwpOwotCQkJUHlfREVDUkVGKG5hbWVzKTsKLQkJCXJldHVybiBjb21waWxlcl9lcnJvcihjLCAKLQkJCQkgICAgICAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydHMgbXVzdCBvY2N1ciAiCi0JCQkJICAgICAgImF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUiKTsKKyAgICAvKiBidWlsZCB1cCB0aGUgbmFtZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGFsaWFzX3R5IGFsaWFzID0gKGFsaWFzX3R5KWFzZGxfc2VxX0dFVChzLT52LkltcG9ydEZyb20ubmFtZXMsIGkpOworICAgICAgICBQeV9JTkNSRUYoYWxpYXMtPm5hbWUpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5hbWVzLCBpLCBhbGlhcy0+bmFtZSk7CisgICAgfQogCi0JCX0KLQl9CisgICAgaWYgKHMtPmxpbmVubyA+IGMtPmNfZnV0dXJlLT5mZl9saW5lbm8pIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKHMtPnYuSW1wb3J0RnJvbS5tb2R1bGUpLAorICAgICAgICAgICAgICAgICAgICAiX19mdXR1cmVfXyIpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobGV2ZWwpOworICAgICAgICAgICAgUHlfREVDUkVGKG5hbWVzKTsKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlcl9lcnJvcihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydHMgbXVzdCBvY2N1ciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIik7CiAKLQlBRERPUF9PKGMsIExPQURfQ09OU1QsIGxldmVsLCBjb25zdHMpOwotCVB5X0RFQ1JFRihsZXZlbCk7Ci0JQURET1BfTyhjLCBMT0FEX0NPTlNULCBuYW1lcywgY29uc3RzKTsKLQlQeV9ERUNSRUYobmFtZXMpOwotCUFERE9QX05BTUUoYywgSU1QT1JUX05BTUUsIHMtPnYuSW1wb3J0RnJvbS5tb2R1bGUsIG5hbWVzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWFsaWFzX3R5IGFsaWFzID0gKGFsaWFzX3R5KWFzZGxfc2VxX0dFVChzLT52LkltcG9ydEZyb20ubmFtZXMsIGkpOwotCQlpZGVudGlmaWVyIHN0b3JlX25hbWU7CisgICAgICAgIH0KKyAgICB9CiAKLQkJaWYgKGkgPT0gMCAmJiAqUHlTdHJpbmdfQVNfU1RSSU5HKGFsaWFzLT5uYW1lKSA9PSAnKicpIHsKLQkJCWFzc2VydChuID09IDEpOwotCQkJQURET1AoYywgSU1QT1JUX1NUQVIpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJICAgIAotCQlBRERPUF9OQU1FKGMsIElNUE9SVF9GUk9NLCBhbGlhcy0+bmFtZSwgbmFtZXMpOwotCQlzdG9yZV9uYW1lID0gYWxpYXMtPm5hbWU7Ci0JCWlmIChhbGlhcy0+YXNuYW1lKQotCQkJc3RvcmVfbmFtZSA9IGFsaWFzLT5hc25hbWU7CisgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBsZXZlbCwgY29uc3RzKTsKKyAgICBQeV9ERUNSRUYobGV2ZWwpOworICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgbmFtZXMsIGNvbnN0cyk7CisgICAgUHlfREVDUkVGKG5hbWVzKTsKKyAgICBBRERPUF9OQU1FKGMsIElNUE9SVF9OQU1FLCBzLT52LkltcG9ydEZyb20ubW9kdWxlLCBuYW1lcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBhbGlhc190eSBhbGlhcyA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQocy0+di5JbXBvcnRGcm9tLm5hbWVzLCBpKTsKKyAgICAgICAgaWRlbnRpZmllciBzdG9yZV9uYW1lOwogCi0JCWlmICghY29tcGlsZXJfbmFtZW9wKGMsIHN0b3JlX25hbWUsIFN0b3JlKSkgewotCQkJUHlfREVDUkVGKG5hbWVzKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCS8qIHJlbW92ZSBpbXBvcnRlZCBtb2R1bGUgKi8KLQlBRERPUChjLCBQT1BfVE9QKTsKLQlyZXR1cm4gMTsKKyAgICAgICAgaWYgKGkgPT0gMCAmJiAqUHlTdHJpbmdfQVNfU1RSSU5HKGFsaWFzLT5uYW1lKSA9PSAnKicpIHsKKyAgICAgICAgICAgIGFzc2VydChuID09IDEpOworICAgICAgICAgICAgQURET1AoYywgSU1QT1JUX1NUQVIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBBRERPUF9OQU1FKGMsIElNUE9SVF9GUk9NLCBhbGlhcy0+bmFtZSwgbmFtZXMpOworICAgICAgICBzdG9yZV9uYW1lID0gYWxpYXMtPm5hbWU7CisgICAgICAgIGlmIChhbGlhcy0+YXNuYW1lKQorICAgICAgICAgICAgc3RvcmVfbmFtZSA9IGFsaWFzLT5hc25hbWU7CisKKyAgICAgICAgaWYgKCFjb21waWxlcl9uYW1lb3AoYywgc3RvcmVfbmFtZSwgU3RvcmUpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobmFtZXMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogcmVtb3ZlIGltcG9ydGVkIG1vZHVsZSAqLworICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9hc3NlcnQoc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICphc3NlcnRpb25fZXJyb3IgPSBOVUxMOwotCWJhc2ljYmxvY2sgKmVuZDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKmFzc2VydGlvbl9lcnJvciA9IE5VTEw7CisgICAgYmFzaWNibG9jayAqZW5kOwogCi0JaWYgKFB5X09wdGltaXplRmxhZykKLQkJcmV0dXJuIDE7Ci0JaWYgKGFzc2VydGlvbl9lcnJvciA9PSBOVUxMKSB7Ci0JCWFzc2VydGlvbl9lcnJvciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIkFzc2VydGlvbkVycm9yIik7Ci0JCWlmIChhc3NlcnRpb25fZXJyb3IgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCX0KLQlpZiAocy0+di5Bc3NlcnQudGVzdC0+a2luZCA9PSBUdXBsZV9raW5kICYmCi0JICAgIGFzZGxfc2VxX0xFTihzLT52LkFzc2VydC50ZXN0LT52LlR1cGxlLmVsdHMpID4gMCkgewotCQljb25zdCBjaGFyKiBtc2cgPQotCQkJImFzc2VydGlvbiBpcyBhbHdheXMgdHJ1ZSwgcGVyaGFwcyByZW1vdmUgcGFyZW50aGVzZXM/IjsKLQkJaWYgKFB5RXJyX1dhcm5FeHBsaWNpdChQeUV4Y19TeW50YXhXYXJuaW5nLCBtc2csIGMtPmNfZmlsZW5hbWUsCi0JCQkJICAgICAgIGMtPnUtPnVfbGluZW5vLCBOVUxMLCBOVUxMKSA9PSAtMSkKLQkJCXJldHVybiAwOwotCX0KLQlWSVNJVChjLCBleHByLCBzLT52LkFzc2VydC50ZXN0KTsKLQllbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWYgKGVuZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlBRERPUF9KUkVMKGMsIEpVTVBfSUZfVFJVRSwgZW5kKTsKLQlBRERPUChjLCBQT1BfVE9QKTsKLQlBRERPUF9PKGMsIExPQURfR0xPQkFMLCBhc3NlcnRpb25fZXJyb3IsIG5hbWVzKTsKLQlpZiAocy0+di5Bc3NlcnQubXNnKSB7Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuQXNzZXJ0Lm1zZyk7Ci0JCUFERE9QX0koYywgUkFJU0VfVkFSQVJHUywgMik7Ci0JfQotCWVsc2UgewotCQlBRERPUF9JKGMsIFJBSVNFX1ZBUkFSR1MsIDEpOwotCX0KLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwotCUFERE9QKGMsIFBPUF9UT1ApOwotCXJldHVybiAxOworICAgIGlmIChQeV9PcHRpbWl6ZUZsYWcpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChhc3NlcnRpb25fZXJyb3IgPT0gTlVMTCkgeworICAgICAgICBhc3NlcnRpb25fZXJyb3IgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJBc3NlcnRpb25FcnJvciIpOworICAgICAgICBpZiAoYXNzZXJ0aW9uX2Vycm9yID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHMtPnYuQXNzZXJ0LnRlc3QtPmtpbmQgPT0gVHVwbGVfa2luZCAmJgorICAgICAgICBhc2RsX3NlcV9MRU4ocy0+di5Bc3NlcnQudGVzdC0+di5UdXBsZS5lbHRzKSA+IDApIHsKKyAgICAgICAgY29uc3QgY2hhciogbXNnID0KKyAgICAgICAgICAgICJhc3NlcnRpb24gaXMgYWx3YXlzIHRydWUsIHBlcmhhcHMgcmVtb3ZlIHBhcmVudGhlc2VzPyI7CisgICAgICAgIGlmIChQeUVycl9XYXJuRXhwbGljaXQoUHlFeGNfU3ludGF4V2FybmluZywgbXNnLCBjLT5jX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnUtPnVfbGluZW5vLCBOVUxMLCBOVUxMKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBWSVNJVChjLCBleHByLCBzLT52LkFzc2VydC50ZXN0KTsKKyAgICBlbmQgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGVuZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKyAgICBBRERPUF9KUkVMKGMsIEpVTVBfSUZfVFJVRSwgZW5kKTsKKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICBBRERPUF9PKGMsIExPQURfR0xPQkFMLCBhc3NlcnRpb25fZXJyb3IsIG5hbWVzKTsKKyAgICBpZiAocy0+di5Bc3NlcnQubXNnKSB7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuQXNzZXJ0Lm1zZyk7CisgICAgICAgIEFERE9QX0koYywgUkFJU0VfVkFSQVJHUywgMik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBBRERPUF9JKGMsIFJBSVNFX1ZBUkFSR1MsIDEpOworICAgIH0KKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOworICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl92aXNpdF9zdG10KHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCWludCBpLCBuOworICAgIGludCBpLCBuOwogCi0JLyogQWx3YXlzIGFzc2lnbiBhIGxpbmVubyB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiBmb3IgYSBzdG10LiAqLwotCWMtPnUtPnVfbGluZW5vID0gcy0+bGluZW5vOwotCWMtPnUtPnVfbGluZW5vX3NldCA9IGZhbHNlOworICAgIC8qIEFsd2F5cyBhc3NpZ24gYSBsaW5lbm8gdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gZm9yIGEgc3RtdC4gKi8KKyAgICBjLT51LT51X2xpbmVubyA9IHMtPmxpbmVubzsKKyAgICBjLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKIAotCXN3aXRjaCAocy0+a2luZCkgewotCWNhc2UgRnVuY3Rpb25EZWZfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2Z1bmN0aW9uKGMsIHMpOwotCWNhc2UgQ2xhc3NEZWZfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2NsYXNzKGMsIHMpOwotCWNhc2UgUmV0dXJuX2tpbmQ6Ci0JCWlmIChjLT51LT51X3N0ZS0+c3RlX3R5cGUgIT0gRnVuY3Rpb25CbG9jaykKLQkJCXJldHVybiBjb21waWxlcl9lcnJvcihjLCAiJ3JldHVybicgb3V0c2lkZSBmdW5jdGlvbiIpOwotCQlpZiAocy0+di5SZXR1cm4udmFsdWUpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuUmV0dXJuLnZhbHVlKTsKLQkJfQotCQllbHNlCi0JCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7Ci0JCUFERE9QKGMsIFJFVFVSTl9WQUxVRSk7Ci0JCWJyZWFrOwotCWNhc2UgRGVsZXRlX2tpbmQ6Ci0JCVZJU0lUX1NFUShjLCBleHByLCBzLT52LkRlbGV0ZS50YXJnZXRzKQotCQlicmVhazsKLQljYXNlIEFzc2lnbl9raW5kOgotCQluID0gYXNkbF9zZXFfTEVOKHMtPnYuQXNzaWduLnRhcmdldHMpOwotCQlWSVNJVChjLCBleHByLCBzLT52LkFzc2lnbi52YWx1ZSk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWlmIChpIDwgbiAtIDEpCi0JCQkJQURET1AoYywgRFVQX1RPUCk7Ci0JCQlWSVNJVChjLCBleHByLAotCQkJICAgICAgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHMtPnYuQXNzaWduLnRhcmdldHMsIGkpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEF1Z0Fzc2lnbl9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfYXVnYXNzaWduKGMsIHMpOwotCWNhc2UgUHJpbnRfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX3ByaW50KGMsIHMpOwotCWNhc2UgRm9yX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9mb3IoYywgcyk7Ci0JY2FzZSBXaGlsZV9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfd2hpbGUoYywgcyk7Ci0JY2FzZSBJZl9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfaWYoYywgcyk7Ci0JY2FzZSBSYWlzZV9raW5kOgotCQluID0gMDsKLQkJaWYgKHMtPnYuUmFpc2UudHlwZSkgewotCQkJVklTSVQoYywgZXhwciwgcy0+di5SYWlzZS50eXBlKTsKLQkJCW4rKzsKLQkJCWlmIChzLT52LlJhaXNlLmluc3QpIHsKLQkJCQlWSVNJVChjLCBleHByLCBzLT52LlJhaXNlLmluc3QpOwotCQkJCW4rKzsKLQkJCQlpZiAocy0+di5SYWlzZS50YmFjaykgewotCQkJCQlWSVNJVChjLCBleHByLCBzLT52LlJhaXNlLnRiYWNrKTsKLQkJCQkJbisrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlBRERPUF9JKGMsIFJBSVNFX1ZBUkFSR1MsIG4pOwotCQlicmVhazsKLQljYXNlIFRyeUV4Y2VwdF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfdHJ5X2V4Y2VwdChjLCBzKTsKLQljYXNlIFRyeUZpbmFsbHlfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX3RyeV9maW5hbGx5KGMsIHMpOwotCWNhc2UgQXNzZXJ0X2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9hc3NlcnQoYywgcyk7Ci0JY2FzZSBJbXBvcnRfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2ltcG9ydChjLCBzKTsKLQljYXNlIEltcG9ydEZyb21fa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2Zyb21faW1wb3J0KGMsIHMpOwotCWNhc2UgRXhlY19raW5kOgotCQlWSVNJVChjLCBleHByLCBzLT52LkV4ZWMuYm9keSk7Ci0JCWlmIChzLT52LkV4ZWMuZ2xvYmFscykgewotCQkJVklTSVQoYywgZXhwciwgcy0+di5FeGVjLmdsb2JhbHMpOwotCQkJaWYgKHMtPnYuRXhlYy5sb2NhbHMpIHsKLQkJCQlWSVNJVChjLCBleHByLCBzLT52LkV4ZWMubG9jYWxzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJQURET1AoYywgRFVQX1RPUCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7Ci0JCQlBRERPUChjLCBEVVBfVE9QKTsKLQkJfQotCQlBRERPUChjLCBFWEVDX1NUTVQpOwotCQlicmVhazsKLQljYXNlIEdsb2JhbF9raW5kOgotCQlicmVhazsKLQljYXNlIEV4cHJfa2luZDoKLQkJaWYgKGMtPmNfaW50ZXJhY3RpdmUgJiYgYy0+Y19uZXN0bGV2ZWwgPD0gMSkgewotCQkJVklTSVQoYywgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKLQkJCUFERE9QKGMsIFBSSU5UX0VYUFIpOwotCQl9Ci0JCWVsc2UgaWYgKHMtPnYuRXhwci52YWx1ZS0+a2luZCAhPSBTdHJfa2luZCAmJgotCQkJIHMtPnYuRXhwci52YWx1ZS0+a2luZCAhPSBOdW1fa2luZCkgewotCQkJVklTSVQoYywgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKLQkJCUFERE9QKGMsIFBPUF9UT1ApOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgUGFzc19raW5kOgotCQlicmVhazsKLQljYXNlIEJyZWFrX2tpbmQ6Ci0JCWlmICghY29tcGlsZXJfaW5fbG9vcChjKSkKLQkJCXJldHVybiBjb21waWxlcl9lcnJvcihjLCAiJ2JyZWFrJyBvdXRzaWRlIGxvb3AiKTsKLQkJQURET1AoYywgQlJFQUtfTE9PUCk7Ci0JCWJyZWFrOwotCWNhc2UgQ29udGludWVfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2NvbnRpbnVlKGMpOwotCWNhc2UgV2l0aF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfd2l0aChjLCBzKTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgc3dpdGNoIChzLT5raW5kKSB7CisgICAgY2FzZSBGdW5jdGlvbkRlZl9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfZnVuY3Rpb24oYywgcyk7CisgICAgY2FzZSBDbGFzc0RlZl9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfY2xhc3MoYywgcyk7CisgICAgY2FzZSBSZXR1cm5fa2luZDoKKyAgICAgICAgaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSAhPSBGdW5jdGlvbkJsb2NrKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICIncmV0dXJuJyBvdXRzaWRlIGZ1bmN0aW9uIik7CisgICAgICAgIGlmIChzLT52LlJldHVybi52YWx1ZSkgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5SZXR1cm4udmFsdWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKKyAgICAgICAgQURET1AoYywgUkVUVVJOX1ZBTFVFKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEZWxldGVfa2luZDoKKyAgICAgICAgVklTSVRfU0VRKGMsIGV4cHIsIHMtPnYuRGVsZXRlLnRhcmdldHMpCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXNzaWduX2tpbmQ6CisgICAgICAgIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5Bc3NpZ24udGFyZ2V0cyk7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuQXNzaWduLnZhbHVlKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPCBuIC0gMSkKKyAgICAgICAgICAgICAgICBBRERPUChjLCBEVVBfVE9QKTsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsCisgICAgICAgICAgICAgICAgICAoZXhwcl90eSlhc2RsX3NlcV9HRVQocy0+di5Bc3NpZ24udGFyZ2V0cywgaSkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXVnQXNzaWduX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9hdWdhc3NpZ24oYywgcyk7CisgICAgY2FzZSBQcmludF9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfcHJpbnQoYywgcyk7CisgICAgY2FzZSBGb3Jfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2ZvcihjLCBzKTsKKyAgICBjYXNlIFdoaWxlX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl93aGlsZShjLCBzKTsKKyAgICBjYXNlIElmX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9pZihjLCBzKTsKKyAgICBjYXNlIFJhaXNlX2tpbmQ6CisgICAgICAgIG4gPSAwOworICAgICAgICBpZiAocy0+di5SYWlzZS50eXBlKSB7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LlJhaXNlLnR5cGUpOworICAgICAgICAgICAgbisrOworICAgICAgICAgICAgaWYgKHMtPnYuUmFpc2UuaW5zdCkgeworICAgICAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuUmFpc2UuaW5zdCk7CisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgICAgIGlmIChzLT52LlJhaXNlLnRiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuUmFpc2UudGJhY2spOworICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFERE9QX0koYywgUkFJU0VfVkFSQVJHUywgbik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVHJ5RXhjZXB0X2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl90cnlfZXhjZXB0KGMsIHMpOworICAgIGNhc2UgVHJ5RmluYWxseV9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfdHJ5X2ZpbmFsbHkoYywgcyk7CisgICAgY2FzZSBBc3NlcnRfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Fzc2VydChjLCBzKTsKKyAgICBjYXNlIEltcG9ydF9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfaW1wb3J0KGMsIHMpOworICAgIGNhc2UgSW1wb3J0RnJvbV9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfZnJvbV9pbXBvcnQoYywgcyk7CisgICAgY2FzZSBFeGVjX2tpbmQ6CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuRXhlYy5ib2R5KTsKKyAgICAgICAgaWYgKHMtPnYuRXhlYy5nbG9iYWxzKSB7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkV4ZWMuZ2xvYmFscyk7CisgICAgICAgICAgICBpZiAocy0+di5FeGVjLmxvY2FscykgeworICAgICAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuRXhlYy5sb2NhbHMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBRERPUChjLCBEVVBfVE9QKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKKyAgICAgICAgICAgIEFERE9QKGMsIERVUF9UT1ApOworICAgICAgICB9CisgICAgICAgIEFERE9QKGMsIEVYRUNfU1RNVCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR2xvYmFsX2tpbmQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRXhwcl9raW5kOgorICAgICAgICBpZiAoYy0+Y19pbnRlcmFjdGl2ZSAmJiBjLT5jX25lc3RsZXZlbCA8PSAxKSB7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkV4cHIudmFsdWUpOworICAgICAgICAgICAgQURET1AoYywgUFJJTlRfRVhQUik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocy0+di5FeHByLnZhbHVlLT5raW5kICE9IFN0cl9raW5kICYmCisgICAgICAgICAgICAgICAgIHMtPnYuRXhwci52YWx1ZS0+a2luZCAhPSBOdW1fa2luZCkgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKKyAgICAgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGFzc19raW5kOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIEJyZWFrX2tpbmQ6CisgICAgICAgIGlmICghY29tcGlsZXJfaW5fbG9vcChjKSkKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlcl9lcnJvcihjLCAiJ2JyZWFrJyBvdXRzaWRlIGxvb3AiKTsKKyAgICAgICAgQURET1AoYywgQlJFQUtfTE9PUCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29udGludWVfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2NvbnRpbnVlKGMpOworICAgIGNhc2UgV2l0aF9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfd2l0aChjLCBzKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIHVuYXJ5b3AodW5hcnlvcF90eSBvcCkKIHsKLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBJbnZlcnQ6Ci0JCXJldHVybiBVTkFSWV9JTlZFUlQ7Ci0JY2FzZSBOb3Q6Ci0JCXJldHVybiBVTkFSWV9OT1Q7Ci0JY2FzZSBVQWRkOgotCQlyZXR1cm4gVU5BUllfUE9TSVRJVkU7Ci0JY2FzZSBVU3ViOgotCQlyZXR1cm4gVU5BUllfTkVHQVRJVkU7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJInVuYXJ5IG9wICVkIHNob3VsZCBub3QgYmUgcG9zc2libGUiLCBvcCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBJbnZlcnQ6CisgICAgICAgIHJldHVybiBVTkFSWV9JTlZFUlQ7CisgICAgY2FzZSBOb3Q6CisgICAgICAgIHJldHVybiBVTkFSWV9OT1Q7CisgICAgY2FzZSBVQWRkOgorICAgICAgICByZXR1cm4gVU5BUllfUE9TSVRJVkU7CisgICAgY2FzZSBVU3ViOgorICAgICAgICByZXR1cm4gVU5BUllfTkVHQVRJVkU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgInVuYXJ5IG9wICVkIHNob3VsZCBub3QgYmUgcG9zc2libGUiLCBvcCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogc3RhdGljIGludAogYmlub3Aoc3RydWN0IGNvbXBpbGVyICpjLCBvcGVyYXRvcl90eSBvcCkKIHsKLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBBZGQ6Ci0JCXJldHVybiBCSU5BUllfQUREOwotCWNhc2UgU3ViOgotCQlyZXR1cm4gQklOQVJZX1NVQlRSQUNUOwotCWNhc2UgTXVsdDoKLQkJcmV0dXJuIEJJTkFSWV9NVUxUSVBMWTsKLQljYXNlIERpdjoKLQkJaWYgKGMtPmNfZmxhZ3MgJiYgYy0+Y19mbGFncy0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfRElWSVNJT04pCi0JCQlyZXR1cm4gQklOQVJZX1RSVUVfRElWSURFOwotCQllbHNlCi0JCQlyZXR1cm4gQklOQVJZX0RJVklERTsKLQljYXNlIE1vZDoKLQkJcmV0dXJuIEJJTkFSWV9NT0RVTE87Ci0JY2FzZSBQb3c6Ci0JCXJldHVybiBCSU5BUllfUE9XRVI7Ci0JY2FzZSBMU2hpZnQ6Ci0JCXJldHVybiBCSU5BUllfTFNISUZUOwotCWNhc2UgUlNoaWZ0OgotCQlyZXR1cm4gQklOQVJZX1JTSElGVDsKLQljYXNlIEJpdE9yOgotCQlyZXR1cm4gQklOQVJZX09SOwotCWNhc2UgQml0WG9yOgotCQlyZXR1cm4gQklOQVJZX1hPUjsKLQljYXNlIEJpdEFuZDoKLQkJcmV0dXJuIEJJTkFSWV9BTkQ7Ci0JY2FzZSBGbG9vckRpdjoKLQkJcmV0dXJuIEJJTkFSWV9GTE9PUl9ESVZJREU7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJImJpbmFyeSBvcCAlZCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIiwgb3ApOwotCQlyZXR1cm4gMDsKLQl9CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgQWRkOgorICAgICAgICByZXR1cm4gQklOQVJZX0FERDsKKyAgICBjYXNlIFN1YjoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9TVUJUUkFDVDsKKyAgICBjYXNlIE11bHQ6CisgICAgICAgIHJldHVybiBCSU5BUllfTVVMVElQTFk7CisgICAgY2FzZSBEaXY6CisgICAgICAgIGlmIChjLT5jX2ZsYWdzICYmIGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgQ09fRlVUVVJFX0RJVklTSU9OKQorICAgICAgICAgICAgcmV0dXJuIEJJTkFSWV9UUlVFX0RJVklERTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEJJTkFSWV9ESVZJREU7CisgICAgY2FzZSBNb2Q6CisgICAgICAgIHJldHVybiBCSU5BUllfTU9EVUxPOworICAgIGNhc2UgUG93OgorICAgICAgICByZXR1cm4gQklOQVJZX1BPV0VSOworICAgIGNhc2UgTFNoaWZ0OgorICAgICAgICByZXR1cm4gQklOQVJZX0xTSElGVDsKKyAgICBjYXNlIFJTaGlmdDoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9SU0hJRlQ7CisgICAgY2FzZSBCaXRPcjoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9PUjsKKyAgICBjYXNlIEJpdFhvcjoKKyAgICAgICAgcmV0dXJuIEJJTkFSWV9YT1I7CisgICAgY2FzZSBCaXRBbmQ6CisgICAgICAgIHJldHVybiBCSU5BUllfQU5EOworICAgIGNhc2UgRmxvb3JEaXY6CisgICAgICAgIHJldHVybiBCSU5BUllfRkxPT1JfRElWSURFOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJiaW5hcnkgb3AgJWQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsIG9wKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiBzdGF0aWMgaW50CiBjbXBvcChjbXBvcF90eSBvcCkKIHsKLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBFcToKLQkJcmV0dXJuIFB5Q21wX0VROwotCWNhc2UgTm90RXE6Ci0JCXJldHVybiBQeUNtcF9ORTsKLQljYXNlIEx0OgotCQlyZXR1cm4gUHlDbXBfTFQ7Ci0JY2FzZSBMdEU6Ci0JCXJldHVybiBQeUNtcF9MRTsKLQljYXNlIEd0OgotCQlyZXR1cm4gUHlDbXBfR1Q7Ci0JY2FzZSBHdEU6Ci0JCXJldHVybiBQeUNtcF9HRTsKLQljYXNlIElzOgotCQlyZXR1cm4gUHlDbXBfSVM7Ci0JY2FzZSBJc05vdDoKLQkJcmV0dXJuIFB5Q21wX0lTX05PVDsKLQljYXNlIEluOgotCQlyZXR1cm4gUHlDbXBfSU47Ci0JY2FzZSBOb3RJbjoKLQkJcmV0dXJuIFB5Q21wX05PVF9JTjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gUHlDbXBfQkFEOwotCX0KKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBFcToKKyAgICAgICAgcmV0dXJuIFB5Q21wX0VROworICAgIGNhc2UgTm90RXE6CisgICAgICAgIHJldHVybiBQeUNtcF9ORTsKKyAgICBjYXNlIEx0OgorICAgICAgICByZXR1cm4gUHlDbXBfTFQ7CisgICAgY2FzZSBMdEU6CisgICAgICAgIHJldHVybiBQeUNtcF9MRTsKKyAgICBjYXNlIEd0OgorICAgICAgICByZXR1cm4gUHlDbXBfR1Q7CisgICAgY2FzZSBHdEU6CisgICAgICAgIHJldHVybiBQeUNtcF9HRTsKKyAgICBjYXNlIElzOgorICAgICAgICByZXR1cm4gUHlDbXBfSVM7CisgICAgY2FzZSBJc05vdDoKKyAgICAgICAgcmV0dXJuIFB5Q21wX0lTX05PVDsKKyAgICBjYXNlIEluOgorICAgICAgICByZXR1cm4gUHlDbXBfSU47CisgICAgY2FzZSBOb3RJbjoKKyAgICAgICAgcmV0dXJuIFB5Q21wX05PVF9JTjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUHlDbXBfQkFEOworICAgIH0KIH0KIAogc3RhdGljIGludAogaW5wbGFjZV9iaW5vcChzdHJ1Y3QgY29tcGlsZXIgKmMsIG9wZXJhdG9yX3R5IG9wKQogewotCXN3aXRjaCAob3ApIHsKLQljYXNlIEFkZDoKLQkJcmV0dXJuIElOUExBQ0VfQUREOwotCWNhc2UgU3ViOgotCQlyZXR1cm4gSU5QTEFDRV9TVUJUUkFDVDsKLQljYXNlIE11bHQ6Ci0JCXJldHVybiBJTlBMQUNFX01VTFRJUExZOwotCWNhc2UgRGl2OgotCQlpZiAoYy0+Y19mbGFncyAmJiBjLT5jX2ZsYWdzLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9ESVZJU0lPTikKLQkJCXJldHVybiBJTlBMQUNFX1RSVUVfRElWSURFOwotCQllbHNlCi0JCQlyZXR1cm4gSU5QTEFDRV9ESVZJREU7Ci0JY2FzZSBNb2Q6Ci0JCXJldHVybiBJTlBMQUNFX01PRFVMTzsKLQljYXNlIFBvdzoKLQkJcmV0dXJuIElOUExBQ0VfUE9XRVI7Ci0JY2FzZSBMU2hpZnQ6Ci0JCXJldHVybiBJTlBMQUNFX0xTSElGVDsKLQljYXNlIFJTaGlmdDoKLQkJcmV0dXJuIElOUExBQ0VfUlNISUZUOwotCWNhc2UgQml0T3I6Ci0JCXJldHVybiBJTlBMQUNFX09SOwotCWNhc2UgQml0WG9yOgotCQlyZXR1cm4gSU5QTEFDRV9YT1I7Ci0JY2FzZSBCaXRBbmQ6Ci0JCXJldHVybiBJTlBMQUNFX0FORDsKLQljYXNlIEZsb29yRGl2OgotCQlyZXR1cm4gSU5QTEFDRV9GTE9PUl9ESVZJREU7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkJImlucGxhY2UgYmluYXJ5IG9wICVkIHNob3VsZCBub3QgYmUgcG9zc2libGUiLCBvcCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBzd2l0Y2ggKG9wKSB7CisgICAgY2FzZSBBZGQ6CisgICAgICAgIHJldHVybiBJTlBMQUNFX0FERDsKKyAgICBjYXNlIFN1YjoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfU1VCVFJBQ1Q7CisgICAgY2FzZSBNdWx0OgorICAgICAgICByZXR1cm4gSU5QTEFDRV9NVUxUSVBMWTsKKyAgICBjYXNlIERpdjoKKyAgICAgICAgaWYgKGMtPmNfZmxhZ3MgJiYgYy0+Y19mbGFncy0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfRElWSVNJT04pCisgICAgICAgICAgICByZXR1cm4gSU5QTEFDRV9UUlVFX0RJVklERTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIElOUExBQ0VfRElWSURFOworICAgIGNhc2UgTW9kOgorICAgICAgICByZXR1cm4gSU5QTEFDRV9NT0RVTE87CisgICAgY2FzZSBQb3c6CisgICAgICAgIHJldHVybiBJTlBMQUNFX1BPV0VSOworICAgIGNhc2UgTFNoaWZ0OgorICAgICAgICByZXR1cm4gSU5QTEFDRV9MU0hJRlQ7CisgICAgY2FzZSBSU2hpZnQ6CisgICAgICAgIHJldHVybiBJTlBMQUNFX1JTSElGVDsKKyAgICBjYXNlIEJpdE9yOgorICAgICAgICByZXR1cm4gSU5QTEFDRV9PUjsKKyAgICBjYXNlIEJpdFhvcjoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfWE9SOworICAgIGNhc2UgQml0QW5kOgorICAgICAgICByZXR1cm4gSU5QTEFDRV9BTkQ7CisgICAgY2FzZSBGbG9vckRpdjoKKyAgICAgICAgcmV0dXJuIElOUExBQ0VfRkxPT1JfRElWSURFOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICJpbnBsYWNlIGJpbmFyeSBvcCAlZCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIiwgb3ApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX25hbWVvcChzdHJ1Y3QgY29tcGlsZXIgKmMsIGlkZW50aWZpZXIgbmFtZSwgZXhwcl9jb250ZXh0X3R5IGN0eCkKIHsKLQlpbnQgb3AsIHNjb3BlLCBhcmc7Ci0JZW51bSB7IE9QX0ZBU1QsIE9QX0dMT0JBTCwgT1BfREVSRUYsIE9QX05BTUUgfSBvcHR5cGU7CisgICAgaW50IG9wLCBzY29wZSwgYXJnOworICAgIGVudW0geyBPUF9GQVNULCBPUF9HTE9CQUwsIE9QX0RFUkVGLCBPUF9OQU1FIH0gb3B0eXBlOwogCi0JUHlPYmplY3QgKmRpY3QgPSBjLT51LT51X25hbWVzOwotCVB5T2JqZWN0ICptYW5nbGVkOwotCS8qIFhYWCBBdWdTdG9yZSBpc24ndCB1c2VkIGFueXdoZXJlISAqLworICAgIFB5T2JqZWN0ICpkaWN0ID0gYy0+dS0+dV9uYW1lczsKKyAgICBQeU9iamVjdCAqbWFuZ2xlZDsKKyAgICAvKiBYWFggQXVnU3RvcmUgaXNuJ3QgdXNlZCBhbnl3aGVyZSEgKi8KIAotCS8qIEZpcnN0IGNoZWNrIGZvciBhc3NpZ25tZW50IHRvIF9fZGVidWdfXy4gUGFyYW0/ICovCi0JaWYgKChjdHggPT0gU3RvcmUgfHwgY3R4ID09IEF1Z1N0b3JlIHx8IGN0eCA9PSBEZWwpCi0JICAgICYmICFzdHJjbXAoUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpLCAiX19kZWJ1Z19fIikpIHsKLQkJcmV0dXJuIGNvbXBpbGVyX2Vycm9yKGMsICJjYW4gbm90IGFzc2lnbiB0byBfX2RlYnVnX18iKTsKLQl9CisgICAgLyogRmlyc3QgY2hlY2sgZm9yIGFzc2lnbm1lbnQgdG8gX19kZWJ1Z19fLiBQYXJhbT8gKi8KKyAgICBpZiAoKGN0eCA9PSBTdG9yZSB8fCBjdHggPT0gQXVnU3RvcmUgfHwgY3R4ID09IERlbCkKKyAgICAgICAgJiYgIXN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcobmFtZSksICJfX2RlYnVnX18iKSkgeworICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgImNhbiBub3QgYXNzaWduIHRvIF9fZGVidWdfXyIpOworICAgIH0KIAotCW1hbmdsZWQgPSBfUHlfTWFuZ2xlKGMtPnUtPnVfcHJpdmF0ZSwgbmFtZSk7Ci0JaWYgKCFtYW5nbGVkKQotCQlyZXR1cm4gMDsKKyAgICBtYW5nbGVkID0gX1B5X01hbmdsZShjLT51LT51X3ByaXZhdGUsIG5hbWUpOworICAgIGlmICghbWFuZ2xlZCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlvcCA9IDA7Ci0Jb3B0eXBlID0gT1BfTkFNRTsKLQlzY29wZSA9IFB5U1RfR2V0U2NvcGUoYy0+dS0+dV9zdGUsIG1hbmdsZWQpOwotCXN3aXRjaCAoc2NvcGUpIHsKLQljYXNlIEZSRUU6Ci0JCWRpY3QgPSBjLT51LT51X2ZyZWV2YXJzOwotCQlvcHR5cGUgPSBPUF9ERVJFRjsKLQkJYnJlYWs7Ci0JY2FzZSBDRUxMOgotCQlkaWN0ID0gYy0+dS0+dV9jZWxsdmFyczsKLQkJb3B0eXBlID0gT1BfREVSRUY7Ci0JCWJyZWFrOwotCWNhc2UgTE9DQUw6Ci0JCWlmIChjLT51LT51X3N0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jaykKLQkJCW9wdHlwZSA9IE9QX0ZBU1Q7Ci0JCWJyZWFrOwotCWNhc2UgR0xPQkFMX0lNUExJQ0lUOgotCQlpZiAoYy0+dS0+dV9zdGUtPnN0ZV90eXBlID09IEZ1bmN0aW9uQmxvY2sgJiYKLQkJCSFjLT51LT51X3N0ZS0+c3RlX3Vub3B0aW1pemVkKQotCQkJb3B0eXBlID0gT1BfR0xPQkFMOwotCQlicmVhazsKLQljYXNlIEdMT0JBTF9FWFBMSUNJVDoKLQkJb3B0eXBlID0gT1BfR0xPQkFMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBzY29wZSBjYW4gYmUgMCAqLwotCQlicmVhazsKLQl9CisgICAgb3AgPSAwOworICAgIG9wdHlwZSA9IE9QX05BTUU7CisgICAgc2NvcGUgPSBQeVNUX0dldFNjb3BlKGMtPnUtPnVfc3RlLCBtYW5nbGVkKTsKKyAgICBzd2l0Y2ggKHNjb3BlKSB7CisgICAgY2FzZSBGUkVFOgorICAgICAgICBkaWN0ID0gYy0+dS0+dV9mcmVldmFyczsKKyAgICAgICAgb3B0eXBlID0gT1BfREVSRUY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0VMTDoKKyAgICAgICAgZGljdCA9IGMtPnUtPnVfY2VsbHZhcnM7CisgICAgICAgIG9wdHlwZSA9IE9QX0RFUkVGOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExPQ0FMOgorICAgICAgICBpZiAoYy0+dS0+dV9zdGUtPnN0ZV90eXBlID09IEZ1bmN0aW9uQmxvY2spCisgICAgICAgICAgICBvcHR5cGUgPSBPUF9GQVNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdMT0JBTF9JTVBMSUNJVDoKKyAgICAgICAgaWYgKGMtPnUtPnVfc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrICYmCisgICAgICAgICAgICAhYy0+dS0+dV9zdGUtPnN0ZV91bm9wdGltaXplZCkKKyAgICAgICAgICAgIG9wdHlwZSA9IE9QX0dMT0JBTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHTE9CQUxfRVhQTElDSVQ6CisgICAgICAgIG9wdHlwZSA9IE9QX0dMT0JBTDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLyogc2NvcGUgY2FuIGJlIDAgKi8KKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JLyogWFhYIExlYXZlIGFzc2VydCBoZXJlLCBidXQgaGFuZGxlIF9fZG9jX18gYW5kIHRoZSBsaWtlIGJldHRlciAqLwotCWFzc2VydChzY29wZSB8fCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSlbMF0gPT0gJ18nKTsKKyAgICAvKiBYWFggTGVhdmUgYXNzZXJ0IGhlcmUsIGJ1dCBoYW5kbGUgX19kb2NfXyBhbmQgdGhlIGxpa2UgYmV0dGVyICovCisgICAgYXNzZXJ0KHNjb3BlIHx8IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKVswXSA9PSAnXycpOwogCi0Jc3dpdGNoIChvcHR5cGUpIHsKLQljYXNlIE9QX0RFUkVGOgotCQlzd2l0Y2ggKGN0eCkgewotCQljYXNlIExvYWQ6IG9wID0gTE9BRF9ERVJFRjsgYnJlYWs7Ci0JCWNhc2UgU3RvcmU6IG9wID0gU1RPUkVfREVSRUY7IGJyZWFrOwotCQljYXNlIEF1Z0xvYWQ6Ci0JCWNhc2UgQXVnU3RvcmU6Ci0JCQlicmVhazsKLQkJY2FzZSBEZWw6Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsCi0JCQkJICAgICAiY2FuIG5vdCBkZWxldGUgdmFyaWFibGUgJyVzJyByZWZlcmVuY2VkICIKLQkJCQkgICAgICJpbiBuZXN0ZWQgc2NvcGUiLAotCQkJCSAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKLQkJCVB5X0RFQ1JFRihtYW5nbGVkKTsKLQkJCXJldHVybiAwOwotCQljYXNlIFBhcmFtOgotCQlkZWZhdWx0OgotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCQkicGFyYW0gaW52YWxpZCBmb3IgZGVyZWYgdmFyaWFibGUiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgT1BfRkFTVDoKLQkJc3dpdGNoIChjdHgpIHsKLQkJY2FzZSBMb2FkOiBvcCA9IExPQURfRkFTVDsgYnJlYWs7Ci0JCWNhc2UgU3RvcmU6IG9wID0gU1RPUkVfRkFTVDsgYnJlYWs7Ci0JCWNhc2UgRGVsOiBvcCA9IERFTEVURV9GQVNUOyBicmVhazsKLQkJY2FzZSBBdWdMb2FkOgotCQljYXNlIEF1Z1N0b3JlOgotCQkJYnJlYWs7Ci0JCWNhc2UgUGFyYW06Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJwYXJhbSBpbnZhbGlkIGZvciBsb2NhbCB2YXJpYWJsZSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJQURET1BfTyhjLCBvcCwgbWFuZ2xlZCwgdmFybmFtZXMpOwotCQlQeV9ERUNSRUYobWFuZ2xlZCk7Ci0JCXJldHVybiAxOwotCWNhc2UgT1BfR0xPQkFMOgotCQlzd2l0Y2ggKGN0eCkgewotCQljYXNlIExvYWQ6IG9wID0gTE9BRF9HTE9CQUw7IGJyZWFrOwotCQljYXNlIFN0b3JlOiBvcCA9IFNUT1JFX0dMT0JBTDsgYnJlYWs7Ci0JCWNhc2UgRGVsOiBvcCA9IERFTEVURV9HTE9CQUw7IGJyZWFrOwotCQljYXNlIEF1Z0xvYWQ6Ci0JCWNhc2UgQXVnU3RvcmU6Ci0JCQlicmVhazsKLQkJY2FzZSBQYXJhbToKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJInBhcmFtIGludmFsaWQgZm9yIGdsb2JhbCB2YXJpYWJsZSIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBPUF9OQU1FOgotCQlzd2l0Y2ggKGN0eCkgewotCQljYXNlIExvYWQ6IG9wID0gTE9BRF9OQU1FOyBicmVhazsKLQkJY2FzZSBTdG9yZTogb3AgPSBTVE9SRV9OQU1FOyBicmVhazsKLQkJY2FzZSBEZWw6IG9wID0gREVMRVRFX05BTUU7IGJyZWFrOwotCQljYXNlIEF1Z0xvYWQ6Ci0JCWNhc2UgQXVnU3RvcmU6Ci0JCQlicmVhazsKLQkJY2FzZSBQYXJhbToKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJInBhcmFtIGludmFsaWQgZm9yIG5hbWUgdmFyaWFibGUiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICBzd2l0Y2ggKG9wdHlwZSkgeworICAgIGNhc2UgT1BfREVSRUY6CisgICAgICAgIHN3aXRjaCAoY3R4KSB7CisgICAgICAgIGNhc2UgTG9hZDogb3AgPSBMT0FEX0RFUkVGOyBicmVhazsKKyAgICAgICAgY2FzZSBTdG9yZTogb3AgPSBTVE9SRV9ERVJFRjsgYnJlYWs7CisgICAgICAgIGNhc2UgQXVnTG9hZDoKKyAgICAgICAgY2FzZSBBdWdTdG9yZToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERlbDoKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuIG5vdCBkZWxldGUgdmFyaWFibGUgJyVzJyByZWZlcmVuY2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gbmVzdGVkIHNjb3BlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgICAgICAgICAgUHlfREVDUkVGKG1hbmdsZWQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgUGFyYW06CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIGludmFsaWQgZm9yIGRlcmVmIHZhcmlhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QX0ZBU1Q6CisgICAgICAgIHN3aXRjaCAoY3R4KSB7CisgICAgICAgIGNhc2UgTG9hZDogb3AgPSBMT0FEX0ZBU1Q7IGJyZWFrOworICAgICAgICBjYXNlIFN0b3JlOiBvcCA9IFNUT1JFX0ZBU1Q7IGJyZWFrOworICAgICAgICBjYXNlIERlbDogb3AgPSBERUxFVEVfRkFTVDsgYnJlYWs7CisgICAgICAgIGNhc2UgQXVnTG9hZDoKKyAgICAgICAgY2FzZSBBdWdTdG9yZToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBhcmFtOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbSBpbnZhbGlkIGZvciBsb2NhbCB2YXJpYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgQURET1BfTyhjLCBvcCwgbWFuZ2xlZCwgdmFybmFtZXMpOworICAgICAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgT1BfR0xPQkFMOgorICAgICAgICBzd2l0Y2ggKGN0eCkgeworICAgICAgICBjYXNlIExvYWQ6IG9wID0gTE9BRF9HTE9CQUw7IGJyZWFrOworICAgICAgICBjYXNlIFN0b3JlOiBvcCA9IFNUT1JFX0dMT0JBTDsgYnJlYWs7CisgICAgICAgIGNhc2UgRGVsOiBvcCA9IERFTEVURV9HTE9CQUw7IGJyZWFrOworICAgICAgICBjYXNlIEF1Z0xvYWQ6CisgICAgICAgIGNhc2UgQXVnU3RvcmU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQYXJhbToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gaW52YWxpZCBmb3IgZ2xvYmFsIHZhcmlhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QX05BTUU6CisgICAgICAgIHN3aXRjaCAoY3R4KSB7CisgICAgICAgIGNhc2UgTG9hZDogb3AgPSBMT0FEX05BTUU7IGJyZWFrOworICAgICAgICBjYXNlIFN0b3JlOiBvcCA9IFNUT1JFX05BTUU7IGJyZWFrOworICAgICAgICBjYXNlIERlbDogb3AgPSBERUxFVEVfTkFNRTsgYnJlYWs7CisgICAgICAgIGNhc2UgQXVnTG9hZDoKKyAgICAgICAgY2FzZSBBdWdTdG9yZToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBhcmFtOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbSBpbnZhbGlkIGZvciBuYW1lIHZhcmlhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CiAKLQlhc3NlcnQob3ApOwotCWFyZyA9IGNvbXBpbGVyX2FkZF9vKGMsIGRpY3QsIG1hbmdsZWQpOwotCVB5X0RFQ1JFRihtYW5nbGVkKTsKLQlpZiAoYXJnIDwgMCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGNvbXBpbGVyX2FkZG9wX2koYywgb3AsIGFyZyk7CisgICAgYXNzZXJ0KG9wKTsKKyAgICBhcmcgPSBjb21waWxlcl9hZGRfbyhjLCBkaWN0LCBtYW5nbGVkKTsKKyAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgaWYgKGFyZyA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBjb21waWxlcl9hZGRvcF9pKGMsIG9wLCBhcmcpOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9ib29sb3Aoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JYmFzaWNibG9jayAqZW5kOwotCWludCBqdW1waSwgaSwgbjsKLQlhc2RsX3NlcSAqczsKKyAgICBiYXNpY2Jsb2NrICplbmQ7CisgICAgaW50IGp1bXBpLCBpLCBuOworICAgIGFzZGxfc2VxICpzOwogCi0JYXNzZXJ0KGUtPmtpbmQgPT0gQm9vbE9wX2tpbmQpOwotCWlmIChlLT52LkJvb2xPcC5vcCA9PSBBbmQpCi0JCWp1bXBpID0gSlVNUF9JRl9GQUxTRTsKLQllbHNlCi0JCWp1bXBpID0gSlVNUF9JRl9UUlVFOwotCWVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlpZiAoZW5kID09IE5VTEwpCi0JCXJldHVybiAwOwotCXMgPSBlLT52LkJvb2xPcC52YWx1ZXM7Ci0JbiA9IGFzZGxfc2VxX0xFTihzKSAtIDE7Ci0JYXNzZXJ0KG4gPj0gMCk7Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotCQlWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQocywgaSkpOwotCQlBRERPUF9KUkVMKGMsIGp1bXBpLCBlbmQpOwotCQlBRERPUChjLCBQT1BfVE9QKQotCX0KLQlWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQocywgbikpOwotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7Ci0JcmV0dXJuIDE7CisgICAgYXNzZXJ0KGUtPmtpbmQgPT0gQm9vbE9wX2tpbmQpOworICAgIGlmIChlLT52LkJvb2xPcC5vcCA9PSBBbmQpCisgICAgICAgIGp1bXBpID0gSlVNUF9JRl9GQUxTRTsKKyAgICBlbHNlCisgICAgICAgIGp1bXBpID0gSlVNUF9JRl9UUlVFOworICAgIGVuZCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBpZiAoZW5kID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHMgPSBlLT52LkJvb2xPcC52YWx1ZXM7CisgICAgbiA9IGFzZGxfc2VxX0xFTihzKSAtIDE7CisgICAgYXNzZXJ0KG4gPj0gMCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQocywgaSkpOworICAgICAgICBBRERPUF9KUkVMKGMsIGp1bXBpLCBlbmQpOworICAgICAgICBBRERPUChjLCBQT1BfVE9QKQorICAgIH0KKyAgICBWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQocywgbikpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2xpc3Qoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JaW50IG4gPSBhc2RsX3NlcV9MRU4oZS0+di5MaXN0LmVsdHMpOwotCWlmIChlLT52Lkxpc3QuY3R4ID09IFN0b3JlKSB7Ci0JCUFERE9QX0koYywgVU5QQUNLX1NFUVVFTkNFLCBuKTsKLQl9Ci0JVklTSVRfU0VRKGMsIGV4cHIsIGUtPnYuTGlzdC5lbHRzKTsKLQlpZiAoZS0+di5MaXN0LmN0eCA9PSBMb2FkKSB7Ci0JCUFERE9QX0koYywgQlVJTERfTElTVCwgbik7Ci0JfQotCXJldHVybiAxOworICAgIGludCBuID0gYXNkbF9zZXFfTEVOKGUtPnYuTGlzdC5lbHRzKTsKKyAgICBpZiAoZS0+di5MaXN0LmN0eCA9PSBTdG9yZSkgeworICAgICAgICBBRERPUF9JKGMsIFVOUEFDS19TRVFVRU5DRSwgbik7CisgICAgfQorICAgIFZJU0lUX1NFUShjLCBleHByLCBlLT52Lkxpc3QuZWx0cyk7CisgICAgaWYgKGUtPnYuTGlzdC5jdHggPT0gTG9hZCkgeworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX0xJU1QsIG4pOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfdHVwbGUoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JaW50IG4gPSBhc2RsX3NlcV9MRU4oZS0+di5UdXBsZS5lbHRzKTsKLQlpZiAoZS0+di5UdXBsZS5jdHggPT0gU3RvcmUpIHsKLQkJQURET1BfSShjLCBVTlBBQ0tfU0VRVUVOQ0UsIG4pOwotCX0KLQlWSVNJVF9TRVEoYywgZXhwciwgZS0+di5UdXBsZS5lbHRzKTsKLQlpZiAoZS0+di5UdXBsZS5jdHggPT0gTG9hZCkgewotCQlBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBuKTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgaW50IG4gPSBhc2RsX3NlcV9MRU4oZS0+di5UdXBsZS5lbHRzKTsKKyAgICBpZiAoZS0+di5UdXBsZS5jdHggPT0gU3RvcmUpIHsKKyAgICAgICAgQURET1BfSShjLCBVTlBBQ0tfU0VRVUVOQ0UsIG4pOworICAgIH0KKyAgICBWSVNJVF9TRVEoYywgZXhwciwgZS0+di5UdXBsZS5lbHRzKTsKKyAgICBpZiAoZS0+di5UdXBsZS5jdHggPT0gTG9hZCkgeworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBuKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2NvbXBhcmUoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JaW50IGksIG47Ci0JYmFzaWNibG9jayAqY2xlYW51cCA9IE5VTEw7CisgICAgaW50IGksIG47CisgICAgYmFzaWNibG9jayAqY2xlYW51cCA9IE5VTEw7CiAKLQkvKiBYWFggdGhlIGxvZ2ljIGNhbiBiZSBjbGVhbmVkIHVwIGZvciAxIG9yIG11bHRpcGxlIGNvbXBhcmlzb25zICovCi0JVklTSVQoYywgZXhwciwgZS0+di5Db21wYXJlLmxlZnQpOwotCW4gPSBhc2RsX3NlcV9MRU4oZS0+di5Db21wYXJlLm9wcyk7Ci0JYXNzZXJ0KG4gPiAwKTsKLQlpZiAobiA+IDEpIHsKLQkJY2xlYW51cCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQkJaWYgKGNsZWFudXAgPT0gTlVMTCkKLQkJICAgIHJldHVybiAwOwotCQlWSVNJVChjLCBleHByLCAKLQkJCShleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIDApKTsKLQl9Ci0JZm9yIChpID0gMTsgaSA8IG47IGkrKykgewotCQlBRERPUChjLCBEVVBfVE9QKTsKLQkJQURET1AoYywgUk9UX1RIUkVFKTsKLQkJQURET1BfSShjLCBDT01QQVJFX09QLAotCQkJY21wb3AoKGNtcG9wX3R5KShhc2RsX3NlcV9HRVQoCi0JCQkJCQkgIGUtPnYuQ29tcGFyZS5vcHMsIGkgLSAxKSkpKTsKLQkJQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBjbGVhbnVwKTsKLQkJTkVYVF9CTE9DSyhjKTsKLQkJQURET1AoYywgUE9QX1RPUCk7Ci0JCWlmIChpIDwgKG4gLSAxKSkKLQkJICAgIFZJU0lUKGMsIGV4cHIsIAotCQkJICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIGkpKTsKLQl9Ci0JVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycywgbiAtIDEpKTsKLQlBRERPUF9JKGMsIENPTVBBUkVfT1AsCi0JICAgICAgIGNtcG9wKChjbXBvcF90eSkoYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5vcHMsIG4gLSAxKSkpKTsKLQlpZiAobiA+IDEpIHsKLQkJYmFzaWNibG9jayAqZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCQlpZiAoZW5kID09IE5VTEwpCi0JCSAgICByZXR1cm4gMDsKLQkJQURET1BfSlJFTChjLCBKVU1QX0ZPUldBUkQsIGVuZCk7Ci0JCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGNsZWFudXApOwotCQlBRERPUChjLCBST1RfVFdPKTsKLQkJQURET1AoYywgUE9QX1RPUCk7Ci0JCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7Ci0JfQotCXJldHVybiAxOworICAgIC8qIFhYWCB0aGUgbG9naWMgY2FuIGJlIGNsZWFuZWQgdXAgZm9yIDEgb3IgbXVsdGlwbGUgY29tcGFyaXNvbnMgKi8KKyAgICBWSVNJVChjLCBleHByLCBlLT52LkNvbXBhcmUubGVmdCk7CisgICAgbiA9IGFzZGxfc2VxX0xFTihlLT52LkNvbXBhcmUub3BzKTsKKyAgICBhc3NlcnQobiA+IDApOworICAgIGlmIChuID4gMSkgeworICAgICAgICBjbGVhbnVwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgICAgICBpZiAoY2xlYW51cCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsCisgICAgICAgICAgICAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5Db21wYXJlLmNvbXBhcmF0b3JzLCAwKSk7CisgICAgfQorICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgQURET1AoYywgRFVQX1RPUCk7CisgICAgICAgIEFERE9QKGMsIFJPVF9USFJFRSk7CisgICAgICAgIEFERE9QX0koYywgQ09NUEFSRV9PUCwKKyAgICAgICAgICAgIGNtcG9wKChjbXBvcF90eSkoYXNkbF9zZXFfR0VUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkNvbXBhcmUub3BzLCBpIC0gMSkpKSk7CisgICAgICAgIEFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgY2xlYW51cCk7CisgICAgICAgIE5FWFRfQkxPQ0soYyk7CisgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgICAgICBpZiAoaSA8IChuIC0gMSkpCisgICAgICAgICAgICBWSVNJVChjLCBleHByLAorICAgICAgICAgICAgICAgIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMsIGkpKTsKKyAgICB9CisgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5jb21wYXJhdG9ycywgbiAtIDEpKTsKKyAgICBBRERPUF9JKGMsIENPTVBBUkVfT1AsCisgICAgICAgICAgIGNtcG9wKChjbXBvcF90eSkoYXNkbF9zZXFfR0VUKGUtPnYuQ29tcGFyZS5vcHMsIG4gLSAxKSkpKTsKKyAgICBpZiAobiA+IDEpIHsKKyAgICAgICAgYmFzaWNibG9jayAqZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgICAgICBpZiAoZW5kID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgQURET1BfSlJFTChjLCBKVU1QX0ZPUldBUkQsIGVuZCk7CisgICAgICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGNsZWFudXApOworICAgICAgICBBRERPUChjLCBST1RfVFdPKTsKKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGVuZCk7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9jYWxsKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotCWludCBuLCBjb2RlID0gMDsKKyAgICBpbnQgbiwgY29kZSA9IDA7CiAKLQlWSVNJVChjLCBleHByLCBlLT52LkNhbGwuZnVuYyk7Ci0JbiA9IGFzZGxfc2VxX0xFTihlLT52LkNhbGwuYXJncyk7Ci0JVklTSVRfU0VRKGMsIGV4cHIsIGUtPnYuQ2FsbC5hcmdzKTsKLQlpZiAoZS0+di5DYWxsLmtleXdvcmRzKSB7Ci0JCVZJU0lUX1NFUShjLCBrZXl3b3JkLCBlLT52LkNhbGwua2V5d29yZHMpOwotCQluIHw9IGFzZGxfc2VxX0xFTihlLT52LkNhbGwua2V5d29yZHMpIDw8IDg7Ci0JfQotCWlmIChlLT52LkNhbGwuc3RhcmFyZ3MpIHsKLQkJVklTSVQoYywgZXhwciwgZS0+di5DYWxsLnN0YXJhcmdzKTsKLQkJY29kZSB8PSAxOwotCX0KLQlpZiAoZS0+di5DYWxsLmt3YXJncykgewotCQlWSVNJVChjLCBleHByLCBlLT52LkNhbGwua3dhcmdzKTsKLQkJY29kZSB8PSAyOwotCX0KLQlzd2l0Y2ggKGNvZGUpIHsKLQljYXNlIDA6Ci0JCUFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgbik7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OX1ZBUiwgbik7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OX0tXLCBuKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlBRERPUF9JKGMsIENBTExfRlVOQ1RJT05fVkFSX0tXLCBuKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAxOworICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuQ2FsbC5mdW5jKTsKKyAgICBuID0gYXNkbF9zZXFfTEVOKGUtPnYuQ2FsbC5hcmdzKTsKKyAgICBWSVNJVF9TRVEoYywgZXhwciwgZS0+di5DYWxsLmFyZ3MpOworICAgIGlmIChlLT52LkNhbGwua2V5d29yZHMpIHsKKyAgICAgICAgVklTSVRfU0VRKGMsIGtleXdvcmQsIGUtPnYuQ2FsbC5rZXl3b3Jkcyk7CisgICAgICAgIG4gfD0gYXNkbF9zZXFfTEVOKGUtPnYuQ2FsbC5rZXl3b3JkcykgPDwgODsKKyAgICB9CisgICAgaWYgKGUtPnYuQ2FsbC5zdGFyYXJncykgeworICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LkNhbGwuc3RhcmFyZ3MpOworICAgICAgICBjb2RlIHw9IDE7CisgICAgfQorICAgIGlmIChlLT52LkNhbGwua3dhcmdzKSB7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuQ2FsbC5rd2FyZ3MpOworICAgICAgICBjb2RlIHw9IDI7CisgICAgfQorICAgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgMDoKKyAgICAgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT05fVkFSLCBuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT05fS1csIG4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTl9WQVJfS1csIG4pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2xpc3Rjb21wX2dlbmVyYXRvcihzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5T2JqZWN0ICp0bXBuYW1lLAotCQkJICAgIGFzZGxfc2VxICpnZW5lcmF0b3JzLCBpbnQgZ2VuX2luZGV4LCAKLQkJCSAgICBleHByX3R5IGVsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqZ2VuZXJhdG9ycywgaW50IGdlbl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGVsdCkKIHsKLQkvKiBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgaXRlcmF0b3IsIHRoZW4gZWFjaCBvZiB0aGUgaWZzLAotCSAgIGFuZCB0aGVuIHdyaXRlIHRvIHRoZSBlbGVtZW50ICovCisgICAgLyogZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGl0ZXJhdG9yLCB0aGVuIGVhY2ggb2YgdGhlIGlmcywKKyAgICAgICBhbmQgdGhlbiB3cml0ZSB0byB0aGUgZWxlbWVudCAqLwogCi0JY29tcHJlaGVuc2lvbl90eSBsOwotCWJhc2ljYmxvY2sgKnN0YXJ0LCAqYW5jaG9yLCAqc2tpcCwgKmlmX2NsZWFudXA7Ci0JaW50IGksIG47CisgICAgY29tcHJlaGVuc2lvbl90eSBsOworICAgIGJhc2ljYmxvY2sgKnN0YXJ0LCAqYW5jaG9yLCAqc2tpcCwgKmlmX2NsZWFudXA7CisgICAgaW50IGksIG47CiAKLQlzdGFydCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlza2lwID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCWlmX2NsZWFudXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JYW5jaG9yID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIHN0YXJ0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIHNraXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWZfY2xlYW51cCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBhbmNob3IgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CiAKLQlpZiAoc3RhcnQgPT0gTlVMTCB8fCBza2lwID09IE5VTEwgfHwgaWZfY2xlYW51cCA9PSBOVUxMIHx8Ci0JCWFuY2hvciA9PSBOVUxMKQotCSAgICByZXR1cm4gMDsKKyAgICBpZiAoc3RhcnQgPT0gTlVMTCB8fCBza2lwID09IE5VTEwgfHwgaWZfY2xlYW51cCA9PSBOVUxMIHx8CisgICAgICAgIGFuY2hvciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKIAotCWwgPSAoY29tcHJlaGVuc2lvbl90eSlhc2RsX3NlcV9HRVQoZ2VuZXJhdG9ycywgZ2VuX2luZGV4KTsKLQlWSVNJVChjLCBleHByLCBsLT5pdGVyKTsKLQlBRERPUChjLCBHRVRfSVRFUik7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc3RhcnQpOwotCUFERE9QX0pSRUwoYywgRk9SX0lURVIsIGFuY2hvcik7Ci0JTkVYVF9CTE9DSyhjKTsKLQlWSVNJVChjLCBleHByLCBsLT50YXJnZXQpOworICAgIGwgPSAoY29tcHJlaGVuc2lvbl90eSlhc2RsX3NlcV9HRVQoZ2VuZXJhdG9ycywgZ2VuX2luZGV4KTsKKyAgICBWSVNJVChjLCBleHByLCBsLT5pdGVyKTsKKyAgICBBRERPUChjLCBHRVRfSVRFUik7CisgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc3RhcnQpOworICAgIEFERE9QX0pSRUwoYywgRk9SX0lURVIsIGFuY2hvcik7CisgICAgTkVYVF9CTE9DSyhjKTsKKyAgICBWSVNJVChjLCBleHByLCBsLT50YXJnZXQpOwogCi0JLyogWFhYIHRoaXMgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cC4uLmEgbG90ISAqLwotCW4gPSBhc2RsX3NlcV9MRU4obC0+aWZzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWV4cHJfdHkgZSA9IChleHByX3R5KWFzZGxfc2VxX0dFVChsLT5pZnMsIGkpOwotCQlWSVNJVChjLCBleHByLCBlKTsKLQkJQURET1BfSlJFTChjLCBKVU1QX0lGX0ZBTFNFLCBpZl9jbGVhbnVwKTsKLQkJTkVYVF9CTE9DSyhjKTsKLQkJQURET1AoYywgUE9QX1RPUCk7Ci0JfSAKKyAgICAvKiBYWFggdGhpcyBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLi4uYSBsb3QhICovCisgICAgbiA9IGFzZGxfc2VxX0xFTihsLT5pZnMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZXhwcl90eSBlID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGwtPmlmcywgaSk7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUpOworICAgICAgICBBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIGlmX2NsZWFudXApOworICAgICAgICBORVhUX0JMT0NLKGMpOworICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICB9CiAKLQlpZiAoKytnZW5faW5kZXggPCBhc2RsX3NlcV9MRU4oZ2VuZXJhdG9ycykpCi0JICAgIGlmICghY29tcGlsZXJfbGlzdGNvbXBfZ2VuZXJhdG9yKGMsIHRtcG5hbWUsIAotCQkJCQkgICAgIGdlbmVyYXRvcnMsIGdlbl9pbmRleCwgZWx0KSkKLQkJcmV0dXJuIDA7CisgICAgaWYgKCsrZ2VuX2luZGV4IDwgYXNkbF9zZXFfTEVOKGdlbmVyYXRvcnMpKQorICAgICAgICBpZiAoIWNvbXBpbGVyX2xpc3Rjb21wX2dlbmVyYXRvcihjLCB0bXBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JzLCBnZW5faW5kZXgsIGVsdCkpCisgICAgICAgIHJldHVybiAwOwogCi0JLyogb25seSBhcHBlbmQgYWZ0ZXIgdGhlIGxhc3QgZm9yIGdlbmVyYXRvciAqLwotCWlmIChnZW5faW5kZXggPj0gYXNkbF9zZXFfTEVOKGdlbmVyYXRvcnMpKSB7Ci0JICAgIGlmICghY29tcGlsZXJfbmFtZW9wKGMsIHRtcG5hbWUsIExvYWQpKQotCQlyZXR1cm4gMDsKLQkgICAgVklTSVQoYywgZXhwciwgZWx0KTsKLQkgICAgQURET1AoYywgTElTVF9BUFBFTkQpOworICAgIC8qIG9ubHkgYXBwZW5kIGFmdGVyIHRoZSBsYXN0IGZvciBnZW5lcmF0b3IgKi8KKyAgICBpZiAoZ2VuX2luZGV4ID49IGFzZGxfc2VxX0xFTihnZW5lcmF0b3JzKSkgeworICAgICAgICBpZiAoIWNvbXBpbGVyX25hbWVvcChjLCB0bXBuYW1lLCBMb2FkKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGVsdCk7CisgICAgICAgIEFERE9QKGMsIExJU1RfQVBQRU5EKTsKIAotCSAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBza2lwKTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlBRERPUF9JKGMsIEpVTVBfRk9SV0FSRCwgMSk7Ci0JCWlmIChpID09IDApCi0JCSAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBpZl9jbGVhbnVwKTsKLQkJQURET1AoYywgUE9QX1RPUCk7Ci0JfSAKLQlBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIHN0YXJ0KTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBhbmNob3IpOwotCS8qIGRlbGV0ZSB0aGUgdGVtcG9yYXJ5IGxpc3QgbmFtZSBhZGRlZCB0byBsb2NhbHMgKi8KLQlpZiAoZ2VuX2luZGV4ID09IDEpCi0JICAgIGlmICghY29tcGlsZXJfbmFtZW9wKGMsIHRtcG5hbWUsIERlbCkpCi0JCXJldHVybiAwOwotCQotCXJldHVybiAxOworICAgICAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBza2lwKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBBRERPUF9JKGMsIEpVTVBfRk9SV0FSRCwgMSk7CisgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBpZl9jbGVhbnVwKTsKKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgfQorICAgIEFERE9QX0pBQlMoYywgSlVNUF9BQlNPTFVURSwgc3RhcnQpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGFuY2hvcik7CisgICAgLyogZGVsZXRlIHRoZSB0ZW1wb3JhcnkgbGlzdCBuYW1lIGFkZGVkIHRvIGxvY2FscyAqLworICAgIGlmIChnZW5faW5kZXggPT0gMSkKKyAgICAgICAgaWYgKCFjb21waWxlcl9uYW1lb3AoYywgdG1wbmFtZSwgRGVsKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfbGlzdGNvbXAoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0JaWRlbnRpZmllciB0bXA7Ci0JaW50IHJjID0gMDsKLQlhc2RsX3NlcSAqZ2VuZXJhdG9ycyA9IGUtPnYuTGlzdENvbXAuZ2VuZXJhdG9yczsKKyAgICBpZGVudGlmaWVyIHRtcDsKKyAgICBpbnQgcmMgPSAwOworICAgIGFzZGxfc2VxICpnZW5lcmF0b3JzID0gZS0+di5MaXN0Q29tcC5nZW5lcmF0b3JzOwogCi0JYXNzZXJ0KGUtPmtpbmQgPT0gTGlzdENvbXBfa2luZCk7Ci0JdG1wID0gY29tcGlsZXJfbmV3X3RtcG5hbWUoYyk7Ci0JaWYgKCF0bXApCi0JCXJldHVybiAwOwotCUFERE9QX0koYywgQlVJTERfTElTVCwgMCk7Ci0JQURET1AoYywgRFVQX1RPUCk7Ci0JaWYgKGNvbXBpbGVyX25hbWVvcChjLCB0bXAsIFN0b3JlKSkKLQkgICAgcmMgPSBjb21waWxlcl9saXN0Y29tcF9nZW5lcmF0b3IoYywgdG1wLCBnZW5lcmF0b3JzLCAwLCAKLQkJCQkJICAgICBlLT52Lkxpc3RDb21wLmVsdCk7Ci0JUHlfREVDUkVGKHRtcCk7Ci0JcmV0dXJuIHJjOworICAgIGFzc2VydChlLT5raW5kID09IExpc3RDb21wX2tpbmQpOworICAgIHRtcCA9IGNvbXBpbGVyX25ld190bXBuYW1lKGMpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4gMDsKKyAgICBBRERPUF9JKGMsIEJVSUxEX0xJU1QsIDApOworICAgIEFERE9QKGMsIERVUF9UT1ApOworICAgIGlmIChjb21waWxlcl9uYW1lb3AoYywgdG1wLCBTdG9yZSkpCisgICAgICAgIHJjID0gY29tcGlsZXJfbGlzdGNvbXBfZ2VuZXJhdG9yKGMsIHRtcCwgZ2VuZXJhdG9ycywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5MaXN0Q29tcC5lbHQpOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiByYzsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfZ2VuZXhwX2dlbmVyYXRvcihzdHJ1Y3QgY29tcGlsZXIgKmMsCi0JCQkgIGFzZGxfc2VxICpnZW5lcmF0b3JzLCBpbnQgZ2VuX2luZGV4LCAKLQkJCSAgZXhwcl90eSBlbHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpnZW5lcmF0b3JzLCBpbnQgZ2VuX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGVsdCkKIHsKLQkvKiBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgaXRlcmF0b3IsIHRoZW4gZWFjaCBvZiB0aGUgaWZzLAotCSAgIGFuZCB0aGVuIHdyaXRlIHRvIHRoZSBlbGVtZW50ICovCisgICAgLyogZ2VuZXJhdGUgY29kZSBmb3IgdGhlIGl0ZXJhdG9yLCB0aGVuIGVhY2ggb2YgdGhlIGlmcywKKyAgICAgICBhbmQgdGhlbiB3cml0ZSB0byB0aGUgZWxlbWVudCAqLwogCi0JY29tcHJlaGVuc2lvbl90eSBnZTsKLQliYXNpY2Jsb2NrICpzdGFydCwgKmFuY2hvciwgKnNraXAsICppZl9jbGVhbnVwLCAqZW5kOwotCWludCBpLCBuOworICAgIGNvbXByZWhlbnNpb25fdHkgZ2U7CisgICAgYmFzaWNibG9jayAqc3RhcnQsICphbmNob3IsICpza2lwLCAqaWZfY2xlYW51cCwgKmVuZDsKKyAgICBpbnQgaSwgbjsKIAotCXN0YXJ0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwotCXNraXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JaWZfY2xlYW51cCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLQlhbmNob3IgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0JZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIHN0YXJ0ID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIHNraXAgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWZfY2xlYW51cCA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKKyAgICBhbmNob3IgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgZW5kID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwogCi0JaWYgKHN0YXJ0ID09IE5VTEwgfHwgc2tpcCA9PSBOVUxMIHx8IGlmX2NsZWFudXAgPT0gTlVMTCB8fAotCSAgICBhbmNob3IgPT0gTlVMTCB8fCBlbmQgPT0gTlVMTCkKLQkJcmV0dXJuIDA7CisgICAgaWYgKHN0YXJ0ID09IE5VTEwgfHwgc2tpcCA9PSBOVUxMIHx8IGlmX2NsZWFudXAgPT0gTlVMTCB8fAorICAgICAgICBhbmNob3IgPT0gTlVMTCB8fCBlbmQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CiAKLQlnZSA9IChjb21wcmVoZW5zaW9uX3R5KWFzZGxfc2VxX0dFVChnZW5lcmF0b3JzLCBnZW5faW5kZXgpOwotCUFERE9QX0pSRUwoYywgU0VUVVBfTE9PUCwgZW5kKTsKLQlpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIExPT1AsIHN0YXJ0KSkKLQkJcmV0dXJuIDA7CisgICAgZ2UgPSAoY29tcHJlaGVuc2lvbl90eSlhc2RsX3NlcV9HRVQoZ2VuZXJhdG9ycywgZ2VuX2luZGV4KTsKKyAgICBBRERPUF9KUkVMKGMsIFNFVFVQX0xPT1AsIGVuZCk7CisgICAgaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBMT09QLCBzdGFydCkpCisgICAgICAgIHJldHVybiAwOwogCi0JaWYgKGdlbl9pbmRleCA9PSAwKSB7Ci0JCS8qIFJlY2VpdmUgb3V0ZXJtb3N0IGl0ZXIgYXMgYW4gaW1wbGljaXQgYXJndW1lbnQgKi8KLQkJYy0+dS0+dV9hcmdjb3VudCA9IDE7Ci0JCUFERE9QX0koYywgTE9BRF9GQVNULCAwKTsKLQl9Ci0JZWxzZSB7Ci0JCS8qIFN1Yi1pdGVyIC0gY2FsY3VsYXRlIG9uIHRoZSBmbHkgKi8KLQkJVklTSVQoYywgZXhwciwgZ2UtPml0ZXIpOwotCQlBRERPUChjLCBHRVRfSVRFUik7Ci0JfQotCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHN0YXJ0KTsKLQlBRERPUF9KUkVMKGMsIEZPUl9JVEVSLCBhbmNob3IpOwotCU5FWFRfQkxPQ0soYyk7Ci0JVklTSVQoYywgZXhwciwgZ2UtPnRhcmdldCk7CisgICAgaWYgKGdlbl9pbmRleCA9PSAwKSB7CisgICAgICAgIC8qIFJlY2VpdmUgb3V0ZXJtb3N0IGl0ZXIgYXMgYW4gaW1wbGljaXQgYXJndW1lbnQgKi8KKyAgICAgICAgYy0+dS0+dV9hcmdjb3VudCA9IDE7CisgICAgICAgIEFERE9QX0koYywgTE9BRF9GQVNULCAwKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIFN1Yi1pdGVyIC0gY2FsY3VsYXRlIG9uIHRoZSBmbHkgKi8KKyAgICAgICAgVklTSVQoYywgZXhwciwgZ2UtPml0ZXIpOworICAgICAgICBBRERPUChjLCBHRVRfSVRFUik7CisgICAgfQorICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHN0YXJ0KTsKKyAgICBBRERPUF9KUkVMKGMsIEZPUl9JVEVSLCBhbmNob3IpOworICAgIE5FWFRfQkxPQ0soYyk7CisgICAgVklTSVQoYywgZXhwciwgZ2UtPnRhcmdldCk7CiAKLQkvKiBYWFggdGhpcyBuZWVkcyB0byBiZSBjbGVhbmVkIHVwLi4uYSBsb3QhICovCi0JbiA9IGFzZGxfc2VxX0xFTihnZS0+aWZzKTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCWV4cHJfdHkgZSA9IChleHByX3R5KWFzZGxfc2VxX0dFVChnZS0+aWZzLCBpKTsKLQkJVklTSVQoYywgZXhwciwgZSk7Ci0JCUFERE9QX0pSRUwoYywgSlVNUF9JRl9GQUxTRSwgaWZfY2xlYW51cCk7Ci0JCU5FWFRfQkxPQ0soYyk7Ci0JCUFERE9QKGMsIFBPUF9UT1ApOwotCX0gCisgICAgLyogWFhYIHRoaXMgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cC4uLmEgbG90ISAqLworICAgIG4gPSBhc2RsX3NlcV9MRU4oZ2UtPmlmcyk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBleHByX3R5IGUgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZ2UtPmlmcywgaSk7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUpOworICAgICAgICBBRERPUF9KUkVMKGMsIEpVTVBfSUZfRkFMU0UsIGlmX2NsZWFudXApOworICAgICAgICBORVhUX0JMT0NLKGMpOworICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICB9CiAKLQlpZiAoKytnZW5faW5kZXggPCBhc2RsX3NlcV9MRU4oZ2VuZXJhdG9ycykpCi0JCWlmICghY29tcGlsZXJfZ2VuZXhwX2dlbmVyYXRvcihjLCBnZW5lcmF0b3JzLCBnZW5faW5kZXgsIGVsdCkpCi0JCQlyZXR1cm4gMDsKKyAgICBpZiAoKytnZW5faW5kZXggPCBhc2RsX3NlcV9MRU4oZ2VuZXJhdG9ycykpCisgICAgICAgIGlmICghY29tcGlsZXJfZ2VuZXhwX2dlbmVyYXRvcihjLCBnZW5lcmF0b3JzLCBnZW5faW5kZXgsIGVsdCkpCisgICAgICAgICAgICByZXR1cm4gMDsKIAotCS8qIG9ubHkgYXBwZW5kIGFmdGVyIHRoZSBsYXN0ICdmb3InIGdlbmVyYXRvciAqLwotCWlmIChnZW5faW5kZXggPj0gYXNkbF9zZXFfTEVOKGdlbmVyYXRvcnMpKSB7Ci0JCVZJU0lUKGMsIGV4cHIsIGVsdCk7Ci0JCUFERE9QKGMsIFlJRUxEX1ZBTFVFKTsKLQkJQURET1AoYywgUE9QX1RPUCk7CisgICAgLyogb25seSBhcHBlbmQgYWZ0ZXIgdGhlIGxhc3QgJ2ZvcicgZ2VuZXJhdG9yICovCisgICAgaWYgKGdlbl9pbmRleCA+PSBhc2RsX3NlcV9MRU4oZ2VuZXJhdG9ycykpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgZWx0KTsKKyAgICAgICAgQURET1AoYywgWUlFTERfVkFMVUUpOworICAgICAgICBBRERPUChjLCBQT1BfVE9QKTsKIAotCQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBza2lwKTsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQlBRERPUF9JKGMsIEpVTVBfRk9SV0FSRCwgMSk7Ci0JCWlmIChpID09IDApCi0JCQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBpZl9jbGVhbnVwKTsKKyAgICAgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgc2tpcCk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgQURET1BfSShjLCBKVU1QX0ZPUldBUkQsIDEpOworICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgaWZfY2xlYW51cCk7CiAKLQkJQURET1AoYywgUE9QX1RPUCk7Ci0JfSAKLQlBRERPUF9KQUJTKGMsIEpVTVBfQUJTT0xVVEUsIHN0YXJ0KTsKLQljb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBhbmNob3IpOwotCUFERE9QKGMsIFBPUF9CTE9DSyk7Ci0JY29tcGlsZXJfcG9wX2ZibG9jayhjLCBMT09QLCBzdGFydCk7Ci0JY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZW5kKTsKKyAgICAgICAgQURET1AoYywgUE9QX1RPUCk7CisgICAgfQorICAgIEFERE9QX0pBQlMoYywgSlVNUF9BQlNPTFVURSwgc3RhcnQpOworICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGFuY2hvcik7CisgICAgQURET1AoYywgUE9QX0JMT0NLKTsKKyAgICBjb21waWxlcl9wb3BfZmJsb2NrKGMsIExPT1AsIHN0YXJ0KTsKKyAgICBjb21waWxlcl91c2VfbmV4dF9ibG9jayhjLCBlbmQpOwogCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2dlbmV4cChzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKIHsKLQlzdGF0aWMgaWRlbnRpZmllciBuYW1lOwotCVB5Q29kZU9iamVjdCAqY287Ci0JZXhwcl90eSBvdXRlcm1vc3RfaXRlciA9ICgoY29tcHJlaGVuc2lvbl90eSkKLQkJCQkgKGFzZGxfc2VxX0dFVChlLT52LkdlbmVyYXRvckV4cC5nZW5lcmF0b3JzLAotCQkJCQkgICAgICAgMCkpKS0+aXRlcjsKKyAgICBzdGF0aWMgaWRlbnRpZmllciBuYW1lOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgZXhwcl90eSBvdXRlcm1vc3RfaXRlciA9ICgoY29tcHJlaGVuc2lvbl90eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzZGxfc2VxX0dFVChlLT52LkdlbmVyYXRvckV4cC5nZW5lcmF0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKSktPml0ZXI7CiAKLQlpZiAoIW5hbWUpIHsKLQkJbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIjxnZW5leHByPiIpOwotCQlpZiAoIW5hbWUpCi0JCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKCFuYW1lKSB7CisgICAgICAgIG5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8Z2VuZXhwcj4iKTsKKyAgICAgICAgaWYgKCFuYW1lKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBuYW1lLCAodm9pZCAqKWUsIGUtPmxpbmVubykpCi0JCXJldHVybiAwOwotCWNvbXBpbGVyX2dlbmV4cF9nZW5lcmF0b3IoYywgZS0+di5HZW5lcmF0b3JFeHAuZ2VuZXJhdG9ycywgMCwKLQkJCQkgIGUtPnYuR2VuZXJhdG9yRXhwLmVsdCk7Ci0JY28gPSBhc3NlbWJsZShjLCAxKTsKLQljb21waWxlcl9leGl0X3Njb3BlKGMpOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKKyAgICBpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIG5hbWUsICh2b2lkICopZSwgZS0+bGluZW5vKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY29tcGlsZXJfZ2VuZXhwX2dlbmVyYXRvcihjLCBlLT52LkdlbmVyYXRvckV4cC5nZW5lcmF0b3JzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5HZW5lcmF0b3JFeHAuZWx0KTsKKyAgICBjbyA9IGFzc2VtYmxlKGMsIDEpOworICAgIGNvbXBpbGVyX2V4aXRfc2NvcGUoYyk7CisgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOwogCi0JY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCAwKTsKLQlQeV9ERUNSRUYoY28pOworICAgIGNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgMCk7CisgICAgUHlfREVDUkVGKGNvKTsKIAotCVZJU0lUKGMsIGV4cHIsIG91dGVybW9zdF9pdGVyKTsKLQlBRERPUChjLCBHRVRfSVRFUik7Ci0JQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCAxKTsKKyAgICBWSVNJVChjLCBleHByLCBvdXRlcm1vc3RfaXRlcik7CisgICAgQURET1AoYywgR0VUX0lURVIpOworICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgMSk7CiAKLQlyZXR1cm4gMTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfdmlzaXRfa2V5d29yZChzdHJ1Y3QgY29tcGlsZXIgKmMsIGtleXdvcmRfdHkgaykKIHsKLQlBRERPUF9PKGMsIExPQURfQ09OU1QsIGstPmFyZywgY29uc3RzKTsKLQlWSVNJVChjLCBleHByLCBrLT52YWx1ZSk7Ci0JcmV0dXJuIDE7CisgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBrLT5hcmcsIGNvbnN0cyk7CisgICAgVklTSVQoYywgZXhwciwgay0+dmFsdWUpOworICAgIHJldHVybiAxOwogfQogCi0vKiBUZXN0IHdoZXRoZXIgZXhwcmVzc2lvbiBpcyBjb25zdGFudC4JIEZvciBjb25zdGFudHMsIHJlcG9ydAorLyogVGVzdCB3aGV0aGVyIGV4cHJlc3Npb24gaXMgY29uc3RhbnQuICBGb3IgY29uc3RhbnRzLCByZXBvcnQKICAgIHdoZXRoZXIgdGhleSBhcmUgdHJ1ZSBvciBmYWxzZS4KIAogICAgUmV0dXJuIHZhbHVlczogMSBmb3IgdHJ1ZSwgMCBmb3IgZmFsc2UsIC0xIGZvciBub24tY29uc3RhbnQuCkBAIC0yODE2LDMzICsyODE2LDMzIEBACiBzdGF0aWMgaW50CiBleHByX2NvbnN0YW50KGV4cHJfdHkgZSkKIHsKLQlzd2l0Y2ggKGUtPmtpbmQpIHsKLQljYXNlIE51bV9raW5kOgotCQlyZXR1cm4gUHlPYmplY3RfSXNUcnVlKGUtPnYuTnVtLm4pOwotCWNhc2UgU3RyX2tpbmQ6Ci0JCXJldHVybiBQeU9iamVjdF9Jc1RydWUoZS0+di5TdHIucyk7Ci0JY2FzZSBOYW1lX2tpbmQ6Ci0JCS8qIF9fZGVidWdfXyBpcyBub3QgYXNzaWduYWJsZSwgc28gd2UgY2FuIG9wdGltaXplCi0JCSAqIGl0IGF3YXkgaW4gaWYgYW5kIHdoaWxlIHN0YXRlbWVudHMgKi8KLQkJaWYgKHN0cmNtcChQeVN0cmluZ19BU19TVFJJTkcoZS0+di5OYW1lLmlkKSwKLQkJCSAgICJfX2RlYnVnX18iKSA9PSAwKQotCQkJICAgcmV0dXJuICEgUHlfT3B0aW1pemVGbGFnOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQlkZWZhdWx0OgotCQlyZXR1cm4gLTE7Ci0JfQorICAgIHN3aXRjaCAoZS0+a2luZCkgeworICAgIGNhc2UgTnVtX2tpbmQ6CisgICAgICAgIHJldHVybiBQeU9iamVjdF9Jc1RydWUoZS0+di5OdW0ubik7CisgICAgY2FzZSBTdHJfa2luZDoKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0lzVHJ1ZShlLT52LlN0ci5zKTsKKyAgICBjYXNlIE5hbWVfa2luZDoKKyAgICAgICAgLyogX19kZWJ1Z19fIGlzIG5vdCBhc3NpZ25hYmxlLCBzbyB3ZSBjYW4gb3B0aW1pemUKKyAgICAgICAgICogaXQgYXdheSBpbiBpZiBhbmQgd2hpbGUgc3RhdGVtZW50cyAqLworICAgICAgICBpZiAoc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhlLT52Lk5hbWUuaWQpLAorICAgICAgICAgICAgICAgICAgICJfX2RlYnVnX18iKSA9PSAwKQorICAgICAgICAgICAgICAgICAgIHJldHVybiAhIFB5X09wdGltaXplRmxhZzsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIH0KIAogLyoKICAgIEltcGxlbWVudHMgdGhlIHdpdGggc3RhdGVtZW50IGZyb20gUEVQIDM0My4KIAotICAgVGhlIHNlbWFudGljcyBvdXRsaW5lZCBpbiB0aGF0IFBFUCBhcmUgYXMgZm9sbG93czogIAorICAgVGhlIHNlbWFudGljcyBvdXRsaW5lZCBpbiB0aGF0IFBFUCBhcmUgYXMgZm9sbG93czoKIAogICAgd2l0aCBFWFBSIGFzIFZBUjoKICAgICAgICBCTE9DSwotICAKKwogICAgSXQgaXMgaW1wbGVtZW50ZWQgcm91Z2hseSBhczoKLSAgCisKICAgIGNvbnRleHQgPSBFWFBSCiAgICBleGl0ID0gY29udGV4dC5fX2V4aXRfXyAgIyBub3QgY2FsbGluZyBpdAogICAgdmFsdWUgPSBjb250ZXh0Ll9fZW50ZXJfXygpCkBAIC0yODUxLDkgKzI4NTEsOSBAQAogICAgICAgIEJMT0NLCiAgICBmaW5hbGx5OgogICAgICAgIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkOgotCSAgIGV4YyA9IGNvcHkgb2YgKGV4Y2VwdGlvbiwgaW5zdGFuY2UsIHRyYWNlYmFjaykKKyAgICAgICBleGMgPSBjb3B5IG9mIChleGNlcHRpb24sIGluc3RhbmNlLCB0cmFjZWJhY2spCiAgICAgICAgZWxzZToKLQkgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKICAgICAgICBleGl0KCpleGMpCiAgKi8KIHN0YXRpYyBpbnQKQEAgLTI4NjYsMzUgKzI4NjYsMzUgQEAKICAgICBhc3NlcnQocy0+a2luZCA9PSBXaXRoX2tpbmQpOwogCiAgICAgaWYgKCFlbnRlcl9hdHRyKSB7Ci0JZW50ZXJfYXR0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZW50ZXJfXyIpOwotCWlmICghZW50ZXJfYXR0cikKLQkgICAgcmV0dXJuIDA7CisgICAgZW50ZXJfYXR0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZW50ZXJfXyIpOworICAgIGlmICghZW50ZXJfYXR0cikKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmICghZXhpdF9hdHRyKSB7Ci0JZXhpdF9hdHRyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19leGl0X18iKTsKLQlpZiAoIWV4aXRfYXR0cikKLQkgICAgcmV0dXJuIDA7CisgICAgZXhpdF9hdHRyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19leGl0X18iKTsKKyAgICBpZiAoIWV4aXRfYXR0cikKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CiAgICAgZmluYWxseSA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKICAgICBpZiAoIWJsb2NrIHx8ICFmaW5hbGx5KQotCXJldHVybiAwOworICAgIHJldHVybiAwOwogCiAgICAgaWYgKHMtPnYuV2l0aC5vcHRpb25hbF92YXJzKSB7Ci0JLyogQ3JlYXRlIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIGhvbGQgY29udGV4dC5fX2VudGVyX18oKS4KLQkgICBXZSBuZWVkIHRvIGRvIHRoaXMgcmF0aGVyIHRoYW4gcHJlc2VydmluZyBpdCBvbiB0aGUgc3RhY2sKLQkgICBiZWNhdXNlIFNFVFVQX0ZJTkFMTFkgcmVtZW1iZXJzIHRoZSBzdGFjayBsZXZlbC4KLQkgICBXZSBuZWVkIHRvIGRvIHRoZSBhc3NpZ25tZW50ICppbnNpZGUqIHRoZSB0cnkvZmluYWxseQotCSAgIHNvIHRoYXQgY29udGV4dC5fX2V4aXRfXygpIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NpZ25tZW50Ci0JICAgZmFpbHMuICBCdXQgd2UgbmVlZCB0byBjYWxsIGNvbnRleHQuX19lbnRlcl9fKCkgKmJlZm9yZSoKLQkgICB0aGUgdHJ5L2ZpbmFsbHkgc28gdGhhdCBpZiBpdCBmYWlscyB3ZSB3b24ndCBjYWxsCi0JICAgY29udGV4dC5fX2V4aXRfXygpLgotCSovCi0JdG1wdmFsdWUgPSBjb21waWxlcl9uZXdfdG1wbmFtZShjKTsKLQlpZiAodG1wdmFsdWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0JUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCB0bXB2YWx1ZSk7CisgICAgLyogQ3JlYXRlIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIGhvbGQgY29udGV4dC5fX2VudGVyX18oKS4KKyAgICAgICBXZSBuZWVkIHRvIGRvIHRoaXMgcmF0aGVyIHRoYW4gcHJlc2VydmluZyBpdCBvbiB0aGUgc3RhY2sKKyAgICAgICBiZWNhdXNlIFNFVFVQX0ZJTkFMTFkgcmVtZW1iZXJzIHRoZSBzdGFjayBsZXZlbC4KKyAgICAgICBXZSBuZWVkIHRvIGRvIHRoZSBhc3NpZ25tZW50ICppbnNpZGUqIHRoZSB0cnkvZmluYWxseQorICAgICAgIHNvIHRoYXQgY29udGV4dC5fX2V4aXRfXygpIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NpZ25tZW50CisgICAgICAgZmFpbHMuICBCdXQgd2UgbmVlZCB0byBjYWxsIGNvbnRleHQuX19lbnRlcl9fKCkgKmJlZm9yZSoKKyAgICAgICB0aGUgdHJ5L2ZpbmFsbHkgc28gdGhhdCBpZiBpdCBmYWlscyB3ZSB3b24ndCBjYWxsCisgICAgICAgY29udGV4dC5fX2V4aXRfXygpLgorICAgICovCisgICAgdG1wdmFsdWUgPSBjb21waWxlcl9uZXdfdG1wbmFtZShjKTsKKyAgICBpZiAodG1wdmFsdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCB0bXB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyogRXZhbHVhdGUgRVhQUiAqLwpAQCAtMjkxMCwxMyArMjkxMCwxMyBAQAogICAgIEFERE9QX0koYywgQ0FMTF9GVU5DVElPTiwgMCk7CiAKICAgICBpZiAocy0+di5XaXRoLm9wdGlvbmFsX3ZhcnMpIHsKLQkvKiBTdG9yZSBpdCBpbiB0bXB2YWx1ZSAqLwotCWlmICghY29tcGlsZXJfbmFtZW9wKGMsIHRtcHZhbHVlLCBTdG9yZSkpCi0JICAgIHJldHVybiAwOworICAgIC8qIFN0b3JlIGl0IGluIHRtcHZhbHVlICovCisgICAgaWYgKCFjb21waWxlcl9uYW1lb3AoYywgdG1wdmFsdWUsIFN0b3JlKSkKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGVsc2UgewotCS8qIERpc2NhcmQgcmVzdWx0IGZyb20gY29udGV4dC5fX2VudGVyX18oKSAqLwotCUFERE9QKGMsIFBPUF9UT1ApOworICAgIC8qIERpc2NhcmQgcmVzdWx0IGZyb20gY29udGV4dC5fX2VudGVyX18oKSAqLworICAgIEFERE9QKGMsIFBPUF9UT1ApOwogICAgIH0KIAogICAgIC8qIFN0YXJ0IHRoZSB0cnkgYmxvY2sgKi8KQEAgLTI5MjQsMTUgKzI5MjQsMTUgQEAKIAogICAgIGNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIGJsb2NrKTsKICAgICBpZiAoIWNvbXBpbGVyX3B1c2hfZmJsb2NrKGMsIEZJTkFMTFlfVFJZLCBibG9jaykpIHsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBpZiAocy0+di5XaXRoLm9wdGlvbmFsX3ZhcnMpIHsKLQkvKiBCaW5kIHNhdmVkIHJlc3VsdCBvZiBjb250ZXh0Ll9fZW50ZXJfXygpIHRvIFZBUiAqLwotCWlmICghY29tcGlsZXJfbmFtZW9wKGMsIHRtcHZhbHVlLCBMb2FkKSB8fAotCSAgICAhY29tcGlsZXJfbmFtZW9wKGMsIHRtcHZhbHVlLCBEZWwpKQotCSAgcmV0dXJuIDA7Ci0JVklTSVQoYywgZXhwciwgcy0+di5XaXRoLm9wdGlvbmFsX3ZhcnMpOworICAgIC8qIEJpbmQgc2F2ZWQgcmVzdWx0IG9mIGNvbnRleHQuX19lbnRlcl9fKCkgdG8gVkFSICovCisgICAgaWYgKCFjb21waWxlcl9uYW1lb3AoYywgdG1wdmFsdWUsIExvYWQpIHx8CisgICAgICAgICFjb21waWxlcl9uYW1lb3AoYywgdG1wdmFsdWUsIERlbCkpCisgICAgICByZXR1cm4gMDsKKyAgICBWSVNJVChjLCBleHByLCBzLT52LldpdGgub3B0aW9uYWxfdmFycyk7CiAgICAgfQogCiAgICAgLyogQkxPQ0sgY29kZSAqLwpAQCAtMjk0NSw3ICsyOTQ1LDcgQEAKICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CiAgICAgY29tcGlsZXJfdXNlX25leHRfYmxvY2soYywgZmluYWxseSk7CiAgICAgaWYgKCFjb21waWxlcl9wdXNoX2ZibG9jayhjLCBGSU5BTExZX0VORCwgZmluYWxseSkpCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiAKICAgICAvKiBGaW5hbGx5IGJsb2NrIHN0YXJ0czsgY29udGV4dC5fX2V4aXRfXyBpcyBvbiB0aGUgc3RhY2sgdW5kZXIKICAgICAgICB0aGUgZXhjZXB0aW9uIG9yIHJldHVybiBpbmZvcm1hdGlvbi4gSnVzdCBpc3N1ZSBvdXIgbWFnaWMKQEAgLTI5NjEsMjE3ICsyOTYxLDIxNyBAQAogc3RhdGljIGludAogY29tcGlsZXJfdmlzaXRfZXhwcihzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKIHsKLQlpbnQgaSwgbjsKKyAgICBpbnQgaSwgbjsKIAotCS8qIElmIGV4cHIgZSBoYXMgYSBkaWZmZXJlbnQgbGluZSBudW1iZXIgdGhhbiB0aGUgbGFzdCBleHByL3N0bXQsCi0JICAgc2V0IGEgbmV3IGxpbmUgbnVtYmVyIGZvciB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KLQkqLwotCWlmIChlLT5saW5lbm8gPiBjLT51LT51X2xpbmVubykgewotCQljLT51LT51X2xpbmVubyA9IGUtPmxpbmVubzsKLQkJYy0+dS0+dV9saW5lbm9fc2V0ID0gZmFsc2U7Ci0JfQotCXN3aXRjaCAoZS0+a2luZCkgewotCWNhc2UgQm9vbE9wX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9ib29sb3AoYywgZSk7Ci0JY2FzZSBCaW5PcF9raW5kOgotCQlWSVNJVChjLCBleHByLCBlLT52LkJpbk9wLmxlZnQpOwotCQlWSVNJVChjLCBleHByLCBlLT52LkJpbk9wLnJpZ2h0KTsKLQkJQURET1AoYywgYmlub3AoYywgZS0+di5CaW5PcC5vcCkpOwotCQlicmVhazsKLQljYXNlIFVuYXJ5T3Bfa2luZDoKLQkJVklTSVQoYywgZXhwciwgZS0+di5VbmFyeU9wLm9wZXJhbmQpOwotCQlBRERPUChjLCB1bmFyeW9wKGUtPnYuVW5hcnlPcC5vcCkpOwotCQlicmVhazsKLQljYXNlIExhbWJkYV9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfbGFtYmRhKGMsIGUpOwotCWNhc2UgSWZFeHBfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2lmZXhwKGMsIGUpOwotCWNhc2UgRGljdF9raW5kOgotCQluID0gYXNkbF9zZXFfTEVOKGUtPnYuRGljdC52YWx1ZXMpOwotCQlBRERPUF9JKGMsIEJVSUxEX01BUCwgKG4+MHhGRkZGID8gMHhGRkZGIDogbikpOwotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlWSVNJVChjLCBleHByLCAKLQkJCQkoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5EaWN0LnZhbHVlcywgaSkpOwotCQkJVklTSVQoYywgZXhwciwgCi0JCQkJKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC5rZXlzLCBpKSk7Ci0JCQlBRERPUChjLCBTVE9SRV9NQVApOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgTGlzdENvbXBfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2xpc3Rjb21wKGMsIGUpOwotCWNhc2UgR2VuZXJhdG9yRXhwX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9nZW5leHAoYywgZSk7Ci0JY2FzZSBZaWVsZF9raW5kOgotCQlpZiAoYy0+dS0+dV9zdGUtPnN0ZV90eXBlICE9IEZ1bmN0aW9uQmxvY2spCi0JCQlyZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgIid5aWVsZCcgb3V0c2lkZSBmdW5jdGlvbiIpOwotCQlpZiAoZS0+di5ZaWVsZC52YWx1ZSkgewotCQkJVklTSVQoYywgZXhwciwgZS0+di5ZaWVsZC52YWx1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7Ci0JCX0KLQkJQURET1AoYywgWUlFTERfVkFMVUUpOwotCQlicmVhazsKLQljYXNlIENvbXBhcmVfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX2NvbXBhcmUoYywgZSk7Ci0JY2FzZSBDYWxsX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9jYWxsKGMsIGUpOwotCWNhc2UgUmVwcl9raW5kOgotCQlWSVNJVChjLCBleHByLCBlLT52LlJlcHIudmFsdWUpOwotCQlBRERPUChjLCBVTkFSWV9DT05WRVJUKTsKLQkJYnJlYWs7Ci0JY2FzZSBOdW1fa2luZDoKLQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52Lk51bS5uLCBjb25zdHMpOwotCQlicmVhazsKLQljYXNlIFN0cl9raW5kOgotCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuU3RyLnMsIGNvbnN0cyk7Ci0JCWJyZWFrOwotCS8qIFRoZSBmb2xsb3dpbmcgZXhwcnMgY2FuIGJlIGFzc2lnbm1lbnQgdGFyZ2V0cy4gKi8KLQljYXNlIEF0dHJpYnV0ZV9raW5kOgotCQlpZiAoZS0+di5BdHRyaWJ1dGUuY3R4ICE9IEF1Z1N0b3JlKQotCQkJVklTSVQoYywgZXhwciwgZS0+di5BdHRyaWJ1dGUudmFsdWUpOwotCQlzd2l0Y2ggKGUtPnYuQXR0cmlidXRlLmN0eCkgewotCQljYXNlIEF1Z0xvYWQ6Ci0JCQlBRERPUChjLCBEVVBfVE9QKTsKLQkJCS8qIEZhbGwgdGhyb3VnaCB0byBsb2FkICovCi0JCWNhc2UgTG9hZDoKLQkJCUFERE9QX05BTUUoYywgTE9BRF9BVFRSLCBlLT52LkF0dHJpYnV0ZS5hdHRyLCBuYW1lcyk7Ci0JCQlicmVhazsKLQkJY2FzZSBBdWdTdG9yZToKLQkJCUFERE9QKGMsIFJPVF9UV08pOwotCQkJLyogRmFsbCB0aHJvdWdoIHRvIHNhdmUgKi8KLQkJY2FzZSBTdG9yZToKLQkJCUFERE9QX05BTUUoYywgU1RPUkVfQVRUUiwgZS0+di5BdHRyaWJ1dGUuYXR0ciwgbmFtZXMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRGVsOgotCQkJQURET1BfTkFNRShjLCBERUxFVEVfQVRUUiwgZS0+di5BdHRyaWJ1dGUuYXR0ciwgbmFtZXMpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUGFyYW06Ci0JCWRlZmF1bHQ6Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJCSJwYXJhbSBpbnZhbGlkIGluIGF0dHJpYnV0ZSBleHByZXNzaW9uIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIFN1YnNjcmlwdF9raW5kOgotCQlzd2l0Y2ggKGUtPnYuU3Vic2NyaXB0LmN0eCkgewotCQljYXNlIEF1Z0xvYWQ6Ci0JCQlWSVNJVChjLCBleHByLCBlLT52LlN1YnNjcmlwdC52YWx1ZSk7Ci0JCQlWSVNJVF9TTElDRShjLCBlLT52LlN1YnNjcmlwdC5zbGljZSwgQXVnTG9hZCk7Ci0JCQlicmVhazsKLQkJY2FzZSBMb2FkOgotCQkJVklTSVQoYywgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOwotCQkJVklTSVRfU0xJQ0UoYywgZS0+di5TdWJzY3JpcHQuc2xpY2UsIExvYWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQXVnU3RvcmU6Ci0JCQlWSVNJVF9TTElDRShjLCBlLT52LlN1YnNjcmlwdC5zbGljZSwgQXVnU3RvcmUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU3RvcmU6Ci0JCQlWSVNJVChjLCBleHByLCBlLT52LlN1YnNjcmlwdC52YWx1ZSk7Ci0JCQlWSVNJVF9TTElDRShjLCBlLT52LlN1YnNjcmlwdC5zbGljZSwgU3RvcmUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgRGVsOgotCQkJVklTSVQoYywgZXhwciwgZS0+di5TdWJzY3JpcHQudmFsdWUpOwotCQkJVklTSVRfU0xJQ0UoYywgZS0+di5TdWJzY3JpcHQuc2xpY2UsIERlbCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQYXJhbToKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkicGFyYW0gaW52YWxpZCBpbiBzdWJzY3JpcHQgZXhwcmVzc2lvbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBOYW1lX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl9uYW1lb3AoYywgZS0+di5OYW1lLmlkLCBlLT52Lk5hbWUuY3R4KTsKLQkvKiBjaGlsZCBub2RlcyBvZiBMaXN0IGFuZCBUdXBsZSB3aWxsIGhhdmUgZXhwcl9jb250ZXh0IHNldCAqLwotCWNhc2UgTGlzdF9raW5kOgotCQlyZXR1cm4gY29tcGlsZXJfbGlzdChjLCBlKTsKLQljYXNlIFR1cGxlX2tpbmQ6Ci0JCXJldHVybiBjb21waWxlcl90dXBsZShjLCBlKTsKLQl9Ci0JcmV0dXJuIDE7CisgICAgLyogSWYgZXhwciBlIGhhcyBhIGRpZmZlcmVudCBsaW5lIG51bWJlciB0aGFuIHRoZSBsYXN0IGV4cHIvc3RtdCwKKyAgICAgICBzZXQgYSBuZXcgbGluZSBudW1iZXIgZm9yIHRoZSBuZXh0IGluc3RydWN0aW9uLgorICAgICovCisgICAgaWYgKGUtPmxpbmVubyA+IGMtPnUtPnVfbGluZW5vKSB7CisgICAgICAgIGMtPnUtPnVfbGluZW5vID0gZS0+bGluZW5vOworICAgICAgICBjLT51LT51X2xpbmVub19zZXQgPSBmYWxzZTsKKyAgICB9CisgICAgc3dpdGNoIChlLT5raW5kKSB7CisgICAgY2FzZSBCb29sT3Bfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Jvb2xvcChjLCBlKTsKKyAgICBjYXNlIEJpbk9wX2tpbmQ6CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuQmluT3AubGVmdCk7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuQmluT3AucmlnaHQpOworICAgICAgICBBRERPUChjLCBiaW5vcChjLCBlLT52LkJpbk9wLm9wKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVW5hcnlPcF9raW5kOgorICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LlVuYXJ5T3Aub3BlcmFuZCk7CisgICAgICAgIEFERE9QKGMsIHVuYXJ5b3AoZS0+di5VbmFyeU9wLm9wKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTGFtYmRhX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9sYW1iZGEoYywgZSk7CisgICAgY2FzZSBJZkV4cF9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfaWZleHAoYywgZSk7CisgICAgY2FzZSBEaWN0X2tpbmQ6CisgICAgICAgIG4gPSBhc2RsX3NlcV9MRU4oZS0+di5EaWN0LnZhbHVlcyk7CisgICAgICAgIEFERE9QX0koYywgQlVJTERfTUFQLCAobj4weEZGRkYgPyAweEZGRkYgOiBuKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsCisgICAgICAgICAgICAgICAgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC52YWx1ZXMsIGkpKTsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsCisgICAgICAgICAgICAgICAgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC5rZXlzLCBpKSk7CisgICAgICAgICAgICBBRERPUChjLCBTVE9SRV9NQVApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTGlzdENvbXBfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2xpc3Rjb21wKGMsIGUpOworICAgIGNhc2UgR2VuZXJhdG9yRXhwX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9nZW5leHAoYywgZSk7CisgICAgY2FzZSBZaWVsZF9raW5kOgorICAgICAgICBpZiAoYy0+dS0+dV9zdGUtPnN0ZV90eXBlICE9IEZ1bmN0aW9uQmxvY2spCisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfZXJyb3IoYywgIid5aWVsZCcgb3V0c2lkZSBmdW5jdGlvbiIpOworICAgICAgICBpZiAoZS0+di5ZaWVsZC52YWx1ZSkgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5ZaWVsZC52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7CisgICAgICAgIH0KKyAgICAgICAgQURET1AoYywgWUlFTERfVkFMVUUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBhcmVfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2NvbXBhcmUoYywgZSk7CisgICAgY2FzZSBDYWxsX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9jYWxsKGMsIGUpOworICAgIGNhc2UgUmVwcl9raW5kOgorICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LlJlcHIudmFsdWUpOworICAgICAgICBBRERPUChjLCBVTkFSWV9DT05WRVJUKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOdW1fa2luZDoKKyAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52Lk51bS5uLCBjb25zdHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFN0cl9raW5kOgorICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuU3RyLnMsIGNvbnN0cyk7CisgICAgICAgIGJyZWFrOworICAgIC8qIFRoZSBmb2xsb3dpbmcgZXhwcnMgY2FuIGJlIGFzc2lnbm1lbnQgdGFyZ2V0cy4gKi8KKyAgICBjYXNlIEF0dHJpYnV0ZV9raW5kOgorICAgICAgICBpZiAoZS0+di5BdHRyaWJ1dGUuY3R4ICE9IEF1Z1N0b3JlKQorICAgICAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5BdHRyaWJ1dGUudmFsdWUpOworICAgICAgICBzd2l0Y2ggKGUtPnYuQXR0cmlidXRlLmN0eCkgeworICAgICAgICBjYXNlIEF1Z0xvYWQ6CisgICAgICAgICAgICBBRERPUChjLCBEVVBfVE9QKTsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBsb2FkICovCisgICAgICAgIGNhc2UgTG9hZDoKKyAgICAgICAgICAgIEFERE9QX05BTUUoYywgTE9BRF9BVFRSLCBlLT52LkF0dHJpYnV0ZS5hdHRyLCBuYW1lcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBdWdTdG9yZToKKyAgICAgICAgICAgIEFERE9QKGMsIFJPVF9UV08pOworICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIHNhdmUgKi8KKyAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAgICAgIEFERE9QX05BTUUoYywgU1RPUkVfQVRUUiwgZS0+di5BdHRyaWJ1dGUuYXR0ciwgbmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGVsOgorICAgICAgICAgICAgQURET1BfTkFNRShjLCBERUxFVEVfQVRUUiwgZS0+di5BdHRyaWJ1dGUuYXR0ciwgbmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGFyYW06CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIGludmFsaWQgaW4gYXR0cmlidXRlIGV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3Vic2NyaXB0X2tpbmQ6CisgICAgICAgIHN3aXRjaCAoZS0+di5TdWJzY3JpcHQuY3R4KSB7CisgICAgICAgIGNhc2UgQXVnTG9hZDoKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuU3Vic2NyaXB0LnZhbHVlKTsKKyAgICAgICAgICAgIFZJU0lUX1NMSUNFKGMsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLCBBdWdMb2FkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExvYWQ6CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LlN1YnNjcmlwdC52YWx1ZSk7CisgICAgICAgICAgICBWSVNJVF9TTElDRShjLCBlLT52LlN1YnNjcmlwdC5zbGljZSwgTG9hZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBdWdTdG9yZToKKyAgICAgICAgICAgIFZJU0lUX1NMSUNFKGMsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLCBBdWdTdG9yZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdG9yZToKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuU3Vic2NyaXB0LnZhbHVlKTsKKyAgICAgICAgICAgIFZJU0lUX1NMSUNFKGMsIGUtPnYuU3Vic2NyaXB0LnNsaWNlLCBTdG9yZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZWw6CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LlN1YnNjcmlwdC52YWx1ZSk7CisgICAgICAgICAgICBWSVNJVF9TTElDRShjLCBlLT52LlN1YnNjcmlwdC5zbGljZSwgRGVsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBhcmFtOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICJwYXJhbSBpbnZhbGlkIGluIHN1YnNjcmlwdCBleHByZXNzaW9uIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE5hbWVfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX25hbWVvcChjLCBlLT52Lk5hbWUuaWQsIGUtPnYuTmFtZS5jdHgpOworICAgIC8qIGNoaWxkIG5vZGVzIG9mIExpc3QgYW5kIFR1cGxlIHdpbGwgaGF2ZSBleHByX2NvbnRleHQgc2V0ICovCisgICAgY2FzZSBMaXN0X2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9saXN0KGMsIGUpOworICAgIGNhc2UgVHVwbGVfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX3R1cGxlKGMsIGUpOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfYXVnYXNzaWduKHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewotCWV4cHJfdHkgZSA9IHMtPnYuQXVnQXNzaWduLnRhcmdldDsKLQlleHByX3R5IGF1Z2U7CisgICAgZXhwcl90eSBlID0gcy0+di5BdWdBc3NpZ24udGFyZ2V0OworICAgIGV4cHJfdHkgYXVnZTsKIAotCWFzc2VydChzLT5raW5kID09IEF1Z0Fzc2lnbl9raW5kKTsKKyAgICBhc3NlcnQocy0+a2luZCA9PSBBdWdBc3NpZ25fa2luZCk7CiAKLQlzd2l0Y2ggKGUtPmtpbmQpIHsKLQljYXNlIEF0dHJpYnV0ZV9raW5kOgotCQlhdWdlID0gQXR0cmlidXRlKGUtPnYuQXR0cmlidXRlLnZhbHVlLCBlLT52LkF0dHJpYnV0ZS5hdHRyLAotCQkJCSBBdWdMb2FkLCBlLT5saW5lbm8sIGUtPmNvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwotCQlpZiAoYXVnZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIDA7Ci0JCVZJU0lUKGMsIGV4cHIsIGF1Z2UpOwotCQlWSVNJVChjLCBleHByLCBzLT52LkF1Z0Fzc2lnbi52YWx1ZSk7Ci0JCUFERE9QKGMsIGlucGxhY2VfYmlub3AoYywgcy0+di5BdWdBc3NpZ24ub3ApKTsKLQkJYXVnZS0+di5BdHRyaWJ1dGUuY3R4ID0gQXVnU3RvcmU7Ci0JCVZJU0lUKGMsIGV4cHIsIGF1Z2UpOwotCQlicmVhazsKLQljYXNlIFN1YnNjcmlwdF9raW5kOgotCQlhdWdlID0gU3Vic2NyaXB0KGUtPnYuU3Vic2NyaXB0LnZhbHVlLCBlLT52LlN1YnNjcmlwdC5zbGljZSwKLQkJCQkgQXVnTG9hZCwgZS0+bGluZW5vLCBlLT5jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKLQkJaWYgKGF1Z2UgPT0gTlVMTCkKLQkJICAgIHJldHVybiAwOwotCQlWSVNJVChjLCBleHByLCBhdWdlKTsKLQkJVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOwotCQlBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7Ci0JCWF1Z2UtPnYuU3Vic2NyaXB0LmN0eCA9IEF1Z1N0b3JlOwotCQlWSVNJVChjLCBleHByLCBhdWdlKTsKLQkJYnJlYWs7Ci0JY2FzZSBOYW1lX2tpbmQ6Ci0JCWlmICghY29tcGlsZXJfbmFtZW9wKGMsIGUtPnYuTmFtZS5pZCwgTG9hZCkpCi0JCSAgICByZXR1cm4gMDsKLQkJVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOwotCQlBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7Ci0JCXJldHVybiBjb21waWxlcl9uYW1lb3AoYywgZS0+di5OYW1lLmlkLCBTdG9yZSk7Ci0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAKLQkJCSJpbnZhbGlkIG5vZGUgdHlwZSAoJWQpIGZvciBhdWdtZW50ZWQgYXNzaWdubWVudCIsCi0JCQllLT5raW5kKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIHN3aXRjaCAoZS0+a2luZCkgeworICAgIGNhc2UgQXR0cmlidXRlX2tpbmQ6CisgICAgICAgIGF1Z2UgPSBBdHRyaWJ1dGUoZS0+di5BdHRyaWJ1dGUudmFsdWUsIGUtPnYuQXR0cmlidXRlLmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXVnTG9hZCwgZS0+bGluZW5vLCBlLT5jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgaWYgKGF1Z2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVChjLCBleHByLCBhdWdlKTsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOworICAgICAgICBBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7CisgICAgICAgIGF1Z2UtPnYuQXR0cmlidXRlLmN0eCA9IEF1Z1N0b3JlOworICAgICAgICBWSVNJVChjLCBleHByLCBhdWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTdWJzY3JpcHRfa2luZDoKKyAgICAgICAgYXVnZSA9IFN1YnNjcmlwdChlLT52LlN1YnNjcmlwdC52YWx1ZSwgZS0+di5TdWJzY3JpcHQuc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXVnTG9hZCwgZS0+bGluZW5vLCBlLT5jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgaWYgKGF1Z2UgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVChjLCBleHByLCBhdWdlKTsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOworICAgICAgICBBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7CisgICAgICAgIGF1Z2UtPnYuU3Vic2NyaXB0LmN0eCA9IEF1Z1N0b3JlOworICAgICAgICBWSVNJVChjLCBleHByLCBhdWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOYW1lX2tpbmQ6CisgICAgICAgIGlmICghY29tcGlsZXJfbmFtZW9wKGMsIGUtPnYuTmFtZS5pZCwgTG9hZCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOworICAgICAgICBBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7CisgICAgICAgIHJldHVybiBjb21waWxlcl9uYW1lb3AoYywgZS0+di5OYW1lLmlkLCBTdG9yZSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgImludmFsaWQgbm9kZSB0eXBlICglZCkgZm9yIGF1Z21lbnRlZCBhc3NpZ25tZW50IiwKKyAgICAgICAgICAgIGUtPmtpbmQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3B1c2hfZmJsb2NrKHN0cnVjdCBjb21waWxlciAqYywgZW51bSBmYmxvY2t0eXBlIHQsIGJhc2ljYmxvY2sgKmIpCiB7Ci0Jc3RydWN0IGZibG9ja2luZm8gKmY7Ci0JaWYgKGMtPnUtPnVfbmZibG9ja3MgPj0gQ09fTUFYQkxPQ0tTKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkidG9vIG1hbnkgc3RhdGljYWxseSBuZXN0ZWQgYmxvY2tzIik7Ci0JCXJldHVybiAwOwotCX0KLQlmID0gJmMtPnUtPnVfZmJsb2NrW2MtPnUtPnVfbmZibG9ja3MrK107Ci0JZi0+ZmJfdHlwZSA9IHQ7Ci0JZi0+ZmJfYmxvY2sgPSBiOwotCXJldHVybiAxOworICAgIHN0cnVjdCBmYmxvY2tpbmZvICpmOworICAgIGlmIChjLT51LT51X25mYmxvY2tzID49IENPX01BWEJMT0NLUykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidG9vIG1hbnkgc3RhdGljYWxseSBuZXN0ZWQgYmxvY2tzIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmID0gJmMtPnUtPnVfZmJsb2NrW2MtPnUtPnVfbmZibG9ja3MrK107CisgICAgZi0+ZmJfdHlwZSA9IHQ7CisgICAgZi0+ZmJfYmxvY2sgPSBiOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogY29tcGlsZXJfcG9wX2ZibG9jayhzdHJ1Y3QgY29tcGlsZXIgKmMsIGVudW0gZmJsb2NrdHlwZSB0LCBiYXNpY2Jsb2NrICpiKQogewotCXN0cnVjdCBjb21waWxlcl91bml0ICp1ID0gYy0+dTsKLQlhc3NlcnQodS0+dV9uZmJsb2NrcyA+IDApOwotCXUtPnVfbmZibG9ja3MtLTsKLQlhc3NlcnQodS0+dV9mYmxvY2tbdS0+dV9uZmJsb2Nrc10uZmJfdHlwZSA9PSB0KTsKLQlhc3NlcnQodS0+dV9mYmxvY2tbdS0+dV9uZmJsb2Nrc10uZmJfYmxvY2sgPT0gYik7CisgICAgc3RydWN0IGNvbXBpbGVyX3VuaXQgKnUgPSBjLT51OworICAgIGFzc2VydCh1LT51X25mYmxvY2tzID4gMCk7CisgICAgdS0+dV9uZmJsb2Nrcy0tOworICAgIGFzc2VydCh1LT51X2ZibG9ja1t1LT51X25mYmxvY2tzXS5mYl90eXBlID09IHQpOworICAgIGFzc2VydCh1LT51X2ZibG9ja1t1LT51X25mYmxvY2tzXS5mYl9ibG9jayA9PSBiKTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfaW5fbG9vcChzdHJ1Y3QgY29tcGlsZXIgKmMpIHsKLQlpbnQgaTsKLQlzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdSA9IGMtPnU7Ci0JZm9yIChpID0gMDsgaSA8IHUtPnVfbmZibG9ja3M7ICsraSkgewotCQlpZiAodS0+dV9mYmxvY2tbaV0uZmJfdHlwZSA9PSBMT09QKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgIGludCBpOworICAgIHN0cnVjdCBjb21waWxlcl91bml0ICp1ID0gYy0+dTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdS0+dV9uZmJsb2NrczsgKytpKSB7CisgICAgICAgIGlmICh1LT51X2ZibG9ja1tpXS5mYl90eXBlID09IExPT1ApCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAvKiBSYWlzZXMgYSBTeW50YXhFcnJvciBhbmQgcmV0dXJucyAwLgogICAgSWYgc29tZXRoaW5nIGdvZXMgd3JvbmcsIGEgZGlmZmVyZW50IGV4Y2VwdGlvbiBtYXkgYmUgcmFpc2VkLgpAQCAtMzE4MCwyMDUgKzMxODAsMjA1IEBACiBzdGF0aWMgaW50CiBjb21waWxlcl9lcnJvcihzdHJ1Y3QgY29tcGlsZXIgKmMsIGNvbnN0IGNoYXIgKmVycnN0cikKIHsKLQlQeU9iamVjdCAqbG9jOwotCVB5T2JqZWN0ICp1ID0gTlVMTCwgKnYgPSBOVUxMOworICAgIFB5T2JqZWN0ICpsb2M7CisgICAgUHlPYmplY3QgKnUgPSBOVUxMLCAqdiA9IE5VTEw7CiAKLQlsb2MgPSBQeUVycl9Qcm9ncmFtVGV4dChjLT5jX2ZpbGVuYW1lLCBjLT51LT51X2xpbmVubyk7Ci0JaWYgKCFsb2MpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlsb2MgPSBQeV9Ob25lOwotCX0KLQl1ID0gUHlfQnVpbGRWYWx1ZSgiKHppT08pIiwgYy0+Y19maWxlbmFtZSwgYy0+dS0+dV9saW5lbm8sCi0JCQkgIFB5X05vbmUsIGxvYyk7Ci0JaWYgKCF1KQotCQlnb3RvIGV4aXQ7Ci0JdiA9IFB5X0J1aWxkVmFsdWUoIih6TykiLCBlcnJzdHIsIHUpOwotCWlmICghdikKLQkJZ290byBleGl0OwotCVB5RXJyX1NldE9iamVjdChQeUV4Y19TeW50YXhFcnJvciwgdik7CisgICAgbG9jID0gUHlFcnJfUHJvZ3JhbVRleHQoYy0+Y19maWxlbmFtZSwgYy0+dS0+dV9saW5lbm8pOworICAgIGlmICghbG9jKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgbG9jID0gUHlfTm9uZTsKKyAgICB9CisgICAgdSA9IFB5X0J1aWxkVmFsdWUoIih6aU9PKSIsIGMtPmNfZmlsZW5hbWUsIGMtPnUtPnVfbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsIGxvYyk7CisgICAgaWYgKCF1KQorICAgICAgICBnb3RvIGV4aXQ7CisgICAgdiA9IFB5X0J1aWxkVmFsdWUoIih6TykiLCBlcnJzdHIsIHUpOworICAgIGlmICghdikKKyAgICAgICAgZ290byBleGl0OworICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19TeW50YXhFcnJvciwgdik7CiAgZXhpdDoKLQlQeV9ERUNSRUYobG9jKTsKLQlQeV9YREVDUkVGKHUpOwotCVB5X1hERUNSRUYodik7Ci0JcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKGxvYyk7CisgICAgUHlfWERFQ1JFRih1KTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1jb21waWxlcl9oYW5kbGVfc3Vic2NyKHN0cnVjdCBjb21waWxlciAqYywgY29uc3QgY2hhciAqa2luZCwgCi0JCSAgICAgICBleHByX2NvbnRleHRfdHkgY3R4KSAKK2NvbXBpbGVyX2hhbmRsZV9zdWJzY3Ioc3RydWN0IGNvbXBpbGVyICpjLCBjb25zdCBjaGFyICpraW5kLAorICAgICAgICAgICAgICAgICAgICAgICBleHByX2NvbnRleHRfdHkgY3R4KQogewotCWludCBvcCA9IDA7CisgICAgaW50IG9wID0gMDsKIAotCS8qIFhYWCB0aGlzIGNvZGUgaXMgZHVwbGljYXRlZCAqLwotCXN3aXRjaCAoY3R4KSB7Ci0JCWNhc2UgQXVnTG9hZDogLyogZmFsbCB0aHJvdWdoIHRvIExvYWQgKi8KLQkJY2FzZSBMb2FkOiAgICBvcCA9IEJJTkFSWV9TVUJTQ1I7IGJyZWFrOwotCQljYXNlIEF1Z1N0b3JlOi8qIGZhbGwgdGhyb3VnaCB0byBTdG9yZSAqLwotCQljYXNlIFN0b3JlOiAgIG9wID0gU1RPUkVfU1VCU0NSOyBicmVhazsKLQkJY2FzZSBEZWw6ICAgICBvcCA9IERFTEVURV9TVUJTQ1I7IGJyZWFrOwotCQljYXNlIFBhcmFtOgotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAKLQkJCQkgICAgICJpbnZhbGlkICVzIGtpbmQgJWQgaW4gc3Vic2NyaXB0XG4iLCAKLQkJCQkgICAgIGtpbmQsIGN0eCk7Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKGN0eCA9PSBBdWdMb2FkKSB7Ci0JCUFERE9QX0koYywgRFVQX1RPUFgsIDIpOwotCX0KLQllbHNlIGlmIChjdHggPT0gQXVnU3RvcmUpIHsKLQkJQURET1AoYywgUk9UX1RIUkVFKTsKLQl9Ci0JQURET1AoYywgb3ApOwotCXJldHVybiAxOworICAgIC8qIFhYWCB0aGlzIGNvZGUgaXMgZHVwbGljYXRlZCAqLworICAgIHN3aXRjaCAoY3R4KSB7CisgICAgICAgIGNhc2UgQXVnTG9hZDogLyogZmFsbCB0aHJvdWdoIHRvIExvYWQgKi8KKyAgICAgICAgY2FzZSBMb2FkOiAgICBvcCA9IEJJTkFSWV9TVUJTQ1I7IGJyZWFrOworICAgICAgICBjYXNlIEF1Z1N0b3JlOi8qIGZhbGwgdGhyb3VnaCB0byBTdG9yZSAqLworICAgICAgICBjYXNlIFN0b3JlOiAgIG9wID0gU1RPUkVfU1VCU0NSOyBicmVhazsKKyAgICAgICAgY2FzZSBEZWw6ICAgICBvcCA9IERFTEVURV9TVUJTQ1I7IGJyZWFrOworICAgICAgICBjYXNlIFBhcmFtOgorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkICVzIGtpbmQgJWQgaW4gc3Vic2NyaXB0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsIGN0eCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGN0eCA9PSBBdWdMb2FkKSB7CisgICAgICAgIEFERE9QX0koYywgRFVQX1RPUFgsIDIpOworICAgIH0KKyAgICBlbHNlIGlmIChjdHggPT0gQXVnU3RvcmUpIHsKKyAgICAgICAgQURET1AoYywgUk9UX1RIUkVFKTsKKyAgICB9CisgICAgQURET1AoYywgb3ApOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBjb21waWxlcl9zbGljZShzdHJ1Y3QgY29tcGlsZXIgKmMsIHNsaWNlX3R5IHMsIGV4cHJfY29udGV4dF90eSBjdHgpCiB7Ci0JaW50IG4gPSAyOwotCWFzc2VydChzLT5raW5kID09IFNsaWNlX2tpbmQpOworICAgIGludCBuID0gMjsKKyAgICBhc3NlcnQocy0+a2luZCA9PSBTbGljZV9raW5kKTsKIAotCS8qIG9ubHkgaGFuZGxlcyB0aGUgY2FzZXMgd2hlcmUgQlVJTERfU0xJQ0UgaXMgZW1pdHRlZCAqLwotCWlmIChzLT52LlNsaWNlLmxvd2VyKSB7Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2UubG93ZXIpOwotCX0KLQllbHNlIHsKLQkJQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOwotCX0KLQkJCi0JaWYgKHMtPnYuU2xpY2UudXBwZXIpIHsKLQkJVklTSVQoYywgZXhwciwgcy0+di5TbGljZS51cHBlcik7Ci0JfQotCWVsc2UgewotCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X05vbmUsIGNvbnN0cyk7Ci0JfQorICAgIC8qIG9ubHkgaGFuZGxlcyB0aGUgY2FzZXMgd2hlcmUgQlVJTERfU0xJQ0UgaXMgZW1pdHRlZCAqLworICAgIGlmIChzLT52LlNsaWNlLmxvd2VyKSB7CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2UubG93ZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOworICAgIH0KIAotCWlmIChzLT52LlNsaWNlLnN0ZXApIHsKLQkJbisrOwotCQlWSVNJVChjLCBleHByLCBzLT52LlNsaWNlLnN0ZXApOwotCX0KLQlBRERPUF9JKGMsIEJVSUxEX1NMSUNFLCBuKTsKLQlyZXR1cm4gMTsKKyAgICBpZiAocy0+di5TbGljZS51cHBlcikgeworICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LlNsaWNlLnVwcGVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKKyAgICB9CisKKyAgICBpZiAocy0+di5TbGljZS5zdGVwKSB7CisgICAgICAgIG4rKzsKKyAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5TbGljZS5zdGVwKTsKKyAgICB9CisgICAgQURET1BfSShjLCBCVUlMRF9TTElDRSwgbik7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXBpbGVyX3NpbXBsZV9zbGljZShzdHJ1Y3QgY29tcGlsZXIgKmMsIHNsaWNlX3R5IHMsIGV4cHJfY29udGV4dF90eSBjdHgpCiB7Ci0JaW50IG9wID0gMCwgc2xpY2Vfb2Zmc2V0ID0gMCwgc3RhY2tfY291bnQgPSAwOworICAgIGludCBvcCA9IDAsIHNsaWNlX29mZnNldCA9IDAsIHN0YWNrX2NvdW50ID0gMDsKIAotCWFzc2VydChzLT52LlNsaWNlLnN0ZXAgPT0gTlVMTCk7Ci0JaWYgKHMtPnYuU2xpY2UubG93ZXIpIHsKLQkJc2xpY2Vfb2Zmc2V0Kys7Ci0JCXN0YWNrX2NvdW50Kys7Ci0JCWlmIChjdHggIT0gQXVnU3RvcmUpIAotCQkJVklTSVQoYywgZXhwciwgcy0+di5TbGljZS5sb3dlcik7Ci0JfQotCWlmIChzLT52LlNsaWNlLnVwcGVyKSB7Ci0JCXNsaWNlX29mZnNldCArPSAyOwotCQlzdGFja19jb3VudCsrOwotCQlpZiAoY3R4ICE9IEF1Z1N0b3JlKSAKLQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuU2xpY2UudXBwZXIpOwotCX0KKyAgICBhc3NlcnQocy0+di5TbGljZS5zdGVwID09IE5VTEwpOworICAgIGlmIChzLT52LlNsaWNlLmxvd2VyKSB7CisgICAgICAgIHNsaWNlX29mZnNldCsrOworICAgICAgICBzdGFja19jb3VudCsrOworICAgICAgICBpZiAoY3R4ICE9IEF1Z1N0b3JlKQorICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5TbGljZS5sb3dlcik7CisgICAgfQorICAgIGlmIChzLT52LlNsaWNlLnVwcGVyKSB7CisgICAgICAgIHNsaWNlX29mZnNldCArPSAyOworICAgICAgICBzdGFja19jb3VudCsrOworICAgICAgICBpZiAoY3R4ICE9IEF1Z1N0b3JlKQorICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5TbGljZS51cHBlcik7CisgICAgfQogCi0JaWYgKGN0eCA9PSBBdWdMb2FkKSB7Ci0JCXN3aXRjaCAoc3RhY2tfY291bnQpIHsKLQkJY2FzZSAwOiBBRERPUChjLCBEVVBfVE9QKTsgYnJlYWs7Ci0JCWNhc2UgMTogQURET1BfSShjLCBEVVBfVE9QWCwgMik7IGJyZWFrOwotCQljYXNlIDI6IEFERE9QX0koYywgRFVQX1RPUFgsIDMpOyBicmVhazsKLQkJfQotCX0KLQllbHNlIGlmIChjdHggPT0gQXVnU3RvcmUpIHsKLQkJc3dpdGNoIChzdGFja19jb3VudCkgewotCQljYXNlIDA6IEFERE9QKGMsIFJPVF9UV08pOyBicmVhazsKLQkJY2FzZSAxOiBBRERPUChjLCBST1RfVEhSRUUpOyBicmVhazsKLQkJY2FzZSAyOiBBRERPUChjLCBST1RfRk9VUik7IGJyZWFrOwotCQl9Ci0JfQorICAgIGlmIChjdHggPT0gQXVnTG9hZCkgeworICAgICAgICBzd2l0Y2ggKHN0YWNrX2NvdW50KSB7CisgICAgICAgIGNhc2UgMDogQURET1AoYywgRFVQX1RPUCk7IGJyZWFrOworICAgICAgICBjYXNlIDE6IEFERE9QX0koYywgRFVQX1RPUFgsIDIpOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiBBRERPUF9JKGMsIERVUF9UT1BYLCAzKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoY3R4ID09IEF1Z1N0b3JlKSB7CisgICAgICAgIHN3aXRjaCAoc3RhY2tfY291bnQpIHsKKyAgICAgICAgY2FzZSAwOiBBRERPUChjLCBST1RfVFdPKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTogQURET1AoYywgUk9UX1RIUkVFKTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjogQURET1AoYywgUk9UX0ZPVVIpOyBicmVhazsKKyAgICAgICAgfQorICAgIH0KIAotCXN3aXRjaCAoY3R4KSB7Ci0JY2FzZSBBdWdMb2FkOiAvKiBmYWxsIHRocm91Z2ggdG8gTG9hZCAqLwotCWNhc2UgTG9hZDogb3AgPSBTTElDRTsgYnJlYWs7Ci0JY2FzZSBBdWdTdG9yZTovKiBmYWxsIHRocm91Z2ggdG8gU3RvcmUgKi8KLQljYXNlIFN0b3JlOiBvcCA9IFNUT1JFX1NMSUNFOyBicmVhazsKLQljYXNlIERlbDogb3AgPSBERUxFVEVfU0xJQ0U7IGJyZWFrOwotCWNhc2UgUGFyYW06Ci0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJwYXJhbSBpbnZhbGlkIGluIHNpbXBsZSBzbGljZSIpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgc3dpdGNoIChjdHgpIHsKKyAgICBjYXNlIEF1Z0xvYWQ6IC8qIGZhbGwgdGhyb3VnaCB0byBMb2FkICovCisgICAgY2FzZSBMb2FkOiBvcCA9IFNMSUNFOyBicmVhazsKKyAgICBjYXNlIEF1Z1N0b3JlOi8qIGZhbGwgdGhyb3VnaCB0byBTdG9yZSAqLworICAgIGNhc2UgU3RvcmU6IG9wID0gU1RPUkVfU0xJQ0U7IGJyZWFrOworICAgIGNhc2UgRGVsOiBvcCA9IERFTEVURV9TTElDRTsgYnJlYWs7CisgICAgY2FzZSBQYXJhbToKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gaW52YWxpZCBpbiBzaW1wbGUgc2xpY2UiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JQURET1AoYywgb3AgKyBzbGljZV9vZmZzZXQpOwotCXJldHVybiAxOworICAgIEFERE9QKGMsIG9wICsgc2xpY2Vfb2Zmc2V0KTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAotY29tcGlsZXJfdmlzaXRfbmVzdGVkX3NsaWNlKHN0cnVjdCBjb21waWxlciAqYywgc2xpY2VfdHkgcywgCi0JCQkgICAgZXhwcl9jb250ZXh0X3R5IGN0eCkKK2NvbXBpbGVyX3Zpc2l0X25lc3RlZF9zbGljZShzdHJ1Y3QgY29tcGlsZXIgKmMsIHNsaWNlX3R5IHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eCkKIHsKLQlzd2l0Y2ggKHMtPmtpbmQpIHsKLQljYXNlIEVsbGlwc2lzX2tpbmQ6Ci0JCUFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfRWxsaXBzaXMsIGNvbnN0cyk7Ci0JCWJyZWFrOwotCWNhc2UgU2xpY2Vfa2luZDoKLQkJcmV0dXJuIGNvbXBpbGVyX3NsaWNlKGMsIHMsIGN0eCk7Ci0JY2FzZSBJbmRleF9raW5kOgotCQlWSVNJVChjLCBleHByLCBzLT52LkluZGV4LnZhbHVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBFeHRTbGljZV9raW5kOgotCWRlZmF1bHQ6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiZXh0ZW5kZWQgc2xpY2UgaW52YWxpZCBpbiBuZXN0ZWQgc2xpY2UiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIHN3aXRjaCAocy0+a2luZCkgeworICAgIGNhc2UgRWxsaXBzaXNfa2luZDoKKyAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9FbGxpcHNpcywgY29uc3RzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTbGljZV9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfc2xpY2UoYywgcywgY3R4KTsKKyAgICBjYXNlIEluZGV4X2tpbmQ6CisgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuSW5kZXgudmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEV4dFNsaWNlX2tpbmQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVuZGVkIHNsaWNlIGludmFsaWQgaW4gbmVzdGVkIHNsaWNlIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogY29tcGlsZXJfdmlzaXRfc2xpY2Uoc3RydWN0IGNvbXBpbGVyICpjLCBzbGljZV90eSBzLCBleHByX2NvbnRleHRfdHkgY3R4KQogewotCWNoYXIgKiBraW5kbmFtZSA9IE5VTEw7Ci0Jc3dpdGNoIChzLT5raW5kKSB7Ci0JY2FzZSBJbmRleF9raW5kOgotCQlraW5kbmFtZSA9ICJpbmRleCI7Ci0JCWlmIChjdHggIT0gQXVnU3RvcmUpIHsKLQkJCVZJU0lUKGMsIGV4cHIsIHMtPnYuSW5kZXgudmFsdWUpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgRWxsaXBzaXNfa2luZDoKLQkJa2luZG5hbWUgPSAiZWxsaXBzaXMiOwotCQlpZiAoY3R4ICE9IEF1Z1N0b3JlKSB7Ci0JCQlBRERPUF9PKGMsIExPQURfQ09OU1QsIFB5X0VsbGlwc2lzLCBjb25zdHMpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgU2xpY2Vfa2luZDoKLQkJa2luZG5hbWUgPSAic2xpY2UiOwotCQlpZiAoIXMtPnYuU2xpY2Uuc3RlcCkgCi0JCQlyZXR1cm4gY29tcGlsZXJfc2ltcGxlX3NsaWNlKGMsIHMsIGN0eCk7Ci0JCWlmIChjdHggIT0gQXVnU3RvcmUpIHsKLQkJCWlmICghY29tcGlsZXJfc2xpY2UoYywgcywgY3R4KSkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlicmVhazsKLQljYXNlIEV4dFNsaWNlX2tpbmQ6Ci0JCWtpbmRuYW1lID0gImV4dGVuZGVkIHNsaWNlIjsKLQkJaWYgKGN0eCAhPSBBdWdTdG9yZSkgewotCQkJaW50IGksIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5FeHRTbGljZS5kaW1zKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlzbGljZV90eSBzdWIgPSAoc2xpY2VfdHkpYXNkbF9zZXFfR0VUKAotCQkJCQlzLT52LkV4dFNsaWNlLmRpbXMsIGkpOwotCQkJCWlmICghY29tcGlsZXJfdmlzaXRfbmVzdGVkX3NsaWNlKGMsIHN1YiwgY3R4KSkKLQkJCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBuKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgICJpbnZhbGlkIHN1YnNjcmlwdCBraW5kICVkIiwgcy0+a2luZCk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gY29tcGlsZXJfaGFuZGxlX3N1YnNjcihjLCBraW5kbmFtZSwgY3R4KTsKKyAgICBjaGFyICoga2luZG5hbWUgPSBOVUxMOworICAgIHN3aXRjaCAocy0+a2luZCkgeworICAgIGNhc2UgSW5kZXhfa2luZDoKKyAgICAgICAga2luZG5hbWUgPSAiaW5kZXgiOworICAgICAgICBpZiAoY3R4ICE9IEF1Z1N0b3JlKSB7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkluZGV4LnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVsbGlwc2lzX2tpbmQ6CisgICAgICAgIGtpbmRuYW1lID0gImVsbGlwc2lzIjsKKyAgICAgICAgaWYgKGN0eCAhPSBBdWdTdG9yZSkgeworICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9FbGxpcHNpcywgY29uc3RzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFNsaWNlX2tpbmQ6CisgICAgICAgIGtpbmRuYW1lID0gInNsaWNlIjsKKyAgICAgICAgaWYgKCFzLT52LlNsaWNlLnN0ZXApCisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXJfc2ltcGxlX3NsaWNlKGMsIHMsIGN0eCk7CisgICAgICAgIGlmIChjdHggIT0gQXVnU3RvcmUpIHsKKyAgICAgICAgICAgIGlmICghY29tcGlsZXJfc2xpY2UoYywgcywgY3R4KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEV4dFNsaWNlX2tpbmQ6CisgICAgICAgIGtpbmRuYW1lID0gImV4dGVuZGVkIHNsaWNlIjsKKyAgICAgICAgaWYgKGN0eCAhPSBBdWdTdG9yZSkgeworICAgICAgICAgICAgaW50IGksIG4gPSBhc2RsX3NlcV9MRU4ocy0+di5FeHRTbGljZS5kaW1zKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzbGljZV90eSBzdWIgPSAoc2xpY2VfdHkpYXNkbF9zZXFfR0VUKAorICAgICAgICAgICAgICAgICAgICBzLT52LkV4dFNsaWNlLmRpbXMsIGkpOworICAgICAgICAgICAgICAgIGlmICghY29tcGlsZXJfdmlzaXRfbmVzdGVkX3NsaWNlKGMsIHN1YiwgY3R4KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBuKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBzdWJzY3JpcHQga2luZCAlZCIsIHMtPmtpbmQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIGNvbXBpbGVyX2hhbmRsZV9zdWJzY3IoYywga2luZG5hbWUsIGN0eCk7CiB9CiAKIApAQCAtMzM5MSw2NCArMzM5MSw2NCBAQAogKi8KIAogc3RydWN0IGFzc2VtYmxlciB7Ci0JUHlPYmplY3QgKmFfYnl0ZWNvZGU7ICAvKiBzdHJpbmcgY29udGFpbmluZyBieXRlY29kZSAqLwotCWludCBhX29mZnNldDsJICAgICAgIC8qIG9mZnNldCBpbnRvIGJ5dGVjb2RlICovCi0JaW50IGFfbmJsb2NrczsJICAgICAgIC8qIG51bWJlciBvZiByZWFjaGFibGUgYmxvY2tzICovCi0JYmFzaWNibG9jayAqKmFfcG9zdG9yZGVyOyAvKiBsaXN0IG9mIGJsb2NrcyBpbiBkZnMgcG9zdG9yZGVyICovCi0JUHlPYmplY3QgKmFfbG5vdGFiOyAgICAvKiBzdHJpbmcgY29udGFpbmluZyBsbm90YWIgKi8KLQlpbnQgYV9sbm90YWJfb2ZmOyAgICAgIC8qIG9mZnNldCBpbnRvIGxub3RhYiAqLwotCWludCBhX2xpbmVubzsJICAgICAgIC8qIGxhc3QgbGluZW5vIG9mIGVtaXR0ZWQgaW5zdHJ1Y3Rpb24gKi8KLQlpbnQgYV9saW5lbm9fb2ZmOyAgICAgIC8qIGJ5dGVjb2RlIG9mZnNldCBvZiBsYXN0IGxpbmVubyAqLworICAgIFB5T2JqZWN0ICphX2J5dGVjb2RlOyAgLyogc3RyaW5nIGNvbnRhaW5pbmcgYnl0ZWNvZGUgKi8KKyAgICBpbnQgYV9vZmZzZXQ7ICAgICAgICAgICAgICAvKiBvZmZzZXQgaW50byBieXRlY29kZSAqLworICAgIGludCBhX25ibG9ja3M7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZWFjaGFibGUgYmxvY2tzICovCisgICAgYmFzaWNibG9jayAqKmFfcG9zdG9yZGVyOyAvKiBsaXN0IG9mIGJsb2NrcyBpbiBkZnMgcG9zdG9yZGVyICovCisgICAgUHlPYmplY3QgKmFfbG5vdGFiOyAgICAvKiBzdHJpbmcgY29udGFpbmluZyBsbm90YWIgKi8KKyAgICBpbnQgYV9sbm90YWJfb2ZmOyAgICAgIC8qIG9mZnNldCBpbnRvIGxub3RhYiAqLworICAgIGludCBhX2xpbmVubzsgICAgICAgICAgICAgIC8qIGxhc3QgbGluZW5vIG9mIGVtaXR0ZWQgaW5zdHJ1Y3Rpb24gKi8KKyAgICBpbnQgYV9saW5lbm9fb2ZmOyAgICAgIC8qIGJ5dGVjb2RlIG9mZnNldCBvZiBsYXN0IGxpbmVubyAqLwogfTsKIAogc3RhdGljIHZvaWQKIGRmcyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGJhc2ljYmxvY2sgKmIsIHN0cnVjdCBhc3NlbWJsZXIgKmEpCiB7Ci0JaW50IGk7Ci0Jc3RydWN0IGluc3RyICppbnN0ciA9IE5VTEw7CisgICAgaW50IGk7CisgICAgc3RydWN0IGluc3RyICppbnN0ciA9IE5VTEw7CiAKLQlpZiAoYi0+Yl9zZWVuKQotCQlyZXR1cm47Ci0JYi0+Yl9zZWVuID0gMTsKLQlpZiAoYi0+Yl9uZXh0ICE9IE5VTEwpCi0JCWRmcyhjLCBiLT5iX25leHQsIGEpOwotCWZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKLQkJaW5zdHIgPSAmYi0+Yl9pbnN0cltpXTsKLQkJaWYgKGluc3RyLT5pX2pyZWwgfHwgaW5zdHItPmlfamFicykKLQkJCWRmcyhjLCBpbnN0ci0+aV90YXJnZXQsIGEpOwotCX0KLQlhLT5hX3Bvc3RvcmRlclthLT5hX25ibG9ja3MrK10gPSBiOworICAgIGlmIChiLT5iX3NlZW4pCisgICAgICAgIHJldHVybjsKKyAgICBiLT5iX3NlZW4gPSAxOworICAgIGlmIChiLT5iX25leHQgIT0gTlVMTCkKKyAgICAgICAgZGZzKGMsIGItPmJfbmV4dCwgYSk7CisgICAgZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgeworICAgICAgICBpbnN0ciA9ICZiLT5iX2luc3RyW2ldOworICAgICAgICBpZiAoaW5zdHItPmlfanJlbCB8fCBpbnN0ci0+aV9qYWJzKQorICAgICAgICAgICAgZGZzKGMsIGluc3RyLT5pX3RhcmdldCwgYSk7CisgICAgfQorICAgIGEtPmFfcG9zdG9yZGVyW2EtPmFfbmJsb2NrcysrXSA9IGI7CiB9CiAKIHN0YXRpYyBpbnQKIHN0YWNrZGVwdGhfd2FsayhzdHJ1Y3QgY29tcGlsZXIgKmMsIGJhc2ljYmxvY2sgKmIsIGludCBkZXB0aCwgaW50IG1heGRlcHRoKQogewotCWludCBpOwotCXN0cnVjdCBpbnN0ciAqaW5zdHI7Ci0JaWYgKGItPmJfc2VlbiB8fCBiLT5iX3N0YXJ0ZGVwdGggPj0gZGVwdGgpCi0JCXJldHVybiBtYXhkZXB0aDsKLQliLT5iX3NlZW4gPSAxOwotCWItPmJfc3RhcnRkZXB0aCA9IGRlcHRoOwotCWZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKLQkJaW5zdHIgPSAmYi0+Yl9pbnN0cltpXTsKLQkJZGVwdGggKz0gb3Bjb2RlX3N0YWNrX2VmZmVjdChpbnN0ci0+aV9vcGNvZGUsIGluc3RyLT5pX29wYXJnKTsKLQkJaWYgKGRlcHRoID4gbWF4ZGVwdGgpCi0JCQltYXhkZXB0aCA9IGRlcHRoOwotCQlhc3NlcnQoZGVwdGggPj0gMCk7IC8qIGludmFsaWQgY29kZSBvciBidWcgaW4gc3RhY2tkZXB0aCgpICovCi0JCWlmIChpbnN0ci0+aV9qcmVsIHx8IGluc3RyLT5pX2phYnMpIHsKLQkJCW1heGRlcHRoID0gc3RhY2tkZXB0aF93YWxrKGMsIGluc3RyLT5pX3RhcmdldCwKLQkJCQkJCSAgIGRlcHRoLCBtYXhkZXB0aCk7Ci0JCQlpZiAoaW5zdHItPmlfb3Bjb2RlID09IEpVTVBfQUJTT0xVVEUgfHwKLQkJCSAgICBpbnN0ci0+aV9vcGNvZGUgPT0gSlVNUF9GT1JXQVJEKSB7Ci0JCQkJZ290byBvdXQ7IC8qIHJlbWFpbmluZyBjb2RlIGlzIGRlYWQgKi8KLQkJCX0KLQkJfQotCX0KLQlpZiAoYi0+Yl9uZXh0KQotCQltYXhkZXB0aCA9IHN0YWNrZGVwdGhfd2FsayhjLCBiLT5iX25leHQsIGRlcHRoLCBtYXhkZXB0aCk7CisgICAgaW50IGk7CisgICAgc3RydWN0IGluc3RyICppbnN0cjsKKyAgICBpZiAoYi0+Yl9zZWVuIHx8IGItPmJfc3RhcnRkZXB0aCA+PSBkZXB0aCkKKyAgICAgICAgcmV0dXJuIG1heGRlcHRoOworICAgIGItPmJfc2VlbiA9IDE7CisgICAgYi0+Yl9zdGFydGRlcHRoID0gZGVwdGg7CisgICAgZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgeworICAgICAgICBpbnN0ciA9ICZiLT5iX2luc3RyW2ldOworICAgICAgICBkZXB0aCArPSBvcGNvZGVfc3RhY2tfZWZmZWN0KGluc3RyLT5pX29wY29kZSwgaW5zdHItPmlfb3BhcmcpOworICAgICAgICBpZiAoZGVwdGggPiBtYXhkZXB0aCkKKyAgICAgICAgICAgIG1heGRlcHRoID0gZGVwdGg7CisgICAgICAgIGFzc2VydChkZXB0aCA+PSAwKTsgLyogaW52YWxpZCBjb2RlIG9yIGJ1ZyBpbiBzdGFja2RlcHRoKCkgKi8KKyAgICAgICAgaWYgKGluc3RyLT5pX2pyZWwgfHwgaW5zdHItPmlfamFicykgeworICAgICAgICAgICAgbWF4ZGVwdGggPSBzdGFja2RlcHRoX3dhbGsoYywgaW5zdHItPmlfdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsIG1heGRlcHRoKTsKKyAgICAgICAgICAgIGlmIChpbnN0ci0+aV9vcGNvZGUgPT0gSlVNUF9BQlNPTFVURSB8fAorICAgICAgICAgICAgICAgIGluc3RyLT5pX29wY29kZSA9PSBKVU1QX0ZPUldBUkQpIHsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsgLyogcmVtYWluaW5nIGNvZGUgaXMgZGVhZCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChiLT5iX25leHQpCisgICAgICAgIG1heGRlcHRoID0gc3RhY2tkZXB0aF93YWxrKGMsIGItPmJfbmV4dCwgZGVwdGgsIG1heGRlcHRoKTsKIG91dDoKLQliLT5iX3NlZW4gPSAwOwotCXJldHVybiBtYXhkZXB0aDsKKyAgICBiLT5iX3NlZW4gPSAwOworICAgIHJldHVybiBtYXhkZXB0aDsKIH0KIAogLyogRmluZCB0aGUgZmxvdyBwYXRoIHRoYXQgbmVlZHMgdGhlIGxhcmdlc3Qgc3RhY2suICBXZSBhc3N1bWUgdGhhdApAQCAtMzQ1Nyw0OSArMzQ1Nyw0OSBAQAogc3RhdGljIGludAogc3RhY2tkZXB0aChzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7Ci0JYmFzaWNibG9jayAqYiwgKmVudHJ5YmxvY2s7Ci0JZW50cnlibG9jayA9IE5VTEw7Ci0JZm9yIChiID0gYy0+dS0+dV9ibG9ja3M7IGIgIT0gTlVMTDsgYiA9IGItPmJfbGlzdCkgewotCQliLT5iX3NlZW4gPSAwOwotCQliLT5iX3N0YXJ0ZGVwdGggPSBJTlRfTUlOOwotCQllbnRyeWJsb2NrID0gYjsKLQl9Ci0JaWYgKCFlbnRyeWJsb2NrKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gc3RhY2tkZXB0aF93YWxrKGMsIGVudHJ5YmxvY2ssIDAsIDApOworICAgIGJhc2ljYmxvY2sgKmIsICplbnRyeWJsb2NrOworICAgIGVudHJ5YmxvY2sgPSBOVUxMOworICAgIGZvciAoYiA9IGMtPnUtPnVfYmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5iX2xpc3QpIHsKKyAgICAgICAgYi0+Yl9zZWVuID0gMDsKKyAgICAgICAgYi0+Yl9zdGFydGRlcHRoID0gSU5UX01JTjsKKyAgICAgICAgZW50cnlibG9jayA9IGI7CisgICAgfQorICAgIGlmICghZW50cnlibG9jaykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHN0YWNrZGVwdGhfd2FsayhjLCBlbnRyeWJsb2NrLCAwLCAwKTsKIH0KIAogc3RhdGljIGludAogYXNzZW1ibGVfaW5pdChzdHJ1Y3QgYXNzZW1ibGVyICphLCBpbnQgbmJsb2NrcywgaW50IGZpcnN0bGluZW5vKQogewotCW1lbXNldChhLCAwLCBzaXplb2Yoc3RydWN0IGFzc2VtYmxlcikpOwotCWEtPmFfbGluZW5vID0gZmlyc3RsaW5lbm87Ci0JYS0+YV9ieXRlY29kZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIERFRkFVTFRfQ09ERV9TSVpFKTsKLQlpZiAoIWEtPmFfYnl0ZWNvZGUpCi0JCXJldHVybiAwOwotCWEtPmFfbG5vdGFiID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgREVGQVVMVF9MTk9UQUJfU0laRSk7Ci0JaWYgKCFhLT5hX2xub3RhYikKLQkJcmV0dXJuIDA7Ci0JaWYgKG5ibG9ja3MgPiBQWV9TSVpFX01BWCAvIHNpemVvZihiYXNpY2Jsb2NrICopKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiAwOwotCX0KLQlhLT5hX3Bvc3RvcmRlciA9IChiYXNpY2Jsb2NrICoqKVB5T2JqZWN0X01hbGxvYygKLQkJCQkJICAgIHNpemVvZihiYXNpY2Jsb2NrICopICogbmJsb2Nrcyk7Ci0JaWYgKCFhLT5hX3Bvc3RvcmRlcikgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7CisgICAgbWVtc2V0KGEsIDAsIHNpemVvZihzdHJ1Y3QgYXNzZW1ibGVyKSk7CisgICAgYS0+YV9saW5lbm8gPSBmaXJzdGxpbmVubzsKKyAgICBhLT5hX2J5dGVjb2RlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgREVGQVVMVF9DT0RFX1NJWkUpOworICAgIGlmICghYS0+YV9ieXRlY29kZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYS0+YV9sbm90YWIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBERUZBVUxUX0xOT1RBQl9TSVpFKTsKKyAgICBpZiAoIWEtPmFfbG5vdGFiKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAobmJsb2NrcyA+IFBZX1NJWkVfTUFYIC8gc2l6ZW9mKGJhc2ljYmxvY2sgKikpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGEtPmFfcG9zdG9yZGVyID0gKGJhc2ljYmxvY2sgKiopUHlPYmplY3RfTWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihiYXNpY2Jsb2NrICopICogbmJsb2Nrcyk7CisgICAgaWYgKCFhLT5hX3Bvc3RvcmRlcikgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkCiBhc3NlbWJsZV9mcmVlKHN0cnVjdCBhc3NlbWJsZXIgKmEpCiB7Ci0JUHlfWERFQ1JFRihhLT5hX2J5dGVjb2RlKTsKLQlQeV9YREVDUkVGKGEtPmFfbG5vdGFiKTsKLQlpZiAoYS0+YV9wb3N0b3JkZXIpCi0JCVB5T2JqZWN0X0ZyZWUoYS0+YV9wb3N0b3JkZXIpOworICAgIFB5X1hERUNSRUYoYS0+YV9ieXRlY29kZSk7CisgICAgUHlfWERFQ1JFRihhLT5hX2xub3RhYik7CisgICAgaWYgKGEtPmFfcG9zdG9yZGVyKQorICAgICAgICBQeU9iamVjdF9GcmVlKGEtPmFfcG9zdG9yZGVyKTsKIH0KIAogLyogUmV0dXJuIHRoZSBzaXplIG9mIGEgYmFzaWMgYmxvY2sgaW4gYnl0ZXMuICovCkBAIC0zNTA3LDIyICszNTA3LDIyIEBACiBzdGF0aWMgaW50CiBpbnN0cnNpemUoc3RydWN0IGluc3RyICppbnN0cikKIHsKLQlpZiAoIWluc3RyLT5pX2hhc2FyZykKLQkJcmV0dXJuIDE7CS8qIDEgYnl0ZSBmb3IgdGhlIG9wY29kZSovCi0JaWYgKGluc3RyLT5pX29wYXJnID4gMHhmZmZmKQotCQlyZXR1cm4gNjsJLyogMSAob3Bjb2RlKSArIDEgKEVYVEVOREVEX0FSRyBvcGNvZGUpICsgMiAob3BhcmcpICsgMihvcGFyZyBleHRlbmRlZCkgKi8KLQlyZXR1cm4gMzsgCQkvKiAxIChvcGNvZGUpICsgMiAob3BhcmcpICovCisgICAgaWYgKCFpbnN0ci0+aV9oYXNhcmcpCisgICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBmb3IgdGhlIG9wY29kZSovCisgICAgaWYgKGluc3RyLT5pX29wYXJnID4gMHhmZmZmKQorICAgICAgICByZXR1cm4gNjsgICAgICAgICAgICAgICAvKiAxIChvcGNvZGUpICsgMSAoRVhURU5ERURfQVJHIG9wY29kZSkgKyAyIChvcGFyZykgKyAyKG9wYXJnIGV4dGVuZGVkKSAqLworICAgIHJldHVybiAzOyAgICAgICAgICAgICAgICAgICAvKiAxIChvcGNvZGUpICsgMiAob3BhcmcpICovCiB9CiAKIHN0YXRpYyBpbnQKIGJsb2Nrc2l6ZShiYXNpY2Jsb2NrICpiKQogewotCWludCBpOwotCWludCBzaXplID0gMDsKKyAgICBpbnQgaTsKKyAgICBpbnQgc2l6ZSA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYi0+Yl9pdXNlZDsgaSsrKQotCQlzaXplICs9IGluc3Ryc2l6ZSgmYi0+Yl9pbnN0cltpXSk7Ci0JcmV0dXJuIHNpemU7CisgICAgZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykKKyAgICAgICAgc2l6ZSArPSBpbnN0cnNpemUoJmItPmJfaW5zdHJbaV0pOworICAgIHJldHVybiBzaXplOwogfQogCiAvKiBBbGwgYWJvdXQgYV9sbm90YWIuCkBAIC0zNTMzLDE0ICszNTMzLDE0IEBACiAKIFRoZSBhcnJheSBpcyBjb25jZXB0dWFsbHkgYSBsaXN0IG9mCiAgICAgKGJ5dGVjb2RlIG9mZnNldCBpbmNyZW1lbnQsIGxpbmUgbnVtYmVyIGluY3JlbWVudCkKLXBhaXJzLglUaGUgZGV0YWlscyBhcmUgaW1wb3J0YW50IGFuZCBkZWxpY2F0ZSwgYmVzdCBpbGx1c3RyYXRlZCBieSBleGFtcGxlOgorcGFpcnMuICBUaGUgZGV0YWlscyBhcmUgaW1wb3J0YW50IGFuZCBkZWxpY2F0ZSwgYmVzdCBpbGx1c3RyYXRlZCBieSBleGFtcGxlOgogCi0gICAgYnl0ZSBjb2RlIG9mZnNldAlzb3VyY2UgY29kZSBsaW5lIG51bWJlcgotCTAJCSAgICAxCi0JNgkJICAgIDIKLSAgICAgICA1MAkJICAgIDcKLSAgICAgIDM1MAkJICAzMDcKLSAgICAgIDM2MQkJICAzMDgKKyAgICBieXRlIGNvZGUgb2Zmc2V0ICAgIHNvdXJjZSBjb2RlIGxpbmUgbnVtYmVyCisgICAgMCAgICAgICAgICAgICAgICAgICAgICAgMQorICAgIDYgICAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICA1MCAgICAgICAgICAgICAgICAgICA3CisgICAgICAzNTAgICAgICAgICAgICAgICAgIDMwNworICAgICAgMzYxICAgICAgICAgICAgICAgICAzMDgKIAogVGhlIGZpcnN0IHRyaWNrIGlzIHRoYXQgdGhlc2UgbnVtYmVycyBhcmVuJ3Qgc3RvcmVkLCBvbmx5IHRoZSBpbmNyZW1lbnRzCiBmcm9tIG9uZSByb3cgdG8gdGhlIG5leHQgKHRoaXMgZG9lc24ndCByZWFsbHkgd29yaywgYnV0IGl0J3MgYSBzdGFydCk6CkBAIC0zNTUyLDExNiArMzU1MiwxMTYgQEAKIG9mZnNldHMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgbGluZSAjcyBib3RoIGluY3JlYXNlIG1vbm90b25pY2FsbHksIGFuZCAoYikKIGlmIGF0IGxlYXN0IG9uZSBjb2x1bW4ganVtcHMgYnkgbW9yZSB0aGFuIDI1NSBmcm9tIG9uZSByb3cgdG8gdGhlIG5leHQsIG1vcmUKIHRoYW4gb25lIHBhaXIgaXMgd3JpdHRlbiB0byB0aGUgdGFibGUuIEluIGNhc2UgI2IsIHRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cKLWZyb20gbG9va2luZyBhdCB0aGUgdGFibGUgbGF0ZXIgaG93IG1hbnkgd2VyZSB3cml0dGVuLglUaGF0J3MgdGhlIGRlbGljYXRlCitmcm9tIGxvb2tpbmcgYXQgdGhlIHRhYmxlIGxhdGVyIGhvdyBtYW55IHdlcmUgd3JpdHRlbi4gIFRoYXQncyB0aGUgZGVsaWNhdGUKIHBhcnQuICBBIHVzZXIgb2YgY19sbm90YWIgZGVzaXJpbmcgdG8gZmluZCB0aGUgc291cmNlIGxpbmUgbnVtYmVyCiBjb3JyZXNwb25kaW5nIHRvIGEgYnl0ZWNvZGUgYWRkcmVzcyBBIHNob3VsZCBkbyBzb21ldGhpbmcgbGlrZSB0aGlzCiAKICAgICBsaW5lbm8gPSBhZGRyID0gMAogICAgIGZvciBhZGRyX2luY3IsIGxpbmVfaW5jciBpbiBjX2xub3RhYjoKLQlhZGRyICs9IGFkZHJfaW5jcgotCWlmIGFkZHIgPiBBOgotCSAgICByZXR1cm4gbGluZW5vCi0JbGluZW5vICs9IGxpbmVfaW5jcgorICAgIGFkZHIgKz0gYWRkcl9pbmNyCisgICAgaWYgYWRkciA+IEE6CisgICAgICAgIHJldHVybiBsaW5lbm8KKyAgICBsaW5lbm8gKz0gbGluZV9pbmNyCiAKIEluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmssIHdoZW4gdGhlIGFkZHIgZmllbGQgaW5jcmVtZW50cyBieSBtb3JlIHRoYW4gMjU1LAogdGhlIGxpbmUgIyBpbmNyZW1lbnQgaW4gZWFjaCBwYWlyIGdlbmVyYXRlZCBtdXN0IGJlIDAgdW50aWwgdGhlIHJlbWFpbmluZyBhZGRyCiBpbmNyZW1lbnQgaXMgPCAyNTYuICBTbywgaW4gdGhlIGV4YW1wbGUgYWJvdmUsIGFzc2VtYmxlX2xub3RhYiAoaXQgdXNlZAogdG8gYmUgY2FsbGVkIGNvbV9zZXRfbGluZW5vKSBzaG91bGQgbm90IChhcyB3YXMgYWN0dWFsbHkgZG9uZSB1bnRpbCAyLjIpCi1leHBhbmQgMzAwLCAzMDAgdG8gMjU1LCAyNTUsIDQ1LCA0NSwgCi0JICAgIGJ1dCB0byAyNTUsCSAgMCwgNDUsIDI1NSwgMCwgNDUuCitleHBhbmQgMzAwLCAzMDAgdG8gMjU1LCAyNTUsIDQ1LCA0NSwKKyAgICAgICAgICAgIGJ1dCB0byAyNTUsICAgMCwgNDUsIDI1NSwgMCwgNDUuCiAqLwogCiBzdGF0aWMgaW50CiBhc3NlbWJsZV9sbm90YWIoc3RydWN0IGFzc2VtYmxlciAqYSwgc3RydWN0IGluc3RyICppKQogewotCWludCBkX2J5dGVjb2RlLCBkX2xpbmVubzsKLQlpbnQgbGVuOwotCXVuc2lnbmVkIGNoYXIgKmxub3RhYjsKKyAgICBpbnQgZF9ieXRlY29kZSwgZF9saW5lbm87CisgICAgaW50IGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyICpsbm90YWI7CiAKLQlkX2J5dGVjb2RlID0gYS0+YV9vZmZzZXQgLSBhLT5hX2xpbmVub19vZmY7Ci0JZF9saW5lbm8gPSBpLT5pX2xpbmVubyAtIGEtPmFfbGluZW5vOworICAgIGRfYnl0ZWNvZGUgPSBhLT5hX29mZnNldCAtIGEtPmFfbGluZW5vX29mZjsKKyAgICBkX2xpbmVubyA9IGktPmlfbGluZW5vIC0gYS0+YV9saW5lbm87CiAKLQlhc3NlcnQoZF9ieXRlY29kZSA+PSAwKTsKLQlhc3NlcnQoZF9saW5lbm8gPj0gMCk7CisgICAgYXNzZXJ0KGRfYnl0ZWNvZGUgPj0gMCk7CisgICAgYXNzZXJ0KGRfbGluZW5vID49IDApOwogCi0JaWYoZF9ieXRlY29kZSA9PSAwICYmIGRfbGluZW5vID09IDApCi0JCXJldHVybiAxOworICAgIGlmKGRfYnl0ZWNvZGUgPT0gMCAmJiBkX2xpbmVubyA9PSAwKQorICAgICAgICByZXR1cm4gMTsKIAotCWlmIChkX2J5dGVjb2RlID4gMjU1KSB7Ci0JCWludCBqLCBuYnl0ZXMsIG5jb2RlcyA9IGRfYnl0ZWNvZGUgLyAyNTU7Ci0JCW5ieXRlcyA9IGEtPmFfbG5vdGFiX29mZiArIDIgKiBuY29kZXM7Ci0JCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGEtPmFfbG5vdGFiKTsKLQkJaWYgKG5ieXRlcyA+PSBsZW4pIHsKLQkJCWlmICgobGVuIDw9IElOVF9NQVggLyAyKSAmJiAobGVuICogMiA8IG5ieXRlcykpCi0JCQkJbGVuID0gbmJ5dGVzOwotCQkJZWxzZSBpZiAobGVuIDw9IElOVF9NQVggLyAyKQotCQkJCWxlbiAqPSAyOwotCQkJZWxzZSB7Ci0JCQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWlmIChfUHlTdHJpbmdfUmVzaXplKCZhLT5hX2xub3RhYiwgbGVuKSA8IDApCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikKLQkJCSAgIFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7Ci0JCWZvciAoaiA9IDA7IGogPCBuY29kZXM7IGorKykgewotCQkJKmxub3RhYisrID0gMjU1OwotCQkJKmxub3RhYisrID0gMDsKLQkJfQotCQlkX2J5dGVjb2RlIC09IG5jb2RlcyAqIDI1NTsKLQkJYS0+YV9sbm90YWJfb2ZmICs9IG5jb2RlcyAqIDI7Ci0JfQotCWFzc2VydChkX2J5dGVjb2RlIDw9IDI1NSk7Ci0JaWYgKGRfbGluZW5vID4gMjU1KSB7Ci0JCWludCBqLCBuYnl0ZXMsIG5jb2RlcyA9IGRfbGluZW5vIC8gMjU1OwotCQluYnl0ZXMgPSBhLT5hX2xub3RhYl9vZmYgKyAyICogbmNvZGVzOwotCQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRShhLT5hX2xub3RhYik7Ci0JCWlmIChuYnl0ZXMgPj0gbGVuKSB7Ci0JCQlpZiAoKGxlbiA8PSBJTlRfTUFYIC8gMikgJiYgbGVuICogMiA8IG5ieXRlcykKLQkJCQlsZW4gPSBuYnl0ZXM7Ci0JCQllbHNlIGlmIChsZW4gPD0gSU5UX01BWCAvIDIpCi0JCQkJbGVuICo9IDI7Ci0JCQllbHNlIHsKLQkJCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJmEtPmFfbG5vdGFiLCBsZW4pIDwgMCkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQotCQkJICAgUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKLQkJKmxub3RhYisrID0gZF9ieXRlY29kZTsKLQkJKmxub3RhYisrID0gMjU1OwotCQlkX2J5dGVjb2RlID0gMDsKLQkJZm9yIChqID0gMTsgaiA8IG5jb2RlczsgaisrKSB7Ci0JCQkqbG5vdGFiKysgPSAwOwotCQkJKmxub3RhYisrID0gMjU1OwotCQl9Ci0JCWRfbGluZW5vIC09IG5jb2RlcyAqIDI1NTsKLQkJYS0+YV9sbm90YWJfb2ZmICs9IG5jb2RlcyAqIDI7Ci0JfQorICAgIGlmIChkX2J5dGVjb2RlID4gMjU1KSB7CisgICAgICAgIGludCBqLCBuYnl0ZXMsIG5jb2RlcyA9IGRfYnl0ZWNvZGUgLyAyNTU7CisgICAgICAgIG5ieXRlcyA9IGEtPmFfbG5vdGFiX29mZiArIDIgKiBuY29kZXM7CisgICAgICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGEtPmFfbG5vdGFiKTsKKyAgICAgICAgaWYgKG5ieXRlcyA+PSBsZW4pIHsKKyAgICAgICAgICAgIGlmICgobGVuIDw9IElOVF9NQVggLyAyKSAmJiAobGVuICogMiA8IG5ieXRlcykpCisgICAgICAgICAgICAgICAgbGVuID0gbmJ5dGVzOworICAgICAgICAgICAgZWxzZSBpZiAobGVuIDw9IElOVF9NQVggLyAyKQorICAgICAgICAgICAgICAgIGxlbiAqPSAyOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZhLT5hX2xub3RhYiwgbGVuKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikKKyAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmNvZGVzOyBqKyspIHsKKyAgICAgICAgICAgICpsbm90YWIrKyA9IDI1NTsKKyAgICAgICAgICAgICpsbm90YWIrKyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZF9ieXRlY29kZSAtPSBuY29kZXMgKiAyNTU7CisgICAgICAgIGEtPmFfbG5vdGFiX29mZiArPSBuY29kZXMgKiAyOworICAgIH0KKyAgICBhc3NlcnQoZF9ieXRlY29kZSA8PSAyNTUpOworICAgIGlmIChkX2xpbmVubyA+IDI1NSkgeworICAgICAgICBpbnQgaiwgbmJ5dGVzLCBuY29kZXMgPSBkX2xpbmVubyAvIDI1NTsKKyAgICAgICAgbmJ5dGVzID0gYS0+YV9sbm90YWJfb2ZmICsgMiAqIG5jb2RlczsKKyAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoYS0+YV9sbm90YWIpOworICAgICAgICBpZiAobmJ5dGVzID49IGxlbikgeworICAgICAgICAgICAgaWYgKChsZW4gPD0gSU5UX01BWCAvIDIpICYmIGxlbiAqIDIgPCBuYnl0ZXMpCisgICAgICAgICAgICAgICAgbGVuID0gbmJ5dGVzOworICAgICAgICAgICAgZWxzZSBpZiAobGVuIDw9IElOVF9NQVggLyAyKQorICAgICAgICAgICAgICAgIGxlbiAqPSAyOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZhLT5hX2xub3RhYiwgbGVuKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikKKyAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOworICAgICAgICAqbG5vdGFiKysgPSBkX2J5dGVjb2RlOworICAgICAgICAqbG5vdGFiKysgPSAyNTU7CisgICAgICAgIGRfYnl0ZWNvZGUgPSAwOworICAgICAgICBmb3IgKGogPSAxOyBqIDwgbmNvZGVzOyBqKyspIHsKKyAgICAgICAgICAgICpsbm90YWIrKyA9IDA7CisgICAgICAgICAgICAqbG5vdGFiKysgPSAyNTU7CisgICAgICAgIH0KKyAgICAgICAgZF9saW5lbm8gLT0gbmNvZGVzICogMjU1OworICAgICAgICBhLT5hX2xub3RhYl9vZmYgKz0gbmNvZGVzICogMjsKKyAgICB9CiAKLQlsZW4gPSBQeVN0cmluZ19HRVRfU0laRShhLT5hX2xub3RhYik7Ci0JaWYgKGEtPmFfbG5vdGFiX29mZiArIDIgPj0gbGVuKSB7Ci0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZhLT5hX2xub3RhYiwgbGVuICogMikgPCAwKQotCQkJcmV0dXJuIDA7Ci0JfQotCWxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopCi0JCQlQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOworICAgIGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGEtPmFfbG5vdGFiKTsKKyAgICBpZiAoYS0+YV9sbm90YWJfb2ZmICsgMiA+PSBsZW4pIHsKKyAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJmEtPmFfbG5vdGFiLCBsZW4gKiAyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikKKyAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKIAotCWEtPmFfbG5vdGFiX29mZiArPSAyOwotCWlmIChkX2J5dGVjb2RlKSB7Ci0JCSpsbm90YWIrKyA9IGRfYnl0ZWNvZGU7Ci0JCSpsbm90YWIrKyA9IGRfbGluZW5vOwotCX0KLQllbHNlIHsJLyogRmlyc3QgbGluZSBvZiBhIGJsb2NrOyBkZWYgc3RtdCwgZXRjLiAqLwotCQkqbG5vdGFiKysgPSAwOwotCQkqbG5vdGFiKysgPSBkX2xpbmVubzsKLQl9Ci0JYS0+YV9saW5lbm8gPSBpLT5pX2xpbmVubzsKLQlhLT5hX2xpbmVub19vZmYgPSBhLT5hX29mZnNldDsKLQlyZXR1cm4gMTsKKyAgICBhLT5hX2xub3RhYl9vZmYgKz0gMjsKKyAgICBpZiAoZF9ieXRlY29kZSkgeworICAgICAgICAqbG5vdGFiKysgPSBkX2J5dGVjb2RlOworICAgICAgICAqbG5vdGFiKysgPSBkX2xpbmVubzsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgLyogRmlyc3QgbGluZSBvZiBhIGJsb2NrOyBkZWYgc3RtdCwgZXRjLiAqLworICAgICAgICAqbG5vdGFiKysgPSAwOworICAgICAgICAqbG5vdGFiKysgPSBkX2xpbmVubzsKKyAgICB9CisgICAgYS0+YV9saW5lbm8gPSBpLT5pX2xpbmVubzsKKyAgICBhLT5hX2xpbmVub19vZmYgPSBhLT5hX29mZnNldDsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogYXNzZW1ibGVfZW1pdCgpCkBAIC0zNjcyLDIzMSArMzY3MiwyMzEgQEAKIHN0YXRpYyBpbnQKIGFzc2VtYmxlX2VtaXQoc3RydWN0IGFzc2VtYmxlciAqYSwgc3RydWN0IGluc3RyICppKQogewotCWludCBzaXplLCBhcmcgPSAwLCBleHQgPSAwOwotCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoYS0+YV9ieXRlY29kZSk7Ci0JY2hhciAqY29kZTsKKyAgICBpbnQgc2l6ZSwgYXJnID0gMCwgZXh0ID0gMDsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGEtPmFfYnl0ZWNvZGUpOworICAgIGNoYXIgKmNvZGU7CiAKLQlzaXplID0gaW5zdHJzaXplKGkpOwotCWlmIChpLT5pX2hhc2FyZykgewotCQlhcmcgPSBpLT5pX29wYXJnOwotCQlleHQgPSBhcmcgPj4gMTY7Ci0JfQotCWlmIChpLT5pX2xpbmVubyAmJiAhYXNzZW1ibGVfbG5vdGFiKGEsIGkpKQotCQlyZXR1cm4gMDsKLQlpZiAoYS0+YV9vZmZzZXQgKyBzaXplID49IGxlbikgewotCQlpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChfUHlTdHJpbmdfUmVzaXplKCZhLT5hX2J5dGVjb2RlLCBsZW4gKiAyKSA8IDApCi0JCSAgICByZXR1cm4gMDsKLQl9Ci0JY29kZSA9IFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2J5dGVjb2RlKSArIGEtPmFfb2Zmc2V0OwotCWEtPmFfb2Zmc2V0ICs9IHNpemU7Ci0JaWYgKHNpemUgPT0gNikgewotCQlhc3NlcnQoaS0+aV9oYXNhcmcpOwotCQkqY29kZSsrID0gKGNoYXIpRVhURU5ERURfQVJHOwotCQkqY29kZSsrID0gZXh0ICYgMHhmZjsKLQkJKmNvZGUrKyA9IGV4dCA+PiA4OwotCQlhcmcgJj0gMHhmZmZmOwotCX0KLQkqY29kZSsrID0gaS0+aV9vcGNvZGU7Ci0JaWYgKGktPmlfaGFzYXJnKSB7Ci0JCWFzc2VydChzaXplID09IDMgfHwgc2l6ZSA9PSA2KTsKLQkJKmNvZGUrKyA9IGFyZyAmIDB4ZmY7Ci0JCSpjb2RlKysgPSBhcmcgPj4gODsKLQl9Ci0JcmV0dXJuIDE7CisgICAgc2l6ZSA9IGluc3Ryc2l6ZShpKTsKKyAgICBpZiAoaS0+aV9oYXNhcmcpIHsKKyAgICAgICAgYXJnID0gaS0+aV9vcGFyZzsKKyAgICAgICAgZXh0ID0gYXJnID4+IDE2OworICAgIH0KKyAgICBpZiAoaS0+aV9saW5lbm8gJiYgIWFzc2VtYmxlX2xub3RhYihhLCBpKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGEtPmFfb2Zmc2V0ICsgc2l6ZSA+PSBsZW4pIHsKKyAgICAgICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gMikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS0+YV9ieXRlY29kZSwgbGVuICogMikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvZGUgPSBQeVN0cmluZ19BU19TVFJJTkcoYS0+YV9ieXRlY29kZSkgKyBhLT5hX29mZnNldDsKKyAgICBhLT5hX29mZnNldCArPSBzaXplOworICAgIGlmIChzaXplID09IDYpIHsKKyAgICAgICAgYXNzZXJ0KGktPmlfaGFzYXJnKTsKKyAgICAgICAgKmNvZGUrKyA9IChjaGFyKUVYVEVOREVEX0FSRzsKKyAgICAgICAgKmNvZGUrKyA9IGV4dCAmIDB4ZmY7CisgICAgICAgICpjb2RlKysgPSBleHQgPj4gODsKKyAgICAgICAgYXJnICY9IDB4ZmZmZjsKKyAgICB9CisgICAgKmNvZGUrKyA9IGktPmlfb3Bjb2RlOworICAgIGlmIChpLT5pX2hhc2FyZykgeworICAgICAgICBhc3NlcnQoc2l6ZSA9PSAzIHx8IHNpemUgPT0gNik7CisgICAgICAgICpjb2RlKysgPSBhcmcgJiAweGZmOworICAgICAgICAqY29kZSsrID0gYXJnID4+IDg7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogYXNzZW1ibGVfanVtcF9vZmZzZXRzKHN0cnVjdCBhc3NlbWJsZXIgKmEsIHN0cnVjdCBjb21waWxlciAqYykKIHsKLQliYXNpY2Jsb2NrICpiOwotCWludCBic2l6ZSwgdG90c2l6ZSwgZXh0ZW5kZWRfYXJnX2NvdW50LCBsYXN0X2V4dGVuZGVkX2FyZ19jb3VudCA9IDA7Ci0JaW50IGk7CisgICAgYmFzaWNibG9jayAqYjsKKyAgICBpbnQgYnNpemUsIHRvdHNpemUsIGV4dGVuZGVkX2FyZ19jb3VudCwgbGFzdF9leHRlbmRlZF9hcmdfY291bnQgPSAwOworICAgIGludCBpOwogCi0JLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIGJsb2NrIGFuZCBmaXh1cCBqdW1wIGFyZ3MuCi0JICAgUmVwbGFjZSBibG9jayBwb2ludGVyIHdpdGggcG9zaXRpb24gaW4gYnl0ZWNvZGUuICovCisgICAgLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIGJsb2NrIGFuZCBmaXh1cCBqdW1wIGFyZ3MuCisgICAgICAgUmVwbGFjZSBibG9jayBwb2ludGVyIHdpdGggcG9zaXRpb24gaW4gYnl0ZWNvZGUuICovCiBzdGFydDoKLQl0b3RzaXplID0gMDsKLQlmb3IgKGkgPSBhLT5hX25ibG9ja3MgLSAxOyBpID49IDA7IGktLSkgewotCQliID0gYS0+YV9wb3N0b3JkZXJbaV07Ci0JCWJzaXplID0gYmxvY2tzaXplKGIpOwotCQliLT5iX29mZnNldCA9IHRvdHNpemU7Ci0JCXRvdHNpemUgKz0gYnNpemU7Ci0JfQotCWV4dGVuZGVkX2FyZ19jb3VudCA9IDA7Ci0JZm9yIChiID0gYy0+dS0+dV9ibG9ja3M7IGIgIT0gTlVMTDsgYiA9IGItPmJfbGlzdCkgewotCQlic2l6ZSA9IGItPmJfb2Zmc2V0OwotCQlmb3IgKGkgPSAwOyBpIDwgYi0+Yl9pdXNlZDsgaSsrKSB7Ci0JCQlzdHJ1Y3QgaW5zdHIgKmluc3RyID0gJmItPmJfaW5zdHJbaV07Ci0JCQkvKiBSZWxhdGl2ZSBqdW1wcyBhcmUgY29tcHV0ZWQgcmVsYXRpdmUgdG8KLQkJCSAgIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIGFmdGVyIGZldGNoaW5nCi0JCQkgICB0aGUganVtcCBpbnN0cnVjdGlvbi4KLQkJCSovCi0JCQlic2l6ZSArPSBpbnN0cnNpemUoaW5zdHIpOwotCQkJaWYgKGluc3RyLT5pX2phYnMpCi0JCQkJaW5zdHItPmlfb3BhcmcgPSBpbnN0ci0+aV90YXJnZXQtPmJfb2Zmc2V0OwotCQkJZWxzZSBpZiAoaW5zdHItPmlfanJlbCkgewotCQkJCWludCBkZWx0YSA9IGluc3RyLT5pX3RhcmdldC0+Yl9vZmZzZXQgLSBic2l6ZTsKLQkJCQlpbnN0ci0+aV9vcGFyZyA9IGRlbHRhOwotCQkJfQotCQkJZWxzZQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGluc3RyLT5pX29wYXJnID4gMHhmZmZmKQotCQkJCWV4dGVuZGVkX2FyZ19jb3VudCsrOwotCQl9Ci0JfQorICAgIHRvdHNpemUgPSAwOworICAgIGZvciAoaSA9IGEtPmFfbmJsb2NrcyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGIgPSBhLT5hX3Bvc3RvcmRlcltpXTsKKyAgICAgICAgYnNpemUgPSBibG9ja3NpemUoYik7CisgICAgICAgIGItPmJfb2Zmc2V0ID0gdG90c2l6ZTsKKyAgICAgICAgdG90c2l6ZSArPSBic2l6ZTsKKyAgICB9CisgICAgZXh0ZW5kZWRfYXJnX2NvdW50ID0gMDsKKyAgICBmb3IgKGIgPSBjLT51LT51X2Jsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+Yl9saXN0KSB7CisgICAgICAgIGJzaXplID0gYi0+Yl9vZmZzZXQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKKyAgICAgICAgICAgIHN0cnVjdCBpbnN0ciAqaW5zdHIgPSAmYi0+Yl9pbnN0cltpXTsKKyAgICAgICAgICAgIC8qIFJlbGF0aXZlIGp1bXBzIGFyZSBjb21wdXRlZCByZWxhdGl2ZSB0bworICAgICAgICAgICAgICAgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgYWZ0ZXIgZmV0Y2hpbmcKKyAgICAgICAgICAgICAgIHRoZSBqdW1wIGluc3RydWN0aW9uLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJzaXplICs9IGluc3Ryc2l6ZShpbnN0cik7CisgICAgICAgICAgICBpZiAoaW5zdHItPmlfamFicykKKyAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGFyZyA9IGluc3RyLT5pX3RhcmdldC0+Yl9vZmZzZXQ7CisgICAgICAgICAgICBlbHNlIGlmIChpbnN0ci0+aV9qcmVsKSB7CisgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gaW5zdHItPmlfdGFyZ2V0LT5iX29mZnNldCAtIGJzaXplOworICAgICAgICAgICAgICAgIGluc3RyLT5pX29wYXJnID0gZGVsdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoaW5zdHItPmlfb3BhcmcgPiAweGZmZmYpCisgICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnX2NvdW50Kys7CisgICAgICAgIH0KKyAgICB9CiAKLQkvKiBYWFg6IFRoaXMgaXMgYW4gYXdmdWwgaGFjayB0aGF0IGNvdWxkIGh1cnQgcGVyZm9ybWFuY2UsIGJ1dAotCQlvbiB0aGUgYnJpZ2h0IHNpZGUgaXQgc2hvdWxkIHdvcmsgdW50aWwgd2UgY29tZSB1cAotCQl3aXRoIGEgYmV0dGVyIHNvbHV0aW9uLgorICAgIC8qIFhYWDogVGhpcyBpcyBhbiBhd2Z1bCBoYWNrIHRoYXQgY291bGQgaHVydCBwZXJmb3JtYW5jZSwgYnV0CisgICAgICAgIG9uIHRoZSBicmlnaHQgc2lkZSBpdCBzaG91bGQgd29yayB1bnRpbCB3ZSBjb21lIHVwCisgICAgICAgIHdpdGggYSBiZXR0ZXIgc29sdXRpb24uCiAKLQkJSW4gdGhlIG1lYW50aW1lLCBzaG91bGQgdGhlIGdvdG8gYmUgZHJvcHBlZCBpbiBmYXZvcgotCQlvZiBhIGxvb3A/CisgICAgICAgIEluIHRoZSBtZWFudGltZSwgc2hvdWxkIHRoZSBnb3RvIGJlIGRyb3BwZWQgaW4gZmF2b3IKKyAgICAgICAgb2YgYSBsb29wPwogCi0JCVRoZSBpc3N1ZSBpcyB0aGF0IGluIHRoZSBmaXJzdCBsb29wIGJsb2Nrc2l6ZSgpIGlzIGNhbGxlZAotCQl3aGljaCBjYWxscyBpbnN0cnNpemUoKSB3aGljaCByZXF1aXJlcyBpX29wYXJnIGJlIHNldAotCQlhcHByb3ByaWF0ZWx5LglUaGVyZSBpcyBhIGJvb3RzdHJhcCBwcm9ibGVtIGJlY2F1c2UKLQkJaV9vcGFyZyBpcyBjYWxjdWxhdGVkIGluIHRoZSBzZWNvbmQgbG9vcCBhYm92ZS4KKyAgICAgICAgVGhlIGlzc3VlIGlzIHRoYXQgaW4gdGhlIGZpcnN0IGxvb3AgYmxvY2tzaXplKCkgaXMgY2FsbGVkCisgICAgICAgIHdoaWNoIGNhbGxzIGluc3Ryc2l6ZSgpIHdoaWNoIHJlcXVpcmVzIGlfb3BhcmcgYmUgc2V0CisgICAgICAgIGFwcHJvcHJpYXRlbHkuICAgICAgICAgIFRoZXJlIGlzIGEgYm9vdHN0cmFwIHByb2JsZW0gYmVjYXVzZQorICAgICAgICBpX29wYXJnIGlzIGNhbGN1bGF0ZWQgaW4gdGhlIHNlY29uZCBsb29wIGFib3ZlLgogCi0JCVNvIHdlIGxvb3AgdW50aWwgd2Ugc3RvcCBzZWVpbmcgbmV3IEVYVEVOREVEX0FSR3MuCi0JCVRoZSBvbmx5IEVYVEVOREVEX0FSR3MgdGhhdCBjb3VsZCBiZSBwb3BwaW5nIHVwIGFyZQotCQlvbmVzIGluIGp1bXAgaW5zdHJ1Y3Rpb25zLiAgU28gdGhpcyBzaG91bGQgY29udmVyZ2UKLQkJZmFpcmx5IHF1aWNrbHkuCi0JKi8KLQlpZiAobGFzdF9leHRlbmRlZF9hcmdfY291bnQgIT0gZXh0ZW5kZWRfYXJnX2NvdW50KSB7Ci0JCWxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50ID0gZXh0ZW5kZWRfYXJnX2NvdW50OwotCQlnb3RvIHN0YXJ0OwotCX0KKyAgICAgICAgU28gd2UgbG9vcCB1bnRpbCB3ZSBzdG9wIHNlZWluZyBuZXcgRVhURU5ERURfQVJHcy4KKyAgICAgICAgVGhlIG9ubHkgRVhURU5ERURfQVJHcyB0aGF0IGNvdWxkIGJlIHBvcHBpbmcgdXAgYXJlCisgICAgICAgIG9uZXMgaW4ganVtcCBpbnN0cnVjdGlvbnMuICBTbyB0aGlzIHNob3VsZCBjb252ZXJnZQorICAgICAgICBmYWlybHkgcXVpY2tseS4KKyAgICAqLworICAgIGlmIChsYXN0X2V4dGVuZGVkX2FyZ19jb3VudCAhPSBleHRlbmRlZF9hcmdfY291bnQpIHsKKyAgICAgICAgbGFzdF9leHRlbmRlZF9hcmdfY291bnQgPSBleHRlbmRlZF9hcmdfY291bnQ7CisgICAgICAgIGdvdG8gc3RhcnQ7CisgICAgfQogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZGljdF9rZXlzX2lub3JkZXIoUHlPYmplY3QgKmRpY3QsIGludCBvZmZzZXQpCiB7Ci0JUHlPYmplY3QgKnR1cGxlLCAqaywgKnY7Ci0JUHlfc3NpemVfdCBpLCBwb3MgPSAwLCBzaXplID0gUHlEaWN0X1NpemUoZGljdCk7CisgICAgUHlPYmplY3QgKnR1cGxlLCAqaywgKnY7CisgICAgUHlfc3NpemVfdCBpLCBwb3MgPSAwLCBzaXplID0gUHlEaWN0X1NpemUoZGljdCk7CiAKLQl0dXBsZSA9IFB5VHVwbGVfTmV3KHNpemUpOwotCWlmICh0dXBsZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl3aGlsZSAoUHlEaWN0X05leHQoZGljdCwgJnBvcywgJmssICZ2KSkgewotCQlpID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJayA9IFB5VHVwbGVfR0VUX0lURU0oaywgMCk7Ci0JCVB5X0lOQ1JFRihrKTsKLQkJYXNzZXJ0KChpIC0gb2Zmc2V0KSA8IHNpemUpOwotCQlhc3NlcnQoKGkgLSBvZmZzZXQpID49IDApOwotCQlQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCBpIC0gb2Zmc2V0LCBrKTsKLQl9Ci0JcmV0dXJuIHR1cGxlOworICAgIHR1cGxlID0gUHlUdXBsZV9OZXcoc2l6ZSk7CisgICAgaWYgKHR1cGxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdoaWxlIChQeURpY3RfTmV4dChkaWN0LCAmcG9zLCAmaywgJnYpKSB7CisgICAgICAgIGkgPSBQeUludF9BU19MT05HKHYpOworICAgICAgICBrID0gUHlUdXBsZV9HRVRfSVRFTShrLCAwKTsKKyAgICAgICAgUHlfSU5DUkVGKGspOworICAgICAgICBhc3NlcnQoKGkgLSBvZmZzZXQpIDwgc2l6ZSk7CisgICAgICAgIGFzc2VydCgoaSAtIG9mZnNldCkgPj0gMCk7CisgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIGkgLSBvZmZzZXQsIGspOworICAgIH0KKyAgICByZXR1cm4gdHVwbGU7CiB9CiAKIHN0YXRpYyBpbnQKIGNvbXB1dGVfY29kZV9mbGFncyhzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7Ci0JUHlTVEVudHJ5T2JqZWN0ICpzdGUgPSBjLT51LT51X3N0ZTsKLQlpbnQgZmxhZ3MgPSAwLCBuOwotCWlmIChzdGUtPnN0ZV90eXBlICE9IE1vZHVsZUJsb2NrKQotCQlmbGFncyB8PSBDT19ORVdMT0NBTFM7Ci0JaWYgKHN0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jaykgewotCQlpZiAoIXN0ZS0+c3RlX3Vub3B0aW1pemVkKQotCQkJZmxhZ3MgfD0gQ09fT1BUSU1JWkVEOwotCQlpZiAoc3RlLT5zdGVfbmVzdGVkKQotCQkJZmxhZ3MgfD0gQ09fTkVTVEVEOwotCQlpZiAoc3RlLT5zdGVfZ2VuZXJhdG9yKQotCQkJZmxhZ3MgfD0gQ09fR0VORVJBVE9SOwotCX0KLQlpZiAoc3RlLT5zdGVfdmFyYXJncykKLQkJZmxhZ3MgfD0gQ09fVkFSQVJHUzsKLQlpZiAoc3RlLT5zdGVfdmFya2V5d29yZHMpCi0JCWZsYWdzIHw9IENPX1ZBUktFWVdPUkRTOwotCWlmIChzdGUtPnN0ZV9nZW5lcmF0b3IpCi0JCWZsYWdzIHw9IENPX0dFTkVSQVRPUjsKKyAgICBQeVNURW50cnlPYmplY3QgKnN0ZSA9IGMtPnUtPnVfc3RlOworICAgIGludCBmbGFncyA9IDAsIG47CisgICAgaWYgKHN0ZS0+c3RlX3R5cGUgIT0gTW9kdWxlQmxvY2spCisgICAgICAgIGZsYWdzIHw9IENPX05FV0xPQ0FMUzsKKyAgICBpZiAoc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrKSB7CisgICAgICAgIGlmICghc3RlLT5zdGVfdW5vcHRpbWl6ZWQpCisgICAgICAgICAgICBmbGFncyB8PSBDT19PUFRJTUlaRUQ7CisgICAgICAgIGlmIChzdGUtPnN0ZV9uZXN0ZWQpCisgICAgICAgICAgICBmbGFncyB8PSBDT19ORVNURUQ7CisgICAgICAgIGlmIChzdGUtPnN0ZV9nZW5lcmF0b3IpCisgICAgICAgICAgICBmbGFncyB8PSBDT19HRU5FUkFUT1I7CisgICAgfQorICAgIGlmIChzdGUtPnN0ZV92YXJhcmdzKQorICAgICAgICBmbGFncyB8PSBDT19WQVJBUkdTOworICAgIGlmIChzdGUtPnN0ZV92YXJrZXl3b3JkcykKKyAgICAgICAgZmxhZ3MgfD0gQ09fVkFSS0VZV09SRFM7CisgICAgaWYgKHN0ZS0+c3RlX2dlbmVyYXRvcikKKyAgICAgICAgZmxhZ3MgfD0gQ09fR0VORVJBVE9SOwogCi0JLyogKE9ubHkpIGluaGVyaXQgY29tcGlsZXJmbGFncyBpbiBQeUNGX01BU0sgKi8KLQlmbGFncyB8PSAoYy0+Y19mbGFncy0+Y2ZfZmxhZ3MgJiBQeUNGX01BU0spOworICAgIC8qIChPbmx5KSBpbmhlcml0IGNvbXBpbGVyZmxhZ3MgaW4gUHlDRl9NQVNLICovCisgICAgZmxhZ3MgfD0gKGMtPmNfZmxhZ3MtPmNmX2ZsYWdzICYgUHlDRl9NQVNLKTsKIAotCW4gPSBQeURpY3RfU2l6ZShjLT51LT51X2ZyZWV2YXJzKTsKLQlpZiAobiA8IDApCi0JICAgIHJldHVybiAtMTsKLQlpZiAobiA9PSAwKSB7Ci0JICAgIG4gPSBQeURpY3RfU2l6ZShjLT51LT51X2NlbGx2YXJzKTsKLQkgICAgaWYgKG4gPCAwKQotCQlyZXR1cm4gLTE7Ci0JICAgIGlmIChuID09IDApIHsKLQkJZmxhZ3MgfD0gQ09fTk9GUkVFOwotCSAgICB9Ci0JfQorICAgIG4gPSBQeURpY3RfU2l6ZShjLT51LT51X2ZyZWV2YXJzKTsKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIG4gPSBQeURpY3RfU2l6ZShjLT51LT51X2NlbGx2YXJzKTsKKyAgICAgICAgaWYgKG4gPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChuID09IDApIHsKKyAgICAgICAgZmxhZ3MgfD0gQ09fTk9GUkVFOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIGZsYWdzOworICAgIHJldHVybiBmbGFnczsKIH0KIAogc3RhdGljIFB5Q29kZU9iamVjdCAqCiBtYWtlY29kZShzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0cnVjdCBhc3NlbWJsZXIgKmEpCiB7Ci0JUHlPYmplY3QgKnRtcDsKLQlQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKLQlQeU9iamVjdCAqY29uc3RzID0gTlVMTDsKLQlQeU9iamVjdCAqbmFtZXMgPSBOVUxMOwotCVB5T2JqZWN0ICp2YXJuYW1lcyA9IE5VTEw7Ci0JUHlPYmplY3QgKmZpbGVuYW1lID0gTlVMTDsKLQlQeU9iamVjdCAqbmFtZSA9IE5VTEw7Ci0JUHlPYmplY3QgKmZyZWV2YXJzID0gTlVMTDsKLQlQeU9iamVjdCAqY2VsbHZhcnMgPSBOVUxMOwotCVB5T2JqZWN0ICpieXRlY29kZSA9IE5VTEw7Ci0JaW50IG5sb2NhbHMsIGZsYWdzOworICAgIFB5T2JqZWN0ICp0bXA7CisgICAgUHlDb2RlT2JqZWN0ICpjbyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNvbnN0cyA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5hbWVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqdmFybmFtZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmaWxlbmFtZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5hbWUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpmcmVldmFycyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmNlbGx2YXJzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYnl0ZWNvZGUgPSBOVUxMOworICAgIGludCBubG9jYWxzLCBmbGFnczsKIAotCXRtcCA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfY29uc3RzLCAwKTsKLQlpZiAoIXRtcCkKLQkJZ290byBlcnJvcjsKLQljb25zdHMgPSBQeVNlcXVlbmNlX0xpc3QodG1wKTsgLyogb3B0aW1pemVfY29kZSByZXF1aXJlcyBhIGxpc3QgKi8KLQlQeV9ERUNSRUYodG1wKTsKKyAgICB0bXAgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X2NvbnN0cywgMCk7CisgICAgaWYgKCF0bXApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgY29uc3RzID0gUHlTZXF1ZW5jZV9MaXN0KHRtcCk7IC8qIG9wdGltaXplX2NvZGUgcmVxdWlyZXMgYSBsaXN0ICovCisgICAgUHlfREVDUkVGKHRtcCk7CiAKLQluYW1lcyA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfbmFtZXMsIDApOwotCXZhcm5hbWVzID0gZGljdF9rZXlzX2lub3JkZXIoYy0+dS0+dV92YXJuYW1lcywgMCk7Ci0JaWYgKCFjb25zdHMgfHwgIW5hbWVzIHx8ICF2YXJuYW1lcykKLQkJZ290byBlcnJvcjsKLSAgICAgIAotCWNlbGx2YXJzID0gZGljdF9rZXlzX2lub3JkZXIoYy0+dS0+dV9jZWxsdmFycywgMCk7Ci0JaWYgKCFjZWxsdmFycykKLQkgICAgZ290byBlcnJvcjsKLQlmcmVldmFycyA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfZnJlZXZhcnMsIFB5VHVwbGVfU2l6ZShjZWxsdmFycykpOwotCWlmICghZnJlZXZhcnMpCi0JICAgIGdvdG8gZXJyb3I7Ci0JZmlsZW5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGMtPmNfZmlsZW5hbWUpOwotCWlmICghZmlsZW5hbWUpCi0JCWdvdG8gZXJyb3I7CisgICAgbmFtZXMgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X25hbWVzLCAwKTsKKyAgICB2YXJuYW1lcyA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfdmFybmFtZXMsIDApOworICAgIGlmICghY29uc3RzIHx8ICFuYW1lcyB8fCAhdmFybmFtZXMpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlubG9jYWxzID0gUHlEaWN0X1NpemUoYy0+dS0+dV92YXJuYW1lcyk7Ci0JZmxhZ3MgPSBjb21wdXRlX2NvZGVfZmxhZ3MoYyk7Ci0JaWYgKGZsYWdzIDwgMCkKLQkJZ290byBlcnJvcjsKKyAgICBjZWxsdmFycyA9IGRpY3Rfa2V5c19pbm9yZGVyKGMtPnUtPnVfY2VsbHZhcnMsIDApOworICAgIGlmICghY2VsbHZhcnMpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZnJlZXZhcnMgPSBkaWN0X2tleXNfaW5vcmRlcihjLT51LT51X2ZyZWV2YXJzLCBQeVR1cGxlX1NpemUoY2VsbHZhcnMpKTsKKyAgICBpZiAoIWZyZWV2YXJzKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGZpbGVuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhjLT5jX2ZpbGVuYW1lKTsKKyAgICBpZiAoIWZpbGVuYW1lKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JYnl0ZWNvZGUgPSBQeUNvZGVfT3B0aW1pemUoYS0+YV9ieXRlY29kZSwgY29uc3RzLCBuYW1lcywgYS0+YV9sbm90YWIpOwotCWlmICghYnl0ZWNvZGUpCi0JCWdvdG8gZXJyb3I7CisgICAgbmxvY2FscyA9IFB5RGljdF9TaXplKGMtPnUtPnVfdmFybmFtZXMpOworICAgIGZsYWdzID0gY29tcHV0ZV9jb2RlX2ZsYWdzKGMpOworICAgIGlmIChmbGFncyA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQl0bXAgPSBQeUxpc3RfQXNUdXBsZShjb25zdHMpOyAvKiBQeUNvZGVfTmV3IHJlcXVpcmVzIGEgdHVwbGUgKi8KLQlpZiAoIXRtcCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYoY29uc3RzKTsKLQljb25zdHMgPSB0bXA7CisgICAgYnl0ZWNvZGUgPSBQeUNvZGVfT3B0aW1pemUoYS0+YV9ieXRlY29kZSwgY29uc3RzLCBuYW1lcywgYS0+YV9sbm90YWIpOworICAgIGlmICghYnl0ZWNvZGUpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQljbyA9IFB5Q29kZV9OZXcoYy0+dS0+dV9hcmdjb3VudCwgbmxvY2Fscywgc3RhY2tkZXB0aChjKSwgZmxhZ3MsCi0JCQlieXRlY29kZSwgY29uc3RzLCBuYW1lcywgdmFybmFtZXMsCi0JCQlmcmVldmFycywgY2VsbHZhcnMsCi0JCQlmaWxlbmFtZSwgYy0+dS0+dV9uYW1lLAotCQkJYy0+dS0+dV9maXJzdGxpbmVubywKLQkJCWEtPmFfbG5vdGFiKTsKKyAgICB0bXAgPSBQeUxpc3RfQXNUdXBsZShjb25zdHMpOyAvKiBQeUNvZGVfTmV3IHJlcXVpcmVzIGEgdHVwbGUgKi8KKyAgICBpZiAoIXRtcCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBQeV9ERUNSRUYoY29uc3RzKTsKKyAgICBjb25zdHMgPSB0bXA7CisKKyAgICBjbyA9IFB5Q29kZV9OZXcoYy0+dS0+dV9hcmdjb3VudCwgbmxvY2Fscywgc3RhY2tkZXB0aChjKSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGJ5dGVjb2RlLCBjb25zdHMsIG5hbWVzLCB2YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgZnJlZXZhcnMsIGNlbGx2YXJzLAorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgYy0+dS0+dV9uYW1lLAorICAgICAgICAgICAgICAgICAgICBjLT51LT51X2ZpcnN0bGluZW5vLAorICAgICAgICAgICAgICAgICAgICBhLT5hX2xub3RhYik7CiAgZXJyb3I6Ci0JUHlfWERFQ1JFRihjb25zdHMpOwotCVB5X1hERUNSRUYobmFtZXMpOwotCVB5X1hERUNSRUYodmFybmFtZXMpOwotCVB5X1hERUNSRUYoZmlsZW5hbWUpOwotCVB5X1hERUNSRUYobmFtZSk7Ci0JUHlfWERFQ1JFRihmcmVldmFycyk7Ci0JUHlfWERFQ1JFRihjZWxsdmFycyk7Ci0JUHlfWERFQ1JFRihieXRlY29kZSk7Ci0JcmV0dXJuIGNvOworICAgIFB5X1hERUNSRUYoY29uc3RzKTsKKyAgICBQeV9YREVDUkVGKG5hbWVzKTsKKyAgICBQeV9YREVDUkVGKHZhcm5hbWVzKTsKKyAgICBQeV9YREVDUkVGKGZpbGVuYW1lKTsKKyAgICBQeV9YREVDUkVGKG5hbWUpOworICAgIFB5X1hERUNSRUYoZnJlZXZhcnMpOworICAgIFB5X1hERUNSRUYoY2VsbHZhcnMpOworICAgIFB5X1hERUNSRUYoYnl0ZWNvZGUpOworICAgIHJldHVybiBjbzsKIH0KIAogCkBAIC0zOTA1LDkwICszOTA1LDkwIEBACiBzdGF0aWMgdm9pZAogZHVtcF9pbnN0cihjb25zdCBzdHJ1Y3QgaW5zdHIgKmkpCiB7Ci0JY29uc3QgY2hhciAqanJlbCA9IGktPmlfanJlbCA/ICJqcmVsICIgOiAiIjsKLQljb25zdCBjaGFyICpqYWJzID0gaS0+aV9qYWJzID8gImphYnMgIiA6ICIiOwotCWNoYXIgYXJnWzEyOF07CisgICAgY29uc3QgY2hhciAqanJlbCA9IGktPmlfanJlbCA/ICJqcmVsICIgOiAiIjsKKyAgICBjb25zdCBjaGFyICpqYWJzID0gaS0+aV9qYWJzID8gImphYnMgIiA6ICIiOworICAgIGNoYXIgYXJnWzEyOF07CiAKLQkqYXJnID0gJ1wwJzsKLQlpZiAoaS0+aV9oYXNhcmcpCi0JCXNwcmludGYoYXJnLCAiYXJnOiAlZCAiLCBpLT5pX29wYXJnKTsKKyAgICAqYXJnID0gJ1wwJzsKKyAgICBpZiAoaS0+aV9oYXNhcmcpCisgICAgICAgIHNwcmludGYoYXJnLCAiYXJnOiAlZCAiLCBpLT5pX29wYXJnKTsKIAotCWZwcmludGYoc3RkZXJyLCAibGluZTogJWQsIG9wY29kZTogJWQgJXMlcyVzXG4iLCAKLQkJCWktPmlfbGluZW5vLCBpLT5pX29wY29kZSwgYXJnLCBqYWJzLCBqcmVsKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImxpbmU6ICVkLCBvcGNvZGU6ICVkICVzJXMlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaS0+aV9saW5lbm8sIGktPmlfb3Bjb2RlLCBhcmcsIGphYnMsIGpyZWwpOwogfQogCiBzdGF0aWMgdm9pZAogZHVtcF9iYXNpY2Jsb2NrKGNvbnN0IGJhc2ljYmxvY2sgKmIpCiB7Ci0JY29uc3QgY2hhciAqc2VlbiA9IGItPmJfc2VlbiA/ICJzZWVuICIgOiAiIjsKLQljb25zdCBjaGFyICpiX3JldHVybiA9IGItPmJfcmV0dXJuID8gInJldHVybiAiIDogIiI7Ci0JZnByaW50ZihzdGRlcnIsICJ1c2VkOiAlZCwgZGVwdGg6ICVkLCBvZmZzZXQ6ICVkICVzJXNcbiIsCi0JCWItPmJfaXVzZWQsIGItPmJfc3RhcnRkZXB0aCwgYi0+Yl9vZmZzZXQsIHNlZW4sIGJfcmV0dXJuKTsKLQlpZiAoYi0+Yl9pbnN0cikgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgewotCQkJZnByaW50ZihzdGRlcnIsICIgIFslMDJkXSAiLCBpKTsKLQkJCWR1bXBfaW5zdHIoYi0+Yl9pbnN0ciArIGkpOwotCQl9Ci0JfQorICAgIGNvbnN0IGNoYXIgKnNlZW4gPSBiLT5iX3NlZW4gPyAic2VlbiAiIDogIiI7CisgICAgY29uc3QgY2hhciAqYl9yZXR1cm4gPSBiLT5iX3JldHVybiA/ICJyZXR1cm4gIiA6ICIiOworICAgIGZwcmludGYoc3RkZXJyLCAidXNlZDogJWQsIGRlcHRoOiAlZCwgb2Zmc2V0OiAlZCAlcyVzXG4iLAorICAgICAgICBiLT5iX2l1c2VkLCBiLT5iX3N0YXJ0ZGVwdGgsIGItPmJfb2Zmc2V0LCBzZWVuLCBiX3JldHVybik7CisgICAgaWYgKGItPmJfaW5zdHIpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBbJTAyZF0gIiwgaSk7CisgICAgICAgICAgICBkdW1wX2luc3RyKGItPmJfaW5zdHIgKyBpKTsKKyAgICAgICAgfQorICAgIH0KIH0KICNlbmRpZgogCiBzdGF0aWMgUHlDb2RlT2JqZWN0ICoKIGFzc2VtYmxlKHN0cnVjdCBjb21waWxlciAqYywgaW50IGFkZE5vbmUpCiB7Ci0JYmFzaWNibG9jayAqYiwgKmVudHJ5YmxvY2s7Ci0Jc3RydWN0IGFzc2VtYmxlciBhOwotCWludCBpLCBqLCBuYmxvY2tzOwotCVB5Q29kZU9iamVjdCAqY28gPSBOVUxMOworICAgIGJhc2ljYmxvY2sgKmIsICplbnRyeWJsb2NrOworICAgIHN0cnVjdCBhc3NlbWJsZXIgYTsKKyAgICBpbnQgaSwgaiwgbmJsb2NrczsKKyAgICBQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKIAotCS8qIE1ha2Ugc3VyZSBldmVyeSBibG9jayB0aGF0IGZhbGxzIG9mZiB0aGUgZW5kIHJldHVybnMgTm9uZS4KLQkgICBYWFggTkVYVF9CTE9DSygpIGlzbid0IHF1aXRlIHJpZ2h0LCBiZWNhdXNlIGlmIHRoZSBsYXN0Ci0JICAgYmxvY2sgZW5kcyB3aXRoIGEganVtcCBvciByZXR1cm4gYl9uZXh0IHNob3VsZG4ndCBzZXQuCi0JICovCi0JaWYgKCFjLT51LT51X2N1cmJsb2NrLT5iX3JldHVybikgewotCQlORVhUX0JMT0NLKGMpOwotCQlpZiAoYWRkTm9uZSkKLQkJCUFERE9QX08oYywgTE9BRF9DT05TVCwgUHlfTm9uZSwgY29uc3RzKTsKLQkJQURET1AoYywgUkVUVVJOX1ZBTFVFKTsKLQl9CisgICAgLyogTWFrZSBzdXJlIGV2ZXJ5IGJsb2NrIHRoYXQgZmFsbHMgb2ZmIHRoZSBlbmQgcmV0dXJucyBOb25lLgorICAgICAgIFhYWCBORVhUX0JMT0NLKCkgaXNuJ3QgcXVpdGUgcmlnaHQsIGJlY2F1c2UgaWYgdGhlIGxhc3QKKyAgICAgICBibG9jayBlbmRzIHdpdGggYSBqdW1wIG9yIHJldHVybiBiX25leHQgc2hvdWxkbid0IHNldC4KKyAgICAgKi8KKyAgICBpZiAoIWMtPnUtPnVfY3VyYmxvY2stPmJfcmV0dXJuKSB7CisgICAgICAgIE5FWFRfQkxPQ0soYyk7CisgICAgICAgIGlmIChhZGROb25lKQorICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBQeV9Ob25lLCBjb25zdHMpOworICAgICAgICBBRERPUChjLCBSRVRVUk5fVkFMVUUpOworICAgIH0KIAotCW5ibG9ja3MgPSAwOwotCWVudHJ5YmxvY2sgPSBOVUxMOwotCWZvciAoYiA9IGMtPnUtPnVfYmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5iX2xpc3QpIHsKLQkJbmJsb2NrcysrOwotCQllbnRyeWJsb2NrID0gYjsgCi0JfQorICAgIG5ibG9ja3MgPSAwOworICAgIGVudHJ5YmxvY2sgPSBOVUxMOworICAgIGZvciAoYiA9IGMtPnUtPnVfYmxvY2tzOyBiICE9IE5VTEw7IGIgPSBiLT5iX2xpc3QpIHsKKyAgICAgICAgbmJsb2NrcysrOworICAgICAgICBlbnRyeWJsb2NrID0gYjsKKyAgICB9CiAKLQkvKiBTZXQgZmlyc3RsaW5lbm8gaWYgaXQgd2Fzbid0IGV4cGxpY2l0bHkgc2V0LiAqLwotCWlmICghYy0+dS0+dV9maXJzdGxpbmVubykgewotCQlpZiAoZW50cnlibG9jayAmJiBlbnRyeWJsb2NrLT5iX2luc3RyKQotCQkJYy0+dS0+dV9maXJzdGxpbmVubyA9IGVudHJ5YmxvY2stPmJfaW5zdHItPmlfbGluZW5vOwotCQllbHNlCi0JCQljLT51LT51X2ZpcnN0bGluZW5vID0gMTsKLQl9Ci0JaWYgKCFhc3NlbWJsZV9pbml0KCZhLCBuYmxvY2tzLCBjLT51LT51X2ZpcnN0bGluZW5vKSkKLQkJZ290byBlcnJvcjsKLQlkZnMoYywgZW50cnlibG9jaywgJmEpOworICAgIC8qIFNldCBmaXJzdGxpbmVubyBpZiBpdCB3YXNuJ3QgZXhwbGljaXRseSBzZXQuICovCisgICAgaWYgKCFjLT51LT51X2ZpcnN0bGluZW5vKSB7CisgICAgICAgIGlmIChlbnRyeWJsb2NrICYmIGVudHJ5YmxvY2stPmJfaW5zdHIpCisgICAgICAgICAgICBjLT51LT51X2ZpcnN0bGluZW5vID0gZW50cnlibG9jay0+Yl9pbnN0ci0+aV9saW5lbm87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGMtPnUtPnVfZmlyc3RsaW5lbm8gPSAxOworICAgIH0KKyAgICBpZiAoIWFzc2VtYmxlX2luaXQoJmEsIG5ibG9ja3MsIGMtPnUtPnVfZmlyc3RsaW5lbm8pKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGRmcyhjLCBlbnRyeWJsb2NrLCAmYSk7CiAKLQkvKiBDYW4ndCBtb2RpZnkgdGhlIGJ5dGVjb2RlIGFmdGVyIGNvbXB1dGluZyBqdW1wIG9mZnNldHMuICovCi0JYXNzZW1ibGVfanVtcF9vZmZzZXRzKCZhLCBjKTsKKyAgICAvKiBDYW4ndCBtb2RpZnkgdGhlIGJ5dGVjb2RlIGFmdGVyIGNvbXB1dGluZyBqdW1wIG9mZnNldHMuICovCisgICAgYXNzZW1ibGVfanVtcF9vZmZzZXRzKCZhLCBjKTsKIAotCS8qIEVtaXQgY29kZSBpbiByZXZlcnNlIHBvc3RvcmRlciBmcm9tIGRmcy4gKi8KLQlmb3IgKGkgPSBhLmFfbmJsb2NrcyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCWIgPSBhLmFfcG9zdG9yZGVyW2ldOwotCQlmb3IgKGogPSAwOyBqIDwgYi0+Yl9pdXNlZDsgaisrKQotCQkJaWYgKCFhc3NlbWJsZV9lbWl0KCZhLCAmYi0+Yl9pbnN0cltqXSkpCi0JCQkJZ290byBlcnJvcjsKLQl9CisgICAgLyogRW1pdCBjb2RlIGluIHJldmVyc2UgcG9zdG9yZGVyIGZyb20gZGZzLiAqLworICAgIGZvciAoaSA9IGEuYV9uYmxvY2tzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgYiA9IGEuYV9wb3N0b3JkZXJbaV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBiLT5iX2l1c2VkOyBqKyspCisgICAgICAgICAgICBpZiAoIWFzc2VtYmxlX2VtaXQoJmEsICZiLT5iX2luc3RyW2pdKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZhLmFfbG5vdGFiLCBhLmFfbG5vdGFiX29mZikgPCAwKQotCQlnb3RvIGVycm9yOwotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZhLmFfYnl0ZWNvZGUsIGEuYV9vZmZzZXQpIDwgMCkKLQkJZ290byBlcnJvcjsKKyAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS5hX2xub3RhYiwgYS5hX2xub3RhYl9vZmYpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoX1B5U3RyaW5nX1Jlc2l6ZSgmYS5hX2J5dGVjb2RlLCBhLmFfb2Zmc2V0KSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQljbyA9IG1ha2Vjb2RlKGMsICZhKTsKKyAgICBjbyA9IG1ha2Vjb2RlKGMsICZhKTsKICBlcnJvcjoKLQlhc3NlbWJsZV9mcmVlKCZhKTsKLQlyZXR1cm4gY287CisgICAgYXNzZW1ibGVfZnJlZSgmYSk7CisgICAgcmV0dXJuIGNvOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2R5bmxvYWRfYWl4LmMgYi9QeXRob24vZHlubG9hZF9haXguYwppbmRleCA3YTYwNGYyLi44ZDU2ZDdkIDEwMDY0NAotLS0gYS9QeXRob24vZHlubG9hZF9haXguYworKysgYi9QeXRob24vZHlubG9hZF9haXguYwpAQCAtNCwxMCArNCwxMCBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgImltcG9ydGRsLmgiCiAKLSNpbmNsdWRlIDxjdHlwZS5oPgkvKiAgZm9yIGlzZGlnaXQoKQkgICovCi0jaW5jbHVkZSA8ZXJybm8uaD4JLyogIGZvciBnbG9iYWwgZXJybm8gICAgICAqLwotI2luY2x1ZGUgPHN0cmluZy5oPgkvKiAgZm9yIHN0cmVycm9yKCkgICAgICAgICovCi0jaW5jbHVkZSA8c3RkbGliLmg+CS8qICBmb3IgbWFsbG9jKCksIGZyZWUoKSAgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPiAgICAgIC8qICBmb3IgaXNkaWdpdCgpICAgICAgICAgKi8KKyNpbmNsdWRlIDxlcnJuby5oPiAgICAgIC8qICBmb3IgZ2xvYmFsIGVycm5vICAgICAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgIC8qICBmb3Igc3RyZXJyb3IoKSAgICAgICAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgIC8qICBmb3IgbWFsbG9jKCksIGZyZWUoKSAgKi8KICNpbmNsdWRlIDxzeXMvbGRyLmg+CiAKIApAQCAtMjIsODUgKzIyLDg1IEBACiBleHRlcm4gY2hhciAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CiAKIHR5cGVkZWYgc3RydWN0IE1vZHVsZSB7Ci0Jc3RydWN0IE1vZHVsZSAqbmV4dDsKLQl2b2lkICAgICAgICAgICplbnRyeTsKKyAgICBzdHJ1Y3QgTW9kdWxlICpuZXh0OworICAgIHZvaWQgICAgICAgICAgKmVudHJ5OwogfSBNb2R1bGUsICpNb2R1bGVQdHI7CiAKIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiW10gPSB7Ci0JeyIuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JeyJtb2R1bGUuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JezAsIDB9CisgICAgeyIuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyJtb2R1bGUuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgezAsIDB9CiB9OwogCiBzdGF0aWMgaW50CiBhaXhfZ2V0b2xkbW9kdWxlcyh2b2lkICoqbW9kbGlzdHB0cikKIHsKLQlyZWdpc3RlciBNb2R1bGVQdHIgICAgICAgbW9kcHRyLCBwcmV2bW9kcHRyOwotCXJlZ2lzdGVyIHN0cnVjdCBsZF9pbmZvICAqbGRpcHRyOwotCXJlZ2lzdGVyIGNoYXIgICAgICAgICAgICAqbGRpYnVmOwotCXJlZ2lzdGVyIGludCAgICAgICAgICAgICBlcnJmbGFnLCBidWZzaXplID0gMTAyNDsKLQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgICAgb2Zmc2V0OwotCWNoYXIgKnByb2duYW1lID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKLQkKLQkvKgotCS0tIEdldCB0aGUgbGlzdCBvZiBsb2FkZWQgbW9kdWxlcyBpbnRvIGxkX2luZm8gc3RydWN0dXJlcy4KLQkqLwotCWlmICgobGRpYnVmID0gbWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgc3RyZXJyb3IoZXJybm8pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl3aGlsZSAoKGVycmZsYWcgPSBsb2FkcXVlcnkoTF9HRVRJTkZPLCBsZGlidWYsIGJ1ZnNpemUpKSA9PSAtMQotCSAgICAgICAmJiBlcnJubyA9PSBFTk9NRU0pIHsKLQkJZnJlZShsZGlidWYpOwotCQlidWZzaXplICs9IDEwMjQ7Ci0JCWlmICgobGRpYnVmID0gbWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIHN0cmVycm9yKGVycm5vKSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JaWYgKGVycmZsYWcgPT0gLTEpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBzdHJlcnJvcihlcnJubykpOwotCQlyZXR1cm4gLTE7Ci0JfQotCS8qCi0JLS0gTWFrZSB0aGUgbW9kdWxlcyBsaXN0IGZyb20gdGhlIGxkX2luZm8gc3RydWN0dXJlcy4KLQkqLwotCWxkaXB0ciA9IChzdHJ1Y3QgbGRfaW5mbyAqKWxkaWJ1ZjsKLQlwcmV2bW9kcHRyID0gTlVMTDsKLQlkbyB7Ci0JCWlmIChzdHJzdHIocHJvZ25hbWUsIGxkaXB0ci0+bGRpbmZvX2ZpbGVuYW1lKSA9PSBOVUxMICYmCi0JCSAgICBzdHJzdHIobGRpcHRyLT5sZGluZm9fZmlsZW5hbWUsICJweXRob24iKSA9PSBOVUxMKSB7Ci0JCQkvKgotCQkJLS0gRXh0cmFjdCBvbmx5IHRoZSBtb2R1bGVzIGJlbG9uZ2luZyB0byB0aGUgbWFpbgotCQkJLS0gZXhlY3V0YWJsZSArIHRob3NlIGNvbnRhaW5pbmcgInB5dGhvbiIgYXMgYQotCQkJLS0gc3Vic3RyaW5nIChsaWtlIHRoZSAicHl0aG9uW3ZlcnNpb25dIiBiaW5hcnkgb3IKLQkJCS0tICJsaWJweXRob25bdmVyc2lvbl0uYSIgaW4gY2FzZSBpdCdzIGEgc2hhcmVkIGxpYikuCi0JCQkqLwotCQkJb2Zmc2V0ID0gKHVuc2lnbmVkIGludClsZGlwdHItPmxkaW5mb19uZXh0OwotCQkJbGRpcHRyID0gKHN0cnVjdCBsZF9pbmZvICopKChjaGFyKilsZGlwdHIgKyBvZmZzZXQpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKChtb2RwdHIgPSAoTW9kdWxlUHRyKW1hbGxvYyhzaXplb2YoTW9kdWxlKSkpID09IE5VTEwpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCXdoaWxlICgqbW9kbGlzdHB0cikgewotCQkJCW1vZHB0ciA9IChNb2R1bGVQdHIpKm1vZGxpc3RwdHI7Ci0JCQkJKm1vZGxpc3RwdHIgPSAodm9pZCAqKW1vZHB0ci0+bmV4dDsKLQkJCQlmcmVlKG1vZHB0cik7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJbW9kcHRyLT5lbnRyeSA9IGxkaXB0ci0+bGRpbmZvX2RhdGFvcmc7Ci0JCW1vZHB0ci0+bmV4dCAgPSBOVUxMOwotCQlpZiAocHJldm1vZHB0ciA9PSBOVUxMKQotCQkJKm1vZGxpc3RwdHIgPSAodm9pZCAqKW1vZHB0cjsKLQkJZWxzZQotCQkJcHJldm1vZHB0ci0+bmV4dCA9IG1vZHB0cjsKLQkJcHJldm1vZHB0ciA9IG1vZHB0cjsKLQkJb2Zmc2V0ID0gKHVuc2lnbmVkIGludClsZGlwdHItPmxkaW5mb19uZXh0OwotCQlsZGlwdHIgPSAoc3RydWN0IGxkX2luZm8gKikoKGNoYXIqKWxkaXB0ciArIG9mZnNldCk7Ci0JfSB3aGlsZSAob2Zmc2V0KTsKLQlmcmVlKGxkaWJ1Zik7Ci0JcmV0dXJuIDA7CisgICAgcmVnaXN0ZXIgTW9kdWxlUHRyICAgICAgIG1vZHB0ciwgcHJldm1vZHB0cjsKKyAgICByZWdpc3RlciBzdHJ1Y3QgbGRfaW5mbyAgKmxkaXB0cjsKKyAgICByZWdpc3RlciBjaGFyICAgICAgICAgICAgKmxkaWJ1ZjsKKyAgICByZWdpc3RlciBpbnQgICAgICAgICAgICAgZXJyZmxhZywgYnVmc2l6ZSA9IDEwMjQ7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50ICAgIG9mZnNldDsKKyAgICBjaGFyICpwcm9nbmFtZSA9IFB5X0dldFByb2dyYW1OYW1lKCk7CisKKyAgICAvKgorICAgIC0tIEdldCB0aGUgbGlzdCBvZiBsb2FkZWQgbW9kdWxlcyBpbnRvIGxkX2luZm8gc3RydWN0dXJlcy4KKyAgICAqLworICAgIGlmICgobGRpYnVmID0gbWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB3aGlsZSAoKGVycmZsYWcgPSBsb2FkcXVlcnkoTF9HRVRJTkZPLCBsZGlidWYsIGJ1ZnNpemUpKSA9PSAtMQorICAgICAgICAgICAmJiBlcnJubyA9PSBFTk9NRU0pIHsKKyAgICAgICAgZnJlZShsZGlidWYpOworICAgICAgICBidWZzaXplICs9IDEwMjQ7CisgICAgICAgIGlmICgobGRpYnVmID0gbWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVycmZsYWcgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qCisgICAgLS0gTWFrZSB0aGUgbW9kdWxlcyBsaXN0IGZyb20gdGhlIGxkX2luZm8gc3RydWN0dXJlcy4KKyAgICAqLworICAgIGxkaXB0ciA9IChzdHJ1Y3QgbGRfaW5mbyAqKWxkaWJ1ZjsKKyAgICBwcmV2bW9kcHRyID0gTlVMTDsKKyAgICBkbyB7CisgICAgICAgIGlmIChzdHJzdHIocHJvZ25hbWUsIGxkaXB0ci0+bGRpbmZvX2ZpbGVuYW1lKSA9PSBOVUxMICYmCisgICAgICAgICAgICBzdHJzdHIobGRpcHRyLT5sZGluZm9fZmlsZW5hbWUsICJweXRob24iKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgLS0gRXh0cmFjdCBvbmx5IHRoZSBtb2R1bGVzIGJlbG9uZ2luZyB0byB0aGUgbWFpbgorICAgICAgICAgICAgLS0gZXhlY3V0YWJsZSArIHRob3NlIGNvbnRhaW5pbmcgInB5dGhvbiIgYXMgYQorICAgICAgICAgICAgLS0gc3Vic3RyaW5nIChsaWtlIHRoZSAicHl0aG9uW3ZlcnNpb25dIiBiaW5hcnkgb3IKKyAgICAgICAgICAgIC0tICJsaWJweXRob25bdmVyc2lvbl0uYSIgaW4gY2FzZSBpdCdzIGEgc2hhcmVkIGxpYikuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGludClsZGlwdHItPmxkaW5mb19uZXh0OworICAgICAgICAgICAgbGRpcHRyID0gKHN0cnVjdCBsZF9pbmZvICopKChjaGFyKilsZGlwdHIgKyBvZmZzZXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtb2RwdHIgPSAoTW9kdWxlUHRyKW1hbGxvYyhzaXplb2YoTW9kdWxlKSkpID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHdoaWxlICgqbW9kbGlzdHB0cikgeworICAgICAgICAgICAgICAgIG1vZHB0ciA9IChNb2R1bGVQdHIpKm1vZGxpc3RwdHI7CisgICAgICAgICAgICAgICAgKm1vZGxpc3RwdHIgPSAodm9pZCAqKW1vZHB0ci0+bmV4dDsKKyAgICAgICAgICAgICAgICBmcmVlKG1vZHB0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbW9kcHRyLT5lbnRyeSA9IGxkaXB0ci0+bGRpbmZvX2RhdGFvcmc7CisgICAgICAgIG1vZHB0ci0+bmV4dCAgPSBOVUxMOworICAgICAgICBpZiAocHJldm1vZHB0ciA9PSBOVUxMKQorICAgICAgICAgICAgKm1vZGxpc3RwdHIgPSAodm9pZCAqKW1vZHB0cjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJldm1vZHB0ci0+bmV4dCA9IG1vZHB0cjsKKyAgICAgICAgcHJldm1vZHB0ciA9IG1vZHB0cjsKKyAgICAgICAgb2Zmc2V0ID0gKHVuc2lnbmVkIGludClsZGlwdHItPmxkaW5mb19uZXh0OworICAgICAgICBsZGlwdHIgPSAoc3RydWN0IGxkX2luZm8gKikoKGNoYXIqKWxkaXB0ciArIG9mZnNldCk7CisgICAgfSB3aGlsZSAob2Zmc2V0KTsKKyAgICBmcmVlKGxkaWJ1Zik7CisgICAgcmV0dXJuIDA7CiB9CiAKIApAQCAtMTA4LDc2ICsxMDgsNzYgQEAKIGFpeF9sb2FkZXJyb3IoY29uc3QgY2hhciAqcGF0aG5hbWUpCiB7CiAKLQljaGFyICptZXNzYWdlWzEwMjRdLCBlcnJidWZbMTAyNF07Ci0JcmVnaXN0ZXIgaW50IGksajsKKyAgICBjaGFyICptZXNzYWdlWzEwMjRdLCBlcnJidWZbMTAyNF07CisgICAgcmVnaXN0ZXIgaW50IGksajsKIAotCXN0cnVjdCBlcnJ0YWIgeyAKLQkJaW50IGVyck5vOwotCQljaGFyICplcnJzdHI7Ci0JfSBsb2FkX2VycnRhYltdID0gewotCQl7TF9FUlJPUl9UT09NQU5ZLAkidG9vIG1hbnkgZXJyb3JzLCByZXN0IHNraXBwZWQuIn0sCi0JCXtMX0VSUk9SX05PTElCLAkJImNhbid0IGxvYWQgbGlicmFyeToifSwKLQkJe0xfRVJST1JfVU5ERUYsCQkiY2FuJ3QgZmluZCBzeW1ib2wgaW4gbGlicmFyeToifSwKLQkJe0xfRVJST1JfUkxEQkFELAotCQkgIlJMRCBpbmRleCBvdXQgb2YgcmFuZ2Ugb3IgYmFkIHJlbG9jYXRpb24gdHlwZToifSwKLQkJe0xfRVJST1JfRk9STUFULAkibm90IGEgdmFsaWQsIGV4ZWN1dGFibGUgeGNvZmYgZmlsZToifSwKLQkJe0xfRVJST1JfTUVNQkVSLAotCQkgImZpbGUgbm90IGFuIGFyY2hpdmUgb3IgZG9lcyBub3QgY29udGFpbiByZXF1ZXN0ZWQgbWVtYmVyOiJ9LAotCQl7TF9FUlJPUl9UWVBFLAkJInN5bWJvbCB0YWJsZSBtaXNtYXRjaDoifSwKLQkJe0xfRVJST1JfQUxJR04sCQkidGV4dCBhbGlnbm1lbnQgaW4gZmlsZSBpcyB3cm9uZy4ifSwKLQkJe0xfRVJST1JfU1lTVEVNLAkiU3lzdGVtIGVycm9yOiJ9LAotCQl7TF9FUlJPUl9FUlJOTywJCU5VTEx9Ci0JfTsKKyAgICBzdHJ1Y3QgZXJydGFiIHsKKyAgICAgICAgaW50IGVyck5vOworICAgICAgICBjaGFyICplcnJzdHI7CisgICAgfSBsb2FkX2VycnRhYltdID0geworICAgICAgICB7TF9FUlJPUl9UT09NQU5ZLCAgICAgICAgICAgICAgICJ0b28gbWFueSBlcnJvcnMsIHJlc3Qgc2tpcHBlZC4ifSwKKyAgICAgICAge0xfRVJST1JfTk9MSUIsICAgICAgICAgICAgICAgICAiY2FuJ3QgbG9hZCBsaWJyYXJ5OiJ9LAorICAgICAgICB7TF9FUlJPUl9VTkRFRiwgICAgICAgICAgICAgICAgICJjYW4ndCBmaW5kIHN5bWJvbCBpbiBsaWJyYXJ5OiJ9LAorICAgICAgICB7TF9FUlJPUl9STERCQUQsCisgICAgICAgICAiUkxEIGluZGV4IG91dCBvZiByYW5nZSBvciBiYWQgcmVsb2NhdGlvbiB0eXBlOiJ9LAorICAgICAgICB7TF9FUlJPUl9GT1JNQVQsICAgICAgICAgICAgICAgICJub3QgYSB2YWxpZCwgZXhlY3V0YWJsZSB4Y29mZiBmaWxlOiJ9LAorICAgICAgICB7TF9FUlJPUl9NRU1CRVIsCisgICAgICAgICAiZmlsZSBub3QgYW4gYXJjaGl2ZSBvciBkb2VzIG5vdCBjb250YWluIHJlcXVlc3RlZCBtZW1iZXI6In0sCisgICAgICAgIHtMX0VSUk9SX1RZUEUsICAgICAgICAgICAgICAgICAgInN5bWJvbCB0YWJsZSBtaXNtYXRjaDoifSwKKyAgICAgICAge0xfRVJST1JfQUxJR04sICAgICAgICAgICAgICAgICAidGV4dCBhbGlnbm1lbnQgaW4gZmlsZSBpcyB3cm9uZy4ifSwKKyAgICAgICAge0xfRVJST1JfU1lTVEVNLCAgICAgICAgICAgICAgICAiU3lzdGVtIGVycm9yOiJ9LAorICAgICAgICB7TF9FUlJPUl9FUlJOTywgICAgICAgICAgICAgICAgIE5VTEx9CisgICAgfTsKIAotI2RlZmluZSBMT0FEX0VSUlRBQl9MRU4JKHNpemVvZihsb2FkX2VycnRhYikvc2l6ZW9mKGxvYWRfZXJydGFiWzBdKSkKKyNkZWZpbmUgTE9BRF9FUlJUQUJfTEVOIChzaXplb2YobG9hZF9lcnJ0YWIpL3NpemVvZihsb2FkX2VycnRhYlswXSkpCiAjZGVmaW5lIEVSUkJVRl9BUFBFTkQocykgc3RybmNhdChlcnJidWYsIHMsIHNpemVvZihlcnJidWYpLXN0cmxlbihlcnJidWYpLTEpCiAKLQlQeU9TX3NucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJmcm9tIG1vZHVsZSAlLjIwMHMgIiwgcGF0aG5hbWUpOworICAgIFB5T1Nfc25wcmludGYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgImZyb20gbW9kdWxlICUuMjAwcyAiLCBwYXRobmFtZSk7CiAKLQlpZiAoIWxvYWRxdWVyeShMX0dFVE1FU1NBR0VTLCAmbWVzc2FnZVswXSwgc2l6ZW9mKG1lc3NhZ2UpKSkgewotCQlFUlJCVUZfQVBQRU5EKHN0cmVycm9yKGVycm5vKSk7Ci0JCUVSUkJVRl9BUFBFTkQoIlxuIik7Ci0JfQotCWZvcihpID0gMDsgbWVzc2FnZVtpXSAmJiAqbWVzc2FnZVtpXTsgaSsrKSB7Ci0JCWludCBuZXJyID0gYXRvaShtZXNzYWdlW2ldKTsKLQkJZm9yIChqPTA7IGo8TE9BRF9FUlJUQUJfTEVOIDsgaisrKSB7Ci0JCSAgICBpZiAobmVyciA9PSBsb2FkX2VycnRhYltqXS5lcnJObyAmJiBsb2FkX2VycnRhYltqXS5lcnJzdHIpCi0JCQlFUlJCVUZfQVBQRU5EKGxvYWRfZXJydGFiW2pdLmVycnN0cik7Ci0JCX0KLQkJd2hpbGUgKGlzZGlnaXQoUHlfQ0hBUk1BU0soKm1lc3NhZ2VbaV0pKSkgbWVzc2FnZVtpXSsrIDsgCi0JCUVSUkJVRl9BUFBFTkQobWVzc2FnZVtpXSk7Ci0JCUVSUkJVRl9BUFBFTkQoIlxuIik7Ci0JfQotCWVycmJ1ZltzdHJsZW4oZXJyYnVmKS0xXSA9ICdcMCc7CS8qIHRyaW0gb2ZmIGxhc3QgbmV3bGluZSAqLwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyYnVmKTsgCi0JcmV0dXJuOyAKKyAgICBpZiAoIWxvYWRxdWVyeShMX0dFVE1FU1NBR0VTLCAmbWVzc2FnZVswXSwgc2l6ZW9mKG1lc3NhZ2UpKSkgeworICAgICAgICBFUlJCVUZfQVBQRU5EKHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIEVSUkJVRl9BUFBFTkQoIlxuIik7CisgICAgfQorICAgIGZvcihpID0gMDsgbWVzc2FnZVtpXSAmJiAqbWVzc2FnZVtpXTsgaSsrKSB7CisgICAgICAgIGludCBuZXJyID0gYXRvaShtZXNzYWdlW2ldKTsKKyAgICAgICAgZm9yIChqPTA7IGo8TE9BRF9FUlJUQUJfTEVOIDsgaisrKSB7CisgICAgICAgICAgICBpZiAobmVyciA9PSBsb2FkX2VycnRhYltqXS5lcnJObyAmJiBsb2FkX2VycnRhYltqXS5lcnJzdHIpCisgICAgICAgICAgICBFUlJCVUZfQVBQRU5EKGxvYWRfZXJydGFiW2pdLmVycnN0cik7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGlzZGlnaXQoUHlfQ0hBUk1BU0soKm1lc3NhZ2VbaV0pKSkgbWVzc2FnZVtpXSsrIDsKKyAgICAgICAgRVJSQlVGX0FQUEVORChtZXNzYWdlW2ldKTsKKyAgICAgICAgRVJSQlVGX0FQUEVORCgiXG4iKTsKKyAgICB9CisgICAgZXJyYnVmW3N0cmxlbihlcnJidWYpLTFdID0gJ1wwJzsgICAgICAgICAgICAvKiB0cmltIG9mZiBsYXN0IG5ld2xpbmUgKi8KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGVycmJ1Zik7CisgICAgcmV0dXJuOwogfQogCiAKIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKmZxbmFtZSwgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JZGxfZnVuY3B0ciBwOworICAgIGRsX2Z1bmNwdHIgcDsKIAotCS8qCi0JLS0gSW52b2tlIGxvYWQoKSB3aXRoIExfTk9BVVRPREVGRVIgbGVhdmluZyB0aGUgaW1wb3J0ZWQgc3ltYm9scwotCS0tIG9mIHRoZSBzaGFyZWQgbW9kdWxlIHVucmVzb2x2ZWQuIFRodXMgd2UgaGF2ZSB0byByZXNvbHZlIHRoZW0KLQktLSBleHBsaWNpdGx5IHdpdGggbG9hZGJpbmQuIFRoZSBuZXcgbW9kdWxlIGlzIGxvYWRlZCwgdGhlbiB3ZQotCS0tIHJlc29sdmUgaXRzIHN5bWJvbHMgdXNpbmcgdGhlIGxpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgbW9kdWxlcwotCS0tIChvbmx5IHRob3NlIHRoYXQgYmVsb25nIHRvIHRoZSBweXRob24gZXhlY3V0YWJsZSkuIEdldCB0aGVzZQotCS0tIHdpdGggbG9hZHF1ZXJ5KExfR0VUSU5GTykuCi0JKi8KKyAgICAvKgorICAgIC0tIEludm9rZSBsb2FkKCkgd2l0aCBMX05PQVVUT0RFRkVSIGxlYXZpbmcgdGhlIGltcG9ydGVkIHN5bWJvbHMKKyAgICAtLSBvZiB0aGUgc2hhcmVkIG1vZHVsZSB1bnJlc29sdmVkLiBUaHVzIHdlIGhhdmUgdG8gcmVzb2x2ZSB0aGVtCisgICAgLS0gZXhwbGljaXRseSB3aXRoIGxvYWRiaW5kLiBUaGUgbmV3IG1vZHVsZSBpcyBsb2FkZWQsIHRoZW4gd2UKKyAgICAtLSByZXNvbHZlIGl0cyBzeW1ib2xzIHVzaW5nIHRoZSBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIG1vZHVsZXMKKyAgICAtLSAob25seSB0aG9zZSB0aGF0IGJlbG9uZyB0byB0aGUgcHl0aG9uIGV4ZWN1dGFibGUpLiBHZXQgdGhlc2UKKyAgICAtLSB3aXRoIGxvYWRxdWVyeShMX0dFVElORk8pLgorICAgICovCiAKLQlzdGF0aWMgdm9pZCAqc3RhdGljbW9kbGlzdHB0ciA9IE5VTEw7CisgICAgc3RhdGljIHZvaWQgKnN0YXRpY21vZGxpc3RwdHIgPSBOVUxMOwogCi0JaWYgKCFzdGF0aWNtb2RsaXN0cHRyKQotCQlpZiAoYWl4X2dldG9sZG1vZHVsZXMoJnN0YXRpY21vZGxpc3RwdHIpID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JcCA9IChkbF9mdW5jcHRyKSBhaXhfbG9hZCgoY2hhciAqKXBhdGhuYW1lLCBMX05PQVVUT0RFRkVSLCAwKTsKLQlpZiAocCA9PSBOVUxMKSB7Ci0JCWFpeF9sb2FkZXJyb3IocGF0aG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKCFzdGF0aWNtb2RsaXN0cHRyKQorICAgICAgICBpZiAoYWl4X2dldG9sZG1vZHVsZXMoJnN0YXRpY21vZGxpc3RwdHIpID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IChkbF9mdW5jcHRyKSBhaXhfbG9hZCgoY2hhciAqKXBhdGhuYW1lLCBMX05PQVVUT0RFRkVSLCAwKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIGFpeF9sb2FkZXJyb3IocGF0aG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gcDsKKyAgICByZXR1cm4gcDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX2F0aGVvcy5jIGIvUHl0aG9uL2R5bmxvYWRfYXRoZW9zLmMKaW5kZXggNmY0ZGY3My4uNjVlNDEzNiAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfYXRoZW9zLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfYXRoZW9zLmMKQEAgLTksMzkgKzksMzkgQEAKIAogCiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdID0gewotCXsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXswLCAwfQorICAgIHsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQl2b2lkICpwOwotCWludCBsaWI7Ci0JY2hhciBmdW5jbmFtZVsyNThdOworICAgIHZvaWQgKnA7CisgICAgaW50IGxpYjsKKyAgICBjaGFyIGZ1bmNuYW1lWzI1OF07CiAKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCXByaW50ZigibG9hZF9saWJyYXJ5ICVzXG4iLCBwYXRobmFtZSk7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBwcmludGYoImxvYWRfbGlicmFyeSAlc1xuIiwgcGF0aG5hbWUpOwogCi0JbGliID0gbG9hZF9saWJyYXJ5KHBhdGhuYW1lLCAwKTsKLQlpZiAobGliIDwgMCkgewotCQljaGFyIGJ1Zls1MTJdOwotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlwZXJyb3IocGF0aG5hbWUpOwotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJGYWlsZWQgdG8gbG9hZCAlLjIwMHM6ICUuMjAwcyIsCi0JCQkgICAgICBwYXRobmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBidWYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOwotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJcHJpbnRmKCJnZXRfc3ltYm9sX2FkZHJlc3MgJXNcbiIsIGZ1bmNuYW1lKTsKLQlpZiAoZ2V0X3N5bWJvbF9hZGRyZXNzKGxpYiwgZnVuY25hbWUsIC0xLCAmcCkgPCAwKSB7Ci0JCXAgPSBOVUxMOwotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlwZXJyb3IoZnVuY25hbWUpOwotCX0KKyAgICBsaWIgPSBsb2FkX2xpYnJhcnkocGF0aG5hbWUsIDApOworICAgIGlmIChsaWIgPCAwKSB7CisgICAgICAgIGNoYXIgYnVmWzUxMl07CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIHBlcnJvcihwYXRobmFtZSk7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkZhaWxlZCB0byBsb2FkICUuMjAwczogJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBidWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgcHJpbnRmKCJnZXRfc3ltYm9sX2FkZHJlc3MgJXNcbiIsIGZ1bmNuYW1lKTsKKyAgICBpZiAoZ2V0X3N5bWJvbF9hZGRyZXNzKGxpYiwgZnVuY25hbWUsIC0xLCAmcCkgPCAwKSB7CisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICBwZXJyb3IoZnVuY25hbWUpOworICAgIH0KIAotCXJldHVybiAoZGxfZnVuY3B0cikgcDsKKyAgICByZXR1cm4gKGRsX2Z1bmNwdHIpIHA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF9iZW9zLmMgYi9QeXRob24vZHlubG9hZF9iZW9zLmMKaW5kZXggNWIwNWQ2Yi4uZjVjYTFlYyAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfYmVvcy5jCisrKyBiL1B5dGhvbi9keW5sb2FkX2Jlb3MuYwpAQCAtOSw5ICs5LDkgQEAKICNpbmNsdWRlICJpbXBvcnRkbC5oIgogCiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdID0gewotCXsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXswLCAwfQorICAgIHsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogI2lmIGRlZmluZWQoTUFYUEFUSExFTikgJiYgIWRlZmluZWQoX1NZU19QQVJBTV9IKQpAQCAtNTIsMTMgKzUyLDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIGJlb3NfbnVrZV9keW4oIFB5T2JqZWN0ICppdGVtICkKIHsKLQlzdGF0dXNfdCByZXR2YWw7CisgICAgc3RhdHVzX3QgcmV0dmFsOwogCi0JaWYoIGl0ZW0gKSB7Ci0JCWltYWdlX2lkIGlkID0gKGltYWdlX2lkKVB5SW50X0FzTG9uZyggaXRlbSApOwotCQkKLQkJcmV0dmFsID0gdW5sb2FkX2FkZF9vbiggaWQgKTsKLQl9CisgICAgaWYoIGl0ZW0gKSB7CisgICAgICAgIGltYWdlX2lkIGlkID0gKGltYWdlX2lkKVB5SW50X0FzTG9uZyggaXRlbSApOworCisgICAgICAgIHJldHZhbCA9IHVubG9hZF9hZGRfb24oIGlkICk7CisgICAgfQogfQogCiAvKiBhdGV4aXQoKSBoYW5kbGVyIHRoYXQnbGwgY2FsbCB1bmxvYWRfYWRkX29uKCkgZm9yIGV2ZXJ5IGl0ZW0gaW4gdGhlCkBAIC02NiwzMSArNjYsMzEgQEAKICAqLwogc3RhdGljIHZvaWQgYmVvc19jbGVhbnVwX2R5biggdm9pZCApCiB7Ci0JaWYoIGJlb3NfZHluX2ltYWdlcyApIHsKLQkJaW50IGlkeDsKLQkJaW50IGxpc3Rfc2l6ZTsKLQkJUHlPYmplY3QgKmlkX2xpc3Q7CisgICAgaWYoIGJlb3NfZHluX2ltYWdlcyApIHsKKyAgICAgICAgaW50IGlkeDsKKyAgICAgICAgaW50IGxpc3Rfc2l6ZTsKKyAgICAgICAgUHlPYmplY3QgKmlkX2xpc3Q7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlQeVRocmVhZF9hY3F1aXJlX2xvY2soIGJlb3NfZHluX2xvY2ssIDEgKTsKKyAgICAgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCBiZW9zX2R5bl9sb2NrLCAxICk7CiAjZW5kaWYKIAotCQlpZF9saXN0ID0gUHlEaWN0X1ZhbHVlcyggYmVvc19keW5faW1hZ2VzICk7CisgICAgICAgIGlkX2xpc3QgPSBQeURpY3RfVmFsdWVzKCBiZW9zX2R5bl9pbWFnZXMgKTsKIAotCQlsaXN0X3NpemUgPSBQeUxpc3RfU2l6ZSggaWRfbGlzdCApOwotCQlmb3IoIGlkeCA9IDA7IGlkeCA8IGxpc3Rfc2l6ZTsgaWR4KysgKSB7Ci0JCQlQeU9iamVjdCAqdGhlX2l0ZW07Ci0JCQkKLQkJCXRoZV9pdGVtID0gUHlMaXN0X0dldEl0ZW0oIGlkX2xpc3QsIGlkeCApOwotCQkJYmVvc19udWtlX2R5biggdGhlX2l0ZW0gKTsKLQkJfQorICAgICAgICBsaXN0X3NpemUgPSBQeUxpc3RfU2l6ZSggaWRfbGlzdCApOworICAgICAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IGxpc3Rfc2l6ZTsgaWR4KysgKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdGhlX2l0ZW07CiAKLQkJUHlEaWN0X0NsZWFyKCBiZW9zX2R5bl9pbWFnZXMgKTsKKyAgICAgICAgICAgIHRoZV9pdGVtID0gUHlMaXN0X0dldEl0ZW0oIGlkX2xpc3QsIGlkeCApOworICAgICAgICAgICAgYmVvc19udWtlX2R5biggdGhlX2l0ZW0gKTsKKyAgICAgICAgfQorCisgICAgICAgIFB5RGljdF9DbGVhciggYmVvc19keW5faW1hZ2VzICk7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotCQlQeVRocmVhZF9mcmVlX2xvY2soIGJlb3NfZHluX2xvY2sgKTsKKyAgICAgICAgUHlUaHJlYWRfZnJlZV9sb2NrKCBiZW9zX2R5bl9sb2NrICk7CiAjZW5kaWYKLQl9CisgICAgfQogfQogCiAvKgpAQCAtOTgsMjAgKzk4LDIwIEBACiAgKi8KIHN0YXRpYyB2b2lkIGJlb3NfaW5pdF9keW4oIHZvaWQgKQogewotCS8qIFdlJ3JlIHByb3RlY3RlZCBmcm9tIGEgcmFjZSBjb25kaXRpb24gaGVyZSBieSB0aGUgYXRvbWljIGluaXRfY291bnQKLQkgKiB2YXJpYWJsZS4KLQkgKi8KLQlzdGF0aWMgaW50MzIgaW5pdF9jb3VudCA9IDA7Ci0JaW50MzIgdmFsOworICAgIC8qIFdlJ3JlIHByb3RlY3RlZCBmcm9tIGEgcmFjZSBjb25kaXRpb24gaGVyZSBieSB0aGUgYXRvbWljIGluaXRfY291bnQKKyAgICAgKiB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50MzIgaW5pdF9jb3VudCA9IDA7CisgICAgaW50MzIgdmFsOwogCi0JdmFsID0gYXRvbWljX2FkZCggJmluaXRfY291bnQsIDEgKTsKLQlpZiggYmVvc19keW5faW1hZ2VzID09IE5VTEwgJiYgdmFsID09IDAgKSB7Ci0JCWJlb3NfZHluX2ltYWdlcyA9IFB5RGljdF9OZXcoKTsKKyAgICB2YWwgPSBhdG9taWNfYWRkKCAmaW5pdF9jb3VudCwgMSApOworICAgIGlmKCBiZW9zX2R5bl9pbWFnZXMgPT0gTlVMTCAmJiB2YWwgPT0gMCApIHsKKyAgICAgICAgYmVvc19keW5faW1hZ2VzID0gUHlEaWN0X05ldygpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCWJlb3NfZHluX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgICAgIGJlb3NfZHluX2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CiAjZW5kaWYKLQkJYXRleGl0KCBiZW9zX2NsZWFudXBfZHluICk7Ci0JfQorICAgICAgICBhdGV4aXQoIGJlb3NfY2xlYW51cF9keW4gKTsKKyAgICB9CiB9CiAKIC8qCkBAIC0xMjIsMTMzICsxMjIsMTMzIEBACiAgKi8KIHN0YXRpYyB2b2lkIGJlb3NfYWRkX2R5biggY2hhciAqbmFtZSwgaW1hZ2VfaWQgaWQgKQogewotCWludCByZXR2YWw7Ci0JUHlPYmplY3QgKnB5X2lkOworICAgIGludCByZXR2YWw7CisgICAgUHlPYmplY3QgKnB5X2lkOwogCi0JaWYoIGJlb3NfZHluX2ltYWdlcyA9PSBOVUxMICkgewotCQliZW9zX2luaXRfZHluKCk7Ci0JfQorICAgIGlmKCBiZW9zX2R5bl9pbWFnZXMgPT0gTlVMTCApIHsKKyAgICAgICAgYmVvc19pbml0X2R5bigpOworICAgIH0KIAogI2lmZGVmIFdJVEhfVEhSRUFECi0JcmV0dmFsID0gUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCBiZW9zX2R5bl9sb2NrLCAxICk7CisgICAgcmV0dmFsID0gUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCBiZW9zX2R5bl9sb2NrLCAxICk7CiAjZW5kaWYKIAotCS8qIElmIHRoZXJlJ3MgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCB0aGlzIGtleSBpbiB0aGUgZGljdGlvbmFyeSwKLQkgKiB3ZSdyZSBkb2luZyBhIHJlbG9hZCgpLCBzbyBsZXQncyBudWtlIGl0LgotCSAqLwotCXB5X2lkID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoIGJlb3NfZHluX2ltYWdlcywgbmFtZSApOwotCWlmKCBweV9pZCApIHsKLQkJYmVvc19udWtlX2R5biggcHlfaWQgKTsKLQkJcmV0dmFsID0gUHlEaWN0X0RlbEl0ZW1TdHJpbmcoIGJlb3NfZHluX2ltYWdlcywgbmFtZSApOwotCX0KKyAgICAvKiBJZiB0aGVyZSdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggdGhpcyBrZXkgaW4gdGhlIGRpY3Rpb25hcnksCisgICAgICogd2UncmUgZG9pbmcgYSByZWxvYWQoKSwgc28gbGV0J3MgbnVrZSBpdC4KKyAgICAgKi8KKyAgICBweV9pZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKCBiZW9zX2R5bl9pbWFnZXMsIG5hbWUgKTsKKyAgICBpZiggcHlfaWQgKSB7CisgICAgICAgIGJlb3NfbnVrZV9keW4oIHB5X2lkICk7CisgICAgICAgIHJldHZhbCA9IFB5RGljdF9EZWxJdGVtU3RyaW5nKCBiZW9zX2R5bl9pbWFnZXMsIG5hbWUgKTsKKyAgICB9CiAKLQlweV9pZCA9IFB5SW50X0Zyb21Mb25nKCAobG9uZylpZCApOwotCWlmKCBweV9pZCApIHsKLQkJcmV0dmFsID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoIGJlb3NfZHluX2ltYWdlcywgbmFtZSwgcHlfaWQgKTsKLQl9CisgICAgcHlfaWQgPSBQeUludF9Gcm9tTG9uZyggKGxvbmcpaWQgKTsKKyAgICBpZiggcHlfaWQgKSB7CisgICAgICAgIHJldHZhbCA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKCBiZW9zX2R5bl9pbWFnZXMsIG5hbWUsIHB5X2lkICk7CisgICAgfQogCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soIGJlb3NfZHluX2xvY2sgKTsKKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soIGJlb3NfZHluX2xvY2sgKTsKICNlbmRpZgogfQogCiAKIAogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlkbF9mdW5jcHRyIHA7Ci0JaW1hZ2VfaWQgdGhlX2lkOwotCXN0YXR1c190IHJldHZhbDsKLQljaGFyIGZ1bGxwYXRoW1BBVEhfTUFYXTsKLQljaGFyIGZ1bmNuYW1lWzI1OF07CisgICAgZGxfZnVuY3B0ciBwOworICAgIGltYWdlX2lkIHRoZV9pZDsKKyAgICBzdGF0dXNfdCByZXR2YWw7CisgICAgY2hhciBmdWxscGF0aFtQQVRIX01BWF07CisgICAgY2hhciBmdW5jbmFtZVsyNThdOwogCi0JaWYoIFB5X1ZlcmJvc2VGbGFnICkgewotCQlwcmludGYoICJsb2FkX2FkZF9vbiggJXMgKVxuIiwgcGF0aG5hbWUgKTsKLQl9CisgICAgaWYoIFB5X1ZlcmJvc2VGbGFnICkgeworICAgICAgICBwcmludGYoICJsb2FkX2FkZF9vbiggJXMgKVxuIiwgcGF0aG5hbWUgKTsKKyAgICB9CiAKLQkvKiBIbW0sIHRoaXMgb2xkIGJ1ZyBhcHBlYXJzIHRvIGhhdmUgcmVnZW5lcmF0ZWQgaXRzZWxmOyBpZiB0aGUKLQkgKiBwYXRoIGlzbid0IGFic29sdXRlLCBsb2FkX2FkZF9vbigpIHdpbGwgZmFpbC4gIFJlcG9ydGVkIHRvIEJlCi0JICogQXByaWwgMjEsIDE5OTguCi0JICovCi0JaWYoIHBhdGhuYW1lWzBdICE9ICcvJyApIHsKLQkJKHZvaWQpZ2V0Y3dkKCBmdWxscGF0aCwgUEFUSF9NQVggKTsKLQkJKHZvaWQpc3RybmNhdCggZnVsbHBhdGgsICIvIiwgUEFUSF9NQVggKTsKLQkJKHZvaWQpc3RybmNhdCggZnVsbHBhdGgsIHBhdGhuYW1lLCBQQVRIX01BWCApOwotCQkJCi0JCWlmKCBQeV9WZXJib3NlRmxhZyApIHsKLQkJCXByaW50ZiggImxvYWRfYWRkX29uKCAlcyApXG4iLCBmdWxscGF0aCApOwotCQl9Ci0JfSBlbHNlIHsKLQkJKHZvaWQpc3RyY3B5KCBmdWxscGF0aCwgcGF0aG5hbWUgKTsKLQl9CisgICAgLyogSG1tLCB0aGlzIG9sZCBidWcgYXBwZWFycyB0byBoYXZlIHJlZ2VuZXJhdGVkIGl0c2VsZjsgaWYgdGhlCisgICAgICogcGF0aCBpc24ndCBhYnNvbHV0ZSwgbG9hZF9hZGRfb24oKSB3aWxsIGZhaWwuICBSZXBvcnRlZCB0byBCZQorICAgICAqIEFwcmlsIDIxLCAxOTk4LgorICAgICAqLworICAgIGlmKCBwYXRobmFtZVswXSAhPSAnLycgKSB7CisgICAgICAgICh2b2lkKWdldGN3ZCggZnVsbHBhdGgsIFBBVEhfTUFYICk7CisgICAgICAgICh2b2lkKXN0cm5jYXQoIGZ1bGxwYXRoLCAiLyIsIFBBVEhfTUFYICk7CisgICAgICAgICh2b2lkKXN0cm5jYXQoIGZ1bGxwYXRoLCBwYXRobmFtZSwgUEFUSF9NQVggKTsKIAotCXRoZV9pZCA9IGxvYWRfYWRkX29uKCBmdWxscGF0aCApOwotCWlmKCB0aGVfaWQgPCBCX05PX0VSUk9SICkgewotCQkvKiBJdCdzIHRvbyBiYWQgbG9hZF9hZGRfb24oKSBkb2Vzbid0IHNldCBlcnJubyBvciBzb21ldGhpbmcuLi4KLQkJICovCi0JCWNoYXIgYnVmZlsyNTZdOyAgLyogaGF0ZSBoYXJkLWNvZGVkIHN0cmluZyBzaXplcy4uLiAqLworICAgICAgICBpZiggUHlfVmVyYm9zZUZsYWcgKSB7CisgICAgICAgICAgICBwcmludGYoICJsb2FkX2FkZF9vbiggJXMgKVxuIiwgZnVsbHBhdGggKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICh2b2lkKXN0cmNweSggZnVsbHBhdGgsIHBhdGhuYW1lICk7CisgICAgfQogCi0JCWlmKCBQeV9WZXJib3NlRmxhZyApIHsKLQkJCXByaW50ZiggImxvYWRfYWRkX29uKCAlcyApIGZhaWxlZCIsIGZ1bGxwYXRoICk7Ci0JCX0KKyAgICB0aGVfaWQgPSBsb2FkX2FkZF9vbiggZnVsbHBhdGggKTsKKyAgICBpZiggdGhlX2lkIDwgQl9OT19FUlJPUiApIHsKKyAgICAgICAgLyogSXQncyB0b28gYmFkIGxvYWRfYWRkX29uKCkgZG9lc24ndCBzZXQgZXJybm8gb3Igc29tZXRoaW5nLi4uCisgICAgICAgICAqLworICAgICAgICBjaGFyIGJ1ZmZbMjU2XTsgIC8qIGhhdGUgaGFyZC1jb2RlZCBzdHJpbmcgc2l6ZXMuLi4gKi8KIAotCQlpZiggdGhlX2lkID09IEJfRVJST1IgKQotCQkJUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLAotCQkJCSAgICAgICAiQmVPUzogRmFpbGVkIHRvIGxvYWQgJS4yMDBzIiwKLQkJCQkgICAgICAgZnVsbHBhdGggKTsKLQkJZWxzZQotCQkJUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLCAKLQkJCQkgICAgICAgIlVua25vd24gZXJyb3IgbG9hZGluZyAlLjIwMHMiLCAKLQkJCQkgICAgICAgZnVsbHBhdGggKTsKKyAgICAgICAgaWYoIFB5X1ZlcmJvc2VGbGFnICkgeworICAgICAgICAgICAgcHJpbnRmKCAibG9hZF9hZGRfb24oICVzICkgZmFpbGVkIiwgZnVsbHBhdGggKTsKKyAgICAgICAgfQogCi0JCVB5RXJyX1NldFN0cmluZyggUHlFeGNfSW1wb3J0RXJyb3IsIGJ1ZmYgKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBpZiggdGhlX2lkID09IEJfRVJST1IgKQorICAgICAgICAgICAgUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlT1M6IEZhaWxlZCB0byBsb2FkICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKCBidWZmLCBzaXplb2YoYnVmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBlcnJvciBsb2FkaW5nICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCApOwogCi0JUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOwotCWlmKCBQeV9WZXJib3NlRmxhZyApIHsKLQkJcHJpbnRmKCAiZ2V0X2ltYWdlX3N5bWJvbCggJXMgKVxuIiwgZnVuY25hbWUgKTsKLQl9CisgICAgICAgIFB5RXJyX1NldFN0cmluZyggUHlFeGNfSW1wb3J0RXJyb3IsIGJ1ZmYgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dmFsID0gZ2V0X2ltYWdlX3N5bWJvbCggdGhlX2lkLCBmdW5jbmFtZSwgQl9TWU1CT0xfVFlQRV9URVhULCAmcCApOwotCWlmKCByZXR2YWwgIT0gQl9OT19FUlJPUiB8fCBwID09IE5VTEwgKSB7Ci0JCS8qIFRoYXQncyBiYWQsIHdlIGNhbid0IGZpbmQgdGhhdCBzeW1ib2wgaW4gdGhlIG1vZHVsZS4uLgotCQkgKi8KLQkJY2hhciBidWZmWzI1Nl07ICAvKiBoYXRlIGhhcmQtY29kZWQgc3RyaW5nIHNpemVzLi4uICovCisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgImluaXQlLjIwMHMiLCBzaG9ydG5hbWUpOworICAgIGlmKCBQeV9WZXJib3NlRmxhZyApIHsKKyAgICAgICAgcHJpbnRmKCAiZ2V0X2ltYWdlX3N5bWJvbCggJXMgKVxuIiwgZnVuY25hbWUgKTsKKyAgICB9CiAKLQkJaWYoIFB5X1ZlcmJvc2VGbGFnICkgewotCQkJcHJpbnRmKCAiZ2V0X2ltYWdlX3N5bWJvbCggJXMgKSBmYWlsZWQiLCBmdW5jbmFtZSApOwotCQl9CisgICAgcmV0dmFsID0gZ2V0X2ltYWdlX3N5bWJvbCggdGhlX2lkLCBmdW5jbmFtZSwgQl9TWU1CT0xfVFlQRV9URVhULCAmcCApOworICAgIGlmKCByZXR2YWwgIT0gQl9OT19FUlJPUiB8fCBwID09IE5VTEwgKSB7CisgICAgICAgIC8qIFRoYXQncyBiYWQsIHdlIGNhbid0IGZpbmQgdGhhdCBzeW1ib2wgaW4gdGhlIG1vZHVsZS4uLgorICAgICAgICAgKi8KKyAgICAgICAgY2hhciBidWZmWzI1Nl07ICAvKiBoYXRlIGhhcmQtY29kZWQgc3RyaW5nIHNpemVzLi4uICovCiAKLQkJc3dpdGNoKCByZXR2YWwgKSB7Ci0JCWNhc2UgQl9CQURfSU1BR0VfSUQ6Ci0JCQlQeU9TX3NucHJpbnRmKCBidWZmLCBzaXplb2YoYnVmZiksCi0JCQkgICAgICAgImNhbid0IGxvYWQgaW5pdCBmdW5jdGlvbiBmb3IgZHluYW1pYyBtb2R1bGU6ICIKLQkJICAgICAgICAgICAgICAgIkludmFsaWQgaW1hZ2UgSUQgZm9yICUuMTgwcyIsIGZ1bGxwYXRoICk7Ci0JCQlicmVhazsKLQkJY2FzZSBCX0JBRF9JTkRFWDoKLQkJCVB5T1Nfc25wcmludGYoIGJ1ZmYsIHNpemVvZihidWZmKSwKLQkJCSAgICAgICAiY2FuJ3QgbG9hZCBpbml0IGZ1bmN0aW9uIGZvciBkeW5hbWljIG1vZHVsZTogIgotCQkgICAgICAgICAgICAgICAiQmFkIGluZGV4IGZvciAlLjE4MHMiLCBmdW5jbmFtZSApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlQeU9TX3NucHJpbnRmKCBidWZmLCBzaXplb2YoYnVmZiksCi0JCQkgICAgICAgImNhbid0IGxvYWQgaW5pdCBmdW5jdGlvbiBmb3IgZHluYW1pYyBtb2R1bGU6ICIKLQkJICAgICAgICAgICAgICAgIlVua25vd24gZXJyb3IgbG9va2luZyB1cCAlLjE4MHMiLCBmdW5jbmFtZSApOwotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgaWYoIFB5X1ZlcmJvc2VGbGFnICkgeworICAgICAgICAgICAgcHJpbnRmKCAiZ2V0X2ltYWdlX3N5bWJvbCggJXMgKSBmYWlsZWQiLCBmdW5jbmFtZSApOworICAgICAgICB9CiAKLQkJcmV0dmFsID0gdW5sb2FkX2FkZF9vbiggdGhlX2lkICk7CisgICAgICAgIHN3aXRjaCggcmV0dmFsICkgeworICAgICAgICBjYXNlIEJfQkFEX0lNQUdFX0lEOgorICAgICAgICAgICAgUHlPU19zbnByaW50ZiggYnVmZiwgc2l6ZW9mKGJ1ZmYpLAorICAgICAgICAgICAgICAgICAgICJjYW4ndCBsb2FkIGluaXQgZnVuY3Rpb24gZm9yIGR5bmFtaWMgbW9kdWxlOiAiCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW1hZ2UgSUQgZm9yICUuMTgwcyIsIGZ1bGxwYXRoICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCX0JBRF9JTkRFWDoKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoIGJ1ZmYsIHNpemVvZihidWZmKSwKKyAgICAgICAgICAgICAgICAgICAiY2FuJ3QgbG9hZCBpbml0IGZ1bmN0aW9uIGZvciBkeW5hbWljIG1vZHVsZTogIgorICAgICAgICAgICAgICAgICAgICJCYWQgaW5kZXggZm9yICUuMTgwcyIsIGZ1bmNuYW1lICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoIGJ1ZmYsIHNpemVvZihidWZmKSwKKyAgICAgICAgICAgICAgICAgICAiY2FuJ3QgbG9hZCBpbml0IGZ1bmN0aW9uIGZvciBkeW5hbWljIG1vZHVsZTogIgorICAgICAgICAgICAgICAgICAgICJVbmtub3duIGVycm9yIGxvb2tpbmcgdXAgJS4xODBzIiwgZnVuY25hbWUgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkJUHlFcnJfU2V0U3RyaW5nKCBQeUV4Y19JbXBvcnRFcnJvciwgYnVmZiApOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgICAgIHJldHZhbCA9IHVubG9hZF9hZGRfb24oIHRoZV9pZCApOwogCi0JLyogU2F2ZSB0aGUgbW9kdWxlIG5hbWUgYW5kIGltYWdlIElEIGZvciBsYXRlciBzbyB3ZSBjYW4gY2xlYW4gdXAKLQkgKiBncmFjZWZ1bGx5LgotCSAqLwotCWJlb3NfYWRkX2R5biggZnFuYW1lLCB0aGVfaWQgKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKCBQeUV4Y19JbXBvcnRFcnJvciwgYnVmZiApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlyZXR1cm4gcDsKKyAgICAvKiBTYXZlIHRoZSBtb2R1bGUgbmFtZSBhbmQgaW1hZ2UgSUQgZm9yIGxhdGVyIHNvIHdlIGNhbiBjbGVhbiB1cAorICAgICAqIGdyYWNlZnVsbHkuCisgICAgICovCisgICAgYmVvc19hZGRfZHluKCBmcW5hbWUsIHRoZV9pZCApOworCisgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF9ocHV4LmMgYi9QeXRob24vZHlubG9hZF9ocHV4LmMKaW5kZXggZmVjMDgyNi4uYzZjZTE2ZSAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfaHB1eC5jCisrKyBiL1B5dGhvbi9keW5sb2FkX2hwdXguYwpAQCAtMTQsNDUgKzE0LDQ1IEBACiAjZW5kaWYKIAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKLQl7U0hMSUJfRVhULCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JeyJtb2R1bGUiU0hMSUJfRVhULCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JezAsIDB9CisgICAge1NITElCX0VYVCwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlIlNITElCX0VYVCwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlkbF9mdW5jcHRyIHA7Ci0Jc2hsX3QgbGliOwotCWludCBmbGFnczsKLQljaGFyIGZ1bmNuYW1lWzI1OF07CisgICAgZGxfZnVuY3B0ciBwOworICAgIHNobF90IGxpYjsKKyAgICBpbnQgZmxhZ3M7CisgICAgY2hhciBmdW5jbmFtZVsyNThdOwogCi0JZmxhZ3MgPSBCSU5EX0ZJUlNUIHwgQklORF9ERUZFUlJFRDsKLQlpZiAoUHlfVmVyYm9zZUZsYWcpIHsKLQkJZmxhZ3MgPSBCSU5EX0ZJUlNUIHwgQklORF9JTU1FRElBVEUgfAotCQkJQklORF9OT05GQVRBTCB8IEJJTkRfVkVSQk9TRTsKLQkJcHJpbnRmKCJzaGxfbG9hZCAlc1xuIixwYXRobmFtZSk7Ci0JfQotCWxpYiA9IHNobF9sb2FkKHBhdGhuYW1lLCBmbGFncywgMCk7Ci0JLyogWFhYIENodWNrIEJsYWtlIG9uY2Ugd3JvdGUgdGhhdCAwIHNob3VsZCBiZSBCSU5EX05PU1RBUlQ/ICovCi0JaWYgKGxpYiA9PSBOVUxMKSB7Ci0JCWNoYXIgYnVmWzI1Nl07Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCXBlcnJvcihwYXRobmFtZSk7Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkZhaWxlZCB0byBsb2FkICUuMjAwcyIsCi0JCQkgICAgICBwYXRobmFtZSk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgYnVmKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksIEZVTkNOQU1FX1BBVFRFUk4sIHNob3J0bmFtZSk7Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlwcmludGYoInNobF9maW5kc3ltICVzXG4iLCBmdW5jbmFtZSk7Ci0JaWYgKHNobF9maW5kc3ltKCZsaWIsIGZ1bmNuYW1lLCBUWVBFX1VOREVGSU5FRCwgKHZvaWQgKikgJnApID09IC0xKSB7Ci0JCXNobF91bmxvYWQobGliKTsKLQkJcCA9IE5VTEw7Ci0JfQotCWlmIChwID09IE5VTEwgJiYgUHlfVmVyYm9zZUZsYWcpCi0JCXBlcnJvcihmdW5jbmFtZSk7CisgICAgZmxhZ3MgPSBCSU5EX0ZJUlNUIHwgQklORF9ERUZFUlJFRDsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpIHsKKyAgICAgICAgZmxhZ3MgPSBCSU5EX0ZJUlNUIHwgQklORF9JTU1FRElBVEUgfAorICAgICAgICAgICAgQklORF9OT05GQVRBTCB8IEJJTkRfVkVSQk9TRTsKKyAgICAgICAgcHJpbnRmKCJzaGxfbG9hZCAlc1xuIixwYXRobmFtZSk7CisgICAgfQorICAgIGxpYiA9IHNobF9sb2FkKHBhdGhuYW1lLCBmbGFncywgMCk7CisgICAgLyogWFhYIENodWNrIEJsYWtlIG9uY2Ugd3JvdGUgdGhhdCAwIHNob3VsZCBiZSBCSU5EX05PU1RBUlQ/ICovCisgICAgaWYgKGxpYiA9PSBOVUxMKSB7CisgICAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIHBlcnJvcihwYXRobmFtZSk7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkZhaWxlZCB0byBsb2FkICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGJ1Zik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCBGVU5DTkFNRV9QQVRURVJOLCBzaG9ydG5hbWUpOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgcHJpbnRmKCJzaGxfZmluZHN5bSAlc1xuIiwgZnVuY25hbWUpOworICAgIGlmIChzaGxfZmluZHN5bSgmbGliLCBmdW5jbmFtZSwgVFlQRV9VTkRFRklORUQsICh2b2lkICopICZwKSA9PSAtMSkgeworICAgICAgICBzaGxfdW5sb2FkKGxpYik7CisgICAgICAgIHAgPSBOVUxMOworICAgIH0KKyAgICBpZiAocCA9PSBOVUxMICYmIFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBwZXJyb3IoZnVuY25hbWUpOwogCi0JcmV0dXJuIHA7CisgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF9uZXh0LmMgYi9QeXRob24vZHlubG9hZF9uZXh0LmMKaW5kZXggMjdkZjM1Ni4uN2U2MWI1ZCAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfbmV4dC5jCisrKyBiL1B5dGhvbi9keW5sb2FkX25leHQuYwpAQCAtOSw5ICs5LDkgQEAKICNpbmNsdWRlIDxtYWNoLW8vZHlsZC5oPgogCiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdID0gewotCXsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXswLCAwfQorICAgIHsiLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsibW9kdWxlLnNvIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogLyoKQEAgLTI5LDg2ICsyOSw4NiBAQAogI2RlZmluZSBMSU5LT1BUSU9OUyBOU0xJTktNT0RVTEVfT1BUSU9OX0JJTkROT1d8TlNMSU5LTU9EVUxFX09QVElPTl9SRVRVUk5fT05fRVJST1IKICNlbHNlCiAjZGVmaW5lIExJTktPUFRJT05TIE5TTElOS01PRFVMRV9PUFRJT05fQklORE5PV3wgXAotCU5TTElOS01PRFVMRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SfE5TTElOS01PRFVMRV9PUFRJT05fUFJJVkFURQorICAgIE5TTElOS01PRFVMRV9PUFRJT05fUkVUVVJOX09OX0VSUk9SfE5TTElOS01PRFVMRV9PUFRJT05fUFJJVkFURQogI2VuZGlmCiBkbF9mdW5jcHRyIF9QeUltcG9ydF9HZXREeW5Mb2FkRnVuYyhjb25zdCBjaGFyICpmcW5hbWUsIGNvbnN0IGNoYXIgKnNob3J0bmFtZSwKLQkJCQkJY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlkbF9mdW5jcHRyIHAgPSBOVUxMOwotCWNoYXIgZnVuY25hbWVbMjU4XTsKLQlOU09iamVjdEZpbGVJbWFnZVJldHVybkNvZGUgcmM7Ci0JTlNPYmplY3RGaWxlSW1hZ2UgaW1hZ2U7Ci0JTlNNb2R1bGUgbmV3TW9kdWxlOwotCU5TU3ltYm9sIHRoZVN5bTsKLQljb25zdCBjaGFyICplcnJTdHJpbmc7Ci0JY2hhciBlcnJCdWZbNTEyXTsKKyAgICBkbF9mdW5jcHRyIHAgPSBOVUxMOworICAgIGNoYXIgZnVuY25hbWVbMjU4XTsKKyAgICBOU09iamVjdEZpbGVJbWFnZVJldHVybkNvZGUgcmM7CisgICAgTlNPYmplY3RGaWxlSW1hZ2UgaW1hZ2U7CisgICAgTlNNb2R1bGUgbmV3TW9kdWxlOworICAgIE5TU3ltYm9sIHRoZVN5bTsKKyAgICBjb25zdCBjaGFyICplcnJTdHJpbmc7CisgICAgY2hhciBlcnJCdWZbNTEyXTsKIAotCVB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksICJfaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgIl9pbml0JS4yMDBzIiwgc2hvcnRuYW1lKTsKIAogI2lmZGVmIFVTRV9EWUxEX0dMT0JBTF9OQU1FU1BBQ0UKLQlpZiAoTlNJc1N5bWJvbE5hbWVEZWZpbmVkKGZ1bmNuYW1lKSkgewotCQl0aGVTeW0gPSBOU0xvb2t1cEFuZEJpbmRTeW1ib2woZnVuY25hbWUpOwotCQlwID0gKGRsX2Z1bmNwdHIpTlNBZGRyZXNzT2ZTeW1ib2wodGhlU3ltKTsKLQkJcmV0dXJuIHA7Ci0JfQorICAgIGlmIChOU0lzU3ltYm9sTmFtZURlZmluZWQoZnVuY25hbWUpKSB7CisgICAgICAgIHRoZVN5bSA9IE5TTG9va3VwQW5kQmluZFN5bWJvbChmdW5jbmFtZSk7CisgICAgICAgIHAgPSAoZGxfZnVuY3B0cilOU0FkZHJlc3NPZlN5bWJvbCh0aGVTeW0pOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CiAjZW5kaWYKLQlyYyA9IE5TQ3JlYXRlT2JqZWN0RmlsZUltYWdlRnJvbUZpbGUocGF0aG5hbWUsICZpbWFnZSk7Ci0Jc3dpdGNoKHJjKSB7Ci0JCWRlZmF1bHQ6Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VGYWlsdXJlOgotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlRm9ybWF0OgotCQkJLyogZm9yIHRoZXNlIGEgbWVzc2FnZSBpcyBwcmludGVkIG9uIHN0ZGVyciBieSBkeWxkICovCi0JCQllcnJTdHJpbmcgPSAiQ2FuJ3QgY3JlYXRlIG9iamVjdCBmaWxlIGltYWdlIjsKLQkJYnJlYWs7Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VTdWNjZXNzOgotCQkJZXJyU3RyaW5nID0gTlVMTDsKLQkJCWJyZWFrOwotCQljYXNlIE5TT2JqZWN0RmlsZUltYWdlSW5hcHByb3ByaWF0ZUZpbGU6Ci0JCQllcnJTdHJpbmcgPSAiSW5hcHByb3ByaWF0ZSBmaWxlIHR5cGUgZm9yIGR5bmFtaWMgbG9hZGluZyI7Ci0JCQlicmVhazsKLQkJY2FzZSBOU09iamVjdEZpbGVJbWFnZUFyY2g6Ci0JCQllcnJTdHJpbmcgPSAiV3JvbmcgQ1BVIHR5cGUgaW4gb2JqZWN0IGZpbGUiOwotCQkJYnJlYWs7Ci0JCWNhc2UgTlNPYmplY3RGaWxlSW1hZ2VBY2Nlc3M6Ci0JCQllcnJTdHJpbmcgPSAiQ2FuJ3QgcmVhZCBvYmplY3QgZmlsZSAobm8gYWNjZXNzKSI7Ci0JCQlicmVhazsKLQl9Ci0JaWYgKGVyclN0cmluZyA9PSBOVUxMKSB7Ci0JCW5ld01vZHVsZSA9IE5TTGlua01vZHVsZShpbWFnZSwgcGF0aG5hbWUsIExJTktPUFRJT05TKTsKLQkJaWYgKG5ld01vZHVsZSA9PSBOVUxMKSB7Ci0JCQlpbnQgZXJyTm87Ci0JCQljb25zdCBjaGFyICpmaWxlTmFtZSwgKm1vcmVFcnJvclN0cjsKLQkJCU5TTGlua0VkaXRFcnJvcnMgYzsKLQkJCU5TTGlua0VkaXRFcnJvciggJmMsICZlcnJObywgJmZpbGVOYW1lLCAmbW9yZUVycm9yU3RyICk7Ci0JCQlQeU9TX3NucHJpbnRmKGVyckJ1ZiwgNTEyLCAiRmFpbHVyZSBsaW5raW5nIG5ldyBtb2R1bGU6ICVzOiAlcyIsIAotCQkJCQlmaWxlTmFtZSwgbW9yZUVycm9yU3RyKTsKLQkJCWVyclN0cmluZyA9IGVyckJ1ZjsKLQkJfQotCX0KLQlpZiAoZXJyU3RyaW5nICE9IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJTdHJpbmcpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcmMgPSBOU0NyZWF0ZU9iamVjdEZpbGVJbWFnZUZyb21GaWxlKHBhdGhuYW1lLCAmaW1hZ2UpOworICAgIHN3aXRjaChyYykgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlRmFpbHVyZToKKyAgICAgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZUZvcm1hdDoKKyAgICAgICAgICAgIC8qIGZvciB0aGVzZSBhIG1lc3NhZ2UgaXMgcHJpbnRlZCBvbiBzdGRlcnIgYnkgZHlsZCAqLworICAgICAgICAgICAgZXJyU3RyaW5nID0gIkNhbid0IGNyZWF0ZSBvYmplY3QgZmlsZSBpbWFnZSI7CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlU3VjY2VzczoKKyAgICAgICAgICAgIGVyclN0cmluZyA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOU09iamVjdEZpbGVJbWFnZUluYXBwcm9wcmlhdGVGaWxlOgorICAgICAgICAgICAgZXJyU3RyaW5nID0gIkluYXBwcm9wcmlhdGUgZmlsZSB0eXBlIGZvciBkeW5hbWljIGxvYWRpbmciOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTlNPYmplY3RGaWxlSW1hZ2VBcmNoOgorICAgICAgICAgICAgZXJyU3RyaW5nID0gIldyb25nIENQVSB0eXBlIGluIG9iamVjdCBmaWxlIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5TT2JqZWN0RmlsZUltYWdlQWNjZXNzOgorICAgICAgICAgICAgZXJyU3RyaW5nID0gIkNhbid0IHJlYWQgb2JqZWN0IGZpbGUgKG5vIGFjY2VzcykiOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChlcnJTdHJpbmcgPT0gTlVMTCkgeworICAgICAgICBuZXdNb2R1bGUgPSBOU0xpbmtNb2R1bGUoaW1hZ2UsIHBhdGhuYW1lLCBMSU5LT1BUSU9OUyk7CisgICAgICAgIGlmIChuZXdNb2R1bGUgPT0gTlVMTCkgeworICAgICAgICAgICAgaW50IGVyck5vOworICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsICptb3JlRXJyb3JTdHI7CisgICAgICAgICAgICBOU0xpbmtFZGl0RXJyb3JzIGM7CisgICAgICAgICAgICBOU0xpbmtFZGl0RXJyb3IoICZjLCAmZXJyTm8sICZmaWxlTmFtZSwgJm1vcmVFcnJvclN0ciApOworICAgICAgICAgICAgUHlPU19zbnByaW50ZihlcnJCdWYsIDUxMiwgIkZhaWx1cmUgbGlua2luZyBuZXcgbW9kdWxlOiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLCBtb3JlRXJyb3JTdHIpOworICAgICAgICAgICAgZXJyU3RyaW5nID0gZXJyQnVmOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnJTdHJpbmcgIT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGVyclN0cmluZyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNpZmRlZiBVU0VfRFlMRF9HTE9CQUxfTkFNRVNQQUNFCi0JaWYgKCFOU0lzU3ltYm9sTmFtZURlZmluZWQoZnVuY25hbWUpKSB7Ci0JCS8qIFVubGlua01vZHVsZSgpIGlzbid0IGltcGxlbWVudGVkIGluIGN1cnJlbnQgdmVyc2lvbnMsIGJ1dCBjYWxsaW5nIGl0IGRvZXMgbm8gaGFybSAqLwotCQkvKiBOU1VuTGlua01vZHVsZShuZXdNb2R1bGUsIEZBTFNFKTsgcmVtb3ZlZDogY2F1c2VzIHByb2JsZW1zIGZvciBPYmpDIGNvZGUgKi8KLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSAiTG9hZGVkIG1vZHVsZSBkb2VzIG5vdCBjb250YWluIHN5bWJvbCAlLjIwMHMiLAotCQkJCSBmdW5jbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQl0aGVTeW0gPSBOU0xvb2t1cEFuZEJpbmRTeW1ib2woZnVuY25hbWUpOworICAgIGlmICghTlNJc1N5bWJvbE5hbWVEZWZpbmVkKGZ1bmNuYW1lKSkgeworICAgICAgICAvKiBVbmxpbmtNb2R1bGUoKSBpc24ndCBpbXBsZW1lbnRlZCBpbiBjdXJyZW50IHZlcnNpb25zLCBidXQgY2FsbGluZyBpdCBkb2VzIG5vIGhhcm0gKi8KKyAgICAgICAgLyogTlNVbkxpbmtNb2R1bGUobmV3TW9kdWxlLCBGQUxTRSk7IHJlbW92ZWQ6IGNhdXNlcyBwcm9ibGVtcyBmb3IgT2JqQyBjb2RlICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTG9hZGVkIG1vZHVsZSBkb2VzIG5vdCBjb250YWluIHN5bWJvbCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHRoZVN5bSA9IE5TTG9va3VwQW5kQmluZFN5bWJvbChmdW5jbmFtZSk7CiAjZWxzZQotCXRoZVN5bSA9IE5TTG9va3VwU3ltYm9sSW5Nb2R1bGUobmV3TW9kdWxlLCBmdW5jbmFtZSk7Ci0JaWYgKCB0aGVTeW0gPT0gTlVMTCApIHsKLQkJLyogTlNVbkxpbmtNb2R1bGUobmV3TW9kdWxlLCBGQUxTRSk7IHJlbW92ZWQ6IGNhdXNlcyBwcm9ibGVtcyBmb3IgT2JqQyBjb2RlICovCi0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCQkgIkxvYWRlZCBtb2R1bGUgZG9lcyBub3QgY29udGFpbiBzeW1ib2wgJS4yMDBzIiwKLQkJCQkgZnVuY25hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgdGhlU3ltID0gTlNMb29rdXBTeW1ib2xJbk1vZHVsZShuZXdNb2R1bGUsIGZ1bmNuYW1lKTsKKyAgICBpZiAoIHRoZVN5bSA9PSBOVUxMICkgeworICAgICAgICAvKiBOU1VuTGlua01vZHVsZShuZXdNb2R1bGUsIEZBTFNFKTsgcmVtb3ZlZDogY2F1c2VzIHByb2JsZW1zIGZvciBPYmpDIGNvZGUgKi8KKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJMb2FkZWQgbW9kdWxlIGRvZXMgbm90IGNvbnRhaW4gc3ltYm9sICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlwID0gKGRsX2Z1bmNwdHIpTlNBZGRyZXNzT2ZTeW1ib2wodGhlU3ltKTsKLQlyZXR1cm4gcDsKKyAgICBwID0gKGRsX2Z1bmNwdHIpTlNBZGRyZXNzT2ZTeW1ib2wodGhlU3ltKTsKKyAgICByZXR1cm4gcDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX29zMi5jIGIvUHl0aG9uL2R5bmxvYWRfb3MyLmMKaW5kZXggZDY2MGUyNy4uZTNmZGI3MCAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfb3MyLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfb3MyLmMKQEAgLTEwLDM3ICsxMCwzNyBAQAogCiAKIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiW10gPSB7Ci0JeyIucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsiLmRsbCIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7MCwgMH0KKyAgICB7Ii5weWQiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyIuZGxsIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlkbF9mdW5jcHRyIHA7Ci0JQVBJUkVUICByYzsKLQlITU9EVUxFIGhETEw7Ci0JY2hhciBmYWlscmVhc29uWzI1Nl07Ci0JY2hhciBmdW5jbmFtZVsyNThdOworICAgIGRsX2Z1bmNwdHIgcDsKKyAgICBBUElSRVQgIHJjOworICAgIEhNT0RVTEUgaERMTDsKKyAgICBjaGFyIGZhaWxyZWFzb25bMjU2XTsKKyAgICBjaGFyIGZ1bmNuYW1lWzI1OF07CiAKLQlyYyA9IERvc0xvYWRNb2R1bGUoZmFpbHJlYXNvbiwKLQkJCSAgIHNpemVvZihmYWlscmVhc29uKSwKLQkJCSAgIHBhdGhuYW1lLAotCQkJICAgJmhETEwpOworICAgIHJjID0gRG9zTG9hZE1vZHVsZShmYWlscmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmFpbHJlYXNvbiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAmaERMTCk7CiAKLQlpZiAocmMgIT0gTk9fRVJST1IpIHsKLQkJY2hhciBlcnJCdWZbMjU2XTsKLQkJUHlPU19zbnByaW50ZihlcnJCdWYsIHNpemVvZihlcnJCdWYpLAotCQkJICAgICAgIkRMTCBsb2FkIGZhaWxlZCwgcmMgPSAlZDogJS4yMDBzIiwKLQkJCSAgICAgIHJjLCBmYWlscmVhc29uKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJCdWYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGNoYXIgZXJyQnVmWzI1Nl07CisgICAgICAgIFB5T1Nfc25wcmludGYoZXJyQnVmLCBzaXplb2YoZXJyQnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAiRExMIGxvYWQgZmFpbGVkLCByYyA9ICVkOiAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgIHJjLCBmYWlscmVhc29uKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJCdWYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7Ci0JcmMgPSBEb3NRdWVyeVByb2NBZGRyKGhETEwsIDBMLCBmdW5jbmFtZSwgJnApOwotCWlmIChyYyAhPSBOT19FUlJPUikKLQkJcCA9IE5VTEw7IC8qIFNpZ25pZnkgRmFpbHVyZSB0byBBY3F1aXJlIEVudHJ5cG9pbnQgKi8KLQlyZXR1cm4gcDsKKyAgICBQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CisgICAgcmMgPSBEb3NRdWVyeVByb2NBZGRyKGhETEwsIDBMLCBmdW5jbmFtZSwgJnApOworICAgIGlmIChyYyAhPSBOT19FUlJPUikKKyAgICAgICAgcCA9IE5VTEw7IC8qIFNpZ25pZnkgRmFpbHVyZSB0byBBY3F1aXJlIEVudHJ5cG9pbnQgKi8KKyAgICByZXR1cm4gcDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX3NobGliLmMgYi9QeXRob24vZHlubG9hZF9zaGxpYi5jCmluZGV4IGYxMmE5M2MuLjE3ZWJhYjEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX3NobGliLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfc2hsaWIuYwpAQCAtMzMsMTExICszMywxMTEgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKICNpZmRlZiBfX0NZR1dJTl9fCi0JeyIuZGxsIiwgInJiIiwgQ19FWFRFTlNJT059LAotCXsibW9kdWxlLmRsbCIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Ii5kbGwiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyJtb2R1bGUuZGxsIiwgInJiIiwgQ19FWFRFTlNJT059LAogI2Vsc2UKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQotCXsiLnB5ZCIsICJyYiIsIENfRVhURU5TSU9OfSwKLQl7Ii5kbGwiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyIucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiLmRsbCIsICJyYiIsIENfRVhURU5TSU9OfSwKICNlbHNlCiAjaWZkZWYgX19WTVMKLSAgICAgICAgeyIuZXhlIiwgInJiIiwgQ19FWFRFTlNJT059LAotICAgICAgICB7Ii5FWEUiLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0gICAgICAgIHsibW9kdWxlLmV4ZSIsICJyYiIsIENfRVhURU5TSU9OfSwKLSAgICAgICAgeyJNT0RVTEUuRVhFIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiLmV4ZSIsICJyYiIsIENfRVhURU5TSU9OfSwKKyAgICB7Ii5FWEUiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyJtb2R1bGUuZXhlIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiTU9EVUxFLkVYRSIsICJyYiIsIENfRVhURU5TSU9OfSwKICNlbHNlCi0JeyIuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JeyJtb2R1bGUuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyIuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyJtb2R1bGUuc28iLCAicmIiLCBDX0VYVEVOU0lPTn0sCiAjZW5kaWYKICNlbmRpZgogI2VuZGlmCi0JezAsIDB9CisgICAgezAsIDB9CiB9OwogCiBzdGF0aWMgc3RydWN0IHsKLQlkZXZfdCBkZXY7CisgICAgZGV2X3QgZGV2OwogI2lmZGVmIF9fVk1TCi0JaW5vX3QgaW5vWzNdOworICAgIGlub190IGlub1szXTsKICNlbHNlCi0JaW5vX3QgaW5vOworICAgIGlub190IGlubzsKICNlbmRpZgotCXZvaWQgKmhhbmRsZTsKKyAgICB2b2lkICpoYW5kbGU7CiB9IGhhbmRsZXNbMTI4XTsKIHN0YXRpYyBpbnQgbmhhbmRsZXMgPSAwOwogCiAKIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKmZxbmFtZSwgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JZGxfZnVuY3B0ciBwOwotCXZvaWQgKmhhbmRsZTsKLQljaGFyIGZ1bmNuYW1lWzI1OF07Ci0JY2hhciBwYXRoYnVmWzI2MF07Ci0gICAgICAgIGludCBkbG9wZW5mbGFncz0wOworICAgIGRsX2Z1bmNwdHIgcDsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgY2hhciBmdW5jbmFtZVsyNThdOworICAgIGNoYXIgcGF0aGJ1ZlsyNjBdOworICAgIGludCBkbG9wZW5mbGFncz0wOwogCi0JaWYgKHN0cmNocihwYXRobmFtZSwgJy8nKSA9PSBOVUxMKSB7Ci0JCS8qIFByZWZpeCBiYXJlIGZpbGVuYW1lIHdpdGggIi4vIiAqLwotCQlQeU9TX3NucHJpbnRmKHBhdGhidWYsIHNpemVvZihwYXRoYnVmKSwgIi4vJS0uMjU1cyIsIHBhdGhuYW1lKTsKLQkJcGF0aG5hbWUgPSBwYXRoYnVmOwotCX0KKyAgICBpZiAoc3RyY2hyKHBhdGhuYW1lLCAnLycpID09IE5VTEwpIHsKKyAgICAgICAgLyogUHJlZml4IGJhcmUgZmlsZW5hbWUgd2l0aCAiLi8iICovCisgICAgICAgIFB5T1Nfc25wcmludGYocGF0aGJ1Ziwgc2l6ZW9mKHBhdGhidWYpLCAiLi8lLS4yNTVzIiwgcGF0aG5hbWUpOworICAgICAgICBwYXRobmFtZSA9IHBhdGhidWY7CisgICAgfQogCi0JUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwgCi0JCSAgICAgIExFQURfVU5ERVJTQ09SRSAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CisgICAgUHlPU19zbnByaW50ZihmdW5jbmFtZSwgc2l6ZW9mKGZ1bmNuYW1lKSwKKyAgICAgICAgICAgICAgICAgIExFQURfVU5ERVJTQ09SRSAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CiAKLQlpZiAoZnAgIT0gTlVMTCkgewotCQlpbnQgaTsKLQkJc3RydWN0IHN0YXQgc3RhdGI7Ci0JCWZzdGF0KGZpbGVubyhmcCksICZzdGF0Yik7Ci0JCWZvciAoaSA9IDA7IGkgPCBuaGFuZGxlczsgaSsrKSB7Ci0JCQlpZiAoc3RhdGIuc3RfZGV2ID09IGhhbmRsZXNbaV0uZGV2ICYmCi0JCQkgICAgc3RhdGIuc3RfaW5vID09IGhhbmRsZXNbaV0uaW5vKSB7Ci0JCQkJcCA9IChkbF9mdW5jcHRyKSBkbHN5bShoYW5kbGVzW2ldLmhhbmRsZSwKLQkJCQkJCSAgICAgICBmdW5jbmFtZSk7Ci0JCQkJcmV0dXJuIHA7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5oYW5kbGVzIDwgMTI4KSB7Ci0JCQloYW5kbGVzW25oYW5kbGVzXS5kZXYgPSBzdGF0Yi5zdF9kZXY7CisgICAgaWYgKGZwICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHN0cnVjdCBzdGF0IHN0YXRiOworICAgICAgICBmc3RhdChmaWxlbm8oZnApLCAmc3RhdGIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmhhbmRsZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHN0YXRiLnN0X2RldiA9PSBoYW5kbGVzW2ldLmRldiAmJgorICAgICAgICAgICAgICAgIHN0YXRiLnN0X2lubyA9PSBoYW5kbGVzW2ldLmlubykgeworICAgICAgICAgICAgICAgIHAgPSAoZGxfZnVuY3B0cikgZGxzeW0oaGFuZGxlc1tpXS5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5oYW5kbGVzIDwgMTI4KSB7CisgICAgICAgICAgICBoYW5kbGVzW25oYW5kbGVzXS5kZXYgPSBzdGF0Yi5zdF9kZXY7CiAjaWZkZWYgX19WTVMKLQkJCWhhbmRsZXNbbmhhbmRsZXNdLmlub1swXSA9IHN0YXRiLnN0X2lub1swXTsKLQkJCWhhbmRsZXNbbmhhbmRsZXNdLmlub1sxXSA9IHN0YXRiLnN0X2lub1sxXTsKLQkJCWhhbmRsZXNbbmhhbmRsZXNdLmlub1syXSA9IHN0YXRiLnN0X2lub1syXTsKKyAgICAgICAgICAgIGhhbmRsZXNbbmhhbmRsZXNdLmlub1swXSA9IHN0YXRiLnN0X2lub1swXTsKKyAgICAgICAgICAgIGhhbmRsZXNbbmhhbmRsZXNdLmlub1sxXSA9IHN0YXRiLnN0X2lub1sxXTsKKyAgICAgICAgICAgIGhhbmRsZXNbbmhhbmRsZXNdLmlub1syXSA9IHN0YXRiLnN0X2lub1syXTsKICNlbHNlCi0JCQloYW5kbGVzW25oYW5kbGVzXS5pbm8gPSBzdGF0Yi5zdF9pbm87CisgICAgICAgICAgICBoYW5kbGVzW25oYW5kbGVzXS5pbm8gPSBzdGF0Yi5zdF9pbm87CiAjZW5kaWYKLQkJfQotCX0KKyAgICAgICAgfQorICAgIH0KIAogI2lmICEoZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykpCi0gICAgICAgIGRsb3BlbmZsYWdzID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwLT5kbG9wZW5mbGFnczsKKyAgICBkbG9wZW5mbGFncyA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycC0+ZGxvcGVuZmxhZ3M7CiAjZW5kaWYKIAotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoImRsb3BlbihcIiVzXCIsICV4KTtcbiIsIHBhdGhuYW1lLCAKLQkJCQkgIGRsb3BlbmZsYWdzKTsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJkbG9wZW4oXCIlc1wiLCAleCk7XG4iLCBwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGxvcGVuZmxhZ3MpOwogCiAjaWZkZWYgX19WTVMKLQkvKiBWTVMgY3VycmVudGx5IGRvbid0IGFsbG93IGEgcGF0aG5hbWUsIHVzZSBhIGxvZ2ljYWwgbmFtZSBpbnN0ZWFkICovCi0JLyogQ29uY2F0ZW5hdGUgJ3B5dGhvbl9tb2R1bGVfJyBhbmQgc2hvcnRuYW1lICovCi0JLyogc28gImltcG9ydCB2bXMuYmFyIiB3aWxsIHVzZSB0aGUgbG9naWNhbCBweXRob25fbW9kdWxlX2JhciAqLwotCS8qIEFzIEMgbW9kdWxlIHVzZSBvbmx5IG9uZSBuYW1lIHNwYWNlIHRoaXMgaXMgcHJvYmFibHkgbm90IGEgKi8KLQkvKiBpbXBvcnRhbnQgbGltaXRhdGlvbiAqLwotCVB5T1Nfc25wcmludGYocGF0aGJ1Ziwgc2l6ZW9mKHBhdGhidWYpLCAicHl0aG9uX21vZHVsZV8lLS4yMDBzIiwgCi0JCSAgICAgIHNob3J0bmFtZSk7Ci0JcGF0aG5hbWUgPSBwYXRoYnVmOworICAgIC8qIFZNUyBjdXJyZW50bHkgZG9uJ3QgYWxsb3cgYSBwYXRobmFtZSwgdXNlIGEgbG9naWNhbCBuYW1lIGluc3RlYWQgKi8KKyAgICAvKiBDb25jYXRlbmF0ZSAncHl0aG9uX21vZHVsZV8nIGFuZCBzaG9ydG5hbWUgKi8KKyAgICAvKiBzbyAiaW1wb3J0IHZtcy5iYXIiIHdpbGwgdXNlIHRoZSBsb2dpY2FsIHB5dGhvbl9tb2R1bGVfYmFyICovCisgICAgLyogQXMgQyBtb2R1bGUgdXNlIG9ubHkgb25lIG5hbWUgc3BhY2UgdGhpcyBpcyBwcm9iYWJseSBub3QgYSAqLworICAgIC8qIGltcG9ydGFudCBsaW1pdGF0aW9uICovCisgICAgUHlPU19zbnByaW50ZihwYXRoYnVmLCBzaXplb2YocGF0aGJ1ZiksICJweXRob25fbW9kdWxlXyUtLjIwMHMiLAorICAgICAgICAgICAgICAgICAgc2hvcnRuYW1lKTsKKyAgICBwYXRobmFtZSA9IHBhdGhidWY7CiAjZW5kaWYKIAotCWhhbmRsZSA9IGRsb3BlbihwYXRobmFtZSwgZGxvcGVuZmxhZ3MpOworICAgIGhhbmRsZSA9IGRsb3BlbihwYXRobmFtZSwgZGxvcGVuZmxhZ3MpOwogCi0JaWYgKGhhbmRsZSA9PSBOVUxMKSB7Ci0JCWNvbnN0IGNoYXIgKmVycm9yID0gZGxlcnJvcigpOwotCQlpZiAoZXJyb3IgPT0gTlVMTCkKLQkJCWVycm9yID0gInVua25vd24gZGxvcGVuKCkgZXJyb3IiOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGVycm9yKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChmcCAhPSBOVUxMICYmIG5oYW5kbGVzIDwgMTI4KQotCQloYW5kbGVzW25oYW5kbGVzKytdLmhhbmRsZSA9IGhhbmRsZTsKLQlwID0gKGRsX2Z1bmNwdHIpIGRsc3ltKGhhbmRsZSwgZnVuY25hbWUpOwotCXJldHVybiBwOworICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBjb25zdCBjaGFyICplcnJvciA9IGRsZXJyb3IoKTsKKyAgICAgICAgaWYgKGVycm9yID09IE5VTEwpCisgICAgICAgICAgICBlcnJvciA9ICJ1bmtub3duIGRsb3BlbigpIGVycm9yIjsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZnAgIT0gTlVMTCAmJiBuaGFuZGxlcyA8IDEyOCkKKyAgICAgICAgaGFuZGxlc1tuaGFuZGxlcysrXS5oYW5kbGUgPSBoYW5kbGU7CisgICAgcCA9IChkbF9mdW5jcHRyKSBkbHN5bShoYW5kbGUsIGZ1bmNuYW1lKTsKKyAgICByZXR1cm4gcDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9keW5sb2FkX3dpbi5jIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKaW5kZXggOTA3YTVhMy4uNGU1NTU1ZSAxMDA2NDQKLS0tIGEvUHl0aG9uL2R5bmxvYWRfd2luLmMKKysrIGIvUHl0aG9uL2R5bmxvYWRfd2luLmMKQEAgLTE3LDExICsxNywxMSBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYltdID0gewogI2lmZGVmIF9ERUJVRwotCXsiX2QucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHsiX2QucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAogI2Vsc2UKLQl7Ii5weWQiLCAicmIiLCBDX0VYVEVOU0lPTn0sCisgICAgeyIucHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAogI2VuZGlmCi0JezAsIDB9CisgICAgezAsIDB9CiB9OwogCiAKQEAgLTI5LDE4ICsyOSwxOCBAQAogICAgQyBSVEwgaW1wbGVtZW50YXRpb25zICovCiAKIHN0YXRpYyBpbnQgc3RyY2FzZWNtcCAoY2hhciAqc3RyaW5nMSwgY2hhciAqc3RyaW5nMikKLXsgCi0JaW50IGZpcnN0LCBzZWNvbmQ7Cit7CisgICAgaW50IGZpcnN0LCBzZWNvbmQ7CiAKLQlkbyB7Ci0JCWZpcnN0ICA9IHRvbG93ZXIoKnN0cmluZzEpOwotCQlzZWNvbmQgPSB0b2xvd2VyKCpzdHJpbmcyKTsKLQkJc3RyaW5nMSsrOwotCQlzdHJpbmcyKys7Ci0JfSB3aGlsZSAoZmlyc3QgJiYgZmlyc3QgPT0gc2Vjb25kKTsKKyAgICBkbyB7CisgICAgICAgIGZpcnN0ICA9IHRvbG93ZXIoKnN0cmluZzEpOworICAgICAgICBzZWNvbmQgPSB0b2xvd2VyKCpzdHJpbmcyKTsKKyAgICAgICAgc3RyaW5nMSsrOworICAgICAgICBzdHJpbmcyKys7CisgICAgfSB3aGlsZSAoZmlyc3QgJiYgZmlyc3QgPT0gc2Vjb25kKTsKIAotCXJldHVybiAoZmlyc3QgLSBzZWNvbmQpOwotfSAKKyAgICByZXR1cm4gKGZpcnN0IC0gc2Vjb25kKTsKK30KIAogCiAvKiBGdW5jdGlvbiB0byByZXR1cm4gdGhlIG5hbWUgb2YgdGhlICJweXRob24iIERMTCB0aGF0IHRoZSBzdXBwbGllZCBtb2R1bGUKQEAgLTY2LDIwOSArNjYsMjA5IEBACiAKIHN0YXRpYyBjaGFyICpHZXRQeXRob25JbXBvcnQgKEhJTlNUQU5DRSBoTW9kdWxlKQogewotCXVuc2lnbmVkIGNoYXIgKmRsbGJhc2UsICppbXBvcnRfZGF0YSwgKmltcG9ydF9uYW1lOwotCURXT1JEIHBlX29mZnNldCwgb3B0X29mZnNldDsKLQlXT1JEIG9wdF9tYWdpYzsKLQlpbnQgbnVtX2RpY3Rfb2ZmLCBpbXBvcnRfb2ZmOworICAgIHVuc2lnbmVkIGNoYXIgKmRsbGJhc2UsICppbXBvcnRfZGF0YSwgKmltcG9ydF9uYW1lOworICAgIERXT1JEIHBlX29mZnNldCwgb3B0X29mZnNldDsKKyAgICBXT1JEIG9wdF9tYWdpYzsKKyAgICBpbnQgbnVtX2RpY3Rfb2ZmLCBpbXBvcnRfb2ZmOwogCi0JLyogU2FmZXR5IGNoZWNrIGlucHV0ICovCi0JaWYgKGhNb2R1bGUgPT0gTlVMTCkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogU2FmZXR5IGNoZWNrIGlucHV0ICovCisgICAgaWYgKGhNb2R1bGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBNb2R1bGUgaW5zdGFuY2UgaXMgYWxzbyB0aGUgYmFzZSBsb2FkIGFkZHJlc3MuICBGaXJzdCBwb3J0aW9uIG9mCi0JICAgbWVtb3J5IGlzIHRoZSBNUy1ET1MgbG9hZGVyLCB3aGljaCBob2xkcyB0aGUgb2Zmc2V0IHRvIHRoZSBQRQotCSAgIGhlYWRlciAoZnJvbSB0aGUgbG9hZCBiYXNlKSBhdCAweDNDICovCi0JZGxsYmFzZSA9ICh1bnNpZ25lZCBjaGFyICopaE1vZHVsZTsKLQlwZV9vZmZzZXQgPSBEV09SRF9BVChkbGxiYXNlICsgMHgzQyk7CisgICAgLyogTW9kdWxlIGluc3RhbmNlIGlzIGFsc28gdGhlIGJhc2UgbG9hZCBhZGRyZXNzLiAgRmlyc3QgcG9ydGlvbiBvZgorICAgICAgIG1lbW9yeSBpcyB0aGUgTVMtRE9TIGxvYWRlciwgd2hpY2ggaG9sZHMgdGhlIG9mZnNldCB0byB0aGUgUEUKKyAgICAgICBoZWFkZXIgKGZyb20gdGhlIGxvYWQgYmFzZSkgYXQgMHgzQyAqLworICAgIGRsbGJhc2UgPSAodW5zaWduZWQgY2hhciAqKWhNb2R1bGU7CisgICAgcGVfb2Zmc2V0ID0gRFdPUkRfQVQoZGxsYmFzZSArIDB4M0MpOwogCi0JLyogVGhlIFBFIHNpZ25hdHVyZSBtdXN0IGJlICJQRVwwXDAiICovCi0JaWYgKG1lbWNtcChkbGxiYXNlK3BlX29mZnNldCwiUEVcMFwwIiw0KSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgLyogVGhlIFBFIHNpZ25hdHVyZSBtdXN0IGJlICJQRVwwXDAiICovCisgICAgaWYgKG1lbWNtcChkbGxiYXNlK3BlX29mZnNldCwiUEVcMFwwIiw0KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBGb2xsb3dpbmcgdGhlIFBFIHNpZ25hdHVyZSBpcyB0aGUgc3RhbmRhcmQgQ09GRiBoZWFkZXIgKDIwCi0JICAgYnl0ZXMpIGFuZCB0aGVuIHRoZSBvcHRpb25hbCBoZWFkZXIuICBUaGUgb3B0aW9uYWwgaGVhZGVyIHN0YXJ0cwotCSAgIHdpdGggYSBtYWdpYyB2YWx1ZSBvZiAweDEwQiBmb3IgUEUzMiBvciAweDIwQiBmb3IgUEUzMisgKFBFMzIrCi0JICAgdXNlcyA2NC1iaXRzIGZvciBzb21lIGZpZWxkcykuICBJdCBtaWdodCBhbHNvIGJlIDB4MTA3IGZvciBhIFJPTQotCSAgIGltYWdlLCBidXQgd2UgZG9uJ3QgcHJvY2VzcyB0aGF0IGhlcmUuCisgICAgLyogRm9sbG93aW5nIHRoZSBQRSBzaWduYXR1cmUgaXMgdGhlIHN0YW5kYXJkIENPRkYgaGVhZGVyICgyMAorICAgICAgIGJ5dGVzKSBhbmQgdGhlbiB0aGUgb3B0aW9uYWwgaGVhZGVyLiAgVGhlIG9wdGlvbmFsIGhlYWRlciBzdGFydHMKKyAgICAgICB3aXRoIGEgbWFnaWMgdmFsdWUgb2YgMHgxMEIgZm9yIFBFMzIgb3IgMHgyMEIgZm9yIFBFMzIrIChQRTMyKworICAgICAgIHVzZXMgNjQtYml0cyBmb3Igc29tZSBmaWVsZHMpLiAgSXQgbWlnaHQgYWxzbyBiZSAweDEwNyBmb3IgYSBST00KKyAgICAgICBpbWFnZSwgYnV0IHdlIGRvbid0IHByb2Nlc3MgdGhhdCBoZXJlLgogCi0JICAgVGhlIG9wdGlvbmFsIGhlYWRlciBlbmRzIHdpdGggYSBkYXRhIGRpY3Rpb25hcnkgdGhhdCBkaXJlY3RseQotCSAgIHBvaW50cyB0byBjZXJ0YWluIHR5cGVzIG9mIGRhdGEsIGFtb25nIHRoZW0gdGhlIGltcG9ydCBlbnRyaWVzCi0JICAgKGluIHRoZSBzZWNvbmQgdGFibGUgZW50cnkpLiBCYXNlZCBvbiB0aGUgaGVhZGVyIHR5cGUsIHdlCi0JICAgZGV0ZXJtaW5lIG9mZnNldHMgZm9yIHRoZSBkYXRhIGRpY3Rpb25hcnkgY291bnQgYW5kIHRoZSBlbnRyeQotCSAgIHdpdGhpbiB0aGUgZGljdGlvbmFyeSBwb2ludGluZyB0byB0aGUgaW1wb3J0cy4gKi8KKyAgICAgICBUaGUgb3B0aW9uYWwgaGVhZGVyIGVuZHMgd2l0aCBhIGRhdGEgZGljdGlvbmFyeSB0aGF0IGRpcmVjdGx5CisgICAgICAgcG9pbnRzIHRvIGNlcnRhaW4gdHlwZXMgb2YgZGF0YSwgYW1vbmcgdGhlbSB0aGUgaW1wb3J0IGVudHJpZXMKKyAgICAgICAoaW4gdGhlIHNlY29uZCB0YWJsZSBlbnRyeSkuIEJhc2VkIG9uIHRoZSBoZWFkZXIgdHlwZSwgd2UKKyAgICAgICBkZXRlcm1pbmUgb2Zmc2V0cyBmb3IgdGhlIGRhdGEgZGljdGlvbmFyeSBjb3VudCBhbmQgdGhlIGVudHJ5CisgICAgICAgd2l0aGluIHRoZSBkaWN0aW9uYXJ5IHBvaW50aW5nIHRvIHRoZSBpbXBvcnRzLiAqLwogCi0Jb3B0X29mZnNldCA9IHBlX29mZnNldCArIDQgKyAyMDsKLQlvcHRfbWFnaWMgPSBXT1JEX0FUKGRsbGJhc2Urb3B0X29mZnNldCk7Ci0JaWYgKG9wdF9tYWdpYyA9PSAweDEwQikgewotCQkvKiBQRTMyICovCi0JCW51bV9kaWN0X29mZiA9IDkyOwotCQlpbXBvcnRfb2ZmICAgPSAxMDQ7Ci0JfSBlbHNlIGlmIChvcHRfbWFnaWMgPT0gMHgyMEIpIHsKLQkJLyogUEUzMisgKi8KLQkJbnVtX2RpY3Rfb2ZmID0gMTA4OwotCQlpbXBvcnRfb2ZmICAgPSAxMjA7Ci0JfSBlbHNlIHsKLQkJLyogVW5zdXBwb3J0ZWQgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG9wdF9vZmZzZXQgPSBwZV9vZmZzZXQgKyA0ICsgMjA7CisgICAgb3B0X21hZ2ljID0gV09SRF9BVChkbGxiYXNlK29wdF9vZmZzZXQpOworICAgIGlmIChvcHRfbWFnaWMgPT0gMHgxMEIpIHsKKyAgICAgICAgLyogUEUzMiAqLworICAgICAgICBudW1fZGljdF9vZmYgPSA5MjsKKyAgICAgICAgaW1wb3J0X29mZiAgID0gMTA0OworICAgIH0gZWxzZSBpZiAob3B0X21hZ2ljID09IDB4MjBCKSB7CisgICAgICAgIC8qIFBFMzIrICovCisgICAgICAgIG51bV9kaWN0X29mZiA9IDEwODsKKyAgICAgICAgaW1wb3J0X29mZiAgID0gMTIwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFVuc3VwcG9ydGVkICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIE5vdyBpZiBhbiBpbXBvcnQgdGFibGUgZXhpc3RzLCBvZmZzZXQgdG8gaXQgYW5kIHdhbGsgdGhlIGxpc3Qgb2YKLQkgICBpbXBvcnRzLiAgVGhlIGltcG9ydCB0YWJsZSBpcyBhbiBhcnJheSAoZW5kaW5nIHdoZW4gYW4gZW50cnkgaGFzCi0JICAgZW1wdHkgdmFsdWVzKSBvZiBzdHJ1Y3R1cmVzICgyMCBieXRlcyBlYWNoKSwgd2hpY2ggY29udGFpbnMgKGF0Ci0JICAgb2Zmc2V0IDEyKSBhIHJlbGF0aXZlIGFkZHJlc3MgKHRvIHRoZSBtb2R1bGUgYmFzZSkgYXQgd2hpY2ggYQotCSAgIHN0cmluZyBjb25zdGFudCBob2xkaW5nIHRoZSBpbXBvcnQgbmFtZSBpcyBsb2NhdGVkLiAqLworICAgIC8qIE5vdyBpZiBhbiBpbXBvcnQgdGFibGUgZXhpc3RzLCBvZmZzZXQgdG8gaXQgYW5kIHdhbGsgdGhlIGxpc3Qgb2YKKyAgICAgICBpbXBvcnRzLiAgVGhlIGltcG9ydCB0YWJsZSBpcyBhbiBhcnJheSAoZW5kaW5nIHdoZW4gYW4gZW50cnkgaGFzCisgICAgICAgZW1wdHkgdmFsdWVzKSBvZiBzdHJ1Y3R1cmVzICgyMCBieXRlcyBlYWNoKSwgd2hpY2ggY29udGFpbnMgKGF0CisgICAgICAgb2Zmc2V0IDEyKSBhIHJlbGF0aXZlIGFkZHJlc3MgKHRvIHRoZSBtb2R1bGUgYmFzZSkgYXQgd2hpY2ggYQorICAgICAgIHN0cmluZyBjb25zdGFudCBob2xkaW5nIHRoZSBpbXBvcnQgbmFtZSBpcyBsb2NhdGVkLiAqLwogCi0JaWYgKERXT1JEX0FUKGRsbGJhc2UgKyBvcHRfb2Zmc2V0ICsgbnVtX2RpY3Rfb2ZmKSA+PSAyKSB7Ci0JCS8qIFdlIGhhdmUgYXQgbGVhc3QgMiB0YWJsZXMgLSB0aGUgaW1wb3J0IHRhYmxlIGlzIHRoZSBzZWNvbmQKLQkJICAgb25lLiAgQnV0IHN0aWxsIGl0IG1heSBiZSB0aGF0IHRoZSB0YWJsZSBzaXplIGlzIHplcm8gKi8KLQkJaWYgKDAgPT0gRFdPUkRfQVQoZGxsYmFzZSArIG9wdF9vZmZzZXQgKyBpbXBvcnRfb2ZmICsgc2l6ZW9mKERXT1JEKSkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaW1wb3J0X2RhdGEgPSBkbGxiYXNlICsgRFdPUkRfQVQoZGxsYmFzZSArCi0JCQkJCQkgb3B0X29mZnNldCArCi0JCQkJCQkgaW1wb3J0X29mZik7Ci0JCXdoaWxlIChEV09SRF9BVChpbXBvcnRfZGF0YSkpIHsKLQkJCWltcG9ydF9uYW1lID0gZGxsYmFzZSArIERXT1JEX0FUKGltcG9ydF9kYXRhKzEyKTsKLQkJCWlmIChzdHJsZW4oaW1wb3J0X25hbWUpID49IDYgJiYKLQkJCSAgICAhc3RybmNtcChpbXBvcnRfbmFtZSwicHl0aG9uIiw2KSkgewotCQkJCWNoYXIgKnBjaDsKKyAgICBpZiAoRFdPUkRfQVQoZGxsYmFzZSArIG9wdF9vZmZzZXQgKyBudW1fZGljdF9vZmYpID49IDIpIHsKKyAgICAgICAgLyogV2UgaGF2ZSBhdCBsZWFzdCAyIHRhYmxlcyAtIHRoZSBpbXBvcnQgdGFibGUgaXMgdGhlIHNlY29uZAorICAgICAgICAgICBvbmUuICBCdXQgc3RpbGwgaXQgbWF5IGJlIHRoYXQgdGhlIHRhYmxlIHNpemUgaXMgemVybyAqLworICAgICAgICBpZiAoMCA9PSBEV09SRF9BVChkbGxiYXNlICsgb3B0X29mZnNldCArIGltcG9ydF9vZmYgKyBzaXplb2YoRFdPUkQpKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpbXBvcnRfZGF0YSA9IGRsbGJhc2UgKyBEV09SRF9BVChkbGxiYXNlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9vZmYpOworICAgICAgICB3aGlsZSAoRFdPUkRfQVQoaW1wb3J0X2RhdGEpKSB7CisgICAgICAgICAgICBpbXBvcnRfbmFtZSA9IGRsbGJhc2UgKyBEV09SRF9BVChpbXBvcnRfZGF0YSsxMik7CisgICAgICAgICAgICBpZiAoc3RybGVuKGltcG9ydF9uYW1lKSA+PSA2ICYmCisgICAgICAgICAgICAgICAgIXN0cm5jbXAoaW1wb3J0X25hbWUsInB5dGhvbiIsNikpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpwY2g7CiAKLQkJCQkvKiBFbnN1cmUgcHl0aG9uIHByZWZpeCBpcyBmb2xsb3dlZCBvbmx5Ci0JCQkJICAgYnkgbnVtYmVycyB0byB0aGUgZW5kIG9mIHRoZSBiYXNlbmFtZSAqLwotCQkJCXBjaCA9IGltcG9ydF9uYW1lICsgNjsKKyAgICAgICAgICAgICAgICAvKiBFbnN1cmUgcHl0aG9uIHByZWZpeCBpcyBmb2xsb3dlZCBvbmx5CisgICAgICAgICAgICAgICAgICAgYnkgbnVtYmVycyB0byB0aGUgZW5kIG9mIHRoZSBiYXNlbmFtZSAqLworICAgICAgICAgICAgICAgIHBjaCA9IGltcG9ydF9uYW1lICsgNjsKICNpZmRlZiBfREVCVUcKLQkJCQl3aGlsZSAoKnBjaCAmJiBwY2hbMF0gIT0gJ18nICYmIHBjaFsxXSAhPSAnZCcgJiYgcGNoWzJdICE9ICcuJykgeworICAgICAgICAgICAgICAgIHdoaWxlICgqcGNoICYmIHBjaFswXSAhPSAnXycgJiYgcGNoWzFdICE9ICdkJyAmJiBwY2hbMl0gIT0gJy4nKSB7CiAjZWxzZQotCQkJCXdoaWxlICgqcGNoICYmICpwY2ggIT0gJy4nKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCpwY2ggJiYgKnBjaCAhPSAnLicpIHsKICNlbmRpZgotCQkJCQlpZiAoKnBjaCA+PSAnMCcgJiYgKnBjaCA8PSAnOScpIHsKLQkJCQkJCXBjaCsrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcGNoID0gTlVMTDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCSAgICAKLQkJCQlpZiAocGNoKSB7Ci0JCQkJCS8qIEZvdW5kIGl0IC0gcmV0dXJuIHRoZSBuYW1lICovCi0JCQkJCXJldHVybiBpbXBvcnRfbmFtZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbXBvcnRfZGF0YSArPSAyMDsKLQkJfQotCX0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCpwY2ggPj0gJzAnICYmICpwY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwY2grKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjaCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KIAotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIGlmIChwY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRm91bmQgaXQgLSByZXR1cm4gdGhlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydF9uYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltcG9ydF9kYXRhICs9IDIwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogZGxfZnVuY3B0ciBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMoY29uc3QgY2hhciAqZnFuYW1lLCBjb25zdCBjaGFyICpzaG9ydG5hbWUsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlkbF9mdW5jcHRyIHA7Ci0JY2hhciBmdW5jbmFtZVsyNThdLCAqaW1wb3J0X3B5dGhvbjsKKyAgICBkbF9mdW5jcHRyIHA7CisgICAgY2hhciBmdW5jbmFtZVsyNThdLCAqaW1wb3J0X3B5dGhvbjsKIAotCVB5T1Nfc25wcmludGYoZnVuY25hbWUsIHNpemVvZihmdW5jbmFtZSksICJpbml0JS4yMDBzIiwgc2hvcnRuYW1lKTsKKyAgICBQeU9TX3NucHJpbnRmKGZ1bmNuYW1lLCBzaXplb2YoZnVuY25hbWUpLCAiaW5pdCUuMjAwcyIsIHNob3J0bmFtZSk7CiAKLQl7Ci0JCUhJTlNUQU5DRSBoRExMID0gTlVMTDsKLQkJY2hhciBwYXRoYnVmWzI2MF07Ci0JCUxQVFNUUiBkdW1teTsKLQkJdW5zaWduZWQgaW50IG9sZF9tb2RlOwotCQlVTE9OR19QVFIgY29va2llID0gMDsKLQkJLyogV2UgdXNlIExvYWRMaWJyYXJ5RXggc28gV2luZG93cyBsb29rcyBmb3IgZGVwZW5kZW50IERMTHMgCi0JCSAgICBpbiBkaXJlY3Rvcnkgb2YgcGF0aG5hbWUgZmlyc3QuICBIb3dldmVyLCBXaW5kb3dzOTUKLQkJICAgIGNhbiBzb21ldGltZXMgbm90IHdvcmsgY29ycmVjdGx5IHVubGVzcyB0aGUgYWJzb2x1dGUKLQkJICAgIHBhdGggaXMgdXNlZC4gIElmIEdldEZ1bGxQYXRoTmFtZSgpIGZhaWxzLCB0aGUgTG9hZExpYnJhcnkKLQkJICAgIHdpbGwgY2VydGFpbmx5IGZhaWwgdG9vLCBzbyB1c2UgaXRzIGVycm9yIGNvZGUgKi8KKyAgICB7CisgICAgICAgIEhJTlNUQU5DRSBoRExMID0gTlVMTDsKKyAgICAgICAgY2hhciBwYXRoYnVmWzI2MF07CisgICAgICAgIExQVFNUUiBkdW1teTsKKyAgICAgICAgdW5zaWduZWQgaW50IG9sZF9tb2RlOworICAgICAgICBVTE9OR19QVFIgY29va2llID0gMDsKKyAgICAgICAgLyogV2UgdXNlIExvYWRMaWJyYXJ5RXggc28gV2luZG93cyBsb29rcyBmb3IgZGVwZW5kZW50IERMTHMKKyAgICAgICAgICAgIGluIGRpcmVjdG9yeSBvZiBwYXRobmFtZSBmaXJzdC4gIEhvd2V2ZXIsIFdpbmRvd3M5NQorICAgICAgICAgICAgY2FuIHNvbWV0aW1lcyBub3Qgd29yayBjb3JyZWN0bHkgdW5sZXNzIHRoZSBhYnNvbHV0ZQorICAgICAgICAgICAgcGF0aCBpcyB1c2VkLiAgSWYgR2V0RnVsbFBhdGhOYW1lKCkgZmFpbHMsIHRoZSBMb2FkTGlicmFyeQorICAgICAgICAgICAgd2lsbCBjZXJ0YWlubHkgZmFpbCB0b28sIHNvIHVzZSBpdHMgZXJyb3IgY29kZSAqLwogCi0JCS8qIERvbid0IGRpc3BsYXkgYSBtZXNzYWdlIGJveCB3aGVuIFB5dGhvbiBjYW4ndCBsb2FkIGEgRExMICovCi0JCW9sZF9tb2RlID0gU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMpOworICAgICAgICAvKiBEb24ndCBkaXNwbGF5IGEgbWVzc2FnZSBib3ggd2hlbiBQeXRob24gY2FuJ3QgbG9hZCBhIERMTCAqLworICAgICAgICBvbGRfbW9kZSA9IFNldEVycm9yTW9kZShTRU1fRkFJTENSSVRJQ0FMRVJST1JTKTsKIAotCQlpZiAoR2V0RnVsbFBhdGhOYW1lKHBhdGhuYW1lLAotCQkJCSAgICBzaXplb2YocGF0aGJ1ZiksCi0JCQkJICAgIHBhdGhidWYsCi0JCQkJICAgICZkdW1teSkpIHsKLQkJCVVMT05HX1BUUiBjb29raWUgPSBfUHlfQWN0aXZhdGVBY3RDdHgoKTsKLQkJCS8qIFhYWCBUaGlzIGNhbGwgZG9lc24ndCBleGlzdCBpbiBXaW5kb3dzIENFICovCi0JCQloRExMID0gTG9hZExpYnJhcnlFeChwYXRobmFtZSwgTlVMTCwKLQkJCQkJICAgICBMT0FEX1dJVEhfQUxURVJFRF9TRUFSQ0hfUEFUSCk7Ci0JCQlfUHlfRGVhY3RpdmF0ZUFjdEN0eChjb29raWUpOwotCQl9CisgICAgICAgIGlmIChHZXRGdWxsUGF0aE5hbWUocGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhdGhidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15KSkgeworICAgICAgICAgICAgVUxPTkdfUFRSIGNvb2tpZSA9IF9QeV9BY3RpdmF0ZUFjdEN0eCgpOworICAgICAgICAgICAgLyogWFhYIFRoaXMgY2FsbCBkb2Vzbid0IGV4aXN0IGluIFdpbmRvd3MgQ0UgKi8KKyAgICAgICAgICAgIGhETEwgPSBMb2FkTGlicmFyeUV4KHBhdGhuYW1lLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9BRF9XSVRIX0FMVEVSRURfU0VBUkNIX1BBVEgpOworICAgICAgICAgICAgX1B5X0RlYWN0aXZhdGVBY3RDdHgoY29va2llKTsKKyAgICAgICAgfQogCi0JCS8qIHJlc3RvcmUgb2xkIGVycm9yIG1vZGUgc2V0dGluZ3MgKi8KLQkJU2V0RXJyb3JNb2RlKG9sZF9tb2RlKTsKKyAgICAgICAgLyogcmVzdG9yZSBvbGQgZXJyb3IgbW9kZSBzZXR0aW5ncyAqLworICAgICAgICBTZXRFcnJvck1vZGUob2xkX21vZGUpOwogCi0JCWlmIChoRExMPT1OVUxMKXsKLQkJCWNoYXIgZXJyQnVmWzI1Nl07Ci0JCQl1bnNpZ25lZCBpbnQgZXJyb3JDb2RlOworICAgICAgICBpZiAoaERMTD09TlVMTCl7CisgICAgICAgICAgICBjaGFyIGVyckJ1ZlsyNTZdOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGVycm9yQ29kZTsKIAotCQkJLyogR2V0IGFuIGVycm9yIHN0cmluZyBmcm9tIFdpbjMyIGVycm9yIGNvZGUgKi8KLQkJCWNoYXIgdGhlSW5mb1syNTZdOyAvKiBQb2ludGVyIHRvIGVycm9yIHRleHQKLQkJCQkJICAgICAgZnJvbSBzeXN0ZW0gKi8KLQkJCWludCB0aGVMZW5ndGg7IC8qIExlbmd0aCBvZiBlcnJvciB0ZXh0ICovCisgICAgICAgICAgICAvKiBHZXQgYW4gZXJyb3Igc3RyaW5nIGZyb20gV2luMzIgZXJyb3IgY29kZSAqLworICAgICAgICAgICAgY2hhciB0aGVJbmZvWzI1Nl07IC8qIFBvaW50ZXIgdG8gZXJyb3IgdGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3lzdGVtICovCisgICAgICAgICAgICBpbnQgdGhlTGVuZ3RoOyAvKiBMZW5ndGggb2YgZXJyb3IgdGV4dCAqLwogCi0JCQllcnJvckNvZGUgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGVycm9yQ29kZSA9IEdldExhc3RFcnJvcigpOwogCi0JCQl0aGVMZW5ndGggPSBGb3JtYXRNZXNzYWdlKAotCQkJCUZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKLQkJCQlGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywgLyogZmxhZ3MgKi8KLQkJCQlOVUxMLCAvKiBtZXNzYWdlIHNvdXJjZSAqLwotCQkJCWVycm9yQ29kZSwgLyogdGhlIG1lc3NhZ2UgKGVycm9yKSBJRCAqLwotCQkJCTAsIC8qIGRlZmF1bHQgbGFuZ3VhZ2UgZW52aXJvbm1lbnQgKi8KLQkJCQkoTFBUU1RSKSB0aGVJbmZvLCAvKiB0aGUgYnVmZmVyICovCi0JCQkJc2l6ZW9mKHRoZUluZm8pLCAvKiB0aGUgYnVmZmVyIHNpemUgKi8KLQkJCQlOVUxMKTsgLyogbm8gYWRkaXRpb25hbCBmb3JtYXQgYXJncy4gKi8KKyAgICAgICAgICAgIHRoZUxlbmd0aCA9IEZvcm1hdE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLCAvKiBmbGFncyAqLworICAgICAgICAgICAgICAgIE5VTEwsIC8qIG1lc3NhZ2Ugc291cmNlICovCisgICAgICAgICAgICAgICAgZXJyb3JDb2RlLCAvKiB0aGUgbWVzc2FnZSAoZXJyb3IpIElEICovCisgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCBsYW5ndWFnZSBlbnZpcm9ubWVudCAqLworICAgICAgICAgICAgICAgIChMUFRTVFIpIHRoZUluZm8sIC8qIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBzaXplb2YodGhlSW5mbyksIC8qIHRoZSBidWZmZXIgc2l6ZSAqLworICAgICAgICAgICAgICAgIE5VTEwpOyAvKiBubyBhZGRpdGlvbmFsIGZvcm1hdCBhcmdzLiAqLwogCi0JCQkvKiBQcm9ibGVtOiBjb3VsZCBub3QgZ2V0IHRoZSBlcnJvciBtZXNzYWdlLgotCQkJICAgVGhpcyBzaG91bGQgbm90IGhhcHBlbiBpZiBjYWxsZWQgY29ycmVjdGx5LiAqLwotCQkJaWYgKHRoZUxlbmd0aCA9PSAwKSB7Ci0JCQkJUHlPU19zbnByaW50ZihlcnJCdWYsIHNpemVvZihlcnJCdWYpLAotCQkJCSAgICAgICJETEwgbG9hZCBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkIiwKLQkJCQkJICAgICAgZXJyb3JDb2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2l6ZV90IGxlbjsKLQkJCQkvKiBGb3Igc29tZSByZWFzb24gYSBcclxuCi0JCQkJICAgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQgKi8KLQkJCQlpZiAodGhlTGVuZ3RoID49IDIgJiYKLQkJCQkgICAgdGhlSW5mb1t0aGVMZW5ndGgtMl0gPT0gJ1xyJyAmJgotCQkJCSAgICB0aGVJbmZvW3RoZUxlbmd0aC0xXSA9PSAnXG4nKSB7Ci0JCQkJCXRoZUxlbmd0aCAtPSAyOwotCQkJCQl0aGVJbmZvW3RoZUxlbmd0aF0gPSAnXDAnOwotCQkJCX0KLQkJCQlzdHJjcHkoZXJyQnVmLCAiRExMIGxvYWQgZmFpbGVkOiAiKTsKLQkJCQlsZW4gPSBzdHJsZW4oZXJyQnVmKTsKLQkJCQlzdHJuY3B5KGVyckJ1ZitsZW4sIHRoZUluZm8sCi0JCQkJCXNpemVvZihlcnJCdWYpLWxlbik7Ci0JCQkJZXJyQnVmW3NpemVvZihlcnJCdWYpLTFdID0gJ1wwJzsKLQkJCX0KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgZXJyQnVmKTsKLQkJCXJldHVybiBOVUxMOwotCQl9IGVsc2UgewotCQkJY2hhciBidWZmZXJbMjU2XTsKKyAgICAgICAgICAgIC8qIFByb2JsZW06IGNvdWxkIG5vdCBnZXQgdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgICAgICAgICAgICBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGlmIGNhbGxlZCBjb3JyZWN0bHkuICovCisgICAgICAgICAgICBpZiAodGhlTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGVyckJ1Ziwgc2l6ZW9mKGVyckJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgIkRMTCBsb2FkIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuOworICAgICAgICAgICAgICAgIC8qIEZvciBzb21lIHJlYXNvbiBhIFxyXG4KKyAgICAgICAgICAgICAgICAgICBpcyBhcHBlbmRlZCB0byB0aGUgdGV4dCAqLworICAgICAgICAgICAgICAgIGlmICh0aGVMZW5ndGggPj0gMiAmJgorICAgICAgICAgICAgICAgICAgICB0aGVJbmZvW3RoZUxlbmd0aC0yXSA9PSAnXHInICYmCisgICAgICAgICAgICAgICAgICAgIHRoZUluZm9bdGhlTGVuZ3RoLTFdID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhlTGVuZ3RoIC09IDI7CisgICAgICAgICAgICAgICAgICAgIHRoZUluZm9bdGhlTGVuZ3RoXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmNweShlcnJCdWYsICJETEwgbG9hZCBmYWlsZWQ6ICIpOworICAgICAgICAgICAgICAgIGxlbiA9IHN0cmxlbihlcnJCdWYpOworICAgICAgICAgICAgICAgIHN0cm5jcHkoZXJyQnVmK2xlbiwgdGhlSW5mbywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVyckJ1ZiktbGVuKTsKKyAgICAgICAgICAgICAgICBlcnJCdWZbc2l6ZW9mKGVyckJ1ZiktMV0gPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJCdWYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOwogCiAjaWZkZWYgX0RFQlVHCi0JCQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICJweXRob24lZCVkX2QuZGxsIiwKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgInB5dGhvbiVkJWRfZC5kbGwiLAogI2Vsc2UKLQkJCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgInB5dGhvbiVkJWQuZGxsIiwKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgInB5dGhvbiVkJWQuZGxsIiwKICNlbmRpZgotCQkJCSAgICAgIFBZX01BSk9SX1ZFUlNJT04sUFlfTUlOT1JfVkVSU0lPTik7Ci0JCQlpbXBvcnRfcHl0aG9uID0gR2V0UHl0aG9uSW1wb3J0KGhETEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICBQWV9NQUpPUl9WRVJTSU9OLFBZX01JTk9SX1ZFUlNJT04pOworICAgICAgICAgICAgaW1wb3J0X3B5dGhvbiA9IEdldFB5dGhvbkltcG9ydChoRExMKTsKIAotCQkJaWYgKGltcG9ydF9weXRob24gJiYKLQkJCSAgICBzdHJjYXNlY21wKGJ1ZmZlcixpbXBvcnRfcHl0aG9uKSkgewotCQkJCVB5T1Nfc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCQkJICAgICAgIk1vZHVsZSB1c2Ugb2YgJS4xNTBzIGNvbmZsaWN0cyAiCi0JCQkJCSAgICAgICJ3aXRoIHRoaXMgdmVyc2lvbiBvZiBQeXRob24uIiwKLQkJCQkJICAgICAgaW1wb3J0X3B5dGhvbik7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLGJ1ZmZlcik7Ci0JCQkJRnJlZUxpYnJhcnkoaERMTCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0KLQkJcCA9IEdldFByb2NBZGRyZXNzKGhETEwsIGZ1bmNuYW1lKTsKLQl9CisgICAgICAgICAgICBpZiAoaW1wb3J0X3B5dGhvbiAmJgorICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAoYnVmZmVyLGltcG9ydF9weXRob24pKSB7CisgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vZHVsZSB1c2Ugb2YgJS4xNTBzIGNvbmZsaWN0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB0aGlzIHZlcnNpb24gb2YgUHl0aG9uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRfcHl0aG9uKTsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBGcmVlTGlicmFyeShoRExMKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwID0gR2V0UHJvY0FkZHJlc3MoaERMTCwgZnVuY25hbWUpOworICAgIH0KIAotCXJldHVybiBwOworICAgIHJldHVybiBwOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Vycm9ycy5jIGIvUHl0aG9uL2Vycm9ycy5jCmluZGV4IDYxNWRhMTkuLmRhNGI0NjMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9lcnJvcnMuYworKysgYi9QeXRob24vZXJyb3JzLmMKQEAgLTI0LDEwOSArMjQsMTA5IEBACiB2b2lkCiBQeUVycl9SZXN0b3JlKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUsIFB5T2JqZWN0ICp0cmFjZWJhY2spCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqb2xkdHlwZSwgKm9sZHZhbHVlLCAqb2xkdHJhY2ViYWNrOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKm9sZHR5cGUsICpvbGR2YWx1ZSwgKm9sZHRyYWNlYmFjazsKIAotCWlmICh0cmFjZWJhY2sgIT0gTlVMTCAmJiAhUHlUcmFjZUJhY2tfQ2hlY2sodHJhY2ViYWNrKSkgewotCQkvKiBYWFggU2hvdWxkIG5ldmVyIGhhcHBlbiAtLSBmYXRhbCBlcnJvciBpbnN0ZWFkPyAqLwotCQkvKiBXZWxsLCBpdCBjb3VsZCBiZSBOb25lLiAqLwotCQlQeV9ERUNSRUYodHJhY2ViYWNrKTsKLQkJdHJhY2ViYWNrID0gTlVMTDsKLQl9CisgICAgaWYgKHRyYWNlYmFjayAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayh0cmFjZWJhY2spKSB7CisgICAgICAgIC8qIFhYWCBTaG91bGQgbmV2ZXIgaGFwcGVuIC0tIGZhdGFsIGVycm9yIGluc3RlYWQ/ICovCisgICAgICAgIC8qIFdlbGwsIGl0IGNvdWxkIGJlIE5vbmUuICovCisgICAgICAgIFB5X0RFQ1JFRih0cmFjZWJhY2spOworICAgICAgICB0cmFjZWJhY2sgPSBOVUxMOworICAgIH0KIAotCS8qIFNhdmUgdGhlc2UgaW4gbG9jYWxzIHRvIHNhZmVndWFyZCBhZ2FpbnN0IHJlY3Vyc2l2ZQotCSAgIGludm9jYXRpb24gdGhyb3VnaCBQeV9YREVDUkVGICovCi0Jb2xkdHlwZSA9IHRzdGF0ZS0+Y3VyZXhjX3R5cGU7Ci0Jb2xkdmFsdWUgPSB0c3RhdGUtPmN1cmV4Y192YWx1ZTsKLQlvbGR0cmFjZWJhY2sgPSB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2s7CisgICAgLyogU2F2ZSB0aGVzZSBpbiBsb2NhbHMgdG8gc2FmZWd1YXJkIGFnYWluc3QgcmVjdXJzaXZlCisgICAgICAgaW52b2NhdGlvbiB0aHJvdWdoIFB5X1hERUNSRUYgKi8KKyAgICBvbGR0eXBlID0gdHN0YXRlLT5jdXJleGNfdHlwZTsKKyAgICBvbGR2YWx1ZSA9IHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlOworICAgIG9sZHRyYWNlYmFjayA9IHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjazsKIAotCXRzdGF0ZS0+Y3VyZXhjX3R5cGUgPSB0eXBlOwotCXRzdGF0ZS0+Y3VyZXhjX3ZhbHVlID0gdmFsdWU7Ci0JdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID0gdHJhY2ViYWNrOworICAgIHRzdGF0ZS0+Y3VyZXhjX3R5cGUgPSB0eXBlOworICAgIHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlID0gdmFsdWU7CisgICAgdHN0YXRlLT5jdXJleGNfdHJhY2ViYWNrID0gdHJhY2ViYWNrOwogCi0JUHlfWERFQ1JFRihvbGR0eXBlKTsKLQlQeV9YREVDUkVGKG9sZHZhbHVlKTsKLQlQeV9YREVDUkVGKG9sZHRyYWNlYmFjayk7CisgICAgUHlfWERFQ1JFRihvbGR0eXBlKTsKKyAgICBQeV9YREVDUkVGKG9sZHZhbHVlKTsKKyAgICBQeV9YREVDUkVGKG9sZHRyYWNlYmFjayk7CiB9CiAKIHZvaWQKIFB5RXJyX1NldE9iamVjdChQeU9iamVjdCAqZXhjZXB0aW9uLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0JUHlfWElOQ1JFRihleGNlcHRpb24pOwotCVB5X1hJTkNSRUYodmFsdWUpOwotCVB5RXJyX1Jlc3RvcmUoZXhjZXB0aW9uLCB2YWx1ZSwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgUHlfWElOQ1JFRihleGNlcHRpb24pOworICAgIFB5X1hJTkNSRUYodmFsdWUpOworICAgIFB5RXJyX1Jlc3RvcmUoZXhjZXB0aW9uLCB2YWx1ZSwgKFB5T2JqZWN0ICopTlVMTCk7CiB9CiAKIHZvaWQKIFB5RXJyX1NldE5vbmUoUHlPYmplY3QgKmV4Y2VwdGlvbikKIHsKLQlQeUVycl9TZXRPYmplY3QoZXhjZXB0aW9uLCAoUHlPYmplY3QgKilOVUxMKTsKKyAgICBQeUVycl9TZXRPYmplY3QoZXhjZXB0aW9uLCAoUHlPYmplY3QgKilOVUxMKTsKIH0KIAogdm9pZAogUHlFcnJfU2V0U3RyaW5nKFB5T2JqZWN0ICpleGNlcHRpb24sIGNvbnN0IGNoYXIgKnN0cmluZykKIHsKLQlQeU9iamVjdCAqdmFsdWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHN0cmluZyk7Ci0JUHlFcnJfU2V0T2JqZWN0KGV4Y2VwdGlvbiwgdmFsdWUpOwotCVB5X1hERUNSRUYodmFsdWUpOworICAgIFB5T2JqZWN0ICp2YWx1ZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyaW5nKTsKKyAgICBQeUVycl9TZXRPYmplY3QoZXhjZXB0aW9uLCB2YWx1ZSk7CisgICAgUHlfWERFQ1JFRih2YWx1ZSk7CiB9CiAKIAogUHlPYmplY3QgKgogUHlFcnJfT2NjdXJyZWQodm9pZCkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CiAKLQlyZXR1cm4gdHN0YXRlLT5jdXJleGNfdHlwZTsKKyAgICByZXR1cm4gdHN0YXRlLT5jdXJleGNfdHlwZTsKIH0KIAogCiBpbnQKIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhQeU9iamVjdCAqZXJyLCBQeU9iamVjdCAqZXhjKQogewotCWlmIChlcnIgPT0gTlVMTCB8fCBleGMgPT0gTlVMTCkgewotCQkvKiBtYXliZSBjYXVzZWQgYnkgImltcG9ydCBleGNlcHRpb25zIiB0aGF0IGZhaWxlZCBlYXJseSBvbiAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKFB5VHVwbGVfQ2hlY2soZXhjKSkgewotCQlQeV9zc2l6ZV90IGksIG47Ci0JCW4gPSBQeVR1cGxlX1NpemUoZXhjKTsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJLyogVGVzdCByZWN1cnNpdmVseSAqLwotCQkgICAgIGlmIChQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoCi0JCQkgICAgIGVyciwgUHlUdXBsZV9HRVRfSVRFTShleGMsIGkpKSkKLQkJICAgICB7Ci0JCQkgICAgIHJldHVybiAxOwotCQkgICAgIH0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JLyogZXJyIG1pZ2h0IGJlIGFuIGluc3RhbmNlLCBzbyBjaGVjayBpdHMgY2xhc3MuICovCi0JaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2soZXJyKSkKLQkJZXJyID0gUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyhlcnIpOworICAgIGlmIChlcnIgPT0gTlVMTCB8fCBleGMgPT0gTlVMTCkgeworICAgICAgICAvKiBtYXliZSBjYXVzZWQgYnkgImltcG9ydCBleGNlcHRpb25zIiB0aGF0IGZhaWxlZCBlYXJseSBvbiAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soZXhjKSkgeworICAgICAgICBQeV9zc2l6ZV90IGksIG47CisgICAgICAgIG4gPSBQeVR1cGxlX1NpemUoZXhjKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgLyogVGVzdCByZWN1cnNpdmVseSAqLworICAgICAgICAgICAgIGlmIChQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoCisgICAgICAgICAgICAgICAgIGVyciwgUHlUdXBsZV9HRVRfSVRFTShleGMsIGkpKSkKKyAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogZXJyIG1pZ2h0IGJlIGFuIGluc3RhbmNlLCBzbyBjaGVjayBpdHMgY2xhc3MuICovCisgICAgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2soZXJyKSkKKyAgICAgICAgZXJyID0gUHlFeGNlcHRpb25JbnN0YW5jZV9DbGFzcyhlcnIpOwogCi0JaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2soZXJyKSAmJiBQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGV4YykpIHsKLQkJaW50IHJlcyA9IDA7Ci0JCVB5T2JqZWN0ICpleGNlcHRpb24sICp2YWx1ZSwgKnRiOwotCQlQeUVycl9GZXRjaCgmZXhjZXB0aW9uLCAmdmFsdWUsICZ0Yik7Ci0JCXJlcyA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoZXJyLCBleGMpOwotCQkvKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGZhaWwsIHNvIHByaW50IHRoZSBlcnJvciBoZXJlICovCi0JCWlmIChyZXMgPT0gLTEpIHsKLQkJCVB5RXJyX1dyaXRlVW5yYWlzYWJsZShlcnIpOwotCQkJcmVzID0gMDsKLQkJfQotCQlQeUVycl9SZXN0b3JlKGV4Y2VwdGlvbiwgdmFsdWUsIHRiKTsKLQkJcmV0dXJuIHJlczsKLQl9CisgICAgaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2soZXJyKSAmJiBQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGV4YykpIHsKKyAgICAgICAgaW50IHJlcyA9IDA7CisgICAgICAgIFB5T2JqZWN0ICpleGNlcHRpb24sICp2YWx1ZSwgKnRiOworICAgICAgICBQeUVycl9GZXRjaCgmZXhjZXB0aW9uLCAmdmFsdWUsICZ0Yik7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0lzU3ViY2xhc3MoZXJyLCBleGMpOworICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGZhaWwsIHNvIHByaW50IHRoZSBlcnJvciBoZXJlICovCisgICAgICAgIGlmIChyZXMgPT0gLTEpIHsKKyAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZShlcnIpOworICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9SZXN0b3JlKGV4Y2VwdGlvbiwgdmFsdWUsIHRiKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CiAKLQlyZXR1cm4gZXJyID09IGV4YzsKKyAgICByZXR1cm4gZXJyID09IGV4YzsKIH0KIAogCiBpbnQKIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlPYmplY3QgKmV4YykKIHsKLQlyZXR1cm4gUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKFB5RXJyX09jY3VycmVkKCksIGV4Yyk7CisgICAgcmV0dXJuIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhQeUVycl9PY2N1cnJlZCgpLCBleGMpOwogfQogCiAKQEAgLTEzNiwxMjMgKzEzNiwxMjMgQEAKIHZvaWQKIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbihQeU9iamVjdCAqKmV4YywgUHlPYmplY3QgKip2YWwsIFB5T2JqZWN0ICoqdGIpCiB7Ci0JUHlPYmplY3QgKnR5cGUgPSAqZXhjOwotCVB5T2JqZWN0ICp2YWx1ZSA9ICp2YWw7Ci0JUHlPYmplY3QgKmluY2xhc3MgPSBOVUxMOwotCVB5T2JqZWN0ICppbml0aWFsX3RiID0gTlVMTDsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0eXBlID0gKmV4YzsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSAqdmFsOworICAgIFB5T2JqZWN0ICppbmNsYXNzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaW5pdGlhbF90YiA9IE5VTEw7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gTlVMTDsKIAotCWlmICh0eXBlID09IE5VTEwpIHsKLQkJLyogVGhlcmUgd2FzIG5vIGV4Y2VwdGlvbiwgc28gbm90aGluZyB0byBkby4gKi8KLQkJcmV0dXJuOwotCX0KKyAgICBpZiAodHlwZSA9PSBOVUxMKSB7CisgICAgICAgIC8qIFRoZXJlIHdhcyBubyBleGNlcHRpb24sIHNvIG5vdGhpbmcgdG8gZG8uICovCisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQkvKiBJZiBQeUVycl9TZXROb25lKCkgd2FzIHVzZWQsIHRoZSB2YWx1ZSB3aWxsIGhhdmUgYmVlbiBhY3R1YWxseQotCSAgIHNldCB0byBOVUxMLgotCSovCi0JaWYgKCF2YWx1ZSkgewotCQl2YWx1ZSA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JfQorICAgIC8qIElmIFB5RXJyX1NldE5vbmUoKSB3YXMgdXNlZCwgdGhlIHZhbHVlIHdpbGwgaGF2ZSBiZWVuIGFjdHVhbGx5CisgICAgICAgc2V0IHRvIE5VTEwuCisgICAgKi8KKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIHZhbHVlID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICB9CiAKLQlpZiAoUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh2YWx1ZSkpCi0JCWluY2xhc3MgPSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHZhbHVlKTsKKyAgICBpZiAoUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh2YWx1ZSkpCisgICAgICAgIGluY2xhc3MgPSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHZhbHVlKTsKIAotCS8qIE5vcm1hbGl6ZSB0aGUgZXhjZXB0aW9uIHNvIHRoYXQgaWYgdGhlIHR5cGUgaXMgYSBjbGFzcywgdGhlCi0JICAgdmFsdWUgd2lsbCBiZSBhbiBpbnN0YW5jZS4KLQkqLwotCWlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHR5cGUpKSB7Ci0JCS8qIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGFuIGluc3RhbmNlLCBvciBpcyBub3QgYW4gaW5zdGFuY2UKLQkJICAgd2hvc2UgY2xhc3MgaXMgKG9yIGlzIGRlcml2ZWQgZnJvbSkgdHlwZSwgdGhlbiB1c2UgdGhlCi0JCSAgIHZhbHVlIGFzIGFuIGFyZ3VtZW50IHRvIGluc3RhbnRpYXRpb24gb2YgdGhlIHR5cGUKLQkJICAgY2xhc3MuCi0JCSovCi0JCWlmICghaW5jbGFzcyB8fCAhUHlPYmplY3RfSXNTdWJjbGFzcyhpbmNsYXNzLCB0eXBlKSkgewotCQkJUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgLyogTm9ybWFsaXplIHRoZSBleGNlcHRpb24gc28gdGhhdCBpZiB0aGUgdHlwZSBpcyBhIGNsYXNzLCB0aGUKKyAgICAgICB2YWx1ZSB3aWxsIGJlIGFuIGluc3RhbmNlLgorICAgICovCisgICAgaWYgKFB5RXhjZXB0aW9uQ2xhc3NfQ2hlY2sodHlwZSkpIHsKKyAgICAgICAgLyogaWYgdGhlIHZhbHVlIHdhcyBub3QgYW4gaW5zdGFuY2UsIG9yIGlzIG5vdCBhbiBpbnN0YW5jZQorICAgICAgICAgICB3aG9zZSBjbGFzcyBpcyAob3IgaXMgZGVyaXZlZCBmcm9tKSB0eXBlLCB0aGVuIHVzZSB0aGUKKyAgICAgICAgICAgdmFsdWUgYXMgYW4gYXJndW1lbnQgdG8gaW5zdGFudGlhdGlvbiBvZiB0aGUgdHlwZQorICAgICAgICAgICBjbGFzcy4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKCFpbmNsYXNzIHx8ICFQeU9iamVjdF9Jc1N1YmNsYXNzKGluY2xhc3MsIHR5cGUpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqYXJncywgKnJlczsKIAotCQkJaWYgKHZhbHVlID09IFB5X05vbmUpCi0JCQkJYXJncyA9IFB5VHVwbGVfTmV3KDApOwotCQkJZWxzZSBpZiAoUHlUdXBsZV9DaGVjayh2YWx1ZSkpIHsKLQkJCQlQeV9JTkNSRUYodmFsdWUpOwotCQkJCWFyZ3MgPSB2YWx1ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlhcmdzID0gUHlUdXBsZV9QYWNrKDEsIHZhbHVlKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBhcmdzID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjaygxLCB2YWx1ZSk7CiAKLQkJCWlmIChhcmdzID09IE5VTEwpCi0JCQkJZ290byBmaW5hbGx5OwotCQkJcmVzID0gUHlFdmFsX0NhbGxPYmplY3QodHlwZSwgYXJncyk7Ci0JCQlQeV9ERUNSRUYoYXJncyk7Ci0JCQlpZiAocmVzID09IE5VTEwpCi0JCQkJZ290byBmaW5hbGx5OwotCQkJUHlfREVDUkVGKHZhbHVlKTsKLQkJCXZhbHVlID0gcmVzOwotCQl9Ci0JCS8qIGlmIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGFjdGx5IG1hdGNoIHRoZQotCQkgICBjbGFzcyBvZiB0aGUgdHlwZSwgYmVsaWV2ZSB0aGUgaW5zdGFuY2UKLQkJKi8KLQkJZWxzZSBpZiAoaW5jbGFzcyAhPSB0eXBlKSB7Ci0gCQkJUHlfREVDUkVGKHR5cGUpOwotCQkJdHlwZSA9IGluY2xhc3M7Ci0JCQlQeV9JTkNSRUYodHlwZSk7Ci0JCX0KLQl9Ci0JKmV4YyA9IHR5cGU7Ci0JKnZhbCA9IHZhbHVlOwotCXJldHVybjsKKyAgICAgICAgICAgIGlmIChhcmdzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QodHlwZSwgYXJncyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBmaW5hbGx5OworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHZhbHVlID0gcmVzOworICAgICAgICB9CisgICAgICAgIC8qIGlmIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2UgZG9lc24ndCBleGFjdGx5IG1hdGNoIHRoZQorICAgICAgICAgICBjbGFzcyBvZiB0aGUgdHlwZSwgYmVsaWV2ZSB0aGUgaW5zdGFuY2UKKyAgICAgICAgKi8KKyAgICAgICAgZWxzZSBpZiAoaW5jbGFzcyAhPSB0eXBlKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodHlwZSk7CisgICAgICAgICAgICB0eXBlID0gaW5jbGFzczsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAqZXhjID0gdHlwZTsKKyAgICAqdmFsID0gdmFsdWU7CisgICAgcmV0dXJuOwogZmluYWxseToKLQlQeV9ERUNSRUYodHlwZSk7Ci0JUHlfREVDUkVGKHZhbHVlKTsKLQkvKiBJZiB0aGUgbmV3IGV4Y2VwdGlvbiBkb2Vzbid0IHNldCBhIHRyYWNlYmFjayBhbmQgdGhlIG9sZAotCSAgIGV4Y2VwdGlvbiBoYWQgYSB0cmFjZWJhY2ssIHVzZSB0aGUgb2xkIHRyYWNlYmFjayBmb3IgdGhlCi0JICAgbmV3IGV4Y2VwdGlvbi4gIEl0J3MgYmV0dGVyIHRoYW4gbm90aGluZy4KLQkqLwotCWluaXRpYWxfdGIgPSAqdGI7Ci0JUHlFcnJfRmV0Y2goZXhjLCB2YWwsIHRiKTsKLQlpZiAoaW5pdGlhbF90YiAhPSBOVUxMKSB7Ci0JCWlmICgqdGIgPT0gTlVMTCkKLQkJCSp0YiA9IGluaXRpYWxfdGI7Ci0JCWVsc2UKLQkJCVB5X0RFQ1JFRihpbml0aWFsX3RiKTsKLQl9Ci0JLyogbm9ybWFsaXplIHJlY3Vyc2l2ZWx5ICovCi0JdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlpZiAoKyt0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aCA+IFB5X0dldFJlY3Vyc2lvbkxpbWl0KCkpIHsKLQkgICAgLS10c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aDsKLQkgICAgLyogdGhyb3cgYXdheSB0aGUgb2xkIGV4Y2VwdGlvbi4uLiAqLwotCSAgICBQeV9ERUNSRUYoKmV4Yyk7Ci0JICAgIFB5X0RFQ1JFRigqdmFsKTsKLQkgICAgLyogLi4uIGFuZCB1c2UgdGhlIHJlY3Vyc2lvbiBlcnJvciBpbnN0ZWFkICovCi0JICAgICpleGMgPSBQeUV4Y19SdW50aW1lRXJyb3I7Ci0JICAgICp2YWwgPSBQeUV4Y19SZWN1cnNpb25FcnJvckluc3Q7Ci0JICAgIFB5X0lOQ1JFRigqZXhjKTsKLQkgICAgUHlfSU5DUkVGKCp2YWwpOwotCSAgICAvKiBqdXN0IGtlZXBpbmcgdGhlIG9sZCB0cmFjZWJhY2sgKi8KLQkgICAgcmV0dXJuOwotCX0KLQlQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oZXhjLCB2YWwsIHRiKTsKLQktLXRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOworICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOworICAgIC8qIElmIHRoZSBuZXcgZXhjZXB0aW9uIGRvZXNuJ3Qgc2V0IGEgdHJhY2ViYWNrIGFuZCB0aGUgb2xkCisgICAgICAgZXhjZXB0aW9uIGhhZCBhIHRyYWNlYmFjaywgdXNlIHRoZSBvbGQgdHJhY2ViYWNrIGZvciB0aGUKKyAgICAgICBuZXcgZXhjZXB0aW9uLiAgSXQncyBiZXR0ZXIgdGhhbiBub3RoaW5nLgorICAgICovCisgICAgaW5pdGlhbF90YiA9ICp0YjsKKyAgICBQeUVycl9GZXRjaChleGMsIHZhbCwgdGIpOworICAgIGlmIChpbml0aWFsX3RiICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCp0YiA9PSBOVUxMKQorICAgICAgICAgICAgKnRiID0gaW5pdGlhbF90YjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlfREVDUkVGKGluaXRpYWxfdGIpOworICAgIH0KKyAgICAvKiBub3JtYWxpemUgcmVjdXJzaXZlbHkgKi8KKyAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIGlmICgrK3RzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoID4gUHlfR2V0UmVjdXJzaW9uTGltaXQoKSkgeworICAgICAgICAtLXRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoOworICAgICAgICAvKiB0aHJvdyBhd2F5IHRoZSBvbGQgZXhjZXB0aW9uLi4uICovCisgICAgICAgIFB5X0RFQ1JFRigqZXhjKTsKKyAgICAgICAgUHlfREVDUkVGKCp2YWwpOworICAgICAgICAvKiAuLi4gYW5kIHVzZSB0aGUgcmVjdXJzaW9uIGVycm9yIGluc3RlYWQgKi8KKyAgICAgICAgKmV4YyA9IFB5RXhjX1J1bnRpbWVFcnJvcjsKKyAgICAgICAgKnZhbCA9IFB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdDsKKyAgICAgICAgUHlfSU5DUkVGKCpleGMpOworICAgICAgICBQeV9JTkNSRUYoKnZhbCk7CisgICAgICAgIC8qIGp1c3Qga2VlcGluZyB0aGUgb2xkIHRyYWNlYmFjayAqLworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbihleGMsIHZhbCwgdGIpOworICAgIC0tdHN0YXRlLT5yZWN1cnNpb25fZGVwdGg7CiB9CiAKIAogdm9pZAogUHlFcnJfRmV0Y2goUHlPYmplY3QgKipwX3R5cGUsIFB5T2JqZWN0ICoqcF92YWx1ZSwgUHlPYmplY3QgKipwX3RyYWNlYmFjaykKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CiAKLQkqcF90eXBlID0gdHN0YXRlLT5jdXJleGNfdHlwZTsKLQkqcF92YWx1ZSA9IHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlOwotCSpwX3RyYWNlYmFjayA9IHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjazsKKyAgICAqcF90eXBlID0gdHN0YXRlLT5jdXJleGNfdHlwZTsKKyAgICAqcF92YWx1ZSA9IHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlOworICAgICpwX3RyYWNlYmFjayA9IHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjazsKIAotCXRzdGF0ZS0+Y3VyZXhjX3R5cGUgPSBOVUxMOwotCXRzdGF0ZS0+Y3VyZXhjX3ZhbHVlID0gTlVMTDsKLQl0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSBOVUxMOworICAgIHRzdGF0ZS0+Y3VyZXhjX3R5cGUgPSBOVUxMOworICAgIHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlID0gTlVMTDsKKyAgICB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSBOVUxMOwogfQogCiB2b2lkCiBQeUVycl9DbGVhcih2b2lkKQogewotCVB5RXJyX1Jlc3RvcmUoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgUHlFcnJfUmVzdG9yZShOVUxMLCBOVUxMLCBOVUxMKTsKIH0KIAogLyogQ29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIHNldCBhIHR5cGUgZXJyb3IgZXhjZXB0aW9uIGFuZCByZXR1cm4gMCAqLwpAQCAtMjYwLDI1MiArMjYwLDI1MiBAQAogaW50CiBQeUVycl9CYWRBcmd1bWVudCh2b2lkKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkiYmFkIGFyZ3VtZW50IHR5cGUgZm9yIGJ1aWx0LWluIG9wZXJhdGlvbiIpOwotCXJldHVybiAwOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJiYWQgYXJndW1lbnQgdHlwZSBmb3IgYnVpbHQtaW4gb3BlcmF0aW9uIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIFB5T2JqZWN0ICoKIFB5RXJyX05vTWVtb3J5KHZvaWQpCiB7Ci0JaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfTWVtb3J5RXJyb3IpKQotCQkvKiBhbHJlYWR5IGN1cnJlbnQgKi8KLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfTWVtb3J5RXJyb3IpKQorICAgICAgICAvKiBhbHJlYWR5IGN1cnJlbnQgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiByYWlzZSB0aGUgcHJlLWFsbG9jYXRlZCBpbnN0YW5jZSBpZiBpdCBzdGlsbCBleGlzdHMgKi8KLQlpZiAoUHlFeGNfTWVtb3J5RXJyb3JJbnN0KQotCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfTWVtb3J5RXJyb3IsIFB5RXhjX01lbW9yeUVycm9ySW5zdCk7Ci0JZWxzZQotCQkvKiB0aGlzIHdpbGwgcHJvYmFibHkgZmFpbCBzaW5jZSB0aGVyZSdzIG5vIG1lbW9yeSBhbmQgaGVlLAotCQkgICBoZWUsIHdlIGhhdmUgdG8gaW5zdGFudGlhdGUgdGhpcyBjbGFzcwotCQkqLwotCQlQeUVycl9TZXROb25lKFB5RXhjX01lbW9yeUVycm9yKTsKKyAgICAvKiByYWlzZSB0aGUgcHJlLWFsbG9jYXRlZCBpbnN0YW5jZSBpZiBpdCBzdGlsbCBleGlzdHMgKi8KKyAgICBpZiAoUHlFeGNfTWVtb3J5RXJyb3JJbnN0KQorICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfTWVtb3J5RXJyb3IsIFB5RXhjX01lbW9yeUVycm9ySW5zdCk7CisgICAgZWxzZQorICAgICAgICAvKiB0aGlzIHdpbGwgcHJvYmFibHkgZmFpbCBzaW5jZSB0aGVyZSdzIG5vIG1lbW9yeSBhbmQgaGVlLAorICAgICAgICAgICBoZWUsIHdlIGhhdmUgdG8gaW5zdGFudGlhdGUgdGhpcyBjbGFzcworICAgICAgICAqLworICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX01lbW9yeUVycm9yKTsKIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCiBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoUHlPYmplY3QgKmV4YywgUHlPYmplY3QgKmZpbGVuYW1lT2JqZWN0KQogewotCVB5T2JqZWN0ICp2OwotCWNoYXIgKnM7Ci0JaW50IGkgPSBlcnJubzsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBjaGFyICpzOworICAgIGludCBpID0gZXJybm87CiAjaWZkZWYgUExBTjkKLQljaGFyIGVycmJ1ZltFUlJNQVhdOworICAgIGNoYXIgZXJyYnVmW0VSUk1BWF07CiAjZW5kaWYKICNpZmRlZiBNU19XSU5ET1dTCi0JY2hhciAqc19idWYgPSBOVUxMOwotCWNoYXIgc19zbWFsbF9idWZbMjhdOyAvKiBSb29tIGZvciAiV2luZG93cyBFcnJvciAweEZGRkZGRkZGIiAqLworICAgIGNoYXIgKnNfYnVmID0gTlVMTDsKKyAgICBjaGFyIHNfc21hbGxfYnVmWzI4XTsgLyogUm9vbSBmb3IgIldpbmRvd3MgRXJyb3IgMHhGRkZGRkZGRiIgKi8KICNlbmRpZgogI2lmZGVmIEVJTlRSCi0JaWYgKGkgPT0gRUlOVFIgJiYgUHlFcnJfQ2hlY2tTaWduYWxzKCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmIChpID09IEVJTlRSICYmIFB5RXJyX0NoZWNrU2lnbmFscygpKQorICAgICAgICByZXR1cm4gTlVMTDsKICNlbmRpZgogI2lmZGVmIFBMQU45Ci0JcmVycnN0cihlcnJidWYsIHNpemVvZiBlcnJidWYpOwotCXMgPSBlcnJidWY7CisgICAgcmVycnN0cihlcnJidWYsIHNpemVvZiBlcnJidWYpOworICAgIHMgPSBlcnJidWY7CiAjZWxzZQotCWlmIChpID09IDApCi0JCXMgPSAiRXJyb3IiOyAvKiBTb21ldGltZXMgZXJybm8gZGlkbid0IGdldCBzZXQgKi8KLQllbHNlCisgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgcyA9ICJFcnJvciI7IC8qIFNvbWV0aW1lcyBlcnJubyBkaWRuJ3QgZ2V0IHNldCAqLworICAgIGVsc2UKICNpZm5kZWYgTVNfV0lORE9XUwotCQlzID0gc3RyZXJyb3IoaSk7CisgICAgICAgIHMgPSBzdHJlcnJvcihpKTsKICNlbHNlCi0JewotCQkvKiBOb3RlIHRoYXQgdGhlIFdpbjMyIGVycm9ycyBkbyBub3QgbGluZXVwIHdpdGggdGhlCi0JCSAgIGVycm5vIGVycm9yLiAgU28gaWYgdGhlIGVycm9yIGlzIGluIHRoZSBNU1ZDIGVycm9yCi0JCSAgIHRhYmxlLCB3ZSB1c2UgaXQsIG90aGVyd2lzZSB3ZSBhc3N1bWUgaXQgcmVhbGx5IF9pc18KLQkJICAgYSBXaW4zMiBlcnJvciBjb2RlCi0JCSovCi0JCWlmIChpID4gMCAmJiBpIDwgX3N5c19uZXJyKSB7Ci0JCQlzID0gX3N5c19lcnJsaXN0W2ldOwotCQl9Ci0JCWVsc2UgewotCQkJaW50IGxlbiA9IEZvcm1hdE1lc3NhZ2UoCi0JCQkJRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwKLQkJCQlGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8Ci0JCQkJRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCi0JCQkJTlVMTCwJLyogbm8gbWVzc2FnZSBzb3VyY2UgKi8KLQkJCQlpLAotCQkJCU1BS0VMQU5HSUQoTEFOR19ORVVUUkFMLAotCQkJCQkgICBTVUJMQU5HX0RFRkFVTFQpLAotCQkJCSAgICAgICAgICAgLyogRGVmYXVsdCBsYW5ndWFnZSAqLwotCQkJCShMUFRTVFIpICZzX2J1ZiwKLQkJCQkwLAkvKiBzaXplIG5vdCB1c2VkICovCi0JCQkJTlVMTCk7CS8qIG5vIGFyZ3MgKi8KLQkJCWlmIChsZW49PTApIHsKLQkJCQkvKiBPbmx5IGV2ZXIgc2VlbiB0aGlzIGluIG91dC1vZi1tZW0KLQkJCQkgICBzaXR1YXRpb25zICovCi0JCQkJc3ByaW50ZihzX3NtYWxsX2J1ZiwgIldpbmRvd3MgRXJyb3IgMHglWCIsIGkpOwotCQkJCXMgPSBzX3NtYWxsX2J1ZjsKLQkJCQlzX2J1ZiA9IE5VTEw7Ci0JCQl9IGVsc2UgewotCQkJCXMgPSBzX2J1ZjsKLQkJCQkvKiByZW1vdmUgdHJhaWxpbmcgY3IvbGYgYW5kIGRvdHMgKi8KLQkJCQl3aGlsZSAobGVuID4gMCAmJiAoc1tsZW4tMV0gPD0gJyAnIHx8IHNbbGVuLTFdID09ICcuJykpCi0JCQkJCXNbLS1sZW5dID0gJ1wwJzsKLQkJCX0KLQkJfQotCX0KKyAgICB7CisgICAgICAgIC8qIE5vdGUgdGhhdCB0aGUgV2luMzIgZXJyb3JzIGRvIG5vdCBsaW5ldXAgd2l0aCB0aGUKKyAgICAgICAgICAgZXJybm8gZXJyb3IuICBTbyBpZiB0aGUgZXJyb3IgaXMgaW4gdGhlIE1TVkMgZXJyb3IKKyAgICAgICAgICAgdGFibGUsIHdlIHVzZSBpdCwgb3RoZXJ3aXNlIHdlIGFzc3VtZSBpdCByZWFsbHkgX2lzXworICAgICAgICAgICBhIFdpbjMyIGVycm9yIGNvZGUKKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGkgPiAwICYmIGkgPCBfc3lzX25lcnIpIHsKKyAgICAgICAgICAgIHMgPSBfc3lzX2Vycmxpc3RbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgbGVuID0gRm9ybWF0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKKyAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiBubyBtZXNzYWdlIHNvdXJjZSAqLworICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJMQU5HX0RFRkFVTFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVmYXVsdCBsYW5ndWFnZSAqLworICAgICAgICAgICAgICAgIChMUFRTVFIpICZzX2J1ZiwKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG5vdCB1c2VkICovCisgICAgICAgICAgICAgICAgTlVMTCk7ICAgICAgICAgICAgICAgICAgLyogbm8gYXJncyAqLworICAgICAgICAgICAgaWYgKGxlbj09MCkgeworICAgICAgICAgICAgICAgIC8qIE9ubHkgZXZlciBzZWVuIHRoaXMgaW4gb3V0LW9mLW1lbQorICAgICAgICAgICAgICAgICAgIHNpdHVhdGlvbnMgKi8KKyAgICAgICAgICAgICAgICBzcHJpbnRmKHNfc21hbGxfYnVmLCAiV2luZG93cyBFcnJvciAweCVYIiwgaSk7CisgICAgICAgICAgICAgICAgcyA9IHNfc21hbGxfYnVmOworICAgICAgICAgICAgICAgIHNfYnVmID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA9IHNfYnVmOworICAgICAgICAgICAgICAgIC8qIHJlbW92ZSB0cmFpbGluZyBjci9sZiBhbmQgZG90cyAqLworICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAwICYmIChzW2xlbi0xXSA8PSAnICcgfHwgc1tsZW4tMV0gPT0gJy4nKSkKKyAgICAgICAgICAgICAgICAgICAgc1stLWxlbl0gPSAnXDAnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogI2VuZGlmIC8qIFVuaXgvV2luZG93cyAqLwogI2VuZGlmIC8qIFBMQU4gOSovCi0JaWYgKGZpbGVuYW1lT2JqZWN0ICE9IE5VTEwpCi0JCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXNPKSIsIGksIHMsIGZpbGVuYW1lT2JqZWN0KTsKLQllbHNlCi0JCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgaSwgcyk7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlQeUVycl9TZXRPYmplY3QoZXhjLCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCX0KKyAgICBpZiAoZmlsZW5hbWVPYmplY3QgIT0gTlVMTCkKKyAgICAgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpc08pIiwgaSwgcywgZmlsZW5hbWVPYmplY3QpOworICAgIGVsc2UKKyAgICAgICAgdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBpLCBzKTsKKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldE9iamVjdChleGMsIHYpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQogI2lmZGVmIE1TX1dJTkRPV1MKLQlMb2NhbEZyZWUoc19idWYpOworICAgIExvY2FsRnJlZShzX2J1Zik7CiAjZW5kaWYKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBQeU9iamVjdCAqCiBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUoUHlPYmplY3QgKmV4YywgY2hhciAqZmlsZW5hbWUpCiB7Ci0JUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpIDogTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywgbmFtZSk7Ci0JUHlfWERFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKSA6IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChleGMsIG5hbWUpOworICAgIFB5X1hERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogI2lmZGVmIFB5X1dJTl9XSURFX0ZJTEVOQU1FUwogUHlPYmplY3QgKgogUHlFcnJfU2V0RnJvbUVycm5vV2l0aFVuaWNvZGVGaWxlbmFtZShQeU9iamVjdCAqZXhjLCBQeV9VTklDT0RFICpmaWxlbmFtZSkKIHsKLQlQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8KLQkgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tVW5pY29kZShmaWxlbmFtZSwgd2NzbGVuKGZpbGVuYW1lKSkgOgotCSAgICAgICAgICAgICAgICAgTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywgbmFtZSk7Ci0JUHlfWERFQ1JFRihuYW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPworICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0Zyb21Vbmljb2RlKGZpbGVuYW1lLCB3Y3NsZW4oZmlsZW5hbWUpKSA6CisgICAgICAgICAgICAgTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywgbmFtZSk7CisgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogI2VuZGlmIC8qIFB5X1dJTl9XSURFX0ZJTEVOQU1FUyAqLwogCiBQeU9iamVjdCAqCiBQeUVycl9TZXRGcm9tRXJybm8oUHlPYmplY3QgKmV4YykKIHsKLQlyZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywgTlVMTCk7CisgICAgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdChleGMsIE5VTEwpOwogfQogCiAjaWZkZWYgTVNfV0lORE9XUwogLyogV2luZG93cyBzcGVjaWZpYyBlcnJvciBjb2RlIGhhbmRsaW5nICovCiBQeU9iamVjdCAqUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoCi0JUHlPYmplY3QgKmV4YywKLQlpbnQgaWVyciwKLQlQeU9iamVjdCAqZmlsZW5hbWVPYmplY3QpCisgICAgUHlPYmplY3QgKmV4YywKKyAgICBpbnQgaWVyciwKKyAgICBQeU9iamVjdCAqZmlsZW5hbWVPYmplY3QpCiB7Ci0JaW50IGxlbjsKLQljaGFyICpzOwotCWNoYXIgKnNfYnVmID0gTlVMTDsgLyogRnJlZSB2aWEgTG9jYWxGcmVlICovCi0JY2hhciBzX3NtYWxsX2J1ZlsyOF07IC8qIFJvb20gZm9yICJXaW5kb3dzIEVycm9yIDB4RkZGRkZGRkYiICovCi0JUHlPYmplY3QgKnY7Ci0JRFdPUkQgZXJyID0gKERXT1JEKWllcnI7Ci0JaWYgKGVycj09MCkgZXJyID0gR2V0TGFzdEVycm9yKCk7Ci0JbGVuID0gRm9ybWF0TWVzc2FnZSgKLQkJLyogRXJyb3IgQVBJIGVycm9yICovCi0JCUZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8Ci0JCUZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNIHwKLQkJRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCi0JCU5VTEwsCS8qIG5vIG1lc3NhZ2Ugc291cmNlICovCi0JCWVyciwKLQkJTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsCi0JCVNVQkxBTkdfREVGQVVMVCksIC8qIERlZmF1bHQgbGFuZ3VhZ2UgKi8KLQkJKExQVFNUUikgJnNfYnVmLAotCQkwLAkvKiBzaXplIG5vdCB1c2VkICovCi0JCU5VTEwpOwkvKiBubyBhcmdzICovCi0JaWYgKGxlbj09MCkgewotCQkvKiBPbmx5IHNlZW4gdGhpcyBpbiBvdXQgb2YgbWVtIHNpdHVhdGlvbnMgKi8KLQkJc3ByaW50ZihzX3NtYWxsX2J1ZiwgIldpbmRvd3MgRXJyb3IgMHglWCIsIGVycik7Ci0JCXMgPSBzX3NtYWxsX2J1ZjsKLQkJc19idWYgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXMgPSBzX2J1ZjsKLQkJLyogcmVtb3ZlIHRyYWlsaW5nIGNyL2xmIGFuZCBkb3RzICovCi0JCXdoaWxlIChsZW4gPiAwICYmIChzW2xlbi0xXSA8PSAnICcgfHwgc1tsZW4tMV0gPT0gJy4nKSkKLQkJCXNbLS1sZW5dID0gJ1wwJzsKLQl9Ci0JaWYgKGZpbGVuYW1lT2JqZWN0ICE9IE5VTEwpCi0JCXYgPSBQeV9CdWlsZFZhbHVlKCIoaXNPKSIsIGVyciwgcywgZmlsZW5hbWVPYmplY3QpOwotCWVsc2UKLQkJdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnIsIHMpOwotCWlmICh2ICE9IE5VTEwpIHsKLQkJUHlFcnJfU2V0T2JqZWN0KGV4Yywgdik7Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JTG9jYWxGcmVlKHNfYnVmKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpbnQgbGVuOworICAgIGNoYXIgKnM7CisgICAgY2hhciAqc19idWYgPSBOVUxMOyAvKiBGcmVlIHZpYSBMb2NhbEZyZWUgKi8KKyAgICBjaGFyIHNfc21hbGxfYnVmWzI4XTsgLyogUm9vbSBmb3IgIldpbmRvd3MgRXJyb3IgMHhGRkZGRkZGRiIgKi8KKyAgICBQeU9iamVjdCAqdjsKKyAgICBEV09SRCBlcnIgPSAoRFdPUkQpaWVycjsKKyAgICBpZiAoZXJyPT0wKSBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICBsZW4gPSBGb3JtYXRNZXNzYWdlKAorICAgICAgICAvKiBFcnJvciBBUEkgZXJyb3IgKi8KKyAgICAgICAgRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwKKyAgICAgICAgRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0gfAorICAgICAgICBGT1JNQVRfTUVTU0FHRV9JR05PUkVfSU5TRVJUUywKKyAgICAgICAgTlVMTCwgICAgICAgICAgIC8qIG5vIG1lc3NhZ2Ugc291cmNlICovCisgICAgICAgIGVyciwKKyAgICAgICAgTUFLRUxBTkdJRChMQU5HX05FVVRSQUwsCisgICAgICAgIFNVQkxBTkdfREVGQVVMVCksIC8qIERlZmF1bHQgbGFuZ3VhZ2UgKi8KKyAgICAgICAgKExQVFNUUikgJnNfYnVmLAorICAgICAgICAwLCAgICAgICAgICAgICAgLyogc2l6ZSBub3QgdXNlZCAqLworICAgICAgICBOVUxMKTsgICAgICAgICAgLyogbm8gYXJncyAqLworICAgIGlmIChsZW49PTApIHsKKyAgICAgICAgLyogT25seSBzZWVuIHRoaXMgaW4gb3V0IG9mIG1lbSBzaXR1YXRpb25zICovCisgICAgICAgIHNwcmludGYoc19zbWFsbF9idWYsICJXaW5kb3dzIEVycm9yIDB4JVgiLCBlcnIpOworICAgICAgICBzID0gc19zbWFsbF9idWY7CisgICAgICAgIHNfYnVmID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBzID0gc19idWY7CisgICAgICAgIC8qIHJlbW92ZSB0cmFpbGluZyBjci9sZiBhbmQgZG90cyAqLworICAgICAgICB3aGlsZSAobGVuID4gMCAmJiAoc1tsZW4tMV0gPD0gJyAnIHx8IHNbbGVuLTFdID09ICcuJykpCisgICAgICAgICAgICBzWy0tbGVuXSA9ICdcMCc7CisgICAgfQorICAgIGlmIChmaWxlbmFtZU9iamVjdCAhPSBOVUxMKQorICAgICAgICB2ID0gUHlfQnVpbGRWYWx1ZSgiKGlzTykiLCBlcnIsIHMsIGZpbGVuYW1lT2JqZWN0KTsKKyAgICBlbHNlCisgICAgICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJyLCBzKTsKKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldE9iamVjdChleGMsIHYpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgfQorICAgIExvY2FsRnJlZShzX2J1Zik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICpQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgKLQlQeU9iamVjdCAqZXhjLAotCWludCBpZXJyLAotCWNvbnN0IGNoYXIgKmZpbGVuYW1lKQorICAgIFB5T2JqZWN0ICpleGMsCisgICAgaW50IGllcnIsCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpIDogTlVMTDsKLQlQeU9iamVjdCAqcmV0ID0gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoZXhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZXJyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQlQeV9YREVDUkVGKG5hbWUpOwotCXJldHVybiByZXQ7CisgICAgUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpIDogTlVMTDsKKyAgICBQeU9iamVjdCAqcmV0ID0gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoZXhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBQeV9YREVDUkVGKG5hbWUpOworICAgIHJldHVybiByZXQ7CiB9CiAKICNpZmRlZiBQeV9XSU5fV0lERV9GSUxFTkFNRVMKIFB5T2JqZWN0ICpQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhVbmljb2RlRmlsZW5hbWUoCi0JUHlPYmplY3QgKmV4YywKLQlpbnQgaWVyciwKLQljb25zdCBQeV9VTklDT0RFICpmaWxlbmFtZSkKKyAgICBQeU9iamVjdCAqZXhjLAorICAgIGludCBpZXJyLAorICAgIGNvbnN0IFB5X1VOSUNPREUgKmZpbGVuYW1lKQogewotCVB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPwotCSAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0Zyb21Vbmljb2RlKGZpbGVuYW1lLCB3Y3NsZW4oZmlsZW5hbWUpKSA6Ci0JICAgICAgICAgICAgICAgICBOVUxMOwotCVB5T2JqZWN0ICpyZXQgPSBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdChleGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllcnIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotCVB5X1hERUNSRUYobmFtZSk7Ci0JcmV0dXJuIHJldDsKKyAgICBQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8KKyAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tVW5pY29kZShmaWxlbmFtZSwgd2NzbGVuKGZpbGVuYW1lKSkgOgorICAgICAgICAgICAgIE5VTEw7CisgICAgUHlPYmplY3QgKnJldCA9IFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KGV4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gcmV0OwogfQogI2VuZGlmIC8qIFB5X1dJTl9XSURFX0ZJTEVOQU1FUyAqLwogCiBQeU9iamVjdCAqUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoUHlPYmplY3QgKmV4YywgaW50IGllcnIpCiB7Ci0JcmV0dXJuIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKGV4YywgaWVyciwgTlVMTCk7CisgICAgcmV0dXJuIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKGV4YywgaWVyciwgTlVMTCk7CiB9CiAKIFB5T2JqZWN0ICpQeUVycl9TZXRGcm9tV2luZG93c0VycihpbnQgaWVycikKIHsKLQlyZXR1cm4gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoUHlFeGNfV2luZG93c0Vycm9yLAotCQkJCQkJICAgICAgaWVyciwgTlVMTCk7CisgICAgcmV0dXJuIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVyciwgTlVMTCk7CiB9CiBQeU9iamVjdCAqUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoCi0JaW50IGllcnIsCi0JY29uc3QgY2hhciAqZmlsZW5hbWUpCisgICAgaW50IGllcnIsCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0JUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpIDogTlVMTDsKLQlQeU9iamVjdCAqcmVzdWx0ID0gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoCi0JCQkJCQkgICAgICBQeUV4Y19XaW5kb3dzRXJyb3IsCi0JCQkJCQkgICAgICBpZXJyLCBuYW1lKTsKLQlQeV9YREVDUkVGKG5hbWUpOwotCXJldHVybiByZXN1bHQ7CisgICAgUHlPYmplY3QgKm5hbWUgPSBmaWxlbmFtZSA/IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpIDogTlVMTDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX1dpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVyciwgbmFtZSk7CisgICAgUHlfWERFQ1JFRihuYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAjaWZkZWYgUHlfV0lOX1dJREVfRklMRU5BTUVTCiBQeU9iamVjdCAqUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoVW5pY29kZUZpbGVuYW1lKAotCWludCBpZXJyLAotCWNvbnN0IFB5X1VOSUNPREUgKmZpbGVuYW1lKQorICAgIGludCBpZXJyLAorICAgIGNvbnN0IFB5X1VOSUNPREUgKmZpbGVuYW1lKQogewotCVB5T2JqZWN0ICpuYW1lID0gZmlsZW5hbWUgPwotCSAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0Zyb21Vbmljb2RlKGZpbGVuYW1lLCB3Y3NsZW4oZmlsZW5hbWUpKSA6Ci0JICAgICAgICAgICAgICAgICBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdCgKLQkJCQkJCSAgICAgIFB5RXhjX1dpbmRvd3NFcnJvciwKLQkJCQkJCSAgICAgIGllcnIsIG5hbWUpOwotCVB5X1hERUNSRUYobmFtZSk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqbmFtZSA9IGZpbGVuYW1lID8KKyAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Gcm9tVW5pY29kZShmaWxlbmFtZSwgd2NzbGVuKGZpbGVuYW1lKSkgOgorICAgICAgICAgICAgIE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV4Y19XaW5kb3dzRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllcnIsIG5hbWUpOworICAgIFB5X1hERUNSRUYobmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KICNlbmRpZiAvKiBQeV9XSU5fV0lERV9GSUxFTkFNRVMgKi8KICNlbmRpZiAvKiBNU19XSU5ET1dTICovCkBAIC01MTMsOSArNTEzLDkgQEAKIHZvaWQKIF9QeUVycl9CYWRJbnRlcm5hbENhbGwoY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pCiB7Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkgICAgICIlczolZDogYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uIiwKLQkJICAgICBmaWxlbmFtZSwgbGluZW5vKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICIlczolZDogYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uIiwKKyAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVubyk7CiB9CiAKIC8qIFJlbW92ZSB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvIGZvciBQeUVycl9CYWRJbnRlcm5hbENhbGwoKSBzbyB0aGF0IHdlIGNhbgpAQCAtNTI0LDggKzUyNCw4IEBACiB2b2lkCiBQeUVycl9CYWRJbnRlcm5hbENhbGwodm9pZCkKIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCSAgICAgImJhZCBhcmd1bWVudCB0byBpbnRlcm5hbCBmdW5jdGlvbiIpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgImJhZCBhcmd1bWVudCB0byBpbnRlcm5hbCBmdW5jdGlvbiIpOwogfQogI2RlZmluZSBQeUVycl9CYWRJbnRlcm5hbENhbGwoKSBfUHlFcnJfQmFkSW50ZXJuYWxDYWxsKF9fRklMRV9fLCBfX0xJTkVfXykKIApAQCAtNTM0LDIwICs1MzQsMjAgQEAKIFB5T2JqZWN0ICoKIFB5RXJyX0Zvcm1hdChQeU9iamVjdCAqZXhjZXB0aW9uLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhcmdzOwotCVB5T2JqZWN0KiBzdHJpbmc7CisgICAgdmFfbGlzdCB2YXJnczsKKyAgICBQeU9iamVjdCogc3RyaW5nOwogCiAjaWZkZWYgSEFWRV9TVERBUkdfUFJPVE9UWVBFUwotCXZhX3N0YXJ0KHZhcmdzLCBmb3JtYXQpOworICAgIHZhX3N0YXJ0KHZhcmdzLCBmb3JtYXQpOwogI2Vsc2UKLQl2YV9zdGFydCh2YXJncyk7CisgICAgdmFfc3RhcnQodmFyZ3MpOwogI2VuZGlmCiAKLQlzdHJpbmcgPSBQeVN0cmluZ19Gcm9tRm9ybWF0Vihmb3JtYXQsIHZhcmdzKTsKLQlQeUVycl9TZXRPYmplY3QoZXhjZXB0aW9uLCBzdHJpbmcpOwotCVB5X1hERUNSRUYoc3RyaW5nKTsKLQl2YV9lbmQodmFyZ3MpOwotCXJldHVybiBOVUxMOworICAgIHN0cmluZyA9IFB5U3RyaW5nX0Zyb21Gb3JtYXRWKGZvcm1hdCwgdmFyZ3MpOworICAgIFB5RXJyX1NldE9iamVjdChleGNlcHRpb24sIHN0cmluZyk7CisgICAgUHlfWERFQ1JFRihzdHJpbmcpOworICAgIHZhX2VuZCh2YXJncyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIApAQCAtNTU1LDUxICs1NTUsNTEgQEAKIFB5T2JqZWN0ICoKIFB5RXJyX05ld0V4Y2VwdGlvbihjaGFyICpuYW1lLCBQeU9iamVjdCAqYmFzZSwgUHlPYmplY3QgKmRpY3QpCiB7Ci0JY2hhciAqZG90OwotCVB5T2JqZWN0ICptb2R1bGVuYW1lID0gTlVMTDsKLQlQeU9iamVjdCAqY2xhc3NuYW1lID0gTlVMTDsKLQlQeU9iamVjdCAqbXlkaWN0ID0gTlVMTDsKLQlQeU9iamVjdCAqYmFzZXMgPSBOVUxMOwotCVB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwotCWRvdCA9IHN0cnJjaHIobmFtZSwgJy4nKTsKLQlpZiAoZG90ID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJIlB5RXJyX05ld0V4Y2VwdGlvbjogbmFtZSBtdXN0IGJlIG1vZHVsZS5jbGFzcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKGJhc2UgPT0gTlVMTCkKLQkJYmFzZSA9IFB5RXhjX0V4Y2VwdGlvbjsKLQlpZiAoZGljdCA9PSBOVUxMKSB7Ci0JCWRpY3QgPSBteWRpY3QgPSBQeURpY3RfTmV3KCk7Ci0JCWlmIChkaWN0ID09IE5VTEwpCi0JCQlnb3RvIGZhaWx1cmU7Ci0JfQotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiX19tb2R1bGVfXyIpID09IE5VTEwpIHsKLQkJbW9kdWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG5hbWUsCi0JCQkJCQkgICAgIChQeV9zc2l6ZV90KShkb3QtbmFtZSkpOwotCQlpZiAobW9kdWxlbmFtZSA9PSBOVUxMKQotCQkJZ290byBmYWlsdXJlOwotCQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl9fbW9kdWxlX18iLCBtb2R1bGVuYW1lKSAhPSAwKQotCQkJZ290byBmYWlsdXJlOwotCX0KLQlpZiAoUHlUdXBsZV9DaGVjayhiYXNlKSkgewotCQliYXNlcyA9IGJhc2U7Ci0JCS8qIElOQ1JFRiBhcyB3ZSBjcmVhdGUgYSBuZXcgcmVmIGluIHRoZSBlbHNlIGJyYW5jaCAqLwotCQlQeV9JTkNSRUYoYmFzZXMpOwotCX0gZWxzZSB7Ci0JCWJhc2VzID0gUHlUdXBsZV9QYWNrKDEsIGJhc2UpOwotCQlpZiAoYmFzZXMgPT0gTlVMTCkKLQkJCWdvdG8gZmFpbHVyZTsKLQl9Ci0JLyogQ3JlYXRlIGEgcmVhbCBuZXctc3R5bGUgY2xhc3MuICovCi0JcmVzdWx0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKSZQeVR5cGVfVHlwZSwgInNPTyIsCi0JCQkJICAgICAgIGRvdCsxLCBiYXNlcywgZGljdCk7CisgICAgY2hhciAqZG90OworICAgIFB5T2JqZWN0ICptb2R1bGVuYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqY2xhc3NuYW1lID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbXlkaWN0ID0gTlVMTDsKKyAgICBQeU9iamVjdCAqYmFzZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIGRvdCA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKyAgICBpZiAoZG90ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgIlB5RXJyX05ld0V4Y2VwdGlvbjogbmFtZSBtdXN0IGJlIG1vZHVsZS5jbGFzcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGJhc2UgPT0gTlVMTCkKKyAgICAgICAgYmFzZSA9IFB5RXhjX0V4Y2VwdGlvbjsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgICAgIGRpY3QgPSBteWRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiX19tb2R1bGVfXyIpID09IE5VTEwpIHsKKyAgICAgICAgbW9kdWxlbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlfc3NpemVfdCkoZG90LW5hbWUpKTsKKyAgICAgICAgaWYgKG1vZHVsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX21vZHVsZV9fIiwgbW9kdWxlbmFtZSkgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKyAgICB9CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soYmFzZSkpIHsKKyAgICAgICAgYmFzZXMgPSBiYXNlOworICAgICAgICAvKiBJTkNSRUYgYXMgd2UgY3JlYXRlIGEgbmV3IHJlZiBpbiB0aGUgZWxzZSBicmFuY2ggKi8KKyAgICAgICAgUHlfSU5DUkVGKGJhc2VzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBiYXNlcyA9IFB5VHVwbGVfUGFjaygxLCBiYXNlKTsKKyAgICAgICAgaWYgKGJhc2VzID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGZhaWx1cmU7CisgICAgfQorICAgIC8qIENyZWF0ZSBhIHJlYWwgbmV3LXN0eWxlIGNsYXNzLiAqLworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikmUHlUeXBlX1R5cGUsICJzT08iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3QrMSwgYmFzZXMsIGRpY3QpOwogICBmYWlsdXJlOgotCVB5X1hERUNSRUYoYmFzZXMpOwotCVB5X1hERUNSRUYobXlkaWN0KTsKLQlQeV9YREVDUkVGKGNsYXNzbmFtZSk7Ci0JUHlfWERFQ1JFRihtb2R1bGVuYW1lKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFB5X1hERUNSRUYoYmFzZXMpOworICAgIFB5X1hERUNSRUYobXlkaWN0KTsKKyAgICBQeV9YREVDUkVGKGNsYXNzbmFtZSk7CisgICAgUHlfWERFQ1JFRihtb2R1bGVuYW1lKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBDYWxsIHdoZW4gYW4gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZCBidXQgdGhlcmUgaXMgbm8gd2F5IGZvciBQeXRob24KQEAgLTYwNyw1MiArNjA3LDUyIEBACiB2b2lkCiBQeUVycl9Xcml0ZVVucmFpc2FibGUoUHlPYmplY3QgKm9iaikKIHsKLQlQeU9iamVjdCAqZiwgKnQsICp2LCAqdGI7Ci0JUHlFcnJfRmV0Y2goJnQsICZ2LCAmdGIpOwotCWYgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOwotCWlmIChmICE9IE5VTEwpIHsKLQkJUHlGaWxlX1dyaXRlU3RyaW5nKCJFeGNlcHRpb24gIiwgZik7Ci0JCWlmICh0KSB7Ci0JCQlQeU9iamVjdCogbW9kdWxlTmFtZTsKLQkJCWNoYXIqIGNsYXNzTmFtZTsKLQkJCWFzc2VydChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHQpKTsKLQkJCWNsYXNzTmFtZSA9IFB5RXhjZXB0aW9uQ2xhc3NfTmFtZSh0KTsKLQkJCWlmIChjbGFzc05hbWUgIT0gTlVMTCkgewotCQkJCWNoYXIgKmRvdCA9IHN0cnJjaHIoY2xhc3NOYW1lLCAnLicpOwotCQkJCWlmIChkb3QgIT0gTlVMTCkKLQkJCQkJY2xhc3NOYW1lID0gZG90KzE7Ci0JCQl9CisgICAgUHlPYmplY3QgKmYsICp0LCAqdiwgKnRiOworICAgIFB5RXJyX0ZldGNoKCZ0LCAmdiwgJnRiKTsKKyAgICBmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKKyAgICBpZiAoZiAhPSBOVUxMKSB7CisgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiRXhjZXB0aW9uICIsIGYpOworICAgICAgICBpZiAodCkgeworICAgICAgICAgICAgUHlPYmplY3QqIG1vZHVsZU5hbWU7CisgICAgICAgICAgICBjaGFyKiBjbGFzc05hbWU7CisgICAgICAgICAgICBhc3NlcnQoUHlFeGNlcHRpb25DbGFzc19DaGVjayh0KSk7CisgICAgICAgICAgICBjbGFzc05hbWUgPSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUodCk7CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpkb3QgPSBzdHJyY2hyKGNsYXNzTmFtZSwgJy4nKTsKKyAgICAgICAgICAgICAgICBpZiAoZG90ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGRvdCsxOworICAgICAgICAgICAgfQogCi0JCQltb2R1bGVOYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh0LCAiX19tb2R1bGVfXyIpOwotCQkJaWYgKG1vZHVsZU5hbWUgPT0gTlVMTCkKLQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoIjx1bmtub3duPiIsIGYpOwotCQkJZWxzZSB7Ci0JCQkJY2hhciogbW9kc3RyID0gUHlTdHJpbmdfQXNTdHJpbmcobW9kdWxlTmFtZSk7Ci0JCQkJaWYgKG1vZHN0ciAmJgotCQkJCSAgICBzdHJjbXAobW9kc3RyLCAiZXhjZXB0aW9ucyIpICE9IDApCi0JCQkJewotCQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcobW9kc3RyLCBmKTsKLQkJCQkJUHlGaWxlX1dyaXRlU3RyaW5nKCIuIiwgZik7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNsYXNzTmFtZSA9PSBOVUxMKQotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7Ci0JCQllbHNlCi0JCQkJUHlGaWxlX1dyaXRlU3RyaW5nKGNsYXNzTmFtZSwgZik7Ci0JCQlpZiAodiAmJiB2ICE9IFB5X05vbmUpIHsKLQkJCQlQeUZpbGVfV3JpdGVTdHJpbmcoIjogIiwgZik7Ci0JCQkJUHlGaWxlX1dyaXRlT2JqZWN0KHYsIGYsIDApOwotCQkJfQotCQkJUHlfWERFQ1JFRihtb2R1bGVOYW1lKTsKLQkJfQotCQlQeUZpbGVfV3JpdGVTdHJpbmcoIiBpbiAiLCBmKTsKLQkJUHlGaWxlX1dyaXRlT2JqZWN0KG9iaiwgZiwgMCk7Ci0JCVB5RmlsZV9Xcml0ZVN0cmluZygiIGlnbm9yZWRcbiIsIGYpOwotCQlQeUVycl9DbGVhcigpOyAvKiBKdXN0IGluIGNhc2UgKi8KLQl9Ci0JUHlfWERFQ1JFRih0KTsKLQlQeV9YREVDUkVGKHYpOwotCVB5X1hERUNSRUYodGIpOworICAgICAgICAgICAgbW9kdWxlTmFtZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodCwgIl9fbW9kdWxlX18iKTsKKyAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCI8dW5rbm93bj4iLCBmKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXIqIG1vZHN0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKG1vZHVsZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChtb2RzdHIgJiYKKyAgICAgICAgICAgICAgICAgICAgc3RyY21wKG1vZHN0ciwgImV4Y2VwdGlvbnMiKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKG1vZHN0ciwgZik7CisgICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiLiIsIGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIjx1bmtub3duPiIsIGYpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZyhjbGFzc05hbWUsIGYpOworICAgICAgICAgICAgaWYgKHYgJiYgdiAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCI6ICIsIGYpOworICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZU9iamVjdCh2LCBmLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X1hERUNSRUYobW9kdWxlTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCIgaW4gIiwgZik7CisgICAgICAgIFB5RmlsZV9Xcml0ZU9iamVjdChvYmosIGYsIDApOworICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIiBpZ25vcmVkXG4iLCBmKTsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsgLyogSnVzdCBpbiBjYXNlICovCisgICAgfQorICAgIFB5X1hERUNSRUYodCk7CisgICAgUHlfWERFQ1JFRih2KTsKKyAgICBQeV9YREVDUkVGKHRiKTsKIH0KIAogZXh0ZXJuIFB5T2JqZWN0ICpQeU1vZHVsZV9HZXRXYXJuaW5nc01vZHVsZSh2b2lkKTsKQEAgLTY2NSw1OSArNjY1LDU5IEBACiB2b2lkCiBQeUVycl9TeW50YXhMb2NhdGlvbihjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykKIHsKLQlQeU9iamVjdCAqZXhjLCAqdiwgKnRiLCAqdG1wOworICAgIFB5T2JqZWN0ICpleGMsICp2LCAqdGIsICp0bXA7CiAKLQkvKiBhZGQgYXR0cmlidXRlcyBmb3IgdGhlIGxpbmUgbnVtYmVyIGFuZCBmaWxlbmFtZSBmb3IgdGhlIGVycm9yICovCi0JUHlFcnJfRmV0Y2goJmV4YywgJnYsICZ0Yik7Ci0JUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGMsICZ2LCAmdGIpOwotCS8qIFhYWCBjaGVjayB0aGF0IGl0IGlzLCBpbmRlZWQsIGEgc3ludGF4IGVycm9yLiBJdCBtaWdodCBub3QKLQkgKiBiZSwgdGhvdWdoLiAqLwotCXRtcCA9IFB5SW50X0Zyb21Mb25nKGxpbmVubyk7Ci0JaWYgKHRtcCA9PSBOVUxMKQotCQlQeUVycl9DbGVhcigpOwotCWVsc2UgewotCQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAibGluZW5vIiwgdG1wKSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X0RFQ1JFRih0bXApOwotCX0KLQlpZiAoZmlsZW5hbWUgIT0gTlVMTCkgewotCQl0bXAgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGZpbGVuYW1lKTsKLQkJaWYgKHRtcCA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZSB7Ci0JCQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAiZmlsZW5hbWUiLCB0bXApKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlQeV9ERUNSRUYodG1wKTsKLQkJfQorICAgIC8qIGFkZCBhdHRyaWJ1dGVzIGZvciB0aGUgbGluZSBudW1iZXIgYW5kIGZpbGVuYW1lIGZvciB0aGUgZXJyb3IgKi8KKyAgICBQeUVycl9GZXRjaCgmZXhjLCAmdiwgJnRiKTsKKyAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJmV4YywgJnYsICZ0Yik7CisgICAgLyogWFhYIGNoZWNrIHRoYXQgaXQgaXMsIGluZGVlZCwgYSBzeW50YXggZXJyb3IuIEl0IG1pZ2h0IG5vdAorICAgICAqIGJlLCB0aG91Z2guICovCisgICAgdG1wID0gUHlJbnRfRnJvbUxvbmcobGluZW5vKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJsaW5lbm8iLCB0bXApKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgfQorICAgIGlmIChmaWxlbmFtZSAhPSBOVUxMKSB7CisgICAgICAgIHRtcCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOworICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJmaWxlbmFtZSIsIHRtcCkpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICB9CiAKLQkJdG1wID0gUHlFcnJfUHJvZ3JhbVRleHQoZmlsZW5hbWUsIGxpbmVubyk7Ci0JCWlmICh0bXApIHsKLQkJCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJ0ZXh0IiwgdG1wKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJUHlfREVDUkVGKHRtcCk7Ci0JCX0KLQl9Ci0JaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgIm9mZnNldCIsIFB5X05vbmUpKSB7Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWlmIChleGMgIT0gUHlFeGNfU3ludGF4RXJyb3IpIHsKLQkJaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHYsICJtc2ciKSkgewotCQkJdG1wID0gUHlPYmplY3RfU3RyKHYpOwotCQkJaWYgKHRtcCkgewotCQkJCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJtc2ciLCB0bXApKQotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJCVB5X0RFQ1JFRih0bXApOwotCQkJfSBlbHNlIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJfQotCQl9Ci0JCWlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyh2LCAicHJpbnRfZmlsZV9hbmRfbGluZSIpKSB7Ci0JCQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAicHJpbnRfZmlsZV9hbmRfbGluZSIsCi0JCQkJCQkgICBQeV9Ob25lKSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQl9Ci0JfQotCVB5RXJyX1Jlc3RvcmUoZXhjLCB2LCB0Yik7CisgICAgICAgIHRtcCA9IFB5RXJyX1Byb2dyYW1UZXh0KGZpbGVuYW1lLCBsaW5lbm8pOworICAgICAgICBpZiAodG1wKSB7CisgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAidGV4dCIsIHRtcCkpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICB9CisgICAgfQorICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHYsICJvZmZzZXQiLCBQeV9Ob25lKSkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoZXhjICE9IFB5RXhjX1N5bnRheEVycm9yKSB7CisgICAgICAgIGlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyh2LCAibXNnIikpIHsKKyAgICAgICAgICAgIHRtcCA9IFB5T2JqZWN0X1N0cih2KTsKKyAgICAgICAgICAgIGlmICh0bXApIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyh2LCAibXNnIiwgdG1wKSkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcodiwgInByaW50X2ZpbGVfYW5kX2xpbmUiKSkgeworICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcodiwgInByaW50X2ZpbGVfYW5kX2xpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSkpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeUVycl9SZXN0b3JlKGV4YywgdiwgdGIpOwogfQogCiAvKiBjb21fZmV0Y2hfcHJvZ3JhbV90ZXh0IHdpbGwgYXR0ZW1wdCB0byBsb2FkIHRoZSBsaW5lIG9mIHRleHQgdGhhdApAQCAtNzMxLDM2ICs3MzEsMzYgQEAKIFB5T2JqZWN0ICoKIFB5RXJyX1Byb2dyYW1UZXh0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKQogewotCUZJTEUgKmZwOwotCWludCBpOwotCWNoYXIgbGluZWJ1ZlsxMDAwXTsKKyAgICBGSUxFICpmcDsKKyAgICBpbnQgaTsKKyAgICBjaGFyIGxpbmVidWZbMTAwMF07CiAKLQlpZiAoZmlsZW5hbWUgPT0gTlVMTCB8fCAqZmlsZW5hbWUgPT0gJ1wwJyB8fCBsaW5lbm8gPD0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiIFBZX1NURElPVEVYVE1PREUpOwotCWlmIChmcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgbGluZW5vOyBpKyspIHsKLQkJY2hhciAqcExhc3RDaGFyID0gJmxpbmVidWZbc2l6ZW9mKGxpbmVidWYpIC0gMl07Ci0JCWRvIHsKLQkJCSpwTGFzdENoYXIgPSAnXDAnOwotCQkJaWYgKFB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyhsaW5lYnVmLCBzaXplb2YgbGluZWJ1ZiwgZnAsIE5VTEwpID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQkvKiBmZ2V0cyByZWFkICpzb21ldGhpbmcqOyBpZiBpdCBkaWRuJ3QgZ2V0IGFzCi0JCQkgICBmYXIgYXMgcExhc3RDaGFyLCBpdCBtdXN0IGhhdmUgZm91bmQgYSBuZXdsaW5lCi0JCQkgICBvciBoaXQgdGhlIGVuZCBvZiB0aGUgZmlsZTsgaWYgcExhc3RDaGFyIGlzIFxuLAotCQkJICAgaXQgb2J2aW91c2x5IGZvdW5kIGEgbmV3bGluZTsgZWxzZSB3ZSBoYXZlbid0Ci0JCQkgICB5ZXQgc2VlbiBhIG5ld2xpbmUsIHNvIG11c3QgY29udGludWUgKi8KLQkJfSB3aGlsZSAoKnBMYXN0Q2hhciAhPSAnXDAnICYmICpwTGFzdENoYXIgIT0gJ1xuJyk7Ci0JfQotCWZjbG9zZShmcCk7Ci0JaWYgKGkgPT0gbGluZW5vKSB7Ci0JCWNoYXIgKnAgPSBsaW5lYnVmOwotCQl3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1wwMTQnKQotCQkJcCsrOwotCQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhwKTsKLQl9Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgKmZpbGVuYW1lID09ICdcMCcgfHwgbGluZW5vIDw9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIiBQWV9TVERJT1RFWFRNT0RFKTsKKyAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IGxpbmVubzsgaSsrKSB7CisgICAgICAgIGNoYXIgKnBMYXN0Q2hhciA9ICZsaW5lYnVmW3NpemVvZihsaW5lYnVmKSAtIDJdOworICAgICAgICBkbyB7CisgICAgICAgICAgICAqcExhc3RDaGFyID0gJ1wwJzsKKyAgICAgICAgICAgIGlmIChQeV9Vbml2ZXJzYWxOZXdsaW5lRmdldHMobGluZWJ1Ziwgc2l6ZW9mIGxpbmVidWYsIGZwLCBOVUxMKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLyogZmdldHMgcmVhZCAqc29tZXRoaW5nKjsgaWYgaXQgZGlkbid0IGdldCBhcworICAgICAgICAgICAgICAgZmFyIGFzIHBMYXN0Q2hhciwgaXQgbXVzdCBoYXZlIGZvdW5kIGEgbmV3bGluZQorICAgICAgICAgICAgICAgb3IgaGl0IHRoZSBlbmQgb2YgdGhlIGZpbGU7IGlmIHBMYXN0Q2hhciBpcyBcbiwKKyAgICAgICAgICAgICAgIGl0IG9idmlvdXNseSBmb3VuZCBhIG5ld2xpbmU7IGVsc2Ugd2UgaGF2ZW4ndAorICAgICAgICAgICAgICAgeWV0IHNlZW4gYSBuZXdsaW5lLCBzbyBtdXN0IGNvbnRpbnVlICovCisgICAgICAgIH0gd2hpbGUgKCpwTGFzdENoYXIgIT0gJ1wwJyAmJiAqcExhc3RDaGFyICE9ICdcbicpOworICAgIH0KKyAgICBmY2xvc2UoZnApOworICAgIGlmIChpID09IGxpbmVubykgeworICAgICAgICBjaGFyICpwID0gbGluZWJ1ZjsKKyAgICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcMDE0JykKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOwogfQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL1B5dGhvbi9mcm96ZW4uYyBiL1B5dGhvbi9mcm96ZW4uYwppbmRleCA5NDZkNjI2Li5hZTdlOWE0IDEwMDY0NAotLS0gYS9QeXRob24vZnJvemVuLmMKKysrIGIvUHl0aG9uL2Zyb3plbi5jCkBAIC0xMiwyNCArMTIsMjQgQEAKICAgIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBmcm9tIE1fX19tYWluX18uYy4gKi8KIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgTV9fX2hlbGxvX19bXSA9IHsKLQk5OSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKLQkwLDExNSw5LDAsMCwwLDEwMCwwLDAsNzEsNzIsMTAwLDEsMCw4Myw0MCwKLQkyLDAsMCwwLDExNSwxNCwwLDAsMCw3MiwxMDEsMTA4LDEwOCwxMTEsMzIsMTE5LAotCTExMSwxMTQsMTA4LDEwMCw0Niw0Niw0Niw3OCw0MCwwLDAsMCwwLDQwLDAsMCwKLQkwLDAsNDAsMCwwLDAsMCw0MCwwLDAsMCwwLDExNSw4LDAsMCwKLQkwLDEwNCwxMDEsMTA4LDEwOCwxMTEsNDYsMTEyLDEyMSwxMTUsMSwwLDAsMCw2MywxLAotCTAsMCwwLDExNSwwLDAsMCwwLAorICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLAorICAgIDAsMTE1LDksMCwwLDAsMTAwLDAsMCw3MSw3MiwxMDAsMSwwLDgzLDQwLAorICAgIDIsMCwwLDAsMTE1LDE0LDAsMCwwLDcyLDEwMSwxMDgsMTA4LDExMSwzMiwxMTksCisgICAgMTExLDExNCwxMDgsMTAwLDQ2LDQ2LDQ2LDc4LDQwLDAsMCwwLDAsNDAsMCwwLAorICAgIDAsMCw0MCwwLDAsMCwwLDQwLDAsMCwwLDAsMTE1LDgsMCwwLAorICAgIDAsMTA0LDEwMSwxMDgsMTA4LDExMSw0NiwxMTIsMTIxLDExNSwxLDAsMCwwLDYzLDEsCisgICAgMCwwLDAsMTE1LDAsMCwwLDAsCiB9OwogCiAjZGVmaW5lIFNJWkUgKGludClzaXplb2YoTV9fX2hlbGxvX18pCiAKIHN0YXRpYyBzdHJ1Y3QgX2Zyb3plbiBfUHlJbXBvcnRfRnJvemVuTW9kdWxlc1tdID0gewotCS8qIFRlc3QgbW9kdWxlICovCi0JeyJfX2hlbGxvX18iLCBNX19faGVsbG9fXywgU0laRX0sCi0JLyogVGVzdCBwYWNrYWdlIChuZWdhdGl2ZSBzaXplIGluZGljYXRlcyBwYWNrYWdlLW5lc3MpICovCi0JeyJfX3BoZWxsb19fIiwgTV9fX2hlbGxvX18sIC1TSVpFfSwKLQl7Il9fcGhlbGxvX18uc3BhbSIsIE1fX19oZWxsb19fLCBTSVpFfSwKLQl7MCwgMCwgMH0gLyogc2VudGluZWwgKi8KKyAgICAvKiBUZXN0IG1vZHVsZSAqLworICAgIHsiX19oZWxsb19fIiwgTV9fX2hlbGxvX18sIFNJWkV9LAorICAgIC8qIFRlc3QgcGFja2FnZSAobmVnYXRpdmUgc2l6ZSBpbmRpY2F0ZXMgcGFja2FnZS1uZXNzKSAqLworICAgIHsiX19waGVsbG9fXyIsIE1fX19oZWxsb19fLCAtU0laRX0sCisgICAgeyJfX3BoZWxsb19fLnNwYW0iLCBNX19faGVsbG9fXywgU0laRX0sCisgICAgezAsIDAsIDB9IC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiBFbWJlZGRpbmcgYXBwcyBtYXkgY2hhbmdlIHRoaXMgcG9pbnRlciB0byBwb2ludCB0byB0aGVpciBmYXZvcml0ZQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Zyb3plbm1haW4uYyBiL1B5dGhvbi9mcm96ZW5tYWluLmMKaW5kZXggMzk3ZjA0Ni4uZDMxZGEwNyAxMDA2NDQKLS0tIGEvUHl0aG9uL2Zyb3plbm1haW4uYworKysgYi9QeXRob24vZnJvemVubWFpbi5jCkBAIC0xNCw1NSArMTQsNTUgQEAKIGludAogUHlfRnJvemVuTWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0JY2hhciAqcDsKLQlpbnQgbiwgc3RzOwotCWludCBpbnNwZWN0ID0gMDsKLQlpbnQgdW5idWZmZXJlZCA9IDA7CisgICAgY2hhciAqcDsKKyAgICBpbnQgbiwgc3RzOworICAgIGludCBpbnNwZWN0ID0gMDsKKyAgICBpbnQgdW5idWZmZXJlZCA9IDA7CiAKLQlQeV9Gcm96ZW5GbGFnID0gMTsgLyogU3VwcHJlc3MgZXJyb3JzIGZyb20gZ2V0cGF0aC5jICovCisgICAgUHlfRnJvemVuRmxhZyA9IDE7IC8qIFN1cHByZXNzIGVycm9ycyBmcm9tIGdldHBhdGguYyAqLwogCi0JaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05JTlNQRUNUIikpICYmICpwICE9ICdcMCcpCi0JCWluc3BlY3QgPSAxOwotCWlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OVU5CVUZGRVJFRCIpKSAmJiAqcCAhPSAnXDAnKQotCQl1bmJ1ZmZlcmVkID0gMTsKKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTklOU1BFQ1QiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgaW5zcGVjdCA9IDE7CisgICAgaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05VTkJVRkZFUkVEIikpICYmICpwICE9ICdcMCcpCisgICAgICAgIHVuYnVmZmVyZWQgPSAxOwogCi0JaWYgKHVuYnVmZmVyZWQpIHsKLQkJc2V0YnVmKHN0ZGluLCAoY2hhciAqKU5VTEwpOwotCQlzZXRidWYoc3Rkb3V0LCAoY2hhciAqKU5VTEwpOwotCQlzZXRidWYoc3RkZXJyLCAoY2hhciAqKU5VTEwpOwotCX0KKyAgICBpZiAodW5idWZmZXJlZCkgeworICAgICAgICBzZXRidWYoc3RkaW4sIChjaGFyICopTlVMTCk7CisgICAgICAgIHNldGJ1ZihzdGRvdXQsIChjaGFyICopTlVMTCk7CisgICAgICAgIHNldGJ1ZihzdGRlcnIsIChjaGFyICopTlVMTCk7CisgICAgfQogCiAjaWZkZWYgTVNfV0lORE9XUwotCVB5SW5pdEZyb3plbkV4dGVuc2lvbnMoKTsKKyAgICBQeUluaXRGcm96ZW5FeHRlbnNpb25zKCk7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwotCVB5X1NldFByb2dyYW1OYW1lKGFyZ3ZbMF0pOwotCVB5X0luaXRpYWxpemUoKTsKKyAgICBQeV9TZXRQcm9ncmFtTmFtZShhcmd2WzBdKTsKKyAgICBQeV9Jbml0aWFsaXplKCk7CiAjaWZkZWYgTVNfV0lORE9XUwotCVB5V2luRnJlZXplX0V4ZUluaXQoKTsKKyAgICBQeVdpbkZyZWV6ZV9FeGVJbml0KCk7CiAjZW5kaWYKIAotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJZnByaW50ZihzdGRlcnIsICJQeXRob24gJXNcbiVzXG4iLAotCQkJUHlfR2V0VmVyc2lvbigpLCBQeV9HZXRDb3B5cmlnaHQoKSk7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlB5dGhvbiAlc1xuJXNcbiIsCisgICAgICAgICAgICBQeV9HZXRWZXJzaW9uKCksIFB5X0dldENvcHlyaWdodCgpKTsKIAotCVB5U3lzX1NldEFyZ3YoYXJnYywgYXJndik7CisgICAgUHlTeXNfU2V0QXJndihhcmdjLCBhcmd2KTsKIAotCW4gPSBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUoIl9fbWFpbl9fIik7Ci0JaWYgKG4gPT0gMCkKLQkJUHlfRmF0YWxFcnJvcigiX19tYWluX18gbm90IGZyb3plbiIpOwotCWlmIChuIDwgMCkgewotCQlQeUVycl9QcmludCgpOwotCQlzdHMgPSAxOwotCX0KLQllbHNlCi0JCXN0cyA9IDA7CisgICAgbiA9IFB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZSgiX19tYWluX18iKTsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJfX21haW5fXyBub3QgZnJvemVuIik7CisgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHN0cyA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgc3RzID0gMDsKIAotCWlmIChpbnNwZWN0ICYmIGlzYXR0eSgoaW50KWZpbGVubyhzdGRpbikpKQotCQlzdHMgPSBQeVJ1bl9BbnlGaWxlKHN0ZGluLCAiPHN0ZGluPiIpICE9IDA7CisgICAgaWYgKGluc3BlY3QgJiYgaXNhdHR5KChpbnQpZmlsZW5vKHN0ZGluKSkpCisgICAgICAgIHN0cyA9IFB5UnVuX0FueUZpbGUoc3RkaW4sICI8c3RkaW4+IikgIT0gMDsKIAogI2lmZGVmIE1TX1dJTkRPV1MKLQlQeVdpbkZyZWV6ZV9FeGVUZXJtKCk7CisgICAgUHlXaW5GcmVlemVfRXhlVGVybSgpOwogI2VuZGlmCi0JUHlfRmluYWxpemUoKTsKLQlyZXR1cm4gc3RzOworICAgIFB5X0ZpbmFsaXplKCk7CisgICAgcmV0dXJuIHN0czsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9mdXR1cmUuYyBiL1B5dGhvbi9mdXR1cmUuYwppbmRleCAyYzZhYWEyLi45MTU4ZGY0IDEwMDY0NAotLS0gYS9QeXRob24vZnV0dXJlLmMKKysrIGIvUHl0aG9uL2Z1dHVyZS5jCkBAIC0xMiwxMjkgKzEyLDEyOSBAQAogc3RhdGljIGludAogZnV0dXJlX2NoZWNrX2ZlYXR1cmVzKFB5RnV0dXJlRmVhdHVyZXMgKmZmLCBzdG10X3R5IHMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCWludCBpOwotCWFzZGxfc2VxICpuYW1lczsKKyAgICBpbnQgaTsKKyAgICBhc2RsX3NlcSAqbmFtZXM7CiAKLQlhc3NlcnQocy0+a2luZCA9PSBJbXBvcnRGcm9tX2tpbmQpOworICAgIGFzc2VydChzLT5raW5kID09IEltcG9ydEZyb21fa2luZCk7CiAKLQluYW1lcyA9IHMtPnYuSW1wb3J0RnJvbS5uYW1lczsKLQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKG5hbWVzKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYWxpYXNfdHkgbmFtZSA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQobmFtZXMsIGkpOwotCQljb25zdCBjaGFyICpmZWF0dXJlID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZS0+bmFtZSk7Ci0JCWlmICghZmVhdHVyZSkKLQkJCXJldHVybiAwOwotCQlpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9ORVNURURfU0NPUEVTKSA9PSAwKSB7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX0dFTkVSQVRPUlMpID09IDApIHsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfRElWSVNJT04pID09IDApIHsKLQkJCWZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfRElWSVNJT047Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9BQlNPTFVURV9JTVBPUlQpID09IDApIHsKLQkJCWZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUOwotCQl9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfV0lUSF9TVEFURU1FTlQpID09IDApIHsKLQkJCWZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQ7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9QUklOVF9GVU5DVElPTikgPT0gMCkgewotCQkJZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTjsKLQkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX1VOSUNPREVfTElURVJBTFMpID09IDApIHsKLQkJCWZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUzsKLQkJfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgImJyYWNlcyIpID09IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKLQkJCQkJIm5vdCBhIGNoYW5jZSIpOwotCQkJUHlFcnJfU3ludGF4TG9jYXRpb24oZmlsZW5hbWUsIHMtPmxpbmVubyk7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwKLQkJCQkgICAgIFVOREVGSU5FRF9GVVRVUkVfRkVBVFVSRSwgZmVhdHVyZSk7Ci0JCQlQeUVycl9TeW50YXhMb2NhdGlvbihmaWxlbmFtZSwgcy0+bGluZW5vKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXJldHVybiAxOworICAgIG5hbWVzID0gcy0+di5JbXBvcnRGcm9tLm5hbWVzOworICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4obmFtZXMpOyBpKyspIHsKKyAgICAgICAgYWxpYXNfdHkgbmFtZSA9IChhbGlhc190eSlhc2RsX3NlcV9HRVQobmFtZXMsIGkpOworICAgICAgICBjb25zdCBjaGFyICpmZWF0dXJlID0gUHlTdHJpbmdfQXNTdHJpbmcobmFtZS0+bmFtZSk7CisgICAgICAgIGlmICghZmVhdHVyZSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9ORVNURURfU0NPUEVTKSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX0dFTkVSQVRPUlMpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfRElWSVNJT04pID09IDApIHsKKyAgICAgICAgICAgIGZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfRElWSVNJT047CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9BQlNPTFVURV9JTVBPUlQpID09IDApIHsKKyAgICAgICAgICAgIGZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChmZWF0dXJlLCBGVVRVUkVfV0lUSF9TVEFURU1FTlQpID09IDApIHsKKyAgICAgICAgICAgIGZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGZlYXR1cmUsIEZVVFVSRV9QUklOVF9GVU5DVElPTikgPT0gMCkgeworICAgICAgICAgICAgZmYtPmZmX2ZlYXR1cmVzIHw9IENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTjsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgRlVUVVJFX1VOSUNPREVfTElURVJBTFMpID09IDApIHsKKyAgICAgICAgICAgIGZmLT5mZl9mZWF0dXJlcyB8PSBDT19GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUzsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoZmVhdHVyZSwgImJyYWNlcyIpID09IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGEgY2hhbmNlIik7CisgICAgICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbihmaWxlbmFtZSwgcy0+bGluZW5vKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIFVOREVGSU5FRF9GVVRVUkVfRkVBVFVSRSwgZmVhdHVyZSk7CisgICAgICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbihmaWxlbmFtZSwgcy0+bGluZW5vKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBmdXR1cmVfcGFyc2UoUHlGdXR1cmVGZWF0dXJlcyAqZmYsIG1vZF90eSBtb2QsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCWludCBpLCBmb3VuZF9kb2NzdHJpbmcgPSAwLCBkb25lID0gMCwgcHJldl9saW5lID0gMDsKKyAgICBpbnQgaSwgZm91bmRfZG9jc3RyaW5nID0gMCwgZG9uZSA9IDAsIHByZXZfbGluZSA9IDA7CiAKLQlzdGF0aWMgUHlPYmplY3QgKmZ1dHVyZTsKLQlpZiAoIWZ1dHVyZSkgewotCQlmdXR1cmUgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2Z1dHVyZV9fIik7Ci0JCWlmICghZnV0dXJlKQotCQkJcmV0dXJuIDA7Ci0JfQorICAgIHN0YXRpYyBQeU9iamVjdCAqZnV0dXJlOworICAgIGlmICghZnV0dXJlKSB7CisgICAgICAgIGZ1dHVyZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fZnV0dXJlX18iKTsKKyAgICAgICAgaWYgKCFmdXR1cmUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlpZiAoIShtb2QtPmtpbmQgPT0gTW9kdWxlX2tpbmQgfHwgbW9kLT5raW5kID09IEludGVyYWN0aXZlX2tpbmQpKQotCQlyZXR1cm4gMTsKKyAgICBpZiAoIShtb2QtPmtpbmQgPT0gTW9kdWxlX2tpbmQgfHwgbW9kLT5raW5kID09IEludGVyYWN0aXZlX2tpbmQpKQorICAgICAgICByZXR1cm4gMTsKIAotCS8qIEEgc3Vic2VxdWVudCBwYXNzIHdpbGwgZGV0ZWN0IGZ1dHVyZSBpbXBvcnRzIHRoYXQgZG9uJ3QKLQkgICBhcHBlYXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIFRoZXJlJ3Mgb25lIGNhc2UsCi0JICAgaG93ZXZlciwgdGhhdCBpcyBlYXNpZXIgdG8gaGFuZGxlIGhlcmU6IEEgc2VyaWVzIG9mIGltcG9ydHMKLQkgICBqb2luZWQgYnkgc2VtaS1jb2xvbnMsIHdoZXJlIHRoZSBmaXJzdCBpbXBvcnQgaXMgYSBmdXR1cmUKLQkgICBzdGF0ZW1lbnQgYnV0IHNvbWUgc3Vic2VxdWVudCBpbXBvcnQgaGFzIHRoZSBmdXR1cmUgZm9ybQotCSAgIGJ1dCBpcyBwcmVjZWRlZCBieSBhIHJlZ3VsYXIgaW1wb3J0LgotCSovCi0JICAgCisgICAgLyogQSBzdWJzZXF1ZW50IHBhc3Mgd2lsbCBkZXRlY3QgZnV0dXJlIGltcG9ydHMgdGhhdCBkb24ndAorICAgICAgIGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiAgVGhlcmUncyBvbmUgY2FzZSwKKyAgICAgICBob3dldmVyLCB0aGF0IGlzIGVhc2llciB0byBoYW5kbGUgaGVyZTogQSBzZXJpZXMgb2YgaW1wb3J0cworICAgICAgIGpvaW5lZCBieSBzZW1pLWNvbG9ucywgd2hlcmUgdGhlIGZpcnN0IGltcG9ydCBpcyBhIGZ1dHVyZQorICAgICAgIHN0YXRlbWVudCBidXQgc29tZSBzdWJzZXF1ZW50IGltcG9ydCBoYXMgdGhlIGZ1dHVyZSBmb3JtCisgICAgICAgYnV0IGlzIHByZWNlZGVkIGJ5IGEgcmVndWxhciBpbXBvcnQuCisgICAgKi8KIAotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4obW9kLT52Lk1vZHVsZS5ib2R5KTsgaSsrKSB7Ci0JCXN0bXRfdHkgcyA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChtb2QtPnYuTW9kdWxlLmJvZHksIGkpOwogCi0JCWlmIChkb25lICYmIHMtPmxpbmVubyA+IHByZXZfbGluZSkKLQkJCXJldHVybiAxOwotCQlwcmV2X2xpbmUgPSBzLT5saW5lbm87CisgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihtb2QtPnYuTW9kdWxlLmJvZHkpOyBpKyspIHsKKyAgICAgICAgc3RtdF90eSBzID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKG1vZC0+di5Nb2R1bGUuYm9keSwgaSk7CiAKLQkJLyogVGhlIHRlc3RzIGJlbG93IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbiB1bmxlc3MgaXQgaXMKLQkJICAgc3RpbGwgcG9zc2libGUgdG8gZmluZCBhIGZ1dHVyZSBzdGF0ZW1lbnQuICBUaGUgb25seSB0aGluZ3MKLQkJICAgdGhhdCBjYW4gcHJlY2VkZSBhIGZ1dHVyZSBzdGF0ZW1lbnQgYXJlIGFub3RoZXIgZnV0dXJlCi0JCSAgIHN0YXRlbWVudCBhbmQgYSBkb2Mgc3RyaW5nLgotCQkqLworICAgICAgICBpZiAoZG9uZSAmJiBzLT5saW5lbm8gPiBwcmV2X2xpbmUpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcHJldl9saW5lID0gcy0+bGluZW5vOwogCi0JCWlmIChzLT5raW5kID09IEltcG9ydEZyb21fa2luZCkgewotCQkJaWYgKHMtPnYuSW1wb3J0RnJvbS5tb2R1bGUgPT0gZnV0dXJlKSB7Ci0JCQkJaWYgKGRvbmUpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAotCQkJCQkJCUVSUl9MQVRFX0ZVVFVSRSk7Ci0JCQkJCVB5RXJyX1N5bnRheExvY2F0aW9uKGZpbGVuYW1lLCAKLQkJCQkJCQkgICAgIHMtPmxpbmVubyk7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQlpZiAoIWZ1dHVyZV9jaGVja19mZWF0dXJlcyhmZiwgcywgZmlsZW5hbWUpKQotCQkJCQlyZXR1cm4gMDsKLQkJCQlmZi0+ZmZfbGluZW5vID0gcy0+bGluZW5vOwotCQkJfQotCQkJZWxzZQotCQkJCWRvbmUgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHMtPmtpbmQgPT0gRXhwcl9raW5kICYmICFmb3VuZF9kb2NzdHJpbmcpIHsKLQkJCWV4cHJfdHkgZSA9IHMtPnYuRXhwci52YWx1ZTsKLQkJCWlmIChlLT5raW5kICE9IFN0cl9raW5kKQotCQkJCWRvbmUgPSAxOwotCQkJZWxzZQotCQkJCWZvdW5kX2RvY3N0cmluZyA9IDE7Ci0JCX0KLQkJZWxzZQotCQkJZG9uZSA9IDE7Ci0JfQotCXJldHVybiAxOworICAgICAgICAvKiBUaGUgdGVzdHMgYmVsb3cgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uIHVubGVzcyBpdCBpcworICAgICAgICAgICBzdGlsbCBwb3NzaWJsZSB0byBmaW5kIGEgZnV0dXJlIHN0YXRlbWVudC4gIFRoZSBvbmx5IHRoaW5ncworICAgICAgICAgICB0aGF0IGNhbiBwcmVjZWRlIGEgZnV0dXJlIHN0YXRlbWVudCBhcmUgYW5vdGhlciBmdXR1cmUKKyAgICAgICAgICAgc3RhdGVtZW50IGFuZCBhIGRvYyBzdHJpbmcuCisgICAgICAgICovCisKKyAgICAgICAgaWYgKHMtPmtpbmQgPT0gSW1wb3J0RnJvbV9raW5kKSB7CisgICAgICAgICAgICBpZiAocy0+di5JbXBvcnRGcm9tLm1vZHVsZSA9PSBmdXR1cmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZG9uZSkgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJfTEFURV9GVVRVUkUpOworICAgICAgICAgICAgICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbihmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZW5vKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZnV0dXJlX2NoZWNrX2ZlYXR1cmVzKGZmLCBzLCBmaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGZmLT5mZl9saW5lbm8gPSBzLT5saW5lbm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZG9uZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocy0+a2luZCA9PSBFeHByX2tpbmQgJiYgIWZvdW5kX2RvY3N0cmluZykgeworICAgICAgICAgICAgZXhwcl90eSBlID0gcy0+di5FeHByLnZhbHVlOworICAgICAgICAgICAgaWYgKGUtPmtpbmQgIT0gU3RyX2tpbmQpCisgICAgICAgICAgICAgICAgZG9uZSA9IDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm91bmRfZG9jc3RyaW5nID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBkb25lID0gMTsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIAogUHlGdXR1cmVGZWF0dXJlcyAqCiBQeUZ1dHVyZV9Gcm9tQVNUKG1vZF90eSBtb2QsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewotCVB5RnV0dXJlRmVhdHVyZXMgKmZmOworICAgIFB5RnV0dXJlRmVhdHVyZXMgKmZmOwogCi0JZmYgPSAoUHlGdXR1cmVGZWF0dXJlcyAqKVB5T2JqZWN0X01hbGxvYyhzaXplb2YoUHlGdXR1cmVGZWF0dXJlcykpOwotCWlmIChmZiA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlmZi0+ZmZfZmVhdHVyZXMgPSAwOwotCWZmLT5mZl9saW5lbm8gPSAtMTsKKyAgICBmZiA9IChQeUZ1dHVyZUZlYXR1cmVzICopUHlPYmplY3RfTWFsbG9jKHNpemVvZihQeUZ1dHVyZUZlYXR1cmVzKSk7CisgICAgaWYgKGZmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZmLT5mZl9mZWF0dXJlcyA9IDA7CisgICAgZmYtPmZmX2xpbmVubyA9IC0xOwogCi0JaWYgKCFmdXR1cmVfcGFyc2UoZmYsIG1vZCwgZmlsZW5hbWUpKSB7Ci0JCVB5T2JqZWN0X0ZyZWUoZmYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGZmOworICAgIGlmICghZnV0dXJlX3BhcnNlKGZmLCBtb2QsIGZpbGVuYW1lKSkgeworICAgICAgICBQeU9iamVjdF9GcmVlKGZmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBmZjsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9nZXRhcmdzLmMgYi9QeXRob24vZ2V0YXJncy5jCmluZGV4IGQyNDg1N2QuLmIzOWUwN2UgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9nZXRhcmdzLmMKKysrIGIvUHl0aG9uL2dldGFyZ3MuYwpAQCAtNywxNiArNywxNiBAQAogCiAKICNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IAorZXh0ZXJuICJDIiB7CiAjZW5kaWYKIGludCBQeUFyZ19QYXJzZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLik7CiBpbnQgUHlBcmdfUGFyc2VUdXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLik7CiBpbnQgUHlBcmdfVmFQYXJzZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwogCiBpbnQgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0JCQkJY29uc3QgY2hhciAqLCBjaGFyICoqLCAuLi4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIC4uLik7CiBpbnQgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKLQkJCQljb25zdCBjaGFyICosIGNoYXIgKiosIHZhX2xpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIHZhX2xpc3QpOwogCiAjaWZkZWYgSEFWRV9ERUNMU1BFQ19ETEwKIC8qIEV4cG9ydCBmdW5jdGlvbnMgKi8KQEAgLTM3LDEwMyArMzcsMTAzIEBACiAvKiBGb3J3YXJkICovCiBzdGF0aWMgaW50IHZnZXRhcmdzMShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QgKiwgaW50KTsKIHN0YXRpYyB2b2lkIHNldGVycm9yKGludCwgY29uc3QgY2hhciAqLCBpbnQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGNoYXIgKmNvbnZlcnRpdGVtKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBpbnQgKiwgCitzdGF0aWMgY2hhciAqY29udmVydGl0ZW0oUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGludCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBQeU9iamVjdCAqKik7CiBzdGF0aWMgY2hhciAqY29udmVydHR1cGxlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LAotCQkJICBpbnQgKiwgY2hhciAqLCBzaXplX3QsIGludCwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKiwgY2hhciAqLCBzaXplX3QsIGludCwgUHlPYmplY3QgKiopOwogc3RhdGljIGNoYXIgKmNvbnZlcnRzaW1wbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGNoYXIgKiwKLQkJCSAgIHNpemVfdCwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90LCBQeU9iamVjdCAqKik7CiBzdGF0aWMgUHlfc3NpemVfdCBjb252ZXJ0YnVmZmVyKFB5T2JqZWN0ICosIHZvaWQgKipwLCBjaGFyICoqKTsKIHN0YXRpYyBpbnQgZ2V0YnVmZmVyKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqLCBjaGFyKiopOwogCiBzdGF0aWMgaW50IHZnZXRhcmdza2V5d29yZHMoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKLQkJCSAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIHZhX2xpc3QgKiwgaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIHZhX2xpc3QgKiwgaW50KTsKIHN0YXRpYyBjaGFyICpza2lwaXRlbShjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7CiAKIGludAogUHlBcmdfUGFyc2UoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCWludCByZXR2YWw7Ci0JdmFfbGlzdCB2YTsKLQkKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlyZXR2YWwgPSB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmdmEsIEZMQUdfQ09NUEFUKTsKLQl2YV9lbmQodmEpOwotCXJldHVybiByZXR2YWw7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IHZhOworCisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgcmV0dmFsID0gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJnZhLCBGTEFHX0NPTVBBVCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBpbnQKIF9QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JaW50IHJldHZhbDsKLQl2YV9saXN0IHZhOwotCQotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXJldHZhbCA9IHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZ2YSwgRkxBR19DT01QQVR8RkxBR19TSVpFX1QpOwotCXZhX2VuZCh2YSk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBpbnQgcmV0dmFsOworICAgIHZhX2xpc3QgdmE7CisKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICByZXR2YWwgPSB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmdmEsIEZMQUdfQ09NUEFUfEZMQUdfU0laRV9UKTsKKyAgICB2YV9lbmQodmEpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIAogaW50CiBQeUFyZ19QYXJzZVR1cGxlKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQlpbnQgcmV0dmFsOwotCXZhX2xpc3QgdmE7Ci0JCi0JdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JcmV0dmFsID0gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJnZhLCAwKTsKLQl2YV9lbmQodmEpOwotCXJldHVybiByZXR2YWw7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IHZhOworCisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgcmV0dmFsID0gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJnZhLCAwKTsKKyAgICB2YV9lbmQodmEpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKIGludAogX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNoYXIgKmZvcm1hdCwgLi4uKQogewotCWludCByZXR2YWw7Ci0JdmFfbGlzdCB2YTsKLQkKLQl2YV9zdGFydCh2YSwgZm9ybWF0KTsKLQlyZXR2YWwgPSB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmdmEsIEZMQUdfU0laRV9UKTsKLQl2YV9lbmQodmEpOwotCXJldHVybiByZXR2YWw7CisgICAgaW50IHJldHZhbDsKKyAgICB2YV9saXN0IHZhOworCisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgcmV0dmFsID0gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJnZhLCBGTEFHX1NJWkVfVCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiAKIGludAogUHlBcmdfVmFQYXJzZShQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQogewotCXZhX2xpc3QgbHZhOworICAgIHZhX2xpc3QgbHZhOwogCiAjaWZkZWYgVkFfTElTVF9JU19BUlJBWQotCW1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOworICAgIG1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOwogI2Vsc2UKICNpZmRlZiBfX3ZhX2NvcHkKLQlfX3ZhX2NvcHkobHZhLCB2YSk7CisgICAgX192YV9jb3B5KGx2YSwgdmEpOwogI2Vsc2UKLQlsdmEgPSB2YTsKKyAgICBsdmEgPSB2YTsKICNlbmRpZgogI2VuZGlmCiAKLQlyZXR1cm4gdmdldGFyZ3MxKGFyZ3MsIGZvcm1hdCwgJmx2YSwgMCk7CisgICAgcmV0dXJuIHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZsdmEsIDApOwogfQogCiBpbnQKIF9QeUFyZ19WYVBhcnNlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEpCiB7Ci0JdmFfbGlzdCBsdmE7CisgICAgdmFfbGlzdCBsdmE7CiAKICNpZmRlZiBWQV9MSVNUX0lTX0FSUkFZCi0JbWVtY3B5KGx2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CisgICAgbWVtY3B5KGx2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CiAjZWxzZQogI2lmZGVmIF9fdmFfY29weQotCV9fdmFfY29weShsdmEsIHZhKTsKKyAgICBfX3ZhX2NvcHkobHZhLCB2YSk7CiAjZWxzZQotCWx2YSA9IHZhOworICAgIGx2YSA9IHZhOwogI2VuZGlmCiAjZW5kaWYKIAotCXJldHVybiB2Z2V0YXJnczEoYXJncywgZm9ybWF0LCAmbHZhLCBGTEFHX1NJWkVfVCk7CisgICAgcmV0dXJuIHZnZXRhcmdzMShhcmdzLCBmb3JtYXQsICZsdmEsIEZMQUdfU0laRV9UKTsKIH0KIAogCkBAIC0xNDIsMjA2ICsxNDIsMjA2IEBACiBzdGF0aWMgdm9pZAogY2xlYW51cF9wdHIodm9pZCAqcHRyKQogewotCVB5TWVtX0ZSRUUocHRyKTsKKyAgICBQeU1lbV9GUkVFKHB0cik7CiB9CiAKIHN0YXRpYyB2b2lkCiBjbGVhbnVwX2J1ZmZlcih2b2lkICpwdHIpCiB7Ci0JUHlCdWZmZXJfUmVsZWFzZSgoUHlfYnVmZmVyICopIHB0cik7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgoUHlfYnVmZmVyICopIHB0cik7CiB9CiAKIHN0YXRpYyBpbnQKIGFkZGNsZWFudXAodm9pZCAqcHRyLCBQeU9iamVjdCAqKmZyZWVsaXN0LCB2b2lkICgqZGVzdHIpKHZvaWQgKikpCiB7Ci0JUHlPYmplY3QgKmNvYmo7Ci0JaWYgKCEqZnJlZWxpc3QpIHsKLQkJKmZyZWVsaXN0ID0gUHlMaXN0X05ldygwKTsKLQkJaWYgKCEqZnJlZWxpc3QpIHsKLQkJCWRlc3RyKHB0cik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0JY29iaiA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cihwdHIsIGRlc3RyKTsKLQlpZiAoIWNvYmopIHsKLQkJZGVzdHIocHRyKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlMaXN0X0FwcGVuZCgqZnJlZWxpc3QsIGNvYmopKSB7Ci0JCVB5X0RFQ1JFRihjb2JqKTsKLQkJcmV0dXJuIC0xOwotCX0KKyAgICBQeU9iamVjdCAqY29iajsKKyAgICBpZiAoISpmcmVlbGlzdCkgeworICAgICAgICAqZnJlZWxpc3QgPSBQeUxpc3RfTmV3KDApOworICAgICAgICBpZiAoISpmcmVlbGlzdCkgeworICAgICAgICAgICAgZGVzdHIocHRyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb2JqID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKHB0ciwgZGVzdHIpOworICAgIGlmICghY29iaikgeworICAgICAgICBkZXN0cihwdHIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChQeUxpc3RfQXBwZW5kKCpmcmVlbGlzdCwgY29iaikpIHsKICAgICAgICAgUHlfREVDUkVGKGNvYmopOwotCXJldHVybiAwOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihjb2JqKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludAogY2xlYW5yZXR1cm4oaW50IHJldHZhbCwgUHlPYmplY3QgKmZyZWVsaXN0KQogewotCWlmIChmcmVlbGlzdCAmJiByZXR2YWwgIT0gMCkgewotCQkvKiBXZSB3ZXJlIHN1Y2Nlc3NmdWwsIHJlc2V0IHRoZSBkZXN0cnVjdG9ycyBzbyB0aGF0IHRoZXkKLQkJICAgZG9uJ3QgZ2V0IGNhbGxlZC4gKi8KLQkJUHlfc3NpemVfdCBsZW4gPSBQeUxpc3RfR0VUX1NJWkUoZnJlZWxpc3QpLCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkoKFB5Q09iamVjdCAqKSBQeUxpc3RfR0VUX0lURU0oZnJlZWxpc3QsIGkpKQotCQkJCS0+ZGVzdHJ1Y3RvciA9IE5VTEw7Ci0JfQotCVB5X1hERUNSRUYoZnJlZWxpc3QpOwotCXJldHVybiByZXR2YWw7CisgICAgaWYgKGZyZWVsaXN0ICYmIHJldHZhbCAhPSAwKSB7CisgICAgICAgIC8qIFdlIHdlcmUgc3VjY2Vzc2Z1bCwgcmVzZXQgdGhlIGRlc3RydWN0b3JzIHNvIHRoYXQgdGhleQorICAgICAgICAgICBkb24ndCBnZXQgY2FsbGVkLiAqLworICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5TGlzdF9HRVRfU0laRShmcmVlbGlzdCksIGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgICgoUHlDT2JqZWN0ICopIFB5TGlzdF9HRVRfSVRFTShmcmVlbGlzdCwgaSkpCisgICAgICAgICAgICAgICAgLT5kZXN0cnVjdG9yID0gTlVMTDsKKyAgICB9CisgICAgUHlfWERFQ1JFRihmcmVlbGlzdCk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogCiBzdGF0aWMgaW50CiB2Z2V0YXJnczEoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzKQogewotCWNoYXIgbXNnYnVmWzI1Nl07Ci0JaW50IGxldmVsc1szMl07Ci0JY29uc3QgY2hhciAqZm5hbWUgPSBOVUxMOwotCWNvbnN0IGNoYXIgKm1lc3NhZ2UgPSBOVUxMOwotCWludCBtaW4gPSAtMTsKLQlpbnQgbWF4ID0gMDsKLQlpbnQgbGV2ZWwgPSAwOwotCWludCBlbmRmbXQgPSAwOwotCWNvbnN0IGNoYXIgKmZvcm1hdHNhdmUgPSBmb3JtYXQ7Ci0JUHlfc3NpemVfdCBpLCBsZW47Ci0JY2hhciAqbXNnOwotCVB5T2JqZWN0ICpmcmVlbGlzdCA9IE5VTEw7Ci0JaW50IGNvbXBhdCA9IGZsYWdzICYgRkxBR19DT01QQVQ7CisgICAgY2hhciBtc2didWZbMjU2XTsKKyAgICBpbnQgbGV2ZWxzWzMyXTsKKyAgICBjb25zdCBjaGFyICpmbmFtZSA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqbWVzc2FnZSA9IE5VTEw7CisgICAgaW50IG1pbiA9IC0xOworICAgIGludCBtYXggPSAwOworICAgIGludCBsZXZlbCA9IDA7CisgICAgaW50IGVuZGZtdCA9IDA7CisgICAgY29uc3QgY2hhciAqZm9ybWF0c2F2ZSA9IGZvcm1hdDsKKyAgICBQeV9zc2l6ZV90IGksIGxlbjsKKyAgICBjaGFyICptc2c7CisgICAgUHlPYmplY3QgKmZyZWVsaXN0ID0gTlVMTDsKKyAgICBpbnQgY29tcGF0ID0gZmxhZ3MgJiBGTEFHX0NPTVBBVDsKIAotCWFzc2VydChjb21wYXQgfHwgKGFyZ3MgIT0gKFB5T2JqZWN0KilOVUxMKSk7Ci0JZmxhZ3MgPSBmbGFncyAmIH5GTEFHX0NPTVBBVDsKKyAgICBhc3NlcnQoY29tcGF0IHx8IChhcmdzICE9IChQeU9iamVjdCopTlVMTCkpOworICAgIGZsYWdzID0gZmxhZ3MgJiB+RkxBR19DT01QQVQ7CiAKLQl3aGlsZSAoZW5kZm10ID09IDApIHsKLQkJaW50IGMgPSAqZm9ybWF0Kys7Ci0JCXN3aXRjaCAoYykgewotCQljYXNlICcoJzoKLQkJCWlmIChsZXZlbCA9PSAwKQotCQkJCW1heCsrOwotCQkJbGV2ZWwrKzsKLQkJCWlmIChsZXZlbCA+PSAzMCkKLQkJCQlQeV9GYXRhbEVycm9yKCJ0b28gbWFueSB0dXBsZSBuZXN0aW5nIGxldmVscyAiCi0JCQkJCSAgICAgICJpbiBhcmd1bWVudCBmb3JtYXQgc3RyaW5nIik7Ci0JCQlicmVhazsKLQkJY2FzZSAnKSc6Ci0JCQlpZiAobGV2ZWwgPT0gMCkKLQkJCQlQeV9GYXRhbEVycm9yKCJleGNlc3MgJyknIGluIGdldGFyZ3MgZm9ybWF0Iik7Ci0JCQllbHNlCi0JCQkJbGV2ZWwtLTsKLQkJCWJyZWFrOwotCQljYXNlICdcMCc6Ci0JCQllbmRmbXQgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJzonOgotCQkJZm5hbWUgPSBmb3JtYXQ7Ci0JCQllbmRmbXQgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgJzsnOgotCQkJbWVzc2FnZSA9IGZvcm1hdDsKLQkJCWVuZGZtdCA9IDE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmIChsZXZlbCA9PSAwKSB7Ci0JCQkJaWYgKGMgPT0gJ08nKQotCQkJCQltYXgrKzsKLQkJCQllbHNlIGlmIChpc2FscGhhKFB5X0NIQVJNQVNLKGMpKSkgewotCQkJCQlpZiAoYyAhPSAnZScpIC8qIHNraXAgZW5jb2RlZCAqLwotCQkJCQkJbWF4Kys7Ci0JCQkJfSBlbHNlIGlmIChjID09ICd8JykKLQkJCQkJbWluID0gbWF4OwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JaWYgKGxldmVsICE9IDApCi0JCVB5X0ZhdGFsRXJyb3IoLyogJygnICovICJtaXNzaW5nICcpJyBpbiBnZXRhcmdzIGZvcm1hdCIpOwotCQotCWlmIChtaW4gPCAwKQotCQltaW4gPSBtYXg7Ci0JCi0JZm9ybWF0ID0gZm9ybWF0c2F2ZTsKLQkKLQlpZiAoY29tcGF0KSB7Ci0JCWlmIChtYXggPT0gMCkgewotCQkJaWYgKGFyZ3MgPT0gTlVMTCkKLQkJCQlyZXR1cm4gMTsKLQkJCVB5T1Nfc25wcmludGYobXNnYnVmLCBzaXplb2YobXNnYnVmKSwKLQkJCQkgICAgICAiJS4yMDBzJXMgdGFrZXMgbm8gYXJndW1lbnRzIiwKLQkJCQkgICAgICBmbmFtZT09TlVMTCA/ICJmdW5jdGlvbiIgOiBmbmFtZSwKLQkJCQkgICAgICBmbmFtZT09TlVMTCA/ICIiIDogIigpIik7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtc2didWYpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJZWxzZSBpZiAobWluID09IDEgJiYgbWF4ID09IDEpIHsKLQkJCWlmIChhcmdzID09IE5VTEwpIHsKLQkJCQlQeU9TX3NucHJpbnRmKG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksCi0JCQkJICAgICAgIiUuMjAwcyVzIHRha2VzIGF0IGxlYXN0IG9uZSBhcmd1bWVudCIsCi0JCQkJCSAgICAgIGZuYW1lPT1OVUxMID8gImZ1bmN0aW9uIiA6IGZuYW1lLAotCQkJCQkgICAgICBmbmFtZT09TlVMTCA/ICIiIDogIigpIik7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbXNnYnVmKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCW1zZyA9IGNvbnZlcnRpdGVtKGFyZ3MsICZmb3JtYXQsIHBfdmEsIGZsYWdzLCBsZXZlbHMsIAotCQkJCQkgIG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksICZmcmVlbGlzdCk7Ci0JCQlpZiAobXNnID09IE5VTEwpCi0JCQkJcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKLQkJCXNldGVycm9yKGxldmVsc1swXSwgbXNnLCBsZXZlbHMrMSwgZm5hbWUsIG1lc3NhZ2UpOwotCQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQkJfQotCQllbHNlIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSAgICAib2xkIHN0eWxlIGdldGFyZ3MgZm9ybWF0IHVzZXMgbmV3IGZlYXR1cmVzIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQkKLQlpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkgICAgIm5ldyBzdHlsZSBnZXRhcmdzIGZvcm1hdCBidXQgYXJndW1lbnQgaXMgbm90IGEgdHVwbGUiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCWxlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JCi0JaWYgKGxlbiA8IG1pbiB8fCBtYXggPCBsZW4pIHsKLQkJaWYgKG1lc3NhZ2UgPT0gTlVMTCkgewotCQkJUHlPU19zbnByaW50Zihtc2didWYsIHNpemVvZihtc2didWYpLAotCQkJCSAgICAgICIlLjE1MHMlcyB0YWtlcyAlcyAlZCBhcmd1bWVudCVzICIKLQkJCQkgICAgICAiKCVsZCBnaXZlbikiLAotCQkJCSAgICAgIGZuYW1lPT1OVUxMID8gImZ1bmN0aW9uIiA6IGZuYW1lLAotCQkJCSAgICAgIGZuYW1lPT1OVUxMID8gIiIgOiAiKCkiLAotCQkJCSAgICAgIG1pbj09bWF4ID8gImV4YWN0bHkiCi0JCQkJICAgICAgOiBsZW4gPCBtaW4gPyAiYXQgbGVhc3QiIDogImF0IG1vc3QiLAotCQkJCSAgICAgIGxlbiA8IG1pbiA/IG1pbiA6IG1heCwKLQkJCQkgICAgICAobGVuIDwgbWluID8gbWluIDogbWF4KSA9PSAxID8gIiIgOiAicyIsCi0JCQkJICAgICAgUHlfU0FGRV9ET1dOQ0FTVChsZW4sIFB5X3NzaXplX3QsIGxvbmcpKTsKLQkJCW1lc3NhZ2UgPSBtc2didWY7Ci0JCX0KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZSk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJaWYgKCpmb3JtYXQgPT0gJ3wnKQotCQkJZm9ybWF0Kys7Ci0JCW1zZyA9IGNvbnZlcnRpdGVtKFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSksICZmb3JtYXQsIHBfdmEsCi0JCQkJICBmbGFncywgbGV2ZWxzLCBtc2didWYsIAotCQkJCSAgc2l6ZW9mKG1zZ2J1ZiksICZmcmVlbGlzdCk7Ci0JCWlmIChtc2cpIHsKLQkJCXNldGVycm9yKGkrMSwgbXNnLCBsZXZlbHMsIGZuYW1lLCBtZXNzYWdlKTsKLQkJCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JCX0KLQl9CisgICAgd2hpbGUgKGVuZGZtdCA9PSAwKSB7CisgICAgICAgIGludCBjID0gKmZvcm1hdCsrOworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnKCc6CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMCkKKyAgICAgICAgICAgICAgICBtYXgrKzsKKyAgICAgICAgICAgIGxldmVsKys7CisgICAgICAgICAgICBpZiAobGV2ZWwgPj0gMzApCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigidG9vIG1hbnkgdHVwbGUgbmVzdGluZyBsZXZlbHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIGFyZ3VtZW50IGZvcm1hdCBzdHJpbmciKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcpJzoKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImV4Y2VzcyAnKScgaW4gZ2V0YXJncyBmb3JtYXQiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZXZlbC0tOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgICAgIGVuZGZtdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnOic6CisgICAgICAgICAgICBmbmFtZSA9IGZvcm1hdDsKKyAgICAgICAgICAgIGVuZGZtdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnOyc6CisgICAgICAgICAgICBtZXNzYWdlID0gZm9ybWF0OworICAgICAgICAgICAgZW5kZm10ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnTycpCisgICAgICAgICAgICAgICAgICAgIG1heCsrOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzYWxwaGEoUHlfQ0hBUk1BU0soYykpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9ICdlJykgLyogc2tpcCBlbmNvZGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBtYXgrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ3wnKQorICAgICAgICAgICAgICAgICAgICBtaW4gPSBtYXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIAotCWlmICgqZm9ybWF0ICE9ICdcMCcgJiYgIWlzYWxwaGEoUHlfQ0hBUk1BU0soKmZvcm1hdCkpICYmCi0JICAgICpmb3JtYXQgIT0gJygnICYmCi0JICAgICpmb3JtYXQgIT0gJ3wnICYmICpmb3JtYXQgIT0gJzonICYmICpmb3JtYXQgIT0gJzsnKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSAgICAgImJhZCBmb3JtYXQgc3RyaW5nOiAlLjIwMHMiLCBmb3JtYXRzYXZlKTsKLQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQl9Ci0JCi0JcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKKyAgICBpZiAobGV2ZWwgIT0gMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigvKiAnKCcgKi8gIm1pc3NpbmcgJyknIGluIGdldGFyZ3MgZm9ybWF0Iik7CisKKyAgICBpZiAobWluIDwgMCkKKyAgICAgICAgbWluID0gbWF4OworCisgICAgZm9ybWF0ID0gZm9ybWF0c2F2ZTsKKworICAgIGlmIChjb21wYXQpIHsKKyAgICAgICAgaWYgKG1heCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgUHlPU19zbnByaW50Zihtc2didWYsIHNpemVvZihtc2didWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzJXMgdGFrZXMgbm8gYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWU9PU5VTEwgPyAiZnVuY3Rpb24iIDogZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lPT1OVUxMID8gIiIgOiAiKCkiKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG1zZ2J1Zik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtaW4gPT0gMSAmJiBtYXggPT0gMSkgeworICAgICAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYobXNnYnVmLCBzaXplb2YobXNnYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAiJS4yMDBzJXMgdGFrZXMgYXQgbGVhc3Qgb25lIGFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWU9PU5VTEwgPyAiZnVuY3Rpb24iIDogZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lPT1OVUxMID8gIiIgOiAiKCkiKTsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtc2didWYpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnID0gY29udmVydGl0ZW0oYXJncywgJmZvcm1hdCwgcF92YSwgZmxhZ3MsIGxldmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2J1Ziwgc2l6ZW9mKG1zZ2J1ZiksICZmcmVlbGlzdCk7CisgICAgICAgICAgICBpZiAobXNnID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKKyAgICAgICAgICAgIHNldGVycm9yKGxldmVsc1swXSwgbXNnLCBsZXZlbHMrMSwgZm5hbWUsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAib2xkIHN0eWxlIGdldGFyZ3MgZm9ybWF0IHVzZXMgbmV3IGZlYXR1cmVzIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAibmV3IHN0eWxlIGdldGFyZ3MgZm9ybWF0IGJ1dCBhcmd1bWVudCBpcyBub3QgYSB0dXBsZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBsZW4gPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworCisgICAgaWYgKGxlbiA8IG1pbiB8fCBtYXggPCBsZW4pIHsKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlPU19zbnByaW50Zihtc2didWYsIHNpemVvZihtc2didWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJS4xNTBzJXMgdGFrZXMgJXMgJWQgYXJndW1lbnQlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIoJWxkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lPT1OVUxMID8gImZ1bmN0aW9uIiA6IGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZT09TlVMTCA/ICIiIDogIigpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPT1tYXggPyAiZXhhY3RseSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsZW4gPCBtaW4gPyAiYXQgbGVhc3QiIDogImF0IG1vc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPCBtaW4gPyBtaW4gOiBtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW4gPCBtaW4gPyBtaW4gOiBtYXgpID09IDEgPyAiIiA6ICJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfU0FGRV9ET1dOQ0FTVChsZW4sIFB5X3NzaXplX3QsIGxvbmcpKTsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBtc2didWY7CisgICAgICAgIH0KKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpCisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgbXNnID0gY29udmVydGl0ZW0oUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKSwgJmZvcm1hdCwgcF92YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGxldmVscywgbXNnYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKKyAgICAgICAgaWYgKG1zZykgeworICAgICAgICAgICAgc2V0ZXJyb3IoaSsxLCBtc2csIGxldmVscywgZm5hbWUsIG1lc3NhZ2UpOworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgqZm9ybWF0ICE9ICdcMCcgJiYgIWlzYWxwaGEoUHlfQ0hBUk1BU0soKmZvcm1hdCkpICYmCisgICAgICAgICpmb3JtYXQgIT0gJygnICYmCisgICAgICAgICpmb3JtYXQgIT0gJ3wnICYmICpmb3JtYXQgIT0gJzonICYmICpmb3JtYXQgIT0gJzsnKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJiYWQgZm9ybWF0IHN0cmluZzogJS4yMDBzIiwgZm9ybWF0c2F2ZSk7CisgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgfQorCisgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKIH0KIAogCkBAIC0zNTAsMzcgKzM1MCwzNyBAQAogc2V0ZXJyb3IoaW50IGlhcmcsIGNvbnN0IGNoYXIgKm1zZywgaW50ICpsZXZlbHMsIGNvbnN0IGNoYXIgKmZuYW1lLAogICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSkKIHsKLQljaGFyIGJ1Zls1MTJdOwotCWludCBpOwotCWNoYXIgKnAgPSBidWY7CisgICAgY2hhciBidWZbNTEyXTsKKyAgICBpbnQgaTsKKyAgICBjaGFyICpwID0gYnVmOwogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybjsKLQllbHNlIGlmIChtZXNzYWdlID09IE5VTEwpIHsKLQkJaWYgKGZuYW1lICE9IE5VTEwpIHsKLQkJCVB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZiksICIlLjIwMHMoKSAiLCBmbmFtZSk7Ci0JCQlwICs9IHN0cmxlbihwKTsKLQkJfQotCQlpZiAoaWFyZyAhPSAwKSB7Ci0JCQlQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLAotCQkJCSAgICAgICJhcmd1bWVudCAlZCIsIGlhcmcpOwotCQkJaSA9IDA7Ci0JCQlwICs9IHN0cmxlbihwKTsKLQkJCXdoaWxlIChsZXZlbHNbaV0gPiAwICYmIGkgPCAzMiAmJiAoaW50KShwLWJ1ZikgPCAyMjApIHsKLQkJCQlQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLAotCQkJCQkgICAgICAiLCBpdGVtICVkIiwgbGV2ZWxzW2ldLTEpOwotCQkJCXAgKz0gc3RybGVuKHApOwotCQkJCWkrKzsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksICJhcmd1bWVudCIpOwotCQkJcCArPSBzdHJsZW4ocCk7Ci0JCX0KLQkJUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwgIiAlLjI1NnMiLCBtc2cpOwotCQltZXNzYWdlID0gYnVmOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtZXNzYWdlKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIGVsc2UgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICBpZiAoZm5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSwgIiUuMjAwcygpICIsIGZuYW1lKTsKKyAgICAgICAgICAgIHAgKz0gc3RybGVuKHApOworICAgICAgICB9CisgICAgICAgIGlmIChpYXJnICE9IDApIHsKKyAgICAgICAgICAgIFB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCAlZCIsIGlhcmcpOworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBwICs9IHN0cmxlbihwKTsKKyAgICAgICAgICAgIHdoaWxlIChsZXZlbHNbaV0gPiAwICYmIGkgPCAzMiAmJiAoaW50KShwLWJ1ZikgPCAyMjApIHsKKyAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgaXRlbSAlZCIsIGxldmVsc1tpXS0xKTsKKyAgICAgICAgICAgICAgICBwICs9IHN0cmxlbihwKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLCAiYXJndW1lbnQiKTsKKyAgICAgICAgICAgIHAgKz0gc3RybGVuKHApOworICAgICAgICB9CisgICAgICAgIFB5T1Nfc25wcmludGYocCwgc2l6ZW9mKGJ1ZikgLSAocCAtIGJ1ZiksICIgJS4yNTZzIiwgbXNnKTsKKyAgICAgICAgbWVzc2FnZSA9IGJ1ZjsKKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZSk7CiB9CiAKIApAQCAtMzk2LDgzICszOTYsODMgQEAKICAgICAgICpwX3ZhIGlzIHVuZGVmaW5lZCwKICAgICAgICpsZXZlbHMgaXMgYSAwLXRlcm1pbmF0ZWQgbGlzdCBvZiBpdGVtIG51bWJlcnMsCiAgICAgICAqbXNnYnVmIGNvbnRhaW5zIGFuIGVycm9yIG1lc3NhZ2UsIHdob3NlIGZvcm1hdCBpczoKLSAgICAgICAgICJtdXN0IGJlIDx0eXBlbmFtZTE+LCBub3QgPHR5cGVuYW1lMj4iLCB3aGVyZToKLSAgICAgICAgICAgIDx0eXBlbmFtZTE+IGlzIHRoZSBuYW1lIG9mIHRoZSBleHBlY3RlZCB0eXBlLCBhbmQKLSAgICAgICAgICAgIDx0eXBlbmFtZTI+IGlzIHRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgdHlwZSwKKyAgICAgIm11c3QgYmUgPHR5cGVuYW1lMT4sIG5vdCA8dHlwZW5hbWUyPiIsIHdoZXJlOgorICAgICAgICA8dHlwZW5hbWUxPiBpcyB0aGUgbmFtZSBvZiB0aGUgZXhwZWN0ZWQgdHlwZSwgYW5kCisgICAgICAgIDx0eXBlbmFtZTI+IGlzIHRoZSBuYW1lIG9mIHRoZSBhY3R1YWwgdHlwZSwKICAgICAgIGFuZCBtc2didWYgaXMgcmV0dXJuZWQuCiAqLwogCiBzdGF0aWMgY2hhciAqCiBjb252ZXJ0dHVwbGUoUHlPYmplY3QgKmFyZywgY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgaW50ICpsZXZlbHMsIGNoYXIgKm1zZ2J1Ziwgc2l6ZV90IGJ1ZnNpemUsIGludCB0b3BsZXZlbCwgCisgICAgICAgICAgICAgaW50ICpsZXZlbHMsIGNoYXIgKm1zZ2J1Ziwgc2l6ZV90IGJ1ZnNpemUsIGludCB0b3BsZXZlbCwKICAgICAgICAgICAgICBQeU9iamVjdCAqKmZyZWVsaXN0KQogewotCWludCBsZXZlbCA9IDA7Ci0JaW50IG4gPSAwOwotCWNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKLQlpbnQgaTsKLQkKLQlmb3IgKDs7KSB7Ci0JCWludCBjID0gKmZvcm1hdCsrOwotCQlpZiAoYyA9PSAnKCcpIHsKLQkJCWlmIChsZXZlbCA9PSAwKQotCQkJCW4rKzsKLQkJCWxldmVsKys7Ci0JCX0KLQkJZWxzZSBpZiAoYyA9PSAnKScpIHsKLQkJCWlmIChsZXZlbCA9PSAwKQotCQkJCWJyZWFrOwotCQkJbGV2ZWwtLTsKLQkJfQotCQllbHNlIGlmIChjID09ICc6JyB8fCBjID09ICc7JyB8fCBjID09ICdcMCcpCi0JCQlicmVhazsKLQkJZWxzZSBpZiAobGV2ZWwgPT0gMCAmJiBpc2FscGhhKFB5X0NIQVJNQVNLKGMpKSkKLQkJCW4rKzsKLQl9Ci0JCi0JaWYgKCFQeVNlcXVlbmNlX0NoZWNrKGFyZykgfHwgUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQlsZXZlbHNbMF0gPSAwOwotCQlQeU9TX3NucHJpbnRmKG1zZ2J1ZiwgYnVmc2l6ZSwKLQkJCSAgICAgIHRvcGxldmVsID8gImV4cGVjdGVkICVkIGFyZ3VtZW50cywgbm90ICUuNTBzIiA6Ci0JCQkgICAgICAgICAgICAgICJtdXN0IGJlICVkLWl0ZW0gc2VxdWVuY2UsIG5vdCAlLjUwcyIsCi0JCQkgICAgICBuLCAKLQkJCSAgICAgIGFyZyA9PSBQeV9Ob25lID8gIk5vbmUiIDogYXJnLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIG1zZ2J1ZjsKLQl9Ci0JCi0JaWYgKChpID0gUHlTZXF1ZW5jZV9TaXplKGFyZykpICE9IG4pIHsKLQkJbGV2ZWxzWzBdID0gMDsKLQkJUHlPU19zbnByaW50Zihtc2didWYsIGJ1ZnNpemUsCi0JCQkgICAgICB0b3BsZXZlbCA/ICJleHBlY3RlZCAlZCBhcmd1bWVudHMsIG5vdCAlZCIgOgotCQkJICAgICAgICAgICAgICJtdXN0IGJlIHNlcXVlbmNlIG9mIGxlbmd0aCAlZCwgbm90ICVkIiwKLQkJCSAgICAgIG4sIGkpOwotCQlyZXR1cm4gbXNnYnVmOwotCX0KKyAgICBpbnQgbGV2ZWwgPSAwOworICAgIGludCBuID0gMDsKKyAgICBjb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7CisgICAgaW50IGk7CiAKLQlmb3JtYXQgPSAqcF9mb3JtYXQ7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQljaGFyICptc2c7Ci0JCVB5T2JqZWN0ICppdGVtOwotCQlpdGVtID0gUHlTZXF1ZW5jZV9HZXRJdGVtKGFyZywgaSk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlsZXZlbHNbMF0gPSBpKzE7Ci0JCQlsZXZlbHNbMV0gPSAwOwotCQkJc3RybmNweShtc2didWYsICJpcyBub3QgcmV0cmlldmFibGUiLCBidWZzaXplKTsKLQkJCXJldHVybiBtc2didWY7Ci0JCX0KLQkJbXNnID0gY29udmVydGl0ZW0oaXRlbSwgJmZvcm1hdCwgcF92YSwgZmxhZ3MsIGxldmVscysxLCAKLQkJCQkgIG1zZ2J1ZiwgYnVmc2l6ZSwgZnJlZWxpc3QpOwotCQkvKiBQeVNlcXVlbmNlX0dldEl0ZW0gY2FsbHMgdHAtPnNxX2l0ZW0sIHdoaWNoIElOQ1JFRnMgKi8KLQkJUHlfWERFQ1JFRihpdGVtKTsKLQkJaWYgKG1zZyAhPSBOVUxMKSB7Ci0JCQlsZXZlbHNbMF0gPSBpKzE7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGMgPSAqZm9ybWF0Kys7CisgICAgICAgIGlmIChjID09ICcoJykgeworICAgICAgICAgICAgaWYgKGxldmVsID09IDApCisgICAgICAgICAgICAgICAgbisrOworICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjID09ICcpJykgeworICAgICAgICAgICAgaWYgKGxldmVsID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBsZXZlbC0tOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJzonIHx8IGMgPT0gJzsnIHx8IGMgPT0gJ1wwJykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBlbHNlIGlmIChsZXZlbCA9PSAwICYmIGlzYWxwaGEoUHlfQ0hBUk1BU0soYykpKQorICAgICAgICAgICAgbisrOworICAgIH0KIAotCSpwX2Zvcm1hdCA9IGZvcm1hdDsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5U2VxdWVuY2VfQ2hlY2soYXJnKSB8fCBQeVN0cmluZ19DaGVjayhhcmcpKSB7CisgICAgICAgIGxldmVsc1swXSA9IDA7CisgICAgICAgIFB5T1Nfc25wcmludGYobXNnYnVmLCBidWZzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHRvcGxldmVsID8gImV4cGVjdGVkICVkIGFyZ3VtZW50cywgbm90ICUuNTBzIiA6CisgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgJWQtaXRlbSBzZXF1ZW5jZSwgbm90ICUuNTBzIiwKKyAgICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgICBhcmcgPT0gUHlfTm9uZSA/ICJOb25lIiA6IGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiBtc2didWY7CisgICAgfQorCisgICAgaWYgKChpID0gUHlTZXF1ZW5jZV9TaXplKGFyZykpICE9IG4pIHsKKyAgICAgICAgbGV2ZWxzWzBdID0gMDsKKyAgICAgICAgUHlPU19zbnByaW50Zihtc2didWYsIGJ1ZnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgdG9wbGV2ZWwgPyAiZXhwZWN0ZWQgJWQgYXJndW1lbnRzLCBub3QgJWQiIDoKKyAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHNlcXVlbmNlIG9mIGxlbmd0aCAlZCwgbm90ICVkIiwKKyAgICAgICAgICAgICAgICAgIG4sIGkpOworICAgICAgICByZXR1cm4gbXNnYnVmOworICAgIH0KKworICAgIGZvcm1hdCA9ICpwX2Zvcm1hdDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGNoYXIgKm1zZzsKKyAgICAgICAgUHlPYmplY3QgKml0ZW07CisgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXJnLCBpKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGxldmVsc1swXSA9IGkrMTsKKyAgICAgICAgICAgIGxldmVsc1sxXSA9IDA7CisgICAgICAgICAgICBzdHJuY3B5KG1zZ2J1ZiwgImlzIG5vdCByZXRyaWV2YWJsZSIsIGJ1ZnNpemUpOworICAgICAgICAgICAgcmV0dXJuIG1zZ2J1ZjsKKyAgICAgICAgfQorICAgICAgICBtc2cgPSBjb252ZXJ0aXRlbShpdGVtLCAmZm9ybWF0LCBwX3ZhLCBmbGFncywgbGV2ZWxzKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2J1ZiwgYnVmc2l6ZSwgZnJlZWxpc3QpOworICAgICAgICAvKiBQeVNlcXVlbmNlX0dldEl0ZW0gY2FsbHMgdHAtPnNxX2l0ZW0sIHdoaWNoIElOQ1JFRnMgKi8KKyAgICAgICAgUHlfWERFQ1JFRihpdGVtKTsKKyAgICAgICAgaWYgKG1zZyAhPSBOVUxMKSB7CisgICAgICAgICAgICBsZXZlbHNbMF0gPSBpKzE7CisgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICB9CisgICAgfQorCisgICAgKnBfZm9ybWF0ID0gZm9ybWF0OworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTQ4Miw0MyArNDgyLDQzIEBACiBjb252ZXJ0aXRlbShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgIGludCAqbGV2ZWxzLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBQeU9iamVjdCAqKmZyZWVsaXN0KQogewotCWNoYXIgKm1zZzsKLQljb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7Ci0JCi0JaWYgKCpmb3JtYXQgPT0gJygnIC8qICcpJyAqLykgewotCQlmb3JtYXQrKzsKLQkJbXNnID0gY29udmVydHR1cGxlKGFyZywgJmZvcm1hdCwgcF92YSwgZmxhZ3MsIGxldmVscywgbXNnYnVmLCAKLQkJCQkgICBidWZzaXplLCAwLCBmcmVlbGlzdCk7Ci0JCWlmIChtc2cgPT0gTlVMTCkKLQkJCWZvcm1hdCsrOwotCX0KLQllbHNlIHsKLQkJbXNnID0gY29udmVydHNpbXBsZShhcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLCAKLQkJCQkgICAgbXNnYnVmLCBidWZzaXplLCBmcmVlbGlzdCk7Ci0JCWlmIChtc2cgIT0gTlVMTCkKLQkJCWxldmVsc1swXSA9IDA7Ci0JfQotCWlmIChtc2cgPT0gTlVMTCkKLQkJKnBfZm9ybWF0ID0gZm9ybWF0OwotCXJldHVybiBtc2c7CisgICAgY2hhciAqbXNnOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKKworICAgIGlmICgqZm9ybWF0ID09ICcoJyAvKiAnKScgKi8pIHsKKyAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIG1zZyA9IGNvbnZlcnR0dXBsZShhcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLCBsZXZlbHMsIG1zZ2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUsIDAsIGZyZWVsaXN0KTsKKyAgICAgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtc2cgPSBjb252ZXJ0c2ltcGxlKGFyZywgJmZvcm1hdCwgcF92YSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnYnVmLCBidWZzaXplLCBmcmVlbGlzdCk7CisgICAgICAgIGlmIChtc2cgIT0gTlVMTCkKKyAgICAgICAgICAgIGxldmVsc1swXSA9IDA7CisgICAgfQorICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICAgICAgKnBfZm9ybWF0ID0gZm9ybWF0OworICAgIHJldHVybiBtc2c7CiB9CiAKIAogCiAjZGVmaW5lIFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpIFwKLSAgICAgICAgX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKGFyZywgTlVMTCkKKyAgICBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcoYXJnLCBOVUxMKQogCiAvKiBGb3JtYXQgYW4gZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgY29udmVydHNpbXBsZSgpLiAqLwogCiBzdGF0aWMgY2hhciAqCiBjb252ZXJ0ZXJyKGNvbnN0IGNoYXIgKmV4cGVjdGVkLCBQeU9iamVjdCAqYXJnLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplKQogewotCWFzc2VydChleHBlY3RlZCAhPSBOVUxMKTsKLQlhc3NlcnQoYXJnICE9IE5VTEwpOyAKLQlQeU9TX3NucHJpbnRmKG1zZ2J1ZiwgYnVmc2l6ZSwKLQkJICAgICAgIm11c3QgYmUgJS41MHMsIG5vdCAlLjUwcyIsIGV4cGVjdGVkLAotCQkgICAgICBhcmcgPT0gUHlfTm9uZSA/ICJOb25lIiA6IGFyZy0+b2JfdHlwZS0+dHBfbmFtZSk7Ci0JcmV0dXJuIG1zZ2J1ZjsKKyAgICBhc3NlcnQoZXhwZWN0ZWQgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGFyZyAhPSBOVUxMKTsKKyAgICBQeU9TX3NucHJpbnRmKG1zZ2J1ZiwgYnVmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICJtdXN0IGJlICUuNTBzLCBub3QgJS41MHMiLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgIGFyZyA9PSBQeV9Ob25lID8gIk5vbmUiIDogYXJnLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gbXNnYnVmOwogfQogCiAjZGVmaW5lIENPTlZfVU5JQ09ERSAiKHVuaWNvZGUgY29udmVyc2lvbiBlcnJvcikiCkBAIC01MjgsMTIgKzUyOCwxMiBAQAogc3RhdGljIGludAogZmxvYXRfYXJndW1lbnRfZXJyb3IoUHlPYmplY3QgKmFyZykKIHsKLQlpZiAoUHlGbG9hdF9DaGVjayhhcmcpICYmCi0JICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkgICAgICAgImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIgKSkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlyZXR1cm4gMDsKKyAgICBpZiAoUHlGbG9hdF9DaGVjayhhcmcpICYmCisgICAgICAgIFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQiICkpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIC8qIENvbnZlcnQgYSBub24tdHVwbGUgYXJndW1lbnQuICBSZXR1cm4gTlVMTCBpZiBjb252ZXJzaW9uIHdlbnQgT0ssCkBAIC01NDksODIzICs1NDksODIzIEBACiBjb252ZXJ0c2ltcGxlKFB5T2JqZWN0ICphcmcsIGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzLAogICAgICAgICAgICAgICBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBQeU9iamVjdCAqKmZyZWVsaXN0KQogewotCS8qIEZvciAjIGNvZGVzICovCi0jZGVmaW5lIEZFVENIX1NJWkUJaW50ICpxPU5VTEw7UHlfc3NpemVfdCAqcTI9TlVMTDtcCi0JaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpIHEyPXZhX2FyZygqcF92YSwgUHlfc3NpemVfdCopOyBcCi0JZWxzZSBxPXZhX2FyZygqcF92YSwgaW50Kik7CisgICAgLyogRm9yICMgY29kZXMgKi8KKyNkZWZpbmUgRkVUQ0hfU0laRSAgICAgIGludCAqcT1OVUxMO1B5X3NzaXplX3QgKnEyPU5VTEw7XAorICAgIGlmIChmbGFncyAmIEZMQUdfU0laRV9UKSBxMj12YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QqKTsgXAorICAgIGVsc2UgcT12YV9hcmcoKnBfdmEsIGludCopOwogI2RlZmluZSBTVE9SRV9TSVpFKHMpICAgaWYgKGZsYWdzICYgRkxBR19TSVpFX1QpICpxMj1zOyBlbHNlICpxPXM7CiAjZGVmaW5lIEJVRkZFUl9MRU4gICAgICAoKGZsYWdzICYgRkxBR19TSVpFX1QpID8gKnEyOipxKQogCi0JY29uc3QgY2hhciAqZm9ybWF0ID0gKnBfZm9ybWF0OwotCWNoYXIgYyA9ICpmb3JtYXQrKzsKKyAgICBjb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7CisgICAgY2hhciBjID0gKmZvcm1hdCsrOwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQlQeU9iamVjdCAqdWFyZzsKKyAgICBQeU9iamVjdCAqdWFyZzsKICNlbmRpZgotCQotCXN3aXRjaCAoYykgewotCQotCWNhc2UgJ2InOiB7IC8qIHVuc2lnbmVkIGJ5dGUgLS0gdmVyeSBzaG9ydCBpbnQgKi8KLQkJY2hhciAqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKLQkJbG9uZyBpdmFsOwotCQlpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGI+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpdmFsID0gUHlJbnRfQXNMb25nKGFyZyk7Ci0JCWlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxiPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJZWxzZSBpZiAoaXZhbCA8IDApIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJInVuc2lnbmVkIGJ5dGUgaW50ZWdlciBpcyBsZXNzIHRoYW4gbWluaW11bSIpOwotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Yj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXZhbCA+IFVDSEFSX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkidW5zaWduZWQgYnl0ZSBpbnRlZ2VyIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7Ci0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxiPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJfQotCQllbHNlCi0JCQkqcCA9ICh1bnNpZ25lZCBjaGFyKSBpdmFsOwotCQlicmVhazsKLQl9Ci0JCi0JY2FzZSAnQic6IHsvKiBieXRlIHNpemVkIGJpdGZpZWxkIC0gYm90aCBzaWduZWQgYW5kIHVuc2lnbmVkCi0JCSAgICAgIHZhbHVlcyBhbGxvd2VkICovICAKLQkJY2hhciAqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKLQkJbG9uZyBpdmFsOwotCQlpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEI+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpdmFsID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7Ci0JCWlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxCPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJZWxzZQotCQkJKnAgPSAodW5zaWduZWQgY2hhcikgaXZhbDsKLQkJYnJlYWs7Ci0JfQotCQotCWNhc2UgJ2gnOiB7Lyogc2lnbmVkIHNob3J0IGludCAqLwotCQlzaG9ydCAqcCA9IHZhX2FyZygqcF92YSwgc2hvcnQgKik7Ci0JCWxvbmcgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxoPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzTG9uZyhhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UgaWYgKGl2YWwgPCBTSFJUX01JTikgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkic2lnbmVkIHNob3J0IGludGVnZXIgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWVsc2UgaWYgKGl2YWwgPiBTSFJUX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkic2lnbmVkIHNob3J0IGludGVnZXIgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQl9Ci0JCWVsc2UKLQkJCSpwID0gKHNob3J0KSBpdmFsOwotCQlicmVhazsKLQl9Ci0JCi0JY2FzZSAnSCc6IHsgLyogc2hvcnQgaW50IHNpemVkIGJpdGZpZWxkLCBib3RoIHNpZ25lZCBhbmQKLQkJICAgICAgIHVuc2lnbmVkIGFsbG93ZWQgKi8gCi0JCXVuc2lnbmVkIHNob3J0ICpwID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBzaG9ydCAqKTsKLQkJbG9uZyBpdmFsOwotCQlpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpdmFsID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7Ci0JCWlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxIPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJZWxzZQotCQkJKnAgPSAodW5zaWduZWQgc2hvcnQpIGl2YWw7Ci0JCWJyZWFrOwotCX0KIAotCWNhc2UgJ2knOiB7Lyogc2lnbmVkIGludCAqLwotCQlpbnQgKnAgPSB2YV9hcmcoKnBfdmEsIGludCAqKTsKLQkJbG9uZyBpdmFsOwotCQlpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpdmFsID0gUHlJbnRfQXNMb25nKGFyZyk7Ci0JCWlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxpPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJZWxzZSBpZiAoaXZhbCA+IElOVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJzaWduZWQgaW50ZWdlciBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOwotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXZhbCA8IElOVF9NSU4pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJzaWduZWQgaW50ZWdlciBpcyBsZXNzIHRoYW4gbWluaW11bSIpOwotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkJZWxzZQotCQkJKnAgPSBpdmFsOwotCQlicmVhazsKLQl9CisgICAgc3dpdGNoIChjKSB7CiAKLQljYXNlICdJJzogeyAvKiBpbnQgc2l6ZWQgYml0ZmllbGQsIGJvdGggc2lnbmVkIGFuZAotCQkgICAgICAgdW5zaWduZWQgYWxsb3dlZCAqLyAKLQkJdW5zaWduZWQgaW50ICpwID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBpbnQgKik7Ci0JCXVuc2lnbmVkIGludCBpdmFsOwotCQlpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpdmFsID0gKHVuc2lnbmVkIGludClQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soYXJnKTsKLQkJaWYgKGl2YWwgPT0gKHVuc2lnbmVkIGludCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8ST4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UKLQkJCSpwID0gaXZhbDsKLQkJYnJlYWs7Ci0JfQotCQotCWNhc2UgJ24nOiAvKiBQeV9zc2l6ZV90ICovCisgICAgY2FzZSAnYic6IHsgLyogdW5zaWduZWQgYnl0ZSAtLSB2ZXJ5IHNob3J0IGludCAqLworICAgICAgICBjaGFyICpwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICopOworICAgICAgICBsb25nIGl2YWw7CisgICAgICAgIGlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Yj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGl2YWwgPSBQeUludF9Bc0xvbmcoYXJnKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGI+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlIGlmIChpdmFsIDwgMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAidW5zaWduZWQgYnl0ZSBpbnRlZ2VyIGlzIGxlc3MgdGhhbiBtaW5pbXVtIik7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxiPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdmFsID4gVUNIQVJfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJ1bnNpZ25lZCBieXRlIGludGVnZXIgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGI+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gKHVuc2lnbmVkIGNoYXIpIGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ0InOiB7LyogYnl0ZSBzaXplZCBiaXRmaWVsZCAtIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZAorICAgICAgICAgICAgICAgICAgdmFsdWVzIGFsbG93ZWQgKi8KKyAgICAgICAgY2hhciAqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKKyAgICAgICAgbG9uZyBpdmFsOworICAgICAgICBpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEI+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpdmFsID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7CisgICAgICAgIGlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxCPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnAgPSAodW5zaWduZWQgY2hhcikgaXZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSAnaCc6IHsvKiBzaWduZWQgc2hvcnQgaW50ICovCisgICAgICAgIHNob3J0ICpwID0gdmFfYXJnKCpwX3ZhLCBzaG9ydCAqKTsKKyAgICAgICAgbG9uZyBpdmFsOworICAgICAgICBpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGg+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpdmFsID0gUHlJbnRfQXNMb25nKGFyZyk7CisgICAgICAgIGlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxoPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgZWxzZSBpZiAoaXZhbCA8IFNIUlRfTUlOKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJzaWduZWQgc2hvcnQgaW50ZWdlciBpcyBsZXNzIHRoYW4gbWluaW11bSIpOworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXZhbCA+IFNIUlRfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICJzaWduZWQgc2hvcnQgaW50ZWdlciBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSIpOworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnAgPSAoc2hvcnQpIGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ0gnOiB7IC8qIHNob3J0IGludCBzaXplZCBiaXRmaWVsZCwgYm90aCBzaWduZWQgYW5kCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYWxsb3dlZCAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgc2hvcnQgKik7CisgICAgICAgIGxvbmcgaXZhbDsKKyAgICAgICAgaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxIPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOworICAgICAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8SD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gKHVuc2lnbmVkIHNob3J0KSBpdmFsOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlICdpJzogey8qIHNpZ25lZCBpbnQgKi8KKyAgICAgICAgaW50ICpwID0gdmFfYXJnKCpwX3ZhLCBpbnQgKik7CisgICAgICAgIGxvbmcgaXZhbDsKKyAgICAgICAgaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxpPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaXZhbCA9IFB5SW50X0FzTG9uZyhhcmcpOworICAgICAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8aT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGVsc2UgaWYgKGl2YWwgPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAic2lnbmVkIGludGVnZXIgaXMgZ3JlYXRlciB0aGFuIG1heGltdW0iKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl2YWwgPCBJTlRfTUlOKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAic2lnbmVkIGludGVnZXIgaXMgbGVzcyB0aGFuIG1pbmltdW0iKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gaXZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSAnSSc6IHsgLyogaW50IHNpemVkIGJpdGZpZWxkLCBib3RoIHNpZ25lZCBhbmQKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBhbGxvd2VkICovCisgICAgICAgIHVuc2lnbmVkIGludCAqcCA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgaW50ICopOworICAgICAgICB1bnNpZ25lZCBpbnQgaXZhbDsKKyAgICAgICAgaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxJPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaXZhbCA9ICh1bnNpZ25lZCBpbnQpUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7CisgICAgICAgIGlmIChpdmFsID09ICh1bnNpZ25lZCBpbnQpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPEk+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9IGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ24nOiAvKiBQeV9zc2l6ZV90ICovCiAjaWYgU0laRU9GX1NJWkVfVCAhPSBTSVpFT0ZfTE9ORwotCXsKLQkJUHlfc3NpemVfdCAqcCA9IHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCAqKTsKLQkJUHlfc3NpemVfdCBpdmFsOwotCQlpZiAoZmxvYXRfYXJndW1lbnRfZXJyb3IoYXJnKSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPG4+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlpdmFsID0gUHlJbnRfQXNTc2l6ZV90KGFyZyk7Ci0JCWlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxuPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJKnAgPSBpdmFsOwotCQlicmVhazsKLQl9CisgICAgeworICAgICAgICBQeV9zc2l6ZV90ICpwID0gdmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90ICopOworICAgICAgICBQeV9zc2l6ZV90IGl2YWw7CisgICAgICAgIGlmIChmbG9hdF9hcmd1bWVudF9lcnJvcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bj4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGl2YWwgPSBQeUludF9Bc1NzaXplX3QoYXJnKTsKKyAgICAgICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPG4+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAqcCA9IGl2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KICNlbmRpZgotCS8qIEZhbGwgdGhyb3VnaCBmcm9tICduJyB0byAnbCcgaWYgUHlfc3NpemVfdCBpcyBpbnQgKi8KLQljYXNlICdsJzogey8qIGxvbmcgaW50ICovCi0JCWxvbmcgKnAgPSB2YV9hcmcoKnBfdmEsIGxvbmcgKik7Ci0JCWxvbmcgaXZhbDsKLQkJaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCi0JCQlyZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxsPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaXZhbCA9IFB5SW50X0FzTG9uZyhhcmcpOwotCQlpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UKLQkJCSpwID0gaXZhbDsKLQkJYnJlYWs7Ci0JfQorICAgIC8qIEZhbGwgdGhyb3VnaCBmcm9tICduJyB0byAnbCcgaWYgUHlfc3NpemVfdCBpcyBpbnQgKi8KKyAgICBjYXNlICdsJzogey8qIGxvbmcgaW50ICovCisgICAgICAgIGxvbmcgKnAgPSB2YV9hcmcoKnBfdmEsIGxvbmcgKik7CisgICAgICAgIGxvbmcgaXZhbDsKKyAgICAgICAgaWYgKGZsb2F0X2FyZ3VtZW50X2Vycm9yKGFyZykpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxsPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgaXZhbCA9IFB5SW50X0FzTG9uZyhhcmcpOworICAgICAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8bD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gaXZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JY2FzZSAnayc6IHsgLyogbG9uZyBzaXplZCBiaXRmaWVsZCAqLwotCQl1bnNpZ25lZCBsb25nICpwID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBsb25nICopOwotCQl1bnNpZ25lZCBsb25nIGl2YWw7Ci0JCWlmIChQeUludF9DaGVjayhhcmcpKQotCQkJaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOwotCQllbHNlIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkKLQkJCWl2YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7Ci0JCWVsc2UKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJpbnRlZ2VyPGs+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkqcCA9IGl2YWw7Ci0JCWJyZWFrOwotCX0KLQkKKyAgICBjYXNlICdrJzogeyAvKiBsb25nIHNpemVkIGJpdGZpZWxkICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgKnAgPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIGxvbmcgKik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgaXZhbDsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKGFyZykpCisgICAgICAgICAgICBpdmFsID0gUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKGFyZyk7CisgICAgICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVjayhhcmcpKQorICAgICAgICAgICAgaXZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soYXJnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8az4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICpwID0gaXZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQljYXNlICdMJzogey8qIFBZX0xPTkdfTE9ORyAqLwotCQlQWV9MT05HX0xPTkcgKnAgPSB2YV9hcmcoICpwX3ZhLCBQWV9MT05HX0xPTkcgKiApOwotCQlQWV9MT05HX0xPTkcgaXZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKCBhcmcgKTsKLQkJaWYgKGl2YWwgPT0gKFBZX0xPTkdfTE9ORyktMSAmJiBQeUVycl9PY2N1cnJlZCgpICkgewotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImxvbmc8TD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkqcCA9IGl2YWw7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorICAgIGNhc2UgJ0wnOiB7LyogUFlfTE9OR19MT05HICovCisgICAgICAgIFBZX0xPTkdfTE9ORyAqcCA9IHZhX2FyZyggKnBfdmEsIFBZX0xPTkdfTE9ORyAqICk7CisgICAgICAgIFBZX0xPTkdfTE9ORyBpdmFsID0gUHlMb25nX0FzTG9uZ0xvbmcoIGFyZyApOworICAgICAgICBpZiAoaXZhbCA9PSAoUFlfTE9OR19MT05HKS0xICYmIFB5RXJyX09jY3VycmVkKCkgKSB7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigibG9uZzxMPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwID0gaXZhbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CiAKLQljYXNlICdLJzogeyAvKiBsb25nIGxvbmcgc2l6ZWQgYml0ZmllbGQgKi8KLQkJdW5zaWduZWQgUFlfTE9OR19MT05HICpwID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKik7Ci0JCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyBpdmFsOwotCQlpZiAoUHlJbnRfQ2hlY2soYXJnKSkKLQkJCWl2YWwgPSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soYXJnKTsKLQkJZWxzZSBpZiAoUHlMb25nX0NoZWNrKGFyZykpCi0JCQlpdmFsID0gUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soYXJnKTsKLQkJZWxzZQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImludGVnZXI8Sz4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCSpwID0gaXZhbDsKLQkJYnJlYWs7Ci0JfQorICAgIGNhc2UgJ0snOiB7IC8qIGxvbmcgbG9uZyBzaXplZCBiaXRmaWVsZCAqLworICAgICAgICB1bnNpZ25lZCBQWV9MT05HX0xPTkcgKnAgPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyAqKTsKKyAgICAgICAgdW5zaWduZWQgUFlfTE9OR19MT05HIGl2YWw7CisgICAgICAgIGlmIChQeUludF9DaGVjayhhcmcpKQorICAgICAgICAgICAgaXZhbCA9IFB5SW50X0FzVW5zaWduZWRMb25nTWFzayhhcmcpOworICAgICAgICBlbHNlIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgIGl2YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzayhhcmcpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiaW50ZWdlcjxLPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgKnAgPSBpdmFsOworICAgICAgICBicmVhazsKKyAgICB9CiAjZW5kaWYKLQkKLQljYXNlICdmJzogey8qIGZsb2F0ICovCi0JCWZsb2F0ICpwID0gdmFfYXJnKCpwX3ZhLCBmbG9hdCAqKTsKLQkJZG91YmxlIGR2YWwgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoImZsb2F0PGY+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQllbHNlCi0JCQkqcCA9IChmbG9hdCkgZHZhbDsKLQkJYnJlYWs7Ci0JfQotCQotCWNhc2UgJ2QnOiB7LyogZG91YmxlICovCi0JCWRvdWJsZSAqcCA9IHZhX2FyZygqcF92YSwgZG91YmxlICopOwotCQlkb3VibGUgZHZhbCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gY29udmVydGVycigiZmxvYXQ8ZD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWVsc2UKLQkJCSpwID0gZHZhbDsKLQkJYnJlYWs7Ci0JfQotCQorCisgICAgY2FzZSAnZic6IHsvKiBmbG9hdCAqLworICAgICAgICBmbG9hdCAqcCA9IHZhX2FyZygqcF92YSwgZmxvYXQgKik7CisgICAgICAgIGRvdWJsZSBkdmFsID0gUHlGbG9hdF9Bc0RvdWJsZShhcmcpOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJmbG9hdDxmPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKnAgPSAoZmxvYXQpIGR2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ2QnOiB7LyogZG91YmxlICovCisgICAgICAgIGRvdWJsZSAqcCA9IHZhX2FyZygqcF92YSwgZG91YmxlICopOworICAgICAgICBkb3VibGUgZHZhbCA9IFB5RmxvYXRfQXNEb3VibGUoYXJnKTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiZmxvYXQ8ZD4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpwID0gZHZhbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCWNhc2UgJ0QnOiB7LyogY29tcGxleCBkb3VibGUgKi8KLQkJUHlfY29tcGxleCAqcCA9IHZhX2FyZygqcF92YSwgUHlfY29tcGxleCAqKTsKLQkJUHlfY29tcGxleCBjdmFsOwotCQljdmFsID0gUHlDb21wbGV4X0FzQ0NvbXBsZXgoYXJnKTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gY29udmVydGVycigiY29tcGxleDxEPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJZWxzZQotCQkJKnAgPSBjdmFsOwotCQlicmVhazsKLQl9CisgICAgY2FzZSAnRCc6IHsvKiBjb21wbGV4IGRvdWJsZSAqLworICAgICAgICBQeV9jb21wbGV4ICpwID0gdmFfYXJnKCpwX3ZhLCBQeV9jb21wbGV4ICopOworICAgICAgICBQeV9jb21wbGV4IGN2YWw7CisgICAgICAgIGN2YWwgPSBQeUNvbXBsZXhfQXNDQ29tcGxleChhcmcpOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJjb21wbGV4PEQ+IiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqcCA9IGN2YWw7CisgICAgICAgIGJyZWFrOworICAgIH0KICNlbmRpZiAvKiBXSVRIT1VUX0NPTVBMRVggKi8KLQkKLQljYXNlICdjJzogey8qIGNoYXIgKi8KLQkJY2hhciAqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKLQkJaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykgJiYgUHlTdHJpbmdfU2l6ZShhcmcpID09IDEpCi0JCQkqcCA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpWzBdOwotCQllbHNlCi0JCQlyZXR1cm4gY29udmVydGVycigiY2hhciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJYnJlYWs7Ci0JfQotCQotCWNhc2UgJ3MnOiB7Lyogc3RyaW5nICovCi0JCWlmICgqZm9ybWF0ID09ICcqJykgewotCQkJUHlfYnVmZmVyICpwID0gKFB5X2J1ZmZlciAqKXZhX2FyZygqcF92YSwgUHlfYnVmZmVyICopOwogCi0JCQlpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotCQkJCVB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywKLQkJCQkJCSAgUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKGFyZyksCi0JCQkJCQkgIDEsIDApOwotCQkJfQotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7Ci0JCQkJdWFyZyA9IFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpOwotCQkJCWlmICh1YXJnID09IE5VTEwpCi0JCQkJCXJldHVybiBjb252ZXJ0ZXJyKENPTlZfVU5JQ09ERSwKLQkJCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQlQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBhcmcsCi0JCQkJCQkgIFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKSwgUHlTdHJpbmdfR0VUX1NJWkUodWFyZyksCi0JCQkJCQkgIDEsIDApOwotCQkJfQotI2VuZGlmCi0JCQllbHNlIHsgLyogYW55IGJ1ZmZlci1saWtlIG9iamVjdCAqLwotCQkJCWNoYXIgKmJ1ZjsKLQkJCQlpZiAoZ2V0YnVmZmVyKGFyZywgcCwgJmJ1ZikgPCAwKQotCQkJCQlyZXR1cm4gY29udmVydGVycihidWYsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWlmIChhZGRjbGVhbnVwKHAsIGZyZWVsaXN0LCBjbGVhbnVwX2J1ZmZlcikpIHsKLQkJCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkJIihjbGVhbnVwIHByb2JsZW0pIiwKLQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJfQotCQkJZm9ybWF0Kys7Ci0JCX0gZWxzZSBpZiAoKmZvcm1hdCA9PSAnIycpIHsKLQkJCXZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJCUZFVENIX1NJWkU7Ci0JCQkKLQkJCWlmIChQeVN0cmluZ19DaGVjayhhcmcpKSB7Ci0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKLQkJCQlTVE9SRV9TSVpFKFB5U3RyaW5nX0dFVF9TSVpFKGFyZykpOwotCQkJfQotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7Ci0JCQkJdWFyZyA9IFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpOwotCQkJCWlmICh1YXJnID09IE5VTEwpCi0JCQkJCXJldHVybiBjb252ZXJ0ZXJyKENPTlZfVU5JQ09ERSwKLQkJCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQkqcCA9IFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKTsKLQkJCQlTVE9SRV9TSVpFKFB5U3RyaW5nX0dFVF9TSVpFKHVhcmcpKTsKLQkJCX0KLSNlbmRpZgotCQkJZWxzZSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KLQkJCQljaGFyICpidWY7Ci0JCQkJUHlfc3NpemVfdCBjb3VudCA9IGNvbnZlcnRidWZmZXIoYXJnLCBwLCAmYnVmKTsKLQkJCQlpZiAoY291bnQgPCAwKQotCQkJCQlyZXR1cm4gY29udmVydGVycihidWYsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQlTVE9SRV9TSVpFKGNvdW50KTsKLQkJCX0KLQkJCWZvcm1hdCsrOwotCQl9IGVsc2UgewotCQkJY2hhciAqKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOwotCQkJCi0JCQlpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkKLQkJCQkqcCA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpOwotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7Ci0JCQkJdWFyZyA9IFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpOwotCQkJCWlmICh1YXJnID09IE5VTEwpCi0JCQkJCXJldHVybiBjb252ZXJ0ZXJyKENPTlZfVU5JQ09ERSwKLQkJCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQkqcCA9IFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKTsKLQkJCX0KLSNlbmRpZgotCQkJZWxzZQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmciLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQlpZiAoKFB5X3NzaXplX3Qpc3RybGVuKCpwKSAhPSBQeVN0cmluZ19TaXplKGFyZykpCi0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoInN0cmluZyB3aXRob3V0IG51bGwgYnl0ZXMiLAotCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorICAgIGNhc2UgJ2MnOiB7LyogY2hhciAqLworICAgICAgICBjaGFyICpwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICopOworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSAmJiBQeVN0cmluZ19TaXplKGFyZykgPT0gMSkKKyAgICAgICAgICAgICpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZylbMF07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJjaGFyIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBicmVhazsKKyAgICB9CiAKLQljYXNlICd6Jzogey8qIHN0cmluZywgbWF5IGJlIE5VTEwgKE5vbmUpICovCi0JCWlmICgqZm9ybWF0ID09ICcqJykgewotCQkJUHlfYnVmZmVyICpwID0gKFB5X2J1ZmZlciAqKXZhX2FyZygqcF92YSwgUHlfYnVmZmVyICopOworICAgIGNhc2UgJ3MnOiB7Lyogc3RyaW5nICovCisgICAgICAgIGlmICgqZm9ybWF0ID09ICcqJykgeworICAgICAgICAgICAgUHlfYnVmZmVyICpwID0gKFB5X2J1ZmZlciAqKXZhX2FyZygqcF92YSwgUHlfYnVmZmVyICopOwogCi0JCQlpZiAoYXJnID09IFB5X05vbmUpCi0JCQkJUHlCdWZmZXJfRmlsbEluZm8ocCwgTlVMTCwgTlVMTCwgMCwgMSwgMCk7Ci0JCQllbHNlIGlmIChQeVN0cmluZ19DaGVjayhhcmcpKSB7Ci0JCQkJUHlCdWZmZXJfRmlsbEluZm8ocCwgYXJnLAotCQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcoYXJnKSwgUHlTdHJpbmdfR0VUX1NJWkUoYXJnKSwKLQkJCQkJCSAgMSwgMCk7Ci0JCQl9CisgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgIFB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYXJnKSwgUHlTdHJpbmdfR0VUX1NJWkUoYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwKTsKKyAgICAgICAgICAgIH0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJCXVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKLQkJCQlpZiAodWFyZyA9PSBOVUxMKQotCQkJCQlyZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCi0JCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJUHlCdWZmZXJfRmlsbEluZm8ocCwgYXJnLAotCQkJCQkJICBQeVN0cmluZ19BU19TVFJJTkcodWFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKHVhcmcpLAotCQkJCQkJICAxLCAwKTsKLQkJCX0KKyAgICAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICAgICAgdWFyZyA9IFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpOworICAgICAgICAgICAgICAgIGlmICh1YXJnID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKENPTlZfVU5JQ09ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgICAgIFB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcodWFyZyksIFB5U3RyaW5nX0dFVF9TSVpFKHVhcmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDApOworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQllbHNlIHsgLyogYW55IGJ1ZmZlci1saWtlIG9iamVjdCAqLwotCQkJCWNoYXIgKmJ1ZjsKLQkJCQlpZiAoZ2V0YnVmZmVyKGFyZywgcCwgJmJ1ZikgPCAwKQotCQkJCQlyZXR1cm4gY29udmVydGVycihidWYsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWlmIChhZGRjbGVhbnVwKHAsIGZyZWVsaXN0LCBjbGVhbnVwX2J1ZmZlcikpIHsKLQkJCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkJIihjbGVhbnVwIHByb2JsZW0pIiwKLQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJfQotCQkJZm9ybWF0Kys7Ci0JCX0gZWxzZSBpZiAoKmZvcm1hdCA9PSAnIycpIHsgLyogYW55IGJ1ZmZlci1saWtlIG9iamVjdCAqLwotCQkJdm9pZCAqKnAgPSAodm9pZCAqKil2YV9hcmcoKnBfdmEsIGNoYXIgKiopOwotCQkJRkVUQ0hfU0laRTsKLQkJCQotCQkJaWYgKGFyZyA9PSBQeV9Ob25lKSB7Ci0JCQkJKnAgPSAwOwotCQkJCVNUT1JFX1NJWkUoMCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChQeVN0cmluZ19DaGVjayhhcmcpKSB7Ci0JCQkJKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKLQkJCQlTVE9SRV9TSVpFKFB5U3RyaW5nX0dFVF9TSVpFKGFyZykpOwotCQkJfQotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7Ci0JCQkJdWFyZyA9IFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpOwotCQkJCWlmICh1YXJnID09IE5VTEwpCi0JCQkJCXJldHVybiBjb252ZXJ0ZXJyKENPTlZfVU5JQ09ERSwKLQkJCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQkqcCA9IFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKTsKLQkJCQlTVE9SRV9TSVpFKFB5U3RyaW5nX0dFVF9TSVpFKHVhcmcpKTsKLQkJCX0KLSNlbmRpZgotCQkJZWxzZSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KLQkJCQljaGFyICpidWY7Ci0JCQkJUHlfc3NpemVfdCBjb3VudCA9IGNvbnZlcnRidWZmZXIoYXJnLCBwLCAmYnVmKTsKLQkJCQlpZiAoY291bnQgPCAwKQotCQkJCQlyZXR1cm4gY29udmVydGVycihidWYsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQlTVE9SRV9TSVpFKGNvdW50KTsKLQkJCX0KLQkJCWZvcm1hdCsrOwotCQl9IGVsc2UgewotCQkJY2hhciAqKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOwotCQkJCi0JCQlpZiAoYXJnID09IFB5X05vbmUpCi0JCQkJKnAgPSAwOwotCQkJZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkKLQkJCQkqcCA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpOwotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7Ci0JCQkJdWFyZyA9IFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpOwotCQkJCWlmICh1YXJnID09IE5VTEwpCi0JCQkJCXJldHVybiBjb252ZXJ0ZXJyKENPTlZfVU5JQ09ERSwKLQkJCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQkqcCA9IFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKTsKLQkJCX0KLSNlbmRpZgotCQkJZWxzZQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmcgb3IgTm9uZSIsIAotCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQlpZiAoKmZvcm1hdCA9PSAnIycpIHsKLQkJCQlGRVRDSF9TSVpFOwotCQkJCWFzc2VydCgwKTsgLyogWFhYIHJlZHVuZGFudCB3aXRoIGlmLWNhc2UgKi8KLQkJCQlpZiAoYXJnID09IFB5X05vbmUpCi0JCQkJCSpxID0gMDsKLQkJCQllbHNlCi0JCQkJCSpxID0gUHlTdHJpbmdfU2l6ZShhcmcpOwotCQkJCWZvcm1hdCsrOwotCQkJfQotCQkJZWxzZSBpZiAoKnAgIT0gTlVMTCAmJgotCQkJCSAoUHlfc3NpemVfdClzdHJsZW4oKnApICE9IFB5U3RyaW5nX1NpemUoYXJnKSkKLQkJCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkJInN0cmluZyB3aXRob3V0IG51bGwgYnl0ZXMgb3IgTm9uZSIsIAotCQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCQotCWNhc2UgJ2UnOiB7LyogZW5jb2RlZCBzdHJpbmcgKi8KLQkJY2hhciAqKmJ1ZmZlcjsKLQkJY29uc3QgY2hhciAqZW5jb2Rpbmc7Ci0JCVB5T2JqZWN0ICpzOwotCQlQeV9zc2l6ZV90IHNpemU7Ci0JCWludCByZWNvZGVfc3RyaW5nczsKKyAgICAgICAgICAgIGVsc2UgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCisgICAgICAgICAgICAgICAgY2hhciAqYnVmOworICAgICAgICAgICAgICAgIGlmIChnZXRidWZmZXIoYXJnLCBwLCAmYnVmKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKGJ1ZiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZGNsZWFudXAocCwgZnJlZWxpc3QsIGNsZWFudXBfYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAiKGNsZWFudXAgcHJvYmxlbSkiLAorICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfSBlbHNlIGlmICgqZm9ybWF0ID09ICcjJykgeworICAgICAgICAgICAgdm9pZCAqKnAgPSAodm9pZCAqKil2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworICAgICAgICAgICAgRkVUQ0hfU0laRTsKIAotCQkvKiBHZXQgJ2UnIHBhcmFtZXRlcjogdGhlIGVuY29kaW5nIG5hbWUgKi8KLQkJZW5jb2RpbmcgPSAoY29uc3QgY2hhciAqKXZhX2FyZygqcF92YSwgY29uc3QgY2hhciAqKTsKKyAgICAgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhhcmcpKSB7CisgICAgICAgICAgICAgICAgKnAgPSBQeVN0cmluZ19BU19TVFJJTkcoYXJnKTsKKyAgICAgICAgICAgICAgICBTVE9SRV9TSVpFKFB5U3RyaW5nX0dFVF9TSVpFKGFyZykpOworICAgICAgICAgICAgfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJaWYgKGVuY29kaW5nID09IE5VTEwpCi0JCQllbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICAgICAgdWFyZyA9IFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpOworICAgICAgICAgICAgICAgIGlmICh1YXJnID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKENPTlZfVU5JQ09ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgICAgICpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHVhcmcpOworICAgICAgICAgICAgICAgIFNUT1JFX1NJWkUoUHlTdHJpbmdfR0VUX1NJWkUodWFyZykpOworICAgICAgICAgICAgfQogI2VuZGlmCi0JCQkKLQkJLyogR2V0IG91dHB1dCBidWZmZXIgcGFyYW1ldGVyOgotCQkgICAncycgKHJlY29kZSBhbGwgb2JqZWN0cyB2aWEgVW5pY29kZSkgb3IKLQkJICAgJ3QnIChvbmx5IHJlY29kZSBub24tc3RyaW5nIG9iamVjdHMpIAotCQkqLwotCQlpZiAoKmZvcm1hdCA9PSAncycpCi0JCQlyZWNvZGVfc3RyaW5ncyA9IDE7Ci0JCWVsc2UgaWYgKCpmb3JtYXQgPT0gJ3QnKQotCQkJcmVjb2RlX3N0cmluZ3MgPSAwOwotCQllbHNlCi0JCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkiKHVua25vd24gcGFyc2VyIG1hcmtlciBjb21iaW5hdGlvbikiLAotCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJYnVmZmVyID0gKGNoYXIgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJZm9ybWF0Kys7Ci0JCWlmIChidWZmZXIgPT0gTlVMTCkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCIoYnVmZmVyIGlzIE5VTEwpIiwgCi0JCQkJCSAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJCi0JCS8qIEVuY29kZSBvYmplY3QgKi8KLQkJaWYgKCFyZWNvZGVfc3RyaW5ncyAmJiBQeVN0cmluZ19DaGVjayhhcmcpKSB7Ci0JCQlzID0gYXJnOwotCQkJUHlfSU5DUkVGKHMpOwotCQl9Ci0JCWVsc2UgewotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJICAgIAlQeU9iamVjdCAqdTsKKyAgICAgICAgICAgIGVsc2UgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCisgICAgICAgICAgICAgICAgY2hhciAqYnVmOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgU1RPUkVfU0laRShjb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKipwID0gdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKIAotCQkJLyogQ29udmVydCBvYmplY3QgdG8gVW5pY29kZSAqLwotCQkJdSA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGFyZyk7Ci0JCQlpZiAodSA9PSBOVUxMKQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkic3RyaW5nIG9yIHVuaWNvZGUgb3IgdGV4dCBidWZmZXIiLCAKLQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJCi0JCQkvKiBFbmNvZGUgb2JqZWN0OyB1c2UgZGVmYXVsdCBlcnJvciBoYW5kbGluZyAqLwotCQkJcyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwKLQkJCQkJCSAgICAgIGVuY29kaW5nLAotCQkJCQkJICAgICAgTlVMTCk7Ci0JCQlQeV9ERUNSRUYodSk7Ci0JCQlpZiAocyA9PSBOVUxMKQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCIoZW5jb2RpbmcgZmFpbGVkKSIsCi0JCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCWlmICghUHlTdHJpbmdfQ2hlY2socykpIHsKLQkJCQlQeV9ERUNSRUYocyk7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCSIoZW5jb2RlciBmYWlsZWQgdG8gcmV0dXJuIGEgc3RyaW5nKSIsCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhhcmcpKQorICAgICAgICAgICAgICAgICpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyk7CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorICAgICAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKKyAgICAgICAgICAgICAgICB1YXJnID0gVU5JQ09ERV9ERUZBVUxUX0VOQ09ESU5HKGFyZyk7CisgICAgICAgICAgICAgICAgaWYgKHVhcmcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoQ09OVl9VTklDT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgKnAgPSBQeVN0cmluZ19BU19TVFJJTkcodWFyZyk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigic3RyaW5nIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgaWYgKChQeV9zc2l6ZV90KXN0cmxlbigqcCkgIT0gUHlTdHJpbmdfU2l6ZShhcmcpKQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmcgd2l0aG91dCBudWxsIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSAneic6IHsvKiBzdHJpbmcsIG1heSBiZSBOVUxMIChOb25lKSAqLworICAgICAgICBpZiAoKmZvcm1hdCA9PSAnKicpIHsKKyAgICAgICAgICAgIFB5X2J1ZmZlciAqcCA9IChQeV9idWZmZXIgKil2YV9hcmcoKnBfdmEsIFB5X2J1ZmZlciAqKTsKKworICAgICAgICAgICAgaWYgKGFyZyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgIFB5QnVmZmVyX0ZpbGxJbmZvKHAsIE5VTEwsIE5VTEwsIDAsIDEsIDApOworICAgICAgICAgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgIFB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoYXJnKSwgUHlTdHJpbmdfR0VUX1NJWkUoYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgIHVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodWFyZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9GaWxsSW5mbyhwLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHVhcmcpLCBQeVN0cmluZ19HRVRfU0laRSh1YXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgZWxzZSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KKyAgICAgICAgICAgICAgICBjaGFyICpidWY7CisgICAgICAgICAgICAgICAgaWYgKGdldGJ1ZmZlcihhcmcsIHAsICZidWYpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkY2xlYW51cChwLCBmcmVlbGlzdCwgY2xlYW51cF9idWZmZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgICAgICIoY2xlYW51cCBwcm9ibGVtKSIsCisgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICB9IGVsc2UgaWYgKCpmb3JtYXQgPT0gJyMnKSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KKyAgICAgICAgICAgIHZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKKyAgICAgICAgICAgIEZFVENIX1NJWkU7CisKKyAgICAgICAgICAgIGlmIChhcmcgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgICpwID0gMDsKKyAgICAgICAgICAgICAgICBTVE9SRV9TSVpFKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgICpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKGFyZyk7CisgICAgICAgICAgICAgICAgU1RPUkVfU0laRShQeVN0cmluZ19HRVRfU0laRShhcmcpKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgICAgIHVhcmcgPSBVTklDT0RFX0RFRkFVTFRfRU5DT0RJTkcoYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAodWFyZyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihDT05WX1VOSUNPREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyh1YXJnKTsKKyAgICAgICAgICAgICAgICBTVE9SRV9TSVpFKFB5U3RyaW5nX0dFVF9TSVpFKHVhcmcpKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgZWxzZSB7IC8qIGFueSBidWZmZXItbGlrZSBvYmplY3QgKi8KKyAgICAgICAgICAgICAgICBjaGFyICpidWY7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBjb3VudCA9IGNvbnZlcnRidWZmZXIoYXJnLCBwLCAmYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihidWYsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICBTVE9SRV9TSVpFKGNvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciAqKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworCisgICAgICAgICAgICBpZiAoYXJnID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgKnAgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgICAgICAqcCA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpOworI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKKyAgICAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICAgICAgdWFyZyA9IFVOSUNPREVfREVGQVVMVF9FTkNPRElORyhhcmcpOworICAgICAgICAgICAgICAgIGlmICh1YXJnID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKENPTlZfVU5JQ09ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgICAgICpwID0gUHlTdHJpbmdfQVNfU1RSSU5HKHVhcmcpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoInN0cmluZyBvciBOb25lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICBGRVRDSF9TSVpFOworICAgICAgICAgICAgICAgIGFzc2VydCgwKTsgLyogWFhYIHJlZHVuZGFudCB3aXRoIGlmLWNhc2UgKi8KKyAgICAgICAgICAgICAgICBpZiAoYXJnID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgICAgICpxID0gMDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpxID0gUHlTdHJpbmdfU2l6ZShhcmcpOworICAgICAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKnAgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3Qpc3RybGVuKCpwKSAhPSBQeVN0cmluZ19TaXplKGFyZykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgICAgICJzdHJpbmcgd2l0aG91dCBudWxsIGJ5dGVzIG9yIE5vbmUiLAorICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSAnZSc6IHsvKiBlbmNvZGVkIHN0cmluZyAqLworICAgICAgICBjaGFyICoqYnVmZmVyOworICAgICAgICBjb25zdCBjaGFyICplbmNvZGluZzsKKyAgICAgICAgUHlPYmplY3QgKnM7CisgICAgICAgIFB5X3NzaXplX3Qgc2l6ZTsKKyAgICAgICAgaW50IHJlY29kZV9zdHJpbmdzOworCisgICAgICAgIC8qIEdldCAnZScgcGFyYW1ldGVyOiB0aGUgZW5jb2RpbmcgbmFtZSAqLworICAgICAgICBlbmNvZGluZyA9IChjb25zdCBjaGFyICopdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOworI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKKyAgICAgICAgaWYgKGVuY29kaW5nID09IE5VTEwpCisgICAgICAgICAgICBlbmNvZGluZyA9IFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKTsKKyNlbmRpZgorCisgICAgICAgIC8qIEdldCBvdXRwdXQgYnVmZmVyIHBhcmFtZXRlcjoKKyAgICAgICAgICAgJ3MnIChyZWNvZGUgYWxsIG9iamVjdHMgdmlhIFVuaWNvZGUpIG9yCisgICAgICAgICAgICd0JyAob25seSByZWNvZGUgbm9uLXN0cmluZyBvYmplY3RzKQorICAgICAgICAqLworICAgICAgICBpZiAoKmZvcm1hdCA9PSAncycpCisgICAgICAgICAgICByZWNvZGVfc3RyaW5ncyA9IDE7CisgICAgICAgIGVsc2UgaWYgKCpmb3JtYXQgPT0gJ3QnKQorICAgICAgICAgICAgcmVjb2RlX3N0cmluZ3MgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAiKHVua25vd24gcGFyc2VyIG1hcmtlciBjb21iaW5hdGlvbikiLAorICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgYnVmZmVyID0gKGNoYXIgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKKyAgICAgICAgZm9ybWF0Kys7CisgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIoYnVmZmVyIGlzIE5VTEwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKworICAgICAgICAvKiBFbmNvZGUgb2JqZWN0ICovCisgICAgICAgIGlmICghcmVjb2RlX3N0cmluZ3MgJiYgUHlTdHJpbmdfQ2hlY2soYXJnKSkgeworICAgICAgICAgICAgcyA9IGFyZzsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgICAgICAgICAgICBQeU9iamVjdCAqdTsKKworICAgICAgICAgICAgLyogQ29udmVydCBvYmplY3QgdG8gVW5pY29kZSAqLworICAgICAgICAgICAgdSA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGFyZyk7CisgICAgICAgICAgICBpZiAodSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAic3RyaW5nIG9yIHVuaWNvZGUgb3IgdGV4dCBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisKKyAgICAgICAgICAgIC8qIEVuY29kZSBvYmplY3Q7IHVzZSBkZWZhdWx0IGVycm9yIGhhbmRsaW5nICovCisgICAgICAgICAgICBzID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoIihlbmNvZGluZyBmYWlsZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoIVB5U3RyaW5nX0NoZWNrKHMpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAiKGVuY29kZXIgZmFpbGVkIHRvIHJldHVybiBhIHN0cmluZykiLAorICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CiAjZWxzZQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoInN0cmluZzxlPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJzdHJpbmc8ZT4iLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAjZW5kaWYKLQkJfQotCQlzaXplID0gUHlTdHJpbmdfR0VUX1NJWkUocyk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHMpOwogCi0JCS8qIFdyaXRlIG91dHB1dDsgb3V0cHV0IGlzIGd1YXJhbnRlZWQgdG8gYmUgMC10ZXJtaW5hdGVkICovCi0JCWlmICgqZm9ybWF0ID09ICcjJykgeyAKLQkJCS8qIFVzaW5nIGJ1ZmZlciBsZW5ndGggcGFyYW1ldGVyICcjJzoKLQkJCQkgICAKLQkJCSAgIC0gaWYgKmJ1ZmZlciBpcyBOVUxMLCBhIG5ldyBidWZmZXIgb2YgdGhlCi0JCQkgICBuZWVkZWQgc2l6ZSBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBkYXRhCi0JCQkgICBjb3BpZWQgaW50byBpdDsgKmJ1ZmZlciBpcyB1cGRhdGVkIHRvIHBvaW50Ci0JCQkgICB0byB0aGUgbmV3IGJ1ZmZlcjsgdGhlIGNhbGxlciBpcwotCQkJICAgcmVzcG9uc2libGUgZm9yIFB5TWVtX0ZyZWUoKWluZyBpdCBhZnRlcgotCQkJICAgdXNhZ2UgCisgICAgICAgIC8qIFdyaXRlIG91dHB1dDsgb3V0cHV0IGlzIGd1YXJhbnRlZWQgdG8gYmUgMC10ZXJtaW5hdGVkICovCisgICAgICAgIGlmICgqZm9ybWF0ID09ICcjJykgeworICAgICAgICAgICAgLyogVXNpbmcgYnVmZmVyIGxlbmd0aCBwYXJhbWV0ZXIgJyMnOgogCi0JCQkgICAtIGlmICpidWZmZXIgaXMgbm90IE5VTEwsIHRoZSBkYXRhIGlzCi0JCQkgICBjb3BpZWQgdG8gKmJ1ZmZlcjsgKmJ1ZmZlcl9sZW4gaGFzIHRvIGJlCi0JCQkgICBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBvbiBpbnB1dDsKLQkJCSAgIGJ1ZmZlciBvdmVyZmxvdyBpcyBzaWduYWxsZWQgd2l0aCBhbiBlcnJvcjsKLQkJCSAgIGJ1ZmZlciBoYXMgdG8gcHJvdmlkZSBlbm91Z2ggcm9vbSBmb3IgdGhlCi0JCQkgICBlbmNvZGVkIHN0cmluZyBwbHVzIHRoZSB0cmFpbGluZyAwLWJ5dGUKLQkJCSAgIAotCQkJICAgLSBpbiBib3RoIGNhc2VzLCAqYnVmZmVyX2xlbiBpcyB1cGRhdGVkIHRvCi0JCQkgICB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIC9leGNsdWRpbmcvIHRoZQotCQkJICAgdHJhaWxpbmcgMC1ieXRlIAotCQkJICAgCi0JCQkqLwotCQkJRkVUQ0hfU0laRTsKKyAgICAgICAgICAgICAgIC0gaWYgKmJ1ZmZlciBpcyBOVUxMLCBhIG5ldyBidWZmZXIgb2YgdGhlCisgICAgICAgICAgICAgICBuZWVkZWQgc2l6ZSBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBkYXRhCisgICAgICAgICAgICAgICBjb3BpZWQgaW50byBpdDsgKmJ1ZmZlciBpcyB1cGRhdGVkIHRvIHBvaW50CisgICAgICAgICAgICAgICB0byB0aGUgbmV3IGJ1ZmZlcjsgdGhlIGNhbGxlciBpcworICAgICAgICAgICAgICAgcmVzcG9uc2libGUgZm9yIFB5TWVtX0ZyZWUoKWluZyBpdCBhZnRlcgorICAgICAgICAgICAgICAgdXNhZ2UKIAotCQkJZm9ybWF0Kys7Ci0JCQlpZiAocSA9PSBOVUxMICYmIHEyID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYocyk7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCSIoYnVmZmVyX2xlbiBpcyBOVUxMKSIsCi0JCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWlmICgqYnVmZmVyID09IE5VTEwpIHsKLQkJCQkqYnVmZmVyID0gUHlNZW1fTkVXKGNoYXIsIHNpemUgKyAxKTsKLQkJCQlpZiAoKmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJCVB5X0RFQ1JFRihzKTsKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCQkiKG1lbW9yeSBlcnJvcikiLAotCQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJCX0KLQkJCQlpZiAoYWRkY2xlYW51cCgqYnVmZmVyLCBmcmVlbGlzdCwgY2xlYW51cF9wdHIpKSB7Ci0JCQkJCVB5X0RFQ1JFRihzKTsKLQkJCQkJcmV0dXJuIGNvbnZlcnRlcnIoCi0JCQkJCQkiKGNsZWFudXAgcHJvYmxlbSkiLAotCQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHNpemUgKyAxID4gQlVGRkVSX0xFTikgewotCQkJCQlQeV9ERUNSRUYocyk7Ci0JCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkJIihidWZmZXIgb3ZlcmZsb3cpIiwgCi0JCQkJCQlhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQkJfQotCQkJfQotCQkJbWVtY3B5KCpidWZmZXIsCi0JCQkgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHMpLAotCQkJICAgICAgIHNpemUgKyAxKTsKLQkJCVNUT1JFX1NJWkUoc2l6ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBVc2luZyBhIDAtdGVybWluYXRlZCBidWZmZXI6Ci0JCQkJICAgCi0JCQkgICAtIHRoZSBlbmNvZGVkIHN0cmluZyBoYXMgdG8gYmUgMC10ZXJtaW5hdGVkCi0JCQkgICBmb3IgdGhpcyB2YXJpYW50IHRvIHdvcms7IGlmIGl0IGlzIG5vdCwgYW4KLQkJCSAgIGVycm9yIHJhaXNlZCAKKyAgICAgICAgICAgICAgIC0gaWYgKmJ1ZmZlciBpcyBub3QgTlVMTCwgdGhlIGRhdGEgaXMKKyAgICAgICAgICAgICAgIGNvcGllZCB0byAqYnVmZmVyOyAqYnVmZmVyX2xlbiBoYXMgdG8gYmUKKyAgICAgICAgICAgICAgIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIG9uIGlucHV0OworICAgICAgICAgICAgICAgYnVmZmVyIG92ZXJmbG93IGlzIHNpZ25hbGxlZCB3aXRoIGFuIGVycm9yOworICAgICAgICAgICAgICAgYnVmZmVyIGhhcyB0byBwcm92aWRlIGVub3VnaCByb29tIGZvciB0aGUKKyAgICAgICAgICAgICAgIGVuY29kZWQgc3RyaW5nIHBsdXMgdGhlIHRyYWlsaW5nIDAtYnl0ZQogCi0JCQkgICAtIGEgbmV3IGJ1ZmZlciBvZiB0aGUgbmVlZGVkIHNpemUgaXMKLQkJCSAgIGFsbG9jYXRlZCBhbmQgdGhlIGRhdGEgY29waWVkIGludG8gaXQ7Ci0JCQkgICAqYnVmZmVyIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5ldwotCQkJICAgYnVmZmVyOyB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgotCQkJICAgUHlNZW1fRnJlZSgpaW5nIGl0IGFmdGVyIHVzYWdlCisgICAgICAgICAgICAgICAtIGluIGJvdGggY2FzZXMsICpidWZmZXJfbGVuIGlzIHVwZGF0ZWQgdG8KKyAgICAgICAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgL2V4Y2x1ZGluZy8gdGhlCisgICAgICAgICAgICAgICB0cmFpbGluZyAwLWJ5dGUKIAotCQkJKi8KLQkJCWlmICgoUHlfc3NpemVfdClzdHJsZW4oUHlTdHJpbmdfQVNfU1RSSU5HKHMpKQotCQkJCQkJCQkhPSBzaXplKSB7Ci0JCQkJUHlfREVDUkVGKHMpOwotCQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCQkiZW5jb2RlZCBzdHJpbmcgd2l0aG91dCBOVUxMIGJ5dGVzIiwKLQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJfQotCQkJKmJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBzaXplICsgMSk7Ci0JCQlpZiAoKmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKHMpOwotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCIobWVtb3J5IGVycm9yKSIsCi0JCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWlmIChhZGRjbGVhbnVwKCpidWZmZXIsIGZyZWVsaXN0LCBjbGVhbnVwX3B0cikpIHsKLQkJCQlQeV9ERUNSRUYocyk7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoIihjbGVhbnVwIHByb2JsZW0pIiwKLQkJCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCW1lbWNweSgqYnVmZmVyLAotCQkJICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzKSwKLQkJCSAgICAgICBzaXplICsgMSk7Ci0JCX0KLQkJUHlfREVDUkVGKHMpOwotCQlicmVhazsKLQl9CisgICAgICAgICAgICAqLworICAgICAgICAgICAgRkVUQ0hfU0laRTsKKworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICBpZiAocSA9PSBOVUxMICYmIHEyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgICAgICIoYnVmZmVyX2xlbiBpcyBOVUxMKSIsCisgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gUHlNZW1fTkVXKGNoYXIsIHNpemUgKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgICAgICAgICAiKG1lbW9yeSBlcnJvcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYWRkY2xlYW51cCgqYnVmZmVyLCBmcmVlbGlzdCwgY2xlYW51cF9wdHIpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgICAgICAgICAiKGNsZWFudXAgcHJvYmxlbSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgKyAxID4gQlVGRkVSX0xFTikgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICAgICAgICAgIihidWZmZXIgb3ZlcmZsb3cpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocyksCisgICAgICAgICAgICAgICAgICAgc2l6ZSArIDEpOworICAgICAgICAgICAgU1RPUkVfU0laRShzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFVzaW5nIGEgMC10ZXJtaW5hdGVkIGJ1ZmZlcjoKKworICAgICAgICAgICAgICAgLSB0aGUgZW5jb2RlZCBzdHJpbmcgaGFzIHRvIGJlIDAtdGVybWluYXRlZAorICAgICAgICAgICAgICAgZm9yIHRoaXMgdmFyaWFudCB0byB3b3JrOyBpZiBpdCBpcyBub3QsIGFuCisgICAgICAgICAgICAgICBlcnJvciByYWlzZWQKKworICAgICAgICAgICAgICAgLSBhIG5ldyBidWZmZXIgb2YgdGhlIG5lZWRlZCBzaXplIGlzCisgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYW5kIHRoZSBkYXRhIGNvcGllZCBpbnRvIGl0OworICAgICAgICAgICAgICAgKmJ1ZmZlciBpcyB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBuZXcKKyAgICAgICAgICAgICAgIGJ1ZmZlcjsgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUoKWluZyBpdCBhZnRlciB1c2FnZQorCisgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKChQeV9zc2l6ZV90KXN0cmxlbihQeVN0cmluZ19BU19TVFJJTkcocykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gc2l6ZSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAgICAgImVuY29kZWQgc3RyaW5nIHdpdGhvdXQgTlVMTCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgc2l6ZSArIDEpOworICAgICAgICAgICAgaWYgKCpidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiKG1lbW9yeSBlcnJvcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRjbGVhbnVwKCpidWZmZXIsIGZyZWVsaXN0LCBjbGVhbnVwX3B0cikpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoIihjbGVhbnVwIHByb2JsZW0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KCpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHMpLAorICAgICAgICAgICAgICAgICAgIHNpemUgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgIGJyZWFrOworICAgIH0KIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQljYXNlICd1Jzogey8qIHJhdyB1bmljb2RlIGJ1ZmZlciAoUHlfVU5JQ09ERSAqKSAqLwotCQlpZiAoKmZvcm1hdCA9PSAnIycpIHsgLyogYW55IGJ1ZmZlci1saWtlIG9iamVjdCAqLwotCQkJdm9pZCAqKnAgPSAodm9pZCAqKil2YV9hcmcoKnBfdmEsIGNoYXIgKiopOwotCQkJRkVUQ0hfU0laRTsKLQkJCWlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotCQkJICAgIAkqcCA9IFB5VW5pY29kZV9BU19VTklDT0RFKGFyZyk7Ci0JCQkJU1RPUkVfU0laRShQeVVuaWNvZGVfR0VUX1NJWkUoYXJnKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gY29udmVydGVycigiY2Fubm90IGNvbnZlcnQgcmF3IGJ1ZmZlcnMiLAotCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQl9Ci0JCQlmb3JtYXQrKzsKLQkJfSBlbHNlIHsKLQkJCVB5X1VOSUNPREUgKipwID0gdmFfYXJnKCpwX3ZhLCBQeV9VTklDT0RFICoqKTsKLQkJCWlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkKLQkJCQkqcCA9IFB5VW5pY29kZV9BU19VTklDT0RFKGFyZyk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGNvbnZlcnRlcnIoInVuaWNvZGUiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorICAgIGNhc2UgJ3UnOiB7LyogcmF3IHVuaWNvZGUgYnVmZmVyIChQeV9VTklDT0RFICopICovCisgICAgICAgIGlmICgqZm9ybWF0ID09ICcjJykgeyAvKiBhbnkgYnVmZmVyLWxpa2Ugb2JqZWN0ICovCisgICAgICAgICAgICB2b2lkICoqcCA9ICh2b2lkICoqKXZhX2FyZygqcF92YSwgY2hhciAqKik7CisgICAgICAgICAgICBGRVRDSF9TSVpFOworICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CisgICAgICAgICAgICAgICAgKnAgPSBQeVVuaWNvZGVfQVNfVU5JQ09ERShhcmcpOworICAgICAgICAgICAgICAgIFNUT1JFX1NJWkUoUHlVbmljb2RlX0dFVF9TSVpFKGFyZykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImNhbm5vdCBjb252ZXJ0IHJhdyBidWZmZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5X1VOSUNPREUgKipwID0gdmFfYXJnKCpwX3ZhLCBQeV9VTklDT0RFICoqKTsKKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkKKyAgICAgICAgICAgICAgICAqcCA9IFB5VW5pY29kZV9BU19VTklDT0RFKGFyZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoInVuaWNvZGUiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQogI2VuZGlmCiAKLQljYXNlICdTJzogeyAvKiBzdHJpbmcgb2JqZWN0ICovCi0JCVB5T2JqZWN0ICoqcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQlpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkKLQkJCSpwID0gYXJnOwotCQllbHNlCi0JCQlyZXR1cm4gY29udmVydGVycigic3RyaW5nIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQlicmVhazsKLQl9Ci0JCisgICAgY2FzZSAnUyc6IHsgLyogc3RyaW5nIG9iamVjdCAqLworICAgICAgICBQeU9iamVjdCAqKnAgPSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKGFyZykpCisgICAgICAgICAgICAqcCA9IGFyZzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoInN0cmluZyIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWNhc2UgJ1UnOiB7IC8qIFVuaWNvZGUgb2JqZWN0ICovCi0JCVB5T2JqZWN0ICoqcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQlpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpCi0JCQkqcCA9IGFyZzsKLQkJZWxzZQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoInVuaWNvZGUiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWJyZWFrOwotCX0KKyAgICBjYXNlICdVJzogeyAvKiBVbmljb2RlIG9iamVjdCAqLworICAgICAgICBQeU9iamVjdCAqKnAgPSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKQorICAgICAgICAgICAgKnAgPSBhcmc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJ1bmljb2RlIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBicmVhazsKKyAgICB9CiAjZW5kaWYKLQkKLQljYXNlICdPJzogeyAvKiBvYmplY3QgKi8KLQkJUHlUeXBlT2JqZWN0ICp0eXBlOwotCQlQeU9iamVjdCAqKnA7Ci0JCWlmICgqZm9ybWF0ID09ICchJykgewotCQkJdHlwZSA9IHZhX2FyZygqcF92YSwgUHlUeXBlT2JqZWN0Kik7Ci0JCQlwID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7Ci0JCQlmb3JtYXQrKzsKLQkJCWlmIChQeVR5cGVfSXNTdWJ0eXBlKGFyZy0+b2JfdHlwZSwgdHlwZSkpCi0JCQkJKnAgPSBhcmc7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGNvbnZlcnRlcnIodHlwZS0+dHBfbmFtZSwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogCi0JCX0KLQkJZWxzZSBpZiAoKmZvcm1hdCA9PSAnPycpIHsKLQkJCWlucXVpcnkgcHJlZCA9IHZhX2FyZygqcF92YSwgaW5xdWlyeSk7Ci0JCQlwID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7Ci0JCQlmb3JtYXQrKzsKLQkJCWlmICgoKnByZWQpKGFyZykpIAotCQkJCSpwID0gYXJnOwotCQkJZWxzZQotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCIodW5zcGVjaWZpZWQpIiwgCi0JCQkJCQkgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCQkKLQkJfQotCQllbHNlIGlmICgqZm9ybWF0ID09ICcmJykgewotCQkJdHlwZWRlZiBpbnQgKCpjb252ZXJ0ZXIpKFB5T2JqZWN0ICosIHZvaWQgKik7Ci0JCQljb252ZXJ0ZXIgY29udmVydCA9IHZhX2FyZygqcF92YSwgY29udmVydGVyKTsKLQkJCXZvaWQgKmFkZHIgPSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7Ci0JCQlmb3JtYXQrKzsKLQkJCWlmICghICgqY29udmVydCkoYXJnLCBhZGRyKSkKLQkJCQlyZXR1cm4gY29udmVydGVycigiKHVuc3BlY2lmaWVkKSIsIAotCQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7Ci0JCQkqcCA9IGFyZzsKLQkJfQotCQlicmVhazsKLQl9Ci0JCQotCQkKLQljYXNlICd3JzogeyAvKiBtZW1vcnkgYnVmZmVyLCByZWFkLXdyaXRlIGFjY2VzcyAqLwotCQl2b2lkICoqcCA9IHZhX2FyZygqcF92YSwgdm9pZCAqKik7Ci0JCXZvaWQgKnJlczsKLQkJUHlCdWZmZXJQcm9jcyAqcGIgPSBhcmctPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKLQkJUHlfc3NpemVfdCBjb3VudDsKKyAgICBjYXNlICdPJzogeyAvKiBvYmplY3QgKi8KKyAgICAgICAgUHlUeXBlT2JqZWN0ICp0eXBlOworICAgICAgICBQeU9iamVjdCAqKnA7CisgICAgICAgIGlmICgqZm9ybWF0ID09ICchJykgeworICAgICAgICAgICAgdHlwZSA9IHZhX2FyZygqcF92YSwgUHlUeXBlT2JqZWN0Kik7CisgICAgICAgICAgICBwID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKGFyZy0+b2JfdHlwZSwgdHlwZSkpCisgICAgICAgICAgICAgICAgKnAgPSBhcmc7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIodHlwZS0+dHBfbmFtZSwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogCi0JCWlmIChwYiAmJiBwYi0+YmZfcmVsZWFzZWJ1ZmZlciAmJiAqZm9ybWF0ICE9ICcqJykKLQkJCS8qIEJ1ZmZlciBtdXN0IGJlIHJlbGVhc2VkLCB5ZXQgY2FsbGVyIGRvZXMgbm90IHVzZQotCQkJICAgdGhlIFB5X2J1ZmZlciBwcm90b2NvbC4gKi8KLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJwaW5uZWQgYnVmZmVyIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCpmb3JtYXQgPT0gJz8nKSB7CisgICAgICAgICAgICBpbnF1aXJ5IHByZWQgPSB2YV9hcmcoKnBfdmEsIGlucXVpcnkpOworICAgICAgICAgICAgcCA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICBpZiAoKCpwcmVkKShhcmcpKQorICAgICAgICAgICAgICAgICpwID0gYXJnOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIodW5zcGVjaWZpZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAKLQkJaWYgKHBiICYmIHBiLT5iZl9nZXRidWZmZXIgJiYgKmZvcm1hdCA9PSAnKicpIHsKLQkJCS8qIENhbGxlciBpcyBpbnRlcmVzdGVkIGluIFB5X2J1ZmZlciwgYW5kIHRoZSBvYmplY3QKLQkJCSAgIHN1cHBvcnRzIGl0IGRpcmVjdGx5LiAqLwotCQkJZm9ybWF0Kys7Ci0JCQlpZiAocGItPmJmX2dldGJ1ZmZlcihhcmcsIChQeV9idWZmZXIqKXAsIFB5QlVGX1dSSVRBQkxFKSA8IDApIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCXJldHVybiBjb252ZXJ0ZXJyKCJyZWFkLXdyaXRlIGJ1ZmZlciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJCX0KLQkJCWlmIChhZGRjbGVhbnVwKHAsIGZyZWVsaXN0LCBjbGVhbnVwX2J1ZmZlcikpIHsKLQkJCQlyZXR1cm4gY29udmVydGVycigKLQkJCQkJIihjbGVhbnVwIHByb2JsZW0pIiwKLQkJCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCQkJfQotCQkJaWYgKCFQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoKFB5X2J1ZmZlciopcCwgJ0MnKSkKLQkJCQlyZXR1cm4gY29udmVydGVycigiY29udGlndW91cyBidWZmZXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCQlicmVhazsKLQkJfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCpmb3JtYXQgPT0gJyYnKSB7CisgICAgICAgICAgICB0eXBlZGVmIGludCAoKmNvbnZlcnRlcikoUHlPYmplY3QgKiwgdm9pZCAqKTsKKyAgICAgICAgICAgIGNvbnZlcnRlciBjb252ZXJ0ID0gdmFfYXJnKCpwX3ZhLCBjb252ZXJ0ZXIpOworICAgICAgICAgICAgdm9pZCAqYWRkciA9IHZhX2FyZygqcF92YSwgdm9pZCAqKTsKKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgaWYgKCEgKCpjb252ZXJ0KShhcmcsIGFkZHIpKQorICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIodW5zcGVjaWZpZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwID0gdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7CisgICAgICAgICAgICAqcCA9IGFyZzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CiAKLQkJaWYgKHBiID09IE5VTEwgfHwKLQkJICAgIHBiLT5iZl9nZXR3cml0ZWJ1ZmZlciA9PSBOVUxMIHx8Ci0JCSAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKCJyZWFkLXdyaXRlIGJ1ZmZlciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaWYgKCgqcGItPmJmX2dldHNlZ2NvdW50KShhcmcsIE5VTEwpICE9IDEpCi0JCQlyZXR1cm4gY29udmVydGVycigic2luZ2xlLXNlZ21lbnQgcmVhZC13cml0ZSBidWZmZXIiLCAKLQkJCQkJICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWlmICgoY291bnQgPSBwYi0+YmZfZ2V0d3JpdGVidWZmZXIoYXJnLCAwLCAmcmVzKSkgPCAwKQotCQkJcmV0dXJuIGNvbnZlcnRlcnIoIih1bnNwZWNpZmllZCkiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0JCWlmICgqZm9ybWF0ID09ICcqJykgewotCQkJUHlCdWZmZXJfRmlsbEluZm8oKFB5X2J1ZmZlciopcCwgYXJnLCByZXMsIGNvdW50LCAxLCAwKTsKLQkJCWZvcm1hdCsrOwotCQl9Ci0JCWVsc2UgewotCQkJKnAgPSByZXM7Ci0JCQlpZiAoKmZvcm1hdCA9PSAnIycpIHsKLQkJCQlGRVRDSF9TSVpFOwotCQkJCVNUT1JFX1NJWkUoY291bnQpOwotCQkJCWZvcm1hdCsrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQkJCi0JY2FzZSAndCc6IHsgLyogOC1iaXQgY2hhcmFjdGVyIGJ1ZmZlciwgcmVhZC1vbmx5IGFjY2VzcyAqLwotCQljaGFyICoqcCA9IHZhX2FyZygqcF92YSwgY2hhciAqKik7Ci0JCVB5QnVmZmVyUHJvY3MgKnBiID0gYXJnLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JCVB5X3NzaXplX3QgY291bnQ7Ci0JCQotCQlpZiAoKmZvcm1hdCsrICE9ICcjJykKLQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCSJpbnZhbGlkIHVzZSBvZiAndCcgZm9ybWF0IGNoYXJhY3RlciIsIAotCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJaWYgKCFQeVR5cGVfSGFzRmVhdHVyZShhcmctPm9iX3R5cGUsCi0JCQkJICAgICAgIFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSKSB8fAotCQkgICAgcGIgPT0gTlVMTCB8fCBwYi0+YmZfZ2V0Y2hhcmJ1ZmZlciA9PSBOVUxMIHx8Ci0JCSAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCSJzdHJpbmcgb3IgcmVhZC1vbmx5IGNoYXJhY3RlciBidWZmZXIiLAotCQkJCWFyZywgbXNnYnVmLCBidWZzaXplKTsKIAotCQlpZiAocGItPmJmX2dldHNlZ2NvdW50KGFyZywgTlVMTCkgIT0gMSkKLQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCSJzdHJpbmcgb3Igc2luZ2xlLXNlZ21lbnQgcmVhZC1vbmx5IGJ1ZmZlciIsCi0JCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgIGNhc2UgJ3cnOiB7IC8qIG1lbW9yeSBidWZmZXIsIHJlYWQtd3JpdGUgYWNjZXNzICovCisgICAgICAgIHZvaWQgKipwID0gdmFfYXJnKCpwX3ZhLCB2b2lkICoqKTsKKyAgICAgICAgdm9pZCAqcmVzOworICAgICAgICBQeUJ1ZmZlclByb2NzICpwYiA9IGFyZy0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgICAgICBQeV9zc2l6ZV90IGNvdW50OwogCi0JCWlmIChwYi0+YmZfcmVsZWFzZWJ1ZmZlcikKLQkJCXJldHVybiBjb252ZXJ0ZXJyKAotCQkJCSJzdHJpbmcgb3IgcGlubmVkIGJ1ZmZlciIsCi0JCQkJYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpZiAocGIgJiYgcGItPmJmX3JlbGVhc2VidWZmZXIgJiYgKmZvcm1hdCAhPSAnKicpCisgICAgICAgICAgICAvKiBCdWZmZXIgbXVzdCBiZSByZWxlYXNlZCwgeWV0IGNhbGxlciBkb2VzIG5vdCB1c2UKKyAgICAgICAgICAgICAgIHRoZSBQeV9idWZmZXIgcHJvdG9jb2wuICovCisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigicGlubmVkIGJ1ZmZlciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKIAotCQljb3VudCA9IHBiLT5iZl9nZXRjaGFyYnVmZmVyKGFyZywgMCwgcCk7Ci0JCWlmIChjb3VudCA8IDApCi0JCQlyZXR1cm4gY29udmVydGVycigiKHVuc3BlY2lmaWVkKSIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkJewotCQkJRkVUQ0hfU0laRTsKLQkJCVNUT1JFX1NJWkUoY291bnQpOwotCQl9Ci0JCWJyZWFrOwotCX0KKyAgICAgICAgaWYgKHBiICYmIHBiLT5iZl9nZXRidWZmZXIgJiYgKmZvcm1hdCA9PSAnKicpIHsKKyAgICAgICAgICAgIC8qIENhbGxlciBpcyBpbnRlcmVzdGVkIGluIFB5X2J1ZmZlciwgYW5kIHRoZSBvYmplY3QKKyAgICAgICAgICAgICAgIHN1cHBvcnRzIGl0IGRpcmVjdGx5LiAqLworICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICBpZiAocGItPmJmX2dldGJ1ZmZlcihhcmcsIChQeV9idWZmZXIqKXAsIFB5QlVGX1dSSVRBQkxFKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJyZWFkLXdyaXRlIGJ1ZmZlciIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRjbGVhbnVwKHAsIGZyZWVsaXN0LCBjbGVhbnVwX2J1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICAgICAgIihjbGVhbnVwIHByb2JsZW0pIiwKKyAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXMoKFB5X2J1ZmZlciopcCwgJ0MnKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiY29udGlndW91cyBidWZmZXIiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JZGVmYXVsdDoKLQkJcmV0dXJuIGNvbnZlcnRlcnIoImltcG9zc2libGU8YmFkIGZvcm1hdCBjaGFyPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLQkKLQl9Ci0JCi0JKnBfZm9ybWF0ID0gZm9ybWF0OwotCXJldHVybiBOVUxMOworICAgICAgICBpZiAocGIgPT0gTlVMTCB8fAorICAgICAgICAgICAgcGItPmJmX2dldHdyaXRlYnVmZmVyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBiLT5iZl9nZXRzZWdjb3VudCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoInJlYWQtd3JpdGUgYnVmZmVyIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICBpZiAoKCpwYi0+YmZfZ2V0c2VnY291bnQpKGFyZywgTlVMTCkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCJzaW5nbGUtc2VnbWVudCByZWFkLXdyaXRlIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGlmICgoY291bnQgPSBwYi0+YmZfZ2V0d3JpdGVidWZmZXIoYXJnLCAwLCAmcmVzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoIih1bnNwZWNpZmllZCkiLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGlmICgqZm9ybWF0ID09ICcqJykgeworICAgICAgICAgICAgUHlCdWZmZXJfRmlsbEluZm8oKFB5X2J1ZmZlciopcCwgYXJnLCByZXMsIGNvdW50LCAxLCAwKTsKKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgKnAgPSByZXM7CisgICAgICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICBGRVRDSF9TSVpFOworICAgICAgICAgICAgICAgIFNUT1JFX1NJWkUoY291bnQpOworICAgICAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgJ3QnOiB7IC8qIDgtYml0IGNoYXJhY3RlciBidWZmZXIsIHJlYWQtb25seSBhY2Nlc3MgKi8KKyAgICAgICAgY2hhciAqKnAgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKiopOworICAgICAgICBQeUJ1ZmZlclByb2NzICpwYiA9IGFyZy0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgICAgICBQeV9zc2l6ZV90IGNvdW50OworCisgICAgICAgIGlmICgqZm9ybWF0KysgIT0gJyMnKQorICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgImludmFsaWQgdXNlIG9mICd0JyBmb3JtYXQgY2hhcmFjdGVyIiwKKyAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIGlmICghUHlUeXBlX0hhc0ZlYXR1cmUoYXJnLT5vYl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSKSB8fAorICAgICAgICAgICAgcGIgPT0gTlVMTCB8fCBwYi0+YmZfZ2V0Y2hhcmJ1ZmZlciA9PSBOVUxMIHx8CisgICAgICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICJzdHJpbmcgb3IgcmVhZC1vbmx5IGNoYXJhY3RlciBidWZmZXIiLAorICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKworICAgICAgICBpZiAocGItPmJmX2dldHNlZ2NvdW50KGFyZywgTlVMTCkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICJzdHJpbmcgb3Igc2luZ2xlLXNlZ21lbnQgcmVhZC1vbmx5IGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworCisgICAgICAgIGlmIChwYi0+YmZfcmVsZWFzZWJ1ZmZlcikKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAorICAgICAgICAgICAgICAgICJzdHJpbmcgb3IgcGlubmVkIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworCisgICAgICAgIGNvdW50ID0gcGItPmJmX2dldGNoYXJidWZmZXIoYXJnLCAwLCBwKTsKKyAgICAgICAgaWYgKGNvdW50IDwgMCkKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIodW5zcGVjaWZpZWQpIiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB7CisgICAgICAgICAgICBGRVRDSF9TSVpFOworICAgICAgICAgICAgU1RPUkVfU0laRShjb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoImltcG9zc2libGU8YmFkIGZvcm1hdCBjaGFyPiIsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKKworICAgIH0KKworICAgICpwX2Zvcm1hdCA9IGZvcm1hdDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKIGNvbnZlcnRidWZmZXIoUHlPYmplY3QgKmFyZywgdm9pZCAqKnAsIGNoYXIgKiplcnJtc2cpCiB7Ci0JUHlCdWZmZXJQcm9jcyAqcGIgPSBhcmctPm9iX3R5cGUtPnRwX2FzX2J1ZmZlcjsKLQlQeV9zc2l6ZV90IGNvdW50OwotCWlmIChwYiA9PSBOVUxMIHx8Ci0JICAgIHBiLT5iZl9nZXRyZWFkYnVmZmVyID09IE5VTEwgfHwKLQkgICAgcGItPmJmX2dldHNlZ2NvdW50ID09IE5VTEwgfHwKLQkgICAgcGItPmJmX3JlbGVhc2VidWZmZXIgIT0gTlVMTCkgewotCQkqZXJybXNnID0gInN0cmluZyBvciByZWFkLW9ubHkgYnVmZmVyIjsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKCpwYi0+YmZfZ2V0c2VnY291bnQpKGFyZywgTlVMTCkgIT0gMSkgewotCQkqZXJybXNnID0gInN0cmluZyBvciBzaW5nbGUtc2VnbWVudCByZWFkLW9ubHkgYnVmZmVyIjsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKGNvdW50ID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikoYXJnLCAwLCBwKSkgPCAwKSB7Ci0JCSplcnJtc2cgPSAiKHVuc3BlY2lmaWVkKSI7Ci0JfQotCXJldHVybiBjb3VudDsKKyAgICBQeUJ1ZmZlclByb2NzICpwYiA9IGFyZy0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOworICAgIFB5X3NzaXplX3QgY291bnQ7CisgICAgaWYgKHBiID09IE5VTEwgfHwKKyAgICAgICAgcGItPmJmX2dldHJlYWRidWZmZXIgPT0gTlVMTCB8fAorICAgICAgICBwYi0+YmZfZ2V0c2VnY291bnQgPT0gTlVMTCB8fAorICAgICAgICBwYi0+YmZfcmVsZWFzZWJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICplcnJtc2cgPSAic3RyaW5nIG9yIHJlYWQtb25seSBidWZmZXIiOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoKnBiLT5iZl9nZXRzZWdjb3VudCkoYXJnLCBOVUxMKSAhPSAxKSB7CisgICAgICAgICplcnJtc2cgPSAic3RyaW5nIG9yIHNpbmdsZS1zZWdtZW50IHJlYWQtb25seSBidWZmZXIiOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoY291bnQgPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKShhcmcsIDAsIHApKSA8IDApIHsKKyAgICAgICAgKmVycm1zZyA9ICIodW5zcGVjaWZpZWQpIjsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgaW50CiBnZXRidWZmZXIoUHlPYmplY3QgKmFyZywgUHlfYnVmZmVyICp2aWV3LCBjaGFyICoqZXJybXNnKQogewotCXZvaWQgKmJ1ZjsKLQlQeV9zc2l6ZV90IGNvdW50OwotCVB5QnVmZmVyUHJvY3MgKnBiID0gYXJnLT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JaWYgKHBiID09IE5VTEwpIHsKLQkJKmVycm1zZyA9ICJzdHJpbmcgb3IgYnVmZmVyIjsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocGItPmJmX2dldGJ1ZmZlcikgewotCQlpZiAocGItPmJmX2dldGJ1ZmZlcihhcmcsIHZpZXcsIDApIDwgMCkgewotCQkJKmVycm1zZyA9ICJjb252ZXJ0aWJsZSB0byBhIGJ1ZmZlciI7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKCFQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXModmlldywgJ0MnKSkgewotCQkJKmVycm1zZyA9ICJjb250aWd1b3VzIGJ1ZmZlciI7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQorICAgIHZvaWQgKmJ1ZjsKKyAgICBQeV9zc2l6ZV90IGNvdW50OworICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gYXJnLT5vYl90eXBlLT50cF9hc19idWZmZXI7CisgICAgaWYgKHBiID09IE5VTEwpIHsKKyAgICAgICAgKmVycm1zZyA9ICJzdHJpbmcgb3IgYnVmZmVyIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocGItPmJmX2dldGJ1ZmZlcikgeworICAgICAgICBpZiAocGItPmJmX2dldGJ1ZmZlcihhcmcsIHZpZXcsIDApIDwgMCkgeworICAgICAgICAgICAgKmVycm1zZyA9ICJjb252ZXJ0aWJsZSB0byBhIGJ1ZmZlciI7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeUJ1ZmZlcl9Jc0NvbnRpZ3VvdXModmlldywgJ0MnKSkgeworICAgICAgICAgICAgKmVycm1zZyA9ICJjb250aWd1b3VzIGJ1ZmZlciI7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgJmJ1ZiwgZXJybXNnKTsKLQlpZiAoY291bnQgPCAwKSB7Ci0JCSplcnJtc2cgPSAiY29udmVydGlibGUgdG8gYSBidWZmZXIiOwotCQlyZXR1cm4gY291bnQ7Ci0JfQotCVB5QnVmZmVyX0ZpbGxJbmZvKHZpZXcsIE5VTEwsIGJ1ZiwgY291bnQsIDEsIDApOwotCXJldHVybiAwOworICAgIGNvdW50ID0gY29udmVydGJ1ZmZlcihhcmcsICZidWYsIGVycm1zZyk7CisgICAgaWYgKGNvdW50IDwgMCkgeworICAgICAgICAqZXJybXNnID0gImNvbnZlcnRpYmxlIHRvIGEgYnVmZmVyIjsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKyAgICBQeUJ1ZmZlcl9GaWxsSW5mbyh2aWV3LCBOVUxMLCBidWYsIGNvdW50LCAxLCAwKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgZG9uYXRlZCBieQpAQCAtMTM3NCw0OTcgKzEzNzQsNDk3IEBACiAvKiBSZXR1cm4gZmFsc2UgKDApIGZvciBlcnJvciwgZWxzZSB0cnVlLiAqLwogaW50CiBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKmFyZ3MsCi0JCQkgICAgUHlPYmplY3QgKmtleXdvcmRzLAotCQkJICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgCi0JCQkgICAgY2hhciAqKmt3bGlzdCwgLi4uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmt3bGlzdCwgLi4uKQogewotCWludCByZXR2YWw7Ci0JdmFfbGlzdCB2YTsKKyAgICBpbnQgcmV0dmFsOworICAgIHZhX2xpc3QgdmE7CiAKLQlpZiAoKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSkgfHwKLQkgICAgKGtleXdvcmRzICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrZXl3b3JkcykpIHx8Ci0JICAgIGZvcm1hdCA9PSBOVUxMIHx8Ci0JICAgIGt3bGlzdCA9PSBOVUxMKQotCXsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSkgfHwKKyAgICAgICAgKGtleXdvcmRzICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrZXl3b3JkcykpIHx8CisgICAgICAgIGZvcm1hdCA9PSBOVUxMIHx8CisgICAgICAgIGt3bGlzdCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXZhX3N0YXJ0KHZhLCBrd2xpc3QpOwotCXJldHZhbCA9IHZnZXRhcmdza2V5d29yZHMoYXJncywga2V5d29yZHMsIGZvcm1hdCwga3dsaXN0LCAmdmEsIDApOwkKLQl2YV9lbmQodmEpOwotCXJldHVybiByZXR2YWw7CisgICAgdmFfc3RhcnQodmEsIGt3bGlzdCk7CisgICAgcmV0dmFsID0gdmdldGFyZ3NrZXl3b3JkcyhhcmdzLCBrZXl3b3JkcywgZm9ybWF0LCBrd2xpc3QsICZ2YSwgMCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBpbnQKIF9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsCi0JCQkJICBQeU9iamVjdCAqa2V5d29yZHMsCi0JCQkJICBjb25zdCBjaGFyICpmb3JtYXQsIAotCQkJCSAgY2hhciAqKmt3bGlzdCwgLi4uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmt3bGlzdCwgLi4uKQogewotCWludCByZXR2YWw7Ci0JdmFfbGlzdCB2YTsKKyAgICBpbnQgcmV0dmFsOworICAgIHZhX2xpc3QgdmE7CiAKLQlpZiAoKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSkgfHwKLQkgICAgKGtleXdvcmRzICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrZXl3b3JkcykpIHx8Ci0JICAgIGZvcm1hdCA9PSBOVUxMIHx8Ci0JICAgIGt3bGlzdCA9PSBOVUxMKQotCXsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoKGFyZ3MgPT0gTlVMTCB8fCAhUHlUdXBsZV9DaGVjayhhcmdzKSkgfHwKKyAgICAgICAgKGtleXdvcmRzICE9IE5VTEwgJiYgIVB5RGljdF9DaGVjayhrZXl3b3JkcykpIHx8CisgICAgICAgIGZvcm1hdCA9PSBOVUxMIHx8CisgICAgICAgIGt3bGlzdCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXZhX3N0YXJ0KHZhLCBrd2xpc3QpOwotCXJldHZhbCA9IHZnZXRhcmdza2V5d29yZHMoYXJncywga2V5d29yZHMsIGZvcm1hdCwgCi0JCQkJICBrd2xpc3QsICZ2YSwgRkxBR19TSVpFX1QpOwotCXZhX2VuZCh2YSk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICB2YV9zdGFydCh2YSwga3dsaXN0KTsKKyAgICByZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZ2YSwgRkxBR19TSVpFX1QpOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogCiBpbnQKIFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICphcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleXdvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiprd2xpc3QsIHZhX2xpc3QgdmEpCiB7Ci0JaW50IHJldHZhbDsKLQl2YV9saXN0IGx2YTsKKyAgICBpbnQgcmV0dmFsOworICAgIHZhX2xpc3QgbHZhOwogCi0JaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8Ci0JICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAotCSAgICBmb3JtYXQgPT0gTlVMTCB8fAotCSAgICBrd2xpc3QgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8CisgICAgICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAorICAgICAgICBmb3JtYXQgPT0gTlVMTCB8fAorICAgICAgICBrd2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICNpZmRlZiBWQV9MSVNUX0lTX0FSUkFZCi0JbWVtY3B5KGx2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CisgICAgbWVtY3B5KGx2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CiAjZWxzZQogI2lmZGVmIF9fdmFfY29weQotCV9fdmFfY29weShsdmEsIHZhKTsKKyAgICBfX3ZhX2NvcHkobHZhLCB2YSk7CiAjZWxzZQotCWx2YSA9IHZhOworICAgIGx2YSA9IHZhOwogI2VuZGlmCiAjZW5kaWYKIAotCXJldHZhbCA9IHZnZXRhcmdza2V5d29yZHMoYXJncywga2V5d29yZHMsIGZvcm1hdCwga3dsaXN0LCAmbHZhLCAwKTsJCi0JcmV0dXJuIHJldHZhbDsKKyAgICByZXR2YWwgPSB2Z2V0YXJnc2tleXdvcmRzKGFyZ3MsIGtleXdvcmRzLCBmb3JtYXQsIGt3bGlzdCwgJmx2YSwgMCk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogaW50CiBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsCi0JCQkJICAgIFB5T2JqZWN0ICprZXl3b3JkcywKLQkJCQkgICAgY29uc3QgY2hhciAqZm9ybWF0LCAKLQkJCQkgICAgY2hhciAqKmt3bGlzdCwgdmFfbGlzdCB2YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICprZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiprd2xpc3QsIHZhX2xpc3QgdmEpCiB7Ci0JaW50IHJldHZhbDsKLQl2YV9saXN0IGx2YTsKKyAgICBpbnQgcmV0dmFsOworICAgIHZhX2xpc3QgbHZhOwogCi0JaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8Ci0JICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAotCSAgICBmb3JtYXQgPT0gTlVMTCB8fAotCSAgICBrd2xpc3QgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKChhcmdzID09IE5VTEwgfHwgIVB5VHVwbGVfQ2hlY2soYXJncykpIHx8CisgICAgICAgIChrZXl3b3JkcyAhPSBOVUxMICYmICFQeURpY3RfQ2hlY2soa2V5d29yZHMpKSB8fAorICAgICAgICBmb3JtYXQgPT0gTlVMTCB8fAorICAgICAgICBrd2xpc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICNpZmRlZiBWQV9MSVNUX0lTX0FSUkFZCi0JbWVtY3B5KGx2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CisgICAgbWVtY3B5KGx2YSwgdmEsIHNpemVvZih2YV9saXN0KSk7CiAjZWxzZQogI2lmZGVmIF9fdmFfY29weQotCV9fdmFfY29weShsdmEsIHZhKTsKKyAgICBfX3ZhX2NvcHkobHZhLCB2YSk7CiAjZWxzZQotCWx2YSA9IHZhOworICAgIGx2YSA9IHZhOwogI2VuZGlmCiAjZW5kaWYKIAotCXJldHZhbCA9IHZnZXRhcmdza2V5d29yZHMoYXJncywga2V5d29yZHMsIGZvcm1hdCwgCi0JCQkJICBrd2xpc3QsICZsdmEsIEZMQUdfU0laRV9UKTsKLQlyZXR1cm4gcmV0dmFsOworICAgIHJldHZhbCA9IHZnZXRhcmdza2V5d29yZHMoYXJncywga2V5d29yZHMsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmx2YSwgRkxBR19TSVpFX1QpOworICAgIHJldHVybiByZXR2YWw7CiB9CiAKICNkZWZpbmUgSVNfRU5EX09GX0ZPUk1BVChjKSAoYyA9PSAnXDAnIHx8IGMgPT0gJzsnIHx8IGMgPT0gJzonKQogCiBzdGF0aWMgaW50CiB2Z2V0YXJnc2tleXdvcmRzKFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa2V5d29yZHMsIGNvbnN0IGNoYXIgKmZvcm1hdCwKLQkgICAgICAgICBjaGFyICoqa3dsaXN0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MpCisgICAgICAgICAgICAgICAgIGNoYXIgKiprd2xpc3QsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncykKIHsKLQljaGFyIG1zZ2J1Zls1MTJdOwotCWludCBsZXZlbHNbMzJdOwotCWNvbnN0IGNoYXIgKmZuYW1lLCAqbXNnLCAqY3VzdG9tX21zZywgKmtleXdvcmQ7Ci0JaW50IG1pbiA9IElOVF9NQVg7Ci0JaW50IGksIGxlbiwgbmFyZ3MsIG5rZXl3b3JkczsKLQlQeU9iamVjdCAqZnJlZWxpc3QgPSBOVUxMLCAqY3VycmVudF9hcmc7CisgICAgY2hhciBtc2didWZbNTEyXTsKKyAgICBpbnQgbGV2ZWxzWzMyXTsKKyAgICBjb25zdCBjaGFyICpmbmFtZSwgKm1zZywgKmN1c3RvbV9tc2csICprZXl3b3JkOworICAgIGludCBtaW4gPSBJTlRfTUFYOworICAgIGludCBpLCBsZW4sIG5hcmdzLCBua2V5d29yZHM7CisgICAgUHlPYmplY3QgKmZyZWVsaXN0ID0gTlVMTCwgKmN1cnJlbnRfYXJnOwogCi0JYXNzZXJ0KGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKLQlhc3NlcnQoa2V5d29yZHMgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa2V5d29yZHMpKTsKLQlhc3NlcnQoZm9ybWF0ICE9IE5VTEwpOwotCWFzc2VydChrd2xpc3QgIT0gTlVMTCk7Ci0JYXNzZXJ0KHBfdmEgIT0gTlVMTCk7CisgICAgYXNzZXJ0KGFyZ3MgIT0gTlVMTCAmJiBQeVR1cGxlX0NoZWNrKGFyZ3MpKTsKKyAgICBhc3NlcnQoa2V5d29yZHMgPT0gTlVMTCB8fCBQeURpY3RfQ2hlY2soa2V5d29yZHMpKTsKKyAgICBhc3NlcnQoZm9ybWF0ICE9IE5VTEwpOworICAgIGFzc2VydChrd2xpc3QgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHBfdmEgIT0gTlVMTCk7CiAKLQkvKiBncmFiIHRoZSBmdW5jdGlvbiBuYW1lIG9yIGN1c3RvbSBlcnJvciBtc2cgZmlyc3QgKG11dHVhbGx5IGV4Y2x1c2l2ZSkgKi8KLQlmbmFtZSA9IHN0cmNocihmb3JtYXQsICc6Jyk7Ci0JaWYgKGZuYW1lKSB7Ci0JCWZuYW1lKys7Ci0JCWN1c3RvbV9tc2cgPSBOVUxMOwotCX0KLQllbHNlIHsKLQkJY3VzdG9tX21zZyA9IHN0cmNocihmb3JtYXQsJzsnKTsKLQkJaWYgKGN1c3RvbV9tc2cpCi0JCQljdXN0b21fbXNnKys7Ci0JfQorICAgIC8qIGdyYWIgdGhlIGZ1bmN0aW9uIG5hbWUgb3IgY3VzdG9tIGVycm9yIG1zZyBmaXJzdCAobXV0dWFsbHkgZXhjbHVzaXZlKSAqLworICAgIGZuYW1lID0gc3RyY2hyKGZvcm1hdCwgJzonKTsKKyAgICBpZiAoZm5hbWUpIHsKKyAgICAgICAgZm5hbWUrKzsKKyAgICAgICAgY3VzdG9tX21zZyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjdXN0b21fbXNnID0gc3RyY2hyKGZvcm1hdCwnOycpOworICAgICAgICBpZiAoY3VzdG9tX21zZykKKyAgICAgICAgICAgIGN1c3RvbV9tc2crKzsKKyAgICB9CiAKLQkvKiBzY2FuIGt3bGlzdCBhbmQgZ2V0IGdyZWF0ZXN0IHBvc3NpYmxlIG5iciBvZiBhcmdzICovCi0JZm9yIChsZW49MDsga3dsaXN0W2xlbl07IGxlbisrKQotCQljb250aW51ZTsKKyAgICAvKiBzY2FuIGt3bGlzdCBhbmQgZ2V0IGdyZWF0ZXN0IHBvc3NpYmxlIG5iciBvZiBhcmdzICovCisgICAgZm9yIChsZW49MDsga3dsaXN0W2xlbl07IGxlbisrKQorICAgICAgICBjb250aW51ZTsKIAotCW5hcmdzID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKLQlua2V5d29yZHMgPSAoa2V5d29yZHMgPT0gTlVMTCkgPyAwIDogUHlEaWN0X1NpemUoa2V5d29yZHMpOwotCWlmIChuYXJncyArIG5rZXl3b3JkcyA+IGxlbikgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMlcyB0YWtlcyBhdCBtb3N0ICVkICIKLQkJCSAgICAgImFyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCi0JCQkgICAgIChmbmFtZSA9PSBOVUxMKSA/ICJmdW5jdGlvbiIgOiBmbmFtZSwKLQkJCSAgICAgKGZuYW1lID09IE5VTEwpID8gIiIgOiAiKCkiLAotCQkJICAgICBsZW4sCi0JCQkgICAgIChsZW4gPT0gMSkgPyAiIiA6ICJzIiwKLQkJCSAgICAgbmFyZ3MgKyBua2V5d29yZHMpOwotCQlyZXR1cm4gMDsKLQl9CisgICAgbmFyZ3MgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIG5rZXl3b3JkcyA9IChrZXl3b3JkcyA9PSBOVUxMKSA/IDAgOiBQeURpY3RfU2l6ZShrZXl3b3Jkcyk7CisgICAgaWYgKG5hcmdzICsgbmtleXdvcmRzID4gbGVuKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlcyVzIHRha2VzIGF0IG1vc3QgJWQgIgorICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50JXMgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAoZm5hbWUgPT0gTlVMTCkgPyAiZnVuY3Rpb24iIDogZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAoZm5hbWUgPT0gTlVMTCkgPyAiIiA6ICIoKSIsCisgICAgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAobGVuID09IDEpID8gIiIgOiAicyIsCisgICAgICAgICAgICAgICAgICAgICBuYXJncyArIG5rZXl3b3Jkcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIGNvbnZlcnQgdHVwbGUgYXJncyBhbmQga2V5d29yZCBhcmdzIGluIHNhbWUgbG9vcCwgdXNpbmcga3dsaXN0IHRvIGRyaXZlIHByb2Nlc3MgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJa2V5d29yZCA9IGt3bGlzdFtpXTsKLQkJaWYgKCpmb3JtYXQgPT0gJ3wnKSB7Ci0JCQltaW4gPSBpOwotCQkJZm9ybWF0Kys7Ci0JCX0KLQkJaWYgKElTX0VORF9PRl9GT1JNQVQoKmZvcm1hdCkpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJICAgICAiTW9yZSBrZXl3b3JkIGxpc3QgZW50cmllcyAoJWQpIHRoYW4gIgotCQkJCSAgICAgImZvcm1hdCBzcGVjaWZpZXJzICglZCkiLCBsZW4sIGkpOwotCQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQkJfQotCQljdXJyZW50X2FyZyA9IE5VTEw7Ci0JCWlmIChua2V5d29yZHMpIHsKLQkJCWN1cnJlbnRfYXJnID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa2V5d29yZHMsIGtleXdvcmQpOwotCQl9Ci0JCWlmIChjdXJyZW50X2FyZykgewotCQkJLS1ua2V5d29yZHM7Ci0JCQlpZiAoaSA8IG5hcmdzKSB7Ci0JCQkJLyogYXJnIHByZXNlbnQgaW4gdHVwbGUgYW5kIGluIGRpY3QgKi8KLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkgICAgICJBcmd1bWVudCBnaXZlbiBieSBuYW1lICgnJXMnKSAiCi0JCQkJCSAgICAgImFuZCBwb3NpdGlvbiAoJWQpIiwKLQkJCQkJICAgICBrZXl3b3JkLCBpKzEpOwotCQkJCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobmtleXdvcmRzICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQllbHNlIGlmIChpIDwgbmFyZ3MpCi0JCQljdXJyZW50X2FyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0JCQkKLQkJaWYgKGN1cnJlbnRfYXJnKSB7Ci0JCQltc2cgPSBjb252ZXJ0aXRlbShjdXJyZW50X2FyZywgJmZvcm1hdCwgcF92YSwgZmxhZ3MsCi0JCQkJbGV2ZWxzLCBtc2didWYsIHNpemVvZihtc2didWYpLCAmZnJlZWxpc3QpOwotCQkJaWYgKG1zZykgewotCQkJCXNldGVycm9yKGkrMSwgbXNnLCBsZXZlbHMsIGZuYW1lLCBjdXN0b21fbXNnKTsKLQkJCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KKyAgICAvKiBjb252ZXJ0IHR1cGxlIGFyZ3MgYW5kIGtleXdvcmQgYXJncyBpbiBzYW1lIGxvb3AsIHVzaW5nIGt3bGlzdCB0byBkcml2ZSBwcm9jZXNzICovCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGtleXdvcmQgPSBrd2xpc3RbaV07CisgICAgICAgIGlmICgqZm9ybWF0ID09ICd8JykgeworICAgICAgICAgICAgbWluID0gaTsKKyAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICB9CisgICAgICAgIGlmIChJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJNb3JlIGtleXdvcmQgbGlzdCBlbnRyaWVzICglZCkgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCBzcGVjaWZpZXJzICglZCkiLCBsZW4sIGkpOworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50X2FyZyA9IE5VTEw7CisgICAgICAgIGlmIChua2V5d29yZHMpIHsKKyAgICAgICAgICAgIGN1cnJlbnRfYXJnID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa2V5d29yZHMsIGtleXdvcmQpOworICAgICAgICB9CisgICAgICAgIGlmIChjdXJyZW50X2FyZykgeworICAgICAgICAgICAgLS1ua2V5d29yZHM7CisgICAgICAgICAgICBpZiAoaSA8IG5hcmdzKSB7CisgICAgICAgICAgICAgICAgLyogYXJnIHByZXNlbnQgaW4gdHVwbGUgYW5kIGluIGRpY3QgKi8KKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgZ2l2ZW4gYnkgbmFtZSAoJyVzJykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHBvc2l0aW9uICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCBpKzEpOworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobmtleXdvcmRzICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOworICAgICAgICBlbHNlIGlmIChpIDwgbmFyZ3MpCisgICAgICAgICAgICBjdXJyZW50X2FyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CiAKLQkJaWYgKGkgPCBtaW4pIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJSZXF1aXJlZCBhcmd1bWVudCAiCi0JCQkJICAgICAiJyVzJyAocG9zICVkKSBub3QgZm91bmQiLAotCQkJCSAgICAga2V5d29yZCwgaSsxKTsKLQkJCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JCX0KLQkJLyogY3VycmVudCBjb2RlIHJlcG9ydHMgc3VjY2VzcyB3aGVuIGFsbCByZXF1aXJlZCBhcmdzCi0JCSAqIGZ1bGZpbGxlZCBhbmQgbm8ga2V5d29yZCBhcmdzIGxlZnQsIHdpdGggbm8gZnVydGhlcgotCQkgKiB2YWxpZGF0aW9uLiBYWFggTWF5YmUgc2tpcCB0aGlzIGluIGRlYnVnIGJ1aWxkID8KLQkJICovCi0JCWlmICghbmtleXdvcmRzKQotCQkJcmV0dXJuIGNsZWFucmV0dXJuKDEsIGZyZWVsaXN0KTsKKyAgICAgICAgaWYgKGN1cnJlbnRfYXJnKSB7CisgICAgICAgICAgICBtc2cgPSBjb252ZXJ0aXRlbShjdXJyZW50X2FyZywgJmZvcm1hdCwgcF92YSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgbGV2ZWxzLCBtc2didWYsIHNpemVvZihtc2didWYpLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgaWYgKG1zZykgeworICAgICAgICAgICAgICAgIHNldGVycm9yKGkrMSwgbXNnLCBsZXZlbHMsIGZuYW1lLCBjdXN0b21fbXNnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotCQkvKiBXZSBhcmUgaW50byBvcHRpb25hbCBhcmdzLCBza2lwIHRocnUgdG8gYW55IHJlbWFpbmluZwotCQkgKiBrZXl3b3JkIGFyZ3MgKi8KLQkJbXNnID0gc2tpcGl0ZW0oJmZvcm1hdCwgcF92YSwgZmxhZ3MpOwotCQlpZiAobXNnKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLCAiJXM6ICclcyciLCBtc2csCi0JCQkJICAgICBmb3JtYXQpOwotCQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQkJfQotCX0KKyAgICAgICAgaWYgKGkgPCBtaW4pIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJSZXF1aXJlZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgKHBvcyAlZCkgbm90IGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCBpKzEpOworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgfQorICAgICAgICAvKiBjdXJyZW50IGNvZGUgcmVwb3J0cyBzdWNjZXNzIHdoZW4gYWxsIHJlcXVpcmVkIGFyZ3MKKyAgICAgICAgICogZnVsZmlsbGVkIGFuZCBubyBrZXl3b3JkIGFyZ3MgbGVmdCwgd2l0aCBubyBmdXJ0aGVyCisgICAgICAgICAqIHZhbGlkYXRpb24uIFhYWCBNYXliZSBza2lwIHRoaXMgaW4gZGVidWcgYnVpbGQgPworICAgICAgICAgKi8KKyAgICAgICAgaWYgKCFua2V5d29yZHMpCisgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMSwgZnJlZWxpc3QpOwogCi0JaWYgKCFJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpICYmICpmb3JtYXQgIT0gJ3wnKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkibW9yZSBhcmd1bWVudCBzcGVjaWZpZXJzIHRoYW4ga2V5d29yZCBsaXN0IGVudHJpZXMgIgotCQkJIihyZW1haW5pbmcgZm9ybWF0OiclcycpIiwgZm9ybWF0KTsKLQkJcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKLQl9CisgICAgICAgIC8qIFdlIGFyZSBpbnRvIG9wdGlvbmFsIGFyZ3MsIHNraXAgdGhydSB0byBhbnkgcmVtYWluaW5nCisgICAgICAgICAqIGtleXdvcmQgYXJncyAqLworICAgICAgICBtc2cgPSBza2lwaXRlbSgmZm9ybWF0LCBwX3ZhLCBmbGFncyk7CisgICAgICAgIGlmIChtc2cpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsICIlczogJyVzJyIsIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gZXh0cmFuZW91cyBrZXl3b3JkIGFyZ3VtZW50cyAqLwotCWlmIChua2V5d29yZHMgPiAwKSB7Ci0JCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLQkJUHlfc3NpemVfdCBwb3MgPSAwOwotCQl3aGlsZSAoUHlEaWN0X05leHQoa2V5d29yZHMsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKLQkJCWludCBtYXRjaCA9IDA7Ci0JCQljaGFyICprczsKLQkJCWlmICghUHlTdHJpbmdfQ2hlY2soa2V5KSkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIAotCQkJCQkgICAgICAgICJrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3MiKTsKLQkJCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwotCQkJfQotCQkJa3MgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOwotCQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJaWYgKCFzdHJjbXAoa3MsIGt3bGlzdFtpXSkpIHsKLQkJCQkJbWF0Y2ggPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW1hdGNoKSB7Ci0JCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJICAgICAiJyVzJyBpcyBhbiBpbnZhbGlkIGtleXdvcmQgIgotCQkJCQkgICAgICJhcmd1bWVudCBmb3IgdGhpcyBmdW5jdGlvbiIsCi0JCQkJCSAgICAga3MpOwotCQkJCXJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgaWYgKCFJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpICYmICpmb3JtYXQgIT0gJ3wnKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAibW9yZSBhcmd1bWVudCBzcGVjaWZpZXJzIHRoYW4ga2V5d29yZCBsaXN0IGVudHJpZXMgIgorICAgICAgICAgICAgIihyZW1haW5pbmcgZm9ybWF0OiclcycpIiwgZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsIGZyZWVsaXN0KTsKKyAgICB9CiAKLQlyZXR1cm4gY2xlYW5yZXR1cm4oMSwgZnJlZWxpc3QpOworICAgIC8qIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gZXh0cmFuZW91cyBrZXl3b3JkIGFyZ3VtZW50cyAqLworICAgIGlmIChua2V5d29yZHMgPiAwKSB7CisgICAgICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZTsKKyAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICB3aGlsZSAoUHlEaWN0X05leHQoa2V5d29yZHMsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGludCBtYXRjaCA9IDA7CisgICAgICAgICAgICBjaGFyICprczsKKyAgICAgICAgICAgIGlmICghUHlTdHJpbmdfQ2hlY2soa2V5KSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXl3b3JkcyBtdXN0IGJlIHN0cmluZ3MiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAga3MgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoa3MsIGt3bGlzdFtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1hdGNoKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgaXMgYW4gaW52YWxpZCBrZXl3b3JkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IGZvciB0aGlzIGZ1bmN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3MpOworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCBmcmVlbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2xlYW5yZXR1cm4oMSwgZnJlZWxpc3QpOwogfQogCiAKIHN0YXRpYyBjaGFyICoKIHNraXBpdGVtKGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzKQogewotCWNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKLQljaGFyIGMgPSAqZm9ybWF0Kys7Ci0JCi0Jc3dpdGNoIChjKSB7CisgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gKnBfZm9ybWF0OworICAgIGNoYXIgYyA9ICpmb3JtYXQrKzsKIAotCS8qIHNpbXBsZSBjb2RlcwotCSAqIFRoZSBpbmRpdmlkdWFsIHR5cGVzIChzZWNvbmQgYXJnIG9mIHZhX2FyZykgYXJlIGlycmVsZXZhbnQgKi8KKyAgICBzd2l0Y2ggKGMpIHsKIAotCWNhc2UgJ2InOiAvKiBieXRlIC0tIHZlcnkgc2hvcnQgaW50ICovCi0JY2FzZSAnQic6IC8qIGJ5dGUgYXMgYml0ZmllbGQgKi8KLQljYXNlICdoJzogLyogc2hvcnQgaW50ICovCi0JY2FzZSAnSCc6IC8qIHNob3J0IGludCBhcyBiaXRmaWVsZCAqLwotCWNhc2UgJ2knOiAvKiBpbnQgKi8KLQljYXNlICdJJzogLyogaW50IHNpemVkIGJpdGZpZWxkICovCi0JY2FzZSAnbCc6IC8qIGxvbmcgaW50ICovCi0JY2FzZSAnayc6IC8qIGxvbmcgaW50IHNpemVkIGJpdGZpZWxkICovCisgICAgLyogc2ltcGxlIGNvZGVzCisgICAgICogVGhlIGluZGl2aWR1YWwgdHlwZXMgKHNlY29uZCBhcmcgb2YgdmFfYXJnKSBhcmUgaXJyZWxldmFudCAqLworCisgICAgY2FzZSAnYic6IC8qIGJ5dGUgLS0gdmVyeSBzaG9ydCBpbnQgKi8KKyAgICBjYXNlICdCJzogLyogYnl0ZSBhcyBiaXRmaWVsZCAqLworICAgIGNhc2UgJ2gnOiAvKiBzaG9ydCBpbnQgKi8KKyAgICBjYXNlICdIJzogLyogc2hvcnQgaW50IGFzIGJpdGZpZWxkICovCisgICAgY2FzZSAnaSc6IC8qIGludCAqLworICAgIGNhc2UgJ0knOiAvKiBpbnQgc2l6ZWQgYml0ZmllbGQgKi8KKyAgICBjYXNlICdsJzogLyogbG9uZyBpbnQgKi8KKyAgICBjYXNlICdrJzogLyogbG9uZyBpbnQgc2l6ZWQgYml0ZmllbGQgKi8KICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCWNhc2UgJ0wnOiAvKiBQWV9MT05HX0xPTkcgKi8KLQljYXNlICdLJzogLyogUFlfTE9OR19MT05HIHNpemVkIGJpdGZpZWxkICovCisgICAgY2FzZSAnTCc6IC8qIFBZX0xPTkdfTE9ORyAqLworICAgIGNhc2UgJ0snOiAvKiBQWV9MT05HX0xPTkcgc2l6ZWQgYml0ZmllbGQgKi8KICNlbmRpZgotCWNhc2UgJ2YnOiAvKiBmbG9hdCAqLwotCWNhc2UgJ2QnOiAvKiBkb3VibGUgKi8KKyAgICBjYXNlICdmJzogLyogZmxvYXQgKi8KKyAgICBjYXNlICdkJzogLyogZG91YmxlICovCiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCWNhc2UgJ0QnOiAvKiBjb21wbGV4IGRvdWJsZSAqLworICAgIGNhc2UgJ0QnOiAvKiBjb21wbGV4IGRvdWJsZSAqLwogI2VuZGlmCi0JY2FzZSAnYyc6IC8qIGNoYXIgKi8KLQkJewotCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgdm9pZCAqKTsKLQkJCWJyZWFrOwotCQl9CisgICAgY2FzZSAnYyc6IC8qIGNoYXIgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgdm9pZCAqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQljYXNlICduJzogLyogUHlfc3NpemVfdCAqLwotCQl7Ci0JCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90ICopOwotCQkJYnJlYWs7Ci0JCX0KLQkKLQkvKiBzdHJpbmcgY29kZXMgKi8KLQkJCi0JY2FzZSAnZSc6IC8qIHN0cmluZyB3aXRoIGVuY29kaW5nICovCi0JCXsKLQkJCSh2b2lkKSB2YV9hcmcoKnBfdmEsIGNvbnN0IGNoYXIgKik7Ci0JCQlpZiAoISgqZm9ybWF0ID09ICdzJyB8fCAqZm9ybWF0ID09ICd0JykpCi0JCQkJLyogYWZ0ZXIgJ2UnLCBvbmx5ICdzJyBhbmQgJ3QnIGlzIGFsbG93ZWQgKi8KLQkJCQlnb3RvIGVycjsKLQkJCWZvcm1hdCsrOwotCQkJLyogZXhwbGljaXQgZmFsbHRocm91Z2ggdG8gc3RyaW5nIGNhc2VzICovCi0JCX0KLQkKLQljYXNlICdzJzogLyogc3RyaW5nICovCi0JY2FzZSAneic6IC8qIHN0cmluZyBvciBOb25lICovCisgICAgY2FzZSAnbic6IC8qIFB5X3NzaXplX3QgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCAqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAvKiBzdHJpbmcgY29kZXMgKi8KKworICAgIGNhc2UgJ2UnOiAvKiBzdHJpbmcgd2l0aCBlbmNvZGluZyAqLworICAgICAgICB7CisgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCBjb25zdCBjaGFyICopOworICAgICAgICAgICAgaWYgKCEoKmZvcm1hdCA9PSAncycgfHwgKmZvcm1hdCA9PSAndCcpKQorICAgICAgICAgICAgICAgIC8qIGFmdGVyICdlJywgb25seSAncycgYW5kICd0JyBpcyBhbGxvd2VkICovCisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIC8qIGV4cGxpY2l0IGZhbGx0aHJvdWdoIHRvIHN0cmluZyBjYXNlcyAqLworICAgICAgICB9CisKKyAgICBjYXNlICdzJzogLyogc3RyaW5nICovCisgICAgY2FzZSAneic6IC8qIHN0cmluZyBvciBOb25lICovCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWNhc2UgJ3UnOiAvKiB1bmljb2RlIHN0cmluZyAqLworICAgIGNhc2UgJ3UnOiAvKiB1bmljb2RlIHN0cmluZyAqLwogI2VuZGlmCi0JY2FzZSAndCc6IC8qIGJ1ZmZlciwgcmVhZC1vbmx5ICovCi0JY2FzZSAndyc6IC8qIGJ1ZmZlciwgcmVhZC13cml0ZSAqLwotCQl7Ci0JCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLQkJCWlmICgqZm9ybWF0ID09ICcjJykgewotCQkJCWlmIChmbGFncyAmIEZMQUdfU0laRV9UKQotCQkJCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90ICopOwotCQkJCWVsc2UKLQkJCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgaW50ICopOwotCQkJCWZvcm1hdCsrOwotCQkJfSBlbHNlIGlmICgoYyA9PSAncycgfHwgYyA9PSAneicpICYmICpmb3JtYXQgPT0gJyonKSB7Ci0JCQkJZm9ybWF0Kys7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQorICAgIGNhc2UgJ3QnOiAvKiBidWZmZXIsIHJlYWQtb25seSAqLworICAgIGNhc2UgJ3cnOiAvKiBidWZmZXIsIHJlYWQtd3JpdGUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgY2hhciAqKik7CisgICAgICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCAqKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIGludCAqKTsKKyAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGMgPT0gJ3MnIHx8IGMgPT0gJ3onKSAmJiAqZm9ybWF0ID09ICcqJykgeworICAgICAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCS8qIG9iamVjdCBjb2RlcyAqLworICAgIC8qIG9iamVjdCBjb2RlcyAqLwogCi0JY2FzZSAnUyc6IC8qIHN0cmluZyBvYmplY3QgKi8KKyAgICBjYXNlICdTJzogLyogc3RyaW5nIG9iamVjdCAqLwogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQljYXNlICdVJzogLyogdW5pY29kZSBzdHJpbmcgb2JqZWN0ICovCisgICAgY2FzZSAnVSc6IC8qIHVuaWNvZGUgc3RyaW5nIG9iamVjdCAqLwogI2VuZGlmCi0JCXsKLQkJCSh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKLQkJCWJyZWFrOwotCQl9Ci0JCi0JY2FzZSAnTyc6IC8qIG9iamVjdCAqLwotCQl7Ci0JCQlpZiAoKmZvcm1hdCA9PSAnIScpIHsKLQkJCQlmb3JtYXQrKzsKLQkJCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeVR5cGVPYmplY3QqKTsKLQkJCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCBQeU9iamVjdCAqKik7Ci0JCQl9CisgICAgICAgIHsKKyAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBjYXNlICdPJzogLyogb2JqZWN0ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgqZm9ybWF0ID09ICchJykgeworICAgICAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5VHlwZU9iamVjdCopOworICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgIH0KICNpZiAwCiAvKiBJIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGZvciAqLwotCQkJZWxzZSBpZiAoKmZvcm1hdCA9PSAnPycpIHsKLQkJCQlpbnF1aXJ5IHByZWQgPSB2YV9hcmcoKnBfdmEsIGlucXVpcnkpOwotCQkJCWZvcm1hdCsrOwotCQkJCWlmICgoKnByZWQpKGFyZykpIHsKLQkJCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpmb3JtYXQgPT0gJz8nKSB7CisgICAgICAgICAgICAgICAgaW5xdWlyeSBwcmVkID0gdmFfYXJnKCpwX3ZhLCBpbnF1aXJ5KTsKKyAgICAgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgICAgICBpZiAoKCpwcmVkKShhcmcpKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCWVsc2UgaWYgKCpmb3JtYXQgPT0gJyYnKSB7Ci0JCQkJdHlwZWRlZiBpbnQgKCpjb252ZXJ0ZXIpKFB5T2JqZWN0ICosIHZvaWQgKik7Ci0JCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgY29udmVydGVyKTsKLQkJCQkodm9pZCkgdmFfYXJnKCpwX3ZhLCB2b2lkICopOwotCQkJCWZvcm1hdCsrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KKyAgICAgICAgICAgIGVsc2UgaWYgKCpmb3JtYXQgPT0gJyYnKSB7CisgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpjb252ZXJ0ZXIpKFB5T2JqZWN0ICosIHZvaWQgKik7CisgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgY29udmVydGVyKTsKKyAgICAgICAgICAgICAgICAodm9pZCkgdmFfYXJnKCpwX3ZhLCB2b2lkICopOworICAgICAgICAgICAgICAgIGZvcm1hdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZygqcF92YSwgUHlPYmplY3QgKiopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCWNhc2UgJygnOgkvKiBieXBhc3MgdHVwbGUsIG5vdCBoYW5kbGVkIGF0IGFsbCBwcmV2aW91c2x5ICovCi0JCXsKLQkJCWNoYXIgKm1zZzsKLQkJCWZvciAoOzspIHsKLQkJCQlpZiAoKmZvcm1hdD09JyknKQotCQkJCQlicmVhazsKLQkJCQlpZiAoSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSkKLQkJCQkJcmV0dXJuICJVbm1hdGNoZWQgbGVmdCBwYXJlbiBpbiBmb3JtYXQgIgotCQkJCQkgICAgICAgInN0cmluZyI7Ci0JCQkJbXNnID0gc2tpcGl0ZW0oJmZvcm1hdCwgcF92YSwgZmxhZ3MpOwotCQkJCWlmIChtc2cpCi0JCQkJCXJldHVybiBtc2c7Ci0JCQl9Ci0JCQlmb3JtYXQrKzsKLQkJCWJyZWFrOwotCQl9CisgICAgY2FzZSAnKCc6ICAgICAgICAgICAvKiBieXBhc3MgdHVwbGUsIG5vdCBoYW5kbGVkIGF0IGFsbCBwcmV2aW91c2x5ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKm1zZzsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBpZiAoKmZvcm1hdD09JyknKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbm1hdGNoZWQgbGVmdCBwYXJlbiBpbiBmb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyI7CisgICAgICAgICAgICAgICAgbXNnID0gc2tpcGl0ZW0oJmZvcm1hdCwgcF92YSwgZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChtc2cpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtYXQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQljYXNlICcpJzoKLQkJcmV0dXJuICJVbm1hdGNoZWQgcmlnaHQgcGFyZW4gaW4gZm9ybWF0IHN0cmluZyI7CisgICAgY2FzZSAnKSc6CisgICAgICAgIHJldHVybiAiVW5tYXRjaGVkIHJpZ2h0IHBhcmVuIGluIGZvcm1hdCBzdHJpbmciOwogCi0JZGVmYXVsdDoKKyAgICBkZWZhdWx0OgogZXJyOgotCQlyZXR1cm4gImltcG9zc2libGU8YmFkIGZvcm1hdCBjaGFyPiI7Ci0JCi0JfQorICAgICAgICByZXR1cm4gImltcG9zc2libGU8YmFkIGZvcm1hdCBjaGFyPiI7CiAKLQkqcF9mb3JtYXQgPSBmb3JtYXQ7Ci0JcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgKnBfZm9ybWF0ID0gZm9ybWF0OworICAgIHJldHVybiBOVUxMOwogfQogCiAKIGludAogUHlBcmdfVW5wYWNrVHVwbGUoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIFB5X3NzaXplX3QgbWluLCBQeV9zc2l6ZV90IG1heCwgLi4uKQogewotCVB5X3NzaXplX3QgaSwgbDsKLQlQeU9iamVjdCAqKm87Ci0JdmFfbGlzdCB2YXJnczsKKyAgICBQeV9zc2l6ZV90IGksIGw7CisgICAgUHlPYmplY3QgKipvOworICAgIHZhX2xpc3QgdmFyZ3M7CiAKICNpZmRlZiBIQVZFX1NUREFSR19QUk9UT1RZUEVTCi0JdmFfc3RhcnQodmFyZ3MsIG1heCk7CisgICAgdmFfc3RhcnQodmFyZ3MsIG1heCk7CiAjZWxzZQotCXZhX3N0YXJ0KHZhcmdzKTsKKyAgICB2YV9zdGFydCh2YXJncyk7CiAjZW5kaWYKIAotCWFzc2VydChtaW4gPj0gMCk7Ci0JYXNzZXJ0KG1pbiA8PSBtYXgpOwotCWlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCSAgICAiUHlBcmdfVW5wYWNrVHVwbGUoKSBhcmd1bWVudCBsaXN0IGlzIG5vdCBhIHR1cGxlIik7Ci0JCXJldHVybiAwOwotCX0JCi0JbCA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7Ci0JaWYgKGwgPCBtaW4pIHsKLQkJaWYgKG5hbWUgIT0gTlVMTCkKLQkJCVB5RXJyX0Zvcm1hdCgKLQkJCSAgICBQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgIiVzIGV4cGVjdGVkICVzJXpkIGFyZ3VtZW50cywgZ290ICV6ZCIsIAotCQkJICAgIG5hbWUsIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIG1pbiwgbCk7Ci0JCWVsc2UKLQkJCVB5RXJyX0Zvcm1hdCgKLQkJCSAgICBQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgInVucGFja2VkIHR1cGxlIHNob3VsZCBoYXZlICVzJXpkIGVsZW1lbnRzLCIKLQkJCSAgICAiIGJ1dCBoYXMgJXpkIiwgCi0JCQkgICAgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBsZWFzdCAiKSwgbWluLCBsKTsKLQkJdmFfZW5kKHZhcmdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmIChsID4gbWF4KSB7Ci0JCWlmIChuYW1lICE9IE5VTEwpCi0JCQlQeUVycl9Gb3JtYXQoCi0JCQkgICAgUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICIlcyBleHBlY3RlZCAlcyV6ZCBhcmd1bWVudHMsIGdvdCAlemQiLCAKLQkJCSAgICBuYW1lLCAobWluID09IG1heCA/ICIiIDogImF0IG1vc3QgIiksIG1heCwgbCk7Ci0JCWVsc2UKLQkJCVB5RXJyX0Zvcm1hdCgKLQkJCSAgICBQeUV4Y19UeXBlRXJyb3IsCi0JCQkgICAgInVucGFja2VkIHR1cGxlIHNob3VsZCBoYXZlICVzJXpkIGVsZW1lbnRzLCIKLQkJCSAgICAiIGJ1dCBoYXMgJXpkIiwgCi0JCQkgICAgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBtb3N0ICIpLCBtYXgsIGwpOwotCQl2YV9lbmQodmFyZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewotCQlvID0gdmFfYXJnKHZhcmdzLCBQeU9iamVjdCAqKik7Ci0JCSpvID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKLQl9Ci0JdmFfZW5kKHZhcmdzKTsKLQlyZXR1cm4gMTsKKyAgICBhc3NlcnQobWluID49IDApOworICAgIGFzc2VydChtaW4gPD0gbWF4KTsKKyAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgIlB5QXJnX1VucGFja1R1cGxlKCkgYXJndW1lbnQgbGlzdCBpcyBub3QgYSB0dXBsZSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbCA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CisgICAgaWYgKGwgPCBtaW4pIHsKKyAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIiVzIGV4cGVjdGVkICVzJXpkIGFyZ3VtZW50cywgZ290ICV6ZCIsCisgICAgICAgICAgICAgICAgbmFtZSwgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBsZWFzdCAiKSwgbWluLCBsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAidW5wYWNrZWQgdHVwbGUgc2hvdWxkIGhhdmUgJXMlemQgZWxlbWVudHMsIgorICAgICAgICAgICAgICAgICIgYnV0IGhhcyAlemQiLAorICAgICAgICAgICAgICAgIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbGVhc3QgIiksIG1pbiwgbCk7CisgICAgICAgIHZhX2VuZCh2YXJncyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAobCA+IG1heCkgeworICAgICAgICBpZiAobmFtZSAhPSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KAorICAgICAgICAgICAgICAgIFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAiJXMgZXhwZWN0ZWQgJXMlemQgYXJndW1lbnRzLCBnb3QgJXpkIiwKKyAgICAgICAgICAgICAgICBuYW1lLCAobWluID09IG1heCA/ICIiIDogImF0IG1vc3QgIiksIG1heCwgbCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKKyAgICAgICAgICAgICAgICBQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgInVucGFja2VkIHR1cGxlIHNob3VsZCBoYXZlICVzJXpkIGVsZW1lbnRzLCIKKyAgICAgICAgICAgICAgICAiIGJ1dCBoYXMgJXpkIiwKKyAgICAgICAgICAgICAgICAobWluID09IG1heCA/ICIiIDogImF0IG1vc3QgIiksIG1heCwgbCk7CisgICAgICAgIHZhX2VuZCh2YXJncyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CisgICAgICAgIG8gPSB2YV9hcmcodmFyZ3MsIFB5T2JqZWN0ICoqKTsKKyAgICAgICAgKm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworICAgIH0KKyAgICB2YV9lbmQodmFyZ3MpOworICAgIHJldHVybiAxOwogfQogCiAKIC8qIEZvciB0eXBlIGNvbnN0cnVjdG9ycyB0aGF0IGRvbid0IHRha2Uga2V5d29yZCBhcmdzCiAgKgotICogU2V0cyBhIFR5cGVFcnJvciBhbmQgcmV0dXJucyAwIGlmIHRoZSBrd2RzIGRpY3QgaXMgCisgKiBTZXRzIGEgVHlwZUVycm9yIGFuZCByZXR1cm5zIDAgaWYgdGhlIGt3ZHMgZGljdCBpcwogICogbm90IGVtcHR5LCByZXR1cm5zIDEgb3RoZXJ3aXNlCiAgKi8KIGludAogX1B5QXJnX05vS2V5d29yZHMoY29uc3QgY2hhciAqZnVuY25hbWUsIFB5T2JqZWN0ICprdykKIHsKLQlpZiAoa3cgPT0gTlVMTCkKLQkJcmV0dXJuIDE7Ci0JaWYgKCFQeURpY3RfQ2hlY2tFeGFjdChrdykpIHsKLQkJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoUHlEaWN0X1NpemUoa3cpID09IDApCi0JCXJldHVybiAxOwotCQotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlcyBkb2VzIG5vdCB0YWtlIGtleXdvcmQgYXJndW1lbnRzIiwgCi0JCQlmdW5jbmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgaWYgKGt3ID09IE5VTEwpCisgICAgICAgIHJldHVybiAxOworICAgIGlmICghUHlEaWN0X0NoZWNrRXhhY3Qoa3cpKSB7CisgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKFB5RGljdF9TaXplKGt3KSA9PSAwKQorICAgICAgICByZXR1cm4gMTsKKworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlcyBkb2VzIG5vdCB0YWtlIGtleXdvcmQgYXJndW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgZnVuY25hbWUpOworICAgIHJldHVybiAwOwogfQogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dldGN3ZC5jIGIvUHl0aG9uL2dldGN3ZC5jCmluZGV4IDk2N2Q0ODQuLjRiZWRiZDEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9nZXRjd2QuYworKysgYi9QeXRob24vZ2V0Y3dkLmMKQEAgLTI2LDI0ICsyNiwyNCBAQAogY2hhciAqCiBnZXRjd2QoY2hhciAqYnVmLCBpbnQgc2l6ZSkKIHsKLQljaGFyIGxvY2FsYnVmW01BWFBBVEhMRU4rMV07Ci0JY2hhciAqcmV0OwotCQotCWlmIChzaXplIDw9IDApIHsKLQkJZXJybm8gPSBFSU5WQUw7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXQgPSBnZXR3ZChsb2NhbGJ1Zik7Ci0JaWYgKHJldCAhPSBOVUxMICYmIHN0cmxlbihsb2NhbGJ1ZikgPj0gKHNpemVfdClzaXplKSB7Ci0JCWVycm5vID0gRVJBTkdFOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHJldCA9PSBOVUxMKSB7Ci0JCWVycm5vID0gRUFDQ0VTOyAvKiBNb3N0IGxpa2VseSBlcnJvciAqLwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RybmNweShidWYsIGxvY2FsYnVmLCBzaXplKTsKLQlyZXR1cm4gYnVmOworICAgIGNoYXIgbG9jYWxidWZbTUFYUEFUSExFTisxXTsKKyAgICBjaGFyICpyZXQ7CisKKyAgICBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0ID0gZ2V0d2QobG9jYWxidWYpOworICAgIGlmIChyZXQgIT0gTlVMTCAmJiBzdHJsZW4obG9jYWxidWYpID49IChzaXplX3Qpc2l6ZSkgeworICAgICAgICBlcnJubyA9IEVSQU5HRTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChyZXQgPT0gTlVMTCkgeworICAgICAgICBlcnJubyA9IEVBQ0NFUzsgLyogTW9zdCBsaWtlbHkgZXJyb3IgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cm5jcHkoYnVmLCBsb2NhbGJ1Ziwgc2l6ZSk7CisgICAgcmV0dXJuIGJ1ZjsKIH0KIAogI2Vsc2UgLyogIUhBVkVfR0VUV0QgKi8KQEAgLTU3LDI3ICs1NywyNyBAQAogY2hhciAqCiBnZXRjd2QoY2hhciAqYnVmLCBpbnQgc2l6ZSkKIHsKLQlGSUxFICpmcDsKLQljaGFyICpwOwotCWludCBzdHM7Ci0JaWYgKHNpemUgPD0gMCkgewotCQllcnJubyA9IEVJTlZBTDsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgoZnAgPSBwb3BlbihQV0RfQ01ELCAiciIpKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZmdldHMoYnVmLCBzaXplLCBmcCkgPT0gTlVMTCB8fCAoc3RzID0gcGNsb3NlKGZwKSkgIT0gMCkgewotCQllcnJubyA9IEVBQ0NFUzsgLyogTW9zdCBsaWtlbHkgZXJyb3IgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvciAocCA9IGJ1ZjsgKnAgIT0gJ1xuJzsgcCsrKSB7Ci0JCWlmICgqcCA9PSAnXDAnKSB7Ci0JCQllcnJubyA9IEVSQU5HRTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCSpwID0gJ1wwJzsKLQlyZXR1cm4gYnVmOworICAgIEZJTEUgKmZwOworICAgIGNoYXIgKnA7CisgICAgaW50IHN0czsKKyAgICBpZiAoc2l6ZSA8PSAwKSB7CisgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKChmcCA9IHBvcGVuKFBXRF9DTUQsICJyIikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChmZ2V0cyhidWYsIHNpemUsIGZwKSA9PSBOVUxMIHx8IChzdHMgPSBwY2xvc2UoZnApKSAhPSAwKSB7CisgICAgICAgIGVycm5vID0gRUFDQ0VTOyAvKiBNb3N0IGxpa2VseSBlcnJvciAqLworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChwID0gYnVmOyAqcCAhPSAnXG4nOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09ICdcMCcpIHsKKyAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnAgPSAnXDAnOworICAgIHJldHVybiBidWY7CiB9CiAKICNlbmRpZiAvKiAhSEFWRV9HRVRXRCAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dldG9wdC5jIGIvUHl0aG9uL2dldG9wdC5jCmluZGV4IDI0NzYwMGIuLjA5M2MzZGEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9nZXRvcHQuYworKysgYi9QeXRob24vZ2V0b3B0LmMKQEAgLTcsOCArNyw4IEBACiAgKgogICogICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKICAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi0gKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiAgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFuZAogICogdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIG5vdGljZSBhcHBlYXIgdW5tb2RpZmllZCBpbiBhbGwgY29waWVzLgogICoKQEAgLTQwLDg0ICs0MCw4NCBAQAogCiBpbnQgX1B5T1NfR2V0T3B0KGludCBhcmdjLCBjaGFyICoqYXJndiwgY2hhciAqb3B0c3RyaW5nKQogewotCXN0YXRpYyBjaGFyICpvcHRfcHRyID0gIiI7Ci0JY2hhciAqcHRyOwotCWludCBvcHRpb247CisgICAgc3RhdGljIGNoYXIgKm9wdF9wdHIgPSAiIjsKKyAgICBjaGFyICpwdHI7CisgICAgaW50IG9wdGlvbjsKIAotCWlmICgqb3B0X3B0ciA9PSAnXDAnKSB7CisgICAgaWYgKCpvcHRfcHRyID09ICdcMCcpIHsKIAotCQlpZiAoX1B5T1Nfb3B0aW5kID49IGFyZ2MpCi0JCQlyZXR1cm4gLTE7CisgICAgICAgIGlmIChfUHlPU19vcHRpbmQgPj0gYXJnYykKKyAgICAgICAgICAgIHJldHVybiAtMTsKICNpZmRlZiBNU19XSU5ET1dTCi0JCWVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICIvPyIpID09IDApIHsKLQkJCSsrX1B5T1Nfb3B0aW5kOwotCQkJcmV0dXJuICdoJzsKLQkJfQorICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLz8iKSA9PSAwKSB7CisgICAgICAgICAgICArK19QeU9TX29wdGluZDsKKyAgICAgICAgICAgIHJldHVybiAnaCc7CisgICAgICAgIH0KICNlbmRpZgogCi0JCWVsc2UgaWYgKGFyZ3ZbX1B5T1Nfb3B0aW5kXVswXSAhPSAnLScgfHwKLQkJICAgICAgICAgYXJndltfUHlPU19vcHRpbmRdWzFdID09ICdcMCcgLyogbG9uZSBkYXNoICovICkKLQkJCXJldHVybiAtMTsKKyAgICAgICAgZWxzZSBpZiAoYXJndltfUHlPU19vcHRpbmRdWzBdICE9ICctJyB8fAorICAgICAgICAgICAgICAgICBhcmd2W19QeU9TX29wdGluZF1bMV0gPT0gJ1wwJyAvKiBsb25lIGRhc2ggKi8gKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogCi0JCWVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICItLSIpID09IDApIHsKLQkJCSsrX1B5T1Nfb3B0aW5kOwotCQkJcmV0dXJuIC0xOwotCQl9CisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICItLSIpID09IDApIHsKKyAgICAgICAgICAgICsrX1B5T1Nfb3B0aW5kOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CiAKLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi0taGVscCIpID09IDApIHsKLQkJCSsrX1B5T1Nfb3B0aW5kOwotCQkJcmV0dXJuICdoJzsKLQkJfQorICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLS1oZWxwIikgPT0gMCkgeworICAgICAgICAgICAgKytfUHlPU19vcHRpbmQ7CisgICAgICAgICAgICByZXR1cm4gJ2gnOworICAgICAgICB9CiAKLQkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi0tdmVyc2lvbiIpID09IDApIHsKLQkJCSsrX1B5T1Nfb3B0aW5kOwotCQkJcmV0dXJuICdWJzsKLQkJfQorICAgICAgICBlbHNlIGlmIChzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLS12ZXJzaW9uIikgPT0gMCkgeworICAgICAgICAgICAgKytfUHlPU19vcHRpbmQ7CisgICAgICAgICAgICByZXR1cm4gJ1YnOworICAgICAgICB9CiAKIAotCQlvcHRfcHRyID0gJmFyZ3ZbX1B5T1Nfb3B0aW5kKytdWzFdOyAKLQl9CisgICAgICAgIG9wdF9wdHIgPSAmYXJndltfUHlPU19vcHRpbmQrK11bMV07CisgICAgfQogCi0JaWYgKCAob3B0aW9uID0gKm9wdF9wdHIrKykgPT0gJ1wwJykKLQkJcmV0dXJuIC0xOworICAgIGlmICggKG9wdGlvbiA9ICpvcHRfcHRyKyspID09ICdcMCcpCisgICAgICAgIHJldHVybiAtMTsKIAotCWlmIChvcHRpb24gPT0gJ0onKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiLUogaXMgcmVzZXJ2ZWQgZm9yIEp5dGhvblxuIik7Ci0JCXJldHVybiAnXyc7Ci0JfQorICAgIGlmIChvcHRpb24gPT0gJ0onKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLUogaXMgcmVzZXJ2ZWQgZm9yIEp5dGhvblxuIik7CisgICAgICAgIHJldHVybiAnXyc7CisgICAgfQogCi0JaWYgKG9wdGlvbiA9PSAnWCcpIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCSAgIi1YIGlzIHJlc2VydmVkIGZvciBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBhcmd1bWVudHNcbiIpOwotCQlyZXR1cm4gJ18nOwotCX0KKyAgICBpZiAob3B0aW9uID09ICdYJykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAiLVggaXMgcmVzZXJ2ZWQgZm9yIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGFyZ3VtZW50c1xuIik7CisgICAgICAgIHJldHVybiAnXyc7CisgICAgfQogCi0JaWYgKChwdHIgPSBzdHJjaHIob3B0c3RyaW5nLCBvcHRpb24pKSA9PSBOVUxMKSB7Ci0JCWlmIChfUHlPU19vcHRlcnIpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uOiAtJWNcbiIsIG9wdGlvbik7CisgICAgaWYgKChwdHIgPSBzdHJjaHIob3B0c3RyaW5nLCBvcHRpb24pKSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChfUHlPU19vcHRlcnIpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uOiAtJWNcbiIsIG9wdGlvbik7CiAKLQkJcmV0dXJuICdfJzsKLQl9CisgICAgICAgIHJldHVybiAnXyc7CisgICAgfQogCi0JaWYgKCoocHRyICsgMSkgPT0gJzonKSB7Ci0JCWlmICgqb3B0X3B0ciAhPSAnXDAnKSB7Ci0JCQlfUHlPU19vcHRhcmcgID0gb3B0X3B0cjsKLQkJCW9wdF9wdHIgPSAiIjsKLQkJfQorICAgIGlmICgqKHB0ciArIDEpID09ICc6JykgeworICAgICAgICBpZiAoKm9wdF9wdHIgIT0gJ1wwJykgeworICAgICAgICAgICAgX1B5T1Nfb3B0YXJnICA9IG9wdF9wdHI7CisgICAgICAgICAgICBvcHRfcHRyID0gIiI7CisgICAgICAgIH0KIAotCQllbHNlIHsKLQkJCWlmIChfUHlPU19vcHRpbmQgPj0gYXJnYykgewotCQkJCWlmIChfUHlPU19vcHRlcnIpCi0JCQkJCWZwcmludGYoc3RkZXJyLAotCQkJICAgICJBcmd1bWVudCBleHBlY3RlZCBmb3IgdGhlIC0lYyBvcHRpb25cbiIsIG9wdGlvbik7Ci0JCQkJcmV0dXJuICdfJzsKLQkJCX0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoX1B5T1Nfb3B0aW5kID49IGFyZ2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoX1B5T1Nfb3B0ZXJyKQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiQXJndW1lbnQgZXhwZWN0ZWQgZm9yIHRoZSAtJWMgb3B0aW9uXG4iLCBvcHRpb24pOworICAgICAgICAgICAgICAgIHJldHVybiAnXyc7CisgICAgICAgICAgICB9CiAKLQkJCV9QeU9TX29wdGFyZyA9IGFyZ3ZbX1B5T1Nfb3B0aW5kKytdOwotCQl9Ci0JfQorICAgICAgICAgICAgX1B5T1Nfb3B0YXJnID0gYXJndltfUHlPU19vcHRpbmQrK107CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gb3B0aW9uOworICAgIHJldHVybiBvcHRpb247CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydC5jIGIvUHl0aG9uL2ltcG9ydC5jCmluZGV4IGViNzMxZDAuLmRhNjYwY2YgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnQuYworKysgYi9QeXRob24vaW1wb3J0LmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2VuZGlmCiAjaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyAKK2V4dGVybiAiQyIgewogI2VuZGlmCiAKICNpZmRlZiBNU19XSU5ET1dTCkBAIC0yOCw3ICsyOCw3IEBACiAjZW5kaWYKIAogZXh0ZXJuIHRpbWVfdCBQeU9TX0dldExhc3RNb2RpZmljYXRpb25UaW1lKGNoYXIgKiwgRklMRSAqKTsKLQkJCQkJCS8qIEluIGdldG10aW1lLmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluIGdldG10aW1lLmMgKi8KIAogLyogTWFnaWMgd29yZCB0byByZWplY3QgLnB5YyBmaWxlcyBnZW5lcmF0ZWQgYnkgb3RoZXIgUHl0aG9uIHZlcnNpb25zLgogICAgSXQgc2hvdWxkIGNoYW5nZSBmb3IgZWFjaCBpbmNvbXBhdGlibGUgY2hhbmdlIHRvIHRoZSBieXRlY29kZS4KQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICBQeXRob24gMi41YjM6IDYyMTAxIChmaXggd3JvbmcgY29kZTogZm9yIHgsIGluIC4uLikKICAgICAgICBQeXRob24gMi41YjM6IDYyMTExIChmaXggd3JvbmcgY29kZTogeCArPSB5aWVsZCkKICAgICAgICBQeXRob24gMi41YzE6IDYyMTIxIChmaXggd3JvbmcgbG5vdGFiIHdpdGggZm9yIGxvb3BzIGFuZAotICAgICAgIAkJCSAgICBzdG9yaW5nIGNvbnN0YW50cyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yaW5nIGNvbnN0YW50cyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCkKICAgICAgICBQeXRob24gMi41YzI6IDYyMTMxIChmaXggd3JvbmcgY29kZTogZm9yIHgsIGluIC4uLiBpbiBsaXN0Y29tcC9nZW5leHApCiAgICAgICAgUHl0aG9uIDIuNmEwOiA2MjE1MSAocGVlcGhvbGUgb3B0aW1pemF0aW9ucyBhbmQgU1RPUkVfTUFQIG9wY29kZSkKICAgICAgICBQeXRob24gMi42YTE6IDYyMTYxIChXSVRIX0NMRUFOVVAgb3B0aW1pemF0aW9uKQpAQCAtOTUsMTggKzk1LDE4IEBACiAKICNpZmRlZiBSSVNDT1MKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyIF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWJbXSA9IHsKLQl7Ii9weSIsICJVIiwgUFlfU09VUkNFfSwKLQl7Ii9weWMiLCAicmIiLCBQWV9DT01QSUxFRH0sCi0JezAsIDB9CisgICAgeyIvcHkiLCAiVSIsIFBZX1NPVVJDRX0sCisgICAgeyIvcHljIiwgInJiIiwgUFlfQ09NUElMRUR9LAorICAgIHswLCAwfQogfTsKICNlbHNlCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiW10gPSB7Ci0JeyIucHkiLCAiVSIsIFBZX1NPVVJDRX0sCisgICAgeyIucHkiLCAiVSIsIFBZX1NPVVJDRX0sCiAjaWZkZWYgTVNfV0lORE9XUwotCXsiLnB5dyIsICJVIiwgUFlfU09VUkNFfSwKKyAgICB7Ii5weXciLCAiVSIsIFBZX1NPVVJDRX0sCiAjZW5kaWYKLQl7Ii5weWMiLCAicmIiLCBQWV9DT01QSUxFRH0sCi0JezAsIDB9CisgICAgeyIucHljIiwgInJiIiwgUFlfQ09NUElMRUR9LAorICAgIHswLCAwfQogfTsKICNlbmRpZgogCkBAIC0xMTYsMTMxICsxMTYsMTMxIEBACiB2b2lkCiBfUHlJbXBvcnRfSW5pdCh2b2lkKQogewotCWNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgKnNjYW47Ci0Jc3RydWN0IGZpbGVkZXNjciAqZmlsZXRhYjsKLQlpbnQgY291bnREID0gMDsKLQlpbnQgY291bnRTID0gMDsKKyAgICBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyICpzY2FuOworICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZpbGV0YWI7CisgICAgaW50IGNvdW50RCA9IDA7CisgICAgaW50IGNvdW50UyA9IDA7CiAKLQkvKiBwcmVwYXJlIF9QeUltcG9ydF9GaWxldGFiOiBjb3B5IGVudHJpZXMgZnJvbQotCSAgIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYiBhbmQgX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYi4KLQkgKi8KKyAgICAvKiBwcmVwYXJlIF9QeUltcG9ydF9GaWxldGFiOiBjb3B5IGVudHJpZXMgZnJvbQorICAgICAgIF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYiBhbmQgX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYi4KKyAgICAgKi8KICNpZmRlZiBIQVZFX0RZTkFNSUNfTE9BRElORwotCWZvciAoc2NhbiA9IF9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYjsgc2Nhbi0+c3VmZml4ICE9IE5VTEw7ICsrc2NhbikKLQkJKytjb3VudEQ7CisgICAgZm9yIChzY2FuID0gX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiOyBzY2FuLT5zdWZmaXggIT0gTlVMTDsgKytzY2FuKQorICAgICAgICArK2NvdW50RDsKICNlbmRpZgotCWZvciAoc2NhbiA9IF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWI7IHNjYW4tPnN1ZmZpeCAhPSBOVUxMOyArK3NjYW4pCi0JCSsrY291bnRTOwotCWZpbGV0YWIgPSBQeU1lbV9ORVcoc3RydWN0IGZpbGVkZXNjciwgY291bnREICsgY291bnRTICsgMSk7Ci0JaWYgKGZpbGV0YWIgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBpbXBvcnQgZmlsZSB0YWJsZS4iKTsKKyAgICBmb3IgKHNjYW4gPSBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiOyBzY2FuLT5zdWZmaXggIT0gTlVMTDsgKytzY2FuKQorICAgICAgICArK2NvdW50UzsKKyAgICBmaWxldGFiID0gUHlNZW1fTkVXKHN0cnVjdCBmaWxlZGVzY3IsIGNvdW50RCArIGNvdW50UyArIDEpOworICAgIGlmIChmaWxldGFiID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgaW1wb3J0IGZpbGUgdGFibGUuIik7CiAjaWZkZWYgSEFWRV9EWU5BTUlDX0xPQURJTkcKLQltZW1jcHkoZmlsZXRhYiwgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiLAotCSAgICAgICBjb3VudEQgKiBzaXplb2Yoc3RydWN0IGZpbGVkZXNjcikpOworICAgIG1lbWNweShmaWxldGFiLCBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWIsCisgICAgICAgICAgIGNvdW50RCAqIHNpemVvZihzdHJ1Y3QgZmlsZWRlc2NyKSk7CiAjZW5kaWYKLQltZW1jcHkoZmlsZXRhYiArIGNvdW50RCwgX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYiwKLQkgICAgICAgY291bnRTICogc2l6ZW9mKHN0cnVjdCBmaWxlZGVzY3IpKTsKLQlmaWxldGFiW2NvdW50RCArIGNvdW50U10uc3VmZml4ID0gTlVMTDsKKyAgICBtZW1jcHkoZmlsZXRhYiArIGNvdW50RCwgX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYiwKKyAgICAgICAgICAgY291bnRTICogc2l6ZW9mKHN0cnVjdCBmaWxlZGVzY3IpKTsKKyAgICBmaWxldGFiW2NvdW50RCArIGNvdW50U10uc3VmZml4ID0gTlVMTDsKIAotCV9QeUltcG9ydF9GaWxldGFiID0gZmlsZXRhYjsKKyAgICBfUHlJbXBvcnRfRmlsZXRhYiA9IGZpbGV0YWI7CiAKLQlpZiAoUHlfT3B0aW1pemVGbGFnKSB7Ci0JCS8qIFJlcGxhY2UgIi5weWMiIHdpdGggIi5weW8iIGluIF9QeUltcG9ydF9GaWxldGFiICovCi0JCWZvciAoOyBmaWxldGFiLT5zdWZmaXggIT0gTlVMTDsgZmlsZXRhYisrKSB7CisgICAgaWYgKFB5X09wdGltaXplRmxhZykgeworICAgICAgICAvKiBSZXBsYWNlICIucHljIiB3aXRoICIucHlvIiBpbiBfUHlJbXBvcnRfRmlsZXRhYiAqLworICAgICAgICBmb3IgKDsgZmlsZXRhYi0+c3VmZml4ICE9IE5VTEw7IGZpbGV0YWIrKykgewogI2lmbmRlZiBSSVNDT1MKLQkJCWlmIChzdHJjbXAoZmlsZXRhYi0+c3VmZml4LCAiLnB5YyIpID09IDApCi0JCQkJZmlsZXRhYi0+c3VmZml4ID0gIi5weW8iOworICAgICAgICAgICAgaWYgKHN0cmNtcChmaWxldGFiLT5zdWZmaXgsICIucHljIikgPT0gMCkKKyAgICAgICAgICAgICAgICBmaWxldGFiLT5zdWZmaXggPSAiLnB5byI7CiAjZWxzZQotCQkJaWYgKHN0cmNtcChmaWxldGFiLT5zdWZmaXgsICIvcHljIikgPT0gMCkKLQkJCQlmaWxldGFiLT5zdWZmaXggPSAiL3B5byI7CisgICAgICAgICAgICBpZiAoc3RyY21wKGZpbGV0YWItPnN1ZmZpeCwgIi9weWMiKSA9PSAwKQorICAgICAgICAgICAgICAgIGZpbGV0YWItPnN1ZmZpeCA9ICIvcHlvIjsKICNlbmRpZgotCQl9Ci0JfQorICAgICAgICB9CisgICAgfQogCi0JaWYgKFB5X1VuaWNvZGVGbGFnKSB7Ci0JCS8qIEZpeCB0aGUgcHljX21hZ2ljIHNvIHRoYXQgYnl0ZSBjb21waWxlZCBjb2RlIGNyZWF0ZWQKLQkJICAgdXNpbmcgdGhlIGFsbC1Vbmljb2RlIG1ldGhvZCBkb2Vzbid0IGludGVyZmVyZSB3aXRoCi0JCSAgIGNvZGUgY3JlYXRlZCBpbiBub3JtYWwgb3BlcmF0aW9uIG1vZGUuICovCi0JCXB5Y19tYWdpYyA9IE1BR0lDICsgMTsKLQl9CisgICAgaWYgKFB5X1VuaWNvZGVGbGFnKSB7CisgICAgICAgIC8qIEZpeCB0aGUgcHljX21hZ2ljIHNvIHRoYXQgYnl0ZSBjb21waWxlZCBjb2RlIGNyZWF0ZWQKKyAgICAgICAgICAgdXNpbmcgdGhlIGFsbC1Vbmljb2RlIG1ldGhvZCBkb2Vzbid0IGludGVyZmVyZSB3aXRoCisgICAgICAgICAgIGNvZGUgY3JlYXRlZCBpbiBub3JtYWwgb3BlcmF0aW9uIG1vZGUuICovCisgICAgICAgIHB5Y19tYWdpYyA9IE1BR0lDICsgMTsKKyAgICB9CiB9CiAKIHZvaWQKIF9QeUltcG9ydEhvb2tzX0luaXQodm9pZCkKIHsKLQlQeU9iamVjdCAqdiwgKnBhdGhfaG9va3MgPSBOVUxMLCAqemltcGltcG9ydDsKLQlpbnQgZXJyID0gMDsKKyAgICBQeU9iamVjdCAqdiwgKnBhdGhfaG9va3MgPSBOVUxMLCAqemltcGltcG9ydDsKKyAgICBpbnQgZXJyID0gMDsKIAotCS8qIGFkZGluZyBzeXMucGF0aF9ob29rcyBhbmQgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUsIHNldHRpbmcgdXAKLQkgICB6aXBpbXBvcnQgKi8KLQlpZiAoUHlUeXBlX1JlYWR5KCZQeU51bGxJbXBvcnRlcl9UeXBlKSA8IDApCi0JCWdvdG8gZXJyb3I7CisgICAgLyogYWRkaW5nIHN5cy5wYXRoX2hvb2tzIGFuZCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSwgc2V0dGluZyB1cAorICAgICAgIHppcGltcG9ydCAqLworICAgIGlmIChQeVR5cGVfUmVhZHkoJlB5TnVsbEltcG9ydGVyX1R5cGUpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWlmIChQeV9WZXJib3NlRmxhZykKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgaW5zdGFsbGluZyB6aXBpbXBvcnQgaG9va1xuIik7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyBpbnN0YWxsaW5nIHppcGltcG9ydCBob29rXG4iKTsKIAotCXYgPSBQeUxpc3RfTmV3KDApOwotCWlmICh2ID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0JZXJyID0gUHlTeXNfU2V0T2JqZWN0KCJtZXRhX3BhdGgiLCB2KTsKLQlQeV9ERUNSRUYodik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJvcjsKLQl2ID0gUHlEaWN0X05ldygpOwotCWlmICh2ID09IE5VTEwpCi0JCWdvdG8gZXJyb3I7Ci0JZXJyID0gUHlTeXNfU2V0T2JqZWN0KCJwYXRoX2ltcG9ydGVyX2NhY2hlIiwgdik7Ci0JUHlfREVDUkVGKHYpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyb3I7Ci0JcGF0aF9ob29rcyA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKHBhdGhfaG9va3MgPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQllcnIgPSBQeVN5c19TZXRPYmplY3QoInBhdGhfaG9va3MiLCBwYXRoX2hvb2tzKTsKLQlpZiAoZXJyKSB7CisgICAgdiA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBlcnIgPSBQeVN5c19TZXRPYmplY3QoIm1ldGFfcGF0aCIsIHYpOworICAgIFB5X0RFQ1JFRih2KTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHYgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBlcnIgPSBQeVN5c19TZXRPYmplY3QoInBhdGhfaW1wb3J0ZXJfY2FjaGUiLCB2KTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBwYXRoX2hvb2tzID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAocGF0aF9ob29rcyA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGVyciA9IFB5U3lzX1NldE9iamVjdCgicGF0aF9ob29rcyIsIHBhdGhfaG9va3MpOworICAgIGlmIChlcnIpIHsKICAgZXJyb3I6Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCVB5X0ZhdGFsRXJyb3IoImluaXRpYWxpemluZyBzeXMubWV0YV9wYXRoLCBzeXMucGF0aF9ob29rcywgIgotCQkJICAgICAgInBhdGhfaW1wb3J0ZXJfY2FjaGUsIG9yIE51bGxJbXBvcnRlciBmYWlsZWQiCi0JCQkgICAgICApOwotCX0KKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiaW5pdGlhbGl6aW5nIHN5cy5tZXRhX3BhdGgsIHN5cy5wYXRoX2hvb2tzLCAiCisgICAgICAgICAgICAgICAgICAgICAgInBhdGhfaW1wb3J0ZXJfY2FjaGUsIG9yIE51bGxJbXBvcnRlciBmYWlsZWQiCisgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9CiAKLQl6aW1waW1wb3J0ID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ6aXBpbXBvcnQiKTsKLQlpZiAoemltcGltcG9ydCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0NsZWFyKCk7IC8qIE5vIHppcCBpbXBvcnQgbW9kdWxlIC0tIG9rYXkgKi8KLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2FuJ3QgaW1wb3J0IHppcGltcG9ydFxuIik7Ci0JfQotCWVsc2UgewotCQlQeU9iamVjdCAqemlwaW1wb3J0ZXIgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHppbXBpbXBvcnQsCi0JCQkJCQkJICAgICAgICJ6aXBpbXBvcnRlciIpOwotCQlQeV9ERUNSRUYoemltcGltcG9ydCk7Ci0JCWlmICh6aXBpbXBvcnRlciA9PSBOVUxMKSB7Ci0JCQlQeUVycl9DbGVhcigpOyAvKiBObyB6aXBpbXBvcnRlciBvYmplY3QgLS0gb2theSAqLwotCQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJCSAgICAiIyBjYW4ndCBpbXBvcnQgemlwaW1wb3J0LnppcGltcG9ydGVyXG4iKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qIHN5cy5wYXRoX2hvb2tzLmFwcGVuZCh6aXBpbXBvcnRlcikgKi8KLQkJCWVyciA9IFB5TGlzdF9BcHBlbmQocGF0aF9ob29rcywgemlwaW1wb3J0ZXIpOwotCQkJUHlfREVDUkVGKHppcGltcG9ydGVyKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBlcnJvcjsKLQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQlQeVN5c19Xcml0ZVN0ZGVycigKLQkJCQkJIiMgaW5zdGFsbGVkIHppcGltcG9ydCBob29rXG4iKTsKLQkJfQotCX0KLQlQeV9ERUNSRUYocGF0aF9ob29rcyk7CisgICAgemltcGltcG9ydCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiemlwaW1wb3J0Iik7CisgICAgaWYgKHppbXBpbXBvcnQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBObyB6aXAgaW1wb3J0IG1vZHVsZSAtLSBva2F5ICovCisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIGNhbid0IGltcG9ydCB6aXBpbXBvcnRcbiIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKnppcGltcG9ydGVyID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh6aW1waW1wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ6aXBpbXBvcnRlciIpOworICAgICAgICBQeV9ERUNSRUYoemltcGltcG9ydCk7CisgICAgICAgIGlmICh6aXBpbXBvcnRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBObyB6aXBpbXBvcnRlciBvYmplY3QgLS0gb2theSAqLworICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKAorICAgICAgICAgICAgICAgICAgICAiIyBjYW4ndCBpbXBvcnQgemlwaW1wb3J0LnppcGltcG9ydGVyXG4iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIHN5cy5wYXRoX2hvb2tzLmFwcGVuZCh6aXBpbXBvcnRlcikgKi8KKyAgICAgICAgICAgIGVyciA9IFB5TGlzdF9BcHBlbmQocGF0aF9ob29rcywgemlwaW1wb3J0ZXIpOworICAgICAgICAgICAgUHlfREVDUkVGKHppcGltcG9ydGVyKTsKKyAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigKKyAgICAgICAgICAgICAgICAgICAgIiMgaW5zdGFsbGVkIHppcGltcG9ydCBob29rXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9ERUNSRUYocGF0aF9ob29rcyk7CiB9CiAKIHZvaWQKIF9QeUltcG9ydF9GaW5pKHZvaWQpCiB7Ci0JUHlfWERFQ1JFRihleHRlbnNpb25zKTsKLQlleHRlbnNpb25zID0gTlVMTDsKLQlQeU1lbV9ERUwoX1B5SW1wb3J0X0ZpbGV0YWIpOwotCV9QeUltcG9ydF9GaWxldGFiID0gTlVMTDsKKyAgICBQeV9YREVDUkVGKGV4dGVuc2lvbnMpOworICAgIGV4dGVuc2lvbnMgPSBOVUxMOworICAgIFB5TWVtX0RFTChfUHlJbXBvcnRfRmlsZXRhYik7CisgICAgX1B5SW1wb3J0X0ZpbGV0YWIgPSBOVUxMOwogfQogCiAKQEAgLTI1OSw0MiArMjU5LDQyIEBACiB2b2lkCiBfUHlJbXBvcnRfQWNxdWlyZUxvY2sodm9pZCkKIHsKLQlsb25nIG1lID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCWlmIChtZSA9PSAtMSkKLQkJcmV0dXJuOyAvKiBUb28gYmFkICovCi0JaWYgKGltcG9ydF9sb2NrID09IE5VTEwpIHsKLQkJaW1wb3J0X2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JCWlmIChpbXBvcnRfbG9jayA9PSBOVUxMKQotCQkJcmV0dXJuOyAgLyogTm90aGluZyBtdWNoIHdlIGNhbiBkby4gKi8KLQl9Ci0JaWYgKGltcG9ydF9sb2NrX3RocmVhZCA9PSBtZSkgewotCQlpbXBvcnRfbG9ja19sZXZlbCsrOwotCQlyZXR1cm47Ci0JfQotCWlmIChpbXBvcnRfbG9ja190aHJlYWQgIT0gLTEgfHwgIVB5VGhyZWFkX2FjcXVpcmVfbG9jayhpbXBvcnRfbG9jaywgMCkpCi0JewotCQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOwotCQlQeVRocmVhZF9hY3F1aXJlX2xvY2soaW1wb3J0X2xvY2ssIDEpOwotCQlQeUV2YWxfUmVzdG9yZVRocmVhZCh0c3RhdGUpOwotCX0KLQlpbXBvcnRfbG9ja190aHJlYWQgPSBtZTsKLQlpbXBvcnRfbG9ja19sZXZlbCA9IDE7CisgICAgbG9uZyBtZSA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBpZiAobWUgPT0gLTEpCisgICAgICAgIHJldHVybjsgLyogVG9vIGJhZCAqLworICAgIGlmIChpbXBvcnRfbG9jayA9PSBOVUxMKSB7CisgICAgICAgIGltcG9ydF9sb2NrID0gUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpOworICAgICAgICBpZiAoaW1wb3J0X2xvY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsgIC8qIE5vdGhpbmcgbXVjaCB3ZSBjYW4gZG8uICovCisgICAgfQorICAgIGlmIChpbXBvcnRfbG9ja190aHJlYWQgPT0gbWUpIHsKKyAgICAgICAgaW1wb3J0X2xvY2tfbGV2ZWwrKzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoaW1wb3J0X2xvY2tfdGhyZWFkICE9IC0xIHx8ICFQeVRocmVhZF9hY3F1aXJlX2xvY2soaW1wb3J0X2xvY2ssIDApKQorICAgIHsKKyAgICAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKKyAgICAgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGltcG9ydF9sb2NrLCAxKTsKKyAgICAgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQodHN0YXRlKTsKKyAgICB9CisgICAgaW1wb3J0X2xvY2tfdGhyZWFkID0gbWU7CisgICAgaW1wb3J0X2xvY2tfbGV2ZWwgPSAxOwogfQogCiBpbnQKIF9QeUltcG9ydF9SZWxlYXNlTG9jayh2b2lkKQogewotCWxvbmcgbWUgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7Ci0JaWYgKG1lID09IC0xIHx8IGltcG9ydF9sb2NrID09IE5VTEwpCi0JCXJldHVybiAwOyAvKiBUb28gYmFkICovCi0JaWYgKGltcG9ydF9sb2NrX3RocmVhZCAhPSBtZSkKLQkJcmV0dXJuIC0xOwotCWltcG9ydF9sb2NrX2xldmVsLS07Ci0JaWYgKGltcG9ydF9sb2NrX2xldmVsID09IDApIHsKLQkJaW1wb3J0X2xvY2tfdGhyZWFkID0gLTE7Ci0JCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbXBvcnRfbG9jayk7Ci0JfQotCXJldHVybiAxOworICAgIGxvbmcgbWUgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CisgICAgaWYgKG1lID09IC0xIHx8IGltcG9ydF9sb2NrID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOyAvKiBUb28gYmFkICovCisgICAgaWYgKGltcG9ydF9sb2NrX3RocmVhZCAhPSBtZSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGltcG9ydF9sb2NrX2xldmVsLS07CisgICAgaWYgKGltcG9ydF9sb2NrX2xldmVsID09IDApIHsKKyAgICAgICAgaW1wb3J0X2xvY2tfdGhyZWFkID0gLTE7CisgICAgICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhpbXBvcnRfbG9jayk7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIFB5T1NfQWZ0ZXJGb3JrIHRvIGVuc3VyZSB0aGF0IG5ld2x5CkBAIC0zMDUsMTAgKzMwNSwxMCBAQAogdm9pZAogX1B5SW1wb3J0X1JlSW5pdExvY2sodm9pZCkKIHsKLSAJaWYgKGltcG9ydF9sb2NrICE9IE5VTEwpCi0gCQlpbXBvcnRfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKLSAJaW1wb3J0X2xvY2tfdGhyZWFkID0gLTE7Ci0gCWltcG9ydF9sb2NrX2xldmVsID0gMDsKKyAgICBpZiAoaW1wb3J0X2xvY2sgIT0gTlVMTCkKKyAgICAgICAgaW1wb3J0X2xvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgaW1wb3J0X2xvY2tfdGhyZWFkID0gLTE7CisgICAgaW1wb3J0X2xvY2tfbGV2ZWwgPSAwOwogfQogCiAjZW5kaWYKQEAgLTMxNyw5ICszMTcsOSBAQAogaW1wX2xvY2tfaGVsZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoaW1wb3J0X2xvY2tfdGhyZWFkICE9IC0xKTsKKyAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGltcG9ydF9sb2NrX3RocmVhZCAhPSAtMSk7CiAjZWxzZQotCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKICNlbmRpZgogfQogCkBAIC0zMjcsMzIgKzMyNywzMiBAQAogaW1wX2FjcXVpcmVfbG9jayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm5vYXJncykKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCV9QeUltcG9ydF9BY3F1aXJlTG9jaygpOworICAgIF9QeUltcG9ydF9BY3F1aXJlTG9jaygpOwogI2VuZGlmCi0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9yZWxlYXNlX2xvY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoX1B5SW1wb3J0X1JlbGVhc2VMb2NrKCkgPCAwKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJIm5vdCBob2xkaW5nIHRoZSBpbXBvcnQgbG9jayIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKF9QeUltcG9ydF9SZWxlYXNlTG9jaygpIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBob2xkaW5nIHRoZSBpbXBvcnQgbG9jayIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAjZW5kaWYKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgdm9pZAogaW1wX21vZHVsZXNfcmVsb2FkaW5nX2NsZWFyKHZvaWQpCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dldCgpLT5pbnRlcnA7Ci0JaWYgKGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcgIT0gTlVMTCkKLQkJUHlEaWN0X0NsZWFyKGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcpOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HZXQoKS0+aW50ZXJwOworICAgIGlmIChpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nICE9IE5VTEwpCisgICAgICAgIFB5RGljdF9DbGVhcihpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nKTsKIH0KIAogLyogSGVscGVyIGZvciBzeXMgKi8KQEAgLTM2MCwyOSArMzYwLDI5IEBACiBQeU9iamVjdCAqCiBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KHZvaWQpCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7Ci0JaWYgKGludGVycC0+bW9kdWxlcyA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeUltcG9ydF9HZXRNb2R1bGVEaWN0OiBubyBtb2R1bGUgZGljdGlvbmFyeSEiKTsKLQlyZXR1cm4gaW50ZXJwLT5tb2R1bGVzOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOworICAgIGlmIChpbnRlcnAtPm1vZHVsZXMgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlJbXBvcnRfR2V0TW9kdWxlRGljdDogbm8gbW9kdWxlIGRpY3Rpb25hcnkhIik7CisgICAgcmV0dXJuIGludGVycC0+bW9kdWxlczsKIH0KIAogCiAvKiBMaXN0IG9mIG5hbWVzIHRvIGNsZWFyIGluIHN5cyAqLwogc3RhdGljIGNoYXIqIHN5c19kZWxldGVzW10gPSB7Ci0JInBhdGgiLCAiYXJndiIsICJwczEiLCAicHMyIiwgImV4aXRmdW5jIiwKLQkiZXhjX3R5cGUiLCAiZXhjX3ZhbHVlIiwgImV4Y190cmFjZWJhY2siLAotCSJsYXN0X3R5cGUiLCAibGFzdF92YWx1ZSIsICJsYXN0X3RyYWNlYmFjayIsCi0JInBhdGhfaG9va3MiLCAicGF0aF9pbXBvcnRlcl9jYWNoZSIsICJtZXRhX3BhdGgiLAotCS8qIG1pc2Mgc3R1ZmYgKi8KLQkiZmxhZ3MiLCAiZmxvYXRfaW5mbyIsCi0JTlVMTAorICAgICJwYXRoIiwgImFyZ3YiLCAicHMxIiwgInBzMiIsICJleGl0ZnVuYyIsCisgICAgImV4Y190eXBlIiwgImV4Y192YWx1ZSIsICJleGNfdHJhY2ViYWNrIiwKKyAgICAibGFzdF90eXBlIiwgImxhc3RfdmFsdWUiLCAibGFzdF90cmFjZWJhY2siLAorICAgICJwYXRoX2hvb2tzIiwgInBhdGhfaW1wb3J0ZXJfY2FjaGUiLCAibWV0YV9wYXRoIiwKKyAgICAvKiBtaXNjIHN0dWZmICovCisgICAgImZsYWdzIiwgImZsb2F0X2luZm8iLAorICAgIE5VTEwKIH07CiAKIHN0YXRpYyBjaGFyKiBzeXNfZmlsZXNbXSA9IHsKLQkic3RkaW4iLCAiX19zdGRpbl9fIiwKLQkic3Rkb3V0IiwgIl9fc3Rkb3V0X18iLAotCSJzdGRlcnIiLCAiX19zdGRlcnJfXyIsCi0JTlVMTAorICAgICJzdGRpbiIsICJfX3N0ZGluX18iLAorICAgICJzdGRvdXQiLCAiX19zdGRvdXRfXyIsCisgICAgInN0ZGVyciIsICJfX3N0ZGVycl9fIiwKKyAgICBOVUxMCiB9OwogCiAKQEAgLTM5MSwxMzIgKzM5MSwxMzIgQEAKIHZvaWQKIFB5SW1wb3J0X0NsZWFudXAodm9pZCkKIHsKLQlQeV9zc2l6ZV90IHBvcywgbmRvbmU7Ci0JY2hhciAqbmFtZTsKLQlQeU9iamVjdCAqa2V5LCAqdmFsdWUsICpkaWN0OwotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOwotCVB5T2JqZWN0ICptb2R1bGVzID0gaW50ZXJwLT5tb2R1bGVzOworICAgIFB5X3NzaXplX3QgcG9zLCBuZG9uZTsKKyAgICBjaGFyICpuYW1lOworICAgIFB5T2JqZWN0ICprZXksICp2YWx1ZSwgKmRpY3Q7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBpbnRlcnAtPm1vZHVsZXM7CiAKLQlpZiAobW9kdWxlcyA9PSBOVUxMKQotCQlyZXR1cm47IC8qIEFscmVhZHkgZG9uZSAqLworICAgIGlmIChtb2R1bGVzID09IE5VTEwpCisgICAgICAgIHJldHVybjsgLyogQWxyZWFkeSBkb25lICovCiAKLQkvKiBEZWxldGUgc29tZSBzcGVjaWFsIHZhcmlhYmxlcyBmaXJzdC4gIFRoZXNlIGFyZSBjb21tb24KLQkgICBwbGFjZXMgd2hlcmUgdXNlciB2YWx1ZXMgaGlkZSBhbmQgcGVvcGxlIGNvbXBsYWluIHdoZW4gdGhlaXIKLQkgICBkZXN0cnVjdG9ycyBmYWlsLiAgU2luY2UgdGhlIG1vZHVsZXMgY29udGFpbmluZyB0aGVtIGFyZQotCSAgIGRlbGV0ZWQgKmxhc3QqIG9mIGFsbCwgdGhleSB3b3VsZCBjb21lIHRvbyBsYXRlIGluIHRoZSBub3JtYWwKLQkgICBkZXN0cnVjdGlvbiBvcmRlci4gIFNpZ2guICovCisgICAgLyogRGVsZXRlIHNvbWUgc3BlY2lhbCB2YXJpYWJsZXMgZmlyc3QuICBUaGVzZSBhcmUgY29tbW9uCisgICAgICAgcGxhY2VzIHdoZXJlIHVzZXIgdmFsdWVzIGhpZGUgYW5kIHBlb3BsZSBjb21wbGFpbiB3aGVuIHRoZWlyCisgICAgICAgZGVzdHJ1Y3RvcnMgZmFpbC4gIFNpbmNlIHRoZSBtb2R1bGVzIGNvbnRhaW5pbmcgdGhlbSBhcmUKKyAgICAgICBkZWxldGVkICpsYXN0KiBvZiBhbGwsIHRoZXkgd291bGQgY29tZSB0b28gbGF0ZSBpbiB0aGUgbm9ybWFsCisgICAgICAgZGVzdHJ1Y3Rpb24gb3JkZXIuICBTaWdoLiAqLwogCi0JdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCAiX19idWlsdGluX18iKTsKLQlpZiAodmFsdWUgIT0gTlVMTCAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKLQkJZGljdCA9IFB5TW9kdWxlX0dldERpY3QodmFsdWUpOwotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhciBfX2J1aWx0aW5fXy5fXG4iKTsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgIl8iLCBQeV9Ob25lKTsKLQl9Ci0JdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCAic3lzIik7Ci0JaWYgKHZhbHVlICE9IE5VTEwgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7Ci0JCWNoYXIgKipwOwotCQlQeU9iamVjdCAqdjsKLQkJZGljdCA9IFB5TW9kdWxlX0dldERpY3QodmFsdWUpOwotCQlmb3IgKHAgPSBzeXNfZGVsZXRlczsgKnAgIT0gTlVMTDsgcCsrKSB7Ci0JCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYXIgc3lzLiVzXG4iLCAqcCk7Ci0JCQlQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAqcCwgUHlfTm9uZSk7Ci0JCX0KLQkJZm9yIChwID0gc3lzX2ZpbGVzOyAqcCAhPSBOVUxMOyBwKz0yKSB7Ci0JCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgcmVzdG9yZSBzeXMuJXNcbiIsICpwKTsKLQkJCXYgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAqKHArMSkpOwotCQkJaWYgKHYgPT0gTlVMTCkKLQkJCQl2ID0gUHlfTm9uZTsKLQkJCVB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICpwLCB2KTsKLQkJfQotCX0KKyAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX2J1aWx0aW5fXyIpOworICAgIGlmICh2YWx1ZSAhPSBOVUxMICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICBkaWN0ID0gUHlNb2R1bGVfR2V0RGljdCh2YWx1ZSk7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFyIF9fYnVpbHRpbl9fLl9cbiIpOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiXyIsIFB5X05vbmUpOworICAgIH0KKyAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJzeXMiKTsKKyAgICBpZiAodmFsdWUgIT0gTlVMTCAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgY2hhciAqKnA7CisgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICBkaWN0ID0gUHlNb2R1bGVfR2V0RGljdCh2YWx1ZSk7CisgICAgICAgIGZvciAocCA9IHN5c19kZWxldGVzOyAqcCAhPSBOVUxMOyBwKyspIHsKKyAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhciBzeXMuJXNcbiIsICpwKTsKKyAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICpwLCBQeV9Ob25lKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHAgPSBzeXNfZmlsZXM7ICpwICE9IE5VTEw7IHArPTIpIHsKKyAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyByZXN0b3JlIHN5cy4lc1xuIiwgKnApOworICAgICAgICAgICAgdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICoocCsxKSk7CisgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHYgPSBQeV9Ob25lOworICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgKnAsIHYpOworICAgICAgICB9CisgICAgfQogCi0JLyogRmlyc3QsIGRlbGV0ZSBfX21haW5fXyAqLwotCXZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fbWFpbl9fIik7Ci0JaWYgKHZhbHVlICE9IE5VTEwgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFudXAgX19tYWluX19cbiIpOwotCQlfUHlNb2R1bGVfQ2xlYXIodmFsdWUpOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCAiX19tYWluX18iLCBQeV9Ob25lKTsKLQl9CisgICAgLyogRmlyc3QsIGRlbGV0ZSBfX21haW5fXyAqLworICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fbWFpbl9fIik7CisgICAgaWYgKHZhbHVlICE9IE5VTEwgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFudXAgX19tYWluX19cbiIpOworICAgICAgICBfUHlNb2R1bGVfQ2xlYXIodmFsdWUpOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCAiX19tYWluX18iLCBQeV9Ob25lKTsKKyAgICB9CiAKLQkvKiBUaGUgc3BlY2lhbCB0cmVhdG1lbnQgb2YgX19idWlsdGluX18gaGVyZSBpcyBiZWNhdXNlIGV2ZW4KLQkgICB3aGVuIGl0J3Mgbm90IHJlZmVyZW5jZWQgYXMgYSBtb2R1bGUsIGl0cyBkaWN0aW9uYXJ5IGlzCi0JICAgcmVmZXJlbmNlZCBieSBhbG1vc3QgZXZlcnkgbW9kdWxlJ3MgX19idWlsdGluc19fLiAgU2luY2UKLQkgICBkZWxldGluZyBhIG1vZHVsZSBjbGVhcnMgaXRzIGRpY3Rpb25hcnkgKGV2ZW4gaWYgdGhlcmUgYXJlCi0JICAgcmVmZXJlbmNlcyBsZWZ0IHRvIGl0KSwgd2UgbmVlZCB0byBkZWxldGUgdGhlIF9fYnVpbHRpbl9fCi0JICAgbW9kdWxlIGxhc3QuICBMaWtld2lzZSwgd2UgZG9uJ3QgZGVsZXRlIHN5cyB1bnRpbCB0aGUgdmVyeQotCSAgIGVuZCBiZWNhdXNlIGl0IGlzIGltcGxpY2l0bHkgcmVmZXJlbmNlZCAoZS5nLiBieSBwcmludCkuCisgICAgLyogVGhlIHNwZWNpYWwgdHJlYXRtZW50IG9mIF9fYnVpbHRpbl9fIGhlcmUgaXMgYmVjYXVzZSBldmVuCisgICAgICAgd2hlbiBpdCdzIG5vdCByZWZlcmVuY2VkIGFzIGEgbW9kdWxlLCBpdHMgZGljdGlvbmFyeSBpcworICAgICAgIHJlZmVyZW5jZWQgYnkgYWxtb3N0IGV2ZXJ5IG1vZHVsZSdzIF9fYnVpbHRpbnNfXy4gIFNpbmNlCisgICAgICAgZGVsZXRpbmcgYSBtb2R1bGUgY2xlYXJzIGl0cyBkaWN0aW9uYXJ5IChldmVuIGlmIHRoZXJlIGFyZQorICAgICAgIHJlZmVyZW5jZXMgbGVmdCB0byBpdCksIHdlIG5lZWQgdG8gZGVsZXRlIHRoZSBfX2J1aWx0aW5fXworICAgICAgIG1vZHVsZSBsYXN0LiAgTGlrZXdpc2UsIHdlIGRvbid0IGRlbGV0ZSBzeXMgdW50aWwgdGhlIHZlcnkKKyAgICAgICBlbmQgYmVjYXVzZSBpdCBpcyBpbXBsaWNpdGx5IHJlZmVyZW5jZWQgKGUuZy4gYnkgcHJpbnQpLgogCi0JICAgQWxzbyBub3RlIHRoYXQgd2UgJ2RlbGV0ZScgbW9kdWxlcyBieSByZXBsYWNpbmcgdGhlaXIgZW50cnkKLQkgICBpbiB0aGUgbW9kdWxlcyBkaWN0IHdpdGggTm9uZSwgcmF0aGVyIHRoYW4gcmVhbGx5IGRlbGV0aW5nCi0JICAgdGhlbTsgdGhpcyBhdm9pZHMgYSByZWhhc2ggb2YgdGhlIG1vZHVsZXMgZGljdGlvbmFyeSBhbmQKLQkgICBhbHNvIG1hcmtzIHRoZW0gYXMgIm5vbiBleGlzdGVudCIgc28gdGhleSB3b24ndCBiZQotCSAgIHJlLWltcG9ydGVkLiAqLworICAgICAgIEFsc28gbm90ZSB0aGF0IHdlICdkZWxldGUnIG1vZHVsZXMgYnkgcmVwbGFjaW5nIHRoZWlyIGVudHJ5CisgICAgICAgaW4gdGhlIG1vZHVsZXMgZGljdCB3aXRoIE5vbmUsIHJhdGhlciB0aGFuIHJlYWxseSBkZWxldGluZworICAgICAgIHRoZW07IHRoaXMgYXZvaWRzIGEgcmVoYXNoIG9mIHRoZSBtb2R1bGVzIGRpY3Rpb25hcnkgYW5kCisgICAgICAgYWxzbyBtYXJrcyB0aGVtIGFzICJub24gZXhpc3RlbnQiIHNvIHRoZXkgd29uJ3QgYmUKKyAgICAgICByZS1pbXBvcnRlZC4gKi8KIAotCS8qIE5leHQsIHJlcGVhdGVkbHkgZGVsZXRlIG1vZHVsZXMgd2l0aCBhIHJlZmVyZW5jZSBjb3VudCBvZgotCSAgIG9uZSAoc2tpcHBpbmcgX19idWlsdGluX18gYW5kIHN5cykgYW5kIGRlbGV0ZSB0aGVtICovCi0JZG8gewotCQluZG9uZSA9IDA7Ci0JCXBvcyA9IDA7Ci0JCXdoaWxlIChQeURpY3RfTmV4dChtb2R1bGVzLCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCQlpZiAodmFsdWUtPm9iX3JlZmNudCAhPSAxKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKFB5U3RyaW5nX0NoZWNrKGtleSkgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7Ci0JCQkJbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhrZXkpOwotCQkJCWlmIChzdHJjbXAobmFtZSwgIl9fYnVpbHRpbl9fIikgPT0gMCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKHN0cmNtcChuYW1lLCAic3lzIikgPT0gMCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJCQlQeVN5c19Xcml0ZVN0ZGVycigKLQkJCQkJCSIjIGNsZWFudXBbMV0gJXNcbiIsIG5hbWUpOwotCQkJCV9QeU1vZHVsZV9DbGVhcih2YWx1ZSk7Ci0JCQkJUHlEaWN0X1NldEl0ZW0obW9kdWxlcywga2V5LCBQeV9Ob25lKTsKLQkJCQluZG9uZSsrOwotCQkJfQotCQl9Ci0JfSB3aGlsZSAobmRvbmUgPiAwKTsKKyAgICAvKiBOZXh0LCByZXBlYXRlZGx5IGRlbGV0ZSBtb2R1bGVzIHdpdGggYSByZWZlcmVuY2UgY291bnQgb2YKKyAgICAgICBvbmUgKHNraXBwaW5nIF9fYnVpbHRpbl9fIGFuZCBzeXMpIGFuZCBkZWxldGUgdGhlbSAqLworICAgIGRvIHsKKyAgICAgICAgbmRvbmUgPSAwOworICAgICAgICBwb3MgPSAwOworICAgICAgICB3aGlsZSAoUHlEaWN0X05leHQobW9kdWxlcywgJnBvcywgJmtleSwgJnZhbHVlKSkgeworICAgICAgICAgICAgaWYgKHZhbHVlLT5vYl9yZWZjbnQgIT0gMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChQeVN0cmluZ19DaGVjayhrZXkpICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoa2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKG5hbWUsICJfX2J1aWx0aW5fXyIpID09IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgInN5cyIpID09IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoCisgICAgICAgICAgICAgICAgICAgICAgICAiIyBjbGVhbnVwWzFdICVzXG4iLCBuYW1lKTsKKyAgICAgICAgICAgICAgICBfUHlNb2R1bGVfQ2xlYXIodmFsdWUpOworICAgICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtKG1vZHVsZXMsIGtleSwgUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgbmRvbmUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gd2hpbGUgKG5kb25lID4gMCk7CiAKLQkvKiBOZXh0LCBkZWxldGUgYWxsIG1vZHVsZXMgKHN0aWxsIHNraXBwaW5nIF9fYnVpbHRpbl9fIGFuZCBzeXMpICovCi0JcG9zID0gMDsKLQl3aGlsZSAoUHlEaWN0X05leHQobW9kdWxlcywgJnBvcywgJmtleSwgJnZhbHVlKSkgewotCQlpZiAoUHlTdHJpbmdfQ2hlY2soa2V5KSAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKLQkJCW5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoa2V5KTsKLQkJCWlmIChzdHJjbXAobmFtZSwgIl9fYnVpbHRpbl9fIikgPT0gMCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChzdHJjbXAobmFtZSwgInN5cyIpID09IDApCi0JCQkJY29udGludWU7Ci0JCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYW51cFsyXSAlc1xuIiwgbmFtZSk7Ci0JCQlfUHlNb2R1bGVfQ2xlYXIodmFsdWUpOwotCQkJUHlEaWN0X1NldEl0ZW0obW9kdWxlcywga2V5LCBQeV9Ob25lKTsKLQkJfQotCX0KKyAgICAvKiBOZXh0LCBkZWxldGUgYWxsIG1vZHVsZXMgKHN0aWxsIHNraXBwaW5nIF9fYnVpbHRpbl9fIGFuZCBzeXMpICovCisgICAgcG9zID0gMDsKKyAgICB3aGlsZSAoUHlEaWN0X05leHQobW9kdWxlcywgJnBvcywgJmtleSwgJnZhbHVlKSkgeworICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soa2V5KSAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoa2V5KTsKKyAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgIl9fYnVpbHRpbl9fIikgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChzdHJjbXAobmFtZSwgInN5cyIpID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYW51cFsyXSAlc1xuIiwgbmFtZSk7CisgICAgICAgICAgICBfUHlNb2R1bGVfQ2xlYXIodmFsdWUpOworICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW0obW9kdWxlcywga2V5LCBQeV9Ob25lKTsKKyAgICAgICAgfQorICAgIH0KIAotCS8qIE5leHQsIGRlbGV0ZSBzeXMgYW5kIF9fYnVpbHRpbl9fIChpbiB0aGF0IG9yZGVyKSAqLwotCXZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgInN5cyIpOwotCWlmICh2YWx1ZSAhPSBOVUxMICYmIFB5TW9kdWxlX0NoZWNrKHZhbHVlKSkgewotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeVN5c19Xcml0ZVN0ZGVycigiIyBjbGVhbnVwIHN5c1xuIik7Ci0JCV9QeU1vZHVsZV9DbGVhcih2YWx1ZSk7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJzeXMiLCBQeV9Ob25lKTsKLQl9Ci0JdmFsdWUgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCAiX19idWlsdGluX18iKTsKLQlpZiAodmFsdWUgIT0gTlVMTCAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYW51cCBfX2J1aWx0aW5fX1xuIik7Ci0JCV9QeU1vZHVsZV9DbGVhcih2YWx1ZSk7Ci0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJfX2J1aWx0aW5fXyIsIFB5X05vbmUpOwotCX0KKyAgICAvKiBOZXh0LCBkZWxldGUgc3lzIGFuZCBfX2J1aWx0aW5fXyAoaW4gdGhhdCBvcmRlcikgKi8KKyAgICB2YWx1ZSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsICJzeXMiKTsKKyAgICBpZiAodmFsdWUgIT0gTlVMTCAmJiBQeU1vZHVsZV9DaGVjayh2YWx1ZSkpIHsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2xlYW51cCBzeXNcbiIpOworICAgICAgICBfUHlNb2R1bGVfQ2xlYXIodmFsdWUpOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCAic3lzIiwgUHlfTm9uZSk7CisgICAgfQorICAgIHZhbHVlID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fYnVpbHRpbl9fIik7CisgICAgaWYgKHZhbHVlICE9IE5VTEwgJiYgUHlNb2R1bGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIGNsZWFudXAgX19idWlsdGluX19cbiIpOworICAgICAgICBfUHlNb2R1bGVfQ2xlYXIodmFsdWUpOworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzLCAiX19idWlsdGluX18iLCBQeV9Ob25lKTsKKyAgICB9CiAKLQkvKiBGaW5hbGx5LCBjbGVhciBhbmQgZGVsZXRlIHRoZSBtb2R1bGVzIGRpcmVjdG9yeSAqLwotCVB5RGljdF9DbGVhcihtb2R1bGVzKTsKLQlpbnRlcnAtPm1vZHVsZXMgPSBOVUxMOwotCVB5X0RFQ1JFRihtb2R1bGVzKTsKLQlQeV9DTEVBUihpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nKTsKKyAgICAvKiBGaW5hbGx5LCBjbGVhciBhbmQgZGVsZXRlIHRoZSBtb2R1bGVzIGRpcmVjdG9yeSAqLworICAgIFB5RGljdF9DbGVhcihtb2R1bGVzKTsKKyAgICBpbnRlcnAtPm1vZHVsZXMgPSBOVUxMOworICAgIFB5X0RFQ1JFRihtb2R1bGVzKTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nKTsKIH0KIAogCkBAIC01MjUsNyArNTI1LDcgQEAKIGxvbmcKIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKHZvaWQpCiB7Ci0JcmV0dXJuIHB5Y19tYWdpYzsKKyAgICByZXR1cm4gcHljX21hZ2ljOwogfQogCiAKQEAgLTU0Miw1MSArNTQyLDUxIEBACiBQeU9iamVjdCAqCiBfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oY2hhciAqbmFtZSwgY2hhciAqZmlsZW5hbWUpCiB7Ci0JUHlPYmplY3QgKm1vZHVsZXMsICptb2QsICpkaWN0LCAqY29weTsKLQlpZiAoZXh0ZW5zaW9ucyA9PSBOVUxMKSB7Ci0JCWV4dGVuc2lvbnMgPSBQeURpY3RfTmV3KCk7Ci0JCWlmIChleHRlbnNpb25zID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQltb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKTsKLQlpZiAobW9kID09IE5VTEwgfHwgIVB5TW9kdWxlX0NoZWNrKG1vZCkpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAotCQkgICJfUHlJbXBvcnRfRml4dXBFeHRlbnNpb246IG1vZHVsZSAlLjIwMHMgbm90IGxvYWRlZCIsIG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKLQlpZiAoZGljdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQljb3B5ID0gUHlEaWN0X0NvcHkoZGljdCk7Ci0JaWYgKGNvcHkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoZXh0ZW5zaW9ucywgZmlsZW5hbWUsIGNvcHkpOwotCVB5X0RFQ1JFRihjb3B5KTsKLQlyZXR1cm4gY29weTsKKyAgICBQeU9iamVjdCAqbW9kdWxlcywgKm1vZCwgKmRpY3QsICpjb3B5OworICAgIGlmIChleHRlbnNpb25zID09IE5VTEwpIHsKKyAgICAgICAgZXh0ZW5zaW9ucyA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKGV4dGVuc2lvbnMgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworICAgIG1vZCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpOworICAgIGlmIChtb2QgPT0gTlVMTCB8fCAhUHlNb2R1bGVfQ2hlY2sobW9kKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgIl9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbjogbW9kdWxlICUuMjAwcyBub3QgbG9hZGVkIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtb2QpOworICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNvcHkgPSBQeURpY3RfQ29weShkaWN0KTsKKyAgICBpZiAoY29weSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhleHRlbnNpb25zLCBmaWxlbmFtZSwgY29weSk7CisgICAgUHlfREVDUkVGKGNvcHkpOworICAgIHJldHVybiBjb3B5OwogfQogCiBQeU9iamVjdCAqCiBfUHlJbXBvcnRfRmluZEV4dGVuc2lvbihjaGFyICpuYW1lLCBjaGFyICpmaWxlbmFtZSkKIHsKLQlQeU9iamVjdCAqZGljdCwgKm1vZCwgKm1kaWN0OwotCWlmIChleHRlbnNpb25zID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWRpY3QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhleHRlbnNpb25zLCBmaWxlbmFtZSk7Ci0JaWYgKGRpY3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbW9kID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOwotCWlmIChtb2QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbWRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZCk7Ci0JaWYgKG1kaWN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmIChQeURpY3RfVXBkYXRlKG1kaWN0LCBkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgcHJldmlvdXNseSBsb2FkZWQgKCVzKVxuIiwKLQkJCW5hbWUsIGZpbGVuYW1lKTsKLQlyZXR1cm4gbW9kOworICAgIFB5T2JqZWN0ICpkaWN0LCAqbW9kLCAqbWRpY3Q7CisgICAgaWYgKGV4dGVuc2lvbnMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGljdCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGV4dGVuc2lvbnMsIGZpbGVuYW1lKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtb2QgPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7CisgICAgaWYgKG1vZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKKyAgICBpZiAobWRpY3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9VcGRhdGUobWRpY3QsIGRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBwcmV2aW91c2x5IGxvYWRlZCAoJXMpXG4iLAorICAgICAgICAgICAgbmFtZSwgZmlsZW5hbWUpOworICAgIHJldHVybiBtb2Q7CiB9CiAKIApAQCAtNTk5LDM0ICs1OTksMzQgQEAKIFB5T2JqZWN0ICoKIFB5SW1wb3J0X0FkZE1vZHVsZShjb25zdCBjaGFyICpuYW1lKQogewotCVB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOwotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworICAgIFB5T2JqZWN0ICptOwogCi0JaWYgKChtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSkpICE9IE5VTEwgJiYKLQkgICAgUHlNb2R1bGVfQ2hlY2sobSkpCi0JCXJldHVybiBtOwotCW0gPSBQeU1vZHVsZV9OZXcobmFtZSk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUsIG0pICE9IDApIHsKLQkJUHlfREVDUkVGKG0pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfREVDUkVGKG0pOyAvKiBZZXMsIGl0IHN0aWxsIGV4aXN0cywgaW4gbW9kdWxlcyEgKi8KKyAgICBpZiAoKG0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKSkgIT0gTlVMTCAmJgorICAgICAgICBQeU1vZHVsZV9DaGVjayhtKSkKKyAgICAgICAgcmV0dXJuIG07CisgICAgbSA9IFB5TW9kdWxlX05ldyhuYW1lKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSwgbSkgIT0gMCkgeworICAgICAgICBQeV9ERUNSRUYobSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9ERUNSRUYobSk7IC8qIFllcywgaXQgc3RpbGwgZXhpc3RzLCBpbiBtb2R1bGVzISAqLwogCi0JcmV0dXJuIG07CisgICAgcmV0dXJuIG07CiB9CiAKIC8qIFJlbW92ZSBuYW1lIGZyb20gc3lzLm1vZHVsZXMsIGlmIGl0J3MgdGhlcmUuICovCiBzdGF0aWMgdm9pZAogX1JlbW92ZU1vZHVsZShjb25zdCBjaGFyICpuYW1lKQogewotCVB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOwotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKSA9PSBOVUxMKQotCQlyZXR1cm47Ci0JaWYgKFB5RGljdF9EZWxJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpIDwgMCkKLQkJUHlfRmF0YWxFcnJvcigiaW1wb3J0OiAgZGVsZXRpbmcgZXhpc3Rpbmcga2V5IGluIgotCQkJICAgICAgInN5cy5tb2R1bGVzIGZhaWxlZCIpOworICAgIFB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFB5RGljdF9EZWxJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpIDwgMCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiaW1wb3J0OiAgZGVsZXRpbmcgZXhpc3Rpbmcga2V5IGluIgorICAgICAgICAgICAgICAgICAgICAgICJzeXMubW9kdWxlcyBmYWlsZWQiKTsKIH0KIAogLyogRXhlY3V0ZSBhIGNvZGUgb2JqZWN0IGluIGEgbW9kdWxlIGFuZCByZXR1cm4gdGhlIG1vZHVsZSBvYmplY3QKQEAgLTYzOSw2MCArNjM5LDYwIEBACiBQeU9iamVjdCAqCiBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZShjaGFyICpuYW1lLCBQeU9iamVjdCAqY28pCiB7Ci0JcmV0dXJuIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgY28sIChjaGFyICopTlVMTCk7CisgICAgcmV0dXJuIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgY28sIChjaGFyICopTlVMTCk7CiB9CiAKIFB5T2JqZWN0ICoKIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgoY2hhciAqbmFtZSwgUHlPYmplY3QgKmNvLCBjaGFyICpwYXRobmFtZSkKIHsKLQlQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQlQeU9iamVjdCAqbSwgKmQsICp2OworICAgIFB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworICAgIFB5T2JqZWN0ICptLCAqZCwgKnY7CiAKLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOwotCWlmIChtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCS8qIElmIHRoZSBtb2R1bGUgaXMgYmVpbmcgcmVsb2FkZWQsIHdlIGdldCB0aGUgb2xkIG1vZHVsZSBiYWNrCi0JICAgYW5kIHJlLXVzZSBpdHMgZGljdCB0byBleGVjIHRoZSBuZXcgY29kZS4gKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpIHsKLQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iLAotCQkJCQkgUHlFdmFsX0dldEJ1aWx0aW5zKCkpICE9IDApCi0JCQlnb3RvIGVycm9yOwotCX0KLQkvKiBSZW1lbWJlciB0aGUgZmlsZW5hbWUgYXMgdGhlIF9fZmlsZV9fIGF0dHJpYnV0ZSAqLwotCXYgPSBOVUxMOwotCWlmIChwYXRobmFtZSAhPSBOVUxMKSB7Ci0JCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHBhdGhuYW1lKTsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWlmICh2ID09IE5VTEwpIHsKLQkJdiA9ICgoUHlDb2RlT2JqZWN0ICopY28pLT5jb19maWxlbmFtZTsKLQkJUHlfSU5DUkVGKHYpOwotCX0KLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIiwgdikgIT0gMCkKLQkJUHlFcnJfQ2xlYXIoKTsgLyogTm90IGltcG9ydGFudCBlbm91Z2ggdG8gcmVwb3J0ICovCi0JUHlfREVDUkVGKHYpOworICAgIG0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogSWYgdGhlIG1vZHVsZSBpcyBiZWluZyByZWxvYWRlZCwgd2UgZ2V0IHRoZSBvbGQgbW9kdWxlIGJhY2sKKyAgICAgICBhbmQgcmUtdXNlIGl0cyBkaWN0IHRvIGV4ZWMgdGhlIG5ldyBjb2RlLiAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19idWlsdGluc19fIikgPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fYnVpbHRpbnNfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUV2YWxfR2V0QnVpbHRpbnMoKSkgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIC8qIFJlbWVtYmVyIHRoZSBmaWxlbmFtZSBhcyB0aGUgX19maWxlX18gYXR0cmlidXRlICovCisgICAgdiA9IE5VTEw7CisgICAgaWYgKHBhdGhuYW1lICE9IE5VTEwpIHsKKyAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocGF0aG5hbWUpOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICB2ID0gKChQeUNvZGVPYmplY3QgKiljbyktPmNvX2ZpbGVuYW1lOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgfQorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19maWxlX18iLCB2KSAhPSAwKQorICAgICAgICBQeUVycl9DbGVhcigpOyAvKiBOb3QgaW1wb3J0YW50IGVub3VnaCB0byByZXBvcnQgKi8KKyAgICBQeV9ERUNSRUYodik7CiAKLQl2ID0gUHlFdmFsX0V2YWxDb2RlKChQeUNvZGVPYmplY3QgKiljbywgZCwgZCk7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJZ290byBlcnJvcjsKLQlQeV9ERUNSRUYodik7CisgICAgdiA9IFB5RXZhbF9FdmFsQ29kZSgoUHlDb2RlT2JqZWN0ICopY28sIGQsIGQpOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHYpOwogCi0JaWYgKChtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSkpID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAiTG9hZGVkIG1vZHVsZSAlLjIwMHMgbm90IGZvdW5kIGluIHN5cy5tb2R1bGVzIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoKG0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKSkgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTG9hZGVkIG1vZHVsZSAlLjIwMHMgbm90IGZvdW5kIGluIHN5cy5tb2R1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlQeV9JTkNSRUYobSk7CisgICAgUHlfSU5DUkVGKG0pOwogCi0JcmV0dXJuIG07CisgICAgcmV0dXJuIG07CiAKICAgZXJyb3I6Ci0JX1JlbW92ZU1vZHVsZShuYW1lKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBfUmVtb3ZlTW9kdWxlKG5hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTcwNCwyMSArNzA0LDIxIEBACiBzdGF0aWMgY2hhciAqCiBtYWtlX2NvbXBpbGVkX3BhdGhuYW1lKGNoYXIgKnBhdGhuYW1lLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCiB7Ci0Jc2l6ZV90IGxlbiA9IHN0cmxlbihwYXRobmFtZSk7Ci0JaWYgKGxlbisyID4gYnVmbGVuKQotCQlyZXR1cm4gTlVMTDsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKHBhdGhuYW1lKTsKKyAgICBpZiAobGVuKzIgPiBidWZsZW4pCisgICAgICAgIHJldHVybiBOVUxMOwogCiAjaWZkZWYgTVNfV0lORE9XUwotCS8qIFRyZWF0IC5weXcgYXMgaWYgaXQgd2VyZSAucHkuICBUaGUgY2FzZSBvZiAiLnB5dyIgbXVzdCBtYXRjaAotCSAgIHRoYXQgdXNlZCBpbiBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiLiAqLwotCWlmIChsZW4gPj0gNCAmJiBzdHJjbXAoJnBhdGhuYW1lW2xlbi00XSwgIi5weXciKSA9PSAwKQotCQktLWxlbjsJLyogcHJldGVuZCAndycgaXNuJ3QgdGhlcmUgKi8KKyAgICAvKiBUcmVhdCAucHl3IGFzIGlmIGl0IHdlcmUgLnB5LiAgVGhlIGNhc2Ugb2YgIi5weXciIG11c3QgbWF0Y2gKKyAgICAgICB0aGF0IHVzZWQgaW4gX1B5SW1wb3J0X1N0YW5kYXJkRmlsZXRhYi4gKi8KKyAgICBpZiAobGVuID49IDQgJiYgc3RyY21wKCZwYXRobmFtZVtsZW4tNF0sICIucHl3IikgPT0gMCkKKyAgICAgICAgLS1sZW47ICAgICAgICAgIC8qIHByZXRlbmQgJ3cnIGlzbid0IHRoZXJlICovCiAjZW5kaWYKLQltZW1jcHkoYnVmLCBwYXRobmFtZSwgbGVuKTsKLQlidWZbbGVuXSA9IFB5X09wdGltaXplRmxhZyA/ICdvJyA6ICdjJzsKLQlidWZbbGVuKzFdID0gJ1wwJzsKKyAgICBtZW1jcHkoYnVmLCBwYXRobmFtZSwgbGVuKTsKKyAgICBidWZbbGVuXSA9IFB5X09wdGltaXplRmxhZyA/ICdvJyA6ICdjJzsKKyAgICBidWZbbGVuKzFdID0gJ1wwJzsKIAotCXJldHVybiBidWY7CisgICAgcmV0dXJuIGJ1ZjsKIH0KIAogCkBAIC03MzIsMzAgKzczMiwzMCBAQAogc3RhdGljIEZJTEUgKgogY2hlY2tfY29tcGlsZWRfbW9kdWxlKGNoYXIgKnBhdGhuYW1lLCB0aW1lX3QgbXRpbWUsIGNoYXIgKmNwYXRobmFtZSkKIHsKLQlGSUxFICpmcDsKLQlsb25nIG1hZ2ljOwotCWxvbmcgcHljX210aW1lOworICAgIEZJTEUgKmZwOworICAgIGxvbmcgbWFnaWM7CisgICAgbG9uZyBweWNfbXRpbWU7CiAKLQlmcCA9IGZvcGVuKGNwYXRobmFtZSwgInJiIik7Ci0JaWYgKGZwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1hZ2ljID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwotCWlmIChtYWdpYyAhPSBweWNfbWFnaWMpIHsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgJXMgaGFzIGJhZCBtYWdpY1xuIiwgY3BhdGhuYW1lKTsKLQkJZmNsb3NlKGZwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXB5Y19tdGltZSA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQlpZiAocHljX210aW1lICE9IG10aW1lKSB7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbXRpbWVcbiIsIGNwYXRobmFtZSk7Ci0JCWZjbG9zZShmcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCVB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIG1hdGNoZXMgJXNcbiIsIGNwYXRobmFtZSwgcGF0aG5hbWUpOwotCXJldHVybiBmcDsKKyAgICBmcCA9IGZvcGVuKGNwYXRobmFtZSwgInJiIik7CisgICAgaWYgKGZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG1hZ2ljID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgIGlmIChtYWdpYyAhPSBweWNfbWFnaWMpIHsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgJXMgaGFzIGJhZCBtYWdpY1xuIiwgY3BhdGhuYW1lKTsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHB5Y19tdGltZSA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICBpZiAocHljX210aW1lICE9IG10aW1lKSB7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIGhhcyBiYWQgbXRpbWVcbiIsIGNwYXRobmFtZSk7CisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjICVzIG1hdGNoZXMgJXNcbiIsIGNwYXRobmFtZSwgcGF0aG5hbWUpOworICAgIHJldHVybiBmcDsKIH0KIAogCkBAIC03NjQsMTggKzc2NCwxOCBAQAogc3RhdGljIFB5Q29kZU9iamVjdCAqCiByZWFkX2NvbXBpbGVkX21vZHVsZShjaGFyICpjcGF0aG5hbWUsIEZJTEUgKmZwKQogewotCVB5T2JqZWN0ICpjbzsKKyAgICBQeU9iamVjdCAqY287CiAKLQljbyA9IFB5TWFyc2hhbF9SZWFkTGFzdE9iamVjdEZyb21GaWxlKGZwKTsKLQlpZiAoY28gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUNvZGVfQ2hlY2soY28pKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIk5vbi1jb2RlIG9iamVjdCBpbiAlLjIwMHMiLCBjcGF0aG5hbWUpOwotCQlQeV9ERUNSRUYoY28pOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeUNvZGVPYmplY3QgKiljbzsKKyAgICBjbyA9IFB5TWFyc2hhbF9SZWFkTGFzdE9iamVjdEZyb21GaWxlKGZwKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUNvZGVfQ2hlY2soY28pKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJOb24tY29kZSBvYmplY3QgaW4gJS4yMDBzIiwgY3BhdGhuYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKGNvKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlDb2RlT2JqZWN0ICopY287CiB9CiAKIApAQCAtNzg1LDI3ICs3ODUsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX2NvbXBpbGVkX21vZHVsZShjaGFyICpuYW1lLCBjaGFyICpjcGF0aG5hbWUsIEZJTEUgKmZwKQogewotCWxvbmcgbWFnaWM7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlQeU9iamVjdCAqbTsKKyAgICBsb25nIG1hZ2ljOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKm07CiAKLQltYWdpYyA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQlpZiAobWFnaWMgIT0gcHljX21hZ2ljKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIkJhZCBtYWdpYyBudW1iZXIgaW4gJS4yMDBzIiwgY3BhdGhuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSh2b2lkKSBQeU1hcnNoYWxfUmVhZExvbmdGcm9tRmlsZShmcCk7Ci0JY28gPSByZWFkX2NvbXBpbGVkX21vZHVsZShjcGF0aG5hbWUsIGZwKTsKLQlpZiAoY28gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgcHJlY29tcGlsZWQgZnJvbSAlc1xuIiwKLQkJCW5hbWUsIGNwYXRobmFtZSk7Ci0JbSA9IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgobmFtZSwgKFB5T2JqZWN0ICopY28sIGNwYXRobmFtZSk7Ci0JUHlfREVDUkVGKGNvKTsKKyAgICBtYWdpYyA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKKyAgICBpZiAobWFnaWMgIT0gcHljX21hZ2ljKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJCYWQgbWFnaWMgbnVtYmVyIGluICUuMjAwcyIsIGNwYXRobmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAodm9pZCkgUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgIGNvID0gcmVhZF9jb21waWxlZF9tb2R1bGUoY3BhdGhuYW1lLCBmcCk7CisgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIHByZWNvbXBpbGVkIGZyb20gJXNcbiIsCisgICAgICAgICAgICBuYW1lLCBjcGF0aG5hbWUpOworICAgIG0gPSBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KG5hbWUsIChQeU9iamVjdCAqKWNvLCBjcGF0aG5hbWUpOworICAgIFB5X0RFQ1JFRihjbyk7CiAKLQlyZXR1cm4gbTsKKyAgICByZXR1cm4gbTsKIH0KIAogLyogUGFyc2UgYSBzb3VyY2UgZmlsZSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgb2JqZWN0ICovCkBAIC04MTMsMjIgKzgxMywyMiBAQAogc3RhdGljIFB5Q29kZU9iamVjdCAqCiBwYXJzZV9zb3VyY2VfbW9kdWxlKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBGSUxFICpmcCkKIHsKLQlQeUNvZGVPYmplY3QgKmNvID0gTlVMTDsKLQltb2RfdHkgbW9kOwotCVB5Q29tcGlsZXJGbGFncyBmbGFnczsKLQlQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7Ci0JaWYgKGFyZW5hID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIFB5Q29kZU9iamVjdCAqY28gPSBOVUxMOworICAgIG1vZF90eSBtb2Q7CisgICAgUHlDb21waWxlckZsYWdzIGZsYWdzOworICAgIFB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlmbGFncy5jZl9mbGFncyA9IDA7CisgICAgZmxhZ3MuY2ZfZmxhZ3MgPSAwOwogCi0JbW9kID0gUHlQYXJzZXJfQVNURnJvbUZpbGUoZnAsIHBhdGhuYW1lLCBQeV9maWxlX2lucHV0LCAwLCAwLCAmZmxhZ3MsIAotCQkJCSAgIE5VTEwsIGFyZW5hKTsKLQlpZiAobW9kKSB7Ci0JCWNvID0gUHlBU1RfQ29tcGlsZShtb2QsIHBhdGhuYW1lLCBOVUxMLCBhcmVuYSk7Ci0JfQotCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JcmV0dXJuIGNvOworICAgIG1vZCA9IFB5UGFyc2VyX0FTVEZyb21GaWxlKGZwLCBwYXRobmFtZSwgUHlfZmlsZV9pbnB1dCwgMCwgMCwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGFyZW5hKTsKKyAgICBpZiAobW9kKSB7CisgICAgICAgIGNvID0gUHlBU1RfQ29tcGlsZShtb2QsIHBhdGhuYW1lLCBOVUxMLCBhcmVuYSk7CisgICAgfQorICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgcmV0dXJuIGNvOwogfQogCiAKQEAgLTgzOCwzMCArODM4LDMwIEBACiBvcGVuX2V4Y2x1c2l2ZShjaGFyICpmaWxlbmFtZSwgbW9kZV90IG1vZGUpCiB7CiAjaWYgZGVmaW5lZChPX0VYQ0wpJiZkZWZpbmVkKE9fQ1JFQVQpJiZkZWZpbmVkKE9fV1JPTkxZKSYmZGVmaW5lZChPX1RSVU5DKQotCS8qIFVzZSBPX0VYQ0wgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVuIGFub3RoZXIgcHJvY2VzcyB0cmllcyB0bwotCSAgIHdyaXRlIHRoZSBzYW1lIGZpbGUuICBXaGVuIHRoYXQgaGFwcGVucywgb3VyIG9wZW4oKSBjYWxsIGZhaWxzLAotCSAgIHdoaWNoIGlzIGp1c3QgZmluZSAoc2luY2UgaXQncyBvbmx5IGEgY2FjaGUpLgotCSAgIFhYWCBJZiB0aGUgZmlsZSBleGlzdHMgYW5kIGlzIHdyaXRhYmxlIGJ1dCB0aGUgZGlyZWN0b3J5IGlzIG5vdAotCSAgIHdyaXRhYmxlLCB0aGUgZmlsZSB3aWxsIG5ldmVyIGJlIHdyaXR0ZW4uICBPaCB3ZWxsLgotCSovCi0JaW50IGZkOwotCSh2b2lkKSB1bmxpbmsoZmlsZW5hbWUpOwotCWZkID0gb3BlbihmaWxlbmFtZSwgT19FWENMfE9fQ1JFQVR8T19XUk9OTFl8T19UUlVOQworICAgIC8qIFVzZSBPX0VYQ0wgdG8gYXZvaWQgYSByYWNlIGNvbmRpdGlvbiB3aGVuIGFub3RoZXIgcHJvY2VzcyB0cmllcyB0bworICAgICAgIHdyaXRlIHRoZSBzYW1lIGZpbGUuICBXaGVuIHRoYXQgaGFwcGVucywgb3VyIG9wZW4oKSBjYWxsIGZhaWxzLAorICAgICAgIHdoaWNoIGlzIGp1c3QgZmluZSAoc2luY2UgaXQncyBvbmx5IGEgY2FjaGUpLgorICAgICAgIFhYWCBJZiB0aGUgZmlsZSBleGlzdHMgYW5kIGlzIHdyaXRhYmxlIGJ1dCB0aGUgZGlyZWN0b3J5IGlzIG5vdAorICAgICAgIHdyaXRhYmxlLCB0aGUgZmlsZSB3aWxsIG5ldmVyIGJlIHdyaXR0ZW4uICBPaCB3ZWxsLgorICAgICovCisgICAgaW50IGZkOworICAgICh2b2lkKSB1bmxpbmsoZmlsZW5hbWUpOworICAgIGZkID0gb3BlbihmaWxlbmFtZSwgT19FWENMfE9fQ1JFQVR8T19XUk9OTFl8T19UUlVOQwogI2lmZGVmIE9fQklOQVJZCi0JCQkJfE9fQklOQVJZICAgLyogbmVjZXNzYXJ5IGZvciBXaW5kb3dzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfE9fQklOQVJZICAgLyogbmVjZXNzYXJ5IGZvciBXaW5kb3dzICovCiAjZW5kaWYKICNpZmRlZiBfX1ZNUwotICAgICAgICAgICAgICAgICAgICAgICAgLCBtb2RlLCAiY3R4dD1iaW4iLCAic2hyPW5pbCIKKyAgICAgICAgICAgICwgbW9kZSwgImN0eHQ9YmluIiwgInNocj1uaWwiCiAjZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgLCBtb2RlCisgICAgICAgICAgICAsIG1vZGUKICNlbmRpZgotCQkgICk7Ci0JaWYgKGZkIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGZkb3BlbihmZCwgIndiIik7CisgICAgICAgICAgKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gZmRvcGVuKGZkLCAid2IiKTsKICNlbHNlCi0JLyogQmVzdCB3ZSBjYW4gZG8gLS0gb24gV2luZG93cyB0aGlzIGNhbid0IGhhcHBlbiBhbnl3YXkgKi8KLQlyZXR1cm4gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOworICAgIC8qIEJlc3Qgd2UgY2FuIGRvIC0tIG9uIFdpbmRvd3MgdGhpcyBjYW4ndCBoYXBwZW4gYW55d2F5ICovCisgICAgcmV0dXJuIGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKICNlbmRpZgogfQogCkBAIC04NzQsODUgKzg3NCw4NSBAQAogc3RhdGljIHZvaWQKIHdyaXRlX2NvbXBpbGVkX21vZHVsZShQeUNvZGVPYmplY3QgKmNvLCBjaGFyICpjcGF0aG5hbWUsIHN0cnVjdCBzdGF0ICpzcmNzdGF0KQogewotCUZJTEUgKmZwOwotCXRpbWVfdCBtdGltZSA9IHNyY3N0YXQtPnN0X210aW1lOworICAgIEZJTEUgKmZwOworICAgIHRpbWVfdCBtdGltZSA9IHNyY3N0YXQtPnN0X210aW1lOwogI2lmZGVmIE1TX1dJTkRPV1MgICAvKiBzaW5jZSBXaW5kb3dzIHVzZXMgZGlmZmVyZW50IHBlcm1pc3Npb25zICAqLwotCW1vZGVfdCBtb2RlID0gc3Jjc3RhdC0+c3RfbW9kZSAmIH5TX0lFWEVDOworICAgIG1vZGVfdCBtb2RlID0gc3Jjc3RhdC0+c3RfbW9kZSAmIH5TX0lFWEVDOwogI2Vsc2UKLQltb2RlX3QgbW9kZSA9IHNyY3N0YXQtPnN0X21vZGUgJiB+U19JWFVTUiAmIH5TX0lYR1JQICYgflNfSVhPVEg7Ci0jZW5kaWYgCisgICAgbW9kZV90IG1vZGUgPSBzcmNzdGF0LT5zdF9tb2RlICYgflNfSVhVU1IgJiB+U19JWEdSUCAmIH5TX0lYT1RIOworI2VuZGlmCiAKLQlmcCA9IG9wZW5fZXhjbHVzaXZlKGNwYXRobmFtZSwgbW9kZSk7Ci0JaWYgKGZwID09IE5VTEwpIHsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoCi0JCQkJIiMgY2FuJ3QgY3JlYXRlICVzXG4iLCBjcGF0aG5hbWUpOwotCQlyZXR1cm47Ci0JfQotCVB5TWFyc2hhbF9Xcml0ZUxvbmdUb0ZpbGUocHljX21hZ2ljLCBmcCwgUHlfTUFSU0hBTF9WRVJTSU9OKTsKLQkvKiBGaXJzdCB3cml0ZSBhIDAgZm9yIG10aW1lICovCi0JUHlNYXJzaGFsX1dyaXRlTG9uZ1RvRmlsZSgwTCwgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7Ci0JUHlNYXJzaGFsX1dyaXRlT2JqZWN0VG9GaWxlKChQeU9iamVjdCAqKWNvLCBmcCwgUHlfTUFSU0hBTF9WRVJTSU9OKTsKLQlpZiAoZmZsdXNoKGZwKSAhPSAwIHx8IGZlcnJvcihmcCkpIHsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2FuJ3Qgd3JpdGUgJXNcbiIsIGNwYXRobmFtZSk7Ci0JCS8qIERvbid0IGtlZXAgcGFydGlhbCBmaWxlICovCi0JCWZjbG9zZShmcCk7Ci0JCSh2b2lkKSB1bmxpbmsoY3BhdGhuYW1lKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBOb3cgd3JpdGUgdGhlIHRydWUgbXRpbWUgKi8KLQlmc2VlayhmcCwgNEwsIDApOwotCWFzc2VydChtdGltZSA8IExPTkdfTUFYKTsKLQlQeU1hcnNoYWxfV3JpdGVMb25nVG9GaWxlKChsb25nKW10aW1lLCBmcCwgUHlfTUFSU0hBTF9WRVJTSU9OKTsKLQlmZmx1c2goZnApOwotCWZjbG9zZShmcCk7Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlQeVN5c19Xcml0ZVN0ZGVycigiIyB3cm90ZSAlc1xuIiwgY3BhdGhuYW1lKTsKKyAgICBmcCA9IG9wZW5fZXhjbHVzaXZlKGNwYXRobmFtZSwgbW9kZSk7CisgICAgaWYgKGZwID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoCisgICAgICAgICAgICAgICAgIiMgY2FuJ3QgY3JlYXRlICVzXG4iLCBjcGF0aG5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFB5TWFyc2hhbF9Xcml0ZUxvbmdUb0ZpbGUocHljX21hZ2ljLCBmcCwgUHlfTUFSU0hBTF9WRVJTSU9OKTsKKyAgICAvKiBGaXJzdCB3cml0ZSBhIDAgZm9yIG10aW1lICovCisgICAgUHlNYXJzaGFsX1dyaXRlTG9uZ1RvRmlsZSgwTCwgZnAsIFB5X01BUlNIQUxfVkVSU0lPTik7CisgICAgUHlNYXJzaGFsX1dyaXRlT2JqZWN0VG9GaWxlKChQeU9iamVjdCAqKWNvLCBmcCwgUHlfTUFSU0hBTF9WRVJTSU9OKTsKKyAgICBpZiAoZmZsdXNoKGZwKSAhPSAwIHx8IGZlcnJvcihmcCkpIHsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIiMgY2FuJ3Qgd3JpdGUgJXNcbiIsIGNwYXRobmFtZSk7CisgICAgICAgIC8qIERvbid0IGtlZXAgcGFydGlhbCBmaWxlICovCisgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgICh2b2lkKSB1bmxpbmsoY3BhdGhuYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBOb3cgd3JpdGUgdGhlIHRydWUgbXRpbWUgKi8KKyAgICBmc2VlayhmcCwgNEwsIDApOworICAgIGFzc2VydChtdGltZSA8IExPTkdfTUFYKTsKKyAgICBQeU1hcnNoYWxfV3JpdGVMb25nVG9GaWxlKChsb25nKW10aW1lLCBmcCwgUHlfTUFSU0hBTF9WRVJTSU9OKTsKKyAgICBmZmx1c2goZnApOworICAgIGZjbG9zZShmcCk7CisgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiIyB3cm90ZSAlc1xuIiwgY3BhdGhuYW1lKTsKIH0KIAogc3RhdGljIHZvaWQKIHVwZGF0ZV9jb2RlX2ZpbGVuYW1lcyhQeUNvZGVPYmplY3QgKmNvLCBQeU9iamVjdCAqb2xkbmFtZSwgUHlPYmplY3QgKm5ld25hbWUpCiB7Ci0JUHlPYmplY3QgKmNvbnN0YW50cywgKnRtcDsKLQlQeV9zc2l6ZV90IGksIG47CisgICAgUHlPYmplY3QgKmNvbnN0YW50cywgKnRtcDsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKLQlpZiAoIV9QeVN0cmluZ19FcShjby0+Y29fZmlsZW5hbWUsIG9sZG5hbWUpKQotCQlyZXR1cm47CisgICAgaWYgKCFfUHlTdHJpbmdfRXEoY28tPmNvX2ZpbGVuYW1lLCBvbGRuYW1lKSkKKyAgICAgICAgcmV0dXJuOwogCi0JdG1wID0gY28tPmNvX2ZpbGVuYW1lOwotCWNvLT5jb19maWxlbmFtZSA9IG5ld25hbWU7Ci0JUHlfSU5DUkVGKGNvLT5jb19maWxlbmFtZSk7Ci0JUHlfREVDUkVGKHRtcCk7CisgICAgdG1wID0gY28tPmNvX2ZpbGVuYW1lOworICAgIGNvLT5jb19maWxlbmFtZSA9IG5ld25hbWU7CisgICAgUHlfSU5DUkVGKGNvLT5jb19maWxlbmFtZSk7CisgICAgUHlfREVDUkVGKHRtcCk7CiAKLQljb25zdGFudHMgPSBjby0+Y29fY29uc3RzOwotCW4gPSBQeVR1cGxlX0dFVF9TSVpFKGNvbnN0YW50cyk7Ci0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQl0bXAgPSBQeVR1cGxlX0dFVF9JVEVNKGNvbnN0YW50cywgaSk7Ci0JCWlmIChQeUNvZGVfQ2hlY2sodG1wKSkKLQkJCXVwZGF0ZV9jb2RlX2ZpbGVuYW1lcygoUHlDb2RlT2JqZWN0ICopdG1wLAotCQkJCQkgICAgICBvbGRuYW1lLCBuZXduYW1lKTsKLQl9CisgICAgY29uc3RhbnRzID0gY28tPmNvX2NvbnN0czsKKyAgICBuID0gUHlUdXBsZV9HRVRfU0laRShjb25zdGFudHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgdG1wID0gUHlUdXBsZV9HRVRfSVRFTShjb25zdGFudHMsIGkpOworICAgICAgICBpZiAoUHlDb2RlX0NoZWNrKHRtcCkpCisgICAgICAgICAgICB1cGRhdGVfY29kZV9maWxlbmFtZXMoKFB5Q29kZU9iamVjdCAqKXRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRuYW1lLCBuZXduYW1lKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIHVwZGF0ZV9jb21waWxlZF9tb2R1bGUoUHlDb2RlT2JqZWN0ICpjbywgY2hhciAqcGF0aG5hbWUpCiB7Ci0JUHlPYmplY3QgKm9sZG5hbWUsICpuZXduYW1lOworICAgIFB5T2JqZWN0ICpvbGRuYW1lLCAqbmV3bmFtZTsKIAotCWlmIChzdHJjbXAoUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX2ZpbGVuYW1lKSwgcGF0aG5hbWUpID09IDApCi0JCXJldHVybiAwOworICAgIGlmIChzdHJjbXAoUHlTdHJpbmdfQXNTdHJpbmcoY28tPmNvX2ZpbGVuYW1lKSwgcGF0aG5hbWUpID09IDApCisgICAgICAgIHJldHVybiAwOwogCi0JbmV3bmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcocGF0aG5hbWUpOwotCWlmIChuZXduYW1lID09IE5VTEwpCi0JCXJldHVybiAtMTsKKyAgICBuZXduYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwYXRobmFtZSk7CisgICAgaWYgKG5ld25hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0Jb2xkbmFtZSA9IGNvLT5jb19maWxlbmFtZTsKLQlQeV9JTkNSRUYob2xkbmFtZSk7Ci0JdXBkYXRlX2NvZGVfZmlsZW5hbWVzKGNvLCBvbGRuYW1lLCBuZXduYW1lKTsKLQlQeV9ERUNSRUYob2xkbmFtZSk7Ci0JUHlfREVDUkVGKG5ld25hbWUpOwotCXJldHVybiAxOworICAgIG9sZG5hbWUgPSBjby0+Y29fZmlsZW5hbWU7CisgICAgUHlfSU5DUkVGKG9sZG5hbWUpOworICAgIHVwZGF0ZV9jb2RlX2ZpbGVuYW1lcyhjbywgb2xkbmFtZSwgbmV3bmFtZSk7CisgICAgUHlfREVDUkVGKG9sZG5hbWUpOworICAgIFB5X0RFQ1JFRihuZXduYW1lKTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogTG9hZCBhIHNvdXJjZSBtb2R1bGUgZnJvbSBhIGdpdmVuIGZpbGUgYW5kIHJldHVybiBpdHMgbW9kdWxlCkBAIC05NjIsNjkgKzk2Miw2OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxvYWRfc291cmNlX21vZHVsZShjaGFyICpuYW1lLCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0Jc3RydWN0IHN0YXQgc3Q7Ci0JRklMRSAqZnBjOwotCWNoYXIgYnVmW01BWFBBVEhMRU4rMV07Ci0JY2hhciAqY3BhdGhuYW1lOwotCVB5Q29kZU9iamVjdCAqY287Ci0JUHlPYmplY3QgKm07Ci0JCi0JaWYgKGZzdGF0KGZpbGVubyhmcCksICZzdCkgIT0gMCkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgICAidW5hYmxlIHRvIGdldCBmaWxlIHN0YXR1cyBmcm9tICclcyciLAotCQkJICAgICBwYXRobmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLSNpZiBTSVpFT0ZfVElNRV9UID4gNAotCS8qIFB5dGhvbidzIC5weWMgdGltZXN0YW1wIGhhbmRsaW5nIHByZXN1bWVzIHRoYXQgdGhlIHRpbWVzdGFtcCBmaXRzCi0JICAgaW4gNCBieXRlcy4gVGhpcyB3aWxsIGJlIGZpbmUgdW50aWwgc29tZXRpbWUgaW4gdGhlIHllYXIgMjAzOCwKLQkgICB3aGVuIGEgNC1ieXRlIHNpZ25lZCB0aW1lX3Qgd2lsbCBvdmVyZmxvdy4KLQkgKi8KLQlpZiAoc3Quc3RfbXRpbWUgPj4gMzIpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkibW9kaWZpY2F0aW9uIHRpbWUgb3ZlcmZsb3dzIGEgNCBieXRlIGZpZWxkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLSNlbmRpZgotCWNwYXRobmFtZSA9IG1ha2VfY29tcGlsZWRfcGF0aG5hbWUocGF0aG5hbWUsIGJ1ZiwKLQkJCQkJICAgKHNpemVfdClNQVhQQVRITEVOICsgMSk7Ci0JaWYgKGNwYXRobmFtZSAhPSBOVUxMICYmCi0JICAgIChmcGMgPSBjaGVja19jb21waWxlZF9tb2R1bGUocGF0aG5hbWUsIHN0LnN0X210aW1lLCBjcGF0aG5hbWUpKSkgewotCQljbyA9IHJlYWRfY29tcGlsZWRfbW9kdWxlKGNwYXRobmFtZSwgZnBjKTsKLQkJZmNsb3NlKGZwYyk7Ci0JCWlmIChjbyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICh1cGRhdGVfY29tcGlsZWRfbW9kdWxlKGNvLCBwYXRobmFtZSkgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBwcmVjb21waWxlZCBmcm9tICVzXG4iLAotCQkJCW5hbWUsIGNwYXRobmFtZSk7Ci0JCXBhdGhuYW1lID0gY3BhdGhuYW1lOwotCX0KLQllbHNlIHsKLQkJY28gPSBwYXJzZV9zb3VyY2VfbW9kdWxlKHBhdGhuYW1lLCBmcCk7Ci0JCWlmIChjbyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBmcm9tICVzXG4iLAotCQkJCW5hbWUsIHBhdGhuYW1lKTsKLQkJaWYgKGNwYXRobmFtZSkgewotCQkJUHlPYmplY3QgKnJvID0gUHlTeXNfR2V0T2JqZWN0KCJkb250X3dyaXRlX2J5dGVjb2RlIik7Ci0JCQlpZiAocm8gPT0gTlVMTCB8fCAhUHlPYmplY3RfSXNUcnVlKHJvKSkKLQkJCQl3cml0ZV9jb21waWxlZF9tb2R1bGUoY28sIGNwYXRobmFtZSwgJnN0KTsKLQkJfQotCX0KLQltID0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChuYW1lLCAoUHlPYmplY3QgKiljbywgcGF0aG5hbWUpOwotCVB5X0RFQ1JFRihjbyk7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgRklMRSAqZnBjOworICAgIGNoYXIgYnVmW01BWFBBVEhMRU4rMV07CisgICAgY2hhciAqY3BhdGhuYW1lOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgUHlPYmplY3QgKm07CiAKLQlyZXR1cm4gbTsKKyAgICBpZiAoZnN0YXQoZmlsZW5vKGZwKSwgJnN0KSAhPSAwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGdldCBmaWxlIHN0YXR1cyBmcm9tICclcyciLAorICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjaWYgU0laRU9GX1RJTUVfVCA+IDQKKyAgICAvKiBQeXRob24ncyAucHljIHRpbWVzdGFtcCBoYW5kbGluZyBwcmVzdW1lcyB0aGF0IHRoZSB0aW1lc3RhbXAgZml0cworICAgICAgIGluIDQgYnl0ZXMuIFRoaXMgd2lsbCBiZSBmaW5lIHVudGlsIHNvbWV0aW1lIGluIHRoZSB5ZWFyIDIwMzgsCisgICAgICAgd2hlbiBhIDQtYnl0ZSBzaWduZWQgdGltZV90IHdpbGwgb3ZlcmZsb3cuCisgICAgICovCisgICAgaWYgKHN0LnN0X210aW1lID4+IDMyKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgIm1vZGlmaWNhdGlvbiB0aW1lIG92ZXJmbG93cyBhIDQgYnl0ZSBmaWVsZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisjZW5kaWYKKyAgICBjcGF0aG5hbWUgPSBtYWtlX2NvbXBpbGVkX3BhdGhuYW1lKHBhdGhuYW1lLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KU1BWFBBVEhMRU4gKyAxKTsKKyAgICBpZiAoY3BhdGhuYW1lICE9IE5VTEwgJiYKKyAgICAgICAgKGZwYyA9IGNoZWNrX2NvbXBpbGVkX21vZHVsZShwYXRobmFtZSwgc3Quc3RfbXRpbWUsIGNwYXRobmFtZSkpKSB7CisgICAgICAgIGNvID0gcmVhZF9jb21waWxlZF9tb2R1bGUoY3BhdGhuYW1lLCBmcGMpOworICAgICAgICBmY2xvc2UoZnBjKTsKKyAgICAgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHVwZGF0ZV9jb21waWxlZF9tb2R1bGUoY28sIHBhdGhuYW1lKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIHByZWNvbXBpbGVkIGZyb20gJXNcbiIsCisgICAgICAgICAgICAgICAgbmFtZSwgY3BhdGhuYW1lKTsKKyAgICAgICAgcGF0aG5hbWUgPSBjcGF0aG5hbWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjbyA9IHBhcnNlX3NvdXJjZV9tb2R1bGUocGF0aG5hbWUsIGZwKTsKKyAgICAgICAgaWYgKGNvID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGZyb20gJXNcbiIsCisgICAgICAgICAgICAgICAgbmFtZSwgcGF0aG5hbWUpOworICAgICAgICBpZiAoY3BhdGhuYW1lKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqcm8gPSBQeVN5c19HZXRPYmplY3QoImRvbnRfd3JpdGVfYnl0ZWNvZGUiKTsKKyAgICAgICAgICAgIGlmIChybyA9PSBOVUxMIHx8ICFQeU9iamVjdF9Jc1RydWUocm8pKQorICAgICAgICAgICAgICAgIHdyaXRlX2NvbXBpbGVkX21vZHVsZShjbywgY3BhdGhuYW1lLCAmc3QpOworICAgICAgICB9CisgICAgfQorICAgIG0gPSBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KG5hbWUsIChQeU9iamVjdCAqKWNvLCBwYXRobmFtZSk7CisgICAgUHlfREVDUkVGKGNvKTsKKworICAgIHJldHVybiBtOwogfQogCiAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyBQeU9iamVjdCAqbG9hZF9tb2R1bGUoY2hhciAqLCBGSUxFICosIGNoYXIgKiwgaW50LCBQeU9iamVjdCAqKTsKIHN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyICpmaW5kX21vZHVsZShjaGFyICosIGNoYXIgKiwgUHlPYmplY3QgKiwKLQkJCQkgICAgIGNoYXIgKiwgc2l6ZV90LCBGSUxFICoqLCBQeU9iamVjdCAqKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBzaXplX3QsIEZJTEUgKiosIFB5T2JqZWN0ICoqKTsKIHN0YXRpYyBzdHJ1Y3QgX2Zyb3plbiAqZmluZF9mcm96ZW4oY2hhciAqbmFtZSk7CiAKIC8qIExvYWQgYSBwYWNrYWdlIGFuZCByZXR1cm4gaXRzIG1vZHVsZSBvYmplY3QgV0lUSCBJTkNSRU1FTlRFRApAQCAtMTAzMyw1NCArMTAzMyw1NCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxvYWRfcGFja2FnZShjaGFyICpuYW1lLCBjaGFyICpwYXRobmFtZSkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JUHlPYmplY3QgKmZpbGUgPSBOVUxMOwotCVB5T2JqZWN0ICpwYXRoID0gTlVMTDsKLQlpbnQgZXJyOwotCWNoYXIgYnVmW01BWFBBVEhMRU4rMV07Ci0JRklMRSAqZnAgPSBOVUxMOwotCXN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKKyAgICBQeU9iamVjdCAqbSwgKmQ7CisgICAgUHlPYmplY3QgKmZpbGUgPSBOVUxMOworICAgIFB5T2JqZWN0ICpwYXRoID0gTlVMTDsKKyAgICBpbnQgZXJyOworICAgIGNoYXIgYnVmW01BWFBBVEhMRU4rMV07CisgICAgRklMRSAqZnAgPSBOVUxMOworICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKIAotCW0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgZGlyZWN0b3J5ICVzXG4iLAotCQkJbmFtZSwgcGF0aG5hbWUpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWZpbGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHBhdGhuYW1lKTsKLQlpZiAoZmlsZSA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCXBhdGggPSBQeV9CdWlsZFZhbHVlKCJbT10iLCBmaWxlKTsKLQlpZiAocGF0aCA9PSBOVUxMKQotCQlnb3RvIGVycm9yOwotCWVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIsIGZpbGUpOwotCWlmIChlcnIgPT0gMCkKLQkJZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fcGF0aF9fIiwgcGF0aCk7Ci0JaWYgKGVyciAhPSAwKQotCQlnb3RvIGVycm9yOwotCWJ1ZlswXSA9ICdcMCc7Ci0JZmRwID0gZmluZF9tb2R1bGUobmFtZSwgIl9faW5pdF9fIiwgcGF0aCwgYnVmLCBzaXplb2YoYnVmKSwgJmZwLCBOVUxMKTsKLQlpZiAoZmRwID09IE5VTEwpIHsKLQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7Ci0JCQlQeUVycl9DbGVhcigpOwotCQkJUHlfSU5DUkVGKG0pOwotCQl9Ci0JCWVsc2UKLQkJCW0gPSBOVUxMOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCW0gPSBsb2FkX21vZHVsZShuYW1lLCBmcCwgYnVmLCBmZHAtPnR5cGUsIE5VTEwpOwotCWlmIChmcCAhPSBOVUxMKQotCQlmY2xvc2UoZnApOwotCWdvdG8gY2xlYW51cDsKKyAgICBtID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGRpcmVjdG9yeSAlc1xuIiwKKyAgICAgICAgICAgIG5hbWUsIHBhdGhuYW1lKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBmaWxlID0gUHlTdHJpbmdfRnJvbVN0cmluZyhwYXRobmFtZSk7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBwYXRoID0gUHlfQnVpbGRWYWx1ZSgiW09dIiwgZmlsZSk7CisgICAgaWYgKHBhdGggPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBlcnIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19maWxlX18iLCBmaWxlKTsKKyAgICBpZiAoZXJyID09IDApCisgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX3BhdGhfXyIsIHBhdGgpOworICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBidWZbMF0gPSAnXDAnOworICAgIGZkcCA9IGZpbmRfbW9kdWxlKG5hbWUsICJfX2luaXRfXyIsIHBhdGgsIGJ1Ziwgc2l6ZW9mKGJ1ZiksICZmcCwgTlVMTCk7CisgICAgaWYgKGZkcCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBtID0gTlVMTDsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKyAgICBtID0gbG9hZF9tb2R1bGUobmFtZSwgZnAsIGJ1ZiwgZmRwLT50eXBlLCBOVUxMKTsKKyAgICBpZiAoZnAgIT0gTlVMTCkKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICBnb3RvIGNsZWFudXA7CiAKICAgZXJyb3I6Ci0gIAltID0gTlVMTDsKKyAgICBtID0gTlVMTDsKICAgY2xlYW51cDoKLQlQeV9YREVDUkVGKHBhdGgpOwotCVB5X1hERUNSRUYoZmlsZSk7Ci0JcmV0dXJuIG07CisgICAgUHlfWERFQ1JFRihwYXRoKTsKKyAgICBQeV9YREVDUkVGKGZpbGUpOworICAgIHJldHVybiBtOwogfQogCiAKQEAgLTEwODksMTYgKzEwODksMTYgQEAKIHN0YXRpYyBpbnQKIGlzX2J1aWx0aW4oY2hhciAqbmFtZSkKIHsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7Ci0JCWlmIChzdHJjbXAobmFtZSwgUHlJbXBvcnRfSW5pdHRhYltpXS5uYW1lKSA9PSAwKSB7Ci0JCQlpZiAoUHlJbXBvcnRfSW5pdHRhYltpXS5pbml0ZnVuYyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobmFtZSwgUHlJbXBvcnRfSW5pdHRhYltpXS5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoUHlJbXBvcnRfSW5pdHRhYltpXS5pbml0ZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xMTEyLDcyICsxMTEyLDcyIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBnZXRfcGF0aF9pbXBvcnRlcihQeU9iamVjdCAqcGF0aF9pbXBvcnRlcl9jYWNoZSwgUHlPYmplY3QgKnBhdGhfaG9va3MsCi0JCSAgUHlPYmplY3QgKnApCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcCkKIHsKLQlQeU9iamVjdCAqaW1wb3J0ZXI7Ci0JUHlfc3NpemVfdCBqLCBuaG9va3M7CisgICAgUHlPYmplY3QgKmltcG9ydGVyOworICAgIFB5X3NzaXplX3Qgaiwgbmhvb2tzOwogCi0JLyogVGhlc2UgY29uZGl0aW9ucyBhcmUgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5OiAqLwotCWFzc2VydChQeUxpc3RfQ2hlY2socGF0aF9ob29rcykpOwotCWFzc2VydChQeURpY3RfQ2hlY2socGF0aF9pbXBvcnRlcl9jYWNoZSkpOworICAgIC8qIFRoZXNlIGNvbmRpdGlvbnMgYXJlIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eTogKi8KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKHBhdGhfaG9va3MpKTsKKyAgICBhc3NlcnQoUHlEaWN0X0NoZWNrKHBhdGhfaW1wb3J0ZXJfY2FjaGUpKTsKIAotCW5ob29rcyA9IFB5TGlzdF9TaXplKHBhdGhfaG9va3MpOwotCWlmIChuaG9va3MgPCAwKQotCQlyZXR1cm4gTlVMTDsgLyogU2hvdWxkbid0IGhhcHBlbiAqLworICAgIG5ob29rcyA9IFB5TGlzdF9TaXplKHBhdGhfaG9va3MpOworICAgIGlmIChuaG9va3MgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsgLyogU2hvdWxkbid0IGhhcHBlbiAqLwogCi0JaW1wb3J0ZXIgPSBQeURpY3RfR2V0SXRlbShwYXRoX2ltcG9ydGVyX2NhY2hlLCBwKTsKLQlpZiAoaW1wb3J0ZXIgIT0gTlVMTCkKLQkJcmV0dXJuIGltcG9ydGVyOworICAgIGltcG9ydGVyID0gUHlEaWN0X0dldEl0ZW0ocGF0aF9pbXBvcnRlcl9jYWNoZSwgcCk7CisgICAgaWYgKGltcG9ydGVyICE9IE5VTEwpCisgICAgICAgIHJldHVybiBpbXBvcnRlcjsKIAotCS8qIHNldCBwYXRoX2ltcG9ydGVyX2NhY2hlW3BdIHRvIE5vbmUgdG8gYXZvaWQgcmVjdXJzaW9uICovCi0JaWYgKFB5RGljdF9TZXRJdGVtKHBhdGhfaW1wb3J0ZXJfY2FjaGUsIHAsIFB5X05vbmUpICE9IDApCi0JCXJldHVybiBOVUxMOworICAgIC8qIHNldCBwYXRoX2ltcG9ydGVyX2NhY2hlW3BdIHRvIE5vbmUgdG8gYXZvaWQgcmVjdXJzaW9uICovCisgICAgaWYgKFB5RGljdF9TZXRJdGVtKHBhdGhfaW1wb3J0ZXJfY2FjaGUsIHAsIFB5X05vbmUpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JZm9yIChqID0gMDsgaiA8IG5ob29rczsgaisrKSB7Ci0JCVB5T2JqZWN0ICpob29rID0gUHlMaXN0X0dldEl0ZW0ocGF0aF9ob29rcywgaik7Ci0JCWlmIChob29rID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaW1wb3J0ZXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGhvb2ssIHAsIE5VTEwpOwotCQlpZiAoaW1wb3J0ZXIgIT0gTlVMTCkKLQkJCWJyZWFrOworICAgIGZvciAoaiA9IDA7IGogPCBuaG9va3M7IGorKykgeworICAgICAgICBQeU9iamVjdCAqaG9vayA9IFB5TGlzdF9HZXRJdGVtKHBhdGhfaG9va3MsIGopOworICAgICAgICBpZiAoaG9vayA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGltcG9ydGVyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhob29rLCBwLCBOVUxMKTsKKyAgICAgICAgaWYgKGltcG9ydGVyICE9IE5VTEwpCisgICAgICAgICAgICBicmVhazsKIAotCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeUVycl9DbGVhcigpOwotCX0KLQlpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgewotCQlpbXBvcnRlciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCi0JCQkoUHlPYmplY3QgKikmUHlOdWxsSW1wb3J0ZXJfVHlwZSwgcCwgTlVMTAotCQkpOwotCQlpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgewotCQkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlyZXR1cm4gUHlfTm9uZTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoaW1wb3J0ZXIgIT0gTlVMTCkgewotCQlpbnQgZXJyID0gUHlEaWN0X1NldEl0ZW0ocGF0aF9pbXBvcnRlcl9jYWNoZSwgcCwgaW1wb3J0ZXIpOwotCQlQeV9ERUNSRUYoaW1wb3J0ZXIpOwotCQlpZiAoZXJyICE9IDApCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGltcG9ydGVyOworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgeworICAgICAgICBpbXBvcnRlciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCisgICAgICAgICAgICAoUHlPYmplY3QgKikmUHlOdWxsSW1wb3J0ZXJfVHlwZSwgcCwgTlVMTAorICAgICAgICApOworICAgICAgICBpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW1wb3J0ZXIgIT0gTlVMTCkgeworICAgICAgICBpbnQgZXJyID0gUHlEaWN0X1NldEl0ZW0ocGF0aF9pbXBvcnRlcl9jYWNoZSwgcCwgaW1wb3J0ZXIpOworICAgICAgICBQeV9ERUNSRUYoaW1wb3J0ZXIpOworICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGltcG9ydGVyOwogfQogCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopCiBQeUltcG9ydF9HZXRJbXBvcnRlcihQeU9iamVjdCAqcGF0aCkgewotICAgICAgICBQeU9iamVjdCAqaW1wb3J0ZXI9TlVMTCwgKnBhdGhfaW1wb3J0ZXJfY2FjaGU9TlVMTCwgKnBhdGhfaG9va3M9TlVMTDsKKyAgICBQeU9iamVjdCAqaW1wb3J0ZXI9TlVMTCwgKnBhdGhfaW1wb3J0ZXJfY2FjaGU9TlVMTCwgKnBhdGhfaG9va3M9TlVMTDsKIAotCWlmICgocGF0aF9pbXBvcnRlcl9jYWNoZSA9IFB5U3lzX0dldE9iamVjdCgicGF0aF9pbXBvcnRlcl9jYWNoZSIpKSkgewotCQlpZiAoKHBhdGhfaG9va3MgPSBQeVN5c19HZXRPYmplY3QoInBhdGhfaG9va3MiKSkpIHsKLQkJCWltcG9ydGVyID0gZ2V0X3BhdGhfaW1wb3J0ZXIocGF0aF9pbXBvcnRlcl9jYWNoZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9ob29rcywgcGF0aCk7Ci0JCX0KLQl9Ci0JUHlfWElOQ1JFRihpbXBvcnRlcik7IC8qIGdldF9wYXRoX2ltcG9ydGVyIHJldHVybnMgYSBib3Jyb3dlZCByZWZlcmVuY2UgKi8KLQlyZXR1cm4gaW1wb3J0ZXI7CisgICAgaWYgKChwYXRoX2ltcG9ydGVyX2NhY2hlID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoX2ltcG9ydGVyX2NhY2hlIikpKSB7CisgICAgICAgIGlmICgocGF0aF9ob29rcyA9IFB5U3lzX0dldE9iamVjdCgicGF0aF9ob29rcyIpKSkgeworICAgICAgICAgICAgaW1wb3J0ZXIgPSBnZXRfcGF0aF9pbXBvcnRlcihwYXRoX2ltcG9ydGVyX2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2hvb2tzLCBwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBQeV9YSU5DUkVGKGltcG9ydGVyKTsgLyogZ2V0X3BhdGhfaW1wb3J0ZXIgcmV0dXJucyBhIGJvcnJvd2VkIHJlZmVyZW5jZSAqLworICAgIHJldHVybiBpbXBvcnRlcjsKIH0KIAogLyogU2VhcmNoIHRoZSBwYXRoIChkZWZhdWx0IHN5cy5wYXRoKSBmb3IgYSBtb2R1bGUuICBSZXR1cm4gdGhlCkBAIC0xMTg2LDcgKzExODYsNyBAQAogCiAjaWZkZWYgTVNfQ09SRURMTAogZXh0ZXJuIEZJTEUgKlB5V2luX0ZpbmRSZWdpc3RlcmVkTW9kdWxlKGNvbnN0IGNoYXIgKiwgc3RydWN0IGZpbGVkZXNjciAqKiwKLQkJCQkJY2hhciAqLCBQeV9zc2l6ZV90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIFB5X3NzaXplX3QpOwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgY2FzZV9vayhjaGFyICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNoYXIgKik7CkBAIC0xMTk1LDMxOSArMTE5NSwzMTkgQEAKIAogc3RhdGljIHN0cnVjdCBmaWxlZGVzY3IgKgogZmluZF9tb2R1bGUoY2hhciAqZnVsbG5hbWUsIGNoYXIgKnN1Ym5hbWUsIFB5T2JqZWN0ICpwYXRoLCBjaGFyICpidWYsCi0JICAgIHNpemVfdCBidWZsZW4sIEZJTEUgKipwX2ZwLCBQeU9iamVjdCAqKnBfbG9hZGVyKQorICAgICAgICAgICAgc2l6ZV90IGJ1ZmxlbiwgRklMRSAqKnBfZnAsIFB5T2JqZWN0ICoqcF9sb2FkZXIpCiB7Ci0JUHlfc3NpemVfdCBpLCBucGF0aDsKLQlzaXplX3QgbGVuLCBuYW1lbGVuOwotCXN0cnVjdCBmaWxlZGVzY3IgKmZkcCA9IE5VTEw7Ci0JY2hhciAqZmlsZW1vZGU7Ci0JRklMRSAqZnAgPSBOVUxMOwotCVB5T2JqZWN0ICpwYXRoX2hvb2tzLCAqcGF0aF9pbXBvcnRlcl9jYWNoZTsKKyAgICBQeV9zc2l6ZV90IGksIG5wYXRoOworICAgIHNpemVfdCBsZW4sIG5hbWVsZW47CisgICAgc3RydWN0IGZpbGVkZXNjciAqZmRwID0gTlVMTDsKKyAgICBjaGFyICpmaWxlbW9kZTsKKyAgICBGSUxFICpmcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnBhdGhfaG9va3MsICpwYXRoX2ltcG9ydGVyX2NhY2hlOwogI2lmbmRlZiBSSVNDT1MKLQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CiAjZW5kaWYKLQlzdGF0aWMgc3RydWN0IGZpbGVkZXNjciBmZF9mcm96ZW4gPSB7IiIsICIiLCBQWV9GUk9aRU59OwotCXN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyIGZkX2J1aWx0aW4gPSB7IiIsICIiLCBDX0JVSUxUSU59OwotCXN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyIGZkX3BhY2thZ2UgPSB7IiIsICIiLCBQS0dfRElSRUNUT1JZfTsKLQljaGFyIG5hbWVbTUFYUEFUSExFTisxXTsKKyAgICBzdGF0aWMgc3RydWN0IGZpbGVkZXNjciBmZF9mcm96ZW4gPSB7IiIsICIiLCBQWV9GUk9aRU59OworICAgIHN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyIGZkX2J1aWx0aW4gPSB7IiIsICIiLCBDX0JVSUxUSU59OworICAgIHN0YXRpYyBzdHJ1Y3QgZmlsZWRlc2NyIGZkX3BhY2thZ2UgPSB7IiIsICIiLCBQS0dfRElSRUNUT1JZfTsKKyAgICBjaGFyIG5hbWVbTUFYUEFUSExFTisxXTsKICNpZiBkZWZpbmVkKFBZT1NfT1MyKQotCXNpemVfdCBzYXZlZF9sZW47Ci0Jc2l6ZV90IHNhdmVkX25hbWVsZW47Ci0JY2hhciAqc2F2ZWRfYnVmID0gTlVMTDsKKyAgICBzaXplX3Qgc2F2ZWRfbGVuOworICAgIHNpemVfdCBzYXZlZF9uYW1lbGVuOworICAgIGNoYXIgKnNhdmVkX2J1ZiA9IE5VTEw7CiAjZW5kaWYKLQlpZiAocF9sb2FkZXIgIT0gTlVMTCkKLQkJKnBfbG9hZGVyID0gTlVMTDsKKyAgICBpZiAocF9sb2FkZXIgIT0gTlVMTCkKKyAgICAgICAgKnBfbG9hZGVyID0gTlVMTDsKIAotCWlmIChzdHJsZW4oc3VibmFtZSkgPiBNQVhQQVRITEVOKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCSJtb2R1bGUgbmFtZSBpcyB0b28gbG9uZyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc3RyY3B5KG5hbWUsIHN1Ym5hbWUpOworICAgIGlmIChzdHJsZW4oc3VibmFtZSkgPiBNQVhQQVRITEVOKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSBuYW1lIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJjcHkobmFtZSwgc3VibmFtZSk7CiAKLQkvKiBzeXMubWV0YV9wYXRoIGltcG9ydCBob29rICovCi0JaWYgKHBfbG9hZGVyICE9IE5VTEwpIHsKLQkJUHlPYmplY3QgKm1ldGFfcGF0aDsKKyAgICAvKiBzeXMubWV0YV9wYXRoIGltcG9ydCBob29rICovCisgICAgaWYgKHBfbG9hZGVyICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKm1ldGFfcGF0aDsKIAotCQltZXRhX3BhdGggPSBQeVN5c19HZXRPYmplY3QoIm1ldGFfcGF0aCIpOwotCQlpZiAobWV0YV9wYXRoID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhtZXRhX3BhdGgpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkJCSJzeXMubWV0YV9wYXRoIG11c3QgYmUgYSBsaXN0IG9mICIKLQkJCQkJImltcG9ydCBob29rcyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKG1ldGFfcGF0aCk7ICAvKiB6YXAgZ3VhcmQgKi8KLQkJbnBhdGggPSBQeUxpc3RfU2l6ZShtZXRhX3BhdGgpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnBhdGg7IGkrKykgewotCQkJUHlPYmplY3QgKmxvYWRlcjsKLQkJCVB5T2JqZWN0ICpob29rID0gUHlMaXN0X0dldEl0ZW0obWV0YV9wYXRoLCBpKTsKLQkJCWxvYWRlciA9IFB5T2JqZWN0X0NhbGxNZXRob2QoaG9vaywgImZpbmRfbW9kdWxlIiwKLQkJCQkJCSAgICAgInNPIiwgZnVsbG5hbWUsCi0JCQkJCQkgICAgIHBhdGggIT0gTlVMTCA/Ci0JCQkJCQkgICAgIHBhdGggOiBQeV9Ob25lKTsKLQkJCWlmIChsb2FkZXIgPT0gTlVMTCkgewotCQkJCVB5X0RFQ1JFRihtZXRhX3BhdGgpOwotCQkJCXJldHVybiBOVUxMOyAgLyogdHJ1ZSBlcnJvciAqLwotCQkJfQotCQkJaWYgKGxvYWRlciAhPSBQeV9Ob25lKSB7Ci0JCQkJLyogYSBsb2FkZXIgd2FzIGZvdW5kICovCi0JCQkJKnBfbG9hZGVyID0gbG9hZGVyOwotCQkJCVB5X0RFQ1JFRihtZXRhX3BhdGgpOwotCQkJCXJldHVybiAmaW1wb3J0aG9va2Rlc2NyOwotCQkJfQotCQkJUHlfREVDUkVGKGxvYWRlcik7Ci0JCX0KLQkJUHlfREVDUkVGKG1ldGFfcGF0aCk7Ci0JfQorICAgICAgICBtZXRhX3BhdGggPSBQeVN5c19HZXRPYmplY3QoIm1ldGFfcGF0aCIpOworICAgICAgICBpZiAobWV0YV9wYXRoID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhtZXRhX3BhdGgpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5cy5tZXRhX3BhdGggbXVzdCBiZSBhIGxpc3Qgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgaG9va3MiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihtZXRhX3BhdGgpOyAgLyogemFwIGd1YXJkICovCisgICAgICAgIG5wYXRoID0gUHlMaXN0X1NpemUobWV0YV9wYXRoKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wYXRoOyBpKyspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpsb2FkZXI7CisgICAgICAgICAgICBQeU9iamVjdCAqaG9vayA9IFB5TGlzdF9HZXRJdGVtKG1ldGFfcGF0aCwgaSk7CisgICAgICAgICAgICBsb2FkZXIgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGhvb2ssICJmaW5kX21vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzTyIsIGZ1bGxuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoIDogUHlfTm9uZSk7CisgICAgICAgICAgICBpZiAobG9hZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWV0YV9wYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgIC8qIHRydWUgZXJyb3IgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIC8qIGEgbG9hZGVyIHdhcyBmb3VuZCAqLworICAgICAgICAgICAgICAgICpwX2xvYWRlciA9IGxvYWRlcjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWV0YV9wYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJmltcG9ydGhvb2tkZXNjcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihsb2FkZXIpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihtZXRhX3BhdGgpOworICAgIH0KIAotCWlmIChwYXRoICE9IE5VTEwgJiYgUHlTdHJpbmdfQ2hlY2socGF0aCkpIHsKLQkJLyogVGhlIG9ubHkgdHlwZSBvZiBzdWJtb2R1bGUgYWxsb3dlZCBpbnNpZGUgYSAiZnJvemVuIgotCQkgICBwYWNrYWdlIGFyZSBvdGhlciBmcm96ZW4gbW9kdWxlcyBvciBwYWNrYWdlcy4gKi8KLQkJaWYgKFB5U3RyaW5nX1NpemUocGF0aCkgKyAxICsgc3RybGVuKG5hbWUpID49IChzaXplX3QpYnVmbGVuKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkJCSJmdWxsIGZyb3plbiBtb2R1bGUgbmFtZSB0b28gbG9uZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJc3RyY3B5KGJ1ZiwgUHlTdHJpbmdfQXNTdHJpbmcocGF0aCkpOwotCQlzdHJjYXQoYnVmLCAiLiIpOwotCQlzdHJjYXQoYnVmLCBuYW1lKTsKLQkJc3RyY3B5KG5hbWUsIGJ1Zik7Ci0JCWlmIChmaW5kX2Zyb3plbihuYW1lKSAhPSBOVUxMKSB7Ci0JCQlzdHJjcHkoYnVmLCBuYW1lKTsKLQkJCXJldHVybiAmZmRfZnJvemVuOwotCQl9Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIk5vIGZyb3plbiBzdWJtb2R1bGUgbmFtZWQgJS4yMDBzIiwgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAocGF0aCA9PSBOVUxMKSB7Ci0JCWlmIChpc19idWlsdGluKG5hbWUpKSB7Ci0JCQlzdHJjcHkoYnVmLCBuYW1lKTsKLQkJCXJldHVybiAmZmRfYnVpbHRpbjsKLQkJfQotCQlpZiAoKGZpbmRfZnJvemVuKG5hbWUpKSAhPSBOVUxMKSB7Ci0JCQlzdHJjcHkoYnVmLCBuYW1lKTsKLQkJCXJldHVybiAmZmRfZnJvemVuOwotCQl9CisgICAgaWYgKHBhdGggIT0gTlVMTCAmJiBQeVN0cmluZ19DaGVjayhwYXRoKSkgeworICAgICAgICAvKiBUaGUgb25seSB0eXBlIG9mIHN1Ym1vZHVsZSBhbGxvd2VkIGluc2lkZSBhICJmcm96ZW4iCisgICAgICAgICAgIHBhY2thZ2UgYXJlIG90aGVyIGZyb3plbiBtb2R1bGVzIG9yIHBhY2thZ2VzLiAqLworICAgICAgICBpZiAoUHlTdHJpbmdfU2l6ZShwYXRoKSArIDEgKyBzdHJsZW4obmFtZSkgPj0gKHNpemVfdClidWZsZW4pIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVsbCBmcm96ZW4gbW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0cmNweShidWYsIFB5U3RyaW5nX0FzU3RyaW5nKHBhdGgpKTsKKyAgICAgICAgc3RyY2F0KGJ1ZiwgIi4iKTsKKyAgICAgICAgc3RyY2F0KGJ1ZiwgbmFtZSk7CisgICAgICAgIHN0cmNweShuYW1lLCBidWYpOworICAgICAgICBpZiAoZmluZF9mcm96ZW4obmFtZSkgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gJmZkX2Zyb3plbjsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTm8gZnJvemVuIHN1Ym1vZHVsZSBuYW1lZCAlLjIwMHMiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwYXRoID09IE5VTEwpIHsKKyAgICAgICAgaWYgKGlzX2J1aWx0aW4obmFtZSkpIHsKKyAgICAgICAgICAgIHN0cmNweShidWYsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuICZmZF9idWlsdGluOworICAgICAgICB9CisgICAgICAgIGlmICgoZmluZF9mcm96ZW4obmFtZSkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0cmNweShidWYsIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuICZmZF9mcm96ZW47CisgICAgICAgIH0KIAogI2lmZGVmIE1TX0NPUkVETEwKLQkJZnAgPSBQeVdpbl9GaW5kUmVnaXN0ZXJlZE1vZHVsZShuYW1lLCAmZmRwLCBidWYsIGJ1Zmxlbik7Ci0JCWlmIChmcCAhPSBOVUxMKSB7Ci0JCQkqcF9mcCA9IGZwOwotCQkJcmV0dXJuIGZkcDsKLQkJfQorICAgICAgICBmcCA9IFB5V2luX0ZpbmRSZWdpc3RlcmVkTW9kdWxlKG5hbWUsICZmZHAsIGJ1ZiwgYnVmbGVuKTsKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpwX2ZwID0gZnA7CisgICAgICAgICAgICByZXR1cm4gZmRwOworICAgICAgICB9CiAjZW5kaWYKLQkJcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpOwotCX0KLQlpZiAocGF0aCA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2socGF0aCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSJzeXMucGF0aCBtdXN0IGJlIGEgbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICBwYXRoID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoIik7CisgICAgfQorICAgIGlmIChwYXRoID09IE5VTEwgfHwgIVB5TGlzdF9DaGVjayhwYXRoKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3lzLnBhdGggbXVzdCBiZSBhIGxpc3Qgb2YgZGlyZWN0b3J5IG5hbWVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXBhdGhfaG9va3MgPSBQeVN5c19HZXRPYmplY3QoInBhdGhfaG9va3MiKTsKLQlpZiAocGF0aF9ob29rcyA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2socGF0aF9ob29rcykpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSJzeXMucGF0aF9ob29rcyBtdXN0IGJlIGEgbGlzdCBvZiAiCi0JCQkJImltcG9ydCBob29rcyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcGF0aF9pbXBvcnRlcl9jYWNoZSA9IFB5U3lzX0dldE9iamVjdCgicGF0aF9pbXBvcnRlcl9jYWNoZSIpOwotCWlmIChwYXRoX2ltcG9ydGVyX2NhY2hlID09IE5VTEwgfHwKLQkgICAgIVB5RGljdF9DaGVjayhwYXRoX2ltcG9ydGVyX2NhY2hlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkJInN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlIG11c3QgYmUgYSBkaWN0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBwYXRoX2hvb2tzID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoX2hvb2tzIik7CisgICAgaWYgKHBhdGhfaG9va3MgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHBhdGhfaG9va3MpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzeXMucGF0aF9ob29rcyBtdXN0IGJlIGEgbGlzdCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IGhvb2tzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwYXRoX2ltcG9ydGVyX2NhY2hlID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoX2ltcG9ydGVyX2NhY2hlIik7CisgICAgaWYgKHBhdGhfaW1wb3J0ZXJfY2FjaGUgPT0gTlVMTCB8fAorICAgICAgICAhUHlEaWN0X0NoZWNrKHBhdGhfaW1wb3J0ZXJfY2FjaGUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSBtdXN0IGJlIGEgZGljdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlucGF0aCA9IFB5TGlzdF9TaXplKHBhdGgpOwotCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7Ci0JZm9yIChpID0gMDsgaSA8IG5wYXRoOyBpKyspIHsKLQkJUHlPYmplY3QgKmNvcHkgPSBOVUxMOwotCQlQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKHBhdGgsIGkpOwotCQlpZiAoIXYpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICBucGF0aCA9IFB5TGlzdF9TaXplKHBhdGgpOworICAgIG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisgICAgZm9yIChpID0gMDsgaSA8IG5wYXRoOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKmNvcHkgPSBOVUxMOworICAgICAgICBQeU9iamVjdCAqdiA9IFB5TGlzdF9HZXRJdGVtKHBhdGgsIGkpOworICAgICAgICBpZiAoIXYpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JCWlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLQkJCWNvcHkgPSBQeVVuaWNvZGVfRW5jb2RlKFB5VW5pY29kZV9BU19VTklDT0RFKHYpLAotCQkJCVB5VW5pY29kZV9HRVRfU0laRSh2KSwgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywgTlVMTCk7Ci0JCQlpZiAoY29weSA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJdiA9IGNvcHk7Ci0JCX0KLQkJZWxzZQorICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICBjb3B5ID0gUHlVbmljb2RlX0VuY29kZShQeVVuaWNvZGVfQVNfVU5JQ09ERSh2KSwKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX1NJWkUodiksIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsIE5VTEwpOworICAgICAgICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHYgPSBjb3B5OworICAgICAgICB9CisgICAgICAgIGVsc2UKICNlbmRpZgotCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKQotCQkJY29udGludWU7Ci0JCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCQlpZiAobGVuICsgMiArIG5hbWVsZW4gKyBNQVhTVUZGSVhTSVpFID49IGJ1ZmxlbikgewotCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCWNvbnRpbnVlOyAvKiBUb28gbG9uZyAqLwotCQl9Ci0JCXN0cmNweShidWYsIFB5U3RyaW5nX0FTX1NUUklORyh2KSk7Ci0JCWlmIChzdHJsZW4oYnVmKSAhPSBsZW4pIHsKLQkJCVB5X1hERUNSRUYoY29weSk7Ci0JCQljb250aW51ZTsgLyogdiBjb250YWlucyAnXDAnICovCi0JCX0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRSh2KTsKKyAgICAgICAgaWYgKGxlbiArIDIgKyBuYW1lbGVuICsgTUFYU1VGRklYU0laRSA+PSBidWZsZW4pIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoY29weSk7CisgICAgICAgICAgICBjb250aW51ZTsgLyogVG9vIGxvbmcgKi8KKyAgICAgICAgfQorICAgICAgICBzdHJjcHkoYnVmLCBQeVN0cmluZ19BU19TVFJJTkcodikpOworICAgICAgICBpZiAoc3RybGVuKGJ1ZikgIT0gbGVuKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOworICAgICAgICAgICAgY29udGludWU7IC8qIHYgY29udGFpbnMgJ1wwJyAqLworICAgICAgICB9CiAKLQkJLyogc3lzLnBhdGhfaG9va3MgaW1wb3J0IGhvb2sgKi8KLQkJaWYgKHBfbG9hZGVyICE9IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICppbXBvcnRlcjsKKyAgICAgICAgLyogc3lzLnBhdGhfaG9va3MgaW1wb3J0IGhvb2sgKi8KKyAgICAgICAgaWYgKHBfbG9hZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppbXBvcnRlcjsKIAotCQkJaW1wb3J0ZXIgPSBnZXRfcGF0aF9pbXBvcnRlcihwYXRoX2ltcG9ydGVyX2NhY2hlLAotCQkJCQkJICAgICBwYXRoX2hvb2tzLCB2KTsKLQkJCWlmIChpbXBvcnRlciA9PSBOVUxMKSB7Ci0JCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCS8qIE5vdGU6IGltcG9ydGVyIGlzIGEgYm9ycm93ZWQgcmVmZXJlbmNlICovCi0JCQlpZiAoaW1wb3J0ZXIgIT0gUHlfTm9uZSkgewotCQkJCVB5T2JqZWN0ICpsb2FkZXI7Ci0JCQkJbG9hZGVyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChpbXBvcnRlciwKLQkJCQkJCQkgICAgICJmaW5kX21vZHVsZSIsCi0JCQkJCQkJICAgICAicyIsIGZ1bGxuYW1lKTsKLQkJCQlQeV9YREVDUkVGKGNvcHkpOwotCQkJCWlmIChsb2FkZXIgPT0gTlVMTCkKLQkJCQkJcmV0dXJuIE5VTEw7ICAvKiBlcnJvciAqLwotCQkJCWlmIChsb2FkZXIgIT0gUHlfTm9uZSkgewotCQkJCQkvKiBhIGxvYWRlciB3YXMgZm91bmQgKi8KLQkJCQkJKnBfbG9hZGVyID0gbG9hZGVyOwotCQkJCQlyZXR1cm4gJmltcG9ydGhvb2tkZXNjcjsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKGxvYWRlcik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJLyogbm8gaG9vayB3YXMgZm91bmQsIHVzZSBidWlsdGluIGltcG9ydCAqLworICAgICAgICAgICAgaW1wb3J0ZXIgPSBnZXRfcGF0aF9pbXBvcnRlcihwYXRoX2ltcG9ydGVyX2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2hvb2tzLCB2KTsKKyAgICAgICAgICAgIGlmIChpbXBvcnRlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIE5vdGU6IGltcG9ydGVyIGlzIGEgYm9ycm93ZWQgcmVmZXJlbmNlICovCisgICAgICAgICAgICBpZiAoaW1wb3J0ZXIgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsb2FkZXI7CisgICAgICAgICAgICAgICAgbG9hZGVyID0gUHlPYmplY3RfQ2FsbE1ldGhvZChpbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5kX21vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicyIsIGZ1bGxuYW1lKTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAvKiBlcnJvciAqLworICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgICAgICAvKiBhIGxvYWRlciB3YXMgZm91bmQgKi8KKyAgICAgICAgICAgICAgICAgICAgKnBfbG9hZGVyID0gbG9hZGVyOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gJmltcG9ydGhvb2tkZXNjcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGxvYWRlcik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbm8gaG9vayB3YXMgZm91bmQsIHVzZSBidWlsdGluIGltcG9ydCAqLwogCi0JCWlmIChsZW4gPiAwICYmIGJ1ZltsZW4tMV0gIT0gU0VQCisgICAgICAgIGlmIChsZW4gPiAwICYmIGJ1ZltsZW4tMV0gIT0gU0VQCiAjaWZkZWYgQUxUU0VQCi0JCSAgICAmJiBidWZbbGVuLTFdICE9IEFMVFNFUAorICAgICAgICAgICAgJiYgYnVmW2xlbi0xXSAhPSBBTFRTRVAKICNlbmRpZgotCQkgICAgKQotCQkJYnVmW2xlbisrXSA9IFNFUDsKLQkJc3RyY3B5KGJ1ZitsZW4sIG5hbWUpOwotCQlsZW4gKz0gbmFtZWxlbjsKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGJ1ZltsZW4rK10gPSBTRVA7CisgICAgICAgIHN0cmNweShidWYrbGVuLCBuYW1lKTsKKyAgICAgICAgbGVuICs9IG5hbWVsZW47CiAKLQkJLyogQ2hlY2sgZm9yIHBhY2thZ2UgaW1wb3J0IChidWYgaG9sZHMgYSBkaXJlY3RvcnkgbmFtZSwKLQkJICAgYW5kIHRoZXJlJ3MgYW4gX19pbml0X18gbW9kdWxlIGluIHRoYXQgZGlyZWN0b3J5ICovCisgICAgICAgIC8qIENoZWNrIGZvciBwYWNrYWdlIGltcG9ydCAoYnVmIGhvbGRzIGEgZGlyZWN0b3J5IG5hbWUsCisgICAgICAgICAgIGFuZCB0aGVyZSdzIGFuIF9faW5pdF9fIG1vZHVsZSBpbiB0aGF0IGRpcmVjdG9yeSAqLwogI2lmZGVmIEhBVkVfU1RBVAotCQlpZiAoc3RhdChidWYsICZzdGF0YnVmKSA9PSAwICYmICAgICAgICAgLyogaXQgZXhpc3RzICovCi0JCSAgICBTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkgJiYgICAgICAgICAvKiBpdCdzIGEgZGlyZWN0b3J5ICovCi0JCSAgICBjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKSkgeyAvKiBjYXNlIG1hdGNoZXMgKi8KLQkJCWlmIChmaW5kX2luaXRfbW9kdWxlKGJ1ZikpIHsgLyogYW5kIGhhcyBfX2luaXRfXy5weSAqLwotCQkJCVB5X1hERUNSRUYoY29weSk7Ci0JCQkJcmV0dXJuICZmZF9wYWNrYWdlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2hhciB3YXJuc3RyW01BWFBBVEhMRU4rODBdOwotCQkJCXNwcmludGYod2FybnN0ciwgIk5vdCBpbXBvcnRpbmcgZGlyZWN0b3J5ICIKLQkJCQkJIiclLipzJzogbWlzc2luZyBfX2luaXRfXy5weSIsIAotCQkJCQlNQVhQQVRITEVOLCBidWYpOwotCQkJCWlmIChQeUVycl9XYXJuKFB5RXhjX0ltcG9ydFdhcm5pbmcsCi0JCQkJCSAgICAgICB3YXJuc3RyKSkgewotCQkJCQlQeV9YREVDUkVGKGNvcHkpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgaWYgKHN0YXQoYnVmLCAmc3RhdGJ1ZikgPT0gMCAmJiAgICAgICAgIC8qIGl0IGV4aXN0cyAqLworICAgICAgICAgICAgU19JU0RJUihzdGF0YnVmLnN0X21vZGUpICYmICAgICAgICAgLyogaXQncyBhIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSkpIHsgLyogY2FzZSBtYXRjaGVzICovCisgICAgICAgICAgICBpZiAoZmluZF9pbml0X21vZHVsZShidWYpKSB7IC8qIGFuZCBoYXMgX19pbml0X18ucHkgKi8KKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOworICAgICAgICAgICAgICAgIHJldHVybiAmZmRfcGFja2FnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXIgd2FybnN0cltNQVhQQVRITEVOKzgwXTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHdhcm5zdHIsICJOb3QgaW1wb3J0aW5nIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICInJS4qcyc6IG1pc3NpbmcgX19pbml0X18ucHkiLAorICAgICAgICAgICAgICAgICAgICBNQVhQQVRITEVOLCBidWYpOworICAgICAgICAgICAgICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX0ltcG9ydFdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybnN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAjZWxzZQotCQkvKiBYWFggSG93IGFyZSB5b3UgZ29pbmcgdG8gdGVzdCBmb3IgZGlyZWN0b3JpZXM/ICovCisgICAgICAgIC8qIFhYWCBIb3cgYXJlIHlvdSBnb2luZyB0byB0ZXN0IGZvciBkaXJlY3Rvcmllcz8gKi8KICNpZmRlZiBSSVNDT1MKLQkJaWYgKGlzZGlyKGJ1ZikgJiYKLQkJICAgIGNhc2Vfb2soYnVmLCBsZW4sIG5hbWVsZW4sIG5hbWUpKSB7Ci0JCQlpZiAoZmluZF9pbml0X21vZHVsZShidWYpKSB7Ci0JCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCQlyZXR1cm4gJmZkX3BhY2thZ2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljaGFyIHdhcm5zdHJbTUFYUEFUSExFTis4MF07Ci0JCQkJc3ByaW50Zih3YXJuc3RyLCAiTm90IGltcG9ydGluZyBkaXJlY3RvcnkgIgotCQkJCQkiJyUuKnMnOiBtaXNzaW5nIF9faW5pdF9fLnB5IiwgCi0JCQkJCU1BWFBBVEhMRU4sIGJ1Zik7Ci0JCQkJaWYgKFB5RXJyX1dhcm4oUHlFeGNfSW1wb3J0V2FybmluZywKLQkJCQkJICAgICAgIHdhcm5zdHIpKSB7Ci0JCQkJCVB5X1hERUNSRUYoY29weSk7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0KLQkJfQorICAgICAgICBpZiAoaXNkaXIoYnVmKSAmJgorICAgICAgICAgICAgY2FzZV9vayhidWYsIGxlbiwgbmFtZWxlbiwgbmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChmaW5kX2luaXRfbW9kdWxlKGJ1ZikpIHsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGNvcHkpOworICAgICAgICAgICAgICAgIHJldHVybiAmZmRfcGFja2FnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNoYXIgd2FybnN0cltNQVhQQVRITEVOKzgwXTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHdhcm5zdHIsICJOb3QgaW1wb3J0aW5nIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICInJS4qcyc6IG1pc3NpbmcgX19pbml0X18ucHkiLAorICAgICAgICAgICAgICAgICAgICBNQVhQQVRITEVOLCBidWYpOworICAgICAgICAgICAgICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX0ltcG9ydFdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybnN0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihjb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKICNlbmRpZgogI2lmIGRlZmluZWQoUFlPU19PUzIpCi0JCS8qIHRha2UgYSBzbmFwc2hvdCBvZiB0aGUgbW9kdWxlIHNwZWMgZm9yIHJlc3RvcmF0aW9uCi0JCSAqIGFmdGVyIHRoZSA4IGNoYXJhY3RlciBETEwgaGFja2VyeQotCQkgKi8KLQkJc2F2ZWRfYnVmID0gc3RyZHVwKGJ1Zik7Ci0JCXNhdmVkX2xlbiA9IGxlbjsKLQkJc2F2ZWRfbmFtZWxlbiA9IG5hbWVsZW47CisgICAgICAgIC8qIHRha2UgYSBzbmFwc2hvdCBvZiB0aGUgbW9kdWxlIHNwZWMgZm9yIHJlc3RvcmF0aW9uCisgICAgICAgICAqIGFmdGVyIHRoZSA4IGNoYXJhY3RlciBETEwgaGFja2VyeQorICAgICAgICAgKi8KKyAgICAgICAgc2F2ZWRfYnVmID0gc3RyZHVwKGJ1Zik7CisgICAgICAgIHNhdmVkX2xlbiA9IGxlbjsKKyAgICAgICAgc2F2ZWRfbmFtZWxlbiA9IG5hbWVsZW47CiAjZW5kaWYgLyogUFlPU19PUzIgKi8KLQkJZm9yIChmZHAgPSBfUHlJbXBvcnRfRmlsZXRhYjsgZmRwLT5zdWZmaXggIT0gTlVMTDsgZmRwKyspIHsKKyAgICAgICAgZm9yIChmZHAgPSBfUHlJbXBvcnRfRmlsZXRhYjsgZmRwLT5zdWZmaXggIT0gTlVMTDsgZmRwKyspIHsKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKEhBVkVfRFlOQU1JQ19MT0FESU5HKQotCQkJLyogT1MvMiBsaW1pdHMgRExMcyB0byA4IGNoYXJhY3RlciBuYW1lcyAody9vCi0JCQkgICBleHRlbnNpb24pCi0JCQkgKiBzbyBpZiB0aGUgbmFtZSBpcyBsb25nZXIgdGhhbiB0aGF0IGFuZCBpdHMgYQotCQkJICogZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZSB3ZSdyZSBnb2luZyB0byB0cnksCi0JCQkgKiB0cnVuY2F0ZSB0aGUgbmFtZSBiZWZvcmUgdHJ5aW5nCi0JCQkgKi8KLQkJCWlmIChzdHJsZW4oc3VibmFtZSkgPiA4KSB7Ci0JCQkJLyogaXMgdGhpcyBhbiBhdHRlbXB0IHRvIGxvYWQgYSBDIGV4dGVuc2lvbj8gKi8KLQkJCQljb25zdCBzdHJ1Y3QgZmlsZWRlc2NyICpzY2FuOwotCQkJCXNjYW4gPSBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWI7Ci0JCQkJd2hpbGUgKHNjYW4tPnN1ZmZpeCAhPSBOVUxMKSB7Ci0JCQkJCWlmICghc3RyY21wKHNjYW4tPnN1ZmZpeCwgZmRwLT5zdWZmaXgpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWVsc2UKLQkJCQkJCXNjYW4rKzsKLQkJCQl9Ci0JCQkJaWYgKHNjYW4tPnN1ZmZpeCAhPSBOVUxMKSB7Ci0JCQkJCS8qIHllcywgc28gdHJ1bmNhdGUgdGhlIG5hbWUgKi8KLQkJCQkJbmFtZWxlbiA9IDg7Ci0JCQkJCWxlbiAtPSBzdHJsZW4oc3VibmFtZSkgLSBuYW1lbGVuOwotCQkJCQlidWZbbGVuXSA9ICdcMCc7Ci0JCQkJfQotCQkJfQorICAgICAgICAgICAgLyogT1MvMiBsaW1pdHMgRExMcyB0byA4IGNoYXJhY3RlciBuYW1lcyAody9vCisgICAgICAgICAgICAgICBleHRlbnNpb24pCisgICAgICAgICAgICAgKiBzbyBpZiB0aGUgbmFtZSBpcyBsb25nZXIgdGhhbiB0aGF0IGFuZCBpdHMgYQorICAgICAgICAgICAgICogZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZSB3ZSdyZSBnb2luZyB0byB0cnksCisgICAgICAgICAgICAgKiB0cnVuY2F0ZSB0aGUgbmFtZSBiZWZvcmUgdHJ5aW5nCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzdHJsZW4oc3VibmFtZSkgPiA4KSB7CisgICAgICAgICAgICAgICAgLyogaXMgdGhpcyBhbiBhdHRlbXB0IHRvIGxvYWQgYSBDIGV4dGVuc2lvbj8gKi8KKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZmlsZWRlc2NyICpzY2FuOworICAgICAgICAgICAgICAgIHNjYW4gPSBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWI7CisgICAgICAgICAgICAgICAgd2hpbGUgKHNjYW4tPnN1ZmZpeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHNjYW4tPnN1ZmZpeCwgZmRwLT5zdWZmaXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNjYW4tPnN1ZmZpeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHllcywgc28gdHJ1bmNhdGUgdGhlIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgbmFtZWxlbiA9IDg7CisgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBzdHJsZW4oc3VibmFtZSkgLSBuYW1lbGVuOworICAgICAgICAgICAgICAgICAgICBidWZbbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogI2VuZGlmIC8qIFBZT1NfT1MyICovCi0JCQlzdHJjcHkoYnVmK2xlbiwgZmRwLT5zdWZmaXgpOwotCQkJaWYgKFB5X1ZlcmJvc2VGbGFnID4gMSkKLQkJCQlQeVN5c19Xcml0ZVN0ZGVycigiIyB0cnlpbmcgJXNcbiIsIGJ1Zik7Ci0JCQlmaWxlbW9kZSA9IGZkcC0+bW9kZTsKLQkJCWlmIChmaWxlbW9kZVswXSA9PSAnVScpCi0JCQkJZmlsZW1vZGUgPSAiciIgUFlfU1RESU9URVhUTU9ERTsKLQkJCWZwID0gZm9wZW4oYnVmLCBmaWxlbW9kZSk7Ci0JCQlpZiAoZnAgIT0gTlVMTCkgewotCQkJCWlmIChjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKSkKLQkJCQkJYnJlYWs7Ci0JCQkJZWxzZSB7CSAvKiBjb250aW51ZSBzZWFyY2ggKi8KLQkJCQkJZmNsb3NlKGZwKTsKLQkJCQkJZnAgPSBOVUxMOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIHN0cmNweShidWYrbGVuLCBmZHAtPnN1ZmZpeCk7CisgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcgPiAxKQorICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCIjIHRyeWluZyAlc1xuIiwgYnVmKTsKKyAgICAgICAgICAgIGZpbGVtb2RlID0gZmRwLT5tb2RlOworICAgICAgICAgICAgaWYgKGZpbGVtb2RlWzBdID09ICdVJykKKyAgICAgICAgICAgICAgICBmaWxlbW9kZSA9ICJyIiBQWV9TVERJT1RFWFRNT0RFOworICAgICAgICAgICAgZnAgPSBmb3BlbihidWYsIGZpbGVtb2RlKTsKKyAgICAgICAgICAgIGlmIChmcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhc2Vfb2soYnVmLCBsZW4sIG5hbWVsZW4sIG5hbWUpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgLyogY29udGludWUgc2VhcmNoICovCisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgICAgICAgICAgICAgIGZwID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAjaWYgZGVmaW5lZChQWU9TX09TMikKLQkJCS8qIHJlc3RvcmUgdGhlIHNhdmVkIHNuYXBzaG90ICovCi0JCQlzdHJjcHkoYnVmLCBzYXZlZF9idWYpOwotCQkJbGVuID0gc2F2ZWRfbGVuOwotCQkJbmFtZWxlbiA9IHNhdmVkX25hbWVsZW47CisgICAgICAgICAgICAvKiByZXN0b3JlIHRoZSBzYXZlZCBzbmFwc2hvdCAqLworICAgICAgICAgICAgc3RyY3B5KGJ1Ziwgc2F2ZWRfYnVmKTsKKyAgICAgICAgICAgIGxlbiA9IHNhdmVkX2xlbjsKKyAgICAgICAgICAgIG5hbWVsZW4gPSBzYXZlZF9uYW1lbGVuOwogI2VuZGlmCi0JCX0KKyAgICAgICAgfQogI2lmIGRlZmluZWQoUFlPU19PUzIpCi0JCS8qIGRvbid0IG5lZWQvd2FudCB0aGUgbW9kdWxlIG5hbWUgc25hcHNob3QgYW55bW9yZSAqLwotCQlpZiAoc2F2ZWRfYnVmKQotCQl7Ci0JCQlmcmVlKHNhdmVkX2J1Zik7Ci0JCQlzYXZlZF9idWYgPSBOVUxMOwotCQl9CisgICAgICAgIC8qIGRvbid0IG5lZWQvd2FudCB0aGUgbW9kdWxlIG5hbWUgc25hcHNob3QgYW55bW9yZSAqLworICAgICAgICBpZiAoc2F2ZWRfYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBmcmVlKHNhdmVkX2J1Zik7CisgICAgICAgICAgICBzYXZlZF9idWYgPSBOVUxMOworICAgICAgICB9CiAjZW5kaWYKLQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJaWYgKGZwICE9IE5VTEwpCi0JCQlicmVhazsKLQl9Ci0JaWYgKGZwID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAiTm8gbW9kdWxlIG5hbWVkICUuMjAwcyIsIG5hbWUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKnBfZnAgPSBmcDsKLQlyZXR1cm4gZmRwOworICAgICAgICBQeV9YREVDUkVGKGNvcHkpOworICAgICAgICBpZiAoZnAgIT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiTm8gbW9kdWxlIG5hbWVkICUuMjAwcyIsIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKnBfZnAgPSBmcDsKKyAgICByZXR1cm4gZmRwOwogfQogCiAvKiBIZWxwZXJzIGZvciBtYWluLmMKQEAgLTE1MTUsMTUgKzE1MTUsMTUgQEAKICAqLwogc3RydWN0IGZpbGVkZXNjciAqCiBfUHlJbXBvcnRfRmluZE1vZHVsZShjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqcGF0aCwgY2hhciAqYnVmLAotCSAgICBzaXplX3QgYnVmbGVuLCBGSUxFICoqcF9mcCwgUHlPYmplY3QgKipwX2xvYWRlcikKKyAgICAgICAgICAgIHNpemVfdCBidWZsZW4sIEZJTEUgKipwX2ZwLCBQeU9iamVjdCAqKnBfbG9hZGVyKQogewotCXJldHVybiBmaW5kX21vZHVsZSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBuYW1lLCBwYXRoLAotCQkJICAgYnVmLCBidWZsZW4sIHBfZnAsIHBfbG9hZGVyKTsKKyAgICByZXR1cm4gZmluZF9tb2R1bGUoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmFtZSwgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZsZW4sIHBfZnAsIHBfbG9hZGVyKTsKIH0KIAogUHlBUElfRlVOQyhpbnQpIF9QeUltcG9ydF9Jc1NjcmlwdChzdHJ1Y3QgZmlsZWRlc2NyICogZmQpCiB7Ci0JcmV0dXJuIGZkLT50eXBlID09IFBZX1NPVVJDRSB8fCBmZC0+dHlwZSA9PSBQWV9DT01QSUxFRDsKKyAgICByZXR1cm4gZmQtPnR5cGUgPT0gUFlfU09VUkNFIHx8IGZkLT50eXBlID09IFBZX0NPTVBJTEVEOwogfQogCiAvKiBjYXNlX29rKGNoYXIqIGJ1ZiwgUHlfc3NpemVfdCBsZW4sIFB5X3NzaXplX3QgbmFtZWxlbiwgY2hhciogbmFtZSkKQEAgLTE1ODIsMTI4ICsxNTgyLDEyOCBAQAogCiAvKiBNU19XSU5ET1dTICovCiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKQotCVdJTjMyX0ZJTkRfREFUQSBkYXRhOwotCUhBTkRMRSBoOworICAgIFdJTjMyX0ZJTkRfREFUQSBkYXRhOworICAgIEhBTkRMRSBoOwogCi0JaWYgKFB5X0dFVEVOVigiUFlUSE9OQ0FTRU9LIikgIT0gTlVMTCkKLQkJcmV0dXJuIDE7CisgICAgaWYgKFB5X0dFVEVOVigiUFlUSE9OQ0FTRU9LIikgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQloID0gRmluZEZpcnN0RmlsZShidWYsICZkYXRhKTsKLQlpZiAoaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfTmFtZUVycm9yLAotCQkgICJDYW4ndCBmaW5kIGZpbGUgZm9yIG1vZHVsZSAlLjEwMHNcbihmaWxlbmFtZSAlLjMwMHMpIiwKLQkJICBuYW1lLCBidWYpOwotCQlyZXR1cm4gMDsKLQl9Ci0JRmluZENsb3NlKGgpOwotCXJldHVybiBzdHJuY21wKGRhdGEuY0ZpbGVOYW1lLCBuYW1lLCBuYW1lbGVuKSA9PSAwOworICAgIGggPSBGaW5kRmlyc3RGaWxlKGJ1ZiwgJmRhdGEpOworICAgIGlmIChoID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19OYW1lRXJyb3IsCisgICAgICAgICAgIkNhbid0IGZpbmQgZmlsZSBmb3IgbW9kdWxlICUuMTAwc1xuKGZpbGVuYW1lICUuMzAwcykiLAorICAgICAgICAgIG5hbWUsIGJ1Zik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBGaW5kQ2xvc2UoaCk7CisgICAgcmV0dXJuIHN0cm5jbXAoZGF0YS5jRmlsZU5hbWUsIG5hbWUsIG5hbWVsZW4pID09IDA7CiAKIC8qIERKR1BQICovCiAjZWxpZiBkZWZpbmVkKERKR1BQKQotCXN0cnVjdCBmZmJsayBmZmJsazsKLQlpbnQgZG9uZTsKKyAgICBzdHJ1Y3QgZmZibGsgZmZibGs7CisgICAgaW50IGRvbmU7CiAKLQlpZiAoUHlfR0VURU5WKCJQWVRIT05DQVNFT0siKSAhPSBOVUxMKQotCQlyZXR1cm4gMTsKKyAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05DQVNFT0siKSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gMTsKIAotCWRvbmUgPSBmaW5kZmlyc3QoYnVmLCAmZmZibGssIEZBX0FSQ0h8RkFfUkRPTkxZfEZBX0hJRERFTnxGQV9ESVJFQyk7Ci0JaWYgKGRvbmUpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX05hbWVFcnJvciwKLQkJICAiQ2FuJ3QgZmluZCBmaWxlIGZvciBtb2R1bGUgJS4xMDBzXG4oZmlsZW5hbWUgJS4zMDBzKSIsCi0JCSAgbmFtZSwgYnVmKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiBzdHJuY21wKGZmYmxrLmZmX25hbWUsIG5hbWUsIG5hbWVsZW4pID09IDA7CisgICAgZG9uZSA9IGZpbmRmaXJzdChidWYsICZmZmJsaywgRkFfQVJDSHxGQV9SRE9OTFl8RkFfSElEREVOfEZBX0RJUkVDKTsKKyAgICBpZiAoZG9uZSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTmFtZUVycm9yLAorICAgICAgICAgICJDYW4ndCBmaW5kIGZpbGUgZm9yIG1vZHVsZSAlLjEwMHNcbihmaWxlbmFtZSAlLjMwMHMpIiwKKyAgICAgICAgICBuYW1lLCBidWYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHN0cm5jbXAoZmZibGsuZmZfbmFtZSwgbmFtZSwgbmFtZWxlbikgPT0gMDsKIAogLyogbmV3LWZhbmdsZWQgbWFjaW50b3NoIChtYWNvc3gpIG9yIEN5Z3dpbiAqLwogI2VsaWYgKGRlZmluZWQoX19NQUNIX18pICYmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pKSAmJiBkZWZpbmVkKEhBVkVfRElSRU5UX0gpCi0JRElSICpkaXJwOwotCXN0cnVjdCBkaXJlbnQgKmRwOwotCWNoYXIgZGlybmFtZVtNQVhQQVRITEVOICsgMV07Ci0JY29uc3QgaW50IGRpcmxlbiA9IGxlbiAtIG5hbWVsZW4gLSAxOyAvKiBkb24ndCB3YW50IHRyYWlsaW5nIFNFUCAqLworICAgIERJUiAqZGlycDsKKyAgICBzdHJ1Y3QgZGlyZW50ICpkcDsKKyAgICBjaGFyIGRpcm5hbWVbTUFYUEFUSExFTiArIDFdOworICAgIGNvbnN0IGludCBkaXJsZW4gPSBsZW4gLSBuYW1lbGVuIC0gMTsgLyogZG9uJ3Qgd2FudCB0cmFpbGluZyBTRVAgKi8KIAotCWlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCi0JCXJldHVybiAxOworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkNBU0VPSyIpICE9IE5VTEwpCisgICAgICAgIHJldHVybiAxOwogCi0JLyogQ29weSB0aGUgZGlyIGNvbXBvbmVudCBpbnRvIGRpcm5hbWU7IHN1YnN0aXR1dGUgIi4iIGlmIGVtcHR5ICovCi0JaWYgKGRpcmxlbiA8PSAwKSB7Ci0JCWRpcm5hbWVbMF0gPSAnLic7Ci0JCWRpcm5hbWVbMV0gPSAnXDAnOwotCX0KLQllbHNlIHsKLQkJYXNzZXJ0KGRpcmxlbiA8PSBNQVhQQVRITEVOKTsKLQkJbWVtY3B5KGRpcm5hbWUsIGJ1ZiwgZGlybGVuKTsKLQkJZGlybmFtZVtkaXJsZW5dID0gJ1wwJzsKLQl9Ci0JLyogT3BlbiB0aGUgZGlyZWN0b3J5IGFuZCBzZWFyY2ggdGhlIGVudHJpZXMgZm9yIGFuIGV4YWN0IG1hdGNoLiAqLwotCWRpcnAgPSBvcGVuZGlyKGRpcm5hbWUpOwotCWlmIChkaXJwKSB7Ci0JCWNoYXIgKm5hbWVXaXRoRXh0ID0gYnVmICsgbGVuIC0gbmFtZWxlbjsKLQkJd2hpbGUgKChkcCA9IHJlYWRkaXIoZGlycCkpICE9IE5VTEwpIHsKLQkJCWNvbnN0IGludCB0aGlzbGVuID0KKyAgICAvKiBDb3B5IHRoZSBkaXIgY29tcG9uZW50IGludG8gZGlybmFtZTsgc3Vic3RpdHV0ZSAiLiIgaWYgZW1wdHkgKi8KKyAgICBpZiAoZGlybGVuIDw9IDApIHsKKyAgICAgICAgZGlybmFtZVswXSA9ICcuJzsKKyAgICAgICAgZGlybmFtZVsxXSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoZGlybGVuIDw9IE1BWFBBVEhMRU4pOworICAgICAgICBtZW1jcHkoZGlybmFtZSwgYnVmLCBkaXJsZW4pOworICAgICAgICBkaXJuYW1lW2Rpcmxlbl0gPSAnXDAnOworICAgIH0KKyAgICAvKiBPcGVuIHRoZSBkaXJlY3RvcnkgYW5kIHNlYXJjaCB0aGUgZW50cmllcyBmb3IgYW4gZXhhY3QgbWF0Y2guICovCisgICAgZGlycCA9IG9wZW5kaXIoZGlybmFtZSk7CisgICAgaWYgKGRpcnApIHsKKyAgICAgICAgY2hhciAqbmFtZVdpdGhFeHQgPSBidWYgKyBsZW4gLSBuYW1lbGVuOworICAgICAgICB3aGlsZSAoKGRwID0gcmVhZGRpcihkaXJwKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgY29uc3QgaW50IHRoaXNsZW4gPQogI2lmZGVmIF9ESVJFTlRfSEFWRV9EX05BTUVMRU4KLQkJCQkJCWRwLT5kX25hbWxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwLT5kX25hbWxlbjsKICNlbHNlCi0JCQkJCQlzdHJsZW4oZHAtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZHAtPmRfbmFtZSk7CiAjZW5kaWYKLQkJCWlmICh0aGlzbGVuID49IG5hbWVsZW4gJiYKLQkJCSAgICBzdHJjbXAoZHAtPmRfbmFtZSwgbmFtZVdpdGhFeHQpID09IDApIHsKLQkJCQkodm9pZCljbG9zZWRpcihkaXJwKTsKLQkJCQlyZXR1cm4gMTsgLyogRm91bmQgKi8KLQkJCX0KLQkJfQotCQkodm9pZCljbG9zZWRpcihkaXJwKTsKLQl9Ci0JcmV0dXJuIDAgOyAvKiBOb3QgZm91bmQgKi8KKyAgICAgICAgICAgIGlmICh0aGlzbGVuID49IG5hbWVsZW4gJiYKKyAgICAgICAgICAgICAgICBzdHJjbXAoZHAtPmRfbmFtZSwgbmFtZVdpdGhFeHQpID09IDApIHsKKyAgICAgICAgICAgICAgICAodm9pZCljbG9zZWRpcihkaXJwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogRm91bmQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAodm9pZCljbG9zZWRpcihkaXJwKTsKKyAgICB9CisgICAgcmV0dXJuIDAgOyAvKiBOb3QgZm91bmQgKi8KIAogLyogUklTQyBPUyAqLwogI2VsaWYgZGVmaW5lZChSSVNDT1MpCi0JY2hhciBjYW5vbltNQVhQQVRITEVOKzFdOyAvKiBidWZmZXIgZm9yIHRoZSBjYW5vbmljYWwgZm9ybSBvZiB0aGUgcGF0aCAqLwotCWNoYXIgYnVmMltNQVhQQVRITEVOKzJdOwotCWNoYXIgKm5hbWVXaXRoRXh0ID0gYnVmK2xlbi1uYW1lbGVuOwotCWludCBjYW5vbmxlbjsKLQlvc19lcnJvciAqZTsKKyAgICBjaGFyIGNhbm9uW01BWFBBVEhMRU4rMV07IC8qIGJ1ZmZlciBmb3IgdGhlIGNhbm9uaWNhbCBmb3JtIG9mIHRoZSBwYXRoICovCisgICAgY2hhciBidWYyW01BWFBBVEhMRU4rMl07CisgICAgY2hhciAqbmFtZVdpdGhFeHQgPSBidWYrbGVuLW5hbWVsZW47CisgICAgaW50IGNhbm9ubGVuOworICAgIG9zX2Vycm9yICplOwogCi0JaWYgKFB5X0dFVEVOVigiUFlUSE9OQ0FTRU9LIikgIT0gTlVMTCkKLQkJcmV0dXJuIDE7CisgICAgaWYgKFB5X0dFVEVOVigiUFlUSE9OQ0FTRU9LIikgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQkvKiB3b3JrYXJvdW5kOgotCSAgIGFwcGVuZCB3aWxkY2FyZCwgb3RoZXJ3aXNlIGNhc2Ugb2YgZmlsZW5hbWUgd291bGRuJ3QgYmUgdG91Y2hlZCAqLwotCXN0cmNweShidWYyLCBidWYpOwotCXN0cmNhdChidWYyLCAiKiIpOworICAgIC8qIHdvcmthcm91bmQ6CisgICAgICAgYXBwZW5kIHdpbGRjYXJkLCBvdGhlcndpc2UgY2FzZSBvZiBmaWxlbmFtZSB3b3VsZG4ndCBiZSB0b3VjaGVkICovCisgICAgc3RyY3B5KGJ1ZjIsIGJ1Zik7CisgICAgc3RyY2F0KGJ1ZjIsICIqIik7CiAKLQllID0geG9zZnNjb250cm9sX2Nhbm9uaWNhbGlzZV9wYXRoKGJ1ZjIsY2Fub24sMCwwLE1BWFBBVEhMRU4rMSwmY2Fub25sZW4pOwotCWNhbm9ubGVuID0gTUFYUEFUSExFTisxLWNhbm9ubGVuOwotCWlmIChlIHx8IGNhbm9ubGVuPD0wIHx8IGNhbm9ubGVuPihNQVhQQVRITEVOKzEpICkKLQkJcmV0dXJuIDA7Ci0JaWYgKHN0cmNtcChuYW1lV2l0aEV4dCwgY2Fub24rY2Fub25sZW4tc3RybGVuKG5hbWVXaXRoRXh0KSk9PTApCi0JCXJldHVybiAxOyAvKiBtYXRjaCAqLworICAgIGUgPSB4b3Nmc2NvbnRyb2xfY2Fub25pY2FsaXNlX3BhdGgoYnVmMixjYW5vbiwwLDAsTUFYUEFUSExFTisxLCZjYW5vbmxlbik7CisgICAgY2Fub25sZW4gPSBNQVhQQVRITEVOKzEtY2Fub25sZW47CisgICAgaWYgKGUgfHwgY2Fub25sZW48PTAgfHwgY2Fub25sZW4+KE1BWFBBVEhMRU4rMSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoc3RyY21wKG5hbWVXaXRoRXh0LCBjYW5vbitjYW5vbmxlbi1zdHJsZW4obmFtZVdpdGhFeHQpKT09MCkKKyAgICAgICAgcmV0dXJuIDE7IC8qIG1hdGNoICovCiAKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIAogLyogT1MvMiAqLwogI2VsaWYgZGVmaW5lZChQWU9TX09TMikKLQlIRElSIGhkaXIgPSAxOwotCVVMT05HIHNyY2hjbnQgPSAxOwotCUZJTEVGSU5EQlVGMyBmZmJ1ZjsKLQlBUElSRVQgcmM7CisgICAgSERJUiBoZGlyID0gMTsKKyAgICBVTE9ORyBzcmNoY250ID0gMTsKKyAgICBGSUxFRklOREJVRjMgZmZidWY7CisgICAgQVBJUkVUIHJjOwogCi0JaWYgKFB5X0dFVEVOVigiUFlUSE9OQ0FTRU9LIikgIT0gTlVMTCkKLQkJcmV0dXJuIDE7CisgICAgaWYgKFB5X0dFVEVOVigiUFlUSE9OQ0FTRU9LIikgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CiAKLQlyYyA9IERvc0ZpbmRGaXJzdChidWYsCi0JCQkgICZoZGlyLAotCQkJICBGSUxFX1JFQURPTkxZIHwgRklMRV9ISURERU4gfCBGSUxFX1NZU1RFTSB8IEZJTEVfRElSRUNUT1JZLAotCQkJICAmZmZidWYsIHNpemVvZihmZmJ1ZiksCi0JCQkgICZzcmNoY250LAotCQkJICBGSUxfU1RBTkRBUkQpOwotCWlmIChyYyAhPSBOT19FUlJPUikKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHN0cm5jbXAoZmZidWYuYWNoTmFtZSwgbmFtZSwgbmFtZWxlbikgPT0gMDsKKyAgICByYyA9IERvc0ZpbmRGaXJzdChidWYsCisgICAgICAgICAgICAgICAgICAgICAgJmhkaXIsCisgICAgICAgICAgICAgICAgICAgICAgRklMRV9SRUFET05MWSB8IEZJTEVfSElEREVOIHwgRklMRV9TWVNURU0gfCBGSUxFX0RJUkVDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAmZmZidWYsIHNpemVvZihmZmJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgJnNyY2hjbnQsCisgICAgICAgICAgICAgICAgICAgICAgRklMX1NUQU5EQVJEKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzdHJuY21wKGZmYnVmLmFjaE5hbWUsIG5hbWUsIG5hbWVsZW4pID09IDA7CiAKIC8qIGFzc3VtaW5nIGl0J3MgYSBjYXNlLXNlbnNpdGl2ZSBmaWxlc3lzdGVtLCBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8hICovCiAjZWxzZQotCXJldHVybiAxOworICAgIHJldHVybiAxOwogCiAjZW5kaWYKIH0KQEAgLTE3MTQsNDYgKzE3MTQsNDYgQEAKIHN0YXRpYyBpbnQKIGZpbmRfaW5pdF9tb2R1bGUoY2hhciAqYnVmKQogewotCWNvbnN0IHNpemVfdCBzYXZlX2xlbiA9IHN0cmxlbihidWYpOwotCXNpemVfdCBpID0gc2F2ZV9sZW47Ci0JY2hhciAqcG5hbWU7ICAvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIF9faW5pdF9fICovCi0Jc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICBjb25zdCBzaXplX3Qgc2F2ZV9sZW4gPSBzdHJsZW4oYnVmKTsKKyAgICBzaXplX3QgaSA9IHNhdmVfbGVuOworICAgIGNoYXIgKnBuYW1lOyAgLyogcG9pbnRlciB0byBzdGFydCBvZiBfX2luaXRfXyAqLworICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7CiAKLS8qCUZvciBjYWxsaW5nIGNhc2Vfb2soYnVmLCBsZW4sIG5hbWVsZW4sIG5hbWUpOgotICoJL2EvYi9jL2QvZS9mL2cvaC9pL2ovay9zb21lX2xvbmdfbW9kdWxlX25hbWUucHlcMAotICoJXiAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgIF4gICAgXgotICoJfC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBidWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICoJfC0tLS0tLS0tLS0tLS0tLS0tLS0gbGVuIC0tLS0tLS0tLS0tLS0tLS0tLXwKLSAqCSAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0tLSBuYW1lIC0tLS0tLS18Ci0gKgkgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLSBuYW1lbGVuIC0tLS0tfAorLyogICAgICBGb3IgY2FsbGluZyBjYXNlX29rKGJ1ZiwgbGVuLCBuYW1lbGVuLCBuYW1lKToKKyAqICAgICAgL2EvYi9jL2QvZS9mL2cvaC9pL2ovay9zb21lX2xvbmdfbW9kdWxlX25hbWUucHlcMAorICogICAgICBeICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgXiAgICBeCisgKiAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0gYnVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0gbGVuIC0tLS0tLS0tLS0tLS0tLS0tLXwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0tIG5hbWUgLS0tLS0tLXwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLS0gbmFtZWxlbiAtLS0tLXwKICAqLwotCWlmIChzYXZlX2xlbiArIDEzID49IE1BWFBBVEhMRU4pCi0JCXJldHVybiAwOwotCWJ1ZltpKytdID0gU0VQOwotCXBuYW1lID0gYnVmICsgaTsKLQlzdHJjcHkocG5hbWUsICJfX2luaXRfXy5weSIpOwotCWlmIChzdGF0KGJ1ZiwgJnN0YXRidWYpID09IDApIHsKLQkJaWYgKGNhc2Vfb2soYnVmLAotCQkJICAgIHNhdmVfbGVuICsgOSwJLyogbGVuKCIvX19pbml0X18iKSAqLwotCQkgICAgICAgICAgICA4LCAgIAkJLyogbGVuKCJfX2luaXRfXyIpICovCi0JCSAgICAgICAgICAgIHBuYW1lKSkgewotCQkJYnVmW3NhdmVfbGVuXSA9ICdcMCc7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlpICs9IHN0cmxlbihwbmFtZSk7Ci0Jc3RyY3B5KGJ1ZitpLCBQeV9PcHRpbWl6ZUZsYWcgPyAibyIgOiAiYyIpOwotCWlmIChzdGF0KGJ1ZiwgJnN0YXRidWYpID09IDApIHsKLQkJaWYgKGNhc2Vfb2soYnVmLAotCQkJICAgIHNhdmVfbGVuICsgOSwJLyogbGVuKCIvX19pbml0X18iKSAqLwotCQkgICAgICAgICAgICA4LCAgIAkJLyogbGVuKCJfX2luaXRfXyIpICovCi0JCSAgICAgICAgICAgIHBuYW1lKSkgewotCQkJYnVmW3NhdmVfbGVuXSA9ICdcMCc7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlidWZbc2F2ZV9sZW5dID0gJ1wwJzsKLQlyZXR1cm4gMDsKKyAgICBpZiAoc2F2ZV9sZW4gKyAxMyA+PSBNQVhQQVRITEVOKQorICAgICAgICByZXR1cm4gMDsKKyAgICBidWZbaSsrXSA9IFNFUDsKKyAgICBwbmFtZSA9IGJ1ZiArIGk7CisgICAgc3RyY3B5KHBuYW1lLCAiX19pbml0X18ucHkiKTsKKyAgICBpZiAoc3RhdChidWYsICZzdGF0YnVmKSA9PSAwKSB7CisgICAgICAgIGlmIChjYXNlX29rKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgc2F2ZV9sZW4gKyA5LCAgICAgICAgICAgICAgIC8qIGxlbigiL19faW5pdF9fIikgKi8KKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbigiX19pbml0X18iKSAqLworICAgICAgICAgICAgICAgIHBuYW1lKSkgeworICAgICAgICAgICAgYnVmW3NhdmVfbGVuXSA9ICdcMCc7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpICs9IHN0cmxlbihwbmFtZSk7CisgICAgc3RyY3B5KGJ1ZitpLCBQeV9PcHRpbWl6ZUZsYWcgPyAibyIgOiAiYyIpOworICAgIGlmIChzdGF0KGJ1ZiwgJnN0YXRidWYpID09IDApIHsKKyAgICAgICAgaWYgKGNhc2Vfb2soYnVmLAorICAgICAgICAgICAgICAgICAgICBzYXZlX2xlbiArIDksICAgICAgICAgICAgICAgLyogbGVuKCIvX19pbml0X18iKSAqLworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuKCJfX2luaXRfXyIpICovCisgICAgICAgICAgICAgICAgcG5hbWUpKSB7CisgICAgICAgICAgICBidWZbc2F2ZV9sZW5dID0gJ1wwJzsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIGJ1ZltzYXZlX2xlbl0gPSAnXDAnOworICAgIHJldHVybiAwOwogfQogCiAjZWxzZQpAQCAtMTc2MSwzMCArMTc2MSwzMCBAQAogI2lmZGVmIFJJU0NPUwogc3RhdGljIGludAogZmluZF9pbml0X21vZHVsZShidWYpCi0JY2hhciAqYnVmOworICAgIGNoYXIgKmJ1ZjsKIHsKLQlpbnQgc2F2ZV9sZW4gPSBzdHJsZW4oYnVmKTsKLQlpbnQgaSA9IHNhdmVfbGVuOworICAgIGludCBzYXZlX2xlbiA9IHN0cmxlbihidWYpOworICAgIGludCBpID0gc2F2ZV9sZW47CiAKLQlpZiAoc2F2ZV9sZW4gKyAxMyA+PSBNQVhQQVRITEVOKQotCQlyZXR1cm4gMDsKLQlidWZbaSsrXSA9IFNFUDsKLQlzdHJjcHkoYnVmK2ksICJfX2luaXRfXy9weSIpOwotCWlmIChpc2ZpbGUoYnVmKSkgewotCQlidWZbc2F2ZV9sZW5dID0gJ1wwJzsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGlmIChzYXZlX2xlbiArIDEzID49IE1BWFBBVEhMRU4pCisgICAgICAgIHJldHVybiAwOworICAgIGJ1ZltpKytdID0gU0VQOworICAgIHN0cmNweShidWYraSwgIl9faW5pdF9fL3B5Iik7CisgICAgaWYgKGlzZmlsZShidWYpKSB7CisgICAgICAgIGJ1ZltzYXZlX2xlbl0gPSAnXDAnOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLQlpZiAoUHlfT3B0aW1pemVGbGFnKQotCQlzdHJjcHkoYnVmK2ksICJvIik7Ci0JZWxzZQotCQlzdHJjcHkoYnVmK2ksICJjIik7Ci0JaWYgKGlzZmlsZShidWYpKSB7Ci0JCWJ1ZltzYXZlX2xlbl0gPSAnXDAnOwotCQlyZXR1cm4gMTsKLQl9Ci0JYnVmW3NhdmVfbGVuXSA9ICdcMCc7Ci0JcmV0dXJuIDA7CisgICAgaWYgKFB5X09wdGltaXplRmxhZykKKyAgICAgICAgc3RyY3B5KGJ1ZitpLCAibyIpOworICAgIGVsc2UKKyAgICAgICAgc3RyY3B5KGJ1ZitpLCAiYyIpOworICAgIGlmIChpc2ZpbGUoYnVmKSkgeworICAgICAgICBidWZbc2F2ZV9sZW5dID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGJ1ZltzYXZlX2xlbl0gPSAnXDAnOworICAgIHJldHVybiAwOwogfQogI2VuZGlmIC8qUklTQ09TKi8KIApAQCAtMTc5OSw5MyArMTc5OSw5MyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGxvYWRfbW9kdWxlKGNoYXIgKm5hbWUsIEZJTEUgKmZwLCBjaGFyICpidWYsIGludCB0eXBlLCBQeU9iamVjdCAqbG9hZGVyKQogewotCVB5T2JqZWN0ICptb2R1bGVzOwotCVB5T2JqZWN0ICptOwotCWludCBlcnI7CisgICAgUHlPYmplY3QgKm1vZHVsZXM7CisgICAgUHlPYmplY3QgKm07CisgICAgaW50IGVycjsKIAotCS8qIEZpcnN0IGNoZWNrIHRoYXQgdGhlcmUncyBhbiBvcGVuIGZpbGUgKGlmIHdlIG5lZWQgb25lKSAgKi8KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFBZX1NPVVJDRToKLQljYXNlIFBZX0NPTVBJTEVEOgotCQlpZiAoZnAgPT0gTlVMTCkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkgICAiZmlsZSBvYmplY3QgcmVxdWlyZWQgZm9yIGltcG9ydCAodHlwZSBjb2RlICVkKSIsCi0JCQkJICAgICB0eXBlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIC8qIEZpcnN0IGNoZWNrIHRoYXQgdGhlcmUncyBhbiBvcGVuIGZpbGUgKGlmIHdlIG5lZWQgb25lKSAgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFBZX1NPVVJDRToKKyAgICBjYXNlIFBZX0NPTVBJTEVEOgorICAgICAgICBpZiAoZnAgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAiZmlsZSBvYmplY3QgcmVxdWlyZWQgZm9yIGltcG9ydCAodHlwZSBjb2RlICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXN3aXRjaCAodHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgewogCi0JY2FzZSBQWV9TT1VSQ0U6Ci0JCW0gPSBsb2FkX3NvdXJjZV9tb2R1bGUobmFtZSwgYnVmLCBmcCk7Ci0JCWJyZWFrOworICAgIGNhc2UgUFlfU09VUkNFOgorICAgICAgICBtID0gbG9hZF9zb3VyY2VfbW9kdWxlKG5hbWUsIGJ1ZiwgZnApOworICAgICAgICBicmVhazsKIAotCWNhc2UgUFlfQ09NUElMRUQ6Ci0JCW0gPSBsb2FkX2NvbXBpbGVkX21vZHVsZShuYW1lLCBidWYsIGZwKTsKLQkJYnJlYWs7CisgICAgY2FzZSBQWV9DT01QSUxFRDoKKyAgICAgICAgbSA9IGxvYWRfY29tcGlsZWRfbW9kdWxlKG5hbWUsIGJ1ZiwgZnApOworICAgICAgICBicmVhazsKIAogI2lmZGVmIEhBVkVfRFlOQU1JQ19MT0FESU5HCi0JY2FzZSBDX0VYVEVOU0lPTjoKLQkJbSA9IF9QeUltcG9ydF9Mb2FkRHluYW1pY01vZHVsZShuYW1lLCBidWYsIGZwKTsKLQkJYnJlYWs7CisgICAgY2FzZSBDX0VYVEVOU0lPTjoKKyAgICAgICAgbSA9IF9QeUltcG9ydF9Mb2FkRHluYW1pY01vZHVsZShuYW1lLCBidWYsIGZwKTsKKyAgICAgICAgYnJlYWs7CiAjZW5kaWYKIAotCWNhc2UgUEtHX0RJUkVDVE9SWToKLQkJbSA9IGxvYWRfcGFja2FnZShuYW1lLCBidWYpOwotCQlicmVhazsKKyAgICBjYXNlIFBLR19ESVJFQ1RPUlk6CisgICAgICAgIG0gPSBsb2FkX3BhY2thZ2UobmFtZSwgYnVmKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIENfQlVJTFRJTjoKLQljYXNlIFBZX0ZST1pFTjoKLQkJaWYgKGJ1ZiAhPSBOVUxMICYmIGJ1ZlswXSAhPSAnXDAnKQotCQkJbmFtZSA9IGJ1ZjsKLQkJaWYgKHR5cGUgPT0gQ19CVUlMVElOKQotCQkJZXJyID0gaW5pdF9idWlsdGluKG5hbWUpOwotCQllbHNlCi0JCQllcnIgPSBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUobmFtZSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChlcnIgPT0gMCkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSAgICAgIlB1cnBvcnRlZCAlcyBtb2R1bGUgJS4yMDBzIG5vdCBmb3VuZCIsCi0JCQkJICAgICB0eXBlID09IENfQlVJTFRJTiA/Ci0JCQkJCQkiYnVpbHRpbiIgOiAiZnJvemVuIiwKLQkJCQkgICAgIG5hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQkJbSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpOwotCQlpZiAobSA9PSBOVUxMKSB7Ci0JCQlQeUVycl9Gb3JtYXQoCi0JCQkJUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkJIiVzIG1vZHVsZSAlLjIwMHMgbm90IHByb3Blcmx5IGluaXRpYWxpemVkIiwKLQkJCQl0eXBlID09IENfQlVJTFRJTiA/Ci0JCQkJCSJidWlsdGluIiA6ICJmcm96ZW4iLAotCQkJCW5hbWUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfSU5DUkVGKG0pOwotCQlicmVhazsKKyAgICBjYXNlIENfQlVJTFRJTjoKKyAgICBjYXNlIFBZX0ZST1pFTjoKKyAgICAgICAgaWYgKGJ1ZiAhPSBOVUxMICYmIGJ1ZlswXSAhPSAnXDAnKQorICAgICAgICAgICAgbmFtZSA9IGJ1ZjsKKyAgICAgICAgaWYgKHR5cGUgPT0gQ19CVUlMVElOKQorICAgICAgICAgICAgZXJyID0gaW5pdF9idWlsdGluKG5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBlcnIgPSBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUobmFtZSk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJQdXJwb3J0ZWQgJXMgbW9kdWxlICUuMjAwcyBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gQ19CVUlMVElOID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidWlsdGluIiA6ICJmcm96ZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKyAgICAgICAgbSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUpOworICAgICAgICBpZiAobSA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCisgICAgICAgICAgICAgICAgUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgIiVzIG1vZHVsZSAlLjIwMHMgbm90IHByb3Blcmx5IGluaXRpYWxpemVkIiwKKyAgICAgICAgICAgICAgICB0eXBlID09IENfQlVJTFRJTiA/CisgICAgICAgICAgICAgICAgICAgICJidWlsdGluIiA6ICJmcm96ZW4iLAorICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG0pOworICAgICAgICBicmVhazsKIAotCWNhc2UgSU1QX0hPT0s6IHsKLQkJaWYgKGxvYWRlciA9PSBOVUxMKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkJCSJpbXBvcnQgaG9vayB3aXRob3V0IGxvYWRlciIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbSA9IFB5T2JqZWN0X0NhbGxNZXRob2QobG9hZGVyLCAibG9hZF9tb2R1bGUiLCAicyIsIG5hbWUpOwotCQlicmVhazsKLQl9CisgICAgY2FzZSBJTVBfSE9PSzogeworICAgICAgICBpZiAobG9hZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IGhvb2sgd2l0aG91dCBsb2FkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG0gPSBQeU9iamVjdF9DYWxsTWV0aG9kKGxvYWRlciwgImxvYWRfbW9kdWxlIiwgInMiLCBuYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0JZGVmYXVsdDoKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAiRG9uJ3Qga25vdyBob3cgdG8gaW1wb3J0ICUuMjAwcyAodHlwZSBjb2RlICVkKSIsCi0JCQkgICAgICBuYW1lLCB0eXBlKTsKLQkJbSA9IE5VTEw7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkRvbid0IGtub3cgaG93IHRvIGltcG9ydCAlLjIwMHMgKHR5cGUgY29kZSAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHR5cGUpOworICAgICAgICBtID0gTlVMTDsKIAotCX0KKyAgICB9CiAKLQlyZXR1cm4gbTsKKyAgICByZXR1cm4gbTsKIH0KIAogCkBAIC0xODk2LDMwICsxODk2LDMwIEBACiBzdGF0aWMgaW50CiBpbml0X2J1aWx0aW4oY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgX2luaXR0YWIgKnA7CisgICAgc3RydWN0IF9pbml0dGFiICpwOwogCi0JaWYgKF9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKG5hbWUsIG5hbWUpICE9IE5VTEwpCi0JCXJldHVybiAxOworICAgIGlmIChfUHlJbXBvcnRfRmluZEV4dGVuc2lvbihuYW1lLCBuYW1lKSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gMTsKIAotCWZvciAocCA9IFB5SW1wb3J0X0luaXR0YWI7IHAtPm5hbWUgIT0gTlVMTDsgcCsrKSB7Ci0JCWlmIChzdHJjbXAobmFtZSwgcC0+bmFtZSkgPT0gMCkgewotCQkJaWYgKHAtPmluaXRmdW5jID09IE5VTEwpIHsKLQkJCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkJICAgICJDYW5ub3QgcmUtaW5pdCBpbnRlcm5hbCBtb2R1bGUgJS4yMDBzIiwKLQkJCQkgICAgbmFtZSk7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJpbXBvcnQgJXMgIyBidWlsdGluXG4iLCBuYW1lKTsKLQkJCSgqcC0+aW5pdGZ1bmMpKCk7Ci0JCQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlpZiAoX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKG5hbWUsIG5hbWUpID09IE5VTEwpCi0JCQkJcmV0dXJuIC0xOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7CisgICAgZm9yIChwID0gUHlJbXBvcnRfSW5pdHRhYjsgcC0+bmFtZSAhPSBOVUxMOyBwKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBwLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAocC0+aW5pdGZ1bmMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZS1pbml0IGludGVybmFsIG1vZHVsZSAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGJ1aWx0aW5cbiIsIG5hbWUpOworICAgICAgICAgICAgKCpwLT5pbml0ZnVuYykoKTsKKyAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24obmFtZSwgbmFtZSkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0xOTI4LDM5ICsxOTI4LDM5IEBACiBzdGF0aWMgc3RydWN0IF9mcm96ZW4gKgogZmluZF9mcm96ZW4oY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgX2Zyb3plbiAqcDsKKyAgICBzdHJ1Y3QgX2Zyb3plbiAqcDsKIAotCWZvciAocCA9IFB5SW1wb3J0X0Zyb3plbk1vZHVsZXM7IDsgcCsrKSB7Ci0JCWlmIChwLT5uYW1lID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKHN0cmNtcChwLT5uYW1lLCBuYW1lKSA9PSAwKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBwOworICAgIGZvciAocCA9IFB5SW1wb3J0X0Zyb3plbk1vZHVsZXM7IDsgcCsrKSB7CisgICAgICAgIGlmIChwLT5uYW1lID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKHN0cmNtcChwLT5uYW1lLCBuYW1lKSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZ2V0X2Zyb3plbl9vYmplY3QoY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgX2Zyb3plbiAqcCA9IGZpbmRfZnJvemVuKG5hbWUpOwotCWludCBzaXplOworICAgIHN0cnVjdCBfZnJvemVuICpwID0gZmluZF9mcm96ZW4obmFtZSk7CisgICAgaW50IHNpemU7CiAKLQlpZiAocCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIk5vIHN1Y2ggZnJvemVuIG9iamVjdCBuYW1lZCAlLjIwMHMiLAotCQkJICAgICBuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChwLT5jb2RlID09IE5VTEwpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAotCQkJICAgICAiRXhjbHVkZWQgZnJvemVuIG9iamVjdCBuYW1lZCAlLjIwMHMiLAotCQkJICAgICBuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXNpemUgPSBwLT5zaXplOwotCWlmIChzaXplIDwgMCkKLQkJc2l6ZSA9IC1zaXplOwotCXJldHVybiBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcoKGNoYXIgKilwLT5jb2RlLCBzaXplKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJObyBzdWNoIGZyb3plbiBvYmplY3QgbmFtZWQgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHAtPmNvZGUgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiRXhjbHVkZWQgZnJvemVuIG9iamVjdCBuYW1lZCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzaXplID0gcC0+c2l6ZTsKKyAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgIHNpemUgPSAtc2l6ZTsKKyAgICByZXR1cm4gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKChjaGFyICopcC0+Y29kZSwgc2l6ZSk7CiB9CiAKIC8qIEluaXRpYWxpemUgYSBmcm96ZW4gbW9kdWxlLgpAQCAtMTk3MSw2MSArMTk3MSw2MSBAQAogaW50CiBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUoY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgX2Zyb3plbiAqcCA9IGZpbmRfZnJvemVuKG5hbWUpOwotCVB5T2JqZWN0ICpjbzsKLQlQeU9iamVjdCAqbTsKLQlpbnQgaXNwYWNrYWdlOwotCWludCBzaXplOworICAgIHN0cnVjdCBfZnJvemVuICpwID0gZmluZF9mcm96ZW4obmFtZSk7CisgICAgUHlPYmplY3QgKmNvOworICAgIFB5T2JqZWN0ICptOworICAgIGludCBpc3BhY2thZ2U7CisgICAgaW50IHNpemU7CiAKLQlpZiAocCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAocC0+Y29kZSA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIkV4Y2x1ZGVkIGZyb3plbiBvYmplY3QgbmFtZWQgJS4yMDBzIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2l6ZSA9IHAtPnNpemU7Ci0JaXNwYWNrYWdlID0gKHNpemUgPCAwKTsKLQlpZiAoaXNwYWNrYWdlKQotCQlzaXplID0gLXNpemU7Ci0JaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQlQeVN5c19Xcml0ZVN0ZGVycigiaW1wb3J0ICVzICMgZnJvemVuJXNcbiIsCi0JCQluYW1lLCBpc3BhY2thZ2UgPyAiIHBhY2thZ2UiIDogIiIpOwotCWNvID0gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKChjaGFyICopcC0+Y29kZSwgc2l6ZSk7Ci0JaWYgKGNvID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlpZiAoIVB5Q29kZV9DaGVjayhjbykpIHsKLQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJCSAgICAgImZyb3plbiBvYmplY3QgJS4yMDBzIGlzIG5vdCBhIGNvZGUgb2JqZWN0IiwKLQkJCSAgICAgbmFtZSk7Ci0JCWdvdG8gZXJyX3JldHVybjsKLQl9Ci0JaWYgKGlzcGFja2FnZSkgewotCQkvKiBTZXQgX19wYXRoX18gdG8gdGhlIHBhY2thZ2UgbmFtZSAqLwotCQlQeU9iamVjdCAqZCwgKnM7Ci0JCWludCBlcnI7Ci0JCW0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7Ci0JCWlmIChtID09IE5VTEwpCi0JCQlnb3RvIGVycl9yZXR1cm47Ci0JCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCQlzID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhuYW1lKTsKLQkJaWYgKHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyX3JldHVybjsKLQkJZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fcGF0aF9fIiwgcyk7Ci0JCVB5X0RFQ1JFRihzKTsKLQkJaWYgKGVyciAhPSAwKQotCQkJZ290byBlcnJfcmV0dXJuOwotCX0KLQltID0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChuYW1lLCBjbywgIjxmcm96ZW4+Iik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJZ290byBlcnJfcmV0dXJuOwotCVB5X0RFQ1JFRihjbyk7Ci0JUHlfREVDUkVGKG0pOwotCXJldHVybiAxOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChwLT5jb2RlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIkV4Y2x1ZGVkIGZyb3plbiBvYmplY3QgbmFtZWQgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHNpemUgPSBwLT5zaXplOworICAgIGlzcGFja2FnZSA9IChzaXplIDwgMCk7CisgICAgaWYgKGlzcGFja2FnZSkKKyAgICAgICAgc2l6ZSA9IC1zaXplOworICAgIGlmIChQeV9WZXJib3NlRmxhZykKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImltcG9ydCAlcyAjIGZyb3plbiVzXG4iLAorICAgICAgICAgICAgbmFtZSwgaXNwYWNrYWdlID8gIiBwYWNrYWdlIiA6ICIiKTsKKyAgICBjbyA9IFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZygoY2hhciAqKXAtPmNvZGUsIHNpemUpOworICAgIGlmIChjbyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCFQeUNvZGVfQ2hlY2soY28pKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZnJvemVuIG9iamVjdCAlLjIwMHMgaXMgbm90IGEgY29kZSBvYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKyAgICB9CisgICAgaWYgKGlzcGFja2FnZSkgeworICAgICAgICAvKiBTZXQgX19wYXRoX18gdG8gdGhlIHBhY2thZ2UgbmFtZSAqLworICAgICAgICBQeU9iamVjdCAqZCwgKnM7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIG0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7CisgICAgICAgIGlmIChtID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycl9yZXR1cm47CisgICAgICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgICAgICBzID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhuYW1lKTsKKyAgICAgICAgaWYgKHMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyX3JldHVybjsKKyAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fcGF0aF9fIiwgcyk7CisgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgaWYgKGVyciAhPSAwKQorICAgICAgICAgICAgZ290byBlcnJfcmV0dXJuOworICAgIH0KKyAgICBtID0gUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeChuYW1lLCBjbywgIjxmcm96ZW4+Iik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJfcmV0dXJuOworICAgIFB5X0RFQ1JFRihjbyk7CisgICAgUHlfREVDUkVGKG0pOworICAgIHJldHVybiAxOwogZXJyX3JldHVybjoKLQlQeV9ERUNSRUYoY28pOwotCXJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYoY28pOworICAgIHJldHVybiAtMTsKIH0KIAogCkBAIC0yMDM1LDE1ICsyMDM1LDE1IEBACiBQeU9iamVjdCAqCiBQeUltcG9ydF9JbXBvcnRNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqcG5hbWU7Ci0JUHlPYmplY3QgKnJlc3VsdDsKKyAgICBQeU9iamVjdCAqcG5hbWU7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCXBuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKLQlpZiAocG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmVzdWx0ID0gUHlJbXBvcnRfSW1wb3J0KHBuYW1lKTsKLQlQeV9ERUNSRUYocG5hbWUpOwotCXJldHVybiByZXN1bHQ7CisgICAgcG5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgIGlmIChwbmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQgPSBQeUltcG9ydF9JbXBvcnQocG5hbWUpOworICAgIFB5X0RFQ1JFRihwbmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogSW1wb3J0IGEgbW9kdWxlIHdpdGhvdXQgYmxvY2tpbmcKQEAgLTIwNTgsMTM3ICsyMDU4LDEzNyBAQAogUHlPYmplY3QgKgogUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jayhjb25zdCBjaGFyICpuYW1lKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlPYmplY3QgKm1vZHVsZXM7Ci0JbG9uZyBtZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICptb2R1bGVzOworICAgIGxvbmcgbWU7CiAKLQkvKiBUcnkgdG8gZ2V0IHRoZSBtb2R1bGUgZnJvbSBzeXMubW9kdWxlc1tuYW1lXSAqLwotCW1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0JaWYgKG1vZHVsZXMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogVHJ5IHRvIGdldCB0aGUgbW9kdWxlIGZyb20gc3lzLm1vZHVsZXNbbmFtZV0gKi8KKyAgICBtb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworICAgIGlmIChtb2R1bGVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSk7Ci0JaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQllbHNlIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQl9CisgICAgcmVzdWx0ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSk7CisgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkvKiBjaGVjayB0aGUgaW1wb3J0IGxvY2sKLQkgKiBtZSBtaWdodCBiZSAtMSBidXQgSSBpZ25vcmUgdGhlIGVycm9yIGhlcmUsIHRoZSBsb2NrIGZ1bmN0aW9uCi0JICogdGFrZXMgY2FyZSBvZiB0aGUgcHJvYmxlbSAqLwotCW1lID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCWlmIChpbXBvcnRfbG9ja190aHJlYWQgPT0gLTEgfHwgaW1wb3J0X2xvY2tfdGhyZWFkID09IG1lKSB7Ci0JCS8qIG5vIHRocmVhZCBvciBtZSBpcyBob2xkaW5nIHRoZSBsb2NrICovCi0JCXJldHVybiBQeUltcG9ydF9JbXBvcnRNb2R1bGUobmFtZSk7Ci0JfQotCWVsc2UgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJGYWlsZWQgdG8gaW1wb3J0ICUuMjAwcyBiZWNhdXNlIHRoZSBpbXBvcnQgbG9jayIKLQkJCSAgICAgImlzIGhlbGQgYnkgYW5vdGhlciB0aHJlYWQuIiwKLQkJCSAgICAgbmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBjaGVjayB0aGUgaW1wb3J0IGxvY2sKKyAgICAgKiBtZSBtaWdodCBiZSAtMSBidXQgSSBpZ25vcmUgdGhlIGVycm9yIGhlcmUsIHRoZSBsb2NrIGZ1bmN0aW9uCisgICAgICogdGFrZXMgY2FyZSBvZiB0aGUgcHJvYmxlbSAqLworICAgIG1lID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIGlmIChpbXBvcnRfbG9ja190aHJlYWQgPT0gLTEgfHwgaW1wb3J0X2xvY2tfdGhyZWFkID09IG1lKSB7CisgICAgICAgIC8qIG5vIHRocmVhZCBvciBtZSBpcyBob2xkaW5nIHRoZSBsb2NrICovCisgICAgICAgIHJldHVybiBQeUltcG9ydF9JbXBvcnRNb2R1bGUobmFtZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGltcG9ydCAlLjIwMHMgYmVjYXVzZSB0aGUgaW1wb3J0IGxvY2siCisgICAgICAgICAgICAgICAgICAgICAiaXMgaGVsZCBieSBhbm90aGVyIHRocmVhZC4iLAorICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICNlbHNlCi0JcmV0dXJuIFB5SW1wb3J0X0ltcG9ydE1vZHVsZShuYW1lKTsKKyAgICByZXR1cm4gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKG5hbWUpOwogI2VuZGlmCiB9CiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBoZWxwZXIgcm91dGluZXMgKi8KIHN0YXRpYyBQeU9iamVjdCAqZ2V0X3BhcmVudChQeU9iamVjdCAqZ2xvYmFscywgY2hhciAqYnVmLAotCQkJICAgIFB5X3NzaXplX3QgKnBfYnVmbGVuLCBpbnQgbGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnBfYnVmbGVuLCBpbnQgbGV2ZWwpOwogc3RhdGljIFB5T2JqZWN0ICpsb2FkX25leHQoUHlPYmplY3QgKm1vZCwgUHlPYmplY3QgKmFsdG1vZCwKLQkJCSAgIGNoYXIgKipwX25hbWUsIGNoYXIgKmJ1ZiwgUHlfc3NpemVfdCAqcF9idWZsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnBfbmFtZSwgY2hhciAqYnVmLCBQeV9zc2l6ZV90ICpwX2J1Zmxlbik7CiBzdGF0aWMgaW50IG1hcmtfbWlzcyhjaGFyICpuYW1lKTsKIHN0YXRpYyBpbnQgZW5zdXJlX2Zyb21saXN0KFB5T2JqZWN0ICptb2QsIFB5T2JqZWN0ICpmcm9tbGlzdCwKLQkJCSAgIGNoYXIgKmJ1ZiwgUHlfc3NpemVfdCBidWZsZW4sIGludCByZWN1cnNpdmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmLCBQeV9zc2l6ZV90IGJ1ZmxlbiwgaW50IHJlY3Vyc2l2ZSk7CiBzdGF0aWMgUHlPYmplY3QgKiBpbXBvcnRfc3VibW9kdWxlKFB5T2JqZWN0ICptb2QsIGNoYXIgKm5hbWUsIGNoYXIgKmZ1bGxuYW1lKTsKIAogLyogVGhlIE1hZ251bSBPcHVzIG9mIGRvdHRlZC1uYW1lIGltcG9ydCA6LSkgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcG9ydF9tb2R1bGVfbGV2ZWwoY2hhciAqbmFtZSwgUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMsCi0JCSAgICBQeU9iamVjdCAqZnJvbWxpc3QsIGludCBsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZyb21saXN0LCBpbnQgbGV2ZWwpCiB7Ci0JY2hhciBidWZbTUFYUEFUSExFTisxXTsKLQlQeV9zc2l6ZV90IGJ1ZmxlbiA9IDA7Ci0JUHlPYmplY3QgKnBhcmVudCwgKmhlYWQsICpuZXh0LCAqdGFpbDsKKyAgICBjaGFyIGJ1ZltNQVhQQVRITEVOKzFdOworICAgIFB5X3NzaXplX3QgYnVmbGVuID0gMDsKKyAgICBQeU9iamVjdCAqcGFyZW50LCAqaGVhZCwgKm5leHQsICp0YWlsOwogCi0JaWYgKHN0cmNocihuYW1lLCAnLycpICE9IE5VTEwKKyAgICBpZiAoc3RyY2hyKG5hbWUsICcvJykgIT0gTlVMTAogI2lmZGVmIE1TX1dJTkRPV1MKLQkgICAgfHwgc3RyY2hyKG5hbWUsICdcXCcpICE9IE5VTEwKKyAgICAgICAgfHwgc3RyY2hyKG5hbWUsICdcXCcpICE9IE5VTEwKICNlbmRpZgotCQkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCSJJbXBvcnQgYnkgZmlsZW5hbWUgaXMgbm90IHN1cHBvcnRlZC4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgICAgICApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkltcG9ydCBieSBmaWxlbmFtZSBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwYXJlbnQgPSBnZXRfcGFyZW50KGdsb2JhbHMsIGJ1ZiwgJmJ1ZmxlbiwgbGV2ZWwpOwotCWlmIChwYXJlbnQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcGFyZW50ID0gZ2V0X3BhcmVudChnbG9iYWxzLCBidWYsICZidWZsZW4sIGxldmVsKTsKKyAgICBpZiAocGFyZW50ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaGVhZCA9IGxvYWRfbmV4dChwYXJlbnQsIFB5X05vbmUsICZuYW1lLCBidWYsICZidWZsZW4pOwotCWlmIChoZWFkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIGhlYWQgPSBsb2FkX25leHQocGFyZW50LCBQeV9Ob25lLCAmbmFtZSwgYnVmLCAmYnVmbGVuKTsKKyAgICBpZiAoaGVhZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXRhaWwgPSBoZWFkOwotCVB5X0lOQ1JFRih0YWlsKTsKLQl3aGlsZSAobmFtZSkgewotCQluZXh0ID0gbG9hZF9uZXh0KHRhaWwsIHRhaWwsICZuYW1lLCBidWYsICZidWZsZW4pOwotCQlQeV9ERUNSRUYodGFpbCk7Ci0JCWlmIChuZXh0ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihoZWFkKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCXRhaWwgPSBuZXh0OwotCX0KLQlpZiAodGFpbCA9PSBQeV9Ob25lKSB7Ci0JCS8qIElmIHRhaWwgaXMgUHlfTm9uZSwgYm90aCBnZXRfcGFyZW50IGFuZCBsb2FkX25leHQgZm91bmQKLQkJICAgYW4gZW1wdHkgbW9kdWxlIG5hbWU6IHNvbWVvbmUgY2FsbGVkIF9faW1wb3J0X18oIiIpIG9yCi0JCSAgIGRvY3RvcmVkIGZhdWx0eSBieXRlY29kZSAqLwotCQlQeV9ERUNSRUYodGFpbCk7Ci0JCVB5X0RFQ1JFRihoZWFkKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIkVtcHR5IG1vZHVsZSBuYW1lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB0YWlsID0gaGVhZDsKKyAgICBQeV9JTkNSRUYodGFpbCk7CisgICAgd2hpbGUgKG5hbWUpIHsKKyAgICAgICAgbmV4dCA9IGxvYWRfbmV4dCh0YWlsLCB0YWlsLCAmbmFtZSwgYnVmLCAmYnVmbGVuKTsKKyAgICAgICAgUHlfREVDUkVGKHRhaWwpOworICAgICAgICBpZiAobmV4dCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaGVhZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB0YWlsID0gbmV4dDsKKyAgICB9CisgICAgaWYgKHRhaWwgPT0gUHlfTm9uZSkgeworICAgICAgICAvKiBJZiB0YWlsIGlzIFB5X05vbmUsIGJvdGggZ2V0X3BhcmVudCBhbmQgbG9hZF9uZXh0IGZvdW5kCisgICAgICAgICAgIGFuIGVtcHR5IG1vZHVsZSBuYW1lOiBzb21lb25lIGNhbGxlZCBfX2ltcG9ydF9fKCIiKSBvcgorICAgICAgICAgICBkb2N0b3JlZCBmYXVsdHkgYnl0ZWNvZGUgKi8KKyAgICAgICAgUHlfREVDUkVGKHRhaWwpOworICAgICAgICBQeV9ERUNSRUYoaGVhZCk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVtcHR5IG1vZHVsZSBuYW1lIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChmcm9tbGlzdCAhPSBOVUxMKSB7Ci0JCWlmIChmcm9tbGlzdCA9PSBQeV9Ob25lIHx8ICFQeU9iamVjdF9Jc1RydWUoZnJvbWxpc3QpKQotCQkJZnJvbWxpc3QgPSBOVUxMOwotCX0KKyAgICBpZiAoZnJvbWxpc3QgIT0gTlVMTCkgeworICAgICAgICBpZiAoZnJvbWxpc3QgPT0gUHlfTm9uZSB8fCAhUHlPYmplY3RfSXNUcnVlKGZyb21saXN0KSkKKyAgICAgICAgICAgIGZyb21saXN0ID0gTlVMTDsKKyAgICB9CiAKLQlpZiAoZnJvbWxpc3QgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYodGFpbCk7Ci0JCXJldHVybiBoZWFkOwotCX0KKyAgICBpZiAoZnJvbWxpc3QgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodGFpbCk7CisgICAgICAgIHJldHVybiBoZWFkOworICAgIH0KIAotCVB5X0RFQ1JFRihoZWFkKTsKLQlpZiAoIWVuc3VyZV9mcm9tbGlzdCh0YWlsLCBmcm9tbGlzdCwgYnVmLCBidWZsZW4sIDApKSB7Ci0JCVB5X0RFQ1JFRih0YWlsKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5X0RFQ1JFRihoZWFkKTsKKyAgICBpZiAoIWVuc3VyZV9mcm9tbGlzdCh0YWlsLCBmcm9tbGlzdCwgYnVmLCBidWZsZW4sIDApKSB7CisgICAgICAgIFB5X0RFQ1JFRih0YWlsKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHRhaWw7CisgICAgcmV0dXJuIHRhaWw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsKGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLAotCQkJIFB5T2JqZWN0ICpmcm9tbGlzdCwgaW50IGxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmcm9tbGlzdCwgaW50IGxldmVsKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JX1B5SW1wb3J0X0FjcXVpcmVMb2NrKCk7Ci0JcmVzdWx0ID0gaW1wb3J0X21vZHVsZV9sZXZlbChuYW1lLCBnbG9iYWxzLCBsb2NhbHMsIGZyb21saXN0LCBsZXZlbCk7Ci0JaWYgKF9QeUltcG9ydF9SZWxlYXNlTG9jaygpIDwgMCkgewotCQlQeV9YREVDUkVGKHJlc3VsdCk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0JCQkJIm5vdCBob2xkaW5nIHRoZSBpbXBvcnQgbG9jayIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIF9QeUltcG9ydF9BY3F1aXJlTG9jaygpOworICAgIHJlc3VsdCA9IGltcG9ydF9tb2R1bGVfbGV2ZWwobmFtZSwgZ2xvYmFscywgbG9jYWxzLCBmcm9tbGlzdCwgbGV2ZWwpOworICAgIGlmIChfUHlJbXBvcnRfUmVsZWFzZUxvY2soKSA8IDApIHsKKyAgICAgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBob2xkaW5nIHRoZSBpbXBvcnQgbG9jayIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogUmV0dXJuIHRoZSBwYWNrYWdlIHRoYXQgYW4gaW1wb3J0IGlzIGJlaW5nIHBlcmZvcm1lZCBpbi4gIElmIGdsb2JhbHMgY29tZXMKQEAgLTIyMDUsNDAwICsyMjA1LDQwMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdldF9wYXJlbnQoUHlPYmplY3QgKmdsb2JhbHMsIGNoYXIgKmJ1ZiwgUHlfc3NpemVfdCAqcF9idWZsZW4sIGludCBsZXZlbCkKIHsKLQlzdGF0aWMgUHlPYmplY3QgKm5hbWVzdHIgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqcGF0aHN0ciA9IE5VTEw7Ci0Jc3RhdGljIFB5T2JqZWN0ICpwa2dzdHIgPSBOVUxMOwotCVB5T2JqZWN0ICpwa2duYW1lLCAqbW9kbmFtZSwgKm1vZHBhdGgsICptb2R1bGVzLCAqcGFyZW50OwotCWludCBvcmlnX2xldmVsID0gbGV2ZWw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpuYW1lc3RyID0gTlVMTDsKKyAgICBzdGF0aWMgUHlPYmplY3QgKnBhdGhzdHIgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqcGtnc3RyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcGtnbmFtZSwgKm1vZG5hbWUsICptb2RwYXRoLCAqbW9kdWxlcywgKnBhcmVudDsKKyAgICBpbnQgb3JpZ19sZXZlbCA9IGxldmVsOwogCi0JaWYgKGdsb2JhbHMgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGdsb2JhbHMpIHx8ICFsZXZlbCkKLQkJcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKGdsb2JhbHMgPT0gTlVMTCB8fCAhUHlEaWN0X0NoZWNrKGdsb2JhbHMpIHx8ICFsZXZlbCkKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CiAKLQlpZiAobmFtZXN0ciA9PSBOVUxMKSB7Ci0JCW5hbWVzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25hbWVfXyIpOwotCQlpZiAobmFtZXN0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChwYXRoc3RyID09IE5VTEwpIHsKLQkJcGF0aHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fcGF0aF9fIik7Ci0JCWlmIChwYXRoc3RyID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKHBrZ3N0ciA9PSBOVUxMKSB7Ci0JCXBrZ3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fcGFja2FnZV9fIik7Ci0JCWlmIChwa2dzdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAobmFtZXN0ciA9PSBOVUxMKSB7CisgICAgICAgIG5hbWVzdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX25hbWVfXyIpOworICAgICAgICBpZiAobmFtZXN0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwYXRoc3RyID09IE5VTEwpIHsKKyAgICAgICAgcGF0aHN0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fcGF0aF9fIik7CisgICAgICAgIGlmIChwYXRoc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHBrZ3N0ciA9PSBOVUxMKSB7CisgICAgICAgIHBrZ3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fcGFja2FnZV9fIik7CisgICAgICAgIGlmIChwa2dzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCSpidWYgPSAnXDAnOwotCSpwX2J1ZmxlbiA9IDA7Ci0JcGtnbmFtZSA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIHBrZ3N0cik7CisgICAgKmJ1ZiA9ICdcMCc7CisgICAgKnBfYnVmbGVuID0gMDsKKyAgICBwa2duYW1lID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgcGtnc3RyKTsKIAotCWlmICgocGtnbmFtZSAhPSBOVUxMKSAmJiAocGtnbmFtZSAhPSBQeV9Ob25lKSkgewotCQkvKiBfX3BhY2thZ2VfXyBpcyBzZXQsIHNvIHVzZSBpdCAqLwotCQlQeV9zc2l6ZV90IGxlbjsKLQkJaWYgKCFQeVN0cmluZ19DaGVjayhwa2duYW1lKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCSJfX3BhY2thZ2VfXyBzZXQgdG8gbm9uLXN0cmluZyIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUocGtnbmFtZSk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJaWYgKGxldmVsID4gMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBpbiBub24tcGFja2FnZSIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCX0KLQkJaWYgKGxlbiA+IE1BWFBBVEhMRU4pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiUGFja2FnZSBuYW1lIHRvbyBsb25nIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzdHJjcHkoYnVmLCBQeVN0cmluZ19BU19TVFJJTkcocGtnbmFtZSkpOwotCX0gZWxzZSB7Ci0JCS8qIF9fcGFja2FnZV9fIG5vdCBzZXQsIHNvIGZpZ3VyZSBpdCBvdXQgYW5kIHNldCBpdCAqLwotCQltb2RuYW1lID0gUHlEaWN0X0dldEl0ZW0oZ2xvYmFscywgbmFtZXN0cik7Ci0JCWlmIChtb2RuYW1lID09IE5VTEwgfHwgIVB5U3RyaW5nX0NoZWNrKG1vZG5hbWUpKQotCQkJcmV0dXJuIFB5X05vbmU7Ci0JCi0JCW1vZHBhdGggPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBwYXRoc3RyKTsKLQkJaWYgKG1vZHBhdGggIT0gTlVMTCkgewotCQkJLyogX19wYXRoX18gaXMgc2V0LCBzbyBtb2RuYW1lIGlzIGFscmVhZHkgdGhlIHBhY2thZ2UgbmFtZSAqLwotCQkJUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShtb2RuYW1lKTsKLQkJCWludCBlcnJvcjsKLQkJCWlmIChsZW4gPiBNQVhQQVRITEVOKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiTW9kdWxlIG5hbWUgdG9vIGxvbmciKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCXN0cmNweShidWYsIFB5U3RyaW5nX0FTX1NUUklORyhtb2RuYW1lKSk7Ci0JCQllcnJvciA9IFB5RGljdF9TZXRJdGVtKGdsb2JhbHMsIHBrZ3N0ciwgbW9kbmFtZSk7Ci0JCQlpZiAoZXJyb3IpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJDb3VsZCBub3Qgc2V0IF9fcGFja2FnZV9fIik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBOb3JtYWwgbW9kdWxlLCBzbyB3b3JrIG91dCB0aGUgcGFja2FnZSBuYW1lIGlmIGFueSAqLwotCQkJY2hhciAqc3RhcnQgPSBQeVN0cmluZ19BU19TVFJJTkcobW9kbmFtZSk7Ci0JCQljaGFyICpsYXN0ZG90ID0gc3RycmNocihzdGFydCwgJy4nKTsKLQkJCXNpemVfdCBsZW47Ci0JCQlpbnQgZXJyb3I7Ci0JCQlpZiAobGFzdGRvdCA9PSBOVUxMICYmIGxldmVsID4gMCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBpbiBub24tcGFja2FnZSIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKGxhc3Rkb3QgPT0gTlVMTCkgewotCQkJCWVycm9yID0gUHlEaWN0X1NldEl0ZW0oZ2xvYmFscywgcGtnc3RyLCBQeV9Ob25lKTsKLQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkiQ291bGQgbm90IHNldCBfX3BhY2thZ2VfXyIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9Ci0JCQkJcmV0dXJuIFB5X05vbmU7Ci0JCQl9Ci0JCQlsZW4gPSBsYXN0ZG90IC0gc3RhcnQ7Ci0JCQlpZiAobGVuID49IE1BWFBBVEhMRU4pIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJNb2R1bGUgbmFtZSB0b28gbG9uZyIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJc3RybmNweShidWYsIHN0YXJ0LCBsZW4pOwotCQkJYnVmW2xlbl0gPSAnXDAnOwotCQkJcGtnbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKLQkJCWlmIChwa2duYW1lID09IE5VTEwpIHsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCWVycm9yID0gUHlEaWN0X1NldEl0ZW0oZ2xvYmFscywgcGtnc3RyLCBwa2duYW1lKTsKLQkJCVB5X0RFQ1JFRihwa2duYW1lKTsKLQkJCWlmIChlcnJvcikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJIkNvdWxkIG5vdCBzZXQgX19wYWNrYWdlX18iKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQl3aGlsZSAoLS1sZXZlbCA+IDApIHsKLQkJY2hhciAqZG90ID0gc3RycmNocihidWYsICcuJyk7Ci0JCWlmIChkb3QgPT0gTlVMTCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIkF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgYmV5b25kICIKLQkJCQkidG9wbGV2ZWwgcGFja2FnZSIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJKmRvdCA9ICdcMCc7Ci0JfQotCSpwX2J1ZmxlbiA9IHN0cmxlbihidWYpOworICAgIGlmICgocGtnbmFtZSAhPSBOVUxMKSAmJiAocGtnbmFtZSAhPSBQeV9Ob25lKSkgeworICAgICAgICAvKiBfX3BhY2thZ2VfXyBpcyBzZXQsIHNvIHVzZSBpdCAqLworICAgICAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhwa2duYW1lKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fcGFja2FnZV9fIHNldCB0byBub24tc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShwa2duYW1lKTsKKyAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGluIG5vbi1wYWNrYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuID4gTUFYUEFUSExFTikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhY2thZ2UgbmFtZSB0b28gbG9uZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKHBrZ25hbWUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBfX3BhY2thZ2VfXyBub3Qgc2V0LCBzbyBmaWd1cmUgaXQgb3V0IGFuZCBzZXQgaXQgKi8KKyAgICAgICAgbW9kbmFtZSA9IFB5RGljdF9HZXRJdGVtKGdsb2JhbHMsIG5hbWVzdHIpOworICAgICAgICBpZiAobW9kbmFtZSA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhtb2RuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOwogCi0JbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQlwYXJlbnQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBidWYpOwotCWlmIChwYXJlbnQgPT0gTlVMTCkgewotCQlpZiAob3JpZ19sZXZlbCA8IDEpIHsKLQkJCVB5T2JqZWN0ICplcnJfbXNnID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgKLQkJCQkiUGFyZW50IG1vZHVsZSAnJS4yMDBzJyBub3QgZm91bmQgIgotCQkJCSJ3aGlsZSBoYW5kbGluZyBhYnNvbHV0ZSBpbXBvcnQiLCBidWYpOwotCQkJaWYgKGVycl9tc2cgPT0gTlVMTCkgewotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKCFQeUVycl9XYXJuRXgoUHlFeGNfUnVudGltZVdhcm5pbmcsCi0JCQkJCVB5U3RyaW5nX0FzU3RyaW5nKGVycl9tc2cpLCAxKSkgewotCQkJCSpidWYgPSAnXDAnOwotCQkJCSpwX2J1ZmxlbiA9IDA7Ci0JCQkJcGFyZW50ID0gUHlfTm9uZTsKLQkJCX0KLQkJCVB5X0RFQ1JFRihlcnJfbXNnKTsKLQkJfSBlbHNlIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiUGFyZW50IG1vZHVsZSAnJS4yMDBzJyBub3QgbG9hZGVkLCAiCi0JCQkJImNhbm5vdCBwZXJmb3JtIHJlbGF0aXZlIGltcG9ydCIsIGJ1Zik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHBhcmVudDsKLQkvKiBXZSBleHBlY3QsIGJ1dCBjYW4ndCBndWFyYW50ZWUsIGlmIHBhcmVudCAhPSBOb25lLCB0aGF0OgotCSAgIC0gcGFyZW50Ll9fbmFtZV9fID09IGJ1ZgotCSAgIC0gcGFyZW50Ll9fZGljdF9fIGlzIGdsb2JhbHMKLQkgICBJZiB0aGlzIGlzIHZpb2xhdGVkLi4uICBXaG8gY2FyZXM/ICovCisgICAgICAgIG1vZHBhdGggPSBQeURpY3RfR2V0SXRlbShnbG9iYWxzLCBwYXRoc3RyKTsKKyAgICAgICAgaWYgKG1vZHBhdGggIT0gTlVMTCkgeworICAgICAgICAgICAgLyogX19wYXRoX18gaXMgc2V0LCBzbyBtb2RuYW1lIGlzIGFscmVhZHkgdGhlIHBhY2thZ2UgbmFtZSAqLworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShtb2RuYW1lKTsKKyAgICAgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgICAgIGlmIChsZW4gPiBNQVhQQVRITEVOKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb2R1bGUgbmFtZSB0b28gbG9uZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyY3B5KGJ1ZiwgUHlTdHJpbmdfQVNfU1RSSU5HKG1vZG5hbWUpKTsKKyAgICAgICAgICAgIGVycm9yID0gUHlEaWN0X1NldEl0ZW0oZ2xvYmFscywgcGtnc3RyLCBtb2RuYW1lKTsKKyAgICAgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBfX3BhY2thZ2VfXyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTm9ybWFsIG1vZHVsZSwgc28gd29yayBvdXQgdGhlIHBhY2thZ2UgbmFtZSBpZiBhbnkgKi8KKyAgICAgICAgICAgIGNoYXIgKnN0YXJ0ID0gUHlTdHJpbmdfQVNfU1RSSU5HKG1vZG5hbWUpOworICAgICAgICAgICAgY2hhciAqbGFzdGRvdCA9IHN0cnJjaHIoc3RhcnQsICcuJyk7CisgICAgICAgICAgICBzaXplX3QgbGVuOworICAgICAgICAgICAgaW50IGVycm9yOworICAgICAgICAgICAgaWYgKGxhc3Rkb3QgPT0gTlVMTCAmJiBsZXZlbCA+IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkF0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgaW4gbm9uLXBhY2thZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXN0ZG90ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IFB5RGljdF9TZXRJdGVtKGdsb2JhbHMsIHBrZ3N0ciwgUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgX19wYWNrYWdlX18iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuID0gbGFzdGRvdCAtIHN0YXJ0OworICAgICAgICAgICAgaWYgKGxlbiA+PSBNQVhQQVRITEVOKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb2R1bGUgbmFtZSB0b28gbG9uZyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybmNweShidWYsIHN0YXJ0LCBsZW4pOworICAgICAgICAgICAgYnVmW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgcGtnbmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICAgICAgICAgIGlmIChwa2duYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yID0gUHlEaWN0X1NldEl0ZW0oZ2xvYmFscywgcGtnc3RyLCBwa2duYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihwa2duYW1lKTsKKyAgICAgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBfX3BhY2thZ2VfXyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHdoaWxlICgtLWxldmVsID4gMCkgeworICAgICAgICBjaGFyICpkb3QgPSBzdHJyY2hyKGJ1ZiwgJy4nKTsKKyAgICAgICAgaWYgKGRvdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBiZXlvbmQgIgorICAgICAgICAgICAgICAgICJ0b3BsZXZlbCBwYWNrYWdlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICAqZG90ID0gJ1wwJzsKKyAgICB9CisgICAgKnBfYnVmbGVuID0gc3RybGVuKGJ1Zik7CisKKyAgICBtb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworICAgIHBhcmVudCA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXMsIGJ1Zik7CisgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgIGlmIChvcmlnX2xldmVsIDwgMSkgeworICAgICAgICAgICAgUHlPYmplY3QgKmVycl9tc2cgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KAorICAgICAgICAgICAgICAgICJQYXJlbnQgbW9kdWxlICclLjIwMHMnIG5vdCBmb3VuZCAiCisgICAgICAgICAgICAgICAgIndoaWxlIGhhbmRsaW5nIGFic29sdXRlIGltcG9ydCIsIGJ1Zik7CisgICAgICAgICAgICBpZiAoZXJyX21zZyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIVB5RXJyX1dhcm5FeChQeUV4Y19SdW50aW1lV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhlcnJfbXNnKSwgMSkpIHsKKyAgICAgICAgICAgICAgICAqYnVmID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAqcF9idWZsZW4gPSAwOworICAgICAgICAgICAgICAgIHBhcmVudCA9IFB5X05vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoZXJyX21zZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgIlBhcmVudCBtb2R1bGUgJyUuMjAwcycgbm90IGxvYWRlZCwgIgorICAgICAgICAgICAgICAgICJjYW5ub3QgcGVyZm9ybSByZWxhdGl2ZSBpbXBvcnQiLCBidWYpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYXJlbnQ7CisgICAgLyogV2UgZXhwZWN0LCBidXQgY2FuJ3QgZ3VhcmFudGVlLCBpZiBwYXJlbnQgIT0gTm9uZSwgdGhhdDoKKyAgICAgICAtIHBhcmVudC5fX25hbWVfXyA9PSBidWYKKyAgICAgICAtIHBhcmVudC5fX2RpY3RfXyBpcyBnbG9iYWxzCisgICAgICAgSWYgdGhpcyBpcyB2aW9sYXRlZC4uLiAgV2hvIGNhcmVzPyAqLwogfQogCiAvKiBhbHRtb2QgaXMgZWl0aGVyIE5vbmUgb3Igc2FtZSBhcyBtb2QgKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBsb2FkX25leHQoUHlPYmplY3QgKm1vZCwgUHlPYmplY3QgKmFsdG1vZCwgY2hhciAqKnBfbmFtZSwgY2hhciAqYnVmLAotCSAgUHlfc3NpemVfdCAqcF9idWZsZW4pCisgICAgICAgICAgUHlfc3NpemVfdCAqcF9idWZsZW4pCiB7Ci0JY2hhciAqbmFtZSA9ICpwX25hbWU7Ci0JY2hhciAqZG90ID0gc3RyY2hyKG5hbWUsICcuJyk7Ci0Jc2l6ZV90IGxlbjsKLQljaGFyICpwOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgY2hhciAqbmFtZSA9ICpwX25hbWU7CisgICAgY2hhciAqZG90ID0gc3RyY2hyKG5hbWUsICcuJyk7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjaGFyICpwOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKLQlpZiAoc3RybGVuKG5hbWUpID09IDApIHsKLQkJLyogY29tcGxldGVseSBlbXB0eSBtb2R1bGUgbmFtZSBzaG91bGQgb25seSBoYXBwZW4gaW4KLQkJICAgJ2Zyb20gLiBpbXBvcnQnIChvciAnX19pbXBvcnRfXygiIiknKSovCi0JCVB5X0lOQ1JFRihtb2QpOwotCQkqcF9uYW1lID0gTlVMTDsKLQkJcmV0dXJuIG1vZDsKLQl9CisgICAgaWYgKHN0cmxlbihuYW1lKSA9PSAwKSB7CisgICAgICAgIC8qIGNvbXBsZXRlbHkgZW1wdHkgbW9kdWxlIG5hbWUgc2hvdWxkIG9ubHkgaGFwcGVuIGluCisgICAgICAgICAgICdmcm9tIC4gaW1wb3J0JyAob3IgJ19faW1wb3J0X18oIiIpJykqLworICAgICAgICBQeV9JTkNSRUYobW9kKTsKKyAgICAgICAgKnBfbmFtZSA9IE5VTEw7CisgICAgICAgIHJldHVybiBtb2Q7CisgICAgfQogCi0JaWYgKGRvdCA9PSBOVUxMKSB7Ci0JCSpwX25hbWUgPSBOVUxMOwotCQlsZW4gPSBzdHJsZW4obmFtZSk7Ci0JfQotCWVsc2UgewotCQkqcF9uYW1lID0gZG90KzE7Ci0JCWxlbiA9IGRvdC1uYW1lOwotCX0KLQlpZiAobGVuID09IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIkVtcHR5IG1vZHVsZSBuYW1lIik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoZG90ID09IE5VTEwpIHsKKyAgICAgICAgKnBfbmFtZSA9IE5VTEw7CisgICAgICAgIGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpwX25hbWUgPSBkb3QrMTsKKyAgICAgICAgbGVuID0gZG90LW5hbWU7CisgICAgfQorICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFbXB0eSBtb2R1bGUgbmFtZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlwID0gYnVmICsgKnBfYnVmbGVuOwotCWlmIChwICE9IGJ1ZikKLQkJKnArKyA9ICcuJzsKLQlpZiAocCtsZW4tYnVmID49IE1BWFBBVEhMRU4pIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJIk1vZHVsZSBuYW1lIHRvbyBsb25nIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlzdHJuY3B5KHAsIG5hbWUsIGxlbik7Ci0JcFtsZW5dID0gJ1wwJzsKLQkqcF9idWZsZW4gPSBwK2xlbi1idWY7CisgICAgcCA9IGJ1ZiArICpwX2J1ZmxlbjsKKyAgICBpZiAocCAhPSBidWYpCisgICAgICAgICpwKysgPSAnLic7CisgICAgaWYgKHArbGVuLWJ1ZiA+PSBNQVhQQVRITEVOKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk1vZHVsZSBuYW1lIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzdHJuY3B5KHAsIG5hbWUsIGxlbik7CisgICAgcFtsZW5dID0gJ1wwJzsKKyAgICAqcF9idWZsZW4gPSBwK2xlbi1idWY7CiAKLQlyZXN1bHQgPSBpbXBvcnRfc3VibW9kdWxlKG1vZCwgcCwgYnVmKTsKLQlpZiAocmVzdWx0ID09IFB5X05vbmUgJiYgYWx0bW9kICE9IG1vZCkgewotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQkJLyogSGVyZSwgYWx0bW9kIG11c3QgYmUgTm9uZSBhbmQgbW9kIG11c3Qgbm90IGJlIE5vbmUgKi8KLQkJcmVzdWx0ID0gaW1wb3J0X3N1Ym1vZHVsZShhbHRtb2QsIHAsIHApOwotCQlpZiAocmVzdWx0ICE9IE5VTEwgJiYgcmVzdWx0ICE9IFB5X05vbmUpIHsKLQkJCWlmIChtYXJrX21pc3MoYnVmKSAhPSAwKSB7Ci0JCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlzdHJuY3B5KGJ1ZiwgbmFtZSwgbGVuKTsKLQkJCWJ1ZltsZW5dID0gJ1wwJzsKLQkJCSpwX2J1ZmxlbiA9IGxlbjsKLQkJfQotCX0KLQlpZiAocmVzdWx0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IGltcG9ydF9zdWJtb2R1bGUobW9kLCBwLCBidWYpOworICAgIGlmIChyZXN1bHQgPT0gUHlfTm9uZSAmJiBhbHRtb2QgIT0gbW9kKSB7CisgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAvKiBIZXJlLCBhbHRtb2QgbXVzdCBiZSBOb25lIGFuZCBtb2QgbXVzdCBub3QgYmUgTm9uZSAqLworICAgICAgICByZXN1bHQgPSBpbXBvcnRfc3VibW9kdWxlKGFsdG1vZCwgcCwgcCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCAmJiByZXN1bHQgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgaWYgKG1hcmtfbWlzcyhidWYpICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm5jcHkoYnVmLCBuYW1lLCBsZW4pOworICAgICAgICAgICAgYnVmW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgKnBfYnVmbGVuID0gbGVuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAocmVzdWx0ID09IFB5X05vbmUpIHsKLQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAgIk5vIG1vZHVsZSBuYW1lZCAlLjIwMHMiLCBuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChyZXN1bHQgPT0gUHlfTm9uZSkgeworICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIk5vIG1vZHVsZSBuYW1lZCAlLjIwMHMiLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50CiBtYXJrX21pc3MoY2hhciAqbmFtZSkKIHsKLQlQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLQlyZXR1cm4gUHlEaWN0X1NldEl0ZW1TdHJpbmcobW9kdWxlcywgbmFtZSwgUHlfTm9uZSk7CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUsIFB5X05vbmUpOwogfQogCiBzdGF0aWMgaW50CiBlbnN1cmVfZnJvbWxpc3QoUHlPYmplY3QgKm1vZCwgUHlPYmplY3QgKmZyb21saXN0LCBjaGFyICpidWYsIFB5X3NzaXplX3QgYnVmbGVuLAotCQlpbnQgcmVjdXJzaXZlKQorICAgICAgICAgICAgICAgIGludCByZWN1cnNpdmUpCiB7Ci0JaW50IGk7CisgICAgaW50IGk7CiAKLQlpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcobW9kLCAiX19wYXRoX18iKSkKLQkJcmV0dXJuIDE7CisgICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKG1vZCwgIl9fcGF0aF9fIikpCisgICAgICAgIHJldHVybiAxOwogCi0JZm9yIChpID0gMDsgOyBpKyspIHsKLQkJUHlPYmplY3QgKml0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oZnJvbWxpc3QsIGkpOwotCQlpbnQgaGFzaXQ7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0luZGV4RXJyb3IpKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmICghUHlTdHJpbmdfQ2hlY2soaXRlbSkpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJJdGVtIGluIGBgZnJvbSBsaXN0Jycgbm90IGEgc3RyaW5nIik7Ci0JCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pWzBdID09ICcqJykgewotCQkJUHlPYmplY3QgKmFsbDsKLQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCS8qIFNlZSBpZiB0aGUgcGFja2FnZSBkZWZpbmVzIF9fYWxsX18gKi8KLQkJCWlmIChyZWN1cnNpdmUpCi0JCQkJY29udGludWU7IC8qIEF2b2lkIGVuZGxlc3MgcmVjdXJzaW9uICovCi0JCQlhbGwgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1vZCwgIl9fYWxsX18iKTsKLQkJCWlmIChhbGwgPT0gTlVMTCkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJZWxzZSB7Ci0JCQkJaW50IHJldCA9IGVuc3VyZV9mcm9tbGlzdChtb2QsIGFsbCwgYnVmLCBidWZsZW4sIDEpOwotCQkJCVB5X0RFQ1JFRihhbGwpOwotCQkJCWlmICghcmV0KQotCQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWhhc2l0ID0gUHlPYmplY3RfSGFzQXR0cihtb2QsIGl0ZW0pOwotCQlpZiAoIWhhc2l0KSB7Ci0JCQljaGFyICpzdWJuYW1lID0gUHlTdHJpbmdfQVNfU1RSSU5HKGl0ZW0pOwotCQkJUHlPYmplY3QgKnN1Ym1vZDsKLQkJCWNoYXIgKnA7Ci0JCQlpZiAoYnVmbGVuICsgc3RybGVuKHN1Ym5hbWUpID49IE1BWFBBVEhMRU4pIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCSJNb2R1bGUgbmFtZSB0b28gbG9uZyIpOwotCQkJCVB5X0RFQ1JFRihpdGVtKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCXAgPSBidWYgKyBidWZsZW47Ci0JCQkqcCsrID0gJy4nOwotCQkJc3RyY3B5KHAsIHN1Ym5hbWUpOwotCQkJc3VibW9kID0gaW1wb3J0X3N1Ym1vZHVsZShtb2QsIHN1Ym5hbWUsIGJ1Zik7Ci0JCQlQeV9YREVDUkVGKHN1Ym1vZCk7Ci0JCQlpZiAoc3VibW9kID09IE5VTEwpIHsKLQkJCQlQeV9ERUNSRUYoaXRlbSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KKyAgICBmb3IgKGkgPSAwOyA7IGkrKykgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShmcm9tbGlzdCwgaSk7CisgICAgICAgIGludCBoYXNpdDsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW5kZXhFcnJvcikpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeVN0cmluZ19DaGVjayhpdGVtKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXRlbSBpbiBgYGZyb20gbGlzdCcnIG5vdCBhIHN0cmluZyIpOworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKVswXSA9PSAnKicpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICphbGw7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAvKiBTZWUgaWYgdGhlIHBhY2thZ2UgZGVmaW5lcyBfX2FsbF9fICovCisgICAgICAgICAgICBpZiAocmVjdXJzaXZlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBBdm9pZCBlbmRsZXNzIHJlY3Vyc2lvbiAqLworICAgICAgICAgICAgYWxsID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJfX2FsbF9fIik7CisgICAgICAgICAgICBpZiAoYWxsID09IE5VTEwpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCByZXQgPSBlbnN1cmVfZnJvbWxpc3QobW9kLCBhbGwsIGJ1ZiwgYnVmbGVuLCAxKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBoYXNpdCA9IFB5T2JqZWN0X0hhc0F0dHIobW9kLCBpdGVtKTsKKyAgICAgICAgaWYgKCFoYXNpdCkgeworICAgICAgICAgICAgY2hhciAqc3VibmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhpdGVtKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJtb2Q7CisgICAgICAgICAgICBjaGFyICpwOworICAgICAgICAgICAgaWYgKGJ1ZmxlbiArIHN0cmxlbihzdWJuYW1lKSA+PSBNQVhQQVRITEVOKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb2R1bGUgbmFtZSB0b28gbG9uZyIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgPSBidWYgKyBidWZsZW47CisgICAgICAgICAgICAqcCsrID0gJy4nOworICAgICAgICAgICAgc3RyY3B5KHAsIHN1Ym5hbWUpOworICAgICAgICAgICAgc3VibW9kID0gaW1wb3J0X3N1Ym1vZHVsZShtb2QsIHN1Ym5hbWUsIGJ1Zik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHN1Ym1vZCk7CisgICAgICAgICAgICBpZiAoc3VibW9kID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KIAotCS8qIE5PVFJFQUNIRUQgKi8KKyAgICAvKiBOT1RSRUFDSEVEICovCiB9CiAKIHN0YXRpYyBpbnQKIGFkZF9zdWJtb2R1bGUoUHlPYmplY3QgKm1vZCwgUHlPYmplY3QgKnN1Ym1vZCwgY2hhciAqZnVsbG5hbWUsIGNoYXIgKnN1Ym5hbWUsCi0JICAgICAgUHlPYmplY3QgKm1vZHVsZXMpCisgICAgICAgICAgICAgIFB5T2JqZWN0ICptb2R1bGVzKQogewotCWlmIChtb2QgPT0gUHlfTm9uZSkKLQkJcmV0dXJuIDE7Ci0JLyogSXJyZXNwZWN0aXZlIG9mIHRoZSBzdWNjZXNzIG9mIHRoaXMgbG9hZCwgbWFrZSBhCi0JICAgcmVmZXJlbmNlIHRvIGl0IGluIHRoZSBwYXJlbnQgcGFja2FnZSBtb2R1bGUuICBBIGNvcHkgZ2V0cwotCSAgIHNhdmVkIGluIHRoZSBtb2R1bGVzIGRpY3Rpb25hcnkgdW5kZXIgdGhlIGZ1bGwgbmFtZSwgc28gZ2V0IGEKLQkgICByZWZlcmVuY2UgZnJvbSB0aGVyZSwgaWYgbmVlZCBiZS4gIChUaGUgZXhjZXB0aW9uIGlzIHdoZW4gdGhlCi0JICAgbG9hZCBmYWlsZWQgd2l0aCBhIFN5bnRheEVycm9yIC0tIHRoZW4gdGhlcmUncyBubyB0cmFjZSBpbgotCSAgIHN5cy5tb2R1bGVzLiAgSW4gdGhhdCBjYXNlLCBvZiBjb3Vyc2UsIGRvIG5vdGhpbmcgZXh0cmEuKSAqLwotCWlmIChzdWJtb2QgPT0gTlVMTCkgewotCQlzdWJtb2QgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBmdWxsbmFtZSk7Ci0JCWlmIChzdWJtb2QgPT0gTlVMTCkKLQkJCXJldHVybiAxOwotCX0KLQlpZiAoUHlNb2R1bGVfQ2hlY2sobW9kKSkgewotCQkvKiBXZSBjYW4ndCB1c2Ugc2V0YXR0ciBoZXJlIHNpbmNlIGl0IGNhbiBnaXZlIGEKLQkJICogc3B1cmlvdXMgd2FybmluZyBpZiB0aGUgc3VibW9kdWxlIG5hbWUgc2hhZG93cyBhCi0JCSAqIGJ1aWx0aW4gbmFtZSAqLwotCQlQeU9iamVjdCAqZGljdCA9IFB5TW9kdWxlX0dldERpY3QobW9kKTsKLQkJaWYgKCFkaWN0KQotCQkJcmV0dXJuIDA7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCBzdWJuYW1lLCBzdWJtb2QpIDwgMCkKLQkJCXJldHVybiAwOwotCX0KLQllbHNlIHsKLQkJaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcobW9kLCBzdWJuYW1lLCBzdWJtb2QpIDwgMCkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAobW9kID09IFB5X05vbmUpCisgICAgICAgIHJldHVybiAxOworICAgIC8qIElycmVzcGVjdGl2ZSBvZiB0aGUgc3VjY2VzcyBvZiB0aGlzIGxvYWQsIG1ha2UgYQorICAgICAgIHJlZmVyZW5jZSB0byBpdCBpbiB0aGUgcGFyZW50IHBhY2thZ2UgbW9kdWxlLiAgQSBjb3B5IGdldHMKKyAgICAgICBzYXZlZCBpbiB0aGUgbW9kdWxlcyBkaWN0aW9uYXJ5IHVuZGVyIHRoZSBmdWxsIG5hbWUsIHNvIGdldCBhCisgICAgICAgcmVmZXJlbmNlIGZyb20gdGhlcmUsIGlmIG5lZWQgYmUuICAoVGhlIGV4Y2VwdGlvbiBpcyB3aGVuIHRoZQorICAgICAgIGxvYWQgZmFpbGVkIHdpdGggYSBTeW50YXhFcnJvciAtLSB0aGVuIHRoZXJlJ3Mgbm8gdHJhY2UgaW4KKyAgICAgICBzeXMubW9kdWxlcy4gIEluIHRoYXQgY2FzZSwgb2YgY291cnNlLCBkbyBub3RoaW5nIGV4dHJhLikgKi8KKyAgICBpZiAoc3VibW9kID09IE5VTEwpIHsKKyAgICAgICAgc3VibW9kID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgZnVsbG5hbWUpOworICAgICAgICBpZiAoc3VibW9kID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKFB5TW9kdWxlX0NoZWNrKG1vZCkpIHsKKyAgICAgICAgLyogV2UgY2FuJ3QgdXNlIHNldGF0dHIgaGVyZSBzaW5jZSBpdCBjYW4gZ2l2ZSBhCisgICAgICAgICAqIHNwdXJpb3VzIHdhcm5pbmcgaWYgdGhlIHN1Ym1vZHVsZSBuYW1lIHNoYWRvd3MgYQorICAgICAgICAgKiBidWlsdGluIG5hbWUgKi8KKyAgICAgICAgUHlPYmplY3QgKmRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG1vZCk7CisgICAgICAgIGlmICghZGljdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgc3VibmFtZSwgc3VibW9kKSA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKG1vZCwgc3VibmFtZSwgc3VibW9kKSA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBvcnRfc3VibW9kdWxlKFB5T2JqZWN0ICptb2QsIGNoYXIgKnN1Ym5hbWUsIGNoYXIgKmZ1bGxuYW1lKQogewotCVB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOwotCVB5T2JqZWN0ICptID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKyAgICBQeU9iamVjdCAqbSA9IE5VTEw7CiAKLQkvKiBSZXF1aXJlOgotCSAgIGlmIG1vZCA9PSBOb25lOiBzdWJuYW1lID09IGZ1bGxuYW1lCi0JICAgZWxzZTogbW9kLl9fbmFtZV9fICsgIi4iICsgc3VibmFtZSA9PSBmdWxsbmFtZQotCSovCisgICAgLyogUmVxdWlyZToKKyAgICAgICBpZiBtb2QgPT0gTm9uZTogc3VibmFtZSA9PSBmdWxsbmFtZQorICAgICAgIGVsc2U6IG1vZC5fX25hbWVfXyArICIuIiArIHN1Ym5hbWUgPT0gZnVsbG5hbWUKKyAgICAqLwogCi0JaWYgKChtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgZnVsbG5hbWUpKSAhPSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihtKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T2JqZWN0ICpwYXRoLCAqbG9hZGVyID0gTlVMTDsKLQkJY2hhciBidWZbTUFYUEFUSExFTisxXTsKLQkJc3RydWN0IGZpbGVkZXNjciAqZmRwOwotCQlGSUxFICpmcCA9IE5VTEw7CisgICAgaWYgKChtID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgZnVsbG5hbWUpKSAhPSBOVUxMKSB7CisgICAgICAgIFB5X0lOQ1JFRihtKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICpwYXRoLCAqbG9hZGVyID0gTlVMTDsKKyAgICAgICAgY2hhciBidWZbTUFYUEFUSExFTisxXTsKKyAgICAgICAgc3RydWN0IGZpbGVkZXNjciAqZmRwOworICAgICAgICBGSUxFICpmcCA9IE5VTEw7CiAKLQkJaWYgKG1vZCA9PSBQeV9Ob25lKQotCQkJcGF0aCA9IE5VTEw7Ci0JCWVsc2UgewotCQkJcGF0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobW9kLCAiX19wYXRoX18iKTsKLQkJCWlmIChwYXRoID09IE5VTEwpIHsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCQlyZXR1cm4gUHlfTm9uZTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAobW9kID09IFB5X05vbmUpCisgICAgICAgICAgICBwYXRoID0gTlVMTDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwYXRoID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtb2QsICJfX3BhdGhfXyIpOworICAgICAgICAgICAgaWYgKHBhdGggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJYnVmWzBdID0gJ1wwJzsKLQkJZmRwID0gZmluZF9tb2R1bGUoZnVsbG5hbWUsIHN1Ym5hbWUsIHBhdGgsIGJ1ZiwgTUFYUEFUSExFTisxLAotCQkJCSAgJmZwLCAmbG9hZGVyKTsKLQkJUHlfWERFQ1JFRihwYXRoKTsKLQkJaWYgKGZkcCA9PSBOVUxMKSB7Ci0JCQlpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfSW1wb3J0RXJyb3IpKQotCQkJCXJldHVybiBOVUxMOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXJldHVybiBQeV9Ob25lOwotCQl9Ci0JCW0gPSBsb2FkX21vZHVsZShmdWxsbmFtZSwgZnAsIGJ1ZiwgZmRwLT50eXBlLCBsb2FkZXIpOwotCQlQeV9YREVDUkVGKGxvYWRlcik7Ci0JCWlmIChmcCkKLQkJCWZjbG9zZShmcCk7Ci0JCWlmICghYWRkX3N1Ym1vZHVsZShtb2QsIG0sIGZ1bGxuYW1lLCBzdWJuYW1lLCBtb2R1bGVzKSkgewotCQkJUHlfWERFQ1JFRihtKTsKLQkJCW0gPSBOVUxMOwotCQl9Ci0JfQorICAgICAgICBidWZbMF0gPSAnXDAnOworICAgICAgICBmZHAgPSBmaW5kX21vZHVsZShmdWxsbmFtZSwgc3VibmFtZSwgcGF0aCwgYnVmLCBNQVhQQVRITEVOKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmcCwgJmxvYWRlcik7CisgICAgICAgIFB5X1hERUNSRUYocGF0aCk7CisgICAgICAgIGlmIChmZHAgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0ltcG9ydEVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBtID0gbG9hZF9tb2R1bGUoZnVsbG5hbWUsIGZwLCBidWYsIGZkcC0+dHlwZSwgbG9hZGVyKTsKKyAgICAgICAgUHlfWERFQ1JFRihsb2FkZXIpOworICAgICAgICBpZiAoZnApCisgICAgICAgICAgICBmY2xvc2UoZnApOworICAgICAgICBpZiAoIWFkZF9zdWJtb2R1bGUobW9kLCBtLCBmdWxsbmFtZSwgc3VibmFtZSwgbW9kdWxlcykpIHsKKyAgICAgICAgICAgIFB5X1hERUNSRUYobSk7CisgICAgICAgICAgICBtID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBtOworICAgIHJldHVybiBtOwogfQogCiAKQEAgLTI2MDgsOTYgKzI2MDgsOTYgQEAKIFB5T2JqZWN0ICoKIFB5SW1wb3J0X1JlbG9hZE1vZHVsZShQeU9iamVjdCAqbSkKIHsKLQlQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR2V0KCktPmludGVycDsKLQlQeU9iamVjdCAqbW9kdWxlc19yZWxvYWRpbmcgPSBpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nOwotCVB5T2JqZWN0ICptb2R1bGVzID0gUHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOwotCVB5T2JqZWN0ICpwYXRoID0gTlVMTCwgKmxvYWRlciA9IE5VTEwsICpleGlzdGluZ19tID0gTlVMTDsKLQljaGFyICpuYW1lLCAqc3VibmFtZTsKLQljaGFyIGJ1ZltNQVhQQVRITEVOKzFdOwotCXN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKLQlGSUxFICpmcCA9IE5VTEw7Ci0JUHlPYmplY3QgKm5ld207Ci0gICAgCi0JaWYgKG1vZHVsZXNfcmVsb2FkaW5nID09IE5VTEwpIHsKLQkJUHlfRmF0YWxFcnJvcigiUHlJbXBvcnRfUmVsb2FkTW9kdWxlOiAiCi0JCQkgICAgICAibm8gbW9kdWxlc19yZWxvYWRpbmcgZGljdGlvbmFyeSEiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HZXQoKS0+aW50ZXJwOworICAgIFB5T2JqZWN0ICptb2R1bGVzX3JlbG9hZGluZyA9IGludGVycC0+bW9kdWxlc19yZWxvYWRpbmc7CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisgICAgUHlPYmplY3QgKnBhdGggPSBOVUxMLCAqbG9hZGVyID0gTlVMTCwgKmV4aXN0aW5nX20gPSBOVUxMOworICAgIGNoYXIgKm5hbWUsICpzdWJuYW1lOworICAgIGNoYXIgYnVmW01BWFBBVEhMRU4rMV07CisgICAgc3RydWN0IGZpbGVkZXNjciAqZmRwOworICAgIEZJTEUgKmZwID0gTlVMTDsKKyAgICBQeU9iamVjdCAqbmV3bTsKIAotCWlmIChtID09IE5VTEwgfHwgIVB5TW9kdWxlX0NoZWNrKG0pKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJInJlbG9hZCgpIGFyZ3VtZW50IG11c3QgYmUgbW9kdWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQluYW1lID0gUHlNb2R1bGVfR2V0TmFtZShtKTsKLQlpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobSAhPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKSkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCi0JCQkgICAgICJyZWxvYWQoKTogbW9kdWxlICUuMjAwcyBub3QgaW4gc3lzLm1vZHVsZXMiLAotCQkJICAgICBuYW1lKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWV4aXN0aW5nX20gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzX3JlbG9hZGluZywgbmFtZSk7Ci0JaWYgKGV4aXN0aW5nX20gIT0gTlVMTCkgewotCQkvKiBEdWUgdG8gYSByZWN1cnNpdmUgcmVsb2FkLCB0aGlzIG1vZHVsZSBpcyBhbHJlYWR5Ci0JCSAgIGJlaW5nIHJlbG9hZGVkLiAqLwotCQlQeV9JTkNSRUYoZXhpc3RpbmdfbSk7Ci0JCXJldHVybiBleGlzdGluZ19tOwotIAl9Ci0gCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzX3JlbG9hZGluZywgbmFtZSwgbSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAobW9kdWxlc19yZWxvYWRpbmcgPT0gTlVMTCkgeworICAgICAgICBQeV9GYXRhbEVycm9yKCJQeUltcG9ydF9SZWxvYWRNb2R1bGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICAibm8gbW9kdWxlc19yZWxvYWRpbmcgZGljdGlvbmFyeSEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3VibmFtZSA9IHN0cnJjaHIobmFtZSwgJy4nKTsKLQlpZiAoc3VibmFtZSA9PSBOVUxMKQotCQlzdWJuYW1lID0gbmFtZTsKLQllbHNlIHsKLQkJUHlPYmplY3QgKnBhcmVudG5hbWUsICpwYXJlbnQ7Ci0JCXBhcmVudG5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuYW1lLCAoc3VibmFtZS1uYW1lKSk7Ci0JCWlmIChwYXJlbnRuYW1lID09IE5VTEwpIHsKLQkJCWltcF9tb2R1bGVzX3JlbG9hZGluZ19jbGVhcigpOwotCQkJcmV0dXJuIE5VTEw7Ci0gICAgICAgIAl9Ci0JCXBhcmVudCA9IFB5RGljdF9HZXRJdGVtKG1vZHVsZXMsIHBhcmVudG5hbWUpOwotCQlpZiAocGFyZW50ID09IE5VTEwpIHsKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJCSAgICAicmVsb2FkKCk6IHBhcmVudCAlLjIwMHMgbm90IGluIHN5cy5tb2R1bGVzIiwKLQkJCSAgICBQeVN0cmluZ19BU19TVFJJTkcocGFyZW50bmFtZSkpOwotCQkJUHlfREVDUkVGKHBhcmVudG5hbWUpOwotCQkJaW1wX21vZHVsZXNfcmVsb2FkaW5nX2NsZWFyKCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlQeV9ERUNSRUYocGFyZW50bmFtZSk7Ci0JCXN1Ym5hbWUrKzsKLQkJcGF0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcocGFyZW50LCAiX19wYXRoX18iKTsKLQkJaWYgKHBhdGggPT0gTlVMTCkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWJ1ZlswXSA9ICdcMCc7Ci0JZmRwID0gZmluZF9tb2R1bGUobmFtZSwgc3VibmFtZSwgcGF0aCwgYnVmLCBNQVhQQVRITEVOKzEsICZmcCwgJmxvYWRlcik7Ci0JUHlfWERFQ1JFRihwYXRoKTsKKyAgICBpZiAobSA9PSBOVUxMIHx8ICFQeU1vZHVsZV9DaGVjayhtKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlbG9hZCgpIGFyZ3VtZW50IG11c3QgYmUgbW9kdWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBuYW1lID0gUHlNb2R1bGVfR2V0TmFtZShtKTsKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobSAhPSBQeURpY3RfR2V0SXRlbVN0cmluZyhtb2R1bGVzLCBuYW1lKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW1wb3J0RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAicmVsb2FkKCk6IG1vZHVsZSAlLjIwMHMgbm90IGluIHN5cy5tb2R1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZXhpc3RpbmdfbSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKG1vZHVsZXNfcmVsb2FkaW5nLCBuYW1lKTsKKyAgICBpZiAoZXhpc3RpbmdfbSAhPSBOVUxMKSB7CisgICAgICAgIC8qIER1ZSB0byBhIHJlY3Vyc2l2ZSByZWxvYWQsIHRoaXMgbW9kdWxlIGlzIGFscmVhZHkKKyAgICAgICAgICAgYmVpbmcgcmVsb2FkZWQuICovCisgICAgICAgIFB5X0lOQ1JFRihleGlzdGluZ19tKTsKKyAgICAgICAgcmV0dXJuIGV4aXN0aW5nX207CisgICAgfQorICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhtb2R1bGVzX3JlbG9hZGluZywgbmFtZSwgbSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChmZHAgPT0gTlVMTCkgewotCQlQeV9YREVDUkVGKGxvYWRlcik7Ci0JCWltcF9tb2R1bGVzX3JlbG9hZGluZ19jbGVhcigpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgc3VibmFtZSA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKyAgICBpZiAoc3VibmFtZSA9PSBOVUxMKQorICAgICAgICBzdWJuYW1lID0gbmFtZTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlPYmplY3QgKnBhcmVudG5hbWUsICpwYXJlbnQ7CisgICAgICAgIHBhcmVudG5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuYW1lLCAoc3VibmFtZS1uYW1lKSk7CisgICAgICAgIGlmIChwYXJlbnRuYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIGltcF9tb2R1bGVzX3JlbG9hZGluZ19jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcGFyZW50ID0gUHlEaWN0X0dldEl0ZW0obW9kdWxlcywgcGFyZW50bmFtZSk7CisgICAgICAgIGlmIChwYXJlbnQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICJyZWxvYWQoKTogcGFyZW50ICUuMjAwcyBub3QgaW4gc3lzLm1vZHVsZXMiLAorICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhwYXJlbnRuYW1lKSk7CisgICAgICAgICAgICBQeV9ERUNSRUYocGFyZW50bmFtZSk7CisgICAgICAgICAgICBpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihwYXJlbnRuYW1lKTsKKyAgICAgICAgc3VibmFtZSsrOworICAgICAgICBwYXRoID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhwYXJlbnQsICJfX3BhdGhfXyIpOworICAgICAgICBpZiAocGF0aCA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgYnVmWzBdID0gJ1wwJzsKKyAgICBmZHAgPSBmaW5kX21vZHVsZShuYW1lLCBzdWJuYW1lLCBwYXRoLCBidWYsIE1BWFBBVEhMRU4rMSwgJmZwLCAmbG9hZGVyKTsKKyAgICBQeV9YREVDUkVGKHBhdGgpOwogCi0JbmV3bSA9IGxvYWRfbW9kdWxlKG5hbWUsIGZwLCBidWYsIGZkcC0+dHlwZSwgbG9hZGVyKTsKLQlQeV9YREVDUkVGKGxvYWRlcik7CisgICAgaWYgKGZkcCA9PSBOVUxMKSB7CisgICAgICAgIFB5X1hERUNSRUYobG9hZGVyKTsKKyAgICAgICAgaW1wX21vZHVsZXNfcmVsb2FkaW5nX2NsZWFyKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWlmIChmcCkKLQkJZmNsb3NlKGZwKTsKLQlpZiAobmV3bSA9PSBOVUxMKSB7Ci0JCS8qIGxvYWRfbW9kdWxlIHByb2JhYmx5IHJlbW92ZWQgbmFtZSBmcm9tIG1vZHVsZXMgYmVjYXVzZSBvZgotCQkgKiB0aGUgZXJyb3IuICBQdXQgYmFjayB0aGUgb3JpZ2luYWwgbW9kdWxlIG9iamVjdC4gIFdlJ3JlCi0JCSAqIGdvaW5nIHRvIHJldHVybiBOVUxMIGluIHRoaXMgY2FzZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLQkJICogcmVwbGFjaW5nIG5hbWUgc3VjY2VlZHMsIHNvIHRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KLQkJICovCi0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUsIG0pOwotCX0KLQlpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIoKTsKLQlyZXR1cm4gbmV3bTsKKyAgICBuZXdtID0gbG9hZF9tb2R1bGUobmFtZSwgZnAsIGJ1ZiwgZmRwLT50eXBlLCBsb2FkZXIpOworICAgIFB5X1hERUNSRUYobG9hZGVyKTsKKworICAgIGlmIChmcCkKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICBpZiAobmV3bSA9PSBOVUxMKSB7CisgICAgICAgIC8qIGxvYWRfbW9kdWxlIHByb2JhYmx5IHJlbW92ZWQgbmFtZSBmcm9tIG1vZHVsZXMgYmVjYXVzZSBvZgorICAgICAgICAgKiB0aGUgZXJyb3IuICBQdXQgYmFjayB0aGUgb3JpZ2luYWwgbW9kdWxlIG9iamVjdC4gIFdlJ3JlCisgICAgICAgICAqIGdvaW5nIHRvIHJldHVybiBOVUxMIGluIHRoaXMgY2FzZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAgICAgICAgICogcmVwbGFjaW5nIG5hbWUgc3VjY2VlZHMsIHNvIHRoZSByZXR1cm4gdmFsdWUgaXMgaWdub3JlZC4KKyAgICAgICAgICovCisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKG1vZHVsZXMsIG5hbWUsIG0pOworICAgIH0KKyAgICBpbXBfbW9kdWxlc19yZWxvYWRpbmdfY2xlYXIoKTsKKyAgICByZXR1cm4gbmV3bTsKIH0KIAogCkBAIC0yNzEzLDY4ICsyNzEzLDY4IEBACiBQeU9iamVjdCAqCiBQeUltcG9ydF9JbXBvcnQoUHlPYmplY3QgKm1vZHVsZV9uYW1lKQogewotCXN0YXRpYyBQeU9iamVjdCAqc2lsbHlfbGlzdCA9IE5VTEw7Ci0Jc3RhdGljIFB5T2JqZWN0ICpidWlsdGluc19zdHIgPSBOVUxMOwotCXN0YXRpYyBQeU9iamVjdCAqaW1wb3J0X3N0ciA9IE5VTEw7Ci0JUHlPYmplY3QgKmdsb2JhbHMgPSBOVUxMOwotCVB5T2JqZWN0ICppbXBvcnQgPSBOVUxMOwotCVB5T2JqZWN0ICpidWlsdGlucyA9IE5VTEw7Ci0JUHlPYmplY3QgKnIgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqc2lsbHlfbGlzdCA9IE5VTEw7CisgICAgc3RhdGljIFB5T2JqZWN0ICpidWlsdGluc19zdHIgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqaW1wb3J0X3N0ciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmdsb2JhbHMgPSBOVUxMOworICAgIFB5T2JqZWN0ICppbXBvcnQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpidWlsdGlucyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnIgPSBOVUxMOwogCi0JLyogSW5pdGlhbGl6ZSBjb25zdGFudCBzdHJpbmcgb2JqZWN0cyAqLwotCWlmIChzaWxseV9saXN0ID09IE5VTEwpIHsKLQkJaW1wb3J0X3N0ciA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9faW1wb3J0X18iKTsKLQkJaWYgKGltcG9ydF9zdHIgPT0gTlVMTCkKLQkJCXJldHVybiBOVUxMOwotCQlidWlsdGluc19zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2J1aWx0aW5zX18iKTsKLQkJaWYgKGJ1aWx0aW5zX3N0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXNpbGx5X2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJbc10iLCAiX19kb2NfXyIpOwotCQlpZiAoc2lsbHlfbGlzdCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgY29uc3RhbnQgc3RyaW5nIG9iamVjdHMgKi8KKyAgICBpZiAoc2lsbHlfbGlzdCA9PSBOVUxMKSB7CisgICAgICAgIGltcG9ydF9zdHIgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCJfX2ltcG9ydF9fIik7CisgICAgICAgIGlmIChpbXBvcnRfc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgYnVpbHRpbnNfc3RyID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19idWlsdGluc19fIik7CisgICAgICAgIGlmIChidWlsdGluc19zdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBzaWxseV9saXN0ID0gUHlfQnVpbGRWYWx1ZSgiW3NdIiwgIl9fZG9jX18iKTsKKyAgICAgICAgaWYgKHNpbGx5X2xpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCS8qIEdldCB0aGUgYnVpbHRpbnMgZnJvbSBjdXJyZW50IGdsb2JhbHMgKi8KLQlnbG9iYWxzID0gUHlFdmFsX0dldEdsb2JhbHMoKTsKLQlpZiAoZ2xvYmFscyAhPSBOVUxMKSB7Ci0JICAgICAgICBQeV9JTkNSRUYoZ2xvYmFscyk7Ci0JCWJ1aWx0aW5zID0gUHlPYmplY3RfR2V0SXRlbShnbG9iYWxzLCBidWlsdGluc19zdHIpOwotCQlpZiAoYnVpbHRpbnMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCX0KLQllbHNlIHsKLQkJLyogTm8gZ2xvYmFscyAtLSB1c2Ugc3RhbmRhcmQgYnVpbHRpbnMsIGFuZCBmYWtlIGdsb2JhbHMgKi8KLQkJYnVpbHRpbnMgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbCgiX19idWlsdGluX18iLAotCQkJCQkJICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgMCk7Ci0JCWlmIChidWlsdGlucyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWdsb2JhbHMgPSBQeV9CdWlsZFZhbHVlKCJ7T099IiwgYnVpbHRpbnNfc3RyLCBidWlsdGlucyk7Ci0JCWlmIChnbG9iYWxzID09IE5VTEwpCi0JCQlnb3RvIGVycjsKLQl9CisgICAgLyogR2V0IHRoZSBidWlsdGlucyBmcm9tIGN1cnJlbnQgZ2xvYmFscyAqLworICAgIGdsb2JhbHMgPSBQeUV2YWxfR2V0R2xvYmFscygpOworICAgIGlmIChnbG9iYWxzICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGdsb2JhbHMpOworICAgICAgICBidWlsdGlucyA9IFB5T2JqZWN0X0dldEl0ZW0oZ2xvYmFscywgYnVpbHRpbnNfc3RyKTsKKyAgICAgICAgaWYgKGJ1aWx0aW5zID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIE5vIGdsb2JhbHMgLS0gdXNlIHN0YW5kYXJkIGJ1aWx0aW5zLCBhbmQgZmFrZSBnbG9iYWxzICovCisgICAgICAgIGJ1aWx0aW5zID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwoIl9fYnVpbHRpbl9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKGJ1aWx0aW5zID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ2xvYmFscyA9IFB5X0J1aWxkVmFsdWUoIntPT30iLCBidWlsdGluc19zdHIsIGJ1aWx0aW5zKTsKKyAgICAgICAgaWYgKGdsb2JhbHMgPT0gTlVMTCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgIH0KIAotCS8qIEdldCB0aGUgX19pbXBvcnRfXyBmdW5jdGlvbiBmcm9tIHRoZSBidWlsdGlucyAqLwotCWlmIChQeURpY3RfQ2hlY2soYnVpbHRpbnMpKSB7Ci0JCWltcG9ydCA9IFB5T2JqZWN0X0dldEl0ZW0oYnVpbHRpbnMsIGltcG9ydF9zdHIpOwotCQlpZiAoaW1wb3J0ID09IE5VTEwpCi0JCQlQeUVycl9TZXRPYmplY3QoUHlFeGNfS2V5RXJyb3IsIGltcG9ydF9zdHIpOwotCX0KLQllbHNlCi0JCWltcG9ydCA9IFB5T2JqZWN0X0dldEF0dHIoYnVpbHRpbnMsIGltcG9ydF9zdHIpOwotCWlmIChpbXBvcnQgPT0gTlVMTCkKLQkJZ290byBlcnI7CisgICAgLyogR2V0IHRoZSBfX2ltcG9ydF9fIGZ1bmN0aW9uIGZyb20gdGhlIGJ1aWx0aW5zICovCisgICAgaWYgKFB5RGljdF9DaGVjayhidWlsdGlucykpIHsKKyAgICAgICAgaW1wb3J0ID0gUHlPYmplY3RfR2V0SXRlbShidWlsdGlucywgaW1wb3J0X3N0cik7CisgICAgICAgIGlmIChpbXBvcnQgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwgaW1wb3J0X3N0cik7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaW1wb3J0ID0gUHlPYmplY3RfR2V0QXR0cihidWlsdGlucywgaW1wb3J0X3N0cik7CisgICAgaWYgKGltcG9ydCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycjsKIAotCS8qIENhbGwgdGhlIF9faW1wb3J0X18gZnVuY3Rpb24gd2l0aCB0aGUgcHJvcGVyIGFyZ3VtZW50IGxpc3QKLQkgKiBBbHdheXMgdXNlIGFic29sdXRlIGltcG9ydCBoZXJlLiAqLwotCXIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oaW1wb3J0LCAiT09PT2kiLCBtb2R1bGVfbmFtZSwgZ2xvYmFscywKLQkJCQkgIGdsb2JhbHMsIHNpbGx5X2xpc3QsIDAsIE5VTEwpOworICAgIC8qIENhbGwgdGhlIF9faW1wb3J0X18gZnVuY3Rpb24gd2l0aCB0aGUgcHJvcGVyIGFyZ3VtZW50IGxpc3QKKyAgICAgKiBBbHdheXMgdXNlIGFic29sdXRlIGltcG9ydCBoZXJlLiAqLworICAgIHIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oaW1wb3J0LCAiT09PT2kiLCBtb2R1bGVfbmFtZSwgZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHMsIHNpbGx5X2xpc3QsIDAsIE5VTEwpOwogCiAgIGVycjoKLQlQeV9YREVDUkVGKGdsb2JhbHMpOwotCVB5X1hERUNSRUYoYnVpbHRpbnMpOwotCVB5X1hERUNSRUYoaW1wb3J0KTsKKyAgICBQeV9YREVDUkVGKGdsb2JhbHMpOworICAgIFB5X1hERUNSRUYoYnVpbHRpbnMpOworICAgIFB5X1hERUNSRUYoaW1wb3J0KTsKIAotCXJldHVybiByOworICAgIHJldHVybiByOwogfQogCiAKQEAgLTI3ODUsMTkyICsyNzg1LDE5MiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9nZXRfbWFnaWMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JY2hhciBidWZbNF07CisgICAgY2hhciBidWZbNF07CiAKLQlidWZbMF0gPSAoY2hhcikgKChweWNfbWFnaWMgPj4gIDApICYgMHhmZik7Ci0JYnVmWzFdID0gKGNoYXIpICgocHljX21hZ2ljID4+ICA4KSAmIDB4ZmYpOwotCWJ1ZlsyXSA9IChjaGFyKSAoKHB5Y19tYWdpYyA+PiAxNikgJiAweGZmKTsKLQlidWZbM10gPSAoY2hhcikgKChweWNfbWFnaWMgPj4gMjQpICYgMHhmZik7CisgICAgYnVmWzBdID0gKGNoYXIpICgocHljX21hZ2ljID4+ICAwKSAmIDB4ZmYpOworICAgIGJ1ZlsxXSA9IChjaGFyKSAoKHB5Y19tYWdpYyA+PiAgOCkgJiAweGZmKTsKKyAgICBidWZbMl0gPSAoY2hhcikgKChweWNfbWFnaWMgPj4gMTYpICYgMHhmZik7CisgICAgYnVmWzNdID0gKGNoYXIpICgocHljX21hZ2ljID4+IDI0KSAmIDB4ZmYpOwogCi0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgNCk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgNCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfZ2V0X3N1ZmZpeGVzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCVB5T2JqZWN0ICpsaXN0OwotCXN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKKyAgICBQeU9iamVjdCAqbGlzdDsKKyAgICBzdHJ1Y3QgZmlsZWRlc2NyICpmZHA7CiAKLQlsaXN0ID0gUHlMaXN0X05ldygwKTsKLQlpZiAobGlzdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlmb3IgKGZkcCA9IF9QeUltcG9ydF9GaWxldGFiOyBmZHAtPnN1ZmZpeCAhPSBOVUxMOyBmZHArKykgewotCQlQeU9iamVjdCAqaXRlbSA9IFB5X0J1aWxkVmFsdWUoInNzaSIsCi0JCQkJICAgICAgIGZkcC0+c3VmZml4LCBmZHAtPm1vZGUsIGZkcC0+dHlwZSk7Ci0JCWlmIChpdGVtID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRihsaXN0KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmIChQeUxpc3RfQXBwZW5kKGxpc3QsIGl0ZW0pIDwgMCkgewotCQkJUHlfREVDUkVGKGxpc3QpOwotCQkJUHlfREVDUkVGKGl0ZW0pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJUHlfREVDUkVGKGl0ZW0pOwotCX0KLQlyZXR1cm4gbGlzdDsKKyAgICBsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGZkcCA9IF9QeUltcG9ydF9GaWxldGFiOyBmZHAtPnN1ZmZpeCAhPSBOVUxMOyBmZHArKykgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5X0J1aWxkVmFsdWUoInNzaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmRwLT5zdWZmaXgsIGZkcC0+bW9kZSwgZmRwLT50eXBlKTsKKyAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGxpc3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobGlzdCwgaXRlbSkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQorICAgIHJldHVybiBsaXN0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogY2FsbF9maW5kX21vZHVsZShjaGFyICpuYW1lLCBQeU9iamVjdCAqcGF0aCkKIHsKLQlleHRlcm4gaW50IGZjbG9zZShGSUxFICopOwotCVB5T2JqZWN0ICpmb2IsICpyZXQ7Ci0Jc3RydWN0IGZpbGVkZXNjciAqZmRwOwotCWNoYXIgcGF0aG5hbWVbTUFYUEFUSExFTisxXTsKLQlGSUxFICpmcCA9IE5VTEw7CisgICAgZXh0ZXJuIGludCBmY2xvc2UoRklMRSAqKTsKKyAgICBQeU9iamVjdCAqZm9iLCAqcmV0OworICAgIHN0cnVjdCBmaWxlZGVzY3IgKmZkcDsKKyAgICBjaGFyIHBhdGhuYW1lW01BWFBBVEhMRU4rMV07CisgICAgRklMRSAqZnAgPSBOVUxMOwogCi0JcGF0aG5hbWVbMF0gPSAnXDAnOwotCWlmIChwYXRoID09IFB5X05vbmUpCi0JCXBhdGggPSBOVUxMOwotCWZkcCA9IGZpbmRfbW9kdWxlKE5VTEwsIG5hbWUsIHBhdGgsIHBhdGhuYW1lLCBNQVhQQVRITEVOKzEsICZmcCwgTlVMTCk7Ci0JaWYgKGZkcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoZnAgIT0gTlVMTCkgewotCQlmb2IgPSBQeUZpbGVfRnJvbUZpbGUoZnAsIHBhdGhuYW1lLCBmZHAtPm1vZGUsIGZjbG9zZSk7Ci0JCWlmIChmb2IgPT0gTlVMTCkgewotCQkJZmNsb3NlKGZwKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCWVsc2UgewotCQlmb2IgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYoZm9iKTsKLQl9Ci0JcmV0ID0gUHlfQnVpbGRWYWx1ZSgiT3Moc3NpKSIsCi0JCSAgICAgIGZvYiwgcGF0aG5hbWUsIGZkcC0+c3VmZml4LCBmZHAtPm1vZGUsIGZkcC0+dHlwZSk7Ci0JUHlfREVDUkVGKGZvYik7Ci0JcmV0dXJuIHJldDsKKyAgICBwYXRobmFtZVswXSA9ICdcMCc7CisgICAgaWYgKHBhdGggPT0gUHlfTm9uZSkKKyAgICAgICAgcGF0aCA9IE5VTEw7CisgICAgZmRwID0gZmluZF9tb2R1bGUoTlVMTCwgbmFtZSwgcGF0aCwgcGF0aG5hbWUsIE1BWFBBVEhMRU4rMSwgJmZwLCBOVUxMKTsKKyAgICBpZiAoZmRwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChmcCAhPSBOVUxMKSB7CisgICAgICAgIGZvYiA9IFB5RmlsZV9Gcm9tRmlsZShmcCwgcGF0aG5hbWUsIGZkcC0+bW9kZSwgZmNsb3NlKTsKKyAgICAgICAgaWYgKGZvYiA9PSBOVUxMKSB7CisgICAgICAgICAgICBmY2xvc2UoZnApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvYiA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihmb2IpOworICAgIH0KKyAgICByZXQgPSBQeV9CdWlsZFZhbHVlKCJPcyhzc2kpIiwKKyAgICAgICAgICAgICAgICAgIGZvYiwgcGF0aG5hbWUsIGZkcC0+c3VmZml4LCBmZHAtPm1vZGUsIGZkcC0+dHlwZSk7CisgICAgUHlfREVDUkVGKGZvYik7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9maW5kX21vZHVsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlQeU9iamVjdCAqcGF0aCA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfE86ZmluZF9tb2R1bGUiLCAmbmFtZSwgJnBhdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gY2FsbF9maW5kX21vZHVsZShuYW1lLCBwYXRoKTsKKyAgICBjaGFyICpuYW1lOworICAgIFB5T2JqZWN0ICpwYXRoID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8TzpmaW5kX21vZHVsZSIsICZuYW1lLCAmcGF0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBjYWxsX2ZpbmRfbW9kdWxlKG5hbWUsIHBhdGgpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2luaXRfYnVpbHRpbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlpbnQgcmV0OwotCVB5T2JqZWN0ICptOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbml0X2J1aWx0aW4iLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCXJldCA9IGluaXRfYnVpbHRpbihuYW1lKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCW0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSk7Ci0JUHlfWElOQ1JFRihtKTsKLQlyZXR1cm4gbTsKKyAgICBjaGFyICpuYW1lOworICAgIGludCByZXQ7CisgICAgUHlPYmplY3QgKm07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmluaXRfYnVpbHRpbiIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0ID0gaW5pdF9idWlsdGluKG5hbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgbSA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKTsKKyAgICBQeV9YSU5DUkVGKG0pOworICAgIHJldHVybiBtOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2luaXRfZnJvemVuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWludCByZXQ7Ci0JUHlPYmplY3QgKm07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmluaXRfZnJvemVuIiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXQgPSBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUobmFtZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChyZXQgPT0gMCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOwotCVB5X1hJTkNSRUYobSk7Ci0JcmV0dXJuIG07CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgcmV0OworICAgIFB5T2JqZWN0ICptOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppbml0X2Zyb3plbiIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0ID0gUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlKG5hbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgbSA9IFB5SW1wb3J0X0FkZE1vZHVsZShuYW1lKTsKKyAgICBQeV9YSU5DUkVGKG0pOworICAgIHJldHVybiBtOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2dldF9mcm96ZW5fb2JqZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOworICAgIGNoYXIgKm5hbWU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0X2Zyb3plbl9vYmplY3QiLCAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBnZXRfZnJvemVuX29iamVjdChuYW1lKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Z2V0X2Zyb3plbl9vYmplY3QiLCAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBnZXRfZnJvemVuX29iamVjdChuYW1lKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9pc19idWlsdGluKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczppc19idWlsdGluIiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoaXNfYnVpbHRpbihuYW1lKSk7CisgICAgY2hhciAqbmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aXNfYnVpbHRpbiIsICZuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGlzX2J1aWx0aW4obmFtZSkpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2lzX2Zyb3plbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3QgX2Zyb3plbiAqcDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aXNfZnJvemVuIiwgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlwID0gZmluZF9mcm96ZW4obmFtZSk7Ci0JcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykgKHAgPT0gTlVMTCA/IDAgOiBwLT5zaXplKSk7CisgICAgY2hhciAqbmFtZTsKKyAgICBzdHJ1Y3QgX2Zyb3plbiAqcDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6aXNfZnJvemVuIiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwID0gZmluZF9mcm96ZW4obmFtZSk7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZykgKHAgPT0gTlVMTCA/IDAgOiBwLT5zaXplKSk7CiB9CiAKIHN0YXRpYyBGSUxFICoKIGdldF9maWxlKGNoYXIgKnBhdGhuYW1lLCBQeU9iamVjdCAqZm9iLCBjaGFyICptb2RlKQogewotCUZJTEUgKmZwOwotCWlmIChmb2IgPT0gTlVMTCkgewotCQlpZiAobW9kZVswXSA9PSAnVScpCi0JCQltb2RlID0gInIiIFBZX1NURElPVEVYVE1PREU7Ci0JCWZwID0gZm9wZW4ocGF0aG5hbWUsIG1vZGUpOwotCQlpZiAoZnAgPT0gTlVMTCkKLQkJCVB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKLQl9Ci0JZWxzZSB7Ci0JCWZwID0gUHlGaWxlX0FzRmlsZShmb2IpOwotCQlpZiAoZnAgPT0gTlVMTCkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkiYmFkL2Nsb3NlZCBmaWxlIG9iamVjdCIpOwotCX0KLQlyZXR1cm4gZnA7CisgICAgRklMRSAqZnA7CisgICAgaWYgKGZvYiA9PSBOVUxMKSB7CisgICAgICAgIGlmIChtb2RlWzBdID09ICdVJykKKyAgICAgICAgICAgIG1vZGUgPSAiciIgUFlfU1RESU9URVhUTU9ERTsKKyAgICAgICAgZnAgPSBmb3BlbihwYXRobmFtZSwgbW9kZSk7CisgICAgICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZnAgPSBQeUZpbGVfQXNGaWxlKGZvYik7CisgICAgICAgIGlmIChmcCA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZC9jbG9zZWQgZmlsZSBvYmplY3QiKTsKKyAgICB9CisgICAgcmV0dXJuIGZwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2xvYWRfY29tcGlsZWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqcGF0aG5hbWU7Ci0JUHlPYmplY3QgKmZvYiA9IE5VTEw7Ci0JUHlPYmplY3QgKm07Ci0JRklMRSAqZnA7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xPITpsb2FkX2NvbXBpbGVkIiwgJm5hbWUsICZwYXRobmFtZSwKLQkJCSAgICAgICZQeUZpbGVfVHlwZSwgJmZvYikpCi0JCXJldHVybiBOVUxMOwotCWZwID0gZ2V0X2ZpbGUocGF0aG5hbWUsIGZvYiwgInJiIik7Ci0JaWYgKGZwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW0gPSBsb2FkX2NvbXBpbGVkX21vZHVsZShuYW1lLCBwYXRobmFtZSwgZnApOwotCWlmIChmb2IgPT0gTlVMTCkKLQkJZmNsb3NlKGZwKTsKLQlyZXR1cm4gbTsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKnBhdGhuYW1lOworICAgIFB5T2JqZWN0ICpmb2IgPSBOVUxMOworICAgIFB5T2JqZWN0ICptOworICAgIEZJTEUgKmZwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3N8TyE6bG9hZF9jb21waWxlZCIsICZuYW1lLCAmcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUZpbGVfVHlwZSwgJmZvYikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZwID0gZ2V0X2ZpbGUocGF0aG5hbWUsIGZvYiwgInJiIik7CisgICAgaWYgKGZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG0gPSBsb2FkX2NvbXBpbGVkX21vZHVsZShuYW1lLCBwYXRobmFtZSwgZnApOworICAgIGlmIChmb2IgPT0gTlVMTCkKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gbTsKIH0KIAogI2lmZGVmIEhBVkVfRFlOQU1JQ19MT0FESU5HCkBAIC0yOTc4LDIxICsyOTc4LDIxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX2xvYWRfZHluYW1pYyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQljaGFyICpwYXRobmFtZTsKLQlQeU9iamVjdCAqZm9iID0gTlVMTDsKLQlQeU9iamVjdCAqbTsKLQlGSUxFICpmcCA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzc3xPITpsb2FkX2R5bmFtaWMiLCAmbmFtZSwgJnBhdGhuYW1lLAotCQkJICAgICAgJlB5RmlsZV9UeXBlLCAmZm9iKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGZvYikgewotCQlmcCA9IGdldF9maWxlKHBhdGhuYW1lLCBmb2IsICJyIik7Ci0JCWlmIChmcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCW0gPSBfUHlJbXBvcnRfTG9hZER5bmFtaWNNb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKLQlyZXR1cm4gbTsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKnBhdGhuYW1lOworICAgIFB5T2JqZWN0ICpmb2IgPSBOVUxMOworICAgIFB5T2JqZWN0ICptOworICAgIEZJTEUgKmZwID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzfE8hOmxvYWRfZHluYW1pYyIsICZuYW1lLCAmcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZQeUZpbGVfVHlwZSwgJmZvYikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChmb2IpIHsKKyAgICAgICAgZnAgPSBnZXRfZmlsZShwYXRobmFtZSwgZm9iLCAiciIpOworICAgICAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtID0gX1B5SW1wb3J0X0xvYWREeW5hbWljTW9kdWxlKG5hbWUsIHBhdGhuYW1lLCBmcCk7CisgICAgcmV0dXJuIG07CiB9CiAKICNlbmRpZiAvKiBIQVZFX0RZTkFNSUNfTE9BRElORyAqLwpAQCAtMzAwMCw4NyArMzAwMCw4NyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGltcF9sb2FkX3NvdXJjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQljaGFyICpwYXRobmFtZTsKLQlQeU9iamVjdCAqZm9iID0gTlVMTDsKLQlQeU9iamVjdCAqbTsKLQlGSUxFICpmcDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzfE8hOmxvYWRfc291cmNlIiwgJm5hbWUsICZwYXRobmFtZSwKLQkJCSAgICAgICZQeUZpbGVfVHlwZSwgJmZvYikpCi0JCXJldHVybiBOVUxMOwotCWZwID0gZ2V0X2ZpbGUocGF0aG5hbWUsIGZvYiwgInIiKTsKLQlpZiAoZnAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JbSA9IGxvYWRfc291cmNlX21vZHVsZShuYW1lLCBwYXRobmFtZSwgZnApOwotCWlmIChmb2IgPT0gTlVMTCkKLQkJZmNsb3NlKGZwKTsKLQlyZXR1cm4gbTsKKyAgICBjaGFyICpuYW1lOworICAgIGNoYXIgKnBhdGhuYW1lOworICAgIFB5T2JqZWN0ICpmb2IgPSBOVUxMOworICAgIFB5T2JqZWN0ICptOworICAgIEZJTEUgKmZwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3N8TyE6bG9hZF9zb3VyY2UiLCAmbmFtZSwgJnBhdGhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlGaWxlX1R5cGUsICZmb2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmcCA9IGdldF9maWxlKHBhdGhuYW1lLCBmb2IsICJyIik7CisgICAgaWYgKGZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG0gPSBsb2FkX3NvdXJjZV9tb2R1bGUobmFtZSwgcGF0aG5hbWUsIGZwKTsKKyAgICBpZiAoZm9iID09IE5VTEwpCisgICAgICAgIGZjbG9zZShmcCk7CisgICAgcmV0dXJuIG07CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfbG9hZF9tb2R1bGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKm5hbWU7Ci0JUHlPYmplY3QgKmZvYjsKLQljaGFyICpwYXRobmFtZTsKLQljaGFyICpzdWZmaXg7IC8qIFVudXNlZCAqLwotCWNoYXIgKm1vZGU7Ci0JaW50IHR5cGU7Ci0JRklMRSAqZnA7CisgICAgY2hhciAqbmFtZTsKKyAgICBQeU9iamVjdCAqZm9iOworICAgIGNoYXIgKnBhdGhuYW1lOworICAgIGNoYXIgKnN1ZmZpeDsgLyogVW51c2VkICovCisgICAgY2hhciAqbW9kZTsKKyAgICBpbnQgdHlwZTsKKyAgICBGSUxFICpmcDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic09zKHNzaSk6bG9hZF9tb2R1bGUiLAotCQkJICAgICAgJm5hbWUsICZmb2IsICZwYXRobmFtZSwKLQkJCSAgICAgICZzdWZmaXgsICZtb2RlLCAmdHlwZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgqbW9kZSkgewotCQkvKiBNb2RlIG11c3Qgc3RhcnQgd2l0aCAncicgb3IgJ1UnIGFuZCBtdXN0IG5vdCBjb250YWluICcrJy4KLQkJICAgSW1wbGljaXQgaW4gdGhpcyB0ZXN0IGlzIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIG1vZGUKLQkJICAgbWF5IGNvbnRhaW4gb3RoZXIgbW9kaWZpZXJzIGxpa2UgJ2InIG9yICd0Jy4gKi8KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPcyhzc2kpOmxvYWRfbW9kdWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsICZmb2IsICZwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1ZmZpeCwgJm1vZGUsICZ0eXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCptb2RlKSB7CisgICAgICAgIC8qIE1vZGUgbXVzdCBzdGFydCB3aXRoICdyJyBvciAnVScgYW5kIG11c3Qgbm90IGNvbnRhaW4gJysnLgorICAgICAgICAgICBJbXBsaWNpdCBpbiB0aGlzIHRlc3QgaXMgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgbW9kZQorICAgICAgICAgICBtYXkgY29udGFpbiBvdGhlciBtb2RpZmllcnMgbGlrZSAnYicgb3IgJ3QnLiAqLwogCi0JCWlmICghKCptb2RlID09ICdyJyB8fCAqbW9kZSA9PSAnVScpIHx8IHN0cmNocihtb2RlLCAnKycpKSB7Ci0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkgICAgICJpbnZhbGlkIGZpbGUgb3BlbiBtb2RlICUuMjAwcyIsIG1vZGUpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKGZvYiA9PSBQeV9Ob25lKQotCQlmcCA9IE5VTEw7Ci0JZWxzZSB7Ci0JCWlmICghUHlGaWxlX0NoZWNrKGZvYikpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCSJsb2FkX21vZHVsZSBhcmcjMiBzaG91bGQgYmUgYSBmaWxlIG9yIE5vbmUiKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWZwID0gZ2V0X2ZpbGUocGF0aG5hbWUsIGZvYiwgbW9kZSk7Ci0JCWlmIChmcCA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBsb2FkX21vZHVsZShuYW1lLCBmcCwgcGF0aG5hbWUsIHR5cGUsIE5VTEwpOworICAgICAgICBpZiAoISgqbW9kZSA9PSAncicgfHwgKm1vZGUgPT0gJ1UnKSB8fCBzdHJjaHIobW9kZSwgJysnKSkgeworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZmlsZSBvcGVuIG1vZGUgJS4yMDBzIiwgbW9kZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZm9iID09IFB5X05vbmUpCisgICAgICAgIGZwID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUZpbGVfQ2hlY2soZm9iKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImxvYWRfbW9kdWxlIGFyZyMyIHNob3VsZCBiZSBhIGZpbGUgb3IgTm9uZSIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZnAgPSBnZXRfZmlsZShwYXRobmFtZSwgZm9iLCBtb2RlKTsKKyAgICAgICAgaWYgKGZwID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGxvYWRfbW9kdWxlKG5hbWUsIGZwLCBwYXRobmFtZSwgdHlwZSwgTlVMTCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfbG9hZF9wYWNrYWdlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpuYW1lOwotCWNoYXIgKnBhdGhuYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6bG9hZF9wYWNrYWdlIiwgJm5hbWUsICZwYXRobmFtZSkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBsb2FkX3BhY2thZ2UobmFtZSwgcGF0aG5hbWUpOworICAgIGNoYXIgKm5hbWU7CisgICAgY2hhciAqcGF0aG5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpsb2FkX3BhY2thZ2UiLCAmbmFtZSwgJnBhdGhuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGxvYWRfcGFja2FnZShuYW1lLCBwYXRobmFtZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbXBfbmV3X21vZHVsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqbmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6bmV3X21vZHVsZSIsICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TW9kdWxlX05ldyhuYW1lKTsKKyAgICBjaGFyICpuYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpuZXdfbW9kdWxlIiwgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlNb2R1bGVfTmV3KG5hbWUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogaW1wX3JlbG9hZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYpCiB7Ci0JcmV0dXJuIFB5SW1wb3J0X1JlbG9hZE1vZHVsZSh2KTsKKyAgICByZXR1cm4gUHlJbXBvcnRfUmVsb2FkTW9kdWxlKHYpOwogfQogCiAKQEAgLTMxMzksNDAgKzMxMzksNDAgQEAKIE9uIHBsYXRmb3JtcyB3aXRob3V0IHRocmVhZHMsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLiIpOwogCiBzdGF0aWMgUHlNZXRob2REZWYgaW1wX21ldGhvZHNbXSA9IHsKLQl7InJlbG9hZCIsCSBpbXBfcmVsb2FkLAkgICBNRVRIX08sCSBkb2NfcmVsb2FkfSwKLQl7ImZpbmRfbW9kdWxlIiwJIGltcF9maW5kX21vZHVsZSwgIE1FVEhfVkFSQVJHUywgZG9jX2ZpbmRfbW9kdWxlfSwKLQl7ImdldF9tYWdpYyIsCSBpbXBfZ2V0X21hZ2ljLAkgICBNRVRIX05PQVJHUywgIGRvY19nZXRfbWFnaWN9LAotCXsiZ2V0X3N1ZmZpeGVzIiwgaW1wX2dldF9zdWZmaXhlcywgTUVUSF9OT0FSR1MsICBkb2NfZ2V0X3N1ZmZpeGVzfSwKLQl7ImxvYWRfbW9kdWxlIiwJIGltcF9sb2FkX21vZHVsZSwgIE1FVEhfVkFSQVJHUywgZG9jX2xvYWRfbW9kdWxlfSwKLQl7Im5ld19tb2R1bGUiLAkgaW1wX25ld19tb2R1bGUsICAgTUVUSF9WQVJBUkdTLCBkb2NfbmV3X21vZHVsZX0sCi0JeyJsb2NrX2hlbGQiLAkgaW1wX2xvY2tfaGVsZCwJICAgTUVUSF9OT0FSR1MsICBkb2NfbG9ja19oZWxkfSwKLQl7ImFjcXVpcmVfbG9jayIsIGltcF9hY3F1aXJlX2xvY2ssIE1FVEhfTk9BUkdTLCAgZG9jX2FjcXVpcmVfbG9ja30sCi0JeyJyZWxlYXNlX2xvY2siLCBpbXBfcmVsZWFzZV9sb2NrLCBNRVRIX05PQVJHUywgIGRvY19yZWxlYXNlX2xvY2t9LAotCS8qIFRoZSByZXN0IGFyZSBvYnNvbGV0ZSAqLwotCXsiZ2V0X2Zyb3plbl9vYmplY3QiLAlpbXBfZ2V0X2Zyb3plbl9vYmplY3QsCU1FVEhfVkFSQVJHU30sCi0JeyJpbml0X2J1aWx0aW4iLAlpbXBfaW5pdF9idWlsdGluLAlNRVRIX1ZBUkFSR1N9LAotCXsiaW5pdF9mcm96ZW4iLAkJaW1wX2luaXRfZnJvemVuLAlNRVRIX1ZBUkFSR1N9LAotCXsiaXNfYnVpbHRpbiIsCQlpbXBfaXNfYnVpbHRpbiwJCU1FVEhfVkFSQVJHU30sCi0JeyJpc19mcm96ZW4iLAkJaW1wX2lzX2Zyb3plbiwJCU1FVEhfVkFSQVJHU30sCi0JeyJsb2FkX2NvbXBpbGVkIiwJaW1wX2xvYWRfY29tcGlsZWQsCU1FVEhfVkFSQVJHU30sCisgICAgeyJyZWxvYWQiLCAgICAgICAgICAgaW1wX3JlbG9hZCwgICAgICAgTUVUSF9PLCAgICAgICBkb2NfcmVsb2FkfSwKKyAgICB7ImZpbmRfbW9kdWxlIiwgICAgICBpbXBfZmluZF9tb2R1bGUsICBNRVRIX1ZBUkFSR1MsIGRvY19maW5kX21vZHVsZX0sCisgICAgeyJnZXRfbWFnaWMiLCAgICAgICAgaW1wX2dldF9tYWdpYywgICAgTUVUSF9OT0FSR1MsICBkb2NfZ2V0X21hZ2ljfSwKKyAgICB7ImdldF9zdWZmaXhlcyIsIGltcF9nZXRfc3VmZml4ZXMsIE1FVEhfTk9BUkdTLCAgZG9jX2dldF9zdWZmaXhlc30sCisgICAgeyJsb2FkX21vZHVsZSIsICAgICAgaW1wX2xvYWRfbW9kdWxlLCAgTUVUSF9WQVJBUkdTLCBkb2NfbG9hZF9tb2R1bGV9LAorICAgIHsibmV3X21vZHVsZSIsICAgICAgIGltcF9uZXdfbW9kdWxlLCAgIE1FVEhfVkFSQVJHUywgZG9jX25ld19tb2R1bGV9LAorICAgIHsibG9ja19oZWxkIiwgICAgICAgIGltcF9sb2NrX2hlbGQsICAgIE1FVEhfTk9BUkdTLCAgZG9jX2xvY2tfaGVsZH0sCisgICAgeyJhY3F1aXJlX2xvY2siLCBpbXBfYWNxdWlyZV9sb2NrLCBNRVRIX05PQVJHUywgIGRvY19hY3F1aXJlX2xvY2t9LAorICAgIHsicmVsZWFzZV9sb2NrIiwgaW1wX3JlbGVhc2VfbG9jaywgTUVUSF9OT0FSR1MsICBkb2NfcmVsZWFzZV9sb2NrfSwKKyAgICAvKiBUaGUgcmVzdCBhcmUgb2Jzb2xldGUgKi8KKyAgICB7ImdldF9mcm96ZW5fb2JqZWN0IiwgICAgICAgaW1wX2dldF9mcm96ZW5fb2JqZWN0LCAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImluaXRfYnVpbHRpbiIsICAgICAgICAgICAgaW1wX2luaXRfYnVpbHRpbiwgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImluaXRfZnJvemVuIiwgICAgICAgICAgICAgaW1wX2luaXRfZnJvemVuLCAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImlzX2J1aWx0aW4iLCAgICAgICAgICAgICAgaW1wX2lzX2J1aWx0aW4sICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImlzX2Zyb3plbiIsICAgICAgICAgICAgICAgaW1wX2lzX2Zyb3plbiwgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImxvYWRfY29tcGlsZWQiLCAgICAgICAgICAgaW1wX2xvYWRfY29tcGlsZWQsICAgICAgTUVUSF9WQVJBUkdTfSwKICNpZmRlZiBIQVZFX0RZTkFNSUNfTE9BRElORwotCXsibG9hZF9keW5hbWljIiwJaW1wX2xvYWRfZHluYW1pYywJTUVUSF9WQVJBUkdTfSwKKyAgICB7ImxvYWRfZHluYW1pYyIsICAgICAgICAgICAgaW1wX2xvYWRfZHluYW1pYywgICAgICAgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgotCXsibG9hZF9wYWNrYWdlIiwJaW1wX2xvYWRfcGFja2FnZSwJTUVUSF9WQVJBUkdTfSwKLQl7ImxvYWRfc291cmNlIiwJCWltcF9sb2FkX3NvdXJjZSwJTUVUSF9WQVJBUkdTfSwKLQl7TlVMTCwJCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7ImxvYWRfcGFja2FnZSIsICAgICAgICAgICAgaW1wX2xvYWRfcGFja2FnZSwgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImxvYWRfc291cmNlIiwgICAgICAgICAgICAgaW1wX2xvYWRfc291cmNlLCAgICAgICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgaW50CiBzZXRpbnQoUHlPYmplY3QgKmQsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSkKIHsKLQlQeU9iamVjdCAqdjsKLQlpbnQgZXJyOworICAgIFB5T2JqZWN0ICp2OworICAgIGludCBlcnI7CiAKLQl2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdmFsdWUpOwotCWVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpOwotCVB5X1hERUNSRUYodik7Ci0JcmV0dXJuIGVycjsKKyAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdmFsdWUpOworICAgIGVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG5hbWUsIHYpOworICAgIFB5X1hERUNSRUYodik7CisgICAgcmV0dXJuIGVycjsKIH0KIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMzE4MiwxNTUgKzMxODIsMTU1IEBACiBzdGF0aWMgaW50CiBOdWxsSW1wb3J0ZXJfaW5pdChOdWxsSW1wb3J0ZXIgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQljaGFyICpwYXRoOwotCVB5X3NzaXplX3QgcGF0aGxlbjsKKyAgICBjaGFyICpwYXRoOworICAgIFB5X3NzaXplX3QgcGF0aGxlbjsKIAotCWlmICghX1B5QXJnX05vS2V5d29yZHMoIk51bGxJbXBvcnRlcigpIiwga3dkcykpCi0JCXJldHVybiAtMTsKKyAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKCJOdWxsSW1wb3J0ZXIoKSIsIGt3ZHMpKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6TnVsbEltcG9ydGVyIiwKLQkJCSAgICAgICZwYXRoKSkKLQkJcmV0dXJuIC0xOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpOdWxsSW1wb3J0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCkpCisgICAgICAgIHJldHVybiAtMTsKIAotCXBhdGhsZW4gPSBzdHJsZW4ocGF0aCk7Ci0JaWYgKHBhdGhsZW4gPT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJlbXB0eSBwYXRobmFtZSIpOwotCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKKyAgICBwYXRobGVuID0gc3RybGVuKHBhdGgpOworICAgIGlmIChwYXRobGVuID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiZW1wdHkgcGF0aG5hbWUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CiAjaWZuZGVmIFJJU0NPUwogI2lmbmRlZiBNU19XSU5ET1dTCi0JCXN0cnVjdCBzdGF0IHN0YXRidWY7Ci0JCWludCBydjsKKyAgICAgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyAgICAgICAgaW50IHJ2OwogCi0JCXJ2ID0gc3RhdChwYXRoLCAmc3RhdGJ1Zik7Ci0JCWlmIChydiA9PSAwKSB7Ci0JCQkvKiBpdCBleGlzdHMgKi8KLQkJCWlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKLQkJCQkvKiBpdCdzIGEgZGlyZWN0b3J5ICovCi0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCQkJImV4aXN0aW5nIGRpcmVjdG9yeSIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQorICAgICAgICBydiA9IHN0YXQocGF0aCwgJnN0YXRidWYpOworICAgICAgICBpZiAocnYgPT0gMCkgeworICAgICAgICAgICAgLyogaXQgZXhpc3RzICovCisgICAgICAgICAgICBpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7CisgICAgICAgICAgICAgICAgLyogaXQncyBhIGRpcmVjdG9yeSAqLworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGRpcmVjdG9yeSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2Vsc2UgLyogTVNfV0lORE9XUyAqLwotCQlEV09SRCBydjsKLQkJLyogc2VlIGlzc3VlMTI5MyBhbmQgaXNzdWUzNjc3OgotCQkgKiBzdGF0KCkgb24gV2luZG93cyBkb2Vzbid0IHJlY29nbmlzZSBwYXRocyBsaWtlCi0JCSAqICJlOlxcc2hhcmVkXFwiIGFuZCAiXFxcXHdoaXRlcmFiLWMyem5saFxcc2hhcmVkIiBhcyBkaXJzLgotCQkgKi8KLQkJcnYgPSBHZXRGaWxlQXR0cmlidXRlc0EocGF0aCk7Ci0JCWlmIChydiAhPSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUykgewotCQkJLyogaXQgZXhpc3RzICovCi0JCQlpZiAocnYgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpIHsKLQkJCQkvKiBpdCdzIGEgZGlyZWN0b3J5ICovCi0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCQkJImV4aXN0aW5nIGRpcmVjdG9yeSIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQorICAgICAgICBEV09SRCBydjsKKyAgICAgICAgLyogc2VlIGlzc3VlMTI5MyBhbmQgaXNzdWUzNjc3OgorICAgICAgICAgKiBzdGF0KCkgb24gV2luZG93cyBkb2Vzbid0IHJlY29nbmlzZSBwYXRocyBsaWtlCisgICAgICAgICAqICJlOlxcc2hhcmVkXFwiIGFuZCAiXFxcXHdoaXRlcmFiLWMyem5saFxcc2hhcmVkIiBhcyBkaXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcnYgPSBHZXRGaWxlQXR0cmlidXRlc0EocGF0aCk7CisgICAgICAgIGlmIChydiAhPSBJTlZBTElEX0ZJTEVfQVRUUklCVVRFUykgeworICAgICAgICAgICAgLyogaXQgZXhpc3RzICovCisgICAgICAgICAgICBpZiAocnYgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpIHsKKyAgICAgICAgICAgICAgICAvKiBpdCdzIGEgZGlyZWN0b3J5ICovCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhpc3RpbmcgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKICNlbHNlIC8qIFJJU0NPUyAqLwotCQlpZiAob2JqZWN0X2V4aXN0cyhwYXRoKSkgewotCQkJLyogaXQgZXhpc3RzICovCi0JCQlpZiAoaXNkaXIocGF0aCkpIHsKLQkJCQkvKiBpdCdzIGEgZGlyZWN0b3J5ICovCi0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAotCQkJCQkJImV4aXN0aW5nIGRpcmVjdG9yeSIpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQorICAgICAgICBpZiAob2JqZWN0X2V4aXN0cyhwYXRoKSkgeworICAgICAgICAgICAgLyogaXQgZXhpc3RzICovCisgICAgICAgICAgICBpZiAoaXNkaXIocGF0aCkpIHsKKyAgICAgICAgICAgICAgICAvKiBpdCdzIGEgZGlyZWN0b3J5ICovCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhpc3RpbmcgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKLQl9Ci0JcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogTnVsbEltcG9ydGVyX2ZpbmRfbW9kdWxlKE51bGxJbXBvcnRlciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlfUkVUVVJOX05PTkU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBOdWxsSW1wb3J0ZXJfbWV0aG9kc1tdID0gewotCXsiZmluZF9tb2R1bGUiLCAoUHlDRnVuY3Rpb24pTnVsbEltcG9ydGVyX2ZpbmRfbW9kdWxlLCBNRVRIX1ZBUkFSR1MsCi0JICJBbHdheXMgcmV0dXJuIE5vbmUiCi0JfSwKLQl7TlVMTH0gIC8qIFNlbnRpbmVsICovCisgICAgeyJmaW5kX21vZHVsZSIsIChQeUNGdW5jdGlvbilOdWxsSW1wb3J0ZXJfZmluZF9tb2R1bGUsIE1FVEhfVkFSQVJHUywKKyAgICAgIkFsd2F5cyByZXR1cm4gTm9uZSIKKyAgICB9LAorICAgIHtOVUxMfSAgLyogU2VudGluZWwgKi8KIH07CiAKIAogUHlUeXBlT2JqZWN0IFB5TnVsbEltcG9ydGVyX1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCi0JImltcC5OdWxsSW1wb3J0ZXIiLCAgICAgICAgLyp0cF9uYW1lKi8KLQlzaXplb2YoTnVsbEltcG9ydGVyKSwgICAgICAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAvKnRwX2ZsYWdzKi8KLQkiTnVsbCBpbXBvcnRlciBvYmplY3QiLCAgICAvKiB0cF9kb2MgKi8KLQkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KLQkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwotCTAsCSAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwotCU51bGxJbXBvcnRlcl9tZXRob2RzLCAgICAgIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCi0JMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwotCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCi0JKGluaXRwcm9jKU51bGxJbXBvcnRlcl9pbml0LCAgICAgIC8qIHRwX2luaXQgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotCVB5VHlwZV9HZW5lcmljTmV3ICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJpbXAuTnVsbEltcG9ydGVyIiwgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKE51bGxJbXBvcnRlciksICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgLyp0cF9mbGFncyovCisgICAgIk51bGwgaW1wb3J0ZXIgb2JqZWN0IiwgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICBOdWxsSW1wb3J0ZXJfbWV0aG9kcywgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIChpbml0cHJvYylOdWxsSW1wb3J0ZXJfaW5pdCwgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICBQeVR5cGVfR2VuZXJpY05ldyAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIAogUHlNT0RJTklUX0ZVTkMKIGluaXRpbXAodm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JaWYgKFB5VHlwZV9SZWFkeSgmUHlOdWxsSW1wb3J0ZXJfVHlwZSkgPCAwKQotCQlnb3RvIGZhaWx1cmU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmUHlOdWxsSW1wb3J0ZXJfVHlwZSkgPCAwKQorICAgICAgICBnb3RvIGZhaWx1cmU7CiAKLQltID0gUHlfSW5pdE1vZHVsZTQoImltcCIsIGltcF9tZXRob2RzLCBkb2NfaW1wLAotCQkJICAgTlVMTCwgUFlUSE9OX0FQSV9WRVJTSU9OKTsKLQlpZiAobSA9PSBOVUxMKQotCQlnb3RvIGZhaWx1cmU7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JaWYgKGQgPT0gTlVMTCkKLQkJZ290byBmYWlsdXJlOworICAgIG0gPSBQeV9Jbml0TW9kdWxlNCgiaW1wIiwgaW1wX21ldGhvZHMsIGRvY19pbXAsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsdXJlOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGlmIChkID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbHVyZTsKIAotCWlmIChzZXRpbnQoZCwgIlNFQVJDSF9FUlJPUiIsIFNFQVJDSF9FUlJPUikgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiUFlfU09VUkNFIiwgUFlfU09VUkNFKSA8IDApIGdvdG8gZmFpbHVyZTsKLQlpZiAoc2V0aW50KGQsICJQWV9DT01QSUxFRCIsIFBZX0NPTVBJTEVEKSA8IDApIGdvdG8gZmFpbHVyZTsKLQlpZiAoc2V0aW50KGQsICJDX0VYVEVOU0lPTiIsIENfRVhURU5TSU9OKSA8IDApIGdvdG8gZmFpbHVyZTsKLQlpZiAoc2V0aW50KGQsICJQWV9SRVNPVVJDRSIsIFBZX1JFU09VUkNFKSA8IDApIGdvdG8gZmFpbHVyZTsKLQlpZiAoc2V0aW50KGQsICJQS0dfRElSRUNUT1JZIiwgUEtHX0RJUkVDVE9SWSkgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiQ19CVUlMVElOIiwgQ19CVUlMVElOKSA8IDApIGdvdG8gZmFpbHVyZTsKLQlpZiAoc2V0aW50KGQsICJQWV9GUk9aRU4iLCBQWV9GUk9aRU4pIDwgMCkgZ290byBmYWlsdXJlOwotCWlmIChzZXRpbnQoZCwgIlBZX0NPREVSRVNPVVJDRSIsIFBZX0NPREVSRVNPVVJDRSkgPCAwKSBnb3RvIGZhaWx1cmU7Ci0JaWYgKHNldGludChkLCAiSU1QX0hPT0siLCBJTVBfSE9PSykgPCAwKSBnb3RvIGZhaWx1cmU7CisgICAgaWYgKHNldGludChkLCAiU0VBUkNIX0VSUk9SIiwgU0VBUkNIX0VSUk9SKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJQWV9TT1VSQ0UiLCBQWV9TT1VSQ0UpIDwgMCkgZ290byBmYWlsdXJlOworICAgIGlmIChzZXRpbnQoZCwgIlBZX0NPTVBJTEVEIiwgUFlfQ09NUElMRUQpIDwgMCkgZ290byBmYWlsdXJlOworICAgIGlmIChzZXRpbnQoZCwgIkNfRVhURU5TSU9OIiwgQ19FWFRFTlNJT04pIDwgMCkgZ290byBmYWlsdXJlOworICAgIGlmIChzZXRpbnQoZCwgIlBZX1JFU09VUkNFIiwgUFlfUkVTT1VSQ0UpIDwgMCkgZ290byBmYWlsdXJlOworICAgIGlmIChzZXRpbnQoZCwgIlBLR19ESVJFQ1RPUlkiLCBQS0dfRElSRUNUT1JZKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJDX0JVSUxUSU4iLCBDX0JVSUxUSU4pIDwgMCkgZ290byBmYWlsdXJlOworICAgIGlmIChzZXRpbnQoZCwgIlBZX0ZST1pFTiIsIFBZX0ZST1pFTikgPCAwKSBnb3RvIGZhaWx1cmU7CisgICAgaWYgKHNldGludChkLCAiUFlfQ09ERVJFU09VUkNFIiwgUFlfQ09ERVJFU09VUkNFKSA8IDApIGdvdG8gZmFpbHVyZTsKKyAgICBpZiAoc2V0aW50KGQsICJJTVBfSE9PSyIsIElNUF9IT09LKSA8IDApIGdvdG8gZmFpbHVyZTsKIAotCVB5X0lOQ1JFRigmUHlOdWxsSW1wb3J0ZXJfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJOdWxsSW1wb3J0ZXIiLCAoUHlPYmplY3QgKikmUHlOdWxsSW1wb3J0ZXJfVHlwZSk7CisgICAgUHlfSU5DUkVGKCZQeU51bGxJbXBvcnRlcl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk51bGxJbXBvcnRlciIsIChQeU9iamVjdCAqKSZQeU51bGxJbXBvcnRlcl9UeXBlKTsKICAgZmFpbHVyZToKLQk7CisgICAgOwogfQogCiAKQEAgLTMzNDQsMzEgKzMzNDQsMzEgQEAKIGludAogUHlJbXBvcnRfRXh0ZW5kSW5pdHRhYihzdHJ1Y3QgX2luaXR0YWIgKm5ld3RhYikKIHsKLQlzdGF0aWMgc3RydWN0IF9pbml0dGFiICpvdXJfY29weSA9IE5VTEw7Ci0Jc3RydWN0IF9pbml0dGFiICpwOwotCWludCBpLCBuOworICAgIHN0YXRpYyBzdHJ1Y3QgX2luaXR0YWIgKm91cl9jb3B5ID0gTlVMTDsKKyAgICBzdHJ1Y3QgX2luaXR0YWIgKnA7CisgICAgaW50IGksIG47CiAKLQkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYm90aCB0YWJsZXMgKi8KLQlmb3IgKG4gPSAwOyBuZXd0YWJbbl0ubmFtZSAhPSBOVUxMOyBuKyspCi0JCTsKLQlpZiAobiA9PSAwKQotCQlyZXR1cm4gMDsgLyogTm90aGluZyB0byBkbyAqLwotCWZvciAoaSA9IDA7IFB5SW1wb3J0X0luaXR0YWJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCTsKKyAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYm90aCB0YWJsZXMgKi8KKyAgICBmb3IgKG4gPSAwOyBuZXd0YWJbbl0ubmFtZSAhPSBOVUxMOyBuKyspCisgICAgICAgIDsKKyAgICBpZiAobiA9PSAwKQorICAgICAgICByZXR1cm4gMDsgLyogTm90aGluZyB0byBkbyAqLworICAgIGZvciAoaSA9IDA7IFB5SW1wb3J0X0luaXR0YWJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgIDsKIAotCS8qIEFsbG9jYXRlIG5ldyBtZW1vcnkgZm9yIHRoZSBjb21iaW5lZCB0YWJsZSAqLwotCXAgPSBvdXJfY29weTsKLQlQeU1lbV9SRVNJWkUocCwgc3RydWN0IF9pbml0dGFiLCBpK24rMSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIC8qIEFsbG9jYXRlIG5ldyBtZW1vcnkgZm9yIHRoZSBjb21iaW5lZCB0YWJsZSAqLworICAgIHAgPSBvdXJfY29weTsKKyAgICBQeU1lbV9SRVNJWkUocCwgc3RydWN0IF9pbml0dGFiLCBpK24rMSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOwogCi0JLyogQ29weSB0aGUgdGFibGVzIGludG8gdGhlIG5ldyBtZW1vcnkgKi8KLQlpZiAob3VyX2NvcHkgIT0gUHlJbXBvcnRfSW5pdHRhYikKLQkJbWVtY3B5KHAsIFB5SW1wb3J0X0luaXR0YWIsIChpKzEpICogc2l6ZW9mKHN0cnVjdCBfaW5pdHRhYikpOwotCVB5SW1wb3J0X0luaXR0YWIgPSBvdXJfY29weSA9IHA7Ci0JbWVtY3B5KHAraSwgbmV3dGFiLCAobisxKSAqIHNpemVvZihzdHJ1Y3QgX2luaXR0YWIpKTsKKyAgICAvKiBDb3B5IHRoZSB0YWJsZXMgaW50byB0aGUgbmV3IG1lbW9yeSAqLworICAgIGlmIChvdXJfY29weSAhPSBQeUltcG9ydF9Jbml0dGFiKQorICAgICAgICBtZW1jcHkocCwgUHlJbXBvcnRfSW5pdHRhYiwgKGkrMSkgKiBzaXplb2Yoc3RydWN0IF9pbml0dGFiKSk7CisgICAgUHlJbXBvcnRfSW5pdHRhYiA9IG91cl9jb3B5ID0gcDsKKyAgICBtZW1jcHkocCtpLCBuZXd0YWIsIChuKzEpICogc2l6ZW9mKHN0cnVjdCBfaW5pdHRhYikpOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFNob3J0aGFuZCB0byBhZGQgYSBzaW5nbGUgZW50cnkgZ2l2ZW4gYSBuYW1lIGFuZCBhIGZ1bmN0aW9uICovCkBAIC0zMzc2LDE0ICszMzc2LDE0IEBACiBpbnQKIFB5SW1wb3J0X0FwcGVuZEluaXR0YWIoY2hhciAqbmFtZSwgdm9pZCAoKmluaXRmdW5jKSh2b2lkKSkKIHsKLQlzdHJ1Y3QgX2luaXR0YWIgbmV3dGFiWzJdOworICAgIHN0cnVjdCBfaW5pdHRhYiBuZXd0YWJbMl07CiAKLQltZW1zZXQobmV3dGFiLCAnXDAnLCBzaXplb2YgbmV3dGFiKTsKKyAgICBtZW1zZXQobmV3dGFiLCAnXDAnLCBzaXplb2YgbmV3dGFiKTsKIAotCW5ld3RhYlswXS5uYW1lID0gbmFtZTsKLQluZXd0YWJbMF0uaW5pdGZ1bmMgPSBpbml0ZnVuYzsKKyAgICBuZXd0YWJbMF0ubmFtZSA9IG5hbWU7CisgICAgbmV3dGFiWzBdLmluaXRmdW5jID0gaW5pdGZ1bmM7CiAKLQlyZXR1cm4gUHlJbXBvcnRfRXh0ZW5kSW5pdHRhYihuZXd0YWIpOworICAgIHJldHVybiBQeUltcG9ydF9FeHRlbmRJbml0dGFiKG5ld3RhYik7CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydGRsLmMgYi9QeXRob24vaW1wb3J0ZGwuYwppbmRleCA5YzMyNWU0Li4xNGM5YmU4IDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0ZGwuYworKysgYi9QeXRob24vaW1wb3J0ZGwuYwpAQCAtMTMsNjYgKzEzLDY2IEBACiAjaW5jbHVkZSAiaW1wb3J0ZGwuaCIKIAogZXh0ZXJuIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgIGNvbnN0IGNoYXIgKnNob3J0bmFtZSwKLQkJCQkJICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzaG9ydG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKTsKIAogCiAKIFB5T2JqZWN0ICoKIF9QeUltcG9ydF9Mb2FkRHluYW1pY01vZHVsZShjaGFyICpuYW1lLCBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JUHlPYmplY3QgKm07Ci0JY2hhciAqbGFzdGRvdCwgKnNob3J0bmFtZSwgKnBhY2thZ2Vjb250ZXh0LCAqb2xkY29udGV4dDsKLQlkbF9mdW5jcHRyIHA7CisgICAgUHlPYmplY3QgKm07CisgICAgY2hhciAqbGFzdGRvdCwgKnNob3J0bmFtZSwgKnBhY2thZ2Vjb250ZXh0LCAqb2xkY29udGV4dDsKKyAgICBkbF9mdW5jcHRyIHA7CiAKLQlpZiAoKG0gPSBfUHlJbXBvcnRfRmluZEV4dGVuc2lvbihuYW1lLCBwYXRobmFtZSkpICE9IE5VTEwpIHsKLQkJUHlfSU5DUkVGKG0pOwotCQlyZXR1cm4gbTsKLQl9Ci0JbGFzdGRvdCA9IHN0cnJjaHIobmFtZSwgJy4nKTsKLQlpZiAobGFzdGRvdCA9PSBOVUxMKSB7Ci0JCXBhY2thZ2Vjb250ZXh0ID0gTlVMTDsKLQkJc2hvcnRuYW1lID0gbmFtZTsKLQl9Ci0JZWxzZSB7Ci0JCXBhY2thZ2Vjb250ZXh0ID0gbmFtZTsKLQkJc2hvcnRuYW1lID0gbGFzdGRvdCsxOwotCX0KKyAgICBpZiAoKG0gPSBfUHlJbXBvcnRfRmluZEV4dGVuc2lvbihuYW1lLCBwYXRobmFtZSkpICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKG0pOworICAgICAgICByZXR1cm4gbTsKKyAgICB9CisgICAgbGFzdGRvdCA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKyAgICBpZiAobGFzdGRvdCA9PSBOVUxMKSB7CisgICAgICAgIHBhY2thZ2Vjb250ZXh0ID0gTlVMTDsKKyAgICAgICAgc2hvcnRuYW1lID0gbmFtZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHBhY2thZ2Vjb250ZXh0ID0gbmFtZTsKKyAgICAgICAgc2hvcnRuYW1lID0gbGFzdGRvdCsxOworICAgIH0KIAotCXAgPSBfUHlJbXBvcnRfR2V0RHluTG9hZEZ1bmMobmFtZSwgc2hvcnRuYW1lLCBwYXRobmFtZSwgZnApOwotCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocCA9PSBOVUxMKSB7Ci0JCVB5RXJyX0Zvcm1hdChQeUV4Y19JbXBvcnRFcnJvciwKLQkJICAgImR5bmFtaWMgbW9kdWxlIGRvZXMgbm90IGRlZmluZSBpbml0IGZ1bmN0aW9uIChpbml0JS4yMDBzKSIsCi0JCQkgICAgIHNob3J0bmFtZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLSAgICAgICAgb2xkY29udGV4dCA9IF9QeV9QYWNrYWdlQ29udGV4dDsKLQlfUHlfUGFja2FnZUNvbnRleHQgPSBwYWNrYWdlY29udGV4dDsKLQkoKnApKCk7Ci0JX1B5X1BhY2thZ2VDb250ZXh0ID0gb2xkY29udGV4dDsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgcCA9IF9QeUltcG9ydF9HZXREeW5Mb2FkRnVuYyhuYW1lLCBzaG9ydG5hbWUsIHBhdGhuYW1lLCBmcCk7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAiZHluYW1pYyBtb2R1bGUgZG9lcyBub3QgZGVmaW5lIGluaXQgZnVuY3Rpb24gKGluaXQlLjIwMHMpIiwKKyAgICAgICAgICAgICAgICAgICAgIHNob3J0bmFtZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBvbGRjb250ZXh0ID0gX1B5X1BhY2thZ2VDb250ZXh0OworICAgIF9QeV9QYWNrYWdlQ29udGV4dCA9IHBhY2thZ2Vjb250ZXh0OworICAgICgqcCkoKTsKKyAgICBfUHlfUGFja2FnZUNvbnRleHQgPSBvbGRjb250ZXh0OworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCW0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCksIG5hbWUpOwotCWlmIChtID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJkeW5hbWljIG1vZHVsZSBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHkiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIFJlbWVtYmVyIHRoZSBmaWxlbmFtZSBhcyB0aGUgX19maWxlX18gYXR0cmlidXRlICovCi0JaWYgKFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICJfX2ZpbGVfXyIsIHBhdGhuYW1lKSA8IDApCi0JCVB5RXJyX0NsZWFyKCk7IC8qIE5vdCBpbXBvcnRhbnQgZW5vdWdoIHRvIHJlcG9ydCAqLworICAgIG0gPSBQeURpY3RfR2V0SXRlbVN0cmluZyhQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCksIG5hbWUpOworICAgIGlmIChtID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImR5bmFtaWMgbW9kdWxlIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLyogUmVtZW1iZXIgdGhlIGZpbGVuYW1lIGFzIHRoZSBfX2ZpbGVfXyBhdHRyaWJ1dGUgKi8KKyAgICBpZiAoUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fZmlsZV9fIiwgcGF0aG5hbWUpIDwgMCkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsgLyogTm90IGltcG9ydGFudCBlbm91Z2ggdG8gcmVwb3J0ICovCiAKLQlpZiAoX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKG5hbWUsIHBhdGhuYW1lKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCVB5U3lzX1dyaXRlU3RkZXJyKAotCQkJImltcG9ydCAlcyAjIGR5bmFtaWNhbGx5IGxvYWRlZCBmcm9tICVzXG4iLAotCQkJbmFtZSwgcGF0aG5hbWUpOwotCVB5X0lOQ1JFRihtKTsKLQlyZXR1cm4gbTsKKyAgICBpZiAoX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKG5hbWUsIHBhdGhuYW1lKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKAorICAgICAgICAgICAgImltcG9ydCAlcyAjIGR5bmFtaWNhbGx5IGxvYWRlZCBmcm9tICVzXG4iLAorICAgICAgICAgICAgbmFtZSwgcGF0aG5hbWUpOworICAgIFB5X0lOQ1JFRihtKTsKKyAgICByZXR1cm4gbTsKIH0KIAogI2VuZGlmIC8qIEhBVkVfRFlOQU1JQ19MT0FESU5HICovCmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0ZGwuaCBiL1B5dGhvbi9pbXBvcnRkbC5oCmluZGV4IDVhMmQ0NWMuLmI0ZDIxYmUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnRkbC5oCisrKyBiL1B5dGhvbi9pbXBvcnRkbC5oCkBAIC04LDI4ICs4LDI4IEBACiAKIC8qIERlZmluaXRpb25zIGZvciBkeW5hbWljIGxvYWRpbmcgb2YgZXh0ZW5zaW9uIG1vZHVsZXMgKi8KIGVudW0gZmlsZXR5cGUgewotCVNFQVJDSF9FUlJPUiwKLQlQWV9TT1VSQ0UsCi0JUFlfQ09NUElMRUQsCi0JQ19FWFRFTlNJT04sCi0JUFlfUkVTT1VSQ0UsIC8qIE1hYyBvbmx5ICovCi0JUEtHX0RJUkVDVE9SWSwKLQlDX0JVSUxUSU4sCi0JUFlfRlJPWkVOLAotCVBZX0NPREVSRVNPVVJDRSwgLyogTWFjIG9ubHkgKi8KLQlJTVBfSE9PSworICAgIFNFQVJDSF9FUlJPUiwKKyAgICBQWV9TT1VSQ0UsCisgICAgUFlfQ09NUElMRUQsCisgICAgQ19FWFRFTlNJT04sCisgICAgUFlfUkVTT1VSQ0UsIC8qIE1hYyBvbmx5ICovCisgICAgUEtHX0RJUkVDVE9SWSwKKyAgICBDX0JVSUxUSU4sCisgICAgUFlfRlJPWkVOLAorICAgIFBZX0NPREVSRVNPVVJDRSwgLyogTWFjIG9ubHkgKi8KKyAgICBJTVBfSE9PSwogfTsKIAogc3RydWN0IGZpbGVkZXNjciB7Ci0JY2hhciAqc3VmZml4OwotCWNoYXIgKm1vZGU7Ci0JZW51bSBmaWxldHlwZSB0eXBlOworICAgIGNoYXIgKnN1ZmZpeDsKKyAgICBjaGFyICptb2RlOworICAgIGVudW0gZmlsZXR5cGUgdHlwZTsKIH07CiBleHRlcm4gc3RydWN0IGZpbGVkZXNjciAqIF9QeUltcG9ydF9GaWxldGFiOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlZGVzY3IgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiW107CiAKIGV4dGVybiBQeU9iamVjdCAqX1B5SW1wb3J0X0xvYWREeW5hbWljTW9kdWxlKGNoYXIgKm5hbWUsIGNoYXIgKnBhdGhuYW1lLAotCQkJCQkgICAgIEZJTEUgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFICopOwogCiAvKiBNYXggbGVuZ3RoIG9mIG1vZHVsZSBzdWZmaXggc2VhcmNoZWQgZm9yIC0tIGFjY29tbW9kYXRlcyAibW9kdWxlLnNsYiIgKi8KICNkZWZpbmUgTUFYU1VGRklYU0laRSAxMgpkaWZmIC0tZ2l0IGEvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMgYi9QeXRob24vbWFjdG9vbGJveGdsdWUuYwppbmRleCA0MDM3ZDQ3Li45MmJmM2U4IDEwMDY0NAotLS0gYS9QeXRob24vbWFjdG9vbGJveGdsdWUuYworKysgYi9QeXRob24vbWFjdG9vbGJveGdsdWUuYwpAQCAtNCwxMCArNCwxMCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCiAKLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKLWRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLWJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgogc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaAogQ2VudHJ1bSBvciBDV0kgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgpAQCAtMjUsNDUgKzI1LDQ1IEBACiAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJweW1hY3Rvb2xib3guaCIKLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4JLyogZm9yIG50b2hsLCBodG9ubCAqLworI2luY2x1ZGUgPGFycGEvaW5ldC5oPiAgLyogZm9yIG50b2hsLCBodG9ubCAqLwogCiAKIC8qIExpa2Ugc3RyZXJyb3IoKSBidXQgZm9yIE1hYyBPUyBlcnJvciBudW1iZXJzICovCiBjaGFyICoKIFB5TWFjX1N0ckVycm9yKGludCBlcnIpCiB7Ci0Jc3RhdGljIGNoYXIgYnVmWzI1Nl07Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKnJ2OworICAgIHN0YXRpYyBjaGFyIGJ1ZlsyNTZdOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpydjsKIAotCW0gPSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKCJNYWNPUyIpOwotCWlmICghbSkgewotCQlpZiAoUHlfVmVyYm9zZUZsYWcpCi0JCQlQeUVycl9QcmludCgpOwotCQlQeUVycl9DbGVhcigpOwotCQlydiA9IE5VTEw7Ci0JfQotCWVsc2UgewotCQlydiA9IFB5T2JqZWN0X0NhbGxNZXRob2QobSwgIkdldEVycm9yU3RyaW5nIiwgImkiLCBlcnIpOwotCQlpZiAoIXJ2KQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JaWYgKCFydikgewotCQlidWZbMF0gPSAnXDAnOwotCX0KLQllbHNlIHsKLQkJY2hhciAqaW5wdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JCWlmICghaW5wdXQpIHsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlidWZbMF0gPSAnXDAnOwotCQl9IGVsc2UgewotCQkJc3RybmNweShidWYsIGlucHV0LCBzaXplb2YoYnVmKSAtIDEpOwotCQkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOwotCQl9Ci0JCVB5X0RFQ1JFRihydik7Ci0JfQotCVB5X1hERUNSRUYobSk7Ci0JcmV0dXJuIGJ1ZjsKKyAgICBtID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygiTWFjT1MiKTsKKyAgICBpZiAoIW0pIHsKKyAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcnYgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcnYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG0sICJHZXRFcnJvclN0cmluZyIsICJpIiwgZXJyKTsKKyAgICAgICAgaWYgKCFydikKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmICghcnYpIHsKKyAgICAgICAgYnVmWzBdID0gJ1wwJzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNoYXIgKmlucHV0ID0gUHlTdHJpbmdfQXNTdHJpbmcocnYpOworICAgICAgICBpZiAoIWlucHV0KSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgYnVmWzBdID0gJ1wwJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cm5jcHkoYnVmLCBpbnB1dCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKyAgICAgICAgICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1wwJzsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIH0KKyAgICBQeV9YREVDUkVGKG0pOworICAgIHJldHVybiBidWY7CiB9CiAKIC8qIEV4Y2VwdGlvbiBvYmplY3Qgc2hhcmVkIGJ5IGFsbCBNYWMgc3BlY2lmaWMgbW9kdWxlcyBmb3IgTWFjIE9TIGVycm9ycyAqLwpAQCAtNzMsMzYgKzczLDM2IEBACiBQeU9iamVjdCAqCiBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbih2b2lkKQogewotCWlmIChQeU1hY19PU0VyckV4Y2VwdGlvbiA9PSBOVUxMKQotCQlQeU1hY19PU0VyckV4Y2VwdGlvbiA9IFB5RXJyX05ld0V4Y2VwdGlvbigiTWFjT1MuRXJyb3IiLCBOVUxMLCBOVUxMKTsKLQlyZXR1cm4gUHlNYWNfT1NFcnJFeGNlcHRpb247CisgICAgaWYgKFB5TWFjX09TRXJyRXhjZXB0aW9uID09IE5VTEwpCisgICAgICAgIFB5TWFjX09TRXJyRXhjZXB0aW9uID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJNYWNPUy5FcnJvciIsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiBQeU1hY19PU0VyckV4Y2VwdGlvbjsKIH0KIAogLyogU2V0IGEgTUFDLXNwZWNpZmljIGVycm9yIGZyb20gZXJybm8sIGFuZCByZXR1cm4gTlVMTDsgcmV0dXJuIE5vbmUgaWYgbm8gZXJyb3IgKi8KLVB5T2JqZWN0ICogCitQeU9iamVjdCAqCiBQeUVycl9NYWMoUHlPYmplY3QgKmVvYmosIGludCBlcnIpCiB7Ci0JY2hhciAqbXNnOwotCVB5T2JqZWN0ICp2OwotCQotCWlmIChlcnIgPT0gMCAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlpZiAoZXJyID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCXJldHVybiBOVUxMOwotCW1zZyA9IFB5TWFjX1N0ckVycm9yKGVycik7Ci0JdiA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnIsIG1zZyk7Ci0JUHlFcnJfU2V0T2JqZWN0KGVvYmosIHYpOwotCVB5X0RFQ1JFRih2KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBjaGFyICptc2c7CisgICAgUHlPYmplY3QgKnY7CisKKyAgICBpZiAoZXJyID09IDAgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgaWYgKGVyciA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBtc2cgPSBQeU1hY19TdHJFcnJvcihlcnIpOworICAgIHYgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgZXJyLCBtc2cpOworICAgIFB5RXJyX1NldE9iamVjdChlb2JqLCB2KTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIC8qIENhbGwgUHlFcnJfTWFjIHdpdGggUHlNYWNfT1NFcnJFeGNlcHRpb24gKi8KIFB5T2JqZWN0ICoKIFB5TWFjX0Vycm9yKE9TRXJyIGVycikKIHsKLQlyZXR1cm4gUHlFcnJfTWFjKFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCksIGVycik7CisgICAgcmV0dXJuIFB5RXJyX01hYyhQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpLCBlcnIpOwogfQogCiAKQEAgLTExMCw0OSArMTEwLDQ5IEBACiBPU0VycgogUHlNYWNfR2V0RnVsbFBhdGhuYW1lKEZTU3BlYyAqZnNzLCBjaGFyICpwYXRoLCBpbnQgbGVuKQogewotCVB5T2JqZWN0ICpmcywgKmV4YzsKLQlQeU9iamVjdCAqcnYgPSBOVUxMOwotCWNoYXIgKmlucHV0OwotCU9TRXJyIGVyciA9IG5vRXJyOworICAgIFB5T2JqZWN0ICpmcywgKmV4YzsKKyAgICBQeU9iamVjdCAqcnYgPSBOVUxMOworICAgIGNoYXIgKmlucHV0OworICAgIE9TRXJyIGVyciA9IG5vRXJyOwogCi0JKnBhdGggPSAnXDAnOworICAgICpwYXRoID0gJ1wwJzsKIAotCWZzID0gUHlNYWNfQnVpbGRGU1NwZWMoZnNzKTsKLQlpZiAoIWZzKQotCQlnb3RvIGVycm9yOworICAgIGZzID0gUHlNYWNfQnVpbGRGU1NwZWMoZnNzKTsKKyAgICBpZiAoIWZzKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JcnYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGZzLCAiYXNfcGF0aG5hbWUiLCAiIik7Ci0JaWYgKCFydikKLQkJZ290byBlcnJvcjsKKyAgICBydiA9IFB5T2JqZWN0X0NhbGxNZXRob2QoZnMsICJhc19wYXRobmFtZSIsICIiKTsKKyAgICBpZiAoIXJ2KQorICAgICAgICBnb3RvIGVycm9yOwogCi0JaW5wdXQgPSBQeVN0cmluZ19Bc1N0cmluZyhydik7Ci0JaWYgKCFpbnB1dCkKLQkJZ290byBlcnJvcjsKKyAgICBpbnB1dCA9IFB5U3RyaW5nX0FzU3RyaW5nKHJ2KTsKKyAgICBpZiAoIWlucHV0KQorICAgICAgICBnb3RvIGVycm9yOwogCi0Jc3RybmNweShwYXRoLCBpbnB1dCwgbGVuIC0gMSk7Ci0JcGF0aFtsZW4gLSAxXSA9ICdcMCc7CisgICAgc3RybmNweShwYXRoLCBpbnB1dCwgbGVuIC0gMSk7CisgICAgcGF0aFtsZW4gLSAxXSA9ICdcMCc7CiAKLQlQeV9YREVDUkVGKHJ2KTsKLQlQeV9YREVDUkVGKGZzKTsKLQlyZXR1cm4gZXJyOworICAgIFB5X1hERUNSRUYocnYpOworICAgIFB5X1hERUNSRUYoZnMpOworICAgIHJldHVybiBlcnI7CiAKICAgZXJyb3I6Ci0JZXhjID0gUHlFcnJfT2NjdXJyZWQoKTsKLQlpZiAoZXhjICAmJiBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoZXhjLAotCQkJCQkJUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKSkpIHsKLQkJUHlPYmplY3QgKmFyZ3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGV4YywgImFyZ3MiKTsKLQkJaWYgKGFyZ3MpIHsKLQkJCWNoYXIgKmlnbm9yZTsKLQkJCVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlzIiwgJmVyciwgJmlnbm9yZSk7Ci0JCQlQeV9YREVDUkVGKGFyZ3MpOwotCQl9Ci0JfQotCWlmIChlcnIgPT0gbm9FcnIpCi0JCWVyciA9IC0xOwotCVB5RXJyX0NsZWFyKCk7Ci0JUHlfWERFQ1JFRihydik7Ci0JUHlfWERFQ1JFRihmcyk7Ci0JcmV0dXJuIGVycjsKKyAgICBleGMgPSBQeUVycl9PY2N1cnJlZCgpOworICAgIGlmIChleGMgICYmIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhleGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCkpKSB7CisgICAgICAgIFB5T2JqZWN0ICphcmdzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhleGMsICJhcmdzIik7CisgICAgICAgIGlmIChhcmdzKSB7CisgICAgICAgICAgICBjaGFyICppZ25vcmU7CisgICAgICAgICAgICBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpcyIsICZlcnIsICZpZ25vcmUpOworICAgICAgICAgICAgUHlfWERFQ1JFRihhcmdzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyID09IG5vRXJyKQorICAgICAgICBlcnIgPSAtMTsKKyAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIFB5X1hERUNSRUYoZnMpOworICAgIHJldHVybiBlcnI7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKQEAgLTE2MCwzMCArMTYwLDMwIEBACiBpbnQKIFB5TWFjX0dldE9TVHlwZShQeU9iamVjdCAqdiwgT1NUeXBlICpwcikKIHsKLQl1aW50MzJfdCB0bXA7Ci0JaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCBQeVN0cmluZ19TaXplKHYpICE9IDQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJPU1R5cGUgYXJnIG11c3QgYmUgc3RyaW5nIG9mIDQgY2hhcnMiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCW1lbWNweSgoY2hhciAqKSZ0bXAsIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCA0KTsKLQkqcHIgPSAoT1NUeXBlKW50b2hsKHRtcCk7Ci0JcmV0dXJuIDE7CisgICAgdWludDMyX3QgdG1wOworICAgIGlmICghUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlTdHJpbmdfU2l6ZSh2KSAhPSA0KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiT1NUeXBlIGFyZyBtdXN0IGJlIHN0cmluZyBvZiA0IGNoYXJzIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBtZW1jcHkoKGNoYXIgKikmdG1wLCBQeVN0cmluZ19Bc1N0cmluZyh2KSwgNCk7CisgICAgKnByID0gKE9TVHlwZSludG9obCh0bXApOworICAgIHJldHVybiAxOwogfQogCiAvKiBDb252ZXJ0IGFuIE9TVHlwZSB2YWx1ZSB0byBhIDQtY2hhciBzdHJpbmcgb2JqZWN0ICovCiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZE9TVHlwZShPU1R5cGUgdCkKIHsKLQl1aW50MzJfdCB0bXAgPSBodG9ubCgodWludDMyX3QpdCk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnRtcCwgNCk7CisgICAgdWludDMyX3QgdG1wID0gaHRvbmwoKHVpbnQzMl90KXQpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZ0bXAsIDQpOwogfQogCiAvKiBDb252ZXJ0IGFuIE51bVZlcnNpb24gdmFsdWUgdG8gYSA0LWVsZW1lbnQgdHVwbGUgKi8KIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkTnVtVmVyc2lvbihOdW1WZXJzaW9uIHQpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihoaGhoKSIsIHQubWFqb3JSZXYsIHQubWlub3JBbmRCdWdSZXYsIHQuc3RhZ2UsIHQubm9uUmVsUmV2KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGhoaGgpIiwgdC5tYWpvclJldiwgdC5taW5vckFuZEJ1Z1JldiwgdC5zdGFnZSwgdC5ub25SZWxSZXYpOwogfQogCiAKQEAgLTE5MSwzNiArMTkxLDM2IEBACiBpbnQKIFB5TWFjX0dldFN0cjI1NShQeU9iamVjdCAqdiwgU3RyMjU1IHBidWYpCiB7Ci0JaW50IGxlbjsKLQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpIHx8IChsZW4gPSBQeVN0cmluZ19TaXplKHYpKSA+IDI1NSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJIlN0cjI1NSBhcmcgbXVzdCBiZSBzdHJpbmcgb2YgYXQgbW9zdCAyNTUgY2hhcnMiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXBidWZbMF0gPSBsZW47Ci0JbWVtY3B5KChjaGFyICopKHBidWYrMSksIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCBsZW4pOwotCXJldHVybiAxOworICAgIGludCBsZW47CisgICAgaWYgKCFQeVN0cmluZ19DaGVjayh2KSB8fCAobGVuID0gUHlTdHJpbmdfU2l6ZSh2KSkgPiAyNTUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICJTdHIyNTUgYXJnIG11c3QgYmUgc3RyaW5nIG9mIGF0IG1vc3QgMjU1IGNoYXJzIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwYnVmWzBdID0gbGVuOworICAgIG1lbWNweSgoY2hhciAqKShwYnVmKzEpLCBQeVN0cmluZ19Bc1N0cmluZyh2KSwgbGVuKTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogQ29udmVydCBhIFN0cjI1NSB0byBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0ICovCiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZFN0cjI1NShTdHIyNTUgcykKIHsKLQlpZiAoIHMgPT0gTlVMTCApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiU3RyMjU1IHBvaW50ZXIgaXMgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNbMV0sIChpbnQpc1swXSk7CisgICAgaWYgKCBzID09IE5VTEwgKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIlN0cjI1NSBwb2ludGVyIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZzWzFdLCAoaW50KXNbMF0pOwogfQogCiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZE9wdFN0cjI1NShTdHIyNTUgcykKIHsKLQlpZiAoIHMgPT0gTlVMTCApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNbMV0sIChpbnQpc1swXSk7CisgICAgaWYgKCBzID09IE5VTEwgKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZzWzFdLCAoaW50KXNbMF0pOwogfQogCiAKQEAgLTIzMiwxNCArMjMyLDE0IEBACiBpbnQKIFB5TWFjX0dldFJlY3QoUHlPYmplY3QgKnYsIFJlY3QgKnIpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaGhoaCkiLCAmci0+bGVmdCwgJnItPnRvcCwgJnItPnJpZ2h0LCAmci0+Ym90dG9tKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoaGhoKSIsICZyLT5sZWZ0LCAmci0+dG9wLCAmci0+cmlnaHQsICZyLT5ib3R0b20pOwogfQogCiAvKiBDb252ZXJ0IGEgUmVjdCB0byBhIFB5dGhvbiBvYmplY3QgKi8KIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkUmVjdChSZWN0ICpyKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGhoaCkiLCByLT5sZWZ0LCByLT50b3AsIHItPnJpZ2h0LCByLT5ib3R0b20pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGhoaCkiLCByLT5sZWZ0LCByLT50b3AsIHItPnJpZ2h0LCByLT5ib3R0b20pOwogfQogCiAKQEAgLTI1MCwxNCArMjUwLDE0IEBACiBpbnQKIFB5TWFjX0dldFBvaW50KFB5T2JqZWN0ICp2LCBQb2ludCAqcCkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoaCkiLCAmcC0+aCwgJnAtPnYpOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGhoKSIsICZwLT5oLCAmcC0+dik7CiB9CiAKIC8qIENvbnZlcnQgYSBQb2ludCB0byBhIFB5dGhvbiBvYmplY3QgKi8KIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkUG9pbnQoUG9pbnQgcCkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGhoKSIsIHAuaCwgcC52KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGhoKSIsIHAuaCwgcC52KTsKIH0KIAogCkBAIC0yNjYsNzMgKzI2Niw3MyBAQAogaW50CiBQeU1hY19HZXRFdmVudFJlY29yZChQeU9iamVjdCAqdiwgRXZlbnRSZWNvcmQgKmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSGtrKGhoKUgpIiwKLQkgICAgICAgICAgICAgICAgICAgJmUtPndoYXQsCi0JICAgICAgICAgICAgICAgICAgICZlLT5tZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAmZS0+d2hlbiwKLQkgICAgICAgICAgICAgICAgICAgJmUtPndoZXJlLmgsCi0JICAgICAgICAgICAgICAgICAgICZlLT53aGVyZS52LCAgICAgICAgICAgICAgICAgICAKLQkgICAgICAgICAgICAgICAgICAgJmUtPm1vZGlmaWVycyk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSGtrKGhoKUgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmUtPndoYXQsCisgICAgICAgICAgICAgICAgICAgICAgICZlLT5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAmZS0+d2hlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmUtPndoZXJlLmgsCisgICAgICAgICAgICAgICAgICAgICAgICZlLT53aGVyZS52LAorICAgICAgICAgICAgICAgICAgICAgICAmZS0+bW9kaWZpZXJzKTsKIH0KIAogLyogQ29udmVydCBhIFJlY3QgdG8gYW4gRXZlbnRSZWNvcmQgb2JqZWN0ICovCiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZEV2ZW50UmVjb3JkKEV2ZW50UmVjb3JkICplKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoaGxsKGhoKWgpIiwKLQkgICAgICAgICAgICAgICAgICAgICBlLT53aGF0LAotCSAgICAgICAgICAgICAgICAgICAgIGUtPm1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgZS0+d2hlbiwKLQkgICAgICAgICAgICAgICAgICAgICBlLT53aGVyZS5oLAotCSAgICAgICAgICAgICAgICAgICAgIGUtPndoZXJlLnYsCi0JICAgICAgICAgICAgICAgICAgICAgZS0+bW9kaWZpZXJzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGhsbChoaCloKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZS0+d2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLT5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGUtPndoZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgZS0+d2hlcmUuaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlLT53aGVyZS52LAorICAgICAgICAgICAgICAgICAgICAgICAgIGUtPm1vZGlmaWVycyk7CiB9CiAKIC8qIENvbnZlcnQgUHl0aG9uIG9iamVjdCB0byBGaXhlZCAqLwogaW50CiBQeU1hY19HZXRGaXhlZChQeU9iamVjdCAqdiwgRml4ZWQgKmYpCiB7Ci0JZG91YmxlIGQ7Ci0JCi0JaWYoICFQeUFyZ19QYXJzZSh2LCAiZCIsICZkKSkKLQkJcmV0dXJuIDA7Ci0JKmYgPSAoRml4ZWQpKGQgKiAweDEwMDAwKTsKLQlyZXR1cm4gMTsKKyAgICBkb3VibGUgZDsKKworICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgImQiLCAmZCkpCisgICAgICAgIHJldHVybiAwOworICAgICpmID0gKEZpeGVkKShkICogMHgxMDAwMCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIENvbnZlcnQgYSBGaXhlZCB0byBhIFB5dGhvbiBvYmplY3QgKi8KIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkRml4ZWQoRml4ZWQgZikKIHsKLQlkb3VibGUgZDsKLQkKLQlkID0gZjsKLQlkID0gZCAvIDB4MTAwMDA7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImQiLCBkKTsKKyAgICBkb3VibGUgZDsKKworICAgIGQgPSBmOworICAgIGQgPSBkIC8gMHgxMDAwMDsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZCIsIGQpOwogfQogCiAvKiBDb252ZXJ0IHdpZGUgdG8vZnJvbSBQeXRob24gaW50IG9yIChoaSwgbG8pIHR1cGxlLiBYWFhYIFNob3VsZCB1c2UgUHl0aG9uIGxvbmdzICovCiBpbnQKIFB5TWFjX0dldHdpZGUoUHlPYmplY3QgKnYsIHdpZGUgKnJ2KQogewotCWlmIChQeUludF9DaGVjayh2KSkgewotCQlydi0+aGkgPSAwOwotCQlydi0+bG8gPSBQeUludF9Bc0xvbmcodik7Ci0JCWlmKCBydi0+bG8gJiAweDgwMDAwMDAwICkKLQkJCXJ2LT5oaSA9IC0xOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoa2spIiwgJnJ2LT5oaSwgJnJ2LT5sbyk7CisgICAgaWYgKFB5SW50X0NoZWNrKHYpKSB7CisgICAgICAgIHJ2LT5oaSA9IDA7CisgICAgICAgIHJ2LT5sbyA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgaWYoIHJ2LT5sbyAmIDB4ODAwMDAwMDAgKQorICAgICAgICAgICAgcnYtPmhpID0gLTE7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihraykiLCAmcnYtPmhpLCAmcnYtPmxvKTsKIH0KIAogCiBQeU9iamVjdCAqCiBQeU1hY19CdWlsZHdpZGUod2lkZSAqdykKIHsKLQlpZiAoICh3LT5oaSA9PSAwICYmICh3LT5sbyAmIDB4ODAwMDAwMDApID09IDApIHx8Ci0JICAgICAody0+aGkgPT0gLTEgJiYgKHctPmxvICYgMHg4MDAwMDAwMCkgKSApCi0JCXJldHVybiBQeUludF9Gcm9tTG9uZyh3LT5sbyk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsbCkiLCB3LT5oaSwgdy0+bG8pOworICAgIGlmICggKHctPmhpID09IDAgJiYgKHctPmxvICYgMHg4MDAwMDAwMCkgPT0gMCkgfHwKKyAgICAgICAgICh3LT5oaSA9PSAtMSAmJiAody0+bG8gJiAweDgwMDAwMDAwKSApICkKKyAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHctPmxvKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGxsKSIsIHctPmhpLCB3LT5sbyk7CiB9CiAKICNpZmRlZiBVU0VfVE9PTEJPWF9PQkpFQ1RfR0xVRQpAQCAtMzU4LDggKzM1OCw4IEBACiAgICAgaWYgKCFQeU1hY0dsdWVQdHJfIyNyb3V0aW5lbmFtZSkgeyBcCiAgICAgICAgaWYgKCFQeUltcG9ydF9JbXBvcnRNb2R1bGUobW9kdWxlKSkgcmV0dXJuIE5VTEw7IFwKICAgICAgICBpZiAoIVB5TWFjR2x1ZVB0cl8jI3JvdXRpbmVuYW1lKSB7IFwKLSAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiTW9kdWxlIGRpZCBub3QgcHJvdmlkZSByb3V0aW5lOiAiIG1vZHVsZSAiOiAiICNyb3V0aW5lbmFtZSk7IFwKLSAgICAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJNb2R1bGUgZGlkIG5vdCBwcm92aWRlIHJvdXRpbmU6ICIgbW9kdWxlICI6ICIgI3JvdXRpbmVuYW1lKTsgXAorICAgICAgIHJldHVybiBOVUxMOyBcCiAgICAgICAgfSBcCiAgICAgfSBcCiAgICAgcmV0dXJuICgqUHlNYWNHbHVlUHRyXyMjcm91dGluZW5hbWUpKGNvYmopOyBcCkBAIC0zNzIsOCArMzcyLDggQEAKICAgICBpZiAoIVB5TWFjR2x1ZVB0cl8jI3JvdXRpbmVuYW1lKSB7IFwKICAgICAgICBpZiAoIVB5SW1wb3J0X0ltcG9ydE1vZHVsZShtb2R1bGUpKSByZXR1cm4gMDsgXAogICAgICAgIGlmICghUHlNYWNHbHVlUHRyXyMjcm91dGluZW5hbWUpIHsgXAotICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJNb2R1bGUgZGlkIG5vdCBwcm92aWRlIHJvdXRpbmU6ICIgbW9kdWxlICI6ICIgI3JvdXRpbmVuYW1lKTsgXAotICAgICAgICAgICByZXR1cm4gMDsgXAorICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIk1vZHVsZSBkaWQgbm90IHByb3ZpZGUgcm91dGluZTogIiBtb2R1bGUgIjogIiAjcm91dGluZW5hbWUpOyBcCisgICAgICAgcmV0dXJuIDA7IFwKICAgICAgICB9IFwKICAgICB9IFwKICAgICByZXR1cm4gKCpQeU1hY0dsdWVQdHJfIyNyb3V0aW5lbmFtZSkocHlvYmosIGNvYmopOyBcCmRpZmYgLS1naXQgYS9QeXRob24vbWFyc2hhbC5jIGIvUHl0aG9uL21hcnNoYWwuYwppbmRleCBhNGM4MzFmLi5iY2M4NjM2IDEwMDY0NAotLS0gYS9QeXRob24vbWFyc2hhbC5jCisrKyBiL1B5dGhvbi9tYXJzaGFsLmMKQEAgLTE3LDQwOCArMTcsNDA4IEBACiAgKi8KICNkZWZpbmUgTUFYX01BUlNIQUxfU1RBQ0tfREVQVEggMjAwMAogCi0jZGVmaW5lIFRZUEVfTlVMTAkJJzAnCi0jZGVmaW5lIFRZUEVfTk9ORQkJJ04nCi0jZGVmaW5lIFRZUEVfRkFMU0UJCSdGJwotI2RlZmluZSBUWVBFX1RSVUUJCSdUJwotI2RlZmluZSBUWVBFX1NUT1BJVEVSCQknUycKLSNkZWZpbmUgVFlQRV9FTExJUFNJUyAgIAknLicKLSNkZWZpbmUgVFlQRV9JTlQJCSdpJwotI2RlZmluZSBUWVBFX0lOVDY0CQknSScKLSNkZWZpbmUgVFlQRV9GTE9BVAkJJ2YnCi0jZGVmaW5lIFRZUEVfQklOQVJZX0ZMT0FUCSdnJwotI2RlZmluZSBUWVBFX0NPTVBMRVgJCSd4JwotI2RlZmluZSBUWVBFX0JJTkFSWV9DT01QTEVYCSd5JwotI2RlZmluZSBUWVBFX0xPTkcJCSdsJwotI2RlZmluZSBUWVBFX1NUUklORwkJJ3MnCi0jZGVmaW5lIFRZUEVfSU5URVJORUQJCSd0JwotI2RlZmluZSBUWVBFX1NUUklOR1JFRgkJJ1InCi0jZGVmaW5lIFRZUEVfVFVQTEUJCScoJwotI2RlZmluZSBUWVBFX0xJU1QJCSdbJwotI2RlZmluZSBUWVBFX0RJQ1QJCSd7JwotI2RlZmluZSBUWVBFX0NPREUJCSdjJwotI2RlZmluZSBUWVBFX1VOSUNPREUJCSd1JwotI2RlZmluZSBUWVBFX1VOS05PV04JCSc/JwotI2RlZmluZSBUWVBFX1NFVAkJJzwnCi0jZGVmaW5lIFRZUEVfRlJPWkVOU0VUICAJJz4nCisjZGVmaW5lIFRZUEVfTlVMTCAgICAgICAgICAgICAgICcwJworI2RlZmluZSBUWVBFX05PTkUgICAgICAgICAgICAgICAnTicKKyNkZWZpbmUgVFlQRV9GQUxTRSAgICAgICAgICAgICAgJ0YnCisjZGVmaW5lIFRZUEVfVFJVRSAgICAgICAgICAgICAgICdUJworI2RlZmluZSBUWVBFX1NUT1BJVEVSICAgICAgICAgICAnUycKKyNkZWZpbmUgVFlQRV9FTExJUFNJUyAgICAgICAgICAgJy4nCisjZGVmaW5lIFRZUEVfSU5UICAgICAgICAgICAgICAgICdpJworI2RlZmluZSBUWVBFX0lOVDY0ICAgICAgICAgICAgICAnSScKKyNkZWZpbmUgVFlQRV9GTE9BVCAgICAgICAgICAgICAgJ2YnCisjZGVmaW5lIFRZUEVfQklOQVJZX0ZMT0FUICAgICAgICdnJworI2RlZmluZSBUWVBFX0NPTVBMRVggICAgICAgICAgICAneCcKKyNkZWZpbmUgVFlQRV9CSU5BUllfQ09NUExFWCAgICAgJ3knCisjZGVmaW5lIFRZUEVfTE9ORyAgICAgICAgICAgICAgICdsJworI2RlZmluZSBUWVBFX1NUUklORyAgICAgICAgICAgICAncycKKyNkZWZpbmUgVFlQRV9JTlRFUk5FRCAgICAgICAgICAgJ3QnCisjZGVmaW5lIFRZUEVfU1RSSU5HUkVGICAgICAgICAgICdSJworI2RlZmluZSBUWVBFX1RVUExFICAgICAgICAgICAgICAnKCcKKyNkZWZpbmUgVFlQRV9MSVNUICAgICAgICAgICAgICAgJ1snCisjZGVmaW5lIFRZUEVfRElDVCAgICAgICAgICAgICAgICd7JworI2RlZmluZSBUWVBFX0NPREUgICAgICAgICAgICAgICAnYycKKyNkZWZpbmUgVFlQRV9VTklDT0RFICAgICAgICAgICAgJ3UnCisjZGVmaW5lIFRZUEVfVU5LTk9XTiAgICAgICAgICAgICc/JworI2RlZmluZSBUWVBFX1NFVCAgICAgICAgICAgICAgICAnPCcKKyNkZWZpbmUgVFlQRV9GUk9aRU5TRVQgICAgICAgICAgJz4nCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlGSUxFICpmcDsKLQlpbnQgZXJyb3I7Ci0JaW50IGRlcHRoOwotCS8qIElmIGZwID09IE5VTEwsIHRoZSBmb2xsb3dpbmcgYXJlIHZhbGlkOiAqLwotCVB5T2JqZWN0ICpzdHI7Ci0JY2hhciAqcHRyOwotCWNoYXIgKmVuZDsKLQlQeU9iamVjdCAqc3RyaW5nczsgLyogZGljdCBvbiBtYXJzaGFsLCBsaXN0IG9uIHVubWFyc2hhbCAqLwotCWludCB2ZXJzaW9uOworICAgIEZJTEUgKmZwOworICAgIGludCBlcnJvcjsKKyAgICBpbnQgZGVwdGg7CisgICAgLyogSWYgZnAgPT0gTlVMTCwgdGhlIGZvbGxvd2luZyBhcmUgdmFsaWQ6ICovCisgICAgUHlPYmplY3QgKnN0cjsKKyAgICBjaGFyICpwdHI7CisgICAgY2hhciAqZW5kOworICAgIFB5T2JqZWN0ICpzdHJpbmdzOyAvKiBkaWN0IG9uIG1hcnNoYWwsIGxpc3Qgb24gdW5tYXJzaGFsICovCisgICAgaW50IHZlcnNpb247CiB9IFdGSUxFOwogCiAjZGVmaW5lIHdfYnl0ZShjLCBwKSBpZiAoKChwKS0+ZnApKSBwdXRjKChjKSwgKHApLT5mcCk7IFwKLQkJICAgICAgZWxzZSBpZiAoKHApLT5wdHIgIT0gKHApLT5lbmQpICoocCktPnB0cisrID0gKGMpOyBcCi0JCQkgICBlbHNlIHdfbW9yZShjLCBwKQorICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChwKS0+cHRyICE9IChwKS0+ZW5kKSAqKHApLT5wdHIrKyA9IChjKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB3X21vcmUoYywgcCkKIAogc3RhdGljIHZvaWQKIHdfbW9yZShpbnQgYywgV0ZJTEUgKnApCiB7Ci0JUHlfc3NpemVfdCBzaXplLCBuZXdzaXplOwotCWlmIChwLT5zdHIgPT0gTlVMTCkKLQkJcmV0dXJuOyAvKiBBbiBlcnJvciBhbHJlYWR5IG9jY3VycmVkICovCi0Jc2l6ZSA9IFB5U3RyaW5nX1NpemUocC0+c3RyKTsKLQluZXdzaXplID0gc2l6ZSArIHNpemUgKyAxMDI0OwotCWlmIChuZXdzaXplID4gMzIqMTAyNCoxMDI0KSB7Ci0JCW5ld3NpemUgPSBzaXplICsgKHNpemUgPj4gMyk7CS8qIDEyLjUlIG92ZXJhbGxvY2F0aW9uICovCi0JfQotCWlmIChfUHlTdHJpbmdfUmVzaXplKCZwLT5zdHIsIG5ld3NpemUpICE9IDApIHsKLQkJcC0+cHRyID0gcC0+ZW5kID0gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JCXAtPnB0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilwLT5zdHIpICsgc2l6ZTsKLQkJcC0+ZW5kID0KLQkJCVB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilwLT5zdHIpICsgbmV3c2l6ZTsKLQkJKnAtPnB0cisrID0gUHlfU0FGRV9ET1dOQ0FTVChjLCBpbnQsIGNoYXIpOwotCX0KKyAgICBQeV9zc2l6ZV90IHNpemUsIG5ld3NpemU7CisgICAgaWYgKHAtPnN0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm47IC8qIEFuIGVycm9yIGFscmVhZHkgb2NjdXJyZWQgKi8KKyAgICBzaXplID0gUHlTdHJpbmdfU2l6ZShwLT5zdHIpOworICAgIG5ld3NpemUgPSBzaXplICsgc2l6ZSArIDEwMjQ7CisgICAgaWYgKG5ld3NpemUgPiAzMioxMDI0KjEwMjQpIHsKKyAgICAgICAgbmV3c2l6ZSA9IHNpemUgKyAoc2l6ZSA+PiAzKTsgICAgICAgICAgIC8qIDEyLjUlIG92ZXJhbGxvY2F0aW9uICovCisgICAgfQorICAgIGlmIChfUHlTdHJpbmdfUmVzaXplKCZwLT5zdHIsIG5ld3NpemUpICE9IDApIHsKKyAgICAgICAgcC0+cHRyID0gcC0+ZW5kID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHAtPnB0ciA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilwLT5zdHIpICsgc2l6ZTsKKyAgICAgICAgcC0+ZW5kID0KKyAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKilwLT5zdHIpICsgbmV3c2l6ZTsKKyAgICAgICAgKnAtPnB0cisrID0gUHlfU0FGRV9ET1dOQ0FTVChjLCBpbnQsIGNoYXIpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHdfc3RyaW5nKGNoYXIgKnMsIGludCBuLCBXRklMRSAqcCkKIHsKLQlpZiAocC0+ZnAgIT0gTlVMTCkgewotCQlmd3JpdGUocywgMSwgbiwgcC0+ZnApOwotCX0KLQllbHNlIHsKLQkJd2hpbGUgKC0tbiA+PSAwKSB7Ci0JCQl3X2J5dGUoKnMsIHApOwotCQkJcysrOwotCQl9Ci0JfQorICAgIGlmIChwLT5mcCAhPSBOVUxMKSB7CisgICAgICAgIGZ3cml0ZShzLCAxLCBuLCBwLT5mcCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB3aGlsZSAoLS1uID49IDApIHsKKyAgICAgICAgICAgIHdfYnl0ZSgqcywgcCk7CisgICAgICAgICAgICBzKys7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCiB3X3Nob3J0KGludCB4LCBXRklMRSAqcCkKIHsKLQl3X2J5dGUoKGNoYXIpKCB4ICAgICAgJiAweGZmKSwgcCk7Ci0Jd19ieXRlKChjaGFyKSgoeD4+IDgpICYgMHhmZiksIHApOworICAgIHdfYnl0ZSgoY2hhcikoIHggICAgICAmIDB4ZmYpLCBwKTsKKyAgICB3X2J5dGUoKGNoYXIpKCh4Pj4gOCkgJiAweGZmKSwgcCk7CiB9CiAKIHN0YXRpYyB2b2lkCiB3X2xvbmcobG9uZyB4LCBXRklMRSAqcCkKIHsKLQl3X2J5dGUoKGNoYXIpKCB4ICAgICAgJiAweGZmKSwgcCk7Ci0Jd19ieXRlKChjaGFyKSgoeD4+IDgpICYgMHhmZiksIHApOwotCXdfYnl0ZSgoY2hhcikoKHg+PjE2KSAmIDB4ZmYpLCBwKTsKLQl3X2J5dGUoKGNoYXIpKCh4Pj4yNCkgJiAweGZmKSwgcCk7CisgICAgd19ieXRlKChjaGFyKSggeCAgICAgICYgMHhmZiksIHApOworICAgIHdfYnl0ZSgoY2hhcikoKHg+PiA4KSAmIDB4ZmYpLCBwKTsKKyAgICB3X2J5dGUoKGNoYXIpKCh4Pj4xNikgJiAweGZmKSwgcCk7CisgICAgd19ieXRlKChjaGFyKSgoeD4+MjQpICYgMHhmZiksIHApOwogfQogCiAjaWYgU0laRU9GX0xPTkcgPiA0CiBzdGF0aWMgdm9pZAogd19sb25nNjQobG9uZyB4LCBXRklMRSAqcCkKIHsKLQl3X2xvbmcoeCwgcCk7Ci0Jd19sb25nKHg+PjMyLCBwKTsKKyAgICB3X2xvbmcoeCwgcCk7CisgICAgd19sb25nKHg+PjMyLCBwKTsKIH0KICNlbmRpZgogCiBzdGF0aWMgdm9pZAogd19vYmplY3QoUHlPYmplY3QgKnYsIFdGSUxFICpwKQogewotCVB5X3NzaXplX3QgaSwgbjsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKLQlwLT5kZXB0aCsrOworICAgIHAtPmRlcHRoKys7CiAKLQlpZiAocC0+ZGVwdGggPiBNQVhfTUFSU0hBTF9TVEFDS19ERVBUSCkgewotCQlwLT5lcnJvciA9IDI7Ci0JfQotCWVsc2UgaWYgKHYgPT0gTlVMTCkgewotCQl3X2J5dGUoVFlQRV9OVUxMLCBwKTsKLQl9Ci0JZWxzZSBpZiAodiA9PSBQeV9Ob25lKSB7Ci0JCXdfYnl0ZShUWVBFX05PTkUsIHApOwotCX0KLQllbHNlIGlmICh2ID09IFB5RXhjX1N0b3BJdGVyYXRpb24pIHsKLQkJd19ieXRlKFRZUEVfU1RPUElURVIsIHApOwotCX0KLQllbHNlIGlmICh2ID09IFB5X0VsbGlwc2lzKSB7Ci0JICAgICAgICB3X2J5dGUoVFlQRV9FTExJUFNJUywgcCk7Ci0JfQotCWVsc2UgaWYgKHYgPT0gUHlfRmFsc2UpIHsKLQkgICAgICAgIHdfYnl0ZShUWVBFX0ZBTFNFLCBwKTsKLQl9Ci0JZWxzZSBpZiAodiA9PSBQeV9UcnVlKSB7Ci0JICAgICAgICB3X2J5dGUoVFlQRV9UUlVFLCBwKTsKLQl9Ci0JZWxzZSBpZiAoUHlJbnRfQ2hlY2tFeGFjdCh2KSkgewotCQlsb25nIHggPSBQeUludF9BU19MT05HKChQeUludE9iamVjdCAqKXYpOworICAgIGlmIChwLT5kZXB0aCA+IE1BWF9NQVJTSEFMX1NUQUNLX0RFUFRIKSB7CisgICAgICAgIHAtPmVycm9yID0gMjsKKyAgICB9CisgICAgZWxzZSBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIHdfYnl0ZShUWVBFX05VTEwsIHApOworICAgIH0KKyAgICBlbHNlIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgd19ieXRlKFRZUEVfTk9ORSwgcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHYgPT0gUHlFeGNfU3RvcEl0ZXJhdGlvbikgeworICAgICAgICB3X2J5dGUoVFlQRV9TVE9QSVRFUiwgcCk7CisgICAgfQorICAgIGVsc2UgaWYgKHYgPT0gUHlfRWxsaXBzaXMpIHsKKyAgICAgICAgd19ieXRlKFRZUEVfRUxMSVBTSVMsIHApOworICAgIH0KKyAgICBlbHNlIGlmICh2ID09IFB5X0ZhbHNlKSB7CisgICAgICAgIHdfYnl0ZShUWVBFX0ZBTFNFLCBwKTsKKyAgICB9CisgICAgZWxzZSBpZiAodiA9PSBQeV9UcnVlKSB7CisgICAgICAgIHdfYnl0ZShUWVBFX1RSVUUsIHApOworICAgIH0KKyAgICBlbHNlIGlmIChQeUludF9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIGxvbmcgeCA9IFB5SW50X0FTX0xPTkcoKFB5SW50T2JqZWN0ICopdik7CiAjaWYgU0laRU9GX0xPTkcgPiA0Ci0JCWxvbmcgeSA9IFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQobG9uZywgeCwgMzEpOwotCQlpZiAoeSAmJiB5ICE9IC0xKSB7Ci0JCQl3X2J5dGUoVFlQRV9JTlQ2NCwgcCk7Ci0JCQl3X2xvbmc2NCh4LCBwKTsKLQkJfQotCQllbHNlCisgICAgICAgIGxvbmcgeSA9IFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQobG9uZywgeCwgMzEpOworICAgICAgICBpZiAoeSAmJiB5ICE9IC0xKSB7CisgICAgICAgICAgICB3X2J5dGUoVFlQRV9JTlQ2NCwgcCk7CisgICAgICAgICAgICB3X2xvbmc2NCh4LCBwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCiAjZW5kaWYKLQkJCXsKLQkJCXdfYnl0ZShUWVBFX0lOVCwgcCk7Ci0JCQl3X2xvbmcoeCwgcCk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoUHlMb25nX0NoZWNrRXhhY3QodikpIHsKLQkJUHlMb25nT2JqZWN0ICpvYiA9IChQeUxvbmdPYmplY3QgKil2OwotCQl3X2J5dGUoVFlQRV9MT05HLCBwKTsKLQkJbiA9IG9iLT5vYl9zaXplOwotCQl3X2xvbmcoKGxvbmcpbiwgcCk7Ci0JCWlmIChuIDwgMCkKLQkJCW4gPSAtbjsKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKLQkJCXdfc2hvcnQob2ItPm9iX2RpZ2l0W2ldLCBwKTsKLQl9Ci0JZWxzZSBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KHYpKSB7Ci0JCWlmIChwLT52ZXJzaW9uID4gMSkgewotCQkJdW5zaWduZWQgY2hhciBidWZbOF07Ci0JCQlpZiAoX1B5RmxvYXRfUGFjazgoUHlGbG9hdF9Bc0RvdWJsZSh2KSwgCi0JCQkJCSAgIGJ1ZiwgMSkgPCAwKSB7Ci0JCQkJcC0+ZXJyb3IgPSAxOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXdfYnl0ZShUWVBFX0JJTkFSWV9GTE9BVCwgcCk7Ci0JCQl3X3N0cmluZygoY2hhciopYnVmLCA4LCBwKTsKLQkJfQotCQllbHNlIHsKLQkJCWNoYXIgYnVmWzI1Nl07IC8qIFBsZW50eSB0byBmb3JtYXQgYW55IGRvdWJsZSAqLwotCQkJUHlGbG9hdF9Bc1JlcHJTdHJpbmcoYnVmLCAoUHlGbG9hdE9iamVjdCAqKXYpOwotCQkJbiA9IHN0cmxlbihidWYpOwotCQkJd19ieXRlKFRZUEVfRkxPQVQsIHApOwotCQkJd19ieXRlKChpbnQpbiwgcCk7Ci0JCQl3X3N0cmluZyhidWYsIChpbnQpbiwgcCk7Ci0JCX0KLQl9CisgICAgICAgICAgICB7CisgICAgICAgICAgICB3X2J5dGUoVFlQRV9JTlQsIHApOworICAgICAgICAgICAgd19sb25nKHgsIHApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIFB5TG9uZ09iamVjdCAqb2IgPSAoUHlMb25nT2JqZWN0ICopdjsKKyAgICAgICAgd19ieXRlKFRZUEVfTE9ORywgcCk7CisgICAgICAgIG4gPSBvYi0+b2Jfc2l6ZTsKKyAgICAgICAgd19sb25nKChsb25nKW4sIHApOworICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICBuID0gLW47CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICB3X3Nob3J0KG9iLT5vYl9kaWdpdFtpXSwgcCk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBpZiAocC0+dmVyc2lvbiA+IDEpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzhdOworICAgICAgICAgICAgaWYgKF9QeUZsb2F0X1BhY2s4KFB5RmxvYXRfQXNEb3VibGUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd19ieXRlKFRZUEVfQklOQVJZX0ZMT0FULCBwKTsKKyAgICAgICAgICAgIHdfc3RyaW5nKChjaGFyKilidWYsIDgsIHApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY2hhciBidWZbMjU2XTsgLyogUGxlbnR5IHRvIGZvcm1hdCBhbnkgZG91YmxlICovCisgICAgICAgICAgICBQeUZsb2F0X0FzUmVwclN0cmluZyhidWYsIChQeUZsb2F0T2JqZWN0ICopdik7CisgICAgICAgICAgICBuID0gc3RybGVuKGJ1Zik7CisgICAgICAgICAgICB3X2J5dGUoVFlQRV9GTE9BVCwgcCk7CisgICAgICAgICAgICB3X2J5dGUoKGludCluLCBwKTsKKyAgICAgICAgICAgIHdfc3RyaW5nKGJ1ZiwgKGludCluLCBwKTsKKyAgICAgICAgfQorICAgIH0KICNpZm5kZWYgV0lUSE9VVF9DT01QTEVYCi0JZWxzZSBpZiAoUHlDb21wbGV4X0NoZWNrRXhhY3QodikpIHsKLQkJaWYgKHAtPnZlcnNpb24gPiAxKSB7Ci0JCQl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKLQkJCWlmIChfUHlGbG9hdF9QYWNrOChQeUNvbXBsZXhfUmVhbEFzRG91YmxlKHYpLAotCQkJCQkgICBidWYsIDEpIDwgMCkgewotCQkJCXAtPmVycm9yID0gMTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl3X2J5dGUoVFlQRV9CSU5BUllfQ09NUExFWCwgcCk7Ci0JCQl3X3N0cmluZygoY2hhciopYnVmLCA4LCBwKTsKLQkJCWlmIChfUHlGbG9hdF9QYWNrOChQeUNvbXBsZXhfSW1hZ0FzRG91YmxlKHYpLCAKLQkJCQkJICAgYnVmLCAxKSA8IDApIHsKLQkJCQlwLT5lcnJvciA9IDE7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJd19zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFyIGJ1ZlsyNTZdOyAvKiBQbGVudHkgdG8gZm9ybWF0IGFueSBkb3VibGUgKi8KLQkJCVB5RmxvYXRPYmplY3QgKnRlbXA7Ci0JCQl3X2J5dGUoVFlQRV9DT01QTEVYLCBwKTsKLQkJCXRlbXAgPSAoUHlGbG9hdE9iamVjdCopUHlGbG9hdF9Gcm9tRG91YmxlKAotCQkJCVB5Q29tcGxleF9SZWFsQXNEb3VibGUodikpOwotCQkJaWYgKCF0ZW1wKSB7Ci0JCQkJcC0+ZXJyb3IgPSAxOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVB5RmxvYXRfQXNSZXByU3RyaW5nKGJ1ZiwgdGVtcCk7Ci0JCQlQeV9ERUNSRUYodGVtcCk7Ci0JCQluID0gc3RybGVuKGJ1Zik7Ci0JCQl3X2J5dGUoKGludCluLCBwKTsKLQkJCXdfc3RyaW5nKGJ1ZiwgKGludCluLCBwKTsKLQkJCXRlbXAgPSAoUHlGbG9hdE9iamVjdCopUHlGbG9hdF9Gcm9tRG91YmxlKAotCQkJCVB5Q29tcGxleF9JbWFnQXNEb3VibGUodikpOwotCQkJaWYgKCF0ZW1wKSB7Ci0JCQkJcC0+ZXJyb3IgPSAxOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCVB5RmxvYXRfQXNSZXByU3RyaW5nKGJ1ZiwgdGVtcCk7Ci0JCQlQeV9ERUNSRUYodGVtcCk7Ci0JCQluID0gc3RybGVuKGJ1Zik7Ci0JCQl3X2J5dGUoKGludCluLCBwKTsKLQkJCXdfc3RyaW5nKGJ1ZiwgKGludCluLCBwKTsKLQkJfQotCX0KKyAgICBlbHNlIGlmIChQeUNvbXBsZXhfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBpZiAocC0+dmVyc2lvbiA+IDEpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYnVmWzhdOworICAgICAgICAgICAgaWYgKF9QeUZsb2F0X1BhY2s4KFB5Q29tcGxleF9SZWFsQXNEb3VibGUodiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd19ieXRlKFRZUEVfQklOQVJZX0NPTVBMRVgsIHApOworICAgICAgICAgICAgd19zdHJpbmcoKGNoYXIqKWJ1ZiwgOCwgcCk7CisgICAgICAgICAgICBpZiAoX1B5RmxvYXRfUGFjazgoUHlDb21wbGV4X0ltYWdBc0RvdWJsZSh2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIDEpIDwgMCkgeworICAgICAgICAgICAgICAgIHAtPmVycm9yID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3X3N0cmluZygoY2hhciopYnVmLCA4LCBwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07IC8qIFBsZW50eSB0byBmb3JtYXQgYW55IGRvdWJsZSAqLworICAgICAgICAgICAgUHlGbG9hdE9iamVjdCAqdGVtcDsKKyAgICAgICAgICAgIHdfYnl0ZShUWVBFX0NPTVBMRVgsIHApOworICAgICAgICAgICAgdGVtcCA9IChQeUZsb2F0T2JqZWN0KilQeUZsb2F0X0Zyb21Eb3VibGUoCisgICAgICAgICAgICAgICAgUHlDb21wbGV4X1JlYWxBc0RvdWJsZSh2KSk7CisgICAgICAgICAgICBpZiAoIXRlbXApIHsKKyAgICAgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlGbG9hdF9Bc1JlcHJTdHJpbmcoYnVmLCB0ZW1wKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgICAgIG4gPSBzdHJsZW4oYnVmKTsKKyAgICAgICAgICAgIHdfYnl0ZSgoaW50KW4sIHApOworICAgICAgICAgICAgd19zdHJpbmcoYnVmLCAoaW50KW4sIHApOworICAgICAgICAgICAgdGVtcCA9IChQeUZsb2F0T2JqZWN0KilQeUZsb2F0X0Zyb21Eb3VibGUoCisgICAgICAgICAgICAgICAgUHlDb21wbGV4X0ltYWdBc0RvdWJsZSh2KSk7CisgICAgICAgICAgICBpZiAoIXRlbXApIHsKKyAgICAgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlGbG9hdF9Bc1JlcHJTdHJpbmcoYnVmLCB0ZW1wKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgICAgIG4gPSBzdHJsZW4oYnVmKTsKKyAgICAgICAgICAgIHdfYnl0ZSgoaW50KW4sIHApOworICAgICAgICAgICAgd19zdHJpbmcoYnVmLCAoaW50KW4sIHApOworICAgICAgICB9CisgICAgfQogI2VuZGlmCi0JZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSkgewotCQlpZiAocC0+c3RyaW5ncyAmJiBQeVN0cmluZ19DSEVDS19JTlRFUk5FRCh2KSkgewotCQkJUHlPYmplY3QgKm8gPSBQeURpY3RfR2V0SXRlbShwLT5zdHJpbmdzLCB2KTsKLQkJCWlmIChvKSB7Ci0JCQkJbG9uZyB3ID0gUHlJbnRfQXNMb25nKG8pOwotCQkJCXdfYnl0ZShUWVBFX1NUUklOR1JFRiwgcCk7Ci0JCQkJd19sb25nKHcsIHApOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBvazsKLQkJCQlvID0gUHlJbnRfRnJvbVNzaXplX3QoUHlEaWN0X1NpemUocC0+c3RyaW5ncykpOwotCQkJCW9rID0gbyAmJgotCQkJCSAgICAgUHlEaWN0X1NldEl0ZW0ocC0+c3RyaW5ncywgdiwgbykgPj0gMDsKLQkJCQlQeV9YREVDUkVGKG8pOwotCQkJCWlmICghb2spIHsKLQkJCQkJcC0+ZGVwdGgtLTsKLQkJCQkJcC0+ZXJyb3IgPSAxOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXdfYnl0ZShUWVBFX0lOVEVSTkVELCBwKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXdfYnl0ZShUWVBFX1NUUklORywgcCk7Ci0JCX0KLQkJbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCQlpZiAobiA+IElOVF9NQVgpIHsKLQkJCS8qIGh1Z2Ugc3RyaW5ncyBhcmUgbm90IHN1cHBvcnRlZCAqLwotCQkJcC0+ZGVwdGgtLTsKLQkJCXAtPmVycm9yID0gMTsKLQkJCXJldHVybjsKLQkJfQotCQl3X2xvbmcoKGxvbmcpbiwgcCk7Ci0JCXdfc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyh2KSwgKGludCluLCBwKTsKLQl9CisgICAgZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBpZiAocC0+c3RyaW5ncyAmJiBQeVN0cmluZ19DSEVDS19JTlRFUk5FRCh2KSkgeworICAgICAgICAgICAgUHlPYmplY3QgKm8gPSBQeURpY3RfR2V0SXRlbShwLT5zdHJpbmdzLCB2KTsKKyAgICAgICAgICAgIGlmIChvKSB7CisgICAgICAgICAgICAgICAgbG9uZyB3ID0gUHlJbnRfQXNMb25nKG8pOworICAgICAgICAgICAgICAgIHdfYnl0ZShUWVBFX1NUUklOR1JFRiwgcCk7CisgICAgICAgICAgICAgICAgd19sb25nKHcsIHApOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCBvazsKKyAgICAgICAgICAgICAgICBvID0gUHlJbnRfRnJvbVNzaXplX3QoUHlEaWN0X1NpemUocC0+c3RyaW5ncykpOworICAgICAgICAgICAgICAgIG9rID0gbyAmJgorICAgICAgICAgICAgICAgICAgICAgUHlEaWN0X1NldEl0ZW0ocC0+c3RyaW5ncywgdiwgbykgPj0gMDsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKG8pOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgcC0+ZGVwdGgtLTsKKyAgICAgICAgICAgICAgICAgICAgcC0+ZXJyb3IgPSAxOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdfYnl0ZShUWVBFX0lOVEVSTkVELCBwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHdfYnl0ZShUWVBFX1NUUklORywgcCk7CisgICAgICAgIH0KKyAgICAgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOworICAgICAgICBpZiAobiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIC8qIGh1Z2Ugc3RyaW5ncyBhcmUgbm90IHN1cHBvcnRlZCAqLworICAgICAgICAgICAgcC0+ZGVwdGgtLTsKKyAgICAgICAgICAgIHAtPmVycm9yID0gMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3X2xvbmcoKGxvbmcpbiwgcCk7CisgICAgICAgIHdfc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyh2KSwgKGludCluLCBwKTsKKyAgICB9CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHYpKSB7Ci0JICAgICAgICBQeU9iamVjdCAqdXRmODsKLQkJdXRmOCA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodik7Ci0JCWlmICh1dGY4ID09IE5VTEwpIHsKLQkJCXAtPmRlcHRoLS07Ci0JCQlwLT5lcnJvciA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd19ieXRlKFRZUEVfVU5JQ09ERSwgcCk7Ci0JCW4gPSBQeVN0cmluZ19HRVRfU0laRSh1dGY4KTsKLQkJaWYgKG4gPiBJTlRfTUFYKSB7Ci0JCQlwLT5kZXB0aC0tOwotCQkJcC0+ZXJyb3IgPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JCXdfbG9uZygobG9uZyluLCBwKTsKLQkJd19zdHJpbmcoUHlTdHJpbmdfQVNfU1RSSU5HKHV0ZjgpLCAoaW50KW4sIHApOwotCQlQeV9ERUNSRUYodXRmOCk7Ci0JfQorICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHYpKSB7CisgICAgICAgIFB5T2JqZWN0ICp1dGY4OworICAgICAgICB1dGY4ID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyh2KTsKKyAgICAgICAgaWYgKHV0ZjggPT0gTlVMTCkgeworICAgICAgICAgICAgcC0+ZGVwdGgtLTsKKyAgICAgICAgICAgIHAtPmVycm9yID0gMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3X2J5dGUoVFlQRV9VTklDT0RFLCBwKTsKKyAgICAgICAgbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHV0ZjgpOworICAgICAgICBpZiAobiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIHAtPmRlcHRoLS07CisgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd19sb25nKChsb25nKW4sIHApOworICAgICAgICB3X3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodXRmOCksIChpbnQpbiwgcCk7CisgICAgICAgIFB5X0RFQ1JFRih1dGY4KTsKKyAgICB9CiAjZW5kaWYKLQllbHNlIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QodikpIHsKLQkJd19ieXRlKFRZUEVfVFVQTEUsIHApOwotCQluID0gUHlUdXBsZV9TaXplKHYpOwotCQl3X2xvbmcoKGxvbmcpbiwgcCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXdfb2JqZWN0KFB5VHVwbGVfR0VUX0lURU0odiwgaSksIHApOwotCQl9Ci0JfQotCWVsc2UgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHYpKSB7Ci0JCXdfYnl0ZShUWVBFX0xJU1QsIHApOwotCQluID0gUHlMaXN0X0dFVF9TSVpFKHYpOwotCQl3X2xvbmcoKGxvbmcpbiwgcCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCXdfb2JqZWN0KFB5TGlzdF9HRVRfSVRFTSh2LCBpKSwgcCk7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoUHlEaWN0X0NoZWNrRXhhY3QodikpIHsKLQkJUHlfc3NpemVfdCBwb3M7Ci0JCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLQkJd19ieXRlKFRZUEVfRElDVCwgcCk7Ci0JCS8qIFRoaXMgb25lIGlzIE5VTEwgb2JqZWN0IHRlcm1pbmF0ZWQhICovCi0JCXBvcyA9IDA7Ci0JCXdoaWxlIChQeURpY3RfTmV4dCh2LCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7Ci0JCQl3X29iamVjdChrZXksIHApOwotCQkJd19vYmplY3QodmFsdWUsIHApOwotCQl9Ci0JCXdfb2JqZWN0KChQeU9iamVjdCAqKU5VTEwsIHApOwotCX0KLQllbHNlIGlmIChQeUFueVNldF9DaGVja0V4YWN0KHYpKSB7Ci0JCVB5T2JqZWN0ICp2YWx1ZSwgKml0OworICAgIGVsc2UgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICB3X2J5dGUoVFlQRV9UVVBMRSwgcCk7CisgICAgICAgIG4gPSBQeVR1cGxlX1NpemUodik7CisgICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgd19vYmplY3QoUHlUdXBsZV9HRVRfSVRFTSh2LCBpKSwgcCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoUHlMaXN0X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgd19ieXRlKFRZUEVfTElTVCwgcCk7CisgICAgICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUodik7CisgICAgICAgIHdfbG9uZygobG9uZyluLCBwKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgd19vYmplY3QoUHlMaXN0X0dFVF9JVEVNKHYsIGkpLCBwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChQeURpY3RfQ2hlY2tFeGFjdCh2KSkgeworICAgICAgICBQeV9zc2l6ZV90IHBvczsKKyAgICAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgICAgICB3X2J5dGUoVFlQRV9ESUNULCBwKTsKKyAgICAgICAgLyogVGhpcyBvbmUgaXMgTlVMTCBvYmplY3QgdGVybWluYXRlZCEgKi8KKyAgICAgICAgcG9zID0gMDsKKyAgICAgICAgd2hpbGUgKFB5RGljdF9OZXh0KHYsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIHdfb2JqZWN0KGtleSwgcCk7CisgICAgICAgICAgICB3X29iamVjdCh2YWx1ZSwgcCk7CisgICAgICAgIH0KKyAgICAgICAgd19vYmplY3QoKFB5T2JqZWN0ICopTlVMTCwgcCk7CisgICAgfQorICAgIGVsc2UgaWYgKFB5QW55U2V0X0NoZWNrRXhhY3QodikpIHsKKyAgICAgICAgUHlPYmplY3QgKnZhbHVlLCAqaXQ7CiAKLQkJaWYgKFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmUHlTZXRfVHlwZSkpCi0JCQl3X2J5dGUoVFlQRV9TRVQsIHApOwotCQllbHNlCi0JCQl3X2J5dGUoVFlQRV9GUk9aRU5TRVQsIHApOwotCQluID0gUHlPYmplY3RfU2l6ZSh2KTsKLQkJaWYgKG4gPT0gLTEpIHsKLQkJCXAtPmRlcHRoLS07Ci0JCQlwLT5lcnJvciA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd19sb25nKChsb25nKW4sIHApOwotCQlpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7Ci0JCWlmIChpdCA9PSBOVUxMKSB7Ci0JCQlwLT5kZXB0aC0tOwotCQkJcC0+ZXJyb3IgPSAxOwotCQkJcmV0dXJuOwotCQl9Ci0JCXdoaWxlICgodmFsdWUgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLQkJCXdfb2JqZWN0KHZhbHVlLCBwKTsKLQkJCVB5X0RFQ1JFRih2YWx1ZSk7Ci0JCX0KLQkJUHlfREVDUkVGKGl0KTsKLQkJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCXAtPmRlcHRoLS07Ci0JCQlwLT5lcnJvciA9IDE7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoUHlDb2RlX0NoZWNrKHYpKSB7Ci0JCVB5Q29kZU9iamVjdCAqY28gPSAoUHlDb2RlT2JqZWN0ICopdjsKLQkJd19ieXRlKFRZUEVfQ09ERSwgcCk7Ci0JCXdfbG9uZyhjby0+Y29fYXJnY291bnQsIHApOwotCQl3X2xvbmcoY28tPmNvX25sb2NhbHMsIHApOwotCQl3X2xvbmcoY28tPmNvX3N0YWNrc2l6ZSwgcCk7Ci0JCXdfbG9uZyhjby0+Y29fZmxhZ3MsIHApOwotCQl3X29iamVjdChjby0+Y29fY29kZSwgcCk7Ci0JCXdfb2JqZWN0KGNvLT5jb19jb25zdHMsIHApOwotCQl3X29iamVjdChjby0+Y29fbmFtZXMsIHApOwotCQl3X29iamVjdChjby0+Y29fdmFybmFtZXMsIHApOwotCQl3X29iamVjdChjby0+Y29fZnJlZXZhcnMsIHApOwotCQl3X29iamVjdChjby0+Y29fY2VsbHZhcnMsIHApOwotCQl3X29iamVjdChjby0+Y29fZmlsZW5hbWUsIHApOwotCQl3X29iamVjdChjby0+Y29fbmFtZSwgcCk7Ci0JCXdfbG9uZyhjby0+Y29fZmlyc3RsaW5lbm8sIHApOwotCQl3X29iamVjdChjby0+Y29fbG5vdGFiLCBwKTsKLQl9Ci0JZWxzZSBpZiAoUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyKHYpKSB7Ci0JCS8qIFdyaXRlIHVua25vd24gYnVmZmVyLXN0eWxlIG9iamVjdHMgYXMgYSBzdHJpbmcgKi8KLQkJY2hhciAqczsKLQkJUHlCdWZmZXJQcm9jcyAqcGIgPSB2LT5vYl90eXBlLT50cF9hc19idWZmZXI7Ci0JCXdfYnl0ZShUWVBFX1NUUklORywgcCk7Ci0JCW4gPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKSh2LCAwLCAodm9pZCAqKikmcyk7Ci0JCWlmIChuID4gSU5UX01BWCkgewotCQkJcC0+ZGVwdGgtLTsKLQkJCXAtPmVycm9yID0gMTsKLQkJCXJldHVybjsKLQkJfQotCQl3X2xvbmcoKGxvbmcpbiwgcCk7Ci0JCXdfc3RyaW5nKHMsIChpbnQpbiwgcCk7Ci0JfQotCWVsc2UgewotCQl3X2J5dGUoVFlQRV9VTktOT1dOLCBwKTsKLQkJcC0+ZXJyb3IgPSAxOwotCX0KKyAgICAgICAgaWYgKFB5T2JqZWN0X1R5cGVDaGVjayh2LCAmUHlTZXRfVHlwZSkpCisgICAgICAgICAgICB3X2J5dGUoVFlQRV9TRVQsIHApOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3X2J5dGUoVFlQRV9GUk9aRU5TRVQsIHApOworICAgICAgICBuID0gUHlPYmplY3RfU2l6ZSh2KTsKKyAgICAgICAgaWYgKG4gPT0gLTEpIHsKKyAgICAgICAgICAgIHAtPmRlcHRoLS07CisgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgd19sb25nKChsb25nKW4sIHApOworICAgICAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICBwLT5kZXB0aC0tOworICAgICAgICAgICAgcC0+ZXJyb3IgPSAxOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgodmFsdWUgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHdfb2JqZWN0KHZhbHVlLCBwKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIHAtPmRlcHRoLS07CisgICAgICAgICAgICBwLT5lcnJvciA9IDE7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoUHlDb2RlX0NoZWNrKHYpKSB7CisgICAgICAgIFB5Q29kZU9iamVjdCAqY28gPSAoUHlDb2RlT2JqZWN0ICopdjsKKyAgICAgICAgd19ieXRlKFRZUEVfQ09ERSwgcCk7CisgICAgICAgIHdfbG9uZyhjby0+Y29fYXJnY291bnQsIHApOworICAgICAgICB3X2xvbmcoY28tPmNvX25sb2NhbHMsIHApOworICAgICAgICB3X2xvbmcoY28tPmNvX3N0YWNrc2l6ZSwgcCk7CisgICAgICAgIHdfbG9uZyhjby0+Y29fZmxhZ3MsIHApOworICAgICAgICB3X29iamVjdChjby0+Y29fY29kZSwgcCk7CisgICAgICAgIHdfb2JqZWN0KGNvLT5jb19jb25zdHMsIHApOworICAgICAgICB3X29iamVjdChjby0+Y29fbmFtZXMsIHApOworICAgICAgICB3X29iamVjdChjby0+Y29fdmFybmFtZXMsIHApOworICAgICAgICB3X29iamVjdChjby0+Y29fZnJlZXZhcnMsIHApOworICAgICAgICB3X29iamVjdChjby0+Y29fY2VsbHZhcnMsIHApOworICAgICAgICB3X29iamVjdChjby0+Y29fZmlsZW5hbWUsIHApOworICAgICAgICB3X29iamVjdChjby0+Y29fbmFtZSwgcCk7CisgICAgICAgIHdfbG9uZyhjby0+Y29fZmlyc3RsaW5lbm8sIHApOworICAgICAgICB3X29iamVjdChjby0+Y29fbG5vdGFiLCBwKTsKKyAgICB9CisgICAgZWxzZSBpZiAoUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyKHYpKSB7CisgICAgICAgIC8qIFdyaXRlIHVua25vd24gYnVmZmVyLXN0eWxlIG9iamVjdHMgYXMgYSBzdHJpbmcgKi8KKyAgICAgICAgY2hhciAqczsKKyAgICAgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSB2LT5vYl90eXBlLT50cF9hc19idWZmZXI7CisgICAgICAgIHdfYnl0ZShUWVBFX1NUUklORywgcCk7CisgICAgICAgIG4gPSAoKnBiLT5iZl9nZXRyZWFkYnVmZmVyKSh2LCAwLCAodm9pZCAqKikmcyk7CisgICAgICAgIGlmIChuID4gSU5UX01BWCkgeworICAgICAgICAgICAgcC0+ZGVwdGgtLTsKKyAgICAgICAgICAgIHAtPmVycm9yID0gMTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3X2xvbmcoKGxvbmcpbiwgcCk7CisgICAgICAgIHdfc3RyaW5nKHMsIChpbnQpbiwgcCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB3X2J5dGUoVFlQRV9VTktOT1dOLCBwKTsKKyAgICAgICAgcC0+ZXJyb3IgPSAxOworICAgIH0KICAgIGV4aXQ6Ci0JcC0+ZGVwdGgtLTsKKyAgICBwLT5kZXB0aC0tOwogfQogCiAvKiB2ZXJzaW9uIGN1cnJlbnRseSBoYXMgbm8gZWZmZWN0IGZvciB3cml0aW5nIGxvbmdzLiAqLwogdm9pZAogUHlNYXJzaGFsX1dyaXRlTG9uZ1RvRmlsZShsb25nIHgsIEZJTEUgKmZwLCBpbnQgdmVyc2lvbikKIHsKLQlXRklMRSB3ZjsKLQl3Zi5mcCA9IGZwOwotCXdmLmVycm9yID0gMDsKLQl3Zi5kZXB0aCA9IDA7Ci0Jd2Yuc3RyaW5ncyA9IE5VTEw7Ci0Jd2YudmVyc2lvbiA9IHZlcnNpb247Ci0Jd19sb25nKHgsICZ3Zik7CisgICAgV0ZJTEUgd2Y7CisgICAgd2YuZnAgPSBmcDsKKyAgICB3Zi5lcnJvciA9IDA7CisgICAgd2YuZGVwdGggPSAwOworICAgIHdmLnN0cmluZ3MgPSBOVUxMOworICAgIHdmLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIHdfbG9uZyh4LCAmd2YpOwogfQogCiB2b2lkCiBQeU1hcnNoYWxfV3JpdGVPYmplY3RUb0ZpbGUoUHlPYmplY3QgKngsIEZJTEUgKmZwLCBpbnQgdmVyc2lvbikKIHsKLQlXRklMRSB3ZjsKLQl3Zi5mcCA9IGZwOwotCXdmLmVycm9yID0gMDsKLQl3Zi5kZXB0aCA9IDA7Ci0Jd2Yuc3RyaW5ncyA9ICh2ZXJzaW9uID4gMCkgPyBQeURpY3RfTmV3KCkgOiBOVUxMOwotCXdmLnZlcnNpb24gPSB2ZXJzaW9uOwotCXdfb2JqZWN0KHgsICZ3Zik7Ci0JUHlfWERFQ1JFRih3Zi5zdHJpbmdzKTsKKyAgICBXRklMRSB3ZjsKKyAgICB3Zi5mcCA9IGZwOworICAgIHdmLmVycm9yID0gMDsKKyAgICB3Zi5kZXB0aCA9IDA7CisgICAgd2Yuc3RyaW5ncyA9ICh2ZXJzaW9uID4gMCkgPyBQeURpY3RfTmV3KCkgOiBOVUxMOworICAgIHdmLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIHdfb2JqZWN0KHgsICZ3Zik7CisgICAgUHlfWERFQ1JFRih3Zi5zdHJpbmdzKTsKIH0KIAogdHlwZWRlZiBXRklMRSBSRklMRTsgLyogU2FtZSBzdHJ1Y3Qgd2l0aCBkaWZmZXJlbnQgaW52YXJpYW50cyAqLwpAQCAtNDMwLDQ5ICs0MzAsNDkgQEAKIHN0YXRpYyBpbnQKIHJfc3RyaW5nKGNoYXIgKnMsIGludCBuLCBSRklMRSAqcCkKIHsKLQlpZiAocC0+ZnAgIT0gTlVMTCkKLQkJLyogVGhlIHJlc3VsdCBmaXRzIGludG8gaW50IGJlY2F1c2UgaXQgbXVzdCBiZSA8PW4uICovCi0JCXJldHVybiAoaW50KWZyZWFkKHMsIDEsIG4sIHAtPmZwKTsKLQlpZiAocC0+ZW5kIC0gcC0+cHRyIDwgbikKLQkJbiA9IChpbnQpKHAtPmVuZCAtIHAtPnB0cik7Ci0JbWVtY3B5KHMsIHAtPnB0ciwgbik7Ci0JcC0+cHRyICs9IG47Ci0JcmV0dXJuIG47CisgICAgaWYgKHAtPmZwICE9IE5VTEwpCisgICAgICAgIC8qIFRoZSByZXN1bHQgZml0cyBpbnRvIGludCBiZWNhdXNlIGl0IG11c3QgYmUgPD1uLiAqLworICAgICAgICByZXR1cm4gKGludClmcmVhZChzLCAxLCBuLCBwLT5mcCk7CisgICAgaWYgKHAtPmVuZCAtIHAtPnB0ciA8IG4pCisgICAgICAgIG4gPSAoaW50KShwLT5lbmQgLSBwLT5wdHIpOworICAgIG1lbWNweShzLCBwLT5wdHIsIG4pOworICAgIHAtPnB0ciArPSBuOworICAgIHJldHVybiBuOwogfQogCiBzdGF0aWMgaW50CiByX3Nob3J0KFJGSUxFICpwKQogewotCXJlZ2lzdGVyIHNob3J0IHg7Ci0JeCA9IHJfYnl0ZShwKTsKLQl4IHw9IHJfYnl0ZShwKSA8PCA4OwotCS8qIFNpZ24tZXh0ZW5zaW9uLCBpbiBjYXNlIHNob3J0IGdyZWF0ZXIgdGhhbiAxNiBiaXRzICovCi0JeCB8PSAtKHggJiAweDgwMDApOwotCXJldHVybiB4OworICAgIHJlZ2lzdGVyIHNob3J0IHg7CisgICAgeCA9IHJfYnl0ZShwKTsKKyAgICB4IHw9IHJfYnl0ZShwKSA8PCA4OworICAgIC8qIFNpZ24tZXh0ZW5zaW9uLCBpbiBjYXNlIHNob3J0IGdyZWF0ZXIgdGhhbiAxNiBiaXRzICovCisgICAgeCB8PSAtKHggJiAweDgwMDApOworICAgIHJldHVybiB4OwogfQogCiBzdGF0aWMgbG9uZwogcl9sb25nKFJGSUxFICpwKQogewotCXJlZ2lzdGVyIGxvbmcgeDsKLQlyZWdpc3RlciBGSUxFICpmcCA9IHAtPmZwOwotCWlmIChmcCkgewotCQl4ID0gZ2V0YyhmcCk7Ci0JCXggfD0gKGxvbmcpZ2V0YyhmcCkgPDwgODsKLQkJeCB8PSAobG9uZylnZXRjKGZwKSA8PCAxNjsKLQkJeCB8PSAobG9uZylnZXRjKGZwKSA8PCAyNDsKLQl9Ci0JZWxzZSB7Ci0JCXggPSByc19ieXRlKHApOwotCQl4IHw9IChsb25nKXJzX2J5dGUocCkgPDwgODsKLQkJeCB8PSAobG9uZylyc19ieXRlKHApIDw8IDE2OwotCQl4IHw9IChsb25nKXJzX2J5dGUocCkgPDwgMjQ7Ci0JfQorICAgIHJlZ2lzdGVyIGxvbmcgeDsKKyAgICByZWdpc3RlciBGSUxFICpmcCA9IHAtPmZwOworICAgIGlmIChmcCkgeworICAgICAgICB4ID0gZ2V0YyhmcCk7CisgICAgICAgIHggfD0gKGxvbmcpZ2V0YyhmcCkgPDwgODsKKyAgICAgICAgeCB8PSAobG9uZylnZXRjKGZwKSA8PCAxNjsKKyAgICAgICAgeCB8PSAobG9uZylnZXRjKGZwKSA8PCAyNDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHggPSByc19ieXRlKHApOworICAgICAgICB4IHw9IChsb25nKXJzX2J5dGUocCkgPDwgODsKKyAgICAgICAgeCB8PSAobG9uZylyc19ieXRlKHApIDw8IDE2OworICAgICAgICB4IHw9IChsb25nKXJzX2J5dGUocCkgPDwgMjQ7CisgICAgfQogI2lmIFNJWkVPRl9MT05HID4gNAotCS8qIFNpZ24gZXh0ZW5zaW9uIGZvciA2NC1iaXQgbWFjaGluZXMgKi8KLQl4IHw9IC0oeCAmIDB4ODAwMDAwMDBMKTsKKyAgICAvKiBTaWduIGV4dGVuc2lvbiBmb3IgNjQtYml0IG1hY2hpbmVzICovCisgICAgeCB8PSAtKHggJiAweDgwMDAwMDAwTCk7CiAjZW5kaWYKLQlyZXR1cm4geDsKKyAgICByZXR1cm4geDsKIH0KIAogLyogcl9sb25nNjQgZGVhbHMgd2l0aCB0aGUgVFlQRV9JTlQ2NCBjb2RlLiAgT24gYSBtYWNoaW5lIHdpdGgKQEAgLTQ4NSw1MzcgKzQ4NSw1MzcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByX2xvbmc2NChSRklMRSAqcCkKIHsKLQlsb25nIGxvNCA9IHJfbG9uZyhwKTsKLQlsb25nIGhpNCA9IHJfbG9uZyhwKTsKKyAgICBsb25nIGxvNCA9IHJfbG9uZyhwKTsKKyAgICBsb25nIGhpNCA9IHJfbG9uZyhwKTsKICNpZiBTSVpFT0ZfTE9ORyA+IDQKLQlsb25nIHggPSAoaGk0IDw8IDMyKSB8IChsbzQgJiAweEZGRkZGRkZGTCk7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHgpOworICAgIGxvbmcgeCA9IChoaTQgPDwgMzIpIHwgKGxvNCAmIDB4RkZGRkZGRkZMKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoeCk7CiAjZWxzZQotCXVuc2lnbmVkIGNoYXIgYnVmWzhdOwotCWludCBvbmUgPSAxOwotCWludCBpc19saXR0bGVfZW5kaWFuID0gKGludCkqKGNoYXIqKSZvbmU7Ci0JaWYgKGlzX2xpdHRsZV9lbmRpYW4pIHsKLQkJbWVtY3B5KGJ1ZiwgJmxvNCwgNCk7Ci0JCW1lbWNweShidWYrNCwgJmhpNCwgNCk7Ci0JfQotCWVsc2UgewotCQltZW1jcHkoYnVmLCAmaGk0LCA0KTsKLQkJbWVtY3B5KGJ1Zis0LCAmbG80LCA0KTsKLQl9Ci0JcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheShidWYsIDgsIGlzX2xpdHRsZV9lbmRpYW4sIDEpOworICAgIHVuc2lnbmVkIGNoYXIgYnVmWzhdOworICAgIGludCBvbmUgPSAxOworICAgIGludCBpc19saXR0bGVfZW5kaWFuID0gKGludCkqKGNoYXIqKSZvbmU7CisgICAgaWYgKGlzX2xpdHRsZV9lbmRpYW4pIHsKKyAgICAgICAgbWVtY3B5KGJ1ZiwgJmxvNCwgNCk7CisgICAgICAgIG1lbWNweShidWYrNCwgJmhpNCwgNCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtZW1jcHkoYnVmLCAmaGk0LCA0KTsKKyAgICAgICAgbWVtY3B5KGJ1Zis0LCAmbG80LCA0KTsKKyAgICB9CisgICAgcmV0dXJuIF9QeUxvbmdfRnJvbUJ5dGVBcnJheShidWYsIDgsIGlzX2xpdHRsZV9lbmRpYW4sIDEpOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByX29iamVjdChSRklMRSAqcCkKIHsKLQkvKiBOVUxMIGlzIGEgdmFsaWQgcmV0dXJuIHZhbHVlLCBpdCBkb2VzIG5vdCBuZWNlc3NhcmlseSBtZWFucyB0aGF0Ci0JICAgYW4gZXhjZXB0aW9uIGlzIHNldC4gKi8KLQlQeU9iamVjdCAqdiwgKnYyOwotCWxvbmcgaSwgbjsKLQlpbnQgdHlwZSA9IHJfYnl0ZShwKTsKLQlQeU9iamVjdCAqcmV0dmFsOworICAgIC8qIE5VTEwgaXMgYSB2YWxpZCByZXR1cm4gdmFsdWUsIGl0IGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW5zIHRoYXQKKyAgICAgICBhbiBleGNlcHRpb24gaXMgc2V0LiAqLworICAgIFB5T2JqZWN0ICp2LCAqdjI7CisgICAgbG9uZyBpLCBuOworICAgIGludCB0eXBlID0gcl9ieXRlKHApOworICAgIFB5T2JqZWN0ICpyZXR2YWw7CiAKLQlwLT5kZXB0aCsrOworICAgIHAtPmRlcHRoKys7CiAKLQlpZiAocC0+ZGVwdGggPiBNQVhfTUFSU0hBTF9TVEFDS19ERVBUSCkgewotCQlwLT5kZXB0aC0tOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInJlY3Vyc2lvbiBsaW1pdCBleGNlZWRlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHAtPmRlcHRoID4gTUFYX01BUlNIQUxfU1RBQ0tfREVQVEgpIHsKKyAgICAgICAgcC0+ZGVwdGgtLTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJyZWN1cnNpb24gbGltaXQgZXhjZWVkZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3dpdGNoICh0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CiAKLQljYXNlIEVPRjoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCSJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJcmV0dmFsID0gTlVMTDsKLQkJYnJlYWs7CisgICAgY2FzZSBFT0Y6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfTlVMTDoKLQkJcmV0dmFsID0gTlVMTDsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX05VTEw6CisgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX05PTkU6Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dmFsID0gUHlfTm9uZTsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX05PTkU6CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dmFsID0gUHlfTm9uZTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfU1RPUElURVI6Ci0JCVB5X0lOQ1JFRihQeUV4Y19TdG9wSXRlcmF0aW9uKTsKLQkJcmV0dmFsID0gUHlFeGNfU3RvcEl0ZXJhdGlvbjsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX1NUT1BJVEVSOgorICAgICAgICBQeV9JTkNSRUYoUHlFeGNfU3RvcEl0ZXJhdGlvbik7CisgICAgICAgIHJldHZhbCA9IFB5RXhjX1N0b3BJdGVyYXRpb247CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX0VMTElQU0lTOgotCQlQeV9JTkNSRUYoUHlfRWxsaXBzaXMpOwotCQlyZXR2YWwgPSBQeV9FbGxpcHNpczsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX0VMTElQU0lTOgorICAgICAgICBQeV9JTkNSRUYoUHlfRWxsaXBzaXMpOworICAgICAgICByZXR2YWwgPSBQeV9FbGxpcHNpczsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfRkFMU0U6Ci0JCVB5X0lOQ1JFRihQeV9GYWxzZSk7Ci0JCXJldHZhbCA9IFB5X0ZhbHNlOwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfRkFMU0U6CisgICAgICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7CisgICAgICAgIHJldHZhbCA9IFB5X0ZhbHNlOworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9UUlVFOgotCQlQeV9JTkNSRUYoUHlfVHJ1ZSk7Ci0JCXJldHZhbCA9IFB5X1RydWU7Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9UUlVFOgorICAgICAgICBQeV9JTkNSRUYoUHlfVHJ1ZSk7CisgICAgICAgIHJldHZhbCA9IFB5X1RydWU7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSBUWVBFX0lOVDoKLQkJcmV0dmFsID0gUHlJbnRfRnJvbUxvbmcocl9sb25nKHApKTsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX0lOVDoKKyAgICAgICAgcmV0dmFsID0gUHlJbnRfRnJvbUxvbmcocl9sb25nKHApKTsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfSU5UNjQ6Ci0JCXJldHZhbCA9IHJfbG9uZzY0KHApOwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfSU5UNjQ6CisgICAgICAgIHJldHZhbCA9IHJfbG9uZzY0KHApOworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9MT05HOgotCQl7Ci0JCQlpbnQgc2l6ZTsKLQkJCVB5TG9uZ09iamVjdCAqb2I7Ci0JCQluID0gcl9sb25nKHApOwotCQkJaWYgKG4gPCAtSU5UX01BWCB8fCBuID4gSU5UX01BWCkgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotCQkJCQkJImJhZCBtYXJzaGFsIGRhdGEiKTsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc2l6ZSA9IG48MCA/IC1uIDogbjsKLQkJCW9iID0gX1B5TG9uZ19OZXcoc2l6ZSk7Ci0JCQlpZiAob2IgPT0gTlVMTCkgewotCQkJCXJldHZhbCA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvYi0+b2Jfc2l6ZSA9IG47Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaW50IGRpZ2l0ID0gcl9zaG9ydChwKTsKLQkJCQlpZiAoZGlnaXQgPCAwIHx8Ci0JCQkJICAgIChkaWdpdCA9PSAwICYmIGkgPT0gc2l6ZS0xKSkgewotCQkJCQlQeV9ERUNSRUYob2IpOwotCQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJCQkiYmFkIG1hcnNoYWwgZGF0YSIpOwotCQkJCQlvYiA9IE5VTEw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAob2IgIT0gTlVMTCkKLQkJCQkJb2ItPm9iX2RpZ2l0W2ldID0gZGlnaXQ7Ci0JCQl9Ci0JCQlyZXR2YWwgPSAoUHlPYmplY3QgKilvYjsKLQkJCWJyZWFrOwotCQl9CisgICAgY2FzZSBUWVBFX0xPTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzaXplOworICAgICAgICAgICAgUHlMb25nT2JqZWN0ICpvYjsKKyAgICAgICAgICAgIG4gPSByX2xvbmcocCk7CisgICAgICAgICAgICBpZiAobiA8IC1JTlRfTUFYIHx8IG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgbWFyc2hhbCBkYXRhIik7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemUgPSBuPDAgPyAtbiA6IG47CisgICAgICAgICAgICBvYiA9IF9QeUxvbmdfTmV3KHNpemUpOworICAgICAgICAgICAgaWYgKG9iID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2ItPm9iX3NpemUgPSBuOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBkaWdpdCA9IHJfc2hvcnQocCk7CisgICAgICAgICAgICAgICAgaWYgKGRpZ2l0IDwgMCB8fAorICAgICAgICAgICAgICAgICAgICAoZGlnaXQgPT0gMCAmJiBpID09IHNpemUtMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iKTsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIG1hcnNoYWwgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICBvYiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAob2IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgb2ItPm9iX2RpZ2l0W2ldID0gZGlnaXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR2YWwgPSAoUHlPYmplY3QgKilvYjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQljYXNlIFRZUEVfRkxPQVQ6Ci0JCXsKLQkJCWNoYXIgYnVmWzI1Nl07Ci0JCQlkb3VibGUgZHg7Ci0JCQluID0gcl9ieXRlKHApOwotCQkJaWYgKG4gPT0gRU9GIHx8IHJfc3RyaW5nKGJ1ZiwgKGludCluLCBwKSAhPSBuKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJ1ZltuXSA9ICdcMCc7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXRvZiIsIGJyZWFrKQotCQkJZHggPSBQeU9TX2FzY2lpX2F0b2YoYnVmKTsKLQkJCVB5RlBFX0VORF9QUk9URUNUKGR4KQotCQkJcmV0dmFsID0gUHlGbG9hdF9Gcm9tRG91YmxlKGR4KTsKLQkJCWJyZWFrOwotCQl9CisgICAgY2FzZSBUWVBFX0ZMT0FUOgorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdOworICAgICAgICAgICAgZG91YmxlIGR4OworICAgICAgICAgICAgbiA9IHJfYnl0ZShwKTsKKyAgICAgICAgICAgIGlmIChuID09IEVPRiB8fCByX3N0cmluZyhidWYsIChpbnQpbiwgcCkgIT0gbikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZbbl0gPSAnXDAnOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImF0b2YiLCBicmVhaykKKyAgICAgICAgICAgIGR4ID0gUHlPU19hc2NpaV9hdG9mKGJ1Zik7CisgICAgICAgICAgICBQeUZQRV9FTkRfUFJPVEVDVChkeCkKKyAgICAgICAgICAgIHJldHZhbCA9IFB5RmxvYXRfRnJvbURvdWJsZShkeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCi0JY2FzZSBUWVBFX0JJTkFSWV9GTE9BVDoKLQkJewotCQkJdW5zaWduZWQgY2hhciBidWZbOF07Ci0JCQlkb3VibGUgeDsKLQkJCWlmIChyX3N0cmluZygoY2hhciopYnVmLCA4LCBwKSAhPSA4KSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXggPSBfUHlGbG9hdF9VbnBhY2s4KGJ1ZiwgMSk7Ci0JCQlpZiAoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dmFsID0gUHlGbG9hdF9Gcm9tRG91YmxlKHgpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICBjYXNlIFRZUEVfQklOQVJZX0ZMT0FUOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKyAgICAgICAgICAgIGRvdWJsZSB4OworICAgICAgICAgICAgaWYgKHJfc3RyaW5nKChjaGFyKilidWYsIDgsIHApICE9IDgpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeCA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKKyAgICAgICAgICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR2YWwgPSBQeUZsb2F0X0Zyb21Eb3VibGUoeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCiAjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAotCWNhc2UgVFlQRV9DT01QTEVYOgotCQl7Ci0JCQljaGFyIGJ1ZlsyNTZdOwotCQkJUHlfY29tcGxleCBjOwotCQkJbiA9IHJfYnl0ZShwKTsKLQkJCWlmIChuID09IEVPRiB8fCByX3N0cmluZyhidWYsIChpbnQpbiwgcCkgIT0gbikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkJIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOwotCQkJCXJldHZhbCA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlidWZbbl0gPSAnXDAnOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCVB5RlBFX1NUQVJUX1BST1RFQ1QoImF0b2YiLCBicmVhazspCi0JCQljLnJlYWwgPSBQeU9TX2FzY2lpX2F0b2YoYnVmKTsKLQkJCVB5RlBFX0VORF9QUk9URUNUKGMpCi0JCQluID0gcl9ieXRlKHApOwotCQkJaWYgKG4gPT0gRU9GIHx8IHJfc3RyaW5nKGJ1ZiwgKGludCluLCBwKSAhPSBuKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQkJcmV0dmFsID0gTlVMTDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJ1ZltuXSA9ICdcMCc7Ci0JCQlQeUZQRV9TVEFSVF9QUk9URUNUKCJhdG9mIiwgYnJlYWspCi0JCQljLmltYWcgPSBQeU9TX2FzY2lpX2F0b2YoYnVmKTsKLQkJCVB5RlBFX0VORF9QUk9URUNUKGMpCi0JCQlyZXR2YWwgPSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KGMpOwotCQkJYnJlYWs7Ci0JCX0KKyAgICBjYXNlIFRZUEVfQ09NUExFWDoKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKKyAgICAgICAgICAgIFB5X2NvbXBsZXggYzsKKyAgICAgICAgICAgIG4gPSByX2J5dGUocCk7CisgICAgICAgICAgICBpZiAobiA9PSBFT0YgfHwgcl9zdHJpbmcoYnVmLCAoaW50KW4sIHApICE9IG4pIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmW25dID0gJ1wwJzsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJhdG9mIiwgYnJlYWs7KQorICAgICAgICAgICAgYy5yZWFsID0gUHlPU19hc2NpaV9hdG9mKGJ1Zik7CisgICAgICAgICAgICBQeUZQRV9FTkRfUFJPVEVDVChjKQorICAgICAgICAgICAgbiA9IHJfYnl0ZShwKTsKKyAgICAgICAgICAgIGlmIChuID09IEVPRiB8fCByX3N0cmluZyhidWYsIChpbnQpbiwgcCkgIT0gbikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZbbl0gPSAnXDAnOworICAgICAgICAgICAgUHlGUEVfU1RBUlRfUFJPVEVDVCgiYXRvZiIsIGJyZWFrKQorICAgICAgICAgICAgYy5pbWFnID0gUHlPU19hc2NpaV9hdG9mKGJ1Zik7CisgICAgICAgICAgICBQeUZQRV9FTkRfUFJPVEVDVChjKQorICAgICAgICAgICAgcmV0dmFsID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQljYXNlIFRZUEVfQklOQVJZX0NPTVBMRVg6Ci0JCXsKLQkJCXVuc2lnbmVkIGNoYXIgYnVmWzhdOwotCQkJUHlfY29tcGxleCBjOwotCQkJaWYgKHJfc3RyaW5nKChjaGFyKilidWYsIDgsIHApICE9IDgpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJCSJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYy5yZWFsID0gX1B5RmxvYXRfVW5wYWNrOChidWYsIDEpOwotCQkJaWYgKGMucmVhbCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJfc3RyaW5nKChjaGFyKilidWYsIDgsIHApICE9IDgpIHsKLQkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCi0JCQkJCSJFT0YgcmVhZCB3aGVyZSBvYmplY3QgZXhwZWN0ZWQiKTsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYy5pbWFnID0gX1B5RmxvYXRfVW5wYWNrOChidWYsIDEpOwotCQkJaWYgKGMuaW1hZyA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dmFsID0gUHlDb21wbGV4X0Zyb21DQ29tcGxleChjKTsKLQkJCWJyZWFrOwotCQl9CisgICAgY2FzZSBUWVBFX0JJTkFSWV9DT01QTEVYOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKyAgICAgICAgICAgIFB5X2NvbXBsZXggYzsKKyAgICAgICAgICAgIGlmIChyX3N0cmluZygoY2hhciopYnVmLCA4LCBwKSAhPSA4KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAorICAgICAgICAgICAgICAgICAgICAiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMucmVhbCA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKKyAgICAgICAgICAgIGlmIChjLnJlYWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyX3N0cmluZygoY2hhciopYnVmLCA4LCBwKSAhPSA4KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAorICAgICAgICAgICAgICAgICAgICAiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMuaW1hZyA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKKyAgICAgICAgICAgIGlmIChjLmltYWcgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHZhbCA9IFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogI2VuZGlmCiAKLQljYXNlIFRZUEVfSU5URVJORUQ6Ci0JY2FzZSBUWVBFX1NUUklORzoKLQkJbiA9IHJfbG9uZyhwKTsKLQkJaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuKTsKLQkJaWYgKHYgPT0gTlVMTCkgewotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChyX3N0cmluZyhQeVN0cmluZ19BU19TVFJJTkcodiksIChpbnQpbiwgcCkgIT0gbikgewotCQkJUHlfREVDUkVGKHYpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0VPRkVycm9yLAotCQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gVFlQRV9JTlRFUk5FRCkgewotCQkJUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSgmdik7Ci0JCQlpZiAoUHlMaXN0X0FwcGVuZChwLT5zdHJpbmdzLCB2KSA8IDApIHsKLQkJCQlyZXR2YWwgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHZhbCA9IHY7Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9JTlRFUk5FRDoKKyAgICBjYXNlIFRZUEVfU1RSSU5HOgorICAgICAgICBuID0gcl9sb25nKHApOworICAgICAgICBpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG4pOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJfc3RyaW5nKFB5U3RyaW5nX0FTX1NUUklORyh2KSwgKGludCluLCBwKSAhPSBuKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfRU9GRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVPRiByZWFkIHdoZXJlIG9iamVjdCBleHBlY3RlZCIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IFRZUEVfSU5URVJORUQpIHsKKyAgICAgICAgICAgIFB5U3RyaW5nX0ludGVybkluUGxhY2UoJnYpOworICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQocC0+c3RyaW5ncywgdikgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSB2OworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9TVFJJTkdSRUY6Ci0JCW4gPSByX2xvbmcocCk7Ci0JCWlmIChuIDwgMCB8fCBuID49IFB5TGlzdF9HRVRfU0laRShwLT5zdHJpbmdzKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJdiA9IFB5TGlzdF9HRVRfSVRFTShwLT5zdHJpbmdzLCBuKTsKLQkJUHlfSU5DUkVGKHYpOwotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfU1RSSU5HUkVGOgorICAgICAgICBuID0gcl9sb25nKHApOworICAgICAgICBpZiAobiA8IDAgfHwgbiA+PSBQeUxpc3RfR0VUX1NJWkUocC0+c3RyaW5ncykpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHYgPSBQeUxpc3RfR0VUX0lURU0ocC0+c3RyaW5ncywgbik7CisgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JY2FzZSBUWVBFX1VOSUNPREU6Ci0JICAgIHsKLQkJY2hhciAqYnVmZmVyOworICAgIGNhc2UgVFlQRV9VTklDT0RFOgorICAgICAgICB7CisgICAgICAgIGNoYXIgKmJ1ZmZlcjsKIAotCQluID0gcl9sb25nKHApOwotCQlpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSIpOwotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBuKTsKLQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQlyZXR2YWwgPSBQeUVycl9Ob01lbW9yeSgpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHJfc3RyaW5nKGJ1ZmZlciwgKGludCluLCBwKSAhPSBuKSB7Ci0JCQlQeU1lbV9ERUwoYnVmZmVyKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKLQkJCQkiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJdiA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KGJ1ZmZlciwgbiwgTlVMTCk7Ci0JCVB5TWVtX0RFTChidWZmZXIpOwotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKLQkgICAgfQorICAgICAgICBuID0gcl9sb25nKHApOworICAgICAgICBpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBuKTsKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR2YWwgPSBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJfc3RyaW5nKGJ1ZmZlciwgKGludCluLCBwKSAhPSBuKSB7CisgICAgICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19FT0ZFcnJvciwKKyAgICAgICAgICAgICAgICAiRU9GIHJlYWQgd2hlcmUgb2JqZWN0IGV4cGVjdGVkIik7CisgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdiA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KGJ1ZmZlciwgbiwgTlVMTCk7CisgICAgICAgIFB5TWVtX0RFTChidWZmZXIpOworICAgICAgICByZXR2YWwgPSB2OworICAgICAgICBicmVhazsKKyAgICAgICAgfQogI2VuZGlmCiAKLQljYXNlIFRZUEVfVFVQTEU6Ci0JCW4gPSByX2xvbmcocCk7Ci0JCWlmIChuIDwgMCB8fCBuID4gSU5UX01BWCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJdiA9IFB5VHVwbGVfTmV3KChpbnQpbik7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl2MiA9IHJfb2JqZWN0KHApOwotCQkJaWYgKCB2MiA9PSBOVUxMICkgewotCQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEiKTsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJdiA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlQeVR1cGxlX1NFVF9JVEVNKHYsIChpbnQpaSwgdjIpOwotCQl9Ci0JCXJldHZhbCA9IHY7Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9UVVBMRToKKyAgICAgICAgbiA9IHJfbG9uZyhwKTsKKyAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB2ID0gUHlUdXBsZV9OZXcoKGludCluKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIHYyID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAoIHYyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgb2JqZWN0IGluIG1hcnNoYWwgZGF0YSIpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgKGludClpLCB2Mik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfTElTVDoKLQkJbiA9IHJfbG9uZyhwKTsKLQkJaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQl2ID0gUHlMaXN0X05ldygoaW50KW4pOwotCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJdjIgPSByX29iamVjdChwKTsKLQkJCWlmICggdjIgPT0gTlVMTCApIHsKLQkJCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCQkiTlVMTCBvYmplY3QgaW4gbWFyc2hhbCBkYXRhIik7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCXYgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJUHlMaXN0X1NFVF9JVEVNKHYsIChpbnQpaSwgdjIpOwotCQl9Ci0JCXJldHZhbCA9IHY7Ci0JCWJyZWFrOworICAgIGNhc2UgVFlQRV9MSVNUOgorICAgICAgICBuID0gcl9sb25nKHApOworICAgICAgICBpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHYgPSBQeUxpc3RfTmV3KChpbnQpbik7CisgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB2MiA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKCB2MiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0odiwgKGludClpLCB2Mik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgYnJlYWs7CiAKLQljYXNlIFRZUEVfRElDVDoKLQkJdiA9IFB5RGljdF9OZXcoKTsKLQkJaWYgKHYgPT0gTlVMTCkgewotCQkJcmV0dmFsID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWZvciAoOzspIHsKLQkJCVB5T2JqZWN0ICprZXksICp2YWw7Ci0JCQlrZXkgPSByX29iamVjdChwKTsKLQkJCWlmIChrZXkgPT0gTlVMTCkKLQkJCQlicmVhazsKLQkJCXZhbCA9IHJfb2JqZWN0KHApOwotCQkJaWYgKHZhbCAhPSBOVUxMKQotCQkJCVB5RGljdF9TZXRJdGVtKHYsIGtleSwgdmFsKTsKLQkJCVB5X0RFQ1JFRihrZXkpOwotCQkJUHlfWERFQ1JFRih2YWwpOwotCQl9Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQl2ID0gTlVMTDsKLQkJfQotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICBjYXNlIFRZUEVfRElDVDoKKyAgICAgICAgdiA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICprZXksICp2YWw7CisgICAgICAgICAgICBrZXkgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHZhbCA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKHZhbCAhPSBOVUxMKQorICAgICAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtKHYsIGtleSwgdmFsKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOworICAgICAgICAgICAgUHlfWERFQ1JFRih2YWwpOworICAgICAgICB9CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSB2OworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9TRVQ6Ci0JY2FzZSBUWVBFX0ZST1pFTlNFVDoKLQkJbiA9IHJfbG9uZyhwKTsKLQkJaWYgKG4gPCAwIHx8IG4gPiBJTlRfTUFYKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotICAgICAgICAgICAgICAgIHYgPSAodHlwZSA9PSBUWVBFX1NFVCkgPyBQeVNldF9OZXcoTlVMTCkgOiBQeUZyb3plblNldF9OZXcoTlVMTCk7Ci0JCWlmICh2ID09IE5VTEwpIHsKLQkJCXJldHZhbCA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl2MiA9IHJfb2JqZWN0KHApOwotCQkJaWYgKCB2MiA9PSBOVUxMICkgewotCQkJCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJCSJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEiKTsKLQkJCQlQeV9ERUNSRUYodik7Ci0JCQkJdiA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoUHlTZXRfQWRkKHYsIHYyKSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2Mik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2Mik7Ci0JCX0KLQkJcmV0dmFsID0gdjsKLQkJYnJlYWs7CisgICAgY2FzZSBUWVBFX1NFVDoKKyAgICBjYXNlIFRZUEVfRlJPWkVOU0VUOgorICAgICAgICBuID0gcl9sb25nKHApOworICAgICAgICBpZiAobiA8IDAgfHwgbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYmFkIG1hcnNoYWwgZGF0YSIpOworICAgICAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHYgPSAodHlwZSA9PSBUWVBFX1NFVCkgPyBQeVNldF9OZXcoTlVMTCkgOiBQeUZyb3plblNldF9OZXcoTlVMTCk7CisgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHZhbCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICB2MiA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKCB2MiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIG9iamVjdCBpbiBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlTZXRfQWRkKHYsIHYyKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodjIpOworICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSB2OworICAgICAgICBicmVhazsKIAotCWNhc2UgVFlQRV9DT0RFOgotCQlpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkiY2Fubm90IHVubWFyc2hhbCBjb2RlIG9iamVjdHMgaW4gIgotCQkJCSJyZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlIik7Ci0JCQlyZXR2YWwgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgYXJnY291bnQ7Ci0JCQlpbnQgbmxvY2FsczsKLQkJCWludCBzdGFja3NpemU7Ci0JCQlpbnQgZmxhZ3M7Ci0JCQlQeU9iamVjdCAqY29kZSA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqY29uc3RzID0gTlVMTDsKLQkJCVB5T2JqZWN0ICpuYW1lcyA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqdmFybmFtZXMgPSBOVUxMOwotCQkJUHlPYmplY3QgKmZyZWV2YXJzID0gTlVMTDsKLQkJCVB5T2JqZWN0ICpjZWxsdmFycyA9IE5VTEw7Ci0JCQlQeU9iamVjdCAqZmlsZW5hbWUgPSBOVUxMOwotCQkJUHlPYmplY3QgKm5hbWUgPSBOVUxMOwotCQkJaW50IGZpcnN0bGluZW5vOwotCQkJUHlPYmplY3QgKmxub3RhYiA9IE5VTEw7Ci0JCQkKLQkJCXYgPSBOVUxMOworICAgIGNhc2UgVFlQRV9DT0RFOgorICAgICAgICBpZiAoUHlFdmFsX0dldFJlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAiY2Fubm90IHVubWFyc2hhbCBjb2RlIG9iamVjdHMgaW4gIgorICAgICAgICAgICAgICAgICJyZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlIik7CisgICAgICAgICAgICByZXR2YWwgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnQgYXJnY291bnQ7CisgICAgICAgICAgICBpbnQgbmxvY2FsczsKKyAgICAgICAgICAgIGludCBzdGFja3NpemU7CisgICAgICAgICAgICBpbnQgZmxhZ3M7CisgICAgICAgICAgICBQeU9iamVjdCAqY29kZSA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqY29uc3RzID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcyA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqdmFybmFtZXMgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKmZyZWV2YXJzID0gTlVMTDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpjZWxsdmFycyA9IE5VTEw7CisgICAgICAgICAgICBQeU9iamVjdCAqZmlsZW5hbWUgPSBOVUxMOworICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBOVUxMOworICAgICAgICAgICAgaW50IGZpcnN0bGluZW5vOworICAgICAgICAgICAgUHlPYmplY3QgKmxub3RhYiA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWCBpZ25vcmUgbG9uZy0+aW50IG92ZXJmbG93cyBmb3Igbm93ICovCi0JCQlhcmdjb3VudCA9IChpbnQpcl9sb25nKHApOwotCQkJbmxvY2FscyA9IChpbnQpcl9sb25nKHApOwotCQkJc3RhY2tzaXplID0gKGludClyX2xvbmcocCk7Ci0JCQlmbGFncyA9IChpbnQpcl9sb25nKHApOwotCQkJY29kZSA9IHJfb2JqZWN0KHApOwotCQkJaWYgKGNvZGUgPT0gTlVMTCkKLQkJCQlnb3RvIGNvZGVfZXJyb3I7Ci0JCQljb25zdHMgPSByX29iamVjdChwKTsKLQkJCWlmIChjb25zdHMgPT0gTlVMTCkKLQkJCQlnb3RvIGNvZGVfZXJyb3I7Ci0JCQluYW1lcyA9IHJfb2JqZWN0KHApOwotCQkJaWYgKG5hbWVzID09IE5VTEwpCi0JCQkJZ290byBjb2RlX2Vycm9yOwotCQkJdmFybmFtZXMgPSByX29iamVjdChwKTsKLQkJCWlmICh2YXJuYW1lcyA9PSBOVUxMKQotCQkJCWdvdG8gY29kZV9lcnJvcjsKLQkJCWZyZWV2YXJzID0gcl9vYmplY3QocCk7Ci0JCQlpZiAoZnJlZXZhcnMgPT0gTlVMTCkKLQkJCQlnb3RvIGNvZGVfZXJyb3I7Ci0JCQljZWxsdmFycyA9IHJfb2JqZWN0KHApOwotCQkJaWYgKGNlbGx2YXJzID09IE5VTEwpCi0JCQkJZ290byBjb2RlX2Vycm9yOwotCQkJZmlsZW5hbWUgPSByX29iamVjdChwKTsKLQkJCWlmIChmaWxlbmFtZSA9PSBOVUxMKQotCQkJCWdvdG8gY29kZV9lcnJvcjsKLQkJCW5hbWUgPSByX29iamVjdChwKTsKLQkJCWlmIChuYW1lID09IE5VTEwpCi0JCQkJZ290byBjb2RlX2Vycm9yOwotCQkJZmlyc3RsaW5lbm8gPSAoaW50KXJfbG9uZyhwKTsKLQkJCWxub3RhYiA9IHJfb2JqZWN0KHApOwotCQkJaWYgKGxub3RhYiA9PSBOVUxMKQotCQkJCWdvdG8gY29kZV9lcnJvcjsKKyAgICAgICAgICAgIHYgPSBOVUxMOwogCi0JCQl2ID0gKFB5T2JqZWN0ICopIFB5Q29kZV9OZXcoCi0JCQkJCWFyZ2NvdW50LCBubG9jYWxzLCBzdGFja3NpemUsIGZsYWdzLAotCQkJCQljb2RlLCBjb25zdHMsIG5hbWVzLCB2YXJuYW1lcywKLQkJCQkJZnJlZXZhcnMsIGNlbGx2YXJzLCBmaWxlbmFtZSwgbmFtZSwKLQkJCQkJZmlyc3RsaW5lbm8sIGxub3RhYik7CisgICAgICAgICAgICAvKiBYWFggaWdub3JlIGxvbmctPmludCBvdmVyZmxvd3MgZm9yIG5vdyAqLworICAgICAgICAgICAgYXJnY291bnQgPSAoaW50KXJfbG9uZyhwKTsKKyAgICAgICAgICAgIG5sb2NhbHMgPSAoaW50KXJfbG9uZyhwKTsKKyAgICAgICAgICAgIHN0YWNrc2l6ZSA9IChpbnQpcl9sb25nKHApOworICAgICAgICAgICAgZmxhZ3MgPSAoaW50KXJfbG9uZyhwKTsKKyAgICAgICAgICAgIGNvZGUgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmIChjb2RlID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBjb2RlX2Vycm9yOworICAgICAgICAgICAgY29uc3RzID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAoY29uc3RzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBjb2RlX2Vycm9yOworICAgICAgICAgICAgbmFtZXMgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmIChuYW1lcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gY29kZV9lcnJvcjsKKyAgICAgICAgICAgIHZhcm5hbWVzID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAodmFybmFtZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvZGVfZXJyb3I7CisgICAgICAgICAgICBmcmVldmFycyA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgaWYgKGZyZWV2YXJzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBjb2RlX2Vycm9yOworICAgICAgICAgICAgY2VsbHZhcnMgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmIChjZWxsdmFycyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gY29kZV9lcnJvcjsKKyAgICAgICAgICAgIGZpbGVuYW1lID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvZGVfZXJyb3I7CisgICAgICAgICAgICBuYW1lID0gcl9vYmplY3QocCk7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gY29kZV9lcnJvcjsKKyAgICAgICAgICAgIGZpcnN0bGluZW5vID0gKGludClyX2xvbmcocCk7CisgICAgICAgICAgICBsbm90YWIgPSByX29iamVjdChwKTsKKyAgICAgICAgICAgIGlmIChsbm90YWIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvZGVfZXJyb3I7CiAKLQkJICBjb2RlX2Vycm9yOgotCQkJUHlfWERFQ1JFRihjb2RlKTsKLQkJCVB5X1hERUNSRUYoY29uc3RzKTsKLQkJCVB5X1hERUNSRUYobmFtZXMpOwotCQkJUHlfWERFQ1JFRih2YXJuYW1lcyk7Ci0JCQlQeV9YREVDUkVGKGZyZWV2YXJzKTsKLQkJCVB5X1hERUNSRUYoY2VsbHZhcnMpOwotCQkJUHlfWERFQ1JFRihmaWxlbmFtZSk7Ci0JCQlQeV9YREVDUkVGKG5hbWUpOwotCQkJUHlfWERFQ1JFRihsbm90YWIpOworICAgICAgICAgICAgdiA9IChQeU9iamVjdCAqKSBQeUNvZGVfTmV3KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2NvdW50LCBubG9jYWxzLCBzdGFja3NpemUsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUsIGNvbnN0cywgbmFtZXMsIHZhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWV2YXJzLCBjZWxsdmFycywgZmlsZW5hbWUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RsaW5lbm8sIGxub3RhYik7CiAKLQkJfQotCQlyZXR2YWwgPSB2OwotCQlicmVhazsKKyAgICAgICAgICBjb2RlX2Vycm9yOgorICAgICAgICAgICAgUHlfWERFQ1JFRihjb2RlKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoY29uc3RzKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYobmFtZXMpOworICAgICAgICAgICAgUHlfWERFQ1JFRih2YXJuYW1lcyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKGZyZWV2YXJzKTsKKyAgICAgICAgICAgIFB5X1hERUNSRUYoY2VsbHZhcnMpOworICAgICAgICAgICAgUHlfWERFQ1JFRihmaWxlbmFtZSk7CisgICAgICAgICAgICBQeV9YREVDUkVGKG5hbWUpOworICAgICAgICAgICAgUHlfWERFQ1JFRihsbm90YWIpOwogCi0JZGVmYXVsdDoKLQkJLyogQm9ndXMgZGF0YSBnb3Qgd3JpdHRlbiwgd2hpY2ggaXNuJ3QgaWRlYWwuCi0JCSAgIFRoaXMgd2lsbCBsZXQgeW91IGtlZXAgd29ya2luZyBhbmQgcmVjb3Zlci4gKi8KLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIik7Ci0JCXJldHZhbCA9IE5VTEw7Ci0JCWJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IHY7CisgICAgICAgIGJyZWFrOwogCi0JfQotCXAtPmRlcHRoLS07Ci0JcmV0dXJuIHJldHZhbDsKKyAgICBkZWZhdWx0OgorICAgICAgICAvKiBCb2d1cyBkYXRhIGdvdCB3cml0dGVuLCB3aGljaCBpc24ndCBpZGVhbC4KKyAgICAgICAgICAgVGhpcyB3aWxsIGxldCB5b3Uga2VlcCB3b3JraW5nIGFuZCByZWNvdmVyLiAqLworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJhZCBtYXJzaGFsIGRhdGEiKTsKKyAgICAgICAgcmV0dmFsID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisKKyAgICB9CisgICAgcC0+ZGVwdGgtLTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmVhZF9vYmplY3QoUkZJTEUgKnApCiB7Ci0JUHlPYmplY3QgKnY7Ci0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJZnByaW50ZihzdGRlcnIsICJYWFggcmVhZG9iamVjdCBjYWxsZWQgd2l0aCBleGNlcHRpb24gc2V0XG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXYgPSByX29iamVjdChwKTsKLQlpZiAodiA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTlVMTCBvYmplY3QgaW4gbWFyc2hhbCBkYXRhIik7Ci0JcmV0dXJuIHY7CisgICAgUHlPYmplY3QgKnY7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJYWFggcmVhZG9iamVjdCBjYWxsZWQgd2l0aCBleGNlcHRpb24gc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHYgPSByX29iamVjdChwKTsKKyAgICBpZiAodiA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTlVMTCBvYmplY3QgaW4gbWFyc2hhbCBkYXRhIik7CisgICAgcmV0dXJuIHY7CiB9CiAKIGludAogUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKEZJTEUgKmZwKQogewotCVJGSUxFIHJmOwotCWFzc2VydChmcCk7Ci0JcmYuZnAgPSBmcDsKLQlyZi5zdHJpbmdzID0gTlVMTDsKLQlyZi5lbmQgPSByZi5wdHIgPSBOVUxMOwotCXJldHVybiByX3Nob3J0KCZyZik7CisgICAgUkZJTEUgcmY7CisgICAgYXNzZXJ0KGZwKTsKKyAgICByZi5mcCA9IGZwOworICAgIHJmLnN0cmluZ3MgPSBOVUxMOworICAgIHJmLmVuZCA9IHJmLnB0ciA9IE5VTEw7CisgICAgcmV0dXJuIHJfc2hvcnQoJnJmKTsKIH0KIAogbG9uZwogUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoRklMRSAqZnApCiB7Ci0JUkZJTEUgcmY7Ci0JcmYuZnAgPSBmcDsKLQlyZi5zdHJpbmdzID0gTlVMTDsKLQlyZi5wdHIgPSByZi5lbmQgPSBOVUxMOwotCXJldHVybiByX2xvbmcoJnJmKTsKKyAgICBSRklMRSByZjsKKyAgICByZi5mcCA9IGZwOworICAgIHJmLnN0cmluZ3MgPSBOVUxMOworICAgIHJmLnB0ciA9IHJmLmVuZCA9IE5VTEw7CisgICAgcmV0dXJuIHJfbG9uZygmcmYpOwogfQogCiAjaWZkZWYgSEFWRV9GU1RBVApAQCAtMTAyMywxMSArMTAyMywxMSBAQAogc3RhdGljIG9mZl90CiBnZXRmaWxlc2l6ZShGSUxFICpmcCkKIHsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQlpZiAoZnN0YXQoZmlsZW5vKGZwKSwgJnN0KSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0JZWxzZQotCQlyZXR1cm4gc3Quc3Rfc2l6ZTsKKyAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyAgICBpZiAoZnN0YXQoZmlsZW5vKGZwKSwgJnN0KSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gc3Quc3Rfc2l6ZTsKIH0KICNlbmRpZgogCkBAIC0xMDQ2LDM1ICsxMDQ2LDM1IEBACiAjZGVmaW5lIFNNQUxMX0ZJTEVfTElNSVQgKDFMIDw8IDE0KQogI2RlZmluZSBSRUFTT05BQkxFX0ZJTEVfTElNSVQgKDFMIDw8IDE4KQogI2lmZGVmIEhBVkVfRlNUQVQKLQlvZmZfdCBmaWxlc2l6ZTsKKyAgICBvZmZfdCBmaWxlc2l6ZTsKICNlbmRpZgogI2lmZGVmIEhBVkVfRlNUQVQKLQlmaWxlc2l6ZSA9IGdldGZpbGVzaXplKGZwKTsKLQlpZiAoZmlsZXNpemUgPiAwKSB7Ci0JCWNoYXIgYnVmW1NNQUxMX0ZJTEVfTElNSVRdOwotCQljaGFyKiBwQnVmID0gTlVMTDsKLQkJaWYgKGZpbGVzaXplIDw9IFNNQUxMX0ZJTEVfTElNSVQpCi0JCQlwQnVmID0gYnVmOwotCQllbHNlIGlmIChmaWxlc2l6ZSA8PSBSRUFTT05BQkxFX0ZJTEVfTElNSVQpCi0JCQlwQnVmID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoZmlsZXNpemUpOwotCQlpZiAocEJ1ZiAhPSBOVUxMKSB7Ci0JCQlQeU9iamVjdCogdjsKLQkJCXNpemVfdCBuOwotCQkJLyogZmlsZXNpemUgbXVzdCBmaXQgaW50byBhbiBpbnQsIGJlY2F1c2UgaXQKLQkJCSAgIGlzIHNtYWxsZXIgdGhhbiBSRUFTT05BQkxFX0ZJTEVfTElNSVQgKi8KLQkJCW4gPSBmcmVhZChwQnVmLCAxLCAoaW50KWZpbGVzaXplLCBmcCk7Ci0JCQl2ID0gUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKHBCdWYsIG4pOwotCQkJaWYgKHBCdWYgIT0gYnVmKQotCQkJCVB5TWVtX0ZSRUUocEJ1Zik7Ci0JCQlyZXR1cm4gdjsKLQkJfQorICAgIGZpbGVzaXplID0gZ2V0ZmlsZXNpemUoZnApOworICAgIGlmIChmaWxlc2l6ZSA+IDApIHsKKyAgICAgICAgY2hhciBidWZbU01BTExfRklMRV9MSU1JVF07CisgICAgICAgIGNoYXIqIHBCdWYgPSBOVUxMOworICAgICAgICBpZiAoZmlsZXNpemUgPD0gU01BTExfRklMRV9MSU1JVCkKKyAgICAgICAgICAgIHBCdWYgPSBidWY7CisgICAgICAgIGVsc2UgaWYgKGZpbGVzaXplIDw9IFJFQVNPTkFCTEVfRklMRV9MSU1JVCkKKyAgICAgICAgICAgIHBCdWYgPSAoY2hhciAqKVB5TWVtX01BTExPQyhmaWxlc2l6ZSk7CisgICAgICAgIGlmIChwQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0KiB2OworICAgICAgICAgICAgc2l6ZV90IG47CisgICAgICAgICAgICAvKiBmaWxlc2l6ZSBtdXN0IGZpdCBpbnRvIGFuIGludCwgYmVjYXVzZSBpdAorICAgICAgICAgICAgICAgaXMgc21hbGxlciB0aGFuIFJFQVNPTkFCTEVfRklMRV9MSU1JVCAqLworICAgICAgICAgICAgbiA9IGZyZWFkKHBCdWYsIDEsIChpbnQpZmlsZXNpemUsIGZwKTsKKyAgICAgICAgICAgIHYgPSBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcocEJ1Ziwgbik7CisgICAgICAgICAgICBpZiAocEJ1ZiAhPSBidWYpCisgICAgICAgICAgICAgICAgUHlNZW1fRlJFRShwQnVmKTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CiAKLQl9CisgICAgfQogI2VuZGlmCi0JLyogV2UgZG9uJ3QgaGF2ZSBmc3RhdCwgb3Igd2UgZG8gYnV0IHRoZSBmaWxlIGlzIGxhcmdlciB0aGFuCi0JICogUkVBU09OQUJMRV9GSUxFX0xJTUlUIG9yIG1hbGxvYyBmYWlsZWQgLS0gcmVhZCBhIGJ5dGUgYXQgYSB0aW1lLgotCSAqLwotCXJldHVybiBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21GaWxlKGZwKTsKKyAgICAvKiBXZSBkb24ndCBoYXZlIGZzdGF0LCBvciB3ZSBkbyBidXQgdGhlIGZpbGUgaXMgbGFyZ2VyIHRoYW4KKyAgICAgKiBSRUFTT05BQkxFX0ZJTEVfTElNSVQgb3IgbWFsbG9jIGZhaWxlZCAtLSByZWFkIGEgYnl0ZSBhdCBhIHRpbWUuCisgICAgICovCisgICAgcmV0dXJuIFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbUZpbGUoZnApOwogCiAjdW5kZWYgU01BTExfRklMRV9MSU1JVAogI3VuZGVmIFJFQVNPTkFCTEVfRklMRV9MSU1JVApAQCAtMTA4Myw2NiArMTA4Myw2NiBAQAogUHlPYmplY3QgKgogUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tRmlsZShGSUxFICpmcCkKIHsKLQlSRklMRSByZjsKLQlQeU9iamVjdCAqcmVzdWx0OwotCXJmLmZwID0gZnA7Ci0JcmYuc3RyaW5ncyA9IFB5TGlzdF9OZXcoMCk7Ci0JcmYuZGVwdGggPSAwOwotCXJmLnB0ciA9IHJmLmVuZCA9IE5VTEw7Ci0JcmVzdWx0ID0gcl9vYmplY3QoJnJmKTsKLQlQeV9ERUNSRUYocmYuc3RyaW5ncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBSRklMRSByZjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIHJmLmZwID0gZnA7CisgICAgcmYuc3RyaW5ncyA9IFB5TGlzdF9OZXcoMCk7CisgICAgcmYuZGVwdGggPSAwOworICAgIHJmLnB0ciA9IHJmLmVuZCA9IE5VTEw7CisgICAgcmVzdWx0ID0gcl9vYmplY3QoJnJmKTsKKyAgICBQeV9ERUNSRUYocmYuc3RyaW5ncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlPYmplY3QgKgogUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4pCiB7Ci0JUkZJTEUgcmY7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlyZi5mcCA9IE5VTEw7Ci0JcmYucHRyID0gc3RyOwotCXJmLmVuZCA9IHN0ciArIGxlbjsKLQlyZi5zdHJpbmdzID0gUHlMaXN0X05ldygwKTsKLQlyZi5kZXB0aCA9IDA7Ci0JcmVzdWx0ID0gcl9vYmplY3QoJnJmKTsKLQlQeV9ERUNSRUYocmYuc3RyaW5ncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBSRklMRSByZjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIHJmLmZwID0gTlVMTDsKKyAgICByZi5wdHIgPSBzdHI7CisgICAgcmYuZW5kID0gc3RyICsgbGVuOworICAgIHJmLnN0cmluZ3MgPSBQeUxpc3RfTmV3KDApOworICAgIHJmLmRlcHRoID0gMDsKKyAgICByZXN1bHQgPSByX29iamVjdCgmcmYpOworICAgIFB5X0RFQ1JFRihyZi5zdHJpbmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeU9iamVjdCAqCiBQeU1hcnNoYWxfV3JpdGVPYmplY3RUb1N0cmluZyhQeU9iamVjdCAqeCwgaW50IHZlcnNpb24pCiB7Ci0JV0ZJTEUgd2Y7Ci0Jd2YuZnAgPSBOVUxMOwotCXdmLnN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgNTApOwotCWlmICh3Zi5zdHIgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2YucHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXdmLnN0cik7Ci0Jd2YuZW5kID0gd2YucHRyICsgUHlTdHJpbmdfU2l6ZSh3Zi5zdHIpOwotCXdmLmVycm9yID0gMDsKLQl3Zi5kZXB0aCA9IDA7Ci0Jd2YudmVyc2lvbiA9IHZlcnNpb247Ci0Jd2Yuc3RyaW5ncyA9ICh2ZXJzaW9uID4gMCkgPyBQeURpY3RfTmV3KCkgOiBOVUxMOwotCXdfb2JqZWN0KHgsICZ3Zik7Ci0JUHlfWERFQ1JFRih3Zi5zdHJpbmdzKTsKLQlpZiAod2Yuc3RyICE9IE5VTEwpIHsKLQkJY2hhciAqYmFzZSA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKil3Zi5zdHIpOwotCQlpZiAod2YucHRyIC0gYmFzZSA+IFBZX1NTSVpFX1RfTUFYKSB7Ci0JCQlQeV9ERUNSRUYod2Yuc3RyKTsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkidG9vIG11Y2ggbWFyc2hhbGwgZGF0YSBmb3IgYSBzdHJpbmciKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCV9QeVN0cmluZ19SZXNpemUoJndmLnN0ciwgKFB5X3NzaXplX3QpKHdmLnB0ciAtIGJhc2UpKTsKLQl9Ci0JaWYgKHdmLmVycm9yKSB7Ci0JCVB5X1hERUNSRUYod2Yuc3RyKTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJKHdmLmVycm9yPT0xKT8idW5tYXJzaGFsbGFibGUgb2JqZWN0IgotCQkJCToib2JqZWN0IHRvbyBkZWVwbHkgbmVzdGVkIHRvIG1hcnNoYWwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiB3Zi5zdHI7CisgICAgV0ZJTEUgd2Y7CisgICAgd2YuZnAgPSBOVUxMOworICAgIHdmLnN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgNTApOworICAgIGlmICh3Zi5zdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd2YucHRyID0gUHlTdHJpbmdfQVNfU1RSSU5HKChQeVN0cmluZ09iamVjdCAqKXdmLnN0cik7CisgICAgd2YuZW5kID0gd2YucHRyICsgUHlTdHJpbmdfU2l6ZSh3Zi5zdHIpOworICAgIHdmLmVycm9yID0gMDsKKyAgICB3Zi5kZXB0aCA9IDA7CisgICAgd2YudmVyc2lvbiA9IHZlcnNpb247CisgICAgd2Yuc3RyaW5ncyA9ICh2ZXJzaW9uID4gMCkgPyBQeURpY3RfTmV3KCkgOiBOVUxMOworICAgIHdfb2JqZWN0KHgsICZ3Zik7CisgICAgUHlfWERFQ1JFRih3Zi5zdHJpbmdzKTsKKyAgICBpZiAod2Yuc3RyICE9IE5VTEwpIHsKKyAgICAgICAgY2hhciAqYmFzZSA9IFB5U3RyaW5nX0FTX1NUUklORygoUHlTdHJpbmdPYmplY3QgKil3Zi5zdHIpOworICAgICAgICBpZiAod2YucHRyIC0gYmFzZSA+IFBZX1NTSVpFX1RfTUFYKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYod2Yuc3RyKTsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbXVjaCBtYXJzaGFsbCBkYXRhIGZvciBhIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmd2Yuc3RyLCAoUHlfc3NpemVfdCkod2YucHRyIC0gYmFzZSkpOworICAgIH0KKyAgICBpZiAod2YuZXJyb3IpIHsKKyAgICAgICAgUHlfWERFQ1JFRih3Zi5zdHIpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICh3Zi5lcnJvcj09MSk/InVubWFyc2hhbGxhYmxlIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDoib2JqZWN0IHRvbyBkZWVwbHkgbmVzdGVkIHRvIG1hcnNoYWwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB3Zi5zdHI7CiB9CiAKIC8qIEFuZCBhbiBpbnRlcmZhY2UgZm9yIFB5dGhvbiBwcm9ncmFtcy4uLiAqLwpAQCAtMTE1MCwzNCArMTE1MCwzNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hcnNoYWxfZHVtcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JV0ZJTEUgd2Y7Ci0JUHlPYmplY3QgKng7Ci0JUHlPYmplY3QgKmY7Ci0JaW50IHZlcnNpb24gPSBQeV9NQVJTSEFMX1ZFUlNJT047Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xpOmR1bXAiLCAmeCwgJmYsICZ2ZXJzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUZpbGVfQ2hlY2soZikpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkibWFyc2hhbC5kdW1wKCkgMm5kIGFyZyBtdXN0IGJlIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXdmLmZwID0gUHlGaWxlX0FzRmlsZShmKTsKLQl3Zi5zdHIgPSBOVUxMOwotCXdmLnB0ciA9IHdmLmVuZCA9IE5VTEw7Ci0Jd2YuZXJyb3IgPSAwOwotCXdmLmRlcHRoID0gMDsKLQl3Zi5zdHJpbmdzID0gKHZlcnNpb24gPiAwKSA/IFB5RGljdF9OZXcoKSA6IDA7Ci0Jd2YudmVyc2lvbiA9IHZlcnNpb247Ci0Jd19vYmplY3QoeCwgJndmKTsKLQlQeV9YREVDUkVGKHdmLnN0cmluZ3MpOwotCWlmICh3Zi5lcnJvcikgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkod2YuZXJyb3I9PTEpPyJ1bm1hcnNoYWxsYWJsZSBvYmplY3QiCi0JCQkJOiJvYmplY3QgdG9vIGRlZXBseSBuZXN0ZWQgdG8gbWFyc2hhbCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFdGSUxFIHdmOworICAgIFB5T2JqZWN0ICp4OworICAgIFB5T2JqZWN0ICpmOworICAgIGludCB2ZXJzaW9uID0gUHlfTUFSU0hBTF9WRVJTSU9OOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098aTpkdW1wIiwgJngsICZmLCAmdmVyc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlGaWxlX0NoZWNrKGYpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAibWFyc2hhbC5kdW1wKCkgMm5kIGFyZyBtdXN0IGJlIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHdmLmZwID0gUHlGaWxlX0FzRmlsZShmKTsKKyAgICB3Zi5zdHIgPSBOVUxMOworICAgIHdmLnB0ciA9IHdmLmVuZCA9IE5VTEw7CisgICAgd2YuZXJyb3IgPSAwOworICAgIHdmLmRlcHRoID0gMDsKKyAgICB3Zi5zdHJpbmdzID0gKHZlcnNpb24gPiAwKSA/IFB5RGljdF9OZXcoKSA6IDA7CisgICAgd2YudmVyc2lvbiA9IHZlcnNpb247CisgICAgd19vYmplY3QoeCwgJndmKTsKKyAgICBQeV9YREVDUkVGKHdmLnN0cmluZ3MpOworICAgIGlmICh3Zi5lcnJvcikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICh3Zi5lcnJvcj09MSk/InVubWFyc2hhbGxhYmxlIG9iamVjdCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDoib2JqZWN0IHRvbyBkZWVwbHkgbmVzdGVkIHRvIG1hcnNoYWwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGR1bXBfZG9jLApAQCAtMTE5NywxOSArMTE5NywxOSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hcnNoYWxfbG9hZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmYpCiB7Ci0JUkZJTEUgcmY7Ci0JUHlPYmplY3QgKnJlc3VsdDsKLQlpZiAoIVB5RmlsZV9DaGVjayhmKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJtYXJzaGFsLmxvYWQoKSBhcmcgbXVzdCBiZSBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZi5mcCA9IFB5RmlsZV9Bc0ZpbGUoZik7Ci0JcmYuc3RyaW5ncyA9IFB5TGlzdF9OZXcoMCk7Ci0JcmYuZGVwdGggPSAwOwotCXJlc3VsdCA9IHJlYWRfb2JqZWN0KCZyZik7Ci0JUHlfREVDUkVGKHJmLnN0cmluZ3MpOwotCXJldHVybiByZXN1bHQ7CisgICAgUkZJTEUgcmY7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpZiAoIVB5RmlsZV9DaGVjayhmKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm1hcnNoYWwubG9hZCgpIGFyZyBtdXN0IGJlIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJmLmZwID0gUHlGaWxlX0FzRmlsZShmKTsKKyAgICByZi5zdHJpbmdzID0gUHlMaXN0X05ldygwKTsKKyAgICByZi5kZXB0aCA9IDA7CisgICAgcmVzdWx0ID0gcmVhZF9vYmplY3QoJnJmKTsKKyAgICBQeV9ERUNSRUYocmYuc3RyaW5ncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogUHlEb2NfU1RSVkFSKGxvYWRfZG9jLApAQCAtMTIyOCwxMSArMTIyOCwxMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hcnNoYWxfZHVtcHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICp4OwotCWludCB2ZXJzaW9uID0gUHlfTUFSU0hBTF9WRVJTSU9OOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOmR1bXBzIiwgJngsICZ2ZXJzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvU3RyaW5nKHgsIHZlcnNpb24pOworICAgIFB5T2JqZWN0ICp4OworICAgIGludCB2ZXJzaW9uID0gUHlfTUFSU0hBTF9WRVJTSU9OOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOmR1bXBzIiwgJngsICZ2ZXJzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvU3RyaW5nKHgsIHZlcnNpb24pOwogfQogCiBQeURvY19TVFJWQVIoZHVtcHNfZG9jLApAQCAtMTI0OSwyMCArMTI0OSwyMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG1hcnNoYWxfbG9hZHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVJGSUxFIHJmOwotCWNoYXIgKnM7Ci0JUHlfc3NpemVfdCBuOwotCVB5T2JqZWN0KiByZXN1bHQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpsb2FkcyIsICZzLCAmbikpCi0JCXJldHVybiBOVUxMOwotCXJmLmZwID0gTlVMTDsKLQlyZi5wdHIgPSBzOwotCXJmLmVuZCA9IHMgKyBuOwotCXJmLnN0cmluZ3MgPSBQeUxpc3RfTmV3KDApOwotCXJmLmRlcHRoID0gMDsKLQlyZXN1bHQgPSByZWFkX29iamVjdCgmcmYpOwotCVB5X0RFQ1JFRihyZi5zdHJpbmdzKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIFJGSUxFIHJmOworICAgIGNoYXIgKnM7CisgICAgUHlfc3NpemVfdCBuOworICAgIFB5T2JqZWN0KiByZXN1bHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpsb2FkcyIsICZzLCAmbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJmLmZwID0gTlVMTDsKKyAgICByZi5wdHIgPSBzOworICAgIHJmLmVuZCA9IHMgKyBuOworICAgIHJmLnN0cmluZ3MgPSBQeUxpc3RfTmV3KDApOworICAgIHJmLmRlcHRoID0gMDsKKyAgICByZXN1bHQgPSByZWFkX29iamVjdCgmcmYpOworICAgIFB5X0RFQ1JFRihyZi5zdHJpbmdzKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIobG9hZHNfZG9jLApAQCAtMTI3MywxMSArMTI3MywxMSBAQAogaWdub3JlZC4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1hcnNoYWxfbWV0aG9kc1tdID0gewotCXsiZHVtcCIsCW1hcnNoYWxfZHVtcCwJTUVUSF9WQVJBUkdTLAlkdW1wX2RvY30sCi0JeyJsb2FkIiwJbWFyc2hhbF9sb2FkLAlNRVRIX08sCQlsb2FkX2RvY30sCi0JeyJkdW1wcyIsCW1hcnNoYWxfZHVtcHMsCU1FVEhfVkFSQVJHUywJZHVtcHNfZG9jfSwKLQl7ImxvYWRzIiwJbWFyc2hhbF9sb2FkcywJTUVUSF9WQVJBUkdTLAlsb2Fkc19kb2N9LAotCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAgeyJkdW1wIiwgICAgICAgICAgICBtYXJzaGFsX2R1bXAsICAgTUVUSF9WQVJBUkdTLCAgIGR1bXBfZG9jfSwKKyAgICB7ImxvYWQiLCAgICAgICAgICAgIG1hcnNoYWxfbG9hZCwgICBNRVRIX08sICAgICAgICAgbG9hZF9kb2N9LAorICAgIHsiZHVtcHMiLCAgICAgICAgICAgbWFyc2hhbF9kdW1wcywgIE1FVEhfVkFSQVJHUywgICBkdW1wc19kb2N9LAorICAgIHsibG9hZHMiLCAgICAgICAgICAgbWFyc2hhbF9sb2FkcywgIE1FVEhfVkFSQVJHUywgICBsb2Fkc19kb2N9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBQeURvY19TVFJWQVIobWFyc2hhbF9kb2MsCkBAIC0xMzEzLDkgKzEzMTMsOSBAQAogUHlNT0RJTklUX0ZVTkMKIFB5TWFyc2hhbF9Jbml0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm1vZCA9IFB5X0luaXRNb2R1bGUzKCJtYXJzaGFsIiwgbWFyc2hhbF9tZXRob2RzLAotCQltYXJzaGFsX2RvYyk7Ci0JaWYgKG1vZCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kLCAidmVyc2lvbiIsIFB5X01BUlNIQUxfVkVSU0lPTik7CisgICAgUHlPYmplY3QgKm1vZCA9IFB5X0luaXRNb2R1bGUzKCJtYXJzaGFsIiwgbWFyc2hhbF9tZXRob2RzLAorICAgICAgICBtYXJzaGFsX2RvYyk7CisgICAgaWYgKG1vZCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kLCAidmVyc2lvbiIsIFB5X01BUlNIQUxfVkVSU0lPTik7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vbW9kc3VwcG9ydC5jIGIvUHl0aG9uL21vZHN1cHBvcnQuYwppbmRleCBkNTQxNThmLi42ZWU0OGYzIDEwMDY0NAotLS0gYS9QeXRob24vbW9kc3VwcG9ydC5jCisrKyBiL1B5dGhvbi9tb2RzdXBwb3J0LmMKQEAgLTMwLDc2ICszMCw3NiBAQAogCiBQeU9iamVjdCAqCiBQeV9Jbml0TW9kdWxlNChjb25zdCBjaGFyICpuYW1lLCBQeU1ldGhvZERlZiAqbWV0aG9kcywgY29uc3QgY2hhciAqZG9jLAotCSAgICAgICBQeU9iamVjdCAqcGFzc3Rocm91Z2gsIGludCBtb2R1bGVfYXBpX3ZlcnNpb24pCisgICAgICAgICAgICAgICBQeU9iamVjdCAqcGFzc3Rocm91Z2gsIGludCBtb2R1bGVfYXBpX3ZlcnNpb24pCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqdiwgKm47Ci0JUHlNZXRob2REZWYgKm1sOwotCWlmICghUHlfSXNJbml0aWFsaXplZCgpKQotCSAgICBQeV9GYXRhbEVycm9yKCJJbnRlcnByZXRlciBub3QgaW5pdGlhbGl6ZWQgKHZlcnNpb24gbWlzbWF0Y2g/KSIpOwotCWlmIChtb2R1bGVfYXBpX3ZlcnNpb24gIT0gUFlUSE9OX0FQSV9WRVJTSU9OKSB7Ci0JCWNoYXIgbWVzc2FnZVs1MTJdOwotCQlQeU9TX3NucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSwgCi0JCQkgICAgICBhcGlfdmVyc2lvbl93YXJuaW5nLCBuYW1lLCAKLQkJCSAgICAgIFBZVEhPTl9BUElfVkVSU0lPTiwgbmFtZSwgCi0JCQkgICAgICBtb2R1bGVfYXBpX3ZlcnNpb24pOwotCQlpZiAoUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywgbWVzc2FnZSkpIAotCQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIE1ha2Ugc3VyZSBuYW1lIGlzIGZ1bGx5IHF1YWxpZmllZC4KKyAgICBQeU9iamVjdCAqbSwgKmQsICp2LCAqbjsKKyAgICBQeU1ldGhvZERlZiAqbWw7CisgICAgaWYgKCFQeV9Jc0luaXRpYWxpemVkKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkludGVycHJldGVyIG5vdCBpbml0aWFsaXplZCAodmVyc2lvbiBtaXNtYXRjaD8pIik7CisgICAgaWYgKG1vZHVsZV9hcGlfdmVyc2lvbiAhPSBQWVRIT05fQVBJX1ZFUlNJT04pIHsKKyAgICAgICAgY2hhciBtZXNzYWdlWzUxMl07CisgICAgICAgIFB5T1Nfc25wcmludGYobWVzc2FnZSwgc2l6ZW9mKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIGFwaV92ZXJzaW9uX3dhcm5pbmcsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgUFlUSE9OX0FQSV9WRVJTSU9OLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9hcGlfdmVyc2lvbik7CisgICAgICAgIGlmIChQeUVycl9XYXJuKFB5RXhjX1J1bnRpbWVXYXJuaW5nLCBtZXNzYWdlKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvKiBNYWtlIHN1cmUgbmFtZSBpcyBmdWxseSBxdWFsaWZpZWQuCiAKLQkgICBUaGlzIGlzIGEgYml0IG9mIGEgaGFjazogd2hlbiB0aGUgc2hhcmVkIGxpYnJhcnkgaXMgbG9hZGVkLAotCSAgIHRoZSBtb2R1bGUgbmFtZSBpcyAicGFja2FnZS5tb2R1bGUiLCBidXQgdGhlIG1vZHVsZSBjYWxscwotCSAgIFB5X0luaXRNb2R1bGUqKCkgd2l0aCBqdXN0ICJtb2R1bGUiIGZvciB0aGUgbmFtZS4gIFRoZSBzaGFyZWQKLQkgICBsaWJyYXJ5IGxvYWRlciBzcXVpcnJlbHMgYXdheSB0aGUgdHJ1ZSBuYW1lIG9mIHRoZSBtb2R1bGUgaW4KLQkgICBfUHlfUGFja2FnZUNvbnRleHQsIGFuZCBQeV9Jbml0TW9kdWxlKigpIHdpbGwgc3Vic3RpdHV0ZSB0aGlzCi0JICAgKGlmIHRoZSBuYW1lIGFjdHVhbGx5IG1hdGNoZXMpLgotCSovCi0JaWYgKF9QeV9QYWNrYWdlQ29udGV4dCAhPSBOVUxMKSB7Ci0JCWNoYXIgKnAgPSBzdHJyY2hyKF9QeV9QYWNrYWdlQ29udGV4dCwgJy4nKTsKLQkJaWYgKHAgIT0gTlVMTCAmJiBzdHJjbXAobmFtZSwgcCsxKSA9PSAwKSB7Ci0JCQluYW1lID0gX1B5X1BhY2thZ2VDb250ZXh0OwotCQkJX1B5X1BhY2thZ2VDb250ZXh0ID0gTlVMTDsKLQkJfQotCX0KLQlpZiAoKG0gPSBQeUltcG9ydF9BZGRNb2R1bGUobmFtZSkpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWlmIChtZXRob2RzICE9IE5VTEwpIHsKLQkJbiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcobmFtZSk7Ci0JCWlmIChuID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZm9yIChtbCA9IG1ldGhvZHM7IG1sLT5tbF9uYW1lICE9IE5VTEw7IG1sKyspIHsKLQkJCWlmICgobWwtPm1sX2ZsYWdzICYgTUVUSF9DTEFTUykgfHwKLQkJCSAgICAobWwtPm1sX2ZsYWdzICYgTUVUSF9TVEFUSUMpKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJCQkibW9kdWxlIGZ1bmN0aW9ucyBjYW5ub3Qgc2V0IgotCQkJCQkJIiBNRVRIX0NMQVNTIG9yIE1FVEhfU1RBVElDIik7Ci0JCQkJUHlfREVDUkVGKG4pOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJdiA9IFB5Q0Z1bmN0aW9uX05ld0V4KG1sLCBwYXNzdGhyb3VnaCwgbik7Ci0JCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKG4pOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIG1sLT5tbF9uYW1lLCB2KSAhPSAwKSB7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCVB5X0RFQ1JFRihuKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJCVB5X0RFQ1JFRih2KTsKLQkJfQotCQlQeV9ERUNSRUYobik7Ci0JfQotCWlmIChkb2MgIT0gTlVMTCkgewotCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhkb2MpOwotCQlpZiAodiA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2RvY19fIiwgdikgIT0gMCkgewotCQkJUHlfWERFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5X0RFQ1JFRih2KTsKLQl9Ci0JcmV0dXJuIG07CisgICAgICAgVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2s6IHdoZW4gdGhlIHNoYXJlZCBsaWJyYXJ5IGlzIGxvYWRlZCwKKyAgICAgICB0aGUgbW9kdWxlIG5hbWUgaXMgInBhY2thZ2UubW9kdWxlIiwgYnV0IHRoZSBtb2R1bGUgY2FsbHMKKyAgICAgICBQeV9Jbml0TW9kdWxlKigpIHdpdGgganVzdCAibW9kdWxlIiBmb3IgdGhlIG5hbWUuICBUaGUgc2hhcmVkCisgICAgICAgbGlicmFyeSBsb2FkZXIgc3F1aXJyZWxzIGF3YXkgdGhlIHRydWUgbmFtZSBvZiB0aGUgbW9kdWxlIGluCisgICAgICAgX1B5X1BhY2thZ2VDb250ZXh0LCBhbmQgUHlfSW5pdE1vZHVsZSooKSB3aWxsIHN1YnN0aXR1dGUgdGhpcworICAgICAgIChpZiB0aGUgbmFtZSBhY3R1YWxseSBtYXRjaGVzKS4KKyAgICAqLworICAgIGlmIChfUHlfUGFja2FnZUNvbnRleHQgIT0gTlVMTCkgeworICAgICAgICBjaGFyICpwID0gc3RycmNocihfUHlfUGFja2FnZUNvbnRleHQsICcuJyk7CisgICAgICAgIGlmIChwICE9IE5VTEwgJiYgc3RyY21wKG5hbWUsIHArMSkgPT0gMCkgeworICAgICAgICAgICAgbmFtZSA9IF9QeV9QYWNrYWdlQ29udGV4dDsKKyAgICAgICAgICAgIF9QeV9QYWNrYWdlQ29udGV4dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChtID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAobWV0aG9kcyAhPSBOVUxMKSB7CisgICAgICAgIG4gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworICAgICAgICBpZiAobiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGZvciAobWwgPSBtZXRob2RzOyBtbC0+bWxfbmFtZSAhPSBOVUxMOyBtbCsrKSB7CisgICAgICAgICAgICBpZiAoKG1sLT5tbF9mbGFncyAmIE1FVEhfQ0xBU1MpIHx8CisgICAgICAgICAgICAgICAgKG1sLT5tbF9mbGFncyAmIE1FVEhfU1RBVElDKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlIGZ1bmN0aW9ucyBjYW5ub3Qgc2V0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIE1FVEhfQ0xBU1Mgb3IgTUVUSF9TVEFUSUMiKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2ID0gUHlDRnVuY3Rpb25fTmV3RXgobWwsIHBhc3N0aHJvdWdoLCBuKTsKKyAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgbWwtPm1sX25hbWUsIHYpICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG4pOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihuKTsKKyAgICB9CisgICAgaWYgKGRvYyAhPSBOVUxMKSB7CisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGRvYyk7CisgICAgICAgIGlmICh2ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fZG9jX18iLCB2KSAhPSAwKSB7CisgICAgICAgICAgICBQeV9YREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgIH0KKyAgICByZXR1cm4gbTsKIH0KIAogCkBAIC0xMDgsNDEgKzEwOCw0MSBAQAogc3RhdGljIGludAogY291bnRmb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0LCBpbnQgZW5kY2hhcikKIHsKLQlpbnQgY291bnQgPSAwOwotCWludCBsZXZlbCA9IDA7Ci0Jd2hpbGUgKGxldmVsID4gMCB8fCAqZm9ybWF0ICE9IGVuZGNoYXIpIHsKLQkJc3dpdGNoICgqZm9ybWF0KSB7Ci0JCWNhc2UgJ1wwJzoKLQkJCS8qIFByZW1hdHVyZSBlbmQgKi8KLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJInVubWF0Y2hlZCBwYXJlbiBpbiBmb3JtYXQiKTsKLQkJCXJldHVybiAtMTsKLQkJY2FzZSAnKCc6Ci0JCWNhc2UgJ1snOgotCQljYXNlICd7JzoKLQkJCWlmIChsZXZlbCA9PSAwKQotCQkJCWNvdW50Kys7Ci0JCQlsZXZlbCsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgJyknOgotCQljYXNlICddJzoKLQkJY2FzZSAnfSc6Ci0JCQlsZXZlbC0tOwotCQkJYnJlYWs7Ci0JCWNhc2UgJyMnOgotCQljYXNlICcmJzoKLQkJY2FzZSAnLCc6Ci0JCWNhc2UgJzonOgotCQljYXNlICcgJzoKLQkJY2FzZSAnXHQnOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAobGV2ZWwgPT0gMCkKLQkJCQljb3VudCsrOwotCQl9Ci0JCWZvcm1hdCsrOwotCX0KLQlyZXR1cm4gY291bnQ7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBpbnQgbGV2ZWwgPSAwOworICAgIHdoaWxlIChsZXZlbCA+IDAgfHwgKmZvcm1hdCAhPSBlbmRjaGFyKSB7CisgICAgICAgIHN3aXRjaCAoKmZvcm1hdCkgeworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAvKiBQcmVtYXR1cmUgZW5kICovCisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVubWF0Y2hlZCBwYXJlbiBpbiBmb3JtYXQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgY2FzZSAnKCc6CisgICAgICAgIGNhc2UgJ1snOgorICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSAwKQorICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBsZXZlbCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyknOgorICAgICAgICBjYXNlICddJzoKKyAgICAgICAgY2FzZSAnfSc6CisgICAgICAgICAgICBsZXZlbC0tOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJyMnOgorICAgICAgICBjYXNlICcmJzoKKyAgICAgICAgY2FzZSAnLCc6CisgICAgICAgIGNhc2UgJzonOgorICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMCkKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICB9CisgICAgICAgIGZvcm1hdCsrOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7CiB9CiAKIApAQCAtMTU4LDQ4NiArMTU4LDQ4NiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRvX21rZGljdChjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBlbmRjaGFyLCBpbnQgbiwgaW50IGZsYWdzKQogewotCVB5T2JqZWN0ICpkOwotCWludCBpOwotCWludCBpdGVtZmFpbGVkID0gMDsKLQlpZiAobiA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmICgoZCA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogTm90ZSB0aGF0IHdlIGNhbid0IGJhaWwgaW1tZWRpYXRlbHkgb24gZXJyb3IgYXMgdGhpcyB3aWxsIGxlYWsKLQkgICByZWZjb3VudHMgb24gYW55ICdOJyBhcmd1bWVudHMuICovCi0JZm9yIChpID0gMDsgaSA8IG47IGkrPSAyKSB7Ci0JCVB5T2JqZWN0ICprLCAqdjsKLQkJaW50IGVycjsKLQkJayA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEsIGZsYWdzKTsKLQkJaWYgKGsgPT0gTlVMTCkgewotCQkJaXRlbWZhaWxlZCA9IDE7Ci0JCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQlrID0gUHlfTm9uZTsKLQkJfQotCQl2ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOwotCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQlpdGVtZmFpbGVkID0gMTsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXYgPSBQeV9Ob25lOwotCQl9Ci0JCWVyciA9IFB5RGljdF9TZXRJdGVtKGQsIGssIHYpOwotCQlQeV9ERUNSRUYoayk7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJaWYgKGVyciA8IDAgfHwgaXRlbWZhaWxlZCkgewotCQkJUHlfREVDUkVGKGQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKGQgIT0gTlVMTCAmJiAqKnBfZm9ybWF0ICE9IGVuZGNoYXIpIHsKLQkJUHlfREVDUkVGKGQpOwotCQlkID0gTlVMTDsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJVbm1hdGNoZWQgcGFyZW4gaW4gZm9ybWF0Iik7Ci0JfQotCWVsc2UgaWYgKGVuZGNoYXIpCi0JCSsrKnBfZm9ybWF0OwotCXJldHVybiBkOworICAgIFB5T2JqZWN0ICpkOworICAgIGludCBpOworICAgIGludCBpdGVtZmFpbGVkID0gMDsKKyAgICBpZiAobiA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZCA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogTm90ZSB0aGF0IHdlIGNhbid0IGJhaWwgaW1tZWRpYXRlbHkgb24gZXJyb3IgYXMgdGhpcyB3aWxsIGxlYWsKKyAgICAgICByZWZjb3VudHMgb24gYW55ICdOJyBhcmd1bWVudHMuICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrPSAyKSB7CisgICAgICAgIFB5T2JqZWN0ICprLCAqdjsKKyAgICAgICAgaW50IGVycjsKKyAgICAgICAgayA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEsIGZsYWdzKTsKKyAgICAgICAgaWYgKGsgPT0gTlVMTCkgeworICAgICAgICAgICAgaXRlbWZhaWxlZCA9IDE7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICBrID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICB2ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOworICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICBpdGVtZmFpbGVkID0gMTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHYgPSBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKGQsIGssIHYpOworICAgICAgICBQeV9ERUNSRUYoayk7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgaWYgKGVyciA8IDAgfHwgaXRlbWZhaWxlZCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGQgIT0gTlVMTCAmJiAqKnBfZm9ybWF0ICE9IGVuZGNoYXIpIHsKKyAgICAgICAgUHlfREVDUkVGKGQpOworICAgICAgICBkID0gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVubWF0Y2hlZCBwYXJlbiBpbiBmb3JtYXQiKTsKKyAgICB9CisgICAgZWxzZSBpZiAoZW5kY2hhcikKKyAgICAgICAgKysqcF9mb3JtYXQ7CisgICAgcmV0dXJuIGQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkb19ta2xpc3QoY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZW5kY2hhciwgaW50IG4sIGludCBmbGFncykKIHsKLQlQeU9iamVjdCAqdjsKLQlpbnQgaTsKLQlpbnQgaXRlbWZhaWxlZCA9IDA7Ci0JaWYgKG4gPCAwKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gUHlMaXN0X05ldyhuKTsKLQlpZiAodiA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYmFpbCBpbW1lZGlhdGVseSBvbiBlcnJvciBhcyB0aGlzIHdpbGwgbGVhawotCSAgIHJlZmNvdW50cyBvbiBhbnkgJ04nIGFyZ3VtZW50cy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOwotCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQlpdGVtZmFpbGVkID0gMTsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXcgPSBQeV9Ob25lOwotCQl9Ci0JCVB5TGlzdF9TRVRfSVRFTSh2LCBpLCB3KTsKLQl9CisgICAgUHlPYmplY3QgKnY7CisgICAgaW50IGk7CisgICAgaW50IGl0ZW1mYWlsZWQgPSAwOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdiA9IFB5TGlzdF9OZXcobik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogTm90ZSB0aGF0IHdlIGNhbid0IGJhaWwgaW1tZWRpYXRlbHkgb24gZXJyb3IgYXMgdGhpcyB3aWxsIGxlYWsKKyAgICAgICByZWZjb3VudHMgb24gYW55ICdOJyBhcmd1bWVudHMuICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBQeU9iamVjdCAqdyA9IGRvX21rdmFsdWUocF9mb3JtYXQsIHBfdmEsIGZsYWdzKTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgaXRlbWZhaWxlZCA9IDE7CisgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICB3ID0gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICBQeUxpc3RfU0VUX0lURU0odiwgaSwgdyk7CisgICAgfQogCi0JaWYgKGl0ZW1mYWlsZWQpIHsKLQkJLyogZG9fbWt2YWx1ZSgpIHNob3VsZCBoYXZlIGFscmVhZHkgc2V0IGFuIGVycm9yICovCi0JCVB5X0RFQ1JFRih2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICgqKnBfZm9ybWF0ICE9IGVuZGNoYXIpIHsKLQkJUHlfREVDUkVGKHYpOwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkJIlVubWF0Y2hlZCBwYXJlbiBpbiBmb3JtYXQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChlbmRjaGFyKQotCQkrKypwX2Zvcm1hdDsKLQlyZXR1cm4gdjsKKyAgICBpZiAoaXRlbWZhaWxlZCkgeworICAgICAgICAvKiBkb19ta3ZhbHVlKCkgc2hvdWxkIGhhdmUgYWxyZWFkeSBzZXQgYW4gZXJyb3IgKi8KKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCoqcF9mb3JtYXQgIT0gZW5kY2hhcikgeworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbm1hdGNoZWQgcGFyZW4gaW4gZm9ybWF0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoZW5kY2hhcikKKyAgICAgICAgKysqcF9mb3JtYXQ7CisgICAgcmV0dXJuIHY7CiB9CiAKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiBzdGF0aWMgaW50CiBfdXN0cmxlbihQeV9VTklDT0RFICp1KQogewotCWludCBpID0gMDsKLQlQeV9VTklDT0RFICp2ID0gdTsKLQl3aGlsZSAoKnYgIT0gMCkgeyBpKys7IHYrKzsgfSAKLQlyZXR1cm4gaTsKKyAgICBpbnQgaSA9IDA7CisgICAgUHlfVU5JQ09ERSAqdiA9IHU7CisgICAgd2hpbGUgKCp2ICE9IDApIHsgaSsrOyB2Kys7IH0KKyAgICByZXR1cm4gaTsKIH0KICNlbmRpZgogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9fbWt0dXBsZShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBlbmRjaGFyLCBpbnQgbiwgaW50IGZsYWdzKQogewotCVB5T2JqZWN0ICp2OwotCWludCBpOwotCWludCBpdGVtZmFpbGVkID0gMDsKLQlpZiAobiA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmICgodiA9IFB5VHVwbGVfTmV3KG4pKSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgYmFpbCBpbW1lZGlhdGVseSBvbiBlcnJvciBhcyB0aGlzIHdpbGwgbGVhawotCSAgIHJlZmNvdW50cyBvbiBhbnkgJ04nIGFyZ3VtZW50cy4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVB5T2JqZWN0ICp3ID0gZG9fbWt2YWx1ZShwX2Zvcm1hdCwgcF92YSwgZmxhZ3MpOwotCQlpZiAodyA9PSBOVUxMKSB7Ci0JCQlpdGVtZmFpbGVkID0gMTsKLQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCXcgPSBQeV9Ob25lOwotCQl9Ci0JCVB5VHVwbGVfU0VUX0lURU0odiwgaSwgdyk7Ci0JfQotCWlmIChpdGVtZmFpbGVkKSB7Ci0JCS8qIGRvX21rdmFsdWUoKSBzaG91bGQgaGF2ZSBhbHJlYWR5IHNldCBhbiBlcnJvciAqLwotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoKipwX2Zvcm1hdCAhPSBlbmRjaGFyKSB7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAotCQkJCSJVbm1hdGNoZWQgcGFyZW4gaW4gZm9ybWF0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoZW5kY2hhcikKLQkJKysqcF9mb3JtYXQ7Ci0JcmV0dXJuIHY7CisgICAgUHlPYmplY3QgKnY7CisgICAgaW50IGk7CisgICAgaW50IGl0ZW1mYWlsZWQgPSAwOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCh2ID0gUHlUdXBsZV9OZXcobikpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIE5vdGUgdGhhdCB3ZSBjYW4ndCBiYWlsIGltbWVkaWF0ZWx5IG9uIGVycm9yIGFzIHRoaXMgd2lsbCBsZWFrCisgICAgICAgcmVmY291bnRzIG9uIGFueSAnTicgYXJndW1lbnRzLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgUHlPYmplY3QgKncgPSBkb19ta3ZhbHVlKHBfZm9ybWF0LCBwX3ZhLCBmbGFncyk7CisgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGl0ZW1mYWlsZWQgPSAxOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgdyA9IFB5X05vbmU7CisgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCB3KTsKKyAgICB9CisgICAgaWYgKGl0ZW1mYWlsZWQpIHsKKyAgICAgICAgLyogZG9fbWt2YWx1ZSgpIHNob3VsZCBoYXZlIGFscmVhZHkgc2V0IGFuIGVycm9yICovCisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgqKnBfZm9ybWF0ICE9IGVuZGNoYXIpIHsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5tYXRjaGVkIHBhcmVuIGluIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGVuZGNoYXIpCisgICAgICAgICsrKnBfZm9ybWF0OworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogZG9fbWt2YWx1ZShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncykKIHsKLQlmb3IgKDs7KSB7Ci0JCXN3aXRjaCAoKigqcF9mb3JtYXQpKyspIHsKLQkJY2FzZSAnKCc6Ci0JCQlyZXR1cm4gZG9fbWt0dXBsZShwX2Zvcm1hdCwgcF92YSwgJyknLAotCQkJCQkgIGNvdW50Zm9ybWF0KCpwX2Zvcm1hdCwgJyknKSwgZmxhZ3MpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgc3dpdGNoICgqKCpwX2Zvcm1hdCkrKykgeworICAgICAgICBjYXNlICcoJzoKKyAgICAgICAgICAgIHJldHVybiBkb19ta3R1cGxlKHBfZm9ybWF0LCBwX3ZhLCAnKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICcpJyksIGZsYWdzKTsKIAotCQljYXNlICdbJzoKLQkJCXJldHVybiBkb19ta2xpc3QocF9mb3JtYXQsIHBfdmEsICddJywKLQkJCQkJIGNvdW50Zm9ybWF0KCpwX2Zvcm1hdCwgJ10nKSwgZmxhZ3MpOworICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgIHJldHVybiBkb19ta2xpc3QocF9mb3JtYXQsIHBfdmEsICddJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRmb3JtYXQoKnBfZm9ybWF0LCAnXScpLCBmbGFncyk7CiAKLQkJY2FzZSAneyc6Ci0JCQlyZXR1cm4gZG9fbWtkaWN0KHBfZm9ybWF0LCBwX3ZhLCAnfScsCi0JCQkJCSBjb3VudGZvcm1hdCgqcF9mb3JtYXQsICd9JyksIGZsYWdzKTsKKyAgICAgICAgY2FzZSAneyc6CisgICAgICAgICAgICByZXR1cm4gZG9fbWtkaWN0KHBfZm9ybWF0LCBwX3ZhLCAnfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Zm9ybWF0KCpwX2Zvcm1hdCwgJ30nKSwgZmxhZ3MpOwogCi0JCWNhc2UgJ2InOgotCQljYXNlICdCJzoKLQkJY2FzZSAnaCc6Ci0JCWNhc2UgJ2knOgotCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXZhX2FyZygqcF92YSwgaW50KSk7Ci0JCQkKLQkJY2FzZSAnSCc6Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBpbnQpKTsKKyAgICAgICAgY2FzZSAnYic6CisgICAgICAgIGNhc2UgJ0InOgorICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdmFfYXJnKCpwX3ZhLCBpbnQpKTsKIAotCQljYXNlICdJJzoKLQkJewotCQkJdW5zaWduZWQgaW50IG47Ci0JCQluID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBpbnQpOwotCQkJaWYgKG4gPiAodW5zaWduZWQgbG9uZylQeUludF9HZXRNYXgoKSkKLQkJCQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpbik7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKG4pOwotCQl9Ci0JCQotCQljYXNlICduJzoKKyAgICAgICAgY2FzZSAnSCc6CisgICAgICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBpbnQpKTsKKworICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IG47CisgICAgICAgICAgICBuID0gdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBpbnQpOworICAgICAgICAgICAgaWYgKG4gPiAodW5zaWduZWQgbG9uZylQeUludF9HZXRNYXgoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKHVuc2lnbmVkIGxvbmcpbik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG4pOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnbic6CiAjaWYgU0laRU9GX1NJWkVfVCE9U0laRU9GX0xPTkcKLQkJCXJldHVybiBQeUludF9Gcm9tU3NpemVfdCh2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QpKTsKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tU3NpemVfdCh2YV9hcmcoKnBfdmEsIFB5X3NzaXplX3QpKTsKICNlbmRpZgotCQkJLyogRmFsbCB0aHJvdWdoIGZyb20gJ24nIHRvICdsJyBpZiBQeV9zc2l6ZV90IGlzIGxvbmcgKi8KLQkJY2FzZSAnbCc6Ci0JCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFfYXJnKCpwX3ZhLCBsb25nKSk7CisgICAgICAgICAgICAvKiBGYWxsIHRocm91Z2ggZnJvbSAnbicgdG8gJ2wnIGlmIFB5X3NzaXplX3QgaXMgbG9uZyAqLworICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YV9hcmcoKnBfdmEsIGxvbmcpKTsKIAotCQljYXNlICdrJzoKLQkJewotCQkJdW5zaWduZWQgbG9uZyBuOwotCQkJbiA9IHZhX2FyZygqcF92YSwgdW5zaWduZWQgbG9uZyk7Ci0JCQlpZiAobiA+ICh1bnNpZ25lZCBsb25nKVB5SW50X0dldE1heCgpKQotCQkJCXJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhuKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobik7Ci0JCX0KKyAgICAgICAgY2FzZSAnayc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbjsKKyAgICAgICAgICAgIG4gPSB2YV9hcmcoKnBfdmEsIHVuc2lnbmVkIGxvbmcpOworICAgICAgICAgICAgaWYgKG4gPiAodW5zaWduZWQgbG9uZylQeUludF9HZXRNYXgoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcobik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKG4pOworICAgICAgICB9CiAKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwotCQljYXNlICdMJzoKLQkJCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKChQWV9MT05HX0xPTkcpdmFfYXJnKCpwX3ZhLCBQWV9MT05HX0xPTkcpKTsKKyAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZygoUFlfTE9OR19MT05HKXZhX2FyZygqcF92YSwgUFlfTE9OR19MT05HKSk7CiAKLQkJY2FzZSAnSyc6Ci0JCQlyZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKChQWV9MT05HX0xPTkcpdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcpKTsKKyAgICAgICAgY2FzZSAnSyc6CisgICAgICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKChQWV9MT05HX0xPTkcpdmFfYXJnKCpwX3ZhLCB1bnNpZ25lZCBQWV9MT05HX0xPTkcpKTsKICNlbmRpZgogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkJY2FzZSAndSc6Ci0JCXsKLQkJCVB5T2JqZWN0ICp2OwotCQkJUHlfVU5JQ09ERSAqdSA9IHZhX2FyZygqcF92YSwgUHlfVU5JQ09ERSAqKTsKLQkJCVB5X3NzaXplX3QgbjsJCi0JCQlpZiAoKipwX2Zvcm1hdCA9PSAnIycpIHsKLQkJCQkrKypwX2Zvcm1hdDsKLQkJCQlpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkKLQkJCQkJbiA9IHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCk7Ci0JCQkJZWxzZQotCQkJCQluID0gdmFfYXJnKCpwX3ZhLCBpbnQpOwotCQkJfQotCQkJZWxzZQotCQkJCW4gPSAtMTsKLQkJCWlmICh1ID09IE5VTEwpIHsKLQkJCQl2ID0gUHlfTm9uZTsKLQkJCQlQeV9JTkNSRUYodik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobiA8IDApCi0JCQkJCW4gPSBfdXN0cmxlbih1KTsKLQkJCQl2ID0gUHlVbmljb2RlX0Zyb21Vbmljb2RlKHUsIG4pOwotCQkJfQotCQkJcmV0dXJuIHY7Ci0JCX0KKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2OworICAgICAgICAgICAgUHlfVU5JQ09ERSAqdSA9IHZhX2FyZygqcF92YSwgUHlfVU5JQ09ERSAqKTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbjsKKyAgICAgICAgICAgIGlmICgqKnBfZm9ybWF0ID09ICcjJykgeworICAgICAgICAgICAgICAgICsrKnBfZm9ybWF0OworICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZMQUdfU0laRV9UKQorICAgICAgICAgICAgICAgICAgICBuID0gdmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG4gPSB2YV9hcmcoKnBfdmEsIGludCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbiA9IC0xOworICAgICAgICAgICAgaWYgKHUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHYgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgbiA9IF91c3RybGVuKHUpOworICAgICAgICAgICAgICAgIHYgPSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUodSwgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQogI2VuZGlmCi0JCWNhc2UgJ2YnOgotCQljYXNlICdkJzoKLQkJCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoCi0JCQkJKGRvdWJsZSl2YV9hcmcoKnBfdmEsIHZhX2RvdWJsZSkpOworICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKAorICAgICAgICAgICAgICAgIChkb3VibGUpdmFfYXJnKCpwX3ZhLCB2YV9kb3VibGUpKTsKIAogI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKLQkJY2FzZSAnRCc6Ci0JCQlyZXR1cm4gUHlDb21wbGV4X0Zyb21DQ29tcGxleCgKLQkJCQkqKChQeV9jb21wbGV4ICopdmFfYXJnKCpwX3ZhLCBQeV9jb21wbGV4ICopKSk7CisgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgcmV0dXJuIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoCisgICAgICAgICAgICAgICAgKigoUHlfY29tcGxleCAqKXZhX2FyZygqcF92YSwgUHlfY29tcGxleCAqKSkpOwogI2VuZGlmIC8qIFdJVEhPVVRfQ09NUExFWCAqLwogCi0JCWNhc2UgJ2MnOgotCQl7Ci0JCQljaGFyIHBbMV07Ci0JCQlwWzBdID0gKGNoYXIpdmFfYXJnKCpwX3ZhLCBpbnQpOwotCQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHAsIDEpOwotCQl9CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIHBbMV07CisgICAgICAgICAgICBwWzBdID0gKGNoYXIpdmFfYXJnKCpwX3ZhLCBpbnQpOworICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHAsIDEpOworICAgICAgICB9CiAKLQkJY2FzZSAncyc6Ci0JCWNhc2UgJ3onOgotCQl7Ci0JCQlQeU9iamVjdCAqdjsKLQkJCWNoYXIgKnN0ciA9IHZhX2FyZygqcF92YSwgY2hhciAqKTsKLQkJCVB5X3NzaXplX3QgbjsKLQkJCWlmICgqKnBfZm9ybWF0ID09ICcjJykgewotCQkJCSsrKnBfZm9ybWF0OwotCQkJCWlmIChmbGFncyAmIEZMQUdfU0laRV9UKQotCQkJCQluID0gdmFfYXJnKCpwX3ZhLCBQeV9zc2l6ZV90KTsKLQkJCQllbHNlCi0JCQkJCW4gPSB2YV9hcmcoKnBfdmEsIGludCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbiA9IC0xOwotCQkJaWYgKHN0ciA9PSBOVUxMKSB7Ci0JCQkJdiA9IFB5X05vbmU7Ci0JCQkJUHlfSU5DUkVGKHYpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKG4gPCAwKSB7Ci0JCQkJCXNpemVfdCBtID0gc3RybGVuKHN0cik7Ci0JCQkJCWlmIChtID4gUFlfU1NJWkVfVF9NQVgpIHsKLQkJCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotCQkJCQkJCSJzdHJpbmcgdG9vIGxvbmcgZm9yIFB5dGhvbiBzdHJpbmciKTsKLQkJCQkJCXJldHVybiBOVUxMOwotCQkJCQl9Ci0JCQkJCW4gPSAoUHlfc3NpemVfdCltOwotCQkJCX0KLQkJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoc3RyLCBuKTsKLQkJCX0KLQkJCXJldHVybiB2OwotCQl9CisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICBjYXNlICd6JzoKKyAgICAgICAgeworICAgICAgICAgICAgUHlPYmplY3QgKnY7CisgICAgICAgICAgICBjaGFyICpzdHIgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7CisgICAgICAgICAgICBQeV9zc2l6ZV90IG47CisgICAgICAgICAgICBpZiAoKipwX2Zvcm1hdCA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICArKypwX2Zvcm1hdDsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHX1NJWkVfVCkKKyAgICAgICAgICAgICAgICAgICAgbiA9IHZhX2FyZygqcF92YSwgUHlfc3NpemVfdCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBuID0gdmFfYXJnKCpwX3ZhLCBpbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG4gPSAtMTsKKyAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHYgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBzaXplX3QgbSA9IHN0cmxlbihzdHIpOworICAgICAgICAgICAgICAgICAgICBpZiAobSA+IFBZX1NTSVpFX1RfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIHRvbyBsb25nIGZvciBQeXRob24gc3RyaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuID0gKFB5X3NzaXplX3QpbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN0ciwgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQogCi0JCWNhc2UgJ04nOgotCQljYXNlICdTJzoKLQkJY2FzZSAnTyc6Ci0JCWlmICgqKnBfZm9ybWF0ID09ICcmJykgewotCQkJdHlwZWRlZiBQeU9iamVjdCAqKCpjb252ZXJ0ZXIpKHZvaWQgKik7Ci0JCQljb252ZXJ0ZXIgZnVuYyA9IHZhX2FyZygqcF92YSwgY29udmVydGVyKTsKLQkJCXZvaWQgKmFyZyA9IHZhX2FyZygqcF92YSwgdm9pZCAqKTsKLQkJCSsrKnBfZm9ybWF0OwotCQkJcmV0dXJuICgqZnVuYykoYXJnKTsKLQkJfQotCQllbHNlIHsKLQkJCVB5T2JqZWN0ICp2OwotCQkJdiA9IHZhX2FyZygqcF92YSwgUHlPYmplY3QgKik7Ci0JCQlpZiAodiAhPSBOVUxMKSB7Ci0JCQkJaWYgKCooKnBfZm9ybWF0IC0gMSkgIT0gJ04nKQotCQkJCQlQeV9JTkNSRUYodik7Ci0JCQl9Ci0JCQllbHNlIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCQkvKiBJZiBhIE5VTEwgd2FzIHBhc3NlZAotCQkJCSAqIGJlY2F1c2UgYSBjYWxsIHRoYXQgc2hvdWxkCi0JCQkJICogaGF2ZSBjb25zdHJ1Y3RlZCBhIHZhbHVlCi0JCQkJICogZmFpbGVkLCB0aGF0J3MgT0ssIGFuZCB3ZQotCQkJCSAqIHBhc3MgdGhlIGVycm9yIG9uOyBidXQgaWYKLQkJCQkgKiBubyBlcnJvciBvY2N1cnJlZCBpdCdzIG5vdAotCQkJCSAqIGNsZWFyIHRoYXQgdGhlIGNhbGxlciBrbmV3Ci0JCQkJICogd2hhdCBzaGUgd2FzIGRvaW5nLiAqLwotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkJIk5VTEwgb2JqZWN0IHBhc3NlZCB0byBQeV9CdWlsZFZhbHVlIik7Ci0JCQlyZXR1cm4gdjsKLQkJfQorICAgICAgICBjYXNlICdOJzoKKyAgICAgICAgY2FzZSAnUyc6CisgICAgICAgIGNhc2UgJ08nOgorICAgICAgICBpZiAoKipwX2Zvcm1hdCA9PSAnJicpIHsKKyAgICAgICAgICAgIHR5cGVkZWYgUHlPYmplY3QgKigqY29udmVydGVyKSh2b2lkICopOworICAgICAgICAgICAgY29udmVydGVyIGZ1bmMgPSB2YV9hcmcoKnBfdmEsIGNvbnZlcnRlcik7CisgICAgICAgICAgICB2b2lkICphcmcgPSB2YV9hcmcoKnBfdmEsIHZvaWQgKik7CisgICAgICAgICAgICArKypwX2Zvcm1hdDsKKyAgICAgICAgICAgIHJldHVybiAoKmZ1bmMpKGFyZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqdjsKKyAgICAgICAgICAgIHYgPSB2YV9hcmcoKnBfdmEsIFB5T2JqZWN0ICopOworICAgICAgICAgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICgqKCpwX2Zvcm1hdCAtIDEpICE9ICdOJykKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgLyogSWYgYSBOVUxMIHdhcyBwYXNzZWQKKyAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIGEgY2FsbCB0aGF0IHNob3VsZAorICAgICAgICAgICAgICAgICAqIGhhdmUgY29uc3RydWN0ZWQgYSB2YWx1ZQorICAgICAgICAgICAgICAgICAqIGZhaWxlZCwgdGhhdCdzIE9LLCBhbmQgd2UKKyAgICAgICAgICAgICAgICAgKiBwYXNzIHRoZSBlcnJvciBvbjsgYnV0IGlmCisgICAgICAgICAgICAgICAgICogbm8gZXJyb3Igb2NjdXJyZWQgaXQncyBub3QKKyAgICAgICAgICAgICAgICAgKiBjbGVhciB0aGF0IHRoZSBjYWxsZXIga25ldworICAgICAgICAgICAgICAgICAqIHdoYXQgc2hlIHdhcyBkb2luZy4gKi8KKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJOVUxMIG9iamVjdCBwYXNzZWQgdG8gUHlfQnVpbGRWYWx1ZSIpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KIAotCQljYXNlICc6JzoKLQkJY2FzZSAnLCc6Ci0JCWNhc2UgJyAnOgotCQljYXNlICdcdCc6Ci0JCQlicmVhazsKKyAgICAgICAgY2FzZSAnOic6CisgICAgICAgIGNhc2UgJywnOgorICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgYnJlYWs7CiAKLQkJZGVmYXVsdDoKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCQkiYmFkIGZvcm1hdCBjaGFyIHBhc3NlZCB0byBQeV9CdWlsZFZhbHVlIik7Ci0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAiYmFkIGZvcm1hdCBjaGFyIHBhc3NlZCB0byBQeV9CdWlsZFZhbHVlIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQl9Ci0JfQorICAgICAgICB9CisgICAgfQogfQogCiAKIFB5T2JqZWN0ICoKIFB5X0J1aWxkVmFsdWUoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdmFfbGlzdCB2YTsKLQlQeU9iamVjdCogcmV0dmFsOwotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXJldHZhbCA9IHZhX2J1aWxkX3ZhbHVlKGZvcm1hdCwgdmEsIDApOwotCXZhX2VuZCh2YSk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICB2YV9saXN0IHZhOworICAgIFB5T2JqZWN0KiByZXR2YWw7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgcmV0dmFsID0gdmFfYnVpbGRfdmFsdWUoZm9ybWF0LCB2YSwgMCk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCiBQeU9iamVjdCAqCiBfUHlfQnVpbGRWYWx1ZV9TaXplVChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhOwotCVB5T2JqZWN0KiByZXR2YWw7Ci0JdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0JcmV0dmFsID0gdmFfYnVpbGRfdmFsdWUoZm9ybWF0LCB2YSwgRkxBR19TSVpFX1QpOwotCXZhX2VuZCh2YSk7Ci0JcmV0dXJuIHJldHZhbDsKKyAgICB2YV9saXN0IHZhOworICAgIFB5T2JqZWN0KiByZXR2YWw7CisgICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7CisgICAgcmV0dmFsID0gdmFfYnVpbGRfdmFsdWUoZm9ybWF0LCB2YSwgRkxBR19TSVpFX1QpOworICAgIHZhX2VuZCh2YSk7CisgICAgcmV0dXJuIHJldHZhbDsKIH0KIAogUHlPYmplY3QgKgogUHlfVmFCdWlsZFZhbHVlKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKLQlyZXR1cm4gdmFfYnVpbGRfdmFsdWUoZm9ybWF0LCB2YSwgMCk7CisgICAgcmV0dXJuIHZhX2J1aWxkX3ZhbHVlKGZvcm1hdCwgdmEsIDApOwogfQogCiBQeU9iamVjdCAqCiBfUHlfVmFCdWlsZFZhbHVlX1NpemVUKGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKLQlyZXR1cm4gdmFfYnVpbGRfdmFsdWUoZm9ybWF0LCB2YSwgRkxBR19TSVpFX1QpOworICAgIHJldHVybiB2YV9idWlsZF92YWx1ZShmb3JtYXQsIHZhLCBGTEFHX1NJWkVfVCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB2YV9idWlsZF92YWx1ZShjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEsIGludCBmbGFncykKIHsKLQljb25zdCBjaGFyICpmID0gZm9ybWF0OwotCWludCBuID0gY291bnRmb3JtYXQoZiwgJ1wwJyk7Ci0JdmFfbGlzdCBsdmE7CisgICAgY29uc3QgY2hhciAqZiA9IGZvcm1hdDsKKyAgICBpbnQgbiA9IGNvdW50Zm9ybWF0KGYsICdcMCcpOworICAgIHZhX2xpc3QgbHZhOwogCiAjaWZkZWYgVkFfTElTVF9JU19BUlJBWQotCW1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOworICAgIG1lbWNweShsdmEsIHZhLCBzaXplb2YodmFfbGlzdCkpOwogI2Vsc2UKICNpZmRlZiBfX3ZhX2NvcHkKLQlfX3ZhX2NvcHkobHZhLCB2YSk7CisgICAgX192YV9jb3B5KGx2YSwgdmEpOwogI2Vsc2UKLQlsdmEgPSB2YTsKKyAgICBsdmEgPSB2YTsKICNlbmRpZgogI2VuZGlmCiAKLQlpZiAobiA8IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChuID09IDApIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JaWYgKG4gPT0gMSkKLQkJcmV0dXJuIGRvX21rdmFsdWUoJmYsICZsdmEsIGZsYWdzKTsKLQlyZXR1cm4gZG9fbWt0dXBsZSgmZiwgJmx2YSwgJ1wwJywgbiwgZmxhZ3MpOworICAgIGlmIChuIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICBpZiAobiA9PSAxKQorICAgICAgICByZXR1cm4gZG9fbWt2YWx1ZSgmZiwgJmx2YSwgZmxhZ3MpOworICAgIHJldHVybiBkb19ta3R1cGxlKCZmLCAmbHZhLCAnXDAnLCBuLCBmbGFncyk7CiB9CiAKIAogUHlPYmplY3QgKgogUHlFdmFsX0NhbGxGdW5jdGlvbihQeU9iamVjdCAqb2JqLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhcmdzOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpyZXM7CisgICAgdmFfbGlzdCB2YXJnczsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JdmFfc3RhcnQodmFyZ3MsIGZvcm1hdCk7CisgICAgdmFfc3RhcnQodmFyZ3MsIGZvcm1hdCk7CiAKLQlhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmFyZ3MpOwotCXZhX2VuZCh2YXJncyk7CisgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhcmdzKTsKKyAgICB2YV9lbmQodmFyZ3MpOwogCi0JaWYgKGFyZ3MgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChvYmosIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChvYmosIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKIAotCXJldHVybiByZXM7CisgICAgcmV0dXJuIHJlczsKIH0KIAogCiBQeU9iamVjdCAqCiBQeUV2YWxfQ2FsbE1ldGhvZChQeU9iamVjdCAqb2JqLCBjb25zdCBjaGFyICptZXRob2RuYW1lLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLQl2YV9saXN0IHZhcmdzOwotCVB5T2JqZWN0ICptZXRoOwotCVB5T2JqZWN0ICphcmdzOwotCVB5T2JqZWN0ICpyZXM7CisgICAgdmFfbGlzdCB2YXJnczsKKyAgICBQeU9iamVjdCAqbWV0aDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqcmVzOwogCi0JbWV0aCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcob2JqLCBtZXRob2RuYW1lKTsKLQlpZiAobWV0aCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBtZXRoID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvYmosIG1ldGhvZG5hbWUpOworICAgIGlmIChtZXRoID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JdmFfc3RhcnQodmFyZ3MsIGZvcm1hdCk7CisgICAgdmFfc3RhcnQodmFyZ3MsIGZvcm1hdCk7CiAKLQlhcmdzID0gUHlfVmFCdWlsZFZhbHVlKGZvcm1hdCwgdmFyZ3MpOwotCXZhX2VuZCh2YXJncyk7CisgICAgYXJncyA9IFB5X1ZhQnVpbGRWYWx1ZShmb3JtYXQsIHZhcmdzKTsKKyAgICB2YV9lbmQodmFyZ3MpOwogCi0JaWYgKGFyZ3MgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYobWV0aCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CisgICAgICAgIFB5X0RFQ1JFRihtZXRoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QobWV0aCwgYXJncyk7Ci0JUHlfREVDUkVGKG1ldGgpOwotCVB5X0RFQ1JFRihhcmdzKTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChtZXRoLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYobWV0aCk7CisgICAgUHlfREVDUkVGKGFyZ3MpOwogCi0JcmV0dXJuIHJlczsKKyAgICByZXR1cm4gcmVzOwogfQogCiBpbnQKIFB5TW9kdWxlX0FkZE9iamVjdChQeU9iamVjdCAqbSwgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKm8pCiB7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgICJQeU1vZHVsZV9BZGRPYmplY3QoKSBuZWVkcyBtb2R1bGUgYXMgZmlyc3QgYXJnIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCFvKSB7Ci0JCWlmICghUHlFcnJfT2NjdXJyZWQoKSkKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJQeU1vZHVsZV9BZGRPYmplY3QoKSBuZWVkcyBub24tTlVMTCB2YWx1ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQorICAgIFB5T2JqZWN0ICpkaWN0OworICAgIGlmICghUHlNb2R1bGVfQ2hlY2sobSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIlB5TW9kdWxlX0FkZE9iamVjdCgpIG5lZWRzIG1vZHVsZSBhcyBmaXJzdCBhcmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIW8pIHsKKyAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlNb2R1bGVfQWRkT2JqZWN0KCkgbmVlZHMgbm9uLU5VTEwgdmFsdWUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAotCWRpY3QgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWlmIChkaWN0ID09IE5VTEwpIHsKLQkJLyogSW50ZXJuYWwgZXJyb3IgLS0gbW9kdWxlcyBtdXN0IGhhdmUgYSBkaWN0ISAqLwotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICJtb2R1bGUgJyVzJyBoYXMgbm8gX19kaWN0X18iLAotCQkJICAgICBQeU1vZHVsZV9HZXROYW1lKG0pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbmFtZSwgbykpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYobyk7Ci0JcmV0dXJuIDA7CisgICAgZGljdCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICAvKiBJbnRlcm5hbCBlcnJvciAtLSBtb2R1bGVzIG11c3QgaGF2ZSBhIGRpY3QhICovCisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgIm1vZHVsZSAnJXMnIGhhcyBubyBfX2RpY3RfXyIsCisgICAgICAgICAgICAgICAgICAgICBQeU1vZHVsZV9HZXROYW1lKG0pKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbmFtZSwgbykpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBQeV9ERUNSRUYobyk7CisgICAgcmV0dXJuIDA7CiB9CiAKLWludCAKK2ludAogUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQoUHlPYmplY3QgKm0sIGNvbnN0IGNoYXIgKm5hbWUsIGxvbmcgdmFsdWUpCiB7Ci0JUHlPYmplY3QgKm8gPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7Ci0JaWYgKCFvKQotCQlyZXR1cm4gLTE7Ci0JaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtLCBuYW1lLCBvKSA9PSAwKQotCQlyZXR1cm4gMDsKLQlQeV9ERUNSRUYobyk7Ci0JcmV0dXJuIC0xOworICAgIFB5T2JqZWN0ICpvID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOworICAgIGlmICghbykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChQeU1vZHVsZV9BZGRPYmplY3QobSwgbmFtZSwgbykgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUHlfREVDUkVGKG8pOworICAgIHJldHVybiAtMTsKIH0KIAotaW50IAoraW50CiBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChQeU9iamVjdCAqbSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCiB7Ci0JUHlPYmplY3QgKm8gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbHVlKTsKLQlpZiAoIW8pCi0JCXJldHVybiAtMTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sIG5hbWUsIG8pID09IDApCi0JCXJldHVybiAwOwotCVB5X0RFQ1JFRihvKTsKLQlyZXR1cm4gLTE7CisgICAgUHlPYmplY3QgKm8gPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbHVlKTsKKyAgICBpZiAoIW8pCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG0sIG5hbWUsIG8pID09IDApCisgICAgICAgIHJldHVybiAwOworICAgIFB5X0RFQ1JFRihvKTsKKyAgICByZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vbXlzbnByaW50Zi5jIGIvUHl0aG9uL215c25wcmludGYuYwppbmRleCAzMTczODYzLi4zOWUzZmYxIDEwMDY0NAotLS0gYS9QeXRob24vbXlzbnByaW50Zi5jCisrKyBiL1B5dGhvbi9teXNucHJpbnRmLmMKQEAgLTIwLDIwICsyMCwyMCBAQAogCiAgICBSZXR1cm4gdmFsdWUgKHJ2KToKIAotCVdoZW4gMCA8PSBydiA8IHNpemUsIHRoZSBvdXRwdXQgY29udmVyc2lvbiB3YXMgdW5leGNlcHRpb25hbCwgYW5kCi0JcnYgY2hhcmFjdGVycyB3ZXJlIHdyaXR0ZW4gdG8gc3RyIChleGNsdWRpbmcgYSB0cmFpbGluZyBcMCBieXRlIGF0Ci0Jc3RyW3J2XSkuCisgICAgV2hlbiAwIDw9IHJ2IDwgc2l6ZSwgdGhlIG91dHB1dCBjb252ZXJzaW9uIHdhcyB1bmV4Y2VwdGlvbmFsLCBhbmQKKyAgICBydiBjaGFyYWN0ZXJzIHdlcmUgd3JpdHRlbiB0byBzdHIgKGV4Y2x1ZGluZyBhIHRyYWlsaW5nIFwwIGJ5dGUgYXQKKyAgICBzdHJbcnZdKS4KIAotCVdoZW4gcnYgPj0gc2l6ZSwgb3V0cHV0IGNvbnZlcnNpb24gd2FzIHRydW5jYXRlZCwgYW5kIGEgYnVmZmVyIG9mCi0Jc2l6ZSBydisxIHdvdWxkIGhhdmUgYmVlbiBuZWVkZWQgdG8gYXZvaWQgdHJ1bmNhdGlvbi4gIHN0cltzaXplLTFdCi0JaXMgXDAgaW4gdGhpcyBjYXNlLgorICAgIFdoZW4gcnYgPj0gc2l6ZSwgb3V0cHV0IGNvbnZlcnNpb24gd2FzIHRydW5jYXRlZCwgYW5kIGEgYnVmZmVyIG9mCisgICAgc2l6ZSBydisxIHdvdWxkIGhhdmUgYmVlbiBuZWVkZWQgdG8gYXZvaWQgdHJ1bmNhdGlvbi4gIHN0cltzaXplLTFdCisgICAgaXMgXDAgaW4gdGhpcyBjYXNlLgogCi0JV2hlbiBydiA8IDAsICJzb21ldGhpbmcgYmFkIGhhcHBlbmVkIi4gIHN0cltzaXplLTFdIGlzIFwwIGluIHRoaXMKLQljYXNlIHRvbywgYnV0IHRoZSByZXN0IG9mIHN0ciBpcyB1bnJlbGlhYmxlLiAgSXQgY291bGQgYmUgdGhhdAotCWFuIGVycm9yIGluIGZvcm1hdCBjb2RlcyB3YXMgZGV0ZWN0ZWQgYnkgbGliYywgb3Igb24gcGxhdGZvcm1zCi0Jd2l0aCBhIG5vbi1DOTkgdnNucHJpbnRmIHNpbXBseSB0aGF0IHRoZSBidWZmZXIgd2Fzbid0IGJpZyBlbm91Z2gKLQl0byBhdm9pZCB0cnVuY2F0aW9uLCBvciBvbiBwbGF0Zm9ybXMgd2l0aG91dCBhbnkgdnNucHJpbnRmIHRoYXQKLQlQeU1lbV9NYWxsb2MgY291bGRuJ3Qgb2J0YWluIHNwYWNlIGZvciBhIHRlbXAgYnVmZmVyLgorICAgIFdoZW4gcnYgPCAwLCAic29tZXRoaW5nIGJhZCBoYXBwZW5lZCIuICBzdHJbc2l6ZS0xXSBpcyBcMCBpbiB0aGlzCisgICAgY2FzZSB0b28sIGJ1dCB0aGUgcmVzdCBvZiBzdHIgaXMgdW5yZWxpYWJsZS4gIEl0IGNvdWxkIGJlIHRoYXQKKyAgICBhbiBlcnJvciBpbiBmb3JtYXQgY29kZXMgd2FzIGRldGVjdGVkIGJ5IGxpYmMsIG9yIG9uIHBsYXRmb3JtcworICAgIHdpdGggYSBub24tQzk5IHZzbnByaW50ZiBzaW1wbHkgdGhhdCB0aGUgYnVmZmVyIHdhc24ndCBiaWcgZW5vdWdoCisgICAgdG8gYXZvaWQgdHJ1bmNhdGlvbiwgb3Igb24gcGxhdGZvcm1zIHdpdGhvdXQgYW55IHZzbnByaW50ZiB0aGF0CisgICAgUHlNZW1fTWFsbG9jIGNvdWxkbid0IG9idGFpbiBzcGFjZSBmb3IgYSB0ZW1wIGJ1ZmZlci4KIAogICAgQ0FVVElPTjogIFVubGlrZSBDOTksIHN0ciAhPSBOVUxMIGFuZCBzaXplID4gMCBhcmUgcmVxdWlyZWQuCiAqLwpAQCAtNDEsNjUgKzQxLDY1IEBACiBpbnQKIFB5T1Nfc25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgIGNoYXIgICpmb3JtYXQsIC4uLikKIHsKLQlpbnQgcmM7Ci0JdmFfbGlzdCB2YTsKKyAgICBpbnQgcmM7CisgICAgdmFfbGlzdCB2YTsKIAotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCXJjID0gUHlPU192c25wcmludGYoc3RyLCBzaXplLCBmb3JtYXQsIHZhKTsKLQl2YV9lbmQodmEpOwotCXJldHVybiByYzsKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICByYyA9IFB5T1NfdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCB2YSk7CisgICAgdmFfZW5kKHZhKTsKKyAgICByZXR1cm4gcmM7CiB9CiAKIGludAogUHlPU192c25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKLQlpbnQgbGVuOyAgLyogIyBieXRlcyB3cml0dGVuLCBleGNsdWRpbmcgXDAgKi8KKyAgICBpbnQgbGVuOyAgLyogIyBieXRlcyB3cml0dGVuLCBleGNsdWRpbmcgXDAgKi8KICNpZmRlZiBIQVZFX1NOUFJJTlRGCiAjZGVmaW5lIF9QeU9TX3ZzbnByaW50Zl9FWFRSQV9TUEFDRSAxCiAjZWxzZQogI2RlZmluZSBfUHlPU192c25wcmludGZfRVhUUkFfU1BBQ0UgNTEyCi0JY2hhciAqYnVmZmVyOworICAgIGNoYXIgKmJ1ZmZlcjsKICNlbmRpZgotCWFzc2VydChzdHIgIT0gTlVMTCk7Ci0JYXNzZXJ0KHNpemUgPiAwKTsKLQlhc3NlcnQoZm9ybWF0ICE9IE5VTEwpOwotCS8qIFdlIHRha2UgYSBzaXplX3QgYXMgaW5wdXQgYnV0IHJldHVybiBhbiBpbnQuICBTYW5pdHkgY2hlY2sKLQkgKiBvdXIgaW5wdXQgc28gdGhhdCBpdCB3b24ndCBjYXVzZSBhbiBvdmVyZmxvdyBpbiB0aGUKLSAgICAgICAgICogdnNucHJpbnRmIHJldHVybiB2YWx1ZSBvciB0aGUgYnVmZmVyIG1hbGxvYyBzaXplLiAgKi8KLQlpZiAoc2l6ZSA+IElOVF9NQVggLSBfUHlPU192c25wcmludGZfRVhUUkFfU1BBQ0UpIHsKLQkJbGVuID0gLTY2NjsKLQkJZ290byBEb25lOwotCX0KKyAgICBhc3NlcnQoc3RyICE9IE5VTEwpOworICAgIGFzc2VydChzaXplID4gMCk7CisgICAgYXNzZXJ0KGZvcm1hdCAhPSBOVUxMKTsKKyAgICAvKiBXZSB0YWtlIGEgc2l6ZV90IGFzIGlucHV0IGJ1dCByZXR1cm4gYW4gaW50LiAgU2FuaXR5IGNoZWNrCisgICAgICogb3VyIGlucHV0IHNvIHRoYXQgaXQgd29uJ3QgY2F1c2UgYW4gb3ZlcmZsb3cgaW4gdGhlCisgICAgICogdnNucHJpbnRmIHJldHVybiB2YWx1ZSBvciB0aGUgYnVmZmVyIG1hbGxvYyBzaXplLiAgKi8KKyAgICBpZiAoc2l6ZSA+IElOVF9NQVggLSBfUHlPU192c25wcmludGZfRVhUUkFfU1BBQ0UpIHsKKyAgICAgICAgbGVuID0gLTY2NjsKKyAgICAgICAgZ290byBEb25lOworICAgIH0KIAogI2lmZGVmIEhBVkVfU05QUklOVEYKLQlsZW4gPSB2c25wcmludGYoc3RyLCBzaXplLCBmb3JtYXQsIHZhKTsKKyAgICBsZW4gPSB2c25wcmludGYoc3RyLCBzaXplLCBmb3JtYXQsIHZhKTsKICNlbHNlCi0JLyogRW11bGF0ZSBpdC4gKi8KLQlidWZmZXIgPSBQeU1lbV9NQUxMT0Moc2l6ZSArIF9QeU9TX3ZzbnByaW50Zl9FWFRSQV9TUEFDRSk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCWxlbiA9IC02NjY7Ci0JCWdvdG8gRG9uZTsKLQl9CisgICAgLyogRW11bGF0ZSBpdC4gKi8KKyAgICBidWZmZXIgPSBQeU1lbV9NQUxMT0Moc2l6ZSArIF9QeU9TX3ZzbnByaW50Zl9FWFRSQV9TUEFDRSk7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIGxlbiA9IC02NjY7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CiAKLQlsZW4gPSB2c3ByaW50ZihidWZmZXIsIGZvcm1hdCwgdmEpOwotCWlmIChsZW4gPCAwKQotCQkvKiBpZ25vcmUgdGhlIGVycm9yICovOworICAgIGxlbiA9IHZzcHJpbnRmKGJ1ZmZlciwgZm9ybWF0LCB2YSk7CisgICAgaWYgKGxlbiA8IDApCisgICAgICAgIC8qIGlnbm9yZSB0aGUgZXJyb3IgKi87CiAKLQllbHNlIGlmICgoc2l6ZV90KWxlbiA+PSBzaXplICsgX1B5T1NfdnNucHJpbnRmX0VYVFJBX1NQQUNFKQotCQlQeV9GYXRhbEVycm9yKCJCdWZmZXIgb3ZlcmZsb3cgaW4gUHlPU19zbnByaW50Zi9QeU9TX3ZzbnByaW50ZiIpOworICAgIGVsc2UgaWYgKChzaXplX3QpbGVuID49IHNpemUgKyBfUHlPU192c25wcmludGZfRVhUUkFfU1BBQ0UpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkJ1ZmZlciBvdmVyZmxvdyBpbiBQeU9TX3NucHJpbnRmL1B5T1NfdnNucHJpbnRmIik7CiAKLQllbHNlIHsKLQkJY29uc3Qgc2l6ZV90IHRvX2NvcHkgPSAoc2l6ZV90KWxlbiA8IHNpemUgPwotCQkJCQkoc2l6ZV90KWxlbiA6IHNpemUgLSAxOwotCQlhc3NlcnQodG9fY29weSA8IHNpemUpOwotCQltZW1jcHkoc3RyLCBidWZmZXIsIHRvX2NvcHkpOwotCQlzdHJbdG9fY29weV0gPSAnXDAnOwotCX0KLQlQeU1lbV9GUkVFKGJ1ZmZlcik7CisgICAgZWxzZSB7CisgICAgICAgIGNvbnN0IHNpemVfdCB0b19jb3B5ID0gKHNpemVfdClsZW4gPCBzaXplID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClsZW4gOiBzaXplIC0gMTsKKyAgICAgICAgYXNzZXJ0KHRvX2NvcHkgPCBzaXplKTsKKyAgICAgICAgbWVtY3B5KHN0ciwgYnVmZmVyLCB0b19jb3B5KTsKKyAgICAgICAgc3RyW3RvX2NvcHldID0gJ1wwJzsKKyAgICB9CisgICAgUHlNZW1fRlJFRShidWZmZXIpOwogI2VuZGlmCiBEb25lOgotCWlmIChzaXplID4gMCkKLQkJc3RyW3NpemUtMV0gPSAnXDAnOwotCXJldHVybiBsZW47CisgICAgaWYgKHNpemUgPiAwKQorICAgICAgICBzdHJbc2l6ZS0xXSA9ICdcMCc7CisgICAgcmV0dXJuIGxlbjsKICN1bmRlZiBfUHlPU192c25wcmludGZfRVhUUkFfU1BBQ0UKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9teXN0cnRvdWwuYyBiL1B5dGhvbi9teXN0cnRvdWwuYwppbmRleCBlYmQ0NjhjLi5jMzViZTgxIDEwMDY0NAotLS0gYS9QeXRob24vbXlzdHJ0b3VsLmMKKysrIGIvUHl0aG9uL215c3RydG91bC5jCkBAIC0xOCw0MyArMTgsNDMgQEAKICAqIGkgKiBiYXNlIGRvZXNuJ3Qgb3ZlcmZsb3cgdW5zaWduZWQgbG9uZy4KICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc21hbGxtYXhbXSA9IHsKLQkwLCAvKiBiYXNlcyAwIGFuZCAxIGFyZSBpbnZhbGlkICovCi0JMCwKLQlVTE9OR19NQVggLyAyLAotCVVMT05HX01BWCAvIDMsCi0JVUxPTkdfTUFYIC8gNCwKLQlVTE9OR19NQVggLyA1LAotCVVMT05HX01BWCAvIDYsCi0JVUxPTkdfTUFYIC8gNywKLQlVTE9OR19NQVggLyA4LAotCVVMT05HX01BWCAvIDksCi0JVUxPTkdfTUFYIC8gMTAsCi0JVUxPTkdfTUFYIC8gMTEsCi0JVUxPTkdfTUFYIC8gMTIsCi0JVUxPTkdfTUFYIC8gMTMsCi0JVUxPTkdfTUFYIC8gMTQsCi0JVUxPTkdfTUFYIC8gMTUsCi0JVUxPTkdfTUFYIC8gMTYsCi0JVUxPTkdfTUFYIC8gMTcsCi0JVUxPTkdfTUFYIC8gMTgsCi0JVUxPTkdfTUFYIC8gMTksCi0JVUxPTkdfTUFYIC8gMjAsCi0JVUxPTkdfTUFYIC8gMjEsCi0JVUxPTkdfTUFYIC8gMjIsCi0JVUxPTkdfTUFYIC8gMjMsCi0JVUxPTkdfTUFYIC8gMjQsCi0JVUxPTkdfTUFYIC8gMjUsCi0JVUxPTkdfTUFYIC8gMjYsCi0JVUxPTkdfTUFYIC8gMjcsCi0JVUxPTkdfTUFYIC8gMjgsCi0JVUxPTkdfTUFYIC8gMjksCi0JVUxPTkdfTUFYIC8gMzAsCi0JVUxPTkdfTUFYIC8gMzEsCi0JVUxPTkdfTUFYIC8gMzIsCi0JVUxPTkdfTUFYIC8gMzMsCi0JVUxPTkdfTUFYIC8gMzQsCi0JVUxPTkdfTUFYIC8gMzUsCi0JVUxPTkdfTUFYIC8gMzYsCisgICAgMCwgLyogYmFzZXMgMCBhbmQgMSBhcmUgaW52YWxpZCAqLworICAgIDAsCisgICAgVUxPTkdfTUFYIC8gMiwKKyAgICBVTE9OR19NQVggLyAzLAorICAgIFVMT05HX01BWCAvIDQsCisgICAgVUxPTkdfTUFYIC8gNSwKKyAgICBVTE9OR19NQVggLyA2LAorICAgIFVMT05HX01BWCAvIDcsCisgICAgVUxPTkdfTUFYIC8gOCwKKyAgICBVTE9OR19NQVggLyA5LAorICAgIFVMT05HX01BWCAvIDEwLAorICAgIFVMT05HX01BWCAvIDExLAorICAgIFVMT05HX01BWCAvIDEyLAorICAgIFVMT05HX01BWCAvIDEzLAorICAgIFVMT05HX01BWCAvIDE0LAorICAgIFVMT05HX01BWCAvIDE1LAorICAgIFVMT05HX01BWCAvIDE2LAorICAgIFVMT05HX01BWCAvIDE3LAorICAgIFVMT05HX01BWCAvIDE4LAorICAgIFVMT05HX01BWCAvIDE5LAorICAgIFVMT05HX01BWCAvIDIwLAorICAgIFVMT05HX01BWCAvIDIxLAorICAgIFVMT05HX01BWCAvIDIyLAorICAgIFVMT05HX01BWCAvIDIzLAorICAgIFVMT05HX01BWCAvIDI0LAorICAgIFVMT05HX01BWCAvIDI1LAorICAgIFVMT05HX01BWCAvIDI2LAorICAgIFVMT05HX01BWCAvIDI3LAorICAgIFVMT05HX01BWCAvIDI4LAorICAgIFVMT05HX01BWCAvIDI5LAorICAgIFVMT05HX01BWCAvIDMwLAorICAgIFVMT05HX01BWCAvIDMxLAorICAgIFVMT05HX01BWCAvIDMyLAorICAgIFVMT05HX01BWCAvIDMzLAorICAgIFVMT05HX01BWCAvIDM0LAorICAgIFVMT05HX01BWCAvIDM1LAorICAgIFVMT05HX01BWCAvIDM2LAogfTsKIAogLyogbWF4aW11bSBkaWdpdHMgdGhhdCBjYW4ndCBldmVyIG92ZXJmbG93IGZvciBiYXNlcyAyIHRocm91Z2ggMzYsCkBAIC02MywyMjMgKzYzLDIyMyBAQAogICovCiAjaWYgU0laRU9GX0xPTkcgPT0gNAogc3RhdGljIGludCBkaWdpdGxpbWl0W10gPSB7Ci0JMCwgIDAsIDMyLCAyMCwgMTYsIDEzLCAxMiwgMTEsIDEwLCAxMCwgIC8qICAwIC0gIDkgKi8KLQk5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgLyogMTAgLSAxOSAqLwotCTcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICAvKiAyMCAtIDI5ICovCi0JNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNn07ICAgICAgICAgICAgIC8qIDMwIC0gMzYgKi8KKyAgICAwLCAgMCwgMzIsIDIwLCAxNiwgMTMsIDEyLCAxMSwgMTAsIDEwLCAgLyogIDAgLSAgOSAqLworICAgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICAvKiAxMCAtIDE5ICovCisgICAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIC8qIDIwIC0gMjkgKi8KKyAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2fTsgICAgICAgICAgICAgLyogMzAgLSAzNiAqLwogI2VsaWYgU0laRU9GX0xPTkcgPT0gOAogLyogW2ludChtYXRoLmZsb29yKG1hdGgubG9nKDIqKjY0LCBpKSkpIGZvciBpIGluIHJhbmdlKDIsIDM3KV0gKi8KIHN0YXRpYyBpbnQgZGlnaXRsaW1pdFtdID0gewotCSAwLCAgIDAsIDY0LCA0MCwgMzIsIDI3LCAyNCwgMjIsIDIxLCAyMCwgIC8qICAwIC0gIDkgKi8KLQkxOSwgIDE4LCAxNywgMTcsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsICAvKiAxMCAtIDE5ICovCi0JMTQsICAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAgLyogMjAgLSAyOSAqLwotCTEzLCAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMn07ICAgICAgICAgICAgIC8qIDMwIC0gMzYgKi8KKyAgICAgICAgIDAsICAgMCwgNjQsIDQwLCAzMiwgMjcsIDI0LCAyMiwgMjEsIDIwLCAgLyogIDAgLSAgOSAqLworICAgIDE5LCAgMTgsIDE3LCAxNywgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgIC8qIDEwIC0gMTkgKi8KKyAgICAxNCwgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsICAvKiAyMCAtIDI5ICovCisgICAgMTMsICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyfTsgICAgICAgICAgICAgLyogMzAgLSAzNiAqLwogI2Vsc2UKICNlcnJvciAiTmVlZCB0YWJsZSBmb3IgU0laRU9GX0xPTkciCiAjZW5kaWYKIAogLyoKLSoqCXN0cnRvdWwKLSoqCQlUaGlzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIHJvdXRpbmUgZm9yIGNvbnZlcnRpbmcKLSoqCQlhbiBhc2NpaSBzdHJpbmcgdG8gYW4gaW50ZWdlciBpbiBhbiBhcmJpdHJhcnkgYmFzZS4KLSoqCQlMZWFkaW5nIHdoaXRlIHNwYWNlIGlzIGlnbm9yZWQuICBJZiAnYmFzZScgaXMgemVybwotKioJCWl0IGxvb2tzIGZvciBhIGxlYWRpbmcgMCwgMGIsIDBCLCAwbywgME8sIDB4IG9yIDBYCi0qKgkJdG8gdGVsbCB3aGljaCBiYXNlLiAgSWYgdGhlc2UgYXJlIGFic2VudCBpdCBkZWZhdWx0cwotKioJCXRvIDEwLiBCYXNlIG11c3QgYmUgMCBvciBiZXR3ZWVuIDIgYW5kIDM2IChpbmNsdXNpdmUpLgotKioJCUlmICdwdHInIGlzIG5vbi1OVUxMIGl0IHdpbGwgY29udGFpbiBhIHBvaW50ZXIgdG8KLSoqCQl0aGUgZW5kIG9mIHRoZSBzY2FuLgotKioJCUVycm9ycyBkdWUgdG8gYmFkIHBvaW50ZXJzIHdpbGwgcHJvYmFibHkgcmVzdWx0IGluCi0qKgkJZXhjZXB0aW9ucyAtIHdlIGRvbid0IGNoZWNrIGZvciB0aGVtLgorKiogICAgICBzdHJ0b3VsCisqKiAgICAgICAgICAgICAgVGhpcyBpcyBhIGdlbmVyYWwgcHVycG9zZSByb3V0aW5lIGZvciBjb252ZXJ0aW5nCisqKiAgICAgICAgICAgICAgYW4gYXNjaWkgc3RyaW5nIHRvIGFuIGludGVnZXIgaW4gYW4gYXJiaXRyYXJ5IGJhc2UuCisqKiAgICAgICAgICAgICAgTGVhZGluZyB3aGl0ZSBzcGFjZSBpcyBpZ25vcmVkLiAgSWYgJ2Jhc2UnIGlzIHplcm8KKyoqICAgICAgICAgICAgICBpdCBsb29rcyBmb3IgYSBsZWFkaW5nIDAsIDBiLCAwQiwgMG8sIDBPLCAweCBvciAwWAorKiogICAgICAgICAgICAgIHRvIHRlbGwgd2hpY2ggYmFzZS4gIElmIHRoZXNlIGFyZSBhYnNlbnQgaXQgZGVmYXVsdHMKKyoqICAgICAgICAgICAgICB0byAxMC4gQmFzZSBtdXN0IGJlIDAgb3IgYmV0d2VlbiAyIGFuZCAzNiAoaW5jbHVzaXZlKS4KKyoqICAgICAgICAgICAgICBJZiAncHRyJyBpcyBub24tTlVMTCBpdCB3aWxsIGNvbnRhaW4gYSBwb2ludGVyIHRvCisqKiAgICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgc2Nhbi4KKyoqICAgICAgICAgICAgICBFcnJvcnMgZHVlIHRvIGJhZCBwb2ludGVycyB3aWxsIHByb2JhYmx5IHJlc3VsdCBpbgorKiogICAgICAgICAgICAgIGV4Y2VwdGlvbnMgLSB3ZSBkb24ndCBjaGVjayBmb3IgdGhlbS4KICovCiB1bnNpZ25lZCBsb25nCiBQeU9TX3N0cnRvdWwocmVnaXN0ZXIgY2hhciAqc3RyLCBjaGFyICoqcHRyLCBpbnQgYmFzZSkKIHsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7IC8qIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gKi8KLQlyZWdpc3RlciBpbnQgYzsJIAkvKiBjdXJyZW50IGlucHV0IGNoYXJhY3RlciAqLwotCXJlZ2lzdGVyIGludCBvdmxpbWl0OyAJLyogcmVxdWlyZWQgZGlnaXRzIHRvIG92ZXJmbG93ICovCisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOyAvKiByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uICovCisgICAgcmVnaXN0ZXIgaW50IGM7ICAgICAgICAgICAgIC8qIGN1cnJlbnQgaW5wdXQgY2hhcmFjdGVyICovCisgICAgcmVnaXN0ZXIgaW50IG92bGltaXQ7ICAgICAgIC8qIHJlcXVpcmVkIGRpZ2l0cyB0byBvdmVyZmxvdyAqLwogCi0JLyogc2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlICovCi0Jd2hpbGUgKCpzdHIgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCi0JCSsrc3RyOworICAgIC8qIHNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZSAqLworICAgIHdoaWxlICgqc3RyICYmIGlzc3BhY2UoUHlfQ0hBUk1BU0soKnN0cikpKQorICAgICAgICArK3N0cjsKIAotCS8qIGNoZWNrIGZvciBsZWFkaW5nIDAgb3IgMHggZm9yIGF1dG8tYmFzZSBvciBiYXNlIDE2ICovCi0Jc3dpdGNoIChiYXNlKSB7Ci0JY2FzZSAwOgkJLyogbG9vayBmb3IgbGVhZGluZyAwLCAwYiwgMG8gb3IgMHggKi8KLQkJaWYgKCpzdHIgPT0gJzAnKSB7Ci0JCQkrK3N0cjsKLQkJCWlmICgqc3RyID09ICd4JyB8fCAqc3RyID09ICdYJykgewotCQkJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDB4ICovCi0JCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAxNikgewotCQkJCQlpZiAocHRyKQotCQkJCQkJKnB0ciA9IHN0cjsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCSsrc3RyOwotCQkJCWJhc2UgPSAxNjsKLQkJCX0gZWxzZSBpZiAoKnN0ciA9PSAnbycgfHwgKnN0ciA9PSAnTycpIHsKLQkJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAwbyAqLwotCQkJCWlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gOCkgewotCQkJCQlpZiAocHRyKQotCQkJCQkJKnB0ciA9IHN0cjsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCSsrc3RyOwotCQkJCWJhc2UgPSA4OwotCQkJfSBlbHNlIGlmICgqc3RyID09ICdiJyB8fCAqc3RyID09ICdCJykgewotCQkJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDBiICovCi0JCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAyKSB7Ci0JCQkJCWlmIChwdHIpCi0JCQkJCQkqcHRyID0gc3RyOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJKytzdHI7Ci0JCQkJYmFzZSA9IDI7Ci0JCQl9IGVsc2UgewotCQkJCWJhc2UgPSA4OwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCWJhc2UgPSAxMDsKLQkJYnJlYWs7CisgICAgLyogY2hlY2sgZm9yIGxlYWRpbmcgMCBvciAweCBmb3IgYXV0by1iYXNlIG9yIGJhc2UgMTYgKi8KKyAgICBzd2l0Y2ggKGJhc2UpIHsKKyAgICBjYXNlIDA6ICAgICAgICAgICAgIC8qIGxvb2sgZm9yIGxlYWRpbmcgMCwgMGIsIDBvIG9yIDB4ICovCisgICAgICAgIGlmICgqc3RyID09ICcwJykgeworICAgICAgICAgICAgKytzdHI7CisgICAgICAgICAgICBpZiAoKnN0ciA9PSAneCcgfHwgKnN0ciA9PSAnWCcpIHsKKyAgICAgICAgICAgICAgICAvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAweCAqLworICAgICAgICAgICAgICAgIGlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgICAgICBiYXNlID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCpzdHIgPT0gJ28nIHx8ICpzdHIgPT0gJ08nKSB7CisgICAgICAgICAgICAgICAgLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgMG8gKi8KKyAgICAgICAgICAgICAgICBpZiAoX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHN0clsxXSldID49IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSBzdHI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgICAgICBiYXNlID0gODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKnN0ciA9PSAnYicgfHwgKnN0ciA9PSAnQicpIHsKKyAgICAgICAgICAgICAgICAvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAwYiAqLworICAgICAgICAgICAgICAgIGlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAocHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9IHN0cjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrc3RyOworICAgICAgICAgICAgICAgIGJhc2UgPSAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYXNlID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSAyOgkvKiBza2lwIGxlYWRpbmcgMGIgb3IgMEIgKi8KLQkJaWYgKCpzdHIgPT0gJzAnKSB7Ci0JCQkrK3N0cjsKLQkJCWlmICgqc3RyID09ICdiJyB8fCAqc3RyID09ICdCJykgewotCQkJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDBiICovCi0JCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAyKSB7Ci0JCQkJCWlmIChwdHIpCi0JCQkJCQkqcHRyID0gc3RyOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJKytzdHI7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSAyOiAgICAgLyogc2tpcCBsZWFkaW5nIDBiIG9yIDBCICovCisgICAgICAgIGlmICgqc3RyID09ICcwJykgeworICAgICAgICAgICAgKytzdHI7CisgICAgICAgICAgICBpZiAoKnN0ciA9PSAnYicgfHwgKnN0ciA9PSAnQicpIHsKKyAgICAgICAgICAgICAgICAvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAwYiAqLworICAgICAgICAgICAgICAgIGlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAocHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9IHN0cjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrc3RyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSA4OgkvKiBza2lwIGxlYWRpbmcgMG8gb3IgME8gKi8KLQkJaWYgKCpzdHIgPT0gJzAnKSB7Ci0JCQkrK3N0cjsKLQkJCWlmICgqc3RyID09ICdvJyB8fCAqc3RyID09ICdPJykgewotCQkJCS8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDBvICovCi0JCQkJaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSA4KSB7Ci0JCQkJCWlmIChwdHIpCi0JCQkJCQkqcHRyID0gc3RyOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJKytzdHI7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7CisgICAgY2FzZSA4OiAgICAgLyogc2tpcCBsZWFkaW5nIDBvIG9yIDBPICovCisgICAgICAgIGlmICgqc3RyID09ICcwJykgeworICAgICAgICAgICAgKytzdHI7CisgICAgICAgICAgICBpZiAoKnN0ciA9PSAnbycgfHwgKnN0ciA9PSAnTycpIHsKKyAgICAgICAgICAgICAgICAvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAwbyAqLworICAgICAgICAgICAgICAgIGlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gOCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9IHN0cjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrc3RyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOwogCi0JY2FzZSAxNjoJLyogc2tpcCBsZWFkaW5nIDB4IG9yIDBYICovCi0JCWlmICgqc3RyID09ICcwJykgewotCQkJKytzdHI7Ci0JCQlpZiAoKnN0ciA9PSAneCcgfHwgKnN0ciA9PSAnWCcpIHsKLQkJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciAweCAqLwotCQkJCWlmIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc3RyWzFdKV0gPj0gMTYpIHsKLQkJCQkJaWYgKHB0cikKLQkJCQkJCSpwdHIgPSBzdHI7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQkrK3N0cjsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9CisgICAgY2FzZSAxNjogICAgICAgICAgICAvKiBza2lwIGxlYWRpbmcgMHggb3IgMFggKi8KKyAgICAgICAgaWYgKCpzdHIgPT0gJzAnKSB7CisgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgIGlmICgqc3RyID09ICd4JyB8fCAqc3RyID09ICdYJykgeworICAgICAgICAgICAgICAgIC8qIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIDB4ICovCisgICAgICAgICAgICAgICAgaWYgKF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzdHJbMV0pXSA+PSAxNikgeworICAgICAgICAgICAgICAgICAgICBpZiAocHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9IHN0cjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrc3RyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KIAotCS8qIGNhdGNoIHNpbGx5IGJhc2VzICovCi0JaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikgewotCQlpZiAocHRyKQotCQkJKnB0ciA9IHN0cjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIGNhdGNoIHNpbGx5IGJhc2VzICovCisgICAgaWYgKGJhc2UgPCAyIHx8IGJhc2UgPiAzNikgeworICAgICAgICBpZiAocHRyKQorICAgICAgICAgICAgKnB0ciA9IHN0cjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogc2tpcCBsZWFkaW5nIHplcm9lcyAqLwotCXdoaWxlICgqc3RyID09ICcwJykKLQkJKytzdHI7CisgICAgLyogc2tpcCBsZWFkaW5nIHplcm9lcyAqLworICAgIHdoaWxlICgqc3RyID09ICcwJykKKyAgICAgICAgKytzdHI7CiAKLQkvKiBiYXNlIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW4gWzIsIDM2XSBhdCB0aGlzIHBvaW50ICovCi0Jb3ZsaW1pdCA9IGRpZ2l0bGltaXRbYmFzZV07CisgICAgLyogYmFzZSBpcyBndWFyYW50ZWVkIHRvIGJlIGluIFsyLCAzNl0gYXQgdGhpcyBwb2ludCAqLworICAgIG92bGltaXQgPSBkaWdpdGxpbWl0W2Jhc2VdOwogCi0JLyogZG8gdGhlIGNvbnZlcnNpb24gdW50aWwgbm9uLWRpZ2l0IGNoYXJhY3RlciBlbmNvdW50ZXJlZCAqLwotCXdoaWxlICgoYyA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSygqc3RyKV0pIDwgYmFzZSkgewotCQlpZiAob3ZsaW1pdCA+IDApIC8qIG5vIG92ZXJmbG93IGNoZWNrIHJlcXVpcmVkICovCi0JCQlyZXN1bHQgPSByZXN1bHQgKiBiYXNlICsgYzsKLQkJZWxzZSB7IC8qIHJlcXVpcmVzIG92ZXJmbG93IGNoZWNrICovCi0JCQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHRlbXBfcmVzdWx0OworICAgIC8qIGRvIHRoZSBjb252ZXJzaW9uIHVudGlsIG5vbi1kaWdpdCBjaGFyYWN0ZXIgZW5jb3VudGVyZWQgKi8KKyAgICB3aGlsZSAoKGMgPSBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cildKSA8IGJhc2UpIHsKKyAgICAgICAgaWYgKG92bGltaXQgPiAwKSAvKiBubyBvdmVyZmxvdyBjaGVjayByZXF1aXJlZCAqLworICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIGM7CisgICAgICAgIGVsc2UgeyAvKiByZXF1aXJlcyBvdmVyZmxvdyBjaGVjayAqLworICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyB0ZW1wX3Jlc3VsdDsKIAotCQkJaWYgKG92bGltaXQgPCAwKSAvKiBndWFyYW50ZWVkIG92ZXJmbG93ICovCi0JCQkJZ290byBvdmVyZmxvd2VkOworICAgICAgICAgICAgaWYgKG92bGltaXQgPCAwKSAvKiBndWFyYW50ZWVkIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvd2VkOwogCi0JCQkvKiB0aGVyZSBjb3VsZCBiZSBhbiBvdmVyZmxvdyAqLwotCQkJLyogY2hlY2sgb3ZlcmZsb3cganVzdCBmcm9tIHNoaWZ0aW5nICovCi0JCQlpZiAocmVzdWx0ID4gc21hbGxtYXhbYmFzZV0pCi0JCQkJZ290byBvdmVyZmxvd2VkOworICAgICAgICAgICAgLyogdGhlcmUgY291bGQgYmUgYW4gb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgIC8qIGNoZWNrIG92ZXJmbG93IGp1c3QgZnJvbSBzaGlmdGluZyAqLworICAgICAgICAgICAgaWYgKHJlc3VsdCA+IHNtYWxsbWF4W2Jhc2VdKQorICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3dlZDsKIAotCQkJcmVzdWx0ICo9IGJhc2U7CisgICAgICAgICAgICByZXN1bHQgKj0gYmFzZTsKIAotCQkJLyogY2hlY2sgb3ZlcmZsb3cgZnJvbSB0aGUgZGlnaXQncyB2YWx1ZSAqLwotCQkJdGVtcF9yZXN1bHQgPSByZXN1bHQgKyBjOwotCQkJaWYgKHRlbXBfcmVzdWx0IDwgcmVzdWx0KQotCQkJCWdvdG8gb3ZlcmZsb3dlZDsKKyAgICAgICAgICAgIC8qIGNoZWNrIG92ZXJmbG93IGZyb20gdGhlIGRpZ2l0J3MgdmFsdWUgKi8KKyAgICAgICAgICAgIHRlbXBfcmVzdWx0ID0gcmVzdWx0ICsgYzsKKyAgICAgICAgICAgIGlmICh0ZW1wX3Jlc3VsdCA8IHJlc3VsdCkKKyAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93ZWQ7CiAKLQkJCXJlc3VsdCA9IHRlbXBfcmVzdWx0OwotCQl9CisgICAgICAgICAgICByZXN1bHQgPSB0ZW1wX3Jlc3VsdDsKKyAgICAgICAgfQogCi0JCSsrc3RyOwotCQktLW92bGltaXQ7Ci0JfQorICAgICAgICArK3N0cjsKKyAgICAgICAgLS1vdmxpbWl0OworICAgIH0KIAotCS8qIHNldCBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBsYXN0IGNoYXJhY3RlciBzY2FubmVkICovCi0JaWYgKHB0cikKLQkJKnB0ciA9IHN0cjsKKyAgICAvKiBzZXQgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgc2Nhbm5lZCAqLworICAgIGlmIChwdHIpCisgICAgICAgICpwdHIgPSBzdHI7CiAKLQlyZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXN1bHQ7CiAKIG92ZXJmbG93ZWQ6Ci0JaWYgKHB0cikgewotCQkvKiBzcG9vbCB0aHJvdWdoIHJlbWFpbmluZyBkaWdpdCBjaGFyYWN0ZXJzICovCi0JCXdoaWxlIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cildIDwgYmFzZSkKLQkJCSsrc3RyOwotCQkqcHRyID0gc3RyOwotCX0KLQllcnJubyA9IEVSQU5HRTsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CisgICAgaWYgKHB0cikgeworICAgICAgICAvKiBzcG9vbCB0aHJvdWdoIHJlbWFpbmluZyBkaWdpdCBjaGFyYWN0ZXJzICovCisgICAgICAgIHdoaWxlIChfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soKnN0cildIDwgYmFzZSkKKyAgICAgICAgICAgICsrc3RyOworICAgICAgICAqcHRyID0gc3RyOworICAgIH0KKyAgICBlcnJubyA9IEVSQU5HRTsKKyAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CiB9CiAKIC8qIENoZWNraW5nIGZvciBvdmVyZmxvdyBpbiBQeU9TX3N0cnRvbCBpcyBhIFBJVEE7IHNlZSBjb21tZW50cwogICogYWJvdXQgUFlfQUJTX0xPTkdfTUlOIGluIGxvbmdvYmplY3QuYy4KICAqLwotI2RlZmluZSBQWV9BQlNfTE9OR19NSU4JCSgwLSh1bnNpZ25lZCBsb25nKUxPTkdfTUlOKQorI2RlZmluZSBQWV9BQlNfTE9OR19NSU4gICAgICAgICAoMC0odW5zaWduZWQgbG9uZylMT05HX01JTikKIAogbG9uZwogUHlPU19zdHJ0b2woY2hhciAqc3RyLCBjaGFyICoqcHRyLCBpbnQgYmFzZSkKIHsKLQlsb25nIHJlc3VsdDsKLQl1bnNpZ25lZCBsb25nIHVyZXN1bHQ7Ci0JY2hhciBzaWduOworICAgIGxvbmcgcmVzdWx0OworICAgIHVuc2lnbmVkIGxvbmcgdXJlc3VsdDsKKyAgICBjaGFyIHNpZ247CiAKLQl3aGlsZSAoKnN0ciAmJiBpc3NwYWNlKFB5X0NIQVJNQVNLKCpzdHIpKSkKLQkJc3RyKys7CisgICAgd2hpbGUgKCpzdHIgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCisgICAgICAgIHN0cisrOwogCi0Jc2lnbiA9ICpzdHI7Ci0JaWYgKHNpZ24gPT0gJysnIHx8IHNpZ24gPT0gJy0nKQotCQlzdHIrKzsKKyAgICBzaWduID0gKnN0cjsKKyAgICBpZiAoc2lnbiA9PSAnKycgfHwgc2lnbiA9PSAnLScpCisgICAgICAgIHN0cisrOwogCi0JdXJlc3VsdCA9IFB5T1Nfc3RydG91bChzdHIsIHB0ciwgYmFzZSk7CisgICAgdXJlc3VsdCA9IFB5T1Nfc3RydG91bChzdHIsIHB0ciwgYmFzZSk7CiAKLQlpZiAodXJlc3VsdCA8PSAodW5zaWduZWQgbG9uZylMT05HX01BWCkgewotCQlyZXN1bHQgPSAobG9uZyl1cmVzdWx0OwotCQlpZiAoc2lnbiA9PSAnLScpCi0JCQlyZXN1bHQgPSAtcmVzdWx0OwotCX0KLQllbHNlIGlmIChzaWduID09ICctJyAmJiB1cmVzdWx0ID09IFBZX0FCU19MT05HX01JTikgewotCQlyZXN1bHQgPSBMT05HX01JTjsKLQl9Ci0JZWxzZSB7Ci0JCWVycm5vID0gRVJBTkdFOwotCQlyZXN1bHQgPSBMT05HX01BWDsKLQl9Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAodXJlc3VsdCA8PSAodW5zaWduZWQgbG9uZylMT05HX01BWCkgeworICAgICAgICByZXN1bHQgPSAobG9uZyl1cmVzdWx0OworICAgICAgICBpZiAoc2lnbiA9PSAnLScpCisgICAgICAgICAgICByZXN1bHQgPSAtcmVzdWx0OworICAgIH0KKyAgICBlbHNlIGlmIChzaWduID09ICctJyAmJiB1cmVzdWx0ID09IFBZX0FCU19MT05HX01JTikgeworICAgICAgICByZXN1bHQgPSBMT05HX01JTjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGVycm5vID0gRVJBTkdFOworICAgICAgICByZXN1bHQgPSBMT05HX01BWDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9wZWVwaG9sZS5jIGIvUHl0aG9uL3BlZXBob2xlLmMKaW5kZXggMTM5YTYyYi4uOTVjZTlkMCAxMDA2NDQKLS0tIGEvUHl0aG9uL3BlZXBob2xlLmMKKysrIGIvUHl0aG9uL3BlZXBob2xlLmMKQEAgLTEyLDYyMiArMTIsNjIyIEBACiAjaW5jbHVkZSAib3Bjb2RlLmgiCiAKICNkZWZpbmUgR0VUQVJHKGFyciwgaSkgKChpbnQpKChhcnJbaSsyXTw8OCkgKyBhcnJbaSsxXSkpCi0jZGVmaW5lIFVOQ09ORElUSU9OQUxfSlVNUChvcCkJKG9wPT1KVU1QX0FCU09MVVRFIHx8IG9wPT1KVU1QX0ZPUldBUkQpCisjZGVmaW5lIFVOQ09ORElUSU9OQUxfSlVNUChvcCkgIChvcD09SlVNUF9BQlNPTFVURSB8fCBvcD09SlVNUF9GT1JXQVJEKQogI2RlZmluZSBBQlNPTFVURV9KVU1QKG9wKSAob3A9PUpVTVBfQUJTT0xVVEUgfHwgb3A9PUNPTlRJTlVFX0xPT1ApCiAjZGVmaW5lIEdFVEpVTVBUR1QoYXJyLCBpKSAoR0VUQVJHKGFycixpKSArIChBQlNPTFVURV9KVU1QKGFycltpXSkgPyAwIDogaSszKSkKICNkZWZpbmUgU0VUQVJHKGFyciwgaSwgdmFsKSBhcnJbaSsyXSA9IHZhbD4+ODsgYXJyW2krMV0gPSB2YWwgJiAyNTUKICNkZWZpbmUgQ09ERVNJWkUob3ApICAoSEFTX0FSRyhvcCkgPyAzIDogMSkKICNkZWZpbmUgSVNCQVNJQ0JMT0NLKGJsb2Nrcywgc3RhcnQsIGJ5dGVzKSBcCi0JKGJsb2Nrc1tzdGFydF09PWJsb2Nrc1tzdGFydCtieXRlcy0xXSkKKyAgICAoYmxvY2tzW3N0YXJ0XT09YmxvY2tzW3N0YXJ0K2J5dGVzLTFdKQogCiAvKiBSZXBsYWNlIExPQURfQ09OU1QgYzEuIExPQURfQ09OU1QgYzIgLi4uIExPQURfQ09OU1QgY24gQlVJTERfVFVQTEUgbgotICAgd2l0aAkgICBMT0FEX0NPTlNUIChjMSwgYzIsIC4uLiBjbikuCisgICB3aXRoICAgIExPQURfQ09OU1QgKGMxLCBjMiwgLi4uIGNuKS4KICAgIFRoZSBjb25zdHMgdGFibGUgbXVzdCBzdGlsbCBiZSBpbiBsaXN0IGZvcm0gc28gdGhhdCB0aGUKICAgIG5ldyBjb25zdGFudCAoYzEsIGMyLCAuLi4gY24pIGNhbiBiZSBhcHBlbmRlZC4KICAgIENhbGxlZCB3aXRoIGNvZGVzdHIgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IExPQURfQ09OU1QuCi0gICBCYWlscyBvdXQgd2l0aCBubyBjaGFuZ2UgaWYgb25lIG9yIG1vcmUgb2YgdGhlIExPQURfQ09OU1RzIGlzIG1pc3NpbmcuIAorICAgQmFpbHMgb3V0IHdpdGggbm8gY2hhbmdlIGlmIG9uZSBvciBtb3JlIG9mIHRoZSBMT0FEX0NPTlNUcyBpcyBtaXNzaW5nLgogICAgQWxzbyB3b3JrcyBmb3IgQlVJTERfTElTVCB3aGVuIGZvbGxvd2VkIGJ5IGFuICJpbiIgb3IgIm5vdCBpbiIgdGVzdC4KICovCiBzdGF0aWMgaW50CiB0dXBsZV9vZl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBuLCBQeU9iamVjdCAqY29uc3RzKQogewotCVB5T2JqZWN0ICpuZXdjb25zdCwgKmNvbnN0YW50OwotCVB5X3NzaXplX3QgaSwgYXJnLCBsZW5fY29uc3RzOworICAgIFB5T2JqZWN0ICpuZXdjb25zdCwgKmNvbnN0YW50OworICAgIFB5X3NzaXplX3QgaSwgYXJnLCBsZW5fY29uc3RzOwogCi0JLyogUHJlLWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoUHlMaXN0X0NoZWNrRXhhY3QoY29uc3RzKSk7Ci0JYXNzZXJ0KGNvZGVzdHJbbiozXSA9PSBCVUlMRF9UVVBMRSB8fCBjb2Rlc3RyW24qM10gPT0gQlVJTERfTElTVCk7Ci0JYXNzZXJ0KEdFVEFSRyhjb2Rlc3RyLCAobiozKSkgPT0gbik7Ci0JZm9yIChpPTAgOyBpPG4gOyBpKyspCi0JCWFzc2VydChjb2Rlc3RyW2kqM10gPT0gTE9BRF9DT05TVCk7CisgICAgLyogUHJlLWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrRXhhY3QoY29uc3RzKSk7CisgICAgYXNzZXJ0KGNvZGVzdHJbbiozXSA9PSBCVUlMRF9UVVBMRSB8fCBjb2Rlc3RyW24qM10gPT0gQlVJTERfTElTVCk7CisgICAgYXNzZXJ0KEdFVEFSRyhjb2Rlc3RyLCAobiozKSkgPT0gbik7CisgICAgZm9yIChpPTAgOyBpPG4gOyBpKyspCisgICAgICAgIGFzc2VydChjb2Rlc3RyW2kqM10gPT0gTE9BRF9DT05TVCk7CiAKLQkvKiBCdWlsZHVwIG5ldyB0dXBsZSBvZiBjb25zdGFudHMgKi8KLQluZXdjb25zdCA9IFB5VHVwbGVfTmV3KG4pOwotCWlmIChuZXdjb25zdCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7Ci0JZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKLQkJYXJnID0gR0VUQVJHKGNvZGVzdHIsIChpKjMpKTsKLQkJYXNzZXJ0KGFyZyA8IGxlbl9jb25zdHMpOwotCQljb25zdGFudCA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIGFyZyk7Ci0JCVB5X0lOQ1JFRihjb25zdGFudCk7Ci0JCVB5VHVwbGVfU0VUX0lURU0obmV3Y29uc3QsIGksIGNvbnN0YW50KTsKLQl9CisgICAgLyogQnVpbGR1cCBuZXcgdHVwbGUgb2YgY29uc3RhbnRzICovCisgICAgbmV3Y29uc3QgPSBQeVR1cGxlX05ldyhuKTsKKyAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOworICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgICAgIGFyZyA9IEdFVEFSRyhjb2Rlc3RyLCAoaSozKSk7CisgICAgICAgIGFzc2VydChhcmcgPCBsZW5fY29uc3RzKTsKKyAgICAgICAgY29uc3RhbnQgPSBQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBhcmcpOworICAgICAgICBQeV9JTkNSRUYoY29uc3RhbnQpOworICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKG5ld2NvbnN0LCBpLCBjb25zdGFudCk7CisgICAgfQogCi0JLyogQXBwZW5kIGZvbGRlZCBjb25zdGFudCBvbnRvIGNvbnN0cyAqLwotCWlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgbmV3Y29uc3QpKSB7Ci0JCVB5X0RFQ1JFRihuZXdjb25zdCk7Ci0JCXJldHVybiAwOwotCX0KLQlQeV9ERUNSRUYobmV3Y29uc3QpOworICAgIC8qIEFwcGVuZCBmb2xkZWQgY29uc3RhbnQgb250byBjb25zdHMgKi8KKyAgICBpZiAoUHlMaXN0X0FwcGVuZChjb25zdHMsIG5ld2NvbnN0KSkgeworICAgICAgICBQeV9ERUNSRUYobmV3Y29uc3QpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKIAotCS8qIFdyaXRlIE5PUHMgb3ZlciBvbGQgTE9BRF9DT05TVFMgYW5kCi0JICAgYWRkIGEgbmV3IExPQURfQ09OU1QgbmV3Y29uc3Qgb24gdG9wIG9mIHRoZSBCVUlMRF9UVVBMRSBuICovCi0JbWVtc2V0KGNvZGVzdHIsIE5PUCwgbiozKTsKLQljb2Rlc3RyW24qM10gPSBMT0FEX0NPTlNUOwotCVNFVEFSRyhjb2Rlc3RyLCAobiozKSwgbGVuX2NvbnN0cyk7Ci0JcmV0dXJuIDE7CisgICAgLyogV3JpdGUgTk9QcyBvdmVyIG9sZCBMT0FEX0NPTlNUUyBhbmQKKyAgICAgICBhZGQgYSBuZXcgTE9BRF9DT05TVCBuZXdjb25zdCBvbiB0b3Agb2YgdGhlIEJVSUxEX1RVUExFIG4gKi8KKyAgICBtZW1zZXQoY29kZXN0ciwgTk9QLCBuKjMpOworICAgIGNvZGVzdHJbbiozXSA9IExPQURfQ09OU1Q7CisgICAgU0VUQVJHKGNvZGVzdHIsIChuKjMpLCBsZW5fY29uc3RzKTsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogUmVwbGFjZSBMT0FEX0NPTlNUIGMxLiBMT0FEX0NPTlNUIGMyIEJJTk9QCi0gICB3aXRoCSAgIExPQURfQ09OU1QgYmlub3AoYzEsYzIpCisgICB3aXRoICAgIExPQURfQ09OU1QgYmlub3AoYzEsYzIpCiAgICBUaGUgY29uc3RzIHRhYmxlIG11c3Qgc3RpbGwgYmUgaW4gbGlzdCBmb3JtIHNvIHRoYXQgdGhlCiAgICBuZXcgY29uc3RhbnQgY2FuIGJlIGFwcGVuZGVkLgotICAgQ2FsbGVkIHdpdGggY29kZXN0ciBwb2ludGluZyB0byB0aGUgZmlyc3QgTE9BRF9DT05TVC4gCi0gICBBYmFuZG9ucyB0aGUgdHJhbnNmb3JtYXRpb24gaWYgdGhlIGZvbGRpbmcgZmFpbHMgKGkuZS4gIDErJ2EnKS4gIAorICAgQ2FsbGVkIHdpdGggY29kZXN0ciBwb2ludGluZyB0byB0aGUgZmlyc3QgTE9BRF9DT05TVC4KKyAgIEFiYW5kb25zIHRoZSB0cmFuc2Zvcm1hdGlvbiBpZiB0aGUgZm9sZGluZyBmYWlscyAoaS5lLiAgMSsnYScpLgogICAgSWYgdGhlIG5ldyBjb25zdGFudCBpcyBhIHNlcXVlbmNlLCBvbmx5IGZvbGRzIHdoZW4gdGhlIHNpemUKLSAgIGlzIGJlbG93IGEgdGhyZXNob2xkIHZhbHVlLglUaGF0IGtlZXBzIHB5YyBmaWxlcyBmcm9tCi0gICBiZWNvbWluZyBsYXJnZSBpbiB0aGUgcHJlc2VuY2Ugb2YgY29kZSBsaWtlOgkgKE5vbmUsKSoxMDAwLgorICAgaXMgYmVsb3cgYSB0aHJlc2hvbGQgdmFsdWUuICBUaGF0IGtlZXBzIHB5YyBmaWxlcyBmcm9tCisgICBiZWNvbWluZyBsYXJnZSBpbiB0aGUgcHJlc2VuY2Ugb2YgY29kZSBsaWtlOiAgKE5vbmUsKSoxMDAwLgogKi8KIHN0YXRpYyBpbnQKIGZvbGRfYmlub3BzX29uX2NvbnN0YW50cyh1bnNpZ25lZCBjaGFyICpjb2Rlc3RyLCBQeU9iamVjdCAqY29uc3RzKQogewotCVB5T2JqZWN0ICpuZXdjb25zdCwgKnYsICp3OwotCVB5X3NzaXplX3QgbGVuX2NvbnN0cywgc2l6ZTsKLQlpbnQgb3Bjb2RlOworICAgIFB5T2JqZWN0ICpuZXdjb25zdCwgKnYsICp3OworICAgIFB5X3NzaXplX3QgbGVuX2NvbnN0cywgc2l6ZTsKKyAgICBpbnQgb3Bjb2RlOwogCi0JLyogUHJlLWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoUHlMaXN0X0NoZWNrRXhhY3QoY29uc3RzKSk7Ci0JYXNzZXJ0KGNvZGVzdHJbMF0gPT0gTE9BRF9DT05TVCk7Ci0JYXNzZXJ0KGNvZGVzdHJbM10gPT0gTE9BRF9DT05TVCk7CisgICAgLyogUHJlLWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrRXhhY3QoY29uc3RzKSk7CisgICAgYXNzZXJ0KGNvZGVzdHJbMF0gPT0gTE9BRF9DT05TVCk7CisgICAgYXNzZXJ0KGNvZGVzdHJbM10gPT0gTE9BRF9DT05TVCk7CiAKLQkvKiBDcmVhdGUgbmV3IGNvbnN0YW50ICovCi0JdiA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIEdFVEFSRyhjb2Rlc3RyLCAwKSk7Ci0JdyA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIEdFVEFSRyhjb2Rlc3RyLCAzKSk7Ci0Jb3Bjb2RlID0gY29kZXN0cls2XTsKLQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIEJJTkFSWV9QT1dFUjoKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfUG93ZXIodiwgdywgUHlfTm9uZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfTVVMVElQTFk6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX011bHRpcGx5KHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX0RJVklERToKLQkJCS8qIENhbm5vdCBmb2xkIHRoaXMgb3BlcmF0aW9uIHN0YXRpY2FsbHkgc2luY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHQgY2FuIGRlcGVuZCBvbiB0aGUgcnVuLXRpbWUgcHJlc2VuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSAtUW5ldyBmbGFnICovCi0JCQlyZXR1cm4gMDsKLQkJY2FzZSBCSU5BUllfVFJVRV9ESVZJREU6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX1RydWVEaXZpZGUodiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfRkxPT1JfRElWSURFOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9GbG9vckRpdmlkZSh2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9NT0RVTE86Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX1JlbWFpbmRlcih2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9BREQ6Ci0JCQluZXdjb25zdCA9IFB5TnVtYmVyX0FkZCh2LCB3KTsKLQkJCWJyZWFrOwotCQljYXNlIEJJTkFSWV9TVUJUUkFDVDoKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfU3VidHJhY3Qodiwgdyk7Ci0JCQlicmVhazsKLQkJY2FzZSBCSU5BUllfU1VCU0NSOgotCQkJbmV3Y29uc3QgPSBQeU9iamVjdF9HZXRJdGVtKHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX0xTSElGVDoKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfTHNoaWZ0KHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX1JTSElGVDoKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfUnNoaWZ0KHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX0FORDoKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfQW5kKHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX1hPUjoKLQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfWG9yKHYsIHcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQklOQVJZX09SOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9Pcih2LCB3KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogQ2FsbGVkIHdpdGggYW4gdW5rbm93biBvcGNvZGUgKi8KLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKLQkJCSAgICAgInVuZXhwZWN0ZWQgYmluYXJ5IG9wZXJhdGlvbiAlZCBvbiBhIGNvbnN0YW50IiwKLQkJCQkgICAgIG9wY29kZSk7Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG5ld2NvbnN0ID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNpemUgPSBQeU9iamVjdF9TaXplKG5ld2NvbnN0KTsKLQlpZiAoc2l6ZSA9PSAtMSkKLQkJUHlFcnJfQ2xlYXIoKTsKLQllbHNlIGlmIChzaXplID4gMjApIHsKLQkJUHlfREVDUkVGKG5ld2NvbnN0KTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIENyZWF0ZSBuZXcgY29uc3RhbnQgKi8KKyAgICB2ID0gUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgR0VUQVJHKGNvZGVzdHIsIDApKTsKKyAgICB3ID0gUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgR0VUQVJHKGNvZGVzdHIsIDMpKTsKKyAgICBvcGNvZGUgPSBjb2Rlc3RyWzZdOworICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgIGNhc2UgQklOQVJZX1BPV0VSOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9Qb3dlcih2LCB3LCBQeV9Ob25lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9NVUxUSVBMWToKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfTXVsdGlwbHkodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfRElWSURFOgorICAgICAgICAgICAgLyogQ2Fubm90IGZvbGQgdGhpcyBvcGVyYXRpb24gc3RhdGljYWxseSBzaW5jZQorICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBjYW4gZGVwZW5kIG9uIHRoZSBydW4tdGltZSBwcmVzZW5jZQorICAgICAgICAgICAgICAgb2YgdGhlIC1RbmV3IGZsYWcgKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIEJJTkFSWV9UUlVFX0RJVklERToKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfVHJ1ZURpdmlkZSh2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9GTE9PUl9ESVZJREU6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX0Zsb29yRGl2aWRlKHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX01PRFVMTzoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfUmVtYWluZGVyKHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX0FERDoKKyAgICAgICAgICAgIG5ld2NvbnN0ID0gUHlOdW1iZXJfQWRkKHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQklOQVJZX1NVQlRSQUNUOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9TdWJ0cmFjdCh2LCB3KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJJTkFSWV9TVUJTQ1I6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5T2JqZWN0X0dldEl0ZW0odiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfTFNISUZUOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9Mc2hpZnQodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfUlNISUZUOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9Sc2hpZnQodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfQU5EOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9BbmQodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfWE9SOgorICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9Yb3Iodiwgdyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCSU5BUllfT1I6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX09yKHYsIHcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBDYWxsZWQgd2l0aCBhbiB1bmtub3duIG9wY29kZSAqLworICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBiaW5hcnkgb3BlcmF0aW9uICVkIG9uIGEgY29uc3RhbnQiLAorICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc2l6ZSA9IFB5T2JqZWN0X1NpemUobmV3Y29uc3QpOworICAgIGlmIChzaXplID09IC0xKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIGVsc2UgaWYgKHNpemUgPiAyMCkgeworICAgICAgICBQeV9ERUNSRUYobmV3Y29uc3QpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBcHBlbmQgZm9sZGVkIGNvbnN0YW50IGludG8gY29uc3RzIHRhYmxlICovCi0JbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOwotCWlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgbmV3Y29uc3QpKSB7Ci0JCVB5X0RFQ1JFRihuZXdjb25zdCk7Ci0JCXJldHVybiAwOwotCX0KLQlQeV9ERUNSRUYobmV3Y29uc3QpOworICAgIC8qIEFwcGVuZCBmb2xkZWQgY29uc3RhbnQgaW50byBjb25zdHMgdGFibGUgKi8KKyAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CisgICAgaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBuZXdjb25zdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CiAKLQkvKiBXcml0ZSBOT1AgTk9QIE5PUCBOT1AgTE9BRF9DT05TVCBuZXdjb25zdCAqLwotCW1lbXNldChjb2Rlc3RyLCBOT1AsIDQpOwotCWNvZGVzdHJbNF0gPSBMT0FEX0NPTlNUOwotCVNFVEFSRyhjb2Rlc3RyLCA0LCBsZW5fY29uc3RzKTsKLQlyZXR1cm4gMTsKKyAgICAvKiBXcml0ZSBOT1AgTk9QIE5PUCBOT1AgTE9BRF9DT05TVCBuZXdjb25zdCAqLworICAgIG1lbXNldChjb2Rlc3RyLCBOT1AsIDQpOworICAgIGNvZGVzdHJbNF0gPSBMT0FEX0NPTlNUOworICAgIFNFVEFSRyhjb2Rlc3RyLCA0LCBsZW5fY29uc3RzKTsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogZm9sZF91bmFyeW9wc19vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlPYmplY3QgKmNvbnN0cykKIHsKLQlQeU9iamVjdCAqbmV3Y29uc3Q9TlVMTCwgKnY7Ci0JUHlfc3NpemVfdCBsZW5fY29uc3RzOwotCWludCBvcGNvZGU7CisgICAgUHlPYmplY3QgKm5ld2NvbnN0PU5VTEwsICp2OworICAgIFB5X3NzaXplX3QgbGVuX2NvbnN0czsKKyAgICBpbnQgb3Bjb2RlOwogCi0JLyogUHJlLWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoUHlMaXN0X0NoZWNrRXhhY3QoY29uc3RzKSk7Ci0JYXNzZXJ0KGNvZGVzdHJbMF0gPT0gTE9BRF9DT05TVCk7CisgICAgLyogUHJlLWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrRXhhY3QoY29uc3RzKSk7CisgICAgYXNzZXJ0KGNvZGVzdHJbMF0gPT0gTE9BRF9DT05TVCk7CiAKLQkvKiBDcmVhdGUgbmV3IGNvbnN0YW50ICovCi0JdiA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIEdFVEFSRyhjb2Rlc3RyLCAwKSk7Ci0Jb3Bjb2RlID0gY29kZXN0clszXTsKLQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIFVOQVJZX05FR0FUSVZFOgotCQkJLyogUHJlc2VydmUgdGhlIHNpZ24gb2YgLTAuMCAqLwotCQkJaWYgKFB5T2JqZWN0X0lzVHJ1ZSh2KSA9PSAxKQotCQkJCW5ld2NvbnN0ID0gUHlOdW1iZXJfTmVnYXRpdmUodik7Ci0JCQlicmVhazsKLQkJY2FzZSBVTkFSWV9DT05WRVJUOgotCQkJbmV3Y29uc3QgPSBQeU9iamVjdF9SZXByKHYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVU5BUllfSU5WRVJUOgotCQkJbmV3Y29uc3QgPSBQeU51bWJlcl9JbnZlcnQodik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIENhbGxlZCB3aXRoIGFuIHVua25vd24gb3Bjb2RlICovCi0JCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgICJ1bmV4cGVjdGVkIHVuYXJ5IG9wZXJhdGlvbiAlZCBvbiBhIGNvbnN0YW50IiwKLQkJCQkgICAgIG9wY29kZSk7Ci0JCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG5ld2NvbnN0ID09IE5VTEwpIHsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIENyZWF0ZSBuZXcgY29uc3RhbnQgKi8KKyAgICB2ID0gUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgR0VUQVJHKGNvZGVzdHIsIDApKTsKKyAgICBvcGNvZGUgPSBjb2Rlc3RyWzNdOworICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgIGNhc2UgVU5BUllfTkVHQVRJVkU6CisgICAgICAgICAgICAvKiBQcmVzZXJ2ZSB0aGUgc2lnbiBvZiAtMC4wICovCisgICAgICAgICAgICBpZiAoUHlPYmplY3RfSXNUcnVlKHYpID09IDEpCisgICAgICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9OZWdhdGl2ZSh2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVOQVJZX0NPTlZFUlQ6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5T2JqZWN0X1JlcHIodik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVTkFSWV9JTlZFUlQ6CisgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX0ludmVydCh2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogQ2FsbGVkIHdpdGggYW4gdW5rbm93biBvcGNvZGUgKi8KKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgdW5hcnkgb3BlcmF0aW9uICVkIG9uIGEgY29uc3RhbnQiLAorICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBcHBlbmQgZm9sZGVkIGNvbnN0YW50IGludG8gY29uc3RzIHRhYmxlICovCi0JbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOwotCWlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgbmV3Y29uc3QpKSB7Ci0JCVB5X0RFQ1JFRihuZXdjb25zdCk7Ci0JCXJldHVybiAwOwotCX0KLQlQeV9ERUNSRUYobmV3Y29uc3QpOworICAgIC8qIEFwcGVuZCBmb2xkZWQgY29uc3RhbnQgaW50byBjb25zdHMgdGFibGUgKi8KKyAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CisgICAgaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBuZXdjb25zdCkpIHsKKyAgICAgICAgUHlfREVDUkVGKG5ld2NvbnN0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CiAKLQkvKiBXcml0ZSBOT1AgTE9BRF9DT05TVCBuZXdjb25zdCAqLwotCWNvZGVzdHJbMF0gPSBOT1A7Ci0JY29kZXN0clsxXSA9IExPQURfQ09OU1Q7Ci0JU0VUQVJHKGNvZGVzdHIsIDEsIGxlbl9jb25zdHMpOwotCXJldHVybiAxOworICAgIC8qIFdyaXRlIE5PUCBMT0FEX0NPTlNUIG5ld2NvbnN0ICovCisgICAgY29kZXN0clswXSA9IE5PUDsKKyAgICBjb2Rlc3RyWzFdID0gTE9BRF9DT05TVDsKKyAgICBTRVRBUkcoY29kZXN0ciwgMSwgbGVuX2NvbnN0cyk7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgKgogbWFya2Jsb2Nrcyh1bnNpZ25lZCBjaGFyICpjb2RlLCBQeV9zc2l6ZV90IGxlbikKIHsKLQl1bnNpZ25lZCBpbnQgKmJsb2NrcyA9ICh1bnNpZ25lZCBpbnQgKilQeU1lbV9NYWxsb2MobGVuKnNpemVvZihpbnQpKTsKLQlpbnQgaSxqLCBvcGNvZGUsIGJsb2NrY250ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgKmJsb2NrcyA9ICh1bnNpZ25lZCBpbnQgKilQeU1lbV9NYWxsb2MobGVuKnNpemVvZihpbnQpKTsKKyAgICBpbnQgaSxqLCBvcGNvZGUsIGJsb2NrY250ID0gMDsKIAotCWlmIChibG9ja3MgPT0gTlVMTCkgewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JbWVtc2V0KGJsb2NrcywgMCwgbGVuKnNpemVvZihpbnQpKTsKKyAgICBpZiAoYmxvY2tzID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChibG9ja3MsIDAsIGxlbipzaXplb2YoaW50KSk7CiAKLQkvKiBNYXJrIGxhYmVscyBpbiB0aGUgZmlyc3QgcGFzcyAqLwotCWZvciAoaT0wIDsgaTxsZW4gOyBpKz1DT0RFU0laRShvcGNvZGUpKSB7Ci0JCW9wY29kZSA9IGNvZGVbaV07Ci0JCXN3aXRjaCAob3Bjb2RlKSB7Ci0JCQljYXNlIEZPUl9JVEVSOgotCQkJY2FzZSBKVU1QX0ZPUldBUkQ6Ci0JCQljYXNlIEpVTVBfSUZfRkFMU0U6Ci0JCQljYXNlIEpVTVBfSUZfVFJVRToKLQkJCWNhc2UgSlVNUF9BQlNPTFVURToKLQkJCWNhc2UgQ09OVElOVUVfTE9PUDoKLQkJCWNhc2UgU0VUVVBfTE9PUDoKLQkJCWNhc2UgU0VUVVBfRVhDRVBUOgotCQkJY2FzZSBTRVRVUF9GSU5BTExZOgotCQkJCWogPSBHRVRKVU1QVEdUKGNvZGUsIGkpOwotCQkJCWJsb2Nrc1tqXSA9IDE7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyogQnVpbGQgYmxvY2sgbnVtYmVycyBpbiB0aGUgc2Vjb25kIHBhc3MgKi8KLQlmb3IgKGk9MCA7IGk8bGVuIDsgaSsrKSB7Ci0JCWJsb2NrY250ICs9IGJsb2Nrc1tpXTsJLyogaW5jcmVtZW50IGJsb2NrY250IG92ZXIgbGFiZWxzICovCi0JCWJsb2Nrc1tpXSA9IGJsb2NrY250OwotCX0KLQlyZXR1cm4gYmxvY2tzOworICAgIC8qIE1hcmsgbGFiZWxzIGluIHRoZSBmaXJzdCBwYXNzICovCisgICAgZm9yIChpPTAgOyBpPGxlbiA7IGkrPUNPREVTSVpFKG9wY29kZSkpIHsKKyAgICAgICAgb3Bjb2RlID0gY29kZVtpXTsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgRk9SX0lURVI6CisgICAgICAgICAgICBjYXNlIEpVTVBfRk9SV0FSRDoKKyAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9GQUxTRToKKyAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9UUlVFOgorICAgICAgICAgICAgY2FzZSBKVU1QX0FCU09MVVRFOgorICAgICAgICAgICAgY2FzZSBDT05USU5VRV9MT09QOgorICAgICAgICAgICAgY2FzZSBTRVRVUF9MT09QOgorICAgICAgICAgICAgY2FzZSBTRVRVUF9FWENFUFQ6CisgICAgICAgICAgICBjYXNlIFNFVFVQX0ZJTkFMTFk6CisgICAgICAgICAgICAgICAgaiA9IEdFVEpVTVBUR1QoY29kZSwgaSk7CisgICAgICAgICAgICAgICAgYmxvY2tzW2pdID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBCdWlsZCBibG9jayBudW1iZXJzIGluIHRoZSBzZWNvbmQgcGFzcyAqLworICAgIGZvciAoaT0wIDsgaTxsZW4gOyBpKyspIHsKKyAgICAgICAgYmxvY2tjbnQgKz0gYmxvY2tzW2ldOyAgICAgICAgICAvKiBpbmNyZW1lbnQgYmxvY2tjbnQgb3ZlciBsYWJlbHMgKi8KKyAgICAgICAgYmxvY2tzW2ldID0gYmxvY2tjbnQ7CisgICAgfQorICAgIHJldHVybiBibG9ja3M7CiB9CiAKIC8qIFBlcmZvcm0gYmFzaWMgcGVlcGhvbGUgb3B0aW1pemF0aW9ucyB0byBjb21wb25lbnRzIG9mIGEgY29kZSBvYmplY3QuCi0gICBUaGUgY29uc3RzIG9iamVjdCBzaG91bGQgc3RpbGwgYmUgaW4gbGlzdCBmb3JtIHRvIGFsbG93IG5ldyBjb25zdGFudHMgCisgICBUaGUgY29uc3RzIG9iamVjdCBzaG91bGQgc3RpbGwgYmUgaW4gbGlzdCBmb3JtIHRvIGFsbG93IG5ldyBjb25zdGFudHMKICAgIHRvIGJlIGFwcGVuZGVkLgogCiAgICBUbyBrZWVwIHRoZSBvcHRpbWl6ZXIgc2ltcGxlLCBpdCBiYWlscyBvdXQgKGRvZXMgbm90aGluZykgZm9yIGNvZGUKLSAgIGNvbnRhaW5pbmcgZXh0ZW5kZWQgYXJndW1lbnRzIG9yIHRoYXQgaGFzIGEgbGVuZ3RoIG92ZXIgMzIsNzAwLiAgVGhhdCAKLSAgIGFsbG93cyB1cyB0byBhdm9pZCBvdmVyZmxvdyBhbmQgc2lnbiBpc3N1ZXMuCSBMaWtld2lzZSwgaXQgYmFpbHMgd2hlbgorICAgY29udGFpbmluZyBleHRlbmRlZCBhcmd1bWVudHMgb3IgdGhhdCBoYXMgYSBsZW5ndGggb3ZlciAzMiw3MDAuICBUaGF0CisgICBhbGxvd3MgdXMgdG8gYXZvaWQgb3ZlcmZsb3cgYW5kIHNpZ24gaXNzdWVzLiAgTGlrZXdpc2UsIGl0IGJhaWxzIHdoZW4KICAgIHRoZSBsaW5lbm8gdGFibGUgaGFzIGNvbXBsZXggZW5jb2RpbmcgZm9yIGdhcHMgPj0gMjU1LgogCiAgICBPcHRpbWl6YXRpb25zIGFyZSByZXN0cmljdGVkIHRvIHNpbXBsZSB0cmFuc2Zvcm1hdGlvbnMgb2NjdXJpbmcgd2l0aGluIGEKLSAgIHNpbmdsZSBiYXNpYyBibG9jay4JQWxsIHRyYW5zZm9ybWF0aW9ucyBrZWVwIHRoZSBjb2RlIHNpemUgdGhlIHNhbWUgb3IgCi0gICBzbWFsbGVyLiAgRm9yIHRob3NlIHRoYXQgcmVkdWNlIHNpemUsIHRoZSBnYXBzIGFyZSBpbml0aWFsbHkgZmlsbGVkIHdpdGggCi0gICBOT1BzLiAgTGF0ZXIgdGhvc2UgTk9QcyBhcmUgcmVtb3ZlZCBhbmQgdGhlIGp1bXAgYWRkcmVzc2VzIHJldGFyZ2V0ZWQgaW4gCisgICBzaW5nbGUgYmFzaWMgYmxvY2suICBBbGwgdHJhbnNmb3JtYXRpb25zIGtlZXAgdGhlIGNvZGUgc2l6ZSB0aGUgc2FtZSBvcgorICAgc21hbGxlci4gIEZvciB0aG9zZSB0aGF0IHJlZHVjZSBzaXplLCB0aGUgZ2FwcyBhcmUgaW5pdGlhbGx5IGZpbGxlZCB3aXRoCisgICBOT1BzLiAgTGF0ZXIgdGhvc2UgTk9QcyBhcmUgcmVtb3ZlZCBhbmQgdGhlIGp1bXAgYWRkcmVzc2VzIHJldGFyZ2V0ZWQgaW4KICAgIGEgc2luZ2xlIHBhc3MuICBMaW5lIG51bWJlcmluZyBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseS4gKi8KIAogUHlPYmplY3QgKgogUHlDb2RlX09wdGltaXplKFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCogY29uc3RzLCBQeU9iamVjdCAqbmFtZXMsCiAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmxpbmVub19vYmopCiB7Ci0JUHlfc3NpemVfdCBpLCBqLCBjb2RlbGVuOwotCWludCBub3BzLCBoLCBhZGo7Ci0JaW50IHRndCwgdGd0dGd0LCBvcGNvZGU7Ci0JdW5zaWduZWQgY2hhciAqY29kZXN0ciA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhciAqbGluZW5vOwotCWludCAqYWRkcm1hcCA9IE5VTEw7Ci0JaW50IG5ld19saW5lLCBjdW1fb3JpZ19saW5lLCBsYXN0X2xpbmUsIHRhYnNpejsKLQlpbnQgY3VtbGM9MCwgbGFzdGxjPTA7CS8qIENvdW50IHJ1bnMgb2YgY29uc2VjdXRpdmUgTE9BRF9DT05TVHMgKi8KLQl1bnNpZ25lZCBpbnQgKmJsb2NrcyA9IE5VTEw7Ci0JY2hhciAqbmFtZTsKKyAgICBQeV9zc2l6ZV90IGksIGosIGNvZGVsZW47CisgICAgaW50IG5vcHMsIGgsIGFkajsKKyAgICBpbnQgdGd0LCB0Z3R0Z3QsIG9wY29kZTsKKyAgICB1bnNpZ25lZCBjaGFyICpjb2Rlc3RyID0gTlVMTDsKKyAgICB1bnNpZ25lZCBjaGFyICpsaW5lbm87CisgICAgaW50ICphZGRybWFwID0gTlVMTDsKKyAgICBpbnQgbmV3X2xpbmUsIGN1bV9vcmlnX2xpbmUsIGxhc3RfbGluZSwgdGFic2l6OworICAgIGludCBjdW1sYz0wLCBsYXN0bGM9MDsgICAgICAvKiBDb3VudCBydW5zIG9mIGNvbnNlY3V0aXZlIExPQURfQ09OU1RzICovCisgICAgdW5zaWduZWQgaW50ICpibG9ja3MgPSBOVUxMOworICAgIGNoYXIgKm5hbWU7CiAKLQkvKiBCYWlsIG91dCBpZiBhbiBleGNlcHRpb24gaXMgc2V0ICovCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCWdvdG8gZXhpdEVycm9yOworICAgIC8qIEJhaWwgb3V0IGlmIGFuIGV4Y2VwdGlvbiBpcyBzZXQgKi8KKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgZ290byBleGl0RXJyb3I7CiAKLQkvKiBCeXBhc3Mgb3B0aW1pemF0aW9uIHdoZW4gdGhlIGxpbmVubyB0YWJsZSBpcyB0b28gY29tcGxleCAqLwotCWFzc2VydChQeVN0cmluZ19DaGVjayhsaW5lbm9fb2JqKSk7Ci0JbGluZW5vID0gKHVuc2lnbmVkIGNoYXIqKVB5U3RyaW5nX0FTX1NUUklORyhsaW5lbm9fb2JqKTsKLQl0YWJzaXogPSBQeVN0cmluZ19HRVRfU0laRShsaW5lbm9fb2JqKTsKLQlpZiAobWVtY2hyKGxpbmVubywgMjU1LCB0YWJzaXopICE9IE5VTEwpCi0JCWdvdG8gZXhpdFVuY2hhbmdlZDsKKyAgICAvKiBCeXBhc3Mgb3B0aW1pemF0aW9uIHdoZW4gdGhlIGxpbmVubyB0YWJsZSBpcyB0b28gY29tcGxleCAqLworICAgIGFzc2VydChQeVN0cmluZ19DaGVjayhsaW5lbm9fb2JqKSk7CisgICAgbGluZW5vID0gKHVuc2lnbmVkIGNoYXIqKVB5U3RyaW5nX0FTX1NUUklORyhsaW5lbm9fb2JqKTsKKyAgICB0YWJzaXogPSBQeVN0cmluZ19HRVRfU0laRShsaW5lbm9fb2JqKTsKKyAgICBpZiAobWVtY2hyKGxpbmVubywgMjU1LCB0YWJzaXopICE9IE5VTEwpCisgICAgICAgIGdvdG8gZXhpdFVuY2hhbmdlZDsKIAotCS8qIEF2b2lkIHNpdHVhdGlvbnMgd2hlcmUganVtcCByZXRhcmdldGluZyBjb3VsZCBvdmVyZmxvdyAqLwotCWFzc2VydChQeVN0cmluZ19DaGVjayhjb2RlKSk7Ci0JY29kZWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGNvZGUpOwotCWlmIChjb2RlbGVuID4gMzI3MDApCi0JCWdvdG8gZXhpdFVuY2hhbmdlZDsKKyAgICAvKiBBdm9pZCBzaXR1YXRpb25zIHdoZXJlIGp1bXAgcmV0YXJnZXRpbmcgY291bGQgb3ZlcmZsb3cgKi8KKyAgICBhc3NlcnQoUHlTdHJpbmdfQ2hlY2soY29kZSkpOworICAgIGNvZGVsZW4gPSBQeVN0cmluZ19HRVRfU0laRShjb2RlKTsKKyAgICBpZiAoY29kZWxlbiA+IDMyNzAwKQorICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7CiAKLQkvKiBNYWtlIGEgbW9kaWZpYWJsZSBjb3B5IG9mIHRoZSBjb2RlIHN0cmluZyAqLwotCWNvZGVzdHIgPSAodW5zaWduZWQgY2hhciAqKVB5TWVtX01hbGxvYyhjb2RlbGVuKTsKLQlpZiAoY29kZXN0ciA9PSBOVUxMKQotCQlnb3RvIGV4aXRFcnJvcjsKLQljb2Rlc3RyID0gKHVuc2lnbmVkIGNoYXIgKiltZW1jcHkoY29kZXN0ciwgCi0JCQkJCSAgUHlTdHJpbmdfQVNfU1RSSU5HKGNvZGUpLCBjb2RlbGVuKTsKKyAgICAvKiBNYWtlIGEgbW9kaWZpYWJsZSBjb3B5IG9mIHRoZSBjb2RlIHN0cmluZyAqLworICAgIGNvZGVzdHIgPSAodW5zaWduZWQgY2hhciAqKVB5TWVtX01hbGxvYyhjb2RlbGVuKTsKKyAgICBpZiAoY29kZXN0ciA9PSBOVUxMKQorICAgICAgICBnb3RvIGV4aXRFcnJvcjsKKyAgICBjb2Rlc3RyID0gKHVuc2lnbmVkIGNoYXIgKiltZW1jcHkoY29kZXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGNvZGUpLCBjb2RlbGVuKTsKIAotCS8qIFZlcmlmeSB0aGF0IFJFVFVSTl9WQUxVRSB0ZXJtaW5hdGVzIHRoZSBjb2Rlc3RyaW5nLglUaGlzIGFsbG93cwotCSAgIHRoZSB2YXJpb3VzIHRyYW5zZm9ybWF0aW9uIHBhdHRlcm5zIHRvIGxvb2sgYWhlYWQgc2V2ZXJhbAotCSAgIGluc3RydWN0aW9ucyB3aXRob3V0IGFkZGl0aW9uYWwgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBub3QKLQkgICBsb29raW5nIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBjb2RlIHN0cmluZy4KLQkqLwotCWlmIChjb2Rlc3RyW2NvZGVsZW4tMV0gIT0gUkVUVVJOX1ZBTFVFKQotCQlnb3RvIGV4aXRVbmNoYW5nZWQ7CisgICAgLyogVmVyaWZ5IHRoYXQgUkVUVVJOX1ZBTFVFIHRlcm1pbmF0ZXMgdGhlIGNvZGVzdHJpbmcuICAgICAgVGhpcyBhbGxvd3MKKyAgICAgICB0aGUgdmFyaW91cyB0cmFuc2Zvcm1hdGlvbiBwYXR0ZXJucyB0byBsb29rIGFoZWFkIHNldmVyYWwKKyAgICAgICBpbnN0cnVjdGlvbnMgd2l0aG91dCBhZGRpdGlvbmFsIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgbm90CisgICAgICAgbG9va2luZyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgY29kZSBzdHJpbmcuCisgICAgKi8KKyAgICBpZiAoY29kZXN0cltjb2RlbGVuLTFdICE9IFJFVFVSTl9WQUxVRSkKKyAgICAgICAgZ290byBleGl0VW5jaGFuZ2VkOwogCi0JLyogTWFwcGluZyB0byBuZXcganVtcCB0YXJnZXRzIGFmdGVyIE5PUHMgYXJlIHJlbW92ZWQgKi8KLQlhZGRybWFwID0gKGludCAqKVB5TWVtX01hbGxvYyhjb2RlbGVuICogc2l6ZW9mKGludCkpOwotCWlmIChhZGRybWFwID09IE5VTEwpCi0JCWdvdG8gZXhpdEVycm9yOworICAgIC8qIE1hcHBpbmcgdG8gbmV3IGp1bXAgdGFyZ2V0cyBhZnRlciBOT1BzIGFyZSByZW1vdmVkICovCisgICAgYWRkcm1hcCA9IChpbnQgKilQeU1lbV9NYWxsb2MoY29kZWxlbiAqIHNpemVvZihpbnQpKTsKKyAgICBpZiAoYWRkcm1hcCA9PSBOVUxMKQorICAgICAgICBnb3RvIGV4aXRFcnJvcjsKIAotCWJsb2NrcyA9IG1hcmtibG9ja3MoY29kZXN0ciwgY29kZWxlbik7Ci0JaWYgKGJsb2NrcyA9PSBOVUxMKQotCQlnb3RvIGV4aXRFcnJvcjsKLQlhc3NlcnQoUHlMaXN0X0NoZWNrKGNvbnN0cykpOworICAgIGJsb2NrcyA9IG1hcmtibG9ja3MoY29kZXN0ciwgY29kZWxlbik7CisgICAgaWYgKGJsb2NrcyA9PSBOVUxMKQorICAgICAgICBnb3RvIGV4aXRFcnJvcjsKKyAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGNvbnN0cykpOwogCi0JZm9yIChpPTAgOyBpPGNvZGVsZW4gOyBpICs9IENPREVTSVpFKGNvZGVzdHJbaV0pKSB7Ci0JCW9wY29kZSA9IGNvZGVzdHJbaV07CisgICAgZm9yIChpPTAgOyBpPGNvZGVsZW4gOyBpICs9IENPREVTSVpFKGNvZGVzdHJbaV0pKSB7CisgICAgICAgIG9wY29kZSA9IGNvZGVzdHJbaV07CiAKLQkJbGFzdGxjID0gY3VtbGM7Ci0JCWN1bWxjID0gMDsKKyAgICAgICAgbGFzdGxjID0gY3VtbGM7CisgICAgICAgIGN1bWxjID0gMDsKIAotCQlzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgewogCi0JCQkvKiBSZXBsYWNlIFVOQVJZX05PVCBKVU1QX0lGX0ZBTFNFIFBPUF9UT1Agd2l0aCAKLQkJCSAgIHdpdGgJICAgSlVNUF9JRl9UUlVFIFBPUF9UT1AgKi8KLQkJCWNhc2UgVU5BUllfTk9UOgotCQkJCWlmIChjb2Rlc3RyW2krMV0gIT0gSlVNUF9JRl9GQUxTRSAgfHwKLQkJCQkgICAgY29kZXN0cltpKzRdICE9IFBPUF9UT1AgIHx8Ci0JCQkJICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgKGkrMSkpOwotCQkJCWlmIChjb2Rlc3RyW3RndF0gIT0gUE9QX1RPUCkKLQkJCQkJY29udGludWU7Ci0JCQkJaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKzEpICsgMTsKLQkJCQljb2Rlc3RyW2ldID0gSlVNUF9JRl9UUlVFOwotCQkJCVNFVEFSRyhjb2Rlc3RyLCBpLCBqKTsKLQkJCQljb2Rlc3RyW2krM10gPSBQT1BfVE9QOwotCQkJCWNvZGVzdHJbaSs0XSA9IE5PUDsKLQkJCQlicmVhazsKKyAgICAgICAgICAgIC8qIFJlcGxhY2UgVU5BUllfTk9UIEpVTVBfSUZfRkFMU0UgUE9QX1RPUCB3aXRoCisgICAgICAgICAgICAgICB3aXRoICAgICAgICAgICAgICAgIEpVTVBfSUZfVFJVRSBQT1BfVE9QICovCisgICAgICAgICAgICBjYXNlIFVOQVJZX05PVDoKKyAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzFdICE9IEpVTVBfSUZfRkFMU0UgIHx8CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaSs0XSAhPSBQT1BfVE9QICB8fAorICAgICAgICAgICAgICAgICAgICAhSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDUpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIChpKzEpKTsKKyAgICAgICAgICAgICAgICBpZiAoY29kZXN0clt0Z3RdICE9IFBPUF9UT1ApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGogPSBHRVRBUkcoY29kZXN0ciwgaSsxKSArIDE7CisgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IEpVTVBfSUZfVFJVRTsKKyAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgaik7CisgICAgICAgICAgICAgICAgY29kZXN0cltpKzNdID0gUE9QX1RPUDsKKyAgICAgICAgICAgICAgICBjb2Rlc3RyW2krNF0gPSBOT1A7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCQkvKiBub3QgYSBpcyBiIC0tPiAgYSBpcyBub3QgYgotCQkJCSAgIG5vdCBhIGluIGIgLS0+ICBhIG5vdCBpbiBiCi0JCQkJICAgbm90IGEgaXMgbm90IGIgLS0+ICBhIGlzIGIKLQkJCQkgICBub3QgYSBub3QgaW4gYiAtLT4gIGEgaW4gYgotCQkJCSovCi0JCQljYXNlIENPTVBBUkVfT1A6Ci0JCQkJaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKLQkJCQlpZiAoaiA8IDYgIHx8ICBqID4gOSAgfHwKLQkJCQkgICAgY29kZXN0cltpKzNdICE9IFVOQVJZX05PVCAgfHwgCi0JCQkJICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVNFVEFSRyhjb2Rlc3RyLCBpLCAoal4xKSk7Ci0JCQkJY29kZXN0cltpKzNdID0gTk9QOwotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIG5vdCBhIGlzIGIgLS0+ICBhIGlzIG5vdCBiCisgICAgICAgICAgICAgICAgICAgbm90IGEgaW4gYiAtLT4gIGEgbm90IGluIGIKKyAgICAgICAgICAgICAgICAgICBub3QgYSBpcyBub3QgYiAtLT4gIGEgaXMgYgorICAgICAgICAgICAgICAgICAgIG5vdCBhIG5vdCBpbiBiIC0tPiAgYSBpbiBiCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNhc2UgQ09NUEFSRV9PUDoKKyAgICAgICAgICAgICAgICBqID0gR0VUQVJHKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIGlmIChqIDwgNiAgfHwgIGogPiA5ICB8fAorICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM10gIT0gVU5BUllfTk9UICB8fAorICAgICAgICAgICAgICAgICAgICAhSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDQpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgKGpeMSkpOworICAgICAgICAgICAgICAgIGNvZGVzdHJbaSszXSA9IE5PUDsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJCS8qIFJlcGxhY2UgTE9BRF9HTE9CQUwvTE9BRF9OQU1FIE5vbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBMT0FEX0NPTlNUIE5vbmUgKi8KLQkJCWNhc2UgTE9BRF9OQU1FOgotCQkJY2FzZSBMT0FEX0dMT0JBTDoKLQkJCQlqID0gR0VUQVJHKGNvZGVzdHIsIGkpOwotCQkJCW5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhQeVR1cGxlX0dFVF9JVEVNKG5hbWVzLCBqKSk7Ci0JCQkJaWYgKG5hbWUgPT0gTlVMTCAgfHwgIHN0cmNtcChuYW1lLCAiTm9uZSIpICE9IDApCi0JCQkJCWNvbnRpbnVlOwotCQkJCWZvciAoaj0wIDsgaiA8IFB5TGlzdF9HRVRfU0laRShjb25zdHMpIDsgaisrKSB7Ci0JCQkJCWlmIChQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBqKSA9PSBQeV9Ob25lKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChqID09IFB5TGlzdF9HRVRfU0laRShjb25zdHMpKSB7Ci0JCQkJCWlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgUHlfTm9uZSkgPT0gLTEpCi0JCQkJCSAgICAgICAgZ290byBleGl0RXJyb3I7Ci0JCQkJfQotCQkJCWFzc2VydChQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBqKSA9PSBQeV9Ob25lKTsKLQkJCQljb2Rlc3RyW2ldID0gTE9BRF9DT05TVDsKLQkJCQlTRVRBUkcoY29kZXN0ciwgaSwgaik7Ci0JCQkJY3VtbGMgPSBsYXN0bGMgKyAxOwotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgTE9BRF9HTE9CQUwvTE9BRF9OQU1FIE5vbmUKKyAgICAgICAgICAgICAgICAgICB3aXRoIExPQURfQ09OU1QgTm9uZSAqLworICAgICAgICAgICAgY2FzZSBMT0FEX05BTUU6CisgICAgICAgICAgICBjYXNlIExPQURfR0xPQkFMOgorICAgICAgICAgICAgICAgIGogPSBHRVRBUkcoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKFB5VHVwbGVfR0VUX0lURU0obmFtZXMsIGopKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMICB8fCAgc3RyY21wKG5hbWUsICJOb25lIikgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZm9yIChqPTAgOyBqIDwgUHlMaXN0X0dFVF9TSVpFKGNvbnN0cykgOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIGopID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPT0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoY29uc3RzLCBQeV9Ob25lKSA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdEVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlMaXN0X0dFVF9JVEVNKGNvbnN0cywgaikgPT0gUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IExPQURfQ09OU1Q7CisgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIGopOworICAgICAgICAgICAgICAgIGN1bWxjID0gbGFzdGxjICsgMTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJCS8qIFNraXAgb3ZlciBMT0FEX0NPTlNUIHRydWVjb25zdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKVU1QX0lGX0ZBTFNFIHh4ICBQT1BfVE9QICovCi0JCQljYXNlIExPQURfQ09OU1Q6Ci0JCQkJY3VtbGMgPSBsYXN0bGMgKyAxOwotCQkJCWogPSBHRVRBUkcoY29kZXN0ciwgaSk7Ci0JCQkJaWYgKGNvZGVzdHJbaSszXSAhPSBKVU1QX0lGX0ZBTFNFICB8fAotCQkJCSAgICBjb2Rlc3RyW2krNl0gIT0gUE9QX1RPUCAgfHwKLQkJCQkgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw3KSAgfHwKLQkJCQkgICAgIVB5T2JqZWN0X0lzVHJ1ZShQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBqKSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCW1lbXNldChjb2Rlc3RyK2ksIE5PUCwgNyk7Ci0JCQkJY3VtbGMgPSAwOwotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIFNraXAgb3ZlciBMT0FEX0NPTlNUIHRydWVjb25zdAorICAgICAgICAgICAgICAgICAgIEpVTVBfSUZfRkFMU0UgeHggIFBPUF9UT1AgKi8KKyAgICAgICAgICAgIGNhc2UgTE9BRF9DT05TVDoKKyAgICAgICAgICAgICAgICBjdW1sYyA9IGxhc3RsYyArIDE7CisgICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzNdICE9IEpVTVBfSUZfRkFMU0UgIHx8CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaSs2XSAhPSBQT1BfVE9QICB8fAorICAgICAgICAgICAgICAgICAgICAhSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDcpICB8fAorICAgICAgICAgICAgICAgICAgICAhUHlPYmplY3RfSXNUcnVlKFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIGopKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSwgTk9QLCA3KTsKKyAgICAgICAgICAgICAgICBjdW1sYyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCQkvKiBUcnkgdG8gZm9sZCB0dXBsZXMgb2YgY29uc3RhbnRzIChpbmNsdWRlcyBhIGNhc2UgZm9yIGxpc3RzCi0JCQkJICAgd2hpY2ggYXJlIG9ubHkgdXNlZCBmb3IgImluIiBhbmQgIm5vdCBpbiIgdGVzdHMpLgotCQkJCSAgIFNraXAgb3ZlciBCVUlMRF9TRVFOIDEgVU5QQUNLX1NFUU4gMS4KLQkJCQkgICBSZXBsYWNlIEJVSUxEX1NFUU4gMiBVTlBBQ0tfU0VRTiAyIHdpdGggUk9UMi4KLQkJCQkgICBSZXBsYWNlIEJVSUxEX1NFUU4gMyBVTlBBQ0tfU0VRTiAzIHdpdGggUk9UMyBST1QyLiAqLwotCQkJY2FzZSBCVUlMRF9UVVBMRToKLQkJCWNhc2UgQlVJTERfTElTVDoKLQkJCQlqID0gR0VUQVJHKGNvZGVzdHIsIGkpOwotCQkJCWggPSBpIC0gMyAqIGo7Ci0JCQkJaWYgKGggPj0gMCAgJiYKLQkJCQkgICAgaiA8PSBsYXN0bGMJICYmCi0JCQkJICAgICgob3Bjb2RlID09IEJVSUxEX1RVUExFICYmIAotCQkJCSAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIDMqKGorMSkpKSB8fAotCQkJCSAgICAgKG9wY29kZSA9PSBCVUlMRF9MSVNUICYmIAotCQkJCSAgICAgIGNvZGVzdHJbaSszXT09Q09NUEFSRV9PUCAmJiAKLQkJCQkgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCAzKihqKzIpKSAmJgotCQkJCSAgICAgIChHRVRBUkcoY29kZXN0cixpKzMpPT02IHx8Ci0JCQkJICAgICAgIEdFVEFSRyhjb2Rlc3RyLGkrMyk9PTcpKSkgJiYKLQkJCQkgICAgdHVwbGVfb2ZfY29uc3RhbnRzKCZjb2Rlc3RyW2hdLCBqLCBjb25zdHMpKSB7Ci0JCQkJCWFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOwotCQkJCQljdW1sYyA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY29kZXN0cltpKzNdICE9IFVOUEFDS19TRVFVRU5DRSAgfHwKLQkJCQkgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw2KSB8fAotCQkJCSAgICBqICE9IEdFVEFSRyhjb2Rlc3RyLCBpKzMpKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoaiA9PSAxKSB7Ci0JCQkJCW1lbXNldChjb2Rlc3RyK2ksIE5PUCwgNik7Ci0JCQkJfSBlbHNlIGlmIChqID09IDIpIHsKLQkJCQkJY29kZXN0cltpXSA9IFJPVF9UV087Ci0JCQkJCW1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCA1KTsKLQkJCQl9IGVsc2UgaWYgKGogPT0gMykgewotCQkJCQljb2Rlc3RyW2ldID0gUk9UX1RIUkVFOwotCQkJCQljb2Rlc3RyW2krMV0gPSBST1RfVFdPOwotCQkJCQltZW1zZXQoY29kZXN0citpKzIsIE5PUCwgNCk7Ci0JCQkJfQotCQkJCWJyZWFrOworICAgICAgICAgICAgICAgIC8qIFRyeSB0byBmb2xkIHR1cGxlcyBvZiBjb25zdGFudHMgKGluY2x1ZGVzIGEgY2FzZSBmb3IgbGlzdHMKKyAgICAgICAgICAgICAgICAgICB3aGljaCBhcmUgb25seSB1c2VkIGZvciAiaW4iIGFuZCAibm90IGluIiB0ZXN0cykuCisgICAgICAgICAgICAgICAgICAgU2tpcCBvdmVyIEJVSUxEX1NFUU4gMSBVTlBBQ0tfU0VRTiAxLgorICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgQlVJTERfU0VRTiAyIFVOUEFDS19TRVFOIDIgd2l0aCBST1QyLgorICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgQlVJTERfU0VRTiAzIFVOUEFDS19TRVFOIDMgd2l0aCBST1QzIFJPVDIuICovCisgICAgICAgICAgICBjYXNlIEJVSUxEX1RVUExFOgorICAgICAgICAgICAgY2FzZSBCVUlMRF9MSVNUOgorICAgICAgICAgICAgICAgIGogPSBHRVRBUkcoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgaCA9IGkgLSAzICogajsKKyAgICAgICAgICAgICAgICBpZiAoaCA+PSAwICAmJgorICAgICAgICAgICAgICAgICAgICBqIDw9IGxhc3RsYyAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgICgob3Bjb2RlID09IEJVSUxEX1RVUExFICYmCisgICAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgMyooaisxKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAob3Bjb2RlID09IEJVSUxEX0xJU1QgJiYKKyAgICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM109PUNPTVBBUkVfT1AgJiYKKyAgICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCAzKihqKzIpKSAmJgorICAgICAgICAgICAgICAgICAgICAgIChHRVRBUkcoY29kZXN0cixpKzMpPT02IHx8CisgICAgICAgICAgICAgICAgICAgICAgIEdFVEFSRyhjb2Rlc3RyLGkrMyk9PTcpKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgdHVwbGVfb2ZfY29uc3RhbnRzKCZjb2Rlc3RyW2hdLCBqLCBjb25zdHMpKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOworICAgICAgICAgICAgICAgICAgICBjdW1sYyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzNdICE9IFVOUEFDS19TRVFVRU5DRSAgfHwKKyAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsaSw2KSB8fAorICAgICAgICAgICAgICAgICAgICBqICE9IEdFVEFSRyhjb2Rlc3RyLCBpKzMpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoaiA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2ksIE5PUCwgNik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFJPVF9UV087CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCA1KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGogPT0gMykgeworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gUk9UX1RIUkVFOworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2krMV0gPSBST1RfVFdPOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citpKzIsIE5PUCwgNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQkJLyogRm9sZCBiaW5hcnkgb3BzIG9uIGNvbnN0YW50cy4KLQkJCQkgICBMT0FEX0NPTlNUIGMxIExPQURfQ09OU1QgYzIgQklOT1AgLS0+ICBMT0FEX0NPTlNUIGJpbm9wKGMxLGMyKSAqLwotCQkJY2FzZSBCSU5BUllfUE9XRVI6Ci0JCQljYXNlIEJJTkFSWV9NVUxUSVBMWToKLQkJCWNhc2UgQklOQVJZX1RSVUVfRElWSURFOgotCQkJY2FzZSBCSU5BUllfRkxPT1JfRElWSURFOgotCQkJY2FzZSBCSU5BUllfTU9EVUxPOgotCQkJY2FzZSBCSU5BUllfQUREOgotCQkJY2FzZSBCSU5BUllfU1VCVFJBQ1Q6Ci0JCQljYXNlIEJJTkFSWV9TVUJTQ1I6Ci0JCQljYXNlIEJJTkFSWV9MU0hJRlQ6Ci0JCQljYXNlIEJJTkFSWV9SU0hJRlQ6Ci0JCQljYXNlIEJJTkFSWV9BTkQ6Ci0JCQljYXNlIEJJTkFSWV9YT1I6Ci0JCQljYXNlIEJJTkFSWV9PUjoKLQkJCQlpZiAobGFzdGxjID49IDIJICYmCi0JCQkJICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGktNiwgNykgICYmCi0JCQkJICAgIGZvbGRfYmlub3BzX29uX2NvbnN0YW50cygmY29kZXN0cltpLTZdLCBjb25zdHMpKSB7Ci0JCQkJCWkgLT0gMjsKLQkJCQkJYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCk7Ci0JCQkJCWN1bWxjID0gMTsKLQkJCQl9Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRm9sZCBiaW5hcnkgb3BzIG9uIGNvbnN0YW50cy4KKyAgICAgICAgICAgICAgICAgICBMT0FEX0NPTlNUIGMxIExPQURfQ09OU1QgYzIgQklOT1AgLS0+ICBMT0FEX0NPTlNUIGJpbm9wKGMxLGMyKSAqLworICAgICAgICAgICAgY2FzZSBCSU5BUllfUE9XRVI6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9NVUxUSVBMWToKKyAgICAgICAgICAgIGNhc2UgQklOQVJZX1RSVUVfRElWSURFOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfRkxPT1JfRElWSURFOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfTU9EVUxPOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfQUREOgorICAgICAgICAgICAgY2FzZSBCSU5BUllfU1VCVFJBQ1Q6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9TVUJTQ1I6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9MU0hJRlQ6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9SU0hJRlQ6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9BTkQ6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9YT1I6CisgICAgICAgICAgICBjYXNlIEJJTkFSWV9PUjoKKyAgICAgICAgICAgICAgICBpZiAobGFzdGxjID49IDIgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBpLTYsIDcpICAmJgorICAgICAgICAgICAgICAgICAgICBmb2xkX2Jpbm9wc19vbl9jb25zdGFudHMoJmNvZGVzdHJbaS02XSwgY29uc3RzKSkgeworICAgICAgICAgICAgICAgICAgICBpIC09IDI7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpOworICAgICAgICAgICAgICAgICAgICBjdW1sYyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQkJLyogRm9sZCB1bmFyeSBvcHMgb24gY29uc3RhbnRzLgotCQkJCSAgIExPQURfQ09OU1QgYzEgIFVOQVJZX09QIC0tPglMT0FEX0NPTlNUIHVuYXJ5X29wKGMpICovCi0JCQljYXNlIFVOQVJZX05FR0FUSVZFOgotCQkJY2FzZSBVTkFSWV9DT05WRVJUOgotCQkJY2FzZSBVTkFSWV9JTlZFUlQ6Ci0JCQkJaWYgKGxhc3RsYyA+PSAxCSAmJgotCQkJCSAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBpLTMsIDQpICAmJgotCQkJCSAgICBmb2xkX3VuYXJ5b3BzX29uX2NvbnN0YW50cygmY29kZXN0cltpLTNdLCBjb25zdHMpKQl7Ci0JCQkJCWkgLT0gMjsKLQkJCQkJYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCk7Ci0JCQkJCWN1bWxjID0gMTsKLQkJCQl9Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgLyogRm9sZCB1bmFyeSBvcHMgb24gY29uc3RhbnRzLgorICAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgYzEgIFVOQVJZX09QIC0tPiAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgdW5hcnlfb3AoYykgKi8KKyAgICAgICAgICAgIGNhc2UgVU5BUllfTkVHQVRJVkU6CisgICAgICAgICAgICBjYXNlIFVOQVJZX0NPTlZFUlQ6CisgICAgICAgICAgICBjYXNlIFVOQVJZX0lOVkVSVDoKKyAgICAgICAgICAgICAgICBpZiAobGFzdGxjID49IDEgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBpLTMsIDQpICAmJgorICAgICAgICAgICAgICAgICAgICBmb2xkX3VuYXJ5b3BzX29uX2NvbnN0YW50cygmY29kZXN0cltpLTNdLCBjb25zdHMpKSAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaSAtPSAyOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsKKyAgICAgICAgICAgICAgICAgICAgY3VtbGMgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKIAotCQkJCS8qIFNpbXBsaWZ5IGNvbmRpdGlvbmFsIGp1bXAgdG8gY29uZGl0aW9uYWwganVtcCB3aGVyZSB0aGUKLQkJCQkgICByZXN1bHQgb2YgdGhlIGZpcnN0IHRlc3QgaW1wbGllcyB0aGUgc3VjY2VzcyBvZiBhIHNpbWlsYXIKLQkJCQkgICB0ZXN0IG9yIHRoZSBmYWlsdXJlIG9mIHRoZSBvcHBvc2l0ZSB0ZXN0LgotCQkJCSAgIEFyaXNlcyBpbiBjb2RlIGxpa2U6Ci0JCQkJICAgImlmIGEgYW5kIGI6IgotCQkJCSAgICJpZiBhIG9yIGI6IgotCQkJCSAgICJhIGFuZCBiIG9yIGMiCi0JCQkJICAgIihhIGFuZCBiKSBhbmQgYyIKLQkJCQkgICB4OkpVTVBfSUZfRkFMU0UgeSAgIHk6SlVNUF9JRl9GQUxTRSB6ICAtLT4gIHg6SlVNUF9JRl9GQUxTRSB6Ci0JCQkJICAgeDpKVU1QX0lGX0ZBTFNFIHkgICB5OkpVTVBfSUZfVFJVRSB6CSAtLT4gIHg6SlVNUF9JRl9GQUxTRSB5KzMKLQkJCQkgICB3aGVyZSB5KzMgaXMgdGhlIGluc3RydWN0aW9uIGZvbGxvd2luZyB0aGUgc2Vjb25kIHRlc3QuCi0JCQkJKi8KLQkJCWNhc2UgSlVNUF9JRl9GQUxTRToKLQkJCWNhc2UgSlVNUF9JRl9UUlVFOgotCQkJCXRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgaSk7Ci0JCQkJaiA9IGNvZGVzdHJbdGd0XTsKLQkJCQlpZiAoaiA9PSBKVU1QX0lGX0ZBTFNFCXx8ICBqID09IEpVTVBfSUZfVFJVRSkgewotCQkJCQlpZiAoaiA9PSBvcGNvZGUpIHsKLQkJCQkJCXRndHRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgdGd0KSAtIGkgLSAzOwotCQkJCQkJU0VUQVJHKGNvZGVzdHIsIGksIHRndHRndCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0Z3QgLT0gaTsKLQkJCQkJCVNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3QpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLyAgCisgICAgICAgICAgICAgICAgLyogU2ltcGxpZnkgY29uZGl0aW9uYWwganVtcCB0byBjb25kaXRpb25hbCBqdW1wIHdoZXJlIHRoZQorICAgICAgICAgICAgICAgICAgIHJlc3VsdCBvZiB0aGUgZmlyc3QgdGVzdCBpbXBsaWVzIHRoZSBzdWNjZXNzIG9mIGEgc2ltaWxhcgorICAgICAgICAgICAgICAgICAgIHRlc3Qgb3IgdGhlIGZhaWx1cmUgb2YgdGhlIG9wcG9zaXRlIHRlc3QuCisgICAgICAgICAgICAgICAgICAgQXJpc2VzIGluIGNvZGUgbGlrZToKKyAgICAgICAgICAgICAgICAgICAiaWYgYSBhbmQgYjoiCisgICAgICAgICAgICAgICAgICAgImlmIGEgb3IgYjoiCisgICAgICAgICAgICAgICAgICAgImEgYW5kIGIgb3IgYyIKKyAgICAgICAgICAgICAgICAgICAiKGEgYW5kIGIpIGFuZCBjIgorICAgICAgICAgICAgICAgICAgIHg6SlVNUF9JRl9GQUxTRSB5ICAgeTpKVU1QX0lGX0ZBTFNFIHogIC0tPiAgeDpKVU1QX0lGX0ZBTFNFIHoKKyAgICAgICAgICAgICAgICAgICB4OkpVTVBfSUZfRkFMU0UgeSAgIHk6SlVNUF9JRl9UUlVFIHogICAgICAgICAgICAgICAgICAtLT4gIHg6SlVNUF9JRl9GQUxTRSB5KzMKKyAgICAgICAgICAgICAgICAgICB3aGVyZSB5KzMgaXMgdGhlIGluc3RydWN0aW9uIGZvbGxvd2luZyB0aGUgc2Vjb25kIHRlc3QuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9GQUxTRToKKyAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9UUlVFOgorICAgICAgICAgICAgICAgIHRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgaiA9IGNvZGVzdHJbdGd0XTsKKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBKVU1QX0lGX0ZBTFNFICAgICAgICAgICAgICAgICAgfHwgIGogPT0gSlVNUF9JRl9UUlVFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqID09IG9wY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGd0dGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpIC0gaSAtIDM7CisgICAgICAgICAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgdGd0dGd0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRndCAtPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIHRndCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCiAKLQkJCQkvKiBSZXBsYWNlIGp1bXBzIHRvIHVuY29uZGl0aW9uYWwganVtcHMgKi8KLQkJCWNhc2UgRk9SX0lURVI6Ci0JCQljYXNlIEpVTVBfRk9SV0FSRDoKLQkJCWNhc2UgSlVNUF9BQlNPTFVURToKLQkJCWNhc2UgQ09OVElOVUVfTE9PUDoKLQkJCWNhc2UgU0VUVVBfTE9PUDoKLQkJCWNhc2UgU0VUVVBfRVhDRVBUOgotCQkJY2FzZSBTRVRVUF9GSU5BTExZOgotCQkJCXRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgaSk7Ci0JCQkJLyogUmVwbGFjZSBKVU1QXyogdG8gYSBSRVRVUk4gaW50byBqdXN0IGEgUkVUVVJOICovCi0JCQkJaWYgKFVOQ09ORElUSU9OQUxfSlVNUChvcGNvZGUpICYmCi0JCQkJICAgIGNvZGVzdHJbdGd0XSA9PSBSRVRVUk5fVkFMVUUpIHsKLQkJCQkJY29kZXN0cltpXSA9IFJFVFVSTl9WQUxVRTsKLQkJCQkJbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDIpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKCFVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0clt0Z3RdKSkKLQkJCQkJY29udGludWU7Ci0JCQkJdGd0dGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOwotCQkJCWlmIChvcGNvZGUgPT0gSlVNUF9GT1JXQVJEKSAvKiBKTVBfQUJTIGNhbiBnbyBiYWNrd2FyZHMgKi8KLQkJCQkJb3Bjb2RlID0gSlVNUF9BQlNPTFVURTsKLQkJCQlpZiAoIUFCU09MVVRFX0pVTVAob3Bjb2RlKSkKLQkJCQkJdGd0dGd0IC09IGkgKyAzOyAgICAgLyogQ2FsYyByZWxhdGl2ZSBqdW1wIGFkZHIgKi8KLQkJCQlpZiAodGd0dGd0IDwgMCkJCSAgLyogTm8gYmFja3dhcmQgcmVsYXRpdmUganVtcHMgKi8KLQkJCQkJY29udGludWU7Ci0JCQkJY29kZXN0cltpXSA9IG9wY29kZTsKLQkJCQlTRVRBUkcoY29kZXN0ciwgaSwgdGd0dGd0KTsKLQkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAvKiBSZXBsYWNlIGp1bXBzIHRvIHVuY29uZGl0aW9uYWwganVtcHMgKi8KKyAgICAgICAgICAgIGNhc2UgRk9SX0lURVI6CisgICAgICAgICAgICBjYXNlIEpVTVBfRk9SV0FSRDoKKyAgICAgICAgICAgIGNhc2UgSlVNUF9BQlNPTFVURToKKyAgICAgICAgICAgIGNhc2UgQ09OVElOVUVfTE9PUDoKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfRVhDRVBUOgorICAgICAgICAgICAgY2FzZSBTRVRVUF9GSU5BTExZOgorICAgICAgICAgICAgICAgIHRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBKVU1QXyogdG8gYSBSRVRVUk4gaW50byBqdXN0IGEgUkVUVVJOICovCisgICAgICAgICAgICAgICAgaWYgKFVOQ09ORElUSU9OQUxfSlVNUChvcGNvZGUpICYmCisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbdGd0XSA9PSBSRVRVUk5fVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFJFVFVSTl9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0clt0Z3RdKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgdGd0dGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCB0Z3QpOworICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gSlVNUF9GT1JXQVJEKSAvKiBKTVBfQUJTIGNhbiBnbyBiYWNrd2FyZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID0gSlVNUF9BQlNPTFVURTsKKyAgICAgICAgICAgICAgICBpZiAoIUFCU09MVVRFX0pVTVAob3Bjb2RlKSkKKyAgICAgICAgICAgICAgICAgICAgdGd0dGd0IC09IGkgKyAzOyAgICAgLyogQ2FsYyByZWxhdGl2ZSBqdW1wIGFkZHIgKi8KKyAgICAgICAgICAgICAgICBpZiAodGd0dGd0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBiYWNrd2FyZCByZWxhdGl2ZSBqdW1wcyAqLworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gb3Bjb2RlOworICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCB0Z3R0Z3QpOworICAgICAgICAgICAgICAgIGJyZWFrOwogCi0JCQljYXNlIEVYVEVOREVEX0FSRzoKLQkJCQlnb3RvIGV4aXRVbmNoYW5nZWQ7CisgICAgICAgICAgICBjYXNlIEVYVEVOREVEX0FSRzoKKyAgICAgICAgICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7CiAKLQkJCQkvKiBSZXBsYWNlIFJFVFVSTiBMT0FEX0NPTlNUIE5vbmUgUkVUVVJOIHdpdGgganVzdCBSRVRVUk4gKi8KLQkJCQkvKiBSZW1vdmUgdW5yZWFjaGFibGUgSlVNUHMgYWZ0ZXIgUkVUVVJOICovCi0JCQljYXNlIFJFVFVSTl9WQUxVRToKLQkJCQlpZiAoaSs0ID49IGNvZGVsZW4pCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChjb2Rlc3RyW2krNF0gPT0gUkVUVVJOX1ZBTFVFICYmCi0JCQkJICAgIElTQkFTSUNCTE9DSyhibG9ja3MsaSw1KSkKLQkJCQkJbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDQpOwotCQkJCWVsc2UgaWYgKFVOQ09ORElUSU9OQUxfSlVNUChjb2Rlc3RyW2krMV0pICYmCi0JCQkJICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDQpKQotCQkJCQltZW1zZXQoY29kZXN0citpKzEsIE5PUCwgMyk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgLyogUmVwbGFjZSBSRVRVUk4gTE9BRF9DT05TVCBOb25lIFJFVFVSTiB3aXRoIGp1c3QgUkVUVVJOICovCisgICAgICAgICAgICAgICAgLyogUmVtb3ZlIHVucmVhY2hhYmxlIEpVTVBzIGFmdGVyIFJFVFVSTiAqLworICAgICAgICAgICAgY2FzZSBSRVRVUk5fVkFMVUU6CisgICAgICAgICAgICAgICAgaWYgKGkrNCA+PSBjb2RlbGVuKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzRdID09IFJFVFVSTl9WQUxVRSAmJgorICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLGksNSkpCisgICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCA0KTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0cltpKzFdKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsaSw0KSkKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQogCi0JLyogRml4dXAgbGluZW5vdGFiICovCi0JZm9yIChpPTAsIG5vcHM9MCA7IGk8Y29kZWxlbiA7IGkgKz0gQ09ERVNJWkUoY29kZXN0cltpXSkpIHsKLQkJYWRkcm1hcFtpXSA9IGkgLSBub3BzOwotCQlpZiAoY29kZXN0cltpXSA9PSBOT1ApCi0JCQlub3BzKys7Ci0JfQotCWN1bV9vcmlnX2xpbmUgPSAwOwotCWxhc3RfbGluZSA9IDA7Ci0JZm9yIChpPTAgOyBpIDwgdGFic2l6IDsgaSs9MikgewotCQljdW1fb3JpZ19saW5lICs9IGxpbmVub1tpXTsKLQkJbmV3X2xpbmUgPSBhZGRybWFwW2N1bV9vcmlnX2xpbmVdOwotCQlhc3NlcnQgKG5ld19saW5lIC0gbGFzdF9saW5lIDwgMjU1KTsKLQkJbGluZW5vW2ldID0oKHVuc2lnbmVkIGNoYXIpKG5ld19saW5lIC0gbGFzdF9saW5lKSk7Ci0JCWxhc3RfbGluZSA9IG5ld19saW5lOwotCX0KKyAgICAvKiBGaXh1cCBsaW5lbm90YWIgKi8KKyAgICBmb3IgKGk9MCwgbm9wcz0wIDsgaTxjb2RlbGVuIDsgaSArPSBDT0RFU0laRShjb2Rlc3RyW2ldKSkgeworICAgICAgICBhZGRybWFwW2ldID0gaSAtIG5vcHM7CisgICAgICAgIGlmIChjb2Rlc3RyW2ldID09IE5PUCkKKyAgICAgICAgICAgIG5vcHMrKzsKKyAgICB9CisgICAgY3VtX29yaWdfbGluZSA9IDA7CisgICAgbGFzdF9saW5lID0gMDsKKyAgICBmb3IgKGk9MCA7IGkgPCB0YWJzaXogOyBpKz0yKSB7CisgICAgICAgIGN1bV9vcmlnX2xpbmUgKz0gbGluZW5vW2ldOworICAgICAgICBuZXdfbGluZSA9IGFkZHJtYXBbY3VtX29yaWdfbGluZV07CisgICAgICAgIGFzc2VydCAobmV3X2xpbmUgLSBsYXN0X2xpbmUgPCAyNTUpOworICAgICAgICBsaW5lbm9baV0gPSgodW5zaWduZWQgY2hhcikobmV3X2xpbmUgLSBsYXN0X2xpbmUpKTsKKyAgICAgICAgbGFzdF9saW5lID0gbmV3X2xpbmU7CisgICAgfQogCi0JLyogUmVtb3ZlIE5PUHMgYW5kIGZpeHVwIGp1bXAgdGFyZ2V0cyAqLwotCWZvciAoaT0wLCBoPTAgOyBpPGNvZGVsZW4gOyApIHsKLQkJb3Bjb2RlID0gY29kZXN0cltpXTsKLQkJc3dpdGNoIChvcGNvZGUpIHsKLQkJCWNhc2UgTk9QOgotCQkJCWkrKzsKLQkJCQljb250aW51ZTsKKyAgICAvKiBSZW1vdmUgTk9QcyBhbmQgZml4dXAganVtcCB0YXJnZXRzICovCisgICAgZm9yIChpPTAsIGg9MCA7IGk8Y29kZWxlbiA7ICkgeworICAgICAgICBvcGNvZGUgPSBjb2Rlc3RyW2ldOworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICAgICAgY2FzZSBOT1A6CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0JCQljYXNlIEpVTVBfQUJTT0xVVEU6Ci0JCQljYXNlIENPTlRJTlVFX0xPT1A6Ci0JCQkJaiA9IGFkZHJtYXBbR0VUQVJHKGNvZGVzdHIsIGkpXTsKLQkJCQlTRVRBUkcoY29kZXN0ciwgaSwgaik7Ci0JCQkJYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpVTVBfQUJTT0xVVEU6CisgICAgICAgICAgICBjYXNlIENPTlRJTlVFX0xPT1A6CisgICAgICAgICAgICAgICAgaiA9IGFkZHJtYXBbR0VUQVJHKGNvZGVzdHIsIGkpXTsKKyAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgaik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLQkJCWNhc2UgRk9SX0lURVI6Ci0JCQljYXNlIEpVTVBfRk9SV0FSRDoKLQkJCWNhc2UgSlVNUF9JRl9GQUxTRToKLQkJCWNhc2UgSlVNUF9JRl9UUlVFOgotCQkJY2FzZSBTRVRVUF9MT09QOgotCQkJY2FzZSBTRVRVUF9FWENFUFQ6Ci0JCQljYXNlIFNFVFVQX0ZJTkFMTFk6Ci0JCQkJaiA9IGFkZHJtYXBbR0VUQVJHKGNvZGVzdHIsIGkpICsgaSArIDNdIC0gYWRkcm1hcFtpXSAtIDM7Ci0JCQkJU0VUQVJHKGNvZGVzdHIsIGksIGopOwotCQkJCWJyZWFrOwotCQl9Ci0JCWFkaiA9IENPREVTSVpFKG9wY29kZSk7Ci0JCXdoaWxlIChhZGotLSkKLQkJCWNvZGVzdHJbaCsrXSA9IGNvZGVzdHJbaSsrXTsKLQl9Ci0JYXNzZXJ0KGggKyBub3BzID09IGNvZGVsZW4pOworICAgICAgICAgICAgY2FzZSBGT1JfSVRFUjoKKyAgICAgICAgICAgIGNhc2UgSlVNUF9GT1JXQVJEOgorICAgICAgICAgICAgY2FzZSBKVU1QX0lGX0ZBTFNFOgorICAgICAgICAgICAgY2FzZSBKVU1QX0lGX1RSVUU6CisgICAgICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CisgICAgICAgICAgICBjYXNlIFNFVFVQX0VYQ0VQVDoKKyAgICAgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKKyAgICAgICAgICAgICAgICBqID0gYWRkcm1hcFtHRVRBUkcoY29kZXN0ciwgaSkgKyBpICsgM10gLSBhZGRybWFwW2ldIC0gMzsKKyAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgaik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYWRqID0gQ09ERVNJWkUob3Bjb2RlKTsKKyAgICAgICAgd2hpbGUgKGFkai0tKQorICAgICAgICAgICAgY29kZXN0cltoKytdID0gY29kZXN0cltpKytdOworICAgIH0KKyAgICBhc3NlcnQoaCArIG5vcHMgPT0gY29kZWxlbik7CiAKLQljb2RlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKiljb2Rlc3RyLCBoKTsKLQlQeU1lbV9GcmVlKGFkZHJtYXApOwotCVB5TWVtX0ZyZWUoY29kZXN0cik7Ci0JUHlNZW1fRnJlZShibG9ja3MpOwotCXJldHVybiBjb2RlOworICAgIGNvZGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKWNvZGVzdHIsIGgpOworICAgIFB5TWVtX0ZyZWUoYWRkcm1hcCk7CisgICAgUHlNZW1fRnJlZShjb2Rlc3RyKTsKKyAgICBQeU1lbV9GcmVlKGJsb2Nrcyk7CisgICAgcmV0dXJuIGNvZGU7CiAKICBleGl0RXJyb3I6Ci0JY29kZSA9IE5VTEw7CisgICAgY29kZSA9IE5VTEw7CiAKICBleGl0VW5jaGFuZ2VkOgotCWlmIChibG9ja3MgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShibG9ja3MpOwotCWlmIChhZGRybWFwICE9IE5VTEwpCi0JCVB5TWVtX0ZyZWUoYWRkcm1hcCk7Ci0JaWYgKGNvZGVzdHIgIT0gTlVMTCkKLQkJUHlNZW1fRnJlZShjb2Rlc3RyKTsKLQlQeV9YSU5DUkVGKGNvZGUpOwotCXJldHVybiBjb2RlOworICAgIGlmIChibG9ja3MgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRnJlZShibG9ja3MpOworICAgIGlmIChhZGRybWFwICE9IE5VTEwpCisgICAgICAgIFB5TWVtX0ZyZWUoYWRkcm1hcCk7CisgICAgaWYgKGNvZGVzdHIgIT0gTlVMTCkKKyAgICAgICAgUHlNZW1fRnJlZShjb2Rlc3RyKTsKKyAgICBQeV9YSU5DUkVGKGNvZGUpOworICAgIHJldHVybiBjb2RlOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5YXJlbmEuYyBiL1B5dGhvbi9weWFyZW5hLmMKaW5kZXggZjRjYzQ3NC4uMmQ2MzYzOCAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5YXJlbmEuYworKysgYi9QeXRob24vcHlhcmVuYS5jCkBAIC0xMiwzMiArMTIsMzIgQEAKICovCiAKICNkZWZpbmUgREVGQVVMVF9CTE9DS19TSVpFIDgxOTIKLSNkZWZpbmUgQUxJR05NRU5UCQk4Ci0jZGVmaW5lIEFMSUdOTUVOVF9NQVNLCQkoQUxJR05NRU5UIC0gMSkKLSNkZWZpbmUgUk9VTkRVUCh4KQkJKCgoeCkgKyBBTElHTk1FTlRfTUFTSykgJiB+QUxJR05NRU5UX01BU0spCisjZGVmaW5lIEFMSUdOTUVOVCAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQUxJR05NRU5UX01BU0sgICAgICAgICAgKEFMSUdOTUVOVCAtIDEpCisjZGVmaW5lIFJPVU5EVVAoeCkgICAgICAgICAgICAgICgoKHgpICsgQUxJR05NRU5UX01BU0spICYgfkFMSUdOTUVOVF9NQVNLKQogCiB0eXBlZGVmIHN0cnVjdCBfYmxvY2sgewotCS8qIFRvdGFsIG51bWJlciBvZiBieXRlcyBvd25lZCBieSB0aGlzIGJsb2NrIGF2YWlsYWJsZSB0byBwYXNzIG91dC4KLQkgKiBSZWFkLW9ubHkgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uICBUaGUgZmlyc3Qgc3VjaCBieXRlIHN0YXJ0cyBhdAotCSAqIGFiX21lbS4KLQkgKi8KLQlzaXplX3QgYWJfc2l6ZTsKKyAgICAvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgb3duZWQgYnkgdGhpcyBibG9jayBhdmFpbGFibGUgdG8gcGFzcyBvdXQuCisgICAgICogUmVhZC1vbmx5IGFmdGVyIGluaXRpYWxpemF0aW9uLiAgVGhlIGZpcnN0IHN1Y2ggYnl0ZSBzdGFydHMgYXQKKyAgICAgKiBhYl9tZW0uCisgICAgICovCisgICAgc2l6ZV90IGFiX3NpemU7CiAKLQkvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBwYXNzZWQgb3V0LiAgVGhlIG5leHQgYnl0ZSBhdmFpbGFibGUKLQkgKiB0byBwYXNzIG91dCBzdGFydHMgYXQgYWJfbWVtICsgYWJfb2Zmc2V0LgotCSAqLwotCXNpemVfdCBhYl9vZmZzZXQ7CisgICAgLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIGFscmVhZHkgcGFzc2VkIG91dC4gIFRoZSBuZXh0IGJ5dGUgYXZhaWxhYmxlCisgICAgICogdG8gcGFzcyBvdXQgc3RhcnRzIGF0IGFiX21lbSArIGFiX29mZnNldC4KKyAgICAgKi8KKyAgICBzaXplX3QgYWJfb2Zmc2V0OwogCi0JLyogQW4gYXJlbmEgbWFpbnRhaW5zIGEgc2luZ2x5LWxpbmtlZCwgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YKLQkgKiBhbGwgYmxvY2tzIG93bmVkIGJ5IHRoZSBhcmVuYS4gIFRoZXNlIGFyZSBsaW5rZWQgdmlhIHRoZQotCSAqIGFiX25leHQgbWVtYmVyLgotCSAqLwotCXN0cnVjdCBfYmxvY2sgKmFiX25leHQ7CisgICAgLyogQW4gYXJlbmEgbWFpbnRhaW5zIGEgc2luZ2x5LWxpbmtlZCwgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YKKyAgICAgKiBhbGwgYmxvY2tzIG93bmVkIGJ5IHRoZSBhcmVuYS4gIFRoZXNlIGFyZSBsaW5rZWQgdmlhIHRoZQorICAgICAqIGFiX25leHQgbWVtYmVyLgorICAgICAqLworICAgIHN0cnVjdCBfYmxvY2sgKmFiX25leHQ7CiAKLQkvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBhbGxvY2F0YWJsZSBieXRlIG93bmVkIGJ5IHRoaXMgYmxvY2suICBSZWFkLQotCSAqIG9ubHkgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCi0JICovCi0Jdm9pZCAqYWJfbWVtOworICAgIC8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGFsbG9jYXRhYmxlIGJ5dGUgb3duZWQgYnkgdGhpcyBibG9jay4gIFJlYWQtCisgICAgICogb25seSBhZnRlciBpbml0aWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkICphYl9tZW07CiB9IGJsb2NrOwogCiAvKiBUaGUgYXJlbmEgbWFuYWdlcyB0d28ga2luZHMgb2YgbWVtb3J5LCBibG9ja3Mgb2YgcmF3IG1lbW9yeQpAQCAtNDYsMTc1ICs0NiwxNzUgQEAKICovCiAKIHN0cnVjdCBfYXJlbmEgewotICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBibG9jayBhbGxvY2F0ZWQgZm9yIHRoZSBhcmVuYSwgbmV2ZXIgTlVMTC4KLSAgICAgICAgICAgSXQgaXMgdXNlZCBvbmx5IHRvIGZpbmQgdGhlIGZpcnN0IGJsb2NrIHdoZW4gdGhlIGFyZW5hIGlzCi0gICAgICAgICAgIGJlaW5nIGZyZWVkLgotICAgICAgICAgKi8KLQlibG9jayAqYV9oZWFkOworICAgIC8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGJsb2NrIGFsbG9jYXRlZCBmb3IgdGhlIGFyZW5hLCBuZXZlciBOVUxMLgorICAgICAgIEl0IGlzIHVzZWQgb25seSB0byBmaW5kIHRoZSBmaXJzdCBibG9jayB3aGVuIHRoZSBhcmVuYSBpcworICAgICAgIGJlaW5nIGZyZWVkLgorICAgICAqLworICAgIGJsb2NrICphX2hlYWQ7CiAKLSAgICAgICAgLyogUG9pbnRlciB0byB0aGUgYmxvY2sgY3VycmVudGx5IHVzZWQgZm9yIGFsbG9jYXRpb24uICBJdCdzCi0gICAgICAgICAgIGFiX25leHQgZmllbGQgc2hvdWxkIGJlIE5VTEwuICBJZiBpdCBpcyBub3QtbnVsbCBhZnRlciBhCi0gICAgICAgICAgIGNhbGwgdG8gYmxvY2tfYWxsb2MoKSwgaXQgbWVhbnMgYSBuZXcgYmxvY2sgaGFzIGJlZW4gYWxsb2NhdGVkCi0gICAgICAgICAgIGFuZCBhX2N1ciBzaG91bGQgYmUgcmVzZXQgdG8gcG9pbnQgaXQuCi0gICAgICAgICAqLwotCWJsb2NrICphX2N1cjsKKyAgICAvKiBQb2ludGVyIHRvIHRoZSBibG9jayBjdXJyZW50bHkgdXNlZCBmb3IgYWxsb2NhdGlvbi4gIEl0J3MKKyAgICAgICBhYl9uZXh0IGZpZWxkIHNob3VsZCBiZSBOVUxMLiAgSWYgaXQgaXMgbm90LW51bGwgYWZ0ZXIgYQorICAgICAgIGNhbGwgdG8gYmxvY2tfYWxsb2MoKSwgaXQgbWVhbnMgYSBuZXcgYmxvY2sgaGFzIGJlZW4gYWxsb2NhdGVkCisgICAgICAgYW5kIGFfY3VyIHNob3VsZCBiZSByZXNldCB0byBwb2ludCBpdC4KKyAgICAgKi8KKyAgICBibG9jayAqYV9jdXI7CiAKLSAgICAgICAgLyogQSBQeXRob24gbGlzdCBvYmplY3QgY29udGFpbmluZyByZWZlcmVuY2VzIHRvIGFsbCB0aGUgUHlPYmplY3QKLSAgICAgICAgICAgcG9pbnRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXJlYS4gIFRoZXkgd2lsbCBiZSBERUNSRUZlZAotICAgICAgICAgICB3aGVuIHRoZSBhcmVuYSBpcyBmcmVlZC4KLSAgICAgICAgKi8KLSAgICAgICAgUHlPYmplY3QgKmFfb2JqZWN0czsKKyAgICAvKiBBIFB5dGhvbiBsaXN0IG9iamVjdCBjb250YWluaW5nIHJlZmVyZW5jZXMgdG8gYWxsIHRoZSBQeU9iamVjdAorICAgICAgIHBvaW50ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFyZWEuICBUaGV5IHdpbGwgYmUgREVDUkVGZWQKKyAgICAgICB3aGVuIHRoZSBhcmVuYSBpcyBmcmVlZC4KKyAgICAqLworICAgIFB5T2JqZWN0ICphX29iamVjdHM7CiAKICNpZiBkZWZpbmVkKFB5X0RFQlVHKQotICAgICAgICAvKiBEZWJ1ZyBvdXRwdXQgKi8KLSAgICAgICAgc2l6ZV90IHRvdGFsX2FsbG9jczsKLSAgICAgICAgc2l6ZV90IHRvdGFsX3NpemU7Ci0gICAgICAgIHNpemVfdCB0b3RhbF9ibG9ja3M7Ci0gICAgICAgIHNpemVfdCB0b3RhbF9ibG9ja19zaXplOwotICAgICAgICBzaXplX3QgdG90YWxfYmlnX2Jsb2NrczsKKyAgICAvKiBEZWJ1ZyBvdXRwdXQgKi8KKyAgICBzaXplX3QgdG90YWxfYWxsb2NzOworICAgIHNpemVfdCB0b3RhbF9zaXplOworICAgIHNpemVfdCB0b3RhbF9ibG9ja3M7CisgICAgc2l6ZV90IHRvdGFsX2Jsb2NrX3NpemU7CisgICAgc2l6ZV90IHRvdGFsX2JpZ19ibG9ja3M7CiAjZW5kaWYKIH07CiAKIHN0YXRpYyBibG9jayAqCiBibG9ja19uZXcoc2l6ZV90IHNpemUpCiB7Ci0JLyogQWxsb2NhdGUgaGVhZGVyIGFuZCBibG9jayBhcyBvbmUgdW5pdC4KLQkgICBhYl9tZW0gcG9pbnRzIGp1c3QgcGFzdCBoZWFkZXIuICovCi0JYmxvY2sgKmIgPSAoYmxvY2sgKiltYWxsb2Moc2l6ZW9mKGJsb2NrKSArIHNpemUpOwotCWlmICghYikKLQkJcmV0dXJuIE5VTEw7Ci0JYi0+YWJfc2l6ZSA9IHNpemU7Ci0JYi0+YWJfbWVtID0gKHZvaWQgKikoYiArIDEpOwotCWItPmFiX25leHQgPSBOVUxMOwotCWItPmFiX29mZnNldCA9IFJPVU5EVVAoKFB5X3VpbnRwdHJfdCkoYi0+YWJfbWVtKSkgLSAKLQkgIChQeV91aW50cHRyX3QpKGItPmFiX21lbSk7Ci0JcmV0dXJuIGI7CisgICAgLyogQWxsb2NhdGUgaGVhZGVyIGFuZCBibG9jayBhcyBvbmUgdW5pdC4KKyAgICAgICBhYl9tZW0gcG9pbnRzIGp1c3QgcGFzdCBoZWFkZXIuICovCisgICAgYmxvY2sgKmIgPSAoYmxvY2sgKiltYWxsb2Moc2l6ZW9mKGJsb2NrKSArIHNpemUpOworICAgIGlmICghYikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYi0+YWJfc2l6ZSA9IHNpemU7CisgICAgYi0+YWJfbWVtID0gKHZvaWQgKikoYiArIDEpOworICAgIGItPmFiX25leHQgPSBOVUxMOworICAgIGItPmFiX29mZnNldCA9IFJPVU5EVVAoKFB5X3VpbnRwdHJfdCkoYi0+YWJfbWVtKSkgLQorICAgICAgKFB5X3VpbnRwdHJfdCkoYi0+YWJfbWVtKTsKKyAgICByZXR1cm4gYjsKIH0KIAogc3RhdGljIHZvaWQKIGJsb2NrX2ZyZWUoYmxvY2sgKmIpIHsKLQl3aGlsZSAoYikgewotCQlibG9jayAqbmV4dCA9IGItPmFiX25leHQ7Ci0JCWZyZWUoYik7Ci0JCWIgPSBuZXh0OwotCX0KKyAgICB3aGlsZSAoYikgeworICAgICAgICBibG9jayAqbmV4dCA9IGItPmFiX25leHQ7CisgICAgICAgIGZyZWUoYik7CisgICAgICAgIGIgPSBuZXh0OworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgKgogYmxvY2tfYWxsb2MoYmxvY2sgKmIsIHNpemVfdCBzaXplKQogewotCXZvaWQgKnA7Ci0JYXNzZXJ0KGIpOwotCXNpemUgPSBST1VORFVQKHNpemUpOwotCWlmIChiLT5hYl9vZmZzZXQgKyBzaXplID4gYi0+YWJfc2l6ZSkgewotCQkvKiBJZiB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5IHRoYW4gd2lsbCBmaXQgaW4KLQkJICAgdGhlIGRlZmF1bHQgYmxvY2ssIGFsbG9jYXRlIGEgb25lLW9mZiBibG9jayB0aGF0IGlzCi0JCSAgIGV4YWN0bHkgdGhlIHJpZ2h0IHNpemUuICovCi0JCS8qIFRPRE8oamh5bHRvbik6IFRoaW5rIGFib3V0IHNwYWNlIHdhc3RlIGF0IGVuZCBvZiBibG9jayAqLwotCQlibG9jayAqbmV3YmwgPSBibG9ja19uZXcoCi0JCQkJc2l6ZSA8IERFRkFVTFRfQkxPQ0tfU0laRSA/Ci0JCQkJREVGQVVMVF9CTE9DS19TSVpFIDogc2l6ZSk7Ci0JCWlmICghbmV3YmwpCi0JCQlyZXR1cm4gTlVMTDsKLQkJYXNzZXJ0KCFiLT5hYl9uZXh0KTsKLQkJYi0+YWJfbmV4dCA9IG5ld2JsOwotCQliID0gbmV3Ymw7Ci0JfQorICAgIHZvaWQgKnA7CisgICAgYXNzZXJ0KGIpOworICAgIHNpemUgPSBST1VORFVQKHNpemUpOworICAgIGlmIChiLT5hYl9vZmZzZXQgKyBzaXplID4gYi0+YWJfc2l6ZSkgeworICAgICAgICAvKiBJZiB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgbWVtb3J5IHRoYW4gd2lsbCBmaXQgaW4KKyAgICAgICAgICAgdGhlIGRlZmF1bHQgYmxvY2ssIGFsbG9jYXRlIGEgb25lLW9mZiBibG9jayB0aGF0IGlzCisgICAgICAgICAgIGV4YWN0bHkgdGhlIHJpZ2h0IHNpemUuICovCisgICAgICAgIC8qIFRPRE8oamh5bHRvbik6IFRoaW5rIGFib3V0IHNwYWNlIHdhc3RlIGF0IGVuZCBvZiBibG9jayAqLworICAgICAgICBibG9jayAqbmV3YmwgPSBibG9ja19uZXcoCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplIDwgREVGQVVMVF9CTE9DS19TSVpFID8KKyAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQkxPQ0tfU0laRSA6IHNpemUpOworICAgICAgICBpZiAoIW5ld2JsKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGFzc2VydCghYi0+YWJfbmV4dCk7CisgICAgICAgIGItPmFiX25leHQgPSBuZXdibDsKKyAgICAgICAgYiA9IG5ld2JsOworICAgIH0KIAotCWFzc2VydChiLT5hYl9vZmZzZXQgKyBzaXplIDw9IGItPmFiX3NpemUpOwotCXAgPSAodm9pZCAqKSgoKGNoYXIgKiliLT5hYl9tZW0pICsgYi0+YWJfb2Zmc2V0KTsKLQliLT5hYl9vZmZzZXQgKz0gc2l6ZTsKLQlyZXR1cm4gcDsKKyAgICBhc3NlcnQoYi0+YWJfb2Zmc2V0ICsgc2l6ZSA8PSBiLT5hYl9zaXplKTsKKyAgICBwID0gKHZvaWQgKikoKChjaGFyICopYi0+YWJfbWVtKSArIGItPmFiX29mZnNldCk7CisgICAgYi0+YWJfb2Zmc2V0ICs9IHNpemU7CisgICAgcmV0dXJuIHA7CiB9CiAKIFB5QXJlbmEgKgogUHlBcmVuYV9OZXcoKQogewotCVB5QXJlbmEqIGFyZW5hID0gKFB5QXJlbmEgKiltYWxsb2Moc2l6ZW9mKFB5QXJlbmEpKTsKLQlpZiAoIWFyZW5hKQotCQlyZXR1cm4gKFB5QXJlbmEqKVB5RXJyX05vTWVtb3J5KCk7CisgICAgUHlBcmVuYSogYXJlbmEgPSAoUHlBcmVuYSAqKW1hbGxvYyhzaXplb2YoUHlBcmVuYSkpOworICAgIGlmICghYXJlbmEpCisgICAgICAgIHJldHVybiAoUHlBcmVuYSopUHlFcnJfTm9NZW1vcnkoKTsKIAotCWFyZW5hLT5hX2hlYWQgPSBibG9ja19uZXcoREVGQVVMVF9CTE9DS19TSVpFKTsKLQlhcmVuYS0+YV9jdXIgPSBhcmVuYS0+YV9oZWFkOwotICAgICAgICBpZiAoIWFyZW5hLT5hX2hlYWQpIHsKLSAgICAgICAgICAgICAgICBmcmVlKCh2b2lkICopYXJlbmEpOwotICAgICAgICAgICAgICAgIHJldHVybiAoUHlBcmVuYSopUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgfQotICAgICAgICBhcmVuYS0+YV9vYmplY3RzID0gUHlMaXN0X05ldygwKTsKLSAgICAgICAgaWYgKCFhcmVuYS0+YV9vYmplY3RzKSB7Ci0gICAgICAgICAgICAgICAgYmxvY2tfZnJlZShhcmVuYS0+YV9oZWFkKTsKLSAgICAgICAgICAgICAgICBmcmVlKCh2b2lkICopYXJlbmEpOwotICAgICAgICAgICAgICAgIHJldHVybiAoUHlBcmVuYSopUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgfQorICAgIGFyZW5hLT5hX2hlYWQgPSBibG9ja19uZXcoREVGQVVMVF9CTE9DS19TSVpFKTsKKyAgICBhcmVuYS0+YV9jdXIgPSBhcmVuYS0+YV9oZWFkOworICAgIGlmICghYXJlbmEtPmFfaGVhZCkgeworICAgICAgICBmcmVlKCh2b2lkICopYXJlbmEpOworICAgICAgICByZXR1cm4gKFB5QXJlbmEqKVB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorICAgIGFyZW5hLT5hX29iamVjdHMgPSBQeUxpc3RfTmV3KDApOworICAgIGlmICghYXJlbmEtPmFfb2JqZWN0cykgeworICAgICAgICBibG9ja19mcmVlKGFyZW5hLT5hX2hlYWQpOworICAgICAgICBmcmVlKCh2b2lkICopYXJlbmEpOworICAgICAgICByZXR1cm4gKFB5QXJlbmEqKVB5RXJyX05vTWVtb3J5KCk7CisgICAgfQogI2lmIGRlZmluZWQoUHlfREVCVUcpCi0gICAgICAgIGFyZW5hLT50b3RhbF9hbGxvY3MgPSAwOwotICAgICAgICBhcmVuYS0+dG90YWxfc2l6ZSA9IDA7Ci0gICAgICAgIGFyZW5hLT50b3RhbF9ibG9ja3MgPSAxOwotICAgICAgICBhcmVuYS0+dG90YWxfYmxvY2tfc2l6ZSA9IERFRkFVTFRfQkxPQ0tfU0laRTsKLSAgICAgICAgYXJlbmEtPnRvdGFsX2JpZ19ibG9ja3MgPSAwOworICAgIGFyZW5hLT50b3RhbF9hbGxvY3MgPSAwOworICAgIGFyZW5hLT50b3RhbF9zaXplID0gMDsKKyAgICBhcmVuYS0+dG90YWxfYmxvY2tzID0gMTsKKyAgICBhcmVuYS0+dG90YWxfYmxvY2tfc2l6ZSA9IERFRkFVTFRfQkxPQ0tfU0laRTsKKyAgICBhcmVuYS0+dG90YWxfYmlnX2Jsb2NrcyA9IDA7CiAjZW5kaWYKLQlyZXR1cm4gYXJlbmE7CisgICAgcmV0dXJuIGFyZW5hOwogfQogCiB2b2lkCiBQeUFyZW5hX0ZyZWUoUHlBcmVuYSAqYXJlbmEpCiB7Ci0gICAgICAgIGludCByOwotCWFzc2VydChhcmVuYSk7CisgICAgaW50IHI7CisgICAgYXNzZXJ0KGFyZW5hKTsKICNpZiBkZWZpbmVkKFB5X0RFQlVHKQotICAgICAgICAvKgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAiYWxsb2M9JWQgc2l6ZT0lZCBibG9ja3M9JWQgYmxvY2tfc2l6ZT0lZCBiaWc9JWQgb2JqZWN0cz0lZFxuIiwKLSAgICAgICAgICAgICAgICBhcmVuYS0+dG90YWxfYWxsb2NzLCBhcmVuYS0+dG90YWxfc2l6ZSwgYXJlbmEtPnRvdGFsX2Jsb2NrcywKLSAgICAgICAgICAgICAgICBhcmVuYS0+dG90YWxfYmxvY2tfc2l6ZSwgYXJlbmEtPnRvdGFsX2JpZ19ibG9ja3MsCi0gICAgICAgICAgICAgICAgUHlMaXN0X1NpemUoYXJlbmEtPmFfb2JqZWN0cykpOwotICAgICAgICAqLworICAgIC8qCisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICJhbGxvYz0lZCBzaXplPSVkIGJsb2Nrcz0lZCBibG9ja19zaXplPSVkIGJpZz0lZCBvYmplY3RzPSVkXG4iLAorICAgICAgICBhcmVuYS0+dG90YWxfYWxsb2NzLCBhcmVuYS0+dG90YWxfc2l6ZSwgYXJlbmEtPnRvdGFsX2Jsb2NrcywKKyAgICAgICAgYXJlbmEtPnRvdGFsX2Jsb2NrX3NpemUsIGFyZW5hLT50b3RhbF9iaWdfYmxvY2tzLAorICAgICAgICBQeUxpc3RfU2l6ZShhcmVuYS0+YV9vYmplY3RzKSk7CisgICAgKi8KICNlbmRpZgotCWJsb2NrX2ZyZWUoYXJlbmEtPmFfaGVhZCk7Ci0JLyogVGhpcyBwcm9wZXJ0eSBub3JtYWxseSBob2xkcywgZXhjZXB0IHdoZW4gdGhlIGNvZGUgYmVpbmcgY29tcGlsZWQKLQkgICBpcyBzeXMuZ2V0b2JqZWN0cygwKSwgaW4gd2hpY2ggY2FzZSB0aGVyZSB3aWxsIGJlIHR3byByZWZlcmVuY2VzLgotICAgICAgICBhc3NlcnQoYXJlbmEtPmFfb2JqZWN0cy0+b2JfcmVmY250ID09IDEpOwotCSovCisgICAgYmxvY2tfZnJlZShhcmVuYS0+YV9oZWFkKTsKKyAgICAvKiBUaGlzIHByb3BlcnR5IG5vcm1hbGx5IGhvbGRzLCBleGNlcHQgd2hlbiB0aGUgY29kZSBiZWluZyBjb21waWxlZAorICAgICAgIGlzIHN5cy5nZXRvYmplY3RzKDApLCBpbiB3aGljaCBjYXNlIHRoZXJlIHdpbGwgYmUgdHdvIHJlZmVyZW5jZXMuCisgICAgYXNzZXJ0KGFyZW5hLT5hX29iamVjdHMtPm9iX3JlZmNudCA9PSAxKTsKKyAgICAqLwogCi0gICAgICAgIC8qIENsZWFyIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdC4gIFRoaXMgaXMgbmVjZXNzYXJ5Ci0gICAgICAgICAgIHRvIGd1YXJhbnRlZSB0aGF0IHRoZXkgd2lsbCBiZSBERUNSRUZlZC4gKi8KLSAgICAgICAgciA9IFB5TGlzdF9TZXRTbGljZShhcmVuYS0+YV9vYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFB5TGlzdF9HRVRfU0laRShhcmVuYS0+YV9vYmplY3RzKSwgTlVMTCk7Ci0gICAgICAgIGFzc2VydChyID09IDApOwotICAgICAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKGFyZW5hLT5hX29iamVjdHMpID09IDApOwotICAgICAgICBQeV9ERUNSRUYoYXJlbmEtPmFfb2JqZWN0cyk7Ci0JZnJlZShhcmVuYSk7CisgICAgLyogQ2xlYXIgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0LiAgVGhpcyBpcyBuZWNlc3NhcnkKKyAgICAgICB0byBndWFyYW50ZWUgdGhhdCB0aGV5IHdpbGwgYmUgREVDUkVGZWQuICovCisgICAgciA9IFB5TGlzdF9TZXRTbGljZShhcmVuYS0+YV9vYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgUHlMaXN0X0dFVF9TSVpFKGFyZW5hLT5hX29iamVjdHMpLCBOVUxMKTsKKyAgICBhc3NlcnQociA9PSAwKTsKKyAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKGFyZW5hLT5hX29iamVjdHMpID09IDApOworICAgIFB5X0RFQ1JFRihhcmVuYS0+YV9vYmplY3RzKTsKKyAgICBmcmVlKGFyZW5hKTsKIH0KIAogdm9pZCAqCiBQeUFyZW5hX01hbGxvYyhQeUFyZW5hICphcmVuYSwgc2l6ZV90IHNpemUpCiB7Ci0Jdm9pZCAqcCA9IGJsb2NrX2FsbG9jKGFyZW5hLT5hX2N1ciwgc2l6ZSk7Ci0JaWYgKCFwKQotCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB2b2lkICpwID0gYmxvY2tfYWxsb2MoYXJlbmEtPmFfY3VyLCBzaXplKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogI2lmIGRlZmluZWQoUHlfREVCVUcpCi0gICAgICAgIGFyZW5hLT50b3RhbF9hbGxvY3MrKzsKLSAgICAgICAgYXJlbmEtPnRvdGFsX3NpemUgKz0gc2l6ZTsKKyAgICBhcmVuYS0+dG90YWxfYWxsb2NzKys7CisgICAgYXJlbmEtPnRvdGFsX3NpemUgKz0gc2l6ZTsKICNlbmRpZgotCS8qIFJlc2V0IGN1ciBpZiB3ZSBhbGxvY2F0ZWQgYSBuZXcgYmxvY2suICovCi0JaWYgKGFyZW5hLT5hX2N1ci0+YWJfbmV4dCkgewotCQlhcmVuYS0+YV9jdXIgPSBhcmVuYS0+YV9jdXItPmFiX25leHQ7CisgICAgLyogUmVzZXQgY3VyIGlmIHdlIGFsbG9jYXRlZCBhIG5ldyBibG9jay4gKi8KKyAgICBpZiAoYXJlbmEtPmFfY3VyLT5hYl9uZXh0KSB7CisgICAgICAgIGFyZW5hLT5hX2N1ciA9IGFyZW5hLT5hX2N1ci0+YWJfbmV4dDsKICNpZiBkZWZpbmVkKFB5X0RFQlVHKQotICAgICAgICAgICAgICAgIGFyZW5hLT50b3RhbF9ibG9ja3MrKzsKLSAgICAgICAgICAgICAgICBhcmVuYS0+dG90YWxfYmxvY2tfc2l6ZSArPSBhcmVuYS0+YV9jdXItPmFiX3NpemU7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZW5hLT5hX2N1ci0+YWJfc2l6ZSA+IERFRkFVTFRfQkxPQ0tfU0laRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICsrYXJlbmEtPnRvdGFsX2JpZ19ibG9ja3M7CisgICAgICAgIGFyZW5hLT50b3RhbF9ibG9ja3MrKzsKKyAgICAgICAgYXJlbmEtPnRvdGFsX2Jsb2NrX3NpemUgKz0gYXJlbmEtPmFfY3VyLT5hYl9zaXplOworICAgICAgICBpZiAoYXJlbmEtPmFfY3VyLT5hYl9zaXplID4gREVGQVVMVF9CTE9DS19TSVpFKQorICAgICAgICAgICAgKythcmVuYS0+dG90YWxfYmlnX2Jsb2NrczsKICNlbmRpZgotCX0KLQlyZXR1cm4gcDsKKyAgICB9CisgICAgcmV0dXJuIHA7CiB9CiAKIGludAogUHlBcmVuYV9BZGRQeU9iamVjdChQeUFyZW5hICphcmVuYSwgUHlPYmplY3QgKm9iaikKIHsKLSAgICAgICAgaW50IHIgPSBQeUxpc3RfQXBwZW5kKGFyZW5hLT5hX29iamVjdHMsIG9iaik7Ci0gICAgICAgIGlmIChyID49IDApIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcjsKKyAgICBpbnQgciA9IFB5TGlzdF9BcHBlbmQoYXJlbmEtPmFfb2JqZWN0cywgb2JqKTsKKyAgICBpZiAociA+PSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgIH0KKyAgICByZXR1cm4gcjsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weW1hdGguYyBiL1B5dGhvbi9weW1hdGguYwppbmRleCAyNzQ5Njg4Li4xYmEyZTYzIDEwMDY0NAotLS0gYS9QeXRob24vcHltYXRoLmMKKysrIGIvUHl0aG9uL3B5bWF0aC5jCkBAIC03LDMwICs3LDMwIEBACiAgICB0aHVzIHJvdW5kaW5nIGZyb20gZXh0ZW5kZWQgcHJlY2lzaW9uIHRvIGRvdWJsZSBwcmVjaXNpb24uICovCiBkb3VibGUgX1B5X2ZvcmNlX2RvdWJsZShkb3VibGUgeCkKIHsKLQl2b2xhdGlsZSBkb3VibGUgeTsKLQl5ID0geDsKLQlyZXR1cm4geTsKKyAgICB2b2xhdGlsZSBkb3VibGUgeTsKKyAgICB5ID0geDsKKyAgICByZXR1cm4geTsKIH0KICNlbmRpZgogCiAjaWZuZGVmIEhBVkVfSFlQT1QKIGRvdWJsZSBoeXBvdChkb3VibGUgeCwgZG91YmxlIHkpCiB7Ci0JZG91YmxlIHl4OworICAgIGRvdWJsZSB5eDsKIAotCXggPSBmYWJzKHgpOwotCXkgPSBmYWJzKHkpOwotCWlmICh4IDwgeSkgewotCQlkb3VibGUgdGVtcCA9IHg7Ci0JCXggPSB5OwotCQl5ID0gdGVtcDsKLQl9Ci0JaWYgKHggPT0gMC4pCi0JCXJldHVybiAwLjsKLQllbHNlIHsKLQkJeXggPSB5L3g7Ci0JCXJldHVybiB4KnNxcnQoMS4reXgqeXgpOwotCX0KKyAgICB4ID0gZmFicyh4KTsKKyAgICB5ID0gZmFicyh5KTsKKyAgICBpZiAoeCA8IHkpIHsKKyAgICAgICAgZG91YmxlIHRlbXAgPSB4OworICAgICAgICB4ID0geTsKKyAgICAgICAgeSA9IHRlbXA7CisgICAgfQorICAgIGlmICh4ID09IDAuKQorICAgICAgICByZXR1cm4gMC47CisgICAgZWxzZSB7CisgICAgICAgIHl4ID0geS94OworICAgICAgICByZXR1cm4geCpzcXJ0KDEuK3l4Knl4KTsKKyAgICB9CiB9CiAjZW5kaWYgLyogSEFWRV9IWVBPVCAqLwogCkBAIC0zOCwxMiArMzgsMTIgQEAKIGRvdWJsZQogY29weXNpZ24oZG91YmxlIHgsIGRvdWJsZSB5KQogewotCS8qIHVzZSBhdGFuMiB0byBkaXN0aW5ndWlzaCAtMC4gZnJvbSAwLiAqLwotCWlmICh5ID4gMC4gfHwgKHkgPT0gMC4gJiYgYXRhbjIoeSwgLTEuKSA+IDAuKSkgewotCQlyZXR1cm4gZmFicyh4KTsKLQl9IGVsc2UgewotCQlyZXR1cm4gLWZhYnMoeCk7Ci0JfQorICAgIC8qIHVzZSBhdGFuMiB0byBkaXN0aW5ndWlzaCAtMC4gZnJvbSAwLiAqLworICAgIGlmICh5ID4gMC4gfHwgKHkgPT0gMC4gJiYgYXRhbjIoeSwgLTEuKSA+IDAuKSkgeworICAgICAgICByZXR1cm4gZmFicyh4KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLWZhYnMoeCk7CisgICAgfQogfQogI2VuZGlmIC8qIEhBVkVfQ09QWVNJR04gKi8KIApAQCAtNTMsNDEgKzUzLDQxIEBACiBkb3VibGUKIGxvZzFwKGRvdWJsZSB4KQogewotCS8qIEZvciB4IHNtYWxsLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyBhcHByb2FjaC4gIExldCB5IGJlIHRoZSBuZWFyZXN0Ci0JICAgZmxvYXQgdG8gMSt4LCB0aGVuCisgICAgLyogRm9yIHggc21hbGwsIHdlIHVzZSB0aGUgZm9sbG93aW5nIGFwcHJvYWNoLiAgTGV0IHkgYmUgdGhlIG5lYXJlc3QKKyAgICAgICBmbG9hdCB0byAxK3gsIHRoZW4KIAotCSAgICAgMSt4ID0geSAqICgxIC0gKHktMS14KS95KQorICAgICAgICAgMSt4ID0geSAqICgxIC0gKHktMS14KS95KQogCi0JICAgc28gbG9nKDEreCkgPSBsb2coeSkgKyBsb2coMS0oeS0xLXgpL3kpLiAgU2luY2UgKHktMS14KS95IGlzIHRpbnksCi0JICAgdGhlIHNlY29uZCB0ZXJtIGlzIHdlbGwgYXBwcm94aW1hdGVkIGJ5ICh5LTEteCkveS4gIElmIGFicyh4KSA+PQotCSAgIERCTF9FUFNJTE9OLzIgb3IgdGhlIHJvdW5kaW5nLW1vZGUgaXMgc29tZSBmb3JtIG9mIHJvdW5kLXRvLW5lYXJlc3QKLQkgICB0aGVuIHktMS14IHdpbGwgYmUgZXhhY3RseSByZXByZXNlbnRhYmxlLCBhbmQgaXMgY29tcHV0ZWQgZXhhY3RseQotCSAgIGJ5ICh5LTEpLXguCisgICAgICAgc28gbG9nKDEreCkgPSBsb2coeSkgKyBsb2coMS0oeS0xLXgpL3kpLiAgU2luY2UgKHktMS14KS95IGlzIHRpbnksCisgICAgICAgdGhlIHNlY29uZCB0ZXJtIGlzIHdlbGwgYXBwcm94aW1hdGVkIGJ5ICh5LTEteCkveS4gIElmIGFicyh4KSA+PQorICAgICAgIERCTF9FUFNJTE9OLzIgb3IgdGhlIHJvdW5kaW5nLW1vZGUgaXMgc29tZSBmb3JtIG9mIHJvdW5kLXRvLW5lYXJlc3QKKyAgICAgICB0aGVuIHktMS14IHdpbGwgYmUgZXhhY3RseSByZXByZXNlbnRhYmxlLCBhbmQgaXMgY29tcHV0ZWQgZXhhY3RseQorICAgICAgIGJ5ICh5LTEpLXguCiAKLQkgICBJZiBhYnMoeCkgPCBEQkxfRVBTSUxPTi8yIGFuZCB0aGUgcm91bmRpbmcgbW9kZSBpcyBub3Qga25vd24gdG8gYmUKLQkgICByb3VuZC10by1uZWFyZXN0IHRoZW4gdGhpcyBtZXRob2QgaXMgc2xpZ2h0bHkgZGFuZ2Vyb3VzOiAxK3ggY291bGQKLQkgICBiZSByb3VuZGVkIHVwIHRvIDErREJMX0VQU0lMT04gaW5zdGVhZCBvZiBkb3duIHRvIDEsIGFuZCBpbiB0aGF0Ci0JICAgY2FzZSB5LTEteCB3aWxsIG5vdCBiZSBleGFjdGx5IHJlcHJlc2VudGFibGUgYW55IG1vcmUgYW5kIHRoZQotCSAgIHJlc3VsdCBjYW4gYmUgb2ZmIGJ5IG1hbnkgdWxwcy4gIEJ1dCB0aGlzIGlzIGVhc2lseSBmaXhlZDogZm9yIGEKLQkgICBmbG9hdGluZy1wb2ludCBudW1iZXIgfHh8IDwgREJMX0VQU0lMT04vMi4sIHRoZSBjbG9zZXN0Ci0JICAgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHRvIGxvZygxK3gpIGlzIGV4YWN0bHkgeC4KLQkqLworICAgICAgIElmIGFicyh4KSA8IERCTF9FUFNJTE9OLzIgYW5kIHRoZSByb3VuZGluZyBtb2RlIGlzIG5vdCBrbm93biB0byBiZQorICAgICAgIHJvdW5kLXRvLW5lYXJlc3QgdGhlbiB0aGlzIG1ldGhvZCBpcyBzbGlnaHRseSBkYW5nZXJvdXM6IDEreCBjb3VsZAorICAgICAgIGJlIHJvdW5kZWQgdXAgdG8gMStEQkxfRVBTSUxPTiBpbnN0ZWFkIG9mIGRvd24gdG8gMSwgYW5kIGluIHRoYXQKKyAgICAgICBjYXNlIHktMS14IHdpbGwgbm90IGJlIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhbnkgbW9yZSBhbmQgdGhlCisgICAgICAgcmVzdWx0IGNhbiBiZSBvZmYgYnkgbWFueSB1bHBzLiAgQnV0IHRoaXMgaXMgZWFzaWx5IGZpeGVkOiBmb3IgYQorICAgICAgIGZsb2F0aW5nLXBvaW50IG51bWJlciB8eHwgPCBEQkxfRVBTSUxPTi8yLiwgdGhlIGNsb3Nlc3QKKyAgICAgICBmbG9hdGluZy1wb2ludCBudW1iZXIgdG8gbG9nKDEreCkgaXMgZXhhY3RseSB4LgorICAgICovCiAKLQlkb3VibGUgeTsKLQlpZiAoZmFicyh4KSA8IERCTF9FUFNJTE9OLzIuKSB7Ci0JCXJldHVybiB4OwotCX0gZWxzZSBpZiAoLTAuNSA8PSB4ICYmIHggPD0gMS4pIHsKLQkJLyogV0FSTklORzogaXQncyBwb3NzaWJsZSB0aGFuIGFuIG92ZXJlYWdlciBjb21waWxlcgotCQkgICB3aWxsIGluY29ycmVjdGx5IG9wdGltaXplIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzCi0JCSAgIHRvIHRoZSBlcXVpdmFsZW50IG9mICJyZXR1cm4gbG9nKDEuK3gpIi4gSWYgdGhpcwotCQkgICBoYXBwZW5zLCB0aGVuIHJlc3VsdHMgZnJvbSBsb2cxcCB3aWxsIGJlIGluYWNjdXJhdGUKLQkJICAgZm9yIHNtYWxsIHguICovCi0JCXkgPSAxLit4OwotCQlyZXR1cm4gbG9nKHkpLSgoeS0xLikteCkveTsKLQl9IGVsc2UgewotCQkvKiBOYU5zIGFuZCBpbmZpbml0aWVzIHNob3VsZCBlbmQgdXAgaGVyZSAqLwotCQlyZXR1cm4gbG9nKDEuK3gpOwotCX0KKyAgICBkb3VibGUgeTsKKyAgICBpZiAoZmFicyh4KSA8IERCTF9FUFNJTE9OLzIuKSB7CisgICAgICAgIHJldHVybiB4OworICAgIH0gZWxzZSBpZiAoLTAuNSA8PSB4ICYmIHggPD0gMS4pIHsKKyAgICAgICAgLyogV0FSTklORzogaXQncyBwb3NzaWJsZSB0aGFuIGFuIG92ZXJlYWdlciBjb21waWxlcgorICAgICAgICAgICB3aWxsIGluY29ycmVjdGx5IG9wdGltaXplIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzCisgICAgICAgICAgIHRvIHRoZSBlcXVpdmFsZW50IG9mICJyZXR1cm4gbG9nKDEuK3gpIi4gSWYgdGhpcworICAgICAgICAgICBoYXBwZW5zLCB0aGVuIHJlc3VsdHMgZnJvbSBsb2cxcCB3aWxsIGJlIGluYWNjdXJhdGUKKyAgICAgICAgICAgZm9yIHNtYWxsIHguICovCisgICAgICAgIHkgPSAxLit4OworICAgICAgICByZXR1cm4gbG9nKHkpLSgoeS0xLikteCkveTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBOYU5zIGFuZCBpbmZpbml0aWVzIHNob3VsZCBlbmQgdXAgaGVyZSAqLworICAgICAgICByZXR1cm4gbG9nKDEuK3gpOworICAgIH0KIH0KICNlbmRpZiAvKiBIQVZFX0xPRzFQICovCiAKQEAgLTk3LDcgKzk3LDcgQEAKICAqCiAgKiBEZXZlbG9wZWQgYXQgU3VuUHJvLCBhIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gYnVzaW5lc3MuCiAgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCi0gKiBzb2Z0d2FyZSBpcyBmcmVlbHkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSAKKyAqIHNvZnR3YXJlIGlzIGZyZWVseSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlCiAgKiBpcyBwcmVzZXJ2ZWQuCiAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKi8KQEAgLTEwOSw1MSArMTA5LDUxIEBACiAKIC8qIGFzaW5oKHgpCiAgKiBNZXRob2QgOgotICoJQmFzZWQgb24gCi0gKgkJYXNpbmgoeCkgPSBzaWduKHgpICogbG9nIFsgfHh8ICsgc3FydCh4KngrMSkgXQotICoJd2UgaGF2ZQotICoJYXNpbmgoeCkgOj0geCAgaWYgIDEreCp4PTEsCi0gKgkJIDo9IHNpZ24oeCkqKGxvZyh4KStsbjIpKSBmb3IgbGFyZ2UgfHh8LCBlbHNlCi0gKgkJIDo9IHNpZ24oeCkqbG9nKDJ8eHwrMS8ofHh8K3NxcnQoeCp4KzEpKSkgaWZ8eHw+MiwgZWxzZQotICoJCSA6PSBzaWduKHgpKmxvZzFwKHx4fCArIHheMi8oMSArIHNxcnQoMSt4XjIpKSkgIAorICogICAgICBCYXNlZCBvbgorICogICAgICAgICAgICAgIGFzaW5oKHgpID0gc2lnbih4KSAqIGxvZyBbIHx4fCArIHNxcnQoeCp4KzEpIF0KKyAqICAgICAgd2UgaGF2ZQorICogICAgICBhc2luaCh4KSA6PSB4ICBpZiAgMSt4Kng9MSwKKyAqICAgICAgICAgICAgICAgOj0gc2lnbih4KSoobG9nKHgpK2xuMikpIGZvciBsYXJnZSB8eHwsIGVsc2UKKyAqICAgICAgICAgICAgICAgOj0gc2lnbih4KSpsb2coMnx4fCsxLyh8eHwrc3FydCh4KngrMSkpKSBpZnx4fD4yLCBlbHNlCisgKiAgICAgICAgICAgICAgIDo9IHNpZ24oeCkqbG9nMXAofHh8ICsgeF4yLygxICsgc3FydCgxK3heMikpKQogICovCiAKICNpZm5kZWYgSEFWRV9BU0lOSAogZG91YmxlCiBhc2luaChkb3VibGUgeCkKLXsJCi0JZG91YmxlIHc7Ci0JZG91YmxlIGFic3ggPSBmYWJzKHgpOworeworICAgIGRvdWJsZSB3OworICAgIGRvdWJsZSBhYnN4ID0gZmFicyh4KTsKIAotCWlmIChQeV9JU19OQU4oeCkgfHwgUHlfSVNfSU5GSU5JVFkoeCkpIHsKLQkJcmV0dXJuIHgreDsKLQl9Ci0JaWYgKGFic3ggPCB0d29fcG93X20yOCkgewkvKiB8eHwgPCAyKiotMjggKi8KLQkJcmV0dXJuIHg7CS8qIHJldHVybiB4IGluZXhhY3QgZXhjZXB0IDAgKi8KLQl9IAotCWlmIChhYnN4ID4gdHdvX3Bvd19wMjgpIHsJLyogfHh8ID4gMioqMjggKi8KLQkJdyA9IGxvZyhhYnN4KStsbjI7Ci0JfQotCWVsc2UgaWYgKGFic3ggPiAyLjApIHsJCS8qIDIgPCB8eHwgPCAyKioyOCAqLwotCQl3ID0gbG9nKDIuMCphYnN4ICsgMS4wIC8gKHNxcnQoeCp4ICsgMS4wKSArIGFic3gpKTsKLQl9Ci0JZWxzZSB7CQkJCS8qIDIqKi0yOCA8PSB8eHwgPCAyPSAqLwotCQlkb3VibGUgdCA9IHgqeDsKLQkJdyA9IGxvZzFwKGFic3ggKyB0IC8gKDEuMCArIHNxcnQoMS4wICsgdCkpKTsKLQl9Ci0JcmV0dXJuIGNvcHlzaWduKHcsIHgpOwotCQorICAgIGlmIChQeV9JU19OQU4oeCkgfHwgUHlfSVNfSU5GSU5JVFkoeCkpIHsKKyAgICAgICAgcmV0dXJuIHgreDsKKyAgICB9CisgICAgaWYgKGFic3ggPCB0d29fcG93X20yOCkgeyAgICAgICAgICAgLyogfHh8IDwgMioqLTI4ICovCisgICAgICAgIHJldHVybiB4OyAgICAgICAgICAgICAgIC8qIHJldHVybiB4IGluZXhhY3QgZXhjZXB0IDAgKi8KKyAgICB9CisgICAgaWYgKGFic3ggPiB0d29fcG93X3AyOCkgeyAgICAgICAgICAgLyogfHh8ID4gMioqMjggKi8KKyAgICAgICAgdyA9IGxvZyhhYnN4KStsbjI7CisgICAgfQorICAgIGVsc2UgaWYgKGFic3ggPiAyLjApIHsgICAgICAgICAgICAgIC8qIDIgPCB8eHwgPCAyKioyOCAqLworICAgICAgICB3ID0gbG9nKDIuMCphYnN4ICsgMS4wIC8gKHNxcnQoeCp4ICsgMS4wKSArIGFic3gpKTsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMioqLTI4IDw9IHx4fCA8IDI9ICovCisgICAgICAgIGRvdWJsZSB0ID0geCp4OworICAgICAgICB3ID0gbG9nMXAoYWJzeCArIHQgLyAoMS4wICsgc3FydCgxLjAgKyB0KSkpOworICAgIH0KKyAgICByZXR1cm4gY29weXNpZ24odywgeCk7CisKIH0KICNlbmRpZiAvKiBIQVZFX0FTSU5IICovCiAKIC8qIGFjb3NoKHgpCiAgKiBNZXRob2QgOgogICogICAgICBCYXNlZCBvbgotICoJICAgICAgYWNvc2goeCkgPSBsb2cgWyB4ICsgc3FydCh4KngtMSkgXQorICogICAgICAgICAgICBhY29zaCh4KSA9IGxvZyBbIHggKyBzcXJ0KHgqeC0xKSBdCiAgKiAgICAgIHdlIGhhdmUKLSAqCSAgICAgIGFjb3NoKHgpIDo9IGxvZyh4KStsbjIsIGlmIHggaXMgbGFyZ2U7IGVsc2UKLSAqCSAgICAgIGFjb3NoKHgpIDo9IGxvZygyeC0xLyhzcXJ0KHgqeC0xKSt4KSkgaWYgeD4yOyBlbHNlCi0gKgkgICAgICBhY29zaCh4KSA6PSBsb2cxcCh0K3NxcnQoMi4wKnQrdCp0KSk7IHdoZXJlIHQ9eC0xLgorICogICAgICAgICAgICBhY29zaCh4KSA6PSBsb2coeCkrbG4yLCBpZiB4IGlzIGxhcmdlOyBlbHNlCisgKiAgICAgICAgICAgIGFjb3NoKHgpIDo9IGxvZygyeC0xLyhzcXJ0KHgqeC0xKSt4KSkgaWYgeD4yOyBlbHNlCisgKiAgICAgICAgICAgIGFjb3NoKHgpIDo9IGxvZzFwKHQrc3FydCgyLjAqdCt0KnQpKTsgd2hlcmUgdD14LTEuCiAgKgogICogU3BlY2lhbCBjYXNlczoKICAqICAgICAgYWNvc2goeCkgaXMgTmFOIHdpdGggc2lnbmFsIGlmIHg8MS4KQEAgLTE2NCwzNSArMTY0LDM1IEBACiBkb3VibGUKIGFjb3NoKGRvdWJsZSB4KQogewotCWlmIChQeV9JU19OQU4oeCkpIHsKLQkJcmV0dXJuIHgreDsKLQl9Ci0JaWYgKHggPCAxLikgewkJCS8qIHggPCAxOyAgcmV0dXJuIGEgc2lnbmFsaW5nIE5hTiAqLwotCQllcnJubyA9IEVET007CisgICAgaWYgKFB5X0lTX05BTih4KSkgeworICAgICAgICByZXR1cm4geCt4OworICAgIH0KKyAgICBpZiAoeCA8IDEuKSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiB4IDwgMTsgIHJldHVybiBhIHNpZ25hbGluZyBOYU4gKi8KKyAgICAgICAgZXJybm8gPSBFRE9NOwogI2lmZGVmIFB5X05BTgotCQlyZXR1cm4gUHlfTkFOOworICAgICAgICByZXR1cm4gUHlfTkFOOwogI2Vsc2UKLQkJcmV0dXJuICh4LXgpLyh4LXgpOworICAgICAgICByZXR1cm4gKHgteCkvKHgteCk7CiAjZW5kaWYKLQl9Ci0JZWxzZSBpZiAoeCA+PSB0d29fcG93X3AyOCkgewkvKiB4ID4gMioqMjggKi8KLQkJaWYgKFB5X0lTX0lORklOSVRZKHgpKSB7Ci0JCQlyZXR1cm4geCt4OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGxvZyh4KStsbjI7CS8qIGFjb3NoKGh1Z2UpPWxvZygyeCkgKi8KLQkJfQotCX0KLQllbHNlIGlmICh4ID09IDEuKSB7Ci0JCXJldHVybiAwLjA7CQkJLyogYWNvc2goMSkgPSAwICovCi0JfQotCWVsc2UgaWYgKHggPiAyLikgewkJCS8qIDIgPCB4IDwgMioqMjggKi8KLQkJZG91YmxlIHQgPSB4Kng7Ci0JCXJldHVybiBsb2coMi4wKnggLSAxLjAgLyAoeCArIHNxcnQodCAtIDEuMCkpKTsKLQl9Ci0JZWxzZSB7CQkJCS8qIDEgPCB4IDw9IDIgKi8KLQkJZG91YmxlIHQgPSB4IC0gMS4wOwotCQlyZXR1cm4gbG9nMXAodCArIHNxcnQoMi4wKnQgKyB0KnQpKTsKLQl9CisgICAgfQorICAgIGVsc2UgaWYgKHggPj0gdHdvX3Bvd19wMjgpIHsgICAgICAgIC8qIHggPiAyKioyOCAqLworICAgICAgICBpZiAoUHlfSVNfSU5GSU5JVFkoeCkpIHsKKyAgICAgICAgICAgIHJldHVybiB4K3g7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbG9nKHgpK2xuMjsgICAgICAgICAgICAgICAgICAvKiBhY29zaChodWdlKT1sb2coMngpICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoeCA9PSAxLikgeworICAgICAgICByZXR1cm4gMC4wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWNvc2goMSkgPSAwICovCisgICAgfQorICAgIGVsc2UgaWYgKHggPiAyLikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiA8IHggPCAyKioyOCAqLworICAgICAgICBkb3VibGUgdCA9IHgqeDsKKyAgICAgICAgcmV0dXJuIGxvZygyLjAqeCAtIDEuMCAvICh4ICsgc3FydCh0IC0gMS4wKSkpOworICAgIH0KKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxIDwgeCA8PSAyICovCisgICAgICAgIGRvdWJsZSB0ID0geCAtIDEuMDsKKyAgICAgICAgcmV0dXJuIGxvZzFwKHQgKyBzcXJ0KDIuMCp0ICsgdCp0KSk7CisgICAgfQogfQogI2VuZGlmIC8qIEhBVkVfQUNPU0ggKi8KIApAQCAtMjAwLDkgKzIwMCw5IEBACiAgKiBNZXRob2QgOgogICogICAgMS5SZWR1Y2VkIHggdG8gcG9zaXRpdmUgYnkgYXRhbmgoLXgpID0gLWF0YW5oKHgpCiAgKiAgICAyLkZvciB4Pj0wLjUKLSAqCQkgIDEJICAgICAgMngJCQkgIHgKKyAqICAgICAgICAgICAgICAgIDEgICAgICAgICAgIDJ4ICAgICAgICAgICAgICAgICAgICAgICAgICB4CiAgKiAgICAgIGF0YW5oKHgpID0gLS0tICogbG9nKDEgKyAtLS0tLS0tKSA9IDAuNSAqIGxvZzFwKDIgKiAtLS0tLS0tLSkKLSAqCQkgIDIJICAgICAxIC0geAkJICAgICAgMSAtIHgKKyAqICAgICAgICAgICAgICAgIDIgICAgICAgICAgMSAtIHggICAgICAgICAgICAgICAgICAgIDEgLSB4CiAgKgogICogICAgICBGb3IgeDwwLjUKICAqICAgICAgYXRhbmgoeCkgPSAwLjUqbG9nMXAoMngrMngqeC8oMS14KSkKQEAgLTIxNywzMSArMjE3LDMxIEBACiBkb3VibGUKIGF0YW5oKGRvdWJsZSB4KQogewotCWRvdWJsZSBhYnN4OwotCWRvdWJsZSB0OworICAgIGRvdWJsZSBhYnN4OworICAgIGRvdWJsZSB0OwogCi0JaWYgKFB5X0lTX05BTih4KSkgewotCQlyZXR1cm4geCt4OwotCX0KLQlhYnN4ID0gZmFicyh4KTsKLQlpZiAoYWJzeCA+PSAxLikgewkJLyogfHh8ID49IDEgKi8KLQkJZXJybm8gPSBFRE9NOworICAgIGlmIChQeV9JU19OQU4oeCkpIHsKKyAgICAgICAgcmV0dXJuIHgreDsKKyAgICB9CisgICAgYWJzeCA9IGZhYnMoeCk7CisgICAgaWYgKGFic3ggPj0gMS4pIHsgICAgICAgICAgICAgICAgICAgLyogfHh8ID49IDEgKi8KKyAgICAgICAgZXJybm8gPSBFRE9NOwogI2lmZGVmIFB5X05BTgotCQlyZXR1cm4gUHlfTkFOOworICAgICAgICByZXR1cm4gUHlfTkFOOwogI2Vsc2UKLQkJcmV0dXJuIHgvemVybzsKKyAgICAgICAgcmV0dXJuIHgvemVybzsKICNlbmRpZgotCX0KLQlpZiAoYWJzeCA8IHR3b19wb3dfbTI4KSB7CS8qIHx4fCA8IDIqKi0yOCAqLwotCQlyZXR1cm4geDsKLQl9Ci0JaWYgKGFic3ggPCAwLjUpIHsJCS8qIHx4fCA8IDAuNSAqLwotCQl0ID0gYWJzeCthYnN4OwotCQl0ID0gMC41ICogbG9nMXAodCArIHQqYWJzeCAvICgxLjAgLSBhYnN4KSk7Ci0JfSAKLQllbHNlIHsJCQkJLyogMC41IDw9IHx4fCA8PSAxLjAgKi8KLQkJdCA9IDAuNSAqIGxvZzFwKChhYnN4ICsgYWJzeCkgLyAoMS4wIC0gYWJzeCkpOwotCX0KLQlyZXR1cm4gY29weXNpZ24odCwgeCk7CisgICAgfQorICAgIGlmIChhYnN4IDwgdHdvX3Bvd19tMjgpIHsgICAgICAgICAgIC8qIHx4fCA8IDIqKi0yOCAqLworICAgICAgICByZXR1cm4geDsKKyAgICB9CisgICAgaWYgKGFic3ggPCAwLjUpIHsgICAgICAgICAgICAgICAgICAgLyogfHh8IDwgMC41ICovCisgICAgICAgIHQgPSBhYnN4K2Fic3g7CisgICAgICAgIHQgPSAwLjUgKiBsb2cxcCh0ICsgdCphYnN4IC8gKDEuMCAtIGFic3gpKTsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMC41IDw9IHx4fCA8PSAxLjAgKi8KKyAgICAgICAgdCA9IDAuNSAqIGxvZzFwKChhYnN4ICsgYWJzeCkgLyAoMS4wIC0gYWJzeCkpOworICAgIH0KKyAgICByZXR1cm4gY29weXNpZ24odCwgeCk7CiB9CiAjZW5kaWYgLyogSEFWRV9BVEFOSCAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RhdGUuYyBiL1B5dGhvbi9weXN0YXRlLmMKaW5kZXggMzQzYTk3Yi4uNWFmYzAxYSAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RhdGUuYworKysgYi9QeXRob24vcHlzdGF0ZS5jCkBAIC01OCw5MiArNTgsOTIgQEAKIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqCiBQeUludGVycHJldGVyU3RhdGVfTmV3KHZvaWQpCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSAoUHlJbnRlcnByZXRlclN0YXRlICopCi0JCQkJICAgICBtYWxsb2Moc2l6ZW9mKFB5SW50ZXJwcmV0ZXJTdGF0ZSkpOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHNpemVvZihQeUludGVycHJldGVyU3RhdGUpKTsKIAotCWlmIChpbnRlcnAgIT0gTlVMTCkgewotCQlIRUFEX0lOSVQoKTsKKyAgICBpZiAoaW50ZXJwICE9IE5VTEwpIHsKKyAgICAgICAgSEVBRF9JTklUKCk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQkJaWYgKGhlYWRfbXV0ZXggPT0gTlVMTCkKLQkJCVB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdGhyZWFkcyBmb3IgaW50ZXJwcmV0ZXIiKTsKKyAgICAgICAgaWYgKGhlYWRfbXV0ZXggPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbid0IGluaXRpYWxpemUgdGhyZWFkcyBmb3IgaW50ZXJwcmV0ZXIiKTsKICNlbmRpZgotCQlpbnRlcnAtPm1vZHVsZXMgPSBOVUxMOwotCQlpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nID0gTlVMTDsKLQkJaW50ZXJwLT5zeXNkaWN0ID0gTlVMTDsKLQkJaW50ZXJwLT5idWlsdGlucyA9IE5VTEw7Ci0JCWludGVycC0+dHN0YXRlX2hlYWQgPSBOVUxMOwotCQlpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoID0gTlVMTDsKLQkJaW50ZXJwLT5jb2RlY19zZWFyY2hfY2FjaGUgPSBOVUxMOwotCQlpbnRlcnAtPmNvZGVjX2Vycm9yX3JlZ2lzdHJ5ID0gTlVMTDsKKyAgICAgICAgaW50ZXJwLT5tb2R1bGVzID0gTlVMTDsKKyAgICAgICAgaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyA9IE5VTEw7CisgICAgICAgIGludGVycC0+c3lzZGljdCA9IE5VTEw7CisgICAgICAgIGludGVycC0+YnVpbHRpbnMgPSBOVUxMOworICAgICAgICBpbnRlcnAtPnRzdGF0ZV9oZWFkID0gTlVMTDsKKyAgICAgICAgaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCA9IE5VTEw7CisgICAgICAgIGludGVycC0+Y29kZWNfc2VhcmNoX2NhY2hlID0gTlVMTDsKKyAgICAgICAgaW50ZXJwLT5jb2RlY19lcnJvcl9yZWdpc3RyeSA9IE5VTEw7CiAjaWZkZWYgSEFWRV9ETE9QRU4KICNpZmRlZiBSVExEX05PVwotICAgICAgICAgICAgICAgIGludGVycC0+ZGxvcGVuZmxhZ3MgPSBSVExEX05PVzsKKyAgICAgICAgaW50ZXJwLT5kbG9wZW5mbGFncyA9IFJUTERfTk9XOwogI2Vsc2UKLQkJaW50ZXJwLT5kbG9wZW5mbGFncyA9IFJUTERfTEFaWTsKKyAgICAgICAgaW50ZXJwLT5kbG9wZW5mbGFncyA9IFJUTERfTEFaWTsKICNlbmRpZgogI2VuZGlmCiAjaWZkZWYgV0lUSF9UU0MKLQkJaW50ZXJwLT50c2NkdW1wID0gMDsKKyAgICAgICAgaW50ZXJwLT50c2NkdW1wID0gMDsKICNlbmRpZgogCi0JCUhFQURfTE9DSygpOwotCQlpbnRlcnAtPm5leHQgPSBpbnRlcnBfaGVhZDsKLQkJaW50ZXJwX2hlYWQgPSBpbnRlcnA7Ci0JCUhFQURfVU5MT0NLKCk7Ci0JfQorICAgICAgICBIRUFEX0xPQ0soKTsKKyAgICAgICAgaW50ZXJwLT5uZXh0ID0gaW50ZXJwX2hlYWQ7CisgICAgICAgIGludGVycF9oZWFkID0gaW50ZXJwOworICAgICAgICBIRUFEX1VOTE9DSygpOworICAgIH0KIAotCXJldHVybiBpbnRlcnA7CisgICAgcmV0dXJuIGludGVycDsKIH0KIAogCiB2b2lkCiBQeUludGVycHJldGVyU3RhdGVfQ2xlYXIoUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnApCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqcDsKLQlIRUFEX0xPQ0soKTsKLQlmb3IgKHAgPSBpbnRlcnAtPnRzdGF0ZV9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQlQeVRocmVhZFN0YXRlX0NsZWFyKHApOwotCUhFQURfVU5MT0NLKCk7Ci0JUHlfQ0xFQVIoaW50ZXJwLT5jb2RlY19zZWFyY2hfcGF0aCk7Ci0JUHlfQ0xFQVIoaW50ZXJwLT5jb2RlY19zZWFyY2hfY2FjaGUpOwotCVB5X0NMRUFSKGludGVycC0+Y29kZWNfZXJyb3JfcmVnaXN0cnkpOwotCVB5X0NMRUFSKGludGVycC0+bW9kdWxlcyk7Ci0JUHlfQ0xFQVIoaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyk7Ci0JUHlfQ0xFQVIoaW50ZXJwLT5zeXNkaWN0KTsKLQlQeV9DTEVBUihpbnRlcnAtPmJ1aWx0aW5zKTsKKyAgICBQeVRocmVhZFN0YXRlICpwOworICAgIEhFQURfTE9DSygpOworICAgIGZvciAocCA9IGludGVycC0+dHN0YXRlX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCisgICAgICAgIFB5VGhyZWFkU3RhdGVfQ2xlYXIocCk7CisgICAgSEVBRF9VTkxPQ0soKTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPmNvZGVjX3NlYXJjaF9wYXRoKTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPmNvZGVjX3NlYXJjaF9jYWNoZSk7CisgICAgUHlfQ0xFQVIoaW50ZXJwLT5jb2RlY19lcnJvcl9yZWdpc3RyeSk7CisgICAgUHlfQ0xFQVIoaW50ZXJwLT5tb2R1bGVzKTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nKTsKKyAgICBQeV9DTEVBUihpbnRlcnAtPnN5c2RpY3QpOworICAgIFB5X0NMRUFSKGludGVycC0+YnVpbHRpbnMpOwogfQogCiAKIHN0YXRpYyB2b2lkCiB6YXB0aHJlYWRzKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKQogewotCVB5VGhyZWFkU3RhdGUgKnA7Ci0JLyogTm8gbmVlZCB0byBsb2NrIHRoZSBtdXRleCBoZXJlIGJlY2F1c2UgdGhpcyBzaG91bGQgb25seSBoYXBwZW4KLQkgICB3aGVuIHRoZSB0aHJlYWRzIGFyZSBhbGwgcmVhbGx5IGRlYWQgKFhYWCBmYW1vdXMgbGFzdCB3b3JkcykuICovCi0Jd2hpbGUgKChwID0gaW50ZXJwLT50c3RhdGVfaGVhZCkgIT0gTlVMTCkgewotCQlQeVRocmVhZFN0YXRlX0RlbGV0ZShwKTsKLQl9CisgICAgUHlUaHJlYWRTdGF0ZSAqcDsKKyAgICAvKiBObyBuZWVkIHRvIGxvY2sgdGhlIG11dGV4IGhlcmUgYmVjYXVzZSB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbgorICAgICAgIHdoZW4gdGhlIHRocmVhZHMgYXJlIGFsbCByZWFsbHkgZGVhZCAoWFhYIGZhbW91cyBsYXN0IHdvcmRzKS4gKi8KKyAgICB3aGlsZSAoKHAgPSBpbnRlcnAtPnRzdGF0ZV9oZWFkKSAhPSBOVUxMKSB7CisgICAgICAgIFB5VGhyZWFkU3RhdGVfRGVsZXRlKHApOworICAgIH0KIH0KIAogCiB2b2lkCiBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqKnA7Ci0JemFwdGhyZWFkcyhpbnRlcnApOwotCUhFQURfTE9DSygpOwotCWZvciAocCA9ICZpbnRlcnBfaGVhZDsgOyBwID0gJigqcCktPm5leHQpIHsKLQkJaWYgKCpwID09IE5VTEwpCi0JCQlQeV9GYXRhbEVycm9yKAotCQkJCSJQeUludGVycHJldGVyU3RhdGVfRGVsZXRlOiBpbnZhbGlkIGludGVycCIpOwotCQlpZiAoKnAgPT0gaW50ZXJwKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpbnRlcnAtPnRzdGF0ZV9oZWFkICE9IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGU6IHJlbWFpbmluZyB0aHJlYWRzIik7Ci0JKnAgPSBpbnRlcnAtPm5leHQ7Ci0JSEVBRF9VTkxPQ0soKTsKLQlmcmVlKGludGVycCk7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICoqcDsKKyAgICB6YXB0aHJlYWRzKGludGVycCk7CisgICAgSEVBRF9MT0NLKCk7CisgICAgZm9yIChwID0gJmludGVycF9oZWFkOyA7IHAgPSAmKCpwKS0+bmV4dCkgeworICAgICAgICBpZiAoKnAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgIlB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGU6IGludmFsaWQgaW50ZXJwIik7CisgICAgICAgIGlmICgqcCA9PSBpbnRlcnApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGludGVycC0+dHN0YXRlX2hlYWQgIT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZTogcmVtYWluaW5nIHRocmVhZHMiKTsKKyAgICAqcCA9IGludGVycC0+bmV4dDsKKyAgICBIRUFEX1VOTE9DSygpOworICAgIGZyZWUoaW50ZXJwKTsKIH0KIAogCkBAIC0xNTEsMTA0ICsxNTEsMTA0IEBACiBzdGF0aWMgc3RydWN0IF9mcmFtZSAqCiB0aHJlYWRzdGF0ZV9nZXRmcmFtZShQeVRocmVhZFN0YXRlICpzZWxmKQogewotCXJldHVybiBzZWxmLT5mcmFtZTsKKyAgICByZXR1cm4gc2VsZi0+ZnJhbWU7CiB9CiAKIHN0YXRpYyBQeVRocmVhZFN0YXRlICoKIG5ld190aHJlYWRzdGF0ZShQeUludGVycHJldGVyU3RhdGUgKmludGVycCwgaW50IGluaXQpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gKFB5VGhyZWFkU3RhdGUgKiltYWxsb2Moc2l6ZW9mKFB5VGhyZWFkU3RhdGUpKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSAoUHlUaHJlYWRTdGF0ZSAqKW1hbGxvYyhzaXplb2YoUHlUaHJlYWRTdGF0ZSkpOwogCi0JaWYgKF9QeVRocmVhZFN0YXRlX0dldEZyYW1lID09IE5VTEwpCi0JCV9QeVRocmVhZFN0YXRlX0dldEZyYW1lID0gdGhyZWFkc3RhdGVfZ2V0ZnJhbWU7CisgICAgaWYgKF9QeVRocmVhZFN0YXRlX0dldEZyYW1lID09IE5VTEwpCisgICAgICAgIF9QeVRocmVhZFN0YXRlX0dldEZyYW1lID0gdGhyZWFkc3RhdGVfZ2V0ZnJhbWU7CiAKLQlpZiAodHN0YXRlICE9IE5VTEwpIHsKLQkJdHN0YXRlLT5pbnRlcnAgPSBpbnRlcnA7CisgICAgaWYgKHRzdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgIHRzdGF0ZS0+aW50ZXJwID0gaW50ZXJwOwogCi0JCXRzdGF0ZS0+ZnJhbWUgPSBOVUxMOwotCQl0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aCA9IDA7Ci0JCXRzdGF0ZS0+dHJhY2luZyA9IDA7Ci0JCXRzdGF0ZS0+dXNlX3RyYWNpbmcgPSAwOwotCQl0c3RhdGUtPnRpY2tfY291bnRlciA9IDA7Ci0JCXRzdGF0ZS0+Z2lsc3RhdGVfY291bnRlciA9IDA7Ci0JCXRzdGF0ZS0+YXN5bmNfZXhjID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5mcmFtZSA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoID0gMDsKKyAgICAgICAgdHN0YXRlLT50cmFjaW5nID0gMDsKKyAgICAgICAgdHN0YXRlLT51c2VfdHJhY2luZyA9IDA7CisgICAgICAgIHRzdGF0ZS0+dGlja19jb3VudGVyID0gMDsKKyAgICAgICAgdHN0YXRlLT5naWxzdGF0ZV9jb3VudGVyID0gMDsKKyAgICAgICAgdHN0YXRlLT5hc3luY19leGMgPSBOVUxMOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JCXRzdGF0ZS0+dGhyZWFkX2lkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgICAgICB0c3RhdGUtPnRocmVhZF9pZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKICNlbHNlCi0JCXRzdGF0ZS0+dGhyZWFkX2lkID0gMDsKKyAgICAgICAgdHN0YXRlLT50aHJlYWRfaWQgPSAwOwogI2VuZGlmCiAKLQkJdHN0YXRlLT5kaWN0ID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5kaWN0ID0gTlVMTDsKIAotCQl0c3RhdGUtPmN1cmV4Y190eXBlID0gTlVMTDsKLQkJdHN0YXRlLT5jdXJleGNfdmFsdWUgPSBOVUxMOwotCQl0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSBOVUxMOworICAgICAgICB0c3RhdGUtPmN1cmV4Y190eXBlID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5jdXJleGNfdmFsdWUgPSBOVUxMOworICAgICAgICB0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2sgPSBOVUxMOwogCi0JCXRzdGF0ZS0+ZXhjX3R5cGUgPSBOVUxMOwotCQl0c3RhdGUtPmV4Y192YWx1ZSA9IE5VTEw7Ci0JCXRzdGF0ZS0+ZXhjX3RyYWNlYmFjayA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+ZXhjX3R5cGUgPSBOVUxMOworICAgICAgICB0c3RhdGUtPmV4Y192YWx1ZSA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayA9IE5VTEw7CiAKLQkJdHN0YXRlLT5jX3Byb2ZpbGVmdW5jID0gTlVMTDsKLQkJdHN0YXRlLT5jX3RyYWNlZnVuYyA9IE5VTEw7Ci0JCXRzdGF0ZS0+Y19wcm9maWxlb2JqID0gTlVMTDsKLQkJdHN0YXRlLT5jX3RyYWNlb2JqID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5jX3Byb2ZpbGVmdW5jID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5jX3RyYWNlZnVuYyA9IE5VTEw7CisgICAgICAgIHRzdGF0ZS0+Y19wcm9maWxlb2JqID0gTlVMTDsKKyAgICAgICAgdHN0YXRlLT5jX3RyYWNlb2JqID0gTlVMTDsKIAotCQlpZiAoaW5pdCkKLQkJCV9QeVRocmVhZFN0YXRlX0luaXQodHN0YXRlKTsKKyAgICAgICAgaWYgKGluaXQpCisgICAgICAgICAgICBfUHlUaHJlYWRTdGF0ZV9Jbml0KHRzdGF0ZSk7CiAKLQkJSEVBRF9MT0NLKCk7Ci0JCXRzdGF0ZS0+bmV4dCA9IGludGVycC0+dHN0YXRlX2hlYWQ7Ci0JCWludGVycC0+dHN0YXRlX2hlYWQgPSB0c3RhdGU7Ci0JCUhFQURfVU5MT0NLKCk7Ci0JfQorICAgICAgICBIRUFEX0xPQ0soKTsKKyAgICAgICAgdHN0YXRlLT5uZXh0ID0gaW50ZXJwLT50c3RhdGVfaGVhZDsKKyAgICAgICAgaW50ZXJwLT50c3RhdGVfaGVhZCA9IHRzdGF0ZTsKKyAgICAgICAgSEVBRF9VTkxPQ0soKTsKKyAgICB9CiAKLQlyZXR1cm4gdHN0YXRlOworICAgIHJldHVybiB0c3RhdGU7CiB9CiAKIFB5VGhyZWFkU3RhdGUgKgogUHlUaHJlYWRTdGF0ZV9OZXcoUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnApCiB7Ci0JcmV0dXJuIG5ld190aHJlYWRzdGF0ZShpbnRlcnAsIDEpOworICAgIHJldHVybiBuZXdfdGhyZWFkc3RhdGUoaW50ZXJwLCAxKTsKIH0KIAogUHlUaHJlYWRTdGF0ZSAqCiBfUHlUaHJlYWRTdGF0ZV9QcmVhbGxvYyhQeUludGVycHJldGVyU3RhdGUgKmludGVycCkKIHsKLQlyZXR1cm4gbmV3X3RocmVhZHN0YXRlKGludGVycCwgMCk7CisgICAgcmV0dXJuIG5ld190aHJlYWRzdGF0ZShpbnRlcnAsIDApOwogfQogCiB2b2lkCiBfUHlUaHJlYWRTdGF0ZV9Jbml0KFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIHsKICNpZmRlZiBXSVRIX1RIUkVBRAotCV9QeUdJTFN0YXRlX05vdGVUaHJlYWRTdGF0ZSh0c3RhdGUpOworICAgIF9QeUdJTFN0YXRlX05vdGVUaHJlYWRTdGF0ZSh0c3RhdGUpOwogI2VuZGlmCiB9CiAKIHZvaWQKIFB5VGhyZWFkU3RhdGVfQ2xlYXIoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCWlmIChQeV9WZXJib3NlRmxhZyAmJiB0c3RhdGUtPmZyYW1lICE9IE5VTEwpCi0JCWZwcmludGYoc3RkZXJyLAotCQkgICJQeVRocmVhZFN0YXRlX0NsZWFyOiB3YXJuaW5nOiB0aHJlYWQgc3RpbGwgaGFzIGEgZnJhbWVcbiIpOworICAgIGlmIChQeV9WZXJib3NlRmxhZyAmJiB0c3RhdGUtPmZyYW1lICE9IE5VTEwpCisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICJQeVRocmVhZFN0YXRlX0NsZWFyOiB3YXJuaW5nOiB0aHJlYWQgc3RpbGwgaGFzIGEgZnJhbWVcbiIpOwogCi0JUHlfQ0xFQVIodHN0YXRlLT5mcmFtZSk7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5mcmFtZSk7CiAKLQlQeV9DTEVBUih0c3RhdGUtPmRpY3QpOwotCVB5X0NMRUFSKHRzdGF0ZS0+YXN5bmNfZXhjKTsKKyAgICBQeV9DTEVBUih0c3RhdGUtPmRpY3QpOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+YXN5bmNfZXhjKTsKIAotCVB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3R5cGUpOwotCVB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlKTsKLQlQeV9DTEVBUih0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2spOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3R5cGUpOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+Y3VyZXhjX3ZhbHVlKTsKKyAgICBQeV9DTEVBUih0c3RhdGUtPmN1cmV4Y190cmFjZWJhY2spOwogCi0JUHlfQ0xFQVIodHN0YXRlLT5leGNfdHlwZSk7Ci0JUHlfQ0xFQVIodHN0YXRlLT5leGNfdmFsdWUpOwotCVB5X0NMRUFSKHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayk7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5leGNfdHlwZSk7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5leGNfdmFsdWUpOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayk7CiAKLQl0c3RhdGUtPmNfcHJvZmlsZWZ1bmMgPSBOVUxMOwotCXRzdGF0ZS0+Y190cmFjZWZ1bmMgPSBOVUxMOwotCVB5X0NMRUFSKHRzdGF0ZS0+Y19wcm9maWxlb2JqKTsKLQlQeV9DTEVBUih0c3RhdGUtPmNfdHJhY2VvYmopOworICAgIHRzdGF0ZS0+Y19wcm9maWxlZnVuYyA9IE5VTEw7CisgICAgdHN0YXRlLT5jX3RyYWNlZnVuYyA9IE5VTEw7CisgICAgUHlfQ0xFQVIodHN0YXRlLT5jX3Byb2ZpbGVvYmopOworICAgIFB5X0NMRUFSKHRzdGF0ZS0+Y190cmFjZW9iaik7CiB9CiAKIApAQCAtMjU2LDUwICsyNTYsNTAgQEAKIHN0YXRpYyB2b2lkCiB0c3RhdGVfZGVsZXRlX2NvbW1vbihQeVRocmVhZFN0YXRlICp0c3RhdGUpCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7Ci0JUHlUaHJlYWRTdGF0ZSAqKnA7Ci0JUHlUaHJlYWRTdGF0ZSAqcHJldl9wID0gTlVMTDsKLQlpZiAodHN0YXRlID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBOVUxMIHRzdGF0ZSIpOwotCWludGVycCA9IHRzdGF0ZS0+aW50ZXJwOwotCWlmIChpbnRlcnAgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IE5VTEwgaW50ZXJwIik7Ci0JSEVBRF9MT0NLKCk7Ci0JZm9yIChwID0gJmludGVycC0+dHN0YXRlX2hlYWQ7IDsgcCA9ICYoKnApLT5uZXh0KSB7Ci0JCWlmICgqcCA9PSBOVUxMKQotCQkJUHlfRmF0YWxFcnJvcigKLQkJCQkiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IGludmFsaWQgdHN0YXRlIik7Ci0JCWlmICgqcCA9PSB0c3RhdGUpCi0JCQlicmVhazsKLQkJLyogU2FuaXR5IGNoZWNrLiAgVGhlc2Ugc3RhdGVzIHNob3VsZCBuZXZlciBoYXBwZW4gYnV0IGlmCi0JCSAqIHRoZXkgZG8gd2UgbXVzdCBhYm9ydC4gIE90aGVyd2lzZSB3ZSdsbCBlbmQgdXAgc3Bpbm5pbmcgaW4KLQkJICogaW4gYSB0aWdodCBsb29wIHdpdGggdGhlIGxvY2sgaGVsZC4gIEEgc2ltaWxhciBjaGVjayBpcyBkb25lCi0JCSAqIGluIHRocmVhZC5jIGZpbmRfa2V5KCkuICAqLwotCQlpZiAoKnAgPT0gcHJldl9wKQotCQkJUHlfRmF0YWxFcnJvcigKLQkJCQkiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IHNtYWxsIGNpcmN1bGFyIGxpc3QoISkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIHRzdGF0ZSBub3QgZm91bmQuIik7Ci0JCXByZXZfcCA9ICpwOwotCQlpZiAoKCpwKS0+bmV4dCA9PSBpbnRlcnAtPnRzdGF0ZV9oZWFkKQotCQkJUHlfRmF0YWxFcnJvcigKLQkJCQkiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IGNpcmN1bGFyIGxpc3QoISkgYW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRzdGF0ZSBub3QgZm91bmQuIik7Ci0JfQotCSpwID0gdHN0YXRlLT5uZXh0OwotCUhFQURfVU5MT0NLKCk7Ci0JZnJlZSh0c3RhdGUpOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOworICAgIFB5VGhyZWFkU3RhdGUgKipwOworICAgIFB5VGhyZWFkU3RhdGUgKnByZXZfcCA9IE5VTEw7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeVRocmVhZFN0YXRlX0RlbGV0ZTogTlVMTCB0c3RhdGUiKTsKKyAgICBpbnRlcnAgPSB0c3RhdGUtPmludGVycDsKKyAgICBpZiAoaW50ZXJwID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBOVUxMIGludGVycCIpOworICAgIEhFQURfTE9DSygpOworICAgIGZvciAocCA9ICZpbnRlcnAtPnRzdGF0ZV9oZWFkOyA7IHAgPSAmKCpwKS0+bmV4dCkgeworICAgICAgICBpZiAoKnAgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBpbnZhbGlkIHRzdGF0ZSIpOworICAgICAgICBpZiAoKnAgPT0gdHN0YXRlKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qIFNhbml0eSBjaGVjay4gIFRoZXNlIHN0YXRlcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJ1dCBpZgorICAgICAgICAgKiB0aGV5IGRvIHdlIG11c3QgYWJvcnQuICBPdGhlcndpc2Ugd2UnbGwgZW5kIHVwIHNwaW5uaW5nIGluCisgICAgICAgICAqIGluIGEgdGlnaHQgbG9vcCB3aXRoIHRoZSBsb2NrIGhlbGQuICBBIHNpbWlsYXIgY2hlY2sgaXMgZG9uZQorICAgICAgICAgKiBpbiB0aHJlYWQuYyBmaW5kX2tleSgpLiAgKi8KKyAgICAgICAgaWYgKCpwID09IHByZXZfcCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoCisgICAgICAgICAgICAgICAgIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiBzbWFsbCBjaXJjdWxhciBsaXN0KCEpIgorICAgICAgICAgICAgICAgICIgYW5kIHRzdGF0ZSBub3QgZm91bmQuIik7CisgICAgICAgIHByZXZfcCA9ICpwOworICAgICAgICBpZiAoKCpwKS0+bmV4dCA9PSBpbnRlcnAtPnRzdGF0ZV9oZWFkKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICAgICAiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IGNpcmN1bGFyIGxpc3QoISkgYW5kIgorICAgICAgICAgICAgICAgICIgdHN0YXRlIG5vdCBmb3VuZC4iKTsKKyAgICB9CisgICAgKnAgPSB0c3RhdGUtPm5leHQ7CisgICAgSEVBRF9VTkxPQ0soKTsKKyAgICBmcmVlKHRzdGF0ZSk7CiB9CiAKIAogdm9pZAogUHlUaHJlYWRTdGF0ZV9EZWxldGUoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKQogewotCWlmICh0c3RhdGUgPT0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudCkKLQkJUHlfRmF0YWxFcnJvcigiUHlUaHJlYWRTdGF0ZV9EZWxldGU6IHRzdGF0ZSBpcyBzdGlsbCBjdXJyZW50Iik7Ci0JdHN0YXRlX2RlbGV0ZV9jb21tb24odHN0YXRlKTsKKyAgICBpZiAodHN0YXRlID09IF9QeVRocmVhZFN0YXRlX0N1cnJlbnQpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfRGVsZXRlOiB0c3RhdGUgaXMgc3RpbGwgY3VycmVudCIpOworICAgIHRzdGF0ZV9kZWxldGVfY29tbW9uKHRzdGF0ZSk7CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoYXV0b1RMU2tleSAmJiBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpID09IHRzdGF0ZSkKLQkJUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShhdXRvVExTa2V5KTsKKyAgICBpZiAoYXV0b1RMU2tleSAmJiBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpID09IHRzdGF0ZSkKKyAgICAgICAgUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShhdXRvVExTa2V5KTsKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwogfQogCkBAIC0zMDgsMTUgKzMwOCwxNSBAQAogdm9pZAogUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50KCkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OwotCWlmICh0c3RhdGUgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigKLQkJCSJQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQ6IG5vIGN1cnJlbnQgdHN0YXRlIik7Ci0JX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9IE5VTEw7Ci0JdHN0YXRlX2RlbGV0ZV9jb21tb24odHN0YXRlKTsKLQlpZiAoYXV0b1RMU2tleSAmJiBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpID09IHRzdGF0ZSkKLQkJUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShhdXRvVExTa2V5KTsKLQlQeUV2YWxfUmVsZWFzZUxvY2soKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OworICAgIGlmICh0c3RhdGUgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigKKyAgICAgICAgICAgICJQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQ6IG5vIGN1cnJlbnQgdHN0YXRlIik7CisgICAgX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9IE5VTEw7CisgICAgdHN0YXRlX2RlbGV0ZV9jb21tb24odHN0YXRlKTsKKyAgICBpZiAoYXV0b1RMU2tleSAmJiBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpID09IHRzdGF0ZSkKKyAgICAgICAgUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShhdXRvVExTa2V5KTsKKyAgICBQeUV2YWxfUmVsZWFzZUxvY2soKTsKIH0KICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwogCkBAIC0zMjQsMzYgKzMyNCwzNiBAQAogUHlUaHJlYWRTdGF0ZSAqCiBQeVRocmVhZFN0YXRlX0dldCh2b2lkKQogewotCWlmIChfUHlUaHJlYWRTdGF0ZV9DdXJyZW50ID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfR2V0OiBubyBjdXJyZW50IHRocmVhZCIpOworICAgIGlmIChfUHlUaHJlYWRTdGF0ZV9DdXJyZW50ID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5VGhyZWFkU3RhdGVfR2V0OiBubyBjdXJyZW50IHRocmVhZCIpOwogCi0JcmV0dXJuIF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CisgICAgcmV0dXJuIF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CiB9CiAKIAogUHlUaHJlYWRTdGF0ZSAqCiBQeVRocmVhZFN0YXRlX1N3YXAoUHlUaHJlYWRTdGF0ZSAqbmV3dHMpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqb2xkdHMgPSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OworICAgIFB5VGhyZWFkU3RhdGUgKm9sZHRzID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKIAotCV9QeVRocmVhZFN0YXRlX0N1cnJlbnQgPSBuZXd0czsKLQkvKiBJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGZvciBtb3JlIHRoYW4gb25lIHRocmVhZCBzdGF0ZQotCSAgIHRvIGJlIHVzZWQgZm9yIGEgdGhyZWFkLiAgQ2hlY2sgdGhpcyB0aGUgYmVzdCB3ZSBjYW4gaW4gZGVidWcKLQkgICBidWlsZHMuCi0JKi8KKyAgICBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50ID0gbmV3dHM7CisgICAgLyogSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBmb3IgbW9yZSB0aGFuIG9uZSB0aHJlYWQgc3RhdGUKKyAgICAgICB0byBiZSB1c2VkIGZvciBhIHRocmVhZC4gIENoZWNrIHRoaXMgdGhlIGJlc3Qgd2UgY2FuIGluIGRlYnVnCisgICAgICAgYnVpbGRzLgorICAgICovCiAjaWYgZGVmaW5lZChQeV9ERUJVRykgJiYgZGVmaW5lZChXSVRIX1RIUkVBRCkKLQlpZiAobmV3dHMpIHsKLQkJLyogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gUHlFdmFsX1Jlc3RvcmVUaHJlYWQoKS4gU2ltaWxhcgotCQkgICB0byBpdCwgd2UgbmVlZCB0byBlbnN1cmUgZXJybm8gZG9lc24ndCBjaGFuZ2UuCi0JCSovCi0JCWludCBlcnIgPSBlcnJubzsKLQkJUHlUaHJlYWRTdGF0ZSAqY2hlY2sgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOwotCQlpZiAoY2hlY2sgJiYgY2hlY2stPmludGVycCA9PSBuZXd0cy0+aW50ZXJwICYmIGNoZWNrICE9IG5ld3RzKQotCQkJUHlfRmF0YWxFcnJvcigiSW52YWxpZCB0aHJlYWQgc3RhdGUgZm9yIHRoaXMgdGhyZWFkIik7Ci0JCWVycm5vID0gZXJyOwotCX0KKyAgICBpZiAobmV3dHMpIHsKKyAgICAgICAgLyogVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gUHlFdmFsX1Jlc3RvcmVUaHJlYWQoKS4gU2ltaWxhcgorICAgICAgICAgICB0byBpdCwgd2UgbmVlZCB0byBlbnN1cmUgZXJybm8gZG9lc24ndCBjaGFuZ2UuCisgICAgICAgICovCisgICAgICAgIGludCBlcnIgPSBlcnJubzsKKyAgICAgICAgUHlUaHJlYWRTdGF0ZSAqY2hlY2sgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOworICAgICAgICBpZiAoY2hlY2sgJiYgY2hlY2stPmludGVycCA9PSBuZXd0cy0+aW50ZXJwICYmIGNoZWNrICE9IG5ld3RzKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiSW52YWxpZCB0aHJlYWQgc3RhdGUgZm9yIHRoaXMgdGhyZWFkIik7CisgICAgICAgIGVycm5vID0gZXJyOworICAgIH0KICNlbmRpZgotCXJldHVybiBvbGR0czsKKyAgICByZXR1cm4gb2xkdHM7CiB9CiAKIC8qIEFuIGV4dGVuc2lvbiBtZWNoYW5pc20gdG8gc3RvcmUgYXJiaXRyYXJ5IGFkZGl0aW9uYWwgcGVyLXRocmVhZCBzdGF0ZS4KQEAgLTM2NSwxNiArMzY1LDE2IEBACiBQeU9iamVjdCAqCiBQeVRocmVhZFN0YXRlX0dldERpY3Qodm9pZCkKIHsKLQlpZiAoX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoX1B5VGhyZWFkU3RhdGVfQ3VycmVudCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWlmIChfUHlUaHJlYWRTdGF0ZV9DdXJyZW50LT5kaWN0ID09IE5VTEwpIHsKLQkJUHlPYmplY3QgKmQ7Ci0JCV9QeVRocmVhZFN0YXRlX0N1cnJlbnQtPmRpY3QgPSBkID0gUHlEaWN0X05ldygpOwotCQlpZiAoZCA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JcmV0dXJuIF9QeVRocmVhZFN0YXRlX0N1cnJlbnQtPmRpY3Q7CisgICAgaWYgKF9QeVRocmVhZFN0YXRlX0N1cnJlbnQtPmRpY3QgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZDsKKyAgICAgICAgX1B5VGhyZWFkU3RhdGVfQ3VycmVudC0+ZGljdCA9IGQgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChkID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gX1B5VGhyZWFkU3RhdGVfQ3VycmVudC0+ZGljdDsKIH0KIAogCkBAIC0zODgsMzYgKzM4OCwzNiBAQAogCiBpbnQKIFB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMobG9uZyBpZCwgUHlPYmplY3QgKmV4YykgewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSB0c3RhdGUtPmludGVycDsKLQlQeVRocmVhZFN0YXRlICpwOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSB0c3RhdGUtPmludGVycDsKKyAgICBQeVRocmVhZFN0YXRlICpwOwogCi0JLyogQWx0aG91Z2ggdGhlIEdJTCBpcyBoZWxkLCBhIGZldyBDIEFQSSBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZAotCSAqIHdpdGhvdXQgdGhlIEdJTCBoZWxkLCBhbmQgaW4gcGFydGljdWxhciBzb21lIHRoYXQgY3JlYXRlIGFuZAotCSAqIGRlc3Ryb3kgdGhyZWFkIGFuZCBpbnRlcnByZXRlciBzdGF0ZXMuICBUaG9zZSBjYW4gbXV0YXRlIHRoZQotCSAqIGxpc3Qgb2YgdGhyZWFkIHN0YXRlcyB3ZSdyZSB0cmF2ZXJzaW5nLCBzbyB0byBwcmV2ZW50IHRoYXQgd2UgbG9jawotCSAqIGhlYWRfbXV0ZXggZm9yIHRoZSBkdXJhdGlvbi4KLQkgKi8KLQlIRUFEX0xPQ0soKTsKLQlmb3IgKHAgPSBpbnRlcnAtPnRzdGF0ZV9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KSB7Ci0JCWlmIChwLT50aHJlYWRfaWQgPT0gaWQpIHsKLQkJCS8qIFRyaWNreTogIHdlIG5lZWQgdG8gZGVjcmVmIHRoZSBjdXJyZW50IHZhbHVlCi0JCQkgKiAoaWYgYW55KSBpbiBwLT5hc3luY19leGMsIGJ1dCB0aGF0IGNhbiBpbiB0dXJuCi0JCQkgKiBhbGxvdyBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgdG8gcnVuLCBpbmNsdWRpbmcKLQkJCSAqIHBlcmhhcHMgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi4gIFRvIHByZXZlbnQKLQkJCSAqIGRlYWRsb2NrLCB3ZSBuZWVkIHRvIHJlbGVhc2UgaGVhZF9tdXRleCBiZWZvcmUKLQkJCSAqIHRoZSBkZWNyZWYuCi0JCQkgKi8KLQkJCVB5T2JqZWN0ICpvbGRfZXhjID0gcC0+YXN5bmNfZXhjOwotCQkJUHlfWElOQ1JFRihleGMpOwotCQkJcC0+YXN5bmNfZXhjID0gZXhjOwotCQkJSEVBRF9VTkxPQ0soKTsKLQkJCVB5X1hERUNSRUYob2xkX2V4Yyk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlIRUFEX1VOTE9DSygpOwotCXJldHVybiAwOworICAgIC8qIEFsdGhvdWdoIHRoZSBHSUwgaXMgaGVsZCwgYSBmZXcgQyBBUEkgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQKKyAgICAgKiB3aXRob3V0IHRoZSBHSUwgaGVsZCwgYW5kIGluIHBhcnRpY3VsYXIgc29tZSB0aGF0IGNyZWF0ZSBhbmQKKyAgICAgKiBkZXN0cm95IHRocmVhZCBhbmQgaW50ZXJwcmV0ZXIgc3RhdGVzLiAgVGhvc2UgY2FuIG11dGF0ZSB0aGUKKyAgICAgKiBsaXN0IG9mIHRocmVhZCBzdGF0ZXMgd2UncmUgdHJhdmVyc2luZywgc28gdG8gcHJldmVudCB0aGF0IHdlIGxvY2sKKyAgICAgKiBoZWFkX211dGV4IGZvciB0aGUgZHVyYXRpb24uCisgICAgICovCisgICAgSEVBRF9MT0NLKCk7CisgICAgZm9yIChwID0gaW50ZXJwLT50c3RhdGVfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgeworICAgICAgICBpZiAocC0+dGhyZWFkX2lkID09IGlkKSB7CisgICAgICAgICAgICAvKiBUcmlja3k6ICB3ZSBuZWVkIHRvIGRlY3JlZiB0aGUgY3VycmVudCB2YWx1ZQorICAgICAgICAgICAgICogKGlmIGFueSkgaW4gcC0+YXN5bmNfZXhjLCBidXQgdGhhdCBjYW4gaW4gdHVybgorICAgICAgICAgICAgICogYWxsb3cgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIHRvIHJ1biwgaW5jbHVkaW5nCisgICAgICAgICAgICAgKiBwZXJoYXBzIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uICBUbyBwcmV2ZW50CisgICAgICAgICAgICAgKiBkZWFkbG9jaywgd2UgbmVlZCB0byByZWxlYXNlIGhlYWRfbXV0ZXggYmVmb3JlCisgICAgICAgICAgICAgKiB0aGUgZGVjcmVmLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBQeU9iamVjdCAqb2xkX2V4YyA9IHAtPmFzeW5jX2V4YzsKKyAgICAgICAgICAgIFB5X1hJTkNSRUYoZXhjKTsKKyAgICAgICAgICAgIHAtPmFzeW5jX2V4YyA9IGV4YzsKKyAgICAgICAgICAgIEhFQURfVU5MT0NLKCk7CisgICAgICAgICAgICBQeV9YREVDUkVGKG9sZF9leGMpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgSEVBRF9VTkxPQ0soKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC00MjcsMjIgKzQyNywyMiBAQAogUHlJbnRlcnByZXRlclN0YXRlICoKIFB5SW50ZXJwcmV0ZXJTdGF0ZV9IZWFkKHZvaWQpCiB7Ci0JcmV0dXJuIGludGVycF9oZWFkOworICAgIHJldHVybiBpbnRlcnBfaGVhZDsKIH0KIAogUHlJbnRlcnByZXRlclN0YXRlICoKIFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXh0KFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKSB7Ci0JcmV0dXJuIGludGVycC0+bmV4dDsKKyAgICByZXR1cm4gaW50ZXJwLT5uZXh0OwogfQogCiBQeVRocmVhZFN0YXRlICoKIFB5SW50ZXJwcmV0ZXJTdGF0ZV9UaHJlYWRIZWFkKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwKSB7Ci0JcmV0dXJuIGludGVycC0+dHN0YXRlX2hlYWQ7CisgICAgcmV0dXJuIGludGVycC0+dHN0YXRlX2hlYWQ7CiB9CiAKIFB5VGhyZWFkU3RhdGUgKgogUHlUaHJlYWRTdGF0ZV9OZXh0KFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkgewotCXJldHVybiB0c3RhdGUtPm5leHQ7CisgICAgcmV0dXJuIHRzdGF0ZS0+bmV4dDsKIH0KIAogLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHN5cy5fY3VycmVudF9mcmFtZXMoKS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUKQEAgLTQ1Myw0NCArNDUzLDQ0IEBACiBQeU9iamVjdCAqCiBfUHlUaHJlYWRfQ3VycmVudEZyYW1lcyh2b2lkKQogewotCVB5T2JqZWN0ICpyZXN1bHQ7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppOwogCi0JcmVzdWx0ID0gUHlEaWN0X05ldygpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlEaWN0X05ldygpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBmb3IgaSBpbiBhbGwgaW50ZXJwcmV0ZXJzOgotCSAqICAgICBmb3IgdCBpbiBhbGwgb2YgaSdzIHRocmVhZCBzdGF0ZXM6Ci0JICogICAgICAgICAgaWYgdCdzIGZyYW1lIGlzbid0IE5VTEwsIG1hcCB0J3MgaWQgdG8gaXRzIGZyYW1lCi0JICogQmVjYXVzZSB0aGVzZSBsaXN0cyBjYW4gbXV0dXRlIGV2ZW4gd2hlbiB0aGUgR0lMIGlzIGhlbGQsIHdlCi0JICogbmVlZCB0byBncmFiIGhlYWRfbXV0ZXggZm9yIHRoZSBkdXJhdGlvbi4KLQkgKi8KLQlIRUFEX0xPQ0soKTsKLQlmb3IgKGkgPSBpbnRlcnBfaGVhZDsgaSAhPSBOVUxMOyBpID0gaS0+bmV4dCkgewotCQlQeVRocmVhZFN0YXRlICp0OwotCQlmb3IgKHQgPSBpLT50c3RhdGVfaGVhZDsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkgewotCQkJUHlPYmplY3QgKmlkOwotCQkJaW50IHN0YXQ7Ci0JCQlzdHJ1Y3QgX2ZyYW1lICpmcmFtZSA9IHQtPmZyYW1lOwotCQkJaWYgKGZyYW1lID09IE5VTEwpCi0JCQkJY29udGludWU7Ci0JCQlpZCA9IFB5SW50X0Zyb21Mb25nKHQtPnRocmVhZF9pZCk7Ci0JCQlpZiAoaWQgPT0gTlVMTCkKLQkJCQlnb3RvIEZhaWw7Ci0JCQlzdGF0ID0gUHlEaWN0X1NldEl0ZW0ocmVzdWx0LCBpZCwgKFB5T2JqZWN0ICopZnJhbWUpOwotCQkJUHlfREVDUkVGKGlkKTsKLQkJCWlmIChzdGF0IDwgMCkKLQkJCQlnb3RvIEZhaWw7Ci0JCX0KLQl9Ci0JSEVBRF9VTkxPQ0soKTsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8qIGZvciBpIGluIGFsbCBpbnRlcnByZXRlcnM6CisgICAgICogICAgIGZvciB0IGluIGFsbCBvZiBpJ3MgdGhyZWFkIHN0YXRlczoKKyAgICAgKiAgICAgICAgICBpZiB0J3MgZnJhbWUgaXNuJ3QgTlVMTCwgbWFwIHQncyBpZCB0byBpdHMgZnJhbWUKKyAgICAgKiBCZWNhdXNlIHRoZXNlIGxpc3RzIGNhbiBtdXR1dGUgZXZlbiB3aGVuIHRoZSBHSUwgaXMgaGVsZCwgd2UKKyAgICAgKiBuZWVkIHRvIGdyYWIgaGVhZF9tdXRleCBmb3IgdGhlIGR1cmF0aW9uLgorICAgICAqLworICAgIEhFQURfTE9DSygpOworICAgIGZvciAoaSA9IGludGVycF9oZWFkOyBpICE9IE5VTEw7IGkgPSBpLT5uZXh0KSB7CisgICAgICAgIFB5VGhyZWFkU3RhdGUgKnQ7CisgICAgICAgIGZvciAodCA9IGktPnRzdGF0ZV9oZWFkOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaWQ7CisgICAgICAgICAgICBpbnQgc3RhdDsKKyAgICAgICAgICAgIHN0cnVjdCBfZnJhbWUgKmZyYW1lID0gdC0+ZnJhbWU7CisgICAgICAgICAgICBpZiAoZnJhbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlkID0gUHlJbnRfRnJvbUxvbmcodC0+dGhyZWFkX2lkKTsKKyAgICAgICAgICAgIGlmIChpZCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICAgIHN0YXQgPSBQeURpY3RfU2V0SXRlbShyZXN1bHQsIGlkLCAoUHlPYmplY3QgKilmcmFtZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaWQpOworICAgICAgICAgICAgaWYgKHN0YXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBIRUFEX1VOTE9DSygpOworICAgIHJldHVybiByZXN1bHQ7CiAKICBGYWlsOgotIAlIRUFEX1VOTE9DSygpOwotIAlQeV9ERUNSRUYocmVzdWx0KTsKLSAJcmV0dXJuIE5VTEw7CisgICAgSEVBRF9VTkxPQ0soKTsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogUHl0aG9uICJhdXRvIHRocmVhZCBzdGF0ZSIgQVBJLiAqLwpAQCAtNTA3LDEyICs1MDcsMTIgQEAKIHN0YXRpYyBpbnQKIFB5VGhyZWFkU3RhdGVfSXNDdXJyZW50KFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIHsKLQkvKiBNdXN0IGJlIHRoZSB0c3RhdGUgZm9yIHRoaXMgdGhyZWFkICovCi0JYXNzZXJ0KFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCk9PXRzdGF0ZSk7Ci0JLyogT24gV2luZG93cyBhdCBsZWFzdCwgc2ltcGxlIHJlYWRzIGFuZCB3cml0ZXMgdG8gMzIgYml0IHZhbHVlcwotCSAgIGFyZSBhdG9taWMuCi0JKi8KLQlyZXR1cm4gdHN0YXRlID09IF9QeVRocmVhZFN0YXRlX0N1cnJlbnQ7CisgICAgLyogTXVzdCBiZSB0aGUgdHN0YXRlIGZvciB0aGlzIHRocmVhZCAqLworICAgIGFzc2VydChQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpPT10c3RhdGUpOworICAgIC8qIE9uIFdpbmRvd3MgYXQgbGVhc3QsIHNpbXBsZSByZWFkcyBhbmQgd3JpdGVzIHRvIDMyIGJpdCB2YWx1ZXMKKyAgICAgICBhcmUgYXRvbWljLgorICAgICovCisgICAgcmV0dXJuIHRzdGF0ZSA9PSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OwogfQogCiAvKiBJbnRlcm5hbCBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gZnVuY3Rpb25zIGNhbGxlZCBieQpAQCAtNTIxLDIxICs1MjEsMjEgQEAKIHZvaWQKIF9QeUdJTFN0YXRlX0luaXQoUHlJbnRlcnByZXRlclN0YXRlICppLCBQeVRocmVhZFN0YXRlICp0KQogewotCWFzc2VydChpICYmIHQpOyAvKiBtdXN0IGluaXQgd2l0aCB2YWxpZCBzdGF0ZXMgKi8KLQlhdXRvVExTa2V5ID0gUHlUaHJlYWRfY3JlYXRlX2tleSgpOwotCWF1dG9JbnRlcnByZXRlclN0YXRlID0gaTsKLQlhc3NlcnQoUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShhdXRvVExTa2V5KSA9PSBOVUxMKTsKLQlhc3NlcnQodC0+Z2lsc3RhdGVfY291bnRlciA9PSAwKTsKKyAgICBhc3NlcnQoaSAmJiB0KTsgLyogbXVzdCBpbml0IHdpdGggdmFsaWQgc3RhdGVzICovCisgICAgYXV0b1RMU2tleSA9IFB5VGhyZWFkX2NyZWF0ZV9rZXkoKTsKKyAgICBhdXRvSW50ZXJwcmV0ZXJTdGF0ZSA9IGk7CisgICAgYXNzZXJ0KFB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSkgPT0gTlVMTCk7CisgICAgYXNzZXJ0KHQtPmdpbHN0YXRlX2NvdW50ZXIgPT0gMCk7CiAKLQlfUHlHSUxTdGF0ZV9Ob3RlVGhyZWFkU3RhdGUodCk7CisgICAgX1B5R0lMU3RhdGVfTm90ZVRocmVhZFN0YXRlKHQpOwogfQogCiB2b2lkCiBfUHlHSUxTdGF0ZV9GaW5pKHZvaWQpCiB7Ci0JUHlUaHJlYWRfZGVsZXRlX2tleShhdXRvVExTa2V5KTsKLQlhdXRvVExTa2V5ID0gMDsKLQlhdXRvSW50ZXJwcmV0ZXJTdGF0ZSA9IE5VTEw7CisgICAgUHlUaHJlYWRfZGVsZXRlX2tleShhdXRvVExTa2V5KTsKKyAgICBhdXRvVExTa2V5ID0gMDsKKyAgICBhdXRvSW50ZXJwcmV0ZXJTdGF0ZSA9IE5VTEw7CiB9CiAKIC8qIFdoZW4gYSB0aHJlYWQgc3RhdGUgaXMgY3JlYXRlZCBmb3IgYSB0aHJlYWQgYnkgc29tZSBtZWNoYW5pc20gb3RoZXIgdGhhbgpAQCAtNTQ2LDExMyArNTQ2LDExMyBAQAogc3RhdGljIHZvaWQKIF9QeUdJTFN0YXRlX05vdGVUaHJlYWRTdGF0ZShQeVRocmVhZFN0YXRlKiB0c3RhdGUpCiB7Ci0JLyogSWYgYXV0b1RMU2tleSBpcyAwLCB0aGlzIG11c3QgYmUgdGhlIHZlcnkgZmlyc3QgdGhyZWFkc3RhdGUgY3JlYXRlZAotCSAgIGluIFB5X0luaXRpYWxpemUoKS4gIERvbid0IGRvIGFueXRoaW5nIGZvciBub3cgKHdlJ2xsIGJlIGJhY2sgaGVyZQotCSAgIHdoZW4gX1B5R0lMU3RhdGVfSW5pdCBpcyBjYWxsZWQpLiAqLwotCWlmICghYXV0b1RMU2tleSkKLQkJcmV0dXJuOworICAgIC8qIElmIGF1dG9UTFNrZXkgaXMgMCwgdGhpcyBtdXN0IGJlIHRoZSB2ZXJ5IGZpcnN0IHRocmVhZHN0YXRlIGNyZWF0ZWQKKyAgICAgICBpbiBQeV9Jbml0aWFsaXplKCkuICBEb24ndCBkbyBhbnl0aGluZyBmb3Igbm93ICh3ZSdsbCBiZSBiYWNrIGhlcmUKKyAgICAgICB3aGVuIF9QeUdJTFN0YXRlX0luaXQgaXMgY2FsbGVkKS4gKi8KKyAgICBpZiAoIWF1dG9UTFNrZXkpCisgICAgICAgIHJldHVybjsKIAotCS8qIFN0aWNrIHRoZSB0aHJlYWQgc3RhdGUgZm9yIHRoaXMgdGhyZWFkIGluIHRocmVhZCBsb2NhbCBzdG9yYWdlLgorICAgIC8qIFN0aWNrIHRoZSB0aHJlYWQgc3RhdGUgZm9yIHRoaXMgdGhyZWFkIGluIHRocmVhZCBsb2NhbCBzdG9yYWdlLgogCi0JICAgVGhlIG9ubHkgc2l0dWF0aW9uIHdoZXJlIHlvdSBjYW4gbGVnaXRpbWF0ZWx5IGhhdmUgbW9yZSB0aGFuIG9uZQotCSAgIHRocmVhZCBzdGF0ZSBmb3IgYW4gT1MgbGV2ZWwgdGhyZWFkIGlzIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCi0JICAgaW50ZXJwcmV0ZXJzLCB3aGVuOgorICAgICAgIFRoZSBvbmx5IHNpdHVhdGlvbiB3aGVyZSB5b3UgY2FuIGxlZ2l0aW1hdGVseSBoYXZlIG1vcmUgdGhhbiBvbmUKKyAgICAgICB0aHJlYWQgc3RhdGUgZm9yIGFuIE9TIGxldmVsIHRocmVhZCBpcyB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZQorICAgICAgIGludGVycHJldGVycywgd2hlbjoKIAotCSAgICAgICBhKSBZb3Ugc2hvdWxkbid0IHJlYWxseSBiZSB1c2luZyB0aGUgUHlHSUxTdGF0ZV8gQVBJcyBhbnl3YXksCi0JICAgICAgICAgIGFuZDoKKyAgICAgICAgICAgYSkgWW91IHNob3VsZG4ndCByZWFsbHkgYmUgdXNpbmcgdGhlIFB5R0lMU3RhdGVfIEFQSXMgYW55d2F5LAorICAgICAgICAgIGFuZDoKIAotCSAgICAgICBiKSBUaGUgc2xpZ2h0bHkgb2RkIHdheSBQeVRocmVhZF9zZXRfa2V5X3ZhbHVlIHdvcmtzIChzZWUKLQkgICAgICAgICAgY29tbWVudHMgYnkgaXRzIGltcGxlbWVudGF0aW9uKSBtZWFucyB0aGF0IHRoZSBmaXJzdCB0aHJlYWQKLQkgICAgICAgICAgc3RhdGUgY3JlYXRlZCBmb3IgdGhhdCBnaXZlbiBPUyBsZXZlbCB0aHJlYWQgd2lsbCAid2luIiwKLQkgICAgICAgICAgd2hpY2ggc2VlbXMgcmVhc29uYWJsZSBiZWhhdmlvdXIuCi0JKi8KLQlpZiAoUHlUaHJlYWRfc2V0X2tleV92YWx1ZShhdXRvVExTa2V5LCAodm9pZCAqKXRzdGF0ZSkgPCAwKQotCQlQeV9GYXRhbEVycm9yKCJDb3VsZG4ndCBjcmVhdGUgYXV0b1RMU2tleSBtYXBwaW5nIik7CisgICAgICAgICAgIGIpIFRoZSBzbGlnaHRseSBvZGQgd2F5IFB5VGhyZWFkX3NldF9rZXlfdmFsdWUgd29ya3MgKHNlZQorICAgICAgICAgIGNvbW1lbnRzIGJ5IGl0cyBpbXBsZW1lbnRhdGlvbikgbWVhbnMgdGhhdCB0aGUgZmlyc3QgdGhyZWFkCisgICAgICAgICAgc3RhdGUgY3JlYXRlZCBmb3IgdGhhdCBnaXZlbiBPUyBsZXZlbCB0aHJlYWQgd2lsbCAid2luIiwKKyAgICAgICAgICB3aGljaCBzZWVtcyByZWFzb25hYmxlIGJlaGF2aW91ci4KKyAgICAqLworICAgIGlmIChQeVRocmVhZF9zZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXksICh2b2lkICopdHN0YXRlKSA8IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNvdWxkbid0IGNyZWF0ZSBhdXRvVExTa2V5IG1hcHBpbmciKTsKIAotCS8qIFB5R0lMU3RhdGVfUmVsZWFzZSBtdXN0IG5vdCB0cnkgdG8gZGVsZXRlIHRoaXMgdGhyZWFkIHN0YXRlLiAqLwotCXRzdGF0ZS0+Z2lsc3RhdGVfY291bnRlciA9IDE7CisgICAgLyogUHlHSUxTdGF0ZV9SZWxlYXNlIG11c3Qgbm90IHRyeSB0byBkZWxldGUgdGhpcyB0aHJlYWQgc3RhdGUuICovCisgICAgdHN0YXRlLT5naWxzdGF0ZV9jb3VudGVyID0gMTsKIH0KIAogLyogVGhlIHB1YmxpYyBmdW5jdGlvbnMgKi8KIFB5VGhyZWFkU3RhdGUgKgogUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUodm9pZCkKIHsKLQlpZiAoYXV0b0ludGVycHJldGVyU3RhdGUgPT0gTlVMTCB8fCBhdXRvVExTa2V5ID09IDApCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAoUHlUaHJlYWRTdGF0ZSAqKVB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSk7CisgICAgaWYgKGF1dG9JbnRlcnByZXRlclN0YXRlID09IE5VTEwgfHwgYXV0b1RMU2tleSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFB5VGhyZWFkU3RhdGUgKilQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpOwogfQogCiBQeUdJTFN0YXRlX1NUQVRFCiBQeUdJTFN0YXRlX0Vuc3VyZSh2b2lkKQogewotCWludCBjdXJyZW50OwotCVB5VGhyZWFkU3RhdGUgKnRjdXI7Ci0JLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBhdXRvLWluaXQgUHl0aG9uIGhlcmUgLSBhcGFydCBmcm9tCi0JICAgcG90ZW50aWFsIHJhY2VzIHdpdGggMiB0aHJlYWRzIGF1dG8taW5pdGlhbGl6aW5nLCBwZXAtMzExCi0JICAgc3BlbGxzIG91dCBvdGhlciBpc3N1ZXMuICBFbWJlZGRlcnMgYXJlIGV4cGVjdGVkIHRvIGhhdmUKLQkgICBjYWxsZWQgUHlfSW5pdGlhbGl6ZSgpIGFuZCB1c3VhbGx5IFB5RXZhbF9Jbml0VGhyZWFkcygpLgotCSovCi0JYXNzZXJ0KGF1dG9JbnRlcnByZXRlclN0YXRlKTsgLyogUHlfSW5pdGlhbGl6ZSgpIGhhc24ndCBiZWVuIGNhbGxlZCEgKi8KLQl0Y3VyID0gKFB5VGhyZWFkU3RhdGUgKilQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpOwotCWlmICh0Y3VyID09IE5VTEwpIHsKLQkJLyogQ3JlYXRlIGEgbmV3IHRocmVhZCBzdGF0ZSBmb3IgdGhpcyB0aHJlYWQgKi8KLQkJdGN1ciA9IFB5VGhyZWFkU3RhdGVfTmV3KGF1dG9JbnRlcnByZXRlclN0YXRlKTsKLQkJaWYgKHRjdXIgPT0gTlVMTCkKLQkJCVB5X0ZhdGFsRXJyb3IoIkNvdWxkbid0IGNyZWF0ZSB0aHJlYWQtc3RhdGUgZm9yIG5ldyB0aHJlYWQiKTsKLQkJLyogVGhpcyBpcyBvdXIgdGhyZWFkIHN0YXRlISAgV2UnbGwgbmVlZCB0byBkZWxldGUgaXQgaW4gdGhlCi0JCSAgIG1hdGNoaW5nIGNhbGwgdG8gUHlHSUxTdGF0ZV9SZWxlYXNlKCkuICovCi0JCXRjdXItPmdpbHN0YXRlX2NvdW50ZXIgPSAwOwotCQljdXJyZW50ID0gMDsgLyogbmV3IHRocmVhZCBzdGF0ZSBpcyBuZXZlciBjdXJyZW50ICovCi0JfQotCWVsc2UKLQkJY3VycmVudCA9IFB5VGhyZWFkU3RhdGVfSXNDdXJyZW50KHRjdXIpOwotCWlmIChjdXJyZW50ID09IDApCi0JCVB5RXZhbF9SZXN0b3JlVGhyZWFkKHRjdXIpOwotCS8qIFVwZGF0ZSBvdXIgY291bnRlciBpbiB0aGUgdGhyZWFkLXN0YXRlIC0gbm8gbmVlZCBmb3IgbG9ja3M6Ci0JICAgLSB0Y3VyIHdpbGwgcmVtYWluIHZhbGlkIGFzIHdlIGhvbGQgdGhlIEdJTC4KLQkgICAtIHRoZSBjb3VudGVyIGlzIHNhZmUgYXMgd2UgYXJlIHRoZSBvbmx5IHRocmVhZCAiYWxsb3dlZCIKLQkgICAgIHRvIG1vZGlmeSB0aGlzIHZhbHVlCi0JKi8KLQkrK3RjdXItPmdpbHN0YXRlX2NvdW50ZXI7Ci0JcmV0dXJuIGN1cnJlbnQgPyBQeUdJTFN0YXRlX0xPQ0tFRCA6IFB5R0lMU3RhdGVfVU5MT0NLRUQ7CisgICAgaW50IGN1cnJlbnQ7CisgICAgUHlUaHJlYWRTdGF0ZSAqdGN1cjsKKyAgICAvKiBOb3RlIHRoYXQgd2UgZG8gbm90IGF1dG8taW5pdCBQeXRob24gaGVyZSAtIGFwYXJ0IGZyb20KKyAgICAgICBwb3RlbnRpYWwgcmFjZXMgd2l0aCAyIHRocmVhZHMgYXV0by1pbml0aWFsaXppbmcsIHBlcC0zMTEKKyAgICAgICBzcGVsbHMgb3V0IG90aGVyIGlzc3Vlcy4gIEVtYmVkZGVycyBhcmUgZXhwZWN0ZWQgdG8gaGF2ZQorICAgICAgIGNhbGxlZCBQeV9Jbml0aWFsaXplKCkgYW5kIHVzdWFsbHkgUHlFdmFsX0luaXRUaHJlYWRzKCkuCisgICAgKi8KKyAgICBhc3NlcnQoYXV0b0ludGVycHJldGVyU3RhdGUpOyAvKiBQeV9Jbml0aWFsaXplKCkgaGFzbid0IGJlZW4gY2FsbGVkISAqLworICAgIHRjdXIgPSAoUHlUaHJlYWRTdGF0ZSAqKVB5VGhyZWFkX2dldF9rZXlfdmFsdWUoYXV0b1RMU2tleSk7CisgICAgaWYgKHRjdXIgPT0gTlVMTCkgeworICAgICAgICAvKiBDcmVhdGUgYSBuZXcgdGhyZWFkIHN0YXRlIGZvciB0aGlzIHRocmVhZCAqLworICAgICAgICB0Y3VyID0gUHlUaHJlYWRTdGF0ZV9OZXcoYXV0b0ludGVycHJldGVyU3RhdGUpOworICAgICAgICBpZiAodGN1ciA9PSBOVUxMKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiQ291bGRuJ3QgY3JlYXRlIHRocmVhZC1zdGF0ZSBmb3IgbmV3IHRocmVhZCIpOworICAgICAgICAvKiBUaGlzIGlzIG91ciB0aHJlYWQgc3RhdGUhICBXZSdsbCBuZWVkIHRvIGRlbGV0ZSBpdCBpbiB0aGUKKyAgICAgICAgICAgbWF0Y2hpbmcgY2FsbCB0byBQeUdJTFN0YXRlX1JlbGVhc2UoKS4gKi8KKyAgICAgICAgdGN1ci0+Z2lsc3RhdGVfY291bnRlciA9IDA7CisgICAgICAgIGN1cnJlbnQgPSAwOyAvKiBuZXcgdGhyZWFkIHN0YXRlIGlzIG5ldmVyIGN1cnJlbnQgKi8KKyAgICB9CisgICAgZWxzZQorICAgICAgICBjdXJyZW50ID0gUHlUaHJlYWRTdGF0ZV9Jc0N1cnJlbnQodGN1cik7CisgICAgaWYgKGN1cnJlbnQgPT0gMCkKKyAgICAgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQodGN1cik7CisgICAgLyogVXBkYXRlIG91ciBjb3VudGVyIGluIHRoZSB0aHJlYWQtc3RhdGUgLSBubyBuZWVkIGZvciBsb2NrczoKKyAgICAgICAtIHRjdXIgd2lsbCByZW1haW4gdmFsaWQgYXMgd2UgaG9sZCB0aGUgR0lMLgorICAgICAgIC0gdGhlIGNvdW50ZXIgaXMgc2FmZSBhcyB3ZSBhcmUgdGhlIG9ubHkgdGhyZWFkICJhbGxvd2VkIgorICAgICAgICAgdG8gbW9kaWZ5IHRoaXMgdmFsdWUKKyAgICAqLworICAgICsrdGN1ci0+Z2lsc3RhdGVfY291bnRlcjsKKyAgICByZXR1cm4gY3VycmVudCA/IFB5R0lMU3RhdGVfTE9DS0VEIDogUHlHSUxTdGF0ZV9VTkxPQ0tFRDsKIH0KIAogdm9pZAogUHlHSUxTdGF0ZV9SZWxlYXNlKFB5R0lMU3RhdGVfU1RBVEUgb2xkc3RhdGUpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdGN1ciA9IChQeVRocmVhZFN0YXRlICopUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvVExTa2V5KTsKLQlpZiAodGN1ciA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJhdXRvLXJlbGVhc2luZyB0aHJlYWQtc3RhdGUsICIKLQkJICAgICAgICAgICAgICAiYnV0IG5vIHRocmVhZC1zdGF0ZSBmb3IgdGhpcyB0aHJlYWQiKTsKLQkvKiBXZSBtdXN0IGhvbGQgdGhlIEdJTCBhbmQgaGF2ZSBvdXIgdGhyZWFkIHN0YXRlIGN1cnJlbnQgKi8KLQkvKiBYWFggLSByZW1vdmUgdGhlIGNoZWNrIC0gdGhlIGFzc2VydCBzaG91bGQgYmUgZmluZSwKLQkgICBidXQgd2hpbGUgdGhpcyBpcyB2ZXJ5IG5ldyAoQXByaWwgMjAwMyksIHRoZSBleHRyYSBjaGVjawotCSAgIGJ5IHJlbGVhc2Utb25seSB1c2VycyBjYW4ndCBodXJ0LgotCSovCi0JaWYgKCEgUHlUaHJlYWRTdGF0ZV9Jc0N1cnJlbnQodGN1cikpCi0JCVB5X0ZhdGFsRXJyb3IoIlRoaXMgdGhyZWFkIHN0YXRlIG11c3QgYmUgY3VycmVudCB3aGVuIHJlbGVhc2luZyIpOwotCWFzc2VydChQeVRocmVhZFN0YXRlX0lzQ3VycmVudCh0Y3VyKSk7Ci0JLS10Y3VyLT5naWxzdGF0ZV9jb3VudGVyOwotCWFzc2VydCh0Y3VyLT5naWxzdGF0ZV9jb3VudGVyID49IDApOyAvKiBpbGxlZ2FsIGNvdW50ZXIgdmFsdWUgKi8KKyAgICBQeVRocmVhZFN0YXRlICp0Y3VyID0gKFB5VGhyZWFkU3RhdGUgKilQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RMU2tleSk7CisgICAgaWYgKHRjdXIgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiYXV0by1yZWxlYXNpbmcgdGhyZWFkLXN0YXRlLCAiCisgICAgICAgICAgICAgICAgICAgICAgImJ1dCBubyB0aHJlYWQtc3RhdGUgZm9yIHRoaXMgdGhyZWFkIik7CisgICAgLyogV2UgbXVzdCBob2xkIHRoZSBHSUwgYW5kIGhhdmUgb3VyIHRocmVhZCBzdGF0ZSBjdXJyZW50ICovCisgICAgLyogWFhYIC0gcmVtb3ZlIHRoZSBjaGVjayAtIHRoZSBhc3NlcnQgc2hvdWxkIGJlIGZpbmUsCisgICAgICAgYnV0IHdoaWxlIHRoaXMgaXMgdmVyeSBuZXcgKEFwcmlsIDIwMDMpLCB0aGUgZXh0cmEgY2hlY2sKKyAgICAgICBieSByZWxlYXNlLW9ubHkgdXNlcnMgY2FuJ3QgaHVydC4KKyAgICAqLworICAgIGlmICghIFB5VGhyZWFkU3RhdGVfSXNDdXJyZW50KHRjdXIpKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJUaGlzIHRocmVhZCBzdGF0ZSBtdXN0IGJlIGN1cnJlbnQgd2hlbiByZWxlYXNpbmciKTsKKyAgICBhc3NlcnQoUHlUaHJlYWRTdGF0ZV9Jc0N1cnJlbnQodGN1cikpOworICAgIC0tdGN1ci0+Z2lsc3RhdGVfY291bnRlcjsKKyAgICBhc3NlcnQodGN1ci0+Z2lsc3RhdGVfY291bnRlciA+PSAwKTsgLyogaWxsZWdhbCBjb3VudGVyIHZhbHVlICovCiAKLQkvKiBJZiB3ZSdyZSBnb2luZyB0byBkZXN0cm95IHRoaXMgdGhyZWFkLXN0YXRlLCB3ZSBtdXN0Ci0JICogY2xlYXIgaXQgd2hpbGUgdGhlIEdJTCBpcyBoZWxkLCBhcyBkZXN0cnVjdG9ycyBtYXkgcnVuLgotCSAqLwotCWlmICh0Y3VyLT5naWxzdGF0ZV9jb3VudGVyID09IDApIHsKLQkJLyogY2FuJ3QgaGF2ZSBiZWVuIGxvY2tlZCB3aGVuIHdlIGNyZWF0ZWQgaXQgKi8KLQkJYXNzZXJ0KG9sZHN0YXRlID09IFB5R0lMU3RhdGVfVU5MT0NLRUQpOwotCQlQeVRocmVhZFN0YXRlX0NsZWFyKHRjdXIpOwotCQkvKiBEZWxldGUgdGhlIHRocmVhZC1zdGF0ZS4gIE5vdGUgdGhpcyByZWxlYXNlcyB0aGUgR0lMIHRvbyEKLQkJICogSXQncyB2aXRhbCB0aGF0IHRoZSBHSUwgYmUgaGVsZCBoZXJlLCB0byBhdm9pZCBzaHV0ZG93bgotCQkgKiByYWNlczsgc2VlIGJ1Z3MgMjI1NjczIGFuZCAxMDYxOTY4ICh0aGF0IG5hc3R5IGJ1ZyBoYXMgYQotCQkgKiBoYWJpdCBvZiBjb21pbmcgYmFjaykuCi0JCSAqLwotCQlQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQoKTsKLQl9Ci0JLyogUmVsZWFzZSB0aGUgbG9jayBpZiBuZWNlc3NhcnkgKi8KLQllbHNlIGlmIChvbGRzdGF0ZSA9PSBQeUdJTFN0YXRlX1VOTE9DS0VEKQotCQlQeUV2YWxfU2F2ZVRocmVhZCgpOworICAgIC8qIElmIHdlJ3JlIGdvaW5nIHRvIGRlc3Ryb3kgdGhpcyB0aHJlYWQtc3RhdGUsIHdlIG11c3QKKyAgICAgKiBjbGVhciBpdCB3aGlsZSB0aGUgR0lMIGlzIGhlbGQsIGFzIGRlc3RydWN0b3JzIG1heSBydW4uCisgICAgICovCisgICAgaWYgKHRjdXItPmdpbHN0YXRlX2NvdW50ZXIgPT0gMCkgeworICAgICAgICAvKiBjYW4ndCBoYXZlIGJlZW4gbG9ja2VkIHdoZW4gd2UgY3JlYXRlZCBpdCAqLworICAgICAgICBhc3NlcnQob2xkc3RhdGUgPT0gUHlHSUxTdGF0ZV9VTkxPQ0tFRCk7CisgICAgICAgIFB5VGhyZWFkU3RhdGVfQ2xlYXIodGN1cik7CisgICAgICAgIC8qIERlbGV0ZSB0aGUgdGhyZWFkLXN0YXRlLiAgTm90ZSB0aGlzIHJlbGVhc2VzIHRoZSBHSUwgdG9vIQorICAgICAgICAgKiBJdCdzIHZpdGFsIHRoYXQgdGhlIEdJTCBiZSBoZWxkIGhlcmUsIHRvIGF2b2lkIHNodXRkb3duCisgICAgICAgICAqIHJhY2VzOyBzZWUgYnVncyAyMjU2NzMgYW5kIDEwNjE5NjggKHRoYXQgbmFzdHkgYnVnIGhhcyBhCisgICAgICAgICAqIGhhYml0IG9mIGNvbWluZyBiYWNrKS4KKyAgICAgICAgICovCisgICAgICAgIFB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudCgpOworICAgIH0KKyAgICAvKiBSZWxlYXNlIHRoZSBsb2NrIGlmIG5lY2Vzc2FyeSAqLworICAgIGVsc2UgaWYgKG9sZHN0YXRlID09IFB5R0lMU3RhdGVfVU5MT0NLRUQpCisgICAgICAgIFB5RXZhbF9TYXZlVGhyZWFkKCk7CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RyY21wLmMgYi9QeXRob24vcHlzdHJjbXAuYwppbmRleCA4NDI5NWU3Li5mOWMyMjc3IDEwMDY0NAotLS0gYS9QeXRob24vcHlzdHJjbXAuYworKysgYi9QeXRob24vcHlzdHJjbXAuYwpAQCAtNiwyMSArNiwyMSBAQAogaW50CiBQeU9TX215c3RybmljbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBQeV9zc2l6ZV90IHNpemUpCiB7Ci0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuIDA7Ci0Jd2hpbGUgKCgtLXNpemUgPiAwKSAmJgotCSAgICAgICAodG9sb3dlcigodW5zaWduZWQpKnMxKSA9PSB0b2xvd2VyKCh1bnNpZ25lZCkqczIpKSkgewotCQlpZiAoISpzMSsrIHx8ICEqczIrKykKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gdG9sb3dlcigodW5zaWduZWQpKnMxKSAtIHRvbG93ZXIoKHVuc2lnbmVkKSpzMik7CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgd2hpbGUgKCgtLXNpemUgPiAwKSAmJgorICAgICAgICAgICAodG9sb3dlcigodW5zaWduZWQpKnMxKSA9PSB0b2xvd2VyKCh1bnNpZ25lZCkqczIpKSkgeworICAgICAgICBpZiAoISpzMSsrIHx8ICEqczIrKykKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdG9sb3dlcigodW5zaWduZWQpKnMxKSAtIHRvbG93ZXIoKHVuc2lnbmVkKSpzMik7CiB9CiAKIGludAogUHlPU19teXN0cmljbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQogewotCXdoaWxlICgqczEgJiYgKHRvbG93ZXIoKHVuc2lnbmVkKSpzMSsrKSA9PSB0b2xvd2VyKCh1bnNpZ25lZCkqczIrKykpKSB7Ci0JCTsKLQl9Ci0JcmV0dXJuICh0b2xvd2VyKCh1bnNpZ25lZCkqczEpIC0gdG9sb3dlcigodW5zaWduZWQpKnMyKSk7CisgICAgd2hpbGUgKCpzMSAmJiAodG9sb3dlcigodW5zaWduZWQpKnMxKyspID09IHRvbG93ZXIoKHVuc2lnbmVkKSpzMisrKSkpIHsKKyAgICAgICAgOworICAgIH0KKyAgICByZXR1cm4gKHRvbG93ZXIoKHVuc2lnbmVkKSpzMSkgLSB0b2xvd2VyKCh1bnNpZ25lZCkqczIpKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0cnRvZC5jIGIvUHl0aG9uL3B5c3RydG9kLmMKaW5kZXggNmY4ZjUyZC4uOTAwNGNmNCAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RydG9kLmMKKysrIGIvUHl0aG9uL3B5c3RydG9kLmMKQEAgLTUsNyArNSw3IEBACiAKIC8qIGFzY2lpIGNoYXJhY3RlciB0ZXN0cyAoYXMgb3Bwb3NlZCB0byBsb2NhbGUgdGVzdHMpICovCiAjZGVmaW5lIElTU1BBQ0UoYykgICgoYykgPT0gJyAnIHx8IChjKSA9PSAnXGYnIHx8IChjKSA9PSAnXG4nIHx8IFwKLSAgICAgICAgICAgICAgICAgICAgIChjKSA9PSAnXHInIHx8IChjKSA9PSAnXHQnIHx8IChjKSA9PSAnXHYnKQorICAgICAgICAgICAgIChjKSA9PSAnXHInIHx8IChjKSA9PSAnXHQnIHx8IChjKSA9PSAnXHYnKQogI2RlZmluZSBJU0RJR0lUKGMpICAoKGMpID49ICcwJyAmJiAoYykgPD0gJzknKQogCiAKQEAgLTE0LDcgKzE0LDcgQEAKICAqIEBucHRyOiAgICB0aGUgc3RyaW5nIHRvIGNvbnZlcnQgdG8gYSBudW1lcmljIHZhbHVlLgogICogQGVuZHB0cjogIGlmIG5vbi0lTlVMTCwgaXQgcmV0dXJucyB0aGUgY2hhcmFjdGVyIGFmdGVyCiAgKiAgICAgICAgICAgdGhlIGxhc3QgY2hhcmFjdGVyIHVzZWQgaW4gdGhlIGNvbnZlcnNpb24uCi0gKiAKKyAqCiAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhICNnZG91YmxlIHZhbHVlLgogICogVGhpcyBmdW5jdGlvbiBiZWhhdmVzIGxpa2UgdGhlIHN0YW5kYXJkIHN0cnRvZCgpIGZ1bmN0aW9uCiAgKiBkb2VzIGluIHRoZSBDIGxvY2FsZS4gSXQgZG9lcyB0aGlzIHdpdGhvdXQgYWN0dWFsbHkKQEAgLTMxLDcgKzMxLDcgQEAKICAqIHN0b3JlZCBpbiAlZXJybm8uIElmIHRoZSBjb3JyZWN0IHZhbHVlIHdvdWxkIGNhdXNlIHVuZGVyZmxvdywKICAqIHplcm8gaXMgcmV0dXJuZWQgYW5kICVFUkFOR0UgaXMgc3RvcmVkIGluICVlcnJuby4KICAqIElmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLCAlRU5PTUVNIGlzIHN0b3JlZCBpbiAlZXJybm8uCi0gKiAKKyAqCiAgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyAlZXJybm8gYmVmb3JlIGNhbGxpbmcgc3RydG9kKCkgc28gdGhhdAogICogeW91IGNhbiByZWxpYWJseSBkZXRlY3Qgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdy4KICAqCkBAIC00MCwxNTEgKzQwLDE1MSBAQAogZG91YmxlCiBQeU9TX2FzY2lpX3N0cnRvZChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyKQogewotCWNoYXIgKmZhaWxfcG9zOwotCWRvdWJsZSB2YWwgPSAtMS4wOwotCXN0cnVjdCBsY29udiAqbG9jYWxlX2RhdGE7Ci0JY29uc3QgY2hhciAqZGVjaW1hbF9wb2ludDsKLQlzaXplX3QgZGVjaW1hbF9wb2ludF9sZW47Ci0JY29uc3QgY2hhciAqcCwgKmRlY2ltYWxfcG9pbnRfcG9zOwotCWNvbnN0IGNoYXIgKmVuZCA9IE5VTEw7IC8qIFNpbGVuY2UgZ2NjICovCi0JY29uc3QgY2hhciAqZGlnaXRzX3BvcyA9IE5VTEw7Ci0JaW50IG5lZ2F0ZSA9IDA7CisgICAgY2hhciAqZmFpbF9wb3M7CisgICAgZG91YmxlIHZhbCA9IC0xLjA7CisgICAgc3RydWN0IGxjb252ICpsb2NhbGVfZGF0YTsKKyAgICBjb25zdCBjaGFyICpkZWNpbWFsX3BvaW50OworICAgIHNpemVfdCBkZWNpbWFsX3BvaW50X2xlbjsKKyAgICBjb25zdCBjaGFyICpwLCAqZGVjaW1hbF9wb2ludF9wb3M7CisgICAgY29uc3QgY2hhciAqZW5kID0gTlVMTDsgLyogU2lsZW5jZSBnY2MgKi8KKyAgICBjb25zdCBjaGFyICpkaWdpdHNfcG9zID0gTlVMTDsKKyAgICBpbnQgbmVnYXRlID0gMDsKIAotCWFzc2VydChucHRyICE9IE5VTEwpOworICAgIGFzc2VydChucHRyICE9IE5VTEwpOwogCi0JZmFpbF9wb3MgPSBOVUxMOworICAgIGZhaWxfcG9zID0gTlVMTDsKIAotCWxvY2FsZV9kYXRhID0gbG9jYWxlY29udigpOwotCWRlY2ltYWxfcG9pbnQgPSBsb2NhbGVfZGF0YS0+ZGVjaW1hbF9wb2ludDsKLQlkZWNpbWFsX3BvaW50X2xlbiA9IHN0cmxlbihkZWNpbWFsX3BvaW50KTsKKyAgICBsb2NhbGVfZGF0YSA9IGxvY2FsZWNvbnYoKTsKKyAgICBkZWNpbWFsX3BvaW50ID0gbG9jYWxlX2RhdGEtPmRlY2ltYWxfcG9pbnQ7CisgICAgZGVjaW1hbF9wb2ludF9sZW4gPSBzdHJsZW4oZGVjaW1hbF9wb2ludCk7CiAKLQlhc3NlcnQoZGVjaW1hbF9wb2ludF9sZW4gIT0gMCk7CisgICAgYXNzZXJ0KGRlY2ltYWxfcG9pbnRfbGVuICE9IDApOwogCi0JZGVjaW1hbF9wb2ludF9wb3MgPSBOVUxMOworICAgIGRlY2ltYWxfcG9pbnRfcG9zID0gTlVMTDsKIAotCS8qIFdlIHByb2Nlc3MgYW55IGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgdGhlIG9wdGlvbmFsIHNpZ24gbWFudWFsbHksCi0JICAgdGhlbiBwYXNzIHRoZSByZW1haW5kZXIgdG8gdGhlIHN5c3RlbSBzdHJ0b2QuICBUaGlzIGVuc3VyZXMgdGhhdAotCSAgIHRoZSByZXN1bHQgb2YgYW4gdW5kZXJmbG93IGhhcyB0aGUgY29ycmVjdCBzaWduLiAoYnVnICMxNzI1KSAgKi8KKyAgICAvKiBXZSBwcm9jZXNzIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHRoZSBvcHRpb25hbCBzaWduIG1hbnVhbGx5LAorICAgICAgIHRoZW4gcGFzcyB0aGUgcmVtYWluZGVyIHRvIHRoZSBzeXN0ZW0gc3RydG9kLiAgVGhpcyBlbnN1cmVzIHRoYXQKKyAgICAgICB0aGUgcmVzdWx0IG9mIGFuIHVuZGVyZmxvdyBoYXMgdGhlIGNvcnJlY3Qgc2lnbi4gKGJ1ZyAjMTcyNSkgICovCiAKLQlwID0gbnB0cjsKLQkvKiBTa2lwIGxlYWRpbmcgc3BhY2UgKi8KLQl3aGlsZSAoSVNTUEFDRSgqcCkpCi0JCXArKzsKKyAgICBwID0gbnB0cjsKKyAgICAvKiBTa2lwIGxlYWRpbmcgc3BhY2UgKi8KKyAgICB3aGlsZSAoSVNTUEFDRSgqcCkpCisgICAgICAgIHArKzsKIAotCS8qIFByb2Nlc3MgbGVhZGluZyBzaWduLCBpZiBwcmVzZW50ICovCi0JaWYgKCpwID09ICctJykgewotCQluZWdhdGUgPSAxOwotCQlwKys7Ci0JfSBlbHNlIGlmICgqcCA9PSAnKycpIHsKLQkJcCsrOwotCX0KKyAgICAvKiBQcm9jZXNzIGxlYWRpbmcgc2lnbiwgaWYgcHJlc2VudCAqLworICAgIGlmICgqcCA9PSAnLScpIHsKKyAgICAgICAgbmVnYXRlID0gMTsKKyAgICAgICAgcCsrOworICAgIH0gZWxzZSBpZiAoKnAgPT0gJysnKSB7CisgICAgICAgIHArKzsKKyAgICB9CiAKLQkvKiBXaGF0J3MgbGVmdCBzaG91bGQgYmVnaW4gd2l0aCBhIGRpZ2l0LCBhIGRlY2ltYWwgcG9pbnQsIG9yIG9uZSBvZgotCSAgIHRoZSBsZXR0ZXJzIGksIEksIG4sIE4uIEl0IHNob3VsZCBub3QgYmVnaW4gd2l0aCAweCBvciAwWCAqLwotCWlmICgoIUlTRElHSVQoKnApICYmCi0JICAgICAqcCAhPSAnLicgJiYgKnAgIT0gJ2knICYmICpwICE9ICdJJyAmJiAqcCAhPSAnbicgJiYgKnAgIT0gJ04nKQotCSAgICB8fAotCSAgICAoKnAgPT0gJzAnICYmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJykpKQotCXsKLQkJaWYgKGVuZHB0cikKLQkJCSplbmRwdHIgPSAoY2hhciopbnB0cjsKLQkJZXJybm8gPSBFSU5WQUw7Ci0JCXJldHVybiB2YWw7Ci0JfQotCWRpZ2l0c19wb3MgPSBwOworICAgIC8qIFdoYXQncyBsZWZ0IHNob3VsZCBiZWdpbiB3aXRoIGEgZGlnaXQsIGEgZGVjaW1hbCBwb2ludCwgb3Igb25lIG9mCisgICAgICAgdGhlIGxldHRlcnMgaSwgSSwgbiwgTi4gSXQgc2hvdWxkIG5vdCBiZWdpbiB3aXRoIDB4IG9yIDBYICovCisgICAgaWYgKCghSVNESUdJVCgqcCkgJiYKKyAgICAgICAgICpwICE9ICcuJyAmJiAqcCAhPSAnaScgJiYgKnAgIT0gJ0knICYmICpwICE9ICduJyAmJiAqcCAhPSAnTicpCisgICAgICAgIHx8CisgICAgICAgICgqcCA9PSAnMCcgJiYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnKSkpCisgICAgeworICAgICAgICBpZiAoZW5kcHRyKQorICAgICAgICAgICAgKmVuZHB0ciA9IChjaGFyKilucHRyOworICAgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisgICAgZGlnaXRzX3BvcyA9IHA7CiAKLQlpZiAoZGVjaW1hbF9wb2ludFswXSAhPSAnLicgfHwgCi0JICAgIGRlY2ltYWxfcG9pbnRbMV0gIT0gMCkKLQl7Ci0JCXdoaWxlIChJU0RJR0lUKCpwKSkKLQkJCXArKzsKKyAgICBpZiAoZGVjaW1hbF9wb2ludFswXSAhPSAnLicgfHwKKyAgICAgICAgZGVjaW1hbF9wb2ludFsxXSAhPSAwKQorICAgIHsKKyAgICAgICAgd2hpbGUgKElTRElHSVQoKnApKQorICAgICAgICAgICAgcCsrOwogCi0JCWlmICgqcCA9PSAnLicpCi0JCXsKLQkJCWRlY2ltYWxfcG9pbnRfcG9zID0gcCsrOworICAgICAgICBpZiAoKnAgPT0gJy4nKQorICAgICAgICB7CisgICAgICAgICAgICBkZWNpbWFsX3BvaW50X3BvcyA9IHArKzsKIAotCQkJd2hpbGUgKElTRElHSVQoKnApKQotCQkJCXArKzsKKyAgICAgICAgICAgIHdoaWxlIChJU0RJR0lUKCpwKSkKKyAgICAgICAgICAgICAgICBwKys7CiAKLQkJCWlmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKQotCQkJCXArKzsKLQkJCWlmICgqcCA9PSAnKycgfHwgKnAgPT0gJy0nKQotCQkJCXArKzsKLQkJCXdoaWxlIChJU0RJR0lUKCpwKSkKLQkJCQlwKys7Ci0JCQllbmQgPSBwOwotCQl9Ci0JCWVsc2UgaWYgKHN0cm5jbXAocCwgZGVjaW1hbF9wb2ludCwgZGVjaW1hbF9wb2ludF9sZW4pID09IDApCi0JCXsKLQkJCS8qIFB5dGhvbiBidWcgIzE0MTc2OTkgKi8KLQkJCWlmIChlbmRwdHIpCi0JCQkJKmVuZHB0ciA9IChjaGFyKilucHRyOwotCQkJZXJybm8gPSBFSU5WQUw7Ci0JCQlyZXR1cm4gdmFsOwotCQl9Ci0JCS8qIEZvciB0aGUgb3RoZXIgY2FzZXMsIHdlIG5lZWQgbm90IGNvbnZlcnQgdGhlIGRlY2ltYWwKLQkJICAgcG9pbnQgKi8KLQl9CisgICAgICAgICAgICBpZiAoKnAgPT0gJ2UnIHx8ICpwID09ICdFJykKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICBpZiAoKnAgPT0gJysnIHx8ICpwID09ICctJykKKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB3aGlsZSAoSVNESUdJVCgqcCkpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgZW5kID0gcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJuY21wKHAsIGRlY2ltYWxfcG9pbnQsIGRlY2ltYWxfcG9pbnRfbGVuKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBQeXRob24gYnVnICMxNDE3Njk5ICovCisgICAgICAgICAgICBpZiAoZW5kcHRyKQorICAgICAgICAgICAgICAgICplbmRwdHIgPSAoY2hhciopbnB0cjsKKyAgICAgICAgICAgIGVycm5vID0gRUlOVkFMOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICAvKiBGb3IgdGhlIG90aGVyIGNhc2VzLCB3ZSBuZWVkIG5vdCBjb252ZXJ0IHRoZSBkZWNpbWFsCisgICAgICAgICAgIHBvaW50ICovCisgICAgfQogCi0JLyogU2V0IGVycm5vIHRvIHplcm8sIHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHplcm8gcmVzdWx0cwotCSAgIGFuZCB1bmRlcmZsb3dzICovCi0JZXJybm8gPSAwOworICAgIC8qIFNldCBlcnJubyB0byB6ZXJvLCBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB6ZXJvIHJlc3VsdHMKKyAgICAgICBhbmQgdW5kZXJmbG93cyAqLworICAgIGVycm5vID0gMDsKIAotCWlmIChkZWNpbWFsX3BvaW50X3BvcykKLQl7Ci0JCWNoYXIgKmNvcHksICpjOworICAgIGlmIChkZWNpbWFsX3BvaW50X3BvcykKKyAgICB7CisgICAgICAgIGNoYXIgKmNvcHksICpjOwogCi0JCS8qIFdlIG5lZWQgdG8gY29udmVydCB0aGUgJy4nIHRvIHRoZSBsb2NhbGUgc3BlY2lmaWMgZGVjaW1hbAotCQkgICBwb2ludCAqLwotCQljb3B5ID0gKGNoYXIgKilQeU1lbV9NQUxMT0MoZW5kIC0gZGlnaXRzX3BvcyArCi0JCQkJCSAgICAxICsgZGVjaW1hbF9wb2ludF9sZW4pOwotCQlpZiAoY29weSA9PSBOVUxMKSB7Ci0JCQlpZiAoZW5kcHRyKQotCQkJCSplbmRwdHIgPSAoY2hhciAqKW5wdHI7Ci0JCQllcnJubyA9IEVOT01FTTsKLQkJCXJldHVybiB2YWw7Ci0JCX0KKyAgICAgICAgLyogV2UgbmVlZCB0byBjb252ZXJ0IHRoZSAnLicgdG8gdGhlIGxvY2FsZSBzcGVjaWZpYyBkZWNpbWFsCisgICAgICAgICAgIHBvaW50ICovCisgICAgICAgIGNvcHkgPSAoY2hhciAqKVB5TWVtX01BTExPQyhlbmQgLSBkaWdpdHNfcG9zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBkZWNpbWFsX3BvaW50X2xlbik7CisgICAgICAgIGlmIChjb3B5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChlbmRwdHIpCisgICAgICAgICAgICAgICAgKmVuZHB0ciA9IChjaGFyICopbnB0cjsKKyAgICAgICAgICAgIGVycm5vID0gRU5PTUVNOworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQogCi0JCWMgPSBjb3B5OwotCQltZW1jcHkoYywgZGlnaXRzX3BvcywgZGVjaW1hbF9wb2ludF9wb3MgLSBkaWdpdHNfcG9zKTsKLQkJYyArPSBkZWNpbWFsX3BvaW50X3BvcyAtIGRpZ2l0c19wb3M7Ci0JCW1lbWNweShjLCBkZWNpbWFsX3BvaW50LCBkZWNpbWFsX3BvaW50X2xlbik7Ci0JCWMgKz0gZGVjaW1hbF9wb2ludF9sZW47Ci0JCW1lbWNweShjLCBkZWNpbWFsX3BvaW50X3BvcyArIDEsCi0JCSAgICAgICBlbmQgLSAoZGVjaW1hbF9wb2ludF9wb3MgKyAxKSk7Ci0JCWMgKz0gZW5kIC0gKGRlY2ltYWxfcG9pbnRfcG9zICsgMSk7Ci0JCSpjID0gMDsKKyAgICAgICAgYyA9IGNvcHk7CisgICAgICAgIG1lbWNweShjLCBkaWdpdHNfcG9zLCBkZWNpbWFsX3BvaW50X3BvcyAtIGRpZ2l0c19wb3MpOworICAgICAgICBjICs9IGRlY2ltYWxfcG9pbnRfcG9zIC0gZGlnaXRzX3BvczsKKyAgICAgICAgbWVtY3B5KGMsIGRlY2ltYWxfcG9pbnQsIGRlY2ltYWxfcG9pbnRfbGVuKTsKKyAgICAgICAgYyArPSBkZWNpbWFsX3BvaW50X2xlbjsKKyAgICAgICAgbWVtY3B5KGMsIGRlY2ltYWxfcG9pbnRfcG9zICsgMSwKKyAgICAgICAgICAgICAgIGVuZCAtIChkZWNpbWFsX3BvaW50X3BvcyArIDEpKTsKKyAgICAgICAgYyArPSBlbmQgLSAoZGVjaW1hbF9wb2ludF9wb3MgKyAxKTsKKyAgICAgICAgKmMgPSAwOwogCi0JCXZhbCA9IHN0cnRvZChjb3B5LCAmZmFpbF9wb3MpOworICAgICAgICB2YWwgPSBzdHJ0b2QoY29weSwgJmZhaWxfcG9zKTsKIAotCQlpZiAoZmFpbF9wb3MpCi0JCXsKLQkJCWlmIChmYWlsX3BvcyA+IGRlY2ltYWxfcG9pbnRfcG9zKQotCQkJCWZhaWxfcG9zID0gKGNoYXIgKilkaWdpdHNfcG9zICsKLQkJCQkJKGZhaWxfcG9zIC0gY29weSkgLQotCQkJCQkoZGVjaW1hbF9wb2ludF9sZW4gLSAxKTsKLQkJCWVsc2UKLQkJCQlmYWlsX3BvcyA9IChjaGFyICopZGlnaXRzX3BvcyArCi0JCQkJCShmYWlsX3BvcyAtIGNvcHkpOwotCQl9CisgICAgICAgIGlmIChmYWlsX3BvcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZhaWxfcG9zID4gZGVjaW1hbF9wb2ludF9wb3MpCisgICAgICAgICAgICAgICAgZmFpbF9wb3MgPSAoY2hhciAqKWRpZ2l0c19wb3MgKworICAgICAgICAgICAgICAgICAgICAoZmFpbF9wb3MgLSBjb3B5KSAtCisgICAgICAgICAgICAgICAgICAgIChkZWNpbWFsX3BvaW50X2xlbiAtIDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZhaWxfcG9zID0gKGNoYXIgKilkaWdpdHNfcG9zICsKKyAgICAgICAgICAgICAgICAgICAgKGZhaWxfcG9zIC0gY29weSk7CisgICAgICAgIH0KIAotCQlQeU1lbV9GUkVFKGNvcHkpOworICAgICAgICBQeU1lbV9GUkVFKGNvcHkpOwogCi0JfQotCWVsc2UgewotCQl2YWwgPSBzdHJ0b2QoZGlnaXRzX3BvcywgJmZhaWxfcG9zKTsKLQl9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB2YWwgPSBzdHJ0b2QoZGlnaXRzX3BvcywgJmZhaWxfcG9zKTsKKyAgICB9CiAKLQlpZiAoZmFpbF9wb3MgPT0gZGlnaXRzX3BvcykKLQkJZmFpbF9wb3MgPSAoY2hhciAqKW5wdHI7CisgICAgaWYgKGZhaWxfcG9zID09IGRpZ2l0c19wb3MpCisgICAgICAgIGZhaWxfcG9zID0gKGNoYXIgKilucHRyOwogCi0JaWYgKG5lZ2F0ZSAmJiBmYWlsX3BvcyAhPSBucHRyKQotCQl2YWwgPSAtdmFsOworICAgIGlmIChuZWdhdGUgJiYgZmFpbF9wb3MgIT0gbnB0cikKKyAgICAgICAgdmFsID0gLXZhbDsKIAotCWlmIChlbmRwdHIpCi0JCSplbmRwdHIgPSBmYWlsX3BvczsKKyAgICBpZiAoZW5kcHRyKQorICAgICAgICAqZW5kcHRyID0gZmFpbF9wb3M7CiAKLQlyZXR1cm4gdmFsOworICAgIHJldHVybiB2YWw7CiB9CiAKIC8qIEdpdmVuIGEgc3RyaW5nIHRoYXQgbWF5IGhhdmUgYSBkZWNpbWFsIHBvaW50IGluIHRoZSBjdXJyZW50CkBAIC0xOTMsMzAgKzE5MywzMCBAQAogUHlfTE9DQUxfSU5MSU5FKHZvaWQpCiBjaGFuZ2VfZGVjaW1hbF9mcm9tX2xvY2FsZV90b19kb3QoY2hhciogYnVmZmVyKQogewotCXN0cnVjdCBsY29udiAqbG9jYWxlX2RhdGEgPSBsb2NhbGVjb252KCk7Ci0JY29uc3QgY2hhciAqZGVjaW1hbF9wb2ludCA9IGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50OworICAgIHN0cnVjdCBsY29udiAqbG9jYWxlX2RhdGEgPSBsb2NhbGVjb252KCk7CisgICAgY29uc3QgY2hhciAqZGVjaW1hbF9wb2ludCA9IGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50OwogCi0JaWYgKGRlY2ltYWxfcG9pbnRbMF0gIT0gJy4nIHx8IGRlY2ltYWxfcG9pbnRbMV0gIT0gMCkgewotCQlzaXplX3QgZGVjaW1hbF9wb2ludF9sZW4gPSBzdHJsZW4oZGVjaW1hbF9wb2ludCk7CisgICAgaWYgKGRlY2ltYWxfcG9pbnRbMF0gIT0gJy4nIHx8IGRlY2ltYWxfcG9pbnRbMV0gIT0gMCkgeworICAgICAgICBzaXplX3QgZGVjaW1hbF9wb2ludF9sZW4gPSBzdHJsZW4oZGVjaW1hbF9wb2ludCk7CiAKLQkJaWYgKCpidWZmZXIgPT0gJysnIHx8ICpidWZmZXIgPT0gJy0nKQotCQkJYnVmZmVyKys7Ci0JCXdoaWxlIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCpidWZmZXIpKSkKLQkJCWJ1ZmZlcisrOwotCQlpZiAoc3RybmNtcChidWZmZXIsIGRlY2ltYWxfcG9pbnQsIGRlY2ltYWxfcG9pbnRfbGVuKSA9PSAwKSB7Ci0JCQkqYnVmZmVyID0gJy4nOwotCQkJYnVmZmVyKys7Ci0JCQlpZiAoZGVjaW1hbF9wb2ludF9sZW4gPiAxKSB7Ci0JCQkJLyogYnVmZmVyIG5lZWRzIHRvIGdldCBzbWFsbGVyICovCi0JCQkJc2l6ZV90IHJlc3RfbGVuID0gc3RybGVuKGJ1ZmZlciArCi0JCQkJCQkgICAgIChkZWNpbWFsX3BvaW50X2xlbiAtIDEpKTsKLQkJCQltZW1tb3ZlKGJ1ZmZlciwKLQkJCQkJYnVmZmVyICsgKGRlY2ltYWxfcG9pbnRfbGVuIC0gMSksCi0JCQkJCXJlc3RfbGVuKTsKLQkJCQlidWZmZXJbcmVzdF9sZW5dID0gMDsKLQkJCX0KLQkJfQotCX0KKyAgICAgICAgaWYgKCpidWZmZXIgPT0gJysnIHx8ICpidWZmZXIgPT0gJy0nKQorICAgICAgICAgICAgYnVmZmVyKys7CisgICAgICAgIHdoaWxlIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCpidWZmZXIpKSkKKyAgICAgICAgICAgIGJ1ZmZlcisrOworICAgICAgICBpZiAoc3RybmNtcChidWZmZXIsIGRlY2ltYWxfcG9pbnQsIGRlY2ltYWxfcG9pbnRfbGVuKSA9PSAwKSB7CisgICAgICAgICAgICAqYnVmZmVyID0gJy4nOworICAgICAgICAgICAgYnVmZmVyKys7CisgICAgICAgICAgICBpZiAoZGVjaW1hbF9wb2ludF9sZW4gPiAxKSB7CisgICAgICAgICAgICAgICAgLyogYnVmZmVyIG5lZWRzIHRvIGdldCBzbWFsbGVyICovCisgICAgICAgICAgICAgICAgc2l6ZV90IHJlc3RfbGVuID0gc3RybGVuKGJ1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2ltYWxfcG9pbnRfbGVuIC0gMSkpOworICAgICAgICAgICAgICAgIG1lbW1vdmUoYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyAoZGVjaW1hbF9wb2ludF9sZW4gLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgcmVzdF9sZW4pOworICAgICAgICAgICAgICAgIGJ1ZmZlcltyZXN0X2xlbl0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiAKQEAgLTIzMSw2NSArMjMxLDY1IEBACiBQeV9MT0NBTF9JTkxJTkUodm9pZCkKIGVuc3VyZV9taW5pbXVtX2V4cG9uZW50X2xlbmd0aChjaGFyKiBidWZmZXIsIHNpemVfdCBidWZfc2l6ZSkKIHsKLQljaGFyICpwID0gc3RycGJyayhidWZmZXIsICJlRSIpOwotCWlmIChwICYmICgqKHAgKyAxKSA9PSAnLScgfHwgKihwICsgMSkgPT0gJysnKSkgewotCQljaGFyICpzdGFydCA9IHAgKyAyOwotCQlpbnQgZXhwb25lbnRfZGlnaXRfY250ID0gMDsKLQkJaW50IGxlYWRpbmdfemVyb19jbnQgPSAwOwotCQlpbnQgaW5fbGVhZGluZ196ZXJvcyA9IDE7Ci0JCWludCBzaWduaWZpY2FudF9kaWdpdF9jbnQ7CisgICAgY2hhciAqcCA9IHN0cnBicmsoYnVmZmVyLCAiZUUiKTsKKyAgICBpZiAocCAmJiAoKihwICsgMSkgPT0gJy0nIHx8ICoocCArIDEpID09ICcrJykpIHsKKyAgICAgICAgY2hhciAqc3RhcnQgPSBwICsgMjsKKyAgICAgICAgaW50IGV4cG9uZW50X2RpZ2l0X2NudCA9IDA7CisgICAgICAgIGludCBsZWFkaW5nX3plcm9fY250ID0gMDsKKyAgICAgICAgaW50IGluX2xlYWRpbmdfemVyb3MgPSAxOworICAgICAgICBpbnQgc2lnbmlmaWNhbnRfZGlnaXRfY250OwogCi0JCS8qIFNraXAgb3ZlciB0aGUgZXhwb25lbnQgYW5kIHRoZSBzaWduLiAqLwotCQlwICs9IDI7CisgICAgICAgIC8qIFNraXAgb3ZlciB0aGUgZXhwb25lbnQgYW5kIHRoZSBzaWduLiAqLworICAgICAgICBwICs9IDI7CiAKLQkJLyogRmluZCB0aGUgZW5kIG9mIHRoZSBleHBvbmVudCwga2VlcGluZyB0cmFjayBvZiBsZWFkaW5nCi0JCSAgIHplcm9zLiAqLwotCQl3aGlsZSAoKnAgJiYgaXNkaWdpdChQeV9DSEFSTUFTSygqcCkpKSB7Ci0JCQlpZiAoaW5fbGVhZGluZ196ZXJvcyAmJiAqcCA9PSAnMCcpCi0JCQkJKytsZWFkaW5nX3plcm9fY250OwotCQkJaWYgKCpwICE9ICcwJykKLQkJCQlpbl9sZWFkaW5nX3plcm9zID0gMDsKLQkJCSsrcDsKLQkJCSsrZXhwb25lbnRfZGlnaXRfY250OwotCQl9CisgICAgICAgIC8qIEZpbmQgdGhlIGVuZCBvZiB0aGUgZXhwb25lbnQsIGtlZXBpbmcgdHJhY2sgb2YgbGVhZGluZworICAgICAgICAgICB6ZXJvcy4gKi8KKyAgICAgICAgd2hpbGUgKCpwICYmIGlzZGlnaXQoUHlfQ0hBUk1BU0soKnApKSkgeworICAgICAgICAgICAgaWYgKGluX2xlYWRpbmdfemVyb3MgJiYgKnAgPT0gJzAnKQorICAgICAgICAgICAgICAgICsrbGVhZGluZ196ZXJvX2NudDsKKyAgICAgICAgICAgIGlmICgqcCAhPSAnMCcpCisgICAgICAgICAgICAgICAgaW5fbGVhZGluZ196ZXJvcyA9IDA7CisgICAgICAgICAgICArK3A7CisgICAgICAgICAgICArK2V4cG9uZW50X2RpZ2l0X2NudDsKKyAgICAgICAgfQogCi0JCXNpZ25pZmljYW50X2RpZ2l0X2NudCA9IGV4cG9uZW50X2RpZ2l0X2NudCAtIGxlYWRpbmdfemVyb19jbnQ7Ci0JCWlmIChleHBvbmVudF9kaWdpdF9jbnQgPT0gTUlOX0VYUE9ORU5UX0RJR0lUUykgewotCQkJLyogSWYgdGhlcmUgYXJlIDIgZXhhY3RseSBkaWdpdHMsIHdlJ3JlIGRvbmUsCi0JCQkgICByZWdhcmRsZXNzIG9mIHdoYXQgdGhleSBjb250YWluICovCi0JCX0KLQkJZWxzZSBpZiAoZXhwb25lbnRfZGlnaXRfY250ID4gTUlOX0VYUE9ORU5UX0RJR0lUUykgewotCQkJaW50IGV4dHJhX3plcm9zX2NudDsKKyAgICAgICAgc2lnbmlmaWNhbnRfZGlnaXRfY250ID0gZXhwb25lbnRfZGlnaXRfY250IC0gbGVhZGluZ196ZXJvX2NudDsKKyAgICAgICAgaWYgKGV4cG9uZW50X2RpZ2l0X2NudCA9PSBNSU5fRVhQT05FTlRfRElHSVRTKSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSBhcmUgMiBleGFjdGx5IGRpZ2l0cywgd2UncmUgZG9uZSwKKyAgICAgICAgICAgICAgIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGV5IGNvbnRhaW4gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChleHBvbmVudF9kaWdpdF9jbnQgPiBNSU5fRVhQT05FTlRfRElHSVRTKSB7CisgICAgICAgICAgICBpbnQgZXh0cmFfemVyb3NfY250OwogCi0JCQkvKiBUaGVyZSBhcmUgbW9yZSB0aGFuIDIgZGlnaXRzIGluIHRoZSBleHBvbmVudC4gIFNlZQotCQkJICAgaWYgd2UgY2FuIGRlbGV0ZSBzb21lIG9mIHRoZSBsZWFkaW5nIHplcm9zICovCi0JCQlpZiAoc2lnbmlmaWNhbnRfZGlnaXRfY250IDwgTUlOX0VYUE9ORU5UX0RJR0lUUykKLQkJCQlzaWduaWZpY2FudF9kaWdpdF9jbnQgPSBNSU5fRVhQT05FTlRfRElHSVRTOwotCQkJZXh0cmFfemVyb3NfY250ID0gZXhwb25lbnRfZGlnaXRfY250IC0KLQkJCQlzaWduaWZpY2FudF9kaWdpdF9jbnQ7CisgICAgICAgICAgICAvKiBUaGVyZSBhcmUgbW9yZSB0aGFuIDIgZGlnaXRzIGluIHRoZSBleHBvbmVudC4gIFNlZQorICAgICAgICAgICAgICAgaWYgd2UgY2FuIGRlbGV0ZSBzb21lIG9mIHRoZSBsZWFkaW5nIHplcm9zICovCisgICAgICAgICAgICBpZiAoc2lnbmlmaWNhbnRfZGlnaXRfY250IDwgTUlOX0VYUE9ORU5UX0RJR0lUUykKKyAgICAgICAgICAgICAgICBzaWduaWZpY2FudF9kaWdpdF9jbnQgPSBNSU5fRVhQT05FTlRfRElHSVRTOworICAgICAgICAgICAgZXh0cmFfemVyb3NfY250ID0gZXhwb25lbnRfZGlnaXRfY250IC0KKyAgICAgICAgICAgICAgICBzaWduaWZpY2FudF9kaWdpdF9jbnQ7CiAKLQkJCS8qIERlbGV0ZSBleHRyYV96ZXJvc19jbnQgd29ydGggb2YgY2hhcmFjdGVycyBmcm9tIHRoZQotCQkJICAgZnJvbnQgb2YgdGhlIGV4cG9uZW50ICovCi0JCQlhc3NlcnQoZXh0cmFfemVyb3NfY250ID49IDApOworICAgICAgICAgICAgLyogRGVsZXRlIGV4dHJhX3plcm9zX2NudCB3b3J0aCBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlCisgICAgICAgICAgICAgICBmcm9udCBvZiB0aGUgZXhwb25lbnQgKi8KKyAgICAgICAgICAgIGFzc2VydChleHRyYV96ZXJvc19jbnQgPj0gMCk7CiAKLQkJCS8qIEFkZCBvbmUgdG8gc2lnbmlmaWNhbnRfZGlnaXRfY250IHRvIGNvcHkgdGhlCi0JCQkgICB0cmFpbGluZyAwIGJ5dGUsIHRodXMgc2V0dGluZyB0aGUgbGVuZ3RoICovCi0JCQltZW1tb3ZlKHN0YXJ0LAotCQkJCXN0YXJ0ICsgZXh0cmFfemVyb3NfY250LAotCQkJCXNpZ25pZmljYW50X2RpZ2l0X2NudCArIDEpOwotCQl9Ci0JCWVsc2UgewotCQkJLyogSWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gMiBkaWdpdHMsIGFkZCB6ZXJvcwotCQkJICAgdW50aWwgdGhlcmUgYXJlIDIsIGlmIHRoZXJlJ3MgZW5vdWdoIHJvb20gKi8KLQkJCWludCB6ZXJvcyA9IE1JTl9FWFBPTkVOVF9ESUdJVFMgLSBleHBvbmVudF9kaWdpdF9jbnQ7Ci0JCQlpZiAoc3RhcnQgKyB6ZXJvcyArIGV4cG9uZW50X2RpZ2l0X2NudCArIDEKLQkJCSAgICAgIDwgYnVmZmVyICsgYnVmX3NpemUpIHsKLQkJCQltZW1tb3ZlKHN0YXJ0ICsgemVyb3MsIHN0YXJ0LAotCQkJCQlleHBvbmVudF9kaWdpdF9jbnQgKyAxKTsKLQkJCQltZW1zZXQoc3RhcnQsICcwJywgemVyb3MpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgLyogQWRkIG9uZSB0byBzaWduaWZpY2FudF9kaWdpdF9jbnQgdG8gY29weSB0aGUKKyAgICAgICAgICAgICAgIHRyYWlsaW5nIDAgYnl0ZSwgdGh1cyBzZXR0aW5nIHRoZSBsZW5ndGggKi8KKyAgICAgICAgICAgIG1lbW1vdmUoc3RhcnQsCisgICAgICAgICAgICAgICAgc3RhcnQgKyBleHRyYV96ZXJvc19jbnQsCisgICAgICAgICAgICAgICAgc2lnbmlmaWNhbnRfZGlnaXRfY250ICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbiAyIGRpZ2l0cywgYWRkIHplcm9zCisgICAgICAgICAgICAgICB1bnRpbCB0aGVyZSBhcmUgMiwgaWYgdGhlcmUncyBlbm91Z2ggcm9vbSAqLworICAgICAgICAgICAgaW50IHplcm9zID0gTUlOX0VYUE9ORU5UX0RJR0lUUyAtIGV4cG9uZW50X2RpZ2l0X2NudDsKKyAgICAgICAgICAgIGlmIChzdGFydCArIHplcm9zICsgZXhwb25lbnRfZGlnaXRfY250ICsgMQorICAgICAgICAgICAgICAgICAgPCBidWZmZXIgKyBidWZfc2l6ZSkgeworICAgICAgICAgICAgICAgIG1lbW1vdmUoc3RhcnQgKyB6ZXJvcywgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50X2RpZ2l0X2NudCArIDEpOworICAgICAgICAgICAgICAgIG1lbXNldChzdGFydCwgJzAnLCB6ZXJvcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8qIEVuc3VyZSB0aGF0IGJ1ZmZlciBoYXMgYSBkZWNpbWFsIHBvaW50IGluIGl0LiAgVGhlIGRlY2ltYWwgcG9pbnQKQEAgLTI5Nyw0OCArMjk3LDQ4IEBACiBQeV9MT0NBTF9JTkxJTkUodm9pZCkKIGVuc3VyZV9kZWNpbWFsX3BvaW50KGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGJ1Zl9zaXplKQogewotCWludCBpbnNlcnRfY291bnQgPSAwOwotCWNoYXIqIGNoYXJzX3RvX2luc2VydDsKKyAgICBpbnQgaW5zZXJ0X2NvdW50ID0gMDsKKyAgICBjaGFyKiBjaGFyc190b19pbnNlcnQ7CiAKLQkvKiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBub24tZGlnaXQgY2hhcmFjdGVyICovCi0JY2hhciAqcCA9IGJ1ZmZlcjsKLQlpZiAoKnAgPT0gJy0nIHx8ICpwID09ICcrJykKLQkJLyogU2tpcCBsZWFkaW5nIHNpZ24sIGlmIHByZXNlbnQuICBJIHRoaW5rIHRoaXMgY291bGQgb25seQotCQkgICBldmVyIGJlICctJywgYnV0IGl0IGNhbid0IGh1cnQgdG8gY2hlY2sgZm9yIGJvdGguICovCi0JCSsrcDsKLQl3aGlsZSAoKnAgJiYgaXNkaWdpdChQeV9DSEFSTUFTSygqcCkpKQotCQkrK3A7CisgICAgLyogc2VhcmNoIGZvciB0aGUgZmlyc3Qgbm9uLWRpZ2l0IGNoYXJhY3RlciAqLworICAgIGNoYXIgKnAgPSBidWZmZXI7CisgICAgaWYgKCpwID09ICctJyB8fCAqcCA9PSAnKycpCisgICAgICAgIC8qIFNraXAgbGVhZGluZyBzaWduLCBpZiBwcmVzZW50LiAgSSB0aGluayB0aGlzIGNvdWxkIG9ubHkKKyAgICAgICAgICAgZXZlciBiZSAnLScsIGJ1dCBpdCBjYW4ndCBodXJ0IHRvIGNoZWNrIGZvciBib3RoLiAqLworICAgICAgICArK3A7CisgICAgd2hpbGUgKCpwICYmIGlzZGlnaXQoUHlfQ0hBUk1BU0soKnApKSkKKyAgICAgICAgKytwOwogCi0JaWYgKCpwID09ICcuJykgewotCQlpZiAoaXNkaWdpdChQeV9DSEFSTUFTSygqKHArMSkpKSkgewotCQkJLyogTm90aGluZyB0byBkbywgd2UgYWxyZWFkeSBoYXZlIGEgZGVjaW1hbAotCQkJICAgcG9pbnQgYW5kIGEgZGlnaXQgYWZ0ZXIgaXQgKi8KLQkJfQotCQllbHNlIHsKLQkJCS8qIFdlIGhhdmUgYSBkZWNpbWFsIHBvaW50LCBidXQgbm8gZm9sbG93aW5nCi0JCQkgICBkaWdpdC4gIEluc2VydCBhIHplcm8gYWZ0ZXIgdGhlIGRlY2ltYWwuICovCi0JCQkrK3A7Ci0JCQljaGFyc190b19pbnNlcnQgPSAiMCI7Ci0JCQlpbnNlcnRfY291bnQgPSAxOwotCQl9Ci0JfQotCWVsc2UgewotCQljaGFyc190b19pbnNlcnQgPSAiLjAiOwotCQlpbnNlcnRfY291bnQgPSAyOwotCX0KLQlpZiAoaW5zZXJ0X2NvdW50KSB7Ci0JCXNpemVfdCBidWZfbGVuID0gc3RybGVuKGJ1ZmZlcik7Ci0JCWlmIChidWZfbGVuICsgaW5zZXJ0X2NvdW50ICsgMSA+PSBidWZfc2l6ZSkgewotCQkJLyogSWYgdGhlcmUgaXMgbm90IGVub3VnaCByb29tIGluIHRoZSBidWZmZXIKLQkJCSAgIGZvciB0aGUgYWRkaXRpb25hbCB0ZXh0LCBqdXN0IHNraXAgaXQuICBJdCdzCi0JCQkgICBub3Qgd29ydGggZ2VuZXJhdGluZyBhbiBlcnJvciBvdmVyLiAqLwotCQl9Ci0JCWVsc2UgewotCQkJbWVtbW92ZShwICsgaW5zZXJ0X2NvdW50LCBwLAotCQkJCWJ1ZmZlciArIHN0cmxlbihidWZmZXIpIC0gcCArIDEpOwotCQkJbWVtY3B5KHAsIGNoYXJzX3RvX2luc2VydCwgaW5zZXJ0X2NvdW50KTsKLQkJfQotCX0KKyAgICBpZiAoKnAgPT0gJy4nKSB7CisgICAgICAgIGlmIChpc2RpZ2l0KFB5X0NIQVJNQVNLKCoocCsxKSkpKSB7CisgICAgICAgICAgICAvKiBOb3RoaW5nIHRvIGRvLCB3ZSBhbHJlYWR5IGhhdmUgYSBkZWNpbWFsCisgICAgICAgICAgICAgICBwb2ludCBhbmQgYSBkaWdpdCBhZnRlciBpdCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogV2UgaGF2ZSBhIGRlY2ltYWwgcG9pbnQsIGJ1dCBubyBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgIGRpZ2l0LiAgSW5zZXJ0IGEgemVybyBhZnRlciB0aGUgZGVjaW1hbC4gKi8KKyAgICAgICAgICAgICsrcDsKKyAgICAgICAgICAgIGNoYXJzX3RvX2luc2VydCA9ICIwIjsKKyAgICAgICAgICAgIGluc2VydF9jb3VudCA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNoYXJzX3RvX2luc2VydCA9ICIuMCI7CisgICAgICAgIGluc2VydF9jb3VudCA9IDI7CisgICAgfQorICAgIGlmIChpbnNlcnRfY291bnQpIHsKKyAgICAgICAgc2l6ZV90IGJ1Zl9sZW4gPSBzdHJsZW4oYnVmZmVyKTsKKyAgICAgICAgaWYgKGJ1Zl9sZW4gKyBpbnNlcnRfY291bnQgKyAxID49IGJ1Zl9zaXplKSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgZm9yIHRoZSBhZGRpdGlvbmFsIHRleHQsIGp1c3Qgc2tpcCBpdC4gIEl0J3MKKyAgICAgICAgICAgICAgIG5vdCB3b3J0aCBnZW5lcmF0aW5nIGFuIGVycm9yIG92ZXIuICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtZW1tb3ZlKHAgKyBpbnNlcnRfY291bnQsIHAsCisgICAgICAgICAgICAgICAgYnVmZmVyICsgc3RybGVuKGJ1ZmZlcikgLSBwICsgMSk7CisgICAgICAgICAgICBtZW1jcHkocCwgY2hhcnNfdG9faW5zZXJ0LCBpbnNlcnRfY291bnQpOworICAgICAgICB9CisgICAgfQogfQogCiAvKiBBZGQgdGhlIGxvY2FsZSBzcGVjaWZpYyBncm91cGluZyBjaGFyYWN0ZXJzIHRvIGJ1ZmZlci4gIE5vdGUKQEAgLTM0NywyOSArMzQ3LDI5IEBACiBQeV9MT0NBTF9JTkxJTkUoaW50KQogYWRkX3Rob3VzYW5kc19ncm91cGluZyhjaGFyKiBidWZmZXIsIHNpemVfdCBidWZfc2l6ZSkKIHsKLQlQeV9zc2l6ZV90IGxlbiA9IHN0cmxlbihidWZmZXIpOwotCXN0cnVjdCBsY29udiAqbG9jYWxlX2RhdGEgPSBsb2NhbGVjb252KCk7Ci0JY29uc3QgY2hhciAqZGVjaW1hbF9wb2ludCA9IGxvY2FsZV9kYXRhLT5kZWNpbWFsX3BvaW50OworICAgIFB5X3NzaXplX3QgbGVuID0gc3RybGVuKGJ1ZmZlcik7CisgICAgc3RydWN0IGxjb252ICpsb2NhbGVfZGF0YSA9IGxvY2FsZWNvbnYoKTsKKyAgICBjb25zdCBjaGFyICpkZWNpbWFsX3BvaW50ID0gbG9jYWxlX2RhdGEtPmRlY2ltYWxfcG9pbnQ7CiAKLQkvKiBGaW5kIHRoZSBkZWNpbWFsIHBvaW50LCBpZiBhbnkuICBXZSdyZSBvbmx5IGNvbmNlcm5lZAotCSAgIGFib3V0IHRoZSBjaGFyYWN0ZXJzIHRvIHRoZSBsZWZ0IG9mIHRoZSBkZWNpbWFsIHdoZW4KLQkgICBhZGRpbmcgZ3JvdXBpbmcuICovCi0JY2hhciAqcCA9IHN0cnN0cihidWZmZXIsIGRlY2ltYWxfcG9pbnQpOwotCWlmICghcCkgewotCQkvKiBObyBkZWNpbWFsLCB1c2UgdGhlIGVudGlyZSBzdHJpbmcuICovCisgICAgLyogRmluZCB0aGUgZGVjaW1hbCBwb2ludCwgaWYgYW55LiAgV2UncmUgb25seSBjb25jZXJuZWQKKyAgICAgICBhYm91dCB0aGUgY2hhcmFjdGVycyB0byB0aGUgbGVmdCBvZiB0aGUgZGVjaW1hbCB3aGVuCisgICAgICAgYWRkaW5nIGdyb3VwaW5nLiAqLworICAgIGNoYXIgKnAgPSBzdHJzdHIoYnVmZmVyLCBkZWNpbWFsX3BvaW50KTsKKyAgICBpZiAoIXApIHsKKyAgICAgICAgLyogTm8gZGVjaW1hbCwgdXNlIHRoZSBlbnRpcmUgc3RyaW5nLiAqLwogCi0JCS8qIElmIGFueSBleHBvbmVudCwgYWRqdXN0IHAuICovCi0JCXAgPSBzdHJwYnJrKGJ1ZmZlciwgImVFIik7Ci0JCWlmICghcCkKLQkJCS8qIE5vIGV4cG9uZW50IGFuZCBubyBkZWNpbWFsLiAgVXNlIHRoZSBlbnRpcmUKLQkJCSAgIHN0cmluZy4gKi8KLQkJCXAgPSBidWZmZXIgKyBsZW47Ci0JfQotCS8qIEF0IHRoaXMgcG9pbnQsIHAgcG9pbnRzIGp1c3QgcGFzdCB0aGUgcmlnaHQtbW9zdCBjaGFyYWN0ZXIgd2UKLQkgICB3YW50IHRvIGZvcm1hdC4gIFdlIG5lZWQgdG8gYWRkIHRoZSBncm91cGluZyBzdHJpbmcgZm9yIHRoZQotCSAgIGNoYXJhY3RlcnMgYmV0d2VlbiBidWZmZXIgYW5kIHAuICovCi0JcmV0dXJuIF9QeVN0cmluZ19JbnNlcnRUaG91c2FuZHNHcm91cGluZyhidWZmZXIsIGxlbiwgcC1idWZmZXIsCi0JCQkJCQkgYnVmX3NpemUsIE5VTEwsIDEpOworICAgICAgICAvKiBJZiBhbnkgZXhwb25lbnQsIGFkanVzdCBwLiAqLworICAgICAgICBwID0gc3RycGJyayhidWZmZXIsICJlRSIpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICAvKiBObyBleHBvbmVudCBhbmQgbm8gZGVjaW1hbC4gIFVzZSB0aGUgZW50aXJlCisgICAgICAgICAgICAgICBzdHJpbmcuICovCisgICAgICAgICAgICBwID0gYnVmZmVyICsgbGVuOworICAgIH0KKyAgICAvKiBBdCB0aGlzIHBvaW50LCBwIHBvaW50cyBqdXN0IHBhc3QgdGhlIHJpZ2h0LW1vc3QgY2hhcmFjdGVyIHdlCisgICAgICAgd2FudCB0byBmb3JtYXQuICBXZSBuZWVkIHRvIGFkZCB0aGUgZ3JvdXBpbmcgc3RyaW5nIGZvciB0aGUKKyAgICAgICBjaGFyYWN0ZXJzIGJldHdlZW4gYnVmZmVyIGFuZCBwLiAqLworICAgIHJldHVybiBfUHlTdHJpbmdfSW5zZXJ0VGhvdXNhbmRzR3JvdXBpbmcoYnVmZmVyLCBsZW4sIHAtYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUsIE5VTEwsIDEpOwogfQogCiAvKiBzZWUgRk9STUFUQlVGTEVOIGluIHVuaWNvZGVvYmplY3QuYyAqLwpAQCAtMzgwLDE0ICszODAsMTQgQEAKICAqIEBidWZmZXI6IEEgYnVmZmVyIHRvIHBsYWNlIHRoZSByZXN1bHRpbmcgc3RyaW5nIGluCiAgKiBAYnVmX3NpemU6IFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4KICAqIEBmb3JtYXQ6IFRoZSBwcmludGYoKS1zdHlsZSBmb3JtYXQgdG8gdXNlIGZvciB0aGUKLSAqICAgICAgICAgIGNvZGUgdG8gdXNlIGZvciBjb252ZXJ0aW5nLiAKKyAqICAgICAgICAgIGNvZGUgdG8gdXNlIGZvciBjb252ZXJ0aW5nLgogICogQGQ6IFRoZSAjZ2RvdWJsZSB0byBjb252ZXJ0CiAgKgogICogQ29udmVydHMgYSAjZ2RvdWJsZSB0byBhIHN0cmluZywgdXNpbmcgdGhlICcuJyBhcwogICogZGVjaW1hbCBwb2ludC4gVG8gZm9ybWF0IHRoZSBudW1iZXIgeW91IHBhc3MgaW4KICAqIGEgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZy4gQWxsb3dlZCBjb252ZXJzaW9uCiAgKiBzcGVjaWZpZXJzIGFyZSAnZScsICdFJywgJ2YnLCAnRicsICdnJywgJ0cnLCBhbmQgJ24nLgotICogCisgKgogICogJ24nIGlzIHRoZSBzYW1lIGFzICdnJywgZXhjZXB0IGl0IHVzZXMgdGhlIGN1cnJlbnQgbG9jYWxlLgogICogJ1onIGlzIHRoZSBzYW1lIGFzICdnJywgZXhjZXB0IGl0IGFsd2F5cyBoYXMgYSBkZWNpbWFsIGFuZAogICogICAgIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciB0aGUgZGVjaW1hbC4KQEAgLTM5NSw5NiArMzk1LDk2IEBACiAgKiBSZXR1cm4gdmFsdWU6IFRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgd2l0aCB0aGUgY29udmVydGVkIHN0cmluZy4KICAqKi8KIGNoYXIgKgotUHlPU19hc2NpaV9mb3JtYXRkKGNoYXIgICAgICAgKmJ1ZmZlciwgCi0JCSAgIHNpemVfdCAgICAgIGJ1Zl9zaXplLCAKLQkJICAgY29uc3QgY2hhciAqZm9ybWF0LCAKLQkJICAgZG91YmxlICAgICAgZCkKK1B5T1NfYXNjaWlfZm9ybWF0ZChjaGFyICAgICAgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgIGQpCiB7Ci0JY2hhciBmb3JtYXRfY2hhcjsKLQlzaXplX3QgZm9ybWF0X2xlbiA9IHN0cmxlbihmb3JtYXQpOworICAgIGNoYXIgZm9ybWF0X2NoYXI7CisgICAgc2l6ZV90IGZvcm1hdF9sZW4gPSBzdHJsZW4oZm9ybWF0KTsKIAotCS8qIEZvciB0eXBlICduJywgd2UgbmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgZm9ybWF0IHN0cmluZywgYmVjYXVzZQotCSAgIHdlJ3JlIGdvaW5nIHRvIG1vZGlmeSAnbicgLT4gJ2cnLCBhbmQgZm9ybWF0IGlzIGNvbnN0IGNoYXIqLCBzbyB3ZQotCSAgIGNhbid0IG1vZGlmeSBpdCBkaXJlY3RseS4gIEZMT0FUX0ZPUk1BVEJVRkxFTiBzaG91bGQgYmUgbG9uZ2VyIHRoYW4KLQkgICB3ZSBldmVyIG5lZWQgdGhpcyB0byBiZS4gIFRoZXJlJ3MgYW4gdXBjb21pbmcgY2hlY2sgdG8gZW5zdXJlIGl0J3MKLQkgICBiaWcgZW5vdWdoLiAqLwotCS8qIElzc3VlIDIyNjQ6IGNvZGUgJ1onIHJlcXVpcmVzIGNvcHlpbmcgdGhlIGZvcm1hdC4gICdaJyBpcyAnZycsIGJ1dAotCSAgIGFsc28gd2l0aCBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIHBhc3QgdGhlIGRlY2ltYWwuICovCi0JY2hhciB0bXBfZm9ybWF0W0ZMT0FUX0ZPUk1BVEJVRkxFTl07CisgICAgLyogRm9yIHR5cGUgJ24nLCB3ZSBuZWVkIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBiZWNhdXNlCisgICAgICAgd2UncmUgZ29pbmcgdG8gbW9kaWZ5ICduJyAtPiAnZycsIGFuZCBmb3JtYXQgaXMgY29uc3QgY2hhciosIHNvIHdlCisgICAgICAgY2FuJ3QgbW9kaWZ5IGl0IGRpcmVjdGx5LiAgRkxPQVRfRk9STUFUQlVGTEVOIHNob3VsZCBiZSBsb25nZXIgdGhhbgorICAgICAgIHdlIGV2ZXIgbmVlZCB0aGlzIHRvIGJlLiAgVGhlcmUncyBhbiB1cGNvbWluZyBjaGVjayB0byBlbnN1cmUgaXQncworICAgICAgIGJpZyBlbm91Z2guICovCisgICAgLyogSXNzdWUgMjI2NDogY29kZSAnWicgcmVxdWlyZXMgY29weWluZyB0aGUgZm9ybWF0LiAgJ1onIGlzICdnJywgYnV0CisgICAgICAgYWxzbyB3aXRoIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgcGFzdCB0aGUgZGVjaW1hbC4gKi8KKyAgICBjaGFyIHRtcF9mb3JtYXRbRkxPQVRfRk9STUFUQlVGTEVOXTsKIAotCS8qIFRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgZm9ybWF0IHN0cmluZyBtdXN0IGJlIHRoZSBmb3JtYXQgY2hhciAqLwotCWZvcm1hdF9jaGFyID0gZm9ybWF0W2Zvcm1hdF9sZW4gLSAxXTsKKyAgICAvKiBUaGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGZvcm1hdCBzdHJpbmcgbXVzdCBiZSB0aGUgZm9ybWF0IGNoYXIgKi8KKyAgICBmb3JtYXRfY2hhciA9IGZvcm1hdFtmb3JtYXRfbGVuIC0gMV07CiAKLQlpZiAoZm9ybWF0WzBdICE9ICclJykKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKGZvcm1hdFswXSAhPSAnJScpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogSSdtIG5vdCBzdXJlIHdoeSB0aGlzIHRlc3QgaXMgaGVyZS4gIEl0J3MgZW5zdXJpbmcgdGhhdCB0aGUgZm9ybWF0Ci0JICAgc3RyaW5nIGFmdGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZG9lc24ndCBoYXZlIGEgc2luZ2xlIHF1b3RlLCBhCi0JICAgbG93ZXJjYXNlIGwsIG9yIGEgcGVyY2VudC4gVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUgY29tbWVudGVkLW91dAotCSAgIHRlc3QgYWJvdXQgMTAgbGluZXMgYWdvLiAqLwotCWlmIChzdHJwYnJrKGZvcm1hdCArIDEsICInbCUiKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogSSdtIG5vdCBzdXJlIHdoeSB0aGlzIHRlc3QgaXMgaGVyZS4gIEl0J3MgZW5zdXJpbmcgdGhhdCB0aGUgZm9ybWF0CisgICAgICAgc3RyaW5nIGFmdGVyIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZG9lc24ndCBoYXZlIGEgc2luZ2xlIHF1b3RlLCBhCisgICAgICAgbG93ZXJjYXNlIGwsIG9yIGEgcGVyY2VudC4gVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUgY29tbWVudGVkLW91dAorICAgICAgIHRlc3QgYWJvdXQgMTAgbGluZXMgYWdvLiAqLworICAgIGlmIChzdHJwYnJrKGZvcm1hdCArIDEsICInbCUiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBBbHNvIGN1cmlvdXMgYWJvdXQgdGhpcyBmdW5jdGlvbiBpcyB0aGF0IGl0IGFjY2VwdHMgZm9ybWF0IHN0cmluZ3MKLQkgICBsaWtlICIleGciLCB3aGljaCBhcmUgaW52YWxpZCBmb3IgZmxvYXRzLiAgSW4gZ2VuZXJhbCwgdGhlCi0JICAgaW50ZXJmYWNlIHRvIHRoaXMgZnVuY3Rpb24gaXMgbm90IHZlcnkgZ29vZCwgYnV0IGNoYW5naW5nIGl0IGlzCi0JICAgZGlmZmljdWx0IGJlY2F1c2UgaXQncyBhIHB1YmxpYyBBUEkuICovCisgICAgLyogQWxzbyBjdXJpb3VzIGFib3V0IHRoaXMgZnVuY3Rpb24gaXMgdGhhdCBpdCBhY2NlcHRzIGZvcm1hdCBzdHJpbmdzCisgICAgICAgbGlrZSAiJXhnIiwgd2hpY2ggYXJlIGludmFsaWQgZm9yIGZsb2F0cy4gIEluIGdlbmVyYWwsIHRoZQorICAgICAgIGludGVyZmFjZSB0byB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB2ZXJ5IGdvb2QsIGJ1dCBjaGFuZ2luZyBpdCBpcworICAgICAgIGRpZmZpY3VsdCBiZWNhdXNlIGl0J3MgYSBwdWJsaWMgQVBJLiAqLwogCi0JaWYgKCEoZm9ybWF0X2NoYXIgPT0gJ2UnIHx8IGZvcm1hdF9jaGFyID09ICdFJyB8fCAKLQkgICAgICBmb3JtYXRfY2hhciA9PSAnZicgfHwgZm9ybWF0X2NoYXIgPT0gJ0YnIHx8IAotCSAgICAgIGZvcm1hdF9jaGFyID09ICdnJyB8fCBmb3JtYXRfY2hhciA9PSAnRycgfHwKLQkgICAgICBmb3JtYXRfY2hhciA9PSAnbicgfHwgZm9ybWF0X2NoYXIgPT0gJ1onKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgaWYgKCEoZm9ybWF0X2NoYXIgPT0gJ2UnIHx8IGZvcm1hdF9jaGFyID09ICdFJyB8fAorICAgICAgICAgIGZvcm1hdF9jaGFyID09ICdmJyB8fCBmb3JtYXRfY2hhciA9PSAnRicgfHwKKyAgICAgICAgICBmb3JtYXRfY2hhciA9PSAnZycgfHwgZm9ybWF0X2NoYXIgPT0gJ0cnIHx8CisgICAgICAgICAgZm9ybWF0X2NoYXIgPT0gJ24nIHx8IGZvcm1hdF9jaGFyID09ICdaJykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogTWFwICduJyBvciAnWicgZm9ybWF0X2NoYXIgdG8gJ2cnLCBieSBjb3B5aW5nIHRoZSBmb3JtYXQgc3RyaW5nIGFuZAotCSAgIHJlcGxhY2luZyB0aGUgZmluYWwgY2hhciB3aXRoIGEgJ2cnICovCi0JaWYgKGZvcm1hdF9jaGFyID09ICduJyB8fCBmb3JtYXRfY2hhciA9PSAnWicpIHsKLQkJaWYgKGZvcm1hdF9sZW4gKyAxID49IHNpemVvZih0bXBfZm9ybWF0KSkgewotCQkJLyogVGhlIGZvcm1hdCB3b24ndCBmaXQgaW4gb3VyIGNvcHkuICBFcnJvciBvdXQuICBJbgotCQkJICAgcHJhY3RpY2UsIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gYW5kIHdpbGwgYmUKLQkJCSAgIGRldGVjdGVkIGJ5IHJldHVybmluZyBOVUxMICovCi0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlzdHJjcHkodG1wX2Zvcm1hdCwgZm9ybWF0KTsKLQkJdG1wX2Zvcm1hdFtmb3JtYXRfbGVuIC0gMV0gPSAnZyc7Ci0JCWZvcm1hdCA9IHRtcF9mb3JtYXQ7Ci0JfQorICAgIC8qIE1hcCAnbicgb3IgJ1onIGZvcm1hdF9jaGFyIHRvICdnJywgYnkgY29weWluZyB0aGUgZm9ybWF0IHN0cmluZyBhbmQKKyAgICAgICByZXBsYWNpbmcgdGhlIGZpbmFsIGNoYXIgd2l0aCBhICdnJyAqLworICAgIGlmIChmb3JtYXRfY2hhciA9PSAnbicgfHwgZm9ybWF0X2NoYXIgPT0gJ1onKSB7CisgICAgICAgIGlmIChmb3JtYXRfbGVuICsgMSA+PSBzaXplb2YodG1wX2Zvcm1hdCkpIHsKKyAgICAgICAgICAgIC8qIFRoZSBmb3JtYXQgd29uJ3QgZml0IGluIG91ciBjb3B5LiAgRXJyb3Igb3V0LiAgSW4KKyAgICAgICAgICAgICAgIHByYWN0aWNlLCB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGFuZCB3aWxsIGJlCisgICAgICAgICAgICAgICBkZXRlY3RlZCBieSByZXR1cm5pbmcgTlVMTCAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc3RyY3B5KHRtcF9mb3JtYXQsIGZvcm1hdCk7CisgICAgICAgIHRtcF9mb3JtYXRbZm9ybWF0X2xlbiAtIDFdID0gJ2cnOworICAgICAgICBmb3JtYXQgPSB0bXBfZm9ybWF0OworICAgIH0KIAogCi0JLyogSGF2ZSBQeU9TX3NucHJpbnRmIGRvIHRoZSBoYXJkIHdvcmsgKi8KLQlQeU9TX3NucHJpbnRmKGJ1ZmZlciwgYnVmX3NpemUsIGZvcm1hdCwgZCk7CisgICAgLyogSGF2ZSBQeU9TX3NucHJpbnRmIGRvIHRoZSBoYXJkIHdvcmsgKi8KKyAgICBQeU9TX3NucHJpbnRmKGJ1ZmZlciwgYnVmX3NpemUsIGZvcm1hdCwgZCk7CiAKLQkvKiBEbyB2YXJpb3VzIGZpeHVwcyBvbiB0aGUgcmV0dXJuIHN0cmluZyAqLworICAgIC8qIERvIHZhcmlvdXMgZml4dXBzIG9uIHRoZSByZXR1cm4gc3RyaW5nICovCiAKLQkvKiBHZXQgdGhlIGN1cnJlbnQgbG9jYWxlLCBhbmQgZmluZCB0aGUgZGVjaW1hbCBwb2ludCBzdHJpbmcuCi0JICAgQ29udmVydCB0aGF0IHN0cmluZyBiYWNrIHRvIGEgZG90LiAgRG8gbm90IGRvIHRoaXMgaWYgdXNpbmcgdGhlCi0JICAgJ24nIChudW1iZXIpIGZvcm1hdCBjb2RlLCBzaW5jZSB3ZSB3YW50IHRvIGtlZXAgdGhlIGxvY2FsaXplZAotCSAgIGRlY2ltYWwgcG9pbnQgaW4gdGhhdCBjYXNlLiAqLwotCWlmIChmb3JtYXRfY2hhciAhPSAnbicpCi0JCWNoYW5nZV9kZWNpbWFsX2Zyb21fbG9jYWxlX3RvX2RvdChidWZmZXIpOworICAgIC8qIEdldCB0aGUgY3VycmVudCBsb2NhbGUsIGFuZCBmaW5kIHRoZSBkZWNpbWFsIHBvaW50IHN0cmluZy4KKyAgICAgICBDb252ZXJ0IHRoYXQgc3RyaW5nIGJhY2sgdG8gYSBkb3QuICBEbyBub3QgZG8gdGhpcyBpZiB1c2luZyB0aGUKKyAgICAgICAnbicgKG51bWJlcikgZm9ybWF0IGNvZGUsIHNpbmNlIHdlIHdhbnQgdG8ga2VlcCB0aGUgbG9jYWxpemVkCisgICAgICAgZGVjaW1hbCBwb2ludCBpbiB0aGF0IGNhc2UuICovCisgICAgaWYgKGZvcm1hdF9jaGFyICE9ICduJykKKyAgICAgICAgY2hhbmdlX2RlY2ltYWxfZnJvbV9sb2NhbGVfdG9fZG90KGJ1ZmZlcik7CiAKLQkvKiBJZiBhbiBleHBvbmVudCBleGlzdHMsIGVuc3VyZSB0aGF0IHRoZSBleHBvbmVudCBpcyBhdCBsZWFzdAotCSAgIE1JTl9FWFBPTkVOVF9ESUdJVFMgZGlnaXRzLCBwcm92aWRpbmcgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2gKLQkgICBmb3IgdGhlIGV4dHJhIHplcm9zLiAgQWxzbywgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbgotCSAgIE1JTl9FWFBPTkVOVF9ESUdJVFMsIHJlbW92ZSBhcyBtYW55IHplcm9zIGFzIHBvc3NpYmxlIHVudGlsIHdlIGdldAotCSAgIGJhY2sgdG8gTUlOX0VYUE9ORU5UX0RJR0lUUyAqLwotCWVuc3VyZV9taW5pbXVtX2V4cG9uZW50X2xlbmd0aChidWZmZXIsIGJ1Zl9zaXplKTsKKyAgICAvKiBJZiBhbiBleHBvbmVudCBleGlzdHMsIGVuc3VyZSB0aGF0IHRoZSBleHBvbmVudCBpcyBhdCBsZWFzdAorICAgICAgIE1JTl9FWFBPTkVOVF9ESUdJVFMgZGlnaXRzLCBwcm92aWRpbmcgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2gKKyAgICAgICBmb3IgdGhlIGV4dHJhIHplcm9zLiAgQWxzbywgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbgorICAgICAgIE1JTl9FWFBPTkVOVF9ESUdJVFMsIHJlbW92ZSBhcyBtYW55IHplcm9zIGFzIHBvc3NpYmxlIHVudGlsIHdlIGdldAorICAgICAgIGJhY2sgdG8gTUlOX0VYUE9ORU5UX0RJR0lUUyAqLworICAgIGVuc3VyZV9taW5pbXVtX2V4cG9uZW50X2xlbmd0aChidWZmZXIsIGJ1Zl9zaXplKTsKIAotCS8qIElmIGZvcm1hdF9jaGFyIGlzICdaJywgbWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlcgotCSAgIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IChhbmQgbWFrZSBzdXJlIHdlIGhhdmUgYSBkZWNpbWFsIHBvaW50KS4gKi8KLQlpZiAoZm9ybWF0X2NoYXIgPT0gJ1onKQotCQllbnN1cmVfZGVjaW1hbF9wb2ludChidWZmZXIsIGJ1Zl9zaXplKTsKKyAgICAvKiBJZiBmb3JtYXRfY2hhciBpcyAnWicsIG1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIKKyAgICAgICBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCAoYW5kIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGVjaW1hbCBwb2ludCkuICovCisgICAgaWYgKGZvcm1hdF9jaGFyID09ICdaJykKKyAgICAgICAgZW5zdXJlX2RlY2ltYWxfcG9pbnQoYnVmZmVyLCBidWZfc2l6ZSk7CiAKLQkvKiBJZiBmb3JtYXRfY2hhciBpcyAnbicsIGFkZCB0aGUgdGhvdXNhbmRzIGdyb3VwaW5nLiAqLwotCWlmIChmb3JtYXRfY2hhciA9PSAnbicpCi0JCWlmICghYWRkX3Rob3VzYW5kc19ncm91cGluZyhidWZmZXIsIGJ1Zl9zaXplKSkKLQkJCXJldHVybiBOVUxMOworICAgIC8qIElmIGZvcm1hdF9jaGFyIGlzICduJywgYWRkIHRoZSB0aG91c2FuZHMgZ3JvdXBpbmcuICovCisgICAgaWYgKGZvcm1hdF9jaGFyID09ICduJykKKyAgICAgICAgaWYgKCFhZGRfdGhvdXNhbmRzX2dyb3VwaW5nKGJ1ZmZlciwgYnVmX3NpemUpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gYnVmZmVyOworICAgIHJldHVybiBidWZmZXI7CiB9CiAKIGRvdWJsZQogUHlPU19hc2NpaV9hdG9mKGNvbnN0IGNoYXIgKm5wdHIpCiB7Ci0JcmV0dXJuIFB5T1NfYXNjaWlfc3RydG9kKG5wdHIsIE5VTEwpOworICAgIHJldHVybiBQeU9TX2FzY2lpX3N0cnRvZChucHRyLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weXRob25ydW4uYyBiL1B5dGhvbi9weXRob25ydW4uYwppbmRleCA2Nzc0MDQzLi4wYWI3MTY1IDEwMDY0NAotLS0gYS9QeXRob24vcHl0aG9ucnVuLmMKKysrIGIvUHl0aG9uL3B5dGhvbnJ1bi5jCkBAIC00MCw5ICs0MCw5IEBACiAjaWZuZGVmIFB5X1JFRl9ERUJVRwogI2RlZmluZSBQUklOVF9UT1RBTF9SRUZTKCkKICNlbHNlIC8qIFB5X1JFRl9ERUJVRyAqLwotI2RlZmluZSBQUklOVF9UT1RBTF9SRUZTKCkgZnByaW50ZihzdGRlcnIsCQkJCVwKLQkJCQkgICAiWyUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgcmVmc11cbiIsCVwKLQkJCQkgICBfUHlfR2V0UmVmVG90YWwoKSkKKyNkZWZpbmUgUFJJTlRfVE9UQUxfUkVGUygpIGZwcmludGYoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAiWyUiIFBZX0ZPUk1BVF9TSVpFX1QgImQgcmVmc11cbiIsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBfUHlfR2V0UmVmVG90YWwoKSkKICNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKQEAgLTU3LDkgKzU3LDkgQEAKIHN0YXRpYyB2b2lkIGluaXRtYWluKHZvaWQpOwogc3RhdGljIHZvaWQgaW5pdHNpdGUodm9pZCk7CiBzdGF0aWMgUHlPYmplY3QgKnJ1bl9tb2QobW9kX3R5LCBjb25zdCBjaGFyICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0JCQkgIFB5Q29tcGlsZXJGbGFncyAqLCBQeUFyZW5hICopOworICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKiwgUHlBcmVuYSAqKTsKIHN0YXRpYyBQeU9iamVjdCAqcnVuX3B5Y19maWxlKEZJTEUgKiwgY29uc3QgY2hhciAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqLAotCQkJICAgICAgUHlDb21waWxlckZsYWdzICopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICopOwogc3RhdGljIHZvaWQgZXJyX2lucHV0KHBlcnJkZXRhaWwgKik7CiBzdGF0aWMgdm9pZCBpbml0c2lncyh2b2lkKTsKIHN0YXRpYyB2b2lkIHdhaXRfZm9yX3RocmVhZF9zaHV0ZG93bih2b2lkKTsKQEAgLTk1LDcgKzk1LDcgQEAKIFB5T2JqZWN0ICoKIFB5TW9kdWxlX0dldFdhcm5pbmdzTW9kdWxlKHZvaWQpCiB7Ci0JcmV0dXJuIFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgid2FybmluZ3MiKTsKKyAgICByZXR1cm4gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ3YXJuaW5ncyIpOwogfQogCiBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKQEAgLTEwNSw3ICsxMDUsNyBAQAogaW50CiBQeV9Jc0luaXRpYWxpemVkKHZvaWQpCiB7Ci0JcmV0dXJuIGluaXRpYWxpemVkOworICAgIHJldHVybiBpbml0aWFsaXplZDsKIH0KIAogLyogR2xvYmFsIGluaXRpYWxpemF0aW9ucy4gIENhbiBiZSB1bmRvbmUgYnkgUHlfRmluYWxpemUoKS4gIERvbid0CkBAIC0xMjMsMjQ4ICsxMjMsMjQ4IEBACiBzdGF0aWMgaW50CiBhZGRfZmxhZyhpbnQgZmxhZywgY29uc3QgY2hhciAqZW52cykKIHsKLQlpbnQgZW52ID0gYXRvaShlbnZzKTsKLQlpZiAoZmxhZyA8IGVudikKLQkJZmxhZyA9IGVudjsKLQlpZiAoZmxhZyA8IDEpCi0JCWZsYWcgPSAxOwotCXJldHVybiBmbGFnOworICAgIGludCBlbnYgPSBhdG9pKGVudnMpOworICAgIGlmIChmbGFnIDwgZW52KQorICAgICAgICBmbGFnID0gZW52OworICAgIGlmIChmbGFnIDwgMSkKKyAgICAgICAgZmxhZyA9IDE7CisgICAgcmV0dXJuIGZsYWc7CiB9CiAKIHZvaWQKIFB5X0luaXRpYWxpemVFeChpbnQgaW5zdGFsbF9zaWdzKQogewotCVB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOwotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKLQlQeU9iamVjdCAqYmltb2QsICpzeXNtb2Q7Ci0JY2hhciAqcDsKLQljaGFyICppY29kZXNldCA9IE5VTEw7IC8qIE9uIFdpbmRvd3MsIGlucHV0IGNvZGVzZXQgbWF5IHRoZW9yZXRpY2FsbHkgCi0JCQkgICAgICAgICAgZGlmZmVyIGZyb20gb3V0cHV0IGNvZGVzZXQuICovCi0JY2hhciAqY29kZXNldCA9IE5VTEw7Ci0JY2hhciAqZXJyb3JzID0gTlVMTDsKLQlpbnQgZnJlZV9jb2Rlc2V0ID0gMDsKLQlpbnQgb3ZlcnJpZGRlbiA9IDA7Ci0JUHlPYmplY3QgKnN5c19zdHJlYW0sICpzeXNfaXNhdHR5OworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKKyAgICBQeU9iamVjdCAqYmltb2QsICpzeXNtb2Q7CisgICAgY2hhciAqcDsKKyAgICBjaGFyICppY29kZXNldCA9IE5VTEw7IC8qIE9uIFdpbmRvd3MsIGlucHV0IGNvZGVzZXQgbWF5IHRoZW9yZXRpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlciBmcm9tIG91dHB1dCBjb2Rlc2V0LiAqLworICAgIGNoYXIgKmNvZGVzZXQgPSBOVUxMOworICAgIGNoYXIgKmVycm9ycyA9IE5VTEw7CisgICAgaW50IGZyZWVfY29kZXNldCA9IDA7CisgICAgaW50IG92ZXJyaWRkZW4gPSAwOworICAgIFB5T2JqZWN0ICpzeXNfc3RyZWFtLCAqc3lzX2lzYXR0eTsKICNpZiBkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpICYmIGRlZmluZWQoSEFWRV9MQU5HSU5GT19IKSAmJiBkZWZpbmVkKENPREVTRVQpCi0JY2hhciAqc2F2ZWRfbG9jYWxlLCAqbG9jX2NvZGVzZXQ7CisgICAgY2hhciAqc2F2ZWRfbG9jYWxlLCAqbG9jX2NvZGVzZXQ7CiAjZW5kaWYKICNpZmRlZiBNU19XSU5ET1dTCi0JY2hhciBpYnVmWzEyOF07Ci0JY2hhciBidWZbMTI4XTsKKyAgICBjaGFyIGlidWZbMTI4XTsKKyAgICBjaGFyIGJ1ZlsxMjhdOwogI2VuZGlmCi0JZXh0ZXJuIHZvaWQgX1B5X1JlYWR5VHlwZXModm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgX1B5X1JlYWR5VHlwZXModm9pZCk7CiAKLQlpZiAoaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKLQlpbml0aWFsaXplZCA9IDE7CisgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisgICAgaW5pdGlhbGl6ZWQgPSAxOwogCi0JaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05ERUJVRyIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9EZWJ1Z0ZsYWcgPSBhZGRfZmxhZyhQeV9EZWJ1Z0ZsYWcsIHApOwotCWlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OVkVSQk9TRSIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9WZXJib3NlRmxhZyA9IGFkZF9mbGFnKFB5X1ZlcmJvc2VGbGFnLCBwKTsKLQlpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTk9QVElNSVpFIikpICYmICpwICE9ICdcMCcpCi0JCVB5X09wdGltaXplRmxhZyA9IGFkZF9mbGFnKFB5X09wdGltaXplRmxhZywgcCk7Ci0JaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05ET05UV1JJVEVCWVRFQ09ERSIpKSAmJiAqcCAhPSAnXDAnKQotCQlQeV9Eb250V3JpdGVCeXRlY29kZUZsYWcgPSBhZGRfZmxhZyhQeV9Eb250V3JpdGVCeXRlY29kZUZsYWcsIHApOworICAgIGlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OREVCVUciKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfRGVidWdGbGFnID0gYWRkX2ZsYWcoUHlfRGVidWdGbGFnLCBwKTsKKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTlZFUkJPU0UiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfVmVyYm9zZUZsYWcgPSBhZGRfZmxhZyhQeV9WZXJib3NlRmxhZywgcCk7CisgICAgaWYgKChwID0gUHlfR0VURU5WKCJQWVRIT05PUFRJTUlaRSIpKSAmJiAqcCAhPSAnXDAnKQorICAgICAgICBQeV9PcHRpbWl6ZUZsYWcgPSBhZGRfZmxhZyhQeV9PcHRpbWl6ZUZsYWcsIHApOworICAgIGlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9ORE9OVFdSSVRFQllURUNPREUiKSkgJiYgKnAgIT0gJ1wwJykKKyAgICAgICAgUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnID0gYWRkX2ZsYWcoUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnLCBwKTsKIAotCWludGVycCA9IFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcoKTsKLQlpZiAoaW50ZXJwID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IG1ha2UgZmlyc3QgaW50ZXJwcmV0ZXIiKTsKKyAgICBpbnRlcnAgPSBQeUludGVycHJldGVyU3RhdGVfTmV3KCk7CisgICAgaWYgKGludGVycCA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBtYWtlIGZpcnN0IGludGVycHJldGVyIik7CiAKLQl0c3RhdGUgPSBQeVRocmVhZFN0YXRlX05ldyhpbnRlcnApOwotCWlmICh0c3RhdGUgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgbWFrZSBmaXJzdCB0aHJlYWQiKTsKLQkodm9pZCkgUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSk7CisgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9OZXcoaW50ZXJwKTsKKyAgICBpZiAodHN0YXRlID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IG1ha2UgZmlyc3QgdGhyZWFkIik7CisgICAgKHZvaWQpIFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpOwogCi0JX1B5X1JlYWR5VHlwZXMoKTsKKyAgICBfUHlfUmVhZHlUeXBlcygpOwogCi0JaWYgKCFfUHlGcmFtZV9Jbml0KCkpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgZnJhbWVzIik7CisgICAgaWYgKCFfUHlGcmFtZV9Jbml0KCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgZnJhbWVzIik7CiAKLQlpZiAoIV9QeUludF9Jbml0KCkpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXQgaW50cyIpOworICAgIGlmICghX1B5SW50X0luaXQoKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdCBpbnRzIik7CiAKLQlpZiAoIVB5Qnl0ZUFycmF5X0luaXQoKSkKLQkJUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdCBieXRlYXJyYXkiKTsKKyAgICBpZiAoIVB5Qnl0ZUFycmF5X0luaXQoKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdCBieXRlYXJyYXkiKTsKIAotCV9QeUZsb2F0X0luaXQoKTsKKyAgICBfUHlGbG9hdF9Jbml0KCk7CiAKLQlpbnRlcnAtPm1vZHVsZXMgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKGludGVycC0+bW9kdWxlcyA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBtYWtlIG1vZHVsZXMgZGljdGlvbmFyeSIpOwotCWludGVycC0+bW9kdWxlc19yZWxvYWRpbmcgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKGludGVycC0+bW9kdWxlc19yZWxvYWRpbmcgPT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgbWFrZSBtb2R1bGVzX3JlbG9hZGluZyBkaWN0aW9uYXJ5Iik7CisgICAgaW50ZXJwLT5tb2R1bGVzID0gUHlEaWN0X05ldygpOworICAgIGlmIChpbnRlcnAtPm1vZHVsZXMgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgbWFrZSBtb2R1bGVzIGRpY3Rpb25hcnkiKTsKKyAgICBpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nID0gUHlEaWN0X05ldygpOworICAgIGlmIChpbnRlcnAtPm1vZHVsZXNfcmVsb2FkaW5nID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IG1ha2UgbW9kdWxlc19yZWxvYWRpbmcgZGljdGlvbmFyeSIpOwogCiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCS8qIEluaXQgVW5pY29kZSBpbXBsZW1lbnRhdGlvbjsgcmVsaWVzIG9uIHRoZSBjb2RlYyByZWdpc3RyeSAqLwotCV9QeVVuaWNvZGVfSW5pdCgpOworICAgIC8qIEluaXQgVW5pY29kZSBpbXBsZW1lbnRhdGlvbjsgcmVsaWVzIG9uIHRoZSBjb2RlYyByZWdpc3RyeSAqLworICAgIF9QeVVuaWNvZGVfSW5pdCgpOwogI2VuZGlmCiAKLQliaW1vZCA9IF9QeUJ1aWx0aW5fSW5pdCgpOwotCWlmIChiaW1vZCA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIF9fYnVpbHRpbl9fIik7Ci0JaW50ZXJwLT5idWlsdGlucyA9IFB5TW9kdWxlX0dldERpY3QoYmltb2QpOwotCWlmIChpbnRlcnAtPmJ1aWx0aW5zID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXRpYWxpemUgYnVpbHRpbnMgZGljdCIpOwotCVB5X0lOQ1JFRihpbnRlcnAtPmJ1aWx0aW5zKTsKKyAgICBiaW1vZCA9IF9QeUJ1aWx0aW5fSW5pdCgpOworICAgIGlmIChiaW1vZCA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIF9fYnVpbHRpbl9fIik7CisgICAgaW50ZXJwLT5idWlsdGlucyA9IFB5TW9kdWxlX0dldERpY3QoYmltb2QpOworICAgIGlmIChpbnRlcnAtPmJ1aWx0aW5zID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXRpYWxpemUgYnVpbHRpbnMgZGljdCIpOworICAgIFB5X0lOQ1JFRihpbnRlcnAtPmJ1aWx0aW5zKTsKIAotCXN5c21vZCA9IF9QeVN5c19Jbml0KCk7Ci0JaWYgKHN5c21vZCA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIHN5cyIpOwotCWludGVycC0+c3lzZGljdCA9IFB5TW9kdWxlX0dldERpY3Qoc3lzbW9kKTsKLQlpZiAoaW50ZXJwLT5zeXNkaWN0ID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXRpYWxpemUgc3lzIGRpY3QiKTsKLQlQeV9JTkNSRUYoaW50ZXJwLT5zeXNkaWN0KTsKLQlfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oInN5cyIsICJzeXMiKTsKLQlQeVN5c19TZXRQYXRoKFB5X0dldFBhdGgoKSk7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoaW50ZXJwLT5zeXNkaWN0LCAibW9kdWxlcyIsCi0JCQkgICAgIGludGVycC0+bW9kdWxlcyk7CisgICAgc3lzbW9kID0gX1B5U3lzX0luaXQoKTsKKyAgICBpZiAoc3lzbW9kID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXRpYWxpemUgc3lzIik7CisgICAgaW50ZXJwLT5zeXNkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChzeXNtb2QpOworICAgIGlmIChpbnRlcnAtPnN5c2RpY3QgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHlfSW5pdGlhbGl6ZTogY2FuJ3QgaW5pdGlhbGl6ZSBzeXMgZGljdCIpOworICAgIFB5X0lOQ1JFRihpbnRlcnAtPnN5c2RpY3QpOworICAgIF9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbigic3lzIiwgInN5cyIpOworICAgIFB5U3lzX1NldFBhdGgoUHlfR2V0UGF0aCgpKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhpbnRlcnAtPnN5c2RpY3QsICJtb2R1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnAtPm1vZHVsZXMpOwogCi0JX1B5SW1wb3J0X0luaXQoKTsKKyAgICBfUHlJbXBvcnRfSW5pdCgpOwogCi0JLyogaW5pdGlhbGl6ZSBidWlsdGluIGV4Y2VwdGlvbnMgKi8KLQlfUHlFeGNfSW5pdCgpOwotCV9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbigiZXhjZXB0aW9ucyIsICJleGNlcHRpb25zIik7CisgICAgLyogaW5pdGlhbGl6ZSBidWlsdGluIGV4Y2VwdGlvbnMgKi8KKyAgICBfUHlFeGNfSW5pdCgpOworICAgIF9QeUltcG9ydF9GaXh1cEV4dGVuc2lvbigiZXhjZXB0aW9ucyIsICJleGNlcHRpb25zIik7CiAKLQkvKiBwaGFzZSAyIG9mIGJ1aWx0aW5zICovCi0JX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKCJfX2J1aWx0aW5fXyIsICJfX2J1aWx0aW5fXyIpOworICAgIC8qIHBoYXNlIDIgb2YgYnVpbHRpbnMgKi8KKyAgICBfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oIl9fYnVpbHRpbl9fIiwgIl9fYnVpbHRpbl9fIik7CiAKLQlfUHlJbXBvcnRIb29rc19Jbml0KCk7CisgICAgX1B5SW1wb3J0SG9va3NfSW5pdCgpOwogCi0JaWYgKGluc3RhbGxfc2lncykKLQkJaW5pdHNpZ3MoKTsgLyogU2lnbmFsIGhhbmRsaW5nIHN0dWZmLCBpbmNsdWRpbmcgaW5pdGludHIoKSAqLwotCQkKLQkvKiBJbml0aWFsaXplIHdhcm5pbmdzLiAqLwotCV9QeVdhcm5pbmdzX0luaXQoKTsKLQlpZiAoUHlTeXNfSGFzV2Fybk9wdGlvbnMoKSkgewotCQlQeU9iamVjdCAqd2FybmluZ3NfbW9kdWxlID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJ3YXJuaW5ncyIpOwotCQlpZiAoIXdhcm5pbmdzX21vZHVsZSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCVB5X1hERUNSRUYod2FybmluZ3NfbW9kdWxlKTsKLQl9CisgICAgaWYgKGluc3RhbGxfc2lncykKKyAgICAgICAgaW5pdHNpZ3MoKTsgLyogU2lnbmFsIGhhbmRsaW5nIHN0dWZmLCBpbmNsdWRpbmcgaW5pdGludHIoKSAqLwogCi0JaW5pdG1haW4oKTsgLyogTW9kdWxlIF9fbWFpbl9fICovCisgICAgLyogSW5pdGlhbGl6ZSB3YXJuaW5ncy4gKi8KKyAgICBfUHlXYXJuaW5nc19Jbml0KCk7CisgICAgaWYgKFB5U3lzX0hhc1dhcm5PcHRpb25zKCkpIHsKKyAgICAgICAgUHlPYmplY3QgKndhcm5pbmdzX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgid2FybmluZ3MiKTsKKyAgICAgICAgaWYgKCF3YXJuaW5nc19tb2R1bGUpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9YREVDUkVGKHdhcm5pbmdzX21vZHVsZSk7CisgICAgfQogCi0JLyogYXV0by10aHJlYWQtc3RhdGUgQVBJLCBpZiBhdmFpbGFibGUgKi8KKyAgICBpbml0bWFpbigpOyAvKiBNb2R1bGUgX19tYWluX18gKi8KKworICAgIC8qIGF1dG8tdGhyZWFkLXN0YXRlIEFQSSwgaWYgYXZhaWxhYmxlICovCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlfUHlHSUxTdGF0ZV9Jbml0KGludGVycCwgdHN0YXRlKTsKKyAgICBfUHlHSUxTdGF0ZV9Jbml0KGludGVycCwgdHN0YXRlKTsKICNlbmRpZiAvKiBXSVRIX1RIUkVBRCAqLwogCi0JaWYgKCFQeV9Ob1NpdGVGbGFnKQotCQlpbml0c2l0ZSgpOyAvKiBNb2R1bGUgc2l0ZSAqLworICAgIGlmICghUHlfTm9TaXRlRmxhZykKKyAgICAgICAgaW5pdHNpdGUoKTsgLyogTW9kdWxlIHNpdGUgKi8KIAotCWlmICgocCA9IFB5X0dFVEVOVigiUFlUSE9OSU9FTkNPRElORyIpKSAmJiAqcCAhPSAnXDAnKSB7Ci0JCXAgPSBpY29kZXNldCA9IGNvZGVzZXQgPSBzdHJkdXAocCk7Ci0JCWZyZWVfY29kZXNldCA9IDE7Ci0JCWVycm9ycyA9IHN0cmNocihwLCAnOicpOwotCQlpZiAoZXJyb3JzKSB7Ci0JCQkqZXJyb3JzID0gJ1wwJzsKLQkJCWVycm9ycysrOwotCQl9Ci0JCW92ZXJyaWRkZW4gPSAxOwotCX0KKyAgICBpZiAoKHAgPSBQeV9HRVRFTlYoIlBZVEhPTklPRU5DT0RJTkciKSkgJiYgKnAgIT0gJ1wwJykgeworICAgICAgICBwID0gaWNvZGVzZXQgPSBjb2Rlc2V0ID0gc3RyZHVwKHApOworICAgICAgICBmcmVlX2NvZGVzZXQgPSAxOworICAgICAgICBlcnJvcnMgPSBzdHJjaHIocCwgJzonKTsKKyAgICAgICAgaWYgKGVycm9ycykgeworICAgICAgICAgICAgKmVycm9ycyA9ICdcMCc7CisgICAgICAgICAgICBlcnJvcnMrKzsKKyAgICAgICAgfQorICAgICAgICBvdmVycmlkZGVuID0gMTsKKyAgICB9CiAKICNpZiBkZWZpbmVkKFB5X1VTSU5HX1VOSUNPREUpICYmIGRlZmluZWQoSEFWRV9MQU5HSU5GT19IKSAmJiBkZWZpbmVkKENPREVTRVQpCi0JLyogT24gVW5peCwgc2V0IHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBhY2NvcmRpbmcgdG8gdGhlCi0JICAgdXNlcidzIHByZWZlcmVuY2UsIGlmIHRoZSBDT0RFU0VUIG5hbWVzIGEgd2VsbC1rbm93bgotCSAgIFB5dGhvbiBjb2RlYywgYW5kIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgaXNuJ3QKLQkgICBpbml0aWFsaXplZCBieSBvdGhlciBtZWFucy4gQWxzbyBzZXQgdGhlIGVuY29kaW5nIG9mCi0JICAgc3RkaW4gYW5kIHN0ZG91dCBpZiB0aGVzZSBhcmUgdGVybWluYWxzLCB1bmxlc3Mgb3ZlcnJpZGRlbi4gICovCisgICAgLyogT24gVW5peCwgc2V0IHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgdXNlcidzIHByZWZlcmVuY2UsIGlmIHRoZSBDT0RFU0VUIG5hbWVzIGEgd2VsbC1rbm93bgorICAgICAgIFB5dGhvbiBjb2RlYywgYW5kIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgaXNuJ3QKKyAgICAgICBpbml0aWFsaXplZCBieSBvdGhlciBtZWFucy4gQWxzbyBzZXQgdGhlIGVuY29kaW5nIG9mCisgICAgICAgc3RkaW4gYW5kIHN0ZG91dCBpZiB0aGVzZSBhcmUgdGVybWluYWxzLCB1bmxlc3Mgb3ZlcnJpZGRlbi4gICovCiAKLQlpZiAoIW92ZXJyaWRkZW4gfHwgIVB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpIHsKLQkJc2F2ZWRfbG9jYWxlID0gc3RyZHVwKHNldGxvY2FsZShMQ19DVFlQRSwgTlVMTCkpOwotCQlzZXRsb2NhbGUoTENfQ1RZUEUsICIiKTsKLQkJbG9jX2NvZGVzZXQgPSBubF9sYW5naW5mbyhDT0RFU0VUKTsKLQkJaWYgKGxvY19jb2Rlc2V0ICYmICpsb2NfY29kZXNldCkgewotCQkJUHlPYmplY3QgKmVuYyA9IFB5Q29kZWNfRW5jb2Rlcihsb2NfY29kZXNldCk7Ci0JCQlpZiAoZW5jKSB7Ci0JCQkJbG9jX2NvZGVzZXQgPSBzdHJkdXAobG9jX2NvZGVzZXQpOwotCQkJCVB5X0RFQ1JFRihlbmMpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19Mb29rdXBFcnJvcikpIHsKLQkJCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQkJbG9jX2NvZGVzZXQgPSBOVUxMOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVB5RXJyX1ByaW50KCk7Ci0JCQkJCWV4aXQoMSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UKLQkJCWxvY19jb2Rlc2V0ID0gTlVMTDsKLQkJc2V0bG9jYWxlKExDX0NUWVBFLCBzYXZlZF9sb2NhbGUpOwotCQlmcmVlKHNhdmVkX2xvY2FsZSk7CisgICAgaWYgKCFvdmVycmlkZGVuIHx8ICFQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nKSB7CisgICAgICAgIHNhdmVkX2xvY2FsZSA9IHN0cmR1cChzZXRsb2NhbGUoTENfQ1RZUEUsIE5VTEwpKTsKKyAgICAgICAgc2V0bG9jYWxlKExDX0NUWVBFLCAiIik7CisgICAgICAgIGxvY19jb2Rlc2V0ID0gbmxfbGFuZ2luZm8oQ09ERVNFVCk7CisgICAgICAgIGlmIChsb2NfY29kZXNldCAmJiAqbG9jX2NvZGVzZXQpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICplbmMgPSBQeUNvZGVjX0VuY29kZXIobG9jX2NvZGVzZXQpOworICAgICAgICAgICAgaWYgKGVuYykgeworICAgICAgICAgICAgICAgIGxvY19jb2Rlc2V0ID0gc3RyZHVwKGxvY19jb2Rlc2V0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZW5jKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfTG9va3VwRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGxvY19jb2Rlc2V0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBsb2NfY29kZXNldCA9IE5VTEw7CisgICAgICAgIHNldGxvY2FsZShMQ19DVFlQRSwgc2F2ZWRfbG9jYWxlKTsKKyAgICAgICAgZnJlZShzYXZlZF9sb2NhbGUpOwogCi0JCWlmICghb3ZlcnJpZGRlbikgewotCQkJY29kZXNldCA9IGljb2Rlc2V0ID0gbG9jX2NvZGVzZXQ7Ci0JCQlmcmVlX2NvZGVzZXQgPSAxOwotCQl9CisgICAgICAgIGlmICghb3ZlcnJpZGRlbikgeworICAgICAgICAgICAgY29kZXNldCA9IGljb2Rlc2V0ID0gbG9jX2NvZGVzZXQ7CisgICAgICAgICAgICBmcmVlX2NvZGVzZXQgPSAxOworICAgICAgICB9CiAKLQkJLyogSW5pdGlhbGl6ZSBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIGZyb20KLQkJICAgbG9jYWxlIGV2ZW4gaWYgUFlUSE9OSU9FTkNPRElORyBpcyBzZXQuICovCi0JCWlmICghUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZykgewotCQkJUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyA9IGxvY19jb2Rlc2V0OwotCQkJaWYgKCFvdmVycmlkZGVuKQotCQkJCWZyZWVfY29kZXNldCA9IDA7Ci0JCX0KLQl9CisgICAgICAgIC8qIEluaXRpYWxpemUgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBmcm9tCisgICAgICAgICAgIGxvY2FsZSBldmVuIGlmIFBZVEhPTklPRU5DT0RJTkcgaXMgc2V0LiAqLworICAgICAgICBpZiAoIVB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpIHsKKyAgICAgICAgICAgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgPSBsb2NfY29kZXNldDsKKyAgICAgICAgICAgIGlmICghb3ZlcnJpZGRlbikKKyAgICAgICAgICAgICAgICBmcmVlX2NvZGVzZXQgPSAwOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKICNpZmRlZiBNU19XSU5ET1dTCi0JaWYgKCFvdmVycmlkZGVuKSB7Ci0JCWljb2Rlc2V0ID0gaWJ1ZjsKLQkJY29kZXNldCA9IGJ1ZjsKLQkJc3ByaW50ZihpYnVmLCAiY3AlZCIsIEdldENvbnNvbGVDUCgpKTsKLQkJc3ByaW50ZihidWYsICJjcCVkIiwgR2V0Q29uc29sZU91dHB1dENQKCkpOwotCX0KKyAgICBpZiAoIW92ZXJyaWRkZW4pIHsKKyAgICAgICAgaWNvZGVzZXQgPSBpYnVmOworICAgICAgICBjb2Rlc2V0ID0gYnVmOworICAgICAgICBzcHJpbnRmKGlidWYsICJjcCVkIiwgR2V0Q29uc29sZUNQKCkpOworICAgICAgICBzcHJpbnRmKGJ1ZiwgImNwJWQiLCBHZXRDb25zb2xlT3V0cHV0Q1AoKSk7CisgICAgfQogI2VuZGlmCiAKLQlpZiAoY29kZXNldCkgewotCQlzeXNfc3RyZWFtID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRpbiIpOwotCQlzeXNfaXNhdHR5ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzeXNfc3RyZWFtLCAiaXNhdHR5IiwgIiIpOwotCQlpZiAoIXN5c19pc2F0dHkpCi0JCQlQeUVycl9DbGVhcigpOwotCQlpZiAoKG92ZXJyaWRkZW4gfHwKLQkJICAgICAoc3lzX2lzYXR0eSAmJiBQeU9iamVjdF9Jc1RydWUoc3lzX2lzYXR0eSkpKSAmJgotCQkgICBQeUZpbGVfQ2hlY2soc3lzX3N0cmVhbSkpIHsKLQkJCWlmICghUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKHN5c19zdHJlYW0sIGljb2Rlc2V0LCBlcnJvcnMpKQotCQkJCVB5X0ZhdGFsRXJyb3IoIkNhbm5vdCBzZXQgY29kZXNldCBvZiBzdGRpbiIpOwotCQl9Ci0JCVB5X1hERUNSRUYoc3lzX2lzYXR0eSk7CisgICAgaWYgKGNvZGVzZXQpIHsKKyAgICAgICAgc3lzX3N0cmVhbSA9IFB5U3lzX0dldE9iamVjdCgic3RkaW4iKTsKKyAgICAgICAgc3lzX2lzYXR0eSA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3lzX3N0cmVhbSwgImlzYXR0eSIsICIiKTsKKyAgICAgICAgaWYgKCFzeXNfaXNhdHR5KQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKChvdmVycmlkZGVuIHx8CisgICAgICAgICAgICAgKHN5c19pc2F0dHkgJiYgUHlPYmplY3RfSXNUcnVlKHN5c19pc2F0dHkpKSkgJiYKKyAgICAgICAgICAgUHlGaWxlX0NoZWNrKHN5c19zdHJlYW0pKSB7CisgICAgICAgICAgICBpZiAoIVB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhzeXNfc3RyZWFtLCBpY29kZXNldCwgZXJyb3JzKSkKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW5ub3Qgc2V0IGNvZGVzZXQgb2Ygc3RkaW4iKTsKKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKHN5c19pc2F0dHkpOwogCi0JCXN5c19zdHJlYW0gPSBQeVN5c19HZXRPYmplY3QoInN0ZG91dCIpOwotCQlzeXNfaXNhdHR5ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzeXNfc3RyZWFtLCAiaXNhdHR5IiwgIiIpOwotCQlpZiAoIXN5c19pc2F0dHkpCi0JCQlQeUVycl9DbGVhcigpOwotCQlpZiAoKG92ZXJyaWRkZW4gfHwgCi0JCSAgICAgKHN5c19pc2F0dHkgJiYgUHlPYmplY3RfSXNUcnVlKHN5c19pc2F0dHkpKSkgJiYKLQkJICAgUHlGaWxlX0NoZWNrKHN5c19zdHJlYW0pKSB7Ci0JCQlpZiAoIVB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhzeXNfc3RyZWFtLCBjb2Rlc2V0LCBlcnJvcnMpKQotCQkJCVB5X0ZhdGFsRXJyb3IoIkNhbm5vdCBzZXQgY29kZXNldCBvZiBzdGRvdXQiKTsKLQkJfQotCQlQeV9YREVDUkVGKHN5c19pc2F0dHkpOworICAgICAgICBzeXNfc3RyZWFtID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKKyAgICAgICAgc3lzX2lzYXR0eSA9IFB5T2JqZWN0X0NhbGxNZXRob2Qoc3lzX3N0cmVhbSwgImlzYXR0eSIsICIiKTsKKyAgICAgICAgaWYgKCFzeXNfaXNhdHR5KQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKChvdmVycmlkZGVuIHx8CisgICAgICAgICAgICAgKHN5c19pc2F0dHkgJiYgUHlPYmplY3RfSXNUcnVlKHN5c19pc2F0dHkpKSkgJiYKKyAgICAgICAgICAgUHlGaWxlX0NoZWNrKHN5c19zdHJlYW0pKSB7CisgICAgICAgICAgICBpZiAoIVB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhzeXNfc3RyZWFtLCBjb2Rlc2V0LCBlcnJvcnMpKQorICAgICAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIkNhbm5vdCBzZXQgY29kZXNldCBvZiBzdGRvdXQiKTsKKyAgICAgICAgfQorICAgICAgICBQeV9YREVDUkVGKHN5c19pc2F0dHkpOwogCi0JCXN5c19zdHJlYW0gPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOwotCQlzeXNfaXNhdHR5ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzeXNfc3RyZWFtLCAiaXNhdHR5IiwgIiIpOwotCQlpZiAoIXN5c19pc2F0dHkpCi0JCQlQeUVycl9DbGVhcigpOwotCQlpZigob3ZlcnJpZGRlbiB8fCAKLQkJICAgIChzeXNfaXNhdHR5ICYmIFB5T2JqZWN0X0lzVHJ1ZShzeXNfaXNhdHR5KSkpICYmCi0JCSAgIFB5RmlsZV9DaGVjayhzeXNfc3RyZWFtKSkgewotCQkJaWYgKCFQeUZpbGVfU2V0RW5jb2RpbmdBbmRFcnJvcnMoc3lzX3N0cmVhbSwgY29kZXNldCwgZXJyb3JzKSkKLQkJCQlQeV9GYXRhbEVycm9yKCJDYW5ub3Qgc2V0IGNvZGVzZXQgb2Ygc3RkZXJyIik7Ci0JCX0KLQkJUHlfWERFQ1JFRihzeXNfaXNhdHR5KTsKKyAgICAgICAgc3lzX3N0cmVhbSA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7CisgICAgICAgIHN5c19pc2F0dHkgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHN5c19zdHJlYW0sICJpc2F0dHkiLCAiIik7CisgICAgICAgIGlmICghc3lzX2lzYXR0eSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmKChvdmVycmlkZGVuIHx8CisgICAgICAgICAgICAoc3lzX2lzYXR0eSAmJiBQeU9iamVjdF9Jc1RydWUoc3lzX2lzYXR0eSkpKSAmJgorICAgICAgICAgICBQeUZpbGVfQ2hlY2soc3lzX3N0cmVhbSkpIHsKKyAgICAgICAgICAgIGlmICghUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKHN5c19zdHJlYW0sIGNvZGVzZXQsIGVycm9ycykpCisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiQ2Fubm90IHNldCBjb2Rlc2V0IG9mIHN0ZGVyciIpOworICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYoc3lzX2lzYXR0eSk7CiAKLQkJaWYgKGZyZWVfY29kZXNldCkKLQkJCWZyZWUoY29kZXNldCk7Ci0JfQorICAgICAgICBpZiAoZnJlZV9jb2Rlc2V0KQorICAgICAgICAgICAgZnJlZShjb2Rlc2V0KTsKKyAgICB9CiB9CiAKIHZvaWQKIFB5X0luaXRpYWxpemUodm9pZCkKIHsKLQlQeV9Jbml0aWFsaXplRXgoMSk7CisgICAgUHlfSW5pdGlhbGl6ZUV4KDEpOwogfQogCiAKQEAgLTM4OSwxNTkgKzM4OSwxNTkgQEAKIHZvaWQKIFB5X0ZpbmFsaXplKHZvaWQpCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKIAotCWlmICghaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CiAKLQl3YWl0X2Zvcl90aHJlYWRfc2h1dGRvd24oKTsKKyAgICB3YWl0X2Zvcl90aHJlYWRfc2h1dGRvd24oKTsKIAotCS8qIFRoZSBpbnRlcnByZXRlciBpcyBzdGlsbCBlbnRpcmVseSBpbnRhY3QgYXQgdGhpcyBwb2ludCwgYW5kIHRoZQotCSAqIGV4aXQgZnVuY3MgbWF5IGJlIHJlbHlpbmcgb24gdGhhdC4gIEluIHBhcnRpY3VsYXIsIGlmIHNvbWUgdGhyZWFkCi0JICogb3IgZXhpdCBmdW5jIGlzIHN0aWxsIHdhaXRpbmcgdG8gZG8gYW4gaW1wb3J0LCB0aGUgaW1wb3J0IG1hY2hpbmVyeQotCSAqIGV4cGVjdHMgUHlfSXNJbml0aWFsaXplZCgpIHRvIHJldHVybiB0cnVlLiAgU28gZG9uJ3Qgc2F5IHRoZQotCSAqIGludGVycHJldGVyIGlzIHVuaW5pdGlhbGl6ZWQgdW50aWwgYWZ0ZXIgdGhlIGV4aXQgZnVuY3MgaGF2ZSBydW4uCi0JICogTm90ZSB0aGF0IFRocmVhZGluZy5weSB1c2VzIGFuIGV4aXQgZnVuYyB0byBkbyBhIGpvaW4gb24gYWxsIHRoZQotCSAqIHRocmVhZHMgY3JlYXRlZCB0aHJ1IGl0LCBzbyB0aGlzIGFsc28gcHJvdGVjdHMgcGVuZGluZyBpbXBvcnRzIGluCi0JICogdGhlIHRocmVhZHMgY3JlYXRlZCB2aWEgVGhyZWFkaW5nLgotCSAqLwotCWNhbGxfc3lzX2V4aXRmdW5jKCk7Ci0JaW5pdGlhbGl6ZWQgPSAwOworICAgIC8qIFRoZSBpbnRlcnByZXRlciBpcyBzdGlsbCBlbnRpcmVseSBpbnRhY3QgYXQgdGhpcyBwb2ludCwgYW5kIHRoZQorICAgICAqIGV4aXQgZnVuY3MgbWF5IGJlIHJlbHlpbmcgb24gdGhhdC4gIEluIHBhcnRpY3VsYXIsIGlmIHNvbWUgdGhyZWFkCisgICAgICogb3IgZXhpdCBmdW5jIGlzIHN0aWxsIHdhaXRpbmcgdG8gZG8gYW4gaW1wb3J0LCB0aGUgaW1wb3J0IG1hY2hpbmVyeQorICAgICAqIGV4cGVjdHMgUHlfSXNJbml0aWFsaXplZCgpIHRvIHJldHVybiB0cnVlLiAgU28gZG9uJ3Qgc2F5IHRoZQorICAgICAqIGludGVycHJldGVyIGlzIHVuaW5pdGlhbGl6ZWQgdW50aWwgYWZ0ZXIgdGhlIGV4aXQgZnVuY3MgaGF2ZSBydW4uCisgICAgICogTm90ZSB0aGF0IFRocmVhZGluZy5weSB1c2VzIGFuIGV4aXQgZnVuYyB0byBkbyBhIGpvaW4gb24gYWxsIHRoZQorICAgICAqIHRocmVhZHMgY3JlYXRlZCB0aHJ1IGl0LCBzbyB0aGlzIGFsc28gcHJvdGVjdHMgcGVuZGluZyBpbXBvcnRzIGluCisgICAgICogdGhlIHRocmVhZHMgY3JlYXRlZCB2aWEgVGhyZWFkaW5nLgorICAgICAqLworICAgIGNhbGxfc3lzX2V4aXRmdW5jKCk7CisgICAgaW5pdGlhbGl6ZWQgPSAwOwogCi0JLyogR2V0IGN1cnJlbnQgdGhyZWFkIHN0YXRlIGFuZCBpbnRlcnByZXRlciBwb2ludGVyICovCi0JdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlpbnRlcnAgPSB0c3RhdGUtPmludGVycDsKKyAgICAvKiBHZXQgY3VycmVudCB0aHJlYWQgc3RhdGUgYW5kIGludGVycHJldGVyIHBvaW50ZXIgKi8KKyAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIGludGVycCA9IHRzdGF0ZS0+aW50ZXJwOwogCi0JLyogRGlzYWJsZSBzaWduYWwgaGFuZGxpbmcgKi8KLQlQeU9TX0ZpbmlJbnRlcnJ1cHRzKCk7CisgICAgLyogRGlzYWJsZSBzaWduYWwgaGFuZGxpbmcgKi8KKyAgICBQeU9TX0ZpbmlJbnRlcnJ1cHRzKCk7CiAKLQkvKiBDbGVhciB0eXBlIGxvb2t1cCBjYWNoZSAqLwotCVB5VHlwZV9DbGVhckNhY2hlKCk7CisgICAgLyogQ2xlYXIgdHlwZSBsb29rdXAgY2FjaGUgKi8KKyAgICBQeVR5cGVfQ2xlYXJDYWNoZSgpOwogCi0JLyogQ29sbGVjdCBnYXJiYWdlLiAgVGhpcyBtYXkgY2FsbCBmaW5hbGl6ZXJzOyBpdCdzIG5pY2UgdG8gY2FsbCB0aGVzZQotCSAqIGJlZm9yZSBhbGwgbW9kdWxlcyBhcmUgZGVzdHJveWVkLgotCSAqIFhYWCBJZiBhIF9fZGVsX18gb3Igd2Vha3JlZiBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgaGVyZSwgYW5kIHRyaWVzIHRvCi0JICogWFhYIGltcG9ydCBhIG1vZHVsZSwgYmFkIHRoaW5ncyBjYW4gaGFwcGVuLCBiZWNhdXNlIFB5dGhvbiBubwotCSAqIFhYWCBsb25nZXIgYmVsaWV2ZXMgaXQncyBpbml0aWFsaXplZC4KLQkgKiBYWFggICAgIEZhdGFsIFB5dGhvbiBlcnJvcjogSW50ZXJwcmV0ZXIgbm90IGluaXRpYWxpemVkICh2ZXJzaW9uIG1pc21hdGNoPykKLQkgKiBYWFggaXMgZWFzeSB0byBwcm92b2tlIHRoYXQgd2F5LiAgSSd2ZSBhbHNvIHNlZW4sIGUuZy4sCi0JICogWFhYICAgICBFeGNlcHRpb24gZXhjZXB0aW9ucy5JbXBvcnRFcnJvcjogJ05vIG1vZHVsZSBuYW1lZCBzaGEnCi0JICogWFhYICAgICAgICAgaW4gPGZ1bmN0aW9uIGNhbGxiYWNrIGF0IDB4MDA4RjU3MTg+IGlnbm9yZWQKLQkgKiBYWFggYnV0IEknbSB1bmNsZWFyIG9uIGV4YWN0bHkgaG93IHRoYXQgb25lIGhhcHBlbnMuICBJbiBhbnkgY2FzZSwKLQkgKiBYWFggSSBoYXZlbid0IHNlZW4gYSByZWFsLWxpZmUgcmVwb3J0IG9mIGVpdGhlciBvZiB0aGVzZS4KLQkgKi8KLQlQeUdDX0NvbGxlY3QoKTsKKyAgICAvKiBDb2xsZWN0IGdhcmJhZ2UuICBUaGlzIG1heSBjYWxsIGZpbmFsaXplcnM7IGl0J3MgbmljZSB0byBjYWxsIHRoZXNlCisgICAgICogYmVmb3JlIGFsbCBtb2R1bGVzIGFyZSBkZXN0cm95ZWQuCisgICAgICogWFhYIElmIGEgX19kZWxfXyBvciB3ZWFrcmVmIGNhbGxiYWNrIGlzIHRyaWdnZXJlZCBoZXJlLCBhbmQgdHJpZXMgdG8KKyAgICAgKiBYWFggaW1wb3J0IGEgbW9kdWxlLCBiYWQgdGhpbmdzIGNhbiBoYXBwZW4sIGJlY2F1c2UgUHl0aG9uIG5vCisgICAgICogWFhYIGxvbmdlciBiZWxpZXZlcyBpdCdzIGluaXRpYWxpemVkLgorICAgICAqIFhYWCAgICAgRmF0YWwgUHl0aG9uIGVycm9yOiBJbnRlcnByZXRlciBub3QgaW5pdGlhbGl6ZWQgKHZlcnNpb24gbWlzbWF0Y2g/KQorICAgICAqIFhYWCBpcyBlYXN5IHRvIHByb3Zva2UgdGhhdCB3YXkuICBJJ3ZlIGFsc28gc2VlbiwgZS5nLiwKKyAgICAgKiBYWFggICAgIEV4Y2VwdGlvbiBleGNlcHRpb25zLkltcG9ydEVycm9yOiAnTm8gbW9kdWxlIG5hbWVkIHNoYScKKyAgICAgKiBYWFggICAgICAgICBpbiA8ZnVuY3Rpb24gY2FsbGJhY2sgYXQgMHgwMDhGNTcxOD4gaWdub3JlZAorICAgICAqIFhYWCBidXQgSSdtIHVuY2xlYXIgb24gZXhhY3RseSBob3cgdGhhdCBvbmUgaGFwcGVucy4gIEluIGFueSBjYXNlLAorICAgICAqIFhYWCBJIGhhdmVuJ3Qgc2VlbiBhIHJlYWwtbGlmZSByZXBvcnQgb2YgZWl0aGVyIG9mIHRoZXNlLgorICAgICAqLworICAgIFB5R0NfQ29sbGVjdCgpOwogI2lmZGVmIENPVU5UX0FMTE9DUwotCS8qIFdpdGggQ09VTlRfQUxMT0NTLCBpdCBoZWxwcyB0byBydW4gR0MgbXVsdGlwbGUgdGltZXM6Ci0JICAgZWFjaCBjb2xsZWN0aW9uIG1pZ2h0IHJlbGVhc2Ugc29tZSB0eXBlcyBmcm9tIHRoZSB0eXBlCi0JICAgbGlzdCwgc28gdGhleSBiZWNvbWUgZ2FyYmFnZS4gKi8KLQl3aGlsZSAoUHlHQ19Db2xsZWN0KCkgPiAwKQotCQkvKiBub3RoaW5nICovOworICAgIC8qIFdpdGggQ09VTlRfQUxMT0NTLCBpdCBoZWxwcyB0byBydW4gR0MgbXVsdGlwbGUgdGltZXM6CisgICAgICAgZWFjaCBjb2xsZWN0aW9uIG1pZ2h0IHJlbGVhc2Ugc29tZSB0eXBlcyBmcm9tIHRoZSB0eXBlCisgICAgICAgbGlzdCwgc28gdGhleSBiZWNvbWUgZ2FyYmFnZS4gKi8KKyAgICB3aGlsZSAoUHlHQ19Db2xsZWN0KCkgPiAwKQorICAgICAgICAvKiBub3RoaW5nICovOwogI2VuZGlmCiAKLQkvKiBEZXN0cm95IGFsbCBtb2R1bGVzICovCi0JUHlJbXBvcnRfQ2xlYW51cCgpOworICAgIC8qIERlc3Ryb3kgYWxsIG1vZHVsZXMgKi8KKyAgICBQeUltcG9ydF9DbGVhbnVwKCk7CiAKLQkvKiBDb2xsZWN0IGZpbmFsIGdhcmJhZ2UuICBUaGlzIGRpc3Bvc2VzIG9mIGN5Y2xlcyBjcmVhdGVkIGJ5Ci0JICogbmV3LXN0eWxlIGNsYXNzIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZS4KLQkgKiBYWFggVGhpcyBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0IGNhdXNlZCB0b28gbWFueSBwcm9ibGVtcy4gIElmCi0JICogWFhYIGEgX19kZWxfXyBvciB3ZWFrcmVmIGNhbGxiYWNrIHRyaWdnZXJzIGhlcmUsIFB5dGhvbiBjb2RlIGhhcwotCSAqIFhYWCBhIGhhcmQgdGltZSBydW5uaW5nLCBiZWNhdXNlIGV2ZW4gdGhlIHN5cyBtb2R1bGUgaGFzIGJlZW4KLQkgKiBYWFggY2xlYXJlZCBvdXQgKHN5cy5zdGRvdXQgaXMgZ29uZSwgc3lzLmV4Y2VwdGhvb2sgaXMgZ29uZSwgZXRjKS4KLQkgKiBYWFggT25lIHN5bXB0b20gaXMgYSBzZXF1ZW5jZSBvZiBpbmZvcm1hdGlvbi1mcmVlIG1lc3NhZ2VzCi0JICogWFhYIGNvbWluZyBmcm9tIHRocmVhZHMgKGlmIGEgX19kZWxfXyBvciBjYWxsYmFjayBpcyBpbnZva2VkLAotCSAqIFhYWCBvdGhlciB0aHJlYWRzIGNhbiBleGVjdXRlIHRvbywgYW5kIGFueSBleGNlcHRpb24gdGhleSBlbmNvdW50ZXIKLQkgKiBYWFggdHJpZ2dlcnMgYSBjb21lZHkgb2YgZXJyb3JzIGFzIHN1YnN5c3RlbSBhZnRlciBzdWJzeXN0ZW0KLQkgKiBYWFggZmFpbHMgdG8gZmluZCB3aGF0IGl0ICpleHBlY3RzKiB0byBmaW5kIGluIHN5cyB0byBoZWxwIHJlcG9ydAotCSAqIFhYWCB0aGUgZXhjZXB0aW9uIGFuZCBjb25zZXF1ZW50IHVuZXhwZWN0ZWQgZmFpbHVyZXMpLiAgSSd2ZSBhbHNvCi0JICogWFhYIHNlZW4gc2VnZmF1bHRzIHRoZW4sIGFmdGVyIGFkZGluZyBwcmludCBzdGF0ZW1lbnRzIHRvIHRoZQotCSAqIFhYWCBQeXRob24gY29kZSBnZXR0aW5nIGNhbGxlZC4KLQkgKi8KKyAgICAvKiBDb2xsZWN0IGZpbmFsIGdhcmJhZ2UuICBUaGlzIGRpc3Bvc2VzIG9mIGN5Y2xlcyBjcmVhdGVkIGJ5CisgICAgICogbmV3LXN0eWxlIGNsYXNzIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZS4KKyAgICAgKiBYWFggVGhpcyBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0IGNhdXNlZCB0b28gbWFueSBwcm9ibGVtcy4gIElmCisgICAgICogWFhYIGEgX19kZWxfXyBvciB3ZWFrcmVmIGNhbGxiYWNrIHRyaWdnZXJzIGhlcmUsIFB5dGhvbiBjb2RlIGhhcworICAgICAqIFhYWCBhIGhhcmQgdGltZSBydW5uaW5nLCBiZWNhdXNlIGV2ZW4gdGhlIHN5cyBtb2R1bGUgaGFzIGJlZW4KKyAgICAgKiBYWFggY2xlYXJlZCBvdXQgKHN5cy5zdGRvdXQgaXMgZ29uZSwgc3lzLmV4Y2VwdGhvb2sgaXMgZ29uZSwgZXRjKS4KKyAgICAgKiBYWFggT25lIHN5bXB0b20gaXMgYSBzZXF1ZW5jZSBvZiBpbmZvcm1hdGlvbi1mcmVlIG1lc3NhZ2VzCisgICAgICogWFhYIGNvbWluZyBmcm9tIHRocmVhZHMgKGlmIGEgX19kZWxfXyBvciBjYWxsYmFjayBpcyBpbnZva2VkLAorICAgICAqIFhYWCBvdGhlciB0aHJlYWRzIGNhbiBleGVjdXRlIHRvbywgYW5kIGFueSBleGNlcHRpb24gdGhleSBlbmNvdW50ZXIKKyAgICAgKiBYWFggdHJpZ2dlcnMgYSBjb21lZHkgb2YgZXJyb3JzIGFzIHN1YnN5c3RlbSBhZnRlciBzdWJzeXN0ZW0KKyAgICAgKiBYWFggZmFpbHMgdG8gZmluZCB3aGF0IGl0ICpleHBlY3RzKiB0byBmaW5kIGluIHN5cyB0byBoZWxwIHJlcG9ydAorICAgICAqIFhYWCB0aGUgZXhjZXB0aW9uIGFuZCBjb25zZXF1ZW50IHVuZXhwZWN0ZWQgZmFpbHVyZXMpLiAgSSd2ZSBhbHNvCisgICAgICogWFhYIHNlZW4gc2VnZmF1bHRzIHRoZW4sIGFmdGVyIGFkZGluZyBwcmludCBzdGF0ZW1lbnRzIHRvIHRoZQorICAgICAqIFhYWCBQeXRob24gY29kZSBnZXR0aW5nIGNhbGxlZC4KKyAgICAgKi8KICNpZiAwCi0JUHlHQ19Db2xsZWN0KCk7CisgICAgUHlHQ19Db2xsZWN0KCk7CiAjZW5kaWYKIAotCS8qIERlc3Ryb3kgdGhlIGRhdGFiYXNlIHVzZWQgYnkgX1B5SW1wb3J0X3tGaXh1cCxGaW5kfUV4dGVuc2lvbiAqLwotCV9QeUltcG9ydF9GaW5pKCk7CisgICAgLyogRGVzdHJveSB0aGUgZGF0YWJhc2UgdXNlZCBieSBfUHlJbXBvcnRfe0ZpeHVwLEZpbmR9RXh0ZW5zaW9uICovCisgICAgX1B5SW1wb3J0X0ZpbmkoKTsKIAotCS8qIERlYnVnZ2luZyBzdHVmZiAqLworICAgIC8qIERlYnVnZ2luZyBzdHVmZiAqLwogI2lmZGVmIENPVU5UX0FMTE9DUwotCWR1bXBfY291bnRzKHN0ZG91dCk7CisgICAgZHVtcF9jb3VudHMoc3Rkb3V0KTsKICNlbmRpZgogCi0JUFJJTlRfVE9UQUxfUkVGUygpOworICAgIFBSSU5UX1RPVEFMX1JFRlMoKTsKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKLQkvKiBEaXNwbGF5IGFsbCBvYmplY3RzIHN0aWxsIGFsaXZlIC0tIHRoaXMgY2FuIGludm9rZSBhcmJpdHJhcnkKLQkgKiBfX3JlcHJfXyBvdmVycmlkZXMsIHNvIHJlcXVpcmVzIGEgbW9zdGx5LWludGFjdCBpbnRlcnByZXRlci4KLQkgKiBBbGFzLCBhIGxvdCBvZiBzdHVmZiBtYXkgc3RpbGwgYmUgYWxpdmUgbm93IHRoYXQgd2lsbCBiZSBjbGVhbmVkCi0JICogdXAgbGF0ZXIuCi0JICovCi0JaWYgKFB5X0dFVEVOVigiUFlUSE9ORFVNUFJFRlMiKSkKLQkJX1B5X1ByaW50UmVmZXJlbmNlcyhzdGRlcnIpOworICAgIC8qIERpc3BsYXkgYWxsIG9iamVjdHMgc3RpbGwgYWxpdmUgLS0gdGhpcyBjYW4gaW52b2tlIGFyYml0cmFyeQorICAgICAqIF9fcmVwcl9fIG92ZXJyaWRlcywgc28gcmVxdWlyZXMgYSBtb3N0bHktaW50YWN0IGludGVycHJldGVyLgorICAgICAqIEFsYXMsIGEgbG90IG9mIHN0dWZmIG1heSBzdGlsbCBiZSBhbGl2ZSBub3cgdGhhdCB3aWxsIGJlIGNsZWFuZWQKKyAgICAgKiB1cCBsYXRlci4KKyAgICAgKi8KKyAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05EVU1QUkVGUyIpKQorICAgICAgICBfUHlfUHJpbnRSZWZlcmVuY2VzKHN0ZGVycik7CiAjZW5kaWYgLyogUHlfVFJBQ0VfUkVGUyAqLwogCi0JLyogQ2xlYXIgaW50ZXJwcmV0ZXIgc3RhdGUgKi8KLQlQeUludGVycHJldGVyU3RhdGVfQ2xlYXIoaW50ZXJwKTsKKyAgICAvKiBDbGVhciBpbnRlcnByZXRlciBzdGF0ZSAqLworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcihpbnRlcnApOwogCi0JLyogTm93IHdlIGRlY3JlZiB0aGUgZXhjZXB0aW9uIGNsYXNzZXMuICBBZnRlciB0aGlzIHBvaW50IG5vdGhpbmcKLQkgICBjYW4gcmFpc2UgYW4gZXhjZXB0aW9uLiAgVGhhdCdzIG9rYXksIGJlY2F1c2UgZWFjaCBGaW5pKCkgbWV0aG9kCi0JICAgYmVsb3cgaGFzIGJlZW4gY2hlY2tlZCB0byBtYWtlIHN1cmUgbm8gZXhjZXB0aW9ucyBhcmUgZXZlcgotCSAgIHJhaXNlZC4KLQkqLworICAgIC8qIE5vdyB3ZSBkZWNyZWYgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzLiAgQWZ0ZXIgdGhpcyBwb2ludCBub3RoaW5nCisgICAgICAgY2FuIHJhaXNlIGFuIGV4Y2VwdGlvbi4gIFRoYXQncyBva2F5LCBiZWNhdXNlIGVhY2ggRmluaSgpIG1ldGhvZAorICAgICAgIGJlbG93IGhhcyBiZWVuIGNoZWNrZWQgdG8gbWFrZSBzdXJlIG5vIGV4Y2VwdGlvbnMgYXJlIGV2ZXIKKyAgICAgICByYWlzZWQuCisgICAgKi8KIAotCV9QeUV4Y19GaW5pKCk7CisgICAgX1B5RXhjX0ZpbmkoKTsKIAotCS8qIENsZWFudXAgYXV0by10aHJlYWQtc3RhdGUgKi8KKyAgICAvKiBDbGVhbnVwIGF1dG8tdGhyZWFkLXN0YXRlICovCiAjaWZkZWYgV0lUSF9USFJFQUQKLQlfUHlHSUxTdGF0ZV9GaW5pKCk7CisgICAgX1B5R0lMU3RhdGVfRmluaSgpOwogI2VuZGlmIC8qIFdJVEhfVEhSRUFEICovCiAKLQkvKiBEZWxldGUgY3VycmVudCB0aHJlYWQgKi8KLQlQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7Ci0JUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShpbnRlcnApOworICAgIC8qIERlbGV0ZSBjdXJyZW50IHRocmVhZCAqLworICAgIFB5VGhyZWFkU3RhdGVfU3dhcChOVUxMKTsKKyAgICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CiAKLQkvKiBTdW5kcnkgZmluYWxpemVycyAqLwotCVB5TWV0aG9kX0ZpbmkoKTsKLQlQeUZyYW1lX0ZpbmkoKTsKLQlQeUNGdW5jdGlvbl9GaW5pKCk7Ci0JUHlUdXBsZV9GaW5pKCk7Ci0JUHlMaXN0X0ZpbmkoKTsKLQlQeVNldF9GaW5pKCk7Ci0JUHlTdHJpbmdfRmluaSgpOwotCVB5Qnl0ZUFycmF5X0ZpbmkoKTsKLQlQeUludF9GaW5pKCk7Ci0JUHlGbG9hdF9GaW5pKCk7Ci0JUHlEaWN0X0ZpbmkoKTsKKyAgICAvKiBTdW5kcnkgZmluYWxpemVycyAqLworICAgIFB5TWV0aG9kX0ZpbmkoKTsKKyAgICBQeUZyYW1lX0ZpbmkoKTsKKyAgICBQeUNGdW5jdGlvbl9GaW5pKCk7CisgICAgUHlUdXBsZV9GaW5pKCk7CisgICAgUHlMaXN0X0ZpbmkoKTsKKyAgICBQeVNldF9GaW5pKCk7CisgICAgUHlTdHJpbmdfRmluaSgpOworICAgIFB5Qnl0ZUFycmF5X0ZpbmkoKTsKKyAgICBQeUludF9GaW5pKCk7CisgICAgUHlGbG9hdF9GaW5pKCk7CisgICAgUHlEaWN0X0ZpbmkoKTsKIAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQkvKiBDbGVhbnVwIFVuaWNvZGUgaW1wbGVtZW50YXRpb24gKi8KLQlfUHlVbmljb2RlX0ZpbmkoKTsKKyAgICAvKiBDbGVhbnVwIFVuaWNvZGUgaW1wbGVtZW50YXRpb24gKi8KKyAgICBfUHlVbmljb2RlX0ZpbmkoKTsKICNlbmRpZgogCi0JLyogWFhYIFN0aWxsIGFsbG9jYXRlZDoKLQkgICAtIHZhcmlvdXMgc3RhdGljIGFkLWhvYyBwb2ludGVycyB0byBpbnRlcm5lZCBzdHJpbmdzCi0JICAgLSBpbnQgYW5kIGZsb2F0IGZyZWUgbGlzdCBibG9ja3MKLQkgICAtIHdoYXRldmVyIHZhcmlvdXMgbW9kdWxlcyBhbmQgbGlicmFyaWVzIGFsbG9jYXRlCi0JKi8KKyAgICAvKiBYWFggU3RpbGwgYWxsb2NhdGVkOgorICAgICAgIC0gdmFyaW91cyBzdGF0aWMgYWQtaG9jIHBvaW50ZXJzIHRvIGludGVybmVkIHN0cmluZ3MKKyAgICAgICAtIGludCBhbmQgZmxvYXQgZnJlZSBsaXN0IGJsb2NrcworICAgICAgIC0gd2hhdGV2ZXIgdmFyaW91cyBtb2R1bGVzIGFuZCBsaWJyYXJpZXMgYWxsb2NhdGUKKyAgICAqLwogCi0JUHlHcmFtbWFyX1JlbW92ZUFjY2VsZXJhdG9ycygmX1B5UGFyc2VyX0dyYW1tYXIpOworICAgIFB5R3JhbW1hcl9SZW1vdmVBY2NlbGVyYXRvcnMoJl9QeVBhcnNlcl9HcmFtbWFyKTsKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKLQkvKiBEaXNwbGF5IGFkZHJlc3NlcyAoJiByZWZjbnRzKSBvZiBhbGwgb2JqZWN0cyBzdGlsbCBhbGl2ZS4KLQkgKiBBbiBhZGRyZXNzIGNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIHJlcHIgb2YgdGhlIG9iamVjdCwgcHJpbnRlZAotCSAqIGFib3ZlIGJ5IF9QeV9QcmludFJlZmVyZW5jZXMuCi0JICovCi0JaWYgKFB5X0dFVEVOVigiUFlUSE9ORFVNUFJFRlMiKSkKLQkJX1B5X1ByaW50UmVmZXJlbmNlQWRkcmVzc2VzKHN0ZGVycik7CisgICAgLyogRGlzcGxheSBhZGRyZXNzZXMgKCYgcmVmY250cykgb2YgYWxsIG9iamVjdHMgc3RpbGwgYWxpdmUuCisgICAgICogQW4gYWRkcmVzcyBjYW4gYmUgdXNlZCB0byBmaW5kIHRoZSByZXByIG9mIHRoZSBvYmplY3QsIHByaW50ZWQKKyAgICAgKiBhYm92ZSBieSBfUHlfUHJpbnRSZWZlcmVuY2VzLgorICAgICAqLworICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkRVTVBSRUZTIikpCisgICAgICAgIF9QeV9QcmludFJlZmVyZW5jZUFkZHJlc3NlcyhzdGRlcnIpOwogI2VuZGlmIC8qIFB5X1RSQUNFX1JFRlMgKi8KICNpZmRlZiBQWU1BTExPQ19ERUJVRwotCWlmIChQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIikpCi0JCV9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKCk7CisgICAgaWYgKFB5X0dFVEVOVigiUFlUSE9OTUFMTE9DU1RBVFMiKSkKKyAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoKTsKICNlbmRpZgogCi0JY2FsbF9sbF9leGl0ZnVuY3MoKTsKKyAgICBjYWxsX2xsX2V4aXRmdW5jcygpOwogfQogCiAvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgaW50ZXJwcmV0ZXIgYW5kIHRocmVhZCwgYW5kIHJldHVybiB0aGUKQEAgLTU2MCw2NSArNTYwLDY1IEBACiBQeVRocmVhZFN0YXRlICoKIFB5X05ld0ludGVycHJldGVyKHZvaWQpCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlLCAqc2F2ZV90c3RhdGU7Ci0JUHlPYmplY3QgKmJpbW9kLCAqc3lzbW9kOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSwgKnNhdmVfdHN0YXRlOworICAgIFB5T2JqZWN0ICpiaW1vZCwgKnN5c21vZDsKIAotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5X0ZhdGFsRXJyb3IoIlB5X05ld0ludGVycHJldGVyOiBjYWxsIFB5X0luaXRpYWxpemUgZmlyc3QiKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9OZXdJbnRlcnByZXRlcjogY2FsbCBQeV9Jbml0aWFsaXplIGZpcnN0Iik7CiAKLQlpbnRlcnAgPSBQeUludGVycHJldGVyU3RhdGVfTmV3KCk7Ci0JaWYgKGludGVycCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpbnRlcnAgPSBQeUludGVycHJldGVyU3RhdGVfTmV3KCk7CisgICAgaWYgKGludGVycCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfTmV3KGludGVycCk7Ci0JaWYgKHRzdGF0ZSA9PSBOVUxMKSB7Ci0JCVB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUoaW50ZXJwKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfTmV3KGludGVycCk7CisgICAgaWYgKHRzdGF0ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUoaW50ZXJwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc2F2ZV90c3RhdGUgPSBQeVRocmVhZFN0YXRlX1N3YXAodHN0YXRlKTsKKyAgICBzYXZlX3RzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfU3dhcCh0c3RhdGUpOwogCi0JLyogWFhYIFRoZSBmb2xsb3dpbmcgaXMgbGF4IGluIGVycm9yIGNoZWNraW5nICovCisgICAgLyogWFhYIFRoZSBmb2xsb3dpbmcgaXMgbGF4IGluIGVycm9yIGNoZWNraW5nICovCiAKLQlpbnRlcnAtPm1vZHVsZXMgPSBQeURpY3RfTmV3KCk7Ci0JaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyA9IFB5RGljdF9OZXcoKTsKKyAgICBpbnRlcnAtPm1vZHVsZXMgPSBQeURpY3RfTmV3KCk7CisgICAgaW50ZXJwLT5tb2R1bGVzX3JlbG9hZGluZyA9IFB5RGljdF9OZXcoKTsKIAotCWJpbW9kID0gX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24oIl9fYnVpbHRpbl9fIiwgIl9fYnVpbHRpbl9fIik7Ci0JaWYgKGJpbW9kICE9IE5VTEwpIHsKLQkJaW50ZXJwLT5idWlsdGlucyA9IFB5TW9kdWxlX0dldERpY3QoYmltb2QpOwotCQlpZiAoaW50ZXJwLT5idWlsdGlucyA9PSBOVUxMKQotCQkJZ290byBoYW5kbGVfZXJyb3I7Ci0JCVB5X0lOQ1JFRihpbnRlcnAtPmJ1aWx0aW5zKTsKLQl9Ci0Jc3lzbW9kID0gX1B5SW1wb3J0X0ZpbmRFeHRlbnNpb24oInN5cyIsICJzeXMiKTsKLQlpZiAoYmltb2QgIT0gTlVMTCAmJiBzeXNtb2QgIT0gTlVMTCkgewotCQlpbnRlcnAtPnN5c2RpY3QgPSBQeU1vZHVsZV9HZXREaWN0KHN5c21vZCk7Ci0JCWlmIChpbnRlcnAtPnN5c2RpY3QgPT0gTlVMTCkKLQkJCWdvdG8gaGFuZGxlX2Vycm9yOwotCQlQeV9JTkNSRUYoaW50ZXJwLT5zeXNkaWN0KTsKLQkJUHlTeXNfU2V0UGF0aChQeV9HZXRQYXRoKCkpOwotCQlQeURpY3RfU2V0SXRlbVN0cmluZyhpbnRlcnAtPnN5c2RpY3QsICJtb2R1bGVzIiwKLQkJCQkgICAgIGludGVycC0+bW9kdWxlcyk7Ci0JCV9QeUltcG9ydEhvb2tzX0luaXQoKTsKLQkJaW5pdG1haW4oKTsKLQkJaWYgKCFQeV9Ob1NpdGVGbGFnKQotCQkJaW5pdHNpdGUoKTsKLQl9CisgICAgYmltb2QgPSBfUHlJbXBvcnRfRmluZEV4dGVuc2lvbigiX19idWlsdGluX18iLCAiX19idWlsdGluX18iKTsKKyAgICBpZiAoYmltb2QgIT0gTlVMTCkgeworICAgICAgICBpbnRlcnAtPmJ1aWx0aW5zID0gUHlNb2R1bGVfR2V0RGljdChiaW1vZCk7CisgICAgICAgIGlmIChpbnRlcnAtPmJ1aWx0aW5zID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGhhbmRsZV9lcnJvcjsKKyAgICAgICAgUHlfSU5DUkVGKGludGVycC0+YnVpbHRpbnMpOworICAgIH0KKyAgICBzeXNtb2QgPSBfUHlJbXBvcnRfRmluZEV4dGVuc2lvbigic3lzIiwgInN5cyIpOworICAgIGlmIChiaW1vZCAhPSBOVUxMICYmIHN5c21vZCAhPSBOVUxMKSB7CisgICAgICAgIGludGVycC0+c3lzZGljdCA9IFB5TW9kdWxlX0dldERpY3Qoc3lzbW9kKTsKKyAgICAgICAgaWYgKGludGVycC0+c3lzZGljdCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBoYW5kbGVfZXJyb3I7CisgICAgICAgIFB5X0lOQ1JFRihpbnRlcnAtPnN5c2RpY3QpOworICAgICAgICBQeVN5c19TZXRQYXRoKFB5X0dldFBhdGgoKSk7CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGludGVycC0+c3lzZGljdCwgIm1vZHVsZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnAtPm1vZHVsZXMpOworICAgICAgICBfUHlJbXBvcnRIb29rc19Jbml0KCk7CisgICAgICAgIGluaXRtYWluKCk7CisgICAgICAgIGlmICghUHlfTm9TaXRlRmxhZykKKyAgICAgICAgICAgIGluaXRzaXRlKCk7CisgICAgfQogCi0JaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotCQlyZXR1cm4gdHN0YXRlOworICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIHRzdGF0ZTsKIAogaGFuZGxlX2Vycm9yOgotCS8qIE9vcHMsIGl0IGRpZG4ndCB3b3JrLiAgVW5kbyBpdCBhbGwuICovCisgICAgLyogT29wcywgaXQgZGlkbid0IHdvcmsuICBVbmRvIGl0IGFsbC4gKi8KIAotCVB5RXJyX1ByaW50KCk7Ci0JUHlUaHJlYWRTdGF0ZV9DbGVhcih0c3RhdGUpOwotCVB5VGhyZWFkU3RhdGVfU3dhcChzYXZlX3RzdGF0ZSk7Ci0JUHlUaHJlYWRTdGF0ZV9EZWxldGUodHN0YXRlKTsKLQlQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CisgICAgUHlFcnJfUHJpbnQoKTsKKyAgICBQeVRocmVhZFN0YXRlX0NsZWFyKHRzdGF0ZSk7CisgICAgUHlUaHJlYWRTdGF0ZV9Td2FwKHNhdmVfdHN0YXRlKTsKKyAgICBQeVRocmVhZFN0YXRlX0RlbGV0ZSh0c3RhdGUpOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUoaW50ZXJwKTsKIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKiBEZWxldGUgYW4gaW50ZXJwcmV0ZXIgYW5kIGl0cyBsYXN0IHRocmVhZC4gIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUKQEAgLTYzNiwxOSArNjM2LDE5IEBACiB2b2lkCiBQeV9FbmRJbnRlcnByZXRlcihQeVRocmVhZFN0YXRlICp0c3RhdGUpCiB7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSB0c3RhdGUtPmludGVycDsKKyAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IHRzdGF0ZS0+aW50ZXJwOwogCi0JaWYgKHRzdGF0ZSAhPSBQeVRocmVhZFN0YXRlX0dFVCgpKQotCQlQeV9GYXRhbEVycm9yKCJQeV9FbmRJbnRlcnByZXRlcjogdGhyZWFkIGlzIG5vdCBjdXJyZW50Iik7Ci0JaWYgKHRzdGF0ZS0+ZnJhbWUgIT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfRW5kSW50ZXJwcmV0ZXI6IHRocmVhZCBzdGlsbCBoYXMgYSBmcmFtZSIpOwotCWlmICh0c3RhdGUgIT0gaW50ZXJwLT50c3RhdGVfaGVhZCB8fCB0c3RhdGUtPm5leHQgIT0gTlVMTCkKLQkJUHlfRmF0YWxFcnJvcigiUHlfRW5kSW50ZXJwcmV0ZXI6IG5vdCB0aGUgbGFzdCB0aHJlYWQiKTsKKyAgICBpZiAodHN0YXRlICE9IFB5VGhyZWFkU3RhdGVfR0VUKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X0VuZEludGVycHJldGVyOiB0aHJlYWQgaXMgbm90IGN1cnJlbnQiKTsKKyAgICBpZiAodHN0YXRlLT5mcmFtZSAhPSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9FbmRJbnRlcnByZXRlcjogdGhyZWFkIHN0aWxsIGhhcyBhIGZyYW1lIik7CisgICAgaWYgKHRzdGF0ZSAhPSBpbnRlcnAtPnRzdGF0ZV9oZWFkIHx8IHRzdGF0ZS0+bmV4dCAhPSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJQeV9FbmRJbnRlcnByZXRlcjogbm90IHRoZSBsYXN0IHRocmVhZCIpOwogCi0JUHlJbXBvcnRfQ2xlYW51cCgpOwotCVB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcihpbnRlcnApOwotCVB5VGhyZWFkU3RhdGVfU3dhcChOVUxMKTsKLQlQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CisgICAgUHlJbXBvcnRfQ2xlYW51cCgpOworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcihpbnRlcnApOworICAgIFB5VGhyZWFkU3RhdGVfU3dhcChOVUxMKTsKKyAgICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CiB9CiAKIHN0YXRpYyBjaGFyICpwcm9nbmFtZSA9ICJweXRob24iOwpAQCAtNjU2LDE0ICs2NTYsMTQgQEAKIHZvaWQKIFB5X1NldFByb2dyYW1OYW1lKGNoYXIgKnBuKQogewotCWlmIChwbiAmJiAqcG4pCi0JCXByb2duYW1lID0gcG47CisgICAgaWYgKHBuICYmICpwbikKKyAgICAgICAgcHJvZ25hbWUgPSBwbjsKIH0KIAogY2hhciAqCiBQeV9HZXRQcm9ncmFtTmFtZSh2b2lkKQogewotCXJldHVybiBwcm9nbmFtZTsKKyAgICByZXR1cm4gcHJvZ25hbWU7CiB9CiAKIHN0YXRpYyBjaGFyICpkZWZhdWx0X2hvbWUgPSBOVUxMOwpAQCAtNjcxLDE2ICs2NzEsMTYgQEAKIHZvaWQKIFB5X1NldFB5dGhvbkhvbWUoY2hhciAqaG9tZSkKIHsKLQlkZWZhdWx0X2hvbWUgPSBob21lOworICAgIGRlZmF1bHRfaG9tZSA9IGhvbWU7CiB9CiAKIGNoYXIgKgogUHlfR2V0UHl0aG9uSG9tZSh2b2lkKQogewotCWNoYXIgKmhvbWUgPSBkZWZhdWx0X2hvbWU7Ci0JaWYgKGhvbWUgPT0gTlVMTCAmJiAhUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnKQotCQlob21lID0gUHlfR0VURU5WKCJQWVRIT05IT01FIik7Ci0JcmV0dXJuIGhvbWU7CisgICAgY2hhciAqaG9tZSA9IGRlZmF1bHRfaG9tZTsKKyAgICBpZiAoaG9tZSA9PSBOVUxMICYmICFQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWcpCisgICAgICAgIGhvbWUgPSBQeV9HRVRFTlYoIlBZVEhPTkhPTUUiKTsKKyAgICByZXR1cm4gaG9tZTsKIH0KIAogLyogQ3JlYXRlIF9fbWFpbl9fIG1vZHVsZSAqLwpAQCAtNjg4LDE4ICs2ODgsMTggQEAKIHN0YXRpYyB2b2lkCiBpbml0bWFpbih2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOwotCWlmIChtID09IE5VTEwpCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGNyZWF0ZSBfX21haW5fXyBtb2R1bGUiKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIl9fYnVpbHRpbnNfXyIpID09IE5VTEwpIHsKLQkJUHlPYmplY3QgKmJpbW9kID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJfX2J1aWx0aW5fXyIpOwotCQlpZiAoYmltb2QgPT0gTlVMTCB8fAotCQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fYnVpbHRpbnNfXyIsIGJpbW9kKSAhPSAwKQotCQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgYWRkIF9fYnVpbHRpbnNfXyB0byBfX21haW5fXyIpOwotCQlQeV9ERUNSRUYoYmltb2QpOwotCX0KKyAgICBQeU9iamVjdCAqbSwgKmQ7CisgICAgbSA9IFB5SW1wb3J0X0FkZE1vZHVsZSgiX19tYWluX18iKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBjcmVhdGUgX19tYWluX18gbW9kdWxlIik7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iKSA9PSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICpiaW1vZCA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiX19idWlsdGluX18iKTsKKyAgICAgICAgaWYgKGJpbW9kID09IE5VTEwgfHwKKyAgICAgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX2J1aWx0aW5zX18iLCBiaW1vZCkgIT0gMCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGFkZCBfX2J1aWx0aW5zX18gdG8gX19tYWluX18iKTsKKyAgICAgICAgUHlfREVDUkVGKGJpbW9kKTsKKyAgICB9CiB9CiAKIC8qIEltcG9ydCB0aGUgc2l0ZSBtb2R1bGUgKG5vdCBpbnRvIF9fbWFpbl9fIHRob3VnaCkgKi8KQEAgLTcwNywxNTYgKzcwNywxNTYgQEAKIHN0YXRpYyB2b2lkCiBpbml0c2l0ZSh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZjsKLQltID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJzaXRlIik7Ci0JaWYgKG0gPT0gTlVMTCkgewotCQlmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKLQkJaWYgKFB5X1ZlcmJvc2VGbGFnKSB7Ci0JCQlQeUZpbGVfV3JpdGVTdHJpbmcoCi0JCQkJIidpbXBvcnQgc2l0ZScgZmFpbGVkOyB0cmFjZWJhY2s6XG4iLCBmKTsKLQkJCVB5RXJyX1ByaW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQeUZpbGVfV3JpdGVTdHJpbmcoCi0JCQkgICInaW1wb3J0IHNpdGUnIGZhaWxlZDsgdXNlIC12IGZvciB0cmFjZWJhY2tcbiIsIGYpOwotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJUHlfREVDUkVGKG0pOwotCX0KKyAgICBQeU9iamVjdCAqbSwgKmY7CisgICAgbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgic2l0ZSIpOworICAgIGlmIChtID09IE5VTEwpIHsKKyAgICAgICAgZiA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7CisgICAgICAgIGlmIChQeV9WZXJib3NlRmxhZykgeworICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKAorICAgICAgICAgICAgICAgICInaW1wb3J0IHNpdGUnIGZhaWxlZDsgdHJhY2ViYWNrOlxuIiwgZik7CisgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKAorICAgICAgICAgICAgICAiJ2ltcG9ydCBzaXRlJyBmYWlsZWQ7IHVzZSAtdiBmb3IgdHJhY2ViYWNrXG4iLCBmKTsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihtKTsKKyAgICB9CiB9CiAKIC8qIFBhcnNlIGlucHV0IGZyb20gYSBmaWxlIGFuZCBleGVjdXRlIGl0ICovCiAKIGludAogUHlSdW5fQW55RmlsZUV4RmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgY2xvc2VpdCwKLQkJICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQkJZmlsZW5hbWUgPSAiPz8/IjsKLQlpZiAoUHlfRmRJc0ludGVyYWN0aXZlKGZwLCBmaWxlbmFtZSkpIHsKLQkJaW50IGVyciA9IFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKGZwLCBmaWxlbmFtZSwgZmxhZ3MpOwotCQlpZiAoY2xvc2VpdCkKLQkJCWZjbG9zZShmcCk7Ci0JCXJldHVybiBlcnI7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGZwLCBmaWxlbmFtZSwgY2xvc2VpdCwgZmxhZ3MpOworICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQorICAgICAgICBmaWxlbmFtZSA9ICI/Pz8iOworICAgIGlmIChQeV9GZElzSW50ZXJhY3RpdmUoZnAsIGZpbGVuYW1lKSkgeworICAgICAgICBpbnQgZXJyID0gUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoZnAsIGZpbGVuYW1lLCBmbGFncyk7CisgICAgICAgIGlmIChjbG9zZWl0KQorICAgICAgICAgICAgZmNsb3NlKGZwKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZnAsIGZpbGVuYW1lLCBjbG9zZWl0LCBmbGFncyk7CiB9CiAKIGludAogUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCVB5T2JqZWN0ICp2OwotCWludCByZXQ7Ci0JUHlDb21waWxlckZsYWdzIGxvY2FsX2ZsYWdzOworICAgIFB5T2JqZWN0ICp2OworICAgIGludCByZXQ7CisgICAgUHlDb21waWxlckZsYWdzIGxvY2FsX2ZsYWdzOwogCi0JaWYgKGZsYWdzID09IE5VTEwpIHsKLQkJZmxhZ3MgPSAmbG9jYWxfZmxhZ3M7Ci0JCWxvY2FsX2ZsYWdzLmNmX2ZsYWdzID0gMDsKLQl9Ci0JdiA9IFB5U3lzX0dldE9iamVjdCgicHMxIik7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeVN5c19TZXRPYmplY3QoInBzMSIsIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI+Pj4gIikpOwotCQlQeV9YREVDUkVGKHYpOwotCX0KLQl2ID0gUHlTeXNfR2V0T2JqZWN0KCJwczIiKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5U3lzX1NldE9iamVjdCgicHMyIiwgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIi4uLiAiKSk7Ci0JCVB5X1hERUNSRUYodik7Ci0JfQotCWZvciAoOzspIHsKLQkJcmV0ID0gUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhmcCwgZmlsZW5hbWUsIGZsYWdzKTsKLQkJUFJJTlRfVE9UQUxfUkVGUygpOwotCQlpZiAocmV0ID09IEVfRU9GKQotCQkJcmV0dXJuIDA7Ci0JCS8qCi0JCWlmIChyZXQgPT0gRV9OT01FTSkKLQkJCXJldHVybiAtMTsKLQkJKi8KLQl9CisgICAgaWYgKGZsYWdzID09IE5VTEwpIHsKKyAgICAgICAgZmxhZ3MgPSAmbG9jYWxfZmxhZ3M7CisgICAgICAgIGxvY2FsX2ZsYWdzLmNmX2ZsYWdzID0gMDsKKyAgICB9CisgICAgdiA9IFB5U3lzX0dldE9iamVjdCgicHMxIik7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBQeVN5c19TZXRPYmplY3QoInBzMSIsIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCI+Pj4gIikpOworICAgICAgICBQeV9YREVDUkVGKHYpOworICAgIH0KKyAgICB2ID0gUHlTeXNfR2V0T2JqZWN0KCJwczIiKTsKKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5U3lzX1NldE9iamVjdCgicHMyIiwgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIi4uLiAiKSk7CisgICAgICAgIFB5X1hERUNSRUYodik7CisgICAgfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgcmV0ID0gUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhmcCwgZmlsZW5hbWUsIGZsYWdzKTsKKyAgICAgICAgUFJJTlRfVE9UQUxfUkVGUygpOworICAgICAgICBpZiAocmV0ID09IEVfRU9GKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIC8qCisgICAgICAgIGlmIChyZXQgPT0gRV9OT01FTSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKi8KKyAgICB9CiB9CiAKICNpZiAwCiAvKiBjb21wdXRlIHBhcnNlciBmbGFncyBiYXNlZCBvbiBjb21waWxlciBmbGFncyAqLwogI2RlZmluZSBQQVJTRVJfRkxBR1MoZmxhZ3MpIFwKLQkoKGZsYWdzKSA/ICgoKChmbGFncyktPmNmX2ZsYWdzICYgUHlDRl9ET05UX0lNUExZX0RFREVOVCkgPyBcCi0JCSAgICAgIFB5UEFSU0VfRE9OVF9JTVBMWV9ERURFTlQgOiAwKSkgOiAwKQorICAgICgoZmxhZ3MpID8gKCgoKGZsYWdzKS0+Y2ZfZmxhZ3MgJiBQeUNGX0RPTlRfSU1QTFlfREVERU5UKSA/IFwKKyAgICAgICAgICAgICAgICAgIFB5UEFSU0VfRE9OVF9JTVBMWV9ERURFTlQgOiAwKSkgOiAwKQogI2VuZGlmCiAjaWYgMQogLyogS2VlcCBhbiBleGFtcGxlIG9mIGZsYWdzIHdpdGggZnV0dXJlIGtleXdvcmQgc3VwcG9ydC4gKi8KICNkZWZpbmUgUEFSU0VSX0ZMQUdTKGZsYWdzKSBcCi0JKChmbGFncykgPyAoKCgoZmxhZ3MpLT5jZl9mbGFncyAmIFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQpID8gXAotCQkgICAgICBQeVBBUlNFX0RPTlRfSU1QTFlfREVERU5UIDogMCkgXAotCQkgICAgfCAoKChmbGFncyktPmNmX2ZsYWdzICYgQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OKSA/IFwKLQkJICAgICAgIFB5UEFSU0VfUFJJTlRfSVNfRlVOQ1RJT04gOiAwKSBcCi0JCSAgICB8ICgoKGZsYWdzKS0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUykgPyBcCi0JCSAgICAgICBQeVBBUlNFX1VOSUNPREVfTElURVJBTFMgOiAwKSBcCi0JCSAgICApIDogMCkKKyAgICAoKGZsYWdzKSA/ICgoKChmbGFncyktPmNmX2ZsYWdzICYgUHlDRl9ET05UX0lNUExZX0RFREVOVCkgPyBcCisgICAgICAgICAgICAgICAgICBQeVBBUlNFX0RPTlRfSU1QTFlfREVERU5UIDogMCkgXAorICAgICAgICAgICAgICAgIHwgKCgoZmxhZ3MpLT5jZl9mbGFncyAmIENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTikgPyBcCisgICAgICAgICAgICAgICAgICAgUHlQQVJTRV9QUklOVF9JU19GVU5DVElPTiA6IDApIFwKKyAgICAgICAgICAgICAgICB8ICgoKGZsYWdzKS0+Y2ZfZmxhZ3MgJiBDT19GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUykgPyBcCisgICAgICAgICAgICAgICAgICAgUHlQQVJTRV9VTklDT0RFX0xJVEVSQUxTIDogMCkgXAorICAgICAgICAgICAgICAgICkgOiAwKQogI2VuZGlmCiAKIGludAogUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqdiwgKnc7Ci0JbW9kX3R5IG1vZDsKLQlQeUFyZW5hICphcmVuYTsKLQljaGFyICpwczEgPSAiIiwgKnBzMiA9ICIiOwotCWludCBlcnJjb2RlID0gMDsKKyAgICBQeU9iamVjdCAqbSwgKmQsICp2LCAqdzsKKyAgICBtb2RfdHkgbW9kOworICAgIFB5QXJlbmEgKmFyZW5hOworICAgIGNoYXIgKnBzMSA9ICIiLCAqcHMyID0gIiI7CisgICAgaW50IGVycmNvZGUgPSAwOwogCi0JdiA9IFB5U3lzX0dldE9iamVjdCgicHMxIik7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQl2ID0gUHlPYmplY3RfU3RyKHYpOwotCQlpZiAodiA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sodikpCi0JCQlwczEgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQl9Ci0JdyA9IFB5U3lzX0dldE9iamVjdCgicHMyIik7Ci0JaWYgKHcgIT0gTlVMTCkgewotCQl3ID0gUHlPYmplY3RfU3RyKHcpOwotCQlpZiAodyA9PSBOVUxMKQotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2sodykpCi0JCQlwczIgPSBQeVN0cmluZ19Bc1N0cmluZyh3KTsKLQl9Ci0JYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCWlmIChhcmVuYSA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYodik7Ci0JCVB5X1hERUNSRUYodyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JbW9kID0gUHlQYXJzZXJfQVNURnJvbUZpbGUoZnAsIGZpbGVuYW1lLAotCQkJCSAgIFB5X3NpbmdsZV9pbnB1dCwgcHMxLCBwczIsCi0JCQkJICAgZmxhZ3MsICZlcnJjb2RlLCBhcmVuYSk7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeV9YREVDUkVGKHcpOwotCWlmIChtb2QgPT0gTlVMTCkgewotCQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCQlpZiAoZXJyY29kZSA9PSBFX0VPRikgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCXJldHVybiBFX0VPRjsKLQkJfQotCQlQeUVycl9QcmludCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW0gPSBQeUltcG9ydF9BZGRNb2R1bGUoIl9fbWFpbl9fIik7Ci0JaWYgKG0gPT0gTlVMTCkgewotCQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCXYgPSBydW5fbW9kKG1vZCwgZmlsZW5hbWUsIGQsIGQsIGZsYWdzLCBhcmVuYSk7Ci0JUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JUHlfREVDUkVGKHYpOwotCWlmIChQeV9GbHVzaExpbmUoKSkKLQkJUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gMDsKKyAgICB2ID0gUHlTeXNfR2V0T2JqZWN0KCJwczEiKTsKKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIHYgPSBQeU9iamVjdF9TdHIodik7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayh2KSkKKyAgICAgICAgICAgIHBzMSA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOworICAgIH0KKyAgICB3ID0gUHlTeXNfR2V0T2JqZWN0KCJwczIiKTsKKyAgICBpZiAodyAhPSBOVUxMKSB7CisgICAgICAgIHcgPSBQeU9iamVjdF9TdHIodyk7CisgICAgICAgIGlmICh3ID09IE5VTEwpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBlbHNlIGlmIChQeVN0cmluZ19DaGVjayh3KSkKKyAgICAgICAgICAgIHBzMiA9IFB5U3RyaW5nX0FzU3RyaW5nKHcpOworICAgIH0KKyAgICBhcmVuYSA9IFB5QXJlbmFfTmV3KCk7CisgICAgaWYgKGFyZW5hID09IE5VTEwpIHsKKyAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICAgICAgUHlfWERFQ1JFRih3KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tRmlsZShmcCwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc2luZ2xlX2lucHV0LCBwczEsIHBzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgJmVycmNvZGUsIGFyZW5hKTsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIFB5X1hERUNSRUYodyk7CisgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgIGlmIChlcnJjb2RlID09IEVfRU9GKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIEVfRU9GOworICAgICAgICB9CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbSA9IFB5SW1wb3J0X0FkZE1vZHVsZSgiX19tYWluX18iKTsKKyAgICBpZiAobSA9PSBOVUxMKSB7CisgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgdiA9IHJ1bl9tb2QobW9kLCBmaWxlbmFtZSwgZCwgZCwgZmxhZ3MsIGFyZW5hKTsKKyAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKFB5X0ZsdXNoTGluZSgpKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiAwOwogfQogCiAvKiBDaGVjayB3aGV0aGVyIGEgZmlsZSBtYXliZSBhIHB5YyBmaWxlOiBMb29rIGF0IHRoZSBleHRlbnNpb24sCkBAIC04NjUsNjI0ICs4NjUsNjI0IEBACiBzdGF0aWMgaW50CiBtYXliZV9weWNfZmlsZShGSUxFICpmcCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGV4dCwgaW50IGNsb3NlaXQpCiB7Ci0JaWYgKHN0cmNtcChleHQsICIucHljIikgPT0gMCB8fCBzdHJjbXAoZXh0LCAiLnB5byIpID09IDApCi0JCXJldHVybiAxOworICAgIGlmIChzdHJjbXAoZXh0LCAiLnB5YyIpID09IDAgfHwgc3RyY21wKGV4dCwgIi5weW8iKSA9PSAwKQorICAgICAgICByZXR1cm4gMTsKIAotCS8qIE9ubHkgbG9vayBpbnRvIHRoZSBmaWxlIGlmIHdlIGFyZSBhbGxvd2VkIHRvIGNsb3NlIGl0LCBzaW5jZQotCSAgIGl0IHRoZW4gc2hvdWxkIGFsc28gYmUgc2Vla2FibGUuICovCi0JaWYgKGNsb3NlaXQpIHsKLQkJLyogUmVhZCBvbmx5IHR3byBieXRlcyBvZiB0aGUgbWFnaWMuIElmIHRoZSBmaWxlIHdhcyBvcGVuZWQgaW4KLQkJICAgdGV4dCBtb2RlLCB0aGUgYnl0ZXMgMyBhbmQgNCBvZiB0aGUgbWFnaWMgKFxyXG4pIG1pZ2h0IG5vdAotCQkgICBiZSByZWFkIGFzIHRoZXkgYXJlIG9uIGRpc2suICovCi0JCXVuc2lnbmVkIGludCBoYWxmbWFnaWMgPSBQeUltcG9ydF9HZXRNYWdpY051bWJlcigpICYgMHhGRkZGOwotCQl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKLQkJLyogTWVzczogIEluIGNhc2Ugb2YgLXgsIHRoZSBzdHJlYW0gaXMgTk9UIGF0IGl0cyBzdGFydCBub3csCi0JCSAgIGFuZCB1bmdldGMoKSB3YXMgdXNlZCB0byBwdXNoIGJhY2sgdGhlIGZpcnN0IG5ld2xpbmUsCi0JCSAgIHdoaWNoIG1ha2VzIHRoZSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbiBmb3JtYWxseSB1bmRlZmluZWQsCi0JCSAgIGFuZCBhIHgtcGxhdGZvcm0gbmlnaHRtYXJlLgotCQkgICBVbmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIG5vIGRpcmVjdCB3YXkgdG8ga25vdyB3aGV0aGVyIC14Ci0JCSAgIHdhcyBzcGVjaWZpZWQuICBTbyB3ZSB1c2UgYSB0ZXJyaWJsZSBoYWNrOiAgaWYgdGhlIGN1cnJlbnQKLQkJICAgc3RyZWFtIHBvc2l0aW9uIGlzIG5vdCAwLCB3ZSBhc3N1bWUgLXggd2FzIHNwZWNpZmllZCwgYW5kCi0JCSAgIGdpdmUgdXAuICBCdWcgMTMyODUwIG9uIFNvdXJjZUZvcmdlIHNwZWxscyBvdXQgdGhlCi0JCSAgIGhvcGVsZXNzbmVzcyBvZiB0cnlpbmcgYW55dGhpbmcgZWxzZSAoZnNlZWsgYW5kIGZ0ZWxsCi0JCSAgIGRvbid0IHdvcmsgcHJlZGljdGFibHkgeC1wbGF0Zm9ybSBmb3IgdGV4dC1tb2RlIGZpbGVzKS4KLQkJKi8KLQkJaW50IGlzcHljID0gMDsKLQkJaWYgKGZ0ZWxsKGZwKSA9PSAwKSB7Ci0JCQlpZiAoZnJlYWQoYnVmLCAxLCAyLCBmcCkgPT0gMiAmJgotCQkJICAgICgodW5zaWduZWQgaW50KWJ1ZlsxXTw8OCB8IGJ1ZlswXSkgPT0gaGFsZm1hZ2ljKQotCQkJCWlzcHljID0gMTsKLQkJCXJld2luZChmcCk7Ci0JCX0KLQkJcmV0dXJuIGlzcHljOwotCX0KLQlyZXR1cm4gMDsKKyAgICAvKiBPbmx5IGxvb2sgaW50byB0aGUgZmlsZSBpZiB3ZSBhcmUgYWxsb3dlZCB0byBjbG9zZSBpdCwgc2luY2UKKyAgICAgICBpdCB0aGVuIHNob3VsZCBhbHNvIGJlIHNlZWthYmxlLiAqLworICAgIGlmIChjbG9zZWl0KSB7CisgICAgICAgIC8qIFJlYWQgb25seSB0d28gYnl0ZXMgb2YgdGhlIG1hZ2ljLiBJZiB0aGUgZmlsZSB3YXMgb3BlbmVkIGluCisgICAgICAgICAgIHRleHQgbW9kZSwgdGhlIGJ5dGVzIDMgYW5kIDQgb2YgdGhlIG1hZ2ljIChcclxuKSBtaWdodCBub3QKKyAgICAgICAgICAgYmUgcmVhZCBhcyB0aGV5IGFyZSBvbiBkaXNrLiAqLworICAgICAgICB1bnNpZ25lZCBpbnQgaGFsZm1hZ2ljID0gUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIoKSAmIDB4RkZGRjsKKyAgICAgICAgdW5zaWduZWQgY2hhciBidWZbMl07CisgICAgICAgIC8qIE1lc3M6ICBJbiBjYXNlIG9mIC14LCB0aGUgc3RyZWFtIGlzIE5PVCBhdCBpdHMgc3RhcnQgbm93LAorICAgICAgICAgICBhbmQgdW5nZXRjKCkgd2FzIHVzZWQgdG8gcHVzaCBiYWNrIHRoZSBmaXJzdCBuZXdsaW5lLAorICAgICAgICAgICB3aGljaCBtYWtlcyB0aGUgY3VycmVudCBzdHJlYW0gcG9zaXRpb24gZm9ybWFsbHkgdW5kZWZpbmVkLAorICAgICAgICAgICBhbmQgYSB4LXBsYXRmb3JtIG5pZ2h0bWFyZS4KKyAgICAgICAgICAgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSBubyBkaXJlY3Qgd2F5IHRvIGtub3cgd2hldGhlciAteAorICAgICAgICAgICB3YXMgc3BlY2lmaWVkLiAgU28gd2UgdXNlIGEgdGVycmlibGUgaGFjazogIGlmIHRoZSBjdXJyZW50CisgICAgICAgICAgIHN0cmVhbSBwb3NpdGlvbiBpcyBub3QgMCwgd2UgYXNzdW1lIC14IHdhcyBzcGVjaWZpZWQsIGFuZAorICAgICAgICAgICBnaXZlIHVwLiAgQnVnIDEzMjg1MCBvbiBTb3VyY2VGb3JnZSBzcGVsbHMgb3V0IHRoZQorICAgICAgICAgICBob3BlbGVzc25lc3Mgb2YgdHJ5aW5nIGFueXRoaW5nIGVsc2UgKGZzZWVrIGFuZCBmdGVsbAorICAgICAgICAgICBkb24ndCB3b3JrIHByZWRpY3RhYmx5IHgtcGxhdGZvcm0gZm9yIHRleHQtbW9kZSBmaWxlcykuCisgICAgICAgICovCisgICAgICAgIGludCBpc3B5YyA9IDA7CisgICAgICAgIGlmIChmdGVsbChmcCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGZyZWFkKGJ1ZiwgMSwgMiwgZnApID09IDIgJiYKKyAgICAgICAgICAgICAgICAoKHVuc2lnbmVkIGludClidWZbMV08PDggfCBidWZbMF0pID09IGhhbGZtYWdpYykKKyAgICAgICAgICAgICAgICBpc3B5YyA9IDE7CisgICAgICAgICAgICByZXdpbmQoZnApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpc3B5YzsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgY2xvc2VpdCwKLQkJCVB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCVB5T2JqZWN0ICptLCAqZCwgKnY7Ci0JY29uc3QgY2hhciAqZXh0OwotCWludCBzZXRfZmlsZV9uYW1lID0gMCwgcmV0LCBsZW47CisgICAgUHlPYmplY3QgKm0sICpkLCAqdjsKKyAgICBjb25zdCBjaGFyICpleHQ7CisgICAgaW50IHNldF9maWxlX25hbWUgPSAwLCByZXQsIGxlbjsKIAotCW0gPSBQeUltcG9ydF9BZGRNb2R1bGUoIl9fbWFpbl9fIik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCWlmIChQeURpY3RfR2V0SXRlbVN0cmluZyhkLCAiX19maWxlX18iKSA9PSBOVUxMKSB7Ci0JCVB5T2JqZWN0ICpmID0gUHlTdHJpbmdfRnJvbVN0cmluZyhmaWxlbmFtZSk7Ci0JCWlmIChmID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiX19maWxlX18iLCBmKSA8IDApIHsKLQkJCVB5X0RFQ1JFRihmKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlzZXRfZmlsZV9uYW1lID0gMTsKLQkJUHlfREVDUkVGKGYpOwotCX0KLQlsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwotCWV4dCA9IGZpbGVuYW1lICsgbGVuIC0gKGxlbiA+IDQgPyA0IDogMCk7Ci0JaWYgKG1heWJlX3B5Y19maWxlKGZwLCBmaWxlbmFtZSwgZXh0LCBjbG9zZWl0KSkgewotCQkvKiBUcnkgdG8gcnVuIGEgcHljIGZpbGUuIEZpcnN0LCByZS1vcGVuIGluIGJpbmFyeSAqLwotCQlpZiAoY2xvc2VpdCkKLQkJCWZjbG9zZShmcCk7Ci0JCWlmICgoZnAgPSBmb3BlbihmaWxlbmFtZSwgInJiIikpID09IE5VTEwpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAicHl0aG9uOiBDYW4ndCByZW9wZW4gLnB5YyBmaWxlXG4iKTsKLQkJCXJldCA9IC0xOwotCQkJZ290byBkb25lOwotCQl9Ci0JCS8qIFR1cm4gb24gb3B0aW1pemF0aW9uIGlmIGEgLnB5byBmaWxlIGlzIGdpdmVuICovCi0JCWlmIChzdHJjbXAoZXh0LCAiLnB5byIpID09IDApCi0JCQlQeV9PcHRpbWl6ZUZsYWcgPSAxOwotCQl2ID0gcnVuX3B5Y19maWxlKGZwLCBmaWxlbmFtZSwgZCwgZCwgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXYgPSBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgZmlsZW5hbWUsIFB5X2ZpbGVfaW5wdXQsIGQsIGQsCi0JCQkJICAgICAgY2xvc2VpdCwgZmxhZ3MpOwotCX0KLQlpZiAodiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldCA9IC0xOwotCQlnb3RvIGRvbmU7Ci0JfQotCVB5X0RFQ1JFRih2KTsKLQlpZiAoUHlfRmx1c2hMaW5lKCkpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JcmV0ID0gMDsKKyAgICBtID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIikgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqZiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoZmlsZW5hbWUpOworICAgICAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIl9fZmlsZV9fIiwgZikgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc2V0X2ZpbGVfbmFtZSA9IDE7CisgICAgICAgIFB5X0RFQ1JFRihmKTsKKyAgICB9CisgICAgbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKyAgICBleHQgPSBmaWxlbmFtZSArIGxlbiAtIChsZW4gPiA0ID8gNCA6IDApOworICAgIGlmIChtYXliZV9weWNfZmlsZShmcCwgZmlsZW5hbWUsIGV4dCwgY2xvc2VpdCkpIHsKKyAgICAgICAgLyogVHJ5IHRvIHJ1biBhIHB5YyBmaWxlLiBGaXJzdCwgcmUtb3BlbiBpbiBiaW5hcnkgKi8KKyAgICAgICAgaWYgKGNsb3NlaXQpCisgICAgICAgICAgICBmY2xvc2UoZnApOworICAgICAgICBpZiAoKGZwID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInB5dGhvbjogQ2FuJ3QgcmVvcGVuIC5weWMgZmlsZVxuIik7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgICAvKiBUdXJuIG9uIG9wdGltaXphdGlvbiBpZiBhIC5weW8gZmlsZSBpcyBnaXZlbiAqLworICAgICAgICBpZiAoc3RyY21wKGV4dCwgIi5weW8iKSA9PSAwKQorICAgICAgICAgICAgUHlfT3B0aW1pemVGbGFnID0gMTsKKyAgICAgICAgdiA9IHJ1bl9weWNfZmlsZShmcCwgZmlsZW5hbWUsIGQsIGQsIGZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2ID0gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIGZpbGVuYW1lLCBQeV9maWxlX2lucHV0LCBkLCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VpdCwgZmxhZ3MpOworICAgIH0KKyAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldCA9IC0xOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIFB5X0RFQ1JFRih2KTsKKyAgICBpZiAoUHlfRmx1c2hMaW5lKCkpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0ID0gMDsKICAgZG9uZToKLQlpZiAoc2V0X2ZpbGVfbmFtZSAmJiBQeURpY3RfRGVsSXRlbVN0cmluZyhkLCAiX19maWxlX18iKSkKLQkJUHlFcnJfQ2xlYXIoKTsKLQlyZXR1cm4gcmV0OworICAgIGlmIChzZXRfZmlsZV9uYW1lICYmIFB5RGljdF9EZWxJdGVtU3RyaW5nKGQsICJfX2ZpbGVfXyIpKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiByZXQ7CiB9CiAKIGludAogUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqY29tbWFuZCwgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlQeU9iamVjdCAqbSwgKmQsICp2OwotCW0gPSBQeUltcG9ydF9BZGRNb2R1bGUoIl9fbWFpbl9fIik7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCXYgPSBQeVJ1bl9TdHJpbmdGbGFncyhjb21tYW5kLCBQeV9maWxlX2lucHV0LCBkLCBkLCBmbGFncyk7Ci0JaWYgKHYgPT0gTlVMTCkgewotCQlQeUVycl9QcmludCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVB5X0RFQ1JFRih2KTsKLQlpZiAoUHlfRmx1c2hMaW5lKCkpCi0JCVB5RXJyX0NsZWFyKCk7Ci0JcmV0dXJuIDA7CisgICAgUHlPYmplY3QgKm0sICpkLCAqdjsKKyAgICBtID0gUHlJbXBvcnRfQWRkTW9kdWxlKCJfX21haW5fXyIpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICB2ID0gUHlSdW5fU3RyaW5nRmxhZ3MoY29tbWFuZCwgUHlfZmlsZV9pbnB1dCwgZCwgZCwgZmxhZ3MpOworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9ERUNSRUYodik7CisgICAgaWYgKFB5X0ZsdXNoTGluZSgpKQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiBwYXJzZV9zeW50YXhfZXJyb3IoUHlPYmplY3QgKmVyciwgUHlPYmplY3QgKiptZXNzYWdlLCBjb25zdCBjaGFyICoqZmlsZW5hbWUsCi0JCSAgIGludCAqbGluZW5vLCBpbnQgKm9mZnNldCwgY29uc3QgY2hhciAqKnRleHQpCisgICAgICAgICAgICAgICAgICAgaW50ICpsaW5lbm8sIGludCAqb2Zmc2V0LCBjb25zdCBjaGFyICoqdGV4dCkKIHsKLQlsb25nIGhvbGQ7Ci0JUHlPYmplY3QgKnY7CisgICAgbG9uZyBob2xkOworICAgIFB5T2JqZWN0ICp2OwogCi0JLyogb2xkIHN0eWxlIGVycm9ycyAqLwotCWlmIChQeVR1cGxlX0NoZWNrKGVycikpCi0JCXJldHVybiBQeUFyZ19QYXJzZVR1cGxlKGVyciwgIk8oemlpeikiLCBtZXNzYWdlLCBmaWxlbmFtZSwKLQkJCQkJbGluZW5vLCBvZmZzZXQsIHRleHQpOworICAgIC8qIG9sZCBzdHlsZSBlcnJvcnMgKi8KKyAgICBpZiAoUHlUdXBsZV9DaGVjayhlcnIpKQorICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZShlcnIsICJPKHppaXopIiwgbWVzc2FnZSwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgb2Zmc2V0LCB0ZXh0KTsKIAotCS8qIG5ldyBzdHlsZSBlcnJvcnMuICBgZXJyJyBpcyBhbiBpbnN0YW5jZSAqLworICAgIC8qIG5ldyBzdHlsZSBlcnJvcnMuICBgZXJyJyBpcyBhbiBpbnN0YW5jZSAqLwogCi0JaWYgKCEgKHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGVyciwgIm1zZyIpKSkKLQkJZ290byBmaW5hbGx5OwotCSptZXNzYWdlID0gdjsKKyAgICBpZiAoISAodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAibXNnIikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgKm1lc3NhZ2UgPSB2OwogCi0JaWYgKCEodiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXJyLCAiZmlsZW5hbWUiKSkpCi0JCWdvdG8gZmluYWxseTsKLQlpZiAodiA9PSBQeV9Ob25lKQotCQkqZmlsZW5hbWUgPSBOVUxMOwotCWVsc2UgaWYgKCEgKCpmaWxlbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpKSkKLQkJZ290byBmaW5hbGx5OworICAgIGlmICghKHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGVyciwgImZpbGVuYW1lIikpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICAgICAgKmZpbGVuYW1lID0gTlVMTDsKKyAgICBlbHNlIGlmICghICgqZmlsZW5hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyh2KSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKIAotCVB5X0RFQ1JFRih2KTsKLQlpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJsaW5lbm8iKSkpCi0JCWdvdG8gZmluYWxseTsKLQlob2xkID0gUHlJbnRfQXNMb25nKHYpOwotCVB5X0RFQ1JFRih2KTsKLQl2ID0gTlVMTDsKLQlpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJZ290byBmaW5hbGx5OwotCSpsaW5lbm8gPSAoaW50KWhvbGQ7CisgICAgUHlfREVDUkVGKHYpOworICAgIGlmICghKHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGVyciwgImxpbmVubyIpKSkKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIGhvbGQgPSBQeUludF9Bc0xvbmcodik7CisgICAgUHlfREVDUkVGKHYpOworICAgIHYgPSBOVUxMOworICAgIGlmIChob2xkIDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICBnb3RvIGZpbmFsbHk7CisgICAgKmxpbmVubyA9IChpbnQpaG9sZDsKIAotCWlmICghKHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGVyciwgIm9mZnNldCIpKSkKLQkJZ290byBmaW5hbGx5OwotCWlmICh2ID09IFB5X05vbmUpIHsKLQkJKm9mZnNldCA9IC0xOwotCQlQeV9ERUNSRUYodik7Ci0JCXYgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCWhvbGQgPSBQeUludF9Bc0xvbmcodik7Ci0JCVB5X0RFQ1JFRih2KTsKLQkJdiA9IE5VTEw7Ci0JCWlmIChob2xkIDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJZ290byBmaW5hbGx5OwotCQkqb2Zmc2V0ID0gKGludClob2xkOwotCX0KKyAgICBpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJvZmZzZXQiKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICpvZmZzZXQgPSAtMTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICB2ID0gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBob2xkID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICBQeV9ERUNSRUYodik7CisgICAgICAgIHYgPSBOVUxMOworICAgICAgICBpZiAoaG9sZCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICAgICAgKm9mZnNldCA9IChpbnQpaG9sZDsKKyAgICB9CiAKLQlpZiAoISh2ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhlcnIsICJ0ZXh0IikpKQotCQlnb3RvIGZpbmFsbHk7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQkJKnRleHQgPSBOVUxMOwotCWVsc2UgaWYgKCEgKCp0ZXh0ID0gUHlTdHJpbmdfQXNTdHJpbmcodikpKQotCQlnb3RvIGZpbmFsbHk7Ci0JUHlfREVDUkVGKHYpOwotCXJldHVybiAxOworICAgIGlmICghKHYgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGVyciwgInRleHQiKSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgICAgICAqdGV4dCA9IE5VTEw7CisgICAgZWxzZSBpZiAoISAoKnRleHQgPSBQeVN0cmluZ19Bc1N0cmluZyh2KSkpCisgICAgICAgIGdvdG8gZmluYWxseTsKKyAgICBQeV9ERUNSRUYodik7CisgICAgcmV0dXJuIDE7CiAKIGZpbmFsbHk6Ci0JUHlfWERFQ1JFRih2KTsKLQlyZXR1cm4gMDsKKyAgICBQeV9YREVDUkVGKHYpOworICAgIHJldHVybiAwOwogfQogCiB2b2lkCiBQeUVycl9QcmludCh2b2lkKQogewotCVB5RXJyX1ByaW50RXgoMSk7CisgICAgUHlFcnJfUHJpbnRFeCgxKTsKIH0KIAogc3RhdGljIHZvaWQKIHByaW50X2Vycm9yX3RleHQoUHlPYmplY3QgKmYsIGludCBvZmZzZXQsIGNvbnN0IGNoYXIgKnRleHQpCiB7Ci0JY2hhciAqbmw7Ci0JaWYgKG9mZnNldCA+PSAwKSB7Ci0JCWlmIChvZmZzZXQgPiAwICYmIG9mZnNldCA9PSAoaW50KXN0cmxlbih0ZXh0KSkKLQkJCW9mZnNldC0tOwotCQlmb3IgKDs7KSB7Ci0JCQlubCA9IHN0cmNocih0ZXh0LCAnXG4nKTsKLQkJCWlmIChubCA9PSBOVUxMIHx8IG5sLXRleHQgPj0gb2Zmc2V0KQotCQkJCWJyZWFrOwotCQkJb2Zmc2V0IC09IChpbnQpKG5sKzEtdGV4dCk7Ci0JCQl0ZXh0ID0gbmwrMTsKLQkJfQotCQl3aGlsZSAoKnRleHQgPT0gJyAnIHx8ICp0ZXh0ID09ICdcdCcpIHsKLQkJCXRleHQrKzsKLQkJCW9mZnNldC0tOwotCQl9Ci0JfQotCVB5RmlsZV9Xcml0ZVN0cmluZygiICAgICIsIGYpOwotCVB5RmlsZV9Xcml0ZVN0cmluZyh0ZXh0LCBmKTsKLQlpZiAoKnRleHQgPT0gJ1wwJyB8fCB0ZXh0W3N0cmxlbih0ZXh0KS0xXSAhPSAnXG4nKQotCQlQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZik7Ci0JaWYgKG9mZnNldCA9PSAtMSkKLQkJcmV0dXJuOwotCVB5RmlsZV9Xcml0ZVN0cmluZygiICAgICIsIGYpOwotCW9mZnNldC0tOwotCXdoaWxlIChvZmZzZXQgPiAwKSB7Ci0JCVB5RmlsZV9Xcml0ZVN0cmluZygiICIsIGYpOwotCQlvZmZzZXQtLTsKLQl9Ci0JUHlGaWxlX1dyaXRlU3RyaW5nKCJeXG4iLCBmKTsKKyAgICBjaGFyICpubDsKKyAgICBpZiAob2Zmc2V0ID49IDApIHsKKyAgICAgICAgaWYgKG9mZnNldCA+IDAgJiYgb2Zmc2V0ID09IChpbnQpc3RybGVuKHRleHQpKQorICAgICAgICAgICAgb2Zmc2V0LS07CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIG5sID0gc3RyY2hyKHRleHQsICdcbicpOworICAgICAgICAgICAgaWYgKG5sID09IE5VTEwgfHwgbmwtdGV4dCA+PSBvZmZzZXQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBvZmZzZXQgLT0gKGludCkobmwrMS10ZXh0KTsKKyAgICAgICAgICAgIHRleHQgPSBubCsxOworICAgICAgICB9CisgICAgICAgIHdoaWxlICgqdGV4dCA9PSAnICcgfHwgKnRleHQgPT0gJ1x0JykgeworICAgICAgICAgICAgdGV4dCsrOworICAgICAgICAgICAgb2Zmc2V0LS07CisgICAgICAgIH0KKyAgICB9CisgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCIgICAgIiwgZik7CisgICAgUHlGaWxlX1dyaXRlU3RyaW5nKHRleHQsIGYpOworICAgIGlmICgqdGV4dCA9PSAnXDAnIHx8IHRleHRbc3RybGVuKHRleHQpLTFdICE9ICdcbicpCisgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmKTsKKyAgICBpZiAob2Zmc2V0ID09IC0xKQorICAgICAgICByZXR1cm47CisgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCIgICAgIiwgZik7CisgICAgb2Zmc2V0LS07CisgICAgd2hpbGUgKG9mZnNldCA+IDApIHsKKyAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCIgIiwgZik7CisgICAgICAgIG9mZnNldC0tOworICAgIH0KKyAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIl5cbiIsIGYpOwogfQogCiBzdGF0aWMgdm9pZAogaGFuZGxlX3N5c3RlbV9leGl0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKmV4Y2VwdGlvbiwgKnZhbHVlLCAqdGI7Ci0JaW50IGV4aXRjb2RlID0gMDsKKyAgICBQeU9iamVjdCAqZXhjZXB0aW9uLCAqdmFsdWUsICp0YjsKKyAgICBpbnQgZXhpdGNvZGUgPSAwOwogCi0JaWYgKFB5X0luc3BlY3RGbGFnKQotCQkvKiBEb24ndCBleGl0IGlmIC1pIGZsYWcgd2FzIGdpdmVuLiBUaGlzIGZsYWcgaXMgc2V0IHRvIDAKLQkJICogd2hlbiBlbnRlcmluZyBpbnRlcmFjdGl2ZSBtb2RlIGZvciBpbnNwZWN0aW5nLiAqLwotCQlyZXR1cm47CisgICAgaWYgKFB5X0luc3BlY3RGbGFnKQorICAgICAgICAvKiBEb24ndCBleGl0IGlmIC1pIGZsYWcgd2FzIGdpdmVuLiBUaGlzIGZsYWcgaXMgc2V0IHRvIDAKKyAgICAgICAgICogd2hlbiBlbnRlcmluZyBpbnRlcmFjdGl2ZSBtb2RlIGZvciBpbnNwZWN0aW5nLiAqLworICAgICAgICByZXR1cm47CiAKLQlQeUVycl9GZXRjaCgmZXhjZXB0aW9uLCAmdmFsdWUsICZ0Yik7Ci0JaWYgKFB5X0ZsdXNoTGluZSgpKQotCQlQeUVycl9DbGVhcigpOwotCWZmbHVzaChzdGRvdXQpOwotCWlmICh2YWx1ZSA9PSBOVUxMIHx8IHZhbHVlID09IFB5X05vbmUpCi0JCWdvdG8gZG9uZTsKLQlpZiAoUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh2YWx1ZSkpIHsKLQkJLyogVGhlIGVycm9yIGNvZGUgc2hvdWxkIGJlIGluIHRoZSBgY29kZScgYXR0cmlidXRlLiAqLwotCQlQeU9iamVjdCAqY29kZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodmFsdWUsICJjb2RlIik7Ci0JCWlmIChjb2RlKSB7Ci0JCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJdmFsdWUgPSBjb2RlOwotCQkJaWYgKHZhbHVlID09IFB5X05vbmUpCi0JCQkJZ290byBkb25lOwotCQl9Ci0JCS8qIElmIHdlIGZhaWxlZCB0byBkaWcgb3V0IHRoZSAnY29kZScgYXR0cmlidXRlLAotCQkgICBqdXN0IGxldCB0aGUgZWxzZSBjbGF1c2UgYmVsb3cgcHJpbnQgdGhlIGVycm9yLiAqLwotCX0KLQlpZiAoUHlJbnRfQ2hlY2sodmFsdWUpKQotCQlleGl0Y29kZSA9IChpbnQpUHlJbnRfQXNMb25nKHZhbHVlKTsKLQllbHNlIHsKLQkJUHlPYmplY3RfUHJpbnQodmFsdWUsIHN0ZGVyciwgUHlfUFJJTlRfUkFXKTsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIlxuIik7Ci0JCWV4aXRjb2RlID0gMTsKLQl9CisgICAgUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbiwgJnZhbHVlLCAmdGIpOworICAgIGlmIChQeV9GbHVzaExpbmUoKSkKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBpZiAodmFsdWUgPT0gTlVMTCB8fCB2YWx1ZSA9PSBQeV9Ob25lKQorICAgICAgICBnb3RvIGRvbmU7CisgICAgaWYgKFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2hlY2sodmFsdWUpKSB7CisgICAgICAgIC8qIFRoZSBlcnJvciBjb2RlIHNob3VsZCBiZSBpbiB0aGUgYGNvZGUnIGF0dHJpYnV0ZS4gKi8KKyAgICAgICAgUHlPYmplY3QgKmNvZGUgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHZhbHVlLCAiY29kZSIpOworICAgICAgICBpZiAoY29kZSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgIHZhbHVlID0gY29kZTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQorICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgICAvKiBJZiB3ZSBmYWlsZWQgdG8gZGlnIG91dCB0aGUgJ2NvZGUnIGF0dHJpYnV0ZSwKKyAgICAgICAgICAganVzdCBsZXQgdGhlIGVsc2UgY2xhdXNlIGJlbG93IHByaW50IHRoZSBlcnJvci4gKi8KKyAgICB9CisgICAgaWYgKFB5SW50X0NoZWNrKHZhbHVlKSkKKyAgICAgICAgZXhpdGNvZGUgPSAoaW50KVB5SW50X0FzTG9uZyh2YWx1ZSk7CisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0X1ByaW50KHZhbHVlLCBzdGRlcnIsIFB5X1BSSU5UX1JBVyk7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJcbiIpOworICAgICAgICBleGl0Y29kZSA9IDE7CisgICAgfQogIGRvbmU6Ci0JLyogUmVzdG9yZSBhbmQgY2xlYXIgdGhlIGV4Y2VwdGlvbiBpbmZvLCBpbiBvcmRlciB0byBwcm9wZXJseSBkZWNyZWYKLQkgKiB0aGUgZXhjZXB0aW9uLCB2YWx1ZSwgYW5kIHRyYWNlYmFjay4JIElmIHdlIGp1c3QgZXhpdCBpbnN0ZWFkLAotCSAqIHRoZXNlIGxlYWssIHdoaWNoIGNvbmZ1c2VzIFBZVEhPTkRVTVBSRUZTIG91dHB1dCwgYW5kIG1heSBwcmV2ZW50Ci0JICogc29tZSBmaW5hbGl6ZXJzIGZyb20gcnVubmluZy4KLQkgKi8KLQlQeUVycl9SZXN0b3JlKGV4Y2VwdGlvbiwgdmFsdWUsIHRiKTsKLQlQeUVycl9DbGVhcigpOwotCVB5X0V4aXQoZXhpdGNvZGUpOwotCS8qIE5PVFJFQUNIRUQgKi8KKyAgICAvKiBSZXN0b3JlIGFuZCBjbGVhciB0aGUgZXhjZXB0aW9uIGluZm8sIGluIG9yZGVyIHRvIHByb3Blcmx5IGRlY3JlZgorICAgICAqIHRoZSBleGNlcHRpb24sIHZhbHVlLCBhbmQgdHJhY2ViYWNrLiAgICAgIElmIHdlIGp1c3QgZXhpdCBpbnN0ZWFkLAorICAgICAqIHRoZXNlIGxlYWssIHdoaWNoIGNvbmZ1c2VzIFBZVEhPTkRVTVBSRUZTIG91dHB1dCwgYW5kIG1heSBwcmV2ZW50CisgICAgICogc29tZSBmaW5hbGl6ZXJzIGZyb20gcnVubmluZy4KKyAgICAgKi8KKyAgICBQeUVycl9SZXN0b3JlKGV4Y2VwdGlvbiwgdmFsdWUsIHRiKTsKKyAgICBQeUVycl9DbGVhcigpOworICAgIFB5X0V4aXQoZXhpdGNvZGUpOworICAgIC8qIE5PVFJFQUNIRUQgKi8KIH0KIAogdm9pZAogUHlFcnJfUHJpbnRFeChpbnQgc2V0X3N5c19sYXN0X3ZhcnMpCiB7Ci0JUHlPYmplY3QgKmV4Y2VwdGlvbiwgKnYsICp0YiwgKmhvb2s7CisgICAgUHlPYmplY3QgKmV4Y2VwdGlvbiwgKnYsICp0YiwgKmhvb2s7CiAKLQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgewotCQloYW5kbGVfc3lzdGVtX2V4aXQoKTsKLQl9Ci0JUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbiwgJnYsICZ0Yik7Ci0JaWYgKGV4Y2VwdGlvbiA9PSBOVUxMKQotCQlyZXR1cm47Ci0JUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uKCZleGNlcHRpb24sICZ2LCAmdGIpOwotCWlmIChleGNlcHRpb24gPT0gTlVMTCkKLQkJcmV0dXJuOwotCS8qIE5vdyB3ZSBrbm93IHYgIT0gTlVMTCB0b28gKi8KLQlpZiAoc2V0X3N5c19sYXN0X3ZhcnMpIHsKLQkJUHlTeXNfU2V0T2JqZWN0KCJsYXN0X3R5cGUiLCBleGNlcHRpb24pOwotCQlQeVN5c19TZXRPYmplY3QoImxhc3RfdmFsdWUiLCB2KTsKLQkJUHlTeXNfU2V0T2JqZWN0KCJsYXN0X3RyYWNlYmFjayIsIHRiKTsKLQl9Ci0JaG9vayA9IFB5U3lzX0dldE9iamVjdCgiZXhjZXB0aG9vayIpOwotCWlmIChob29rKSB7Ci0JCVB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9QYWNrKDMsCi0JCSAgICBleGNlcHRpb24sIHYsIHRiID8gdGIgOiBQeV9Ob25lKTsKLQkJUHlPYmplY3QgKnJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGhvb2ssIGFyZ3MpOwotCQlpZiAocmVzdWx0ID09IE5VTEwpIHsKLQkJCVB5T2JqZWN0ICpleGNlcHRpb24yLCAqdjIsICp0YjI7Ci0JCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TeXN0ZW1FeGl0KSkgewotCQkJCWhhbmRsZV9zeXN0ZW1fZXhpdCgpOwotCQkJfQotCQkJUHlFcnJfRmV0Y2goJmV4Y2VwdGlvbjIsICZ2MiwgJnRiMik7Ci0JCQlQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJmV4Y2VwdGlvbjIsICZ2MiwgJnRiMik7Ci0JCQkvKiBJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGZvciBleGNlcHRpb24yIG9yIHYyCi0JCQkgICB0byBiZSBOVUxMLiBIb3dldmVyIFB5RXJyX0Rpc3BsYXkoKSBjYW4ndAotCQkJICAgdG9sZXJhdGUgTlVMTHMsIHNvIGp1c3QgYmUgc2FmZS4gKi8KLQkJCWlmIChleGNlcHRpb24yID09IE5VTEwpIHsKLQkJCQlleGNlcHRpb24yID0gUHlfTm9uZTsKLQkJCQlQeV9JTkNSRUYoZXhjZXB0aW9uMik7Ci0JCQl9Ci0JCQlpZiAodjIgPT0gTlVMTCkgewotCQkJCXYyID0gUHlfTm9uZTsKLQkJCQlQeV9JTkNSRUYodjIpOwotCQkJfQotCQkJaWYgKFB5X0ZsdXNoTGluZSgpKQotCQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQlmZmx1c2goc3Rkb3V0KTsKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJFcnJvciBpbiBzeXMuZXhjZXB0aG9vazpcbiIpOwotCQkJUHlFcnJfRGlzcGxheShleGNlcHRpb24yLCB2MiwgdGIyKTsKLQkJCVB5U3lzX1dyaXRlU3RkZXJyKCJcbk9yaWdpbmFsIGV4Y2VwdGlvbiB3YXM6XG4iKTsKLQkJCVB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uLCB2LCB0Yik7Ci0JCQlQeV9ERUNSRUYoZXhjZXB0aW9uMik7Ci0JCQlQeV9ERUNSRUYodjIpOwotCQkJUHlfWERFQ1JFRih0YjIpOwotCQl9Ci0JCVB5X1hERUNSRUYocmVzdWx0KTsKLQkJUHlfWERFQ1JFRihhcmdzKTsKLQl9IGVsc2UgewotCQlQeVN5c19Xcml0ZVN0ZGVycigic3lzLmV4Y2VwdGhvb2sgaXMgbWlzc2luZ1xuIik7Ci0JCVB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uLCB2LCB0Yik7Ci0JfQotCVB5X1hERUNSRUYoZXhjZXB0aW9uKTsKLQlQeV9YREVDUkVGKHYpOwotCVB5X1hERUNSRUYodGIpOworICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N5c3RlbUV4aXQpKSB7CisgICAgICAgIGhhbmRsZV9zeXN0ZW1fZXhpdCgpOworICAgIH0KKyAgICBQeUVycl9GZXRjaCgmZXhjZXB0aW9uLCAmdiwgJnRiKTsKKyAgICBpZiAoZXhjZXB0aW9uID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oJmV4Y2VwdGlvbiwgJnYsICZ0Yik7CisgICAgaWYgKGV4Y2VwdGlvbiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgLyogTm93IHdlIGtub3cgdiAhPSBOVUxMIHRvbyAqLworICAgIGlmIChzZXRfc3lzX2xhc3RfdmFycykgeworICAgICAgICBQeVN5c19TZXRPYmplY3QoImxhc3RfdHlwZSIsIGV4Y2VwdGlvbik7CisgICAgICAgIFB5U3lzX1NldE9iamVjdCgibGFzdF92YWx1ZSIsIHYpOworICAgICAgICBQeVN5c19TZXRPYmplY3QoImxhc3RfdHJhY2ViYWNrIiwgdGIpOworICAgIH0KKyAgICBob29rID0gUHlTeXNfR2V0T2JqZWN0KCJleGNlcHRob29rIik7CisgICAgaWYgKGhvb2spIHsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3MgPSBQeVR1cGxlX1BhY2soMywKKyAgICAgICAgICAgIGV4Y2VwdGlvbiwgdiwgdGIgPyB0YiA6IFB5X05vbmUpOworICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlFdmFsX0NhbGxPYmplY3QoaG9vaywgYXJncyk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlPYmplY3QgKmV4Y2VwdGlvbjIsICp2MiwgKnRiMjsKKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N5c3RlbUV4aXQpKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlX3N5c3RlbV9leGl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeUVycl9GZXRjaCgmZXhjZXB0aW9uMiwgJnYyLCAmdGIyKTsKKyAgICAgICAgICAgIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmZXhjZXB0aW9uMiwgJnYyLCAmdGIyKTsKKyAgICAgICAgICAgIC8qIEl0IHNob3VsZCBub3QgYmUgcG9zc2libGUgZm9yIGV4Y2VwdGlvbjIgb3IgdjIKKyAgICAgICAgICAgICAgIHRvIGJlIE5VTEwuIEhvd2V2ZXIgUHlFcnJfRGlzcGxheSgpIGNhbid0CisgICAgICAgICAgICAgICB0b2xlcmF0ZSBOVUxMcywgc28ganVzdCBiZSBzYWZlLiAqLworICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbjIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjIgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihleGNlcHRpb24yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2MiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdjIgPSBQeV9Ob25lOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih2Mik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoUHlfRmx1c2hMaW5lKCkpCisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkVycm9yIGluIHN5cy5leGNlcHRob29rOlxuIik7CisgICAgICAgICAgICBQeUVycl9EaXNwbGF5KGV4Y2VwdGlvbjIsIHYyLCB0YjIpOworICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlxuT3JpZ2luYWwgZXhjZXB0aW9uIHdhczpcbiIpOworICAgICAgICAgICAgUHlFcnJfRGlzcGxheShleGNlcHRpb24sIHYsIHRiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihleGNlcHRpb24yKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih2Mik7CisgICAgICAgICAgICBQeV9YREVDUkVGKHRiMik7CisgICAgICAgIH0KKyAgICAgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgICAgICBQeV9YREVDUkVGKGFyZ3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJzeXMuZXhjZXB0aG9vayBpcyBtaXNzaW5nXG4iKTsKKyAgICAgICAgUHlFcnJfRGlzcGxheShleGNlcHRpb24sIHYsIHRiKTsKKyAgICB9CisgICAgUHlfWERFQ1JFRihleGNlcHRpb24pOworICAgIFB5X1hERUNSRUYodik7CisgICAgUHlfWERFQ1JFRih0Yik7CiB9CiAKIHZvaWQKIFB5RXJyX0Rpc3BsYXkoUHlPYmplY3QgKmV4Y2VwdGlvbiwgUHlPYmplY3QgKnZhbHVlLCBQeU9iamVjdCAqdGIpCiB7Ci0JaW50IGVyciA9IDA7Ci0JUHlPYmplY3QgKmYgPSBQeVN5c19HZXRPYmplY3QoInN0ZGVyciIpOwotCVB5X0lOQ1JFRih2YWx1ZSk7Ci0JaWYgKGYgPT0gTlVMTCkKLQkJZnByaW50ZihzdGRlcnIsICJsb3N0IHN5cy5zdGRlcnJcbiIpOwotCWVsc2UgewotCQlpZiAoUHlfRmx1c2hMaW5lKCkpCi0JCQlQeUVycl9DbGVhcigpOwotCQlmZmx1c2goc3Rkb3V0KTsKLQkJaWYgKHRiICYmIHRiICE9IFB5X05vbmUpCi0JCQllcnIgPSBQeVRyYWNlQmFja19QcmludCh0YiwgZik7Ci0JCWlmIChlcnIgPT0gMCAmJgotCQkgICAgUHlPYmplY3RfSGFzQXR0clN0cmluZyh2YWx1ZSwgInByaW50X2ZpbGVfYW5kX2xpbmUiKSkKLQkJewotCQkJUHlPYmplY3QgKm1lc3NhZ2U7Ci0JCQljb25zdCBjaGFyICpmaWxlbmFtZSwgKnRleHQ7Ci0JCQlpbnQgbGluZW5vLCBvZmZzZXQ7Ci0JCQlpZiAoIXBhcnNlX3N5bnRheF9lcnJvcih2YWx1ZSwgJm1lc3NhZ2UsICZmaWxlbmFtZSwKLQkJCQkJCSZsaW5lbm8sICZvZmZzZXQsICZ0ZXh0KSkKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJZWxzZSB7Ci0JCQkJY2hhciBidWZbMTBdOwotCQkJCVB5RmlsZV9Xcml0ZVN0cmluZygiICBGaWxlIFwiIiwgZik7Ci0JCQkJaWYgKGZpbGVuYW1lID09IE5VTEwpCi0JCQkJCVB5RmlsZV9Xcml0ZVN0cmluZygiPHN0cmluZz4iLCBmKTsKLQkJCQllbHNlCi0JCQkJCVB5RmlsZV9Xcml0ZVN0cmluZyhmaWxlbmFtZSwgZik7Ci0JCQkJUHlGaWxlX1dyaXRlU3RyaW5nKCJcIiwgbGluZSAiLCBmKTsKLQkJCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIGxpbmVubyk7Ci0JCQkJUHlGaWxlX1dyaXRlU3RyaW5nKGJ1ZiwgZik7Ci0JCQkJUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOwotCQkJCWlmICh0ZXh0ICE9IE5VTEwpCi0JCQkJCXByaW50X2Vycm9yX3RleHQoZiwgb2Zmc2V0LCB0ZXh0KTsKLQkJCQlQeV9ERUNSRUYodmFsdWUpOwotCQkJCXZhbHVlID0gbWVzc2FnZTsKLQkJCQkvKiBDYW4ndCBiZSBib3RoZXJlZCB0byBjaGVjayBhbGwgdGhvc2UKLQkJCQkgICBQeUZpbGVfV3JpdGVTdHJpbmcoKSBjYWxscyAqLwotCQkJCWlmIChQeUVycl9PY2N1cnJlZCgpKQotCQkJCQllcnIgPSAtMTsKLQkJCX0KLQkJfQotCQlpZiAoZXJyKSB7Ci0JCQkvKiBEb24ndCBkbyBhbnl0aGluZyBlbHNlICovCi0JCX0KLQkJZWxzZSBpZiAoUHlFeGNlcHRpb25DbGFzc19DaGVjayhleGNlcHRpb24pKSB7Ci0JCQlQeU9iamVjdCogbW9kdWxlTmFtZTsKLQkJCWNoYXIqIGNsYXNzTmFtZSA9IFB5RXhjZXB0aW9uQ2xhc3NfTmFtZShleGNlcHRpb24pOwotCQkJaWYgKGNsYXNzTmFtZSAhPSBOVUxMKSB7Ci0JCQkJY2hhciAqZG90ID0gc3RycmNocihjbGFzc05hbWUsICcuJyk7Ci0JCQkJaWYgKGRvdCAhPSBOVUxMKQotCQkJCQljbGFzc05hbWUgPSBkb3QrMTsKLQkJCX0KKyAgICBpbnQgZXJyID0gMDsKKyAgICBQeU9iamVjdCAqZiA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBpZiAoZiA9PSBOVUxMKQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImxvc3Qgc3lzLnN0ZGVyclxuIik7CisgICAgZWxzZSB7CisgICAgICAgIGlmIChQeV9GbHVzaExpbmUoKSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICBpZiAodGIgJiYgdGIgIT0gUHlfTm9uZSkKKyAgICAgICAgICAgIGVyciA9IFB5VHJhY2VCYWNrX1ByaW50KHRiLCBmKTsKKyAgICAgICAgaWYgKGVyciA9PSAwICYmCisgICAgICAgICAgICBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHZhbHVlLCAicHJpbnRfZmlsZV9hbmRfbGluZSIpKQorICAgICAgICB7CisgICAgICAgICAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqdGV4dDsKKyAgICAgICAgICAgIGludCBsaW5lbm8sIG9mZnNldDsKKyAgICAgICAgICAgIGlmICghcGFyc2Vfc3ludGF4X2Vycm9yKHZhbHVlLCAmbWVzc2FnZSwgJmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbmVubywgJm9mZnNldCwgJnRleHQpKQorICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMF07CisgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCIgIEZpbGUgXCIiLCBmKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKCI8c3RyaW5nPiIsIGYpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgUHlGaWxlX1dyaXRlU3RyaW5nKGZpbGVuYW1lLCBmKTsKKyAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIlwiLCBsaW5lICIsIGYpOworICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkIiwgbGluZW5vKTsKKyAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoYnVmLCBmKTsKKyAgICAgICAgICAgICAgICBQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZik7CisgICAgICAgICAgICAgICAgaWYgKHRleHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3JfdGV4dChmLCBvZmZzZXQsIHRleHQpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBtZXNzYWdlOworICAgICAgICAgICAgICAgIC8qIENhbid0IGJlIGJvdGhlcmVkIHRvIGNoZWNrIGFsbCB0aG9zZQorICAgICAgICAgICAgICAgICAgIFB5RmlsZV9Xcml0ZVN0cmluZygpIGNhbGxzICovCisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIC8qIERvbid0IGRvIGFueXRoaW5nIGVsc2UgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0KiBtb2R1bGVOYW1lOworICAgICAgICAgICAgY2hhciogY2xhc3NOYW1lID0gUHlFeGNlcHRpb25DbGFzc19OYW1lKGV4Y2VwdGlvbik7CisgICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpkb3QgPSBzdHJyY2hyKGNsYXNzTmFtZSwgJy4nKTsKKyAgICAgICAgICAgICAgICBpZiAoZG90ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGRvdCsxOworICAgICAgICAgICAgfQogCi0JCQltb2R1bGVOYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhleGNlcHRpb24sICJfX21vZHVsZV9fIik7Ci0JCQlpZiAobW9kdWxlTmFtZSA9PSBOVUxMKQotCQkJCWVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7Ci0JCQllbHNlIHsKLQkJCQljaGFyKiBtb2RzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhtb2R1bGVOYW1lKTsKLQkJCQlpZiAobW9kc3RyICYmIHN0cmNtcChtb2RzdHIsICJleGNlcHRpb25zIikpCi0JCQkJewotCQkJCQllcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcobW9kc3RyLCBmKTsKLQkJCQkJZXJyICs9IFB5RmlsZV9Xcml0ZVN0cmluZygiLiIsIGYpOwotCQkJCX0KLQkJCQlQeV9ERUNSRUYobW9kdWxlTmFtZSk7Ci0JCQl9Ci0JCQlpZiAoZXJyID09IDApIHsKLQkJCQlpZiAoY2xhc3NOYW1lID09IE5VTEwpCi0JCQkJICAgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCI8dW5rbm93bj4iLCBmKTsKLQkJCQllbHNlCi0JCQkJICAgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKGNsYXNzTmFtZSwgZik7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KGV4Y2VwdGlvbiwgZiwgUHlfUFJJTlRfUkFXKTsKLQkJaWYgKGVyciA9PSAwICYmICh2YWx1ZSAhPSBQeV9Ob25lKSkgewotCQkJUHlPYmplY3QgKnMgPSBQeU9iamVjdF9TdHIodmFsdWUpOwotCQkJLyogb25seSBwcmludCBjb2xvbiBpZiB0aGUgc3RyKCkgb2YgdGhlCi0JCQkgICBvYmplY3QgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcKLQkJCSovCi0JCQlpZiAocyA9PSBOVUxMKQotCQkJCWVyciA9IC0xOwotCQkJZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKHMpIHx8Ci0JCQkJIFB5U3RyaW5nX0dFVF9TSVpFKHMpICE9IDApCi0JCQkJZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCI6ICIsIGYpOwotCQkJaWYgKGVyciA9PSAwKQotCQkJICBlcnIgPSBQeUZpbGVfV3JpdGVPYmplY3QocywgZiwgUHlfUFJJTlRfUkFXKTsKLQkJCVB5X1hERUNSRUYocyk7Ci0JCX0KLQkJLyogdHJ5IHRvIHdyaXRlIGEgbmV3bGluZSBpbiBhbnkgY2FzZSAqLwotCQllcnIgKz0gUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOwotCX0KLQlQeV9ERUNSRUYodmFsdWUpOwotCS8qIElmIGFuIGVycm9yIGhhcHBlbmVkIGhlcmUsIGRvbid0IHNob3cgaXQuCi0JICAgWFhYIFRoaXMgaXMgd3JvbmcsIGJ1dCB0b28gbWFueSBjYWxsZXJzIHJlbHkgb24gdGhpcyBiZWhhdmlvci4gKi8KLQlpZiAoZXJyICE9IDApCi0JCVB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICBtb2R1bGVOYW1lID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhleGNlcHRpb24sICJfX21vZHVsZV9fIik7CisgICAgICAgICAgICBpZiAobW9kdWxlTmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiPHVua25vd24+IiwgZik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBtb2RzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhtb2R1bGVOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAobW9kc3RyICYmIHN0cmNtcChtb2RzdHIsICJleGNlcHRpb25zIikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcobW9kc3RyLCBmKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyICs9IFB5RmlsZV9Xcml0ZVN0cmluZygiLiIsIGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobW9kdWxlTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCI8dW5rbm93bj4iLCBmKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKGNsYXNzTmFtZSwgZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KGV4Y2VwdGlvbiwgZiwgUHlfUFJJTlRfUkFXKTsKKyAgICAgICAgaWYgKGVyciA9PSAwICYmICh2YWx1ZSAhPSBQeV9Ob25lKSkgeworICAgICAgICAgICAgUHlPYmplY3QgKnMgPSBQeU9iamVjdF9TdHIodmFsdWUpOworICAgICAgICAgICAgLyogb25seSBwcmludCBjb2xvbiBpZiB0aGUgc3RyKCkgb2YgdGhlCisgICAgICAgICAgICAgICBvYmplY3QgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgZWxzZSBpZiAoIVB5U3RyaW5nX0NoZWNrKHMpIHx8CisgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19HRVRfU0laRShzKSAhPSAwKQorICAgICAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiOiAiLCBmKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlT2JqZWN0KHMsIGYsIFB5X1BSSU5UX1JBVyk7CisgICAgICAgICAgICBQeV9YREVDUkVGKHMpOworICAgICAgICB9CisgICAgICAgIC8qIHRyeSB0byB3cml0ZSBhIG5ld2xpbmUgaW4gYW55IGNhc2UgKi8KKyAgICAgICAgZXJyICs9IFB5RmlsZV9Xcml0ZVN0cmluZygiXG4iLCBmKTsKKyAgICB9CisgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAvKiBJZiBhbiBlcnJvciBoYXBwZW5lZCBoZXJlLCBkb24ndCBzaG93IGl0LgorICAgICAgIFhYWCBUaGlzIGlzIHdyb25nLCBidXQgdG9vIG1hbnkgY2FsbGVycyByZWx5IG9uIHRoaXMgYmVoYXZpb3IuICovCisgICAgaWYgKGVyciAhPSAwKQorICAgICAgICBQeUVycl9DbGVhcigpOwogfQogCiBQeU9iamVjdCAqCiBQeVJ1bl9TdHJpbmdGbGFncyhjb25zdCBjaGFyICpzdHIsIGludCBzdGFydCwgUHlPYmplY3QgKmdsb2JhbHMsCi0JCSAgUHlPYmplY3QgKmxvY2FscywgUHlDb21waWxlckZsYWdzICpmbGFncykKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpsb2NhbHMsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7Ci0JUHlPYmplY3QgKnJldCA9IE5VTEw7Ci0JbW9kX3R5IG1vZDsKLQlQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7Ci0JaWYgKGFyZW5hID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCQotCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCAiPHN0cmluZz4iLCBzdGFydCwgZmxhZ3MsIGFyZW5hKTsKLQlpZiAobW9kICE9IE5VTEwpCi0JCXJldCA9IHJ1bl9tb2QobW9kLCAiPHN0cmluZz4iLCBnbG9iYWxzLCBsb2NhbHMsIGZsYWdzLCBhcmVuYSk7Ci0JUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQlyZXR1cm4gcmV0OworICAgIFB5T2JqZWN0ICpyZXQgPSBOVUxMOworICAgIG1vZF90eSBtb2Q7CisgICAgUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOworICAgIGlmIChhcmVuYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCAiPHN0cmluZz4iLCBzdGFydCwgZmxhZ3MsIGFyZW5hKTsKKyAgICBpZiAobW9kICE9IE5VTEwpCisgICAgICAgIHJldCA9IHJ1bl9tb2QobW9kLCAiPHN0cmluZz4iLCBnbG9iYWxzLCBsb2NhbHMsIGZsYWdzLCBhcmVuYSk7CisgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBQeU9iamVjdCAqCiBQeVJ1bl9GaWxlRXhGbGFncyhGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCwgUHlPYmplY3QgKmdsb2JhbHMsCi0JCSAgUHlPYmplY3QgKmxvY2FscywgaW50IGNsb3NlaXQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbG9jYWxzLCBpbnQgY2xvc2VpdCwgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlQeU9iamVjdCAqcmV0OwotCW1vZF90eSBtb2Q7Ci0JUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCWlmIChhcmVuYSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQkKLQltb2QgPSBQeVBhcnNlcl9BU1RGcm9tRmlsZShmcCwgZmlsZW5hbWUsIHN0YXJ0LCAwLCAwLAotCQkJCSAgIGZsYWdzLCBOVUxMLCBhcmVuYSk7Ci0JaWYgKGNsb3NlaXQpCi0JCWZjbG9zZShmcCk7Ci0JaWYgKG1vZCA9PSBOVUxMKSB7Ci0JCVB5QXJlbmFfRnJlZShhcmVuYSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXQgPSBydW5fbW9kKG1vZCwgZmlsZW5hbWUsIGdsb2JhbHMsIGxvY2FscywgZmxhZ3MsIGFyZW5hKTsKLQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCXJldHVybiByZXQ7CisgICAgUHlPYmplY3QgKnJldDsKKyAgICBtb2RfdHkgbW9kOworICAgIFB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tRmlsZShmcCwgZmlsZW5hbWUsIHN0YXJ0LCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBOVUxMLCBhcmVuYSk7CisgICAgaWYgKGNsb3NlaXQpCisgICAgICAgIGZjbG9zZShmcCk7CisgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgIFB5QXJlbmFfRnJlZShhcmVuYSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXQgPSBydW5fbW9kKG1vZCwgZmlsZW5hbWUsIGdsb2JhbHMsIGxvY2FscywgZmxhZ3MsIGFyZW5hKTsKKyAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBydW5fbW9kKG1vZF90eSBtb2QsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBQeU9iamVjdCAqZ2xvYmFscywgUHlPYmplY3QgKmxvY2FscywKLQkgUHlDb21waWxlckZsYWdzICpmbGFncywgUHlBcmVuYSAqYXJlbmEpCisgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBQeUFyZW5hICphcmVuYSkKIHsKLQlQeUNvZGVPYmplY3QgKmNvOwotCVB5T2JqZWN0ICp2OwotCWNvID0gUHlBU1RfQ29tcGlsZShtb2QsIGZpbGVuYW1lLCBmbGFncywgYXJlbmEpOwotCWlmIChjbyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gUHlFdmFsX0V2YWxDb2RlKGNvLCBnbG9iYWxzLCBsb2NhbHMpOwotCVB5X0RFQ1JFRihjbyk7Ci0JcmV0dXJuIHY7CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBjbyA9IFB5QVNUX0NvbXBpbGUobW9kLCBmaWxlbmFtZSwgZmxhZ3MsIGFyZW5hKTsKKyAgICBpZiAoY28gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdiA9IFB5RXZhbF9FdmFsQ29kZShjbywgZ2xvYmFscywgbG9jYWxzKTsKKyAgICBQeV9ERUNSRUYoY28pOworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcnVuX3B5Y19maWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlPYmplY3QgKmdsb2JhbHMsCi0JICAgICBQeU9iamVjdCAqbG9jYWxzLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQorICAgICAgICAgICAgIFB5T2JqZWN0ICpsb2NhbHMsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCiB7Ci0JUHlDb2RlT2JqZWN0ICpjbzsKLQlQeU9iamVjdCAqdjsKLQlsb25nIG1hZ2ljOwotCWxvbmcgUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIodm9pZCk7CisgICAgUHlDb2RlT2JqZWN0ICpjbzsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBsb25nIG1hZ2ljOworICAgIGxvbmcgUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIodm9pZCk7CiAKLQltYWdpYyA9IFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKGZwKTsKLQlpZiAobWFnaWMgIT0gUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIoKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAotCQkJICAgIkJhZCBtYWdpYyBudW1iZXIgaW4gLnB5YyBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkodm9pZCkgUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOwotCXYgPSBQeU1hcnNoYWxfUmVhZExhc3RPYmplY3RGcm9tRmlsZShmcCk7Ci0JZmNsb3NlKGZwKTsKLQlpZiAodiA9PSBOVUxMIHx8ICFQeUNvZGVfQ2hlY2sodikpIHsKLQkJUHlfWERFQ1JFRih2KTsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCSAgICJCYWQgY29kZSBvYmplY3QgaW4gLnB5YyBmaWxlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljbyA9IChQeUNvZGVPYmplY3QgKil2OwotCXYgPSBQeUV2YWxfRXZhbENvZGUoY28sIGdsb2JhbHMsIGxvY2Fscyk7Ci0JaWYgKHYgJiYgZmxhZ3MpCi0JCWZsYWdzLT5jZl9mbGFncyB8PSAoY28tPmNvX2ZsYWdzICYgUHlDRl9NQVNLKTsKLQlQeV9ERUNSRUYoY28pOwotCXJldHVybiB2OworICAgIG1hZ2ljID0gUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgIGlmIChtYWdpYyAhPSBQeUltcG9ydF9HZXRNYWdpY051bWJlcigpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIkJhZCBtYWdpYyBudW1iZXIgaW4gLnB5YyBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAodm9pZCkgUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoZnApOworICAgIHYgPSBQeU1hcnNoYWxfUmVhZExhc3RPYmplY3RGcm9tRmlsZShmcCk7CisgICAgZmNsb3NlKGZwKTsKKyAgICBpZiAodiA9PSBOVUxMIHx8ICFQeUNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgUHlfWERFQ1JFRih2KTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAiQmFkIGNvZGUgb2JqZWN0IGluIC5weWMgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY28gPSAoUHlDb2RlT2JqZWN0ICopdjsKKyAgICB2ID0gUHlFdmFsX0V2YWxDb2RlKGNvLCBnbG9iYWxzLCBsb2NhbHMpOworICAgIGlmICh2ICYmIGZsYWdzKQorICAgICAgICBmbGFncy0+Y2ZfZmxhZ3MgfD0gKGNvLT5jb19mbGFncyAmIFB5Q0ZfTUFTSyk7CisgICAgUHlfREVDUkVGKGNvKTsKKyAgICByZXR1cm4gdjsKIH0KIAogUHlPYmplY3QgKgogUHlfQ29tcGlsZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCwKLQkJICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCVB5Q29kZU9iamVjdCAqY287Ci0JbW9kX3R5IG1vZDsKLQlQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7Ci0JaWYgKGFyZW5hID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIFB5Q29kZU9iamVjdCAqY287CisgICAgbW9kX3R5IG1vZDsKKyAgICBQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7CisgICAgaWYgKGFyZW5hID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCwgZmxhZ3MsIGFyZW5hKTsKLQlpZiAobW9kID09IE5VTEwpIHsKLQkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChmbGFncyAmJiAoZmxhZ3MtPmNmX2ZsYWdzICYgUHlDRl9PTkxZX0FTVCkpIHsKLQkJUHlPYmplY3QgKnJlc3VsdCA9IFB5QVNUX21vZDJvYmoobW9kKTsKLQkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JY28gPSBQeUFTVF9Db21waWxlKG1vZCwgZmlsZW5hbWUsIGZsYWdzLCBhcmVuYSk7Ci0JUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopY287CisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCwgZmxhZ3MsIGFyZW5hKTsKKyAgICBpZiAobW9kID09IE5VTEwpIHsKKyAgICAgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChmbGFncyAmJiAoZmxhZ3MtPmNmX2ZsYWdzICYgUHlDRl9PTkxZX0FTVCkpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5QVNUX21vZDJvYmoobW9kKTsKKyAgICAgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgY28gPSBQeUFTVF9Db21waWxlKG1vZCwgZmlsZW5hbWUsIGZsYWdzLCBhcmVuYSk7CisgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopY287CiB9CiAKIHN0cnVjdCBzeW10YWJsZSAqCiBQeV9TeW10YWJsZVN0cmluZyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQpCiB7Ci0Jc3RydWN0IHN5bXRhYmxlICpzdDsKLQltb2RfdHkgbW9kOwotCVB5Q29tcGlsZXJGbGFncyBmbGFnczsKLQlQeUFyZW5hICphcmVuYSA9IFB5QXJlbmFfTmV3KCk7Ci0JaWYgKGFyZW5hID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworICAgIHN0cnVjdCBzeW10YWJsZSAqc3Q7CisgICAgbW9kX3R5IG1vZDsKKyAgICBQeUNvbXBpbGVyRmxhZ3MgZmxhZ3M7CisgICAgUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOworICAgIGlmIChhcmVuYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWZsYWdzLmNmX2ZsYWdzID0gMDsKKyAgICBmbGFncy5jZl9mbGFncyA9IDA7CiAKLQltb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHN0ciwgZmlsZW5hbWUsIHN0YXJ0LCAmZmxhZ3MsIGFyZW5hKTsKLQlpZiAobW9kID09IE5VTEwpIHsKLQkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXN0ID0gUHlTeW10YWJsZV9CdWlsZChtb2QsIGZpbGVuYW1lLCAwKTsKLQlQeUFyZW5hX0ZyZWUoYXJlbmEpOwotCXJldHVybiBzdDsKKyAgICBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHN0ciwgZmlsZW5hbWUsIHN0YXJ0LCAmZmxhZ3MsIGFyZW5hKTsKKyAgICBpZiAobW9kID09IE5VTEwpIHsKKyAgICAgICAgUHlBcmVuYV9GcmVlKGFyZW5hKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0ID0gUHlTeW10YWJsZV9CdWlsZChtb2QsIGZpbGVuYW1lLCAwKTsKKyAgICBQeUFyZW5hX0ZyZWUoYXJlbmEpOworICAgIHJldHVybiBzdDsKIH0KIAogLyogUHJlZmVycmVkIGFjY2VzcyB0byBwYXJzZXIgaXMgdGhyb3VnaCBBU1QuICovCiBtb2RfdHkKIFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCwKLQkJICAgICAgIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIFB5QXJlbmEgKmFyZW5hKQorICAgICAgICAgICAgICAgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBQeUFyZW5hICphcmVuYSkKIHsKLQltb2RfdHkgbW9kOwotCVB5Q29tcGlsZXJGbGFncyBsb2NhbGZsYWdzOwotCXBlcnJkZXRhaWwgZXJyOwotCWludCBpZmxhZ3MgPSBQQVJTRVJfRkxBR1MoZmxhZ3MpOworICAgIG1vZF90eSBtb2Q7CisgICAgUHlDb21waWxlckZsYWdzIGxvY2FsZmxhZ3M7CisgICAgcGVycmRldGFpbCBlcnI7CisgICAgaW50IGlmbGFncyA9IFBBUlNFUl9GTEFHUyhmbGFncyk7CiAKLQlub2RlICpuID0gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lRXgocywgZmlsZW5hbWUsCi0JCQkJCSZfUHlQYXJzZXJfR3JhbW1hciwgc3RhcnQsICZlcnIsCi0JCQkJCSZpZmxhZ3MpOwotCWlmIChmbGFncyA9PSBOVUxMKSB7Ci0JCWxvY2FsZmxhZ3MuY2ZfZmxhZ3MgPSAwOwotCQlmbGFncyA9ICZsb2NhbGZsYWdzOwotCX0KLQlpZiAobikgewotCQlmbGFncy0+Y2ZfZmxhZ3MgfD0gaWZsYWdzICYgUHlDRl9NQVNLOwotCQltb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBmbGFncywgZmlsZW5hbWUsIGFyZW5hKTsKLQkJUHlOb2RlX0ZyZWUobik7Ci0JCXJldHVybiBtb2Q7Ci0JfQotCWVsc2UgewotCQllcnJfaW5wdXQoJmVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBub2RlICpuID0gUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lRXgocywgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX1B5UGFyc2VyX0dyYW1tYXIsIHN0YXJ0LCAmZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlmbGFncyk7CisgICAgaWYgKGZsYWdzID09IE5VTEwpIHsKKyAgICAgICAgbG9jYWxmbGFncy5jZl9mbGFncyA9IDA7CisgICAgICAgIGZsYWdzID0gJmxvY2FsZmxhZ3M7CisgICAgfQorICAgIGlmIChuKSB7CisgICAgICAgIGZsYWdzLT5jZl9mbGFncyB8PSBpZmxhZ3MgJiBQeUNGX01BU0s7CisgICAgICAgIG1vZCA9IFB5QVNUX0Zyb21Ob2RlKG4sIGZsYWdzLCBmaWxlbmFtZSwgYXJlbmEpOworICAgICAgICBQeU5vZGVfRnJlZShuKTsKKyAgICAgICAgcmV0dXJuIG1vZDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGVycl9pbnB1dCgmZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiBtb2RfdHkKIFB5UGFyc2VyX0FTVEZyb21GaWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0LCBjaGFyICpwczEsCi0JCSAgICAgY2hhciAqcHMyLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBpbnQgKmVycmNvZGUsCi0JCSAgICAgUHlBcmVuYSAqYXJlbmEpCisgICAgICAgICAgICAgICAgICAgICBjaGFyICpwczIsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIGludCAqZXJyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKQogewotCW1vZF90eSBtb2Q7Ci0JUHlDb21waWxlckZsYWdzIGxvY2FsZmxhZ3M7Ci0JcGVycmRldGFpbCBlcnI7Ci0JaW50IGlmbGFncyA9IFBBUlNFUl9GTEFHUyhmbGFncyk7CisgICAgbW9kX3R5IG1vZDsKKyAgICBQeUNvbXBpbGVyRmxhZ3MgbG9jYWxmbGFnczsKKyAgICBwZXJyZGV0YWlsIGVycjsKKyAgICBpbnQgaWZsYWdzID0gUEFSU0VSX0ZMQUdTKGZsYWdzKTsKIAotCW5vZGUgKm4gPSBQeVBhcnNlcl9QYXJzZUZpbGVGbGFnc0V4KGZwLCBmaWxlbmFtZSwgJl9QeVBhcnNlcl9HcmFtbWFyLAotCQkJCXN0YXJ0LCBwczEsIHBzMiwgJmVyciwgJmlmbGFncyk7Ci0JaWYgKGZsYWdzID09IE5VTEwpIHsKLQkJbG9jYWxmbGFncy5jZl9mbGFncyA9IDA7Ci0JCWZsYWdzID0gJmxvY2FsZmxhZ3M7Ci0JfQotCWlmIChuKSB7Ci0JCWZsYWdzLT5jZl9mbGFncyB8PSBpZmxhZ3MgJiBQeUNGX01BU0s7Ci0JCW1vZCA9IFB5QVNUX0Zyb21Ob2RlKG4sIGZsYWdzLCBmaWxlbmFtZSwgYXJlbmEpOwotCQlQeU5vZGVfRnJlZShuKTsKLQkJcmV0dXJuIG1vZDsKLQl9Ci0JZWxzZSB7Ci0JCWVycl9pbnB1dCgmZXJyKTsKLQkJaWYgKGVycmNvZGUpCi0JCQkqZXJyY29kZSA9IGVyci5lcnJvcjsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIG5vZGUgKm4gPSBQeVBhcnNlcl9QYXJzZUZpbGVGbGFnc0V4KGZwLCBmaWxlbmFtZSwgJl9QeVBhcnNlcl9HcmFtbWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBwczEsIHBzMiwgJmVyciwgJmlmbGFncyk7CisgICAgaWYgKGZsYWdzID09IE5VTEwpIHsKKyAgICAgICAgbG9jYWxmbGFncy5jZl9mbGFncyA9IDA7CisgICAgICAgIGZsYWdzID0gJmxvY2FsZmxhZ3M7CisgICAgfQorICAgIGlmIChuKSB7CisgICAgICAgIGZsYWdzLT5jZl9mbGFncyB8PSBpZmxhZ3MgJiBQeUNGX01BU0s7CisgICAgICAgIG1vZCA9IFB5QVNUX0Zyb21Ob2RlKG4sIGZsYWdzLCBmaWxlbmFtZSwgYXJlbmEpOworICAgICAgICBQeU5vZGVfRnJlZShuKTsKKyAgICAgICAgcmV0dXJuIG1vZDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGVycl9pbnB1dCgmZXJyKTsKKyAgICAgICAgaWYgKGVycmNvZGUpCisgICAgICAgICAgICAqZXJyY29kZSA9IGVyci5lcnJvcjsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiAvKiBTaW1wbGlmaWVkIGludGVyZmFjZSB0byBwYXJzZWZpbGUgLS0gcmV0dXJuIG5vZGUgb3Igc2V0IGV4Y2VwdGlvbiAqLwpAQCAtMTQ5MCwxMyArMTQ5MCwxMyBAQAogbm9kZSAqCiBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncyhGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzdGFydCwgaW50IGZsYWdzKQogewotCXBlcnJkZXRhaWwgZXJyOwotCW5vZGUgKm4gPSBQeVBhcnNlcl9QYXJzZUZpbGVGbGFncyhmcCwgZmlsZW5hbWUsICZfUHlQYXJzZXJfR3JhbW1hciwKLQkJCQkJICBzdGFydCwgTlVMTCwgTlVMTCwgJmVyciwgZmxhZ3MpOwotCWlmIChuID09IE5VTEwpCi0JCWVycl9pbnB1dCgmZXJyKTsKKyAgICBwZXJyZGV0YWlsIGVycjsKKyAgICBub2RlICpuID0gUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3MoZnAsIGZpbGVuYW1lLCAmX1B5UGFyc2VyX0dyYW1tYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBOVUxMLCBOVUxMLCAmZXJyLCBmbGFncyk7CisgICAgaWYgKG4gPT0gTlVMTCkKKyAgICAgICAgZXJyX2lucHV0KCZlcnIpOwogCi0JcmV0dXJuIG47CisgICAgcmV0dXJuIG47CiB9CiAKIC8qIFNpbXBsaWZpZWQgaW50ZXJmYWNlIHRvIHBhcnNlc3RyaW5nIC0tIHJldHVybiBub2RlIG9yIHNldCBleGNlcHRpb24gKi8KQEAgLTE1MDQsMzAgKzE1MDQsMzAgQEAKIG5vZGUgKgogUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhjb25zdCBjaGFyICpzdHIsIGludCBzdGFydCwgaW50IGZsYWdzKQogewotCXBlcnJkZXRhaWwgZXJyOwotCW5vZGUgKm4gPSBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzKHN0ciwgJl9QeVBhcnNlcl9HcmFtbWFyLAotCQkJCQkgICAgc3RhcnQsICZlcnIsIGZsYWdzKTsKLQlpZiAobiA9PSBOVUxMKQotCQllcnJfaW5wdXQoJmVycik7Ci0JcmV0dXJuIG47CisgICAgcGVycmRldGFpbCBlcnI7CisgICAgbm9kZSAqbiA9IFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3Moc3RyLCAmX1B5UGFyc2VyX0dyYW1tYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsICZlcnIsIGZsYWdzKTsKKyAgICBpZiAobiA9PSBOVUxMKQorICAgICAgICBlcnJfaW5wdXQoJmVycik7CisgICAgcmV0dXJuIG47CiB9CiAKIG5vZGUgKgogUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWludCBzdGFydCwgaW50IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGZsYWdzKQogewotCXBlcnJkZXRhaWwgZXJyOwotCW5vZGUgKm4gPSBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUoc3RyLCBmaWxlbmFtZSwKLQkJCQkmX1B5UGFyc2VyX0dyYW1tYXIsIHN0YXJ0LCAmZXJyLCBmbGFncyk7Ci0JaWYgKG4gPT0gTlVMTCkKLQkJZXJyX2lucHV0KCZlcnIpOwotCXJldHVybiBuOworICAgIHBlcnJkZXRhaWwgZXJyOworICAgIG5vZGUgKm4gPSBQeVBhcnNlcl9QYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUoc3RyLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX1B5UGFyc2VyX0dyYW1tYXIsIHN0YXJ0LCAmZXJyLCBmbGFncyk7CisgICAgaWYgKG4gPT0gTlVMTCkKKyAgICAgICAgZXJyX2lucHV0KCZlcnIpOworICAgIHJldHVybiBuOwogfQogCiBub2RlICoKIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmlsZW5hbWUoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0KQogewotCXJldHVybiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUoc3RyLCBmaWxlbmFtZSwgc3RhcnQsIDApOworICAgIHJldHVybiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUoc3RyLCBmaWxlbmFtZSwgc3RhcnQsIDApOwogfQogCiAvKiBNYXkgd2FudCB0byBtb3ZlIGEgbW9yZSBnZW5lcmFsaXplZCBmb3JtIG9mIHRoaXMgdG8gcGFyc2V0b2suYyBvcgpAQCAtMTUzNiw3ICsxNTM2LDcgQEAKIHZvaWQKIFB5UGFyc2VyX1NldEVycm9yKHBlcnJkZXRhaWwgKmVycikKIHsKLQllcnJfaW5wdXQoZXJyKTsKKyAgICBlcnJfaW5wdXQoZXJyKTsKIH0KIAogLyogU2V0IHRoZSBlcnJvciBhcHByb3ByaWF0ZSB0byB0aGUgZ2l2ZW4gaW5wdXQgZXJyb3IgY29kZSAoc2VlIGVycmNvZGUuaCkgKi8KQEAgLTE1NDQsOTggKzE1NDQsOTggQEAKIHN0YXRpYyB2b2lkCiBlcnJfaW5wdXQocGVycmRldGFpbCAqZXJyKQogewotCVB5T2JqZWN0ICp2LCAqdywgKmVycnR5cGU7Ci0JUHlPYmplY3QqIHUgPSBOVUxMOwotCWNoYXIgKm1zZyA9IE5VTEw7Ci0JZXJydHlwZSA9IFB5RXhjX1N5bnRheEVycm9yOwotCXN3aXRjaCAoZXJyLT5lcnJvcikgewotCWNhc2UgRV9FUlJPUjoKLQkJcmV0dXJuOwotCWNhc2UgRV9TWU5UQVg6Ci0JCWVycnR5cGUgPSBQeUV4Y19JbmRlbnRhdGlvbkVycm9yOwotCQlpZiAoZXJyLT5leHBlY3RlZCA9PSBJTkRFTlQpCi0JCQltc2cgPSAiZXhwZWN0ZWQgYW4gaW5kZW50ZWQgYmxvY2siOwotCQllbHNlIGlmIChlcnItPnRva2VuID09IElOREVOVCkKLQkJCW1zZyA9ICJ1bmV4cGVjdGVkIGluZGVudCI7Ci0JCWVsc2UgaWYgKGVyci0+dG9rZW4gPT0gREVERU5UKQotCQkJbXNnID0gInVuZXhwZWN0ZWQgdW5pbmRlbnQiOwotCQllbHNlIHsKLQkJCWVycnR5cGUgPSBQeUV4Y19TeW50YXhFcnJvcjsKLQkJCW1zZyA9ICJpbnZhbGlkIHN5bnRheCI7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBFX1RPS0VOOgotCQltc2cgPSAiaW52YWxpZCB0b2tlbiI7Ci0JCWJyZWFrOwotCWNhc2UgRV9FT0ZTOgotCQltc2cgPSAiRU9GIHdoaWxlIHNjYW5uaW5nIHRyaXBsZS1xdW90ZWQgc3RyaW5nIGxpdGVyYWwiOwotCQlicmVhazsKLQljYXNlIEVfRU9MUzoKLQkJbXNnID0gIkVPTCB3aGlsZSBzY2FubmluZyBzdHJpbmcgbGl0ZXJhbCI7Ci0JCWJyZWFrOwotCWNhc2UgRV9JTlRSOgotCQlpZiAoIVB5RXJyX09jY3VycmVkKCkpCi0JCQlQeUVycl9TZXROb25lKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KTsKLQkJZ290byBjbGVhbnVwOwotCWNhc2UgRV9OT01FTToKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBjbGVhbnVwOwotCWNhc2UgRV9FT0Y6Ci0JCW1zZyA9ICJ1bmV4cGVjdGVkIEVPRiB3aGlsZSBwYXJzaW5nIjsKLQkJYnJlYWs7Ci0JY2FzZSBFX1RBQlNQQUNFOgotCQllcnJ0eXBlID0gUHlFeGNfVGFiRXJyb3I7Ci0JCW1zZyA9ICJpbmNvbnNpc3RlbnQgdXNlIG9mIHRhYnMgYW5kIHNwYWNlcyBpbiBpbmRlbnRhdGlvbiI7Ci0JCWJyZWFrOwotCWNhc2UgRV9PVkVSRkxPVzoKLQkJbXNnID0gImV4cHJlc3Npb24gdG9vIGxvbmciOwotCQlicmVhazsKLQljYXNlIEVfREVERU5UOgotCQllcnJ0eXBlID0gUHlFeGNfSW5kZW50YXRpb25FcnJvcjsKLQkJbXNnID0gInVuaW5kZW50IGRvZXMgbm90IG1hdGNoIGFueSBvdXRlciBpbmRlbnRhdGlvbiBsZXZlbCI7Ci0JCWJyZWFrOwotCWNhc2UgRV9UT09ERUVQOgotCQllcnJ0eXBlID0gUHlFeGNfSW5kZW50YXRpb25FcnJvcjsKLQkJbXNnID0gInRvbyBtYW55IGxldmVscyBvZiBpbmRlbnRhdGlvbiI7Ci0JCWJyZWFrOwotCWNhc2UgRV9ERUNPREU6IHsKLQkJUHlPYmplY3QgKnR5cGUsICp2YWx1ZSwgKnRiOwotCQlQeUVycl9GZXRjaCgmdHlwZSwgJnZhbHVlLCAmdGIpOwotCQlpZiAodmFsdWUgIT0gTlVMTCkgewotCQkJdSA9IFB5T2JqZWN0X1N0cih2YWx1ZSk7Ci0JCQlpZiAodSAhPSBOVUxMKSB7Ci0JCQkJbXNnID0gUHlTdHJpbmdfQXNTdHJpbmcodSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1zZyA9PSBOVUxMKQotCQkJbXNnID0gInVua25vd24gZGVjb2RlIGVycm9yIjsKLQkJUHlfWERFQ1JFRih0eXBlKTsKLQkJUHlfWERFQ1JFRih2YWx1ZSk7Ci0JCVB5X1hERUNSRUYodGIpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBFX0xJTkVDT05UOgotCQltc2cgPSAidW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgbGluZSBjb250aW51YXRpb24gY2hhcmFjdGVyIjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICJlcnJvcj0lZFxuIiwgZXJyLT5lcnJvcik7Ci0JCW1zZyA9ICJ1bmtub3duIHBhcnNpbmcgZXJyb3IiOwotCQlicmVhazsKLQl9Ci0JdiA9IFB5X0J1aWxkVmFsdWUoIih6aWl6KSIsIGVyci0+ZmlsZW5hbWUsCi0JCQkgIGVyci0+bGluZW5vLCBlcnItPm9mZnNldCwgZXJyLT50ZXh0KTsKLQl3ID0gTlVMTDsKLQlpZiAodiAhPSBOVUxMKQotCQl3ID0gUHlfQnVpbGRWYWx1ZSgiKHNPKSIsIG1zZywgdik7Ci0JUHlfWERFQ1JFRih1KTsKLQlQeV9YREVDUkVGKHYpOwotCVB5RXJyX1NldE9iamVjdChlcnJ0eXBlLCB3KTsKLQlQeV9YREVDUkVGKHcpOworICAgIFB5T2JqZWN0ICp2LCAqdywgKmVycnR5cGU7CisgICAgUHlPYmplY3QqIHUgPSBOVUxMOworICAgIGNoYXIgKm1zZyA9IE5VTEw7CisgICAgZXJydHlwZSA9IFB5RXhjX1N5bnRheEVycm9yOworICAgIHN3aXRjaCAoZXJyLT5lcnJvcikgeworICAgIGNhc2UgRV9FUlJPUjoKKyAgICAgICAgcmV0dXJuOworICAgIGNhc2UgRV9TWU5UQVg6CisgICAgICAgIGVycnR5cGUgPSBQeUV4Y19JbmRlbnRhdGlvbkVycm9yOworICAgICAgICBpZiAoZXJyLT5leHBlY3RlZCA9PSBJTkRFTlQpCisgICAgICAgICAgICBtc2cgPSAiZXhwZWN0ZWQgYW4gaW5kZW50ZWQgYmxvY2siOworICAgICAgICBlbHNlIGlmIChlcnItPnRva2VuID09IElOREVOVCkKKyAgICAgICAgICAgIG1zZyA9ICJ1bmV4cGVjdGVkIGluZGVudCI7CisgICAgICAgIGVsc2UgaWYgKGVyci0+dG9rZW4gPT0gREVERU5UKQorICAgICAgICAgICAgbXNnID0gInVuZXhwZWN0ZWQgdW5pbmRlbnQiOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGVycnR5cGUgPSBQeUV4Y19TeW50YXhFcnJvcjsKKyAgICAgICAgICAgIG1zZyA9ICJpbnZhbGlkIHN5bnRheCI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFX1RPS0VOOgorICAgICAgICBtc2cgPSAiaW52YWxpZCB0b2tlbiI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRV9FT0ZTOgorICAgICAgICBtc2cgPSAiRU9GIHdoaWxlIHNjYW5uaW5nIHRyaXBsZS1xdW90ZWQgc3RyaW5nIGxpdGVyYWwiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfRU9MUzoKKyAgICAgICAgbXNnID0gIkVPTCB3aGlsZSBzY2FubmluZyBzdHJpbmcgbGl0ZXJhbCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRV9JTlRSOgorICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGNhc2UgRV9OT01FTToKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIGNhc2UgRV9FT0Y6CisgICAgICAgIG1zZyA9ICJ1bmV4cGVjdGVkIEVPRiB3aGlsZSBwYXJzaW5nIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFX1RBQlNQQUNFOgorICAgICAgICBlcnJ0eXBlID0gUHlFeGNfVGFiRXJyb3I7CisgICAgICAgIG1zZyA9ICJpbmNvbnNpc3RlbnQgdXNlIG9mIHRhYnMgYW5kIHNwYWNlcyBpbiBpbmRlbnRhdGlvbiI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRV9PVkVSRkxPVzoKKyAgICAgICAgbXNnID0gImV4cHJlc3Npb24gdG9vIGxvbmciOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEVfREVERU5UOgorICAgICAgICBlcnJ0eXBlID0gUHlFeGNfSW5kZW50YXRpb25FcnJvcjsKKyAgICAgICAgbXNnID0gInVuaW5kZW50IGRvZXMgbm90IG1hdGNoIGFueSBvdXRlciBpbmRlbnRhdGlvbiBsZXZlbCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRV9UT09ERUVQOgorICAgICAgICBlcnJ0eXBlID0gUHlFeGNfSW5kZW50YXRpb25FcnJvcjsKKyAgICAgICAgbXNnID0gInRvbyBtYW55IGxldmVscyBvZiBpbmRlbnRhdGlvbiI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRV9ERUNPREU6IHsKKyAgICAgICAgUHlPYmplY3QgKnR5cGUsICp2YWx1ZSwgKnRiOworICAgICAgICBQeUVycl9GZXRjaCgmdHlwZSwgJnZhbHVlLCAmdGIpOworICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgdSA9IFB5T2JqZWN0X1N0cih2YWx1ZSk7CisgICAgICAgICAgICBpZiAodSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbXNnID0gUHlTdHJpbmdfQXNTdHJpbmcodSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1zZyA9PSBOVUxMKQorICAgICAgICAgICAgbXNnID0gInVua25vd24gZGVjb2RlIGVycm9yIjsKKyAgICAgICAgUHlfWERFQ1JFRih0eXBlKTsKKyAgICAgICAgUHlfWERFQ1JFRih2YWx1ZSk7CisgICAgICAgIFB5X1hERUNSRUYodGIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBFX0xJTkVDT05UOgorICAgICAgICBtc2cgPSAidW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgbGluZSBjb250aW51YXRpb24gY2hhcmFjdGVyIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcj0lZFxuIiwgZXJyLT5lcnJvcik7CisgICAgICAgIG1zZyA9ICJ1bmtub3duIHBhcnNpbmcgZXJyb3IiOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgdiA9IFB5X0J1aWxkVmFsdWUoIih6aWl6KSIsIGVyci0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgZXJyLT5saW5lbm8sIGVyci0+b2Zmc2V0LCBlcnItPnRleHQpOworICAgIHcgPSBOVUxMOworICAgIGlmICh2ICE9IE5VTEwpCisgICAgICAgIHcgPSBQeV9CdWlsZFZhbHVlKCIoc08pIiwgbXNnLCB2KTsKKyAgICBQeV9YREVDUkVGKHUpOworICAgIFB5X1hERUNSRUYodik7CisgICAgUHlFcnJfU2V0T2JqZWN0KGVycnR5cGUsIHcpOworICAgIFB5X1hERUNSRUYodyk7CiBjbGVhbnVwOgotCWlmIChlcnItPnRleHQgIT0gTlVMTCkgewotCQlQeU9iamVjdF9GUkVFKGVyci0+dGV4dCk7Ci0JCWVyci0+dGV4dCA9IE5VTEw7Ci0JfQorICAgIGlmIChlcnItPnRleHQgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdF9GUkVFKGVyci0+dGV4dCk7CisgICAgICAgIGVyci0+dGV4dCA9IE5VTEw7CisgICAgfQogfQogCiAvKiBQcmludCBmYXRhbCBlcnJvciBtZXNzYWdlIGFuZCBhYm9ydCAqLwpAQCAtMTY0MywzMCArMTY0MywzMCBAQAogdm9pZAogUHlfRmF0YWxFcnJvcihjb25zdCBjaGFyICptc2cpCiB7Ci0JZnByaW50ZihzdGRlcnIsICJGYXRhbCBQeXRob24gZXJyb3I6ICVzXG4iLCBtc2cpOwotCWZmbHVzaChzdGRlcnIpOyAvKiBpdCBoZWxwcyBpbiBXaW5kb3dzIGRlYnVnIGJ1aWxkICovCisgICAgZnByaW50ZihzdGRlcnIsICJGYXRhbCBQeXRob24gZXJyb3I6ICVzXG4iLCBtc2cpOworICAgIGZmbHVzaChzdGRlcnIpOyAvKiBpdCBoZWxwcyBpbiBXaW5kb3dzIGRlYnVnIGJ1aWxkICovCiAKICNpZmRlZiBNU19XSU5ET1dTCi0JewotCQlzaXplX3QgbGVuID0gc3RybGVuKG1zZyk7Ci0JCVdDSEFSKiBidWZmZXI7Ci0JCXNpemVfdCBpOworICAgIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihtc2cpOworICAgICAgICBXQ0hBUiogYnVmZmVyOworICAgICAgICBzaXplX3QgaTsKIAotCQkvKiBDb252ZXJ0IHRoZSBtZXNzYWdlIHRvIHdjaGFyX3QuIFRoaXMgdXNlcyBhIHNpbXBsZSBvbmUtdG8tb25lCi0JCWNvbnZlcnNpb24sIGFzc3VtaW5nIHRoYXQgdGhlIHRoaXMgZXJyb3IgbWVzc2FnZSBhY3R1YWxseSB1c2VzIEFTQ0lJCi0JCW9ubHkuIElmIHRoaXMgY2Vhc2VzIHRvIGJlIHRydWUsIHdlIHdpbGwgaGF2ZSB0byBjb252ZXJ0LiAqLwotCQlidWZmZXIgPSBhbGxvY2EoIChsZW4rMSkgKiAoc2l6ZW9mICpidWZmZXIpKTsKLQkJZm9yKCBpPTA7IGk8PWxlbjsgKytpKQotCQkJYnVmZmVyW2ldID0gbXNnW2ldOwotCQlPdXRwdXREZWJ1Z1N0cmluZ1coTCJGYXRhbCBQeXRob24gZXJyb3I6ICIpOwotCQlPdXRwdXREZWJ1Z1N0cmluZ1coYnVmZmVyKTsKLQkJT3V0cHV0RGVidWdTdHJpbmdXKEwiXG4iKTsKLQl9CisgICAgICAgIC8qIENvbnZlcnQgdGhlIG1lc3NhZ2UgdG8gd2NoYXJfdC4gVGhpcyB1c2VzIGEgc2ltcGxlIG9uZS10by1vbmUKKyAgICAgICAgY29udmVyc2lvbiwgYXNzdW1pbmcgdGhhdCB0aGUgdGhpcyBlcnJvciBtZXNzYWdlIGFjdHVhbGx5IHVzZXMgQVNDSUkKKyAgICAgICAgb25seS4gSWYgdGhpcyBjZWFzZXMgdG8gYmUgdHJ1ZSwgd2Ugd2lsbCBoYXZlIHRvIGNvbnZlcnQuICovCisgICAgICAgIGJ1ZmZlciA9IGFsbG9jYSggKGxlbisxKSAqIChzaXplb2YgKmJ1ZmZlcikpOworICAgICAgICBmb3IoIGk9MDsgaTw9bGVuOyArK2kpCisgICAgICAgICAgICBidWZmZXJbaV0gPSBtc2dbaV07CisgICAgICAgIE91dHB1dERlYnVnU3RyaW5nVyhMIkZhdGFsIFB5dGhvbiBlcnJvcjogIik7CisgICAgICAgIE91dHB1dERlYnVnU3RyaW5nVyhidWZmZXIpOworICAgICAgICBPdXRwdXREZWJ1Z1N0cmluZ1coTCJcbiIpOworICAgIH0KICNpZmRlZiBfREVCVUcKLQlEZWJ1Z0JyZWFrKCk7CisgICAgRGVidWdCcmVhaygpOwogI2VuZGlmCiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwotCWFib3J0KCk7CisgICAgYWJvcnQoKTsKIH0KIAogLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KQEAgLTE2ODMsMjEgKzE2ODMsMjEgQEAKIHdhaXRfZm9yX3RocmVhZF9zaHV0ZG93bih2b2lkKQogewogI2lmZGVmIFdJVEhfVEhSRUFECi0JUHlPYmplY3QgKnJlc3VsdDsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5T2JqZWN0ICp0aHJlYWRpbmcgPSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyh0c3RhdGUtPmludGVycC0+bW9kdWxlcywKLQkJCQkJCSAgICAgICJ0aHJlYWRpbmciKTsKLQlpZiAodGhyZWFkaW5nID09IE5VTEwpIHsKLQkJLyogdGhyZWFkaW5nIG5vdCBpbXBvcnRlZCAqLwotCQlQeUVycl9DbGVhcigpOwotCQlyZXR1cm47Ci0JfQotCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QodGhyZWFkaW5nLCAiX3NodXRkb3duIiwgIiIpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHRocmVhZGluZyk7Ci0JZWxzZQotCQlQeV9ERUNSRUYocmVzdWx0KTsKLQlQeV9ERUNSRUYodGhyZWFkaW5nKTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKnRocmVhZGluZyA9IFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKHRzdGF0ZS0+aW50ZXJwLT5tb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkaW5nIik7CisgICAgaWYgKHRocmVhZGluZyA9PSBOVUxMKSB7CisgICAgICAgIC8qIHRocmVhZGluZyBub3QgaW1wb3J0ZWQgKi8KKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHRocmVhZGluZywgIl9zaHV0ZG93biIsICIiKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSh0aHJlYWRpbmcpOworICAgIGVsc2UKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKHRocmVhZGluZyk7CiAjZW5kaWYKIH0KIApAQCAtMTcwNyw2NiArMTcwNyw2NiBAQAogCiBpbnQgUHlfQXRFeGl0KHZvaWQgKCpmdW5jKSh2b2lkKSkKIHsKLQlpZiAobmV4aXRmdW5jcyA+PSBORVhJVEZVTkNTKQotCQlyZXR1cm4gLTE7Ci0JZXhpdGZ1bmNzW25leGl0ZnVuY3MrK10gPSBmdW5jOwotCXJldHVybiAwOworICAgIGlmIChuZXhpdGZ1bmNzID49IE5FWElURlVOQ1MpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBleGl0ZnVuY3NbbmV4aXRmdW5jcysrXSA9IGZ1bmM7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiBjYWxsX3N5c19leGl0ZnVuYyh2b2lkKQogewotCVB5T2JqZWN0ICpleGl0ZnVuYyA9IFB5U3lzX0dldE9iamVjdCgiZXhpdGZ1bmMiKTsKKyAgICBQeU9iamVjdCAqZXhpdGZ1bmMgPSBQeVN5c19HZXRPYmplY3QoImV4aXRmdW5jIik7CiAKLQlpZiAoZXhpdGZ1bmMpIHsKLQkJUHlPYmplY3QgKnJlczsKLQkJUHlfSU5DUkVGKGV4aXRmdW5jKTsKLQkJUHlTeXNfU2V0T2JqZWN0KCJleGl0ZnVuYyIsIChQeU9iamVjdCAqKU5VTEwpOwotCQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChleGl0ZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7Ci0JCWlmIChyZXMgPT0gTlVMTCkgewotCQkJaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N5c3RlbUV4aXQpKSB7Ci0JCQkJUHlTeXNfV3JpdGVTdGRlcnIoIkVycm9yIGluIHN5cy5leGl0ZnVuYzpcbiIpOwotCQkJfQotCQkJUHlFcnJfUHJpbnQoKTsKLQkJfQotCQlQeV9ERUNSRUYoZXhpdGZ1bmMpOwotCX0KKyAgICBpZiAoZXhpdGZ1bmMpIHsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgUHlfSU5DUkVGKGV4aXRmdW5jKTsKKyAgICAgICAgUHlTeXNfU2V0T2JqZWN0KCJleGl0ZnVuYyIsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChleGl0ZnVuYywgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N5c3RlbUV4aXQpKSB7CisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkVycm9yIGluIHN5cy5leGl0ZnVuYzpcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYoZXhpdGZ1bmMpOworICAgIH0KIAotCWlmIChQeV9GbHVzaExpbmUoKSkKLQkJUHlFcnJfQ2xlYXIoKTsKKyAgICBpZiAoUHlfRmx1c2hMaW5lKCkpCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBjYWxsX2xsX2V4aXRmdW5jcyh2b2lkKQogewotCXdoaWxlIChuZXhpdGZ1bmNzID4gMCkKLQkJKCpleGl0ZnVuY3NbLS1uZXhpdGZ1bmNzXSkoKTsKKyAgICB3aGlsZSAobmV4aXRmdW5jcyA+IDApCisgICAgICAgICgqZXhpdGZ1bmNzWy0tbmV4aXRmdW5jc10pKCk7CiAKLQlmZmx1c2goc3Rkb3V0KTsKLQlmZmx1c2goc3RkZXJyKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICBmZmx1c2goc3RkZXJyKTsKIH0KIAogdm9pZAogUHlfRXhpdChpbnQgc3RzKQogewotCVB5X0ZpbmFsaXplKCk7CisgICAgUHlfRmluYWxpemUoKTsKIAotCWV4aXQoc3RzKTsKKyAgICBleGl0KHN0cyk7CiB9CiAKIHN0YXRpYyB2b2lkCiBpbml0c2lncyh2b2lkKQogewogI2lmZGVmIFNJR1BJUEUKLQlQeU9TX3NldHNpZyhTSUdQSVBFLCBTSUdfSUdOKTsKKyAgICBQeU9TX3NldHNpZyhTSUdQSVBFLCBTSUdfSUdOKTsKICNlbmRpZgogI2lmZGVmIFNJR1hGWgotCVB5T1Nfc2V0c2lnKFNJR1hGWiwgU0lHX0lHTik7CisgICAgUHlPU19zZXRzaWcoU0lHWEZaLCBTSUdfSUdOKTsKICNlbmRpZgogI2lmZGVmIFNJR1hGU1oKLQlQeU9TX3NldHNpZyhTSUdYRlNaLCBTSUdfSUdOKTsKKyAgICBQeU9TX3NldHNpZyhTSUdYRlNaLCBTSUdfSUdOKTsKICNlbmRpZgotCVB5T1NfSW5pdEludGVycnVwdHMoKTsgLyogTWF5IGltcGx5IGluaXRzaWduYWwoKSAqLworICAgIFB5T1NfSW5pdEludGVycnVwdHMoKTsgLyogTWF5IGltcGx5IGluaXRzaWduYWwoKSAqLwogfQogCiAKQEAgLTE3NzksMTMgKzE3NzksMTMgQEAKIGludAogUHlfRmRJc0ludGVyYWN0aXZlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlpZiAoaXNhdHR5KChpbnQpZmlsZW5vKGZwKSkpCi0JCXJldHVybiAxOwotCWlmICghUHlfSW50ZXJhY3RpdmVGbGFnKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gKGZpbGVuYW1lID09IE5VTEwpIHx8Ci0JICAgICAgIChzdHJjbXAoZmlsZW5hbWUsICI8c3RkaW4+IikgPT0gMCkgfHwKLQkgICAgICAgKHN0cmNtcChmaWxlbmFtZSwgIj8/PyIpID09IDApOworICAgIGlmIChpc2F0dHkoKGludClmaWxlbm8oZnApKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKCFQeV9JbnRlcmFjdGl2ZUZsYWcpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAoZmlsZW5hbWUgPT0gTlVMTCkgfHwKKyAgICAgICAgICAgKHN0cmNtcChmaWxlbmFtZSwgIjxzdGRpbj4iKSA9PSAwKSB8fAorICAgICAgICAgICAoc3RyY21wKGZpbGVuYW1lLCAiPz8/IikgPT0gMCk7CiB9CiAKIApAQCAtMTgwMywyMSArMTgwMywyMSBAQAogaW50CiBQeU9TX0NoZWNrU3RhY2sodm9pZCkKIHsKLQlfX3RyeSB7Ci0JCS8qIGFsbG9jYSB0aHJvd3MgYSBzdGFjayBvdmVyZmxvdyBleGNlcHRpb24gaWYgdGhlcmUncwotCQkgICBub3QgZW5vdWdoIHNwYWNlIGxlZnQgb24gdGhlIHN0YWNrICovCi0JCWFsbG9jYShQWU9TX1NUQUNLX01BUkdJTiAqIHNpemVvZih2b2lkKikpOwotCQlyZXR1cm4gMDsKLQl9IF9fZXhjZXB0IChHZXRFeGNlcHRpb25Db2RlKCkgPT0gU1RBVFVTX1NUQUNLX09WRVJGTE9XID8KLQkJICAgICAgICBFWENFUFRJT05fRVhFQ1VURV9IQU5ETEVSIDogCi0JCSAgICAgICAgRVhDRVBUSU9OX0NPTlRJTlVFX1NFQVJDSCkgewotCQlpbnQgZXJyY29kZSA9IF9yZXNldHN0a29mbHcoKTsKLQkJaWYgKGVycmNvZGUgPT0gMCkKLQkJewotCQkJUHlfRmF0YWxFcnJvcigiQ291bGQgbm90IHJlc2V0IHRoZSBzdGFjayEiKTsKLQkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICBfX3RyeSB7CisgICAgICAgIC8qIGFsbG9jYSB0aHJvd3MgYSBzdGFjayBvdmVyZmxvdyBleGNlcHRpb24gaWYgdGhlcmUncworICAgICAgICAgICBub3QgZW5vdWdoIHNwYWNlIGxlZnQgb24gdGhlIHN0YWNrICovCisgICAgICAgIGFsbG9jYShQWU9TX1NUQUNLX01BUkdJTiAqIHNpemVvZih2b2lkKikpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IF9fZXhjZXB0IChHZXRFeGNlcHRpb25Db2RlKCkgPT0gU1RBVFVTX1NUQUNLX09WRVJGTE9XID8KKyAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUiA6CisgICAgICAgICAgICBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIKSB7CisgICAgICAgIGludCBlcnJjb2RlID0gX3Jlc2V0c3Rrb2ZsdygpOworICAgICAgICBpZiAoZXJyY29kZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJDb3VsZCBub3QgcmVzZXQgdGhlIHN0YWNrISIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiAjZW5kaWYgLyogV0lOMzIgJiYgX01TQ19WRVIgKi8KQEAgLTE4MzMsMzMgKzE4MzMsMzMgQEAKIFB5T1NfZ2V0c2lnKGludCBzaWcpCiB7CiAjaWZkZWYgSEFWRV9TSUdBQ1RJT04KLQlzdHJ1Y3Qgc2lnYWN0aW9uIGNvbnRleHQ7Ci0JaWYgKHNpZ2FjdGlvbihzaWcsIE5VTEwsICZjb250ZXh0KSA9PSAtMSkKLQkJcmV0dXJuIFNJR19FUlI7Ci0JcmV0dXJuIGNvbnRleHQuc2FfaGFuZGxlcjsKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGNvbnRleHQ7CisgICAgaWYgKHNpZ2FjdGlvbihzaWcsIE5VTEwsICZjb250ZXh0KSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIFNJR19FUlI7CisgICAgcmV0dXJuIGNvbnRleHQuc2FfaGFuZGxlcjsKICNlbHNlCi0JUHlPU19zaWdoYW5kbGVyX3QgaGFuZGxlcjsKKyAgICBQeU9TX3NpZ2hhbmRsZXJfdCBoYW5kbGVyOwogLyogU3BlY2lhbCBzaWduYWwgaGFuZGxpbmcgZm9yIHRoZSBzZWN1cmUgQ1JUIGluIFZpc3VhbCBTdHVkaW8gMjAwNSAqLwogI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE0MDAKLQlzd2l0Y2ggKHNpZykgewotCS8qIE9ubHkgdGhlc2Ugc2lnbmFscyBhcmUgdmFsaWQgKi8KLQljYXNlIFNJR0lOVDoKLQljYXNlIFNJR0lMTDoKLQljYXNlIFNJR0ZQRToKLQljYXNlIFNJR1NFR1Y6Ci0JY2FzZSBTSUdURVJNOgotCWNhc2UgU0lHQlJFQUs6Ci0JY2FzZSBTSUdBQlJUOgotCQlicmVhazsKLQkvKiBEb24ndCBjYWxsIHNpZ25hbCgpIHdpdGggb3RoZXIgdmFsdWVzIG9yIGl0IHdpbGwgYXNzZXJ0ICovCi0JZGVmYXVsdDoKLQkJcmV0dXJuIFNJR19FUlI7Ci0JfQorICAgIHN3aXRjaCAoc2lnKSB7CisgICAgLyogT25seSB0aGVzZSBzaWduYWxzIGFyZSB2YWxpZCAqLworICAgIGNhc2UgU0lHSU5UOgorICAgIGNhc2UgU0lHSUxMOgorICAgIGNhc2UgU0lHRlBFOgorICAgIGNhc2UgU0lHU0VHVjoKKyAgICBjYXNlIFNJR1RFUk06CisgICAgY2FzZSBTSUdCUkVBSzoKKyAgICBjYXNlIFNJR0FCUlQ6CisgICAgICAgIGJyZWFrOworICAgIC8qIERvbid0IGNhbGwgc2lnbmFsKCkgd2l0aCBvdGhlciB2YWx1ZXMgb3IgaXQgd2lsbCBhc3NlcnQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gU0lHX0VSUjsKKyAgICB9CiAjZW5kaWYgLyogX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTQwMCAqLwotCWhhbmRsZXIgPSBzaWduYWwoc2lnLCBTSUdfSUdOKTsKLQlpZiAoaGFuZGxlciAhPSBTSUdfRVJSKQotCQlzaWduYWwoc2lnLCBoYW5kbGVyKTsKLQlyZXR1cm4gaGFuZGxlcjsKKyAgICBoYW5kbGVyID0gc2lnbmFsKHNpZywgU0lHX0lHTik7CisgICAgaWYgKGhhbmRsZXIgIT0gU0lHX0VSUikKKyAgICAgICAgc2lnbmFsKHNpZywgaGFuZGxlcik7CisgICAgcmV0dXJuIGhhbmRsZXI7CiAjZW5kaWYKIH0KIApAQCAtMTg2NywyNCArMTg2NywyNCBAQAogUHlPU19zZXRzaWcoaW50IHNpZywgUHlPU19zaWdoYW5kbGVyX3QgaGFuZGxlcikKIHsKICNpZmRlZiBIQVZFX1NJR0FDVElPTgotCS8qIFNvbWUgY29kZSBpbiBNb2R1bGVzL3NpZ25hbG1vZHVsZS5jIGRlcGVuZHMgb24gc2lnYWN0aW9uKCkgYmVpbmcKLQkgKiB1c2VkIGhlcmUgaWYgSEFWRV9TSUdBQ1RJT04gaXMgZGVmaW5lZC4gIEZpeCB0aGF0IGlmIHRoaXMgY29kZQotCSAqIGNoYW5nZXMgdG8gaW52YWxpZGF0ZSB0aGF0IGFzc3VtcHRpb24uCi0JICovCi0Jc3RydWN0IHNpZ2FjdGlvbiBjb250ZXh0LCBvY29udGV4dDsKLQljb250ZXh0LnNhX2hhbmRsZXIgPSBoYW5kbGVyOwotCXNpZ2VtcHR5c2V0KCZjb250ZXh0LnNhX21hc2spOwotCWNvbnRleHQuc2FfZmxhZ3MgPSAwOwotCWlmIChzaWdhY3Rpb24oc2lnLCAmY29udGV4dCwgJm9jb250ZXh0KSA9PSAtMSkKLQkJcmV0dXJuIFNJR19FUlI7Ci0JcmV0dXJuIG9jb250ZXh0LnNhX2hhbmRsZXI7CisgICAgLyogU29tZSBjb2RlIGluIE1vZHVsZXMvc2lnbmFsbW9kdWxlLmMgZGVwZW5kcyBvbiBzaWdhY3Rpb24oKSBiZWluZworICAgICAqIHVzZWQgaGVyZSBpZiBIQVZFX1NJR0FDVElPTiBpcyBkZWZpbmVkLiAgRml4IHRoYXQgaWYgdGhpcyBjb2RlCisgICAgICogY2hhbmdlcyB0byBpbnZhbGlkYXRlIHRoYXQgYXNzdW1wdGlvbi4KKyAgICAgKi8KKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGNvbnRleHQsIG9jb250ZXh0OworICAgIGNvbnRleHQuc2FfaGFuZGxlciA9IGhhbmRsZXI7CisgICAgc2lnZW1wdHlzZXQoJmNvbnRleHQuc2FfbWFzayk7CisgICAgY29udGV4dC5zYV9mbGFncyA9IDA7CisgICAgaWYgKHNpZ2FjdGlvbihzaWcsICZjb250ZXh0LCAmb2NvbnRleHQpID09IC0xKQorICAgICAgICByZXR1cm4gU0lHX0VSUjsKKyAgICByZXR1cm4gb2NvbnRleHQuc2FfaGFuZGxlcjsKICNlbHNlCi0JUHlPU19zaWdoYW5kbGVyX3Qgb2xkaGFuZGxlcjsKLQlvbGRoYW5kbGVyID0gc2lnbmFsKHNpZywgaGFuZGxlcik7CisgICAgUHlPU19zaWdoYW5kbGVyX3Qgb2xkaGFuZGxlcjsKKyAgICBvbGRoYW5kbGVyID0gc2lnbmFsKHNpZywgaGFuZGxlcik7CiAjaWZkZWYgSEFWRV9TSUdJTlRFUlJVUFQKLQlzaWdpbnRlcnJ1cHQoc2lnLCAxKTsKKyAgICBzaWdpbnRlcnJ1cHQoc2lnLCAxKTsKICNlbmRpZgotCXJldHVybiBvbGRoYW5kbGVyOworICAgIHJldHVybiBvbGRoYW5kbGVyOwogI2VuZGlmCiB9CiAKQEAgLTE4OTQsNzEgKzE4OTQsNzEgQEAKIFB5QVBJX0ZVTkMobm9kZSAqKQogUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IHN0YXJ0KQogewotCXJldHVybiBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncyhmcCwgZmlsZW5hbWUsIHN0YXJ0LCAwKTsKKyAgICByZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoZnAsIGZpbGVuYW1lLCBzdGFydCwgMCk7CiB9CiAKICN1bmRlZiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZwogUHlBUElfRlVOQyhub2RlICopCiBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzdGFydCkKIHsKLQlyZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhzdHIsIHN0YXJ0LCAwKTsKKyAgICByZXR1cm4gUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhzdHIsIHN0YXJ0LCAwKTsKIH0KIAogI3VuZGVmIFB5UnVuX0FueUZpbGUKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fQW55RmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIE5VTEwpOworICAgIHJldHVybiBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9BbnlGaWxlRXgKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fQW55RmlsZUV4KEZJTEUgKmZwLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgY2xvc2VpdCkKIHsKLQlyZXR1cm4gUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIGNsb3NlaXQsIE5VTEwpOworICAgIHJldHVybiBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgY2xvc2VpdCwgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9BbnlGaWxlRmxhZ3MKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fQW55RmlsZUZsYWdzKEZJTEUgKmZwLCBjb25zdCBjaGFyICpuYW1lLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewotCXJldHVybiBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgZmxhZ3MpOworICAgIHJldHVybiBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgZmxhZ3MpOwogfQogCiAjdW5kZWYgUHlSdW5fRmlsZQogUHlBUElfRlVOQyhQeU9iamVjdCAqKQogUHlSdW5fRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqcCwgaW50IHMsIFB5T2JqZWN0ICpnLCBQeU9iamVjdCAqbCkKIHsKLQlyZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIE5VTEwpOworICAgIHJldHVybiBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgMCwgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9GaWxlRXgKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikKIFB5UnVuX0ZpbGVFeChGSUxFICpmcCwgY29uc3QgY2hhciAqcCwgaW50IHMsIFB5T2JqZWN0ICpnLCBQeU9iamVjdCAqbCwgaW50IGMpCiB7Ci0JcmV0dXJuIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCBjLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIGMsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlSdW5fRmlsZUZsYWdzCiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopCiBQeVJ1bl9GaWxlRmxhZ3MoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnAsIGludCBzLCBQeU9iamVjdCAqZywgUHlPYmplY3QgKmwsCi0JCVB5Q29tcGlsZXJGbGFncyAqZmxhZ3MpCisgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKLQlyZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIGZsYWdzKTsKKyAgICByZXR1cm4gUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIGZsYWdzKTsKIH0KIAogI3VuZGVmIFB5UnVuX1NpbXBsZUZpbGUKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fU2ltcGxlRmlsZShGSUxFICpmLCBjb25zdCBjaGFyICpwKQogewotCXJldHVybiBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmLCBwLCAwLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgMCwgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9TaW1wbGVGaWxlRXgKIFB5QVBJX0ZVTkMoaW50KQogUHlSdW5fU2ltcGxlRmlsZUV4KEZJTEUgKmYsIGNvbnN0IGNoYXIgKnAsIGludCBjKQogewotCXJldHVybiBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmLCBwLCBjLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgYywgTlVMTCk7CiB9CiAKIApAQCAtMTk2NiwzNSArMTk2NiwzNSBAQAogUHlBUElfRlVOQyhQeU9iamVjdCAqKQogUHlSdW5fU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHMsIFB5T2JqZWN0ICpnLCBQeU9iamVjdCAqbCkKIHsKLQlyZXR1cm4gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBzLCBnLCBsLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBzLCBnLCBsLCBOVUxMKTsKIH0KIAogI3VuZGVmIFB5UnVuX1NpbXBsZVN0cmluZwogUHlBUElfRlVOQyhpbnQpCiBQeVJ1bl9TaW1wbGVTdHJpbmcoY29uc3QgY2hhciAqcykKIHsKLQlyZXR1cm4gUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MocywgTlVMTCk7CisgICAgcmV0dXJuIFB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzKHMsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlfQ29tcGlsZVN0cmluZwogUHlBUElfRlVOQyhQeU9iamVjdCAqKQogUHlfQ29tcGlsZVN0cmluZyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnAsIGludCBzKQogewotCXJldHVybiBQeV9Db21waWxlU3RyaW5nRmxhZ3Moc3RyLCBwLCBzLCBOVUxMKTsKKyAgICByZXR1cm4gUHlfQ29tcGlsZVN0cmluZ0ZsYWdzKHN0ciwgcCwgcywgTlVMTCk7CiB9CiAKICN1bmRlZiBQeVJ1bl9JbnRlcmFjdGl2ZU9uZQogUHlBUElfRlVOQyhpbnQpCiBQeVJ1bl9JbnRlcmFjdGl2ZU9uZShGSUxFICpmLCBjb25zdCBjaGFyICpwKQogewotCXJldHVybiBQeVJ1bl9JbnRlcmFjdGl2ZU9uZUZsYWdzKGYsIHAsIE5VTEwpOworICAgIHJldHVybiBQeVJ1bl9JbnRlcmFjdGl2ZU9uZUZsYWdzKGYsIHAsIE5VTEwpOwogfQogCiAjdW5kZWYgUHlSdW5fSW50ZXJhY3RpdmVMb29wCiBQeUFQSV9GVU5DKGludCkKIFB5UnVuX0ludGVyYWN0aXZlTG9vcChGSUxFICpmLCBjb25zdCBjaGFyICpwKQogewotCXJldHVybiBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncyhmLCBwLCBOVUxMKTsKKyAgICByZXR1cm4gUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoZiwgcCwgTlVMTCk7CiB9CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N0cnRvZC5jIGIvUHl0aG9uL3N0cnRvZC5jCmluZGV4IGEyNDg0NjAuLjY3OThlZmEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zdHJ0b2QuYworKysgYi9QeXRob24vc3RydG9kLmMKQEAgLTE0LDcgKzE0LDcgQEAKICAgICBEZWZpbmVzOiBkb3VibGUgc3RydG9kIChjaGFyICpzdHIsIGNoYXIqKnB0cikKICovCiAKLS8qICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdHJ0b2QoKSBmdW5jdGlvbiBkZXNjcmliZWQgaW4gdGhlIAorLyogIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0cnRvZCgpIGZ1bmN0aW9uIGRlc2NyaWJlZCBpbiB0aGUKICAgICBTeXN0ZW0gViBtYW51YWxzLCB3aXRoIGEgZGlmZmVyZW50IG5hbWUgdG8gYXZvaWQgbGlua2VyIHByb2JsZW1zLgogICAgIEFsbCB0aGF0IHN0cjJkYmwoKSBkb2VzIGl0c2VsZiBpcyBjaGVjayB0aGF0IHRoZSBhcmd1bWVudCBpcyB3ZWxsLWZvcm1lZAogICAgIGFuZCBpcyBpbiByYW5nZS4gIEl0IGxlYXZlcyB0aGUgd29yayBvZiBjb252ZXJzaW9uIHRvIGF0b2YoKSwgd2hpY2ggaXMKQEAgLTIyLDE4ICsyMiwxOCBAQAogCiAgICAgVGhlcmUgYXJlIHR3byByZWFzb25zIHdoeSB0aGlzIHNob3VsZCBiZSBwcm92aWRlZCB0byB0aGUgbmV0OgogICAgIChhKSBzb21lIFVOSVggc3lzdGVtcyBkbyBub3QgeWV0IGhhdmUgc3RydG9kKCksIG9yIGRvIG5vdCBoYXZlIGl0Ci0gICAgICAgIGF2YWlsYWJsZSBpbiB0aGUgQlNEICJ1bml2ZXJzZSIgKGJ1dCB0aGV5IGRvIGhhdmUgYXRvZigpKS4KKyAgICBhdmFpbGFibGUgaW4gdGhlIEJTRCAidW5pdmVyc2UiIChidXQgdGhleSBkbyBoYXZlIGF0b2YoKSkuCiAgICAgKGIpIHNvbWUgb2YgdGhlIFVOSVggc3lzdGVtcyB0aGF0ICpkbyogaGF2ZSBpdCBnZXQgaXQgd3JvbmcuCi0JKHNvbWUgY3Jhc2ggd2l0aCBsYXJnZSBhcmd1bWVudHMsIHNvbWUgYXNzaWduIHRoZSB3cm9uZyAqcHRyIHZhbHVlKS4KKyAgICAoc29tZSBjcmFzaCB3aXRoIGxhcmdlIGFyZ3VtZW50cywgc29tZSBhc3NpZ24gdGhlIHdyb25nICpwdHIgdmFsdWUpLgogICAgIFRoZXJlIGlzIGEgcmVhc29uIHdoeSAqd2UqIGFyZSBwcm92aWRpbmcgaXQ6IHdlIG5lZWQgYSBjb3JyZWN0IHZlcnNpb24KICAgICBvZiBzdHJ0b2QoKSwgYW5kIGlmIHdlIGdpdmUgdGhpcyBvbmUgYXdheSBtYXliZSBzb21lb25lIHdpbGwgbG9vayBmb3IKICAgICBtaXN0YWtlcyBpbiBpdCBhbmQgZml4IHRoZW0gZm9yIHVzICg6LSkuCiAqLwotICAgIAorCiAvKiAgVGhlIGZvbGxvd2luZyBjb25zdGFudHMgYXJlIG1hY2hpbmUtc3BlY2lmaWMuICBNRHtNSU4sTUFYfUVYUFQgYXJlCiAgICAgaW50ZWdlcnMgYW5kIE1Ee01JTixNQVh9RlJBQyBhcmUgc3RyaW5ncyBzdWNoIHRoYXQKLQkwLiR7TURNQVhGUkFDfWUke01ETUFYRVhQVH0gaXMgdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBkb3VibGUsCi0JMC4ke01ETUlORlJBQ31lJHtNRE1JTkVYUFR9IGlzIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlICt2ZSBkb3VibGUKKyAgICAwLiR7TURNQVhGUkFDfWUke01ETUFYRVhQVH0gaXMgdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBkb3VibGUsCisgICAgMC4ke01ETUlORlJBQ31lJHtNRE1JTkVYUFR9IGlzIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlICt2ZSBkb3VibGUKICAgICBNRHtNSU4sTUFYfUZSQUMgbXVzdCBub3QgaGF2ZSBhbnkgdHJhaWxpbmcgemVyb3MuCiAgICAgVGhlIHZhbHVlcyBoZXJlIGFyZSBmb3IgSUVFRS03NTQgNjQtYml0IGZsb2F0cy4KICAgICBJdCBpcyBub3QgcGVyZmVjdGx5IGNsZWFyIHRvIG1lIHdoZXRoZXIgYW4gSUVFRSBpbmZpbml0eSBzaG91bGQgYmUKQEAgLTQ0LDExMyArNDQsMTEzIEBACiAgICAgSSBkbyBrbm93IGFib3V0IDx2YWx1ZXMuaD4sIGJ1dCB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBmaWxlIGlzIHRoYXQKICAgICB3ZSBjYW4ndCBhbHdheXMgdHJ1c3QgdGhhdCBzdHVmZiB0byBiZSB0aGVyZSBvciB0byBiZSBjb3JyZWN0LgogKi8KLXN0YXRpYwlpbnQJTURNSU5FWFBUCT0gLTMyMzsKLXN0YXRpYwljaGFyCU1ETUlORlJBQ1tdCT0gIjQ5NDA2NTY0NTg0MTI0NjU0NCI7Ci1zdGF0aWMJZG91YmxlCVpFUk8JCT0gMC4wOworc3RhdGljICBpbnQgICAgIE1ETUlORVhQVCAgICAgICA9IC0zMjM7CitzdGF0aWMgIGNoYXIgICAgTURNSU5GUkFDW10gICAgID0gIjQ5NDA2NTY0NTg0MTI0NjU0NCI7CitzdGF0aWMgIGRvdWJsZSAgWkVSTyAgICAgICAgICAgID0gMC4wOwogCi1zdGF0aWMJaW50CU1ETUFYRVhQVAk9IDMwOTsKLXN0YXRpYwljaGFyCU1ETUFYRlJBQ1tdCT0gIjE3OTc2OTMxMzQ4NjIzMTU3IjsKLXN0YXRpYwlkb3VibGUJSFVHRQkJPSAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4Oworc3RhdGljICBpbnQgICAgIE1ETUFYRVhQVCAgICAgICA9IDMwOTsKK3N0YXRpYyAgY2hhciAgICBNRE1BWEZSQUNbXSAgICAgPSAiMTc5NzY5MzEzNDg2MjMxNTciOworc3RhdGljICBkb3VibGUgIEhVR0UgICAgICAgICAgICA9IDEuNzk3NjkzMTM0ODYyMzE1N2UzMDg7CiAKLWV4dGVybglkb3VibGUJYXRvZihjb25zdCBjaGFyICopOwkJLyogT25seSBjYWxsZWQgd2hlbiByZXN1bHQga25vd24gdG8gYmUgb2sgKi8KK2V4dGVybiAgZG91YmxlICBhdG9mKGNvbnN0IGNoYXIgKik7ICAgICAgICAgICAgIC8qIE9ubHkgY2FsbGVkIHdoZW4gcmVzdWx0IGtub3duIHRvIGJlIG9rICovCiAKICNpZmRlZiBIQVZFX0VSUk5PX0gKICNpbmNsdWRlIDxlcnJuby5oPgogI2VuZGlmCi1leHRlcm4JaW50CWVycm5vOworZXh0ZXJuICBpbnQgICAgIGVycm5vOwogCiBkb3VibGUgc3RydG9kKGNoYXIgKnN0ciwgY2hhciAqKnB0cikKIHsKLQlpbnQgc2lnbiwgc2NhbGUsIGRvdHNlZW47Ci0JaW50IGVzaWduLCBleHB0OwotCWNoYXIgKnNhdmU7Ci0JcmVnaXN0ZXIgY2hhciAqc3AsICpkcDsKLQlyZWdpc3RlciBpbnQgYzsKLQljaGFyICpidWZvcmcsICpidWZsaW07Ci0JY2hhciBidWZmZXJbNjRdOwkJLyogNDUtZGlnaXQgc2lnbmlmaWNhbnQgKyAqLwotCQkJCQkvKiAxMy1kaWdpdCBleHBvbmVudCAqLwotCXNwID0gc3RyOwotCXdoaWxlICgqc3AgPT0gJyAnKSBzcCsrOwotCXNpZ24gPSAxOwotCWlmICgqc3AgPT0gJy0nKSBzaWduIC09IDIsIHNwKys7Ci0JZG90c2VlbiA9IDAsIHNjYWxlID0gMDsKLQlkcCA9IGJ1ZmZlcjsJCi0JKmRwKysgPSAnMCc7ICpkcCsrID0gJy4nOwotCWJ1Zm9yZyA9IGRwLCBidWZsaW0gPSBidWZmZXIrNDg7Ci0JZm9yIChzYXZlID0gc3A7IGMgPSAqc3A7IHNwKyspCi0JICAgIGlmIChjID09ICcuJykgewotCQlpZiAoZG90c2VlbikgYnJlYWs7Ci0JCWRvdHNlZW4rKzsKLQkgICAgfSBlbHNlCi0JICAgIGlmICgodW5zaWduZWQpKGMtJzAnKSA+ICh1bnNpZ25lZCkoJzknLScwJykpIHsKLQkJYnJlYWs7Ci0JICAgIH0gZWxzZQotCSAgICBpZiAoYyA9PSAnMCcpIHsKLQkJaWYgKGRwICE9IGJ1Zm9yZykgewotCQkgICAgLyogVGhpcyBpcyBub3QgdGhlIGZpcnN0IGRpZ2l0LCBzbyB3ZSB3YW50IHRvIGtlZXAgaXQgKi8KLQkJICAgIGlmIChkcCA8IGJ1ZmxpbSkgKmRwKysgPSBjOwotCQkgICAgaWYgKCFkb3RzZWVuKSBzY2FsZSsrOwotCQl9IGVsc2UgewotCQkgICAgLyogTm8gbm9uLXplcm8gZGlnaXRzIHNlZW4geWV0ICovCi0JCSAgICAvKiBJZiBhIC4gaGFzIGJlZW4gc2Vlbiwgc2NhbGUgbXVzdCBiZSBhZGp1c3RlZCAqLwotCQkgICAgaWYgKGRvdHNlZW4pIHNjYWxlLS07Ci0JCX0KLQkgICAgfSBlbHNlIHsKLQkJLyogVGhpcyBpcyBhIG5vbnplcm8gZGlnaXQsIHNvIHdlIHdhbnQgdG8ga2VlcCBpdCAqLwotCQlpZiAoZHAgPCBidWZsaW0pICpkcCsrID0gYzsKLQkJLyogSWYgaXQgcHJlY2VkZXMgYSAuLCBzY2FsZSBtdXN0IGJlIGFkanVzdGVkICovCi0JCWlmICghZG90c2Vlbikgc2NhbGUrKzsKLQkgICAgfQotCWlmIChzcCA9PSBzYXZlKSB7Ci0JICAgIGlmIChwdHIpICpwdHIgPSBzdHI7Ci0JICAgIGVycm5vID0gRURPTTsJCS8qIHdoYXQgc2hvdWxkIHRoaXMgYmU/ICovCi0JICAgIHJldHVybiBaRVJPOwotCX0KLQkKLQl3aGlsZSAoZHAgPiBidWZvcmcgJiYgZHBbLTFdID09ICcwJykgLS1kcDsKLQlpZiAoZHAgPT0gYnVmb3JnKSAqZHArKyA9ICcwJzsKLQkqZHAgPSAnXDAnOwotCS8qICBOb3cgdGhlIGNvbnRlbnRzIG9mIGJ1ZmZlciBhcmUKLQkgICAgKy0tKy0tLS0tLS0tKy0rLS0tLS0tLS0rCi0JICAgIHwwLnxmcmFjdGlvbnxcfGxlZnRvdmVyfAotCSAgICArLS0rLS0tLS0tLS0rLSstLS0tLS0tLSsKLQkJCSBeZHAgcG9pbnRzIGhlcmUKLQkgICAgd2hlcmUgZnJhY3Rpb24gYmVnaW5zIHdpdGggMCBpZmYgaXQgaXMgIjAiLCBhbmQgaGFzIGF0IG1vc3QKLQkgICAgNDUgZGlnaXRzIGluIGl0LCBhbmQgbGVmdG92ZXIgaXMgYXQgbGVhc3QgMTYgY2hhcmFjdGVycy4KLQkqLwotCXNhdmUgPSBzcCwgZXhwdCA9IDAsIGVzaWduID0gMTsKLQlkbyB7Ci0JICAgIGMgPSAqc3ArKzsKLQkgICAgaWYgKGMgIT0gJ2UnICYmIGMgIT0gJ0UnKSBicmVhazsKLQkgICAgYyA9ICpzcCsrOwotCSAgICBpZiAoYyA9PSAnLScpIGVzaWduIC09IDIsIGMgPSAqc3ArKzsgZWxzZQotCSAgICBpZiAoYyA9PSAnKycgLyogfHwgYyA9PSAnICcgKi8gKSBjID0gKnNwKys7Ci0JICAgIGlmICgodW5zaWduZWQpKGMtJzAnKSA+ICh1bnNpZ25lZCkoJzknLScwJykpIGJyZWFrOwotCSAgICB3aGlsZSAoYyA9PSAnMCcpIGMgPSAqc3ArKzsKLQkgICAgZm9yICg7ICh1bnNpZ25lZCkoYy0nMCcpIDw9ICh1bnNpZ25lZCkoJzknLScwJyk7IGMgPSAqc3ArKykKLQkJZXhwdCA9IGV4cHQqMTAgKyBjLScwJzsJICAgIAotCSAgICBpZiAoZXNpZ24gPCAwKSBleHB0ID0gLWV4cHQ7Ci0JICAgIHNhdmUgPSBzcC0xOwotCX0gd2hpbGUgKDApOwotCWlmIChwdHIpICpwdHIgPSBzYXZlOwotCWV4cHQgKz0gc2NhbGU7Ci0JLyogIE5vdyB0aGUgbnVtYmVyIGlzIHNpZ24qMC5mcmFjdGlvbioxMCoqZXhwdCAgKi8KLQllcnJubyA9IEVSQU5HRTsKLQlpZiAoZXhwdCA+IE1ETUFYRVhQVCkgewotCSAgICByZXR1cm4gSFVHRSpzaWduOwotCX0gZWxzZQotCWlmIChleHB0ID09IE1ETUFYRVhQVCkgewotCSAgICBpZiAoc3RyY21wKGJ1Zm9yZywgTURNQVhGUkFDKSA+IDApIHJldHVybiBIVUdFKnNpZ247Ci0JfSBlbHNlCi0JaWYgKGV4cHQgPCBNRE1JTkVYUFQpIHsKLQkgICAgcmV0dXJuIFpFUk8qc2lnbjsKLQl9IGVsc2UKLQlpZiAoZXhwdCA9PSBNRE1JTkVYUFQpIHsKLQkgICAgaWYgKHN0cmNtcChidWZvcmcsIE1ETUlORlJBQykgPCAwKSByZXR1cm4gWkVSTypzaWduOwotCX0KLQkvKiAgV2UgaGF2ZSBub3cgZXN0YWJsaXNoZWQgdGhhdCB0aGUgbnVtYmVyIGNhbiBiZSAgKi8KLQkvKiAgcmVwcmVzZW50ZWQgd2l0aG91dCBvdmVyZmxvdyBvciB1bmRlcmZsb3cgICovCi0JKHZvaWQpIHNwcmludGYoZHAsICJFJWQiLCBleHB0KTsKLQllcnJubyA9IDA7Ci0JcmV0dXJuIGF0b2YoYnVmZmVyKSpzaWduOworICAgIGludCBzaWduLCBzY2FsZSwgZG90c2VlbjsKKyAgICBpbnQgZXNpZ24sIGV4cHQ7CisgICAgY2hhciAqc2F2ZTsKKyAgICByZWdpc3RlciBjaGFyICpzcCwgKmRwOworICAgIHJlZ2lzdGVyIGludCBjOworICAgIGNoYXIgKmJ1Zm9yZywgKmJ1ZmxpbTsKKyAgICBjaGFyIGJ1ZmZlcls2NF07ICAgICAgICAgICAgICAgICAgICAvKiA0NS1kaWdpdCBzaWduaWZpY2FudCArICovCisgICAgICAgICAgICAgICAgICAgIC8qIDEzLWRpZ2l0IGV4cG9uZW50ICovCisgICAgc3AgPSBzdHI7CisgICAgd2hpbGUgKCpzcCA9PSAnICcpIHNwKys7CisgICAgc2lnbiA9IDE7CisgICAgaWYgKCpzcCA9PSAnLScpIHNpZ24gLT0gMiwgc3ArKzsKKyAgICBkb3RzZWVuID0gMCwgc2NhbGUgPSAwOworICAgIGRwID0gYnVmZmVyOworICAgICpkcCsrID0gJzAnOyAqZHArKyA9ICcuJzsKKyAgICBidWZvcmcgPSBkcCwgYnVmbGltID0gYnVmZmVyKzQ4OworICAgIGZvciAoc2F2ZSA9IHNwOyBjID0gKnNwOyBzcCsrKQorICAgICAgICBpZiAoYyA9PSAnLicpIHsKKyAgICAgICAgaWYgKGRvdHNlZW4pIGJyZWFrOworICAgICAgICBkb3RzZWVuKys7CisgICAgICAgIH0gZWxzZQorICAgICAgICBpZiAoKHVuc2lnbmVkKShjLScwJykgPiAodW5zaWduZWQpKCc5Jy0nMCcpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UKKyAgICAgICAgaWYgKGMgPT0gJzAnKSB7CisgICAgICAgIGlmIChkcCAhPSBidWZvcmcpIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgbm90IHRoZSBmaXJzdCBkaWdpdCwgc28gd2Ugd2FudCB0byBrZWVwIGl0ICovCisgICAgICAgICAgICBpZiAoZHAgPCBidWZsaW0pICpkcCsrID0gYzsKKyAgICAgICAgICAgIGlmICghZG90c2Vlbikgc2NhbGUrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE5vIG5vbi16ZXJvIGRpZ2l0cyBzZWVuIHlldCAqLworICAgICAgICAgICAgLyogSWYgYSAuIGhhcyBiZWVuIHNlZW4sIHNjYWxlIG11c3QgYmUgYWRqdXN0ZWQgKi8KKyAgICAgICAgICAgIGlmIChkb3RzZWVuKSBzY2FsZS0tOworICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoaXMgaXMgYSBub256ZXJvIGRpZ2l0LCBzbyB3ZSB3YW50IHRvIGtlZXAgaXQgKi8KKyAgICAgICAgaWYgKGRwIDwgYnVmbGltKSAqZHArKyA9IGM7CisgICAgICAgIC8qIElmIGl0IHByZWNlZGVzIGEgLiwgc2NhbGUgbXVzdCBiZSBhZGp1c3RlZCAqLworICAgICAgICBpZiAoIWRvdHNlZW4pIHNjYWxlKys7CisgICAgICAgIH0KKyAgICBpZiAoc3AgPT0gc2F2ZSkgeworICAgICAgICBpZiAocHRyKSAqcHRyID0gc3RyOworICAgICAgICBlcnJubyA9IEVET007ICAgICAgICAgICAgICAgICAgIC8qIHdoYXQgc2hvdWxkIHRoaXMgYmU/ICovCisgICAgICAgIHJldHVybiBaRVJPOworICAgIH0KKworICAgIHdoaWxlIChkcCA+IGJ1Zm9yZyAmJiBkcFstMV0gPT0gJzAnKSAtLWRwOworICAgIGlmIChkcCA9PSBidWZvcmcpICpkcCsrID0gJzAnOworICAgICpkcCA9ICdcMCc7CisgICAgLyogIE5vdyB0aGUgY29udGVudHMgb2YgYnVmZmVyIGFyZQorICAgICAgICArLS0rLS0tLS0tLS0rLSstLS0tLS0tLSsKKyAgICAgICAgfDAufGZyYWN0aW9ufFx8bGVmdG92ZXJ8CisgICAgICAgICstLSstLS0tLS0tLSstKy0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgXmRwIHBvaW50cyBoZXJlCisgICAgICAgIHdoZXJlIGZyYWN0aW9uIGJlZ2lucyB3aXRoIDAgaWZmIGl0IGlzICIwIiwgYW5kIGhhcyBhdCBtb3N0CisgICAgICAgIDQ1IGRpZ2l0cyBpbiBpdCwgYW5kIGxlZnRvdmVyIGlzIGF0IGxlYXN0IDE2IGNoYXJhY3RlcnMuCisgICAgKi8KKyAgICBzYXZlID0gc3AsIGV4cHQgPSAwLCBlc2lnbiA9IDE7CisgICAgZG8geworICAgICAgICBjID0gKnNwKys7CisgICAgICAgIGlmIChjICE9ICdlJyAmJiBjICE9ICdFJykgYnJlYWs7CisgICAgICAgIGMgPSAqc3ArKzsKKyAgICAgICAgaWYgKGMgPT0gJy0nKSBlc2lnbiAtPSAyLCBjID0gKnNwKys7IGVsc2UKKyAgICAgICAgaWYgKGMgPT0gJysnIC8qIHx8IGMgPT0gJyAnICovICkgYyA9ICpzcCsrOworICAgICAgICBpZiAoKHVuc2lnbmVkKShjLScwJykgPiAodW5zaWduZWQpKCc5Jy0nMCcpKSBicmVhazsKKyAgICAgICAgd2hpbGUgKGMgPT0gJzAnKSBjID0gKnNwKys7CisgICAgICAgIGZvciAoOyAodW5zaWduZWQpKGMtJzAnKSA8PSAodW5zaWduZWQpKCc5Jy0nMCcpOyBjID0gKnNwKyspCisgICAgICAgIGV4cHQgPSBleHB0KjEwICsgYy0nMCc7CisgICAgICAgIGlmIChlc2lnbiA8IDApIGV4cHQgPSAtZXhwdDsKKyAgICAgICAgc2F2ZSA9IHNwLTE7CisgICAgfSB3aGlsZSAoMCk7CisgICAgaWYgKHB0cikgKnB0ciA9IHNhdmU7CisgICAgZXhwdCArPSBzY2FsZTsKKyAgICAvKiAgTm93IHRoZSBudW1iZXIgaXMgc2lnbiowLmZyYWN0aW9uKjEwKipleHB0ICAqLworICAgIGVycm5vID0gRVJBTkdFOworICAgIGlmIChleHB0ID4gTURNQVhFWFBUKSB7CisgICAgICAgIHJldHVybiBIVUdFKnNpZ247CisgICAgfSBlbHNlCisgICAgaWYgKGV4cHQgPT0gTURNQVhFWFBUKSB7CisgICAgICAgIGlmIChzdHJjbXAoYnVmb3JnLCBNRE1BWEZSQUMpID4gMCkgcmV0dXJuIEhVR0Uqc2lnbjsKKyAgICB9IGVsc2UKKyAgICBpZiAoZXhwdCA8IE1ETUlORVhQVCkgeworICAgICAgICByZXR1cm4gWkVSTypzaWduOworICAgIH0gZWxzZQorICAgIGlmIChleHB0ID09IE1ETUlORVhQVCkgeworICAgICAgICBpZiAoc3RyY21wKGJ1Zm9yZywgTURNSU5GUkFDKSA8IDApIHJldHVybiBaRVJPKnNpZ247CisgICAgfQorICAgIC8qICBXZSBoYXZlIG5vdyBlc3RhYmxpc2hlZCB0aGF0IHRoZSBudW1iZXIgY2FuIGJlICAqLworICAgIC8qICByZXByZXNlbnRlZCB3aXRob3V0IG92ZXJmbG93IG9yIHVuZGVyZmxvdyAgKi8KKyAgICAodm9pZCkgc3ByaW50ZihkcCwgIkUlZCIsIGV4cHQpOworICAgIGVycm5vID0gMDsKKyAgICByZXR1cm4gYXRvZihidWZmZXIpKnNpZ247CiB9CmRpZmYgLS1naXQgYS9QeXRob24vc3RydWN0bWVtYmVyLmMgYi9QeXRob24vc3RydWN0bWVtYmVyLmMKaW5kZXggMmIwNDcyYi4uNGNlZjQyZiAxMDA2NDQKLS0tIGEvUHl0aG9uL3N0cnVjdG1lbWJlci5jCisrKyBiL1B5dGhvbi9zdHJ1Y3RtZW1iZXIuYwpAQCAtOCwzNTUgKzgsMzU1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbGlzdG1lbWJlcnMoc3RydWN0IG1lbWJlcmxpc3QgKm1saXN0KQogewotCWludCBpLCBuOwotCVB5T2JqZWN0ICp2OwotCWZvciAobiA9IDA7IG1saXN0W25dLm5hbWUgIT0gTlVMTDsgbisrKQotCQk7Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgIT0gTlVMTCkgewotCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQkJUHlMaXN0X1NldEl0ZW0odiwgaSwKLQkJCQkgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhtbGlzdFtpXS5uYW1lKSk7Ci0JCWlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQlQeV9ERUNSRUYodik7Ci0JCQl2ID0gTlVMTDsKLQkJfQotCQllbHNlIHsKLQkJCVB5TGlzdF9Tb3J0KHYpOwotCQl9Ci0JfQotCXJldHVybiB2OworICAgIGludCBpLCBuOworICAgIFB5T2JqZWN0ICp2OworICAgIGZvciAobiA9IDA7IG1saXN0W25dLm5hbWUgIT0gTlVMTDsgbisrKQorICAgICAgICA7CisgICAgdiA9IFB5TGlzdF9OZXcobik7CisgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0odiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcobWxpc3RbaV0ubmFtZSkpOworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUxpc3RfU29ydCh2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogUHlPYmplY3QgKgogUHlNZW1iZXJfR2V0KGNvbnN0IGNoYXIgKmFkZHIsIHN0cnVjdCBtZW1iZXJsaXN0ICptbGlzdCwgY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgbWVtYmVybGlzdCAqbDsKKyAgICBzdHJ1Y3QgbWVtYmVybGlzdCAqbDsKIAotCWlmIChzdHJjbXAobmFtZSwgIl9fbWVtYmVyc19fIikgPT0gMCkKLQkJcmV0dXJuIGxpc3RtZW1iZXJzKG1saXN0KTsKLQlmb3IgKGwgPSBtbGlzdDsgbC0+bmFtZSAhPSBOVUxMOyBsKyspIHsKLQkJaWYgKHN0cmNtcChsLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlQeU1lbWJlckRlZiBjb3B5OwotCQkJY29weS5uYW1lID0gbC0+bmFtZTsKLQkJCWNvcHkudHlwZSA9IGwtPnR5cGU7Ci0JCQljb3B5Lm9mZnNldCA9IGwtPm9mZnNldDsKLQkJCWNvcHkuZmxhZ3MgPSBsLT5mbGFnczsKLQkJCWNvcHkuZG9jID0gTlVMTDsKLQkJCXJldHVybiBQeU1lbWJlcl9HZXRPbmUoYWRkciwgJmNvcHkpOwotCQl9Ci0JfQotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKHN0cmNtcChuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwKQorICAgICAgICByZXR1cm4gbGlzdG1lbWJlcnMobWxpc3QpOworICAgIGZvciAobCA9IG1saXN0OyBsLT5uYW1lICE9IE5VTEw7IGwrKykgeworICAgICAgICBpZiAoc3RyY21wKGwtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIFB5TWVtYmVyRGVmIGNvcHk7CisgICAgICAgICAgICBjb3B5Lm5hbWUgPSBsLT5uYW1lOworICAgICAgICAgICAgY29weS50eXBlID0gbC0+dHlwZTsKKyAgICAgICAgICAgIGNvcHkub2Zmc2V0ID0gbC0+b2Zmc2V0OworICAgICAgICAgICAgY29weS5mbGFncyA9IGwtPmZsYWdzOworICAgICAgICAgICAgY29weS5kb2MgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIFB5TWVtYmVyX0dldE9uZShhZGRyLCAmY29weSk7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBuYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlPYmplY3QgKgogUHlNZW1iZXJfR2V0T25lKGNvbnN0IGNoYXIgKmFkZHIsIFB5TWVtYmVyRGVmICpsKQogewotCVB5T2JqZWN0ICp2OwotCWlmICgobC0+ZmxhZ3MgJiBSRUFEX1JFU1RSSUNURUQpICYmCi0JICAgIFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInJlc3RyaWN0ZWQgYXR0cmlidXRlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhZGRyICs9IGwtPm9mZnNldDsKLQlzd2l0Y2ggKGwtPnR5cGUpIHsKLQljYXNlIFRfQk9PTDoKLQkJdiA9IFB5Qm9vbF9Gcm9tTG9uZygqKGNoYXIqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfQllURToKLQkJdiA9IFB5SW50X0Zyb21Mb25nKCooY2hhciopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9VQllURToKLQkJdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCoodW5zaWduZWQgY2hhciopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9TSE9SVDoKLQkJdiA9IFB5SW50X0Zyb21Mb25nKCooc2hvcnQqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfVVNIT1JUOgotCQl2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKih1bnNpZ25lZCBzaG9ydCopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9JTlQ6Ci0JCXYgPSBQeUludF9Gcm9tTG9uZygqKGludCopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9VSU5UOgotCQl2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKih1bnNpZ25lZCBpbnQqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfTE9ORzoKLQkJdiA9IFB5SW50X0Zyb21Mb25nKCoobG9uZyopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9VTE9ORzoKLQkJdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCoodW5zaWduZWQgbG9uZyopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9QWVNTSVpFVDoKLQkJdiA9IFB5SW50X0Zyb21Tc2l6ZV90KCooUHlfc3NpemVfdCopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9GTE9BVDoKLQkJdiA9IFB5RmxvYXRfRnJvbURvdWJsZSgoZG91YmxlKSooZmxvYXQqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfRE9VQkxFOgotCQl2ID0gUHlGbG9hdF9Gcm9tRG91YmxlKCooZG91YmxlKilhZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX1NUUklORzoKLQkJaWYgKCooY2hhcioqKWFkZHIgPT0gTlVMTCkgewotCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJdiA9IFB5X05vbmU7Ci0JCX0KLQkJZWxzZQotCQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoKihjaGFyKiopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9TVFJJTkdfSU5QTEFDRToKLQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoKGNoYXIqKWFkZHIpOwotCQlicmVhazsKLQljYXNlIFRfQ0hBUjoKLQkJdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKilhZGRyLCAxKTsKLQkJYnJlYWs7Ci0JY2FzZSBUX09CSkVDVDoKLQkJdiA9ICooUHlPYmplY3QgKiopYWRkcjsKLQkJaWYgKHYgPT0gTlVMTCkKLQkJCXYgPSBQeV9Ob25lOwotCQlQeV9JTkNSRUYodik7Ci0JCWJyZWFrOwotCWNhc2UgVF9PQkpFQ1RfRVg6Ci0JCXYgPSAqKFB5T2JqZWN0ICoqKWFkZHI7Ci0JCWlmICh2ID09IE5VTEwpCi0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIGwtPm5hbWUpOwotCQlQeV9YSU5DUkVGKHYpOwotCQlicmVhazsKKyAgICBQeU9iamVjdCAqdjsKKyAgICBpZiAoKGwtPmZsYWdzICYgUkVBRF9SRVNUUklDVEVEKSAmJgorICAgICAgICBQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJyZXN0cmljdGVkIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYWRkciArPSBsLT5vZmZzZXQ7CisgICAgc3dpdGNoIChsLT50eXBlKSB7CisgICAgY2FzZSBUX0JPT0w6CisgICAgICAgIHYgPSBQeUJvb2xfRnJvbUxvbmcoKihjaGFyKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0JZVEU6CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZygqKGNoYXIqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfVUJZVEU6CisgICAgICAgIHYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKHVuc2lnbmVkIGNoYXIqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfU0hPUlQ6CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZygqKHNob3J0KilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1VTSE9SVDoKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCoodW5zaWduZWQgc2hvcnQqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfSU5UOgorICAgICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoKihpbnQqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfVUlOVDoKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCoodW5zaWduZWQgaW50KilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0xPTkc6CisgICAgICAgIHYgPSBQeUludF9Gcm9tTG9uZygqKGxvbmcqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfVUxPTkc6CisgICAgICAgIHYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKHVuc2lnbmVkIGxvbmcqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfUFlTU0laRVQ6CisgICAgICAgIHYgPSBQeUludF9Gcm9tU3NpemVfdCgqKFB5X3NzaXplX3QqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfRkxPQVQ6CisgICAgICAgIHYgPSBQeUZsb2F0X0Zyb21Eb3VibGUoKGRvdWJsZSkqKGZsb2F0KilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0RPVUJMRToKKyAgICAgICAgdiA9IFB5RmxvYXRfRnJvbURvdWJsZSgqKGRvdWJsZSopYWRkcik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9TVFJJTkc6CisgICAgICAgIGlmICgqKGNoYXIqKilhZGRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIHYgPSBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCooY2hhcioqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfU1RSSU5HX0lOUExBQ0U6CisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKChjaGFyKilhZGRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0NIQVI6CisgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopYWRkciwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9PQkpFQ1Q6CisgICAgICAgIHYgPSAqKFB5T2JqZWN0ICoqKWFkZHI7CisgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICB2ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfT0JKRUNUX0VYOgorICAgICAgICB2ID0gKihQeU9iamVjdCAqKilhZGRyOworICAgICAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBsLT5uYW1lKTsKKyAgICAgICAgUHlfWElOQ1JFRih2KTsKKyAgICAgICAgYnJlYWs7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLQljYXNlIFRfTE9OR0xPTkc6Ci0JCXYgPSBQeUxvbmdfRnJvbUxvbmdMb25nKCooUFlfTE9OR19MT05HICopYWRkcik7Ci0JCWJyZWFrOwotCWNhc2UgVF9VTE9OR0xPTkc6Ci0JCXYgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKih1bnNpZ25lZCBQWV9MT05HX0xPTkcgKilhZGRyKTsKLQkJYnJlYWs7CisgICAgY2FzZSBUX0xPTkdMT05HOgorICAgICAgICB2ID0gUHlMb25nX0Zyb21Mb25nTG9uZygqKFBZX0xPTkdfTE9ORyAqKWFkZHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfVUxPTkdMT05HOgorICAgICAgICB2ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKCoodW5zaWduZWQgUFlfTE9OR19MT05HICopYWRkcik7CisgICAgICAgIGJyZWFrOwogI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCi0JZGVmYXVsdDoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLCAiYmFkIG1lbWJlcmRlc2NyIHR5cGUiKTsKLQkJdiA9IE5VTEw7Ci0JfQotCXJldHVybiB2OworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgImJhZCBtZW1iZXJkZXNjciB0eXBlIik7CisgICAgICAgIHYgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gdjsKIH0KIAogaW50CiBQeU1lbWJlcl9TZXQoY2hhciAqYWRkciwgc3RydWN0IG1lbWJlcmxpc3QgKm1saXN0LCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlzdHJ1Y3QgbWVtYmVybGlzdCAqbDsKKyAgICBzdHJ1Y3QgbWVtYmVybGlzdCAqbDsKIAotCWZvciAobCA9IG1saXN0OyBsLT5uYW1lICE9IE5VTEw7IGwrKykgewotCQlpZiAoc3RyY21wKGwtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCVB5TWVtYmVyRGVmIGNvcHk7Ci0JCQljb3B5Lm5hbWUgPSBsLT5uYW1lOwotCQkJY29weS50eXBlID0gbC0+dHlwZTsKLQkJCWNvcHkub2Zmc2V0ID0gbC0+b2Zmc2V0OwotCQkJY29weS5mbGFncyA9IGwtPmZsYWdzOwotCQkJY29weS5kb2MgPSBOVUxMOwotCQkJcmV0dXJuIFB5TWVtYmVyX1NldE9uZShhZGRyLCAmY29weSwgdik7Ci0JCX0KLQl9CisgICAgZm9yIChsID0gbWxpc3Q7IGwtPm5hbWUgIT0gTlVMTDsgbCsrKSB7CisgICAgICAgIGlmIChzdHJjbXAobC0+bmFtZSwgbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgUHlNZW1iZXJEZWYgY29weTsKKyAgICAgICAgICAgIGNvcHkubmFtZSA9IGwtPm5hbWU7CisgICAgICAgICAgICBjb3B5LnR5cGUgPSBsLT50eXBlOworICAgICAgICAgICAgY29weS5vZmZzZXQgPSBsLT5vZmZzZXQ7CisgICAgICAgICAgICBjb3B5LmZsYWdzID0gbC0+ZmxhZ3M7CisgICAgICAgICAgICBjb3B5LmRvYyA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gUHlNZW1iZXJfU2V0T25lKGFkZHIsICZjb3B5LCB2KTsKKyAgICAgICAgfQorICAgIH0KIAotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7Ci0JcmV0dXJuIC0xOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwgbmFtZSk7CisgICAgcmV0dXJuIC0xOwogfQogCi0jZGVmaW5lIFdBUk4obXNnKQkJCQkJXAotICAgIGRvIHsJCQkJCQlcCi0JaWYgKFB5RXJyX1dhcm4oUHlFeGNfUnVudGltZVdhcm5pbmcsIG1zZykgPCAwKQlcCi0JCXJldHVybiAtMTsJCQkJXAorI2RlZmluZSBXQVJOKG1zZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoUHlFcnJfV2FybihQeUV4Y19SdW50aW1lV2FybmluZywgbXNnKSA8IDApICAgICAgXAorICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKIAogaW50CiBQeU1lbWJlcl9TZXRPbmUoY2hhciAqYWRkciwgUHlNZW1iZXJEZWYgKmwsIFB5T2JqZWN0ICp2KQogewotCVB5T2JqZWN0ICpvbGR2OworICAgIFB5T2JqZWN0ICpvbGR2OwogCi0JYWRkciArPSBsLT5vZmZzZXQ7CisgICAgYWRkciArPSBsLT5vZmZzZXQ7CiAKLQlpZiAoKGwtPmZsYWdzICYgUkVBRE9OTFkpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlYWRvbmx5IGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgobC0+ZmxhZ3MgJiBQWV9XUklURV9SRVNUUklDVEVEKSAmJiBQeUV2YWxfR2V0UmVzdHJpY3RlZCgpKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJyZXN0cmljdGVkIGF0dHJpYnV0ZSIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICh2ID09IE5VTEwpIHsKLQkJaWYgKGwtPnR5cGUgPT0gVF9PQkpFQ1RfRVgpIHsKLQkJCS8qIENoZWNrIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0LiAqLwotCQkJaWYgKCooUHlPYmplY3QgKiopYWRkciA9PSBOVUxMKSB7Ci0JCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBsLT5uYW1lKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobC0+dHlwZSAhPSBUX09CSkVDVCkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImNhbid0IGRlbGV0ZSBudW1lcmljL2NoYXIgYXR0cmlidXRlIik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0Jc3dpdGNoIChsLT50eXBlKSB7Ci0JY2FzZSBUX0JPT0w6ewotCQlpZiAoIVB5Qm9vbF9DaGVjayh2KSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImF0dHJpYnV0ZSB2YWx1ZSB0eXBlIG11c3QgYmUgYm9vbCIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWlmICh2ID09IFB5X1RydWUpCi0JCQkqKGNoYXIqKWFkZHIgPSAoY2hhcikgMTsKLQkJZWxzZQotCQkJKihjaGFyKilhZGRyID0gKGNoYXIpIDA7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX0JZVEU6ewotCQlsb25nIGxvbmdfdmFsID0gUHlJbnRfQXNMb25nKHYpOwotCQlpZiAoKGxvbmdfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqKGNoYXIqKWFkZHIgPSAoY2hhcilsb25nX3ZhbDsKLQkJLyogWFhYOiBGb3IgY29tcGF0aWJpbGl0eSwgb25seSB3YXJuIGFib3V0IHRydW5jYXRpb25zCi0JCSAgIGZvciBub3cuICovCi0JCWlmICgobG9uZ192YWwgPiBDSEFSX01BWCkgfHwgKGxvbmdfdmFsIDwgQ0hBUl9NSU4pKQotCQkJV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byBjaGFyIik7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX1VCWVRFOnsKLQkJbG9uZyBsb25nX3ZhbCA9IFB5SW50X0FzTG9uZyh2KTsKLQkJaWYgKChsb25nX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKih1bnNpZ25lZCBjaGFyKilhZGRyID0gKHVuc2lnbmVkIGNoYXIpbG9uZ192YWw7Ci0JCWlmICgobG9uZ192YWwgPiBVQ0hBUl9NQVgpIHx8IChsb25nX3ZhbCA8IDApKQotCQkJV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byB1bnNpZ25lZCBjaGFyIik7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX1NIT1JUOnsKLQkJbG9uZyBsb25nX3ZhbCA9IFB5SW50X0FzTG9uZyh2KTsKLQkJaWYgKChsb25nX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLQkJCXJldHVybiAtMTsKLQkJKihzaG9ydCopYWRkciA9IChzaG9ydClsb25nX3ZhbDsKLQkJaWYgKChsb25nX3ZhbCA+IFNIUlRfTUFYKSB8fCAobG9uZ192YWwgPCBTSFJUX01JTikpCi0JCQlXQVJOKCJUcnVuY2F0aW9uIG9mIHZhbHVlIHRvIHNob3J0Iik7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX1VTSE9SVDp7Ci0JCWxvbmcgbG9uZ192YWwgPSBQeUludF9Bc0xvbmcodik7Ci0JCWlmICgobG9uZ192YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCSoodW5zaWduZWQgc2hvcnQqKWFkZHIgPSAodW5zaWduZWQgc2hvcnQpbG9uZ192YWw7Ci0JCWlmICgobG9uZ192YWwgPiBVU0hSVF9NQVgpIHx8IChsb25nX3ZhbCA8IDApKQotCQkJV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byB1bnNpZ25lZCBzaG9ydCIpOwotCQlicmVhazsKLQkJfQotICAJY2FzZSBUX0lOVDp7Ci0JCWxvbmcgbG9uZ192YWwgPSBQeUludF9Bc0xvbmcodik7Ci0JCWlmICgobG9uZ192YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCSooaW50ICopYWRkciA9IChpbnQpbG9uZ192YWw7Ci0JCWlmICgobG9uZ192YWwgPiBJTlRfTUFYKSB8fCAobG9uZ192YWwgPCBJTlRfTUlOKSkKLQkJCVdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gaW50Iik7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX1VJTlQ6ewotCQl1bnNpZ25lZCBsb25nIHVsb25nX3ZhbCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2KTsKLQkJaWYgKCh1bG9uZ192YWwgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotCQkJLyogWFhYOiBGb3IgY29tcGF0aWJpbGl0eSwgYWNjZXB0IG5lZ2F0aXZlIGludCB2YWx1ZXMKLQkJCSAgIGFzIHdlbGwuICovCi0JCQlQeUVycl9DbGVhcigpOwotCQkJdWxvbmdfdmFsID0gUHlMb25nX0FzTG9uZyh2KTsKLQkJCWlmICgodWxvbmdfdmFsID09ICh1bnNpZ25lZCBpbnQpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJKih1bnNpZ25lZCBpbnQgKilhZGRyID0gKHVuc2lnbmVkIGludCl1bG9uZ192YWw7Ci0JCQlXQVJOKCJXcml0aW5nIG5lZ2F0aXZlIHZhbHVlIGludG8gdW5zaWduZWQgZmllbGQiKTsKLQkJfSBlbHNlCi0JCQkqKHVuc2lnbmVkIGludCAqKWFkZHIgPSAodW5zaWduZWQgaW50KXVsb25nX3ZhbDsKLQkJaWYgKHVsb25nX3ZhbCA+IFVJTlRfTUFYKQotCQkJV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byB1bnNpZ25lZCBpbnQiKTsKLQkJYnJlYWs7Ci0JCX0KLQljYXNlIFRfTE9ORzp7Ci0JCSoobG9uZyopYWRkciA9IFB5TG9uZ19Bc0xvbmcodik7Ci0JCWlmICgoKihsb25nKilhZGRyID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9VTE9ORzp7Ci0JCSoodW5zaWduZWQgbG9uZyopYWRkciA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyh2KTsKLQkJaWYgKCgqKHVuc2lnbmVkIGxvbmcqKWFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpLTEpCi0JCSAgICAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0JCQkvKiBYWFg6IEZvciBjb21wYXRpYmlsaXR5LCBhY2NlcHQgbmVnYXRpdmUgaW50IHZhbHVlcwotCQkJICAgYXMgd2VsbC4gKi8KLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkqKHVuc2lnbmVkIGxvbmcqKWFkZHIgPSBQeUxvbmdfQXNMb25nKHYpOwotCQkJaWYgKCgqKHVuc2lnbmVkIGxvbmcqKWFkZHIgPT0gKHVuc2lnbmVkIGludCktMSkKLQkJCSAgICAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJCXJldHVybiAtMTsKLQkJCVdBUk4oIldyaXRpbmcgbmVnYXRpdmUgdmFsdWUgaW50byB1bnNpZ25lZCBmaWVsZCIpOwotCQl9Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX1BZU1NJWkVUOnsKLQkJKihQeV9zc2l6ZV90KilhZGRyID0gUHlJbnRfQXNTc2l6ZV90KHYpOwotCQlpZiAoKCooUHlfc3NpemVfdCopYWRkciA9PSAoUHlfc3NpemVfdCktMSkKLQkJICAgICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQkJfQotCWNhc2UgVF9GTE9BVDp7Ci0JCWRvdWJsZSBkb3VibGVfdmFsID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKLQkJaWYgKChkb3VibGVfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQkqKGZsb2F0KilhZGRyID0gKGZsb2F0KWRvdWJsZV92YWw7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX0RPVUJMRToKLQkJKihkb3VibGUqKWFkZHIgPSBQeUZsb2F0X0FzRG91YmxlKHYpOwotCQlpZiAoKCooZG91YmxlKilhZGRyID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQotCQkJcmV0dXJuIC0xOwotCQlicmVhazsKLQljYXNlIFRfT0JKRUNUOgotCWNhc2UgVF9PQkpFQ1RfRVg6Ci0JCVB5X1hJTkNSRUYodik7Ci0JCW9sZHYgPSAqKFB5T2JqZWN0ICoqKWFkZHI7Ci0JCSooUHlPYmplY3QgKiopYWRkciA9IHY7Ci0JCVB5X1hERUNSRUYob2xkdik7Ci0JCWJyZWFrOwotCWNhc2UgVF9DSEFSOgotCQlpZiAoUHlTdHJpbmdfQ2hlY2sodikgJiYgUHlTdHJpbmdfU2l6ZSh2KSA9PSAxKSB7Ci0JCQkqKGNoYXIqKWFkZHIgPSBQeVN0cmluZ19Bc1N0cmluZyh2KVswXTsKLQkJfQotCQllbHNlIHsKLQkJCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUX1NUUklORzoKLQljYXNlIFRfU1RSSU5HX0lOUExBQ0U6Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZWFkb25seSBhdHRyaWJ1dGUiKTsKLQkJcmV0dXJuIC0xOworICAgIGlmICgobC0+ZmxhZ3MgJiBSRUFET05MWSkpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVhZG9ubHkgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChsLT5mbGFncyAmIFBZX1dSSVRFX1JFU1RSSUNURUQpICYmIFB5RXZhbF9HZXRSZXN0cmljdGVkKCkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInJlc3RyaWN0ZWQgYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBpZiAobC0+dHlwZSA9PSBUX09CSkVDVF9FWCkgeworICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGF0dHJpYnV0ZSBpcyBzZXQuICovCisgICAgICAgICAgICBpZiAoKihQeU9iamVjdCAqKilhZGRyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfQXR0cmlidXRlRXJyb3IsIGwtPm5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsLT50eXBlICE9IFRfT0JKRUNUKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBkZWxldGUgbnVtZXJpYy9jaGFyIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIHN3aXRjaCAobC0+dHlwZSkgeworICAgIGNhc2UgVF9CT09MOnsKKyAgICAgICAgaWYgKCFQeUJvb2xfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSB2YWx1ZSB0eXBlIG11c3QgYmUgYm9vbCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICh2ID09IFB5X1RydWUpCisgICAgICAgICAgICAqKGNoYXIqKWFkZHIgPSAoY2hhcikgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKihjaGFyKilhZGRyID0gKGNoYXIpIDA7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX0JZVEU6eworICAgICAgICBsb25nIGxvbmdfdmFsID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICBpZiAoKGxvbmdfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqKGNoYXIqKWFkZHIgPSAoY2hhcilsb25nX3ZhbDsKKyAgICAgICAgLyogWFhYOiBGb3IgY29tcGF0aWJpbGl0eSwgb25seSB3YXJuIGFib3V0IHRydW5jYXRpb25zCisgICAgICAgICAgIGZvciBub3cuICovCisgICAgICAgIGlmICgobG9uZ192YWwgPiBDSEFSX01BWCkgfHwgKGxvbmdfdmFsIDwgQ0hBUl9NSU4pKQorICAgICAgICAgICAgV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byBjaGFyIik7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX1VCWVRFOnsKKyAgICAgICAgbG9uZyBsb25nX3ZhbCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgaWYgKChsb25nX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKih1bnNpZ25lZCBjaGFyKilhZGRyID0gKHVuc2lnbmVkIGNoYXIpbG9uZ192YWw7CisgICAgICAgIGlmICgobG9uZ192YWwgPiBVQ0hBUl9NQVgpIHx8IChsb25nX3ZhbCA8IDApKQorICAgICAgICAgICAgV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byB1bnNpZ25lZCBjaGFyIik7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX1NIT1JUOnsKKyAgICAgICAgbG9uZyBsb25nX3ZhbCA9IFB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgaWYgKChsb25nX3ZhbCA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgKihzaG9ydCopYWRkciA9IChzaG9ydClsb25nX3ZhbDsKKyAgICAgICAgaWYgKChsb25nX3ZhbCA+IFNIUlRfTUFYKSB8fCAobG9uZ192YWwgPCBTSFJUX01JTikpCisgICAgICAgICAgICBXQVJOKCJUcnVuY2F0aW9uIG9mIHZhbHVlIHRvIHNob3J0Iik7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX1VTSE9SVDp7CisgICAgICAgIGxvbmcgbG9uZ192YWwgPSBQeUludF9Bc0xvbmcodik7CisgICAgICAgIGlmICgobG9uZ192YWwgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICoodW5zaWduZWQgc2hvcnQqKWFkZHIgPSAodW5zaWduZWQgc2hvcnQpbG9uZ192YWw7CisgICAgICAgIGlmICgobG9uZ192YWwgPiBVU0hSVF9NQVgpIHx8IChsb25nX3ZhbCA8IDApKQorICAgICAgICAgICAgV0FSTigiVHJ1bmNhdGlvbiBvZiB2YWx1ZSB0byB1bnNpZ25lZCBzaG9ydCIpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9JTlQ6eworICAgICAgICBsb25nIGxvbmdfdmFsID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICBpZiAoKGxvbmdfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqKGludCAqKWFkZHIgPSAoaW50KWxvbmdfdmFsOworICAgICAgICBpZiAoKGxvbmdfdmFsID4gSU5UX01BWCkgfHwgKGxvbmdfdmFsIDwgSU5UX01JTikpCisgICAgICAgICAgICBXQVJOKCJUcnVuY2F0aW9uIG9mIHZhbHVlIHRvIGludCIpOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9VSU5UOnsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB1bG9uZ192YWwgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7CisgICAgICAgIGlmICgodWxvbmdfdmFsID09ICh1bnNpZ25lZCBpbnQpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgIC8qIFhYWDogRm9yIGNvbXBhdGliaWxpdHksIGFjY2VwdCBuZWdhdGl2ZSBpbnQgdmFsdWVzCisgICAgICAgICAgICAgICBhcyB3ZWxsLiAqLworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHVsb25nX3ZhbCA9IFB5TG9uZ19Bc0xvbmcodik7CisgICAgICAgICAgICBpZiAoKHVsb25nX3ZhbCA9PSAodW5zaWduZWQgaW50KS0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICoodW5zaWduZWQgaW50ICopYWRkciA9ICh1bnNpZ25lZCBpbnQpdWxvbmdfdmFsOworICAgICAgICAgICAgV0FSTigiV3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSBpbnRvIHVuc2lnbmVkIGZpZWxkIik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgKih1bnNpZ25lZCBpbnQgKilhZGRyID0gKHVuc2lnbmVkIGludCl1bG9uZ192YWw7CisgICAgICAgIGlmICh1bG9uZ192YWwgPiBVSU5UX01BWCkKKyAgICAgICAgICAgIFdBUk4oIlRydW5jYXRpb24gb2YgdmFsdWUgdG8gdW5zaWduZWQgaW50Iik7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX0xPTkc6eworICAgICAgICAqKGxvbmcqKWFkZHIgPSBQeUxvbmdfQXNMb25nKHYpOworICAgICAgICBpZiAoKCoobG9uZyopYWRkciA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIFRfVUxPTkc6eworICAgICAgICAqKHVuc2lnbmVkIGxvbmcqKWFkZHIgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmcodik7CisgICAgICAgIGlmICgoKih1bnNpZ25lZCBsb25nKilhZGRyID09ICh1bnNpZ25lZCBsb25nKS0xKQorICAgICAgICAgICAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgLyogWFhYOiBGb3IgY29tcGF0aWJpbGl0eSwgYWNjZXB0IG5lZ2F0aXZlIGludCB2YWx1ZXMKKyAgICAgICAgICAgICAgIGFzIHdlbGwuICovCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgKih1bnNpZ25lZCBsb25nKilhZGRyID0gUHlMb25nX0FzTG9uZyh2KTsKKyAgICAgICAgICAgIGlmICgoKih1bnNpZ25lZCBsb25nKilhZGRyID09ICh1bnNpZ25lZCBpbnQpLTEpCisgICAgICAgICAgICAgICAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBXQVJOKCJXcml0aW5nIG5lZ2F0aXZlIHZhbHVlIGludG8gdW5zaWduZWQgZmllbGQiKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9QWVNTSVpFVDp7CisgICAgICAgICooUHlfc3NpemVfdCopYWRkciA9IFB5SW50X0FzU3NpemVfdCh2KTsKKyAgICAgICAgaWYgKCgqKFB5X3NzaXplX3QqKWFkZHIgPT0gKFB5X3NzaXplX3QpLTEpCisgICAgICAgICAgICAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgVF9GTE9BVDp7CisgICAgICAgIGRvdWJsZSBkb3VibGVfdmFsID0gUHlGbG9hdF9Bc0RvdWJsZSh2KTsKKyAgICAgICAgaWYgKChkb3VibGVfdmFsID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAqKGZsb2F0KilhZGRyID0gKGZsb2F0KWRvdWJsZV92YWw7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX0RPVUJMRToKKyAgICAgICAgKihkb3VibGUqKWFkZHIgPSBQeUZsb2F0X0FzRG91YmxlKHYpOworICAgICAgICBpZiAoKCooZG91YmxlKilhZGRyID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRfT0JKRUNUOgorICAgIGNhc2UgVF9PQkpFQ1RfRVg6CisgICAgICAgIFB5X1hJTkNSRUYodik7CisgICAgICAgIG9sZHYgPSAqKFB5T2JqZWN0ICoqKWFkZHI7CisgICAgICAgICooUHlPYmplY3QgKiopYWRkciA9IHY7CisgICAgICAgIFB5X1hERUNSRUYob2xkdik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVF9DSEFSOgorICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodikgJiYgUHlTdHJpbmdfU2l6ZSh2KSA9PSAxKSB7CisgICAgICAgICAgICAqKGNoYXIqKWFkZHIgPSBQeVN0cmluZ19Bc1N0cmluZyh2KVswXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUX1NUUklORzoKKyAgICBjYXNlIFRfU1RSSU5HX0lOUExBQ0U6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZWFkb25seSBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOwogI2lmZGVmIEhBVkVfTE9OR19MT05HCi0JY2FzZSBUX0xPTkdMT05HOnsKLQkJUFlfTE9OR19MT05HIHZhbHVlOwotCQkqKFBZX0xPTkdfTE9ORyopYWRkciA9IHZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmcodik7Ci0JCWlmICgodmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBUX1VMT05HTE9ORzp7Ci0JCXVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWx1ZTsKLQkJLyogPz8/IFB5TG9uZ19Bc0xvbmdMb25nIGFjY2VwdHMgYW4gaW50LCBidXQgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZwotCQkJZG9lc24ndCA/Pz8gKi8KLQkJaWYgKFB5TG9uZ19DaGVjayh2KSkKLQkJCSoodW5zaWduZWQgUFlfTE9OR19MT05HKilhZGRyID0gdmFsdWUgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKHYpOwotCQllbHNlCi0JCQkqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyopYWRkciA9IHZhbHVlID0gUHlJbnRfQXNMb25nKHYpOwotCQlpZiAoKHZhbHVlID09ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCi0JCQlyZXR1cm4gLTE7Ci0JCWJyZWFrOwotCQl9CisgICAgY2FzZSBUX0xPTkdMT05HOnsKKyAgICAgICAgUFlfTE9OR19MT05HIHZhbHVlOworICAgICAgICAqKFBZX0xPTkdfTE9ORyopYWRkciA9IHZhbHVlID0gUHlMb25nX0FzTG9uZ0xvbmcodik7CisgICAgICAgIGlmICgodmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBUX1VMT05HTE9ORzp7CisgICAgICAgIHVuc2lnbmVkIFBZX0xPTkdfTE9ORyB2YWx1ZTsKKyAgICAgICAgLyogPz8/IFB5TG9uZ19Bc0xvbmdMb25nIGFjY2VwdHMgYW4gaW50LCBidXQgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZworICAgICAgICAgICAgZG9lc24ndCA/Pz8gKi8KKyAgICAgICAgaWYgKFB5TG9uZ19DaGVjayh2KSkKKyAgICAgICAgICAgICoodW5zaWduZWQgUFlfTE9OR19MT05HKilhZGRyID0gdmFsdWUgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKHYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqKHVuc2lnbmVkIFBZX0xPTkdfTE9ORyopYWRkciA9IHZhbHVlID0gUHlJbnRfQXNMb25nKHYpOworICAgICAgICBpZiAoKHZhbHVlID09ICh1bnNpZ25lZCBQWV9MT05HX0xPTkcpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CiAjZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KLQlkZWZhdWx0OgotCQlQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCi0JCQkgICAgICJiYWQgbWVtYmVyZGVzY3IgdHlwZSBmb3IgJXMiLCBsLT5uYW1lKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiYmFkIG1lbWJlcmRlc2NyIHR5cGUgZm9yICVzIiwgbC0+bmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vc3ltdGFibGUuYyBiL1B5dGhvbi9zeW10YWJsZS5jCmluZGV4IGYzYmEwODguLmYzMGJhMGYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9zeW10YWJsZS5jCisrKyBiL1B5dGhvbi9zeW10YWJsZS5jCkBAIC0xOSwxNTEgKzE5LDE1MSBAQAogCiBzdGF0aWMgUHlTVEVudHJ5T2JqZWN0ICoKIHN0ZV9uZXcoc3RydWN0IHN5bXRhYmxlICpzdCwgaWRlbnRpZmllciBuYW1lLCBfUHlfYmxvY2tfdHkgYmxvY2ssCi0JICAgICAgdm9pZCAqa2V5LCBpbnQgbGluZW5vKQorICAgICAgICAgICAgICB2b2lkICprZXksIGludCBsaW5lbm8pCiB7Ci0JUHlTVEVudHJ5T2JqZWN0ICpzdGUgPSBOVUxMOwotCVB5T2JqZWN0ICprOworICAgIFB5U1RFbnRyeU9iamVjdCAqc3RlID0gTlVMTDsKKyAgICBQeU9iamVjdCAqazsKIAotCWsgPSBQeUxvbmdfRnJvbVZvaWRQdHIoa2V5KTsKLQlpZiAoayA9PSBOVUxMKQotCQlnb3RvIGZhaWw7Ci0Jc3RlID0gUHlPYmplY3RfTmV3KFB5U1RFbnRyeU9iamVjdCwgJlB5U1RFbnRyeV9UeXBlKTsKLQlpZiAoc3RlID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQlzdGUtPnN0ZV90YWJsZSA9IHN0OwotCXN0ZS0+c3RlX2lkID0gazsKLQlzdGUtPnN0ZV90bXBuYW1lID0gMDsKKyAgICBrID0gUHlMb25nX0Zyb21Wb2lkUHRyKGtleSk7CisgICAgaWYgKGsgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIHN0ZSA9IFB5T2JqZWN0X05ldyhQeVNURW50cnlPYmplY3QsICZQeVNURW50cnlfVHlwZSk7CisgICAgaWYgKHN0ZSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc3RlLT5zdGVfdGFibGUgPSBzdDsKKyAgICBzdGUtPnN0ZV9pZCA9IGs7CisgICAgc3RlLT5zdGVfdG1wbmFtZSA9IDA7CiAKLQlzdGUtPnN0ZV9uYW1lID0gbmFtZTsKLQlQeV9JTkNSRUYobmFtZSk7CisgICAgc3RlLT5zdGVfbmFtZSA9IG5hbWU7CisgICAgUHlfSU5DUkVGKG5hbWUpOwogCi0Jc3RlLT5zdGVfc3ltYm9scyA9IE5VTEw7Ci0Jc3RlLT5zdGVfdmFybmFtZXMgPSBOVUxMOwotCXN0ZS0+c3RlX2NoaWxkcmVuID0gTlVMTDsKKyAgICBzdGUtPnN0ZV9zeW1ib2xzID0gTlVMTDsKKyAgICBzdGUtPnN0ZV92YXJuYW1lcyA9IE5VTEw7CisgICAgc3RlLT5zdGVfY2hpbGRyZW4gPSBOVUxMOwogCi0Jc3RlLT5zdGVfc3ltYm9scyA9IFB5RGljdF9OZXcoKTsKLQlpZiAoc3RlLT5zdGVfc3ltYm9scyA9PSBOVUxMKQotCSAgICBnb3RvIGZhaWw7CisgICAgc3RlLT5zdGVfc3ltYm9scyA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoc3RlLT5zdGVfc3ltYm9scyA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CiAKLQlzdGUtPnN0ZV92YXJuYW1lcyA9IFB5TGlzdF9OZXcoMCk7Ci0JaWYgKHN0ZS0+c3RlX3Zhcm5hbWVzID09IE5VTEwpCi0JICAgIGdvdG8gZmFpbDsKKyAgICBzdGUtPnN0ZV92YXJuYW1lcyA9IFB5TGlzdF9OZXcoMCk7CisgICAgaWYgKHN0ZS0+c3RlX3Zhcm5hbWVzID09IE5VTEwpCisgICAgICAgIGdvdG8gZmFpbDsKIAotCXN0ZS0+c3RlX2NoaWxkcmVuID0gUHlMaXN0X05ldygwKTsKLQlpZiAoc3RlLT5zdGVfY2hpbGRyZW4gPT0gTlVMTCkKLQkgICAgZ290byBmYWlsOworICAgIHN0ZS0+c3RlX2NoaWxkcmVuID0gUHlMaXN0X05ldygwKTsKKyAgICBpZiAoc3RlLT5zdGVfY2hpbGRyZW4gPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOwogCi0Jc3RlLT5zdGVfdHlwZSA9IGJsb2NrOwotCXN0ZS0+c3RlX3Vub3B0aW1pemVkID0gMDsKLQlzdGUtPnN0ZV9uZXN0ZWQgPSAwOwotCXN0ZS0+c3RlX2ZyZWUgPSAwOwotCXN0ZS0+c3RlX3ZhcmFyZ3MgPSAwOwotCXN0ZS0+c3RlX3ZhcmtleXdvcmRzID0gMDsKLQlzdGUtPnN0ZV9vcHRfbGluZW5vID0gMDsKLQlzdGUtPnN0ZV90bXBuYW1lID0gMDsKLQlzdGUtPnN0ZV9saW5lbm8gPSBsaW5lbm87CisgICAgc3RlLT5zdGVfdHlwZSA9IGJsb2NrOworICAgIHN0ZS0+c3RlX3Vub3B0aW1pemVkID0gMDsKKyAgICBzdGUtPnN0ZV9uZXN0ZWQgPSAwOworICAgIHN0ZS0+c3RlX2ZyZWUgPSAwOworICAgIHN0ZS0+c3RlX3ZhcmFyZ3MgPSAwOworICAgIHN0ZS0+c3RlX3ZhcmtleXdvcmRzID0gMDsKKyAgICBzdGUtPnN0ZV9vcHRfbGluZW5vID0gMDsKKyAgICBzdGUtPnN0ZV90bXBuYW1lID0gMDsKKyAgICBzdGUtPnN0ZV9saW5lbm8gPSBsaW5lbm87CiAKLQlpZiAoc3QtPnN0X2N1ciAhPSBOVUxMICYmCi0JICAgIChzdC0+c3RfY3VyLT5zdGVfbmVzdGVkIHx8Ci0JICAgICBzdC0+c3RfY3VyLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrKSkKLQkJc3RlLT5zdGVfbmVzdGVkID0gMTsKLQlzdGUtPnN0ZV9jaGlsZF9mcmVlID0gMDsKLQlzdGUtPnN0ZV9nZW5lcmF0b3IgPSAwOwotCXN0ZS0+c3RlX3JldHVybnNfdmFsdWUgPSAwOworICAgIGlmIChzdC0+c3RfY3VyICE9IE5VTEwgJiYKKyAgICAgICAgKHN0LT5zdF9jdXItPnN0ZV9uZXN0ZWQgfHwKKyAgICAgICAgIHN0LT5zdF9jdXItPnN0ZV90eXBlID09IEZ1bmN0aW9uQmxvY2spKQorICAgICAgICBzdGUtPnN0ZV9uZXN0ZWQgPSAxOworICAgIHN0ZS0+c3RlX2NoaWxkX2ZyZWUgPSAwOworICAgIHN0ZS0+c3RlX2dlbmVyYXRvciA9IDA7CisgICAgc3RlLT5zdGVfcmV0dXJuc192YWx1ZSA9IDA7CiAKLQlpZiAoUHlEaWN0X1NldEl0ZW0oc3QtPnN0X3N5bWJvbHMsIHN0ZS0+c3RlX2lkLCAoUHlPYmplY3QgKilzdGUpIDwgMCkKLQkgICAgZ290byBmYWlsOwotCQotCXJldHVybiBzdGU7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtKHN0LT5zdF9zeW1ib2xzLCBzdGUtPnN0ZV9pZCwgKFB5T2JqZWN0ICopc3RlKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldHVybiBzdGU7CiAgZmFpbDoKLQlQeV9YREVDUkVGKHN0ZSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgUHlfWERFQ1JFRihzdGUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RlX3JlcHIoUHlTVEVudHJ5T2JqZWN0ICpzdGUpCiB7Ci0JY2hhciBidWZbMjU2XTsKKyAgICBjaGFyIGJ1ZlsyNTZdOwogCi0JUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkgICAgICAiPHN5bXRhYmxlIGVudHJ5ICUuMTAwcyglbGQpLCBsaW5lICVkPiIsCi0JCSAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzdGUtPnN0ZV9uYW1lKSwKLQkJICAgICAgUHlJbnRfQVNfTE9ORyhzdGUtPnN0ZV9pZCksIHN0ZS0+c3RlX2xpbmVubyk7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAiPHN5bXRhYmxlIGVudHJ5ICUuMTAwcyglbGQpLCBsaW5lICVkPiIsCisgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RlLT5zdGVfbmFtZSksCisgICAgICAgICAgICAgICAgICBQeUludF9BU19MT05HKHN0ZS0+c3RlX2lkKSwgc3RlLT5zdGVfbGluZW5vKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgdm9pZAogc3RlX2RlYWxsb2MoUHlTVEVudHJ5T2JqZWN0ICpzdGUpCiB7Ci0Jc3RlLT5zdGVfdGFibGUgPSBOVUxMOwotCVB5X1hERUNSRUYoc3RlLT5zdGVfaWQpOwotCVB5X1hERUNSRUYoc3RlLT5zdGVfbmFtZSk7Ci0JUHlfWERFQ1JFRihzdGUtPnN0ZV9zeW1ib2xzKTsKLQlQeV9YREVDUkVGKHN0ZS0+c3RlX3Zhcm5hbWVzKTsKLQlQeV9YREVDUkVGKHN0ZS0+c3RlX2NoaWxkcmVuKTsKLQlQeU9iamVjdF9EZWwoc3RlKTsKKyAgICBzdGUtPnN0ZV90YWJsZSA9IE5VTEw7CisgICAgUHlfWERFQ1JFRihzdGUtPnN0ZV9pZCk7CisgICAgUHlfWERFQ1JFRihzdGUtPnN0ZV9uYW1lKTsKKyAgICBQeV9YREVDUkVGKHN0ZS0+c3RlX3N5bWJvbHMpOworICAgIFB5X1hERUNSRUYoc3RlLT5zdGVfdmFybmFtZXMpOworICAgIFB5X1hERUNSRUYoc3RlLT5zdGVfY2hpbGRyZW4pOworICAgIFB5T2JqZWN0X0RlbChzdGUpOwogfQogCiAjZGVmaW5lIE9GRih4KSBvZmZzZXRvZihQeVNURW50cnlPYmplY3QsIHgpCiAKIHN0YXRpYyBQeU1lbWJlckRlZiBzdGVfbWVtYmVybGlzdFtdID0gewotCXsiaWQiLCAgICAgICBUX09CSkVDVCwgT0ZGKHN0ZV9pZCksIFJFQURPTkxZfSwKLQl7Im5hbWUiLCAgICAgVF9PQkpFQ1QsIE9GRihzdGVfbmFtZSksIFJFQURPTkxZfSwKLQl7InN5bWJvbHMiLCAgVF9PQkpFQ1QsIE9GRihzdGVfc3ltYm9scyksIFJFQURPTkxZfSwKLQl7InZhcm5hbWVzIiwgVF9PQkpFQ1QsIE9GRihzdGVfdmFybmFtZXMpLCBSRUFET05MWX0sCi0JeyJjaGlsZHJlbiIsIFRfT0JKRUNULCBPRkYoc3RlX2NoaWxkcmVuKSwgUkVBRE9OTFl9LAotICAgICAgICB7Im9wdGltaXplZCIsVF9JTlQsICAgIE9GRihzdGVfdW5vcHRpbWl6ZWQpLCBSRUFET05MWX0sCi0JeyJuZXN0ZWQiLCAgIFRfSU5ULCAgICBPRkYoc3RlX25lc3RlZCksIFJFQURPTkxZfSwKLQl7InR5cGUiLCAgICAgVF9JTlQsICAgIE9GRihzdGVfdHlwZSksIFJFQURPTkxZfSwKLQl7ImxpbmVubyIsICAgVF9JTlQsICAgIE9GRihzdGVfbGluZW5vKSwgUkVBRE9OTFl9LAotCXtOVUxMfQorICAgIHsiaWQiLCAgICAgICBUX09CSkVDVCwgT0ZGKHN0ZV9pZCksIFJFQURPTkxZfSwKKyAgICB7Im5hbWUiLCAgICAgVF9PQkpFQ1QsIE9GRihzdGVfbmFtZSksIFJFQURPTkxZfSwKKyAgICB7InN5bWJvbHMiLCAgVF9PQkpFQ1QsIE9GRihzdGVfc3ltYm9scyksIFJFQURPTkxZfSwKKyAgICB7InZhcm5hbWVzIiwgVF9PQkpFQ1QsIE9GRihzdGVfdmFybmFtZXMpLCBSRUFET05MWX0sCisgICAgeyJjaGlsZHJlbiIsIFRfT0JKRUNULCBPRkYoc3RlX2NoaWxkcmVuKSwgUkVBRE9OTFl9LAorICAgIHsib3B0aW1pemVkIixUX0lOVCwgICAgT0ZGKHN0ZV91bm9wdGltaXplZCksIFJFQURPTkxZfSwKKyAgICB7Im5lc3RlZCIsICAgVF9JTlQsICAgIE9GRihzdGVfbmVzdGVkKSwgUkVBRE9OTFl9LAorICAgIHsidHlwZSIsICAgICBUX0lOVCwgICAgT0ZGKHN0ZV90eXBlKSwgUkVBRE9OTFl9LAorICAgIHsibGluZW5vIiwgICBUX0lOVCwgICAgT0ZGKHN0ZV9saW5lbm8pLCBSRUFET05MWX0sCisgICAge05VTEx9CiB9OwogCiBQeVR5cGVPYmplY3QgUHlTVEVudHJ5X1R5cGUgPSB7Ci0JUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLQkic3ltdGFibGUgZW50cnkiLAotCXNpemVvZihQeVNURW50cnlPYmplY3QpLAotCTAsCi0JKGRlc3RydWN0b3Ipc3RlX2RlYWxsb2MsICAgICAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KLQkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLQkwLAkJCSAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLQkwLAkJCQkJLyogdHBfc2V0YXR0ciAqLwotCTAsCQkJICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KLQkocmVwcmZ1bmMpc3RlX3JlcHIsCQkJLyogdHBfcmVwciAqLwotCTAsCQkJCQkvKiB0cF9hc19udW1iZXIgKi8KLQkwLAkJCSAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCTAsCQkJCQkvKiB0cF9hc19tYXBwaW5nICovCi0JMCwJCQkJCS8qIHRwX2hhc2ggKi8KLQkwLAkJCQkJLyogdHBfY2FsbCAqLwotCTAsCQkJCQkvKiB0cF9zdHIgKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwJICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCi0gCTAsCQkJCQkvKiB0cF9kb2MgKi8KLQkwLAkJCQkJLyogdHBfdHJhdmVyc2UgKi8KLQkwLAkJCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0Jc3RlX21lbWJlcmxpc3QsCQkJCS8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCQkJLyogdHBfZ2V0c2V0ICovCi0JMCwJCQkJCS8qIHRwX2Jhc2UgKi8KLQkwLAkJCQkJLyogdHBfZGljdCAqLwotCTAsCQkJCQkvKiB0cF9kZXNjcl9nZXQgKi8KLQkwLAkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCi0JMCwJCQkJCS8qIHRwX2RpY3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaW5pdCAqLwotCTAsCQkJCQkvKiB0cF9hbGxvYyAqLwotCTAsCQkJCQkvKiB0cF9uZXcgKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQorICAgICJzeW10YWJsZSBlbnRyeSIsCisgICAgc2l6ZW9mKFB5U1RFbnRyeU9iamVjdCksCisgICAgMCwKKyAgICAoZGVzdHJ1Y3RvcilzdGVfZGVhbGxvYywgICAgICAgICAgICAgICAgLyogdHBfZGVhbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9wcmludCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgKHJlcHJmdW5jKXN0ZV9yZXByLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICBzdGVfbWVtYmVybGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKIHN0YXRpYyBpbnQgc3ltdGFibGVfYW5hbHl6ZShzdHJ1Y3Qgc3ltdGFibGUgKnN0KTsKIHN0YXRpYyBpbnQgc3ltdGFibGVfd2FybihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBjaGFyICptc2csIGludCBsaW5lbm8pOwotc3RhdGljIGludCBzeW10YWJsZV9lbnRlcl9ibG9jayhzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBpZGVudGlmaWVyIG5hbWUsIAotCQkJCV9QeV9ibG9ja190eSBibG9jaywgdm9pZCAqYXN0LCBpbnQgbGluZW5vKTsKK3N0YXRpYyBpbnQgc3ltdGFibGVfZW50ZXJfYmxvY2soc3RydWN0IHN5bXRhYmxlICpzdCwgaWRlbnRpZmllciBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfYmxvY2tfdHkgYmxvY2ssIHZvaWQgKmFzdCwgaW50IGxpbmVubyk7CiBzdGF0aWMgaW50IHN5bXRhYmxlX2V4aXRfYmxvY2soc3RydWN0IHN5bXRhYmxlICpzdCwgdm9pZCAqYXN0KTsKIHN0YXRpYyBpbnQgc3ltdGFibGVfdmlzaXRfc3RtdChzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBzdG10X3R5IHMpOwogc3RhdGljIGludCBzeW10YWJsZV92aXNpdF9leHByKHN0cnVjdCBzeW10YWJsZSAqc3QsIGV4cHJfdHkgcyk7CkBAIC0xODIsNyArMTgyLDcgQEAKIHN0YXRpYyBpZGVudGlmaWVyIHRvcCA9IE5VTEwsIGxhbWJkYSA9IE5VTEwsIGdlbmV4cHIgPSBOVUxMOwogCiAjZGVmaW5lIEdFVF9JREVOVElGSUVSKFZBUikgXAotCSgoVkFSKSA/IChWQVIpIDogKChWQVIpID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygjIFZBUikpKQorICAgICgoVkFSKSA/IChWQVIpIDogKChWQVIpID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygjIFZBUikpKQogCiAjZGVmaW5lIERVUExJQ0FURV9BUkdVTUVOVCBcCiAiZHVwbGljYXRlIGFyZ3VtZW50ICclcycgaW4gZnVuY3Rpb24gZGVmaW5pdGlvbiIKQEAgLTE5MCwxMzUgKzE5MCwxMzUgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3ltdGFibGUgKgogc3ltdGFibGVfbmV3KHZvaWQpCiB7Ci0Jc3RydWN0IHN5bXRhYmxlICpzdDsKKyAgICBzdHJ1Y3Qgc3ltdGFibGUgKnN0OwogCi0Jc3QgPSAoc3RydWN0IHN5bXRhYmxlICopUHlNZW1fTWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ltdGFibGUpKTsKLQlpZiAoc3QgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc3QgPSAoc3RydWN0IHN5bXRhYmxlICopUHlNZW1fTWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3ltdGFibGUpKTsKKyAgICBpZiAoc3QgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlzdC0+c3RfZmlsZW5hbWUgPSBOVUxMOwotCXN0LT5zdF9zeW1ib2xzID0gTlVMTDsKKyAgICBzdC0+c3RfZmlsZW5hbWUgPSBOVUxMOworICAgIHN0LT5zdF9zeW1ib2xzID0gTlVMTDsKIAotCWlmICgoc3QtPnN0X3N0YWNrID0gUHlMaXN0X05ldygwKSkgPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCWlmICgoc3QtPnN0X3N5bWJvbHMgPSBQeURpY3RfTmV3KCkpID09IE5VTEwpCi0JCWdvdG8gZmFpbDsgCi0Jc3QtPnN0X2N1ciA9IE5VTEw7Ci0Jc3QtPnN0X3RtcG5hbWUgPSAwOwotCXN0LT5zdF9wcml2YXRlID0gTlVMTDsKLQlyZXR1cm4gc3Q7CisgICAgaWYgKChzdC0+c3Rfc3RhY2sgPSBQeUxpc3RfTmV3KDApKSA9PSBOVUxMKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKChzdC0+c3Rfc3ltYm9scyA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCkKKyAgICAgICAgZ290byBmYWlsOworICAgIHN0LT5zdF9jdXIgPSBOVUxMOworICAgIHN0LT5zdF90bXBuYW1lID0gMDsKKyAgICBzdC0+c3RfcHJpdmF0ZSA9IE5VTEw7CisgICAgcmV0dXJuIHN0OwogIGZhaWw6Ci0JUHlTeW10YWJsZV9GcmVlKHN0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeVN5bXRhYmxlX0ZyZWUoc3QpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdHJ1Y3Qgc3ltdGFibGUgKgogUHlTeW10YWJsZV9CdWlsZChtb2RfdHkgbW9kLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgUHlGdXR1cmVGZWF0dXJlcyAqZnV0dXJlKQogewotCXN0cnVjdCBzeW10YWJsZSAqc3QgPSBzeW10YWJsZV9uZXcoKTsKLQlhc2RsX3NlcSAqc2VxOwotCWludCBpOworICAgIHN0cnVjdCBzeW10YWJsZSAqc3QgPSBzeW10YWJsZV9uZXcoKTsKKyAgICBhc2RsX3NlcSAqc2VxOworICAgIGludCBpOwogCi0JaWYgKHN0ID09IE5VTEwpCi0JCXJldHVybiBzdDsKLQlzdC0+c3RfZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQlzdC0+c3RfZnV0dXJlID0gZnV0dXJlOwotCWlmICghR0VUX0lERU5USUZJRVIodG9wKSB8fAotCSAgICAhc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIHRvcCwgTW9kdWxlQmxvY2ssICh2b2lkICopbW9kLCAwKSkgewotCQlQeVN5bXRhYmxlX0ZyZWUoc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKHN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBzdDsKKyAgICBzdC0+c3RfZmlsZW5hbWUgPSBmaWxlbmFtZTsKKyAgICBzdC0+c3RfZnV0dXJlID0gZnV0dXJlOworICAgIGlmICghR0VUX0lERU5USUZJRVIodG9wKSB8fAorICAgICAgICAhc3ltdGFibGVfZW50ZXJfYmxvY2soc3QsIHRvcCwgTW9kdWxlQmxvY2ssICh2b2lkICopbW9kLCAwKSkgeworICAgICAgICBQeVN5bXRhYmxlX0ZyZWUoc3QpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQlzdC0+c3RfdG9wID0gc3QtPnN0X2N1cjsKLQlzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgPSBPUFRfVE9QTEVWRUw7Ci0JLyogQW55IG90aGVyIHRvcC1sZXZlbCBpbml0aWFsaXphdGlvbj8gKi8KLQlzd2l0Y2ggKG1vZC0+a2luZCkgewotCWNhc2UgTW9kdWxlX2tpbmQ6Ci0JCXNlcSA9IG1vZC0+di5Nb2R1bGUuYm9keTsKLQkJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspCi0JCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X3N0bXQoc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSkpKQotCQkJCWdvdG8gZXJyb3I7Ci0JCWJyZWFrOwotCWNhc2UgRXhwcmVzc2lvbl9raW5kOgotCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X2V4cHIoc3QsIG1vZC0+di5FeHByZXNzaW9uLmJvZHkpKQotCQkJZ290byBlcnJvcjsKLQkJYnJlYWs7Ci0JY2FzZSBJbnRlcmFjdGl2ZV9raW5kOgotCQlzZXEgPSBtb2QtPnYuSW50ZXJhY3RpdmUuYm9keTsKLQkJZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspCi0JCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X3N0bXQoc3QsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSkpKQotCQkJCWdvdG8gZXJyb3I7Ci0JCWJyZWFrOwotCWNhc2UgU3VpdGVfa2luZDoKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLQkJCQkidGhpcyBjb21waWxlciBkb2VzIG5vdCBoYW5kbGUgU3VpdGVzIik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWlmICghc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKiltb2QpKSB7Ci0JCVB5U3ltdGFibGVfRnJlZShzdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoc3ltdGFibGVfYW5hbHl6ZShzdCkpCi0JCXJldHVybiBzdDsKLQlQeVN5bXRhYmxlX0ZyZWUoc3QpOwotCXJldHVybiBOVUxMOworICAgIHN0LT5zdF90b3AgPSBzdC0+c3RfY3VyOworICAgIHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCA9IE9QVF9UT1BMRVZFTDsKKyAgICAvKiBBbnkgb3RoZXIgdG9wLWxldmVsIGluaXRpYWxpemF0aW9uPyAqLworICAgIHN3aXRjaCAobW9kLT5raW5kKSB7CisgICAgY2FzZSBNb2R1bGVfa2luZDoKKyAgICAgICAgc2VxID0gbW9kLT52Lk1vZHVsZS5ib2R5OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykKKyAgICAgICAgICAgIGlmICghc3ltdGFibGVfdmlzaXRfc3RtdChzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzdG10X3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEV4cHJlc3Npb25fa2luZDoKKyAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF9leHByKHN0LCBtb2QtPnYuRXhwcmVzc2lvbi5ib2R5KSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSW50ZXJhY3RpdmVfa2luZDoKKyAgICAgICAgc2VxID0gbW9kLT52LkludGVyYWN0aXZlLmJvZHk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKQorICAgICAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF9zdG10KHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSkpKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3VpdGVfa2luZDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGNvbXBpbGVyIGRvZXMgbm90IGhhbmRsZSBTdWl0ZXMiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgaWYgKCFzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKW1vZCkpIHsKKyAgICAgICAgUHlTeW10YWJsZV9GcmVlKHN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChzeW10YWJsZV9hbmFseXplKHN0KSkKKyAgICAgICAgcmV0dXJuIHN0OworICAgIFB5U3ltdGFibGVfRnJlZShzdCk7CisgICAgcmV0dXJuIE5VTEw7CiAgZXJyb3I6Ci0JKHZvaWQpIHN5bXRhYmxlX2V4aXRfYmxvY2soc3QsICh2b2lkICopbW9kKTsKLQlQeVN5bXRhYmxlX0ZyZWUoc3QpOwotCXJldHVybiBOVUxMOworICAgICh2b2lkKSBzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKW1vZCk7CisgICAgUHlTeW10YWJsZV9GcmVlKHN0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogdm9pZAogUHlTeW10YWJsZV9GcmVlKHN0cnVjdCBzeW10YWJsZSAqc3QpCiB7Ci0JUHlfWERFQ1JFRihzdC0+c3Rfc3ltYm9scyk7Ci0JUHlfWERFQ1JFRihzdC0+c3Rfc3RhY2spOwotCVB5TWVtX0ZyZWUoKHZvaWQgKilzdCk7CisgICAgUHlfWERFQ1JFRihzdC0+c3Rfc3ltYm9scyk7CisgICAgUHlfWERFQ1JFRihzdC0+c3Rfc3RhY2spOworICAgIFB5TWVtX0ZyZWUoKHZvaWQgKilzdCk7CiB9CiAKIFB5U1RFbnRyeU9iamVjdCAqCiBQeVN5bXRhYmxlX0xvb2t1cChzdHJ1Y3Qgc3ltdGFibGUgKnN0LCB2b2lkICprZXkpCiB7Ci0JUHlPYmplY3QgKmssICp2OworICAgIFB5T2JqZWN0ICprLCAqdjsKIAotCWsgPSBQeUxvbmdfRnJvbVZvaWRQdHIoa2V5KTsKLQlpZiAoayA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gUHlEaWN0X0dldEl0ZW0oc3QtPnN0X3N5bWJvbHMsIGspOwotCWlmICh2KSB7Ci0JCWFzc2VydChQeVNURW50cnlfQ2hlY2sodikpOwotCQlQeV9JTkNSRUYodik7Ci0JfQotCWVsc2UgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCi0JCQkJInVua25vd24gc3ltYm9sIHRhYmxlIGVudHJ5Iik7Ci0JfQorICAgIGsgPSBQeUxvbmdfRnJvbVZvaWRQdHIoa2V5KTsKKyAgICBpZiAoayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2ID0gUHlEaWN0X0dldEl0ZW0oc3QtPnN0X3N5bWJvbHMsIGspOworICAgIGlmICh2KSB7CisgICAgICAgIGFzc2VydChQeVNURW50cnlfQ2hlY2sodikpOworICAgICAgICBQeV9JTkNSRUYodik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBzeW1ib2wgdGFibGUgZW50cnkiKTsKKyAgICB9CiAKLQlQeV9ERUNSRUYoayk7Ci0JcmV0dXJuIChQeVNURW50cnlPYmplY3QgKil2OworICAgIFB5X0RFQ1JFRihrKTsKKyAgICByZXR1cm4gKFB5U1RFbnRyeU9iamVjdCAqKXY7CiB9CiAKLWludCAKK2ludAogUHlTVF9HZXRTY29wZShQeVNURW50cnlPYmplY3QgKnN0ZSwgUHlPYmplY3QgKm5hbWUpCiB7Ci0JUHlPYmplY3QgKnYgPSBQeURpY3RfR2V0SXRlbShzdGUtPnN0ZV9zeW1ib2xzLCBuYW1lKTsKLQlpZiAoIXYpCi0JCXJldHVybiAwOwotCWFzc2VydChQeUludF9DaGVjayh2KSk7Ci0JcmV0dXJuIChQeUludF9BU19MT05HKHYpID4+IFNDT1BFX09GRikgJiBTQ09QRV9NQVNLOworICAgIFB5T2JqZWN0ICp2ID0gUHlEaWN0X0dldEl0ZW0oc3RlLT5zdGVfc3ltYm9scywgbmFtZSk7CisgICAgaWYgKCF2KQorICAgICAgICByZXR1cm4gMDsKKyAgICBhc3NlcnQoUHlJbnRfQ2hlY2sodikpOworICAgIHJldHVybiAoUHlJbnRfQVNfTE9ORyh2KSA+PiBTQ09QRV9PRkYpICYgU0NPUEVfTUFTSzsKIH0KIAogCiAvKiBBbmFseXplIHJhdyBzeW1ib2wgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHNjb3BlIG9mIGVhY2ggbmFtZS4KIAogICAgVGhlIG5leHQgc2V2ZXJhbCBmdW5jdGlvbnMgYXJlIGhlbHBlcnMgZm9yIFB5U3ltdGFibGVfQW5hbHl6ZSgpLAotICAgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIGEgbmFtZSBpcyBsb2NhbCwgZ2xvYmFsLCBvciBmcmVlLiAgSW4gYWRkaXRpb24sIAorICAgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIGEgbmFtZSBpcyBsb2NhbCwgZ2xvYmFsLCBvciBmcmVlLiAgSW4gYWRkaXRpb24sCiAgICBpdCBkZXRlcm1pbmVzIHdoaWNoIGxvY2FsIHZhcmlhYmxlcyBhcmUgY2VsbCB2YXJpYWJsZXM7IHRoZXkgcHJvdmlkZQotICAgYmluZGluZ3MgdGhhdCBhcmUgdXNlZCBmb3IgZnJlZSB2YXJpYWJsZXMgaW4gZW5jbG9zZWQgYmxvY2tzLiAgCisgICBiaW5kaW5ncyB0aGF0IGFyZSB1c2VkIGZvciBmcmVlIHZhcmlhYmxlcyBpbiBlbmNsb3NlZCBibG9ja3MuCiAKLSAgIFRoZXJlIGFyZSBhbHNvIHR3byBraW5kcyBvZiBmcmVlIHZhcmlhYmxlcywgaW1wbGljaXQgYW5kIGV4cGxpY2l0LiAgQW4gCisgICBUaGVyZSBhcmUgYWxzbyB0d28ga2luZHMgb2YgZnJlZSB2YXJpYWJsZXMsIGltcGxpY2l0IGFuZCBleHBsaWNpdC4gIEFuCiAgICBleHBsaWNpdCBnbG9iYWwgaXMgZGVjbGFyZWQgd2l0aCB0aGUgZ2xvYmFsIHN0YXRlbWVudC4gIEFuIGltcGxpY2l0CiAgICBnbG9iYWwgaXMgYSBmcmVlIHZhcmlhYmxlIGZvciB3aGljaCB0aGUgY29tcGlsZXIgaGFzIGZvdW5kIG5vIGJpbmRpbmcKICAgIGluIGFuIGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS4gIFRoZSBpbXBsaWNpdCBnbG9iYWwgaXMgZWl0aGVyIGEgZ2xvYmFsCkBAIC0zMjgsMzUgKzMyOCwzNSBAQAogICAgaXMgdHJlYXRlZCBhcyBhIGxvY2FsLgogCiAgICBUaGUgc3ltYm9sIHRhYmxlIHJlcXVpcmVzIHR3byBwYXNzZXMgdG8gZGV0ZXJtaW5lIHRoZSBzY29wZSBvZiBlYWNoIG5hbWUuCi0gICBUaGUgZmlyc3QgcGFzcyBjb2xsZWN0cyByYXcgZmFjdHMgZnJvbSB0aGUgQVNUOiB0aGUgbmFtZSBpcyBhIHBhcmFtZXRlciAKKyAgIFRoZSBmaXJzdCBwYXNzIGNvbGxlY3RzIHJhdyBmYWN0cyBmcm9tIHRoZSBBU1Q6IHRoZSBuYW1lIGlzIGEgcGFyYW1ldGVyCiAgICBoZXJlLCB0aGUgbmFtZSBpcyB1c2VkIGJ5IG5vdCBkZWZpbmVkIGhlcmUsIGV0Yy4gIFRoZSBzZWNvbmQgcGFzcyBhbmFseXplcwogICAgdGhlc2UgZmFjdHMgZHVyaW5nIGEgcGFzcyBvdmVyIHRoZSBQeVNURW50cnlPYmplY3RzIGNyZWF0ZWQgZHVyaW5nIHBhc3MgMS4KIAogICAgV2hlbiBhIGZ1bmN0aW9uIGlzIGVudGVyZWQgZHVyaW5nIHRoZSBzZWNvbmQgcGFzcywgdGhlIHBhcmVudCBwYXNzZXMKLSAgIHRoZSBzZXQgb2YgYWxsIG5hbWUgYmluZGluZ3MgdmlzaWJsZSB0byBpdHMgY2hpbGRyZW4uICBUaGVzZSBiaW5kaW5ncyAKKyAgIHRoZSBzZXQgb2YgYWxsIG5hbWUgYmluZGluZ3MgdmlzaWJsZSB0byBpdHMgY2hpbGRyZW4uICBUaGVzZSBiaW5kaW5ncwogICAgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSB2YXJpYWJsZSBpcyBmcmVlIG9yIGFuIGltcGxpY2l0IGdsb2JhbC4KICAgIEFmdGVyIGRvaW5nIHRoZSBsb2NhbCBhbmFseXNpcywgaXQgYW5hbHl6ZXMgZWFjaCBvZiBpdHMgY2hpbGQgYmxvY2tzCi0gICB1c2luZyBhbiB1cGRhdGVkIHNldCBvZiBuYW1lIGJpbmRpbmdzLiAgCisgICB1c2luZyBhbiB1cGRhdGVkIHNldCBvZiBuYW1lIGJpbmRpbmdzLgogCi0gICBUaGUgY2hpbGRyZW4gdXBkYXRlIHRoZSBmcmVlIHZhcmlhYmxlIHNldC4gIElmIGEgbG9jYWwgdmFyaWFibGUgaXMgZnJlZSAKLSAgIGluIGEgY2hpbGQsIHRoZSB2YXJpYWJsZSBpcyBtYXJrZWQgYXMgYSBjZWxsLiAgVGhlIGN1cnJlbnQgZnVuY3Rpb24gbXVzdCAKLSAgIHByb3ZpZGUgcnVudGltZSBzdG9yYWdlIGZvciB0aGUgdmFyaWFibGUgdGhhdCBtYXkgb3V0bGl2ZSB0aGUgZnVuY3Rpb24ncyAKKyAgIFRoZSBjaGlsZHJlbiB1cGRhdGUgdGhlIGZyZWUgdmFyaWFibGUgc2V0LiAgSWYgYSBsb2NhbCB2YXJpYWJsZSBpcyBmcmVlCisgICBpbiBhIGNoaWxkLCB0aGUgdmFyaWFibGUgaXMgbWFya2VkIGFzIGEgY2VsbC4gIFRoZSBjdXJyZW50IGZ1bmN0aW9uIG11c3QKKyAgIHByb3ZpZGUgcnVudGltZSBzdG9yYWdlIGZvciB0aGUgdmFyaWFibGUgdGhhdCBtYXkgb3V0bGl2ZSB0aGUgZnVuY3Rpb24ncwogICAgZnJhbWUuICBDZWxsIHZhcmlhYmxlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBmcmVlIHNldCBiZWZvcmUgdGhlIGFuYWx5emUKICAgIGZ1bmN0aW9uIHJldHVybnMgdG8gaXRzIHBhcmVudC4KLSAgIAorCiAgICBUaGUgc2V0cyBvZiBib3VuZCBhbmQgZnJlZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGFzIGRpY3Rpb25hcmllcwogICAgbWFwcGluZyBzdHJpbmdzIHRvIE5vbmUuCiAqLwogCiAjZGVmaW5lIFNFVF9TQ09QRShESUNULCBOQU1FLCBJKSB7IFwKLQlQeU9iamVjdCAqbyA9IFB5SW50X0Zyb21Mb25nKEkpOyBcCi0JaWYgKCFvKSBcCi0JCXJldHVybiAwOyBcCi0JaWYgKFB5RGljdF9TZXRJdGVtKChESUNUKSwgKE5BTUUpLCBvKSA8IDApIHsgXAotCQlQeV9ERUNSRUYobyk7IFwKLQkJcmV0dXJuIDA7IFwKLQl9IFwKLQlQeV9ERUNSRUYobyk7IFwKKyAgICBQeU9iamVjdCAqbyA9IFB5SW50X0Zyb21Mb25nKEkpOyBcCisgICAgaWYgKCFvKSBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgaWYgKFB5RGljdF9TZXRJdGVtKChESUNUKSwgKE5BTUUpLCBvKSA8IDApIHsgXAorICAgICAgICBQeV9ERUNSRUYobyk7IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKKyAgICBQeV9ERUNSRUYobyk7IFwKIH0KIAogLyogRGVjaWRlIG9uIHNjb3BlIG9mIG5hbWUsIGdpdmVuIGZsYWdzLgpAQCAtMzY2LDY5ICszNjYsNjkgQEAKICAgIGdsb2JhbC4gIEEgbmFtZSB0aGF0IHdhcyBnbG9iYWwgY2FuIGJlIGNoYW5nZWQgdG8gbG9jYWwuCiAqLwogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogYW5hbHl6ZV9uYW1lKFB5U1RFbnRyeU9iamVjdCAqc3RlLCBQeU9iamVjdCAqZGljdCwgUHlPYmplY3QgKm5hbWUsIGxvbmcgZmxhZ3MsCi0JICAgICBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpsb2NhbCwgUHlPYmplY3QgKmZyZWUsIAotCSAgICAgUHlPYmplY3QgKmdsb2JhbCkKKyAgICAgICAgICAgICBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpsb2NhbCwgUHlPYmplY3QgKmZyZWUsCisgICAgICAgICAgICAgUHlPYmplY3QgKmdsb2JhbCkKIHsKLQlpZiAoZmxhZ3MgJiBERUZfR0xPQkFMKSB7Ci0JCWlmIChmbGFncyAmIERFRl9QQVJBTSkgewotCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5bnRheEVycm9yLAotCQkJCSAgICAgIm5hbWUgJyVzJyBpcyBsb2NhbCBhbmQgZ2xvYmFsIiwKLQkJCQkgICAgIFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSk7Ci0JCQlQeUVycl9TeW50YXhMb2NhdGlvbihzdGUtPnN0ZV90YWJsZS0+c3RfZmlsZW5hbWUsCi0JCQkJCSAgICAgc3RlLT5zdGVfbGluZW5vKTsKLQkJCQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJU0VUX1NDT1BFKGRpY3QsIG5hbWUsIEdMT0JBTF9FWFBMSUNJVCk7Ci0JCWlmIChQeURpY3RfU2V0SXRlbShnbG9iYWwsIG5hbWUsIFB5X05vbmUpIDwgMCkKLQkJCXJldHVybiAwOwotCQlpZiAoYm91bmQgJiYgUHlEaWN0X0dldEl0ZW0oYm91bmQsIG5hbWUpKSB7Ci0JCQlpZiAoUHlEaWN0X0RlbEl0ZW0oYm91bmQsIG5hbWUpIDwgMCkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKGZsYWdzICYgREVGX0JPVU5EKSB7Ci0JCVNFVF9TQ09QRShkaWN0LCBuYW1lLCBMT0NBTCk7Ci0JCWlmIChQeURpY3RfU2V0SXRlbShsb2NhbCwgbmFtZSwgUHlfTm9uZSkgPCAwKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChQeURpY3RfR2V0SXRlbShnbG9iYWwsIG5hbWUpKSB7Ci0JCQlpZiAoUHlEaWN0X0RlbEl0ZW0oZ2xvYmFsLCBuYW1lKSA8IDApCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCS8qIElmIGFuIGVuY2xvc2luZyBibG9jayBoYXMgYSBiaW5kaW5nIGZvciB0aGlzIG5hbWUsIGl0Ci0JICAgaXMgYSBmcmVlIHZhcmlhYmxlIHJhdGhlciB0aGFuIGEgZ2xvYmFsIHZhcmlhYmxlLgotCSAgIE5vdGUgdGhhdCBoYXZpbmcgYSBub24tTlVMTCBib3VuZCBpbXBsaWVzIHRoYXQgdGhlIGJsb2NrCi0JICAgaXMgbmVzdGVkLgotCSovCi0JaWYgKGJvdW5kICYmIFB5RGljdF9HZXRJdGVtKGJvdW5kLCBuYW1lKSkgewotCQlTRVRfU0NPUEUoZGljdCwgbmFtZSwgRlJFRSk7Ci0JCXN0ZS0+c3RlX2ZyZWUgPSAxOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0oZnJlZSwgbmFtZSwgUHlfTm9uZSkgPCAwKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAxOwotCX0KLQkvKiBJZiBhIHBhcmVudCBoYXMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGVuIGNhbGwgaXQgZ2xvYmFsCi0JICAgZXhwbGljaXQ/ICBJdCBjb3VsZCBhbHNvIGJlIGdsb2JhbCBpbXBsaWNpdC4KLQkgKi8KLQllbHNlIGlmIChnbG9iYWwgJiYgUHlEaWN0X0dldEl0ZW0oZ2xvYmFsLCBuYW1lKSkgewotCQlTRVRfU0NPUEUoZGljdCwgbmFtZSwgR0xPQkFMX0lNUExJQ0lUKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWVsc2UgewotCQlpZiAoc3RlLT5zdGVfbmVzdGVkKQotCQkJc3RlLT5zdGVfZnJlZSA9IDE7Ci0JCVNFVF9TQ09QRShkaWN0LCBuYW1lLCBHTE9CQUxfSU1QTElDSVQpOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLwotCVB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgImZhaWxlZCB0byBzZXQgc2NvcGUgZm9yICVzIiwKLQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwotCXJldHVybiAwOworICAgIGlmIChmbGFncyAmIERFRl9HTE9CQUwpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgREVGX1BBUkFNKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUgJyVzJyBpcyBsb2NhbCBhbmQgZ2xvYmFsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3RlLT5zdGVfdGFibGUtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlLT5zdGVfbGluZW5vKTsKKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgU0VUX1NDT1BFKGRpY3QsIG5hbWUsIEdMT0JBTF9FWFBMSUNJVCk7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShnbG9iYWwsIG5hbWUsIFB5X05vbmUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoYm91bmQgJiYgUHlEaWN0X0dldEl0ZW0oYm91bmQsIG5hbWUpKSB7CisgICAgICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oYm91bmQsIG5hbWUpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgREVGX0JPVU5EKSB7CisgICAgICAgIFNFVF9TQ09QRShkaWN0LCBuYW1lLCBMT0NBTCk7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShsb2NhbCwgbmFtZSwgUHlfTm9uZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChQeURpY3RfR2V0SXRlbShnbG9iYWwsIG5hbWUpKSB7CisgICAgICAgICAgICBpZiAoUHlEaWN0X0RlbEl0ZW0oZ2xvYmFsLCBuYW1lKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIC8qIElmIGFuIGVuY2xvc2luZyBibG9jayBoYXMgYSBiaW5kaW5nIGZvciB0aGlzIG5hbWUsIGl0CisgICAgICAgaXMgYSBmcmVlIHZhcmlhYmxlIHJhdGhlciB0aGFuIGEgZ2xvYmFsIHZhcmlhYmxlLgorICAgICAgIE5vdGUgdGhhdCBoYXZpbmcgYSBub24tTlVMTCBib3VuZCBpbXBsaWVzIHRoYXQgdGhlIGJsb2NrCisgICAgICAgaXMgbmVzdGVkLgorICAgICovCisgICAgaWYgKGJvdW5kICYmIFB5RGljdF9HZXRJdGVtKGJvdW5kLCBuYW1lKSkgeworICAgICAgICBTRVRfU0NPUEUoZGljdCwgbmFtZSwgRlJFRSk7CisgICAgICAgIHN0ZS0+c3RlX2ZyZWUgPSAxOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oZnJlZSwgbmFtZSwgUHlfTm9uZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvKiBJZiBhIHBhcmVudCBoYXMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGVuIGNhbGwgaXQgZ2xvYmFsCisgICAgICAgZXhwbGljaXQ/ICBJdCBjb3VsZCBhbHNvIGJlIGdsb2JhbCBpbXBsaWNpdC4KKyAgICAgKi8KKyAgICBlbHNlIGlmIChnbG9iYWwgJiYgUHlEaWN0X0dldEl0ZW0oZ2xvYmFsLCBuYW1lKSkgeworICAgICAgICBTRVRfU0NPUEUoZGljdCwgbmFtZSwgR0xPQkFMX0lNUExJQ0lUKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoc3RlLT5zdGVfbmVzdGVkKQorICAgICAgICAgICAgc3RlLT5zdGVfZnJlZSA9IDE7CisgICAgICAgIFNFVF9TQ09QRShkaWN0LCBuYW1lLCBHTE9CQUxfSU1QTElDSVQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgImZhaWxlZCB0byBzZXQgc2NvcGUgZm9yICVzIiwKKyAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG5hbWUpKTsKKyAgICByZXR1cm4gMDsKIH0KIAogI3VuZGVmIFNFVF9TQ09QRQpAQCAtNDQ0LDE1MiArNDQ0LDE1MiBAQAogc3RhdGljIGludAogYW5hbHl6ZV9jZWxscyhQeU9iamVjdCAqc2NvcGUsIFB5T2JqZWN0ICpmcmVlKQogewotICAgICAgICBQeU9iamVjdCAqbmFtZSwgKnYsICp3OwotCWludCBzdWNjZXNzID0gMDsKLQlQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgUHlPYmplY3QgKm5hbWUsICp2LCAqdzsKKyAgICBpbnQgc3VjY2VzcyA9IDA7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCi0JdyA9IFB5SW50X0Zyb21Mb25nKENFTEwpOwotCWlmICghdykKLQkJcmV0dXJuIDA7Ci0Jd2hpbGUgKFB5RGljdF9OZXh0KHNjb3BlLCAmcG9zLCAmbmFtZSwgJnYpKSB7Ci0JCWxvbmcgZmxhZ3M7Ci0JCWFzc2VydChQeUludF9DaGVjayh2KSk7Ci0JCWZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJaWYgKGZsYWdzICE9IExPQ0FMKQotCQkJY29udGludWU7Ci0JCWlmICghUHlEaWN0X0dldEl0ZW0oZnJlZSwgbmFtZSkpCi0JCQljb250aW51ZTsKLQkJLyogUmVwbGFjZSBMT0NBTCB3aXRoIENFTEwgZm9yIHRoaXMgbmFtZSwgYW5kIHJlbW92ZQotCQkgICBmcm9tIGZyZWUuIEl0IGlzIHNhZmUgdG8gcmVwbGFjZSB0aGUgdmFsdWUgb2YgbmFtZSAKLQkJICAgaW4gdGhlIGRpY3QsIGJlY2F1c2UgaXQgd2lsbCBub3QgY2F1c2UgYSByZXNpemUuCi0JCSAqLwotCQlpZiAoUHlEaWN0X1NldEl0ZW0oc2NvcGUsIG5hbWUsIHcpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWlmICghUHlEaWN0X0RlbEl0ZW0oZnJlZSwgbmFtZSkgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9Ci0Jc3VjY2VzcyA9IDE7CisgICAgdyA9IFB5SW50X0Zyb21Mb25nKENFTEwpOworICAgIGlmICghdykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgd2hpbGUgKFB5RGljdF9OZXh0KHNjb3BlLCAmcG9zLCAmbmFtZSwgJnYpKSB7CisgICAgICAgIGxvbmcgZmxhZ3M7CisgICAgICAgIGFzc2VydChQeUludF9DaGVjayh2KSk7CisgICAgICAgIGZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgaWYgKGZsYWdzICE9IExPQ0FMKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICghUHlEaWN0X0dldEl0ZW0oZnJlZSwgbmFtZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLyogUmVwbGFjZSBMT0NBTCB3aXRoIENFTEwgZm9yIHRoaXMgbmFtZSwgYW5kIHJlbW92ZQorICAgICAgICAgICBmcm9tIGZyZWUuIEl0IGlzIHNhZmUgdG8gcmVwbGFjZSB0aGUgdmFsdWUgb2YgbmFtZQorICAgICAgICAgICBpbiB0aGUgZGljdCwgYmVjYXVzZSBpdCB3aWxsIG5vdCBjYXVzZSBhIHJlc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzY29wZSwgbmFtZSwgdykgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKCFQeURpY3RfRGVsSXRlbShmcmVlLCBuYW1lKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzdWNjZXNzID0gMTsKICBlcnJvcjoKLQlQeV9ERUNSRUYodyk7Ci0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgUHlfREVDUkVGKHcpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiAvKiBDaGVjayBmb3IgaWxsZWdhbCBzdGF0ZW1lbnRzIGluIHVub3B0aW1pemVkIG5hbWVzcGFjZXMgKi8KIHN0YXRpYyBpbnQKIGNoZWNrX3Vub3B0aW1pemVkKGNvbnN0IFB5U1RFbnRyeU9iamVjdCogc3RlKSB7Ci0JY2hhciBidWZbMzAwXTsKLQljb25zdCBjaGFyKiB0cmFpbGVyOworICAgIGNoYXIgYnVmWzMwMF07CisgICAgY29uc3QgY2hhciogdHJhaWxlcjsKIAotCWlmIChzdGUtPnN0ZV90eXBlICE9IEZ1bmN0aW9uQmxvY2sgfHwgIXN0ZS0+c3RlX3Vub3B0aW1pemVkCi0JICAgIHx8ICEoc3RlLT5zdGVfZnJlZSB8fCBzdGUtPnN0ZV9jaGlsZF9mcmVlKSkKLQkJcmV0dXJuIDE7CisgICAgaWYgKHN0ZS0+c3RlX3R5cGUgIT0gRnVuY3Rpb25CbG9jayB8fCAhc3RlLT5zdGVfdW5vcHRpbWl6ZWQKKyAgICAgICAgfHwgIShzdGUtPnN0ZV9mcmVlIHx8IHN0ZS0+c3RlX2NoaWxkX2ZyZWUpKQorICAgICAgICByZXR1cm4gMTsKIAotCXRyYWlsZXIgPSAoc3RlLT5zdGVfY2hpbGRfZnJlZSA/IAotCQkgICAgICAgImNvbnRhaW5zIGEgbmVzdGVkIGZ1bmN0aW9uIHdpdGggZnJlZSB2YXJpYWJsZXMiIDoKLQkJCSAgICAgICAiaXMgYSBuZXN0ZWQgZnVuY3Rpb24iKTsKKyAgICB0cmFpbGVyID0gKHN0ZS0+c3RlX2NoaWxkX2ZyZWUgPworICAgICAgICAgICAgICAgICAgICJjb250YWlucyBhIG5lc3RlZCBmdW5jdGlvbiB3aXRoIGZyZWUgdmFyaWFibGVzIiA6CisgICAgICAgICAgICAgICAgICAgImlzIGEgbmVzdGVkIGZ1bmN0aW9uIik7CiAKLQlzd2l0Y2ggKHN0ZS0+c3RlX3Vub3B0aW1pemVkKSB7Ci0JY2FzZSBPUFRfVE9QTEVWRUw6IC8qIGV4ZWMgLyBpbXBvcnQgKiBhdCB0b3AtbGV2ZWwgaXMgZmluZSAqLwotCWNhc2UgT1BUX0VYRUM6IC8qIHF1YWxpZmllZCBleGVjIGlzIGZpbmUgKi8KLQkJcmV0dXJuIDE7Ci0JY2FzZSBPUFRfSU1QT1JUX1NUQVI6Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgCi0JCQkgICAgICAiaW1wb3J0ICogaXMgbm90IGFsbG93ZWQgaW4gZnVuY3Rpb24gJyUuMTAwcycgIgotCQkJICAgICAgImJlY2F1c2UgaXQgaXMgJXMiLAotCQkJICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ZS0+c3RlX25hbWUpLCB0cmFpbGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBPUFRfQkFSRV9FWEVDOgotCQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgICAidW5xdWFsaWZpZWQgZXhlYyBpcyBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiAiCi0JCQkgICAgICAiJyUuMTAwcycgaXQgJXMiLAotCQkJICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKHN0ZS0+c3RlX25hbWUpLCB0cmFpbGVyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAKLQkJCSAgICAgICJmdW5jdGlvbiAnJS4xMDBzJyB1c2VzIGltcG9ydCAqIGFuZCBiYXJlIGV4ZWMsICIKLQkJCSAgICAgICJ3aGljaCBhcmUgaWxsZWdhbCBiZWNhdXNlIGl0ICVzIiwKLQkJCSAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhzdGUtPnN0ZV9uYW1lKSwgdHJhaWxlcik7Ci0JCWJyZWFrOwotCX0KKyAgICBzd2l0Y2ggKHN0ZS0+c3RlX3Vub3B0aW1pemVkKSB7CisgICAgY2FzZSBPUFRfVE9QTEVWRUw6IC8qIGV4ZWMgLyBpbXBvcnQgKiBhdCB0b3AtbGV2ZWwgaXMgZmluZSAqLworICAgIGNhc2UgT1BUX0VYRUM6IC8qIHF1YWxpZmllZCBleGVjIGlzIGZpbmUgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSBPUFRfSU1QT1JUX1NUQVI6CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0ICogaXMgbm90IGFsbG93ZWQgaW4gZnVuY3Rpb24gJyUuMTAwcycgIgorICAgICAgICAgICAgICAgICAgICAgICJiZWNhdXNlIGl0IGlzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RlLT5zdGVfbmFtZSksIHRyYWlsZXIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9QVF9CQVJFX0VYRUM6CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAidW5xdWFsaWZpZWQgZXhlYyBpcyBub3QgYWxsb3dlZCBpbiBmdW5jdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIGl0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RlLT5zdGVfbmFtZSksIHRyYWlsZXIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uICclLjEwMHMnIHVzZXMgaW1wb3J0ICogYW5kIGJhcmUgZXhlYywgIgorICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBhcmUgaWxsZWdhbCBiZWNhdXNlIGl0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc3RlLT5zdGVfbmFtZSksIHRyYWlsZXIpOworICAgICAgICBicmVhazsKKyAgICB9CiAKLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsIGJ1Zik7Ci0JUHlFcnJfU3ludGF4TG9jYXRpb24oc3RlLT5zdGVfdGFibGUtPnN0X2ZpbGVuYW1lLCAKLQkJCSAgICAgc3RlLT5zdGVfb3B0X2xpbmVubyk7Ci0JcmV0dXJuIDA7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLCBidWYpOworICAgIFB5RXJyX1N5bnRheExvY2F0aW9uKHN0ZS0+c3RlX3RhYmxlLT5zdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGUtPnN0ZV9vcHRfbGluZW5vKTsKKyAgICByZXR1cm4gMDsKIH0KIAotLyogRW50ZXIgdGhlIGZpbmFsIHNjb3BlIGluZm9ybWF0aW9uIGludG8gdGhlIHN0X3N5bWJvbHMgZGljdC4gCi0gKiAKKy8qIEVudGVyIHRoZSBmaW5hbCBzY29wZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBzdF9zeW1ib2xzIGRpY3QuCisgKgogICogQWxsIGFyZ3VtZW50cyBhcmUgZGljdHMuICBNb2RpZmllcyBzeW1ib2xzLCBvdGhlcnMgYXJlIHJlYWQtb25seS4KICovCiBzdGF0aWMgaW50Ci11cGRhdGVfc3ltYm9scyhQeU9iamVjdCAqc3ltYm9scywgUHlPYmplY3QgKnNjb3BlLCAKK3VwZGF0ZV9zeW1ib2xzKFB5T2JqZWN0ICpzeW1ib2xzLCBQeU9iamVjdCAqc2NvcGUsCiAgICAgICAgICAgICAgICBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpmcmVlLCBpbnQgY2xhc3NmbGFnKQogewotCVB5T2JqZWN0ICpuYW1lLCAqdiwgKnUsICp3LCAqZnJlZV92YWx1ZSA9IE5VTEw7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5T2JqZWN0ICpuYW1lLCAqdiwgKnUsICp3LCAqZnJlZV92YWx1ZSA9IE5VTEw7CisgICAgUHlfc3NpemVfdCBwb3MgPSAwOwogCi0Jd2hpbGUgKFB5RGljdF9OZXh0KHN5bWJvbHMsICZwb3MsICZuYW1lLCAmdikpIHsKLQkJbG9uZyBpLCBmbGFnczsKLQkJYXNzZXJ0KFB5SW50X0NoZWNrKHYpKTsKLQkJZmxhZ3MgPSBQeUludF9BU19MT05HKHYpOwotCQl3ID0gUHlEaWN0X0dldEl0ZW0oc2NvcGUsIG5hbWUpOwotCQlhc3NlcnQodyAmJiBQeUludF9DaGVjayh3KSk7Ci0JCWkgPSBQeUludF9BU19MT05HKHcpOwotCQlmbGFncyB8PSAoaSA8PCBTQ09QRV9PRkYpOwotCQl1ID0gUHlJbnRfRnJvbUxvbmcoZmxhZ3MpOwotCQlpZiAoIXUpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKFB5RGljdF9TZXRJdGVtKHN5bWJvbHMsIG5hbWUsIHUpIDwgMCkgewotCQkJUHlfREVDUkVGKHUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJUHlfREVDUkVGKHUpOwotCX0KLQotICAgICAgICBmcmVlX3ZhbHVlID0gUHlJbnRfRnJvbUxvbmcoRlJFRSA8PCBTQ09QRV9PRkYpOwotICAgICAgICBpZiAoIWZyZWVfdmFsdWUpCi0JCXJldHVybiAwOwotCi0gICAgICAgIC8qIGFkZCBhIGZyZWUgdmFyaWFibGUgd2hlbiBpdCdzIG9ubHkgdXNlIGlzIGZvciBjcmVhdGluZyBhIGNsb3N1cmUgKi8KLSAgICAgICAgcG9zID0gMDsKLQl3aGlsZSAoUHlEaWN0X05leHQoZnJlZSwgJnBvcywgJm5hbWUsICZ2KSkgewotCQlQeU9iamVjdCAqbyA9IFB5RGljdF9HZXRJdGVtKHN5bWJvbHMsIG5hbWUpOwotCi0JCWlmIChvKSB7Ci0JCQkvKiBJdCBjb3VsZCBiZSBhIGZyZWUgdmFyaWFibGUgaW4gYSBtZXRob2Qgb2YKLQkJCSAgIHRoZSBjbGFzcyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgbG9jYWwKLQkJCSAgIG9yIGdsb2JhbCBpbiB0aGUgY2xhc3Mgc2NvcGUuCi0JCQkqLwotCQkJaWYgIChjbGFzc2ZsYWcgJiYgCi0JCQkgICAgIFB5SW50X0FTX0xPTkcobykgJiAoREVGX0JPVU5EIHwgREVGX0dMT0JBTCkpIHsKLQkJCQlsb25nIGkgPSBQeUludF9BU19MT05HKG8pIHwgREVGX0ZSRUVfQ0xBU1M7Ci0JCQkJbyA9IFB5SW50X0Zyb21Mb25nKGkpOwotCQkJCWlmICghbykgewotCQkJCQlQeV9ERUNSRUYoZnJlZV92YWx1ZSk7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQlpZiAoUHlEaWN0X1NldEl0ZW0oc3ltYm9scywgbmFtZSwgbykgPCAwKSB7Ci0JCQkJCVB5X0RFQ1JFRihvKTsKLQkJCQkJUHlfREVDUkVGKGZyZWVfdmFsdWUpOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKG8pOwotCQkJfQotCQkJLyogZWxzZSBpdCdzIG5vdCBmcmVlLCBwcm9iYWJseSBhIGNlbGwgKi8KLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICghUHlEaWN0X0dldEl0ZW0oYm91bmQsIG5hbWUpKQotCQkJY29udGludWU7ICAgICAgIC8qIGl0J3MgYSBnbG9iYWwgKi8KLQotCQlpZiAoUHlEaWN0X1NldEl0ZW0oc3ltYm9scywgbmFtZSwgZnJlZV92YWx1ZSkgPCAwKSB7Ci0JCQlQeV9ERUNSRUYoZnJlZV92YWx1ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQorICAgIHdoaWxlIChQeURpY3RfTmV4dChzeW1ib2xzLCAmcG9zLCAmbmFtZSwgJnYpKSB7CisgICAgICAgIGxvbmcgaSwgZmxhZ3M7CisgICAgICAgIGFzc2VydChQeUludF9DaGVjayh2KSk7CisgICAgICAgIGZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgdyA9IFB5RGljdF9HZXRJdGVtKHNjb3BlLCBuYW1lKTsKKyAgICAgICAgYXNzZXJ0KHcgJiYgUHlJbnRfQ2hlY2sodykpOworICAgICAgICBpID0gUHlJbnRfQVNfTE9ORyh3KTsKKyAgICAgICAgZmxhZ3MgfD0gKGkgPDwgU0NPUEVfT0ZGKTsKKyAgICAgICAgdSA9IFB5SW50X0Zyb21Mb25nKGZsYWdzKTsKKyAgICAgICAgaWYgKCF1KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzeW1ib2xzLCBuYW1lLCB1KSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihmcmVlX3ZhbHVlKTsKLQlyZXR1cm4gMTsKLX0gICAKKyAgICAgICAgUHlfREVDUkVGKHUpOworICAgIH0KKworICAgIGZyZWVfdmFsdWUgPSBQeUludF9Gcm9tTG9uZyhGUkVFIDw8IFNDT1BFX09GRik7CisgICAgaWYgKCFmcmVlX3ZhbHVlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIGFkZCBhIGZyZWUgdmFyaWFibGUgd2hlbiBpdCdzIG9ubHkgdXNlIGlzIGZvciBjcmVhdGluZyBhIGNsb3N1cmUgKi8KKyAgICBwb3MgPSAwOworICAgIHdoaWxlIChQeURpY3RfTmV4dChmcmVlLCAmcG9zLCAmbmFtZSwgJnYpKSB7CisgICAgICAgIFB5T2JqZWN0ICpvID0gUHlEaWN0X0dldEl0ZW0oc3ltYm9scywgbmFtZSk7CisKKyAgICAgICAgaWYgKG8pIHsKKyAgICAgICAgICAgIC8qIEl0IGNvdWxkIGJlIGEgZnJlZSB2YXJpYWJsZSBpbiBhIG1ldGhvZCBvZgorICAgICAgICAgICAgICAgdGhlIGNsYXNzIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBsb2NhbAorICAgICAgICAgICAgICAgb3IgZ2xvYmFsIGluIHRoZSBjbGFzcyBzY29wZS4KKyAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAgKGNsYXNzZmxhZyAmJgorICAgICAgICAgICAgICAgICBQeUludF9BU19MT05HKG8pICYgKERFRl9CT1VORCB8IERFRl9HTE9CQUwpKSB7CisgICAgICAgICAgICAgICAgbG9uZyBpID0gUHlJbnRfQVNfTE9ORyhvKSB8IERFRl9GUkVFX0NMQVNTOworICAgICAgICAgICAgICAgIG8gPSBQeUludF9Gcm9tTG9uZyhpKTsKKyAgICAgICAgICAgICAgICBpZiAoIW8pIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZyZWVfdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHN5bWJvbHMsIG5hbWUsIG8pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobyk7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmcmVlX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGVsc2UgaXQncyBub3QgZnJlZSwgcHJvYmFibHkgYSBjZWxsICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVB5RGljdF9HZXRJdGVtKGJvdW5kLCBuYW1lKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAvKiBpdCdzIGEgZ2xvYmFsICovCisKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHN5bWJvbHMsIG5hbWUsIGZyZWVfdmFsdWUpIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGZyZWVfdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKGZyZWVfdmFsdWUpOworICAgIHJldHVybiAxOworfQogCiAvKiBNYWtlIGZpbmFsIHN5bWJvbCB0YWJsZSBkZWNpc2lvbnMgZm9yIGJsb2NrIG9mIHN0ZS4KIApAQCAtNjEyLDE5OCArNjEyLDE5OCBAQAogKi8KIAogc3RhdGljIGludAotYW5hbHl6ZV9jaGlsZF9ibG9jayhQeVNURW50cnlPYmplY3QgKmVudHJ5LCBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpmcmVlLCAKLQkJICAgIFB5T2JqZWN0ICpnbG9iYWwsIFB5T2JqZWN0KiBjaGlsZF9mcmVlKTsKK2FuYWx5emVfY2hpbGRfYmxvY2soUHlTVEVudHJ5T2JqZWN0ICplbnRyeSwgUHlPYmplY3QgKmJvdW5kLCBQeU9iamVjdCAqZnJlZSwKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmdsb2JhbCwgUHlPYmplY3QqIGNoaWxkX2ZyZWUpOwogCiBzdGF0aWMgaW50Ci1hbmFseXplX2Jsb2NrKFB5U1RFbnRyeU9iamVjdCAqc3RlLCBQeU9iamVjdCAqYm91bmQsIFB5T2JqZWN0ICpmcmVlLCAKLQkgICAgICBQeU9iamVjdCAqZ2xvYmFsKQorYW5hbHl6ZV9ibG9jayhQeVNURW50cnlPYmplY3QgKnN0ZSwgUHlPYmplY3QgKmJvdW5kLCBQeU9iamVjdCAqZnJlZSwKKyAgICAgICAgICAgICAgUHlPYmplY3QgKmdsb2JhbCkKIHsKLQlQeU9iamVjdCAqbmFtZSwgKnYsICpsb2NhbCA9IE5VTEwsICpzY29wZSA9IE5VTEw7Ci0JUHlPYmplY3QgKm5ld2JvdW5kID0gTlVMTCwgKm5ld2dsb2JhbCA9IE5VTEw7Ci0JUHlPYmplY3QgKm5ld2ZyZWUgPSBOVUxMLCAqYWxsZnJlZSA9IE5VTEw7Ci0JaW50IGksIHN1Y2Nlc3MgPSAwOwotCVB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCAqbmFtZSwgKnYsICpsb2NhbCA9IE5VTEwsICpzY29wZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5ld2JvdW5kID0gTlVMTCwgKm5ld2dsb2JhbCA9IE5VTEw7CisgICAgUHlPYmplY3QgKm5ld2ZyZWUgPSBOVUxMLCAqYWxsZnJlZSA9IE5VTEw7CisgICAgaW50IGksIHN1Y2Nlc3MgPSAwOworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAotCWxvY2FsID0gUHlEaWN0X05ldygpOyAgLyogY29sbGVjdCBuZXcgbmFtZXMgYm91bmQgaW4gYmxvY2sgKi8KLQlpZiAoIWxvY2FsKQotCQlnb3RvIGVycm9yOwotCXNjb3BlID0gUHlEaWN0X05ldygpOyAvKiBjb2xsZWN0IHNjb3BlcyBkZWZpbmVkIGZvciBlYWNoIG5hbWUgKi8KLQlpZiAoIXNjb3BlKQotCQlnb3RvIGVycm9yOworICAgIGxvY2FsID0gUHlEaWN0X05ldygpOyAgLyogY29sbGVjdCBuZXcgbmFtZXMgYm91bmQgaW4gYmxvY2sgKi8KKyAgICBpZiAoIWxvY2FsKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHNjb3BlID0gUHlEaWN0X05ldygpOyAvKiBjb2xsZWN0IHNjb3BlcyBkZWZpbmVkIGZvciBlYWNoIG5hbWUgKi8KKyAgICBpZiAoIXNjb3BlKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JLyogQWxsb2NhdGUgbmV3IGdsb2JhbCBhbmQgYm91bmQgdmFyaWFibGUgZGljdGlvbmFyaWVzLiAgVGhlc2UKLQkgICBkaWN0aW9uYXJpZXMgaG9sZCB0aGUgbmFtZXMgdmlzaWJsZSBpbiBuZXN0ZWQgYmxvY2tzLiAgRm9yCi0JICAgQ2xhc3NCbG9ja3MsIHRoZSBib3VuZCBhbmQgZ2xvYmFsIG5hbWVzIGFyZSBpbml0aWFsaXplZAotCSAgIGJlZm9yZSBhbmFseXppbmcgbmFtZXMsIGJlY2F1c2UgY2xhc3MgYmluZGluZ3MgYXJlbid0Ci0JICAgdmlzaWJsZSBpbiBtZXRob2RzLiAgRm9yIG90aGVyIGJsb2NrcywgdGhleSBhcmUgaW5pdGlhbGl6ZWQKLQkgICBhZnRlciBuYW1lcyBhcmUgYW5hbHl6ZWQuCi0JICovCisgICAgLyogQWxsb2NhdGUgbmV3IGdsb2JhbCBhbmQgYm91bmQgdmFyaWFibGUgZGljdGlvbmFyaWVzLiAgVGhlc2UKKyAgICAgICBkaWN0aW9uYXJpZXMgaG9sZCB0aGUgbmFtZXMgdmlzaWJsZSBpbiBuZXN0ZWQgYmxvY2tzLiAgRm9yCisgICAgICAgQ2xhc3NCbG9ja3MsIHRoZSBib3VuZCBhbmQgZ2xvYmFsIG5hbWVzIGFyZSBpbml0aWFsaXplZAorICAgICAgIGJlZm9yZSBhbmFseXppbmcgbmFtZXMsIGJlY2F1c2UgY2xhc3MgYmluZGluZ3MgYXJlbid0CisgICAgICAgdmlzaWJsZSBpbiBtZXRob2RzLiAgRm9yIG90aGVyIGJsb2NrcywgdGhleSBhcmUgaW5pdGlhbGl6ZWQKKyAgICAgICBhZnRlciBuYW1lcyBhcmUgYW5hbHl6ZWQuCisgICAgICovCiAKLQkvKiBUT0RPKGpoeWx0b24pOiBQYWNrYWdlIHRoZXNlIGRpY3RzIGluIGEgc3RydWN0IHNvIHRoYXQgd2UKLQkgICBjYW4gd3JpdGUgcmVhc29uYWJsZSBoZWxwZXIgZnVuY3Rpb25zPwotCSovCi0JbmV3Z2xvYmFsID0gUHlEaWN0X05ldygpOwotCWlmICghbmV3Z2xvYmFsKQotCQlnb3RvIGVycm9yOwotCW5ld2JvdW5kID0gUHlEaWN0X05ldygpOwotCWlmICghbmV3Ym91bmQpCi0JCWdvdG8gZXJyb3I7Ci0JbmV3ZnJlZSA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIW5ld2ZyZWUpCi0JCWdvdG8gZXJyb3I7CisgICAgLyogVE9ETyhqaHlsdG9uKTogUGFja2FnZSB0aGVzZSBkaWN0cyBpbiBhIHN0cnVjdCBzbyB0aGF0IHdlCisgICAgICAgY2FuIHdyaXRlIHJlYXNvbmFibGUgaGVscGVyIGZ1bmN0aW9ucz8KKyAgICAqLworICAgIG5ld2dsb2JhbCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIW5ld2dsb2JhbCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBuZXdib3VuZCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIW5ld2JvdW5kKQorICAgICAgICBnb3RvIGVycm9yOworICAgIG5ld2ZyZWUgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFuZXdmcmVlKQorICAgICAgICBnb3RvIGVycm9yOwogCi0JaWYgKHN0ZS0+c3RlX3R5cGUgPT0gQ2xhc3NCbG9jaykgewotCQlpZiAoUHlEaWN0X1VwZGF0ZShuZXdnbG9iYWwsIGdsb2JhbCkgPCAwKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKGJvdW5kKQotCQkJaWYgKFB5RGljdF9VcGRhdGUobmV3Ym91bmQsIGJvdW5kKSA8IDApCi0JCQkJZ290byBlcnJvcjsKLQl9CisgICAgaWYgKHN0ZS0+c3RlX3R5cGUgPT0gQ2xhc3NCbG9jaykgeworICAgICAgICBpZiAoUHlEaWN0X1VwZGF0ZShuZXdnbG9iYWwsIGdsb2JhbCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGJvdW5kKQorICAgICAgICAgICAgaWYgKFB5RGljdF9VcGRhdGUobmV3Ym91bmQsIGJvdW5kKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQl3aGlsZSAoUHlEaWN0X05leHQoc3RlLT5zdGVfc3ltYm9scywgJnBvcywgJm5hbWUsICZ2KSkgewotCQlsb25nIGZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKLQkJaWYgKCFhbmFseXplX25hbWUoc3RlLCBzY29wZSwgbmFtZSwgZmxhZ3MsCi0JCQkJICBib3VuZCwgbG9jYWwsIGZyZWUsIGdsb2JhbCkpCi0JCQlnb3RvIGVycm9yOwotCX0KKyAgICB3aGlsZSAoUHlEaWN0X05leHQoc3RlLT5zdGVfc3ltYm9scywgJnBvcywgJm5hbWUsICZ2KSkgeworICAgICAgICBsb25nIGZsYWdzID0gUHlJbnRfQVNfTE9ORyh2KTsKKyAgICAgICAgaWYgKCFhbmFseXplX25hbWUoc3RlLCBzY29wZSwgbmFtZSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kLCBsb2NhbCwgZnJlZSwgZ2xvYmFsKSkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogCi0JaWYgKHN0ZS0+c3RlX3R5cGUgIT0gQ2xhc3NCbG9jaykgewotCQlpZiAoc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrKSB7Ci0JCQlpZiAoUHlEaWN0X1VwZGF0ZShuZXdib3VuZCwgbG9jYWwpIDwgMCkKLQkJCQlnb3RvIGVycm9yOwotCQl9Ci0JCWlmIChib3VuZCkgewotCQkJaWYgKFB5RGljdF9VcGRhdGUobmV3Ym91bmQsIGJvdW5kKSA8IDApCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCQlpZiAoUHlEaWN0X1VwZGF0ZShuZXdnbG9iYWwsIGdsb2JhbCkgPCAwKQotCQkJZ290byBlcnJvcjsKLQl9CisgICAgaWYgKHN0ZS0+c3RlX3R5cGUgIT0gQ2xhc3NCbG9jaykgeworICAgICAgICBpZiAoc3RlLT5zdGVfdHlwZSA9PSBGdW5jdGlvbkJsb2NrKSB7CisgICAgICAgICAgICBpZiAoUHlEaWN0X1VwZGF0ZShuZXdib3VuZCwgbG9jYWwpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChib3VuZCkgeworICAgICAgICAgICAgaWYgKFB5RGljdF9VcGRhdGUobmV3Ym91bmQsIGJvdW5kKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlEaWN0X1VwZGF0ZShuZXdnbG9iYWwsIGdsb2JhbCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKLQkvKiBSZWN1cnNpdmVseSBjYWxsIGFuYWx5emVfYmxvY2soKSBvbiBlYWNoIGNoaWxkIGJsb2NrLgorICAgIC8qIFJlY3Vyc2l2ZWx5IGNhbGwgYW5hbHl6ZV9ibG9jaygpIG9uIGVhY2ggY2hpbGQgYmxvY2suCiAKLQkgICBuZXdib3VuZCwgbmV3Z2xvYmFsIG5vdyBjb250YWluIHRoZSBuYW1lcyB2aXNpYmxlIGluCi0JICAgbmVzdGVkIGJsb2Nrcy4gIFRoZSBmcmVlIHZhcmlhYmxlcyBpbiB0aGUgY2hpbGRyZW4gd2lsbAotCSAgIGJlIGNvbGxlY3RlZCBpbiBhbGxmcmVlLgotCSovCi0JYWxsZnJlZSA9IFB5RGljdF9OZXcoKTsKLQlpZiAoIWFsbGZyZWUpIAotCQlnb3RvIGVycm9yOwotCWZvciAoaSA9IDA7IGkgPCBQeUxpc3RfR0VUX1NJWkUoc3RlLT5zdGVfY2hpbGRyZW4pOyArK2kpIHsKLQkJUHlPYmplY3QgKmMgPSBQeUxpc3RfR0VUX0lURU0oc3RlLT5zdGVfY2hpbGRyZW4sIGkpOwotCQlQeVNURW50cnlPYmplY3QqIGVudHJ5OwotCQlhc3NlcnQoYyAmJiBQeVNURW50cnlfQ2hlY2soYykpOwotCQllbnRyeSA9IChQeVNURW50cnlPYmplY3QqKWM7Ci0JCWlmICghYW5hbHl6ZV9jaGlsZF9ibG9jayhlbnRyeSwgbmV3Ym91bmQsIG5ld2ZyZWUsIG5ld2dsb2JhbCwKLQkJCQkJIGFsbGZyZWUpKQotCQkJZ290byBlcnJvcjsKLQkJaWYgKGVudHJ5LT5zdGVfZnJlZSB8fCBlbnRyeS0+c3RlX2NoaWxkX2ZyZWUpCi0JCQlzdGUtPnN0ZV9jaGlsZF9mcmVlID0gMTsKLQl9CisgICAgICAgbmV3Ym91bmQsIG5ld2dsb2JhbCBub3cgY29udGFpbiB0aGUgbmFtZXMgdmlzaWJsZSBpbgorICAgICAgIG5lc3RlZCBibG9ja3MuICBUaGUgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIGNoaWxkcmVuIHdpbGwKKyAgICAgICBiZSBjb2xsZWN0ZWQgaW4gYWxsZnJlZS4KKyAgICAqLworICAgIGFsbGZyZWUgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCFhbGxmcmVlKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGZvciAoaSA9IDA7IGkgPCBQeUxpc3RfR0VUX1NJWkUoc3RlLT5zdGVfY2hpbGRyZW4pOyArK2kpIHsKKyAgICAgICAgUHlPYmplY3QgKmMgPSBQeUxpc3RfR0VUX0lURU0oc3RlLT5zdGVfY2hpbGRyZW4sIGkpOworICAgICAgICBQeVNURW50cnlPYmplY3QqIGVudHJ5OworICAgICAgICBhc3NlcnQoYyAmJiBQeVNURW50cnlfQ2hlY2soYykpOworICAgICAgICBlbnRyeSA9IChQeVNURW50cnlPYmplY3QqKWM7CisgICAgICAgIGlmICghYW5hbHl6ZV9jaGlsZF9ibG9jayhlbnRyeSwgbmV3Ym91bmQsIG5ld2ZyZWUsIG5ld2dsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbGZyZWUpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKGVudHJ5LT5zdGVfZnJlZSB8fCBlbnRyeS0+c3RlX2NoaWxkX2ZyZWUpCisgICAgICAgICAgICBzdGUtPnN0ZV9jaGlsZF9mcmVlID0gMTsKKyAgICB9CiAKLQlQeURpY3RfVXBkYXRlKG5ld2ZyZWUsIGFsbGZyZWUpOwotCWlmIChzdGUtPnN0ZV90eXBlID09IEZ1bmN0aW9uQmxvY2sgJiYgIWFuYWx5emVfY2VsbHMoc2NvcGUsIG5ld2ZyZWUpKQotCQlnb3RvIGVycm9yOwotCWlmICghdXBkYXRlX3N5bWJvbHMoc3RlLT5zdGVfc3ltYm9scywgc2NvcGUsIGJvdW5kLCBuZXdmcmVlLAotCQkJICAgIHN0ZS0+c3RlX3R5cGUgPT0gQ2xhc3NCbG9jaykpCi0JCWdvdG8gZXJyb3I7Ci0JaWYgKCFjaGVja191bm9wdGltaXplZChzdGUpKQotCQlnb3RvIGVycm9yOworICAgIFB5RGljdF9VcGRhdGUobmV3ZnJlZSwgYWxsZnJlZSk7CisgICAgaWYgKHN0ZS0+c3RlX3R5cGUgPT0gRnVuY3Rpb25CbG9jayAmJiAhYW5hbHl6ZV9jZWxscyhzY29wZSwgbmV3ZnJlZSkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKCF1cGRhdGVfc3ltYm9scyhzdGUtPnN0ZV9zeW1ib2xzLCBzY29wZSwgYm91bmQsIG5ld2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGUtPnN0ZV90eXBlID09IENsYXNzQmxvY2spKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGlmICghY2hlY2tfdW5vcHRpbWl6ZWQoc3RlKSkKKyAgICAgICAgZ290byBlcnJvcjsKIAotCWlmIChQeURpY3RfVXBkYXRlKGZyZWUsIG5ld2ZyZWUpIDwgMCkKLQkJZ290byBlcnJvcjsKLQlzdWNjZXNzID0gMTsKKyAgICBpZiAoUHlEaWN0X1VwZGF0ZShmcmVlLCBuZXdmcmVlKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgc3VjY2VzcyA9IDE7CiAgZXJyb3I6Ci0JUHlfWERFQ1JFRihsb2NhbCk7Ci0JUHlfWERFQ1JFRihzY29wZSk7Ci0JUHlfWERFQ1JFRihuZXdib3VuZCk7Ci0JUHlfWERFQ1JFRihuZXdnbG9iYWwpOwotCVB5X1hERUNSRUYobmV3ZnJlZSk7Ci0JUHlfWERFQ1JFRihhbGxmcmVlKTsKLQlpZiAoIXN1Y2Nlc3MpCi0JCWFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBQeV9YREVDUkVGKGxvY2FsKTsKKyAgICBQeV9YREVDUkVGKHNjb3BlKTsKKyAgICBQeV9YREVDUkVGKG5ld2JvdW5kKTsKKyAgICBQeV9YREVDUkVGKG5ld2dsb2JhbCk7CisgICAgUHlfWERFQ1JFRihuZXdmcmVlKTsKKyAgICBQeV9YREVDUkVGKGFsbGZyZWUpOworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiBzdGF0aWMgaW50Ci1hbmFseXplX2NoaWxkX2Jsb2NrKFB5U1RFbnRyeU9iamVjdCAqZW50cnksIFB5T2JqZWN0ICpib3VuZCwgUHlPYmplY3QgKmZyZWUsIAotCQkgICAgUHlPYmplY3QgKmdsb2JhbCwgUHlPYmplY3QqIGNoaWxkX2ZyZWUpCithbmFseXplX2NoaWxkX2Jsb2NrKFB5U1RFbnRyeU9iamVjdCAqZW50cnksIFB5T2JqZWN0ICpib3VuZCwgUHlPYmplY3QgKmZyZWUsCisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpnbG9iYWwsIFB5T2JqZWN0KiBjaGlsZF9mcmVlKQogewotCVB5T2JqZWN0ICp0ZW1wX2JvdW5kID0gTlVMTCwgKnRlbXBfZ2xvYmFsID0gTlVMTCwgKnRlbXBfZnJlZSA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRlbXBfYm91bmQgPSBOVUxMLCAqdGVtcF9nbG9iYWwgPSBOVUxMLCAqdGVtcF9mcmVlID0gTlVMTDsKIAotCS8qIENvcHkgdGhlIGJvdW5kIGFuZCBnbG9iYWwgZGljdGlvbmFyaWVzLgorICAgIC8qIENvcHkgdGhlIGJvdW5kIGFuZCBnbG9iYWwgZGljdGlvbmFyaWVzLgogCi0JICAgVGhlc2UgZGljdGlvbmFyeSBhcmUgdXNlZCBieSBhbGwgYmxvY2tzIGVuY2xvc2VkIGJ5IHRoZQotCSAgIGN1cnJlbnQgYmxvY2suICBUaGUgYW5hbHl6ZV9ibG9jaygpIGNhbGwgbW9kaWZpZXMgdGhlc2UKLQkgICBkaWN0aW9uYXJpZXMuCisgICAgICAgVGhlc2UgZGljdGlvbmFyeSBhcmUgdXNlZCBieSBhbGwgYmxvY2tzIGVuY2xvc2VkIGJ5IHRoZQorICAgICAgIGN1cnJlbnQgYmxvY2suICBUaGUgYW5hbHl6ZV9ibG9jaygpIGNhbGwgbW9kaWZpZXMgdGhlc2UKKyAgICAgICBkaWN0aW9uYXJpZXMuCiAKLQkqLwotCXRlbXBfYm91bmQgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCF0ZW1wX2JvdW5kKQotCQlnb3RvIGVycm9yOwotCWlmIChQeURpY3RfVXBkYXRlKHRlbXBfYm91bmQsIGJvdW5kKSA8IDApCi0JCWdvdG8gZXJyb3I7Ci0JdGVtcF9mcmVlID0gUHlEaWN0X05ldygpOwotCWlmICghdGVtcF9mcmVlKQotCQlnb3RvIGVycm9yOwotCWlmIChQeURpY3RfVXBkYXRlKHRlbXBfZnJlZSwgZnJlZSkgPCAwKQotCQlnb3RvIGVycm9yOwotCXRlbXBfZ2xvYmFsID0gUHlEaWN0X05ldygpOwotCWlmICghdGVtcF9nbG9iYWwpCi0JCWdvdG8gZXJyb3I7Ci0JaWYgKFB5RGljdF9VcGRhdGUodGVtcF9nbG9iYWwsIGdsb2JhbCkgPCAwKQotCQlnb3RvIGVycm9yOworICAgICovCisgICAgdGVtcF9ib3VuZCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIXRlbXBfYm91bmQpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKFB5RGljdF9VcGRhdGUodGVtcF9ib3VuZCwgYm91bmQpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB0ZW1wX2ZyZWUgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCF0ZW1wX2ZyZWUpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKFB5RGljdF9VcGRhdGUodGVtcF9mcmVlLCBmcmVlKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgdGVtcF9nbG9iYWwgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKCF0ZW1wX2dsb2JhbCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBpZiAoUHlEaWN0X1VwZGF0ZSh0ZW1wX2dsb2JhbCwgZ2xvYmFsKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CiAKLQlpZiAoIWFuYWx5emVfYmxvY2soZW50cnksIHRlbXBfYm91bmQsIHRlbXBfZnJlZSwgdGVtcF9nbG9iYWwpKQotCQlnb3RvIGVycm9yOwotCWlmIChQeURpY3RfVXBkYXRlKGNoaWxkX2ZyZWUsIHRlbXBfZnJlZSkgPCAwKQotCQlnb3RvIGVycm9yOwotCVB5X0RFQ1JFRih0ZW1wX2JvdW5kKTsKLQlQeV9ERUNSRUYodGVtcF9mcmVlKTsKLQlQeV9ERUNSRUYodGVtcF9nbG9iYWwpOwotCXJldHVybiAxOworICAgIGlmICghYW5hbHl6ZV9ibG9jayhlbnRyeSwgdGVtcF9ib3VuZCwgdGVtcF9mcmVlLCB0ZW1wX2dsb2JhbCkpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKFB5RGljdF9VcGRhdGUoY2hpbGRfZnJlZSwgdGVtcF9mcmVlKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfREVDUkVGKHRlbXBfYm91bmQpOworICAgIFB5X0RFQ1JFRih0ZW1wX2ZyZWUpOworICAgIFB5X0RFQ1JFRih0ZW1wX2dsb2JhbCk7CisgICAgcmV0dXJuIDE7CiAgZXJyb3I6Ci0JUHlfWERFQ1JFRih0ZW1wX2JvdW5kKTsKLQlQeV9YREVDUkVGKHRlbXBfZnJlZSk7Ci0JUHlfWERFQ1JFRih0ZW1wX2dsb2JhbCk7Ci0JcmV0dXJuIDA7CisgICAgUHlfWERFQ1JFRih0ZW1wX2JvdW5kKTsKKyAgICBQeV9YREVDUkVGKHRlbXBfZnJlZSk7CisgICAgUHlfWERFQ1JFRih0ZW1wX2dsb2JhbCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIHN5bXRhYmxlX2FuYWx5emUoc3RydWN0IHN5bXRhYmxlICpzdCkKIHsKLQlQeU9iamVjdCAqZnJlZSwgKmdsb2JhbDsKLQlpbnQgcjsKKyAgICBQeU9iamVjdCAqZnJlZSwgKmdsb2JhbDsKKyAgICBpbnQgcjsKIAotCWZyZWUgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFmcmVlKQotCSAgICByZXR1cm4gMDsKLQlnbG9iYWwgPSBQeURpY3RfTmV3KCk7Ci0JaWYgKCFnbG9iYWwpIHsKLQkgICAgUHlfREVDUkVGKGZyZWUpOwotCSAgICByZXR1cm4gMDsKLQl9Ci0JciA9IGFuYWx5emVfYmxvY2soc3QtPnN0X3RvcCwgTlVMTCwgZnJlZSwgZ2xvYmFsKTsKLQlQeV9ERUNSRUYoZnJlZSk7Ci0JUHlfREVDUkVGKGdsb2JhbCk7Ci0JcmV0dXJuIHI7CisgICAgZnJlZSA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIWZyZWUpCisgICAgICAgIHJldHVybiAwOworICAgIGdsb2JhbCA9IFB5RGljdF9OZXcoKTsKKyAgICBpZiAoIWdsb2JhbCkgeworICAgICAgICBQeV9ERUNSRUYoZnJlZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByID0gYW5hbHl6ZV9ibG9jayhzdC0+c3RfdG9wLCBOVUxMLCBmcmVlLCBnbG9iYWwpOworICAgIFB5X0RFQ1JFRihmcmVlKTsKKyAgICBQeV9ERUNSRUYoZ2xvYmFsKTsKKyAgICByZXR1cm4gcjsKIH0KIAogCiBzdGF0aWMgaW50CiBzeW10YWJsZV93YXJuKHN0cnVjdCBzeW10YWJsZSAqc3QsIGNoYXIgKm1zZywgaW50IGxpbmVubykKIHsKLQlpZiAoUHlFcnJfV2FybkV4cGxpY2l0KFB5RXhjX1N5bnRheFdhcm5pbmcsIG1zZywgc3QtPnN0X2ZpbGVuYW1lLAotCQkJICAgICAgIGxpbmVubywgTlVMTCwgTlVMTCkgPCAwKQl7Ci0JCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N5bnRheFdhcm5pbmcpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsIG1zZyk7Ci0JCQlQeUVycl9TeW50YXhMb2NhdGlvbihzdC0+c3RfZmlsZW5hbWUsIAotCQkJCQkgICAgIHN0LT5zdF9jdXItPnN0ZV9saW5lbm8pOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAoUHlFcnJfV2FybkV4cGxpY2l0KFB5RXhjX1N5bnRheFdhcm5pbmcsIG1zZywgc3QtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBOVUxMLCBOVUxMKSA8IDApICAgICB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N5bnRheFdhcm5pbmcpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsIG1zZyk7CisgICAgICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbihzdC0+c3RfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfbGluZW5vKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIHN5bXRhYmxlX2VudGVyX2Jsb2NrKCkgZ2V0cyBhIHJlZmVyZW5jZSB2aWEgc3RlX25ldy4KQEAgLTgxNCw2OTkgKzgxNCw2OTkgQEAKIHN0YXRpYyBpbnQKIHN5bXRhYmxlX2V4aXRfYmxvY2soc3RydWN0IHN5bXRhYmxlICpzdCwgdm9pZCAqYXN0KQogewotCVB5X3NzaXplX3QgZW5kOworICAgIFB5X3NzaXplX3QgZW5kOwogCi0JUHlfQ0xFQVIoc3QtPnN0X2N1cik7Ci0JZW5kID0gUHlMaXN0X0dFVF9TSVpFKHN0LT5zdF9zdGFjaykgLSAxOwotCWlmIChlbmQgPj0gMCkgewotCQlzdC0+c3RfY3VyID0gKFB5U1RFbnRyeU9iamVjdCAqKVB5TGlzdF9HRVRfSVRFTShzdC0+c3Rfc3RhY2ssIAotCQkJCQkJCQllbmQpOwotCQlpZiAoc3QtPnN0X2N1ciA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JCVB5X0lOQ1JFRihzdC0+c3RfY3VyKTsKLQkJaWYgKFB5U2VxdWVuY2VfRGVsSXRlbShzdC0+c3Rfc3RhY2ssIGVuZCkgPCAwKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOworICAgIFB5X0NMRUFSKHN0LT5zdF9jdXIpOworICAgIGVuZCA9IFB5TGlzdF9HRVRfU0laRShzdC0+c3Rfc3RhY2spIC0gMTsKKyAgICBpZiAoZW5kID49IDApIHsKKyAgICAgICAgc3QtPnN0X2N1ciA9IChQeVNURW50cnlPYmplY3QgKilQeUxpc3RfR0VUX0lURU0oc3QtPnN0X3N0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpOworICAgICAgICBpZiAoc3QtPnN0X2N1ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIFB5X0lOQ1JFRihzdC0+c3RfY3VyKTsKKyAgICAgICAgaWYgKFB5U2VxdWVuY2VfRGVsSXRlbShzdC0+c3Rfc3RhY2ssIGVuZCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50Ci1zeW10YWJsZV9lbnRlcl9ibG9jayhzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBpZGVudGlmaWVyIG5hbWUsIF9QeV9ibG9ja190eSBibG9jaywgCi0JCSAgICAgdm9pZCAqYXN0LCBpbnQgbGluZW5vKQorc3ltdGFibGVfZW50ZXJfYmxvY2soc3RydWN0IHN5bXRhYmxlICpzdCwgaWRlbnRpZmllciBuYW1lLCBfUHlfYmxvY2tfdHkgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICB2b2lkICphc3QsIGludCBsaW5lbm8pCiB7Ci0JUHlTVEVudHJ5T2JqZWN0ICpwcmV2ID0gTlVMTDsKKyAgICBQeVNURW50cnlPYmplY3QgKnByZXYgPSBOVUxMOwogCi0JaWYgKHN0LT5zdF9jdXIpIHsKLQkJcHJldiA9IHN0LT5zdF9jdXI7Ci0JCWlmIChQeUxpc3RfQXBwZW5kKHN0LT5zdF9zdGFjaywgKFB5T2JqZWN0ICopc3QtPnN0X2N1cikgPCAwKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlQeV9ERUNSRUYoc3QtPnN0X2N1cik7Ci0JfQotCXN0LT5zdF9jdXIgPSBzdGVfbmV3KHN0LCBuYW1lLCBibG9jaywgYXN0LCBsaW5lbm8pOwotCWlmIChzdC0+c3RfY3VyID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChuYW1lID09IEdFVF9JREVOVElGSUVSKHRvcCkpCi0JCXN0LT5zdF9nbG9iYWwgPSBzdC0+c3RfY3VyLT5zdGVfc3ltYm9sczsKLQlpZiAocHJldikgewotCQlpZiAoUHlMaXN0X0FwcGVuZChwcmV2LT5zdGVfY2hpbGRyZW4sIAotCQkJCSAgKFB5T2JqZWN0ICopc3QtPnN0X2N1cikgPCAwKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICBpZiAoc3QtPnN0X2N1cikgeworICAgICAgICBwcmV2ID0gc3QtPnN0X2N1cjsKKyAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoc3QtPnN0X3N0YWNrLCAoUHlPYmplY3QgKilzdC0+c3RfY3VyKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihzdC0+c3RfY3VyKTsKKyAgICB9CisgICAgc3QtPnN0X2N1ciA9IHN0ZV9uZXcoc3QsIG5hbWUsIGJsb2NrLCBhc3QsIGxpbmVubyk7CisgICAgaWYgKHN0LT5zdF9jdXIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG5hbWUgPT0gR0VUX0lERU5USUZJRVIodG9wKSkKKyAgICAgICAgc3QtPnN0X2dsb2JhbCA9IHN0LT5zdF9jdXItPnN0ZV9zeW1ib2xzOworICAgIGlmIChwcmV2KSB7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHByZXYtPnN0ZV9jaGlsZHJlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopc3QtPnN0X2N1cikgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGxvbmcKIHN5bXRhYmxlX2xvb2t1cChzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBQeU9iamVjdCAqbmFtZSkKIHsKLQlQeU9iamVjdCAqbzsKLQlQeU9iamVjdCAqbWFuZ2xlZCA9IF9QeV9NYW5nbGUoc3QtPnN0X3ByaXZhdGUsIG5hbWUpOwotCWlmICghbWFuZ2xlZCkKLQkJcmV0dXJuIDA7Ci0JbyA9IFB5RGljdF9HZXRJdGVtKHN0LT5zdF9jdXItPnN0ZV9zeW1ib2xzLCBtYW5nbGVkKTsKLQlQeV9ERUNSRUYobWFuZ2xlZCk7Ci0JaWYgKCFvKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gUHlJbnRfQXNMb25nKG8pOworICAgIFB5T2JqZWN0ICpvOworICAgIFB5T2JqZWN0ICptYW5nbGVkID0gX1B5X01hbmdsZShzdC0+c3RfcHJpdmF0ZSwgbmFtZSk7CisgICAgaWYgKCFtYW5nbGVkKQorICAgICAgICByZXR1cm4gMDsKKyAgICBvID0gUHlEaWN0X0dldEl0ZW0oc3QtPnN0X2N1ci0+c3RlX3N5bWJvbHMsIG1hbmdsZWQpOworICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKKyAgICBpZiAoIW8pCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBQeUludF9Bc0xvbmcobyk7CiB9CiAKIHN0YXRpYyBpbnQKLXN5bXRhYmxlX2FkZF9kZWYoc3RydWN0IHN5bXRhYmxlICpzdCwgUHlPYmplY3QgKm5hbWUsIGludCBmbGFnKSAKK3N5bXRhYmxlX2FkZF9kZWYoc3RydWN0IHN5bXRhYmxlICpzdCwgUHlPYmplY3QgKm5hbWUsIGludCBmbGFnKQogewotCVB5T2JqZWN0ICpvOwotCVB5T2JqZWN0ICpkaWN0OwotCWxvbmcgdmFsOwotCVB5T2JqZWN0ICptYW5nbGVkID0gX1B5X01hbmdsZShzdC0+c3RfcHJpdmF0ZSwgbmFtZSk7CisgICAgUHlPYmplY3QgKm87CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgbG9uZyB2YWw7CisgICAgUHlPYmplY3QgKm1hbmdsZWQgPSBfUHlfTWFuZ2xlKHN0LT5zdF9wcml2YXRlLCBuYW1lKTsKIAotCWlmICghbWFuZ2xlZCkKLQkJcmV0dXJuIDA7Ci0JZGljdCA9IHN0LT5zdF9jdXItPnN0ZV9zeW1ib2xzOwotCWlmICgobyA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIG1hbmdsZWQpKSkgewotCSAgICB2YWwgPSBQeUludF9BU19MT05HKG8pOwotCSAgICBpZiAoKGZsYWcgJiBERUZfUEFSQU0pICYmICh2YWwgJiBERUZfUEFSQU0pKSB7Ci0JCSAgICAvKiBJcyBpdCBiZXR0ZXIgdG8gdXNlICdtYW5nbGVkJyBvciAnbmFtZScgaGVyZT8gKi8KLQkJICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeW50YXhFcnJvciwgRFVQTElDQVRFX0FSR1VNRU5ULAotCQkJCSBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSk7Ci0JCSAgICBQeUVycl9TeW50YXhMb2NhdGlvbihzdC0+c3RfZmlsZW5hbWUsCi0JCQkJICAgICAgIHN0LT5zdF9jdXItPnN0ZV9saW5lbm8pOwotCQkgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgICB2YWwgfD0gZmxhZzsKLQl9IGVsc2UKLQkgICAgdmFsID0gZmxhZzsKLQlvID0gUHlJbnRfRnJvbUxvbmcodmFsKTsKKyAgICBpZiAoIW1hbmdsZWQpCisgICAgICAgIHJldHVybiAwOworICAgIGRpY3QgPSBzdC0+c3RfY3VyLT5zdGVfc3ltYm9sczsKKyAgICBpZiAoKG8gPSBQeURpY3RfR2V0SXRlbShkaWN0LCBtYW5nbGVkKSkpIHsKKyAgICAgICAgdmFsID0gUHlJbnRfQVNfTE9ORyhvKTsKKyAgICAgICAgaWYgKChmbGFnICYgREVGX1BBUkFNKSAmJiAodmFsICYgREVGX1BBUkFNKSkgeworICAgICAgICAgICAgLyogSXMgaXQgYmV0dGVyIHRvIHVzZSAnbWFuZ2xlZCcgb3IgJ25hbWUnIGhlcmU/ICovCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3ludGF4RXJyb3IsIERVUExJQ0FURV9BUkdVTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSk7CisgICAgICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbihzdC0+c3RfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX2xpbmVubyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHZhbCB8PSBmbGFnOworICAgIH0gZWxzZQorICAgICAgICB2YWwgPSBmbGFnOworICAgIG8gPSBQeUludF9Gcm9tTG9uZyh2YWwpOworICAgIGlmIChvID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtKGRpY3QsIG1hbmdsZWQsIG8pIDwgMCkgeworICAgICAgICBQeV9ERUNSRUYobyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIFB5X0RFQ1JFRihvKTsKKworICAgIGlmIChmbGFnICYgREVGX1BBUkFNKSB7CisgICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHN0LT5zdF9jdXItPnN0ZV92YXJuYW1lcywgbWFuZ2xlZCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9IGVsc2UgICAgICBpZiAoZmxhZyAmIERFRl9HTE9CQUwpIHsKKyAgICAgICAgLyogWFhYIG5lZWQgdG8gdXBkYXRlIERFRl9HTE9CQUwgZm9yIG90aGVyIGZsYWdzIHRvbzsKKyAgICAgICAgICAgcGVyaGFwcyBvbmx5IERFRl9GUkVFX0dMT0JBTCAqLworICAgICAgICB2YWwgPSBmbGFnOworICAgICAgICBpZiAoKG8gPSBQeURpY3RfR2V0SXRlbShzdC0+c3RfZ2xvYmFsLCBtYW5nbGVkKSkpIHsKKyAgICAgICAgICAgIHZhbCB8PSBQeUludF9BU19MT05HKG8pOworICAgICAgICB9CisgICAgICAgIG8gPSBQeUludF9Gcm9tTG9uZyh2YWwpOwogICAgICAgICBpZiAobyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yOwotCWlmIChQeURpY3RfU2V0SXRlbShkaWN0LCBtYW5nbGVkLCBvKSA8IDApIHsKLQkJUHlfREVDUkVGKG8pOwotCQlnb3RvIGVycm9yOwotCX0KLQlQeV9ERUNSRUYobyk7Ci0KLQlpZiAoZmxhZyAmIERFRl9QQVJBTSkgewotCQlpZiAoUHlMaXN0X0FwcGVuZChzdC0+c3RfY3VyLT5zdGVfdmFybmFtZXMsIG1hbmdsZWQpIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JfSBlbHNlCWlmIChmbGFnICYgREVGX0dMT0JBTCkgewotCQkvKiBYWFggbmVlZCB0byB1cGRhdGUgREVGX0dMT0JBTCBmb3Igb3RoZXIgZmxhZ3MgdG9vOwotCQkgICBwZXJoYXBzIG9ubHkgREVGX0ZSRUVfR0xPQkFMICovCi0JCXZhbCA9IGZsYWc7Ci0JCWlmICgobyA9IFB5RGljdF9HZXRJdGVtKHN0LT5zdF9nbG9iYWwsIG1hbmdsZWQpKSkgewotCQkJdmFsIHw9IFB5SW50X0FTX0xPTkcobyk7Ci0JCX0KLQkJbyA9IFB5SW50X0Zyb21Mb25nKHZhbCk7Ci0JCWlmIChvID09IE5VTEwpCi0JCQlnb3RvIGVycm9yOwotCQlpZiAoUHlEaWN0X1NldEl0ZW0oc3QtPnN0X2dsb2JhbCwgbWFuZ2xlZCwgbykgPCAwKSB7Ci0JCQlQeV9ERUNSRUYobyk7Ci0JCQlnb3RvIGVycm9yOwotCQl9Ci0JCVB5X0RFQ1JFRihvKTsKLQl9Ci0JUHlfREVDUkVGKG1hbmdsZWQpOwotCXJldHVybiAxOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHN0LT5zdF9nbG9iYWwsIG1hbmdsZWQsIG8pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKG8pOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYobyk7CisgICAgfQorICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKKyAgICByZXR1cm4gMTsKIAogZXJyb3I6Ci0JUHlfREVDUkVGKG1hbmdsZWQpOwotCXJldHVybiAwOworICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogVklTSVQsIFZJU0lUX1NFUSBhbmQgVklTVF9TRVFfVEFJTCB0YWtlIGFuIEFTREwgdHlwZSBhcyB0aGVpciBzZWNvbmQgYXJndW1lbnQuCiAgICBUaGV5IHVzZSB0aGUgQVNETCBuYW1lIHRvIHN5bnRoZXNpemUgdGhlIG5hbWUgb2YgdGhlIEMgdHlwZSBhbmQgdGhlIHZpc2l0Ci0gICBmdW5jdGlvbi4gCi0gICAKKyAgIGZ1bmN0aW9uLgorCiAgICBWSVNJVF9TRVFfVEFJTCBwZXJtaXRzIHRoZSBzdGFydCBvZiBhbiBBU0RMIHNlcXVlbmNlIHRvIGJlIHNraXBwZWQsIHdoaWNoIGlzCiAgICB1c2VmdWwgaWYgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHNlcXVlbmNlIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50LgogKi8KIAogI2RlZmluZSBWSVNJVChTVCwgVFlQRSwgVikgXAotCWlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgKFYpKSkgXAotCQlyZXR1cm4gMDsgCisgICAgaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCAoVikpKSBcCisgICAgICAgIHJldHVybiAwOwogCiAjZGVmaW5lIFZJU0lUX0lOX0JMT0NLKFNULCBUWVBFLCBWLCBTKSBcCi0JaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCAoVikpKSB7IFwKLQkJc3ltdGFibGVfZXhpdF9ibG9jaygoU1QpLCAoUykpOyBcCi0JCXJldHVybiAwOyBcCi0JfQorICAgIGlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgKFYpKSkgeyBcCisgICAgICAgIHN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0KIAogI2RlZmluZSBWSVNJVF9TRVEoU1QsIFRZUEUsIFNFUSkgeyBcCi0JaW50IGk7IFwKLQlhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7IFwKLQkJVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCi0JCWlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgZWx0KSkgXAotCQkJcmV0dXJuIDA7IFwKLQl9IFwKKyAgICBpbnQgaTsgXAorICAgIGFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCisgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAorICAgICAgICBUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKKyAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSBcCisgICAgICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAogfQogCiAjZGVmaW5lIFZJU0lUX1NFUV9JTl9CTE9DSyhTVCwgVFlQRSwgU0VRLCBTKSB7IFwKLQlpbnQgaTsgXAotCWFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCi0JZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAotCQlUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKLQkJaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSB7IFwKLQkJCXN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAotCQkJcmV0dXJuIDA7IFwKLQkJfSBcCi0JfSBcCisgICAgaW50IGk7IFwKKyAgICBhc2RsX3NlcSAqc2VxID0gKFNFUSk7IC8qIGF2b2lkIHZhcmlhYmxlIGNhcHR1cmUgKi8gXAorICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oc2VxKTsgaSsrKSB7IFwKKyAgICAgICAgVFlQRSAjIyBfdHkgZWx0ID0gKFRZUEUgIyMgX3R5KWFzZGxfc2VxX0dFVChzZXEsIGkpOyBcCisgICAgICAgIGlmICghc3ltdGFibGVfdmlzaXRfICMjIFRZUEUoKFNUKSwgZWx0KSkgeyBcCisgICAgICAgICAgICBzeW10YWJsZV9leGl0X2Jsb2NrKChTVCksIChTKSk7IFwKKyAgICAgICAgICAgIHJldHVybiAwOyBcCisgICAgICAgIH0gXAorICAgIH0gXAogfQogCiAjZGVmaW5lIFZJU0lUX1NFUV9UQUlMKFNULCBUWVBFLCBTRVEsIFNUQVJUKSB7IFwKLQlpbnQgaTsgXAotCWFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCi0JZm9yIChpID0gKFNUQVJUKTsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAotCQlUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKLQkJaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSBcCi0JCQlyZXR1cm4gMDsgXAotCX0gXAorICAgIGludCBpOyBcCisgICAgYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKKyAgICBmb3IgKGkgPSAoU1RBUlQpOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeyBcCisgICAgICAgIFRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAorICAgICAgICBpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIGVsdCkpIFwKKyAgICAgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCiB9CiAKICNkZWZpbmUgVklTSVRfU0VRX1RBSUxfSU5fQkxPQ0soU1QsIFRZUEUsIFNFUSwgU1RBUlQsIFMpIHsgXAotCWludCBpOyBcCi0JYXNkbF9zZXEgKnNlcSA9IChTRVEpOyAvKiBhdm9pZCB2YXJpYWJsZSBjYXB0dXJlICovIFwKLQlmb3IgKGkgPSAoU1RBUlQpOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeyBcCi0JCVRZUEUgIyMgX3R5IGVsdCA9IChUWVBFICMjIF90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsgXAotCQlpZiAoIXN5bXRhYmxlX3Zpc2l0XyAjIyBUWVBFKChTVCksIGVsdCkpIHsgXAotCQkJc3ltdGFibGVfZXhpdF9ibG9jaygoU1QpLCAoUykpOyBcCi0JCQlyZXR1cm4gMDsgXAotCQl9IFwKLQl9IFwKKyAgICBpbnQgaTsgXAorICAgIGFzZGxfc2VxICpzZXEgPSAoU0VRKTsgLyogYXZvaWQgdmFyaWFibGUgY2FwdHVyZSAqLyBcCisgICAgZm9yIChpID0gKFNUQVJUKTsgaSA8IGFzZGxfc2VxX0xFTihzZXEpOyBpKyspIHsgXAorICAgICAgICBUWVBFICMjIF90eSBlbHQgPSAoVFlQRSAjIyBfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7IFwKKyAgICAgICAgaWYgKCFzeW10YWJsZV92aXNpdF8gIyMgVFlQRSgoU1QpLCBlbHQpKSB7IFwKKyAgICAgICAgICAgIHN5bXRhYmxlX2V4aXRfYmxvY2soKFNUKSwgKFMpKTsgXAorICAgICAgICAgICAgcmV0dXJuIDA7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCiB9CiAKIHN0YXRpYyBpbnQKIHN5bXRhYmxlX25ld190bXBuYW1lKHN0cnVjdCBzeW10YWJsZSAqc3QpCiB7Ci0JY2hhciB0bXBuYW1lWzI1Nl07Ci0JaWRlbnRpZmllciB0bXA7CisgICAgY2hhciB0bXBuYW1lWzI1Nl07CisgICAgaWRlbnRpZmllciB0bXA7CiAKLQlQeU9TX3NucHJpbnRmKHRtcG5hbWUsIHNpemVvZih0bXBuYW1lKSwgIl9bJWRdIiwKLQkJICAgICAgKytzdC0+c3RfY3VyLT5zdGVfdG1wbmFtZSk7Ci0JdG1wID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyh0bXBuYW1lKTsKLQlpZiAoIXRtcCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCB0bXAsIERFRl9MT0NBTCkpCi0JCXJldHVybiAwOwotCVB5X0RFQ1JFRih0bXApOwotCXJldHVybiAxOworICAgIFB5T1Nfc25wcmludGYodG1wbmFtZSwgc2l6ZW9mKHRtcG5hbWUpLCAiX1slZF0iLAorICAgICAgICAgICAgICAgICAgKytzdC0+c3RfY3VyLT5zdGVfdG1wbmFtZSk7CisgICAgdG1wID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyh0bXBuYW1lKTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCB0bXAsIERFRl9MT0NBTCkpCisgICAgICAgIHJldHVybiAwOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9zdG10KHN0cnVjdCBzeW10YWJsZSAqc3QsIHN0bXRfdHkgcykKIHsKLQlzd2l0Y2ggKHMtPmtpbmQpIHsKLSAgICAgICAgY2FzZSBGdW5jdGlvbkRlZl9raW5kOgotCQlpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIHMtPnYuRnVuY3Rpb25EZWYubmFtZSwgREVGX0xPQ0FMKSkKLQkJCXJldHVybiAwOwotCQlpZiAocy0+di5GdW5jdGlvbkRlZi5hcmdzLT5kZWZhdWx0cykKLQkJCVZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5GdW5jdGlvbkRlZi5hcmdzLT5kZWZhdWx0cyk7Ci0JCWlmIChzLT52LkZ1bmN0aW9uRGVmLmRlY29yYXRvcl9saXN0KQotCQkJVklTSVRfU0VRKHN0LCBleHByLCBzLT52LkZ1bmN0aW9uRGVmLmRlY29yYXRvcl9saXN0KTsKLQkJaWYgKCFzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgcy0+di5GdW5jdGlvbkRlZi5uYW1lLCAKLQkJCQkJICBGdW5jdGlvbkJsb2NrLCAodm9pZCAqKXMsIHMtPmxpbmVubykpCi0JCQlyZXR1cm4gMDsKLQkJVklTSVRfSU5fQkxPQ0soc3QsIGFyZ3VtZW50cywgcy0+di5GdW5jdGlvbkRlZi5hcmdzLCBzKTsKLQkJVklTSVRfU0VRX0lOX0JMT0NLKHN0LCBzdG10LCBzLT52LkZ1bmN0aW9uRGVmLmJvZHksIHMpOwotCQlpZiAoIXN5bXRhYmxlX2V4aXRfYmxvY2soc3QsIHMpKQotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIENsYXNzRGVmX2tpbmQ6IHsKLQkJUHlPYmplY3QgKnRtcDsKLQkJaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBzLT52LkNsYXNzRGVmLm5hbWUsIERFRl9MT0NBTCkpCi0JCQlyZXR1cm4gMDsKLQkJVklTSVRfU0VRKHN0LCBleHByLCBzLT52LkNsYXNzRGVmLmJhc2VzKTsKLQkJaWYgKHMtPnYuQ2xhc3NEZWYuZGVjb3JhdG9yX2xpc3QpCi0JCQlWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuQ2xhc3NEZWYuZGVjb3JhdG9yX2xpc3QpOwotCQlpZiAoIXN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0LCBzLT52LkNsYXNzRGVmLm5hbWUsIENsYXNzQmxvY2ssIAotCQkJCQkgICh2b2lkICopcywgcy0+bGluZW5vKSkKLQkJCXJldHVybiAwOwotCQl0bXAgPSBzdC0+c3RfcHJpdmF0ZTsKLQkJc3QtPnN0X3ByaXZhdGUgPSBzLT52LkNsYXNzRGVmLm5hbWU7Ci0JCVZJU0lUX1NFUV9JTl9CTE9DSyhzdCwgc3RtdCwgcy0+di5DbGFzc0RlZi5ib2R5LCBzKTsKLQkJc3QtPnN0X3ByaXZhdGUgPSB0bXA7Ci0JCWlmICghc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgcykpCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0JfQotICAgICAgICBjYXNlIFJldHVybl9raW5kOgotCQlpZiAocy0+di5SZXR1cm4udmFsdWUpIHsKLQkJCVZJU0lUKHN0LCBleHByLCBzLT52LlJldHVybi52YWx1ZSk7Ci0JCQlzdC0+c3RfY3VyLT5zdGVfcmV0dXJuc192YWx1ZSA9IDE7Ci0JCQlpZiAoc3QtPnN0X2N1ci0+c3RlX2dlbmVyYXRvcikgewotCQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKLQkJCQkJUkVUVVJOX1ZBTF9JTl9HRU5FUkFUT1IpOwotCQkJICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbihzdC0+c3RfZmlsZW5hbWUsCi0JCQkJICAgICAgICAgICAgIHMtPmxpbmVubyk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgRGVsZXRlX2tpbmQ6Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5EZWxldGUudGFyZ2V0cyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEFzc2lnbl9raW5kOgotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIHMtPnYuQXNzaWduLnRhcmdldHMpOwotCQlWSVNJVChzdCwgZXhwciwgcy0+di5Bc3NpZ24udmFsdWUpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBBdWdBc3NpZ25fa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnRhcmdldCk7Ci0JCVZJU0lUKHN0LCBleHByLCBzLT52LkF1Z0Fzc2lnbi52YWx1ZSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFByaW50X2tpbmQ6Ci0JCWlmIChzLT52LlByaW50LmRlc3QpCi0JCQlWSVNJVChzdCwgZXhwciwgcy0+di5QcmludC5kZXN0KTsKLQkJVklTSVRfU0VRKHN0LCBleHByLCBzLT52LlByaW50LnZhbHVlcyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEZvcl9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgcy0+di5Gb3IudGFyZ2V0KTsKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuRm9yLml0ZXIpOwotCQlWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuRm9yLmJvZHkpOwotCQlpZiAocy0+di5Gb3Iub3JlbHNlKQotCQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LkZvci5vcmVsc2UpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBXaGlsZV9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgcy0+di5XaGlsZS50ZXN0KTsKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LldoaWxlLmJvZHkpOwotCQlpZiAocy0+di5XaGlsZS5vcmVsc2UpCi0JCQlWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuV2hpbGUub3JlbHNlKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgSWZfa2luZDoKLQkJLyogWFhYIGlmIDA6IGFuZCBsb29rdXBfeWllbGQoKSBoYWNrcyAqLwotCQlWSVNJVChzdCwgZXhwciwgcy0+di5JZi50ZXN0KTsKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LklmLmJvZHkpOwotCQlpZiAocy0+di5JZi5vcmVsc2UpCi0JCQlWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuSWYub3JlbHNlKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgUmFpc2Vfa2luZDoKLQkJaWYgKHMtPnYuUmFpc2UudHlwZSkgewotCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuUmFpc2UudHlwZSk7Ci0JCQlpZiAocy0+di5SYWlzZS5pbnN0KSB7Ci0JCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuUmFpc2UuaW5zdCk7Ci0JCQkJaWYgKHMtPnYuUmFpc2UudGJhY2spCi0JCQkJCVZJU0lUKHN0LCBleHByLCBzLT52LlJhaXNlLnRiYWNrKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLSAgICAgICAgY2FzZSBUcnlFeGNlcHRfa2luZDoKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LlRyeUV4Y2VwdC5ib2R5KTsKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LlRyeUV4Y2VwdC5vcmVsc2UpOwotCQlWSVNJVF9TRVEoc3QsIGV4Y2VwdGhhbmRsZXIsIHMtPnYuVHJ5RXhjZXB0LmhhbmRsZXJzKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgVHJ5RmluYWxseV9raW5kOgotCQlWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuVHJ5RmluYWxseS5ib2R5KTsKLQkJVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LlRyeUZpbmFsbHkuZmluYWxib2R5KTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgQXNzZXJ0X2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBzLT52LkFzc2VydC50ZXN0KTsKLQkJaWYgKHMtPnYuQXNzZXJ0Lm1zZykKLQkJCVZJU0lUKHN0LCBleHByLCBzLT52LkFzc2VydC5tc2cpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBJbXBvcnRfa2luZDoKLQkJVklTSVRfU0VRKHN0LCBhbGlhcywgcy0+di5JbXBvcnQubmFtZXMpOwotCQkvKiBYWFggRG9uJ3QgaGF2ZSB0aGUgbGluZW5vIGF2YWlsYWJsZSBpbnNpZGUKLQkJICAgdmlzaXRfYWxpYXMgKi8KLQkJaWYgKHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCAmJiAhc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8pCi0JCQlzdC0+c3RfY3VyLT5zdGVfb3B0X2xpbmVubyA9IHMtPmxpbmVubzsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgSW1wb3J0RnJvbV9raW5kOgotCQlWSVNJVF9TRVEoc3QsIGFsaWFzLCBzLT52LkltcG9ydEZyb20ubmFtZXMpOwotCQkvKiBYWFggRG9uJ3QgaGF2ZSB0aGUgbGluZW5vIGF2YWlsYWJsZSBpbnNpZGUKLQkJICAgdmlzaXRfYWxpYXMgKi8KLQkJaWYgKHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCAmJiAhc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8pCi0JCQlzdC0+c3RfY3VyLT5zdGVfb3B0X2xpbmVubyA9IHMtPmxpbmVubzsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgRXhlY19raW5kOgotCQlWSVNJVChzdCwgZXhwciwgcy0+di5FeGVjLmJvZHkpOwotCQlpZiAoIXN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vKQotCQkJc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8gPSBzLT5saW5lbm87Ci0JCWlmIChzLT52LkV4ZWMuZ2xvYmFscykgewotCQkJc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkIHw9IE9QVF9FWEVDOwotCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuRXhlYy5nbG9iYWxzKTsKLQkJCWlmIChzLT52LkV4ZWMubG9jYWxzKSAKLQkJCQlWSVNJVChzdCwgZXhwciwgcy0+di5FeGVjLmxvY2Fscyk7Ci0JCX0gZWxzZSB7Ci0JCQlzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgfD0gT1BUX0JBUkVfRVhFQzsKLQkJfQotCQlicmVhazsKLSAgICAgICAgY2FzZSBHbG9iYWxfa2luZDogewotCQlpbnQgaTsKLQkJYXNkbF9zZXEgKnNlcSA9IHMtPnYuR2xvYmFsLm5hbWVzOwotCQlmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgewotCQkJaWRlbnRpZmllciBuYW1lID0gKGlkZW50aWZpZXIpYXNkbF9zZXFfR0VUKHNlcSwgaSk7Ci0JCQljaGFyICpjX25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7Ci0JCQlsb25nIGN1ciA9IHN5bXRhYmxlX2xvb2t1cChzdCwgbmFtZSk7Ci0JCQlpZiAoY3VyIDwgMCkKLQkJCQlyZXR1cm4gMDsKLQkJCWlmIChjdXIgJiAoREVGX0xPQ0FMIHwgVVNFKSkgewotCQkJCWNoYXIgYnVmWzI1Nl07Ci0JCQkJaWYgKGN1ciAmIERFRl9MT0NBTCkgCi0JCQkJCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCQkJCSAgICAgIEdMT0JBTF9BRlRFUl9BU1NJR04sCi0JCQkJCQkgICAgICBjX25hbWUpOwotCQkJCWVsc2UKLQkJCQkJUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJCQkJICAgICAgR0xPQkFMX0FGVEVSX1VTRSwKLQkJCQkJCSAgICAgIGNfbmFtZSk7Ci0JCQkJaWYgKCFzeW10YWJsZV93YXJuKHN0LCBidWYsIHMtPmxpbmVubykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQkJCX0KLQkJCWlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgbmFtZSwgREVGX0dMT0JBTCkpCi0JCQkJcmV0dXJuIDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotICAgICAgICBjYXNlIEV4cHJfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuRXhwci52YWx1ZSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFBhc3Nfa2luZDoKLSAgICAgICAgY2FzZSBCcmVha19raW5kOgotICAgICAgICBjYXNlIENvbnRpbnVlX2tpbmQ6Ci0JCS8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLwotCQlicmVhazsKLSAgICAgICAgY2FzZSBXaXRoX2tpbmQ6Ci0JCWlmICghc3ltdGFibGVfbmV3X3RtcG5hbWUoc3QpKQotCQkJcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuV2l0aC5jb250ZXh0X2V4cHIpOwotICAgICAgICAgICAgICAgIGlmIChzLT52LldpdGgub3B0aW9uYWxfdmFycykgewotCQkJaWYgKCFzeW10YWJsZV9uZXdfdG1wbmFtZShzdCkpCi0JCQkJcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5XaXRoLm9wdGlvbmFsX3ZhcnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuV2l0aC5ib2R5KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQl9Ci0JcmV0dXJuIDE7CisgICAgc3dpdGNoIChzLT5raW5kKSB7CisgICAgY2FzZSBGdW5jdGlvbkRlZl9raW5kOgorICAgICAgICBpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIHMtPnYuRnVuY3Rpb25EZWYubmFtZSwgREVGX0xPQ0FMKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocy0+di5GdW5jdGlvbkRlZi5hcmdzLT5kZWZhdWx0cykKKyAgICAgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5GdW5jdGlvbkRlZi5hcmdzLT5kZWZhdWx0cyk7CisgICAgICAgIGlmIChzLT52LkZ1bmN0aW9uRGVmLmRlY29yYXRvcl9saXN0KQorICAgICAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBzLT52LkZ1bmN0aW9uRGVmLmRlY29yYXRvcl9saXN0KTsKKyAgICAgICAgaWYgKCFzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgcy0+di5GdW5jdGlvbkRlZi5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQmxvY2ssICh2b2lkICopcywgcy0+bGluZW5vKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVF9JTl9CTE9DSyhzdCwgYXJndW1lbnRzLCBzLT52LkZ1bmN0aW9uRGVmLmFyZ3MsIHMpOworICAgICAgICBWSVNJVF9TRVFfSU5fQkxPQ0soc3QsIHN0bXQsIHMtPnYuRnVuY3Rpb25EZWYuYm9keSwgcyk7CisgICAgICAgIGlmICghc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgcykpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDbGFzc0RlZl9raW5kOiB7CisgICAgICAgIFB5T2JqZWN0ICp0bXA7CisgICAgICAgIGlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgcy0+di5DbGFzc0RlZi5uYW1lLCBERUZfTE9DQUwpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5DbGFzc0RlZi5iYXNlcyk7CisgICAgICAgIGlmIChzLT52LkNsYXNzRGVmLmRlY29yYXRvcl9saXN0KQorICAgICAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBzLT52LkNsYXNzRGVmLmRlY29yYXRvcl9saXN0KTsKKyAgICAgICAgaWYgKCFzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgcy0+di5DbGFzc0RlZi5uYW1lLCBDbGFzc0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcywgcy0+bGluZW5vKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB0bXAgPSBzdC0+c3RfcHJpdmF0ZTsKKyAgICAgICAgc3QtPnN0X3ByaXZhdGUgPSBzLT52LkNsYXNzRGVmLm5hbWU7CisgICAgICAgIFZJU0lUX1NFUV9JTl9CTE9DSyhzdCwgc3RtdCwgcy0+di5DbGFzc0RlZi5ib2R5LCBzKTsKKyAgICAgICAgc3QtPnN0X3ByaXZhdGUgPSB0bXA7CisgICAgICAgIGlmICghc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgcykpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUmV0dXJuX2tpbmQ6CisgICAgICAgIGlmIChzLT52LlJldHVybi52YWx1ZSkgeworICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuUmV0dXJuLnZhbHVlKTsKKyAgICAgICAgICAgIHN0LT5zdF9jdXItPnN0ZV9yZXR1cm5zX3ZhbHVlID0gMTsKKyAgICAgICAgICAgIGlmIChzdC0+c3RfY3VyLT5zdGVfZ2VuZXJhdG9yKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAorICAgICAgICAgICAgICAgICAgICBSRVRVUk5fVkFMX0lOX0dFTkVSQVRPUik7CisgICAgICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lbm8pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRGVsZXRlX2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5EZWxldGUudGFyZ2V0cyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXNzaWduX2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgcy0+di5Bc3NpZ24udGFyZ2V0cyk7CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkFzc2lnbi52YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQXVnQXNzaWduX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkF1Z0Fzc2lnbi50YXJnZXQpOworICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFByaW50X2tpbmQ6CisgICAgICAgIGlmIChzLT52LlByaW50LmRlc3QpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5QcmludC5kZXN0KTsKKyAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBzLT52LlByaW50LnZhbHVlcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9yX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkZvci50YXJnZXQpOworICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5Gb3IuaXRlcik7CisgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5Gb3IuYm9keSk7CisgICAgICAgIGlmIChzLT52LkZvci5vcmVsc2UpCisgICAgICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuRm9yLm9yZWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV2hpbGVfa2luZDoKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuV2hpbGUudGVzdCk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5XaGlsZS5ib2R5KTsKKyAgICAgICAgaWYgKHMtPnYuV2hpbGUub3JlbHNlKQorICAgICAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LldoaWxlLm9yZWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSWZfa2luZDoKKyAgICAgICAgLyogWFhYIGlmIDA6IGFuZCBsb29rdXBfeWllbGQoKSBoYWNrcyAqLworICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5JZi50ZXN0KTsKKyAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LklmLmJvZHkpOworICAgICAgICBpZiAocy0+di5JZi5vcmVsc2UpCisgICAgICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuSWYub3JlbHNlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSYWlzZV9raW5kOgorICAgICAgICBpZiAocy0+di5SYWlzZS50eXBlKSB7CisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5SYWlzZS50eXBlKTsKKyAgICAgICAgICAgIGlmIChzLT52LlJhaXNlLmluc3QpIHsKKyAgICAgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5SYWlzZS5pbnN0KTsKKyAgICAgICAgICAgICAgICBpZiAocy0+di5SYWlzZS50YmFjaykKKyAgICAgICAgICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuUmFpc2UudGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVHJ5RXhjZXB0X2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5UcnlFeGNlcHQuYm9keSk7CisgICAgICAgIFZJU0lUX1NFUShzdCwgc3RtdCwgcy0+di5UcnlFeGNlcHQub3JlbHNlKTsKKyAgICAgICAgVklTSVRfU0VRKHN0LCBleGNlcHRoYW5kbGVyLCBzLT52LlRyeUV4Y2VwdC5oYW5kbGVycyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVHJ5RmluYWxseV9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIHN0bXQsIHMtPnYuVHJ5RmluYWxseS5ib2R5KTsKKyAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LlRyeUZpbmFsbHkuZmluYWxib2R5KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBc3NlcnRfa2luZDoKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuQXNzZXJ0LnRlc3QpOworICAgICAgICBpZiAocy0+di5Bc3NlcnQubXNnKQorICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuQXNzZXJ0Lm1zZyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSW1wb3J0X2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgYWxpYXMsIHMtPnYuSW1wb3J0Lm5hbWVzKTsKKyAgICAgICAgLyogWFhYIERvbid0IGhhdmUgdGhlIGxpbmVubyBhdmFpbGFibGUgaW5zaWRlCisgICAgICAgICAgIHZpc2l0X2FsaWFzICovCisgICAgICAgIGlmIChzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgJiYgIXN0LT5zdF9jdXItPnN0ZV9vcHRfbGluZW5vKQorICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8gPSBzLT5saW5lbm87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSW1wb3J0RnJvbV9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGFsaWFzLCBzLT52LkltcG9ydEZyb20ubmFtZXMpOworICAgICAgICAvKiBYWFggRG9uJ3QgaGF2ZSB0aGUgbGluZW5vIGF2YWlsYWJsZSBpbnNpZGUKKyAgICAgICAgICAgdmlzaXRfYWxpYXMgKi8KKyAgICAgICAgaWYgKHN0LT5zdF9jdXItPnN0ZV91bm9wdGltaXplZCAmJiAhc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8pCisgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfb3B0X2xpbmVubyA9IHMtPmxpbmVubzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFeGVjX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkV4ZWMuYm9keSk7CisgICAgICAgIGlmICghc3QtPnN0X2N1ci0+c3RlX29wdF9saW5lbm8pCisgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfb3B0X2xpbmVubyA9IHMtPmxpbmVubzsKKyAgICAgICAgaWYgKHMtPnYuRXhlYy5nbG9iYWxzKSB7CisgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgfD0gT1BUX0VYRUM7CisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgcy0+di5FeGVjLmdsb2JhbHMpOworICAgICAgICAgICAgaWYgKHMtPnYuRXhlYy5sb2NhbHMpCisgICAgICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuRXhlYy5sb2NhbHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkIHw9IE9QVF9CQVJFX0VYRUM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHbG9iYWxfa2luZDogeworICAgICAgICBpbnQgaTsKKyAgICAgICAgYXNkbF9zZXEgKnNlcSA9IHMtPnYuR2xvYmFsLm5hbWVzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKHNlcSk7IGkrKykgeworICAgICAgICAgICAgaWRlbnRpZmllciBuYW1lID0gKGlkZW50aWZpZXIpYXNkbF9zZXFfR0VUKHNlcSwgaSk7CisgICAgICAgICAgICBjaGFyICpjX25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcobmFtZSk7CisgICAgICAgICAgICBsb25nIGN1ciA9IHN5bXRhYmxlX2xvb2t1cChzdCwgbmFtZSk7CisgICAgICAgICAgICBpZiAoY3VyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmIChjdXIgJiAoREVGX0xPQ0FMIHwgVVNFKSkgeworICAgICAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CisgICAgICAgICAgICAgICAgaWYgKGN1ciAmIERFRl9MT0NBTCkKKyAgICAgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9BRlRFUl9BU1NJR04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19uYW1lKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQUZURVJfVVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKCFzeW10YWJsZV93YXJuKHN0LCBidWYsIHMtPmxpbmVubykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBuYW1lLCBERUZfR0xPQkFMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBFeHByX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LkV4cHIudmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBhc3Nfa2luZDoKKyAgICBjYXNlIEJyZWFrX2tpbmQ6CisgICAgY2FzZSBDb250aW51ZV9raW5kOgorICAgICAgICAvKiBub3RoaW5nIHRvIGRvIGhlcmUgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXaXRoX2tpbmQ6CisgICAgICAgIGlmICghc3ltdGFibGVfbmV3X3RtcG5hbWUoc3QpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LldpdGguY29udGV4dF9leHByKTsKKyAgICAgICAgaWYgKHMtPnYuV2l0aC5vcHRpb25hbF92YXJzKSB7CisgICAgICAgICAgICBpZiAoIXN5bXRhYmxlX25ld190bXBuYW1lKHN0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LldpdGgub3B0aW9uYWxfdmFycyk7CisgICAgICAgIH0KKyAgICAgICAgVklTSVRfU0VRKHN0LCBzdG10LCBzLT52LldpdGguYm9keSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIHN5bXRhYmxlX3Zpc2l0X2V4cHIoc3RydWN0IHN5bXRhYmxlICpzdCwgZXhwcl90eSBlKQogewotCXN3aXRjaCAoZS0+a2luZCkgewotICAgICAgICBjYXNlIEJvb2xPcF9raW5kOgotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuQm9vbE9wLnZhbHVlcyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEJpbk9wX2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LkJpbk9wLmxlZnQpOwotCQlWSVNJVChzdCwgZXhwciwgZS0+di5CaW5PcC5yaWdodCk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFVuYXJ5T3Bfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuVW5hcnlPcC5vcGVyYW5kKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgTGFtYmRhX2tpbmQ6IHsKLQkJaWYgKCFHRVRfSURFTlRJRklFUihsYW1iZGEpIHx8Ci0JCSAgICAhc3ltdGFibGVfYWRkX2RlZihzdCwgbGFtYmRhLCBERUZfTE9DQUwpKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChlLT52LkxhbWJkYS5hcmdzLT5kZWZhdWx0cykKLQkJCVZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5MYW1iZGEuYXJncy0+ZGVmYXVsdHMpOwotCQlpZiAoIXN5bXRhYmxlX2VudGVyX2Jsb2NrKHN0LCBsYW1iZGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkJsb2NrLCAodm9pZCAqKWUsIGUtPmxpbmVubykpCi0JCQlyZXR1cm4gMDsKLQkJVklTSVRfSU5fQkxPQ0soc3QsIGFyZ3VtZW50cywgZS0+di5MYW1iZGEuYXJncywgKHZvaWQqKWUpOwotCQlWSVNJVF9JTl9CTE9DSyhzdCwgZXhwciwgZS0+di5MYW1iZGEuYm9keSwgKHZvaWQqKWUpOwotCQlpZiAoIXN5bXRhYmxlX2V4aXRfYmxvY2soc3QsICh2b2lkICopZSkpCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgSWZFeHBfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuSWZFeHAudGVzdCk7Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LklmRXhwLmJvZHkpOwotCQlWSVNJVChzdCwgZXhwciwgZS0+di5JZkV4cC5vcmVsc2UpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBEaWN0X2tpbmQ6Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5EaWN0LmtleXMpOwotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuRGljdC52YWx1ZXMpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBMaXN0Q29tcF9raW5kOgotCQlpZiAoIXN5bXRhYmxlX25ld190bXBuYW1lKHN0KSkKLQkJCXJldHVybiAwOwotCQlWSVNJVChzdCwgZXhwciwgZS0+di5MaXN0Q29tcC5lbHQpOwotCQlWSVNJVF9TRVEoc3QsIGNvbXByZWhlbnNpb24sIGUtPnYuTGlzdENvbXAuZ2VuZXJhdG9ycyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEdlbmVyYXRvckV4cF9raW5kOgotCQlpZiAoIXN5bXRhYmxlX3Zpc2l0X2dlbmV4cChzdCwgZSkpCi0JCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgWWllbGRfa2luZDoKLQkJaWYgKGUtPnYuWWllbGQudmFsdWUpCi0JCQlWSVNJVChzdCwgZXhwciwgZS0+di5ZaWVsZC52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgc3QtPnN0X2N1ci0+c3RlX2dlbmVyYXRvciA9IDE7Ci0JCWlmIChzdC0+c3RfY3VyLT5zdGVfcmV0dXJuc192YWx1ZSkgewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAotCQkJCVJFVFVSTl9WQUxfSU5fR0VORVJBVE9SKTsKLQkJICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbihzdC0+c3RfZmlsZW5hbWUsCi0JCQkgICAgICAgICAgICAgZS0+bGluZW5vKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIENvbXBhcmVfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuQ29tcGFyZS5sZWZ0KTsKLQkJVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBDYWxsX2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LkNhbGwuZnVuYyk7Ci0JCVZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5DYWxsLmFyZ3MpOwotCQlWSVNJVF9TRVEoc3QsIGtleXdvcmQsIGUtPnYuQ2FsbC5rZXl3b3Jkcyk7Ci0JCWlmIChlLT52LkNhbGwuc3RhcmFyZ3MpCi0JCQlWSVNJVChzdCwgZXhwciwgZS0+di5DYWxsLnN0YXJhcmdzKTsKLQkJaWYgKGUtPnYuQ2FsbC5rd2FyZ3MpCi0JCQlWSVNJVChzdCwgZXhwciwgZS0+di5DYWxsLmt3YXJncyk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFJlcHJfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuUmVwci52YWx1ZSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIE51bV9raW5kOgotICAgICAgICBjYXNlIFN0cl9raW5kOgotCQkvKiBOb3RoaW5nIHRvIGRvIGhlcmUuICovCi0JCWJyZWFrOwotCS8qIFRoZSBmb2xsb3dpbmcgZXhwcnMgY2FuIGJlIGFzc2lnbm1lbnQgdGFyZ2V0cy4gKi8KLSAgICAgICAgY2FzZSBBdHRyaWJ1dGVfa2luZDoKLQkJVklTSVQoc3QsIGV4cHIsIGUtPnYuQXR0cmlidXRlLnZhbHVlKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgU3Vic2NyaXB0X2tpbmQ6Ci0JCVZJU0lUKHN0LCBleHByLCBlLT52LlN1YnNjcmlwdC52YWx1ZSk7Ci0JCVZJU0lUKHN0LCBzbGljZSwgZS0+di5TdWJzY3JpcHQuc2xpY2UpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBOYW1lX2tpbmQ6Ci0JCWlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgZS0+di5OYW1lLmlkLCAKLQkJCQkgICAgICBlLT52Lk5hbWUuY3R4ID09IExvYWQgPyBVU0UgOiBERUZfTE9DQUwpKQotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCS8qIGNoaWxkIG5vZGVzIG9mIExpc3QgYW5kIFR1cGxlIHdpbGwgaGF2ZSBleHByX2NvbnRleHQgc2V0ICovCi0gICAgICAgIGNhc2UgTGlzdF9raW5kOgotCQlWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuTGlzdC5lbHRzKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgVHVwbGVfa2luZDoKLQkJVklTSVRfU0VRKHN0LCBleHByLCBlLT52LlR1cGxlLmVsdHMpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDE7CisgICAgc3dpdGNoIChlLT5raW5kKSB7CisgICAgY2FzZSBCb29sT3Bfa2luZDoKKyAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkJvb2xPcC52YWx1ZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJpbk9wX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkJpbk9wLmxlZnQpOworICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5CaW5PcC5yaWdodCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVW5hcnlPcF9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5VbmFyeU9wLm9wZXJhbmQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExhbWJkYV9raW5kOiB7CisgICAgICAgIGlmICghR0VUX0lERU5USUZJRVIobGFtYmRhKSB8fAorICAgICAgICAgICAgIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGxhbWJkYSwgREVGX0xPQ0FMKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoZS0+di5MYW1iZGEuYXJncy0+ZGVmYXVsdHMpCisgICAgICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuTGFtYmRhLmFyZ3MtPmRlZmF1bHRzKTsKKyAgICAgICAgaWYgKCFzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgbGFtYmRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQmxvY2ssICh2b2lkICopZSwgZS0+bGluZW5vKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVF9JTl9CTE9DSyhzdCwgYXJndW1lbnRzLCBlLT52LkxhbWJkYS5hcmdzLCAodm9pZCopZSk7CisgICAgICAgIFZJU0lUX0lOX0JMT0NLKHN0LCBleHByLCBlLT52LkxhbWJkYS5ib2R5LCAodm9pZCopZSk7CisgICAgICAgIGlmICghc3ltdGFibGVfZXhpdF9ibG9jayhzdCwgKHZvaWQgKillKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBJZkV4cF9raW5kOgorICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5JZkV4cC50ZXN0KTsKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuSWZFeHAuYm9keSk7CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LklmRXhwLm9yZWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRGljdF9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIGV4cHIsIGUtPnYuRGljdC5rZXlzKTsKKyAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkRpY3QudmFsdWVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMaXN0Q29tcF9raW5kOgorICAgICAgICBpZiAoIXN5bXRhYmxlX25ld190bXBuYW1lKHN0KSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5MaXN0Q29tcC5lbHQpOworICAgICAgICBWSVNJVF9TRVEoc3QsIGNvbXByZWhlbnNpb24sIGUtPnYuTGlzdENvbXAuZ2VuZXJhdG9ycyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR2VuZXJhdG9yRXhwX2tpbmQ6CisgICAgICAgIGlmICghc3ltdGFibGVfdmlzaXRfZ2VuZXhwKHN0LCBlKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFlpZWxkX2tpbmQ6CisgICAgICAgIGlmIChlLT52LllpZWxkLnZhbHVlKQorICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuWWllbGQudmFsdWUpOworICAgICAgICBzdC0+c3RfY3VyLT5zdGVfZ2VuZXJhdG9yID0gMTsKKyAgICAgICAgaWYgKHN0LT5zdF9jdXItPnN0ZV9yZXR1cm5zX3ZhbHVlKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsCisgICAgICAgICAgICAgICAgUkVUVVJOX1ZBTF9JTl9HRU5FUkFUT1IpOworICAgICAgICAgICAgUHlFcnJfU3ludGF4TG9jYXRpb24oc3QtPnN0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGUtPmxpbmVubyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENvbXBhcmVfa2luZDoKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuQ29tcGFyZS5sZWZ0KTsKKyAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkNvbXBhcmUuY29tcGFyYXRvcnMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENhbGxfa2luZDoKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGUtPnYuQ2FsbC5mdW5jKTsKKyAgICAgICAgVklTSVRfU0VRKHN0LCBleHByLCBlLT52LkNhbGwuYXJncyk7CisgICAgICAgIFZJU0lUX1NFUShzdCwga2V5d29yZCwgZS0+di5DYWxsLmtleXdvcmRzKTsKKyAgICAgICAgaWYgKGUtPnYuQ2FsbC5zdGFyYXJncykKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkNhbGwuc3RhcmFyZ3MpOworICAgICAgICBpZiAoZS0+di5DYWxsLmt3YXJncykKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkNhbGwua3dhcmdzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSZXByX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LlJlcHIudmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE51bV9raW5kOgorICAgIGNhc2UgU3RyX2tpbmQ6CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gaGVyZS4gKi8KKyAgICAgICAgYnJlYWs7CisgICAgLyogVGhlIGZvbGxvd2luZyBleHBycyBjYW4gYmUgYXNzaWdubWVudCB0YXJnZXRzLiAqLworICAgIGNhc2UgQXR0cmlidXRlX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkF0dHJpYnV0ZS52YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3Vic2NyaXB0X2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LlN1YnNjcmlwdC52YWx1ZSk7CisgICAgICAgIFZJU0lUKHN0LCBzbGljZSwgZS0+di5TdWJzY3JpcHQuc2xpY2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE5hbWVfa2luZDoKKyAgICAgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBlLT52Lk5hbWUuaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52Lk5hbWUuY3R4ID09IExvYWQgPyBVU0UgOiBERUZfTE9DQUwpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIC8qIGNoaWxkIG5vZGVzIG9mIExpc3QgYW5kIFR1cGxlIHdpbGwgaGF2ZSBleHByX2NvbnRleHQgc2V0ICovCisgICAgY2FzZSBMaXN0X2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5MaXN0LmVsdHMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFR1cGxlX2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5UdXBsZS5lbHRzKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBzeW10YWJsZV9pbXBsaWNpdF9hcmcoc3RydWN0IHN5bXRhYmxlICpzdCwgaW50IHBvcykKIHsKLQlQeU9iamVjdCAqaWQgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCIuJWQiLCBwb3MpOwotCWlmIChpZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGlkLCBERUZfUEFSQU0pKSB7Ci0JCVB5X0RFQ1JFRihpZCk7Ci0JCXJldHVybiAwOwotCX0KLQlQeV9ERUNSRUYoaWQpOwotCXJldHVybiAxOworICAgIFB5T2JqZWN0ICppZCA9IFB5U3RyaW5nX0Zyb21Gb3JtYXQoIi4lZCIsIHBvcyk7CisgICAgaWYgKGlkID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghc3ltdGFibGVfYWRkX2RlZihzdCwgaWQsIERFRl9QQVJBTSkpIHsKKyAgICAgICAgUHlfREVDUkVGKGlkKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5X0RFQ1JFRihpZCk7CisgICAgcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9wYXJhbXMoc3RydWN0IHN5bXRhYmxlICpzdCwgYXNkbF9zZXEgKmFyZ3MsIGludCB0b3BsZXZlbCkKIHsKLQlpbnQgaTsKLQkKLSAgICAgICAgLyogZ28gdGhyb3VnaCBhbGwgdGhlIHRvcGxldmVsIGFyZ3VtZW50cyBmaXJzdCAqLwotCWZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oYXJncyk7IGkrKykgewotCQlleHByX3R5IGFyZyA9IChleHByX3R5KWFzZGxfc2VxX0dFVChhcmdzLCBpKTsKLQkJaWYgKGFyZy0+a2luZCA9PSBOYW1lX2tpbmQpIHsKLQkJCWFzc2VydChhcmctPnYuTmFtZS5jdHggPT0gUGFyYW0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJnLT52Lk5hbWUuY3R4ID09IFN0b3JlICYmICF0b3BsZXZlbCkpOwotCQkJaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBhcmctPnYuTmFtZS5pZCwgREVGX1BBUkFNKSkKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQllbHNlIGlmIChhcmctPmtpbmQgPT0gVHVwbGVfa2luZCkgewotCQkJYXNzZXJ0KGFyZy0+di5UdXBsZS5jdHggPT0gU3RvcmUpOwotCQkJaWYgKHRvcGxldmVsKSB7Ci0JCQkJaWYgKCFzeW10YWJsZV9pbXBsaWNpdF9hcmcoc3QsIGkpKQotCQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3ludGF4RXJyb3IsCi0JCQkJCSJpbnZhbGlkIGV4cHJlc3Npb24gaW4gcGFyYW1ldGVyIGxpc3QiKTsKLQkJICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbihzdC0+c3RfZmlsZW5hbWUsCi0JCQkJICAgICAgICAgICAgIHN0LT5zdF9jdXItPnN0ZV9saW5lbm8pOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9CisgICAgaW50IGk7CiAKLQlpZiAoIXRvcGxldmVsKSB7Ci0JCWlmICghc3ltdGFibGVfdmlzaXRfcGFyYW1zX25lc3RlZChzdCwgYXJncykpCi0JCQlyZXR1cm4gMDsKLQl9CisgICAgLyogZ28gdGhyb3VnaCBhbGwgdGhlIHRvcGxldmVsIGFyZ3VtZW50cyBmaXJzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhc2RsX3NlcV9MRU4oYXJncyk7IGkrKykgeworICAgICAgICBleHByX3R5IGFyZyA9IChleHByX3R5KWFzZGxfc2VxX0dFVChhcmdzLCBpKTsKKyAgICAgICAgaWYgKGFyZy0+a2luZCA9PSBOYW1lX2tpbmQpIHsKKyAgICAgICAgICAgIGFzc2VydChhcmctPnYuTmFtZS5jdHggPT0gUGFyYW0gfHwKKyAgICAgICAgICAgICAgICAgICAoYXJnLT52Lk5hbWUuY3R4ID09IFN0b3JlICYmICF0b3BsZXZlbCkpOworICAgICAgICAgICAgaWYgKCFzeW10YWJsZV9hZGRfZGVmKHN0LCBhcmctPnYuTmFtZS5pZCwgREVGX1BBUkFNKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChhcmctPmtpbmQgPT0gVHVwbGVfa2luZCkgeworICAgICAgICAgICAgYXNzZXJ0KGFyZy0+di5UdXBsZS5jdHggPT0gU3RvcmUpOworICAgICAgICAgICAgaWYgKHRvcGxldmVsKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzeW10YWJsZV9pbXBsaWNpdF9hcmcoc3QsIGkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBleHByZXNzaW9uIGluIHBhcmFtZXRlciBsaXN0Iik7CisgICAgICAgICAgICBQeUVycl9TeW50YXhMb2NhdGlvbihzdC0+c3RfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+c3RfY3VyLT5zdGVfbGluZW5vKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIDE7CisgICAgaWYgKCF0b3BsZXZlbCkgeworICAgICAgICBpZiAoIXN5bXRhYmxlX3Zpc2l0X3BhcmFtc19uZXN0ZWQoc3QsIGFyZ3MpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQKIHN5bXRhYmxlX3Zpc2l0X3BhcmFtc19uZXN0ZWQoc3RydWN0IHN5bXRhYmxlICpzdCwgYXNkbF9zZXEgKmFyZ3MpCiB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihhcmdzKTsgaSsrKSB7Ci0JCWV4cHJfdHkgYXJnID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGFyZ3MsIGkpOwotCQlpZiAoYXJnLT5raW5kID09IFR1cGxlX2tpbmQgJiYKLQkJICAgICFzeW10YWJsZV92aXNpdF9wYXJhbXMoc3QsIGFyZy0+di5UdXBsZS5lbHRzLCAwKSkKLQkJCXJldHVybiAwOwotCX0KLQkKLQlyZXR1cm4gMTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGFyZ3MpOyBpKyspIHsKKyAgICAgICAgZXhwcl90eSBhcmcgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoYXJncywgaSk7CisgICAgICAgIGlmIChhcmctPmtpbmQgPT0gVHVwbGVfa2luZCAmJgorICAgICAgICAgICAgIXN5bXRhYmxlX3Zpc2l0X3BhcmFtcyhzdCwgYXJnLT52LlR1cGxlLmVsdHMsIDApKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9hcmd1bWVudHMoc3RydWN0IHN5bXRhYmxlICpzdCwgYXJndW1lbnRzX3R5IGEpCiB7Ci0JLyogc2tpcCBkZWZhdWx0IGFyZ3VtZW50cyBpbnNpZGUgZnVuY3Rpb24gYmxvY2sKLQkgICBYWFggc2hvdWxkIGFzdCBiZSBkaWZmZXJlbnQ/Ci0JKi8KLQlpZiAoYS0+YXJncyAmJiAhc3ltdGFibGVfdmlzaXRfcGFyYW1zKHN0LCBhLT5hcmdzLCAxKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKGEtPnZhcmFyZykgewotCQlpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGEtPnZhcmFyZywgREVGX1BBUkFNKSkKLQkJCXJldHVybiAwOwotCQlzdC0+c3RfY3VyLT5zdGVfdmFyYXJncyA9IDE7Ci0JfQotCWlmIChhLT5rd2FyZykgewotCQlpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGEtPmt3YXJnLCBERUZfUEFSQU0pKQotCQkJcmV0dXJuIDA7Ci0JCXN0LT5zdF9jdXItPnN0ZV92YXJrZXl3b3JkcyA9IDE7Ci0JfQotCWlmIChhLT5hcmdzICYmICFzeW10YWJsZV92aXNpdF9wYXJhbXNfbmVzdGVkKHN0LCBhLT5hcmdzKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgLyogc2tpcCBkZWZhdWx0IGFyZ3VtZW50cyBpbnNpZGUgZnVuY3Rpb24gYmxvY2sKKyAgICAgICBYWFggc2hvdWxkIGFzdCBiZSBkaWZmZXJlbnQ/CisgICAgKi8KKyAgICBpZiAoYS0+YXJncyAmJiAhc3ltdGFibGVfdmlzaXRfcGFyYW1zKHN0LCBhLT5hcmdzLCAxKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGEtPnZhcmFyZykgeworICAgICAgICBpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGEtPnZhcmFyZywgREVGX1BBUkFNKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzdC0+c3RfY3VyLT5zdGVfdmFyYXJncyA9IDE7CisgICAgfQorICAgIGlmIChhLT5rd2FyZykgeworICAgICAgICBpZiAoIXN5bXRhYmxlX2FkZF9kZWYoc3QsIGEtPmt3YXJnLCBERUZfUEFSQU0pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHN0LT5zdF9jdXItPnN0ZV92YXJrZXl3b3JkcyA9IDE7CisgICAgfQorICAgIGlmIChhLT5hcmdzICYmICFzeW10YWJsZV92aXNpdF9wYXJhbXNfbmVzdGVkKHN0LCBhLT5hcmdzKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIAotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIHN5bXRhYmxlX3Zpc2l0X2V4Y2VwdGhhbmRsZXIoc3RydWN0IHN5bXRhYmxlICpzdCwgZXhjZXB0aGFuZGxlcl90eSBlaCkKIHsKLQlpZiAoZWgtPnYuRXhjZXB0SGFuZGxlci50eXBlKQotCQlWSVNJVChzdCwgZXhwciwgZWgtPnYuRXhjZXB0SGFuZGxlci50eXBlKTsKLQlpZiAoZWgtPnYuRXhjZXB0SGFuZGxlci5uYW1lKQotCQlWSVNJVChzdCwgZXhwciwgZWgtPnYuRXhjZXB0SGFuZGxlci5uYW1lKTsKLQlWSVNJVF9TRVEoc3QsIHN0bXQsIGVoLT52LkV4Y2VwdEhhbmRsZXIuYm9keSk7Ci0JcmV0dXJuIDE7CisgICAgaWYgKGVoLT52LkV4Y2VwdEhhbmRsZXIudHlwZSkKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGVoLT52LkV4Y2VwdEhhbmRsZXIudHlwZSk7CisgICAgaWYgKGVoLT52LkV4Y2VwdEhhbmRsZXIubmFtZSkKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIGVoLT52LkV4Y2VwdEhhbmRsZXIubmFtZSk7CisgICAgVklTSVRfU0VRKHN0LCBzdG10LCBlaC0+di5FeGNlcHRIYW5kbGVyLmJvZHkpOworICAgIHJldHVybiAxOwogfQogCiAKLXN0YXRpYyBpbnQgCitzdGF0aWMgaW50CiBzeW10YWJsZV92aXNpdF9hbGlhcyhzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBhbGlhc190eSBhKQogewotCS8qIENvbXB1dGUgc3RvcmVfbmFtZSwgdGhlIG5hbWUgYWN0dWFsbHkgYm91bmQgYnkgdGhlIGltcG9ydAotCSAgIG9wZXJhdGlvbi4gIEl0IGlzIGRpZmVyZW50IHRoYW4gYS0+bmFtZSB3aGVuIGEtPm5hbWUgaXMgYQotCSAgIGRvdHRlZCBwYWNrYWdlIG5hbWUgKGUuZy4gc3BhbS5lZ2dzKSAKLQkqLwotCVB5T2JqZWN0ICpzdG9yZV9uYW1lOwotCVB5T2JqZWN0ICpuYW1lID0gKGEtPmFzbmFtZSA9PSBOVUxMKSA/IGEtPm5hbWUgOiBhLT5hc25hbWU7Ci0JY29uc3QgY2hhciAqYmFzZSA9IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKTsKLQljaGFyICpkb3QgPSBzdHJjaHIoYmFzZSwgJy4nKTsKLQlpZiAoZG90KSB7Ci0JCXN0b3JlX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShiYXNlLCBkb3QgLSBiYXNlKTsKLQkJaWYgKCFzdG9yZV9uYW1lKQotCQkJcmV0dXJuIDA7Ci0JfQotCWVsc2UgewotCQlzdG9yZV9uYW1lID0gbmFtZTsKLQkJUHlfSU5DUkVGKHN0b3JlX25hbWUpOwotCX0KLQlpZiAoc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgIioiKSkgewotCQlpbnQgciA9IHN5bXRhYmxlX2FkZF9kZWYoc3QsIHN0b3JlX25hbWUsIERFRl9JTVBPUlQpOyAKLQkJUHlfREVDUkVGKHN0b3JlX25hbWUpOwotCQlyZXR1cm4gcjsKLQl9Ci0JZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc3QtPnN0X2N1ci0+c3RlX3R5cGUgIT0gTW9kdWxlQmxvY2spIHsKLSAgICAgICAgICAgICAgICBpbnQgbGluZW5vID0gc3QtPnN0X2N1ci0+c3RlX2xpbmVubzsKLSAgICAgICAgICAgICAgICBpZiAoIXN5bXRhYmxlX3dhcm4oc3QsIElNUE9SVF9TVEFSX1dBUk5JTkcsIGxpbmVubykpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0b3JlX25hbWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQkJfQotICAgICAgICAgICAgfQotCSAgICBzdC0+c3RfY3VyLT5zdGVfdW5vcHRpbWl6ZWQgfD0gT1BUX0lNUE9SVF9TVEFSOwotCSAgICBQeV9ERUNSRUYoc3RvcmVfbmFtZSk7Ci0JICAgIHJldHVybiAxOwotCX0KKyAgICAvKiBDb21wdXRlIHN0b3JlX25hbWUsIHRoZSBuYW1lIGFjdHVhbGx5IGJvdW5kIGJ5IHRoZSBpbXBvcnQKKyAgICAgICBvcGVyYXRpb24uICBJdCBpcyBkaWZlcmVudCB0aGFuIGEtPm5hbWUgd2hlbiBhLT5uYW1lIGlzIGEKKyAgICAgICBkb3R0ZWQgcGFja2FnZSBuYW1lIChlLmcuIHNwYW0uZWdncykKKyAgICAqLworICAgIFB5T2JqZWN0ICpzdG9yZV9uYW1lOworICAgIFB5T2JqZWN0ICpuYW1lID0gKGEtPmFzbmFtZSA9PSBOVUxMKSA/IGEtPm5hbWUgOiBhLT5hc25hbWU7CisgICAgY29uc3QgY2hhciAqYmFzZSA9IFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKTsKKyAgICBjaGFyICpkb3QgPSBzdHJjaHIoYmFzZSwgJy4nKTsKKyAgICBpZiAoZG90KSB7CisgICAgICAgIHN0b3JlX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShiYXNlLCBkb3QgLSBiYXNlKTsKKyAgICAgICAgaWYgKCFzdG9yZV9uYW1lKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdG9yZV9uYW1lID0gbmFtZTsKKyAgICAgICAgUHlfSU5DUkVGKHN0b3JlX25hbWUpOworICAgIH0KKyAgICBpZiAoc3RyY21wKFB5U3RyaW5nX0FTX1NUUklORyhuYW1lKSwgIioiKSkgeworICAgICAgICBpbnQgciA9IHN5bXRhYmxlX2FkZF9kZWYoc3QsIHN0b3JlX25hbWUsIERFRl9JTVBPUlQpOworICAgICAgICBQeV9ERUNSRUYoc3RvcmVfbmFtZSk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHN0LT5zdF9jdXItPnN0ZV90eXBlICE9IE1vZHVsZUJsb2NrKSB7CisgICAgICAgIGludCBsaW5lbm8gPSBzdC0+c3RfY3VyLT5zdGVfbGluZW5vOworICAgICAgICBpZiAoIXN5bXRhYmxlX3dhcm4oc3QsIElNUE9SVF9TVEFSX1dBUk5JTkcsIGxpbmVubykpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzdG9yZV9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkIHw9IE9QVF9JTVBPUlRfU1RBUjsKKyAgICAgICAgUHlfREVDUkVGKHN0b3JlX25hbWUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiB9CiAKIAotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIHN5bXRhYmxlX3Zpc2l0X2NvbXByZWhlbnNpb24oc3RydWN0IHN5bXRhYmxlICpzdCwgY29tcHJlaGVuc2lvbl90eSBsYykKIHsKLQlWSVNJVChzdCwgZXhwciwgbGMtPnRhcmdldCk7Ci0JVklTSVQoc3QsIGV4cHIsIGxjLT5pdGVyKTsKLQlWSVNJVF9TRVEoc3QsIGV4cHIsIGxjLT5pZnMpOwotCXJldHVybiAxOworICAgIFZJU0lUKHN0LCBleHByLCBsYy0+dGFyZ2V0KTsKKyAgICBWSVNJVChzdCwgZXhwciwgbGMtPml0ZXIpOworICAgIFZJU0lUX1NFUShzdCwgZXhwciwgbGMtPmlmcyk7CisgICAgcmV0dXJuIDE7CiB9CiAKIAotc3RhdGljIGludCAKK3N0YXRpYyBpbnQKIHN5bXRhYmxlX3Zpc2l0X2tleXdvcmQoc3RydWN0IHN5bXRhYmxlICpzdCwga2V5d29yZF90eSBrKQogewotCVZJU0lUKHN0LCBleHByLCBrLT52YWx1ZSk7Ci0JcmV0dXJuIDE7CisgICAgVklTSVQoc3QsIGV4cHIsIGstPnZhbHVlKTsKKyAgICByZXR1cm4gMTsKIH0KIAogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfc2xpY2Uoc3RydWN0IHN5bXRhYmxlICpzdCwgc2xpY2VfdHkgcykKIHsKLQlzd2l0Y2ggKHMtPmtpbmQpIHsKLQljYXNlIFNsaWNlX2tpbmQ6Ci0JCWlmIChzLT52LlNsaWNlLmxvd2VyKQotCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuU2xpY2UubG93ZXIpCi0JCWlmIChzLT52LlNsaWNlLnVwcGVyKQotCQkJVklTSVQoc3QsIGV4cHIsIHMtPnYuU2xpY2UudXBwZXIpCi0JCWlmIChzLT52LlNsaWNlLnN0ZXApCi0JCQlWSVNJVChzdCwgZXhwciwgcy0+di5TbGljZS5zdGVwKQotCQlicmVhazsKLQljYXNlIEV4dFNsaWNlX2tpbmQ6Ci0JCVZJU0lUX1NFUShzdCwgc2xpY2UsIHMtPnYuRXh0U2xpY2UuZGltcykKLQkJYnJlYWs7Ci0JY2FzZSBJbmRleF9raW5kOgotCQlWSVNJVChzdCwgZXhwciwgcy0+di5JbmRleC52YWx1ZSkKLQkJYnJlYWs7Ci0JY2FzZSBFbGxpcHNpc19raW5kOgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIDE7CisgICAgc3dpdGNoIChzLT5raW5kKSB7CisgICAgY2FzZSBTbGljZV9raW5kOgorICAgICAgICBpZiAocy0+di5TbGljZS5sb3dlcikKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LlNsaWNlLmxvd2VyKQorICAgICAgICBpZiAocy0+di5TbGljZS51cHBlcikKKyAgICAgICAgICAgIFZJU0lUKHN0LCBleHByLCBzLT52LlNsaWNlLnVwcGVyKQorICAgICAgICBpZiAocy0+di5TbGljZS5zdGVwKQorICAgICAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuU2xpY2Uuc3RlcCkKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFeHRTbGljZV9raW5kOgorICAgICAgICBWSVNJVF9TRVEoc3QsIHNsaWNlLCBzLT52LkV4dFNsaWNlLmRpbXMpCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSW5kZXhfa2luZDoKKyAgICAgICAgVklTSVQoc3QsIGV4cHIsIHMtPnYuSW5kZXgudmFsdWUpCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRWxsaXBzaXNfa2luZDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IAorc3RhdGljIGludAogc3ltdGFibGVfdmlzaXRfZ2VuZXhwKHN0cnVjdCBzeW10YWJsZSAqc3QsIGV4cHJfdHkgZSkKIHsKLQljb21wcmVoZW5zaW9uX3R5IG91dGVybW9zdCA9ICgoY29tcHJlaGVuc2lvbl90eSkKLQkJCSAoYXNkbF9zZXFfR0VUKGUtPnYuR2VuZXJhdG9yRXhwLmdlbmVyYXRvcnMsIDApKSk7Ci0JLyogT3V0ZXJtb3N0IGl0ZXJhdG9yIGlzIGV2YWx1YXRlZCBpbiBjdXJyZW50IHNjb3BlICovCi0JVklTSVQoc3QsIGV4cHIsIG91dGVybW9zdC0+aXRlcik7Ci0JLyogQ3JlYXRlIGdlbmVyYXRvciBzY29wZSBmb3IgdGhlIHJlc3QgKi8KLQlpZiAoIUdFVF9JREVOVElGSUVSKGdlbmV4cHIpIHx8Ci0JICAgICFzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgZ2VuZXhwciwgRnVuY3Rpb25CbG9jaywgKHZvaWQgKillLCBlLT5saW5lbm8pKSB7Ci0JCXJldHVybiAwOwotCX0KLQlzdC0+c3RfY3VyLT5zdGVfZ2VuZXJhdG9yID0gMTsKLQkvKiBPdXRlcm1vc3QgaXRlciBpcyByZWNlaXZlZCBhcyBhbiBhcmd1bWVudCAqLwotCWlmICghc3ltdGFibGVfaW1wbGljaXRfYXJnKHN0LCAwKSkgewotCQlzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0JVklTSVRfSU5fQkxPQ0soc3QsIGV4cHIsIG91dGVybW9zdC0+dGFyZ2V0LCAodm9pZCopZSk7Ci0JVklTSVRfU0VRX0lOX0JMT0NLKHN0LCBleHByLCBvdXRlcm1vc3QtPmlmcywgKHZvaWQqKWUpOwotCVZJU0lUX1NFUV9UQUlMX0lOX0JMT0NLKHN0LCBjb21wcmVoZW5zaW9uLAotCQkJCWUtPnYuR2VuZXJhdG9yRXhwLmdlbmVyYXRvcnMsIDEsICh2b2lkKillKTsKLQlWSVNJVF9JTl9CTE9DSyhzdCwgZXhwciwgZS0+di5HZW5lcmF0b3JFeHAuZWx0LCAodm9pZCopZSk7Ci0JcmV0dXJuIHN5bXRhYmxlX2V4aXRfYmxvY2soc3QsICh2b2lkICopZSk7CisgICAgY29tcHJlaGVuc2lvbl90eSBvdXRlcm1vc3QgPSAoKGNvbXByZWhlbnNpb25fdHkpCisgICAgICAgICAgICAgICAgICAgICAoYXNkbF9zZXFfR0VUKGUtPnYuR2VuZXJhdG9yRXhwLmdlbmVyYXRvcnMsIDApKSk7CisgICAgLyogT3V0ZXJtb3N0IGl0ZXJhdG9yIGlzIGV2YWx1YXRlZCBpbiBjdXJyZW50IHNjb3BlICovCisgICAgVklTSVQoc3QsIGV4cHIsIG91dGVybW9zdC0+aXRlcik7CisgICAgLyogQ3JlYXRlIGdlbmVyYXRvciBzY29wZSBmb3IgdGhlIHJlc3QgKi8KKyAgICBpZiAoIUdFVF9JREVOVElGSUVSKGdlbmV4cHIpIHx8CisgICAgICAgICFzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgZ2VuZXhwciwgRnVuY3Rpb25CbG9jaywgKHZvaWQgKillLCBlLT5saW5lbm8pKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBzdC0+c3RfY3VyLT5zdGVfZ2VuZXJhdG9yID0gMTsKKyAgICAvKiBPdXRlcm1vc3QgaXRlciBpcyByZWNlaXZlZCBhcyBhbiBhcmd1bWVudCAqLworICAgIGlmICghc3ltdGFibGVfaW1wbGljaXRfYXJnKHN0LCAwKSkgeworICAgICAgICBzeW10YWJsZV9leGl0X2Jsb2NrKHN0LCAodm9pZCAqKWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVklTSVRfSU5fQkxPQ0soc3QsIGV4cHIsIG91dGVybW9zdC0+dGFyZ2V0LCAodm9pZCopZSk7CisgICAgVklTSVRfU0VRX0lOX0JMT0NLKHN0LCBleHByLCBvdXRlcm1vc3QtPmlmcywgKHZvaWQqKWUpOworICAgIFZJU0lUX1NFUV9UQUlMX0lOX0JMT0NLKHN0LCBjb21wcmVoZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUtPnYuR2VuZXJhdG9yRXhwLmdlbmVyYXRvcnMsIDEsICh2b2lkKillKTsKKyAgICBWSVNJVF9JTl9CTE9DSyhzdCwgZXhwciwgZS0+di5HZW5lcmF0b3JFeHAuZWx0LCAodm9pZCopZSk7CisgICAgcmV0dXJuIHN5bXRhYmxlX2V4aXRfYmxvY2soc3QsICh2b2lkICopZSk7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vc3lzbW9kdWxlLmMgYi9QeXRob24vc3lzbW9kdWxlLmMKaW5kZXggNzIxZjc3ZC4uNmFhM2NkYiAxMDA2NDQKLS0tIGEvUHl0aG9uL3N5c21vZHVsZS5jCisrKyBiL1B5dGhvbi9zeXNtb2R1bGUuYwpAQCAtNDksNzggKzQ5LDc4IEBACiBQeU9iamVjdCAqCiBQeVN5c19HZXRPYmplY3QoY2hhciAqbmFtZSkKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5T2JqZWN0ICpzZCA9IHRzdGF0ZS0+aW50ZXJwLT5zeXNkaWN0OwotCWlmIChzZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2QsIG5hbWUpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKnNkID0gdHN0YXRlLT5pbnRlcnAtPnN5c2RpY3Q7CisgICAgaWYgKHNkID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeURpY3RfR2V0SXRlbVN0cmluZyhzZCwgbmFtZSk7CiB9CiAKIEZJTEUgKgogUHlTeXNfR2V0RmlsZShjaGFyICpuYW1lLCBGSUxFICpkZWYpCiB7Ci0JRklMRSAqZnAgPSBOVUxMOwotCVB5T2JqZWN0ICp2ID0gUHlTeXNfR2V0T2JqZWN0KG5hbWUpOwotCWlmICh2ICE9IE5VTEwgJiYgUHlGaWxlX0NoZWNrKHYpKQotCQlmcCA9IFB5RmlsZV9Bc0ZpbGUodik7Ci0JaWYgKGZwID09IE5VTEwpCi0JCWZwID0gZGVmOwotCXJldHVybiBmcDsKKyAgICBGSUxFICpmcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnYgPSBQeVN5c19HZXRPYmplY3QobmFtZSk7CisgICAgaWYgKHYgIT0gTlVMTCAmJiBQeUZpbGVfQ2hlY2sodikpCisgICAgICAgIGZwID0gUHlGaWxlX0FzRmlsZSh2KTsKKyAgICBpZiAoZnAgPT0gTlVMTCkKKyAgICAgICAgZnAgPSBkZWY7CisgICAgcmV0dXJuIGZwOwogfQogCiBpbnQKIFB5U3lzX1NldE9iamVjdChjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCVB5T2JqZWN0ICpzZCA9IHRzdGF0ZS0+aW50ZXJwLT5zeXNkaWN0OwotCWlmICh2ID09IE5VTEwpIHsKLQkJaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHNkLCBuYW1lKSA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXJldHVybiBQeURpY3RfRGVsSXRlbVN0cmluZyhzZCwgbmFtZSk7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHNkLCBuYW1lLCB2KTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICpzZCA9IHRzdGF0ZS0+aW50ZXJwLT5zeXNkaWN0OworICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RGljdF9HZXRJdGVtU3RyaW5nKHNkLCBuYW1lKSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeURpY3RfRGVsSXRlbVN0cmluZyhzZCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5RGljdF9TZXRJdGVtU3RyaW5nKHNkLCBuYW1lLCB2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19kaXNwbGF5aG9vayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm8pCiB7Ci0JUHlPYmplY3QgKm91dGY7Ci0JUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7Ci0JUHlPYmplY3QgKm1vZHVsZXMgPSBpbnRlcnAtPm1vZHVsZXM7Ci0JUHlPYmplY3QgKmJ1aWx0aW5zID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fYnVpbHRpbl9fIik7CisgICAgUHlPYmplY3QgKm91dGY7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAgPSBQeVRocmVhZFN0YXRlX0dFVCgpLT5pbnRlcnA7CisgICAgUHlPYmplY3QgKm1vZHVsZXMgPSBpbnRlcnAtPm1vZHVsZXM7CisgICAgUHlPYmplY3QgKmJ1aWx0aW5zID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kdWxlcywgIl9fYnVpbHRpbl9fIik7CiAKLQlpZiAoYnVpbHRpbnMgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibG9zdCBfX2J1aWx0aW5fXyIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgaWYgKGJ1aWx0aW5zID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImxvc3QgX19idWlsdGluX18iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JLyogUHJpbnQgdmFsdWUgZXhjZXB0IGlmIE5vbmUgKi8KLQkvKiBBZnRlciBwcmludGluZywgYWxzbyBhc3NpZ24gdG8gJ18nICovCi0JLyogQmVmb3JlLCBzZXQgJ18nIHRvIE5vbmUgdG8gYXZvaWQgcmVjdXJzaW9uICovCi0JaWYgKG8gPT0gUHlfTm9uZSkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhidWlsdGlucywgIl8iLCBQeV9Ob25lKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoUHlfRmx1c2hMaW5lKCkgIT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jb3V0ZiA9IFB5U3lzX0dldE9iamVjdCgic3Rkb3V0Iik7Ci0JaWYgKG91dGYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAibG9zdCBzeXMuc3Rkb3V0Iik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoUHlGaWxlX1dyaXRlT2JqZWN0KG8sIG91dGYsIDApICE9IDApCi0JCXJldHVybiBOVUxMOwotCVB5RmlsZV9Tb2Z0U3BhY2Uob3V0ZiwgMSk7Ci0JaWYgKFB5X0ZsdXNoTGluZSgpICE9IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGJ1aWx0aW5zLCAiXyIsIG8pICE9IDApCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICAvKiBQcmludCB2YWx1ZSBleGNlcHQgaWYgTm9uZSAqLworICAgIC8qIEFmdGVyIHByaW50aW5nLCBhbHNvIGFzc2lnbiB0byAnXycgKi8KKyAgICAvKiBCZWZvcmUsIHNldCAnXycgdG8gTm9uZSB0byBhdm9pZCByZWN1cnNpb24gKi8KKyAgICBpZiAobyA9PSBQeV9Ob25lKSB7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGJ1aWx0aW5zLCAiXyIsIFB5X05vbmUpICE9IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeV9GbHVzaExpbmUoKSAhPSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvdXRmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRvdXQiKTsKKyAgICBpZiAob3V0ZiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJsb3N0IHN5cy5zdGRvdXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChQeUZpbGVfV3JpdGVPYmplY3Qobywgb3V0ZiwgMCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlGaWxlX1NvZnRTcGFjZShvdXRmLCAxKTsKKyAgICBpZiAoUHlfRmx1c2hMaW5lKCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoYnVpbHRpbnMsICJfIiwgbykgIT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZGlzcGxheWhvb2tfZG9jLApAQCAtMTMyLDEyICsxMzIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZXhjZXB0aG9vayhQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JUHlPYmplY3QgKmV4YywgKnZhbHVlLCAqdGI7Ci0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZXhjZXB0aG9vayIsIDMsIDMsICZleGMsICZ2YWx1ZSwgJnRiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlFcnJfRGlzcGxheShleGMsIHZhbHVlLCB0Yik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5T2JqZWN0ICpleGMsICp2YWx1ZSwgKnRiOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImV4Y2VwdGhvb2siLCAzLCAzLCAmZXhjLCAmdmFsdWUsICZ0YikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5RXJyX0Rpc3BsYXkoZXhjLCB2YWx1ZSwgdGIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKGV4Y2VwdGhvb2tfZG9jLApAQCAtMTQ5LDE0ICsxNDksMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZXhjX2luZm8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwotCXRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoCi0JCSIoT09PKSIsCi0JCXRzdGF0ZS0+ZXhjX3R5cGUgIT0gTlVMTCA/IHRzdGF0ZS0+ZXhjX3R5cGUgOiBQeV9Ob25lLAotCQl0c3RhdGUtPmV4Y192YWx1ZSAhPSBOVUxMID8gdHN0YXRlLT5leGNfdmFsdWUgOiBQeV9Ob25lLAotCQl0c3RhdGUtPmV4Y190cmFjZWJhY2sgIT0gTlVMTCA/Ci0JCQl0c3RhdGUtPmV4Y190cmFjZWJhY2sgOiBQeV9Ob25lKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7CisgICAgdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgKKyAgICAgICAgIihPT08pIiwKKyAgICAgICAgdHN0YXRlLT5leGNfdHlwZSAhPSBOVUxMID8gdHN0YXRlLT5leGNfdHlwZSA6IFB5X05vbmUsCisgICAgICAgIHRzdGF0ZS0+ZXhjX3ZhbHVlICE9IE5VTEwgPyB0c3RhdGUtPmV4Y192YWx1ZSA6IFB5X05vbmUsCisgICAgICAgIHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayAhPSBOVUxMID8KKyAgICAgICAgICAgIHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayA6IFB5X05vbmUpOwogfQogCiBQeURvY19TVFJWQVIoZXhjX2luZm9fZG9jLApAQCAtMTY5LDI5ICsxNjksMjkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZXhjX2NsZWFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKLQlQeU9iamVjdCAqdG1wX3R5cGUsICp0bXBfdmFsdWUsICp0bXBfdGI7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIFB5T2JqZWN0ICp0bXBfdHlwZSwgKnRtcF92YWx1ZSwgKnRtcF90YjsKIAotCWlmIChQeUVycl9XYXJuUHkzaygic3lzLmV4Y19jbGVhcigpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyAiCi0JCQkgICAidXNlIGV4Y2VwdCBjbGF1c2VzIiwgMSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soInN5cy5leGNfY2xlYXIoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgIgorICAgICAgICAgICAgICAgICAgICAgICAidXNlIGV4Y2VwdCBjbGF1c2VzIiwgMSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCXRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JdG1wX3R5cGUgPSB0c3RhdGUtPmV4Y190eXBlOwotCXRtcF92YWx1ZSA9IHRzdGF0ZS0+ZXhjX3ZhbHVlOwotCXRtcF90YiA9IHRzdGF0ZS0+ZXhjX3RyYWNlYmFjazsKLQl0c3RhdGUtPmV4Y190eXBlID0gTlVMTDsKLQl0c3RhdGUtPmV4Y192YWx1ZSA9IE5VTEw7Ci0JdHN0YXRlLT5leGNfdHJhY2ViYWNrID0gTlVMTDsKLQlQeV9YREVDUkVGKHRtcF90eXBlKTsKLQlQeV9YREVDUkVGKHRtcF92YWx1ZSk7Ci0JUHlfWERFQ1JFRih0bXBfdGIpOwotCS8qIEZvciBiL3cgY29tcGF0aWJpbGl0eSAqLwotCVB5U3lzX1NldE9iamVjdCgiZXhjX3R5cGUiLCBQeV9Ob25lKTsKLQlQeVN5c19TZXRPYmplY3QoImV4Y192YWx1ZSIsIFB5X05vbmUpOwotCVB5U3lzX1NldE9iamVjdCgiZXhjX3RyYWNlYmFjayIsIFB5X05vbmUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIHRtcF90eXBlID0gdHN0YXRlLT5leGNfdHlwZTsKKyAgICB0bXBfdmFsdWUgPSB0c3RhdGUtPmV4Y192YWx1ZTsKKyAgICB0bXBfdGIgPSB0c3RhdGUtPmV4Y190cmFjZWJhY2s7CisgICAgdHN0YXRlLT5leGNfdHlwZSA9IE5VTEw7CisgICAgdHN0YXRlLT5leGNfdmFsdWUgPSBOVUxMOworICAgIHRzdGF0ZS0+ZXhjX3RyYWNlYmFjayA9IE5VTEw7CisgICAgUHlfWERFQ1JFRih0bXBfdHlwZSk7CisgICAgUHlfWERFQ1JFRih0bXBfdmFsdWUpOworICAgIFB5X1hERUNSRUYodG1wX3RiKTsKKyAgICAvKiBGb3IgYi93IGNvbXBhdGliaWxpdHkgKi8KKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y190eXBlIiwgUHlfTm9uZSk7CisgICAgUHlTeXNfU2V0T2JqZWN0KCJleGNfdmFsdWUiLCBQeV9Ob25lKTsKKyAgICBQeVN5c19TZXRPYmplY3QoImV4Y190cmFjZWJhY2siLCBQeV9Ob25lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihleGNfY2xlYXJfZG9jLApAQCAtMjA2LDEyICsyMDYsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZXhpdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmV4aXRfY29kZSA9IDA7Ci0JaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZXhpdCIsIDAsIDEsICZleGl0X2NvZGUpKQotCQlyZXR1cm4gTlVMTDsKLQkvKiBSYWlzZSBTeXN0ZW1FeGl0IHNvIGNhbGxlcnMgbWF5IGNhdGNoIGl0IG9yIGNsZWFuIHVwLiAqLwotCVB5RXJyX1NldE9iamVjdChQeUV4Y19TeXN0ZW1FeGl0LCBleGl0X2NvZGUpOwotCXJldHVybiBOVUxMOworICAgIFB5T2JqZWN0ICpleGl0X2NvZGUgPSAwOworICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImV4aXQiLCAwLCAxLCAmZXhpdF9jb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogUmFpc2UgU3lzdGVtRXhpdCBzbyBjYWxsZXJzIG1heSBjYXRjaCBpdCBvciBjbGVhbiB1cC4gKi8KKyAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfU3lzdGVtRXhpdCwgZXhpdF9jb2RlKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKGV4aXRfZG9jLApAQCAtMjI5LDcgKzIyOSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldGRlZmF1bHRlbmNvZGluZyhQeU9iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKCkpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcoKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRkZWZhdWx0ZW5jb2RpbmdfZG9jLApAQCAtMjQyLDEzICsyNDIsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfc2V0ZGVmYXVsdGVuY29kaW5nKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICplbmNvZGluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6c2V0ZGVmYXVsdGVuY29kaW5nIiwgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2RpbmcoZW5jb2RpbmcpKQotCSAgICAJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGNoYXIgKmVuY29kaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzZXRkZWZhdWx0ZW5jb2RpbmciLCAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldGRlZmF1bHRlbmNvZGluZ19kb2MsCkBAIC0yNjAsMTAgKzI2MCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXRmaWxlc3lzdGVtZW5jb2RpbmcoUHlPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpCi0JCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZykKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoZ2V0ZmlsZXN5c3RlbWVuY29kaW5nX2RvYywKQEAgLTI4NCwxMTYgKzI4NCwxMTYgQEAKIHN0YXRpYyBpbnQKIHRyYWNlX2luaXQodm9pZCkKIHsKLQlzdGF0aWMgY2hhciAqd2hhdG5hbWVzWzddID0geyJjYWxsIiwgImV4Y2VwdGlvbiIsICJsaW5lIiwgInJldHVybiIsCi0JCQkJCSJjX2NhbGwiLCAiY19leGNlcHRpb24iLCAiY19yZXR1cm4ifTsKLQlQeU9iamVjdCAqbmFtZTsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7Ci0JCWlmICh3aGF0c3RyaW5nc1tpXSA9PSBOVUxMKSB7Ci0JCQluYW1lID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyh3aGF0bmFtZXNbaV0pOwotCQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQl3aGF0c3RyaW5nc1tpXSA9IG5hbWU7Ci0gICAgICAgICAgICAgICAgfQotCX0KLQlyZXR1cm4gMDsKKyAgICBzdGF0aWMgY2hhciAqd2hhdG5hbWVzWzddID0geyJjYWxsIiwgImV4Y2VwdGlvbiIsICJsaW5lIiwgInJldHVybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY19jYWxsIiwgImNfZXhjZXB0aW9uIiwgImNfcmV0dXJuIn07CisgICAgUHlPYmplY3QgKm5hbWU7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDc7ICsraSkgeworICAgICAgICBpZiAod2hhdHN0cmluZ3NbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgbmFtZSA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcod2hhdG5hbWVzW2ldKTsKKyAgICAgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgd2hhdHN0cmluZ3NbaV0gPSBuYW1lOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsX3RyYW1wb2xpbmUoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlLCBQeU9iamVjdCogY2FsbGJhY2ssCi0JCVB5RnJhbWVPYmplY3QgKmZyYW1lLCBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKKyAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICpmcmFtZSwgaW50IHdoYXQsIFB5T2JqZWN0ICphcmcpCiB7Ci0JUHlPYmplY3QgKmFyZ3MgPSBQeVR1cGxlX05ldygzKTsKLQlQeU9iamVjdCAqd2hhdHN0cjsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMyk7CisgICAgUHlPYmplY3QgKndoYXRzdHI7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKIAotCWlmIChhcmdzID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihmcmFtZSk7Ci0Jd2hhdHN0ciA9IHdoYXRzdHJpbmdzW3doYXRdOwotCVB5X0lOQ1JFRih3aGF0c3RyKTsKLQlpZiAoYXJnID09IE5VTEwpCi0JCWFyZyA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKGFyZyk7Ci0JUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCAoUHlPYmplY3QgKilmcmFtZSk7Ci0JUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAxLCB3aGF0c3RyKTsKLQlQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDIsIGFyZyk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKGZyYW1lKTsKKyAgICB3aGF0c3RyID0gd2hhdHN0cmluZ3Nbd2hhdF07CisgICAgUHlfSU5DUkVGKHdoYXRzdHIpOworICAgIGlmIChhcmcgPT0gTlVMTCkKKyAgICAgICAgYXJnID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoYXJnKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIChQeU9iamVjdCAqKWZyYW1lKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDEsIHdoYXRzdHIpOworICAgIFB5VHVwbGVfU0VUX0lURU0oYXJncywgMiwgYXJnKTsKIAotCS8qIGNhbGwgdGhlIFB5dGhvbi1sZXZlbCBmdW5jdGlvbiAqLwotCVB5RnJhbWVfRmFzdFRvTG9jYWxzKGZyYW1lKTsKLQlyZXN1bHQgPSBQeUV2YWxfQ2FsbE9iamVjdChjYWxsYmFjaywgYXJncyk7Ci0JUHlGcmFtZV9Mb2NhbHNUb0Zhc3QoZnJhbWUsIDEpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkKLQkJUHlUcmFjZUJhY2tfSGVyZShmcmFtZSk7CisgICAgLyogY2FsbCB0aGUgUHl0aG9uLWxldmVsIGZ1bmN0aW9uICovCisgICAgUHlGcmFtZV9GYXN0VG9Mb2NhbHMoZnJhbWUpOworICAgIHJlc3VsdCA9IFB5RXZhbF9DYWxsT2JqZWN0KGNhbGxiYWNrLCBhcmdzKTsKKyAgICBQeUZyYW1lX0xvY2Fsc1RvRmFzdChmcmFtZSwgMSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICBQeVRyYWNlQmFja19IZXJlKGZyYW1lKTsKIAotCS8qIGNsZWFudXAgKi8KLQlQeV9ERUNSRUYoYXJncyk7Ci0JcmV0dXJuIHJlc3VsdDsKKyAgICAvKiBjbGVhbnVwICovCisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQKIHByb2ZpbGVfdHJhbXBvbGluZShQeU9iamVjdCAqc2VsZiwgUHlGcmFtZU9iamVjdCAqZnJhbWUsCi0JCSAgIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQorICAgICAgICAgICAgICAgICAgIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IGZyYW1lLT5mX3RzdGF0ZTsKLQlQeU9iamVjdCAqcmVzdWx0OworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IGZyYW1lLT5mX3RzdGF0ZTsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKGFyZyA9PSBOVUxMKQotCQlhcmcgPSBQeV9Ob25lOwotCXJlc3VsdCA9IGNhbGxfdHJhbXBvbGluZSh0c3RhdGUsIHNlbGYsIGZyYW1lLCB3aGF0LCBhcmcpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgewotCQlQeUV2YWxfU2V0UHJvZmlsZShOVUxMLCBOVUxMKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9ERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoYXJnID09IE5VTEwpCisgICAgICAgIGFyZyA9IFB5X05vbmU7CisgICAgcmVzdWx0ID0gY2FsbF90cmFtcG9saW5lKHRzdGF0ZSwgc2VsZiwgZnJhbWUsIHdoYXQsIGFyZyk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIFB5RXZhbF9TZXRQcm9maWxlKE5VTEwsIE5VTEwpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CiB0cmFjZV90cmFtcG9saW5lKFB5T2JqZWN0ICpzZWxmLCBQeUZyYW1lT2JqZWN0ICpmcmFtZSwKLQkJIGludCB3aGF0LCBQeU9iamVjdCAqYXJnKQorICAgICAgICAgICAgICAgICBpbnQgd2hhdCwgUHlPYmplY3QgKmFyZykKIHsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBmcmFtZS0+Zl90c3RhdGU7Ci0JUHlPYmplY3QgKmNhbGxiYWNrOwotCVB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gZnJhbWUtPmZfdHN0YXRlOworICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0JaWYgKHdoYXQgPT0gUHlUcmFjZV9DQUxMKQotCQljYWxsYmFjayA9IHNlbGY7Ci0JZWxzZQotCQljYWxsYmFjayA9IGZyYW1lLT5mX3RyYWNlOwotCWlmIChjYWxsYmFjayA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlyZXN1bHQgPSBjYWxsX3RyYW1wb2xpbmUodHN0YXRlLCBjYWxsYmFjaywgZnJhbWUsIHdoYXQsIGFyZyk7Ci0JaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0JCVB5RXZhbF9TZXRUcmFjZShOVUxMLCBOVUxMKTsKLQkJUHlfWERFQ1JFRihmcmFtZS0+Zl90cmFjZSk7Ci0JCWZyYW1lLT5mX3RyYWNlID0gTlVMTDsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAocmVzdWx0ICE9IFB5X05vbmUpIHsKLQkJUHlPYmplY3QgKnRlbXAgPSBmcmFtZS0+Zl90cmFjZTsKLQkJZnJhbWUtPmZfdHJhY2UgPSBOVUxMOwotCQlQeV9YREVDUkVGKHRlbXApOwotCQlmcmFtZS0+Zl90cmFjZSA9IHJlc3VsdDsKLQl9Ci0JZWxzZSB7Ci0JCVB5X0RFQ1JFRihyZXN1bHQpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAod2hhdCA9PSBQeVRyYWNlX0NBTEwpCisgICAgICAgIGNhbGxiYWNrID0gc2VsZjsKKyAgICBlbHNlCisgICAgICAgIGNhbGxiYWNrID0gZnJhbWUtPmZfdHJhY2U7CisgICAgaWYgKGNhbGxiYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIHJlc3VsdCA9IGNhbGxfdHJhbXBvbGluZSh0c3RhdGUsIGNhbGxiYWNrLCBmcmFtZSwgd2hhdCwgYXJnKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgUHlFdmFsX1NldFRyYWNlKE5VTEwsIE5VTEwpOworICAgICAgICBQeV9YREVDUkVGKGZyYW1lLT5mX3RyYWNlKTsKKyAgICAgICAgZnJhbWUtPmZfdHJhY2UgPSBOVUxMOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZXN1bHQgIT0gUHlfTm9uZSkgeworICAgICAgICBQeU9iamVjdCAqdGVtcCA9IGZyYW1lLT5mX3RyYWNlOworICAgICAgICBmcmFtZS0+Zl90cmFjZSA9IE5VTEw7CisgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgICAgIGZyYW1lLT5mX3RyYWNlID0gcmVzdWx0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX3NldHRyYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAodHJhY2VfaW5pdCgpID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoYXJncyA9PSBQeV9Ob25lKQotCQlQeUV2YWxfU2V0VHJhY2UoTlVMTCwgTlVMTCk7Ci0JZWxzZQotCQlQeUV2YWxfU2V0VHJhY2UodHJhY2VfdHJhbXBvbGluZSwgYXJncyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICh0cmFjZV9pbml0KCkgPT0gLTEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChhcmdzID09IFB5X05vbmUpCisgICAgICAgIFB5RXZhbF9TZXRUcmFjZShOVUxMLCBOVUxMKTsKKyAgICBlbHNlCisgICAgICAgIFB5RXZhbF9TZXRUcmFjZSh0cmFjZV90cmFtcG9saW5lLCBhcmdzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXR0cmFjZV9kb2MsCkBAIC00MDYsMTMgKzQwNiwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXR0cmFjZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqdGVtcCA9IHRzdGF0ZS0+Y190cmFjZW9iajsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIFB5T2JqZWN0ICp0ZW1wID0gdHN0YXRlLT5jX3RyYWNlb2JqOwogCi0JaWYgKHRlbXAgPT0gTlVMTCkKLQkJdGVtcCA9IFB5X05vbmU7Ci0JUHlfSU5DUkVGKHRlbXApOwotCXJldHVybiB0ZW1wOworICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgIHRlbXAgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRih0ZW1wKTsKKyAgICByZXR1cm4gdGVtcDsKIH0KIAogUHlEb2NfU1RSVkFSKGdldHRyYWNlX2RvYywKQEAgLTQyNSwxNCArNDI1LDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX3NldHByb2ZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICh0cmFjZV9pbml0KCkgPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCWlmIChhcmdzID09IFB5X05vbmUpCi0JCVB5RXZhbF9TZXRQcm9maWxlKE5VTEwsIE5VTEwpOwotCWVsc2UKLQkJUHlFdmFsX1NldFByb2ZpbGUocHJvZmlsZV90cmFtcG9saW5lLCBhcmdzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHRyYWNlX2luaXQoKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFyZ3MgPT0gUHlfTm9uZSkKKyAgICAgICAgUHlFdmFsX1NldFByb2ZpbGUoTlVMTCwgTlVMTCk7CisgICAgZWxzZQorICAgICAgICBQeUV2YWxfU2V0UHJvZmlsZShwcm9maWxlX3RyYW1wb2xpbmUsIGFyZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldHByb2ZpbGVfZG9jLApAQCAtNDQ1LDEzICs0NDUsMTMgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0cHJvZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLQlQeU9iamVjdCAqdGVtcCA9IHRzdGF0ZS0+Y19wcm9maWxlb2JqOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlPYmplY3QgKnRlbXAgPSB0c3RhdGUtPmNfcHJvZmlsZW9iajsKIAotCWlmICh0ZW1wID09IE5VTEwpCi0JCXRlbXAgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRih0ZW1wKTsKLQlyZXR1cm4gdGVtcDsKKyAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICB0ZW1wID0gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYodGVtcCk7CisgICAgcmV0dXJuIHRlbXA7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRwcm9maWxlX2RvYywKQEAgLTQ2NCwxMCArNDY0LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX3NldGNoZWNraW50ZXJ2YWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRjaGVja2ludGVydmFsIiwgJl9QeV9DaGVja0ludGVydmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRjaGVja2ludGVydmFsIiwgJl9QeV9DaGVja0ludGVydmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2V0Y2hlY2tpbnRlcnZhbF9kb2MsCkBAIC00ODAsNyArNDgwLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfZ2V0Y2hlY2tpbnRlcnZhbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKF9QeV9DaGVja0ludGVydmFsKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoX1B5X0NoZWNrSW50ZXJ2YWwpOwogfQogCiBQeURvY19TVFJWQVIoZ2V0Y2hlY2tpbnRlcnZhbF9kb2MsCkBAIC00OTEsMTcgKzQ5MSwxNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19zZXR0c2NkdW1wKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgYm9vbDsKLQlQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIGludCBib29sOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR2V0KCk7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0dHNjZHVtcCIsICZib29sKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGJvb2wpCi0JCXRzdGF0ZS0+aW50ZXJwLT50c2NkdW1wID0gMTsKLQllbHNlCi0JCXRzdGF0ZS0+aW50ZXJwLT50c2NkdW1wID0gMDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnNldHRzY2R1bXAiLCAmYm9vbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChib29sKQorICAgICAgICB0c3RhdGUtPmludGVycC0+dHNjZHVtcCA9IDE7CisgICAgZWxzZQorICAgICAgICB0c3RhdGUtPmludGVycC0+dHNjZHVtcCA9IDA7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogCiB9CiAKQEAgLTUxNywxNyArNTE3LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX3NldHJlY3Vyc2lvbmxpbWl0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpbnQgbmV3X2xpbWl0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRyZWN1cnNpb25saW1pdCIsICZuZXdfbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAobmV3X2xpbWl0IDw9IDApIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0JCQkJInJlY3Vyc2lvbiBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9TZXRSZWN1cnNpb25MaW1pdChuZXdfbGltaXQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgbmV3X2xpbWl0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRyZWN1cnNpb25saW1pdCIsICZuZXdfbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAobmV3X2xpbWl0IDw9IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVjdXJzaW9uIGxpbWl0IG11c3QgYmUgcG9zaXRpdmUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1NldFJlY3Vyc2lvbkxpbWl0KG5ld19saW1pdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBQeURvY19TVFJWQVIoc2V0cmVjdXJzaW9ubGltaXRfZG9jLApAQCAtNTQyLDcgKzU0Miw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldHJlY3Vyc2lvbmxpbWl0KFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeUludF9Gcm9tTG9uZyhQeV9HZXRSZWN1cnNpb25MaW1pdCgpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoUHlfR2V0UmVjdXJzaW9uTGltaXQoKSk7CiB9CiAKIFB5RG9jX1NUUlZBUihnZXRyZWN1cnNpb25saW1pdF9kb2MsCkBAIC01NjcsMTYgKzU2NywxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXR3aW5kb3dzdmVyc2lvbihQeU9iamVjdCAqc2VsZikKIHsKLQlPU1ZFUlNJT05JTkZPIHZlcjsKLQl2ZXIuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZih2ZXIpOwotCWlmICghR2V0VmVyc2lvbkV4KCZ2ZXIpKQotCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoMCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIkhISEhzIiwKLQkgICAgICAgICAgICAgICAgICAgICB2ZXIuZHdNYWpvclZlcnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgdmVyLmR3TWlub3JWZXJzaW9uLAotCSAgICAgICAgICAgICAgICAgICAgIHZlci5kd0J1aWxkTnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgIHZlci5kd1BsYXRmb3JtSWQsCi0JICAgICAgICAgICAgICAgICAgICAgdmVyLnN6Q1NEVmVyc2lvbik7CisgICAgT1NWRVJTSU9OSU5GTyB2ZXI7CisgICAgdmVyLmR3T1NWZXJzaW9uSW5mb1NpemUgPSBzaXplb2YodmVyKTsKKyAgICBpZiAoIUdldFZlcnNpb25FeCgmdmVyKSkKKyAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKDApOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJISEhIcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmVyLmR3TWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZlci5kd01pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXIuZHdCdWlsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXIuZHdQbGF0Zm9ybUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZlci5zekNTRFZlcnNpb24pOwogfQogCiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwpAQCAtNTg1LDE1ICs1ODUsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfc2V0ZGxvcGVuZmxhZ3MoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBuZXdfdmFsOwotICAgICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpzZXRkbG9wZW5mbGFncyIsICZuZXdfdmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICghdHN0YXRlKQotCQlyZXR1cm4gTlVMTDsKLSAgICAgICAgdHN0YXRlLT5pbnRlcnAtPmRsb3BlbmZsYWdzID0gbmV3X3ZhbDsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IG5ld192YWw7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6c2V0ZGxvcGVuZmxhZ3MiLCAmbmV3X3ZhbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghdHN0YXRlKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0c3RhdGUtPmludGVycC0+ZGxvcGVuZmxhZ3MgPSBuZXdfdmFsOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogUHlEb2NfU1RSVkFSKHNldGRsb3BlbmZsYWdzX2RvYywKQEAgLTYwOSwxMCArNjA5LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldGRsb3BlbmZsYWdzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HRVQoKTsKLSAgICAgICAgaWYgKCF0c3RhdGUpCi0JCXJldHVybiBOVUxMOwotICAgICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodHN0YXRlLT5pbnRlcnAtPmRsb3BlbmZsYWdzKTsKKyAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOworICAgIGlmICghdHN0YXRlKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodHN0YXRlLT5pbnRlcnAtPmRsb3BlbmZsYWdzKTsKIH0KIAogUHlEb2NfU1RSVkFSKGdldGRsb3BlbmZsYWdzX2RvYywKQEAgLTYzMCw3OCArNjMwLDc4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX21kZWJ1ZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGZsYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOm1kZWJ1ZyIsICZmbGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbWFsbG9wdChNX0RFQlVHLCBmbGFnKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaW50IGZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOm1kZWJ1ZyIsICZmbGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbWFsbG9wdChNX0RFQlVHLCBmbGFnKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYgLyogVVNFX01BTExPUFQgKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXRzaXplb2YoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqcmVzID0gTlVMTDsKLQlzdGF0aWMgUHlPYmplY3QgKnN0cl9fc2l6ZW9mX18sICpnY19oZWFkX3NpemUgPSBOVUxMOwotCXN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsib2JqZWN0IiwgImRlZmF1bHQiLCAwfTsKLQlQeU9iamVjdCAqbywgKmRmbHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIHN0YXRpYyBQeU9iamVjdCAqc3RyX19zaXplb2ZfXywgKmdjX2hlYWRfc2l6ZSA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJvYmplY3QiLCAiZGVmYXVsdCIsIDB9OworICAgIFB5T2JqZWN0ICpvLCAqZGZsdCA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPOmdldHNpemVvZiIsCi0JCQkJCSBrd2xpc3QsICZvLCAmZGZsdCkpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE86Z2V0c2l6ZW9mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2xpc3QsICZvLCAmZGZsdCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGUgbmVlZGVkIGJ5IF9QeVR5cGVfTG9va3VwICovCi0JaWYgKHN0cl9fc2l6ZW9mX18gPT0gTlVMTCkgewotCQlzdHJfX3NpemVvZl9fID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygiX19zaXplb2ZfXyIpOwotCQlpZiAoc3RyX19zaXplb2ZfXyA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgc3RhdGljIHZhcmlhYmxlIG5lZWRlZCBieSBfUHlUeXBlX0xvb2t1cCAqLworICAgIGlmIChzdHJfX3NpemVvZl9fID09IE5VTEwpIHsKKyAgICAgICAgc3RyX19zaXplb2ZfXyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoIl9fc2l6ZW9mX18iKTsKKyAgICAgICAgaWYgKHN0cl9fc2l6ZW9mX18gPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgICAgICAvKiBJbml0aWFsaXplIHN0YXRpYyB2YXJpYWJsZSBmb3IgR0MgaGVhZCBzaXplICovCi0JaWYgKGdjX2hlYWRfc2l6ZSA9PSBOVUxMKSB7Ci0JCWdjX2hlYWRfc2l6ZSA9IFB5SW50X0Zyb21Tc2l6ZV90KHNpemVvZihQeUdDX0hlYWQpKTsKLQkJaWYgKGdjX2hlYWRfc2l6ZSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIC8qIEluaXRpYWxpemUgc3RhdGljIHZhcmlhYmxlIGZvciBHQyBoZWFkIHNpemUgKi8KKyAgICBpZiAoZ2NfaGVhZF9zaXplID09IE5VTEwpIHsKKyAgICAgICAgZ2NfaGVhZF9zaXplID0gUHlJbnRfRnJvbVNzaXplX3Qoc2l6ZW9mKFB5R0NfSGVhZCkpOworICAgICAgICBpZiAoZ2NfaGVhZF9zaXplID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQkvKiBNYWtlIHN1cmUgdGhlIHR5cGUgaXMgaW5pdGlhbGl6ZWQuIGZsb2F0IGdldHMgaW5pdGlhbGl6ZWQgbGF0ZSAqLwotCWlmIChQeVR5cGVfUmVhZHkoUHlfVFlQRShvKSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiBNYWtlIHN1cmUgdGhlIHR5cGUgaXMgaW5pdGlhbGl6ZWQuIGZsb2F0IGdldHMgaW5pdGlhbGl6ZWQgbGF0ZSAqLworICAgIGlmIChQeVR5cGVfUmVhZHkoUHlfVFlQRShvKSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIEluc3RhbmNlIG9mIG9sZC1zdHlsZSBjbGFzcyAqLwotCWlmIChQeUluc3RhbmNlX0NoZWNrKG8pKQotCQlyZXMgPSBQeUludF9Gcm9tU3NpemVfdChQeUluc3RhbmNlX1R5cGUudHBfYmFzaWNzaXplKTsKLQkvKiBhbGwgb3RoZXIgb2JqZWN0cyAqLwotCWVsc2UgewotCQlQeU9iamVjdCAqbWV0aG9kID0gX1B5VHlwZV9Mb29rdXAoUHlfVFlQRShvKSwKLQkJCQkJCSAgc3RyX19zaXplb2ZfXyk7Ci0JCWlmIChtZXRob2QgPT0gTlVMTCkKLQkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCQkJICAgICAiVHlwZSAlLjEwMHMgZG9lc24ndCBkZWZpbmUgX19zaXplb2ZfXyIsCi0JCQkJICAgICBQeV9UWVBFKG8pLT50cF9uYW1lKTsKLQkJZWxzZQotCQkJcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhtZXRob2QsIG8sIE5VTEwpOwotCX0KLQkKLQkvKiBIYXMgYSBkZWZhdWx0IHZhbHVlIGJlZW4gZ2l2ZW4/ICovCi0JaWYgKChyZXMgPT0gTlVMTCkgJiYgKGRmbHQgIT0gTlVMTCkgJiYKLQkgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotCXsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJUHlfSU5DUkVGKGRmbHQpOwotCQlyZXR1cm4gZGZsdDsKLQl9Ci0JZWxzZSBpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiByZXM7CisgICAgLyogSW5zdGFuY2Ugb2Ygb2xkLXN0eWxlIGNsYXNzICovCisgICAgaWYgKFB5SW5zdGFuY2VfQ2hlY2sobykpCisgICAgICAgIHJlcyA9IFB5SW50X0Zyb21Tc2l6ZV90KFB5SW5zdGFuY2VfVHlwZS50cF9iYXNpY3NpemUpOworICAgIC8qIGFsbCBvdGhlciBvYmplY3RzICovCisgICAgZWxzZSB7CisgICAgICAgIFB5T2JqZWN0ICptZXRob2QgPSBfUHlUeXBlX0xvb2t1cChQeV9UWVBFKG8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX19zaXplb2ZfXyk7CisgICAgICAgIGlmIChtZXRob2QgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlR5cGUgJS4xMDBzIGRvZXNuJ3QgZGVmaW5lIF9fc2l6ZW9mX18iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUobyktPnRwX25hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKG1ldGhvZCwgbywgTlVMTCk7CisgICAgfQogCi0JLyogYWRkIGdjX2hlYWQgc2l6ZSAqLwotCWlmIChQeU9iamVjdF9JU19HQyhvKSkgewotCQlQeU9iamVjdCAqdG1wID0gcmVzOwotCQlyZXMgPSBQeU51bWJlcl9BZGQodG1wLCBnY19oZWFkX3NpemUpOwotCQlQeV9ERUNSRUYodG1wKTsKLQl9Ci0JcmV0dXJuIHJlczsKKyAgICAvKiBIYXMgYSBkZWZhdWx0IHZhbHVlIGJlZW4gZ2l2ZW4/ICovCisgICAgaWYgKChyZXMgPT0gTlVMTCkgJiYgKGRmbHQgIT0gTlVMTCkgJiYKKyAgICAgICAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQorICAgIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfSU5DUkVGKGRmbHQpOworICAgICAgICByZXR1cm4gZGZsdDsKKyAgICB9CisgICAgZWxzZSBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICAvKiBhZGQgZ2NfaGVhZCBzaXplICovCisgICAgaWYgKFB5T2JqZWN0X0lTX0dDKG8pKSB7CisgICAgICAgIFB5T2JqZWN0ICp0bXAgPSByZXM7CisgICAgICAgIHJlcyA9IFB5TnVtYmVyX0FkZCh0bXAsIGdjX2hlYWRfc2l6ZSk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgIH0KKyAgICByZXR1cm4gcmVzOwogfQogCiBQeURvY19TVFJWQVIoZ2V0c2l6ZW9mX2RvYywKQEAgLTcxMiwxNCArNzEyLDE0IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldHJlZmNvdW50KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChhcmctPm9iX3JlZmNudCk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KGFyZy0+b2JfcmVmY250KTsKIH0KIAogI2lmZGVmIFB5X1JFRl9ERUJVRwogc3RhdGljIFB5T2JqZWN0ICoKIHN5c19nZXR0b3RhbHJlZmNvdW50KFB5T2JqZWN0ICpzZWxmKQogewotCXJldHVybiBQeUludF9Gcm9tU3NpemVfdChfUHlfR2V0UmVmVG90YWwoKSk7CisgICAgcmV0dXJuIFB5SW50X0Zyb21Tc2l6ZV90KF9QeV9HZXRSZWZUb3RhbCgpKTsKIH0KICNlbmRpZiAvKiBQeV9SRUZfREVCVUcgKi8KIApAQCAtNzM1LDkgKzczNSw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldGNvdW50cyhQeU9iamVjdCAqc2VsZikKIHsKLQlleHRlcm4gUHlPYmplY3QgKmdldF9jb3VudHModm9pZCk7CisgICAgZXh0ZXJuIFB5T2JqZWN0ICpnZXRfY291bnRzKHZvaWQpOwogCi0JcmV0dXJuIGdldF9jb3VudHMoKTsKKyAgICByZXR1cm4gZ2V0X2NvdW50cygpOwogfQogI2VuZGlmCiAKQEAgLTc1NiwyMyArNzU2LDIzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2dldGZyYW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlQeUZyYW1lT2JqZWN0ICpmID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+ZnJhbWU7Ci0JaW50IGRlcHRoID0gLTE7CisgICAgUHlGcmFtZU9iamVjdCAqZiA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmZyYW1lOworICAgIGludCBkZXB0aCA9IC0xOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpfZ2V0ZnJhbWUiLCAmZGVwdGgpKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOl9nZXRmcmFtZSIsICZkZXB0aCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0Jd2hpbGUgKGRlcHRoID4gMCAmJiBmICE9IE5VTEwpIHsKLQkJZiA9IGYtPmZfYmFjazsKLQkJLS1kZXB0aDsKLQl9Ci0JaWYgKGYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkiY2FsbCBzdGFjayBpcyBub3QgZGVlcCBlbm91Z2giKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihmKTsKLQlyZXR1cm4gKFB5T2JqZWN0KilmOworICAgIHdoaWxlIChkZXB0aCA+IDAgJiYgZiAhPSBOVUxMKSB7CisgICAgICAgIGYgPSBmLT5mX2JhY2s7CisgICAgICAgIC0tZGVwdGg7CisgICAgfQorICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbCBzdGFjayBpcyBub3QgZGVlcCBlbm91Z2giKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihmKTsKKyAgICByZXR1cm4gKFB5T2JqZWN0KilmOwogfQogCiBQeURvY19TVFJWQVIoY3VycmVudF9mcmFtZXNfZG9jLApAQCAtNzg3LDcgKzc4Nyw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2N1cnJlbnRfZnJhbWVzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqbm9hcmdzKQogewotCXJldHVybiBfUHlUaHJlYWRfQ3VycmVudEZyYW1lcygpOworICAgIHJldHVybiBfUHlUaHJlYWRfQ3VycmVudEZyYW1lcygpOwogfQogCiBQeURvY19TVFJWQVIoY2FsbF90cmFjaW5nX2RvYywKQEAgLTgwMSwxMCArODAxLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogc3lzX2NhbGxfdHJhY2luZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUHlPYmplY3QgKmZ1bmMsICpmdW5jYXJnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PITpjYWxsX3RyYWNpbmciLCAmZnVuYywgJlB5VHVwbGVfVHlwZSwgJmZ1bmNhcmdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIF9QeUV2YWxfQ2FsbFRyYWNpbmcoZnVuYywgZnVuY2FyZ3MpOworICAgIFB5T2JqZWN0ICpmdW5jLCAqZnVuY2FyZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTyE6Y2FsbF90cmFjaW5nIiwgJmZ1bmMsICZQeVR1cGxlX1R5cGUsICZmdW5jYXJncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBfUHlFdmFsX0NhbGxUcmFjaW5nKGZ1bmMsIGZ1bmNhcmdzKTsKIH0KIAogUHlEb2NfU1RSVkFSKGNhbGxzdGF0c19kb2MsCkBAIC04NTEsOCArODUxLDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzeXNfY2xlYXJfdHlwZV9jYWNoZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0JUHlUeXBlX0NsZWFyQ2FjaGUoKTsKLQlQeV9SRVRVUk5fTk9ORTsKKyAgICBQeVR5cGVfQ2xlYXJDYWNoZSgpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoc3lzX2NsZWFyX3R5cGVfY2FjaGVfX2RvY19fLApAQCAtODYxLDEwNSArODYxLDEwNSBAQAogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzeXNfbWV0aG9kc1tdID0gewotCS8qIE1pZ2h0IGFzIHdlbGwga2VlcCB0aGlzIGluIGFscGhhYmV0aWMgb3JkZXIgKi8KLQl7ImNhbGxzdGF0cyIsIChQeUNGdW5jdGlvbilQeUV2YWxfR2V0Q2FsbFN0YXRzLCBNRVRIX05PQVJHUywKLQkgY2FsbHN0YXRzX2RvY30sCi0JeyJfY2xlYXJfdHlwZV9jYWNoZSIsCXN5c19jbGVhcl90eXBlX2NhY2hlLAkgIE1FVEhfTk9BUkdTLAotCSBzeXNfY2xlYXJfdHlwZV9jYWNoZV9fZG9jX199LAotCXsiX2N1cnJlbnRfZnJhbWVzIiwgc3lzX2N1cnJlbnRfZnJhbWVzLCBNRVRIX05PQVJHUywKLQkgY3VycmVudF9mcmFtZXNfZG9jfSwKLQl7ImRpc3BsYXlob29rIiwJc3lzX2Rpc3BsYXlob29rLCBNRVRIX08sIGRpc3BsYXlob29rX2RvY30sCi0JeyJleGNfaW5mbyIsCXN5c19leGNfaW5mbywgTUVUSF9OT0FSR1MsIGV4Y19pbmZvX2RvY30sCi0JeyJleGNfY2xlYXIiLAlzeXNfZXhjX2NsZWFyLCBNRVRIX05PQVJHUywgZXhjX2NsZWFyX2RvY30sCi0JeyJleGNlcHRob29rIiwJc3lzX2V4Y2VwdGhvb2ssIE1FVEhfVkFSQVJHUywgZXhjZXB0aG9va19kb2N9LAotCXsiZXhpdCIsCXN5c19leGl0LCBNRVRIX1ZBUkFSR1MsIGV4aXRfZG9jfSwKKyAgICAvKiBNaWdodCBhcyB3ZWxsIGtlZXAgdGhpcyBpbiBhbHBoYWJldGljIG9yZGVyICovCisgICAgeyJjYWxsc3RhdHMiLCAoUHlDRnVuY3Rpb24pUHlFdmFsX0dldENhbGxTdGF0cywgTUVUSF9OT0FSR1MsCisgICAgIGNhbGxzdGF0c19kb2N9LAorICAgIHsiX2NsZWFyX3R5cGVfY2FjaGUiLCAgICAgICBzeXNfY2xlYXJfdHlwZV9jYWNoZSwgICAgIE1FVEhfTk9BUkdTLAorICAgICBzeXNfY2xlYXJfdHlwZV9jYWNoZV9fZG9jX199LAorICAgIHsiX2N1cnJlbnRfZnJhbWVzIiwgc3lzX2N1cnJlbnRfZnJhbWVzLCBNRVRIX05PQVJHUywKKyAgICAgY3VycmVudF9mcmFtZXNfZG9jfSwKKyAgICB7ImRpc3BsYXlob29rIiwgICAgIHN5c19kaXNwbGF5aG9vaywgTUVUSF9PLCBkaXNwbGF5aG9va19kb2N9LAorICAgIHsiZXhjX2luZm8iLCAgICAgICAgc3lzX2V4Y19pbmZvLCBNRVRIX05PQVJHUywgZXhjX2luZm9fZG9jfSwKKyAgICB7ImV4Y19jbGVhciIsICAgICAgIHN5c19leGNfY2xlYXIsIE1FVEhfTk9BUkdTLCBleGNfY2xlYXJfZG9jfSwKKyAgICB7ImV4Y2VwdGhvb2siLCAgICAgIHN5c19leGNlcHRob29rLCBNRVRIX1ZBUkFSR1MsIGV4Y2VwdGhvb2tfZG9jfSwKKyAgICB7ImV4aXQiLCAgICAgICAgICAgIHN5c19leGl0LCBNRVRIX1ZBUkFSR1MsIGV4aXRfZG9jfSwKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JeyJnZXRkZWZhdWx0ZW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pc3lzX2dldGRlZmF1bHRlbmNvZGluZywKLQkgTUVUSF9OT0FSR1MsIGdldGRlZmF1bHRlbmNvZGluZ19kb2N9LAorICAgIHsiZ2V0ZGVmYXVsdGVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXRkZWZhdWx0ZW5jb2RpbmcsCisgICAgIE1FVEhfTk9BUkdTLCBnZXRkZWZhdWx0ZW5jb2RpbmdfZG9jfSwKICNlbmRpZgogI2lmZGVmIEhBVkVfRExPUEVOCi0JeyJnZXRkbG9wZW5mbGFncyIsIChQeUNGdW5jdGlvbilzeXNfZ2V0ZGxvcGVuZmxhZ3MsIE1FVEhfTk9BUkdTLAotCSBnZXRkbG9wZW5mbGFnc19kb2N9LAorICAgIHsiZ2V0ZGxvcGVuZmxhZ3MiLCAoUHlDRnVuY3Rpb24pc3lzX2dldGRsb3BlbmZsYWdzLCBNRVRIX05PQVJHUywKKyAgICAgZ2V0ZGxvcGVuZmxhZ3NfZG9jfSwKICNlbmRpZgogI2lmZGVmIENPVU5UX0FMTE9DUwotCXsiZ2V0Y291bnRzIiwJKFB5Q0Z1bmN0aW9uKXN5c19nZXRjb3VudHMsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldGNvdW50cyIsICAgICAgIChQeUNGdW5jdGlvbilzeXNfZ2V0Y291bnRzLCBNRVRIX05PQVJHU30sCiAjZW5kaWYKICNpZmRlZiBEWU5BTUlDX0VYRUNVVElPTl9QUk9GSUxFCi0JeyJnZXRkeHAiLAlfUHlfR2V0RFhQcm9maWxlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0ZHhwIiwgICAgICAgICAgX1B5X0dldERYUHJvZmlsZSwgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQl7ImdldGZpbGVzeXN0ZW1lbmNvZGluZyIsIChQeUNGdW5jdGlvbilzeXNfZ2V0ZmlsZXN5c3RlbWVuY29kaW5nLAotCSBNRVRIX05PQVJHUywgZ2V0ZmlsZXN5c3RlbWVuY29kaW5nX2RvY30sCisgICAgeyJnZXRmaWxlc3lzdGVtZW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pc3lzX2dldGZpbGVzeXN0ZW1lbmNvZGluZywKKyAgICAgTUVUSF9OT0FSR1MsIGdldGZpbGVzeXN0ZW1lbmNvZGluZ19kb2N9LAogI2VuZGlmCiAjaWZkZWYgUHlfVFJBQ0VfUkVGUwotCXsiZ2V0b2JqZWN0cyIsCV9QeV9HZXRPYmplY3RzLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiZ2V0b2JqZWN0cyIsICAgICAgX1B5X0dldE9iamVjdHMsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKICNpZmRlZiBQeV9SRUZfREVCVUcKLQl7ImdldHRvdGFscmVmY291bnQiLCAoUHlDRnVuY3Rpb24pc3lzX2dldHRvdGFscmVmY291bnQsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImdldHRvdGFscmVmY291bnQiLCAoUHlDRnVuY3Rpb24pc3lzX2dldHRvdGFscmVmY291bnQsIE1FVEhfTk9BUkdTfSwKICNlbmRpZgotCXsiZ2V0cmVmY291bnQiLAkoUHlDRnVuY3Rpb24pc3lzX2dldHJlZmNvdW50LCBNRVRIX08sIGdldHJlZmNvdW50X2RvY30sCi0JeyJnZXRyZWN1cnNpb25saW1pdCIsIChQeUNGdW5jdGlvbilzeXNfZ2V0cmVjdXJzaW9ubGltaXQsIE1FVEhfTk9BUkdTLAotCSBnZXRyZWN1cnNpb25saW1pdF9kb2N9LAotCXsiZ2V0c2l6ZW9mIiwgICAoUHlDRnVuY3Rpb24pc3lzX2dldHNpemVvZiwKLQkgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywgZ2V0c2l6ZW9mX2RvY30sCi0JeyJfZ2V0ZnJhbWUiLCBzeXNfZ2V0ZnJhbWUsIE1FVEhfVkFSQVJHUywgZ2V0ZnJhbWVfZG9jfSwKKyAgICB7ImdldHJlZmNvdW50IiwgICAgIChQeUNGdW5jdGlvbilzeXNfZ2V0cmVmY291bnQsIE1FVEhfTywgZ2V0cmVmY291bnRfZG9jfSwKKyAgICB7ImdldHJlY3Vyc2lvbmxpbWl0IiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXRyZWN1cnNpb25saW1pdCwgTUVUSF9OT0FSR1MsCisgICAgIGdldHJlY3Vyc2lvbmxpbWl0X2RvY30sCisgICAgeyJnZXRzaXplb2YiLCAgIChQeUNGdW5jdGlvbilzeXNfZ2V0c2l6ZW9mLAorICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLCBnZXRzaXplb2ZfZG9jfSwKKyAgICB7Il9nZXRmcmFtZSIsIHN5c19nZXRmcmFtZSwgTUVUSF9WQVJBUkdTLCBnZXRmcmFtZV9kb2N9LAogI2lmZGVmIE1TX1dJTkRPV1MKLQl7ImdldHdpbmRvd3N2ZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKXN5c19nZXR3aW5kb3dzdmVyc2lvbiwgTUVUSF9OT0FSR1MsCi0JIGdldHdpbmRvd3N2ZXJzaW9uX2RvY30sCisgICAgeyJnZXR3aW5kb3dzdmVyc2lvbiIsIChQeUNGdW5jdGlvbilzeXNfZ2V0d2luZG93c3ZlcnNpb24sIE1FVEhfTk9BUkdTLAorICAgICBnZXR3aW5kb3dzdmVyc2lvbl9kb2N9LAogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KICNpZmRlZiBVU0VfTUFMTE9QVAotCXsibWRlYnVnIiwJc3lzX21kZWJ1ZywgTUVUSF9WQVJBUkdTfSwKKyAgICB7Im1kZWJ1ZyIsICAgICAgICAgIHN5c19tZGVidWcsIE1FVEhfVkFSQVJHU30sCiAjZW5kaWYKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JeyJzZXRkZWZhdWx0ZW5jb2RpbmciLCBzeXNfc2V0ZGVmYXVsdGVuY29kaW5nLCBNRVRIX1ZBUkFSR1MsCi0JIHNldGRlZmF1bHRlbmNvZGluZ19kb2N9LAorICAgIHsic2V0ZGVmYXVsdGVuY29kaW5nIiwgc3lzX3NldGRlZmF1bHRlbmNvZGluZywgTUVUSF9WQVJBUkdTLAorICAgICBzZXRkZWZhdWx0ZW5jb2RpbmdfZG9jfSwKICNlbmRpZgotCXsic2V0Y2hlY2tpbnRlcnZhbCIsCXN5c19zZXRjaGVja2ludGVydmFsLCBNRVRIX1ZBUkFSR1MsCi0JIHNldGNoZWNraW50ZXJ2YWxfZG9jfSwKLQl7ImdldGNoZWNraW50ZXJ2YWwiLAlzeXNfZ2V0Y2hlY2tpbnRlcnZhbCwgTUVUSF9OT0FSR1MsCi0JIGdldGNoZWNraW50ZXJ2YWxfZG9jfSwKKyAgICB7InNldGNoZWNraW50ZXJ2YWwiLCAgICAgICAgc3lzX3NldGNoZWNraW50ZXJ2YWwsIE1FVEhfVkFSQVJHUywKKyAgICAgc2V0Y2hlY2tpbnRlcnZhbF9kb2N9LAorICAgIHsiZ2V0Y2hlY2tpbnRlcnZhbCIsICAgICAgICBzeXNfZ2V0Y2hlY2tpbnRlcnZhbCwgTUVUSF9OT0FSR1MsCisgICAgIGdldGNoZWNraW50ZXJ2YWxfZG9jfSwKICNpZmRlZiBIQVZFX0RMT1BFTgotCXsic2V0ZGxvcGVuZmxhZ3MiLCBzeXNfc2V0ZGxvcGVuZmxhZ3MsIE1FVEhfVkFSQVJHUywKLQkgc2V0ZGxvcGVuZmxhZ3NfZG9jfSwKKyAgICB7InNldGRsb3BlbmZsYWdzIiwgc3lzX3NldGRsb3BlbmZsYWdzLCBNRVRIX1ZBUkFSR1MsCisgICAgIHNldGRsb3BlbmZsYWdzX2RvY30sCiAjZW5kaWYKLQl7InNldHByb2ZpbGUiLAlzeXNfc2V0cHJvZmlsZSwgTUVUSF9PLCBzZXRwcm9maWxlX2RvY30sCi0JeyJnZXRwcm9maWxlIiwJc3lzX2dldHByb2ZpbGUsIE1FVEhfTk9BUkdTLCBnZXRwcm9maWxlX2RvY30sCi0JeyJzZXRyZWN1cnNpb25saW1pdCIsIHN5c19zZXRyZWN1cnNpb25saW1pdCwgTUVUSF9WQVJBUkdTLAotCSBzZXRyZWN1cnNpb25saW1pdF9kb2N9LAorICAgIHsic2V0cHJvZmlsZSIsICAgICAgc3lzX3NldHByb2ZpbGUsIE1FVEhfTywgc2V0cHJvZmlsZV9kb2N9LAorICAgIHsiZ2V0cHJvZmlsZSIsICAgICAgc3lzX2dldHByb2ZpbGUsIE1FVEhfTk9BUkdTLCBnZXRwcm9maWxlX2RvY30sCisgICAgeyJzZXRyZWN1cnNpb25saW1pdCIsIHN5c19zZXRyZWN1cnNpb25saW1pdCwgTUVUSF9WQVJBUkdTLAorICAgICBzZXRyZWN1cnNpb25saW1pdF9kb2N9LAogI2lmZGVmIFdJVEhfVFNDCi0JeyJzZXR0c2NkdW1wIiwgc3lzX3NldHRzY2R1bXAsIE1FVEhfVkFSQVJHUywgc2V0dHNjZHVtcF9kb2N9LAorICAgIHsic2V0dHNjZHVtcCIsIHN5c19zZXR0c2NkdW1wLCBNRVRIX1ZBUkFSR1MsIHNldHRzY2R1bXBfZG9jfSwKICNlbmRpZgotCXsic2V0dHJhY2UiLAlzeXNfc2V0dHJhY2UsIE1FVEhfTywgc2V0dHJhY2VfZG9jfSwKLQl7ImdldHRyYWNlIiwJc3lzX2dldHRyYWNlLCBNRVRIX05PQVJHUywgZ2V0dHJhY2VfZG9jfSwKLQl7ImNhbGxfdHJhY2luZyIsIHN5c19jYWxsX3RyYWNpbmcsIE1FVEhfVkFSQVJHUywgY2FsbF90cmFjaW5nX2RvY30sCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyAgICB7InNldHRyYWNlIiwgICAgICAgIHN5c19zZXR0cmFjZSwgTUVUSF9PLCBzZXR0cmFjZV9kb2N9LAorICAgIHsiZ2V0dHJhY2UiLCAgICAgICAgc3lzX2dldHRyYWNlLCBNRVRIX05PQVJHUywgZ2V0dHJhY2VfZG9jfSwKKyAgICB7ImNhbGxfdHJhY2luZyIsIHN5c19jYWxsX3RyYWNpbmcsIE1FVEhfVkFSQVJHUywgY2FsbF90cmFjaW5nX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBsaXN0X2J1aWx0aW5fbW9kdWxlX25hbWVzKHZvaWQpCiB7Ci0JUHlPYmplY3QgKmxpc3QgPSBQeUxpc3RfTmV3KDApOwotCWludCBpOwotCWlmIChsaXN0ID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciAoaSA9IDA7IFB5SW1wb3J0X0luaXR0YWJbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKLQkJUHlPYmplY3QgKm5hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAotCQkJUHlJbXBvcnRfSW5pdHRhYltpXS5uYW1lKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCWJyZWFrOwotCQlQeUxpc3RfQXBwZW5kKGxpc3QsIG5hbWUpOwotCQlQeV9ERUNSRUYobmFtZSk7Ci0JfQotCWlmIChQeUxpc3RfU29ydChsaXN0KSAhPSAwKSB7Ci0JCVB5X0RFQ1JFRihsaXN0KTsKLQkJbGlzdCA9IE5VTEw7Ci0JfQotCWlmIChsaXN0KSB7Ci0JCVB5T2JqZWN0ICp2ID0gUHlMaXN0X0FzVHVwbGUobGlzdCk7Ci0JCVB5X0RFQ1JFRihsaXN0KTsKLQkJbGlzdCA9IHY7Ci0JfQotCXJldHVybiBsaXN0OworICAgIFB5T2JqZWN0ICpsaXN0ID0gUHlMaXN0X05ldygwKTsKKyAgICBpbnQgaTsKKyAgICBpZiAobGlzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBQeUltcG9ydF9Jbml0dGFiW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygKKyAgICAgICAgICAgIFB5SW1wb3J0X0luaXR0YWJbaV0ubmFtZSk7CisgICAgICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgUHlMaXN0X0FwcGVuZChsaXN0LCBuYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKG5hbWUpOworICAgIH0KKyAgICBpZiAoUHlMaXN0X1NvcnQobGlzdCkgIT0gMCkgeworICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgIGxpc3QgPSBOVUxMOworICAgIH0KKyAgICBpZiAobGlzdCkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5TGlzdF9Bc1R1cGxlKGxpc3QpOworICAgICAgICBQeV9ERUNSRUYobGlzdCk7CisgICAgICAgIGxpc3QgPSB2OworICAgIH0KKyAgICByZXR1cm4gbGlzdDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICp3YXJub3B0aW9ucyA9IE5VTEw7CkBAIC05NjcsMjcgKzk2NywyNyBAQAogdm9pZAogUHlTeXNfUmVzZXRXYXJuT3B0aW9ucyh2b2lkKQogewotCWlmICh3YXJub3B0aW9ucyA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sod2Fybm9wdGlvbnMpKQotCQlyZXR1cm47Ci0JUHlMaXN0X1NldFNsaWNlKHdhcm5vcHRpb25zLCAwLCBQeUxpc3RfR0VUX1NJWkUod2Fybm9wdGlvbnMpLCBOVUxMKTsKKyAgICBpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHdhcm5vcHRpb25zKSkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TGlzdF9TZXRTbGljZSh3YXJub3B0aW9ucywgMCwgUHlMaXN0X0dFVF9TSVpFKHdhcm5vcHRpb25zKSwgTlVMTCk7CiB9CiAKIHZvaWQKIFB5U3lzX0FkZFdhcm5PcHRpb24oY2hhciAqcykKIHsKLQlQeU9iamVjdCAqc3RyOworICAgIFB5T2JqZWN0ICpzdHI7CiAKLQlpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCB8fCAhUHlMaXN0X0NoZWNrKHdhcm5vcHRpb25zKSkgewotCQlQeV9YREVDUkVGKHdhcm5vcHRpb25zKTsKLQkJd2Fybm9wdGlvbnMgPSBQeUxpc3RfTmV3KDApOwotCQlpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCkKLQkJCXJldHVybjsKLQl9Ci0Jc3RyID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzKTsKLQlpZiAoc3RyICE9IE5VTEwpIHsKLQkJUHlMaXN0X0FwcGVuZCh3YXJub3B0aW9ucywgc3RyKTsKLQkJUHlfREVDUkVGKHN0cik7Ci0JfQorICAgIGlmICh3YXJub3B0aW9ucyA9PSBOVUxMIHx8ICFQeUxpc3RfQ2hlY2sod2Fybm9wdGlvbnMpKSB7CisgICAgICAgIFB5X1hERUNSRUYod2Fybm9wdGlvbnMpOworICAgICAgICB3YXJub3B0aW9ucyA9IFB5TGlzdF9OZXcoMCk7CisgICAgICAgIGlmICh3YXJub3B0aW9ucyA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHMpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBQeUxpc3RfQXBwZW5kKHdhcm5vcHRpb25zLCBzdHIpOworICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICB9CiB9CiAKIGludApAQCAtMTExMyw2OSArMTExMyw2OSBAQAogc3RhdGljIHZvaWQKIHN2bnZlcnNpb25faW5pdCh2b2lkKQogewotCWNvbnN0IGNoYXIgKnB5dGhvbiwgKmJyX3N0YXJ0LCAqYnJfZW5kLCAqYnJfZW5kMiwgKnN2bnZlcnNpb247Ci0JUHlfc3NpemVfdCBsZW47Ci0JaW50IGlzdGFnOworICAgIGNvbnN0IGNoYXIgKnB5dGhvbiwgKmJyX3N0YXJ0LCAqYnJfZW5kLCAqYnJfZW5kMiwgKnN2bnZlcnNpb247CisgICAgUHlfc3NpemVfdCBsZW47CisgICAgaW50IGlzdGFnOwogCi0JaWYgKHN2bl9pbml0aWFsaXplZCkKLQkJcmV0dXJuOworICAgIGlmIChzdm5faW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybjsKIAotCXB5dGhvbiA9IHN0cnN0cihoZWFkdXJsLCAiL3B5dGhvbi8iKTsKLQlpZiAoIXB5dGhvbikgewotCQkvKiBYWFggcXVpY2sgaGFjayB0byBnZXQgYnpyIHdvcmtpbmcgKi8KLQkJKnBhdGNobGV2ZWxfcmV2aXNpb24gPSAnXDAnOwotCQlzdHJjcHkoYnJhbmNoLCAiIik7Ci0JCXN0cmNweShzaG9ydGJyYW5jaCwgInVua25vd24iKTsKLQkJc3ZuX3JldmlzaW9uID0gIiI7Ci0JCXJldHVybjsKLQkJLyogUHlfRmF0YWxFcnJvcigic3VidmVyc2lvbiBrZXl3b3JkcyBtaXNzaW5nIik7ICovCi0JfQorICAgIHB5dGhvbiA9IHN0cnN0cihoZWFkdXJsLCAiL3B5dGhvbi8iKTsKKyAgICBpZiAoIXB5dGhvbikgeworICAgICAgICAvKiBYWFggcXVpY2sgaGFjayB0byBnZXQgYnpyIHdvcmtpbmcgKi8KKyAgICAgICAgKnBhdGNobGV2ZWxfcmV2aXNpb24gPSAnXDAnOworICAgICAgICBzdHJjcHkoYnJhbmNoLCAiIik7CisgICAgICAgIHN0cmNweShzaG9ydGJyYW5jaCwgInVua25vd24iKTsKKyAgICAgICAgc3ZuX3JldmlzaW9uID0gIiI7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLyogUHlfRmF0YWxFcnJvcigic3VidmVyc2lvbiBrZXl3b3JkcyBtaXNzaW5nIik7ICovCisgICAgfQogCi0JYnJfc3RhcnQgPSBweXRob24gKyA4OwotCWJyX2VuZCA9IHN0cmNocihicl9zdGFydCwgJy8nKTsKLQlhc3NlcnQoYnJfZW5kKTsKKyAgICBicl9zdGFydCA9IHB5dGhvbiArIDg7CisgICAgYnJfZW5kID0gc3RyY2hyKGJyX3N0YXJ0LCAnLycpOworICAgIGFzc2VydChicl9lbmQpOwogCi0JLyogV29ya3MgZXZlbiBmb3IgdHJ1bmssCi0JICAgYXMgd2UgYXJlIGluIHRydW5rL1B5dGhvbi9zeXNtb2R1bGUuYyAqLwotCWJyX2VuZDIgPSBzdHJjaHIoYnJfZW5kKzEsICcvJyk7CisgICAgLyogV29ya3MgZXZlbiBmb3IgdHJ1bmssCisgICAgICAgYXMgd2UgYXJlIGluIHRydW5rL1B5dGhvbi9zeXNtb2R1bGUuYyAqLworICAgIGJyX2VuZDIgPSBzdHJjaHIoYnJfZW5kKzEsICcvJyk7CiAKLQlpc3RhZyA9IHN0cm5jbXAoYnJfc3RhcnQsICJ0YWdzIiwgNCkgPT0gMDsKLQlpZiAoc3RybmNtcChicl9zdGFydCwgInRydW5rIiwgNSkgPT0gMCkgewotCQlzdHJjcHkoYnJhbmNoLCAidHJ1bmsiKTsKLQkJc3RyY3B5KHNob3J0YnJhbmNoLCAidHJ1bmsiKTsKKyAgICBpc3RhZyA9IHN0cm5jbXAoYnJfc3RhcnQsICJ0YWdzIiwgNCkgPT0gMDsKKyAgICBpZiAoc3RybmNtcChicl9zdGFydCwgInRydW5rIiwgNSkgPT0gMCkgeworICAgICAgICBzdHJjcHkoYnJhbmNoLCAidHJ1bmsiKTsKKyAgICAgICAgc3RyY3B5KHNob3J0YnJhbmNoLCAidHJ1bmsiKTsKIAotCX0KLQllbHNlIGlmIChpc3RhZyB8fCBzdHJuY21wKGJyX3N0YXJ0LCAiYnJhbmNoZXMiLCA4KSA9PSAwKSB7Ci0JCWxlbiA9IGJyX2VuZDIgLSBicl9zdGFydDsKLQkJc3RybmNweShicmFuY2gsIGJyX3N0YXJ0LCBsZW4pOwotCQlicmFuY2hbbGVuXSA9ICdcMCc7CisgICAgfQorICAgIGVsc2UgaWYgKGlzdGFnIHx8IHN0cm5jbXAoYnJfc3RhcnQsICJicmFuY2hlcyIsIDgpID09IDApIHsKKyAgICAgICAgbGVuID0gYnJfZW5kMiAtIGJyX3N0YXJ0OworICAgICAgICBzdHJuY3B5KGJyYW5jaCwgYnJfc3RhcnQsIGxlbik7CisgICAgICAgIGJyYW5jaFtsZW5dID0gJ1wwJzsKIAotCQlsZW4gPSBicl9lbmQyIC0gKGJyX2VuZCArIDEpOwotCQlzdHJuY3B5KHNob3J0YnJhbmNoLCBicl9lbmQgKyAxLCBsZW4pOwotCQlzaG9ydGJyYW5jaFtsZW5dID0gJ1wwJzsKLQl9Ci0JZWxzZSB7Ci0JCVB5X0ZhdGFsRXJyb3IoImJhZCBIZWFkVVJMIik7IAotCQlyZXR1cm47Ci0JfQorICAgICAgICBsZW4gPSBicl9lbmQyIC0gKGJyX2VuZCArIDEpOworICAgICAgICBzdHJuY3B5KHNob3J0YnJhbmNoLCBicl9lbmQgKyAxLCBsZW4pOworICAgICAgICBzaG9ydGJyYW5jaFtsZW5dID0gJ1wwJzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImJhZCBIZWFkVVJMIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKIAotCXN2bnZlcnNpb24gPSBfUHlfc3ZudmVyc2lvbigpOwotCWlmIChzdHJjbXAoc3ZudmVyc2lvbiwgIlVudmVyc2lvbmVkIGRpcmVjdG9yeSIpICE9IDAgJiYgc3RyY21wKHN2bnZlcnNpb24sICJleHBvcnRlZCIpICE9IDApCi0JCXN2bl9yZXZpc2lvbiA9IHN2bnZlcnNpb247Ci0JZWxzZSBpZiAoaXN0YWcpIHsKLQkJbGVuID0gc3RybGVuKF9wYXRjaGxldmVsX3JldmlzaW9uKTsKLQkJYXNzZXJ0KGxlbiA+PSAxMyk7Ci0JCWFzc2VydChsZW4gPCAoc2l6ZW9mKHBhdGNobGV2ZWxfcmV2aXNpb24pICsgMTMpKTsKLQkJc3RybmNweShwYXRjaGxldmVsX3JldmlzaW9uLCBfcGF0Y2hsZXZlbF9yZXZpc2lvbiArIDExLAotCQkJbGVuIC0gMTMpOwotCQlwYXRjaGxldmVsX3JldmlzaW9uW2xlbiAtIDEzXSA9ICdcMCc7Ci0JCXN2bl9yZXZpc2lvbiA9IHBhdGNobGV2ZWxfcmV2aXNpb247Ci0JfQotCWVsc2UKLQkJc3ZuX3JldmlzaW9uID0gIiI7CisgICAgc3ZudmVyc2lvbiA9IF9QeV9zdm52ZXJzaW9uKCk7CisgICAgaWYgKHN0cmNtcChzdm52ZXJzaW9uLCAiVW52ZXJzaW9uZWQgZGlyZWN0b3J5IikgIT0gMCAmJiBzdHJjbXAoc3ZudmVyc2lvbiwgImV4cG9ydGVkIikgIT0gMCkKKyAgICAgICAgc3ZuX3JldmlzaW9uID0gc3ZudmVyc2lvbjsKKyAgICBlbHNlIGlmIChpc3RhZykgeworICAgICAgICBsZW4gPSBzdHJsZW4oX3BhdGNobGV2ZWxfcmV2aXNpb24pOworICAgICAgICBhc3NlcnQobGVuID49IDEzKTsKKyAgICAgICAgYXNzZXJ0KGxlbiA8IChzaXplb2YocGF0Y2hsZXZlbF9yZXZpc2lvbikgKyAxMykpOworICAgICAgICBzdHJuY3B5KHBhdGNobGV2ZWxfcmV2aXNpb24sIF9wYXRjaGxldmVsX3JldmlzaW9uICsgMTEsCisgICAgICAgICAgICBsZW4gLSAxMyk7CisgICAgICAgIHBhdGNobGV2ZWxfcmV2aXNpb25bbGVuIC0gMTNdID0gJ1wwJzsKKyAgICAgICAgc3ZuX3JldmlzaW9uID0gcGF0Y2hsZXZlbF9yZXZpc2lvbjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzdm5fcmV2aXNpb24gPSAiIjsKIAotCXN2bl9pbml0aWFsaXplZCA9IDE7CisgICAgc3ZuX2luaXRpYWxpemVkID0gMTsKIH0KIAogLyogUmV0dXJuIHN2bnZlcnNpb24gb3V0cHV0IGlmIGF2YWlsYWJsZS4KQEAgLTExODQsMTUgKzExODQsMTUgQEAKIGNvbnN0IGNoYXIqCiBQeV9TdWJ2ZXJzaW9uUmV2aXNpb24oKQogewotCXN2bnZlcnNpb25faW5pdCgpOwotCXJldHVybiBzdm5fcmV2aXNpb247CisgICAgc3ZudmVyc2lvbl9pbml0KCk7CisgICAgcmV0dXJuIHN2bl9yZXZpc2lvbjsKIH0KIAogY29uc3QgY2hhcioKIFB5X1N1YnZlcnNpb25TaG9ydEJyYW5jaCgpCiB7Ci0Jc3ZudmVyc2lvbl9pbml0KCk7Ci0JcmV0dXJuIHNob3J0YnJhbmNoOworICAgIHN2bnZlcnNpb25faW5pdCgpOworICAgIHJldHVybiBzaG9ydGJyYW5jaDsKIH0KIAogCkBAIC0xMjA0LDQzMSArMTIwNCw0MzEgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRmxhZ3NUeXBlID0gezAsIDAsIDAsIDAsIDAsIDB9OwogCiBzdGF0aWMgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCBmbGFnc19maWVsZHNbXSA9IHsKLQl7ImRlYnVnIiwJCSItZCJ9LAotCXsicHkza193YXJuaW5nIiwJIi0zIn0sCi0JeyJkaXZpc2lvbl93YXJuaW5nIiwJIi1RIn0sCi0JeyJkaXZpc2lvbl9uZXciLAkiLVFuZXcifSwKLQl7Imluc3BlY3QiLAkJIi1pIn0sCi0JeyJpbnRlcmFjdGl2ZSIsCQkiLWkifSwKLQl7Im9wdGltaXplIiwJCSItTyBvciAtT08ifSwKLQl7ImRvbnRfd3JpdGVfYnl0ZWNvZGUiLAkiLUIifSwKLQl7Im5vX3VzZXJfc2l0ZSIsCSItcyJ9LAotCXsibm9fc2l0ZSIsCQkiLVMifSwKLQl7Imlnbm9yZV9lbnZpcm9ubWVudCIsCSItRSJ9LAotCXsidGFiY2hlY2siLAkJIi10IG9yIC10dCJ9LAotCXsidmVyYm9zZSIsCQkiLXYifSwKKyAgICB7ImRlYnVnIiwgICAgICAgICAgICAgICAgICAgIi1kIn0sCisgICAgeyJweTNrX3dhcm5pbmciLCAgICAgICAgICAgICItMyJ9LAorICAgIHsiZGl2aXNpb25fd2FybmluZyIsICAgICAgICAiLVEifSwKKyAgICB7ImRpdmlzaW9uX25ldyIsICAgICAgICAgICAgIi1RbmV3In0sCisgICAgeyJpbnNwZWN0IiwgICAgICAgICAgICAgICAgICItaSJ9LAorICAgIHsiaW50ZXJhY3RpdmUiLCAgICAgICAgICAgICAiLWkifSwKKyAgICB7Im9wdGltaXplIiwgICAgICAgICAgICAgICAgIi1PIG9yIC1PTyJ9LAorICAgIHsiZG9udF93cml0ZV9ieXRlY29kZSIsICAgICAiLUIifSwKKyAgICB7Im5vX3VzZXJfc2l0ZSIsICAgICAgICAgICAgIi1zIn0sCisgICAgeyJub19zaXRlIiwgICAgICAgICAgICAgICAgICItUyJ9LAorICAgIHsiaWdub3JlX2Vudmlyb25tZW50IiwgICAgICAiLUUifSwKKyAgICB7InRhYmNoZWNrIiwgICAgICAgICAgICAgICAgIi10IG9yIC10dCJ9LAorICAgIHsidmVyYm9zZSIsICAgICAgICAgICAgICAgICAiLXYifSwKICNpZmRlZiBSSVNDT1MKLQl7InJpc2Nvc193aW1wIiwJCSI/Pz8ifSwKKyAgICB7InJpc2Nvc193aW1wIiwgICAgICAgICAgICAgIj8/PyJ9LAogI2VuZGlmCi0JLyogeyJ1bmJ1ZmZlcmVkIiwJCSItdSJ9LCAqLwotCXsidW5pY29kZSIsCQkiLVUifSwKLQkvKiB7InNraXBfZmlyc3QiLAkJIi14In0sICovCi0JeyJieXRlc193YXJuaW5nIiwgIi1iIn0sCi0JezB9CisgICAgLyogeyJ1bmJ1ZmZlcmVkIiwgICAgICAgICAgICAgICAgICAgIi11In0sICovCisgICAgeyJ1bmljb2RlIiwgICAgICAgICAgICAgICAgICItVSJ9LAorICAgIC8qIHsic2tpcF9maXJzdCIsICAgICAgICAgICAgICAgICAgICIteCJ9LCAqLworICAgIHsiYnl0ZXNfd2FybmluZyIsICItYiJ9LAorICAgIHswfQogfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBmbGFnc19kZXNjID0gewotCSJzeXMuZmxhZ3MiLAkvKiBuYW1lICovCi0JZmxhZ3NfX2RvY19fLAkvKiBkb2MgKi8KLQlmbGFnc19maWVsZHMsCS8qIGZpZWxkcyAqLworICAgICJzeXMuZmxhZ3MiLCAgICAgICAgLyogbmFtZSAqLworICAgIGZsYWdzX19kb2NfXywgICAgICAgLyogZG9jICovCisgICAgZmxhZ3NfZmllbGRzLCAgICAgICAvKiBmaWVsZHMgKi8KICNpZmRlZiBSSVNDT1MKLQkxNgorICAgIDE2CiAjZWxzZQotCTE1CisgICAgMTUKICNlbmRpZgogfTsKIAogc3RhdGljIFB5T2JqZWN0KgogbWFrZV9mbGFncyh2b2lkKQogewotCWludCBwb3MgPSAwOwotCVB5T2JqZWN0ICpzZXE7CisgICAgaW50IHBvcyA9IDA7CisgICAgUHlPYmplY3QgKnNlcTsKIAotCXNlcSA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZGbGFnc1R5cGUpOwotCWlmIChzZXEgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisgICAgc2VxID0gUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoJkZsYWdzVHlwZSk7CisgICAgaWYgKHNlcSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogI2RlZmluZSBTZXRGbGFnKGZsYWcpIFwKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHNlcSwgcG9zKyssIFB5SW50X0Zyb21Mb25nKGZsYWcpKQorICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0oc2VxLCBwb3MrKywgUHlJbnRfRnJvbUxvbmcoZmxhZykpCiAKLQlTZXRGbGFnKFB5X0RlYnVnRmxhZyk7Ci0JU2V0RmxhZyhQeV9QeTNrV2FybmluZ0ZsYWcpOwotCVNldEZsYWcoUHlfRGl2aXNpb25XYXJuaW5nRmxhZyk7Ci0JU2V0RmxhZyhfUHlfUW5ld0ZsYWcpOwotCVNldEZsYWcoUHlfSW5zcGVjdEZsYWcpOwotCVNldEZsYWcoUHlfSW50ZXJhY3RpdmVGbGFnKTsKLQlTZXRGbGFnKFB5X09wdGltaXplRmxhZyk7Ci0JU2V0RmxhZyhQeV9Eb250V3JpdGVCeXRlY29kZUZsYWcpOwotCVNldEZsYWcoUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeSk7Ci0JU2V0RmxhZyhQeV9Ob1NpdGVGbGFnKTsKLQlTZXRGbGFnKFB5X0lnbm9yZUVudmlyb25tZW50RmxhZyk7Ci0JU2V0RmxhZyhQeV9UYWJjaGVja0ZsYWcpOwotCVNldEZsYWcoUHlfVmVyYm9zZUZsYWcpOworICAgIFNldEZsYWcoUHlfRGVidWdGbGFnKTsKKyAgICBTZXRGbGFnKFB5X1B5M2tXYXJuaW5nRmxhZyk7CisgICAgU2V0RmxhZyhQeV9EaXZpc2lvbldhcm5pbmdGbGFnKTsKKyAgICBTZXRGbGFnKF9QeV9RbmV3RmxhZyk7CisgICAgU2V0RmxhZyhQeV9JbnNwZWN0RmxhZyk7CisgICAgU2V0RmxhZyhQeV9JbnRlcmFjdGl2ZUZsYWcpOworICAgIFNldEZsYWcoUHlfT3B0aW1pemVGbGFnKTsKKyAgICBTZXRGbGFnKFB5X0RvbnRXcml0ZUJ5dGVjb2RlRmxhZyk7CisgICAgU2V0RmxhZyhQeV9Ob1VzZXJTaXRlRGlyZWN0b3J5KTsKKyAgICBTZXRGbGFnKFB5X05vU2l0ZUZsYWcpOworICAgIFNldEZsYWcoUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnKTsKKyAgICBTZXRGbGFnKFB5X1RhYmNoZWNrRmxhZyk7CisgICAgU2V0RmxhZyhQeV9WZXJib3NlRmxhZyk7CiAjaWZkZWYgUklTQ09TCi0JU2V0RmxhZyhQeV9SSVNDT1NXaW1wRmxhZyk7CisgICAgU2V0RmxhZyhQeV9SSVNDT1NXaW1wRmxhZyk7CiAjZW5kaWYKLQkvKiBTZXRGbGFnKHNhd191bmJ1ZmZlcmVkX2ZsYWcpOyAqLwotCVNldEZsYWcoUHlfVW5pY29kZUZsYWcpOwotCS8qIFNldEZsYWcoc2tpcGZpcnN0bGluZSk7ICovCisgICAgLyogU2V0RmxhZyhzYXdfdW5idWZmZXJlZF9mbGFnKTsgKi8KKyAgICBTZXRGbGFnKFB5X1VuaWNvZGVGbGFnKTsKKyAgICAvKiBTZXRGbGFnKHNraXBmaXJzdGxpbmUpOyAqLwogICAgIFNldEZsYWcoUHlfQnl0ZXNXYXJuaW5nRmxhZyk7CiAjdW5kZWYgU2V0RmxhZwogCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBzZXE7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBzZXE7CiB9CiAKIFB5T2JqZWN0ICoKIF9QeVN5c19Jbml0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICp2LCAqc3lzZGljdDsKLQlQeU9iamVjdCAqc3lzaW4sICpzeXNvdXQsICpzeXNlcnI7Ci0JY2hhciAqczsKKyAgICBQeU9iamVjdCAqbSwgKnYsICpzeXNkaWN0OworICAgIFB5T2JqZWN0ICpzeXNpbiwgKnN5c291dCwgKnN5c2VycjsKKyAgICBjaGFyICpzOwogCi0JbSA9IFB5X0luaXRNb2R1bGUzKCJzeXMiLCBzeXNfbWV0aG9kcywgc3lzX2RvYyk7Ci0JaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc3lzZGljdCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0jZGVmaW5lIFNFVF9TWVNfRlJPTV9TVFJJTkcoa2V5LCB2YWx1ZSkJCQlcCi0JdiA9IHZhbHVlOwkJCQkJXAotCWlmICh2ICE9IE5VTEwpCQkJCQlcCi0JCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsIGtleSwgdik7CVwKLQlQeV9YREVDUkVGKHYpCisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJzeXMiLCBzeXNfbWV0aG9kcywgc3lzX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc3lzZGljdCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisjZGVmaW5lIFNFVF9TWVNfRlJPTV9TVFJJTkcoa2V5LCB2YWx1ZSkgICAgICAgICAgICAgICAgIFwKKyAgICB2ID0gdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh2ICE9IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsIGtleSwgdik7ICAgICAgICAgIFwKKyAgICBQeV9YREVDUkVGKHYpCiAKLQkvKiBDaGVjayB0aGF0IHN0ZGluIGlzIG5vdCBhIGRpcmVjdG9yeQotCVVzaW5nIHNoZWxsIHJlZGlyZWN0aW9uLCB5b3UgY2FuIHJlZGlyZWN0IHN0ZGluIHRvIGEgZGlyZWN0b3J5LAotCWNyYXNoaW5nIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuIENhdGNoIHRoaXMgY29tbW9uIG1pc3Rha2UgaGVyZQotCWFuZCBvdXRwdXQgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZS4gTm90ZSB0aGF0IHVuZGVyIE1TIFdpbmRvd3MsCi0JdGhlIHNoZWxsIGFscmVhZHkgcHJldmVudHMgdGhhdC4gKi8KKyAgICAvKiBDaGVjayB0aGF0IHN0ZGluIGlzIG5vdCBhIGRpcmVjdG9yeQorICAgIFVzaW5nIHNoZWxsIHJlZGlyZWN0aW9uLCB5b3UgY2FuIHJlZGlyZWN0IHN0ZGluIHRvIGEgZGlyZWN0b3J5LAorICAgIGNyYXNoaW5nIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuIENhdGNoIHRoaXMgY29tbW9uIG1pc3Rha2UgaGVyZQorICAgIGFuZCBvdXRwdXQgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZS4gTm90ZSB0aGF0IHVuZGVyIE1TIFdpbmRvd3MsCisgICAgdGhlIHNoZWxsIGFscmVhZHkgcHJldmVudHMgdGhhdC4gKi8KICNpZiAhZGVmaW5lZChNU19XSU5ET1dTKQotCXsKLQkJc3RydWN0IHN0YXQgc2I7Ci0JCWlmIChmc3RhdChmaWxlbm8oc3RkaW4pLCAmc2IpID09IDAgJiYKLQkJICAgIFNfSVNESVIoc2Iuc3RfbW9kZSkpIHsKLQkJCS8qIFRoZXJlJ3Mgbm90aGluZyBtb3JlIHdlIGNhbiBkby4gKi8KLQkJCS8qIFB5X0ZhdGFsRXJyb3IoKSB3aWxsIGNvcmUgZHVtcCwgc28ganVzdCBleGl0LiAqLwotCQkJUHlTeXNfV3JpdGVTdGRlcnIoIlB5dGhvbiBlcnJvcjogPHN0ZGluPiBpcyBhIGRpcmVjdG9yeSwgY2Fubm90IGNvbnRpbnVlXG4iKTsKLQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKLQkJfQotCX0KKyAgICB7CisgICAgICAgIHN0cnVjdCBzdGF0IHNiOworICAgICAgICBpZiAoZnN0YXQoZmlsZW5vKHN0ZGluKSwgJnNiKSA9PSAwICYmCisgICAgICAgICAgICBTX0lTRElSKHNiLnN0X21vZGUpKSB7CisgICAgICAgICAgICAvKiBUaGVyZSdzIG5vdGhpbmcgbW9yZSB3ZSBjYW4gZG8uICovCisgICAgICAgICAgICAvKiBQeV9GYXRhbEVycm9yKCkgd2lsbCBjb3JlIGR1bXAsIHNvIGp1c3QgZXhpdC4gKi8KKyAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJQeXRob24gZXJyb3I6IDxzdGRpbj4gaXMgYSBkaXJlY3RvcnksIGNhbm5vdCBjb250aW51ZVxuIik7CisgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKIAotCS8qIENsb3NpbmcgdGhlIHN0YW5kYXJkIEZJTEUqIGlmIHN5cy5zdGQqIGdvZXMgYXdheXMgY2F1c2VzIHByb2JsZW1zCi0JICogZm9yIGVtYmVkZGVkIFB5dGhvbiB1c2FnZXMuIENsb3NpbmcgdGhlbSB3aGVuIHNvbWVib2R5IGV4cGxpY2l0bHkKLQkgKiBpbnZva2VzIC5jbG9zZSgpIG1pZ2h0IGJlIHBvc3NpYmxlLCBidXQgdGhlIEZBUSBwcm9taXNlcyB0aGV5IGdldAotCSAqIG5ldmVyIGNsb3NlZC4gSG93ZXZlciwgd2Ugc3RpbGwgbmVlZCB0byBnZXQgd3JpdGUgZXJyb3JzIHdoZW4KLQkgKiB3cml0aW5nIGZhaWxzIChlLmcuIGJlY2F1c2Ugc3Rkb3V0IGlzIHJlZGlyZWN0ZWQpLCBzbyB3ZSBmbHVzaCB0aGUKLQkgKiBzdHJlYW1zIGFuZCBjaGVjayBmb3IgZXJyb3JzIGJlZm9yZSB0aGUgZmlsZSBvYmplY3RzIGFyZSBkZWxldGVkLgotCSAqIE9uIE9TIFgsIGZmbHVzaCgpaW5nIHN0ZGluIGNhdXNlcyBhbiBlcnJvciwgc28gd2UgZXhlbXB0IHN0ZGluCi0JICogZnJvbSB0aGF0IHByb2NlZHVyZS4KLQkgKi8KLQlzeXNpbiA9IFB5RmlsZV9Gcm9tRmlsZShzdGRpbiwgIjxzdGRpbj4iLCAiciIsIE5VTEwpOwotCXN5c291dCA9IFB5RmlsZV9Gcm9tRmlsZShzdGRvdXQsICI8c3Rkb3V0PiIsICJ3IiwgX2NoZWNrX2FuZF9mbHVzaCk7Ci0Jc3lzZXJyID0gUHlGaWxlX0Zyb21GaWxlKHN0ZGVyciwgIjxzdGRlcnI+IiwgInciLCBfY2hlY2tfYW5kX2ZsdXNoKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgLyogQ2xvc2luZyB0aGUgc3RhbmRhcmQgRklMRSogaWYgc3lzLnN0ZCogZ29lcyBhd2F5cyBjYXVzZXMgcHJvYmxlbXMKKyAgICAgKiBmb3IgZW1iZWRkZWQgUHl0aG9uIHVzYWdlcy4gQ2xvc2luZyB0aGVtIHdoZW4gc29tZWJvZHkgZXhwbGljaXRseQorICAgICAqIGludm9rZXMgLmNsb3NlKCkgbWlnaHQgYmUgcG9zc2libGUsIGJ1dCB0aGUgRkFRIHByb21pc2VzIHRoZXkgZ2V0CisgICAgICogbmV2ZXIgY2xvc2VkLiBIb3dldmVyLCB3ZSBzdGlsbCBuZWVkIHRvIGdldCB3cml0ZSBlcnJvcnMgd2hlbgorICAgICAqIHdyaXRpbmcgZmFpbHMgKGUuZy4gYmVjYXVzZSBzdGRvdXQgaXMgcmVkaXJlY3RlZCksIHNvIHdlIGZsdXNoIHRoZQorICAgICAqIHN0cmVhbXMgYW5kIGNoZWNrIGZvciBlcnJvcnMgYmVmb3JlIHRoZSBmaWxlIG9iamVjdHMgYXJlIGRlbGV0ZWQuCisgICAgICogT24gT1MgWCwgZmZsdXNoKClpbmcgc3RkaW4gY2F1c2VzIGFuIGVycm9yLCBzbyB3ZSBleGVtcHQgc3RkaW4KKyAgICAgKiBmcm9tIHRoYXQgcHJvY2VkdXJlLgorICAgICAqLworICAgIHN5c2luID0gUHlGaWxlX0Zyb21GaWxlKHN0ZGluLCAiPHN0ZGluPiIsICJyIiwgTlVMTCk7CisgICAgc3lzb3V0ID0gUHlGaWxlX0Zyb21GaWxlKHN0ZG91dCwgIjxzdGRvdXQ+IiwgInciLCBfY2hlY2tfYW5kX2ZsdXNoKTsKKyAgICBzeXNlcnIgPSBQeUZpbGVfRnJvbUZpbGUoc3RkZXJyLCAiPHN0ZGVycj4iLCAidyIsIF9jaGVja19hbmRfZmx1c2gpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJzdGRpbiIsIHN5c2luKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAic3Rkb3V0Iiwgc3lzb3V0KTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAic3RkZXJyIiwgc3lzZXJyKTsKLQkvKiBNYWtlIGJhY2t1cCBjb3BpZXMgZm9yIGNsZWFudXAgKi8KLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19zdGRpbl9fIiwgc3lzaW4pOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJfX3N0ZG91dF9fIiwgc3lzb3V0KTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19zdGRlcnJfXyIsIHN5c2Vycik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fZGlzcGxheWhvb2tfXyIsCi0JCQkgICAgIFB5RGljdF9HZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJkaXNwbGF5aG9vayIpKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19leGNlcHRob29rX18iLAotCQkJICAgICBQeURpY3RfR2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiZXhjZXB0aG9vayIpKTsKLQlQeV9YREVDUkVGKHN5c2luKTsKLQlQeV9YREVDUkVGKHN5c291dCk7Ci0JUHlfWERFQ1JFRihzeXNlcnIpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJzdGRpbiIsIHN5c2luKTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAic3Rkb3V0Iiwgc3lzb3V0KTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAic3RkZXJyIiwgc3lzZXJyKTsKKyAgICAvKiBNYWtlIGJhY2t1cCBjb3BpZXMgZm9yIGNsZWFudXAgKi8KKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19zdGRpbl9fIiwgc3lzaW4pOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJfX3N0ZG91dF9fIiwgc3lzb3V0KTsKKyAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiX19zdGRlcnJfXyIsIHN5c2Vycik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIl9fZGlzcGxheWhvb2tfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlEaWN0X0dldEl0ZW1TdHJpbmcoc3lzZGljdCwgImRpc3BsYXlob29rIikpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJfX2V4Y2VwdGhvb2tfXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlEaWN0X0dldEl0ZW1TdHJpbmcoc3lzZGljdCwgImV4Y2VwdGhvb2siKSk7CisgICAgUHlfWERFQ1JFRihzeXNpbik7CisgICAgUHlfWERFQ1JFRihzeXNvdXQpOworICAgIFB5X1hERUNSRUYoc3lzZXJyKTsKIAotCVNFVF9TWVNfRlJPTV9TVFJJTkcoInZlcnNpb24iLAotCQkJICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldFZlcnNpb24oKSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImhleHZlcnNpb24iLAotCQkJICAgICBQeUludF9Gcm9tTG9uZyhQWV9WRVJTSU9OX0hFWCkpOwotCXN2bnZlcnNpb25faW5pdCgpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoInN1YnZlcnNpb24iLAotCQkJICAgICBQeV9CdWlsZFZhbHVlKCIoc3N6KSIsICJDUHl0aG9uIiwgYnJhbmNoLAotCQkJCQkgIHN2bl9yZXZpc2lvbikpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImRvbnRfd3JpdGVfYnl0ZWNvZGUiLAotCQkJICAgICBQeUJvb2xfRnJvbUxvbmcoUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnKSk7Ci0JLyoKLQkgKiBUaGVzZSByZWxlYXNlIGxldmVsIGNoZWNrcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGFuZCBjb3ZlcgotCSAqIHRoZSBmaWVsZCwgc28gZG9uJ3QgZ2V0IHRvbyBmYW5jeSB3aXRoIHRoZSBwcmUtcHJvY2Vzc29yIQotCSAqLworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoInZlcnNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0VmVyc2lvbigpKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiaGV4dmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoUFlfVkVSU0lPTl9IRVgpKTsKKyAgICBzdm52ZXJzaW9uX2luaXQoKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJzdWJ2ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCIoc3N6KSIsICJDUHl0aG9uIiwgYnJhbmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdm5fcmV2aXNpb24pKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJkb250X3dyaXRlX2J5dGVjb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeUJvb2xfRnJvbUxvbmcoUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnKSk7CisgICAgLyoKKyAgICAgKiBUaGVzZSByZWxlYXNlIGxldmVsIGNoZWNrcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGFuZCBjb3ZlcgorICAgICAqIHRoZSBmaWVsZCwgc28gZG9uJ3QgZ2V0IHRvbyBmYW5jeSB3aXRoIHRoZSBwcmUtcHJvY2Vzc29yIQorICAgICAqLwogI2lmIFBZX1JFTEVBU0VfTEVWRUwgPT0gUFlfUkVMRUFTRV9MRVZFTF9BTFBIQQotCXMgPSAiYWxwaGEiOworICAgIHMgPSAiYWxwaGEiOwogI2VsaWYgUFlfUkVMRUFTRV9MRVZFTCA9PSBQWV9SRUxFQVNFX0xFVkVMX0JFVEEKLQlzID0gImJldGEiOworICAgIHMgPSAiYmV0YSI7CiAjZWxpZiBQWV9SRUxFQVNFX0xFVkVMID09IFBZX1JFTEVBU0VfTEVWRUxfR0FNTUEKLQlzID0gImNhbmRpZGF0ZSI7CisgICAgcyA9ICJjYW5kaWRhdGUiOwogI2VsaWYgUFlfUkVMRUFTRV9MRVZFTCA9PSBQWV9SRUxFQVNFX0xFVkVMX0ZJTkFMCi0JcyA9ICJmaW5hbCI7CisgICAgcyA9ICJmaW5hbCI7CiAjZW5kaWYKIAotCVNFVF9TWVNfRlJPTV9TVFJJTkcoInZlcnNpb25faW5mbyIsCi0JCQkgICAgUHlfQnVpbGRWYWx1ZSgiaWlpc2kiLCBQWV9NQUpPUl9WRVJTSU9OLAotCQkJCQkgICAgICAgUFlfTUlOT1JfVkVSU0lPTiwKLQkJCQkJICAgICAgIFBZX01JQ1JPX1ZFUlNJT04sIHMsCi0JCQkJCSAgICAgICBQWV9SRUxFQVNFX1NFUklBTCkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImFwaV92ZXJzaW9uIiwKLQkJCSAgICBQeUludF9Gcm9tTG9uZyhQWVRIT05fQVBJX1ZFUlNJT04pKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJjb3B5cmlnaHQiLAotCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0Q29weXJpZ2h0KCkpKTsKLQlTRVRfU1lTX0ZST01fU1RSSU5HKCJwbGF0Zm9ybSIsCi0JCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQbGF0Zm9ybSgpKSk7Ci0JU0VUX1NZU19GUk9NX1NUUklORygiZXhlY3V0YWJsZSIsCi0JCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQcm9ncmFtRnVsbFBhdGgoKSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoInByZWZpeCIsCi0JCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQcmVmaXgoKSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImV4ZWNfcHJlZml4IiwKLQkJICAgCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldEV4ZWNQcmVmaXgoKSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoIm1heHNpemUiLAotCQkJICAgIFB5SW50X0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUFYKSk7Ci0JU0VUX1NZU19GUk9NX1NUUklORygibWF4aW50IiwKLQkJCSAgICBQeUludF9Gcm9tTG9uZyhQeUludF9HZXRNYXgoKSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoInB5M2t3YXJuaW5nIiwKLQkJCSAgICBQeUJvb2xfRnJvbUxvbmcoUHlfUHkza1dhcm5pbmdGbGFnKSk7Ci0JU0VUX1NZU19GUk9NX1NUUklORygiZmxvYXRfaW5mbyIsCi0JCQkgICAgUHlGbG9hdF9HZXRJbmZvKCkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoInZlcnNpb25faW5mbyIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJpaWlzaSIsIFBZX01BSk9SX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFlfTUlOT1JfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQWV9NSUNST19WRVJTSU9OLCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZX1JFTEVBU0VfU0VSSUFMKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiYXBpX3ZlcnNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoUFlUSE9OX0FQSV9WRVJTSU9OKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiY29weXJpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0Q29weXJpZ2h0KCkpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJwbGF0Zm9ybSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldFBsYXRmb3JtKCkpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJleGVjdXRhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKCkpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJwcmVmaXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQcmVmaXgoKSkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImV4ZWNfcHJlZml4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0RXhlY1ByZWZpeCgpKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygibWF4c2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoIm1heGludCIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZyhQeUludF9HZXRNYXgoKSkpOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoInB5M2t3YXJuaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5Qm9vbF9Gcm9tTG9uZyhQeV9QeTNrV2FybmluZ0ZsYWcpKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJmbG9hdF9pbmZvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RmxvYXRfR2V0SW5mbygpKTsKICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCi0JU0VUX1NZU19GUk9NX1NUUklORygibWF4dW5pY29kZSIsCi0JCQkgICAgUHlJbnRfRnJvbUxvbmcoUHlVbmljb2RlX0dldE1heCgpKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygibWF4dW5pY29kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUludF9Gcm9tTG9uZyhQeVVuaWNvZGVfR2V0TWF4KCkpKTsKICNlbmRpZgotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImJ1aWx0aW5fbW9kdWxlX25hbWVzIiwKLQkJCSAgICBsaXN0X2J1aWx0aW5fbW9kdWxlX25hbWVzKCkpOwotCXsKLQkJLyogQXNzdW1lcyB0aGF0IGxvbmdzIGFyZSBhdCBsZWFzdCAyIGJ5dGVzIGxvbmcuCi0JCSAgIFNob3VsZCBiZSBzYWZlISAqLwotCQl1bnNpZ25lZCBsb25nIG51bWJlciA9IDE7Ci0JCWNoYXIgKnZhbHVlOworICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImJ1aWx0aW5fbW9kdWxlX25hbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfYnVpbHRpbl9tb2R1bGVfbmFtZXMoKSk7CisgICAgeworICAgICAgICAvKiBBc3N1bWVzIHRoYXQgbG9uZ3MgYXJlIGF0IGxlYXN0IDIgYnl0ZXMgbG9uZy4KKyAgICAgICAgICAgU2hvdWxkIGJlIHNhZmUhICovCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyID0gMTsKKyAgICAgICAgY2hhciAqdmFsdWU7CiAKLQkJcyA9IChjaGFyICopICZudW1iZXI7Ci0JCWlmIChzWzBdID09IDApCi0JCQl2YWx1ZSA9ICJiaWciOwotCQllbHNlCi0JCQl2YWx1ZSA9ICJsaXR0bGUiOwotCQlTRVRfU1lTX0ZST01fU1RSSU5HKCJieXRlb3JkZXIiLAotCQkJCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbHVlKSk7Ci0JfQorICAgICAgICBzID0gKGNoYXIgKikgJm51bWJlcjsKKyAgICAgICAgaWYgKHNbMF0gPT0gMCkKKyAgICAgICAgICAgIHZhbHVlID0gImJpZyI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbHVlID0gImxpdHRsZSI7CisgICAgICAgIFNFVF9TWVNfRlJPTV9TVFJJTkcoImJ5dGVvcmRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZyh2YWx1ZSkpOworICAgIH0KICNpZmRlZiBNU19DT1JFRExMCi0JU0VUX1NZU19GUk9NX1NUUklORygiZGxsaGFuZGxlIiwKLQkJCSAgICBQeUxvbmdfRnJvbVZvaWRQdHIoUHlXaW5fRExMaE1vZHVsZSkpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoIndpbnZlciIsCi0JCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeVdpbl9ETExWZXJzaW9uU3RyaW5nKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygiZGxsaGFuZGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5TG9uZ19Gcm9tVm9pZFB0cihQeVdpbl9ETExoTW9kdWxlKSk7CisgICAgU0VUX1NZU19GUk9NX1NUUklORygid2ludmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlXaW5fRExMVmVyc2lvblN0cmluZykpOwogI2VuZGlmCi0JaWYgKHdhcm5vcHRpb25zID09IE5VTEwpIHsKLQkJd2Fybm9wdGlvbnMgPSBQeUxpc3RfTmV3KDApOwotCX0KLQllbHNlIHsKLQkJUHlfSU5DUkVGKHdhcm5vcHRpb25zKTsKLQl9Ci0JaWYgKHdhcm5vcHRpb25zICE9IE5VTEwpIHsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgIndhcm5vcHRpb25zIiwgd2Fybm9wdGlvbnMpOwotCX0KKyAgICBpZiAod2Fybm9wdGlvbnMgPT0gTlVMTCkgeworICAgICAgICB3YXJub3B0aW9ucyA9IFB5TGlzdF9OZXcoMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeV9JTkNSRUYod2Fybm9wdGlvbnMpOworICAgIH0KKyAgICBpZiAod2Fybm9wdGlvbnMgIT0gTlVMTCkgeworICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAid2Fybm9wdGlvbnMiLCB3YXJub3B0aW9ucyk7CisgICAgfQogCi0JaWYgKEZsYWdzVHlwZS50cF9uYW1lID09IDApCi0JCVB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJkZsYWdzVHlwZSwgJmZsYWdzX2Rlc2MpOwotCVNFVF9TWVNfRlJPTV9TVFJJTkcoImZsYWdzIiwgbWFrZV9mbGFncygpKTsKLQkvKiBwcmV2ZW50IHVzZXIgZnJvbSBjcmVhdGluZyBuZXcgaW5zdGFuY2VzICovCi0JRmxhZ3NUeXBlLnRwX2luaXQgPSBOVUxMOwotCUZsYWdzVHlwZS50cF9uZXcgPSBOVUxMOworICAgIGlmIChGbGFnc1R5cGUudHBfbmFtZSA9PSAwKQorICAgICAgICBQeVN0cnVjdFNlcXVlbmNlX0luaXRUeXBlKCZGbGFnc1R5cGUsICZmbGFnc19kZXNjKTsKKyAgICBTRVRfU1lTX0ZST01fU1RSSU5HKCJmbGFncyIsIG1ha2VfZmxhZ3MoKSk7CisgICAgLyogcHJldmVudCB1c2VyIGZyb20gY3JlYXRpbmcgbmV3IGluc3RhbmNlcyAqLworICAgIEZsYWdzVHlwZS50cF9pbml0ID0gTlVMTDsKKyAgICBGbGFnc1R5cGUudHBfbmV3ID0gTlVMTDsKIAogI3VuZGVmIFNFVF9TWVNfRlJPTV9TVFJJTkcKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIG07CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBtOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogbWFrZXBhdGhvYmplY3QoY2hhciAqcGF0aCwgaW50IGRlbGltKQogewotCWludCBpLCBuOwotCWNoYXIgKnA7Ci0JUHlPYmplY3QgKnYsICp3OworICAgIGludCBpLCBuOworICAgIGNoYXIgKnA7CisgICAgUHlPYmplY3QgKnYsICp3OwogCi0JbiA9IDE7Ci0JcCA9IHBhdGg7Ci0Jd2hpbGUgKChwID0gc3RyY2hyKHAsIGRlbGltKSkgIT0gTlVMTCkgewotCQluKys7Ci0JCXArKzsKLQl9Ci0JdiA9IFB5TGlzdF9OZXcobik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9yIChpID0gMDsgOyBpKyspIHsKLQkJcCA9IHN0cmNocihwYXRoLCBkZWxpbSk7Ci0JCWlmIChwID09IE5VTEwpCi0JCQlwID0gc3RyY2hyKHBhdGgsICdcMCcpOyAvKiBFbmQgb2Ygc3RyaW5nICovCi0JCXcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShwYXRoLCAoUHlfc3NpemVfdCkgKHAgLSBwYXRoKSk7Ci0JCWlmICh3ID09IE5VTEwpIHsKLQkJCVB5X0RFQ1JFRih2KTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCVB5TGlzdF9TZXRJdGVtKHYsIGksIHcpOwotCQlpZiAoKnAgPT0gJ1wwJykKLQkJCWJyZWFrOwotCQlwYXRoID0gcCsxOwotCX0KLQlyZXR1cm4gdjsKKyAgICBuID0gMTsKKyAgICBwID0gcGF0aDsKKyAgICB3aGlsZSAoKHAgPSBzdHJjaHIocCwgZGVsaW0pKSAhPSBOVUxMKSB7CisgICAgICAgIG4rKzsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICB2ID0gUHlMaXN0X05ldyhuKTsKKyAgICBpZiAodiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyA7IGkrKykgeworICAgICAgICBwID0gc3RyY2hyKHBhdGgsIGRlbGltKTsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgIHAgPSBzdHJjaHIocGF0aCwgJ1wwJyk7IC8qIEVuZCBvZiBzdHJpbmcgKi8KKyAgICAgICAgdyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHBhdGgsIChQeV9zc2l6ZV90KSAocCAtIHBhdGgpKTsKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgUHlMaXN0X1NldEl0ZW0odiwgaSwgdyk7CisgICAgICAgIGlmICgqcCA9PSAnXDAnKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHBhdGggPSBwKzE7CisgICAgfQorICAgIHJldHVybiB2OwogfQogCiB2b2lkCiBQeVN5c19TZXRQYXRoKGNoYXIgKnBhdGgpCiB7Ci0JUHlPYmplY3QgKnY7Ci0JaWYgKCh2ID0gbWFrZXBhdGhvYmplY3QocGF0aCwgREVMSU0pKSA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBjcmVhdGUgc3lzLnBhdGgiKTsKLQlpZiAoUHlTeXNfU2V0T2JqZWN0KCJwYXRoIiwgdikgIT0gMCkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgYXNzaWduIHN5cy5wYXRoIik7Ci0JUHlfREVDUkVGKHYpOworICAgIFB5T2JqZWN0ICp2OworICAgIGlmICgodiA9IG1ha2VwYXRob2JqZWN0KHBhdGgsIERFTElNKSkgPT0gTlVMTCkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiY2FuJ3QgY3JlYXRlIHN5cy5wYXRoIik7CisgICAgaWYgKFB5U3lzX1NldE9iamVjdCgicGF0aCIsIHYpICE9IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGFzc2lnbiBzeXMucGF0aCIpOworICAgIFB5X0RFQ1JFRih2KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG1ha2Vhcmd2b2JqZWN0KGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlQeU9iamVjdCAqYXY7Ci0JaWYgKGFyZ2MgPD0gMCB8fCBhcmd2ID09IE5VTEwpIHsKLQkJLyogRW5zdXJlIGF0IGxlYXN0IG9uZSAoZW1wdHkpIGFyZ3VtZW50IGlzIHNlZW4gKi8KLQkJc3RhdGljIGNoYXIgKmVtcHR5X2FyZ3ZbMV0gPSB7IiJ9OwotCQlhcmd2ID0gZW1wdHlfYXJndjsKLQkJYXJnYyA9IDE7Ci0JfQotCWF2ID0gUHlMaXN0X05ldyhhcmdjKTsKLQlpZiAoYXYgIT0gTlVMTCkgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgIFB5T2JqZWN0ICphdjsKKyAgICBpZiAoYXJnYyA8PSAwIHx8IGFyZ3YgPT0gTlVMTCkgeworICAgICAgICAvKiBFbnN1cmUgYXQgbGVhc3Qgb25lIChlbXB0eSkgYXJndW1lbnQgaXMgc2VlbiAqLworICAgICAgICBzdGF0aWMgY2hhciAqZW1wdHlfYXJndlsxXSA9IHsiIn07CisgICAgICAgIGFyZ3YgPSBlbXB0eV9hcmd2OworICAgICAgICBhcmdjID0gMTsKKyAgICB9CisgICAgYXYgPSBQeUxpc3RfTmV3KGFyZ2MpOworICAgIGlmIChhdiAhPSBOVUxMKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CiAjaWZkZWYgX19WTVMKLQkJCVB5T2JqZWN0ICp2OworICAgICAgICAgICAgUHlPYmplY3QgKnY7CiAKLQkJCS8qIGFyZ3ZbMF0gaXMgdGhlIHNjcmlwdCBwYXRobmFtZSBpZiBrbm93biAqLwotCQkJaWYgKGkgPT0gMCkgewotCQkJCWNoYXIqIGZuID0gZGVjYyR0cmFuc2xhdGVfdm1zKGFyZ3ZbMF0pOwotCQkJCWlmICgoZm4gPT0gKGNoYXIgKikwKSB8fCBmbiA9PSAoY2hhciAqKS0xKQotCQkJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhhcmd2WzBdKTsKLQkJCQllbHNlCi0JCQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKAotCQkJCQkJZGVjYyR0cmFuc2xhdGVfdm1zKGFyZ3ZbMF0pKTsKLQkJCX0gZWxzZQotCQkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbaV0pOworICAgICAgICAgICAgLyogYXJndlswXSBpcyB0aGUgc2NyaXB0IHBhdGhuYW1lIGlmIGtub3duICovCisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciogZm4gPSBkZWNjJHRyYW5zbGF0ZV92bXMoYXJndlswXSk7CisgICAgICAgICAgICAgICAgaWYgKChmbiA9PSAoY2hhciAqKTApIHx8IGZuID09IChjaGFyICopLTEpCisgICAgICAgICAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNjJHRyYW5zbGF0ZV92bXMoYXJndlswXSkpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoYXJndltpXSk7CiAjZWxzZQotCQkJUHlPYmplY3QgKnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbaV0pOworICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGFyZ3ZbaV0pOwogI2VuZGlmCi0JCQlpZiAodiA9PSBOVUxMKSB7Ci0JCQkJUHlfREVDUkVGKGF2KTsKLQkJCQlhdiA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlQeUxpc3RfU2V0SXRlbShhdiwgaSwgdik7Ci0JCX0KLQl9Ci0JcmV0dXJuIGF2OworICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhdik7CisgICAgICAgICAgICAgICAgYXYgPSBOVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0oYXYsIGksIHYpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhdjsKIH0KIAogdm9pZAogUHlTeXNfU2V0QXJndihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAjaWYgZGVmaW5lZChIQVZFX1JFQUxQQVRIKQotCWNoYXIgZnVsbHBhdGhbTUFYUEFUSExFTl07CisgICAgY2hhciBmdWxscGF0aFtNQVhQQVRITEVOXTsKICNlbGlmIGRlZmluZWQoTVNfV0lORE9XUykgJiYgIWRlZmluZWQoTVNfV0lOQ0UpCi0JY2hhciBmdWxscGF0aFtNQVhfUEFUSF07CisgICAgY2hhciBmdWxscGF0aFtNQVhfUEFUSF07CiAjZW5kaWYKLQlQeU9iamVjdCAqYXYgPSBtYWtlYXJndm9iamVjdChhcmdjLCBhcmd2KTsKLQlQeU9iamVjdCAqcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpOwotCWlmIChhdiA9PSBOVUxMKQotCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIHN5cy5hcmd2Iik7Ci0JaWYgKFB5U3lzX1NldE9iamVjdCgiYXJndiIsIGF2KSAhPSAwKQotCQlQeV9GYXRhbEVycm9yKCJjYW4ndCBhc3NpZ24gc3lzLmFyZ3YiKTsKLQlpZiAocGF0aCAhPSBOVUxMKSB7Ci0JCWNoYXIgKmFyZ3YwID0gYXJndlswXTsKLQkJY2hhciAqcCA9IE5VTEw7Ci0JCVB5X3NzaXplX3QgbiA9IDA7Ci0JCVB5T2JqZWN0ICphOworICAgIFB5T2JqZWN0ICphdiA9IG1ha2Vhcmd2b2JqZWN0KGFyZ2MsIGFyZ3YpOworICAgIFB5T2JqZWN0ICpwYXRoID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoIik7CisgICAgaWYgKGF2ID09IE5VTEwpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3Igc3lzLmFyZ3YiKTsKKyAgICBpZiAoUHlTeXNfU2V0T2JqZWN0KCJhcmd2IiwgYXYpICE9IDApCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGFzc2lnbiBzeXMuYXJndiIpOworICAgIGlmIChwYXRoICE9IE5VTEwpIHsKKyAgICAgICAgY2hhciAqYXJndjAgPSBhcmd2WzBdOworICAgICAgICBjaGFyICpwID0gTlVMTDsKKyAgICAgICAgUHlfc3NpemVfdCBuID0gMDsKKyAgICAgICAgUHlPYmplY3QgKmE7CiAjaWZkZWYgSEFWRV9SRUFETElOSwotCQljaGFyIGxpbmtbTUFYUEFUSExFTisxXTsKLQkJY2hhciBhcmd2MGNvcHlbMipNQVhQQVRITEVOKzFdOwotCQlpbnQgbnIgPSAwOwotCQlpZiAoYXJnYyA+IDAgJiYgYXJndjAgIT0gTlVMTCAmJiBzdHJjbXAoYXJndjAsICItYyIpICE9IDApCi0JCQluciA9IHJlYWRsaW5rKGFyZ3YwLCBsaW5rLCBNQVhQQVRITEVOKTsKLQkJaWYgKG5yID4gMCkgewotCQkJLyogSXQncyBhIHN5bWxpbmsgKi8KLQkJCWxpbmtbbnJdID0gJ1wwJzsKLQkJCWlmIChsaW5rWzBdID09IFNFUCkKLQkJCQlhcmd2MCA9IGxpbms7IC8qIExpbmsgdG8gYWJzb2x1dGUgcGF0aCAqLwotCQkJZWxzZSBpZiAoc3RyY2hyKGxpbmssIFNFUCkgPT0gTlVMTCkKLQkJCQk7IC8qIExpbmsgd2l0aG91dCBwYXRoICovCi0JCQllbHNlIHsKLQkJCQkvKiBNdXN0IGpvaW4oZGlybmFtZShhcmd2MCksIGxpbmspICovCi0JCQkJY2hhciAqcSA9IHN0cnJjaHIoYXJndjAsIFNFUCk7Ci0JCQkJaWYgKHEgPT0gTlVMTCkKLQkJCQkJYXJndjAgPSBsaW5rOyAvKiBhcmd2MCB3aXRob3V0IHBhdGggKi8KLQkJCQllbHNlIHsKLQkJCQkJLyogTXVzdCBtYWtlIGEgY29weSAqLwotCQkJCQlzdHJjcHkoYXJndjBjb3B5LCBhcmd2MCk7Ci0JCQkJCXEgPSBzdHJyY2hyKGFyZ3YwY29weSwgU0VQKTsKLQkJCQkJc3RyY3B5KHErMSwgbGluayk7Ci0JCQkJCWFyZ3YwID0gYXJndjBjb3B5OwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBjaGFyIGxpbmtbTUFYUEFUSExFTisxXTsKKyAgICAgICAgY2hhciBhcmd2MGNvcHlbMipNQVhQQVRITEVOKzFdOworICAgICAgICBpbnQgbnIgPSAwOworICAgICAgICBpZiAoYXJnYyA+IDAgJiYgYXJndjAgIT0gTlVMTCAmJiBzdHJjbXAoYXJndjAsICItYyIpICE9IDApCisgICAgICAgICAgICBuciA9IHJlYWRsaW5rKGFyZ3YwLCBsaW5rLCBNQVhQQVRITEVOKTsKKyAgICAgICAgaWYgKG5yID4gMCkgeworICAgICAgICAgICAgLyogSXQncyBhIHN5bWxpbmsgKi8KKyAgICAgICAgICAgIGxpbmtbbnJdID0gJ1wwJzsKKyAgICAgICAgICAgIGlmIChsaW5rWzBdID09IFNFUCkKKyAgICAgICAgICAgICAgICBhcmd2MCA9IGxpbms7IC8qIExpbmsgdG8gYWJzb2x1dGUgcGF0aCAqLworICAgICAgICAgICAgZWxzZSBpZiAoc3RyY2hyKGxpbmssIFNFUCkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICA7IC8qIExpbmsgd2l0aG91dCBwYXRoICovCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBNdXN0IGpvaW4oZGlybmFtZShhcmd2MCksIGxpbmspICovCisgICAgICAgICAgICAgICAgY2hhciAqcSA9IHN0cnJjaHIoYXJndjAsIFNFUCk7CisgICAgICAgICAgICAgICAgaWYgKHEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgYXJndjAgPSBsaW5rOyAvKiBhcmd2MCB3aXRob3V0IHBhdGggKi8KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTXVzdCBtYWtlIGEgY29weSAqLworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoYXJndjBjb3B5LCBhcmd2MCk7CisgICAgICAgICAgICAgICAgICAgIHEgPSBzdHJyY2hyKGFyZ3YwY29weSwgU0VQKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHErMSwgbGluayk7CisgICAgICAgICAgICAgICAgICAgIGFyZ3YwID0gYXJndjBjb3B5OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2VuZGlmIC8qIEhBVkVfUkVBRExJTksgKi8KICNpZiBTRVAgPT0gJ1xcJyAvKiBTcGVjaWFsIGNhc2UgZm9yIE1TIGZpbGVuYW1lIHN5bnRheCAqLwotCQlpZiAoYXJnYyA+IDAgJiYgYXJndjAgIT0gTlVMTCAmJiBzdHJjbXAoYXJndjAsICItYyIpICE9IDApIHsKLQkJCWNoYXIgKnE7CisgICAgICAgIGlmIChhcmdjID4gMCAmJiBhcmd2MCAhPSBOVUxMICYmIHN0cmNtcChhcmd2MCwgIi1jIikgIT0gMCkgeworICAgICAgICAgICAgY2hhciAqcTsKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpICYmICFkZWZpbmVkKE1TX1dJTkNFKQotCQkJLyogVGhpcyBjb2RlIGhlcmUgcmVwbGFjZXMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYXJndiB3aXRoIHRoZSBmdWxsCi0JCQlwYXRoIHRoYXQgaXQgcmVwcmVzZW50cy4gVW5kZXIgQ0UsIHRoZXJlIGFyZSBubyByZWxhdGl2ZSBwYXRocyBzbwotCQkJdGhlIGFyZ3VtZW50IG11c3QgYmUgdGhlIGZ1bGwgcGF0aCBhbnl3YXkuICovCi0JCQljaGFyICpwdGVtcDsKLQkJCWlmIChHZXRGdWxsUGF0aE5hbWUoYXJndjAsCi0JCQkJCSAgIHNpemVvZihmdWxscGF0aCksCi0JCQkJCSAgIGZ1bGxwYXRoLAotCQkJCQkgICAmcHRlbXApKSB7Ci0JCQkJYXJndjAgPSBmdWxscGF0aDsKLQkJCX0KKyAgICAgICAgICAgIC8qIFRoaXMgY29kZSBoZXJlIHJlcGxhY2VzIHRoZSBmaXJzdCBlbGVtZW50IGluIGFyZ3Ygd2l0aCB0aGUgZnVsbAorICAgICAgICAgICAgcGF0aCB0aGF0IGl0IHJlcHJlc2VudHMuIFVuZGVyIENFLCB0aGVyZSBhcmUgbm8gcmVsYXRpdmUgcGF0aHMgc28KKyAgICAgICAgICAgIHRoZSBhcmd1bWVudCBtdXN0IGJlIHRoZSBmdWxsIHBhdGggYW55d2F5LiAqLworICAgICAgICAgICAgY2hhciAqcHRlbXA7CisgICAgICAgICAgICBpZiAoR2V0RnVsbFBhdGhOYW1lKGFyZ3YwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmdWxscGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0ZW1wKSkgeworICAgICAgICAgICAgICAgIGFyZ3YwID0gZnVsbHBhdGg7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCXAgPSBzdHJyY2hyKGFyZ3YwLCBTRVApOwotCQkJLyogVGVzdCBmb3IgYWx0ZXJuYXRlIHNlcGFyYXRvciAqLwotCQkJcSA9IHN0cnJjaHIocCA/IHAgOiBhcmd2MCwgJy8nKTsKLQkJCWlmIChxICE9IE5VTEwpCi0JCQkJcCA9IHE7Ci0JCQlpZiAocCAhPSBOVUxMKSB7Ci0JCQkJbiA9IHAgKyAxIC0gYXJndjA7Ci0JCQkJaWYgKG4gPiAxICYmIHBbLTFdICE9ICc6JykKLQkJCQkJbi0tOyAvKiBEcm9wIHRyYWlsaW5nIHNlcGFyYXRvciAqLwotCQkJfQotCQl9CisgICAgICAgICAgICBwID0gc3RycmNocihhcmd2MCwgU0VQKTsKKyAgICAgICAgICAgIC8qIFRlc3QgZm9yIGFsdGVybmF0ZSBzZXBhcmF0b3IgKi8KKyAgICAgICAgICAgIHEgPSBzdHJyY2hyKHAgPyBwIDogYXJndjAsICcvJyk7CisgICAgICAgICAgICBpZiAocSAhPSBOVUxMKQorICAgICAgICAgICAgICAgIHAgPSBxOworICAgICAgICAgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG4gPSBwICsgMSAtIGFyZ3YwOworICAgICAgICAgICAgICAgIGlmIChuID4gMSAmJiBwWy0xXSAhPSAnOicpCisgICAgICAgICAgICAgICAgICAgIG4tLTsgLyogRHJvcCB0cmFpbGluZyBzZXBhcmF0b3IgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogI2Vsc2UgLyogQWxsIG90aGVyIGZpbGVuYW1lIHN5bnRheGVzICovCi0JCWlmIChhcmdjID4gMCAmJiBhcmd2MCAhPSBOVUxMICYmIHN0cmNtcChhcmd2MCwgIi1jIikgIT0gMCkgeworICAgICAgICBpZiAoYXJnYyA+IDAgJiYgYXJndjAgIT0gTlVMTCAmJiBzdHJjbXAoYXJndjAsICItYyIpICE9IDApIHsKICNpZiBkZWZpbmVkKEhBVkVfUkVBTFBBVEgpCi0JCQlpZiAocmVhbHBhdGgoYXJndjAsIGZ1bGxwYXRoKSkgewotCQkJCWFyZ3YwID0gZnVsbHBhdGg7Ci0JCQl9CisgICAgICAgICAgICBpZiAocmVhbHBhdGgoYXJndjAsIGZ1bGxwYXRoKSkgeworICAgICAgICAgICAgICAgIGFyZ3YwID0gZnVsbHBhdGg7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCXAgPSBzdHJyY2hyKGFyZ3YwLCBTRVApOwotCQl9Ci0JCWlmIChwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHAgPSBzdHJyY2hyKGFyZ3YwLCBTRVApOworICAgICAgICB9CisgICAgICAgIGlmIChwICE9IE5VTEwpIHsKICNpZm5kZWYgUklTQ09TCi0JCQluID0gcCArIDEgLSBhcmd2MDsKKyAgICAgICAgICAgIG4gPSBwICsgMSAtIGFyZ3YwOwogI2Vsc2UgLyogZG9uJ3QgaW5jbHVkZSB0cmFpbGluZyBzZXBhcmF0b3IgKi8KLQkJCW4gPSBwIC0gYXJndjA7CisgICAgICAgICAgICBuID0gcCAtIGFyZ3YwOwogI2VuZGlmIC8qIFJJU0NPUyAqLwogI2lmIFNFUCA9PSAnLycgLyogU3BlY2lhbCBjYXNlIGZvciBVbml4IGZpbGVuYW1lIHN5bnRheCAqLwotCQkJaWYgKG4gPiAxKQotCQkJCW4tLTsgLyogRHJvcCB0cmFpbGluZyBzZXBhcmF0b3IgKi8KKyAgICAgICAgICAgIGlmIChuID4gMSkKKyAgICAgICAgICAgICAgICBuLS07IC8qIERyb3AgdHJhaWxpbmcgc2VwYXJhdG9yICovCiAjZW5kaWYgLyogVW5peCAqLwotCQl9CisgICAgICAgIH0KICNlbmRpZiAvKiBBbGwgb3RoZXJzICovCi0JCWEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShhcmd2MCwgbik7Ci0JCWlmIChhID09IE5VTEwpCi0JCQlQeV9GYXRhbEVycm9yKCJubyBtZW0gZm9yIHN5cy5wYXRoIGluc2VydGlvbiIpOwotCQlpZiAoUHlMaXN0X0luc2VydChwYXRoLCAwLCBhKSA8IDApCi0JCQlQeV9GYXRhbEVycm9yKCJzeXMucGF0aC5pbnNlcnQoMCkgZmFpbGVkIik7Ci0JCVB5X0RFQ1JFRihhKTsKLQl9Ci0JUHlfREVDUkVGKGF2KTsKKyAgICAgICAgYSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGFyZ3YwLCBuKTsKKyAgICAgICAgaWYgKGEgPT0gTlVMTCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIm5vIG1lbSBmb3Igc3lzLnBhdGggaW5zZXJ0aW9uIik7CisgICAgICAgIGlmIChQeUxpc3RfSW5zZXJ0KHBhdGgsIDAsIGEpIDwgMCkKKyAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoInN5cy5wYXRoLmluc2VydCgwKSBmYWlsZWQiKTsKKyAgICAgICAgUHlfREVDUkVGKGEpOworICAgIH0KKyAgICBQeV9ERUNSRUYoYXYpOwogfQogCiAKQEAgLTE2NTksNDggKzE2NTksNDggQEAKIHN0YXRpYyB2b2lkCiBteXdyaXRlKGNoYXIgKm5hbWUsIEZJTEUgKmZwLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEpCiB7Ci0JUHlPYmplY3QgKmZpbGU7Ci0JUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKKyAgICBQeU9iamVjdCAqZmlsZTsKKyAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOwogCi0JUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7Ci0JZmlsZSA9IFB5U3lzX0dldE9iamVjdChuYW1lKTsKLQlpZiAoZmlsZSA9PSBOVUxMIHx8IFB5RmlsZV9Bc0ZpbGUoZmlsZSkgPT0gZnApCi0JCXZmcHJpbnRmKGZwLCBmb3JtYXQsIHZhKTsKLQllbHNlIHsKLQkJY2hhciBidWZmZXJbMTAwMV07Ci0JCWNvbnN0IGludCB3cml0dGVuID0gUHlPU192c25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLQkJCQkJCSAgIGZvcm1hdCwgdmEpOwotCQlpZiAoUHlGaWxlX1dyaXRlU3RyaW5nKGJ1ZmZlciwgZmlsZSkgIT0gMCkgewotCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWZwdXRzKGJ1ZmZlciwgZnApOwotCQl9Ci0JCWlmICh3cml0dGVuIDwgMCB8fCAoc2l6ZV90KXdyaXR0ZW4gPj0gc2l6ZW9mKGJ1ZmZlcikpIHsKLQkJCWNvbnN0IGNoYXIgKnRydW5jYXRlZCA9ICIuLi4gdHJ1bmNhdGVkIjsKLQkJCWlmIChQeUZpbGVfV3JpdGVTdHJpbmcodHJ1bmNhdGVkLCBmaWxlKSAhPSAwKSB7Ci0JCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCQlmcHV0cyh0cnVuY2F0ZWQsIGZwKTsKLQkJCX0KLQkJfQotCX0KLQlQeUVycl9SZXN0b3JlKGVycm9yX3R5cGUsIGVycm9yX3ZhbHVlLCBlcnJvcl90cmFjZWJhY2spOworICAgIFB5RXJyX0ZldGNoKCZlcnJvcl90eXBlLCAmZXJyb3JfdmFsdWUsICZlcnJvcl90cmFjZWJhY2spOworICAgIGZpbGUgPSBQeVN5c19HZXRPYmplY3QobmFtZSk7CisgICAgaWYgKGZpbGUgPT0gTlVMTCB8fCBQeUZpbGVfQXNGaWxlKGZpbGUpID09IGZwKQorICAgICAgICB2ZnByaW50ZihmcCwgZm9ybWF0LCB2YSk7CisgICAgZWxzZSB7CisgICAgICAgIGNoYXIgYnVmZmVyWzEwMDFdOworICAgICAgICBjb25zdCBpbnQgd3JpdHRlbiA9IFB5T1NfdnNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCB2YSk7CisgICAgICAgIGlmIChQeUZpbGVfV3JpdGVTdHJpbmcoYnVmZmVyLCBmaWxlKSAhPSAwKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgZnB1dHMoYnVmZmVyLCBmcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdyaXR0ZW4gPCAwIHx8IChzaXplX3Qpd3JpdHRlbiA+PSBzaXplb2YoYnVmZmVyKSkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqdHJ1bmNhdGVkID0gIi4uLiB0cnVuY2F0ZWQiOworICAgICAgICAgICAgaWYgKFB5RmlsZV9Xcml0ZVN0cmluZyh0cnVuY2F0ZWQsIGZpbGUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgICAgIGZwdXRzKHRydW5jYXRlZCwgZnApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7CiB9CiAKIHZvaWQKIFB5U3lzX1dyaXRlU3Rkb3V0KGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7CisgICAgdmFfbGlzdCB2YTsKIAotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCW15d3JpdGUoInN0ZG91dCIsIHN0ZG91dCwgZm9ybWF0LCB2YSk7Ci0JdmFfZW5kKHZhKTsKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICBteXdyaXRlKCJzdGRvdXQiLCBzdGRvdXQsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CiB9CiAKIHZvaWQKIFB5U3lzX1dyaXRlU3RkZXJyKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewotCXZhX2xpc3QgdmE7CisgICAgdmFfbGlzdCB2YTsKIAotCXZhX3N0YXJ0KHZhLCBmb3JtYXQpOwotCW15d3JpdGUoInN0ZGVyciIsIHN0ZGVyciwgZm9ybWF0LCB2YSk7Ci0JdmFfZW5kKHZhKTsKKyAgICB2YV9zdGFydCh2YSwgZm9ybWF0KTsKKyAgICBteXdyaXRlKCJzdGRlcnIiLCBzdGRlcnIsIGZvcm1hdCwgdmEpOworICAgIHZhX2VuZCh2YSk7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkLmMgYi9QeXRob24vdGhyZWFkLmMKaW5kZXggMDM1ODBmMy4uMDk3ZTcyZCAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZC5jCisrKyBiL1B5dGhvbi90aHJlYWQuYwpAQCAtNDYsNyArNDYsNyBAQAogI2VuZGlmCiAKIC8qIENoZWNrIGlmIHdlJ3JlIHJ1bm5pbmcgb24gSFAtVVggYW5kIF9TQ19USFJFQURTIGlzIGRlZmluZWQuIElmIHNvLCB0aGVuCi0gICBlbm91Z2ggb2YgdGhlIFBvc2l4IHRocmVhZHMgcGFja2FnZSBpcyBpbXBsaW1lbnRlZCB0byBzdXBwb3J0IHB5dGhvbiAKKyAgIGVub3VnaCBvZiB0aGUgUG9zaXggdGhyZWFkcyBwYWNrYWdlIGlzIGltcGxpbWVudGVkIHRvIHN1cHBvcnQgcHl0aG9uCiAgICB0aHJlYWRzLgogCiAgICBUaGlzIGlzIHZhbGlkIGZvciBIUC1VWCAxMS4yMyBydW5uaW5nIG9uIGFuIGlhNjQgc3lzdGVtLiBJZiBuZWVkZWQsIGFkZApAQCAtNjQsOCArNjQsOCBAQAogCiAjaWZkZWYgUHlfREVCVUcKIHN0YXRpYyBpbnQgdGhyZWFkX2RlYnVnID0gMDsKLSNkZWZpbmUgZHByaW50ZihhcmdzKQkodm9pZCkoKHRocmVhZF9kZWJ1ZyAmIDEpICYmIHByaW50ZiBhcmdzKQotI2RlZmluZSBkMnByaW50ZihhcmdzKQkoKHRocmVhZF9kZWJ1ZyAmIDgpICYmIHByaW50ZiBhcmdzKQorI2RlZmluZSBkcHJpbnRmKGFyZ3MpICAgKHZvaWQpKCh0aHJlYWRfZGVidWcgJiAxKSAmJiBwcmludGYgYXJncykKKyNkZWZpbmUgZDJwcmludGYoYXJncykgICgodGhyZWFkX2RlYnVnICYgOCkgJiYgcHJpbnRmIGFyZ3MpCiAjZWxzZQogI2RlZmluZSBkcHJpbnRmKGFyZ3MpCiAjZGVmaW5lIGQycHJpbnRmKGFyZ3MpCkBAIC03OSwyMCArNzksMjAgQEAKIFB5VGhyZWFkX2luaXRfdGhyZWFkKHZvaWQpCiB7CiAjaWZkZWYgUHlfREVCVUcKLQljaGFyICpwID0gUHlfR0VURU5WKCJQWVRIT05USFJFQURERUJVRyIpOworICAgIGNoYXIgKnAgPSBQeV9HRVRFTlYoIlBZVEhPTlRIUkVBRERFQlVHIik7CiAKLQlpZiAocCkgewotCQlpZiAoKnApCi0JCQl0aHJlYWRfZGVidWcgPSBhdG9pKHApOwotCQllbHNlCi0JCQl0aHJlYWRfZGVidWcgPSAxOwotCX0KKyAgICBpZiAocCkgeworICAgICAgICBpZiAoKnApCisgICAgICAgICAgICB0aHJlYWRfZGVidWcgPSBhdG9pKHApOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJlYWRfZGVidWcgPSAxOworICAgIH0KICNlbmRpZiAvKiBQeV9ERUJVRyAqLwotCWlmIChpbml0aWFsaXplZCkKLQkJcmV0dXJuOwotCWluaXRpYWxpemVkID0gMTsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfaW5pdF90aHJlYWQgY2FsbGVkXG4iKSk7Ci0JUHlUaHJlYWRfX2luaXRfdGhyZWFkKCk7CisgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICByZXR1cm47CisgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIGRwcmludGYoKCJQeVRocmVhZF9pbml0X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBQeVRocmVhZF9faW5pdF90aHJlYWQoKTsKIH0KIAogLyogU3VwcG9ydCBmb3IgcnVudGltZSB0aHJlYWQgc3RhY2sgc2l6ZSB0dW5pbmcuCkBAIC0xNTksMjEgKzE1OSwyMSBAQAogc2l6ZV90CiBQeVRocmVhZF9nZXRfc3RhY2tzaXplKHZvaWQpCiB7Ci0JcmV0dXJuIF9weXRocmVhZF9zdGFja3NpemU7CisgICAgcmV0dXJuIF9weXRocmVhZF9zdGFja3NpemU7CiB9CiAKIC8qIE9ubHkgcGxhdGZvcm1zIGRlZmluaW5nIGEgVEhSRUFEX1NFVF9TVEFDS1NJWkUoKSBtYWNybwogICAgaW4gdGhyZWFkXzxwbGF0Zm9ybT4uaCBzdXBwb3J0IGNoYW5naW5nIHRoZSBzdGFjayBzaXplLgogICAgUmV0dXJuIDAgaWYgc3RhY2sgc2l6ZSBpcyB2YWxpZCwKLSAgICAgICAgICAtMSBpZiBzdGFjayBzaXplIHZhbHVlIGlzIGludmFsaWQsCi0gICAgICAgICAgLTIgaWYgc2V0dGluZyBzdGFjayBzaXplIGlzIG5vdCBzdXBwb3J0ZWQuICovCisgICAgICAtMSBpZiBzdGFjayBzaXplIHZhbHVlIGlzIGludmFsaWQsCisgICAgICAtMiBpZiBzZXR0aW5nIHN0YWNrIHNpemUgaXMgbm90IHN1cHBvcnRlZC4gKi8KIGludAogUHlUaHJlYWRfc2V0X3N0YWNrc2l6ZShzaXplX3Qgc2l6ZSkKIHsKICNpZiBkZWZpbmVkKFRIUkVBRF9TRVRfU1RBQ0tTSVpFKQotCXJldHVybiBUSFJFQURfU0VUX1NUQUNLU0laRShzaXplKTsKKyAgICByZXR1cm4gVEhSRUFEX1NFVF9TVEFDS1NJWkUoc2l6ZSk7CiAjZWxzZQotCXJldHVybiAtMjsKKyAgICByZXR1cm4gLTI7CiAjZW5kaWYKIH0KIApAQCAtMjI1LDE1ICsyMjUsMTUgQEAKICAqIHRvIGVuZm9yY2UgZXhjbHVzaW9uIGludGVybmFsbHkuCiAgKi8KIHN0cnVjdCBrZXkgewotCS8qIE5leHQgcmVjb3JkIGluIHRoZSBsaXN0LCBvciBOVUxMIGlmIHRoaXMgaXMgdGhlIGxhc3QgcmVjb3JkLiAqLwotCXN0cnVjdCBrZXkgKm5leHQ7CisgICAgLyogTmV4dCByZWNvcmQgaW4gdGhlIGxpc3QsIG9yIE5VTEwgaWYgdGhpcyBpcyB0aGUgbGFzdCByZWNvcmQuICovCisgICAgc3RydWN0IGtleSAqbmV4dDsKIAotCS8qIFRoZSB0aHJlYWQgaWQsIGFjY29yZGluZyB0byBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkuICovCi0JbG9uZyBpZDsKKyAgICAvKiBUaGUgdGhyZWFkIGlkLCBhY2NvcmRpbmcgdG8gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLiAqLworICAgIGxvbmcgaWQ7CiAKLQkvKiBUaGUga2V5IGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZS4gKi8KLQlpbnQga2V5OwotCXZvaWQgKnZhbHVlOworICAgIC8qIFRoZSBrZXkgYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlLiAqLworICAgIGludCBrZXk7CisgICAgdm9pZCAqdmFsdWU7CiB9OwogCiBzdGF0aWMgc3RydWN0IGtleSAqa2V5aGVhZCA9IE5VTEw7CkBAIC0yNjQsNDEgKzI2NCw0MSBAQAogc3RhdGljIHN0cnVjdCBrZXkgKgogZmluZF9rZXkoaW50IGtleSwgdm9pZCAqdmFsdWUpCiB7Ci0Jc3RydWN0IGtleSAqcCwgKnByZXZfcDsKLQlsb25nIGlkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIHN0cnVjdCBrZXkgKnAsICpwcmV2X3A7CisgICAgbG9uZyBpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKIAotCWlmICgha2V5bXV0ZXgpCi0JCXJldHVybiBOVUxMOwotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhrZXltdXRleCwgMSk7Ci0JcHJldl9wID0gTlVMTDsKLQlmb3IgKHAgPSBrZXloZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KSB7Ci0JCWlmIChwLT5pZCA9PSBpZCAmJiBwLT5rZXkgPT0ga2V5KQotCQkJZ290byBEb25lOwotCQkvKiBTYW5pdHkgY2hlY2suICBUaGVzZSBzdGF0ZXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBidXQgaWYKLQkJICogdGhleSBkbyB3ZSBtdXN0IGFib3J0LiAgT3RoZXJ3aXNlIHdlJ2xsIGVuZCB1cCBzcGlubmluZyBpbgotCQkgKiBpbiBhIHRpZ2h0IGxvb3Agd2l0aCB0aGUgbG9jayBoZWxkLiAgQSBzaW1pbGFyIGNoZWNrIGlzIGRvbmUKLQkJICogaW4gcHlzdGF0ZS5jIHRzdGF0ZV9kZWxldGVfY29tbW9uKCkuICAqLwotCQlpZiAocCA9PSBwcmV2X3ApCi0JCQlQeV9GYXRhbEVycm9yKCJ0bHMgZmluZF9rZXk6IHNtYWxsIGNpcmN1bGFyIGxpc3QoISkiKTsKLQkJcHJldl9wID0gcDsKLQkJaWYgKHAtPm5leHQgPT0ga2V5aGVhZCkKLQkJCVB5X0ZhdGFsRXJyb3IoInRscyBmaW5kX2tleTogY2lyY3VsYXIgbGlzdCghKSIpOwotCX0KLQlpZiAodmFsdWUgPT0gTlVMTCkgewotCQlhc3NlcnQocCA9PSBOVUxMKTsKLQkJZ290byBEb25lOwotCX0KLQlwID0gKHN0cnVjdCBrZXkgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBrZXkpKTsKLQlpZiAocCAhPSBOVUxMKSB7Ci0JCXAtPmlkID0gaWQ7Ci0JCXAtPmtleSA9IGtleTsKLQkJcC0+dmFsdWUgPSB2YWx1ZTsKLQkJcC0+bmV4dCA9IGtleWhlYWQ7Ci0JCWtleWhlYWQgPSBwOwotCX0KKyAgICBpZiAoIWtleW11dGV4KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeVRocmVhZF9hY3F1aXJlX2xvY2soa2V5bXV0ZXgsIDEpOworICAgIHByZXZfcCA9IE5VTEw7CisgICAgZm9yIChwID0ga2V5aGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgeworICAgICAgICBpZiAocC0+aWQgPT0gaWQgJiYgcC0+a2V5ID09IGtleSkKKyAgICAgICAgICAgIGdvdG8gRG9uZTsKKyAgICAgICAgLyogU2FuaXR5IGNoZWNrLiAgVGhlc2Ugc3RhdGVzIHNob3VsZCBuZXZlciBoYXBwZW4gYnV0IGlmCisgICAgICAgICAqIHRoZXkgZG8gd2UgbXVzdCBhYm9ydC4gIE90aGVyd2lzZSB3ZSdsbCBlbmQgdXAgc3Bpbm5pbmcgaW4KKyAgICAgICAgICogaW4gYSB0aWdodCBsb29wIHdpdGggdGhlIGxvY2sgaGVsZC4gIEEgc2ltaWxhciBjaGVjayBpcyBkb25lCisgICAgICAgICAqIGluIHB5c3RhdGUuYyB0c3RhdGVfZGVsZXRlX2NvbW1vbigpLiAgKi8KKyAgICAgICAgaWYgKHAgPT0gcHJldl9wKQorICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigidGxzIGZpbmRfa2V5OiBzbWFsbCBjaXJjdWxhciBsaXN0KCEpIik7CisgICAgICAgIHByZXZfcCA9IHA7CisgICAgICAgIGlmIChwLT5uZXh0ID09IGtleWhlYWQpCisgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJ0bHMgZmluZF9rZXk6IGNpcmN1bGFyIGxpc3QoISkiKTsKKyAgICB9CisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgYXNzZXJ0KHAgPT0gTlVMTCk7CisgICAgICAgIGdvdG8gRG9uZTsKKyAgICB9CisgICAgcCA9IChzdHJ1Y3Qga2V5ICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qga2V5KSk7CisgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICBwLT5pZCA9IGlkOworICAgICAgICBwLT5rZXkgPSBrZXk7CisgICAgICAgIHAtPnZhbHVlID0gdmFsdWU7CisgICAgICAgIHAtPm5leHQgPSBrZXloZWFkOworICAgICAgICBrZXloZWFkID0gcDsKKyAgICB9CiAgRG9uZToKLQlQeVRocmVhZF9yZWxlYXNlX2xvY2soa2V5bXV0ZXgpOwotCXJldHVybiBwOworICAgIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhrZXltdXRleCk7CisgICAgcmV0dXJuIHA7CiB9CiAKIC8qIFJldHVybiBhIG5ldyBrZXkuICBUaGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgZnVuY3Rpb25zIGluCkBAIC0zMDgsMzIgKzMwOCwzMiBAQAogaW50CiBQeVRocmVhZF9jcmVhdGVfa2V5KHZvaWQpCiB7Ci0JLyogQWxsIHBhcnRzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIHdyb25nIGlmIGl0J3MgY2FsbGVkIGJ5IG11bHRpcGxlCi0JICogdGhyZWFkcyBzaW11bHRhbmVvdXNseS4KLQkgKi8KLQlpZiAoa2V5bXV0ZXggPT0gTlVMTCkKLQkJa2V5bXV0ZXggPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JcmV0dXJuICsrbmtleXM7CisgICAgLyogQWxsIHBhcnRzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIHdyb25nIGlmIGl0J3MgY2FsbGVkIGJ5IG11bHRpcGxlCisgICAgICogdGhyZWFkcyBzaW11bHRhbmVvdXNseS4KKyAgICAgKi8KKyAgICBpZiAoa2V5bXV0ZXggPT0gTlVMTCkKKyAgICAgICAga2V5bXV0ZXggPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgcmV0dXJuICsrbmtleXM7CiB9CiAKIC8qIEZvcmdldCB0aGUgYXNzb2NpYXRpb25zIGZvciBrZXkgYWNyb3NzICphbGwqIHRocmVhZHMuICovCiB2b2lkCiBQeVRocmVhZF9kZWxldGVfa2V5KGludCBrZXkpCiB7Ci0Jc3RydWN0IGtleSAqcCwgKipxOworICAgIHN0cnVjdCBrZXkgKnAsICoqcTsKIAotCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhrZXltdXRleCwgMSk7Ci0JcSA9ICZrZXloZWFkOwotCXdoaWxlICgocCA9ICpxKSAhPSBOVUxMKSB7Ci0JCWlmIChwLT5rZXkgPT0ga2V5KSB7Ci0JCQkqcSA9IHAtPm5leHQ7Ci0JCQlmcmVlKCh2b2lkICopcCk7Ci0JCQkvKiBOQiBUaGlzIGRvZXMgKm5vdCogZnJlZSBwLT52YWx1ZSEgKi8KLQkJfQotCQllbHNlCi0JCQlxID0gJnAtPm5leHQ7Ci0JfQotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhrZXltdXRleCk7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGtleW11dGV4LCAxKTsKKyAgICBxID0gJmtleWhlYWQ7CisgICAgd2hpbGUgKChwID0gKnEpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHAtPmtleSA9PSBrZXkpIHsKKyAgICAgICAgICAgICpxID0gcC0+bmV4dDsKKyAgICAgICAgICAgIGZyZWUoKHZvaWQgKilwKTsKKyAgICAgICAgICAgIC8qIE5CIFRoaXMgZG9lcyAqbm90KiBmcmVlIHAtPnZhbHVlISAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHEgPSAmcC0+bmV4dDsKKyAgICB9CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGtleW11dGV4KTsKIH0KIAogLyogQ29uZnVzaW5nOiAgSWYgdGhlIGN1cnJlbnQgdGhyZWFkIGhhcyBhbiBhc3NvY2lhdGlvbiBmb3Iga2V5LApAQCAtMzQ1LDE0ICszNDUsMTQgQEAKIGludAogUHlUaHJlYWRfc2V0X2tleV92YWx1ZShpbnQga2V5LCB2b2lkICp2YWx1ZSkKIHsKLQlzdHJ1Y3Qga2V5ICpwOworICAgIHN0cnVjdCBrZXkgKnA7CiAKLQlhc3NlcnQodmFsdWUgIT0gTlVMTCk7Ci0JcCA9IGZpbmRfa2V5KGtleSwgdmFsdWUpOwotCWlmIChwID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQllbHNlCi0JCXJldHVybiAwOworICAgIGFzc2VydCh2YWx1ZSAhPSBOVUxMKTsKKyAgICBwID0gZmluZF9rZXkoa2V5LCB2YWx1ZSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgga2V5IGluIHRoZSBjdXJyZW50IHRocmVhZCwgb3IgTlVMTApAQCAtMzYxLDM0ICszNjEsMzQgQEAKIHZvaWQgKgogUHlUaHJlYWRfZ2V0X2tleV92YWx1ZShpbnQga2V5KQogewotCXN0cnVjdCBrZXkgKnAgPSBmaW5kX2tleShrZXksIE5VTEwpOworICAgIHN0cnVjdCBrZXkgKnAgPSBmaW5kX2tleShrZXksIE5VTEwpOwogCi0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZQotCQlyZXR1cm4gcC0+dmFsdWU7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcC0+dmFsdWU7CiB9CiAKIC8qIEZvcmdldCB0aGUgY3VycmVudCB0aHJlYWQncyBhc3NvY2lhdGlvbiBmb3Iga2V5LCBpZiBhbnkuICovCiB2b2lkCiBQeVRocmVhZF9kZWxldGVfa2V5X3ZhbHVlKGludCBrZXkpCiB7Ci0JbG9uZyBpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKLQlzdHJ1Y3Qga2V5ICpwLCAqKnE7CisgICAgbG9uZyBpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBzdHJ1Y3Qga2V5ICpwLCAqKnE7CiAKLQlQeVRocmVhZF9hY3F1aXJlX2xvY2soa2V5bXV0ZXgsIDEpOwotCXEgPSAma2V5aGVhZDsKLQl3aGlsZSAoKHAgPSAqcSkgIT0gTlVMTCkgewotCQlpZiAocC0+a2V5ID09IGtleSAmJiBwLT5pZCA9PSBpZCkgewotCQkJKnEgPSBwLT5uZXh0OwotCQkJZnJlZSgodm9pZCAqKXApOwotCQkJLyogTkIgVGhpcyBkb2VzICpub3QqIGZyZWUgcC0+dmFsdWUhICovCi0JCQlicmVhazsKLQkJfQotCQllbHNlCi0JCQlxID0gJnAtPm5leHQ7Ci0JfQotCVB5VGhyZWFkX3JlbGVhc2VfbG9jayhrZXltdXRleCk7CisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGtleW11dGV4LCAxKTsKKyAgICBxID0gJmtleWhlYWQ7CisgICAgd2hpbGUgKChwID0gKnEpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHAtPmtleSA9PSBrZXkgJiYgcC0+aWQgPT0gaWQpIHsKKyAgICAgICAgICAgICpxID0gcC0+bmV4dDsKKyAgICAgICAgICAgIGZyZWUoKHZvaWQgKilwKTsKKyAgICAgICAgICAgIC8qIE5CIFRoaXMgZG9lcyAqbm90KiBmcmVlIHAtPnZhbHVlISAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcSA9ICZwLT5uZXh0OworICAgIH0KKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2soa2V5bXV0ZXgpOwogfQogCiAvKiBGb3JnZXQgZXZlcnl0aGluZyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHRocmVhZCBpZC4KQEAgLTM5OSwyNyArMzk5LDI3IEBACiB2b2lkCiBQeVRocmVhZF9SZUluaXRUTFModm9pZCkKIHsKLQlsb25nIGlkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCXN0cnVjdCBrZXkgKnAsICoqcTsKKyAgICBsb25nIGlkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOworICAgIHN0cnVjdCBrZXkgKnAsICoqcTsKIAotCWlmICgha2V5bXV0ZXgpCi0JCXJldHVybjsKLQkKLQkvKiBBcyB3aXRoIGludGVycHJldGVyX2xvY2sgaW4gUHlFdmFsX1JlSW5pdFRocmVhZHMoKQotCSAgIHdlIGp1c3QgY3JlYXRlIGEgbmV3IGxvY2sgd2l0aG91dCBmcmVlaW5nIHRoZSBvbGQgb25lICovCi0Ja2V5bXV0ZXggPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7CisgICAgaWYgKCFrZXltdXRleCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogRGVsZXRlIGFsbCBrZXlzIHdoaWNoIGRvIG5vdCBtYXRjaCB0aGUgY3VycmVudCB0aHJlYWQgaWQgKi8KLQlxID0gJmtleWhlYWQ7Ci0Jd2hpbGUgKChwID0gKnEpICE9IE5VTEwpIHsKLQkJaWYgKHAtPmlkICE9IGlkKSB7Ci0JCQkqcSA9IHAtPm5leHQ7Ci0JCQlmcmVlKCh2b2lkICopcCk7Ci0JCQkvKiBOQiBUaGlzIGRvZXMgKm5vdCogZnJlZSBwLT52YWx1ZSEgKi8KLQkJfQotCQllbHNlCi0JCQlxID0gJnAtPm5leHQ7Ci0JfQorICAgIC8qIEFzIHdpdGggaW50ZXJwcmV0ZXJfbG9jayBpbiBQeUV2YWxfUmVJbml0VGhyZWFkcygpCisgICAgICAgd2UganVzdCBjcmVhdGUgYSBuZXcgbG9jayB3aXRob3V0IGZyZWVpbmcgdGhlIG9sZCBvbmUgKi8KKyAgICBrZXltdXRleCA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKworICAgIC8qIERlbGV0ZSBhbGwga2V5cyB3aGljaCBkbyBub3QgbWF0Y2ggdGhlIGN1cnJlbnQgdGhyZWFkIGlkICovCisgICAgcSA9ICZrZXloZWFkOworICAgIHdoaWxlICgocCA9ICpxKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwLT5pZCAhPSBpZCkgeworICAgICAgICAgICAgKnEgPSBwLT5uZXh0OworICAgICAgICAgICAgZnJlZSgodm9pZCAqKXApOworICAgICAgICAgICAgLyogTkIgVGhpcyBkb2VzICpub3QqIGZyZWUgcC0+dmFsdWUhICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcSA9ICZwLT5uZXh0OworICAgIH0KIH0KIAogI2VuZGlmIC8qIFB5X0hBVkVfTkFUSVZFX1RMUyAqLwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9hdGhlb3MuaCBiL1B5dGhvbi90aHJlYWRfYXRoZW9zLmgKaW5kZXggYzlmNWUyMy4uYzM5MGI1NyAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9hdGhlb3MuaAorKysgYi9QeXRob24vdGhyZWFkX2F0aGVvcy5oCkBAIC0xOSw4ICsxOSw4IEBACiAKIC8qIFVzZSBhbiBhdG9taWMgY291bnRlciBhbmQgYSBzZW1hcGhvcmUgZm9yIG1heGltdW0gc3BlZWQuICovCiB0eXBlZGVmIHN0cnVjdCBmYXN0bXV0ZXggewotCXNlbV9pZCBzZW07Ci0JYXRvbWljX3QgY291bnQ7CisgICAgc2VtX2lkIHNlbTsKKyAgICBhdG9taWNfdCBjb3VudDsKIH0gZmFzdG11dGV4X3Q7CiAKIApAQCAtMzMsNDkgKzMzLDQ5IEBACiAKIHN0YXRpYyBpbnQgZmFzdG11dGV4X2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBmYXN0bXV0ZXhfdCAqIG11dGV4KQogewotCW11dGV4LT5jb3VudCA9IDA7Ci0JbXV0ZXgtPnNlbSA9IGNyZWF0ZV9zZW1hcGhvcmUobmFtZSwgMCwgMCk7Ci0JcmV0dXJuIChtdXRleC0+c2VtIDwgMCkgPyAtMSA6IDA7CisgICAgbXV0ZXgtPmNvdW50ID0gMDsKKyAgICBtdXRleC0+c2VtID0gY3JlYXRlX3NlbWFwaG9yZShuYW1lLCAwLCAwKTsKKyAgICByZXR1cm4gKG11dGV4LT5zZW0gPCAwKSA/IC0xIDogMDsKIH0KIAogCiBzdGF0aWMgaW50IGZhc3RtdXRleF9kZXN0cm95KGZhc3RtdXRleF90ICogbXV0ZXgpCiB7Ci0JaWYgKGZhc3RtdXRleF90aW1lZGxvY2sobXV0ZXgsIDApID09IDAgfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spIHsKLQkJcmV0dXJuIGRlbGV0ZV9zZW1hcGhvcmUobXV0ZXgtPnNlbSk7Ci0JfQotCXJldHVybiAwOworICAgIGlmIChmYXN0bXV0ZXhfdGltZWRsb2NrKG11dGV4LCAwKSA9PSAwIHx8IGVycm5vID09IEVXT1VMREJMT0NLKSB7CisgICAgICAgIHJldHVybiBkZWxldGVfc2VtYXBob3JlKG11dGV4LT5zZW0pOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50IGZhc3RtdXRleF9sb2NrKGZhc3RtdXRleF90ICogbXV0ZXgpCiB7Ci0JYXRvbWljX3QgcHJldiA9IGF0b21pY19hZGQoJm11dGV4LT5jb3VudCwgMSk7Ci0JaWYgKHByZXYgPiAwKQotCQlyZXR1cm4gbG9ja19zZW1hcGhvcmUobXV0ZXgtPnNlbSk7Ci0JcmV0dXJuIDA7CisgICAgYXRvbWljX3QgcHJldiA9IGF0b21pY19hZGQoJm11dGV4LT5jb3VudCwgMSk7CisgICAgaWYgKHByZXYgPiAwKQorICAgICAgICByZXR1cm4gbG9ja19zZW1hcGhvcmUobXV0ZXgtPnNlbSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIGludCBmYXN0bXV0ZXhfdGltZWRsb2NrKGZhc3RtdXRleF90ICogbXV0ZXgsIGJpZ3RpbWVfdCB0aW1lb3V0KQogewotCWF0b21pY190IHByZXYgPSBhdG9taWNfYWRkKCZtdXRleC0+Y291bnQsIDEpOwotCWlmIChwcmV2ID4gMCkKLQkJcmV0dXJuIGxvY2tfc2VtYXBob3JlX3gobXV0ZXgtPnNlbSwgMSwgMCwgdGltZW91dCk7Ci0JcmV0dXJuIDA7CisgICAgYXRvbWljX3QgcHJldiA9IGF0b21pY19hZGQoJm11dGV4LT5jb3VudCwgMSk7CisgICAgaWYgKHByZXYgPiAwKQorICAgICAgICByZXR1cm4gbG9ja19zZW1hcGhvcmVfeChtdXRleC0+c2VtLCAxLCAwLCB0aW1lb3V0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgaW50IGZhc3RtdXRleF91bmxvY2soZmFzdG11dGV4X3QgKiBtdXRleCkKIHsKLQlhdG9taWNfdCBwcmV2ID0gYXRvbWljX2FkZCgmbXV0ZXgtPmNvdW50LCAtMSk7Ci0JaWYgKHByZXYgPiAxKQotCQlyZXR1cm4gdW5sb2NrX3NlbWFwaG9yZShtdXRleC0+c2VtKTsKLQlyZXR1cm4gMDsKKyAgICBhdG9taWNfdCBwcmV2ID0gYXRvbWljX2FkZCgmbXV0ZXgtPmNvdW50LCAtMSk7CisgICAgaWYgKHByZXYgPiAxKQorICAgICAgICByZXR1cm4gdW5sb2NrX3NlbWFwaG9yZShtdXRleC0+c2VtKTsKKyAgICByZXR1cm4gMDsKIH0KIAogCi0jZW5kaWYJCQkJLyogRkFTVExPQ0sgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkFTVExPQ0sgKi8KIAogCiAvKgpAQCAtODQsOCArODQsOCBAQAogICovCiBzdGF0aWMgdm9pZCBQeVRocmVhZF9faW5pdF90aHJlYWQodm9pZCkKIHsKLQkvKiBEbyBub3RoaW5nLiAqLwotCXJldHVybjsKKyAgICAvKiBEbyBub3RoaW5nLiAqLworICAgIHJldHVybjsKIH0KIAogCkBAIC05OCw5MCArOTgsOTAgQEAKIAogbG9uZyBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSAodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCXN0YXR1c190IHN1Y2Nlc3MgPSAtMTsKLQl0aHJlYWRfaWQgdGlkOwotCWNoYXIgbmFtZVtPU19OQU1FX0xFTkdUSF07Ci0JYXRvbWljX3QgdGhpc190aHJlYWQ7CisgICAgc3RhdHVzX3Qgc3VjY2VzcyA9IC0xOworICAgIHRocmVhZF9pZCB0aWQ7CisgICAgY2hhciBuYW1lW09TX05BTUVfTEVOR1RIXTsKKyAgICBhdG9taWNfdCB0aGlzX3RocmVhZDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOwogCi0JdGhpc190aHJlYWQgPSBhdG9taWNfYWRkKCZ0aHJlYWRfY291bnQsIDEpOwotCVB5T1Nfc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicHl0aG9uIHRocmVhZCAoJWQpIiwgdGhpc190aHJlYWQpOworICAgIHRoaXNfdGhyZWFkID0gYXRvbWljX2FkZCgmdGhyZWFkX2NvdW50LCAxKTsKKyAgICBQeU9TX3NucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInB5dGhvbiB0aHJlYWQgKCVkKSIsIHRoaXNfdGhyZWFkKTsKIAotCXRpZCA9IHNwYXduX3RocmVhZChuYW1lLCBmdW5jLCBOT1JNQUxfUFJJT1JJVFksIDAsIGFyZyk7Ci0JaWYgKHRpZCA8IDApIHsKLQkJZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgc3Bhd25fdGhyZWFkIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwotCX0gZWxzZSB7Ci0JCXN1Y2Nlc3MgPSByZXN1bWVfdGhyZWFkKHRpZCk7Ci0JCWlmIChzdWNjZXNzIDwgMCkgewotCQkJZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgcmVzdW1lX3RocmVhZCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKLQkJfQotCX0KKyAgICB0aWQgPSBzcGF3bl90aHJlYWQobmFtZSwgZnVuYywgTk9STUFMX1BSSU9SSVRZLCAwLCBhcmcpOworICAgIGlmICh0aWQgPCAwKSB7CisgICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHNwYXduX3RocmVhZCBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdWNjZXNzID0gcmVzdW1lX3RocmVhZCh0aWQpOworICAgICAgICBpZiAoc3VjY2VzcyA8IDApIHsKKyAgICAgICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHJlc3VtZV90aHJlYWQgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gKHN1Y2Nlc3MgPCAwID8gLTEgOiB0aWQpOworICAgIHJldHVybiAoc3VjY2VzcyA8IDAgPyAtMSA6IHRpZCk7CiB9CiAKIAogbG9uZyBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpCiB7Ci0JcmV0dXJuIGdldF90aHJlYWRfaWQoTlVMTCk7CisgICAgcmV0dXJuIGdldF90aHJlYWRfaWQoTlVMTCk7CiB9CiAKIAogc3RhdGljIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKIAotCS8qIFRocmVhZC1zYWZlIHdheSB0byByZWFkIGEgdmFyaWFibGUgd2l0aG91dCBhIG11dGV4OiAqLwotCWlmIChhdG9taWNfYWRkKCZ0aHJlYWRfY291bnQsIDApID09IDApIHsKLQkJLyogTm8gdGhyZWFkcyBhcm91bmQsIHNvIGV4aXQgbWFpbigpLiAqLwotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KDApOwotCQllbHNlCi0JCQlleGl0KDApOwotCX0gZWxzZSB7Ci0JCS8qIFdlJ3JlIGEgdGhyZWFkICovCi0JCWV4aXRfdGhyZWFkKDApOwotCX0KKyAgICAvKiBUaHJlYWQtc2FmZSB3YXkgdG8gcmVhZCBhIHZhcmlhYmxlIHdpdGhvdXQgYSBtdXRleDogKi8KKyAgICBpZiAoYXRvbWljX2FkZCgmdGhyZWFkX2NvdW50LCAwKSA9PSAwKSB7CisgICAgICAgIC8qIE5vIHRocmVhZHMgYXJvdW5kLCBzbyBleGl0IG1haW4oKS4gKi8KKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBfZXhpdCgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdCgwKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSdyZSBhIHRocmVhZCAqLworICAgICAgICBleGl0X3RocmVhZCgwKTsKKyAgICB9CiB9CiAKIAogdm9pZCBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOwogfQogCiAKIHZvaWQgUHlUaHJlYWRfX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CiB9CiAKIAogI2lmbmRlZiBOT19FWElUX1BST0cKIHN0YXRpYyB2b2lkIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzLCBpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7CiAKLQkvKiBObyBuZWVkIHRvIGRvIGFueXRoaW5nLCB0aGUgdGhyZWFkcyBnZXQgdG9ybiBkb3duIGlmIG1haW4oKWV4aXRzLiAqLwotCWlmIChub19jbGVhbnVwKQotCQlfZXhpdChzdGF0dXMpOwotCWVsc2UKLQkJZXhpdChzdGF0dXMpOworICAgIC8qIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcsIHRoZSB0aHJlYWRzIGdldCB0b3JuIGRvd24gaWYgbWFpbigpZXhpdHMuICovCisgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgZWxzZQorICAgICAgICBleGl0KHN0YXR1cyk7CiB9CiAKIAogdm9pZCBQeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKIH0KIAogCiB2b2lkIFB5VGhyZWFkX19leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKIH0KLSNlbmRpZgkJCQkvKiBOT19FWElUX1BST0cgKi8KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTk9fRVhJVF9QUk9HICovCiAKIAogLyoKQEAgLTE5NCwxMDcgKzE5NCwxMDcgQEAKIFB5VGhyZWFkX3R5cGVfbG9jayBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7CiAjaWZkZWYgRkFTVExPQ0sKLQlmYXN0bXV0ZXhfdCAqbG9jazsKKyAgICBmYXN0bXV0ZXhfdCAqbG9jazsKICNlbHNlCi0Jc2VtX2lkIHNlbWE7CisgICAgc2VtX2lkIHNlbWE7CiAjZW5kaWYKLQljaGFyIG5hbWVbT1NfTkFNRV9MRU5HVEhdOwotCWF0b21pY190IHRoaXNfbG9jazsKKyAgICBjaGFyIG5hbWVbT1NfTkFNRV9MRU5HVEhdOworICAgIGF0b21pY190IHRoaXNfbG9jazsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwogCiAjaWZkZWYgRkFTVExPQ0sKLQlsb2NrID0gKGZhc3RtdXRleF90ICopIG1hbGxvYyhzaXplb2YoZmFzdG11dGV4X3QpKTsKLQlpZiAobG9jayA9PSBOVUxMKSB7Ci0JCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGZhaWxlZDogb3V0IG9mIG1lbW9yeVxuIikpOwotCQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgTlVMTDsKLQl9CisgICAgbG9jayA9IChmYXN0bXV0ZXhfdCAqKSBtYWxsb2Moc2l6ZW9mKGZhc3RtdXRleF90KSk7CisgICAgaWYgKGxvY2sgPT0gTlVMTCkgeworICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBmYWlsZWQ6IG91dCBvZiBtZW1vcnlcbiIpKTsKKyAgICAgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIE5VTEw7CisgICAgfQogI2VuZGlmCi0JdGhpc19sb2NrID0gYXRvbWljX2FkZCgmbG9ja19jb3VudCwgMSk7Ci0JUHlPU19zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJweXRob24gbG9jayAoJWQpIiwgdGhpc19sb2NrKTsKKyAgICB0aGlzX2xvY2sgPSBhdG9taWNfYWRkKCZsb2NrX2NvdW50LCAxKTsKKyAgICBQeU9TX3NucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInB5dGhvbiBsb2NrICglZCkiLCB0aGlzX2xvY2spOwogCiAjaWZkZWYgRkFTVExPQ0sKLQlpZiAoZmFzdG11dGV4X2NyZWF0ZShuYW1lLCBsb2NrKSA8IDApIHsKLQkJZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgZmFpbGVkOiAlc1xuIiwKLQkJCSBzdHJlcnJvcihlcnJubykpKTsKLQkJZnJlZShsb2NrKTsKLQkJbG9jayA9IE5VTEw7Ci0JfQotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCktPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGlmIChmYXN0bXV0ZXhfY3JlYXRlKG5hbWUsIGxvY2spIDwgMCkgeworICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKKyAgICAgICAgZnJlZShsb2NrKTsKKyAgICAgICAgbG9jayA9IE5VTEw7CisgICAgfQorICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCktPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogI2Vsc2UKLQlzZW1hID0gY3JlYXRlX3NlbWFwaG9yZShuYW1lLCAxLCAwKTsKLQlpZiAoc2VtYSA8IDApIHsKLQkJZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgZmFpbGVkOiAlc1xuIiwKLQkJCSBzdHJlcnJvcihlcnJubykpKTsKLQkJc2VtYSA9IDA7Ci0JfQotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCktPiAlcFxuIiwgc2VtYSkpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBzZW1hOworICAgIHNlbWEgPSBjcmVhdGVfc2VtYXBob3JlKG5hbWUsIDEsIDApOworICAgIGlmIChzZW1hIDwgMCkgeworICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKKyAgICAgICAgc2VtYSA9IDA7CisgICAgfQorICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCktPiAlcFxuIiwgc2VtYSkpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBzZW1hOwogI2VuZGlmCiB9CiAKIAogdm9pZCBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKICNpZmRlZiBGQVNUTE9DSwotCWlmIChmYXN0bXV0ZXhfZGVzdHJveSgoZmFzdG11dGV4X3QgKikgbG9jaykgPCAwKSB7Ci0JCWRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGZhaWxlZDogJXNcbiIsIGxvY2ssCi0JCQkgc3RyZXJyb3IoZXJybm8pKSk7Ci0JfQotCWZyZWUobG9jayk7CisgICAgaWYgKGZhc3RtdXRleF9kZXN0cm95KChmYXN0bXV0ZXhfdCAqKSBsb2NrKSA8IDApIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgZmFpbGVkOiAlc1xuIiwgbG9jaywKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgfQorICAgIGZyZWUobG9jayk7CiAjZWxzZQotCWlmIChkZWxldGVfc2VtYXBob3JlKChzZW1faWQpIGxvY2spIDwgMCkgewotCQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBmYWlsZWQ6ICVzXG4iLCBsb2NrLAotCQkJIHN0cmVycm9yKGVycm5vKSkpOwotCX0KKyAgICBpZiAoZGVsZXRlX3NlbWFwaG9yZSgoc2VtX2lkKSBsb2NrKSA8IDApIHsKKyAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgZmFpbGVkOiAlc1xuIiwgbG9jaywKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CisgICAgfQogI2VuZGlmCiB9CiAKIAogaW50IFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCByZXR2YWw7CisgICAgaW50IHJldHZhbDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssCi0JCSB3YWl0ZmxhZykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssCisgICAgICAgICAgICAgd2FpdGZsYWcpKTsKIAogI2lmZGVmIEZBU1RMT0NLCi0JaWYgKHdhaXRmbGFnKQotCQlyZXR2YWwgPSBmYXN0bXV0ZXhfbG9jaygoZmFzdG11dGV4X3QgKikgbG9jayk7Ci0JZWxzZQotCQlyZXR2YWwgPSBmYXN0bXV0ZXhfdGltZWRsb2NrKChmYXN0bXV0ZXhfdCAqKSBsb2NrLCAwKTsKKyAgICBpZiAod2FpdGZsYWcpCisgICAgICAgIHJldHZhbCA9IGZhc3RtdXRleF9sb2NrKChmYXN0bXV0ZXhfdCAqKSBsb2NrKTsKKyAgICBlbHNlCisgICAgICAgIHJldHZhbCA9IGZhc3RtdXRleF90aW1lZGxvY2soKGZhc3RtdXRleF90ICopIGxvY2ssIDApOwogI2Vsc2UKLQlpZiAod2FpdGZsYWcpCi0JCXJldHZhbCA9IGxvY2tfc2VtYXBob3JlKChzZW1faWQpIGxvY2spOwotCWVsc2UKLQkJcmV0dmFsID0gbG9ja19zZW1hcGhvcmVfeCgoc2VtX2lkKSBsb2NrLCAxLCAwLCAwKTsKKyAgICBpZiAod2FpdGZsYWcpCisgICAgICAgIHJldHZhbCA9IGxvY2tfc2VtYXBob3JlKChzZW1faWQpIGxvY2spOworICAgIGVsc2UKKyAgICAgICAgcmV0dmFsID0gbG9ja19zZW1hcGhvcmVfeCgoc2VtX2lkKSBsb2NrLCAxLCAwLCAwKTsKICNlbmRpZgotCWlmIChyZXR2YWwgPCAwKSB7Ci0JCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBmYWlsZWQ6ICVzXG4iLAotCQkJIGxvY2ssIHdhaXRmbGFnLCBzdHJlcnJvcihlcnJubykpKTsKLQl9Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLAotCQkgcmV0dmFsKSk7Ci0JcmV0dXJuIHJldHZhbCA8IDAgPyAwIDogMTsKKyAgICBpZiAocmV0dmFsIDwgMCkgeworICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgbG9jaywgd2FpdGZsYWcsIHN0cmVycm9yKGVycm5vKSkpOworICAgIH0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCktPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsCisgICAgICAgICAgICAgcmV0dmFsKSk7CisgICAgcmV0dXJuIHJldHZhbCA8IDAgPyAwIDogMTsKIH0KIAogCiB2b2lkIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKIAogI2lmZGVmIEZBU1RMT0NLCi0JaWYgKGZhc3RtdXRleF91bmxvY2soKGZhc3RtdXRleF90ICopIGxvY2spIDwgMCkgewotCQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBmYWlsZWQ6ICVzXG4iLCBsb2NrLAotCQkJIHN0cmVycm9yKGVycm5vKSkpOwotCX0KKyAgICBpZiAoZmFzdG11dGV4X3VubG9jaygoZmFzdG11dGV4X3QgKikgbG9jaykgPCAwKSB7CisgICAgICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGZhaWxlZDogJXNcbiIsIGxvY2ssCisgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOworICAgIH0KICNlbHNlCi0JaWYgKHVubG9ja19zZW1hcGhvcmUoKHNlbV9pZCkgbG9jaykgPCAwKSB7Ci0JCWRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGZhaWxlZDogJXNcbiIsIGxvY2ssCi0JCQkgc3RyZXJyb3IoZXJybm8pKSk7Ci0JfQorICAgIGlmICh1bmxvY2tfc2VtYXBob3JlKChzZW1faWQpIGxvY2spIDwgMCkgeworICAgICAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBmYWlsZWQ6ICVzXG4iLCBsb2NrLAorICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKKyAgICB9CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfYmVvcy5oIGIvUHl0aG9uL3RocmVhZF9iZW9zLmgKaW5kZXggODJmOTlkZS4uZWRlNDRkZiAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9iZW9zLmgKKysrIGIvUHl0aG9uL3RocmVhZF9iZW9zLmgKQEAgLTcsOCArNyw4IEBACiAgKiBpbiB0aGUgQmUgRGV2ZWxvcGVyJ3MgTmV3c2xldHRlciwgSXNzdWUgIzI2IChodHRwOi8vd3d3LmJlLmNvbS8pLgogICovCiB0eXBlZGVmIHN0cnVjdCBiZW5hcGhvcmUgewotCXNlbV9pZCBfc2VtOwotCWludDMyICBfYXRvbTsKKyAgICBzZW1faWQgX3NlbTsKKyAgICBpbnQzMiAgX2F0b207CiB9IGJlbmFwaG9yZV90OwogCiBzdGF0aWMgc3RhdHVzX3QgYmVuYXBob3JlX2NyZWF0ZSggY29uc3QgY2hhciAqbmFtZSwgYmVuYXBob3JlX3QgKmJlbiApOwpAQCAtMTksNzkgKzE5LDc5IEBACiAKIHN0YXRpYyBzdGF0dXNfdCBiZW5hcGhvcmVfY3JlYXRlKCBjb25zdCBjaGFyICpuYW1lLCBiZW5hcGhvcmVfdCAqYmVuICkKIHsKLQlpZiggYmVuICE9IE5VTEwgKSB7Ci0JCWJlbi0+X2F0b20gPSAwOwotCQliZW4tPl9zZW0gPSBjcmVhdGVfc2VtKCAwLCBuYW1lICk7Ci0JCQotCQlpZiggYmVuLT5fc2VtIDwgQl9OT19FUlJPUiApIHsKLQkJCXJldHVybiBCX0JBRF9TRU1fSUQ7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXR1cm4gRUZBVUxUOwotCX0KLQkKLQlyZXR1cm4gRU9LOworICAgIGlmKCBiZW4gIT0gTlVMTCApIHsKKyAgICAgICAgYmVuLT5fYXRvbSA9IDA7CisgICAgICAgIGJlbi0+X3NlbSA9IGNyZWF0ZV9zZW0oIDAsIG5hbWUgKTsKKworICAgICAgICBpZiggYmVuLT5fc2VtIDwgQl9OT19FUlJPUiApIHsKKyAgICAgICAgICAgIHJldHVybiBCX0JBRF9TRU1fSUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRUZBVUxUOworICAgIH0KKworICAgIHJldHVybiBFT0s7CiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBiZW5hcGhvcmVfZGVzdHJveSggYmVuYXBob3JlX3QgKmJlbiApCiB7Ci0JaWYoIGJlbi0+X3NlbSA+PSBCX05PX0VSUk9SICkgewotCQlzdGF0dXNfdCByZXR2YWwgPSBiZW5hcGhvcmVfdGltZWRsb2NrKCBiZW4sIDAgKTsKLQkJCi0JCWlmKCByZXR2YWwgPT0gRU9LIHx8IHJldHZhbCA9PSBFV09VTERCTE9DSyApIHsKLQkJCXN0YXR1c190IGRlbF9yZXR2YWwgPSBkZWxldGVfc2VtKCBiZW4tPl9zZW0gKTsKLQkJCQotCQkJcmV0dXJuIGRlbF9yZXR2YWw7Ci0JCX0KLQl9CisgICAgaWYoIGJlbi0+X3NlbSA+PSBCX05PX0VSUk9SICkgeworICAgICAgICBzdGF0dXNfdCByZXR2YWwgPSBiZW5hcGhvcmVfdGltZWRsb2NrKCBiZW4sIDAgKTsKIAotCXJldHVybiBCX0JBRF9TRU1fSUQ7CisgICAgICAgIGlmKCByZXR2YWwgPT0gRU9LIHx8IHJldHZhbCA9PSBFV09VTERCTE9DSyApIHsKKyAgICAgICAgICAgIHN0YXR1c190IGRlbF9yZXR2YWwgPSBkZWxldGVfc2VtKCBiZW4tPl9zZW0gKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlbF9yZXR2YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQl9CQURfU0VNX0lEOwogfQogCiBzdGF0aWMgc3RhdHVzX3QgYmVuYXBob3JlX2xvY2soIGJlbmFwaG9yZV90ICpiZW4gKQogewotCWludDMyIHByZXYgPSBhdG9taWNfYWRkKCAmKGJlbi0+X2F0b20pLCAxICk7Ci0JCi0JaWYoIHByZXYgPiAwICkgewotCQlyZXR1cm4gYWNxdWlyZV9zZW0oIGJlbi0+X3NlbSApOwotCX0KLQkKLQlyZXR1cm4gRU9LOworICAgIGludDMyIHByZXYgPSBhdG9taWNfYWRkKCAmKGJlbi0+X2F0b20pLCAxICk7CisKKyAgICBpZiggcHJldiA+IDAgKSB7CisgICAgICAgIHJldHVybiBhY3F1aXJlX3NlbSggYmVuLT5fc2VtICk7CisgICAgfQorCisgICAgcmV0dXJuIEVPSzsKIH0KIAogc3RhdGljIHN0YXR1c190IGJlbmFwaG9yZV90aW1lZGxvY2soIGJlbmFwaG9yZV90ICpiZW4sIGJpZ3RpbWVfdCBtaWNyb3MgKQogewotCWludDMyIHByZXYgPSBhdG9taWNfYWRkKCAmKGJlbi0+X2F0b20pLCAxICk7Ci0JCi0JaWYoIHByZXYgPiAwICkgewotCQlzdGF0dXNfdCByZXR2YWwgPSBhY3F1aXJlX3NlbV9ldGMoIGJlbi0+X3NlbSwgMSwgQl9USU1FT1VULCBtaWNyb3MgKTsKLQkJCi0JCXN3aXRjaCggcmV0dmFsICkgewotCQljYXNlIEJfV09VTERfQkxPQ0s6CS8qIEZhbGwgdGhyb3VnaC4uLiAqLwotCQljYXNlIEJfVElNRURfT1VUOgotCQkJcmV0dXJuIEVXT1VMREJMT0NLOwotCQkJYnJlYWs7Ci0JCWNhc2UgQl9PSzoKLQkJCXJldHVybiBFT0s7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiByZXR2YWw7Ci0JCQlicmVhazsKLQkJfQotCX0KLQkKLQlyZXR1cm4gRU9LOworICAgIGludDMyIHByZXYgPSBhdG9taWNfYWRkKCAmKGJlbi0+X2F0b20pLCAxICk7CisKKyAgICBpZiggcHJldiA+IDAgKSB7CisgICAgICAgIHN0YXR1c190IHJldHZhbCA9IGFjcXVpcmVfc2VtX2V0YyggYmVuLT5fc2VtLCAxLCBCX1RJTUVPVVQsIG1pY3JvcyApOworCisgICAgICAgIHN3aXRjaCggcmV0dmFsICkgeworICAgICAgICBjYXNlIEJfV09VTERfQkxPQ0s6ICAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaC4uLiAqLworICAgICAgICBjYXNlIEJfVElNRURfT1VUOgorICAgICAgICAgICAgcmV0dXJuIEVXT1VMREJMT0NLOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQl9PSzoKKyAgICAgICAgICAgIHJldHVybiBFT0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBFT0s7CiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBiZW5hcGhvcmVfdW5sb2NrKCBiZW5hcGhvcmVfdCAqYmVuICkKIHsKLQlpbnQzMiBwcmV2ID0gYXRvbWljX2FkZCggJihiZW4tPl9hdG9tKSwgLTEgKTsKLQkKLQlpZiggcHJldiA+IDEgKSB7Ci0JCXJldHVybiByZWxlYXNlX3NlbSggYmVuLT5fc2VtICk7Ci0JfQotCQotCXJldHVybiBFT0s7CisgICAgaW50MzIgcHJldiA9IGF0b21pY19hZGQoICYoYmVuLT5fYXRvbSksIC0xICk7CisKKyAgICBpZiggcHJldiA+IDEgKSB7CisgICAgICAgIHJldHVybiByZWxlYXNlX3NlbSggYmVuLT5fc2VtICk7CisgICAgfQorCisgICAgcmV0dXJuIEVPSzsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTksOCArOTksOCBAQAogICovCiBzdGF0aWMgdm9pZCBQeVRocmVhZF9faW5pdF90aHJlYWQoIHZvaWQgKQogewotCS8qIERvIG5vdGhpbmcuICovCi0JcmV0dXJuOworICAgIC8qIERvIG5vdGhpbmcuICovCisgICAgcmV0dXJuOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMTQsOTAgKzExNCw5MCBAQAogCiBsb25nIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQoIHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcgKQogewotCXN0YXR1c190IHN1Y2Nlc3MgPSAwOwotCXRocmVhZF9pZCB0aWQ7Ci0JY2hhciBuYW1lW0JfT1NfTkFNRV9MRU5HVEhdOwotCWludDMyIHRoaXNfdGhyZWFkOworICAgIHN0YXR1c190IHN1Y2Nlc3MgPSAwOworICAgIHRocmVhZF9pZCB0aWQ7CisgICAgY2hhciBuYW1lW0JfT1NfTkFNRV9MRU5HVEhdOworICAgIGludDMyIHRoaXNfdGhyZWFkOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CiAKLQkvKiBXZSBhcmUgc28gdmVyeSB0aHJlYWQtc2FmZS4uLiAqLwotCXRoaXNfdGhyZWFkID0gYXRvbWljX2FkZCggJnRocmVhZF9jb3VudCwgMSApOwotCVB5T1Nfc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLAotCQkgICAgICAicHl0aG9uIHRocmVhZCAoJWQpIiwgdGhpc190aHJlYWQgKTsKKyAgICAvKiBXZSBhcmUgc28gdmVyeSB0aHJlYWQtc2FmZS4uLiAqLworICAgIHRoaXNfdGhyZWFkID0gYXRvbWljX2FkZCggJnRocmVhZF9jb3VudCwgMSApOworICAgIFB5T1Nfc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLAorICAgICAgICAgICAgICAgICAgInB5dGhvbiB0aHJlYWQgKCVkKSIsIHRoaXNfdGhyZWFkICk7CiAKLQl0aWQgPSBzcGF3bl90aHJlYWQoICh0aHJlYWRfZnVuYylmdW5jLCBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgQl9OT1JNQUxfUFJJT1JJVFksIGFyZyApOwotCWlmKCB0aWQgPiBCX05PX0VSUk9SICkgewotCQlzdWNjZXNzID0gcmVzdW1lX3RocmVhZCggdGlkICk7Ci0JfQorICAgIHRpZCA9IHNwYXduX3RocmVhZCggKHRocmVhZF9mdW5jKWZ1bmMsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBCX05PUk1BTF9QUklPUklUWSwgYXJnICk7CisgICAgaWYoIHRpZCA+IEJfTk9fRVJST1IgKSB7CisgICAgICAgIHN1Y2Nlc3MgPSByZXN1bWVfdGhyZWFkKCB0aWQgKTsKKyAgICB9CiAKLQlyZXR1cm4gKCBzdWNjZXNzID09IEJfTk9fRVJST1IgPyB0aWQgOiAtMSApOworICAgIHJldHVybiAoIHN1Y2Nlc3MgPT0gQl9OT19FUlJPUiA/IHRpZCA6IC0xICk7CiB9CiAKIGxvbmcgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCggdm9pZCApCiB7Ci0JLyogUHJlc3VtZWQgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCdzIElELi4uICovCi0JdGhyZWFkX2lkIHRpZDsKLQl0aWQgPSBmaW5kX3RocmVhZCggTlVMTCApOwotCQotCXJldHVybiAoIHRpZCAhPSBCX05BTUVfTk9UX0ZPVU5EID8gdGlkIDogLTEgKTsKKyAgICAvKiBQcmVzdW1lZCB0byByZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkJ3MgSUQuLi4gKi8KKyAgICB0aHJlYWRfaWQgdGlkOworICAgIHRpZCA9IGZpbmRfdGhyZWFkKCBOVUxMICk7CisKKyAgICByZXR1cm4gKCB0aWQgIT0gQl9OQU1FX05PVF9GT1VORCA/IHRpZCA6IC0xICk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKCBpbnQgbm9fY2xlYW51cCApCiB7Ci0JaW50MzIgdGhyZWFkczsKKyAgICBpbnQzMiB0aHJlYWRzOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKIAotCS8qIFRocmVhZC1zYWZlIHdheSB0byByZWFkIGEgdmFyaWFibGUgd2l0aG91dCBhIG11dGV4OiAqLwotCXRocmVhZHMgPSBhdG9taWNfYWRkKCAmdGhyZWFkX2NvdW50LCAwICk7CisgICAgLyogVGhyZWFkLXNhZmUgd2F5IHRvIHJlYWQgYSB2YXJpYWJsZSB3aXRob3V0IGEgbXV0ZXg6ICovCisgICAgdGhyZWFkcyA9IGF0b21pY19hZGQoICZ0aHJlYWRfY291bnQsIDAgKTsKIAotCWlmKCB0aHJlYWRzID09IDAgKSB7Ci0JCS8qIE5vIHRocmVhZHMgYXJvdW5kLCBzbyBleGl0IG1haW4oKS4gKi8KLQkJaWYoIG5vX2NsZWFudXAgKSB7Ci0JCQlfZXhpdCgwKTsKLQkJfSBlbHNlIHsKLQkJCWV4aXQoMCk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBPaCwgd2UncmUgYSB0aHJlYWQsIGxldCdzIHRyeSB0byBleGl0IGdyYWNlZnVsbHkuLi4gKi8KLQkJZXhpdF90aHJlYWQoIEJfTk9fRVJST1IgKTsKLQl9CisgICAgaWYoIHRocmVhZHMgPT0gMCApIHsKKyAgICAgICAgLyogTm8gdGhyZWFkcyBhcm91bmQsIHNvIGV4aXQgbWFpbigpLiAqLworICAgICAgICBpZiggbm9fY2xlYW51cCApIHsKKyAgICAgICAgICAgIF9leGl0KDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE9oLCB3ZSdyZSBhIHRocmVhZCwgbGV0J3MgdHJ5IHRvIGV4aXQgZ3JhY2VmdWxseS4uLiAqLworICAgICAgICBleGl0X3RocmVhZCggQl9OT19FUlJPUiApOworICAgIH0KIH0KIAogdm9pZCBQeVRocmVhZF9leGl0X3RocmVhZCggdm9pZCApCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMCk7CiB9CiAKIHZvaWQgUHlUaHJlYWRfX2V4aXRfdGhyZWFkKCB2b2lkICkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKIH0KIAogI2lmbmRlZiBOT19FWElUX1BST0cKIHN0YXRpYyB2b2lkIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyggaW50IHN0YXR1cywgaW50IG5vX2NsZWFudXAgKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKIAotCS8qIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcsIHRoZSB0aHJlYWRzIGdldCB0b3JuIGRvd24gaWYgbWFpbigpIGV4aXRzLiAqLworICAgIC8qIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcsIHRoZSB0aHJlYWRzIGdldCB0b3JuIGRvd24gaWYgbWFpbigpIGV4aXRzLiAqLwogCi0JaWYgKG5vX2NsZWFudXApIHsKLQkJX2V4aXQoc3RhdHVzKTsKLQl9IGVsc2UgewotCQlleGl0KHN0YXR1cyk7Ci0JfQorICAgIGlmIChub19jbGVhbnVwKSB7CisgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXhpdChzdGF0dXMpOworICAgIH0KIH0KIAogdm9pZCBQeVRocmVhZF9leGl0X3Byb2coIGludCBzdGF0dXMgKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOwogfQogCiB2b2lkIFB5VGhyZWFkX19leGl0X3Byb2coIGludCBzdGF0dXMgKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOwogfQogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwogCkBAIC0yMDksNzkgKzIwOSw3OSBAQAogCiBQeVRocmVhZF90eXBlX2xvY2sgUHlUaHJlYWRfYWxsb2NhdGVfbG9jayggdm9pZCApCiB7Ci0JYmVuYXBob3JlX3QgKmxvY2s7Ci0Jc3RhdHVzX3QgcmV0dmFsOwotCWNoYXIgbmFtZVtCX09TX05BTUVfTEVOR1RIXTsKLQlpbnQzMiB0aGlzX2xvY2s7Ci0JCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgYmVuYXBob3JlX3QgKmxvY2s7CisgICAgc3RhdHVzX3QgcmV0dmFsOworICAgIGNoYXIgbmFtZVtCX09TX05BTUVfTEVOR1RIXTsKKyAgICBpbnQzMiB0aGlzX2xvY2s7CiAKLQlsb2NrID0gKGJlbmFwaG9yZV90ICopbWFsbG9jKCBzaXplb2YoIGJlbmFwaG9yZV90ICkgKTsKLQlpZiggbG9jayA9PSBOVUxMICkgewotCQkvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBNZW1vcnlFcnJvciAqLwotCQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylOVUxMOwotCX0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKIAotCXRoaXNfbG9jayA9IGF0b21pY19hZGQoICZsb2NrX2NvdW50LCAxICk7Ci0JUHlPU19zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJweXRob24gbG9jayAoJWQpIiwgdGhpc19sb2NrKTsKKyAgICBsb2NrID0gKGJlbmFwaG9yZV90ICopbWFsbG9jKCBzaXplb2YoIGJlbmFwaG9yZV90ICkgKTsKKyAgICBpZiggbG9jayA9PSBOVUxMICkgeworICAgICAgICAvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBNZW1vcnlFcnJvciAqLworICAgICAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylOVUxMOworICAgIH0KIAotCXJldHZhbCA9IGJlbmFwaG9yZV9jcmVhdGUoIG5hbWUsIGxvY2sgKTsKLQlpZiggcmV0dmFsICE9IEVPSyApIHsKLQkJLyogVE9ETzogdGhhdCdzIGJhZCwgcmFpc2UgYW4gZXhjZXB0aW9uICovCi0JCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKU5VTEw7Ci0JfQorICAgIHRoaXNfbG9jayA9IGF0b21pY19hZGQoICZsb2NrX2NvdW50LCAxICk7CisgICAgUHlPU19zbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJweXRob24gbG9jayAoJWQpIiwgdGhpc19sb2NrKTsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICByZXR2YWwgPSBiZW5hcGhvcmVfY3JlYXRlKCBuYW1lLCBsb2NrICk7CisgICAgaWYoIHJldHZhbCAhPSBFT0sgKSB7CisgICAgICAgIC8qIFRPRE86IHRoYXQncyBiYWQsIHJhaXNlIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylOVUxMOworICAgIH0KKworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKIH0KIAogdm9pZCBQeVRocmVhZF9mcmVlX2xvY2soIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrICkKIHsKLQlzdGF0dXNfdCByZXR2YWw7CisgICAgc3RhdHVzX3QgcmV0dmFsOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JCi0JcmV0dmFsID0gYmVuYXBob3JlX2Rlc3Ryb3koIChiZW5hcGhvcmVfdCAqKWxvY2sgKTsKLQlpZiggcmV0dmFsICE9IEVPSyApIHsKLQkJLyogVE9ETzogdGhhdCdzIGJhZCwgcmFpc2UgYW4gZXhjZXB0aW9uICovCi0JCXJldHVybjsKLQl9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisKKyAgICByZXR2YWwgPSBiZW5hcGhvcmVfZGVzdHJveSggKGJlbmFwaG9yZV90ICopbG9jayApOworICAgIGlmKCByZXR2YWwgIT0gRU9LICkgeworICAgICAgICAvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KIH0KIAogaW50IFB5VGhyZWFkX2FjcXVpcmVfbG9jayggUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2ssIGludCB3YWl0ZmxhZyApCiB7Ci0JaW50IHN1Y2Nlc3M7Ci0Jc3RhdHVzX3QgcmV0dmFsOworICAgIGludCBzdWNjZXNzOworICAgIHN0YXR1c190IHJldHZhbDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKIAotCWlmKCB3YWl0ZmxhZyApIHsKLQkJcmV0dmFsID0gYmVuYXBob3JlX2xvY2soIChiZW5hcGhvcmVfdCAqKWxvY2sgKTsKLQl9IGVsc2UgewotCQlyZXR2YWwgPSBiZW5hcGhvcmVfdGltZWRsb2NrKCAoYmVuYXBob3JlX3QgKilsb2NrLCAwICk7Ci0JfQotCQotCWlmKCByZXR2YWwgPT0gRU9LICkgewotCQlzdWNjZXNzID0gMTsKLQl9IGVsc2UgewotCQlzdWNjZXNzID0gMDsKLQkJCi0JCS8qIFRPRE86IHRoYXQncyBiYWQsIHJhaXNlIGFuIGV4Y2VwdGlvbiAqLwotCX0KKyAgICBpZiggd2FpdGZsYWcgKSB7CisgICAgICAgIHJldHZhbCA9IGJlbmFwaG9yZV9sb2NrKCAoYmVuYXBob3JlX3QgKilsb2NrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dmFsID0gYmVuYXBob3JlX3RpbWVkbG9jayggKGJlbmFwaG9yZV90ICopbG9jaywgMCApOworICAgIH0KIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBpZiggcmV0dmFsID09IEVPSyApIHsKKyAgICAgICAgc3VjY2VzcyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VjY2VzcyA9IDA7CisKKyAgICAgICAgLyogVE9ETzogdGhhdCdzIGJhZCwgcmFpc2UgYW4gZXhjZXB0aW9uICovCisgICAgfQorCisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiB2b2lkIFB5VGhyZWFkX3JlbGVhc2VfbG9jayggUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2sgKQogewotCXN0YXR1c190IHJldHZhbDsKLQkKLQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKLQkKLQlyZXR2YWwgPSBiZW5hcGhvcmVfdW5sb2NrKCAoYmVuYXBob3JlX3QgKilsb2NrICk7Ci0JaWYoIHJldHZhbCAhPSBFT0sgKSB7Ci0JCS8qIFRPRE86IHRoYXQncyBiYWQsIHJhaXNlIGFuIGV4Y2VwdGlvbiAqLwotCQlyZXR1cm47Ci0JfQorICAgIHN0YXR1c190IHJldHZhbDsKKworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworCisgICAgcmV0dmFsID0gYmVuYXBob3JlX3VubG9jayggKGJlbmFwaG9yZV90ICopbG9jayApOworICAgIGlmKCByZXR2YWwgIT0gRU9LICkgeworICAgICAgICAvKiBUT0RPOiB0aGF0J3MgYmFkLCByYWlzZSBhbiBleGNlcHRpb24gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfY3RocmVhZC5oIGIvUHl0aG9uL3RocmVhZF9jdGhyZWFkLmgKaW5kZXggY2E3NzZjNi4uOGNiNTA0NCAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9jdGhyZWFkLmgKKysrIGIvUHl0aG9uL3RocmVhZF9jdGhyZWFkLmgKQEAgLTE0LDEyICsxNCwxMiBAQAogUHlUaHJlYWRfX2luaXRfdGhyZWFkKHZvaWQpCiB7CiAjaWZuZGVmIEhVUkRfQ19USFJFQURTCi0JLyogUm9sYW5kIE1jR3JhdGggc2FpZCB0aGlzIHNob3VsZCBub3QgYmUgdXNlZCBzaW5jZSB0aGlzIGlzCi0JZG9uZSB3aGlsZSBsaW5raW5nIHRvIHRocmVhZHMgKi8KLQljdGhyZWFkX2luaXQoKTsgCisgICAgLyogUm9sYW5kIE1jR3JhdGggc2FpZCB0aGlzIHNob3VsZCBub3QgYmUgdXNlZCBzaW5jZSB0aGlzIGlzCisgICAgZG9uZSB3aGlsZSBsaW5raW5nIHRvIHRocmVhZHMgKi8KKyAgICBjdGhyZWFkX2luaXQoKTsKICNlbHNlCiAvKiBkbyBub3RoaW5nICovCi0JOworICAgIDsKICNlbmRpZgogfQogCkBAIC0yOSw3NyArMjksNzcgQEAKIGxvbmcKIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlpbnQgc3VjY2VzcyA9IDA7CS8qIGluaXQgbm90IG5lZWRlZCB3aGVuIFNPTEFSSVNfVEhSRUFEUyBhbmQgKi8KLQkJCQkvKiBDX1RIUkVBRFMgaW1wbGVtZW50ZWQgcHJvcGVybHkgKi8KKyAgICBpbnQgc3VjY2VzcyA9IDA7ICAgICAgICAgICAgLyogaW5pdCBub3QgbmVlZGVkIHdoZW4gU09MQVJJU19USFJFQURTIGFuZCAqLworICAgICAgICAgICAgICAgIC8qIENfVEhSRUFEUyBpbXBsZW1lbnRlZCBwcm9wZXJseSAqLwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLQkvKiBsb29rcyBsaWtlIHNvbGFyaXMgZGV0YWNoZXMgdGhlIHRocmVhZCB0byBuZXZlciByZWpvaW4KLQkgKiBzbyB3ZWxsIGRvIGl0IGhlcmUKLQkgKi8KLQljdGhyZWFkX2RldGFjaChjdGhyZWFkX2ZvcmsoKGN0aHJlYWRfZm5fdCkgZnVuYywgYXJnKSk7Ci0JcmV0dXJuIHN1Y2Nlc3MgPCAwID8gLTEgOiAwOworICAgIGRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgLyogbG9va3MgbGlrZSBzb2xhcmlzIGRldGFjaGVzIHRoZSB0aHJlYWQgdG8gbmV2ZXIgcmVqb2luCisgICAgICogc28gd2VsbCBkbyBpdCBoZXJlCisgICAgICovCisgICAgY3RocmVhZF9kZXRhY2goY3RocmVhZF9mb3JrKChjdGhyZWFkX2ZuX3QpIGZ1bmMsIGFyZykpOworICAgIHJldHVybiBzdWNjZXNzIDwgMCA/IC0xIDogMDsKIH0KIAogbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0JcmV0dXJuIChsb25nKSBjdGhyZWFkX3NlbGYoKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIHJldHVybiAobG9uZykgY3RocmVhZF9zZWxmKCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBkb19QeVRocmVhZF9leGl0X3RocmVhZChpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdCgwKTsKLQkJZWxzZQotCQkJZXhpdCgwKTsKLQljdGhyZWFkX2V4aXQoMCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgY3RocmVhZF9leGl0KDApOwogfQogCiB2b2lkCiBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOwogfQogCiB2b2lkCiBQeVRocmVhZF9fZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKIH0KIAogI2lmbmRlZiBOT19FWElUX1BST0cKIHN0YXRpYwogdm9pZCBkb19QeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cywgaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KHN0YXR1cyk7Ci0JCWVsc2UKLQkJCWV4aXQoc3RhdHVzKTsKLQlpZiAobm9fY2xlYW51cCkKLQkJX2V4aXQoc3RhdHVzKTsKLQllbHNlCi0JCWV4aXQoc3RhdHVzKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoc3RhdHVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdChzdGF0dXMpOworICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICBfZXhpdChzdGF0dXMpOworICAgIGVsc2UKKyAgICAgICAgZXhpdChzdGF0dXMpOwogfQogCiB2b2lkCiBQeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOwogfQogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwogCkBAIC0xMDksNDggKzEwOSw0OCBAQAogUHlUaHJlYWRfdHlwZV9sb2NrCiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7Ci0JbXV0ZXhfdCBsb2NrOworICAgIG11dGV4X3QgbG9jazsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWxvY2sgPSBtdXRleF9hbGxvYygpOwotCWlmIChtdXRleF9pbml0KGxvY2spKSB7Ci0JCXBlcnJvcigibXV0ZXhfaW5pdCIpOwotCQlmcmVlKCh2b2lkICopIGxvY2spOwotCQlsb2NrID0gMDsKLQl9Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGxvY2sgPSBtdXRleF9hbGxvYygpOworICAgIGlmIChtdXRleF9pbml0KGxvY2spKSB7CisgICAgICAgIHBlcnJvcigibXV0ZXhfaW5pdCIpOworICAgICAgICBmcmVlKCh2b2lkICopIGxvY2spOworICAgICAgICBsb2NrID0gMDsKKyAgICB9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogfQogCiB2b2lkCiBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JbXV0ZXhfZnJlZShsb2NrKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBtdXRleF9mcmVlKGxvY2spOwogfQogCiBpbnQKIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzID0gRkFMU0U7CisgICAgaW50IHN1Y2Nlc3MgPSBGQUxTRTsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7Ci0JaWYgKHdhaXRmbGFnKSB7IAkvKiBibG9ja2luZyAqLwotCQltdXRleF9sb2NrKChtdXRleF90KWxvY2spOwotCQlzdWNjZXNzID0gVFJVRTsKLQl9IGVsc2UgewkJLyogbm9uIGJsb2NraW5nICovCi0JCXN1Y2Nlc3MgPSBtdXRleF90cnlfbG9jaygobXV0ZXhfdClsb2NrKTsKLQl9Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgaWYgKHdhaXRmbGFnKSB7ICAgICAgICAgICAgIC8qIGJsb2NraW5nICovCisgICAgICAgIG11dGV4X2xvY2soKG11dGV4X3QpbG9jayk7CisgICAgICAgIHN1Y2Nlc3MgPSBUUlVFOworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBub24gYmxvY2tpbmcgKi8KKyAgICAgICAgc3VjY2VzcyA9IG11dGV4X3RyeV9sb2NrKChtdXRleF90KWxvY2spOworICAgIH0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKLQltdXRleF91bmxvY2soKG11dGV4X3QgKWxvY2spOworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIG11dGV4X3VubG9jaygobXV0ZXhfdCApbG9jayk7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX2Zvb2Jhci5oIGIvUHl0aG9uL3RocmVhZF9mb29iYXIuaAppbmRleCA2NzQ5MWExLi5jMmRmZmE2IDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX2Zvb2Jhci5oCisrKyBiL1B5dGhvbi90aHJlYWRfZm9vYmFyLmgKQEAgLTEzLDY3ICsxMyw2NyBAQAogbG9uZwogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCWludCBzdWNjZXNzID0gMDsJLyogaW5pdCBub3QgbmVlZGVkIHdoZW4gU09MQVJJU19USFJFQURTIGFuZCAqLwotCQkJCS8qIENfVEhSRUFEUyBpbXBsZW1lbnRlZCBwcm9wZXJseSAqLworICAgIGludCBzdWNjZXNzID0gMDsgICAgICAgICAgICAvKiBpbml0IG5vdCBuZWVkZWQgd2hlbiBTT0xBUklTX1RIUkVBRFMgYW5kICovCisgICAgICAgICAgICAgICAgLyogQ19USFJFQURTIGltcGxlbWVudGVkIHByb3Blcmx5ICovCiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCXJldHVybiBzdWNjZXNzIDwgMCA/IC0xIDogMDsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIHJldHVybiBzdWNjZXNzIDwgMCA/IC0xIDogMDsKIH0KIAogbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIH0KIAogc3RhdGljCiB2b2lkIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KDApOwotCQllbHNlCi0JCQlleGl0KDApOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KDApOwogfQogCiB2b2lkCiBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOwogfQogCiB2b2lkCiBQeVRocmVhZF9fZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgxKTsKIH0KIAogI2lmbmRlZiBOT19FWElUX1BST0cKIHN0YXRpYwogdm9pZCBkb19QeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cywgaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KHN0YXR1cyk7Ci0JCWVsc2UKLQkJCWV4aXQoc3RhdHVzKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoc3RhdHVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogfQogCiB2b2lkCiBQeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOwogfQogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwogCkBAIC04NCwzMiArODQsMzIgQEAKIFB5VGhyZWFkX2FsbG9jYXRlX2xvY2sodm9pZCkKIHsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKLQlyZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7CisgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGxvY2s7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKIH0KIAogaW50CiBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2ssIGludCB3YWl0ZmxhZykKIHsKLQlpbnQgc3VjY2VzczsKKyAgICBpbnQgc3VjY2VzczsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiB2b2lkCiBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX2x3cC5oIGIvUHl0aG9uL3RocmVhZF9sd3AuaAppbmRleCBlOTNkNjVhLi43NTE5Y2Q0IDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX2x3cC5oCisrKyBiL1B5dGhvbi90aHJlYWRfbHdwLmgKQEAgLTMsMTMgKzMsMTMgQEAKICNpbmNsdWRlIDxsd3AvbHdwLmg+CiAjaW5jbHVkZSA8bHdwL3N0YWNrZGVwLmg+CiAKLSNkZWZpbmUgU1RBQ0tTSVpFCTEwMDAJLyogc3RhY2tzaXplIGZvciBhIHRocmVhZCAqLwotI2RlZmluZSBOU1RBQ0tTCQkyCS8qICMgc3RhY2tzIHRvIGJlIHB1dCBpbiBjYWNoZSBpbml0aWFsbHkgKi8KKyNkZWZpbmUgU1RBQ0tTSVpFICAgICAgIDEwMDAgICAgLyogc3RhY2tzaXplIGZvciBhIHRocmVhZCAqLworI2RlZmluZSBOU1RBQ0tTICAgICAgICAgMiAgICAgICAvKiAjIHN0YWNrcyB0byBiZSBwdXQgaW4gY2FjaGUgaW5pdGlhbGx5ICovCiAKIHN0cnVjdCBsb2NrIHsKLQlpbnQgbG9ja19sb2NrZWQ7Ci0JY3ZfdCBsb2NrX2NvbmR2YXI7Ci0JbW9uX3QgbG9ja19tb25pdG9yOworICAgIGludCBsb2NrX2xvY2tlZDsKKyAgICBjdl90IGxvY2tfY29uZHZhcjsKKyAgICBtb25fdCBsb2NrX21vbml0b3I7CiB9OwogCiAKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogc3RhdGljIHZvaWQgUHlUaHJlYWRfX2luaXRfdGhyZWFkKHZvaWQpCiB7Ci0JbHdwX3NldHN0a2NhY2hlKFNUQUNLU0laRSwgTlNUQUNLUyk7CisgICAgbHdwX3NldHN0a2NhY2hlKFNUQUNLU0laRSwgTlNUQUNLUyk7CiB9CiAKIC8qCkBAIC0yOCw2NiArMjgsNjYgQEAKIAogbG9uZyBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7Ci0JdGhyZWFkX3QgdGlkOwotCWludCBzdWNjZXNzOwotCWRwcmludGYoKCJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0Jc3VjY2VzcyA9IGx3cF9jcmVhdGUoJnRpZCwgZnVuYywgTUlOUFJJTywgMCwgbHdwX25ld3N0aygpLCAxLCBhcmcpOwotCXJldHVybiBzdWNjZXNzIDwgMCA/IC0xIDogMDsKKyAgICB0aHJlYWRfdCB0aWQ7CisgICAgaW50IHN1Y2Nlc3M7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBzdWNjZXNzID0gbHdwX2NyZWF0ZSgmdGlkLCBmdW5jLCBNSU5QUklPLCAwLCBsd3BfbmV3c3RrKCksIDEsIGFyZyk7CisgICAgcmV0dXJuIHN1Y2Nlc3MgPCAwID8gLTEgOiAwOwogfQogCiBsb25nIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQodm9pZCkKIHsKLQl0aHJlYWRfdCB0aWQ7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLQlpZiAobHdwX3NlbGYoJnRpZCkgPCAwKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIHRpZC50aHJlYWRfaWQ7CisgICAgdGhyZWFkX3QgdGlkOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgaWYgKGx3cF9zZWxmKCZ0aWQpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiB0aWQudGhyZWFkX2lkOwogfQogCiBzdGF0aWMgdm9pZCBkb19QeVRocmVhZF9leGl0X3RocmVhZChpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdCgwKTsKLQkJZWxzZQotCQkJZXhpdCgwKTsKLQlsd3BfZGVzdHJveShTRUxGKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBfZXhpdCgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdCgwKTsKKyAgICBsd3BfZGVzdHJveShTRUxGKTsKIH0KIAogdm9pZCBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOwogfQogCiB2b2lkIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOwogfQogCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwogc3RhdGljIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdChzdGF0dXMpOwotCQllbHNlCi0JCQlleGl0KHN0YXR1cyk7Ci0JcG9kX2V4aXQoc3RhdHVzKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoc3RhdHVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdChzdGF0dXMpOworICAgIHBvZF9leGl0KHN0YXR1cyk7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CiB9CiAKIHZvaWQgUHlUaHJlYWRfX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOwogfQogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwogCkBAIC05Niw1NCArOTYsNTQgQEAKICAqLwogUHlUaHJlYWRfdHlwZV9sb2NrIFB5VGhyZWFkX2FsbG9jYXRlX2xvY2sodm9pZCkKIHsKLQlzdHJ1Y3QgbG9jayAqbG9jazsKLQlleHRlcm4gY2hhciAqbWFsbG9jKHNpemVfdCk7CisgICAgc3RydWN0IGxvY2sgKmxvY2s7CisgICAgZXh0ZXJuIGNoYXIgKm1hbGxvYyhzaXplX3QpOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JbG9jayA9IChzdHJ1Y3QgbG9jayAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2NrKSk7Ci0JbG9jay0+bG9ja19sb2NrZWQgPSAwOwotCSh2b2lkKSBtb25fY3JlYXRlKCZsb2NrLT5sb2NrX21vbml0b3IpOwotCSh2b2lkKSBjdl9jcmVhdGUoJmxvY2stPmxvY2tfY29uZHZhciwgbG9jay0+bG9ja19tb25pdG9yKTsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7Ci0JcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGxvY2s7CisgICAgbG9jayA9IChzdHJ1Y3QgbG9jayAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsb2NrKSk7CisgICAgbG9jay0+bG9ja19sb2NrZWQgPSAwOworICAgICh2b2lkKSBtb25fY3JlYXRlKCZsb2NrLT5sb2NrX21vbml0b3IpOworICAgICh2b2lkKSBjdl9jcmVhdGUoJmxvY2stPmxvY2tfY29uZHZhciwgbG9jay0+bG9ja19tb25pdG9yKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7CisgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGxvY2s7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwotCW1vbl9kZXN0cm95KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbW9uaXRvcik7Ci0JZnJlZSgoY2hhciAqKSBsb2NrKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBtb25fZGVzdHJveSgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX21vbml0b3IpOworICAgIGZyZWUoKGNoYXIgKikgbG9jayk7CiB9CiAKIGludCBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2ssIGludCB3YWl0ZmxhZykKIHsKLQlpbnQgc3VjY2VzczsKKyAgICBpbnQgc3VjY2VzczsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7Ci0Jc3VjY2VzcyA9IDA7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKKyAgICBzdWNjZXNzID0gMDsKIAotCSh2b2lkKSBtb25fZW50ZXIoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19tb25pdG9yKTsKLQlpZiAod2FpdGZsYWcpCi0JCXdoaWxlICgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2xvY2tlZCkKLQkJCWN2X3dhaXQoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19jb25kdmFyKTsKLQlpZiAoISgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbG9ja2VkKSB7Ci0JCXN1Y2Nlc3MgPSAxOwotCQkoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2xvY2tlZCA9IDE7Ci0JfQotCWN2X2Jyb2FkY2FzdCgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2NvbmR2YXIpOwotCW1vbl9leGl0KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbW9uaXRvcik7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgICh2b2lkKSBtb25fZW50ZXIoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19tb25pdG9yKTsKKyAgICBpZiAod2FpdGZsYWcpCisgICAgICAgIHdoaWxlICgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2xvY2tlZCkKKyAgICAgICAgICAgIGN2X3dhaXQoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19jb25kdmFyKTsKKyAgICBpZiAoISgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbG9ja2VkKSB7CisgICAgICAgIHN1Y2Nlc3MgPSAxOworICAgICAgICAoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2xvY2tlZCA9IDE7CisgICAgfQorICAgIGN2X2Jyb2FkY2FzdCgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2NvbmR2YXIpOworICAgIG1vbl9leGl0KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbW9uaXRvcik7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiB2b2lkIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKLQkodm9pZCkgbW9uX2VudGVyKCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbW9uaXRvcik7Ci0JKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19sb2NrZWQgPSAwOwotCWN2X2Jyb2FkY2FzdCgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX2NvbmR2YXIpOwotCW1vbl9leGl0KCgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbW9uaXRvcik7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgKHZvaWQpIG1vbl9lbnRlcigoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX21vbml0b3IpOworICAgICgoc3RydWN0IGxvY2sgKikgbG9jayktPmxvY2tfbG9ja2VkID0gMDsKKyAgICBjdl9icm9hZGNhc3QoKChzdHJ1Y3QgbG9jayAqKSBsb2NrKS0+bG9ja19jb25kdmFyKTsKKyAgICBtb25fZXhpdCgoKHN0cnVjdCBsb2NrICopIGxvY2spLT5sb2NrX21vbml0b3IpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9udC5oIGIvUHl0aG9uL3RocmVhZF9udC5oCmluZGV4IDk0NDU1MjkuLjc1MTJjNzMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfbnQuaAorKysgYi9QeXRob24vdGhyZWFkX250LmgKQEAgLTEwLDgxICsxMCw4MSBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IE5STVVURVggewotCUxPTkcgICBvd25lZCA7Ci0JRFdPUkQgIHRocmVhZF9pZCA7Ci0JSEFORExFIGhldmVudCA7CisgICAgTE9ORyAgIG93bmVkIDsKKyAgICBEV09SRCAgdGhyZWFkX2lkIDsKKyAgICBIQU5ETEUgaGV2ZW50IDsKIH0gTlJNVVRFWCwgKlBOUk1VVEVYIDsKIAogCiBCT09MCiBJbml0aWFsaXplTm9uUmVjdXJzaXZlTXV0ZXgoUE5STVVURVggbXV0ZXgpCiB7Ci0JbXV0ZXgtPm93bmVkID0gLTEgOyAgLyogTm8gdGhyZWFkcyBoYXZlIGVudGVyZWQgTm9uUmVjdXJzaXZlTXV0ZXggKi8KLQltdXRleC0+dGhyZWFkX2lkID0gMCA7Ci0JbXV0ZXgtPmhldmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCkgOwotCXJldHVybiBtdXRleC0+aGV2ZW50ICE9IE5VTEwgOwkvKiBUUlVFIGlmIHRoZSBtdXRleCBpcyBjcmVhdGVkICovCisgICAgbXV0ZXgtPm93bmVkID0gLTEgOyAgLyogTm8gdGhyZWFkcyBoYXZlIGVudGVyZWQgTm9uUmVjdXJzaXZlTXV0ZXggKi8KKyAgICBtdXRleC0+dGhyZWFkX2lkID0gMCA7CisgICAgbXV0ZXgtPmhldmVudCA9IENyZWF0ZUV2ZW50KE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCkgOworICAgIHJldHVybiBtdXRleC0+aGV2ZW50ICE9IE5VTEwgOyAgICAgIC8qIFRSVUUgaWYgdGhlIG11dGV4IGlzIGNyZWF0ZWQgKi8KIH0KIAogVk9JRAogRGVsZXRlTm9uUmVjdXJzaXZlTXV0ZXgoUE5STVVURVggbXV0ZXgpCiB7Ci0JLyogTm8gaW4tdXNlIGNoZWNrICovCi0JQ2xvc2VIYW5kbGUobXV0ZXgtPmhldmVudCkgOwotCW11dGV4LT5oZXZlbnQgPSBOVUxMIDsgLyogSnVzdCBpbiBjYXNlICovCisgICAgLyogTm8gaW4tdXNlIGNoZWNrICovCisgICAgQ2xvc2VIYW5kbGUobXV0ZXgtPmhldmVudCkgOworICAgIG11dGV4LT5oZXZlbnQgPSBOVUxMIDsgLyogSnVzdCBpbiBjYXNlICovCiB9CiAKIERXT1JECiBFbnRlck5vblJlY3Vyc2l2ZU11dGV4KFBOUk1VVEVYIG11dGV4LCBCT09MIHdhaXQpCiB7Ci0JLyogQXNzdW1lIHRoYXQgdGhlIHRocmVhZCB3YWl0cyBzdWNjZXNzZnVsbHkgKi8KLQlEV09SRCByZXQgOworICAgIC8qIEFzc3VtZSB0aGF0IHRoZSB0aHJlYWQgd2FpdHMgc3VjY2Vzc2Z1bGx5ICovCisgICAgRFdPUkQgcmV0IDsKIAotCS8qIEludGVybG9ja2VkSW5jcmVtZW50KCZtdXRleC0+b3duZWQpID09IDAgbWVhbnMgdGhhdCBubyB0aHJlYWQgY3VycmVudGx5IG93bnMgdGhlIG11dGV4ICovCi0JaWYgKCF3YWl0KQotCXsKLQkJaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCZtdXRleC0+b3duZWQsIDAsIC0xKSAhPSAtMSkKLQkJCXJldHVybiBXQUlUX1RJTUVPVVQgOwotCQlyZXQgPSBXQUlUX09CSkVDVF8wIDsKLQl9Ci0JZWxzZQotCQlyZXQgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmbXV0ZXgtPm93bmVkKSA/Ci0JCQkvKiBTb21lIHRocmVhZCBvd25zIHRoZSBtdXRleCwgbGV0J3Mgd2FpdC4uLiAqLwotCQkJV2FpdEZvclNpbmdsZU9iamVjdChtdXRleC0+aGV2ZW50LCBJTkZJTklURSkgOiBXQUlUX09CSkVDVF8wIDsKKyAgICAvKiBJbnRlcmxvY2tlZEluY3JlbWVudCgmbXV0ZXgtPm93bmVkKSA9PSAwIG1lYW5zIHRoYXQgbm8gdGhyZWFkIGN1cnJlbnRseSBvd25zIHRoZSBtdXRleCAqLworICAgIGlmICghd2FpdCkKKyAgICB7CisgICAgICAgIGlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgmbXV0ZXgtPm93bmVkLCAwLCAtMSkgIT0gLTEpCisgICAgICAgICAgICByZXR1cm4gV0FJVF9USU1FT1VUIDsKKyAgICAgICAgcmV0ID0gV0FJVF9PQkpFQ1RfMCA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0ID0gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJm11dGV4LT5vd25lZCkgPworICAgICAgICAgICAgLyogU29tZSB0aHJlYWQgb3ducyB0aGUgbXV0ZXgsIGxldCdzIHdhaXQuLi4gKi8KKyAgICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QobXV0ZXgtPmhldmVudCwgSU5GSU5JVEUpIDogV0FJVF9PQkpFQ1RfMCA7CiAKLQltdXRleC0+dGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCkgOyAvKiBXZSBvd24gaXQgKi8KLQlyZXR1cm4gcmV0IDsKKyAgICBtdXRleC0+dGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCkgOyAvKiBXZSBvd24gaXQgKi8KKyAgICByZXR1cm4gcmV0IDsKIH0KIAogQk9PTAogTGVhdmVOb25SZWN1cnNpdmVNdXRleChQTlJNVVRFWCBtdXRleCkKIHsKLQkvKiBXZSBkb24ndCBvd24gdGhlIG11dGV4ICovCi0JbXV0ZXgtPnRocmVhZF9pZCA9IDAgOwotCXJldHVybgotCQlJbnRlcmxvY2tlZERlY3JlbWVudCgmbXV0ZXgtPm93bmVkKSA8IDAgfHwKLQkJU2V0RXZlbnQobXV0ZXgtPmhldmVudCkgOyAvKiBPdGhlciB0aHJlYWRzIGFyZSB3YWl0aW5nLCB3YWtlIG9uZSBvbiB0aGVtIHVwICovCisgICAgLyogV2UgZG9uJ3Qgb3duIHRoZSBtdXRleCAqLworICAgIG11dGV4LT50aHJlYWRfaWQgPSAwIDsKKyAgICByZXR1cm4KKyAgICAgICAgSW50ZXJsb2NrZWREZWNyZW1lbnQoJm11dGV4LT5vd25lZCkgPCAwIHx8CisgICAgICAgIFNldEV2ZW50KG11dGV4LT5oZXZlbnQpIDsgLyogT3RoZXIgdGhyZWFkcyBhcmUgd2FpdGluZywgd2FrZSBvbmUgb24gdGhlbSB1cCAqLwogfQogCiBQTlJNVVRFWAogQWxsb2NOb25SZWN1cnNpdmVNdXRleCh2b2lkKQogewotCVBOUk1VVEVYIG11dGV4ID0gKFBOUk1VVEVYKW1hbGxvYyhzaXplb2YoTlJNVVRFWCkpIDsKLQlpZiAobXV0ZXggJiYgIUluaXRpYWxpemVOb25SZWN1cnNpdmVNdXRleChtdXRleCkpCi0JewotCQlmcmVlKG11dGV4KSA7Ci0JCW11dGV4ID0gTlVMTCA7Ci0JfQotCXJldHVybiBtdXRleCA7CisgICAgUE5STVVURVggbXV0ZXggPSAoUE5STVVURVgpbWFsbG9jKHNpemVvZihOUk1VVEVYKSkgOworICAgIGlmIChtdXRleCAmJiAhSW5pdGlhbGl6ZU5vblJlY3Vyc2l2ZU11dGV4KG11dGV4KSkKKyAgICB7CisgICAgICAgIGZyZWUobXV0ZXgpIDsKKyAgICAgICAgbXV0ZXggPSBOVUxMIDsKKyAgICB9CisgICAgcmV0dXJuIG11dGV4IDsKIH0KIAogdm9pZAogRnJlZU5vblJlY3Vyc2l2ZU11dGV4KFBOUk1VVEVYIG11dGV4KQogewotCWlmIChtdXRleCkKLQl7Ci0JCURlbGV0ZU5vblJlY3Vyc2l2ZU11dGV4KG11dGV4KSA7Ci0JCWZyZWUobXV0ZXgpIDsKLQl9CisgICAgaWYgKG11dGV4KQorICAgIHsKKyAgICAgICAgRGVsZXRlTm9uUmVjdXJzaXZlTXV0ZXgobXV0ZXgpIDsKKyAgICAgICAgZnJlZShtdXRleCkgOworICAgIH0KIH0KIAogbG9uZyBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpOwpAQCAtMTAyLDY1ICsxMDIsNjUgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0Jdm9pZCAoKmZ1bmMpKHZvaWQqKTsKLQl2b2lkICphcmc7Ci0JbG9uZyBpZDsKLQlIQU5ETEUgZG9uZTsKKyAgICB2b2lkICgqZnVuYykodm9pZCopOworICAgIHZvaWQgKmFyZzsKKyAgICBsb25nIGlkOworICAgIEhBTkRMRSBkb25lOwogfSBjYWxsb2JqOwogCiBzdGF0aWMgaW50CiBib290c3RyYXAodm9pZCAqY2FsbCkKIHsKLQljYWxsb2JqICpvYmogPSAoY2FsbG9iaiopY2FsbDsKLQkvKiBjb3B5IGNhbGxvYmogc2luY2Ugb3RoZXIgdGhyZWFkIG1pZ2h0IGZyZWUgaXQgYmVmb3JlIHdlJ3JlIGRvbmUgKi8KLQl2b2lkICgqZnVuYykodm9pZCopID0gb2JqLT5mdW5jOwotCXZvaWQgKmFyZyA9IG9iai0+YXJnOworICAgIGNhbGxvYmogKm9iaiA9IChjYWxsb2JqKiljYWxsOworICAgIC8qIGNvcHkgY2FsbG9iaiBzaW5jZSBvdGhlciB0aHJlYWQgbWlnaHQgZnJlZSBpdCBiZWZvcmUgd2UncmUgZG9uZSAqLworICAgIHZvaWQgKCpmdW5jKSh2b2lkKikgPSBvYmotPmZ1bmM7CisgICAgdm9pZCAqYXJnID0gb2JqLT5hcmc7CiAKLQlvYmotPmlkID0gUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpOwotCVJlbGVhc2VTZW1hcGhvcmUob2JqLT5kb25lLCAxLCBOVUxMKTsKLQlmdW5jKGFyZyk7Ci0JcmV0dXJuIDA7CisgICAgb2JqLT5pZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKKyAgICBSZWxlYXNlU2VtYXBob3JlKG9iai0+ZG9uZSwgMSwgTlVMTCk7CisgICAgZnVuYyhhcmcpOworICAgIHJldHVybiAwOwogfQogCiBsb25nCiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7Ci0JUHlfdWludHB0cl90IHJ2OwotCWNhbGxvYmogb2JqOworICAgIFB5X3VpbnRwdHJfdCBydjsKKyAgICBjYWxsb2JqIG9iajsKIAotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iLAotCQkgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIGNhbGxlZFxuIiwKKyAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0Jb2JqLmlkID0gLTE7CS8qIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgKi8KLQlvYmouZnVuYyA9IGZ1bmM7Ci0Jb2JqLmFyZyA9IGFyZzsKLQlvYmouZG9uZSA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCAxLCBOVUxMKTsKLQlpZiAob2JqLmRvbmUgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOworICAgIG9iai5pZCA9IC0xOyAgICAgICAgLyogZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCAqLworICAgIG9iai5mdW5jID0gZnVuYzsKKyAgICBvYmouYXJnID0gYXJnOworICAgIG9iai5kb25lID0gQ3JlYXRlU2VtYXBob3JlKE5VTEwsIDAsIDEsIE5VTEwpOworICAgIGlmIChvYmouZG9uZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CiAKLQlydiA9IF9iZWdpbnRocmVhZChib290c3RyYXAsCi0JCQkgIFB5X1NBRkVfRE9XTkNBU1QoX3B5dGhyZWFkX3N0YWNrc2l6ZSwKLQkJCQkJICAgUHlfc3NpemVfdCwgaW50KSwKLQkJCSAgJm9iaik7Ci0JaWYgKHJ2ID09IChQeV91aW50cHRyX3QpLTEpIHsKLQkJLyogSSd2ZSBzZWVuIGVycm5vID09IEVBR0FJTiBoZXJlLCB3aGljaCBtZWFucyAidGhlcmUgYXJlCi0JCSAqIHRvbyBtYW55IHRocmVhZHMiLgotCQkgKi8KLQkJZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBmYWlsZWQ6ICVwIGVycm5vICVkXG4iLAotCQkgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksICh2b2lkKilydiwgZXJybm8pKTsKLQkJb2JqLmlkID0gLTE7Ci0JfQotCWVsc2UgewotCQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHN1Y2NlZWRlZDogJXBcbiIsCi0JCSAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgKHZvaWQqKXJ2KSk7Ci0JCS8qIHdhaXQgZm9yIHRocmVhZCB0byBpbml0aWFsaXplLCBzbyB3ZSBjYW4gZ2V0IGl0cyBpZCAqLwotCQlXYWl0Rm9yU2luZ2xlT2JqZWN0KG9iai5kb25lLCBJTkZJTklURSk7Ci0JCWFzc2VydChvYmouaWQgIT0gLTEpOwotCX0KLQlDbG9zZUhhbmRsZSgoSEFORExFKW9iai5kb25lKTsKLQlyZXR1cm4gb2JqLmlkOworICAgIHJ2ID0gX2JlZ2ludGhyZWFkKGJvb3RzdHJhcCwKKyAgICAgICAgICAgICAgICAgICAgICBQeV9TQUZFX0RPV05DQVNUKF9weXRocmVhZF9zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90LCBpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICZvYmopOworICAgIGlmIChydiA9PSAoUHlfdWludHB0cl90KS0xKSB7CisgICAgICAgIC8qIEkndmUgc2VlbiBlcnJubyA9PSBFQUdBSU4gaGVyZSwgd2hpY2ggbWVhbnMgInRoZXJlIGFyZQorICAgICAgICAgKiB0b28gbWFueSB0aHJlYWRzIi4KKyAgICAgICAgICovCisgICAgICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgZmFpbGVkOiAlcCBlcnJubyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCAodm9pZCopcnYsIGVycm5vKSk7CisgICAgICAgIG9iai5pZCA9IC0xOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBzdWNjZWVkZWQ6ICVwXG4iLAorICAgICAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksICh2b2lkKilydikpOworICAgICAgICAvKiB3YWl0IGZvciB0aHJlYWQgdG8gaW5pdGlhbGl6ZSwgc28gd2UgY2FuIGdldCBpdHMgaWQgKi8KKyAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChvYmouZG9uZSwgSU5GSU5JVEUpOworICAgICAgICBhc3NlcnQob2JqLmlkICE9IC0xKTsKKyAgICB9CisgICAgQ2xvc2VIYW5kbGUoKEhBTkRMRSlvYmouZG9uZSk7CisgICAgcmV0dXJuIG9iai5pZDsKIH0KIAogLyoKQEAgLTE3MCw1OCArMTcwLDU4IEBACiBsb25nCiBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpCiB7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKIH0KIAogc3RhdGljIHZvaWQKIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdCgwKTsKLQkJZWxzZQotCQkJZXhpdCgwKTsKLQlfZW5kdGhyZWFkKCk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCkpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KDApOworICAgIF9lbmR0aHJlYWQoKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CiB9CiAKICNpZm5kZWYgTk9fRVhJVF9QUk9HCiBzdGF0aWMgdm9pZAogZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdChzdGF0dXMpOwotCQllbHNlCi0JCQlleGl0KHN0YXR1cyk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKIH0KIAogdm9pZAogUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX19leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKIH0KICNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8KIApAQCAtMjMzLDI1ICsyMzMsMjUgQEAKIFB5VGhyZWFkX3R5cGVfbG9jawogUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewotCVBOUk1VVEVYIGFMb2NrOworICAgIFBOUk1VVEVYIGFMb2NrOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JYUxvY2sgPSBBbGxvY05vblJlY3Vyc2l2ZU11dGV4KCkgOworICAgIGFMb2NrID0gQWxsb2NOb25SZWN1cnNpdmVNdXRleCgpIDsKIAotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCBhTG9jaykpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLCBhTG9jaykpOwogCi0JcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGFMb2NrOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBhTG9jazsKIH0KIAogdm9pZAogUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBhTG9jaykKIHsKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrKSk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaykpOwogCi0JRnJlZU5vblJlY3Vyc2l2ZU11dGV4KGFMb2NrKSA7CisgICAgRnJlZU5vblJlY3Vyc2l2ZU11dGV4KGFMb2NrKSA7CiB9CiAKIC8qCkBAIC0yNjMsMjkgKzI2MywyOSBAQAogaW50CiBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGFMb2NrLCBpbnQgd2FpdGZsYWcpCiB7Ci0JaW50IHN1Y2Nlc3MgOworICAgIGludCBzdWNjZXNzIDsKIAotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrLCB3YWl0ZmxhZykpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrLCB3YWl0ZmxhZykpOwogCi0Jc3VjY2VzcyA9IGFMb2NrICYmIEVudGVyTm9uUmVjdXJzaXZlTXV0ZXgoKFBOUk1VVEVYKSBhTG9jaywgKHdhaXRmbGFnID8gSU5GSU5JVEUgOiAwKSkgPT0gV0FJVF9PQkpFQ1RfMCA7CisgICAgc3VjY2VzcyA9IGFMb2NrICYmIEVudGVyTm9uUmVjdXJzaXZlTXV0ZXgoKFBOUk1VVEVYKSBhTG9jaywgKHdhaXRmbGFnID8gSU5GSU5JVEUgOiAwKSkgPT0gV0FJVF9PQkpFQ1RfMCA7CiAKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CiAKLQlyZXR1cm4gc3VjY2VzczsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAogdm9pZAogUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBhTG9jaykKIHsKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrKSk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaykpOwogCi0JaWYgKCEoYUxvY2sgJiYgTGVhdmVOb25SZWN1cnNpdmVNdXRleCgoUE5STVVURVgpIGFMb2NrKSkpCi0JCWRwcmludGYoKCIlbGQ6IENvdWxkIG5vdCBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGVycm9yOiAlbGRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgYUxvY2ssIEdldExhc3RFcnJvcigpKSk7CisgICAgaWYgKCEoYUxvY2sgJiYgTGVhdmVOb25SZWN1cnNpdmVNdXRleCgoUE5STVVURVgpIGFMb2NrKSkpCisgICAgICAgIGRwcmludGYoKCIlbGQ6IENvdWxkIG5vdCBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGVycm9yOiAlbGRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgYUxvY2ssIEdldExhc3RFcnJvcigpKSk7CiB9CiAKIC8qIG1pbmltdW0vbWF4aW11bSB0aHJlYWQgc3RhY2sgc2l6ZXMgc3VwcG9ydGVkICovCi0jZGVmaW5lIFRIUkVBRF9NSU5fU1RBQ0tTSVpFCTB4ODAwMAkJLyogMzJrQiAqLwotI2RlZmluZSBUSFJFQURfTUFYX1NUQUNLU0laRQkweDEwMDAwMDAwCS8qIDI1Nk1CICovCisjZGVmaW5lIFRIUkVBRF9NSU5fU1RBQ0tTSVpFICAgIDB4ODAwMCAgICAgICAgICAvKiAzMmtCICovCisjZGVmaW5lIFRIUkVBRF9NQVhfU1RBQ0tTSVpFICAgIDB4MTAwMDAwMDAgICAgICAvKiAyNTZNQiAqLwogCiAvKiBzZXQgdGhlIHRocmVhZCBzdGFjayBzaXplLgogICogUmV0dXJuIDAgaWYgc2l6ZSBpcyB2YWxpZCwgLTEgb3RoZXJ3aXNlLgpAQCAtMjkzLDE5ICsyOTMsMTkgQEAKIHN0YXRpYyBpbnQKIF9weXRocmVhZF9udF9zZXRfc3RhY2tzaXplKHNpemVfdCBzaXplKQogewotCS8qIHNldCB0byBkZWZhdWx0ICovCi0JaWYgKHNpemUgPT0gMCkgewotCQlfcHl0aHJlYWRfc3RhY2tzaXplID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIC8qIHNldCB0byBkZWZhdWx0ICovCisgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICBfcHl0aHJlYWRfc3RhY2tzaXplID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogdmFsaWQgcmFuZ2U/ICovCi0JaWYgKHNpemUgPj0gVEhSRUFEX01JTl9TVEFDS1NJWkUgJiYgc2l6ZSA8IFRIUkVBRF9NQVhfU1RBQ0tTSVpFKSB7Ci0JCV9weXRocmVhZF9zdGFja3NpemUgPSBzaXplOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogdmFsaWQgcmFuZ2U/ICovCisgICAgaWYgKHNpemUgPj0gVEhSRUFEX01JTl9TVEFDS1NJWkUgJiYgc2l6ZSA8IFRIUkVBRF9NQVhfU1RBQ0tTSVpFKSB7CisgICAgICAgIF9weXRocmVhZF9zdGFja3NpemUgPSBzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQlyZXR1cm4gLTE7CisgICAgcmV0dXJuIC0xOwogfQogCi0jZGVmaW5lIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKHgpCV9weXRocmVhZF9udF9zZXRfc3RhY2tzaXplKHgpCisjZGVmaW5lIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKHgpIF9weXRocmVhZF9udF9zZXRfc3RhY2tzaXplKHgpCmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX29zMi5oIGIvUHl0aG9uL3RocmVhZF9vczIuaAppbmRleCAxMmVlZWQ1Li4yODI4NGJiIDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX29zMi5oCisrKyBiL1B5dGhvbi90aHJlYWRfb3MyLmgKQEAgLTE2LDEwICsxNiwxMCBAQAogCiAvKiBkZWZhdWx0IHRocmVhZCBzdGFjayBzaXplIG9mIDY0a0IgKi8KICNpZiAhZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkKLSNkZWZpbmUJVEhSRUFEX1NUQUNLX1NJWkUJMHgxMDAwMAorI2RlZmluZSBUSFJFQURfU1RBQ0tfU0laRSAgICAgICAweDEwMDAwCiAjZW5kaWYKIAotI2RlZmluZSBPUzJfU1RBQ0tTSVpFKHgpCSh4ID8geCA6IFRIUkVBRF9TVEFDS19TSVpFKQorI2RlZmluZSBPUzJfU1RBQ0tTSVpFKHgpICAgICAgICAoeCA/IHggOiBUSFJFQURfU1RBQ0tfU0laRSkKIAogLyoKICAqIEluaXRpYWxpemF0aW9uIG9mIHRoZSBDIHBhY2thZ2UsIHNob3VsZCBub3QgYmUgbmVlZGVkLgpAQCAtMzUsMTUzICszNSwxNTMgQEAKIGxvbmcKIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlpbnQgdGhyZWFkX2lkOworICAgIGludCB0aHJlYWRfaWQ7CiAKLQl0aHJlYWRfaWQgPSBfYmVnaW50aHJlYWQoZnVuYywKLQkJCQlOVUxMLAotCQkJCU9TMl9TVEFDS1NJWkUoX3B5dGhyZWFkX3N0YWNrc2l6ZSksCi0JCQkJYXJnKTsKKyAgICB0aHJlYWRfaWQgPSBfYmVnaW50aHJlYWQoZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TMl9TVEFDS1NJWkUoX3B5dGhyZWFkX3N0YWNrc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnKTsKIAotCWlmICh0aHJlYWRfaWQgPT0gLTEpIHsKLQkJZHByaW50ZigoIl9iZWdpbnRocmVhZCBmYWlsZWQuIHJldHVybiAlbGRcbiIsIGVycm5vKSk7Ci0JfQorICAgIGlmICh0aHJlYWRfaWQgPT0gLTEpIHsKKyAgICAgICAgZHByaW50ZigoIl9iZWdpbnRocmVhZCBmYWlsZWQuIHJldHVybiAlbGRcbiIsIGVycm5vKSk7CisgICAgfQogCi0JcmV0dXJuIHRocmVhZF9pZDsKKyAgICByZXR1cm4gdGhyZWFkX2lkOwogfQogCiBsb25nCiBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpCiB7CiAjaWYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JUFBJQiBwaWI7Ci0JUFRJQiB0aWI7CisgICAgUFBJQiBwaWI7CisgICAgUFRJQiB0aWI7CiAjZW5kaWYKIAotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAogI2lmIGRlZmluZWQoUFlDQ19HQ0MpCi0JcmV0dXJuIF9nZXR0aWQoKTsKKyAgICByZXR1cm4gX2dldHRpZCgpOwogI2Vsc2UKLQlEb3NHZXRJbmZvQmxvY2tzKCZ0aWIsICZwaWIpOwotCXJldHVybiB0aWItPnRpYl9wdGliMi0+dGliMl91bHRpZDsKKyAgICBEb3NHZXRJbmZvQmxvY2tzKCZ0aWIsICZwaWIpOworICAgIHJldHVybiB0aWItPnRpYl9wdGliMi0+dGliMl91bHRpZDsKICNlbmRpZgogfQogCiBzdGF0aWMgdm9pZAogZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iLAotCQkgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdCgwKTsKLQkJZWxzZQotCQkJZXhpdCgwKTsKLQlfZW5kdGhyZWFkKCk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iLAorICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgX2VuZHRocmVhZCgpOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCkKIHsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3RocmVhZCgwKTsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOwogfQogCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwotc3RhdGljIHZvaWQgCitzdGF0aWMgdm9pZAogZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdChzdGF0dXMpOwotCQllbHNlCi0JCQlleGl0KHN0YXR1cyk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDEpOwogfQogI2VuZGlmIC8qIE5PX0VYSVRfUFJPRyAqLwogCiAvKgogICogTG9jayBzdXBwb3J0LiAgVGhpcyBpcyBpbXBsZW1lbnRlZCB3aXRoIGFuIGV2ZW50IHNlbWFwaG9yZSBhbmQgY3JpdGljYWwKLSAqIHNlY3Rpb25zIHRvIG1ha2UgaXQgYmVoYXZlIG1vcmUgbGlrZSBhIHBvc2l4IG11dGV4IHRoYW4gaXRzIE9TLzIgCisgKiBzZWN0aW9ucyB0byBtYWtlIGl0IGJlaGF2ZSBtb3JlIGxpa2UgYSBwb3NpeCBtdXRleCB0aGFuIGl0cyBPUy8yCiAgKiBjb3VudGVycGFydHMuCiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3Qgb3MyX2xvY2tfdCB7Ci0JaW50IGlzX3NldDsKLQlIRVYgY2hhbmdlZDsKKyAgICBpbnQgaXNfc2V0OworICAgIEhFViBjaGFuZ2VkOwogfSAqdHlwZV9vczJfbG9jazsKIAotUHlUaHJlYWRfdHlwZV9sb2NrIAorUHlUaHJlYWRfdHlwZV9sb2NrCiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7CiAjaWYgZGVmaW5lZChQWUNDX0dDQykKLQlfZm11dGV4ICpzZW0gPSBtYWxsb2Moc2l6ZW9mKF9mbXV0ZXgpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlbHhcbiIsCi0JCSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCi0JCSAobG9uZylzZW0pKTsKLQlpZiAoX2ZtdXRleF9jcmVhdGUoc2VtLCAwKSkgewotCQlmcmVlKHNlbSk7Ci0JCXNlbSA9IE5VTEw7Ci0JfQotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKXNlbTsKKyAgICBfZm11dGV4ICpzZW0gPSBtYWxsb2Moc2l6ZW9mKF9mbXV0ZXgpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlbHhcbiIsCisgICAgICAgICAgICAgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAorICAgICAgICAgICAgIChsb25nKXNlbSkpOworICAgIGlmIChfZm11dGV4X2NyZWF0ZShzZW0sIDApKSB7CisgICAgICAgIGZyZWUoc2VtKTsKKyAgICAgICAgc2VtID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spc2VtOwogI2Vsc2UKLQlBUElSRVQgcmM7Ci0JdHlwZV9vczJfbG9jayBsb2NrID0gKHR5cGVfb3MyX2xvY2spbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb3MyX2xvY2tfdCkpOworICAgIEFQSVJFVCByYzsKKyAgICB0eXBlX29zMl9sb2NrIGxvY2sgPSAodHlwZV9vczJfbG9jayltYWxsb2Moc2l6ZW9mKHN0cnVjdCBvczJfbG9ja190KSk7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlsb2NrLT5pc19zZXQgPSAwOworICAgIGxvY2stPmlzX3NldCA9IDA7CiAKLQlEb3NDcmVhdGVFdmVudFNlbShOVUxMLCAmbG9jay0+Y2hhbmdlZCwgMCwgMCk7CisgICAgRG9zQ3JlYXRlRXZlbnRTZW0oTlVMTCwgJmxvY2stPmNoYW5nZWQsIDAsIDApOwogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCAKLQkJIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgCi0gICAgICAgIAkgbG9jay0+Y2hhbmdlZCkpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwKKyAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCisgICAgICAgICAgICAgbG9jay0+Y2hhbmdlZCkpOwogCi0JcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spbG9jazsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaylsb2NrOwogI2VuZGlmCiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGFMb2NrKQogewogI2lmICFkZWZpbmVkKFBZQ0NfR0NDKQotCXR5cGVfb3MyX2xvY2sgbG9jayA9ICh0eXBlX29zMl9sb2NrKWFMb2NrOworICAgIHR5cGVfb3MyX2xvY2sgbG9jayA9ICh0eXBlX29zMl9sb2NrKWFMb2NrOwogI2VuZGlmCiAKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwKLQkJIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaykpOworICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLAorICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaykpOwogCiAjaWYgZGVmaW5lZChQWUNDX0dDQykKLQlpZiAoYUxvY2spIHsKLQkJX2ZtdXRleF9jbG9zZSgoX2ZtdXRleCAqKWFMb2NrKTsKLQkJZnJlZSgoX2ZtdXRleCAqKWFMb2NrKTsKLQl9CisgICAgaWYgKGFMb2NrKSB7CisgICAgICAgIF9mbXV0ZXhfY2xvc2UoKF9mbXV0ZXggKilhTG9jayk7CisgICAgICAgIGZyZWUoKF9mbXV0ZXggKilhTG9jayk7CisgICAgfQogI2Vsc2UKLQlEb3NDbG9zZUV2ZW50U2VtKGxvY2stPmNoYW5nZWQpOwotCWZyZWUoYUxvY2spOworICAgIERvc0Nsb3NlRXZlbnRTZW0obG9jay0+Y2hhbmdlZCk7CisgICAgZnJlZShhTG9jayk7CiAjZW5kaWYKIH0KIApAQCAtMTkwLDk4ICsxOTAsOTggQEAKICAqCiAgKiBhbmQgMCBpZiB0aGUgbG9jayB3YXMgbm90IGFjcXVpcmVkLgogICovCi1pbnQgCitpbnQKIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgYUxvY2ssIGludCB3YWl0ZmxhZykKIHsKICNpZiAhZGVmaW5lZChQWUNDX0dDQykKLQlpbnQgICBkb25lID0gMDsKLQlVTE9ORyBjb3VudDsKLQlQSUQgICBwaWQgPSAwOwotCVRJRCAgIHRpZCA9IDA7Ci0JdHlwZV9vczJfbG9jayBsb2NrID0gKHR5cGVfb3MyX2xvY2spYUxvY2s7CisgICAgaW50ICAgZG9uZSA9IDA7CisgICAgVUxPTkcgY291bnQ7CisgICAgUElEICAgcGlkID0gMDsKKyAgICBUSUQgICB0aWQgPSAwOworICAgIHR5cGVfb3MyX2xvY2sgbG9jayA9ICh0eXBlX29zMl9sb2NrKWFMb2NrOwogI2VuZGlmCiAKLQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsCi0JCSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCi0JCSBhTG9jaywKLQkJIHdhaXRmbGFnKSk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLAorICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKKyAgICAgICAgICAgICBhTG9jaywKKyAgICAgICAgICAgICB3YWl0ZmxhZykpOwogCiAjaWYgZGVmaW5lZChQWUNDX0dDQykKLQkvKiBhbHdheXMgc3VjY2Vzc2Z1bCBpZiB0aGUgbG9jayBkb2Vzbid0IGV4aXN0ICovCi0JaWYgKGFMb2NrICYmCi0JICAgIF9mbXV0ZXhfcmVxdWVzdCgoX2ZtdXRleCAqKWFMb2NrLCB3YWl0ZmxhZyA/IDAgOiBfRk1SX05PV0FJVCkpCi0JCXJldHVybiAwOworICAgIC8qIGFsd2F5cyBzdWNjZXNzZnVsIGlmIHRoZSBsb2NrIGRvZXNuJ3QgZXhpc3QgKi8KKyAgICBpZiAoYUxvY2sgJiYKKyAgICAgICAgX2ZtdXRleF9yZXF1ZXN0KChfZm11dGV4ICopYUxvY2ssIHdhaXRmbGFnID8gMCA6IF9GTVJfTk9XQUlUKSkKKyAgICAgICAgcmV0dXJuIDA7CiAjZWxzZQotCXdoaWxlICghZG9uZSkgewotCQkvKiBpZiB0aGUgbG9jayBpcyBjdXJyZW50bHkgc2V0LCB3ZSBoYXZlIHRvIHdhaXQgZm9yCi0JCSAqIHRoZSBzdGF0ZSB0byBjaGFuZ2UKLQkJICovCi0JCWlmIChsb2NrLT5pc19zZXQpIHsKLQkJCWlmICghd2FpdGZsYWcpCi0JCQkJcmV0dXJuIDA7Ci0JCQlEb3NXYWl0RXZlbnRTZW0obG9jay0+Y2hhbmdlZCwgU0VNX0lOREVGSU5JVEVfV0FJVCk7Ci0JCX0KKyAgICB3aGlsZSAoIWRvbmUpIHsKKyAgICAgICAgLyogaWYgdGhlIGxvY2sgaXMgY3VycmVudGx5IHNldCwgd2UgaGF2ZSB0byB3YWl0IGZvcgorICAgICAgICAgKiB0aGUgc3RhdGUgdG8gY2hhbmdlCisgICAgICAgICAqLworICAgICAgICBpZiAobG9jay0+aXNfc2V0KSB7CisgICAgICAgICAgICBpZiAoIXdhaXRmbGFnKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgRG9zV2FpdEV2ZW50U2VtKGxvY2stPmNoYW5nZWQsIFNFTV9JTkRFRklOSVRFX1dBSVQpOworICAgICAgICB9CiAKLQkJLyogZW50ZXIgYSBjcml0aWNhbCBzZWN0aW9uIGFuZCB0cnkgdG8gZ2V0IHRoZSBzZW1hcGhvcmUuICBJZgotCQkgKiBpdCBpcyBzdGlsbCBsb2NrZWQsIHdlIHdpbGwgdHJ5IGFnYWluLgotCQkgKi8KLQkJaWYgKERvc0VudGVyQ3JpdFNlYygpKQotCQkJcmV0dXJuIDA7CisgICAgICAgIC8qIGVudGVyIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgdHJ5IHRvIGdldCB0aGUgc2VtYXBob3JlLiAgSWYKKyAgICAgICAgICogaXQgaXMgc3RpbGwgbG9ja2VkLCB3ZSB3aWxsIHRyeSBhZ2Fpbi4KKyAgICAgICAgICovCisgICAgICAgIGlmIChEb3NFbnRlckNyaXRTZWMoKSkKKyAgICAgICAgICAgIHJldHVybiAwOwogCi0JCWlmICghbG9jay0+aXNfc2V0KSB7Ci0JCQlsb2NrLT5pc19zZXQgPSAxOwotCQkJRG9zUmVzZXRFdmVudFNlbShsb2NrLT5jaGFuZ2VkLCAmY291bnQpOwotCQkJZG9uZSA9IDE7Ci0JCX0KKyAgICAgICAgaWYgKCFsb2NrLT5pc19zZXQpIHsKKyAgICAgICAgICAgIGxvY2stPmlzX3NldCA9IDE7CisgICAgICAgICAgICBEb3NSZXNldEV2ZW50U2VtKGxvY2stPmNoYW5nZWQsICZjb3VudCk7CisgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgfQogCi0JCURvc0V4aXRDcml0U2VjKCk7Ci0JfQorICAgICAgICBEb3NFeGl0Q3JpdFNlYygpOworICAgIH0KICNlbmRpZgogCi0JcmV0dXJuIDE7CisgICAgcmV0dXJuIDE7CiB9CiAKIHZvaWQKIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgYUxvY2spCiB7CiAjaWYgIWRlZmluZWQoUFlDQ19HQ0MpCi0JdHlwZV9vczJfbG9jayBsb2NrID0gKHR5cGVfb3MyX2xvY2spYUxvY2s7CisgICAgdHlwZV9vczJfbG9jayBsb2NrID0gKHR5cGVfb3MyX2xvY2spYUxvY2s7CiAjZW5kaWYKIAotCWRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLAotCQkgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLAotCQkgYUxvY2spKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwKKyAgICAgICAgICAgICBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCisgICAgICAgICAgICAgYUxvY2spKTsKIAogI2lmIGRlZmluZWQoUFlDQ19HQ0MpCi0JaWYgKGFMb2NrKQotCQlfZm11dGV4X3JlbGVhc2UoKF9mbXV0ZXggKilhTG9jayk7CisgICAgaWYgKGFMb2NrKQorICAgICAgICBfZm11dGV4X3JlbGVhc2UoKF9mbXV0ZXggKilhTG9jayk7CiAjZWxzZQotCWlmICghbG9jay0+aXNfc2V0KSB7Ci0JCWRwcmludGYoKCIlbGQ6IENvdWxkIG5vdCBQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGVycm9yOiAlbFxuIiwKLQkJCSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksCi0JCQkgYUxvY2ssCi0JCQkgR2V0TGFzdEVycm9yKCkpKTsKLQkJcmV0dXJuOwotCX0KKyAgICBpZiAoIWxvY2stPmlzX3NldCkgeworICAgICAgICBkcHJpbnRmKCgiJWxkOiBDb3VsZCBub3QgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBlcnJvcjogJWxcbiIsCisgICAgICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKKyAgICAgICAgICAgICAgICAgYUxvY2ssCisgICAgICAgICAgICAgICAgIEdldExhc3RFcnJvcigpKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlpZiAoRG9zRW50ZXJDcml0U2VjKCkpIHsKLQkJZHByaW50ZigoIiVsZDogQ291bGQgbm90IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZXJyb3I6ICVsXG4iLAotCQkJIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKLQkJCSBhTG9jaywKLQkJCSBHZXRMYXN0RXJyb3IoKSkpOwotCQlyZXR1cm47Ci0JfQorICAgIGlmIChEb3NFbnRlckNyaXRTZWMoKSkgeworICAgICAgICBkcHJpbnRmKCgiJWxkOiBDb3VsZCBub3QgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBlcnJvcjogJWxcbiIsCisgICAgICAgICAgICAgICAgIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwKKyAgICAgICAgICAgICAgICAgYUxvY2ssCisgICAgICAgICAgICAgICAgIEdldExhc3RFcnJvcigpKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlsb2NrLT5pc19zZXQgPSAwOwotCURvc1Bvc3RFdmVudFNlbShsb2NrLT5jaGFuZ2VkKTsKKyAgICBsb2NrLT5pc19zZXQgPSAwOworICAgIERvc1Bvc3RFdmVudFNlbShsb2NrLT5jaGFuZ2VkKTsKIAotCURvc0V4aXRDcml0U2VjKCk7CisgICAgRG9zRXhpdENyaXRTZWMoKTsKICNlbmRpZgogfQogCiAvKiBtaW5pbXVtL21heGltdW0gdGhyZWFkIHN0YWNrIHNpemVzIHN1cHBvcnRlZCAqLwotI2RlZmluZSBUSFJFQURfTUlOX1NUQUNLU0laRQkweDgwMDAJCS8qIDMya0IgKi8KLSNkZWZpbmUgVEhSRUFEX01BWF9TVEFDS1NJWkUJMHgyMDAwMDAwCS8qIDMyTUIgKi8KKyNkZWZpbmUgVEhSRUFEX01JTl9TVEFDS1NJWkUgICAgMHg4MDAwICAgICAgICAgIC8qIDMya0IgKi8KKyNkZWZpbmUgVEhSRUFEX01BWF9TVEFDS1NJWkUgICAgMHgyMDAwMDAwICAgICAgIC8qIDMyTUIgKi8KIAogLyogc2V0IHRoZSB0aHJlYWQgc3RhY2sgc2l6ZS4KICAqIFJldHVybiAwIGlmIHNpemUgaXMgdmFsaWQsIC0xIG90aGVyd2lzZS4KQEAgLTI4OSwxOSArMjg5LDE5IEBACiBzdGF0aWMgaW50CiBfcHl0aHJlYWRfb3MyX3NldF9zdGFja3NpemUoc2l6ZV90IHNpemUpCiB7Ci0JLyogc2V0IHRvIGRlZmF1bHQgKi8KLQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCV9weXRocmVhZF9zdGFja3NpemUgPSAwOwotCQlyZXR1cm4gMDsKLQl9CisgICAgLyogc2V0IHRvIGRlZmF1bHQgKi8KKyAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIF9weXRocmVhZF9zdGFja3NpemUgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiB2YWxpZCByYW5nZT8gKi8KLQlpZiAoc2l6ZSA+PSBUSFJFQURfTUlOX1NUQUNLU0laRSAmJiBzaXplIDwgVEhSRUFEX01BWF9TVEFDS1NJWkUpIHsKLQkJX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IHNpemU7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiB2YWxpZCByYW5nZT8gKi8KKyAgICBpZiAoc2l6ZSA+PSBUSFJFQURfTUlOX1NUQUNLU0laRSAmJiBzaXplIDwgVEhSRUFEX01BWF9TVEFDS1NJWkUpIHsKKyAgICAgICAgX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IHNpemU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCXJldHVybiAtMTsKKyAgICByZXR1cm4gLTE7CiB9CiAKLSNkZWZpbmUgVEhSRUFEX1NFVF9TVEFDS1NJWkUoeCkJX3B5dGhyZWFkX29zMl9zZXRfc3RhY2tzaXplKHgpCisjZGVmaW5lIFRIUkVBRF9TRVRfU1RBQ0tTSVpFKHgpIF9weXRocmVhZF9vczJfc2V0X3N0YWNrc2l6ZSh4KQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9wdGguaCBiL1B5dGhvbi90aHJlYWRfcHRoLmgKaW5kZXggOGM3ZGJlOS4uMWYxNjk0YSAxMDA2NDQKLS0tIGEvUHl0aG9uL3RocmVhZF9wdGguaAorKysgYi9QeXRob24vdGhyZWFkX3B0aC5oCkBAIC0zLDcgKzMsNyBAQAogICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3B0aAogICAgMjAwMC0wNS0wMyBBbmR5IER1c3RtYW4gPGFuZHlAZHVzdG1hbi5uZXQ+CiAKLSAgIEFkYXB0ZWQgZnJvbSBQb3NpeCB0aHJlYWRzIGludGVyZmFjZSAKKyAgIEFkYXB0ZWQgZnJvbSBQb3NpeCB0aHJlYWRzIGludGVyZmFjZQogICAgMTIgTWF5IDE5OTcgLS0gZGF2aWQgYXJub2xkIDxkYXZpZGFAcG9ib3guY29tPgogICovCiAKQEAgLTIyLDEwICsyMiwxMCBAQAogICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQljaGFyICAgICAgICAgICAgIGxvY2tlZDsgLyogMD11bmxvY2tlZCwgMT1sb2NrZWQgKi8KLQkvKiBhIDxjb25kLCBtdXRleD4gcGFpciB0byBoYW5kbGUgYW4gYWNxdWlyZSBvZiBhIGxvY2tlZCBsb2NrICovCi0JcHRoX2NvbmRfdCAgIGxvY2tfcmVsZWFzZWQ7Ci0JcHRoX211dGV4X3QgIG11dDsKKyAgICBjaGFyICAgICAgICAgICAgIGxvY2tlZDsgLyogMD11bmxvY2tlZCwgMT1sb2NrZWQgKi8KKyAgICAvKiBhIDxjb25kLCBtdXRleD4gcGFpciB0byBoYW5kbGUgYW4gYWNxdWlyZSBvZiBhIGxvY2tlZCBsb2NrICovCisgICAgcHRoX2NvbmRfdCAgIGxvY2tfcmVsZWFzZWQ7CisgICAgcHRoX211dGV4X3QgIG11dDsKIH0gcHRoX2xvY2s7CiAKICNkZWZpbmUgQ0hFQ0tfU1RBVFVTKG5hbWUpICBpZiAoc3RhdHVzID09IC0xKSB7IHByaW50ZigiJWQgIiwgc3RhdHVzKTsgcGVycm9yKG5hbWUpOyBlcnJvciA9IDE7IH0KQEAgLTM4LDEwICszOCwxMCBAQAogCiBzdGF0aWMgdm9pZCBQeVRocmVhZF9faW5pdF90aHJlYWQodm9pZCkKIHsKLQlwdGhfaW5pdCgpOwotCVB5VGhyZWFkX2F0dHIgPSBwdGhfYXR0cl9uZXcoKTsKLQlwdGhfYXR0cl9zZXQoUHlUaHJlYWRfYXR0ciwgUFRIX0FUVFJfU1RBQ0tfU0laRSwgMTw8MTgpOwotCXB0aF9hdHRyX3NldChQeVRocmVhZF9hdHRyLCBQVEhfQVRUUl9KT0lOQUJMRSwgRkFMU0UpOworICAgIHB0aF9pbml0KCk7CisgICAgUHlUaHJlYWRfYXR0ciA9IHB0aF9hdHRyX25ldygpOworICAgIHB0aF9hdHRyX3NldChQeVRocmVhZF9hdHRyLCBQVEhfQVRUUl9TVEFDS19TSVpFLCAxPDwxOCk7CisgICAgcHRoX2F0dHJfc2V0KFB5VGhyZWFkX2F0dHIsIFBUSF9BVFRSX0pPSU5BQkxFLCBGQUxTRSk7CiB9CiAKIC8qCkBAIC01MSw2OSArNTEsNjkgQEAKIAogbG9uZyBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7Ci0JcHRoX3QgdGg7Ci0JZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBwdGhfdCB0aDsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JdGggPSBwdGhfc3Bhd24oUHlUaHJlYWRfYXR0ciwKLQkJCQkgKHZvaWQqICgqKSh2b2lkICopKWZ1bmMsCi0JCQkJICh2b2lkICopYXJnCi0JCQkJICk7CisgICAgdGggPSBwdGhfc3Bhd24oUHlUaHJlYWRfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqICgqKSh2b2lkICopKWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYXJnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLQlyZXR1cm4gdGg7CisgICAgcmV0dXJuIHRoOwogfQogCiBsb25nIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQodm9pZCkKIHsKLQl2b2xhdGlsZSBwdGhfdCB0aHJlYWRpZDsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCS8qIEp1bXAgdGhyb3VnaCBzb21lIGhvb3BzIGZvciBBbHBoYSBPU0YvMSAqLwotCXRocmVhZGlkID0gcHRoX3NlbGYoKTsKLQlyZXR1cm4gKGxvbmcpICoobG9uZyAqKSAmdGhyZWFkaWQ7CisgICAgdm9sYXRpbGUgcHRoX3QgdGhyZWFkaWQ7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICAvKiBKdW1wIHRocm91Z2ggc29tZSBob29wcyBmb3IgQWxwaGEgT1NGLzEgKi8KKyAgICB0aHJlYWRpZCA9IHB0aF9zZWxmKCk7CisgICAgcmV0dXJuIChsb25nKSAqKGxvbmcgKikgJnRocmVhZGlkOwogfQogCiBzdGF0aWMgdm9pZCBkb19QeVRocmVhZF9leGl0X3RocmVhZChpbnQgbm9fY2xlYW51cCkKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkgewotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KDApOwotCQllbHNlCi0JCQlleGl0KDApOwotCX0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF90aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkgeworICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KDApOworICAgIH0KIH0KIAogdm9pZCBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOwogfQogCiB2b2lkIFB5VGhyZWFkX19leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDEpOwogfQogCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwogc3RhdGljIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMsIGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCJQeVRocmVhZF9leGl0X3Byb2coJWQpIGNhbGxlZFxuIiwgc3RhdHVzKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdChzdGF0dXMpOwotCQllbHNlCi0JCQlleGl0KHN0YXR1cyk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KHN0YXR1cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoc3RhdHVzKTsKIH0KIAogdm9pZCBQeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAwKTsKIH0KIAogdm9pZCBQeVRocmVhZF9fZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CiB9CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCiAKQEAgLTEyMiw5MiArMTIyLDkyIEBACiAgKi8KIFB5VGhyZWFkX3R5cGVfbG9jayBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7Ci0JcHRoX2xvY2sgKmxvY2s7Ci0JaW50IHN0YXR1cywgZXJyb3IgPSAwOworICAgIHB0aF9sb2NrICpsb2NrOworICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWxvY2sgPSAocHRoX2xvY2sgKikgbWFsbG9jKHNpemVvZihwdGhfbG9jaykpOwotICAgICAgICBtZW1zZXQoKHZvaWQgKilsb2NrLCAnXDAnLCBzaXplb2YocHRoX2xvY2spKTsKLQlpZiAobG9jaykgewotCQlsb2NrLT5sb2NrZWQgPSAwOwotCQlzdGF0dXMgPSBwdGhfbXV0ZXhfaW5pdCgmbG9jay0+bXV0KTsKLQkJQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfaW5pdCIpOwotCQlzdGF0dXMgPSBwdGhfY29uZF9pbml0KCZsb2NrLT5sb2NrX3JlbGVhc2VkKTsKLQkJQ0hFQ0tfU1RBVFVTKCJwdGhfY29uZF9pbml0Iik7Ci0JCWlmIChlcnJvcikgewotCQkJZnJlZSgodm9pZCAqKWxvY2spOwotCQkJbG9jayA9IE5VTEw7Ci0JCX0KLQl9Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGxvY2sgPSAocHRoX2xvY2sgKikgbWFsbG9jKHNpemVvZihwdGhfbG9jaykpOworICAgIG1lbXNldCgodm9pZCAqKWxvY2ssICdcMCcsIHNpemVvZihwdGhfbG9jaykpOworICAgIGlmIChsb2NrKSB7CisgICAgICAgIGxvY2stPmxvY2tlZCA9IDA7CisgICAgICAgIHN0YXR1cyA9IHB0aF9tdXRleF9pbml0KCZsb2NrLT5tdXQpOworICAgICAgICBDSEVDS19TVEFUVVMoInB0aF9tdXRleF9pbml0Iik7CisgICAgICAgIHN0YXR1cyA9IHB0aF9jb25kX2luaXQoJmxvY2stPmxvY2tfcmVsZWFzZWQpOworICAgICAgICBDSEVDS19TVEFUVVMoInB0aF9jb25kX2luaXQiKTsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgICBmcmVlKCh2b2lkICopbG9jayk7CisgICAgICAgICAgICBsb2NrID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7CisgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGxvY2s7CiB9CiAKIHZvaWQgUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCXB0aF9sb2NrICp0aGVsb2NrID0gKHB0aF9sb2NrICopbG9jazsKKyAgICBwdGhfbG9jayAqdGhlbG9jayA9IChwdGhfbG9jayAqKWxvY2s7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKIAotCWZyZWUoKHZvaWQgKil0aGVsb2NrKTsKKyAgICBmcmVlKCh2b2lkICopdGhlbG9jayk7CiB9CiAKIGludCBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2ssIGludCB3YWl0ZmxhZykKIHsKLQlpbnQgc3VjY2VzczsKLQlwdGhfbG9jayAqdGhlbG9jayA9IChwdGhfbG9jayAqKWxvY2s7Ci0JaW50IHN0YXR1cywgZXJyb3IgPSAwOworICAgIGludCBzdWNjZXNzOworICAgIHB0aF9sb2NrICp0aGVsb2NrID0gKHB0aF9sb2NrICopbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CiAKLQlzdGF0dXMgPSBwdGhfbXV0ZXhfYWNxdWlyZSgmdGhlbG9jay0+bXV0LCAhd2FpdGZsYWcsIE5VTEwpOwotCUNIRUNLX1NUQVRVUygicHRoX211dGV4X2FjcXVpcmVbMV0iKTsKLQlzdWNjZXNzID0gdGhlbG9jay0+bG9ja2VkID09IDA7Ci0gICAgICAgIGlmIChzdWNjZXNzKSB0aGVsb2NrLT5sb2NrZWQgPSAxOwotICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfcmVsZWFzZSggJnRoZWxvY2stPm11dCApOwotICAgICAgICBDSEVDS19TVEFUVVMoInB0aF9tdXRleF9yZWxlYXNlWzFdIik7CisgICAgc3RhdHVzID0gcHRoX211dGV4X2FjcXVpcmUoJnRoZWxvY2stPm11dCwgIXdhaXRmbGFnLCBOVUxMKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aF9tdXRleF9hY3F1aXJlWzFdIik7CisgICAgc3VjY2VzcyA9IHRoZWxvY2stPmxvY2tlZCA9PSAwOworICAgIGlmIChzdWNjZXNzKSB0aGVsb2NrLT5sb2NrZWQgPSAxOworICAgIHN0YXR1cyA9IHB0aF9tdXRleF9yZWxlYXNlKCAmdGhlbG9jay0+bXV0ICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfcmVsZWFzZVsxXSIpOwogCi0gICAgICAgIGlmICggIXN1Y2Nlc3MgJiYgd2FpdGZsYWcgKSB7Ci0gICAgICAgICAgICAgICAgLyogY29udGludWUgdHJ5aW5nIHVudGlsIHdlIGdldCB0aGUgbG9jayAqLworICAgIGlmICggIXN1Y2Nlc3MgJiYgd2FpdGZsYWcgKSB7CisgICAgICAgIC8qIGNvbnRpbnVlIHRyeWluZyB1bnRpbCB3ZSBnZXQgdGhlIGxvY2sgKi8KIAotICAgICAgICAgICAgICAgIC8qIG11dCBtdXN0IGJlIGxvY2tlZCBieSBtZSAtLSBwYXJ0IG9mIHRoZSBjb25kaXRpb24KLSAgICAgICAgICAgICAgICAgKiBwcm90b2NvbCAqLwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHB0aF9tdXRleF9hY3F1aXJlKCAmdGhlbG9jay0+bXV0LCAhd2FpdGZsYWcsIE5VTEwgKTsKLSAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMoInB0aF9tdXRleF9hY3F1aXJlWzJdIik7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCB0aGVsb2NrLT5sb2NrZWQgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBwdGhfY29uZF9hd2FpdCgmdGhlbG9jay0+bG9ja19yZWxlYXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVsb2NrLT5tdXQsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfY29uZF9hd2FpdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGVsb2NrLT5sb2NrZWQgPSAxOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHB0aF9tdXRleF9yZWxlYXNlKCAmdGhlbG9jay0+bXV0ICk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfcmVsZWFzZVsyXSIpOwotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAxOworICAgICAgICAvKiBtdXQgbXVzdCBiZSBsb2NrZWQgYnkgbWUgLS0gcGFydCBvZiB0aGUgY29uZGl0aW9uCisgICAgICAgICAqIHByb3RvY29sICovCisgICAgICAgIHN0YXR1cyA9IHB0aF9tdXRleF9hY3F1aXJlKCAmdGhlbG9jay0+bXV0LCAhd2FpdGZsYWcsIE5VTEwgKTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfYWNxdWlyZVsyXSIpOworICAgICAgICB3aGlsZSAoIHRoZWxvY2stPmxvY2tlZCApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aF9jb25kX2F3YWl0KCZ0aGVsb2NrLT5sb2NrX3JlbGVhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZWxvY2stPm11dCwgTlVMTCk7CisgICAgICAgICAgICBDSEVDS19TVEFUVVMoInB0aF9jb25kX2F3YWl0Iik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGVycm9yKSBzdWNjZXNzID0gMDsKLSAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgICAgICB0aGVsb2NrLT5sb2NrZWQgPSAxOworICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfcmVsZWFzZSggJnRoZWxvY2stPm11dCApOworICAgICAgICBDSEVDS19TVEFUVVMoInB0aF9tdXRleF9yZWxlYXNlWzJdIik7CisgICAgICAgIHN1Y2Nlc3MgPSAxOworICAgIH0KKyAgICBpZiAoZXJyb3IpIHN1Y2Nlc3MgPSAwOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAogdm9pZCBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0gICAgICAgIHB0aF9sb2NrICp0aGVsb2NrID0gKHB0aF9sb2NrICopbG9jazsKLSAgICAgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOworICAgIHB0aF9sb2NrICp0aGVsb2NrID0gKHB0aF9sb2NrICopbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLSAgICAgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKLSAgICAgICAgc3RhdHVzID0gcHRoX211dGV4X2FjcXVpcmUoICZ0aGVsb2NrLT5tdXQsIDAsIE5VTEwgKTsKLSAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfYWNxdWlyZVszXSIpOworICAgIHN0YXR1cyA9IHB0aF9tdXRleF9hY3F1aXJlKCAmdGhlbG9jay0+bXV0LCAwLCBOVUxMICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhfbXV0ZXhfYWNxdWlyZVszXSIpOwogCi0gICAgICAgIHRoZWxvY2stPmxvY2tlZCA9IDA7CisgICAgdGhlbG9jay0+bG9ja2VkID0gMDsKIAotICAgICAgICBzdGF0dXMgPSBwdGhfbXV0ZXhfcmVsZWFzZSggJnRoZWxvY2stPm11dCApOwotICAgICAgICBDSEVDS19TVEFUVVMoInB0aF9tdXRleF9yZWxlYXNlWzNdIik7CisgICAgc3RhdHVzID0gcHRoX211dGV4X3JlbGVhc2UoICZ0aGVsb2NrLT5tdXQgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aF9tdXRleF9yZWxlYXNlWzNdIik7CiAKLSAgICAgICAgLyogd2FrZSB1cCBzb21lb25lIChhbnlvbmUsIGlmIGFueSkgd2FpdGluZyBvbiB0aGUgbG9jayAqLwotICAgICAgICBzdGF0dXMgPSBwdGhfY29uZF9ub3RpZnkoICZ0aGVsb2NrLT5sb2NrX3JlbGVhc2VkLCAwICk7Ci0gICAgICAgIENIRUNLX1NUQVRVUygicHRoX2NvbmRfbm90aWZ5Iik7CisgICAgLyogd2FrZSB1cCBzb21lb25lIChhbnlvbmUsIGlmIGFueSkgd2FpdGluZyBvbiB0aGUgbG9jayAqLworICAgIHN0YXR1cyA9IHB0aF9jb25kX25vdGlmeSggJnRoZWxvY2stPmxvY2tfcmVsZWFzZWQsIDAgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aF9jb25kX25vdGlmeSIpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF9wdGhyZWFkLmggYi9QeXRob24vdGhyZWFkX3B0aHJlYWQuaAppbmRleCA2MGQyZmIyLi4zMmZkMmQwIDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX3B0aHJlYWQuaAorKysgYi9QeXRob24vdGhyZWFkX3B0aHJlYWQuaApAQCAtMTYsMTAgKzE2LDEwIEBACiAgICBiZSBjb25kaXRpb25hbCBvbiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFIGJlaW5nIGRlZmluZWQuICovCiAjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQogI2lmbmRlZiBUSFJFQURfU1RBQ0tfU0laRQotI2RlZmluZQlUSFJFQURfU1RBQ0tfU0laRQkwCS8qIHVzZSBkZWZhdWx0IHN0YWNrIHNpemUgKi8KKyNkZWZpbmUgVEhSRUFEX1NUQUNLX1NJWkUgICAgICAgMCAgICAgICAvKiB1c2UgZGVmYXVsdCBzdGFjayBzaXplICovCiAjZW5kaWYKIC8qIGZvciBzYWZldHksIGVuc3VyZSBhIHZpYWJsZSBtaW5pbXVtIHN0YWNrc2l6ZSAqLwotI2RlZmluZQlUSFJFQURfU1RBQ0tfTUlOCTB4ODAwMAkvKiAzMmtCICovCisjZGVmaW5lIFRIUkVBRF9TVEFDS19NSU4gICAgICAgIDB4ODAwMCAgLyogMzJrQiAqLwogI2Vsc2UgIC8qICFfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCiAjaWZkZWYgVEhSRUFEX1NUQUNLX1NJWkUKICNlcnJvciAiVEhSRUFEX1NUQUNLX1NJWkUgZGVmaW5lZCBidXQgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSB1bmRlZmluZWQiCkBAIC0yOCw5ICsyOCw5IEBACiAKIC8qIFRoZSBQT1NJWCBzcGVjIHNheXMgdGhhdCBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydGluZyB0aGUgc2VtXyoKICAgIGZhbWlseSBvZiBmdW5jdGlvbnMgbXVzdCBpbmRpY2F0ZSB0aGlzIGJ5IGRlZmluaW5nCi0gICBfUE9TSVhfU0VNQVBIT1JFUy4gKi8gICAKKyAgIF9QT1NJWF9TRU1BUEhPUkVTLiAqLwogI2lmZGVmIF9QT1NJWF9TRU1BUEhPUkVTCi0vKiBPbiBGcmVlQlNEIDQueCwgX1BPU0lYX1NFTUFQSE9SRVMgaXMgZGVmaW5lZCBlbXB0eSwgc28gCisvKiBPbiBGcmVlQlNEIDQueCwgX1BPU0lYX1NFTUFQSE9SRVMgaXMgZGVmaW5lZCBlbXB0eSwgc28KICAgIHdlIG5lZWQgdG8gYWRkIDAgdG8gbWFrZSBpdCB3b3JrIHRoZXJlIGFzIHdlbGwuICovCiAjaWYgKF9QT1NJWF9TRU1BUEhPUkVTKzApID09IC0xCiAjZGVmaW5lIEhBVkVfQlJPS0VOX1BPU0lYX1NFTUFQSE9SRVMKQEAgLTk5LDEwICs5OSwxMCBAQAogICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQljaGFyICAgICAgICAgICAgIGxvY2tlZDsgLyogMD11bmxvY2tlZCwgMT1sb2NrZWQgKi8KLQkvKiBhIDxjb25kLCBtdXRleD4gcGFpciB0byBoYW5kbGUgYW4gYWNxdWlyZSBvZiBhIGxvY2tlZCBsb2NrICovCi0JcHRocmVhZF9jb25kX3QgICBsb2NrX3JlbGVhc2VkOwotCXB0aHJlYWRfbXV0ZXhfdCAgbXV0OworICAgIGNoYXIgICAgICAgICAgICAgbG9ja2VkOyAvKiAwPXVubG9ja2VkLCAxPWxvY2tlZCAqLworICAgIC8qIGEgPGNvbmQsIG11dGV4PiBwYWlyIHRvIGhhbmRsZSBhbiBhY3F1aXJlIG9mIGEgbG9ja2VkIGxvY2sgKi8KKyAgICBwdGhyZWFkX2NvbmRfdCAgIGxvY2tfcmVsZWFzZWQ7CisgICAgcHRocmVhZF9tdXRleF90ICBtdXQ7CiB9IHB0aHJlYWRfbG9jazsKIAogI2RlZmluZSBDSEVDS19TVEFUVVMobmFtZSkgIGlmIChzdGF0dXMgIT0gMCkgeyBwZXJyb3IobmFtZSk7IGVycm9yID0gMTsgfQpAQCAtMTIwLDExICsxMjAsMTEgQEAKIHN0YXRpYyB2b2lkCiBQeVRocmVhZF9faW5pdF90aHJlYWQodm9pZCkKIHsKLQkvKiBETyBBTiBJTklUIEJZIFNUQVJUSU5HIFRIRSBUSFJFQUQgKi8KLQlzdGF0aWMgaW50IGR1bW15ID0gMDsKLQlwdGhyZWFkX3QgdGhyZWFkMTsKLQlwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkMSwgTlVMTCwgKHZvaWQgKikgX25vb3AsICZkdW1teSk7Ci0JcHRocmVhZF9qb2luKHRocmVhZDEsIE5VTEwpOworICAgIC8qIERPIEFOIElOSVQgQlkgU1RBUlRJTkcgVEhFIFRIUkVBRCAqLworICAgIHN0YXRpYyBpbnQgZHVtbXkgPSAwOworICAgIHB0aHJlYWRfdCB0aHJlYWQxOworICAgIHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWQxLCBOVUxMLCAodm9pZCAqKSBfbm9vcCwgJmR1bW15KTsKKyAgICBwdGhyZWFkX2pvaW4odGhyZWFkMSwgTlVMTCk7CiB9CiAKICNlbHNlIC8qICFfSEFWRV9CU0RJICovCkBAIC0xMzMsNyArMTMzLDcgQEAKIFB5VGhyZWFkX19pbml0X3RocmVhZCh2b2lkKQogewogI2lmIGRlZmluZWQoX0FJWCkgJiYgZGVmaW5lZChfX0dOVUNfXykKLQlwdGhyZWFkX2luaXQoKTsKKyAgICBwdGhyZWFkX2luaXQoKTsKICNlbmRpZgogfQogCkBAIC0xNDcsNTkgKzE0Nyw1OSBAQAogbG9uZwogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKQogewotCXB0aHJlYWRfdCB0aDsKLQlpbnQgc3RhdHVzOworICAgIHB0aHJlYWRfdCB0aDsKKyAgICBpbnQgc3RhdHVzOwogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpIHx8IGRlZmluZWQoUFRIUkVBRF9TWVNURU1fU0NIRURfU1VQUE9SVEVEKQotCXB0aHJlYWRfYXR0cl90IGF0dHJzOworICAgIHB0aHJlYWRfYXR0cl90IGF0dHJzOwogI2VuZGlmCiAjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkKLQlzaXplX3QJdHNzOworICAgIHNpemVfdCAgICAgIHRzczsKICNlbmRpZgogCi0JZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCiAjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkgfHwgZGVmaW5lZChQVEhSRUFEX1NZU1RFTV9TQ0hFRF9TVVBQT1JURUQpCi0JaWYgKHB0aHJlYWRfYXR0cl9pbml0KCZhdHRycykgIT0gMCkKLQkJcmV0dXJuIC0xOworICAgIGlmIChwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cnMpICE9IDApCisgICAgICAgIHJldHVybiAtMTsKICNlbmRpZgogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCi0JdHNzID0gKF9weXRocmVhZF9zdGFja3NpemUgIT0gMCkgPyBfcHl0aHJlYWRfc3RhY2tzaXplCi0JCQkJCSA6IFRIUkVBRF9TVEFDS19TSVpFOwotCWlmICh0c3MgIT0gMCkgewotCQlpZiAocHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0cnMsIHRzcykgIT0gMCkgewotCQkJcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHJzKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KKyAgICB0c3MgPSAoX3B5dGhyZWFkX3N0YWNrc2l6ZSAhPSAwKSA/IF9weXRocmVhZF9zdGFja3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRIUkVBRF9TVEFDS19TSVpFOworICAgIGlmICh0c3MgIT0gMCkgeworICAgICAgICBpZiAocHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0cnMsIHRzcykgIT0gMCkgeworICAgICAgICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHJzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgogI2lmIGRlZmluZWQoUFRIUkVBRF9TWVNURU1fU0NIRURfU1VQUE9SVEVEKQotICAgICAgICBwdGhyZWFkX2F0dHJfc2V0c2NvcGUoJmF0dHJzLCBQVEhSRUFEX1NDT1BFX1NZU1RFTSk7CisgICAgcHRocmVhZF9hdHRyX3NldHNjb3BlKCZhdHRycywgUFRIUkVBRF9TQ09QRV9TWVNURU0pOwogI2VuZGlmCiAKLQlzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSgmdGgsIAorICAgIHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCZ0aCwKICNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKSB8fCBkZWZpbmVkKFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCkKLQkJCQkgJmF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cnMsCiAjZWxzZQotCQkJCSAocHRocmVhZF9hdHRyX3QqKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdGhyZWFkX2F0dHJfdCopTlVMTCwKICNlbmRpZgotCQkJCSAodm9pZCogKCopKHZvaWQgKikpZnVuYywKLQkJCQkgKHZvaWQgKilhcmcKLQkJCQkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqICgqKSh2b2lkICopKWZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYXJnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKICNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKSB8fCBkZWZpbmVkKFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCkKLQlwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cnMpOworICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRycyk7CiAjZW5kaWYKLQlpZiAoc3RhdHVzICE9IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKHN0YXR1cyAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgcHRocmVhZF9kZXRhY2godGgpOworICAgIHB0aHJlYWRfZGV0YWNoKHRoKTsKIAogI2lmIFNJWkVPRl9QVEhSRUFEX1QgPD0gU0laRU9GX0xPTkcKLQlyZXR1cm4gKGxvbmcpIHRoOworICAgIHJldHVybiAobG9uZykgdGg7CiAjZWxzZQotCXJldHVybiAobG9uZykgKihsb25nICopICZ0aDsKKyAgICByZXR1cm4gKGxvbmcpICoobG9uZyAqKSAmdGg7CiAjZW5kaWYKIH0KIApAQCAtMjEwLDY3ICsyMTAsNjcgQEAKICAgICAgLSBJdCBpcyBub3QgY2xlYXIgdGhhdCB0aGUgJ3ZvbGF0aWxlJyAoZm9yIEFJWD8pIGFuZCB1Z2x5IGNhc3RpbmcgaW4gdGhlCiAgICAgICAgbGF0dGVyIHJldHVybiBzdGF0ZW1lbnQgKGZvciBBbHBoYSBPU0YvMSkgYXJlIGFueSBsb25nZXIgbmVjZXNzYXJ5LgogKi8KLWxvbmcgCitsb25nCiBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpCiB7Ci0Jdm9sYXRpbGUgcHRocmVhZF90IHRocmVhZGlkOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0JLyogSnVtcCB0aHJvdWdoIHNvbWUgaG9vcHMgZm9yIEFscGhhIE9TRi8xICovCi0JdGhyZWFkaWQgPSBwdGhyZWFkX3NlbGYoKTsKKyAgICB2b2xhdGlsZSBwdGhyZWFkX3QgdGhyZWFkaWQ7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICAvKiBKdW1wIHRocm91Z2ggc29tZSBob29wcyBmb3IgQWxwaGEgT1NGLzEgKi8KKyAgICB0aHJlYWRpZCA9IHB0aHJlYWRfc2VsZigpOwogI2lmIFNJWkVPRl9QVEhSRUFEX1QgPD0gU0laRU9GX0xPTkcKLQlyZXR1cm4gKGxvbmcpIHRocmVhZGlkOworICAgIHJldHVybiAobG9uZykgdGhyZWFkaWQ7CiAjZWxzZQotCXJldHVybiAobG9uZykgKihsb25nICopICZ0aHJlYWRpZDsKKyAgICByZXR1cm4gKGxvbmcpICoobG9uZyAqKSAmdGhyZWFkaWQ7CiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgCitzdGF0aWMgdm9pZAogZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlfZXhpdCgwKTsKLQkJZWxzZQotCQkJZXhpdCgwKTsKLQl9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBfZXhpdCgwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdCgwKTsKKyAgICB9CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CiB9CiAKICNpZm5kZWYgTk9fRVhJVF9QUk9HCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiBkb19QeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cywgaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KHN0YXR1cyk7Ci0JCWVsc2UKLQkJCWV4aXQoc3RhdHVzKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoc3RhdHVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9fZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CiB9CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCiAKQEAgLTI4MCw0NyArMjgwLDQ3IEBACiAgKiBMb2NrIHN1cHBvcnQuCiAgKi8KIAotUHlUaHJlYWRfdHlwZV9sb2NrIAorUHlUaHJlYWRfdHlwZV9sb2NrCiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7Ci0Jc2VtX3QgKmxvY2s7Ci0JaW50IHN0YXR1cywgZXJyb3IgPSAwOworICAgIHNlbV90ICpsb2NrOworICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWxvY2sgPSAoc2VtX3QgKiltYWxsb2Moc2l6ZW9mKHNlbV90KSk7CisgICAgbG9jayA9IChzZW1fdCAqKW1hbGxvYyhzaXplb2Yoc2VtX3QpKTsKIAotCWlmIChsb2NrKSB7Ci0JCXN0YXR1cyA9IHNlbV9pbml0KGxvY2ssMCwxKTsKLQkJQ0hFQ0tfU1RBVFVTKCJzZW1faW5pdCIpOworICAgIGlmIChsb2NrKSB7CisgICAgICAgIHN0YXR1cyA9IHNlbV9pbml0KGxvY2ssMCwxKTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJzZW1faW5pdCIpOwogCi0JCWlmIChlcnJvcikgewotCQkJZnJlZSgodm9pZCAqKWxvY2spOwotCQkJbG9jayA9IE5VTEw7Ci0JCX0KLQl9CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgZnJlZSgodm9pZCAqKWxvY2spOworICAgICAgICAgICAgbG9jayA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7Ci0JcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spbG9jazsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7CisgICAgcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spbG9jazsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlzZW1fdCAqdGhlbG9jayA9IChzZW1fdCAqKWxvY2s7Ci0JaW50IHN0YXR1cywgZXJyb3IgPSAwOworICAgIHNlbV90ICp0aGVsb2NrID0gKHNlbV90ICopbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKIAotCWlmICghdGhlbG9jaykKLQkJcmV0dXJuOworICAgIGlmICghdGhlbG9jaykKKyAgICAgICAgcmV0dXJuOwogCi0Jc3RhdHVzID0gc2VtX2Rlc3Ryb3kodGhlbG9jayk7Ci0JQ0hFQ0tfU1RBVFVTKCJzZW1fZGVzdHJveSIpOworICAgIHN0YXR1cyA9IHNlbV9kZXN0cm95KHRoZWxvY2spOworICAgIENIRUNLX1NUQVRVUygic2VtX2Rlc3Ryb3kiKTsKIAotCWZyZWUoKHZvaWQgKil0aGVsb2NrKTsKKyAgICBmcmVlKCh2b2lkICopdGhlbG9jayk7CiB9CiAKIC8qCkBAIC0zMzIsNDcgKzMzMiw0NyBAQAogc3RhdGljIGludAogZml4X3N0YXR1cyhpbnQgc3RhdHVzKQogewotCXJldHVybiAoc3RhdHVzID09IC0xKSA/IGVycm5vIDogc3RhdHVzOworICAgIHJldHVybiAoc3RhdHVzID09IC0xKSA/IGVycm5vIDogc3RhdHVzOwogfQogCi1pbnQgCitpbnQKIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzOwotCXNlbV90ICp0aGVsb2NrID0gKHNlbV90ICopbG9jazsKLQlpbnQgc3RhdHVzLCBlcnJvciA9IDA7CisgICAgaW50IHN1Y2Nlc3M7CisgICAgc2VtX3QgKnRoZWxvY2sgPSAoc2VtX3QgKilsb2NrOworICAgIGludCBzdGF0dXMsIGVycm9yID0gMDsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIGNhbGxlZFxuIiwgbG9jaywgd2FpdGZsYWcpKTsKIAotCWRvIHsKLQkJaWYgKHdhaXRmbGFnKQotCQkJc3RhdHVzID0gZml4X3N0YXR1cyhzZW1fd2FpdCh0aGVsb2NrKSk7Ci0JCWVsc2UKLQkJCXN0YXR1cyA9IGZpeF9zdGF0dXMoc2VtX3RyeXdhaXQodGhlbG9jaykpOwotCX0gd2hpbGUgKHN0YXR1cyA9PSBFSU5UUik7IC8qIFJldHJ5IGlmIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsICovCisgICAgZG8geworICAgICAgICBpZiAod2FpdGZsYWcpCisgICAgICAgICAgICBzdGF0dXMgPSBmaXhfc3RhdHVzKHNlbV93YWl0KHRoZWxvY2spKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3RhdHVzID0gZml4X3N0YXR1cyhzZW1fdHJ5d2FpdCh0aGVsb2NrKSk7CisgICAgfSB3aGlsZSAoc3RhdHVzID09IEVJTlRSKTsgLyogUmV0cnkgaWYgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgKi8KIAotCWlmICh3YWl0ZmxhZykgewotCQlDSEVDS19TVEFUVVMoInNlbV93YWl0Iik7Ci0JfSBlbHNlIGlmIChzdGF0dXMgIT0gRUFHQUlOKSB7Ci0JCUNIRUNLX1NUQVRVUygic2VtX3RyeXdhaXQiKTsKLQl9Ci0JCi0Jc3VjY2VzcyA9IChzdGF0dXMgPT0gMCkgPyAxIDogMDsKKyAgICBpZiAod2FpdGZsYWcpIHsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJzZW1fd2FpdCIpOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEVBR0FJTikgeworICAgICAgICBDSEVDS19TVEFUVVMoInNlbV90cnl3YWl0Iik7CisgICAgfQogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgIHN1Y2Nlc3MgPSAoc3RhdHVzID09IDApID8gMSA6IDA7CisKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0Jc2VtX3QgKnRoZWxvY2sgPSAoc2VtX3QgKilsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBzZW1fdCAqdGhlbG9jayA9IChzZW1fdCAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKLQlzdGF0dXMgPSBzZW1fcG9zdCh0aGVsb2NrKTsKLQlDSEVDS19TVEFUVVMoInNlbV9wb3N0Iik7CisgICAgc3RhdHVzID0gc2VtX3Bvc3QodGhlbG9jayk7CisgICAgQ0hFQ0tfU1RBVFVTKCJzZW1fcG9zdCIpOwogfQogCiAjZWxzZSAvKiBVU0VfU0VNQVBIT1JFUyAqLwpAQCAtMzgwLDEwOSArMzgwLDEwOSBAQAogLyoKICAqIExvY2sgc3VwcG9ydC4KICAqLwotUHlUaHJlYWRfdHlwZV9sb2NrIAorUHlUaHJlYWRfdHlwZV9sb2NrCiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpCiB7Ci0JcHRocmVhZF9sb2NrICpsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBwdGhyZWFkX2xvY2sgKmxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JbG9jayA9IChwdGhyZWFkX2xvY2sgKikgbWFsbG9jKHNpemVvZihwdGhyZWFkX2xvY2spKTsKLQlpZiAobG9jaykgewotCQltZW1zZXQoKHZvaWQgKilsb2NrLCAnXDAnLCBzaXplb2YocHRocmVhZF9sb2NrKSk7Ci0JCWxvY2stPmxvY2tlZCA9IDA7CisgICAgbG9jayA9IChwdGhyZWFkX2xvY2sgKikgbWFsbG9jKHNpemVvZihwdGhyZWFkX2xvY2spKTsKKyAgICBpZiAobG9jaykgeworICAgICAgICBtZW1zZXQoKHZvaWQgKilsb2NrLCAnXDAnLCBzaXplb2YocHRocmVhZF9sb2NrKSk7CisgICAgICAgIGxvY2stPmxvY2tlZCA9IDA7CiAKLQkJc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZsb2NrLT5tdXQsCi0JCQkJCSAgICBwdGhyZWFkX211dGV4YXR0cl9kZWZhdWx0KTsKLQkJQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X2luaXQiKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCZsb2NrLT5tdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4YXR0cl9kZWZhdWx0KTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X2luaXQiKTsKIAotCQlzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbG9jay0+bG9ja19yZWxlYXNlZCwKLQkJCQkJICAgcHRocmVhZF9jb25kYXR0cl9kZWZhdWx0KTsKLQkJQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX2NvbmRfaW5pdCIpOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCgmbG9jay0+bG9ja19yZWxlYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kYXR0cl9kZWZhdWx0KTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX2NvbmRfaW5pdCIpOwogCi0JCWlmIChlcnJvcikgewotCQkJZnJlZSgodm9pZCAqKWxvY2spOwotCQkJbG9jayA9IDA7Ci0JCX0KLQl9CisgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAgICAgZnJlZSgodm9pZCAqKWxvY2spOworICAgICAgICAgICAgbG9jayA9IDA7CisgICAgICAgIH0KKyAgICB9CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jaygpIC0+ICVwXG4iLCBsb2NrKSk7Ci0JcmV0dXJuIChQeVRocmVhZF90eXBlX2xvY2spIGxvY2s7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCXB0aHJlYWRfbG9jayAqdGhlbG9jayA9IChwdGhyZWFkX2xvY2sgKilsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBwdGhyZWFkX2xvY2sgKnRoZWxvY2sgPSAocHRocmVhZF9sb2NrICopbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKIAotCXN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSggJnRoZWxvY2stPm11dCApOwotCUNIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF9kZXN0cm95Iik7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCAmdGhlbG9jay0+bXV0ICk7CisgICAgQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiKTsKIAotCXN0YXR1cyA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCAmdGhlbG9jay0+bG9ja19yZWxlYXNlZCApOwotCUNIRUNLX1NUQVRVUygicHRocmVhZF9jb25kX2Rlc3Ryb3kiKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSggJnRoZWxvY2stPmxvY2tfcmVsZWFzZWQgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aHJlYWRfY29uZF9kZXN0cm95Iik7CiAKLQlmcmVlKCh2b2lkICopdGhlbG9jayk7CisgICAgZnJlZSgodm9pZCAqKXRoZWxvY2spOwogfQogCi1pbnQgCitpbnQKIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaywgaW50IHdhaXRmbGFnKQogewotCWludCBzdWNjZXNzOwotCXB0aHJlYWRfbG9jayAqdGhlbG9jayA9IChwdGhyZWFkX2xvY2sgKilsb2NrOwotCWludCBzdGF0dXMsIGVycm9yID0gMDsKKyAgICBpbnQgc3VjY2VzczsKKyAgICBwdGhyZWFkX2xvY2sgKnRoZWxvY2sgPSAocHRocmVhZF9sb2NrICopbG9jazsKKyAgICBpbnQgc3RhdHVzLCBlcnJvciA9IDA7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CiAKLQlzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aGVsb2NrLT5tdXQgKTsKLQlDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfbG9ja1sxXSIpOwotCXN1Y2Nlc3MgPSB0aGVsb2NrLT5sb2NrZWQgPT0gMDsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aGVsb2NrLT5tdXQgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfbG9ja1sxXSIpOworICAgIHN1Y2Nlc3MgPSB0aGVsb2NrLT5sb2NrZWQgPT0gMDsKIAotCWlmICggIXN1Y2Nlc3MgJiYgd2FpdGZsYWcgKSB7Ci0JCS8qIGNvbnRpbnVlIHRyeWluZyB1bnRpbCB3ZSBnZXQgdGhlIGxvY2sgKi8KKyAgICBpZiAoICFzdWNjZXNzICYmIHdhaXRmbGFnICkgeworICAgICAgICAvKiBjb250aW51ZSB0cnlpbmcgdW50aWwgd2UgZ2V0IHRoZSBsb2NrICovCiAKLQkJLyogbXV0IG11c3QgYmUgbG9ja2VkIGJ5IG1lIC0tIHBhcnQgb2YgdGhlIGNvbmRpdGlvbgotCQkgKiBwcm90b2NvbCAqLwotCQl3aGlsZSAoIHRoZWxvY2stPmxvY2tlZCApIHsKLQkJCXN0YXR1cyA9IHB0aHJlYWRfY29uZF93YWl0KCZ0aGVsb2NrLT5sb2NrX3JlbGVhc2VkLAotCQkJCQkJICAgJnRoZWxvY2stPm11dCk7Ci0JCQlDSEVDS19TVEFUVVMoInB0aHJlYWRfY29uZF93YWl0Iik7Ci0JCX0KLQkJc3VjY2VzcyA9IDE7Ci0JfQotCWlmIChzdWNjZXNzKSB0aGVsb2NrLT5sb2NrZWQgPSAxOwotCXN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGhlbG9jay0+bXV0ICk7Ci0JQ0hFQ0tfU1RBVFVTKCJwdGhyZWFkX211dGV4X3VubG9ja1sxXSIpOworICAgICAgICAvKiBtdXQgbXVzdCBiZSBsb2NrZWQgYnkgbWUgLS0gcGFydCBvZiB0aGUgY29uZGl0aW9uCisgICAgICAgICAqIHByb3RvY29sICovCisgICAgICAgIHdoaWxlICggdGhlbG9jay0+bG9ja2VkICkgeworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3dhaXQoJnRoZWxvY2stPmxvY2tfcmVsZWFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlbG9jay0+bXV0KTsKKyAgICAgICAgICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9jb25kX3dhaXQiKTsKKyAgICAgICAgfQorICAgICAgICBzdWNjZXNzID0gMTsKKyAgICB9CisgICAgaWYgKHN1Y2Nlc3MpIHRoZWxvY2stPmxvY2tlZCA9IDE7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICZ0aGVsb2NrLT5tdXQgKTsKKyAgICBDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfdW5sb2NrWzFdIik7CiAKLQlpZiAoZXJyb3IpIHN1Y2Nlc3MgPSAwOwotCWRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBpZiAoZXJyb3IpIHN1Y2Nlc3MgPSAwOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgbG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAotdm9pZCAKK3ZvaWQKIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlwdGhyZWFkX2xvY2sgKnRoZWxvY2sgPSAocHRocmVhZF9sb2NrICopbG9jazsKLQlpbnQgc3RhdHVzLCBlcnJvciA9IDA7CisgICAgcHRocmVhZF9sb2NrICp0aGVsb2NrID0gKHB0aHJlYWRfbG9jayAqKWxvY2s7CisgICAgaW50IHN0YXR1cywgZXJyb3IgPSAwOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7CiAKLQlzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aGVsb2NrLT5tdXQgKTsKLQlDSEVDS19TVEFUVVMoInB0aHJlYWRfbXV0ZXhfbG9ja1szXSIpOworICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfbG9jayggJnRoZWxvY2stPm11dCApOworICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF9sb2NrWzNdIik7CiAKLQl0aGVsb2NrLT5sb2NrZWQgPSAwOworICAgIHRoZWxvY2stPmxvY2tlZCA9IDA7CiAKLQlzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoZWxvY2stPm11dCApOwotCUNIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF91bmxvY2tbM10iKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoZWxvY2stPm11dCApOworICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9tdXRleF91bmxvY2tbM10iKTsKIAotCS8qIHdha2UgdXAgc29tZW9uZSAoYW55b25lLCBpZiBhbnkpIHdhaXRpbmcgb24gdGhlIGxvY2sgKi8KLQlzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCAmdGhlbG9jay0+bG9ja19yZWxlYXNlZCApOwotCUNIRUNLX1NUQVRVUygicHRocmVhZF9jb25kX3NpZ25hbCIpOworICAgIC8qIHdha2UgdXAgc29tZW9uZSAoYW55b25lLCBpZiBhbnkpIHdhaXRpbmcgb24gdGhlIGxvY2sgKi8KKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCAmdGhlbG9jay0+bG9ja19yZWxlYXNlZCApOworICAgIENIRUNLX1NUQVRVUygicHRocmVhZF9jb25kX3NpZ25hbCIpOwogfQogCiAjZW5kaWYgLyogVVNFX1NFTUFQSE9SRVMgKi8KQEAgLTQ5NSwzOSArNDk1LDM5IEBACiBfcHl0aHJlYWRfcHRocmVhZF9zZXRfc3RhY2tzaXplKHNpemVfdCBzaXplKQogewogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCi0JcHRocmVhZF9hdHRyX3QgYXR0cnM7Ci0Jc2l6ZV90IHRzc19taW47Ci0JaW50IHJjID0gMDsKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyczsKKyAgICBzaXplX3QgdHNzX21pbjsKKyAgICBpbnQgcmMgPSAwOwogI2VuZGlmCiAKLQkvKiBzZXQgdG8gZGVmYXVsdCAqLwotCWlmIChzaXplID09IDApIHsKLQkJX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IDA7Ci0JCXJldHVybiAwOwotCX0KKyAgICAvKiBzZXQgdG8gZGVmYXVsdCAqLworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCiAjaWYgZGVmaW5lZChQVEhSRUFEX1NUQUNLX01JTikKLQl0c3NfbWluID0gUFRIUkVBRF9TVEFDS19NSU4gPiBUSFJFQURfU1RBQ0tfTUlOID8gUFRIUkVBRF9TVEFDS19NSU4KLQkJCQkJCSAgICAgICA6IFRIUkVBRF9TVEFDS19NSU47CisgICAgdHNzX21pbiA9IFBUSFJFQURfU1RBQ0tfTUlOID4gVEhSRUFEX1NUQUNLX01JTiA/IFBUSFJFQURfU1RBQ0tfTUlOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRIUkVBRF9TVEFDS19NSU47CiAjZWxzZQotCXRzc19taW4gPSBUSFJFQURfU1RBQ0tfTUlOOworICAgIHRzc19taW4gPSBUSFJFQURfU1RBQ0tfTUlOOwogI2VuZGlmCi0JaWYgKHNpemUgPj0gdHNzX21pbikgewotCQkvKiB2YWxpZGF0ZSBzdGFjayBzaXplIGJ5IHNldHRpbmcgdGhyZWFkIGF0dHJpYnV0ZSAqLwotCQlpZiAocHRocmVhZF9hdHRyX2luaXQoJmF0dHJzKSA9PSAwKSB7Ci0JCQlyYyA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHJzLCBzaXplKTsKLQkJCXB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRycyk7Ci0JCQlpZiAocmMgPT0gMCkgewotCQkJCV9weXRocmVhZF9zdGFja3NpemUgPSBzaXplOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAtMTsKKyAgICBpZiAoc2l6ZSA+PSB0c3NfbWluKSB7CisgICAgICAgIC8qIHZhbGlkYXRlIHN0YWNrIHNpemUgYnkgc2V0dGluZyB0aHJlYWQgYXR0cmlidXRlICovCisgICAgICAgIGlmIChwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cnMpID09IDApIHsKKyAgICAgICAgICAgIHJjID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0cnMsIHNpemUpOworICAgICAgICAgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHJzKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOwogI2Vsc2UKLQlyZXR1cm4gLTI7CisgICAgcmV0dXJuIC0yOwogI2VuZGlmCiB9CiAKLSNkZWZpbmUgVEhSRUFEX1NFVF9TVEFDS1NJWkUoeCkJX3B5dGhyZWFkX3B0aHJlYWRfc2V0X3N0YWNrc2l6ZSh4KQorI2RlZmluZSBUSFJFQURfU0VUX1NUQUNLU0laRSh4KSBfcHl0aHJlYWRfcHRocmVhZF9zZXRfc3RhY2tzaXplKHgpCmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX3NnaS5oIGIvUHl0aG9uL3RocmVhZF9zZ2kuaAppbmRleCAyMzQ2NjU4Li42NzlkMTEzIDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX3NnaS5oCisrKyBiL1B5dGhvbi90aHJlYWRfc2dpLmgKQEAgLTgsMjUgKzgsMjUgQEAKICNpbmNsdWRlIDx1bG9ja3MuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogCi0jZGVmaW5lIEhEUl9TSVpFCTI2ODAJLyogc2l6ZW9mKHVzaGRyX3QpICovCi0jZGVmaW5lIE1BWFBST0MJCTEwMAkvKiBtYXggIyBvZiB0aHJlYWRzIHRoYXQgY2FuIGJlIHN0YXJ0ZWQgKi8KKyNkZWZpbmUgSERSX1NJWkUgICAgICAgIDI2ODAgICAgLyogc2l6ZW9mKHVzaGRyX3QpICovCisjZGVmaW5lIE1BWFBST0MgICAgICAgICAxMDAgICAgIC8qIG1heCAjIG9mIHRocmVhZHMgdGhhdCBjYW4gYmUgc3RhcnRlZCAqLwogCiBzdGF0aWMgdXNwdHJfdCAqc2hhcmVkX2FyZW5hOwotc3RhdGljIHVsb2NrX3QgY291bnRfbG9jazsJLyogcHJvdGVjdGlvbiBmb3Igc29tZSB2YXJpYWJsZXMgKi8KLXN0YXRpYyB1bG9ja190IHdhaXRfbG9jazsJLyogbG9jayB1c2VkIHRvIHdhaXQgZm9yIG90aGVyIHRocmVhZHMgKi8KLXN0YXRpYyBpbnQgd2FpdGluZ19mb3JfdGhyZWFkczsJLyogcHJvdGVjdGVkIGJ5IGNvdW50X2xvY2sgKi8KLXN0YXRpYyBpbnQgbnRocmVhZHM7CQkvKiBwcm90ZWN0ZWQgYnkgY291bnRfbG9jayAqLworc3RhdGljIHVsb2NrX3QgY291bnRfbG9jazsgICAgICAvKiBwcm90ZWN0aW9uIGZvciBzb21lIHZhcmlhYmxlcyAqLworc3RhdGljIHVsb2NrX3Qgd2FpdF9sb2NrOyAgICAgICAvKiBsb2NrIHVzZWQgdG8gd2FpdCBmb3Igb3RoZXIgdGhyZWFkcyAqLworc3RhdGljIGludCB3YWl0aW5nX2Zvcl90aHJlYWRzOyAvKiBwcm90ZWN0ZWQgYnkgY291bnRfbG9jayAqLworc3RhdGljIGludCBudGhyZWFkczsgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgYnkgY291bnRfbG9jayAqLwogc3RhdGljIGludCBleGl0X3N0YXR1czsKICNpZm5kZWYgTk9fRVhJVF9QUk9HCi1zdGF0aWMgaW50IGRvX2V4aXQ7CQkvKiBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvZ3JhbSBpcyB0byBleGl0ICovCitzdGF0aWMgaW50IGRvX2V4aXQ7ICAgICAgICAgICAgIC8qIGluZGljYXRlcyB0aGF0IHRoZSBwcm9ncmFtIGlzIHRvIGV4aXQgKi8KICNlbmRpZgotc3RhdGljIGludCBleGl0aW5nOwkJLyogd2UncmUgYWxyZWFkeSBleGl0aW5nIChmb3IgbWF5YmVfZXhpdCkgKi8KLXN0YXRpYyBwaWRfdCBteV9waWQ7CQkvKiBQSUQgb2YgbWFpbiB0aHJlYWQgKi8KK3N0YXRpYyBpbnQgZXhpdGluZzsgICAgICAgICAgICAgLyogd2UncmUgYWxyZWFkeSBleGl0aW5nIChmb3IgbWF5YmVfZXhpdCkgKi8KK3N0YXRpYyBwaWRfdCBteV9waWQ7ICAgICAgICAgICAgLyogUElEIG9mIG1haW4gdGhyZWFkICovCiBzdGF0aWMgc3RydWN0IHBpZGxpc3QgewotCXBpZF90IHBhcmVudDsKLQlwaWRfdCBjaGlsZDsKLX0gcGlkbGlzdFtNQVhQUk9DXTsJLyogUElEcyBvZiBvdGhlciB0aHJlYWRzOyBwcm90ZWN0ZWQgYnkgY291bnRfbG9jayAqLwotc3RhdGljIGludCBtYXhwaWRpbmRleDsJCS8qICMgb2YgUElEcyBpbiBwaWRsaXN0ICovCisgICAgcGlkX3QgcGFyZW50OworICAgIHBpZF90IGNoaWxkOworfSBwaWRsaXN0W01BWFBST0NdOyAgICAgLyogUElEcyBvZiBvdGhlciB0aHJlYWRzOyBwcm90ZWN0ZWQgYnkgY291bnRfbG9jayAqLworc3RhdGljIGludCBtYXhwaWRpbmRleDsgICAgICAgICAvKiAjIG9mIFBJRHMgaW4gcGlkbGlzdCAqLwogCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwogLyoKQEAgLTM2LDE5ICszNiwxOSBAQAogICovCiBzdGF0aWMgdm9pZCBleGl0X3NpZyh2b2lkKQogewotCWQycHJpbnRmKCgiZXhpdF9zaWcgY2FsbGVkXG4iKSk7Ci0JaWYgKGV4aXRpbmcgJiYgZ2V0cGlkKCkgPT0gbXlfcGlkKSB7Ci0JCWQycHJpbnRmKCgiYWxyZWFkeSBleGl0aW5nXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRvX2V4aXQpIHsKLQkJZDJwcmludGYoKCJleGl0aW5nIGluIGV4aXRfc2lnXG4iKSk7CisgICAgZDJwcmludGYoKCJleGl0X3NpZyBjYWxsZWRcbiIpKTsKKyAgICBpZiAoZXhpdGluZyAmJiBnZXRwaWQoKSA9PSBteV9waWQpIHsKKyAgICAgICAgZDJwcmludGYoKCJhbHJlYWR5IGV4aXRpbmdcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZG9fZXhpdCkgeworICAgICAgICBkMnByaW50ZigoImV4aXRpbmcgaW4gZXhpdF9zaWdcbiIpKTsKICNpZmRlZiBQeV9ERUJVRwotCQlpZiAoKHRocmVhZF9kZWJ1ZyAmIDgpID09IDApCi0JCQl0aHJlYWRfZGVidWcgJj0gfjE7IC8qIGRvbid0IHByb2R1Y2UgZGVidWcgbWVzc2FnZXMgKi8KKyAgICAgICAgaWYgKCh0aHJlYWRfZGVidWcgJiA4KSA9PSAwKQorICAgICAgICAgICAgdGhyZWFkX2RlYnVnICY9IH4xOyAvKiBkb24ndCBwcm9kdWNlIGRlYnVnIG1lc3NhZ2VzICovCiAjZW5kaWYKLQkJUHlUaHJlYWRfZXhpdF90aHJlYWQoKTsKLQl9CisgICAgICAgIFB5VGhyZWFkX2V4aXRfdGhyZWFkKCk7CisgICAgfQogfQogCiAvKgpAQCAtNTcsMTIgKzU3LDEyIEBACiAgKi8KIHN0YXRpYyB2b2lkIG1heWJlX2V4aXQodm9pZCkKIHsKLQlkcHJpbnRmKCgibWF5YmVfZXhpdCBjYWxsZWRcbiIpKTsKLQlpZiAoZXhpdGluZykgewotCQlkcHJpbnRmKCgiYWxyZWFkeSBleGl0aW5nXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JUHlUaHJlYWRfZXhpdF9wcm9nKDApOworICAgIGRwcmludGYoKCJtYXliZV9leGl0IGNhbGxlZFxuIikpOworICAgIGlmIChleGl0aW5nKSB7CisgICAgICAgIGRwcmludGYoKCJhbHJlYWR5IGV4aXRpbmdcbiIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQeVRocmVhZF9leGl0X3Byb2coMCk7CiB9CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCiAKQEAgLTcyLDU4ICs3Miw1OCBAQAogc3RhdGljIHZvaWQgUHlUaHJlYWRfX2luaXRfdGhyZWFkKHZvaWQpCiB7CiAjaWZuZGVmIE5PX0VYSVRfUFJPRwotCXN0cnVjdCBzaWdhY3Rpb24gczsKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHM7CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCiAjaWZkZWYgVVNFX0RMCi0JbG9uZyBhZGRyLCBzaXplOworICAgIGxvbmcgYWRkciwgc2l6ZTsKICNlbmRpZiAvKiBVU0VfREwgKi8KIAogCiAjaWZkZWYgVVNFX0RMCi0JaWYgKChzaXplID0gdXNjb25maWcoQ09ORl9JTklUU0laRSwgNjQqMTAyNCkpIDwgMCkKLQkJcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFNJWkUgKGNoZWNrKSIpOwotCWlmICh1c2NvbmZpZyhDT05GX0lOSVRTSVpFLCBzaXplKSA8IDApCi0JCXBlcnJvcigidXNjb25maWcgLSBDT05GX0lOSVRTSVpFIChyZXNldCkiKTsKLQlhZGRyID0gKGxvbmcpIGRsX2dldHJhbmdlKHNpemUgKyBIRFJfU0laRSk7Ci0JZHByaW50ZigoInRyeWluZyB0byB1c2UgYWRkciAlcC0lcCBmb3Igc2hhcmVkIGFyZW5hXG4iLCBhZGRyLCBhZGRyK3NpemUpKTsKLQllcnJubyA9IDA7Ci0JaWYgKChhZGRyID0gdXNjb25maWcoQ09ORl9BVFRBQ0hBRERSLCBhZGRyKSkgPCAwICYmIGVycm5vICE9IDApCi0JCXBlcnJvcigidXNjb25maWcgLSBDT05GX0FUVEFDSEFERFIgKHNldCkiKTsKKyAgICBpZiAoKHNpemUgPSB1c2NvbmZpZyhDT05GX0lOSVRTSVpFLCA2NCoxMDI0KSkgPCAwKQorICAgICAgICBwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9JTklUU0laRSAoY2hlY2spIik7CisgICAgaWYgKHVzY29uZmlnKENPTkZfSU5JVFNJWkUsIHNpemUpIDwgMCkKKyAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFNJWkUgKHJlc2V0KSIpOworICAgIGFkZHIgPSAobG9uZykgZGxfZ2V0cmFuZ2Uoc2l6ZSArIEhEUl9TSVpFKTsKKyAgICBkcHJpbnRmKCgidHJ5aW5nIHRvIHVzZSBhZGRyICVwLSVwIGZvciBzaGFyZWQgYXJlbmFcbiIsIGFkZHIsIGFkZHIrc2l6ZSkpOworICAgIGVycm5vID0gMDsKKyAgICBpZiAoKGFkZHIgPSB1c2NvbmZpZyhDT05GX0FUVEFDSEFERFIsIGFkZHIpKSA8IDAgJiYgZXJybm8gIT0gMCkKKyAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfQVRUQUNIQUREUiAoc2V0KSIpOwogI2VuZGlmIC8qIFVTRV9ETCAqLwotCWlmICh1c2NvbmZpZyhDT05GX0lOSVRVU0VSUywgMTYpIDwgMCkKLQkJcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFVTRVJTIik7Ci0JbXlfcGlkID0gZ2V0cGlkKCk7CS8qIHNvIHRoYXQgd2Uga25vdyB3aGljaCBpcyB0aGUgbWFpbiB0aHJlYWQgKi8KKyAgICBpZiAodXNjb25maWcoQ09ORl9JTklUVVNFUlMsIDE2KSA8IDApCisgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0lOSVRVU0VSUyIpOworICAgIG15X3BpZCA9IGdldHBpZCgpOyAgICAgICAgICAvKiBzbyB0aGF0IHdlIGtub3cgd2hpY2ggaXMgdGhlIG1haW4gdGhyZWFkICovCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwotCWF0ZXhpdChtYXliZV9leGl0KTsKLQlzLnNhX2hhbmRsZXIgPSBleGl0X3NpZzsKLQlzaWdlbXB0eXNldCgmcy5zYV9tYXNrKTsKLQkvKnNpZ2FkZHNldCgmcy5zYV9tYXNrLCBTSUdVU1IxKTsqLwotCXMuc2FfZmxhZ3MgPSAwOwotCXNpZ2FjdGlvbihTSUdVU1IxLCAmcywgMCk7Ci0JaWYgKHByY3RsKFBSX1NFVEVYSVRTSUcsIFNJR1VTUjEpIDwgMCkKLQkJcGVycm9yKCJwcmN0bCAtIFBSX1NFVEVYSVRTSUciKTsKKyAgICBhdGV4aXQobWF5YmVfZXhpdCk7CisgICAgcy5zYV9oYW5kbGVyID0gZXhpdF9zaWc7CisgICAgc2lnZW1wdHlzZXQoJnMuc2FfbWFzayk7CisgICAgLypzaWdhZGRzZXQoJnMuc2FfbWFzaywgU0lHVVNSMSk7Ki8KKyAgICBzLnNhX2ZsYWdzID0gMDsKKyAgICBzaWdhY3Rpb24oU0lHVVNSMSwgJnMsIDApOworICAgIGlmIChwcmN0bChQUl9TRVRFWElUU0lHLCBTSUdVU1IxKSA8IDApCisgICAgICAgIHBlcnJvcigicHJjdGwgLSBQUl9TRVRFWElUU0lHIik7CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCi0JaWYgKHVzY29uZmlnKENPTkZfQVJFTkFUWVBFLCBVU19TSEFSRURPTkxZKSA8IDApCi0JCXBlcnJvcigidXNjb25maWcgLSBDT05GX0FSRU5BVFlQRSIpOwotCXVzY29uZmlnKENPTkZfTE9DS1RZUEUsIFVTX0RFQlVHKTsgLyogWFhYICovCisgICAgaWYgKHVzY29uZmlnKENPTkZfQVJFTkFUWVBFLCBVU19TSEFSRURPTkxZKSA8IDApCisgICAgICAgIHBlcnJvcigidXNjb25maWcgLSBDT05GX0FSRU5BVFlQRSIpOworICAgIHVzY29uZmlnKENPTkZfTE9DS1RZUEUsIFVTX0RFQlVHKTsgLyogWFhYICovCiAjaWZkZWYgUHlfREVCVUcKLQlpZiAodGhyZWFkX2RlYnVnICYgNCkKLQkJdXNjb25maWcoQ09ORl9MT0NLVFlQRSwgVVNfREVCVUdQTFVTKTsKLQllbHNlIGlmICh0aHJlYWRfZGVidWcgJiAyKQotCQl1c2NvbmZpZyhDT05GX0xPQ0tUWVBFLCBVU19ERUJVRyk7CisgICAgaWYgKHRocmVhZF9kZWJ1ZyAmIDQpCisgICAgICAgIHVzY29uZmlnKENPTkZfTE9DS1RZUEUsIFVTX0RFQlVHUExVUyk7CisgICAgZWxzZSBpZiAodGhyZWFkX2RlYnVnICYgMikKKyAgICAgICAgdXNjb25maWcoQ09ORl9MT0NLVFlQRSwgVVNfREVCVUcpOwogI2VuZGlmIC8qIFB5X0RFQlVHICovCi0JaWYgKChzaGFyZWRfYXJlbmEgPSB1c2luaXQodG1wbmFtKDApKSkgPT0gMCkKLQkJcGVycm9yKCJ1c2luaXQiKTsKKyAgICBpZiAoKHNoYXJlZF9hcmVuYSA9IHVzaW5pdCh0bXBuYW0oMCkpKSA9PSAwKQorICAgICAgICBwZXJyb3IoInVzaW5pdCIpOwogI2lmZGVmIFVTRV9ETAotCWlmICh1c2NvbmZpZyhDT05GX0FUVEFDSEFERFIsIGFkZHIpIDwgMCkgLyogcmVzZXQgYWRkcmVzcyAqLwotCQlwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9BVFRBQ0hBRERSIChyZXNldCkiKTsKKyAgICBpZiAodXNjb25maWcoQ09ORl9BVFRBQ0hBRERSLCBhZGRyKSA8IDApIC8qIHJlc2V0IGFkZHJlc3MgKi8KKyAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfQVRUQUNIQUREUiAocmVzZXQpIik7CiAjZW5kaWYgLyogVVNFX0RMICovCi0JaWYgKChjb3VudF9sb2NrID0gdXNuZXdsb2NrKHNoYXJlZF9hcmVuYSkpID09IE5VTEwpCi0JCXBlcnJvcigidXNuZXdsb2NrIChjb3VudF9sb2NrKSIpOwotCSh2b2lkKSB1c2luaXRsb2NrKGNvdW50X2xvY2spOwotCWlmICgod2FpdF9sb2NrID0gdXNuZXdsb2NrKHNoYXJlZF9hcmVuYSkpID09IE5VTEwpCi0JCXBlcnJvcigidXNuZXdsb2NrICh3YWl0X2xvY2spIik7Ci0JZHByaW50ZigoImFyZW5hIHN0YXJ0OiAlcCwgYXJlbmEgc2l6ZTogJWxkXG4iLCAgc2hhcmVkX2FyZW5hLCAobG9uZykgdXNjb25maWcoQ09ORl9HRVRTSVpFLCBzaGFyZWRfYXJlbmEpKSk7CisgICAgaWYgKChjb3VudF9sb2NrID0gdXNuZXdsb2NrKHNoYXJlZF9hcmVuYSkpID09IE5VTEwpCisgICAgICAgIHBlcnJvcigidXNuZXdsb2NrIChjb3VudF9sb2NrKSIpOworICAgICh2b2lkKSB1c2luaXRsb2NrKGNvdW50X2xvY2spOworICAgIGlmICgod2FpdF9sb2NrID0gdXNuZXdsb2NrKHNoYXJlZF9hcmVuYSkpID09IE5VTEwpCisgICAgICAgIHBlcnJvcigidXNuZXdsb2NrICh3YWl0X2xvY2spIik7CisgICAgZHByaW50ZigoImFyZW5hIHN0YXJ0OiAlcCwgYXJlbmEgc2l6ZTogJWxkXG4iLCAgc2hhcmVkX2FyZW5hLCAobG9uZykgdXNjb25maWcoQ09ORl9HRVRTSVpFLCBzaGFyZWRfYXJlbmEpKSk7CiB9CiAKIC8qCkBAIC0xMzIsMTk4ICsxMzIsMTk4IEBACiAKIHN0YXRpYyB2b2lkIGNsZWFuX3RocmVhZHModm9pZCkKIHsKLQlpbnQgaSwgajsKLQlwaWRfdCBteXBpZCwgcGlkOworICAgIGludCBpLCBqOworICAgIHBpZF90IG15cGlkLCBwaWQ7CiAKLQkvKiBjbGVhbiB1cCBhbnkgZXhpdGVkIHRocmVhZHMgKi8KLQlteXBpZCA9IGdldHBpZCgpOwotCWkgPSAwOwotCXdoaWxlIChpIDwgbWF4cGlkaW5kZXgpIHsKLQkJaWYgKHBpZGxpc3RbaV0ucGFyZW50ID09IG15cGlkICYmIChwaWQgPSBwaWRsaXN0W2ldLmNoaWxkKSA+IDApIHsKLQkJCXBpZCA9IHdhaXRwaWQocGlkLCAwLCBXTk9IQU5HKTsKLQkJCWlmIChwaWQgPiAwKSB7Ci0JCQkJLyogYSB0aHJlYWQgaGFzIGV4aXRlZCAqLwotCQkJCXBpZGxpc3RbaV0gPSBwaWRsaXN0Wy0tbWF4cGlkaW5kZXhdOwotCQkJCS8qIHJlbW92ZSByZWZlcmVuY2VzIHRvIGNoaWxkcmVuIG9mIGRlYWQgcHJvYyAqLwotCQkJCWZvciAoaiA9IDA7IGogPCBtYXhwaWRpbmRleDsgaisrKQotCQkJCQlpZiAocGlkbGlzdFtqXS5wYXJlbnQgPT0gcGlkKQotCQkJCQkJcGlkbGlzdFtqXS5jaGlsZCA9IC0xOwotCQkJCWNvbnRpbnVlOyAvKiBkb24ndCBpbmNyZW1lbnQgaSAqLwotCQkJfQotCQl9Ci0JCWkrKzsKLQl9Ci0JLyogY2xlYW4gdXAgdGhlIGxpc3QgKi8KLQlpID0gMDsKLQl3aGlsZSAoaSA8IG1heHBpZGluZGV4KSB7Ci0JCWlmIChwaWRsaXN0W2ldLmNoaWxkID09IC0xKSB7Ci0JCQlwaWRsaXN0W2ldID0gcGlkbGlzdFstLW1heHBpZGluZGV4XTsKLQkJCWNvbnRpbnVlOyAvKiBkb24ndCBpbmNyZW1lbnQgaSAqLwotCQl9Ci0JCWkrKzsKLQl9CisgICAgLyogY2xlYW4gdXAgYW55IGV4aXRlZCB0aHJlYWRzICovCisgICAgbXlwaWQgPSBnZXRwaWQoKTsKKyAgICBpID0gMDsKKyAgICB3aGlsZSAoaSA8IG1heHBpZGluZGV4KSB7CisgICAgICAgIGlmIChwaWRsaXN0W2ldLnBhcmVudCA9PSBteXBpZCAmJiAocGlkID0gcGlkbGlzdFtpXS5jaGlsZCkgPiAwKSB7CisgICAgICAgICAgICBwaWQgPSB3YWl0cGlkKHBpZCwgMCwgV05PSEFORyk7CisgICAgICAgICAgICBpZiAocGlkID4gMCkgeworICAgICAgICAgICAgICAgIC8qIGEgdGhyZWFkIGhhcyBleGl0ZWQgKi8KKyAgICAgICAgICAgICAgICBwaWRsaXN0W2ldID0gcGlkbGlzdFstLW1heHBpZGluZGV4XTsKKyAgICAgICAgICAgICAgICAvKiByZW1vdmUgcmVmZXJlbmNlcyB0byBjaGlsZHJlbiBvZiBkZWFkIHByb2MgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWF4cGlkaW5kZXg7IGorKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpZGxpc3Rbal0ucGFyZW50ID09IHBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpZGxpc3Rbal0uY2hpbGQgPSAtMTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogZG9uJ3QgaW5jcmVtZW50IGkgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQorICAgIC8qIGNsZWFuIHVwIHRoZSBsaXN0ICovCisgICAgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBtYXhwaWRpbmRleCkgeworICAgICAgICBpZiAocGlkbGlzdFtpXS5jaGlsZCA9PSAtMSkgeworICAgICAgICAgICAgcGlkbGlzdFtpXSA9IHBpZGxpc3RbLS1tYXhwaWRpbmRleF07CisgICAgICAgICAgICBjb250aW51ZTsgLyogZG9uJ3QgaW5jcmVtZW50IGkgKi8KKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgfQogfQogCiBsb25nIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKICNpZmRlZiBVU0VfREwKLQlsb25nIGFkZHIsIHNpemU7Ci0Jc3RhdGljIGludCBsb2NhbF9pbml0aWFsaXplZCA9IDA7CisgICAgbG9uZyBhZGRyLCBzaXplOworICAgIHN0YXRpYyBpbnQgbG9jYWxfaW5pdGlhbGl6ZWQgPSAwOwogI2VuZGlmIC8qIFVTRV9ETCAqLwotCWludCBzdWNjZXNzID0gMDsJLyogaW5pdCBub3QgbmVlZGVkIHdoZW4gU09MQVJJU19USFJFQURTIGFuZCAqLwotCQkJCS8qIENfVEhSRUFEUyBpbXBsZW1lbnRlZCBwcm9wZXJseSAqLworICAgIGludCBzdWNjZXNzID0gMDsgICAgICAgICAgICAvKiBpbml0IG5vdCBuZWVkZWQgd2hlbiBTT0xBUklTX1RIUkVBRFMgYW5kICovCisgICAgICAgICAgICAgICAgLyogQ19USFJFQURTIGltcGxlbWVudGVkIHByb3Blcmx5ICovCiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCXN3aXRjaCAodXNzZXRsb2NrKGNvdW50X2xvY2spKSB7Ci0JY2FzZSAwOiByZXR1cm4gMDsKLQljYXNlIC0xOiBwZXJyb3IoInVzc2V0bG9jayAoY291bnRfbG9jaykiKTsKLQl9Ci0JaWYgKG1heHBpZGluZGV4ID49IE1BWFBST0MpCi0JCXN1Y2Nlc3MgPSAtMTsKLQllbHNlIHsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOworICAgIHN3aXRjaCAodXNzZXRsb2NrKGNvdW50X2xvY2spKSB7CisgICAgY2FzZSAwOiByZXR1cm4gMDsKKyAgICBjYXNlIC0xOiBwZXJyb3IoInVzc2V0bG9jayAoY291bnRfbG9jaykiKTsKKyAgICB9CisgICAgaWYgKG1heHBpZGluZGV4ID49IE1BWFBST0MpCisgICAgICAgIHN1Y2Nlc3MgPSAtMTsKKyAgICBlbHNlIHsKICNpZmRlZiBVU0VfREwKLQkJaWYgKCFsb2NhbF9pbml0aWFsaXplZCkgewotCQkJaWYgKChzaXplID0gdXNjb25maWcoQ09ORl9JTklUU0laRSwgNjQqMTAyNCkpIDwgMCkKLQkJCQlwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9JTklUU0laRSAoY2hlY2spIik7Ci0JCQlpZiAodXNjb25maWcoQ09ORl9JTklUU0laRSwgc2l6ZSkgPCAwKQotCQkJCXBlcnJvcigidXNjb25maWcgLSBDT05GX0lOSVRTSVpFIChyZXNldCkiKTsKLQkJCWFkZHIgPSAobG9uZykgZGxfZ2V0cmFuZ2Uoc2l6ZSArIEhEUl9TSVpFKTsKLQkJCWRwcmludGYoKCJ0cnlpbmcgdG8gdXNlIGFkZHIgJXAtJXAgZm9yIHNwcm9jXG4iLAotCQkJCSBhZGRyLCBhZGRyK3NpemUpKTsKLQkJCWVycm5vID0gMDsKLQkJCWlmICgoYWRkciA9IHVzY29uZmlnKENPTkZfQVRUQUNIQUREUiwgYWRkcikpIDwgMCAmJgotCQkJICAgIGVycm5vICE9IDApCi0JCQkJcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfQVRUQUNIQUREUiAoc2V0KSIpOwotCQl9CisgICAgICAgIGlmICghbG9jYWxfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGlmICgoc2l6ZSA9IHVzY29uZmlnKENPTkZfSU5JVFNJWkUsIDY0KjEwMjQpKSA8IDApCisgICAgICAgICAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfSU5JVFNJWkUgKGNoZWNrKSIpOworICAgICAgICAgICAgaWYgKHVzY29uZmlnKENPTkZfSU5JVFNJWkUsIHNpemUpIDwgMCkKKyAgICAgICAgICAgICAgICBwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9JTklUU0laRSAocmVzZXQpIik7CisgICAgICAgICAgICBhZGRyID0gKGxvbmcpIGRsX2dldHJhbmdlKHNpemUgKyBIRFJfU0laRSk7CisgICAgICAgICAgICBkcHJpbnRmKCgidHJ5aW5nIHRvIHVzZSBhZGRyICVwLSVwIGZvciBzcHJvY1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIGFkZHIsIGFkZHIrc2l6ZSkpOworICAgICAgICAgICAgZXJybm8gPSAwOworICAgICAgICAgICAgaWYgKChhZGRyID0gdXNjb25maWcoQ09ORl9BVFRBQ0hBRERSLCBhZGRyKSkgPCAwICYmCisgICAgICAgICAgICAgICAgZXJybm8gIT0gMCkKKyAgICAgICAgICAgICAgICBwZXJyb3IoInVzY29uZmlnIC0gQ09ORl9BVFRBQ0hBRERSIChzZXQpIik7CisgICAgICAgIH0KICNlbmRpZiAvKiBVU0VfREwgKi8KLQkJY2xlYW5fdGhyZWFkcygpOwotCQlpZiAoKHN1Y2Nlc3MgPSBzcHJvYyhmdW5jLCBQUl9TQUxMLCBhcmcpKSA8IDApCi0JCQlwZXJyb3IoInNwcm9jIik7CisgICAgICAgIGNsZWFuX3RocmVhZHMoKTsKKyAgICAgICAgaWYgKChzdWNjZXNzID0gc3Byb2MoZnVuYywgUFJfU0FMTCwgYXJnKSkgPCAwKQorICAgICAgICAgICAgcGVycm9yKCJzcHJvYyIpOwogI2lmZGVmIFVTRV9ETAotCQlpZiAoIWxvY2FsX2luaXRpYWxpemVkKSB7Ci0JCQlpZiAodXNjb25maWcoQ09ORl9BVFRBQ0hBRERSLCBhZGRyKSA8IDApCi0JCQkJLyogcmVzZXQgYWRkcmVzcyAqLwotCQkJCXBlcnJvcigidXNjb25maWcgLSBDT05GX0FUVEFDSEFERFIgKHJlc2V0KSIpOwotCQkJbG9jYWxfaW5pdGlhbGl6ZWQgPSAxOwotCQl9CisgICAgICAgIGlmICghbG9jYWxfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIGlmICh1c2NvbmZpZyhDT05GX0FUVEFDSEFERFIsIGFkZHIpIDwgMCkKKyAgICAgICAgICAgICAgICAvKiByZXNldCBhZGRyZXNzICovCisgICAgICAgICAgICAgICAgcGVycm9yKCJ1c2NvbmZpZyAtIENPTkZfQVRUQUNIQUREUiAocmVzZXQpIik7CisgICAgICAgICAgICBsb2NhbF9pbml0aWFsaXplZCA9IDE7CisgICAgICAgIH0KICNlbmRpZiAvKiBVU0VfREwgKi8KLQkJaWYgKHN1Y2Nlc3MgPj0gMCkgewotCQkJbnRocmVhZHMrKzsKLQkJCXBpZGxpc3RbbWF4cGlkaW5kZXhdLnBhcmVudCA9IGdldHBpZCgpOwotCQkJcGlkbGlzdFttYXhwaWRpbmRleCsrXS5jaGlsZCA9IHN1Y2Nlc3M7Ci0JCQlkcHJpbnRmKCgicGlkbGlzdFslZF0gPSAlZFxuIiwKLQkJCQkgbWF4cGlkaW5kZXgtMSwgc3VjY2VzcykpOwotCQl9Ci0JfQotCWlmICh1c3Vuc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCi0JCXBlcnJvcigidXN1bnNldGxvY2sgKGNvdW50X2xvY2spIik7Ci0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgICAgIGlmIChzdWNjZXNzID49IDApIHsKKyAgICAgICAgICAgIG50aHJlYWRzKys7CisgICAgICAgICAgICBwaWRsaXN0W21heHBpZGluZGV4XS5wYXJlbnQgPSBnZXRwaWQoKTsKKyAgICAgICAgICAgIHBpZGxpc3RbbWF4cGlkaW5kZXgrK10uY2hpbGQgPSBzdWNjZXNzOworICAgICAgICAgICAgZHByaW50ZigoInBpZGxpc3RbJWRdID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICBtYXhwaWRpbmRleC0xLCBzdWNjZXNzKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHVzdW5zZXRsb2NrKGNvdW50X2xvY2spIDwgMCkKKyAgICAgICAgcGVycm9yKCJ1c3Vuc2V0bG9jayAoY291bnRfbG9jaykiKTsKKyAgICByZXR1cm4gc3VjY2VzczsKIH0KIAogbG9uZyBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpCiB7Ci0JcmV0dXJuIGdldHBpZCgpOworICAgIHJldHVybiBnZXRwaWQoKTsKIH0KIAogc3RhdGljIHZvaWQgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoMCk7Ci0JCWVsc2UKLQkJCWV4aXQoMCk7Ci0JaWYgKHVzc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCi0JCXBlcnJvcigidXNzZXRsb2NrIChjb3VudF9sb2NrKSIpOwotCW50aHJlYWRzLS07Ci0JaWYgKGdldHBpZCgpID09IG15X3BpZCkgewotCQkvKiBtYWluIHRocmVhZDsgd2FpdCBmb3Igb3RoZXIgdGhyZWFkcyB0byBleGl0ICovCi0JCWV4aXRpbmcgPSAxOworICAgIGRwcmludGYoKCJQeVRocmVhZF9leGl0X3RocmVhZCBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBpZiAobm9fY2xlYW51cCkKKyAgICAgICAgICAgIF9leGl0KDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBleGl0KDApOworICAgIGlmICh1c3NldGxvY2soY291bnRfbG9jaykgPCAwKQorICAgICAgICBwZXJyb3IoInVzc2V0bG9jayAoY291bnRfbG9jaykiKTsKKyAgICBudGhyZWFkcy0tOworICAgIGlmIChnZXRwaWQoKSA9PSBteV9waWQpIHsKKyAgICAgICAgLyogbWFpbiB0aHJlYWQ7IHdhaXQgZm9yIG90aGVyIHRocmVhZHMgdG8gZXhpdCAqLworICAgICAgICBleGl0aW5nID0gMTsKICNpZm5kZWYgTk9fRVhJVF9QUk9HCi0JCWlmIChkb19leGl0KSB7Ci0JCQlpbnQgaTsKKyAgICAgICAgaWYgKGRvX2V4aXQpIHsKKyAgICAgICAgICAgIGludCBpOwogCi0JCQkvKiBub3RpZnkgb3RoZXIgdGhyZWFkcyAqLwotCQkJY2xlYW5fdGhyZWFkcygpOwotCQkJaWYgKG50aHJlYWRzID49IDApIHsKLQkJCQlkcHJpbnRmKCgia2lsbCBvdGhlciB0aHJlYWRzXG4iKSk7Ci0JCQkJZm9yIChpID0gMDsgaSA8IG1heHBpZGluZGV4OyBpKyspCi0JCQkJCWlmIChwaWRsaXN0W2ldLmNoaWxkID4gMCkKLQkJCQkJCSh2b2lkKSBraWxsKHBpZGxpc3RbaV0uY2hpbGQsCi0JCQkJCQkJICAgIFNJR0tJTEwpOwotCQkJCV9leGl0KGV4aXRfc3RhdHVzKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgLyogbm90aWZ5IG90aGVyIHRocmVhZHMgKi8KKyAgICAgICAgICAgIGNsZWFuX3RocmVhZHMoKTsKKyAgICAgICAgICAgIGlmIChudGhyZWFkcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgZHByaW50ZigoImtpbGwgb3RoZXIgdGhyZWFkc1xuIikpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtYXhwaWRpbmRleDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAocGlkbGlzdFtpXS5jaGlsZCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkga2lsbChwaWRsaXN0W2ldLmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lHS0lMTCk7CisgICAgICAgICAgICAgICAgX2V4aXQoZXhpdF9zdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCi0JCXdhaXRpbmdfZm9yX3RocmVhZHMgPSAxOwotCQlpZiAodXNzZXRsb2NrKHdhaXRfbG9jaykgPCAwKQotCQkJcGVycm9yKCJ1c3NldGxvY2sgKHdhaXRfbG9jaykiKTsKLQkJZm9yICg7OykgewotCQkJaWYgKG50aHJlYWRzIDwgMCkgewotCQkJCWRwcmludGYoKCJyZWFsbHkgZXhpdCAoJWQpXG4iLCBleGl0X3N0YXR1cykpOwotCQkJCWlmIChub19jbGVhbnVwKQotCQkJCQlfZXhpdChleGl0X3N0YXR1cyk7Ci0JCQkJZWxzZQotCQkJCQlleGl0KGV4aXRfc3RhdHVzKTsKLQkJCX0KLQkJCWlmICh1c3Vuc2V0bG9jayhjb3VudF9sb2NrKSA8IDApCi0JCQkJcGVycm9yKCJ1c3Vuc2V0bG9jayAoY291bnRfbG9jaykiKTsKLQkJCWRwcmludGYoKCJ3YWl0aW5nIGZvciBvdGhlciB0aHJlYWRzICglZClcbiIsIG50aHJlYWRzKSk7Ci0JCQlpZiAodXNzZXRsb2NrKHdhaXRfbG9jaykgPCAwKQotCQkJCXBlcnJvcigidXNzZXRsb2NrICh3YWl0X2xvY2spIik7Ci0JCQlpZiAodXNzZXRsb2NrKGNvdW50X2xvY2spIDwgMCkKLQkJCQlwZXJyb3IoInVzc2V0bG9jayAoY291bnRfbG9jaykiKTsKLQkJfQotCX0KLQkvKiBub3QgdGhlIG1haW4gdGhyZWFkICovCi0JaWYgKHdhaXRpbmdfZm9yX3RocmVhZHMpIHsKLQkJZHByaW50ZigoIm1haW4gdGhyZWFkIGlzIHdhaXRpbmdcbiIpKTsKLQkJaWYgKHVzdW5zZXRsb2NrKHdhaXRfbG9jaykgPCAwKQotCQkJcGVycm9yKCJ1c3Vuc2V0bG9jayAod2FpdF9sb2NrKSIpOwotCX0KKyAgICAgICAgd2FpdGluZ19mb3JfdGhyZWFkcyA9IDE7CisgICAgICAgIGlmICh1c3NldGxvY2sod2FpdF9sb2NrKSA8IDApCisgICAgICAgICAgICBwZXJyb3IoInVzc2V0bG9jayAod2FpdF9sb2NrKSIpOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBpZiAobnRocmVhZHMgPCAwKSB7CisgICAgICAgICAgICAgICAgZHByaW50ZigoInJlYWxseSBleGl0ICglZClcbiIsIGV4aXRfc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICAgICAgICAgIF9leGl0KGV4aXRfc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGV4aXQoZXhpdF9zdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHVzdW5zZXRsb2NrKGNvdW50X2xvY2spIDwgMCkKKyAgICAgICAgICAgICAgICBwZXJyb3IoInVzdW5zZXRsb2NrIChjb3VudF9sb2NrKSIpOworICAgICAgICAgICAgZHByaW50ZigoIndhaXRpbmcgZm9yIG90aGVyIHRocmVhZHMgKCVkKVxuIiwgbnRocmVhZHMpKTsKKyAgICAgICAgICAgIGlmICh1c3NldGxvY2sod2FpdF9sb2NrKSA8IDApCisgICAgICAgICAgICAgICAgcGVycm9yKCJ1c3NldGxvY2sgKHdhaXRfbG9jaykiKTsKKyAgICAgICAgICAgIGlmICh1c3NldGxvY2soY291bnRfbG9jaykgPCAwKQorICAgICAgICAgICAgICAgIHBlcnJvcigidXNzZXRsb2NrIChjb3VudF9sb2NrKSIpOworICAgICAgICB9CisgICAgfQorICAgIC8qIG5vdCB0aGUgbWFpbiB0aHJlYWQgKi8KKyAgICBpZiAod2FpdGluZ19mb3JfdGhyZWFkcykgeworICAgICAgICBkcHJpbnRmKCgibWFpbiB0aHJlYWQgaXMgd2FpdGluZ1xuIikpOworICAgICAgICBpZiAodXN1bnNldGxvY2sod2FpdF9sb2NrKSA8IDApCisgICAgICAgICAgICBwZXJyb3IoInVzdW5zZXRsb2NrICh3YWl0X2xvY2spIik7CisgICAgfQogI2lmbmRlZiBOT19FWElUX1BST0cKLQllbHNlIGlmIChkb19leGl0KQotCQkodm9pZCkga2lsbChteV9waWQsIFNJR1VTUjEpOworICAgIGVsc2UgaWYgKGRvX2V4aXQpCisgICAgICAgICh2b2lkKSBraWxsKG15X3BpZCwgU0lHVVNSMSk7CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCi0JaWYgKHVzdW5zZXRsb2NrKGNvdW50X2xvY2spIDwgMCkKLQkJcGVycm9yKCJ1c3Vuc2V0bG9jayAoY291bnRfbG9jaykiKTsKLQlfZXhpdCgwKTsKKyAgICBpZiAodXN1bnNldGxvY2soY291bnRfbG9jaykgPCAwKQorICAgICAgICBwZXJyb3IoInVzdW5zZXRsb2NrIChjb3VudF9sb2NrKSIpOworICAgIF9leGl0KDApOwogfQogCiB2b2lkIFB5VGhyZWFkX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMCk7CiB9CiAKIHZvaWQgUHlUaHJlYWRfX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CiB9CiAKICNpZm5kZWYgTk9fRVhJVF9QUk9HCiBzdGF0aWMgdm9pZCBkb19QeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cywgaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KHN0YXR1cyk7Ci0JCWVsc2UKLQkJCWV4aXQoc3RhdHVzKTsKLQlkb19leGl0ID0gMTsKLQlleGl0X3N0YXR1cyA9IHN0YXR1czsKLQlkb19QeVRocmVhZF9leGl0X3RocmVhZChub19jbGVhbnVwKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoc3RhdHVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdChzdGF0dXMpOworICAgIGRvX2V4aXQgPSAxOworICAgIGV4aXRfc3RhdHVzID0gc3RhdHVzOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKG5vX2NsZWFudXApOwogfQogCiB2b2lkIFB5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOwogfQogCiB2b2lkIFB5VGhyZWFkX19leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKIH0KICNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8KIApAQCAtMzMyLDQ0ICszMzIsNDQgQEAKICAqLwogUHlUaHJlYWRfdHlwZV9sb2NrIFB5VGhyZWFkX2FsbG9jYXRlX2xvY2sodm9pZCkKIHsKLQl1bG9ja190IGxvY2s7CisgICAgdWxvY2tfdCBsb2NrOwogCi0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWxsb2NhdGVfbG9jayBjYWxsZWRcbiIpKTsKKyAgICBpZiAoIWluaXRpYWxpemVkKQorICAgICAgICBQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCi0JaWYgKChsb2NrID0gdXNuZXdsb2NrKHNoYXJlZF9hcmVuYSkpID09IE5VTEwpCi0JCXBlcnJvcigidXNuZXdsb2NrIik7Ci0JKHZvaWQpIHVzaW5pdGxvY2sobG9jayk7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGlmICgobG9jayA9IHVzbmV3bG9jayhzaGFyZWRfYXJlbmEpKSA9PSBOVUxMKQorICAgICAgICBwZXJyb3IoInVzbmV3bG9jayIpOworICAgICh2b2lkKSB1c2luaXRsb2NrKGxvY2spOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIGxvY2spKTsKKyAgICByZXR1cm4gKFB5VGhyZWFkX3R5cGVfbG9jaykgbG9jazsKIH0KIAogdm9pZCBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2ZyZWVfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JdXNmcmVlbG9jaygodWxvY2tfdCkgbG9jaywgc2hhcmVkX2FyZW5hKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICB1c2ZyZWVsb2NrKCh1bG9ja190KSBsb2NrLCBzaGFyZWRfYXJlbmEpOwogfQogCiBpbnQgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrLCBpbnQgd2FpdGZsYWcpCiB7Ci0JaW50IHN1Y2Nlc3M7CisgICAgaW50IHN1Y2Nlc3M7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwotCWVycm5vID0gMDsJCS8qIGNsZWFyIGl0IGp1c3QgaW4gY2FzZSAqLwotCWlmICh3YWl0ZmxhZykKLQkJc3VjY2VzcyA9IHVzc2V0bG9jaygodWxvY2tfdCkgbG9jayk7Ci0JZWxzZQotCQlzdWNjZXNzID0gdXNjc2V0bG9jaygodWxvY2tfdCkgbG9jaywgMSk7IC8qIFRyeSBpdCBvbmNlICovCi0JaWYgKHN1Y2Nlc3MgPCAwKQotCQlwZXJyb3Iod2FpdGZsYWcgPyAidXNzZXRsb2NrIiA6ICJ1c2NzZXRsb2NrIik7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgIC8qIGNsZWFyIGl0IGp1c3QgaW4gY2FzZSAqLworICAgIGlmICh3YWl0ZmxhZykKKyAgICAgICAgc3VjY2VzcyA9IHVzc2V0bG9jaygodWxvY2tfdCkgbG9jayk7CisgICAgZWxzZQorICAgICAgICBzdWNjZXNzID0gdXNjc2V0bG9jaygodWxvY2tfdCkgbG9jaywgMSk7IC8qIFRyeSBpdCBvbmNlICovCisgICAgaWYgKHN1Y2Nlc3MgPCAwKQorICAgICAgICBwZXJyb3Iod2FpdGZsYWcgPyAidXNzZXRsb2NrIiA6ICJ1c2NzZXRsb2NrIik7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOworICAgIHJldHVybiBzdWNjZXNzOwogfQogCiB2b2lkIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2sgbG9jaykKIHsKLQlkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKLQlpZiAodXN1bnNldGxvY2soKHVsb2NrX3QpIGxvY2spIDwgMCkKLQkJcGVycm9yKCJ1c3Vuc2V0bG9jayIpOworICAgIGRwcmludGYoKCJQeVRocmVhZF9yZWxlYXNlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOworICAgIGlmICh1c3Vuc2V0bG9jaygodWxvY2tfdCkgbG9jaykgPCAwKQorICAgICAgICBwZXJyb3IoInVzdW5zZXRsb2NrIik7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX3NvbGFyaXMuaCBiL1B5dGhvbi90aHJlYWRfc29sYXJpcy5oCmluZGV4IGZmM2U2ZjMuLjU2YWM4YWUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfc29sYXJpcy5oCisrKyBiL1B5dGhvbi90aHJlYWRfc29sYXJpcy5oCkBAIC0xNywxNTggKzE3LDE1OCBAQAogICogVGhyZWFkIHN1cHBvcnQuCiAgKi8KIHN0cnVjdCBmdW5jX2FyZyB7Ci0Jdm9pZCAoKmZ1bmMpKHZvaWQgKik7Ci0Jdm9pZCAqYXJnOworICAgIHZvaWQgKCpmdW5jKSh2b2lkICopOworICAgIHZvaWQgKmFyZzsKIH07CiAKIHN0YXRpYyB2b2lkICoKIG5ld19mdW5jKHZvaWQgKmZ1bmNhcmcpCiB7Ci0Jdm9pZCAoKmZ1bmMpKHZvaWQgKik7Ci0Jdm9pZCAqYXJnOworICAgIHZvaWQgKCpmdW5jKSh2b2lkICopOworICAgIHZvaWQgKmFyZzsKIAotCWZ1bmMgPSAoKHN0cnVjdCBmdW5jX2FyZyAqKSBmdW5jYXJnKS0+ZnVuYzsKLQlhcmcgPSAoKHN0cnVjdCBmdW5jX2FyZyAqKSBmdW5jYXJnKS0+YXJnOwotCWZyZWUoZnVuY2FyZyk7Ci0JKCpmdW5jKShhcmcpOwotCXJldHVybiAwOworICAgIGZ1bmMgPSAoKHN0cnVjdCBmdW5jX2FyZyAqKSBmdW5jYXJnKS0+ZnVuYzsKKyAgICBhcmcgPSAoKHN0cnVjdCBmdW5jX2FyZyAqKSBmdW5jYXJnKS0+YXJnOworICAgIGZyZWUoZnVuY2FyZyk7CisgICAgKCpmdW5jKShhcmcpOworICAgIHJldHVybiAwOwogfQogCiAKIGxvbmcKIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQl0aHJlYWRfdCB0aWQ7Ci0Jc3RydWN0IGZ1bmNfYXJnICpmdW5jYXJnOworICAgIHRocmVhZF90IHRpZDsKKyAgICBzdHJ1Y3QgZnVuY19hcmcgKmZ1bmNhcmc7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwotCWZ1bmNhcmcgPSAoc3RydWN0IGZ1bmNfYXJnICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IGZ1bmNfYXJnKSk7Ci0JZnVuY2FyZy0+ZnVuYyA9IGZ1bmM7Ci0JZnVuY2FyZy0+YXJnID0gYXJnOwotCWlmICh0aHJfY3JlYXRlKDAsIDAsIG5ld19mdW5jLCBmdW5jYXJnLAotCQkgICAgICAgVEhSX0RFVEFDSEVEIHwgVEhSX05FV19MV1AsICZ0aWQpKSB7Ci0JCXBlcnJvcigidGhyX2NyZWF0ZSIpOwotCQlmcmVlKCh2b2lkICopIGZ1bmNhcmcpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiB0aWQ7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICBmdW5jYXJnID0gKHN0cnVjdCBmdW5jX2FyZyAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdW5jX2FyZykpOworICAgIGZ1bmNhcmctPmZ1bmMgPSBmdW5jOworICAgIGZ1bmNhcmctPmFyZyA9IGFyZzsKKyAgICBpZiAodGhyX2NyZWF0ZSgwLCAwLCBuZXdfZnVuYywgZnVuY2FyZywKKyAgICAgICAgICAgICAgICAgICBUSFJfREVUQUNIRUQgfCBUSFJfTkVXX0xXUCwgJnRpZCkpIHsKKyAgICAgICAgcGVycm9yKCJ0aHJfY3JlYXRlIik7CisgICAgICAgIGZyZWUoKHZvaWQgKikgZnVuY2FyZyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHRpZDsKIH0KIAogbG9uZwogUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKQogewotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7Ci0JcmV0dXJuIHRocl9zZWxmKCk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKKyAgICByZXR1cm4gdGhyX3NlbGYoKTsKIH0KIAotc3RhdGljIHZvaWQgCitzdGF0aWMgdm9pZAogZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCWlmIChub19jbGVhbnVwKQotCQkJX2V4aXQoMCk7Ci0JCWVsc2UKLQkJCWV4aXQoMCk7Ci0JdGhyX2V4aXQoMCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIikpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgdGhyX2V4aXQoMCk7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKQogewotCWRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKDApOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CiB9CiAKICNpZm5kZWYgTk9fRVhJVF9QUk9HCi1zdGF0aWMgdm9pZCAKK3N0YXRpYyB2b2lkCiBkb19QeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cywgaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KHN0YXR1cyk7Ci0JCWVsc2UKLQkJCWV4aXQoc3RhdHVzKTsKLQlpZiAobm9fY2xlYW51cCkKLQkJX2V4aXQoc3RhdHVzKTsKLQllbHNlCi0JCWV4aXQoc3RhdHVzKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoc3RhdHVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdChzdGF0dXMpOworICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICBfZXhpdChzdGF0dXMpOworICAgIGVsc2UKKyAgICAgICAgZXhpdChzdGF0dXMpOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMCk7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9fZXhpdF9wcm9nKGludCBzdGF0dXMpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF9wcm9nKHN0YXR1cywgMSk7CiB9CiAjZW5kaWYgLyogTk9fRVhJVF9QUk9HICovCiAKIC8qCiAgKiBMb2NrIHN1cHBvcnQuCiAgKi8KLVB5VGhyZWFkX3R5cGVfbG9jayAKK1B5VGhyZWFkX3R5cGVfbG9jawogUHlUaHJlYWRfYWxsb2NhdGVfbG9jayh2b2lkKQogewotCW11dGV4X3QgKmxvY2s7CisgICAgbXV0ZXhfdCAqbG9jazsKIAotCWRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2sgY2FsbGVkXG4iKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAotCWxvY2sgPSAobXV0ZXhfdCAqKSBtYWxsb2Moc2l6ZW9mKG11dGV4X3QpKTsKLQlpZiAobXV0ZXhfaW5pdChsb2NrLCBVU1lOQ19USFJFQUQsIDApKSB7Ci0JCXBlcnJvcigibXV0ZXhfaW5pdCIpOwotCQlmcmVlKCh2b2lkICopIGxvY2spOwotCQlsb2NrID0gMDsKLQl9Ci0JZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOwotCXJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOworICAgIGxvY2sgPSAobXV0ZXhfdCAqKSBtYWxsb2Moc2l6ZW9mKG11dGV4X3QpKTsKKyAgICBpZiAobXV0ZXhfaW5pdChsb2NrLCBVU1lOQ19USFJFQUQsIDApKSB7CisgICAgICAgIHBlcnJvcigibXV0ZXhfaW5pdCIpOworICAgICAgICBmcmVlKCh2b2lkICopIGxvY2spOworICAgICAgICBsb2NrID0gMDsKKyAgICB9CisgICAgZHByaW50ZigoIlB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKSAtPiAlcFxuIiwgbG9jaykpOworICAgIHJldHVybiAoUHlUaHJlYWRfdHlwZV9sb2NrKSBsb2NrOwogfQogCi12b2lkIAordm9pZAogUHlUaHJlYWRfZnJlZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrKQogewotCWRwcmludGYoKCJQeVRocmVhZF9mcmVlX2xvY2soJXApIGNhbGxlZFxuIiwgbG9jaykpOwotCW11dGV4X2Rlc3Ryb3koKG11dGV4X3QgKikgbG9jayk7Ci0JZnJlZSgodm9pZCAqKSBsb2NrKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZnJlZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBtdXRleF9kZXN0cm95KChtdXRleF90ICopIGxvY2spOworICAgIGZyZWUoKHZvaWQgKikgbG9jayk7CiB9CiAKLWludCAKK2ludAogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrLCBpbnQgd2FpdGZsYWcpCiB7Ci0JaW50IHN1Y2Nlc3M7CisgICAgaW50IHN1Y2Nlc3M7CiAKLQlkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgY2FsbGVkXG4iLCBsb2NrLCB3YWl0ZmxhZykpOwotCWlmICh3YWl0ZmxhZykKLQkJc3VjY2VzcyA9IG11dGV4X2xvY2soKG11dGV4X3QgKikgbG9jayk7Ci0JZWxzZQotCQlzdWNjZXNzID0gbXV0ZXhfdHJ5bG9jaygobXV0ZXhfdCAqKSBsb2NrKTsKLQlpZiAoc3VjY2VzcyA8IDApCi0JCXBlcnJvcih3YWl0ZmxhZyA/ICJtdXRleF9sb2NrIiA6ICJtdXRleF90cnlsb2NrIik7Ci0JZWxzZQotCQlzdWNjZXNzID0gIXN1Y2Nlc3M7IC8qIHNvbGFyaXMgZG9lcyBpdCB0aGUgb3RoZXIgd2F5IHJvdW5kICovCi0JZHByaW50ZigoIlB5VGhyZWFkX2FjcXVpcmVfbG9jayglcCwgJWQpIC0+ICVkXG4iLCBsb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwotCXJldHVybiBzdWNjZXNzOworICAgIGRwcmludGYoKCJQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSBjYWxsZWRcbiIsIGxvY2ssIHdhaXRmbGFnKSk7CisgICAgaWYgKHdhaXRmbGFnKQorICAgICAgICBzdWNjZXNzID0gbXV0ZXhfbG9jaygobXV0ZXhfdCAqKSBsb2NrKTsKKyAgICBlbHNlCisgICAgICAgIHN1Y2Nlc3MgPSBtdXRleF90cnlsb2NrKChtdXRleF90ICopIGxvY2spOworICAgIGlmIChzdWNjZXNzIDwgMCkKKyAgICAgICAgcGVycm9yKHdhaXRmbGFnID8gIm11dGV4X2xvY2siIDogIm11dGV4X3RyeWxvY2siKTsKKyAgICBlbHNlCisgICAgICAgIHN1Y2Nlc3MgPSAhc3VjY2VzczsgLyogc29sYXJpcyBkb2VzIGl0IHRoZSBvdGhlciB3YXkgcm91bmQgKi8KKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIGxvY2ssIHdhaXRmbGFnLCBzdWNjZXNzKSk7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKLXZvaWQgCit2b2lkCiBQeVRocmVhZF9yZWxlYXNlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrIGxvY2spCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBsb2NrKSk7Ci0JaWYgKG11dGV4X3VubG9jaygobXV0ZXhfdCAqKSBsb2NrKSkKLQkJcGVycm9yKCJtdXRleF91bmxvY2siKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBjYWxsZWRcbiIsIGxvY2spKTsKKyAgICBpZiAobXV0ZXhfdW5sb2NrKChtdXRleF90ICopIGxvY2spKQorICAgICAgICBwZXJyb3IoIm11dGV4X3VubG9jayIpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3RocmVhZF93aW5jZS5oIGIvUHl0aG9uL3RocmVhZF93aW5jZS5oCmluZGV4IGUxNmY1ZDEuLjMzY2Y1YTQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfd2luY2UuaAorKysgYi9QeXRob24vdGhyZWFkX3dpbmNlLmgKQEAgLTI0LDIxICsyNCwyMSBAQAogICovCiBsb25nIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKmFyZykKIHsKLQlsb25nIHJ2OwotCWludCBzdWNjZXNzID0gLTE7CisgICAgbG9uZyBydjsKKyAgICBpbnQgc3VjY2VzcyA9IC0xOwogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOwotCWlmICghaW5pdGlhbGl6ZWQpCi0JCVB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgZHByaW50ZigoIiVsZDogUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CiAKLQlydiA9IF9iZWdpbnRocmVhZChmdW5jLCAwLCBhcmcpOyAvKiB1c2UgZGVmYXVsdCBzdGFjayBzaXplICovCi0gCi0JaWYgKHJ2ICE9IC0xKSB7Ci0JCXN1Y2Nlc3MgPSAwOwotCQlkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIHN1Y2NlZWRlZDpcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSkpOwotCX0KKyAgICBydiA9IF9iZWdpbnRocmVhZChmdW5jLCAwLCBhcmcpOyAvKiB1c2UgZGVmYXVsdCBzdGFjayBzaXplICovCiAKLQlyZXR1cm4gc3VjY2VzczsKKyAgICBpZiAocnYgIT0gLTEpIHsKKyAgICAgICAgc3VjY2VzcyA9IDA7CisgICAgICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQgc3VjY2VlZGVkOlxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIC8qCkBAIC00Nyw1MiArNDcsNTIgQEAKICAqLwogbG9uZyBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KHZvaWQpCiB7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKLSAgICAgICAgCi0JcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisKKyAgICByZXR1cm4gR2V0Q3VycmVudFRocmVhZElkKCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkKGludCBub19jbGVhbnVwKQogewotCWRwcmludGYoKCIlbGQ6IGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7Ci0JaWYgKCFpbml0aWFsaXplZCkKLQkJaWYgKG5vX2NsZWFudXApCi0JCQlleGl0KDApOyAvKiBYWFggLSB3YXMgX2V4aXQoKSEhICovCi0JCWVsc2UKLQkJCWV4aXQoMCk7Ci0JX2VuZHRocmVhZCgpOworICAgIGRwcmludGYoKCIlbGQ6IGRvX1B5VGhyZWFkX2V4aXRfdGhyZWFkIGNhbGxlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpKSk7CisgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgaWYgKG5vX2NsZWFudXApCisgICAgICAgICAgICBleGl0KDApOyAvKiBYWFggLSB3YXMgX2V4aXQoKSEhICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4aXQoMCk7CisgICAgX2VuZHRocmVhZCgpOwogfQogCiB2b2lkIFB5VGhyZWFkX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMCk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMCk7CiB9CiAKIHZvaWQgUHlUaHJlYWRfX2V4aXRfdGhyZWFkKHZvaWQpCiB7Ci0JZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CisgICAgZG9fUHlUaHJlYWRfZXhpdF90aHJlYWQoMSk7CiB9CiAKICNpZm5kZWYgTk9fRVhJVF9QUk9HCiBzdGF0aWMgdm9pZCBkb19QeVRocmVhZF9leGl0X3Byb2coaW50IHN0YXR1cywgaW50IG5vX2NsZWFudXApCiB7Ci0JZHByaW50ZigoIlB5VGhyZWFkX2V4aXRfcHJvZyglZCkgY2FsbGVkXG4iLCBzdGF0dXMpKTsKLQlpZiAoIWluaXRpYWxpemVkKQotCQlpZiAobm9fY2xlYW51cCkKLQkJCV9leGl0KHN0YXR1cyk7Ci0JCWVsc2UKLQkJCWV4aXQoc3RhdHVzKTsKKyAgICBkcHJpbnRmKCgiUHlUaHJlYWRfZXhpdF9wcm9nKCVkKSBjYWxsZWRcbiIsIHN0YXR1cykpOworICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgIGlmIChub19jbGVhbnVwKQorICAgICAgICAgICAgX2V4aXQoc3RhdHVzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhpdChzdGF0dXMpOwogfQogCiB2b2lkIFB5VGhyZWFkX2V4aXRfcHJvZyhpbnQgc3RhdHVzKQogewotCWRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOworICAgIGRvX1B5VGhyZWFkX2V4aXRfcHJvZyhzdGF0dXMsIDApOwogfQogCiB2b2lkIFB5VGhyZWFkX19leGl0X3Byb2coaW50IHN0YXR1cykKIHsKLQlkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKKyAgICBkb19QeVRocmVhZF9leGl0X3Byb2coc3RhdHVzLCAxKTsKIH0KICNlbmRpZiAvKiBOT19FWElUX1BST0cgKi8KIApAQCAtMTA3LDEyICsxMDcsMTIgQEAKIAogICAgIGRwcmludGYoKCJQeVRocmVhZF9hbGxvY2F0ZV9sb2NrIGNhbGxlZFxuIikpOwogICAgIGlmICghaW5pdGlhbGl6ZWQpCi0gICAgICAgIFB5VGhyZWFkX2luaXRfdGhyZWFkKCk7CisgICAgUHlUaHJlYWRfaW5pdF90aHJlYWQoKTsKIAogICAgIGFMb2NrID0gQ3JlYXRlRXZlbnQoTlVMTCwgICAgICAgICAgIC8qIFNlY3VyaXR5IGF0dHJpYnV0ZXMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIC8qIE1hbnVhbC1SZXNldCAgICAgICAgICAgICAgICovCi0JCQkJCQkxLCAgICAgICAgICAgICAgLyogSXMgaW5pdGlhbGx5IHNpZ25hbGxlZCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgICAgICAgICAvKiBOYW1lIG9mIGV2ZW50ICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAvKiBNYW51YWwtUmVzZXQgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgIC8qIElzIGluaXRpYWxseSBzaWduYWxsZWQgICovCisgICAgICAgICAgICBOVUxMKTsgICAgICAgICAgLyogTmFtZSBvZiBldmVudCAgICAgICAgICAgICovCiAKICAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCkgLT4gJXBcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgYUxvY2spKTsKIApAQCAtMTQyLDIyICsxNDIsMjIgQEAKICNpZm5kZWYgREVCVUcKICAgICB3YWl0UmVzdWx0ID0gV2FpdEZvclNpbmdsZU9iamVjdChhTG9jaywgKHdhaXRmbGFnID8gSU5GSU5JVEUgOiAwKSk7CiAjZWxzZQotCS8qIFRvIGFpZCBpbiBkZWJ1Z2dpbmcsIHdlIHJlZ3VsYXJseSB3YWtlIHVwLiAgVGhpcyBhbGxvd3MgdXMgdG8KLQlicmVhayBpbnRvIHRoZSBkZWJ1Z2dlciAqLwotCXdoaWxlIChUUlVFKSB7Ci0JCXdhaXRSZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGFMb2NrLCB3YWl0ZmxhZyA/IDMwMDAgOiAwKTsKLQkJaWYgKHdhaXRmbGFnPT0wIHx8ICh3YWl0ZmxhZyAmJiB3YWl0UmVzdWx0ID09IFdBSVRfT0JKRUNUXzApKQotCQkJYnJlYWs7Ci0JfQorICAgIC8qIFRvIGFpZCBpbiBkZWJ1Z2dpbmcsIHdlIHJlZ3VsYXJseSB3YWtlIHVwLiAgVGhpcyBhbGxvd3MgdXMgdG8KKyAgICBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlciAqLworICAgIHdoaWxlIChUUlVFKSB7CisgICAgICAgIHdhaXRSZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGFMb2NrLCB3YWl0ZmxhZyA/IDMwMDAgOiAwKTsKKyAgICAgICAgaWYgKHdhaXRmbGFnPT0wIHx8ICh3YWl0ZmxhZyAmJiB3YWl0UmVzdWx0ID09IFdBSVRfT0JKRUNUXzApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQogI2VuZGlmCiAKICAgICBpZiAod2FpdFJlc3VsdCAhPSBXQUlUX09CSkVDVF8wKSB7Ci0JCXN1Y2Nlc3MgPSAwOyAgICAvKiBXZSBmYWlsZWQgKi8KKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gMDsgICAgLyogV2UgZmFpbGVkICovCiAgICAgfQogCi0JZHByaW50ZigoIiVsZDogUHlUaHJlYWRfYWNxdWlyZV9sb2NrKCVwLCAlZCkgLT4gJWRcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSxhTG9jaywgd2FpdGZsYWcsIHN1Y2Nlc3MpKTsKKyAgICBkcHJpbnRmKCgiJWxkOiBQeVRocmVhZF9hY3F1aXJlX2xvY2soJXAsICVkKSAtPiAlZFxuIiwgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCgpLGFMb2NrLCB3YWl0ZmxhZywgc3VjY2VzcykpOwogCi0JcmV0dXJuIHN1Y2Nlc3M7CisgICAgcmV0dXJuIHN1Y2Nlc3M7CiB9CiAKIHZvaWQgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayBhTG9jaykKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgIGRwcmludGYoKCIlbGQ6IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgY2FsbGVkXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksYUxvY2spKTsKIAogICAgIGlmICghU2V0RXZlbnQoYUxvY2spKQotICAgICAgICBkcHJpbnRmKCgiJWxkOiBDb3VsZCBub3QgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBlcnJvcjogJWxcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgYUxvY2ssIEdldExhc3RFcnJvcigpKSk7CisgICAgZHByaW50ZigoIiVsZDogQ291bGQgbm90IFB5VGhyZWFkX3JlbGVhc2VfbG9jayglcCkgZXJyb3I6ICVsXG4iLCBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCksIGFMb2NrLCBHZXRMYXN0RXJyb3IoKSkpOwogfQogCiAKZGlmZiAtLWdpdCBhL1B5dGhvbi90cmFjZWJhY2suYyBiL1B5dGhvbi90cmFjZWJhY2suYwppbmRleCBjMmQ3ZTc3Li5hNjBhMTgzIDEwMDY0NAotLS0gYS9QeXRob24vdHJhY2ViYWNrLmMKKysrIGIvUHl0aG9uL3RyYWNlYmFjay5jCkBAIC0xMiwyNzQgKzEyLDI3NCBAQAogI2RlZmluZSBPRkYoeCkgb2Zmc2V0b2YoUHlUcmFjZWJhY2tPYmplY3QsIHgpCiAKIHN0YXRpYyBQeU1lbWJlckRlZiB0Yl9tZW1iZXJsaXN0W10gPSB7Ci0JeyJ0Yl9uZXh0IiwJVF9PQkpFQ1QsCU9GRih0Yl9uZXh0KSwgUkVBRE9OTFl9LAotCXsidGJfZnJhbWUiLAlUX09CSkVDVCwJT0ZGKHRiX2ZyYW1lKSwgUkVBRE9OTFl9LAotCXsidGJfbGFzdGkiLAlUX0lOVCwJCU9GRih0Yl9sYXN0aSksIFJFQURPTkxZfSwKLQl7InRiX2xpbmVubyIsCVRfSU5ULAkJT0ZGKHRiX2xpbmVubyksIFJFQURPTkxZfSwKLQl7TlVMTH0JLyogU2VudGluZWwgKi8KKyAgICB7InRiX25leHQiLCAgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYodGJfbmV4dCksIFJFQURPTkxZfSwKKyAgICB7InRiX2ZyYW1lIiwgICAgICAgIFRfT0JKRUNULCAgICAgICBPRkYodGJfZnJhbWUpLCBSRUFET05MWX0sCisgICAgeyJ0Yl9sYXN0aSIsICAgICAgICBUX0lOVCwgICAgICAgICAgT0ZGKHRiX2xhc3RpKSwgUkVBRE9OTFl9LAorICAgIHsidGJfbGluZW5vIiwgICAgICAgVF9JTlQsICAgICAgICAgIE9GRih0Yl9saW5lbm8pLCBSRUFET05MWX0sCisgICAge05VTEx9ICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyB2b2lkCiB0Yl9kZWFsbG9jKFB5VHJhY2ViYWNrT2JqZWN0ICp0YikKIHsKLQlQeU9iamVjdF9HQ19VblRyYWNrKHRiKTsKLQlQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHRiKQotCVB5X1hERUNSRUYodGItPnRiX25leHQpOwotCVB5X1hERUNSRUYodGItPnRiX2ZyYW1lKTsKLQlQeU9iamVjdF9HQ19EZWwodGIpOwotCVB5X1RSQVNIQ0FOX1NBRkVfRU5EKHRiKQorICAgIFB5T2JqZWN0X0dDX1VuVHJhY2sodGIpOworICAgIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4odGIpCisgICAgUHlfWERFQ1JFRih0Yi0+dGJfbmV4dCk7CisgICAgUHlfWERFQ1JFRih0Yi0+dGJfZnJhbWUpOworICAgIFB5T2JqZWN0X0dDX0RlbCh0Yik7CisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQodGIpCiB9CiAKIHN0YXRpYyBpbnQKIHRiX3RyYXZlcnNlKFB5VHJhY2ViYWNrT2JqZWN0ICp0YiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0JUHlfVklTSVQodGItPnRiX25leHQpOwotCVB5X1ZJU0lUKHRiLT50Yl9mcmFtZSk7Ci0JcmV0dXJuIDA7CisgICAgUHlfVklTSVQodGItPnRiX25leHQpOworICAgIFB5X1ZJU0lUKHRiLT50Yl9mcmFtZSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCiB0Yl9jbGVhcihQeVRyYWNlYmFja09iamVjdCAqdGIpCiB7Ci0JUHlfQ0xFQVIodGItPnRiX25leHQpOwotCVB5X0NMRUFSKHRiLT50Yl9mcmFtZSk7CisgICAgUHlfQ0xFQVIodGItPnRiX25leHQpOworICAgIFB5X0NMRUFSKHRiLT50Yl9mcmFtZSk7CiB9CiAKIFB5VHlwZU9iamVjdCBQeVRyYWNlQmFja19UeXBlID0gewotCVB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0JInRyYWNlYmFjayIsCi0Jc2l6ZW9mKFB5VHJhY2ViYWNrT2JqZWN0KSwKLQkwLAotCShkZXN0cnVjdG9yKXRiX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwJCS8qdHBfcHJpbnQqLwotCTAsICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwotCTAsCQkvKnRwX3NldGF0dHIqLwotCTAsCQkvKnRwX2NvbXBhcmUqLwotCTAsCQkvKnRwX3JlcHIqLwotCTAsCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCTAsCQkvKiB0cF9oYXNoICovCi0JMCwJCS8qIHRwX2NhbGwgKi8KLQkwLAkJLyogdHBfc3RyICovCi0JMCwJCS8qIHRwX2dldGF0dHJvICovCi0JMCwJCS8qIHRwX3NldGF0dHJvICovCi0JMCwJCQkJCS8qIHRwX2FzX2J1ZmZlciAqLwotCVB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLwotCTAsICAgICAgICAgICAgIAkJCQkvKiB0cF9kb2MgKi8KLSAJKHRyYXZlcnNlcHJvYyl0Yl90cmF2ZXJzZSwJCS8qIHRwX3RyYXZlcnNlICovCi0JKGlucXVpcnkpdGJfY2xlYXIsCQkJLyogdHBfY2xlYXIgKi8KLQkwLAkJCQkJLyogdHBfcmljaGNvbXBhcmUgKi8KLQkwLAkJCQkJLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KLQkwLAkJCQkJLyogdHBfaXRlciAqLwotCTAsCQkJCQkvKiB0cF9pdGVybmV4dCAqLwotCTAsCQkJCQkvKiB0cF9tZXRob2RzICovCi0JdGJfbWVtYmVybGlzdCwJCQkgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KLQkwLAkJCSAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KLQkwLAkJCQkJLyogdHBfYmFzZSAqLwotCTAsCQkJCQkvKiB0cF9kaWN0ICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKKyAgICAidHJhY2ViYWNrIiwKKyAgICBzaXplb2YoUHlUcmFjZWJhY2tPYmplY3QpLAorICAgIDAsCisgICAgKGRlc3RydWN0b3IpdGJfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYyl0Yl90cmF2ZXJzZSwgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIChpbnF1aXJ5KXRiX2NsZWFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICB0Yl9tZW1iZXJsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogfTsKIAogc3RhdGljIFB5VHJhY2ViYWNrT2JqZWN0ICoKIG5ld3RyYWNlYmFja29iamVjdChQeVRyYWNlYmFja09iamVjdCAqbmV4dCwgUHlGcmFtZU9iamVjdCAqZnJhbWUpCiB7Ci0JUHlUcmFjZWJhY2tPYmplY3QgKnRiOwotCWlmICgobmV4dCAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayhuZXh0KSkgfHwKLQkJCWZyYW1lID09IE5VTEwgfHwgIVB5RnJhbWVfQ2hlY2soZnJhbWUpKSB7Ci0JCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JdGIgPSBQeU9iamVjdF9HQ19OZXcoUHlUcmFjZWJhY2tPYmplY3QsICZQeVRyYWNlQmFja19UeXBlKTsKLQlpZiAodGIgIT0gTlVMTCkgewotCQlQeV9YSU5DUkVGKG5leHQpOwotCQl0Yi0+dGJfbmV4dCA9IG5leHQ7Ci0JCVB5X1hJTkNSRUYoZnJhbWUpOwotCQl0Yi0+dGJfZnJhbWUgPSBmcmFtZTsKLQkJdGItPnRiX2xhc3RpID0gZnJhbWUtPmZfbGFzdGk7Ci0JCXRiLT50Yl9saW5lbm8gPSBQeUNvZGVfQWRkcjJMaW5lKGZyYW1lLT5mX2NvZGUsIAotCQkJCQkJIGZyYW1lLT5mX2xhc3RpKTsKLQkJUHlPYmplY3RfR0NfVHJhY2sodGIpOwotCX0KLQlyZXR1cm4gdGI7CisgICAgUHlUcmFjZWJhY2tPYmplY3QgKnRiOworICAgIGlmICgobmV4dCAhPSBOVUxMICYmICFQeVRyYWNlQmFja19DaGVjayhuZXh0KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUgPT0gTlVMTCB8fCAhUHlGcmFtZV9DaGVjayhmcmFtZSkpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB0YiA9IFB5T2JqZWN0X0dDX05ldyhQeVRyYWNlYmFja09iamVjdCwgJlB5VHJhY2VCYWNrX1R5cGUpOworICAgIGlmICh0YiAhPSBOVUxMKSB7CisgICAgICAgIFB5X1hJTkNSRUYobmV4dCk7CisgICAgICAgIHRiLT50Yl9uZXh0ID0gbmV4dDsKKyAgICAgICAgUHlfWElOQ1JFRihmcmFtZSk7CisgICAgICAgIHRiLT50Yl9mcmFtZSA9IGZyYW1lOworICAgICAgICB0Yi0+dGJfbGFzdGkgPSBmcmFtZS0+Zl9sYXN0aTsKKyAgICAgICAgdGItPnRiX2xpbmVubyA9IFB5Q29kZV9BZGRyMkxpbmUoZnJhbWUtPmZfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZfbGFzdGkpOworICAgICAgICBQeU9iamVjdF9HQ19UcmFjayh0Yik7CisgICAgfQorICAgIHJldHVybiB0YjsKIH0KIAogaW50CiBQeVRyYWNlQmFja19IZXJlKFB5RnJhbWVPYmplY3QgKmZyYW1lKQogewotCVB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0JUHlUcmFjZWJhY2tPYmplY3QgKm9sZHRiID0gKFB5VHJhY2ViYWNrT2JqZWN0ICopIHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjazsKLQlQeVRyYWNlYmFja09iamVjdCAqdGIgPSBuZXd0cmFjZWJhY2tvYmplY3Qob2xkdGIsIGZyYW1lKTsKLQlpZiAodGIgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCXRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjayA9IChQeU9iamVjdCAqKXRiOwotCVB5X1hERUNSRUYob2xkdGIpOwotCXJldHVybiAwOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisgICAgUHlUcmFjZWJhY2tPYmplY3QgKm9sZHRiID0gKFB5VHJhY2ViYWNrT2JqZWN0ICopIHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjazsKKyAgICBQeVRyYWNlYmFja09iamVjdCAqdGIgPSBuZXd0cmFjZWJhY2tvYmplY3Qob2xkdGIsIGZyYW1lKTsKKyAgICBpZiAodGIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHRzdGF0ZS0+Y3VyZXhjX3RyYWNlYmFjayA9IChQeU9iamVjdCAqKXRiOworICAgIFB5X1hERUNSRUYob2xkdGIpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIF9QeV9EaXNwbGF5U291cmNlTGluZShQeU9iamVjdCAqZiwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8sIGludCBpbmRlbnQpCiB7Ci0JaW50IGVyciA9IDA7Ci0JRklMRSAqeGZwID0gTlVMTDsKLQljaGFyIGxpbmVidWZbMjAwMF07Ci0JaW50IGk7Ci0JY2hhciBuYW1lYnVmW01BWFBBVEhMRU4rMV07CisgICAgaW50IGVyciA9IDA7CisgICAgRklMRSAqeGZwID0gTlVMTDsKKyAgICBjaGFyIGxpbmVidWZbMjAwMF07CisgICAgaW50IGk7CisgICAgY2hhciBuYW1lYnVmW01BWFBBVEhMRU4rMV07CiAKLQlpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCS8qIFRoaXMgaXMgbmVlZGVkIGJ5IEVtYWNzJyBjb21waWxlIGNvbW1hbmQgKi8KKyAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIFRoaXMgaXMgbmVlZGVkIGJ5IEVtYWNzJyBjb21waWxlIGNvbW1hbmQgKi8KICNkZWZpbmUgRk1UICIgIEZpbGUgXCIlLjUwMHNcIiwgbGluZSAlZCwgaW4gJS41MDBzXG4iCi0JeGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIiBQWV9TVERJT1RFWFRNT0RFKTsKLQlpZiAoeGZwID09IE5VTEwpIHsKLQkJLyogU2VhcmNoIHRhaWwgb2YgZmlsZW5hbWUgaW4gc3lzLnBhdGggYmVmb3JlIGdpdmluZyB1cCAqLwotCQlQeU9iamVjdCAqcGF0aDsKLQkJY29uc3QgY2hhciAqdGFpbCA9IHN0cnJjaHIoZmlsZW5hbWUsIFNFUCk7Ci0JCWlmICh0YWlsID09IE5VTEwpCi0JCQl0YWlsID0gZmlsZW5hbWU7Ci0JCWVsc2UKLQkJCXRhaWwrKzsKLQkJcGF0aCA9IFB5U3lzX0dldE9iamVjdCgicGF0aCIpOwotCQlpZiAocGF0aCAhPSBOVUxMICYmIFB5TGlzdF9DaGVjayhwYXRoKSkgewotCQkJUHlfc3NpemVfdCBfbnBhdGggPSBQeUxpc3RfU2l6ZShwYXRoKTsKLQkJCWludCBucGF0aCA9IFB5X1NBRkVfRE9XTkNBU1QoX25wYXRoLCBQeV9zc2l6ZV90LCBpbnQpOwotCQkJc2l6ZV90IHRhaWxsZW4gPSBzdHJsZW4odGFpbCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbnBhdGg7IGkrKykgewotCQkJCVB5T2JqZWN0ICp2ID0gUHlMaXN0X0dldEl0ZW0ocGF0aCwgaSk7Ci0JCQkJaWYgKHYgPT0gTlVMTCkgewotCQkJCQlQeUVycl9DbGVhcigpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCQkJCXNpemVfdCBsZW47Ci0JCQkJCWxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHYpOwotCQkJCQlpZiAobGVuICsgMSArIHRhaWxsZW4gPj0gTUFYUEFUSExFTikKLQkJCQkJCWNvbnRpbnVlOyAvKiBUb28gbG9uZyAqLwotCQkJCQlzdHJjcHkobmFtZWJ1ZiwgUHlTdHJpbmdfQXNTdHJpbmcodikpOwotCQkJCQlpZiAoc3RybGVuKG5hbWVidWYpICE9IGxlbikKLQkJCQkJCWNvbnRpbnVlOyAvKiB2IGNvbnRhaW5zICdcMCcgKi8KLQkJCQkJaWYgKGxlbiA+IDAgJiYgbmFtZWJ1ZltsZW4tMV0gIT0gU0VQKQotCQkJCQkJbmFtZWJ1ZltsZW4rK10gPSBTRVA7Ci0JCQkJCXN0cmNweShuYW1lYnVmK2xlbiwgdGFpbCk7Ci0JCQkJCXhmcCA9IGZvcGVuKG5hbWVidWYsICJyIiBQWV9TVERJT1RFWFRNT0RFKTsKLQkJCQkJaWYgKHhmcCAhPSBOVUxMKSB7Ci0JCQkJCQlmaWxlbmFtZSA9IG5hbWVidWY7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KKyAgICB4ZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiIFBZX1NURElPVEVYVE1PREUpOworICAgIGlmICh4ZnAgPT0gTlVMTCkgeworICAgICAgICAvKiBTZWFyY2ggdGFpbCBvZiBmaWxlbmFtZSBpbiBzeXMucGF0aCBiZWZvcmUgZ2l2aW5nIHVwICovCisgICAgICAgIFB5T2JqZWN0ICpwYXRoOworICAgICAgICBjb25zdCBjaGFyICp0YWlsID0gc3RycmNocihmaWxlbmFtZSwgU0VQKTsKKyAgICAgICAgaWYgKHRhaWwgPT0gTlVMTCkKKyAgICAgICAgICAgIHRhaWwgPSBmaWxlbmFtZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGFpbCsrOworICAgICAgICBwYXRoID0gUHlTeXNfR2V0T2JqZWN0KCJwYXRoIik7CisgICAgICAgIGlmIChwYXRoICE9IE5VTEwgJiYgUHlMaXN0X0NoZWNrKHBhdGgpKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IF9ucGF0aCA9IFB5TGlzdF9TaXplKHBhdGgpOworICAgICAgICAgICAgaW50IG5wYXRoID0gUHlfU0FGRV9ET1dOQ0FTVChfbnBhdGgsIFB5X3NzaXplX3QsIGludCk7CisgICAgICAgICAgICBzaXplX3QgdGFpbGxlbiA9IHN0cmxlbih0YWlsKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucGF0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQeUxpc3RfR2V0SXRlbShwYXRoLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gKyAxICsgdGFpbGxlbiA+PSBNQVhQQVRITEVOKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIFRvbyBsb25nICovCisgICAgICAgICAgICAgICAgICAgIHN0cmNweShuYW1lYnVmLCBQeVN0cmluZ19Bc1N0cmluZyh2KSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJsZW4obmFtZWJ1ZikgIT0gbGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qIHYgY29udGFpbnMgJ1wwJyAqLworICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMCAmJiBuYW1lYnVmW2xlbi0xXSAhPSBTRVApCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lYnVmW2xlbisrXSA9IFNFUDsKKyAgICAgICAgICAgICAgICAgICAgc3RyY3B5KG5hbWVidWYrbGVuLCB0YWlsKTsKKyAgICAgICAgICAgICAgICAgICAgeGZwID0gZm9wZW4obmFtZWJ1ZiwgInIiIFBZX1NURElPVEVYVE1PREUpOworICAgICAgICAgICAgICAgICAgICBpZiAoeGZwICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbmFtZWJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGlmICh4ZnAgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgZmNsb3NlKHhmcCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgIGlmICh4ZnAgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgZmNsb3NlKHhmcCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGxpbmVubzsgaSsrKSB7CisgICAgICAgIGNoYXIqIHBMYXN0Q2hhciA9ICZsaW5lYnVmW3NpemVvZihsaW5lYnVmKS0yXTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgKnBMYXN0Q2hhciA9ICdcMCc7CisgICAgICAgICAgICBpZiAoUHlfVW5pdmVyc2FsTmV3bGluZUZnZXRzKGxpbmVidWYsIHNpemVvZiBsaW5lYnVmLCB4ZnAsIE5VTEwpID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBmZ2V0cyByZWFkICpzb21ldGhpbmcqOyBpZiBpdCBkaWRuJ3QgZ2V0IGFzCisgICAgICAgICAgICAgICBmYXIgYXMgcExhc3RDaGFyLCBpdCBtdXN0IGhhdmUgZm91bmQgYSBuZXdsaW5lCisgICAgICAgICAgICAgICBvciBoaXQgdGhlIGVuZCBvZiB0aGUgZmlsZTsgICAgICAgICAgICAgIGlmIHBMYXN0Q2hhciBpcyBcbiwKKyAgICAgICAgICAgICAgIGl0IG9idmlvdXNseSBmb3VuZCBhIG5ld2xpbmU7IGVsc2Ugd2UgaGF2ZW4ndAorICAgICAgICAgICAgICAgeWV0IHNlZW4gYSBuZXdsaW5lLCBzbyBtdXN0IGNvbnRpbnVlICovCisgICAgICAgIH0gd2hpbGUgKCpwTGFzdENoYXIgIT0gJ1wwJyAmJiAqcExhc3RDaGFyICE9ICdcbicpOworICAgIH0KKyAgICBpZiAoaSA9PSBsaW5lbm8pIHsKKyAgICAgICAgY2hhciBidWZbMTFdOworICAgICAgICBjaGFyICpwID0gbGluZWJ1ZjsKKyAgICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcMDE0JykKKyAgICAgICAgICAgIHArKzsKKworICAgICAgICAvKiBXcml0ZSBzb21lIHNwYWNlcyBiZWZvcmUgdGhlIGxpbmUgKi8KKyAgICAgICAgc3RyY3B5KGJ1ZiwgIiAgICAgICAgICAiKTsKKyAgICAgICAgYXNzZXJ0IChzdHJsZW4oYnVmKSA9PSAxMCk7CisgICAgICAgIHdoaWxlIChpbmRlbnQgPiAwKSB7CisgICAgICAgICAgICBpZihpbmRlbnQgPCAxMCkKKyAgICAgICAgICAgICAgICBidWZbaW5kZW50XSA9ICdcMCc7CisgICAgICAgICAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoYnVmLCBmKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGluZGVudCAtPSAxMDsKICAgICAgICAgfQogCi0JZm9yIChpID0gMDsgaSA8IGxpbmVubzsgaSsrKSB7Ci0JCWNoYXIqIHBMYXN0Q2hhciA9ICZsaW5lYnVmW3NpemVvZihsaW5lYnVmKS0yXTsKLQkJZG8gewotCQkJKnBMYXN0Q2hhciA9ICdcMCc7Ci0JCQlpZiAoUHlfVW5pdmVyc2FsTmV3bGluZUZnZXRzKGxpbmVidWYsIHNpemVvZiBsaW5lYnVmLCB4ZnAsIE5VTEwpID09IE5VTEwpCi0JCQkJYnJlYWs7Ci0JCQkvKiBmZ2V0cyByZWFkICpzb21ldGhpbmcqOyBpZiBpdCBkaWRuJ3QgZ2V0IGFzCi0JCQkgICBmYXIgYXMgcExhc3RDaGFyLCBpdCBtdXN0IGhhdmUgZm91bmQgYSBuZXdsaW5lCi0JCQkgICBvciBoaXQgdGhlIGVuZCBvZiB0aGUgZmlsZTsJaWYgcExhc3RDaGFyIGlzIFxuLAotCQkJICAgaXQgb2J2aW91c2x5IGZvdW5kIGEgbmV3bGluZTsgZWxzZSB3ZSBoYXZlbid0Ci0JCQkgICB5ZXQgc2VlbiBhIG5ld2xpbmUsIHNvIG11c3QgY29udGludWUgKi8KLQkJfSB3aGlsZSAoKnBMYXN0Q2hhciAhPSAnXDAnICYmICpwTGFzdENoYXIgIT0gJ1xuJyk7Ci0JfQotCWlmIChpID09IGxpbmVubykgewotCQljaGFyIGJ1ZlsxMV07Ci0JCWNoYXIgKnAgPSBsaW5lYnVmOwotCQl3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1wwMTQnKQotCQkJcCsrOwotCi0JCS8qIFdyaXRlIHNvbWUgc3BhY2VzIGJlZm9yZSB0aGUgbGluZSAqLwotCQlzdHJjcHkoYnVmLCAiICAgICAgICAgICIpOwotCQlhc3NlcnQgKHN0cmxlbihidWYpID09IDEwKTsKLQkJd2hpbGUgKGluZGVudCA+IDApIHsKLQkJCWlmKGluZGVudCA8IDEwKQotCQkJCWJ1ZltpbmRlbnRdID0gJ1wwJzsKLQkJCWVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZyhidWYsIGYpOwotCQkJaWYgKGVyciAhPSAwKQotCQkJCWJyZWFrOwotCQkJaW5kZW50IC09IDEwOwotCQl9Ci0KLQkJaWYgKGVyciA9PSAwKQotCQkJZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKHAsIGYpOwotCQlpZiAoZXJyID09IDAgJiYgc3RyY2hyKHAsICdcbicpID09IE5VTEwpCi0JCQllcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIlxuIiwgZik7Ci0JfQotCWZjbG9zZSh4ZnApOwotCXJldHVybiBlcnI7CisgICAgICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZyhwLCBmKTsKKyAgICAgICAgaWYgKGVyciA9PSAwICYmIHN0cmNocihwLCAnXG4nKSA9PSBOVUxMKQorICAgICAgICAgICAgZXJyID0gUHlGaWxlX1dyaXRlU3RyaW5nKCJcbiIsIGYpOworICAgIH0KKyAgICBmY2xvc2UoeGZwKTsKKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50CiB0Yl9kaXNwbGF5bGluZShQeU9iamVjdCAqZiwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8sIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JaW50IGVyciA9IDA7Ci0gICAgICAgIGNoYXIgbGluZWJ1ZlsyMDAwXTsKKyAgICBpbnQgZXJyID0gMDsKKyAgICBjaGFyIGxpbmVidWZbMjAwMF07CiAKLQlpZiAoZmlsZW5hbWUgPT0gTlVMTCB8fCBuYW1lID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkvKiBUaGlzIGlzIG5lZWRlZCBieSBFbWFjcycgY29tcGlsZSBjb21tYW5kICovCisgICAgaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgbmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgLyogVGhpcyBpcyBuZWVkZWQgYnkgRW1hY3MnIGNvbXBpbGUgY29tbWFuZCAqLwogI2RlZmluZSBGTVQgIiAgRmlsZSBcIiUuNTAwc1wiLCBsaW5lICVkLCBpbiAlLjUwMHNcbiIKLQlQeU9TX3NucHJpbnRmKGxpbmVidWYsIHNpemVvZihsaW5lYnVmKSwgRk1ULCBmaWxlbmFtZSwgbGluZW5vLCBuYW1lKTsKLQllcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcobGluZWJ1ZiwgZik7Ci0JaWYgKGVyciAhPSAwKQotCQlyZXR1cm4gZXJyOwotICAgICAgICByZXR1cm4gX1B5X0Rpc3BsYXlTb3VyY2VMaW5lKGYsIGZpbGVuYW1lLCBsaW5lbm8sIDQpOworICAgIFB5T1Nfc25wcmludGYobGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpLCBGTVQsIGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUpOworICAgIGVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZyhsaW5lYnVmLCBmKTsKKyAgICBpZiAoZXJyICE9IDApCisgICAgICAgIHJldHVybiBlcnI7CisgICAgcmV0dXJuIF9QeV9EaXNwbGF5U291cmNlTGluZShmLCBmaWxlbmFtZSwgbGluZW5vLCA0KTsKIH0KIAogc3RhdGljIGludAogdGJfcHJpbnRpbnRlcm5hbChQeVRyYWNlYmFja09iamVjdCAqdGIsIFB5T2JqZWN0ICpmLCBsb25nIGxpbWl0KQogewotCWludCBlcnIgPSAwOwotCWxvbmcgZGVwdGggPSAwOwotCVB5VHJhY2ViYWNrT2JqZWN0ICp0YjEgPSB0YjsKLQl3aGlsZSAodGIxICE9IE5VTEwpIHsKLQkJZGVwdGgrKzsKLQkJdGIxID0gdGIxLT50Yl9uZXh0OwotCX0KLQl3aGlsZSAodGIgIT0gTlVMTCAmJiBlcnIgPT0gMCkgewotCQlpZiAoZGVwdGggPD0gbGltaXQpIHsKLQkJCWVyciA9IHRiX2Rpc3BsYXlsaW5lKGYsCi0JCQkgICAgUHlTdHJpbmdfQXNTdHJpbmcoCi0JCQkJICAgIHRiLT50Yl9mcmFtZS0+Zl9jb2RlLT5jb19maWxlbmFtZSksCi0JCQkgICAgdGItPnRiX2xpbmVubywKLQkJCSAgICBQeVN0cmluZ19Bc1N0cmluZyh0Yi0+dGJfZnJhbWUtPmZfY29kZS0+Y29fbmFtZSkpOwotCQl9Ci0JCWRlcHRoLS07Ci0JCXRiID0gdGItPnRiX25leHQ7Ci0JCWlmIChlcnIgPT0gMCkKLQkJCWVyciA9IFB5RXJyX0NoZWNrU2lnbmFscygpOwotCX0KLQlyZXR1cm4gZXJyOworICAgIGludCBlcnIgPSAwOworICAgIGxvbmcgZGVwdGggPSAwOworICAgIFB5VHJhY2ViYWNrT2JqZWN0ICp0YjEgPSB0YjsKKyAgICB3aGlsZSAodGIxICE9IE5VTEwpIHsKKyAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgdGIxID0gdGIxLT50Yl9uZXh0OworICAgIH0KKyAgICB3aGlsZSAodGIgIT0gTlVMTCAmJiBlcnIgPT0gMCkgeworICAgICAgICBpZiAoZGVwdGggPD0gbGltaXQpIHsKKyAgICAgICAgICAgIGVyciA9IHRiX2Rpc3BsYXlsaW5lKGYsCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIHRiLT50Yl9mcmFtZS0+Zl9jb2RlLT5jb19maWxlbmFtZSksCisgICAgICAgICAgICAgICAgdGItPnRiX2xpbmVubywKKyAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyh0Yi0+dGJfZnJhbWUtPmZfY29kZS0+Y29fbmFtZSkpOworICAgICAgICB9CisgICAgICAgIGRlcHRoLS07CisgICAgICAgIHRiID0gdGItPnRiX25leHQ7CisgICAgICAgIGlmIChlcnIgPT0gMCkKKyAgICAgICAgICAgIGVyciA9IFB5RXJyX0NoZWNrU2lnbmFscygpOworICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBpbnQKIFB5VHJhY2VCYWNrX1ByaW50KFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqZikKIHsKLQlpbnQgZXJyOwotCVB5T2JqZWN0ICpsaW1pdHY7Ci0JbG9uZyBsaW1pdCA9IDEwMDA7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFQeVRyYWNlQmFja19DaGVjayh2KSkgewotCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlsaW1pdHYgPSBQeVN5c19HZXRPYmplY3QoInRyYWNlYmFja2xpbWl0Iik7Ci0JaWYgKGxpbWl0diAmJiBQeUludF9DaGVjayhsaW1pdHYpKSB7Ci0JCWxpbWl0ID0gUHlJbnRfQXNMb25nKGxpbWl0dik7Ci0JCWlmIChsaW1pdCA8PSAwKQotCQkJcmV0dXJuIDA7Ci0JfQotCWVyciA9IFB5RmlsZV9Xcml0ZVN0cmluZygiVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuIiwgZik7Ci0JaWYgKCFlcnIpCi0JCWVyciA9IHRiX3ByaW50aW50ZXJuYWwoKFB5VHJhY2ViYWNrT2JqZWN0ICopdiwgZiwgbGltaXQpOwotCXJldHVybiBlcnI7CisgICAgaW50IGVycjsKKyAgICBQeU9iamVjdCAqbGltaXR2OworICAgIGxvbmcgbGltaXQgPSAxMDAwOworICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICghUHlUcmFjZUJhY2tfQ2hlY2sodikpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbGltaXR2ID0gUHlTeXNfR2V0T2JqZWN0KCJ0cmFjZWJhY2tsaW1pdCIpOworICAgIGlmIChsaW1pdHYgJiYgUHlJbnRfQ2hlY2sobGltaXR2KSkgeworICAgICAgICBsaW1pdCA9IFB5SW50X0FzTG9uZyhsaW1pdHYpOworICAgICAgICBpZiAobGltaXQgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlcnIgPSBQeUZpbGVfV3JpdGVTdHJpbmcoIlRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiIsIGYpOworICAgIGlmICghZXJyKQorICAgICAgICBlcnIgPSB0Yl9wcmludGludGVybmFsKChQeVRyYWNlYmFja09iamVjdCAqKXYsIGYsIGxpbWl0KTsKKyAgICByZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvUklTQ09TL01vZHVsZXMvY29uZmlnLmMgYi9SSVNDT1MvTW9kdWxlcy9jb25maWcuYwppbmRleCA1NGZiYzc5Li5jNDk4ZTk4IDEwMDY0NAotLS0gYS9SSVNDT1MvTW9kdWxlcy9jb25maWcuYworKysgYi9SSVNDT1MvTW9kdWxlcy9jb25maWcuYwpAQCAtNDksMjUgKzQ5LDI1IEBACiAKIHN0cnVjdCBfaW5pdHRhYiBfUHlJbXBvcnRfSW5pdHRhYltdID0gewogCi0JeyJyaXNjb3MiLCBpbml0cmlzY29zfSwKKyAgICB7InJpc2NvcyIsIGluaXRyaXNjb3N9LAogCiAvKiAtLSBBRERNT0RVTEUgTUFSS0VSIDIgLS0gKi8KIAotCS8qIFRoaXMgbW9kdWxlICJsaXZlcyBpbiIgd2l0aCBtYXJzaGFsLmMgKi8KLQl7Im1hcnNoYWwiLCBQeU1hcnNoYWxfSW5pdH0sCisgICAgLyogVGhpcyBtb2R1bGUgImxpdmVzIGluIiB3aXRoIG1hcnNoYWwuYyAqLworICAgIHsibWFyc2hhbCIsIFB5TWFyc2hhbF9Jbml0fSwKIAotCS8qIFRoaXMgbGl2ZXMgaXQgd2l0aCBpbXBvcnQuYyAqLwotCXsiaW1wIiwgaW5pdGltcH0sCisgICAgLyogVGhpcyBsaXZlcyBpdCB3aXRoIGltcG9ydC5jICovCisgICAgeyJpbXAiLCBpbml0aW1wfSwKIAotCS8qIFRoZXNlIGVudHJpZXMgYXJlIGhlcmUgZm9yIHN5cy5idWlsdGluX21vZHVsZV9uYW1lcyAqLwotCXsiX19tYWluX18iLCBOVUxMfSwKLQl7Il9fYnVpbHRpbl9fIiwgTlVMTH0sCi0JeyJzeXMiLCBOVUxMfSwKLQl7ImV4Y2VwdGlvbnMiLCBOVUxMfSwKKyAgICAvKiBUaGVzZSBlbnRyaWVzIGFyZSBoZXJlIGZvciBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMgKi8KKyAgICB7Il9fbWFpbl9fIiwgTlVMTH0sCisgICAgeyJfX2J1aWx0aW5fXyIsIE5VTEx9LAorICAgIHsic3lzIiwgTlVMTH0sCisgICAgeyJleGNlcHRpb25zIiwgTlVMTH0sCiAKLQkvKiBUaGlzIGxpdmVzIGluIGdjbW9kdWxlLmMgKi8KLQl7ImdjIiwgaW5pdGdjfSwKKyAgICAvKiBUaGlzIGxpdmVzIGluIGdjbW9kdWxlLmMgKi8KKyAgICB7ImdjIiwgaW5pdGdjfSwKIAotCS8qIFNlbnRpbmVsICovCi0JezAsIDB9CisgICAgLyogU2VudGluZWwgKi8KKyAgICB7MCwgMH0KIH07CmRpZmYgLS1naXQgYS9SSVNDT1MvTW9kdWxlcy9nZXRwYXRoX3Jpc2Nvcy5jIGIvUklTQ09TL01vZHVsZXMvZ2V0cGF0aF9yaXNjb3MuYwppbmRleCBjZTk3OGM2Li4xMWU5MmMxIDEwMDY0NAotLS0gYS9SSVNDT1MvTW9kdWxlcy9nZXRwYXRoX3Jpc2Nvcy5jCisrKyBiL1JJU0NPUy9Nb2R1bGVzL2dldHBhdGhfcmlzY29zLmMKQEAgLTUsMjQgKzUsMjQgQEAKIAogc3RhdGljIHZvaWQKIGNhbGN1bGF0ZV9wYXRoKCkKLXsgCi0JY2hhciAqcHlwYXRoID0gZ2V0ZW52KCJQeXRob24kUGF0aCIpOwotCWlmIChweXBhdGgpIHsKLQkJaW50IHBhdGhsZW4gPSBzdHJsZW4ocHlwYXRoKTsKLQkJbW9kdWxlX3NlYXJjaF9wYXRoID0gbWFsbG9jKHBhdGhsZW4gKyAxKTsKLQkJaWYgKG1vZHVsZV9zZWFyY2hfcGF0aCkgCi0JCQlzdHJuY3B5KG1vZHVsZV9zZWFyY2hfcGF0aCwgcHlwYXRoLCBwYXRobGVuICsgMSk7Ci0JCWVsc2UgewotCQkJZnByaW50ZihzdGRlcnIsIAotCQkJCSJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgZHluYW1pYyBQWVRIT05QQVRILlxuIgotCQkJCSJVc2luZyBkZWZhdWx0IHN0YXRpYyBQWVRIT05QQVRILlxuIik7Ci0JCX0KLQl9Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpIAotCQltb2R1bGVfc2VhcmNoX3BhdGggPSAiPFB5dGhvbiREaXI+LkxpYiI7Ci0JcHJlZml4ID0gIjxQeXRob24kRGlyPiI7Ci0JZXhlY19wcmVmaXggPSBwcmVmaXg7Ci0JcHJvZ3BhdGggPSBQeV9HZXRQcm9ncmFtTmFtZSgpOworeworICAgIGNoYXIgKnB5cGF0aCA9IGdldGVudigiUHl0aG9uJFBhdGgiKTsKKyAgICBpZiAocHlwYXRoKSB7CisgICAgICAgIGludCBwYXRobGVuID0gc3RybGVuKHB5cGF0aCk7CisgICAgICAgIG1vZHVsZV9zZWFyY2hfcGF0aCA9IG1hbGxvYyhwYXRobGVuICsgMSk7CisgICAgICAgIGlmIChtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgICAgICBzdHJuY3B5KG1vZHVsZV9zZWFyY2hfcGF0aCwgcHlwYXRoLCBwYXRobGVuICsgMSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBkeW5hbWljIFBZVEhPTlBBVEguXG4iCisgICAgICAgICAgICAgICAgIlVzaW5nIGRlZmF1bHQgc3RhdGljIFBZVEhPTlBBVEguXG4iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKKyAgICAgICAgbW9kdWxlX3NlYXJjaF9wYXRoID0gIjxQeXRob24kRGlyPi5MaWIiOworICAgIHByZWZpeCA9ICI8UHl0aG9uJERpcj4iOworICAgIGV4ZWNfcHJlZml4ID0gcHJlZml4OworICAgIHByb2dwYXRoID0gUHlfR2V0UHJvZ3JhbU5hbWUoKTsKIH0KIAogLyogRXh0ZXJuYWwgaW50ZXJmYWNlICovCkBAIC0zMCwzMSArMzAsMzEgQEAKIGNoYXIgKgogUHlfR2V0UGF0aCgpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7Ci0JcmV0dXJuIG1vZHVsZV9zZWFyY2hfcGF0aDsKKyAgICBpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKKyAgICAgICAgY2FsY3VsYXRlX3BhdGgoKTsKKyAgICByZXR1cm4gbW9kdWxlX3NlYXJjaF9wYXRoOwogfQogCiBjaGFyICoKIFB5X0dldFByZWZpeCgpCiB7Ci0JaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCi0JCWNhbGN1bGF0ZV9wYXRoKCk7Ci0JcmV0dXJuIHByZWZpeDsKKyAgICBpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKKyAgICAgICAgY2FsY3VsYXRlX3BhdGgoKTsKKyAgICByZXR1cm4gcHJlZml4OwogfQogCiBjaGFyICoKIFB5X0dldEV4ZWNQcmVmaXgoKQogewotCWlmICghbW9kdWxlX3NlYXJjaF9wYXRoKQotCQljYWxjdWxhdGVfcGF0aCgpOwotCXJldHVybiBleGVjX3ByZWZpeDsKKyAgICBpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKKyAgICAgICAgY2FsY3VsYXRlX3BhdGgoKTsKKyAgICByZXR1cm4gZXhlY19wcmVmaXg7CiB9CiAKIGNoYXIgKgogUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKCkKIHsKLQlpZiAoIW1vZHVsZV9zZWFyY2hfcGF0aCkKLQkJY2FsY3VsYXRlX3BhdGgoKTsKLQlyZXR1cm4gcHJvZ3BhdGg7CisgICAgaWYgKCFtb2R1bGVfc2VhcmNoX3BhdGgpCisgICAgICAgIGNhbGN1bGF0ZV9wYXRoKCk7CisgICAgcmV0dXJuIHByb2dwYXRoOwogfQpkaWZmIC0tZ2l0IGEvUklTQ09TL01vZHVsZXMvcmlzY29zbW9kdWxlLmMgYi9SSVNDT1MvTW9kdWxlcy9yaXNjb3Ntb2R1bGUuYwppbmRleCAzZGFiYjRkLi40Mzg3MzgzIDEwMDY0NAotLS0gYS9SSVNDT1MvTW9kdWxlcy9yaXNjb3Ntb2R1bGUuYworKysgYi9SSVNDT1MvTW9kdWxlcy9yaXNjb3Ntb2R1bGUuYwpAQCAtMTksMTMgKzE5LDEzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqcmlzY29zX2Vycm9yKGNoYXIgKnMpCiB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsIHMpOwotCXJldHVybiBOVUxMOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PU0Vycm9yLCBzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpyaXNjb3Nfb3NlcnJvcih2b2lkKQogewotCXJldHVybiByaXNjb3NfZXJyb3IoZS0+ZXJybWVzcyk7CisgICAgcmV0dXJuIHJpc2Nvc19lcnJvcihlLT5lcnJtZXNzKTsKIH0KIAogCkBAIC0zNSw0MCArMzUsNDAgQEAKIHJpc2Nvc19yZW1vdmUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIGNoYXIgKnBhdGgxOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpyZW1vdmUiLCAmcGF0aDEpKSByZXR1cm4gTlVMTDsKLQlpZiAocmVtb3ZlKHBhdGgxKSkgcmV0dXJuIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnJlbW92ZSIsICZwYXRoMSkpIHJldHVybiBOVUxMOworICAgIGlmIChyZW1vdmUocGF0aDEpKSByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc19yZW5hbWUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGgxLCAqcGF0aDI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpyZW5hbWUiLCAmcGF0aDEsICZwYXRoMikpCi0gICAgICAgIHJldHVybiBOVUxMOwotCWlmIChyZW5hbWUocGF0aDEscGF0aDIpKSByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjaGFyICpwYXRoMSwgKnBhdGgyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6cmVuYW1lIiwgJnBhdGgxLCAmcGF0aDIpKQorICAgIHJldHVybiBOVUxMOworICAgIGlmIChyZW5hbWUocGF0aDEscGF0aDIpKSByZXR1cm4gUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX09TRXJyb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc19zeXN0ZW0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKmNvbW1hbmQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOnN5c3RlbSIsICZjb21tYW5kKSkgcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHN5c3RlbShjb21tYW5kKSk7CisgICAgY2hhciAqY29tbWFuZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6c3lzdGVtIiwgJmNvbW1hbmQpKSByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc3lzdGVtKGNvbW1hbmQpKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc19jaGRpcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcGF0aDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Y2hkaXIiLCAmcGF0aCkpIHJldHVybiBOVUxMOwotCWU9eG9zZnNjb250cm9sX2RpcihwYXRoKTsKLQlpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgY2hhciAqcGF0aDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6Y2hkaXIiLCAmcGF0aCkpIHJldHVybiBOVUxMOworICAgIGU9eG9zZnNjb250cm9sX2RpcihwYXRoKTsKKyAgICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC05OCw0NiArOTgsNDYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3NfZXhwYW5kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpleHBhbmQiLCAmcGF0aCkpIHJldHVybiBOVUxMOwotICAgICAgICByZXR1cm4gY2Fub24ocGF0aCk7CisgICAgY2hhciAqcGF0aDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6ZXhwYW5kIiwgJnBhdGgpKSByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gY2Fub24ocGF0aCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByaXNjb3NfbWtkaXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGg7CisgICAgY2hhciAqcGF0aDsKICAgICBpbnQgbW9kZTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInN8aTpta2RpciIsICZwYXRoLCAmbW9kZSkpIHJldHVybiBOVUxMOwogICAgIGU9eG9zZmlsZV9jcmVhdGVfZGlyKHBhdGgsMCk7CiAgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc19saXN0ZGlyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpwYXRoLGJ1ZlsyNTZdOworICAgIGNoYXIgKnBhdGgsYnVmWzI1Nl07CiAgICAgUHlPYmplY3QgKmQsICp2OwogICAgIGludCBjPTAsY291bnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOmxpc3RkaXIiLCAmcGF0aCkpIHJldHVybiBOVUxMOwotCWQ9UHlMaXN0X05ldygwKTsKLQlpZighZCkgcmV0dXJuIE5VTEw7Ci0JZm9yKDs7KQotCXsgZT14b3NnYnBiX2Rpcl9lbnRyaWVzKHBhdGgsKG9zZ2JwYl9zdHJpbmdfbGlzdCopYnVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSxjLDI1NiwwLCZjb3VudCwmYyk7Ci0JICBpZihlKQotCSAgeyBQeV9ERUNSRUYoZCk7cmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JICB9Ci0JICBpZihjb3VudCkKLQkgIHsgdj1QeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7Ci0JICAgIGlmKCF2KSB7IFB5X0RFQ1JFRihkKTtyZXR1cm4gMDt9Ci0JICAgIGlmKFB5TGlzdF9BcHBlbmQoZCx2KSkge1B5X0RFQ1JFRihkKTtQeV9ERUNSRUYodik7cmV0dXJuIDA7fQotCSAgfQotCSAgaWYoYz09LTEpIGJyZWFrOwotCX0KLQlyZXR1cm4gZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6bGlzdGRpciIsICZwYXRoKSkgcmV0dXJuIE5VTEw7CisgICAgZD1QeUxpc3RfTmV3KDApOworICAgIGlmKCFkKSByZXR1cm4gTlVMTDsKKyAgICBmb3IoOzspCisgICAgeyBlPXhvc2dicGJfZGlyX2VudHJpZXMocGF0aCwob3NnYnBiX3N0cmluZ19saXN0KilidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLGMsMjU2LDAsJmNvdW50LCZjKTsKKyAgICAgIGlmKGUpCisgICAgICB7IFB5X0RFQ1JFRihkKTtyZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKKyAgICAgIH0KKyAgICAgIGlmKGNvdW50KQorICAgICAgeyB2PVB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICAgICAgaWYoIXYpIHsgUHlfREVDUkVGKGQpO3JldHVybiAwO30KKyAgICAgICAgaWYoUHlMaXN0X0FwcGVuZChkLHYpKSB7UHlfREVDUkVGKGQpO1B5X0RFQ1JFRih2KTtyZXR1cm4gMDt9CisgICAgICB9CisgICAgICBpZihjPT0tMSkgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBkOwogfQogCiBQeURvY19TVFJWQVIoc3RhdF9yZXN1bHRfX2RvY19fLApAQCAtMTUxLDE2NyArMTUxLDE2NyBAQAogU2VlIG9zLnN0YXQgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CiAKIHN0YXRpYyBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkIHN0YXRfcmVzdWx0X2ZpZWxkc1tdID0gewotICAgICAgICB7ICJzdF9tb2RlIiwgICJwcm90ZWN0aW9uIGJpdHMiIH0sCi0gICAgICAgIHsgInN0X2lubyIsICAgImlub2RlIiB9LAotICAgICAgICB7ICJzdF9kZXYiLCAgICJkZXZpY2UiIH0sCi0gICAgICAgIHsgInN0X25saW5rIiwgIm51bWJlciBvZiBoYXJkIGxpbmtzIiB9LAotICAgICAgICB7ICJzdF91aWQiLCAgICJ1c2VyIElEIG9mIG93bmVyIiB9LAotICAgICAgICB7ICJzdF9naWQiLCAgICJncm91cCBJRCBvZiBvd25lciIgfSwKLSAgICAgICAgeyAic3Rfc2l6ZSIsICAidG90YWwgc2l6ZSwgaW4gYnl0ZXMiIH0sCi0gICAgICAgIHsgInN0X2F0aW1lIiwgInRpbWUgb2YgbGFzdCBhY2Nlc3MiIH0sCi0gICAgICAgIHsgInN0X210aW1lIiwgInRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24iIH0sCi0gICAgICAgIHsgInN0X2N0aW1lIiwgInRpbWUgb2YgbGFzdCBjaGFuZ2UiIH0sCi0JeyAic3RfZnR5cGUiLCAiZmlsZSB0eXBlIiB9LAotCXsgInN0X2F0dHJzIiwgImF0dHJpYnV0ZXMiIH0sCi0JeyAic3Rfb2J0eXBlIiwgIm9iamVjdCB0eXBlIiB9LAotCXsgMCB9CisgICAgeyAic3RfbW9kZSIsICAicHJvdGVjdGlvbiBiaXRzIiB9LAorICAgIHsgInN0X2lubyIsICAgImlub2RlIiB9LAorICAgIHsgInN0X2RldiIsICAgImRldmljZSIgfSwKKyAgICB7ICJzdF9ubGluayIsICJudW1iZXIgb2YgaGFyZCBsaW5rcyIgfSwKKyAgICB7ICJzdF91aWQiLCAgICJ1c2VyIElEIG9mIG93bmVyIiB9LAorICAgIHsgInN0X2dpZCIsICAgImdyb3VwIElEIG9mIG93bmVyIiB9LAorICAgIHsgInN0X3NpemUiLCAgInRvdGFsIHNpemUsIGluIGJ5dGVzIiB9LAorICAgIHsgInN0X2F0aW1lIiwgInRpbWUgb2YgbGFzdCBhY2Nlc3MiIH0sCisgICAgeyAic3RfbXRpbWUiLCAidGltZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiIgfSwKKyAgICB7ICJzdF9jdGltZSIsICJ0aW1lIG9mIGxhc3QgY2hhbmdlIiB9LAorICAgIHsgInN0X2Z0eXBlIiwgImZpbGUgdHlwZSIgfSwKKyAgICB7ICJzdF9hdHRycyIsICJhdHRyaWJ1dGVzIiB9LAorICAgIHsgInN0X29idHlwZSIsICJvYmplY3QgdHlwZSIgfSwKKyAgICB7IDAgfQogfTsKIAogc3RhdGljIFB5U3RydWN0U2VxdWVuY2VfRGVzYyBzdGF0X3Jlc3VsdF9kZXNjID0gewotCSJyaXNjb3Muc3RhdF9yZXN1bHQiLAotCXN0YXRfcmVzdWx0X19kb2NfXywKLQlzdGF0X3Jlc3VsdF9maWVsZHMsCi0JMTMKKyAgICAicmlzY29zLnN0YXRfcmVzdWx0IiwKKyAgICBzdGF0X3Jlc3VsdF9fZG9jX18sCisgICAgc3RhdF9yZXN1bHRfZmllbGRzLAorICAgIDEzCiB9OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFN0YXRSZXN1bHRUeXBlOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcmlzY29zX3N0YXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewkKLQlQeU9iamVjdCAqdjsKLQljaGFyICpwYXRoOwotICAgICAgICBpbnQgb2IsbGVuOwotICAgICAgICBiaXRzIHQ9MDsKLSAgICAgICAgYml0cyBsZCxleCxhdCxmdCxtb2RlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpzdGF0IiwgJnBhdGgpKSByZXR1cm4gTlVMTDsKLQllPXhvc2ZpbGVfcmVhZF9zdGFtcGVkX25vX3BhdGgocGF0aCwmb2IsJmxkLCZleCwmbGVuLCZhdCwmZnQpOwotCWlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOwotCXN3aXRjaCAob2IpCi0JeyBjYXNlIG9zZmlsZV9JU19GSUxFOm1vZGU9MDEwMDAwMDticmVhazsgIC8qIE9DVEFMICovCi0JICBjYXNlIG9zZmlsZV9JU19ESVI6bW9kZT0wNDAwMDA7YnJlYWs7Ci0JICBjYXNlIG9zZmlsZV9JU19JTUFHRTptb2RlPTAxNDAwMDA7YnJlYWs7Ci0JICBkZWZhdWx0OnJldHVybiByaXNjb3NfZXJyb3IoIk5vdCBmb3VuZCIpOwotCX0KLQlpZihmdCE9LTEpIHQ9dW5peHRpbWUobGQsZXgpOwotCW1vZGV8PShhdCY3KTw8NjsKLQltb2RlfD0oKGF0JjExMikqOSk+PjQ7Cit7CisgICAgUHlPYmplY3QgKnY7CisgICAgY2hhciAqcGF0aDsKKyAgICBpbnQgb2IsbGVuOworICAgIGJpdHMgdD0wOworICAgIGJpdHMgbGQsZXgsYXQsZnQsbW9kZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInM6c3RhdCIsICZwYXRoKSkgcmV0dXJuIE5VTEw7CisgICAgZT14b3NmaWxlX3JlYWRfc3RhbXBlZF9ub19wYXRoKHBhdGgsJm9iLCZsZCwmZXgsJmxlbiwmYXQsJmZ0KTsKKyAgICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKKyAgICBzd2l0Y2ggKG9iKQorICAgIHsgY2FzZSBvc2ZpbGVfSVNfRklMRTptb2RlPTAxMDAwMDA7YnJlYWs7ICAvKiBPQ1RBTCAqLworICAgICAgY2FzZSBvc2ZpbGVfSVNfRElSOm1vZGU9MDQwMDAwO2JyZWFrOworICAgICAgY2FzZSBvc2ZpbGVfSVNfSU1BR0U6bW9kZT0wMTQwMDAwO2JyZWFrOworICAgICAgZGVmYXVsdDpyZXR1cm4gcmlzY29zX2Vycm9yKCJOb3QgZm91bmQiKTsKKyAgICB9CisgICAgaWYoZnQhPS0xKSB0PXVuaXh0aW1lKGxkLGV4KTsKKyAgICBtb2RlfD0oYXQmNyk8PDY7CisgICAgbW9kZXw9KChhdCYxMTIpKjkpPj40OwogCi0JdiA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZTdGF0UmVzdWx0VHlwZSk7CisgICAgdiA9IFB5U3RydWN0U2VxdWVuY2VfTmV3KCZTdGF0UmVzdWx0VHlwZSk7CiAKLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDAsIAotCQkJCSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIG1vZGUpKTsgLypzdF9tb2RlKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDEsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfaW5vKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDIsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfZGV2Ki8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDMsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfbmxpbmsqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNCwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIDApKTsgLypzdF91aWQqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIDApKTsgLypzdF9naWQqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNiwgCi0JCQkJICBQeUludF9Gcm9tTG9uZygobG9uZykgbGVuKSk7IC8qc3Rfc2l6ZSovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA3LCBQeUludF9Gcm9tTG9uZygobG9uZykgdCkpOyAvKnN0X2F0aW1lKi8KLQlQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDgsIFB5SW50X0Zyb21Mb25nKChsb25nKSB0KSk7IC8qc3RfbXRpbWUqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgOSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHQpKTsgLypzdF9jdGltZSovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxMCwgCi0JCQkJICBQeUludF9Gcm9tTG9uZygobG9uZykgZnQpKTsgLypmaWxlIHR5cGUqLwotCVB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgMTEsIAotCQkJCSAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGF0KSk7IC8qYXR0cmlidXRlcyovCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxMiwgCi0JCQkJICBQeUludF9Gcm9tTG9uZygobG9uZykgb2IpKTsgLypvYmplY3QgdHlwZSovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIG1vZGUpKTsgLypzdF9tb2RlKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDEsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfaW5vKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDIsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfZGV2Ki8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDMsIFB5SW50X0Zyb21Mb25nKChsb25nKSAwKSk7IC8qc3RfbmxpbmsqLworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNCwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIDApKTsgLypzdF91aWQqLworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIDApKTsgLypzdF9naWQqLworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKChsb25nKSBsZW4pKTsgLypzdF9zaXplKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDcsIFB5SW50X0Zyb21Mb25nKChsb25nKSB0KSk7IC8qc3RfYXRpbWUqLworICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgOCwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIHQpKTsgLypzdF9tdGltZSovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCA5LCBQeUludF9Gcm9tTG9uZygobG9uZykgdCkpOyAvKnN0X2N0aW1lKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGZ0KSk7IC8qZmlsZSB0eXBlKi8KKyAgICBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKHYsIDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlJbnRfRnJvbUxvbmcoKGxvbmcpIGF0KSk7IC8qYXR0cmlidXRlcyovCisgICAgUHlTdHJ1Y3RTZXF1ZW5jZV9TRVRfSVRFTSh2LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5SW50X0Zyb21Mb25nKChsb25nKSBvYikpOyAvKm9iamVjdCB0eXBlKi8KIAotICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgICAgIHJldHVybiB2OworICAgIHJldHVybiB2OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmlzY29zX2NobW9kKFB5T2JqZWN0ICpzZWxmLFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGg7CisgICAgY2hhciAqcGF0aDsKICAgICBiaXRzIG1vZGU7CiAgICAgYml0cyBhdHRyOwogICAgIGF0dHI9KG1vZGUmMHg3MDApPj44OwogICAgIGF0dHJ8PShtb2RlJjcpPDw0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2k6Y2htb2QiLCAmcGF0aCwoaW50KikmbW9kZSkpIHJldHVybiBOVUxMOwotICAgICAgICBlPXhvc2ZpbGVfd3JpdGVfYXR0cihwYXRoLGF0dHIpOwotICAgICAgICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaTpjaG1vZCIsICZwYXRoLChpbnQqKSZtb2RlKSkgcmV0dXJuIE5VTEw7CisgICAgZT14b3NmaWxlX3dyaXRlX2F0dHIocGF0aCxhdHRyKTsKKyAgICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJpc2Nvc191dGltZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JY2hhciAqcGF0aDsKLQlsb25nIGF0aW1lLCBtdGltZTsKLQlQeU9iamVjdCogYXJnOworICAgIGNoYXIgKnBhdGg7CisgICAgbG9uZyBhdGltZSwgbXRpbWU7CisgICAgUHlPYmplY3QqIGFyZzsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086dXRpbWUiLCAmcGF0aCwgJmFyZykpCi0JCXJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086dXRpbWUiLCAmcGF0aCwgJmFyZykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JaWYgKGFyZyA9PSBQeV9Ob25lKSB7Ci0JCS8qIG9wdGlvbmFsIHRpbWUgdmFsdWVzIG5vdCBnaXZlbiAqLwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWU9eG9zZmlsZV9zdGFtcChwYXRoKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgCWlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOwotCX0KLQllbHNlIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiKGxsKSIsICZhdGltZSwgJm10aW1lKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJ1dGltZSgpIGFyZyAyIG11c3QgYmUgYSB0dXBsZSAoYXRpbWUsIG10aW1lKSIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZWxzZSB7Ci0JICAgICAgICAvKiBjYXRhbG9ndWUgaW5mbyovCi0JICAgICAgICBmaWxlc3dpdGNoX29iamVjdF90eXBlIG9ial90eXBlOwotCSAgICAgICAgYml0cyBsb2FkX2FkZHIsIGV4ZWNfYWRkcjsKLQkgICAgICAgIGludCBzaXplOwotCSAgICAgICAgZmlsZXN3aXRjaF9hdHRyIGF0dHI7CisgICAgaWYgKGFyZyA9PSBQeV9Ob25lKSB7CisgICAgICAgIC8qIG9wdGlvbmFsIHRpbWUgdmFsdWVzIG5vdCBnaXZlbiAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgIGU9eG9zZmlsZV9zdGFtcChwYXRoKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgfQorICAgIGVsc2UgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIobGwpIiwgJmF0aW1lLCAmbXRpbWUpKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAidXRpbWUoKSBhcmcgMiBtdXN0IGJlIGEgdHVwbGUgKGF0aW1lLCBtdGltZSkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBjYXRhbG9ndWUgaW5mbyovCisgICAgICAgIGZpbGVzd2l0Y2hfb2JqZWN0X3R5cGUgb2JqX3R5cGU7CisgICAgICAgIGJpdHMgbG9hZF9hZGRyLCBleGVjX2FkZHI7CisgICAgICAgIGludCBzaXplOworICAgICAgICBmaWxlc3dpdGNoX2F0dHIgYXR0cjsKIAotCQkvKiByZWFkIG9sZCBjYXRhbG9ndWUgaW5mbyAqLwotCQlQeV9CRUdJTl9BTExPV19USFJFQURTCi0JCWU9eG9zZmlsZV9yZWFkX25vX3BhdGgocGF0aCwgJm9ial90eXBlLCAmbG9hZF9hZGRyLCAmZXhlY19hZGRyLCAmc2l6ZSwgJmF0dHIpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCSAgICAgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7CisgICAgICAgIC8qIHJlYWQgb2xkIGNhdGFsb2d1ZSBpbmZvICovCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZT14b3NmaWxlX3JlYWRfbm9fcGF0aChwYXRoLCAmb2JqX3R5cGUsICZsb2FkX2FkZHIsICZleGVjX2FkZHIsICZzaXplLCAmYXR0cik7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgICAgIGlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOwogCi0JCS8qIGNoZWNrIGlmIGxvYWQgYW5kIGV4ZWMgYWRkcmVzcyByZWFsbHkgY29udGFpbiBmaWxldHlwZSBhbmQgZGF0ZSAqLwotCQlpZiAoIChsb2FkX2FkZHIgJiAweEZGRjAwMDAwVSkgIT0gMHhGRkYwMDAwMFUpCi0JCQlyZXR1cm4gcmlzY29zX2Vycm9yKCJjYW4ndCBzZXQgZGF0ZSBmb3Igb2JqZWN0IHdpdGggbG9hZCBhbmQgZXhlYyBhZGRyZXNzZXMiKTsKKyAgICAgICAgLyogY2hlY2sgaWYgbG9hZCBhbmQgZXhlYyBhZGRyZXNzIHJlYWxseSBjb250YWluIGZpbGV0eXBlIGFuZCBkYXRlICovCisgICAgICAgIGlmICggKGxvYWRfYWRkciAmIDB4RkZGMDAwMDBVKSAhPSAweEZGRjAwMDAwVSkKKyAgICAgICAgICAgIHJldHVybiByaXNjb3NfZXJyb3IoImNhbid0IHNldCBkYXRlIGZvciBvYmplY3Qgd2l0aCBsb2FkIGFuZCBleGVjIGFkZHJlc3NlcyIpOwogCi0JICAgICAgICAvKiBjb252ZXJ0IGFyZ3VtZW50IG10aW1lIHRvIFJJU0MgT1MgbG9hZCBhbmQgZXhlYyBhZGRyZXNzICovCi0JICAgICAgICBpZihhY29ybnRpbWUoJmV4ZWNfYWRkciwgJmxvYWRfYWRkciwgKHRpbWVfdCkgbXRpbWUpKQotCSAgICAgICAgCXJldHVybiByaXNjb3Nfb3NlcnJvcigpOworICAgICAgICAvKiBjb252ZXJ0IGFyZ3VtZW50IG10aW1lIHRvIFJJU0MgT1MgbG9hZCBhbmQgZXhlYyBhZGRyZXNzICovCisgICAgICAgIGlmKGFjb3JudGltZSgmZXhlY19hZGRyLCAmbG9hZF9hZGRyLCAodGltZV90KSBtdGltZSkpCisgICAgICAgICAgICByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKIAotCQkvKiB3cml0ZSBuZXcgbG9hZCBhbmQgZXhlYyBhZGRyZXNzICovCi0JCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLQkJZSA9IHhvc2ZpbGVfd3JpdGUocGF0aCwgbG9hZF9hZGRyLCBleGVjX2FkZHIsIGF0dHIpOwotCQlQeV9FTkRfQUxMT1dfVEhSRUFEUwotCSAgICAgICAgaWYoZSkgcmV0dXJuIHJpc2Nvc19vc2Vycm9yKCk7Ci0JfQorICAgICAgICAvKiB3cml0ZSBuZXcgbG9hZCBhbmQgZXhlYyBhZGRyZXNzICovCisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgZSA9IHhvc2ZpbGVfd3JpdGUocGF0aCwgbG9hZF9hZGRyLCBleGVjX2FkZHIsIGF0dHIpOworICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKKyAgICB9CiAKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmlzY29zX3NldHR5cGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNoYXIgKnBhdGgsKm5hbWU7CisgICAgY2hhciAqcGF0aCwqbmFtZTsKICAgICBpbnQgdHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpOnNldHR5cGUiLCAmcGF0aCwmdHlwZSkpCi0JeworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2k6c2V0dHlwZSIsICZwYXRoLCZ0eXBlKSkKKyAgICB7CiAgICAgICBQeUVycl9DbGVhcigpOwotCSAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpzZXR0eXBlIiwgJnBhdGgsJm5hbWUpKSByZXR1cm4gTlVMTDsKLQkgIGU9eG9zZnNjb250cm9sX2ZpbGVfdHlwZV9mcm9tX3N0cmluZyhuYW1lLChiaXRzKikmdHlwZSk7Ci0JICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKLQl9CisgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOnNldHR5cGUiLCAmcGF0aCwmbmFtZSkpIHJldHVybiBOVUxMOworICAgICAgZT14b3Nmc2NvbnRyb2xfZmlsZV90eXBlX2Zyb21fc3RyaW5nKG5hbWUsKGJpdHMqKSZ0eXBlKTsKKyAgICAgIGlmKGUpIHJldHVybiByaXNjb3Nfb3NlcnJvcigpOworICAgIH0KICAgICBlPXhvc2ZpbGVfc2V0X3R5cGUocGF0aCx0eXBlKTsKICAgICBpZihlKSByZXR1cm4gcmlzY29zX29zZXJyb3IoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMzY4LDcgKzM2OCw3IEBACiAgIGlmICghZGljdCkgcmV0dXJuIE5VTEw7CiAgIC8qIFhYWCBUaGlzIHBhcnQgaWdub3JlcyBlcnJvcnMgKi8KICAgd2hpbGUoIXhvc19yZWFkX3Zhcl92YWwod2hpY2gsdmFsdWUsc2l6ZW9mKHZhbHVlKS0xLChpbnQpY29udGV4dCwKLSAgICAgICAgIG9zX1ZBUlRZUEVfRVhQQU5ERUQsJnNpemUsKGludCAqKSZjb250ZXh0LDApKQorICAgICBvc19WQVJUWVBFX0VYUEFOREVELCZzaXplLChpbnQgKikmY29udGV4dCwwKSkKICAgeyBQeU9iamVjdCAqdjsKICAgICB2YWx1ZVtzaXplXT0nXDAnOwogICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbHVlKTsKQEAgLTM4MSwzMiArMzgxLDMyIEBACiAKIHN0YXRpYyBQeU1ldGhvZERlZiByaXNjb3NfbWV0aG9kc1tdID0gewogCi0JeyJ1bmxpbmsiLAlyaXNjb3NfcmVtb3ZlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsidW5saW5rIiwgICAgICAgICAgcmlzY29zX3JlbW92ZSwgTUVUSF9WQVJBUkdTfSwKICAgICB7InJlbW92ZSIsICByaXNjb3NfcmVtb3ZlLCBNRVRIX1ZBUkFSR1N9LAotCXsicmVuYW1lIiwJcmlzY29zX3JlbmFtZSwgTUVUSF9WQVJBUkdTfSwKLQl7InN5c3RlbSIsCXJpc2Nvc19zeXN0ZW0sIE1FVEhfVkFSQVJHU30sCi0JeyJybWRpciIsCXJpc2Nvc19yZW1vdmUsIE1FVEhfVkFSQVJHU30sCi0JeyJjaGRpciIsCXJpc2Nvc19jaGRpciwgIE1FVEhfVkFSQVJHU30sCi0JeyJnZXRjd2QiLAlyaXNjb3NfZ2V0Y3dkLCBNRVRIX05PQVJHU30sCi0JeyJleHBhbmQiLCAgcmlzY29zX2V4cGFuZCwgTUVUSF9WQVJBUkdTfSwKLQl7Im1rZGlyIiwJcmlzY29zX21rZGlyLCAgTUVUSF9WQVJBUkdTfSwKLQl7Imxpc3RkaXIiLAlyaXNjb3NfbGlzdGRpciwgTUVUSF9WQVJBUkdTfSwKLQl7InN0YXQiLAlyaXNjb3Nfc3RhdCwgICBNRVRIX1ZBUkFSR1N9LAotCXsibHN0YXQiLAlyaXNjb3Nfc3RhdCwgICBNRVRIX1ZBUkFSR1N9LAotICAgIHsiY2htb2QiLAlyaXNjb3NfY2htb2QsICBNRVRIX1ZBUkFSR1N9LAotCXsidXRpbWUiLAlyaXNjb3NfdXRpbWUsICBNRVRIX1ZBUkFSR1N9LAotCXsic2V0dHlwZSIsCXJpc2Nvc19zZXR0eXBlLCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0ZW52IiwgIHJpc2Nvc19nZXRlbnYsIE1FVEhfVkFSQVJHU30sCi0JeyJwdXRlbnYiLCAgcmlzY29zX3B1dGVudiwgTUVUSF9WQVJBUkdTfSwKLQl7ImRlbGVudiIsICByaXNjb3NfZGVsZW52LCBNRVRIX1ZBUkFSR1N9LAotCXsiZ2V0ZW52ZGljdCIsIHJpc2Nvc19nZXRlbnZkaWN0LCBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLAkJTlVMTH0JCSAvKiBTZW50aW5lbCAqLworICAgIHsicmVuYW1lIiwgICAgICAgICAgcmlzY29zX3JlbmFtZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7InN5c3RlbSIsICAgICAgICAgIHJpc2Nvc19zeXN0ZW0sIE1FVEhfVkFSQVJHU30sCisgICAgeyJybWRpciIsICAgICAgICAgICByaXNjb3NfcmVtb3ZlLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2hkaXIiLCAgICAgICAgICAgcmlzY29zX2NoZGlyLCAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGN3ZCIsICAgICAgICAgIHJpc2Nvc19nZXRjd2QsIE1FVEhfTk9BUkdTfSwKKyAgICB7ImV4cGFuZCIsICByaXNjb3NfZXhwYW5kLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsibWtkaXIiLCAgICAgICAgICAgcmlzY29zX21rZGlyLCAgTUVUSF9WQVJBUkdTfSwKKyAgICB7Imxpc3RkaXIiLCAgICAgICAgIHJpc2Nvc19saXN0ZGlyLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsic3RhdCIsICAgICAgICAgICAgcmlzY29zX3N0YXQsICAgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImxzdGF0IiwgICAgICAgICAgIHJpc2Nvc19zdGF0LCAgIE1FVEhfVkFSQVJHU30sCisgICAgeyJjaG1vZCIsICAgcmlzY29zX2NobW9kLCAgTUVUSF9WQVJBUkdTfSwKKyAgICB7InV0aW1lIiwgICAgICAgICAgIHJpc2Nvc191dGltZSwgIE1FVEhfVkFSQVJHU30sCisgICAgeyJzZXR0eXBlIiwgICAgICAgICByaXNjb3Nfc2V0dHlwZSwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGVudiIsICByaXNjb3NfZ2V0ZW52LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsicHV0ZW52IiwgIHJpc2Nvc19wdXRlbnYsIE1FVEhfVkFSQVJHU30sCisgICAgeyJkZWxlbnYiLCAgcmlzY29zX2RlbGVudiwgTUVUSF9WQVJBUkdTfSwKKyAgICB7ImdldGVudmRpY3QiLCByaXNjb3NfZ2V0ZW52ZGljdCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBpbnQKIGlucyhQeU9iamVjdCAqbW9kdWxlLCBjaGFyICpzeW1ib2wsIGxvbmcgdmFsdWUpCiB7Ci0JcmV0dXJuIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgc3ltYm9sLCB2YWx1ZSk7CisgICAgcmV0dXJuIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG1vZHVsZSwgc3ltYm9sLCB2YWx1ZSk7CiB9CiAKIApAQCAtNDE0LDE5MCArNDE0LDE5MCBAQAogYWxsX2lucyhQeU9iamVjdCAqZCkKIHsKICNpZmRlZiBGX09LCi0gICAgICAgIGlmIChpbnMoZCwgIkZfT0siLCAobG9uZylGX09LKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkZfT0siLCAobG9uZylGX09LKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgUl9PSwotICAgICAgICBpZiAoaW5zKGQsICJSX09LIiwgKGxvbmcpUl9PSykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJSX09LIiwgKGxvbmcpUl9PSykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIFdfT0sKLSAgICAgICAgaWYgKGlucyhkLCAiV19PSyIsIChsb25nKVdfT0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiV19PSyIsIChsb25nKVdfT0spKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBYX09LCi0gICAgICAgIGlmIChpbnMoZCwgIlhfT0siLCAobG9uZylYX09LKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIlhfT0siLCAobG9uZylYX09LKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgTkdST1VQU19NQVgKLSAgICAgICAgaWYgKGlucyhkLCAiTkdST1VQU19NQVgiLCAobG9uZylOR1JPVVBTX01BWCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJOR1JPVVBTX01BWCIsIChsb25nKU5HUk9VUFNfTUFYKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgVE1QX01BWAotICAgICAgICBpZiAoaW5zKGQsICJUTVBfTUFYIiwgKGxvbmcpVE1QX01BWCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJUTVBfTUFYIiwgKGxvbmcpVE1QX01BWCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIFdDT05USU5VRUQKLSAgICAgICAgaWYgKGlucyhkLCAiV0NPTlRJTlVFRCIsIChsb25nKVdDT05USU5VRUQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiV0NPTlRJTlVFRCIsIChsb25nKVdDT05USU5VRUQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBXTk9IQU5HCi0gICAgICAgIGlmIChpbnMoZCwgIldOT0hBTkciLCAobG9uZylXTk9IQU5HKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIldOT0hBTkciLCAobG9uZylXTk9IQU5HKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgV1VOVFJBQ0VECi0gICAgICAgIGlmIChpbnMoZCwgIldVTlRSQUNFRCIsIChsb25nKVdVTlRSQUNFRCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJXVU5UUkFDRUQiLCAobG9uZylXVU5UUkFDRUQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1JET05MWQotICAgICAgICBpZiAoaW5zKGQsICJPX1JET05MWSIsIChsb25nKU9fUkRPTkxZKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fUkRPTkxZIiwgKGxvbmcpT19SRE9OTFkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1dST05MWQotICAgICAgICBpZiAoaW5zKGQsICJPX1dST05MWSIsIChsb25nKU9fV1JPTkxZKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fV1JPTkxZIiwgKGxvbmcpT19XUk9OTFkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX1JEV1IKLSAgICAgICAgaWYgKGlucyhkLCAiT19SRFdSIiwgKGxvbmcpT19SRFdSKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fUkRXUiIsIChsb25nKU9fUkRXUikpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fTkRFTEFZCi0gICAgICAgIGlmIChpbnMoZCwgIk9fTkRFTEFZIiwgKGxvbmcpT19OREVMQVkpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19OREVMQVkiLCAobG9uZylPX05ERUxBWSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fTk9OQkxPQ0sKLSAgICAgICAgaWYgKGlucyhkLCAiT19OT05CTE9DSyIsIChsb25nKU9fTk9OQkxPQ0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19OT05CTE9DSyIsIChsb25nKU9fTk9OQkxPQ0spKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX0FQUEVORAotICAgICAgICBpZiAoaW5zKGQsICJPX0FQUEVORCIsIChsb25nKU9fQVBQRU5EKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fQVBQRU5EIiwgKGxvbmcpT19BUFBFTkQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX0RTWU5DCi0gICAgICAgIGlmIChpbnMoZCwgIk9fRFNZTkMiLCAobG9uZylPX0RTWU5DKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIk9fRFNZTkMiLCAobG9uZylPX0RTWU5DKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19SU1lOQwotICAgICAgICBpZiAoaW5zKGQsICJPX1JTWU5DIiwgKGxvbmcpT19SU1lOQykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX1JTWU5DIiwgKGxvbmcpT19SU1lOQykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fU1lOQwotICAgICAgICBpZiAoaW5zKGQsICJPX1NZTkMiLCAobG9uZylPX1NZTkMpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19TWU5DIiwgKGxvbmcpT19TWU5DKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19OT0NUVFkKLSAgICAgICAgaWYgKGlucyhkLCAiT19OT0NUVFkiLCAobG9uZylPX05PQ1RUWSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX05PQ1RUWSIsIChsb25nKU9fTk9DVFRZKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19DUkVBVAotICAgICAgICBpZiAoaW5zKGQsICJPX0NSRUFUIiwgKGxvbmcpT19DUkVBVCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX0NSRUFUIiwgKGxvbmcpT19DUkVBVCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fRVhDTAotICAgICAgICBpZiAoaW5zKGQsICJPX0VYQ0wiLCAobG9uZylPX0VYQ0wpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19FWENMIiwgKGxvbmcpT19FWENMKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19UUlVOQwotICAgICAgICBpZiAoaW5zKGQsICJPX1RSVU5DIiwgKGxvbmcpT19UUlVOQykpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX1RSVU5DIiwgKGxvbmcpT19UUlVOQykpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fQklOQVJZCi0gICAgICAgIGlmIChpbnMoZCwgIk9fQklOQVJZIiwgKGxvbmcpT19CSU5BUlkpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19CSU5BUlkiLCAobG9uZylPX0JJTkFSWSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fVEVYVAotICAgICAgICBpZiAoaW5zKGQsICJPX1RFWFQiLCAobG9uZylPX1RFWFQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiT19URVhUIiwgKGxvbmcpT19URVhUKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19MQVJHRUZJTEUKLSAgICAgICAgaWYgKGlucyhkLCAiT19MQVJHRUZJTEUiLCAobG9uZylPX0xBUkdFRklMRSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJPX0xBUkdFRklMRSIsIChsb25nKU9fTEFSR0VGSUxFKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAKIC8qIE1TIFdpbmRvd3MgKi8KICNpZmRlZiBPX05PSU5IRVJJVAotCS8qIERvbid0IGluaGVyaXQgaW4gY2hpbGQgcHJvY2Vzc2VzLiAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX05PSU5IRVJJVCIsIChsb25nKU9fTk9JTkhFUklUKSkgcmV0dXJuIC0xOworICAgIC8qIERvbid0IGluaGVyaXQgaW4gY2hpbGQgcHJvY2Vzc2VzLiAqLworICAgIGlmIChpbnMoZCwgIk9fTk9JTkhFUklUIiwgKGxvbmcpT19OT0lOSEVSSVQpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBfT19TSE9SVF9MSVZFRAotCS8qIE9wdGltaXplIGZvciBzaG9ydCBsaWZlIChrZWVwIGluIG1lbW9yeSkuICovCi0JLyogTVMgZm9yZ290IHRvIGRlZmluZSB0aGlzIG9uZSB3aXRoIGEgbm9uLXVuZGVyc2NvcmUgZm9ybSB0b28uICovCi0gICAgICAgIGlmIChpbnMoZCwgIk9fU0hPUlRfTElWRUQiLCAobG9uZylfT19TSE9SVF9MSVZFRCkpIHJldHVybiAtMTsKKyAgICAvKiBPcHRpbWl6ZSBmb3Igc2hvcnQgbGlmZSAoa2VlcCBpbiBtZW1vcnkpLiAqLworICAgIC8qIE1TIGZvcmdvdCB0byBkZWZpbmUgdGhpcyBvbmUgd2l0aCBhIG5vbi11bmRlcnNjb3JlIGZvcm0gdG9vLiAqLworICAgIGlmIChpbnMoZCwgIk9fU0hPUlRfTElWRUQiLCAobG9uZylfT19TSE9SVF9MSVZFRCkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fVEVNUE9SQVJZCi0JLyogQXV0b21hdGljYWxseSBkZWxldGUgd2hlbiBsYXN0IGhhbmRsZSBpcyBjbG9zZWQuICovCi0gICAgICAgIGlmIChpbnMoZCwgIk9fVEVNUE9SQVJZIiwgKGxvbmcpT19URU1QT1JBUlkpKSByZXR1cm4gLTE7CisgICAgLyogQXV0b21hdGljYWxseSBkZWxldGUgd2hlbiBsYXN0IGhhbmRsZSBpcyBjbG9zZWQuICovCisgICAgaWYgKGlucyhkLCAiT19URU1QT1JBUlkiLCAobG9uZylPX1RFTVBPUkFSWSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fUkFORE9NCi0JLyogT3B0aW1pemUgZm9yIHJhbmRvbSBhY2Nlc3MuICovCi0gICAgICAgIGlmIChpbnMoZCwgIk9fUkFORE9NIiwgKGxvbmcpT19SQU5ET00pKSByZXR1cm4gLTE7CisgICAgLyogT3B0aW1pemUgZm9yIHJhbmRvbSBhY2Nlc3MuICovCisgICAgaWYgKGlucyhkLCAiT19SQU5ET00iLCAobG9uZylPX1JBTkRPTSkpIHJldHVybiAtMTsKICNlbmRpZgogI2lmZGVmIE9fU0VRVUVOVElBTAotCS8qIE9wdGltaXplIGZvciBzZXF1ZW50aWFsIGFjY2Vzcy4gKi8KLSAgICAgICAgaWYgKGlucyhkLCAiT19TRVFVRU5USUFMIiwgKGxvbmcpT19TRVFVRU5USUFMKSkgcmV0dXJuIC0xOworICAgIC8qIE9wdGltaXplIGZvciBzZXF1ZW50aWFsIGFjY2Vzcy4gKi8KKyAgICBpZiAoaW5zKGQsICJPX1NFUVVFTlRJQUwiLCAobG9uZylPX1NFUVVFTlRJQUwpKSByZXR1cm4gLTE7CiAjZW5kaWYKIAogLyogR05VIGV4dGVuc2lvbnMuICovCiAjaWZkZWYgT19ESVJFQ1QKLSAgICAgICAgLyogRGlyZWN0IGRpc2sgYWNjZXNzLiAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX0RJUkVDVCIsIChsb25nKU9fRElSRUNUKSkgcmV0dXJuIC0xOworICAgIC8qIERpcmVjdCBkaXNrIGFjY2Vzcy4gKi8KKyAgICBpZiAoaW5zKGQsICJPX0RJUkVDVCIsIChsb25nKU9fRElSRUNUKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19ESVJFQ1RPUlkKLSAgICAgICAgLyogTXVzdCBiZSBhIGRpcmVjdG9yeS4JICovCi0gICAgICAgIGlmIChpbnMoZCwgIk9fRElSRUNUT1JZIiwgKGxvbmcpT19ESVJFQ1RPUlkpKSByZXR1cm4gLTE7CisgICAgLyogTXVzdCBiZSBhIGRpcmVjdG9yeS4gICAgICAqLworICAgIGlmIChpbnMoZCwgIk9fRElSRUNUT1JZIiwgKGxvbmcpT19ESVJFQ1RPUlkpKSByZXR1cm4gLTE7CiAjZW5kaWYKICNpZmRlZiBPX05PRk9MTE9XCi0gICAgICAgIC8qIERvIG5vdCBmb2xsb3cgbGlua3MuCSAqLwotICAgICAgICBpZiAoaW5zKGQsICJPX05PRk9MTE9XIiwgKGxvbmcpT19OT0ZPTExPVykpIHJldHVybiAtMTsKKyAgICAvKiBEbyBub3QgZm9sbG93IGxpbmtzLiAgICAgICovCisgICAgaWYgKGlucyhkLCAiT19OT0ZPTExPVyIsIChsb25nKU9fTk9GT0xMT1cpKSByZXR1cm4gLTE7CiAjZW5kaWYKIAotCS8qIFRoZXNlIGNvbWUgZnJvbSBzeXNleGl0cy5oICovCisgICAgLyogVGhlc2UgY29tZSBmcm9tIHN5c2V4aXRzLmggKi8KICNpZmRlZiBFWF9PSwotCWlmIChpbnMoZCwgIkVYX09LIiwgKGxvbmcpRVhfT0spKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfT0siLCAobG9uZylFWF9PSykpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9PSyAqLwogI2lmZGVmIEVYX1VTQUdFCi0JaWYgKGlucyhkLCAiRVhfVVNBR0UiLCAobG9uZylFWF9VU0FHRSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9VU0FHRSIsIChsb25nKUVYX1VTQUdFKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX1VTQUdFICovCiAjaWZkZWYgRVhfREFUQUVSUgotCWlmIChpbnMoZCwgIkVYX0RBVEFFUlIiLCAobG9uZylFWF9EQVRBRVJSKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX0RBVEFFUlIiLCAobG9uZylFWF9EQVRBRVJSKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX0RBVEFFUlIgKi8KICNpZmRlZiBFWF9OT0lOUFVUCi0JaWYgKGlucyhkLCAiRVhfTk9JTlBVVCIsIChsb25nKUVYX05PSU5QVVQpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfTk9JTlBVVCIsIChsb25nKUVYX05PSU5QVVQpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfTk9JTlBVVCAqLwogI2lmZGVmIEVYX05PVVNFUgotCWlmIChpbnMoZCwgIkVYX05PVVNFUiIsIChsb25nKUVYX05PVVNFUikpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9OT1VTRVIiLCAobG9uZylFWF9OT1VTRVIpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfTk9VU0VSICovCiAjaWZkZWYgRVhfTk9IT1NUCi0JaWYgKGlucyhkLCAiRVhfTk9IT1NUIiwgKGxvbmcpRVhfTk9IT1NUKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX05PSE9TVCIsIChsb25nKUVYX05PSE9TVCkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9OT0hPU1QgKi8KICNpZmRlZiBFWF9VTkFWQUlMQUJMRQotCWlmIChpbnMoZCwgIkVYX1VOQVZBSUxBQkxFIiwgKGxvbmcpRVhfVU5BVkFJTEFCTEUpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfVU5BVkFJTEFCTEUiLCAobG9uZylFWF9VTkFWQUlMQUJMRSkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9VTkFWQUlMQUJMRSAqLwogI2lmZGVmIEVYX1NPRlRXQVJFCi0JaWYgKGlucyhkLCAiRVhfU09GVFdBUkUiLCAobG9uZylFWF9TT0ZUV0FSRSkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9TT0ZUV0FSRSIsIChsb25nKUVYX1NPRlRXQVJFKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX1NPRlRXQVJFICovCiAjaWZkZWYgRVhfT1NFUlIKLQlpZiAoaW5zKGQsICJFWF9PU0VSUiIsIChsb25nKUVYX09TRVJSKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX09TRVJSIiwgKGxvbmcpRVhfT1NFUlIpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfT1NFUlIgKi8KICNpZmRlZiBFWF9PU0ZJTEUKLQlpZiAoaW5zKGQsICJFWF9PU0ZJTEUiLCAobG9uZylFWF9PU0ZJTEUpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfT1NGSUxFIiwgKGxvbmcpRVhfT1NGSUxFKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX09TRklMRSAqLwogI2lmZGVmIEVYX0NBTlRDUkVBVAotCWlmIChpbnMoZCwgIkVYX0NBTlRDUkVBVCIsIChsb25nKUVYX0NBTlRDUkVBVCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9DQU5UQ1JFQVQiLCAobG9uZylFWF9DQU5UQ1JFQVQpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfQ0FOVENSRUFUICovCiAjaWZkZWYgRVhfSU9FUlIKLQlpZiAoaW5zKGQsICJFWF9JT0VSUiIsIChsb25nKUVYX0lPRVJSKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX0lPRVJSIiwgKGxvbmcpRVhfSU9FUlIpKSByZXR1cm4gLTE7CiAjZW5kaWYgLyogRVhfSU9FUlIgKi8KICNpZmRlZiBFWF9URU1QRkFJTAotCWlmIChpbnMoZCwgIkVYX1RFTVBGQUlMIiwgKGxvbmcpRVhfVEVNUEZBSUwpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfVEVNUEZBSUwiLCAobG9uZylFWF9URU1QRkFJTCkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9URU1QRkFJTCAqLwogI2lmZGVmIEVYX1BST1RPQ09MCi0JaWYgKGlucyhkLCAiRVhfUFJPVE9DT0wiLCAobG9uZylFWF9QUk9UT0NPTCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9QUk9UT0NPTCIsIChsb25nKUVYX1BST1RPQ09MKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX1BST1RPQ09MICovCiAjaWZkZWYgRVhfTk9QRVJNCi0JaWYgKGlucyhkLCAiRVhfTk9QRVJNIiwgKGxvbmcpRVhfTk9QRVJNKSkgcmV0dXJuIC0xOworICAgIGlmIChpbnMoZCwgIkVYX05PUEVSTSIsIChsb25nKUVYX05PUEVSTSkpIHJldHVybiAtMTsKICNlbmRpZiAvKiBFWF9OT1BFUk0gKi8KICNpZmRlZiBFWF9DT05GSUcKLQlpZiAoaW5zKGQsICJFWF9DT05GSUciLCAobG9uZylFWF9DT05GSUcpKSByZXR1cm4gLTE7CisgICAgaWYgKGlucyhkLCAiRVhfQ09ORklHIiwgKGxvbmcpRVhfQ09ORklHKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX0NPTkZJRyAqLwogI2lmZGVmIEVYX05PVEZPVU5ECi0JaWYgKGlucyhkLCAiRVhfTk9URk9VTkQiLCAobG9uZylFWF9OT1RGT1VORCkpIHJldHVybiAtMTsKKyAgICBpZiAoaW5zKGQsICJFWF9OT1RGT1VORCIsIChsb25nKUVYX05PVEZPVU5EKSkgcmV0dXJuIC0xOwogI2VuZGlmIC8qIEVYX05PVEZPVU5EICovCiAKLSAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogdm9pZAogaW5pdHJpc2NvcygpCiB7Ci0JUHlPYmplY3QgKm0sICpkLCAqc3RhdF9tOworICAgIFB5T2JqZWN0ICptLCAqZCwgKnN0YXRfbTsKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJyaXNjb3MiLCByaXNjb3NfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoInJpc2NvcyIsIHJpc2Nvc19tZXRob2RzKTsKIAotCWlmIChhbGxfaW5zKG0pKQotCQlyZXR1cm47CisgICAgaWYgKGFsbF9pbnMobSkpCisgICAgICAgIHJldHVybjsKIAotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwogCi0JUHlfSU5DUkVGKFB5RXhjX09TRXJyb3IpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBQeUV4Y19PU0Vycm9yKTsKKyAgICBQeV9JTkNSRUYoUHlFeGNfT1NFcnJvcik7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIFB5RXhjX09TRXJyb3IpOwogCi0JUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSgmU3RhdFJlc3VsdFR5cGUsICZzdGF0X3Jlc3VsdF9kZXNjKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic3RhdF9yZXN1bHQiLCAoUHlPYmplY3QqKSAmU3RhdFJlc3VsdFR5cGUpOworICAgIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoJlN0YXRSZXN1bHRUeXBlLCAmc3RhdF9yZXN1bHRfZGVzYyk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInN0YXRfcmVzdWx0IiwgKFB5T2JqZWN0KikgJlN0YXRSZXN1bHRUeXBlKTsKIH0KZGlmZiAtLWdpdCBhL1JJU0NPUy9QeXRob24vZHlubG9hZF9yaXNjb3MuYyBiL1JJU0NPUy9QeXRob24vZHlubG9hZF9yaXNjb3MuYwppbmRleCA2Yjg3ZjJkLi44ZWNiMjlkIDEwMDY0NAotLS0gYS9SSVNDT1MvUHl0aG9uL2R5bmxvYWRfcmlzY29zLmMKKysrIGIvUklTQ09TL1B5dGhvbi9keW5sb2FkX3Jpc2Nvcy5jCkBAIC0zOSw4ICszOSw4IEBACiAKIAogY29uc3Qgc3RydWN0IGZpbGVkZXNjciBfUHlJbXBvcnRfRHluTG9hZEZpbGV0YWJbXSA9IHsKLQl7Ii9weWQiLCAicmIiLCBDX0VYVEVOU0lPTn0sCi0JezAsIDB9CisgICAgeyIvcHlkIiwgInJiIiwgQ19FWFRFTlNJT059LAorICAgIHswLCAwfQogfTsKIAogdm9pZCBkeW5sb2FkX2luaXRfZHVtbXkoKQpAQCAtNDgsMTYgKzQ4LDE2IEBACiB9CiAKIGRsX2Z1bmNwdHIgX1B5SW1wb3J0X0dldER5bkxvYWRGdW5jKGNvbnN0IGNoYXIgKmZxbmFtZSwgY29uc3QgY2hhciAqc2hvcnRuYW1lLAotCQkJCSAgICBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXRobmFtZSwgRklMRSAqZnApCiB7Ci0JaW50IGVycjsKLQljaGFyIGVycnN0clsyNTZdOwotCXZvaWQgKCppbml0X2Z1bmN0aW9uKSh2b2lkKTsKKyAgICBpbnQgZXJyOworICAgIGNoYXIgZXJyc3RyWzI1Nl07CisgICAgdm9pZCAoKmluaXRfZnVuY3Rpb24pKHZvaWQpOwogCi0JZXJyID0gZGxrX2xvYWRfbm9faW5pdChwYXRobmFtZSwgJmluaXRfZnVuY3Rpb24pOwotCWlmIChlcnIpIHsKLQkgICAgUHlPU19zbnByaW50ZihlcnJzdHIsIHNpemVvZihlcnJzdHIpLCAiZGxrIGZhaWx1cmUgJWQiLCBlcnIpOwotCSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsIGVycnN0cik7Ci0JfQotCXJldHVybiBpbml0X2Z1bmN0aW9uOworICAgIGVyciA9IGRsa19sb2FkX25vX2luaXQocGF0aG5hbWUsICZpbml0X2Z1bmN0aW9uKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoZXJyc3RyLCBzaXplb2YoZXJyc3RyKSwgImRsayBmYWlsdXJlICVkIiwgZXJyKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCBlcnJzdHIpOworICAgIH0KKyAgICByZXR1cm4gaW5pdF9mdW5jdGlvbjsKIH0KZGlmZiAtLWdpdCBhL1JJU0NPUy9zbGVlcC5jIGIvUklTQ09TL3NsZWVwLmMKaW5kZXggYzg1ZWI4Ni4uZmZkZmY4MSAxMDA2NDQKLS0tIGEvUklTQ09TL3NsZWVwLmMKKysrIGIvUklTQ09TL3NsZWVwLmMKQEAgLTksMzMgKzksMzMgQEAKIAogaW50IHJpc2Nvc19zbGVlcChkb3VibGUgZGVsYXkpCiB7Ci0Jb3NfdCBzdGFydHRpbWUsIGVuZHRpbWUsIHRpbWU7IC8qIG1vbm90b25pYyB0aW1lcyAoY2VudGlzZWNvbmRzKSAqLwotCWludCAqcG9sbHdvcmQsIHJldDsKLQlvc2Jvb2wgY2xhaW1lZDsKKyAgICBvc190IHN0YXJ0dGltZSwgZW5kdGltZSwgdGltZTsgLyogbW9ub3RvbmljIHRpbWVzIChjZW50aXNlY29uZHMpICovCisgICAgaW50ICpwb2xsd29yZCwgcmV0OworICAgIG9zYm9vbCBjbGFpbWVkOwogCi0gICAgICAgIC8qIGNhbGN1bGF0ZSBlbmQgdGltZSAqLwotCXN0YXJ0dGltZSA9IG9zX3JlYWRfbW9ub3RvbmljX3RpbWUoKTsKLQlpZiAoc3RhcnR0aW1lICsgMTAwLjAqZGVsYXkgPklOVF9NQVgpCi0JCWVuZHRpbWUgPSBJTlRfTUFYOwotCWVsc2UKLQkJZW5kdGltZSA9IChvc190KShzdGFydHRpbWUgKyAxMDAuMCpkZWxheSk7CisgICAgLyogY2FsY3VsYXRlIGVuZCB0aW1lICovCisgICAgc3RhcnR0aW1lID0gb3NfcmVhZF9tb25vdG9uaWNfdGltZSgpOworICAgIGlmIChzdGFydHRpbWUgKyAxMDAuMCpkZWxheSA+SU5UX01BWCkKKyAgICAgICAgZW5kdGltZSA9IElOVF9NQVg7CisgICAgZWxzZQorICAgICAgICBlbmR0aW1lID0gKG9zX3QpKHN0YXJ0dGltZSArIDEwMC4wKmRlbGF5KTsKIAotCS8qIGFsbG9jYXRlIChpbiBSTUEpIGFuZCBzZXQgcG9sbHdvcmQgZm9yIHh1cGNhbGxfc2xlZXAgKi8KLQlwb2xsd29yZCA9IG9zbW9kdWxlX2FsbG9jKDQpOwotCSpwb2xsd29yZCA9IDE7CisgICAgLyogYWxsb2NhdGUgKGluIFJNQSkgYW5kIHNldCBwb2xsd29yZCBmb3IgeHVwY2FsbF9zbGVlcCAqLworICAgIHBvbGx3b3JkID0gb3Ntb2R1bGVfYWxsb2MoNCk7CisgICAgKnBvbGx3b3JkID0gMTsKIAotCXRpbWUgPSBzdGFydHRpbWU7Ci0JcmV0ID0gMDsKLQl3aGlsZSAoIHRpbWU8ZW5kdGltZSAmJiB0aW1lPj1zdGFydHRpbWUgKSB7Ci0JCXh1cGNhbGxfc2xlZXAgKHBvbGx3b3JkLCAmY2xhaW1lZCk7Ci0JCWlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgewotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JCXRpbWUgPSBvc19yZWFkX21vbm90b25pY190aW1lKCk7Ci0JfQorICAgIHRpbWUgPSBzdGFydHRpbWU7CisgICAgcmV0ID0gMDsKKyAgICB3aGlsZSAoIHRpbWU8ZW5kdGltZSAmJiB0aW1lPj1zdGFydHRpbWUgKSB7CisgICAgICAgIHh1cGNhbGxfc2xlZXAgKHBvbGx3b3JkLCAmY2xhaW1lZCk7CisgICAgICAgIGlmIChQeUVycl9DaGVja1NpZ25hbHMoKSkgeworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRpbWUgPSBvc19yZWFkX21vbm90b25pY190aW1lKCk7CisgICAgfQogCi0JLyogZGVhbGxvY2F0ZSBwb2xsd29yZCAqLwotCW9zbW9kdWxlX2ZyZWUocG9sbHdvcmQpOwotCXJldHVybiByZXQ7CisgICAgLyogZGVhbGxvY2F0ZSBwb2xsd29yZCAqLworICAgIG9zbW9kdWxlX2ZyZWUocG9sbHdvcmQpOworICAgIHJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9Ub29scy9tc2kvbXNpc3VwcG9ydC5jIGIvVG9vbHMvbXNpL21zaXN1cHBvcnQuYwppbmRleCBmNjBhMzU2Li4xZmQyZWU0IDEwMDY0NAotLS0gYS9Ub29scy9tc2kvbXNpc3VwcG9ydC5jCisrKyBiL1Rvb2xzL21zaS9tc2lzdXBwb3J0LmMKQEAgLTcsMTMgKzcsMTMgQEAKICAqLwogc3RhdGljIFVJTlQgZGVidWcoTVNJSEFORExFIGhJbnN0YWxsLCBMUENTVFIgbXNnKQogewotCU1TSUhBTkRMRSBoUmVjID0gTXNpQ3JlYXRlUmVjb3JkKDEpOwotCWlmICghaFJlYyB8fCBNc2lSZWNvcmRTZXRTdHJpbmdBKGhSZWMsIDEsIG1zZykgIT0gRVJST1JfU1VDQ0VTUykgewotCQlyZXR1cm4gRVJST1JfSU5TVEFMTF9GQUlMVVJFOwotCX0KLQlNc2lQcm9jZXNzTWVzc2FnZShoSW5zdGFsbCwgSU5TVEFMTE1FU1NBR0VfSU5GTywgaFJlYyk7Ci0JTXNpQ2xvc2VIYW5kbGUoaFJlYyk7Ci0JcmV0dXJuIEVSUk9SX1NVQ0NFU1M7CisgICAgTVNJSEFORExFIGhSZWMgPSBNc2lDcmVhdGVSZWNvcmQoMSk7CisgICAgaWYgKCFoUmVjIHx8IE1zaVJlY29yZFNldFN0cmluZ0EoaFJlYywgMSwgbXNnKSAhPSBFUlJPUl9TVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTlNUQUxMX0ZBSUxVUkU7CisgICAgfQorICAgIE1zaVByb2Nlc3NNZXNzYWdlKGhJbnN0YWxsLCBJTlNUQUxMTUVTU0FHRV9JTkZPLCBoUmVjKTsKKyAgICBNc2lDbG9zZUhhbmRsZShoUmVjKTsKKyAgICByZXR1cm4gRVJST1JfU1VDQ0VTUzsKIH0KIAogLyogQ2hlY2sgd2hldGhlciB0aGUgVEFSR0VURElSIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnkuCkBAIC0yMiwyNyArMjIsMjcgQEAKIFVJTlQgX19kZWNsc3BlYyhkbGxleHBvcnQpIF9fc3RkY2FsbCBDaGVja0RpcihNU0lIQU5ETEUgaEluc3RhbGwpCiB7CiAjZGVmaW5lIFBTSVpFIDEwMjQKLQlXQ0hBUiB3cGF0aFtQU0laRV07Ci0JY2hhciBwYXRoW1BTSVpFXTsKLQlVSU5UIHJlc3VsdDsKLQlEV09SRCBzaXplID0gUFNJWkU7Ci0JRFdPUkQgYXR0cmlidXRlczsKKyAgICBXQ0hBUiB3cGF0aFtQU0laRV07CisgICAgY2hhciBwYXRoW1BTSVpFXTsKKyAgICBVSU5UIHJlc3VsdDsKKyAgICBEV09SRCBzaXplID0gUFNJWkU7CisgICAgRFdPUkQgYXR0cmlidXRlczsKIAotCQotCXJlc3VsdCA9IE1zaUdldFByb3BlcnR5VyhoSW5zdGFsbCwgTCJUQVJHRVRESVIiLCB3cGF0aCwgJnNpemUpOwotCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKLQkJcmV0dXJuIHJlc3VsdDsKLQl3cGF0aFtzaXplXSA9IEwnXDAnOwotCXBhdGhbc2l6ZV0gPSBMJ1wwJzsKIAotCWF0dHJpYnV0ZXMgPSBHZXRGaWxlQXR0cmlidXRlc1cod3BhdGgpOwotCWlmIChhdHRyaWJ1dGVzID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTIHx8Ci0JCSEoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpIAotCXsKLQkJcmV0dXJuIE1zaVNldFByb3BlcnR5QShoSW5zdGFsbCwgIlRhcmdldEV4aXN0cyIsICIwIik7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIE1zaVNldFByb3BlcnR5QShoSW5zdGFsbCwgIlRhcmdldEV4aXN0cyIsICIxIik7Ci0JfQorICAgIHJlc3VsdCA9IE1zaUdldFByb3BlcnR5VyhoSW5zdGFsbCwgTCJUQVJHRVRESVIiLCB3cGF0aCwgJnNpemUpOworICAgIGlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB3cGF0aFtzaXplXSA9IEwnXDAnOworICAgIHBhdGhbc2l6ZV0gPSBMJ1wwJzsKKworICAgIGF0dHJpYnV0ZXMgPSBHZXRGaWxlQXR0cmlidXRlc1cod3BhdGgpOworICAgIGlmIChhdHRyaWJ1dGVzID09IElOVkFMSURfRklMRV9BVFRSSUJVVEVTIHx8CisgICAgICAgICEoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpCisgICAgeworICAgICAgICByZXR1cm4gTXNpU2V0UHJvcGVydHlBKGhJbnN0YWxsLCAiVGFyZ2V0RXhpc3RzIiwgIjAiKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTXNpU2V0UHJvcGVydHlBKGhJbnN0YWxsLCAiVGFyZ2V0RXhpc3RzIiwgIjEiKTsKKyAgICB9CiB9CiAKIC8qIFVwZGF0ZSB0aGUgc3RhdGUgb2YgdGhlIFJFR0lTVFJZLnRjbCBjb21wb25lbnQgYWNjb3JkaW5nIHRvIHRoZQpAQCAtNTEsNDEgKzUxLDQxIEBACiAgKi8KIFVJTlQgX19kZWNsc3BlYyhkbGxleHBvcnQpIF9fc3RkY2FsbCBVcGRhdGVFZGl0SURMRShNU0lIQU5ETEUgaEluc3RhbGwpCiB7Ci0JSU5TVEFMTFNUQVRFIGV4dF9vbGQsIGV4dF9uZXcsIHRjbF9vbGQsIHRjbF9uZXcsIHJlZ19uZXc7Ci0JVUlOVCByZXN1bHQ7CisgICAgSU5TVEFMTFNUQVRFIGV4dF9vbGQsIGV4dF9uZXcsIHRjbF9vbGQsIHRjbF9uZXcsIHJlZ19uZXc7CisgICAgVUlOVCByZXN1bHQ7CiAKLQlyZXN1bHQgPSBNc2lHZXRGZWF0dXJlU3RhdGVBKGhJbnN0YWxsLCAiRXh0ZW5zaW9ucyIsICZleHRfb2xkLCAmZXh0X25ldyk7Ci0JaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gcmVzdWx0OwotCXJlc3VsdCA9IE1zaUdldEZlYXR1cmVTdGF0ZUEoaEluc3RhbGwsICJUY2xUayIsICZ0Y2xfb2xkLCAmdGNsX25ldyk7Ci0JaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKQotCQlyZXR1cm4gcmVzdWx0OworICAgIHJlc3VsdCA9IE1zaUdldEZlYXR1cmVTdGF0ZUEoaEluc3RhbGwsICJFeHRlbnNpb25zIiwgJmV4dF9vbGQsICZleHRfbmV3KTsKKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgcmVzdWx0ID0gTXNpR2V0RmVhdHVyZVN0YXRlQShoSW5zdGFsbCwgIlRjbFRrIiwgJnRjbF9vbGQsICZ0Y2xfbmV3KTsKKyAgICBpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiByZXN1bHQ7CiAKLQkvKiBJZiB0aGUgY3VycmVudCBzdGF0ZSBpcyBBYnNlbnQsIGFuZCB0aGUgdXNlciBkaWQgbm90IHNlbGVjdAotCSAgIHRoZSBmZWF0dXJlIGluIHRoZSBVSSwgSW5zdGFsbGVyIGFwcGFyZW50bHkgc2V0cyB0aGUgInNlbGVjdGVkIgotCSAgIHN0YXRlIHRvIHVua25vd24uIFVwZGF0ZSBpdCB0byB0aGUgY3VycmVudCB2YWx1ZSwgdGhlbi4gKi8KLQlpZiAoZXh0X25ldyA9PSBJTlNUQUxMU1RBVEVfVU5LTk9XTikKLQkJZXh0X25ldyA9IGV4dF9vbGQ7Ci0JaWYgKHRjbF9uZXcgPT0gSU5TVEFMTFNUQVRFX1VOS05PV04pCi0JCXRjbF9uZXcgPSB0Y2xfb2xkOworICAgIC8qIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIEFic2VudCwgYW5kIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0CisgICAgICAgdGhlIGZlYXR1cmUgaW4gdGhlIFVJLCBJbnN0YWxsZXIgYXBwYXJlbnRseSBzZXRzIHRoZSAic2VsZWN0ZWQiCisgICAgICAgc3RhdGUgdG8gdW5rbm93bi4gVXBkYXRlIGl0IHRvIHRoZSBjdXJyZW50IHZhbHVlLCB0aGVuLiAqLworICAgIGlmIChleHRfbmV3ID09IElOU1RBTExTVEFURV9VTktOT1dOKQorICAgICAgICBleHRfbmV3ID0gZXh0X29sZDsKKyAgICBpZiAodGNsX25ldyA9PSBJTlNUQUxMU1RBVEVfVU5LTk9XTikKKyAgICAgICAgdGNsX25ldyA9IHRjbF9vbGQ7CiAKLQkvLyBYWFggY29uc2lkZXIgY3VycmVudCBzdGF0ZSBvZiBSRUdJU1RSWS50Y2w/Ci0JaWYgKCgodGNsX25ldyA9PSBJTlNUQUxMU1RBVEVfTE9DQUwpIHx8Ci0JCSAodGNsX25ldyA9PSBJTlNUQUxMU1RBVEVfU09VUkNFKSB8fAotCQkgKHRjbF9uZXcgPT0gSU5TVEFMTFNUQVRFX0RFRkFVTFQpKSAmJgotCQkoKGV4dF9uZXcgPT0gSU5TVEFMTFNUQVRFX0xPQ0FMKSB8fAotCQkgKGV4dF9uZXcgPT0gSU5TVEFMTFNUQVRFX1NPVVJDRSkgfHwKLQkJIChleHRfbmV3ID09IElOU1RBTExTVEFURV9ERUZBVUxUKSkpIHsKLQkJcmVnX25ldyA9IElOU1RBTExTVEFURV9TT1VSQ0U7Ci0JfSBlbHNlIHsgCi0JCXJlZ19uZXcgPSBJTlNUQUxMU1RBVEVfQUJTRU5UOwotCX0KLQlyZXN1bHQgPSBNc2lTZXRDb21wb25lbnRTdGF0ZUEoaEluc3RhbGwsICJSRUdJU1RSWS50Y2wiLCByZWdfbmV3KTsKLQlyZXR1cm4gcmVzdWx0OworICAgIC8vIFhYWCBjb25zaWRlciBjdXJyZW50IHN0YXRlIG9mIFJFR0lTVFJZLnRjbD8KKyAgICBpZiAoKCh0Y2xfbmV3ID09IElOU1RBTExTVEFURV9MT0NBTCkgfHwKKyAgICAgICAgICAgICAodGNsX25ldyA9PSBJTlNUQUxMU1RBVEVfU09VUkNFKSB8fAorICAgICAgICAgICAgICh0Y2xfbmV3ID09IElOU1RBTExTVEFURV9ERUZBVUxUKSkgJiYKKyAgICAgICAgKChleHRfbmV3ID09IElOU1RBTExTVEFURV9MT0NBTCkgfHwKKyAgICAgICAgIChleHRfbmV3ID09IElOU1RBTExTVEFURV9TT1VSQ0UpIHx8CisgICAgICAgICAoZXh0X25ldyA9PSBJTlNUQUxMU1RBVEVfREVGQVVMVCkpKSB7CisgICAgICAgIHJlZ19uZXcgPSBJTlNUQUxMU1RBVEVfU09VUkNFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlZ19uZXcgPSBJTlNUQUxMU1RBVEVfQUJTRU5UOworICAgIH0KKyAgICByZXN1bHQgPSBNc2lTZXRDb21wb25lbnRTdGF0ZUEoaEluc3RhbGwsICJSRUdJU1RSWS50Y2wiLCByZWdfbmV3KTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi1CT09MIEFQSUVOVFJZIERsbE1haW4oSEFORExFIGhNb2R1bGUsIAotICAgICAgICAgICAgICAgICAgICAgIERXT1JEICB1bF9yZWFzb25fZm9yX2NhbGwsIAorQk9PTCBBUElFTlRSWSBEbGxNYWluKEhBTkRMRSBoTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgIERXT1JEICB1bF9yZWFzb25fZm9yX2NhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIGxwUmVzZXJ2ZWQpCiB7CiAgICAgcmV0dXJuIFRSVUU7Cg==